ZGlmZiAtLWdpdCBhLy5oZ3RhZ3MtdG9wLXJlcG8gYi8uaGd0YWdzLXRvcC1yZXBvCmluZGV4IDQ2YjQ4MTguLjRkNTE5MWIgMTAwNjQ0Ci0tLSBhLy5oZ3RhZ3MtdG9wLXJlcG8KKysrIGIvLmhndGFncy10b3AtcmVwbwpAQCAtMzAsMyArMzAsNCBAQAogYzIzNWY0YTg1NTlkMTk2ODc5YzU2YWY4MDE1OWY2N2VlNWQwZTcyMCBqZGs3LWI1MwogMmVmMzgyYjFiYmQ1OGE2OGU2NjgzOTFjNjE0NWE0YjIwNjZjNWI5NiBqZGs3LWI1NAogYWVhMGFjZTdhMWU0MzYxOTgwMDkzMWQ0MmJiZjY5YzU3OTM2MWMyZCBqZGs3LWI1NQorYmExMjExN2E1ZTZjOTE4NTc4ZDZiMmE4YzY5MzIzMmEzMzI4OTAyNCBqZGs3LWI1NgpkaWZmIC0tZ2l0IGEvUkVBRE1FLWJ1aWxkcy5odG1sIGIvUkVBRE1FLWJ1aWxkcy5odG1sCmluZGV4IDFmNGE0OTguLmFkN2QxNmMgMTAwNjQ0Ci0tLSBhL1JFQURNRS1idWlsZHMuaHRtbAorKysgYi9SRUFETUUtYnVpbGRzLmh0bWwKQEAgLTY4LDYgKzY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjemlwIj5aaXAgYW5kIFVuemlwPC9hPiA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZnJlZXR5cGUiPkZyZWVUeXBlMiBGb250czwvYT4gPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2ppYngiPkpJQlggTGlicmFyaWVzPC9hPiA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5MaW51eCBhbmQgU29sYXJpczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNjdXBzIj5DVVBTIEluY2x1ZGUgZmlsZXM8L2E+IDwvbGk+CkBAIC01ODYsNiArNTg3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U8L2E+LgogICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIHRoZQorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjamlieCI+SklCWCBMaWJyYXJpZXM8L2E+LCBzZXQKKyAgICAgICAgICAgICAgICAgICAgPHR0PjxhIGhyZWY9IiNBTFRfSklCWF9MSUJTX1BBVEgiPkFMVF9KSUJYX0xJQlNfUEFUSDwvYT48L3R0Pi4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbAogICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjYW50Ij5BbnQ8L2E+LCAKICAgICAgICAgICAgICAgICAgICAgbWFrZSBzdXJlIGl0IGlzIGluIHlvdXIgUEFUSC4KQEAgLTY1MSw2ICs2NTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgPHR0PjxhIGhyZWY9IiNBTFRfQ1VQU19IRUFERVJTX1BBVEgiPkFMVF9DVVBTX0hFQURFUlNfUEFUSDwvYT48L3R0Pi4KICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2ppYngiPkpJQlggTGlicmFyaWVzPC9hPiwgc2V0CisgICAgICAgICAgICAgICAgICAgIDx0dD48YSBocmVmPSIjQUxUX0pJQlhfTElCU19QQVRIIj5BTFRfSklCWF9MSUJTX1BBVEg8L2E+PC90dD4uCisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgIEluc3RhbGwKICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2FudCI+QW50PC9hPiwgCiAgICAgICAgICAgICAgICAgICAgIG1ha2Ugc3VyZSBpdCBpcyBpbiB5b3VyIFBBVEguCkBAIC03NDYsNiArNzU3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNkeHNkayI+TWljcm9zb2Z0IERpcmVjdFggU0RLPC9hPi4KICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2ppYngiPkpJQlggTGlicmFyaWVzPC9hPiwgc2V0CisgICAgICAgICAgICAgICAgICAgIDx0dD48YSBocmVmPSIjQUxUX0pJQlhfTElCU19QQVRIIj5BTFRfSklCWF9MSUJTX1BBVEg8L2E+PC90dD4uCisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgIEluc3RhbGwKICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2FudCI+QW50PC9hPiwgCiAgICAgICAgICAgICAgICAgICAgIG1ha2Ugc3VyZSBpdCBpcyBpbiB5b3VyIFBBVEggYW5kIHNldApAQCAtODc0LDYgKzg5MCwyNyBAQAogICAgICAgICAgICAgICAgIGZpbmUgZm9yIG1vc3QgSkRLIGRldmVsb3BlcnMuCiAgICAgICAgICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT4KKyAgICAgICAgICAgIDxoND48YSBuYW1lPSJqaWJ4Ij5KSUJYPC9hPjwvaDQ+CisgICAgICAgICAgICA8YmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICBKSUJYIGxpYnJhcmllcyB2ZXJzaW9uIDEuMS41IGlzIHJlcXVpcmVkIGZvciBidWlsZGluZyB0aGUgT3BlbkpESy4KKyAgICAgICAgICAgICAgICBOYW1lbHksIHRoZSBmb2xsb3dpbmcgSkFSIGZpbGVzIGZyb20gdGhlIEpJQlggZGlzdHJpYnV0aW9uIHBhY2thZ2UKKyAgICAgICAgICAgICAgICBhcmUgcmVxdWlyZWQ6CisgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICA8bGk+YmNlbC5qYXIKKyAgICAgICAgICAgICAgICAgICAgPGxpPmppYngtYmluZC5qYXIKKyAgICAgICAgICAgICAgICAgICAgPGxpPmppYngtcnVuLmphcgorICAgICAgICAgICAgICAgICAgICA8bGk+eHBwMy5qYXIKKyAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIFlvdSBjYW4gZG93bmxvYWQgdGhlIHBhY2thZ2UgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vamlieC5zb3VyY2Vmb3JnZS5uZXQiIHRhcmdldD0iX2JsYW5rIj5KSUJYIHNpdGU8L2E+LgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gc2V0IHRoZQorICAgICAgICAgICAgICAgIDx0dD48YSBocmVmPSIjQUxUX0pJQlhfTElCU19QQVRIIj5BTFRfSklCWF9MSUJTX1BBVEg8L2E+PC90dD4KKyAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byByZWZlciB0byBwbGFjZSB3aGVyZSB0aGUgSkFSIGZpbGVzLAorICAgICAgICAgICAgICAgIGFib3ZlLCBhcmUgbG9jYXRlZC4KKyAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KKyAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPgogICAgICAgICAgICAgPGg0PjxhIG5hbWU9ImNvbXBpbGVycyI+Q29tcGlsZXJzPC9hPjwvaDQ+CiAgICAgICAgICAgICA8YmxvY2txdW90ZT4KICAgICAgICAgICAgICAgICA8c3Ryb25nPjxhIG5hbWU9ImdjYyI+TGludXggZ2NjL2JpbnV0aWxzPC9hPjwvc3Ryb25nPgpAQCAtMTQyNSw2ICsxNDYyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHdpbGwgcmVmZXIgdG8gCiAgICAgICAgICAgICAgICAgICAgIDx0dD5qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9jYWNlcnRzPC90dD4uCiAgICAgICAgICAgICAgICAgPC9kZD4KKyAgICAgICAgICAgICAgICA8ZHQ+PHR0PjxhIG5hbWU9IkFMVF9KSUJYX0xJQlNfUEFUSCI+QUxUX0pJQlhfTElCU19QQVRIPC9hPjwvdHQ+PC9kdD4KKyAgICAgICAgICAgICAgICA8ZGQ+CisgICAgICAgICAgICAgICAgICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgPGEgaHJlZj0iI2ppYngiPkpJQlggbGlicmFyaWVzPC9hPiBmaWxlLgorICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICA8dHQ+JChBTFRfU0xBU0hfSkFWQSkvZGV2dG9vbHMvc2hhcmUvamlieC9saWI8L3R0Pi4KKyAgICAgICAgICAgICAgICA8L2RkPgogICAgICAgICAgICAgICAgIDxkdD48YSBuYW1lPSJBTFRfQ1VQU19IRUFERVJTX1BBVEgiPjx0dD5BTFRfQ1VQU19IRUFERVJTX1BBVEg8L3R0PjwvYT4gPC9kdD4KICAgICAgICAgICAgICAgICA8ZGQ+CiAgICAgICAgICAgICAgICAgICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgQ1VQUyBoZWFkZXIgZmlsZXMuCmRpZmYgLS1naXQgYS9jb3JiYS8uaGd0YWdzIGIvY29yYmEvLmhndGFncwppbmRleCBkOWNhODY0Li5mYjk3NTc4IDEwMDY0NAotLS0gYS9jb3JiYS8uaGd0YWdzCisrKyBiL2NvcmJhLy5oZ3RhZ3MKQEAgLTMwLDMgKzMwLDQgQEAKIDNjNGQ3MzE5NGY2Zjg5ZjA0MGFlM2IyZDI1NzMzNWRmYThhMWIyYjUgamRrNy1iNTMKIDgxMzBhYzg1OGQ2Nzg5ZDU4NTNkMjMwNDRiYTRhOTkyYWZkYTU3NGEgamRrNy1iNTQKIDdhODY5ZjE2YmE4MzA2MGMzNGI3NzYyMDQwNmNmYTg5ZDFjZDcwODQgamRrNy1iNTUKKzU1M2E2NjRiODA3YmIzYTNjOTNmM2I1YTNjMjBmZjBhOTBlMDgzNzEgamRrNy1iNTYKZGlmZiAtLWdpdCBhL2NvcmJhL21ha2UvanBydC5jb25maWcgYi9jb3JiYS9tYWtlL2pwcnQuY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2QwMDg2Li4wMDAwMDAwCi0tLSBhL2NvcmJhL21ha2UvanBydC5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotIyFlY2hvICJUaGlzIGlzIG5vdCBhIHNoZWxsIHNjcmlwdCIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIENvcHlyaWdodCAyMDA2LTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotIwotIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSMKLSMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0jIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSMKLSMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0jIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0jIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIEpQUlQgc2hlbGwgY29uZmlndXJhdGlvbiBmb3IgYnVpbGRpbmcuCi0jCi0jIElucHV0IGVudmlyb25tZW50IHZhcmlhYmxlczoKLSMgICAgQUxUX0JPT1RESVIKLSMgICAgQUxUX1NMQVNIX0pBVkEKLSMgICAgQUxUX0pES19JTVBPUlRfUEFUSAotIyAgICBXaW5kb3dzIE9ubHk6Ci0jICAgICAgUEFUSAotIyAgICAgIFZTNzFDT01OVE9PTFMKLSMgICAgICBQUk9DRVNTT1JfSURFTlRJRklFUgotIyAgICAgIFJPT1RESVIKLSMKLSMgT3V0cHV0IHZhcmlhYmxlIHNldHRpbmdzOgotIyAgICBtYWtlICAgICAgICAgICAgRnVsbCBwYXRoIHRvIEdOVSBtYWtlCi0jICAgIGNvbXBpbGVyX3BhdGggICBQYXRoIHRvIGNvbXBpbGVyIGJpbiBkaXJlY3RvcnkKLSMgICAgY29tcGlsZXJfbmFtZSAgIFVuaXF1ZSBuYW1lIG9mIHRoaXMgY29tcGlsZXIKLSMKLSMgT3V0cHV0IGVudmlyb25tZW50IHZhcmlhYmxlczoKLSMgICAgUEFUSAotIyAgICBBTFRfQ09NUElMRVJfUEFUSAotIyAgICBXaW5kb3dzIE9ubHk6Ci0jICAgICAgQUxUX01TREVWVE9PTFNfUEFUSAotIyAgICAgIEFMVF9ERVZUT09MU19QQVRIIChUbyBhdm9pZCB0aGUgQzovVVRJTFMgZGVmYXVsdCkKLSMgICAgICBMSUIKLSMgICAgICBJTkNMVURFCi0jCi0jIEFmdGVyIEpESzYsIG1vc3Qgc2V0dGluZ3Mgd2lsbCBiZSBmb3VuZCB2aWEgQUxUX1NMQVNIX0pBVkEgb3IKLSMgICBieSB3YXkgb2Ygb3RoZXIgc3lzdGVtIGVudmlyb25tZW50IHZhcmlhYmxlcy4gSWYgdGhpcyB3YXMgSkRLNQotIyAgIG9yIGFuIG9sZGVyIEpESywgeW91IG1pZ2h0IG5lZWQgdG8gZXhwb3J0IG1vcmUgQUxUXyogdmFyaWFibGVzLgotIwotIyBPbiBXaW5kb3dzIEFNRDY0LCBpZiBNU1NESyBpcyBub3Qgc2V0LCBhc3N1bWVzIFBsYXRmb3JtIFNESyBpcyBpbnN0YWxsZWQgYXQ6Ci0jICAgICAgICAgIEM6L1Byb2dyYW0gRmlsZXMvTWljcm9zb2Z0IFBsYXRmb3JtIFNESwotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRXJyb3IKLWVycm9yKCkgIyBtZXNzYWdlCi17Ci0gIGVjaG8gIkVSUk9SOiAkMSIKLSAgZXhpdCA2Ci19Ci0jIERpcmVjdG9yeSBtdXN0IGV4aXN0Ci1kaXJNdXN0RXhpc3QoKSAjIGRpciBuYW1lCi17Ci0gIGlmIFsgISAtZCAiJDEiIF0gOyB0aGVuCi0gICAgZXJyb3IgIkRpcmVjdG9yeSBmb3IgJDIgZG9lcyBub3QgZXhpc3Q6ICQxIgotICBmaQotfQotIyBGaWxlIG11c3QgZXhpc3QKLWZpbGVNdXN0RXhpc3QoKSAjIGRpciBuYW1lCi17Ci0gIGlmIFsgISAtZiAiJDEiIF0gOyB0aGVuCi0gICAgZXJyb3IgIkZpbGUgZm9yICQyIGRvZXMgbm90IGV4aXN0OiAkMSIKLSAgZmkKLX0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgU2hvdWxkIGJlIHNldCBieSBKUFJUIGFzIHRoZSAzIGJhc2ljIGlucHV0cwotYm9vdGRpcj0iJHtBTFRfQk9PVERJUn0iCi1zbGFzaGphdmE9IiR7QUxUX1NMQVNIX0pBVkF9IgotamRrX2ltcG9ydD0iJHtBTFRfSkRLX0lNUE9SVF9QQVRIfSIKLQotIyBUaGUgL2phdmEvZGV2dG9vbHMgaXRlbXMKLWpka19kZXZ0b29scz0iJHtzbGFzaGphdmF9L2RldnRvb2xzIgotc2hhcmU9IiR7amRrX2RldnRvb2xzfS9zaGFyZSIKLQotIyBUaGUgMyBiaW4gZGlyZWN0b3JpZXMgaW4gY29tbW9uIHRvIGFsbCBwbGF0Zm9ybXMKLXNoYXJlYmluPSIke3NoYXJlfS9iaW4iCi0KLSMgQ2hlY2sgaW5wdXQKLWRpck11c3RFeGlzdCAiJHtib290ZGlyfSIgICAgICAgICBBTFRfQk9PVERJUgotZGlyTXVzdEV4aXN0ICIke3NsYXNoamF2YX0iICAgICAgIEFMVF9TTEFTSF9KQVZBCi1kaXJNdXN0RXhpc3QgIiR7amRrX2ltcG9ydH0iICAgICAgQUxUX0pES19JTVBPUlRfUEFUSAotCi0jIFVzZXMgJ3VuYW1lIC1zJywgYnV0IG9ubHkgZXhwZWN0IFN1bk9TIG9yIExpbnV4LCBhc3N1bWUgV2luZG93cyBvdGhlcndpc2UuCi1vc25hbWU9YHVuYW1lIC1zYAotaWYgWyAiJHtvc25hbWV9IiA9IFN1bk9TIF0gOyB0aGVuCi0gICAKLSAgICAjIFNPTEFSSVM6IFNwYXJjIG9yIFg4NgotICAgIG9zYXJjaD1gdW5hbWUgLXBgCi0gICAgaWYgWyAiJHtvc2FyY2h9IiA9IHNwYXJjIF0gOyB0aGVuCi0Jc29sYXJpc19hcmNoPXNwYXJjCi0gICAgZWxzZQotCXNvbGFyaXNfYXJjaD1pMzg2Ci0gICAgZmkKLQotICAgICMgR2V0IHRoZSBjb21waWxlcnMgaW50byBwYXRoIChtYWtlIHN1cmUgaXQgbWF0Y2hlcyBBTFQgc2V0dGluZykKLSAgICBpZiBbICIke0pQUlRfU09MQVJJU19DT01QSUxFUl9OQU1FfSIgIT0gIiIgXSA7IHRoZW4KLSAgICAgICAgY29tcGlsZXJfbmFtZT0ke0pQUlRfU09MQVJJU19DT01QSUxFUl9OQU1FfQotICAgIGVsc2UKLQljb21waWxlcl9uYW1lPVNTMTIKLSAgICBmaQotICAgIGNvbXBpbGVyX3BhdGg9JHtqZGtfZGV2dG9vbHN9LyR7c29sYXJpc19hcmNofS9TVU5Xc3Byby8ke2NvbXBpbGVyX25hbWV9L2JpbgotICAgIEFMVF9DT01QSUxFUl9QQVRIPSIke2NvbXBpbGVyX3BhdGh9IgotICAgIGV4cG9ydCBBTFRfQ09NUElMRVJfUEFUSAotICAgIGRpck11c3RFeGlzdCAiJHtjb21waWxlcl9wYXRofSIgQUxUX0NPTVBJTEVSX1BBVEgKLSAgICBwYXRoNHNkaz0ke2NvbXBpbGVyX3BhdGh9OiR7c2hhcmViaW59Ci0KLSAgICAjIEFkZCBiYXNpYyBzb2xhcmlzIHN5c3RlbSBwYXRocwotICAgIHBhdGg0c2RrPSR7cGF0aDRzZGt9Oi91c3IvY2NzL2JpbjovdXNyL2Njcy9saWI6L3Vzci9iaW46L2JpbjovdXNyL3Nmdy9iaW4KLQotICAgICMgR2V0IHRoZSBwcmV2aW91cyBKREsgdG8gYmUgdXNlZCB0byBib290c3RyYXAgdGhlIGJ1aWxkCi0gICAgcGF0aDRzZGs9JHtib290ZGlyfS9iaW46JHtwYXRoNHNka30KLQotICAgICMgRmluZCBHTlUgbWFrZQotICAgIG1ha2U9L3Vzci9zZncvYmluL2dtYWtlCi0gICAgaWYgWyAhIC1mICR7bWFrZX0gXSA7IHRoZW4KLQltYWtlPS9vcHQvc2Z3L2Jpbi9nbWFrZQotCWlmIFsgISAtZiAke21ha2V9IF0gOyB0aGVuCi0JICAgIG1ha2U9JHtqZGtfZGV2dG9vbHN9LyR7c29sYXJpc19hcmNofS9iaW4vZ251bWFrZQotICAgICAgICBmaSAKLSAgICBmaQotICAgIGZpbGVNdXN0RXhpc3QgIiR7bWFrZX0iIG1ha2UKLQotICAgICMgRmlsZSBjcmVhdGlvbiBtYXNrCi0gICAgdW1hc2sgMDAyCi0KLWVsaWYgWyAiJHtvc25hbWV9IiA9IExpbnV4IF0gOyB0aGVuCi0gICAKLSAgICAjIExJTlVYOiBYODYsIEFNRDY0Ci0gICAgb3NhcmNoPWB1bmFtZSAtbWAKLSAgICBpZiBbICIke29zYXJjaH0iID0gaTY4NiBdIDsgdGhlbgotCWxpbnV4X2FyY2g9aTU4NgotICAgIGVsaWYgWyAiJHtvc2FyY2h9IiA9IHg4Nl82NCBdIDsgdGhlbgotCWxpbnV4X2FyY2g9YW1kNjQKLSAgICBmaQotCi0gICAgIyBHZXQgdGhlIGNvbXBpbGVycyBpbnRvIHBhdGggKG1ha2Ugc3VyZSBpdCBtYXRjaGVzIEFMVCBzZXR0aW5nKQotICAgIGNvbXBpbGVyX3BhdGg9L3Vzci9iaW4KLSAgICBjb21waWxlcl9uYW1lPXVzcl9iaW4KLSAgICBBTFRfQ09NUElMRVJfUEFUSD0iJHtjb21waWxlcl9wYXRofSIKLSAgICBleHBvcnQgQUxUX0NPTVBJTEVSX1BBVEgKLSAgICBkaXJNdXN0RXhpc3QgIiR7Y29tcGlsZXJfcGF0aH0iIEFMVF9DT01QSUxFUl9QQVRICi0gICAgcGF0aDRzZGs9JHtjb21waWxlcl9wYXRofToke3NoYXJlYmlufQotICAgIAotICAgICMgQWRkIGJhc2ljIHBhdGhzCi0gICAgcGF0aDRzZGs9JHtwYXRoNHNka306L3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4KLQotICAgICMgR2V0IHRoZSBwcmV2aW91cyBKREsgdG8gYmUgdXNlZCB0byBib290c3RyYXAgdGhlIGJ1aWxkCi0gICAgcGF0aDRzZGs9JHtib290ZGlyfS9iaW46JHtwYXRoNHNka30KLSAgICAKLSAgICAjIEZpbmQgR05VIG1ha2UKLSAgICBtYWtlPS91c3IvYmluL21ha2UKLSAgICBmaWxlTXVzdEV4aXN0ICIke21ha2V9IiBtYWtlCi0KLSAgICB1bWFzayAwMDIKLSAgIAotZWxzZQotCi0gICAgIyBXaW5kb3dzOiBEaWZmZXJzIG9uIENZR1dJTiB2cy4gTUtTLCBhbmQgdGhlIGNvbXBpbGVyIGF2YWlsYWJsZS4KLSAgICAjICAgQWxzbywgYmxhbmtzIGluIHBhdGhuYW1lcyBnaXZlcyBHTlUgbWFrZSBoZWFkYWNoZXMsIHNvIGFueXRoaW5nIHBsYWNlZAotICAgICMgICBpbiBhbnkgQUxUXyogdmFyaWFibGUgc2hvdWxkIGJlIHRoZSBzaG9ydCB3aW5kb3dzIGRvc25hbWUuCi0gICAKLSAgICAjIFdJTkRPV1M6IEluc3RhbGwgYW5kIHVzZSBNS1Mgb3IgQ1lHV0lOIChzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSkKLSAgICAjICAgQXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgeW91IGFyZSBpbiBhIHNoZWxsIHdpbmRvdyB2aWEgTUtTIG9yIGN5Z3dpbi4KLSAgICAjICAgTUtTIGluc3RhbGwgc2hvdWxkIGhhdmUgZGVmaW5lZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUk9PVERJUi4KLSAgICAjICAgV2UgYWxzbyBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggb25lIHdlIGhhdmU6IFg4NiwgQU1ENjQKLSAgICBpZiBbICJgZWNobyAke1BST0NFU1NPUl9JREVOVElGSUVSfSB8IGZncmVwIEFNRDY0YCIgIT0gIiIgXSA7IHRoZW4KLQl3aW5kb3dzX2FyY2g9YW1kNjQKLSAgICBlbHNlCi0Jd2luZG93c19hcmNoPWk1ODYKLSAgICBmaQotICAgIAotICAgICMgV2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgd2UgYXJlIHJ1bm5pbmcgYSBDWUdXSU4gc2hlbGwgb3IgYW4gTUtTIHNoZWxsCi0gICAgIyAgICAoaWYgdW5hbWUgaXNuJ3QgYXZhaWxhYmxlLCB0aGVuIGl0IHdpbGwgYmUgdW5peF90b29sc2V0PXVua25vd24pCi0gICAgdW5peF90b29sc2V0PXVua25vd24KLSAgICBpZiBbICJgdW5hbWUgLWEgfCBmZ3JlcCBDeWd3aW5gIiA9ICIiIC1hIC1kICIke1JPT1RESVJ9IiBdIDsgdGhlbgotICAgICAgICAjIFdlIGtpbmQgb2YgYXNzdW1lIFJPT1RESVIgaXMgd2hlcmUgTUtTIGlzIGFuZCBpdCdzIG9rCi0gICAgICAgIHVuaXhfdG9vbHNldD1NS1MKLSAgICAgICAgbWtzaG9tZT1gZG9zbmFtZSAtcyAiJHtST09URElSfSJgCi0JIyBVdGlsaXR5IHRvIGNvbnZlcnQgdG8gc2hvcnQgcGF0aG5hbWVzIHdpdGhvdXQgc3BhY2VzCi0JZG9zbmFtZT0iJHtta3Nob21lfS9ta3NudC9kb3NuYW1lIC1zIgotICAgICAgICAjIE1vc3QgdW5peCB1dGlsaXRpZXMgYXJlIGluIHRoZSBta3NudCBkaXJlY3Rvcnkgb2YgUk9PVERJUgotICAgICAgICB1bml4Y29tbWFuZF9wYXRoPSIke21rc2hvbWV9L21rc250IgotICAgICAgICBwYXRoNHNkaz0iJHtzaGFyZWJpbn07JHt1bml4Y29tbWFuZF9wYXRofSIKLSAgICAgICAgZGlyTXVzdEV4aXN0ICIke3VuaXhjb21tYW5kX3BhdGh9IiBBTFRfVU5JWENPTU1BTkRfUEFUSAotCWRldnRvb2xzX3BhdGg9IiR7amRrX2RldnRvb2xzfS93aW4zMi9iaW4iCi0JcGF0aDRzZGs9IiR7ZGV2dG9vbHNfcGF0aH07JHtwYXRoNHNka30iCi0JIyBOb3JtYWxseSB0aGlzIG5lZWQgbm90IGJlIHNldCwgYnV0IG9uIFdpbmRvd3MgaXQncyBkZWZhdWx0IGlzIEM6L1VUSUxTCi0gICAgICAgIEFMVF9ERVZUT09MU19QQVRIPSIke2RldnRvb2xzX3BhdGh9IgotCWV4cG9ydCBBTFRfREVWVE9PTFNfUEFUSAotICAgICAgICBkaXJNdXN0RXhpc3QgIiR7ZGV2dG9vbHNfcGF0aH0iIEFMVF9ERVZUT09MU19QQVRICi0gICAgICAgICMgRmluZCBHTlUgbWFrZQotICAgICAgICBtYWtlPSIke2RldnRvb2xzX3BhdGh9L2dudW1ha2UuZXhlIgotICAgICAgICBmaWxlTXVzdEV4aXN0ICIke21ha2V9IiBtYWtlCi0gICAgZWxpZiBbICJgdW5hbWUgLWEgfCBmZ3JlcCBDeWd3aW5gIiAhPSAiIiAtYSAtZiAvYmluL2N5Z3BhdGggXSA7IHRoZW4KLSAgICAgICAgIyBGb3IgQ1lHV0lOLCB1bmFtZSB3aWxsIGhhdmUgIkN5Z3dpbiIgaW4gaXQsIGFuZCAvYmluL2N5Z3BhdGggc2hvdWxkIGV4aXN0Ci0gICAgICAgIHVuaXhfdG9vbHNldD1DWUdXSU4KLQkjIFV0aWxpdHkgdG8gY29udmVydCB0byBzaG9ydCBwYXRobmFtZXMgd2l0aG91dCBzcGFjZXMKLQlkb3NuYW1lPSIvdXNyL2Jpbi9jeWdwYXRoIC1hIC1tIC1zIgotICAgICAgICAjIE1vc3QgdW5peCB1dGlsaXRpZXMgYXJlIGluIHRoZSAvdXNyL2JpbgotICAgICAgICB1bml4Y29tbWFuZF9wYXRoPSIvdXNyL2JpbiIKLSAgICAgICAgcGF0aDRzZGs9IiR7c2hhcmViaW59OyR7dW5peGNvbW1hbmRfcGF0aH0iCi0gICAgICAgIGRpck11c3RFeGlzdCAiJHt1bml4Y29tbWFuZF9wYXRofSIgQUxUX1VOSVhDT01NQU5EX1BBVEgKLSAgICAgICAgIyBGaW5kIEdOVSBtYWtlCi0gICAgICAgIG1ha2U9IiR7dW5peGNvbW1hbmRfcGF0aH0vbWFrZS5leGUiCi0gICAgICAgIGZpbGVNdXN0RXhpc3QgIiR7bWFrZX0iIG1ha2UKLSAgICBlbHNlCi0gICAgICBlY2hvICJXQVJOSU5HOiBDYW5ub3QgZmlndXJlIG91dCBpZiB0aGlzIGlzIE1LUyBvciBDWUdXSU4iCi0gICAgZmkKLQotICAgICMgV0lORE9XUzogQ29tcGlsZXIgc2V0dXAgKG5hc3R5IHBhcnQpCi0gICAgIyAgIE5PVEU6IFlvdSBjYW4gdXNlIHZjdmFyczMyLmJhdCB0byBzZXQgUEFUSCwgTElCLCBhbmQgSU5DTFVERS4KLSAgICAjICAgTk9URTogQ1lHV0lOIGhhcyBhIGxpbmsuZXhlIHRvbywgbWFrZSBzdXJlIHRoZSBjb21waWxlcnMgYXJlIGZpcnN0Ci0gICAgaWYgWyAiJHt3aW5kb3dzX2FyY2h9IiA9IGk1ODYgXSA7IHRoZW4KLSAgICAgICAgIyAzMmJpdCBXaW5kb3dzIGNvbXBpbGVyIHNldHRpbmdzCi0gICAgICAgICMgVmlzdWFsU3R1ZGlvIC5ORVQgMjAwMyBWQysrIDcuMSAoVlM3MUNPTU5UT09MUyBzaG91bGQgYmUgZGVmaW5lZCkKLSAgICAgICAgdnNfcm9vdD1gJHtkb3NuYW1lfSAiJHtWUzcxQ09NTlRPT0xTfS8uLi8uLiJgCi0gICAgICAgICMgRmlsbCBpbiBQQVRILCBMSUIsIGFuZCBJTkNMVURFICh1bnNldCBhbGwgb3RoZXJzIHRvIG1ha2Ugc3VyZSkKLSAgICAgICAgbXNkZXZfcm9vdD0iJHt2c19yb290fS9Db21tb243L1Rvb2xzIgotICAgICAgICBtc2RldnRvb2xzX3BhdGg9IiR7bXNkZXZfcm9vdH0vYmluIgotICAgICAgICB2Yzdfcm9vdD0iJHt2c19yb290fS9WYzciCi0gICAgICAgIGNvbXBpbGVyX3BhdGg9IiR7dmM3X3Jvb3R9L2JpbiIKLSAgICAgICAgY29tcGlsZXJfbmFtZT1WUzIwMDMKLSAgICAgICAgcGxhdGZvcm1fc2RrPSIke3ZjN19yb290fS9QbGF0Zm9ybVNESyIKLSAgICAgICAgIyBMSUIgYW5kIElOQ0xVREUgbXVzdCB1c2UgOyBhcyBhIHNlcGFyYXRvcgotICAgICAgICBpbmNsdWRlNHNkaz0iJHt2Yzdfcm9vdH0vYXRsbWZjL2luY2x1ZGUiCi0gICAgICAgIGluY2x1ZGU0c2RrPSIke2luY2x1ZGU0c2RrfTske3ZjN19yb290fS9pbmNsdWRlIgotICAgICAgICBpbmNsdWRlNHNkaz0iJHtpbmNsdWRlNHNka307JHtwbGF0Zm9ybV9zZGt9L2luY2x1ZGUvcHJlcmVsZWFzZSIKLSAgICAgICAgaW5jbHVkZTRzZGs9IiR7aW5jbHVkZTRzZGt9OyR7cGxhdGZvcm1fc2RrfS9pbmNsdWRlIgotICAgICAgICBpbmNsdWRlNHNkaz0iJHtpbmNsdWRlNHNka307JHt2c19yb290fS9TREsvdjEuMS9pbmNsdWRlIgotICAgICAgICBsaWI0c2RrPSIke3ZjN19yb290fS9hdGxtZmMvbGliIgotICAgICAgICBsaWI0c2RrPSIke2xpYjRzZGt9OyR7dmM3X3Jvb3R9L2xpYiIKLSAgICAgICAgbGliNHNkaz0iJHtsaWI0c2RrfTske3BsYXRmb3JtX3Nka30vbGliL3ByZXJlbGVhc2UiCi0gICAgICAgIGxpYjRzZGs9IiR7bGliNHNka307JHtwbGF0Zm9ybV9zZGt9L2xpYiIKLSAgICAgICAgbGliNHNkaz0iJHtsaWI0c2RrfTske3ZzX3Jvb3R9L1NESy92MS4xL2xpYiIKLSAgICAgICAgIyBTZWFyY2ggcGF0aCBhbmQgRExMIGxvY2F0aW5nIHBhdGgKLSAgICAgICAgIyAgIFdBUk5JTkc6IENZR1dJTiBoYXMgYSBsaW5rLmV4ZSB0b28sIG1ha2Ugc3VyZSBjb21waWxlcnMgYXJlIGZpcnN0Ci0gICAgICAgIHBhdGg0c2RrPSIke3ZzX3Jvb3R9L0NvbW1vbjcvVG9vbHMvYmluOyR7cGF0aDRzZGt9IgotCXBhdGg0c2RrPSIke3ZzX3Jvb3R9L1NESy92MS4xL2Jpbjske3BhdGg0c2RrfSIKLSAgICAgICAgcGF0aDRzZGs9IiR7dnNfcm9vdH0vQ29tbW9uNy9Ub29sczske3BhdGg0c2RrfSIKLQlwYXRoNHNkaz0iJHt2c19yb290fS9Db21tb243L1Rvb2xzL2Jpbi9wcmVyZWxlYXNlOyR7cGF0aDRzZGt9IgotICAgICAgICBwYXRoNHNkaz0iJHt2c19yb290fS9Db21tb243L0lERTske3BhdGg0c2RrfSIKLQlwYXRoNHNkaz0iJHtjb21waWxlcl9wYXRofTske3BhdGg0c2RrfSIKLSAgICBlbGlmIFsgIiR7d2luZG93c19hcmNofSIgPSBhbWQ2NCBdIDsgdGhlbgotICAgICAgICAjIEFNRDY0IDY0Yml0IFdpbmRvd3MgY29tcGlsZXIgc2V0dGluZ3MKLQlpZiBbICIke01TU0RLfSIgIT0gIiIgXSA7IHRoZW4KLQkgICAgcGxhdGZvcm1fc2RrPSIke01TU0RLfSIKLQllbHNlCi0JICAgIHBsYXRmb3JtX3Nkaz1gJHtkb3NuYW1lfSAiQzovUHJvZ3JhbSBGaWxlcy9NaWNyb3NvZnQgUGxhdGZvcm0gU0RLLyJgCi0JZmkKLQljb21waWxlcl9wYXRoPSIke3BsYXRmb3JtX3Nka30vQmluL3dpbjY0L3g4Ni9BTUQ2NCIKLSAgICAgICAgY29tcGlsZXJfbmFtZT1WUzIwMDVfUFNESwotCW1zZGV2dG9vbHNfcGF0aD0iJHtwbGF0Zm9ybV9zZGt9L0JpbiIKLSAgICAgICAgIyBMSUIgYW5kIElOQ0xVREUgbXVzdCB1c2UgOyBhcyBhIHNlcGFyYXRvcgotICAgICAgICBpbmNsdWRlNHNkaz0iJHtwbGF0Zm9ybV9zZGt9L0luY2x1ZGUiCi0JaW5jbHVkZTRzZGs9IiR7aW5jbHVkZTRzZGt9OyR7cGxhdGZvcm1fc2RrfS9JbmNsdWRlL2NydC9zeXMiCi0JaW5jbHVkZTRzZGs9IiR7aW5jbHVkZTRzZGt9OyR7cGxhdGZvcm1fc2RrfS9JbmNsdWRlL21mYyIKLQlpbmNsdWRlNHNkaz0iJHtpbmNsdWRlNHNka307JHtwbGF0Zm9ybV9zZGt9L0luY2x1ZGUvYXRsIgotCWluY2x1ZGU0c2RrPSIke2luY2x1ZGU0c2RrfTske3BsYXRmb3JtX3Nka30vSW5jbHVkZS9jcnQiCi0gICAgICAgIGxpYjRzZGs9IiR7cGxhdGZvcm1fc2RrfS9MaWIvQU1ENjQiCi0gICAgICAgIGxpYjRzZGs9IiR7bGliNHNka307JHtwbGF0Zm9ybV9zZGt9L0xpYi9BTUQ2NC9hdGxtZmMiCi0gICAgICAgICMgU2VhcmNoIHBhdGggYW5kIERMTCBsb2NhdGluZyBwYXRoCi0gICAgICAgICMgICBXQVJOSU5HOiBDWUdXSU4gaGFzIGEgbGluay5leGUgdG9vLCBtYWtlIHN1cmUgY29tcGlsZXJzIGFyZSBmaXJzdAotICAgICAgICBwYXRoNHNkaz0iJHtwbGF0Zm9ybV9zZGt9L2Jpbjske3BhdGg0c2RrfSIKLSAgICAgICAgcGF0aDRzZGs9IiR7Y29tcGlsZXJfcGF0aH07JHtwYXRoNHNka30iCi0gICAgZmkKLSAgICAjIEV4cG9ydCBMSUIgYW5kIElOQ0xVREUKLSAgICB1bnNldCBsaWIKLSAgICB1bnNldCBMaWIKLSAgICBMSUI9IiR7bGliNHNka30iCi0gICAgZXhwb3J0IExJQgotICAgIHVuc2V0IGluY2x1ZGUKLSAgICB1bnNldCBJbmNsdWRlCi0gICAgSU5DTFVERT0iJHtpbmNsdWRlNHNka30iCi0gICAgZXhwb3J0IElOQ0xVREUKLSAgICAjIFNldCB0aGUgQUxUIHZhcmlhYmxlCi0gICAgQUxUX0NPTVBJTEVSX1BBVEg9YCR7ZG9zbmFtZX0gIiR7Y29tcGlsZXJfcGF0aH0iYAotICAgIGV4cG9ydCBBTFRfQ09NUElMRVJfUEFUSAotICAgIGRpck11c3RFeGlzdCAiJHtjb21waWxlcl9wYXRofSIgQUxUX0NPTVBJTEVSX1BBVEgKLSAgICBBTFRfTVNERVZUT09MU19QQVRIPWAke2Rvc25hbWV9ICIke21zZGV2dG9vbHNfcGF0aH0iYAotICAgIGV4cG9ydCBBTFRfTVNERVZUT09MU19QQVRICi0gICAgZGlyTXVzdEV4aXN0ICIke21zZGV2dG9vbHNfcGF0aH0iIEFMVF9NU0RFVlRPT0xTX1BBVEgKLSAgICAKLSAgICAjIFdJTkRPV1M6IEdldCB0aGUgcHJldmlvdXMgSkRLIHRvIGJlIHVzZWQgdG8gYm9vdHN0cmFwIHRoZSBidWlsZAotICAgIHBhdGg0c2RrPSIke2Jvb3RkaXJ9L2Jpbjske3BhdGg0c2RrfSIKLQotICAgICMgVHVybiBhbGwgXFwgaW50byAvLCByZW1vdmUgZHVwbGljYXRlcyBhbmQgdHJhaWxpbmcgLwotICAgIHNsYXNoX3BhdGg9ImBlY2hvICR7cGF0aDRzZGt9IHwgc2VkIC1lICdzQFxcXFxAL0BnJyAtZSAnc0AvL0AvQGcnIC1lICdzQC8kQEAnIC1lICdzQC87QDtAZydgIgotICAgIAotICAgICMgRm9yIHdpbmRvd3MsIGl0J3MgaGFyZCB0byBrbm93IHdoZXJlIHRoZSBzeXN0ZW0gaXMsIHNvIHdlIGp1c3QgYWRkIHRoaXMKLSAgICAjICAgIHRvIFBBVEguCi0gICAgcGF0aDRzZGs9IiR7c2xhc2hfcGF0aH07JHtQQVRIfSIKLSAgICAKLSAgICAjIENvbnZlcnQgcGF0aDRzZGsgdG8gY3lnd2luIHN0eWxlCi0gICAgaWYgWyAiJHt1bml4X3Rvb2xzZXR9IiA9IENZR1dJTiBdIDsgdGhlbgotCXBhdGg0c2RrPSJgL3Vzci9iaW4vY3lncGF0aCAtcCAke3BhdGg0c2RrfWAiCi0gICAgZmkKLQotZmkKLQotIyBFeHBvcnQgUEFUSCBzZXR0aW5nCi1QQVRIPSIke3BhdGg0c2RrfSIKLWV4cG9ydCBQQVRICi0KLSMgVGhpbmdzIHdlIG5lZWQgdG8gdW5zZXQKLXVuc2V0IExEX0xJQlJBUllfUEFUSAotdW5zZXQgTERfTElCUkFSWV9QQVRIXzMyCi11bnNldCBMRF9MSUJSQVJZX1BBVEhfNjQKLXVuc2V0IEpBVkFfSE9NRQotCmRpZmYgLS1naXQgYS9jb3JiYS9tYWtlL2pwcnQucHJvcGVydGllcyBiL2NvcmJhL21ha2UvanBydC5wcm9wZXJ0aWVzCmluZGV4IGZkYjVkOTYuLjUwYTI4NmIgMTAwNjQ0Ci0tLSBhL2NvcmJhL21ha2UvanBydC5wcm9wZXJ0aWVzCisrKyBiL2NvcmJhL21ha2UvanBydC5wcm9wZXJ0aWVzCkBAIC0zMiw4ICszMiw4IEBACiBzb2xhcmlzX3NwYXJjdjlfNS4xMCxcCiBzb2xhcmlzX2k1ODZfNS4xMCxcCiBzb2xhcmlzX3g2NF81LjEwLFwKLWxpbnV4X2k1ODYsXAotbGludXhfeDY0LFwKK2xpbnV4X2k1ODZfMi42LFwKK2xpbnV4X3g2NF8yLjYsXAogd2luZG93c19pNTg2LFwKIHdpbmRvd3NfeDY0CiAKZGlmZiAtLWdpdCBhL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9lbmNvZGluZy9CdWZmZXJNYW5hZ2VyUmVhZFN0cmVhbS5qYXZhIGIvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2VuY29kaW5nL0J1ZmZlck1hbmFnZXJSZWFkU3RyZWFtLmphdmEKaW5kZXggNDkyNWM3My4uYzU3OTQyZiAxMDA2NDQKLS0tIGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2VuY29kaW5nL0J1ZmZlck1hbmFnZXJSZWFkU3RyZWFtLmphdmEKKysrIGIvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2VuY29kaW5nL0J1ZmZlck1hbmFnZXJSZWFkU3RyZWFtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDAtMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDAtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00NCw2ICs0NCw3IEBACiAgICAgLy8gV2Ugc2hvdWxkIGNvbnZlcnQgZW5kT2ZTdHJlYW0gdG8gYSBmaW5hbCBzdGF0aWMgZHVtbXkgZW5kIG5vZGUKICAgICBwcml2YXRlIGJvb2xlYW4gZW5kT2ZTdHJlYW0gPSB0cnVlOwogICAgIHByaXZhdGUgQnVmZmVyUXVldWUgZnJhZ21lbnRRdWV1ZSA9IG5ldyBCdWZmZXJRdWV1ZSgpOworICAgIHByaXZhdGUgbG9uZyBGUkFHTUVOVF9USU1FT1VUID0gNjAwMDA7CiAKICAgICAvLyBSRVZJU0lUIC0gVGhpcyBzaG91bGQgZ28gaW4gQnVmZmVyTWFuYWdlclJlYWQuIEJ1dCwgc2luY2UKICAgICAvLyAgICAgICAgICAgQnVmZmVyTWFuYWdlclJlYWQgaXMgYW4gaW50ZXJmYWNlLiBCdWZmZXJNYW5hZ2VyUmVhZApAQCAtMTExLDkgKzExMiwxNiBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyB3cmFwcGVyLmVuZE9mU3RyZWFtKCkgOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmcmFnbWVudFF1ZXVlLndhaXQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgICAgICAgICBmcmFnbWVudFF1ZXVlLndhaXQoRlJBR01FTlRfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFpbnRlcnJ1cHRlZCAmJiBmcmFnbWVudFF1ZXVlLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHdyYXBwZXIuYnVmZmVyUmVhZE1hbmFnZXJUaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVkQ2FuY2VsKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXF1ZXN0Q2FuY2VsZWRFeGNlcHRpb24oY2FuY2VsUmVxSWQpOwpkaWZmIC0tZ2l0IGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2lvL09iamVjdFN0cmVhbUNsYXNzLmphdmEgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvaW8vT2JqZWN0U3RyZWFtQ2xhc3MuamF2YQppbmRleCBjOWI3OWRmLi5iMjMwNDljIDEwMDY0NAotLS0gYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvaW8vT2JqZWN0U3RyZWFtQ2xhc3MuamF2YQorKysgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvaW8vT2JqZWN0U3RyZWFtQ2xhc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMTk5OC0yMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTE1MywyMiArMTUzLDIyIEBACiAgICAgICAgICAgICAgICAgZGVzYyA9IG5ldyBPYmplY3RTdHJlYW1DbGFzcyhjbCwgc3VwZXJkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlLCBleHRlcm5hbGl6YWJsZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNdXN0IGFsd2F5cyBjYWxsIGluaXQuICBTZWUgYnVnIDQ0ODgxMzcuICBUaGlzIGNvZGUgd2FzCisgICAgICAgICAgICAvLyBpbmNvcnJlY3RseSBjaGFuZ2VkIHRvIHJldHVybiBpbW1lZGlhdGVseSBvbiBhIG5vbi1udWxsCisgICAgICAgICAgICAvLyBjYWNoZSByZXN1bHQuICBUaGF0IGFsbG93ZWQgdGhyZWFkcyB0byBnYWluIGFjY2VzcyB0bworICAgICAgICAgICAgLy8gdW5pbnRpYWxpemVkIGluc3RhbmNlcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBIaXN0b3J5OiBOb3RlLCB0aGUgZm9sbG93aW5nIGluaXQoKSBjYWxsIHdhcyBvcmlnaW5hbGx5IHdpdGhpbgorICAgICAgICAgICAgLy8gdGhlIHN5bmNocm9uaXphdGlvbiBibG9jaywgYXMgaXQgY3VycmVudGx5IGlzIG5vdy4gTGF0ZXIsIHRoZQorICAgICAgICAgICAgLy8gaW5pdCgpIGNhbGwgd2FzIG1vdmVkIG91dHNpZGUgdGhlIHN5bmNocm9uaXphdGlvbiBibG9jaywgYW5kCisgICAgICAgICAgICAvLyB0aGUgaW5pdCgpIG1ldGhvZCB1c2VkIGEgcHJpdmF0ZSBtZW1iZXIgdmFyaWFibGUgbG9jaywgdG8KKyAgICAgICAgICAgIC8vIGF2b2lkIHBlcmZvcm1hbmNlIHByb2JsZW1zLiBTZWUgYnVnIDQxNjUyMDQuIEJ1dCB0aGF0IGxlYWQgdG8KKyAgICAgICAgICAgIC8vIGEgZGVhZGxvY2sgc2l0dWF0aW9uLCBzZWUgYnVnIDUxMDQyMzkuIEhlbmNlLCB0aGUgaW5pdCgpIG1ldGhvZAorICAgICAgICAgICAgLy8gaGFzIG5vdyBiZWVuIG1vdmVkIGJhY2sgaW50byB0aGUgc3luY2hyb25pemF0aW9uIGJsb2NrLiBUaGUKKyAgICAgICAgICAgIC8vIHJpZ2h0IGFwcHJvYWNoIHRvIHNvbHZpbmcgdGhlc2UgcHJvYmxlbXMgd291bGQgYmUgdG8gcmV3cml0ZQorICAgICAgICAgICAgLy8gdGhpcyBjbGFzcywgYmFzZWQgb24gdGhlIGxhdGVzdCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzLgorICAgICAgICAgICAgZGVzYy5pbml0KCk7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBNdXN0IGFsd2F5cyBjYWxsIGluaXQuICBTZWUgYnVnIDQ0ODgxMzcuICBUaGlzIGNvZGUgd2FzCi0gICAgICAgIC8vIGluY29ycmVjdGx5IGNoYW5nZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IG9uIGEgbm9uLW51bGwKLSAgICAgICAgLy8gY2FjaGUgcmVzdWx0LiAgVGhhdCBhbGxvd2VkIHRocmVhZHMgdG8gZ2FpbiBhY2Nlc3MgdG8KLSAgICAgICAgLy8gdW5pbnRpYWxpemVkIGluc3RhbmNlcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQWxsIHRocmVhZHMgbXVzdCBzeW5jIG9uIHRoZSBtZW1iZXIgdmFyaWFibGUgbG9jawotICAgICAgICAvLyBhbmQgY2hlY2sgdGhlIGluaXRpYWxpemF0aW9uIHN0YXRlLgotICAgICAgICAvLwotICAgICAgICAvLyBBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIGNvbnRpbnVlIHRvIHN5bmNocm9uaXplIG9uIHRoZQotICAgICAgICAvLyBkZXNjcmlwdG9yRm9yIGFycmF5LCBidXQgdGhhdCBsZWFkcyB0byBwb29yIHBlcmZvcm1hbmNlCi0gICAgICAgIC8vIChzZWUgYnVnIDQxNjUyMDQgIk9iamVjdFN0cmVhbUNsYXNzIGNhbiBob2xkIGdsb2JhbCBsb2NrCi0gICAgICAgIC8vIGZvciBhIHZlcnkgbG9uZyB0aW1lIikuCi0gICAgICAgIGRlc2MuaW5pdCgpOwotCiAgICAgICAgIHJldHVybiBkZXNjOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL29hL3BvYS9QT0FGYWN0b3J5LmphdmEgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb2EvcG9hL1BPQUZhY3RvcnkuamF2YQppbmRleCA1Y2RlNGJmLi5jMGNiMWQ4IDEwMDY0NAotLS0gYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb2EvcG9hL1BPQUZhY3RvcnkuamF2YQorKysgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb2EvcG9hL1BPQUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwMi0yMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTc2LDYgKzc2LDcgQEAKICAgICBwcml2YXRlIE9SQiBvcmIgOwogICAgIHByaXZhdGUgUE9BU3lzdGVtRXhjZXB0aW9uIHdyYXBwZXIgOwogICAgIHByaXZhdGUgT01HU3lzdGVtRXhjZXB0aW9uIG9tZ1dyYXBwZXIgOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NodXR0aW5nRG93biA9IGZhbHNlOwogCiAgICAgcHVibGljIFBPQVN5c3RlbUV4Y2VwdGlvbiBnZXRXcmFwcGVyKCkKICAgICB7CkBAIC0xNjYsNiArMTY3LDcgQEAKICAgICAgICAgLy8gcG0uZGVhY3RpdmF0ZSByZW1vdmVzIGl0c2VsZiBmcm9tIHBvYU1hbmFnZXJzIQogICAgICAgICBJdGVyYXRvciBtYW5hZ2VycyA9IG51bGwgOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlzU2h1dHRpbmdEb3duID0gdHJ1ZSA7CiAgICAgICAgICAgICBtYW5hZ2VycyA9IChuZXcgSGFzaFNldChwb2FNYW5hZ2VycykpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KIApAQCAtMjA4LDkgKzIxMCwxNSBAQAogICAgICAgICAgICAgQ2xvc3VyZUZhY3RvcnkubWFrZUZ1dHVyZSggcnBDbG9zdXJlICkgKSA7CiAgICAgfQogCisKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFBPQSBnZXRSb290UE9BKCkKICAgICB7CiAgICAgICAgIGlmIChyb290UE9BID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFNlZSBpZiB3ZSBhcmUgdHJ5aW5nIHRvIGdldFJvb3RQT0Egd2hpbGUgc2h1dHRpbmcgZG93biB0aGUgT1JCLgorICAgICAgICAgICAgaWYgKGlzU2h1dHRpbmdEb3duKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgb21nV3JhcHBlci5ub09iamVjdEFkYXB0b3IoICkgOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBvcmIucmVzb2x2ZV9pbml0aWFsX3JlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICAgICAgIE9SQkNvbnN0YW50cy5ST09UX1BPQV9OQU1FICkgOwpkaWZmIC0tZ2l0IGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL29yYi9PUkJJbXBsLmphdmEgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb3JiL09SQkltcGwuamF2YQppbmRleCA1MmI1Y2JmLi40NWZhNmRkIDEwMDY0NAotLS0gYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb3JiL09SQkltcGwuamF2YQorKysgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb3JiL09SQkltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwMi0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTE4NSw3ICsxODUsNiBAQAogCiAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bk9iaiA9IG5ldyBqYXZhLmxhbmcuT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHNodXRkb3duT2JqID0gbmV3IGphdmEubGFuZy5PYmplY3QoKTsKLSAgICBwcml2YXRlIGphdmEubGFuZy5PYmplY3Qgd2FpdEZvckNvbXBsZXRpb25PYmogPSBuZXcgamF2YS5sYW5nLk9iamVjdCgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1RBVFVTX09QRVJBVElORyA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTVEFUVVNfU0hVVFRJTkdfRE9XTiA9IDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTVEFUVVNfU0hVVERPV04gPSAzOwpAQCAtMTk0LDcgKzE5Myw2IEBACiAKICAgICAvLyBYWFggU2hvdWxkIHdlIG1vdmUgaW52b2NhdGlvbiB0cmFja2luZyB0byB0aGUgZmlyc3QgbGV2ZWwgc2VydmVyIGRpc3BhdGNoZXI/CiAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGludm9jYXRpb25PYmogPSBuZXcgamF2YS5sYW5nLk9iamVjdCgpOwotICAgIHByaXZhdGUgaW50IG51bUludm9jYXRpb25zID0gMDsKIAogICAgIC8vIHRocmVhZCBsb2NhbCB2YXJpYWJsZSB0byBzdG9yZSBhIGJvb2xlYW4gdG8gZGV0ZWN0IGRlYWRsb2NrIGluCiAgICAgLy8gT1JCLnNodXRkb3duKHRydWUpLgpAQCAtMTI0NSwzNyArMTI0Myw0OCBAQAogCiAgICAgcHVibGljIHZvaWQgc2h1dGRvd24oYm9vbGVhbiB3YWl0X2Zvcl9jb21wbGV0aW9uKQogICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBjaGVja1NodXRkb3duU3RhdGUoKTsKKyAgICAgICAgLy8gdG8gd2FpdCBmb3IgY29tcGxldGlvbiwgd2Ugd291bGQgZGVhZGxvY2ssIHNvIHRocm93IGEgc3RhbmRhcmQKKyAgICAgICAgLy8gT01HIGV4Y2VwdGlvbi4KKyAgICAgICAgaWYgKHdhaXRfZm9yX2NvbXBsZXRpb24gJiYgKChCb29sZWFuKWlzUHJvY2Vzc2luZ0ludm9jYXRpb24uZ2V0KCkpLmJvb2xlYW5WYWx1ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBvbWdXcmFwcGVyLnNodXRkb3duV2FpdEZvckNvbXBsZXRpb25EZWFkbG9jaygpIDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEF2b2lkIG1vcmUgdGhhbiBvbmUgdGhyZWFkIHBlcmZvcm1pbmcgc2h1dGRvd24gYXQgYSB0aW1lLgotICAgICAgICBzeW5jaHJvbml6ZWQgKHNodXRkb3duT2JqKSB7Ci0gICAgICAgICAgICBjaGVja1NodXRkb3duU3RhdGUoKTsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgZGVhZGxvY2sKLSAgICAgICAgICAgIGlmICh3YWl0X2Zvcl9jb21wbGV0aW9uICYmCi0gICAgICAgICAgICAgICAgaXNQcm9jZXNzaW5nSW52b2NhdGlvbi5nZXQoKSA9PSBCb29sZWFuLlRSVUUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBvbWdXcmFwcGVyLnNodXRkb3duV2FpdEZvckNvbXBsZXRpb25EZWFkbG9jaygpIDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBkb1NodXRkb3duID0gZmFsc2UgOwogCi0gICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfU0hVVFRJTkdfRE9XTjsKLSAgICAgICAgICAgIC8vIFhYWCBhY2Nlc3MgdG8gcmVxdWVzdERpc3BhdGNoZXJSZWdpc3RyeSBzaG91bGQgYmUgcHJvdGVjdGVkCi0gICAgICAgICAgICAvLyBieSB0aGUgT1JCSW1wbCBpbnN0YW5jZSBtb25pdG9yLCBidXQgaXMgbm90IGhlcmUgaW4gdGhlCi0gICAgICAgICAgICAvLyBzaHV0ZG93blNlcnZhbnRzIGNhbGwuCi0gICAgICAgICAgICBzaHV0ZG93blNlcnZhbnRzKHdhaXRfZm9yX2NvbXBsZXRpb24pOwotICAgICAgICAgICAgaWYgKHdhaXRfZm9yX2NvbXBsZXRpb24pIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCB3YWl0Rm9yQ29tcGxldGlvbk9iaiApIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG51bUludm9jYXRpb25zID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Rm9yQ29tcGxldGlvbk9iai53YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkge30KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGNoZWNrU2h1dGRvd25TdGF0ZSgpIDsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTVEFUVVNfU0hVVFRJTkdfRE9XTikgeworICAgICAgICAgICAgICAgIGlmICghd2FpdF9mb3JfY29tcGxldGlvbikKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSBzaHV0dGluZyBkb3duIGFuZCBkb24ndCB3YW50CisgICAgICAgICAgICAgICAgLy8gdG8gd2FpdCwgbm90aGluZyB0byBkbzogcmV0dXJuLgorICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBPUkIgc3RhdHVzIHdhcyBTVEFUVVNfT1BFUkFUSU5HLCBzbyBzdGFydCB0aGUgc2h1dGRvd24uCisgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX1NIVVRUSU5HX0RPV04gOworICAgICAgICAgICAgICAgIGRvU2h1dGRvd24gPSB0cnVlIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHN0YXR1cyBpcyBTSFVUVElOR19ET1dOLgorICAgICAgICAvLyBBbGwgc2h1dGRvd24gY2FsbHMgd2l0aCB3YWl0X2Zvcl9jb21wbGV0aW9uID09IHRydWUgbXVzdCBzeW5jaHJvbml6ZQorICAgICAgICAvLyBoZXJlLiAgT25seSB0aGUgZmlyc3QgY2FsbCB3aWxsIGJlIG1hZGUgd2l0aCBkb1NodXRkb3duID09IHRydWUuCisgICAgICAgIHN5bmNocm9uaXplZCAoc2h1dGRvd25PYmopIHsKKyAgICAgICAgICAgIGlmIChkb1NodXRkb3duKSB7CisgICAgICAgICAgICAgICAgLy8gc2h1dGRvd25TZXJ2YW50cyB3aWxsIHNldCBhbGwgUE9BTWFuYWdlcnMgaW50byB0aGUKKyAgICAgICAgICAgICAgICAvLyBJTkFDVElWRSBzdGF0ZSwgY2F1c2luZyByZXF1ZXN0IHRvIGJlIHJlamVjdGVkLgorICAgICAgICAgICAgICAgIC8vIElmIHdhaXRfZm9yX2NvbXBsZXRpb24gaXMgdHJ1ZSwgdGhpcyB3aWxsIG5vdCByZXR1cm4gdW50aWwKKyAgICAgICAgICAgICAgICAvLyBhbGwgaW52b2NhdGlvbnMgaGF2ZSBjb21wbGV0ZWQuCisgICAgICAgICAgICAgICAgc2h1dGRvd25TZXJ2YW50cyh3YWl0X2Zvcl9jb21wbGV0aW9uKTsKKworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAocnVuT2JqKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bk9iai5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX1NIVVRET1dOOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIHJ1bk9iaiApIHsKLSAgICAgICAgICAgICAgICBydW5PYmoubm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfU0hVVERPV047CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzMTQsMjMgKzEzMjMsMTMgQEAKICAgICB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoaW52b2NhdGlvbk9iaikgewogICAgICAgICAgICAgaXNQcm9jZXNzaW5nSW52b2NhdGlvbi5zZXQoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIG51bUludm9jYXRpb25zKys7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZERpc3BhdGNoKCkKICAgICB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoaW52b2NhdGlvbk9iaikgewotICAgICAgICAgICAgbnVtSW52b2NhdGlvbnMtLTsKICAgICAgICAgICAgIGlzUHJvY2Vzc2luZ0ludm9jYXRpb24uc2V0KEJvb2xlYW4uRkFMU0UpOwotICAgICAgICAgICAgaWYgKG51bUludm9jYXRpb25zID09IDApIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHdhaXRGb3JDb21wbGV0aW9uT2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXRGb3JDb21wbGV0aW9uT2JqLm5vdGlmeUFsbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtSW52b2NhdGlvbnMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgd3JhcHBlci5udW1JbnZvY2F0aW9uc0FscmVhZHlaZXJvKAotICAgICAgICAgICAgICAgICAgICBDb21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFRF9ZRVMgKSA7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzNDEsMTIgKzEzNDAsMjQgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVzdHJveSgpCiAgICAgewotICAgICAgICBpZiAoc3RhdHVzID09IFNUQVRVU19PUEVSQVRJTkcpIHsKKyAgICAgICAgYm9vbGVhbiBzaHV0ZG93bkZpcnN0ID0gZmFsc2UgOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgc2h1dGRvd25GaXJzdCA9IChzdGF0dXMgPT0gU1RBVFVTX09QRVJBVElORykgOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNodXRkb3duRmlyc3QpIHsKICAgICAgICAgICAgIHNodXRkb3duKHRydWUpOwogICAgICAgICB9Ci0gICAgICAgIGdldENvcmJhVHJhbnNwb3J0TWFuYWdlcigpLmNsb3NlKCk7Ci0gICAgICAgIGdldFBJSGFuZGxlcigpLmRlc3Ryb3lJbnRlcmNlcHRvcnMoKSA7Ci0gICAgICAgIHN0YXR1cyA9IFNUQVRVU19ERVNUUk9ZRUQ7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgU1RBVFVTX0RFU1RST1lFRCkgeworICAgICAgICAgICAgICAgIGdldENvcmJhVHJhbnNwb3J0TWFuYWdlcigpLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgZ2V0UElIYW5kbGVyKCkuZGVzdHJveUludGVyY2VwdG9ycygpIDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfREVTVFJPWUVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9vcmIvT1JCU2luZ2xldG9uLmphdmEgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb3JiL09SQlNpbmdsZXRvbi5qYXZhCmluZGV4IDRjNDNlZTYuLmVjZDk1MzkgMTAwNjQ0Ci0tLSBhL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9vcmIvT1JCU2luZ2xldG9uLmphdmEKKysrIGIvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL29yYi9PUkJTaW5nbGV0b24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMTk5Ny0yMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMTk5Ny0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTEzNSw3ICsxMzUsNyBAQAogcHVibGljIGNsYXNzIE9SQlNpbmdsZXRvbiBleHRlbmRzIE9SQgogewogICAgIC8vIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHJlYWRfT2JqZWN0LgotICAgIHByaXZhdGUgc3RhdGljIE9SQiBmdWxsT1JCOworICAgIHByaXZhdGUgT1JCIGZ1bGxPUkI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgUHJlc2VudGF0aW9uTWFuYWdlci5TdHViRmFjdG9yeUZhY3Rvcnkgc3RhdGljU3R1YkZhY3RvcnlGYWN0b3J5ID0KICAgICAgICAgUHJlc2VudGF0aW9uRGVmYXVsdHMuZ2V0U3RhdGljU3R1YkZhY3RvcnlGYWN0b3J5KCkgOwogCmRpZmYgLS1naXQgYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb3JidXRpbC9PUkJVdGlsaXR5LmphdmEgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvb3JidXRpbC9PUkJVdGlsaXR5LmphdmEKaW5kZXggYWI1MTA2ZC4uZGQ1YWY2ZSAxMDA2NDQKLS0tIGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL29yYnV0aWwvT1JCVXRpbGl0eS5qYXZhCisrKyBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9vcmJ1dGlsL09SQlV0aWxpdHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwMC0yMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMC0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTgwNiwyNSArODA2LDYgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdCA7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERhZW1vbihUaHJlYWQgdGhyZWFkKQotICAgIHsKLSAgICAgICAgLy8gQ2F0Y2ggZXhjZXB0aW9ucyBzaW5jZSBzZXREYWVtb24gY2FuIGNhdXNlIGEKLSAgICAgICAgLy8gc2VjdXJpdHkgZXhjZXB0aW9uIHRvIGJlIHRocm93biB1bmRlciBuZXRzY2FwZQotICAgICAgICAvLyBpbiB0aGUgQXBwbGV0IG1vZGUKLSAgICAgICAgZmluYWwgVGhyZWFkIGZpbmFsVGhyZWFkID0gdGhyZWFkOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBSRVZJU0lUOiBPYmplY3QgdG8gZ2V0IHN0YXRpYyBtZXRob2QuIElnbm9yZSBpdC4KLSAgICAgICAgICAgIGRwcmludChuZXcgT2JqZWN0KCksICJzZXREYWVtb246IEV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlcmF0aW9uTmFtZUFuZFJlcXVlc3RJZChDb3JiYU1lc3NhZ2VNZWRpYXRvciBtKQogICAgIHsKICAgICAgICAgcmV0dXJuICJvcC8iICsgbS5nZXRPcGVyYXRpb25OYW1lKCkgKyAiIGlkLyIgKyBtLmdldFJlcXVlc3RJZCgpOwpkaWZmIC0tZ2l0IGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL3Jlc29sdmVyL0lOU1VSTE9wZXJhdGlvbkltcGwuamF2YSBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9yZXNvbHZlci9JTlNVUkxPcGVyYXRpb25JbXBsLmphdmEKaW5kZXggOWQwN2I0NS4uMGJiOWQ5NCAxMDA2NDQKLS0tIGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL3Jlc29sdmVyL0lOU1VSTE9wZXJhdGlvbkltcGwuamF2YQorKysgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvcmVzb2x2ZXIvSU5TVVJMT3BlcmF0aW9uSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAxOTk4LTIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAxOTk4LTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTMsNyArNTMsOCBAQAogaW1wb3J0IGNvbS5zdW4uY29yYmEuc2Uuc3BpLnJlc29sdmVyLlJlc29sdmVyOwogCiBpbXBvcnQgY29tLnN1bi5jb3JiYS5zZS5pbXBsLmVuY29kaW5nLkVuY2Fwc0lucHV0U3RyZWFtOwotaW1wb3J0IGNvbS5zdW4uY29yYmEuc2UuaW1wbC5sb2dnaW5nLk9SQlV0aWxTeXN0ZW1FeGNlcHRpb24gOworaW1wb3J0IGNvbS5zdW4uY29yYmEuc2UuaW1wbC5sb2dnaW5nLk9SQlV0aWxTeXN0ZW1FeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi5jb3JiYS5zZS5pbXBsLmxvZ2dpbmcuT01HU3lzdGVtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5zdW4uY29yYmEuc2UuaW1wbC5uYW1pbmcubmFtaW5ndXRpbC5JTlNVUkxIYW5kbGVyOwogaW1wb3J0IGNvbS5zdW4uY29yYmEuc2UuaW1wbC5uYW1pbmcubmFtaW5ndXRpbC5JSU9QRW5kcG9pbnRJbmZvOwogaW1wb3J0IGNvbS5zdW4uY29yYmEuc2UuaW1wbC5uYW1pbmcubmFtaW5ndXRpbC5JTlNVUkw7CkBAIC03Niw2ICs3Nyw3IEBACiB7CiAgICAgT1JCIG9yYjsKICAgICBPUkJVdGlsU3lzdGVtRXhjZXB0aW9uIHdyYXBwZXIgOworICAgIE9NR1N5c3RlbUV4Y2VwdGlvbiBvbWdXcmFwcGVyIDsKICAgICBSZXNvbHZlciBib290c3RyYXBSZXNvbHZlciA7CiAKICAgICAvLyBSb290IE5hbWluZyBDb250ZXh0IGZvciBkZWZhdWx0IHJlc29sdXRpb24gb2YgbmFtZXMuCkBAIC05MCw2ICs5Miw4IEBACiAgICAgICAgIHRoaXMub3JiID0gb3JiIDsKICAgICAgICAgd3JhcHBlciA9IE9SQlV0aWxTeXN0ZW1FeGNlcHRpb24uZ2V0KCBvcmIsCiAgICAgICAgICAgICBDT1JCQUxvZ0RvbWFpbnMuT1JCX1JFU09MVkVSICkgOworICAgICAgICBvbWdXcmFwcGVyID0gT01HU3lzdGVtRXhjZXB0aW9uLmdldCggb3JiLAorICAgICAgICAgICAgQ09SQkFMb2dEb21haW5zLk9SQl9SRVNPTFZFUiApIDsKICAgICAgICAgdGhpcy5ib290c3RyYXBSZXNvbHZlciA9IGJvb3RzdHJhcFJlc29sdmVyIDsKICAgICB9CiAKQEAgLTEyNiw2ICsxMzAsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBnZXRJT1JGcm9tU3RyaW5nKCBzdHIgKSA7CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBJTlNVUkwgaW5zVVJMID0gaW5zVVJMSGFuZGxlci5wYXJzZVVSTCggc3RyICkgOworICAgICAgICAgICAgICAgIGlmIChpbnNVUkwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgb21nV3JhcHBlci5zb0JhZFNjaGVtZU5hbWUoKSA7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVJTlNVUkwoIGluc1VSTCApIDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL3RyYW5zcG9ydC9Tb2NrZXRPckNoYW5uZWxDb25uZWN0aW9uSW1wbC5qYXZhIGIvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL3RyYW5zcG9ydC9Tb2NrZXRPckNoYW5uZWxDb25uZWN0aW9uSW1wbC5qYXZhCmluZGV4IGUxNjBlZWMuLjVkYmZlZGIgMTAwNjQ0Ci0tLSBhL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC90cmFuc3BvcnQvU29ja2V0T3JDaGFubmVsQ29ubmVjdGlvbkltcGwuamF2YQorKysgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvdHJhbnNwb3J0L1NvY2tldE9yQ2hhbm5lbENvbm5lY3Rpb25JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMDU3LDcgKzEwNTcsOSBAQAogCiAgICAgICAgICAgICAvLyBJSU9QT3V0cHV0U3RyZWFtIHdpbGwgY2xlYW51cCB0aGUgY29ubmVjdGlvbiBpbmZvIHdoZW4gaXQKICAgICAgICAgICAgIC8vIHNlZXMgdGhpcyBleGNlcHRpb24uCi0gICAgICAgICAgICB0aHJvdyB3cmFwcGVyLndyaXRlRXJyb3JTZW5kKGUxKSA7CisgICAgICAgICAgICBTeXN0ZW1FeGNlcHRpb24gZXhjID0gd3JhcHBlci53cml0ZUVycm9yU2VuZChlMSk7CisgICAgICAgICAgICBwdXJnZUNhbGxzKGV4YywgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgdGhyb3cgZXhjOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL3NwaS9sb2dnaW5nL2RhdGEvT1JCVXRpbC5tYyBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2Uvc3BpL2xvZ2dpbmcvZGF0YS9PUkJVdGlsLm1jCmluZGV4IDQwY2RiODguLjdjNDZmMzUgMTAwNjQ0Ci0tLSBhL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2Uvc3BpL2xvZ2dpbmcvZGF0YS9PUkJVdGlsLm1jCisrKyBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2Uvc3BpL2xvZ2dpbmcvZGF0YS9PUkJVdGlsLm1jCkBAIC0xLDYgKzEsNiBAQAogOwogCi07IENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgQ29weXJpZ2h0IDIwMDMtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogOyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiA7CiA7IFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xNDQsNiArMTQ0LDggQEAKIAkgICAgIDE1IFdBUk5JTkcgIlJlYWQgb2YgZnVsbCBtZXNzYWdlIGZhaWxlZCA6IGJ5dGVzIHJlcXVlc3RlZCA9IHswfSBieXRlcyByZWFkID0gezF9IG1heCB3YWl0IHRpbWUgPSB7Mn0gdG90YWwgdGltZSBzcGVudCB3YWl0aW5nID0gezN9IikKIAkgICAgKENSRUFURV9MSVNURU5FUl9GQUlMRUQgCiAJICAgICAxNiBTRVZFUkUgIlVuYWJsZSB0byBjcmVhdGUgbGlzdGVuZXIgdGhyZWFkIG9uIHRoZSBzcGVjaWZpZWQgcG9ydDogezB9IikKKwkgICAgKEJVRkZFUl9SRUFEX01BTkFHRVJfVElNRU9VVAorCSAgICAgMTcgV0FSTklORyAiVGltZW91dCB3aGlsZSByZWFkaW5nIGRhdGEgaW4gYnVmZmVyIG1hbmFnZXIiKQogCSAgICApCiAJKERBVEFfQ09OVkVSU0lPTgogCSAgICAoQkFEX1NUUklOR0lGSUVEX0lPUl9MRU4gMSAgV0FSTklORyAiQSBjaGFyYWN0ZXIgZGlkIG5vdCBtYXAgdG8gdGhlIHRyYW5zbWlzc2lvbiBjb2RlIHNldCIpCmRpZmYgLS1naXQgYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2NvcmJhL3NlL2lkbC9QYXJzZXIuamF2YSBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY29yYmEvc2UvaWRsL1BhcnNlci5qYXZhCmluZGV4IDIwNDMyZWQuLjE3MjIxODIgMTAwNjQ0Ci0tLSBhL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY29yYmEvc2UvaWRsL1BhcnNlci5qYXZhCisrKyBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY29yYmEvc2UvaWRsL1BhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAxOTk5LTIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAxOTk5LTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjA4Niw4ICsyMDg2LDggQEAKIAogICAgIGlmICh0b2tlbi50eXBlID09IFRva2VuLkxlZnRCcmFjZSkgewogICAgICAgcmVwSURTdGFjay5wdXNoKCgoSURMSUQpcmVwSURTdGFjay5wZWVrICgpKS5jbG9uZSAoKSkgOwotICAgICAgKChJRExJRClyZXBJRFN0YWNrLnBlZWsgKCkpLmFwcGVuZFRvTmFtZSAobmFtZSk7CiAgICAgICBzdHJ1Y3RFbnRyeSA9IG1ha2VTdHJ1Y3RFbnRyeSggbmFtZSwgZW50cnksIGZhbHNlICkgOworICAgICAgKChJRExJRClyZXBJRFN0YWNrLnBlZWsgKCkpLmFwcGVuZFRvTmFtZSAobmFtZSk7CiAgICAgICBwcmVwLm9wZW5TY29wZSAoc3RydWN0RW50cnkpOwogICAgICAgbWF0Y2ggKFRva2VuLkxlZnRCcmFjZSkgOwogICAgICAgbWVtYmVyIChzdHJ1Y3RFbnRyeSkgOwpAQCAtMjE3NCw4ICsyMTc0LDggQEAKIAogICAgIGlmICh0b2tlbi50eXBlID09IFRva2VuLlN3aXRjaCkgewogICAgICAgcmVwSURTdGFjay5wdXNoICgoKElETElEKXJlcElEU3RhY2sucGVlayAoKSkuY2xvbmUgKCkpOwotICAgICAgKChJRExJRClyZXBJRFN0YWNrLnBlZWsgKCkpLmFwcGVuZFRvTmFtZSAobmFtZSk7CiAgICAgICB1bmlvbkVudHJ5ID0gbWFrZVVuaW9uRW50cnkoIG5hbWUsIGVudHJ5LCBmYWxzZSApIDsKKyAgICAgICgoSURMSUQpcmVwSURTdGFjay5wZWVrICgpKS5hcHBlbmRUb05hbWUgKG5hbWUpOwogICAgICAgbWF0Y2ggKFRva2VuLlN3aXRjaCk7CiAgICAgICBtYXRjaCAoVG9rZW4uTGVmdFBhcmVuKTsKICAgICAgIHVuaW9uRW50cnkudHlwZSAoc3dpdGNoVHlwZVNwZWMgKHVuaW9uRW50cnkpKTsKQEAgLTI2NDEsOCArMjY0MSw4IEBACiAgIHByaXZhdGUgdm9pZCBleGNlcHREY2wgKFN5bXRhYkVudHJ5IGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uCiAgIHsKICAgICBtYXRjaCAoVG9rZW4uRXhjZXB0aW9uKTsKLSAgICBFeGNlcHRpb25FbnRyeSBleGNlcHRFbnRyeSA9IHN0RmFjdG9yeS5leGNlcHRpb25FbnRyeSAoZW50cnksIChJRExJRClyZXBJRFN0YWNrLnBlZWsgKCkpOwogICAgIHJlcElEU3RhY2sucHVzaCAoKChJRExJRClyZXBJRFN0YWNrLnBlZWsgKCkpLmNsb25lICgpKTsKKyAgICBFeGNlcHRpb25FbnRyeSBleGNlcHRFbnRyeSA9IHN0RmFjdG9yeS5leGNlcHRpb25FbnRyeSAoZW50cnksIChJRExJRClyZXBJRFN0YWNrLnBlZWsgKCkpOwogICAgICgoSURMSUQpcmVwSURTdGFjay5wZWVrICgpKS5hcHBlbmRUb05hbWUgKHRva2VuLm5hbWUpOwogICAgIGV4Y2VwdEVudHJ5LnNvdXJjZUZpbGUgKHNjYW5uZXIuZmlsZUVudHJ5ICgpKTsKICAgICAvLyBDb21tZW50IG11c3QgaW1tZWRpYXRlbHkgcHJlY2VkZSAiZXhjZXB0aW9uIiBrZXl3b3JkCmRpZmYgLS1naXQgYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2NvcmJhL3NlL2xvZ3V0aWwvSW5wdXRFeGNlcHRpb24uamF2YSBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY29yYmEvc2UvbG9ndXRpbC9JbnB1dEV4Y2VwdGlvbi5qYXZhCmluZGV4IDVjMWY0OTguLjU5N2QzMTggMTAwNjQ0Ci0tLSBhL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY29yYmEvc2UvbG9ndXRpbC9JbnB1dEV4Y2VwdGlvbi5qYXZhCisrKyBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY29yYmEvc2UvbG9ndXRpbC9JbnB1dEV4Y2VwdGlvbi5qYXZhCkBAIC05MSw0ICs5MSwzIEBACiAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvb21nL0NPUkJBL09SQi5qYXZhIGIvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL29tZy9DT1JCQS9PUkIuamF2YQppbmRleCBjZWNkZWZlLi5kZGUwOTMwIDEwMDY0NAotLS0gYS9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvb21nL0NPUkJBL09SQi5qYXZhCisrKyBiL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9vbWcvQ09SQkEvT1JCLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDE5OTUtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDE5OTUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yODksNyArMjg5LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBPUkIKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9SQiBpbml0KCkgeworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE9SQiBpbml0KCkgewogICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRTeXN0ZW1Qcm9wZXJ0eShPUkJTaW5nbGV0b25DbGFzc0tleSk7CiAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpCmRpZmYgLS1naXQgYS9ob3RzcG90Ly5oZ2lnbm9yZSBiL2hvdHNwb3QvLmhnaWdub3JlCmluZGV4IDJjNWZlNWIuLmZlYzQ5OWIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3QvLmhnaWdub3JlCisrKyBiL2hvdHNwb3QvLmhnaWdub3JlCkBAIC0xLDcgKzEsNyBAQAogXmJ1aWxkLwogXmRpc3QvCiBebmJwcm9qZWN0L3ByaXZhdGUvCi1ec3JjL3NoYXJlL3Rvb2xzL2hzZGlzL2Jpbi8KK15zcmMvc2hhcmUvdG9vbHMvaHNkaXMvYnVpbGQvCiBec3JjL3NoYXJlL3Rvb2xzL0lkZWFsR3JhcGhWaXN1YWxpemVyL1thLXpBLVowLTldKi9idWlsZC8KIF5zcmMvc2hhcmUvdG9vbHMvSWRlYWxHcmFwaFZpc3VhbGl6ZXIvYnVpbGQvCiBec3JjL3NoYXJlL3Rvb2xzL0lkZWFsR3JhcGhWaXN1YWxpemVyL2Rpc3QvCmRpZmYgLS1naXQgYS9ob3RzcG90Ly5oZ3RhZ3MgYi9ob3RzcG90Ly5oZ3RhZ3MKaW5kZXggMzlkNTE4Mi4uMGY5MjdmYiAxMDA2NDQKLS0tIGEvaG90c3BvdC8uaGd0YWdzCisrKyBiL2hvdHNwb3QvLmhndGFncwpAQCAtMzAsMyArMzAsNCBAQAogMDMyYzZhZjg5NGRhZThkOTM5YjNkZDMxZDgyMDQyNTQ5ZTc3OTNlMCBqZGs3LWI1MwogZmFmYWI1ZDUzNDljN2MwNjZkNjc3NTM4ZGI2N2ExZWUwZmIzM2JkMiBqZGs3LWI1NAogZjhlODM5YzA4NjE1MmRhNzBkNmVjNTkxM2JhNmY5ZjUwOTI4MmU4ZCBqZGs3LWI1NQorYTNmZDllNDBmZjJlODU0ZjYxNjllYjZkMDlkNDkxYTI4NjM0ZDA0ZiBqZGs3LWI1NgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9tYWtlL2hvdHNwb3RfdmVyc2lvbiBiL2hvdHNwb3QvbWFrZS9ob3RzcG90X3ZlcnNpb24KaW5kZXggYTk5NjcwYi4uMDNlNWRmOCAxMDA2NDQKLS0tIGEvaG90c3BvdC9tYWtlL2hvdHNwb3RfdmVyc2lvbgorKysgYi9ob3RzcG90L21ha2UvaG90c3BvdF92ZXJzaW9uCkBAIC0zNSw3ICszNSw3IEBACiAKIEhTX01BSk9SX1ZFUj0xNgogSFNfTUlOT1JfVkVSPTAKLUhTX0JVSUxEX05VTUJFUj0wMQorSFNfQlVJTERfTlVNQkVSPTAyCiAKIEpES19NQUpPUl9WRVI9MQogSkRLX01JTk9SX1ZFUj03CmRpZmYgLS1naXQgYS9ob3RzcG90L21ha2UvanBydC5wcm9wZXJ0aWVzIGIvaG90c3BvdC9tYWtlL2pwcnQucHJvcGVydGllcwppbmRleCA2MzMyMDA4Li4yYWI3NjhmIDEwMDY0NAotLS0gYS9ob3RzcG90L21ha2UvanBydC5wcm9wZXJ0aWVzCisrKyBiL2hvdHNwb3QvbWFrZS9qcHJ0LnByb3BlcnRpZXMKQEAgLTQ2LDI0ICs0NiwyOCBAQAoganBydC5teS5zb2xhcmlzLnNwYXJjLmpkazY9c29sYXJpc19zcGFyY181LjgKIGpwcnQubXkuc29sYXJpcy5zcGFyYy5qZGs2cGVyZj1zb2xhcmlzX3NwYXJjXzUuOAoganBydC5teS5zb2xhcmlzLnNwYXJjLmpkazZ1MTA9c29sYXJpc19zcGFyY181LjgKK2pwcnQubXkuc29sYXJpcy5zcGFyYy5qZGs2dTE0PXNvbGFyaXNfc3BhcmNfNS44CiBqcHJ0Lm15LnNvbGFyaXMuc3BhcmM9JHtqcHJ0Lm15LnNvbGFyaXMuc3BhcmMuJHtqcHJ0LnRvb2xzLmRlZmF1bHQucmVsZWFzZX19CiAKIGpwcnQubXkuc29sYXJpcy5zcGFyY3Y5Lmpkazc9c29sYXJpc19zcGFyY3Y5XzUuMTAKIGpwcnQubXkuc29sYXJpcy5zcGFyY3Y5LmpkazY9c29sYXJpc19zcGFyY3Y5XzUuOAoganBydC5teS5zb2xhcmlzLnNwYXJjdjkuamRrNnBlcmY9c29sYXJpc19zcGFyY3Y5XzUuOAoganBydC5teS5zb2xhcmlzLnNwYXJjdjkuamRrNnUxMD1zb2xhcmlzX3NwYXJjdjlfNS44CitqcHJ0Lm15LnNvbGFyaXMuc3BhcmN2OS5qZGs2dTE0PXNvbGFyaXNfc3BhcmN2OV81LjgKIGpwcnQubXkuc29sYXJpcy5zcGFyY3Y5PSR7anBydC5teS5zb2xhcmlzLnNwYXJjdjkuJHtqcHJ0LnRvb2xzLmRlZmF1bHQucmVsZWFzZX19CiAKIGpwcnQubXkuc29sYXJpcy5pNTg2Lmpkazc9c29sYXJpc19pNTg2XzUuMTAKIGpwcnQubXkuc29sYXJpcy5pNTg2LmpkazY9c29sYXJpc19pNTg2XzUuOAoganBydC5teS5zb2xhcmlzLmk1ODYuamRrNnBlcmY9c29sYXJpc19pNTg2XzUuOAoganBydC5teS5zb2xhcmlzLmk1ODYuamRrNnUxMD1zb2xhcmlzX2k1ODZfNS44CitqcHJ0Lm15LnNvbGFyaXMuaTU4Ni5qZGs2dTE0PXNvbGFyaXNfaTU4Nl81LjgKIGpwcnQubXkuc29sYXJpcy5pNTg2PSR7anBydC5teS5zb2xhcmlzLmk1ODYuJHtqcHJ0LnRvb2xzLmRlZmF1bHQucmVsZWFzZX19CiAKIGpwcnQubXkuc29sYXJpcy54NjQuamRrNz1zb2xhcmlzX3g2NF81LjEwCiBqcHJ0Lm15LnNvbGFyaXMueDY0LmpkazY9c29sYXJpc194NjRfNS4xMAoganBydC5teS5zb2xhcmlzLng2NC5qZGs2cGVyZj1zb2xhcmlzX3g2NF81LjEwCiBqcHJ0Lm15LnNvbGFyaXMueDY0LmpkazZ1MTA9c29sYXJpc194NjRfNS4xMAoranBydC5teS5zb2xhcmlzLng2NC5qZGs2dTE0PXNvbGFyaXNfeDY0XzUuMTAKIGpwcnQubXkuc29sYXJpcy54NjQ9JHtqcHJ0Lm15LnNvbGFyaXMueDY0LiR7anBydC50b29scy5kZWZhdWx0LnJlbGVhc2V9fQogCiBqcHJ0Lm15LmxpbnV4Lmk1ODY9bGludXhfaTU4NgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9tYWtlL3NvbGFyaXMvbWFrZWZpbGVzL3NwYXJjV29ya3MubWFrZSBiL2hvdHNwb3QvbWFrZS9zb2xhcmlzL21ha2VmaWxlcy9zcGFyY1dvcmtzLm1ha2UKaW5kZXggNTAxMjY4ZS4uZjg4Y2ZkZiAxMDA2NDQKLS0tIGEvaG90c3BvdC9tYWtlL3NvbGFyaXMvbWFrZWZpbGVzL3NwYXJjV29ya3MubWFrZQorKysgYi9ob3RzcG90L21ha2Uvc29sYXJpcy9tYWtlZmlsZXMvc3BhcmNXb3Jrcy5tYWtlCkBAIC00Niw3ICs0Niw3IEBACiAkKHNoZWxsICQoQ0MpIC1WIDI+JjEgfCBzZWQgLW4gJ3MvXi4qWyAsXHRdQ1sgLFx0XVwoWzEtOV1cLlswLTldWzAtOV0qXCkuKi9cMS9wJykKIAogIyBQaWNrIHdoaWNoIGNvbXBpbGVyIGlzIHZhbGlkYXRlZAotaWZlcSAoJChKREtfTUlOT1JfVkVSU0lPTiksNikKK2lmZXEgKCQoSlJFX1JFTEVBU0VfVkVSKSwxLjYuMCkKICAgIyBWYWxpZGF0ZWQgY29tcGlsZXIgZm9yIEpESzYgaXMgU1MxMSAoNS44KQogICBWQUxJREFURURfQ09NUElMRVJfUkVWICAgOj0gNS44CiAgIFZBTElEQVRFRF9DX0NPTVBJTEVSX1JFViA6PSA1LjgKQEAgLTEwMSwxOCArMTAxLDkgQEAKIAogIyBOZXcgYXJjaGl0ZWN0dXJlIG9wdGlvbnMgc3RhcnRlZCBpbiBTUzEyICg1LjkpLCB3ZSBuZWVkIGJvdGggc3R5bGVzIHRvIGJ1aWxkLgogIyAgIFRoZSBvbGRlciBhcmNoIG9wdGlvbnMgZm9yIFNTMTEgKDUuOCkgb3Igb2xkZXIgYW5kIGFsc28gZm9yIC91c3IvY2NzL2Jpbi9hcy4KLSMgICBOb3RlOiBTUzEyIGRlZmF1bHQgZm9yIDMyYml0IHNwYXJjIGlzIG5vdyB0aGUgc2FtZSBhcyB2OHBsdXMsIHNvIHRoZQotIyAgICAgICAgIHNldHRpbmdzIGJlbG93IGhhdmUgY2hhbmdlZCBhbGwgU1MxMiAzMmJpdCBzcGFyYyBidWlsZHMgdG8gYmUgdjhwbHVzLgotIyAgICAgICAgIFRoZSBvbGRlciBTUzExICg1LjgpIHNldHRpbmdzIGhhdmUgcmVtYWluZWQgYXMgdGhleSBhbHdheXMgaGF2ZSBiZWVuLgotaWZlcSAoJChUWVBFKSxDT01QSUxFUjIpCi0gIEFSQ0hGTEFHX09MRC9zcGFyYyAgID0gLXhhcmNoPXY4cGx1cwotZWxzZQotICBpZmVxICgkKFRZUEUpLFRJRVJFRCkKLSAgICBBUkNIRkxBR19PTEQvc3BhcmMgPSAteGFyY2g9djhwbHVzCi0gIGVsc2UKLSAgICBBUkNIRkxBR19PTEQvc3BhcmMgPSAteGFyY2g9djgKLSAgZW5kaWYKLWVuZGlmCisjICAgTm90ZTogZGVmYXVsdCBmb3IgMzJiaXQgc3BhcmMgaXMgbm93IHRoZSBzYW1lIGFzIHY4cGx1cywgc28gdGhlCisjICAgICAgICAgc2V0dGluZ3MgYmVsb3cgaGF2ZSBjaGFuZ2VkIGFsbCAzMmJpdCBzcGFyYyBidWlsZHMgdG8gYmUgdjhwbHVzLgorQVJDSEZMQUdfT0xEL3NwYXJjICAgPSAteGFyY2g9djhwbHVzCiBBUkNIRkxBR19ORVcvc3BhcmMgICA9IC1tMzIgLXhhcmNoPXNwYXJjCiBBUkNIRkxBR19PTEQvc3BhcmN2OSA9IC14YXJjaD12OQogQVJDSEZMQUdfTkVXL3NwYXJjdjkgPSAtbTY0IC14YXJjaD1zcGFyYwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9tYWtlL3dpbmRvd3MvbWFrZWZpbGVzL3ZtLm1ha2UgYi9ob3RzcG90L21ha2Uvd2luZG93cy9tYWtlZmlsZXMvdm0ubWFrZQppbmRleCAxNTFjMjgwLi5lYWZiNDQxIDEwMDY0NAotLS0gYS9ob3RzcG90L21ha2Uvd2luZG93cy9tYWtlZmlsZXMvdm0ubWFrZQorKysgYi9ob3RzcG90L21ha2Uvd2luZG93cy9tYWtlZmlsZXMvdm0ubWFrZQpAQCAtNTUsMTAgKzU1LDE2IEBACiBDUFBfRkxBR1M9JChDUFBfRkxBR1MpIC9EICJDT01QSUxFUjEiIC9EICJDT01QSUxFUjIiCiAhZW5kaWYKIAorIWlmICIkKEJVSUxEQVJDSCkiID09ICJpNDg2IgorSE9UU1BPVF9MSUJfQVJDSD1pMzg2CishZWxzZQorSE9UU1BPVF9MSUJfQVJDSD0kKEJVSUxEQVJDSCkKKyFlbmRpZgorCiAjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgbG9jYWwubWFrZSBmaWxlLgogQ1BQX0ZMQUdTPSQoQ1BQX0ZMQUdTKSAvRCAiSE9UU1BPVF9SRUxFQVNFX1ZFUlNJT049XCIkKEhTX0JVSUxEX1ZFUilcIiIKIENQUF9GTEFHUz0kKENQUF9GTEFHUykgL0QgIkpSRV9SRUxFQVNFX1ZFUlNJT049XCIkKEpSRV9SRUxFQVNFX1ZFUilcIiIKLUNQUF9GTEFHUz0kKENQUF9GTEFHUykgL0QgIkhPVFNQT1RfTElCX0FSQ0g9XCIkKEJVSUxEQVJDSClcIiIKK0NQUF9GTEFHUz0kKENQUF9GTEFHUykgL0QgIkhPVFNQT1RfTElCX0FSQ0g9XCIkKEhPVFNQT1RfTElCX0FSQ0gpXCIiCiBDUFBfRkxBR1M9JChDUFBfRkxBR1MpIC9EICJIT1RTUE9UX0JVSUxEX1RBUkdFVD1cIiQoQlVJTERfRkxBVk9SKVwiIgogQ1BQX0ZMQUdTPSQoQ1BQX0ZMQUdTKSAvRCAiSE9UU1BPVF9CVUlMRF9VU0VSPVwiJChCdWlsZFVzZXIpXCIiCiBDUFBfRkxBR1M9JChDUFBfRkxBR1MpIC9EICJIT1RTUE9UX1ZNX0RJU1RSTz1cIiQoSE9UU1BPVF9WTV9ESVNUUk8pXCIiCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYXNzZW1ibGVyX3NwYXJjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9hc3NlbWJsZXJfc3BhcmMuY3BwCmluZGV4IGQzNmNhZjUuLmI5ZDgwNDcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9hc3NlbWJsZXJfc3BhcmMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9hc3NlbWJsZXJfc3BhcmMuY3BwCkBAIC0yNSwyNCArMjUsMzYgQEAKICNpbmNsdWRlICJpbmNscy9fcHJlY29tcGlsZWQuaW5jbCIKICNpbmNsdWRlICJpbmNscy9fYXNzZW1ibGVyX3NwYXJjLmNwcC5pbmNsIgogCi0vLyBJbXBsZW1lbnRhdGlvbiBvZiBBZGRyZXNzCi0KLUFkZHJlc3M6OkFkZHJlc3MoIGFkZHJfdHlwZSB0LCBpbnQgd2hpY2ggKSB7Ci0gIHN3aXRjaCAodCkgewotICAgY2FzZSBleHRyYV9pbl9hcmd1bWVudDoKLSAgIGNhc2UgZXh0cmFfb3V0X2FyZ3VtZW50OgotICAgICBfYmFzZSA9IHQgPT0gZXh0cmFfaW5fYXJndW1lbnQgPyBGUCA6IFNQOwotICAgICBfaGkgICA9IDA7Ci0vLyBXYXJuaW5nOiAgSW4gTFA2NCBtb2RlLCBfZGlzcCB3aWxsIG9jY3VweSBtb3JlIHRoYW4gMTAgYml0cy4KLS8vICAgICAgICAgICBUaGlzIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMgYnV0IG9wCi0vLyAgICAgICAgICAgY29kZXMgc3VjaCBhcyBsZCBvciBsZHgsIG9ubHkgYWNjZXNzIGRpc3AoKSB0byBnZXQgdGhlaXIKLS8vICAgICAgICAgICBzaW1tMTMgYXJndW1lbnQuCi0gICAgIF9kaXNwID0gKCh3aGljaCAtIEFyZ3VtZW50OjpuX3JlZ2lzdGVyX3BhcmFtZXRlcnMgKyBmcmFtZTo6bWVtb3J5X3BhcmFtZXRlcl93b3JkX3NwX29mZnNldCkgKiBCeXRlc1BlcldvcmQpICsgU1RBQ0tfQklBUzsKLSAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7Ci0gICAgYnJlYWs7CisvLyBDb252ZXJ0IHRoZSByYXcgZW5jb2RpbmcgZm9ybSBpbnRvIHRoZSBmb3JtIGV4cGVjdGVkIGJ5IHRoZQorLy8gY29uc3RydWN0b3IgZm9yIEFkZHJlc3MuCitBZGRyZXNzIEFkZHJlc3M6Om1ha2VfcmF3KGludCBiYXNlLCBpbnQgaW5kZXgsIGludCBzY2FsZSwgaW50IGRpc3AsIGJvb2wgZGlzcF9pc19vb3ApIHsKKyAgYXNzZXJ0KHNjYWxlID09IDAsICJub3Qgc3VwcG9ydGVkIik7CisgIFJlbG9jYXRpb25Ib2xkZXIgcnNwZWM7CisgIGlmIChkaXNwX2lzX29vcCkgeworICAgIHJzcGVjID0gUmVsb2NhdGlvbjo6c3BlY19zaW1wbGUocmVsb2NJbmZvOjpvb3BfdHlwZSk7CiAgIH0KKworICBSZWdpc3RlciByaW5kZXggPSBhc19SZWdpc3RlcihpbmRleCk7CisgIGlmIChyaW5kZXggIT0gRzApIHsKKyAgICBBZGRyZXNzIG1hZHIoYXNfUmVnaXN0ZXIoYmFzZSksIHJpbmRleCk7CisgICAgbWFkci5fcnNwZWMgPSByc3BlYzsKKyAgICByZXR1cm4gbWFkcjsKKyAgfSBlbHNlIHsKKyAgICBBZGRyZXNzIG1hZHIoYXNfUmVnaXN0ZXIoYmFzZSksIGRpc3ApOworICAgIG1hZHIuX3JzcGVjID0gcnNwZWM7CisgICAgcmV0dXJuIG1hZHI7CisgIH0KK30KKworQWRkcmVzcyBBcmd1bWVudDo6YWRkcmVzc19pbl9mcmFtZSgpIGNvbnN0IHsKKyAgLy8gV2FybmluZzogSW4gTFA2NCBtb2RlIGRpc3Agd2lsbCBvY2N1cHkgbW9yZSB0aGFuIDEwIGJpdHMsIGJ1dAorICAvLyAgICAgICAgICBvcCBjb2RlcyBzdWNoIGFzIGxkIG9yIGxkeCwgb25seSBhY2Nlc3MgZGlzcCgpIHRvIGdldAorICAvLyAgICAgICAgICB0aGVpciBzaW1tMTMgYXJndW1lbnQuCisgIGludCBkaXNwID0gKChfbnVtYmVyIC0gQXJndW1lbnQ6Om5fcmVnaXN0ZXJfcGFyYW1ldGVycyArIGZyYW1lOjptZW1vcnlfcGFyYW1ldGVyX3dvcmRfc3Bfb2Zmc2V0KSAqIEJ5dGVzUGVyV29yZCkgKyBTVEFDS19CSUFTOworICBpZiAoaXNfaW4oKSkKKyAgICByZXR1cm4gQWRkcmVzcyhGUCwgZGlzcCk7IC8vIEluIGFyZ3VtZW50LgorICBlbHNlCisgICAgcmV0dXJuIEFkZHJlc3MoU1AsIGRpc3ApOyAvLyBPdXQgYXJndW1lbnQuCiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyKiBhcmd1bWVudE5hbWVzW11bMl0gPSB7CkBAIC02MTQsMTYgKzYyNiwxNyBAQAogfQogCiAvLyBUaGlzIGNvZGUgc2VxdWVuY2UgaXMgcmVsb2NhdGFibGUgdG8gYW55IGFkZHJlc3MsIGV2ZW4gb24gTFA2NC4KLXZvaWQgTWFjcm9Bc3NlbWJsZXI6Omp1bXBsKCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSApIHsKK3ZvaWQgTWFjcm9Bc3NlbWJsZXI6Omp1bXBsKEFkZHJlc3NMaXRlcmFsJiBhZGRybGl0LCBSZWdpc3RlciB0ZW1wLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgewogICBhc3NlcnRfbm90X2RlbGF5ZWQoKTsKICAgLy8gRm9yY2UgZml4ZWQgbGVuZ3RoIHNldGhpIGJlY2F1c2UgTmF0aXZlSnVtcCBhbmQgTmF0aXZlRmFyQ2FsbCBkb24ndCBoYW5kbGUKICAgLy8gdmFyaWFibGUgbGVuZ3RoIGluc3RydWN0aW9uIHN0cmVhbXMuCi0gIHNldGhpKGEsIC8qRm9yY2VSZWxvY2F0YWJsZT0qLyB0cnVlKTsKKyAgcGF0Y2hhYmxlX3NldGhpKGFkZHJsaXQsIHRlbXApOworICBBZGRyZXNzIGEodGVtcCwgYWRkcmxpdC5sb3cxMCgpICsgb2Zmc2V0KTsgIC8vIEFkZCB0aGUgb2Zmc2V0IHRvIHRoZSBkaXNwbGFjZW1lbnQuCiAgIGlmIChUcmFjZUp1bXBzKSB7CiAjaWZuZGVmIFBST0RVQ1QKICAgICAvLyBNdXN0IGRvIHRoZSBhZGQgaGVyZSBzbyByZWxvY2F0aW9uIGNhbiBmaW5kIHRoZSByZW1haW5kZXIgb2YgdGhlCiAgICAgLy8gdmFsdWUgdG8gYmUgcmVsb2NhdGVkLgotICAgIGFkZChhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQsIGEuYmFzZSgpLCBhLnJzcGVjKG9mZnNldCkpOworICAgIGFkZChhLmJhc2UoKSwgYS5kaXNwKCksIGEuYmFzZSgpLCBhZGRybGl0LnJzcGVjKG9mZnNldCkpOwogICAgIHNhdmVfZnJhbWUoMCk7CiAgICAgdmVyaWZ5X3RocmVhZCgpOwogICAgIGxkKEcyX3RocmVhZCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6am1wX3JpbmdfaW5kZXhfb2Zmc2V0KCkpLCBPMCk7CkBAIC02NTIsMTUgKzY2NSwxNSBAQAogICAgIHJlc3RvcmUoKTsKICAgICBqbXBsKGEuYmFzZSgpLCBHMCwgZCk7CiAjZWxzZQotICAgIGptcGwoYSwgZCwgb2Zmc2V0KTsKKyAgICBqbXBsKGEuYmFzZSgpLCBhLmRpc3AoKSwgZCk7CiAjZW5kaWYgLyogUFJPRFVDVCAqLwogICB9IGVsc2UgewotICAgIGptcGwoYSwgZCwgb2Zmc2V0KTsKKyAgICBqbXBsKGEuYmFzZSgpLCBhLmRpc3AoKSwgZCk7CiAgIH0KIH0KIAotdm9pZCBNYWNyb0Fzc2VtYmxlcjo6anVtcCggQWRkcmVzcyYgYSwgaW50IG9mZnNldCwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUgKSB7Ci0gIGp1bXBsKCBhLCBHMCwgb2Zmc2V0LCBmaWxlLCBsaW5lICk7Cit2b2lkIE1hY3JvQXNzZW1ibGVyOjpqdW1wKEFkZHJlc3NMaXRlcmFsJiBhZGRybGl0LCBSZWdpc3RlciB0ZW1wLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBqdW1wbChhZGRybGl0LCB0ZW1wLCBHMCwgb2Zmc2V0LCBmaWxlLCBsaW5lKTsKIH0KIAogCkBAIC02NzgsNyArNjkxLDggQEAKICAgICBzdF9wdHIoc2F2ZVB0ci5hc19yZWdpc3RlcigpLCBzYXZlUHRyLmFkZHJlc3NfaW5fZnJhbWUoKSk7CiAgIH0KICAgLy8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgc2xvdAotICBhZGQoaW5BcmcuYWRkcmVzc19pbl9mcmFtZSgpLCBkKTsKKyAgQWRkcmVzcyBhID0gaW5BcmcuYWRkcmVzc19pbl9mcmFtZSgpOworICBhZGQoYS5iYXNlKCksIGEuZGlzcCgpLCBkKTsKIH0KIAogLy8gQ29uZGl0aW9uYWwgYnJlYWtwb2ludCAoZm9yIGFzc2VydGlvbiBjaGVja3MgaW4gYXNzZW1ibHkgY29kZSkKQEAgLTcwMiw3ICs3MTYsNiBAQAogLy8gb2Zmc2V0IHRvIHdyaXRlIHRvIHdpdGhpbiB0aGUgcGFnZS4gVGhpcyBtaW5pbWl6ZXMgYnVzIHRyYWZmaWMKIC8vIGR1ZSB0byBjYWNoZSBsaW5lIGNvbGxpc2lvbi4KIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnNlcmlhbGl6ZV9tZW1vcnkoUmVnaXN0ZXIgdGhyZWFkLCBSZWdpc3RlciB0bXAxLCBSZWdpc3RlciB0bXAyKSB7Ci0gIEFkZHJlc3MgbWVtX3NlcmlhbGl6ZV9wYWdlKHRtcDEsIG9zOjpnZXRfbWVtb3J5X3NlcmlhbGl6ZV9wYWdlKCkpOwogICBzcmwodGhyZWFkLCBvczo6Z2V0X3NlcmlhbGl6ZV9wYWdlX3NoaWZ0X2NvdW50KCksIHRtcDIpOwogICBpZiAoQXNzZW1ibGVyOjppc19zaW1tMTMob3M6OnZtX3BhZ2Vfc2l6ZSgpKSkgewogICAgIGFuZDModG1wMiwgKG9zOjp2bV9wYWdlX3NpemUoKSAtIHNpemVvZihpbnQpKSwgdG1wMik7CkBAIC03MTEsNyArNzI0LDcgQEAKICAgICBzZXQoKG9zOjp2bV9wYWdlX3NpemUoKSAtIHNpemVvZihpbnQpKSwgdG1wMSk7CiAgICAgYW5kMyh0bXAyLCB0bXAxLCB0bXAyKTsKICAgfQotICBsb2FkX2FkZHJlc3MobWVtX3NlcmlhbGl6ZV9wYWdlKTsKKyAgc2V0KG9zOjpnZXRfbWVtb3J5X3NlcmlhbGl6ZV9wYWdlKCksIHRtcDEpOwogICBzdChHMCwgdG1wMSwgdG1wMik7CiB9CiAKQEAgLTgzMCwxMCArODQzLDEwIEBACiAgIG1vdihHMywgTDIpOyAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIGNsb2JiZXJpbmcgRzMgYWxzbwogICBtb3YoRzQsIEw1KTsgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBjbG9iYmVyaW5nIEc0CiAjaWZkZWYgQVNTRVJUCi0gIEFkZHJlc3MgbGFzdF9nZXRfdGhyZWFkX2FkZHIoTDMsIChhZGRyZXNzKSZsYXN0X2dldF90aHJlYWQpOwotICBzZXRoaShsYXN0X2dldF90aHJlYWRfYWRkcik7CisgIEFkZHJlc3NMaXRlcmFsIGxhc3RfZ2V0X3RocmVhZF9hZGRybGl0KCZsYXN0X2dldF90aHJlYWQpOworICBzZXQobGFzdF9nZXRfdGhyZWFkX2FkZHJsaXQsIEwzKTsKICAgaW5jKEw0LCBnZXRfcGMoTDQpICsgMiAqIEJ5dGVzUGVySW5zdFdvcmQpOyAvLyBza2lwIGdldHBjKCkgY29kZSArIGluYyArIHN0X3B0ciB0byBwb2ludCBMNCBhdCBjYWxsCi0gIHN0X3B0cihMNCwgbGFzdF9nZXRfdGhyZWFkX2FkZHIpOworICBzdF9wdHIoTDQsIEwzLCAwKTsKICNlbmRpZgogICBjYWxsKENBU1RfRlJPTV9GTl9QVFIoYWRkcmVzcywgcmVpbml0aWFsaXplX3RocmVhZCksIHJlbG9jSW5mbzo6cnVudGltZV9jYWxsX3R5cGUpOwogICBkZWxheWVkKCktPm5vcCgpOwpAQCAtOTE5LDEzICs5MzIsOSBAQAogLy8gJSUlIG1heWJlIGdldCByaWQgb2YgW3JlXXNldF9sYXN0X0phdmFfZnJhbWUKIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnNldF9sYXN0X0phdmFfZnJhbWUoUmVnaXN0ZXIgbGFzdF9qYXZhX3NwLCBSZWdpc3RlciBsYXN0X0phdmFfcGMpIHsKICAgYXNzZXJ0X25vdF9kZWxheWVkKCk7Ci0gIEFkZHJlc3MgZmxhZ3MoRzJfdGhyZWFkLAotICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgaW5fYnl0ZXMoSmF2YVRocmVhZDo6ZnJhbWVfYW5jaG9yX29mZnNldCgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5fYnl0ZXMoSmF2YUZyYW1lQW5jaG9yOjpmbGFnc19vZmZzZXQoKSkpOwotICBBZGRyZXNzIHBjX2FkZHIoRzJfdGhyZWFkLAotICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgIGluX2J5dGVzKEphdmFUaHJlYWQ6Omxhc3RfSmF2YV9wY19vZmZzZXQoKSkpOworICBBZGRyZXNzIGZsYWdzKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6ZnJhbWVfYW5jaG9yX29mZnNldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFGcmFtZUFuY2hvcjo6ZmxhZ3Nfb2Zmc2V0KCkpOworICBBZGRyZXNzIHBjX2FkZHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpsYXN0X0phdmFfcGNfb2Zmc2V0KCkpOwogCiAgIC8vIEFsd2F5cyBzZXQgbGFzdF9KYXZhX3BjIGFuZCBmbGFncyBmaXJzdCBiZWNhdXNlIG9uY2UgbGFzdF9KYXZhX3NwIGlzIHZpc2libGUKICAgLy8gaGFzX2xhc3RfSmF2YV9mcmFtZSBpcyB0cnVlIGFuZCB1c2VycyB3aWxsIGxvb2sgYXQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcy4KQEAgLTk3NywyMiArOTg2LDE4IEBACiAjZW5kaWYgLy8gQVNTRVJUCiAgIGFzc2VydCggbGFzdF9qYXZhX3NwICE9IEc0X3NjcmF0Y2gsICJiYWQgcmVnaXN0ZXIgdXNhZ2UgaW4gc2V0X2xhc3RfSmF2YV9mcmFtZSIpOwogICBhZGQoIGxhc3RfamF2YV9zcCwgU1RBQ0tfQklBUywgRzRfc2NyYXRjaCApOwotICBzdF9wdHIoRzRfc2NyYXRjaCwgICAgQWRkcmVzcyhHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6Omxhc3RfSmF2YV9zcF9vZmZzZXQoKSkpKTsKKyAgc3RfcHRyKEc0X3NjcmF0Y2gsIEcyX3RocmVhZCwgSmF2YVRocmVhZDo6bGFzdF9KYXZhX3NwX29mZnNldCgpKTsKICNlbHNlCi0gIHN0X3B0cihsYXN0X2phdmFfc3AsICAgIEFkZHJlc3MoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjpsYXN0X0phdmFfc3Bfb2Zmc2V0KCkpKSk7CisgIHN0X3B0cihsYXN0X2phdmFfc3AsIEcyX3RocmVhZCwgSmF2YVRocmVhZDo6bGFzdF9KYXZhX3NwX29mZnNldCgpKTsKICNlbmRpZiAvLyBfTFA2NAogfQogCiB2b2lkIE1hY3JvQXNzZW1ibGVyOjpyZXNldF9sYXN0X0phdmFfZnJhbWUodm9pZCkgewogICBhc3NlcnRfbm90X2RlbGF5ZWQoKTsKIAotICBBZGRyZXNzIHNwX2FkZHIoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjpsYXN0X0phdmFfc3Bfb2Zmc2V0KCkpKTsKLSAgQWRkcmVzcyBwY19hZGRyKEcyX3RocmVhZCwKLSAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICBpbl9ieXRlcyhKYXZhVGhyZWFkOjpmcmFtZV9hbmNob3Jfb2Zmc2V0KCkpICsgaW5fYnl0ZXMoSmF2YUZyYW1lQW5jaG9yOjpsYXN0X0phdmFfcGNfb2Zmc2V0KCkpKTsKLSAgQWRkcmVzcyBmbGFncyhHMl90aHJlYWQsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICBpbl9ieXRlcyhKYXZhVGhyZWFkOjpmcmFtZV9hbmNob3Jfb2Zmc2V0KCkpICsgaW5fYnl0ZXMoSmF2YUZyYW1lQW5jaG9yOjpmbGFnc19vZmZzZXQoKSkpOworICBBZGRyZXNzIHNwX2FkZHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpsYXN0X0phdmFfc3Bfb2Zmc2V0KCkpOworICBBZGRyZXNzIHBjX2FkZHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpmcmFtZV9hbmNob3Jfb2Zmc2V0KCkgKyBKYXZhRnJhbWVBbmNob3I6Omxhc3RfSmF2YV9wY19vZmZzZXQoKSk7CisgIEFkZHJlc3MgZmxhZ3MgIChHMl90aHJlYWQsIEphdmFUaHJlYWQ6OmZyYW1lX2FuY2hvcl9vZmZzZXQoKSArIEphdmFGcmFtZUFuY2hvcjo6ZmxhZ3Nfb2Zmc2V0KCkpOwogCiAjaWZkZWYgQVNTRVJUCiAgIC8vIGNoZWNrIHRoYXQgaXQgV0FTIHByZXZpb3VzbHkgc2V0CkBAIC0xMDYzLDcgKzEwNjgsNyBAQAogICBjaGVja19hbmRfaGFuZGxlX3BvcGZyYW1lKHNjcmF0Y2hfcmVnKTsKICAgY2hlY2tfYW5kX2hhbmRsZV9lYXJseXJldChzY3JhdGNoX3JlZyk7CiAKLSAgQWRkcmVzcyBleGNlcHRpb25fYWRkcihHMl90aHJlYWQsIDAsIGluX2J5dGVzKFRocmVhZDo6cGVuZGluZ19leGNlcHRpb25fb2Zmc2V0KCkpKTsKKyAgQWRkcmVzcyBleGNlcHRpb25fYWRkcihHMl90aHJlYWQsIFRocmVhZDo6cGVuZGluZ19leGNlcHRpb25fb2Zmc2V0KCkpOwogICBsZF9wdHIoZXhjZXB0aW9uX2FkZHIsIHNjcmF0Y2hfcmVnKTsKICAgYnJfbnVsbChzY3JhdGNoX3JlZyxmYWxzZSxwdCxMKTsKICAgZGVsYXllZCgpLT5ub3AoKTsKQEAgLTExODYsNyArMTE5MSw3IEBACiAKIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmdldF92bV9yZXN1bHQoUmVnaXN0ZXIgb29wX3Jlc3VsdCkgewogICB2ZXJpZnlfdGhyZWFkKCk7Ci0gIEFkZHJlc3Mgdm1fcmVzdWx0X2FkZHIoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjp2bV9yZXN1bHRfb2Zmc2V0KCkpKTsKKyAgQWRkcmVzcyB2bV9yZXN1bHRfYWRkcihHMl90aHJlYWQsIEphdmFUaHJlYWQ6OnZtX3Jlc3VsdF9vZmZzZXQoKSk7CiAgIGxkX3B0ciggICAgdm1fcmVzdWx0X2FkZHIsIG9vcF9yZXN1bHQpOwogICBzdF9wdHIoRzAsIHZtX3Jlc3VsdF9hZGRyKTsKICAgdmVyaWZ5X29vcChvb3BfcmVzdWx0KTsKQEAgLTExOTUsNyArMTIwMCw3IEBACiAKIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmdldF92bV9yZXN1bHRfMihSZWdpc3RlciBvb3BfcmVzdWx0KSB7CiAgIHZlcmlmeV90aHJlYWQoKTsKLSAgQWRkcmVzcyB2bV9yZXN1bHRfYWRkcl8yKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6dm1fcmVzdWx0XzJfb2Zmc2V0KCkpKTsKKyAgQWRkcmVzcyB2bV9yZXN1bHRfYWRkcl8yKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6dm1fcmVzdWx0XzJfb2Zmc2V0KCkpOwogICBsZF9wdHIodm1fcmVzdWx0X2FkZHJfMiwgb29wX3Jlc3VsdCk7CiAgIHN0X3B0cihHMCwgdm1fcmVzdWx0X2FkZHJfMik7CiAgIHZlcmlmeV9vb3Aob29wX3Jlc3VsdCk7CkBAIC0xMjA2LDcgKzEyMTEsNyBAQAogLy8gbGVhdmUgaXQgdW5kaXN0dXJiZWQuCiB2b2lkIE1hY3JvQXNzZW1ibGVyOjpzZXRfdm1fcmVzdWx0KFJlZ2lzdGVyIG9vcF9yZXN1bHQpIHsKICAgdmVyaWZ5X3RocmVhZCgpOwotICBBZGRyZXNzIHZtX3Jlc3VsdF9hZGRyKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6dm1fcmVzdWx0X29mZnNldCgpKSk7CisgIEFkZHJlc3Mgdm1fcmVzdWx0X2FkZHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjp2bV9yZXN1bHRfb2Zmc2V0KCkpOwogICB2ZXJpZnlfb29wKG9vcF9yZXN1bHQpOwogCiAjIGlmZGVmIEFTU0VSVApAQCAtMTIzNCw4MSArMTIzOSw3OCBAQAogI2Vsc2UKICAgc3JsKG9iaiwgQ2FyZFRhYmxlTW9kUmVmQlM6OmNhcmRfc2hpZnQsIG9iaik7CiAjZW5kaWYKLSAgYXNzZXJ0KCB0bXAgIT0gb2JqLCAibmVlZCBzZXBhcmF0ZSB0ZW1wIHJlZyIpOwotICBBZGRyZXNzIHJzKHRtcCwgKGFkZHJlc3MpYnl0ZV9tYXBfYmFzZSk7Ci0gIGxvYWRfYWRkcmVzcyhycyk7Ci0gIHN0YihHMCwgcnMuYmFzZSgpLCBvYmopOwotfQotCi0vLyAlJSUgTm90ZTogIFRoZSBmb2xsb3dpbmcgc2l4IGluc3RydWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQsCi0vLyAgICAgICAgICAgIHVuY2hhbmdlZCwgZnJvbSBhc3NlbWJsZXJfc3BhcmMuaW5saW5lLmhwcC4KLS8vICAgICAgICAgICAgVGhleSB3aWxsIGJlIHJlZmFjdG9yZWQgYXQgYSBsYXRlciBkYXRlLgotCi12b2lkIE1hY3JvQXNzZW1ibGVyOjpzZXRoaShpbnRwdHJfdCBpbW0yMmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvcmNlUmVsb2NhdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMpIHsKLSAgQWRkcmVzcyBhZHIoIGQsIChhZGRyZXNzKWltbTIyYSwgcnNwZWMgKTsKLSAgTWFjcm9Bc3NlbWJsZXI6OnNldGhpKCBhZHIsIEZvcmNlUmVsb2NhdGFibGUgKTsKKyAgYXNzZXJ0KHRtcCAhPSBvYmosICJuZWVkIHNlcGFyYXRlIHRlbXAgcmVnIik7CisgIHNldCgoYWRkcmVzcykgYnl0ZV9tYXBfYmFzZSwgdG1wKTsKKyAgc3RiKEcwLCB0bXAsIG9iaik7CiB9CiAKIAotdm9pZCBNYWNyb0Fzc2VtYmxlcjo6c2V0aGkoQWRkcmVzcyYgYSwgYm9vbCBGb3JjZVJlbG9jYXRhYmxlKSB7Cit2b2lkIE1hY3JvQXNzZW1ibGVyOjppbnRlcm5hbF9zZXRoaShjb25zdCBBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgZCwgYm9vbCBGb3JjZVJlbG9jYXRhYmxlKSB7CiAgIGFkZHJlc3Mgc2F2ZV9wYzsKICAgaW50IHNoaWZ0Y250OwotICAvLyBpZiBhZGRyIG9mIGxvY2FsLCBkbyBub3QgbmVlZCB0byBsb2FkIGl0Ci0gIGFzc2VydChhLmJhc2UoKSAhPSBGUCAgJiYgIGEuYmFzZSgpICE9IFNQLCAianVzdCB1c2UgbGQgb3Igc3QgZm9yIGxvY2FscyIpOwogI2lmZGVmIF9MUDY0CiAjIGlmZGVmIENIRUNLX0RFTEFZCi0gIGFzc2VydF9ub3RfZGVsYXllZCggKGNoYXIgKikiY2Fubm90IHB1dCB0d28gaW5zdHJ1Y3Rpb25zIGluIGRlbGF5IHNsb3QiICk7CisgIGFzc2VydF9ub3RfZGVsYXllZCgoY2hhciopICJjYW5ub3QgcHV0IHR3byBpbnN0cnVjdGlvbnMgaW4gZGVsYXkgc2xvdCIpOwogIyBlbmRpZgogICB2OV9kZXAoKTsKLS8vICBGb3JjZVJlbG9jYXRhYmxlID0gMTsKICAgc2F2ZV9wYyA9IHBjKCk7Ci0gIGlmIChhLmhpMzIoKSA9PSAwICYmIGEubG93MzIoKSA+PSAwKSB7Ci0gICAgQXNzZW1ibGVyOjpzZXRoaShhLmxvdzMyKCksIGEuYmFzZSgpLCBhLnJzcGVjKCkpOworCisgIGludCBtc2IzMiA9IChpbnQpIChhZGRybGl0LnZhbHVlKCkgPj4gMzIpOworICBpbnQgbHNiMzIgPSAoaW50KSAoYWRkcmxpdC52YWx1ZSgpKTsKKworICBpZiAobXNiMzIgPT0gMCAmJiBsc2IzMiA+PSAwKSB7CisgICAgQXNzZW1ibGVyOjpzZXRoaShsc2IzMiwgZCwgYWRkcmxpdC5yc3BlYygpKTsKICAgfQotICBlbHNlIGlmIChhLmhpMzIoKSA9PSAtMSkgewotICAgIEFzc2VtYmxlcjo6c2V0aGkofmEubG93MzIoKSwgYS5iYXNlKCksIGEucnNwZWMoKSk7Ci0gICAgeG9yMyhhLmJhc2UoKSwgfmxvdzEwKH4wKSwgYS5iYXNlKCkpOworICBlbHNlIGlmIChtc2IzMiA9PSAtMSkgeworICAgIEFzc2VtYmxlcjo6c2V0aGkofmxzYjMyLCBkLCBhZGRybGl0LnJzcGVjKCkpOworICAgIHhvcjMoZCwgfmxvdzEwKH4wKSwgZCk7CiAgIH0KICAgZWxzZSB7Ci0gICAgQXNzZW1ibGVyOjpzZXRoaShhLmhpMzIoKSwgYS5iYXNlKCksIGEucnNwZWMoKSApOyAgIC8vIDIyCi0gICAgaWYgKCBhLmhpMzIoKSAmIDB4M2ZmICkgICAgICAgICAgICAgICAgICAgICAvLyBBbnkgYml0cz8KLSAgICAgIG9yMyggYS5iYXNlKCksIGEuaGkzMigpICYgMHgzZmYgLGEuYmFzZSgpICk7IC8vIEhpZ2ggMzIgYml0cyBhcmUgbm93IGluIGxvdyAzMgotICAgIGlmICggYS5sb3czMigpICYgMHhGRkZGRkMwMCApIHsgICAgICAgICAgICAgLy8gZG9uZT8KLSAgICAgIGlmKCAoYS5sb3czMigpID4+IDIwKSAmIDB4ZmZmICkgeyAgICAgICAgIC8vIEFueSBiaXRzIHNldD8KLSAgICAgICAgc2xseChhLmJhc2UoKSwgMTIsIGEuYmFzZSgpKTsgICAgICAgICAgIC8vIE1ha2Ugcm9vbSBmb3IgbmV4dCAxMiBiaXRzCi0gICAgICAgIG9yMyggYS5iYXNlKCksIChhLmxvdzMyKCkgPj4gMjApICYgMHhmZmYsYS5iYXNlKCkgKTsgLy8gT3IgaW4gbmV4dCAxMgotICAgICAgICBzaGlmdGNudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBzaGlmdGVkCisgICAgQXNzZW1ibGVyOjpzZXRoaShtc2IzMiwgZCwgYWRkcmxpdC5yc3BlYygpKTsgIC8vIG1zYiAyMi1iaXRzCisgICAgaWYgKG1zYjMyICYgMHgzZmYpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBiaXRzPworICAgICAgb3IzKGQsIG1zYjMyICYgMHgzZmYsIGQpOyAgICAgICAgICAgICAgICAgICAvLyBtc2IgMzItYml0cyBhcmUgbm93IGluIGxzYiAzMgorICAgIGlmIChsc2IzMiAmIDB4RkZGRkZDMDApIHsgICAgICAgICAgICAgICAgICAgICAvLyBkb25lPworICAgICAgaWYgKChsc2IzMiA+PiAyMCkgJiAweGZmZikgeyAgICAgICAgICAgICAgICAvLyBBbnkgYml0cyBzZXQ/CisgICAgICAgIHNsbHgoZCwgMTIsIGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugcm9vbSBmb3IgbmV4dCAxMiBiaXRzCisgICAgICAgIG9yMyhkLCAobHNiMzIgPj4gMjApICYgMHhmZmYsIGQpOyAgICAgICAgIC8vIE9yIGluIG5leHQgMTIKKyAgICAgICAgc2hpZnRjbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBzaGlmdGVkCiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICAgIHNoaWZ0Y250ID0gMTI7Ci0gICAgICBpZiggKGEubG93MzIoKSA+PiAxMCkgJiAweDNmZiApIHsKLSAgICAgICAgc2xseChhLmJhc2UoKSwgc2hpZnRjbnQrMTAsIGEuYmFzZSgpKTsvLyBNYWtlIHJvb20gZm9yIGxhc3QgMTAgYml0cwotICAgICAgICBvcjMoIGEuYmFzZSgpLCAoYS5sb3czMigpID4+IDEwKSAmIDB4M2ZmLGEuYmFzZSgpICk7IC8vIE9yIGluIG5leHQgMTAKKyAgICAgIGlmICgobHNiMzIgPj4gMTApICYgMHgzZmYpIHsKKyAgICAgICAgc2xseChkLCBzaGlmdGNudCArIDEwLCBkKTsgICAgICAgICAgICAgICAgLy8gTWFrZSByb29tIGZvciBsYXN0IDEwIGJpdHMKKyAgICAgICAgb3IzKGQsIChsc2IzMiA+PiAxMCkgJiAweDNmZiwgZCk7ICAgICAgICAgLy8gT3IgaW4gbmV4dCAxMAogICAgICAgICBzaGlmdGNudCA9IDA7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICAgIHNoaWZ0Y250ID0gMTA7Ci0gICAgICBzbGx4KGEuYmFzZSgpLCBzaGlmdGNudCsxMCAsIGEuYmFzZSgpKTsgICAgICAgICAgIC8vIFNoaWZ0IGxlYXZpbmcgZGlzcCBmaWVsZCAwJ2QKKyAgICAgIHNsbHgoZCwgc2hpZnRjbnQgKyAxMCwgZCk7ICAgICAgICAgICAgICAgICAgLy8gU2hpZnQgbGVhdmluZyBkaXNwIGZpZWxkIDAnZAogICAgIH0KICAgICBlbHNlCi0gICAgICBzbGx4KCBhLmJhc2UoKSwgMzIsIGEuYmFzZSgpICk7CisgICAgICBzbGx4KGQsIDMyLCBkKTsKICAgfQotICAvLyBQYWQgb3V0IHRoZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBzbyBpdCBjYW4gYmUKLSAgLy8gcGF0Y2hlZCBsYXRlci4KLSAgaWYgKCBGb3JjZVJlbG9jYXRhYmxlIHx8IChhLnJ0eXBlKCkgIT0gcmVsb2NJbmZvOjpub25lICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5ydHlwZSgpICE9IHJlbG9jSW5mbzo6cnVudGltZV9jYWxsX3R5cGUpICkgewotICAgIHdoaWxlICggcGMoKSA8IChzYXZlX3BjICsgKDcgKiBCeXRlc1Blckluc3RXb3JkICkpICkKKyAgLy8gUGFkIG91dCB0aGUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugc28gaXQgY2FuIGJlIHBhdGNoZWQgbGF0ZXIuCisgIGlmIChGb3JjZVJlbG9jYXRhYmxlIHx8IChhZGRybGl0LnJ0eXBlKCkgIT0gcmVsb2NJbmZvOjpub25lICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRybGl0LnJ0eXBlKCkgIT0gcmVsb2NJbmZvOjpydW50aW1lX2NhbGxfdHlwZSkpIHsKKyAgICB3aGlsZSAocGMoKSA8IChzYXZlX3BjICsgKDcgKiBCeXRlc1Blckluc3RXb3JkKSkpCiAgICAgICBub3AoKTsKICAgfQogI2Vsc2UKLSAgQXNzZW1ibGVyOjpzZXRoaShhLmhpKCksIGEuYmFzZSgpLCBhLnJzcGVjKCkpOworICBBc3NlbWJsZXI6OnNldGhpKGFkZHJsaXQudmFsdWUoKSwgZCwgYWRkcmxpdC5yc3BlYygpKTsKICNlbmRpZgotCiB9CiAKKwordm9pZCBNYWNyb0Fzc2VtYmxlcjo6c2V0aGkoY29uc3QgQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIGQpIHsKKyAgaW50ZXJuYWxfc2V0aGkoYWRkcmxpdCwgZCwgZmFsc2UpOworfQorCisKK3ZvaWQgTWFjcm9Bc3NlbWJsZXI6OnBhdGNoYWJsZV9zZXRoaShjb25zdCBBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgZCkgeworICBpbnRlcm5hbF9zZXRoaShhZGRybGl0LCBkLCB0cnVlKTsKK30KKworCiBpbnQgTWFjcm9Bc3NlbWJsZXI6OnNpemVfb2Zfc2V0aGkoYWRkcmVzcyBhLCBib29sIHdvcnN0X2Nhc2UpIHsKICNpZmRlZiBfTFA2NAogICBpZiAod29yc3RfY2FzZSkgcmV0dXJuIDc7CkBAIC0xMzM5LDYxICsxMzQxLDUwIEBACiAgIHJldHVybiBzaXplX29mX3NldGhpKE5VTEwsIHRydWUpICsgMTsKIH0KIAotdm9pZCBNYWNyb0Fzc2VtYmxlcjo6c2V0KGludHB0cl90IHZhbHVlLCBSZWdpc3RlciBkLAotICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9jYXRpb25Ib2xkZXIgY29uc3QmIHJzcGVjKSB7Ci0gIEFkZHJlc3MgdmFsKCBkLCAoYWRkcmVzcyl2YWx1ZSwgcnNwZWMpOwogCi0gIGlmICggcnNwZWMudHlwZSgpID09IHJlbG9jSW5mbzo6bm9uZSApIHsKK3ZvaWQgTWFjcm9Bc3NlbWJsZXI6OmludGVybmFsX3NldChjb25zdCBBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgZCwgYm9vbCBGb3JjZVJlbG9jYXRhYmxlKSB7CisgIGludHB0cl90IHZhbHVlID0gYWRkcmxpdC52YWx1ZSgpOworCisgIGlmICghRm9yY2VSZWxvY2F0YWJsZSAmJiBhZGRybGl0LnJzcGVjKCkudHlwZSgpID09IHJlbG9jSW5mbzo6bm9uZSkgewogICAgIC8vIGNhbiBvcHRpbWl6ZQotICAgIGlmICgtNDA5NiA8PSB2YWx1ZSAgJiYgIHZhbHVlIDw9IDQwOTUpIHsKKyAgICBpZiAoLTQwOTYgPD0gdmFsdWUgJiYgdmFsdWUgPD0gNDA5NSkgewogICAgICAgb3IzKEcwLCB2YWx1ZSwgZCk7IC8vIHNldHN3ICh0aGlzIGxlYXZlcyB1cHBlciAzMiBiaXRzIHNpZ24tZXh0ZW5kZWQpCiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChpbnZfaGkyMihoaTIyKHZhbHVlKSkgPT0gdmFsdWUpIHsKLSAgICAgIHNldGhpKHZhbCk7CisgICAgICBzZXRoaShhZGRybGl0LCBkKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KLSAgYXNzZXJ0X25vdF9kZWxheWVkKCAoY2hhciAqKSJjYW5ub3QgcHV0IHR3byBpbnN0cnVjdGlvbnMgaW4gZGVsYXkgc2xvdCIgKTsKLSAgc2V0aGkoIHZhbCApOwotICBpZiAocnNwZWMudHlwZSgpICE9IHJlbG9jSW5mbzo6bm9uZSB8fCAodmFsdWUgJiAweDNmZikgIT0gMCkgewotICAgIGFkZCggZCwgdmFsdWUgJiAgMHgzZmYsIGQsIHJzcGVjKTsKKyAgYXNzZXJ0X25vdF9kZWxheWVkKChjaGFyKikgImNhbm5vdCBwdXQgdHdvIGluc3RydWN0aW9ucyBpbiBkZWxheSBzbG90Iik7CisgIGludGVybmFsX3NldGhpKGFkZHJsaXQsIGQsIEZvcmNlUmVsb2NhdGFibGUpOworICBpZiAoRm9yY2VSZWxvY2F0YWJsZSB8fCBhZGRybGl0LnJzcGVjKCkudHlwZSgpICE9IHJlbG9jSW5mbzo6bm9uZSB8fCBhZGRybGl0LmxvdzEwKCkgIT0gMCkgeworICAgIGFkZChkLCBhZGRybGl0LmxvdzEwKCksIGQsIGFkZHJsaXQucnNwZWMoKSk7CiAgIH0KIH0KIAotdm9pZCBNYWNyb0Fzc2VtYmxlcjo6c2V0c3coaW50IHZhbHVlLCBSZWdpc3RlciBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMpIHsKLSAgQWRkcmVzcyB2YWwoIGQsIChhZGRyZXNzKXZhbHVlLCByc3BlYyk7Ci0gIGlmICggcnNwZWMudHlwZSgpID09IHJlbG9jSW5mbzo6bm9uZSApIHsKLSAgICAvLyBjYW4gb3B0aW1pemUKLSAgICBpZiAoLTQwOTYgPD0gdmFsdWUgICYmICB2YWx1ZSA8PSA0MDk1KSB7Ci0gICAgICBvcjMoRzAsIHZhbHVlLCBkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGludl9oaTIyKGhpMjIodmFsdWUpKSA9PSB2YWx1ZSkgewotICAgICAgc2V0aGkoIHZhbCApOwotI2lmbmRlZiBfTFA2NAotICAgICAgaWYgKCB2YWx1ZSA8IDAgKSB7Ci0gICAgICAgIGFzc2VydF9ub3RfZGVsYXllZCgpOwotICAgICAgICBzcmEgKGQsIEcwLCBkKTsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBhc3NlcnRfbm90X2RlbGF5ZWQoKTsKLSAgc2V0aGkoIHZhbCApOwotICBhZGQoIGQsIHZhbHVlICYgIDB4M2ZmLCBkLCByc3BlYyk7Ci0KLSAgLy8gKEEgbmVnYXRpdmUgdmFsdWUgY291bGQgYmUgbG9hZGVkIGluIDIgaW5zbnMgd2l0aCBzZXRoaS94b3IsCi0gIC8vIGJ1dCBpdCB3b3VsZCB0YWtlIGEgbW9yZSBjb21wbGV4IHJlbG9jYXRpb24uKQotI2lmbmRlZiBfTFA2NAotICBpZiAoIHZhbHVlIDwgMCkKLSAgICBzcmEoZCwgRzAsIGQpOwotI2VuZGlmCit2b2lkIE1hY3JvQXNzZW1ibGVyOjpzZXQoY29uc3QgQWRkcmVzc0xpdGVyYWwmIGFsLCBSZWdpc3RlciBkKSB7CisgIGludGVybmFsX3NldChhbCwgZCwgZmFsc2UpOwogfQogCi0vLyAlJSUgRW5kIG9mIG1vdmVkIHNpeCBzZXQgaW5zdHJ1Y3Rpb25zLgordm9pZCBNYWNyb0Fzc2VtYmxlcjo6c2V0KGludHB0cl90IHZhbHVlLCBSZWdpc3RlciBkKSB7CisgIEFkZHJlc3NMaXRlcmFsIGFsKHZhbHVlKTsKKyAgaW50ZXJuYWxfc2V0KGFsLCBkLCBmYWxzZSk7Cit9CisKK3ZvaWQgTWFjcm9Bc3NlbWJsZXI6OnNldChhZGRyZXNzIGFkZHIsIFJlZ2lzdGVyIGQsIFJlbG9jYXRpb25Ib2xkZXIgY29uc3QmIHJzcGVjKSB7CisgIEFkZHJlc3NMaXRlcmFsIGFsKGFkZHIsIHJzcGVjKTsKKyAgaW50ZXJuYWxfc2V0KGFsLCBkLCBmYWxzZSk7Cit9CisKK3ZvaWQgTWFjcm9Bc3NlbWJsZXI6OnBhdGNoYWJsZV9zZXQoY29uc3QgQWRkcmVzc0xpdGVyYWwmIGFsLCBSZWdpc3RlciBkKSB7CisgIGludGVybmFsX3NldChhbCwgZCwgdHJ1ZSk7Cit9CisKK3ZvaWQgTWFjcm9Bc3NlbWJsZXI6OnBhdGNoYWJsZV9zZXQoaW50cHRyX3QgdmFsdWUsIFJlZ2lzdGVyIGQpIHsKKyAgQWRkcmVzc0xpdGVyYWwgYWwodmFsdWUpOworICBpbnRlcm5hbF9zZXQoYWwsIGQsIHRydWUpOworfQogCiAKIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnNldDY0KGpsb25nIHZhbHVlLCBSZWdpc3RlciBkLCBSZWdpc3RlciB0bXApIHsKQEAgLTE1MTIsMTcgKzE1MDMsMTcgQEAKIH0KIAogCi1BZGRyZXNzIE1hY3JvQXNzZW1ibGVyOjphbGxvY2F0ZV9vb3BfYWRkcmVzcyhqb2JqZWN0IG9iaiwgUmVnaXN0ZXIgZCkgeworQWRkcmVzc0xpdGVyYWwgTWFjcm9Bc3NlbWJsZXI6OmFsbG9jYXRlX29vcF9hZGRyZXNzKGpvYmplY3Qgb2JqKSB7CiAgIGFzc2VydChvb3BfcmVjb3JkZXIoKSAhPSBOVUxMLCAidGhpcyBhc3NlbWJsZXIgbmVlZHMgYW4gT29wUmVjb3JkZXIiKTsKICAgaW50IG9vcF9pbmRleCA9IG9vcF9yZWNvcmRlcigpLT5hbGxvY2F0ZV9pbmRleChvYmopOwotICByZXR1cm4gQWRkcmVzcyhkLCBhZGRyZXNzKG9iaiksIG9vcF9SZWxvY2F0aW9uOjpzcGVjKG9vcF9pbmRleCkpOworICByZXR1cm4gQWRkcmVzc0xpdGVyYWwob2JqLCBvb3BfUmVsb2NhdGlvbjo6c3BlYyhvb3BfaW5kZXgpKTsKIH0KIAogCi1BZGRyZXNzIE1hY3JvQXNzZW1ibGVyOjpjb25zdGFudF9vb3BfYWRkcmVzcyhqb2JqZWN0IG9iaiwgUmVnaXN0ZXIgZCkgeworQWRkcmVzc0xpdGVyYWwgTWFjcm9Bc3NlbWJsZXI6OmNvbnN0YW50X29vcF9hZGRyZXNzKGpvYmplY3Qgb2JqKSB7CiAgIGFzc2VydChvb3BfcmVjb3JkZXIoKSAhPSBOVUxMLCAidGhpcyBhc3NlbWJsZXIgbmVlZHMgYW4gT29wUmVjb3JkZXIiKTsKICAgaW50IG9vcF9pbmRleCA9IG9vcF9yZWNvcmRlcigpLT5maW5kX2luZGV4KG9iaik7Ci0gIHJldHVybiBBZGRyZXNzKGQsIGFkZHJlc3Mob2JqKSwgb29wX1JlbG9jYXRpb246OnNwZWMob29wX2luZGV4KSk7CisgIHJldHVybiBBZGRyZXNzTGl0ZXJhbChvYmosIG9vcF9SZWxvY2F0aW9uOjpzcGVjKG9vcF9pbmRleCkpOwogfQogCiB2b2lkICBNYWNyb0Fzc2VtYmxlcjo6c2V0X25hcnJvd19vb3Aoam9iamVjdCBvYmosIFJlZ2lzdGVyIGQpIHsKQEAgLTE2ODIsNyArMTY3Myw3IEBACiAgIHNwcmludGYocmVhbF9tc2csICIlcyVzKCVzOiVkKSIsIG1zZywgYnVmZmVyLCBmaWxlLCBsaW5lKTsKIAogICAvLyBDYWxsIGluZGlyZWN0bHkgdG8gc29sdmUgZ2VuZXJhdGlvbiBvcmRlcmluZyBwcm9ibGVtCi0gIEFkZHJlc3MgYShPNywgKGFkZHJlc3MpU3R1YlJvdXRpbmVzOjp2ZXJpZnlfb29wX3N1YnJvdXRpbmVfZW50cnlfYWRkcmVzcygpKTsKKyAgQWRkcmVzc0xpdGVyYWwgYShTdHViUm91dGluZXM6OnZlcmlmeV9vb3Bfc3Vicm91dGluZV9lbnRyeV9hZGRyZXNzKCkpOwogCiAgIC8vIE1ha2Ugc29tZSBzcGFjZSBvbiBzdGFjayBhYm92ZSB0aGUgY3VycmVudCByZWdpc3RlciB3aW5kb3cuCiAgIC8vIEVub3VnaCB0byBob2xkIDggNjQtYml0IHJlZ2lzdGVycy4KQEAgLTE3MTgsNyArMTcwOSw3IEBACiAgIHNwcmludGYocmVhbF9tc2csICIlcyBhdCBTUCslZCAoJXM6JWQpIiwgbXNnLCBhZGRyLmRpc3AoKSwgZmlsZSwgbGluZSk7CiAKICAgLy8gQ2FsbCBpbmRpcmVjdGx5IHRvIHNvbHZlIGdlbmVyYXRpb24gb3JkZXJpbmcgcHJvYmxlbQotICBBZGRyZXNzIGEoTzcsIChhZGRyZXNzKVN0dWJSb3V0aW5lczo6dmVyaWZ5X29vcF9zdWJyb3V0aW5lX2VudHJ5X2FkZHJlc3MoKSk7CisgIEFkZHJlc3NMaXRlcmFsIGEoU3R1YlJvdXRpbmVzOjp2ZXJpZnlfb29wX3N1YnJvdXRpbmVfZW50cnlfYWRkcmVzcygpKTsKIAogICAvLyBNYWtlIHNvbWUgc3BhY2Ugb24gc3RhY2sgYWJvdmUgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgd2luZG93LgogICAvLyBFbm91Z2ggdG8gaG9sZCA4IDY0LWJpdCByZWdpc3RlcnMuCkBAIC0xNzcyLDExICsxNzYzLDcgQEAKICAgeyAvLyBjb3VudCBudW1iZXIgb2YgdmVyaWZpZXMKICAgICBSZWdpc3RlciBPMl9hZHIgICA9IE8yOwogICAgIFJlZ2lzdGVyIE8zX2FjY3VtID0gTzM7Ci0gICAgQWRkcmVzcyBjb3VudF9hZGRyKCBPMl9hZHIsIChhZGRyZXNzKSBTdHViUm91dGluZXM6OnZlcmlmeV9vb3BfY291bnRfYWRkcigpICk7Ci0gICAgc2V0aGkoY291bnRfYWRkcik7Ci0gICAgbGQoY291bnRfYWRkciwgTzNfYWNjdW0pOwotICAgIGluYyhPM19hY2N1bSk7Ci0gICAgc3QoTzNfYWNjdW0sIGNvdW50X2FkZHIpOworICAgIGluY19jb3VudGVyKFN0dWJSb3V0aW5lczo6dmVyaWZ5X29vcF9jb3VudF9hZGRyKCksIE8yX2FkciwgTzNfYWNjdW0pOwogICB9CiAKICAgUmVnaXN0ZXIgTzJfbWFzayA9IE8yOwpAQCAtMTg3MCw4ICsxODU3LDggQEAKICAgYXNzZXJ0KFN0dWJSb3V0aW5lczo6U3BhcmM6OnN0b3Bfc3Vicm91dGluZV9lbnRyeV9hZGRyZXNzKCksICJoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQgeWV0Iik7CiAKICAgLy8gY2FsbCBpbmRpcmVjdGx5IHRvIHNvbHZlIGdlbmVyYXRpb24gb3JkZXJpbmcgcHJvYmxlbQotICBBZGRyZXNzIGEoTzUsIChhZGRyZXNzKVN0dWJSb3V0aW5lczo6U3BhcmM6OnN0b3Bfc3Vicm91dGluZV9lbnRyeV9hZGRyZXNzKCkpOwotICBsb2FkX3B0cl9jb250ZW50cyhhLCBPNSk7CisgIEFkZHJlc3NMaXRlcmFsIGFsKFN0dWJSb3V0aW5lczo6U3BhcmM6OnN0b3Bfc3Vicm91dGluZV9lbnRyeV9hZGRyZXNzKCkpOworICBsb2FkX3B0cl9jb250ZW50cyhhbCwgTzUpOwogICBqbXBsKE81LCAwLCBPNyk7CiAgIGRlbGF5ZWQoKS0+bm9wKCk7CiB9CkBAIC0xODkxLDcgKzE4NzgsNyBAQAogICAgIGFzc2VydChTdHViUm91dGluZXM6OlNwYXJjOjpzdG9wX3N1YnJvdXRpbmVfZW50cnlfYWRkcmVzcygpLCAiaGFzbid0IGJlZW4gZ2VuZXJhdGVkIHlldCIpOwogCiAgICAgLy8gY2FsbCBpbmRpcmVjdGx5IHRvIHNvbHZlIGdlbmVyYXRpb24gb3JkZXJpbmcgcHJvYmxlbQotICAgIEFkZHJlc3MgYShPNSwgKGFkZHJlc3MpU3R1YlJvdXRpbmVzOjpTcGFyYzo6c3RvcF9zdWJyb3V0aW5lX2VudHJ5X2FkZHJlc3MoKSk7CisgICAgQWRkcmVzc0xpdGVyYWwgYShTdHViUm91dGluZXM6OlNwYXJjOjpzdG9wX3N1YnJvdXRpbmVfZW50cnlfYWRkcmVzcygpKTsKICAgICBsb2FkX3B0cl9jb250ZW50cyhhLCBPNSk7CiAgICAgam1wbChPNSwgMCwgTzcpOwogICAgIGRlbGF5ZWQoKS0+bm9wKCk7CkBAIC0yMDAzLDcgKzE5OTAsNyBAQAogICBzdWJjYyggUnBhcmFtX3dvcmRzLCBBcmd1bWVudDo6bl9yZWdpc3Rlcl9wYXJhbWV0ZXJzLCBScmVzdWx0KTsgLy8gaG93IG1hbnkgbWVtIHdvcmRzPwogICBMYWJlbCBub19leHRyYXM7CiAgIGJyKCBuZWdhdGl2ZSwgdHJ1ZSwgcHQsIG5vX2V4dHJhcyApOyAvLyBpZiBuZWcsIGNsZWFyIHJlZwotICBkZWxheWVkKCktPnNldCggMCwgUnJlc3VsdCk7ICAgICAgICAgLy8gYW5udWxlZCwgc28gb25seSBpZiB0YWtlbgorICBkZWxheWVkKCktPnNldCgwLCBScmVzdWx0KTsgICAgICAgICAgLy8gYW5udWxlZCwgc28gb25seSBpZiB0YWtlbgogICBiaW5kKCBub19leHRyYXMgKTsKIH0KIApAQCAtMjYyMyw3ICsyNjEwLDcgQEAKICAgICByZXR1cm4gUmVnaXN0ZXJPckNvbnN0YW50KHZhbHVlICsgb2Zmc2V0KTsKIAogICAvLyBsb2FkIGluZGlyZWN0bHkgdG8gc29sdmUgZ2VuZXJhdGlvbiBvcmRlcmluZyBwcm9ibGVtCi0gIEFkZHJlc3MgYSh0bXAsIChhZGRyZXNzKSBkZWxheWVkX3ZhbHVlX2FkZHIpOworICBBZGRyZXNzTGl0ZXJhbCBhKGRlbGF5ZWRfdmFsdWVfYWRkcik7CiAgIGxvYWRfcHRyX2NvbnRlbnRzKGEsIHRtcCk7CiAKICNpZmRlZiBBU1NFUlQKQEAgLTMxMDcsMjEgKzMwOTQsMjEgQEAKICAgZGVsYXllZCgpLT5ub3AoKTsKIAogICBsb2FkX2tsYXNzKG9ial9yZWcsIHRlbXBfcmVnKTsKLSAgbGRfcHRyKEFkZHJlc3ModGVtcF9yZWcsIDAsIEtsYXNzOjpwcm90b3R5cGVfaGVhZGVyX29mZnNldF9pbl9ieXRlcygpICsga2xhc3NPb3BEZXNjOjprbGFzc19wYXJ0X29mZnNldF9pbl9ieXRlcygpKSwgdGVtcF9yZWcpOworICBsZF9wdHIoQWRkcmVzcyh0ZW1wX3JlZywgS2xhc3M6OnByb3RvdHlwZV9oZWFkZXJfb2Zmc2V0X2luX2J5dGVzKCkgKyBrbGFzc09vcERlc2M6OmtsYXNzX3BhcnRfb2Zmc2V0X2luX2J5dGVzKCkpLCB0ZW1wX3JlZyk7CiAgIG9yMyhHMl90aHJlYWQsIHRlbXBfcmVnLCB0ZW1wX3JlZyk7CiAgIHhvcjMobWFya19yZWcsIHRlbXBfcmVnLCB0ZW1wX3JlZyk7CiAgIGFuZGNjKHRlbXBfcmVnLCB+KChpbnQpIG1hcmtPb3BEZXNjOjphZ2VfbWFza19pbl9wbGFjZSksIHRlbXBfcmVnKTsKICAgaWYgKGNvdW50ZXJzICE9IE5VTEwpIHsKICAgICBjb25kX2luYyhBc3NlbWJsZXI6OmVxdWFsLCAoYWRkcmVzcykgY291bnRlcnMtPmJpYXNlZF9sb2NrX2VudHJ5X2NvdW50X2FkZHIoKSwgbWFya19yZWcsIHRlbXBfcmVnKTsKICAgICAvLyBSZWxvYWQgbWFya19yZWcgYXMgd2UgbWF5IG5lZWQgaXQgbGF0ZXIKLSAgICBsZF9wdHIoQWRkcmVzcyhvYmpfcmVnLCAwLCBvb3BEZXNjOjptYXJrX29mZnNldF9pbl9ieXRlcygpKSwgbWFya19yZWcpOworICAgIGxkX3B0cihBZGRyZXNzKG9ial9yZWcsIG9vcERlc2M6Om1hcmtfb2Zmc2V0X2luX2J5dGVzKCkpLCBtYXJrX3JlZyk7CiAgIH0KICAgYnJ4KEFzc2VtYmxlcjo6ZXF1YWwsIHRydWUsIEFzc2VtYmxlcjo6cHQsIGRvbmUpOwogICBkZWxheWVkKCktPm5vcCgpOwogCiAgIExhYmVsIHRyeV9yZXZva2VfYmlhczsKICAgTGFiZWwgdHJ5X3JlYmlhczsKLSAgQWRkcmVzcyBtYXJrX2FkZHIgPSBBZGRyZXNzKG9ial9yZWcsIDAsIG9vcERlc2M6Om1hcmtfb2Zmc2V0X2luX2J5dGVzKCkpOworICBBZGRyZXNzIG1hcmtfYWRkciA9IEFkZHJlc3Mob2JqX3JlZywgb29wRGVzYzo6bWFya19vZmZzZXRfaW5fYnl0ZXMoKSk7CiAgIGFzc2VydChtYXJrX2FkZHIuZGlzcCgpID09IDAsICJjYXMgbXVzdCB0YWtlIGEgemVybyBkaXNwbGFjZW1lbnQiKTsKIAogICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGUgaGVhZGVyIGhhcyB0aGUgYmlhcyBwYXR0ZXJuIGFuZApAQCAtMzE4NSw3ICszMTcyLDcgQEAKICAgLy8gRklYTUU6IGR1ZSB0byBhIGxhY2sgb2YgcmVnaXN0ZXJzIHdlIGN1cnJlbnRseSBibG93IGF3YXkgdGhlIGFnZQogICAvLyBiaXRzIGluIHRoaXMgc2l0dWF0aW9uLiBTaG91bGQgYXR0ZW1wdCB0byBwcmVzZXJ2ZSB0aGVtLgogICBsb2FkX2tsYXNzKG9ial9yZWcsIHRlbXBfcmVnKTsKLSAgbGRfcHRyKEFkZHJlc3ModGVtcF9yZWcsIDAsIEtsYXNzOjpwcm90b3R5cGVfaGVhZGVyX29mZnNldF9pbl9ieXRlcygpICsga2xhc3NPb3BEZXNjOjprbGFzc19wYXJ0X29mZnNldF9pbl9ieXRlcygpKSwgdGVtcF9yZWcpOworICBsZF9wdHIoQWRkcmVzcyh0ZW1wX3JlZywgS2xhc3M6OnByb3RvdHlwZV9oZWFkZXJfb2Zmc2V0X2luX2J5dGVzKCkgKyBrbGFzc09vcERlc2M6OmtsYXNzX3BhcnRfb2Zmc2V0X2luX2J5dGVzKCkpLCB0ZW1wX3JlZyk7CiAgIG9yMyhHMl90aHJlYWQsIHRlbXBfcmVnLCB0ZW1wX3JlZyk7CiAgIGNhc24obWFya19hZGRyLmJhc2UoKSwgbWFya19yZWcsIHRlbXBfcmVnKTsKICAgLy8gSWYgdGhlIGJpYXNpbmcgdG93YXJkIG91ciB0aHJlYWQgZmFpbGVkLCB0aGlzIG1lYW5zIHRoYXQKQEAgLTMyMTYsNyArMzIwMyw3IEBACiAgIC8vIEZJWE1FOiBkdWUgdG8gYSBsYWNrIG9mIHJlZ2lzdGVycyB3ZSBjdXJyZW50bHkgYmxvdyBhd2F5IHRoZSBhZ2UKICAgLy8gYml0cyBpbiB0aGlzIHNpdHVhdGlvbi4gU2hvdWxkIGF0dGVtcHQgdG8gcHJlc2VydmUgdGhlbS4KICAgbG9hZF9rbGFzcyhvYmpfcmVnLCB0ZW1wX3JlZyk7Ci0gIGxkX3B0cihBZGRyZXNzKHRlbXBfcmVnLCAwLCBLbGFzczo6cHJvdG90eXBlX2hlYWRlcl9vZmZzZXRfaW5fYnl0ZXMoKSArIGtsYXNzT29wRGVzYzo6a2xhc3NfcGFydF9vZmZzZXRfaW5fYnl0ZXMoKSksIHRlbXBfcmVnKTsKKyAgbGRfcHRyKEFkZHJlc3ModGVtcF9yZWcsIEtsYXNzOjpwcm90b3R5cGVfaGVhZGVyX29mZnNldF9pbl9ieXRlcygpICsga2xhc3NPb3BEZXNjOjprbGFzc19wYXJ0X29mZnNldF9pbl9ieXRlcygpKSwgdGVtcF9yZWcpOwogICBjYXNuKG1hcmtfYWRkci5iYXNlKCksIG1hcmtfcmVnLCB0ZW1wX3JlZyk7CiAgIC8vIEZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIENBUy1iYXNlZCBsb2NrLCBiZWNhdXNlIG5vIG1hdHRlciB3aGF0CiAgIC8vIHRoZSByZXN1bHQgb2YgdGhlIGFib3ZlIENBUywgc29tZSB0aHJlYWQgbXVzdCBoYXZlIHN1Y2NlZWRlZCBpbgpAQCAtMzI4Myw3ICszMjcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFJib3gsIFJlZ2lzdGVyIFJzY3JhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlhc2VkTG9ja2luZ0NvdW50ZXJzKiBjb3VudGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJ5X2JpYXMpIHsKLSAgIEFkZHJlc3MgbWFya19hZGRyKFJvb3AsIDAsIG9vcERlc2M6Om1hcmtfb2Zmc2V0X2luX2J5dGVzKCkpOworICAgQWRkcmVzcyBtYXJrX2FkZHIoUm9vcCwgb29wRGVzYzo6bWFya19vZmZzZXRfaW5fYnl0ZXMoKSk7CiAKICAgIHZlcmlmeV9vb3AoUm9vcCk7CiAgICBMYWJlbCBkb25lIDsKQEAgLTMzODYsNyArMzM3Myw3IEBACiAgICAgICAgICAvLyBJZiBtLT5vd25lciAhPSBudWxsIGdvdG8gSXNMb2NrZWQKICAgICAgICAgIC8vIFBlc3NpbWlzdGljIGZvcm06IFRlc3QtYW5kLUNBUyB2cyBDQVMKICAgICAgICAgIC8vIFRoZSBvcHRpbWlzdGljIGZvcm0gYXZvaWRzIFJUUy0+UlRPIGNhY2hlIGxpbmUgdXBncmFkZXMuCi0gICAgICAgICBsZF9wdHIgKEFkZHJlc3MgKFJtYXJrLCAwLCBPYmplY3RNb25pdG9yOjpvd25lcl9vZmZzZXRfaW5fYnl0ZXMoKS0yKSwgUnNjcmF0Y2gpIDsKKyAgICAgICAgIGxkX3B0ciAoUm1hcmssIE9iamVjdE1vbml0b3I6Om93bmVyX29mZnNldF9pbl9ieXRlcygpIC0gMiwgUnNjcmF0Y2gpOwogICAgICAgICAgYW5kY2MgIChSc2NyYXRjaCwgUnNjcmF0Y2gsIEcwKSA7CiAgICAgICAgICBicnggICAgKEFzc2VtYmxlcjo6bm90WmVybywgZmFsc2UsIEFzc2VtYmxlcjo6cG4sIGRvbmUpIDsKICAgICAgICAgIGRlbGF5ZWQoKS0+bm9wKCkgOwpAQCAtMzQ4Miw3ICszNDY5LDcgQEAKICAgICAgICAgIC8vIFRlc3QtYW5kLUNBUyB2cyBDQVMKICAgICAgICAgIC8vIFBlc3NpbWlzdGljIGZvcm0gYXZvaWRzIGZ1dGlsZSAoZG9vbWVkKSBDQVMgYXR0ZW1wdHMKICAgICAgICAgIC8vIFRoZSBvcHRpbWlzdGljIGZvcm0gYXZvaWRzIFJUUy0+UlRPIGNhY2hlIGxpbmUgdXBncmFkZXMuCi0gICAgICAgICBsZF9wdHIgKEFkZHJlc3MgKFJtYXJrLCAwLCBPYmplY3RNb25pdG9yOjpvd25lcl9vZmZzZXRfaW5fYnl0ZXMoKS0yKSwgUnNjcmF0Y2gpIDsKKyAgICAgICAgIGxkX3B0ciAoUm1hcmssIE9iamVjdE1vbml0b3I6Om93bmVyX29mZnNldF9pbl9ieXRlcygpIC0gMiwgUnNjcmF0Y2gpOwogICAgICAgICAgYW5kY2MgIChSc2NyYXRjaCwgUnNjcmF0Y2gsIEcwKSA7CiAgICAgICAgICBicnggICAgKEFzc2VtYmxlcjo6bm90WmVybywgZmFsc2UsIEFzc2VtYmxlcjo6cG4sIGRvbmUpIDsKICAgICAgICAgIGRlbGF5ZWQoKS0+bm9wKCkgOwpAQCAtMzUwOCw3ICszNDk1LDcgQEAKIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmNvbXBpbGVyX3VubG9ja19vYmplY3QoUmVnaXN0ZXIgUm9vcCwgUmVnaXN0ZXIgUm1hcmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFJib3gsIFJlZ2lzdGVyIFJzY3JhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRyeV9iaWFzKSB7Ci0gICBBZGRyZXNzIG1hcmtfYWRkcihSb29wLCAwLCBvb3BEZXNjOjptYXJrX29mZnNldF9pbl9ieXRlcygpKTsKKyAgIEFkZHJlc3MgbWFya19hZGRyKFJvb3AsIG9vcERlc2M6Om1hcmtfb2Zmc2V0X2luX2J5dGVzKCkpOwogCiAgICBMYWJlbCBkb25lIDsKIApAQCAtMzU2OCwxNCArMzU1NSwxNCBAQAogICAgLy8gTm90ZSB0aGF0IHdlIHVzZSAxLTAgbG9ja2luZyBieSBkZWZhdWx0IGZvciB0aGUgaW5mbGF0ZWQgY2FzZS4gIFdlCiAgICAvLyBjbG9zZSB0aGUgcmVzdWx0YW50IChhbmQgcmFyZSkgcmFjZSBieSBoYXZpbmcgY29udGVudGVkIHRocmVhZHMgaW4KICAgIC8vIG1vbml0b3JlbnRlciBwZXJpb2RpY2FsbHkgcG9sbCBfb3duZXIuCi0gICBsZF9wdHIgKEFkZHJlc3MoUm1hcmssIDAsIE9iamVjdE1vbml0b3I6Om93bmVyX29mZnNldF9pbl9ieXRlcygpLTIpLCBSc2NyYXRjaCkgOwotICAgbGRfcHRyIChBZGRyZXNzKFJtYXJrLCAwLCBPYmplY3RNb25pdG9yOjpyZWN1cnNpb25zX29mZnNldF9pbl9ieXRlcygpLTIpLCBSYm94KSA7CisgICBsZF9wdHIgKFJtYXJrLCBPYmplY3RNb25pdG9yOjpvd25lcl9vZmZzZXRfaW5fYnl0ZXMoKSAtIDIsIFJzY3JhdGNoKTsKKyAgIGxkX3B0ciAoUm1hcmssIE9iamVjdE1vbml0b3I6OnJlY3Vyc2lvbnNfb2Zmc2V0X2luX2J5dGVzKCkgLSAyLCBSYm94KTsKICAgIHhvcjMgICAoUnNjcmF0Y2gsIEcyX3RocmVhZCwgUnNjcmF0Y2gpIDsKICAgIG9yY2MgICAoUmJveCwgUnNjcmF0Y2gsIFJib3gpIDsKICAgIGJyeCAgICAoQXNzZW1ibGVyOjpub3RaZXJvLCBmYWxzZSwgQXNzZW1ibGVyOjpwbiwgZG9uZSkgOwogICAgZGVsYXllZCgpLT4KLSAgIGxkX3B0ciAoQWRkcmVzcyAoUm1hcmssIDAsIE9iamVjdE1vbml0b3I6OkVudHJ5TGlzdF9vZmZzZXRfaW5fYnl0ZXMoKS0yKSwgUnNjcmF0Y2gpIDsKLSAgIGxkX3B0ciAoQWRkcmVzcyAoUm1hcmssIDAsIE9iamVjdE1vbml0b3I6OmN4cV9vZmZzZXRfaW5fYnl0ZXMoKS0yKSwgUmJveCkgOworICAgbGRfcHRyIChSbWFyaywgT2JqZWN0TW9uaXRvcjo6RW50cnlMaXN0X29mZnNldF9pbl9ieXRlcygpIC0gMiwgUnNjcmF0Y2gpOworICAgbGRfcHRyIChSbWFyaywgT2JqZWN0TW9uaXRvcjo6Y3hxX29mZnNldF9pbl9ieXRlcygpIC0gMiwgUmJveCk7CiAgICBvcmNjICAgKFJib3gsIFJzY3JhdGNoLCBHMCkgOwogICAgaWYgKEVtaXRTeW5jICYgNjU1MzYpIHsKICAgICAgIExhYmVsIExTdWNjIDsKQEAgLTM1ODMsMTIgKzM1NzAsMTIgQEAKICAgICAgIGRlbGF5ZWQoKS0+bm9wKCkgOwogICAgICAgYnIgICAgIChBc3NlbWJsZXI6OmFsd2F5cywgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIGRvbmUpIDsKICAgICAgIGRlbGF5ZWQoKS0+Ci0gICAgICBzdF9wdHIgKEcwLCBBZGRyZXNzIChSbWFyaywgMCwgT2JqZWN0TW9uaXRvcjo6b3duZXJfb2Zmc2V0X2luX2J5dGVzKCktMikpIDsKKyAgICAgIHN0X3B0ciAoRzAsIFJtYXJrLCBPYmplY3RNb25pdG9yOjpvd25lcl9vZmZzZXRfaW5fYnl0ZXMoKSAtIDIpOwogCiAgICAgICBiaW5kICAgKExTdWNjKSA7Ci0gICAgICBzdF9wdHIgKEcwLCBBZGRyZXNzIChSbWFyaywgMCwgT2JqZWN0TW9uaXRvcjo6b3duZXJfb2Zmc2V0X2luX2J5dGVzKCktMikpIDsKKyAgICAgIHN0X3B0ciAoRzAsIFJtYXJrLCBPYmplY3RNb25pdG9yOjpvd25lcl9vZmZzZXRfaW5fYnl0ZXMoKSAtIDIpOwogICAgICAgaWYgKG9zOjppc19NUCgpKSB7IG1lbWJhciAoU3RvcmVMb2FkKSA7IH0KLSAgICAgIGxkX3B0ciAoQWRkcmVzcyAoUm1hcmssIDAsIE9iamVjdE1vbml0b3I6OnN1Y2Nfb2Zmc2V0X2luX2J5dGVzKCktMiksIFJzY3JhdGNoKSA7CisgICAgICBsZF9wdHIgKFJtYXJrLCBPYmplY3RNb25pdG9yOjpzdWNjX29mZnNldF9pbl9ieXRlcygpIC0gMiwgUnNjcmF0Y2gpOwogICAgICAgYW5kY2MgIChSc2NyYXRjaCwgUnNjcmF0Y2gsIEcwKSA7CiAgICAgICBicnggICAgKEFzc2VtYmxlcjo6bm90WmVybywgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIGRvbmUpIDsKICAgICAgIGRlbGF5ZWQoKS0+IGFuZGNjIChHMCwgRzAsIEcwKSA7CkBAIC0zNjA2LDcgKzM1OTMsNyBAQAogICAgICAgZGVsYXllZCgpLT5ub3AoKSA7CiAgICAgICBiciAgICAgKEFzc2VtYmxlcjo6YWx3YXlzLCBmYWxzZSwgQXNzZW1ibGVyOjpwdCwgZG9uZSkgOwogICAgICAgZGVsYXllZCgpLT4KLSAgICAgIHN0X3B0ciAoRzAsIEFkZHJlc3MgKFJtYXJrLCAwLCBPYmplY3RNb25pdG9yOjpvd25lcl9vZmZzZXRfaW5fYnl0ZXMoKS0yKSkgOworICAgICAgc3RfcHRyIChHMCwgUm1hcmssIE9iamVjdE1vbml0b3I6Om93bmVyX29mZnNldF9pbl9ieXRlcygpIC0gMik7CiAgICB9CiAKICAgIGJpbmQgICAoTFN0YWNrZWQpIDsKQEAgLTQwMDUsMjAgKzM5OTIsMjYgQEAKICAgYmluZChMKTsKIH0KIAotdm9pZCBNYWNyb0Fzc2VtYmxlcjo6aW5jX2NvdW50ZXIoYWRkcmVzcyBjb3VudGVyX3B0ciwgUmVnaXN0ZXIgUnRtcDEsIFJlZ2lzdGVyIFJ0bXAyKSB7Ci0gIEFkZHJlc3MgY291bnRlcl9hZGRyKFJ0bXAxLCBjb3VudGVyX3B0cik7Ci0gIGxvYWRfY29udGVudHMoY291bnRlcl9hZGRyLCBSdG1wMik7Cit2b2lkIE1hY3JvQXNzZW1ibGVyOjppbmNfY291bnRlcihhZGRyZXNzIGNvdW50ZXJfYWRkciwgUmVnaXN0ZXIgUnRtcDEsIFJlZ2lzdGVyIFJ0bXAyKSB7CisgIEFkZHJlc3NMaXRlcmFsIGFkZHJsaXQoY291bnRlcl9hZGRyKTsKKyAgc2V0aGkoYWRkcmxpdCwgUnRtcDEpOyAgICAgICAgICAgICAgICAgLy8gTW92ZSBoaTIyIGJpdHMgaW50byB0ZW1wb3JhcnkgcmVnaXN0ZXIuCisgIEFkZHJlc3MgYWRkcihSdG1wMSwgYWRkcmxpdC5sb3cxMCgpKTsgIC8vIEJ1aWxkIGFuIGFkZHJlc3Mgd2l0aCBsb3cxMCBiaXRzLgorICBsZChhZGRyLCBSdG1wMik7CiAgIGluYyhSdG1wMik7Ci0gIHN0b3JlX2NvbnRlbnRzKFJ0bXAyLCBjb3VudGVyX2FkZHIpOworICBzdChSdG1wMiwgYWRkcik7Cit9CisKK3ZvaWQgTWFjcm9Bc3NlbWJsZXI6OmluY19jb3VudGVyKGludCogY291bnRlcl9hZGRyLCBSZWdpc3RlciBSdG1wMSwgUmVnaXN0ZXIgUnRtcDIpIHsKKyAgaW5jX2NvdW50ZXIoKGFkZHJlc3MpIGNvdW50ZXJfYWRkciwgUnRtcDEsIFJ0bXAyKTsKIH0KIAogU2tpcElmRXF1YWw6OlNraXBJZkVxdWFsKAogICAgIE1hY3JvQXNzZW1ibGVyKiBtYXNtLCBSZWdpc3RlciB0ZW1wLCBjb25zdCBib29sKiBmbGFnX2FkZHIsCiAgICAgQXNzZW1ibGVyOjpDb25kaXRpb24gY29uZGl0aW9uKSB7CiAgIF9tYXNtID0gbWFzbTsKLSAgQWRkcmVzcyBmbGFnKHRlbXAsIChhZGRyZXNzKWZsYWdfYWRkciwgcmVsb2NJbmZvOjpub25lKTsKLSAgX21hc20tPnNldGhpKGZsYWcpOwotICBfbWFzbS0+bGR1YihmbGFnLCB0ZW1wKTsKKyAgQWRkcmVzc0xpdGVyYWwgZmxhZyhmbGFnX2FkZHIpOworICBfbWFzbS0+c2V0aGkoZmxhZywgdGVtcCk7CisgIF9tYXNtLT5sZHViKHRlbXAsIGZsYWcubG93MTAoKSwgdGVtcCk7CiAgIF9tYXNtLT50c3QodGVtcCk7CiAgIF9tYXNtLT5icihjb25kaXRpb24sIGZhbHNlLCBBc3NlbWJsZXI6OnB0LCBfbGFiZWwpOwogICBfbWFzbS0+ZGVsYXllZCgpLT5ub3AoKTsKQEAgLTQzMzMsOCArNDMyNiw4IEBACiAjZWxzZQogICBtYXNtLnNybChPMCwgQ2FyZFRhYmxlTW9kUmVmQlM6OmNhcmRfc2hpZnQsIE8wKTsKICNlbmRpZgotICBBZGRyZXNzIHJzKE8xLCAoYWRkcmVzcylieXRlX21hcF9iYXNlKTsKLSAgbWFzbS5sb2FkX2FkZHJlc3MocnMpOyAvLyBPMSA6PSA8Y2FyZCB0YWJsZSBiYXNlPgorICBBZGRyZXNzTGl0ZXJhbCBhZGRybGl0KGJ5dGVfbWFwX2Jhc2UpOworICBtYXNtLnNldChhZGRybGl0LCBPMSk7IC8vIE8xIDo9IDxjYXJkIHRhYmxlIGJhc2U+CiAgIG1hc20ubGR1YihPMCwgTzEsIE8yKTsgLy8gTzIgOj0gW08wICsgTzFdCiAKICAgbWFzbS5icl9vbl9yZWdfY29uZChBc3NlbWJsZXI6OnJjX256LCAvKmFubnVsKi9mYWxzZSwgQXNzZW1ibGVyOjpwdCwKQEAgLTQ0OTQsMTAgKzQ0ODcsOSBAQAogI2Vsc2UKICAgICBwb3N0X2ZpbHRlcl9tYXNtLT5zcmwoc3RvcmVfYWRkciwgQ2FyZFRhYmxlTW9kUmVmQlM6OmNhcmRfc2hpZnQsIHN0b3JlX2FkZHIpOwogI2VuZGlmCi0gICAgYXNzZXJ0KCB0bXAgIT0gc3RvcmVfYWRkciwgIm5lZWQgc2VwYXJhdGUgdGVtcCByZWciKTsKLSAgICBBZGRyZXNzIHJzKHRtcCwgKGFkZHJlc3MpYnMtPmJ5dGVfbWFwX2Jhc2UpOwotICAgIGxvYWRfYWRkcmVzcyhycyk7Ci0gICAgc3RiKEcwLCBycy5iYXNlKCksIHN0b3JlX2FkZHIpOworICAgIGFzc2VydCh0bXAgIT0gc3RvcmVfYWRkciwgIm5lZWQgc2VwYXJhdGUgdGVtcCByZWciKTsKKyAgICBzZXQoYnMtPmJ5dGVfbWFwX2Jhc2UsIHRtcCk7CisgICAgc3RiKEcwLCB0bXAsIHN0b3JlX2FkZHIpOwogICB9CiAKICAgYmluZChmaWx0ZXJlZCk7CkBAIC00NTE2LDI0ICs0NTA4LDYgQEAKICAgY2FyZF90YWJsZV93cml0ZShicy0+Ynl0ZV9tYXBfYmFzZSwgdG1wLCBzdG9yZV9hZGRyKTsKIH0KIAotLy8gTG9hZGluZyB2YWx1ZXMgYnkgc2l6ZSBhbmQgc2lnbmVkLW5lc3MKLXZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxvYWRfc2l6ZWRfdmFsdWUoUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfaW5fYnl0ZXMsIGJvb2wgaXNfc2lnbmVkKSB7Ci0gIHN3aXRjaCAoc2l6ZV9pbl9ieXRlcyBeIChpc19zaWduZWQgPyAtMSA6IDApKSB7Ci0gIGNhc2Ugfjg6ICAvLyBmYWxsIHRocm91Z2g6Ci0gIGNhc2UgIDg6ICBsZF9sb25nKCBzMSwgczIsIGQgKTsgYnJlYWs7Ci0gIGNhc2UgfjQ6ICBsZHN3KCAgICBzMSwgczIsIGQgKTsgYnJlYWs7Ci0gIGNhc2UgIDQ6ICBsZHV3KCAgICBzMSwgczIsIGQgKTsgYnJlYWs7Ci0gIGNhc2UgfjI6ICBsZHNoKCAgICBzMSwgczIsIGQgKTsgYnJlYWs7Ci0gIGNhc2UgIDI6ICBsZHVoKCAgICBzMSwgczIsIGQgKTsgYnJlYWs7Ci0gIGNhc2UgfjE6ICBsZHNiKCAgICBzMSwgczIsIGQgKTsgYnJlYWs7Ci0gIGNhc2UgIDE6ICBsZHViKCAgICBzMSwgczIsIGQgKTsgYnJlYWs7Ci0gIGRlZmF1bHQ6ICBTaG91bGROb3RSZWFjaEhlcmUoKTsKLSAgfQotfQotCi0KLQogdm9pZCBNYWNyb0Fzc2VtYmxlcjo6bG9hZF9rbGFzcyhSZWdpc3RlciBzcmNfb29wLCBSZWdpc3RlciBrbGFzcykgewogICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgY29kZSBpcyB1c2VkIGJ5CiAgIC8vIE1hY2hDYWxsRHluYW1pY0phdmFOb2RlOjpyZXRfYWRkcl9vZmZzZXQoKQpAQCAtNDU2MywxMiArNDUzNywxMiBAQAogICB9CiB9CiAKLXZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxvYWRfaGVhcF9vb3AoY29uc3QgQWRkcmVzcyYgcywgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCkgewordm9pZCBNYWNyb0Fzc2VtYmxlcjo6bG9hZF9oZWFwX29vcChjb25zdCBBZGRyZXNzJiBzLCBSZWdpc3RlciBkKSB7CiAgIGlmIChVc2VDb21wcmVzc2VkT29wcykgewotICAgIGxkdXcocywgZCwgb2Zmc2V0KTsKKyAgICBsZHV3KHMsIGQpOwogICAgIGRlY29kZV9oZWFwX29vcChkKTsKICAgfSBlbHNlIHsKLSAgICBsZF9wdHIocywgZCwgb2Zmc2V0KTsKKyAgICBsZF9wdHIocywgZCk7CiAgIH0KIH0KIApAQCAtNDcxNCw3ICs0Njg4LDcgQEAKIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnJlaW5pdF9oZWFwYmFzZSgpIHsKICAgaWYgKFVzZUNvbXByZXNzZWRPb3BzKSB7CiAgICAgLy8gY2FsbCBpbmRpcmVjdGx5IHRvIHNvbHZlIGdlbmVyYXRpb24gb3JkZXJpbmcgcHJvYmxlbQotICAgIEFkZHJlc3MgYmFzZShHNl9oZWFwYmFzZSwgKGFkZHJlc3MpVW5pdmVyc2U6Om5hcnJvd19vb3BfYmFzZV9hZGRyKCkpOworICAgIEFkZHJlc3NMaXRlcmFsIGJhc2UoVW5pdmVyc2U6Om5hcnJvd19vb3BfYmFzZV9hZGRyKCkpOwogICAgIGxvYWRfcHRyX2NvbnRlbnRzKGJhc2UsIEc2X2hlYXBiYXNlKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2Fzc2VtYmxlcl9zcGFyYy5ocHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYXNzZW1ibGVyX3NwYXJjLmhwcAppbmRleCBjZmQ5MzU5Li5jZDUzOGFkIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYXNzZW1ibGVyX3NwYXJjLmhwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYXNzZW1ibGVyX3NwYXJjLmhwcApAQCAtMjc0LDIxICsyNzQsOTAgQEAKIAogY2xhc3MgQWRkcmVzcyBWQUxVRV9PQkpfQ0xBU1NfU1BFQyB7CiAgcHJpdmF0ZToKLSAgUmVnaXN0ZXIgICAgICAgICAgICAgIF9iYXNlOwotI2lmZGVmIF9MUDY0Ci0gIGludCAgICAgICAgICAgICAgICAgICBfaGkzMjsgICAgICAgICAgLy8gYml0cyA2Mzo6MzIKLSAgaW50ICAgICAgICAgICAgICAgICAgIF9sb3czMjsgICAgICAgICAvLyBiaXRzIDMxOjowCi0jZW5kaWYKLSAgaW50ICAgICAgICAgICAgICAgICAgIF9oaTsKLSAgaW50ICAgICAgICAgICAgICAgICAgIF9kaXNwOwotICBSZWxvY2F0aW9uSG9sZGVyICAgICAgX3JzcGVjOworICBSZWdpc3RlciAgICAgICAgICAgX2Jhc2U7ICAgICAgICAgICAvLyBCYXNlIHJlZ2lzdGVyLgorICBSZWdpc3Rlck9yQ29uc3RhbnQgX2luZGV4X29yX2Rpc3A7ICAvLyBJbmRleCByZWdpc3RlciBvciBjb25zdGFudCBkaXNwbGFjZW1lbnQuCisgIFJlbG9jYXRpb25Ib2xkZXIgICBfcnNwZWM7CiAKLSAgUmVsb2NhdGlvbkhvbGRlciByc3BlY19mcm9tX3J0eXBlKHJlbG9jSW5mbzo6cmVsb2NUeXBlIHJ0LCBhZGRyZXNzIGEgPSBOVUxMKSB7Ci0gICAgc3dpdGNoIChydCkgeworIHB1YmxpYzoKKyAgQWRkcmVzcygpIDogX2Jhc2Uobm9yZWcpLCBfaW5kZXhfb3JfZGlzcChub3JlZykge30KKworICBBZGRyZXNzKFJlZ2lzdGVyIGJhc2UsIFJlZ2lzdGVyT3JDb25zdGFudCBpbmRleF9vcl9kaXNwKQorICAgIDogX2Jhc2UoYmFzZSksCisgICAgICBfaW5kZXhfb3JfZGlzcChpbmRleF9vcl9kaXNwKSB7CisgIH0KKworICBBZGRyZXNzKFJlZ2lzdGVyIGJhc2UsIFJlZ2lzdGVyIGluZGV4KQorICAgIDogX2Jhc2UoYmFzZSksCisgICAgICBfaW5kZXhfb3JfZGlzcChpbmRleCkgeworICB9CisKKyAgQWRkcmVzcyhSZWdpc3RlciBiYXNlLCBpbnQgZGlzcCkKKyAgICA6IF9iYXNlKGJhc2UpLAorICAgICAgX2luZGV4X29yX2Rpc3AoZGlzcCkgeworICB9CisKKyNpZmRlZiBBU1NFUlQKKyAgLy8gQnl0ZVNpemUgaXMgb25seSBhIGNsYXNzIHdoZW4gQVNTRVJUIGlzIGRlZmluZWQsIG90aGVyd2lzZSBpdCdzIGFuIGludC4KKyAgQWRkcmVzcyhSZWdpc3RlciBiYXNlLCBCeXRlU2l6ZSBkaXNwKQorICAgIDogX2Jhc2UoYmFzZSksCisgICAgICBfaW5kZXhfb3JfZGlzcChpbl9ieXRlcyhkaXNwKSkgeworICB9CisjZW5kaWYKKworICAvLyBhY2Nlc3NvcnMKKyAgUmVnaXN0ZXIgYmFzZSgpICAgICAgY29uc3QgeyByZXR1cm4gX2Jhc2U7IH0KKyAgUmVnaXN0ZXIgaW5kZXgoKSAgICAgY29uc3QgeyByZXR1cm4gX2luZGV4X29yX2Rpc3AuYXNfcmVnaXN0ZXIoKTsgfQorICBpbnQgICAgICBkaXNwKCkgICAgICBjb25zdCB7IHJldHVybiBfaW5kZXhfb3JfZGlzcC5hc19jb25zdGFudCgpOyB9CisKKyAgYm9vbCAgICAgaGFzX2luZGV4KCkgY29uc3QgeyByZXR1cm4gX2luZGV4X29yX2Rpc3AuaXNfcmVnaXN0ZXIoKTsgfQorICBib29sICAgICBoYXNfZGlzcCgpICBjb25zdCB7IHJldHVybiBfaW5kZXhfb3JfZGlzcC5pc19jb25zdGFudCgpOyB9CisKKyAgY29uc3QgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnR5cGUoKSB7IHJldHVybiBfcnNwZWMudHlwZSgpOyB9CisgIGNvbnN0IFJlbG9jYXRpb25Ib2xkZXImICAgIHJzcGVjKCkgeyByZXR1cm4gX3JzcGVjOyB9CisKKyAgUmVsb2NhdGlvbkhvbGRlciByc3BlYyhpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIG9mZnNldCA9PSAwID8gX3JzcGVjIDogX3JzcGVjLnBsdXMob2Zmc2V0KTsKKyAgfQorCisgIGlubGluZSBib29sIGlzX3NpbW0xMyhpbnQgb2Zmc2V0ID0gMCk7ICAvLyBjaGVjayBkaXNwK29mZnNldCBmb3Igb3ZlcmZsb3cKKworICBBZGRyZXNzIHBsdXNfZGlzcChpbnQgcGx1c2Rpc3ApIGNvbnN0IHsgICAgIC8vIGJ1bXAgZGlzcCBieSBhIHNtYWxsIGFtb3VudAorICAgIGFzc2VydChfaW5kZXhfb3JfZGlzcC5pc19jb25zdGFudCgpLCAibXVzdCBoYXZlIGEgZGlzcGxhY2VtZW50Iik7CisgICAgQWRkcmVzcyBhKGJhc2UoKSwgZGlzcCgpICsgcGx1c2Rpc3ApOworICAgIHJldHVybiBhOworICB9CisKKyAgQWRkcmVzcyBhZnRlcl9zYXZlKCkgY29uc3QgeworICAgIEFkZHJlc3MgYSA9ICgqdGhpcyk7CisgICAgYS5fYmFzZSA9IGEuX2Jhc2UtPmFmdGVyX3NhdmUoKTsKKyAgICByZXR1cm4gYTsKKyAgfQorCisgIEFkZHJlc3MgYWZ0ZXJfcmVzdG9yZSgpIGNvbnN0IHsKKyAgICBBZGRyZXNzIGEgPSAoKnRoaXMpOworICAgIGEuX2Jhc2UgPSBhLl9iYXNlLT5hZnRlcl9yZXN0b3JlKCk7CisgICAgcmV0dXJuIGE7CisgIH0KKworICAvLyBDb252ZXJ0IHRoZSByYXcgZW5jb2RpbmcgZm9ybSBpbnRvIHRoZSBmb3JtIGV4cGVjdGVkIGJ5IHRoZQorICAvLyBjb25zdHJ1Y3RvciBmb3IgQWRkcmVzcy4KKyAgc3RhdGljIEFkZHJlc3MgbWFrZV9yYXcoaW50IGJhc2UsIGludCBpbmRleCwgaW50IHNjYWxlLCBpbnQgZGlzcCwgYm9vbCBkaXNwX2lzX29vcCk7CisKKyAgZnJpZW5kIGNsYXNzIEFzc2VtYmxlcjsKK307CisKKworY2xhc3MgQWRkcmVzc0xpdGVyYWwgVkFMVUVfT0JKX0NMQVNTX1NQRUMgeworIHByaXZhdGU6CisgIGFkZHJlc3MgICAgICAgICAgX2FkZHJlc3M7CisgIFJlbG9jYXRpb25Ib2xkZXIgX3JzcGVjOworCisgIFJlbG9jYXRpb25Ib2xkZXIgcnNwZWNfZnJvbV9ydHlwZShyZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSwgYWRkcmVzcyBhZGRyKSB7CisgICAgc3dpdGNoIChydHlwZSkgewogICAgIGNhc2UgcmVsb2NJbmZvOjpleHRlcm5hbF93b3JkX3R5cGU6Ci0gICAgICByZXR1cm4gZXh0ZXJuYWxfd29yZF9SZWxvY2F0aW9uOjpzcGVjKGEpOworICAgICAgcmV0dXJuIGV4dGVybmFsX3dvcmRfUmVsb2NhdGlvbjo6c3BlYyhhZGRyKTsKICAgICBjYXNlIHJlbG9jSW5mbzo6aW50ZXJuYWxfd29yZF90eXBlOgotICAgICAgcmV0dXJuIGludGVybmFsX3dvcmRfUmVsb2NhdGlvbjo6c3BlYyhhKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbF93b3JkX1JlbG9jYXRpb246OnNwZWMoYWRkcik7CiAjaWZkZWYgX0xQNjQKICAgICBjYXNlIHJlbG9jSW5mbzo6b3B0X3ZpcnR1YWxfY2FsbF90eXBlOgogICAgICAgcmV0dXJuIG9wdF92aXJ0dWFsX2NhbGxfUmVsb2NhdGlvbjo6c3BlYygpOwpAQCAtMzA1LDEyNyArMzc0LDg2IEBACiAgICAgfQogICB9CiAKKyBwcm90ZWN0ZWQ6CisgIC8vIGNyZWF0aW9uCisgIEFkZHJlc3NMaXRlcmFsKCkgOiBfYWRkcmVzcyhOVUxMKSwgX3JzcGVjKE5VTEwpIHt9CisKICBwdWJsaWM6Ci0gIEFkZHJlc3MoUmVnaXN0ZXIgYiwgYWRkcmVzcyBhLCByZWxvY0luZm86OnJlbG9jVHlwZSBydCA9IHJlbG9jSW5mbzo6bm9uZSkKLSAgICA6IF9yc3BlYyhyc3BlY19mcm9tX3J0eXBlKHJ0LCBhKSkKLSAgewotICAgIF9iYXNlICA9IGI7CisgIEFkZHJlc3NMaXRlcmFsKGFkZHJlc3MgYWRkciwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMpCisgICAgOiBfYWRkcmVzcyhhZGRyKSwKKyAgICAgIF9yc3BlYyhyc3BlYykge30KKworICAvLyBTb21lIGNvbnN0cnVjdG9ycyB0byBhdm9pZCBjYXN0aW5nIGF0IHRoZSBjYWxsIHNpdGUuCisgIEFkZHJlc3NMaXRlcmFsKGpvYmplY3Qgb2JqLCBSZWxvY2F0aW9uSG9sZGVyIGNvbnN0JiByc3BlYykKKyAgICA6IF9hZGRyZXNzKChhZGRyZXNzKSBvYmopLAorICAgICAgX3JzcGVjKHJzcGVjKSB7fQorCisgIEFkZHJlc3NMaXRlcmFsKGludHB0cl90IHZhbHVlLCBSZWxvY2F0aW9uSG9sZGVyIGNvbnN0JiByc3BlYykKKyAgICA6IF9hZGRyZXNzKChhZGRyZXNzKSB2YWx1ZSksCisgICAgICBfcnNwZWMocnNwZWMpIHt9CisKKyAgQWRkcmVzc0xpdGVyYWwoYWRkcmVzcyBhZGRyLCByZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSA9IHJlbG9jSW5mbzo6bm9uZSkKKyAgICA6IF9hZGRyZXNzKChhZGRyZXNzKSBhZGRyKSwKKyAgICBfcnNwZWMocnNwZWNfZnJvbV9ydHlwZShydHlwZSwgKGFkZHJlc3MpIGFkZHIpKSB7fQorCisgIC8vIFNvbWUgY29uc3RydWN0b3JzIHRvIGF2b2lkIGNhc3RpbmcgYXQgdGhlIGNhbGwgc2l0ZS4KKyAgQWRkcmVzc0xpdGVyYWwoYWRkcmVzcyogYWRkciwgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnR5cGUgPSByZWxvY0luZm86Om5vbmUpCisgICAgOiBfYWRkcmVzcygoYWRkcmVzcykgYWRkciksCisgICAgX3JzcGVjKHJzcGVjX2Zyb21fcnR5cGUocnR5cGUsIChhZGRyZXNzKSBhZGRyKSkge30KKworICBBZGRyZXNzTGl0ZXJhbChib29sKiBhZGRyLCByZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSA9IHJlbG9jSW5mbzo6bm9uZSkKKyAgICA6IF9hZGRyZXNzKChhZGRyZXNzKSBhZGRyKSwKKyAgICAgIF9yc3BlYyhyc3BlY19mcm9tX3J0eXBlKHJ0eXBlLCAoYWRkcmVzcykgYWRkcikpIHt9CisKKyAgQWRkcmVzc0xpdGVyYWwoY29uc3QgYm9vbCogYWRkciwgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnR5cGUgPSByZWxvY0luZm86Om5vbmUpCisgICAgOiBfYWRkcmVzcygoYWRkcmVzcykgYWRkciksCisgICAgICBfcnNwZWMocnNwZWNfZnJvbV9ydHlwZShydHlwZSwgKGFkZHJlc3MpIGFkZHIpKSB7fQorCisgIEFkZHJlc3NMaXRlcmFsKHNpZ25lZCBjaGFyKiBhZGRyLCByZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSA9IHJlbG9jSW5mbzo6bm9uZSkKKyAgICA6IF9hZGRyZXNzKChhZGRyZXNzKSBhZGRyKSwKKyAgICAgIF9yc3BlYyhyc3BlY19mcm9tX3J0eXBlKHJ0eXBlLCAoYWRkcmVzcykgYWRkcikpIHt9CisKKyAgQWRkcmVzc0xpdGVyYWwoaW50KiBhZGRyLCByZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSA9IHJlbG9jSW5mbzo6bm9uZSkKKyAgICA6IF9hZGRyZXNzKChhZGRyZXNzKSBhZGRyKSwKKyAgICAgIF9yc3BlYyhyc3BlY19mcm9tX3J0eXBlKHJ0eXBlLCAoYWRkcmVzcykgYWRkcikpIHt9CisKKyAgQWRkcmVzc0xpdGVyYWwoaW50cHRyX3QgYWRkciwgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnR5cGUgPSByZWxvY0luZm86Om5vbmUpCisgICAgOiBfYWRkcmVzcygoYWRkcmVzcykgYWRkciksCisgICAgICBfcnNwZWMocnNwZWNfZnJvbV9ydHlwZShydHlwZSwgKGFkZHJlc3MpIGFkZHIpKSB7fQorCiAjaWZkZWYgX0xQNjQKLSAgICBfaGkzMiAgPSAoaW50cHRyX3QpYSA+PiAzMjsgICAgLy8gdG9wIDMyIGJpdHMgaW4gNjQgYml0IHdvcmQKLSAgICBfbG93MzIgPSAoaW50cHRyX3QpYSAmIH4wOyAgICAgLy8gbG93IDMyIGJpdHMgaW4gNjQgYml0IHdvcmQKKyAgLy8gMzItYml0IGNvbXBsYWlucyBhYm91dCBhIG11bHRpcGxlIGRlY2xhcmF0aW9uIGZvciBpbnQqLgorICBBZGRyZXNzTGl0ZXJhbChpbnRwdHJfdCogYWRkciwgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnR5cGUgPSByZWxvY0luZm86Om5vbmUpCisgICAgOiBfYWRkcmVzcygoYWRkcmVzcykgYWRkciksCisgICAgICBfcnNwZWMocnNwZWNfZnJvbV9ydHlwZShydHlwZSwgKGFkZHJlc3MpIGFkZHIpKSB7fQogI2VuZGlmCi0gICAgX2hpICAgID0gKGludHB0cl90KWEgJiB+MHgzZmY7IC8vIHRvcCAgICAyMiBiaXRzIGluIGxvdyB3b3JkCi0gICAgX2Rpc3AgID0gKGludHB0cl90KWEgJiAgMHgzZmY7IC8vIGJvdHRvbSAxMCBiaXRzCi0gIH0KIAotICBBZGRyZXNzKFJlZ2lzdGVyIGIsIGFkZHJlc3MgYSwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMpCi0gICAgOiBfcnNwZWMocnNwZWMpCi0gIHsKLSAgICBfYmFzZSAgPSBiOwotI2lmZGVmIF9MUDY0Ci0gICAgX2hpMzIgID0gKGludHB0cl90KWEgPj4gMzI7ICAgIC8vIHRvcCAzMiBiaXRzIGluIDY0IGJpdCB3b3JkCi0gICAgX2xvdzMyID0gKGludHB0cl90KWEgJiB+MDsgICAgIC8vIGxvdyAzMiBiaXRzIGluIDY0IGJpdCB3b3JkCi0jZW5kaWYKLSAgICBfaGkgICAgPSAoaW50cHRyX3QpYSAmIH4weDNmZjsgLy8gdG9wICAgIDIyIGJpdHMKLSAgICBfZGlzcCAgPSAoaW50cHRyX3QpYSAmICAweDNmZjsgLy8gYm90dG9tIDEwIGJpdHMKLSAgfQorICBBZGRyZXNzTGl0ZXJhbChvb3AgYWRkciwgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnR5cGUgPSByZWxvY0luZm86Om5vbmUpCisgICAgOiBfYWRkcmVzcygoYWRkcmVzcykgYWRkciksCisgICAgICBfcnNwZWMocnNwZWNfZnJvbV9ydHlwZShydHlwZSwgKGFkZHJlc3MpIGFkZHIpKSB7fQogCi0gIEFkZHJlc3MoUmVnaXN0ZXIgYiwgaW50cHRyX3QgaCwgaW50cHRyX3QgZCwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMgPSBSZWxvY2F0aW9uSG9sZGVyKCkpCi0gICAgOiBfcnNwZWMocnNwZWMpCi0gIHsKLSAgICBfYmFzZSAgPSBiOwotI2lmZGVmIF9MUDY0Ci0vLyBbUkdWXSBQdXQgaW4gQXNzZXJ0IHRvIGZvcmNlIG1lIHRvIGNoZWNrIHVzYWdlIG9mIHRoaXMgY29uc3RydWN0b3IKLSAgICAgYXNzZXJ0KCBoID09IDAsICJDaGVjayB1c2FnZSBvZiB0aGlzIGNvbnN0cnVjdG9yIiApOwotICAgIF9oaTMyICA9IGg7Ci0gICAgX2xvdzMyID0gZDsKLSAgICBfaGkgICAgPSBoOwotICAgIF9kaXNwICA9IGQ7Ci0jZWxzZQotICAgIF9oaSAgICA9IGg7Ci0gICAgX2Rpc3AgID0gZDsKLSNlbmRpZgotICB9CisgIEFkZHJlc3NMaXRlcmFsKGZsb2F0KiBhZGRyLCByZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSA9IHJlbG9jSW5mbzo6bm9uZSkKKyAgICA6IF9hZGRyZXNzKChhZGRyZXNzKSBhZGRyKSwKKyAgICAgIF9yc3BlYyhyc3BlY19mcm9tX3J0eXBlKHJ0eXBlLCAoYWRkcmVzcykgYWRkcikpIHt9CiAKLSAgQWRkcmVzcygpCi0gICAgOiBfcnNwZWMoUmVsb2NhdGlvbkhvbGRlcigpKQotICB7Ci0gICAgX2Jhc2UgID0gRzA7Ci0jaWZkZWYgX0xQNjQKLSAgICBfaGkzMiAgPSAwOwotICAgIF9sb3czMiA9IDA7Ci0jZW5kaWYKLSAgICBfaGkgICAgPSAwOwotICAgIF9kaXNwICA9IDA7Ci0gIH0KKyAgQWRkcmVzc0xpdGVyYWwoZG91YmxlKiBhZGRyLCByZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSA9IHJlbG9jSW5mbzo6bm9uZSkKKyAgICA6IF9hZGRyZXNzKChhZGRyZXNzKSBhZGRyKSwKKyAgICAgIF9yc3BlYyhyc3BlY19mcm9tX3J0eXBlKHJ0eXBlLCAoYWRkcmVzcykgYWRkcikpIHt9CiAKLSAgLy8gZmFuY2llciBjb25zdHJ1Y3RvcnMKKyAgaW50cHRyX3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiAoaW50cHRyX3QpIF9hZGRyZXNzOyB9CisgIGludCAgICAgIGxvdzEwKCkgY29uc3Q7CiAKLSAgZW51bSBhZGRyX3R5cGUgewotICAgIGV4dHJhX2luX2FyZ3VtZW50LCAgLy8gaW4gdGhlIEluIHJlZ2lzdGVycwotICAgIGV4dHJhX291dF9hcmd1bWVudCAgLy8gaW4gdGhlIE91dHMKLSAgfTsKKyAgY29uc3QgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnR5cGUoKSBjb25zdCB7IHJldHVybiBfcnNwZWMudHlwZSgpOyB9CisgIGNvbnN0IFJlbG9jYXRpb25Ib2xkZXImICAgIHJzcGVjKCkgY29uc3QgeyByZXR1cm4gX3JzcGVjOyB9CiAKLSAgQWRkcmVzcyggYWRkcl90eXBlLCBpbnQgKTsKLQotICAvLyBhY2Nlc3NvcnMKLQotICBSZWdpc3RlciAgICAgICAgICAgICAgIGJhc2UoKSBjb25zdCB7IHJldHVybiBfYmFzZTsgfQotI2lmZGVmIF9MUDY0Ci0gIGludCAgICAgICAgICAgICAgICAgICBoaTMyKCkgIGNvbnN0IHsgcmV0dXJuIF9oaTMyOyB9Ci0gIGludCAgICAgICAgICAgICAgICAgICBsb3czMigpIGNvbnN0IHsgcmV0dXJuIF9sb3czMjsgfQotI2VuZGlmCi0gIGludCAgICAgICAgICAgICAgICAgICAgICBoaSgpIGNvbnN0IHsgcmV0dXJuIF9oaTsgIH0KLSAgaW50ICAgICAgICAgICAgICAgICAgICBkaXNwKCkgY29uc3QgeyByZXR1cm4gX2Rpc3A7IH0KLSNpZmRlZiBfTFA2NAotICBpbnRwdHJfdCAgICAgICAgICAgICAgdmFsdWUoKSBjb25zdCB7IHJldHVybiAoKGludHB0cl90KV9oaTMyIDw8IDMyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpKHVpbnQzMl90KV9sb3czMjsgfQotI2Vsc2UKLSAgaW50ICAgICAgICAgICAgICAgICAgIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gX2hpIHwgX2Rpc3A7IH0KLSNlbmRpZgotICBjb25zdCByZWxvY0luZm86OnJlbG9jVHlwZSAgcnR5cGUoKSB7IHJldHVybiBfcnNwZWMudHlwZSgpOyB9Ci0gIGNvbnN0IFJlbG9jYXRpb25Ib2xkZXImICAgICByc3BlYygpIHsgcmV0dXJuIF9yc3BlYzsgfQotCi0gIFJlbG9jYXRpb25Ib2xkZXIgICAgICByc3BlYyhpbnQgb2Zmc2V0KSBjb25zdCB7CisgIFJlbG9jYXRpb25Ib2xkZXIgcnNwZWMoaW50IG9mZnNldCkgY29uc3QgewogICAgIHJldHVybiBvZmZzZXQgPT0gMCA/IF9yc3BlYyA6IF9yc3BlYy5wbHVzKG9mZnNldCk7CiAgIH0KLQotICBpbmxpbmUgYm9vbCBpc19zaW1tMTMoaW50IG9mZnNldCA9IDApOyAgLy8gY2hlY2sgZGlzcCtvZmZzZXQgZm9yIG92ZXJmbG93Ci0KLSAgQWRkcmVzcyBwbHVzX2Rpc3AoaW50IGRpc3ApIGNvbnN0IHsgICAgIC8vIGJ1bXAgZGlzcCBieSBhIHNtYWxsIGFtb3VudAotICAgIEFkZHJlc3MgYSA9ICgqdGhpcyk7Ci0gICAgYS5fZGlzcCArPSBkaXNwOwotICAgIHJldHVybiBhOwotICB9Ci0KLSAgQWRkcmVzcyBzcGxpdF9kaXNwKCkgY29uc3QgeyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBkaXNwIG92ZXJmbG93Ci0gICAgQWRkcmVzcyBhID0gKCp0aGlzKTsKLSAgICBpbnQgaGlfZGlzcCA9IF9kaXNwICYgfjB4M2ZmOwotICAgIGlmIChoaV9kaXNwICE9IDApIHsKLSAgICAgIGEuX2Rpc3AgLT0gaGlfZGlzcDsKLSAgICAgIGEuX2hpICAgKz0gaGlfZGlzcDsKLSAgICB9Ci0gICAgcmV0dXJuIGE7Ci0gIH0KLQotICBBZGRyZXNzIGFmdGVyX3NhdmUoKSBjb25zdCB7Ci0gICAgQWRkcmVzcyBhID0gKCp0aGlzKTsKLSAgICBhLl9iYXNlID0gYS5fYmFzZS0+YWZ0ZXJfc2F2ZSgpOwotICAgIHJldHVybiBhOwotICB9Ci0KLSAgQWRkcmVzcyBhZnRlcl9yZXN0b3JlKCkgY29uc3QgewotICAgIEFkZHJlc3MgYSA9ICgqdGhpcyk7Ci0gICAgYS5fYmFzZSA9IGEuX2Jhc2UtPmFmdGVyX3Jlc3RvcmUoKTsKLSAgICByZXR1cm4gYTsKLSAgfQotCi0gIGZyaWVuZCBjbGFzcyBBc3NlbWJsZXI7CiB9OwogCiAKIGlubGluZSBBZGRyZXNzIFJlZ2lzdGVySW1wbDo6YWRkcmVzc19pbl9zYXZlZF93aW5kb3coKSBjb25zdCB7Ci0gICByZXR1cm4gKEFkZHJlc3MoU1AsIDAsIChzcF9vZmZzZXRfaW5fc2F2ZWRfd2luZG93KCkgKiB3b3JkU2l6ZSkgKyBTVEFDS19CSUFTKSk7CisgICByZXR1cm4gKEFkZHJlc3MoU1AsIChzcF9vZmZzZXRfaW5fc2F2ZWRfd2luZG93KCkgKiB3b3JkU2l6ZSkgKyBTVEFDS19CSUFTKSk7CiB9CiAKIApAQCAtNDk1LDExICs1MjMsNyBAQAogICAvLyBXaGVuIGFwcGxpZWQgdG8gYSByZWdpc3Rlci1iYXNlZCBhcmd1bWVudCwgZ2l2ZSB0aGUgY29ycmVzcG9uZGluZyBhZGRyZXNzCiAgIC8vIGludG8gdGhlIDYtd29yZCBhcmVhICJpbnRvIHdoaWNoIGNhbGxlZSBtYXkgc3RvcmUgcmVnaXN0ZXIgYXJndW1lbnRzIgogICAvLyAoVGhpcyBpcyBhIGRpZmZlcmVudCBwbGFjZSB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyLXNhdmUgYXJlYSBsb2NhdGlvbi4pCi0gIEFkZHJlc3MgYWRkcmVzc19pbl9mcmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gQWRkcmVzcyggaXNfaW4oKSAgID8gQWRkcmVzczo6ZXh0cmFfaW5fYXJndW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQWRkcmVzczo6ZXh0cmFfb3V0X2FyZ3VtZW50LAotICAgICAgICAgICAgICAgICAgICBfbnVtYmVyICk7Ci0gIH0KKyAgQWRkcmVzcyBhZGRyZXNzX2luX2ZyYW1lKCkgY29uc3Q7CiAKICAgLy8gZGVidWdnaW5nCiAgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKQEAgLTUyMSw2ICs1NDUsNyBAQAogCiAKICAgZnJpZW5kIGNsYXNzIEFic3RyYWN0QXNzZW1ibGVyOworICBmcmllbmQgY2xhc3MgQWRkcmVzc0xpdGVyYWw7CiAKICAgLy8gY29kZSBwYXRjaGVycyBuZWVkIHZhcmlvdXMgcm91dGluZXMgbGlrZSBpbnZfd2Rpc3AoKQogICBmcmllbmQgY2xhc3MgTmF0aXZlSW5zdHJ1Y3Rpb247CkBAIC0xMDkzLDExICsxMTE4LDExIEBACiAKICAgLy8gcHAgMTM1IChhZGRjIHdhcyBhZGR4IGluIHY4KQogCi0gIGlubGluZSB2b2lkIGFkZCggICAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBSZWdpc3RlciBkICk7Ci0gIGlubGluZSB2b2lkIGFkZCggICAgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkLCByZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSA9IHJlbG9jSW5mbzo6bm9uZSk7Ci0gIGlubGluZSB2b2lkIGFkZCggICAgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkLCBSZWxvY2F0aW9uSG9sZGVyIGNvbnN0JiByc3BlYyk7Ci0gIGlubGluZSB2b2lkIGFkZCggICAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOwotICBpbmxpbmUgdm9pZCBhZGQoICAgIGNvbnN0IEFkZHJlc3MmICBhLCAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKTsKKyAgaW5saW5lIHZvaWQgYWRkKFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgUmVnaXN0ZXIgZCApOworICBpbmxpbmUgdm9pZCBhZGQoUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkLCByZWxvY0luZm86OnJlbG9jVHlwZSBydHlwZSA9IHJlbG9jSW5mbzo6bm9uZSk7CisgIGlubGluZSB2b2lkIGFkZChSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIFJlZ2lzdGVyIGQsIFJlbG9jYXRpb25Ib2xkZXIgY29uc3QmIHJzcGVjKTsKKyAgaW5saW5lIHZvaWQgYWRkKFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKTsKKyAgaW5saW5lIHZvaWQgYWRkKGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKSB7IGFkZCggYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0LCBkLCBhLnJzcGVjKG9mZnNldCkpOyB9CiAKICAgdm9pZCBhZGRjYyggIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgUmVnaXN0ZXIgZCApIHsgZW1pdF9sb25nKCBvcChhcml0aF9vcCkgfCByZChkKSB8IG9wMyhhZGRfb3AzICB8IGNjX2JpdF9vcDMpIHwgcnMxKHMxKSB8IHJzMihzMikgKTsgfQogICB2b2lkIGFkZGNjKCAgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkICkgeyBlbWl0X2xvbmcoIG9wKGFyaXRoX29wKSB8IHJkKGQpIHwgb3AzKGFkZF9vcDMgIHwgY2NfYml0X29wMykgfCByczEoczEpIHwgaW1tZWQodHJ1ZSkgfCBzaW1tKHNpbW0xM2EsIDEzKSApOyB9CkBAIC0xMjUyLDE0ICsxMjc3LDEyIEBACiAgIHZvaWQgam1wbCggUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBSZWdpc3RlciBkICk7CiAgIHZvaWQgam1wbCggUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkLCBSZWxvY2F0aW9uSG9sZGVyIGNvbnN0JiByc3BlYyA9IFJlbG9jYXRpb25Ib2xkZXIoKSApOwogCi0gIGlubGluZSB2b2lkIGptcGwoIEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKTsKLQogICAvLyAxNzEKIAotICBpbmxpbmUgdm9pZCBsZGYoICAgIEZsb2F0UmVnaXN0ZXJJbXBsOjpXaWR0aCB3LCBSZWdpc3RlciBzMSwgUmVnaXN0ZXIgczIsIEZsb2F0UmVnaXN0ZXIgZCApOwotICBpbmxpbmUgdm9pZCBsZGYoICAgIEZsb2F0UmVnaXN0ZXJJbXBsOjpXaWR0aCB3LCBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIEZsb2F0UmVnaXN0ZXIgZCApOworICBpbmxpbmUgdm9pZCBsZGYoRmxvYXRSZWdpc3RlckltcGw6OldpZHRoIHcsIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgRmxvYXRSZWdpc3RlciBkKTsKKyAgaW5saW5lIHZvaWQgbGRmKEZsb2F0UmVnaXN0ZXJJbXBsOjpXaWR0aCB3LCBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIEZsb2F0UmVnaXN0ZXIgZCwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMgPSBSZWxvY2F0aW9uSG9sZGVyKCkpOwogCi0gIGlubGluZSB2b2lkIGxkZiggICAgRmxvYXRSZWdpc3RlckltcGw6OldpZHRoIHcsIGNvbnN0IEFkZHJlc3MmIGEsIEZsb2F0UmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBsZGYoRmxvYXRSZWdpc3RlckltcGw6OldpZHRoIHcsIGNvbnN0IEFkZHJlc3MmIGEsIEZsb2F0UmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOwogCiAKICAgaW5saW5lIHZvaWQgbGRmc3IoICBSZWdpc3RlciBzMSwgUmVnaXN0ZXIgczIgKTsKQEAgLTEzMDMsMTUgKzEzMjYsMjAgQEAKICAgaW5saW5lIHZvaWQgbGRkKCAgIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgUmVnaXN0ZXIgZCApOwogICBpbmxpbmUgdm9pZCBsZGQoICAgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkKTsKIAotICBpbmxpbmUgdm9pZCBsZHNiKCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBsZHNoKCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBsZHN3KCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBsZHViKCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBsZHVoKCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBsZHV3KCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBsZHgoICBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBsZCggICBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBsZGQoICBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOworI2lmZGVmIEFTU0VSVAorICAvLyBCeXRlU2l6ZSBpcyBvbmx5IGEgY2xhc3Mgd2hlbiBBU1NFUlQgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIGl0J3MgYW4gaW50LgorICBpbmxpbmUgdm9pZCBsZCggICAgUmVnaXN0ZXIgczEsIEJ5dGVTaXplIHNpbW0xM2EsIFJlZ2lzdGVyIGQpOworI2VuZGlmCisKKyAgaW5saW5lIHZvaWQgbGRzYihjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCk7CisgIGlubGluZSB2b2lkIGxkc2goY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBsZHN3KGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKTsKKyAgaW5saW5lIHZvaWQgbGR1Yihjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCk7CisgIGlubGluZSB2b2lkIGxkdWgoY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBsZHV3KGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKTsKKyAgaW5saW5lIHZvaWQgbGR4KCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCk7CisgIGlubGluZSB2b2lkIGxkKCAgY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBsZGQoIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKTsKIAogICBpbmxpbmUgdm9pZCBsZHViKCAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCApOwogICBpbmxpbmUgdm9pZCBsZHNiKCAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCApOwpAQCAtMTUzNiw2ICsxNTY0LDExIEBACiAgIGlubGluZSB2b2lkIHN0ZCggIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiApOwogICBpbmxpbmUgdm9pZCBzdGQoICBSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EpOwogCisjaWZkZWYgQVNTRVJUCisgIC8vIEJ5dGVTaXplIGlzIG9ubHkgYSBjbGFzcyB3aGVuIEFTU0VSVCBpcyBkZWZpbmVkLCBvdGhlcndpc2UgaXQncyBhbiBpbnQuCisgIGlubGluZSB2b2lkIHN0KCAgIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBCeXRlU2l6ZSBzaW1tMTNhKTsKKyNlbmRpZgorCiAgIGlubGluZSB2b2lkIHN0YiggIFJlZ2lzdGVyIGQsIGNvbnN0IEFkZHJlc3MmIGEsIGludCBvZmZzZXQgPSAwICk7CiAgIGlubGluZSB2b2lkIHN0aCggIFJlZ2lzdGVyIGQsIGNvbnN0IEFkZHJlc3MmIGEsIGludCBvZmZzZXQgPSAwICk7CiAgIGlubGluZSB2b2lkIHN0dyggIFJlZ2lzdGVyIGQsIGNvbnN0IEFkZHJlc3MmIGEsIGludCBvZmZzZXQgPSAwICk7CkBAIC0xNjg0LDggKzE3MTcsOCBAQAogCiAjZGVmaW5lIEpNUDIocjEsIHIyKSBqbXAocjEsIHIyLCBfX0ZJTEVfXywgX19MSU5FX18pCiAjZGVmaW5lIEpNUChyMSwgb2ZmKSBqbXAocjEsIG9mZiwgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBKVU1QKGEsIG9mZikgICAgIGp1bXAoYSwgb2ZmLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZGVmaW5lIEpVTVBMKGEsIGQsIG9mZikganVtcGwoYSwgZCwgb2ZmLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIEpVTVAoYSwgdGVtcCwgb2ZmKSAgICAganVtcChhLCB0ZW1wLCBvZmYsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgSlVNUEwoYSwgdGVtcCwgZCwgb2ZmKSBqdW1wbChhLCB0ZW1wLCBkLCBvZmYsIF9fRklMRV9fLCBfX0xJTkVfXykKIAogCiBjbGFzcyBNYWNyb0Fzc2VtYmxlcjogcHVibGljIEFzc2VtYmxlciB7CkBAIC0xODMwLDE3ICsxODYzLDI2IEBACiAjZW5kaWYKIAogICAvLyBzZXRoaSBNYWNybyBoYW5kbGVzIG9wdGltaXphdGlvbnMgYW5kIHJlbG9jYXRpb25zCi0gIHZvaWQgc2V0aGkoIEFkZHJlc3MmIGEsIGJvb2wgRm9yY2VSZWxvY2F0YWJsZSA9IGZhbHNlICk7Ci0gIHZvaWQgc2V0aGkoIGludHB0cl90IGltbTIyYSwgUmVnaXN0ZXIgZCwgYm9vbCBGb3JjZVJlbG9jYXRhYmxlID0gZmFsc2UsIFJlbG9jYXRpb25Ib2xkZXIgY29uc3QmIHJzcGVjID0gUmVsb2NhdGlvbkhvbGRlcigpKTsKK3ByaXZhdGU6CisgIHZvaWQgaW50ZXJuYWxfc2V0aGkoY29uc3QgQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIGQsIGJvb2wgRm9yY2VSZWxvY2F0YWJsZSk7CitwdWJsaWM6CisgIHZvaWQgc2V0aGkoY29uc3QgQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIGQpOworICB2b2lkIHBhdGNoYWJsZV9zZXRoaShjb25zdCBBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgZCk7CiAKICAgLy8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBhIHNldGhpL3NldAogICBzdGF0aWMgaW50ICBzaXplX29mX3NldGhpKCBhZGRyZXNzIGEsIGJvb2wgd29yc3RfY2FzZSA9IGZhbHNlICk7CiAgIHN0YXRpYyBpbnQgIHdvcnN0X2Nhc2Vfc2l6ZV9vZl9zZXQoKTsKIAogICAvLyBzZXQgbWF5IGJlIGVpdGhlciBzZXRzdyBvciBzZXR1dyAoaGlnaCAzMiBiaXRzIG1heSBiZSB6ZXJvIG9yIHNpZ24pCi0gIHZvaWQgc2V0KCAgICBpbnRwdHJfdCB2YWx1ZSwgUmVnaXN0ZXIgZCwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMgPSBSZWxvY2F0aW9uSG9sZGVyKCkgKTsKLSAgdm9pZCBzZXRzdyggIGludCB2YWx1ZSwgUmVnaXN0ZXIgZCwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMgPSBSZWxvY2F0aW9uSG9sZGVyKCkgKTsKLSAgdm9pZCBzZXQ2NCggIGpsb25nIHZhbHVlLCBSZWdpc3RlciBkLCBSZWdpc3RlciB0bXApOworcHJpdmF0ZToKKyAgdm9pZCBpbnRlcm5hbF9zZXQoY29uc3QgQWRkcmVzc0xpdGVyYWwmIGFsLCBSZWdpc3RlciBkLCBib29sIEZvcmNlUmVsb2NhdGFibGUpOworcHVibGljOgorICB2b2lkIHNldChjb25zdCBBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgZCk7CisgIHZvaWQgc2V0KGludHB0cl90IHZhbHVlLCBSZWdpc3RlciBkKTsKKyAgdm9pZCBzZXQoYWRkcmVzcyBhZGRyLCBSZWdpc3RlciBkLCBSZWxvY2F0aW9uSG9sZGVyIGNvbnN0JiByc3BlYyk7CisgIHZvaWQgcGF0Y2hhYmxlX3NldChjb25zdCBBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgZCk7CisgIHZvaWQgcGF0Y2hhYmxlX3NldChpbnRwdHJfdCB2YWx1ZSwgUmVnaXN0ZXIgZCk7CisgIHZvaWQgc2V0NjQoamxvbmcgdmFsdWUsIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHRtcCk7CiAKICAgLy8gc2lnbi1leHRlbmQgMzIgdG8gNjQKICAgaW5saW5lIHZvaWQgc2lnbngoIFJlZ2lzdGVyIHMsIFJlZ2lzdGVyIGQgKSB7IHNyYSggcywgRzAsIGQpOyB9CkBAIC0xOTMwLDI0ICsxOTcyLDIyIEBACiAgIGlubGluZSB2b2lkIG1vdiggaW50IHNpbW0xM2EsIFJlZ2lzdGVyIGQpIHsgb3IzKCBHMCwgc2ltbTEzYSwgZCk7IH0KIAogICAvLyBhZGRyZXNzIHBzZXVkb3M6IG1ha2UgdGhlc2UgbmFtZXMgdW5saWtlIGluc3RydWN0aW9uIG5hbWVzIHRvIGF2b2lkIGNvbmZ1c2lvbgotICBpbmxpbmUgdm9pZCBzcGxpdF9kaXNwKCAgICBBZGRyZXNzJiBhLCBSZWdpc3RlciB0ZW1wICk7CiAgIGlubGluZSBpbnRwdHJfdCBsb2FkX3BjX2FkZHJlc3MoIFJlZ2lzdGVyIHJlZywgaW50IGJ5dGVzX3RvX3NraXAgKTsKLSAgaW5saW5lIHZvaWQgbG9hZF9hZGRyZXNzKCAgQWRkcmVzcyYgYSwgaW50IG9mZnNldCA9IDAgKTsKLSAgaW5saW5lIHZvaWQgbG9hZF9jb250ZW50cyggQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDAgKTsKLSAgaW5saW5lIHZvaWQgbG9hZF9wdHJfY29udGVudHMoIEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwICk7Ci0gIGlubGluZSB2b2lkIHN0b3JlX2NvbnRlbnRzKCBSZWdpc3RlciBzLCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBzdG9yZV9wdHJfY29udGVudHMoIFJlZ2lzdGVyIHMsIEFkZHJlc3MmIGEsIGludCBvZmZzZXQgPSAwICk7Ci0gIGlubGluZSB2b2lkIGp1bXBsX3RvKCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBqdW1wX3RvKCAgQWRkcmVzcyYgYSwgICAgICAgICAgICAgaW50IG9mZnNldCA9IDAgKTsKLSAgaW5saW5lIHZvaWQganVtcF9pbmRpcmVjdF90byggIEFkZHJlc3MmIGEsIFJlZ2lzdGVyIHRlbXAsIGludCBsZF9vZmZzZXQgPSAwLCBpbnQgam1wX29mZnNldCA9IDAgKTsKKyAgaW5saW5lIHZvaWQgbG9hZF9jb250ZW50cyhBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBsb2FkX3B0cl9jb250ZW50cyhBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBzdG9yZV9jb250ZW50cyhSZWdpc3RlciBzLCBBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgdGVtcCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBzdG9yZV9wdHJfY29udGVudHMoUmVnaXN0ZXIgcywgQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIHRlbXAsIGludCBvZmZzZXQgPSAwKTsKKyAgaW5saW5lIHZvaWQganVtcGxfdG8oQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIHRlbXAsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKTsKKyAgaW5saW5lIHZvaWQganVtcF90byhBZGRyZXNzTGl0ZXJhbCYgYWRkcmxpdCwgUmVnaXN0ZXIgdGVtcCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBqdW1wX2luZGlyZWN0X3RvKEFkZHJlc3MmIGEsIFJlZ2lzdGVyIHRlbXAsIGludCBsZF9vZmZzZXQgPSAwLCBpbnQgam1wX29mZnNldCA9IDApOwogCiAgIC8vIHJpbmcgYnVmZmVyIHRyYWNlYWJsZSBqdW1wcwogCiAgIHZvaWQgam1wMiggUmVnaXN0ZXIgcjEsIFJlZ2lzdGVyIHIyLCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSApOwogICB2b2lkIGptcCAoIFJlZ2lzdGVyIHIxLCBpbnQgb2Zmc2V0LCAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUgKTsKIAotICB2b2lkIGp1bXBsKCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSApOwotICB2b2lkIGp1bXAgKCBBZGRyZXNzJiBhLCAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSApOworICB2b2lkIGp1bXBsKEFkZHJlc3NMaXRlcmFsJiBhZGRybGl0LCBSZWdpc3RlciB0ZW1wLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7CisgIHZvaWQganVtcCAoQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIHRlbXAsICAgICAgICAgICAgIGludCBvZmZzZXQsIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKIAogCiAgIC8vIGFyZ3VtZW50IHBzZXVkb3M6CkBAIC0xOTcyLDI5ICsyMDEyLDMxIEBACiAgIC8vIEZ1bmN0aW9ucyBmb3IgaXNvbGF0aW5nIDY0IGJpdCBsb2FkcyBmb3IgTFA2NAogICAvLyBsZF9wdHIgd2lsbCBwZXJmb3JtIGxkIGZvciAzMiBiaXQgVk0ncyBhbmQgbGR4IGZvciA2NCBiaXQgVk0ncwogICAvLyBzdF9wdHIgd2lsbCBwZXJmb3JtIHN0IGZvciAzMiBiaXQgVk0ncyBhbmQgc3R4IGZvciA2NCBiaXQgVk0ncwotICBpbmxpbmUgdm9pZCBsZF9wdHIoICAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBSZWdpc3RlciBkICk7Ci0gIGlubGluZSB2b2lkIGxkX3B0ciggICBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIFJlZ2lzdGVyIGQpOwotICBpbmxpbmUgdm9pZCBsZF9wdHIoICAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCApOwotICBpbmxpbmUgdm9pZCBsZF9wdHIoICBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCApOwotICBpbmxpbmUgdm9pZCBzdF9wdHIoICBSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgUmVnaXN0ZXIgczIgKTsKLSAgaW5saW5lIHZvaWQgc3RfcHRyKCAgUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhKTsKLSAgaW5saW5lIHZvaWQgc3RfcHRyKCAgUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiApOwotICBpbmxpbmUgdm9pZCBzdF9wdHIoICBSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0ID0gMCApOworICBpbmxpbmUgdm9pZCBsZF9wdHIoUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBSZWdpc3RlciBkKTsKKyAgaW5saW5lIHZvaWQgbGRfcHRyKFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSwgUmVnaXN0ZXIgZCk7CisgIGlubGluZSB2b2lkIGxkX3B0cihSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkKTsKKyAgaW5saW5lIHZvaWQgbGRfcHRyKGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwKTsKKyAgaW5saW5lIHZvaWQgc3RfcHRyKFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMik7CisgIGlubGluZSB2b2lkIHN0X3B0cihSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EpOworICBpbmxpbmUgdm9pZCBzdF9wdHIoUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMik7CisgIGlubGluZSB2b2lkIHN0X3B0cihSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0ID0gMCk7CisKKyNpZmRlZiBBU1NFUlQKKyAgLy8gQnl0ZVNpemUgaXMgb25seSBhIGNsYXNzIHdoZW4gQVNTRVJUIGlzIGRlZmluZWQsIG90aGVyd2lzZSBpdCdzIGFuIGludC4KKyAgaW5saW5lIHZvaWQgbGRfcHRyKFJlZ2lzdGVyIHMxLCBCeXRlU2l6ZSBzaW1tMTNhLCBSZWdpc3RlciBkKTsKKyAgaW5saW5lIHZvaWQgc3RfcHRyKFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBCeXRlU2l6ZSBzaW1tMTNhKTsKKyNlbmRpZgogCiAgIC8vIGxkX2xvbmcgd2lsbCBwZXJmb3JtIGxkIGZvciAzMiBiaXQgVk0ncyBhbmQgbGR4IGZvciA2NCBiaXQgVk0ncwogICAvLyBzdF9sb25nIHdpbGwgcGVyZm9ybSBzdCBmb3IgMzIgYml0IFZNJ3MgYW5kIHN0eCBmb3IgNjQgYml0IFZNJ3MKLSAgaW5saW5lIHZvaWQgbGRfbG9uZyggUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBSZWdpc3RlciBkICk7Ci0gIGlubGluZSB2b2lkIGxkX2xvbmcoIFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSwgUmVnaXN0ZXIgZCApOwotICBpbmxpbmUgdm9pZCBsZF9sb25nKCBSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkICk7Ci0gIGlubGluZSB2b2lkIGxkX2xvbmcoIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgPSAwICk7Ci0gIGlubGluZSB2b2lkIHN0X2xvbmcoIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiApOwotICBpbmxpbmUgdm9pZCBzdF9sb25nKCBSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EgKTsKLSAgaW5saW5lIHZvaWQgc3RfbG9uZyggUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiApOwotICBpbmxpbmUgdm9pZCBzdF9sb25nKCBSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0ID0gMCApOwotCi0gIC8vIExvYWRpbmcgdmFsdWVzIGJ5IHNpemUgYW5kIHNpZ25lZC1uZXNzCi0gIHZvaWQgbG9hZF9zaXplZF92YWx1ZShSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfaW5fYnl0ZXMsIGJvb2wgaXNfc2lnbmVkKTsKKyAgaW5saW5lIHZvaWQgbGRfbG9uZyhSZWdpc3RlciBzMSwgUmVnaXN0ZXIgczIsIFJlZ2lzdGVyIGQpOworICBpbmxpbmUgdm9pZCBsZF9sb25nKFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSwgUmVnaXN0ZXIgZCk7CisgIGlubGluZSB2b2lkIGxkX2xvbmcoUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCk7CisgIGlubGluZSB2b2lkIGxkX2xvbmcoY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDApOworICBpbmxpbmUgdm9pZCBzdF9sb25nKFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMik7CisgIGlubGluZSB2b2lkIHN0X2xvbmcoUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhKTsKKyAgaW5saW5lIHZvaWQgc3RfbG9uZyhSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyKTsKKyAgaW5saW5lIHZvaWQgc3RfbG9uZyhSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0ID0gMCk7CiAKICAgLy8gSGVscGVycyBmb3IgYWRkcmVzcyBmb3JtYXRpb24uCiAgIC8vIFRoZXkgdXBkYXRlIHRoZSBkZXN0IGluIHBsYWNlLCB3aGV0aGVyIGl0IGlzIGEgcmVnaXN0ZXIgb3IgY29uc3RhbnQuCkBAIC0yMDQ5LDggKzIwOTEsOCBAQAogICAvLyBUaGVzZSBhcmUgaWRpb21zIHRvIGZsYWcgdGhlIG5lZWQgZm9yIGNhcmUgd2l0aCBhY2Nlc3NpbmcgYm9vbHMgYnV0IG9uCiAgIC8vIHRoaXMgcGxhdGZvcm0gd2UgYXNzdW1lIGJ5dGUgc2l6ZQogCi0gIGlubGluZSB2b2lkIHN0Ym9vbCggUmVnaXN0ZXIgZCwgY29uc3QgQWRkcmVzcyYgYSwgaW50IG9mZnNldCA9IDAgKSB7IHN0YihkLCBhLCBvZmZzZXQpOyB9Ci0gIGlubGluZSB2b2lkIGxkYm9vbCggY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCA9IDAgKSB7IGxkc2IoIGEsIGQsIG9mZnNldCApOyB9CisgIGlubGluZSB2b2lkIHN0Ym9vbChSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhKSB7IHN0YihkLCBhKTsgfQorICBpbmxpbmUgdm9pZCBsZGJvb2woY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCkgeyBsZHNiKGEsIGQpOyB9CiAgIGlubGluZSB2b2lkIHRzdGJvb2woIFJlZ2lzdGVyIHMgKSB7IHRzdChzKTsgfQogICBpbmxpbmUgdm9pZCBtb3Zib29sKCBib29sIGJvb2xjb25zdCwgUmVnaXN0ZXIgZCkgeyBtb3YoIChpbnQpIGJvb2xjb25zdCwgZCk7IH0KIApAQCAtMjA2MCw3ICsyMTAyLDcgQEAKICAgdm9pZCBzdG9yZV9rbGFzc19nYXAoUmVnaXN0ZXIgcywgUmVnaXN0ZXIgZHN0X29vcCk7CiAKICAgIC8vIG9vcCBtYW5pcHVsYXRpb25zCi0gIHZvaWQgbG9hZF9oZWFwX29vcChjb25zdCBBZGRyZXNzJiBzLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ID0gMCk7CisgIHZvaWQgbG9hZF9oZWFwX29vcChjb25zdCBBZGRyZXNzJiBzLCBSZWdpc3RlciBkKTsKICAgdm9pZCBsb2FkX2hlYXBfb29wKFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgUmVnaXN0ZXIgZCk7CiAgIHZvaWQgbG9hZF9oZWFwX29vcChSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIFJlZ2lzdGVyIGQpOwogICB2b2lkIHN0b3JlX2hlYXBfb29wKFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMik7CkBAIC0yMTkwLDExICsyMjMyLDExIEBACiAgIHZvaWQgcHJpbnRfQ1BVX3N0YXRlKCk7CiAKICAgLy8gb29wcyBpbiBjb2RlCi0gIEFkZHJlc3MgYWxsb2NhdGVfb29wX2FkZHJlc3MoIGpvYmplY3Qgb2JqLCBSZWdpc3RlciBkICk7IC8vIGFsbG9jYXRlX2luZGV4Ci0gIEFkZHJlc3MgY29uc3RhbnRfb29wX2FkZHJlc3MoIGpvYmplY3Qgb2JqLCBSZWdpc3RlciBkICk7IC8vIGZpbmRfaW5kZXgKLSAgaW5saW5lIHZvaWQgc2V0X29vcCAgICAgICAgICggam9iamVjdCBvYmosIFJlZ2lzdGVyIGQgKTsgLy8gdXNlcyBhbGxvY2F0ZV9vb3BfYWRkcmVzcwotICBpbmxpbmUgdm9pZCBzZXRfb29wX2NvbnN0YW50KCBqb2JqZWN0IG9iaiwgUmVnaXN0ZXIgZCApOyAvLyB1c2VzIGNvbnN0YW50X29vcF9hZGRyZXNzCi0gIGlubGluZSB2b2lkIHNldF9vb3AgICAgICAgICAoIEFkZHJlc3Mgb2JqX2FkZHIgKTsgICAgICAgIC8vIHNhbWUgYXMgbG9hZF9hZGRyZXNzCisgIEFkZHJlc3NMaXRlcmFsIGFsbG9jYXRlX29vcF9hZGRyZXNzKGpvYmplY3Qgb2JqKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlX2luZGV4CisgIEFkZHJlc3NMaXRlcmFsIGNvbnN0YW50X29vcF9hZGRyZXNzKGpvYmplY3Qgb2JqKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmRfaW5kZXgKKyAgaW5saW5lIHZvaWQgICAgc2V0X29vcCAgICAgICAgICAgICAoam9iamVjdCBvYmosIFJlZ2lzdGVyIGQpOyAgICAgICAgICAgICAgLy8gdXNlcyBhbGxvY2F0ZV9vb3BfYWRkcmVzcworICBpbmxpbmUgdm9pZCAgICBzZXRfb29wX2NvbnN0YW50ICAgIChqb2JqZWN0IG9iaiwgUmVnaXN0ZXIgZCk7ICAgICAgICAgICAgICAvLyB1c2VzIGNvbnN0YW50X29vcF9hZGRyZXNzCisgIGlubGluZSB2b2lkICAgIHNldF9vb3AgICAgICAgICAgICAgKEFkZHJlc3NMaXRlcmFsJiBvYmpfYWRkciwgUmVnaXN0ZXIgZCk7IC8vIHNhbWUgYXMgbG9hZF9hZGRyZXNzCiAKICAgdm9pZCBzZXRfbmFycm93X29vcCggam9iamVjdCBvYmosIFJlZ2lzdGVyIGQgKTsKIApAQCAtMjQxMCw3ICsyNDUyLDggQEAKICAgLy8gQ29uZGl0aW9uYWxseSAobm9uLWF0b21pY2FsbHkpIGluY3JlbWVudHMgcGFzc2VkIGNvdW50ZXIgYWRkcmVzcywgcHJlc2VydmluZyBjb25kaXRpb24gY29kZXMuCiAgIHZvaWQgY29uZF9pbmMoQ29uZGl0aW9uIGNvbmQsIGFkZHJlc3MgY291bnRlcl9hZGRyLCBSZWdpc3RlciBSdGVtcDEsIFJlZ2lzdGVyIFJ0ZW1wMik7CiAgIC8vIFVuY29uZGl0aW9uYWwgaW5jcmVtZW50LgotICB2b2lkIGluY19jb3VudGVyKGFkZHJlc3MgY291bnRlcl9hZGRyLCBSZWdpc3RlciBSdGVtcDEsIFJlZ2lzdGVyIFJ0ZW1wMik7CisgIHZvaWQgaW5jX2NvdW50ZXIoYWRkcmVzcyBjb3VudGVyX2FkZHIsIFJlZ2lzdGVyIFJ0bXAxLCBSZWdpc3RlciBSdG1wMik7CisgIHZvaWQgaW5jX2NvdW50ZXIoaW50KiAgICBjb3VudGVyX2FkZHIsIFJlZ2lzdGVyIFJ0bXAxLCBSZWdpc3RlciBSdG1wMik7CiAKICN1bmRlZiBWSVJUVUFMCiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9hc3NlbWJsZXJfc3BhcmMuaW5saW5lLmhwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9hc3NlbWJsZXJfc3BhcmMuaW5saW5lLmhwcAppbmRleCA2OTJjODY1Li5iOTcwOGZmIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYXNzZW1ibGVyX3NwYXJjLmlubGluZS5ocHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2Fzc2VtYmxlcl9zcGFyYy5pbmxpbmUuaHBwCkBAIC0zOCw2ICszOCwxMSBAQAogaW5saW5lIGJvb2wgQWRkcmVzczo6aXNfc2ltbTEzKGludCBvZmZzZXQpIHsgcmV0dXJuIEFzc2VtYmxlcjo6aXNfc2ltbTEzKGRpc3AoKSArIG9mZnNldCk7IH0KIAogCitpbmxpbmUgaW50IEFkZHJlc3NMaXRlcmFsOjpsb3cxMCgpIGNvbnN0IHsKKyAgcmV0dXJuIEFzc2VtYmxlcjo6bG93MTAodmFsdWUoKSk7Cit9CisKKwogLy8gaW5saW5lcyBmb3IgU1BBUkMgYXNzZW1ibGVyIC0tIGRtdSA1Lzk3CiAKIGlubGluZSB2b2lkIEFzc2VtYmxlcjo6Y2hlY2tfZGVsYXkoKSB7CkBAIC02MywxMCArNjgsOSBAQAogfQogCiAKLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6YWRkKCAgICBSZWdpc3RlciBzMSwgUmVnaXN0ZXIgczIsIFJlZ2lzdGVyIGQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBlbWl0X2xvbmcoIG9wKGFyaXRoX29wKSB8IHJkKGQpIHwgb3AzKGFkZF9vcDMpIHwgcnMxKHMxKSB8IHJzMihzMikgKTsgfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjphZGQoICAgIFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSwgUmVnaXN0ZXIgZCwgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnR5cGUgKSB7IGVtaXRfZGF0YSggb3AoYXJpdGhfb3ApIHwgcmQoZCkgfCBvcDMoYWRkX29wMykgfCByczEoczEpIHwgaW1tZWQodHJ1ZSkgfCBzaW1tKHNpbW0xM2EsIDEzKSwgcnR5cGUgKTsgfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjphZGQoICAgIFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSwgUmVnaXN0ZXIgZCwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMgKSB7IGVtaXRfZGF0YSggb3AoYXJpdGhfb3ApIHwgcmQoZCkgfCBvcDMoYWRkX29wMykgfCByczEoczEpIHwgaW1tZWQodHJ1ZSkgfCBzaW1tKHNpbW0xM2EsIDEzKSwgcnNwZWMgKTsgfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjphZGQoICAgIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQpIHsgYWRkKCBhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQsIGQsIGEucnNwZWMob2Zmc2V0KSk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6YWRkKFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgUmVnaXN0ZXIgZCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGVtaXRfbG9uZyggb3AoYXJpdGhfb3ApIHwgcmQoZCkgfCBvcDMoYWRkX29wMykgfCByczEoczEpIHwgcnMyKHMyKSApOyB9CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmFkZChSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIFJlZ2lzdGVyIGQsIHJlbG9jSW5mbzo6cmVsb2NUeXBlIHJ0eXBlICkgeyBlbWl0X2RhdGEoIG9wKGFyaXRoX29wKSB8IHJkKGQpIHwgb3AzKGFkZF9vcDMpIHwgcnMxKHMxKSB8IGltbWVkKHRydWUpIHwgc2ltbShzaW1tMTNhLCAxMyksIHJ0eXBlICk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6YWRkKFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSwgUmVnaXN0ZXIgZCwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMgKSB7IGVtaXRfZGF0YSggb3AoYXJpdGhfb3ApIHwgcmQoZCkgfCBvcDMoYWRkX29wMykgfCByczEoczEpIHwgaW1tZWQodHJ1ZSkgfCBzaW1tKHNpbW0xM2EsIDEzKSwgcnNwZWMgKTsgfQogCiBpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmJwciggUkNvbmRpdGlvbiBjLCBib29sIGEsIFByZWRpY3QgcCwgUmVnaXN0ZXIgczEsIGFkZHJlc3MgZCwgcmVsb2NJbmZvOjpyZWxvY1R5cGUgcnQgKSB7IHY5X29ubHkoKTsgIGVtaXRfZGF0YSggb3AoYnJhbmNoX29wKSB8IGFubnVsKGEpIHwgY29uZChjKSB8IG9wMihicHJfb3AyKSB8IHdkaXNwMTYoaW50cHRyX3QoZCksIGludHB0cl90KHBjKCkpKSB8IHByZWRpY3QocCkgfCByczEoczEpLCBydCk7ICBoYXNfZGVsYXlfc2xvdCgpOyB9CiBpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmJwciggUkNvbmRpdGlvbiBjLCBib29sIGEsIFByZWRpY3QgcCwgUmVnaXN0ZXIgczEsIExhYmVsJiBMKSB7IGJwciggYywgYSwgcCwgczEsIHRhcmdldChMKSk7IH0KQEAgLTk1LDEzICs5OSwxMCBAQAogaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpqbXBsKCBSZWdpc3RlciBzMSwgUmVnaXN0ZXIgczIsIFJlZ2lzdGVyIGQgICAgICAgICAgICAgICAgICAgICAgICAgICkgeyBlbWl0X2xvbmcoIG9wKGFyaXRoX29wKSB8IHJkKGQpIHwgb3AzKGptcGxfb3AzKSB8IHJzMShzMSkgfCByczIoczIpKTsgIGhhc19kZWxheV9zbG90KCk7IH0KIGlubGluZSB2b2lkIEFzc2VtYmxlcjo6am1wbCggUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkLCBSZWxvY2F0aW9uSG9sZGVyIGNvbnN0JiByc3BlYyApIHsgZW1pdF9kYXRhKCBvcChhcml0aF9vcCkgfCByZChkKSB8IG9wMyhqbXBsX29wMykgfCByczEoczEpIHwgaW1tZWQodHJ1ZSkgfCBzaW1tKHNpbW0xM2EsIDEzKSwgcnNwZWMpOyAgaGFzX2RlbGF5X3Nsb3QoKTsgfQogCi1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmptcGwoIEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQpIHsgam1wbCggYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0LCBkLCBhLnJzcGVjKG9mZnNldCkpOyB9CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkZihGbG9hdFJlZ2lzdGVySW1wbDo6V2lkdGggdywgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBGbG9hdFJlZ2lzdGVyIGQpIHsgZW1pdF9sb25nKCBvcChsZHN0X29wKSB8IGZkKGQsIHcpIHwgYWx0X29wMyhsZGZfb3AzLCB3KSB8IHJzMShzMSkgfCByczIoczIpICk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGRmKEZsb2F0UmVnaXN0ZXJJbXBsOjpXaWR0aCB3LCBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIEZsb2F0UmVnaXN0ZXIgZCwgUmVsb2NhdGlvbkhvbGRlciBjb25zdCYgcnNwZWMpIHsgZW1pdF9kYXRhKCBvcChsZHN0X29wKSB8IGZkKGQsIHcpIHwgYWx0X29wMyhsZGZfb3AzLCB3KSB8IHJzMShzMSkgfCBpbW1lZCh0cnVlKSB8IHNpbW0oc2ltbTEzYSwgMTMpLCByc3BlYyk7IH0KIAotCi1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkZiggICAgRmxvYXRSZWdpc3RlckltcGw6OldpZHRoIHcsIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgRmxvYXRSZWdpc3RlciBkKSB7IGVtaXRfbG9uZyggb3AobGRzdF9vcCkgfCBmZChkLCB3KSB8IGFsdF9vcDMobGRmX29wMywgdykgfCByczEoczEpIHwgcnMyKHMyKSApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkZiggICAgRmxvYXRSZWdpc3RlckltcGw6OldpZHRoIHcsIFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSwgRmxvYXRSZWdpc3RlciBkKSB7IGVtaXRfZGF0YSggb3AobGRzdF9vcCkgfCBmZChkLCB3KSB8IGFsdF9vcDMobGRmX29wMywgdykgfCByczEoczEpIHwgaW1tZWQodHJ1ZSkgfCBzaW1tKHNpbW0xM2EsIDEzKSk7IH0KLQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZGYoICAgIEZsb2F0UmVnaXN0ZXJJbXBsOjpXaWR0aCB3LCBjb25zdCBBZGRyZXNzJiBhLCBGbG9hdFJlZ2lzdGVyIGQsIGludCBvZmZzZXQpIHsgcmVsb2NhdGUoYS5yc3BlYyhvZmZzZXQpKTsgbGRmKCB3LCBhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQsIGQpOyB9CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkZihGbG9hdFJlZ2lzdGVySW1wbDo6V2lkdGggdywgY29uc3QgQWRkcmVzcyYgYSwgRmxvYXRSZWdpc3RlciBkLCBpbnQgb2Zmc2V0KSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkZiggdywgYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0LCBkKTsgfQogCiBpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkZnNyKCAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyKSB7IHY5X2RlcCgpOyAgIGVtaXRfbG9uZyggb3AobGRzdF9vcCkgfCAgICAgICAgICAgICBvcDMobGRmc3Jfb3AzKSB8IHJzMShzMSkgfCByczIoczIpICk7IH0KIGlubGluZSB2b2lkIEFzc2VtYmxlcjo6bGRmc3IoICBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EpIHsgdjlfZGVwKCk7ICAgZW1pdF9kYXRhKCBvcChsZHN0X29wKSB8ICAgICAgICAgICAgIG9wMyhsZGZzcl9vcDMpIHwgcnMxKHMxKSB8IGltbWVkKHRydWUpIHwgc2ltbShzaW1tMTNhLCAxMykpOyB9CkBAIC0xMzYsNTAgKzEzNyw2OSBAQAogCiAjaWZkZWYgX0xQNjQKIC8vIE1ha2UgYWxsIDMyIGJpdCBsb2FkcyBzaWduZWQgc28gNjQgYml0IHJlZ2lzdGVycyBtYWludGFpbiBwcm9wZXIgc2lnbgotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZCggIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgUmVnaXN0ZXIgZCkgeyBsZHN3KCBzMSwgczIsIGQpOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkKCAgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkKSB7IGxkc3coIHMxLCBzaW1tMTNhLCBkKTsgfQoraW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZCggIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMiwgUmVnaXN0ZXIgZCkgICAgICB7IGxkc3coIHMxLCBzMiwgZCk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGQoICBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIFJlZ2lzdGVyIGQpICAgICAgeyBsZHN3KCBzMSwgc2ltbTEzYSwgZCk7IH0KICNlbHNlCi1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkKCAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBSZWdpc3RlciBkKSB7IGxkdXcoIHMxLCBzMiwgZCk7IH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6bGQoICBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIFJlZ2lzdGVyIGQpIHsgbGR1dyggczEsIHNpbW0xM2EsIGQpOyB9CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkKCAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBSZWdpc3RlciBkKSAgICAgIHsgbGR1dyggczEsIHMyLCBkKTsgfQoraW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZCggIFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSwgUmVnaXN0ZXIgZCkgICAgICB7IGxkdXcoIHMxLCBzaW1tMTNhLCBkKTsgfQogI2VuZGlmCiAKLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6bGR1YiggIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQpIHsKLSAgaWYgKHMyLmlzX3JlZ2lzdGVyKCkpICBsZHNiKHMxLCBzMi5hc19yZWdpc3RlcigpLCBkKTsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICBsZHNiKHMxLCBzMi5hc19jb25zdGFudCgpLCBkKTsKKyNpZmRlZiBBU1NFUlQKKyAgLy8gQnl0ZVNpemUgaXMgb25seSBhIGNsYXNzIHdoZW4gQVNTRVJUIGlzIGRlZmluZWQsIG90aGVyd2lzZSBpdCdzIGFuIGludC4KKyMgaWZkZWYgX0xQNjQKK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGQoICBSZWdpc3RlciBzMSwgQnl0ZVNpemUgc2ltbTEzYSwgUmVnaXN0ZXIgZCkgeyBsZHN3KCBzMSwgaW5fYnl0ZXMoc2ltbTEzYSksIGQpOyB9CisjIGVsc2UKK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGQoICBSZWdpc3RlciBzMSwgQnl0ZVNpemUgc2ltbTEzYSwgUmVnaXN0ZXIgZCkgeyBsZHV3KCBzMSwgaW5fYnl0ZXMoc2ltbTEzYSksIGQpOyB9CisjIGVuZGlmCisjZW5kaWYKKworaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZCggIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQpIHsKKyAgaWYgKGEuaGFzX2luZGV4KCkpIHsgYXNzZXJ0KG9mZnNldCA9PSAwLCAiIik7IGxkKCAgYS5iYXNlKCksIGEuaW5kZXgoKSwgICAgICAgICBkKTsgfQorICBlbHNlICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgbGQoICBhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQsIGQpOyB9CiB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6Omxkc2IoICBSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkKSB7Ci0gIGlmIChzMi5pc19yZWdpc3RlcigpKSAgbGRzYihzMSwgczIuYXNfcmVnaXN0ZXIoKSwgZCk7Ci0gIGVsc2UgICAgICAgICAgICAgICAgICAgbGRzYihzMSwgczIuYXNfY29uc3RhbnQoKSwgZCk7CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6Omxkc2IoY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCkgeworICBpZiAoYS5oYXNfaW5kZXgoKSkgeyBhc3NlcnQob2Zmc2V0ID09IDAsICIiKTsgbGRzYihhLmJhc2UoKSwgYS5pbmRleCgpLCAgICAgICAgIGQpOyB9CisgIGVsc2UgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICBsZHNiKGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCk7IH0KIH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6bGR1aCggIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQpIHsKLSAgaWYgKHMyLmlzX3JlZ2lzdGVyKCkpICBsZHNoKHMxLCBzMi5hc19yZWdpc3RlcigpLCBkKTsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICBsZHNoKHMxLCBzMi5hc19jb25zdGFudCgpLCBkKTsKK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGRzaChjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0KSB7CisgIGlmIChhLmhhc19pbmRleCgpKSB7IGFzc2VydChvZmZzZXQgPT0gMCwgIiIpOyBsZHNoKGEuYmFzZSgpLCBhLmluZGV4KCksICAgICAgICAgZCk7IH0KKyAgZWxzZSAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIGxkc2goYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0LCBkKTsgfQogfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZHNoKCAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCkgewotICBpZiAoczIuaXNfcmVnaXN0ZXIoKSkgIGxkc2goczEsIHMyLmFzX3JlZ2lzdGVyKCksIGQpOwotICBlbHNlICAgICAgICAgICAgICAgICAgIGxkc2goczEsIHMyLmFzX2NvbnN0YW50KCksIGQpOworaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZHN3KGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQpIHsKKyAgaWYgKGEuaGFzX2luZGV4KCkpIHsgYXNzZXJ0KG9mZnNldCA9PSAwLCAiIik7IGxkc3coYS5iYXNlKCksIGEuaW5kZXgoKSwgICAgICAgICBkKTsgfQorICBlbHNlICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgbGRzdyhhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQsIGQpOyB9CiB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkdXcoICBSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkKSB7Ci0gIGlmIChzMi5pc19yZWdpc3RlcigpKSAgbGRzdyhzMSwgczIuYXNfcmVnaXN0ZXIoKSwgZCk7Ci0gIGVsc2UgICAgICAgICAgICAgICAgICAgbGRzdyhzMSwgczIuYXNfY29uc3RhbnQoKSwgZCk7CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkdWIoY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCkgeworICBpZiAoYS5oYXNfaW5kZXgoKSkgeyBhc3NlcnQob2Zmc2V0ID09IDAsICIiKTsgbGR1YihhLmJhc2UoKSwgYS5pbmRleCgpLCAgICAgICAgIGQpOyB9CisgIGVsc2UgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICBsZHViKGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCk7IH0KIH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6bGRzdyggIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQpIHsKLSAgaWYgKHMyLmlzX3JlZ2lzdGVyKCkpICBsZHN3KHMxLCBzMi5hc19yZWdpc3RlcigpLCBkKTsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICBsZHN3KHMxLCBzMi5hc19jb25zdGFudCgpLCBkKTsKK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGR1aChjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0KSB7CisgIGlmIChhLmhhc19pbmRleCgpKSB7IGFzc2VydChvZmZzZXQgPT0gMCwgIiIpOyBsZHVoKGEuYmFzZSgpLCBhLmluZGV4KCksICAgICAgICAgZCk7IH0KKyAgZWxzZSAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIGxkdWgoYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0LCBkKTsgfQogfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZHgoICAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCkgewotICBpZiAoczIuaXNfcmVnaXN0ZXIoKSkgIGxkeChzMSwgczIuYXNfcmVnaXN0ZXIoKSwgZCk7Ci0gIGVsc2UgICAgICAgICAgICAgICAgICAgbGR4KHMxLCBzMi5hc19jb25zdGFudCgpLCBkKTsKK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGR1dyhjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0KSB7CisgIGlmIChhLmhhc19pbmRleCgpKSB7IGFzc2VydChvZmZzZXQgPT0gMCwgIiIpOyBsZHV3KGEuYmFzZSgpLCBhLmluZGV4KCksICAgICAgICAgZCk7IH0KKyAgZWxzZSAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIGxkdXcoYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0LCBkKTsgfQogfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZCggICAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCkgewotICBpZiAoczIuaXNfcmVnaXN0ZXIoKSkgIGxkKHMxLCBzMi5hc19yZWdpc3RlcigpLCBkKTsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICBsZChzMSwgczIuYXNfY29uc3RhbnQoKSwgZCk7CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkZCggY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCkgeworICBpZiAoYS5oYXNfaW5kZXgoKSkgeyBhc3NlcnQob2Zmc2V0ID09IDAsICIiKTsgbGRkKCBhLmJhc2UoKSwgYS5pbmRleCgpLCAgICAgICAgIGQpOyB9CisgIGVsc2UgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICBsZGQoIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCk7IH0KIH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6bGRkKCAgIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQpIHsKLSAgaWYgKHMyLmlzX3JlZ2lzdGVyKCkpICBsZGQoczEsIHMyLmFzX3JlZ2lzdGVyKCksIGQpOwotICBlbHNlICAgICAgICAgICAgICAgICAgIGxkZChzMSwgczIuYXNfY29uc3RhbnQoKSwgZCk7CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkeCggY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCkgeworICBpZiAoYS5oYXNfaW5kZXgoKSkgeyBhc3NlcnQob2Zmc2V0ID09IDAsICIiKTsgbGR4KCBhLmJhc2UoKSwgYS5pbmRleCgpLCAgICAgICAgIGQpOyB9CisgIGVsc2UgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICBsZHgoIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCk7IH0KIH0KIAoraW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZHViKFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQpIHsgbGR1YihBZGRyZXNzKHMxLCBzMiksIGQpOyB9CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6Omxkc2IoUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCkgeyBsZHNiKEFkZHJlc3MoczEsIHMyKSwgZCk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGR1aChSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkKSB7IGxkdWgoQWRkcmVzcyhzMSwgczIpLCBkKTsgfQoraW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZHNoKFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQpIHsgbGRzaChBZGRyZXNzKHMxLCBzMiksIGQpOyB9CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkdXcoUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCkgeyBsZHV3KEFkZHJlc3MoczEsIHMyKSwgZCk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGRzdyhSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkKSB7IGxkc3coQWRkcmVzcyhzMSwgczIpLCBkKTsgfQoraW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZHgoIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQpIHsgbGR4KCBBZGRyZXNzKHMxLCBzMiksIGQpOyB9CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkKCAgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMiwgUmVnaXN0ZXIgZCkgeyBsZCggIEFkZHJlc3MoczEsIHMyKSwgZCk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6bGRkKCBSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkKSB7IGxkZCggQWRkcmVzcyhzMSwgczIpLCBkKTsgfQorCiAvLyBmb3JtIGVmZmVjdGl2ZSBhZGRyZXNzZXMgdGhpcyB3YXk6CiBpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmFkZCggICBSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0KSB7CiAgIGlmIChzMi5pc19yZWdpc3RlcigpKSAgYWRkKHMxLCBzMi5hc19yZWdpc3RlcigpLCBkKTsKQEAgLTE4NywxNyArMjA3LDYgQEAKICAgaWYgKG9mZnNldCAhPSAwKSAgICAgICBhZGQoZCwgIG9mZnNldCwgICAgICAgICAgICAgICAgICAgIGQpOwogfQogCi1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkKCAgIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkKCAgIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6Omxkc2IoIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkc2IoIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6Omxkc2goIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkc2goIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6Omxkc3coIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkc3coIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkdWIoIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkdWIoIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkdWgoIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkdWgoIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkdXcoIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkdXcoIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkZCggIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkZCggIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OmxkeCggIGNvbnN0IEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IGxkeCggIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCwgZCApOyB9Ci0KLQogaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZHN0dWIoICBSZWdpc3RlciBzMSwgUmVnaXN0ZXIgczIsIFJlZ2lzdGVyIGQpIHsgZW1pdF9sb25nKCBvcChsZHN0X29wKSB8IHJkKGQpIHwgb3AzKGxkc3R1Yl9vcDMpIHwgcnMxKHMxKSB8IHJzMihzMikgKTsgfQogaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpsZHN0dWIoICBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EsIFJlZ2lzdGVyIGQpIHsgZW1pdF9kYXRhKCBvcChsZHN0X29wKSB8IHJkKGQpIHwgb3AzKGxkc3R1Yl9vcDMpIHwgcnMxKHMxKSB8IGltbWVkKHRydWUpIHwgc2ltbShzaW1tMTNhLCAxMykpOyB9CiAKQEAgLTI0MCwzNiArMjQ5LDQ0IEBACiBpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OnN0ZCggIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3RlciBzMikgeyB2OV9kZXAoKTsgYXNzZXJ0KGQtPmlzX2V2ZW4oKSwgIm5vdCBldmVuIik7IGVtaXRfbG9uZyggb3AobGRzdF9vcCkgfCByZChkKSB8IG9wMyhzdGRfb3AzKSB8IHJzMShzMSkgfCByczIoczIpICk7IH0KIGlubGluZSB2b2lkIEFzc2VtYmxlcjo6c3RkKCAgUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhKSB7IHY5X2RlcCgpOyBhc3NlcnQoZC0+aXNfZXZlbigpLCAibm90IGV2ZW4iKTsgZW1pdF9kYXRhKCBvcChsZHN0X29wKSB8IHJkKGQpIHwgb3AzKHN0ZF9vcDMpIHwgcnMxKHMxKSB8IGltbWVkKHRydWUpIHwgc2ltbShzaW1tMTNhLCAxMykpOyB9CiAKLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6c3QoICBSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgUmVnaXN0ZXIgczIpIHsgc3R3KGQsIHMxLCBzMik7IH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6c3QoICBSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgaW50IHNpbW0xM2EpIHsgc3R3KGQsIHMxLCBzaW1tMTNhKTsgfQoraW5saW5lIHZvaWQgQXNzZW1ibGVyOjpzdCggUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyKSAgICAgIHsgc3R3KGQsIHMxLCBzMik7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3QoIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBpbnQgc2ltbTEzYSkgICAgICB7IHN0dyhkLCBzMSwgc2ltbTEzYSk7IH0KIAotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpzdGIoICBSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyKSB7Ci0gIGlmIChzMi5pc19yZWdpc3RlcigpKSAgc3RiKGQsIHMxLCBzMi5hc19yZWdpc3RlcigpKTsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICBzdGIoZCwgczEsIHMyLmFzX2NvbnN0YW50KCkpOworI2lmZGVmIEFTU0VSVAorLy8gQnl0ZVNpemUgaXMgb25seSBhIGNsYXNzIHdoZW4gQVNTRVJUIGlzIGRlZmluZWQsIG90aGVyd2lzZSBpdCdzIGFuIGludC4KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3QoIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBCeXRlU2l6ZSBzaW1tMTNhKSB7IHN0dyhkLCBzMSwgaW5fYnl0ZXMoc2ltbTEzYSkpOyB9CisjZW5kaWYKKworaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpzdGIoUmVnaXN0ZXIgZCwgY29uc3QgQWRkcmVzcyYgYSwgaW50IG9mZnNldCkgeworICBpZiAoYS5oYXNfaW5kZXgoKSkgeyBhc3NlcnQob2Zmc2V0ID09IDAsICIiKTsgc3RiKGQsIGEuYmFzZSgpLCBhLmluZGV4KCkgICAgICAgICk7IH0KKyAgZWxzZSAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YihkLCBhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQpOyB9CiB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OnN0aCggIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIpIHsKLSAgaWYgKHMyLmlzX3JlZ2lzdGVyKCkpICBzdGgoZCwgczEsIHMyLmFzX3JlZ2lzdGVyKCkpOwotICBlbHNlICAgICAgICAgICAgICAgICAgIHN0aChkLCBzMSwgczIuYXNfY29uc3RhbnQoKSk7CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OnN0aChSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0KSB7CisgIGlmIChhLmhhc19pbmRleCgpKSB7IGFzc2VydChvZmZzZXQgPT0gMCwgIiIpOyBzdGgoZCwgYS5iYXNlKCksIGEuaW5kZXgoKSAgICAgICAgKTsgfQorICBlbHNlICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RoKGQsIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCk7IH0KIH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6c3R4KCAgUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyT3JDb25zdGFudCBzMikgewotICBpZiAoczIuaXNfcmVnaXN0ZXIoKSkgIHN0eChkLCBzMSwgczIuYXNfcmVnaXN0ZXIoKSk7Ci0gIGVsc2UgICAgICAgICAgICAgICAgICAgc3R4KGQsIHMxLCBzMi5hc19jb25zdGFudCgpKTsKK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3R3KFJlZ2lzdGVyIGQsIGNvbnN0IEFkZHJlc3MmIGEsIGludCBvZmZzZXQpIHsKKyAgaWYgKGEuaGFzX2luZGV4KCkpIHsgYXNzZXJ0KG9mZnNldCA9PSAwLCAiIik7IHN0dyhkLCBhLmJhc2UoKSwgYS5pbmRleCgpICAgICAgICApOyB9CisgIGVsc2UgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICBzdHcoZCwgYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0KTsgfQogfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpzdGQoIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIpIHsKLSAgaWYgKHMyLmlzX3JlZ2lzdGVyKCkpICBzdGQoZCwgczEsIHMyLmFzX3JlZ2lzdGVyKCkpOwotICBlbHNlICAgICAgICAgICAgICAgICAgIHN0ZChkLCBzMSwgczIuYXNfY29uc3RhbnQoKSk7CitpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OnN0KCBSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0KSB7CisgIGlmIChhLmhhc19pbmRleCgpKSB7IGFzc2VydChvZmZzZXQgPT0gMCwgIiIpOyBzdCggZCwgYS5iYXNlKCksIGEuaW5kZXgoKSAgICAgICAgKTsgfQorICBlbHNlICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgc3QoIGQsIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCk7IH0KIH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6c3QoICBSZWdpc3RlciBkLCBSZWdpc3RlciBzMSwgUmVnaXN0ZXJPckNvbnN0YW50IHMyKSB7Ci0gIGlmIChzMi5pc19yZWdpc3RlcigpKSAgc3QoZCwgczEsIHMyLmFzX3JlZ2lzdGVyKCkpOwotICBlbHNlICAgICAgICAgICAgICAgICAgIHN0KGQsIHMxLCBzMi5hc19jb25zdGFudCgpKTsKK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3RkKFJlZ2lzdGVyIGQsIGNvbnN0IEFkZHJlc3MmIGEsIGludCBvZmZzZXQpIHsKKyAgaWYgKGEuaGFzX2luZGV4KCkpIHsgYXNzZXJ0KG9mZnNldCA9PSAwLCAiIik7IHN0ZChkLCBhLmJhc2UoKSwgYS5pbmRleCgpICAgICAgICApOyB9CisgIGVsc2UgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQoZCwgYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0KTsgfQorfQoraW5saW5lIHZvaWQgQXNzZW1ibGVyOjpzdHgoUmVnaXN0ZXIgZCwgY29uc3QgQWRkcmVzcyYgYSwgaW50IG9mZnNldCkgeworICBpZiAoYS5oYXNfaW5kZXgoKSkgeyBhc3NlcnQob2Zmc2V0ID09IDAsICIiKTsgc3R4KGQsIGEuYmFzZSgpLCBhLmluZGV4KCkgICAgICAgICk7IH0KKyAgZWxzZSAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eChkLCBhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQpOyB9CiB9CiAKLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6c3RiKCBSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0KSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IHN0YiggZCwgYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0KTsgfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpzdGgoIFJlZ2lzdGVyIGQsIGNvbnN0IEFkZHJlc3MmIGEsIGludCBvZmZzZXQpIHsgcmVsb2NhdGUoYS5yc3BlYyhvZmZzZXQpKTsgc3RoKCBkLCBhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQpOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OnN0dyggUmVnaXN0ZXIgZCwgY29uc3QgQWRkcmVzcyYgYSwgaW50IG9mZnNldCkgeyByZWxvY2F0ZShhLnJzcGVjKG9mZnNldCkpOyBzdHcoIGQsIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCk7IH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6c3QoICBSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0KSB7IHJlbG9jYXRlKGEucnNwZWMob2Zmc2V0KSk7IHN0KCAgZCwgYS5iYXNlKCksIGEuZGlzcCgpICsgb2Zmc2V0KTsgfQotaW5saW5lIHZvaWQgQXNzZW1ibGVyOjpzdGQoIFJlZ2lzdGVyIGQsIGNvbnN0IEFkZHJlc3MmIGEsIGludCBvZmZzZXQpIHsgcmVsb2NhdGUoYS5yc3BlYyhvZmZzZXQpKTsgc3RkKCBkLCBhLmJhc2UoKSwgYS5kaXNwKCkgKyBvZmZzZXQpOyB9Ci1pbmxpbmUgdm9pZCBBc3NlbWJsZXI6OnN0eCggUmVnaXN0ZXIgZCwgY29uc3QgQWRkcmVzcyYgYSwgaW50IG9mZnNldCkgeyByZWxvY2F0ZShhLnJzcGVjKG9mZnNldCkpOyBzdHgoIGQsIGEuYmFzZSgpLCBhLmRpc3AoKSArIG9mZnNldCk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3RiKFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIpIHsgc3RiKGQsIEFkZHJlc3MoczEsIHMyKSk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3RoKFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIpIHsgc3RoKGQsIEFkZHJlc3MoczEsIHMyKSk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3R4KFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIpIHsgc3R4KGQsIEFkZHJlc3MoczEsIHMyKSk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3RkKFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIpIHsgc3RkKGQsIEFkZHJlc3MoczEsIHMyKSk7IH0KK2lubGluZSB2b2lkIEFzc2VtYmxlcjo6c3QoIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIpIHsgc3QoIGQsIEFkZHJlc3MoczEsIHMyKSk7IH0KIAogLy8gdjggcCA5OQogCkBAIC0yOTQsMzkgKzMxMSw0NiBAQAogLy8gVXNlIHRoZSByaWdodCBsb2Fkcy9zdG9yZXMgZm9yIHRoZSBwbGF0Zm9ybQogaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxkX3B0ciggUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyLCBSZWdpc3RlciBkICkgewogI2lmZGVmIF9MUDY0Ci0gIEFzc2VtYmxlcjo6bGR4KCBzMSwgczIsIGQpOworICBBc3NlbWJsZXI6OmxkeChzMSwgczIsIGQpOwogI2Vsc2UKLSAgQXNzZW1ibGVyOjpsZCggIHMxLCBzMiwgZCk7CisgIEFzc2VtYmxlcjo6bGQoIHMxLCBzMiwgZCk7CiAjZW5kaWYKIH0KIAogaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxkX3B0ciggUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhLCBSZWdpc3RlciBkICkgewogI2lmZGVmIF9MUDY0Ci0gIEFzc2VtYmxlcjo6bGR4KCBzMSwgc2ltbTEzYSwgZCk7CisgIEFzc2VtYmxlcjo6bGR4KHMxLCBzaW1tMTNhLCBkKTsKICNlbHNlCi0gIEFzc2VtYmxlcjo6bGQoICBzMSwgc2ltbTEzYSwgZCk7CisgIEFzc2VtYmxlcjo6bGQoIHMxLCBzaW1tMTNhLCBkKTsKICNlbmRpZgogfQogCisjaWZkZWYgQVNTRVJUCisvLyBCeXRlU2l6ZSBpcyBvbmx5IGEgY2xhc3Mgd2hlbiBBU1NFUlQgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIGl0J3MgYW4gaW50LgoraW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxkX3B0ciggUmVnaXN0ZXIgczEsIEJ5dGVTaXplIHNpbW0xM2EsIFJlZ2lzdGVyIGQgKSB7CisgIGxkX3B0cihzMSwgaW5fYnl0ZXMoc2ltbTEzYSksIGQpOworfQorI2VuZGlmCisKIGlubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpsZF9wdHIoIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIsIFJlZ2lzdGVyIGQgKSB7CiAjaWZkZWYgX0xQNjQKLSAgQXNzZW1ibGVyOjpsZHgoIHMxLCBzMiwgZCk7CisgIEFzc2VtYmxlcjo6bGR4KHMxLCBzMiwgZCk7CiAjZWxzZQotICBBc3NlbWJsZXI6OmxkKCAgczEsIHMyLCBkKTsKKyAgQXNzZW1ibGVyOjpsZCggczEsIHMyLCBkKTsKICNlbmRpZgogfQogCi1pbmxpbmUgdm9pZCBNYWNyb0Fzc2VtYmxlcjo6bGRfcHRyKCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ICkgeworaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxkX3B0cihjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0KSB7CiAjaWZkZWYgX0xQNjQKLSAgQXNzZW1ibGVyOjpsZHgoICBhLCBkLCBvZmZzZXQgKTsKKyAgQXNzZW1ibGVyOjpsZHgoYSwgZCwgb2Zmc2V0KTsKICNlbHNlCi0gIEFzc2VtYmxlcjo6bGQoICAgYSwgZCwgb2Zmc2V0ICk7CisgIEFzc2VtYmxlcjo6bGQoIGEsIGQsIG9mZnNldCk7CiAjZW5kaWYKIH0KIAogaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnN0X3B0ciggUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIFJlZ2lzdGVyIHMyICkgewogI2lmZGVmIF9MUDY0Ci0gIEFzc2VtYmxlcjo6c3R4KCBkLCBzMSwgczIpOworICBBc3NlbWJsZXI6OnN0eChkLCBzMSwgczIpOwogI2Vsc2UKICAgQXNzZW1ibGVyOjpzdCggZCwgczEsIHMyKTsKICNlbmRpZgpAQCAtMzM0LDI1ICszNTgsMzIgQEAKIAogaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnN0X3B0ciggUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIGludCBzaW1tMTNhICkgewogI2lmZGVmIF9MUDY0Ci0gIEFzc2VtYmxlcjo6c3R4KCBkLCBzMSwgc2ltbTEzYSk7CisgIEFzc2VtYmxlcjo6c3R4KGQsIHMxLCBzaW1tMTNhKTsKICNlbHNlCiAgIEFzc2VtYmxlcjo6c3QoIGQsIHMxLCBzaW1tMTNhKTsKICNlbmRpZgogfQogCisjaWZkZWYgQVNTRVJUCisvLyBCeXRlU2l6ZSBpcyBvbmx5IGEgY2xhc3Mgd2hlbiBBU1NFUlQgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIGl0J3MgYW4gaW50LgoraW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnN0X3B0ciggUmVnaXN0ZXIgZCwgUmVnaXN0ZXIgczEsIEJ5dGVTaXplIHNpbW0xM2EgKSB7CisgIHN0X3B0cihkLCBzMSwgaW5fYnl0ZXMoc2ltbTEzYSkpOworfQorI2VuZGlmCisKIGlubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpzdF9wdHIoIFJlZ2lzdGVyIGQsIFJlZ2lzdGVyIHMxLCBSZWdpc3Rlck9yQ29uc3RhbnQgczIgKSB7CiAjaWZkZWYgX0xQNjQKLSAgQXNzZW1ibGVyOjpzdHgoIGQsIHMxLCBzMik7CisgIEFzc2VtYmxlcjo6c3R4KGQsIHMxLCBzMik7CiAjZWxzZQogICBBc3NlbWJsZXI6OnN0KCBkLCBzMSwgczIpOwogI2VuZGlmCiB9CiAKLWlubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpzdF9wdHIoICBSZWdpc3RlciBkLCBjb25zdCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0KSB7CitpbmxpbmUgdm9pZCBNYWNyb0Fzc2VtYmxlcjo6c3RfcHRyKFJlZ2lzdGVyIGQsIGNvbnN0IEFkZHJlc3MmIGEsIGludCBvZmZzZXQpIHsKICNpZmRlZiBfTFA2NAotICBBc3NlbWJsZXI6OnN0eCggIGQsIGEsIG9mZnNldCk7CisgIEFzc2VtYmxlcjo6c3R4KGQsIGEsIG9mZnNldCk7CiAjZWxzZQotICBBc3NlbWJsZXI6OnN0KCAgZCwgYSwgb2Zmc2V0KTsKKyAgQXNzZW1ibGVyOjpzdCggZCwgYSwgb2Zmc2V0KTsKICNlbmRpZgogfQogCkBAIC0zODEsMTEgKzQxMiwxMSBAQAogI2VuZGlmCiB9CiAKLWlubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpsZF9sb25nKCBjb25zdCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ICkgeworaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxkX2xvbmcoY29uc3QgQWRkcmVzcyYgYSwgUmVnaXN0ZXIgZCwgaW50IG9mZnNldCkgewogI2lmZGVmIF9MUDY0Ci0gIEFzc2VtYmxlcjo6bGR4KGEsIGQsIG9mZnNldCApOworICBBc3NlbWJsZXI6OmxkeChhLCBkLCBvZmZzZXQpOwogI2Vsc2UKLSAgQXNzZW1ibGVyOjpsZGQoYSwgZCwgb2Zmc2V0ICk7CisgIEFzc2VtYmxlcjo6bGRkKGEsIGQsIG9mZnNldCk7CiAjZW5kaWYKIH0KIApAQCAtNDI3LDcgKzQ1OCw3IEBACiAjaWZkZWYgX0xQNjQKICAgQXNzZW1ibGVyOjpzbGx4KHMxLCBzMiwgZCk7CiAjZWxzZQotICBBc3NlbWJsZXI6OnNsbChzMSwgczIsIGQpOworICBBc3NlbWJsZXI6OnNsbCggczEsIHMyLCBkKTsKICNlbmRpZgogfQogCkBAIC00MzUsNyArNDY2LDcgQEAKICNpZmRlZiBfTFA2NAogICBBc3NlbWJsZXI6OnNsbHgoczEsIGltbTZhLCBkKTsKICNlbHNlCi0gIEFzc2VtYmxlcjo6c2xsKHMxLCBpbW02YSwgZCk7CisgIEFzc2VtYmxlcjo6c2xsKCBzMSwgaW1tNmEsIGQpOwogI2VuZGlmCiB9CiAKQEAgLTQ0Myw3ICs0NzQsNyBAQAogI2lmZGVmIF9MUDY0CiAgIEFzc2VtYmxlcjo6c3JseChzMSwgczIsIGQpOwogI2Vsc2UKLSAgQXNzZW1ibGVyOjpzcmwoczEsIHMyLCBkKTsKKyAgQXNzZW1ibGVyOjpzcmwoIHMxLCBzMiwgZCk7CiAjZW5kaWYKIH0KIApAQCAtNDUxLDcgKzQ4Miw3IEBACiAjaWZkZWYgX0xQNjQKICAgQXNzZW1ibGVyOjpzcmx4KHMxLCBpbW02YSwgZCk7CiAjZWxzZQotICBBc3NlbWJsZXI6OnNybChzMSwgaW1tNmEsIGQpOworICBBc3NlbWJsZXI6OnNybCggczEsIGltbTZhLCBkKTsKICNlbmRpZgogfQogCkBAIC01NDEsOSArNTcyLDggQEAKICAgZGlzcCA9IChpbnRwdHJfdClkIC0gKGludHB0cl90KXBjKCk7CiAgIGlmICggZGlzcCAhPSAoaW50cHRyX3QpKGludDMyX3QpZGlzcCApIHsKICAgICByZWxvY2F0ZShydCk7Ci0gICAgQWRkcmVzcyBkZXN0KE83LCAoYWRkcmVzcylkKTsKLSAgICBzZXRoaShkZXN0LCAvKkZvcmNlUmVsb2NhdGFibGU9Ki8gdHJ1ZSk7Ci0gICAgam1wbChkZXN0LCBPNyk7CisgICAgQWRkcmVzc0xpdGVyYWwgZGVzdChkKTsKKyAgICBqdW1wbF90byhkZXN0LCBPNywgTzcpOwogICB9CiAgIGVsc2UgewogICAgIEFzc2VtYmxlcjo6Y2FsbCggZCwgcnQgKTsKQEAgLTYwMyw5NiArNjMzLDcyIEBACiAgIHJldHVybiB0aGVwYzsKIH0KIAotaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxvYWRfYWRkcmVzcyggQWRkcmVzcyYgYSwgaW50IG9mZnNldCApIHsKKworaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxvYWRfY29udGVudHMoQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQpIHsKICAgYXNzZXJ0X25vdF9kZWxheWVkKCk7Ci0jaWZkZWYgX0xQNjQKLSAgc2V0aGkoYSk7Ci0gIGFkZChhLCBhLmJhc2UoKSwgb2Zmc2V0KTsKLSNlbHNlCi0gIGlmIChhLmhpKCkgPT0gMCAmJiBhLnJ0eXBlKCkgPT0gcmVsb2NJbmZvOjpub25lKSB7Ci0gICAgc2V0KGEuZGlzcCgpICsgb2Zmc2V0LCBhLmJhc2UoKSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc2V0aGkoYSk7Ci0gICAgYWRkKGEsIGEuYmFzZSgpLCBvZmZzZXQpOwotICB9Ci0jZW5kaWYKKyAgc2V0aGkoYWRkcmxpdCwgZCk7CisgIGxkKGQsIGFkZHJsaXQubG93MTAoKSArIG9mZnNldCwgZCk7CiB9CiAKIAotaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnNwbGl0X2Rpc3AoIEFkZHJlc3MmIGEsIFJlZ2lzdGVyIHRlbXAgKSB7CitpbmxpbmUgdm9pZCBNYWNyb0Fzc2VtYmxlcjo6bG9hZF9wdHJfY29udGVudHMoQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQpIHsKICAgYXNzZXJ0X25vdF9kZWxheWVkKCk7Ci0gIGEgPSBhLnNwbGl0X2Rpc3AoKTsKLSAgQXNzZW1ibGVyOjpzZXRoaShhLmhpKCksIHRlbXAsIGEucnNwZWMoKSk7Ci0gIGFkZChhLmJhc2UoKSwgdGVtcCwgYS5iYXNlKCkpOworICBzZXRoaShhZGRybGl0LCBkKTsKKyAgbGRfcHRyKGQsIGFkZHJsaXQubG93MTAoKSArIG9mZnNldCwgZCk7CiB9CiAKIAotaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OmxvYWRfY29udGVudHMoIEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7CitpbmxpbmUgdm9pZCBNYWNyb0Fzc2VtYmxlcjo6c3RvcmVfY29udGVudHMoUmVnaXN0ZXIgcywgQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIHRlbXAsIGludCBvZmZzZXQpIHsKICAgYXNzZXJ0X25vdF9kZWxheWVkKCk7Ci0gIHNldGhpKGEpOwotICBsZChhLCBkLCBvZmZzZXQpOworICBzZXRoaShhZGRybGl0LCB0ZW1wKTsKKyAgc3QocywgdGVtcCwgYWRkcmxpdC5sb3cxMCgpICsgb2Zmc2V0KTsKIH0KIAogCi1pbmxpbmUgdm9pZCBNYWNyb0Fzc2VtYmxlcjo6bG9hZF9wdHJfY29udGVudHMoIEFkZHJlc3MmIGEsIFJlZ2lzdGVyIGQsIGludCBvZmZzZXQgKSB7CitpbmxpbmUgdm9pZCBNYWNyb0Fzc2VtYmxlcjo6c3RvcmVfcHRyX2NvbnRlbnRzKFJlZ2lzdGVyIHMsIEFkZHJlc3NMaXRlcmFsJiBhZGRybGl0LCBSZWdpc3RlciB0ZW1wLCBpbnQgb2Zmc2V0KSB7CiAgIGFzc2VydF9ub3RfZGVsYXllZCgpOwotICBzZXRoaShhKTsKLSAgbGRfcHRyKGEsIGQsIG9mZnNldCk7Ci19Ci0KLQotaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnN0b3JlX2NvbnRlbnRzKCBSZWdpc3RlciBzLCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0ICkgewotICBhc3NlcnRfbm90X2RlbGF5ZWQoKTsKLSAgc2V0aGkoYSk7Ci0gIHN0KHMsIGEsIG9mZnNldCk7Ci19Ci0KLQotaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnN0b3JlX3B0cl9jb250ZW50cyggUmVnaXN0ZXIgcywgQWRkcmVzcyYgYSwgaW50IG9mZnNldCApIHsKLSAgYXNzZXJ0X25vdF9kZWxheWVkKCk7Ci0gIHNldGhpKGEpOwotICBzdF9wdHIocywgYSwgb2Zmc2V0KTsKKyAgc2V0aGkoYWRkcmxpdCwgdGVtcCk7CisgIHN0X3B0cihzLCB0ZW1wLCBhZGRybGl0LmxvdzEwKCkgKyBvZmZzZXQpOwogfQogCiAKIC8vIFRoaXMgY29kZSBzZXF1ZW5jZSBpcyByZWxvY2F0YWJsZSB0byBhbnkgYWRkcmVzcywgZXZlbiBvbiBMUDY0LgotaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6Omp1bXBsX3RvKCBBZGRyZXNzJiBhLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0ICkgeworaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6Omp1bXBsX3RvKEFkZHJlc3NMaXRlcmFsJiBhZGRybGl0LCBSZWdpc3RlciB0ZW1wLCBSZWdpc3RlciBkLCBpbnQgb2Zmc2V0KSB7CiAgIGFzc2VydF9ub3RfZGVsYXllZCgpOwogICAvLyBGb3JjZSBmaXhlZCBsZW5ndGggc2V0aGkgYmVjYXVzZSBOYXRpdmVKdW1wIGFuZCBOYXRpdmVGYXJDYWxsIGRvbid0IGhhbmRsZQogICAvLyB2YXJpYWJsZSBsZW5ndGggaW5zdHJ1Y3Rpb24gc3RyZWFtcy4KLSAgc2V0aGkoYSwgLypGb3JjZVJlbG9jYXRhYmxlPSovIHRydWUpOwotICBqbXBsKGEsIGQsIG9mZnNldCk7CisgIHBhdGNoYWJsZV9zZXRoaShhZGRybGl0LCB0ZW1wKTsKKyAgam1wbCh0ZW1wLCBhZGRybGl0LmxvdzEwKCkgKyBvZmZzZXQsIGQpOwogfQogCiAKLWlubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpqdW1wX3RvKCBBZGRyZXNzJiBhLCBpbnQgb2Zmc2V0ICkgewotICBqdW1wbF90byggYSwgRzAsIG9mZnNldCApOworaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6Omp1bXBfdG8oQWRkcmVzc0xpdGVyYWwmIGFkZHJsaXQsIFJlZ2lzdGVyIHRlbXAsIGludCBvZmZzZXQpIHsKKyAganVtcGxfdG8oYWRkcmxpdCwgdGVtcCwgRzAsIG9mZnNldCk7CiB9CiAKIAotaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6Omp1bXBfaW5kaXJlY3RfdG8oICBBZGRyZXNzJiBhLCBSZWdpc3RlciB0ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGRfb2Zmc2V0LCBpbnQgam1wX29mZnNldCApIHsKK2lubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpqdW1wX2luZGlyZWN0X3RvKEFkZHJlc3MmIGEsIFJlZ2lzdGVyIHRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGRfb2Zmc2V0LCBpbnQgam1wX29mZnNldCkgewogICBhc3NlcnRfbm90X2RlbGF5ZWQoKTsKLSAgLy9zZXRoaShhKTsgICAgICAgICAgICAgICAgICAgLy8gc2V0aGkgaXMgY2FsbGVyIHJlc3BvbnNpYmlsaXR5IGZvciB0aGlzIG9uZQorICAvL3NldGhpKGFsKTsgICAgICAgICAgICAgICAgICAgLy8gc2V0aGkgaXMgY2FsbGVyIHJlc3BvbnNpYmlsaXR5IGZvciB0aGlzIG9uZQogICBsZF9wdHIoYSwgdGVtcCwgbGRfb2Zmc2V0KTsKICAgam1wKHRlbXAsIGptcF9vZmZzZXQpOwogfQogCiAKLWlubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpzZXRfb29wKCBqb2JqZWN0IG9iaiwgUmVnaXN0ZXIgZCApIHsKLSAgc2V0X29vcChhbGxvY2F0ZV9vb3BfYWRkcmVzcyhvYmosIGQpKTsKK2lubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpzZXRfb29wKGpvYmplY3Qgb2JqLCBSZWdpc3RlciBkKSB7CisgIHNldF9vb3AoYWxsb2NhdGVfb29wX2FkZHJlc3Mob2JqKSwgZCk7CiB9CiAKIAotaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnNldF9vb3BfY29uc3RhbnQoIGpvYmplY3Qgb2JqLCBSZWdpc3RlciBkICkgewotICBzZXRfb29wKGNvbnN0YW50X29vcF9hZGRyZXNzKG9iaiwgZCkpOworaW5saW5lIHZvaWQgTWFjcm9Bc3NlbWJsZXI6OnNldF9vb3BfY29uc3RhbnQoam9iamVjdCBvYmosIFJlZ2lzdGVyIGQpIHsKKyAgc2V0X29vcChjb25zdGFudF9vb3BfYWRkcmVzcyhvYmopLCBkKTsKIH0KIAogCi1pbmxpbmUgdm9pZCBNYWNyb0Fzc2VtYmxlcjo6c2V0X29vcCggQWRkcmVzcyBvYmpfYWRkciApIHsKLSAgYXNzZXJ0KG9ial9hZGRyLnJzcGVjKCkudHlwZSgpPT1yZWxvY0luZm86Om9vcF90eXBlLCAibXVzdCBiZSBhbiBvb3AgcmVsb2MiKTsKLSAgbG9hZF9hZGRyZXNzKG9ial9hZGRyKTsKK2lubGluZSB2b2lkIE1hY3JvQXNzZW1ibGVyOjpzZXRfb29wKEFkZHJlc3NMaXRlcmFsJiBvYmpfYWRkciwgUmVnaXN0ZXIgZCkgeworICBhc3NlcnQob2JqX2FkZHIucnNwZWMoKS50eXBlKCkgPT0gcmVsb2NJbmZvOjpvb3BfdHlwZSwgIm11c3QgYmUgYW4gb29wIHJlbG9jIik7CisgIHNldChvYmpfYWRkciwgZCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2MxX0NvZGVTdHVic19zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfQ29kZVN0dWJzX3NwYXJjLmNwcAppbmRleCA4N2E0MTFkLi5kNWVhN2RkIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfQ29kZVN0dWJzX3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfQ29kZVN0dWJzX3NwYXJjLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMTk5OS0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMTk5OS0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3NywxMCArMjc3LDExIEBACiAKICAgaWYgKF9pZCA9PSBsb2FkX2tsYXNzX2lkKSB7CiAgICAgLy8gcHJvZHVjZSBhIGNvcHkgb2YgdGhlIGxvYWQga2xhc3MgaW5zdHJ1Y3Rpb24gZm9yIHVzZSBieSB0aGUgYmVpbmcgaW5pdGlhbGl6ZWQgY2FzZQorI2lmZGVmIEFTU0VSVAogICAgIGFkZHJlc3Mgc3RhcnQgPSBfXyBwYygpOwotICAgIEFkZHJlc3MgYWRkciA9IEFkZHJlc3MoX29iaiwgYWRkcmVzcyhOVUxMKSwgb29wX1JlbG9jYXRpb246OnNwZWMoX29vcF9pbmRleCkpOwotICAgIF9fIHNldGhpKGFkZHIsIHRydWUpOwotICAgIF9fIGFkZChhZGRyLCBfb2JqLCAwKTsKKyNlbmRpZgorICAgIEFkZHJlc3NMaXRlcmFsIGFkZHJsaXQoTlVMTCwgb29wX1JlbG9jYXRpb246OnNwZWMoX29vcF9pbmRleCkpOworICAgIF9fIHBhdGNoYWJsZV9zZXQoYWRkcmxpdCwgX29iaik7CiAKICNpZmRlZiBBU1NFUlQKICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9ieXRlc190b19jb3B5OyBpKyspIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jMV9GcmFtZU1hcF9zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfRnJhbWVNYXBfc3BhcmMuY3BwCmluZGV4IDdiYmYxMDcuLmZiZGY0NTUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jMV9GcmFtZU1hcF9zcGFyYy5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2MxX0ZyYW1lTWFwX3NwYXJjLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMTk5OS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMTk5OS0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMyNyw3ICszMjcsNyBAQAogCiAKIEFkZHJlc3MgRnJhbWVNYXA6Om1ha2VfbmV3X2FkZHJlc3MoQnl0ZVNpemUgc3Bfb2Zmc2V0KSBjb25zdCB7Ci0gIHJldHVybiBBZGRyZXNzKFNQLCAwLCBTVEFDS19CSUFTICsgaW5fYnl0ZXMoc3Bfb2Zmc2V0KSk7CisgIHJldHVybiBBZGRyZXNzKFNQLCBTVEFDS19CSUFTICsgaW5fYnl0ZXMoc3Bfb2Zmc2V0KSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2MxX0xJUkFzc2VtYmxlcl9zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfTElSQXNzZW1ibGVyX3NwYXJjLmNwcAppbmRleCAxZThjMTkwLi45ZTkxYzFkIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfTElSQXNzZW1ibGVyX3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfTElSQXNzZW1ibGVyX3NwYXJjLmNwcApAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgICAvLyB2ZXJpZnkgdGhlIGludGVycHJldGVyJ3MgbW9uaXRvciBoYXMgYSBub24tbnVsbCBvYmplY3QKICAgICAgIHsKICAgICAgICAgTGFiZWwgTDsKLSAgICAgICAgX18gbGRfcHRyKEFkZHJlc3MoT1NSX2J1ZiwgMCwgc2xvdF9vZmZzZXQgKyBCYXNpY09iamVjdExvY2s6Om9ial9vZmZzZXRfaW5fYnl0ZXMoKSksIE83KTsKKyAgICAgICAgX18gbGRfcHRyKE9TUl9idWYsIHNsb3Rfb2Zmc2V0ICsgQmFzaWNPYmplY3RMb2NrOjpvYmpfb2Zmc2V0X2luX2J5dGVzKCksIE83KTsKICAgICAgICAgX18gY21wKEcwLCBPNyk7CiAgICAgICAgIF9fIGJyKEFzc2VtYmxlcjo6bm90RXF1YWwsIGZhbHNlLCBBc3NlbWJsZXI6OnB0LCBMKTsKICAgICAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKQEAgLTIwNSw5ICsyMDUsOSBAQAogICAgICAgfQogI2VuZGlmIC8vIEFTU0VSVAogICAgICAgLy8gQ29weSB0aGUgbG9jayBmaWVsZCBpbnRvIHRoZSBjb21waWxlZCBhY3RpdmF0aW9uLgotICAgICAgX18gbGRfcHRyKEFkZHJlc3MoT1NSX2J1ZiwgMCwgc2xvdF9vZmZzZXQgKyBCYXNpY09iamVjdExvY2s6OmxvY2tfb2Zmc2V0X2luX2J5dGVzKCkpLCBPNyk7CisgICAgICBfXyBsZF9wdHIoT1NSX2J1Ziwgc2xvdF9vZmZzZXQgKyBCYXNpY09iamVjdExvY2s6OmxvY2tfb2Zmc2V0X2luX2J5dGVzKCksIE83KTsKICAgICAgIF9fIHN0X3B0cihPNywgZnJhbWVfbWFwKCktPmFkZHJlc3NfZm9yX21vbml0b3JfbG9jayhpKSk7Ci0gICAgICBfXyBsZF9wdHIoQWRkcmVzcyhPU1JfYnVmLCAwLCBzbG90X29mZnNldCArIEJhc2ljT2JqZWN0TG9jazo6b2JqX29mZnNldF9pbl9ieXRlcygpKSwgTzcpOworICAgICAgX18gbGRfcHRyKE9TUl9idWYsIHNsb3Rfb2Zmc2V0ICsgQmFzaWNPYmplY3RMb2NrOjpvYmpfb2Zmc2V0X2luX2J5dGVzKCksIE83KTsKICAgICAgIF9fIHN0X3B0cihPNywgZnJhbWVfbWFwKCktPmFkZHJlc3NfZm9yX21vbml0b3Jfb2JqZWN0KGkpKTsKICAgICB9CiAgIH0KQEAgLTIzOCwyMSArMjM4LDIxIEBACiAgICAgaW50IG9mZnNldF9vZmZzZXQgPSBqYXZhX2xhbmdfU3RyaW5nOjpvZmZzZXRfb2Zmc2V0X2luX2J5dGVzKCk7IC8vIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbgogICAgIGludCAgY291bnRfb2Zmc2V0ID0gamF2YV9sYW5nX1N0cmluZzo6IGNvdW50X29mZnNldF9pbl9ieXRlcygpOwogCi0gICAgX18gbGRfcHRyKEFkZHJlc3Moc3RyMCwgMCwgIHZhbHVlX29mZnNldCksIHRtcDApOwotICAgIF9fIGxkKEFkZHJlc3Moc3RyMCwgMCwgb2Zmc2V0X29mZnNldCksIHRtcDIpOworICAgIF9fIGxkX3B0cihzdHIwLCB2YWx1ZV9vZmZzZXQsIHRtcDApOworICAgIF9fIGxkKHN0cjAsIG9mZnNldF9vZmZzZXQsIHRtcDIpOwogICAgIF9fIGFkZCh0bXAwLCBhcnJheU9vcERlc2M6OmJhc2Vfb2Zmc2V0X2luX2J5dGVzKFRfQ0hBUiksIHRtcDApOwotICAgIF9fIGxkKEFkZHJlc3Moc3RyMCwgMCwgY291bnRfb2Zmc2V0KSwgc3RyMCk7CisgICAgX18gbGQoc3RyMCwgY291bnRfb2Zmc2V0LCBzdHIwKTsKICAgICBfXyBzbGwodG1wMiwgZXhhY3RfbG9nMihzaXplb2YoamNoYXIpKSwgdG1wMik7CiAKICAgICAvLyBzdHIxIG1heSBiZSBudWxsCiAgICAgYWRkX2RlYnVnX2luZm9fZm9yX251bGxfY2hlY2tfaGVyZShpbmZvKTsKIAotICAgIF9fIGxkX3B0cihBZGRyZXNzKHN0cjEsIDAsICB2YWx1ZV9vZmZzZXQpLCB0bXAxKTsKKyAgICBfXyBsZF9wdHIoc3RyMSwgdmFsdWVfb2Zmc2V0LCB0bXAxKTsKICAgICBfXyBhZGQodG1wMCwgdG1wMiwgdG1wMCk7CiAKLSAgICBfXyBsZChBZGRyZXNzKHN0cjEsIDAsIG9mZnNldF9vZmZzZXQpLCB0bXAyKTsKKyAgICBfXyBsZChzdHIxLCBvZmZzZXRfb2Zmc2V0LCB0bXAyKTsKICAgICBfXyBhZGQodG1wMSwgYXJyYXlPb3BEZXNjOjpiYXNlX29mZnNldF9pbl9ieXRlcyhUX0NIQVIpLCB0bXAxKTsKLSAgICBfXyBsZChBZGRyZXNzKHN0cjEsIDAsIGNvdW50X29mZnNldCksIHN0cjEpOworICAgIF9fIGxkKHN0cjEsIGNvdW50X29mZnNldCwgc3RyMSk7CiAgICAgX18gc2xsKHRtcDIsIGV4YWN0X2xvZzIoc2l6ZW9mKGpjaGFyKSksIHRtcDIpOwogICAgIF9fIHN1YmNjKHN0cjAsIHN0cjEsIE83KTsKICAgICBfXyBhZGQodG1wMSwgdG1wMiwgdG1wMSk7CkBAIC00MTIsOSArNDEyLDkgQEAKICNlbmRpZiAvLyBBU1NFUlQKICAgY29tcGlsYXRpb24oKS0+b2Zmc2V0cygpLT5zZXRfdmFsdWUoQ29kZU9mZnNldHM6OkRlb3B0LCBjb2RlX29mZnNldCgpKTsKIAotICBBZGRyZXNzIGRlb3B0X2Jsb2IoRzNfc2NyYXRjaCwgU2hhcmVkUnVudGltZTo6ZGVvcHRfYmxvYigpLT51bnBhY2soKSk7CisgIEFkZHJlc3NMaXRlcmFsIGRlb3B0X2Jsb2IoU2hhcmVkUnVudGltZTo6ZGVvcHRfYmxvYigpLT51bnBhY2soKSk7CiAKLSAgX18gSlVNUChkZW9wdF9ibG9iLCAwKTsgLy8gc2V0aGk7am1wCisgIF9fIEpVTVAoZGVvcHRfYmxvYiwgRzNfc2NyYXRjaCwgMCk7IC8vIHNldGhpO2ptcAogICBfXyBkZWxheWVkKCktPm5vcCgpOwogCiAgIGFzc2VydChjb2RlX29mZnNldCgpIC0gb2Zmc2V0IDw9IGRlb3B0X2hhbmRsZXJfc2l6ZSwgIm92ZXJmbG93Iik7CkBAIC00NDEsMTMgKzQ0MSwxMiBAQAogICBpbnQgb29wX2luZGV4ID0gX18gb29wX3JlY29yZGVyKCktPmFsbG9jYXRlX2luZGV4KChqb2JqZWN0KU5VTEwpOwogICBQYXRjaGluZ1N0dWIqIHBhdGNoID0gbmV3IFBhdGNoaW5nU3R1YihfbWFzbSwgUGF0Y2hpbmdTdHViOjpsb2FkX2tsYXNzX2lkLCBvb3BfaW5kZXgpOwogCi0gIEFkZHJlc3MgYWRkciA9IEFkZHJlc3MocmVnLCBhZGRyZXNzKE5VTEwpLCBvb3BfUmVsb2NhdGlvbjo6c3BlYyhvb3BfaW5kZXgpKTsKLSAgYXNzZXJ0KGFkZHIucnNwZWMoKS50eXBlKCkgPT0gcmVsb2NJbmZvOjpvb3BfdHlwZSwgIm11c3QgYmUgYW4gb29wIHJlbG9jIik7CisgIEFkZHJlc3NMaXRlcmFsIGFkZHJsaXQoTlVMTCwgb29wX1JlbG9jYXRpb246OnNwZWMob29wX2luZGV4KSk7CisgIGFzc2VydChhZGRybGl0LnJzcGVjKCkudHlwZSgpID09IHJlbG9jSW5mbzo6b29wX3R5cGUsICJtdXN0IGJlIGFuIG9vcCByZWxvYyIpOwogICAvLyBJdCBtYXkgbm90IHNlZW0gbmVjZXNzYXJ5IHRvIHVzZSBhIHNldGhpL2FkZCBwYWlyIHRvIGxvYWQgYSBOVUxMIGludG8gZGVzdCwgYnV0IHRoZQogICAvLyBOVUxMIHdpbGwgYmUgZHluYW1pY2FsbHkgcGF0Y2hlZCBsYXRlciBhbmQgdGhlIHBhdGNoZWQgdmFsdWUgbWF5IGJlIGxhcmdlLiAgV2UgbXVzdAogICAvLyB0aGVyZWZvcmUgZ2VuZXJhdGUgdGhlIHNldGhpL2FkZCBhcyBhIHBsYWNlaG9sZGVycwotICBfXyBzZXRoaShhZGRyLCB0cnVlKTsKLSAgX18gYWRkKGFkZHIsIHJlZywgMCk7CisgIF9fIHBhdGNoYWJsZV9zZXQoYWRkcmxpdCwgcmVnKTsKIAogICBwYXRjaGluZ19lcGlsb2cocGF0Y2gsIGxpcl9wYXRjaF9ub3JtYWwsIHJlZywgaW5mbyk7CiB9CkBAIC03MDYsNyArNzA1LDcgQEAKIAogdm9pZCBMSVJfQXNzZW1ibGVyOjp2dGFibGVfY2FsbChpbnQgdnRhYmxlX29mZnNldCwgQ29kZUVtaXRJbmZvKiBpbmZvKSB7CiAgIGFkZF9kZWJ1Z19pbmZvX2Zvcl9udWxsX2NoZWNrX2hlcmUoaW5mbyk7Ci0gIF9fIGxkX3B0cihBZGRyZXNzKE8wLCAwLCAgb29wRGVzYzo6a2xhc3Nfb2Zmc2V0X2luX2J5dGVzKCkpLCBHM19zY3JhdGNoKTsKKyAgX18gbGRfcHRyKE8wLCBvb3BEZXNjOjprbGFzc19vZmZzZXRfaW5fYnl0ZXMoKSwgRzNfc2NyYXRjaCk7CiAgIGlmIChfXyBpc19zaW1tMTModnRhYmxlX29mZnNldCkgKSB7CiAgICAgX18gbGRfcHRyKEczX3NjcmF0Y2gsIHZ0YWJsZV9vZmZzZXQsIEc1X21ldGhvZCk7CiAgIH0gZWxzZSB7CkBAIC03MTUsNyArNzE0LDcgQEAKICAgICAvLyBsZF9wdHIsIHNldF9oaSwgc2V0CiAgICAgX18gbGRfcHRyKEczX3NjcmF0Y2gsIEc1X21ldGhvZCwgRzVfbWV0aG9kKTsKICAgfQotICBfXyBsZF9wdHIoRzVfbWV0aG9kLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpmcm9tX2NvbXBpbGVkX29mZnNldCgpKSwgRzNfc2NyYXRjaCk7CisgIF9fIGxkX3B0cihHNV9tZXRob2QsIG1ldGhvZE9vcERlc2M6OmZyb21fY29tcGlsZWRfb2Zmc2V0KCksIEczX3NjcmF0Y2gpOwogICBfXyBjYWxscihHM19zY3JhdGNoLCBHMCk7CiAgIC8vIHRoZSBwZWVwaG9sZSBwYXNzIGZpbGxzIHRoZSBkZWxheSBzbG90CiB9CkBAIC03MzgsOCArNzM3LDcgQEAKICAgICAgIGRlZmF1bHQgICAgICA6IFNob3VsZE5vdFJlYWNoSGVyZSgpOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBfXyBzZXRoaShkaXNwICYgfjB4M2ZmLCBPNywgdHJ1ZSk7Ci0gICAgX18gYWRkKE83LCBkaXNwICYgMHgzZmYsIE83KTsKKyAgICBfXyBzZXQoZGlzcCwgTzcpOwogICAgIGlmIChpbmZvICE9IE5VTEwpIGFkZF9kZWJ1Z19pbmZvX2Zvcl9udWxsX2NoZWNrX2hlcmUoaW5mbyk7CiAgICAgbG9hZF9vZmZzZXQgPSBjb2RlX29mZnNldCgpOwogICAgIHN3aXRjaChsZF90eXBlKSB7CkBAIC03NzUsOCArNzczLDcgQEAKICAgICAgIGRlZmF1bHQgICAgICA6IFNob3VsZE5vdFJlYWNoSGVyZSgpOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBfXyBzZXRoaShvZmZzZXQgJiB+MHgzZmYsIE83LCB0cnVlKTsKLSAgICBfXyBhZGQoTzcsIG9mZnNldCAmIDB4M2ZmLCBPNyk7CisgICAgX18gc2V0KG9mZnNldCwgTzcpOwogICAgIGlmIChpbmZvICE9IE5VTEwpIGFkZF9kZWJ1Z19pbmZvX2Zvcl9udWxsX2NoZWNrX2hlcmUoaW5mbyk7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICBjYXNlIFRfQk9PTEVBTjogLy8gZmFsbCB0aHJvdWdoCkBAIC04MTMsOCArODEwLDcgQEAKICAgICAgIF9fIGxkZih3LCBzLCBkaXNwLCBkKTsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgX18gc2V0aGkoZGlzcCAmIH4weDNmZiwgTzcsIHRydWUpOwotICAgIF9fIGFkZChPNywgZGlzcCAmIDB4M2ZmLCBPNyk7CisgICAgX18gc2V0KGRpc3AsIE83KTsKICAgICBpZiAoaW5mbyAhPSBOVUxMKSBhZGRfZGVidWdfaW5mb19mb3JfbnVsbF9jaGVja19oZXJlKGluZm8pOwogICAgIF9fIGxkZih3LCBzLCBPNywgZCk7CiAgIH0KQEAgLTgzOSw4ICs4MzUsNyBAQAogICAgICAgX18gc3RmKHcsIHZhbHVlLCBiYXNlLCBvZmZzZXQpOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBfXyBzZXRoaShvZmZzZXQgJiB+MHgzZmYsIE83LCB0cnVlKTsKLSAgICBfXyBhZGQoTzcsIG9mZnNldCAmIDB4M2ZmLCBPNyk7CisgICAgX18gc2V0KG9mZnNldCwgTzcpOwogICAgIGlmIChpbmZvICE9IE5VTEwpIGFkZF9kZWJ1Z19pbmZvX2Zvcl9udWxsX2NoZWNrX2hlcmUoaW5mbyk7CiAgICAgX18gc3RmKHcsIHZhbHVlLCBPNywgYmFzZSk7CiAgIH0KQEAgLTg1Miw4ICs4NDcsNyBAQAogICBpZiAoIUFzc2VtYmxlcjo6aXNfc2ltbTEzKG9mZnNldCArICh0eXBlID09IFRfTE9ORykgPyB3b3JkU2l6ZSA6IDApKSB7CiAgICAgYXNzZXJ0KCF1bmFsaWduZWQsICJjYW4ndCBoYW5kbGUgdGhpcyIpOwogICAgIC8vIGZvciBvZmZzZXRzIGxhcmdlciB0aGFuIGEgc2ltbTEzIHdlIHNldHVwIHRoZSBvZmZzZXQgaW4gTzcKLSAgICBfXyBzZXRoaShvZmZzZXQgJiB+MHgzZmYsIE83LCB0cnVlKTsKLSAgICBfXyBhZGQoTzcsIG9mZnNldCAmIDB4M2ZmLCBPNyk7CisgICAgX18gc2V0KG9mZnNldCwgTzcpOwogICAgIHN0b3JlX29mZnNldCA9IHN0b3JlKGZyb21fcmVnLCBiYXNlLCBPNywgdHlwZSk7CiAgIH0gZWxzZSB7CiAgICAgaWYgKHR5cGUgPT0gVF9BUlJBWSB8fCB0eXBlID09IFRfT0JKRUNUKSBfXyB2ZXJpZnlfb29wKGZyb21fcmVnLT5hc19yZWdpc3RlcigpKTsKQEAgLTkzNyw4ICs5MzEsNyBAQAogICAgIGFzc2VydChiYXNlICE9IE83LCAiZGVzdHJveWluZyByZWdpc3RlciIpOwogICAgIGFzc2VydCghdW5hbGlnbmVkLCAiY2FuJ3QgaGFuZGxlIHRoaXMiKTsKICAgICAvLyBmb3Igb2Zmc2V0cyBsYXJnZXIgdGhhbiBhIHNpbW0xMyB3ZSBzZXR1cCB0aGUgb2Zmc2V0IGluIE83Ci0gICAgX18gc2V0aGkob2Zmc2V0ICYgfjB4M2ZmLCBPNywgdHJ1ZSk7Ci0gICAgX18gYWRkKE83LCBvZmZzZXQgJiAweDNmZiwgTzcpOworICAgIF9fIHNldChvZmZzZXQsIE83KTsKICAgICBsb2FkX29mZnNldCA9IGxvYWQoYmFzZSwgTzcsIHRvX3JlZywgdHlwZSk7CiAgIH0gZWxzZSB7CiAgICAgbG9hZF9vZmZzZXQgPSBjb2RlX29mZnNldCgpOwpAQCAtMTIxMyw3ICsxMjA2LDcgQEAKICAgICAgICAgICBhc3NlcnQodG9fcmVnLT5pc19zaW5nbGVfZnB1KCksICJ3cm9uZyByZWdpc3RlciBraW5kIik7CiAKICAgICAgICAgICBfXyBzZXQoY29uLCBPNyk7Ci0gICAgICAgICAgQWRkcmVzcyB0ZW1wX3Nsb3QoU1AsIDAsIChmcmFtZTo6cmVnaXN0ZXJfc2F2ZV93b3JkcyAqIHdvcmRTaXplKSArIFNUQUNLX0JJQVMpOworICAgICAgICAgIEFkZHJlc3MgdGVtcF9zbG90KFNQLCAoZnJhbWU6OnJlZ2lzdGVyX3NhdmVfd29yZHMgKiB3b3JkU2l6ZSkgKyBTVEFDS19CSUFTKTsKICAgICAgICAgICBfXyBzdChPNywgdGVtcF9zbG90KTsKICAgICAgICAgICBfXyBsZGYoRmxvYXRSZWdpc3RlckltcGw6OlMsIHRlbXBfc2xvdCwgdG9fcmVnLT5hc19mbG9hdF9yZWcoKSk7CiAgICAgICAgIH0KQEAgLTEyMzgsOCArMTIzMSw4IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7CiAgICAgICAgICAgYXNzZXJ0KHRvX3JlZy0+aXNfZG91YmxlX2ZwdSgpLCAid3JvbmcgcmVnaXN0ZXIga2luZCIpOwotICAgICAgICAgIEFkZHJlc3MgdGVtcF9zbG90X2xvKFNQLCAwLCAoKGZyYW1lOjpyZWdpc3Rlcl9zYXZlX3dvcmRzICApICogd29yZFNpemUpICsgU1RBQ0tfQklBUyk7Ci0gICAgICAgICAgQWRkcmVzcyB0ZW1wX3Nsb3RfaGkoU1AsIDAsICgoZnJhbWU6OnJlZ2lzdGVyX3NhdmVfd29yZHMpICogd29yZFNpemUpICsgKGxvbmdTaXplLzIpICsgU1RBQ0tfQklBUyk7CisgICAgICAgICAgQWRkcmVzcyB0ZW1wX3Nsb3RfbG8oU1AsICgoZnJhbWU6OnJlZ2lzdGVyX3NhdmVfd29yZHMgICkgKiB3b3JkU2l6ZSkgKyBTVEFDS19CSUFTKTsKKyAgICAgICAgICBBZGRyZXNzIHRlbXBfc2xvdF9oaShTUCwgKChmcmFtZTo6cmVnaXN0ZXJfc2F2ZV93b3JkcykgKiB3b3JkU2l6ZSkgKyAobG9uZ1NpemUvMikgKyBTVEFDS19CSUFTKTsKICAgICAgICAgICBfXyBzZXQobG93KGNvbiksICBPNyk7CiAgICAgICAgICAgX18gc3QoTzcsIHRlbXBfc2xvdF9sbyk7CiAgICAgICAgICAgX18gc2V0KGhpZ2goY29uKSwgTzcpOwpAQCAtMTI2NywxNyArMTI2MCwxNiBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIFJlbG9jYXRpb25Ib2xkZXIgcnNwZWMgPSBpbnRlcm5hbF93b3JkX1JlbG9jYXRpb246OnNwZWMoY29uc3RfYWRkcik7CisgICAgICAgIEFkZHJlc3NMaXRlcmFsIGNvbnN0X2FkZHJsaXQoY29uc3RfYWRkciwgcnNwZWMpOwogICAgICAgICBpZiAodG9fcmVnLT5pc19zaW5nbGVfZnB1KCkpIHsKLSAgICAgICAgICBfXyBzZXRoaSggIChpbnR4KWNvbnN0X2FkZHIgJiB+MHgzZmYsIE83LCB0cnVlLCByc3BlYyk7CisgICAgICAgICAgX18gcGF0Y2hhYmxlX3NldGhpKGNvbnN0X2FkZHJsaXQsIE83KTsKICAgICAgICAgICBfXyByZWxvY2F0ZShyc3BlYyk7Ci0KLSAgICAgICAgICBpbnQgb2Zmc2V0ID0gKGludHgpY29uc3RfYWRkciAmIDB4M2ZmOwotICAgICAgICAgIF9fIGxkZiAoRmxvYXRSZWdpc3RlckltcGw6OlMsIE83LCBvZmZzZXQsIHRvX3JlZy0+YXNfZmxvYXRfcmVnKCkpOworICAgICAgICAgIF9fIGxkZihGbG9hdFJlZ2lzdGVySW1wbDo6UywgTzcsIGNvbnN0X2FkZHJsaXQubG93MTAoKSwgdG9fcmVnLT5hc19mbG9hdF9yZWcoKSk7CiAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBhc3NlcnQodG9fcmVnLT5pc19zaW5nbGVfY3B1KCksICJNdXN0IGJlIGEgY3B1IHJlZ2lzdGVyLiIpOwogCi0gICAgICAgICAgX18gc2V0KChpbnR4KWNvbnN0X2FkZHIsIE83LCByc3BlYyk7CisgICAgICAgICAgX18gc2V0KGNvbnN0X2FkZHJsaXQsIE83KTsKICAgICAgICAgICBsb2FkKE83LCAwLCB0b19yZWctPmFzX3JlZ2lzdGVyKCksIFRfSU5UKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTI5MywxMCArMTI4NSwxMCBAQAogICAgICAgICBSZWxvY2F0aW9uSG9sZGVyIHJzcGVjID0gaW50ZXJuYWxfd29yZF9SZWxvY2F0aW9uOjpzcGVjKGNvbnN0X2FkZHIpOwogCiAgICAgICAgIGlmICh0b19yZWctPmlzX2RvdWJsZV9mcHUoKSkgewotICAgICAgICAgIF9fIHNldGhpKCAgKGludHgpY29uc3RfYWRkciAmIH4weDNmZiwgTzcsIHRydWUsIHJzcGVjKTsKLSAgICAgICAgICBpbnQgb2Zmc2V0ID0gKGludHgpY29uc3RfYWRkciAmIDB4M2ZmOworICAgICAgICAgIEFkZHJlc3NMaXRlcmFsIGNvbnN0X2FkZHJsaXQoY29uc3RfYWRkciwgcnNwZWMpOworICAgICAgICAgIF9fIHBhdGNoYWJsZV9zZXRoaShjb25zdF9hZGRybGl0LCBPNyk7CiAgICAgICAgICAgX18gcmVsb2NhdGUocnNwZWMpOwotICAgICAgICAgIF9fIGxkZiAoRmxvYXRSZWdpc3RlckltcGw6OkQsIE83LCBvZmZzZXQsIHRvX3JlZy0+YXNfZG91YmxlX3JlZygpKTsKKyAgICAgICAgICBfXyBsZGYgKEZsb2F0UmVnaXN0ZXJJbXBsOjpELCBPNywgY29uc3RfYWRkcmxpdC5sb3cxMCgpLCB0b19yZWctPmFzX2RvdWJsZV9yZWcoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgYXNzZXJ0KHRvX3JlZy0+aXNfZG91YmxlX2NwdSgpLCAiTXVzdCBiZSBhIGxvbmcgcmVnaXN0ZXIuIik7CiAjaWZkZWYgX0xQNjQKQEAgLTEzMTcsNyArMTMwOSw3IEBACiAKIEFkZHJlc3MgTElSX0Fzc2VtYmxlcjo6YXNfQWRkcmVzcyhMSVJfQWRkcmVzcyogYWRkcikgewogICBSZWdpc3RlciByZWcgPSBhZGRyLT5iYXNlKCktPmFzX3JlZ2lzdGVyKCk7Ci0gIHJldHVybiBBZGRyZXNzKHJlZywgMCwgYWRkci0+ZGlzcCgpKTsKKyAgcmV0dXJuIEFkZHJlc3MocmVnLCBhZGRyLT5kaXNwKCkpOwogfQogCiAKQEAgLTEzNjAsMTMgKzEzNTIsMTMgQEAKIAogQWRkcmVzcyBMSVJfQXNzZW1ibGVyOjphc19BZGRyZXNzX2hpKExJUl9BZGRyZXNzKiBhZGRyKSB7CiAgIEFkZHJlc3MgYmFzZSA9IGFzX0FkZHJlc3MoYWRkcik7Ci0gIHJldHVybiBBZGRyZXNzKGJhc2UuYmFzZSgpLCAwLCBiYXNlLmRpc3AoKSArIGhpX3dvcmRfb2Zmc2V0X2luX2J5dGVzKTsKKyAgcmV0dXJuIEFkZHJlc3MoYmFzZS5iYXNlKCksIGJhc2UuZGlzcCgpICsgaGlfd29yZF9vZmZzZXRfaW5fYnl0ZXMpOwogfQogCiAKIEFkZHJlc3MgTElSX0Fzc2VtYmxlcjo6YXNfQWRkcmVzc19sbyhMSVJfQWRkcmVzcyogYWRkcikgewogICBBZGRyZXNzIGJhc2UgPSBhc19BZGRyZXNzKGFkZHIpOwotICByZXR1cm4gQWRkcmVzcyhiYXNlLmJhc2UoKSwgMCwgYmFzZS5kaXNwKCkgKyBsb193b3JkX29mZnNldF9pbl9ieXRlcyk7CisgIHJldHVybiBBZGRyZXNzKGJhc2UuYmFzZSgpLCBiYXNlLmRpc3AoKSArIGxvX3dvcmRfb2Zmc2V0X2luX2J5dGVzKTsKIH0KIAogCkBAIC0xMzk2LDggKzEzODgsNyBAQAogICBpZiAoYWRkci0+aW5kZXgoKS0+aXNfaWxsZWdhbCgpKSB7CiAgICAgaWYgKCFBc3NlbWJsZXI6OmlzX3NpbW0xMyhkaXNwX3ZhbHVlKSAmJiAoIXVuYWxpZ25lZCB8fCBBc3NlbWJsZXI6OmlzX3NpbW0xMyhkaXNwX3ZhbHVlICsgNCkpKSB7CiAgICAgICBpZiAobmVlZHNfcGF0Y2hpbmcpIHsKLSAgICAgICAgX18gc2V0aGkoMCwgTzcsIHRydWUpOwotICAgICAgICBfXyBhZGQoTzcsIDAsIE83KTsKKyAgICAgICAgX18gcGF0Y2hhYmxlX3NldCgwLCBPNyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBfXyBzZXQoZGlzcF92YWx1ZSwgTzcpOwogICAgICAgfQpAQCAtMTU0NCw4ICsxNTM1LDcgQEAKICAgaWYgKGFkZHItPmluZGV4KCktPmlzX2lsbGVnYWwoKSkgewogICAgIGlmICghQXNzZW1ibGVyOjppc19zaW1tMTMoZGlzcF92YWx1ZSkgJiYgKCF1bmFsaWduZWQgfHwgQXNzZW1ibGVyOjppc19zaW1tMTMoZGlzcF92YWx1ZSArIDQpKSkgewogICAgICAgaWYgKG5lZWRzX3BhdGNoaW5nKSB7Ci0gICAgICAgIF9fIHNldGhpKDAsIE83LCB0cnVlKTsKLSAgICAgICAgX18gYWRkKE83LCAwLCBPNyk7CisgICAgICAgIF9fIHBhdGNoYWJsZV9zZXQoMCwgTzcpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgX18gc2V0KGRpc3BfdmFsdWUsIE83KTsKICAgICAgIH0KQEAgLTE2MjcsOCArMTYxNyw4IEBACiAKICAgX18gc2V0X29vcChOVUxMLCBHNSk7CiAgIC8vIG11c3QgYmUgc2V0IHRvIC0xIGF0IGNvZGUgZ2VuZXJhdGlvbiB0aW1lCi0gIEFkZHJlc3MgYShHMywgKGFkZHJlc3MpLTEpOwotICBfXyBqdW1wX3RvKGEsIDApOworICBBZGRyZXNzTGl0ZXJhbCBhZGRybGl0KC0xKTsKKyAgX18ganVtcF90byhhZGRybGl0LCBHMyk7CiAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CiAKICAgYXNzZXJ0KF9fIG9mZnNldCgpIC0gc3RhcnQgPD0gY2FsbF9zdHViX3NpemUsICJzdHViIHRvbyBiaWciKTsKQEAgLTIwNjMsNyArMjA1Myw3IEBACiAgICAgYWRkcmVzcyBwY19mb3JfYXRocm93ICA9IF9fIHBjKCk7CiAgICAgaW50IHBjX2Zvcl9hdGhyb3dfb2Zmc2V0ID0gX18gb2Zmc2V0KCk7CiAgICAgUmVsb2NhdGlvbkhvbGRlciByc3BlYyA9IGludGVybmFsX3dvcmRfUmVsb2NhdGlvbjo6c3BlYyhwY19mb3JfYXRocm93KTsKLSAgICBfXyBzZXQoKGludHB0cl90KXBjX2Zvcl9hdGhyb3csIE9pc3N1aW5nX3BjLCByc3BlYyk7CisgICAgX18gc2V0KHBjX2Zvcl9hdGhyb3csIE9pc3N1aW5nX3BjLCByc3BlYyk7CiAgICAgYWRkX2NhbGxfaW5mbyhwY19mb3JfYXRocm93X29mZnNldCwgaW5mbyk7IC8vIGZvciBleGNlcHRpb24gaGFuZGxlcgogCiAgICAgX18gY2FsbChSdW50aW1lMTo6ZW50cnlfZm9yKFJ1bnRpbWUxOjpoYW5kbGVfZXhjZXB0aW9uX2lkKSwgcmVsb2NJbmZvOjpydW50aW1lX2NhbGxfdHlwZSk7CkBAIC0yNDUxLDcgKzI0NDEsNyBAQAogICAgICAgfQogCiAKLSAgICAgIEFkZHJlc3MgZmxhZ3NfYWRkcihtZG8sIDAsIG1kLT5ieXRlX29mZnNldF9vZl9zbG90KGRhdGEsIERhdGFMYXlvdXQ6OmZsYWdzX29mZnNldCgpKSAtIG1kb19vZmZzZXRfYmlhcyk7CisgICAgICBBZGRyZXNzIGZsYWdzX2FkZHIobWRvLCBtZC0+Ynl0ZV9vZmZzZXRfb2Zfc2xvdChkYXRhLCBEYXRhTGF5b3V0OjpmbGFnc19vZmZzZXQoKSkgLSBtZG9fb2Zmc2V0X2JpYXMpOwogICAgICAgX18gbGR1YihmbGFnc19hZGRyLCBkYXRhX3ZhbCk7CiAgICAgICBfXyBvcjMoZGF0YV92YWwsIEJpdERhdGE6Om51bGxfc2Vlbl9ieXRlX2NvbnN0YW50KCksIGRhdGFfdmFsKTsKICAgICAgIF9fIHN0YihkYXRhX3ZhbCwgZmxhZ3NfYWRkcik7CkBAIC0yNzM4LDcgKzI3MjgsNyBAQAogICAgIF9fIGFkZChtZG8sIE83LCBtZG8pOwogICB9CiAKLSAgQWRkcmVzcyBjb3VudGVyX2FkZHIobWRvLCAwLCBtZC0+Ynl0ZV9vZmZzZXRfb2Zfc2xvdChkYXRhLCBDb3VudGVyRGF0YTo6Y291bnRfb2Zmc2V0KCkpIC0gbWRvX29mZnNldF9iaWFzKTsKKyAgQWRkcmVzcyBjb3VudGVyX2FkZHIobWRvLCBtZC0+Ynl0ZV9vZmZzZXRfb2Zfc2xvdChkYXRhLCBDb3VudGVyRGF0YTo6Y291bnRfb2Zmc2V0KCkpIC0gbWRvX29mZnNldF9iaWFzKTsKICAgX18gbGR1dyhjb3VudGVyX2FkZHIsIHRtcDEpOwogICBfXyBhZGQodG1wMSwgRGF0YUxheW91dDo6Y291bnRlcl9pbmNyZW1lbnQsIHRtcDEpOwogICBfXyBzdHcodG1wMSwgY291bnRlcl9hZGRyKTsKQEAgLTI3NjQsOCArMjc1NCw4IEBACiAgICAgICBmb3IgKGkgPSAwOyBpIDwgVmlydHVhbENhbGxEYXRhOjpyb3dfbGltaXQoKTsgaSsrKSB7CiAgICAgICAgIGNpS2xhc3MqIHJlY2VpdmVyID0gdmNfZGF0YS0+cmVjZWl2ZXIoaSk7CiAgICAgICAgIGlmIChrbm93bl9rbGFzcy0+ZXF1YWxzKHJlY2VpdmVyKSkgewotICAgICAgICAgIEFkZHJlc3MgZGF0YV9hZGRyKG1kbywgMCwgbWQtPmJ5dGVfb2Zmc2V0X29mX3Nsb3QoZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWxDYWxsRGF0YTo6cmVjZWl2ZXJfY291bnRfb2Zmc2V0KGkpKSAtCisgICAgICAgICAgQWRkcmVzcyBkYXRhX2FkZHIobWRvLCBtZC0+Ynl0ZV9vZmZzZXRfb2Zfc2xvdChkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlydHVhbENhbGxEYXRhOjpyZWNlaXZlcl9jb3VudF9vZmZzZXQoaSkpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZG9fb2Zmc2V0X2JpYXMpOwogICAgICAgICAgIF9fIGxkdXcoZGF0YV9hZGRyLCB0bXAxKTsKICAgICAgICAgICBfXyBhZGQodG1wMSwgRGF0YUxheW91dDo6Y291bnRlcl9pbmNyZW1lbnQsIHRtcDEpOwpAQCAtMjc4MiwxMSArMjc3MiwxMSBAQAogICAgICAgZm9yIChpID0gMDsgaSA8IFZpcnR1YWxDYWxsRGF0YTo6cm93X2xpbWl0KCk7IGkrKykgewogICAgICAgICBjaUtsYXNzKiByZWNlaXZlciA9IHZjX2RhdGEtPnJlY2VpdmVyKGkpOwogICAgICAgICBpZiAocmVjZWl2ZXIgPT0gTlVMTCkgewotICAgICAgICAgIEFkZHJlc3MgcmVjdl9hZGRyKG1kbywgMCwgbWQtPmJ5dGVfb2Zmc2V0X29mX3Nsb3QoZGF0YSwgVmlydHVhbENhbGxEYXRhOjpyZWNlaXZlcl9vZmZzZXQoaSkpIC0KKyAgICAgICAgICBBZGRyZXNzIHJlY3ZfYWRkcihtZG8sIG1kLT5ieXRlX29mZnNldF9vZl9zbG90KGRhdGEsIFZpcnR1YWxDYWxsRGF0YTo6cmVjZWl2ZXJfb2Zmc2V0KGkpKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRvX29mZnNldF9iaWFzKTsKICAgICAgICAgICBqb2JqZWN0MnJlZyhrbm93bl9rbGFzcy0+ZW5jb2RpbmcoKSwgdG1wMSk7CiAgICAgICAgICAgX18gc3RfcHRyKHRtcDEsIHJlY3ZfYWRkcik7Ci0gICAgICAgICAgQWRkcmVzcyBkYXRhX2FkZHIobWRvLCAwLCBtZC0+Ynl0ZV9vZmZzZXRfb2Zfc2xvdChkYXRhLCBWaXJ0dWFsQ2FsbERhdGE6OnJlY2VpdmVyX2NvdW50X29mZnNldChpKSkgLQorICAgICAgICAgIEFkZHJlc3MgZGF0YV9hZGRyKG1kbywgbWQtPmJ5dGVfb2Zmc2V0X29mX3Nsb3QoZGF0YSwgVmlydHVhbENhbGxEYXRhOjpyZWNlaXZlcl9jb3VudF9vZmZzZXQoaSkpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZG9fb2Zmc2V0X2JpYXMpOwogICAgICAgICAgIF9fIGxkdXcoZGF0YV9hZGRyLCB0bXAxKTsKICAgICAgICAgICBfXyBhZGQodG1wMSwgRGF0YUxheW91dDo6Y291bnRlcl9pbmNyZW1lbnQsIHRtcDEpOwpAQCAtMjc5NSwyMCArMjc4NSwyMCBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIGxvYWQoQWRkcmVzcyhyZWN2LCAwLCBvb3BEZXNjOjprbGFzc19vZmZzZXRfaW5fYnl0ZXMoKSksIHJlY3YsIFRfT0JKRUNUKTsKKyAgICAgIGxvYWQoQWRkcmVzcyhyZWN2LCBvb3BEZXNjOjprbGFzc19vZmZzZXRfaW5fYnl0ZXMoKSksIHJlY3YsIFRfT0JKRUNUKTsKICAgICAgIExhYmVsIHVwZGF0ZV9kb25lOwogICAgICAgdWludCBpOwogICAgICAgZm9yIChpID0gMDsgaSA8IFZpcnR1YWxDYWxsRGF0YTo6cm93X2xpbWl0KCk7IGkrKykgewogICAgICAgICBMYWJlbCBuZXh0X3Rlc3Q7CiAgICAgICAgIC8vIFNlZSBpZiB0aGUgcmVjZWl2ZXIgaXMgcmVjZWl2ZXJbbl0uCi0gICAgICAgIEFkZHJlc3MgcmVjZWl2ZXJfYWRkcihtZG8sIDAsIG1kLT5ieXRlX29mZnNldF9vZl9zbG90KGRhdGEsIFZpcnR1YWxDYWxsRGF0YTo6cmVjZWl2ZXJfb2Zmc2V0KGkpKSAtCisgICAgICAgIEFkZHJlc3MgcmVjZWl2ZXJfYWRkcihtZG8sIG1kLT5ieXRlX29mZnNldF9vZl9zbG90KGRhdGEsIFZpcnR1YWxDYWxsRGF0YTo6cmVjZWl2ZXJfb2Zmc2V0KGkpKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZG9fb2Zmc2V0X2JpYXMpOwogICAgICAgICBfXyBsZF9wdHIocmVjZWl2ZXJfYWRkciwgdG1wMSk7CiAgICAgICAgIF9fIHZlcmlmeV9vb3AodG1wMSk7CiAgICAgICAgIF9fIGNtcChyZWN2LCB0bXAxKTsKICAgICAgICAgX18gYnJ4KEFzc2VtYmxlcjo6bm90RXF1YWwsIGZhbHNlLCBBc3NlbWJsZXI6OnB0LCBuZXh0X3Rlc3QpOwogICAgICAgICBfXyBkZWxheWVkKCktPm5vcCgpOwotICAgICAgICBBZGRyZXNzIGRhdGFfYWRkcihtZG8sIDAsIG1kLT5ieXRlX29mZnNldF9vZl9zbG90KGRhdGEsIFZpcnR1YWxDYWxsRGF0YTo6cmVjZWl2ZXJfY291bnRfb2Zmc2V0KGkpKSAtCisgICAgICAgIEFkZHJlc3MgZGF0YV9hZGRyKG1kbywgbWQtPmJ5dGVfb2Zmc2V0X29mX3Nsb3QoZGF0YSwgVmlydHVhbENhbGxEYXRhOjpyZWNlaXZlcl9jb3VudF9vZmZzZXQoaSkpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRvX29mZnNldF9iaWFzKTsKICAgICAgICAgX18gbGR1dyhkYXRhX2FkZHIsIHRtcDEpOwogICAgICAgICBfXyBhZGQodG1wMSwgRGF0YUxheW91dDo6Y291bnRlcl9pbmNyZW1lbnQsIHRtcDEpOwpAQCAtMjgyMSw3ICsyODExLDcgQEAKICAgICAgIC8vIERpZG4ndCBmaW5kIHJlY2VpdmVyOyBmaW5kIG5leHQgZW1wdHkgc2xvdCBhbmQgZmlsbCBpdCBpbgogICAgICAgZm9yIChpID0gMDsgaSA8IFZpcnR1YWxDYWxsRGF0YTo6cm93X2xpbWl0KCk7IGkrKykgewogICAgICAgICBMYWJlbCBuZXh0X3Rlc3Q7Ci0gICAgICAgIEFkZHJlc3MgcmVjdl9hZGRyKG1kbywgMCwgbWQtPmJ5dGVfb2Zmc2V0X29mX3Nsb3QoZGF0YSwgVmlydHVhbENhbGxEYXRhOjpyZWNlaXZlcl9vZmZzZXQoaSkpIC0KKyAgICAgICAgQWRkcmVzcyByZWN2X2FkZHIobWRvLCBtZC0+Ynl0ZV9vZmZzZXRfb2Zfc2xvdChkYXRhLCBWaXJ0dWFsQ2FsbERhdGE6OnJlY2VpdmVyX29mZnNldChpKSkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICBtZG9fb2Zmc2V0X2JpYXMpOwogICAgICAgICBsb2FkKHJlY3ZfYWRkciwgdG1wMSwgVF9PQkpFQ1QpOwogICAgICAgICBfXyB0c3QodG1wMSk7CkBAIC0yODI5LDggKzI4MTksOCBAQAogICAgICAgICBfXyBkZWxheWVkKCktPm5vcCgpOwogICAgICAgICBfXyBzdF9wdHIocmVjdiwgcmVjdl9hZGRyKTsKICAgICAgICAgX18gc2V0KERhdGFMYXlvdXQ6OmNvdW50ZXJfaW5jcmVtZW50LCB0bXAxKTsKLSAgICAgICAgX18gc3RfcHRyKHRtcDEsIEFkZHJlc3MobWRvLCAwLCBtZC0+Ynl0ZV9vZmZzZXRfb2Zfc2xvdChkYXRhLCBWaXJ0dWFsQ2FsbERhdGE6OnJlY2VpdmVyX2NvdW50X29mZnNldChpKSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZG9fb2Zmc2V0X2JpYXMpKTsKKyAgICAgICAgX18gc3RfcHRyKHRtcDEsIG1kbywgbWQtPmJ5dGVfb2Zmc2V0X29mX3Nsb3QoZGF0YSwgVmlydHVhbENhbGxEYXRhOjpyZWNlaXZlcl9jb3VudF9vZmZzZXQoaSkpIC0KKyAgICAgICAgICAgICAgICAgIG1kb19vZmZzZXRfYmlhcyk7CiAgICAgICAgIGlmIChpIDwgKFZpcnR1YWxDYWxsRGF0YTo6cm93X2xpbWl0KCkgLSAxKSkgewogICAgICAgICAgIF9fIGJyKEFzc2VtYmxlcjo6YWx3YXlzLCBmYWxzZSwgQXNzZW1ibGVyOjpwdCwgdXBkYXRlX2RvbmUpOwogICAgICAgICAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfTWFjcm9Bc3NlbWJsZXJfc3BhcmMuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2MxX01hY3JvQXNzZW1ibGVyX3NwYXJjLmNwcAppbmRleCBhMDAyZTI0Li5kZTI2NGFmIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfTWFjcm9Bc3NlbWJsZXJfc3BhcmMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jMV9NYWNyb0Fzc2VtYmxlcl9zcGFyYy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDE5OTktMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDE5OTktMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOSwxMyArMjksMTMgQEAKICAgTGFiZWwgTDsKICAgY29uc3QgUmVnaXN0ZXIgdGVtcF9yZWcgPSBHM19zY3JhdGNoOwogICAvLyBOb3RlOiBuZWVkcyBtb3JlIHRlc3Rpbmcgb2Ygb3V0LW9mLWxpbmUgdnMuIGlubGluZSBzbG93IGNhc2UKLSAgQWRkcmVzcyBpY19taXNzKHRlbXBfcmVnLCBTaGFyZWRSdW50aW1lOjpnZXRfaWNfbWlzc19zdHViKCkpOwogICB2ZXJpZnlfb29wKHJlY2VpdmVyKTsKICAgbGRfcHRyKHJlY2VpdmVyLCBvb3BEZXNjOjprbGFzc19vZmZzZXRfaW5fYnl0ZXMoKSwgdGVtcF9yZWcpOwogICBjbXAodGVtcF9yZWcsIGlDYWNoZSk7CiAgIGJyeChBc3NlbWJsZXI6OmVxdWFsLCB0cnVlLCBBc3NlbWJsZXI6OnB0LCBMKTsKICAgZGVsYXllZCgpLT5ub3AoKTsKLSAganVtcF90byhpY19taXNzLCAwKTsKKyAgQWRkcmVzc0xpdGVyYWwgaWNfbWlzcyhTaGFyZWRSdW50aW1lOjpnZXRfaWNfbWlzc19zdHViKCkpOworICBqdW1wX3RvKGljX21pc3MsIHRlbXBfcmVnKTsKICAgZGVsYXllZCgpLT5ub3AoKTsKICAgYWxpZ24oQ29kZUVudHJ5QWxpZ25tZW50KTsKICAgYmluZChMKTsKQEAgLTg0LDcgKzg0LDcgQEAKIAogICBMYWJlbCBkb25lOwogCi0gIEFkZHJlc3MgbWFya19hZGRyKFJvb3AsIDAsIG9vcERlc2M6Om1hcmtfb2Zmc2V0X2luX2J5dGVzKCkpOworICBBZGRyZXNzIG1hcmtfYWRkcihSb29wLCBvb3BEZXNjOjptYXJrX29mZnNldF9pbl9ieXRlcygpKTsKIAogICAvLyBUaGUgZm9sbG93aW5nIG1vdmUgbXVzdCBiZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgZW1pdHRlZCBzaW5jZSBkZWJ1ZwogICAvLyBpbmZvcm1hdGlvbiBtYXkgYmUgZ2VuZXJhdGVkIGZvciBpdC4KQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAgIExhYmVsIGRvbmU7CiAKLSAgQWRkcmVzcyBtYXJrX2FkZHIoUm9vcCwgMCwgb29wRGVzYzo6bWFya19vZmZzZXRfaW5fYnl0ZXMoKSk7CisgIEFkZHJlc3MgbWFya19hZGRyKFJvb3AsIG9vcERlc2M6Om1hcmtfb2Zmc2V0X2luX2J5dGVzKCkpOwogICBhc3NlcnQobWFya19hZGRyLmRpc3AoKSA9PSAwLCAiY2FzIG11c3QgdGFrZSBhIHplcm8gZGlzcGxhY2VtZW50Iik7CiAKICAgaWYgKFVzZUJpYXNlZExvY2tpbmcpIHsKQEAgLTM3MCw3ICszNzAsNyBAQAogCiB2b2lkIEMxX01hY3JvQXNzZW1ibGVyOjp2ZXJpZnlfc3RhY2tfb29wKGludCBzdGFja19vZmZzZXQpIHsKICAgaWYgKCFWZXJpZnlPb3BzKSByZXR1cm47Ci0gIHZlcmlmeV9vb3BfYWRkcihBZGRyZXNzKFNQLCAwLCBzdGFja19vZmZzZXQgKyBTVEFDS19CSUFTKSk7CisgIHZlcmlmeV9vb3BfYWRkcihBZGRyZXNzKFNQLCBzdGFja19vZmZzZXQgKyBTVEFDS19CSUFTKSk7CiB9CiAKIHZvaWQgQzFfTWFjcm9Bc3NlbWJsZXI6OnZlcmlmeV9ub3RfbnVsbF9vb3AoUmVnaXN0ZXIgcikgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2MxX1J1bnRpbWUxX3NwYXJjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jMV9SdW50aW1lMV9zcGFyYy5jcHAKaW5kZXggNmRmYjhlZi4uODY0ZDQ4OCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2MxX1J1bnRpbWUxX3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfUnVudGltZTFfc3BhcmMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAxOTk5LTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAxOTk5LTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTcsMTMgKzU3LDEzIEBACiAKICAgLy8gY2hlY2sgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucwogICB7IExhYmVsIEw7Ci0gICAgQWRkcmVzcyBleGNlcHRpb25fYWRkcihHMl90aHJlYWQsIDAsIGluX2J5dGVzKFRocmVhZDo6cGVuZGluZ19leGNlcHRpb25fb2Zmc2V0KCkpKTsKKyAgICBBZGRyZXNzIGV4Y2VwdGlvbl9hZGRyKEcyX3RocmVhZCwgVGhyZWFkOjpwZW5kaW5nX2V4Y2VwdGlvbl9vZmZzZXQoKSk7CiAgICAgbGRfcHRyKGV4Y2VwdGlvbl9hZGRyLCBHdGVtcCk7CiAgICAgYnJfbnVsbChHdGVtcCwgZmFsc2UsIHB0LCBMKTsKICAgICBkZWxheWVkKCktPm5vcCgpOwotICAgIEFkZHJlc3Mgdm1fcmVzdWx0X2FkZHIoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjp2bV9yZXN1bHRfb2Zmc2V0KCkpKTsKKyAgICBBZGRyZXNzIHZtX3Jlc3VsdF9hZGRyKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6dm1fcmVzdWx0X29mZnNldCgpKTsKICAgICBzdF9wdHIoRzAsIHZtX3Jlc3VsdF9hZGRyKTsKLSAgICBBZGRyZXNzIHZtX3Jlc3VsdF9hZGRyXzIoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjp2bV9yZXN1bHRfMl9vZmZzZXQoKSkpOworICAgIEFkZHJlc3Mgdm1fcmVzdWx0X2FkZHJfMihHMl90aHJlYWQsIEphdmFUaHJlYWQ6OnZtX3Jlc3VsdF8yX29mZnNldCgpKTsKICAgICBzdF9wdHIoRzAsIHZtX3Jlc3VsdF9hZGRyXzIpOwogCiAgICAgaWYgKGZyYW1lX3NpemUoKSA9PSBub19mcmFtZV9zaXplKSB7CkBAIC03Myw4ICs3Myw4IEBACiAgICAgfSBlbHNlIGlmIChfc3R1Yl9pZCA9PSBSdW50aW1lMTo6Zm9yd2FyZF9leGNlcHRpb25faWQpIHsKICAgICAgIHNob3VsZF9ub3RfcmVhY2hfaGVyZSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICBBZGRyZXNzIGV4YyhHNCwgUnVudGltZTE6OmVudHJ5X2ZvcihSdW50aW1lMTo6Zm9yd2FyZF9leGNlcHRpb25faWQpKTsKLSAgICAgIGp1bXBfdG8oZXhjLCAwKTsKKyAgICAgIEFkZHJlc3NMaXRlcmFsIGV4YyhSdW50aW1lMTo6ZW50cnlfZm9yKFJ1bnRpbWUxOjpmb3J3YXJkX2V4Y2VwdGlvbl9pZCkpOworICAgICAganVtcF90byhleGMsIEc0KTsKICAgICAgIGRlbGF5ZWQoKS0+bm9wKCk7CiAgICAgfQogICAgIGJpbmQoTCk7CkBAIC04NSw3ICs4NSw3IEBACiAgICAgZ2V0X3ZtX3Jlc3VsdCAgKG9vcF9yZXN1bHQxKTsKICAgfSBlbHNlIHsKICAgICAvLyBiZSBhIGxpdHRsZSBwYXJhbm9pZCBhbmQgY2xlYXIgdGhlIHJlc3VsdAotICAgIEFkZHJlc3Mgdm1fcmVzdWx0X2FkZHIoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjp2bV9yZXN1bHRfb2Zmc2V0KCkpKTsKKyAgICBBZGRyZXNzIHZtX3Jlc3VsdF9hZGRyKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6dm1fcmVzdWx0X29mZnNldCgpKTsKICAgICBzdF9wdHIoRzAsIHZtX3Jlc3VsdF9hZGRyKTsKICAgfQogCkBAIC05Myw3ICs5Myw3IEBACiAgICAgZ2V0X3ZtX3Jlc3VsdF8yKG9vcF9yZXN1bHQyKTsKICAgfSBlbHNlIHsKICAgICAvLyBiZSBhIGxpdHRsZSBwYXJhbm9pZCBhbmQgY2xlYXIgdGhlIHJlc3VsdAotICAgIEFkZHJlc3Mgdm1fcmVzdWx0X2FkZHJfMihHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6OnZtX3Jlc3VsdF8yX29mZnNldCgpKSk7CisgICAgQWRkcmVzcyB2bV9yZXN1bHRfYWRkcl8yKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6dm1fcmVzdWx0XzJfb2Zmc2V0KCkpOwogICAgIHN0X3B0cihHMCwgdm1fcmVzdWx0X2FkZHJfMik7CiAgIH0KIApAQCAtNDc5LDggKzQ3OSw4IEBACiAgICAgICAgIFJlZ2lzdGVyIEc0X2xlbmd0aCA9IEc0OyAvLyBJbmNvbWluZwogICAgICAgICBSZWdpc3RlciBPMF9vYmogICA9IE8wOyAvLyBPdXRnb2luZwogCi0gICAgICAgIEFkZHJlc3Mga2xhc3NfbGgoRzVfa2xhc3MsIDAsICgoa2xhc3NPb3BEZXNjOjpoZWFkZXJfc2l6ZSgpICogSGVhcFdvcmRTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBLbGFzczo6bGF5b3V0X2hlbHBlcl9vZmZzZXRfaW5fYnl0ZXMoKSkpOworICAgICAgICBBZGRyZXNzIGtsYXNzX2xoKEc1X2tsYXNzLCAoKGtsYXNzT29wRGVzYzo6aGVhZGVyX3NpemUoKSAqIEhlYXBXb3JkU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgS2xhc3M6OmxheW91dF9oZWxwZXJfb2Zmc2V0X2luX2J5dGVzKCkpKTsKICAgICAgICAgYXNzZXJ0KEtsYXNzOjpfbGhfaGVhZGVyX3NpemVfc2hpZnQgJSBCaXRzUGVyQnl0ZSA9PSAwLCAiYnl0ZXdpc2UiKTsKICAgICAgICAgYXNzZXJ0KEtsYXNzOjpfbGhfaGVhZGVyX3NpemVfbWFzayA9PSAweEZGLCAiYnl0ZXdpc2UiKTsKICAgICAgICAgLy8gVXNlIHRoaXMgb2Zmc2V0IHRvIHBpY2sgb3V0IGFuIGluZGl2aWR1YWwgYnl0ZSBvZiB0aGUgbGF5b3V0X2hlbHBlcjoKQEAgLTkwMiw4ICs5MDIsOCBAQAogICAgICAgICBfXyBzcmwoYWRkciwgQ2FyZFRhYmxlTW9kUmVmQlM6OmNhcmRfc2hpZnQsIGFkZHIpOwogI2VuZGlmCiAKLSAgICAgICAgQWRkcmVzcyBycyhjYXJkdGFibGUsIChhZGRyZXNzKWJ5dGVfbWFwX2Jhc2UpOwotICAgICAgICBfXyBsb2FkX2FkZHJlc3MocnMpOyAvLyBjYXJkdGFibGUgOj0gPGNhcmQgdGFibGUgYmFzZT4KKyAgICAgICAgQWRkcmVzc0xpdGVyYWwgcnMoYnl0ZV9tYXBfYmFzZSk7CisgICAgICAgIF9fIHNldChycywgY2FyZHRhYmxlKTsgICAgICAgICAvLyBjYXJkdGFibGUgOj0gPGNhcmQgdGFibGUgYmFzZT4KICAgICAgICAgX18gbGR1YihhZGRyLCBjYXJkdGFibGUsIHRtcCk7IC8vIHRtcCA6PSBbYWRkciArIGNhcmR0YWJsZV0KIAogICAgICAgICBfXyBicl9vbl9yZWdfY29uZChBc3NlbWJsZXI6OnJjX256LCAvKmFubnVsKi9mYWxzZSwgQXNzZW1ibGVyOjpwdCwKQEAgLTEwMjIsOCArMTAyMiw4IEBACiAKICAgX18gcmVzdG9yZSgpOwogCi0gIEFkZHJlc3MgZXhjKEc0LCBSdW50aW1lMTo6ZW50cnlfZm9yKFJ1bnRpbWUxOjp1bndpbmRfZXhjZXB0aW9uX2lkKSk7Ci0gIF9fIGp1bXBfdG8oZXhjLCAwKTsKKyAgQWRkcmVzc0xpdGVyYWwgZXhjKFJ1bnRpbWUxOjplbnRyeV9mb3IoUnVudGltZTE6OnVud2luZF9leGNlcHRpb25faWQpKTsKKyAgX18ganVtcF90byhleGMsIEc0KTsKICAgX18gZGVsYXllZCgpLT5ub3AoKTsKIAogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vZHVtcF9zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vZHVtcF9zcGFyYy5jcHAKaW5kZXggMzhlYzdhYS4uODc4ZmZjMSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2R1bXBfc3BhcmMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9kdW1wX3NwYXJjLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTEwNiw4ICsxMDYsNyBAQAogICBfXyBhbmQzKEwwLCAyNTUsIEw0KTsgICAgICAgICAgICAgICAgIC8vIElzb2xhdGUgTDMgPSBtZXRob2Qgb2Zmc2V0Oy4KICAgX18gc2xsKEw0LCBMb2dCeXRlc1BlcldvcmQsIEw0KTsKICAgX18gbGRfcHRyKEwzLCBMNCwgTDQpOyAgICAgICAgICAgICAgICAvLyBHZXQgYWRkcmVzcyBvZiBjb3JyZWN0IHZpcnR1YWwgbWV0aG9kCi0gIEFkZHJlc3MgbWV0aG9kKEw0LCAwKTsKLSAgX18gam1wbChtZXRob2QsIEcwKTsgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIGNvcnJlY3QgbWV0aG9kLgorICBfXyBqbXBsKEw0LCAwLCBHMCk7ICAgICAgICAgICAgICAgICAgIC8vIEp1bXAgdG8gY29ycmVjdCBtZXRob2QuCiAgIF9fIGRlbGF5ZWQoKS0+cmVzdG9yZSgpOyAgICAgICAgICAgICAgLy8gUmVzdG9yZSByZWdpc3RlcnMuCiAKICAgX18gZmx1c2goKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9pY0J1ZmZlcl9zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vaWNCdWZmZXJfc3BhcmMuY3BwCmluZGV4IGE5NWRjYTUuLjg3ZTNkYWIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9pY0J1ZmZlcl9zcGFyYy5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2ljQnVmZmVyX3NwYXJjLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMTk5Ny0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMTk5Ny0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ2LDE0ICs0NiwxMyBAQAogICAvLyAoMSkgdGhlIG9vcCBpcyBvbGQgKGkuZS4sIGRvZXNuJ3QgbWF0dGVyIGZvciBzY2F2ZW5nZXMpCiAgIC8vICgyKSB0aGVzZSBJQ1N0dWJzIGFyZSByZW1vdmVkICpiZWZvcmUqIGEgR0MgaGFwcGVucywgc28gdGhlIHJvb3RzIGRpc2FwcGVhcgogICBhc3NlcnQoY2FjaGVkX29vcCA9PSBOVUxMIHx8IGNhY2hlZF9vb3AtPmlzX3Blcm0oKSwgIm11c3QgYmUgb2xkIG9vcCIpOwotICBBZGRyZXNzIGNhY2hlZF9vb3BfYWRkcihHNV9pbmxpbmVfY2FjaGVfcmVnLCBhZGRyZXNzKGNhY2hlZF9vb3ApKTsKLSAgLy8gRm9yY2UgdGhlIHNldGhpIHRvIGdlbmVyYXRlIHRoZSBmaXhlZCBzZXF1ZW5jZSBzbyBuZXh0X2luc3RydWN0aW9uX2FkZHJlc3Mgd29ya3MKLSAgbWFzbS0+c2V0aGkoY2FjaGVkX29vcF9hZGRyLCB0cnVlIC8qIEZvcmNlUmVsb2NhdGFibGUgKi8gKTsKLSAgbWFzbS0+YWRkKGNhY2hlZF9vb3BfYWRkciwgRzVfaW5saW5lX2NhY2hlX3JlZyk7CisgIEFkZHJlc3NMaXRlcmFsIGNhY2hlZF9vb3BfYWRkcmxpdChjYWNoZWRfb29wLCByZWxvY0luZm86Om5vbmUpOworICAvLyBGb3JjZSB0aGUgc2V0IHRvIGdlbmVyYXRlIHRoZSBmaXhlZCBzZXF1ZW5jZSBzbyBuZXh0X2luc3RydWN0aW9uX2FkZHJlc3Mgd29ya3MKKyAgbWFzbS0+cGF0Y2hhYmxlX3NldChjYWNoZWRfb29wX2FkZHJsaXQsIEc1X2lubGluZV9jYWNoZV9yZWcpOwogICBhc3NlcnQoRzNfc2NyYXRjaCAhPSBHNV9tZXRob2QsICJEbyBub3QgY2xvYmJlciB0aGUgbWV0aG9kIG9vcCBpbiB0aGUgdHJhbnNpdGlvbiBzdHViIik7CiAgIGFzc2VydChHM19zY3JhdGNoICE9IEc1X2lubGluZV9jYWNoZV9yZWcsICJEbyBub3QgY2xvYmJlciB0aGUgaW5saW5lIGNhY2hlIHJlZ2lzdGVyIGluIHRoZSB0cmFuc2l0aW9uIHN0dWIiKTsKLSAgQWRkcmVzcyBlbnRyeShHM19zY3JhdGNoLCBlbnRyeV9wb2ludCk7Ci0gIG1hc20tPkpVTVAoZW50cnksIDApOworICBBZGRyZXNzTGl0ZXJhbCBlbnRyeShlbnRyeV9wb2ludCk7CisgIG1hc20tPkpVTVAoZW50cnksIEczX3NjcmF0Y2gsIDApOwogICBtYXNtLT5kZWxheWVkKCktPm5vcCgpOwogICBtYXNtLT5mbHVzaCgpOwogfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2ludGVycF9tYXNtX3NwYXJjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9pbnRlcnBfbWFzbV9zcGFyYy5jcHAKaW5kZXggZTg0M2QzZi4uZDBkODMxZSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2ludGVycF9tYXNtX3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vaW50ZXJwX21hc21fc3BhcmMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAxOTk3LTIwMDggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAxOTk3LTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzUsOCArMzUsOCBAQAogCiAvLyBUaGlzIGZpbGUgc3BlY2lhbGl6ZXMgdGhlIGFzc2VtYmVyIHdpdGggaW50ZXJwcmV0ZXItc3BlY2lmaWMgbWFjcm9zCiAKLWNvbnN0IEFkZHJlc3MgSW50ZXJwcmV0ZXJNYWNyb0Fzc2VtYmxlcjo6bF90bXAoIEZQLCAwLCAgKGZyYW1lOjppbnRlcnByZXRlcl9mcmFtZV9sX3NjcmF0Y2hfZnBfb2Zmc2V0ICAgICogd29yZFNpemUgKSArIFNUQUNLX0JJQVMpOwotY29uc3QgQWRkcmVzcyBJbnRlcnByZXRlck1hY3JvQXNzZW1ibGVyOjpkX3RtcCggRlAsIDAsICAoZnJhbWU6OmludGVycHJldGVyX2ZyYW1lX2Rfc2NyYXRjaF9mcF9vZmZzZXQgICAgKiB3b3JkU2l6ZSkgKyBTVEFDS19CSUFTKTsKK2NvbnN0IEFkZHJlc3MgSW50ZXJwcmV0ZXJNYWNyb0Fzc2VtYmxlcjo6bF90bXAoRlAsIChmcmFtZTo6aW50ZXJwcmV0ZXJfZnJhbWVfbF9zY3JhdGNoX2ZwX29mZnNldCAqIHdvcmRTaXplKSArIFNUQUNLX0JJQVMpOworY29uc3QgQWRkcmVzcyBJbnRlcnByZXRlck1hY3JvQXNzZW1ibGVyOjpkX3RtcChGUCwgKGZyYW1lOjppbnRlcnByZXRlcl9mcmFtZV9kX3NjcmF0Y2hfZnBfb2Zmc2V0ICogd29yZFNpemUpICsgU1RBQ0tfQklBUyk7CiAKICNlbHNlIC8vIENDX0lOVEVSUAogI2lmbmRlZiBTVEFURQpAQCAtNzgsMTQgKzc4LDEyIEBACiAgIHNsbChMYnl0ZV9jb2RlLCBMb2dCeXRlc1BlcldvcmQsIExieXRlX2NvZGUpOyAgICAgICAgIC8vIG11bHRpcGx5IGJ5IHdvcmRTaXplCiAgIGxkX3B0cihJZGlzcGF0Y2hUYWJsZXMsIExieXRlX2NvZGUsIElkaXNwYXRjaEFkZHJlc3MpOy8vIGdldCBlbnRyeSBhZGRyCiAjZWxzZQotICBsZHViKCBMYmNwLCBiY3BfaW5jciwgTGJ5dGVfY29kZSk7ICAgICAgICAgICAgICAgLy8gbG9hZCBuZXh0IGJ5dGVjb2RlCisgIGxkdWIoIExiY3AsIGJjcF9pbmNyLCBMYnl0ZV9jb2RlKTsgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgbmV4dCBieXRlY29kZQogICAvLyBkaXNwYXRjaCB0YWJsZSB0byB1c2UKLSAgQWRkcmVzcyB0YmwoRzNfc2NyYXRjaCwgKGFkZHJlc3MpSW50ZXJwcmV0ZXI6OmRpc3BhdGNoX3RhYmxlKHN0YXRlKSk7Ci0KLSAgc2V0aGkodGJsKTsKLSAgc2xsKExieXRlX2NvZGUsIExvZ0J5dGVzUGVyV29yZCwgTGJ5dGVfY29kZSk7ICAgIC8vIG11bHRpcGx5IGJ5IHdvcmRTaXplCi0gIGFkZCh0YmwsIHRibC5iYXNlKCksIDApOwotICBsZF9wdHIoIEczX3NjcmF0Y2gsIExieXRlX2NvZGUsIElkaXNwYXRjaEFkZHJlc3MpOyAgICAgLy8gZ2V0IGVudHJ5IGFkZHIKKyAgQWRkcmVzc0xpdGVyYWwgdGJsKEludGVycHJldGVyOjpkaXNwYXRjaF90YWJsZShzdGF0ZSkpOworICBzbGwoTGJ5dGVfY29kZSwgTG9nQnl0ZXNQZXJXb3JkLCBMYnl0ZV9jb2RlKTsgICAgICAgICAvLyBtdWx0aXBseSBieSB3b3JkU2l6ZQorICBzZXQodGJsLCBHM19zY3JhdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIGFkZHIgb2YgdGFibGUKKyAgbGRfcHRyKEczX3NjcmF0Y2gsIExieXRlX2NvZGUsIElkaXNwYXRjaEFkZHJlc3MpOyAgICAgLy8gZ2V0IGVudHJ5IGFkZHIKICNlbmRpZgogfQogCkBAIC0xNjUsOCArMTYzLDcgQEAKICAgICBMYWJlbCBMOwogCiAgICAgLy8gQ2hlY2sgdGhlICJwZW5kaW5nIHBvcGZyYW1lIGNvbmRpdGlvbiIgZmxhZyBpbiB0aGUgY3VycmVudCB0aHJlYWQKLSAgICBBZGRyZXNzIHBvcGZyYW1lX2NvbmRpdGlvbl9hZGRyKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6cG9wZnJhbWVfY29uZGl0aW9uX29mZnNldCgpKSk7Ci0gICAgbGQocG9wZnJhbWVfY29uZGl0aW9uX2FkZHIsIHNjcmF0Y2hfcmVnKTsKKyAgICBsZChHMl90aHJlYWQsIEphdmFUaHJlYWQ6OnBvcGZyYW1lX2NvbmRpdGlvbl9vZmZzZXQoKSwgc2NyYXRjaF9yZWcpOwogCiAgICAgLy8gSW5pdGlhdGUgcG9wZnJhbWUgaGFuZGxpbmcgb25seSBpZiBpdCBpcyBub3QgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQuICBJZiB0aGUgZmxhZwogICAgIC8vIGhhcyB0aGUgcG9wZnJhbWVfcHJvY2Vzc2luZyBiaXQgc2V0LCBpdCBtZWFucyB0aGF0IHRoaXMgY29kZSBpcyBjYWxsZWQgKmR1cmluZyogcG9wZnJhbWUKQEAgLTE5MiwxMSArMTg5LDEwIEBACiAKIHZvaWQgSW50ZXJwcmV0ZXJNYWNyb0Fzc2VtYmxlcjo6bG9hZF9lYXJseXJldF92YWx1ZShUb3NTdGF0ZSBzdGF0ZSkgewogICBSZWdpc3RlciB0aHJfc3RhdGUgPSBHNF9zY3JhdGNoOwotICBsZF9wdHIoQWRkcmVzcyhHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6Omp2bXRpX3RocmVhZF9zdGF0ZV9vZmZzZXQoKSkpLAotICAgICAgICAgdGhyX3N0YXRlKTsKLSAgY29uc3QgQWRkcmVzcyB0b3NfYWRkcih0aHJfc3RhdGUsIDAsIGluX2J5dGVzKEp2bXRpVGhyZWFkU3RhdGU6OmVhcmx5cmV0X3Rvc19vZmZzZXQoKSkpOwotICBjb25zdCBBZGRyZXNzIG9vcF9hZGRyKHRocl9zdGF0ZSwgMCwgaW5fYnl0ZXMoSnZtdGlUaHJlYWRTdGF0ZTo6ZWFybHlyZXRfb29wX29mZnNldCgpKSk7Ci0gIGNvbnN0IEFkZHJlc3MgdmFsX2FkZHIodGhyX3N0YXRlLCAwLCBpbl9ieXRlcyhKdm10aVRocmVhZFN0YXRlOjplYXJseXJldF92YWx1ZV9vZmZzZXQoKSkpOworICBsZF9wdHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpqdm10aV90aHJlYWRfc3RhdGVfb2Zmc2V0KCksIHRocl9zdGF0ZSk7CisgIGNvbnN0IEFkZHJlc3MgdG9zX2FkZHIodGhyX3N0YXRlLCBKdm10aVRocmVhZFN0YXRlOjplYXJseXJldF90b3Nfb2Zmc2V0KCkpOworICBjb25zdCBBZGRyZXNzIG9vcF9hZGRyKHRocl9zdGF0ZSwgSnZtdGlUaHJlYWRTdGF0ZTo6ZWFybHlyZXRfb29wX29mZnNldCgpKTsKKyAgY29uc3QgQWRkcmVzcyB2YWxfYWRkcih0aHJfc3RhdGUsIEp2bXRpVGhyZWFkU3RhdGU6OmVhcmx5cmV0X3ZhbHVlX29mZnNldCgpKTsKICAgc3dpdGNoIChzdGF0ZSkgewogICBjYXNlIGx0b3M6IGxkX2xvbmcodmFsX2FkZHIsIE90b3NfbCk7ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICBjYXNlIGF0b3M6IGxkX3B0cihvb3BfYWRkciwgT3Rvc19sKTsKQEAgLTIyMiw4ICsyMTgsNyBAQAogICBpZiAoSnZtdGlFeHBvcnQ6OmNhbl9mb3JjZV9lYXJseV9yZXR1cm4oKSkgewogICAgIExhYmVsIEw7CiAgICAgUmVnaXN0ZXIgdGhyX3N0YXRlID0gRzNfc2NyYXRjaDsKLSAgICBsZF9wdHIoQWRkcmVzcyhHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6Omp2bXRpX3RocmVhZF9zdGF0ZV9vZmZzZXQoKSkpLAotICAgICAgICAgICB0aHJfc3RhdGUpOworICAgIGxkX3B0cihHMl90aHJlYWQsIEphdmFUaHJlYWQ6Omp2bXRpX3RocmVhZF9zdGF0ZV9vZmZzZXQoKSwgdGhyX3N0YXRlKTsKICAgICB0c3QodGhyX3N0YXRlKTsKICAgICBicih6ZXJvLCBmYWxzZSwgcHQsIEwpOyAvLyBpZiAodGhyZWFkLT5qdm10aV90aHJlYWRfc3RhdGUoKSA9PSBOVUxMKSBleGl0OwogICAgIGRlbGF5ZWQoKS0+bm9wKCk7CkBAIC0yMzEsMTYgKzIyNiwxNCBAQAogICAgIC8vIEluaXRpYXRlIGVhcmx5cmV0IGhhbmRsaW5nIG9ubHkgaWYgaXQgaXMgbm90IGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkLgogICAgIC8vIElmIHRoZSBmbGFnIGhhcyB0aGUgZWFybHlyZXRfcHJvY2Vzc2luZyBiaXQgc2V0LCBpdCBtZWFucyB0aGF0IHRoaXMgY29kZQogICAgIC8vIGlzIGNhbGxlZCAqZHVyaW5nKiBlYXJseXJldCBoYW5kbGluZyAtIHdlIGRvbid0IHdhbnQgdG8gcmVlbnRlci4KLSAgICBsZChBZGRyZXNzKHRocl9zdGF0ZSwgMCwgaW5fYnl0ZXMoSnZtdGlUaHJlYWRTdGF0ZTo6ZWFybHlyZXRfc3RhdGVfb2Zmc2V0KCkpKSwKLSAgICAgICBHNF9zY3JhdGNoKTsKKyAgICBsZCh0aHJfc3RhdGUsIEp2bXRpVGhyZWFkU3RhdGU6OmVhcmx5cmV0X3N0YXRlX29mZnNldCgpLCBHNF9zY3JhdGNoKTsKICAgICBjbXAoRzRfc2NyYXRjaCwgSnZtdGlUaHJlYWRTdGF0ZTo6ZWFybHlyZXRfcGVuZGluZyk7CiAgICAgYnIoQXNzZW1ibGVyOjpub3RFcXVhbCwgZmFsc2UsIHB0LCBMKTsKICAgICBkZWxheWVkKCktPm5vcCgpOwogCiAgICAgLy8gQ2FsbCBJbnRlcnByZXRlcjo6cmVtb3ZlX2FjdGl2YXRpb25fZWFybHlfZW50cnkoKSB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCiAgICAgLy8gc2FtZS1uYW1lZCBlbnRyeXBvaW50IGluIHRoZSBnZW5lcmF0ZWQgaW50ZXJwcmV0ZXIgY29kZQotICAgIEFkZHJlc3MgdG9zX2FkZHIodGhyX3N0YXRlLCAwLCBpbl9ieXRlcyhKdm10aVRocmVhZFN0YXRlOjplYXJseXJldF90b3Nfb2Zmc2V0KCkpKTsKLSAgICBsZCh0b3NfYWRkciwgT3Rvc19sMSk7CisgICAgbGQodGhyX3N0YXRlLCBKdm10aVRocmVhZFN0YXRlOjplYXJseXJldF90b3Nfb2Zmc2V0KCksIE90b3NfbDEpOwogICAgIGNhbGxfVk1fbGVhZihub3JlZywgQ0FTVF9GUk9NX0ZOX1BUUihhZGRyZXNzLCBJbnRlcnByZXRlcjo6cmVtb3ZlX2FjdGl2YXRpb25fZWFybHlfZW50cnkpLCBPdG9zX2wxKTsKIAogICAgIC8vIEp1bXAgdG8gSW50ZXJwcmV0ZXI6Ol9yZW1vdmVfYWN0aXZhdGlvbl9lYXJseV9lbnRyeQpAQCAtMjk0LDEwICsyODcsOSBAQAogICB9IGVsc2UgewogI2VuZGlmCiAgICAgLy8gZGlzcGF0Y2ggdGFibGUgdG8gdXNlCi0gICAgQWRkcmVzcyB0YmwoRzNfc2NyYXRjaCwgKGFkZHJlc3MpdGFibGUpOwotCisgICAgQWRkcmVzc0xpdGVyYWwgdGJsKHRhYmxlKTsKICAgICBzbGwoTGJ5dGVfY29kZSwgTG9nQnl0ZXNQZXJXb3JkLCBMYnl0ZV9jb2RlKTsgICAgICAgLy8gbXVsdGlwbHkgYnkgd29yZFNpemUKLSAgICBsb2FkX2FkZHJlc3ModGJsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhZGRyIG9mIHRhYmxlCisgICAgc2V0KHRibCwgRzNfc2NyYXRjaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgYWRkciBvZiB0YWJsZQogICAgIGxkX3B0cihHM19zY3JhdGNoLCBMYnl0ZV9jb2RlLCBHM19zY3JhdGNoKTsgICAgICAgICAvLyBnZXQgZW50cnkgYWRkcgogI2lmZGVmIEZBU1RfRElTUEFUQ0gKICAgfQpAQCAtNjAxLDI2ICs1OTMsMTcgQEAKIAogICAvLyBSZXNldCBTUCBieSBzdWJ0cmFjdGluZyBtb3JlIHNwYWNlIGZyb20gTGVzcC4KICAgTGFiZWwgZG9uZTsKLQotICBjb25zdCBBZGRyZXNzIG1heF9zdGFjayAgIChMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjptYXhfc3RhY2tfb2Zmc2V0KCkpKTsKLSAgY29uc3QgQWRkcmVzcyBhY2Nlc3NfZmxhZ3MoTG1ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6YWNjZXNzX2ZsYWdzX29mZnNldCgpKSk7Ci0KICAgdmVyaWZ5X29vcChMbWV0aG9kKTsKLQotCi0gIGFzc2VydCggRzRfc2NyYXRjaCAgICAhPSBHZnJhbWVfc2l6ZSwKLSAgICAgICAgICAiT25seSB5b3UgY2FuIHByZXZlbnQgcmVnaXN0ZXIgYWxpYXNpbmchIik7CisgIGFzc2VydChHNF9zY3JhdGNoICE9IEdmcmFtZV9zaXplLCAiT25seSB5b3UgY2FuIHByZXZlbnQgcmVnaXN0ZXIgYWxpYXNpbmchIik7CiAKICAgLy8gQSBuYXRpdmUgZG9lcyBub3QgbmVlZCB0byBkbyB0aGlzLCBzaW5jZSBpdHMgY2FsbGVlIGRvZXMgbm90IGNoYW5nZSBTUC4KLSAgbGQoYWNjZXNzX2ZsYWdzLCBHZnJhbWVfc2l6ZSk7CisgIGxkKExtZXRob2QsIG1ldGhvZE9vcERlc2M6OmFjY2Vzc19mbGFnc19vZmZzZXQoKSwgR2ZyYW1lX3NpemUpOyAgLy8gTG9hZCBhY2Nlc3MgZmxhZ3MuCiAgIGJ0c3QoSlZNX0FDQ19OQVRJVkUsIEdmcmFtZV9zaXplKTsKICAgYnIoQXNzZW1ibGVyOjpub3RaZXJvLCBmYWxzZSwgQXNzZW1ibGVyOjpwdCwgZG9uZSk7CiAgIGRlbGF5ZWQoKS0+bm9wKCk7CiAKLSAgLy8KICAgLy8gQ29tcHV0ZSBtYXggZXhwcmVzc2lvbiBzdGFjaytyZWdpc3RlciBzYXZlIGFyZWEKLSAgLy8KLSAgbGR1aCggbWF4X3N0YWNrLCBHZnJhbWVfc2l6ZSApOworICBsZHVoKExtZXRob2QsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6Om1heF9zdGFja19vZmZzZXQoKSksIEdmcmFtZV9zaXplKTsgIC8vIExvYWQgbWF4IHN0YWNrLgogICBpZiAoVGFnZ2VkU3RhY2tJbnRlcnByZXRlcikgc2xsICggR2ZyYW1lX3NpemUsIDEsIEdmcmFtZV9zaXplKTsgIC8vIG1heF9zdGFjayAqIDIgZm9yIFRBR1MKICAgYWRkKCBHZnJhbWVfc2l6ZSwgZnJhbWU6Om1lbW9yeV9wYXJhbWV0ZXJfd29yZF9zcF9vZmZzZXQsIEdmcmFtZV9zaXplICk7CiAKQEAgLTcyMSw4ICs3MDQsNyBAQAogICAgIHZlcmlmeV90aHJlYWQoKTsKICAgICBMYWJlbCBza2lwX2NvbXBpbGVkX2NvZGU7CiAKLSAgICBjb25zdCBBZGRyZXNzIGludGVycF9vbmx5ICAgICAgIChHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6OmludGVycF9vbmx5X21vZGVfb2Zmc2V0KCkpKTsKLQorICAgIGNvbnN0IEFkZHJlc3MgaW50ZXJwX29ubHkoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjppbnRlcnBfb25seV9tb2RlX29mZnNldCgpKTsKICAgICBsZChpbnRlcnBfb25seSwgc2NyYXRjaCk7CiAgICAgdHN0KHNjcmF0Y2gpOwogICAgIGJyKEFzc2VtYmxlcjo6bm90WmVybywgdHJ1ZSwgQXNzZW1ibGVyOjpwbiwgc2tpcF9jb21waWxlZF9jb2RlKTsKQEAgLTkxNiw4ICs4OTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgUnNjcmF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCYgICBvayApIHsKICAgYXNzZXJ0KHRocm93X2VudHJ5X3BvaW50ICE9IE5VTEwsICJlbnRyeSBwb2ludCBtdXN0IGJlIGdlbmVyYXRlZCBieSBub3ciKTsKLSAgQWRkcmVzcyBkZXN0KFJzY3JhdGNoLCB0aHJvd19lbnRyeV9wb2ludCk7Ci0gIGp1bXBfdG8oZGVzdCk7CisgIEFkZHJlc3NMaXRlcmFsIGRlc3QodGhyb3dfZW50cnlfcG9pbnQpOworICBqdW1wX3RvKGRlc3QsIFJzY3JhdGNoKTsKICAgZGVsYXllZCgpLT5ub3AoKTsKICAgYmluZChvayk7CiB9CkBAIC0xMDM1LDE4ICsxMDE3LDE4IEBACiAgIExhYmVsIHVubG9ja2VkLCB1bmxvY2ssIG5vX3VubG9jazsKIAogICAvLyBnZXQgdGhlIHZhbHVlIG9mIF9kb19ub3RfdW5sb2NrX2lmX3N5bmNocm9uaXplZCBpbnRvIEcxX3NjcmF0Y2gKLSAgY29uc3QgQWRkcmVzcyBkb19ub3RfdW5sb2NrX2lmX3N5bmNocm9uaXplZChHMl90aHJlYWQsIDAsCi0gICAgaW5fYnl0ZXMoSmF2YVRocmVhZDo6ZG9fbm90X3VubG9ja19pZl9zeW5jaHJvbml6ZWRfb2Zmc2V0KCkpKTsKKyAgY29uc3QgQWRkcmVzcyBkb19ub3RfdW5sb2NrX2lmX3N5bmNocm9uaXplZChHMl90aHJlYWQsCisgICAgSmF2YVRocmVhZDo6ZG9fbm90X3VubG9ja19pZl9zeW5jaHJvbml6ZWRfb2Zmc2V0KCkpOwogICBsZGJvb2woZG9fbm90X3VubG9ja19pZl9zeW5jaHJvbml6ZWQsIEcxX3NjcmF0Y2gpOwogICBzdGJvb2woRzAsIGRvX25vdF91bmxvY2tfaWZfc3luY2hyb25pemVkKTsgLy8gcmVzZXQgdGhlIGZsYWcKIAogICAvLyBjaGVjayBpZiBzeW5jaHJvbml6ZWQgbWV0aG9kCi0gIGNvbnN0IEFkZHJlc3MgYWNjZXNzX2ZsYWdzKExtZXRob2QsIDAsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6OmFjY2Vzc19mbGFnc19vZmZzZXQoKSkpOworICBjb25zdCBBZGRyZXNzIGFjY2Vzc19mbGFncyhMbWV0aG9kLCBtZXRob2RPb3BEZXNjOjphY2Nlc3NfZmxhZ3Nfb2Zmc2V0KCkpOwogICBpbnRlcnBfdmVyaWZ5X29vcChPdG9zX2ksIHN0YXRlLCBfX0ZJTEVfXywgX19MSU5FX18pOwogICBwdXNoKHN0YXRlKTsgLy8gc2F2ZSB0b3MKLSAgbGQoYWNjZXNzX2ZsYWdzLCBHM19zY3JhdGNoKTsKKyAgbGQoYWNjZXNzX2ZsYWdzLCBHM19zY3JhdGNoKTsgLy8gTG9hZCBhY2Nlc3MgZmxhZ3MuCiAgIGJ0c3QoSlZNX0FDQ19TWU5DSFJPTklaRUQsIEczX3NjcmF0Y2gpOwotICBiciggemVybywgZmFsc2UsIHB0LCB1bmxvY2tlZCk7CisgIGJyKHplcm8sIGZhbHNlLCBwdCwgdW5sb2NrZWQpOwogICBkZWxheWVkKCktPm5vcCgpOwogCiAgIC8vIERvbid0IHVubG9jayBhbnl0aGluZyBpZiB0aGUgX2RvX25vdF91bmxvY2tfaWZfc3luY2hyb25pemVkIGZsYWcKQEAgLTEyMzYsOCArMTIxOCw4IEBACiAgICAgUmVnaXN0ZXIgb2JqX3JlZyA9IE9iamVjdDsKICAgICBSZWdpc3RlciBtYXJrX3JlZyA9IEc0X3NjcmF0Y2g7CiAgICAgUmVnaXN0ZXIgdGVtcF9yZWcgPSBHMV9zY3JhdGNoOwotICAgIEFkZHJlc3MgIGxvY2tfYWRkciA9IEFkZHJlc3MobG9ja19yZWcsIDAsIEJhc2ljT2JqZWN0TG9jazo6bG9ja19vZmZzZXRfaW5fYnl0ZXMoKSk7Ci0gICAgQWRkcmVzcyAgbWFya19hZGRyID0gQWRkcmVzcyhvYmpfcmVnLCAwLCBvb3BEZXNjOjptYXJrX29mZnNldF9pbl9ieXRlcygpKTsKKyAgICBBZGRyZXNzICBsb2NrX2FkZHIobG9ja19yZWcsIEJhc2ljT2JqZWN0TG9jazo6bG9ja19vZmZzZXRfaW5fYnl0ZXMoKSk7CisgICAgQWRkcmVzcyAgbWFya19hZGRyKG9ial9yZWcsIG9vcERlc2M6Om1hcmtfb2Zmc2V0X2luX2J5dGVzKCkpOwogICAgIExhYmVsICAgIGRvbmU7CiAKICAgICBMYWJlbCBzbG93X2Nhc2U7CkBAIC0xMzE1LDkgKzEyOTcsOCBAQAogICAgIFJlZ2lzdGVyIG9ial9yZWcgPSBHM19zY3JhdGNoOwogICAgIFJlZ2lzdGVyIG1hcmtfcmVnID0gRzRfc2NyYXRjaDsKICAgICBSZWdpc3RlciBkaXNwbGFjZWRfaGVhZGVyX3JlZyA9IEcxX3NjcmF0Y2g7Ci0gICAgQWRkcmVzcyAgbG9ja19hZGRyID0gQWRkcmVzcyhsb2NrX3JlZywgMCwgQmFzaWNPYmplY3RMb2NrOjpsb2NrX29mZnNldF9pbl9ieXRlcygpKTsKLSAgICBBZGRyZXNzICBsb2Nrb2JqX2FkZHIgPSBBZGRyZXNzKGxvY2tfcmVnLCAwLCBCYXNpY09iamVjdExvY2s6Om9ial9vZmZzZXRfaW5fYnl0ZXMoKSk7Ci0gICAgQWRkcmVzcyAgbWFya19hZGRyID0gQWRkcmVzcyhvYmpfcmVnLCAwLCBvb3BEZXNjOjptYXJrX29mZnNldF9pbl9ieXRlcygpKTsKKyAgICBBZGRyZXNzICBsb2Nrb2JqX2FkZHIobG9ja19yZWcsIEJhc2ljT2JqZWN0TG9jazo6b2JqX29mZnNldF9pbl9ieXRlcygpKTsKKyAgICBBZGRyZXNzICBtYXJrX2FkZHIob2JqX3JlZywgb29wRGVzYzo6bWFya19vZmZzZXRfaW5fYnl0ZXMoKSk7CiAgICAgTGFiZWwgICAgZG9uZTsKIAogICAgIGlmIChVc2VCaWFzZWRMb2NraW5nKSB7CkBAIC0xMzI4LDcgKzEzMDksOCBAQAogICAgIH0KIAogICAgIC8vIFRlc3QgZmlyc3QgaWYgd2UgYXJlIGluIHRoZSBmYXN0IHJlY3Vyc2l2ZSBjYXNlCi0gICAgbGRfcHRyKGxvY2tfYWRkciwgZGlzcGxhY2VkX2hlYWRlcl9yZWcsIEJhc2ljTG9jazo6ZGlzcGxhY2VkX2hlYWRlcl9vZmZzZXRfaW5fYnl0ZXMoKSk7CisgICAgQWRkcmVzcyBsb2NrX2FkZHIobG9ja19yZWcsIEJhc2ljT2JqZWN0TG9jazo6bG9ja19vZmZzZXRfaW5fYnl0ZXMoKSArIEJhc2ljTG9jazo6ZGlzcGxhY2VkX2hlYWRlcl9vZmZzZXRfaW5fYnl0ZXMoKSk7CisgICAgbGRfcHRyKGxvY2tfYWRkciwgZGlzcGxhY2VkX2hlYWRlcl9yZWcpOwogICAgIGJyX251bGwoZGlzcGxhY2VkX2hlYWRlcl9yZWcsIHRydWUsIEFzc2VtYmxlcjo6cG4sIGRvbmUpOwogICAgIGRlbGF5ZWQoKS0+c3RfcHRyKEcwLCBsb2Nrb2JqX2FkZHIpOyAgLy8gZnJlZSBlbnRyeQogCkBAIC0xMzg0LDcgKzEzNjYsNyBAQAogICBMYWJlbCB6ZXJvX2NvbnRpbnVlOwogCiAgIC8vIFRlc3QgTURPIHRvIGF2b2lkIHRoZSBjYWxsIGlmIGl0IGlzIE5VTEwuCi0gIGxkX3B0cihMbWV0aG9kLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjptZXRob2RfZGF0YV9vZmZzZXQoKSksIEltZXRob2REYXRhUHRyKTsKKyAgbGRfcHRyKExtZXRob2QsIG1ldGhvZE9vcERlc2M6Om1ldGhvZF9kYXRhX29mZnNldCgpLCBJbWV0aG9kRGF0YVB0cik7CiAgIHRlc3RfbWV0aG9kX2RhdGFfcG9pbnRlcih6ZXJvX2NvbnRpbnVlKTsKICAgY2FsbF9WTV9sZWFmKG5vcmVnLCBDQVNUX0ZST01fRk5fUFRSKGFkZHJlc3MsIEludGVycHJldGVyUnVudGltZTo6YmNwX3RvX2RpKSwgTG1ldGhvZCwgTGJjcCk7CiAgIHNldF9tZXRob2RfZGF0YV9wb2ludGVyX29mZnNldChPMCk7CkBAIC0xNDEzLDcgKzEzOTUsNyBAQAogICAvLyBJZiB0aGUgbWRwIGlzIHZhbGlkLCBpdCB3aWxsIHBvaW50IHRvIGEgRGF0YUxheW91dCBoZWFkZXIgd2hpY2ggaXMKICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBiY3AuICBUaGUgY29udmVyc2UgaXMgaGlnaGx5IHByb2JhYmxlIGFsc28uCiAgIGxkdWgoSW1ldGhvZERhdGFQdHIsIGluX2J5dGVzKERhdGFMYXlvdXQ6OmJjaV9vZmZzZXQoKSksIEczX3NjcmF0Y2gpOwotICBsZF9wdHIoQWRkcmVzcyhMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpjb25zdF9vZmZzZXQoKSkpLCBPNSk7CisgIGxkX3B0cihMbWV0aG9kLCBtZXRob2RPb3BEZXNjOjpjb25zdF9vZmZzZXQoKSwgTzUpOwogICBhZGQoRzNfc2NyYXRjaCwgaW5fYnl0ZXMoY29uc3RNZXRob2RPb3BEZXNjOjpjb2Rlc19vZmZzZXQoKSksIEczX3NjcmF0Y2gpOwogICBhZGQoRzNfc2NyYXRjaCwgTzUsIEczX3NjcmF0Y2gpOwogICBjbXAoTGJjcCwgRzNfc2NyYXRjaCk7CkBAIC0xNDI0LDcgKzE0MDYsNyBAQAogICAvLyAlJSUgc2hvdWxkIHVzZSBjYWxsX1ZNX2xlYWYgaGVyZT8KICAgLy9jYWxsX1ZNX2xlYWYobm9yZWcsIC4uLiwgTG1ldGhvZCwgTGJjcCwgSW1ldGhvZERhdGFQdHIpOwogICBzYXZlX2ZyYW1lX2FuZF9tb3Yoc2l6ZW9mKGpkb3VibGUpIC8gd29yZFNpemUsIExtZXRob2QsIE8wLCBMYmNwLCBPMSk7Ci0gIEFkZHJlc3MgZF9zYXZlKEZQLCAwLCAtc2l6ZW9mKGpkb3VibGUpICsgU1RBQ0tfQklBUyk7CisgIEFkZHJlc3MgZF9zYXZlKEZQLCAtc2l6ZW9mKGpkb3VibGUpICsgU1RBQ0tfQklBUyk7CiAgIHN0ZihGbG9hdFJlZ2lzdGVySW1wbDo6RCwgRnRvc19kLCBkX3NhdmUpOwogICBtb3YodGVtcF9yZWctPmFmdGVyX3NhdmUoKSwgTzIpOwogICBzYXZlX3RocmVhZChMN190aHJlYWRfY2FjaGUpOwpAQCAtMTQ1NiwxNCArMTQzOCwxNCBAQAogI2VuZGlmCiAKICAgLy8gVGVzdCB0byBzZWUgaWYgd2Ugc2hvdWxkIGNyZWF0ZSBhIG1ldGhvZCBkYXRhIG9vcAotICBBZGRyZXNzIHByb2ZpbGVfbGltaXQoUnRtcCwgKGFkZHJlc3MpJkludm9jYXRpb25Db3VudGVyOjpJbnRlcnByZXRlclByb2ZpbGVMaW1pdCk7CisgIEFkZHJlc3NMaXRlcmFsIHByb2ZpbGVfbGltaXQoKGFkZHJlc3MpICZJbnZvY2F0aW9uQ291bnRlcjo6SW50ZXJwcmV0ZXJQcm9maWxlTGltaXQpOwogI2lmZGVmIF9MUDY0CiAgIGRlbGF5ZWQoKS0+bm9wKCk7Ci0gIHNldGhpKHByb2ZpbGVfbGltaXQpOworICBzZXRoaShwcm9maWxlX2xpbWl0LCBSdG1wKTsKICNlbHNlCi0gIGRlbGF5ZWQoKS0+c2V0aGkocHJvZmlsZV9saW1pdCk7CisgIGRlbGF5ZWQoKS0+c2V0aGkocHJvZmlsZV9saW1pdCwgUnRtcCk7CiAjZW5kaWYKLSAgbGQocHJvZmlsZV9saW1pdCwgUnRtcCk7CisgIGxkKFJ0bXAsIHByb2ZpbGVfbGltaXQubG93MTAoKSwgUnRtcCk7CiAgIGNtcChpbnZvY2F0aW9uX2NvdW50LCBSdG1wKTsKICAgYnIoQXNzZW1ibGVyOjpsZXNzVW5zaWduZWQsIGZhbHNlLCBBc3NlbWJsZXI6OnBuLCBwcm9maWxlX2NvbnRpbnVlKTsKICAgZGVsYXllZCgpLT5ub3AoKTsKQEAgLTE1MjEsNyArMTUwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBidW1wZWRfY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY3JlbWVudCkgewogICAvLyBMb2NhdGUgdGhlIGNvdW50ZXIgYXQgYSBmaXhlZCBvZmZzZXQgZnJvbSB0aGUgbWRwOgotICBBZGRyZXNzIGNvdW50ZXIoSW1ldGhvZERhdGFQdHIsIDAsIGNvbnN0YW50KTsKKyAgQWRkcmVzcyBjb3VudGVyKEltZXRob2REYXRhUHRyLCBjb25zdGFudCk7CiAgIGluY3JlbWVudF9tZHBfZGF0YV9hdChjb3VudGVyLCBidW1wZWRfY291bnQsIGRlY3JlbWVudCk7CiB9CiAKQEAgLTE1MzUsNyArMTUxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY3JlbWVudCkgewogICAvLyBBZGQgdGhlIGNvbnN0YW50IHRvIHJlZyB0byBnZXQgdGhlIG9mZnNldC4KICAgYWRkKEltZXRob2REYXRhUHRyLCByZWcsIHNjcmF0Y2gyKTsKLSAgQWRkcmVzcyBjb3VudGVyKHNjcmF0Y2gyLCAwLCBjb25zdGFudCk7CisgIEFkZHJlc3MgY291bnRlcihzY3JhdGNoMiwgY29uc3RhbnQpOwogICBpbmNyZW1lbnRfbWRwX2RhdGFfYXQoY291bnRlciwgYnVtcGVkX2NvdW50LCBkZWNyZW1lbnQpOwogfQogCkBAIC0yMjAxLDcgKzIxODMsNyBAQAogCiAKIEFkZHJlc3MgSW50ZXJwcmV0ZXJNYWNyb0Fzc2VtYmxlcjo6dG9wX21vc3RfbW9uaXRvcigpIHsKLSAgcmV0dXJuIEFkZHJlc3MoRlAsIDAsIHRvcF9tb3N0X21vbml0b3JfYnl0ZV9vZmZzZXQoKSk7CisgIHJldHVybiBBZGRyZXNzKEZQLCB0b3BfbW9zdF9tb25pdG9yX2J5dGVfb2Zmc2V0KCkpOwogfQogCiAKQEAgLTIyMTQsMTUgKzIxOTYsMTUgQEAKIHZvaWQgSW50ZXJwcmV0ZXJNYWNyb0Fzc2VtYmxlcjo6aW5jcmVtZW50X2ludm9jYXRpb25fY291bnRlciggUmVnaXN0ZXIgUnRtcCwgUmVnaXN0ZXIgUnRtcDIgKSB7CiAgIGFzc2VydChVc2VDb21waWxlciwgImluY3JlbWVudGluZyBtdXN0IGJlIHVzZWZ1bCIpOwogI2lmZGVmIENDX0lOVEVSUAotICBBZGRyZXNzIGludl9jb3VudGVyKEc1X21ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6aW52b2NhdGlvbl9jb3VudGVyX29mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnZvY2F0aW9uQ291bnRlcjo6Y291bnRlcl9vZmZzZXQoKSkpOwotICBBZGRyZXNzIGJlX2NvdW50ZXIoRzVfbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpiYWNrZWRnZV9jb3VudGVyX29mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnZvY2F0aW9uQ291bnRlcjo6Y291bnRlcl9vZmZzZXQoKSkpOworICBBZGRyZXNzIGludl9jb3VudGVyKEc1X21ldGhvZCwgbWV0aG9kT29wRGVzYzo6aW52b2NhdGlvbl9jb3VudGVyX29mZnNldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9jYXRpb25Db3VudGVyOjpjb3VudGVyX29mZnNldCgpKTsKKyAgQWRkcmVzcyBiZV9jb3VudGVyIChHNV9tZXRob2QsIG1ldGhvZE9vcERlc2M6OmJhY2tlZGdlX2NvdW50ZXJfb2Zmc2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2NhdGlvbkNvdW50ZXI6OmNvdW50ZXJfb2Zmc2V0KCkpOwogI2Vsc2UKLSAgQWRkcmVzcyBpbnZfY291bnRlcihMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjppbnZvY2F0aW9uX2NvdW50ZXJfb2Zmc2V0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludm9jYXRpb25Db3VudGVyOjpjb3VudGVyX29mZnNldCgpKSk7Ci0gIEFkZHJlc3MgYmVfY291bnRlcihMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpiYWNrZWRnZV9jb3VudGVyX29mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnZvY2F0aW9uQ291bnRlcjo6Y291bnRlcl9vZmZzZXQoKSkpOworICBBZGRyZXNzIGludl9jb3VudGVyKExtZXRob2QsIG1ldGhvZE9vcERlc2M6Omludm9jYXRpb25fY291bnRlcl9vZmZzZXQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2NhdGlvbkNvdW50ZXI6OmNvdW50ZXJfb2Zmc2V0KCkpOworICBBZGRyZXNzIGJlX2NvdW50ZXIgKExtZXRob2QsIG1ldGhvZE9vcERlc2M6OmJhY2tlZGdlX2NvdW50ZXJfb2Zmc2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9jYXRpb25Db3VudGVyOjpjb3VudGVyX29mZnNldCgpKTsKICNlbmRpZiAvKiBDQ19JTlRFUlAgKi8KICAgaW50IGRlbHRhID0gSW52b2NhdGlvbkNvdW50ZXI6OmNvdW50X2luY3JlbWVudDsKIApAQCAtMjI1MCwxNSArMjIzMiwxNSBAQAogdm9pZCBJbnRlcnByZXRlck1hY3JvQXNzZW1ibGVyOjppbmNyZW1lbnRfYmFja2VkZ2VfY291bnRlciggUmVnaXN0ZXIgUnRtcCwgUmVnaXN0ZXIgUnRtcDIgKSB7CiAgIGFzc2VydChVc2VDb21waWxlciwgImluY3JlbWVudGluZyBtdXN0IGJlIHVzZWZ1bCIpOwogI2lmZGVmIENDX0lOVEVSUAotICBBZGRyZXNzIGJlX2NvdW50ZXIoRzVfbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpiYWNrZWRnZV9jb3VudGVyX29mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnZvY2F0aW9uQ291bnRlcjo6Y291bnRlcl9vZmZzZXQoKSkpOwotICBBZGRyZXNzIGludl9jb3VudGVyKEc1X21ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6aW52b2NhdGlvbl9jb3VudGVyX29mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgSW52b2NhdGlvbkNvdW50ZXI6OmNvdW50ZXJfb2Zmc2V0KCkpKTsKKyAgQWRkcmVzcyBiZV9jb3VudGVyIChHNV9tZXRob2QsIG1ldGhvZE9vcERlc2M6OmJhY2tlZGdlX2NvdW50ZXJfb2Zmc2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2NhdGlvbkNvdW50ZXI6OmNvdW50ZXJfb2Zmc2V0KCkpOworICBBZGRyZXNzIGludl9jb3VudGVyKEc1X21ldGhvZCwgbWV0aG9kT29wRGVzYzo6aW52b2NhdGlvbl9jb3VudGVyX29mZnNldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9jYXRpb25Db3VudGVyOjpjb3VudGVyX29mZnNldCgpKTsKICNlbHNlCi0gIEFkZHJlc3MgYmVfY291bnRlcihMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpiYWNrZWRnZV9jb3VudGVyX29mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnZvY2F0aW9uQ291bnRlcjo6Y291bnRlcl9vZmZzZXQoKSkpOwotICBBZGRyZXNzIGludl9jb3VudGVyKExtZXRob2QsIDAsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6Omludm9jYXRpb25fY291bnRlcl9vZmZzZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW52b2NhdGlvbkNvdW50ZXI6OmNvdW50ZXJfb2Zmc2V0KCkpKTsKKyAgQWRkcmVzcyBiZV9jb3VudGVyIChMbWV0aG9kLCBtZXRob2RPb3BEZXNjOjpiYWNrZWRnZV9jb3VudGVyX29mZnNldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uQ291bnRlcjo6Y291bnRlcl9vZmZzZXQoKSk7CisgIEFkZHJlc3MgaW52X2NvdW50ZXIoTG1ldGhvZCwgbWV0aG9kT29wRGVzYzo6aW52b2NhdGlvbl9jb3VudGVyX29mZnNldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uQ291bnRlcjo6Y291bnRlcl9vZmZzZXQoKSk7CiAjZW5kaWYgLyogQ0NfSU5URVJQICovCiAgIGludCBkZWx0YSA9IEludm9jYXRpb25Db3VudGVyOjpjb3VudF9pbmNyZW1lbnQ7CiAgIC8vIExvYWQgZWFjaCBjb3VudGVyIGluIGEgcmVnaXN0ZXIKQEAgLTIyODksNyArMjI3MSw3IEBACiAgIGFzc2VydF9kaWZmZXJlbnRfcmVnaXN0ZXJzKGJhY2tlZGdlX2NvdW50LCBSdG1wLCBicmFuY2hfYmNwKTsKICAgYXNzZXJ0KFVzZU9uU3RhY2tSZXBsYWNlbWVudCwiTXVzdCBVc2VPblN0YWNrUmVwbGFjZW1lbnQgdG8gdGVzdF9iYWNrZWRnZV9jb3VudF9mb3Jfb3NyIik7CiAKLSAgQWRkcmVzcyBsaW1pdChSdG1wLCBhZGRyZXNzKCZJbnZvY2F0aW9uQ291bnRlcjo6SW50ZXJwcmV0ZXJCYWNrd2FyZEJyYW5jaExpbWl0KSk7CisgIEFkZHJlc3NMaXRlcmFsIGxpbWl0KCZJbnZvY2F0aW9uQ291bnRlcjo6SW50ZXJwcmV0ZXJCYWNrd2FyZEJyYW5jaExpbWl0KTsKICAgbG9hZF9jb250ZW50cyhsaW1pdCwgUnRtcCk7CiAgIGNtcChiYWNrZWRnZV9jb3VudCwgUnRtcCk7CiAgIGJyKEFzc2VtYmxlcjo6bGVzc1Vuc2lnbmVkLCBmYWxzZSwgQXNzZW1ibGVyOjpwdCwgZGlkX25vdF9vdmVyZmxvdyk7CkBAIC0yNDM1LDkgKzI0MTcsNyBAQAogICBpZiAoSnZtdGlFeHBvcnQ6OmNhbl9wb3N0X2ludGVycHJldGVyX2V2ZW50cygpKSB7CiAgICAgTGFiZWwgTDsKICAgICBSZWdpc3RlciB0ZW1wX3JlZyA9IE81OwotCi0gICAgY29uc3QgQWRkcmVzcyBpbnRlcnBfb25seSAgICAgICAoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjppbnRlcnBfb25seV9tb2RlX29mZnNldCgpKSk7Ci0KKyAgICBjb25zdCBBZGRyZXNzIGludGVycF9vbmx5KEcyX3RocmVhZCwgSmF2YVRocmVhZDo6aW50ZXJwX29ubHlfbW9kZV9vZmZzZXQoKSk7CiAgICAgbGQoaW50ZXJwX29ubHksIHRlbXBfcmVnKTsKICAgICB0c3QodGVtcF9yZWcpOwogICAgIGJyKHplcm8sIGZhbHNlLCBwdCwgTCk7CkBAIC0yNDg5LDkgKzI0NjksNyBAQAogICBpZiAobW9kZSA9PSBOb3RpZnlKVk1USSAmJiBKdm10aUV4cG9ydDo6Y2FuX3Bvc3RfaW50ZXJwcmV0ZXJfZXZlbnRzKCkpIHsKICAgICBMYWJlbCBMOwogICAgIFJlZ2lzdGVyIHRlbXBfcmVnID0gTzU7Ci0KLSAgICBjb25zdCBBZGRyZXNzIGludGVycF9vbmx5ICAgICAgIChHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6OmludGVycF9vbmx5X21vZGVfb2Zmc2V0KCkpKTsKLQorICAgIGNvbnN0IEFkZHJlc3MgaW50ZXJwX29ubHkoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjppbnRlcnBfb25seV9tb2RlX29mZnNldCgpKTsKICAgICBsZChpbnRlcnBfb25seSwgdGVtcF9yZWcpOwogICAgIHRzdCh0ZW1wX3JlZyk7CiAgICAgYnIoemVybywgZmFsc2UsIHB0LCBMKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9pbnRlcnByZXRlclJUX3NwYXJjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9pbnRlcnByZXRlclJUX3NwYXJjLmNwcAppbmRleCBmNmNiOGU3Li43MzA2ZjJhIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vaW50ZXJwcmV0ZXJSVF9zcGFyYy5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2ludGVycHJldGVyUlRfc3BhcmMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAxOTk4LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAxOTk4LTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTA1LDcgKzEwNSw3IEBACiAgIC8vIHRoZSBoYW5kbGUgZm9yIGEgcmVjZWl2ZXIgd2lsbCBuZXZlciBiZSBudWxsCiAgIGJvb2wgZG9fTlVMTF9jaGVjayA9IG9mZnNldCgpICE9IDAgfHwgaXNfc3RhdGljKCk7CiAKLSAgQWRkcmVzcyAgICAgaF9hcmcgPSBBZGRyZXNzKExsb2NhbHMsIDAsIEludGVycHJldGVyOjpsb2NhbF9vZmZzZXRfaW5fYnl0ZXMob2Zmc2V0KCkpKTsKKyAgQWRkcmVzcyAgICAgaF9hcmcgPSBBZGRyZXNzKExsb2NhbHMsIEludGVycHJldGVyOjpsb2NhbF9vZmZzZXRfaW5fYnl0ZXMob2Zmc2V0KCkpKTsKICAgX18gbGRfcHRyKGhfYXJnLCBSdG1wMSk7CiAjaWZkZWYgQVNTRVJUCiAgIGlmIChUYWdnZWRTdGFja0ludGVycHJldGVyKSB7CkBAIC0xMjAsMTQgKzEyMCwxNCBAQAogICB9CiAjZW5kaWYgLy8gQVNTRVJUCiAgIGlmICghZG9fTlVMTF9jaGVjaykgewotICAgIF9fIGFkZChoX2FyZywgUnRtcDIpOworICAgIF9fIGFkZChoX2FyZy5iYXNlKCksIGhfYXJnLmRpc3AoKSwgUnRtcDIpOwogICB9IGVsc2UgewogICAgIGlmIChSdG1wMSA9PSBSdG1wMikKICAgICAgICAgICBfXyB0c3QoUnRtcDEpOwogICAgIGVsc2UgIF9fIGFkZGNjKEcwLCBSdG1wMSwgUnRtcDIpOyAvLyBvcHRpbWl6ZSBtb3YvdGVzdCBwYWlyCiAgICAgTGFiZWwgTDsKICAgICBfXyBicngoQXNzZW1ibGVyOjpub3RaZXJvLCB0cnVlLCBBc3NlbWJsZXI6OnB0LCBMKTsKLSAgICBfXyBkZWxheWVkKCktPmFkZChoX2FyZywgUnRtcDIpOworICAgIF9fIGRlbGF5ZWQoKS0+YWRkKGhfYXJnLmJhc2UoKSwgaF9hcmcuZGlzcCgpLCBSdG1wMik7CiAgICAgX18gYmluZChMKTsKICAgfQogICBfXyBzdG9yZV9wdHJfYXJndW1lbnQoUnRtcDIsIGpuaV9hcmcpOyAgICAvLyB0aGlzIGlzIG9mdGVuIGEgbm8tb3AKQEAgLTE0MCwxMCArMTQwLDEwIEBACiAgIGl0ZXJhdGUoZmluZ2VycHJpbnQpOwogCiAgIC8vIHJldHVybiByZXN1bHQgaGFuZGxlcgotICBBZGRyZXNzIHJlc3VsdF9oYW5kbGVyKExzY3JhdGNoLCBJbnRlcnByZXRlcjo6cmVzdWx0X2hhbmRsZXIobWV0aG9kKCktPnJlc3VsdF90eXBlKCkpKTsKLSAgX18gc2V0aGkocmVzdWx0X2hhbmRsZXIpOworICBBZGRyZXNzTGl0ZXJhbCByZXN1bHRfaGFuZGxlcihJbnRlcnByZXRlcjo6cmVzdWx0X2hhbmRsZXIobWV0aG9kKCktPnJlc3VsdF90eXBlKCkpKTsKKyAgX18gc2V0aGkocmVzdWx0X2hhbmRsZXIsIExzY3JhdGNoKTsKICAgX18gcmV0bCgpOwotICBfXyBkZWxheWVkKCktPmFkZChyZXN1bHRfaGFuZGxlciwgcmVzdWx0X2hhbmRsZXIuYmFzZSgpKTsKKyAgX18gZGVsYXllZCgpLT5hZGQoTHNjcmF0Y2gsIHJlc3VsdF9oYW5kbGVyLmxvdzEwKCksIExzY3JhdGNoKTsKIAogICBfXyBmbHVzaCgpOwogfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2puaUZhc3RHZXRGaWVsZF9zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vam5pRmFzdEdldEZpZWxkX3NwYXJjLmNwcAppbmRleCAzMTI1M2JhLi5hMGE0YTZiIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vam5pRmFzdEdldEZpZWxkX3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vam5pRmFzdEdldEZpZWxkX3NwYXJjLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTU3LDEwICs1NywxMCBAQAogCiAgIExhYmVsIGxhYmVsMSwgbGFiZWwyOwogCi0gIGFkZHJlc3MgY250X2FkZHIgPSBTYWZlcG9pbnRTeW5jaHJvbml6ZTo6c2FmZXBvaW50X2NvdW50ZXJfYWRkcigpOwotICBBZGRyZXNzIGNhKE8zLCBjbnRfYWRkcik7Ci0gIF9fIHNldGhpIChjYSk7Ci0gIF9fIGxkIChjYSwgRzQpOworICBBZGRyZXNzTGl0ZXJhbCBjbnRfYWRkcmxpdChTYWZlcG9pbnRTeW5jaHJvbml6ZTo6c2FmZXBvaW50X2NvdW50ZXJfYWRkcigpKTsKKyAgX18gc2V0aGkgKGNudF9hZGRybGl0LCBPMyk7CisgIEFkZHJlc3MgY250X2FkZHIoTzMsIGNudF9hZGRybGl0LmxvdzEwKCkpOworICBfXyBsZCAoY250X2FkZHIsIEc0KTsKICAgX18gYW5kY2MgKEc0LCAxLCBHMCk7CiAgIF9fIGJyIChBc3NlbWJsZXI6Om5vdFplcm8sIGZhbHNlLCBBc3NlbWJsZXI6OnBuLCBsYWJlbDEpOwogICBfXyBkZWxheWVkKCktPnNybCAoTzIsIDIsIE80KTsKQEAgLTc3LDcgKzc3LDcgQEAKICAgICBkZWZhdWx0OiAgICAgICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7CiAgIH0KIAotICBfXyBsZCAoY2EsIE81KTsKKyAgX18gbGQgKGNudF9hZGRyLCBPNSk7CiAgIF9fIGNtcCAoTzUsIEc0KTsKICAgX18gYnIgKEFzc2VtYmxlcjo6bm90RXF1YWwsIGZhbHNlLCBBc3NlbWJsZXI6OnBuLCBsYWJlbDIpOwogICBfXyBkZWxheWVkKCktPm1vdiAoTzcsIEcxKTsKQEAgLTEzNiwxMCArMTM2LDEwIEBACiAKICAgTGFiZWwgbGFiZWwxLCBsYWJlbDI7CiAKLSAgYWRkcmVzcyBjbnRfYWRkciA9IFNhZmVwb2ludFN5bmNocm9uaXplOjpzYWZlcG9pbnRfY291bnRlcl9hZGRyKCk7Ci0gIEFkZHJlc3MgY2EoRzMsIGNudF9hZGRyKTsKLSAgX18gc2V0aGkgKGNhKTsKLSAgX18gbGQgKGNhLCBHNCk7CisgIEFkZHJlc3NMaXRlcmFsIGNudF9hZGRybGl0KFNhZmVwb2ludFN5bmNocm9uaXplOjpzYWZlcG9pbnRfY291bnRlcl9hZGRyKCkpOworICBfXyBzZXRoaSAoY250X2FkZHJsaXQsIEczKTsKKyAgQWRkcmVzcyBjbnRfYWRkcihHMywgY250X2FkZHJsaXQubG93MTAoKSk7CisgIF9fIGxkIChjbnRfYWRkciwgRzQpOwogICBfXyBhbmRjYyAoRzQsIDEsIEcwKTsKICAgX18gYnIgKEFzc2VtYmxlcjo6bm90WmVybywgZmFsc2UsIEFzc2VtYmxlcjo6cG4sIGxhYmVsMSk7CiAgIF9fIGRlbGF5ZWQoKS0+c3JsIChPMiwgMiwgTzQpOwpAQCAtMTU5LDcgKzE1OSw3IEBACiAgIF9fIGxkeCAoTzUsIDAsIE8zKTsKICNlbmRpZgogCi0gIF9fIGxkIChjYSwgRzEpOworICBfXyBsZCAoY250X2FkZHIsIEcxKTsKICAgX18gY21wIChHMSwgRzQpOwogICBfXyBiciAoQXNzZW1ibGVyOjpub3RFcXVhbCwgZmFsc2UsIEFzc2VtYmxlcjo6cG4sIGxhYmVsMik7CiAgIF9fIGRlbGF5ZWQoKS0+bW92IChPNywgRzEpOwpAQCAtMjA4LDEwICsyMDgsMTAgQEAKIAogICBMYWJlbCBsYWJlbDEsIGxhYmVsMjsKIAotICBhZGRyZXNzIGNudF9hZGRyID0gU2FmZXBvaW50U3luY2hyb25pemU6OnNhZmVwb2ludF9jb3VudGVyX2FkZHIoKTsKLSAgQWRkcmVzcyBjYShPMywgY250X2FkZHIpOwotICBfXyBzZXRoaSAoY2EpOwotICBfXyBsZCAoY2EsIEc0KTsKKyAgQWRkcmVzc0xpdGVyYWwgY250X2FkZHJsaXQoU2FmZXBvaW50U3luY2hyb25pemU6OnNhZmVwb2ludF9jb3VudGVyX2FkZHIoKSk7CisgIF9fIHNldGhpIChjbnRfYWRkcmxpdCwgTzMpOworICBBZGRyZXNzIGNudF9hZGRyKE8zLCBjbnRfYWRkcmxpdC5sb3cxMCgpKTsKKyAgX18gbGQgKGNudF9hZGRyLCBHNCk7CiAgIF9fIGFuZGNjIChHNCwgMSwgRzApOwogICBfXyBiciAoQXNzZW1ibGVyOjpub3RaZXJvLCBmYWxzZSwgQXNzZW1ibGVyOjpwbiwgbGFiZWwxKTsKICAgX18gZGVsYXllZCgpLT5zcmwgKE8yLCAyLCBPNCk7CkBAIC0yMjUsNyArMjI1LDcgQEAKICAgICBkZWZhdWx0OiAgICAgICBTaG91bGROb3RSZWFjaEhlcmUoKTsKICAgfQogCi0gIF9fIGxkIChjYSwgTzUpOworICBfXyBsZCAoY250X2FkZHIsIE81KTsKICAgX18gY21wIChPNSwgRzQpOwogICBfXyBiciAoQXNzZW1ibGVyOjpub3RFcXVhbCwgZmFsc2UsIEFzc2VtYmxlcjo6cG4sIGxhYmVsMik7CiAgIF9fIGRlbGF5ZWQoKS0+bW92IChPNywgRzEpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL25hdGl2ZUluc3Rfc3BhcmMuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL25hdGl2ZUluc3Rfc3BhcmMuY3BwCmluZGV4IDE2ZTNjNjcuLmRmOWM3NzggMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9uYXRpdmVJbnN0X3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vbmF0aXZlSW5zdF9zcGFyYy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDE5OTctMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDE5OTctMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zOCw4ICszOCw3IEBACiAKICAgZGVzdHJlZyA9IGludl9yZCgqKHVuc2lnbmVkIGludCAqKWluc3RhZGRyKTsKICAgLy8gR2VuZXJhdGUgYSB0aGUgbmV3IHNlcXVlbmNlCi0gIEFkZHJlc3MgZGVzdCggZGVzdHJlZywgKGFkZHJlc3MpeCApOwotICBfbWFzbS0+c2V0aGkoIGRlc3QsIHRydWUgKTsKKyAgX21hc20tPnBhdGNoYWJsZV9zZXRoaSh4LCBkZXN0cmVnKTsKICAgSUNhY2hlOjppbnZhbGlkYXRlX3JhbmdlKGluc3RhZGRyLCA3ICogQnl0ZXNQZXJJbnN0V29yZCk7CiB9CiAKQEAgLTIyNyw4ICsyMjYsOCBAQAogICBDb2RlQnVmZmVyIGJ1ZihhZGRyX2F0KDApLCBpbnN0cnVjdGlvbl9zaXplICsgMSk7CiAgIE1hY3JvQXNzZW1ibGVyKiBfbWFzbSA9IG5ldyBNYWNyb0Fzc2VtYmxlcigmYnVmKTsKICAgLy8gR2VuZXJhdGUgdGhlIG5ldyBzZXF1ZW5jZQotICBBZGRyZXNzKE83LCBkZXN0KTsKLSAgX21hc20tPmp1bXBsX3RvKGRlc3QsIE83KTsKKyAgQWRkcmVzc0xpdGVyYWwoZGVzdCk7CisgIF9tYXNtLT5qdW1wbF90byhkZXN0LCBPNywgTzcpOwogICBJQ2FjaGU6OmludmFsaWRhdGVfcmFuZ2UoYWRkcl9hdCgwKSwgaW5zdHJ1Y3Rpb25fc2l6ZSApOwogI2VuZGlmCiB9CkBAIC0zNjEsMTAgKzM2MCwxMiBAQAogCiAgIFZNX1ZlcnNpb246OmFsbG93X2FsbCgpOwogCi0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsKLSAgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOwotICBhLT5zZXRoaSgweGNjY2NkZGRkLCBPMiwgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7Ci0gIGEtPmFkZChPMiwgbG93MTAoMHhjY2NjZGRkZCksIE8yKTsKKyAgQWRkcmVzc0xpdGVyYWwgYWwxKDB4YWFhYWJiYmIsIHJlbG9jSW5mbzo6ZXh0ZXJuYWxfd29yZF90eXBlKTsKKyAgYS0+c2V0aGkoYWwxLCBJMyk7CisgIGEtPmFkZChJMywgYWwxLmxvdzEwKCksIEkzKTsKKyAgQWRkcmVzc0xpdGVyYWwgYWwyKDB4Y2NjY2RkZGQsIHJlbG9jSW5mbzo6ZXh0ZXJuYWxfd29yZF90eXBlKTsKKyAgYS0+c2V0aGkoYWwyLCBPMik7CisgIGEtPmFkZChPMiwgYWwyLmxvdzEwKCksIE8yKTsKIAogICBubSA9IG5hdGl2ZU1vdkNvbnN0UmVnX2F0KCBjYi5jb2RlX2JlZ2luKCkgKTsKICAgbm0tPnByaW50KCk7CkBAIC00NjgsMTIgKzQ2OSwxNCBAQAogCiAgIFZNX1ZlcnNpb246OmFsbG93X2FsbCgpOwogCi0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsKKyAgQWRkcmVzc0xpdGVyYWwgYWwxKDB4YWFhYWJiYmIsIHJlbG9jSW5mbzo6ZXh0ZXJuYWxfd29yZF90eXBlKTsKKyAgYS0+c2V0aGkoYWwxLCBJMyk7CiAgIGEtPm5vcCgpOwotICBhLT5hZGQoSTMsIGxvdzEwKDB4YWFhYWJiYmIpLCBJMyk7Ci0gIGEtPnNldGhpKDB4Y2NjY2RkZGQsIE8yLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsKKyAgYS0+YWRkKEkzLCBhbDEubG93MTAoKSwgSTMpOworICBBZGRyZXNzTGl0ZXJhbCBhbDIoMHhjY2NjZGRkZCwgcmVsb2NJbmZvOjpleHRlcm5hbF93b3JkX3R5cGUpOworICBhLT5zZXRoaShhbDIsIE8yKTsKICAgYS0+bm9wKCk7Ci0gIGEtPmFkZChPMiwgbG93MTAoMHhjY2NjZGRkZCksIE8yKTsKKyAgYS0+YWRkKE8yLCBhbDIubG93MTAoKSwgTzIpOwogCiAgIG5tID0gbmF0aXZlTW92Q29uc3RSZWdQYXRjaGluZ19hdCggY2IuY29kZV9iZWdpbigpICk7CiAgIG5tLT5wcmludCgpOwpAQCAtNTYyLDUxICs1NjUsNTMgQEAKIAogICBWTV9WZXJzaW9uOjphbGxvd19hbGwoKTsKIAotICBhLT5sZHN3KCBHNSwgbG93MTAoMHhmZmZmZmZmZiksIEc0ICk7IGlkeCsrOwotICBhLT5zZXRoaSgweGFhYWFiYmJiLCBJMywgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgQWRkcmVzc0xpdGVyYWwgYWwxKDB4ZmZmZmZmZmYsIHJlbG9jSW5mbzo6ZXh0ZXJuYWxfd29yZF90eXBlKTsKKyAgQWRkcmVzc0xpdGVyYWwgYWwyKDB4YWFhYWJiYmIsIHJlbG9jSW5mbzo6ZXh0ZXJuYWxfd29yZF90eXBlKTsKKyAgYS0+bGRzdyggRzUsIGFsMS5sb3cxMCgpLCBHNCApOyBpZHgrKzsKKyAgYS0+c2V0aGkoYWwyLCBJMyk7IGEtPmFkZChJMywgYWwyLmxvdzEwKCksIEkzKTsKICAgYS0+bGRzdyggRzUsIEkzLCBHNCApOyBpZHgrKzsKLSAgYS0+bGRzYiggRzUsIGxvdzEwKDB4ZmZmZmZmZmYpLCBHNCApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5hZGQoSTMsIGxvdzEwKDB4YWFhYWJiYmIpLCBJMyk7CisgIGEtPmxkc2IoIEc1LCBhbDEubG93MTAoKSwgRzQgKTsgaWR4Kys7CisgIGEtPnNldGhpKGFsMiwgSTMpOyBhLT5hZGQoSTMsIGFsMi5sb3cxMCgpLCBJMyk7CiAgIGEtPmxkc2IoIEc1LCBJMywgRzQgKTsgaWR4Kys7Ci0gIGEtPmxkc2goIEc1LCBsb3cxMCgweGZmZmZmZmZmKSwgRzQgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBhLT5sZHNoKCBHNSwgYWwxLmxvdzEwKCksIEc0ICk7IGlkeCsrOworICBhLT5zZXRoaShhbDIsIEkzKTsgYS0+YWRkKEkzLCBhbDIubG93MTAoKSwgSTMpOwogICBhLT5sZHNoKCBHNSwgSTMsIEc0ICk7IGlkeCsrOwotICBhLT5sZHV3KCBHNSwgbG93MTAoMHhmZmZmZmZmZiksIEc0ICk7IGlkeCsrOwotICBhLT5zZXRoaSgweGFhYWFiYmJiLCBJMywgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+bGR1dyggRzUsIGFsMS5sb3cxMCgpLCBHNCApOyBpZHgrKzsKKyAgYS0+c2V0aGkoYWwyLCBJMyk7IGEtPmFkZChJMywgYWwyLmxvdzEwKCksIEkzKTsKICAgYS0+bGR1dyggRzUsIEkzLCBHNCApOyBpZHgrKzsKLSAgYS0+bGR1YiggRzUsIGxvdzEwKDB4ZmZmZmZmZmYpLCBHNCApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5hZGQoSTMsIGxvdzEwKDB4YWFhYWJiYmIpLCBJMyk7CisgIGEtPmxkdWIoIEc1LCBhbDEubG93MTAoKSwgRzQgKTsgaWR4Kys7CisgIGEtPnNldGhpKGFsMiwgSTMpOyBhLT5hZGQoSTMsIGFsMi5sb3cxMCgpLCBJMyk7CiAgIGEtPmxkdWIoIEc1LCBJMywgRzQgKTsgaWR4Kys7Ci0gIGEtPmxkdWgoIEc1LCBsb3cxMCgweGZmZmZmZmZmKSwgRzQgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBhLT5sZHVoKCBHNSwgYWwxLmxvdzEwKCksIEc0ICk7IGlkeCsrOworICBhLT5zZXRoaShhbDIsIEkzKTsgYS0+YWRkKEkzLCBhbDIubG93MTAoKSwgSTMpOwogICBhLT5sZHVoKCBHNSwgSTMsIEc0ICk7IGlkeCsrOwotICBhLT5sZHgoIEc1LCBsb3cxMCgweGZmZmZmZmZmKSwgRzQgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBhLT5sZHgoIEc1LCBhbDEubG93MTAoKSwgRzQgKTsgaWR4Kys7CisgIGEtPnNldGhpKGFsMiwgSTMpOyBhLT5hZGQoSTMsIGFsMi5sb3cxMCgpLCBJMyk7CiAgIGEtPmxkeCggRzUsIEkzLCBHNCApOyBpZHgrKzsKLSAgYS0+bGRkKCBHNSwgbG93MTAoMHhmZmZmZmZmZiksIEc0ICk7IGlkeCsrOwotICBhLT5zZXRoaSgweGFhYWFiYmJiLCBJMywgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+bGRkKCBHNSwgYWwxLmxvdzEwKCksIEc0ICk7IGlkeCsrOworICBhLT5zZXRoaShhbDIsIEkzKTsgYS0+YWRkKEkzLCBhbDIubG93MTAoKSwgSTMpOwogICBhLT5sZGQoIEc1LCBJMywgRzQgKTsgaWR4Kys7CiAgIGEtPmxkZiggRmxvYXRSZWdpc3RlckltcGw6OkQsIE8yLCAtMSwgRjE0ICk7IGlkeCsrOwotICBhLT5zZXRoaSgweGFhYWFiYmJiLCBJMywgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+c2V0aGkoYWwyLCBJMyk7IGEtPmFkZChJMywgYWwyLmxvdzEwKCksIEkzKTsKICAgYS0+bGRmKCBGbG9hdFJlZ2lzdGVySW1wbDo6UywgTzAsIEkzLCBGMTUgKTsgaWR4Kys7CiAKLSAgYS0+c3R3KCBHNSwgRzQsIGxvdzEwKDB4ZmZmZmZmZmYpICk7IGlkeCsrOwotICBhLT5zZXRoaSgweGFhYWFiYmJiLCBJMywgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+c3R3KCBHNSwgRzQsIGFsMS5sb3cxMCgpICk7IGlkeCsrOworICBhLT5zZXRoaShhbDIsIEkzKTsgYS0+YWRkKEkzLCBhbDIubG93MTAoKSwgSTMpOwogICBhLT5zdHcoIEc1LCBHNCwgSTMgKTsgaWR4Kys7Ci0gIGEtPnN0YiggRzUsIEc0LCBsb3cxMCgweGZmZmZmZmZmKSApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5hZGQoSTMsIGxvdzEwKDB4YWFhYWJiYmIpLCBJMyk7CisgIGEtPnN0YiggRzUsIEc0LCBhbDEubG93MTAoKSApOyBpZHgrKzsKKyAgYS0+c2V0aGkoYWwyLCBJMyk7IGEtPmFkZChJMywgYWwyLmxvdzEwKCksIEkzKTsKICAgYS0+c3RiKCBHNSwgRzQsIEkzICk7IGlkeCsrOwotICBhLT5zdGgoIEc1LCBHNCwgbG93MTAoMHhmZmZmZmZmZikgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBhLT5zdGgoIEc1LCBHNCwgYWwxLmxvdzEwKCkgKTsgaWR4Kys7CisgIGEtPnNldGhpKGFsMiwgSTMpOyBhLT5hZGQoSTMsIGFsMi5sb3cxMCgpLCBJMyk7CiAgIGEtPnN0aCggRzUsIEc0LCBJMyApOyBpZHgrKzsKLSAgYS0+c3R4KCBHNSwgRzQsIGxvdzEwKDB4ZmZmZmZmZmYpICk7IGlkeCsrOwotICBhLT5zZXRoaSgweGFhYWFiYmJiLCBJMywgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+c3R4KCBHNSwgRzQsIGFsMS5sb3cxMCgpICk7IGlkeCsrOworICBhLT5zZXRoaShhbDIsIEkzKTsgYS0+YWRkKEkzLCBhbDIubG93MTAoKSwgSTMpOwogICBhLT5zdHgoIEc1LCBHNCwgSTMgKTsgaWR4Kys7Ci0gIGEtPnN0ZCggRzUsIEc0LCBsb3cxMCgweGZmZmZmZmZmKSApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5hZGQoSTMsIGxvdzEwKDB4YWFhYWJiYmIpLCBJMyk7CisgIGEtPnN0ZCggRzUsIEc0LCBhbDEubG93MTAoKSApOyBpZHgrKzsKKyAgYS0+c2V0aGkoYWwyLCBJMyk7IGEtPmFkZChJMywgYWwyLmxvdzEwKCksIEkzKTsKICAgYS0+c3RkKCBHNSwgRzQsIEkzICk7IGlkeCsrOwogICBhLT5zdGYoIEZsb2F0UmVnaXN0ZXJJbXBsOjpTLCBGMTgsIE8yLCAtMSApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5hZGQoSTMsIGxvdzEwKDB4YWFhYWJiYmIpLCBJMyk7CisgIGEtPnNldGhpKGFsMiwgSTMpOyBhLT5hZGQoSTMsIGFsMi5sb3cxMCgpLCBJMyk7CiAgIGEtPnN0ZiggRmxvYXRSZWdpc3RlckltcGw6OlMsIEYxNSwgTzAsIEkzICk7IGlkeCsrOwogCiAgIG5tID0gbmF0aXZlTW92UmVnTWVtX2F0KCBjYi5jb2RlX2JlZ2luKCkgKTsKQEAgLTcwNSw1MSArNzEwLDUyIEBACiAKICAgVk1fVmVyc2lvbjo6YWxsb3dfYWxsKCk7CiAKLSAgYS0+bGRzdyggRzUsIGxvdzEwKDB4ZmZmZmZmZmYpLCBHNCApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBBZGRyZXNzTGl0ZXJhbCBhbCgweGZmZmZmZmZmLCByZWxvY0luZm86OmV4dGVybmFsX3dvcmRfdHlwZSk7CisgIGEtPmxkc3coIEc1LCBhbC5sb3cxMCgpLCBHNCk7IGlkeCsrOworICBhLT5zZXRoaShhbCwgSTMpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBhbC5sb3cxMCgpLCBJMyk7CiAgIGEtPmxkc3coIEc1LCBJMywgRzQgKTsgaWR4Kys7Ci0gIGEtPmxkc2IoIEc1LCBsb3cxMCgweGZmZmZmZmZmKSwgRzQgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+bGRzYiggRzUsIGFsLmxvdzEwKCksIEc0KTsgaWR4Kys7CisgIGEtPnNldGhpKGFsLCBJMyk7IGEtPm5vcCgpOyBhLT5hZGQoSTMsIGFsLmxvdzEwKCksIEkzKTsKICAgYS0+bGRzYiggRzUsIEkzLCBHNCApOyBpZHgrKzsKLSAgYS0+bGRzaCggRzUsIGxvdzEwKDB4ZmZmZmZmZmYpLCBHNCApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBhLT5sZHNoKCBHNSwgYWwubG93MTAoKSwgRzQpOyBpZHgrKzsKKyAgYS0+c2V0aGkoYWwsIEkzKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgYWwubG93MTAoKSwgSTMpOwogICBhLT5sZHNoKCBHNSwgSTMsIEc0ICk7IGlkeCsrOwotICBhLT5sZHV3KCBHNSwgbG93MTAoMHhmZmZmZmZmZiksIEc0ICk7IGlkeCsrOwotICBhLT5zZXRoaSgweGFhYWFiYmJiLCBJMywgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7IGEtPm5vcCgpOyBhLT5hZGQoSTMsIGxvdzEwKDB4YWFhYWJiYmIpLCBJMyk7CisgIGEtPmxkdXcoIEc1LCBhbC5sb3cxMCgpLCBHNCk7IGlkeCsrOworICBhLT5zZXRoaShhbCwgSTMpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBhbC5sb3cxMCgpLCBJMyk7CiAgIGEtPmxkdXcoIEc1LCBJMywgRzQgKTsgaWR4Kys7Ci0gIGEtPmxkdWIoIEc1LCBsb3cxMCgweGZmZmZmZmZmKSwgRzQgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+bGR1YiggRzUsIGFsLmxvdzEwKCksIEc0KTsgaWR4Kys7CisgIGEtPnNldGhpKGFsLCBJMyk7IGEtPm5vcCgpOyBhLT5hZGQoSTMsIGFsLmxvdzEwKCksIEkzKTsKICAgYS0+bGR1YiggRzUsIEkzLCBHNCApOyBpZHgrKzsKLSAgYS0+bGR1aCggRzUsIGxvdzEwKDB4ZmZmZmZmZmYpLCBHNCApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBhLT5sZHVoKCBHNSwgYWwubG93MTAoKSwgRzQpOyBpZHgrKzsKKyAgYS0+c2V0aGkoYWwsIEkzKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgYWwubG93MTAoKSwgSTMpOwogICBhLT5sZHVoKCBHNSwgSTMsIEc0ICk7IGlkeCsrOwotICBhLT5sZHgoIEc1LCBsb3cxMCgweGZmZmZmZmZmKSwgRzQgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKLSAgYS0+bGR4KCBHNSwgSTMsIEc0ICk7IGlkeCsrOwotICBhLT5sZGQoIEc1LCBsb3cxMCgweGZmZmZmZmZmKSwgRzQgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKLSAgYS0+bGRkKCBHNSwgSTMsIEc0ICk7IGlkeCsrOwotICBhLT5sZGYoIEZsb2F0UmVnaXN0ZXJJbXBsOjpELCBPMiwgLTEsIEYxNCApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOwotICBhLT5sZGYoIEZsb2F0UmVnaXN0ZXJJbXBsOjpTLCBPMCwgSTMsIEYxNSApOyBpZHgrKzsKKyAgYS0+bGR4KCAgRzUsIGFsLmxvdzEwKCksIEc0KTsgaWR4Kys7CisgIGEtPnNldGhpKGFsLCBJMyk7IGEtPm5vcCgpOyBhLT5hZGQoSTMsIGFsLmxvdzEwKCksIEkzKTsKKyAgYS0+bGR4KCAgRzUsIEkzLCBHNCApOyBpZHgrKzsKKyAgYS0+bGRkKCAgRzUsIGFsLmxvdzEwKCksIEc0KTsgaWR4Kys7CisgIGEtPnNldGhpKGFsLCBJMyk7IGEtPm5vcCgpOyBhLT5hZGQoSTMsIGFsLmxvdzEwKCksIEkzKTsKKyAgYS0+bGRkKCAgRzUsIEkzLCBHNCApOyBpZHgrKzsKKyAgYS0+bGRmKCAgRmxvYXRSZWdpc3RlckltcGw6OkQsIE8yLCAtMSwgRjE0ICk7IGlkeCsrOworICBhLT5zZXRoaShhbCwgSTMpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBhbC5sb3cxMCgpLCBJMyk7CisgIGEtPmxkZiggIEZsb2F0UmVnaXN0ZXJJbXBsOjpTLCBPMCwgSTMsIEYxNSApOyBpZHgrKzsKIAotICBhLT5zdHcoIEc1LCBHNCwgbG93MTAoMHhmZmZmZmZmZikgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+c3R3KCBHNSwgRzQsIGFsLmxvdzEwKCkpOyBpZHgrKzsKKyAgYS0+c2V0aGkoYWwsIEkzKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgYWwubG93MTAoKSwgSTMpOwogICBhLT5zdHcoIEc1LCBHNCwgSTMgKTsgaWR4Kys7Ci0gIGEtPnN0YiggRzUsIEc0LCBsb3cxMCgweGZmZmZmZmZmKSApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBhLT5zdGIoIEc1LCBHNCwgYWwubG93MTAoKSk7IGlkeCsrOworICBhLT5zZXRoaShhbCwgSTMpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBhbC5sb3cxMCgpLCBJMyk7CiAgIGEtPnN0YiggRzUsIEc0LCBJMyApOyBpZHgrKzsKLSAgYS0+c3RoKCBHNSwgRzQsIGxvdzEwKDB4ZmZmZmZmZmYpICk7IGlkeCsrOwotICBhLT5zZXRoaSgweGFhYWFiYmJiLCBJMywgdHJ1ZSwgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7IGEtPm5vcCgpOyBhLT5hZGQoSTMsIGxvdzEwKDB4YWFhYWJiYmIpLCBJMyk7CisgIGEtPnN0aCggRzUsIEc0LCBhbC5sb3cxMCgpKTsgaWR4Kys7CisgIGEtPnNldGhpKGFsLCBJMyk7IGEtPm5vcCgpOyBhLT5hZGQoSTMsIGFsLmxvdzEwKCksIEkzKTsKICAgYS0+c3RoKCBHNSwgRzQsIEkzICk7IGlkeCsrOwotICBhLT5zdHgoIEc1LCBHNCwgbG93MTAoMHhmZmZmZmZmZikgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+c3R4KCBHNSwgRzQsIGFsLmxvdzEwKCkpOyBpZHgrKzsKKyAgYS0+c2V0aGkoYWwsIEkzKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgYWwubG93MTAoKSwgSTMpOwogICBhLT5zdHgoIEc1LCBHNCwgSTMgKTsgaWR4Kys7Ci0gIGEtPnN0ZCggRzUsIEc0LCBsb3cxMCgweGZmZmZmZmZmKSApOyBpZHgrKzsKLSAgYS0+c2V0aGkoMHhhYWFhYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBsb3cxMCgweGFhYWFiYmJiKSwgSTMpOworICBhLT5zdGQoIEc1LCBHNCwgYWwubG93MTAoKSk7IGlkeCsrOworICBhLT5zZXRoaShhbCwgSTMpOyBhLT5ub3AoKTsgYS0+YWRkKEkzLCBhbC5sb3cxMCgpLCBJMyk7CiAgIGEtPnN0ZCggRzUsIEc0LCBJMyApOyBpZHgrKzsKICAgYS0+c3RmKCBGbG9hdFJlZ2lzdGVySW1wbDo6UywgRjE4LCBPMiwgLTEgKTsgaWR4Kys7Ci0gIGEtPnNldGhpKDB4YWFhYWJiYmIsIEkzLCB0cnVlLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgbG93MTAoMHhhYWFhYmJiYiksIEkzKTsKKyAgYS0+c2V0aGkoYWwsIEkzKTsgYS0+bm9wKCk7IGEtPmFkZChJMywgYWwubG93MTAoKSwgSTMpOwogICBhLT5zdGYoIEZsb2F0UmVnaXN0ZXJJbXBsOjpTLCBGMTUsIE8wLCBJMyApOyBpZHgrKzsKIAogICBubSA9IG5hdGl2ZU1vdlJlZ01lbVBhdGNoaW5nX2F0KCBjYi5jb2RlX2JlZ2luKCkgKTsKQEAgLTgzMywxMSArODM5LDEyIEBACiAKICAgVk1fVmVyc2lvbjo6YWxsb3dfYWxsKCk7CiAKLSAgYS0+c2V0aGkoMHg3ZmZmYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOwotICBhLT5qbXBsKEkzLCBsb3cxMCgweDdmZmZiYmJiKSwgRzAsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOworICBBZGRyZXNzTGl0ZXJhbCBhbCgweDdmZmZiYmJiLCByZWxvY0luZm86OmV4dGVybmFsX3dvcmRfdHlwZSk7CisgIGEtPnNldGhpKGFsLCBJMyk7CisgIGEtPmptcGwoSTMsIGFsLmxvdzEwKCksIEcwLCBSZWxvY2F0aW9uSG9sZGVyOjpub25lKTsKICAgYS0+ZGVsYXllZCgpLT5ub3AoKTsKLSAgYS0+c2V0aGkoMHg3ZmZmYmJiYiwgSTMsIHRydWUsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOwotICBhLT5qbXBsKEkzLCBsb3cxMCgweDdmZmZiYmJiKSwgTDMsIFJlbG9jYXRpb25Ib2xkZXI6Om5vbmUpOworICBhLT5zZXRoaShhbCwgSTMpOworICBhLT5qbXBsKEkzLCBhbC5sb3cxMCgpLCBMMywgUmVsb2NhdGlvbkhvbGRlcjo6bm9uZSk7CiAgIGEtPmRlbGF5ZWQoKS0+bm9wKCk7CiAKICAgbmogPSBuYXRpdmVKdW1wX2F0KCBjYi5jb2RlX2JlZ2luKCkgKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9yZWxvY0luZm9fc3BhcmMuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3JlbG9jSW5mb19zcGFyYy5jcHAKaW5kZXggYWIzNjU1NS4uNjFhNDNhOCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3JlbG9jSW5mb19zcGFyYy5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3JlbG9jSW5mb19zcGFyYy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDE5OTgtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDE5OTgtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC05OSwxMyArOTksNiBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlwLT5zZXRfZGF0YTY0X3NldGhpKCBpcC0+YWRkcl9hdCgwKSwgKGludHB0cl90KXggKTsKLSNpZmRlZiBDT01QSUxFUjIKLSAgICAvLyBbUkdWXSBTb21lb25lIG11c3QgaGF2ZSBtaXNzZWQgcHV0dGluZyBpbiBhIHJlbG9jIGVudHJ5IGZvciB0aGUKLSAgICAvLyBhZGQgaW4gY29tcGlsZXIyLgotICAgIGluc3QyID0gaXAtPmxvbmdfYXQoIE5hdGl2ZU1vdkNvbnN0UmVnOjphZGRfb2Zmc2V0ICk7Ci0gICAgZ3VhcmFudGVlKEFzc2VtYmxlcjo6aW52X29wKGluc3QyKT09QXNzZW1ibGVyOjphcml0aF9vcCwgImFyaXRoIG9wIik7Ci0gICAgaXAtPnNldF9sb25nX2F0KE5hdGl2ZU1vdkNvbnN0UmVnOjphZGRfb2Zmc2V0LGlwLT5zZXRfZGF0YTMyX3NpbW0xMyggaW5zdDIsIChpbnRwdHJfdCl4K28pKTsKLSNlbmRpZgogI2Vsc2UKICAgICBndWFyYW50ZWUoQXNzZW1ibGVyOjppbnZfb3AyKGluc3QpPT1Bc3NlbWJsZXI6OnNldGhpX29wMiwgIm11c3QgYmUgc2V0aGkiKTsKICAgICBpbnN0ICY9IH5Bc3NlbWJsZXI6OmhpMjIoICAgICAtMSk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vcnVudGltZV9zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vcnVudGltZV9zcGFyYy5jcHAKaW5kZXggMTgxOTkwZS4uOWFlNDhjYiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3J1bnRpbWVfc3BhcmMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9ydW50aW1lX3NwYXJjLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMTk5OC0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTc0LDggKzc0LDggQEAKICAgaW50IHN0YXJ0ID0gX18gb2Zmc2V0KCk7CiAKICAgX18gdmVyaWZ5X3RocmVhZCgpOwotICBfXyBzdF9wdHIoT2V4Y2VwdGlvbiwgIEFkZHJlc3MoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjpleGNlcHRpb25fb29wX29mZnNldCgpKSkpOwotICBfXyBzdF9wdHIoT2lzc3VpbmdfcGMsIEFkZHJlc3MoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjpleGNlcHRpb25fcGNfb2Zmc2V0KCkpKSk7CisgIF9fIHN0X3B0cihPZXhjZXB0aW9uLCAgRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpleGNlcHRpb25fb29wX29mZnNldCgpKTsKKyAgX18gc3RfcHRyKE9pc3N1aW5nX3BjLCBHMl90aHJlYWQsIEphdmFUaHJlYWQ6OmV4Y2VwdGlvbl9wY19vZmZzZXQoKSk7CiAKICAgLy8gVGhpcyBjYWxsIGRvZXMgYWxsIHRoZSBoYXJkIHdvcmsuIEl0IGNoZWNrcyBpZiBhbiBleGNlcHRpb24gY2F0Y2gKICAgLy8gZXhpc3RzIGluIHRoZSBtZXRob2QuCkBAIC0xMjAsMTkgKzEyMCwxOSBAQAogICAvLyBTaW5jZSB0aGlzIG1heSBiZSB0aGUgZGVvcHQgYmxvYiB3ZSBtdXN0IHNldCBPNyB0byBsb29rIGxpa2Ugd2UgcmV0dXJuZWQKICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgcGMgdGhhdCB0aHJldyB0aGUgZXhjZXB0aW9uCiAKLSAgX18gbGRfcHRyKEFkZHJlc3MoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjpleGNlcHRpb25fcGNfb2Zmc2V0KCkpKSwgTzcpOworICBfXyBsZF9wdHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpleGNlcHRpb25fcGNfb2Zmc2V0KCksIE83KTsKICAgX18gc3ViKE83LCBmcmFtZTo6cGNfcmV0dXJuX29mZnNldCwgTzcpOwogCiAKICAgYXNzZXJ0KEFzc2VtYmxlcjo6aXNfc2ltbTEzKGluX2J5dGVzKEphdmFUaHJlYWQ6OmV4Y2VwdGlvbl9vb3Bfb2Zmc2V0KCkpKSwgImV4Y2VwdGlvbiBvZmZzZXQgb3ZlcmZsb3dzIHNpbW0xMywgZm9sbG93aW5nIGxkIGluc3RydWN0aW9uIGNhbm5vdCBiZSBpbiBkZWxheSBzbG90Iik7Ci0gIF9fIGxkX3B0cihBZGRyZXNzKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6ZXhjZXB0aW9uX29vcF9vZmZzZXQoKSkpLCBPZXhjZXB0aW9uKTsgLy8gTzAKKyAgX18gbGRfcHRyKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6ZXhjZXB0aW9uX29vcF9vZmZzZXQoKSwgT2V4Y2VwdGlvbik7IC8vIE8wCiAjaWZkZWYgQVNTRVJUCi0gIF9fIHN0X3B0cihHMCwgQWRkcmVzcyhHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6OmV4Y2VwdGlvbl9oYW5kbGVyX3BjX29mZnNldCgpKSkpOwotICBfXyBzdF9wdHIoRzAsIEFkZHJlc3MoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjpleGNlcHRpb25fcGNfb2Zmc2V0KCkpKSk7CisgIF9fIHN0X3B0cihHMCwgRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpleGNlcHRpb25faGFuZGxlcl9wY19vZmZzZXQoKSk7CisgIF9fIHN0X3B0cihHMCwgRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpleGNlcHRpb25fcGNfb2Zmc2V0KCkpOwogI2VuZGlmCiAgIF9fIEpNUChHM19zY3JhdGNoLCAwKTsKICAgLy8gQ2xlYXIgdGhlIGV4Y2VwdGlvbiBvb3Agc28gR0Mgbm8gbG9uZ2VyIHByb2Nlc3NlcyBpdCBhcyBhIHJvb3QuCi0gIF9fIGRlbGF5ZWQoKS0+c3RfcHRyKEcwLCBBZGRyZXNzKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6ZXhjZXB0aW9uX29vcF9vZmZzZXQoKSkpKTsKKyAgX18gZGVsYXllZCgpLT5zdF9wdHIoRzAsIEcyX3RocmVhZCwgSmF2YVRocmVhZDo6ZXhjZXB0aW9uX29vcF9vZmZzZXQoKSk7CiAKICAgLy8gLS0tLS0tLS0tLS0tLQogICAvLyBtYWtlIHN1cmUgYWxsIGNvZGUgaXMgZ2VuZXJhdGVkCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vc2hhcmVkUnVudGltZV9zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vc2hhcmVkUnVudGltZV9zcGFyYy5jcHAKaW5kZXggZTJiZDA0NC4uNmRkMGExZiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3NoYXJlZFJ1bnRpbWVfc3BhcmMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9zaGFyZWRSdW50aW1lX3NwYXJjLmNwcApAQCAtNjI1LDkgKzYyNSw5IEBACiAgIF9fIG1vdihJNywgTzEpOyAgICAgICAgICAgICAgICAvLyBWTSBuZWVkcyBjYWxsZXIncyBjYWxsc2l0ZQogICAvLyBNdXN0IGJlIGEgbGVhZiBjYWxsLi4uCiAgIC8vIGNhbiBiZSB2ZXJ5IGZhciBvbmNlIHRoZSBibG9iIGhhcyBiZWVuIHJlbG9jYXRlZAotICBBZGRyZXNzIGRlc3QoTzcsIENBU1RfRlJPTV9GTl9QVFIoYWRkcmVzcywgU2hhcmVkUnVudGltZTo6Zml4dXBfY2FsbGVyc19jYWxsc2l0ZSkpOworICBBZGRyZXNzTGl0ZXJhbCBkZXN0KENBU1RfRlJPTV9GTl9QVFIoYWRkcmVzcywgU2hhcmVkUnVudGltZTo6Zml4dXBfY2FsbGVyc19jYWxsc2l0ZSkpOwogICBfXyByZWxvY2F0ZShyZWxvY0luZm86OnJ1bnRpbWVfY2FsbF90eXBlKTsKLSAgX18ganVtcGxfdG8oZGVzdCwgTzcpOworICBfXyBqdW1wbF90byhkZXN0LCBPNywgTzcpOwogICBfXyBkZWxheWVkKCktPm1vdihHMl90aHJlYWQsIEw3X3RocmVhZF9jYWNoZSk7CiAgIF9fIG1vdihMN190aHJlYWRfY2FjaGUsIEcyX3RocmVhZCk7CiAgIF9fIG1vdihMMSwgRzEpOwpAQCAtMTE1Miw3ICsxMTUyLDcgQEAKICNpZm5kZWYgX0xQNjQKICAgICBpZiAoZzNfY3J1c2hlZCkgewogICAgICAgLy8gUmF0cyBsb2FkIHdhcyB3YXN0ZWQsIGF0IGxlYXN0IGl0IGlzIGluIGNhY2hlLi4uCi0gICAgICBfXyBsZF9wdHIoRzVfbWV0aG9kLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpmcm9tX2NvbXBpbGVkX29mZnNldCgpKSwgRzMpOworICAgICAgX18gbGRfcHRyKEc1X21ldGhvZCwgbWV0aG9kT29wRGVzYzo6ZnJvbV9jb21waWxlZF9vZmZzZXQoKSwgRzMpOwogICAgIH0KICNlbmRpZiAvKiBfTFA2NCAqLwogCkBAIC0xMTY1LDcgKzExNjUsNyBAQAogICAgIC8vIHdlIHRyeSBhbmQgZmluZCB0aGUgY2FsbGVlIGJ5IG5vcm1hbCBtZWFucyBhIHNhZmVwb2ludAogICAgIC8vIGlzIHBvc3NpYmxlLiBTbyB3ZSBzdGFzaCB0aGUgZGVzaXJlZCBjYWxsZWUgaW4gdGhlIHRocmVhZAogICAgIC8vIGFuZCB0aGUgdm0gd2lsbCBmaW5kIHRoZXJlIHNob3VsZCB0aGlzIGNhc2Ugb2NjdXIuCi0gICAgQWRkcmVzcyBjYWxsZWVfdGFyZ2V0X2FkZHIoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjpjYWxsZWVfdGFyZ2V0X29mZnNldCgpKSk7CisgICAgQWRkcmVzcyBjYWxsZWVfdGFyZ2V0X2FkZHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpjYWxsZWVfdGFyZ2V0X29mZnNldCgpKTsKICAgICBfXyBzdF9wdHIoRzVfbWV0aG9kLCBjYWxsZWVfdGFyZ2V0X2FkZHIpOwogCiAgICAgaWYgKFN0cmVzc05vbkVudHJhbnQpIHsKQEAgLTEyMTgsNyArMTIxOCw3IEBACiAgICAgUmVnaXN0ZXIgUl90ZW1wICAgPSBHMTsgICAvLyBhbm90aGVyIHNjcmF0Y2ggcmVnaXN0ZXIKICNlbmRpZgogCi0gICAgQWRkcmVzcyBpY19taXNzKEczX3NjcmF0Y2gsIFNoYXJlZFJ1bnRpbWU6OmdldF9pY19taXNzX3N0dWIoKSk7CisgICAgQWRkcmVzc0xpdGVyYWwgaWNfbWlzcyhTaGFyZWRSdW50aW1lOjpnZXRfaWNfbWlzc19zdHViKCkpOwogCiAgICAgX18gdmVyaWZ5X29vcChPMCk7CiAgICAgX18gdmVyaWZ5X29vcChHNV9tZXRob2QpOwpAQCAtMTI0MCw3ICsxMjQwLDcgQEAKICAgICBMYWJlbCBvaywgb2syOwogICAgIF9fIGJyeChBc3NlbWJsZXI6OmVxdWFsLCBmYWxzZSwgQXNzZW1ibGVyOjpwdCwgb2spOwogICAgIF9fIGRlbGF5ZWQoKS0+bGRfcHRyKEc1X21ldGhvZCwgY29tcGlsZWRJQ0hvbGRlck9vcERlc2M6OmhvbGRlcl9tZXRob2Rfb2Zmc2V0KCksIEc1X21ldGhvZCk7Ci0gICAgX18ganVtcF90byhpY19taXNzKTsKKyAgICBfXyBqdW1wX3RvKGljX21pc3MsIEczX3NjcmF0Y2gpOwogICAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CiAKICAgICBfXyBiaW5kKG9rKTsKQEAgLTEyNTEsNyArMTI1MSw3IEBACiAgICAgX18gYmluZChvazIpOwogICAgIF9fIGJyX251bGwoRzNfc2NyYXRjaCwgZmFsc2UsIF9fIHB0LCBza2lwX2ZpeHVwKTsKICAgICBfXyBkZWxheWVkKCktPmxkX3B0cihHNV9tZXRob2QsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6OmludGVycHJldGVyX2VudHJ5X29mZnNldCgpKSwgRzNfc2NyYXRjaCk7Ci0gICAgX18ganVtcF90byhpY19taXNzKTsKKyAgICBfXyBqdW1wX3RvKGljX21pc3MsIEczX3NjcmF0Y2gpOwogICAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CiAKICAgfQpAQCAtMTQ0NCw4ICsxNDQ0LDggQEAKICAgLy8gd2l0aG91dCBjYWxsaW5nIGludG8gdGhlIFZNOiBpdCdzIHRoZSBlbXB0eSBmdW5jdGlvbi4gIEp1c3QgcG9wIHRoaXMKICAgLy8gZnJhbWUgYW5kIHRoZW4ganVtcCB0byBmb3J3YXJkX2V4Y2VwdGlvbl9lbnRyeTsgTzcgd2lsbCBjb250YWluIHRoZQogICAvLyBuYXRpdmUgY2FsbGVyJ3MgcmV0dXJuIFBDLgotICBBZGRyZXNzIGV4Y2VwdGlvbl9lbnRyeShHM19zY3JhdGNoLCBTdHViUm91dGluZXM6OmZvcndhcmRfZXhjZXB0aW9uX2VudHJ5KCkpOwotICBfXyBqdW1wX3RvKGV4Y2VwdGlvbl9lbnRyeSk7CisgQWRkcmVzc0xpdGVyYWwgZXhjZXB0aW9uX2VudHJ5KFN0dWJSb3V0aW5lczo6Zm9yd2FyZF9leGNlcHRpb25fZW50cnkoKSk7CisgIF9fIGp1bXBfdG8oZXhjZXB0aW9uX2VudHJ5LCBHM19zY3JhdGNoKTsKICAgX18gZGVsYXllZCgpLT5yZXN0b3JlKCk7ICAgICAgLy8gUG9wIHRoaXMgZnJhbWUgb2ZmLgogICBfXyBiaW5kKEwpOwogfQpAQCAtMTgyMiwxNCArMTgyMiwxNCBAQAogICB7CiAgICAgTGFiZWwgTDsKICAgICBjb25zdCBSZWdpc3RlciB0ZW1wX3JlZyA9IEczX3NjcmF0Y2g7Ci0gICAgQWRkcmVzcyBpY19taXNzKHRlbXBfcmVnLCBTaGFyZWRSdW50aW1lOjpnZXRfaWNfbWlzc19zdHViKCkpOworICAgIEFkZHJlc3NMaXRlcmFsIGljX21pc3MoU2hhcmVkUnVudGltZTo6Z2V0X2ljX21pc3Nfc3R1YigpKTsKICAgICBfXyB2ZXJpZnlfb29wKE8wKTsKICAgICBfXyBsb2FkX2tsYXNzKE8wLCB0ZW1wX3JlZyk7CiAgICAgX18gY21wKHRlbXBfcmVnLCBHNV9pbmxpbmVfY2FjaGVfcmVnKTsKICAgICBfXyBicngoQXNzZW1ibGVyOjplcXVhbCwgdHJ1ZSwgQXNzZW1ibGVyOjpwdCwgTCk7CiAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKIAotICAgIF9fIGp1bXBfdG8oaWNfbWlzcywgMCk7CisgICAgX18ganVtcF90byhpY19taXNzLCB0ZW1wX3JlZyk7CiAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKICAgICBfXyBhbGlnbihDb2RlRW50cnlBbGlnbm1lbnQpOwogICAgIF9fIGJpbmQoTCk7CkBAIC0yMjYxLDIxICsyMjYxLDE5IEBACiAKICAgLy8gVHJhbnNpdGlvbiBmcm9tIF90aHJlYWRfaW5fSmF2YSB0byBfdGhyZWFkX2luX25hdGl2ZS4KICAgX18gc2V0KF90aHJlYWRfaW5fbmF0aXZlLCBHM19zY3JhdGNoKTsKLSAgX18gc3QoRzNfc2NyYXRjaCwgRzJfdGhyZWFkLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjp0aHJlYWRfc3RhdGVfb2Zmc2V0KCkpKTsKKyAgX18gc3QoRzNfc2NyYXRjaCwgRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjp0aHJlYWRfc3RhdGVfb2Zmc2V0KCkpOwogCiAgIC8vIFdlIGZsdXNoZWQgdGhlIHdpbmRvd3MgYWdlcyBhZ28gbm93IG1hcmsgdGhlbSBhcyBmbHVzaGVkCiAKICAgLy8gbWFyayB3aW5kb3dzIGFzIGZsdXNoZWQKICAgX18gc2V0KEphdmFGcmFtZUFuY2hvcjo6Zmx1c2hlZCwgRzNfc2NyYXRjaCk7CiAKLSAgQWRkcmVzcyBmbGFncyhHMl90aHJlYWQsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICBpbl9ieXRlcyhKYXZhVGhyZWFkOjpmcmFtZV9hbmNob3Jfb2Zmc2V0KCkpICsgaW5fYnl0ZXMoSmF2YUZyYW1lQW5jaG9yOjpmbGFnc19vZmZzZXQoKSkpOworICBBZGRyZXNzIGZsYWdzKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6ZnJhbWVfYW5jaG9yX29mZnNldCgpICsgSmF2YUZyYW1lQW5jaG9yOjpmbGFnc19vZmZzZXQoKSk7CiAKICNpZmRlZiBfTFA2NAotICBBZGRyZXNzIGRlc3QoTzcsIG1ldGhvZC0+bmF0aXZlX2Z1bmN0aW9uKCkpOworICBBZGRyZXNzTGl0ZXJhbCBkZXN0KG1ldGhvZC0+bmF0aXZlX2Z1bmN0aW9uKCkpOwogICBfXyByZWxvY2F0ZShyZWxvY0luZm86OnJ1bnRpbWVfY2FsbF90eXBlKTsKLSAgX18ganVtcGxfdG8oZGVzdCwgTzcpOworICBfXyBqdW1wbF90byhkZXN0LCBPNywgTzcpOwogI2Vsc2UKICAgX18gY2FsbChtZXRob2QtPm5hdGl2ZV9mdW5jdGlvbigpLCByZWxvY0luZm86OnJ1bnRpbWVfY2FsbF90eXBlKTsKICNlbmRpZgpAQCAtMjMxNiw3ICsyMzE0LDcgQEAKICAgLy8gQmxvY2ssIGlmIG5lY2Vzc2FyeSwgYmVmb3JlIHJlc3VtaW5nIGluIF90aHJlYWRfaW5fSmF2YSBzdGF0ZS4KICAgLy8gSW4gb3JkZXIgZm9yIEdDIHRvIHdvcmssIGRvbid0IGNsZWFyIHRoZSBsYXN0X0phdmFfc3AgdW50aWwgYWZ0ZXIgYmxvY2tpbmcuCiAgIHsgTGFiZWwgbm9fYmxvY2s7Ci0gICAgQWRkcmVzcyBzeW5jX3N0YXRlKEczX3NjcmF0Y2gsIFNhZmVwb2ludFN5bmNocm9uaXplOjphZGRyZXNzX29mX3N0YXRlKCkpOworICAgIEFkZHJlc3NMaXRlcmFsIHN5bmNfc3RhdGUoU2FmZXBvaW50U3luY2hyb25pemU6OmFkZHJlc3Nfb2Zfc3RhdGUoKSk7CiAKICAgICAvLyBTd2l0Y2ggdGhyZWFkIHRvICJuYXRpdmUgdHJhbnNpdGlvbiIgc3RhdGUgYmVmb3JlIHJlYWRpbmcgdGhlIHN5bmNocm9uaXphdGlvbiBzdGF0ZS4KICAgICAvLyBUaGlzIGFkZGl0aW9uYWwgc3RhdGUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgcmVhZGluZyBhbmQgdGVzdGluZyB0aGUgc3luY2hyb25pemF0aW9uCkBAIC0yMzI2LDcgKzIzMjQsNyBAQAogICAgIC8vICAgICBUaHJlYWQgQSBpcyByZXN1bWVkIHRvIGZpbmlzaCB0aGlzIG5hdGl2ZSBtZXRob2QsIGJ1dCBkb2Vzbid0IGJsb2NrIGhlcmUgc2luY2UgaXQKICAgICAvLyAgICAgZGlkbid0IHNlZSBhbnkgc3luY2hyb25pemF0aW9uIGlzIHByb2dyZXNzLCBhbmQgZXNjYXBlcy4KICAgICBfXyBzZXQoX3RocmVhZF9pbl9uYXRpdmVfdHJhbnMsIEczX3NjcmF0Y2gpOwotICAgIF9fIHN0KEczX3NjcmF0Y2gsIEcyX3RocmVhZCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6dGhyZWFkX3N0YXRlX29mZnNldCgpKSk7CisgICAgX18gc3QoRzNfc2NyYXRjaCwgRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjp0aHJlYWRfc3RhdGVfb2Zmc2V0KCkpOwogICAgIGlmKG9zOjppc19NUCgpKSB7CiAgICAgICBpZiAoVXNlTWVtYmFyKSB7CiAgICAgICAgIC8vIEZvcmNlIHRoaXMgd3JpdGUgb3V0IGJlZm9yZSB0aGUgcmVhZCBiZWxvdwpAQCAtMjM0MywxMCArMjM0MSw5IEBACiAgICAgX18gY21wKEczX3NjcmF0Y2gsIFNhZmVwb2ludFN5bmNocm9uaXplOjpfbm90X3N5bmNocm9uaXplZCk7CiAKICAgICBMYWJlbCBMOwotICAgIEFkZHJlc3Mgc3VzcGVuZF9zdGF0ZShHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6OnN1c3BlbmRfZmxhZ3Nfb2Zmc2V0KCkpKTsKKyAgICBBZGRyZXNzIHN1c3BlbmRfc3RhdGUoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpzdXNwZW5kX2ZsYWdzX29mZnNldCgpKTsKICAgICBfXyBicihBc3NlbWJsZXI6Om5vdEVxdWFsLCBmYWxzZSwgQXNzZW1ibGVyOjpwbiwgTCk7Ci0gICAgX18gZGVsYXllZCgpLT4KLSAgICAgIGxkKHN1c3BlbmRfc3RhdGUsIEczX3NjcmF0Y2gpOworICAgIF9fIGRlbGF5ZWQoKS0+bGQoc3VzcGVuZF9zdGF0ZSwgRzNfc2NyYXRjaCk7CiAgICAgX18gY21wKEczX3NjcmF0Y2gsIDApOwogICAgIF9fIGJyKEFzc2VtYmxlcjo6ZXF1YWwsIGZhbHNlLCBBc3NlbWJsZXI6OnB0LCBub19ibG9jayk7CiAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKQEAgLTIzNzIsMTEgKzIzNjksMTEgQEAKIAogCiAgIF9fIHNldChfdGhyZWFkX2luX0phdmEsIEczX3NjcmF0Y2gpOwotICBfXyBzdChHM19zY3JhdGNoLCBHMl90aHJlYWQsIGluX2J5dGVzKEphdmFUaHJlYWQ6OnRocmVhZF9zdGF0ZV9vZmZzZXQoKSkpOworICBfXyBzdChHM19zY3JhdGNoLCBHMl90aHJlYWQsIEphdmFUaHJlYWQ6OnRocmVhZF9zdGF0ZV9vZmZzZXQoKSk7CiAKIAogICBMYWJlbCBub19yZWd1YXJkOwotICBfXyBsZChHMl90aHJlYWQsIGluX2J5dGVzKEphdmFUaHJlYWQ6OnN0YWNrX2d1YXJkX3N0YXRlX29mZnNldCgpKSwgRzNfc2NyYXRjaCk7CisgIF9fIGxkKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6c3RhY2tfZ3VhcmRfc3RhdGVfb2Zmc2V0KCksIEczX3NjcmF0Y2gpOwogICBfXyBjbXAoRzNfc2NyYXRjaCwgSmF2YVRocmVhZDo6c3RhY2tfZ3VhcmRfeWVsbG93X2Rpc2FibGVkKTsKICAgX18gYnIoQXNzZW1ibGVyOjpub3RFcXVhbCwgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIG5vX3JlZ3VhcmQpOwogICBfXyBkZWxheWVkKCktPm5vcCgpOwpAQCAtMjY4NCwxNCArMjY4MSwxNCBAQAogICB7CiAgICAgTGFiZWwgTDsKICAgICBjb25zdCBSZWdpc3RlciB0ZW1wX3JlZyA9IEczX3NjcmF0Y2g7Ci0gICAgQWRkcmVzcyBpY19taXNzKHRlbXBfcmVnLCBTaGFyZWRSdW50aW1lOjpnZXRfaWNfbWlzc19zdHViKCkpOworICAgIEFkZHJlc3NMaXRlcmFsIGljX21pc3MoU2hhcmVkUnVudGltZTo6Z2V0X2ljX21pc3Nfc3R1YigpKTsKICAgICBfXyB2ZXJpZnlfb29wKE8wKTsKICAgICBfXyBsZF9wdHIoTzAsIG9vcERlc2M6OmtsYXNzX29mZnNldF9pbl9ieXRlcygpLCB0ZW1wX3JlZyk7CiAgICAgX18gY21wKHRlbXBfcmVnLCBHNV9pbmxpbmVfY2FjaGVfcmVnKTsKICAgICBfXyBicngoQXNzZW1ibGVyOjplcXVhbCwgdHJ1ZSwgQXNzZW1ibGVyOjpwdCwgTCk7CiAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKIAotICAgIF9fIGp1bXBfdG8oaWNfbWlzcywgMCk7CisgICAgX18ganVtcF90byhpY19taXNzLCB0ZW1wX3JlZyk7CiAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKICAgICBfXyBhbGlnbihDb2RlRW50cnlBbGlnbm1lbnQpOwogICAgIF9fIGJpbmQoTCk7CkBAIC0zMTU1LDE1ICszMTUyLDEzIEBACiAgIC8vIERvIHRoaXMgYWZ0ZXIgdGhlIGNhbGxlcidzIHJldHVybiBhZGRyZXNzIGlzIG9uIHRvcCBvZiBzdGFjawogICBpZiAoVXNlU3RhY2tCYW5naW5nKSB7CiAgICAgLy8gR2V0IHRvdGFsIGZyYW1lIHNpemUgZm9yIGludGVycHJldGVkIGZyYW1lcwotICAgIF9fIGxkKEFkZHJlc3MoTzJVbnJvbGxCbG9jaywgMCwKLSAgICAgICAgIERlb3B0aW1pemF0aW9uOjpVbnJvbGxCbG9jazo6dG90YWxfZnJhbWVfc2l6ZXNfb2Zmc2V0X2luX2J5dGVzKCkpLCBPNCk7CisgICAgX18gbGQoTzJVbnJvbGxCbG9jaywgRGVvcHRpbWl6YXRpb246OlVucm9sbEJsb2NrOjp0b3RhbF9mcmFtZV9zaXplc19vZmZzZXRfaW5fYnl0ZXMoKSwgTzQpOwogICAgIF9fIGJhbmdfc3RhY2tfc2l6ZShPNCwgTzMsIEczX3NjcmF0Y2gpOwogICB9CiAKLSAgX18gbGQoQWRkcmVzcyhPMlVucm9sbEJsb2NrLCAwLCBEZW9wdGltaXphdGlvbjo6VW5yb2xsQmxvY2s6Om51bWJlcl9vZl9mcmFtZXNfb2Zmc2V0X2luX2J5dGVzKCkpLCBPNGFycmF5X3NpemUpOwotICBfXyBsZF9wdHIoQWRkcmVzcyhPMlVucm9sbEJsb2NrLCAwLCBEZW9wdGltaXphdGlvbjo6VW5yb2xsQmxvY2s6OmZyYW1lX3Bjc19vZmZzZXRfaW5fYnl0ZXMoKSksIEczcGNzKTsKLQotICBfXyBsZF9wdHIoQWRkcmVzcyhPMlVucm9sbEJsb2NrLCAwLCBEZW9wdGltaXphdGlvbjo6VW5yb2xsQmxvY2s6OmZyYW1lX3NpemVzX29mZnNldF9pbl9ieXRlcygpKSwgTzNhcnJheSk7CisgIF9fIGxkKE8yVW5yb2xsQmxvY2ssIERlb3B0aW1pemF0aW9uOjpVbnJvbGxCbG9jazo6bnVtYmVyX29mX2ZyYW1lc19vZmZzZXRfaW5fYnl0ZXMoKSwgTzRhcnJheV9zaXplKTsKKyAgX18gbGRfcHRyKE8yVW5yb2xsQmxvY2ssIERlb3B0aW1pemF0aW9uOjpVbnJvbGxCbG9jazo6ZnJhbWVfcGNzX29mZnNldF9pbl9ieXRlcygpLCBHM3Bjcyk7CisgIF9fIGxkX3B0cihPMlVucm9sbEJsb2NrLCBEZW9wdGltaXphdGlvbjo6VW5yb2xsQmxvY2s6OmZyYW1lX3NpemVzX29mZnNldF9pbl9ieXRlcygpLCBPM2FycmF5KTsKIAogICAvLyBBZGp1c3Qgb2xkIGludGVycHJldGVyIGZyYW1lIHRvIG1ha2Ugc3BhY2UgZm9yIG5ldyBmcmFtZSdzIGV4dHJhIGphdmEgbG9jYWxzCiAgIC8vCkBAIC0zMTc2LDcgKzMxNzEsNyBAQAogICAvLyBmb3IgZWFjaCBmcmFtZSB3ZSBjcmVhdGUgYW5kIGtlZXAgdXAgdGhlIGlsbHVzaW9uIGV2ZXJ5IHdoZXJlLgogICAvLwogCi0gIF9fIGxkKEFkZHJlc3MoTzJVbnJvbGxCbG9jaywgMCwgRGVvcHRpbWl6YXRpb246OlVucm9sbEJsb2NrOjpjYWxsZXJfYWRqdXN0bWVudF9vZmZzZXRfaW5fYnl0ZXMoKSksIE83KTsKKyAgX18gbGQoTzJVbnJvbGxCbG9jaywgRGVvcHRpbWl6YXRpb246OlVucm9sbEJsb2NrOjpjYWxsZXJfYWRqdXN0bWVudF9vZmZzZXRfaW5fYnl0ZXMoKSwgTzcpOwogICBfXyBtb3YoU1AsIE81X3NhdmVkU1ApOyAgICAgICAvLyByZW1lbWJlciBpbml0aWFsIHNlbmRlcidzIG9yaWdpbmFsIHNwIGJlZm9yZSBhZGp1c3RtZW50CiAgIF9fIHN1YihTUCwgTzcsIFNQKTsKIApAQCAtMzIyNSw5ICszMjIwLDkgQEAKICAgUmVnaXN0ZXIgICAgICAgIEk1ZXhjZXB0aW9uX3RtcCAgICA9IEk1OwogICBSZWdpc3RlciAgICAgICAgRzRleGNlcHRpb25fdG1wICAgID0gRzRfc2NyYXRjaDsKICAgaW50ICAgICAgICAgICAgIGZyYW1lX3NpemVfd29yZHM7Ci0gIEFkZHJlc3MgICAgICAgICBzYXZlZF9GcmV0dXJuMF9hZGRyKEZQLCAwLCAtc2l6ZW9mKGRvdWJsZSkgKyBTVEFDS19CSUFTKTsKKyAgQWRkcmVzcyAgICAgICAgIHNhdmVkX0ZyZXR1cm4wX2FkZHIoRlAsIC1zaXplb2YoZG91YmxlKSArIFNUQUNLX0JJQVMpOwogI2lmICFkZWZpbmVkKF9MUDY0KSAmJiBkZWZpbmVkKENPTVBJTEVSMikKLSAgQWRkcmVzcyAgICAgICAgIHNhdmVkX0dyZXR1cm4xX2FkZHIoRlAsIDAsIC1zaXplb2YoZG91YmxlKSAtc2l6ZW9mKGpsb25nKSArIFNUQUNLX0JJQVMpOworICBBZGRyZXNzICAgICAgICAgc2F2ZWRfR3JldHVybjFfYWRkcihGUCwgLXNpemVvZihkb3VibGUpIC1zaXplb2YoamxvbmcpICsgU1RBQ0tfQklBUyk7CiAjZW5kaWYKICAgTGFiZWwgICAgICAgICAgIGNvbnQ7CiAKQEAgLTMyODksNyArMzI4NCw3IEBACiAgIC8vIHNhdmUgZXhjZXB0aW9uIG9vcCBpbiBKYXZhVGhyZWFkIGFuZCBmYWxsIHRocm91Z2ggaW50byB0aGUKICAgLy8gZXhjZXB0aW9uX2luX3RscyBjYXNlIHNpbmNlIHRoZXkgYXJlIGhhbmRsZWQgaW4gc2FtZSB3YXkgZXhjZXB0CiAgIC8vIGZvciB3aGVyZSB0aGUgcGVuZGluZyBleGNlcHRpb24gaXMga2VwdC4KLSAgX18gc3RfcHRyKE9leGNlcHRpb24sIEcyX3RocmVhZCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6ZXhjZXB0aW9uX29vcF9vZmZzZXQoKSkpOworICBfXyBzdF9wdHIoT2V4Y2VwdGlvbiwgRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpleGNlcHRpb25fb29wX29mZnNldCgpKTsKIAogICAvLwogICAvLyBWYW5pbGxhIGRlb3B0aW1pemF0aW9uIHdpdGggYW4gZXhjZXB0aW9uIHBlbmRpbmcgaW4gZXhjZXB0aW9uX29vcApAQCAtMzMwNiw3ICszMzAxLDcgQEAKICAgewogICAgIC8vIHZlcmlmeSB0aGF0IHRoZXJlIGlzIHJlYWxseSBhbiBleGNlcHRpb24gb29wIGluIGV4Y2VwdGlvbl9vb3AKICAgICBMYWJlbCBoYXNfZXhjZXB0aW9uOwotICAgIF9fIGxkX3B0cihHMl90aHJlYWQsIGluX2J5dGVzKEphdmFUaHJlYWQ6OmV4Y2VwdGlvbl9vb3Bfb2Zmc2V0KCkpLCBPZXhjZXB0aW9uKTsKKyAgICBfXyBsZF9wdHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpleGNlcHRpb25fb29wX29mZnNldCgpLCBPZXhjZXB0aW9uKTsKICAgICBfXyBicl9ub3RudWxsKE9leGNlcHRpb24sIGZhbHNlLCBBc3NlbWJsZXI6OnB0LCBoYXNfZXhjZXB0aW9uKTsKICAgICBfXyBkZWxheWVkKCktPiBub3AoKTsKICAgICBfXyBzdG9wKCJubyBleGNlcHRpb24gaW4gdGhyZWFkIik7CkBAIC0zMzE0LDcgKzMzMDksNyBAQAogCiAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlcmUgaXMgbm8gcGVuZGluZyBleGNlcHRpb24KICAgICBMYWJlbCBub19wZW5kaW5nX2V4Y2VwdGlvbjsKLSAgICBBZGRyZXNzIGV4Y2VwdGlvbl9hZGRyKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoVGhyZWFkOjpwZW5kaW5nX2V4Y2VwdGlvbl9vZmZzZXQoKSkpOworICAgIEFkZHJlc3MgZXhjZXB0aW9uX2FkZHIoRzJfdGhyZWFkLCBUaHJlYWQ6OnBlbmRpbmdfZXhjZXB0aW9uX29mZnNldCgpKTsKICAgICBfXyBsZF9wdHIoZXhjZXB0aW9uX2FkZHIsIE9leGNlcHRpb24pOwogICAgIF9fIGJyX251bGwoT2V4Y2VwdGlvbiwgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIG5vX3BlbmRpbmdfZXhjZXB0aW9uKTsKICAgICBfXyBkZWxheWVkKCktPm5vcCgpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3NwYXJjLmFkIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3NwYXJjLmFkCmluZGV4IGM2NWNjNTQuLmI2ZDNhNzIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9zcGFyYy5hZAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vc3BhcmMuYWQKQEAgLTk4MCw4ICs5ODAsOCBAQAogICAvLyBUaGlzIGNvZGUgc2VxdWVuY2UgaXMgcmVsb2NhdGFibGUgdG8gYW55IGFkZHJlc3MsIGV2ZW4gb24gTFA2NC4KICAgaWYgKCBmb3JjZV9mYXJfY2FsbCApIHsKICAgICBfXyByZWxvY2F0ZShydHlwZSk7Ci0gICAgQWRkcmVzcyBkZXN0KE83LCAoYWRkcmVzcyllbnRyeV9wb2ludCk7Ci0gICAgX18ganVtcGxfdG8oZGVzdCwgTzcpOworICAgIEFkZHJlc3NMaXRlcmFsIGRlc3QoZW50cnlfcG9pbnQpOworICAgIF9fIGp1bXBsX3RvKGRlc3QsIE83LCBPNyk7CiAgIH0KICAgZWxzZQogI2VuZGlmCkBAIC0xMDMxLDE3ICsxMDMxLDYgQEAKIHZvaWQgZW1pdF9sbyhDb2RlQnVmZmVyICZjYnVmLCBpbnQgdmFsKSB7ICB9CiB2b2lkIGVtaXRfaGkoQ29kZUJ1ZmZlciAmY2J1ZiwgaW50IHZhbCkgeyAgfQogCi12b2lkIGVtaXRfcHRyKENvZGVCdWZmZXIgJmNidWYsIGludHB0cl90IHZhbCwgUmVnaXN0ZXIgcmVnLCBib29sIEZvcmNlUmVsb2NhdGFibGUpIHsKLSAgTWFjcm9Bc3NlbWJsZXIgX21hc20oJmNidWYpOwotICBpZiAoRm9yY2VSZWxvY2F0YWJsZSkgewotICAgIEFkZHJlc3MgYWRkcihyZWcsIChhZGRyZXNzKXZhbCk7Ci0gICAgX18gc2V0aGkoYWRkciwgRm9yY2VSZWxvY2F0YWJsZSk7Ci0gICAgX18gYWRkKGFkZHIsIHJlZyk7Ci0gIH0gZWxzZSB7Ci0gICAgX18gc2V0KHZhbCwgcmVnKTsKLSAgfQotfQotCiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTE0OSw4ICsxMTM4LDggQEAKIAogICAvLyBJZiB0aGlzIGRvZXMgc2FmZXBvaW50IHBvbGxpbmcsIHRoZW4gZG8gaXQgaGVyZQogICBpZiggZG9fcG9sbGluZygpICYmIHJhXy0+Qy0+aXNfbWV0aG9kX2NvbXBpbGF0aW9uKCkgKSB7Ci0gICAgQWRkcmVzcyBwb2xsaW5nX3BhZ2UoTDAsIChhZGRyZXNzKW9zOjpnZXRfcG9sbGluZ19wYWdlKCkpOwotICAgIF9fIHNldGhpKHBvbGxpbmdfcGFnZSwgZmFsc2UpOworICAgIEFkZHJlc3NMaXRlcmFsIHBvbGxpbmdfcGFnZShvczo6Z2V0X3BvbGxpbmdfcGFnZSgpKTsKKyAgICBfXyBzZXRoaShwb2xsaW5nX3BhZ2UsIEwwKTsKICAgICBfXyByZWxvY2F0ZShyZWxvY0luZm86OnBvbGxfcmV0dXJuX3R5cGUpOwogICAgIF9fIGxkX3B0ciggTDAsIDAsIEcwICk7CiAgIH0KQEAgLTE1NzYsOCArMTU2NSw4IEBACiAgIF9fIHNldF9vb3AoTlVMTCwgcmVnX3RvX3JlZ2lzdGVyX29iamVjdChNYXRjaGVyOjppbmxpbmVfY2FjaGVfcmVnX2VuY29kZSgpKSk7CiAKICAgX18gc2V0X2luc3RfbWFyaygpOwotICBBZGRyZXNzIGEoRzMsIChhZGRyZXNzKS0xKTsKLSAgX18gSlVNUChhLCAwKTsKKyAgQWRkcmVzc0xpdGVyYWwgYWRkcmxpdCgtMSk7CisgIF9fIEpVTVAoYWRkcmxpdCwgRzMsIDApOwogCiAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CiAKQEAgLTE2NjIsNyArMTY1MSw3IEBACiAvLyBFbWl0IGV4Y2VwdGlvbiBoYW5kbGVyIGNvZGUuCiBpbnQgZW1pdF9leGNlcHRpb25faGFuZGxlcihDb2RlQnVmZmVyJiBjYnVmKSB7CiAgIFJlZ2lzdGVyIHRlbXBfcmVnID0gRzM7Ci0gIEFkZHJlc3MgZXhjZXB0aW9uX2Jsb2IodGVtcF9yZWcsIE9wdG9SdW50aW1lOjpleGNlcHRpb25fYmxvYigpLT5pbnN0cnVjdGlvbnNfYmVnaW4oKSk7CisgIEFkZHJlc3NMaXRlcmFsIGV4Y2VwdGlvbl9ibG9iKE9wdG9SdW50aW1lOjpleGNlcHRpb25fYmxvYigpLT5pbnN0cnVjdGlvbnNfYmVnaW4oKSk7CiAgIE1hY3JvQXNzZW1ibGVyIF9tYXNtKCZjYnVmKTsKIAogICBhZGRyZXNzIGJhc2UgPQpAQCAtMTY3MSw3ICsxNjYwLDcgQEAKIAogICBpbnQgb2Zmc2V0ID0gX18gb2Zmc2V0KCk7CiAKLSAgX18gSlVNUChleGNlcHRpb25fYmxvYiwgMCk7IC8vIHNldGhpO2ptcAorICBfXyBKVU1QKGV4Y2VwdGlvbl9ibG9iLCB0ZW1wX3JlZywgMCk7IC8vIHNldGhpO2ptcAogICBfXyBkZWxheWVkKCktPm5vcCgpOwogCiAgIGFzc2VydChfXyBvZmZzZXQoKSAtIG9mZnNldCA8PSAoaW50KSBzaXplX2V4Y2VwdGlvbl9oYW5kbGVyKCksICJvdmVyZmxvdyIpOwpAQCAtMTY4NSw3ICsxNjc0LDcgQEAKICAgLy8gQ2FuJ3QgdXNlIGFueSBvZiB0aGUgY3VycmVudCBmcmFtZSdzIHJlZ2lzdGVycyBhcyB3ZSBtYXkgaGF2ZSBkZW9wdGVkCiAgIC8vIGF0IGEgcG9sbCBhbmQgZXZlcnl0aGluZyAoaW5jbHVkaW5nIEczKSBjYW4gYmUgbGl2ZS4KICAgUmVnaXN0ZXIgdGVtcF9yZWcgPSBMMDsKLSAgQWRkcmVzcyBkZW9wdF9ibG9iKHRlbXBfcmVnLCBTaGFyZWRSdW50aW1lOjpkZW9wdF9ibG9iKCktPnVucGFjaygpKTsKKyAgQWRkcmVzc0xpdGVyYWwgZGVvcHRfYmxvYihTaGFyZWRSdW50aW1lOjpkZW9wdF9ibG9iKCktPnVucGFjaygpKTsKICAgTWFjcm9Bc3NlbWJsZXIgX21hc20oJmNidWYpOwogCiAgIGFkZHJlc3MgYmFzZSA9CkBAIC0xNjk0LDcgKzE2ODMsNyBAQAogCiAgIGludCBvZmZzZXQgPSBfXyBvZmZzZXQoKTsKICAgX18gc2F2ZV9mcmFtZSgwKTsKLSAgX18gSlVNUChkZW9wdF9ibG9iLCAwKTsgLy8gc2V0aGk7am1wCisgIF9fIEpVTVAoZGVvcHRfYmxvYiwgdGVtcF9yZWcsIDApOyAvLyBzZXRoaTtqbXAKICAgX18gZGVsYXllZCgpLT5yZXN0b3JlKCk7CiAKICAgYXNzZXJ0KF9fIG9mZnNldCgpIC0gb2Zmc2V0IDw9IChpbnQpIHNpemVfZGVvcHRfaGFuZGxlcigpLCAib3ZlcmZsb3ciKTsKQEAgLTIyNjEsOSArMjI1MCw4IEBACiAgICAgYWRkcmVzcyB0YWJsZV9iYXNlID0gX18gYWRkcmVzc190YWJsZV9jb25zdGFudChfaW5kZXgybGFiZWwpOwogICAgIFJlbG9jYXRpb25Ib2xkZXIgcnNwZWMgPSBpbnRlcm5hbF93b3JkX1JlbG9jYXRpb246OnNwZWModGFibGVfYmFzZSk7CiAKLSAgICAvLyBMb2FkIHRhYmxlIGFkZHJlc3MKLSAgICBBZGRyZXNzIHRoZV9wYyh0YWJsZV9yZWcsIHRhYmxlX2Jhc2UsIHJzcGVjKTsKLSAgICBfXyBsb2FkX2FkZHJlc3ModGhlX3BjKTsKKyAgICAvLyBNb3ZlIHRhYmxlIGFkZHJlc3MgaW50byBhIHJlZ2lzdGVyLgorICAgIF9fIHNldCh0YWJsZV9iYXNlLCB0YWJsZV9yZWcsIHJzcGVjKTsKIAogICAgIC8vIEp1bXAgdG8gYmFzZSBhZGRyZXNzICsgc3dpdGNoIHZhbHVlCiAgICAgX18gbGRfcHRyKHRhYmxlX3JlZywgc3dpdGNoX3JlZywgdGFibGVfcmVnKTsKQEAgLTI0MDIsMTMgKzIzOTAsMTMgQEAKICAgLy8gVGhlIDY0IGJpdCBwb2ludGVyIGlzIHN0b3JlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgc3RyZWFtCiAgIGVuY19jbGFzcyBTZXRQdHIoIGltbVAgc3JjLCBpUmVnUCByZCApICV7CiAgICAgUmVnaXN0ZXIgZGVzdCA9IHJlZ190b19yZWdpc3Rlcl9vYmplY3QoJHJkJCRyZWcpOworICAgIE1hY3JvQXNzZW1ibGVyIF9tYXNtKCZjYnVmKTsKICAgICAvLyBbUkdWXSBUaGlzIG5leHQgbGluZSBzaG91bGQgYmUgZ2VuZXJhdGVkIGZyb20gQURMQwogICAgIGlmICggX29wbmRzWzFdLT5jb25zdGFudF9pc19vb3AoKSApIHsKICAgICAgIGludHB0cl90IHZhbCA9ICRzcmMkJGNvbnN0YW50OwotICAgICAgTWFjcm9Bc3NlbWJsZXIgX21hc20oJmNidWYpOwogICAgICAgX18gc2V0X29vcF9jb25zdGFudCgoam9iamVjdCl2YWwsIGRlc3QpOwogICAgIH0gZWxzZSB7ICAgICAgICAgIC8vIG5vbi1vb3AgcG9pbnRlcnMsIGUuZy4gY2FyZCBtYXJrIGJhc2UsIGhlYXAgdG9wCi0gICAgICBlbWl0X3B0cihjYnVmLCAkc3JjJCRjb25zdGFudCwgZGVzdCwgLypGb3JjZVJlbG9jYXRhYmxlPSovIGZhbHNlKTsKKyAgICAgIF9fIHNldCgkc3JjJCRjb25zdGFudCwgZGVzdCk7CiAgICAgfQogICAlfQogCkBAIC0yNzg5LDQ2ICsyNzc3LDYgQEAKICAgICBfXyBzZXQ2NCggJHNyYyQkY29uc3RhbnQsIGRlc3QsIHRlbXAgKTsKICAgJX0KIAotICBlbmNfY2xhc3MgTGRJbW1GKGltbUYgc3JjLCByZWdGIGRzdCwgbzdSZWdQIHRtcCkgJXsgICAgLy8gTG9hZCBJbW1lZGlhdGUKLSAgICBhZGRyZXNzIGZsb2F0X2FkZHJlc3MgPSBNYWNyb0Fzc2VtYmxlcigmY2J1ZikuZmxvYXRfY29uc3RhbnQoJHNyYyQkY29uc3RhbnQpOwotICAgIFJlbG9jYXRpb25Ib2xkZXIgcnNwZWMgPSBpbnRlcm5hbF93b3JkX1JlbG9jYXRpb246OnNwZWMoZmxvYXRfYWRkcmVzcyk7Ci0jaWZkZWYgX0xQNjQKLSAgICBSZWdpc3RlciAgIHRtcF9yZWcgPSByZWdfdG9fcmVnaXN0ZXJfb2JqZWN0KCR0bXAkJHJlZyk7Ci0gICAgY2J1Zi5yZWxvY2F0ZShjYnVmLmNvZGVfZW5kKCksIHJzcGVjLCAwKTsKLSAgICBlbWl0X3B0cihjYnVmLCAoaW50cHRyX3QpZmxvYXRfYWRkcmVzcywgdG1wX3JlZywgLypGb3JjZVJlbG9jYXRhYmxlPSovIHRydWUpOwotICAgIGVtaXQzX3NpbW0xMCggY2J1ZiwgQXNzZW1ibGVyOjpsZHN0X29wLCAkZHN0JCRyZWcsIEFzc2VtYmxlcjo6bGRmX29wMywgJHRtcCQkcmVnLCAwICk7Ci0jZWxzZSAgLy8gX0xQNjQKLSAgICB1aW50ICpjb2RlOwotICAgIGludCB0bXBfcmVnID0gJHRtcCQkcmVnOwotCi0gICAgY2J1Zi5yZWxvY2F0ZShjYnVmLmNvZGVfZW5kKCksIHJzcGVjLCAwKTsKLSAgICBlbWl0Ml8yMiggY2J1ZiwgQXNzZW1ibGVyOjpicmFuY2hfb3AsIHRtcF9yZWcsIEFzc2VtYmxlcjo6c2V0aGlfb3AyLCAoaW50cHRyX3QpIGZsb2F0X2FkZHJlc3MgKTsKLQotICAgIGNidWYucmVsb2NhdGUoY2J1Zi5jb2RlX2VuZCgpLCByc3BlYywgMCk7Ci0gICAgZW1pdDNfc2ltbTEwKCBjYnVmLCBBc3NlbWJsZXI6Omxkc3Rfb3AsICRkc3QkJHJlZywgQXNzZW1ibGVyOjpsZGZfb3AzLCB0bXBfcmVnLCAoaW50cHRyX3QpIGZsb2F0X2FkZHJlc3MgKTsKLSNlbmRpZiAvLyBfTFA2NAotICAlfQotCi0gIGVuY19jbGFzcyBMZEltbUQoaW1tRCBzcmMsIHJlZ0QgZHN0LCBvN1JlZ1AgdG1wKSAleyAgICAvLyBMb2FkIEltbWVkaWF0ZQotICAgIGFkZHJlc3MgZG91YmxlX2FkZHJlc3MgPSBNYWNyb0Fzc2VtYmxlcigmY2J1ZikuZG91YmxlX2NvbnN0YW50KCRzcmMkJGNvbnN0YW50KTsKLSAgICBSZWxvY2F0aW9uSG9sZGVyIHJzcGVjID0gaW50ZXJuYWxfd29yZF9SZWxvY2F0aW9uOjpzcGVjKGRvdWJsZV9hZGRyZXNzKTsKLSNpZmRlZiBfTFA2NAotICAgIFJlZ2lzdGVyICAgdG1wX3JlZyA9IHJlZ190b19yZWdpc3Rlcl9vYmplY3QoJHRtcCQkcmVnKTsKLSAgICBjYnVmLnJlbG9jYXRlKGNidWYuY29kZV9lbmQoKSwgcnNwZWMsIDApOwotICAgIGVtaXRfcHRyKGNidWYsIChpbnRwdHJfdClkb3VibGVfYWRkcmVzcywgdG1wX3JlZywgLypGb3JjZVJlbG9jYXRhYmxlPSovIHRydWUpOwotICAgIGVtaXQzX3NpbW0xMCggY2J1ZiwgQXNzZW1ibGVyOjpsZHN0X29wLCAkZHN0JCRyZWcsIEFzc2VtYmxlcjo6bGRkZl9vcDMsICR0bXAkJHJlZywgMCApOwotI2Vsc2UgLy8gX0xQNjQKLSAgICB1aW50ICpjb2RlOwotICAgIGludCB0bXBfcmVnID0gJHRtcCQkcmVnOwotCi0gICAgY2J1Zi5yZWxvY2F0ZShjYnVmLmNvZGVfZW5kKCksIHJzcGVjLCAwKTsKLSAgICBlbWl0Ml8yMiggY2J1ZiwgQXNzZW1ibGVyOjpicmFuY2hfb3AsIHRtcF9yZWcsIEFzc2VtYmxlcjo6c2V0aGlfb3AyLCAoaW50cHRyX3QpIGRvdWJsZV9hZGRyZXNzICk7Ci0KLSAgICBjYnVmLnJlbG9jYXRlKGNidWYuY29kZV9lbmQoKSwgcnNwZWMsIDApOwotICAgIGVtaXQzX3NpbW0xMCggY2J1ZiwgQXNzZW1ibGVyOjpsZHN0X29wLCAkZHN0JCRyZWcsIEFzc2VtYmxlcjo6bGRkZl9vcDMsIHRtcF9yZWcsIChpbnRwdHJfdCkgZG91YmxlX2FkZHJlc3MgKTsKLSNlbmRpZiAvLyBfTFA2NAotICAlfQotCiAgIGVuY19jbGFzcyBMZFJlcGxJbW1JKGltbUkgc3JjLCByZWdEIGRzdCwgbzdSZWdQIHRtcCwgaW50IGNvdW50LCBpbnQgd2lkdGgpICV7CiAgICAgLy8gTG9hZCBhIGNvbnN0YW50IHJlcGxpY2F0ZWQgImNvdW50IiB0aW1lcyB3aXRoIHdpZHRoICJ3aWR0aCIKICAgICBpbnQgYml0X3dpZHRoID0gJHdpZHRoJCRjb25zdGFudCAqIDg7CkBAIC0yODQwLDI4ICsyNzg4LDE1IEBACiAgICAgICAgIHZhbCB8PSBlbHRfdmFsOwogICAgIH0KICAgICBqZG91YmxlIGR2YWwgPSAqKGpkb3VibGUqKSZ2YWw7IC8vIGNvZXJjZSB0byBkb3VibGUgdHlwZQotICAgIGFkZHJlc3MgZG91YmxlX2FkZHJlc3MgPSBNYWNyb0Fzc2VtYmxlcigmY2J1ZikuZG91YmxlX2NvbnN0YW50KGR2YWwpOworICAgIE1hY3JvQXNzZW1ibGVyIF9tYXNtKCZjYnVmKTsKKyAgICBhZGRyZXNzIGRvdWJsZV9hZGRyZXNzID0gX18gZG91YmxlX2NvbnN0YW50KGR2YWwpOwogICAgIFJlbG9jYXRpb25Ib2xkZXIgcnNwZWMgPSBpbnRlcm5hbF93b3JkX1JlbG9jYXRpb246OnNwZWMoZG91YmxlX2FkZHJlc3MpOwotI2lmZGVmIF9MUDY0Ci0gICAgUmVnaXN0ZXIgICB0bXBfcmVnID0gcmVnX3RvX3JlZ2lzdGVyX29iamVjdCgkdG1wJCRyZWcpOwotICAgIGNidWYucmVsb2NhdGUoY2J1Zi5jb2RlX2VuZCgpLCByc3BlYywgMCk7Ci0gICAgZW1pdF9wdHIoY2J1ZiwgKGludHB0cl90KWRvdWJsZV9hZGRyZXNzLCB0bXBfcmVnLCAvKkZvcmNlUmVsb2NhdGFibGU9Ki8gdHJ1ZSk7Ci0gICAgZW1pdDNfc2ltbTEwKCBjYnVmLCBBc3NlbWJsZXI6Omxkc3Rfb3AsICRkc3QkJHJlZywgQXNzZW1ibGVyOjpsZGRmX29wMywgJHRtcCQkcmVnLCAwICk7Ci0jZWxzZSAvLyBfTFA2NAotICAgIHVpbnQgKmNvZGU7Ci0gICAgaW50IHRtcF9yZWcgPSAkdG1wJCRyZWc7CisgICAgQWRkcmVzc0xpdGVyYWwgYWRkcmxpdChkb3VibGVfYWRkcmVzcywgcnNwZWMpOwogCi0gICAgY2J1Zi5yZWxvY2F0ZShjYnVmLmNvZGVfZW5kKCksIHJzcGVjLCAwKTsKLSAgICBlbWl0Ml8yMiggY2J1ZiwgQXNzZW1ibGVyOjpicmFuY2hfb3AsIHRtcF9yZWcsIEFzc2VtYmxlcjo6c2V0aGlfb3AyLCAoaW50cHRyX3QpIGRvdWJsZV9hZGRyZXNzICk7Ci0KLSAgICBjYnVmLnJlbG9jYXRlKGNidWYuY29kZV9lbmQoKSwgcnNwZWMsIDApOwotICAgIGVtaXQzX3NpbW0xMCggY2J1ZiwgQXNzZW1ibGVyOjpsZHN0X29wLCAkZHN0JCRyZWcsIEFzc2VtYmxlcjo6bGRkZl9vcDMsIHRtcF9yZWcsIChpbnRwdHJfdCkgZG91YmxlX2FkZHJlc3MgKTsKLSNlbmRpZiAvLyBfTFA2NAotICAlfQotCi0KLSAgZW5jX2NsYXNzIFNob3VsZE5vdEVuY29kZVRoaXMgKCApICV7Ci0gICAgU2hvdWxkTm90Q2FsbFRoaXMoKTsKKyAgICBfXyBzZXRoaShhZGRybGl0LCAkdG1wJCRSZWdpc3Rlcik7CisgICAgLy8gWFhYIFRoaXMgaXMgYSBxdWljayBmaXggZm9yIDY4MzM1NzMuCisgICAgLy9fXyBsZGYoRmxvYXRSZWdpc3RlckltcGw6OkQsICR0bXAkJFJlZ2lzdGVyLCBhZGRybGl0LmxvdzEwKCksICRkc3QkJEZsb2F0UmVnaXN0ZXIsIHJzcGVjKTsKKyAgICBfXyBsZGYoRmxvYXRSZWdpc3RlckltcGw6OkQsICR0bXAkJFJlZ2lzdGVyLCBhZGRybGl0LmxvdzEwKCksIGFzX0RvdWJsZUZsb2F0UmVnaXN0ZXIoJGRzdCQkcmVnKSwgcnNwZWMpOwogICAlfQogCiAgIC8vIENvbXBpbGVyIGVuc3VyZXMgYmFzZSBpcyBkb3VibGV3b3JkIGFsaWduZWQgYW5kIGNudCBpcyBjb3VudCBvZiBkb3VibGV3b3JkcwpAQCAtMjkwMSwxOSArMjgzNiwxOSBAQAogICAgIGludCAgY291bnRfb2Zmc2V0ID0gamF2YV9sYW5nX1N0cmluZzo6IGNvdW50X29mZnNldF9pbl9ieXRlcygpOwogCiAgICAgLy8gbG9hZCBzdHIxIChqY2hhciopIGJhc2UgYWRkcmVzcyBpbnRvIHRtcDFfcmVnCi0gICAgX18gbG9hZF9oZWFwX29vcChBZGRyZXNzKHN0cjFfcmVnLCAwLCAgdmFsdWVfb2Zmc2V0KSwgdG1wMV9yZWcpOwotICAgIF9fIGxkKEFkZHJlc3Moc3RyMV9yZWcsIDAsIG9mZnNldF9vZmZzZXQpLCByZXN1bHRfcmVnKTsKKyAgICBfXyBsb2FkX2hlYXBfb29wKHN0cjFfcmVnLCB2YWx1ZV9vZmZzZXQsIHRtcDFfcmVnKTsKKyAgICBfXyBsZChzdHIxX3JlZywgb2Zmc2V0X29mZnNldCwgcmVzdWx0X3JlZyk7CiAgICAgX18gYWRkKHRtcDFfcmVnLCBhcnJheU9vcERlc2M6OmJhc2Vfb2Zmc2V0X2luX2J5dGVzKFRfQ0hBUiksIHRtcDFfcmVnKTsKLSAgICBfXyAgICBsZChBZGRyZXNzKHN0cjFfcmVnLCAwLCBjb3VudF9vZmZzZXQpLCBzdHIxX3JlZyk7IC8vIGhvaXN0ZWQKKyAgICBfXyAgIGxkKHN0cjFfcmVnLCBjb3VudF9vZmZzZXQsIHN0cjFfcmVnKTsgLy8gaG9pc3RlZAogICAgIF9fIHNsbChyZXN1bHRfcmVnLCBleGFjdF9sb2cyKHNpemVvZihqY2hhcikpLCByZXN1bHRfcmVnKTsKLSAgICBfXyAgICBsb2FkX2hlYXBfb29wKEFkZHJlc3Moc3RyMl9yZWcsIDAsICB2YWx1ZV9vZmZzZXQpLCB0bXAyX3JlZyk7IC8vIGhvaXN0ZWQKKyAgICBfXyAgIGxvYWRfaGVhcF9vb3Aoc3RyMl9yZWcsIHZhbHVlX29mZnNldCwgdG1wMl9yZWcpOyAvLyBob2lzdGVkCiAgICAgX18gYWRkKHJlc3VsdF9yZWcsIHRtcDFfcmVnLCB0bXAxX3JlZyk7CiAKICAgICAvLyBsb2FkIHN0cjIgKGpjaGFyKikgYmFzZSBhZGRyZXNzIGludG8gdG1wMl9yZWcKLSAgICAvLyBfXyBsZF9wdHIoQWRkcmVzcyhzdHIyX3JlZywgMCwgIHZhbHVlX29mZnNldCksIHRtcDJfcmVnKTsgLy8gaG9pc3RlZAotICAgIF9fIGxkKEFkZHJlc3Moc3RyMl9yZWcsIDAsIG9mZnNldF9vZmZzZXQpLCByZXN1bHRfcmVnKTsKKyAgICAvLyBfXyBsZF9wdHIoc3RyMl9yZWcsIHZhbHVlX29mZnNldCwgdG1wMl9yZWcpOyAvLyBob2lzdGVkCisgICAgX18gbGQoc3RyMl9yZWcsIG9mZnNldF9vZmZzZXQsIHJlc3VsdF9yZWcpOwogICAgIF9fIGFkZCh0bXAyX3JlZywgYXJyYXlPb3BEZXNjOjpiYXNlX29mZnNldF9pbl9ieXRlcyhUX0NIQVIpLCB0bXAyX3JlZyk7Ci0gICAgX18gICAgbGQoQWRkcmVzcyhzdHIyX3JlZywgMCwgY291bnRfb2Zmc2V0KSwgc3RyMl9yZWcpOyAvLyBob2lzdGVkCisgICAgX18gICBsZChzdHIyX3JlZywgY291bnRfb2Zmc2V0LCBzdHIyX3JlZyk7IC8vIGhvaXN0ZWQKICAgICBfXyBzbGwocmVzdWx0X3JlZywgZXhhY3RfbG9nMihzaXplb2YoamNoYXIpKSwgcmVzdWx0X3JlZyk7CiAgICAgX18gICBzdWJjYyhzdHIxX3JlZywgc3RyMl9yZWcsIE83KTsgLy8gaG9pc3RlZAogICAgIF9fIGFkZChyZXN1bHRfcmVnLCB0bXAyX3JlZywgdG1wMl9yZWcpOwpAQCAtMjkyMiw4ICsyODU3LDggQEAKICAgICAvLyBkaWZmZXJlbmNlIG9mIHRoZSBzdHJpbmcgbGVuZ3RocyAoc3RhY2spCiAKICAgICAvLyBkaXNjYXJkIHN0cmluZyBiYXNlIHBvaW50ZXJzLCBhZnRlciBsb2FkaW5nIHVwIHRoZSBsZW5ndGhzCi0gICAgLy8gX18gbGQoQWRkcmVzcyhzdHIxX3JlZywgMCwgY291bnRfb2Zmc2V0KSwgc3RyMV9yZWcpOyAvLyBob2lzdGVkCi0gICAgLy8gX18gbGQoQWRkcmVzcyhzdHIyX3JlZywgMCwgY291bnRfb2Zmc2V0KSwgc3RyMl9yZWcpOyAvLyBob2lzdGVkCisgICAgLy8gX18gbGQoc3RyMV9yZWcsIGNvdW50X29mZnNldCwgc3RyMV9yZWcpOyAvLyBob2lzdGVkCisgICAgLy8gX18gbGQoc3RyMl9yZWcsIGNvdW50X29mZnNldCwgc3RyMl9yZWcpOyAvLyBob2lzdGVkCiAKICAgICAvLyBTZWUgaWYgdGhlIGxlbmd0aHMgYXJlIGRpZmZlcmVudCwgYW5kIGNhbGN1bGF0ZSBtaW4gaW4gc3RyMV9yZWcuCiAgICAgLy8gU3Rhc2ggZGlmZiBpbiBPNyBpbiBjYXNlIHdlIG5lZWQgaXQgZm9yIGEgdGllLWJyZWFrZXIuCkBAIC0zMDIwLDE5ICsyOTU1LDE5IEBACiAgICAgaW50ICBjb3VudF9vZmZzZXQgPSBqYXZhX2xhbmdfU3RyaW5nOjogY291bnRfb2Zmc2V0X2luX2J5dGVzKCk7CiAKICAgICAvLyBsb2FkIHN0cjEgKGpjaGFyKikgYmFzZSBhZGRyZXNzIGludG8gdG1wMV9yZWcKLSAgICBfXyBsb2FkX2hlYXBfb29wKEFkZHJlc3Moc3RyMV9yZWcsIDAsICB2YWx1ZV9vZmZzZXQpLCB0bXAxX3JlZyk7Ci0gICAgX18gbGQoQWRkcmVzcyhzdHIxX3JlZywgMCwgb2Zmc2V0X29mZnNldCksIHJlc3VsdF9yZWcpOworICAgIF9fIGxvYWRfaGVhcF9vb3AoQWRkcmVzcyhzdHIxX3JlZywgdmFsdWVfb2Zmc2V0KSwgdG1wMV9yZWcpOworICAgIF9fIGxkKEFkZHJlc3Moc3RyMV9yZWcsIG9mZnNldF9vZmZzZXQpLCByZXN1bHRfcmVnKTsKICAgICBfXyBhZGQodG1wMV9yZWcsIGFycmF5T29wRGVzYzo6YmFzZV9vZmZzZXRfaW5fYnl0ZXMoVF9DSEFSKSwgdG1wMV9yZWcpOwotICAgIF9fICAgIGxkKEFkZHJlc3Moc3RyMV9yZWcsIDAsIGNvdW50X29mZnNldCksIHN0cjFfcmVnKTsgLy8gaG9pc3RlZAorICAgIF9fICAgIGxkKEFkZHJlc3Moc3RyMV9yZWcsIGNvdW50X29mZnNldCksIHN0cjFfcmVnKTsgLy8gaG9pc3RlZAogICAgIF9fIHNsbChyZXN1bHRfcmVnLCBleGFjdF9sb2cyKHNpemVvZihqY2hhcikpLCByZXN1bHRfcmVnKTsKLSAgICBfXyAgICBsb2FkX2hlYXBfb29wKEFkZHJlc3Moc3RyMl9yZWcsIDAsICB2YWx1ZV9vZmZzZXQpLCB0bXAyX3JlZyk7IC8vIGhvaXN0ZWQKKyAgICBfXyAgICBsb2FkX2hlYXBfb29wKEFkZHJlc3Moc3RyMl9yZWcsIHZhbHVlX29mZnNldCksIHRtcDJfcmVnKTsgLy8gaG9pc3RlZAogICAgIF9fIGFkZChyZXN1bHRfcmVnLCB0bXAxX3JlZywgdG1wMV9yZWcpOwogCiAgICAgLy8gbG9hZCBzdHIyIChqY2hhciopIGJhc2UgYWRkcmVzcyBpbnRvIHRtcDJfcmVnCi0gICAgLy8gX18gbGRfcHRyKEFkZHJlc3Moc3RyMl9yZWcsIDAsICB2YWx1ZV9vZmZzZXQpLCB0bXAyX3JlZyk7IC8vIGhvaXN0ZWQKLSAgICBfXyBsZChBZGRyZXNzKHN0cjJfcmVnLCAwLCBvZmZzZXRfb2Zmc2V0KSwgcmVzdWx0X3JlZyk7CisgICAgLy8gX18gbGRfcHRyKEFkZHJlc3Moc3RyMl9yZWcsIHZhbHVlX29mZnNldCksIHRtcDJfcmVnKTsgLy8gaG9pc3RlZAorICAgIF9fIGxkKEFkZHJlc3Moc3RyMl9yZWcsIG9mZnNldF9vZmZzZXQpLCByZXN1bHRfcmVnKTsKICAgICBfXyBhZGQodG1wMl9yZWcsIGFycmF5T29wRGVzYzo6YmFzZV9vZmZzZXRfaW5fYnl0ZXMoVF9DSEFSKSwgdG1wMl9yZWcpOwotICAgIF9fICAgIGxkKEFkZHJlc3Moc3RyMl9yZWcsIDAsIGNvdW50X29mZnNldCksIHN0cjJfcmVnKTsgLy8gaG9pc3RlZAorICAgIF9fICAgIGxkKEFkZHJlc3Moc3RyMl9yZWcsIGNvdW50X29mZnNldCksIHN0cjJfcmVnKTsgLy8gaG9pc3RlZAogICAgIF9fIHNsbChyZXN1bHRfcmVnLCBleGFjdF9sb2cyKHNpemVvZihqY2hhcikpLCByZXN1bHRfcmVnKTsKICAgICBfXyAgIGNtcChzdHIxX3JlZywgc3RyMl9yZWcpOyAvLyBob2lzdGVkCiAgICAgX18gYWRkKHJlc3VsdF9yZWcsIHRtcDJfcmVnLCB0bXAyX3JlZyk7CkBAIC0zMTM5LDggKzMwNzQsOCBAQAogICAgIF9fIGRlbGF5ZWQoKS0+bW92KEcwLCByZXN1bHRfcmVnKTsgICAgLy8gbm90IGVxdWFsCiAKICAgICAvL2xvYWQgdGhlIGxlbmd0aHMgb2YgYXJyYXlzCi0gICAgX18gbGQoQWRkcmVzcyhhcnkxX3JlZywgMCwgbGVuZ3RoX29mZnNldCksIHRtcDFfcmVnKTsKLSAgICBfXyBsZChBZGRyZXNzKGFyeTJfcmVnLCAwLCBsZW5ndGhfb2Zmc2V0KSwgdG1wMl9yZWcpOworICAgIF9fIGxkKEFkZHJlc3MoYXJ5MV9yZWcsIGxlbmd0aF9vZmZzZXQpLCB0bXAxX3JlZyk7CisgICAgX18gbGQoQWRkcmVzcyhhcnkyX3JlZywgbGVuZ3RoX29mZnNldCksIHRtcDJfcmVnKTsKIAogICAgIC8vIHJldHVybiBmYWxzZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgbm90IGVxdWFsIGxlbmd0aAogICAgIF9fIGNtcCh0bXAxX3JlZywgdG1wMl9yZWcpOwpAQCAtMzIwMiwxOSArMzEzNywyMCBAQAogICBlbmNfY2xhc3MgZW5jX3JldGhyb3coKSAlewogICAgIGNidWYuc2V0X2luc3RfbWFyaygpOwogICAgIFJlZ2lzdGVyIHRlbXBfcmVnID0gRzM7Ci0gICAgQWRkcmVzcyByZXRocm93X3N0dWIodGVtcF9yZWcsIE9wdG9SdW50aW1lOjpyZXRocm93X3N0dWIoKSk7CisgICAgQWRkcmVzc0xpdGVyYWwgcmV0aHJvd19zdHViKE9wdG9SdW50aW1lOjpyZXRocm93X3N0dWIoKSk7CiAgICAgYXNzZXJ0KHRlbXBfcmVnICE9IHJlZ190b19yZWdpc3Rlcl9vYmplY3QoUl9JMF9udW0pLCAidGVtcCBtdXN0IG5vdCBicmVhayBvb3BfcmVnIik7CiAgICAgTWFjcm9Bc3NlbWJsZXIgX21hc20oJmNidWYpOwogI2lmZGVmIEFTU0VSVAogICAgIF9fIHNhdmVfZnJhbWUoMCk7Ci0gICAgQWRkcmVzcyBsYXN0X3JldGhyb3dfYWRkcihMMSwgKGFkZHJlc3MpJmxhc3RfcmV0aHJvdyk7Ci0gICAgX18gc2V0aGkobGFzdF9yZXRocm93X2FkZHIpOworICAgIEFkZHJlc3NMaXRlcmFsIGxhc3RfcmV0aHJvd19hZGRybGl0KCZsYXN0X3JldGhyb3cpOworICAgIF9fIHNldGhpKGxhc3RfcmV0aHJvd19hZGRybGl0LCBMMSk7CisgICAgQWRkcmVzcyBhZGRyKEwxLCBsYXN0X3JldGhyb3dfYWRkcmxpdC5sb3cxMCgpKTsKICAgICBfXyBnZXRfcGMoTDIpOwogICAgIF9fIGluYyhMMiwgMyAqIEJ5dGVzUGVySW5zdFdvcmQpOyAgLy8gc2tpcCB0aGlzICYgMiBtb3JlIGluc25zIHRvIHBvaW50IGF0IGp1bXBfdG8KLSAgICBfXyBzdF9wdHIoTDIsIGxhc3RfcmV0aHJvd19hZGRyKTsKKyAgICBfXyBzdF9wdHIoTDIsIGFkZHIpOwogICAgIF9fIHJlc3RvcmUoKTsKICNlbmRpZgotICAgIF9fIEpVTVAocmV0aHJvd19zdHViLCAwKTsgLy8gc2V0aGk7am1wCisgICAgX18gSlVNUChyZXRocm93X3N0dWIsIHRlbXBfcmVnLCAwKTsgLy8gc2V0aGk7am1wCiAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKICAgJX0KIApAQCAtNTQ5Myw4ICs1NDI5LDkgQEAKIAogICBzaXplKDQpOwogICBmb3JtYXQgJXsgIkxEU0IgICAkbWVtLCRkc3RcdCEgYnl0ZSIgJX0KLSAgb3Bjb2RlKEFzc2VtYmxlcjo6bGRzYl9vcDMpOwotICBpbnNfZW5jb2RlKHNpbXBsZV9mb3JtM19tZW1fcmVnKCBtZW0sIGRzdCApICk7CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHNiKCRtZW0kJEFkZHJlc3MsICRkc3QkJFJlZ2lzdGVyKTsKKyAgJX0KICAgaW5zX3BpcGUoaWxvYWRfbWFza19tZW0pOwogJX0KIApAQCAtNTUwNSw4ICs1NDQyLDkgQEAKIAogICBzaXplKDQpOwogICBmb3JtYXQgJXsgIkxEU0IgICAkbWVtLCRkc3RcdCEgYnl0ZSAtPiBsb25nIiAlfQotICBvcGNvZGUoQXNzZW1ibGVyOjpsZHNiX29wMyk7Ci0gIGluc19lbmNvZGUoc2ltcGxlX2Zvcm0zX21lbV9yZWcoIG1lbSwgZHN0ICkgKTsKKyAgaW5zX2VuY29kZSAleworICAgIF9fIGxkc2IoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOworICAlfQogICBpbnNfcGlwZShpbG9hZF9tYXNrX21lbSk7CiAlfQogCkBAIC01NTE3LDggKzU0NTUsOSBAQAogCiAgIHNpemUoNCk7CiAgIGZvcm1hdCAleyAiTERVQiAgICRtZW0sJGRzdFx0ISB1Ynl0ZSIgJX0KLSAgb3Bjb2RlKEFzc2VtYmxlcjo6bGR1Yl9vcDMpOwotICBpbnNfZW5jb2RlKHNpbXBsZV9mb3JtM19tZW1fcmVnKCBtZW0sIGRzdCApICk7CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHViKCRtZW0kJEFkZHJlc3MsICRkc3QkJFJlZ2lzdGVyKTsKKyAgJX0KICAgaW5zX3BpcGUoaWxvYWRfbWFza19tZW0pOwogJX0KIApAQCAtNTUyOSw4ICs1NDY4LDkgQEAKIAogICBzaXplKDQpOwogICBmb3JtYXQgJXsgIkxEVUIgICAkbWVtLCRkc3RcdCEgdWJ5dGUgLT4gbG9uZyIgJX0KLSAgb3Bjb2RlKEFzc2VtYmxlcjo6bGR1Yl9vcDMpOwotICBpbnNfZW5jb2RlKHNpbXBsZV9mb3JtM19tZW1fcmVnKCBtZW0sIGRzdCApICk7CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHViKCRtZW0kJEFkZHJlc3MsICRkc3QkJFJlZ2lzdGVyKTsKKyAgJX0KICAgaW5zX3BpcGUoaWxvYWRfbWFza19tZW0pOwogJX0KIApAQCAtNTU0MSw4ICs1NDgxLDkgQEAKIAogICBzaXplKDQpOwogICBmb3JtYXQgJXsgIkxEU0ggICAkbWVtLCRkc3RcdCEgc2hvcnQiICV9Ci0gIG9wY29kZShBc3NlbWJsZXI6Omxkc2hfb3AzKTsKLSAgaW5zX2VuY29kZShzaW1wbGVfZm9ybTNfbWVtX3JlZyggbWVtLCBkc3QgKSApOworICBpbnNfZW5jb2RlICV7CisgICAgX18gbGRzaCgkbWVtJCRBZGRyZXNzLCAkZHN0JCRSZWdpc3Rlcik7CisgICV9CiAgIGluc19waXBlKGlsb2FkX21hc2tfbWVtKTsKICV9CiAKQEAgLTU1NTMsOCArNTQ5NCw5IEBACiAKICAgc2l6ZSg0KTsKICAgZm9ybWF0ICV7ICJMRFNIICAgJG1lbSwkZHN0XHQhIHNob3J0IC0+IGxvbmciICV9Ci0gIG9wY29kZShBc3NlbWJsZXI6Omxkc2hfb3AzKTsKLSAgaW5zX2VuY29kZShzaW1wbGVfZm9ybTNfbWVtX3JlZyggbWVtLCBkc3QgKSApOworICBpbnNfZW5jb2RlICV7CisgICAgX18gbGRzaCgkbWVtJCRBZGRyZXNzLCAkZHN0JCRSZWdpc3Rlcik7CisgICV9CiAgIGluc19waXBlKGlsb2FkX21hc2tfbWVtKTsKICV9CiAKQEAgLTU1NjUsOCArNTUwNyw5IEBACiAKICAgc2l6ZSg0KTsKICAgZm9ybWF0ICV7ICJMRFVIICAgJG1lbSwkZHN0XHQhIHVzaG9ydC9jaGFyIiAlfQotICBvcGNvZGUoQXNzZW1ibGVyOjpsZHVoX29wMyk7Ci0gIGluc19lbmNvZGUoc2ltcGxlX2Zvcm0zX21lbV9yZWcoIG1lbSwgZHN0ICkgKTsKKyAgaW5zX2VuY29kZSAleworICAgIF9fIGxkdWgoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOworICAlfQogICBpbnNfcGlwZShpbG9hZF9tYXNrX21lbSk7CiAlfQogCkBAIC01NTc3LDggKzU1MjAsOSBAQAogCiAgIHNpemUoNCk7CiAgIGZvcm1hdCAleyAiTERVSCAgICRtZW0sJGRzdFx0ISB1c2hvcnQvY2hhciAtPiBsb25nIiAlfQotICBvcGNvZGUoQXNzZW1ibGVyOjpsZHVoX29wMyk7Ci0gIGluc19lbmNvZGUoc2ltcGxlX2Zvcm0zX21lbV9yZWcoIG1lbSwgZHN0ICkgKTsKKyAgaW5zX2VuY29kZSAleworICAgIF9fIGxkdWgoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOworICAlfQogICBpbnNfcGlwZShpbG9hZF9tYXNrX21lbSk7CiAlfQogCkBAIC01NTg5LDggKzU1MzMsOSBAQAogCiAgIHNpemUoNCk7CiAgIGZvcm1hdCAleyAiTERVVyAgICRtZW0sJGRzdFx0ISBpbnQiICV9Ci0gIG9wY29kZShBc3NlbWJsZXI6OmxkdXdfb3AzKTsKLSAgaW5zX2VuY29kZShzaW1wbGVfZm9ybTNfbWVtX3JlZyggbWVtLCBkc3QgKSApOworICBpbnNfZW5jb2RlICV7CisgICAgX18gbGR1dygkbWVtJCRBZGRyZXNzLCAkZHN0JCRSZWdpc3Rlcik7CisgICV9CiAgIGluc19waXBlKGlsb2FkX21lbSk7CiAlfQogCkBAIC01NjAxLDggKzU1NDYsOSBAQAogCiAgIHNpemUoNCk7CiAgIGZvcm1hdCAleyAiTERTVyAgICRtZW0sJGRzdFx0ISBpbnQgLT4gbG9uZyIgJX0KLSAgb3Bjb2RlKEFzc2VtYmxlcjo6bGRzd19vcDMpOwotICBpbnNfZW5jb2RlKHNpbXBsZV9mb3JtM19tZW1fcmVnKCBtZW0sIGRzdCApICk7CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHN3KCRtZW0kJEFkZHJlc3MsICRkc3QkJFJlZ2lzdGVyKTsKKyAgJX0KICAgaW5zX3BpcGUoaWxvYWRfbWVtKTsKICV9CiAKQEAgLTU2MTMsOCArNTU1OSw5IEBACiAKICAgc2l6ZSg0KTsKICAgZm9ybWF0ICV7ICJMRFVXICAgJG1lbSwkZHN0XHQhIHVpbnQgLT4gbG9uZyIgJX0KLSAgb3Bjb2RlKEFzc2VtYmxlcjo6bGR1d19vcDMpOwotICBpbnNfZW5jb2RlKHNpbXBsZV9mb3JtM19tZW1fcmVnKCBtZW0sIGRzdCApICk7CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHV3KCRtZW0kJEFkZHJlc3MsICRkc3QkJFJlZ2lzdGVyKTsKKyAgJX0KICAgaW5zX3BpcGUoaWxvYWRfbWVtKTsKICV9CiAKQEAgLTU2MjUsOCArNTU3Miw5IEBACiAKICAgc2l6ZSg0KTsKICAgZm9ybWF0ICV7ICJMRFggICAgJG1lbSwkZHN0XHQhIGxvbmciICV9Ci0gIG9wY29kZShBc3NlbWJsZXI6OmxkeF9vcDMpOwotICBpbnNfZW5jb2RlKHNpbXBsZV9mb3JtM19tZW1fcmVnKCBtZW0sIGRzdCApICk7CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHgoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOworICAlfQogICBpbnNfcGlwZShpbG9hZF9tZW0pOwogJX0KIApAQCAtNTcyMSwzMSArNTY2OSwyOSBAQAogCiAjaWZuZGVmIF9MUDY0CiAgIGZvcm1hdCAleyAiTERVVyAgICRtZW0sJGRzdFx0ISBwdHIiICV9Ci0gIG9wY29kZShBc3NlbWJsZXI6OmxkdXdfb3AzLCAwLCBSRUdQX09QKTsKKyAgaW5zX2VuY29kZSAleworICAgIF9fIGxkdXcoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOworICAlfQogI2Vsc2UKICAgZm9ybWF0ICV7ICJMRFggICAgJG1lbSwkZHN0XHQhIHB0ciIgJX0KLSAgb3Bjb2RlKEFzc2VtYmxlcjo6bGR4X29wMywgMCwgUkVHUF9PUCk7CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHgoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOworICAlfQogI2VuZGlmCi0gIGluc19lbmNvZGUoIGZvcm0zX21lbV9yZWcoIG1lbSwgZHN0ICkgKTsKICAgaW5zX3BpcGUoaWxvYWRfbWVtKTsKICV9CiAKIC8vIExvYWQgQ29tcHJlc3NlZCBQb2ludGVyCiBpbnN0cnVjdCBsb2FkTihpUmVnTiBkc3QsIG1lbW9yeSBtZW0pICV7Ci0gICBtYXRjaChTZXQgZHN0IChMb2FkTiBtZW0pKTsKLSAgIGluc19jb3N0KE1FTU9SWV9SRUZfQ09TVCk7Ci0gICBzaXplKDQpOworICBtYXRjaChTZXQgZHN0IChMb2FkTiBtZW0pKTsKKyAgaW5zX2Nvc3QoTUVNT1JZX1JFRl9DT1NUKTsKKyAgc2l6ZSg0KTsKIAotICAgZm9ybWF0ICV7ICJMRFVXICAgJG1lbSwkZHN0XHQhIGNvbXByZXNzZWQgcHRyIiAlfQotICAgaW5zX2VuY29kZSAlewotICAgICBSZWdpc3RlciBpbmRleCA9ICRtZW0kJGluZGV4JCRSZWdpc3RlcjsKLSAgICAgaWYgKGluZGV4ICE9IEcwKSB7Ci0gICAgICAgX18gbGR1dygkbWVtJCRiYXNlJCRSZWdpc3RlciwgaW5kZXgsICRkc3QkJFJlZ2lzdGVyKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICBfXyBsZHV3KCRtZW0kJGJhc2UkJFJlZ2lzdGVyLCAkbWVtJCRkaXNwLCAkZHN0JCRSZWdpc3Rlcik7Ci0gICAgIH0KLSAgICV9Ci0gICBpbnNfcGlwZShpbG9hZF9tZW0pOworICBmb3JtYXQgJXsgIkxEVVcgICAkbWVtLCRkc3RcdCEgY29tcHJlc3NlZCBwdHIiICV9CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHV3KCRtZW0kJEFkZHJlc3MsICRkc3QkJFJlZ2lzdGVyKTsKKyAgJX0KKyAgaW5zX3BpcGUoaWxvYWRfbWVtKTsKICV9CiAKIC8vIExvYWQgS2xhc3MgUG9pbnRlcgpAQCAtNTc1NiwxMiArNTcwMiwxNSBAQAogCiAjaWZuZGVmIF9MUDY0CiAgIGZvcm1hdCAleyAiTERVVyAgICRtZW0sJGRzdFx0ISBrbGFzcyBwdHIiICV9Ci0gIG9wY29kZShBc3NlbWJsZXI6OmxkdXdfb3AzLCAwLCBSRUdQX09QKTsKKyAgaW5zX2VuY29kZSAleworICAgIF9fIGxkdXcoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOworICAlfQogI2Vsc2UKICAgZm9ybWF0ICV7ICJMRFggICAgJG1lbSwkZHN0XHQhIGtsYXNzIHB0ciIgJX0KLSAgb3Bjb2RlKEFzc2VtYmxlcjo6bGR4X29wMywgMCwgUkVHUF9PUCk7CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBsZHgoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOworICAlfQogI2VuZGlmCi0gIGluc19lbmNvZGUoIGZvcm0zX21lbV9yZWcoIG1lbSwgZHN0ICkgKTsKICAgaW5zX3BpcGUoaWxvYWRfbWVtKTsKICV9CiAKQEAgLTU3NzIsMTYgKzU3MjEsOCBAQAogICBzaXplKDQpOwogCiAgIGZvcm1hdCAleyAiTERVVyAgICRtZW0sJGRzdFx0ISBjb21wcmVzc2VkIGtsYXNzIHB0ciIgJX0KLQogICBpbnNfZW5jb2RlICV7Ci0gICAgIFJlZ2lzdGVyIGJhc2UgPSBhc19SZWdpc3RlcigkbWVtJCRiYXNlKTsKLSAgICAgUmVnaXN0ZXIgaW5kZXggPSBhc19SZWdpc3RlcigkbWVtJCRpbmRleCk7Ci0gICAgIFJlZ2lzdGVyIGRzdCA9ICRkc3QkJFJlZ2lzdGVyOwotICAgICBpZiAoaW5kZXggIT0gRzApIHsKLSAgICAgICBfXyBsZHV3KGJhc2UsIGluZGV4LCBkc3QpOwotICAgICB9IGVsc2UgewotICAgICAgIF9fIGxkdXcoYmFzZSwgJG1lbSQkZGlzcCwgZHN0KTsKLSAgICAgfQorICAgIF9fIGxkdXcoJG1lbSQkQWRkcmVzcywgJGRzdCQkUmVnaXN0ZXIpOwogICAlfQogICBpbnNfcGlwZShpbG9hZF9tZW0pOwogJX0KQEAgLTU4NjcsOCArNTgwOCw4IEBACiAgIGluc19jb3N0KERFRkFVTFRfQ09TVCk7CiAgIGZvcm1hdCAleyAiU0VUICAgICRzcmMsJGRzdFx0IXB0ciIgJX0KICAgaW5zX2VuY29kZSAlewotICAgIEFkZHJlc3MgcG9sbGluZ19wYWdlKHJlZ190b19yZWdpc3Rlcl9vYmplY3QoJGRzdCQkcmVnKSwgKGFkZHJlc3Mpb3M6OmdldF9wb2xsaW5nX3BhZ2UoKSk7Ci0gICAgX18gc2V0aGkocG9sbGluZ19wYWdlLCBmYWxzZSApOworICAgIEFkZHJlc3NMaXRlcmFsIHBvbGxpbmdfcGFnZShvczo6Z2V0X3BvbGxpbmdfcGFnZSgpKTsKKyAgICBfXyBzZXRoaShwb2xsaW5nX3BhZ2UsIHJlZ190b19yZWdpc3Rlcl9vYmplY3QoJGRzdCQkcmVnKSk7CiAgICV9CiAgIGluc19waXBlKGxvYWRDb25QX3BvbGwpOwogJX0KQEAgLTU5MjcsMTQgKzU4NjgsMjEgQEAKICAgZWZmZWN0KEtJTEwgdG1wKTsKIAogI2lmZGVmIF9MUDY0Ci0gIHNpemUoMzYpOworICBzaXplKDgqNCk7CiAjZWxzZQotICBzaXplKDgpOworICBzaXplKDIqNCk7CiAjZW5kaWYKIAogICBmb3JtYXQgJXsgIlNFVEhJICBoaSgmJHNyYyksJHRtcFx0IWdldCBmbG9hdCAkc3JjIGZyb20gdGFibGVcblx0IgogICAgICAgICAgICAgIkxERiAgICBbJHRtcCtsbygmJHNyYyldLCRkc3QiICV9Ci0gIGluc19lbmNvZGUoIExkSW1tRihzcmMsIGRzdCwgdG1wKSApOworICBpbnNfZW5jb2RlICV7CisgICAgYWRkcmVzcyBmbG9hdF9hZGRyZXNzID0gX18gZmxvYXRfY29uc3RhbnQoJHNyYyQkY29uc3RhbnQpOworICAgIFJlbG9jYXRpb25Ib2xkZXIgcnNwZWMgPSBpbnRlcm5hbF93b3JkX1JlbG9jYXRpb246OnNwZWMoZmxvYXRfYWRkcmVzcyk7CisgICAgQWRkcmVzc0xpdGVyYWwgYWRkcmxpdChmbG9hdF9hZGRyZXNzLCByc3BlYyk7CisKKyAgICBfXyBzZXRoaShhZGRybGl0LCAkdG1wJCRSZWdpc3Rlcik7CisgICAgX18gbGRmKEZsb2F0UmVnaXN0ZXJJbXBsOjpTLCAkdG1wJCRSZWdpc3RlciwgYWRkcmxpdC5sb3cxMCgpLCAkZHN0JCRGbG9hdFJlZ2lzdGVyLCByc3BlYyk7CisgICV9CiAgIGluc19waXBlKGxvYWRDb25GRCk7CiAlfQogCkBAIC01OTQzLDE0ICs1ODkxLDIzIEBACiAgIGVmZmVjdChLSUxMIHRtcCk7CiAKICNpZmRlZiBfTFA2NAotICBzaXplKDM2KTsKKyAgc2l6ZSg4KjQpOwogI2Vsc2UKLSAgc2l6ZSg4KTsKKyAgc2l6ZSgyKjQpOwogI2VuZGlmCiAKICAgZm9ybWF0ICV7ICJTRVRISSAgaGkoJiRzcmMpLCR0bXBcdCFnZXQgZG91YmxlICRzcmMgZnJvbSB0YWJsZVxuXHQiCiAgICAgICAgICAgICAiTERERiAgIFskdG1wK2xvKCYkc3JjKV0sJGRzdCIgJX0KLSAgaW5zX2VuY29kZSggTGRJbW1EKHNyYywgZHN0LCB0bXApICk7CisgIGluc19lbmNvZGUgJXsKKyAgICBhZGRyZXNzIGRvdWJsZV9hZGRyZXNzID0gX18gZG91YmxlX2NvbnN0YW50KCRzcmMkJGNvbnN0YW50KTsKKyAgICBSZWxvY2F0aW9uSG9sZGVyIHJzcGVjID0gaW50ZXJuYWxfd29yZF9SZWxvY2F0aW9uOjpzcGVjKGRvdWJsZV9hZGRyZXNzKTsKKyAgICBBZGRyZXNzTGl0ZXJhbCBhZGRybGl0KGRvdWJsZV9hZGRyZXNzLCByc3BlYyk7CisKKyAgICBfXyBzZXRoaShhZGRybGl0LCAkdG1wJCRSZWdpc3Rlcik7CisgICAgLy8gWFhYIFRoaXMgaXMgYSBxdWljayBmaXggZm9yIDY4MzM1NzMuCisgICAgLy9fXyBsZGYoRmxvYXRSZWdpc3RlckltcGw6OkQsICR0bXAkJFJlZ2lzdGVyLCBhZGRybGl0LmxvdzEwKCksICRkc3QkJEZsb2F0UmVnaXN0ZXIsIHJzcGVjKTsKKyAgICBfXyBsZGYoRmxvYXRSZWdpc3RlckltcGw6OkQsICR0bXAkJFJlZ2lzdGVyLCBhZGRybGl0LmxvdzEwKCksIGFzX0RvdWJsZUZsb2F0UmVnaXN0ZXIoJGRzdCQkcmVnKSwgcnNwZWMpOworICAlfQogICBpbnNfcGlwZShsb2FkQ29uRkQpOwogJX0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3N0dWJHZW5lcmF0b3Jfc3BhcmMuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3N0dWJHZW5lcmF0b3Jfc3BhcmMuY3BwCmluZGV4IDYyYzIwMTYuLmEyZGMxNTAgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9zdHViR2VuZXJhdG9yX3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vc3R1YkdlbmVyYXRvcl9zcGFyYy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDE5OTctMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDE5OTctMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02OCwxNiArNjgsOSBAQAogI2lmZGVmIFBST0RVQ1QKICNkZWZpbmUgaW5jX2NvdW50ZXJfbnAoYSxiLGMpICgwKQogI2Vsc2UKLSAgdm9pZCBpbmNfY291bnRlcl9ucF8oaW50JiBjb3VudGVyLCBSZWdpc3RlciB0MSwgUmVnaXN0ZXIgdDIpIHsKLSAgICBBZGRyZXNzIGNvdW50ZXJfYWRkcih0MiwgKGFkZHJlc3MpICZjb3VudGVyKTsKLSAgICBfXyBzZXRoaShjb3VudGVyX2FkZHIpOwotICAgIF9fIGxkKGNvdW50ZXJfYWRkciwgdDEpOwotICAgIF9fIGluYyh0MSk7Ci0gICAgX18gc3QodDEsIGNvdW50ZXJfYWRkcik7Ci0gIH0KICNkZWZpbmUgaW5jX2NvdW50ZXJfbnAoY291bnRlciwgdDEsIHQyKSBcCiAgIEJMT0NLX0NPTU1FTlQoImluY19jb3VudGVyICIgI2NvdW50ZXIpOyBcCi0gIGluY19jb3VudGVyX25wXyhjb3VudGVyLCB0MSwgdDIpOworICBfXyBpbmNfY291bnRlcigmY291bnRlciwgdDEsIHQyKTsKICNlbmRpZgogCiAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzI1LDkgKzMxOCw5IEBACiAgICAgX18gdmVyaWZ5X3RocmVhZCgpOwogCiAgICAgY29uc3QgUmVnaXN0ZXImIHRlbXBfcmVnID0gR3RlbXA7Ci0gICAgQWRkcmVzcyBwZW5kaW5nX2V4Y2VwdGlvbl9hZGRyICAgIChHMl90aHJlYWQsIDAsIGluX2J5dGVzKFRocmVhZDo6cGVuZGluZ19leGNlcHRpb25fb2Zmc2V0KCkpKTsKLSAgICBBZGRyZXNzIGV4Y2VwdGlvbl9maWxlX29mZnNldF9hZGRyKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoVGhyZWFkOjpleGNlcHRpb25fZmlsZV9vZmZzZXQgICAoKSkpOwotICAgIEFkZHJlc3MgZXhjZXB0aW9uX2xpbmVfb2Zmc2V0X2FkZHIoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhUaHJlYWQ6OmV4Y2VwdGlvbl9saW5lX29mZnNldCAgICgpKSk7CisgICAgQWRkcmVzcyBwZW5kaW5nX2V4Y2VwdGlvbl9hZGRyICAgIChHMl90aHJlYWQsIFRocmVhZDo6cGVuZGluZ19leGNlcHRpb25fb2Zmc2V0KCkpOworICAgIEFkZHJlc3MgZXhjZXB0aW9uX2ZpbGVfb2Zmc2V0X2FkZHIoRzJfdGhyZWFkLCBUaHJlYWQ6OmV4Y2VwdGlvbl9maWxlX29mZnNldCAgICgpKTsKKyAgICBBZGRyZXNzIGV4Y2VwdGlvbl9saW5lX29mZnNldF9hZGRyKEcyX3RocmVhZCwgVGhyZWFkOjpleGNlcHRpb25fbGluZV9vZmZzZXQgICAoKSk7CiAKICAgICAvLyBzZXQgcGVuZGluZyBleGNlcHRpb24KICAgICBfXyB2ZXJpZnlfb29wKE9leGNlcHRpb24pOwpAQCAtMzQwLDggKzMzMyw4IEBACiAgICAgLy8gY29tcGxldGUgcmV0dXJuIHRvIFZNCiAgICAgYXNzZXJ0KFN0dWJSb3V0aW5lczo6X2NhbGxfc3R1Yl9yZXR1cm5fYWRkcmVzcyAhPSBOVUxMLCAibXVzdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJlZm9yZSIpOwogCi0gICAgQWRkcmVzcyBzdHViX3JldCh0ZW1wX3JlZywgU3R1YlJvdXRpbmVzOjpfY2FsbF9zdHViX3JldHVybl9hZGRyZXNzKTsKLSAgICBfXyBqdW1wX3RvKHN0dWJfcmV0KTsKKyAgICBBZGRyZXNzTGl0ZXJhbCBzdHViX3JldChTdHViUm91dGluZXM6Ol9jYWxsX3N0dWJfcmV0dXJuX2FkZHJlc3MpOworICAgIF9fIGp1bXBfdG8oc3R1Yl9yZXQsIHRlbXBfcmVnKTsKICAgICBfXyBkZWxheWVkKCktPm5vcCgpOwogCiAgICAgcmV0dXJuIHN0YXJ0OwpAQCAtMzY2LDcgKzM1OSw3IEBACiAKICAgICBjb25zdCBSZWdpc3RlciYgaGFuZGxlcl9yZWcgPSBHdGVtcDsKIAotICAgIEFkZHJlc3MgZXhjZXB0aW9uX2FkZHIgKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoVGhyZWFkOjpwZW5kaW5nX2V4Y2VwdGlvbl9vZmZzZXQoKSkpOworICAgIEFkZHJlc3MgZXhjZXB0aW9uX2FkZHIoRzJfdGhyZWFkLCBUaHJlYWQ6OnBlbmRpbmdfZXhjZXB0aW9uX29mZnNldCgpKTsKIAogI2lmZGVmIEFTU0VSVAogICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoaXMgY29kZSBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBleGNlcHRpb24KQEAgLTQ1Niw4ICs0NDksNyBAQAogICAgIGludCBmcmFtZV9jb21wbGV0ZSA9IF9fIG9mZnNldCgpOwogCiAgICAgaWYgKHJlc3RvcmVfc2F2ZWRfZXhjZXB0aW9uX3BjKSB7Ci0gICAgICBBZGRyZXNzIHNhdmVkX2V4Y2VwdGlvbl9wYyhHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6OnNhdmVkX2V4Y2VwdGlvbl9wY19vZmZzZXQoKSkpOwotICAgICAgX18gbGRfcHRyKHNhdmVkX2V4Y2VwdGlvbl9wYywgSTcpOworICAgICAgX18gbGRfcHRyKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6c2F2ZWRfZXhjZXB0aW9uX3BjX29mZnNldCgpLCBJNyk7CiAgICAgICBfXyBzdWIoSTcsIGZyYW1lOjpwY19yZXR1cm5fb2Zmc2V0LCBJNyk7CiAgICAgfQogCkBAIC00ODEsNyArNDczLDcgQEAKICNpZmRlZiBBU1NFUlQKICAgICBMYWJlbCBMOwogCi0gICAgQWRkcmVzcyBleGNlcHRpb25fYWRkcihHMl90aHJlYWQsIDAsIGluX2J5dGVzKFRocmVhZDo6cGVuZGluZ19leGNlcHRpb25fb2Zmc2V0KCkpKTsKKyAgICBBZGRyZXNzIGV4Y2VwdGlvbl9hZGRyKEcyX3RocmVhZCwgVGhyZWFkOjpwZW5kaW5nX2V4Y2VwdGlvbl9vZmZzZXQoKSk7CiAgICAgUmVnaXN0ZXIgc2NyYXRjaF9yZWcgPSBHdGVtcDsKICAgICBfXyBsZF9wdHIoZXhjZXB0aW9uX2FkZHIsIHNjcmF0Y2hfcmVnKTsKICAgICBfXyBicl9ub3RudWxsKHNjcmF0Y2hfcmVnLCBmYWxzZSwgQXNzZW1ibGVyOjpwdCwgTCk7CkBAIC04MzUsNyArODI3LDcgQEAKICAgICBhZGRyZXNzIHN0YXJ0ID0gX18gcGMoKTsKIAogICAgIGNvbnN0IGludCBwcmVzZXJ2ZV9yZWdpc3Rlcl93b3JkcyA9ICg2NCAqIDIpOwotICAgIEFkZHJlc3MgcHJlc2VydmVfYWRkcihGUCwgMCwgKC1wcmVzZXJ2ZV9yZWdpc3Rlcl93b3JkcyAqIHdvcmRTaXplKSArIFNUQUNLX0JJQVMpOworICAgIEFkZHJlc3MgcHJlc2VydmVfYWRkcihGUCwgKC1wcmVzZXJ2ZV9yZWdpc3Rlcl93b3JkcyAqIHdvcmRTaXplKSArIFNUQUNLX0JJQVMpOwogCiAgICAgUmVnaXN0ZXIgTHRocmVhZCA9IEw3X3RocmVhZF9jYWNoZTsKICAgICBpbnQgaTsKQEAgLTExMDYsMjEgKzEwOTgsMTkgQEAKICAgICAgICAgICBfXyBzcmxfcHRyKGFkZHIsIENhcmRUYWJsZU1vZFJlZkJTOjpjYXJkX3NoaWZ0LCBhZGRyKTsKICAgICAgICAgICBfXyBzcmxfcHRyKGNvdW50LCBDYXJkVGFibGVNb2RSZWZCUzo6Y2FyZF9zaGlmdCwgY291bnQpOwogICAgICAgICAgIF9fIHN1Yihjb3VudCwgYWRkciwgY291bnQpOwotICAgICAgICAgIEFkZHJlc3MgcnModG1wLCAoYWRkcmVzcyljdC0+Ynl0ZV9tYXBfYmFzZSk7Ci0gICAgICAgICAgX18gbG9hZF9hZGRyZXNzKHJzKTsKKyAgICAgICAgICBBZGRyZXNzTGl0ZXJhbCBycyhjdC0+Ynl0ZV9tYXBfYmFzZSk7CisgICAgICAgICAgX18gc2V0KHJzLCB0bXApOwogICAgICAgICBfXyBCSU5EKExfbG9vcCk7Ci0gICAgICAgICAgX18gc3RiKEcwLCBycy5iYXNlKCksIGFkZHIpOworICAgICAgICAgIF9fIHN0YihHMCwgdG1wLCBhZGRyKTsKICAgICAgICAgICBfXyBzdWJjYyhjb3VudCwgMSwgY291bnQpOwogICAgICAgICAgIF9fIGJyeChBc3NlbWJsZXI6OmdyZWF0ZXJFcXVhbCwgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIExfbG9vcCk7CiAgICAgICAgICAgX18gZGVsYXllZCgpLT5hZGQoYWRkciwgMSwgYWRkcik7Ci0KLSAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEJhcnJpZXJTZXQ6Ok1vZFJlZjoKICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0ICAgICAgOgorICAgICAgZGVmYXVsdDoKICAgICAgICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7Ci0KICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3RlbXBsYXRlSW50ZXJwcmV0ZXJfc3BhcmMuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3RlbXBsYXRlSW50ZXJwcmV0ZXJfc3BhcmMuY3BwCmluZGV4IDZjYmNmOTIuLmI4M2VkODIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS90ZW1wbGF0ZUludGVycHJldGVyX3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vdGVtcGxhdGVJbnRlcnByZXRlcl9zcGFyYy5jcHAKQEAgLTg3LDggKzg3LDggQEAKICAgfQogICAvLyB0aHJvdyBleGNlcHRpb24KICAgYXNzZXJ0KEludGVycHJldGVyOjp0aHJvd19leGNlcHRpb25fZW50cnkoKSAhPSBOVUxMLCAiZ2VuZXJhdGUgaXQgZmlyc3QiKTsKLSAgQWRkcmVzcyB0aHJvd2VyKEczX3NjcmF0Y2gsIEludGVycHJldGVyOjp0aHJvd19leGNlcHRpb25fZW50cnkoKSk7Ci0gIF9fIGp1bXBfdG8gKHRocm93ZXIpOworICBBZGRyZXNzTGl0ZXJhbCB0aHJvd2VyKEludGVycHJldGVyOjp0aHJvd19leGNlcHRpb25fZW50cnkoKSk7CisgIF9fIGp1bXBfdG8odGhyb3dlciwgRzNfc2NyYXRjaCk7CiAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CiAgIHJldHVybiBlbnRyeTsKIH0KQEAgLTE1MCw3ICsxNTAsOCBAQAogfQogCiAKLWFkZHJlc3MgVGVtcGxhdGVJbnRlcnByZXRlckdlbmVyYXRvcjo6Z2VuZXJhdGVfcmV0dXJuX2VudHJ5X2ZvcihUb3NTdGF0ZSBzdGF0ZSwgaW50IHN0ZXApIHsKK2FkZHJlc3MgVGVtcGxhdGVJbnRlcnByZXRlckdlbmVyYXRvcjo6Z2VuZXJhdGVfcmV0dXJuX2VudHJ5X2ZvcihUb3NTdGF0ZSBzdGF0ZSwgaW50IHN0ZXAsIGJvb2wgdW5ib3gpIHsKKyAgYXNzZXJ0KCF1bmJveCwgIk5ZSSIpOy8vNjgxNTY5Mi8vCiAgIGFkZHJlc3MgY29tcGlsZWRfZW50cnkgPSBfXyBwYygpOwogICBMYWJlbCBjb250OwogCkBAIC0xODYsOCArMTg3LDggQEAKICAgY29uc3QgUmVnaXN0ZXIgY2FjaGUgPSBHM19zY3JhdGNoOwogICBjb25zdCBSZWdpc3RlciBzaXplICA9IEcxX3NjcmF0Y2g7CiAgIF9fIGdldF9jYWNoZV9hbmRfaW5kZXhfYXRfYmNwKGNhY2hlLCBHMV9zY3JhdGNoLCAxKTsKLSAgX18gbGRfcHRyKEFkZHJlc3MoY2FjaGUsIDAsIGluX2J5dGVzKGNvbnN0YW50UG9vbENhY2hlT29wRGVzYzo6YmFzZV9vZmZzZXQoKSkgKwotICAgICAgICAgICAgICAgICAgICBpbl9ieXRlcyhDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmbGFnc19vZmZzZXQoKSkpLCBzaXplKTsKKyAgX18gbGRfcHRyKGNhY2hlLCBjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmJhc2Vfb2Zmc2V0KCkgKworICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmZsYWdzX29mZnNldCgpLCBzaXplKTsKICAgX18gYW5kMyhzaXplLCAweEZGLCBzaXplKTsgICAgICAgICAgICAgICAgICAgLy8gYXJndW1lbnQgc2l6ZSBpbiB3b3JkcwogICBfXyBzbGwoc2l6ZSwgSW50ZXJwcmV0ZXI6OmxvZ1N0YWNrRWxlbWVudFNpemUoKSwgc2l6ZSk7IC8vIGVhY2ggYXJndW1lbnQgc2l6ZSBpbiBieXRlcwogICBfXyBhZGQoTGVzcCwgc2l6ZSwgTGVzcCk7ICAgICAgICAgICAgICAgICAgICAvLyBwb3AgYXJndW1lbnRzCkBAIC0yMDEsOSArMjAyLDggQEAKICAgYWRkcmVzcyBlbnRyeSA9IF9fIHBjKCk7CiAgIF9fIGdldF9jb25zdGFudF9wb29sX2NhY2hlKExjcG9vbENhY2hlKTsgLy8gbG9hZCBMY3Bvb2xDYWNoZQogICB7IExhYmVsIEw7Ci0gICAgQWRkcmVzcyBleGNlcHRpb25fYWRkciAoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhUaHJlYWQ6OnBlbmRpbmdfZXhjZXB0aW9uX29mZnNldCgpKSk7Ci0KLSAgICBfXyBsZF9wdHIoZXhjZXB0aW9uX2FkZHIsIEd0ZW1wKTsKKyAgICBBZGRyZXNzIGV4Y2VwdGlvbl9hZGRyKEcyX3RocmVhZCwgVGhyZWFkOjpwZW5kaW5nX2V4Y2VwdGlvbl9vZmZzZXQoKSk7CisgICAgX18gbGRfcHRyKGV4Y2VwdGlvbl9hZGRyLCBHdGVtcCk7ICAvLyBMb2FkIHBlbmRpbmcgZXhjZXB0aW9uLgogICAgIF9fIHRzdChHdGVtcCk7CiAgICAgX18gYnJ4KEFzc2VtYmxlcjo6ZXF1YWwsIGZhbHNlLCBBc3NlbWJsZXI6OnB0LCBMKTsKICAgICBfXyBkZWxheWVkKCktPm5vcCgpOwpAQCAtMjgyLDcgKzI4Miw3IEBACiAgIC8vIFVwZGF0ZSBzdGFuZGFyZCBpbnZvY2F0aW9uIGNvdW50ZXJzCiAgIF9fIGluY3JlbWVudF9pbnZvY2F0aW9uX2NvdW50ZXIoTzAsIEczX3NjcmF0Y2gpOwogICBpZiAoUHJvZmlsZUludGVycHJldGVyKSB7ICAvLyAlJSUgTWVyZ2UgdGhpcyBpbnRvIG1ldGhvZERhdGFPb3AKLSAgICBBZGRyZXNzIGludGVycHJldGVyX2ludm9jYXRpb25fY291bnRlcihMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjppbnRlcnByZXRlcl9pbnZvY2F0aW9uX2NvdW50ZXJfb2Zmc2V0KCkpKTsKKyAgICBBZGRyZXNzIGludGVycHJldGVyX2ludm9jYXRpb25fY291bnRlcihMbWV0aG9kLCBtZXRob2RPb3BEZXNjOjppbnRlcnByZXRlcl9pbnZvY2F0aW9uX2NvdW50ZXJfb2Zmc2V0KCkpOwogICAgIF9fIGxkKGludGVycHJldGVyX2ludm9jYXRpb25fY291bnRlciwgRzNfc2NyYXRjaCk7CiAgICAgX18gaW5jKEczX3NjcmF0Y2gpOwogICAgIF9fIHN0KEczX3NjcmF0Y2gsIGludGVycHJldGVyX2ludm9jYXRpb25fY291bnRlcik7CkBAIC0yOTAsOSArMjkwLDkgQEAKIAogICBpZiAoUHJvZmlsZUludGVycHJldGVyICYmIHByb2ZpbGVfbWV0aG9kICE9IE5VTEwpIHsKICAgICAvLyBUZXN0IHRvIHNlZSBpZiB3ZSBzaG91bGQgY3JlYXRlIGEgbWV0aG9kIGRhdGEgb29wCi0gICAgQWRkcmVzcyBwcm9maWxlX2xpbWl0KEczX3NjcmF0Y2gsIChhZGRyZXNzKSZJbnZvY2F0aW9uQ291bnRlcjo6SW50ZXJwcmV0ZXJQcm9maWxlTGltaXQpOwotICAgIF9fIHNldGhpKHByb2ZpbGVfbGltaXQpOwotICAgIF9fIGxkKHByb2ZpbGVfbGltaXQsIEczX3NjcmF0Y2gpOworICAgIEFkZHJlc3NMaXRlcmFsIHByb2ZpbGVfbGltaXQoJkludm9jYXRpb25Db3VudGVyOjpJbnRlcnByZXRlclByb2ZpbGVMaW1pdCk7CisgICAgX18gc2V0aGkocHJvZmlsZV9saW1pdCwgRzNfc2NyYXRjaCk7CisgICAgX18gbGQoRzNfc2NyYXRjaCwgcHJvZmlsZV9saW1pdC5sb3cxMCgpLCBHM19zY3JhdGNoKTsKICAgICBfXyBjbXAoTzAsIEczX3NjcmF0Y2gpOwogICAgIF9fIGJyKEFzc2VtYmxlcjo6bGVzc1Vuc2lnbmVkLCBmYWxzZSwgQXNzZW1ibGVyOjpwbiwgKnByb2ZpbGVfbWV0aG9kX2NvbnRpbnVlKTsKICAgICBfXyBkZWxheWVkKCktPm5vcCgpOwpAQCAtMzAxLDkgKzMwMSw5IEBACiAgICAgX18gdGVzdF9tZXRob2RfZGF0YV9wb2ludGVyKCpwcm9maWxlX21ldGhvZCk7CiAgIH0KIAotICBBZGRyZXNzIGludm9jYXRpb25fbGltaXQoRzNfc2NyYXRjaCwgKGFkZHJlc3MpJkludm9jYXRpb25Db3VudGVyOjpJbnRlcnByZXRlckludm9jYXRpb25MaW1pdCk7Ci0gIF9fIHNldGhpKGludm9jYXRpb25fbGltaXQpOwotICBfXyBsZChpbnZvY2F0aW9uX2xpbWl0LCBHM19zY3JhdGNoKTsKKyAgQWRkcmVzc0xpdGVyYWwgaW52b2NhdGlvbl9saW1pdCgmSW52b2NhdGlvbkNvdW50ZXI6OkludGVycHJldGVySW52b2NhdGlvbkxpbWl0KTsKKyAgX18gc2V0aGkoaW52b2NhdGlvbl9saW1pdCwgRzNfc2NyYXRjaCk7CisgIF9fIGxkKEczX3NjcmF0Y2gsIGludm9jYXRpb25fbGltaXQubG93MTAoKSwgRzNfc2NyYXRjaCk7CiAgIF9fIGNtcChPMCwgRzNfc2NyYXRjaCk7CiAgIF9fIGJyKEFzc2VtYmxlcjo6Z3JlYXRlckVxdWFsVW5zaWduZWQsIGZhbHNlLCBBc3NlbWJsZXI6OnBuLCAqb3ZlcmZsb3cpOwogICBfXyBkZWxheWVkKCktPm5vcCgpOwpAQCAtMzE0LDggKzMxNCw3IEBACiAvLyBlYnggLSBtZXRob2RPb3AKIC8vCiB2b2lkIEludGVycHJldGVyR2VuZXJhdG9yOjpsb2NrX21ldGhvZCh2b2lkKSB7Ci0gIGNvbnN0IEFkZHJlc3MgYWNjZXNzX2ZsYWdzICAgICAgKExtZXRob2QsIDAsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6OmFjY2Vzc19mbGFnc19vZmZzZXQoKSkpOwotICBfXyBsZChhY2Nlc3NfZmxhZ3MsIE8wKTsKKyAgX18gbGQoTG1ldGhvZCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6YWNjZXNzX2ZsYWdzX29mZnNldCgpKSwgTzApOyAgLy8gTG9hZCBhY2Nlc3MgZmxhZ3MuCiAKICNpZmRlZiBBU1NFUlQKICB7IExhYmVsIG9rOwpAQCAtMzU5LDggKzM1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBSc2NyYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFJzY3JhdGNoMikgewogICBjb25zdCBpbnQgcGFnZV9zaXplID0gb3M6OnZtX3BhZ2Vfc2l6ZSgpOwotICBBZGRyZXNzIHNhdmVkX2V4Y2VwdGlvbl9wYyhHMl90aHJlYWQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2J5dGVzKEphdmFUaHJlYWQ6OnNhdmVkX2V4Y2VwdGlvbl9wY19vZmZzZXQoKSkpOworICBBZGRyZXNzIHNhdmVkX2V4Y2VwdGlvbl9wYyhHMl90aHJlYWQsIEphdmFUaHJlYWQ6OnNhdmVkX2V4Y2VwdGlvbl9wY19vZmZzZXQoKSk7CiAgIExhYmVsIGFmdGVyX2ZyYW1lX2NoZWNrOwogCiAgIGFzc2VydF9kaWZmZXJlbnRfcmVnaXN0ZXJzKFJmcmFtZV9zaXplLCBSc2NyYXRjaCwgUnNjcmF0Y2gyKTsKQEAgLTM3Miw3ICszNzAsNyBAQAogICBfXyBkZWxheWVkKCktPm5vcCgpOwogCiAgIC8vIGdldCB0aGUgc3RhY2sgYmFzZSwgYW5kIGluIGRlYnVnLCB2ZXJpZnkgaXQgaXMgbm9uLXplcm8KLSAgX18gbGRfcHRyKCBHMl90aHJlYWQsIGluX2J5dGVzKFRocmVhZDo6c3RhY2tfYmFzZV9vZmZzZXQoKSksIFJzY3JhdGNoICk7CisgIF9fIGxkX3B0ciggRzJfdGhyZWFkLCBUaHJlYWQ6OnN0YWNrX2Jhc2Vfb2Zmc2V0KCksIFJzY3JhdGNoICk7CiAjaWZkZWYgQVNTRVJUCiAgIExhYmVsIGJhc2Vfbm90X3plcm87CiAgIF9fIGNtcCggUnNjcmF0Y2gsIEcwICk7CkBAIC0zODQsNyArMzgyLDcgQEAKIAogICAvLyBnZXQgdGhlIHN0YWNrIHNpemUsIGFuZCBpbiBkZWJ1ZywgdmVyaWZ5IGl0IGlzIG5vbi16ZXJvCiAgIGFzc2VydCggc2l6ZW9mKHNpemVfdCkgPT0gc2l6ZW9mKGludHB0cl90KSwgIndyb25nIGxvYWQgc2l6ZSIgKTsKLSAgX18gbGRfcHRyKCBHMl90aHJlYWQsIGluX2J5dGVzKFRocmVhZDo6c3RhY2tfc2l6ZV9vZmZzZXQoKSksIFJzY3JhdGNoMiApOworICBfXyBsZF9wdHIoIEcyX3RocmVhZCwgVGhyZWFkOjpzdGFja19zaXplX29mZnNldCgpLCBSc2NyYXRjaDIgKTsKICNpZmRlZiBBU1NFUlQKICAgTGFiZWwgc2l6ZV9ub3RfemVybzsKICAgX18gY21wKCBSc2NyYXRjaDIsIEcwICk7CkBAIC00NTksOSArNDU3LDkgQEAKICAgLy8gKGdyaSAtIDIvMjUvMjAwMCkKIAogCi0gIGNvbnN0IEFkZHJlc3Mgc2l6ZV9vZl9wYXJhbWV0ZXJzKEc1X21ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6c2l6ZV9vZl9wYXJhbWV0ZXJzX29mZnNldCgpKSk7Ci0gIGNvbnN0IEFkZHJlc3Mgc2l6ZV9vZl9sb2NhbHMgICAgKEc1X21ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6c2l6ZV9vZl9sb2NhbHNfb2Zmc2V0KCkpKTsKLSAgY29uc3QgQWRkcmVzcyBtYXhfc3RhY2sgICAgICAgICAoRzVfbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjptYXhfc3RhY2tfb2Zmc2V0KCkpKTsKKyAgY29uc3QgQWRkcmVzcyBzaXplX29mX3BhcmFtZXRlcnMoRzVfbWV0aG9kLCBtZXRob2RPb3BEZXNjOjpzaXplX29mX3BhcmFtZXRlcnNfb2Zmc2V0KCkpOworICBjb25zdCBBZGRyZXNzIHNpemVfb2ZfbG9jYWxzICAgIChHNV9tZXRob2QsIG1ldGhvZE9vcERlc2M6OnNpemVfb2ZfbG9jYWxzX29mZnNldCgpKTsKKyAgY29uc3QgQWRkcmVzcyBtYXhfc3RhY2sgICAgICAgICAoRzVfbWV0aG9kLCBtZXRob2RPb3BEZXNjOjptYXhfc3RhY2tfb2Zmc2V0KCkpOwogICBpbnQgcm91bmRlZF92bV9sb2NhbF93b3JkcyA9IHJvdW5kX3RvKCBmcmFtZTo6aW50ZXJwcmV0ZXJfZnJhbWVfdm1fbG9jYWxfd29yZHMsIFdvcmRzUGVyTG9uZyApOwogCiAgIGNvbnN0IGludCBleHRyYV9zcGFjZSA9CkBAIC01MzgsOCArNTM2LDggQEAKICAgaWYgKG5hdGl2ZV9jYWxsKSB7CiAgICAgX18gbW92KEcwLCBMYmNwKTsKICAgfSBlbHNlIHsKLSAgICBfXyBsZF9wdHIoQWRkcmVzcyhHNV9tZXRob2QsIDAsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6OmNvbnN0X29mZnNldCgpKSksIExiY3AgKTsKLSAgICBfXyBhZGQoQWRkcmVzcyhMYmNwLCAwLCBpbl9ieXRlcyhjb25zdE1ldGhvZE9vcERlc2M6OmNvZGVzX29mZnNldCgpKSksIExiY3AgKTsKKyAgICBfXyBsZF9wdHIoRzVfbWV0aG9kLCBtZXRob2RPb3BEZXNjOjpjb25zdF9vZmZzZXQoKSwgTGJjcCk7CisgICAgX18gYWRkKExiY3AsIGluX2J5dGVzKGNvbnN0TWV0aG9kT29wRGVzYzo6Y29kZXNfb2Zmc2V0KCkpLCBMYmNwKTsKICAgfQogICBfXyBtb3YoIEc1X21ldGhvZCwgTG1ldGhvZCk7ICAgICAgICAgICAgICAgICAvLyBzZXQgTG1ldGhvZAogICBfXyBnZXRfY29uc3RhbnRfcG9vbF9jYWNoZSggTGNwb29sQ2FjaGUgKTsgICAvLyBzZXQgTGNwb29sQ2FjaGUKQEAgLTU3Nyw4ICs1NzUsOCBAQAogICAvLyBkbyBub3RoaW5nIGZvciBlbXB0eSBtZXRob2RzIChkbyBub3QgZXZlbiBpbmNyZW1lbnQgaW52b2NhdGlvbiBjb3VudGVyKQogICBpZiAoIFVzZUZhc3RFbXB0eU1ldGhvZHMpIHsKICAgICAvLyBJZiB3ZSBuZWVkIGEgc2FmZXBvaW50IGNoZWNrLCBnZW5lcmF0ZSBmdWxsIGludGVycHJldGVyIGVudHJ5LgotICAgIEFkZHJlc3Mgc3luY19zdGF0ZShHM19zY3JhdGNoLCBTYWZlcG9pbnRTeW5jaHJvbml6ZTo6YWRkcmVzc19vZl9zdGF0ZSgpKTsKLSAgICBfXyBsb2FkX2NvbnRlbnRzKHN5bmNfc3RhdGUsIEczX3NjcmF0Y2gpOworICAgIEFkZHJlc3NMaXRlcmFsIHN5bmNfc3RhdGUoU2FmZXBvaW50U3luY2hyb25pemU6OmFkZHJlc3Nfb2Zfc3RhdGUoKSk7CisgICAgX18gc2V0KHN5bmNfc3RhdGUsIEczX3NjcmF0Y2gpOwogICAgIF9fIGNtcChHM19zY3JhdGNoLCBTYWZlcG9pbnRTeW5jaHJvbml6ZTo6X25vdF9zeW5jaHJvbml6ZWQpOwogICAgIF9fIGJyKEFzc2VtYmxlcjo6bm90RXF1YWwsIGZhbHNlLCBBc3NlbWJsZXI6OnBuLCBzbG93X3BhdGgpOwogICAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CkBAIC02MTYsNyArNjE0LDcgQEAKICAgaWYgKCBVc2VGYXN0QWNjZXNzb3JNZXRob2RzICYmICFVc2VDb21wcmVzc2VkT29wcyApIHsKICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlYWNoIGEgc2FmZXBvaW50IGFuZCBnZW5lcmF0ZSBmdWxsIGludGVycHJldGVyCiAgICAgLy8gZnJhbWUgaWYgc28uCi0gICAgQWRkcmVzcyBzeW5jX3N0YXRlKEczX3NjcmF0Y2gsIFNhZmVwb2ludFN5bmNocm9uaXplOjphZGRyZXNzX29mX3N0YXRlKCkpOworICAgIEFkZHJlc3NMaXRlcmFsIHN5bmNfc3RhdGUoU2FmZXBvaW50U3luY2hyb25pemU6OmFkZHJlc3Nfb2Zfc3RhdGUoKSk7CiAgICAgX18gbG9hZF9jb250ZW50cyhzeW5jX3N0YXRlLCBHM19zY3JhdGNoKTsKICAgICBfXyBjbXAoRzNfc2NyYXRjaCwgU2FmZXBvaW50U3luY2hyb25pemU6Ol9ub3Rfc3luY2hyb25pemVkKTsKICAgICBfXyBicihBc3NlbWJsZXI6Om5vdEVxdWFsLCBmYWxzZSwgQXNzZW1ibGVyOjpwbiwgc2xvd19wYXRoKTsKQEAgLTYzMSw4ICs2MjksOCBAQAogCiAgICAgLy8gcmVhZCBmaXJzdCBpbnN0cnVjdGlvbiB3b3JkIGFuZCBleHRyYWN0IGJ5dGVjb2RlIEAgMSBhbmQgaW5kZXggQCAyCiAgICAgLy8gZ2V0IGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGJ5dGVjb2RlcyAoYmlnIGVuZGlhbiEpCi0gICAgX18gbGRfcHRyKEFkZHJlc3MoRzVfbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpjb25zdF9vZmZzZXQoKSkpLCBHMV9zY3JhdGNoKTsKLSAgICBfXyBsZChBZGRyZXNzKEcxX3NjcmF0Y2gsIDAsIGluX2J5dGVzKGNvbnN0TWV0aG9kT29wRGVzYzo6Y29kZXNfb2Zmc2V0KCkpKSwgRzFfc2NyYXRjaCk7CisgICAgX18gbGRfcHRyKEc1X21ldGhvZCwgbWV0aG9kT29wRGVzYzo6Y29uc3Rfb2Zmc2V0KCksIEcxX3NjcmF0Y2gpOworICAgIF9fIGxkKEcxX3NjcmF0Y2gsIGNvbnN0TWV0aG9kT29wRGVzYzo6Y29kZXNfb2Zmc2V0KCksIEcxX3NjcmF0Y2gpOwogCiAgICAgLy8gbW92ZSBpbmRleCBAIDIgZmFyIGxlZnQgdGhlbiB0byB0aGUgcmlnaHQgbW9zdCB0d28gYnl0ZXMuCiAgICAgX18gc2xsKEcxX3NjcmF0Y2gsIDIqQml0c1BlckJ5dGUsIEcxX3NjcmF0Y2gpOwpAQCAtNjQwLDcgKzYzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6c2l6ZSgpKSAqIEJ5dGVzUGVyV29yZCksIEcxX3NjcmF0Y2gpOwogCiAgICAgLy8gZ2V0IGNvbnN0YW50IHBvb2wgY2FjaGUKLSAgICBfXyBsZF9wdHIoRzVfbWV0aG9kLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpjb25zdGFudHNfb2Zmc2V0KCkpLCBHM19zY3JhdGNoKTsKKyAgICBfXyBsZF9wdHIoRzVfbWV0aG9kLCBtZXRob2RPb3BEZXNjOjpjb25zdGFudHNfb2Zmc2V0KCksIEczX3NjcmF0Y2gpOwogICAgIF9fIGxkX3B0cihHM19zY3JhdGNoLCBjb25zdGFudFBvb2xPb3BEZXNjOjpjYWNoZV9vZmZzZXRfaW5fYnl0ZXMoKSwgRzNfc2NyYXRjaCk7CiAKICAgICAvLyBnZXQgc3BlY2lmaWMgY29uc3RhbnQgcG9vbCBjYWNoZSBlbnRyeQpAQCAtNjQ5LDcgKzY0Nyw3IEBACiAgICAgLy8gQ2hlY2sgdGhlIGNvbnN0YW50IFBvb2wgY2FjaGUgZW50cnkgdG8gc2VlIGlmIGl0IGhhcyBiZWVuIHJlc29sdmVkLgogICAgIC8vIElmIG5vdCwgbmVlZCB0aGUgc2xvdyBwYXRoLgogICAgIEJ5dGVTaXplIGNwX2Jhc2Vfb2Zmc2V0ID0gY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjpiYXNlX29mZnNldCgpOwotICAgIF9fIGxkX3B0cihHM19zY3JhdGNoLCBpbl9ieXRlcyhjcF9iYXNlX29mZnNldCArIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmluZGljZXNfb2Zmc2V0KCkpLCBHMV9zY3JhdGNoKTsKKyAgICBfXyBsZF9wdHIoRzNfc2NyYXRjaCwgY3BfYmFzZV9vZmZzZXQgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjppbmRpY2VzX29mZnNldCgpLCBHMV9zY3JhdGNoKTsKICAgICBfXyBzcmwoRzFfc2NyYXRjaCwgMipCaXRzUGVyQnl0ZSwgRzFfc2NyYXRjaCk7CiAgICAgX18gYW5kMyhHMV9zY3JhdGNoLCAweEZGLCBHMV9zY3JhdGNoKTsKICAgICBfXyBjbXAoRzFfc2NyYXRjaCwgQnl0ZWNvZGVzOjpfZ2V0ZmllbGQpOwpAQCAtNjU3LDggKzY1NSw4IEBACiAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKIAogICAgIC8vIEdldCB0aGUgdHlwZSBhbmQgcmV0dXJuIGZpZWxkIG9mZnNldCBmcm9tIHRoZSBjb25zdGFudCBwb29sIGNhY2hlCi0gICAgX18gbGRfcHRyKEczX3NjcmF0Y2gsIGluX2J5dGVzKGNwX2Jhc2Vfb2Zmc2V0ICsgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZmxhZ3Nfb2Zmc2V0KCkpLCBHMV9zY3JhdGNoKTsKLSAgICBfXyBsZF9wdHIoRzNfc2NyYXRjaCwgaW5fYnl0ZXMoY3BfYmFzZV9vZmZzZXQgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmMl9vZmZzZXQoKSksIEczX3NjcmF0Y2gpOworICAgIF9fIGxkX3B0cihHM19zY3JhdGNoLCBjcF9iYXNlX29mZnNldCArIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmZsYWdzX29mZnNldCgpLCBHMV9zY3JhdGNoKTsKKyAgICBfXyBsZF9wdHIoRzNfc2NyYXRjaCwgY3BfYmFzZV9vZmZzZXQgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmMl9vZmZzZXQoKSwgRzNfc2NyYXRjaCk7CiAKICAgICBMYWJlbCB4cmV0dXJuX3BhdGg7CiAgICAgLy8gTmVlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gaWdldGZpZWxkLCBhZ2V0ZmllbGQsIGJnZXRmaWVsZCBldGMuCkBAIC03MTcsNyArNzE1LDcgQEAKICAgLy8gbWFrZSBzdXJlIHJlZ2lzdGVycyBhcmUgZGlmZmVyZW50IQogICBhc3NlcnRfZGlmZmVyZW50X3JlZ2lzdGVycyhHMl90aHJlYWQsIEc1X21ldGhvZCwgR2FyZ3MsIEd0bXAxLCBHdG1wMik7CiAKLSAgY29uc3QgQWRkcmVzcyBMYWNjZXNzX2ZsYWdzICAgICAoTG1ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6YWNjZXNzX2ZsYWdzX29mZnNldCgpKSk7CisgIGNvbnN0IEFkZHJlc3MgTGFjY2Vzc19mbGFncyhMbWV0aG9kLCBtZXRob2RPb3BEZXNjOjphY2Nlc3NfZmxhZ3Nfb2Zmc2V0KCkpOwogCiAgIF9fIHZlcmlmeV9vb3AoRzVfbWV0aG9kKTsKIApAQCAtNzI3LDcgKzcyNSw3IEBACiAgIC8vIG1ha2Ugc3VyZSBtZXRob2QgaXMgbmF0aXZlICYgbm90IGFic3RyYWN0CiAgIC8vIHJldGhpbmsgdGhlc2UgYXNzZXJ0aW9ucyAtIHRoZXkgY2FuIGJlIHNpbXBsaWZpZWQgYW5kIHNoYXJlZCAoZ3JpIDIvMjUvMjAwMCkKICNpZmRlZiBBU1NFUlQKLSAgX18gbGQoRzVfbWV0aG9kLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjphY2Nlc3NfZmxhZ3Nfb2Zmc2V0KCkpLCBHdG1wMSk7CisgIF9fIGxkKEc1X21ldGhvZCwgbWV0aG9kT29wRGVzYzo6YWNjZXNzX2ZsYWdzX29mZnNldCgpLCBHdG1wMSk7CiAgIHsKICAgICBMYWJlbCBMOwogICAgIF9fIGJ0c3QoSlZNX0FDQ19OQVRJVkUsIEd0bXAxKTsKQEAgLTc1NCwxMCArNzUyLDEwIEBACiAKICAgLy8gdGhpcyBzbG90IHdpbGwgYmUgc2V0IGxhdGVyLCB3ZSBpbml0aWFsaXplIGl0IHRvIG51bGwgaGVyZSBqdXN0IGluCiAgIC8vIGNhc2Ugd2UgZ2V0IGEgR0MgYmVmb3JlIHRoZSBhY3R1YWwgdmFsdWUgaXMgc3RvcmVkIGxhdGVyCi0gIF9fIHN0X3B0cihHMCwgQWRkcmVzcyhGUCwgMCwgKGZyYW1lOjppbnRlcnByZXRlcl9mcmFtZV9vb3BfdGVtcF9vZmZzZXQqd29yZFNpemUpICsgU1RBQ0tfQklBUykpOworICBfXyBzdF9wdHIoRzAsIEZQLCAoZnJhbWU6OmludGVycHJldGVyX2ZyYW1lX29vcF90ZW1wX29mZnNldCAqIHdvcmRTaXplKSArIFNUQUNLX0JJQVMpOwogCi0gIGNvbnN0IEFkZHJlc3MgZG9fbm90X3VubG9ja19pZl9zeW5jaHJvbml6ZWQoRzJfdGhyZWFkLCAwLAotICAgICAgaW5fYnl0ZXMoSmF2YVRocmVhZDo6ZG9fbm90X3VubG9ja19pZl9zeW5jaHJvbml6ZWRfb2Zmc2V0KCkpKTsKKyAgY29uc3QgQWRkcmVzcyBkb19ub3RfdW5sb2NrX2lmX3N5bmNocm9uaXplZChHMl90aHJlYWQsCisgICAgSmF2YVRocmVhZDo6ZG9fbm90X3VubG9ja19pZl9zeW5jaHJvbml6ZWRfb2Zmc2V0KCkpOwogICAvLyBTaW5jZSBhdCB0aGlzIHBvaW50IGluIHRoZSBtZXRob2QgaW52b2NhdGlvbiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIKICAgLy8gd291bGQgdHJ5IHRvIGV4aXQgdGhlIG1vbml0b3Igb2Ygc3luY2hyb25pemVkIG1ldGhvZHMgd2hpY2ggaGFzbid0CiAgIC8vIGJlZW4gZW50ZXJlZCB5ZXQsIHdlIHNldCB0aGUgdGhyZWFkIGxvY2FsIHZhcmlhYmxlCkBAIC04MjQsMTIgKzgyMiwxMyBAQAogCiAgIC8vIGdldCBzaWduYXR1cmUgaGFuZGxlcgogICB7IExhYmVsIEw7Ci0gICAgX18gbGRfcHRyKEFkZHJlc3MoTG1ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6c2lnbmF0dXJlX2hhbmRsZXJfb2Zmc2V0KCkpKSwgRzNfc2NyYXRjaCk7CisgICAgQWRkcmVzcyBzaWduYXR1cmVfaGFuZGxlcihMbWV0aG9kLCBtZXRob2RPb3BEZXNjOjpzaWduYXR1cmVfaGFuZGxlcl9vZmZzZXQoKSk7CisgICAgX18gbGRfcHRyKHNpZ25hdHVyZV9oYW5kbGVyLCBHM19zY3JhdGNoKTsKICAgICBfXyB0c3QoRzNfc2NyYXRjaCk7CiAgICAgX18gYnJ4KEFzc2VtYmxlcjo6bm90WmVybywgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIEwpOwogICAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CiAgICAgX18gY2FsbF9WTShub3JlZywgQ0FTVF9GUk9NX0ZOX1BUUihhZGRyZXNzLCBJbnRlcnByZXRlclJ1bnRpbWU6OnByZXBhcmVfbmF0aXZlX2NhbGwpLCBMbWV0aG9kKTsKLSAgICBfXyBsZF9wdHIoQWRkcmVzcyhMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpzaWduYXR1cmVfaGFuZGxlcl9vZmZzZXQoKSkpLCBHM19zY3JhdGNoKTsKKyAgICBfXyBsZF9wdHIoc2lnbmF0dXJlX2hhbmRsZXIsIEczX3NjcmF0Y2gpOwogICAgIF9fIGJpbmQoTCk7CiAgIH0KIApAQCAtODQyLDEwICs4NDEsOSBAQAogICAvLyBGbHVzaCB0aGUgbWV0aG9kIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIHNhdmUgYXJlYQogICBfXyBzdF9wdHIoTG1ldGhvZCwgU1AsIChMbWV0aG9kLT5zcF9vZmZzZXRfaW5fc2F2ZWRfd2luZG93KCkgKiB3b3JkU2l6ZSkgKyBTVEFDS19CSUFTKTsKICAgX18gbW92KExsb2NhbHMsIE8xKTsKLSAgLy8gY2FsY3VsYXRlIHdoZXJlIHRoZSBtaXJyb3IgaGFuZGxlIGJvZHkgaXMgYWxsb2NhdGVkIGluIHRoZSBpbnRlcnByZXRlciBmcmFtZToKIAotICBBZGRyZXNzIG1pcnJvcihGUCwgMCwgKGZyYW1lOjppbnRlcnByZXRlcl9mcmFtZV9vb3BfdGVtcF9vZmZzZXQqd29yZFNpemUpICsgU1RBQ0tfQklBUyk7Ci0gIF9fIGFkZChtaXJyb3IsIE8yKTsKKyAgLy8gY2FsY3VsYXRlIHdoZXJlIHRoZSBtaXJyb3IgaGFuZGxlIGJvZHkgaXMgYWxsb2NhdGVkIGluIHRoZSBpbnRlcnByZXRlciBmcmFtZToKKyAgX18gYWRkKEZQLCAoZnJhbWU6OmludGVycHJldGVyX2ZyYW1lX29vcF90ZW1wX29mZnNldCAqIHdvcmRTaXplKSArIFNUQUNLX0JJQVMsIE8yKTsKIAogICAvLyBDYWxjdWxhdGUgY3VycmVudCBmcmFtZSBzaXplCiAgIF9fIHN1YihTUCwgRlAsIE8zKTsgICAgICAgICAvLyBDYWxjdWxhdGUgbmVnYXRpdmUgb2YgY3VycmVudCBmcmFtZSBzaXplCkBAIC04ODIsMTQgKzg4MCwxMyBAQAogICAgIF9fIGxkKExhY2Nlc3NfZmxhZ3MsIE8wKTsKICAgICBfXyBidHN0KEpWTV9BQ0NfU1RBVElDLCBPMCk7CiAgICAgX18gYnIoIEFzc2VtYmxlcjo6emVybywgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIG5vdF9zdGF0aWMpOwotICAgIF9fIGRlbGF5ZWQoKS0+Ci0gICAgICAvLyBnZXQgbmF0aXZlIGZ1bmN0aW9uIGVudHJ5IHBvaW50KE8wIGlzIGEgZ29vZCB0ZW1wIHVudGlsIHRoZSB2ZXJ5IGVuZCkKLSAgICAgICBsZF9wdHIoQWRkcmVzcyhMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpuYXRpdmVfZnVuY3Rpb25fb2Zmc2V0KCkpKSwgTzApOworICAgIC8vIGdldCBuYXRpdmUgZnVuY3Rpb24gZW50cnkgcG9pbnQoTzAgaXMgYSBnb29kIHRlbXAgdW50aWwgdGhlIHZlcnkgZW5kKQorICAgIF9fIGRlbGF5ZWQoKS0+bGRfcHRyKExtZXRob2QsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6Om5hdGl2ZV9mdW5jdGlvbl9vZmZzZXQoKSksIE8wKTsKICAgICAvLyBmb3Igc3RhdGljIG1ldGhvZHMgaW5zZXJ0IHRoZSBtaXJyb3IgYXJndW1lbnQKICAgICBjb25zdCBpbnQgbWlycm9yX29mZnNldCA9IGtsYXNzT29wRGVzYzo6a2xhc3NfcGFydF9vZmZzZXRfaW5fYnl0ZXMoKSArIEtsYXNzOjpqYXZhX21pcnJvcl9vZmZzZXRfaW5fYnl0ZXMoKTsKIAotICAgIF9fIGxkX3B0cihBZGRyZXNzKExtZXRob2QsIDAsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6OiBjb25zdGFudHNfb2Zmc2V0KCkpKSwgTzEpOwotICAgIF9fIGxkX3B0cihBZGRyZXNzKE8xLCAwLCBjb25zdGFudFBvb2xPb3BEZXNjOjpwb29sX2hvbGRlcl9vZmZzZXRfaW5fYnl0ZXMoKSksIE8xKTsKKyAgICBfXyBsZF9wdHIoTG1ldGhvZCwgbWV0aG9kT29wRGVzYzo6IGNvbnN0YW50c19vZmZzZXQoKSwgTzEpOworICAgIF9fIGxkX3B0cihPMSwgY29uc3RhbnRQb29sT29wRGVzYzo6cG9vbF9ob2xkZXJfb2Zmc2V0X2luX2J5dGVzKCksIE8xKTsKICAgICBfXyBsZF9wdHIoTzEsIG1pcnJvcl9vZmZzZXQsIE8xKTsKICNpZmRlZiBBU1NFUlQKICAgICBpZiAoIVByaW50U2lnbmF0dXJlSGFuZGxlcnMpICAvLyBkbyBub3QgZGlydHkgdGhlIG91dHB1dCB3aXRoIHRoaXMKQEAgLTk0NCwxNSArOTQxLDEzIEBACiAgIF9fIGZsdXNoX3dpbmRvd3MoKTsKIAogICAvLyBtYXJrIHdpbmRvd3MgYXMgZmx1c2hlZAotICBBZGRyZXNzIGZsYWdzKEcyX3RocmVhZCwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgIGluX2J5dGVzKEphdmFUaHJlYWQ6OmZyYW1lX2FuY2hvcl9vZmZzZXQoKSkgKyBpbl9ieXRlcyhKYXZhRnJhbWVBbmNob3I6OmZsYWdzX29mZnNldCgpKSk7CisgIEFkZHJlc3MgZmxhZ3MoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpmcmFtZV9hbmNob3Jfb2Zmc2V0KCkgKyBKYXZhRnJhbWVBbmNob3I6OmZsYWdzX29mZnNldCgpKTsKICAgX18gc2V0KEphdmFGcmFtZUFuY2hvcjo6Zmx1c2hlZCwgRzNfc2NyYXRjaCk7CiAgIF9fIHN0KEczX3NjcmF0Y2gsIGZsYWdzKTsKIAogICAvLyBUcmFuc2l0aW9uIGZyb20gX3RocmVhZF9pbl9KYXZhIHRvIF90aHJlYWRfaW5fbmF0aXZlLiBXZSBhcmUgYWxyZWFkeSBzYWZlcG9pbnQgcmVhZHkuCiAKLSAgQWRkcmVzcyB0aHJlYWRfc3RhdGUoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjp0aHJlYWRfc3RhdGVfb2Zmc2V0KCkpKTsKKyAgQWRkcmVzcyB0aHJlYWRfc3RhdGUoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjp0aHJlYWRfc3RhdGVfb2Zmc2V0KCkpOwogI2lmZGVmIEFTU0VSVAogICB7IExhYmVsIEw7CiAgICAgX18gbGQodGhyZWFkX3N0YXRlLCBHM19zY3JhdGNoKTsKQEAgLTk4Miw3ICs5NzcsNyBAQAogICAvLyBCbG9jaywgaWYgbmVjZXNzYXJ5LCBiZWZvcmUgcmVzdW1pbmcgaW4gX3RocmVhZF9pbl9KYXZhIHN0YXRlLgogICAvLyBJbiBvcmRlciBmb3IgR0MgdG8gd29yaywgZG9uJ3QgY2xlYXIgdGhlIGxhc3RfSmF2YV9zcCB1bnRpbCBhZnRlciBibG9ja2luZy4KICAgeyBMYWJlbCBub19ibG9jazsKLSAgICBBZGRyZXNzIHN5bmNfc3RhdGUoRzNfc2NyYXRjaCwgU2FmZXBvaW50U3luY2hyb25pemU6OmFkZHJlc3Nfb2Zfc3RhdGUoKSk7CisgICAgQWRkcmVzc0xpdGVyYWwgc3luY19zdGF0ZShTYWZlcG9pbnRTeW5jaHJvbml6ZTo6YWRkcmVzc19vZl9zdGF0ZSgpKTsKIAogICAgIC8vIFN3aXRjaCB0aHJlYWQgdG8gIm5hdGl2ZSB0cmFuc2l0aW9uIiBzdGF0ZSBiZWZvcmUgcmVhZGluZyB0aGUgc3luY2hyb25pemF0aW9uIHN0YXRlLgogICAgIC8vIFRoaXMgYWRkaXRpb25hbCBzdGF0ZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSByZWFkaW5nIGFuZCB0ZXN0aW5nIHRoZSBzeW5jaHJvbml6YXRpb24KQEAgLTEwMDksMTAgKzEwMDQsOCBAQAogICAgIF9fIGNtcChHM19zY3JhdGNoLCBTYWZlcG9pbnRTeW5jaHJvbml6ZTo6X25vdF9zeW5jaHJvbml6ZWQpOwogCiAgICAgTGFiZWwgTDsKLSAgICBBZGRyZXNzIHN1c3BlbmRfc3RhdGUoRzJfdGhyZWFkLCAwLCBpbl9ieXRlcyhKYXZhVGhyZWFkOjpzdXNwZW5kX2ZsYWdzX29mZnNldCgpKSk7CiAgICAgX18gYnIoQXNzZW1ibGVyOjpub3RFcXVhbCwgZmFsc2UsIEFzc2VtYmxlcjo6cG4sIEwpOwotICAgIF9fIGRlbGF5ZWQoKS0+Ci0gICAgICBsZChzdXNwZW5kX3N0YXRlLCBHM19zY3JhdGNoKTsKKyAgICBfXyBkZWxheWVkKCktPmxkKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6c3VzcGVuZF9mbGFnc19vZmZzZXQoKSwgRzNfc2NyYXRjaCk7CiAgICAgX18gY21wKEczX3NjcmF0Y2gsIDApOwogICAgIF9fIGJyKEFzc2VtYmxlcjo6ZXF1YWwsIGZhbHNlLCBBc3NlbWJsZXI6OnB0LCBub19ibG9jayk7CiAgICAgX18gZGVsYXllZCgpLT5ub3AoKTsKQEAgLTEwNTQsNyArMTA0Nyw3IEBACiAgIF9fIHN0KEczX3NjcmF0Y2gsIHRocmVhZF9zdGF0ZSk7CiAKICAgLy8gcmVzZXQgaGFuZGxlIGJsb2NrCi0gIF9fIGxkX3B0cihHMl90aHJlYWQsIGluX2J5dGVzKEphdmFUaHJlYWQ6OmFjdGl2ZV9oYW5kbGVzX29mZnNldCgpKSwgRzNfc2NyYXRjaCk7CisgIF9fIGxkX3B0cihHMl90aHJlYWQsIEphdmFUaHJlYWQ6OmFjdGl2ZV9oYW5kbGVzX29mZnNldCgpLCBHM19zY3JhdGNoKTsKICAgX18gc3RfcHRyKEcwLCBHM19zY3JhdGNoLCBKTklIYW5kbGVCbG9jazo6dG9wX29mZnNldF9pbl9ieXRlcygpKTsKIAogICAvLyBJZiB3ZSBoYXZlIGFuIG9vcCByZXN1bHQgc3RvcmUgaXQgd2hlcmUgaXQgd2lsbCBiZSBzYWZlIGZvciBhbnkgZnVydGhlciBnYwpAQCAtMTA4Myw4ICsxMDc2LDcgQEAKIAogICAvLyBoYW5kbGUgZXhjZXB0aW9ucyAoZXhjZXB0aW9uIGhhbmRsaW5nIHdpbGwgaGFuZGxlIHVubG9ja2luZyEpCiAgIHsgTGFiZWwgTDsKLSAgICBBZGRyZXNzIGV4Y2VwdGlvbl9hZGRyIChHMl90aHJlYWQsIDAsIGluX2J5dGVzKFRocmVhZDo6cGVuZGluZ19leGNlcHRpb25fb2Zmc2V0KCkpKTsKLQorICAgIEFkZHJlc3MgZXhjZXB0aW9uX2FkZHIoRzJfdGhyZWFkLCBUaHJlYWQ6OnBlbmRpbmdfZXhjZXB0aW9uX29mZnNldCgpKTsKICAgICBfXyBsZF9wdHIoZXhjZXB0aW9uX2FkZHIsIEd0ZW1wKTsKICAgICBfXyB0c3QoR3RlbXApOwogICAgIF9fIGJyeChBc3NlbWJsZXI6OmVxdWFsLCBmYWxzZSwgQXNzZW1ibGVyOjpwdCwgTCk7CkBAIC0xMTcwLDExICsxMTYyLDExIEBACiAgIC8vIG1ha2Ugc3VyZSByZWdpc3RlcnMgYXJlIGRpZmZlcmVudCEKICAgYXNzZXJ0X2RpZmZlcmVudF9yZWdpc3RlcnMoRzJfdGhyZWFkLCBHNV9tZXRob2QsIEdhcmdzLCBHdG1wMSwgR3RtcDIpOwogCi0gIGNvbnN0IEFkZHJlc3Mgc2l6ZV9vZl9wYXJhbWV0ZXJzKEc1X21ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6c2l6ZV9vZl9wYXJhbWV0ZXJzX29mZnNldCgpKSk7Ci0gIGNvbnN0IEFkZHJlc3Mgc2l6ZV9vZl9sb2NhbHMgICAgKEc1X21ldGhvZCwgMCwgaW5fYnl0ZXMobWV0aG9kT29wRGVzYzo6c2l6ZV9vZl9sb2NhbHNfb2Zmc2V0KCkpKTsKKyAgY29uc3QgQWRkcmVzcyBzaXplX29mX3BhcmFtZXRlcnMoRzVfbWV0aG9kLCBtZXRob2RPb3BEZXNjOjpzaXplX29mX3BhcmFtZXRlcnNfb2Zmc2V0KCkpOworICBjb25zdCBBZGRyZXNzIHNpemVfb2ZfbG9jYWxzICAgIChHNV9tZXRob2QsIG1ldGhvZE9vcERlc2M6OnNpemVfb2ZfbG9jYWxzX29mZnNldCgpKTsKICAgLy8gU2VlbXMgbGlrZSBHNV9tZXRob2QgaXMgbGl2ZSBhdCB0aGUgcG9pbnQgdGhpcyBpcyB1c2VkLiBTbyB3ZSBjb3VsZCBtYWtlIHRoaXMgbG9vayBjb25zaXN0ZW50CiAgIC8vIGFuZCB1c2UgaW4gdGhlIGFzc2VydHMuCi0gIGNvbnN0IEFkZHJlc3MgYWNjZXNzX2ZsYWdzICAgICAgKExtZXRob2QsIDAsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6OmFjY2Vzc19mbGFnc19vZmZzZXQoKSkpOworICBjb25zdCBBZGRyZXNzIGFjY2Vzc19mbGFncyAgICAgIChMbWV0aG9kLCAgIG1ldGhvZE9vcERlc2M6OmFjY2Vzc19mbGFnc19vZmZzZXQoKSk7CiAKICAgX18gdmVyaWZ5X29vcChHNV9tZXRob2QpOwogCkBAIC0xMTg0LDcgKzExNzYsNyBAQAogICAvLyBtYWtlIHN1cmUgbWV0aG9kIGlzIG5vdCBuYXRpdmUgJiBub3QgYWJzdHJhY3QKICAgLy8gcmV0aGluayB0aGVzZSBhc3NlcnRpb25zIC0gdGhleSBjYW4gYmUgc2ltcGxpZmllZCBhbmQgc2hhcmVkIChncmkgMi8yNS8yMDAwKQogI2lmZGVmIEFTU0VSVAotICBfXyBsZChHNV9tZXRob2QsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6OmFjY2Vzc19mbGFnc19vZmZzZXQoKSksIEd0bXAxKTsKKyAgX18gbGQoRzVfbWV0aG9kLCBtZXRob2RPb3BEZXNjOjphY2Nlc3NfZmxhZ3Nfb2Zmc2V0KCksIEd0bXAxKTsKICAgewogICAgIExhYmVsIEw7CiAgICAgX18gYnRzdChKVk1fQUNDX05BVElWRSwgR3RtcDEpOwpAQCAtMTIzOSw4ICsxMjMxLDggQEAKICAgX18gYnJ4KCBBc3NlbWJsZXI6Omxlc3NFcXVhbFVuc2lnbmVkLCB0cnVlLCBBc3NlbWJsZXI6OnB0LCBjbGVhcl9sb29wICk7CiAgIF9fIGRlbGF5ZWQoKS0+c3RfcHRyKCBpbml0X3ZhbHVlLCBPMiwgMCApOwogCi0gIGNvbnN0IEFkZHJlc3MgZG9fbm90X3VubG9ja19pZl9zeW5jaHJvbml6ZWQoRzJfdGhyZWFkLCAwLAotICAgICAgICBpbl9ieXRlcyhKYXZhVGhyZWFkOjpkb19ub3RfdW5sb2NrX2lmX3N5bmNocm9uaXplZF9vZmZzZXQoKSkpOworICBjb25zdCBBZGRyZXNzIGRvX25vdF91bmxvY2tfaWZfc3luY2hyb25pemVkKEcyX3RocmVhZCwKKyAgICBKYXZhVGhyZWFkOjpkb19ub3RfdW5sb2NrX2lmX3N5bmNocm9uaXplZF9vZmZzZXQoKSk7CiAgIC8vIFNpbmNlIGF0IHRoaXMgcG9pbnQgaW4gdGhlIG1ldGhvZCBpbnZvY2F0aW9uIHRoZSBleGNlcHRpb24gaGFuZGxlcgogICAvLyB3b3VsZCB0cnkgdG8gZXhpdCB0aGUgbW9uaXRvciBvZiBzeW5jaHJvbml6ZWQgbWV0aG9kcyB3aGljaCBoYXNuJ3QKICAgLy8gYmVlbiBlbnRlcmVkIHlldCwgd2Ugc2V0IHRoZSB0aHJlYWQgbG9jYWwgdmFyaWFibGUKQEAgLTE3MTYsNyArMTcwOCw3IEBACiAgIC8vCiAKICAgSW50ZXJwcmV0ZXI6Ol9yZW1vdmVfYWN0aXZhdGlvbl9wcmVzZXJ2aW5nX2FyZ3NfZW50cnkgPSBfXyBwYygpOwotICBBZGRyZXNzIHBvcGZyYW1lX2NvbmRpdGlvbl9hZGRyIChHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6OnBvcGZyYW1lX2NvbmRpdGlvbl9vZmZzZXQoKSkpOworICBBZGRyZXNzIHBvcGZyYW1lX2NvbmRpdGlvbl9hZGRyKEcyX3RocmVhZCwgSmF2YVRocmVhZDo6cG9wZnJhbWVfY29uZGl0aW9uX29mZnNldCgpKTsKICAgLy8gU2V0IHRoZSBwb3BmcmFtZV9wcm9jZXNzaW5nIGJpdCBpbiBwb3BmcmFtZV9jb25kaXRpb24gaW5kaWNhdGluZyB0aGF0IHdlIGFyZQogICAvLyBjdXJyZW50bHkgaGFuZGxpbmcgcG9wZnJhbWUsIHNvIHRoYXQgY2FsbF9WTXMgdGhhdCBtYXkgaGFwcGVuIGxhdGVyIGRvIG5vdCB0cmlnZ2VyIG5ldwogICAvLyBwb3BmcmFtZSBoYW5kbGluZyBjeWNsZXMuCkBAIC0xNzU4LDcgKzE3NTAsNyBAQAogICAgIF9fIGNhbGxfVk1fbGVhZihMN190aHJlYWRfY2FjaGUsIENBU1RfRlJPTV9GTl9QVFIoYWRkcmVzcywgRGVvcHRpbWl6YXRpb246OnBvcGZyYW1lX3ByZXNlcnZlX2FyZ3MpLCBHMl90aHJlYWQsIEd0bXAxLCBHdG1wMik7CiAgICAgLy8gSW5mb3JtIGRlb3B0aW1pemF0aW9uIHRoYXQgaXQgaXMgcmVzcG9uc2libGUgZm9yIHJlc3RvcmluZyB0aGVzZSBhcmd1bWVudHMKICAgICBfXyBzZXQoSmF2YVRocmVhZDo6cG9wZnJhbWVfZm9yY2VfZGVvcHRfcmVleGVjdXRpb25fYml0LCBHdG1wMSk7Ci0gICAgQWRkcmVzcyBwb3BmcmFtZV9jb25kaXRpb25fYWRkcihHMl90aHJlYWQsIDAsIGluX2J5dGVzKEphdmFUaHJlYWQ6OnBvcGZyYW1lX2NvbmRpdGlvbl9vZmZzZXQoKSkpOworICAgIEFkZHJlc3MgcG9wZnJhbWVfY29uZGl0aW9uX2FkZHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpwb3BmcmFtZV9jb25kaXRpb25fb2Zmc2V0KCkpOwogICAgIF9fIHN0KEd0bXAxLCBwb3BmcmFtZV9jb25kaXRpb25fYWRkcik7CiAKICAgICAvLyBSZXR1cm4gZnJvbSB0aGUgY3VycmVudCBtZXRob2QKQEAgLTE4MDcsNyArMTc5OSw3IEBACiAgIF9fIHZlcmlmeV9vb3AoT2V4Y2VwdGlvbik7CiAKICAgICBjb25zdCBpbnQgcmV0dXJuX3JlZ19hZGp1c3RtZW50ID0gZnJhbWU6OnBjX3JldHVybl9vZmZzZXQ7Ci0gIEFkZHJlc3MgaXNzdWluZ19wY19hZGRyKEk3LCAwLCByZXR1cm5fcmVnX2FkanVzdG1lbnQpOworICBBZGRyZXNzIGlzc3VpbmdfcGNfYWRkcihJNywgcmV0dXJuX3JlZ19hZGp1c3RtZW50KTsKIAogICAvLyBXZSBhcmUgZG9uZSB3aXRoIHRoaXMgYWN0aXZhdGlvbiBmcmFtZTsgZmluZCBvdXQgd2hlcmUgdG8gZ28gbmV4dC4KICAgLy8gVGhlIGNvbnRpbnVhdGlvbiBwb2ludCB3aWxsIGJlIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLCB3aGljaCBleHBlY3RzCkBAIC0xODUzLDggKzE4NDUsOCBAQAogICBfXyBlbXB0eV9leHByZXNzaW9uX3N0YWNrKCk7CiAgIF9fIGxvYWRfZWFybHlyZXRfdmFsdWUoc3RhdGUpOwogCi0gIF9fIGxkX3B0cihBZGRyZXNzKEcyX3RocmVhZCwgMCwgaW5fYnl0ZXMoSmF2YVRocmVhZDo6anZtdGlfdGhyZWFkX3N0YXRlX29mZnNldCgpKSksIEczX3NjcmF0Y2gpOwotICBBZGRyZXNzIGNvbmRfYWRkcihHM19zY3JhdGNoLCAwLCBpbl9ieXRlcyhKdm10aVRocmVhZFN0YXRlOjplYXJseXJldF9zdGF0ZV9vZmZzZXQoKSkpOworICBfXyBsZF9wdHIoRzJfdGhyZWFkLCBKYXZhVGhyZWFkOjpqdm10aV90aHJlYWRfc3RhdGVfb2Zmc2V0KCksIEczX3NjcmF0Y2gpOworICBBZGRyZXNzIGNvbmRfYWRkcihHM19zY3JhdGNoLCBKdm10aVRocmVhZFN0YXRlOjplYXJseXJldF9zdGF0ZV9vZmZzZXQoKSk7CiAKICAgLy8gQ2xlYXIgdGhlIGVhcmx5cmV0IHN0YXRlCiAgIF9fIHN0dyhHMCAvKiBKdm10aVRocmVhZFN0YXRlOjplYXJseXJldF9pbmFjdGl2ZSAqLywgY29uZF9hZGRyKTsKQEAgLTE5MjEsNDMgKzE5MTMsMzMgQEAKIC8vIGhlbHBlcnMgZm9yIGdlbmVyYXRlX2FuZF9kaXNwYXRjaAogCiB2b2lkIFRlbXBsYXRlSW50ZXJwcmV0ZXJHZW5lcmF0b3I6OmNvdW50X2J5dGVjb2RlKCkgewotICBBZGRyZXNzIGMoRzNfc2NyYXRjaCwgKGFkZHJlc3MpJkJ5dGVjb2RlQ291bnRlcjo6X2NvdW50ZXJfdmFsdWUpOwotICBfXyBsb2FkX2NvbnRlbnRzKGMsIEc0X3NjcmF0Y2gpOwotICBfXyBpbmMoRzRfc2NyYXRjaCk7Ci0gIF9fIHN0KEc0X3NjcmF0Y2gsIGMpOworICBfXyBpbmNfY291bnRlcigmQnl0ZWNvZGVDb3VudGVyOjpfY291bnRlcl92YWx1ZSwgRzNfc2NyYXRjaCwgRzRfc2NyYXRjaCk7CiB9CiAKIAogdm9pZCBUZW1wbGF0ZUludGVycHJldGVyR2VuZXJhdG9yOjpoaXN0b2dyYW1fYnl0ZWNvZGUoVGVtcGxhdGUqIHQpIHsKLSAgQWRkcmVzcyBidWNrZXQoIEczX3NjcmF0Y2gsIChhZGRyZXNzKSAmQnl0ZWNvZGVIaXN0b2dyYW06Ol9jb3VudGVyc1t0LT5ieXRlY29kZSgpXSApOwotICBfXyBsb2FkX2NvbnRlbnRzKGJ1Y2tldCwgRzRfc2NyYXRjaCk7Ci0gIF9fIGluYyhHNF9zY3JhdGNoKTsKLSAgX18gc3QoRzRfc2NyYXRjaCwgYnVja2V0KTsKKyAgX18gaW5jX2NvdW50ZXIoJkJ5dGVjb2RlSGlzdG9ncmFtOjpfY291bnRlcnNbdC0+Ynl0ZWNvZGUoKV0sIEczX3NjcmF0Y2gsIEc0X3NjcmF0Y2gpOwogfQogCiAKIHZvaWQgVGVtcGxhdGVJbnRlcnByZXRlckdlbmVyYXRvcjo6aGlzdG9ncmFtX2J5dGVjb2RlX3BhaXIoVGVtcGxhdGUqIHQpIHsKLSAgYWRkcmVzcyBpbmRleF9hZGRyICAgICAgPSAoYWRkcmVzcykmQnl0ZWNvZGVQYWlySGlzdG9ncmFtOjpfaW5kZXg7Ci0gIEFkZHJlc3MgaW5kZXgoRzNfc2NyYXRjaCwgaW5kZXhfYWRkcik7Ci0KLSAgYWRkcmVzcyBjb3VudGVyc19hZGRyICAgPSAoYWRkcmVzcykmQnl0ZWNvZGVQYWlySGlzdG9ncmFtOjpfY291bnRlcnM7Ci0gIEFkZHJlc3MgY291bnRlcnMoRzNfc2NyYXRjaCwgY291bnRlcnNfYWRkcik7CisgIEFkZHJlc3NMaXRlcmFsIGluZGV4ICAgKCZCeXRlY29kZVBhaXJIaXN0b2dyYW06Ol9pbmRleCk7CisgIEFkZHJlc3NMaXRlcmFsIGNvdW50ZXJzKChhZGRyZXNzKSAmQnl0ZWNvZGVQYWlySGlzdG9ncmFtOjpfY291bnRlcnMpOwogCiAgIC8vIGdldCBpbmRleCwgc2hpZnQgb3V0IG9sZCBieXRlY29kZSwgYnJpbmcgaW4gbmV3IGJ5dGVjb2RlLCBhbmQgc3RvcmUgaXQKICAgLy8gX2luZGV4ID0gKF9pbmRleCA+PiBsb2cyX251bWJlcl9vZl9jb2RlcykgfAogICAvLyAgICAgICAgICAoYnl0ZWNvZGUgPDwgbG9nMl9udW1iZXJfb2ZfY29kZXMpOwogCi0KLSAgX18gbG9hZF9jb250ZW50cyggaW5kZXgsICAgICAgRzRfc2NyYXRjaCApOworICBfXyBsb2FkX2NvbnRlbnRzKGluZGV4LCBHNF9zY3JhdGNoKTsKICAgX18gc3JsKCBHNF9zY3JhdGNoLCBCeXRlY29kZVBhaXJIaXN0b2dyYW06OmxvZzJfbnVtYmVyX29mX2NvZGVzLCBHNF9zY3JhdGNoICk7CiAgIF9fIHNldCggKChpbnQpdC0+Ynl0ZWNvZGUoKSkgPDwgQnl0ZWNvZGVQYWlySGlzdG9ncmFtOjpsb2cyX251bWJlcl9vZl9jb2RlcywgIEczX3NjcmF0Y2ggKTsKICAgX18gb3IzKCBHM19zY3JhdGNoLCAgRzRfc2NyYXRjaCwgRzRfc2NyYXRjaCApOwotICBfXyBzdG9yZV9jb250ZW50cyggRzRfc2NyYXRjaCwgaW5kZXggKTsKKyAgX18gc3RvcmVfY29udGVudHMoRzRfc2NyYXRjaCwgaW5kZXgsIEczX3NjcmF0Y2gpOwogCiAgIC8vIGJ1bXAgYnVja2V0IGNvbnRlbnRzCiAgIC8vIF9jb3VudGVyc1tfaW5kZXhdICsrOwogCi0gIF9fIGxvYWRfYWRkcmVzcyggY291bnRlcnMgKTsgIC8vIGxvYWRzIGludG8gRzNfc2NyYXRjaAorICBfXyBzZXQoY291bnRlcnMsIEczX3NjcmF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZHMgaW50byBHM19zY3JhdGNoCiAgIF9fIHNsbCggRzRfc2NyYXRjaCwgTG9nQnl0ZXNQZXJXb3JkLCBHNF9zY3JhdGNoICk7ICAvLyBJbmRleCBpcyB3b3JkIGFkZHJlc3MKICAgX18gYWRkIChHM19zY3JhdGNoLCBHNF9zY3JhdGNoLCBHM19zY3JhdGNoKTsgICAgICAgIC8vIEFkZCBpbiBpbmRleAogICBfXyBsZCAoRzNfc2NyYXRjaCwgMCwgRzRfc2NyYXRjaCk7CkBAIC0xOTc4LDkgKzE5NjAsOSBAQAogCiAKIHZvaWQgVGVtcGxhdGVJbnRlcnByZXRlckdlbmVyYXRvcjo6c3RvcF9pbnRlcnByZXRlcl9hdCgpIHsKLSAgQWRkcmVzcyBjb3VudGVyKEczX3NjcmF0Y2ggLCAoYWRkcmVzcykmQnl0ZWNvZGVDb3VudGVyOjpfY291bnRlcl92YWx1ZSk7Ci0gIF9fIGxvYWRfY29udGVudHMgICAgKGNvdW50ZXIsIEczX3NjcmF0Y2ggKTsKLSAgQWRkcmVzcyBzdG9wX2F0KEc0X3NjcmF0Y2gsIChhZGRyZXNzKSZTdG9wSW50ZXJwcmV0ZXJBdCk7CisgIEFkZHJlc3NMaXRlcmFsIGNvdW50ZXIoJkJ5dGVjb2RlQ291bnRlcjo6X2NvdW50ZXJfdmFsdWUpOworICBfXyBsb2FkX2NvbnRlbnRzKGNvdW50ZXIsIEczX3NjcmF0Y2gpOworICBBZGRyZXNzTGl0ZXJhbCBzdG9wX2F0KCZTdG9wSW50ZXJwcmV0ZXJBdCk7CiAgIF9fIGxvYWRfcHRyX2NvbnRlbnRzKHN0b3BfYXQsIEc0X3NjcmF0Y2gpOwogICBfXyBjbXAoRzNfc2NyYXRjaCwgRzRfc2NyYXRjaCk7CiAgIF9fIGJyZWFrcG9pbnRfdHJhcChBc3NlbWJsZXI6OmVxdWFsKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS90ZW1wbGF0ZVRhYmxlX3NwYXJjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS90ZW1wbGF0ZVRhYmxlX3NwYXJjLmNwcAppbmRleCBhNGMxZmE4Li4wODQ5YWFlIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vdGVtcGxhdGVUYWJsZV9zcGFyYy5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3RlbXBsYXRlVGFibGVfc3BhcmMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAxOTk3LTIwMDggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAxOTk3LTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTMxLDcgKzEzMSw3IEBACiAKIEFkZHJlc3MgVGVtcGxhdGVUYWJsZTo6YXRfYmNwKGludCBvZmZzZXQpIHsKICAgYXNzZXJ0KF9kZXNjLT51c2VzX2JjcCgpLCAiaW5jb25zaXN0ZW50IHVzZXNfYmNwIGluZm9ybWF0aW9uIik7Ci0gIHJldHVybiBBZGRyZXNzKCBMYmNwLCAwLCBvZmZzZXQpOworICByZXR1cm4gQWRkcmVzcyhMYmNwLCBvZmZzZXQpOwogfQogCiAKQEAgLTIxNyw5ICsyMTcsOSBAQAogICAgY2FzZSAxOiAgcCA9ICZvbmU7ICAgYnJlYWs7CiAgICBjYXNlIDI6ICBwID0gJnR3bzsgICBicmVhazsKICAgfQotICBBZGRyZXNzIGEoRzNfc2NyYXRjaCwgKGFkZHJlc3MpcCk7Ci0gIF9fIHNldGhpKGEpOwotICBfXyBsZGYoRmxvYXRSZWdpc3RlckltcGw6OlMsIGEsIEZ0b3NfZik7CisgIEFkZHJlc3NMaXRlcmFsIGEocCk7CisgIF9fIHNldGhpKGEsIEczX3NjcmF0Y2gpOworICBfXyBsZGYoRmxvYXRSZWdpc3RlckltcGw6OlMsIEczX3NjcmF0Y2gsIGEubG93MTAoKSwgRnRvc19mKTsKIH0KIAogCkBAIC0yMzIsOSArMjMyLDkgQEAKICAgIGNhc2UgMDogIHAgPSAmemVybzsgIGJyZWFrOwogICAgY2FzZSAxOiAgcCA9ICZvbmU7ICAgYnJlYWs7CiAgIH0KLSAgQWRkcmVzcyBhKEczX3NjcmF0Y2gsIChhZGRyZXNzKXApOwotICBfXyBzZXRoaShhKTsKLSAgX18gbGRmKEZsb2F0UmVnaXN0ZXJJbXBsOjpELCBhLCBGdG9zX2QpOworICBBZGRyZXNzTGl0ZXJhbCBhKHApOworICBfXyBzZXRoaShhLCBHM19zY3JhdGNoKTsKKyAgX18gbGRmKEZsb2F0UmVnaXN0ZXJJbXBsOjpELCBHM19zY3JhdGNoLCBhLmxvdzEwKCksIEZ0b3NfZCk7CiB9CiAKIApAQCAtMTU0OCw3ICsxNTQ4LDcgQEAKICAgLy8gbm9uLUpTUiBub3JtYWwtYnJhbmNoIHN0dWZmIG9jY3VycmluZyBiZWxvdy4KICAgaWYoIGlzX2pzciApIHsKICAgICAvLyBjb21wdXRlIHJldHVybiBhZGRyZXNzIGFzIGJjaSBpbiBPdG9zX2kKLSAgICBfXyBsZF9wdHIoQWRkcmVzcyhMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpjb25zdF9vZmZzZXQoKSkpLCBHM19zY3JhdGNoKTsKKyAgICBfXyBsZF9wdHIoTG1ldGhvZCwgbWV0aG9kT29wRGVzYzo6Y29uc3Rfb2Zmc2V0KCksIEczX3NjcmF0Y2gpOwogICAgIF9fIHN1YihMYmNwLCBHM19zY3JhdGNoLCBHM19zY3JhdGNoKTsKICAgICBfXyBzdWIoRzNfc2NyYXRjaCwgaW5fYnl0ZXMoY29uc3RNZXRob2RPb3BEZXNjOjpjb2Rlc19vZmZzZXQoKSkgLSAoaXNfd2lkZSA/IDUgOiAzKSwgT3Rvc19pKTsKIApAQCAtMTY2NSw3ICsxNjY1LDcgQEAKIAogICBfXyBwcm9maWxlX3JldCh2dG9zLCBPdG9zX2ksIEc0X3NjcmF0Y2gpOwogCi0gIF9fIGxkX3B0cihBZGRyZXNzKExtZXRob2QsIDAsIGluX2J5dGVzKG1ldGhvZE9vcERlc2M6OmNvbnN0X29mZnNldCgpKSksIEczX3NjcmF0Y2gpOworICBfXyBsZF9wdHIoTG1ldGhvZCwgbWV0aG9kT29wRGVzYzo6Y29uc3Rfb2Zmc2V0KCksIEczX3NjcmF0Y2gpOwogICBfXyBhZGQoRzNfc2NyYXRjaCwgT3Rvc19pLCBHM19zY3JhdGNoKTsKICAgX18gYWRkKEczX3NjcmF0Y2gsIGluX2J5dGVzKGNvbnN0TWV0aG9kT29wRGVzYzo6Y29kZXNfb2Zmc2V0KCkpLCBMYmNwKTsKICAgX18gZGlzcGF0Y2hfbmV4dCh2dG9zKTsKQEAgLTE2ODAsNyArMTY4MCw3IEBACiAKICAgX18gcHJvZmlsZV9yZXQodnRvcywgT3Rvc19pLCBHNF9zY3JhdGNoKTsKIAotICBfXyBsZF9wdHIoQWRkcmVzcyhMbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpjb25zdF9vZmZzZXQoKSkpLCBHM19zY3JhdGNoKTsKKyAgX18gbGRfcHRyKExtZXRob2QsIG1ldGhvZE9vcERlc2M6OmNvbnN0X29mZnNldCgpLCBHM19zY3JhdGNoKTsKICAgX18gYWRkKEczX3NjcmF0Y2gsIE90b3NfaSwgRzNfc2NyYXRjaCk7CiAgIF9fIGFkZChHM19zY3JhdGNoLCBpbl9ieXRlcyhjb25zdE1ldGhvZE9vcERlc2M6OmNvZGVzX29mZnNldCgpKSwgTGJjcCk7CiAgIF9fIGRpc3BhdGNoX25leHQodnRvcyk7CkBAIC0xOTY4LDggKzE5NjgsOCBAQAogICBMYWJlbCByZXNvbHZlZDsKIAogICBfXyBnZXRfY2FjaGVfYW5kX2luZGV4X2F0X2JjcChSY2FjaGUsIGluZGV4LCAxKTsKLSAgX18gbGRfcHRyKEFkZHJlc3MoUmNhY2hlLCAwLCBpbl9ieXRlcyhjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmJhc2Vfb2Zmc2V0KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmluZGljZXNfb2Zmc2V0KCkpKSwgTGJ5dGVfY29kZSk7CisgIF9fIGxkX3B0cihSY2FjaGUsIGNvbnN0YW50UG9vbENhY2hlT29wRGVzYzo6YmFzZV9vZmZzZXQoKSArCisgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmluZGljZXNfb2Zmc2V0KCksIExieXRlX2NvZGUpOwogCiAgIF9fIHNybCggIExieXRlX2NvZGUsIHNoaWZ0X2NvdW50LCBMYnl0ZV9jb2RlICk7CiAgIF9fIGFuZDMoIExieXRlX2NvZGUsICAgICAgICAweEZGLCBMYnl0ZV9jb2RlICk7CkBAIC0yMDI5LDExICsyMDI5LDExIEBACiAgICAgcmVzb2x2ZV9jYWNoZV9hbmRfaW5kZXgoYnl0ZV9ubywgUmNhY2hlLCBSc2NyYXRjaCk7CiAgIH0KIAotICBfXyBsZF9wdHIoQWRkcmVzcyhSY2FjaGUsIDAsIG1ldGhvZF9vZmZzZXQpLCBSbWV0aG9kKTsKKyAgX18gbGRfcHRyKFJjYWNoZSwgbWV0aG9kX29mZnNldCwgUm1ldGhvZCk7CiAgIGlmIChSaXRhYmxlX2luZGV4ICE9IG5vcmVnKSB7Ci0gICAgX18gbGRfcHRyKEFkZHJlc3MoUmNhY2hlLCAwLCBpbmRleF9vZmZzZXQpLCBSaXRhYmxlX2luZGV4KTsKKyAgICBfXyBsZF9wdHIoUmNhY2hlLCBpbmRleF9vZmZzZXQsIFJpdGFibGVfaW5kZXgpOwogICB9Ci0gIF9fIGxkX3B0cihBZGRyZXNzKFJjYWNoZSwgMCwgZmxhZ3Nfb2Zmc2V0KSwgIFJmbGFncyk7CisgIF9fIGxkX3B0cihSY2FjaGUsIGZsYWdzX29mZnNldCwgUmZsYWdzKTsKIH0KIAogLy8gVGhlIFJjYWNoZSByZWdpc3RlciBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbApAQCAtMjA0NywxMyArMjA0NywxMCBAQAogCiAgIEJ5dGVTaXplIGNwX2Jhc2Vfb2Zmc2V0ID0gY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjpiYXNlX29mZnNldCgpOwogCi0gIF9fIGxkX3B0cihBZGRyZXNzKFJjYWNoZSwgMCwgaW5fYnl0ZXMoY3BfYmFzZV9vZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmbGFnc19vZmZzZXQoKSkpLCBSZmxhZ3MpOwotICBfXyBsZF9wdHIoQWRkcmVzcyhSY2FjaGUsIDAsIGluX2J5dGVzKGNwX2Jhc2Vfb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZjJfb2Zmc2V0KCkpKSwgUm9mZnNldCk7CisgIF9fIGxkX3B0cihSY2FjaGUsIGNwX2Jhc2Vfb2Zmc2V0ICsgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZmxhZ3Nfb2Zmc2V0KCksIFJmbGFncyk7CisgIF9fIGxkX3B0cihSY2FjaGUsIGNwX2Jhc2Vfb2Zmc2V0ICsgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZjJfb2Zmc2V0KCksIFJvZmZzZXQpOwogICBpZiAoaXNfc3RhdGljKSB7Ci0gICAgX18gbGRfcHRyKEFkZHJlc3MoUmNhY2hlLCAwLCBpbl9ieXRlcyhjcF9iYXNlX29mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmYxX29mZnNldCgpKSksIFJvYmopOworICAgIF9fIGxkX3B0cihSY2FjaGUsIGNwX2Jhc2Vfb2Zmc2V0ICsgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZjFfb2Zmc2V0KCksIFJvYmopOwogICB9CiB9CiAKQEAgLTIwNzAsOSArMjA2Nyw3IEBACiAgICAgLy8gdGhlIHRpbWUgdG8gY2FsbCBpbnRvIHRoZSBWTS4KICAgICBMYWJlbCBMYWJlbDE7CiAgICAgYXNzZXJ0X2RpZmZlcmVudF9yZWdpc3RlcnMoUmNhY2hlLCBpbmRleCwgRzFfc2NyYXRjaCk7Ci0gICAgQWRkcmVzcyBnZXRfZmllbGRfYWNjZXNzX2NvdW50X2FkZHIoRzFfc2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkcmVzcylKdm10aUV4cG9ydDo6Z2V0X2ZpZWxkX2FjY2Vzc19jb3VudF9hZGRyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NJbmZvOjpub25lKTsKKyAgICBBZGRyZXNzTGl0ZXJhbCBnZXRfZmllbGRfYWNjZXNzX2NvdW50X2FkZHIoSnZtdGlFeHBvcnQ6OmdldF9maWVsZF9hY2Nlc3NfY291bnRfYWRkcigpKTsKICAgICBfXyBsb2FkX2NvbnRlbnRzKGdldF9maWVsZF9hY2Nlc3NfY291bnRfYWRkciwgRzFfc2NyYXRjaCk7CiAgICAgX18gdHN0KEcxX3NjcmF0Y2gpOwogICAgIF9fIGJyKEFzc2VtYmxlcjo6emVybywgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIExhYmVsMSk7CkBAIC0yMjkzLDcgKzIyODgsNyBAQAogICBfXyBnZXRfY2FjaGVfYW5kX2luZGV4X2F0X2JjcChSY2FjaGUsIGluZGV4LCAxKTsKICAganZtdGlfcG9zdF9maWVsZF9hY2Nlc3MoUmNhY2hlLCBpbmRleCwgLyppc19zdGF0aWMqL2ZhbHNlLCAvKmhhc190b3MqL3RydWUpOwogCi0gIF9fIGxkX3B0cihBZGRyZXNzKFJjYWNoZSwgMCwgaW5fYnl0ZXMoY3BfYmFzZV9vZmZzZXQgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmMl9vZmZzZXQoKSkpLCBSb2Zmc2V0KTsKKyAgX18gbGRfcHRyKFJjYWNoZSwgY3BfYmFzZV9vZmZzZXQgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmMl9vZmZzZXQoKSwgUm9mZnNldCk7CiAKICAgX18gbnVsbF9jaGVjayhPdG9zX2kpOwogICBfXyB2ZXJpZnlfb29wKE90b3NfaSk7CkBAIC0yMzA0LDcgKzIyOTksNyBAQAogICAgIEFzc2VtYmxlcjo6TWVtYmFyX21hc2tfYml0cyhBc3NlbWJsZXI6OkxvYWRMb2FkIHwgQXNzZW1ibGVyOjpMb2FkU3RvcmUpOwogICBpZiAoX18gbWVtYmFyX2hhc19lZmZlY3QobWVtYmFyX2JpdHMpKSB7CiAgICAgLy8gR2V0IHZvbGF0aWxlIGZsYWcKLSAgICBfXyBsZF9wdHIoQWRkcmVzcyhSY2FjaGUsIDAsIGluX2J5dGVzKGNwX2Jhc2Vfb2Zmc2V0ICsgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZjJfb2Zmc2V0KCkpKSwgUmZsYWdzKTsKKyAgICBfXyBsZF9wdHIoUmNhY2hlLCBjcF9iYXNlX29mZnNldCArIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmYyX29mZnNldCgpLCBSZmxhZ3MpOwogICAgIF9fIHNldCgoMSA8PCBDb25zdGFudFBvb2xDYWNoZUVudHJ5Ojp2b2xhdGlsZUZpZWxkKSwgTHNjcmF0Y2gpOwogICB9CiAKQEAgLTIzNTUsNyArMjM1MCw3IEBACiAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgZmllbGQgbW9kaWZpY2F0aW9uIHdhdGNoIGhhcyBiZWVuIHNldCBiZWZvcmUgd2UgdGFrZQogICAgIC8vIHRoZSB0aW1lIHRvIGNhbGwgaW50byB0aGUgVk0uCiAgICAgTGFiZWwgZG9uZTsKLSAgICBBZGRyZXNzIGdldF9maWVsZF9tb2RpZmljYXRpb25fY291bnRfYWRkcihHNF9zY3JhdGNoLCAoYWRkcmVzcylKdm10aUV4cG9ydDo6Z2V0X2ZpZWxkX21vZGlmaWNhdGlvbl9jb3VudF9hZGRyKCksIHJlbG9jSW5mbzo6bm9uZSk7CisgICAgQWRkcmVzc0xpdGVyYWwgZ2V0X2ZpZWxkX21vZGlmaWNhdGlvbl9jb3VudF9hZGRyKEp2bXRpRXhwb3J0OjpnZXRfZmllbGRfbW9kaWZpY2F0aW9uX2NvdW50X2FkZHIoKSk7CiAgICAgX18gbG9hZF9jb250ZW50cyhnZXRfZmllbGRfbW9kaWZpY2F0aW9uX2NvdW50X2FkZHIsIEc0X3NjcmF0Y2gpOwogICAgIF9fIHRzdChHNF9zY3JhdGNoKTsKICAgICBfXyBicihBc3NlbWJsZXI6Onplcm8sIGZhbHNlLCBBc3NlbWJsZXI6OnB0LCBkb25lKTsKQEAgLTI0MDgsOSArMjQwMyw3IEBACiAgICAgLy8gdGhlIHRpbWUgdG8gY2FsbCBpbnRvIHRoZSBWTS4KICAgICBMYWJlbCBMYWJlbDE7CiAgICAgYXNzZXJ0X2RpZmZlcmVudF9yZWdpc3RlcnMoUmNhY2hlLCBpbmRleCwgRzFfc2NyYXRjaCk7Ci0gICAgQWRkcmVzcyBnZXRfZmllbGRfbW9kaWZpY2F0aW9uX2NvdW50X2FkZHIoRzFfc2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkcmVzcylKdm10aUV4cG9ydDo6Z2V0X2ZpZWxkX21vZGlmaWNhdGlvbl9jb3VudF9hZGRyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NJbmZvOjpub25lKTsKKyAgICBBZGRyZXNzTGl0ZXJhbCBnZXRfZmllbGRfbW9kaWZpY2F0aW9uX2NvdW50X2FkZHIoSnZtdGlFeHBvcnQ6OmdldF9maWVsZF9tb2RpZmljYXRpb25fY291bnRfYWRkcigpKTsKICAgICBfXyBsb2FkX2NvbnRlbnRzKGdldF9maWVsZF9tb2RpZmljYXRpb25fY291bnRfYWRkciwgRzFfc2NyYXRjaCk7CiAgICAgX18gdHN0KEcxX3NjcmF0Y2gpOwogICAgIF9fIGJyKEFzc2VtYmxlcjo6emVybywgZmFsc2UsIEFzc2VtYmxlcjo6cHQsIExhYmVsMSk7CkBAIC0yNDMzLDcgKzI0MjYsNyBAQAogICAgICAgLy8gdGhlIHR5cGUgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBvYmplY3QgaXMuCiAKICAgICAgIExhYmVsIHR3b193b3JkLCB2YWxzaXpla25vd247Ci0gICAgICBfXyBsZF9wdHIoQWRkcmVzcyhHMV9zY3JhdGNoLCAwLCBpbl9ieXRlcyhjcF9iYXNlX29mZnNldCArIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmZsYWdzX29mZnNldCgpKSksIFJmbGFncyk7CisgICAgICBfXyBsZF9wdHIoRzFfc2NyYXRjaCwgY3BfYmFzZV9vZmZzZXQgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmbGFnc19vZmZzZXQoKSwgUmZsYWdzKTsKICAgICAgIF9fIG1vdihMZXNwLCBHNF9zY3JhdGNoKTsKICAgICAgIF9fIHNybChSZmxhZ3MsIENvbnN0YW50UG9vbENhY2hlRW50cnk6OnRvc0JpdHMsIFJmbGFncyk7CiAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgbmVlZCB0byBtYXNrIFJmbGFncyBmb3IgdG9zQml0cyBhZnRlciB0aGUgYWJvdmUgc2hpZnQKQEAgLTI2ODksOCArMjY4Miw3IEBACiAKICAgTGFiZWwgbm90Vm9sYXRpbGUsIGNoZWNrVm9sYXRpbGUsIGV4aXQ7CiAgIGlmIChfXyBtZW1iYXJfaGFzX2VmZmVjdChyZWFkX2JpdHMpIHx8IF9fIG1lbWJhcl9oYXNfZWZmZWN0KHdyaXRlX2JpdHMpKSB7Ci0gICAgX18gbGRfcHRyKEFkZHJlc3MoUmNhY2hlLCAwLCBpbl9ieXRlcyhjcF9iYXNlX29mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmZsYWdzX29mZnNldCgpKSksIFJmbGFncyk7CisgICAgX18gbGRfcHRyKFJjYWNoZSwgY3BfYmFzZV9vZmZzZXQgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmbGFnc19vZmZzZXQoKSwgUmZsYWdzKTsKICAgICBfXyBzZXQoKDEgPDwgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6dm9sYXRpbGVGaWVsZCksIExzY3JhdGNoKTsKICAgICBfXyBhbmQzKFJmbGFncywgTHNjcmF0Y2gsIExzY3JhdGNoKTsKICAgICBpZiAoX18gbWVtYmFyX2hhc19lZmZlY3QocmVhZF9iaXRzKSkgewpAQCAtMjcwMiw4ICsyNjk0LDcgQEAKICAgICB9CiAgIH0KIAotICBfXyBsZF9wdHIoQWRkcmVzcyhSY2FjaGUsIDAsIGluX2J5dGVzKGNwX2Jhc2Vfb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZjJfb2Zmc2V0KCkpKSwgUm9mZnNldCk7CisgIF9fIGxkX3B0cihSY2FjaGUsIGNwX2Jhc2Vfb2Zmc2V0ICsgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZjJfb2Zmc2V0KCksIFJvZmZzZXQpOwogICBwb3BfYW5kX2NoZWNrX29iamVjdChSY2xhc3MpOwogCiAgIHN3aXRjaCAoYnl0ZWNvZGUoKSkgewpAQCAtMjc1NSw3ICsyNzQ2LDcgQEAKIAogICAvLyBhY2Nlc3MgY29uc3RhbnQgcG9vbCBjYWNoZSAgKGlzIHJlc29sdmVkKQogICBfXyBnZXRfY2FjaGVfYW5kX2luZGV4X2F0X2JjcChSY2FjaGUsIEc0X3NjcmF0Y2gsIDIpOwotICBfXyBsZF9wdHIoQWRkcmVzcyhSY2FjaGUsIDAsIGluX2J5dGVzKGNvbnN0YW50UG9vbENhY2hlT29wRGVzYzo6YmFzZV9vZmZzZXQoKSArIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmYyX29mZnNldCgpKSksIFJvZmZzZXQpOworICBfXyBsZF9wdHIoUmNhY2hlLCBjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmJhc2Vfb2Zmc2V0KCkgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmMl9vZmZzZXQoKSwgUm9mZnNldCk7CiAgIF9fIGFkZChMYmNwLCAxLCBMYmNwKTsgICAgICAgLy8gbmVlZGVkIHRvIHJlcG9ydCBleGNlcHRpb24gYXQgdGhlIGNvcnJlY3QgYmNwCiAKICAgX18gdmVyaWZ5X29vcChScmVjZWl2ZXIpOwpAQCAtMjc3NSw3ICsyNzY2LDcgQEAKICAgaWYgKF9fIG1lbWJhcl9oYXNfZWZmZWN0KG1lbWJhcl9iaXRzKSkgewogCiAgICAgLy8gR2V0IGlzX3ZvbGF0aWxlIHZhbHVlIGluIFJmbGFncyBhbmQgY2hlY2sgaWYgbWVtYmFyIGlzIG5lZWRlZAotICAgIF9fIGxkX3B0cihBZGRyZXNzKFJjYWNoZSwgMCwgaW5fYnl0ZXMoY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjpiYXNlX29mZnNldCgpICsgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZmxhZ3Nfb2Zmc2V0KCkpKSwgUmZsYWdzKTsKKyAgICBfXyBsZF9wdHIoUmNhY2hlLCBjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmJhc2Vfb2Zmc2V0KCkgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmbGFnc19vZmZzZXQoKSwgUmZsYWdzKTsKIAogICAgIC8vIFRlc3Qgdm9sYXRpbGUKICAgICBMYWJlbCBub3RWb2xhdGlsZTsKQEAgLTI4NTMsOCArMjg0NCw4IEBACiAgIF9fIHZlcmlmeV9vb3AoTzApOwogCiAgIC8vIGdldCByZXR1cm4gYWRkcmVzcwotICBBZGRyZXNzIHRhYmxlKFJ0ZW1wLCAoYWRkcmVzcylJbnRlcnByZXRlcjo6cmV0dXJuXzNfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSk7Ci0gIF9fIGxvYWRfYWRkcmVzcyh0YWJsZSk7CisgIEFkZHJlc3NMaXRlcmFsIHRhYmxlKEludGVycHJldGVyOjpyZXR1cm5fM19hZGRyc19ieV9pbmRleF90YWJsZSgpKTsKKyAgX18gc2V0KHRhYmxlLCBSdGVtcCk7CiAgIF9fIHNybChScmV0LCBDb25zdGFudFBvb2xDYWNoZUVudHJ5Ojp0b3NCaXRzLCBScmV0KTsgICAgICAgICAgLy8gZ2V0IHJldHVybiB0eXBlCiAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBuZWVkIHRvIG1hc2sgUnJldCBmb3IgdG9zQml0cyBhZnRlciB0aGUgYWJvdmUgc2hpZnQKICAgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6dmVyaWZ5X3Rvc0JpdHMoKTsKQEAgLTI4ODYsNyArMjg3Nyw3IEBACiAgIF9fIHZlcmlmeV9vb3AoRzVfbWV0aG9kKTsKIAogICAvLyBMb2FkIHJlY2VpdmVyIGZyb20gc3RhY2sgc2xvdAotICBfXyBsZHVoKEFkZHJlc3MoRzVfbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpzaXplX29mX3BhcmFtZXRlcnNfb2Zmc2V0KCkpKSwgRzRfc2NyYXRjaCk7CisgIF9fIGxkdWgoRzVfbWV0aG9kLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpzaXplX29mX3BhcmFtZXRlcnNfb2Zmc2V0KCkpLCBHNF9zY3JhdGNoKTsKICAgX18gbG9hZF9yZWNlaXZlcihHNF9zY3JhdGNoLCBPMCk7CiAKICAgLy8gcmVjZWl2ZXIgTlVMTCBjaGVjawpAQCAtMjg5NSw4ICsyODg2LDggQEAKICAgX18gcHJvZmlsZV9maW5hbF9jYWxsKE80KTsKIAogICAvLyBnZXQgcmV0dXJuIGFkZHJlc3MKLSAgQWRkcmVzcyB0YWJsZShSdGVtcCwgKGFkZHJlc3MpSW50ZXJwcmV0ZXI6OnJldHVybl8zX2FkZHJzX2J5X2luZGV4X3RhYmxlKCkpOwotICBfXyBsb2FkX2FkZHJlc3ModGFibGUpOworICBBZGRyZXNzTGl0ZXJhbCB0YWJsZShJbnRlcnByZXRlcjo6cmV0dXJuXzNfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSk7CisgIF9fIHNldCh0YWJsZSwgUnRlbXApOwogICBfXyBzcmwoUnJldCwgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6dG9zQml0cywgUnJldCk7ICAgICAgICAgIC8vIGdldCByZXR1cm4gdHlwZQogICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgbmVlZCB0byBtYXNrIFJyZXQgZm9yIHRvc0JpdHMgYWZ0ZXIgdGhlIGFib3ZlIHNoaWZ0CiAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OnZlcmlmeV90b3NCaXRzKCk7CkBAIC0yOTIwLDcgKzI5MTEsNyBAQAogCiAgIF9fIHZlcmlmeV9vb3AoRzVfbWV0aG9kKTsKIAotICBfXyBsZHVoKEFkZHJlc3MoRzVfbWV0aG9kLCAwLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpzaXplX29mX3BhcmFtZXRlcnNfb2Zmc2V0KCkpKSwgRzRfc2NyYXRjaCk7CisgIF9fIGxkdWgoRzVfbWV0aG9kLCBpbl9ieXRlcyhtZXRob2RPb3BEZXNjOjpzaXplX29mX3BhcmFtZXRlcnNfb2Zmc2V0KCkpLCBHNF9zY3JhdGNoKTsKICAgX18gbG9hZF9yZWNlaXZlcihHNF9zY3JhdGNoLCBPMCk7CiAKICAgLy8gcmVjZWl2ZXIgTlVMTCBjaGVjawpAQCAtMjkyOSw4ICsyOTIwLDggQEAKICAgX18gcHJvZmlsZV9jYWxsKE80KTsKIAogICAvLyBnZXQgcmV0dXJuIGFkZHJlc3MKLSAgQWRkcmVzcyB0YWJsZShSdGVtcCwgKGFkZHJlc3MpSW50ZXJwcmV0ZXI6OnJldHVybl8zX2FkZHJzX2J5X2luZGV4X3RhYmxlKCkpOwotICBfXyBsb2FkX2FkZHJlc3ModGFibGUpOworICBBZGRyZXNzTGl0ZXJhbCB0YWJsZShJbnRlcnByZXRlcjo6cmV0dXJuXzNfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSk7CisgIF9fIHNldCh0YWJsZSwgUnRlbXApOwogICBfXyBzcmwoUnJldCwgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6dG9zQml0cywgUnJldCk7ICAgICAgICAgIC8vIGdldCByZXR1cm4gdHlwZQogICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgbmVlZCB0byBtYXNrIFJyZXQgZm9yIHRvc0JpdHMgYWZ0ZXIgdGhlIGFib3ZlIHNoaWZ0CiAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OnZlcmlmeV90b3NCaXRzKCk7CkBAIC0yOTU2LDggKzI5NDcsOCBAQAogICBfXyBwcm9maWxlX2NhbGwoTzQpOwogCiAgIC8vIGdldCByZXR1cm4gYWRkcmVzcwotICBBZGRyZXNzIHRhYmxlKFJ0ZW1wLCAoYWRkcmVzcylJbnRlcnByZXRlcjo6cmV0dXJuXzNfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSk7Ci0gIF9fIGxvYWRfYWRkcmVzcyh0YWJsZSk7CisgIEFkZHJlc3NMaXRlcmFsIHRhYmxlKEludGVycHJldGVyOjpyZXR1cm5fM19hZGRyc19ieV9pbmRleF90YWJsZSgpKTsKKyAgX18gc2V0KHRhYmxlLCBSdGVtcCk7CiAgIF9fIHNybChScmV0LCBDb25zdGFudFBvb2xDYWNoZUVudHJ5Ojp0b3NCaXRzLCBScmV0KTsgICAgICAgICAgLy8gZ2V0IHJldHVybiB0eXBlCiAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBuZWVkIHRvIG1hc2sgUnJldCBmb3IgdG9zQml0cyBhZnRlciB0aGUgYWJvdmUgc2hpZnQKICAgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6dmVyaWZ5X3Rvc0JpdHMoKTsKQEAgLTMwMjEsOCArMzAxMiw4IEBACiAgIF9fIG1vdihSZmxhZ3MsIFJyZXQpOwogCiAgIC8vIGdldCByZXR1cm4gYWRkcmVzcwotICBBZGRyZXNzIHRhYmxlKFJzY3JhdGNoLCAoYWRkcmVzcylJbnRlcnByZXRlcjo6cmV0dXJuXzVfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSk7Ci0gIF9fIGxvYWRfYWRkcmVzcyh0YWJsZSk7CisgIEFkZHJlc3NMaXRlcmFsIHRhYmxlKEludGVycHJldGVyOjpyZXR1cm5fNV9hZGRyc19ieV9pbmRleF90YWJsZSgpKTsKKyAgX18gc2V0KHRhYmxlLCBSc2NyYXRjaCk7CiAgIF9fIHNybChScmV0LCBDb25zdGFudFBvb2xDYWNoZUVudHJ5Ojp0b3NCaXRzLCBScmV0KTsgICAgICAgICAgLy8gZ2V0IHJldHVybiB0eXBlCiAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBuZWVkIHRvIG1hc2sgUnJldCBmb3IgdG9zQml0cyBhZnRlciB0aGUgYWJvdmUgc2hpZnQKICAgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6dmVyaWZ5X3Rvc0JpdHMoKTsKQEAgLTMwNTksNyArMzA1MCw3IEBACiAgIExhYmVsIHNlYXJjaDsKICAgUmVnaXN0ZXIgUnRlbXAgPSBSZmxhZ3M7CiAKLSAgX18gbGQoQWRkcmVzcyhSa2xhc3NPb3AsIDAsIGluc3RhbmNlS2xhc3M6OnZ0YWJsZV9sZW5ndGhfb2Zmc2V0KCkgKiB3b3JkU2l6ZSksIFJ0ZW1wKTsKKyAgX18gbGQoUmtsYXNzT29wLCBpbnN0YW5jZUtsYXNzOjp2dGFibGVfbGVuZ3RoX29mZnNldCgpICogd29yZFNpemUsIFJ0ZW1wKTsKICAgaWYgKGFsaWduX29iamVjdF9vZmZzZXQoMSkgPiAxKSB7CiAgICAgX18gcm91bmRfdG8oUnRlbXAsIGFsaWduX29iamVjdF9vZmZzZXQoMSkpOwogICB9CkBAIC0zMTI1LDYgKzMxMTYsMjQgQEAKIH0KIAogCit2b2lkIFRlbXBsYXRlVGFibGU6Omludm9rZWR5bmFtaWMoaW50IGJ5dGVfbm8pIHsKKyAgdHJhbnNpdGlvbih2dG9zLCB2dG9zKTsKKworICBpZiAoIUVuYWJsZUludm9rZUR5bmFtaWMpIHsKKyAgICAvLyBXZSBzaG91bGQgbm90IGVuY291bnRlciB0aGlzIGJ5dGVjb2RlIGlmICFFbmFibGVJbnZva2VEeW5hbWljLgorICAgIC8vIFRoZSB2ZXJpZmllciB3aWxsIHN0b3AgaXQuICBIb3dldmVyLCBpZiB3ZSBnZXQgcGFzdCB0aGUgdmVyaWZpZXIsCisgICAgLy8gdGhpcyB3aWxsIHN0b3AgdGhlIHRocmVhZCBpbiBhIHJlYXNvbmFibGUgd2F5LCB3aXRob3V0IGNyYXNoaW5nIHRoZSBKVk0uCisgICAgX18gY2FsbF9WTShub3JlZywgQ0FTVF9GUk9NX0ZOX1BUUihhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgSW50ZXJwcmV0ZXJSdW50aW1lOjp0aHJvd19JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yKSk7CisgICAgLy8gdGhlIGNhbGxfVk0gY2hlY2tzIGZvciBleGNlcHRpb24sIHNvIHdlIHNob3VsZCBuZXZlciByZXR1cm4gaGVyZS4KKyAgICBfXyBzaG91bGRfbm90X3JlYWNoX2hlcmUoKTsKKyAgICByZXR1cm47CisgIH0KKworICBfXyBzdG9wKCJpbnZva2VkeW5hbWljIE5ZSSIpOy8vNjgxNTY5Mi8vCit9CisKKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBbGxvY2F0aW9uCiAKQEAgLTM2MjQsOSArMzYzMyw5IEBACiAgIHRyYW5zaXRpb24odnRvcywgdnRvcyk7CiAgIF9fIGxkdWIoTGJjcCwgMSwgRzNfc2NyYXRjaCk7Ly8gZ2V0IG5leHQgYmMKICAgX18gc2xsKEczX3NjcmF0Y2gsIExvZ0J5dGVzUGVyV29yZCwgRzNfc2NyYXRjaCk7Ci0gIEFkZHJlc3MgZXAoRzRfc2NyYXRjaCwgKGFkZHJlc3MpSW50ZXJwcmV0ZXI6Ol93ZW50cnlfcG9pbnQpOwotICBfXyBsb2FkX2FkZHJlc3MoZXApOwotICBfXyBsZF9wdHIoZXAuYmFzZSgpLCBHM19zY3JhdGNoLCBHM19zY3JhdGNoKTsKKyAgQWRkcmVzc0xpdGVyYWwgZXAoSW50ZXJwcmV0ZXI6Ol93ZW50cnlfcG9pbnQpOworICBfXyBzZXQoZXAsIEc0X3NjcmF0Y2gpOworICBfXyBsZF9wdHIoRzRfc2NyYXRjaCwgRzNfc2NyYXRjaCwgRzNfc2NyYXRjaCk7CiAgIF9fIGptcChHM19zY3JhdGNoLCBHMCk7CiAgIF9fIGRlbGF5ZWQoKS0+bm9wKCk7CiAgIC8vIE5vdGU6IHRoZSBMYmNwIGluY3JlbWVudCBzdGVwIGlzIHBhcnQgb2YgdGhlIGluZGl2aWR1YWwgd2lkZSBieXRlY29kZSBpbXBsZW1lbnRhdGlvbnMKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS92dGFibGVTdHVic19zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vdnRhYmxlU3R1YnNfc3BhcmMuY3BwCmluZGV4IDU0MzllMmEuLjIyYjc2ZmIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS92dGFibGVTdHVic19zcGFyYy5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3Z0YWJsZVN0dWJzX3NwYXJjLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMTk5Ny0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMTk5Ny0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ4LDExICs0OCw3IEBACiAKICNpZm5kZWYgUFJPRFVDVAogICBpZiAoQ291bnRDb21waWxlZENhbGxzKSB7Ci0gICAgQWRkcmVzcyBjdHIoRzUsIFNoYXJlZFJ1bnRpbWU6Om5vZl9tZWdhbW9ycGhpY19jYWxsc19hZGRyKCkpOwotICAgIF9fIHNldGhpKGN0cik7Ci0gICAgX18gbGQoY3RyLCBHM19zY3JhdGNoKTsKLSAgICBfXyBpbmMoRzNfc2NyYXRjaCk7Ci0gICAgX18gc3QoRzNfc2NyYXRjaCwgY3RyKTsKKyAgICBfXyBpbmNfY291bnRlcihTaGFyZWRSdW50aW1lOjpub2ZfbWVnYW1vcnBoaWNfY2FsbHNfYWRkcigpLCBHNSwgRzNfc2NyYXRjaCk7CiAgIH0KICNlbmRpZiAvKiBQUk9EVUNUICovCiAKQEAgLTE1NCwxMSArMTUwLDcgQEAKIAogI2lmbmRlZiBQUk9EVUNUCiAgIGlmIChDb3VudENvbXBpbGVkQ2FsbHMpIHsKLSAgICBBZGRyZXNzIGN0cihMMCwgU2hhcmVkUnVudGltZTo6bm9mX21lZ2Ftb3JwaGljX2NhbGxzX2FkZHIoKSk7Ci0gICAgX18gc2V0aGkoY3RyKTsKLSAgICBfXyBsZChjdHIsIEwxKTsKLSAgICBfXyBpbmMoTDEpOwotICAgIF9fIHN0KEwxLCBjdHIpOworICAgIF9fIGluY19jb3VudGVyKFNoYXJlZFJ1bnRpbWU6Om5vZl9tZWdhbW9ycGhpY19jYWxsc19hZGRyKCksIEwwLCBMMSk7CiAgIH0KICNlbmRpZiAvKiBQUk9EVUNUICovCiAKQEAgLTE5OCw4ICsxOTAsOCBAQAogICBfXyBkZWxheWVkKCktPm5vcCgpOwogCiAgIF9fIGJpbmQodGhyb3dfaWNjZSk7Ci0gIEFkZHJlc3MgaWNjZShHM19zY3JhdGNoLCBTdHViUm91dGluZXM6OnRocm93X0luY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3JfZW50cnkoKSk7Ci0gIF9fIGp1bXBfdG8oaWNjZSwgMCk7CisgIEFkZHJlc3NMaXRlcmFsIGljY2UoU3R1YlJvdXRpbmVzOjp0aHJvd19JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yX2VudHJ5KCkpOworICBfXyBqdW1wX3RvKGljY2UsIEczX3NjcmF0Y2gpOwogICBfXyBkZWxheWVkKCktPnJlc3RvcmUoKTsKIAogICBtYXNtLT5mbHVzaCgpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9pbnRlcnBfbWFzbV94ODZfMzIuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9pbnRlcnBfbWFzbV94ODZfMzIuY3BwCmluZGV4IDQxM2U1OTcuLjlkYzI5ZjMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vaW50ZXJwX21hc21feDg2XzMyLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL2ludGVycF9tYXNtX3g4Nl8zMi5jcHAKQEAgLTE4OSwyMCArMTg5LDMzIEBACiB9CiAKIAotdm9pZCBJbnRlcnByZXRlck1hY3JvQXNzZW1ibGVyOjpnZXRfY2FjaGVfYW5kX2luZGV4X2F0X2JjcChSZWdpc3RlciBjYWNoZSwgUmVnaXN0ZXIgaW5kZXgsIGludCBiY3Bfb2Zmc2V0KSB7Cit2b2lkIEludGVycHJldGVyTWFjcm9Bc3NlbWJsZXI6OmdldF9jYWNoZV9pbmRleF9hdF9iY3AoUmVnaXN0ZXIgcmVnLCBpbnQgYmNwX29mZnNldCwgYm9vbCBnaWFudF9pbmRleCkgewogICBhc3NlcnQoYmNwX29mZnNldCA+IDAsICJiY3AgaXMgc3RpbGwgcG9pbnRpbmcgdG8gc3RhcnQgb2YgYnl0ZWNvZGUiKTsKKyAgaWYgKCFnaWFudF9pbmRleCkgeworICAgIGxvYWRfdW5zaWduZWRfc2hvcnQocmVnLCBBZGRyZXNzKHJzaSwgYmNwX29mZnNldCkpOworICB9IGVsc2UgeworICAgIGFzc2VydChFbmFibGVJbnZva2VEeW5hbWljLCAiZ2lhbnQgaW5kZXggdXNlZCBvbmx5IGZvciBFbmFibGVJbnZva2VEeW5hbWljIik7CisgICAgbW92bChyZWcsIEFkZHJlc3MocnNpLCBiY3Bfb2Zmc2V0KSk7CisgICAgYXNzZXJ0KGNvbnN0YW50UG9vbENhY2hlT29wRGVzYzo6ZGVjb2RlX3NlY29uZGFyeV9pbmRleCh+MTIzKSA9PSAxMjMsICJlbHNlIGNoYW5nZSBuZXh0IGxpbmUiKTsKKyAgICBub3RsKHJlZyk7ICAvLyBjb252ZXJ0IHRvIHBsYWluIGluZGV4CisgIH0KK30KKworCit2b2lkIEludGVycHJldGVyTWFjcm9Bc3NlbWJsZXI6OmdldF9jYWNoZV9hbmRfaW5kZXhfYXRfYmNwKFJlZ2lzdGVyIGNhY2hlLCBSZWdpc3RlciBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJjcF9vZmZzZXQsIGJvb2wgZ2lhbnRfaW5kZXgpIHsKICAgYXNzZXJ0KGNhY2hlICE9IGluZGV4LCAibXVzdCB1c2UgZGlmZmVyZW50IHJlZ2lzdGVycyIpOwotICBsb2FkX3Vuc2lnbmVkX3Nob3J0KGluZGV4LCBBZGRyZXNzKHJzaSwgYmNwX29mZnNldCkpOworICBnZXRfY2FjaGVfaW5kZXhfYXRfYmNwKGluZGV4LCBiY3Bfb2Zmc2V0LCBnaWFudF9pbmRleCk7CiAgIG1vdnB0cihjYWNoZSwgQWRkcmVzcyhyYnAsIGZyYW1lOjppbnRlcnByZXRlcl9mcmFtZV9jYWNoZV9vZmZzZXQgKiB3b3JkU2l6ZSkpOwogICBhc3NlcnQoc2l6ZW9mKENvbnN0YW50UG9vbENhY2hlRW50cnkpID09IDQqd29yZFNpemUsICJhZGp1c3QgY29kZSBiZWxvdyIpOwogICBzaGxwdHIoaW5kZXgsIDIpOyAvLyBjb252ZXJ0IGZyb20gZmllbGQgaW5kZXggdG8gQ29uc3RhbnRQb29sQ2FjaGVFbnRyeSBpbmRleAogfQogCiAKLXZvaWQgSW50ZXJwcmV0ZXJNYWNyb0Fzc2VtYmxlcjo6Z2V0X2NhY2hlX2VudHJ5X3BvaW50ZXJfYXRfYmNwKFJlZ2lzdGVyIGNhY2hlLCBSZWdpc3RlciB0bXAsIGludCBiY3Bfb2Zmc2V0KSB7Ci0gIGFzc2VydChiY3Bfb2Zmc2V0ID4gMCwgImJjcCBpcyBzdGlsbCBwb2ludGluZyB0byBzdGFydCBvZiBieXRlY29kZSIpOwordm9pZCBJbnRlcnByZXRlck1hY3JvQXNzZW1ibGVyOjpnZXRfY2FjaGVfZW50cnlfcG9pbnRlcl9hdF9iY3AoUmVnaXN0ZXIgY2FjaGUsIFJlZ2lzdGVyIHRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiY3Bfb2Zmc2V0LCBib29sIGdpYW50X2luZGV4KSB7CiAgIGFzc2VydChjYWNoZSAhPSB0bXAsICJtdXN0IHVzZSBkaWZmZXJlbnQgcmVnaXN0ZXIiKTsKLSAgbG9hZF91bnNpZ25lZF9zaG9ydCh0bXAsIEFkZHJlc3MocnNpLCBiY3Bfb2Zmc2V0KSk7CisgIGdldF9jYWNoZV9pbmRleF9hdF9iY3AodG1wLCBiY3Bfb2Zmc2V0LCBnaWFudF9pbmRleCk7CiAgIGFzc2VydChzaXplb2YoQ29uc3RhbnRQb29sQ2FjaGVFbnRyeSkgPT0gNCp3b3JkU2l6ZSwgImFkanVzdCBjb2RlIGJlbG93Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBmcm9tIGZpZWxkIGluZGV4IHRvIENvbnN0YW50UG9vbENhY2hlRW50cnkgaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZnJvbSB3b3JkIG9mZnNldCB0byBieXRlIG9mZnNldApAQCAtMTIxNCw3ICsxMjI3LDkgQEAKIH0KIAogCi12b2lkIEludGVycHJldGVyTWFjcm9Bc3NlbWJsZXI6OnByb2ZpbGVfdmlydHVhbF9jYWxsKFJlZ2lzdGVyIHJlY2VpdmVyLCBSZWdpc3RlciBtZHAsIFJlZ2lzdGVyIHJlZzIpIHsKK3ZvaWQgSW50ZXJwcmV0ZXJNYWNyb0Fzc2VtYmxlcjo6cHJvZmlsZV92aXJ0dWFsX2NhbGwoUmVnaXN0ZXIgcmVjZWl2ZXIsIFJlZ2lzdGVyIG1kcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgcmVnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWNlaXZlcl9jYW5fYmVfbnVsbCkgewogICBpZiAoUHJvZmlsZUludGVycHJldGVyKSB7CiAgICAgTGFiZWwgcHJvZmlsZV9jb250aW51ZTsKIApAQCAtMTIyNCw4ICsxMjM5LDE1IEBACiAgICAgLy8gV2UgYXJlIG1ha2luZyBhIGNhbGwuICBJbmNyZW1lbnQgdGhlIGNvdW50LgogICAgIGluY3JlbWVudF9tZHBfZGF0YV9hdChtZHAsIGluX2J5dGVzKENvdW50ZXJEYXRhOjpjb3VudF9vZmZzZXQoKSkpOwogCisgICAgTGFiZWwgc2tpcF9yZWNlaXZlcl9wcm9maWxlOworICAgIGlmIChyZWNlaXZlcl9jYW5fYmVfbnVsbCkgeworICAgICAgdGVzdHB0cihyZWNlaXZlciwgcmVjZWl2ZXIpOworICAgICAgamNjKEFzc2VtYmxlcjo6emVybywgc2tpcF9yZWNlaXZlcl9wcm9maWxlKTsKKyAgICB9CisKICAgICAvLyBSZWNvcmQgdGhlIHJlY2VpdmVyIHR5cGUuCiAgICAgcmVjb3JkX2tsYXNzX2luX3Byb2ZpbGUocmVjZWl2ZXIsIG1kcCwgcmVnMik7CisgICAgYmluZChza2lwX3JlY2VpdmVyX3Byb2ZpbGUpOwogCiAgICAgLy8gVGhlIG1ldGhvZCBkYXRhIHBvaW50ZXIgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgdGFyZ2V0LgogICAgIHVwZGF0ZV9tZHBfYnlfY29uc3RhbnQobWRwLApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9pbnRlcnBfbWFzbV94ODZfMzIuaHBwIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9pbnRlcnBfbWFzbV94ODZfMzIuaHBwCmluZGV4IDM1MDBiNWYuLjIzYmNhNDEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vaW50ZXJwX21hc21feDg2XzMyLmhwcAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL2ludGVycF9tYXNtX3g4Nl8zMi5ocHAKQEAgLTc2LDggKzc2LDkgQEAKICAgdm9pZCBnZXRfY3Bvb2xfYW5kX3RhZ3MoUmVnaXN0ZXIgY3Bvb2wsIFJlZ2lzdGVyIHRhZ3MpICAgeyBnZXRfY29uc3RhbnRfcG9vbChjcG9vbCk7IG1vdnB0cih0YWdzLCBBZGRyZXNzKGNwb29sLCBjb25zdGFudFBvb2xPb3BEZXNjOjp0YWdzX29mZnNldF9pbl9ieXRlcygpKSk7CiAgIH0KICAgdm9pZCBnZXRfdW5zaWduZWRfMl9ieXRlX2luZGV4X2F0X2JjcChSZWdpc3RlciByZWcsIGludCBiY3Bfb2Zmc2V0KTsKLSAgdm9pZCBnZXRfY2FjaGVfYW5kX2luZGV4X2F0X2JjcChSZWdpc3RlciBjYWNoZSwgUmVnaXN0ZXIgaW5kZXgsIGludCBiY3Bfb2Zmc2V0KTsKLSAgdm9pZCBnZXRfY2FjaGVfZW50cnlfcG9pbnRlcl9hdF9iY3AoUmVnaXN0ZXIgY2FjaGUsIFJlZ2lzdGVyIHRtcCwgaW50IGJjcF9vZmZzZXQpOworICB2b2lkIGdldF9jYWNoZV9hbmRfaW5kZXhfYXRfYmNwKFJlZ2lzdGVyIGNhY2hlLCBSZWdpc3RlciBpbmRleCwgaW50IGJjcF9vZmZzZXQsIGJvb2wgZ2lhbnRfaW5kZXggPSBmYWxzZSk7CisgIHZvaWQgZ2V0X2NhY2hlX2VudHJ5X3BvaW50ZXJfYXRfYmNwKFJlZ2lzdGVyIGNhY2hlLCBSZWdpc3RlciB0bXAsIGludCBiY3Bfb2Zmc2V0LCBib29sIGdpYW50X2luZGV4ID0gZmFsc2UpOworICB2b2lkIGdldF9jYWNoZV9pbmRleF9hdF9iY3AoUmVnaXN0ZXIgaW5kZXgsIGludCBiY3Bfb2Zmc2V0LCBib29sIGdpYW50X2luZGV4ID0gZmFsc2UpOwogCiAgIC8vIEV4cHJlc3Npb24gc3RhY2sKICAgdm9pZCBmMmllZWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgZnRvcyB0byAzMmJpdHMKQEAgLTIyNiw3ICsyMjcsOCBAQAogICB2b2lkIHByb2ZpbGVfbm90X3Rha2VuX2JyYW5jaChSZWdpc3RlciBtZHApOwogICB2b2lkIHByb2ZpbGVfY2FsbChSZWdpc3RlciBtZHApOwogICB2b2lkIHByb2ZpbGVfZmluYWxfY2FsbChSZWdpc3RlciBtZHApOwotICB2b2lkIHByb2ZpbGVfdmlydHVhbF9jYWxsKFJlZ2lzdGVyIHJlY2VpdmVyLCBSZWdpc3RlciBtZHAsIFJlZ2lzdGVyIHNjcmF0Y2gyKTsKKyAgdm9pZCBwcm9maWxlX3ZpcnR1YWxfY2FsbChSZWdpc3RlciByZWNlaXZlciwgUmVnaXN0ZXIgbWRwLCBSZWdpc3RlciBzY3JhdGNoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlY2VpdmVyX2Nhbl9iZV9udWxsID0gZmFsc2UpOwogICB2b2lkIHByb2ZpbGVfcmV0KFJlZ2lzdGVyIHJldHVybl9iY2ksIFJlZ2lzdGVyIG1kcCk7CiAgIHZvaWQgcHJvZmlsZV9udWxsX3NlZW4oUmVnaXN0ZXIgbWRwKTsKICAgdm9pZCBwcm9maWxlX3R5cGVjaGVjayhSZWdpc3RlciBtZHAsIFJlZ2lzdGVyIGtsYXNzLCBSZWdpc3RlciBzY3JhdGNoKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVJbnRlcnByZXRlcl94ODZfMzIuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS90ZW1wbGF0ZUludGVycHJldGVyX3g4Nl8zMi5jcHAKaW5kZXggNTc2OTg3My4uMWYyMGVlNCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS90ZW1wbGF0ZUludGVycHJldGVyX3g4Nl8zMi5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS90ZW1wbGF0ZUludGVycHJldGVyX3g4Nl8zMi5jcHAKQEAgLTE1NiwxMyArMTU2LDIyIEBACiB9CiAKIAotYWRkcmVzcyBUZW1wbGF0ZUludGVycHJldGVyR2VuZXJhdG9yOjpnZW5lcmF0ZV9yZXR1cm5fZW50cnlfZm9yKFRvc1N0YXRlIHN0YXRlLCBpbnQgc3RlcCkgeworYWRkcmVzcyBUZW1wbGF0ZUludGVycHJldGVyR2VuZXJhdG9yOjpnZW5lcmF0ZV9yZXR1cm5fZW50cnlfZm9yKFRvc1N0YXRlIHN0YXRlLCBpbnQgc3RlcCwgYm9vbCB1bmJveCkgeworICBUb3NTdGF0ZSBpbmNvbWluZ19zdGF0ZSA9IHN0YXRlOworICBpZiAoRW5hYmxlSW52b2tlRHluYW1pYykgeworICAgIGlmICh1bmJveCkgeworICAgICAgaW5jb21pbmdfc3RhdGUgPSBhdG9zOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoIXVuYm94LCAib2xkIGJlaGF2aW9yIik7CisgIH0KKwogICBMYWJlbCBpbnRlcnByZXRlcl9lbnRyeTsKICAgYWRkcmVzcyBjb21waWxlZF9lbnRyeSA9IF9fIHBjKCk7CiAKICNpZmRlZiBDT01QSUxFUjIKICAgLy8gVGhlIEZQVSBzdGFjayBpcyBjbGVhbiBpZiBVc2VTU0UgPj0gMiBidXQgbXVzdCBiZSBjbGVhbmVkIGluIG90aGVyIGNhc2VzCi0gIGlmICgoc3RhdGUgPT0gZnRvcyAmJiBVc2VTU0UgPCAxKSB8fCAoc3RhdGUgPT0gZHRvcyAmJiBVc2VTU0UgPCAyKSkgeworICBpZiAoKGluY29taW5nX3N0YXRlID09IGZ0b3MgJiYgVXNlU1NFIDwgMSkgfHwgKGluY29taW5nX3N0YXRlID09IGR0b3MgJiYgVXNlU1NFIDwgMikpIHsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDg7IGkrKykgewogICAgICAgICBfXyBmZnJlZShpKTsKICAgICB9CkBAIC0xNzAsNyArMTc5LDcgQEAKICAgICBfXyBlbXB0eV9GUFVfc3RhY2soKTsKICAgfQogI2VuZGlmCi0gIGlmICgoc3RhdGUgPT0gZnRvcyAmJiBVc2VTU0UgPCAxKSB8fCAoc3RhdGUgPT0gZHRvcyAmJiBVc2VTU0UgPCAyKSkgeworICBpZiAoKGluY29taW5nX3N0YXRlID09IGZ0b3MgJiYgVXNlU1NFIDwgMSkgfHwgKGluY29taW5nX3N0YXRlID09IGR0b3MgJiYgVXNlU1NFIDwgMikpIHsKICAgICBfXyBNYWNyb0Fzc2VtYmxlcjo6dmVyaWZ5X0ZQVSgxLCAiZ2VuZXJhdGVfcmV0dXJuX2VudHJ5X2ZvciBjb21waWxlZCIpOwogICB9IGVsc2UgewogICAgIF9fIE1hY3JvQXNzZW1ibGVyOjp2ZXJpZnlfRlBVKDAsICJnZW5lcmF0ZV9yZXR1cm5fZW50cnlfZm9yIGNvbXBpbGVkIik7CkBAIC0xODYsMTIgKzE5NSwxMiBAQAogCiAgIC8vIEluIFNTRSBtb2RlLCBpbnRlcnByZXRlciByZXR1cm5zIEZQIHJlc3VsdHMgaW4geG1tMCBidXQgdGhleSBuZWVkCiAgIC8vIHRvIGVuZCB1cCBiYWNrIG9uIHRoZSBGUFUgc28gaXQgY2FuIG9wZXJhdGUgb24gdGhlbS4KLSAgaWYgKHN0YXRlID09IGZ0b3MgJiYgVXNlU1NFID49IDEpIHsKKyAgaWYgKGluY29taW5nX3N0YXRlID09IGZ0b3MgJiYgVXNlU1NFID49IDEpIHsKICAgICBfXyBzdWJwdHIocnNwLCB3b3JkU2l6ZSk7CiAgICAgX18gbW92Zmx0KEFkZHJlc3MocnNwLCAwKSwgeG1tMCk7CiAgICAgX18gZmxkX3MoQWRkcmVzcyhyc3AsIDApKTsKICAgICBfXyBhZGRwdHIocnNwLCB3b3JkU2l6ZSk7Ci0gIH0gZWxzZSBpZiAoc3RhdGUgPT0gZHRvcyAmJiBVc2VTU0UgPj0gMikgeworICB9IGVsc2UgaWYgKGluY29taW5nX3N0YXRlID09IGR0b3MgJiYgVXNlU1NFID49IDIpIHsKICAgICBfXyBzdWJwdHIocnNwLCAyKndvcmRTaXplKTsKICAgICBfXyBtb3ZkYmwoQWRkcmVzcyhyc3AsIDApLCB4bW0wKTsKICAgICBfXyBmbGRfZChBZGRyZXNzKHJzcCwgMCkpOwpAQCAtMjA3LDEzICsyMTYsMTAyIEBACiAKICAgX18gcmVzdG9yZV9iY3AoKTsKICAgX18gcmVzdG9yZV9sb2NhbHMoKTsKLSAgX18gZ2V0X2NhY2hlX2FuZF9pbmRleF9hdF9iY3AocmJ4LCByY3gsIDEpOworCisgIExhYmVsIExfZmFpbDsKKworICBpZiAodW5ib3ggJiYgc3RhdGUgIT0gYXRvcykgeworICAgIC8vIGNhc3QgYW5kIHVuYm94CisgICAgQmFzaWNUeXBlIHR5cGUgPSBhc19CYXNpY1R5cGUoc3RhdGUpOworICAgIGlmICh0eXBlID09IFRfQllURSkgIHR5cGUgPSBUX0JPT0xFQU47IC8vIEZJWE1FCisgICAgS2xhc3NIYW5kbGUgYm94ayA9IFN5c3RlbURpY3Rpb25hcnlIYW5kbGVzOjpib3hfa2xhc3ModHlwZSk7CisgICAgX18gbW92MzIocmJ4LCBFeHRlcm5hbEFkZHJlc3MoKGFkZHJlc3MpIGJveGsucmF3X3ZhbHVlKCkpKTsKKyAgICBfXyB0ZXN0bChyYXgsIHJheCk7CisgICAgTGFiZWwgTF9nb3RfdmFsdWUsIExfZ2V0X3ZhbHVlOworICAgIC8vIGNvbnZlcnQgbnVsbHMgdG8gemVyb2VzIChhdm9pZCBOUEVzIGhlcmUpCisgICAgaWYgKCEodHlwZSA9PSBUX0ZMT0FUIHx8IHR5cGUgPT0gVF9ET1VCTEUpKSB7CisgICAgICAvLyBpZiByYXggYWxyZWFkeSBjb250YWlucyB6ZXJvIGJpdHMsIGZvcmdlIGFoZWFkCisgICAgICBfXyBqY2MoQXNzZW1ibGVyOjp6ZXJvLCBMX2dvdF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9fIGpjYyhBc3NlbWJsZXI6Om5vdFplcm8sIExfZ2V0X3ZhbHVlKTsKKyAgICAgIF9fIGZsZHooKTsKKyAgICAgIF9fIGptcChMX2dvdF92YWx1ZSk7CisgICAgfQorICAgIF9fIGJpbmQoTF9nZXRfdmFsdWUpOworICAgIF9fIGNtcDMyKHJieCwgQWRkcmVzcyhyYXgsIG9vcERlc2M6OmtsYXNzX29mZnNldF9pbl9ieXRlcygpKSk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6bm90RXF1YWwsIExfZmFpbCk7CisgICAgaW50IG9mZnNldCA9IGphdmFfbGFuZ19ib3hpbmdfb2JqZWN0Ojp2YWx1ZV9vZmZzZXRfaW5fYnl0ZXModHlwZSk7CisgICAgLy8gQ2YuIFRlbXBsYXRlVGFibGU6OmdldGZpZWxkX29yX3N0YXRpYworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBUX0JZVEU6ICAgICAvLyBmYWxsIHRocm91Z2g6CisgICAgICBjYXNlIFRfQk9PTEVBTjogIF9fIGxvYWRfc2lnbmVkX2J5dGUocmF4LCBBZGRyZXNzKHJheCwgb2Zmc2V0KSk7ICAgIGJyZWFrOworICAgICAgY2FzZSBUX0NIQVI6ICAgICBfXyBsb2FkX3Vuc2lnbmVkX3Nob3J0KHJheCwgQWRkcmVzcyhyYXgsIG9mZnNldCkpOyBicmVhazsKKyAgICAgIGNhc2UgVF9TSE9SVDogICAgX18gbG9hZF9zaWduZWRfc2hvcnQocmF4LCBBZGRyZXNzKHJheCwgb2Zmc2V0KSk7ICAgYnJlYWs7CisgICAgICBjYXNlIFRfSU5UOiAgICAgIF9fIG1vdmwocmF4LCBBZGRyZXNzKHJheCwgb2Zmc2V0KSk7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUX0ZMT0FUOiAgICBfXyBmbGRfcyhBZGRyZXNzKHJheCwgb2Zmc2V0KSk7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVF9ET1VCTEU6ICAgX18gZmxkX2QoQWRkcmVzcyhyYXgsIG9mZnNldCkpOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAvLyBBY2Nlc3MgdG8gamF2YS5sYW5nLkRvdWJsZS52YWx1ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGF0b21pYzoKKyAgICAgIGNhc2UgVF9MT05HOiAgIHsgX18gbW92bChyZHgsIEFkZHJlc3MocmF4LCBvZmZzZXQgKyA0KSk7CisgICAgICAgICAgICAgICAgICAgICAgIF9fIG1vdmwocmF4LCBBZGRyZXNzKHJheCwgb2Zmc2V0ICsgMCkpOyAgfSAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogU2hvdWxkTm90UmVhY2hIZXJlKCk7CisgICAgfQorICAgIF9fIGJpbmQoTF9nb3RfdmFsdWUpOworICB9CisKKyAgTGFiZWwgTF9nb3RfY2FjaGUsIExfZ2lhbnRfaW5kZXg7CisgIGlmIChFbmFibGVJbnZva2VEeW5hbWljKSB7CisgICAgX18gY21wYihBZGRyZXNzKHJzaSwgMCksIEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWMpOworICAgIF9fIGpjYyhBc3NlbWJsZXI6OmVxdWFsLCBMX2dpYW50X2luZGV4KTsKKyAgfQorICBfXyBnZXRfY2FjaGVfYW5kX2luZGV4X2F0X2JjcChyYngsIHJjeCwgMSwgZmFsc2UpOworICBfXyBiaW5kKExfZ290X2NhY2hlKTsKKyAgaWYgKHVuYm94ICYmIHN0YXRlID09IGF0b3MpIHsKKyAgICAvLyBpbnNlcnQgYSBjYXN0aW5nIGNvbnZlcnNpb24sIHRvIGtlZXAgdmVyaWZpZXIgc2FuZQorICAgIExhYmVsIExfb2ssIExfb2tfcG9wczsKKyAgICBfXyB0ZXN0bChyYXgsIHJheCk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6emVybywgTF9vayk7CisgICAgX18gcHVzaChyYXgpOyAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIG9iamVjdCB0byBjaGVjaworICAgIF9fIHB1c2gocmJ4KTsgICAgICAgICAgICAgICAvLyBzYXZlIENQIGNhY2hlIHJlZmVyZW5jZQorICAgIF9fIG1vdmwocmR4LCBBZGRyZXNzKHJheCwgb29wRGVzYzo6a2xhc3Nfb2Zmc2V0X2luX2J5dGVzKCkpKTsKKyAgICBfXyBtb3ZsKHJieCwgQWRkcmVzcyhyYngsIHJjeCwKKyAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzOjp0aW1lc180LCBjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmJhc2Vfb2Zmc2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmYxX29mZnNldCgpKSk7CisgICAgX18gbW92bChyYngsIEFkZHJlc3MocmJ4LCBfXyBkZWxheWVkX3ZhbHVlKHN1bl9keW5fQ2FsbFNpdGVJbXBsOjp0eXBlX29mZnNldF9pbl9ieXRlcywgcmN4KSkpOworICAgIF9fIG1vdmwocmJ4LCBBZGRyZXNzKHJieCwgX18gZGVsYXllZF92YWx1ZShqYXZhX2R5bl9NZXRob2RUeXBlOjpydHlwZV9vZmZzZXRfaW5fYnl0ZXMsIHJjeCkpKTsKKyAgICBfXyBtb3ZsKHJheCwgQWRkcmVzcyhyYngsIF9fIGRlbGF5ZWRfdmFsdWUoamF2YV9sYW5nX0NsYXNzOjprbGFzc19vZmZzZXRfaW5fYnl0ZXMsIHJjeCkpKTsKKyAgICBfXyBjaGVja19rbGFzc19zdWJ0eXBlKHJkeCwgcmF4LCByYngsIExfb2tfcG9wcyk7CisgICAgX18gcG9wKHJjeCk7ICAgICAgICAgICAgICAgIC8vIHBvcCBhbmQgZGlzY2FyZCBDUCBjYWNoZQorICAgIF9fIG1vdihyYngsIHJheCk7ICAgICAgICAgICAvLyB0YXJnZXQgc3VwZXJ0eXBlIGludG8gcmJ4IGZvciBMX2ZhaWwKKyAgICBfXyBwb3AocmF4KTsgICAgICAgICAgICAgICAgLy8gZmFpbGVkIG9iamVjdCBpbnRvIHJheCBmb3IgTF9mYWlsCisgICAgX18gam1wKExfZmFpbCk7CisKKyAgICBfXyBiaW5kKExfb2tfcG9wcyk7CisgICAgLy8gcmVzdG9yZSBwdXNoZWQgdGVtcCByZWdzOgorICAgIF9fIHBvcChyYngpOworICAgIF9fIHBvcChyYXgpOworICAgIF9fIGJpbmQoTF9vayk7CisgIH0KICAgX18gbW92bChyYngsIEFkZHJlc3MocmJ4LCByY3gsCiAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3M6OnRpbWVzX3B0ciwgY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjpiYXNlX29mZnNldCgpICsKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6ZmxhZ3Nfb2Zmc2V0KCkpKTsKICAgX18gYW5kcHRyKHJieCwgMHhGRik7CiAgIF9fIGxlYShyc3AsIEFkZHJlc3MocnNwLCByYngsIEludGVycHJldGVyOjpzdGFja0VsZW1lbnRTY2FsZSgpKSk7CiAgIF9fIGRpc3BhdGNoX25leHQoc3RhdGUsIHN0ZXApOworCisgIC8vIG91dCBvZiB0aGUgbWFpbiBsaW5lIG9mIGNvZGUuLi4KKyAgaWYgKEVuYWJsZUludm9rZUR5bmFtaWMpIHsKKyAgICBfXyBiaW5kKExfZ2lhbnRfaW5kZXgpOworICAgIF9fIGdldF9jYWNoZV9hbmRfaW5kZXhfYXRfYmNwKHJieCwgcmN4LCAxLCB0cnVlKTsKKyAgICBfXyBqbXAoTF9nb3RfY2FjaGUpOworCisgICAgaWYgKHVuYm94KSB7CisgICAgICBfXyBiaW5kKExfZmFpbCk7CisgICAgICBfXyBwdXNoKHJieCk7ICAgICAgICAgICAgIC8vIG1pc3NlZCBrbGFzcyAocmVxdWlyZWQpCisgICAgICBfXyBwdXNoKHJheCk7ICAgICAgICAgICAgIC8vIGJhZCBvYmplY3QgKGFjdHVhbCkKKyAgICAgIF9fIG1vdnB0cihyZHgsIEV4dGVybmFsQWRkcmVzcygoYWRkcmVzcykgJkludGVycHJldGVyOjpfdGhyb3dfV3JvbmdNZXRob2RUeXBlX2VudHJ5KSk7CisgICAgICBfXyBjYWxsKHJkeCk7CisgICAgfQorICB9CisKICAgcmV0dXJuIGVudHJ5OwogfQogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3RlbXBsYXRlSW50ZXJwcmV0ZXJfeDg2XzY0LmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVJbnRlcnByZXRlcl94ODZfNjQuY3BwCmluZGV4IGNkOWQwODkuLjRmMGMzYzkgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVJbnRlcnByZXRlcl94ODZfNjQuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVJbnRlcnByZXRlcl94ODZfNjQuY3BwCkBAIC0xNjYsNyArMTY2LDggQEAKIAogCiBhZGRyZXNzIFRlbXBsYXRlSW50ZXJwcmV0ZXJHZW5lcmF0b3I6OmdlbmVyYXRlX3JldHVybl9lbnRyeV9mb3IoVG9zU3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgYm9vbCB1bmJveCkgeworICBhc3NlcnQoIXVuYm94LCAiTllJIik7Ly82ODE1NjkyLy8KIAogICAvLyBhbWQ2NCBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBhYm91dCBjb21waWxlZCByZXR1cm5zCiAgIC8vIHRvIHRoZSBpbnRlcnByZXRlciBzbyB0aGUgY29kZSB0aGF0IGV4aXN0cyBvbiB4ODYgdG8gcGxhY2UgYSBzZW50aW5lbApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS90ZW1wbGF0ZVRhYmxlX3g4Nl8zMi5jcHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3RlbXBsYXRlVGFibGVfeDg2XzMyLmNwcAppbmRleCA3YzQwZTQxLi41MGFlMzE5IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3RlbXBsYXRlVGFibGVfeDg2XzMyLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3RlbXBsYXRlVGFibGVfeDg2XzMyLmNwcApAQCAtMjA2LDEyICsyMDYsMTIgQEAKICAgICBfXyBjYWxsX1ZNKG5vcmVnLCBDQVNUX0ZST01fRk5fUFRSKGFkZHJlc3MsIEludGVycHJldGVyUnVudGltZTo6c2V0X29yaWdpbmFsX2J5dGVjb2RlX2F0KSwgc2NyYXRjaCwgcnNpLCBiYyk7CiAjaWZuZGVmIEFTU0VSVAogICAgIF9fIGptcGIocGF0Y2hfZG9uZSk7Ci0gICAgX18gYmluZChmYXN0X3BhdGNoKTsKLSAgfQogI2Vsc2UKICAgICBfXyBqbXAocGF0Y2hfZG9uZSk7CisjZW5kaWYKICAgICBfXyBiaW5kKGZhc3RfcGF0Y2gpOwogICB9CisjaWZkZWYgQVNTRVJUCiAgIExhYmVsIG9rYXk7CiAgIF9fIGxvYWRfdW5zaWduZWRfYnl0ZShzY3JhdGNoLCBhdF9iY3AoMCkpOwogICBfXyBjbXBsKHNjcmF0Y2gsIChpbnQpQnl0ZWNvZGVzOjpqYXZhX2NvZGUoYnl0ZWNvZGUpKTsKQEAgLTIxMDUsNiArMjEwNSw3IEBACiAKIHZvaWQgVGVtcGxhdGVUYWJsZTo6cmVzb2x2ZV9jYWNoZV9hbmRfaW5kZXgoaW50IGJ5dGVfbm8sIFJlZ2lzdGVyIFJjYWNoZSwgUmVnaXN0ZXIgaW5kZXgpIHsKICAgYXNzZXJ0KGJ5dGVfbm8gPT0gMSB8fCBieXRlX25vID09IDIsICJieXRlX25vIG91dCBvZiByYW5nZSIpOworICBib29sIGlzX2ludm9rZWR5bmFtaWMgPSAoYnl0ZWNvZGUoKSA9PSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljKTsKIAogICBSZWdpc3RlciB0ZW1wID0gcmJ4OwogCkBAIC0yMTEyLDE2ICsyMTEzLDE5IEBACiAKICAgY29uc3QgaW50IHNoaWZ0X2NvdW50ID0gKDEgKyBieXRlX25vKSpCaXRzUGVyQnl0ZTsKICAgTGFiZWwgcmVzb2x2ZWQ7Ci0gIF9fIGdldF9jYWNoZV9hbmRfaW5kZXhfYXRfYmNwKFJjYWNoZSwgaW5kZXgsIDEpOwotICBfXyBtb3ZsKHRlbXAsIEFkZHJlc3MoUmNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzczo6dGltZXNfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmJhc2Vfb2Zmc2V0KCkgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjppbmRpY2VzX29mZnNldCgpKSk7Ci0gIF9fIHNocmwodGVtcCwgc2hpZnRfY291bnQpOwotICAvLyBoYXZlIHdlIHJlc29sdmVkIHRoaXMgYnl0ZWNvZGU/Ci0gIF9fIGFuZHB0cih0ZW1wLCAweEZGKTsKLSAgX18gY21wbCh0ZW1wLCAoaW50KWJ5dGVjb2RlKCkpOwotICBfXyBqY2MoQXNzZW1ibGVyOjplcXVhbCwgcmVzb2x2ZWQpOworICBfXyBnZXRfY2FjaGVfYW5kX2luZGV4X2F0X2JjcChSY2FjaGUsIGluZGV4LCAxLCBpc19pbnZva2VkeW5hbWljKTsKKyAgaWYgKGlzX2ludm9rZWR5bmFtaWMpIHsKKyAgICAvLyB3ZSBhcmUgcmVzb2x2ZWQgaWYgdGhlIGYxIGZpZWxkIGNvbnRhaW5zIGEgbm9uLW51bGwgQ2FsbFNpdGUgb2JqZWN0CisgICAgX18gY21wcHRyKEFkZHJlc3MoUmNhY2hlLCBpbmRleCwgQWRkcmVzczo6dGltZXNfcHRyLCBjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmJhc2Vfb2Zmc2V0KCkgKyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpmMV9vZmZzZXQoKSksIChpbnQzMl90KSBOVUxMX1dPUkQpOworICAgIF9fIGpjYyhBc3NlbWJsZXI6Om5vdEVxdWFsLCByZXNvbHZlZCk7CisgIH0gZWxzZSB7CisgICAgX18gbW92bCh0ZW1wLCBBZGRyZXNzKFJjYWNoZSwgaW5kZXgsIEFkZHJlc3M6OnRpbWVzXzQsIGNvbnN0YW50UG9vbENhY2hlT29wRGVzYzo6YmFzZV9vZmZzZXQoKSArIENvbnN0YW50UG9vbENhY2hlRW50cnk6OmluZGljZXNfb2Zmc2V0KCkpKTsKKyAgICBfXyBzaHJsKHRlbXAsIHNoaWZ0X2NvdW50KTsKKyAgICAvLyBoYXZlIHdlIHJlc29sdmVkIHRoaXMgYnl0ZWNvZGU/CisgICAgX18gYW5kbCh0ZW1wLCAweEZGKTsKKyAgICBfXyBjbXBsKHRlbXAsIChpbnQpYnl0ZWNvZGUoKSk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6ZXF1YWwsIHJlc29sdmVkKTsKKyAgfQogCiAgIC8vIHJlc29sdmUgZmlyc3QgdGltZSB0aHJvdWdoCiAgIGFkZHJlc3MgZW50cnk7CkBAIC0yMTM0LDEyICsyMTM4LDEzIEBACiAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsICA6IC8vIGZhbGwgdGhyb3VnaAogICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljICAgOiAvLyBmYWxsIHRocm91Z2gKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWludGVyZmFjZTogZW50cnkgPSBDQVNUX0ZST01fRk5fUFRSKGFkZHJlc3MsIEludGVycHJldGVyUnVudGltZTo6cmVzb2x2ZV9pbnZva2UpOyAgYnJlYWs7CisgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljICA6IGVudHJ5ID0gQ0FTVF9GUk9NX0ZOX1BUUihhZGRyZXNzLCBJbnRlcnByZXRlclJ1bnRpbWU6OnJlc29sdmVfaW52b2tlZHluYW1pYyk7IGJyZWFrOwogICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgOiBTaG91bGROb3RSZWFjaEhlcmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgfQogICBfXyBtb3ZsKHRlbXAsIChpbnQpYnl0ZWNvZGUoKSk7CiAgIF9fIGNhbGxfVk0obm9yZWcsIGVudHJ5LCB0ZW1wKTsKICAgLy8gVXBkYXRlIHJlZ2lzdGVycyB3aXRoIHJlc29sdmVkIGluZm8KLSAgX18gZ2V0X2NhY2hlX2FuZF9pbmRleF9hdF9iY3AoUmNhY2hlLCBpbmRleCwgMSk7CisgIF9fIGdldF9jYWNoZV9hbmRfaW5kZXhfYXRfYmNwKFJjYWNoZSwgaW5kZXgsIDEsIGlzX2ludm9rZWR5bmFtaWMpOwogICBfXyBiaW5kKHJlc29sdmVkKTsKIH0KIApAQCAtMjg4NCwxMiArMjg4OSwxNyBAQAogfQogCiAKLXZvaWQgVGVtcGxhdGVUYWJsZTo6cHJlcGFyZV9pbnZva2UoUmVnaXN0ZXIgbWV0aG9kLCBSZWdpc3RlciBpbmRleCwgaW50IGJ5dGVfbm8sIEJ5dGVjb2Rlczo6Q29kZSBjb2RlKSB7Cit2b2lkIFRlbXBsYXRlVGFibGU6OnByZXBhcmVfaW52b2tlKFJlZ2lzdGVyIG1ldGhvZCwgUmVnaXN0ZXIgaW5kZXgsIGludCBieXRlX25vKSB7CisgIGJvb2wgaXNfaW52ZHluX2Jvb3RzdHJhcCA9IChieXRlX25vIDwgMCk7CisgIGlmIChpc19pbnZkeW5fYm9vdHN0cmFwKSAgYnl0ZV9ubyA9IC1ieXRlX25vOworCiAgIC8vIGRldGVybWluZSBmbGFncworICBCeXRlY29kZXM6OkNvZGUgY29kZSA9IGJ5dGVjb2RlKCk7CiAgIGNvbnN0IGJvb2wgaXNfaW52b2tlaW50ZXJmYWNlICA9IGNvZGUgPT0gQnl0ZWNvZGVzOjpfaW52b2tlaW50ZXJmYWNlOworICBjb25zdCBib29sIGlzX2ludm9rZWR5bmFtaWMgICAgPSBjb2RlID09IEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWM7CiAgIGNvbnN0IGJvb2wgaXNfaW52b2tldmlydHVhbCAgICA9IGNvZGUgPT0gQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDsKICAgY29uc3QgYm9vbCBpc19pbnZva2VzcGVjaWFsICAgID0gY29kZSA9PSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsOwotICBjb25zdCBib29sIGxvYWRfcmVjZWl2ZXIgICAgICAgPSBjb2RlICE9IEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYzsKKyAgY29uc3QgYm9vbCBsb2FkX3JlY2VpdmVyICAgICAgPSAoY29kZSAhPSBCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWMgJiYgY29kZSAhPSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljKTsKICAgY29uc3QgYm9vbCByZWNlaXZlcl9udWxsX2NoZWNrID0gaXNfaW52b2tlc3BlY2lhbDsKICAgY29uc3QgYm9vbCBzYXZlX2ZsYWdzID0gaXNfaW52b2tlaW50ZXJmYWNlIHx8IGlzX2ludm9rZXZpcnR1YWw7CiAgIC8vIHNldHVwIHJlZ2lzdGVycyAmIGFjY2VzcyBjb25zdGFudCBwb29sIGNhY2hlCkBAIC0yODk3LDYgKzI5MDcsOCBAQAogICBjb25zdCBSZWdpc3RlciBmbGFncyAgPSByZHg7CiAgIGFzc2VydF9kaWZmZXJlbnRfcmVnaXN0ZXJzKG1ldGhvZCwgaW5kZXgsIHJlY3YsIGZsYWdzKTsKIAorICBhc3NlcnQoIWlzX2ludmR5bl9ib290c3RyYXAgfHwgaXNfaW52b2tlZHluYW1pYywgImJ5dGVfbm88MCBoYWNrIG9ubHkgZm9yIGludmR5biIpOworCiAgIC8vIHNhdmUgJ2ludGVycHJldGVyIHJldHVybiBhZGRyZXNzJwogICBfXyBzYXZlX2JjcCgpOwogCkBAIC0yOTA3LDggKzI5MTksMTMgQEAKICAgICBfXyBtb3ZsKHJlY3YsIGZsYWdzKTsKICAgICBfXyBhbmRsKHJlY3YsIDB4RkYpOwogICAgIC8vIHJlY3YgY291bnQgaXMgMCBiYXNlZD8KLSAgICBfXyBtb3ZwdHIocmVjdiwgQWRkcmVzcyhyc3AsIHJlY3YsIEludGVycHJldGVyOjpzdGFja0VsZW1lbnRTY2FsZSgpLCAtSW50ZXJwcmV0ZXI6OmV4cHJfb2Zmc2V0X2luX2J5dGVzKDEpKSk7Ci0gICAgX18gdmVyaWZ5X29vcChyZWN2KTsKKyAgICBBZGRyZXNzIHJlY3ZfYWRkcihyc3AsIHJlY3YsIEludGVycHJldGVyOjpzdGFja0VsZW1lbnRTY2FsZSgpLCAtSW50ZXJwcmV0ZXI6OmV4cHJfb2Zmc2V0X2luX2J5dGVzKDEpKTsKKyAgICBpZiAoaXNfaW52b2tlZHluYW1pYykgeworICAgICAgX18gbGVhKHJlY3YsIHJlY3ZfYWRkcik7CisgICAgfSBlbHNlIHsKKyAgICAgIF9fIG1vdnB0cihyZWN2LCByZWN2X2FkZHIpOworICAgICAgX18gdmVyaWZ5X29vcChyZWN2KTsKKyAgICB9CiAgIH0KIAogICAvLyBkbyBudWxsIGNoZWNrIGlmIG5lZWRlZApAQCAtMjkyNiw4ICsyOTQzLDE0IEBACiAgIENvbnN0YW50UG9vbENhY2hlRW50cnk6OnZlcmlmeV90b3NCaXRzKCk7CiAgIC8vIGxvYWQgcmV0dXJuIGFkZHJlc3MKICAgewotICAgIEV4dGVybmFsQWRkcmVzcyB0YWJsZShpc19pbnZva2VpbnRlcmZhY2UgPyAoYWRkcmVzcylJbnRlcnByZXRlcjo6cmV0dXJuXzVfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyZXNzKUludGVycHJldGVyOjpyZXR1cm5fM19hZGRyc19ieV9pbmRleF90YWJsZSgpKTsKKyAgICBhZGRyZXNzIHRhYmxlX2FkZHI7CisgICAgaWYgKGlzX2ludmR5bl9ib290c3RyYXApCisgICAgICB0YWJsZV9hZGRyID0gKGFkZHJlc3MpSW50ZXJwcmV0ZXI6OnJldHVybl81X3VuYm94X2FkZHJzX2J5X2luZGV4X3RhYmxlKCk7CisgICAgZWxzZSBpZiAoaXNfaW52b2tlaW50ZXJmYWNlIHx8IGlzX2ludm9rZWR5bmFtaWMpCisgICAgICB0YWJsZV9hZGRyID0gKGFkZHJlc3MpSW50ZXJwcmV0ZXI6OnJldHVybl81X2FkZHJzX2J5X2luZGV4X3RhYmxlKCk7CisgICAgZWxzZQorICAgICAgdGFibGVfYWRkciA9IChhZGRyZXNzKUludGVycHJldGVyOjpyZXR1cm5fM19hZGRyc19ieV9pbmRleF90YWJsZSgpOworICAgIEV4dGVybmFsQWRkcmVzcyB0YWJsZSh0YWJsZV9hZGRyKTsKICAgICBfXyBtb3ZwdHIoZmxhZ3MsIEFycmF5QWRkcmVzcyh0YWJsZSwgQWRkcmVzcyhub3JlZywgZmxhZ3MsIEFkZHJlc3M6OnRpbWVzX3B0cikpKTsKICAgfQogCkBAIC0yOTkwLDcgKzMwMTMsNyBAQAogCiB2b2lkIFRlbXBsYXRlVGFibGU6Omludm9rZXZpcnR1YWwoaW50IGJ5dGVfbm8pIHsKICAgdHJhbnNpdGlvbih2dG9zLCB2dG9zKTsKLSAgcHJlcGFyZV9pbnZva2UocmJ4LCBub3JlZywgYnl0ZV9ubywgYnl0ZWNvZGUoKSk7CisgIHByZXBhcmVfaW52b2tlKHJieCwgbm9yZWcsIGJ5dGVfbm8pOwogCiAgIC8vIHJieCw6IGluZGV4CiAgIC8vIHJjeDogcmVjZWl2ZXIKQEAgLTMwMDIsNyArMzAyNSw3IEBACiAKIHZvaWQgVGVtcGxhdGVUYWJsZTo6aW52b2tlc3BlY2lhbChpbnQgYnl0ZV9ubykgewogICB0cmFuc2l0aW9uKHZ0b3MsIHZ0b3MpOwotICBwcmVwYXJlX2ludm9rZShyYngsIG5vcmVnLCBieXRlX25vLCBieXRlY29kZSgpKTsKKyAgcHJlcGFyZV9pbnZva2UocmJ4LCBub3JlZywgYnl0ZV9ubyk7CiAgIC8vIGRvIHRoZSBjYWxsCiAgIF9fIHZlcmlmeV9vb3AocmJ4KTsKICAgX18gcHJvZmlsZV9jYWxsKHJheCk7CkBAIC0zMDEyLDcgKzMwMzUsNyBAQAogCiB2b2lkIFRlbXBsYXRlVGFibGU6Omludm9rZXN0YXRpYyhpbnQgYnl0ZV9ubykgewogICB0cmFuc2l0aW9uKHZ0b3MsIHZ0b3MpOwotICBwcmVwYXJlX2ludm9rZShyYngsIG5vcmVnLCBieXRlX25vLCBieXRlY29kZSgpKTsKKyAgcHJlcGFyZV9pbnZva2UocmJ4LCBub3JlZywgYnl0ZV9ubyk7CiAgIC8vIGRvIHRoZSBjYWxsCiAgIF9fIHZlcmlmeV9vb3AocmJ4KTsKICAgX18gcHJvZmlsZV9jYWxsKHJheCk7CkBAIC0zMDI4LDcgKzMwNTEsNyBAQAogCiB2b2lkIFRlbXBsYXRlVGFibGU6Omludm9rZWludGVyZmFjZShpbnQgYnl0ZV9ubykgewogICB0cmFuc2l0aW9uKHZ0b3MsIHZ0b3MpOwotICBwcmVwYXJlX2ludm9rZShyYXgsIHJieCwgYnl0ZV9ubywgYnl0ZWNvZGUoKSk7CisgIHByZXBhcmVfaW52b2tlKHJheCwgcmJ4LCBieXRlX25vKTsKIAogICAvLyByYXgsOiBJbnRlcmZhY2UKICAgLy8gcmJ4LDogaW5kZXgKQEAgLTMxMDIsNiArMzEyNSw4NCBAQAogICBfXyBzaG91bGRfbm90X3JlYWNoX2hlcmUoKTsKIH0KIAordm9pZCBUZW1wbGF0ZVRhYmxlOjppbnZva2VkeW5hbWljKGludCBieXRlX25vKSB7CisgIHRyYW5zaXRpb24odnRvcywgdnRvcyk7CisKKyAgaWYgKCFFbmFibGVJbnZva2VEeW5hbWljKSB7CisgICAgLy8gV2Ugc2hvdWxkIG5vdCBlbmNvdW50ZXIgdGhpcyBieXRlY29kZSBpZiAhRW5hYmxlSW52b2tlRHluYW1pYy4KKyAgICAvLyBUaGUgdmVyaWZpZXIgd2lsbCBzdG9wIGl0LiAgSG93ZXZlciwgaWYgd2UgZ2V0IHBhc3QgdGhlIHZlcmlmaWVyLAorICAgIC8vIHRoaXMgd2lsbCBzdG9wIHRoZSB0aHJlYWQgaW4gYSByZWFzb25hYmxlIHdheSwgd2l0aG91dCBjcmFzaGluZyB0aGUgSlZNLgorICAgIF9fIGNhbGxfVk0obm9yZWcsIENBU1RfRlJPTV9GTl9QVFIoYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgIEludGVycHJldGVyUnVudGltZTo6dGhyb3dfSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcikpOworICAgIC8vIHRoZSBjYWxsX1ZNIGNoZWNrcyBmb3IgZXhjZXB0aW9uLCBzbyB3ZSBzaG91bGQgbmV2ZXIgcmV0dXJuIGhlcmUuCisgICAgX18gc2hvdWxkX25vdF9yZWFjaF9oZXJlKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJlcGFyZV9pbnZva2UocmF4LCByYngsIGJ5dGVfbm8pOworCisgIC8vIHJheDogQ2FsbFNpdGUgb2JqZWN0IChmMSkKKyAgLy8gcmJ4OiB1bnVzZWQgKGYyKQorICAvLyByY3g6IHJlY2VpdmVyIGFkZHJlc3MKKyAgLy8gcmR4OiBmbGFncyAodW51c2VkKQorCisgIGlmIChQcm9maWxlSW50ZXJwcmV0ZXIpIHsKKyAgICBMYWJlbCBMOworICAgIC8vICUlJSBzaG91bGQgbWFrZSBhIHR5cGUgcHJvZmlsZSBmb3IgYW55IGludm9rZWR5bmFtaWMgdGhhdCB0YWtlcyBhIHJlZiBhcmd1bWVudAorICAgIC8vIHByb2ZpbGUgdGhpcyBjYWxsCisgICAgX18gcHJvZmlsZV9jYWxsKHJzaSk7CisgIH0KKworICBMYWJlbCBoYW5kbGVfdW5saW5rZWRfc2l0ZTsKKyAgX18gbW92cHRyKHJjeCwgQWRkcmVzcyhyYXgsIF9fIGRlbGF5ZWRfdmFsdWUoc3VuX2R5bl9DYWxsU2l0ZUltcGw6OnRhcmdldF9vZmZzZXRfaW5fYnl0ZXMsIHJjeCkpKTsKKyAgX18gdGVzdHB0cihyY3gsIHJjeCk7CisgIF9fIGpjYyhBc3NlbWJsZXI6Onplcm8sIGhhbmRsZV91bmxpbmtlZF9zaXRlKTsKKworICBfXyBwcmVwYXJlX3RvX2p1bXBfZnJvbV9pbnRlcnByZXRlZCgpOworICBfXyBqdW1wX3RvX21ldGhvZF9oYW5kbGVfZW50cnkocmN4LCByZHgpOworCisgIC8vIEluaXRpYWwgY2FsbHMgY29tZSBoZXJlLi4uCisgIF9fIGJpbmQoaGFuZGxlX3VubGlua2VkX3NpdGUpOworICBfXyBwb3AocmN4KTsgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByZXR1cm4gYWRkcmVzcyBwdXNoZWQgYnkgcHJlcGFyZV9pbnZva2UKKworICAvLyBib3ggc3RhY2tlZCBhcmd1bWVudHMgaW50byBhbiBhcnJheSBmb3IgdGhlIGJvb3RzdHJhcCBtZXRob2QKKyAgYWRkcmVzcyBlbnRyeSA9IENBU1RfRlJPTV9GTl9QVFIoYWRkcmVzcywgSW50ZXJwcmV0ZXJSdW50aW1lOjpib290c3RyYXBfaW52b2tlZHluYW1pYyk7CisgIF9fIHJlc3RvcmVfYmNwKCk7ICAgICAgLy8gcnNpIG11c3QgYmUgY29ycmVjdCBmb3IgY2FsbF9WTQorICBfXyBjYWxsX1ZNKHJheCwgZW50cnksIHJheCk7CisgIF9fIG1vdmwocmRpLCByYXgpOyAgICAgICAgICAgIC8vIHByb3RlY3QgYm9vdHN0cmFwIE1IIGZyb20gcHJlcGFyZV9pbnZva2UKKworICAvLyByZWNvbXB1dGUgcmV0dXJuIGFkZHJlc3MKKyAgX18gcmVzdG9yZV9iY3AoKTsgICAgICAvLyByc2kgbXVzdCBiZSBjb3JyZWN0IGZvciBwcmVwYXJlX2ludm9rZQorICBwcmVwYXJlX2ludm9rZShyYXgsIHJieCwgLWJ5dGVfbm8pOyAgLy8gc21hc2hlcyByY3gsIHJkeAorICAvLyByYXg6IENhbGxTaXRlIG9iamVjdCAoZjEpCisgIC8vIHJieDogdW51c2VkIChmMikKKyAgLy8gcmRpOiBib290c3RyYXAgTUgKKyAgLy8gcmR4OiBmbGFncworCisgIC8vIG5vdyBsb2FkIHVwIHRoZSBhcmdsaXN0LCB3aGljaCBoYXMgYmVlbiBuZWF0bHkgYm94ZWQKKyAgX18gZ2V0X3RocmVhZChyY3gpOworICBfXyBtb3ZwdHIocmR4LCBBZGRyZXNzKHJjeCwgSmF2YVRocmVhZDo6dm1fcmVzdWx0XzJfb2Zmc2V0KCkpKTsKKyAgX18gbW92cHRyKEFkZHJlc3MocmN4LCBKYXZhVGhyZWFkOjp2bV9yZXN1bHRfMl9vZmZzZXQoKSksIE5VTExfV09SRCk7CisgIF9fIHZlcmlmeV9vb3AocmR4KTsKKyAgLy8gcmR4ID0gYXJnbGlzdAorCisgIC8vIHNhdmUgU1Agbm93LCBiZWZvcmUgd2UgYWRkIHRoZSBib290c3RyYXAgY2FsbCB0byB0aGUgc3RhY2sKKyAgLy8gV2UgbXVzdCBwcmVzZXJ2ZSBhIGZpY3Rpb24gdGhhdCB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIGFyZSBvdXRnb2luZywKKyAgLy8gYmVjYXVzZSB0aGUgcmV0dXJuIHNlcXVlbmNlIHdpbGwgcmVzZXQgdGhlIHN0YWNrIHRvIHRoaXMgcG9pbnQKKyAgLy8gYW5kIHRoZW4gcG9wIGFsbCB0aG9zZSBhcmd1bWVudHMuICBJdCBzZWVtcyBlcnJvci1wcm9uZSB0byB1c2UKKyAgLy8gYSBkaWZmZXJlbnQgYXJndW1lbnQgbGlzdCBzaXplIGp1c3QgZm9yIGJvb3RzdHJhcHBpbmcuCisgIF9fIHByZXBhcmVfdG9fanVtcF9mcm9tX2ludGVycHJldGVkKCk7CisKKyAgLy8gTm93IGxldCdzIHBsYXkgYWRhcHRlciwgcHVzaGluZyB0aGUgcmVhbCBhcmd1bWVudHMgb24gdGhlIHN0YWNrLgorICBfXyBwb3AocmJ4KTsgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gUEMKKyAgX18gcHVzaChyZGkpOyAgICAgICAgICAgICAgICAgLy8gYm9vdCBNSAorICBfXyBwdXNoKHJheCk7ICAgICAgICAgICAgICAgICAvLyBjYWxsIHNpdGUKKyAgX18gcHVzaChyZHgpOyAgICAgICAgICAgICAgICAgLy8gYXJnbGlzdAorICBfXyBwdXNoKHJieCk7ICAgICAgICAgICAgICAgICAvLyByZXR1cm4gUEMsIGFnYWluCisgIF9fIG1vdihyY3gsIHJkaSk7CisgIF9fIGp1bXBfdG9fbWV0aG9kX2hhbmRsZV9lbnRyeShyY3gsIHJkeCk7Cit9CisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQWxsb2NhdGlvbgogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3RlbXBsYXRlVGFibGVfeDg2XzMyLmhwcCBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVUYWJsZV94ODZfMzIuaHBwCmluZGV4IDg2MjU3MjAuLmE4OWVmZjYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVUYWJsZV94ODZfMzIuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVUYWJsZV94ODZfMzIuaHBwCkBAIC0yMiw4ICsyMiw3IEBACiAgKgogICovCiAKLSAgc3RhdGljIHZvaWQgcHJlcGFyZV9pbnZva2UoUmVnaXN0ZXIgbWV0aG9kLCBSZWdpc3RlciBpbmRleCwgaW50IGJ5dGVfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2Rlczo6Q29kZSBjb2RlKTsKKyAgc3RhdGljIHZvaWQgcHJlcGFyZV9pbnZva2UoUmVnaXN0ZXIgbWV0aG9kLCBSZWdpc3RlciBpbmRleCwgaW50IGJ5dGVfbm8pOwogICBzdGF0aWMgdm9pZCBpbnZva2V2aXJ0dWFsX2hlbHBlcihSZWdpc3RlciBpbmRleCwgUmVnaXN0ZXIgcmVjdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgZmxhZ3MpOwogICBzdGF0aWMgdm9pZCB2b2xhdGlsZV9iYXJyaWVyKEFzc2VtYmxlcjo6TWVtYmFyX21hc2tfYml0cyBvcmRlcl9jb25zdHJhaW50ICk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3RlbXBsYXRlVGFibGVfeDg2XzY0LmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVUYWJsZV94ODZfNjQuY3BwCmluZGV4IDA0OGI4YmIuLjA3MDM0YTQgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVUYWJsZV94ODZfNjQuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdGVtcGxhdGVUYWJsZV94ODZfNjQuY3BwCkBAIC0zMDU4LDYgKzMwNTgsMjMgQEAKICAgcmV0dXJuOwogfQogCit2b2lkIFRlbXBsYXRlVGFibGU6Omludm9rZWR5bmFtaWMoaW50IGJ5dGVfbm8pIHsKKyAgdHJhbnNpdGlvbih2dG9zLCB2dG9zKTsKKworICBpZiAoIUVuYWJsZUludm9rZUR5bmFtaWMpIHsKKyAgICAvLyBXZSBzaG91bGQgbm90IGVuY291bnRlciB0aGlzIGJ5dGVjb2RlIGlmICFFbmFibGVJbnZva2VEeW5hbWljLgorICAgIC8vIFRoZSB2ZXJpZmllciB3aWxsIHN0b3AgaXQuICBIb3dldmVyLCBpZiB3ZSBnZXQgcGFzdCB0aGUgdmVyaWZpZXIsCisgICAgLy8gdGhpcyB3aWxsIHN0b3AgdGhlIHRocmVhZCBpbiBhIHJlYXNvbmFibGUgd2F5LCB3aXRob3V0IGNyYXNoaW5nIHRoZSBKVk0uCisgICAgX18gY2FsbF9WTShub3JlZywgQ0FTVF9GUk9NX0ZOX1BUUihhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgSW50ZXJwcmV0ZXJSdW50aW1lOjp0aHJvd19JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yKSk7CisgICAgLy8gdGhlIGNhbGxfVk0gY2hlY2tzIGZvciBleGNlcHRpb24sIHNvIHdlIHNob3VsZCBuZXZlciByZXR1cm4gaGVyZS4KKyAgICBfXyBzaG91bGRfbm90X3JlYWNoX2hlcmUoKTsKKyAgICByZXR1cm47CisgIH0KKworICBfXyBzdG9wKCJpbnZva2VkeW5hbWljIE5ZSSIpOy8vNjgxNTY5Mi8vCit9CisKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvb3Mvd2luZG93cy92bS9vc193aW5kb3dzLmNwcCBiL2hvdHNwb3Qvc3JjL29zL3dpbmRvd3Mvdm0vb3Nfd2luZG93cy5jcHAKaW5kZXggMGFlNGMzZS4uMWNmMGNlZSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvb3Mvd2luZG93cy92bS9vc193aW5kb3dzLmNwcAorKysgYi9ob3RzcG90L3NyYy9vcy93aW5kb3dzL3ZtL29zX3dpbmRvd3MuY3BwCkBAIC0yNjMyLDYgKzI2MzIsOCBAQAogCiBjaGFyKiBvczo6cmVzZXJ2ZV9tZW1vcnlfc3BlY2lhbChzaXplX3QgYnl0ZXMsIGNoYXIqIGFkZHIsIGJvb2wgZXhlYykgewogCisgIGNvbnN0IERXT1JEIHByb3QgPSBleGVjID8gUEFHRV9FWEVDVVRFX1JFQURXUklURSA6IFBBR0VfUkVBRFdSSVRFOworCiAgIGlmIChVc2VMYXJnZVBhZ2VzSW5kaXZpZHVhbEFsbG9jYXRpb24pIHsKICAgICBpZiAoVHJhY2VQYWdlU2l6ZXMgJiYgVmVyYm9zZSkgewogICAgICAgIHR0eS0+cHJpbnRfY3IoIlJlc2VydmluZyBsYXJnZSBwYWdlcyBpbmRpdmlkdWFsbHkuIik7CkBAIC0yNjk0LDEzICsyNjk2LDcgQEAKICAgICAgICAgcF9uZXcgPSAoY2hhciAqKSBWaXJ0dWFsQWxsb2MobmV4dF9hbGxvY19hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fcnEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fUkVTRVJWRSB8IE1FTV9DT01NSVQgfCBNRU1fTEFSR0VfUEFHRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1JFQURXUklURSk7Ci0gICAgICAgIGlmIChwX25ldyAhPSBOVUxMICYmIGV4ZWMpIHsKLSAgICAgICAgICBEV09SRCBvbGRwcm90OwotICAgICAgICAgIC8vIFdpbmRvd3MgZG9jIHNheXMgdG8gdXNlIFZpcnR1YWxQcm90ZWN0IHRvIGdldCBleGVjdXRlIHBlcm1pc3Npb25zCi0gICAgICAgICAgVmlydHVhbFByb3RlY3QobmV4dF9hbGxvY19hZGRyLCBieXRlc190b19ycSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFLCAmb2xkcHJvdCk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3QpOwogICAgICAgfQogCiAgICAgICBpZiAocF9uZXcgPT0gTlVMTCkgewpAQCAtMjcyOSwxMiArMjcyNSw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gbm9ybWFsIHBvbGljeSBqdXN0IGFsbG9jYXRlIGl0IGFsbCBhdCBvbmNlCiAgICAgRFdPUkQgZmxhZyA9IE1FTV9SRVNFUlZFIHwgTUVNX0NPTU1JVCB8IE1FTV9MQVJHRV9QQUdFUzsKLSAgICBjaGFyICogcmVzID0gKGNoYXIgKilWaXJ0dWFsQWxsb2MoTlVMTCwgYnl0ZXMsIGZsYWcsIFBBR0VfUkVBRFdSSVRFKTsKLSAgICBpZiAocmVzICE9IE5VTEwgJiYgZXhlYykgewotICAgICAgRFdPUkQgb2xkcHJvdDsKLSAgICAgIC8vIFdpbmRvd3MgZG9jIHNheXMgdG8gdXNlIFZpcnR1YWxQcm90ZWN0IHRvIGdldCBleGVjdXRlIHBlcm1pc3Npb25zCi0gICAgICBWaXJ0dWFsUHJvdGVjdChyZXMsIGJ5dGVzLCBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFLCAmb2xkcHJvdCk7Ci0gICAgfQorICAgIGNoYXIgKiByZXMgPSAoY2hhciAqKVZpcnR1YWxBbGxvYyhOVUxMLCBieXRlcywgZmxhZywgcHJvdCk7CiAgICAgcmV0dXJuIHJlczsKICAgfQogfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvb3NfY3B1L3NvbGFyaXNfeDg2L3ZtL2dsb2JhbHNfc29sYXJpc194ODYuaHBwIGIvaG90c3BvdC9zcmMvb3NfY3B1L3NvbGFyaXNfeDg2L3ZtL2dsb2JhbHNfc29sYXJpc194ODYuaHBwCmluZGV4IDc1NDE5NWYuLjFhMjkxY2QgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL29zX2NwdS9zb2xhcmlzX3g4Ni92bS9nbG9iYWxzX3NvbGFyaXNfeDg2LmhwcAorKysgYi9ob3RzcG90L3NyYy9vc19jcHUvc29sYXJpc194ODYvdm0vZ2xvYmFsc19zb2xhcmlzX3g4Ni5ocHAKQEAgLTM5LDcgKzM5LDcgQEAKIC8vIFRocmVhZFN0YWNrU2l6ZSAzMjAgYWxsb3dzIFRhZ2dlZFN0YWNrSW50ZXJwcmV0ZXIgYW5kIGEgY291cGxlIG9mIHRlc3QgY2FzZXMKIC8vIHRvIHJ1biB3aGlsZSBrZWVwaW5nIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGhpZ2guCiBkZWZpbmVfcGRfZ2xvYmFsKGludHgsIFRocmVhZFN0YWNrU2l6ZSwgICAgICAgICAgMzIwKTsKLWRlZmluZV9wZF9nbG9iYWwoaW50eCwgVk1UaHJlYWRTdGFja1NpemUsICAgICAgICAyNTYpOworZGVmaW5lX3BkX2dsb2JhbChpbnR4LCBWTVRocmVhZFN0YWNrU2l6ZSwgICAgICAgIDUxMik7CiBkZWZpbmVfcGRfZ2xvYmFsKGludHgsIFN1cnZpdm9yUmF0aW8sICAgICAgICAgICAgOCk7CiBkZWZpbmVfcGRfZ2xvYmFsKHVpbnR4LCBKVk1JbnZva2VNZXRob2RTbGFjaywgICAgMTAqSyk7CiAjZW5kaWYgLy8gQU1ENjQKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3Rvb2xzL01ha2VEZXBzL0J1aWxkQ29uZmlnLmphdmEgYi9ob3RzcG90L3NyYy9zaGFyZS90b29scy9NYWtlRGVwcy9CdWlsZENvbmZpZy5qYXZhCmluZGV4IGFjY2RhYjYuLmVjMjZiYzYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3Rvb2xzL01ha2VEZXBzL0J1aWxkQ29uZmlnLmphdmEKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdG9vbHMvTWFrZURlcHMvQnVpbGRDb25maWcuamF2YQpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgICAgICAgIHN5c0RlZmluZXMuYWRkKCJIT1RTUE9UX0JVSUxEX1VTRVI9IitTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIpKTsKICAgICAgICAgc3lzRGVmaW5lcy5hZGQoIkhPVFNQT1RfQlVJTERfVEFSR0VUPVxcXCIiK2dldCgiQnVpbGQiKSsiXFxcIiIpOwogICAgICAgICBzeXNEZWZpbmVzLmFkZCgiX0pOSV9JTVBMRU1FTlRBVElPTl8iKTsKLSAgICAgICAgc3lzRGVmaW5lcy5hZGQoIkhPVFNQT1RfTElCX0FSQ0g9XFxcImk0ODZcXFwiIik7CisgICAgICAgIHN5c0RlZmluZXMuYWRkKCJIT1RTUE9UX0xJQl9BUkNIPVxcXCJpMzg2XFxcIiIpOwogCiAgICAgICAgIHN5c0RlZmluZXMuYWRkQWxsKGRlZmluZXMpOwogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS90b29scy9oc2Rpcy9NYWtlZmlsZSBiL2hvdHNwb3Qvc3JjL3NoYXJlL3Rvb2xzL2hzZGlzL01ha2VmaWxlCmluZGV4IDZiZGY0YjguLmMxZmQ0Y2EgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3Rvb2xzL2hzZGlzL01ha2VmaWxlCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3Rvb2xzL2hzZGlzL01ha2VmaWxlCkBAIC0yMiw2MSArMjIsNzUgQEAKICMgIAogIwogCi0jIFNpbmdsZSBnbnUgbWFrZWZpbGUgZm9yIHNvbGFyaXMsIGxpbnV4IGFuZCB3aW5kb3dzICh3aW5kb3dzIHJlcXVpcmVzIG1rcyBvcgotIyBjeWd3aW4pLgotCi1pZmVxICAgICAgICAgICAgKCQoQklOVVRJTFMpLCkKLSMgUG9wIGFsbCB0aGUgd2F5IG91dCBvZiB0aGUgd29ya3NwYWNlIHRvIGxvb2sgZm9yIGJpbnV0aWxzLgotIyAuLi5Zb3UgcHJvYmFibHkgd2FudCB0byBvdmVycmlkZSB0aGlzIHNldHRpbmcuCi1CSU5VVElMUwk9ICQoc2hlbGwgY2QgLi4vLi4vLi4vLi4vLi47cHdkKS9iaW51dGlscy0yLjE3LSQoTElCQVJDSCkKLWVuZGlmCisjIFNpbmdsZSBnbnUgbWFrZWZpbGUgZm9yIHNvbGFyaXMsIGxpbnV4IGFuZCB3aW5kb3dzICh3aW5kb3dzIHJlcXVpcmVzIGN5Z3dpbiBhbmQgbWluZ3cpCiAKICMgRGVmYXVsdCBhcmNoOyBpdCBpcyBjaGFuZ2VkIGJlbG93IGFzIG5lZWRlZC4KIEFSQ0gJCT0gaTM4NgogT1MJCT0gJChzaGVsbCB1bmFtZSkKIAotQ1BQRkxBR1MJKz0gLUkkKEJJTlVUSUxTKS9pbmNsdWRlIC1JJChCSU5VVElMUykvYmZkCi1DUFBGTEFHUwkrPSAtREhPVFNQT1RfTElCX0FSQ0g9XCIkKExJQkFSQ0gpXCIgLURMSUJBUkNIXyQoTElCQVJDSCkKLUNQUEZMQUdTCSs9IC1ESE9UU1BPVF9PUz1cIiQoT1MpXCIgLURPU18kKE9TKQotCiAjIyBPUyA9IFN1bk9TICMjCiBpZmVxCQkoJChPUyksU3VuT1MpCi1BUkNIICAgIAk9ICQoc2hlbGwgdW5hbWUgLXApCitDUFUgICAgICAgICAgICAgPSAkKHNoZWxsIHVuYW1lIC1wKQorQVJDSDE9JChDUFU6aTU4Nj1pMzg2KQorQVJDSD0kKEFSQ0gxOmk2ODY9aTM4NikKIE9TCQk9IHNvbGFyaXMKIENDIAkJPSBjYwotQ0NGTEFHUwkJKz0gLUtwaWMgLWcKLUNDRkxBR1MvYW1kNjQgICArPSAteGFyY2g9YW1kNjQKLUNDRkxBR1Mvc3BhcmN2OSArPSAteGFyY2g9djkKLUNDRkxBR1MJCSs9ICQoQ0NGTEFHUy8kKExJQkFSQ0gpKQorQ0ZMQUdTCQkrPSAtS1BJQworaWZkZWYgTFA2NAoraWZlcSAoJChBUkNIKSxzcGFyYykKK0FSQ0ggICAgICAgICAgICA9IHNwYXJjdjkKK2VuZGlmCitpZmVxICgkKEFSQ0gpLGkzODYpCitBUkNIICAgICAgICAgICAgPSBhbWQ2NAorZW5kaWYKK2VuZGlmCitDRkxBR1Mvc3BhcmN2OQkrPSAteGFyY2g9djkKK0NGTEFHUy9hbWQ2NAkrPSAtbTY0CitDRkxBR1MJCSs9ICQoQ0ZMQUdTLyQoQVJDSCkpCiBETERGTEFHUwkrPSAtRworTERGTEFHUyAgICAgICAgICs9IC1sZGwKIE9VVEZMQUdTCSs9IC1vICRACiBMSUJfRVhUCQk9IC5zbwogZWxzZQogIyMgT1MgPSBMaW51eCAjIwogaWZlcQkJKCQoT1MpLExpbnV4KQotQ1BVICAgICAgICAgICAgID0gJChzaGVsbCB1bmFtZSAtbSkKLWlmZXEJCSgkKENQVSksaWE2NCkKLUFSQ0ggICAgCT0gaWE2NAoraWZuZXEgICAgICAgICAgICgkKE1JTkdXKSwpCitMSUJfRVhUCQk9IC5kbGwKK0NQUEZMQUdTICs9IC1JJChUQVJHRVRfRElSKS9pbmNsdWRlCitMREZMQUdTICs9IC1MJChUQVJHRVRfRElSKS9saWIKK09TPXdpbmRvd3MKK2lmbmVxICAgICAgICAgICAoJChmaW5kc3RyaW5nIHg4Nl82NC0sJChNSU5HVykpLCkKK0FSQ0g9YW1kNjQKIGVsc2UKLWlmZXEJCSgkKENQVSkseDg2XzY0KQotQ0NGTEFHUwkJKz0gLWZQSUMKLWVuZGlmICAgIyB4ODZfNjQKLWVuZGlmICAgIyBpYTY0CitBUkNIPWkzODYKK2VuZGlmCitDQyAJCT0gJChNSU5HVyktZ2NjCitDT05GSUdVUkVfQVJHUz0gLS1ob3N0PSQoTUlOR1cpIC0tdGFyZ2V0PSQoTUlOR1cpCitlbHNlCitDUFUgICAgICAgICAgICAgPSAkKHNoZWxsIHVuYW1lIC1tKQorQVJDSDE9JChDUFU6eDg2XzY0PWFtZDY0KQorQVJDSD0kKEFSQ0gxOmk2ODY9aTM4NikKK0NGTEFHUy9pMzg2CSs9IC1tMzIKK0NGTEFHUy9zcGFyYwkrPSAtbTMyCitDRkxBR1Mvc3BhcmN2OQkrPSAtbTY0CitDRkxBR1MvYW1kNjQJKz0gLW02NAorQ0ZMQUdTCQkrPSAkKENGTEFHUy8kKEFSQ0gpKQorQ0ZMQUdTCQkrPSAtZlBJQwogT1MJCT0gbGludXgKLUNDIAkJPSBnY2MKLUNDRkxBR1MJCSs9IC1PCi1ETERGTEFHUwkrPSAtc2hhcmVkCi1PVVRGTEFHUwkrPSAtbyAkQAogTElCX0VYVAkJPSAuc28KLUNQUEZMQUdTCSs9IC1JaW5jbHVkZSAtSWluY2x1ZGUvJChPUylfJChBUkNIKS8KK0NDIAkJPSBnY2MKK2VuZGlmCitDRkxBR1MJCSs9IC1PCitETERGTEFHUwkrPSAtc2hhcmVkCitMREZMQUdTICAgICAgICAgKz0gLWxkbAorT1VURkxBR1MJKz0gLW8gJEAKICMjIE9TID0gV2luZG93cyAjIwogZWxzZSAgICMgIVN1bk9TLCAhTGludXggPT4gV2luZG93cwotT1MJCT0gd2luCi1DQwkJPSBjbAorT1MJCT0gd2luZG93cworQ0MJCT0gZ2NjCiAjQ1BQRkxBR1MJKz0gL0QiV0lOMzIiIC9EIl9XSU5ET1dTIiAvRCJERUJVRyIgL0QiTkRFQlVHIgotQ0NGTEFHUwkJKz0gIC9ub2xvZ28gL01EIC9XMyAvV1ggL08yIC9GbyQoQDouZGxsPS5vYmopIC9HaS0KLUNDRkxBR1MJCSs9IC1JaW5jbHVkZSAtSWluY2x1ZGUvZ251IC1JaW5jbHVkZS8kKE9TKV8kKEFSQ0gpCi1DQ0ZMQUdTCQkrPSAvRCJIT1RTUE9UX0xJQl9BUkNIPVwiJChMSUJBUkNIKVwiIgorQ0ZMQUdTCQkrPSAgL25vbG9nbyAvTUQgL1czIC9XWCAvTzIgL0ZvJChAOi5kbGw9Lm9iaikgL0dpLQorQ0ZMQUdTCQkrPSBMSUJBUkNIPVwiJChMSUJBUkNIKVwiIgogRExERkxBR1MJKz0gL2RsbCAvc3Vic3lzdGVtOndpbmRvd3MgL2luY3JlbWVudGFsOm5vIFwKIAkJCS9leHBvcnQ6ZGVjb2RlX2luc3RydWN0aW9uCiBPVVRGTEFHUwkrPSAvbGluayAvb3V0OiRACkBAIC05NCwyMSArMTA4LDM0IEBACiBlbmRpZiAgICMgTElCQVJDSDY0LyQoQVJDSCkKIGVuZGlmICAgIyBMUDY0CiAKLVRBUkdFVF9ESVIJPSBiaW4vJChPUykKK0pES0FSQ0g9JChMSUJBUkNIOmkzODY9aTU4NikKKworaWZlcSAgICAgICAgICAgICgkKEJJTlVUSUxTKSwpCisjIFBvcCBhbGwgdGhlIHdheSBvdXQgb2YgdGhlIHdvcmtzcGFjZSB0byBsb29rIGZvciBiaW51dGlscy4KKyMgLi4uWW91IHByb2JhYmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nLgorQklOVVRJTFNESVIJPSAkKHNoZWxsIGNkIGJ1aWxkL2JpbnV0aWxzO3B3ZCkKK2Vsc2UKK0JJTlVUSUxTRElSCT0gJChzaGVsbCBjZCAkKEJJTlVUSUxTKTtwd2QpCitlbmRpZgorCitDUFBGTEFHUwkrPSAtSSQoQklOVVRJTFNESVIpL2luY2x1ZGUgLUkkKEJJTlVUSUxTKS9iZmQgLUkkKFRBUkdFVF9ESVIpL2JmZAorQ1BQRkxBR1MJKz0gLURMSUJBUkNIXyQoTElCQVJDSCkgLURMSUJBUkNIPVwiJChMSUJBUkNIKVwiIC1ETElCX0VYVD1cIiQoTElCX0VYVClcIgorCitUQVJHRVRfRElSCT0gYnVpbGQvJChPUyktJChKREtBUkNIKQogVEFSR0VUCQk9ICQoVEFSR0VUX0RJUikvaHNkaXMtJChMSUJBUkNIKSQoTElCX0VYVCkKIAogU09VUkNFCQk9IGhzZGlzLmMKIAotTElCUkFSSUVTID0JJChCSU5VVElMUykvYmZkL2xpYmJmZC5hIFwKLQkJJChCSU5VVElMUykvb3Bjb2Rlcy9saWJvcGNvZGVzLmEgXAotCQkkKEJJTlVUSUxTKS9saWJpYmVydHkvbGliaWJlcnR5LmEKK0xJQlJBUklFUyA9CSQoVEFSR0VUX0RJUikvYmZkL2xpYmJmZC5hIFwKKwkJJChUQVJHRVRfRElSKS9vcGNvZGVzL2xpYm9wY29kZXMuYSBcCisJCSQoVEFSR0VUX0RJUikvbGliaWJlcnR5L2xpYmliZXJ0eS5hCiAKLURFTU9fVEFSR0VUCT0gJChUQVJHRVRfRElSKS9oc2Rpcy1kZW1vLSQoTElCQVJDSCkKK0RFTU9fVEFSR0VUCT0gJChUQVJHRVRfRElSKS9oc2Rpcy1kZW1vCiBERU1PX1NPVVJDRQk9IGhzZGlzLWRlbW8uYwogCiAuUEhPTlk6ICBhbGwgY2xlYW4gZGVtbyBib3RoCiAKLWFsbDogICQoVEFSR0VUKSBkZW1vCithbGw6ICAkKFRBUkdFVCkKIAogYm90aDogYWxsIGFsbDY0CiAKQEAgLTExNywxNiArMTQ0LDE3IEBACiAKIGRlbW86ICQoVEFSR0VUKSAkKERFTU9fVEFSR0VUKQogCi0kKExJQlJBUklFUyk6Ci0JQGVjaG8gIioqKiBQbGVhc2UgYnVpbGQgYmludXRpbHMgZmlyc3Q7IHNlZSAuL1JFQURNRTogKioqIgotCUBzZWQgPCAuL1JFQURNRSAnMSwvX19fX19fX19fXy9kJyB8IGhlYWQgLTIwCi0JQGVjaG8gIi4uLiI7IGV4aXQgMQorJChMSUJSQVJJRVMpOiAkKFRBUkdFVF9ESVIpICQoVEFSR0VUX0RJUikvTWFrZWZpbGUKKwlpZiBbICEgLWYgJEAgXTsgdGhlbiBjZCAkKFRBUkdFVF9ESVIpOyBtYWtlIGFsbC1vcGNvZGVzOyBmaQorCiskKFRBUkdFVF9ESVIpL01ha2VmaWxlOgorCShjZCAkKFRBUkdFVF9ESVIpOyBDQz0kKENDKSBDRkxBR1M9IiQoQ0ZMQUdTKSIgJChCSU5VVElMU0RJUikvY29uZmlndXJlIC0tZGlzYWJsZS1ubHMgJChDT05GSUdVUkVfQVJHUykpCiAKICQoVEFSR0VUKTogJChTT1VSQ0UpICQoTElCUykgJChMSUJSQVJJRVMpICQoVEFSR0VUX0RJUikKLQkkKENDKSAkKE9VVEZMQUdTKSAkKENQUEZMQUdTKSAkKENDRkxBR1MpICQoU09VUkNFKSAkKERMREZMQUdTKSAkKExJQlJBUklFUykKKwkkKENDKSAkKE9VVEZMQUdTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChTT1VSQ0UpICQoRExERkxBR1MpICQoTElCUkFSSUVTKQogCiAkKERFTU9fVEFSR0VUKTogJChERU1PX1NPVVJDRSkgJChUQVJHRVQpICQoVEFSR0VUX0RJUikKLQkkKENDKSAkKE9VVEZMQUdTKSAkKENQUEZMQUdTKSAkKENDRkxBR1MpICQoREVNT19TT1VSQ0UpICQoTERGTEFHUykKKwkkKENDKSAkKE9VVEZMQUdTKSAtRFRBUkdFVF9ESVI9XCIkKFRBUkdFVF9ESVIpXCIgJChDUFBGTEFHUykgLWcgJChDRkxBR1MvJChBUkNIKSkgJChERU1PX1NPVVJDRSkgJChMREZMQUdTKQogCiAkKFRBUkdFVF9ESVIpOgogCVsgLWQgJEAgXSB8fCBta2RpciAtcCAkQApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdG9vbHMvaHNkaXMvUkVBRE1FIGIvaG90c3BvdC9zcmMvc2hhcmUvdG9vbHMvaHNkaXMvUkVBRE1FCmluZGV4IDc2YzkyYTQuLjkxMTE4ZTAgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3Rvb2xzL2hzZGlzL1JFQURNRQorKysgYi9ob3RzcG90L3NyYy9zaGFyZS90b29scy9oc2Rpcy9SRUFETUUKQEAgLTMyLDYxICszMiw1NSBAQAogCiAqIEJ1aWxkaW5nCiAKLVRvIGJ1aWxkIHRoaXMgcHJvamVjdCB5b3UgbmVlZCBhIGJ1aWxkIG9mIEdudSBiaW51dGlscyB0byBsaW5rIGFnYWluc3QuCi1JdCBpcyBrbm93biB0byB3b3JrIHdpdGggYmludXRpbHMgMi4xNy4KK1RvIGJ1aWxkIHRoaXMgcHJvamVjdCB5b3UgYSBjb3B5IG9mIEdOVSBiaW51dGlscyB0byBidWlsZCBhZ2FpbnN0LiAgSXQKK2lzIGtub3duIHRvIHdvcmsgd2l0aCBiaW51dGlscyAyLjE3IGFuZCBiaW51dGlscyAyLjE5LjEuICBEb3dubG9hZCBhCitjb3B5IG9mIHRoZSBzb2Z0d2FyZSBmcm9tIGh0dHA6Ly9kaXJlY3RvcnkuZnNmLm9yZy9wcm9qZWN0L2JpbnV0aWxzIG9yCitvbmUgb2YgaXQncyBtaXJyb3JzLiAgQnVpbGRzIHRhcmdldHRpbmcgd2luZG93cyBzaG91bGQgdXNlIGF0IGxlYXN0CisyLjE5IGFuZCBjdXJyZW50bHkgcmVxdWlyZXMgdGhlIHVzZSBvZiBhIGNyb3NzIGNvbXBpbGVyLgogCi1UaGUgbWFrZWZpbGUgbG9va3MgZm9yIHRoaXMgYnVpbGQgaW4gJEJJTlVUSUxTLCBvciAoaWYgdGhhdCBpcyBub3Qgc2V0KSwKLWluICAuLi4vYmludXRpbHMtMi4xNy0kTElCQVJDSCwgd2hlcmUgTElCQVJDSCAoYXMgaW4gSG90U3BvdCkgaXMgb25lIG9mCi10aGUganJlIHN1YmRpcmVjdG9yeSBrZXl3b3JkcyBpMzg2LCBhbWQ2NCwgc3BhcmMsIHNwYXJjdjksIGV0Yy4KK1RoZSBtYWtlZmlsZSBsb29rcyBmb3IgdGhlIHNvdXJjZXMgaW4gYnVpbGQvYmludXRpbHMgb3IgeW91IGNhbgorc3BlY2lmeSBpdCdzIGxvY2F0aW9uIHRvIHRoZSBtYWtlZmlsZSB1c2luZyBCSU5UVUlMUz1wYXRoLiAgSXQgd2lsbAorY29uZmlndXJlIGJpbnV0aWxzIGFuZCBidWlsZCBpdCBmaXJzdCBhbmQgdGhlbiBidWlsZCBhbmQgbGluayB0aGUKK2Rpc2FzZW1ibHkgYWRhcHRlci4gIE1ha2UgYWxsIHdpbGwgYnVpbGQgdGhlIGRlZmF1bHQgdGFyZ2V0IGZvciB5b3VyCitwbGF0Zm9ybS4gIElmIHlvdSBwbGF0Zm9ybSBzdXBwb3J0IGJvdGggMzIgYW5kIDY0IHNpbXVsdGFuZW91c2x5IHRoZW4KKyJtYWtlIGJvdGgiIHdpbGwgYnVpbGQgdGhlbSBib3RoIGF0IG9uY2UuICAibWFrZSBhbGw2NCIgd2lsbAorZXhwbGljaXRseSBidWlsZCB0aGUgNjQgYml0IHZlcnNpb24uICBCeSBkZWZhdWx0IHRoaXMgd2lsbCBidWlsZCB0aGUKK2Rpc2Fzc2VtYmxlciBsaWJyYXJ5IG9ubHkuICBJZiB5b3UgYnVpbGQgZGVtbyBpdCB3aWxsIGJ1aWxkIGEgZGVtbworcHJvZ3JhbSB0aGF0IGF0dGVtcHRzIHRvIGV4ZXJjaXNlIHRoZSBsaWJyYXJ5LgogCi1UbyBidWlsZCBHbnUgYmludXRpbHMsIGZpcnN0IGRvd25sb2FkIGEgY29weSBvZiB0aGUgc29mdHdhcmU6Ci0gIGh0dHA6Ly9kaXJlY3RvcnkuZnNmLm9yZy9wcm9qZWN0L2JpbnV0aWxzLworV2luZG93cwogCi1VbnBhY2sgdGhlIGJpbnV0aWxzIHRhcmJhbGwgaW50byBhbiBlbXB0eSBkaXJlY3Rvcnk6Ci0gIGNoZGlyIC4uLy4uLy4uLy4uLy4uCi0gIHRhciAteHpmIC0gPCAuLi9iaW51dGlscy0yLjE3LnRhci5negotICBtdiBiaW51dGlscy0yLjE3IGJpbnV0aWxzLTIuMTctaTM4NiAgI29yIGJpbnV0aWxzLTIuMTctc3BhcmMKLSAgY2QgYmludXRpbHMtMi4xNy1pMzg2CitJbiB0aGVvcnkgdGhpcyBzaG91bGQgYmUgYnVpbGRhYmxlIG9uIFdpbmRvd3MgYnV0IGdldHRpbmcgYSB3b3JraW5nCitHTlUgYnVpbGQgZW52aXJvbm1lbnQgb24gV2luZG93cyBoYXMgcHJvdmVuIGRpZmZpY3VsdC4gIE1JTkdXIHNob3VsZAorYmUgYWJsZSB0byBkbyBpdCBidXQgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nIEkgd2FzIHVuYWJsZSB0byBnZXQKK3RoaXMgd29ya2luZy4gIEluc3RlYWQgeW91IGNhbiB1c2UgdGhlIG1pbmd3IGNyb3NzIGNvbXBpbGVyIG9uIGxpbnV4Cit0byBwcm9kdWNlIHRoZSB3aW5kb3dzIGJpbmFyaWVzLiAgRm9yIDMyLWJpdCB3aW5kb3dzIHlvdSBjYW4gaW5zdGFsbAorbWluZ3czMiB1c2luZyB5b3VyIHBhY2thZ2UgbWFuYWdlciBhbmQgaXQgd2lsbCBiZSBhZGRlZCB0byB5b3VyIHBhdGgKK2F1dG9tYXRpY2FsbHkuICBGb3IgNjQtYml0IHlvdSBuZWVkIHRvIGRvd25sb2FkIHRoZSA2NCBiaXQgbWluZ3cgZnJvbQoraHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9taW5ndy13NjQuICBHcmFiIGEgY29weSBvZiB0aGUKK2NvbXBsZXRlIHRvb2xjaGFpbiBhbmQgdW5wYWNrIGl0IHNvbWV3aGVyZS4gIFB1dCB0aGUgYmluIGRpcmVjdG9yeSBvZgordGhlIHRvb2xjaGFpbiBpbiB5b3VyIHBhdGguICBUaGUgbWluZ3cgaW5zdGFsbHMgY29udGFpbiBjcm9zcyBjb21waWxlCit2ZXJzaW9ucyBvZiBnY2MgdGhhdCBhcmUgbmFtZWQgd2l0aCBhIHByZWZpeCB0byBpbmRpY2F0ZSB3aGF0IHRoZXkgYXJlCit0YXJnZXR0aW5nIGFuZCB5b3UgbXVzdCB0ZWxsIHRoZSBNYWtlZmlsZSB3aGljaCBvbmUgdG8gdXNlLiAgVGhpcworc2hvdWxkIGVpdGhlciBiZSBpNTg2LW1pbmd3MzJtc3ZjIG9yIHg4Nl82NC1wYy1taW5ndzMyIGRlcGVuZGluZyBvbgord2hpY2ggb24geW91IGFyZSB0YXJnZXR0aW5nIGFuZCB0aGVyZSBzaG91bGQgYmUgYSB2ZXJzaW9uIG9mIGdjYyBpbgoreW91ciBwYXRoIG5hbWVkIGk1ODYtbWluZ3czMm1zdmMtZ2NjIG9yIHg4Nl82NC1wYy1taW5ndzMyLWdjYy4gIFRlbGwKK3RoZSBtYWtlZmlsZSB3aGF0IHByZWZpeCB0byB1c2UgdG8gZmluZCB0aGUgbWluZ3cgdG9vbHMgYnkgdXNpbmcKK01JTkdXPS4gIEZvciBleGFtcGxlOgogCi1Gcm9tIGluc2lkZSB0aGF0IGRpcmVjdG9yeSwgcnVuIGNvbmZpZ3VyZSBhbmQgbWFrZToKLSAgKCBleHBvcnQgQ0ZMQUdTPSctZlBJQycKLSAgICAuL2NvbmZpZ3VyZSBpMzg2LXBjLWVsZiApCi0gIGdudW1ha2UKK21ha2UgTUlOR1c9aTU4Ni1taW5ndzMybXN2YyBCSU5UVUlMUz1idWlsZC9iaW51dGlscy0yLjE5LjEKIAotKExlYXZlIG91dCBvciBjaGFuZ2UgdGhlIGFyZ3VtZW50IHRvIGNvbmZpZ3VyZSBpZiBub3Qgb24gYW4gaTM4NiBzeXN0ZW0uKQotCi1OZXh0LCB1bnRhciBhZ2FpbiBpbnRvIGFub3RoZXIgZW1wdHkgZGlyZWN0b3J5IGZvciB0aGUgTFA2NCB2ZXJzaW9uOgotICBjaGRpciAuLgotICB0YXIgLXh6ZiAtIDwgLi4vYmludXRpbHMtMi4xNy50YXIuZ3oKLSAgbXYgYmludXRpbHMtMi4xNyBiaW51dGlscy0yLjE3LWFtZDY0ICAjb3IgYmludXRpbHMtMi4xNy1zcGFyY3Y5Ci0gIGNkIGJpbnV0aWxzLTIuMTctYW1kNjQKLQotRnJvbSBpbnNpZGUgdGhhdCBkaXJlY3RvcnksIHJ1biBjb25maWd1cmUgZm9yIExQNjQgYW5kIG1ha2U6Ci0gICggZXhwb3J0IGFjX2N2X2NfYmlnZW5kaWFuPW5vIENGTEFHUz0nLW02NCAtZlBJQycgTERGTEFHUz0tbTY0Ci0gICAgLi9jb25maWd1cmUgYW1kNjQtcGMtZWxmICkKLSAgZ251bWFrZQotCi1UaGUgLWZQSUMgb3B0aW9uIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIGJlCi1saW5rZWQgaW50byB0aGUgaHNkaWQtJExJQkFSQ0guc28gYmluYXJ5LiAgSWYgeW91IG1pc3MgdGhlCi1vcHRpb24sIHRoZSBKVk0gd2lsbCBmYWlsIHRvIGxvYWQgdGhlIGRpc2Fzc2VtYmxlci4KLQotWW91IHByb2JhYmx5IHdhbnQgdHdvIGJ1aWxkcywgb25lIGZvciAzMiBhbmQgb25lIGZvciA2NCBiaXRzLgotVG8gYnVpbGQgdGhlIDY0LWJpdCB2YXJpYXRpb24gb2YgYSBwbGF0Zm9ybiwgYWRkIExQNjQ9MSB0bwotdGhlIG1ha2UgY29tbWFuZCBsaW5lIGZvciBoc2Rpcy4KLQotU28sIGdvIGJhY2sgdG8gdGhlIGhzZGlzIHByb2plY3QgYW5kIGJ1aWxkOgotICBjaGRpciAuLi4vaHNkaXMKLSAgZ251bWFrZQotICBnbnVtYWtlIExQNjQ9MQord2lsbCBidWlsZCB0aGUgV2luMzIgY3Jvc3MgY29tcGlsZWQgdmVyc2lvbiBvZiBoc2RpcyBiYXNlZCBvbiAyLjE5LjEuCiAKICogSW5zdGFsbGluZwogCi1Qcm9kdWN0cyBhcmUgbmFtZWQgbGlrZSBiaW4vJE9TL2hzZGlzLSRMSUJBUkNILnNvLgotWW91IGNhbiBpbnN0YWxsIHRoZW0gb24geW91ciBMRF9MSUJSQVJZX1BBVEgsCi1vciBpbnNpZGUgb2YgeW91ciBKUkUgbmV4dCB0byAkTElCQVJDSC9saWJqdm0uc28uCitQcm9kdWN0cyBhcmUgbmFtZWQgbGlrZSBidWlsZC8kT1MtJExJQkFSQ0gvaHNkaXMtJExJQkFSQ0guc28uICBZb3UgY2FuCitpbnN0YWxsIHRoZW0gb24geW91ciBMRF9MSUJSQVJZX1BBVEgsIG9yIGluc2lkZSBvZiB5b3VyIEpSRSBuZXh0IHRvCiskTElCQVJDSC9saWJqdm0uc28uCiAKIE5vdyB0ZXN0OgotICBleHBvcnQgTERfTElCUkFSWV9QQVRIIC4uLi9oc2Rpcy9iaW4vc29sYXJpczokTERfTElCUkFSWV9QQVRICisKKyAgZXhwb3J0IExEX0xJQlJBUllfUEFUSCAuLi4vaHNkaXMvYnVpbGQvJE9TLSRMSUJBUkNIOiRMRF9MSUJSQVJZX1BBVEgKICAgZGFyZ3M9Jy1YWDorVW5sb2NrRGlhZ25vc3RpY1ZNT3B0aW9ucyAtWFg6K1ByaW50QXNzZW1ibHknCiAgIGRhcmdzPSRkYXJncycgLVhYOlByaW50QXNzZW1ibHlPcHRpb25zPWhzZGlzLXByaW50LWJ5dGVzJwogICBqYXZhICRkYXJncyAtWGJhdGNoIENvbXBpbGVDb21tYW5kPXByaW50LCpTdHJpbmcuaGFzaENvZGUgSGVsbG9Xb3JsZApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdG9vbHMvaHNkaXMvaHNkaXMtZGVtby5jIGIvaG90c3BvdC9zcmMvc2hhcmUvdG9vbHMvaHNkaXMvaHNkaXMtZGVtby5jCmluZGV4IGFkZWE3NmUuLjUxMzI0NTMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3Rvb2xzL2hzZGlzL2hzZGlzLWRlbW8uYworKysgYi9ob3RzcG90L3NyYy9zaGFyZS90b29scy9oc2Rpcy9oc2Rpcy1kZW1vLmMKQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGFyZywgIi1vcHRpb25zPSIsIDkpKQogICAgICAgICBvcHRpb25zID0gYXJnKzk7CiAgICAgICBlbHNlCi0gICAgICAgIHsgcHJpbnRmKCJVc2FnZTogJXMgWy14bWxdIFtuYW1lLi4uXVxuIik7IGV4aXQoMik7IH0KKyAgICAgICAgeyBwcmludGYoIlVzYWdlOiAlcyBbLXhtbF0gW25hbWUuLi5dXG4iLCBhdlswXSk7IGV4aXQoMik7IH0KICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBncmVldChhcmcpOwpAQCAtNzYsMjYgKzc2LDE0IEBACiAKICNpbmNsdWRlICJkbGZjbi5oIgogCi0jaWZkZWYgSE9UU1BPVF9MSUJfQVJDSAotI2RlZmluZSBMSUJBUkNIIEhPVFNQT1RfTElCX0FSQ0gKLSNlbmRpZgotI2lmZGVmIEhPVFNQT1RfT1MKLSNkZWZpbmUgT1MgSE9UU1BPVF9PUwotI2VuZGlmCi0KICNkZWZpbmUgREVDT0RFX0lOU1RSVUNUSU9OU19OQU1FICJkZWNvZGVfaW5zdHJ1Y3Rpb25zIgogI2RlZmluZSBIU0RJU19OQU1FICAgICAgICAgICAgICAgImhzZGlzIgogc3RhdGljIHZvaWQqIGRlY29kZV9pbnN0cnVjdGlvbnNfcHYgPSAwOwogc3RhdGljIGNvbnN0IGNoYXIqIGhzZGlzX3BhdGhbXSA9IHsKLSAgSFNESVNfTkFNRSIuc28iLAotI2lmZGVmIE9TCi0gICJiaW4vIk9TIi8iSFNESVNfTkFNRSIuc28iLAotI2VuZGlmCi0jaWZkZWYgTElCQVJDSAotICBIU0RJU19OQU1FIi0iTElCQVJDSCIuc28iLAotI2lmZGVmIE9TCi0gICJiaW4vIk9TIi8iSFNESVNfTkFNRSItIkxJQkFSQ0giLnNvIiwKLSNlbmRpZgorICBIU0RJU19OQU1FIi0iTElCQVJDSCBMSUJfRVhULAorICAiLi8iIEhTRElTX05BTUUiLSJMSUJBUkNIIExJQl9FWFQsCisjaWZkZWYgVEFSR0VUX0RJUgorICBUQVJHRVRfRElSIi8iSFNESVNfTkFNRSItIkxJQkFSQ0ggTElCX0VYVCwKICNlbmRpZgogICBOVUxMCiB9OwpAQCAtMTEyLDcgKzEwMCw3IEBACiAgICAgZm9yIChkbGxpYiA9IE5VTEw7IGRsbGliID09IE5VTEw7ICkgewogICAgICAgY29uc3QgY2hhciogbmV4dF9saWIgPSAoKm5leHRfaW5fcGF0aCsrKTsKICAgICAgIGlmIChuZXh0X2xpYiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gImNhbm5vdCBmaW5kIHBsdWdpbiAiSFNESVNfTkFNRSIuc28iOworICAgICAgICByZXR1cm4gImNhbm5vdCBmaW5kIHBsdWdpbiAiSFNESVNfTkFNRSBMSUJfRVhUOwogICAgICAgZGxsaWIgPSBkbG9wZW4obmV4dF9saWIsIFJUTERfTEFaWSk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS90b29scy9oc2Rpcy9oc2Rpcy5jIGIvaG90c3BvdC9zcmMvc2hhcmUvdG9vbHMvaHNkaXMvaHNkaXMuYwppbmRleCA3NWI3ZWZlLi44NDFhM2FmIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS90b29scy9oc2Rpcy9oc2Rpcy5jCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3Rvb2xzL2hzZGlzL2hzZGlzLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaWJpYmVydHkuaD4KICNpbmNsdWRlIDxiZmQuaD4KICNpbmNsdWRlIDxkaXMtYXNtLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2lmbmRlZiBib29sCiAjZGVmaW5lIGJvb2wgaW50CkBAIC00MDQsMjEgKzQwNSwyMSBAQAogfQogCiBzdGF0aWMgY29uc3QgY2hhciogbmF0aXZlX2FyY2hfbmFtZSgpIHsKLSAgY29uc3QgY2hhciogcmVzID0gSE9UU1BPVF9MSUJfQVJDSDsKKyAgY29uc3QgY2hhciogcmVzID0gTlVMTDsKKyNpZmRlZiBMSUJBUkNIX2kzODYKKyAgICByZXMgPSAiaTM4NiI7CisjZW5kaWYKICNpZmRlZiBMSUJBUkNIX2FtZDY0CiAgICAgcmVzID0gImkzODY6eDg2LTY0IjsKICNlbmRpZgogI2lmZGVmIExJQkFSQ0hfc3BhcmMKICAgICByZXMgPSAic3BhcmM6djhwbHVzYiI7CiAjZW5kaWYKLSNpZmRlZiBMSUJBUkNIX3NwYXJjCi0gICAgcmVzID0gInNwYXJjOnY4cGx1c2IiOwotI2VuZGlmCiAjaWZkZWYgTElCQVJDSF9zcGFyY3Y5CiAgICAgcmVzID0gInNwYXJjOnY5YiI7CiAjZW5kaWYKICAgaWYgKHJlcyA9PSBOVUxMKQotICAgIHJlcyA9ICJIT1RTUE9UX0xJQl9BUkNIIGlzIG5vdCBzZXQgaW4gTWFrZWZpbGUhIjsKKyAgICByZXMgPSAiYXJjaGl0ZWN0dXJlIG5vdCBzZXQgaW4gTWFrZWZpbGUhIjsKICAgcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vYzEvYzFfR3JhcGhCdWlsZGVyLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2MxL2MxX0dyYXBoQnVpbGRlci5jcHAKaW5kZXggNWI3ODM0Yy4uYTdlYmFjZCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vYzEvYzFfR3JhcGhCdWlsZGVyLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jMS9jMV9HcmFwaEJ1aWxkZXIuY3BwCkBAIC0xNTI0LDYgKzE1MjQsMTEgQEAKICAgICBjb2RlID0gQnl0ZWNvZGVzOjpfaW52b2tlc3BlY2lhbDsKICAgfQogCisgIGlmIChjb2RlID09IEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWMpIHsKKyAgICBCQUlMT1VUKCJpbnZva2VkeW5hbWljIE5ZSSIpOyAvLyBGSVhNRQorICAgIHJldHVybjsKKyAgfQorCiAgIC8vIE5FRURTX0NMRUFOVVAKICAgLy8gSSd2ZSBhZGRlZCB0aGUgdGFyZ2V0LWlzX2xvYWRlZCgpIHRlc3QgYmVsb3cgYnV0IEkgZG9uJ3QgcmVhbGx5IHVuZGVyc3RhbmQKICAgLy8gaG93IGtsYXNzLT5pc19sb2FkZWQoKSBjYW4gYmUgdHJ1ZSBhbmQgeWV0IHRhcmdldC0+aXNfbG9hZGVkKCkgaXMgZmFsc2UuCkBAIC0yNDMxLDggKzI0MzYsOCBAQAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsICA6IC8vIGZhbGwgdGhyb3VnaAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsICA6IC8vIGZhbGwgdGhyb3VnaAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWMgICA6IC8vIGZhbGwgdGhyb3VnaAorICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljICA6IC8vIGZhbGwgdGhyb3VnaAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2U6IGludm9rZShjb2RlKTsgYnJlYWs7Ci0gICAgICBjYXNlIEJ5dGVjb2Rlczo6X3h4eHVudXNlZHh4eCAgIDogU2hvdWxkTm90UmVhY2hIZXJlKCk7IGJyZWFrOwogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9uZXcgICAgICAgICAgICA6IG5ld19pbnN0YW5jZShzLmdldF9pbmRleF9iaWcoKSk7IGJyZWFrOwogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9uZXdhcnJheSAgICAgICA6IG5ld190eXBlX2FycmF5KCk7IGJyZWFrOwogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9hbmV3YXJyYXkgICAgICA6IG5ld19vYmplY3RfYXJyYXkoKTsgYnJlYWs7CkBAIC0yNTcxLDYgKzI1NzYsNyBAQAogICAgICwgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbAogICAgICwgQnl0ZWNvZGVzOjpfaW52b2tlc3BlY2lhbAogICAgICwgQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljCisgICAgLCBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljCiAgICAgLCBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2UKICAgICAsIEJ5dGVjb2Rlczo6X25ldwogICAgICwgQnl0ZWNvZGVzOjpfbmV3YXJyYXkKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2MxL2MxX0xpbmVhclNjYW4uY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vYzEvYzFfTGluZWFyU2Nhbi5jcHAKaW5kZXggMzI4YzJlMS4uNDAzMzJiMWUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2MxL2MxX0xpbmVhclNjYW4uY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2MxL2MxX0xpbmVhclNjYW4uY3BwCkBAIC0yOTU2LDkgKzI5NTYsMTEgQEAKIAogICBOT1RfUFJPRFVDVChwcmludF9pbnRlcnZhbHMoIkFmdGVyIFJlZ2lzdGVyIEFsbG9jYXRpb24iKSk7CiAgIE5PVF9QUk9EVUNUKHByaW50X2xpcigyLCAiTElSIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb246IikpOwotICBERUJVR19PTkxZKHZlcmlmeSgpKTsKIAogICBzb3J0X2ludGVydmFsc19hZnRlcl9hbGxvY2F0aW9uKCk7CisKKyAgREVCVUdfT05MWSh2ZXJpZnkoKSk7CisKICAgZWxpbWluYXRlX3NwaWxsX21vdmVzKCk7CiAgIGFzc2lnbl9yZWdfbnVtKCk7CiAgIENIRUNLX0JBSUxPVVQoKTsKQEAgLTMxNDcsNiArMzE0OSwxNiBAQAogCiAKIHZvaWQgTGluZWFyU2Nhbjo6dmVyaWZ5X25vX29vcHNfaW5fZml4ZWRfaW50ZXJ2YWxzKCkgeworICBJbnRlcnZhbCogZml4ZWRfaW50ZXJ2YWxzOworICBJbnRlcnZhbCogb3RoZXJfaW50ZXJ2YWxzOworICBjcmVhdGVfdW5oYW5kbGVkX2xpc3RzKCZmaXhlZF9pbnRlcnZhbHMsICZvdGhlcl9pbnRlcnZhbHMsIGlzX3ByZWNvbG9yZWRfY3B1X2ludGVydmFsLCBOVUxMKTsKKworICAvLyB0byBlbnN1cmUgYSB3YWxraW5nIHVudGlsIHRoZSBsYXN0IGluc3RydWN0aW9uIGlkLCBhZGQgYSBkdW1teSBpbnRlcnZhbAorICAvLyB3aXRoIGEgaGlnaCBvcGVyYXRpb24gaWQKKyAgb3RoZXJfaW50ZXJ2YWxzID0gbmV3IEludGVydmFsKGFueV9yZWcpOworICBvdGhlcl9pbnRlcnZhbHMtPmFkZF9yYW5nZShtYXhfamludCAtIDIsIG1heF9qaW50IC0gMSk7CisgIEludGVydmFsV2Fsa2VyKiBpdyA9IG5ldyBJbnRlcnZhbFdhbGtlcih0aGlzLCBmaXhlZF9pbnRlcnZhbHMsIG90aGVyX2ludGVydmFscyk7CisKICAgTElSX09wVmlzaXRTdGF0ZSB2aXNpdG9yOwogICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrX2NvdW50KCk7IGkrKykgewogICAgIEJsb2NrQmVnaW4qIGJsb2NrID0gYmxvY2tfYXQoaSk7CkBAIC0zMTU5LDYgKzMxNzEsNTQgQEAKIAogICAgICAgdmlzaXRvci52aXNpdChvcCk7CiAKKyAgICAgIGlmICh2aXNpdG9yLmluZm9fY291bnQoKSA+IDApIHsKKyAgICAgICAgaXctPndhbGtfYmVmb3JlKG9wLT5pZCgpKTsKKyAgICAgICAgYm9vbCBjaGVja19saXZlID0gdHJ1ZTsKKyAgICAgICAgaWYgKG9wLT5jb2RlKCkgPT0gbGlyX21vdmUpIHsKKyAgICAgICAgICBMSVJfT3AxKiBtb3ZlID0gKExJUl9PcDEqKW9wOworICAgICAgICAgIGNoZWNrX2xpdmUgPSAobW92ZS0+cGF0Y2hfY29kZSgpID09IGxpcl9wYXRjaF9ub25lKTsKKyAgICAgICAgfQorICAgICAgICBMSVJfT3BCcmFuY2gqIGJyYW5jaCA9IG9wLT5hc19PcEJyYW5jaCgpOworICAgICAgICBpZiAoYnJhbmNoICE9IE5VTEwgJiYgYnJhbmNoLT5zdHViKCkgIT0gTlVMTCAmJiBicmFuY2gtPnN0dWIoKS0+aXNfZXhjZXB0aW9uX3Rocm93X3N0dWIoKSkgeworICAgICAgICAgIC8vIERvbid0IGJvdGhlciBjaGVja2luZyB0aGUgc3R1YiBpbiB0aGlzIGNhc2Ugc2luY2UgdGhlCisgICAgICAgICAgLy8gZXhjZXB0aW9uIHN0dWIgd2lsbCBuZXZlciByZXR1cm4gdG8gbm9ybWFsIGNvbnRyb2wgZmxvdy4KKyAgICAgICAgICBjaGVja19saXZlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgbm9uZSBvZiB0aGUgZml4ZWQgcmVnaXN0ZXJzIGlzIGxpdmUgYWNyb3NzIGFuCisgICAgICAgIC8vIG9vcG1hcCBzaW5jZSB3ZSBjYW4ndCBoYW5kbGUgdGhhdCBjb3JyZWN0bHkuCisgICAgICAgIGlmIChjaGVja19saXZlKSB7CisgICAgICAgICAgZm9yIChJbnRlcnZhbCogaW50ZXJ2YWwgPSBpdy0+YWN0aXZlX2ZpcnN0KGZpeGVkS2luZCk7CisgICAgICAgICAgICAgICBpbnRlcnZhbCAhPSBJbnRlcnZhbDo6ZW5kKCk7CisgICAgICAgICAgICAgICBpbnRlcnZhbCA9IGludGVydmFsLT5uZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChpbnRlcnZhbC0+Y3VycmVudF90bygpID4gb3AtPmlkKCkgKyAxKSB7CisgICAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJ2YWwgaXMgbGl2ZSBvdXQgb2YgdGhpcyBvcCBzbyBtYWtlIHN1cmUKKyAgICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGludGVydmFsIHJlcHJlc2VudHMgc29tZSB2YWx1ZSB0aGF0J3MKKyAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlZCBieSB0aGlzIG9wIGVpdGhlciBhcyBhbiBpbnB1dCBvciBvdXRwdXQuCisgICAgICAgICAgICAgIGJvb2wgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgZm9yX2VhY2hfdmlzaXRvcl9tb2RlKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IHZpc2l0b3Iub3ByX2NvdW50KG1vZGUpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbjsgaysrKSB7CisgICAgICAgICAgICAgICAgICBMSVJfT3ByIG9wciA9IHZpc2l0b3Iub3ByX2F0KG1vZGUsIGspOworICAgICAgICAgICAgICAgICAgaWYgKG9wci0+aXNfZml4ZWRfY3B1KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsX2F0KHJlZ19udW0ob3ByKSkgPT0gaW50ZXJ2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICBvayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IGhpID0gcmVnX251bUhpKG9wcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChoaSAhPSAtMSAmJiBpbnRlcnZhbF9hdChoaSkgPT0gaW50ZXJ2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICBvayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYXNzZXJ0KG9rLCAiZml4ZWQgaW50ZXJ2YWxzIHNob3VsZCBuZXZlciBiZSBsaXZlIGFjcm9zcyBhbiBvb3BtYXAgcG9pbnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKwogICAgICAgLy8gb29wLW1hcHMgYXQgY2FsbHMgZG8gbm90IGNvbnRhaW4gcmVnaXN0ZXJzLCBzbyBjaGVjayBpcyBub3QgbmVlZGVkCiAgICAgICBpZiAoIXZpc2l0b3IuaGFzX2NhbGwoKSkgewogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jaS9iY0VzY2FwZUFuYWx5emVyLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NpL2JjRXNjYXBlQW5hbHl6ZXIuY3BwCmluZGV4IDRiMzUyNmQuLmU1YjZiNjYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NpL2JjRXNjYXBlQW5hbHl6ZXIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NpL2JjRXNjYXBlQW5hbHl6ZXIuY3BwCkBAIC04MzMsNiArODMzLDcgQEAKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDoKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3BlY2lhbDoKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljOgorICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2U6CiAgICAgICAgIHsgYm9vbCB3aWxsX2xpbms7CiAgICAgICAgICAgY2lNZXRob2QqIHRhcmdldCA9IHMuZ2V0X21ldGhvZCh3aWxsX2xpbmspOwpAQCAtODQ4LDkgKzg0OSw2IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCeXRlY29kZXM6Ol94eHh1bnVzZWR4eHg6Ci0gICAgICAgIFNob3VsZE5vdFJlYWNoSGVyZSgpOwotICAgICAgICBicmVhazsKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfbmV3OgogICAgICAgICBzdGF0ZS5hcHVzaChhbGxvY2F0ZWRfb2JqKTsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jaS9jaVN0cmVhbXMuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2kvY2lTdHJlYW1zLmNwcAppbmRleCA1NzdjMDZkLi41NDAxZTY0IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jaS9jaVN0cmVhbXMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NpL2NpU3RyZWFtcy5jcHAKQEAgLTMwMSwxNyArMzAxLDE5IEBACiAvLyBJZiB0aGlzIGlzIGEgbWV0aG9kIGludm9jYXRpb24gYnl0ZWNvZGUsIGdldCB0aGUgY29uc3RhbnQgcG9vbAogLy8gaW5kZXggb2YgdGhlIGludm9rZWQgbWV0aG9kLgogaW50IGNpQnl0ZWNvZGVTdHJlYW06OmdldF9tZXRob2RfaW5kZXgoKSB7CisjaWZkZWYgQVNTRVJUCiAgIHN3aXRjaCAoY3VyX2JjKCkpIHsKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2U6Ci0gICAgcmV0dXJuIEJ5dGVzOjpnZXRfSmF2YV91MihfcGMtNCk7CiAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDoKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsOgogICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYzoKLSAgICByZXR1cm4gZ2V0X2luZGV4X2JpZygpOworICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWM6CisgICAgYnJlYWs7CiAgIGRlZmF1bHQ6CiAgICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7Ci0gICAgcmV0dXJuIDA7CiAgIH0KKyNlbmRpZgorICByZXR1cm4gZ2V0X2luZGV4X2ludCgpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMzNyw2ICszMzksOSBAQAogLy8gZm9yIGNoZWNraW5nIGxpbmthYmlsaXR5IHdoZW4gcmV0cmlldmluZyB0aGUgYXNzb2NpYXRlZCBtZXRob2QuCiBjaUtsYXNzKiBjaUJ5dGVjb2RlU3RyZWFtOjpnZXRfZGVjbGFyZWRfbWV0aG9kX2hvbGRlcigpIHsKICAgYm9vbCBpZ25vcmU7CisgIC8vIHJlcG9ydCBhcyBEeW5hbWljIGZvciBpbnZva2VkeW5hbWljLCB3aGljaCBpcyBzeW50YWN0aWNhbGx5IGNsYXNzbGVzcworICBpZiAoY3VyX2JjKCkgPT0gQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYykKKyAgICByZXR1cm4gQ1VSUkVOVF9FTlYtPmdldF9rbGFzc19ieV9uYW1lKF9ob2xkZXIsIGNpU3ltYm9sOjpqYXZhX2R5bl9EeW5hbWljKCksIGZhbHNlKTsKICAgcmV0dXJuIENVUlJFTlRfRU5WLT5nZXRfa2xhc3NfYnlfaW5kZXgoX2hvbGRlciwgZ2V0X21ldGhvZF9ob2xkZXJfaW5kZXgoKSwgaWdub3JlKTsKIH0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2kvY2lTdHJlYW1zLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NpL2NpU3RyZWFtcy5ocHAKaW5kZXggZWViYjYwNC4uY2MzZTU1ZSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2kvY2lTdHJlYW1zLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jaS9jaVN0cmVhbXMuaHBwCkBAIC05MSw5ICs5MSwxMCBAQAogICAgIF9lbmQgPSBfc3RhcnQgKyBtYXg7CiAgIH0KIAotICBhZGRyZXNzIGN1cl9iY3AoKSAgICAgICAgICAgICB7IHJldHVybiBfYmNfc3RhcnQ7IH0gIC8vIFJldHVybnMgYmNwIHRvIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KKyAgYWRkcmVzcyBjdXJfYmNwKCkgY29uc3QgICAgICAgeyByZXR1cm4gX2JjX3N0YXJ0OyB9ICAvLyBSZXR1cm5zIGJjcCB0byBjdXJyZW50IGluc3RydWN0aW9uCiAgIGludCBuZXh0X2JjaSgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIF9wYyAtX3N0YXJ0OyB9CiAgIGludCBjdXJfYmNpKCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIF9iY19zdGFydCAtIF9zdGFydDsgfQorICBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSgpIGNvbnN0ICB7IHJldHVybiBfcGMgLSBfYmNfc3RhcnQ7IH0KIAogICBCeXRlY29kZXM6OkNvZGUgY3VyX2JjKCkgY29uc3R7IHJldHVybiBjaGVja19qYXZhKF9iYyk7IH0KICAgQnl0ZWNvZGVzOjpDb2RlIG5leHRfYmMoKSAgICAgeyByZXR1cm4gQnl0ZWNvZGVzOjpqYXZhX2NvZGUoKEJ5dGVjb2Rlczo6Q29kZSkqIF9wYyk7IH0KQEAgLTEyMSwzNCArMTIyLDM5IEBACiAgICAgcmV0dXJuIGNoZWNrX2phdmEoX2JjKTsKICAgfQogCi0gIGJvb2wgaXNfd2lkZSgpICB7IHJldHVybiAoIF9wYyA9PSBfd2FzX3dpZGUgKTsgfQorICBib29sIGlzX3dpZGUoKSBjb25zdCB7IHJldHVybiAoIF9wYyA9PSBfd2FzX3dpZGUgKTsgfQogCiAgIC8vIEdldCBhIGJ5dGUgaW5kZXggZm9sbG93aW5nIHRoaXMgYnl0ZWNvZGUuCiAgIC8vIElmIHByZWZpeGVkIHdpdGggYSB3aWRlIGJ5dGVjb2RlLCBnZXQgYSB3aWRlIGluZGV4LgogICBpbnQgZ2V0X2luZGV4KCkgY29uc3QgeworICAgIGFzc2VydF9pbmRleF9zaXplKGlzX3dpZGUoKSA/IDIgOiAxKTsKICAgICByZXR1cm4gKF9wYyA9PSBfd2FzX3dpZGUpICAgLy8gd2FzIHdpZGVuZWQ/CiAgICAgICA/IEJ5dGVzOjpnZXRfSmF2YV91MihfYmNfc3RhcnQrMikgLy8geWVzLCByZXR1cm4gd2lkZSBpbmRleAogICAgICAgOiBfYmNfc3RhcnRbMV07ICAgICAgICAgICAvLyBubywgcmV0dXJuIG5hcnJvdyBpbmRleAogICB9CiAKLSAgLy8gU2V0IGEgYnl0ZSBpbmRleCBmb2xsb3dpbmcgdGhpcyBieXRlY29kZS4KLSAgLy8gSWYgcHJlZml4ZWQgd2l0aCBhIHdpZGUgYnl0ZWNvZGUsIGdldCBhIHdpZGUgaW5kZXguCi0gIHZvaWQgcHV0X2luZGV4KGludCBpZHgpIHsKLSAgICAgIGlmIChfcGMgPT0gX3dhc193aWRlKSAgICAgLy8gd2FzIHdpZGVuZWQ/Ci0gICAgICAgICBCeXRlczo6cHV0X0phdmFfdTIoX2JjX3N0YXJ0KzIsaWR4KTsgICAvLyB5ZXMsIHNldCB3aWRlIGluZGV4Ci0gICAgICBlbHNlCi0gICAgICAgICBfYmNfc3RhcnRbMV09aWR4OyAgICAgICAgICAgICAgLy8gbm8sIHNldCBuYXJyb3cgaW5kZXgKKyAgLy8gR2V0IDItYnl0ZSBpbmRleCAoZ2V0ZmllbGQvcHV0c3RhdGljL2V0YykKKyAgaW50IGdldF9pbmRleF9iaWcoKSBjb25zdCB7CisgICAgYXNzZXJ0X2luZGV4X3NpemUoMik7CisgICAgcmV0dXJuIEJ5dGVzOjpnZXRfSmF2YV91MihfYmNfc3RhcnQrMSk7CiAgIH0KIAotICAvLyBHZXQgMi1ieXRlIGluZGV4IChnZXRmaWVsZC9wdXRzdGF0aWMvZXRjKQotICBpbnQgZ2V0X2luZGV4X2JpZygpIGNvbnN0IHsgcmV0dXJuIEJ5dGVzOjpnZXRfSmF2YV91MihfYmNfc3RhcnQrMSk7IH0KKyAgLy8gR2V0IDItYnl0ZSBpbmRleCAob3IgNC1ieXRlLCBmb3IgaW52b2tlZHluYW1pYykKKyAgaW50IGdldF9pbmRleF9pbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc19naWFudF9pbmRleCgpID8gZ2V0X2luZGV4X2dpYW50KCkgOiBnZXRfaW5kZXhfYmlnKCk7CisgIH0KKworICAvLyBHZXQgNC1ieXRlIGluZGV4LCBmb3IgaW52b2tlZHluYW1pYy4KKyAgaW50IGdldF9pbmRleF9naWFudCgpIGNvbnN0IHsKKyAgICBhc3NlcnRfaW5kZXhfc2l6ZSg0KTsKKyAgICByZXR1cm4gQnl0ZXM6OmdldF9uYXRpdmVfdTQoX2JjX3N0YXJ0KzEpOworICB9CisKKyAgYm9vbCBoYXNfZ2lhbnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiAoY3VyX2JjKCkgPT0gQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYyk7IH0KIAogICAvLyBHZXQgZGltZW5zaW9ucyBieXRlIChtdWx0aW5ld2FycmF5KQogICBpbnQgZ2V0X2RpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiAqKHVuc2lnbmVkIGNoYXIqKShfcGMtMSk7IH0KIAotICAvLyBHZXQgdW5zaWduZWQgaW5kZXggZmFzdAotICBpbnQgZ2V0X2luZGV4X2Zhc3QoKSBjb25zdCB7IHJldHVybiBCeXRlczo6Z2V0X25hdGl2ZV91MihfcGMtMik7IH0KLQogICAvLyBTaWduLWV4dGVuZGVkIGluZGV4IGJ5dGUvc2hvcnQsIG5vIHdpZGVuaW5nCiAgIGludCBnZXRfYnl0ZSgpIGNvbnN0IHsgcmV0dXJuIChpbnQ4X3QpKF9wY1stMV0pOyB9CiAgIGludCBnZXRfc2hvcnQoKSBjb25zdCB7IHJldHVybiAoaW50MTZfdClCeXRlczo6Z2V0X0phdmFfdTIoX3BjLTIpOyB9CkBAIC0yMjUsNiArMjMxLDIyIEBACiAgIGNpS2xhc3MqICBnZXRfZGVjbGFyZWRfbWV0aG9kX2hvbGRlcigpOwogICBpbnQgICAgICAgZ2V0X21ldGhvZF9ob2xkZXJfaW5kZXgoKTsKICAgaW50ICAgICAgIGdldF9tZXRob2Rfc2lnbmF0dXJlX2luZGV4KCk7CisKKyBwcml2YXRlOgorICB2b2lkIGFzc2VydF9pbmRleF9zaXplKGludCByZXF1aXJlZF9zaXplKSBjb25zdCB7CisjaWZkZWYgQVNTRVJUCisgICAgaW50IGlzaXplID0gaW5zdHJ1Y3Rpb25fc2l6ZSgpIC0gKGlzX3dpZGUoKSA/IDEgOiAwKSAtIDE7CisgICAgaWYgKGlzaXplID09IDIgJiYgIGN1cl9iYygpID09IEJ5dGVjb2Rlczo6X2lpbmMpCisgICAgICBpc2l6ZSA9IDE7CisgICAgZWxzZSBpZiAoaXNpemUgPD0gMikKKyAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlCisgICAgZWxzZSBpZiAoaGFzX2dpYW50X2luZGV4KCkpCisgICAgICBpc2l6ZSA9IDQ7CisgICAgZWxzZQorICAgICAgaXNpemUgPSAyOworICAgIGFzc2VydChpc2l6ZSA9IHJlcXVpcmVkX3NpemUsICJ3cm9uZyBpbmRleCBzaXplIik7CisjZW5kaWYKKyAgfQogfTsKIAogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvY2xhc3NMb2FkZXIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2NsYXNzTG9hZGVyLmNwcAppbmRleCAyZTkzY2QwLi45ZTQ4YzkwIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvY2xhc3NMb2FkZXIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9jbGFzc0xvYWRlci5jcHAKQEAgLTEyMTcsMzEgKzEyMTcsMzQgQEAKICAgICAvLyB2YWxpZCBjbGFzcyBmaWxlLiAgVGhlIGNsYXNzIGxvYWRlciB3aWxsIGNoZWNrIGV2ZXJ5dGhpbmcgZWxzZS4KICAgICBpZiAoc3RyY2hyKGJ1ZmZlciwgJy4nKSA9PSBOVUxMKSB7CiAgICAgICBfY29tcGlsZV90aGVfd29ybGRfY291bnRlcisrOwotICAgICAgaWYgKF9jb21waWxlX3RoZV93b3JsZF9jb3VudGVyID49IENvbXBpbGVUaGVXb3JsZFN0YXJ0QXQgJiYgX2NvbXBpbGVfdGhlX3dvcmxkX2NvdW50ZXIgPD0gQ29tcGlsZVRoZVdvcmxkU3RvcEF0KSB7Ci0gICAgICAgIC8vIENvbnN0cnVjdCBuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uCi0gICAgICAgIHN5bWJvbEhhbmRsZSBzeW0gPSBvb3BGYWN0b3J5OjpuZXdfc3ltYm9sX2hhbmRsZShidWZmZXIsIENIRUNLKTsKLSAgICAgICAgLy8gVXNlIGxvYWRlciB0byBsb2FkIGFuZCBpbml0aWFsaXplIGNsYXNzCi0gICAgICAgIGtsYXNzT29wIGlrID0gU3lzdGVtRGljdGlvbmFyeTo6cmVzb2x2ZV9vcl9udWxsKHN5bSwgbG9hZGVyLCBIYW5kbGUoKSwgVEhSRUFEKTsKLSAgICAgICAgaW5zdGFuY2VLbGFzc0hhbmRsZSBrIChUSFJFQUQsIGlrKTsKLSAgICAgICAgaWYgKGsubm90X251bGwoKSAmJiAhSEFTX1BFTkRJTkdfRVhDRVBUSU9OKSB7Ci0gICAgICAgICAgay0+aW5pdGlhbGl6ZShUSFJFQUQpOworICAgICAgaWYgKF9jb21waWxlX3RoZV93b3JsZF9jb3VudGVyID4gQ29tcGlsZVRoZVdvcmxkU3RvcEF0KSByZXR1cm47CisKKyAgICAgIC8vIENvbnN0cnVjdCBuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uCisgICAgICBzeW1ib2xIYW5kbGUgc3ltID0gb29wRmFjdG9yeTo6bmV3X3N5bWJvbF9oYW5kbGUoYnVmZmVyLCBDSEVDSyk7CisgICAgICAvLyBVc2UgbG9hZGVyIHRvIGxvYWQgYW5kIGluaXRpYWxpemUgY2xhc3MKKyAgICAgIGtsYXNzT29wIGlrID0gU3lzdGVtRGljdGlvbmFyeTo6cmVzb2x2ZV9vcl9udWxsKHN5bSwgbG9hZGVyLCBIYW5kbGUoKSwgVEhSRUFEKTsKKyAgICAgIGluc3RhbmNlS2xhc3NIYW5kbGUgayAoVEhSRUFELCBpayk7CisgICAgICBpZiAoay5ub3RfbnVsbCgpICYmICFIQVNfUEVORElOR19FWENFUFRJT04pIHsKKyAgICAgICAgay0+aW5pdGlhbGl6ZShUSFJFQUQpOworICAgICAgfQorICAgICAgYm9vbCBleGNlcHRpb25fb2NjdXJyZWQgPSBIQVNfUEVORElOR19FWENFUFRJT047CisgICAgICBDTEVBUl9QRU5ESU5HX0VYQ0VQVElPTjsKKyAgICAgIGlmIChDb21waWxlVGhlV29ybGRQcmVsb2FkQ2xhc3NlcyAmJiBrLm5vdF9udWxsKCkpIHsKKyAgICAgICAgY29uc3RhbnRQb29sS2xhc3M6OnByZWxvYWRfYW5kX2luaXRpYWxpemVfYWxsX2NsYXNzZXMoay0+Y29uc3RhbnRzKCksIFRIUkVBRCk7CisgICAgICAgIGlmIChIQVNfUEVORElOR19FWENFUFRJT04pIHsKKyAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiBwcmVsb2FkaW5nIHdlIGp1c3QgaWdub3JlIGl0CisgICAgICAgICAgQ0xFQVJfUEVORElOR19FWENFUFRJT047CisgICAgICAgICAgdHR5LT5wcmludF9jcigiUHJlbG9hZGluZyBmYWlsZWQgZm9yICglZCkgJXMiLCBfY29tcGlsZV90aGVfd29ybGRfY291bnRlciwgYnVmZmVyKTsKICAgICAgICAgfQotICAgICAgICBib29sIGV4Y2VwdGlvbl9vY2N1cnJlZCA9IEhBU19QRU5ESU5HX0VYQ0VQVElPTjsKLSAgICAgICAgQ0xFQVJfUEVORElOR19FWENFUFRJT047CisgICAgICB9CisKKyAgICAgIGlmIChfY29tcGlsZV90aGVfd29ybGRfY291bnRlciA+PSBDb21waWxlVGhlV29ybGRTdGFydEF0KSB7CiAgICAgICAgIGlmIChrLmlzX251bGwoKSB8fCAoZXhjZXB0aW9uX29jY3VycmVkICYmICFDb21waWxlVGhlV29ybGRJZ25vcmVJbml0RXJyb3JzKSkgewogICAgICAgICAgIC8vIElmIHNvbWV0aGluZyB3ZW50IHdyb25nIChlLmcuIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcikgd2Ugc2tpcCB0aGlzIGNsYXNzCiAgICAgICAgICAgdHR5LT5wcmludF9jcigiQ29tcGlsZVRoZVdvcmxkICglZCkgOiBTa2lwcGluZyAlcyIsIF9jb21waWxlX3RoZV93b3JsZF9jb3VudGVyLCBidWZmZXIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHR0eS0+cHJpbnRfY3IoIkNvbXBpbGVUaGVXb3JsZCAoJWQpIDogJXMiLCBfY29tcGlsZV90aGVfd29ybGRfY291bnRlciwgYnVmZmVyKTsKICAgICAgICAgICAvLyBQcmVsb2FkIGFsbCBjbGFzc2VzIHRvIGdldCBhcm91bmQgdW5jb21tb24gdHJhcHMKLSAgICAgICAgICBpZiAoQ29tcGlsZVRoZVdvcmxkUHJlbG9hZENsYXNzZXMpIHsKLSAgICAgICAgICAgIGNvbnN0YW50UG9vbEtsYXNzOjpwcmVsb2FkX2FuZF9pbml0aWFsaXplX2FsbF9jbGFzc2VzKGstPmNvbnN0YW50cygpLCBUSFJFQUQpOwotICAgICAgICAgICAgaWYgKEhBU19QRU5ESU5HX0VYQ0VQVElPTikgewotICAgICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiBwcmVsb2FkaW5nIHdlIGp1c3QgaWdub3JlIGl0Ci0gICAgICAgICAgICAgIENMRUFSX1BFTkRJTkdfRVhDRVBUSU9OOwotICAgICAgICAgICAgICB0dHktPnByaW50X2NyKCJQcmVsb2FkaW5nIGZhaWxlZCBmb3IgKCVkKSAlcyIsIF9jb21waWxlX3RoZV93b3JsZF9jb3VudGVyLCBidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG1ldGhvZHMgaW4gY2xhc3MKICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGstPm1ldGhvZHMoKS0+bGVuZ3RoKCk7IG4rKykgewogICAgICAgICAgICAgbWV0aG9kSGFuZGxlIG0gKFRIUkVBRCwgbWV0aG9kT29wKGstPm1ldGhvZHMoKS0+b2JqX2F0KG4pKSk7CkBAIC0xMjUzLDE2ICsxMjU2LDI4IEBACiAgICAgICAgICAgICAgICAgQ0xFQVJfUEVORElOR19FWENFUFRJT047CiAgICAgICAgICAgICAgICAgdHR5LT5wcmludF9jcigiQ29tcGlsZVRoZVdvcmxkICglZCkgOiBTa2lwcGluZyBtZXRob2Q6ICVzIiwgX2NvbXBpbGVfdGhlX3dvcmxkX2NvdW50ZXIsIG0tPm5hbWUoKS0+YXNfQ19zdHJpbmcoKSk7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChUaWVyZWRDb21waWxhdGlvbikgewotICAgICAgICAgICAgICAvLyBDbG9iYmVyIHRoZSBmaXJzdCBjb21waWxlIGFuZCBmb3JjZSBzZWNvbmQgdGllciBjb21waWxhdGlvbgotICAgICAgICAgICAgICBtLT5jbGVhcl9jb2RlKCk7Ci0gICAgICAgICAgICAgIENvbXBpbGVCcm9rZXI6OmNvbXBpbGVfbWV0aG9kKG0sIEludm9jYXRpb25FbnRyeUJjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSGFuZGxlKCksIDAsICJDVFciLCBUSFJFQUQpOwotICAgICAgICAgICAgICBpZiAoSEFTX1BFTkRJTkdfRVhDRVBUSU9OKSB7Ci0gICAgICAgICAgICAgICAgQ0xFQVJfUEVORElOR19FWENFUFRJT047Ci0gICAgICAgICAgICAgICAgdHR5LT5wcmludF9jcigiQ29tcGlsZVRoZVdvcmxkICglZCkgOiBTa2lwcGluZyBtZXRob2Q6ICVzIiwgX2NvbXBpbGVfdGhlX3dvcmxkX2NvdW50ZXIsIG0tPm5hbWUoKS0+YXNfQ19zdHJpbmcoKSk7CisgICAgICAgICAgICAgIGlmIChUaWVyZWRDb21waWxhdGlvbikgeworICAgICAgICAgICAgICAgIC8vIENsb2JiZXIgdGhlIGZpcnN0IGNvbXBpbGUgYW5kIGZvcmNlIHNlY29uZCB0aWVyIGNvbXBpbGF0aW9uCisgICAgICAgICAgICAgICAgbm1ldGhvZCogbm0gPSBtLT5jb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKG5tICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFRocm93IG91dCB0aGUgY29kZSBzbyB0aGF0IHRoZSBjb2RlIGNhY2hlIGRvZXNuJ3QgZmlsbCB1cAorICAgICAgICAgICAgICAgICAgbm0tPm1ha2Vfbm90X2VudHJhbnQoKTsKKyAgICAgICAgICAgICAgICAgIG0tPmNsZWFyX2NvZGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29tcGlsZUJyb2tlcjo6Y29tcGlsZV9tZXRob2QobSwgSW52b2NhdGlvbkVudHJ5QmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEhhbmRsZSgpLCAwLCAiQ1RXIiwgVEhSRUFEKTsKKyAgICAgICAgICAgICAgICBpZiAoSEFTX1BFTkRJTkdfRVhDRVBUSU9OKSB7CisgICAgICAgICAgICAgICAgICBDTEVBUl9QRU5ESU5HX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgIHR0eS0+cHJpbnRfY3IoIkNvbXBpbGVUaGVXb3JsZCAoJWQpIDogU2tpcHBpbmcgbWV0aG9kOiAlcyIsIF9jb21waWxlX3RoZV93b3JsZF9jb3VudGVyLCBtLT5uYW1lKCktPmFzX0Nfc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBubWV0aG9kKiBubSA9IG0tPmNvZGUoKTsKKyAgICAgICAgICAgIGlmIChubSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIC8vIFRocm93IG91dCB0aGUgY29kZSBzbyB0aGF0IHRoZSBjb2RlIGNhY2hlIGRvZXNuJ3QgZmlsbCB1cAorICAgICAgICAgICAgICBubS0+bWFrZV9ub3RfZW50cmFudCgpOworICAgICAgICAgICAgICBtLT5jbGVhcl9jb2RlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvamF2YUNsYXNzZXMuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2phdmFDbGFzc2VzLmNwcAppbmRleCA3NTBlZDcxLi4yNDhhMTAzIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvamF2YUNsYXNzZXMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9qYXZhQ2xhc3Nlcy5jcHAKQEAgLTI0MzAsNiArMjQzMCw0MSBAQAogfQogCiAKKy8vIFN1cHBvcnQgZm9yIHN1bl9keW5fQ2FsbFNpdGVJbXBsCisKK2ludCBzdW5fZHluX0NhbGxTaXRlSW1wbDo6X3R5cGVfb2Zmc2V0OworaW50IHN1bl9keW5fQ2FsbFNpdGVJbXBsOjpfdGFyZ2V0X29mZnNldDsKK2ludCBzdW5fZHluX0NhbGxTaXRlSW1wbDo6X3ZtbWV0aG9kX29mZnNldDsKKwordm9pZCBzdW5fZHluX0NhbGxTaXRlSW1wbDo6Y29tcHV0ZV9vZmZzZXRzKCkgeworICBpZiAoIUVuYWJsZUludm9rZUR5bmFtaWMpICByZXR1cm47CisgIGtsYXNzT29wIGsgPSBTeXN0ZW1EaWN0aW9uYXJ5OjpDYWxsU2l0ZUltcGxfa2xhc3MoKTsKKyAgaWYgKGsgIT0gTlVMTCkgeworICAgIGNvbXB1dGVfb2Zmc2V0KF90eXBlX29mZnNldCwgICBrLCB2bVN5bWJvbHM6OnR5cGVfbmFtZSgpLCAgIHZtU3ltYm9sczo6amF2YV9keW5fTWV0aG9kVHlwZV9zaWduYXR1cmUoKSwgdHJ1ZSk7CisgICAgY29tcHV0ZV9vZmZzZXQoX3RhcmdldF9vZmZzZXQsIGssIHZtU3ltYm9sczo6dGFyZ2V0X25hbWUoKSwgdm1TeW1ib2xzOjpqYXZhX2R5bl9NZXRob2RIYW5kbGVfc2lnbmF0dXJlKCksIHRydWUpOworICAgIGNvbXB1dGVfb2Zmc2V0KF92bW1ldGhvZF9vZmZzZXQsIGssIHZtU3ltYm9sczo6dm1tZXRob2RfbmFtZSgpLCB2bVN5bWJvbHM6Om9iamVjdF9zaWduYXR1cmUoKSwgdHJ1ZSk7CisgIH0KK30KKworb29wIHN1bl9keW5fQ2FsbFNpdGVJbXBsOjp0eXBlKG9vcCBzaXRlKSB7CisgIHJldHVybiBzaXRlLT5vYmpfZmllbGQoX3R5cGVfb2Zmc2V0KTsKK30KKworb29wIHN1bl9keW5fQ2FsbFNpdGVJbXBsOjp0YXJnZXQob29wIHNpdGUpIHsKKyAgcmV0dXJuIHNpdGUtPm9ial9maWVsZChfdGFyZ2V0X29mZnNldCk7Cit9CisKK3ZvaWQgc3VuX2R5bl9DYWxsU2l0ZUltcGw6OnNldF90YXJnZXQob29wIHNpdGUsIG9vcCB0YXJnZXQpIHsKKyAgc2l0ZS0+b2JqX2ZpZWxkX3B1dChfdGFyZ2V0X29mZnNldCwgdGFyZ2V0KTsKK30KKworb29wIHN1bl9keW5fQ2FsbFNpdGVJbXBsOjp2bW1ldGhvZChvb3Agc2l0ZSkgeworICByZXR1cm4gc2l0ZS0+b2JqX2ZpZWxkKF92bW1ldGhvZF9vZmZzZXQpOworfQorCit2b2lkIHN1bl9keW5fQ2FsbFNpdGVJbXBsOjpzZXRfdm1tZXRob2Qob29wIHNpdGUsIG9vcCByZWYpIHsKKyAgc2l0ZS0+b2JqX2ZpZWxkX3B1dChfdm1tZXRob2Rfb2Zmc2V0LCByZWYpOworfQogCiAKIC8vIFN1cHBvcnQgZm9yIGphdmFfc2VjdXJpdHlfQWNjZXNzQ29udHJvbENvbnRleHQKQEAgLTI3NzUsNiArMjgxMCw5IEBACiAgICAgamF2YV9keW5fTWV0aG9kVHlwZTo6Y29tcHV0ZV9vZmZzZXRzKCk7CiAgICAgamF2YV9keW5fTWV0aG9kVHlwZUZvcm06OmNvbXB1dGVfb2Zmc2V0cygpOwogICB9CisgIGlmIChFbmFibGVJbnZva2VEeW5hbWljKSB7CisgICAgc3VuX2R5bl9DYWxsU2l0ZUltcGw6OmNvbXB1dGVfb2Zmc2V0cygpOworICB9CiAgIGphdmFfc2VjdXJpdHlfQWNjZXNzQ29udHJvbENvbnRleHQ6OmNvbXB1dGVfb2Zmc2V0cygpOwogICAvLyBJbml0aWFsaXplIHJlZmxlY3Rpb24gY2xhc3Nlcy4gVGhlIGxheW91dHMgb2YgdGhlc2UgY2xhc3NlcwogICAvLyBjaGFuZ2VkIHdpdGggdGhlIG5ldyByZWZsZWN0aW9uIGltcGxlbWVudGF0aW9uIGluIEpESyAxLjQsIGFuZApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2phdmFDbGFzc2VzLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9qYXZhQ2xhc3Nlcy5ocHAKaW5kZXggOGQ2OTljOC4uNTFlMjgxNyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2phdmFDbGFzc2VzLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvamF2YUNsYXNzZXMuaHBwCkBAIC0xMDYwLDYgKzEwNjAsMzMgQEAKIH07CiAKIAorLy8gSW50ZXJmYWNlIHRvIHN1bi5keW4uQ2FsbFNpdGVJbXBsIG9iamVjdHMKKworY2xhc3Mgc3VuX2R5bl9DYWxsU2l0ZUltcGw6IEFsbFN0YXRpYyB7CisgIGZyaWVuZCBjbGFzcyBKYXZhQ2xhc3NlczsKKworcHJpdmF0ZToKKyAgc3RhdGljIGludCBfdHlwZV9vZmZzZXQ7CisgIHN0YXRpYyBpbnQgX3RhcmdldF9vZmZzZXQ7CisgIHN0YXRpYyBpbnQgX3ZtbWV0aG9kX29mZnNldDsKKworICBzdGF0aWMgdm9pZCBjb21wdXRlX29mZnNldHMoKTsKKworcHVibGljOgorICAvLyBBY2Nlc3NvcnMKKyAgc3RhdGljIG9vcCAgICAgICAgICAgIHR5cGUob29wIHNpdGUpOworCisgIHN0YXRpYyBvb3AgICAgICAgICAgICB0YXJnZXQob29wIHNpdGUpOworICBzdGF0aWMgdm9pZCAgICAgICBzZXRfdGFyZ2V0KG9vcCBzaXRlLCBvb3AgdGFyZ2V0KTsKKworICBzdGF0aWMgb29wICAgICAgICAgICAgdm1tZXRob2Qob29wIHNpdGUpOworICBzdGF0aWMgdm9pZCAgICAgICBzZXRfdm1tZXRob2Qob29wIHNpdGUsIG9vcCByZWYpOworCisgIC8vIEFjY2Vzc29ycyBmb3IgY29kZSBnZW5lcmF0aW9uOgorICBzdGF0aWMgaW50IHRhcmdldF9vZmZzZXRfaW5fYnl0ZXMoKSAgICAgICAgICAgeyByZXR1cm4gX3RhcmdldF9vZmZzZXQ7IH0KKyAgc3RhdGljIGludCB0eXBlX29mZnNldF9pbl9ieXRlcygpICAgICAgICAgICAgIHsgcmV0dXJuIF90eXBlX29mZnNldDsgfQorICBzdGF0aWMgaW50IHZtbWV0aG9kX29mZnNldF9pbl9ieXRlcygpICAgICAgICAgeyByZXR1cm4gX3ZtbWV0aG9kX29mZnNldDsgfQorfTsKIAogCiAvLyBJbnRlcmZhY2UgdG8gamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCBvYmplY3RzCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvc3lzdGVtRGljdGlvbmFyeS5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvc3lzdGVtRGljdGlvbmFyeS5jcHAKaW5kZXggZTZiNDE0My4uYmFlYzc0ZiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL3N5c3RlbURpY3Rpb25hcnkuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9zeXN0ZW1EaWN0aW9uYXJ5LmNwcApAQCAtMTk1MSw2ICsxOTUxLDE2IEBACiAgICAgLy8gU2tpcCB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kIGhhbmRsZSBjbGFzc2VzLCBpZiBNZXRob2RIYW5kbGUgaXMgbm90IGxvYWRlZC4KICAgICBzY2FuID0gV0tJRChtZXRoX2dyb3VwX2VuZCsxKTsKICAgfQorICBXS0lEIGluZHlfZ3JvdXBfc3RhcnQgPSBXS19LTEFTU19FTlVNX05BTUUoTGlua2FnZV9rbGFzcyk7CisgIFdLSUQgaW5keV9ncm91cF9lbmQgICA9IFdLX0tMQVNTX0VOVU1fTkFNRShEeW5hbWljX2tsYXNzKTsKKyAgaW5pdGlhbGl6ZV93a19rbGFzc2VzX3VudGlsKGluZHlfZ3JvdXBfc3RhcnQsIHNjYW4sIENIRUNLKTsKKyAgaWYgKEVuYWJsZUludm9rZUR5bmFtaWMpIHsKKyAgICBpbml0aWFsaXplX3drX2tsYXNzZXNfdGhyb3VnaChpbmR5X2dyb3VwX3N0YXJ0LCBzY2FuLCBDSEVDSyk7CisgIH0KKyAgaWYgKF93ZWxsX2tub3duX2tsYXNzZXNbaW5keV9ncm91cF9zdGFydF0gPT0gTlVMTCkgeworICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgdGhlIGR5bmFtaWMgdHlwaW5nIGNsYXNzZXMsIGlmIExpbmthZ2UgaXMgbm90IGxvYWRlZC4KKyAgICBzY2FuID0gV0tJRChpbmR5X2dyb3VwX2VuZCsxKTsKKyAgfQogCiAgIGluaXRpYWxpemVfd2tfa2xhc3Nlc191bnRpbChXS0lEX0xJTUlULCBzY2FuLCBDSEVDSyk7CiAKQEAgLTIzNjcsNiArMjM3Nyw3NiBAQAogfQogCiAKKy8vIEFzayBKYXZhIGNvZGUgdG8gZmluZCBvciBjb25zdHJ1Y3QgYSBqYXZhLmR5bi5DYWxsU2l0ZSBmb3IgdGhlIGdpdmVuCisvLyBuYW1lIGFuZCBzaWduYXR1cmUsIGFzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBjbGFzcyBsb2FkZXIuCitIYW5kbGUgU3lzdGVtRGljdGlvbmFyeTo6bWFrZV9keW5hbWljX2NhbGxfc2l0ZShLbGFzc0hhbmRsZSBjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FsbGVyX21ldGhvZF9pZG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWxsZXJfYmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sSGFuZGxlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RIYW5kbGUgbWhfaW52ZHluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBUFMpIHsKKyAgSGFuZGxlIGVtcHR5OworICAvLyBjYWxsIHN1bi5keW4uQ2FsbFNpdGVJbXBsOjptYWtlU2l0ZShjYWxsZXIsIG5hbWUsIG10eXBlLCBjbWlkLCBjYmNpKQorICBvb3AgbmFtZV9zdHJfb29wID0gU3RyaW5nVGFibGU6OmludGVybihuYW1lKCksIENIRUNLXyhlbXB0eSkpOyAvLyBub3QgYSBoYW5kbGUhCisgIEphdmFDYWxsQXJndW1lbnRzIGFyZ3MoSGFuZGxlKFRIUkVBRCwgY2FsbGVyLT5qYXZhX21pcnJvcigpKSk7CisgIGFyZ3MucHVzaF9vb3AobmFtZV9zdHJfb29wKTsKKyAgYXJncy5wdXNoX29vcChtaF9pbnZkeW4tPm1ldGhvZF9oYW5kbGVfdHlwZSgpKTsKKyAgYXJncy5wdXNoX2ludChjYWxsZXJfbWV0aG9kX2lkbnVtKTsKKyAgYXJncy5wdXNoX2ludChjYWxsZXJfYmNpKTsKKyAgSmF2YVZhbHVlIHJlc3VsdChUX09CSkVDVCk7CisgIEphdmFDYWxsczo6Y2FsbF9zdGF0aWMoJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1EaWN0aW9uYXJ5OjpDYWxsU2l0ZUltcGxfa2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2bVN5bWJvbHM6Om1ha2VTaXRlX25hbWUoKSwgdm1TeW1ib2xzOjptYWtlU2l0ZV9zaWduYXR1cmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYXJncywgQ0hFQ0tfKGVtcHR5KSk7CisgIG9vcCBjYWxsX3NpdGVfb29wID0gKG9vcCkgcmVzdWx0LmdldF9qb2JqZWN0KCk7CisgIHN1bl9keW5fQ2FsbFNpdGVJbXBsOjpzZXRfdm1tZXRob2QoY2FsbF9zaXRlX29vcCwgbWhfaW52ZHluKCkpOworICBpZiAoVHJhY2VNZXRob2RIYW5kbGVzKSB7CisgICAgdHR5LT5wcmludF9jcigiTGlua2VkIGludm9rZWR5bmFtaWMgYmNpPSVkIHNpdGU9IklOVFBUUl9GT1JNQVQiOiIsIGNhbGxlcl9iY2ksIGNhbGxfc2l0ZV9vb3ApOworICAgIGNhbGxfc2l0ZV9vb3AtPnByaW50KCk7CisgICAgdHR5LT5jcigpOworICB9CisgIHJldHVybiBjYWxsX3NpdGVfb29wOworfQorCitIYW5kbGUgU3lzdGVtRGljdGlvbmFyeTo6ZmluZF9ib290c3RyYXBfbWV0aG9kKEtsYXNzSGFuZGxlIGNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2xhc3NIYW5kbGUgc2VhcmNoX2Jvb3RzdHJhcF9rbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBUFMpIHsKKyAgSGFuZGxlIGVtcHR5OworICBpZiAoIWNhbGxlci0+b29wX2lzX2luc3RhbmNlKCkpICByZXR1cm4gZW1wdHk7CisKKyAgaW5zdGFuY2VLbGFzc0hhbmRsZSBpayhUSFJFQUQsIGNhbGxlcigpKTsKKworICBpZiAoaWstPmJvb3RzdHJhcF9tZXRob2QoKSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIEhhbmRsZShUSFJFQUQsIGlrLT5ib290c3RyYXBfbWV0aG9kKCkpOworICB9CisKKyAgLy8gY2FsbCBqYXZhLmR5bi5MaW5rYWdlOjpmaW5kQm9vdHN0cmFwTWV0aG9kKGNhbGxlciwgc2JrKQorICBKYXZhQ2FsbEFyZ3VtZW50cyBhcmdzKEhhbmRsZShUSFJFQUQsIGlrLT5qYXZhX21pcnJvcigpKSk7CisgIGlmIChzZWFyY2hfYm9vdHN0cmFwX2tsYXNzLmlzX251bGwoKSkKKyAgICBhcmdzLnB1c2hfb29wKEhhbmRsZSgpKTsKKyAgZWxzZQorICAgIGFyZ3MucHVzaF9vb3Aoc2VhcmNoX2Jvb3RzdHJhcF9rbGFzcy0+amF2YV9taXJyb3IoKSk7CisgIEphdmFWYWx1ZSByZXN1bHQoVF9PQkpFQ1QpOworICBKYXZhQ2FsbHM6OmNhbGxfc3RhdGljKCZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtRGljdGlvbmFyeTo6TGlua2FnZV9rbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZtU3ltYm9sczo6ZmluZEJvb3RzdHJhcE1ldGhvZF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdm1TeW1ib2xzOjpmaW5kQm9vdHN0cmFwTWV0aG9kX3NpZ25hdHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZhcmdzLCBDSEVDS18oZW1wdHkpKTsKKyAgb29wIGJvb3RfbWV0aG9kX29vcCA9IChvb3ApIHJlc3VsdC5nZXRfam9iamVjdCgpOworCisgIGlmIChib290X21ldGhvZF9vb3AgIT0gTlVMTCkgeworICAgIC8vIHByb2JhYmx5IG5vIHJhY2UgY29uZGl0aW9ucywgYnV0IGxldCdzIGJlIGNhcmVmdWw6CisgICAgaWYgKEF0b21pYzo6Y21weGNoZ19wdHIoYm9vdF9tZXRob2Rfb29wLCBpay0+YWRyX2Jvb3RzdHJhcF9tZXRob2QoKSwgTlVMTCkgPT0gTlVMTCkKKyAgICAgIGlrLT5zZXRfYm9vdHN0cmFwX21ldGhvZChib290X21ldGhvZF9vb3ApOworICAgIGVsc2UKKyAgICAgIGJvb3RfbWV0aG9kX29vcCA9IGlrLT5ib290c3RyYXBfbWV0aG9kKCk7CisgIH0gZWxzZSB7CisgICAgYm9vdF9tZXRob2Rfb29wID0gaWstPmJvb3RzdHJhcF9tZXRob2QoKTsKKyAgfQorCisgIHJldHVybiBIYW5kbGUoVEhSRUFELCBib290X21ldGhvZF9vb3ApOworfQorCiAvLyBTaW5jZSB0aGUgaWRlbnRpdHkgaGFzaCBjb2RlIGZvciBzeW1ib2xzIGNoYW5nZXMgd2hlbiB0aGUgc3ltYm9scyBhcmUKIC8vIG1vdmVkIGZyb20gdGhlIHJlZ3VsYXIgcGVybSBnZW4gKGhhc2ggaW4gdGhlIG1hcmsgd29yZCkgdG8gdGhlIHNoYXJlZAogLy8gc3BhY2VzIChoYXNoIGlzIHRoZSBhZGRyZXNzKSwgdGhlIGNsYXNzZXMgbG9hZGVkIGludG8gdGhlIGRpY3Rpb25hcnkKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9zeXN0ZW1EaWN0aW9uYXJ5LmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9zeXN0ZW1EaWN0aW9uYXJ5LmhwcAppbmRleCAwODc5MTQzLi4xNDI0NmU2IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvc3lzdGVtRGljdGlvbmFyeS5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL3N5c3RlbURpY3Rpb25hcnkuaHBwCkBAIC0xNDIsNiArMTQyLDEyIEBACiAgIHRlbXBsYXRlKE1ldGhvZFR5cGVfa2xhc3MsICAgICAgICAgICAgIGphdmFfZHluX01ldGhvZFR5cGUsICAgICAgICAgICAgT3B0KSBcCiAgIHRlbXBsYXRlKE1ldGhvZFR5cGVGb3JtX2tsYXNzLCAgICAgICAgIGphdmFfZHluX01ldGhvZFR5cGVGb3JtLCAgICAgICAgT3B0KSBcCiAgIHRlbXBsYXRlKFdyb25nTWV0aG9kVHlwZUV4Y2VwdGlvbl9rbGFzcywgamF2YV9keW5fV3JvbmdNZXRob2RUeXBlRXhjZXB0aW9uLCBPcHQpIFwKKyAgdGVtcGxhdGUoTGlua2FnZV9rbGFzcywgICAgICAgICAgICAgICAgamF2YV9keW5fTGlua2FnZSwgICAgICAgICAgICAgICBPcHQpIFwKKyAgdGVtcGxhdGUoQ2FsbFNpdGVfa2xhc3MsICAgICAgICAgICAgICAgamF2YV9keW5fQ2FsbFNpdGUsICAgICAgICAgICAgICBPcHQpIFwKKyAgdGVtcGxhdGUoQ2FsbFNpdGVJbXBsX2tsYXNzLCAgICAgICAgICAgc3VuX2R5bl9DYWxsU2l0ZUltcGwsICAgICBPcHQpIFwKKyAgdGVtcGxhdGUoRHluYW1pY19rbGFzcywgICAgICAgICAgICAgICAgamF2YV9keW5fRHluYW1pYywgICAgICAgICAgICAgICBPcHQpIFwKKyAgLyogTm90ZTogTWV0aG9kSGFuZGxlIG11c3QgYmUgZmlyc3QsIGFuZCBEeW5hbWljIGxhc3QgaW4gZ3JvdXAgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgdGVtcGxhdGUodmVjdG9yX2tsYXNzLCAgICAgICAgICAgICAgICAgamF2YV91dGlsX1ZlY3RvciwgICAgICAgICAgICAgICBQcmUpIFwKICAgdGVtcGxhdGUoaGFzaHRhYmxlX2tsYXNzLCAgICAgICAgICAgICAgamF2YV91dGlsX0hhc2h0YWJsZSwgICAgICAgICAgICBQcmUpIFwKICAgdGVtcGxhdGUoc3RyaW5nQnVmZmVyX2tsYXNzLCAgICAgICAgICAgamF2YV9sYW5nX1N0cmluZ0J1ZmZlciwgICAgICAgICBQcmUpIFwKQEAgLTQ2Niw2ICs0NzIsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgY2xhc3NfbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSBwcm90ZWN0aW9uX2RvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFQUyk7CisgIC8vIGFzayBKYXZhIHRvIGNyZWF0ZSBhIGR5bmFtaWMgY2FsbCBzaXRlLCB3aGlsZSBsaW5raW5nIGFuIGludm9rZWR5bmFtaWMgb3AKKyAgc3RhdGljIEhhbmRsZSAgICBtYWtlX2R5bmFtaWNfY2FsbF9zaXRlKEtsYXNzSGFuZGxlIGNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWxsZXJfbWV0aG9kX2lkbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGxlcl9iY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xIYW5kbGUgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEhhbmRsZSBtaF9pbnZva2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFQUyk7CisKKyAgLy8gY29vcmRpbmF0ZSB3aXRoIEphdmEgYWJvdXQgYm9vdHN0cmFwIG1ldGhvZHMKKyAgc3RhdGljIEhhbmRsZSAgICBmaW5kX2Jvb3RzdHJhcF9tZXRob2QoS2xhc3NIYW5kbGUgY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFyZ3VtZW50IGlzIG5vbi1udWxsIG9ubHkgd2hlbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzZmlsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gZm91bmQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtsYXNzSGFuZGxlIHNlYXJjaF9ib290c3RyYXBfa2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVBTKTsKKwogICAvLyBVdGlsaXR5IGZvciBwcmludGluZyBsb2FkZXIgIm5hbWUiIGFzIHBhcnQgb2YgdHJhY2luZyBjb25zdHJhaW50cwogICBzdGF0aWMgY29uc3QgY2hhciogbG9hZGVyX25hbWUob29wIGxvYWRlcikgewogICAgIHJldHVybiAoKGxvYWRlcikgPT0gTlVMTCA/ICI8Ym9vdGxvYWRlcj4iIDoKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS92ZXJpZmllci5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvdmVyaWZpZXIuY3BwCmluZGV4IDE3OWRlMTIuLjZlMGZjN2UgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS92ZXJpZmllci5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL3ZlcmlmaWVyLmNwcApAQCAtMTE3NCw2ICsxMTc0LDcgQEAKICAgICAgICAgICAgICZ0aGlzX3VuaW5pdCwgcmV0dXJuX3R5cGUsIGNwLCBDSEVDS19WRVJJRlkodGhpcykpOwogICAgICAgICAgIG5vX2NvbnRyb2xfZmxvdyA9IGZhbHNlOyBicmVhazsKICAgICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2UgOgorICAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWMgOgogICAgICAgICAgIHZlcmlmeV9pbnZva2VfaW5zdHJ1Y3Rpb25zKAogICAgICAgICAgICAgJmJjcywgY29kZV9sZW5ndGgsICZjdXJyZW50X2ZyYW1lLAogICAgICAgICAgICAgJnRoaXNfdW5pbml0LCByZXR1cm5fdHlwZSwgY3AsIENIRUNLX1ZFUklGWSh0aGlzKSk7CkBAIC0xODk1LDEyICsxODk2LDIzIEBACiAgIEJ5dGVjb2Rlczo6Q29kZSBvcGNvZGUgPSBiY3MtPmNvZGUoKTsKICAgdW5zaWduZWQgaW50IHR5cGVzID0gKG9wY29kZSA9PSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxIDw8IEpWTV9DT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYKKyAgICAgICAgICAgICAgICAgICAgICA6IG9wY29kZSA9PSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMSA8PCBKVk1fQ09OU1RBTlRfTmFtZUFuZFR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxIDw8IEpWTV9DT05TVEFOVF9NZXRob2RyZWYpOwogICB2ZXJpZnlfY3BfdHlwZShpbmRleCwgY3AsIHR5cGVzLCBDSEVDS19WRVJJRlkodGhpcykpOwogCiAgIC8vIEdldCBtZXRob2QgbmFtZSBhbmQgc2lnbmF0dXJlCi0gIHN5bWJvbEhhbmRsZSBtZXRob2RfbmFtZShUSFJFQUQsIGNwLT5uYW1lX3JlZl9hdChpbmRleCkpOwotICBzeW1ib2xIYW5kbGUgbWV0aG9kX3NpZyhUSFJFQUQsIGNwLT5zaWduYXR1cmVfcmVmX2F0KGluZGV4KSk7CisgIHN5bWJvbEhhbmRsZSBtZXRob2RfbmFtZTsKKyAgc3ltYm9sSGFuZGxlIG1ldGhvZF9zaWc7CisgIGlmIChvcGNvZGUgPT0gQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYykgeworICAgIGludCBuYW1lX2luZGV4ID0gY3AtPm5hbWVfcmVmX2luZGV4X2F0KGluZGV4KTsKKyAgICBpbnQgc2lnX2luZGV4ICA9IGNwLT5zaWduYXR1cmVfcmVmX2luZGV4X2F0KGluZGV4KTsKKyAgICBtZXRob2RfbmFtZSA9IHN5bWJvbEhhbmRsZShUSFJFQUQsIGNwLT5zeW1ib2xfYXQobmFtZV9pbmRleCkpOworICAgIG1ldGhvZF9zaWcgID0gc3ltYm9sSGFuZGxlKFRIUkVBRCwgY3AtPnN5bWJvbF9hdChzaWdfaW5kZXgpKTsKKyAgfSBlbHNlIHsKKyAgICBtZXRob2RfbmFtZSA9IHN5bWJvbEhhbmRsZShUSFJFQUQsIGNwLT5uYW1lX3JlZl9hdChpbmRleCkpOworICAgIG1ldGhvZF9zaWcgID0gc3ltYm9sSGFuZGxlKFRIUkVBRCwgY3AtPnNpZ25hdHVyZV9yZWZfYXQoaW5kZXgpKTsKKyAgfQogCiAgIGlmICghU2lnbmF0dXJlVmVyaWZpZXI6OmlzX3ZhbGlkX21ldGhvZF9zaWduYXR1cmUobWV0aG9kX3NpZykpIHsKICAgICBjbGFzc19mb3JtYXRfZXJyb3IoCkBAIC0xOTEwLDggKzE5MjIsMTcgQEAKICAgfQogCiAgIC8vIEdldCByZWZlcmVuY2VkIGNsYXNzIHR5cGUKLSAgVmVyaWZpY2F0aW9uVHlwZSByZWZfY2xhc3NfdHlwZSA9IGNwX3JlZl9pbmRleF90b190eXBlKAotICAgIGluZGV4LCBjcCwgQ0hFQ0tfVkVSSUZZKHRoaXMpKTsKKyAgVmVyaWZpY2F0aW9uVHlwZSByZWZfY2xhc3NfdHlwZTsKKyAgaWYgKG9wY29kZSA9PSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljKSB7CisgICAgaWYgKCFFbmFibGVJbnZva2VEeW5hbWljKSB7CisgICAgICBjbGFzc19mb3JtYXRfZXJyb3IoCisgICAgICAgICJpbnZva2VkeW5hbWljIGluc3RydWN0aW9ucyBub3QgZW5hYmxlZCBvbiB0aGlzIEpWTSIsCisgICAgICAgIF9rbGFzcy0+ZXh0ZXJuYWxfbmFtZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmVmX2NsYXNzX3R5cGUgPSBjcF9yZWZfaW5kZXhfdG9fdHlwZShpbmRleCwgY3AsIENIRUNLX1ZFUklGWSh0aGlzKSk7CisgIH0KIAogICAvLyBGb3IgYSBzbWFsbCBzaWduYXR1cmUgbGVuZ3RoLCB3ZSBqdXN0IGFsbG9jYXRlIDEyOCBieXRlcyBpbnN0ZWFkCiAgIC8vIG9mIHBhcnNpbmcgdGhlIHNpZ25hdHVyZSBvbmNlIHRvIGZpbmQgaXRzIHNpemUuCkBAIC0xOTcwLDYgKzE5OTEsMTQgQEAKICAgICB9CiAgIH0KIAorICBpZiAob3Bjb2RlID09IEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWMpIHsKKyAgICBhZGRyZXNzIGJjcCA9IGJjcy0+YmNwKCk7CisgICAgaWYgKCooYmNwKzMpICE9IDAgfHwgKihiY3ArNCkgIT0gMCkgeworICAgICAgdmVyaWZ5X2Vycm9yKGJjaSwgIlRoaXJkIGFuZCBmb3VydGggb3BlcmFuZCBieXRlcyBvZiBpbnZva2VkeW5hbWljIG11c3QgYmUgemVybyIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCiAgIGlmIChtZXRob2RfbmFtZS0+Ynl0ZV9hdCgwKSA9PSAnPCcpIHsKICAgICAvLyBNYWtlIHN1cmUgPGluaXQ+IGNhbiBvbmx5IGJlIGludm9rZWQgYnkgaW52b2tlc3BlY2lhbAogICAgIGlmIChvcGNvZGUgIT0gQnl0ZWNvZGVzOjpfaW52b2tlc3BlY2lhbCB8fApAQCAtMTk5NCw3ICsyMDIzLDggQEAKICAgICBjdXJyZW50X2ZyYW1lLT5wb3Bfc3RhY2soc2lnX3R5cGVzW2ldLCBDSEVDS19WRVJJRlkodGhpcykpOwogICB9CiAgIC8vIENoZWNrIG9iamVjdHJlZiBvbiBvcGVyYW5kIHN0YWNrCi0gIGlmIChvcGNvZGUgIT0gQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljKSB7CisgIGlmIChvcGNvZGUgIT0gQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljICYmCisgICAgICBvcGNvZGUgIT0gQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYykgewogICAgIGlmIChtZXRob2RfbmFtZSgpID09IHZtU3ltYm9sczo6b2JqZWN0X2luaXRpYWxpemVyX25hbWUoKSkgeyAgLy8gPGluaXQ+IG1ldGhvZAogICAgICAgdmVyaWZ5X2ludm9rZV9pbml0KGJjcywgcmVmX2NsYXNzX3R5cGUsIGN1cnJlbnRfZnJhbWUsCiAgICAgICAgIGNvZGVfbGVuZ3RoLCB0aGlzX3VuaW5pdCwgY3AsIENIRUNLX1ZFUklGWSh0aGlzKSk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvdm1TeW1ib2xzLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS92bVN5bWJvbHMuaHBwCmluZGV4IDdlZDA5MjguLjcxNzZlMmUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS92bVN5bWJvbHMuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS92bVN5bWJvbHMuaHBwCkBAIC0yMTcsNiArMjE3LDkgQEAKICAgdGVtcGxhdGUoYmFzZV9uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIC8qIFN1cHBvcnQgZm9yIEpTUiAyOTIgJiBpbnZva2VkeW5hbWljIChKREsgMS43IGFuZCBhYm92ZSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUoamF2YV9keW5fRHluYW1pYywgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhL2R5bi9EeW5hbWljIikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZShqYXZhX2R5bl9MaW5rYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEvZHluL0xpbmthZ2UiKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlKGphdmFfZHluX0NhbGxTaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS9keW4vQ2FsbFNpdGUiKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgdGVtcGxhdGUoamF2YV9keW5fTWV0aG9kSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICJqYXZhL2R5bi9NZXRob2RIYW5kbGUiKSAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZShqYXZhX2R5bl9NZXRob2RUeXBlLCAgICAgICAgICAgICAgICAgICAgICAgImphdmEvZHluL01ldGhvZFR5cGUiKSAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlKGphdmFfZHluX1dyb25nTWV0aG9kVHlwZUV4Y2VwdGlvbiwgICAgICAgICAiamF2YS9keW4vV3JvbmdNZXRob2RUeXBlRXhjZXB0aW9uIikgICAgICAgIFwKQEAgLTIzMCw4ICsyMzMsMTMgQEAKICAgdGVtcGxhdGUoc3VuX2R5bl9BZGFwdGVyTWV0aG9kSGFuZGxlLCAgICAgICAgICAgICAgICJzdW4vZHluL0FkYXB0ZXJNZXRob2RIYW5kbGUiKSAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZShzdW5fZHluX0JvdW5kTWV0aG9kSGFuZGxlLCAgICAgICAgICAgICAgICAgInN1bi9keW4vQm91bmRNZXRob2RIYW5kbGUiKSAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlKHN1bl9keW5fRGlyZWN0TWV0aG9kSGFuZGxlLCAgICAgICAgICAgICAgICAic3VuL2R5bi9EaXJlY3RNZXRob2RIYW5kbGUiKSAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUoc3VuX2R5bl9DYWxsU2l0ZUltcGwsICAgICAgICAgICAgICAgICAgICAgICJzdW4vZHluL0NhbGxTaXRlSW1wbCIpICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZShtYWtlSW1wbF9uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ha2VJbXBsIikgLypNZXRob2RUeXBlOjptYWtlSW1wbCovICAgICAgICBcCiAgIHRlbXBsYXRlKG1ha2VJbXBsX3NpZ25hdHVyZSwgICAgIihMamF2YS9sYW5nL0NsYXNzO1tMamF2YS9sYW5nL0NsYXNzO1paKUxqYXZhL2R5bi9NZXRob2RUeXBlOyIpIFwKKyAgdGVtcGxhdGUobWFrZVNpdGVfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWtlU2l0ZSIpIC8qQ2FsbFNpdGVJbXBsOjptYWtlSW1wbCovICAgICAgIFwKKyAgdGVtcGxhdGUobWFrZVNpdGVfc2lnbmF0dXJlLCAgICAiKExqYXZhL2xhbmcvQ2xhc3M7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvZHluL01ldGhvZFR5cGU7SUkpTGphdmEvZHluL0NhbGxTaXRlOyIpIFwKKyAgdGVtcGxhdGUoZmluZEJvb3RzdHJhcE1ldGhvZF9uYW1lLCAgICAgICAgICAgICAgICAgICJmaW5kQm9vdHN0cmFwTWV0aG9kIikgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZShmaW5kQm9vdHN0cmFwTWV0aG9kX3NpZ25hdHVyZSwgIihMamF2YS9sYW5nL0NsYXNzO0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2R5bi9NZXRob2RIYW5kbGU7IikgXAogICBOT1RfTFA2NCggIGRvX2FsaWFzKG1hY2hpbmVfd29yZF9zaWduYXR1cmUsICAgICAgICAgaW50X3NpZ25hdHVyZSkgICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIExQNjRfT05MWSggZG9fYWxpYXMobWFjaGluZV93b3JkX3NpZ25hdHVyZSwgICAgICAgICBsb25nX3NpZ25hdHVyZSkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzA4LDkgKzMxNiwxMSBAQAogICB0ZW1wbGF0ZShiaXRDb3VudF9uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpdENvdW50IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlKHByb2ZpbGVfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZmlsZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgdGVtcGxhdGUoZXF1YWxzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcXVhbHMiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSh0YXJnZXRfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlKHRvU3RyaW5nX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9TdHJpbmciKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgdGVtcGxhdGUodmFsdWVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZShyZWNlaXZlcl9uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVyIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlKHZtbWV0aG9kX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm1tZXRob2QiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgdGVtcGxhdGUodm10YXJnZXRfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bXRhcmdldCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZSh2bWVudHJ5X25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZtZW50cnkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlKHZtc2xvdHNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm1zbG90cyIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2luY2x1ZGVEQl9jb21waWxlcjEgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbmNsdWRlREJfY29tcGlsZXIxCmluZGV4IDNlYTA5ZmQuLmFmMjUyMTYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2luY2x1ZGVEQl9jb21waWxlcjEKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW5jbHVkZURCX2NvbXBpbGVyMQpAQCAtMjcwLDYgKzI3MCw3IEBACiAKIGMxX0xpbmVhclNjYW4uY3BwICAgICAgICAgICAgICAgICAgICAgICBiaXRNYXAuaW5saW5lLmhwcAogYzFfTGluZWFyU2Nhbi5jcHAgICAgICAgICAgICAgICAgICAgICAgIGMxX0NGR1ByaW50ZXIuaHBwCitjMV9MaW5lYXJTY2FuLmNwcCAgICAgICAgICAgICAgICAgICAgICAgYzFfQ29kZVN0dWJzLmhwcAogYzFfTGluZWFyU2Nhbi5jcHAgICAgICAgICAgICAgICAgICAgICAgIGMxX0NvbXBpbGF0aW9uLmhwcAogYzFfTGluZWFyU2Nhbi5jcHAgICAgICAgICAgICAgICAgICAgICAgIGMxX0ZyYW1lTWFwLmhwcAogYzFfTGluZWFyU2Nhbi5jcHAgICAgICAgICAgICAgICAgICAgICAgIGMxX0lSLmhwcApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW5jbHVkZURCX2NvcmUgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbmNsdWRlREJfY29yZQppbmRleCAyZGFjNjFmLi5mNTk1MjQ4IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbmNsdWRlREJfY29yZQorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbmNsdWRlREJfY29yZQpAQCAtNDEwMiw2ICs0MTAyLDcgQEAKIHRlbXBsYXRlVGFibGVfPGFyY2hfbW9kZWw+LmNwcCAgICAgICAgICBpbnRlcnByZXRlclJ1bnRpbWUuaHBwCiB0ZW1wbGF0ZVRhYmxlXzxhcmNoX21vZGVsPi5jcHAgICAgICAgICAgaW50ZXJwcmV0ZXIuaHBwCiB0ZW1wbGF0ZVRhYmxlXzxhcmNoX21vZGVsPi5jcHAgICAgICAgICAgbWV0aG9kRGF0YU9vcC5ocHAKK3RlbXBsYXRlVGFibGVfPGFyY2hfbW9kZWw+LmNwcCAgICAgICAgICBtZXRob2RIYW5kbGVzLmhwcAogdGVtcGxhdGVUYWJsZV88YXJjaF9tb2RlbD4uY3BwICAgICAgICAgIG9iakFycmF5S2xhc3MuaHBwCiB0ZW1wbGF0ZVRhYmxlXzxhcmNoX21vZGVsPi5jcHAgICAgICAgICAgb29wLmlubGluZS5ocHAKIHRlbXBsYXRlVGFibGVfPGFyY2hfbW9kZWw+LmNwcCAgICAgICAgICBzaGFyZWRSdW50aW1lLmhwcApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW5jbHVkZURCX2djX3BhcmFsbGVsIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW5jbHVkZURCX2djX3BhcmFsbGVsCmluZGV4IGZmYzhhNzguLjVmMDg5YjcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2luY2x1ZGVEQl9nY19wYXJhbGxlbAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbmNsdWRlREJfZ2NfcGFyYWxsZWwKQEAgLTQyLDYgKzQyLDEyIEBACiBjb25zdGFudFBvb2xLbGFzcy5jcHAgICAgICAgICAgICAgICAgICAgcHNTY2F2ZW5nZS5pbmxpbmUuaHBwCiBjb25zdGFudFBvb2xLbGFzcy5jcHAgICAgICAgICAgICAgICAgICAgcGFyT29wQ2xvc3VyZXMuaW5saW5lLmhwcAogCitjcENhY2hlS2xhc3MuY3BwICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFRhYmxlUlMuaHBwCitjcENhY2hlS2xhc3MuY3BwICAgICAgICAgICAgICAgICAgICAgICAgb29wLnBjZ2MuaW5saW5lLmhwcAorY3BDYWNoZUtsYXNzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIHBzUHJvbW90aW9uTWFuYWdlci5pbmxpbmUuaHBwCitjcENhY2hlS2xhc3MuY3BwICAgICAgICAgICAgICAgICAgICAgICAgcHNTY2F2ZW5nZS5pbmxpbmUuaHBwCitjcENhY2hlS2xhc3MuY3BwICAgICAgICAgICAgICAgICAgICAgICAgcGFyT29wQ2xvc3VyZXMuaW5saW5lLmhwcAorCiBnZW5Db2xsZWN0ZWRIZWFwLmNwcCAgICAgICAgICAgICAgICAgICAgY29uY3VycmVudE1hcmtTd2VlcFRocmVhZC5ocHAKIGdlbkNvbGxlY3RlZEhlYXAuY3BwICAgICAgICAgICAgICAgICAgICB2bUNNU09wZXJhdGlvbnMuaHBwCiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2luY2x1ZGVEQl9qdm10aSBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2luY2x1ZGVEQl9qdm10aQppbmRleCBiNmI0ZWU1Li5iYTZkYzliIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbmNsdWRlREJfanZtdGkKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW5jbHVkZURCX2p2bXRpCkBAIC0yOCw2ICsyOCw3IEBACiBqdm10aUNsYXNzRmlsZVJlY29uc3RpdHV0ZXIuY3BwICAgICAgICAgYnl0ZXNfPGFyY2g+LmhwcAoganZtdGlDbGFzc0ZpbGVSZWNvbnN0aXR1dGVyLmNwcCAgICAgICAgIGp2bXRpQ2xhc3NGaWxlUmVjb25zdGl0dXRlci5ocHAKIGp2bXRpQ2xhc3NGaWxlUmVjb25zdGl0dXRlci5jcHAgICAgICAgICBzeW1ib2xUYWJsZS5ocHAKK2p2bXRpQ2xhc3NGaWxlUmVjb25zdGl0dXRlci5jcHAgICAgICAgICBzaWduYXR1cmUuaHBwCiAKIGp2bXRpQ2xhc3NGaWxlUmVjb25zdGl0dXRlci5ocHAgICAgICAgICBqdm10aUVudi5ocHAKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYWJzdHJhY3RJbnRlcnByZXRlci5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9hYnN0cmFjdEludGVycHJldGVyLmhwcAppbmRleCA3ODJhOTFiLi4yNjAyODhiIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9hYnN0cmFjdEludGVycHJldGVyLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9hYnN0cmFjdEludGVycHJldGVyLmhwcApAQCAtMjE3LDYgKzIxNyw3MyBAQAogICAgICAgICAgICAgc3RhY2tFbGVtZW50U2l6ZSgpKSArIHRhZ19vZmZzZXRfaW5fYnl0ZXMoKTsKICAgfQogCisgIC8vIGFjY2VzcyB0byBzdGFja2VkIHZhbHVlcyBhY2NvcmRpbmcgdG8gdHlwZToKKyAgc3RhdGljIG9vcCogb29wX2FkZHJfaW5fc2xvdChpbnRwdHJfdCogc2xvdF9hZGRyKSB7CisgICAgcmV0dXJuIChvb3AqKSBzbG90X2FkZHI7CisgIH0KKyAgc3RhdGljIGppbnQqIGludF9hZGRyX2luX3Nsb3QoaW50cHRyX3QqIHNsb3RfYWRkcikgeworICAgIGlmICgoaW50KSBzaXplb2YoamludCkgPCB3b3JkU2l6ZSAmJiAhQnl0ZXM6OmlzX0phdmFfYnl0ZV9vcmRlcmluZ19kaWZmZXJlbnQoKSkKKyAgICAgIC8vIGJpZy1lbmRpYW4gTFA2NAorICAgICAgcmV0dXJuIChqaW50Kikoc2xvdF9hZGRyICsgMSkgLSAxOworICAgIGVsc2UKKyAgICAgIHJldHVybiAoamludCopIHNsb3RfYWRkcjsKKyAgfQorICBzdGF0aWMgamxvbmcgbG9uZ19pbl9zbG90KGludHB0cl90KiBzbG90X2FkZHIpIHsKKyAgICBpZiAoc2l6ZW9mKGludHB0cl90KSA+PSBzaXplb2YoamxvbmcpKSB7CisgICAgICByZXR1cm4gKihqbG9uZyopIHNsb3RfYWRkcjsKKyAgICB9IGVsc2UgaWYgKCFUYWdnZWRTdGFja0ludGVycHJldGVyKSB7CisgICAgICByZXR1cm4gQnl0ZXM6OmdldF9uYXRpdmVfdTgoKGFkZHJlc3Mpc2xvdF9hZGRyKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KHNpemVvZihpbnRwdHJfdCkgKiAyID09IHNpemVvZihqbG9uZyksICJJTFAzMiIpOworICAgICAgLy8gYXNzZW1ibGUgdGhlIGxvbmcgaW4gbWVtb3J5IG9yZGVyIChub3QgYXJpdGhtZXRpYyBvcmRlcikKKyAgICAgIHVuaW9uIHsgamxvbmcgajsgamludCBpWzJdOyB9IHU7CisgICAgICB1LmlbMF0gPSAoamludCkgc2xvdF9hZGRyWzAqc3RhY2tFbGVtZW50U2l6ZSgpXTsKKyAgICAgIHUuaVsxXSA9IChqaW50KSBzbG90X2FkZHJbMSpzdGFja0VsZW1lbnRTaXplKCldOworICAgICAgcmV0dXJuIHUuajsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgc2V0X2xvbmdfaW5fc2xvdChpbnRwdHJfdCogc2xvdF9hZGRyLCBqbG9uZyB2YWx1ZSkgeworICAgIGlmIChzaXplb2YoaW50cHRyX3QpID49IHNpemVvZihqbG9uZykpIHsKKyAgICAgICooamxvbmcqKSBzbG90X2FkZHIgPSB2YWx1ZTsKKyAgICB9IGVsc2UgaWYgKCFUYWdnZWRTdGFja0ludGVycHJldGVyKSB7CisgICAgICBCeXRlczo6cHV0X25hdGl2ZV91OCgoYWRkcmVzcylzbG90X2FkZHIsIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KHNpemVvZihpbnRwdHJfdCkgKiAyID09IHNpemVvZihqbG9uZyksICJJTFAzMiIpOworICAgICAgLy8gYXNzZW1ibGUgdGhlIGxvbmcgaW4gbWVtb3J5IG9yZGVyIChub3QgYXJpdGhtZXRpYyBvcmRlcikKKyAgICAgIHVuaW9uIHsgamxvbmcgajsgamludCBpWzJdOyB9IHU7CisgICAgICB1LmogPSB2YWx1ZTsKKyAgICAgIHNsb3RfYWRkclswKnN0YWNrRWxlbWVudFNpemUoKV0gPSAoaW50cHRyX3QpIHUuaVswXTsKKyAgICAgIHNsb3RfYWRkclsxKnN0YWNrRWxlbWVudFNpemUoKV0gPSAoaW50cHRyX3QpIHUuaVsxXTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgZ2V0X2p2YWx1ZV9pbl9zbG90KGludHB0cl90KiBzbG90X2FkZHIsIEJhc2ljVHlwZSB0eXBlLCBqdmFsdWUqIHZhbHVlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUX0JPT0xFQU46IHZhbHVlLT56ID0gKmludF9hZGRyX2luX3Nsb3Qoc2xvdF9hZGRyKTsgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfQ0hBUjogICAgdmFsdWUtPmMgPSAqaW50X2FkZHJfaW5fc2xvdChzbG90X2FkZHIpOyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9CWVRFOiAgICB2YWx1ZS0+YiA9ICppbnRfYWRkcl9pbl9zbG90KHNsb3RfYWRkcik7ICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NIT1JUOiAgIHZhbHVlLT5zID0gKmludF9hZGRyX2luX3Nsb3Qoc2xvdF9hZGRyKTsgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfSU5UOiAgICAgdmFsdWUtPmkgPSAqaW50X2FkZHJfaW5fc2xvdChzbG90X2FkZHIpOyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9MT05HOiAgICB2YWx1ZS0+aiA9IGxvbmdfaW5fc2xvdChzbG90X2FkZHIpOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0ZMT0FUOiAgIHZhbHVlLT5mID0gKihqZmxvYXQqKWludF9hZGRyX2luX3Nsb3Qoc2xvdF9hZGRyKTsgICBicmVhazsKKyAgICBjYXNlIFRfRE9VQkxFOiAgdmFsdWUtPmQgPSBqZG91YmxlX2Nhc3QobG9uZ19pbl9zbG90KHNsb3RfYWRkcikpOyAgIGJyZWFrOworICAgIGNhc2UgVF9PQkpFQ1Q6ICB2YWx1ZS0+bCA9IChqb2JqZWN0KSpvb3BfYWRkcl9pbl9zbG90KHNsb3RfYWRkcik7ICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgIFNob3VsZE5vdFJlYWNoSGVyZSgpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBzZXRfanZhbHVlX2luX3Nsb3QoaW50cHRyX3QqIHNsb3RfYWRkciwgQmFzaWNUeXBlIHR5cGUsIGp2YWx1ZSogdmFsdWUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRfQk9PTEVBTjogKmludF9hZGRyX2luX3Nsb3Qoc2xvdF9hZGRyKSA9ICh2YWx1ZS0+eiAhPSAwKTsgICAgIGJyZWFrOworICAgIGNhc2UgVF9DSEFSOiAgICAqaW50X2FkZHJfaW5fc2xvdChzbG90X2FkZHIpID0gdmFsdWUtPmM7ICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0JZVEU6ICAgICppbnRfYWRkcl9pbl9zbG90KHNsb3RfYWRkcikgPSB2YWx1ZS0+YjsgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfU0hPUlQ6ICAgKmludF9hZGRyX2luX3Nsb3Qoc2xvdF9hZGRyKSA9IHZhbHVlLT5zOyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JTlQ6ICAgICAqaW50X2FkZHJfaW5fc2xvdChzbG90X2FkZHIpID0gdmFsdWUtPmk7ICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0xPTkc6ICAgIHNldF9sb25nX2luX3Nsb3Qoc2xvdF9hZGRyLCB2YWx1ZS0+aik7ICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfRkxPQVQ6ICAgKihqZmxvYXQqKWludF9hZGRyX2luX3Nsb3Qoc2xvdF9hZGRyKSA9IHZhbHVlLT5mOyAgIGJyZWFrOworICAgIGNhc2UgVF9ET1VCTEU6ICBzZXRfbG9uZ19pbl9zbG90KHNsb3RfYWRkciwgamxvbmdfY2FzdCh2YWx1ZS0+ZCkpOyAgYnJlYWs7CisgICAgY2FzZSBUX09CSkVDVDogICpvb3BfYWRkcl9pbl9zbG90KHNsb3RfYWRkcikgPSAob29wKSB2YWx1ZS0+bDsgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7CisgICAgfQorICB9CiB9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGUuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGUuY3BwCmluZGV4IGVhNDZhY2IuLmY5MWQ1NjYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2RlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZS5jcHAKQEAgLTM0LDEyICszNCw2IEBACiB9CiAKIAotdm9pZCBCeXRlY29kZTo6c2V0X2Zhc3RfaW5kZXgoaW50IGkpIHsKLSAgYXNzZXJ0KDAgPD0gaSAmJiBpIDwgMHgxMDAwMCwgImlsbGVnYWwgaW5kZXggdmFsdWUiKTsKLSAgQnl0ZXM6OnB1dF9uYXRpdmVfdTIoYWRkcl9hdCgxKSwgKGp1c2hvcnQpaSk7Ci19Ci0KLQogYm9vbCBCeXRlY29kZTo6Y2hlY2tfbXVzdF9yZXdyaXRlKCkgY29uc3QgewogICBhc3NlcnQoQnl0ZWNvZGVzOjpjYW5fcmV3cml0ZShjb2RlKCkpLCAicG9zdC1jaGVjayBvbmx5Iik7CiAKQEAgLTExOCw3ICsxMTIsMTIgQEAKIAogCiBpbnQgQnl0ZWNvZGVfaW52b2tlOjppbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIEJ5dGVzOjpnZXRfSmF2YV91MihiY3AoKSArIDEpOworICAvLyBOb3RlOiAgUmV3cml0ZXI6OnJld3JpdGUgY2hhbmdlcyB0aGUgSmF2YV91MiBvZiBhbiBpbnZva2VkeW5hbWljIHRvIGEgbmF0aXZlX3U0LAorICAvLyBhdCB0aGUgc2FtZSB0aW1lIGl0IGFsbG9jYXRlcyBwZXItY2FsbC1zaXRlIENQIGNhY2hlIGVudHJpZXMuCisgIGlmIChoYXNfZ2lhbnRfaW5kZXgoKSkKKyAgICByZXR1cm4gQnl0ZXM6OmdldF9uYXRpdmVfdTQoYmNwKCkgKyAxKTsKKyAgZWxzZQorICAgIHJldHVybiBCeXRlczo6Z2V0X0phdmFfdTIoYmNwKCkgKyAxKTsKIH0KIAogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZS5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZS5ocHAKaW5kZXggYjlmNjViMi4uNjQ5NDFkOCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGUuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2RlLmhwcApAQCAtNjUsMTQgKzY1LDYgQEAKIC8vIFRoZSBiYXNlIGNsYXNzIGZvciBkaWZmZXJlbnQga2luZHMgb2YgYnl0ZWNvZGUgYWJzdHJhY3Rpb25zLgogLy8gUHJvdmlkZXMgdGhlIHByaW1pdGl2ZSBvcGVyYXRpb25zIHRvIG1hbmlwdWxhdGUgY29kZSByZWxhdGl2ZQogLy8gdG8gYW4gb2JqZWN0cyAndGhpcycgcG9pbnRlci4KLS8vCi0vLyBOb3RlOiBFdmVuIHRob3VnaCBpdCBzZWVtcyB0aGF0IHRoZSBmYXN0X2luZGV4ICYgc2V0X2Zhc3RfaW5kZXgKLS8vICAgICAgIGZ1bmN0aW9ucyBhcmUgbWFjaGluZSBzcGVjaWZpYywgdGhleSdyZSBub3QuIFRoZXkgb25seSB1c2UKLS8vICAgICAgIHRoZSBuYXR1cmFsIHdheSB0byBzdG9yZSBhIDE2Yml0IGluZGV4IG9uIGEgZ2l2ZW4gbWFjaGluZSwKLS8vICAgICAgIGluZGVwZW5kZW50IG9mIHRoZSBwYXJ0aWN1bGFyIGJ5dGUgb3JkZXJpbmcuIFNpbmNlIGFsbCBvdGhlcgotLy8gICAgICAgcGxhY2VzIGluIHRoZSBzeXN0ZW0gdGhhdCByZWZlciB0byB0aGVzZSBpbmRpY2VzIHVzZSB0aGUKLS8vICAgICAgIHNhbWUgbWV0aG9kICh0aGUgbmF0dXJhbCBieXRlIG9yZGVyaW5nIG9uIHRoZSBwbGF0Zm9ybSkKLS8vICAgICAgIHRoaXMgd2lsbCBhbHdheXMgd29yayBhbmQgYmUgbWFjaGluZS1pbmRlcGVuZGVudCkuCiAKIGNsYXNzIEJ5dGVjb2RlOiBwdWJsaWMgVGhpc1JlbGF0aXZlT2JqIHsKICBwcm90ZWN0ZWQ6CkBAIC04MywyNCArNzUsNDAgQEAKICAgLy8gQXR0cmlidXRlcwogICBhZGRyZXNzIGJjcCgpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFkZHJfYXQoMCk7IH0KICAgYWRkcmVzcyBuZXh0X2JjcCgpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhZGRyX2F0KDApICsgQnl0ZWNvZGVzOjpsZW5ndGhfYXQoYmNwKCkpOyB9CisgIGludCBpbnN0cnVjdGlvbl9zaXplKCkgY29uc3QgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gQnl0ZWNvZGVzOjpsZW5ndGhfYXQoYmNwKCkpOyB9CiAKICAgQnl0ZWNvZGVzOjpDb2RlIGNvZGUoKSBjb25zdCAgICAgICAgICAgICAgICAgICB7IHJldHVybiBCeXRlY29kZXM6OmNvZGVfYXQoYWRkcl9hdCgwKSk7IH0KICAgQnl0ZWNvZGVzOjpDb2RlIGphdmFfY29kZSgpIGNvbnN0ICAgICAgICAgICAgICB7IHJldHVybiBCeXRlY29kZXM6OmphdmFfY29kZShjb2RlKCkpOyB9CiAgIGJvb2wgbXVzdF9yZXdyaXRlKCkgY29uc3QgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gQnl0ZWNvZGVzOjpjYW5fcmV3cml0ZShjb2RlKCkpICYmIGNoZWNrX211c3RfcmV3cml0ZSgpOyB9CiAgIGJvb2wgaXNfYWN0aXZlX2JyZWFrcG9pbnQoKSBjb25zdCAgICAgICAgICAgICAgeyByZXR1cm4gQnl0ZWNvZGVzOjppc19hY3RpdmVfYnJlYWtwb2ludF9hdChiY3AoKSk7IH0KIAotICBpbnQgICAgIG9uZV9ieXRlX2luZGV4KCkgY29uc3QgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGJ5dGVfYXQoMSk7IH0KLSAgaW50ICAgICB0d29fYnl0ZV9pbmRleCgpIGNvbnN0ICAgICAgICAgICAgICAgICB7IHJldHVybiAoYnl0ZV9hdCgxKSA8PCA4KSArIGJ5dGVfYXQoMik7IH0KKyAgaW50ICAgICBvbmVfYnl0ZV9pbmRleCgpIGNvbnN0ICAgICAgICAgICAgICAgICB7IGFzc2VydF9pbmRleF9zaXplKDEpOyByZXR1cm4gYnl0ZV9hdCgxKTsgfQorICBpbnQgICAgIHR3b19ieXRlX2luZGV4KCkgY29uc3QgICAgICAgICAgICAgICAgIHsgYXNzZXJ0X2luZGV4X3NpemUoMik7IHJldHVybiAoYnl0ZV9hdCgxKSA8PCA4KSArIGJ5dGVfYXQoMik7IH0KKwogICBpbnQgICAgIG9mZnNldCgpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICh0d29fYnl0ZV9pbmRleCgpIDw8IDE2KSA+PiAxNjsgfQogICBhZGRyZXNzIGRlc3RpbmF0aW9uKCkgY29uc3QgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGJjcCgpICsgb2Zmc2V0KCk7IH0KLSAgaW50ICAgICBmYXN0X2luZGV4KCkgY29uc3QgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBCeXRlczo6Z2V0X25hdGl2ZV91MihhZGRyX2F0KDEpKTsgfQogCiAgIC8vIEF0dHJpYnV0ZSBtb2RpZmljYXRpb24KICAgdm9pZCAgICBzZXRfY29kZShCeXRlY29kZXM6OkNvZGUgY29kZSk7Ci0gIHZvaWQgICAgc2V0X2Zhc3RfaW5kZXgoaW50IGkpOwogCiAgIC8vIENyZWF0aW9uCiAgIGlubGluZSBmcmllbmQgQnl0ZWNvZGUqIEJ5dGVjb2RlX2F0KGFkZHJlc3MgYmNwKTsKKworIHByaXZhdGU6CisgIHZvaWQgYXNzZXJ0X2luZGV4X3NpemUoaW50IHJlcXVpcmVkX3NpemUpIGNvbnN0IHsKKyNpZmRlZiBBU1NFUlQKKyAgICBpbnQgaXNpemUgPSBpbnN0cnVjdGlvbl9zaXplKCkgLSAxOworICAgIGlmIChpc2l6ZSA9PSAyICYmIGNvZGUoKSA9PSBCeXRlY29kZXM6Ol9paW5jKQorICAgICAgaXNpemUgPSAxOworICAgIGVsc2UgaWYgKGlzaXplIDw9IDIpCisgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZQorICAgIGVsc2UgaWYgKGNvZGUoKSA9PSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljKQorICAgICAgaXNpemUgPSA0OworICAgIGVsc2UKKyAgICAgIGlzaXplID0gMjsKKyAgICBhc3NlcnQoaXNpemUgPSByZXF1aXJlZF9zaXplLCAid3JvbmcgaW5kZXggc2l6ZSIpOworI2VuZGlmCisgIH0KIH07CiAKIGlubGluZSBCeXRlY29kZSogQnl0ZWNvZGVfYXQoYWRkcmVzcyBiY3ApIHsKQEAgLTE5NSw2ICsyMDMsOSBAQAogICBib29sIGlzX2ludm9rZXZpcnR1YWwoKSBjb25zdCAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFkanVzdGVkX2ludm9rZV9jb2RlKCkgPT0gQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDsgfQogICBib29sIGlzX2ludm9rZXN0YXRpYygpIGNvbnN0ICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFkanVzdGVkX2ludm9rZV9jb2RlKCkgPT0gQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljOyB9CiAgIGJvb2wgaXNfaW52b2tlc3BlY2lhbCgpIGNvbnN0ICAgICAgICAgICAgICAgICAgeyByZXR1cm4gYWRqdXN0ZWRfaW52b2tlX2NvZGUoKSA9PSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsOyB9CisgIGJvb2wgaXNfaW52b2tlZHluYW1pYygpIGNvbnN0ICAgICAgICAgICAgICAgICAgeyByZXR1cm4gYWRqdXN0ZWRfaW52b2tlX2NvZGUoKSA9PSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOyB9CisKKyAgYm9vbCBoYXNfZ2lhbnRfaW5kZXgoKSBjb25zdCAgICAgICAgICAgICAgICAgICB7IHJldHVybiBpc19pbnZva2VkeW5hbWljKCk7IH0KIAogICBib29sIGlzX3ZhbGlkKCkgY29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGlzX2ludm9rZWludGVyZmFjZSgpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaW52b2tldmlydHVhbCgpICAgfHwKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2RlU3RyZWFtLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2RlU3RyZWFtLmhwcAppbmRleCAzNjE2YzlkLi43YTNhMDEyIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZVN0cmVhbS5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGVTdHJlYW0uaHBwCkBAIC0xMDksNiArMTA5LDcgQEAKIAogICBCeXRlY29kZXM6OkNvZGUgY29kZSgpIGNvbnN0ICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9jb2RlOyB9CiAgIGJvb2wgICAgICAgICAgICBpc193aWRlKCkgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gX2lzX3dpZGU7IH0KKyAgaW50ICAgICAgICAgICAgIGluc3RydWN0aW9uX3NpemUoKSBjb25zdCAgICAgICB7IHJldHVybiAoX25leHRfYmNpIC0gX2JjaSk7IH0KICAgYm9vbCAgICAgICAgICAgIGlzX2xhc3RfYnl0ZWNvZGUoKSBjb25zdCAgICAgICB7IHJldHVybiBfbmV4dF9iY2kgPj0gX2VuZF9iY2k7IH0KIAogICBhZGRyZXNzICAgICAgICAgYmNwKCkgY29uc3QgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1ldGhvZCgpLT5jb2RlX2Jhc2UoKSArIF9iY2k7IH0KQEAgLTEyMiw4ICsxMjMsMjkgQEAKICAgaW50ICAgICAgICAgICAgIGRlc3RfdygpIGNvbnN0ICAgICAgICAgICAgICAgICB7IHJldHVybiBiY2koKSArIChpbnQgIClCeXRlczo6Z2V0X0phdmFfdTQoYmNwKCkgKyAxKTsgfQogCiAgIC8vIFVuc2lnbmVkIGluZGljZXMsIHdpZGVuaW5nCi0gIGludCAgICAgICAgICAgICBnZXRfaW5kZXgoKSBjb25zdCAgICAgICAgICAgICAgeyByZXR1cm4gKGlzX3dpZGUoKSkgPyBCeXRlczo6Z2V0X0phdmFfdTIoYmNwKCkgKyAyKSA6IGJjcCgpWzFdOyB9Ci0gIGludCAgICAgICAgICAgICBnZXRfaW5kZXhfYmlnKCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gKGludClCeXRlczo6Z2V0X0phdmFfdTIoYmNwKCkgKyAxKTsgIH0KKyAgaW50ICAgICAgICAgICAgIGdldF9pbmRleCgpIGNvbnN0ICAgICAgICAgICAgICB7IGFzc2VydF9pbmRleF9zaXplKGlzX3dpZGUoKSA/IDIgOiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaXNfd2lkZSgpKSA/IEJ5dGVzOjpnZXRfSmF2YV91MihiY3AoKSArIDIpIDogYmNwKClbMV07IH0KKyAgaW50ICAgICAgICAgICAgIGdldF9pbmRleF9iaWcoKSBjb25zdCAgICAgICAgICB7IGFzc2VydF9pbmRleF9zaXplKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpQnl0ZXM6OmdldF9KYXZhX3UyKGJjcCgpICsgMSk7ICB9CisgIGludCAgICAgICAgICAgICBnZXRfaW5kZXhfaW50KCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gaGFzX2dpYW50X2luZGV4KCkgPyBnZXRfaW5kZXhfZ2lhbnQoKSA6IGdldF9pbmRleF9iaWcoKTsgfQorICBpbnQgICAgICAgICAgICAgZ2V0X2luZGV4X2dpYW50KCkgY29uc3QgICAgICAgIHsgYXNzZXJ0X2luZGV4X3NpemUoNCk7IHJldHVybiBCeXRlczo6Z2V0X25hdGl2ZV91NChiY3AoKSArIDEpOyB9CisgIGludCAgICAgICAgICAgICBoYXNfZ2lhbnRfaW5kZXgoKSBjb25zdCAgICAgICAgeyByZXR1cm4gKGNvZGUoKSA9PSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljKTsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBhc3NlcnRfaW5kZXhfc2l6ZShpbnQgcmVxdWlyZWRfc2l6ZSkgY29uc3QgeworI2lmZGVmIEFTU0VSVAorICAgIGludCBpc2l6ZSA9IGluc3RydWN0aW9uX3NpemUoKSAtIChpbnQpX2lzX3dpZGUgLSAxOworICAgIGlmIChpc2l6ZSA9PSAyICYmIGNvZGUoKSA9PSBCeXRlY29kZXM6Ol9paW5jKQorICAgICAgaXNpemUgPSAxOworICAgIGVsc2UgaWYgKGlzaXplIDw9IDIpCisgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZQorICAgIGVsc2UgaWYgKGhhc19naWFudF9pbmRleCgpKQorICAgICAgaXNpemUgPSA0OworICAgIGVsc2UKKyAgICAgIGlzaXplID0gMjsKKyAgICBhc3NlcnQoaXNpemUgPSByZXF1aXJlZF9zaXplLCAid3JvbmcgaW5kZXggc2l6ZSIpOworI2VuZGlmCisgIH0KIH07CiAKIC8vIEluIEJ5dGVjb2RlU3RyZWFtLCBub24tamF2YSBieXRlY29kZXMgd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gdGhlCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZVRyYWNlci5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZVRyYWNlci5jcHAKaW5kZXggN2FjMGVhZi4uZWQyMTY4NiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGVUcmFjZXIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2RlVHJhY2VyLmNwcApAQCAtNDgsMTIgKzQ4LDE1IEBACiAKICAgaW50ICAgICAgIGdldF9pbmRleCgpICAgICAgICAgICAgICB7IHJldHVybiAqKGFkZHJlc3MpX25leHRfcGMrKzsgfQogICBpbnQgICAgICAgZ2V0X2JpZ19pbmRleCgpICAgICAgICAgIHsgaW50IGk9Qnl0ZXM6OmdldF9KYXZhX3UyKF9uZXh0X3BjKTsgX25leHRfcGMrPTI7IHJldHVybiBpOyB9CisgIGludCAgICAgICBnZXRfZ2lhbnRfaW5kZXgoKSAgICAgICAgeyBpbnQgaT1CeXRlczo6Z2V0X25hdGl2ZV91NChfbmV4dF9wYyk7IF9uZXh0X3BjKz00OyByZXR1cm4gaTsgfQogICBpbnQgICAgICAgZ2V0X2luZGV4X3NwZWNpYWwoKSAgICAgIHsgcmV0dXJuIChpc193aWRlKCkpID8gZ2V0X2JpZ19pbmRleCgpIDogZ2V0X2luZGV4KCk7IH0KICAgbWV0aG9kT29wIG1ldGhvZCgpICAgICAgICAgICAgICAgICB7IHJldHVybiBfY3VycmVudF9tZXRob2Q7IH0KICAgYm9vbCAgICAgIGlzX3dpZGUoKSAgICAgICAgICAgICAgICB7IHJldHVybiBfaXNfd2lkZTsgfQogCiAKKyAgYm9vbCAgICAgIGNoZWNrX2luZGV4KGludCBpLCBib29sIGluX2NwX2NhY2hlLCBpbnQmIGNwX2luZGV4LCBvdXRwdXRTdHJlYW0qIHN0ID0gdHR5KTsKICAgdm9pZCAgICAgIHByaW50X2NvbnN0YW50KGludCBpLCBvdXRwdXRTdHJlYW0qIHN0ID0gdHR5KTsKKyAgdm9pZCAgICAgIHByaW50X2ZpZWxkX29yX21ldGhvZChpbnQgaSwgb3V0cHV0U3RyZWFtKiBzdCA9IHR0eSk7CiAgIHZvaWQgICAgICBwcmludF9hdHRyaWJ1dGVzKEJ5dGVjb2Rlczo6Q29kZSBjb2RlLCBpbnQgYmNpLCBvdXRwdXRTdHJlYW0qIHN0ID0gdHR5KTsKICAgdm9pZCAgICAgIGJ5dGVjb2RlX2VwaWxvZyhpbnQgYmNpLCBvdXRwdXRTdHJlYW0qIHN0ID0gdHR5KTsKIApAQCAtMTgyLDcgKzE4NSw3MSBAQAogICB9CiB9CiAKK2Jvb2wgQnl0ZWNvZGVQcmludGVyOjpjaGVja19pbmRleChpbnQgaSwgYm9vbCBpbl9jcF9jYWNoZSwgaW50JiBjcF9pbmRleCwgb3V0cHV0U3RyZWFtKiBzdCkgeworICBjb25zdGFudFBvb2xPb3AgY29uc3RhbnRzID0gbWV0aG9kKCktPmNvbnN0YW50cygpOworICBpbnQgaWxpbWl0ID0gY29uc3RhbnRzLT5sZW5ndGgoKSwgY2xpbWl0ID0gMDsKKworICBjb25zdGFudFBvb2xDYWNoZU9vcCBjYWNoZSA9IE5VTEw7CisgIGlmIChpbl9jcF9jYWNoZSkgeworICAgIGNhY2hlID0gY29uc3RhbnRzLT5jYWNoZSgpOworICAgIGlmIChjYWNoZSAhPSBOVUxMKSB7CisgICAgICAvL2NsaW1pdCA9IGNhY2hlLT5sZW5ndGgoKTsgIC8vICUlJSBwcml2YXRlIQorICAgICAgc2l6ZV90IHNpemUgPSBjYWNoZS0+c2l6ZSgpICogSGVhcFdvcmRTaXplOworICAgICAgc2l6ZSAtPSBzaXplb2YoY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjKTsKKyAgICAgIHNpemUgLz0gc2l6ZW9mKENvbnN0YW50UG9vbENhY2hlRW50cnkpOworICAgICAgY2xpbWl0ID0gKGludCkgc2l6ZTsKKyAgICB9CisgIH0KKworICBpZiAoaW5fY3BfY2FjaGUgJiYgY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjppc19zZWNvbmRhcnlfaW5kZXgoaSkpIHsKKyAgICBpID0gY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjpkZWNvZGVfc2Vjb25kYXJ5X2luZGV4KGkpOworICAgIHN0LT5wcmludCgiIHNlY29uZGFyeSBjYWNoZVslZF0gb2YiLCBpKTsKKyAgICBpZiAoaSA+PSAwICYmIGkgPCBjbGltaXQpIHsKKyAgICAgIGlmICghY2FjaGUtPmVudHJ5X2F0KGkpLT5pc19zZWNvbmRhcnlfZW50cnkoKSkgeworICAgICAgICBzdC0+cHJpbnRfY3IoIiBub3Qgc2Vjb25kYXJ5IGVudHJ5PyIsIGkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpID0gY2FjaGUtPmVudHJ5X2F0KGkpLT5tYWluX2VudHJ5X2luZGV4KCk7CisgICAgICBnb3RvIGNoZWNrX2NhY2hlX2luZGV4OworICAgIH0gZWxzZSB7CisgICAgICBzdC0+cHJpbnRfY3IoIiBub3QgaW4gY2FjaGVbKl0/IiwgaSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKGNhY2hlICE9IE5VTEwpIHsKKyAgICBpID0gQnl0ZXM6OnN3YXBfdTIoaSk7CisgICAgaWYgKFdpemFyZE1vZGUpICBzdC0+cHJpbnQoIiAoc3dhcD0lZCkiLCBpKTsKKyAgICBnb3RvIGNoZWNrX2NhY2hlX2luZGV4OworICB9CisKKyBjaGVja19jcF9pbmRleDoKKyAgaWYgKGkgPj0gMCAmJiBpIDwgaWxpbWl0KSB7CisgICAgaWYgKFdpemFyZE1vZGUpICBzdC0+cHJpbnQoIiBjcFslZF0iLCBpKTsKKyAgICBjcF9pbmRleCA9IGk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdC0+cHJpbnRfY3IoIiBDUFslZF0gbm90IGluIENQIiwgaSk7CisgIHJldHVybiBmYWxzZTsKKworIGNoZWNrX2NhY2hlX2luZGV4OgorICBpZiAoaSA+PSAwICYmIGkgPCBjbGltaXQpIHsKKyAgICBpZiAoY2FjaGUtPmVudHJ5X2F0KGkpLT5pc19zZWNvbmRhcnlfZW50cnkoKSkgeworICAgICAgc3QtPnByaW50X2NyKCIgc2Vjb25kYXJ5IGVudHJ5PyIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpID0gY2FjaGUtPmVudHJ5X2F0KGkpLT5jb25zdGFudF9wb29sX2luZGV4KCk7CisgICAgZ290byBjaGVja19jcF9pbmRleDsKKyAgfQorICBzdC0+cHJpbnRfY3IoIiBub3QgaW4gQ1BbKl0/IiwgaSk7CisgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBCeXRlY29kZVByaW50ZXI6OnByaW50X2NvbnN0YW50KGludCBpLCBvdXRwdXRTdHJlYW0qIHN0KSB7CisgIGludCBvcmlnX2kgPSBpOworICBpZiAoIWNoZWNrX2luZGV4KG9yaWdfaSwgZmFsc2UsIGksIHN0KSkgIHJldHVybjsKKwogICBjb25zdGFudFBvb2xPb3AgY29uc3RhbnRzID0gbWV0aG9kKCktPmNvbnN0YW50cygpOwogICBjb25zdGFudFRhZyB0YWcgPSBjb25zdGFudHMtPnRhZ19hdChpKTsKIApAQCAtMjAzLDcgKzI3MCwzMSBAQAogICAgIHN0LT5wcmludF9jcigiICVzIiwgY29uc3RhbnRzLT5yZXNvbHZlZF9rbGFzc19hdChpKS0+a2xhc3NfcGFydCgpLT5leHRlcm5hbF9uYW1lKCkpOwogICB9IGVsc2UgaWYgKHRhZy5pc191bnJlc29sdmVkX2tsYXNzKCkpIHsKICAgICBzdC0+cHJpbnRfY3IoIiA8dW5yZXNvbHZlZCBrbGFzcyBhdCAlZD4iLCBpKTsKLSAgfSBlbHNlIFNob3VsZE5vdFJlYWNoSGVyZSgpOworICB9IGVsc2UgeworICAgIHN0LT5wcmludF9jcigiIGJhZCB0YWc9JWQgYXQgJWQiLCB0YWcudmFsdWUoKSwgaSk7CisgIH0KK30KKwordm9pZCBCeXRlY29kZVByaW50ZXI6OnByaW50X2ZpZWxkX29yX21ldGhvZChpbnQgaSwgb3V0cHV0U3RyZWFtKiBzdCkgeworICBpbnQgb3JpZ19pID0gaTsKKyAgaWYgKCFjaGVja19pbmRleChvcmlnX2ksIHRydWUsIGksIHN0KSkgIHJldHVybjsKKworICBjb25zdGFudFBvb2xPb3AgY29uc3RhbnRzID0gbWV0aG9kKCktPmNvbnN0YW50cygpOworICBjb25zdGFudFRhZyB0YWcgPSBjb25zdGFudHMtPnRhZ19hdChpKTsKKworICBzd2l0Y2ggKHRhZy52YWx1ZSgpKSB7CisgIGNhc2UgSlZNX0NPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZjoKKyAgY2FzZSBKVk1fQ09OU1RBTlRfTWV0aG9kcmVmOgorICBjYXNlIEpWTV9DT05TVEFOVF9GaWVsZHJlZjoKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBzdC0+cHJpbnRfY3IoIiBiYWQgdGFnPSVkIGF0ICVkIiwgdGFnLnZhbHVlKCksIGkpOworICAgIHJldHVybjsKKyAgfQorCisgIHN5bWJvbE9vcCBuYW1lID0gY29uc3RhbnRzLT5uYW1lX3JlZl9hdChvcmlnX2kpOworICBzeW1ib2xPb3Agc2lnbmF0dXJlID0gY29uc3RhbnRzLT5zaWduYXR1cmVfcmVmX2F0KG9yaWdfaSk7CisgIHN0LT5wcmludF9jcigiICVkIDwlcz4gPCVzPiAiLCBpLCBuYW1lLT5hc19DX3N0cmluZygpLCBzaWduYXR1cmUtPmFzX0Nfc3RyaW5nKCkpOwogfQogCiAKQEAgLTM1NCwzNiArNDQ1LDI4IEBACiAgICAgY2FzZSBCeXRlY29kZXM6Ol9wdXRzdGF0aWM6CiAgICAgY2FzZSBCeXRlY29kZXM6Ol9nZXRzdGF0aWM6CiAgICAgY2FzZSBCeXRlY29kZXM6Ol9wdXRmaWVsZDoKLSAgICBjYXNlIEJ5dGVjb2Rlczo6X2dldGZpZWxkOiB7Ci0gICAgICAgIGludCBpID0gZ2V0X2JpZ19pbmRleCgpOwotICAgICAgICBjb25zdGFudFBvb2xPb3AgY29uc3RhbnRzID0gbWV0aG9kKCktPmNvbnN0YW50cygpOwotICAgICAgICBzeW1ib2xPb3AgZmllbGQgPSBjb25zdGFudHMtPm5hbWVfcmVmX2F0KGkpOwotICAgICAgICBzdC0+cHJpbnRfY3IoIiAlZCA8JXM+IiwgaSwgZmllbGQtPmFzX0Nfc3RyaW5nKCkpOwotICAgICAgfQorICAgIGNhc2UgQnl0ZWNvZGVzOjpfZ2V0ZmllbGQ6CisgICAgICBwcmludF9maWVsZF9vcl9tZXRob2QoZ2V0X2JpZ19pbmRleCgpLCBzdCk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDoKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXNwZWNpYWw6CiAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWM6Ci0gICAgICB7IGludCBpID0gZ2V0X2JpZ19pbmRleCgpOwotICAgICAgICBjb25zdGFudFBvb2xPb3AgY29uc3RhbnRzID0gbWV0aG9kKCktPmNvbnN0YW50cygpOwotICAgICAgICBzeW1ib2xPb3AgbmFtZSA9IGNvbnN0YW50cy0+bmFtZV9yZWZfYXQoaSk7Ci0gICAgICAgIHN5bWJvbE9vcCBzaWduYXR1cmUgPSBjb25zdGFudHMtPnNpZ25hdHVyZV9yZWZfYXQoaSk7Ci0gICAgICAgIHN0LT5wcmludF9jcigiICVkIDwlcz4gPCVzPiAiLCBpLCBuYW1lLT5hc19DX3N0cmluZygpLCBzaWduYXR1cmUtPmFzX0Nfc3RyaW5nKCkpOwotICAgICAgfQorICAgICAgcHJpbnRfZmllbGRfb3JfbWV0aG9kKGdldF9iaWdfaW5kZXgoKSwgc3QpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWludGVyZmFjZToKICAgICAgIHsgaW50IGkgPSBnZXRfYmlnX2luZGV4KCk7CiAgICAgICAgIGludCBuID0gZ2V0X2luZGV4KCk7Ci0gICAgICAgIGdldF9pbmRleCgpOwotICAgICAgICBjb25zdGFudFBvb2xPb3AgY29uc3RhbnRzID0gbWV0aG9kKCktPmNvbnN0YW50cygpOwotICAgICAgICBzeW1ib2xPb3AgbmFtZSA9IGNvbnN0YW50cy0+bmFtZV9yZWZfYXQoaSk7Ci0gICAgICAgIHN5bWJvbE9vcCBzaWduYXR1cmUgPSBjb25zdGFudHMtPnNpZ25hdHVyZV9yZWZfYXQoaSk7Ci0gICAgICAgIHN0LT5wcmludF9jcigiICVkIDwlcz4gPCVzPiAlZCIsIGksIG5hbWUtPmFzX0Nfc3RyaW5nKCksIHNpZ25hdHVyZS0+YXNfQ19zdHJpbmcoKSwgbik7CisgICAgICAgIGdldF9pbmRleCgpOyAgICAgICAgICAgIC8vIGlnbm9yZSB6ZXJvIGJ5dGUKKyAgICAgICAgcHJpbnRfZmllbGRfb3JfbWV0aG9kKGksIHN0KTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgorICAgICAgcHJpbnRfZmllbGRfb3JfbWV0aG9kKGdldF9naWFudF9pbmRleCgpLCBzdCk7CisgICAgICBicmVhazsKKwogICAgIGNhc2UgQnl0ZWNvZGVzOjpfbmV3OgogICAgIGNhc2UgQnl0ZWNvZGVzOjpfY2hlY2tjYXN0OgogICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW5zdGFuY2VvZjoKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2Rlcy5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZXMuY3BwCmluZGV4IDVmODc1OTQuLjU2YTg5YjMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2Rlcy5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGVzLmNwcApAQCAtMzU3LDcgKzM1Nyw3IEBACiAgIGRlZihfaW52b2tlc3BlY2lhbCAgICAgICAsICJpbnZva2VzcGVjaWFsIiAgICAgICAsICJiamoiICAsIE5VTEwgICAgLCBUX0lMTEVHQUwsIC0xLCB0cnVlKTsKICAgZGVmKF9pbnZva2VzdGF0aWMgICAgICAgICwgImludm9rZXN0YXRpYyIgICAgICAgICwgImJqaiIgICwgTlVMTCAgICAsIFRfSUxMRUdBTCwgIDAsIHRydWUpOwogICBkZWYoX2ludm9rZWludGVyZmFjZSAgICAgLCAiaW52b2tlaW50ZXJmYWNlIiAgICAgLCAiYmpqX18iLCBOVUxMICAgICwgVF9JTExFR0FMLCAtMSwgdHJ1ZSk7Ci0gIGRlZihfeHh4dW51c2VkeHh4ICAgICAgICAsICJ4eHh1bnVzZWR4eHgiICAgICAgICAsIE5VTEwgICAsIE5VTEwgICAgLCBUX1ZPSUQgICAsICAwLCBmYWxzZSk7CisgIGRlZihfaW52b2tlZHluYW1pYyAgICAgICAsICJpbnZva2VkeW5hbWljIiAgICAgICAsICJiampqaiIsIE5VTEwgICAgLCBUX0lMTEVHQUwsIC0xLCB0cnVlICk7CiAgIGRlZihfbmV3ICAgICAgICAgICAgICAgICAsICJuZXciICAgICAgICAgICAgICAgICAsICJiaWkiICAsIE5VTEwgICAgLCBUX09CSkVDVCAsICAxLCB0cnVlICk7CiAgIGRlZihfbmV3YXJyYXkgICAgICAgICAgICAsICJuZXdhcnJheSIgICAgICAgICAgICAsICJiYyIgICAsIE5VTEwgICAgLCBUX09CSkVDVCAsICAwLCB0cnVlICk7CiAgIGRlZihfYW5ld2FycmF5ICAgICAgICAgICAsICJhbmV3YXJyYXkiICAgICAgICAgICAsICJiaWkiICAsIE5VTEwgICAgLCBUX09CSkVDVCAsICAwLCB0cnVlICk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZXMuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGVzLmhwcAppbmRleCA2MDk1OTFjLi5iZjg4ODcyIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9ieXRlY29kZXMuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2Rlcy5ocHAKQEAgLTIxOCw3ICsyMTgsNyBAQAogICAgIF9pbnZva2VzcGVjaWFsICAgICAgICA9IDE4MywgLy8gMHhiNwogICAgIF9pbnZva2VzdGF0aWMgICAgICAgICA9IDE4NCwgLy8gMHhiOAogICAgIF9pbnZva2VpbnRlcmZhY2UgICAgICA9IDE4NSwgLy8gMHhiOQotICAgIF94eHh1bnVzZWR4eHggICAgICAgICA9IDE4NiwgLy8gMHhiYQorICAgIF9pbnZva2VkeW5hbWljICAgICAgICA9IDE4NiwgLy8gMHhiYSAgICAgLy8gaWYgRW5hYmxlSW52b2tlRHluYW1pYwogICAgIF9uZXcgICAgICAgICAgICAgICAgICA9IDE4NywgLy8gMHhiYgogICAgIF9uZXdhcnJheSAgICAgICAgICAgICA9IDE4OCwgLy8gMHhiYwogICAgIF9hbmV3YXJyYXkgICAgICAgICAgICA9IDE4OSwgLy8gMHhiZApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvaW50ZXJwcmV0ZXJSdW50aW1lLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2ludGVycHJldGVyUnVudGltZS5jcHAKaW5kZXggNWQ0YTE2NC4uZjUwZmQyYiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvaW50ZXJwcmV0ZXJSdW50aW1lLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9pbnRlcnByZXRlclJ1bnRpbWUuY3BwCkBAIC02ODEsNiArNjgxLDEzMyBAQAogSVJUX0VORAogCiAKKy8vIEZpcnN0IHRpbWUgZXhlY3V0aW9uOiAgUmVzb2x2ZSBzeW1ib2xzLCBjcmVhdGUgYSBwZXJtYW5lbnQgQ2FsbFNpdGVJbXBsIG9iamVjdC4KK0lSVF9FTlRSWSh2b2lkLCBJbnRlcnByZXRlclJ1bnRpbWU6OnJlc29sdmVfaW52b2tlZHluYW1pYyhKYXZhVGhyZWFkKiB0aHJlYWQpKSB7CisgIFJlc291cmNlTWFyayBybSh0aHJlYWQpOworCisgIGFzc2VydChFbmFibGVJbnZva2VEeW5hbWljLCAiIik7CisKKyAgY29uc3QgQnl0ZWNvZGVzOjpDb2RlIGJ5dGVjb2RlID0gQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYzsKKworICBtZXRob2RIYW5kbGUgY2FsbGVyX21ldGhvZCh0aHJlYWQsIG1ldGhvZCh0aHJlYWQpKTsKKworICAvLyBmaXJzdCBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBib290c3RyYXAgbWV0aG9kCisgIHsKKyAgICBLbGFzc0hhbmRsZSBjYWxsZXJfa2xhc3ModGhyZWFkLCBjYWxsZXJfbWV0aG9kLT5tZXRob2RfaG9sZGVyKCkpOworICAgIEhhbmRsZSBib290bSA9IFN5c3RlbURpY3Rpb25hcnk6OmZpbmRfYm9vdHN0cmFwX21ldGhvZChjYWxsZXJfa2xhc3MsIEtsYXNzSGFuZGxlKCksIENIRUNLKTsKKyAgICBpZiAoYm9vdG0uaXNfbnVsbCgpKSB7CisgICAgICAvLyBJZiB0aGVyZSBpcyBubyBib290c3RyYXAgbWV0aG9kLCB0aHJvdyBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yLgorICAgICAgLy8gVGhpcyBpcyBhIHZhbGlkIGdlbmVyaWMgZXJyb3IgdHlwZSBmb3IgcmVzb2x1dGlvbiAoSkxTIDEyLjMuMykuCisgICAgICBjaGFyIGJ1ZlsyMDBdOworICAgICAgamlvX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJDbGFzcyAlcyBoYXMgbm90IGRlY2xhcmVkIGEgYm9vdHN0cmFwIG1ldGhvZCBmb3IgaW52b2tlZHluYW1pYyIsCisgICAgICAgICAgICAgICAgICAgKEtsYXNzOjpjYXN0KGNhbGxlcl9rbGFzcygpKSktPmV4dGVybmFsX25hbWUoKSk7CisgICAgICBUSFJPV19NU0codm1TeW1ib2xzOjpqYXZhX2xhbmdfSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcigpLCBidWYpOworICAgIH0KKyAgfQorCisgIGNvbnN0YW50UG9vbEhhbmRsZSBwb29sKHRocmVhZCwgY2FsbGVyX21ldGhvZC0+Y29uc3RhbnRzKCkpOworICBwb29sLT5zZXRfaW52b2tlZHluYW1pYygpOyAgICAvLyBtYXJrIGhlYWRlciB0byBmbGFnIGFjdGl2ZSBjYWxsIHNpdGVzCisKKyAgaW50IHJhd19pbmRleCA9IGZvdXJfYnl0ZV9pbmRleCh0aHJlYWQpOworICBhc3NlcnQoY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjppc19zZWNvbmRhcnlfaW5kZXgocmF3X2luZGV4KSwgImludm9rZWR5bmFtaWMgaW5kZXhlcyBtYXJrZWQgc3BlY2lhbGx5Iik7CisKKyAgLy8gdGhlcmUgYXJlIHR3byBDUEMgZW50cmllcyB0aGF0IGFyZSBvZiBpbnRlcmVzdDoKKyAgaW50IHNpdGVfaW5kZXggPSBjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmRlY29kZV9zZWNvbmRhcnlfaW5kZXgocmF3X2luZGV4KTsKKyAgaW50IG1haW5faW5kZXggPSBwb29sLT5jYWNoZSgpLT5lbnRyeV9hdChzaXRlX2luZGV4KS0+bWFpbl9lbnRyeV9pbmRleCgpOworICAvLyBhbmQgdGhlcmUgaXMgb25lIENQIGVudHJ5LCBhIE5hbWVBbmRUeXBlOgorICBpbnQgbnRfaW5kZXggPSBwb29sLT5tYXBfaW5zdHJ1Y3Rpb25fb3BlcmFuZF90b19pbmRleChyYXdfaW5kZXgpOworCisgIC8vIGZpcnN0IHJlc29sdmUgdGhlIHNpZ25hdHVyZSB0byBhIE1ILmludm9rZSBtZXRob2RPb3AKKyAgaWYgKCFwb29sLT5jYWNoZSgpLT5lbnRyeV9hdChtYWluX2luZGV4KS0+aXNfcmVzb2x2ZWQoYnl0ZWNvZGUpKSB7CisgICAgSnZtdGlIaWRlU2luZ2xlU3RlcHBpbmcgamhzcyh0aHJlYWQpOworICAgIENhbGxJbmZvIGluZm87CisgICAgTGlua1Jlc29sdmVyOjpyZXNvbHZlX2ludm9rZShpbmZvLCBIYW5kbGUoKSwgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19pbmRleCwgYnl0ZWNvZGUsIENIRUNLKTsKKyAgICAvLyBUaGUgbWFpbiBlbnRyeSBjb3JyZXNwb25kcyB0byBhIEpWTV9DT05TVEFOVF9OYW1lQW5kVHlwZSwgYW5kIHNlcnZlcworICAgIC8vIGFzIGEgY29tbW9uIHJlZmVyZW5jZSBwb2ludCBmb3IgYWxsIGludm9rZWR5bmFtaWMgY2FsbCBzaXRlcyB3aXRoCisgICAgLy8gdGhhdCBleGFjdCBjYWxsIGRlc2NyaXB0b3IuICBXZSB3aWxsIGxpbmsgaXQgaW4gdGhlIENQIGNhY2hlIGV4YWN0bHkKKyAgICAvLyBhcyBpZiBpdCB3ZXJlIGFuIGludm9rZXZpcnR1YWwgb2YgTWV0aG9kSGFuZGxlLmludm9rZS4KKyAgICBwb29sLT5jYWNoZSgpLT5lbnRyeV9hdChtYWluX2luZGV4KS0+c2V0X21ldGhvZCgKKyAgICAgIGJ5dGVjb2RlLAorICAgICAgaW5mby5yZXNvbHZlZF9tZXRob2QoKSwKKyAgICAgIGluZm8udnRhYmxlX2luZGV4KCkpOworICAgIGFzc2VydChwb29sLT5jYWNoZSgpLT5lbnRyeV9hdChtYWluX2luZGV4KS0+aXNfdmZpbmFsKCksICJmMiBtdXN0IGJlIGEgbWV0aG9kT29wIik7CisgIH0KKworICAvLyBUaGUgbWV0aG9kIChmMiBlbnRyeSkgb2YgdGhlIG1haW4gZW50cnkgaXMgdGhlIE1ILmludm9rZSBmb3IgdGhlCisgIC8vIGludm9rZWR5bmFtaWMgdGFyZ2V0IGNhbGwgc2lnbmF0dXJlLgorICBpbnRwdHJfdCBmMl92YWx1ZSA9IHBvb2wtPmNhY2hlKCktPmVudHJ5X2F0KG1haW5faW5kZXgpLT5mMigpOworICBtZXRob2RIYW5kbGUgbWhfaW52ZHluKFRIUkVBRCwgKG1ldGhvZE9vcCkgZjJfdmFsdWUpOworICBhc3NlcnQobWhfaW52ZHluLm5vdF9udWxsKCkgJiYgbWhfaW52ZHluLT5pc19tZXRob2QoKSAmJiBtaF9pbnZkeW4tPmlzX21ldGhvZF9oYW5kbGVfaW52b2tlKCksCisgICAgICAgICAiY29ycmVjdCByZXN1bHQgZnJvbSBMaW5rUmVzb2x2ZXI6OnJlc29sdmVfaW52b2tlZHluYW1pYyIpOworCisgIHN5bWJvbEhhbmRsZSBjYWxsX3NpdGVfbmFtZShUSFJFQUQsIHBvb2wtPm50X25hbWVfcmVmX2F0KG50X2luZGV4KSk7CisgIEhhbmRsZSBjYWxsX3NpdGUKKyAgICA9IFN5c3RlbURpY3Rpb25hcnk6Om1ha2VfZHluYW1pY19jYWxsX3NpdGUoY2FsbGVyX21ldGhvZC0+bWV0aG9kX2hvbGRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJfbWV0aG9kLT5tZXRob2RfaWRudW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyX21ldGhvZC0+YmNpX2Zyb20oYmNwKHRocmVhZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3NpdGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWhfaW52ZHluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyk7CisKKyAgLy8gSW4gdGhlIHNlY29uZGFyeSBlbnRyeSwgdGhlIGYxIGZpZWxkIGlzIHRoZSBjYWxsIHNpdGUsIGFuZCB0aGUgZjIgKGluZGV4KQorICAvLyBmaWVsZCBpcyBzb21lIGRhdGEgYWJvdXQgdGhlIGludm9rZSBzaXRlLgorICBpbnQgZXh0cmFfZGF0YSA9IDA7CisgIHBvb2wtPmNhY2hlKCktPmVudHJ5X2F0KHNpdGVfaW5kZXgpLT5zZXRfZHluYW1pY19jYWxsKGNhbGxfc2l0ZSgpLCBleHRyYV9kYXRhKTsKK30KK0lSVF9FTkQKKworCisvLyBDYWxsZWQgb24gZmlyc3QgdGltZSBleGVjdXRpb24sIGFuZCBhbHNvIHdoZW5ldmVyIHRoZSBDYWxsU2l0ZS50YXJnZXQgaXMgbnVsbC4KKy8vIEZJWE1FOiAgRG8gbW9yZSBvZiB0aGlzIGluIEphdmEgY29kZS4KK0lSVF9FTlRSWSh2b2lkLCBJbnRlcnByZXRlclJ1bnRpbWU6OmJvb3RzdHJhcF9pbnZva2VkeW5hbWljKEphdmFUaHJlYWQqIHRocmVhZCwgb29wRGVzYyogY2FsbF9zaXRlKSkgeworICBtZXRob2RIYW5kbGUgICBtaF9pbnZkeW4odGhyZWFkLCAobWV0aG9kT29wKSBzdW5fZHluX0NhbGxTaXRlSW1wbDo6dm1tZXRob2QoY2FsbF9zaXRlKSk7CisgIEhhbmRsZSAgICAgICAgIG1oX3R5cGUodGhyZWFkLCAgIG1oX2ludmR5bi0+bWV0aG9kX2hhbmRsZV90eXBlKCkpOworICBvYmpBcnJheUhhbmRsZSBtaF9wdHlwZXModGhyZWFkLCBqYXZhX2R5bl9NZXRob2RUeXBlOjpwdHlwZXMobWhfdHlwZSgpKSk7CisKKyAgLy8gc3F1aXNoIHRoZSBhcmd1bWVudHMgZG93biB0byBhIHNpbmdsZSBhcnJheQorICBpbnQgbmFyZ3MgPSBtaF9wdHlwZXMtPmxlbmd0aCgpOworICBvYmpBcnJheUhhbmRsZSBhcmdfYXJyYXk7CisgIHsKKyAgICBvYmpBcnJheU9vcCBhYW9vcCA9IG9vcEZhY3Rvcnk6Om5ld19vYmpBcnJheShTeXN0ZW1EaWN0aW9uYXJ5OjpvYmplY3Rfa2xhc3MoKSwgbmFyZ3MsIENIRUNLKTsKKyAgICBhcmdfYXJyYXkgPSBvYmpBcnJheUhhbmRsZSh0aHJlYWQsIGFhb29wKTsKKyAgfQorICBmcmFtZSBmciA9IHRocmVhZC0+bGFzdF9mcmFtZSgpOworICBhc3NlcnQoZnIuaW50ZXJwcmV0ZXJfZnJhbWVfYmNwKCkgIT0gTlVMTCwgInNhbml0eSIpOworICBpbnQgdG9zX29mZnNldCA9IDA7CisgIGZvciAoaW50IGkgPSBuYXJnczsgLS1pID49IDA7ICkgeworICAgIGludHB0cl90KiBzbG90X2FkZHIgPSBmci5pbnRlcnByZXRlcl9mcmFtZV90b3NfYXQodG9zX29mZnNldCsrKTsKKyAgICBvb3AgcHR5cGUgPSBtaF9wdHlwZXMtPm9ial9hdChpKTsKKyAgICBvb3AgYXJnID0gTlVMTDsKKyAgICBpZiAoIWphdmFfbGFuZ19DbGFzczo6aXNfcHJpbWl0aXZlKHB0eXBlKSkgeworICAgICAgYXJnID0gKihvb3AqKSBzbG90X2FkZHI7CisgICAgfSBlbHNlIHsKKyAgICAgIEJhc2ljVHlwZSBidCA9IGphdmFfbGFuZ19DbGFzczo6cHJpbWl0aXZlX3R5cGUocHR5cGUpOworICAgICAgYXNzZXJ0KGZyYW1lOjppbnRlcnByZXRlcl9mcmFtZV9leHByZXNzaW9uX3N0YWNrX2RpcmVjdGlvbigpIDwgMCwgImVsc2UgcmVjb25zaWRlciB0aGlzIGNvZGUiKTsKKyAgICAgIGp2YWx1ZSB2YWx1ZTsKKyAgICAgIEludGVycHJldGVyOjpnZXRfanZhbHVlX2luX3Nsb3Qoc2xvdF9hZGRyLCBidCwgJnZhbHVlKTsKKyAgICAgIHRvc19vZmZzZXQgKz0gdHlwZTJzaXplW2J0XS0xOworICAgICAgYXJnID0gamF2YV9sYW5nX2JveGluZ19vYmplY3Q6OmNyZWF0ZShidCwgJnZhbHVlLCBDSEVDSyk7CisgICAgICAvLyBGSVhNRTogIFRoZXNlIGJveGluZyBvYmplY3RzIGFyZSBub3QgY2Fub25pY2FsaXplZCB1bmRlcgorICAgICAgLy8gdGhlIEphdmEgYXV0b2JveGluZyBydWxlcy4gIFRoZXkgc2hvdWxkIGJlLi4uCisgICAgICAvLyBUaGUgYmVzdCBhcHByb2FjaCB3b3VsZCBiZSB0byBwdXNoIHRoZSBhcmdsaXN0IGNyZWF0aW9uIGludG8gSmF2YS4KKyAgICAgIC8vIFRoZSBKVk0gc2hvdWxkIHVzZSBhIGxvd2VyLWxldmVsIGludGVyZmFjZSB0byBjb21tdW5pY2F0ZSBhcmd1bWVudCBsaXN0cy4KKyAgICB9CisgICAgYXJnX2FycmF5LT5vYmpfYXRfcHV0KGksIGFyZyk7CisgIH0KKworICAvLyBub3cgZmluZCB0aGUgYm9vdHN0cmFwIG1ldGhvZAorICBvb3AgYm9vdHN0cmFwX21oX29vcCA9IGluc3RhbmNlS2xhc3M6OmNhc3QoZnIuaW50ZXJwcmV0ZXJfZnJhbWVfbWV0aG9kKCktPm1ldGhvZF9ob2xkZXIoKSktPmJvb3RzdHJhcF9tZXRob2QoKTsKKyAgYXNzZXJ0KGJvb3RzdHJhcF9taF9vb3AgIT0gTlVMTCwgInJlc29sdmVfaW52b2tlZHluYW1pYyBlbnN1cmVzIGEgQlNNIik7CisKKyAgLy8gcmV0dXJuIHRoZSBib290c3RyYXAgbWV0aG9kIGFuZCBhcmd1bWVudCBhcnJheSB2aWEgdm1fcmVzdWx0L18yCisgIHRocmVhZC0+c2V0X3ZtX3Jlc3VsdChib290c3RyYXBfbWhfb29wKTsKKyAgdGhyZWFkLT5zZXRfdm1fcmVzdWx0XzIoYXJnX2FycmF5KCkpOworfQorSVJUX0VORAorCisKKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIE1pc2NlbGxhbmVvdXMKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvaW50ZXJwcmV0ZXJSdW50aW1lLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2ludGVycHJldGVyUnVudGltZS5ocHAKaW5kZXggMWMwNWJjOS4uYmZjNzU2OSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvaW50ZXJwcmV0ZXJSdW50aW1lLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9pbnRlcnByZXRlclJ1bnRpbWUuaHBwCkBAIC00Miw4ICs0MiwxMSBAQAogICBzdGF0aWMgYm9vbCAgICAgIGFscmVhZHlfcmVzb2x2ZWQoSmF2YVRocmVhZCAqdGhyZWFkKSB7IHJldHVybiBjYWNoZV9lbnRyeSh0aHJlYWQpLT5pc19yZXNvbHZlZChjb2RlKHRocmVhZCkpOyB9CiAgIHN0YXRpYyBpbnQgICAgICAgb25lX2J5dGVfaW5kZXgoSmF2YVRocmVhZCAqdGhyZWFkKSAgIHsgcmV0dXJuIGJjcCh0aHJlYWQpWzFdOyB9CiAgIHN0YXRpYyBpbnQgICAgICAgdHdvX2J5dGVfaW5kZXgoSmF2YVRocmVhZCAqdGhyZWFkKSAgIHsgcmV0dXJuIEJ5dGVzOjpnZXRfSmF2YV91MihiY3AodGhyZWFkKSArIDEpOyB9CisgIHN0YXRpYyBpbnQgICAgICAgZm91cl9ieXRlX2luZGV4KEphdmFUaHJlYWQgKnRocmVhZCkgIHsgcmV0dXJuIEJ5dGVzOjpnZXRfbmF0aXZlX3U0KGJjcCh0aHJlYWQpICsgMSk7IH0KICAgc3RhdGljIGludCAgICAgICBudW1iZXJfb2ZfZGltZW5zaW9ucyhKYXZhVGhyZWFkICp0aHJlYWQpICB7IHJldHVybiBiY3AodGhyZWFkKVszXTsgfQotICBzdGF0aWMgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeSogY2FjaGVfZW50cnkoSmF2YVRocmVhZCAqdGhyZWFkKSAgeyByZXR1cm4gbWV0aG9kKHRocmVhZCktPmNvbnN0YW50cygpLT5jYWNoZSgpLT5lbnRyeV9hdChCeXRlczo6Z2V0X25hdGl2ZV91MihiY3AodGhyZWFkKSArIDEpKTsgfQorCisgIHN0YXRpYyBDb25zdGFudFBvb2xDYWNoZUVudHJ5KiBjYWNoZV9lbnRyeV9hdChKYXZhVGhyZWFkICp0aHJlYWQsIGludCBpKSAgeyByZXR1cm4gbWV0aG9kKHRocmVhZCktPmNvbnN0YW50cygpLT5jYWNoZSgpLT5lbnRyeV9hdChpKTsgfQorICBzdGF0aWMgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeSogY2FjaGVfZW50cnkoSmF2YVRocmVhZCAqdGhyZWFkKSAgICAgICAgICAgIHsgcmV0dXJuIGNhY2hlX2VudHJ5X2F0KHRocmVhZCwgQnl0ZXM6OmdldF9uYXRpdmVfdTIoYmNwKHRocmVhZCkgKyAxKSk7IH0KICAgc3RhdGljIHZvaWQgICAgICBub3RlX3RyYXAoSmF2YVRocmVhZCAqdGhyZWFkLCBpbnQgcmVhc29uLCBUUkFQUyk7CiAKICBwdWJsaWM6CkBAIC04Myw3ICs4Niw5IEBACiAgIHN0YXRpYyB2b2lkICAgIG5ld19pbGxlZ2FsX21vbml0b3Jfc3RhdGVfZXhjZXB0aW9uKEphdmFUaHJlYWQqIHRocmVhZCk7CiAKICAgLy8gQ2FsbHMKLSAgc3RhdGljIHZvaWQgICAgcmVzb2x2ZV9pbnZva2UgICAgIChKYXZhVGhyZWFkKiB0aHJlYWQsIEJ5dGVjb2Rlczo6Q29kZSBieXRlY29kZSk7CisgIHN0YXRpYyB2b2lkICAgIHJlc29sdmVfaW52b2tlICAgICAgIChKYXZhVGhyZWFkKiB0aHJlYWQsIEJ5dGVjb2Rlczo6Q29kZSBieXRlY29kZSk7CisgIHN0YXRpYyB2b2lkICAgIHJlc29sdmVfaW52b2tlZHluYW1pYyhKYXZhVGhyZWFkKiB0aHJlYWQpOworICBzdGF0aWMgdm9pZCAgYm9vdHN0cmFwX2ludm9rZWR5bmFtaWMoSmF2YVRocmVhZCogdGhyZWFkLCBvb3BEZXNjKiBjYWxsX3NpdGUpOwogCiAgIC8vIEJyZWFrcG9pbnRzCiAgIHN0YXRpYyB2b2lkIF9icmVha3BvaW50KEphdmFUaHJlYWQqIHRocmVhZCwgbWV0aG9kT29wRGVzYyogbWV0aG9kLCBhZGRyZXNzIGJjcCk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9saW5rUmVzb2x2ZXIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvbGlua1Jlc29sdmVyLmNwcAppbmRleCAwNWNkOTdiLi5jOWEyYzEzYyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvbGlua1Jlc29sdmVyLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9saW5rUmVzb2x2ZXIuY3BwCkBAIC05NDcsNiArOTQ3LDcgQEAKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYyAgIDogcmVzb2x2ZV9pbnZva2VzdGF0aWMgICAocmVzdWx0LCAgICAgICBwb29sLCBpbmRleCwgQ0hFQ0spOyBicmVhazsKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXNwZWNpYWwgIDogcmVzb2x2ZV9pbnZva2VzcGVjaWFsICAocmVzdWx0LCAgICAgICBwb29sLCBpbmRleCwgQ0hFQ0spOyBicmVhazsKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXZpcnR1YWwgIDogcmVzb2x2ZV9pbnZva2V2aXJ0dWFsICAocmVzdWx0LCByZWN2LCBwb29sLCBpbmRleCwgQ0hFQ0spOyBicmVhazsKKyAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWMgIDogcmVzb2x2ZV9pbnZva2VkeW5hbWljICAocmVzdWx0LCAgICAgICBwb29sLCBpbmRleCwgQ0hFQ0spOyBicmVhazsKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWludGVyZmFjZTogcmVzb2x2ZV9pbnZva2VpbnRlcmZhY2UocmVzdWx0LCByZWN2LCBwb29sLCBpbmRleCwgQ0hFQ0spOyBicmVhazsKICAgfQogICByZXR1cm47CkBAIC0xMDA4LDYgKzEwMDksMzAgQEAKICAgcmVzb2x2ZV9pbnRlcmZhY2VfY2FsbChyZXN1bHQsIHJlY3YsIHJlY3ZyS2xhc3MsIHJlc29sdmVkX2tsYXNzLCBtZXRob2RfbmFtZSwgbWV0aG9kX3NpZ25hdHVyZSwgY3VycmVudF9rbGFzcywgdHJ1ZSwgdHJ1ZSwgQ0hFQ0spOwogfQogCisKK3ZvaWQgTGlua1Jlc29sdmVyOjpyZXNvbHZlX2ludm9rZWR5bmFtaWMoQ2FsbEluZm8mIHJlc3VsdCwgY29uc3RhbnRQb29sSGFuZGxlIHBvb2wsIGludCByYXdfaW5kZXgsIFRSQVBTKSB7CisgIGFzc2VydChFbmFibGVJbnZva2VEeW5hbWljLCAiIik7CisKKyAgLy8gVGhpcyBndXkgaXMgcmVhY2hlZCBmcm9tIEludGVycHJldGVyUnVudGltZTo6cmVzb2x2ZV9pbnZva2VkeW5hbWljLgorCisgIGFzc2VydChjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmlzX3NlY29uZGFyeV9pbmRleChyYXdfaW5kZXgpLCAibXVzdCBiZSBzZWNvbmRhcnkgaW5kZXgiKTsKKyAgaW50IG50X2luZGV4ID0gcG9vbC0+bWFwX2luc3RydWN0aW9uX29wZXJhbmRfdG9faW5kZXgocmF3X2luZGV4KTsKKworICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBvbmx5IG5lZWQgdGhlIHNpZ25hdHVyZSwgYW5kIGNhbiBpZ25vcmUgdGhlIG5hbWUuCisgIHN5bWJvbEhhbmRsZSBtZXRob2Rfc2lnbmF0dXJlKFRIUkVBRCwgcG9vbC0+bnRfc2lnbmF0dXJlX3JlZl9hdChudF9pbmRleCkpOworICBzeW1ib2xIYW5kbGUgbWV0aG9kX25hbWUgPSB2bVN5bWJvbEhhbmRsZXM6Omludm9rZV9uYW1lKCk7CisgIEtsYXNzSGFuZGxlIHJlc29sdmVkX2tsYXNzID0gU3lzdGVtRGljdGlvbmFyeUhhbmRsZXM6Ok1ldGhvZEhhbmRsZV9rbGFzcygpOworCisgIC8vIEpTUiAyOTI6ICB0aGlzIG11c3QgYmUgYW4gaW1wbGljaXRseSBnZW5lcmF0ZWQgbWV0aG9kIE1ldGhvZEhhbmRsZS5pbnZva2UoKi4uLikKKyAgLy8gVGhlIGV4dHJhIE1IIHJlY2VpdmVyIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3RhY2sgb24gZXZlcnkgY2FsbC4KKyAgbWV0aG9kSGFuZGxlIHJlc29sdmVkX21ldGhvZDsKKyAgbG9va3VwX2ltcGxpY2l0X21ldGhvZChyZXNvbHZlZF9tZXRob2QsIHJlc29sdmVkX2tsYXNzLCBtZXRob2RfbmFtZSwgbWV0aG9kX3NpZ25hdHVyZSwgQ0hFQ0spOworICBpZiAocmVzb2x2ZWRfbWV0aG9kLmlzX251bGwoKSkgeworICAgIFRIUk9XKHZtU3ltYm9sczo6amF2YV9sYW5nX0ludGVybmFsRXJyb3IoKSk7CisgIH0KKyAgcmVzdWx0LnNldF92aXJ0dWFsKHJlc29sdmVkX2tsYXNzLCBLbGFzc0hhbmRsZSgpLCByZXNvbHZlZF9tZXRob2QsIHJlc29sdmVkX21ldGhvZCwgcmVzb2x2ZWRfbWV0aG9kLT52dGFibGVfaW5kZXgoKSwgQ0hFQ0spOworfQorCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogI2lmbmRlZiBQUk9EVUNUCiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2xpbmtSZXNvbHZlci5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9saW5rUmVzb2x2ZXIuaHBwCmluZGV4IGY1MjE5N2IuLmE5NTg3M2IgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2xpbmtSZXNvbHZlci5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvbGlua1Jlc29sdmVyLmhwcApAQCAtMTY3LDYgKzE2Nyw3IEBACiAgIHN0YXRpYyB2b2lkIHJlc29sdmVfaW52b2tlc3BlY2lhbCAgKENhbGxJbmZvJiByZXN1bHQsICAgICAgICAgICAgICBjb25zdGFudFBvb2xIYW5kbGUgcG9vbCwgaW50IGluZGV4LCBUUkFQUyk7CiAgIHN0YXRpYyB2b2lkIHJlc29sdmVfaW52b2tldmlydHVhbCAgKENhbGxJbmZvJiByZXN1bHQsIEhhbmRsZSByZWN2LCBjb25zdGFudFBvb2xIYW5kbGUgcG9vbCwgaW50IGluZGV4LCBUUkFQUyk7CiAgIHN0YXRpYyB2b2lkIHJlc29sdmVfaW52b2tlaW50ZXJmYWNlKENhbGxJbmZvJiByZXN1bHQsIEhhbmRsZSByZWN2LCBjb25zdGFudFBvb2xIYW5kbGUgcG9vbCwgaW50IGluZGV4LCBUUkFQUyk7CisgIHN0YXRpYyB2b2lkIHJlc29sdmVfaW52b2tlZHluYW1pYyAgKENhbGxJbmZvJiByZXN1bHQsICAgICAgICAgICAgICBjb25zdGFudFBvb2xIYW5kbGUgcG9vbCwgaW50IGluZGV4LCBUUkFQUyk7CiAKICAgc3RhdGljIHZvaWQgcmVzb2x2ZV9pbnZva2UgICAgICAgICAoQ2FsbEluZm8mIHJlc3VsdCwgSGFuZGxlIHJlY3YsIGNvbnN0YW50UG9vbEhhbmRsZSBwb29sLCBpbnQgaW5kZXgsIEJ5dGVjb2Rlczo6Q29kZSBieXRlLCBUUkFQUyk7CiB9OwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvcmV3cml0ZXIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvcmV3cml0ZXIuY3BwCmluZGV4IDc3ODE1MzguLmIyNDUxY2QgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3Jld3JpdGVyLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9yZXdyaXRlci5jcHAKQEAgLTI1LDM5ICsyNSw1MCBAQAogIyBpbmNsdWRlICJpbmNscy9fcHJlY29tcGlsZWQuaW5jbCIKICMgaW5jbHVkZSAiaW5jbHMvX3Jld3JpdGVyLmNwcC5pbmNsIgogCi0KLS8vIENvbXB1dGVzIGFuIGluZGV4X21hcCAobmV3X2luZGV4IC0+IG9yaWdpbmFsX2luZGV4KSBmb3IgY29udGFudCBwb29sIGVudHJpZXMKKy8vIENvbXB1dGVzIGEgQ1BDIG1hcCAobmV3X2luZGV4IC0+IG9yaWdpbmFsX2luZGV4KSBmb3IgY29uc3RhbnQgcG9vbCBlbnRyaWVzCiAvLyB0aGF0IGFyZSByZWZlcnJlZCB0byBieSB0aGUgaW50ZXJwcmV0ZXIgYXQgcnVudGltZSB2aWEgdGhlIGNvbnN0YW50IHBvb2wgY2FjaGUuCi12b2lkIFJld3JpdGVyOjpjb21wdXRlX2luZGV4X21hcHMoY29uc3RhbnRQb29sSGFuZGxlIHBvb2wsIGludEFycmF5KiYgaW5kZXhfbWFwLCBpbnRTdGFjayomIGludmVyc2VfaW5kZXhfbWFwKSB7Ci0gIGNvbnN0IGludCBsZW5ndGggID0gcG9vbC0+bGVuZ3RoKCk7Ci0gIGluZGV4X21hcCAgICAgICAgID0gbmV3IGludEFycmF5KGxlbmd0aCwgLTEpOwotICAvLyBDaG9vc2UgYW4gaW5pdGlhbCB2YWx1ZSBsYXJnZSBlbm91Z2ggdGhhdCB3ZSBkb24ndCBnZXQgZnJlcXVlbnQKLSAgLy8gY2FsbHMgdG8gZ3JvdygpLgotICBpbnZlcnNlX2luZGV4X21hcCA9IG5ldyBpbnRTdGFjayhsZW5ndGggLyAyKTsKKy8vIEFsc28gY29tcHV0ZXMgYSBDUCBtYXAgKG9yaWdpbmFsX2luZGV4IC0+IG5ld19pbmRleCkuCisvLyBNYXJrcyBlbnRyaWVzIGluIENQIHdoaWNoIHJlcXVpcmUgYWRkaXRpb25hbCBwcm9jZXNzaW5nLgordm9pZCBSZXdyaXRlcjo6Y29tcHV0ZV9pbmRleF9tYXBzKCkgeworICBjb25zdCBpbnQgbGVuZ3RoICA9IF9wb29sLT5sZW5ndGgoKTsKKyAgaW5pdF9jcF9tYXAobGVuZ3RoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgIHN3aXRjaCAocG9vbC0+dGFnX2F0KGkpLnZhbHVlKCkpIHsKKyAgICBpbnQgdGFnID0gX3Bvb2wtPnRhZ19hdChpKS52YWx1ZSgpOworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIEpWTV9DT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWY6CiAgICAgICBjYXNlIEpWTV9DT05TVEFOVF9GaWVsZHJlZiAgICAgICAgICA6IC8vIGZhbGwgdGhyb3VnaAogICAgICAgY2FzZSBKVk1fQ09OU1RBTlRfTWV0aG9kcmVmICAgICAgICAgOiAvLyBmYWxsIHRocm91Z2gKLSAgICAgIGNhc2UgSlZNX0NPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZjogewotICAgICAgICBpbmRleF9tYXAtPmF0X3B1dChpLCBpbnZlcnNlX2luZGV4X21hcC0+bGVuZ3RoKCkpOwotICAgICAgICBpbnZlcnNlX2luZGV4X21hcC0+YXBwZW5kKGkpOwotICAgICAgfQorICAgICAgICBhZGRfY3BfY2FjaGVfZW50cnkoaSk7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQorCisgIGd1YXJhbnRlZSgoaW50KV9jcF9jYWNoZV9tYXAubGVuZ3RoKCktMSA8PSAoaW50KSgodTIpLTEpLAorICAgICAgICAgICAgImFsbCBjcCBjYWNoZSBpbmRleGVzIGZpdCBpbiBhIHUyIik7CiB9CiAKIAotLy8gQ3JlYXRlcyBhIGNvbnN0YW50IHBvb2wgY2FjaGUgZ2l2ZW4gYW4gaW52ZXJzZV9pbmRleF9tYXAKK2ludCBSZXdyaXRlcjo6YWRkX2V4dHJhX2NwX2NhY2hlX2VudHJ5KGludCBtYWluX2VudHJ5KSB7CisgIC8vIEhhY2s6IFdlIHB1dCBpdCBvbiB0aGUgbWFwIGFzIGFuIGVuY29kZWQgdmFsdWUuCisgIC8vIFRoZSBvbmx5IHBsYWNlIHRoYXQgY29uc3VtZXMgdGhpcyBpcyBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpzZXRfaW5pdGlhbF9zdGF0ZQorICBpbnQgZW5jb2RlZCA9IGNvbnN0YW50UG9vbENhY2hlT29wRGVzYzo6ZW5jb2RlX3NlY29uZGFyeV9pbmRleChtYWluX2VudHJ5KTsKKyAgaW50IHBsYWluX3NlY29uZGFyeV9pbmRleCA9IF9jcF9jYWNoZV9tYXAuYXBwZW5kKGVuY29kZWQpOworICByZXR1cm4gY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjplbmNvZGVfc2Vjb25kYXJ5X2luZGV4KHBsYWluX3NlY29uZGFyeV9pbmRleCk7Cit9CisKKworCisvLyBDcmVhdGVzIGEgY29uc3RhbnQgcG9vbCBjYWNoZSBnaXZlbiBhIENQQyBtYXAKIC8vIFRoaXMgY3JlYXRlcyB0aGUgY29uc3RhbnQgcG9vbCBjYWNoZSBpbml0aWFsbHkgaW4gYSBzdGF0ZQogLy8gdGhhdCBpcyB1bnNhZmUgZm9yIGNvbmN1cnJlbnQgR0MgcHJvY2Vzc2luZyBidXQgc2V0cyBpdCB0bwogLy8gYSBzYWZlIG1vZGUgYmVmb3JlIHRoZSBjb25zdGFudCBwb29sIGNhY2hlIGlzIHJldHVybmVkLgotY29uc3RhbnRQb29sQ2FjaGVIYW5kbGUgUmV3cml0ZXI6Om5ld19jb25zdGFudF9wb29sX2NhY2hlKGludEFycmF5JiBpbnZlcnNlX2luZGV4X21hcCwgVFJBUFMpIHsKLSAgY29uc3QgaW50IGxlbmd0aCA9IGludmVyc2VfaW5kZXhfbWFwLmxlbmd0aCgpOwotICBjb25zdGFudFBvb2xDYWNoZU9vcCBjYWNoZSA9IG9vcEZhY3Rvcnk6Om5ld19jb25zdGFudFBvb2xDYWNoZShsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RPb3BEZXNjOjpJc1Vuc2FmZUNvbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS18oY29uc3RhbnRQb29sQ2FjaGVIYW5kbGUoKSkpOwotICBjYWNoZS0+aW5pdGlhbGl6ZShpbnZlcnNlX2luZGV4X21hcCk7Ci0gIHJldHVybiBjb25zdGFudFBvb2xDYWNoZUhhbmRsZShUSFJFQUQsIGNhY2hlKTsKK3ZvaWQgUmV3cml0ZXI6Om1ha2VfY29uc3RhbnRfcG9vbF9jYWNoZShUUkFQUykgeworICBjb25zdCBpbnQgbGVuZ3RoID0gX2NwX2NhY2hlX21hcC5sZW5ndGgoKTsKKyAgY29uc3RhbnRQb29sQ2FjaGVPb3AgY2FjaGUgPQorICAgICAgb29wRmFjdG9yeTo6bmV3X2NvbnN0YW50UG9vbENhY2hlKGxlbmd0aCwgbWV0aG9kT29wRGVzYzo6SXNVbnNhZmVDb25jLCBDSEVDSyk7CisgIGNhY2hlLT5pbml0aWFsaXplKF9jcF9jYWNoZV9tYXApOworICBfcG9vbC0+c2V0X2NhY2hlKGNhY2hlKTsKKyAgY2FjaGUtPnNldF9jb25zdGFudF9wb29sKF9wb29sKCkpOwogfQogCiAKQEAgLTEwMSw4ICsxMTIsMzggQEAKIH0KIAogCisvLyBSZXdyaXRlIGEgY2xhc3NmaWxlLW9yZGVyIENQIGluZGV4IGludG8gYSBuYXRpdmUtb3JkZXIgQ1BDIGluZGV4LgoraW50IFJld3JpdGVyOjpyZXdyaXRlX21lbWJlcl9yZWZlcmVuY2UoYWRkcmVzcyBiY3AsIGludCBvZmZzZXQpIHsKKyAgYWRkcmVzcyBwID0gYmNwICsgb2Zmc2V0OworICBpbnQgIGNwX2luZGV4ICAgID0gQnl0ZXM6OmdldF9KYXZhX3UyKHApOworICBpbnQgIGNhY2hlX2luZGV4ID0gY3BfZW50cnlfdG9fY3BfY2FjaGUoY3BfaW5kZXgpOworICBCeXRlczo6cHV0X25hdGl2ZV91MihwLCBjYWNoZV9pbmRleCk7CisgIHJldHVybiBjcF9pbmRleDsKK30KKworCit2b2lkIFJld3JpdGVyOjpyZXdyaXRlX2ludm9rZWR5bmFtaWMoYWRkcmVzcyBiY3AsIGludCBvZmZzZXQsIGludCBkZWxldGVfbWUpIHsKKyAgYWRkcmVzcyBwID0gYmNwICsgb2Zmc2V0OworICBhc3NlcnQocFstMV0gPT0gQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYywgIiIpOworICBpbnQgY3BfaW5kZXggPSBCeXRlczo6Z2V0X0phdmFfdTIocCk7CisgIGludCBjcGMgID0gbWF5YmVfYWRkX2NwX2NhY2hlX2VudHJ5KGNwX2luZGV4KTsgIC8vIGFkZCBsYXppbHkKKyAgaW50IGNwYzIgPSBhZGRfZXh0cmFfY3BfY2FjaGVfZW50cnkoY3BjKTsKKworICAvLyBSZXBsYWNlIHRoZSB0cmFpbGluZyBmb3VyIGJ5dGVzIHdpdGggYSBDUEMgaW5kZXggZm9yIHRoZSBkeW5hbWljCisgIC8vIGNhbGwgc2l0ZS4gIFVubGlrZSBvdGhlciBDUEMgZW50cmllcywgdGhlcmUgaXMgb25lIHBlciBieXRlY29kZSwKKyAgLy8gbm90IGp1c3Qgb25lIHBlciBkaXN0aW5jdCBDUCBlbnRyeS4gIEluIG90aGVyIHdvcmRzLCB0aGUKKyAgLy8gQ1BDLXRvLUNQIHJlbGF0aW9uIGlzIG1hbnktdG8tb25lIGZvciBpbnZva2VkeW5hbWljIGVudHJpZXMuCisgIC8vIFRoaXMgbWVhbnMgd2UgbXVzdCB1c2UgYSBsYXJnZXIgaW5kZXggc2l6ZSB0aGFuIHUyIHRvIGFkZHJlc3MKKyAgLy8gYWxsIHRoZXNlIGVudHJpZXMuICBUaGF0IGlzIHRoZSBtYWluIHJlYXNvbiBpbnZva2VkeW5hbWljCisgIC8vIG11c3QgaGF2ZSBhIGZpdmUtYnl0ZSBpbnN0cnVjdGlvbiBmb3JtYXQuICAoT2YgY291cnNlLCBvdGhlciBKVk0KKyAgLy8gaW1wbGVtZW50YXRpb25zIGNhbiB1c2UgdGhlIGJ5dGVzIGZvciBvdGhlciBwdXJwb3Nlcy4pCisgIEJ5dGVzOjpwdXRfbmF0aXZlX3U0KHAsIGNwYzIpOworICAvLyBOb3RlOiBXZSB1c2UgbmF0aXZlX3U0IGZvcm1hdCBleGNsdXNpdmVseSBmb3IgNC1ieXRlIGluZGV4ZXMuCit9CisKKwogLy8gUmV3cml0ZXMgYSBtZXRob2QgZ2l2ZW4gdGhlIGluZGV4X21hcCBpbmZvcm1hdGlvbgotbWV0aG9kSGFuZGxlIFJld3JpdGVyOjpyZXdyaXRlX21ldGhvZChtZXRob2RIYW5kbGUgbWV0aG9kLCBpbnRBcnJheSYgaW5kZXhfbWFwLCBUUkFQUykgewordm9pZCBSZXdyaXRlcjo6c2Nhbl9tZXRob2QobWV0aG9kT29wIG1ldGhvZCkgewogCiAgIGludCBub2ZfanNycyA9IDA7CiAgIGJvb2wgaGFzX21vbml0b3JfYnl0ZWNvZGVzID0gZmFsc2U7CkBAIC0xMjEsNiArMTYyLDcgQEAKICAgICBpbnQgYmNfbGVuZ3RoOwogICAgIGZvciAoaW50IGJjaSA9IDA7IGJjaSA8IGNvZGVfbGVuZ3RoOyBiY2kgKz0gYmNfbGVuZ3RoKSB7CiAgICAgICBhZGRyZXNzIGJjcCA9IGNvZGVfYmFzZSArIGJjaTsKKyAgICAgIGludCBwcmVmaXhfbGVuZ3RoID0gMDsKICAgICAgIGMgPSAoQnl0ZWNvZGVzOjpDb2RlKSgqYmNwKTsKIAogICAgICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgY29kZSwgc2VlIGlmIHdlIGNhbiBnZXQgdGhlIGxlbmd0aApAQCAtMTM1LDYgKzE3Nyw3IEBACiAgICAgICAgIC8vIGJ5ICd3aWRlJy4gV2UgZG9uJ3QgY3VycmVudGx5IGV4YW1pbmUgYW55IG9mIHRoZSBieXRlY29kZXMKICAgICAgICAgLy8gbW9kaWZpZWQgYnkgd2lkZSwgYnV0IGluIGNhc2Ugd2UgZG8gaW4gdGhlIGZ1dHVyZS4uLgogICAgICAgICBpZiAoYyA9PSBCeXRlY29kZXM6Ol93aWRlKSB7CisgICAgICAgICAgcHJlZml4X2xlbmd0aCA9IDE7CiAgICAgICAgICAgYyA9IChCeXRlY29kZXM6OkNvZGUpYmNwWzFdOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xNTksMTIgKzIwMiwxMyBAQAogICAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X3B1dGZpZWxkICAgICAgIDogLy8gZmFsbCB0aHJvdWdoCiAgICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbCAgOiAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsICA6IC8vIGZhbGwgdGhyb3VnaAotICAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYyAgIDogLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlaW50ZXJmYWNlOiB7Ci0gICAgICAgICAgYWRkcmVzcyBwID0gYmNwICsgMTsKLSAgICAgICAgICBCeXRlczo6cHV0X25hdGl2ZV91MihwLCBpbmRleF9tYXBbQnl0ZXM6OmdldF9KYXZhX3UyKHApXSk7CisgICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljICAgOgorICAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWludGVyZmFjZToKKyAgICAgICAgICByZXdyaXRlX21lbWJlcl9yZWZlcmVuY2UoYmNwLCBwcmVmaXhfbGVuZ3RoKzEpOwogICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYzoKKyAgICAgICAgICByZXdyaXRlX2ludm9rZWR5bmFtaWMoYmNwLCBwcmVmaXhfbGVuZ3RoKzEsIGludChzaXplb2YiQEBAQERFTEVURSBNRSIpKTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBCeXRlY29kZXM6Ol9qc3IgICAgICAgICAgICA6IC8vIGZhbGwgdGhyb3VnaAogICAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2pzcl93ICAgICAgICAgIDogbm9mX2pzcnMrKzsgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfbW9uaXRvcmVudGVyICAgOiAvLyBmYWxsIHRocm91Z2gKQEAgLTE4Miw1MyArMjI2LDU2IEBACiAgIC8vIGhhdmUgdG8gYmUgcmV3cml0dGVuLCBzbyB3ZSBydW4gdGhlIG9vcE1hcEdlbmVyYXRvciBvbiB0aGUgbWV0aG9kCiAgIGlmIChub2ZfanNycyA+IDApIHsKICAgICBtZXRob2QtPnNldF9oYXNfanNycygpOwotICAgIFJlc29sdmVPb3BNYXBDb25mbGljdHMgcm9tYyhtZXRob2QpOwotICAgIG1ldGhvZEhhbmRsZSBvcmlnaW5hbF9tZXRob2QgPSBtZXRob2Q7Ci0gICAgbWV0aG9kID0gcm9tYy5kb19wb3RlbnRpYWxfcmV3cml0ZShDSEVDS18obWV0aG9kSGFuZGxlKCkpKTsKLSAgICBpZiAobWV0aG9kKCkgIT0gb3JpZ2luYWxfbWV0aG9kKCkpIHsKLSAgICAgIC8vIEluc2VydCBpbnZhbGlkIGJ5dGVjb2RlIGludG8gb3JpZ2luYWwgbWV0aG9kT29wIGFuZCBzZXQKLSAgICAgIC8vIGludGVycHJldGVyIGVudHJ5cG9pbnQsIHNvIHRoYXQgYSBleGVjdXRpbmcgdGhpcyBtZXRob2QKLSAgICAgIC8vIHdpbGwgbWFuaWZlc3QgaXRzZWxmIGluIGFuIGVhc3kgcmVjb2duaXphYmxlIGZvcm0uCi0gICAgICBhZGRyZXNzIGJjcCA9IG9yaWdpbmFsX21ldGhvZC0+YmNwX2Zyb20oMCk7Ci0gICAgICAqYmNwID0gKHUxKUJ5dGVjb2Rlczo6X3Nob3VsZG5vdHJlYWNoaGVyZTsKLSAgICAgIGludCBraW5kID0gSW50ZXJwcmV0ZXI6Om1ldGhvZF9raW5kKG9yaWdpbmFsX21ldGhvZCk7Ci0gICAgICBvcmlnaW5hbF9tZXRob2QtPnNldF9pbnRlcnByZXRlcl9raW5kKGtpbmQpOwotICAgIH0KKyAgICAvLyBTZWNvbmQgcGFzcyB3aWxsIHJldmlzaXQgdGhpcyBtZXRob2QuCisgICAgYXNzZXJ0KG1ldGhvZC0+aGFzX2pzcnMoKSwgIiIpOworICB9Cit9CiAKLSAgICAvLyBVcGRhdGUgbW9uaXRvciBtYXRjaGluZyBpbmZvLgotICAgIGlmIChyb21jLm1vbml0b3Jfc2FmZSgpKSB7Ci0gICAgICBtZXRob2QtPnNldF9ndWFyYW50ZWVkX21vbml0b3JfbWF0Y2hpbmcoKTsKLSAgICB9CisvLyBBZnRlciBjb25zdGFudCBwb29sIGlzIGNyZWF0ZWQsIHJldmlzaXQgbWV0aG9kcyBjb250YWluaW5nIGpzcnMuCittZXRob2RIYW5kbGUgUmV3cml0ZXI6OnJld3JpdGVfanNycyhtZXRob2RIYW5kbGUgbWV0aG9kLCBUUkFQUykgeworICBSZXNvbHZlT29wTWFwQ29uZmxpY3RzIHJvbWMobWV0aG9kKTsKKyAgbWV0aG9kSGFuZGxlIG9yaWdpbmFsX21ldGhvZCA9IG1ldGhvZDsKKyAgbWV0aG9kID0gcm9tYy5kb19wb3RlbnRpYWxfcmV3cml0ZShDSEVDS18obWV0aG9kSGFuZGxlKCkpKTsKKyAgaWYgKG1ldGhvZCgpICE9IG9yaWdpbmFsX21ldGhvZCgpKSB7CisgICAgLy8gSW5zZXJ0IGludmFsaWQgYnl0ZWNvZGUgaW50byBvcmlnaW5hbCBtZXRob2RPb3AgYW5kIHNldAorICAgIC8vIGludGVycHJldGVyIGVudHJ5cG9pbnQsIHNvIHRoYXQgYSBleGVjdXRpbmcgdGhpcyBtZXRob2QKKyAgICAvLyB3aWxsIG1hbmlmZXN0IGl0c2VsZiBpbiBhbiBlYXN5IHJlY29nbml6YWJsZSBmb3JtLgorICAgIGFkZHJlc3MgYmNwID0gb3JpZ2luYWxfbWV0aG9kLT5iY3BfZnJvbSgwKTsKKyAgICAqYmNwID0gKHUxKUJ5dGVjb2Rlczo6X3Nob3VsZG5vdHJlYWNoaGVyZTsKKyAgICBpbnQga2luZCA9IEludGVycHJldGVyOjptZXRob2Rfa2luZChvcmlnaW5hbF9tZXRob2QpOworICAgIG9yaWdpbmFsX21ldGhvZC0+c2V0X2ludGVycHJldGVyX2tpbmQoa2luZCk7CiAgIH0KIAotICAvLyBTZXR1cCBtZXRob2QgZW50cnlwb2ludHMgZm9yIGNvbXBpbGVyIGFuZCBpbnRlcnByZXRlcgotICBtZXRob2QtPmxpbmtfbWV0aG9kKG1ldGhvZCwgQ0hFQ0tfKG1ldGhvZEhhbmRsZSgpKSk7CisgIC8vIFVwZGF0ZSBtb25pdG9yIG1hdGNoaW5nIGluZm8uCisgIGlmIChyb21jLm1vbml0b3Jfc2FmZSgpKSB7CisgICAgbWV0aG9kLT5zZXRfZ3VhcmFudGVlZF9tb25pdG9yX21hdGNoaW5nKCk7CisgIH0KIAogICByZXR1cm4gbWV0aG9kOwogfQogCiAKIHZvaWQgUmV3cml0ZXI6OnJld3JpdGUoaW5zdGFuY2VLbGFzc0hhbmRsZSBrbGFzcywgVFJBUFMpIHsKLSAgLy8gZ2F0aGVyIHN0YXJ0aW5nIHBvaW50cwogICBSZXNvdXJjZU1hcmsgcm0oVEhSRUFEKTsKLSAgY29uc3RhbnRQb29sSGFuZGxlIHBvb2wgKFRIUkVBRCwga2xhc3MtPmNvbnN0YW50cygpKTsKLSAgb2JqQXJyYXlIYW5kbGUgbWV0aG9kcyAgKFRIUkVBRCwga2xhc3MtPm1ldGhvZHMoKSk7Ci0gIGFzc2VydChwb29sLT5jYWNoZSgpID09IE5VTEwsICJjb25zdGFudCBwb29sIGNhY2hlIG11c3Qgbm90IGJlIHNldCB5ZXQiKTsKKyAgUmV3cml0ZXIgICAgIHJ3KGtsYXNzLCBDSEVDSyk7CisgIC8vIChUaGF0J3MgYWxsLCBmb2xrcy4pCit9CisKK1Jld3JpdGVyOjpSZXdyaXRlcihpbnN0YW5jZUtsYXNzSGFuZGxlIGtsYXNzLCBUUkFQUykKKyAgOiBfa2xhc3Moa2xhc3MpLAorICAgIC8vIGdhdGhlciBzdGFydGluZyBwb2ludHMKKyAgICBfcG9vbCggICBUSFJFQUQsIGtsYXNzLT5jb25zdGFudHMoKSksCisgICAgX21ldGhvZHMoVEhSRUFELCBrbGFzcy0+bWV0aG9kcygpKQoreworICBhc3NlcnQoX3Bvb2wtPmNhY2hlKCkgPT0gTlVMTCwgImNvbnN0YW50IHBvb2wgY2FjaGUgbXVzdCBub3QgYmUgc2V0IHlldCIpOwogCiAgIC8vIGRldGVybWluZSBpbmRleCBtYXBzIGZvciBtZXRob2RPb3AgcmV3cml0aW5nCi0gIGludEFycmF5KiBpbmRleF9tYXAgICAgICAgICA9IE5VTEw7Ci0gIGludFN0YWNrKiBpbnZlcnNlX2luZGV4X21hcCA9IE5VTEw7Ci0gIGNvbXB1dGVfaW5kZXhfbWFwcyhwb29sLCBpbmRleF9tYXAsIGludmVyc2VfaW5kZXhfbWFwKTsKKyAgY29tcHV0ZV9pbmRleF9tYXBzKCk7CiAKLSAgLy8gYWxsb2NhdGUgY29uc3RhbnQgcG9vbCBjYWNoZQotICBjb25zdGFudFBvb2xDYWNoZUhhbmRsZSBjYWNoZSA9IG5ld19jb25zdGFudF9wb29sX2NhY2hlKCppbnZlcnNlX2luZGV4X21hcCwgQ0hFQ0spOwotICBwb29sLT5zZXRfY2FjaGUoY2FjaGUoKSk7Ci0gIGNhY2hlLT5zZXRfY29uc3RhbnRfcG9vbChwb29sKCkpOwotCi0gIGlmIChSZWdpc3RlckZpbmFsaXplcnNBdEluaXQgJiYga2xhc3MtPm5hbWUoKSA9PSB2bVN5bWJvbHM6OmphdmFfbGFuZ19PYmplY3QoKSkgewotICAgIGludCBpID0gbWV0aG9kcy0+bGVuZ3RoKCk7CisgIGlmIChSZWdpc3RlckZpbmFsaXplcnNBdEluaXQgJiYgX2tsYXNzLT5uYW1lKCkgPT0gdm1TeW1ib2xzOjpqYXZhX2xhbmdfT2JqZWN0KCkpIHsKKyAgICBpbnQgaSA9IF9tZXRob2RzLT5sZW5ndGgoKTsKICAgICB3aGlsZSAoaS0tID4gMCkgewotICAgICAgbWV0aG9kT29wIG1ldGhvZCA9IChtZXRob2RPb3ApbWV0aG9kcy0+b2JqX2F0KGkpOworICAgICAgbWV0aG9kT29wIG1ldGhvZCA9IChtZXRob2RPb3ApX21ldGhvZHMtPm9ial9hdChpKTsKICAgICAgIGlmIChtZXRob2QtPmludHJpbnNpY19pZCgpID09IHZtSW50cmluc2ljczo6X09iamVjdF9pbml0KSB7CiAgICAgICAgIC8vIHJld3JpdGUgdGhlIHJldHVybiBieXRlY29kZXMgb2YgT2JqZWN0Ljxpbml0PiB0byByZWdpc3RlciB0aGUKICAgICAgICAgLy8gb2JqZWN0IGZvciBmaW5hbGl6YXRpb24gaWYgbmVlZGVkLgpAQCAtMjM5LDEzICsyODYsMjcgQEAKICAgICB9CiAgIH0KIAotICAvLyByZXdyaXRlIG1ldGhvZHMKLSAgeyBpbnQgaSA9IG1ldGhvZHMtPmxlbmd0aCgpOwotICAgIHdoaWxlIChpLS0gPiAwKSB7Ci0gICAgICBtZXRob2RIYW5kbGUgbShUSFJFQUQsIChtZXRob2RPb3ApbWV0aG9kcy0+b2JqX2F0KGkpKTsKLSAgICAgIG0gPSByZXdyaXRlX21ldGhvZChtLCAqaW5kZXhfbWFwLCBDSEVDSyk7CisgIC8vIHJld3JpdGUgbWV0aG9kcywgaW4gdHdvIHBhc3NlcworICBpbnQgaSwgbGVuID0gX21ldGhvZHMtPmxlbmd0aCgpOworCisgIGZvciAoaSA9IGxlbjsgLS1pID49IDA7ICkgeworICAgIG1ldGhvZE9vcCBtZXRob2QgPSAobWV0aG9kT29wKV9tZXRob2RzLT5vYmpfYXQoaSk7CisgICAgc2Nhbl9tZXRob2QobWV0aG9kKTsKKyAgfQorCisgIC8vIGFsbG9jYXRlIGNvbnN0YW50IHBvb2wgY2FjaGUsIG5vdyB0aGF0IHdlJ3ZlIHNlZW4gYWxsIHRoZSBieXRlY29kZXMKKyAgbWFrZV9jb25zdGFudF9wb29sX2NhY2hlKENIRUNLKTsKKworICBmb3IgKGkgPSBsZW47IC0taSA+PSAwOyApIHsKKyAgICBtZXRob2RIYW5kbGUgbShUSFJFQUQsIChtZXRob2RPb3ApX21ldGhvZHMtPm9ial9hdChpKSk7CisKKyAgICBpZiAobS0+aGFzX2pzcnMoKSkgeworICAgICAgbSA9IHJld3JpdGVfanNycyhtLCBDSEVDSyk7CiAgICAgICAvLyBNZXRob2QgbWlnaHQgaGF2ZSBnb3R0ZW4gcmV3cml0dGVuLgotICAgICAgbWV0aG9kcy0+b2JqX2F0X3B1dChpLCBtKCkpOworICAgICAgX21ldGhvZHMtPm9ial9hdF9wdXQoaSwgbSgpKTsKICAgICB9CisKKyAgICAvLyBTZXQgdXAgbWV0aG9kIGVudHJ5IHBvaW50cyBmb3IgY29tcGlsZXIgYW5kIGludGVycHJldGVyLgorICAgIG0tPmxpbmtfbWV0aG9kKG0sIENIRUNLKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvcmV3cml0ZXIuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvcmV3cml0ZXIuaHBwCmluZGV4IDg0N2RhZDAuLjRiOGZmN2UgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3Jld3JpdGVyLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci9yZXdyaXRlci5ocHAKQEAgLTI1LDEzICsyNSw0NCBAQAogLy8gVGhlIFJld3JpdGVyIGFkZHMgY2FjaGVzIHRvIHRoZSBjb25zdGFudCBwb29sIGFuZCByZXdyaXRlcyBieXRlY29kZSBpbmRpY2VzCiAvLyBwb2ludGluZyBpbnRvIHRoZSBjb25zdGFudCBwb29sIGZvciBiZXR0ZXIgaW50ZXJwcmV0ZXIgcGVyZm9ybWFuY2UuCiAKLWNsYXNzIFJld3JpdGVyOiBwdWJsaWMgQWxsU3RhdGljIHsKK2NsYXNzIFJld3JpdGVyOiBwdWJsaWMgU3RhY2tPYmogewogIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIGNvbXB1dGVfaW5kZXhfbWFwcyhjb25zdGFudFBvb2xIYW5kbGUgcG9vbCwgaW50QXJyYXkqJiBpbmRleF9tYXAsIGludFN0YWNrKiYgaW52ZXJzZV9pbmRleF9tYXApOwotICBzdGF0aWMgY29uc3RhbnRQb29sQ2FjaGVIYW5kbGUgbmV3X2NvbnN0YW50X3Bvb2xfY2FjaGUoaW50QXJyYXkmIGludmVyc2VfaW5kZXhfbWFwLCBUUkFQUyk7Ci0gIHN0YXRpYyBtZXRob2RIYW5kbGUgcmV3cml0ZV9tZXRob2QobWV0aG9kSGFuZGxlIG1ldGhvZCwgaW50QXJyYXkmIGluZGV4X21hcCwgVFJBUFMpOwotICBzdGF0aWMgdm9pZCByZXdyaXRlX09iamVjdF9pbml0KG1ldGhvZEhhbmRsZSBtZXRob2QsIFRSQVBTKTsKKyAgaW5zdGFuY2VLbGFzc0hhbmRsZSBfa2xhc3M7CisgIGNvbnN0YW50UG9vbEhhbmRsZSAgX3Bvb2w7CisgIG9iakFycmF5SGFuZGxlICAgICAgX21ldGhvZHM7CisgIGludEFycmF5ICAgICAgICAgICAgX2NwX21hcDsKKyAgaW50U3RhY2sgICAgICAgICAgICBfY3BfY2FjaGVfbWFwOworCisgIHZvaWQgaW5pdF9jcF9tYXAoaW50IGxlbmd0aCkgeworICAgIF9jcF9tYXAuaW5pdGlhbGl6ZShsZW5ndGgsIC0xKTsKKyAgICAvLyBDaG9vc2UgYW4gaW5pdGlhbCB2YWx1ZSBsYXJnZSBlbm91Z2ggdGhhdCB3ZSBkb24ndCBnZXQgZnJlcXVlbnQKKyAgICAvLyBjYWxscyB0byBncm93KCkuCisgICAgX2NwX2NhY2hlX21hcC5pbml0aWFsaXplKGxlbmd0aCAvIDIpOworICB9CisgIGludCAgY3BfZW50cnlfdG9fY3BfY2FjaGUoaW50IGkpIHsgYXNzZXJ0KGhhc19jcF9jYWNoZShpKSwgIm9vYiIpOyByZXR1cm4gX2NwX21hcFtpXTsgfQorICBib29sIGhhc19jcF9jYWNoZShpbnQgaSkgeyByZXR1cm4gKHVpbnQpaSA8ICh1aW50KV9jcF9tYXAubGVuZ3RoKCkgJiYgX2NwX21hcFtpXSA+PSAwOyB9CisgIGludCBtYXliZV9hZGRfY3BfY2FjaGVfZW50cnkoaW50IGkpIHsgcmV0dXJuIGhhc19jcF9jYWNoZShpKSA/IF9jcF9tYXBbaV0gOiBhZGRfY3BfY2FjaGVfZW50cnkoaSk7IH0KKyAgaW50IGFkZF9jcF9jYWNoZV9lbnRyeShpbnQgY3BfaW5kZXgpIHsKKyAgICBhc3NlcnQoX2NwX21hcFtjcF9pbmRleF0gPT0gLTEsICJub3QgdHdpY2Ugb24gc2FtZSBjcF9pbmRleCIpOworICAgIGludCBjYWNoZV9pbmRleCA9IF9jcF9jYWNoZV9tYXAuYXBwZW5kKGNwX2luZGV4KTsKKyAgICBfY3BfbWFwLmF0X3B1dChjcF9pbmRleCwgY2FjaGVfaW5kZXgpOworICAgIGFzc2VydChjcF9lbnRyeV90b19jcF9jYWNoZShjcF9pbmRleCkgPT0gY2FjaGVfaW5kZXgsICIiKTsKKyAgICByZXR1cm4gY2FjaGVfaW5kZXg7CisgIH0KKyAgaW50IGFkZF9leHRyYV9jcF9jYWNoZV9lbnRyeShpbnQgbWFpbl9lbnRyeSk7CisKKyAgLy8gQWxsIHRoZSB3b3JrIGdvZXMgaW4gaGVyZToKKyAgUmV3cml0ZXIoaW5zdGFuY2VLbGFzc0hhbmRsZSBrbGFzcywgVFJBUFMpOworCisgIHZvaWQgY29tcHV0ZV9pbmRleF9tYXBzKCk7CisgIHZvaWQgbWFrZV9jb25zdGFudF9wb29sX2NhY2hlKFRSQVBTKTsKKyAgdm9pZCBzY2FuX21ldGhvZChtZXRob2RPb3AgbSk7CisgIG1ldGhvZEhhbmRsZSByZXdyaXRlX2pzcnMobWV0aG9kSGFuZGxlIG0sIFRSQVBTKTsKKyAgdm9pZCByZXdyaXRlX09iamVjdF9pbml0KG1ldGhvZEhhbmRsZSBtLCBUUkFQUyk7CisgIGludCAgcmV3cml0ZV9tZW1iZXJfcmVmZXJlbmNlKGFkZHJlc3MgYmNwLCBpbnQgb2Zmc2V0KTsKKyAgdm9pZCByZXdyaXRlX2ludm9rZWR5bmFtaWMoYWRkcmVzcyBiY3AsIGludCBvZmZzZXQsIGludCBjcF9pbmRleCk7CiAKICBwdWJsaWM6CisgIC8vIERyaXZlciByb3V0aW5lOgogICBzdGF0aWMgdm9pZCByZXdyaXRlKGluc3RhbmNlS2xhc3NIYW5kbGUga2xhc3MsIFRSQVBTKTsKIH07CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci90ZW1wbGF0ZUludGVycHJldGVyLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3RlbXBsYXRlSW50ZXJwcmV0ZXIuY3BwCmluZGV4IGJkYmQ0NTYuLjQzNzU2MTcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3RlbXBsYXRlSW50ZXJwcmV0ZXIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3RlbXBsYXRlSW50ZXJwcmV0ZXIuY3BwCkBAIC0xNzgsMTIgKzE3OCwxNCBAQAogI2VuZGlmIC8vICFQUk9EVUNUCiBFbnRyeVBvaW50IFRlbXBsYXRlSW50ZXJwcmV0ZXI6Ol9yZXR1cm5fZW50cnlbVGVtcGxhdGVJbnRlcnByZXRlcjo6bnVtYmVyX29mX3JldHVybl9lbnRyaWVzXTsKIEVudHJ5UG9pbnQgVGVtcGxhdGVJbnRlcnByZXRlcjo6X2Vhcmx5cmV0X2VudHJ5OworRW50cnlQb2ludCBUZW1wbGF0ZUludGVycHJldGVyOjpfcmV0dXJuX3VuYm94X2VudHJ5OwogRW50cnlQb2ludCBUZW1wbGF0ZUludGVycHJldGVyOjpfZGVvcHRfZW50cnkgW1RlbXBsYXRlSW50ZXJwcmV0ZXI6Om51bWJlcl9vZl9kZW9wdF9lbnRyaWVzIF07CiBFbnRyeVBvaW50IFRlbXBsYXRlSW50ZXJwcmV0ZXI6Ol9jb250aW51YXRpb25fZW50cnk7CiBFbnRyeVBvaW50IFRlbXBsYXRlSW50ZXJwcmV0ZXI6Ol9zYWZlcHRfZW50cnk7CiAKIGFkZHJlc3MgICAgVGVtcGxhdGVJbnRlcnByZXRlcjo6X3JldHVybl8zX2FkZHJzX2J5X2luZGV4W1RlbXBsYXRlSW50ZXJwcmV0ZXI6Om51bWJlcl9vZl9yZXR1cm5fYWRkcnNdOwogYWRkcmVzcyAgICBUZW1wbGF0ZUludGVycHJldGVyOjpfcmV0dXJuXzVfYWRkcnNfYnlfaW5kZXhbVGVtcGxhdGVJbnRlcnByZXRlcjo6bnVtYmVyX29mX3JldHVybl9hZGRyc107CithZGRyZXNzICAgIFRlbXBsYXRlSW50ZXJwcmV0ZXI6Ol9yZXR1cm5fNV91bmJveF9hZGRyc19ieV9pbmRleFtUZW1wbGF0ZUludGVycHJldGVyOjpudW1iZXJfb2ZfcmV0dXJuX2FkZHJzXTsKIAogRGlzcGF0Y2hUYWJsZSBUZW1wbGF0ZUludGVycHJldGVyOjpfYWN0aXZlX3RhYmxlOwogRGlzcGF0Y2hUYWJsZSBUZW1wbGF0ZUludGVycHJldGVyOjpfbm9ybWFsX3RhYmxlOwpAQCAtMjUxLDYgKzI1MywyMiBAQAogICAgIH0KICAgfQogCisgIGlmIChFbmFibGVJbnZva2VEeW5hbWljKSB7CisgICAgQ29kZWxldE1hcmsgY20oX21hc20sICJ1bmJveGluZyByZXR1cm4gZW50cnkgcG9pbnRzIik7CisgICAgSW50ZXJwcmV0ZXI6Ol9yZXR1cm5fdW5ib3hfZW50cnkgPQorICAgICAgRW50cnlQb2ludCgKKyAgICAgICAgZ2VuZXJhdGVfcmV0dXJuX3VuYm94X2VudHJ5X2ZvcihidG9zLCA1KSwKKyAgICAgICAgZ2VuZXJhdGVfcmV0dXJuX3VuYm94X2VudHJ5X2ZvcihjdG9zLCA1KSwKKyAgICAgICAgZ2VuZXJhdGVfcmV0dXJuX3VuYm94X2VudHJ5X2ZvcihzdG9zLCA1KSwKKyAgICAgICAgZ2VuZXJhdGVfcmV0dXJuX3VuYm94X2VudHJ5X2ZvcihhdG9zLCA1KSwgLy8gY2FzdCBjb252ZXJzaW9uCisgICAgICAgIGdlbmVyYXRlX3JldHVybl91bmJveF9lbnRyeV9mb3IoaXRvcywgNSksCisgICAgICAgIGdlbmVyYXRlX3JldHVybl91bmJveF9lbnRyeV9mb3IobHRvcywgNSksCisgICAgICAgIGdlbmVyYXRlX3JldHVybl91bmJveF9lbnRyeV9mb3IoZnRvcywgNSksCisgICAgICAgIGdlbmVyYXRlX3JldHVybl91bmJveF9lbnRyeV9mb3IoZHRvcywgNSksCisgICAgICAgIEludGVycHJldGVyOjpfcmV0dXJuX2VudHJ5WzVdLmVudHJ5KHZ0b3MpIC8vIG5vIHVuYm94aW5nIGZvciB2b2lkCisgICAgICApOworICB9CisKICAgeyBDb2RlbGV0TWFyayBjbShfbWFzbSwgImVhcmx5cmV0IGVudHJ5IHBvaW50cyIpOwogICAgIEludGVycHJldGVyOjpfZWFybHlyZXRfZW50cnkgPQogICAgICAgRW50cnlQb2ludCgKQEAgLTI5OCw4ICszMTYsMTEgQEAKIAogICBmb3IgKGludCBqID0gMDsgaiA8IG51bWJlcl9vZl9zdGF0ZXM7IGorKykgewogICAgIGNvbnN0IFRvc1N0YXRlIHN0YXRlc1tdID0ge2J0b3MsIGN0b3MsIHN0b3MsIGl0b3MsIGx0b3MsIGZ0b3MsIGR0b3MsIGF0b3MsIHZ0b3N9OwotICAgIEludGVycHJldGVyOjpfcmV0dXJuXzNfYWRkcnNfYnlfaW5kZXhbSW50ZXJwcmV0ZXI6OlRvc1N0YXRlX2FzX2luZGV4KHN0YXRlc1tqXSldID0gSW50ZXJwcmV0ZXI6OnJldHVybl9lbnRyeShzdGF0ZXNbal0sIDMpOwotICAgIEludGVycHJldGVyOjpfcmV0dXJuXzVfYWRkcnNfYnlfaW5kZXhbSW50ZXJwcmV0ZXI6OlRvc1N0YXRlX2FzX2luZGV4KHN0YXRlc1tqXSldID0gSW50ZXJwcmV0ZXI6OnJldHVybl9lbnRyeShzdGF0ZXNbal0sIDUpOworICAgIGludCBpbmRleCA9IEludGVycHJldGVyOjpUb3NTdGF0ZV9hc19pbmRleChzdGF0ZXNbal0pOworICAgIEludGVycHJldGVyOjpfcmV0dXJuXzNfYWRkcnNfYnlfaW5kZXhbaW5kZXhdID0gSW50ZXJwcmV0ZXI6OnJldHVybl9lbnRyeShzdGF0ZXNbal0sIDMpOworICAgIEludGVycHJldGVyOjpfcmV0dXJuXzVfYWRkcnNfYnlfaW5kZXhbaW5kZXhdID0gSW50ZXJwcmV0ZXI6OnJldHVybl9lbnRyeShzdGF0ZXNbal0sIDUpOworICAgIGlmIChFbmFibGVJbnZva2VEeW5hbWljKQorICAgICAgSW50ZXJwcmV0ZXI6Ol9yZXR1cm5fNV91bmJveF9hZGRyc19ieV9pbmRleFtpbmRleF0gPSBJbnRlcnByZXRlcjo6cmV0dXJuX3VuYm94X2VudHJ5KHN0YXRlc1tqXSwgNSk7CiAgIH0KIAogICB7IENvZGVsZXRNYXJrIGNtKF9tYXNtLCAiY29udGludWF0aW9uIGVudHJ5IHBvaW50cyIpOwpAQCAtNTI2LDYgKzU0NywxOCBAQAogfQogCiAKK2FkZHJlc3MgVGVtcGxhdGVJbnRlcnByZXRlcjo6cmV0dXJuX3VuYm94X2VudHJ5KFRvc1N0YXRlIHN0YXRlLCBpbnQgbGVuZ3RoKSB7CisgIGFzc2VydChFbmFibGVJbnZva2VEeW5hbWljLCAiIik7CisgIGlmIChzdGF0ZSA9PSB2dG9zKSB7CisgICAgLy8gbm8gdW5ib3hpbmcgdG8gZG8sIGFjdHVhbGx5CisgICAgcmV0dXJuIHJldHVybl9lbnRyeShzdGF0ZSwgbGVuZ3RoKTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQobGVuZ3RoID09IDUsICJ1bmJveGluZyBlbnRyaWVzIGdlbmVyYXRlZCBmb3IgaW52b2tlZHluYW1pYyBvbmx5Iik7CisgICAgcmV0dXJuIF9yZXR1cm5fdW5ib3hfZW50cnkuZW50cnkoc3RhdGUpOworICB9Cit9CisKKwogYWRkcmVzcyBUZW1wbGF0ZUludGVycHJldGVyOjpkZW9wdF9lbnRyeShUb3NTdGF0ZSBzdGF0ZSwgaW50IGxlbmd0aCkgewogICBndWFyYW50ZWUoMCA8PSBsZW5ndGggJiYgbGVuZ3RoIDwgSW50ZXJwcmV0ZXI6Om51bWJlcl9vZl9kZW9wdF9lbnRyaWVzLCAiaWxsZWdhbCBsZW5ndGgiKTsKICAgcmV0dXJuIF9kZW9wdF9lbnRyeVtsZW5ndGhdLmVudHJ5KHN0YXRlKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3RlbXBsYXRlSW50ZXJwcmV0ZXIuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvdGVtcGxhdGVJbnRlcnByZXRlci5ocHAKaW5kZXggNjgwY2U1MS4uMmM3OGUzMSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvdGVtcGxhdGVJbnRlcnByZXRlci5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvdGVtcGxhdGVJbnRlcnByZXRlci5ocHAKQEAgLTgzLDkgKzgzLDkgQEAKICBwdWJsaWM6CiAKICAgZW51bSBNb3JlQ29uc3RhbnRzIHsKLSAgICBudW1iZXJfb2ZfcmV0dXJuX2VudHJpZXMgID0gOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcmV0dXJuIGVudHJ5IHBvaW50cwotICAgIG51bWJlcl9vZl9kZW9wdF9lbnRyaWVzICAgPSA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBkZW9wdGltaXphdGlvbiBlbnRyeSBwb2ludHMKLSAgICBudW1iZXJfb2ZfcmV0dXJuX2FkZHJzICAgID0gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiByZXR1cm4gYWRkcmVzc2VzCisgICAgbnVtYmVyX29mX3JldHVybl9lbnRyaWVzICA9IG51bWJlcl9vZl9zdGF0ZXMsICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHJldHVybiBlbnRyeSBwb2ludHMKKyAgICBudW1iZXJfb2ZfZGVvcHRfZW50cmllcyAgID0gbnVtYmVyX29mX3N0YXRlcywgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgZGVvcHRpbWl6YXRpb24gZW50cnkgcG9pbnRzCisgICAgbnVtYmVyX29mX3JldHVybl9hZGRycyAgICA9IG51bWJlcl9vZl9zdGF0ZXMgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHJldHVybiBhZGRyZXNzZXMKICAgfTsKIAogIHByb3RlY3RlZDoKQEAgLTExMCwxMiArMTEwLDE0IEBACiAjZW5kaWYgLy8gIVBST0RVQ1QKICAgc3RhdGljIEVudHJ5UG9pbnQgX3JldHVybl9lbnRyeVtudW1iZXJfb2ZfcmV0dXJuX2VudHJpZXNdOyAgICAvLyBlbnRyeSBwb2ludHMgdG8gcmV0dXJuIHRvIGZyb20gYSBjYWxsCiAgIHN0YXRpYyBFbnRyeVBvaW50IF9lYXJseXJldF9lbnRyeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cnkgcG9pbnQgdG8gcmV0dXJuIGVhcmx5IGZyb20gYSBjYWxsCisgIHN0YXRpYyBFbnRyeVBvaW50IF9yZXR1cm5fdW5ib3hfZW50cnk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cnkgcG9pbnQgdG8gdW5ib3ggYSByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGwKICAgc3RhdGljIEVudHJ5UG9pbnQgX2Rlb3B0X2VudHJ5W251bWJlcl9vZl9kZW9wdF9lbnRyaWVzXTsgICAgICAvLyBlbnRyeSBwb2ludHMgdG8gcmV0dXJuIHRvIGZyb20gYSBkZW9wdGltaXphdGlvbgogICBzdGF0aWMgRW50cnlQb2ludCBfY29udGludWF0aW9uX2VudHJ5OwogICBzdGF0aWMgRW50cnlQb2ludCBfc2FmZXB0X2VudHJ5OwogCiAgIHN0YXRpYyBhZGRyZXNzICAgIF9yZXR1cm5fM19hZGRyc19ieV9pbmRleFtudW1iZXJfb2ZfcmV0dXJuX2FkZHJzXTsgICAgIC8vIGZvciBpbnZva2V2aXJ0dWFsICAgcmV0dXJuIGVudHJpZXMKICAgc3RhdGljIGFkZHJlc3MgICAgX3JldHVybl81X2FkZHJzX2J5X2luZGV4W251bWJlcl9vZl9yZXR1cm5fYWRkcnNdOyAgICAgLy8gZm9yIGludm9rZWludGVyZmFjZSByZXR1cm4gZW50cmllcworICBzdGF0aWMgYWRkcmVzcyAgICBfcmV0dXJuXzVfdW5ib3hfYWRkcnNfYnlfaW5kZXhbbnVtYmVyX29mX3JldHVybl9hZGRyc107IC8vIGZvciBpbnZva2VkeW5hbWljIGJvb3RzdHJhcCBtZXRob2RzCiAKICAgc3RhdGljIERpc3BhdGNoVGFibGUgX2FjdGl2ZV90YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0aXZlICAgIGRpc3BhdGNoIHRhYmxlICh1c2VkIGJ5IHRoZSBpbnRlcnByZXRlciBmb3IgZGlzcGF0Y2gpCiAgIHN0YXRpYyBEaXNwYXRjaFRhYmxlIF9ub3JtYWxfdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vcm1hbCAgICBkaXNwYXRjaCB0YWJsZSAodXNlZCB0byBzZXQgdGhlIGFjdGl2ZSB0YWJsZSBpbiBub3JtYWwgbW9kZSkKQEAgLTE1NywxMCArMTU5LDEyIEBACiAgIC8vIFN1cHBvcnQgZm9yIGludm9rZXMKICAgc3RhdGljIGFkZHJlc3MqICAgcmV0dXJuXzNfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSAgICAgICAgICAgICB7IHJldHVybiBfcmV0dXJuXzNfYWRkcnNfYnlfaW5kZXg7IH0KICAgc3RhdGljIGFkZHJlc3MqICAgcmV0dXJuXzVfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSAgICAgICAgICAgICB7IHJldHVybiBfcmV0dXJuXzVfYWRkcnNfYnlfaW5kZXg7IH0KKyAgc3RhdGljIGFkZHJlc3MqICAgcmV0dXJuXzVfdW5ib3hfYWRkcnNfYnlfaW5kZXhfdGFibGUoKSAgICAgICB7IHJldHVybiBfcmV0dXJuXzVfdW5ib3hfYWRkcnNfYnlfaW5kZXg7IH0KICAgc3RhdGljIGludCAgICAgICAgVG9zU3RhdGVfYXNfaW5kZXgoVG9zU3RhdGUgc3RhdGUpOyAgICAgICAgICAvLyBjb21wdXRlcyBpbmRleCBpbnRvIHJldHVybl8zX2VudHJ5X2J5X2luZGV4IHRhYmxlCiAKICAgc3RhdGljIGFkZHJlc3MgICAgcmV0dXJuX2VudHJ5ICAoVG9zU3RhdGUgc3RhdGUsIGludCBsZW5ndGgpOwogICBzdGF0aWMgYWRkcmVzcyAgICBkZW9wdF9lbnRyeSAgIChUb3NTdGF0ZSBzdGF0ZSwgaW50IGxlbmd0aCk7CisgIHN0YXRpYyBhZGRyZXNzICAgIHJldHVybl91bmJveF9lbnRyeShUb3NTdGF0ZSBzdGF0ZSwgaW50IGxlbmd0aCk7CiAKICAgLy8gU2FmZXBvaW50IHN1cHBvcnQKICAgc3RhdGljIHZvaWQgICAgICAgbm90aWNlX3NhZmVwb2ludHMoKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wcyB0aGUgdGhyZWFkIHdoZW4gcmVhY2hpbmcgYSBzYWZlcG9pbnQKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3RlbXBsYXRlSW50ZXJwcmV0ZXJHZW5lcmF0b3IuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvdGVtcGxhdGVJbnRlcnByZXRlckdlbmVyYXRvci5ocHAKaW5kZXggNjc2ZTc2Mi4uOWQ1YjY5NCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvdGVtcGxhdGVJbnRlcnByZXRlckdlbmVyYXRvci5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvdGVtcGxhdGVJbnRlcnByZXRlckdlbmVyYXRvci5ocHAKQEAgLTUxLDcgKzUxLDEwIEBACiAgIGFkZHJlc3MgZ2VuZXJhdGVfV3JvbmdNZXRob2RUeXBlX2hhbmRsZXIoKTsKICAgYWRkcmVzcyBnZW5lcmF0ZV9BcnJheUluZGV4T3V0T2ZCb3VuZHNfaGFuZGxlcihjb25zdCBjaGFyKiBuYW1lKTsKICAgYWRkcmVzcyBnZW5lcmF0ZV9jb250aW51YXRpb25fZm9yKFRvc1N0YXRlIHN0YXRlKTsKLSAgYWRkcmVzcyBnZW5lcmF0ZV9yZXR1cm5fZW50cnlfZm9yKFRvc1N0YXRlIHN0YXRlLCBpbnQgc3RlcCk7CisgIGFkZHJlc3MgZ2VuZXJhdGVfcmV0dXJuX2VudHJ5X2ZvcihUb3NTdGF0ZSBzdGF0ZSwgaW50IHN0ZXAsIGJvb2wgdW5ib3ggPSBmYWxzZSk7CisgIGFkZHJlc3MgZ2VuZXJhdGVfcmV0dXJuX3VuYm94X2VudHJ5X2ZvcihUb3NTdGF0ZSBzdGF0ZSwgaW50IHN0ZXApIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVfcmV0dXJuX2VudHJ5X2ZvcihzdGF0ZSwgc3RlcCwgdHJ1ZSk7CisgIH0KICAgYWRkcmVzcyBnZW5lcmF0ZV9lYXJseXJldF9lbnRyeV9mb3IoVG9zU3RhdGUgc3RhdGUpOwogICBhZGRyZXNzIGdlbmVyYXRlX2Rlb3B0X2VudHJ5X2ZvcihUb3NTdGF0ZSBzdGF0ZSwgaW50IHN0ZXApOwogICBhZGRyZXNzIGdlbmVyYXRlX3NhZmVwdF9lbnRyeV9mb3IoVG9zU3RhdGUgc3RhdGUsIGFkZHJlc3MgcnVudGltZV9lbnRyeSk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci90ZW1wbGF0ZVRhYmxlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3RlbXBsYXRlVGFibGUuY3BwCmluZGV4IDc1NmIzZjYuLjhlMTE2YWUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3RlbXBsYXRlVGFibGUuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL3RlbXBsYXRlVGFibGUuY3BwCkBAIC00NDIsNiArNDQyLDcgQEAKICAgZGVmKEJ5dGVjb2Rlczo6X2ludm9rZXNwZWNpYWwgICAgICAgLCB1YmNwfGRpc3B8Y2x2bXxfX19fLCB2dG9zLCB2dG9zLCBpbnZva2VzcGVjaWFsICAgICAgICwgIDEgICAgICAgICAgICk7CiAgIGRlZihCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWMgICAgICAgICwgdWJjcHxkaXNwfGNsdm18X19fXywgdnRvcywgdnRvcywgaW52b2tlc3RhdGljICAgICAgICAsICAxICAgICAgICAgICApOwogICBkZWYoQnl0ZWNvZGVzOjpfaW52b2tlaW50ZXJmYWNlICAgICAsIHViY3B8ZGlzcHxjbHZtfF9fX18sIHZ0b3MsIHZ0b3MsIGludm9rZWludGVyZmFjZSAgICAgLCAgMSAgICAgICAgICAgKTsKKyAgZGVmKEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWMgICAgICAgLCB1YmNwfGRpc3B8Y2x2bXxfX19fLCB2dG9zLCB2dG9zLCBpbnZva2VkeW5hbWljICAgICAgICwgIDEgICAgICAgICAgICk7CiAgIGRlZihCeXRlY29kZXM6Ol9uZXcgICAgICAgICAgICAgICAgICwgdWJjcHxfX19ffGNsdm18X19fXywgdnRvcywgYXRvcywgX25ldyAgICAgICAgICAgICAgICAsICBfICAgICAgICAgICApOwogICBkZWYoQnl0ZWNvZGVzOjpfbmV3YXJyYXkgICAgICAgICAgICAsIHViY3B8X19fX3xjbHZtfF9fX18sIGl0b3MsIGF0b3MsIG5ld2FycmF5ICAgICAgICAgICAgLCAgXyAgICAgICAgICAgKTsKICAgZGVmKEJ5dGVjb2Rlczo6X2FuZXdhcnJheSAgICAgICAgICAgLCB1YmNwfF9fX198Y2x2bXxfX19fLCBpdG9zLCBhdG9zLCBhbmV3YXJyYXkgICAgICAgICAgICwgIF8gICAgICAgICAgICk7CkBAIC01MDMsNyArNTA0LDYgQEAKIAogICBkZWYoQnl0ZWNvZGVzOjpfZmFzdF9pbnZva2V2ZmluYWwgICAsIHViY3B8ZGlzcHxjbHZtfF9fX18sIHZ0b3MsIHZ0b3MsIGZhc3RfaW52b2tldmZpbmFsICAgLCAgMiAgICAgICAgICAgKTsKIAotCiAgIGRlZihCeXRlY29kZXM6Ol9mYXN0X2xpbmVhcnN3aXRjaCAgICwgdWJjcHxkaXNwfF9fX198X19fXywgaXRvcywgdnRvcywgZmFzdF9saW5lYXJzd2l0Y2ggICAsICBfICAgICAgICAgICApOwogICBkZWYoQnl0ZWNvZGVzOjpfZmFzdF9iaW5hcnlzd2l0Y2ggICAsIHViY3B8ZGlzcHxfX19ffF9fX18sIGl0b3MsIHZ0b3MsIGZhc3RfYmluYXJ5c3dpdGNoICAgLCAgXyAgICAgICAgICAgKTsKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvdGVtcGxhdGVUYWJsZS5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci90ZW1wbGF0ZVRhYmxlLmhwcAppbmRleCBhZjZiZjg3Li40MWQ4MmQ1IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci90ZW1wbGF0ZVRhYmxlLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9pbnRlcnByZXRlci90ZW1wbGF0ZVRhYmxlLmhwcApAQCAtMjYxLDYgKzI2MSw3IEBACiAgIHN0YXRpYyB2b2lkIGludm9rZXNwZWNpYWwoaW50IGJ5dGVfbm8pOwogICBzdGF0aWMgdm9pZCBpbnZva2VzdGF0aWMoaW50IGJ5dGVfbm8pOwogICBzdGF0aWMgdm9pZCBpbnZva2VpbnRlcmZhY2UoaW50IGJ5dGVfbm8pOworICBzdGF0aWMgdm9pZCBpbnZva2VkeW5hbWljKGludCBieXRlX25vKTsKICAgc3RhdGljIHZvaWQgZmFzdF9pbnZva2V2ZmluYWwoaW50IGJ5dGVfbm8pOwogCiAgIHN0YXRpYyB2b2lkIGdldGZpZWxkX29yX3N0YXRpYyhpbnQgYnl0ZV9ubywgYm9vbCBpc19zdGF0aWMpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9jb25zdGFudFBvb2xLbGFzcy5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NvbnN0YW50UG9vbEtsYXNzLmNwcAppbmRleCBhYjJkYWM4Li40NGIxNjQzIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NvbnN0YW50UG9vbEtsYXNzLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NvbnN0YW50UG9vbEtsYXNzLmNwcApAQCAtMzEyLDYgKzMxMiw3IEBACiAgIGlmIChjcC0+ZmxhZ3MoKSAhPSAwKSB7CiAgICAgc3QtPnByaW50KCIgLSBmbGFncyA6IDB4JXgiLCBjcC0+ZmxhZ3MoKSk7CiAgICAgaWYgKGNwLT5oYXNfcHNldWRvX3N0cmluZygpKSBzdC0+cHJpbnQoIiBoYXNfcHNldWRvX3N0cmluZyIpOworICAgIGlmIChjcC0+aGFzX2ludm9rZWR5bmFtaWMoKSkgc3QtPnByaW50KCIgaGFzX2ludm9rZWR5bmFtaWMiKTsKICAgICBzdC0+Y3IoKTsKICAgfQogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NvbnN0YW50UG9vbE9vcC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NvbnN0YW50UG9vbE9vcC5jcHAKaW5kZXggZDYzNjJlNy4uZjg5OWVlZiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9jb25zdGFudFBvb2xPb3AuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvY29uc3RhbnRQb29sT29wLmNwcApAQCAtMjQ5LDMyICsyNDksNDEgQEAKIH0KIAogCi1zeW1ib2xPb3AgY29uc3RhbnRQb29sT29wRGVzYzo6dW5jYWNoZWRfbmFtZV9yZWZfYXQoaW50IHdoaWNoKSB7Ci0gIGppbnQgcmVmX2luZGV4ID0gbmFtZV9hbmRfdHlwZV9hdCh1bmNhY2hlZF9uYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdCh3aGljaCkpOwotICBpbnQgbmFtZV9pbmRleCA9IGV4dHJhY3RfbG93X3Nob3J0X2Zyb21faW50KHJlZl9pbmRleCk7CitzeW1ib2xPb3AgY29uc3RhbnRQb29sT29wRGVzYzo6aW1wbF9uYW1lX3JlZl9hdChpbnQgd2hpY2gsIGJvb2wgdW5jYWNoZWQpIHsKKyAgaW50IG5hbWVfaW5kZXggPSBuYW1lX3JlZl9pbmRleF9hdChpbXBsX25hbWVfYW5kX3R5cGVfcmVmX2luZGV4X2F0KHdoaWNoLCB1bmNhY2hlZCkpOwogICByZXR1cm4gc3ltYm9sX2F0KG5hbWVfaW5kZXgpOwogfQogCiAKLXN5bWJvbE9vcCBjb25zdGFudFBvb2xPb3BEZXNjOjp1bmNhY2hlZF9zaWduYXR1cmVfcmVmX2F0KGludCB3aGljaCkgewotICBqaW50IHJlZl9pbmRleCA9IG5hbWVfYW5kX3R5cGVfYXQodW5jYWNoZWRfbmFtZV9hbmRfdHlwZV9yZWZfaW5kZXhfYXQod2hpY2gpKTsKLSAgaW50IHNpZ25hdHVyZV9pbmRleCA9IGV4dHJhY3RfaGlnaF9zaG9ydF9mcm9tX2ludChyZWZfaW5kZXgpOworc3ltYm9sT29wIGNvbnN0YW50UG9vbE9vcERlc2M6OmltcGxfc2lnbmF0dXJlX3JlZl9hdChpbnQgd2hpY2gsIGJvb2wgdW5jYWNoZWQpIHsKKyAgaW50IHNpZ25hdHVyZV9pbmRleCA9IHNpZ25hdHVyZV9yZWZfaW5kZXhfYXQoaW1wbF9uYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdCh3aGljaCwgdW5jYWNoZWQpKTsKICAgcmV0dXJuIHN5bWJvbF9hdChzaWduYXR1cmVfaW5kZXgpOwogfQogCiAKLWludCBjb25zdGFudFBvb2xPb3BEZXNjOjp1bmNhY2hlZF9uYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpIHsKLSAgamludCByZWZfaW5kZXggPSBmaWVsZF9vcl9tZXRob2RfYXQod2hpY2gsIHRydWUpOworaW50IGNvbnN0YW50UG9vbE9vcERlc2M6OmltcGxfbmFtZV9hbmRfdHlwZV9yZWZfaW5kZXhfYXQoaW50IHdoaWNoLCBib29sIHVuY2FjaGVkKSB7CisgIGppbnQgcmVmX2luZGV4ID0gZmllbGRfb3JfbWV0aG9kX2F0KHdoaWNoLCB1bmNhY2hlZCk7CiAgIHJldHVybiBleHRyYWN0X2hpZ2hfc2hvcnRfZnJvbV9pbnQocmVmX2luZGV4KTsKIH0KIAogCi1pbnQgY29uc3RhbnRQb29sT29wRGVzYzo6dW5jYWNoZWRfa2xhc3NfcmVmX2luZGV4X2F0KGludCB3aGljaCkgewotICBqaW50IHJlZl9pbmRleCA9IGZpZWxkX29yX21ldGhvZF9hdCh3aGljaCwgdHJ1ZSk7CitpbnQgY29uc3RhbnRQb29sT29wRGVzYzo6aW1wbF9rbGFzc19yZWZfaW5kZXhfYXQoaW50IHdoaWNoLCBib29sIHVuY2FjaGVkKSB7CisgIGppbnQgcmVmX2luZGV4ID0gZmllbGRfb3JfbWV0aG9kX2F0KHdoaWNoLCB1bmNhY2hlZCk7CiAgIHJldHVybiBleHRyYWN0X2xvd19zaG9ydF9mcm9tX2ludChyZWZfaW5kZXgpOwogfQogCiAKKworaW50IGNvbnN0YW50UG9vbE9vcERlc2M6Om1hcF9pbnN0cnVjdGlvbl9vcGVyYW5kX3RvX2luZGV4KGludCBvcGVyYW5kKSB7CisgIGlmIChjb25zdGFudFBvb2xDYWNoZU9vcERlc2M6OmlzX3NlY29uZGFyeV9pbmRleChvcGVyYW5kKSkgeworICAgIHJldHVybiBjYWNoZSgpLT5tYWluX2VudHJ5X2F0KG9wZXJhbmQpLT5jb25zdGFudF9wb29sX2luZGV4KCk7CisgIH0KKyAgYXNzZXJ0KChpbnQpKHUyKW9wZXJhbmQgPT0gb3BlcmFuZCwgImNsZWFuIHUyIik7CisgIGludCBpbmRleCA9IEJ5dGVzOjpzd2FwX3UyKG9wZXJhbmQpOworICByZXR1cm4gY2FjaGUoKS0+ZW50cnlfYXQoaW5kZXgpLT5jb25zdGFudF9wb29sX2luZGV4KCk7Cit9CisKKwogdm9pZCBjb25zdGFudFBvb2xPb3BEZXNjOjp2ZXJpZnlfY29uc3RhbnRfcG9vbF9yZXNvbHZlKGNvbnN0YW50UG9vbEhhbmRsZSB0aGlzX29vcCwgS2xhc3NIYW5kbGUgaywgVFJBUFMpIHsKICBpZiAoay0+b29wX2lzX2luc3RhbmNlKCkgfHwgay0+b29wX2lzX29iakFycmF5KCkpIHsKICAgICBpbnN0YW5jZUtsYXNzSGFuZGxlIGhvbGRlciAoVEhSRUFELCB0aGlzX29vcC0+cG9vbF9ob2xkZXIoKSk7CkBAIC0yOTAsMjYgKzI5OSwxNCBAQAogfQogCiAKLWludCBjb25zdGFudFBvb2xPb3BEZXNjOjprbGFzc19yZWZfaW5kZXhfYXQoaW50IHdoaWNoKSB7Ci0gIGppbnQgcmVmX2luZGV4ID0gZmllbGRfb3JfbWV0aG9kX2F0KHdoaWNoLCBmYWxzZSk7CitpbnQgY29uc3RhbnRQb29sT29wRGVzYzo6bmFtZV9yZWZfaW5kZXhfYXQoaW50IHdoaWNoX250KSB7CisgIGppbnQgcmVmX2luZGV4ID0gbmFtZV9hbmRfdHlwZV9hdCh3aGljaF9udCk7CiAgIHJldHVybiBleHRyYWN0X2xvd19zaG9ydF9mcm9tX2ludChyZWZfaW5kZXgpOwogfQogCiAKLWludCBjb25zdGFudFBvb2xPb3BEZXNjOjpuYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpIHsKLSAgamludCByZWZfaW5kZXggPSBmaWVsZF9vcl9tZXRob2RfYXQod2hpY2gsIGZhbHNlKTsKLSAgcmV0dXJuIGV4dHJhY3RfaGlnaF9zaG9ydF9mcm9tX2ludChyZWZfaW5kZXgpOwotfQotCi0KLWludCBjb25zdGFudFBvb2xPb3BEZXNjOjpuYW1lX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpIHsKLSAgamludCByZWZfaW5kZXggPSBuYW1lX2FuZF90eXBlX2F0KHdoaWNoKTsKLSAgcmV0dXJuIGV4dHJhY3RfbG93X3Nob3J0X2Zyb21faW50KHJlZl9pbmRleCk7Ci19Ci0KLQotaW50IGNvbnN0YW50UG9vbE9vcERlc2M6OnNpZ25hdHVyZV9yZWZfaW5kZXhfYXQoaW50IHdoaWNoKSB7Ci0gIGppbnQgcmVmX2luZGV4ID0gbmFtZV9hbmRfdHlwZV9hdCh3aGljaCk7CitpbnQgY29uc3RhbnRQb29sT29wRGVzYzo6c2lnbmF0dXJlX3JlZl9pbmRleF9hdChpbnQgd2hpY2hfbnQpIHsKKyAgamludCByZWZfaW5kZXggPSBuYW1lX2FuZF90eXBlX2F0KHdoaWNoX250KTsKICAgcmV0dXJuIGV4dHJhY3RfaGlnaF9zaG9ydF9mcm9tX2ludChyZWZfaW5kZXgpOwogfQogCkBAIC0zNTMsMjAgKzM1MCw2IEBACiB9CiAKIAotc3ltYm9sT29wIGNvbnN0YW50UG9vbE9vcERlc2M6Om5hbWVfcmVmX2F0KGludCB3aGljaCkgewotICBqaW50IHJlZl9pbmRleCA9IG5hbWVfYW5kX3R5cGVfYXQobmFtZV9hbmRfdHlwZV9yZWZfaW5kZXhfYXQod2hpY2gpKTsKLSAgaW50IG5hbWVfaW5kZXggPSBleHRyYWN0X2xvd19zaG9ydF9mcm9tX2ludChyZWZfaW5kZXgpOwotICByZXR1cm4gc3ltYm9sX2F0KG5hbWVfaW5kZXgpOwotfQotCi0KLXN5bWJvbE9vcCBjb25zdGFudFBvb2xPb3BEZXNjOjpzaWduYXR1cmVfcmVmX2F0KGludCB3aGljaCkgewotICBqaW50IHJlZl9pbmRleCA9IG5hbWVfYW5kX3R5cGVfYXQobmFtZV9hbmRfdHlwZV9yZWZfaW5kZXhfYXQod2hpY2gpKTsKLSAgaW50IHNpZ25hdHVyZV9pbmRleCA9IGV4dHJhY3RfaGlnaF9zaG9ydF9mcm9tX2ludChyZWZfaW5kZXgpOwotICByZXR1cm4gc3ltYm9sX2F0KHNpZ25hdHVyZV9pbmRleCk7Ci19Ci0KLQogQmFzaWNUeXBlIGNvbnN0YW50UG9vbE9vcERlc2M6OmJhc2ljX3R5cGVfZm9yX3NpZ25hdHVyZV9hdChpbnQgd2hpY2gpIHsKICAgcmV0dXJuIEZpZWxkVHlwZTo6YmFzaWNfdHlwZShzeW1ib2xfYXQod2hpY2gpKTsKIH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvY29uc3RhbnRQb29sT29wLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvY29uc3RhbnRQb29sT29wLmhwcAppbmRleCA4Y2NiY2QyLi43MmJlYzY1IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NvbnN0YW50UG9vbE9vcC5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9jb25zdGFudFBvb2xPb3AuaHBwCkBAIC01Myw2ICs1Myw3IEBACiAgIHZvaWQgcmVsZWFzZV90YWdfYXRfcHV0KGludCB3aGljaCwgamJ5dGUgdCkgIHsgdGFncygpLT5yZWxlYXNlX2J5dGVfYXRfcHV0KHdoaWNoLCB0KTsgfQogCiAgIGVudW0gRmxhZ0JpdCB7CisgICAgRkJfaGFzX2ludm9rZWR5bmFtaWMgPSAxLAogICAgIEZCX2hhc19wc2V1ZG9fc3RyaW5nID0gMgogICB9OwogCkBAIC05Niw3ICs5Nyw5IEBACiAgIHR5cGVBcnJheU9vcCB0YWdzKCkgY29uc3QgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF90YWdzOyB9CiAKICAgYm9vbCBoYXNfcHNldWRvX3N0cmluZygpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gZmxhZ19hdChGQl9oYXNfcHNldWRvX3N0cmluZyk7IH0KKyAgYm9vbCBoYXNfaW52b2tlZHluYW1pYygpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gZmxhZ19hdChGQl9oYXNfaW52b2tlZHluYW1pYyk7IH0KICAgdm9pZCBzZXRfcHNldWRvX3N0cmluZygpICAgICAgICAgICAgICAgICAgeyAgICBzZXRfZmxhZ19hdChGQl9oYXNfcHNldWRvX3N0cmluZyk7IH0KKyAgdm9pZCBzZXRfaW52b2tlZHluYW1pYygpICAgICAgICAgICAgICAgICAgeyAgICBzZXRfZmxhZ19hdChGQl9oYXNfaW52b2tlZHluYW1pYyk7IH0KIAogICAvLyBLbGFzcyBob2xkaW5nIHBvb2wKICAga2xhc3NPb3AgcG9vbF9ob2xkZXIoKSBjb25zdCAgICAgICAgICAgICAgeyByZXR1cm4gX3Bvb2xfaG9sZGVyOyB9CkBAIC0zMzgsMjQgKzM0MSwyOCBAQAogICAgIHJldHVybiAqaW50X2F0X2FkZHIod2hpY2gpOwogICB9CiAKLSAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIChrbGFzc19yZWZfYXQsIGtsYXNzX3JlZl9hdF9ub3Jlc29sdmUsIG5hbWVfcmVmX2F0LAotICAvLyBzaWduYXR1cmVfcmVmX2F0LCBrbGFzc19yZWZfaW5kZXhfYXQsIG5hbWVfYW5kX3R5cGVfcmVmX2luZGV4X2F0LAotICAvLyBuYW1lX3JlZl9pbmRleF9hdCwgc2lnbmF0dXJlX3JlZl9pbmRleF9hdCkgYWxsIGV4cGVjdCBjb25zdGFudCBwb29sIGluZGljZXMKKyAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIChuYW1lL3NpZ25hdHVyZS9rbGFzc19yZWZfYXQsIGtsYXNzX3JlZl9hdF9ub3Jlc29sdmUsCisgIC8vIG5hbWVfYW5kX3R5cGVfcmVmX2luZGV4X2F0KSBhbGwgZXhwZWN0IGNvbnN0YW50IHBvb2wgaW5kaWNlcwogICAvLyBmcm9tIHRoZSBieXRlY29kZXMgdG8gYmUgcGFzc2VkIGluLCB3aGljaCBhcmUgYWN0dWFsbHkgcG90ZW50aWFsbHkgYnl0ZS1zd2FwcGVkCi0gIC8vIGNvbnRzdGFudCBwb29sIGNhY2hlIGluZGljZXMuIFNlZSBmaWVsZF9vcl9tZXRob2RfYXQuCisgIC8vIG9yIHJld3JpdHRlbiBjb25zdGFudCBwb29sIGNhY2hlIGluZGljZXMuICBUaGV5IGFsbCBjYWxsIG1hcF9pbnN0cnVjdGlvbl9vcGVyYW5kX3RvX2luZGV4LgorICBpbnQgbWFwX2luc3RydWN0aW9uX29wZXJhbmRfdG9faW5kZXgoaW50IG9wZXJhbmQpOworCisgIC8vIFRoZXJlIGFyZSBhbHNvICJ1bmNhY2hlZCIgdmVyc2lvbnMgd2hpY2ggZG8gbm90IG1hcCB0aGUgb3BlcmFuZCBpbmRleDsgc2VlIGJlbG93LgogCiAgIC8vIExvb2t1cCBmb3IgZW50cmllcyBjb25zaXN0aW5nIG9mIChrbGFzc19pbmRleCwgbmFtZV9hbmRfdHlwZSBpbmRleCkKICAga2xhc3NPb3Aga2xhc3NfcmVmX2F0KGludCB3aGljaCwgVFJBUFMpOwogICBzeW1ib2xPb3Aga2xhc3NfcmVmX2F0X25vcmVzb2x2ZShpbnQgd2hpY2gpOwotICBzeW1ib2xPb3AgbmFtZV9yZWZfYXQoaW50IHdoaWNoKTsKLSAgc3ltYm9sT29wIHNpZ25hdHVyZV9yZWZfYXQoaW50IHdoaWNoKTsgICAgLy8gdGhlIHR5cGUgZGVzY3JpcHRvcgorICBzeW1ib2xPb3AgbmFtZV9yZWZfYXQoaW50IHdoaWNoKSAgICAgICAgICAgICAgICB7IHJldHVybiBpbXBsX25hbWVfcmVmX2F0KHdoaWNoLCBmYWxzZSk7IH0KKyAgc3ltYm9sT29wIHNpZ25hdHVyZV9yZWZfYXQoaW50IHdoaWNoKSAgICAgICAgICAgeyByZXR1cm4gaW1wbF9zaWduYXR1cmVfcmVmX2F0KHdoaWNoLCBmYWxzZSk7IH0KIAotICBpbnQga2xhc3NfcmVmX2luZGV4X2F0KGludCB3aGljaCk7Ci0gIGludCBuYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpOworICBpbnQga2xhc3NfcmVmX2luZGV4X2F0KGludCB3aGljaCkgICAgICAgICAgICAgICB7IHJldHVybiBpbXBsX2tsYXNzX3JlZl9pbmRleF9hdCh3aGljaCwgZmFsc2UpOyB9CisgIGludCBuYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpICAgICAgIHsgcmV0dXJuIGltcGxfbmFtZV9hbmRfdHlwZV9yZWZfaW5kZXhfYXQod2hpY2gsIGZhbHNlKTsgfQogCiAgIC8vIExvb2t1cCBmb3IgZW50cmllcyBjb25zaXN0aW5nIG9mIChuYW1lX2luZGV4LCBzaWduYXR1cmVfaW5kZXgpCi0gIGludCBuYW1lX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpOwotICBpbnQgc2lnbmF0dXJlX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpOworICBpbnQgbmFtZV9yZWZfaW5kZXhfYXQoaW50IHdoaWNoX250KTsgICAgICAgICAgICAvLyA9PSAgbG93LW9yZGVyIGpzaG9ydCBvZiBuYW1lX2FuZF90eXBlX2F0KHdoaWNoX250KQorICBpbnQgc2lnbmF0dXJlX3JlZl9pbmRleF9hdChpbnQgd2hpY2hfbnQpOyAgICAgICAvLyA9PSBoaWdoLW9yZGVyIGpzaG9ydCBvZiBuYW1lX2FuZF90eXBlX2F0KHdoaWNoX250KQorICBzeW1ib2xPb3AgbnRfbmFtZV9yZWZfYXQoaW50IHdoaWNoX250KSAgICAgICAgICB7IHJldHVybiBzeW1ib2xfYXQobmFtZV9yZWZfaW5kZXhfYXQod2hpY2hfbnQpKTsgfQorICBzeW1ib2xPb3AgbnRfc2lnbmF0dXJlX3JlZl9hdChpbnQgd2hpY2hfbnQpICAgICB7IHJldHVybiBzeW1ib2xfYXQoc2lnbmF0dXJlX3JlZl9pbmRleF9hdCh3aGljaF9udCkpOyB9CiAKICAgQmFzaWNUeXBlIGJhc2ljX3R5cGVfZm9yX3NpZ25hdHVyZV9hdChpbnQgd2hpY2gpOwogCkBAIC0zOTcsMTAgKzQwNCwxMCBAQAogICAvLyBSb3V0aW5lcyBjdXJyZW50bHkgdXNlZCBmb3IgYW5ub3RhdGlvbnMgKG9ubHkgY2FsbGVkIGJ5IGp2bS5jcHApIGJ1dCB3aGljaCBtaWdodCBiZSB1c2VkIGluIHRoZQogICAvLyBmdXR1cmUgYnkgb3RoZXIgSmF2YSBjb2RlLiBUaGVzZSB0YWtlIGNvbnN0YW50IHBvb2wgaW5kaWNlcyByYXRoZXIgdGhhbiBwb3NzaWJseS1ieXRlLXN3YXBwZWQKICAgLy8gY29uc3RhbnQgcG9vbCBjYWNoZSBpbmRpY2VzIGFzIGRvIHRoZSBwZWVyIG1ldGhvZHMgYWJvdmUuCi0gIHN5bWJvbE9vcCB1bmNhY2hlZF9uYW1lX3JlZl9hdChpbnQgd2hpY2gpOwotICBzeW1ib2xPb3AgdW5jYWNoZWRfc2lnbmF0dXJlX3JlZl9hdChpbnQgd2hpY2gpOwotICBpbnQgICAgICAgdW5jYWNoZWRfa2xhc3NfcmVmX2luZGV4X2F0KGludCB3aGljaCk7Ci0gIGludCAgICAgICB1bmNhY2hlZF9uYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpOworICBzeW1ib2xPb3AgdW5jYWNoZWRfbmFtZV9yZWZfYXQoaW50IHdoaWNoKSAgICAgICAgICAgICAgICAgeyByZXR1cm4gaW1wbF9uYW1lX3JlZl9hdCh3aGljaCwgdHJ1ZSk7IH0KKyAgc3ltYm9sT29wIHVuY2FjaGVkX3NpZ25hdHVyZV9yZWZfYXQoaW50IHdoaWNoKSAgICAgICAgICAgIHsgcmV0dXJuIGltcGxfc2lnbmF0dXJlX3JlZl9hdCh3aGljaCwgdHJ1ZSk7IH0KKyAgaW50ICAgICAgIHVuY2FjaGVkX2tsYXNzX3JlZl9pbmRleF9hdChpbnQgd2hpY2gpICAgICAgICAgIHsgcmV0dXJuIGltcGxfa2xhc3NfcmVmX2luZGV4X2F0KHdoaWNoLCB0cnVlKTsgfQorICBpbnQgICAgICAgdW5jYWNoZWRfbmFtZV9hbmRfdHlwZV9yZWZfaW5kZXhfYXQoaW50IHdoaWNoKSAgeyByZXR1cm4gaW1wbF9uYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdCh3aGljaCwgdHJ1ZSk7IH0KIAogICAvLyBTaGFyaW5nCiAgIGludCBwcmVfcmVzb2x2ZV9zaGFyZWRfa2xhc3NlcyhUUkFQUyk7CkBAIC00MTMsMTYgKzQyMCwxOSBAQAogCiAgcHJpdmF0ZToKIAorICBzeW1ib2xPb3AgaW1wbF9uYW1lX3JlZl9hdChpbnQgd2hpY2gsIGJvb2wgdW5jYWNoZWQpOworICBzeW1ib2xPb3AgaW1wbF9zaWduYXR1cmVfcmVmX2F0KGludCB3aGljaCwgYm9vbCB1bmNhY2hlZCk7CisgIGludCAgICAgICBpbXBsX2tsYXNzX3JlZl9pbmRleF9hdChpbnQgd2hpY2gsIGJvb2wgdW5jYWNoZWQpOworICBpbnQgICAgICAgaW1wbF9uYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdChpbnQgd2hpY2gsIGJvb2wgdW5jYWNoZWQpOworCiAgIC8vIFRha2VzIGVpdGhlciBhIGNvbnN0YW50IHBvb2wgY2FjaGUgaW5kZXggaW4gcG9zc2libHkgYnl0ZS1zd2FwcGVkCiAgIC8vIGJ5dGUgb3JkZXIgKHdoaWNoIGNvbWVzIGZyb20gdGhlIGJ5dGVjb2RlcyBhZnRlciByZXdyaXRpbmcpIG9yLAogICAvLyBpZiAidW5jYWNoZWQiIGlzIHRydWUsIGEgdmFuaWxsYSBjb25zdGFudCBwb29sIGluZGV4CiAgIGppbnQgZmllbGRfb3JfbWV0aG9kX2F0KGludCB3aGljaCwgYm9vbCB1bmNhY2hlZCkgewotICAgIGludCBpID0gLTE7Ci0gICAgaWYgKHVuY2FjaGVkIHx8IGNhY2hlKCkgPT0gTlVMTCkgewotICAgICAgaSA9IHdoaWNoOwotICAgIH0gZWxzZSB7CisgICAgaW50IGkgPSB3aGljaDsKKyAgICBpZiAoIXVuY2FjaGVkICYmIGNhY2hlKCkgIT0gTlVMTCkgewogICAgICAgLy8gY2hhbmdlIGJ5dGUtb3JkZXJpbmcgYW5kIGdvIHZpYSBjYWNoZQotICAgICAgaSA9IGNhY2hlKCktPmVudHJ5X2F0KEJ5dGVzOjpzd2FwX3UyKHdoaWNoKSktPmNvbnN0YW50X3Bvb2xfaW5kZXgoKTsKKyAgICAgIGkgPSBtYXBfaW5zdHJ1Y3Rpb25fb3BlcmFuZF90b19pbmRleCh3aGljaCk7CiAgICAgfQogICAgIGFzc2VydCh0YWdfYXQoaSkuaXNfZmllbGRfb3JfbWV0aG9kKCksICJDb3JydXB0ZWQgY29uc3RhbnQgcG9vbCIpOwogICAgIHJldHVybiAqaW50X2F0X2FkZHIoaSk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NwQ2FjaGVLbGFzcy5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NwQ2FjaGVLbGFzcy5jcHAKaW5kZXggMDI4YTljOS4uNWE4NWU4OCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9jcENhY2hlS2xhc3MuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvY3BDYWNoZUtsYXNzLmNwcApAQCAtMTY5LDExICsxNjksNDcgQEAKIHZvaWQgY29uc3RhbnRQb29sQ2FjaGVLbGFzczo6b29wX2NvcHlfY29udGVudHMoUFNQcm9tb3Rpb25NYW5hZ2VyKiBwbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb29wIG9iaikgewogICBhc3NlcnQob2JqLT5pc19jb25zdGFudFBvb2xDYWNoZSgpLCAic2hvdWxkIGJlIGNvbnN0YW50IHBvb2wiKTsKKyAgaWYgKEVuYWJsZUludm9rZUR5bmFtaWMpIHsKKyAgICBjb25zdGFudFBvb2xDYWNoZU9vcCBjYWNoZSA9IChjb25zdGFudFBvb2xDYWNoZU9vcClvYmo7CisgICAgLy8gZHVyaW5nIGEgc2NhdmVuZ2UsIGl0IGlzIHNhZmUgdG8gaW5zcGVjdCBteSBwb29sLCBzaW5jZSBpdCBpcyBwZXJtCisgICAgY29uc3RhbnRQb29sT29wIHBvb2wgPSBjYWNoZS0+Y29uc3RhbnRfcG9vbCgpOworICAgIGFzc2VydChwb29sLT5pc19jb25zdGFudFBvb2woKSwgInNob3VsZCBiZSBjb25zdGFudCBwb29sIik7CisgICAgaWYgKHBvb2wtPmhhc19pbnZva2VkeW5hbWljKCkpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUtPmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeSogZSA9IGNhY2hlLT5lbnRyeV9hdChpKTsKKyAgICAgICAgb29wKiBwID0gKG9vcCopJmUtPl9mMTsKKyAgICAgICAgaWYgKGUtPmlzX3NlY29uZGFyeV9lbnRyeSgpKSB7CisgICAgICAgICAgaWYgKFBTU2NhdmVuZ2U6OnNob3VsZF9zY2F2ZW5nZShwKSkKKyAgICAgICAgICAgIHBtLT5jbGFpbV9vcl9mb3J3YXJkX2JyZWFkdGgocCk7CisgICAgICAgICAgYXNzZXJ0KCEoZS0+aXNfdmZpbmFsKCkgJiYgUFNTY2F2ZW5nZTo6c2hvdWxkX3NjYXZlbmdlKChvb3AqKSZlLT5fZjIpKSwKKyAgICAgICAgICAgICAgICAgIm5vIGxpdmUgb29wcyBoZXJlIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAogdm9pZCBjb25zdGFudFBvb2xDYWNoZUtsYXNzOjpvb3BfcHVzaF9jb250ZW50cyhQU1Byb21vdGlvbk1hbmFnZXIqIHBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb3Agb2JqKSB7CiAgIGFzc2VydChvYmotPmlzX2NvbnN0YW50UG9vbENhY2hlKCksICJzaG91bGQgYmUgY29uc3RhbnQgcG9vbCIpOworICBpZiAoRW5hYmxlSW52b2tlRHluYW1pYykgeworICAgIGNvbnN0YW50UG9vbENhY2hlT29wIGNhY2hlID0gKGNvbnN0YW50UG9vbENhY2hlT29wKW9iajsKKyAgICAvLyBkdXJpbmcgYSBzY2F2ZW5nZSwgaXQgaXMgc2FmZSB0byBpbnNwZWN0IG15IHBvb2wsIHNpbmNlIGl0IGlzIHBlcm0KKyAgICBjb25zdGFudFBvb2xPb3AgcG9vbCA9IGNhY2hlLT5jb25zdGFudF9wb29sKCk7CisgICAgYXNzZXJ0KHBvb2wtPmlzX2NvbnN0YW50UG9vbCgpLCAic2hvdWxkIGJlIGNvbnN0YW50IHBvb2wiKTsKKyAgICBpZiAocG9vbC0+aGFzX2ludm9rZWR5bmFtaWMoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZS0+bGVuZ3RoKCk7IGkrKykgeworICAgICAgICBDb25zdGFudFBvb2xDYWNoZUVudHJ5KiBlID0gY2FjaGUtPmVudHJ5X2F0KGkpOworICAgICAgICBvb3AqIHAgPSAob29wKikmZS0+X2YxOworICAgICAgICBpZiAoZS0+aXNfc2Vjb25kYXJ5X2VudHJ5KCkpIHsKKyAgICAgICAgICBpZiAoUFNTY2F2ZW5nZTo6c2hvdWxkX3NjYXZlbmdlKHApKQorICAgICAgICAgICAgcG0tPmNsYWltX29yX2ZvcndhcmRfZGVwdGgocCk7CisgICAgICAgICAgYXNzZXJ0KCEoZS0+aXNfdmZpbmFsKCkgJiYgUFNTY2F2ZW5nZTo6c2hvdWxkX3NjYXZlbmdlKChvb3AqKSZlLT5fZjIpKSwKKyAgICAgICAgICAgICAgICAgIm5vIGxpdmUgb29wcyBoZXJlIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAogaW50CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NwQ2FjaGVPb3AuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9jcENhY2hlT29wLmNwcAppbmRleCAxMzU2Nzc1Li41NWFhNmQ5IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NwQ2FjaGVPb3AuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvY3BDYWNoZU9vcC5jcHAKQEAgLTI5LDggKzI5LDE4IEBACiAvLyBJbXBsZW1lbXRhdGlvbiBvZiBDb25zdGFudFBvb2xDYWNoZUVudHJ5CiAKIHZvaWQgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeTo6c2V0X2luaXRpYWxfc3RhdGUoaW50IGluZGV4KSB7Ci0gIGFzc2VydCgwIDw9IGluZGV4ICYmIGluZGV4IDwgMHgxMDAwMCwgInNhbml0eSBjaGVjayIpOworICBpZiAoY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjppc19zZWNvbmRhcnlfaW5kZXgoaW5kZXgpKSB7CisgICAgLy8gSGFjazogIFRoZSByZXdyaXRlciBpcyB0cnlpbmcgdG8gc2F5IHRoYXQgdGhpcyBlbnRyeSBpdHNlbGYKKyAgICAvLyB3aWxsIGJlIGEgc2Vjb25kYXJ5IGVudHJ5LgorICAgIGludCBtYWluX2luZGV4ID0gY29uc3RhbnRQb29sQ2FjaGVPb3BEZXNjOjpkZWNvZGVfc2Vjb25kYXJ5X2luZGV4KGluZGV4KTsKKyAgICBhc3NlcnQoMCA8PSBtYWluX2luZGV4ICYmIG1haW5faW5kZXggPCAweDEwMDAwLCAic2FuaXR5IGNoZWNrIik7CisgICAgX2luZGljZXMgPSAobWFpbl9pbmRleCA8PCAxNik7CisgICAgYXNzZXJ0KG1haW5fZW50cnlfaW5kZXgoKSA9PSBtYWluX2luZGV4LCAiIik7CisgICAgcmV0dXJuOworICB9CisgIGFzc2VydCgwIDwgaW5kZXggJiYgaW5kZXggPCAweDEwMDAwLCAic2FuaXR5IGNoZWNrIik7CiAgIF9pbmRpY2VzID0gaW5kZXg7CisgIGFzc2VydChjb25zdGFudF9wb29sX2luZGV4KCkgPT0gaW5kZXgsICIiKTsKIH0KIAogCkBAIC0xMzYsNiArMTQ2LDcgQEAKICAgaW50IGJ5dGVfbm8gPSAtMTsKICAgYm9vbCBuZWVkc192ZmluYWxfZmxhZyA9IGZhbHNlOwogICBzd2l0Y2ggKGludm9rZV9jb2RlKSB7CisgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgogICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDoKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWludGVyZmFjZTogewogICAgICAgICBpZiAobWV0aG9kLT5jYW5fYmVfc3RhdGljYWxseV9ib3VuZCgpKSB7CkBAIC0yMTEsNiArMjIyLDIzIEBACiB9CiAKIAordm9pZCBDb25zdGFudFBvb2xDYWNoZUVudHJ5OjpzZXRfZHluYW1pY19jYWxsKEhhbmRsZSBjYWxsX3NpdGUsIGludCBleHRyYV9kYXRhKSB7CisgIG1ldGhvZE9vcCBtZXRob2QgPSAobWV0aG9kT29wKSBzdW5fZHluX0NhbGxTaXRlSW1wbDo6dm1tZXRob2QoY2FsbF9zaXRlKCkpOworICBhc3NlcnQobWV0aG9kLT5pc19tZXRob2QoKSwgIm11c3QgYmUgaW5pdGlhbGl6ZWQgcHJvcGVybHkiKTsKKyAgaW50IHBhcmFtX3NpemUgPSBtZXRob2QtPnNpemVfb2ZfcGFyYW1ldGVycygpOworICBhc3NlcnQocGFyYW1fc2l6ZSA+IDEsICJtZXRob2QgYXJndW1lbnQgc2l6ZSBtdXN0IGluY2x1ZGUgTUgudGhpcyAmIGluaXRpYWwgZHluYW1pYyByZWNlaXZlciIpOworICBwYXJhbV9zaXplIC09IDE7ICAgICAgICAgICAgICAvLyBkbyBub3QgY291bnQgTUgudGhpczsgaXQgaXMgbm90IHN0YWNrZWQgZm9yIGludm9rZWR5bmFtaWMKKyAgaWYgKEF0b21pYzo6Y21weGNoZ19wdHIoY2FsbF9zaXRlKCksICZfZjEsIE5VTEwpID09IE5VTEwpIHsKKyAgICAvLyByYWNpbmcgdGhyZWFkcyBtaWdodCBiZSB0cnlpbmcgdG8gaW5zdGFsbCB0aGVpciBvd24gZmF2b3JpdGVzCisgICAgc2V0X2YxKGNhbGxfc2l0ZSgpKTsKKyAgfQorICBzZXRfZjIoZXh0cmFfZGF0YSk7CisgIHNldF9mbGFncyhhc19mbGFncyhhc19Ub3NTdGF0ZShtZXRob2QtPnJlc3VsdF90eXBlKCkpLCBtZXRob2QtPmlzX2ZpbmFsX21ldGhvZCgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSB8IHBhcmFtX3NpemUpOworICAvLyBkbyBub3QgZG8gc2V0X2J5dGVjb2RlIG9uIGEgc2Vjb25kYXJ5IENQIGNhY2hlIGVudHJ5CisgIC8vc2V0X2J5dGVjb2RlXzEoQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYyk7Cit9CisKKwogY2xhc3MgTG9jYWxPb3BDbG9zdXJlOiBwdWJsaWMgT29wQ2xvc3VyZSB7CiAgcHJpdmF0ZToKICAgdm9pZCAoKl9mKShvb3AqKTsKQEAgLTM5Miw3ICs0MjAsMTEgQEAKICAgLy8gcHJpbnQgc2VwYXJhdG9yCiAgIGlmIChpbmRleCA9PSAwKSB0dHktPnByaW50X2NyKCIgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0iKTsKICAgLy8gcHJpbnQgZW50cnkKLSAgdHR5LT5wcmludF9jcigiJTNkICAoJTA4eCkgIFslMDJ4fCUwMnh8JTVkXSIsIGluZGV4LCB0aGlzLCBieXRlY29kZV8yKCksIGJ5dGVjb2RlXzEoKSwgY29uc3RhbnRfcG9vbF9pbmRleCgpKTsKKyAgdHR5LT5wcmludF9jcigiJTNkICAoJTA4eCkgICIsIGluZGV4LCB0aGlzKTsKKyAgaWYgKGlzX3NlY29uZGFyeV9lbnRyeSgpKQorICAgIHR0eS0+cHJpbnRfY3IoIlslNWR8c2Vjb25kYXJ5XSIsIG1haW5fZW50cnlfaW5kZXgoKSk7CisgIGVsc2UKKyAgICB0dHktPnByaW50X2NyKCJbJTAyeHwlMDJ4fCU1ZF0iLCBieXRlY29kZV8yKCksIGJ5dGVjb2RlXzEoKSwgY29uc3RhbnRfcG9vbF9pbmRleCgpKTsKICAgdHR5LT5wcmludF9jcigiICAgICAgICAgICAgICAgICBbICAgJTA4eF0iLCAoYWRkcmVzcykob29wKV9mMSk7CiAgIHR0eS0+cHJpbnRfY3IoIiAgICAgICAgICAgICAgICAgWyAgICUwOHhdIiwgX2YyKTsKICAgdHR5LT5wcmludF9jcigiICAgICAgICAgICAgICAgICBbICAgJTA4eF0iLCBfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9jcENhY2hlT29wLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvY3BDYWNoZU9vcC5ocHAKaW5kZXggYzA5ZDdjNC4uZWMyNWI4NyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9jcENhY2hlT29wLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2NwQ2FjaGVPb3AuaHBwCkBAIC04OSw2ICs4OSw3IEBACiAvLyBfZjEgICAgICA9IG1ldGhvZCBmb3IgYWxsIGJ1dCB2aXJ0dWFsIGNhbGxzLCB1bnVzZWQgYnkgdmlydHVhbCBjYWxscwogLy8gICAgICAgICAgICAobm90ZTogZm9yIGludGVyZmFjZSBjYWxscywgd2hpY2ggYXJlIGVzc2VudGlhbGx5IHZpcnR1YWwsCiAvLyAgICAgICAgICAgICBjb250YWlucyBrbGFzc09vcCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlLgorLy8gICAgICAgICAgICBmb3IgaW52b2tlZHluYW1pYywgZjEgY29udGFpbnMgdGhlIENhbGxTaXRlIG9iamVjdCBmb3IgdGhlIGludm9jYXRpb24KIC8vIF9mMiAgICAgID0gbWV0aG9kL3Z0YWJsZSBpbmRleCBmb3IgdmlydHVhbCBjYWxscyBvbmx5LCB1bnVzZWQgYnkgYWxsIG90aGVyCiAvLyAgICAgICAgICAgIGNhbGxzLiAgVGhlIHZmIGZsYWcgaW5kaWNhdGVzIHRoaXMgaXMgYSBtZXRob2QgcG9pbnRlciBub3QgYW4KIC8vICAgICAgICAgICAgaW5kZXguCkBAIC0xMDgsNiArMTA5LDggQEAKIAogY2xhc3MgQ29uc3RhbnRQb29sQ2FjaGVFbnRyeSBWQUxVRV9PQkpfQ0xBU1NfU1BFQyB7CiAgIGZyaWVuZCBjbGFzcyBWTVN0cnVjdHM7CisgIGZyaWVuZCBjbGFzcyBjb25zdGFudFBvb2xDYWNoZUtsYXNzOworCiAgcHJpdmF0ZToKICAgdm9sYXRpbGUgaW50eCAgICAgX2luZGljZXM7ICAvLyBjb25zdGFudCBwb29sIGluZGV4ICYgcmV3cml0ZSBieXRlY29kZXMKICAgdm9sYXRpbGUgb29wICAgICAgX2YxOyAgICAgICAvLyBlbnRyeSBzcGVjaWZpYyBvb3AgZmllbGQKQEAgLTE3NSw2ICsxNzgsMTEgQEAKICAgICBpbnQgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZXRob2QgaW5kZXggaW50byBpbnRlcmZhY2UKICAgKTsKIAorICB2b2lkIHNldF9keW5hbWljX2NhbGwoCisgICAgSGFuZGxlIGNhbGxfc2l0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZWQgamF2YS5keW4uQ2FsbFNpdGUgKGYxKQorICAgIGludCBleHRyYV9kYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmMikKKyAgKTsKKwogICB2b2lkIHNldF9wYXJhbWV0ZXJfc2l6ZShpbnQgdmFsdWUpIHsKICAgICBhc3NlcnQocGFyYW1ldGVyX3NpemUoKSA9PSAwIHx8IHBhcmFtZXRlcl9zaXplKCkgPT0gdmFsdWUsCiAgICAgICAgICAgICJzaXplIG11c3Qgbm90IGNoYW5nZSIpOwpAQCAtMjE2LDcgKzIyNCwxMSBAQAogICB9CiAKICAgLy8gQWNjZXNzb3JzCi0gIGludCBjb25zdGFudF9wb29sX2luZGV4KCkgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gX2luZGljZXMgJiAweEZGRkY7IH0KKyAgYm9vbCBpc19zZWNvbmRhcnlfZW50cnkoKSBjb25zdCAgICAgICAgICAgICAgICB7IHJldHVybiAoX2luZGljZXMgJiAweEZGRkYpID09IDA7IH0KKyAgaW50IGNvbnN0YW50X3Bvb2xfaW5kZXgoKSBjb25zdCAgICAgICAgICAgICAgICB7IGFzc2VydCgoX2luZGljZXMgJiAweEZGRkYpICE9IDAsICJtdXN0IGJlIG1haW4gZW50cnkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2luZGljZXMgJiAweEZGRkYpOyB9CisgIGludCBtYWluX2VudHJ5X2luZGV4KCkgY29uc3QgICAgICAgICAgICAgICAgICAgeyBhc3NlcnQoKF9pbmRpY2VzICYgMHhGRkZGKSA9PSAwLCAibXVzdCBiZSBzZWNvbmRhcnkgZW50cnkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKHVpbnR4KV9pbmRpY2VzID4+IDE2KTsgfQogICBCeXRlY29kZXM6OkNvZGUgYnl0ZWNvZGVfMSgpIGNvbnN0ICAgICAgICAgICAgIHsgcmV0dXJuIEJ5dGVjb2Rlczo6Y2FzdCgoX2luZGljZXMgPj4gMTYpICYgMHhGRik7IH0KICAgQnl0ZWNvZGVzOjpDb2RlIGJ5dGVjb2RlXzIoKSBjb25zdCAgICAgICAgICAgICB7IHJldHVybiBCeXRlY29kZXM6OmNhc3QoKF9pbmRpY2VzID4+IDI0KSAmIDB4RkYpOyB9CiAgIHZvbGF0aWxlIG9vcCAgZjEoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gX2YxOyB9CkBAIC0zMTQsMTAgKzMyNiwzMCBAQAogICAvLyBJbml0aWFsaXphdGlvbgogICB2b2lkIGluaXRpYWxpemUoaW50QXJyYXkmIGludmVyc2VfaW5kZXhfbWFwKTsKIAorICAvLyBTZWNvbmRhcnkgaW5kZXhlcy4KKyAgLy8gVGhleSBtdXN0IGxvb2sgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSBub3JtYWwgaW5kZXhlcy4KKyAgLy8gVGhlIG1haW4gcmVhc29uIGlzIHRoYXQgYnl0ZSBzd2FwcGluZyBpcyBzb21ldGltZXMgZG9uZSBvbiBub3JtYWwgaW5kZXhlcy4KKyAgLy8gQWxzbywgaXQgaXMgaGVscGZ1bCBmb3IgZGVidWdnaW5nIHRvIHRlbGwgdGhlIHR3byBhcGFydC4KKyAgc3RhdGljIGJvb2wgaXNfc2Vjb25kYXJ5X2luZGV4KGludCBpKSB7IHJldHVybiAoaSA8IDApOyB9CisgIHN0YXRpYyBpbnQgIGRlY29kZV9zZWNvbmRhcnlfaW5kZXgoaW50IGkpIHsgYXNzZXJ0KGlzX3NlY29uZGFyeV9pbmRleChpKSwgICIiKTsgcmV0dXJuIH5pOyB9CisgIHN0YXRpYyBpbnQgIGVuY29kZV9zZWNvbmRhcnlfaW5kZXgoaW50IGkpIHsgYXNzZXJ0KCFpc19zZWNvbmRhcnlfaW5kZXgoaSksICIiKTsgcmV0dXJuIH5pOyB9CisKICAgLy8gQWNjZXNzb3JzCiAgIHZvaWQgc2V0X2NvbnN0YW50X3Bvb2woY29uc3RhbnRQb29sT29wIHBvb2wpICAgeyBvb3Bfc3RvcmVfd2l0aG91dF9jaGVjaygob29wKikmX2NvbnN0YW50X3Bvb2wsIChvb3ApcG9vbCk7IH0KICAgY29uc3RhbnRQb29sT29wIGNvbnN0YW50X3Bvb2woKSBjb25zdCAgICAgICAgICB7IHJldHVybiBfY29uc3RhbnRfcG9vbDsgfQogICBDb25zdGFudFBvb2xDYWNoZUVudHJ5KiBlbnRyeV9hdChpbnQgaSkgY29uc3QgIHsgYXNzZXJ0KDAgPD0gaSAmJiBpIDwgbGVuZ3RoKCksICJpbmRleCBvdXQgb2YgYm91bmRzIik7IHJldHVybiBiYXNlKCkgKyBpOyB9CisgIENvbnN0YW50UG9vbENhY2hlRW50cnkqIG1haW5fZW50cnlfYXQoaW50IGkpIGNvbnN0IHsKKyAgICBDb25zdGFudFBvb2xDYWNoZUVudHJ5KiBlOworICAgIGlmIChpc19zZWNvbmRhcnlfaW5kZXgoaSkpIHsKKyAgICAgIC8vIHJ1biB0aHJvdWdoIGFuIGV4dHJhIGxldmVsIG9mIGluZGlyZWN0aW9uOgorICAgICAgaSA9IGRlY29kZV9zZWNvbmRhcnlfaW5kZXgoaSk7CisgICAgICBlID0gZW50cnlfYXQoaSk7CisgICAgICBpID0gZS0+bWFpbl9lbnRyeV9pbmRleCgpOworICAgIH0KKyAgICBlID0gZW50cnlfYXQoaSk7CisgICAgYXNzZXJ0KCFlLT5pc19zZWNvbmRhcnlfZW50cnkoKSwgIm9ubHkgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uIik7CisgICAgcmV0dXJuIGU7CisgIH0KIAogICAvLyBHQyBzdXBwb3J0CiAgIC8vIElmIHRoZSBfbGVuZ3RoIGZpZWxkIGhhcyBub3QgYmVlbiBzZXQsIHRoZSBzaXplIG9mIHRoZQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9nZW5lcmF0ZU9vcE1hcC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2dlbmVyYXRlT29wTWFwLmNwcAppbmRleCA1ODI4YTZkLi4zNmU5OGM0IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2dlbmVyYXRlT29wTWFwLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2dlbmVyYXRlT29wTWFwLmNwcApAQCAtMTI1Miw4ICsxMjUyLDkgQEAKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDoKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3BlY2lhbDoKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljOgorICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2U6Ci0gICAgICAgIGludCBpZHggPSBjdXJyZW50QkMtPmdldF9pbmRleF9iaWcoKTsKKyAgICAgICAgaW50IGlkeCA9IGN1cnJlbnRCQy0+Z2V0X2luZGV4X2ludCgpOwogICAgICAgICBjb25zdGFudFBvb2xPb3AgY3AgICAgPSBtZXRob2QoKS0+Y29uc3RhbnRzKCk7CiAgICAgICAgIGludCBuYW1lQW5kVHlwZUlkeCAgICA9IGNwLT5uYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdChpZHgpOwogICAgICAgICBpbnQgc2lnbmF0dXJlSWR4ICAgICAgPSBjcC0+c2lnbmF0dXJlX3JlZl9pbmRleF9hdChuYW1lQW5kVHlwZUlkeCk7CkBAIC0xMjgzLDggKzEyODQsOSBAQAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsOgogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsOgogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWM6CisgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWM6CiAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWludGVyZmFjZToKLSAgICAgICAgaW50IGlkeCA9IGN1cnJlbnRCQy0+Z2V0X2luZGV4X2JpZygpOworICAgICAgICBpbnQgaWR4ID0gY3VycmVudEJDLT5nZXRfaW5kZXhfaW50KCk7CiAgICAgICAgIGNvbnN0YW50UG9vbE9vcCBjcCAgICA9IG1ldGhvZCgpLT5jb25zdGFudHMoKTsKICAgICAgICAgaW50IG5hbWVBbmRUeXBlSWR4ICAgID0gY3AtPm5hbWVfYW5kX3R5cGVfcmVmX2luZGV4X2F0KGlkeCk7CiAgICAgICAgIGludCBzaWduYXR1cmVJZHggICAgICA9IGNwLT5zaWduYXR1cmVfcmVmX2luZGV4X2F0KG5hbWVBbmRUeXBlSWR4KTsKQEAgLTEzMTAsNiArMTMxMiw3IEBACiAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXZpcnR1YWw6CiAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXNwZWNpYWw6CiAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYzoKKyAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYzoKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlaW50ZXJmYWNlOgogICAgICAgICBfaXRyX3NlbmQgPSBpdHI7CiAgICAgICAgIF9yZXBvcnRfcmVzdWx0X2Zvcl9zZW5kID0gdHJ1ZTsKQEAgLTE1NTYsNiArMTU1OSw3IEBACiAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsOgogICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3BlY2lhbDogICAgIGRvX21ldGhvZChmYWxzZSwgZmFsc2UsIGl0ci0+Z2V0X2luZGV4X2JpZygpLCBpdHItPmJjaSgpKTsgYnJlYWs7CiAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWM6ICAgICAgZG9fbWV0aG9kKHRydWUsICBmYWxzZSwgaXRyLT5nZXRfaW5kZXhfYmlnKCksIGl0ci0+YmNpKCkpOyBicmVhazsKKyAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWM6ICAgICBkb19tZXRob2QoZmFsc2UsIHRydWUsICBpdHItPmdldF9pbmRleF9pbnQoKSwgaXRyLT5iY2koKSk7IGJyZWFrOwogICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlaW50ZXJmYWNlOiAgIGRvX21ldGhvZChmYWxzZSwgdHJ1ZSwgIGl0ci0+Z2V0X2luZGV4X2JpZygpLCBpdHItPmJjaSgpKTsgYnJlYWs7CiAgICAgY2FzZSBCeXRlY29kZXM6Ol9uZXdhcnJheToKICAgICBjYXNlIEJ5dGVjb2Rlczo6X2FuZXdhcnJheTogICAgICAgICBwcF9uZXdfcmVmKHZDVFMsIGl0ci0+YmNpKCkpOyBicmVhazsKQEAgLTE4OTksNyArMTkwMyw3IEBACiAgIC8vIERpZyB1cCBzaWduYXR1cmUgZm9yIGZpZWxkIGluIGNvbnN0YW50IHBvb2wKICAgY29uc3RhbnRQb29sT29wIGNwICAgID0gX21ldGhvZC0+Y29uc3RhbnRzKCk7CiAgIGludCBuYW1lQW5kVHlwZUlkeCAgICA9IGNwLT5uYW1lX2FuZF90eXBlX3JlZl9pbmRleF9hdChpZHgpOwotICBpbnQgc2lnbmF0dXJlSWR4ICAgICAgPSBjcC0+c2lnbmF0dXJlX3JlZl9pbmRleF9hdChuYW1lQW5kVHlwZUlkeCk7CisgIGludCBzaWduYXR1cmVJZHggICAgICA9IGNwLT5zaWduYXR1cmVfcmVmX2luZGV4X2F0KG5hbWVBbmRUeXBlSWR4KTsgIC8vIEBAQEBACiAgIHN5bWJvbE9vcCBzaWduYXR1cmUgICA9IGNwLT5zeW1ib2xfYXQoc2lnbmF0dXJlSWR4KTsKIAogICAvLyBQYXJzZSBtZXRob2Qgc2lnbmF0dXJlCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2luc3RhbmNlS2xhc3MuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9pbnN0YW5jZUtsYXNzLmhwcAppbmRleCAzMDgxYzJhLi5jMjEzOTg3IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2luc3RhbmNlS2xhc3MuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvaW5zdGFuY2VLbGFzcy5ocHAKQEAgLTE2Myw2ICsxNjMsOCBAQAogICBrbGFzc09vcCAgICAgICAgX2ltcGxlbWVudG9yc1tpbXBsZW1lbnRvcnNfbGltaXRdOwogICAvLyBHZW5lcmljIHNpZ25hdHVyZSwgb3IgbnVsbCBpZiBub25lLgogICBzeW1ib2xPb3AgICAgICAgX2dlbmVyaWNfc2lnbmF0dXJlOworICAvLyBpbnZva2VkeW5hbWljIGJvb3RzdHJhcCBtZXRob2QgKGEgamF2YS5keW4uTWV0aG9kSGFuZGxlKQorICBvb3AgICAgICAgICAgICAgX2Jvb3RzdHJhcF9tZXRob2Q7CiAgIC8vIEFubm90YXRpb25zIGZvciB0aGlzIGNsYXNzLCBvciBudWxsIGlmIG5vbmUuCiAgIHR5cGVBcnJheU9vcCAgICBfY2xhc3NfYW5ub3RhdGlvbnM7CiAgIC8vIEFubm90YXRpb24gb2JqZWN0cyAoYnl0ZSBhcnJheXMpIGZvciBmaWVsZHMsIG9yIG51bGwgaWYgbm8gYW5ub3RhdGlvbnMuCkBAIC00NjQsNiArNDY2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MiBtZXRob2RfaW5kZXgpICB7IF9lbmNsb3NpbmdfbWV0aG9kX2NsYXNzX2luZGV4ICA9IGNsYXNzX2luZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW5jbG9zaW5nX21ldGhvZF9tZXRob2RfaW5kZXggPSBtZXRob2RfaW5kZXg7IH0KIAorICAvLyBKU1IgMjkyIHN1cHBvcnQKKyAgb29wIGJvb3RzdHJhcF9tZXRob2QoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9ib290c3RyYXBfbWV0aG9kOyB9CisgIHZvaWQgc2V0X2Jvb3RzdHJhcF9tZXRob2Qob29wIG1oKSAgICAgICAgICAgICAgICAgICB7IG9vcF9zdG9yZSgmX2Jvb3RzdHJhcF9tZXRob2QsIG1oKTsgfQorCiAgIC8vIGptZXRob2RJRCBzdXBwb3J0CiAgIHN0YXRpYyBqbWV0aG9kSUQgZ2V0X2ptZXRob2RfaWQoaW5zdGFuY2VLbGFzc0hhbmRsZSBpa19oLCBzaXplX3QgaWRudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG5ld19pZCwgam1ldGhvZElEKiBuZXdfam1ldGhzKTsKQEAgLTc0NCw2ICs3NTAsNyBAQAogICBvb3AqIGFkcl9pbm5lcl9jbGFzc2VzKCkgY29uc3QgICAgIHsgcmV0dXJuIChvb3AqKSZ0aGlzLT5faW5uZXJfY2xhc3Nlczt9CiAgIG9vcCogYWRyX2ltcGxlbWVudG9ycygpIGNvbnN0ICAgICAgeyByZXR1cm4gKG9vcCopJnRoaXMtPl9pbXBsZW1lbnRvcnNbMF07fQogICBvb3AqIGFkcl9nZW5lcmljX3NpZ25hdHVyZSgpIGNvbnN0IHsgcmV0dXJuIChvb3AqKSZ0aGlzLT5fZ2VuZXJpY19zaWduYXR1cmU7fQorICBvb3AqIGFkcl9ib290c3RyYXBfbWV0aG9kKCkgY29uc3QgIHsgcmV0dXJuIChvb3AqKSZ0aGlzLT5fYm9vdHN0cmFwX21ldGhvZDt9CiAgIG9vcCogYWRyX21ldGhvZHNfam1ldGhvZF9pZHMoKSBjb25zdCAgICAgICAgICAgICB7IHJldHVybiAob29wKikmdGhpcy0+X21ldGhvZHNfam1ldGhvZF9pZHM7fQogICBvb3AqIGFkcl9tZXRob2RzX2NhY2hlZF9pdGFibGVfaW5kaWNlcygpIGNvbnN0ICAgeyByZXR1cm4gKG9vcCopJnRoaXMtPl9tZXRob2RzX2NhY2hlZF9pdGFibGVfaW5kaWNlczt9CiAgIG9vcCogYWRyX2NsYXNzX2Fubm90YXRpb25zKCkgY29uc3QgICB7IHJldHVybiAob29wKikmdGhpcy0+X2NsYXNzX2Fubm90YXRpb25zO30KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvaW5zdGFuY2VLbGFzc0tsYXNzLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvaW5zdGFuY2VLbGFzc0tsYXNzLmNwcAppbmRleCAyM2ViZmFiLi5hYWUxYjFiIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2luc3RhbmNlS2xhc3NLbGFzcy5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9pbnN0YW5jZUtsYXNzS2xhc3MuY3BwCkBAIC04NCw2ICs4NCw3IEBACiAgIE1hcmtTd2VlcDo6bWFya19hbmRfcHVzaChpay0+YWRyX2hvc3Rfa2xhc3MoKSk7CiAgIE1hcmtTd2VlcDo6bWFya19hbmRfcHVzaChpay0+YWRyX3NpZ25lcnMoKSk7CiAgIE1hcmtTd2VlcDo6bWFya19hbmRfcHVzaChpay0+YWRyX2dlbmVyaWNfc2lnbmF0dXJlKCkpOworICBNYXJrU3dlZXA6Om1hcmtfYW5kX3B1c2goaWstPmFkcl9ib290c3RyYXBfbWV0aG9kKCkpOwogICBNYXJrU3dlZXA6Om1hcmtfYW5kX3B1c2goaWstPmFkcl9jbGFzc19hbm5vdGF0aW9ucygpKTsKICAgTWFya1N3ZWVwOjptYXJrX2FuZF9wdXNoKGlrLT5hZHJfZmllbGRzX2Fubm90YXRpb25zKCkpOwogICBNYXJrU3dlZXA6Om1hcmtfYW5kX3B1c2goaWstPmFkcl9tZXRob2RzX2Fubm90YXRpb25zKCkpOwpAQCAtMTI0LDYgKzEyNSw3IEBACiAgIFBTUGFyYWxsZWxDb21wYWN0OjptYXJrX2FuZF9wdXNoKGNtLCBpay0+YWRyX2hvc3Rfa2xhc3MoKSk7CiAgIFBTUGFyYWxsZWxDb21wYWN0OjptYXJrX2FuZF9wdXNoKGNtLCBpay0+YWRyX3NpZ25lcnMoKSk7CiAgIFBTUGFyYWxsZWxDb21wYWN0OjptYXJrX2FuZF9wdXNoKGNtLCBpay0+YWRyX2dlbmVyaWNfc2lnbmF0dXJlKCkpOworICBQU1BhcmFsbGVsQ29tcGFjdDo6bWFya19hbmRfcHVzaChjbSwgaWstPmFkcl9ib290c3RyYXBfbWV0aG9kKCkpOwogICBQU1BhcmFsbGVsQ29tcGFjdDo6bWFya19hbmRfcHVzaChjbSwgaWstPmFkcl9jbGFzc19hbm5vdGF0aW9ucygpKTsKICAgUFNQYXJhbGxlbENvbXBhY3Q6Om1hcmtfYW5kX3B1c2goY20sIGlrLT5hZHJfZmllbGRzX2Fubm90YXRpb25zKCkpOwogICBQU1BhcmFsbGVsQ29tcGFjdDo6bWFya19hbmRfcHVzaChjbSwgaWstPmFkcl9tZXRob2RzX2Fubm90YXRpb25zKCkpOwpAQCAtMTcwLDYgKzE3Miw3IEBACiAgICAgYmxrLT5kb19vb3AoJmlrLT5hZHJfaW1wbGVtZW50b3JzKClbaV0pOwogICB9CiAgIGJsay0+ZG9fb29wKGlrLT5hZHJfZ2VuZXJpY19zaWduYXR1cmUoKSk7CisgIGJsay0+ZG9fb29wKGlrLT5hZHJfYm9vdHN0cmFwX21ldGhvZCgpKTsKICAgYmxrLT5kb19vb3AoaWstPmFkcl9jbGFzc19hbm5vdGF0aW9ucygpKTsKICAgYmxrLT5kb19vb3AoaWstPmFkcl9maWVsZHNfYW5ub3RhdGlvbnMoKSk7CiAgIGJsay0+ZG9fb29wKGlrLT5hZHJfbWV0aG9kc19hbm5vdGF0aW9ucygpKTsKQEAgLTIzMCw2ICsyMzMsOCBAQAogICB9CiAgIGFkciA9IGlrLT5hZHJfZ2VuZXJpY19zaWduYXR1cmUoKTsKICAgaWYgKG1yLmNvbnRhaW5zKGFkcikpIGJsay0+ZG9fb29wKGFkcik7CisgIGFkciA9IGlrLT5hZHJfYm9vdHN0cmFwX21ldGhvZCgpOworICBpZiAobXIuY29udGFpbnMoYWRyKSkgYmxrLT5kb19vb3AoYWRyKTsKICAgYWRyID0gaWstPmFkcl9jbGFzc19hbm5vdGF0aW9ucygpOwogICBpZiAobXIuY29udGFpbnMoYWRyKSkgYmxrLT5kb19vb3AoYWRyKTsKICAgYWRyID0gaWstPmFkcl9maWVsZHNfYW5ub3RhdGlvbnMoKTsKQEAgLTI3NCw2ICsyNzksNyBAQAogICAgIE1hcmtTd2VlcDo6YWRqdXN0X3BvaW50ZXIoJmlrLT5hZHJfaW1wbGVtZW50b3JzKClbaV0pOwogICB9CiAgIE1hcmtTd2VlcDo6YWRqdXN0X3BvaW50ZXIoaWstPmFkcl9nZW5lcmljX3NpZ25hdHVyZSgpKTsKKyAgTWFya1N3ZWVwOjphZGp1c3RfcG9pbnRlcihpay0+YWRyX2Jvb3RzdHJhcF9tZXRob2QoKSk7CiAgIE1hcmtTd2VlcDo6YWRqdXN0X3BvaW50ZXIoaWstPmFkcl9jbGFzc19hbm5vdGF0aW9ucygpKTsKICAgTWFya1N3ZWVwOjphZGp1c3RfcG9pbnRlcihpay0+YWRyX2ZpZWxkc19hbm5vdGF0aW9ucygpKTsKICAgTWFya1N3ZWVwOjphZGp1c3RfcG9pbnRlcihpay0+YWRyX21ldGhvZHNfYW5ub3RhdGlvbnMoKSk7CkBAIC00NTQsNiArNDYwLDcgQEAKICAgICBpay0+c2V0X2JyZWFrcG9pbnRzKE5VTEwpOwogICAgIGlrLT5pbml0X3ByZXZpb3VzX3ZlcnNpb25zKCk7CiAgICAgaWstPnNldF9nZW5lcmljX3NpZ25hdHVyZShOVUxMKTsKKyAgICBpay0+c2V0X2Jvb3RzdHJhcF9tZXRob2QoTlVMTCk7CiAgICAgaWstPnJlbGVhc2Vfc2V0X21ldGhvZHNfam1ldGhvZF9pZHMoTlVMTCk7CiAgICAgaWstPnJlbGVhc2Vfc2V0X21ldGhvZHNfY2FjaGVkX2l0YWJsZV9pbmRpY2VzKE5VTEwpOwogICAgIGlrLT5zZXRfY2xhc3NfYW5ub3RhdGlvbnMoTlVMTCk7CkBAIC01NzgsNiArNTg1LDExIEBACiAgICAgfSAvLyBwdncgaXMgY2xlYW5lZCB1cAogICB9IC8vIHJtIGlzIGNsZWFuZWQgdXAKIAorICBpZiAoaWstPmJvb3RzdHJhcF9tZXRob2QoKSAhPSBOVUxMKSB7CisgICAgc3QtPnByaW50KEJVTExFVCJib290c3RyYXAgbWV0aG9kOiAgIik7CisgICAgaWstPmJvb3RzdHJhcF9tZXRob2QoKS0+cHJpbnRfdmFsdWVfb24oc3QpOworICAgIHN0LT5jcigpOworICB9CiAgIGlmIChpay0+Z2VuZXJpY19zaWduYXR1cmUoKSAhPSBOVUxMKSB7CiAgICAgc3QtPnByaW50KEJVTExFVCJnZW5lcmljIHNpZ25hdHVyZTogIik7CiAgICAgaWstPmdlbmVyaWNfc2lnbmF0dXJlKCktPnByaW50X3ZhbHVlX29uKHN0KTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kRGF0YU9vcC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL21ldGhvZERhdGFPb3AuY3BwCmluZGV4IGU5NzUxZTUuLmU2MWRmZmUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kRGF0YU9vcC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9tZXRob2REYXRhT29wLmNwcApAQCAtNDQyLDYgKzQ0Miw4IEBACiAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDoKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2U6CiAgICAgcmV0dXJuIFZpcnR1YWxDYWxsRGF0YTo6c3RhdGljX2NlbGxfY291bnQoKTsKKyAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgorICAgIHJldHVybiBDb3VudGVyRGF0YTo6c3RhdGljX2NlbGxfY291bnQoKTsKICAgY2FzZSBCeXRlY29kZXM6Ol9yZXQ6CiAgICAgcmV0dXJuIFJldERhdGE6OnN0YXRpY19jZWxsX2NvdW50KCk7CiAgIGNhc2UgQnl0ZWNvZGVzOjpfaWZlcToKQEAgLTU3MCw2ICs1NzIsMTEgQEAKICAgICBjZWxsX2NvdW50ID0gVmlydHVhbENhbGxEYXRhOjpzdGF0aWNfY2VsbF9jb3VudCgpOwogICAgIHRhZyA9IERhdGFMYXlvdXQ6OnZpcnR1YWxfY2FsbF9kYXRhX3RhZzsKICAgICBicmVhazsKKyAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgorICAgIC8vICUlJSBzaG91bGQgbWFrZSBhIHR5cGUgcHJvZmlsZSBmb3IgYW55IGludm9rZWR5bmFtaWMgdGhhdCB0YWtlcyBhIHJlZiBhcmd1bWVudAorICAgIGNlbGxfY291bnQgPSBDb3VudGVyRGF0YTo6c3RhdGljX2NlbGxfY291bnQoKTsKKyAgICB0YWcgPSBEYXRhTGF5b3V0Ojpjb3VudGVyX2RhdGFfdGFnOworICAgIGJyZWFrOwogICBjYXNlIEJ5dGVjb2Rlczo6X3JldDoKICAgICBjZWxsX2NvdW50ID0gUmV0RGF0YTo6c3RhdGljX2NlbGxfY291bnQoKTsKICAgICB0YWcgPSBEYXRhTGF5b3V0OjpyZXRfZGF0YV90YWc7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL21ldGhvZE9vcC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL21ldGhvZE9vcC5jcHAKaW5kZXggZmViYzY4Ni4uY2I5Y2RkYSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9tZXRob2RPb3AuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kT29wLmNwcApAQCAtMTYxLDcgKzE2MSw3IEBACiAKIAogaW50IG1ldGhvZE9vcERlc2M6OmJjaV9mcm9tKGFkZHJlc3MgYmNwKSBjb25zdCB7Ci0gIGFzc2VydChpc19uYXRpdmUoKSAmJiBiY3AgPT0gY29kZV9iYXNlKCkgfHwgY29udGFpbnMoYmNwKSwgImJjcCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIG1ldGhvZCIpOworICBhc3NlcnQoaXNfbmF0aXZlKCkgJiYgYmNwID09IGNvZGVfYmFzZSgpIHx8IGNvbnRhaW5zKGJjcCkgfHwgaXNfZXJyb3JfcmVwb3J0ZWQoKSwgImJjcCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIG1ldGhvZCIpOwogICByZXR1cm4gYmNwIC0gY29kZV9iYXNlKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kT29wLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kT29wLmhwcAppbmRleCBkOWM0MTlhLi45YTBhZmE4IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL21ldGhvZE9vcC5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9tZXRob2RPb3AuaHBwCkBAIC01MzQsNyArNTM0LDEwIEBACiAgIG9vcCBtZXRob2RfaGFuZGxlX3R5cGUoKSBjb25zdDsKICAgc3RhdGljIGppbnQqIG1ldGhvZF90eXBlX29mZnNldHNfY2hhaW4oKTsgIC8vIHNlcmllcyBvZiBwb2ludGVyLW9mZnNldHMsIHRlcm1pbmF0ZWQgYnkgLTEKICAgLy8gcHJlc2l6ZSBpbnRlcnByZXRlciBmcmFtZXMgZm9yIGV4dHJhIGludGVycHJldGVyIHN0YWNrIGVudHJpZXMsIGlmIG5lZWRlZAotICBzdGF0aWMgaW50IGV4dHJhX3N0YWNrX2VudHJpZXMoKSB7IHJldHVybiBFbmFibGVNZXRob2RIYW5kbGVzID8gKGludClNZXRob2RIYW5kbGVQdXNoTGltaXQgOiAwOyB9CisgIC8vIG1ldGhvZCBoYW5kbGVzIHdhbnQgdG8gYmUgYWJsZSB0byBwdXNoIGEgZmV3IGV4dHJhIHZhbHVlcyAoZS5nLiwgYSBib3VuZCByZWNlaXZlciksIGFuZAorICAvLyBpbnZva2VkeW5hbWljIHNvbWV0aW1lcyBuZWVkcyB0byBwdXNoIGEgYm9vdHN0cmFwIG1ldGhvZCwgY2FsbCBzaXRlLCBhbmQgYXJnbGlzdCwKKyAgLy8gYWxsIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGEgc3RhY2sgb3ZlcmZsb3cKKyAgc3RhdGljIGludCBleHRyYV9zdGFja19lbnRyaWVzKCkgeyByZXR1cm4gKEVuYWJsZU1ldGhvZEhhbmRsZXMgPyAoaW50KU1ldGhvZEhhbmRsZVB1c2hMaW1pdCA6IDApICsgKEVuYWJsZUludm9rZUR5bmFtaWMgPyAzIDogMCk7IH0KICAgc3RhdGljIGludCBleHRyYV9zdGFja193b3JkcygpOyAgLy8gPSBleHRyYV9zdGFja19lbnRyaWVzKCkgKiBJbnRlcnByZXRlcjo6c3RhY2tFbGVtZW50U2l6ZSgpCiAgIC8vIFJlZGVmaW5lQ2xhc3NlcygpIHN1cHBvcnQ6CiAgIGJvb2wgaXNfb2xkKCkgY29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gYWNjZXNzX2ZsYWdzKCkuaXNfb2xkKCk7IH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vYnVpbGRPb3BNYXAuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9idWlsZE9vcE1hcC5jcHAKaW5kZXggNGE4NjEyNi4uOTQwMWUwMiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9idWlsZE9vcE1hcC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9idWlsZE9vcE1hcC5jcHAKQEAgLTM2Myw2ICszNjMsMjAgQEAKICAgKi8KICNlbmRpZgogCisjaWZkZWYgQVNTRVJUCisgIGZvciggT29wTWFwU3RyZWFtIG9tczEob21hcCwgT29wTWFwVmFsdWU6OmRlcml2ZWRfb29wX3ZhbHVlKTsgIW9tczEuaXNfZG9uZSgpOyBvbXMxLm5leHQoKSkgeworICAgIE9vcE1hcFZhbHVlIG9tdjEgPSBvbXMxLmN1cnJlbnQoKTsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yKCBPb3BNYXBTdHJlYW0gb21zMihvbWFwLE9vcE1hcFZhbHVlOjpvb3BfdmFsdWUpOyAhb21zMi5pc19kb25lKCk7IG9tczIubmV4dCgpKSB7CisgICAgICBpZiggb212MS5jb250ZW50X3JlZygpID09IG9tczIuY3VycmVudCgpLnJlZygpICkgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoIGZvdW5kLCAiZGVyaXZlZCB3aXRoIG5vIGJhc2UgaW4gb29wbWFwIiApOworICB9CisjZW5kaWYKKwogICByZXR1cm4gb21hcDsKIH0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ieXRlY29kZUluZm8uY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ieXRlY29kZUluZm8uY3BwCmluZGV4IGE2NmM4NzMuLjIwZTFmYWYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vYnl0ZWNvZGVJbmZvLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2J5dGVjb2RlSW5mby5jcHAKQEAgLTMyMSw3ICszMjEsNyBAQAogICAgIC8vIHN0cmljdGVyIHRoYW4gY2FsbGVlX2hvbGRlci0+aXNfaW5pdGlhbGl6ZWQoKQogICAgIGNpQnl0ZWNvZGVTdHJlYW0gaXRlcihjYWxsZXJfbWV0aG9kKTsKICAgICBpdGVyLmZvcmNlX2JjaShjYWxsZXJfYmNpKTsKLSAgICBpbnQgaW5kZXggPSBpdGVyLmdldF9pbmRleF9iaWcoKTsKKyAgICBpbnQgaW5kZXggPSBpdGVyLmdldF9pbmRleF9pbnQoKTsKICAgICBpZiggIWNhbGxlcl9tZXRob2QtPmlzX2tsYXNzX2xvYWRlZChpbmRleCwgdHJ1ZSkgKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jaGFpdGluLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY2hhaXRpbi5jcHAKaW5kZXggNGFkMjIwZC4uZWIxNzdjOCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jaGFpdGluLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2NoYWl0aW4uY3BwCkBAIC0xNDIzLDE3ICsxNDIzLDMzIEBACiAgIC8vIHBvaW50ZXJzIGRlcml2ZWQgZnJvbSBOVUxMISAgVGhlc2UgYXJlIGFsd2F5cyBhbG9uZyBwYXRocyB0aGF0CiAgIC8vIGNhbid0IGhhcHBlbiBhdCBydW4tdGltZSBidXQgdGhlIG9wdGltaXplciBjYW5ub3QgZGVkdWNlIGl0IHNvCiAgIC8vIHdlIGhhdmUgdG8gaGFuZGxlIGl0IGdyYWNlZnVsbHkuCisgIGFzc2VydCghZGVyaXZlZC0+Ym90dG9tX3R5cGUoKS0+aXNhX25hcnJvd29vcCgpIHx8CisgICAgICAgICAgZGVyaXZlZC0+Ym90dG9tX3R5cGUoKS0+bWFrZV9wdHIoKS0+aXNfcHRyKCktPl9vZmZzZXQgPT0gMCwgInNhbml0eSIpOwogICBjb25zdCBUeXBlUHRyICp0aiA9IGRlcml2ZWQtPmJvdHRvbV90eXBlKCktPmlzYV9wdHIoKTsKICAgLy8gSWYgaXRzIGFuIE9PUCB3aXRoIGEgbm9uLXplcm8gb2Zmc2V0LCB0aGVuIGl0IGlzIGRlcml2ZWQuCi0gIGlmKCB0ai0+X29mZnNldCA9PSAwICkgeworICBpZiggdGogPT0gTlVMTCB8fCB0ai0+X29mZnNldCA9PSAwICkgewogICAgIGRlcml2ZWRfYmFzZV9tYXBbZGVyaXZlZC0+X2lkeF0gPSBkZXJpdmVkOwogICAgIHJldHVybiBkZXJpdmVkOwogICB9CiAgIC8vIERlcml2ZWQgaXMgTlVMTCtvZmZzZXQ/ICBCYXNlIGlzIE5VTEwhCiAgIGlmKCBkZXJpdmVkLT5pc19Db24oKSApIHsKLSAgICBOb2RlICpiYXNlID0gbmV3IChDLCAxKSBDb25QTm9kZSggVHlwZVB0cjo6TlVMTF9QVFIgKTsKLSAgICB1aW50IG5vX2xpZHggPSAwOyAgLy8gYW4gdW5tYXRjaGVkIGNvbnN0YW50IGluIGRlYnVnIGluZm8gaGFzIG5vIExSRwotICAgIF9uYW1lcy5leHRlbmQoYmFzZS0+X2lkeCwgbm9fbGlkeCk7CisgICAgTm9kZSAqYmFzZSA9IF9tYXRjaGVyLm1hY2hfbnVsbCgpOworICAgIGFzc2VydChiYXNlICE9IE5VTEwsICJzYW5pdHkiKTsKKyAgICBpZiAoYmFzZS0+aW4oMCkgPT0gTlVMTCkgeworICAgICAgLy8gSW5pdGlhbGl6ZSBpdCBvbmNlIGFuZCBtYWtlIGl0IHNoYXJlZDoKKyAgICAgIC8vIHNldCBjb250cm9sIHRvIF9yb290IGFuZCBwbGFjZSBpdCBpbnRvIFN0YXJ0IGJsb2NrCisgICAgICAvLyAod2hlcmUgdG9wKCkgbm9kZSBpcyBwbGFjZWQpLgorICAgICAgYmFzZS0+aW5pdF9yZXEoMCwgX2NmZy5fcm9vdCk7CisgICAgICBCbG9jayAqc3RhcnRiID0gX2NmZy5fYmJzW0MtPnRvcCgpLT5faWR4XTsKKyAgICAgIHN0YXJ0Yi0+X25vZGVzLmluc2VydChzdGFydGItPmZpbmRfbm9kZShDLT50b3AoKSksIGJhc2UgKTsKKyAgICAgIF9jZmcuX2Jicy5tYXAoIGJhc2UtPl9pZHgsIHN0YXJ0YiApOworICAgICAgYXNzZXJ0IChuMmxpZHgoYmFzZSkgPT0gMCwgInNob3VsZCBub3QgaGF2ZSBMUkcgeWV0Iik7CisgICAgfQorICAgIGlmIChuMmxpZHgoYmFzZSkgPT0gMCkgeworICAgICAgbmV3X2xyZyhiYXNlLCBtYXhscmcrKyk7CisgICAgfQorICAgIGFzc2VydChiYXNlLT5pbigwKSA9PSBfY2ZnLl9yb290ICYmCisgICAgICAgICAgIF9jZmcuX2Jic1tiYXNlLT5faWR4XSA9PSBfY2ZnLl9iYnNbQy0+dG9wKCktPl9pZHhdLCAiYmFzZSBOVUxMIHNob3VsZCBiZSBzaGFyZWQiKTsKICAgICBkZXJpdmVkX2Jhc2VfbWFwW2Rlcml2ZWQtPl9pZHhdID0gYmFzZTsKICAgICByZXR1cm4gYmFzZTsKICAgfQpAQCAtMTQ2MCw5ICsxNDc2LDEzIEBACiAgIH0KIAogICAvLyBOb3cgd2Ugc2VlIHdlIG5lZWQgYSBiYXNlLVBoaSBoZXJlIHRvIG1lcmdlIHRoZSBiYXNlcwotICBiYXNlID0gbmV3IChDLCBkZXJpdmVkLT5yZXEoKSkgUGhpTm9kZSggZGVyaXZlZC0+aW4oMCksIGJhc2UtPmJvdHRvbV90eXBlKCkgKTsKLSAgZm9yKCBpID0gMTsgaSA8IGRlcml2ZWQtPnJlcSgpOyBpKysgKQorICBjb25zdCBUeXBlICp0ID0gYmFzZS0+Ym90dG9tX3R5cGUoKTsKKyAgYmFzZSA9IG5ldyAoQywgZGVyaXZlZC0+cmVxKCkpIFBoaU5vZGUoIGRlcml2ZWQtPmluKDApLCB0ICk7CisgIGZvciggaSA9IDE7IGkgPCBkZXJpdmVkLT5yZXEoKTsgaSsrICkgewogICAgIGJhc2UtPmluaXRfcmVxKGksIGZpbmRfYmFzZV9mb3JfZGVyaXZlZChkZXJpdmVkX2Jhc2VfbWFwLCBkZXJpdmVkLT5pbihpKSwgbWF4bHJnKSk7CisgICAgdCA9IHQtPm1lZXQoYmFzZS0+aW4oaSktPmJvdHRvbV90eXBlKCkpOworICB9CisgIGJhc2UtPmFzX1BoaSgpLT5zZXRfdHlwZSh0KTsKIAogICAvLyBTZWFyY2ggdGhlIGN1cnJlbnQgYmxvY2sgZm9yIGFuIGV4aXN0aW5nIGJhc2UtUGhpCiAgIEJsb2NrICpiID0gX2NmZy5fYmJzW2Rlcml2ZWQtPl9pZHhdOwpAQCAtMTU2MCw2ICsxNTgwLDggQEAKICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGJlY2F1c2Ugd2UgYXJlIHN0aWxsIGluIFNTQSBkdXJpbmcgdGhpcyBjYWxsLgogICAgICAgICAgIE5vZGUgKmRlcml2ZWQgPSBscmdzKG5laWdoYm9yKS5fZGVmOwogICAgICAgICAgIGNvbnN0IFR5cGVQdHIgKnRqID0gZGVyaXZlZC0+Ym90dG9tX3R5cGUoKS0+aXNhX3B0cigpOworICAgICAgICAgIGFzc2VydCghZGVyaXZlZC0+Ym90dG9tX3R5cGUoKS0+aXNhX25hcnJvd29vcCgpIHx8CisgICAgICAgICAgICAgICAgICBkZXJpdmVkLT5ib3R0b21fdHlwZSgpLT5tYWtlX3B0cigpLT5pc19wdHIoKS0+X29mZnNldCA9PSAwLCAic2FuaXR5Iik7CiAgICAgICAgICAgLy8gSWYgaXRzIGFuIE9PUCB3aXRoIGEgbm9uLXplcm8gb2Zmc2V0LCB0aGVuIGl0IGlzIGRlcml2ZWQuCiAgICAgICAgICAgaWYoIHRqICYmIHRqLT5fb2Zmc2V0ICE9IDAgJiYgdGotPmlzYV9vb3BfcHRyKCkgKSB7CiAgICAgICAgICAgICBOb2RlICpiYXNlID0gZmluZF9iYXNlX2Zvcl9kZXJpdmVkKCBkZXJpdmVkX2Jhc2VfbWFwLCBkZXJpdmVkLCBtYXhscmcgKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZG9DYWxsLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZG9DYWxsLmNwcAppbmRleCA2NmNiMTNiLi5jYTUzNDQ1IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2RvQ2FsbC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9kb0NhbGwuY3BwCkBAIC0yNDgsNiArMjQ4LDE0IEBACiAgICAgICAgICAgICAgICAgICBob2xkZXJfa2xhc3MpOwogICAgIHJldHVybiB0cnVlOwogICB9CisgIGlmIChkZXN0X21ldGhvZC0+aXNfbWV0aG9kX2hhbmRsZV9pbnZva2UoKQorICAgICAgJiYgaG9sZGVyX2tsYXNzLT5uYW1lKCkgPT0gY2lTeW1ib2w6OmphdmFfZHluX0R5bmFtaWMoKSkgeworICAgIC8vIEZJWE1FOiBOWUkKKyAgICB1bmNvbW1vbl90cmFwKERlb3B0aW1pemF0aW9uOjpSZWFzb25fdW5oYW5kbGVkLAorICAgICAgICAgICAgICAgICAgRGVvcHRpbWl6YXRpb246OkFjdGlvbl9ub25lLAorICAgICAgICAgICAgICAgICAgaG9sZGVyX2tsYXNzKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQogCiAgIGFzc2VydChkZXN0X21ldGhvZC0+d2lsbF9saW5rKG1ldGhvZCgpLT5ob2xkZXIoKSwga2xhc3MsIGJjKCkpLCAiZGVzdF9tZXRob2Q6IHR5cGVmbG93IHJlc3BvbnNpYmlsaXR5Iik7CiAgIHJldHVybiBmYWxzZTsKQEAgLTc0OCw2ICs3NTYsNyBAQAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsOiAgIGluY3JlbWVudF9jb3VudGVyKFNoYXJlZFJ1bnRpbWU6Om5vZl9pbmxpbmVkX2NhbGxzX2FkZHIoKSk7IGJyZWFrOwogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2U6IGluY3JlbWVudF9jb3VudGVyKFNoYXJlZFJ1bnRpbWU6Om5vZl9pbmxpbmVkX2ludGVyZmFjZV9jYWxsc19hZGRyKCkpOyBicmVhazsKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljOgorICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsOiAgIGluY3JlbWVudF9jb3VudGVyKFNoYXJlZFJ1bnRpbWU6Om5vZl9pbmxpbmVkX3N0YXRpY19jYWxsc19hZGRyKCkpOyBicmVhazsKICAgICAgIGRlZmF1bHQ6IGZhdGFsKCJ1bmV4cGVjdGVkIGNhbGwgYnl0ZWNvZGUiKTsKICAgICAgIH0KQEAgLTc1Niw2ICs3NjUsNyBAQAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsOiAgIGluY3JlbWVudF9jb3VudGVyKFNoYXJlZFJ1bnRpbWU6Om5vZl9ub3JtYWxfY2FsbHNfYWRkcigpKTsgYnJlYWs7CiAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWludGVyZmFjZTogaW5jcmVtZW50X2NvdW50ZXIoU2hhcmVkUnVudGltZTo6bm9mX2ludGVyZmFjZV9jYWxsc19hZGRyKCkpOyBicmVhazsKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljOgorICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsOiAgIGluY3JlbWVudF9jb3VudGVyKFNoYXJlZFJ1bnRpbWU6Om5vZl9zdGF0aWNfY2FsbHNfYWRkcigpKTsgYnJlYWs7CiAgICAgICBkZWZhdWx0OiBmYXRhbCgidW5leHBlY3RlZCBjYWxsIGJ5dGVjb2RlIik7CiAgICAgICB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2dyYXBoS2l0LmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZ3JhcGhLaXQuY3BwCmluZGV4IGUyODczMGQuLmRiMjdiYmEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZ3JhcGhLaXQuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZ3JhcGhLaXQuY3BwCkBAIC05NDcsNiArOTQ3LDcgQEAKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsOgogICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXNwZWNpYWw6CiAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljOgorICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZWR5bmFtaWM6CiAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlaW50ZXJmYWNlOgogICAgIHsKICAgICAgIGJvb2wgaXNfc3RhdGljID0gKGRlcHRoID09IDApOwpAQCAtMjk3OSw2ICsyOTgwLDcgQEAKIC8vIFNlZSBjb21tZW50cyBvbiBuZXdfaW5zdGFuY2UgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSBvdGhlciBhcmd1bWVudHMuCiBOb2RlKiBHcmFwaEtpdDo6bmV3X2FycmF5KE5vZGUqIGtsYXNzX25vZGUsICAgICAvLyBhcnJheSBrbGFzcyAobWF5YmUgdmFyaWFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUqIGxlbmd0aCwgICAgICAgICAvLyBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbmFyZ3MsICAgICAgICAgIC8vIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHVzaCBiYWNrIGZvciB1bmNvbW1vbiB0cmFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmF3X21lbV9vbmx5LCAgICAvLyBhZmZlY3Qgb25seSByYXcgbWVtb3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUqICpyZXR1cm5fc2l6ZV92YWwpIHsKICAgamludCAgbGF5b3V0X2NvbiA9IEtsYXNzOjpfbGhfbmV1dHJhbF92YWx1ZTsKQEAgLTI5OTQsNiArMjk5Niw3IEBACiAgICAgTm9kZSogY21wX2xoID0gX2d2bi50cmFuc2Zvcm0oIG5ldyhDLCAzKSBDbXBJTm9kZShsYXlvdXRfdmFsLCBpbnRjb24obGF5b3V0X2NvbikpICk7CiAgICAgTm9kZSogYm9sX2xoID0gX2d2bi50cmFuc2Zvcm0oIG5ldyhDLCAyKSBCb29sTm9kZShjbXBfbGgsIEJvb2xUZXN0OjplcSkgKTsKICAgICB7IEJ1aWxkQ3V0b3V0IHVubGVzcyh0aGlzLCBib2xfbGgsIFBST0JfTUFYKTsKKyAgICAgIF9zcCArPSBuYXJnczsKICAgICAgIHVuY29tbW9uX3RyYXAoRGVvcHRpbWl6YXRpb246OlJlYXNvbl9jbGFzc19jaGVjaywKICAgICAgICAgICAgICAgICAgICAgRGVvcHRpbWl6YXRpb246OkFjdGlvbl9tYXliZV9yZWNvbXBpbGUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZ3JhcGhLaXQuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ncmFwaEtpdC5ocHAKaW5kZXggNzQ0NWFhMi4uZjQ3YmM0OSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ncmFwaEtpdC5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ncmFwaEtpdC5ocHAKQEAgLTY5OSw3ICs2OTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgTm9kZSogc2xvd190ZXN0ID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmF3X21lbV9vbmx5ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICBOb2RlKiAqcmV0dXJuX3NpemVfdmFsID0gTlVMTCk7Ci0gIE5vZGUqIG5ld19hcnJheShOb2RlKiBrbGFzc19ub2RlLCBOb2RlKiBjb3VudF92YWwsCisgIE5vZGUqIG5ld19hcnJheShOb2RlKiBrbGFzc19ub2RlLCBOb2RlKiBjb3VudF92YWwsIGludCBuYXJncywKICAgICAgICAgICAgICAgICAgIGJvb2wgcmF3X21lbV9vbmx5ID0gZmFsc2UsIE5vZGUqICpyZXR1cm5fc2l6ZV92YWwgPSBOVUxMKTsKIAogICAvLyBIYW5keSBmb3IgbWFraW5nIGNvbnRyb2wgZmxvdwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9saWJyYXJ5X2NhbGwuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9saWJyYXJ5X2NhbGwuY3BwCmluZGV4IGE1NzMzM2YuLmM1MTM0NGQgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbGlicmFyeV9jYWxsLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2xpYnJhcnlfY2FsbC5jcHAKQEAgLTMwNTUsOSArMzA1NSw3IEBACiAgICAgLy8gTm9ybWFsIGNhc2U6ICBUaGUgYXJyYXkgdHlwZSBoYXMgYmVlbiBjYWNoZWQgaW4gdGhlIGphdmEubGFuZy5DbGFzcy4KICAgICAvLyBUaGUgZm9sbG93aW5nIGNhbGwgd29ya3MgZmluZSBldmVuIGlmIHRoZSBhcnJheSB0eXBlIGlzIHBvbHltb3JwaGljLgogICAgIC8vIEl0IGNvdWxkIGJlIGEgZHluYW1pYyBtaXggb2YgaW50W10sIGJvb2xlYW5bXSwgT2JqZWN0W10sIGV0Yy4KLSAgICBfc3AgKz0gbmFyZ3M7ICAvLyBzZXQgb3JpZ2luYWwgc3RhY2sgZm9yIHVzZSBieSB1bmNvbW1vbl90cmFwCi0gICAgTm9kZSogb2JqID0gbmV3X2FycmF5KGtsYXNzX25vZGUsIGNvdW50X3ZhbCk7Ci0gICAgX3NwIC09IG5hcmdzOworICAgIE5vZGUqIG9iaiA9IG5ld19hcnJheShrbGFzc19ub2RlLCBjb3VudF92YWwsIG5hcmdzKTsKICAgICByZXN1bHRfcmVnLT5pbml0X3JlcShfbm9ybWFsX3BhdGgsIGNvbnRyb2woKSk7CiAgICAgcmVzdWx0X3ZhbC0+aW5pdF9yZXEoX25vcm1hbF9wYXRoLCBvYmopOwogICAgIHJlc3VsdF9pbyAtPmluaXRfcmVxKF9ub3JtYWxfcGF0aCwgaV9vKCkpOwpAQCAtMzE3OSw5ICszMTc3LDcgQEAKICAgICBOb2RlKiBvcmlnX3RhaWwgPSBfZ3ZuLnRyYW5zZm9ybSggbmV3KEMsIDMpIFN1YklOb2RlKG9yaWdfbGVuZ3RoLCBzdGFydCkgKTsKICAgICBOb2RlKiBtb3ZlZCA9IGdlbmVyYXRlX21pbl9tYXgodm1JbnRyaW5zaWNzOjpfbWluLCBvcmlnX3RhaWwsIGxlbmd0aCk7CiAKLSAgICBfc3AgKz0gbmFyZ3M7ICAvLyBzZXQgb3JpZ2luYWwgc3RhY2sgZm9yIHVzZSBieSB1bmNvbW1vbl90cmFwCi0gICAgTm9kZSogbmV3Y29weSA9IG5ld19hcnJheShrbGFzc19ub2RlLCBsZW5ndGgpOwotICAgIF9zcCAtPSBuYXJnczsKKyAgICBOb2RlKiBuZXdjb3B5ID0gbmV3X2FycmF5KGtsYXNzX25vZGUsIGxlbmd0aCwgbmFyZ3MpOwogCiAgICAgLy8gR2VuZXJhdGUgYSBkaXJlY3QgY2FsbCB0byB0aGUgcmlnaHQgYXJyYXljb3B5IGZ1bmN0aW9uKHMpLgogICAgIC8vIFdlIGtub3cgdGhlIGNvcHkgaXMgZGlzam9pbnQgYnV0IHdlIG1pZ2h0IG5vdCBrbm93IGlmIHRoZQpAQCAtMzkwMywxMCArMzg5OSw4IEBACiAgICAgc2V0X2NvbnRyb2woYXJyYXlfY3RsKTsKICAgICBOb2RlKiBvYmpfbGVuZ3RoID0gbG9hZF9hcnJheV9sZW5ndGgob2JqKTsKICAgICBOb2RlKiBvYmpfc2l6ZSA9IE5VTEw7Ci0gICAgX3NwICs9IG5hcmdzOyAgLy8gc2V0IG9yaWdpbmFsIHN0YWNrIGZvciB1c2UgYnkgdW5jb21tb25fdHJhcAotICAgIE5vZGUqIGFsbG9jX29iaiA9IG5ld19hcnJheShvYmpfa2xhc3MsIG9ial9sZW5ndGgsCisgICAgTm9kZSogYWxsb2Nfb2JqID0gbmV3X2FycmF5KG9ial9rbGFzcywgb2JqX2xlbmd0aCwgbmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19tZW1fb25seSwgJm9ial9zaXplKTsKLSAgICBfc3AgLT0gbmFyZ3M7CiAgICAgYXNzZXJ0KG9ial9zaXplICE9IE5VTEwsICIiKTsKICAgICBOb2RlKiByYXdfb2JqID0gYWxsb2Nfb2JqLT5pbigxKTsKICAgICBhc3NlcnQocmF3X29iai0+aXNfUHJvaigpICYmIHJhd19vYmotPmluKDApLT5pc19BbGxvY2F0ZSgpLCAiIik7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL21hdGNoZXIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9tYXRjaGVyLmNwcAppbmRleCBlMjMwNDgwLi4yNzIzYTMyIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL21hdGNoZXIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbWF0Y2hlci5jcHAKQEAgLTI3NSw2ICsyNzUsMTIgQEAKIAogICBDLT5wcmludF9tZXRob2QoIkJlZm9yZSBNYXRjaGluZyIpOwogCisgIC8vIENyZWF0ZSBuZXcgaWRlYWwgbm9kZSBDb25QICNOVUxMIGV2ZW4gaWYgaXQgZG9lcyBleGlzdCBpbiBvbGQgc3BhY2UKKyAgLy8gdG8gYXZvaWQgZmFsc2Ugc2hhcmluZyBpZiB0aGUgY29ycmVzcG9uZGluZyBtYWNoIG5vZGUgaXMgbm90IHVzZWQuCisgIC8vIFRoZSBjb3JyZXNwb25kaW5nIG1hY2ggbm9kZSBpcyBvbmx5IHVzZWQgaW4gcmFyZSBjYXNlcyBmb3IgZGVyaXZlZAorICAvLyBwb2ludGVycy4KKyAgTm9kZSogbmV3X2lkZWFsX251bGwgPSBDb25Ob2RlOjptYWtlKEMsIFR5cGVQdHI6Ok5VTExfUFRSKTsKKwogICAvLyBTd2FwIG91dCB0byBvbGQtc3BhY2U7IGVtcHR5aW5nIG5ldy1zcGFjZQogICBBcmVuYSAqb2xkID0gQy0+bm9kZV9hcmVuYSgpLT5tb3ZlX2NvbnRlbnRzKEMtPm9sZF9hcmVuYSgpKTsKIApAQCAtMzE2LDcgKzMyMiwxNiBAQAogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIC8vIEdlbmVyYXRlIG5ldyBtYWNoIG5vZGUgZm9yIENvblAgI05VTEwKKyAgICAgIGFzc2VydChuZXdfaWRlYWxfbnVsbCAhPSBOVUxMLCAic2FuaXR5Iik7CisgICAgICBfbWFjaF9udWxsID0gbWF0Y2hfdHJlZShuZXdfaWRlYWxfbnVsbCk7CisgICAgICAvLyBEb24ndCBzZXQgY29udHJvbCwgaXQgd2lsbCBjb25mdXNlIEdDTSBzaW5jZSB0aGVyZSBhcmUgbm8gdXNlcy4KKyAgICAgIC8vIFRoZSBjb250cm9sIHdpbGwgYmUgc2V0IHdoZW4gdGhpcyBub2RlIGlzIHVzZWQgZmlyc3QgdGltZQorICAgICAgLy8gaW4gZmluZF9iYXNlX2Zvcl9kZXJpdmVkKCkuCisgICAgICBhc3NlcnQoX21hY2hfbnVsbCAhPSBOVUxMLCAiIik7CisKICAgICAgIEMtPnNldF9yb290KHhyb290LT5pc19Sb290KCkgPyB4cm9vdC0+YXNfUm9vdCgpIDogTlVMTCk7CisKICNpZmRlZiBBU1NFUlQKICAgICAgIHZlcmlmeV9uZXdfbm9kZXNfb25seSh4cm9vdCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbWF0Y2hlci5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL21hdGNoZXIuaHBwCmluZGV4IGEwNDJjMDQuLjlmNzlkYzMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbWF0Y2hlci5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9tYXRjaGVyLmhwcApAQCAtMTA5LDYgKzEwOSw5IEBACiAgIE5vZGUqIF9tZW1fbm9kZTsgICAvLyBJZGVhbCBtZW1vcnkgbm9kZSBjb25zdW1lZCBieSBtYWNoIG5vZGUKICNlbmRpZgogCisgIC8vIE1hY2ggbm9kZSBmb3IgQ29uUCAjTlVMTAorICBNYWNoTm9kZSogX21hY2hfbnVsbDsKKwogcHVibGljOgogICBpbnQgTGFiZWxSb290RGVwdGg7CiAgIHN0YXRpYyBjb25zdCBpbnQgYmFzZTJyZWdbXTsgICAgICAgIC8vIE1hcCBUeXBlcyB0byBtYWNoaW5lIHJlZ2lzdGVyIHR5cGVzCkBAIC0xMjIsNiArMTI1LDggQEAKICAgc3RhdGljIFJlZ01hc2sgbXJlZzJyZWdtYXNrW107CiAgIHN0YXRpYyBSZWdNYXNrIFNUQUNLX09OTFlfbWFzazsKIAorICBNYWNoTm9kZSogbWFjaF9udWxsKCkgY29uc3QgeyByZXR1cm4gX21hY2hfbnVsbDsgfQorCiAgIGJvb2wgICAgaXNfc2hhcmVkKCBOb2RlICpuICkgeyByZXR1cm4gX3NoYXJlZC50ZXN0KG4tPl9pZHgpICE9IDA7IH0KICAgdm9pZCAgIHNldF9zaGFyZWQoIE5vZGUgKm4gKSB7ICBfc2hhcmVkLnNldChuLT5faWR4KTsgfQogICBib29sICAgaXNfdmlzaXRlZCggTm9kZSAqbiApIHsgcmV0dXJuIF92aXNpdGVkLnRlc3Qobi0+X2lkeCkgIT0gMDsgfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9wYXJzZS5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlLmhwcAppbmRleCBlMDBkZmNhLi43MTIwYzUxIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlLmhwcApAQCAtNDc2LDcgKzQ3Niw3IEBACiAgIHZvaWQgZG9fbmV3YXJyYXkoQmFzaWNUeXBlIGVsZW10eXBlKTsKICAgdm9pZCBkb19hbmV3YXJyYXkoKTsKICAgdm9pZCBkb19tdWx0aWFuZXdhcnJheSgpOwotICBOb2RlKiBleHBhbmRfbXVsdGlhbmV3YXJyYXkoY2lBcnJheUtsYXNzKiBhcnJheV9rbGFzcywgTm9kZSogKmxlbmd0aHMsIGludCBuZGltZW5zaW9ucyk7CisgIE5vZGUqIGV4cGFuZF9tdWx0aWFuZXdhcnJheShjaUFycmF5S2xhc3MqIGFycmF5X2tsYXNzLCBOb2RlKiAqbGVuZ3RocywgaW50IG5kaW1lbnNpb25zLCBpbnQgbmFyZ3MpOwogCiAgIC8vIGltcGxlbWVudGF0aW9uIG9mIGpzci9yZXQKICAgdm9pZCBkb19qc3IoKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcGFyc2UxLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcGFyc2UxLmNwcAppbmRleCBkYTk1MzdlLi5hN2Y0MDA3IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlMS5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9wYXJzZTEuY3BwCkBAIC04MjgsNiArODI4LDcgQEAKICAgICBicmVhazsKIAogICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYzoKKyAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgogICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXNwZWNpYWw6CiAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDoKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2U6CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlMi5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlMi5jcHAKaW5kZXggMjAxZmZhZC4uNjRjZDliZCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9wYXJzZTIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcGFyc2UyLmNwcApAQCAtMjE1Niw2ICsyMTU2LDcgQEAKICAgICBicmVhazsKIAogICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYzoKKyAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgogICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXNwZWNpYWw6CiAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDoKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2U6CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlMy5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlMy5jcHAKaW5kZXggMmE2MDNkZS4uYjNlOTVhZCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9wYXJzZTMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcGFyc2UzLmNwcApAQCAtMzM1LDcgKzMzNSw3IEBACiAKICAgY29uc3QgVHlwZUtsYXNzUHRyKiBhcnJheV9rbGFzc190eXBlID0gVHlwZUtsYXNzUHRyOjptYWtlKGFycmF5X2tsYXNzKTsKICAgTm9kZSogY291bnRfdmFsID0gcG9wKCk7Ci0gIE5vZGUqIG9iaiA9IG5ld19hcnJheShtYWtlY29uKGFycmF5X2tsYXNzX3R5cGUpLCBjb3VudF92YWwpOworICBOb2RlKiBvYmogPSBuZXdfYXJyYXkobWFrZWNvbihhcnJheV9rbGFzc190eXBlKSwgY291bnRfdmFsLCAxKTsKICAgcHVzaChvYmopOwogfQogCkBAIC0zNDUsMTcgKzM0NSwxNyBAQAogCiAgIE5vZGUqICAgY291bnRfdmFsID0gcG9wKCk7CiAgIGNvbnN0IFR5cGVLbGFzc1B0ciogYXJyYXlfa2xhc3MgPSBUeXBlS2xhc3NQdHI6Om1ha2UoY2lUeXBlQXJyYXlLbGFzczo6bWFrZShlbGVtX3R5cGUpKTsKLSAgTm9kZSogICBvYmogPSBuZXdfYXJyYXkobWFrZWNvbihhcnJheV9rbGFzcyksIGNvdW50X3ZhbCk7CisgIE5vZGUqICAgb2JqID0gbmV3X2FycmF5KG1ha2Vjb24oYXJyYXlfa2xhc3MpLCBjb3VudF92YWwsIDEpOwogICAvLyBQdXNoIHJlc3VsdGFudCBvb3Agb250byBzdGFjawogICBwdXNoKG9iaik7CiB9CiAKIC8vIEV4cGFuZCBzaW1wbGUgZXhwcmVzc2lvbnMgbGlrZSBuZXcgaW50WzNdWzVdIGFuZCBuZXcgT2JqZWN0WzJdW25vbkNvbkxlbl0uCiAvLyBBbHNvIGhhbmRsZSB0aGUgZGVnZW5lcmF0ZSAxLWRpbWVuc2lvbmFsIGNhc2Ugb2YgYW5ld2FycmF5LgotTm9kZSogUGFyc2U6OmV4cGFuZF9tdWx0aWFuZXdhcnJheShjaUFycmF5S2xhc3MqIGFycmF5X2tsYXNzLCBOb2RlKiAqbGVuZ3RocywgaW50IG5kaW1lbnNpb25zKSB7CitOb2RlKiBQYXJzZTo6ZXhwYW5kX211bHRpYW5ld2FycmF5KGNpQXJyYXlLbGFzcyogYXJyYXlfa2xhc3MsIE5vZGUqICpsZW5ndGhzLCBpbnQgbmRpbWVuc2lvbnMsIGludCBuYXJncykgewogICBOb2RlKiBsZW5ndGggPSBsZW5ndGhzWzBdOwogICBhc3NlcnQobGVuZ3RoICE9IE5VTEwsICIiKTsKLSAgTm9kZSogYXJyYXkgPSBuZXdfYXJyYXkobWFrZWNvbihUeXBlS2xhc3NQdHI6Om1ha2UoYXJyYXlfa2xhc3MpKSwgbGVuZ3RoKTsKKyAgTm9kZSogYXJyYXkgPSBuZXdfYXJyYXkobWFrZWNvbihUeXBlS2xhc3NQdHI6Om1ha2UoYXJyYXlfa2xhc3MpKSwgbGVuZ3RoLCBuYXJncyk7CiAgIGlmIChuZGltZW5zaW9ucyA+IDEpIHsKICAgICBqaW50IGxlbmd0aF9jb24gPSBmaW5kX2ludF9jb24obGVuZ3RoLCAtMSk7CiAgICAgZ3VhcmFudGVlKGxlbmd0aF9jb24gPj0gMCwgIm5vbi1jb25zdGFudCBtdWx0aWFuZXdhcnJheSIpOwpAQCAtMzY0LDcgKzM2NCw3IEBACiAgICAgY29uc3QgVHlwZSogICAgZWxlbXR5cGUgPSBfZ3ZuLnR5cGUoYXJyYXkpLT5pc19hcnlwdHIoKS0+ZWxlbSgpOwogICAgIGNvbnN0IGludHB0cl90IGhlYWRlciAgID0gYXJyYXlPb3BEZXNjOjpiYXNlX29mZnNldF9pbl9ieXRlcyhUX09CSkVDVCk7CiAgICAgZm9yIChqaW50IGkgPSAwOyBpIDwgbGVuZ3RoX2NvbjsgaSsrKSB7Ci0gICAgICBOb2RlKiAgICBlbGVtICAgPSBleHBhbmRfbXVsdGlhbmV3YXJyYXkoYXJyYXlfa2xhc3NfMSwgJmxlbmd0aHNbMV0sIG5kaW1lbnNpb25zLTEpOworICAgICAgTm9kZSogICAgZWxlbSAgID0gZXhwYW5kX211bHRpYW5ld2FycmF5KGFycmF5X2tsYXNzXzEsICZsZW5ndGhzWzFdLCBuZGltZW5zaW9ucy0xLCBuYXJncyk7CiAgICAgICBpbnRwdHJfdCBvZmZzZXQgPSBoZWFkZXIgKyAoKGludHB0cl90KWkgPDwgTG9nQnl0ZXNQZXJIZWFwT29wKTsKICAgICAgIE5vZGUqICAgIGVhZGRyICA9IGJhc2ljX3BsdXNfYWRyKGFycmF5LCBvZmZzZXQpOwogICAgICAgc3RvcmVfb29wX3RvX2FycmF5KGNvbnRyb2woKSwgYXJyYXksIGVhZGRyLCBhZHJfdHlwZSwgZWxlbSwgZWxlbXR5cGUsIFRfT0JKRUNUKTsKQEAgLTQxOSw3ICs0MTksNyBAQAogICAvLyBDYW4gdXNlIG11bHRpYW5ld2FycmF5IGluc3RlYWQgb2YgW2FdbmV3YXJyYXkgaWYgb25seSBvbmUgZGltZW5zaW9uLAogICAvLyBvciBpZiBhbGwgbm9uLWZpbmFsIGRpbWVuc2lvbnMgYXJlIHNtYWxsIGNvbnN0YW50cy4KICAgaWYgKGV4cGFuZF9jb3VudCA9PSAxIHx8ICgxIDw9IGV4cGFuZF9jb3VudCAmJiBleHBhbmRfY291bnQgPD0gZXhwYW5kX2xpbWl0KSkgewotICAgIE5vZGUqIG9iaiA9IGV4cGFuZF9tdWx0aWFuZXdhcnJheShhcnJheV9rbGFzcywgJmxlbmd0aFswXSwgbmRpbWVuc2lvbnMpOworICAgIE5vZGUqIG9iaiA9IGV4cGFuZF9tdWx0aWFuZXdhcnJheShhcnJheV9rbGFzcywgJmxlbmd0aFswXSwgbmRpbWVuc2lvbnMsIG5kaW1lbnNpb25zKTsKICAgICBwdXNoKG9iaik7CiAgICAgcmV0dXJuOwogICB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BhcnNlSGVscGVyLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcGFyc2VIZWxwZXIuY3BwCmluZGV4IGI1NTUzY2IuLjdlODdkNzcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcGFyc2VIZWxwZXIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcGFyc2VIZWxwZXIuY3BwCkBAIC00MTQsNiArNDE0LDcgQEAKICAgICBwcm9maWxlX3JlY2VpdmVyX3R5cGUocmVjZWl2ZXIpOwogICAgIGJyZWFrOwogICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYzoKKyAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljOgogICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXNwZWNpYWw6CiAgICAgYnJlYWs7CiAgIGRlZmF1bHQ6IGZhdGFsKCJ1bmV4cGVjdGVkIGNhbGwgYnl0ZWNvZGUiKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL2p2bS5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy9qdm0uY3BwCmluZGV4IDgxODBhODUuLjgzMzNiZTMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL2p2bS5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcHJpbXMvanZtLmNwcApAQCAtMjIyMiw2ICsyMjIyLDkgQEAKICAgICBjYXNlIEpWTV9DT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWY6CiAgICAgY2FzZSBKVk1fQ09OU1RBTlRfTWV0aG9kcmVmOgogICAgICAgcmV0dXJuIGNwLT51bmNhY2hlZF9uYW1lX3JlZl9hdChjcF9pbmRleCktPmFzX3V0ZjgoKTsKKyAgICBjYXNlIEpWTV9DT05TVEFOVF9OYW1lQW5kVHlwZToKKyAgICAgIC8vIGZvciBpbnZva2VkeW5hbWljCisgICAgICByZXR1cm4gY3AtPm50X25hbWVfcmVmX2F0KGNwX2luZGV4KS0+YXNfdXRmOCgpOwogICAgIGRlZmF1bHQ6CiAgICAgICBmYXRhbCgiSlZNX0dldENQTWV0aG9kTmFtZVVURjogaWxsZWdhbCBjb25zdGFudCIpOwogICB9CkBAIC0yMjM5LDYgKzIyNDIsOSBAQAogICAgIGNhc2UgSlZNX0NPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZjoKICAgICBjYXNlIEpWTV9DT05TVEFOVF9NZXRob2RyZWY6CiAgICAgICByZXR1cm4gY3AtPnVuY2FjaGVkX3NpZ25hdHVyZV9yZWZfYXQoY3BfaW5kZXgpLT5hc191dGY4KCk7CisgICAgY2FzZSBKVk1fQ09OU1RBTlRfTmFtZUFuZFR5cGU6CisgICAgICAvLyBmb3IgaW52b2tlZHluYW1pYworICAgICAgcmV0dXJuIGNwLT5udF9zaWduYXR1cmVfcmVmX2F0KGNwX2luZGV4KS0+YXNfdXRmOCgpOwogICAgIGRlZmF1bHQ6CiAgICAgICBmYXRhbCgiSlZNX0dldENQTWV0aG9kU2lnbmF0dXJlVVRGOiBpbGxlZ2FsIGNvbnN0YW50Iik7CiAgIH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL2p2bXRpQ2xhc3NGaWxlUmVjb25zdGl0dXRlci5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy9qdm10aUNsYXNzRmlsZVJlY29uc3RpdHV0ZXIuY3BwCmluZGV4IDJhZDZkOTkuLjQ0N2RjYjIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL2p2bXRpQ2xhc3NGaWxlUmVjb25zdGl0dXRlci5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcHJpbXMvanZtdGlDbGFzc0ZpbGVSZWNvbnN0aXR1dGVyLmNwcApAQCAtNjU5LDE1ICs2NTksMjEgQEAKICAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbCAgIDogIC8vIGZhbGwgdGhyb3VnaAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsICAgOiAgLy8gZmFsbCB0aHJvdWdoCiAgICAgICBjYXNlIEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYyAgICA6ICAvLyBmYWxsIHRocm91Z2gKKyAgICAgIGNhc2UgQnl0ZWNvZGVzOjpfaW52b2tlZHluYW1pYyAgIDogIC8vIGZhbGwgdGhyb3VnaAogICAgICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2UgOgogICAgICAgICBhc3NlcnQobGVuID09IDMgfHwgKGNvZGUgPT0gQnl0ZWNvZGVzOjpfaW52b2tlaW50ZXJmYWNlICYmIGxlbiA9PTUpLAogICAgICAgICAgICAgICAgInNhbml0eSBjaGVjayIpOworICAgICAgICBpbnQgY3BjaSA9IEJ5dGVzOjpnZXRfbmF0aXZlX3UyKGJjcCsxKTsKKyAgICAgICAgYm9vbCBpc19pbnZva2VkeW5hbWljID0gKEVuYWJsZUludm9rZUR5bmFtaWMgJiYgY29kZSA9PSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljKTsKKyAgICAgICAgaWYgKGlzX2ludm9rZWR5bmFtaWMpCisgICAgICAgICAgY3BjaSA9IEJ5dGVzOjpnZXRfbmF0aXZlX3U0KGJjcCsxKTsKICAgICAgICAgLy8gY2FjaGUgY2Fubm90IGJlIHByZS1mZXRjaGVkIHNpbmNlIHNvbWUgY2xhc3NlcyB3b24ndCBoYXZlIGl0IHlldAogICAgICAgICBDb25zdGFudFBvb2xDYWNoZUVudHJ5KiBlbnRyeSA9Ci0gICAgICAgICAgbWgtPmNvbnN0YW50cygpLT5jYWNoZSgpLT5lbnRyeV9hdChCeXRlczo6Z2V0X25hdGl2ZV91MihiY3ArMSkpOworICAgICAgICAgIG1oLT5jb25zdGFudHMoKS0+Y2FjaGUoKS0+bWFpbl9lbnRyeV9hdChjcGNpKTsKICAgICAgICAgaW50IGkgPSBlbnRyeS0+Y29uc3RhbnRfcG9vbF9pbmRleCgpOwogICAgICAgICBhc3NlcnQoaSA8IG1oLT5jb25zdGFudHMoKS0+bGVuZ3RoKCksICJzYW5pdHkgY2hlY2siKTsKICAgICAgICAgQnl0ZXM6OnB1dF9KYXZhX3UyKChhZGRyZXNzKShwKzEpLCAodTIpaSk7ICAgICAvLyBqYXZhIGJ5dGUgb3JkZXJpbmcKKyAgICAgICAgaWYgKGlzX2ludm9rZWR5bmFtaWMpICAqKHArMykgPSAqKHArNCkgPSAwOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy9tZXRob2RDb21wYXJhdG9yLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL21ldGhvZENvbXBhcmF0b3IuY3BwCmluZGV4IGVkN2ZjMjIuLjQ5NGYwNDggMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL21ldGhvZENvbXBhcmF0b3IuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL21ldGhvZENvbXBhcmF0b3IuY3BwCkBAIC0xNDgsOCArMTQ4LDggQEAKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzcGVjaWFsICAgOiAvLyBmYWxsIHRocm91Z2gKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWMgICAgOiAvLyBmYWxsIHRocm91Z2gKICAgY2FzZSBCeXRlY29kZXM6Ol9pbnZva2VpbnRlcmZhY2UgOiB7Ci0gICAgdTIgY3BjaV9vbGQgPSBfc19vbGQtPmdldF9pbmRleF9iaWcoKTsKLSAgICB1MiBjcGNpX25ldyA9IF9zX25ldy0+Z2V0X2luZGV4X2JpZygpOworICAgIHUyIGNwY2lfb2xkID0gX3Nfb2xkLT5nZXRfaW5kZXhfaW50KCk7CisgICAgdTIgY3BjaV9uZXcgPSBfc19uZXctPmdldF9pbmRleF9pbnQoKTsKICAgICAvLyBDaGVjayBpZiB0aGUgbmFtZXMgb2YgY2xhc3NlcywgZmllbGQvbWV0aG9kIG5hbWVzIGFuZCBzaWduYXR1cmVzIGF0IHRoZXNlIGluZGV4ZXMKICAgICAvLyBhcmUgdGhlIHNhbWUuIEluZGljZXMgd2hpY2ggYXJlIHJlYWxseSBpbnRvIGNvbnN0YW50cG9vbCBjYWNoZSAocmF0aGVyIHRoYW4gY29uc3RhbnQKICAgICAvLyBwb29sIGl0c2VsZikgYXJlIGFjY2VwdGVkIGJ5IHRoZSBjb25zdGFudHBvb2wgcXVlcnkgcm91dGluZXMgYmVsb3cuCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy9tZXRob2RIYW5kbGVzLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL21ldGhvZEhhbmRsZXMuY3BwCmluZGV4IGRlOWQ5N2EuLmYxOTQ2NDQgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL21ldGhvZEhhbmRsZXMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL21ldGhvZEhhbmRsZXMuY3BwCkBAIC0yMjc5LDYgKzIyNzksMTYgQEAKIEpWTV9FTkQKIAogCitKVk1fRU5UUlkodm9pZCwgTUhfbGlua0NhbGxTaXRlKEpOSUVudiAqZW52LCBqb2JqZWN0IGlnY2xzLCBqb2JqZWN0IHNpdGVfamgsIGpvYmplY3QgdGFyZ2V0X2poKSkgeworICAvLyBObyBzcGVjaWFsIGFjdGlvbiByZXF1aXJlZCwgeWV0LgorICBvb3Agc2l0ZV9vb3AgPSBKTklIYW5kbGVzOjpyZXNvbHZlKHNpdGVfamgpOworICBpZiAoc2l0ZV9vb3AgPT0gTlVMTCB8fCBzaXRlX29vcC0+a2xhc3MoKSAhPSBTeXN0ZW1EaWN0aW9uYXJ5OjpDYWxsU2l0ZUltcGxfa2xhc3MoKSkKKyAgICBUSFJPV19NU0codm1TeW1ib2xzOjpqYXZhX2xhbmdfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCksICJjYWxsIHNpdGUiKTsKKyAgc3VuX2R5bl9DYWxsU2l0ZUltcGw6OnNldF90YXJnZXQoc2l0ZV9vb3AsIEpOSUhhbmRsZXM6OnJlc29sdmUodGFyZ2V0X2poKSk7Cit9CitKVk1fRU5ECisKKwogLy8vIEpWTV9SZWdpc3Rlck1ldGhvZEhhbmRsZU1ldGhvZHMKIAogI2RlZmluZSBBRFIgIkoiCkBAIC0yMjk3LDYgKzIzMDcsNyBAQAogI2RlZmluZSBBTUggICBJRFlOIkFkYXB0ZXJNZXRob2RIYW5kbGU7IgogI2RlZmluZSBCTUggICBJRFlOIkJvdW5kTWV0aG9kSGFuZGxlOyIKICNkZWZpbmUgRE1IICAgSURZTiJEaXJlY3RNZXRob2RIYW5kbGU7IgorI2RlZmluZSBDU1RJICBJRFlOIkNhbGxTaXRlSW1wbDsiCiAKICNkZWZpbmUgQ0MgKGNoYXIqKSAgLypjYXN0IGEgbGl0ZXJhbCBmcm9tIChjb25zdCBjaGFyKikqLwogI2RlZmluZSBGTl9QVFIoZikgQ0FTVF9GUk9NX0ZOX1BUUih2b2lkKiwgJmYpCkBAIC0yMzIwLDEyICsyMzMxLDE5IEBACiAgIHtDQyJnZXRNZW1iZXJzIiwgICAgICAgICAgICAgIENDIigiQ0xTIiJTVFJHIiJTVFJHIkkiQ0xTIklbIk1FTSIpSSIsICBGTl9QVFIoTUhJX2dldE1lbWJlcnMpfQogfTsKIAorLy8gTW9yZSBlbnRyeSBwb2ludHMgc3BlY2lmaWNhbGx5IGZvciBFbmFibGVJbnZva2VEeW5hbWljLgorc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzMltdID0geworICB7Q0MibGlua0NhbGxTaXRlIiwgICAgICAgICAgICBDQyIoIkNTVEkgTUgiKVYiLCAgICAgICAgICAgICAgIEZOX1BUUihNSF9saW5rQ2FsbFNpdGUpfQorfTsKKwogCiAvLyBUaGlzIG9uZSBmdW5jdGlvbiBpcyBleHBvcnRlZCwgdXNlZCBieSBOYXRpdmVMb29rdXAuCiAKIEpWTV9FTlRSWSh2b2lkLCBKVk1fUmVnaXN0ZXJNZXRob2RIYW5kbGVNZXRob2RzKEpOSUVudiAqZW52LCBqY2xhc3MgTUhOX2NsYXNzKSkgewogICBhc3NlcnQoTWV0aG9kSGFuZGxlczo6c3BvdF9jaGVja19lbnRyeV9uYW1lcygpLCAiZW50cnkgZW51bSBpcyBPSyIpOwogCisgIC8vIG5vdGU6IHRoaXMgZXhwbGljaXQgd2FybmluZy1wcm9kdWNpbmcgc3R1ZmYgd2lsbCBiZSByZXBsYWNlZCBieSBhdXRvLWRldGVjdGlvbiBvZiB0aGUgSlNSIDI5MiBjbGFzc2VzCisKICAgaWYgKCFFbmFibGVNZXRob2RIYW5kbGVzKSB7CiAgICAgd2FybmluZygiSlNSIDI5MiBtZXRob2QgaGFuZGxlcyBhcmUgZGlzYWJsZWQgaW4gdGhpcyBKVk0uICBVc2UgLVhYOitFbmFibGVNZXRob2RIYW5kbGVzIHRvIGVuYWJsZS4iKTsKICAgICByZXR1cm47ICAvLyBiaW5kIG5vdGhpbmcKQEAgLTIzNDMsNSArMjM2MSwyMyBAQAogICAgICAgTWV0aG9kSGFuZGxlczo6c2V0X2VuYWJsZWQodHJ1ZSk7CiAgICAgfQogICB9CisKKyAgaWYgKCFFbmFibGVJbnZva2VEeW5hbWljKSB7CisgICAgd2FybmluZygiSlNSIDI5MiBpbnZva2VkeW5hbWljIGlzIGRpc2FibGVkIGluIHRoaXMgSlZNLiAgVXNlIC1YWDorRW5hYmxlSW52b2tlRHluYW1pYyB0byBlbmFibGUuIik7CisgICAgcmV0dXJuOyAgLy8gYmluZCBub3RoaW5nCisgIH0KKworICB7CisgICAgVGhyZWFkVG9OYXRpdmVGcm9tVk0gdHRuZnYodGhyZWFkKTsKKworICAgIGludCBzdGF0dXMgPSBlbnYtPlJlZ2lzdGVyTmF0aXZlcyhNSE5fY2xhc3MsIG1ldGhvZHMyLCBzaXplb2YobWV0aG9kczIpL3NpemVvZihKTklOYXRpdmVNZXRob2QpKTsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25PY2N1cnJlZCgpKSB7CisgICAgICBNZXRob2RIYW5kbGVzOjpzZXRfZW5hYmxlZChmYWxzZSk7CisgICAgICB3YXJuaW5nKCJKU1IgMjkyIG1ldGhvZCBoYW5kbGUgY29kZSBpcyBtaXNtYXRjaGVkIHRvIHRoaXMgSlZNLiAgRGlzYWJsaW5nIHN1cHBvcnQuIik7CisgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1ldGhvZEhhbmRsZXM6OnNldF9lbmFibGVkKHRydWUpOworICAgIH0KKyAgfQogfQogSlZNX0VORApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9hcmd1bWVudHMuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9hcmd1bWVudHMuY3BwCmluZGV4IGFhMmM4ODMuLmE2MDIxYjEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvYXJndW1lbnRzLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL2FyZ3VtZW50cy5jcHAKQEAgLTI2MjcsNiArMjYyNywxMiBAQAogICB9CiAjZW5kaWYgLy8gUFJPRFVDVAogCisgIGlmIChFbmFibGVJbnZva2VEeW5hbWljICYmICFFbmFibGVNZXRob2RIYW5kbGVzKSB7CisgICAgaWYgKCFGTEFHX0lTX0RFRkFVTFQoRW5hYmxlTWV0aG9kSGFuZGxlcykpIHsKKyAgICAgIHdhcm5pbmcoImZvcmNpbmcgRW5hYmxlTWV0aG9kSGFuZGxlcyB0cnVlIHRvIGFsbG93IEVuYWJsZUludm9rZUR5bmFtaWMiKTsKKyAgICB9CisgICAgRW5hYmxlTWV0aG9kSGFuZGxlcyA9IHRydWU7CisgIH0KICAgaWYgKEVuYWJsZU1ldGhvZEhhbmRsZXMgJiYgIUFub255bW91c0NsYXNzZXMpIHsKICAgICBpZiAoIUZMQUdfSVNfREVGQVVMVChBbm9ueW1vdXNDbGFzc2VzKSkgewogICAgICAgd2FybmluZygiZm9yY2luZyBBbm9ueW1vdXNDbGFzc2VzIHRydWUgdG8gZW5hYmxlIEVuYWJsZU1ldGhvZEhhbmRsZXMiKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvZ2xvYmFscy5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL2dsb2JhbHMuaHBwCmluZGV4IGJjNGRiYzEuLjU0NGE0M2YgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvZ2xvYmFscy5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9nbG9iYWxzLmhwcApAQCAtMzMxNiw2ICszMzE2LDEyIEBACiAgIGRpYWdub3N0aWMoYm9vbCwgT3B0aW1pemVNZXRob2RIYW5kbGVzLCB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICJ3aGVuIGNvbnN0cnVjdGluZyBtZXRob2QgaGFuZGxlcywgdHJ5IHRvIGltcHJvdmUgdGhlbSIpICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHByb2R1Y3QoYm9vbCwgRW5hYmxlSW52b2tlRHluYW1pYywgZmFsc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJyZWNvZ25pemUgdGhlIGludm9rZWR5bmFtaWMgaW5zdHJ1Y3Rpb24iKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRldmVsb3AoYm9vbCwgVHJhY2VJbnZva2VEeW5hbWljLCBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJ0cmFjZSBpbnRlcm5hbCBpbnZva2UgZHluYW1pYyBvcGVyYXRpb25zIikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHByb2R1Y3QoYm9vbCwgVGFnZ2VkU3RhY2tJbnRlcnByZXRlciwgZmFsc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICJJbnNlcnQgdGFncyBpbiBpbnRlcnByZXRlciBleGVjdXRpb24gc3RhY2sgZm9yIG9vcG1hcCBnZW5lcmFpb24iKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS91dGlsaXRpZXMvZ2xvYmFsRGVmaW5pdGlvbnMuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vdXRpbGl0aWVzL2dsb2JhbERlZmluaXRpb25zLmhwcAppbmRleCA1MzZkMWQzLi4zMmVjZDY0IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS91dGlsaXRpZXMvZ2xvYmFsRGVmaW5pdGlvbnMuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3V0aWxpdGllcy9nbG9iYWxEZWZpbml0aW9ucy5ocHAKQEAgLTU3Miw4ICs1NzIsOCBAQAogCiBlbnVtIFRvc1N0YXRlIHsgICAgICAgICAvLyBkZXNjcmliZXMgdGhlIHRvcyBjYWNoZSBjb250ZW50cwogICBidG9zID0gMCwgICAgICAgICAgICAgLy8gYnl0ZSwgYm9vbCB0b3MgY2FjaGVkCi0gIGN0b3MgPSAxLCAgICAgICAgICAgICAvLyBzaG9ydCwgY2hhciB0b3MgY2FjaGVkCi0gIHN0b3MgPSAyLCAgICAgICAgICAgICAvLyBzaG9ydCwgY2hhciB0b3MgY2FjaGVkCisgIGN0b3MgPSAxLCAgICAgICAgICAgICAvLyBjaGFyIHRvcyBjYWNoZWQKKyAgc3RvcyA9IDIsICAgICAgICAgICAgIC8vIHNob3J0IHRvcyBjYWNoZWQKICAgaXRvcyA9IDMsICAgICAgICAgICAgIC8vIGludCB0b3MgY2FjaGVkCiAgIGx0b3MgPSA0LCAgICAgICAgICAgICAvLyBsb25nIHRvcyBjYWNoZWQKICAgZnRvcyA9IDUsICAgICAgICAgICAgIC8vIGZsb2F0IHRvcyBjYWNoZWQKQEAgLTU4OCw3ICs1ODgsNyBAQAogaW5saW5lIFRvc1N0YXRlIGFzX1Rvc1N0YXRlKEJhc2ljVHlwZSB0eXBlKSB7CiAgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgVF9CWVRFICAgOiByZXR1cm4gYnRvczsKLSAgICBjYXNlIFRfQk9PTEVBTjogcmV0dXJuIGJ0b3M7CisgICAgY2FzZSBUX0JPT0xFQU46IHJldHVybiBidG9zOyAvLyBGSVhNRTogQWRkIHp0b3MKICAgICBjYXNlIFRfQ0hBUiAgIDogcmV0dXJuIGN0b3M7CiAgICAgY2FzZSBUX1NIT1JUICA6IHJldHVybiBzdG9zOwogICAgIGNhc2UgVF9JTlQgICAgOiByZXR1cm4gaXRvczsKQEAgLTYwMiw2ICs2MDIsMjIgQEAKICAgcmV0dXJuIGlsZ2w7CiB9CiAKK2lubGluZSBCYXNpY1R5cGUgYXNfQmFzaWNUeXBlKFRvc1N0YXRlIHN0YXRlKSB7CisgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAvL2Nhc2UgenRvczogcmV0dXJuIFRfQk9PTEVBTjsvL0ZJWE1FCisgICAgY2FzZSBidG9zIDogcmV0dXJuIFRfQllURTsKKyAgICBjYXNlIGN0b3MgOiByZXR1cm4gVF9DSEFSOworICAgIGNhc2Ugc3RvcyA6IHJldHVybiBUX1NIT1JUOworICAgIGNhc2UgaXRvcyA6IHJldHVybiBUX0lOVDsKKyAgICBjYXNlIGx0b3MgOiByZXR1cm4gVF9MT05HOworICAgIGNhc2UgZnRvcyA6IHJldHVybiBUX0ZMT0FUOworICAgIGNhc2UgZHRvcyA6IHJldHVybiBUX0RPVUJMRTsKKyAgICBjYXNlIGF0b3MgOiByZXR1cm4gVF9PQkpFQ1Q7CisgICAgY2FzZSB2dG9zIDogcmV0dXJuIFRfVk9JRDsKKyAgfQorICByZXR1cm4gVF9JTExFR0FMOworfQorCiAKIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IEJhc2ljVHlwZSBpbmZvIGludG8gVG9zU3RhdGUKIC8vIE5vdGU6IENhbm5vdCBkZWZpbmUgaGVyZSBhcyBpdCB1c2VzIGdsb2JhbCBjb25zdGFudCBhdCB0aGUgdGltZSBiZWluZy4KZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9jb21waWxlci82NTg5ODM0L1Rlc3RfaWEzMi5qYXZhIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzY1ODk4MzQvVGVzdF9pYTMyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmNDhmMAotLS0gL2Rldi9udWxsCisrKyBiL2hvdHNwb3QvdGVzdC9jb21waWxlci82NTg5ODM0L1Rlc3RfaWEzMi5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoqCisgKiBAdGVzdAorICogQGJ1ZyA2NTg5ODM0CisgKiBAc3VtbWFyeSBkZW9wdGltaXphdGlvbiBwcm9ibGVtIHdpdGggLVhYOitEZW9wdGltaXplQUxvdAorICoKKyAqIEBydW4gbWFpbi9vdGhlcnZtIC1zZXJ2ZXIgVGVzdF9pYTMyCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTk9URTogVGhlIGJ1ZyBzaG93cyB1cCAod2l0aCBzZXZlcmFsICJCdWchIiBtZXNzYWdlKSBldmVuIHdpdGhvdXQgdGhlCisgICAgICBmbGFnIC1YWDorRGVvcHRpbWl6ZUFMb3QuIEluIGEgZGVidWcgYnVpbGQsIHlvdSBtYXkgd2FudCB0byB0cnkKKyAgICAgIHRoZSBmbGFncyAtWFg6K1ZlcmlmeVN0YWNrIGFuZCAtWFg6K0Rlb3B0aW1pemVBTG90IHRvIGdldCBtb3JlIGluZm9ybWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKKworcHVibGljIGNsYXNzIFRlc3RfaWEzMiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBOVU1fVEhSRUFEUyA9IDEwMDsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50IENMT05FX0xFTkdUSCA9IDEwMDA7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFJlZmxlY3RvcltdIHRocmVhZHMgPSBuZXcgUmVmbGVjdG9yW05VTV9USFJFQURTXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0aHJlYWRzW2ldID0gbmV3IFJlZmxlY3RvcigpOworICAgICAgICAgICAgdGhyZWFkc1tpXS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHaXZlIFJlZmxlY3Rvci5ydW4oKSBzb21lIHRpbWUgdG8gY29tcGlsZS4uLiIpOworICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkIFJNSVNlY3VyaXR5RXhjZXB0aW9uIGNhdXNpbmcgcnVuKCkgZGVvcHRpbWl6YXRpb24iKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoImphdmEucm1pLlJNSVNlY3VyaXR5RXhjZXB0aW9uIik7CisKKyAgICAgICAgZm9yIChSZWZsZWN0b3IgdGhyZWFkIDogdGhyZWFkcykKKyAgICAgICAgICAgIHRocmVhZC5yZXF1ZXN0U3RvcCgpOworCisgICAgICAgIGZvciAoUmVmbGVjdG9yIHRocmVhZCA6IHRocmVhZHMpCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRocmVhZC5qb2luKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOworICAgICAgICAgICAgfQorCisgICAgfQorCit9CisKK2NsYXNzIFJlZmxlY3RvciBleHRlbmRzIFRocmVhZCB7CisKKyAgICB2b2xhdGlsZSBib29sZWFuIF9kb1NwaW4gPSB0cnVlOworCisgICAgVGVzdF9pYTMyW10gX3Rlc3RzOworCisgICAgUmVmbGVjdG9yKCkgeworICAgICAgICBfdGVzdHMgPSBuZXcgVGVzdF9pYTMyW1Rlc3RfaWEzMi5DTE9ORV9MRU5HVEhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF90ZXN0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgX3Rlc3RzW2ldID0gbmV3IFRlc3RfaWEzMigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGludCBnKGludCBpMSwgaW50IGkyLCBUZXN0X2lhMzJbXSBhcnIsIGludCBpMywgaW50IGk0KSB7CisKKyAgICAgICAgaWYgKCEoaTE9PTEgJiYgaTI9PTIgJiYgaTM9PTMgJiYgaTQ9PTQpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1ZyEiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhcnIubGVuZ3RoOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZihUZXN0X2lhMzJbXSBhcnIpIHsKKyAgICAgICAgcmV0dXJuIGcoMSwgMiwgYXJyLmNsb25lKCksIDMsIDQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgQ29uc3RydWN0b3JbXSBjdHJzID0gbnVsbDsKKyAgICAgICAgQ2xhc3M8VGVzdF9pYTMyPiBrbGFzcyA9IFRlc3RfaWEzMi5jbGFzczsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN0cnMgPSBrbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChfZG9TcGluKSB7CisgICAgICAgICAgICAgICAgaWYgKGYoX3Rlc3RzKSA8IDApCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmV0dXJuIHZhbHVlIHVzYWdlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhpcyArICIgLSBzdG9wcGVkLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTdG9wKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhpcyArICIgLSBzdG9wIHJlcXVlc3RlZC4iKTsKKyAgICAgICAgX2RvU3BpbiA9IGZhbHNlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4cC8uaGdpZ25vcmUgYi9qYXhwLy5oZ2lnbm9yZQppbmRleCBjYTFiMGIyLi5lY2NkMzlhIDEwMDY0NAotLS0gYS9qYXhwLy5oZ2lnbm9yZQorKysgYi9qYXhwLy5oZ2lnbm9yZQpAQCAtMSwzICsxLDQgQEAKIF5idWlsZC8KIF5kaXN0LworXndlYnJldi8KIF5uYnByb2plY3QvcHJpdmF0ZS8KZGlmZiAtLWdpdCBhL2pheHAvLmhndGFncyBiL2pheHAvLmhndGFncwppbmRleCA1NTU4YzNhLi40MDA3MWM2IDEwMDY0NAotLS0gYS9qYXhwLy5oZ3RhZ3MKKysrIGIvamF4cC8uaGd0YWdzCkBAIC0zMCwzICszMCw0IEBACiBlODgzNzM2NmQzZmQ3MmY3YzdhNDdlYmZkYmQ1MTA2YzE2MTU2ZjEyIGpkazctYjUzCiA5NDZhOWYwYzQ5MzI2MWZhNmEwMTBkYzMzZTYxYjliNTM1YmE4MGMxIGpkazctYjU0CiAwMzk5NDVmYmE2ODNlZTY3NzNhNzIxZTJiZDRlNDQ5ZjYxMzM3NjlhIGpkazctYjU1CitjMTk3YzY4MDEyNzFjNjBmOWM5ZjVkMThmY2M5NWI1OWU3NmRjZDU0IGpkazctYjU2CmRpZmYgLS1naXQgYS9qYXhwL1RISVJEX1BBUlRZX1JFQURNRSBiL2pheHAvVEhJUkRfUEFSVFlfUkVBRE1FCmluZGV4IDlmNGQ3ZTUuLjY5MDg5MDUgMTAwNjQ0Ci0tLSBhL2pheHAvVEhJUkRfUEFSVFlfUkVBRE1FCisrKyBiL2pheHAvVEhJUkRfUEFSVFlfUkVBRE1FCkBAIC02MSw2ICs2MSwyOCBAQAogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIGxpdHRsZWNtcywgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogIAorCitMaXR0bGUgY21zCitDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNCBNYXJ0aSBNYXJpYQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKK3RoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKK3N1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKK2NvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCitDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKK0lOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIHpsaWIgMS4xLjMsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6ICAgCiAKIEFja25vd2xlZGdtZW50czoKQEAgLTExNSwxNiArMTM3LDYgQEAKIFRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy4KIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogVGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbiBBdWd1c3QgMTQgMTk5OCBzbyBhcyB0byBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCBHUEwuIFRoaXMgdmVyc2lvbiBlbnN1cmVzIHRoYXQgVzNDIHNvZnR3YXJlIGxpY2Vuc2luZyB0ZXJtcyBhcmUgbm8gbW9yZSByZXN0cmljdGl2ZSB0aGFuIEdQTCBhbmQgY29uc2VxdWVudGx5IFczQyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgaW4gR1BMIHBhY2thZ2VzLiBTZWUgdGhlIG9sZGVyIGZvcm11bGF0aW9uIGZvciB0aGUgcG9saWN5IHByaW9yIHRvIHRoaXMgZGF0ZS4gUGxlYXNlIHNlZSBvdXIgQ29weXJpZ2h0IEZBUSBmb3IgY29tbW9uIHF1ZXN0aW9ucyBhYm91dCB1c2luZyBtYXRlcmlhbHMgZnJvbSBvdXIgc2l0ZSwgaW5jbHVkaW5nIHNwZWNpZmljIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBwYWNrYWdlcyBsaWtlIGxpYnd3dywgQW1heWEsIGFuZCBKaWdzYXcuIE90aGVyIHF1ZXN0aW9ucyBhYm91dCB0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gc2l0ZS1wb2xpY3lAdzMub3JnLgotoAotJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIGpzY2hlbWUuamFyLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKLVNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50Ci1Db3B5cmlnaHQgqSAxOTk4LTIwMDIgYnkgUGV0ZXIgTm9ydmlnLiAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUsIGluIHNvdXJjZSBvciBvYmplY3QgY29kZSBmb3JtLCBvbiBhbnkgY29tcHV0ZXIgc3lzdGVtLCBhbmQgdG8gbW9kaWZ5LCBjb21waWxlLCBkZWNvbXBpbGUsIHJ1biwgYW5kIHJlZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogCi0xLlRoZSBhdXRob3IgbWFrZXMgbm8gd2FycmFudHkgb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotMi5UaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IG9mIGFueSBraW5kIGZvciBkYW1hZ2VzIG9yIG90aGVyIGNvbnNlcXVlbmNlcyBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgdGhleSBhcmlzZSBmcm9tIGRlZmVjdHMgaW4gdGhlIHNvZnR3YXJlLgotMy5UaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQsIGVpdGhlciBieSBleHBsaWNpdCBjbGFpbSBvciBieSBvbWlzc2lvbi4KLTQuQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIEFsdGVyZWQgdmVyc2lvbnMgbWF5IGJlIGRpc3RyaWJ1dGVkIGluIHBhY2thZ2VzIHVuZGVyIG90aGVyIGxpY2Vuc2VzIChzdWNoIGFzIHRoZSBHTlUgbGljZW5zZSkuIAotSWYgeW91IGZpbmQgdGhpcyBzb2Z0d2FyZSB1c2VmdWwsIGl0IHdvdWxkIGJlIG5pY2UgaWYgeW91IGxldCBtZSAocGV0ZXJAbm9ydmlnLmNvbSkga25vdyBhYm91dCBpdCwgYW5kIG5pY2VyIHN0aWxsIGlmIHlvdSBzZW5kIG1lIG1vZGlmaWNhdGlvbnMgdGhhdCB5b3UgYXJlIHdpbGxpbmcgdG8gc2hhcmUuIEhvd2V2ZXIsIHlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGRvIHNvLgogCiAKICUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBQQy9TQyBMaXRlIGZvciBTdXNlIExpbnV4IHYuIDEuMS4xLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKZGlmZiAtLWdpdCBhL2pheHAvVFJBREVNQVJLIGIvamF4cC9UUkFERU1BUksKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4N2JhZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHAvVFJBREVNQVJLCkBAIC0wLDAgKzEsNDEgQEAKK09wZW5KREsgVHJhZGVtYXJrIE5vdGljZQorVmVyc2lvbiAxLjEsIDIwMDgvMy8xMAorCitPcGVuSkRLICh0aGUgIk5hbWUiKSBpcyBhIHRyYWRlbWFyayBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICh0aGUgIk93bmVyIikuCitPd25lciBwZXJtaXRzIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlICh0aGUgIlNvZnR3YXJlIikKK3doaWNoIGlzIGJhc2VkIG9uIG9yaWdpbmFsIHNvZnR3YXJlIHJldHJpZXZlZCBmcm9tIG9uZSBvZiB0aGUgZm9sbG93aW5nCit3ZWJzaXRlczogaHR0cDovL2Rvd25sb2FkLmphdmEubmV0L29wZW5qZGssIGh0dHA6Ly9oZy5vcGVuamRrLmphdmEubmV0L2pkazYsCitvciBodHRwOi8vb3Blbmpkay5qYXZhLm5ldCAoZWFjaCBhICJXZWJzaXRlIiwgd2l0aCB0aGUgb3JpZ2luYWwgc29mdHdhcmUgbWFkZQorYXZhaWxhYmxlIGJ5IHRoZSBPd25lciBvbiBhIFdlYnNpdGUgYmVpbmcga25vd24gYXMgdGhlICJXZWJzaXRlIFNvZnR3YXJlIikgdG8KK3VzZSB0aGUgTmFtZSBpbiBwYWNrYWdlIG5hbWVzIGFuZCB2ZXJzaW9uIHN0cmluZ3Mgb2YgdGhlIFNvZnR3YXJlIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAtIFRoZSBTb2Z0d2FyZSBpcyBhIHN1YnN0YW50aWFsbHkgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9wZW5KREsKKyAgICBkZXZlbG9wbWVudCBraXQgb3IgcnVudGltZSBlbnZpcm9ubWVudCBjb2RlIG1hZGUgYXZhaWxhYmxlIGJ5IE93bmVyIG9uIGEKKyAgICBXZWJzaXRlLCBhbmQgdGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhlIFNvZnR3YXJlIGNvZGUgaXMgaWRlbnRpY2FsIHRvIHRoZQorICAgIHVwc3RyZWFtIFdlYnNpdGUgU29mdHdhcmU7CisKKyAgLSBObyBwZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSB0aGUgTmFtZSBpbiBhbnkgb3RoZXIgbWFubmVyLAorICAgIHVubGVzcyBzdWNoIHVzZSBjb25zdGl0dXRlcyAiZmFpciB1c2UuIgorCisgIC0gVGhlIE93bmVyIG1ha2VzIG5vIHdhcnJhbnRpZXMgb2YgYW55IGtpbmQgcmVzcGVjdGluZyB0aGUgTmFtZSBhbmQgYWxsCisgICAgcmVwcmVzZW50YXRpb25zIGFuZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcgYW55IGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBtZXJjaGFudGFiaWxpdHksIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQKKyAgICBhcmUgaGVyZWJ5IGRpc2NsYWltZWQ7IGFuZAorCisgIC0gVGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgbGVnZW5kIGFyZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICAgIFNvZnR3YXJlIG9yIHBvcnRpb25zIG9mIGl0OgorCisgICAgICAgIE9wZW5KREsgaXMgYSB0cmFkZW1hcmsgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgU3VuIE1pY3Jvc3lzdGVtcywKKyAgICAgICAgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgb3RoZXIgY291bnRyaWVzLgorCitUaGUgTmFtZSBtYXkgYWxzbyBiZSB1c2VkIGluIGNvbm5lY3Rpb24gd2l0aCBkZXNjcmlwdGlvbnMgb2YgdGhlIFNvZnR3YXJlIHRoYXQKK2NvbnN0aXR1dGUgImZhaXIgdXNlLCIgc3VjaCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBPcGVuSkRLIGNvZGUgYmFzZSIgb3IgImJhc2VkCitvbiB0aGUgT3BlbkpESyBzb3VyY2UgY29kZS4iCisKK093bmVyIGludGVuZHMgdG8gcmV2aXNlIHRoaXMgTm90aWNlIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBtZWV0IHRoZSBuZWVkcyBvZgordGhlIE9wZW5KREsgQ29tbXVuaXR5LiAgUGxlYXNlIHNlbmQgcXVlc3Rpb25zIG9yIGNvbW1lbnRzIGFib3V0IHRoaXMgTm90aWNlIHRvCitTdW4gTWljcm9zeXN0ZW1zIGF0IG9wZW5qZGstdG1Ac3VuLmNvbS4gIFJldmlzaW9ucyB0byB0aGlzIE5vdGljZSB3aWxsIGJlCithbm5vdW5jZWQgb24gdGhlIHB1YmxpYyBtYWlsaW5nIGxpc3QgYW5ub3VuY2VAb3Blbmpkay5qYXZhLm5ldCwgdG8gd2hpY2ggeW91CittYXkgc3Vic2NyaWJlIGJ5IHZpc2l0aW5nIGh0dHA6Ly9tYWlsLm9wZW5qZGsuamF2YS5uZXQuICBUaGUgbGF0ZXN0IHZlcnNpb24gb2YKK3RoaXMgTm90aWNlIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vb3Blbmpkay5qYXZhLm5ldC9sZWdhbC4KZGlmZiAtLWdpdCBhL2pheHAvbWFrZS9qcHJ0LnByb3BlcnRpZXMgYi9qYXhwL21ha2UvanBydC5wcm9wZXJ0aWVzCmluZGV4IDI2ZmZkNjEuLmY3NTg3MWQgMTAwNjQ0Ci0tLSBhL2pheHAvbWFrZS9qcHJ0LnByb3BlcnRpZXMKKysrIGIvamF4cC9tYWtlL2pwcnQucHJvcGVydGllcwpAQCAtMzIsMTMgKzMyLDEzIEBACiBzb2xhcmlzX3NwYXJjdjlfNS4xMCxcCiBzb2xhcmlzX2k1ODZfNS4xMCxcCiBzb2xhcmlzX3g2NF81LjEwLFwKLWxpbnV4X2k1ODYsXAotbGludXhfeDY0LFwKK2xpbnV4X2k1ODZfMi42LFwKK2xpbnV4X3g2NF8yLjYsXAogd2luZG93c19pNTg2LFwKIHdpbmRvd3NfeDY0CiAKICMgVGhlIGRpZmZlcmVudCBidWlsZCBmbGF2b3JzIHdlIHdhbnQKLWpwcnQuYnVpbGQuZmxhdm9ycz1wcm9kdWN0CitqcHJ0LmJ1aWxkLmZsYXZvcnM9cHJvZHVjdCxmYXN0ZGVidWcKIAogIyBFeHBsaWNpdGx5IGRlc2lnbmF0ZSB3aGF0IHRoZSAzMmJpdCBtYXRjaCBpcyBmb3IgdGhlIDY0Yml0IGJ1aWxkCiBqcHJ0LnNvbGFyaXNfc3BhcmN2OS5idWlsZC5wbGF0Zm9ybS5tYXRjaDMyPXNvbGFyaXNfc3BhcmNfNS4xMApkaWZmIC0tZ2l0IGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvSW1wb3J0LmphdmEgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci9JbXBvcnQuamF2YQppbmRleCBiNmJkODJjLi5iMmQzM2U5IDEwMDY0NAotLS0gYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci9JbXBvcnQuamF2YQorKysgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci9JbXBvcnQuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qCi0gKiAkSWQ6IEltcG9ydC5qYXZhLHYgMS4yLjQuMSAyMDA1LzA5LzEyIDEwOjMyOjMzIHB2ZWR1bGEgRXhwICQKKyAqICRJZDogSW1wb3J0LmphdmEsdiAxLjggMjAwNy8wNC8wOSAyMTozMDo0MCBqb2VodyBFeHAgJAogICovCiAKIHBhY2thZ2UgY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLmNvbXBpbGVyOwpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvSW5jbHVkZS5qYXZhIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvSW5jbHVkZS5qYXZhCmluZGV4IDcxOGU1MTIuLjNkNTQ5ZjQgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL0luY2x1ZGUuamF2YQorKysgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci9JbmNsdWRlLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKgotICogJElkOiBJbmNsdWRlLmphdmEsdiAxLjIuNC4xIDIwMDUvMDkvMDEgMTU6NDQ6MTggcHZlZHVsYSBFeHAgJAorICogJElkOiBJbmNsdWRlLmphdmEsdiAxLjggMjAwNy8wNC8wOSAyMTozMDo0MSBqb2VodyBFeHAgJAogICovCiAKIHBhY2thZ2UgY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLmNvbXBpbGVyOwpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvdXRpbC9UeXBlLmphdmEgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci91dGlsL1R5cGUuamF2YQppbmRleCBlMjY5NDAzLi5iMDgyOWRjIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci91dGlsL1R5cGUuamF2YQorKysgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci91dGlsL1R5cGUuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qCi0gKiAkSWQ6IFR5cGUuamF2YSx2IDEuMi40LjIgMjAwNS8wOS8xNSAxODozNDoxMyBqZWZmc3V0dG9yIEV4cCAkCisgKiAkSWQ6IFR5cGUuamF2YSx2IDEuOCAyMDA3LzAzLzI4IDE2OjUxOjE5IGpvZWh3IEV4cCAkCiAgKi8KIAogcGFja2FnZSBjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMuY29tcGlsZXIudXRpbDsKZGlmZiAtLWdpdCBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvU0FYMkRPTS5qYXZhIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9TQVgyRE9NLmphdmEKaW5kZXggNGQxMWZhOC4uY2IxYzUxNiAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9TQVgyRE9NLmphdmEKKysrIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9TQVgyRE9NLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKgotICogJElkOiBTQVgyRE9NLmphdmEsdiAxLjcgMjAwNi8wMS8yNiAwNzowMTo0MCBqZWZmc3V0dG9yIEV4cCAkCisgKiAkSWQ6IFNBWDJET00uamF2YSx2IDEuOC4yLjEgMjAwNi8xMi8wNCAxODo0NTo0MSBzcGVyaWNhcyBFeHAgJAogICovCiAKIApAQCAtNjgsNyArNjgsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IF9mYWN0b3J5ID0KICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKIAotICAgIHB1YmxpYyBTQVgyRE9NKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgcHVibGljIFNBWDJET00oKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoU0FYMkRPTS5jbGFzcykgewogICAgICAgICAgIF9kb2N1bWVudCA9IF9mYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvVGVtcGxhdGVzSW1wbC5qYXZhIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9UZW1wbGF0ZXNJbXBsLmphdmEKaW5kZXggYmYzMTIzMy4uZjMxZWQwNCAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9UZW1wbGF0ZXNJbXBsLmphdmEKKysrIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9UZW1wbGF0ZXNJbXBsLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKgotICogJElkOiBUZW1wbGF0ZXNJbXBsLmphdmEsdiAxLjIuNC4xIDIwMDUvMDkvMDYgMTI6MTk6MjYgcHZlZHVsYSBFeHAgJAorICogJElkOiBUZW1wbGF0ZXNJbXBsLmphdmEsdiAxLjggMjAwNy8wMy8yNiAyMDoxMjoyNyBzcGVyaWNhcyBFeHAgJAogICovCiAKIHBhY2thZ2UgY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLnRyYXg7CmRpZmYgLS1naXQgYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy90cmF4L1RyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YSBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDBmMTFiMDQuLmFhMjkzMTcgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoKLSAqICRJZDogVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhLHYgMS4yLjQuMSAyMDA1LzA5LzE1IDA2OjE1OjM4IHB2ZWR1bGEgRXhwICQKKyAqICRJZDogVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhLHYgMS44IDIwMDcvMDQvMDkgMjE6MzA6NDEgam9laHcgRXhwICQKICAqLwogCiBwYWNrYWdlIGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy50cmF4OwpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9UcmFuc2Zvcm1lckltcGwuamF2YSBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvVHJhbnNmb3JtZXJJbXBsLmphdmEKaW5kZXggMGM4NmYzMi4uMWFkMjI3YyAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9UcmFuc2Zvcm1lckltcGwuamF2YQorKysgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy90cmF4L1RyYW5zZm9ybWVySW1wbC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoKLSAqICRJZDogVHJhbnNmb3JtZXJJbXBsLmphdmEsdiAxLjUgMjAwNS8wOS8yOCAxMzo0ODo0NiBwdmVkdWxhIEV4cCAkCisgKiAkSWQ6IFRyYW5zZm9ybWVySW1wbC5qYXZhLHYgMS4xMCAyMDA3LzA2LzEzIDAxOjU3OjA5IGpvZWh3IEV4cCAkCiAgKi8KIAogcGFja2FnZSBjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMudHJheDsKZGlmZiAtLWdpdCBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9kb20vRW50aXR5SW1wbC5qYXZhIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2RvbS9FbnRpdHlJbXBsLmphdmEKaW5kZXggMjY1ZGUwMi4uNTFkNzZjNCAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2RvbS9FbnRpdHlJbXBsLmphdmEKKysrIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2RvbS9FbnRpdHlJbXBsLmphdmEKQEAgLTE0OCw3ICsxNDgsNiBAQAogICAgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCiAgICAgICogICA8YnI+Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgogICAgICAqLwotCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpCiAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24KICAgICB7CmRpZmYgLS1naXQgYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eU1hbmFnZXIuamF2YSBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1Byb3BlcnR5TWFuYWdlci5qYXZhCmluZGV4IGNmNjhlZjAuLmEwMjcwN2QgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1Byb3BlcnR5TWFuYWdlci5qYXZhCisrKyBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1Byb3BlcnR5TWFuYWdlci5qYXZhCkBAIC00NSw4ICs0NSw4IEBACiBwdWJsaWMgY2xhc3MgUHJvcGVydHlNYW5hZ2VyIHsKIAogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBWF9OT1RBVElPTlMgPSAiamF2YXgueG1sLnN0cmVhbS5ub3RhdGlvbnMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVhfRU5USVRJRVMgPSAiamF2YXgueG1sLnN0cmVhbS5lbnRpdGllcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBWF9OT1RBVElPTlMgPSAiamF2YXgueG1sLnN0cmVhbS5ub3RhdGlvbnMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVhfRU5USVRJRVMgPSAiamF2YXgueG1sLnN0cmVhbS5lbnRpdGllcyI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0lOVEVSTklORyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvc3RyaW5nLWludGVybmluZyI7CiAKZGlmZiAtLWdpdCBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTERvY3VtZW50RnJhZ21lbnRTY2FubmVySW1wbC5qYXZhIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRG9jdW1lbnRGcmFnbWVudFNjYW5uZXJJbXBsLmphdmEKaW5kZXggMTg1MWVmOC4uMGE4OTgwYiAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRG9jdW1lbnRGcmFnbWVudFNjYW5uZXJJbXBsLmphdmEKKysrIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRG9jdW1lbnRGcmFnbWVudFNjYW5uZXJJbXBsLmphdmEKQEAgLTI4OSw2ICsyODksOCBAQAogICAgIHByb3RlY3RlZCBib29sZWFuIGZSZXBvcnRDZGF0YUV2ZW50ID0gZmFsc2UgOwogICAgIHByb3RlY3RlZCBib29sZWFuIGZJc0NvYWxlc2NlID0gZmFsc2UgOwogICAgIHByb3RlY3RlZCBTdHJpbmcgZkRlY2xhcmVkRW5jb2RpbmcgPSAgbnVsbDsKKyAgICAvKiogRGlzYWxsb3cgZG9jdHlwZSBkZWNsYXJhdGlvbi4gKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmRGlzYWxsb3dEb2N0eXBlID0gZmFsc2U7CiAKICAgICAvLyBkcml2ZXJzCiAKQEAgLTE4NTIsNiArMTg1NCwxMSBAQAogICAgICAgICB9CiAgICAgICAgIC8vIHN0YXJ0IGdlbmVyYWwgZW50aXR5CiAgICAgICAgIGlmICghZkVudGl0eVN0b3JlLmlzRGVjbGFyZWRFbnRpdHkobmFtZSkpIHsKKyAgICAgICAgICAgIC8vU1VQUE9SVF9EVEQ9ZmFsc2UgJiYgUmVwbGFjZUVudGl0eVJlZmVyZW5jZXMgc2hvdWxkIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgaWYgKGZEaXNhbGxvd0RvY3R5cGUgJiYgZlJlcGxhY2VFbnRpdHlSZWZlcmVuY2VzKSB7CisgICAgICAgICAgICAgICAgcmVwb3J0RmF0YWxFcnJvcigiRW50aXR5Tm90RGVjbGFyZWQiLCBuZXcgT2JqZWN0W117bmFtZX0pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vUkVWSVNJVDogb25lIG1vcmUgY2FzZSBuZWVkcyB0byBiZSBpbmNsdWRlZDogZXh0ZXJuYWwgUEUgYW5kIHN0YW5kYWxvbmUgaXMgbm8KICAgICAgICAgICAgIGlmICggZkhhc0V4dGVybmFsRFREICYmICFmU3RhbmRhbG9uZSkgewogICAgICAgICAgICAgICAgIGlmIChmVmFsaWRhdGlvbikKZGlmZiAtLWdpdCBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTERvY3VtZW50U2Nhbm5lckltcGwuamF2YSBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTERvY3VtZW50U2Nhbm5lckltcGwuamF2YQppbmRleCBkNTE4MGZkLi4wMzM2ZWMxIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxEb2N1bWVudFNjYW5uZXJJbXBsLmphdmEKKysrIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRG9jdW1lbnRTY2FubmVySW1wbC5qYXZhCkBAIC02Miw2ICs2MiwxMCBAQAogICogQGF1dGhvciBBcm5hdWQgIExlIEhvcnMsIElCTQogICogQGF1dGhvciBFcmljIFllLCBJQk0KICAqIEBhdXRob3IgU3VuaXRoYSBSZWRkeSwgU3VuIE1pY3Jvc3lzdGVtcworICoKKyAqIFJlZmVyIHRvIHRoZSB0YWJsZSBpbiB1bml0LXRlc3QgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXJUZXN0LlN1cHBvcnREVEQgZm9yIGNoYW5nZXMKKyAqIHJlbGF0ZWQgdG8gcHJvcGVydHkgU3VwcG9ydERURC4KKyAqIEBhdXRob3IgSm9lIFdhbmcsIFN1biBNaWNyb3N5c3RlbXMKICAqLwogcHVibGljIGNsYXNzIFhNTERvY3VtZW50U2Nhbm5lckltcGwKICAgICAgICAgZXh0ZW5kcyBYTUxEb2N1bWVudEZyYWdtZW50U2Nhbm5lckltcGx7CkBAIC0xODUsOSArMTg5LDYgQEAKICAgICAvKiogTG9hZCBleHRlcm5hbCBEVEQuICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZkxvYWRFeHRlcm5hbERURCA9IHRydWU7CiAKLSAgICAvKiogRGlzYWxsb3cgZG9jdHlwZSBkZWNsYXJhdGlvbi4gKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmRGlzYWxsb3dEb2N0eXBlID0gZmFsc2U7Ci0KICAgICAvLyBzdGF0ZQogCiAgICAgLyoqIFNlZW4gZG9jdHlwZSBkZWNsYXJhdGlvbi4gKi8KQEAgLTIyNyw4ICsyMjgsOCBAQAogICAgIC8qKiBTdHJpbmcuICovCiAgICAgcHJpdmF0ZSBYTUxTdHJpbmcgZlN0cmluZyA9IG5ldyBYTUxTdHJpbmcoKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBbXSBET0NUWVBFID0geydEJywnTycsJ0MnLCdUJywnWScsJ1AnLCdFJ307Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFtdIENPTU1FTlRTVFJJTkcgPSB7Jy0nLCctJ307CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBET0NUWVBFID0geydEJywnTycsJ0MnLCdUJywnWScsJ1AnLCdFJ307CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBDT01NRU5UU1RSSU5HID0geyctJywnLSd9OwogCiAgICAgLy8KICAgICAvLyBDb25zdHJ1Y3RvcnMKQEAgLTcwOCw2ICs3MDksMTIgQEAKICAgICAvLwogICAgIC8vIFByaXZhdGUgbWV0aG9kcwogICAgIC8vCisgICAgLyoqIFNldCB0aGUgc2Nhbm5lciBzdGF0ZSBhZnRlciBzY2FubmluZyBEVEQgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFbmREVERTY2FuU3RhdGUoKSB7CisgICAgICAgIHNldFNjYW5uZXJTdGF0ZShTQ0FOTkVSX1NUQVRFX1BST0xPRyk7CisgICAgICAgIHNldERyaXZlcihmUHJvbG9nRHJpdmVyKTsKKyAgICAgICAgZkVudGl0eU1hbmFnZXIuc2V0RW50aXR5SGFuZGxlcihYTUxEb2N1bWVudFNjYW5uZXJJbXBsLnRoaXMpOworICAgIH0KIAogICAgIC8qKiBSZXR1cm5zIHRoZSBzY2FubmVyIHN0YXRlIG5hbWUuICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTY2FubmVyU3RhdGVOYW1lKGludCBzdGF0ZSkgewpAQCAtOTMwLDE5ICs5MzcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbEVycm9yKCJBbHJlYWR5U2VlbkRvY3R5cGUiLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZTZWVuRG9jdHlwZURlY2wgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZkRURERyaXZlciA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRFRERHJpdmVyID0gbmV3IERURERyaXZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FuRG9jdHlwZURlY2woKSBzZW5kcyBYTkkgZG9jdHlwZURlY2wgZXZlbnQgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gU0FYIGlzIGNvbnZlcnRlZCB0byBzdGFydERURCgpIGV2ZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5Eb2N0eXBlRGVjbChmRGlzYWxsb3dEb2N0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxsb3cgcGFyc2luZyBvZiBlbnRpdHkgZGVjbHMgdG8gY29udGludWUgaW4gb3JkZXIgdG8gc3RheSB3ZWxsLWZvcm1lZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNjYW5uZXJTdGF0ZShTQ0FOTkVSX1NUQVRFX0RURF9JTlRFUk5BTF9ERUNMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlNlZW5JbnRlcm5hbFN1YnNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZkRURERyaXZlciA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkRURERyaXZlciA9IG5ldyBEVEREcml2ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RHJpdmVyKGZDb250ZW50RHJpdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHRkRXZlbnQgPSBmRFRERHJpdmVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Fsd2F5cyByZXR1cm4gRFREIGV2ZW50LCB0aGUgZXZlbnQgaG93ZXZlciwgd2lsbCBub3QgY29udGFpbiBhbnkgZW50aXRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZkRURERyaXZlci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gRFREIHN1cHBvcnQsIGlnbm9yZSBhbmQgY29udGludWUgcGFyc2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmRGlzYWxsb3dEb2N0eXBlID8gbmV4dCgpIDogZHRkRXZlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZkRpc2FsbG93RG9jdHlwZSA/IG5leHQoKSA6IGR0ZEV2ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiogeHh4OmNoZWNrIHRoaXMgcGFydCBhZ2FpbgpAQCAtOTU1LDE3ICs5NjMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkRpc2FsbG93RG9jdHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNjYW5uZXJTdGF0ZShTQ0FOTkVSX1NUQVRFX1BST0xPRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGV4dGVybmFsIHN1YnNldAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZEb2N0eXBlU3lzdGVtSWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGZWYWxpZGF0aW9uIHx8IGZMb2FkRXh0ZXJuYWxEVEQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmVmFsaWRhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCAhZlZhbGlkYXRpb25NYW5hZ2VyLmlzQ2FjaGVkRFREKCkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FubmVyU3RhdGUoU0NBTk5FUl9TVEFURV9EVERfRVhURVJOQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZEaXNhbGxvd0RvY3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FubmVyU3RhdGUoU0NBTk5FUl9TVEFURV9EVERfRVhURVJOQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FubmVyU3RhdGUoU0NBTk5FUl9TVEFURV9QUk9MT0cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREcml2ZXIoZkNvbnRlbnREcml2ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmRFRERHJpdmVyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRFRERHJpdmVyID0gbmV3IERURERyaXZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZkRURERyaXZlci5uZXh0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC05NzYsOCArOTg0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBhIERPQ1RZUEUgdGhhdCBoYWQgbmVpdGhlciBhbiBpbnRlcm5hbCBzdWJzZXQgb3IgYW4gZXh0ZXJuYWwgc3Vic2V0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRFREU2Nhbm5lci5zZXRJbnB1dFNvdXJjZShmRXh0ZXJuYWxTdWJzZXRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRXh0ZXJuYWxTdWJzZXRTb3VyY2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FubmVyU3RhdGUoU0NBTk5FUl9TVEFURV9EVERfRVhURVJOQUxfREVDTFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZEaXNhbGxvd0RvY3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FubmVyU3RhdGUoU0NBTk5FUl9TVEFURV9EVERfRVhURVJOQUxfREVDTFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FubmVyU3RhdGUoU0NBTk5FUl9TVEFURV9QUk9MT0cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREcml2ZXIoZkNvbnRlbnREcml2ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmRFRERHJpdmVyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRFRERHJpdmVyID0gbmV3IERURERyaXZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZkRURERyaXZlci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTExNywxOSArMTEzMCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNYXJrdXBEZXB0aC0tOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYW4gZXh0ZXJuYWwgc3Vic2V0IG5leHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFYTUxEb2N1bWVudFNjYW5uZXJJbXBsLnRoaXMuZkRpc2FsbG93RG9jdHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZEb2N0eXBlU3lzdGVtSWQgIT0gbnVsbCAmJiAoZlZhbGlkYXRpb24gfHwgZkxvYWRFeHRlcm5hbERURCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNjYW5uZXJTdGF0ZShTQ0FOTkVSX1NUQVRFX0RURF9FWFRFUk5BTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmRGlzYWxsb3dEb2N0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NpbXBseSByZXNldCB0aGUgZW50aXR5IHN0b3JlIHdpdGhvdXQgaGF2aW5nIHRvIG1lc3MgYXJvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dpdGggdGhlIERURCBTY2FubmVyIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZFbnRpdHlTdG9yZSA9IGZFbnRpdHlNYW5hZ2VyLmdldEVudGl0eVN0b3JlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRW50aXR5U3RvcmUucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYW4gZXh0ZXJuYWwgc3Vic2V0IG5leHQgdW5sZXNzIHdlIGFyZSBpZ25vcmluZyBEVERzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkRvY3R5cGVTeXN0ZW1JZCAhPSBudWxsICYmIChmVmFsaWRhdGlvbiB8fCBmTG9hZEV4dGVybmFsRFREKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNjYW5uZXJTdGF0ZShTQ0FOTkVSX1NUQVRFX0RURF9FWFRFUk5BTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBicmVhayBvdXQgb2YgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNjYW5uZXJTdGF0ZShTQ0FOTkVSX1NUQVRFX1BST0xPRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREcml2ZXIoZlByb2xvZ0RyaXZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRW50aXR5TWFuYWdlci5zZXRFbnRpdHlIYW5kbGVyKFhNTERvY3VtZW50U2Nhbm5lckltcGwudGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFbmREVERTY2FuU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTE2MCwxMyArMTE3NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY29tcGxldGVEVEQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbW9yZVRvU2NhbiA9IGZEVERTY2FubmVyLnNjYW5EVERFeHRlcm5hbFN1YnNldChjb21wbGV0ZURURCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3JlVG9TY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNjYW5uZXJTdGF0ZShTQ0FOTkVSX1NUQVRFX1BST0xPRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERyaXZlcihmUHJvbG9nRHJpdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkVudGl0eU1hbmFnZXIuc2V0RW50aXR5SGFuZGxlcihYTUxEb2N1bWVudFNjYW5uZXJJbXBsLnRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFbmREVERTY2FuU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQ0FOTkVSX1NUQVRFX1BST0xPRyA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGVudGl0eSBkZWNscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVuZERURFNjYW5TdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTklFeGNlcHRpb24oIkRURERyaXZlciNkaXNwYXRjaDogc2Nhbm5lciBzdGF0ZT0iK2ZTY2FubmVyU3RhdGUrIiAoIitnZXRTY2FubmVyU3RhdGVOYW1lKGZTY2FubmVyU3RhdGUpKycpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxTdHJlYW1GaWx0ZXJJbXBsLmphdmEgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxTdHJlYW1GaWx0ZXJJbXBsLmphdmEKaW5kZXggNGI3MjFkOC4uNDUzNWFlZCAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MU3RyZWFtRmlsdGVySW1wbC5qYXZhCisrKyBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTFN0cmVhbUZpbHRlckltcGwuamF2YQpAQCAtNTYsNyArNTYsNiBAQAogICAgICAqIGhhc05leHQoKSB0byBhZHZhbmNlIHRoZSB1bmRlcmxpbmluZyBzdHJlYW0gaW4gb3JkZXIgdG8gZmluZCB0aGUgbmV4dCBhY2NlcHRhYmxlIGV2ZW50CiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGZTdHJlYW1BZHZhbmNlZEJ5SGFzTmV4dCA9IGZhbHNlOwotCiAgICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgWE1MU3RyZWFtRmlsdGVySW1wbCAqLwogCiAgICAgcHVibGljIFhNTFN0cmVhbUZpbHRlckltcGwoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcixTdHJlYW1GaWx0ZXIgZmlsdGVyKXsKQEAgLTQzNiw3ICs0MzUsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKICAgICAgICAgcmV0dXJuIGZTdHJlYW1SZWFkZXIuZ2V0VmVyc2lvbigpOwotCiAgICAgfQogCiAgICAgLyoqCkBAIC01MzIsNSArNTMwLDQgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgaW5kZXgpewogICAgICAgICByZXR1cm4gZlN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW5kZXgpOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hJbmNsdWRlTWVzc2FnZXMucHJvcGVydGllcyBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YSW5jbHVkZU1lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggYTA1YTNlNS4uMjA4ZTQ0ZSAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hJbmNsdWRlTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWEluY2x1ZGVNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0zNCw0ICszNCwzIEBACiAjIE1lc3NhZ2VzIGZyb20gZXJyb25lb3VzIHNldC11cAogSW5jb21wYXRpYmxlTmFtZXNwYWNlQ29udGV4dCA9IFRoZSB0eXBlIG9mIHRoZSBOYW1lc3BhY2VDb250ZXh0IGlzIGluY29tcGF0aWJsZSB3aXRoIHVzaW5nIFhJbmNsdWRlOyBpdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFhJbmNsdWRlTmFtZXNwYWNlU3VwcG9ydAogRXhwYW5kZWRTeXN0ZW1JZCA9IENvdWxkIG5vdCBleHBhbmQgc3lzdGVtIGlkIG9mIGluY2x1ZGVkIHJlc291cmNlCi1udWxsCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC94cy90cmF2ZXJzZXJzL1hTQXR0cmlidXRlQ2hlY2tlci5qYXZhIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwveHMvdHJhdmVyc2Vycy9YU0F0dHJpYnV0ZUNoZWNrZXIuamF2YQppbmRleCBjOThlYmJmLi5jMDE3Yjg3IDEwMDY0NAotLS0gYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC94cy90cmF2ZXJzZXJzL1hTQXR0cmlidXRlQ2hlY2tlci5qYXZhCisrKyBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL3hzL3RyYXZlcnNlcnMvWFNBdHRyaWJ1dGVDaGVja2VyLmphdmEKQEAgLTEyMTQsMTkgKzEyMTQsMjkgQEAKICAgICAgICAgICAgIGludCBtYXggPSAoKFhJbnQpYXR0clZhbHVlc1tBVFRJRFhfTUFYT0NDVVJTXSkuaW50VmFsdWUoKTsKICAgICAgICAgICAgIGlmIChtYXggIT0gU2NoZW1hU3ltYm9scy5PQ0NVUlJFTkNFX1VOQk9VTkRFRCkgewogCi0gICAgICAgICAgICAgICAgLy8gVGhlIG1heE9jY3VycyByZXN0cmljdGlvbiBubyBsb25nZXIgYXBwbGllcyB0byBlbGVtZW50cwotICAgICAgICAgICAgICAgIC8vIGFuZCB3aWxkY2FyZHMuIFRoZXNlIGFyZSBub3cgdmFsaWRhdGVkIHVzaW5nIGEgY29uc3RhbnQKLSAgICAgICAgICAgICAgICAvLyBzcGFjZSBhbGdvcml0aG0uIFRoZSByZXN0cmljdGlvbiBzdGlsbCBhcHBsaWVzIHRvIG1vZGVsCi0gICAgICAgICAgICAgICAgLy8gZ3JvdXBzIHN1Y2ggYXMgeHM6c2VxdWVuY2UuCisgICAgICAgICAgICAgICAgLy8gbWF4T2NjdXJMaW1pdCBpcyBvbmx5IGNoZWNrIGluIHNlY3VyZSBtb2RlCisgICAgICAgICAgICAgICAgaWYgKGZTY2hlbWFIYW5kbGVyLmZTZWN1cmVQcm9jZXNzaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7CiAKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZlNjaGVtYUhhbmRsZXIuZlNlY3VyZVByb2Nlc3NpbmcgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWxvY2FsTmFtZS5lcXVhbHMoImVsZW1lbnQiKSAmJiAhbG9jYWxOYW1lLmVxdWFscygiYW55IikpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWF4T2NjdXJzIHJlc3RyaWN0aW9uIG5vIGxvbmdlciBhcHBsaWVzIHRvIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3aWxkY2FyZHMgaW4gYSBzZXF1ZW5jZSBpbiB3aGljaCB0aGV5IGFyZSB0aGUgb25seQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWNsZS4gVGhlc2UgYXJlIG5vdyB2YWxpZGF0ZWQgdXNpbmcgYSBjb25zdGFudAorICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZSBhbGdvcml0aG0uIFRoZSByZXN0cmljdGlvbiBzdGlsbCBhcHBsaWVzIHRvIGFsbAorICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBjYXNlcy4KKworICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgY29uc3RhbnQtc3BhY2UgYWxnb3JpdGhtIGNhbiBiZSBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gb3B0aW1pemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbE5hbWUuZXF1YWxzKCJlbGVtZW50IikgfHwgbG9jYWxOYW1lLmVxdWFscygiYW55IikpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpID09IG51bGwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLmdldExvY2FsTmFtZSgpLmVxdWFscygic2VxdWVuY2UiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpbWl6ZSkgewogICAgICAgICAgICAgICAgICAgICAvL1JldmlzaXQgOjogSU1PIHRoaXMgaXMgbm90IHJpZ2h0IHBsYWNlIHRvIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgIC8vIG1heE9jY3VyTm9kZUxpbWl0LgogICAgICAgICAgICAgICAgICAgICBpbnQgbWF4T2NjdXJOb2RlTGltaXQgPSBmU2NoZW1hSGFuZGxlci5mU2VjdXJlUHJvY2Vzc2luZy5nZXRNYXhPY2N1ck5vZGVMaW1pdCgpOwogICAgICAgICAgICAgICAgICAgICBpZiAobWF4ID4gbWF4T2NjdXJOb2RlTGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFNjaGVtYUVycm9yKCJtYXhPY2N1ckxpbWl0IiwgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihtYXhPY2N1ck5vZGVMaW1pdCl9LCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFNjaGVtYUZhdGFsRXJyb3IoIm1heE9jY3VyTGltaXQiLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKG1heE9jY3VyTm9kZUxpbWl0KX0sIGVsZW1lbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBtYXggdmFsdWVzIGluIGNhc2UgcHJvY2Vzc2luZyBjb250aW51ZXMgb24gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZXNbQVRUSURYX01BWE9DQ1VSU10gPSBmWEludFBvb2wuZ2V0WEludChtYXhPY2N1ck5vZGVMaW1pdCk7CkBAIC0xMjM0LDYgKzEyNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4T2NjdXJOb2RlTGltaXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKG1pbiA+IG1heCkgewogICAgICAgICAgICAgICAgICAgICByZXBvcnRTY2hlbWFFcnJvciAoInAtcHJvcHMtY29ycmVjdC4yLjEiLApAQCAtMTYwNyw2ICsxNjE4LDEwIEBACiAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICB9CiAKKyAgICB2b2lkIHJlcG9ydFNjaGVtYUZhdGFsRXJyb3IgKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIEVsZW1lbnQgZWxlKSB7CisgICAgICAgIGZTY2hlbWFIYW5kbGVyLnJlcG9ydFNjaGVtYUZhdGFsRXJyb3Ioa2V5LCBhcmdzLCBlbGUpOworICAgIH0KKwogICAgIHZvaWQgcmVwb3J0U2NoZW1hRXJyb3IgKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIEVsZW1lbnQgZWxlKSB7CiAgICAgICAgIGZTY2hlbWFIYW5kbGVyLnJlcG9ydFNjaGVtYUVycm9yKGtleSwgYXJncywgZWxlKTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC94cy90cmF2ZXJzZXJzL1hTREhhbmRsZXIuamF2YSBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL3hzL3RyYXZlcnNlcnMvWFNESGFuZGxlci5qYXZhCmluZGV4IGNlNDA1NTkuLjY2NWRiOTMgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL3hzL3RyYXZlcnNlcnMvWFNESGFuZGxlci5qYXZhCisrKyBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL3hzL3RyYXZlcnNlcnMvWFNESGFuZGxlci5qYXZhCkBAIC0yNTIzLDI1ICsyNTIzLDI2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICB2b2lkIHJlcG9ydFNjaGVtYUZhdGFsRXJyb3IoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncywgRWxlbWVudCBlbGUpIHsKKyAgICAgICAgcmVwb3J0U2NoZW1hRXJyKGtleSwgYXJncywgZWxlLCBYTUxFcnJvclJlcG9ydGVyLlNFVkVSSVRZX0ZBVEFMX0VSUk9SKTsKKyAgICB9CisKICAgICB2b2lkIHJlcG9ydFNjaGVtYUVycm9yKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIEVsZW1lbnQgZWxlKSB7Ci0gICAgICAgIGlmIChlbGVtZW50MkxvY2F0b3IoZWxlLCB4bCkpIHsKLSAgICAgICAgICAgIGZFcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yKHhsLCBYU01lc3NhZ2VGb3JtYXR0ZXIuU0NIRU1BX0RPTUFJTiwKLSAgICAgICAgICAgICAgICAgICAga2V5LCBhcmdzLCBYTUxFcnJvclJlcG9ydGVyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZFcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yKFhTTWVzc2FnZUZvcm1hdHRlci5TQ0hFTUFfRE9NQUlOLAotICAgICAgICAgICAgICAgICAgICBrZXksIGFyZ3MsIFhNTEVycm9yUmVwb3J0ZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICB9CisgICAgICAgIHJlcG9ydFNjaGVtYUVycihrZXksIGFyZ3MsIGVsZSwgWE1MRXJyb3JSZXBvcnRlci5TRVZFUklUWV9FUlJPUik7CiAgICAgfQogCiAgICAgdm9pZCByZXBvcnRTY2hlbWFXYXJuaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIEVsZW1lbnQgZWxlKSB7CisgICAgICAgIHJlcG9ydFNjaGVtYUVycihrZXksIGFyZ3MsIGVsZSwgWE1MRXJyb3JSZXBvcnRlci5TRVZFUklUWV9XQVJOSU5HKTsKKyAgICB9CisKKyAgICB2b2lkIHJlcG9ydFNjaGVtYUVycihTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBFbGVtZW50IGVsZSwgc2hvcnQgdHlwZSkgewogICAgICAgICBpZiAoZWxlbWVudDJMb2NhdG9yKGVsZSwgeGwpKSB7CiAgICAgICAgICAgICBmRXJyb3JSZXBvcnRlci5yZXBvcnRFcnJvcih4bCwgWFNNZXNzYWdlRm9ybWF0dGVyLlNDSEVNQV9ET01BSU4sCi0gICAgICAgICAgICAgICAgICAgIGtleSwgYXJncywgWE1MRXJyb3JSZXBvcnRlci5TRVZFUklUWV9XQVJOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAga2V5LCBhcmdzLCB0eXBlKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGZFcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yKFhTTWVzc2FnZUZvcm1hdHRlci5TQ0hFTUFfRE9NQUlOLAotICAgICAgICAgICAgICAgICAgICBrZXksIGFyZ3MsIFhNTEVycm9yUmVwb3J0ZXIuU0VWRVJJVFlfV0FSTklORyk7CisgICAgICAgICAgICAgICAgICAgIGtleSwgYXJncywgdHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9qYXhwL3ZhbGlkYXRpb24vWE1MU2NoZW1hRmFjdG9yeS5qYXZhIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2pheHAvdmFsaWRhdGlvbi9YTUxTY2hlbWFGYWN0b3J5LmphdmEKaW5kZXggZjVlNjMwMC4uOTUyNjViNCAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2pheHAvdmFsaWRhdGlvbi9YTUxTY2hlbWFGYWN0b3J5LmphdmEKKysrIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2pheHAvdmFsaWRhdGlvbi9YTUxTY2hlbWFGYWN0b3J5LmphdmEKQEAgLTExMSw2ICsxMTEsMTAgQEAKICAgICAgICAgZlhNTFNjaGVtYUxvYWRlci5zZXRQcm9wZXJ0eShYTUxHUkFNTUFSX1BPT0wsIGZYTUxHcmFtbWFyUG9vbFdyYXBwZXIpOwogICAgICAgICBmWE1MU2NoZW1hTG9hZGVyLnNldEVudGl0eVJlc29sdmVyKGZET01FbnRpdHlSZXNvbHZlcldyYXBwZXIpOwogICAgICAgICBmWE1MU2NoZW1hTG9hZGVyLnNldEVycm9ySGFuZGxlcihmRXJyb3JIYW5kbGVyV3JhcHBlcik7CisKKyAgICAgICAgLy8gRW5hYmxlIHNlY3VyZSBwcm9jZXNzaW5nIGZlYXR1cmUgYnkgZGVmYXVsdAorICAgICAgICBmU2VjdXJpdHlNYW5hZ2VyID0gbmV3IFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBmWE1MU2NoZW1hTG9hZGVyLnNldFByb3BlcnR5KFNFQ1VSSVRZX01BTkFHRVIsIGZTZWN1cml0eU1hbmFnZXIpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL3hpbmNsdWRlL1hJbmNsdWRlSGFuZGxlci5qYXZhIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL3hpbmNsdWRlL1hJbmNsdWRlSGFuZGxlci5qYXZhCmluZGV4IDg0MmQ4MGIuLjA4YzBmNGQgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC94aW5jbHVkZS9YSW5jbHVkZUhhbmRsZXIuamF2YQorKysgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwveGluY2x1ZGUvWEluY2x1ZGVIYW5kbGVyLmphdmEKQEAgLTk0Myw4ICs5NDMsNyBAQAogICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVRFX0lHTk9SRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBvcnRGYXRhbEVycm9yKCJOb0ZhbGxiYWNrIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYXR0cmlidXRlcy5nZXRWYWx1ZShudWxsLCAiaHJlZiIpIH0pOworICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsRXJyb3IoIk5vRmFsbGJhY2siKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChpc0ZhbGxiYWNrRWxlbWVudChlbGVtZW50KSkgewpAQCAtMTAwMiw4ICsxMDAxLDcgQEAKICAgICAgICAgICAgIC8vIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBpbmNsdWRlIGVsZW1lbnQgY29udGFpbmVkIGEgZmFsbGJhY2sKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IFNUQVRFX0VYUEVDVF9GQUxMQkFDSwogICAgICAgICAgICAgICAgICYmICFnZXRTYXdGYWxsYmFjayhmRGVwdGggKyAxKSkgewotICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsRXJyb3IoIk5vRmFsbGJhY2siLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAidW5rbm93biIgfSk7CisgICAgICAgICAgICAgICAgcmVwb3J0RmF0YWxFcnJvcigiTm9GYWxsYmFjayIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChpc0ZhbGxiYWNrRWxlbWVudChlbGVtZW50KSkgewpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3V0aWxzL1RocmVhZENvbnRyb2xsZXJXcmFwcGVyLmphdmEgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvdXRpbHMvVGhyZWFkQ29udHJvbGxlcldyYXBwZXIuamF2YQppbmRleCA2YmNmYzE5Li4xZmM2NmZkIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvdXRpbHMvVGhyZWFkQ29udHJvbGxlcldyYXBwZXIuamF2YQorKysgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvdXRpbHMvVGhyZWFkQ29udHJvbGxlcldyYXBwZXIuamF2YQpAQCAtNTMsNyArNTMsMzUgQEAKICAgewogCiAgICAgLyoqCi0gICAgICogV2lsbCBnZXQgYSB0aHJlYWQgZnJvbSB0aGUgcG9vbCwgZXhlY3V0ZSB0aGUgdGFzaworICAgICAgKiBUaGlzIGNsYXNzIHdhcyBpbnRyb2R1Y2VkIGFzIGEgZml4IGZvciBDUiA2NjA3MzM5LgorICAgICAgKi8KKyAgICAgZmluYWwgY2xhc3MgU2FmZVRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHJhbiA9IGZhbHNlOworCisgICAgICAgICAgcHVibGljIFNhZmVUaHJlYWQoUnVubmFibGUgdGFyZ2V0KSB7CisgICAgICAgICAgICAgIHN1cGVyKHRhcmdldCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgcnVuKCkgbWV0aG9kIGluIGEiCisgICAgICAgICAgICAgICAgICAgICAgKyAiIFNhZmVUaHJlYWQgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkLiIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICBpZiAoIXJhbikgeworICAgICAgICAgICAgICAgICAgICAgcmFuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBydW4oKSBtZXRob2QgaW4gYSIKKyAgICAgICAgICAgICAgICAgICAgICArICIgU2FmZVRocmVhZCBjYW5ub3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiIpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3VwZXIucnVuKCk7CisgICAgICAgICAgfQorICAgICB9CisKKyAgICAgLyoqCisgICAgICogIFdpbGwgZ2V0IGEgdGhyZWFkIGZyb20gdGhlIHBvb2wsIGV4ZWN1dGUgdGhlIHRhc2sKICAgICAgKiAgYW5kIHJldHVybiB0aGUgdGhyZWFkIHRvIHRoZSBwb29sLgogICAgICAqCiAgICAgICogIFRoZSByZXR1cm4gdmFsdWUgaXMgdXNlZCBvbmx5IHRvIHdhaXQgZm9yIGNvbXBsZXRpb24KQEAgLTY4LDcgKzk2LDcgQEAKICAgICBwdWJsaWMgVGhyZWFkIHJ1bihSdW5uYWJsZSB0YXNrLCBpbnQgcHJpb3JpdHkpCiAgICAgewogCi0gICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQodGFzayk7CisgICAgICBUaHJlYWQgdCA9IG5ldyBTYWZlVGhyZWFkKHRhc2spOwogCiAgICAgICB0LnN0YXJ0KCk7CiAKZGlmZiAtLWdpdCBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hwYXRoL2ludGVybmFsL2F4ZXMvTm9kZVNlcXVlbmNlLmphdmEgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vb3JnL2FwYWNoZS94cGF0aC9pbnRlcm5hbC9heGVzL05vZGVTZXF1ZW5jZS5qYXZhCmluZGV4IDcxZTg3YzAuLmM5ZTA2NjEgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9vcmcvYXBhY2hlL3hwYXRoL2ludGVybmFsL2F4ZXMvTm9kZVNlcXVlbmNlLmphdmEKKysrIGIvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL29yZy9hcGFjaGUveHBhdGgvaW50ZXJuYWwvYXhlcy9Ob2RlU2VxdWVuY2UuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qCi0gKiAkSWQ6IE5vZGVTZXF1ZW5jZS5qYXZhLHYgMS4yLjQuMiAyMDA1LzA5LzE0IDE5OjQ1OjE5IGplZmZzdXR0b3IgRXhwICQKKyAqICRJZDogTm9kZVNlcXVlbmNlLmphdmEsdiAxLjYgMjAwNy8wMS8xMiAxOToyNjo0MiBzcGVyaWNhcyBFeHAgJAogICovCiBwYWNrYWdlIGNvbS5zdW4ub3JnLmFwYWNoZS54cGF0aC5pbnRlcm5hbC5heGVzOwogCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9ldmVudHMvWE1MRXZlbnRBbGxvY2F0b3JJbXBsLmphdmEgYi9qYXhwL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9ldmVudHMvWE1MRXZlbnRBbGxvY2F0b3JJbXBsLmphdmEKaW5kZXggM2YzOTM0MS4uZTA0NmY1MyAxMDA2NDQKLS0tIGEvamF4cC9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vZXZlbnRzL1hNTEV2ZW50QWxsb2NhdG9ySW1wbC5qYXZhCisrKyBiL2pheHAvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2V2ZW50cy9YTUxFdmVudEFsbG9jYXRvckltcGwuamF2YQpAQCAtMjUsNiArMjUsOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5ldmVudHM7CiAKK2ltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLmltcGwuUHJvcGVydHlNYW5hZ2VyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0udXRpbC5YTUxFdmVudEFsbG9jYXRvcjsKIGltcG9ydCBqYXZheC54bWwuc3RyZWFtLio7CiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5ldmVudHMuKjsKQEAgLTE0NCw3ICsxNDYsMTMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuRFREOnsKLSAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBEVERFdmVudChzdHJlYW1SZWFkZXIuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBEVERFdmVudCBkdGRFdmVudCA9IG5ldyBEVERFdmVudChzdHJlYW1SZWFkZXIuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBkdGRFdmVudC5zZXRMb2NhdGlvbihzdHJlYW1SZWFkZXIuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgTGlzdCBlbnRpdGllcyA9IChMaXN0KXN0cmVhbVJlYWRlci5nZXRQcm9wZXJ0eShQcm9wZXJ0eU1hbmFnZXIuU1RBWF9FTlRJVElFUyk7CisgICAgICAgICAgICAgICAgaWYgKGVudGl0aWVzICE9IG51bGwgJiYgZW50aXRpZXMuc2l6ZSgpICE9IDApIGR0ZEV2ZW50LnNldEVudGl0aWVzKGVudGl0aWVzKTsKKyAgICAgICAgICAgICAgICBMaXN0IG5vdGF0aW9ucyA9IChMaXN0KXN0cmVhbVJlYWRlci5nZXRQcm9wZXJ0eShQcm9wZXJ0eU1hbmFnZXIuU1RBWF9OT1RBVElPTlMpOworICAgICAgICAgICAgICAgIGlmIChub3RhdGlvbnMgIT0gbnVsbCAmJiBub3RhdGlvbnMuc2l6ZSgpICE9IDApIGR0ZEV2ZW50LnNldE5vdGF0aW9ucyhub3RhdGlvbnMpOworICAgICAgICAgICAgICAgIGV2ZW50ID0gZHRkRXZlbnQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNEQVRBOnsKZGlmZiAtLWdpdCBhL2pheHdzLy5oZ3RhZ3MgYi9qYXh3cy8uaGd0YWdzCmluZGV4IDFiZjVjYTEuLjVlOGY5YzYgMTAwNjQ0Ci0tLSBhL2pheHdzLy5oZ3RhZ3MKKysrIGIvamF4d3MvLmhndGFncwpAQCAtMzAsMyArMzAsNCBAQAogYjI1MDIxOGViMmU1MzQzODQ2NjdlYzczZTM3MTNlNjg0NjY3ZmQ0YyBqZGs3LWI1MwogNTBlYTAwZGM1ZjE0M2ZlMDAwMjUyMzNlNzA0OTAzYzM3Zjg0NjRhYSBqZGs3LWI1NAogZTBlZWJkOTc4YjgzMGMwOWU3ODYyY2ZmM2Y3N2E5MTRjMTU2NTFjOSBqZGs3LWI1NQorMGY3ZmJmODVmN2ExZDljMDI3YTg2M2I5OTU1YzYyMzM1MmVkMTI5MiBqZGs3LWI1NgpkaWZmIC0tZ2l0IGEvamF4d3MvVEhJUkRfUEFSVFlfUkVBRE1FIGIvamF4d3MvVEhJUkRfUEFSVFlfUkVBRE1FCmluZGV4IDlmNGQ3ZTUuLjY5MDg5MDUgMTAwNjQ0Ci0tLSBhL2pheHdzL1RISVJEX1BBUlRZX1JFQURNRQorKysgYi9qYXh3cy9USElSRF9QQVJUWV9SRUFETUUKQEAgLTYxLDYgKzYxLDI4IEBACiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCislJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gbGl0dGxlY21zLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAgCisKK0xpdHRsZSBjbXMKK0NvcHlyaWdodCAoQykgMTk5OC0yMDA0IE1hcnRpIE1hcmlhCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKK3RoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgordGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKK0NPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAlJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gemxpYiAxLjEuMywgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogICAKIAogQWNrbm93bGVkZ21lbnRzOgpAQCAtMTE1LDE2ICsxMzcsNiBAQAogVGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgY29weXJpZ2h0IGhvbGRlcnMgbWF5IE5PVCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbiB3aXRoIGNvcHlyaWdodCBob2xkZXJzLgogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiBUaGlzIGZvcm11bGF0aW9uIG9mIFczQydzIG5vdGljZSBhbmQgbGljZW5zZSBiZWNhbWUgYWN0aXZlIG9uIEF1Z3VzdCAxNCAxOTk4IHNvIGFzIHRvIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIEdQTC4gVGhpcyB2ZXJzaW9uIGVuc3VyZXMgdGhhdCBXM0Mgc29mdHdhcmUgbGljZW5zaW5nIHRlcm1zIGFyZSBubyBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gR1BMIGFuZCBjb25zZXF1ZW50bHkgVzNDIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCBpbiBHUEwgcGFja2FnZXMuIFNlZSB0aGUgb2xkZXIgZm9ybXVsYXRpb24gZm9yIHRoZSBwb2xpY3kgcHJpb3IgdG8gdGhpcyBkYXRlLiBQbGVhc2Ugc2VlIG91ciBDb3B5cmlnaHQgRkFRIGZvciBjb21tb24gcXVlc3Rpb25zIGFib3V0IHVzaW5nIG1hdGVyaWFscyBmcm9tIG91ciBzaXRlLCBpbmNsdWRpbmcgc3BlY2lmaWMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIgcXVlc3Rpb25zIGFib3V0IHRoaXMgbm90aWNlIGNhbiBiZSBkaXJlY3RlZCB0byBzaXRlLXBvbGljeUB3My5vcmcuCi2gCi0lJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8ganNjaGVtZS5qYXIsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAotU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQKLUNvcHlyaWdodCCpIDE5OTgtMjAwMiBieSBQZXRlciBOb3J2aWcuIAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSwgaW4gc291cmNlIG9yIG9iamVjdCBjb2RlIGZvcm0sIG9uIGFueSBjb21wdXRlciBzeXN0ZW0sIGFuZCB0byBtb2RpZnksIGNvbXBpbGUsIGRlY29tcGlsZSwgcnVuLCBhbmQgcmVkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiAKLTEuVGhlIGF1dGhvciBtYWtlcyBubyB3YXJyYW50eSBvZiBhbnkga2luZCwgZWl0aGVyIGV4cHJlc3NlZCBvciBpbXBsaWVkLCBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0yLlRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgb2YgYW55IGtpbmQgZm9yIGRhbWFnZXMgb3Igb3RoZXIgY29uc2VxdWVuY2VzIG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiB0aGV5IGFyaXNlIGZyb20gZGVmZWN0cyBpbiB0aGUgc29mdHdhcmUuCi0zLlRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCwgZWl0aGVyIGJ5IGV4cGxpY2l0IGNsYWltIG9yIGJ5IG9taXNzaW9uLgotNC5BbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gQWx0ZXJlZCB2ZXJzaW9ucyBtYXkgYmUgZGlzdHJpYnV0ZWQgaW4gcGFja2FnZXMgdW5kZXIgb3RoZXIgbGljZW5zZXMgKHN1Y2ggYXMgdGhlIEdOVSBsaWNlbnNlKS4gCi1JZiB5b3UgZmluZCB0aGlzIHNvZnR3YXJlIHVzZWZ1bCwgaXQgd291bGQgYmUgbmljZSBpZiB5b3UgbGV0IG1lIChwZXRlckBub3J2aWcuY29tKSBrbm93IGFib3V0IGl0LCBhbmQgbmljZXIgc3RpbGwgaWYgeW91IHNlbmQgbWUgbW9kaWZpY2F0aW9ucyB0aGF0IHlvdSBhcmUgd2lsbGluZyB0byBzaGFyZS4gSG93ZXZlciwgeW91IGFyZSBub3QgcmVxdWlyZWQgdG8gZG8gc28uCiAKIAogJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFBDL1NDIExpdGUgZm9yIFN1c2UgTGludXggdi4gMS4xLjEsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IApkaWZmIC0tZ2l0IGEvamF4d3MvVFJBREVNQVJLIGIvamF4d3MvVFJBREVNQVJLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ODdiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9UUkFERU1BUksKQEAgLTAsMCArMSw0MSBAQAorT3BlbkpESyBUcmFkZW1hcmsgTm90aWNlCitWZXJzaW9uIDEuMSwgMjAwOC8zLzEwCisKK09wZW5KREsgKHRoZSAiTmFtZSIpIGlzIGEgdHJhZGVtYXJrIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gKHRoZSAiT3duZXIiKS4KK093bmVyIHBlcm1pdHMgYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKHRoZSAiU29mdHdhcmUiKQord2hpY2ggaXMgYmFzZWQgb24gb3JpZ2luYWwgc29mdHdhcmUgcmV0cmlldmVkIGZyb20gb25lIG9mIHRoZSBmb2xsb3dpbmcKK3dlYnNpdGVzOiBodHRwOi8vZG93bmxvYWQuamF2YS5uZXQvb3BlbmpkaywgaHR0cDovL2hnLm9wZW5qZGsuamF2YS5uZXQvamRrNiwKK29yIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0IChlYWNoIGEgIldlYnNpdGUiLCB3aXRoIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZSBtYWRlCithdmFpbGFibGUgYnkgdGhlIE93bmVyIG9uIGEgV2Vic2l0ZSBiZWluZyBrbm93biBhcyB0aGUgIldlYnNpdGUgU29mdHdhcmUiKSB0bwordXNlIHRoZSBOYW1lIGluIHBhY2thZ2UgbmFtZXMgYW5kIHZlcnNpb24gc3RyaW5ncyBvZiB0aGUgU29mdHdhcmUgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgIC0gVGhlIFNvZnR3YXJlIGlzIGEgc3Vic3RhbnRpYWxseSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3BlbkpESworICAgIGRldmVsb3BtZW50IGtpdCBvciBydW50aW1lIGVudmlyb25tZW50IGNvZGUgbWFkZSBhdmFpbGFibGUgYnkgT3duZXIgb24gYQorICAgIFdlYnNpdGUsIGFuZCB0aGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgU29mdHdhcmUgY29kZSBpcyBpZGVudGljYWwgdG8gdGhlCisgICAgdXBzdHJlYW0gV2Vic2l0ZSBTb2Z0d2FyZTsKKworICAtIE5vIHBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIHRoZSBOYW1lIGluIGFueSBvdGhlciBtYW5uZXIsCisgICAgdW5sZXNzIHN1Y2ggdXNlIGNvbnN0aXR1dGVzICJmYWlyIHVzZS4iCisKKyAgLSBUaGUgT3duZXIgbWFrZXMgbm8gd2FycmFudGllcyBvZiBhbnkga2luZCByZXNwZWN0aW5nIHRoZSBOYW1lIGFuZCBhbGwKKyAgICByZXByZXNlbnRhdGlvbnMgYW5kIHdhcnJhbnRpZXMsIGluY2x1ZGluZyBhbnkgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIG1lcmNoYW50YWJpbGl0eSwgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudAorICAgIGFyZSBoZXJlYnkgZGlzY2xhaW1lZDsgYW5kCisKKyAgLSBUaGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyBsZWdlbmQgYXJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgICAgU29mdHdhcmUgb3IgcG9ydGlvbnMgb2YgaXQ6CisKKyAgICAgICAgT3BlbkpESyBpcyBhIHRyYWRlbWFyayBvciByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBTdW4gTWljcm9zeXN0ZW1zLAorICAgICAgICBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZCBvdGhlciBjb3VudHJpZXMuCisKK1RoZSBOYW1lIG1heSBhbHNvIGJlIHVzZWQgaW4gY29ubmVjdGlvbiB3aXRoIGRlc2NyaXB0aW9ucyBvZiB0aGUgU29mdHdhcmUgdGhhdAorY29uc3RpdHV0ZSAiZmFpciB1c2UsIiBzdWNoIGFzICJkZXJpdmVkIGZyb20gdGhlIE9wZW5KREsgY29kZSBiYXNlIiBvciAiYmFzZWQKK29uIHRoZSBPcGVuSkRLIHNvdXJjZSBjb2RlLiIKKworT3duZXIgaW50ZW5kcyB0byByZXZpc2UgdGhpcyBOb3RpY2UgYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIG1lZXQgdGhlIG5lZWRzIG9mCit0aGUgT3BlbkpESyBDb21tdW5pdHkuICBQbGVhc2Ugc2VuZCBxdWVzdGlvbnMgb3IgY29tbWVudHMgYWJvdXQgdGhpcyBOb3RpY2UgdG8KK1N1biBNaWNyb3N5c3RlbXMgYXQgb3Blbmpkay10bUBzdW4uY29tLiAgUmV2aXNpb25zIHRvIHRoaXMgTm90aWNlIHdpbGwgYmUKK2Fubm91bmNlZCBvbiB0aGUgcHVibGljIG1haWxpbmcgbGlzdCBhbm5vdW5jZUBvcGVuamRrLmphdmEubmV0LCB0byB3aGljaCB5b3UKK21heSBzdWJzY3JpYmUgYnkgdmlzaXRpbmcgaHR0cDovL21haWwub3Blbmpkay5qYXZhLm5ldC4gIFRoZSBsYXRlc3QgdmVyc2lvbiBvZgordGhpcyBOb3RpY2UgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L2xlZ2FsLgpkaWZmIC0tZ2l0IGEvamF4d3MvbWFrZS9NYWtlZmlsZSBiL2pheHdzL21ha2UvTWFrZWZpbGUKaW5kZXggNTY2OTY3Mi4uM2RjMTdiZiAxMDA2NDQKLS0tIGEvamF4d3MvbWFrZS9NYWtlZmlsZQorKysgYi9qYXh3cy9tYWtlL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL21ha2UvYnVpbGQueG1sIGIvamF4d3MvbWFrZS9idWlsZC54bWwKaW5kZXggOWYwMTNlOS4uNWI4M2U1NSAxMDA2NDQKLS0tIGEvamF4d3MvbWFrZS9idWlsZC54bWwKKysrIGIvamF4d3MvbWFrZS9idWlsZC54bWwKQEAgLTc4LDYgKzc4LDE1IEBACiAgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9L01FVEEtSU5GL3NlcnZpY2VzIi8+CiAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0vTUVUQS1JTkYvc2VydmljZXMiCiAgICAgICAgICAgICAgICAgICBmaWxlPSIke3NyYy5jbGFzc2VzLmRpcn0vY29tL3N1bi90b29scy9ldGMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5Ii8+CisgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0vTUVUQS1JTkYvc2VydmljZXMiCisgICAgICAgICAgICAgICAgICBmaWxlPSIke3NyYy5jbGFzc2VzLmRpcn0vY29tL3N1bi90b29scy9ldGMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuUGx1Z2luIi8+CisgCSAgICA8IS0tIGNvcHkgamF4YiBzb3VyY2VzIGZpbGVzIHJlcXVpcmVkIGZvciBqYXhiIHRvb2wgdGltZSAtLT4JCisgICAgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9L2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3J1bnRpbWUiLz4KKyAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfS9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9ydW50aW1lIj4KKyAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5jbGFzc2VzLmRpcn0vY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcnVudGltZSIKKyAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzPSIqKi8qLmphdmEiCisgICAgICAgICAgICAgICAgICAgICBleGNsdWRlcz0iKiovKi5wYWNrYWdlLmh0bWwiLz4KKyAgICAgICAgICAgIDwvY29weT4KICAgICA8L3RhcmdldD4KIAogICAgIDx0YXJnZXQgbmFtZT0iLWRlZnMtcHN0cmlwIj4KZGlmZiAtLWdpdCBhL2pheHdzL21ha2UvanBydC5wcm9wZXJ0aWVzIGIvamF4d3MvbWFrZS9qcHJ0LnByb3BlcnRpZXMKaW5kZXggMjZmZmQ2MS4uZjc1ODcxZCAxMDA2NDQKLS0tIGEvamF4d3MvbWFrZS9qcHJ0LnByb3BlcnRpZXMKKysrIGIvamF4d3MvbWFrZS9qcHJ0LnByb3BlcnRpZXMKQEAgLTMyLDEzICszMiwxMyBAQAogc29sYXJpc19zcGFyY3Y5XzUuMTAsXAogc29sYXJpc19pNTg2XzUuMTAsXAogc29sYXJpc194NjRfNS4xMCxcCi1saW51eF9pNTg2LFwKLWxpbnV4X3g2NCxcCitsaW51eF9pNTg2XzIuNixcCitsaW51eF94NjRfMi42LFwKIHdpbmRvd3NfaTU4NixcCiB3aW5kb3dzX3g2NAogCiAjIFRoZSBkaWZmZXJlbnQgYnVpbGQgZmxhdm9ycyB3ZSB3YW50Ci1qcHJ0LmJ1aWxkLmZsYXZvcnM9cHJvZHVjdAoranBydC5idWlsZC5mbGF2b3JzPXByb2R1Y3QsZmFzdGRlYnVnCiAKICMgRXhwbGljaXRseSBkZXNpZ25hdGUgd2hhdCB0aGUgMzJiaXQgbWF0Y2ggaXMgZm9yIHRoZSA2NGJpdCBidWlsZAoganBydC5zb2xhcmlzX3NwYXJjdjkuYnVpbGQucGxhdGZvcm0ubWF0Y2gzMj1zb2xhcmlzX3NwYXJjXzUuMTAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vYWN0aXZhdGlvbi9yZWdpc3RyaWVzL01haWxjYXBGaWxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2FjdGl2YXRpb24vcmVnaXN0cmllcy9NYWlsY2FwRmlsZS5qYXZhCmluZGV4IDZlNWU2YTYuLjVmZDI2ODYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vYWN0aXZhdGlvbi9yZWdpc3RyaWVzL01haWxjYXBGaWxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9hY3RpdmF0aW9uL3JlZ2lzdHJpZXMvTWFpbGNhcEZpbGUuamF2YQpAQCAtMTgyLDcgKzE4Miw4IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldE5hdGl2ZUNvbW1hbmRzKFN0cmluZyBtaW1lX3R5cGUpIHsKICAgICAgICAgU3RyaW5nW10gY21kcyA9IG51bGw7Ci0gICAgICAgIExpc3QgdiA9IChMaXN0KW5hdGl2ZV9jb21tYW5kcy5nZXQobWltZV90eXBlLnRvTG93ZXJDYXNlKCkpOworICAgICAgICBMaXN0IHYgPQorICAgICAgICAgICAgKExpc3QpbmF0aXZlX2NvbW1hbmRzLmdldChtaW1lX3R5cGUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsKICAgICAgICAgaWYgKHYgIT0gbnVsbCkgewogICAgICAgICAgICAgY21kcyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOwogICAgICAgICAgICAgY21kcyA9IChTdHJpbmdbXSl2LnRvQXJyYXkoY21kcyk7CkBAIC0zMDEsNyArMzAyLDggQEAKICAgICAgICAgICAgIHJlcG9ydFBhcnNlRXJyb3IoTWFpbGNhcFRva2VuaXplci5TVFJJTkdfVE9LRU4sIGN1cnJlbnRUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXIuZ2V0Q3VycmVudFRva2VuVmFsdWUoKSk7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHByaW1hcnlUeXBlID0gdG9rZW5pemVyLmdldEN1cnJlbnRUb2tlblZhbHVlKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgU3RyaW5nIHByaW1hcnlUeXBlID0KKyAgICAgICAgICAgIHRva2VuaXplci5nZXRDdXJyZW50VG9rZW5WYWx1ZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKICAgICAgICAgU3RyaW5nIHN1YlR5cGUgPSAiKiI7CiAKICAgICAgICAgLy8gICAgICBwYXJzZSB0aGUgJy8nIGJldHdlZW4gcHJpbWFyeSBhbmQgc3ViCkBAIC0zMjIsNyArMzI0LDggQEAKICAgICAgICAgICAgICAgICByZXBvcnRQYXJzZUVycm9yKE1haWxjYXBUb2tlbml6ZXIuU1RSSU5HX1RPS0VOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiwgdG9rZW5pemVyLmdldEN1cnJlbnRUb2tlblZhbHVlKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3ViVHlwZSA9IHRva2VuaXplci5nZXRDdXJyZW50VG9rZW5WYWx1ZSgpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBzdWJUeXBlID0KKyAgICAgICAgICAgICAgICB0b2tlbml6ZXIuZ2V0Q3VycmVudFRva2VuVmFsdWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAKICAgICAgICAgICAgIC8vICBnZXQgdGhlIG5leHQgdG9rZW4gdG8gc2ltcGxpZnkgdGhlIG5leHQgc3RlcAogICAgICAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwpAQCAtMzg2LDggKzM4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFBhcnNlRXJyb3IoTWFpbGNhcFRva2VuaXplci5TVFJJTkdfVE9LRU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLCB0b2tlbml6ZXIuZ2V0Q3VycmVudFRva2VuVmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPQotICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXIuZ2V0Q3VycmVudFRva2VuVmFsdWUoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSB0b2tlbml6ZXIuZ2V0Q3VycmVudFRva2VuVmFsdWUoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKIAogICAgICAgICAgICAgICAgIC8vICAgICAgcGFyc2UgdGhlICc9JyB3aGljaCBzZXBhcmF0ZXMgdGhlIG5hbWUgZnJvbSB0aGUgdmFsdWUKICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9DbGFzc1R5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0NsYXNzVHlwZS5qYXZhCmluZGV4IDc5NDM3MDEuLjg0NWZiZGIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0NsYXNzVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0NsYXNzVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIC8qKgogICogVGhpcyBoZWxwcyBlbmFibGUgd2hldGhlciB0aGUgSkRlZmluZWRDbGFzcyBpcyBhIENsYXNzIG9yIEludGVyZmFjZSBvcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvQ29kZVdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvQ29kZVdyaXRlci5qYXZhCmluZGV4IDllMjE3NGQuLjYwMmU4ZWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0NvZGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9Db2RlV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm5vdGF0YWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRhYmxlLmphdmEKaW5kZXggMWM5ZTU4MC4uYzQyMjk3YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRhYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRhYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm5vdGF0aW9uQXJyYXlNZW1iZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm5vdGF0aW9uQXJyYXlNZW1iZXIuamF2YQppbmRleCAxMmQ2ODI4Li4wMWI3NjZmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQW5ub3RhdGlvbkFycmF5TWVtYmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRpb25BcnJheU1lbWJlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQW5ub3RhdGlvblN0cmluZ1ZhbHVlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQW5ub3RhdGlvblN0cmluZ1ZhbHVlLmphdmEKaW5kZXggZjdiYzVlYS4uMDdjZDQ0ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRpb25TdHJpbmdWYWx1ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm5vdGF0aW9uU3RyaW5nVmFsdWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWw7CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRpb25Vc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm5vdGF0aW9uVXNlLmphdmEKaW5kZXggZGYyZDkwYy4uMWU5ZjhjNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRpb25Vc2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQW5ub3RhdGlvblVzZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQW5ub3RhdGlvblZhbHVlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQW5ub3RhdGlvblZhbHVlLmphdmEKaW5kZXggNzdlNjFjZS4uYTY2YmU2MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRpb25WYWx1ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm5vdGF0aW9uVmFsdWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRpb25Xcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm5vdGF0aW9uV3JpdGVyLmphdmEKaW5kZXggNDI2ZWJkNS4uODNmZTcxNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFubm90YXRpb25Xcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQW5ub3RhdGlvbldyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQW5vbnltb3VzQ2xhc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm9ueW1vdXNDbGFzcy5qYXZhCmluZGV4IDZhODcyN2QuLjQ0MGQ0MDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm9ueW1vdXNDbGFzcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBbm9ueW1vdXNDbGFzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQXJyYXkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBcnJheS5qYXZhCmluZGV4IGE5ZDBlZmQuLmQxMGRhNDQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBcnJheS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBcnJheS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBcnJheUNsYXNzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQXJyYXlDbGFzcy5qYXZhCmluZGV4IGI2OTM0YzkuLmQ4NmQwODYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBcnJheUNsYXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFycmF5Q2xhc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQXJyYXlDb21wUmVmLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQXJyYXlDb21wUmVmLmphdmEKaW5kZXggODdlNzhkZC4uNmE0MzNjMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFycmF5Q29tcFJlZi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBcnJheUNvbXBSZWYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQXNzaWdubWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFzc2lnbm1lbnQuamF2YQppbmRleCBkNWExOTM0Li45MWJmYTU3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQXNzaWdubWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBc3NpZ25tZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFzc2lnbm1lbnRUYXJnZXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBc3NpZ25tZW50VGFyZ2V0LmphdmEKaW5kZXggNzUzNjhhMy4uZjM1MjQ5OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkFzc2lnbm1lbnRUYXJnZXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQXNzaWdubWVudFRhcmdldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBdG9tLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQXRvbS5qYXZhCmluZGV4IGZlN2JiMzYuLmU0Zjk1NjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pBdG9tLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkF0b20uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQmxvY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pCbG9jay5qYXZhCmluZGV4IGM2NGI1ZTkuLjU3ZDc1NTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pCbG9jay5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pCbG9jay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyMCwxNiArMjIwLDE0IEBACiAgICAgICogQHJldHVybiBOZXdseSBnZW5lcmF0ZWQgSkludm9jYXRpb24KICAgICAgKi8KICAgICBwdWJsaWMgSkludm9jYXRpb24gaW52b2tlKEpFeHByZXNzaW9uIGV4cHIsIEpNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UoZXhwciwgbWV0aG9kLm5hbWUoKSk7CisgICAgICAgIHJldHVybiBpbnNlcnQobmV3IEpJbnZvY2F0aW9uKGV4cHIsIG1ldGhvZCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBzdGF0aWMgaW52b2NhdGlvbiBzdGF0ZW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIEpJbnZvY2F0aW9uIHN0YXRpY0ludm9rZShKQ2xhc3MgdHlwZSwgU3RyaW5nIG1ldGhvZCkgewotICAgICAgICBKSW52b2NhdGlvbiBpID0gbmV3IEpJbnZvY2F0aW9uKHR5cGUsIG1ldGhvZCk7Ci0gICAgICAgIGluc2VydChpKTsKLSAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIHJldHVybiBpbnNlcnQobmV3IEpJbnZvY2F0aW9uKHR5cGUsIG1ldGhvZCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjQxLDkgKzIzOSw3IEBACiAgICAgICogQHJldHVybiBOZXdseSBnZW5lcmF0ZWQgSkludm9jYXRpb24KICAgICAgKi8KICAgICBwdWJsaWMgSkludm9jYXRpb24gaW52b2tlKFN0cmluZyBtZXRob2QpIHsKLSAgICAgICAgSkludm9jYXRpb24gaSA9IG5ldyBKSW52b2NhdGlvbigoSkV4cHJlc3Npb24pbnVsbCwgbWV0aG9kKTsKLSAgICAgICAgaW5zZXJ0KGkpOwotICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgcmV0dXJuIGluc2VydChuZXcgSkludm9jYXRpb24oKEpFeHByZXNzaW9uKW51bGwsIG1ldGhvZCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjU1LDcgKzI1MSw3IEBACiAgICAgICogQHJldHVybiBOZXdseSBnZW5lcmF0ZWQgSkludm9jYXRpb24KICAgICAgKi8KICAgICBwdWJsaWMgSkludm9jYXRpb24gaW52b2tlKEpNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UobWV0aG9kLm5hbWUoKSk7CisgICAgICAgIHJldHVybiBpbnNlcnQobmV3IEpJbnZvY2F0aW9uKChKRXhwcmVzc2lvbiludWxsLCBtZXRob2QpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pCcmVhay5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkJyZWFrLmphdmEKaW5kZXggNmQ4MjI3NS4uZTRkZjhiZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkJyZWFrLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkJyZWFrLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDYXNlLmphdmEKaW5kZXggM2I0MTUwMy4uMjdhNGMzMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNhc2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ2FzZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ2FzdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNhc3QuamF2YQppbmRleCBkODQwYjQ5Li5iNDI3NTI2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ2FzdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDYXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNhdGNoQmxvY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDYXRjaEJsb2NrLmphdmEKaW5kZXggNzMxZTBiMy4uYTdjMzEyMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNhdGNoQmxvY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ2F0Y2hCbG9jay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDbGFzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNsYXNzLmphdmEKaW5kZXggZDRiN2E5ZC4uYmJmZDRhYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNsYXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzIxLDcgKzMyMSw3IEBACiAKICAgICAvKiogR2VuZXJhdGVzIGEgc3RhdGljIG1ldGhvZCBpbnZvY2F0aW9uLiAqLwogICAgIHB1YmxpYyBmaW5hbCBKSW52b2NhdGlvbiBzdGF0aWNJbnZva2UoSk1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY0ludm9rZShtZXRob2QubmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBKSW52b2NhdGlvbih0aGlzLG1ldGhvZCk7CiAgICAgfQogCiAgICAgLyoqIEdlbmVyYXRlcyBhIHN0YXRpYyBtZXRob2QgaW52b2NhdGlvbi4gKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQppbmRleCAyMWI5NTExLi44NTBjZmU4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ2xhc3NBbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNsYXNzQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ2xhc3NDb250YWluZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDbGFzc0NvbnRhaW5lci5qYXZhCmluZGV4IDQzY2YyNGMuLjZmMGU3NmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDbGFzc0NvbnRhaW5lci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDbGFzc0NvbnRhaW5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTE0Niw3ICsxNDUsNiBAQAogICAgICAqICAgICAgbmV3bHkgY3JlYXRlZCBBbm5vdGF0aW9uIFR5cGUgRGVjbGFyYXRpb24KICAgICAgKiBAZXhjZXB0aW9uIEpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb24KICAgICAgKiAgICAgIFdoZW4gdGhlIHNwZWNpZmllZCBjbGFzcy9pbnRlcmZhY2Ugd2FzIGFscmVhZHkgY3JlYXRlZC4KLQogICAgICAqLwogICAgIHB1YmxpYyBKRGVmaW5lZENsYXNzIF9hbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKFN0cmluZyBuYW1lKSB0aHJvd3MgSkNsYXNzQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbjsKIApAQCAtMTU4LDcgKzE1Niw2IEBACiAgICAgICogICAgICBuZXdseSBjcmVhdGVkIEVudW0KICAgICAgKiBAZXhjZXB0aW9uIEpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb24KICAgICAgKiAgICAgIFdoZW4gdGhlIHNwZWNpZmllZCBjbGFzcy9pbnRlcmZhY2Ugd2FzIGFscmVhZHkgY3JlYXRlZC4KLQogICAgICAqLwogICAgIHB1YmxpYyBKRGVmaW5lZENsYXNzIF9lbnVtIChTdHJpbmcgbmFtZSkgdGhyb3dzIEpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDb2RlTW9kZWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pDb2RlTW9kZWwuamF2YQppbmRleCAyNTc5MWUwLi4xZjY3NDQxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29kZU1vZGVsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNvZGVNb2RlbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ0NiwxMyArNDQ2LDI5IEBACiAKICAgICAgICAgICAgIEpDbGFzcyBjbGF6eiA9IHJlZihzLnN1YnN0cmluZyhzdGFydCxpZHgpKTsKIAorICAgICAgICAgICAgcmV0dXJuIHBhcnNlU3VmZml4KGNsYXp6KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZXMgYWRkaXRpb25hbCBsZWZ0LWFzc29jaWF0aXZlIHN1ZmZpeGVzLCBsaWtlIHR5cGUgYXJndW1lbnRzCisgICAgICAgICAqIGFuZCBhcnJheSBzcGVjaWZpZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBKQ2xhc3MgcGFyc2VTdWZmaXgoSkNsYXNzIGNsYXp6KSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZihpZHg9PXMubGVuZ3RoKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6OyAvLyBoaXQgRU9MCiAKICAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpZHgpOwogCiAgICAgICAgICAgICBpZihjaD09JzwnKQotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUFyZ3VtZW50cyhjbGF6eik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU3VmZml4KHBhcnNlQXJndW1lbnRzKGNsYXp6KSk7CisKKyAgICAgICAgICAgIGlmKGNoPT0nWycpIHsKKyAgICAgICAgICAgICAgICBpZihzLmNoYXJBdChpZHgrMSk9PSddJykgeworICAgICAgICAgICAgICAgICAgICBpZHgrPTI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVN1ZmZpeChjbGF6ei5hcnJheSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXhwZWN0ZWQgJ10nIGJ1dCBmb3VuZCAiK3Muc3Vic3RyaW5nKGlkeCsxKSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBjbGF6ejsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNvbW1lbnRQYXJ0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29tbWVudFBhcnQuamF2YQppbmRleCAzMDAxYjNjLi5lZmQ3ZWRkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29tbWVudFBhcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29tbWVudFBhcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNvbmRpdGlvbmFsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29uZGl0aW9uYWwuamF2YQppbmRleCA1ODUzNGY0Li45ZTAxMTE4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29uZGl0aW9uYWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29uZGl0aW9uYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC03NSw2ICs3NSwxMyBAQAogICAgICAgICByZXR1cm4gX2Vsc2U7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyA8dHQ+Li4uIGVsc2UgaWYoLi4uKSAuLi48L3R0PiBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBKQ29uZGl0aW9uYWwgX2Vsc2VpZihKRXhwcmVzc2lvbiBib29sRXhwKSB7CisgICAgICAgIHJldHVybiBfZWxzZSgpLl9pZihib29sRXhwKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzdGF0ZShKRm9ybWF0dGVyIGYpIHsKICAgICAgICAgaWYodGVzdD09SkV4cHIuVFJVRSkgewogICAgICAgICAgICAgX3RoZW4uZ2VuZXJhdGVCb2R5KGYpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkNvbnRpbnVlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29udGludWUuamF2YQppbmRleCBiYzQ5ZjgxLi5mZTg5ZDdkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29udGludWUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KQ29udGludWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRGVjbGFyYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDc5ZGRiZTEuLjUwZWFhMWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pEZWNsYXJhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pEZWZpbmVkQ2xhc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pEZWZpbmVkQ2xhc3MuamF2YQppbmRleCBiOTVlNDE1Li5mZjIyZmFlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRGVmaW5lZENsYXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkRlZmluZWRDbGFzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1MSw2ICsyNTEsMTMgQEAKICAgICAgICAgaWYgKHN1cGVyQ2xhc3MgPT0gbnVsbCkKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogCisgICAgICAgIGZvciggSkNsYXNzIG89c3VwZXJDbGFzcy5vdXRlcigpOyBvIT1udWxsOyBvPW8ub3V0ZXIoKSApeworICAgICAgICAgICAgaWYodGhpcz09byl7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBjbGFzcyBpbmhlcml0YW5jZSBsb29wLiIgKworICAgICAgICAgICAgICAgICIgIE91dGVyIGNsYXNzICIgKyB0aGlzLm5hbWUgKyAiIG1heSBub3Qgc3ViY2xhc3MgZnJvbSBpbm5lciBjbGFzczogIiArIG8ubmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHRoaXMuc3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3M7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KQEAgLTMwNyw4ICszMTQsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyByZWZlcmVuY2UgdG8gdGhlIEpFbnVtQ29uc3RhbnQgaW4KLSAgICAgKiB0aGUgY2xhc3MKKyAgICAgKiBJZiB0aGUgbmFtZWQgZW51bSBhbHJlYWR5IGV4aXN0cywgdGhlIHJlZmVyZW5jZSB0byBpdCBpcyByZXR1cm5lZC4KKyAgICAgKiBPdGhlcndpc2UgdGhpcyBtZXRob2QgZ2VuZXJhdGVzIGEgbmV3IGVudW0gcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuCisgICAgICogbmFtZSBhbmQgcmV0dXJucyBpdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50LgpAQCAtMzE2LDggKzMyNCwxMSBAQAogICAgICAqICAgICAgVGhlIGdlbmVyYXRlZCB0eXBlLXNhZmUgZW51bSBjb25zdGFudC4KICAgICAgKi8KICAgICBwdWJsaWMgSkVudW1Db25zdGFudCBlbnVtQ29uc3RhbnQoU3RyaW5nIG5hbWUpewotICAgICAgICBKRW51bUNvbnN0YW50IGVjID0gbmV3IEpFbnVtQ29uc3RhbnQodGhpcywgbmFtZSk7Ci0gICAgICAgIGVudW1Db25zdGFudHNCeU5hbWUucHV0KG5hbWUsIGVjKTsKKyAgICAgICAgSkVudW1Db25zdGFudCBlYyA9IGVudW1Db25zdGFudHNCeU5hbWUuZ2V0KG5hbWUpOworICAgICAgICBpZiAobnVsbCA9PSBlYykgeworICAgICAgICAgICAgZWMgPSBuZXcgSkVudW1Db25zdGFudCh0aGlzLCBuYW1lKTsKKyAgICAgICAgICAgIGVudW1Db25zdGFudHNCeU5hbWUucHV0KG5hbWUsIGVjKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gZWM7CiAgICAgfQogCkBAIC00MTcsNyArNDI4LDYgQEAKICAgICAgKiAgICAgIG5ld2x5IGNyZWF0ZWQgQW5ub3RhdGlvbiBUeXBlIERlY2xhcmF0aW9uCiAgICAgICogQGV4Y2VwdGlvbiBKQ2xhc3NBbHJlYWR5RXhpc3RzRXhjZXB0aW9uCiAgICAgICogICAgICBXaGVuIHRoZSBzcGVjaWZpZWQgY2xhc3MvaW50ZXJmYWNlIHdhcyBhbHJlYWR5IGNyZWF0ZWQuCi0KICAgICAgKi8KICAgICBwdWJsaWMgSkRlZmluZWRDbGFzcyBfYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgdGhyb3dzIEpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gX2NsYXNzIChKTW9kLlBVQkxJQyxuYW1lLENsYXNzVHlwZS5BTk5PVEFUSU9OX1RZUEVfREVDTCk7CkBAIC01NzYsNyArNTg2LDYgQEAKICAgICAgKiAgICAgIG51bGwgaWYgbm90IGZvdW5kLgogICAgICAqLwogICAgIHB1YmxpYyBKTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgSlR5cGVbXSBhcmdUeXBlcykgewotICAgICAgICBvdXRlciA6CiAgICAgICAgIGZvciAoSk1ldGhvZCBtIDogbWV0aG9kcykgewogICAgICAgICAgICAgaWYgKCFtLm5hbWUoKS5lcXVhbHMobmFtZSkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC03NDAsOCArNzQ5LDggQEAKICAgICAgICAgICAgIGYubmwoKS5nKGpkb2MpOwogCiAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKXsKLSAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxhbm5vdGF0aW9ucy5zaXplKCk7IGkrKyApCi0gICAgICAgICAgICAgICAgZi5nKGFubm90YXRpb25zLmdldChpKSkubmwoKTsKKyAgICAgICAgICAgIGZvciAoSkFubm90YXRpb25Vc2UgYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKQorICAgICAgICAgICAgICAgIGYuZyhhbm5vdGF0aW9uKS5ubCgpOwogICAgICAgICB9CiAKICAgICAgICAgZi5nKG1vZHMpLnAoY2xhc3NUeXBlLmRlY2xhcmF0aW9uVG9rZW4pLmlkKG5hbWUpLmQoZ2VuZXJpZmlhYmxlKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pEaXJlY3RDbGFzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkRpcmVjdENsYXNzLmphdmEKaW5kZXggMGEzNTVlNC4uNWFlODMwMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkRpcmVjdENsYXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkRpcmVjdENsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkRvTG9vcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkRvTG9vcC5qYXZhCmluZGV4IGE3Y2U0YTAuLmU3NmIwNjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pEb0xvb3AuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRG9Mb29wLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkRvY0NvbW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pEb2NDb21tZW50LmphdmEKaW5kZXggMmJjYTU0ZS4uYWFkYjViMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkRvY0NvbW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRG9jQ29tbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkVudW1Db25zdGFudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkVudW1Db25zdGFudC5qYXZhCmluZGV4IDYzZGRlNjIuLjFmNjljMmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pFbnVtQ29uc3RhbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRW51bUNvbnN0YW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pFeHByLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRXhwci5qYXZhCmluZGV4IDRhZTJmOTkuLjI3ZmU0NjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pFeHByLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkV4cHIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01NywxMSArNTcsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEpJbnZvY2F0aW9uIGludm9rZShKTWV0aG9kIG1ldGhvZCkgewotICAgICAgICByZXR1cm4gbmV3IEpJbnZvY2F0aW9uKChKRXhwcmVzc2lvbiludWxsLG1ldGhvZC5uYW1lKCkpOworICAgICAgICByZXR1cm4gbmV3IEpJbnZvY2F0aW9uKChKRXhwcmVzc2lvbiludWxsLG1ldGhvZCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBKSW52b2NhdGlvbiBpbnZva2UoSkV4cHJlc3Npb24gbGhzLCBKTWV0aG9kIG1ldGhvZCkgewotICAgICAgICByZXR1cm4gbmV3IEpJbnZvY2F0aW9uKGxocywgbWV0aG9kLm5hbWUoKSk7CisgICAgICAgIHJldHVybiBuZXcgSkludm9jYXRpb24obGhzLCBtZXRob2QpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgSkludm9jYXRpb24gaW52b2tlKEpFeHByZXNzaW9uIGxocywgU3RyaW5nIG1ldGhvZCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkV4cHJlc3Npb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pFeHByZXNzaW9uLmphdmEKaW5kZXggZTk4NzNiNS4uNzBmNDg0NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkV4cHJlc3Npb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pFeHByZXNzaW9uSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkV4cHJlc3Npb25JbXBsLmphdmEKaW5kZXggOGNkY2IwNi4uOWViMTg4ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkV4cHJlc3Npb25JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkV4cHJlc3Npb25JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pGaWVsZFJlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkZpZWxkUmVmLmphdmEKaW5kZXggMTc3MzdjNC4uZmFlMGU4MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkZpZWxkUmVmLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkZpZWxkUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkZpZWxkVmFyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRmllbGRWYXIuamF2YQppbmRleCBmN2IyYjI2Li42NTAyM2M0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRmllbGRWYXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRmllbGRWYXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRm9yRWFjaC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkZvckVhY2guamF2YQppbmRleCBkMjg2MGEyLi5mZDdjMWJkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRm9yRWFjaC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pGb3JFYWNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiAvKioKQEAgLTM0LDE3ICszMywxNyBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSkZvckVhY2ggaW1wbGVtZW50cyBKU3RhdGVtZW50IHsKIAotICAgICAgICBwcml2YXRlIGZpbmFsIEpUeXBlIHR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhcjsKLSAgICAgICAgcHJpdmF0ZSBKQmxvY2sgYm9keSA9IG51bGw7IC8vIGxhemlseSBjcmVhdGVkCi0gICAgICAgIHByaXZhdGUgZmluYWwgSkV4cHJlc3Npb24gY29sbGVjdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIEpUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFyOworICAgIHByaXZhdGUgSkJsb2NrIGJvZHkgPSBudWxsOyAvLyBsYXppbHkgY3JlYXRlZAorICAgIHByaXZhdGUgZmluYWwgSkV4cHJlc3Npb24gY29sbGVjdGlvbjsKICAgICBwcml2YXRlIGZpbmFsIEpWYXIgbG9vcFZhcjsKIAotICAgICAgICBwdWJsaWMgSkZvckVhY2goSlR5cGUgdmFydHlwZSwgU3RyaW5nIHZhcmlhYmxlLCBKRXhwcmVzc2lvbiBjb2xsZWN0aW9uKSB7CisgICAgcHVibGljIEpGb3JFYWNoKEpUeXBlIHZhcnR5cGUsIFN0cmluZyB2YXJpYWJsZSwgSkV4cHJlc3Npb24gY29sbGVjdGlvbikgewogCi0gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdmFydHlwZTsKLSAgICAgICAgICAgICAgICB0aGlzLnZhciA9IHZhcmlhYmxlOwotICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CisgICAgICAgIHRoaXMudHlwZSA9IHZhcnR5cGU7CisgICAgICAgIHRoaXMudmFyID0gdmFyaWFibGU7CisgICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CiAgICAgICAgIGxvb3BWYXIgPSBuZXcgSlZhcihKTW9kcy5mb3JWYXIoSk1vZC5OT05FKSwgdHlwZSwgdmFyLCBjb2xsZWN0aW9uKTsKICAgICB9CiAKQEAgLTUyLDI0ICs1MSwyNCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxvb3AgdmFyaWFibGUuCiAgICAgICovCi0gICAgICAgIHB1YmxpYyBKVmFyIHZhcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbG9vcFZhcjsKLSAgICAgICAgfQorICAgIHB1YmxpYyBKVmFyIHZhcigpIHsKKyAgICAgICAgcmV0dXJuIGxvb3BWYXI7CisgICAgfQogCi0gICAgICAgIHB1YmxpYyBKQmxvY2sgYm9keSgpIHsKLSAgICAgICAgICAgICAgICBpZiAoYm9keSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IG5ldyBKQmxvY2soKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYm9keTsKLSAgICAgICAgfQorICAgIHB1YmxpYyBKQmxvY2sgYm9keSgpIHsKKyAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkKKyAgICAgICAgICAgIGJvZHkgPSBuZXcgSkJsb2NrKCk7CisgICAgICAgIHJldHVybiBib2R5OworICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzdGF0ZShKRm9ybWF0dGVyIGYpIHsKLSAgICAgICAgICAgICAgICBmLnAoImZvciAoIik7Ci0gICAgICAgICAgICAgICAgZi5nKHR5cGUpLmlkKHZhcikucCgiOiAiKS5nKGNvbGxlY3Rpb24pOwotICAgICAgICAgICAgICAgIGYucCgnKScpOwotICAgICAgICAgICAgICAgIGlmIChib2R5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBmLmcoYm9keSkubmwoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmLnAoJzsnKS5ubCgpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgc3RhdGUoSkZvcm1hdHRlciBmKSB7CisgICAgICAgIGYucCgiZm9yICgiKTsKKyAgICAgICAgZi5nKHR5cGUpLmlkKHZhcikucCgiOiAiKS5nKGNvbGxlY3Rpb24pOworICAgICAgICBmLnAoJyknKTsKKyAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkKKyAgICAgICAgICAgIGYuZyhib2R5KS5ubCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmLnAoJzsnKS5ubCgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkZvckxvb3AuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pGb3JMb29wLmphdmEKaW5kZXggYjM2YjA3Zi4uMTY3NDg1MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkZvckxvb3AuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRm9yTG9vcC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pGb3JtYXR0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pGb3JtYXR0ZXIuamF2YQppbmRleCBkN2I3Nzc3Li5hN2E5OTgzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KRm9ybWF0dGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkZvcm1hdHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pHZW5lcmFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pHZW5lcmFibGUuamF2YQppbmRleCAwMGJlZDU1Li45NTA3MWEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KR2VuZXJhYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkdlbmVyYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pHZW5lcmlmaWFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pHZW5lcmlmaWFibGUuamF2YQppbmRleCA4NDliMDU3Li5lOGM1Y2YyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KR2VuZXJpZmlhYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkdlbmVyaWZpYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KR2VuZXJpZmlhYmxlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkdlbmVyaWZpYWJsZUltcGwuamF2YQppbmRleCAwNjIzNDU3Li44ZmFiZTcwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KR2VuZXJpZmlhYmxlSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pHZW5lcmlmaWFibGVJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pJbnZvY2F0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KSW52b2NhdGlvbi5qYXZhCmluZGV4IDFlNWI4N2YuLmE5NDFjZjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pJbnZvY2F0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkludm9jYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00MSwxMCArNDEsMTUgQEAKICAgICBwcml2YXRlIEpHZW5lcmFibGUgb2JqZWN0OwogCiAgICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQKKyAgICAgKiBOYW1lIG9mIHRoZSBtZXRob2QgdG8gYmUgaW52b2tlZC4KKyAgICAgKiBFaXRoZXIgdGhpcyBmaWVsZCBpcyBzZXQsIG9yIHtAbGluayAjbWV0aG9kfSwgb3Ige0BsaW5rICN0eXBlfSAoaW4gd2hpY2ggY2FzZSBpdCdzIGEKKyAgICAgKiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLikKKyAgICAgKiBUaGlzIGFsbG93cyB7QGxpbmsgSk1ldGhvZCNuYW1lKFN0cmluZykgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSBjaGFuZ2VkIGxhdGVyfS4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwogCisgICAgcHJpdmF0ZSBKTWV0aG9kIG1ldGhvZDsKKwogICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbnN0cnVjdG9yID0gZmFsc2U7CiAKICAgICAvKioKQEAgLTcyLDYgKzc3LDEwIEBACiAgICAgICAgIHRoaXMoIChKR2VuZXJhYmxlKW9iamVjdCwgbmFtZSApOwogICAgIH0KIAorICAgIEpJbnZvY2F0aW9uKEpFeHByZXNzaW9uIG9iamVjdCwgSk1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgdGhpcyggKEpHZW5lcmFibGUpb2JqZWN0LCBtZXRob2QgKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBJbnZva2VzIGEgc3RhdGljIG1ldGhvZCBvbiBhIGNsYXNzLgogICAgICAqLwpAQCAtNzksMTQgKzg4LDIyIEBACiAgICAgICAgIHRoaXMoIChKR2VuZXJhYmxlKXR5cGUsIG5hbWUgKTsKICAgICB9CiAKKyAgICBKSW52b2NhdGlvbihKQ2xhc3MgdHlwZSwgSk1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgdGhpcyggKEpHZW5lcmFibGUpdHlwZSwgbWV0aG9kICk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBKSW52b2NhdGlvbihKR2VuZXJhYmxlIG9iamVjdCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7CiAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSA+PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSkNsYXNzIG5hbWUgY29udGFpbnMgJy4nOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2QgbmFtZSBjb250YWlucyAnLic6ICIgKyBuYW1lKTsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICB9CiAKKyAgICBwcml2YXRlIEpJbnZvY2F0aW9uKEpHZW5lcmFibGUgb2JqZWN0LCBKTWV0aG9kIG1ldGhvZCkgeworICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKKyAgICAgICAgdGhpcy5tZXRob2QgPW1ldGhvZDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBJbnZva2VzIGEgY29uc3RydWN0b3Igb2YgYW4gb2JqZWN0IChpLmUuLCBjcmVhdGVzCiAgICAgICogYSBuZXcgb2JqZWN0LikKQEAgLTEzMSwxMCArMTQ4LDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvcikKICAgICAgICAgICAgICAgICBmLnAoIm5ldyIpLmcodHlwZSkucCgnKCcpOwotICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZi5nKG9iamVjdCkucCgnLicpLnAobmFtZSkucCgnKCcpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGYuaWQobmFtZSkucCgnKCcpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB0aGlzLm5hbWU7CisgICAgICAgICAgICAgICAgaWYobmFtZT09bnVsbCkgIG5hbWU9dGhpcy5tZXRob2QubmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBmLmcob2JqZWN0KS5wKCcuJykucChuYW1lKS5wKCcoJyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmLmlkKG5hbWUpLnAoJygnKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGYuZyhhcmdzKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pKYXZhTmFtZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkphdmFOYW1lLmphdmEKaW5kZXggM2NmMmM4Ny4uNmI1NmU5MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkphdmFOYW1lLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkphdmFOYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTIsNiArNTIsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIGZ1bGx5IHF1YWxpZmllZCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBpc0phdmFQYWNrYWdlTmFtZShzKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIEphdmEgcGFja2FnZSBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFQYWNrYWdlTmFtZShTdHJpbmcgcykgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSkxhYmVsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTGFiZWwuamF2YQppbmRleCA4NGE0YjU3Li5lNDZiYTNkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTGFiZWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTGFiZWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSk1ldGhvZC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSk1ldGhvZC5qYXZhCmluZGV4IDEzYzNjOGIuLmIzZDlmNjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pNZXRob2QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTWV0aG9kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzgsNDkgKzM4LDQ5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBKTWV0aG9kIGV4dGVuZHMgSkdlbmVyaWZpYWJsZUltcGwgaW1wbGVtZW50cyBKRGVjbGFyYXRpb24sIEpBbm5vdGF0YWJsZSB7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1vZGlmaWVycyBmb3IgdGhpcyBtZXRob2QKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSk1vZHMgbW9kczsKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcnMgZm9yIHRoaXMgbWV0aG9kCisgICAgICovCisgICAgcHJpdmF0ZSBKTW9kcyBtb2RzOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdHlwZSBmb3IgdGhpcyBtZXRob2QKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSlR5cGUgdHlwZSA9IG51bGw7CisgICAgLyoqCisgICAgICogUmV0dXJuIHR5cGUgZm9yIHRoaXMgbWV0aG9kCisgICAgICovCisgICAgcHJpdmF0ZSBKVHlwZSB0eXBlID0gbnVsbDsKIAotICAgICAgICAvKioKLSAgICAgICAgICogTmFtZSBvZiB0aGlzIG1ldGhvZAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGlzIG1ldGhvZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMaXN0IG9mIHBhcmFtZXRlcnMgZm9yIHRoaXMgbWV0aG9kJ3MgZGVjbGFyYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxKVmFyPiBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0PEpWYXI+KCk7CisgICAgLyoqCisgICAgICogTGlzdCBvZiBwYXJhbWV0ZXJzIGZvciB0aGlzIG1ldGhvZCdzIGRlY2xhcmF0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEpWYXI+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8SlZhcj4oKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBtYXkgdGhyb3cuCisgICAgLyoqCisgICAgICogU2V0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBtYXkgdGhyb3cuCiAgICAgICogQSBzZXQgaW5zdGFuY2UgbGF6aWx5IGNyZWF0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNldDxKQ2xhc3M+IF90aHJvd3M7CisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8SkNsYXNzPiBfdGhyb3dzOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBKQmxvY2sgb2Ygc3RhdGVtZW50cyB0aGF0IG1ha2VzIHVwIHRoZSBib2R5IHRoaXMgbWV0aG9kCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIEpCbG9jayBib2R5ID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBKQmxvY2sgb2Ygc3RhdGVtZW50cyB0aGF0IG1ha2VzIHVwIHRoZSBib2R5IHRoaXMgbWV0aG9kCisgICAgICovCisgICAgcHJpdmF0ZSBKQmxvY2sgYm9keSA9IG51bGw7CiAKLSAgICAgICAgcHJpdmF0ZSBKRGVmaW5lZENsYXNzIG91dGVyOworICAgIHByaXZhdGUgSkRlZmluZWRDbGFzcyBvdXRlcjsKIAotICAgICAgICAvKioKLSAgICAgICAgICogamF2YWRvYyBjb21tZW50cyBmb3IgdGhpcyBKTWV0aG9kCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIEpEb2NDb21tZW50IGpkb2MgPSBudWxsOworICAgIC8qKgorICAgICAqIGphdmFkb2MgY29tbWVudHMgZm9yIHRoaXMgSk1ldGhvZAorICAgICAqLworICAgIHByaXZhdGUgSkRvY0NvbW1lbnQgamRvYyA9IG51bGw7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFZhcmlhYmxlIHBhcmFtZXRlciBmb3IgdGhpcyBtZXRob2QncyB2YXJhcmdzIGRlY2xhcmF0aW9uCi0gICAgICAgICAqIGludHJvZHVjZWQgaW4gSjJTRSAxLjUKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSlZhciB2YXJQYXJhbSA9IG51bGw7CisgICAgLyoqCisgICAgICogVmFyaWFibGUgcGFyYW1ldGVyIGZvciB0aGlzIG1ldGhvZCdzIHZhcmFyZ3MgZGVjbGFyYXRpb24KKyAgICAgKiBpbnRyb2R1Y2VkIGluIEoyU0UgMS41CisgICAgICovCisgICAgcHJpdmF0ZSBKVmFyIHZhclBhcmFtID0gbnVsbDsKIAogICAgIC8qKgogICAgICAqIEFubm90YXRpb25zIG9uIHRoaXMgdmFyaWFibGUuIExhemlseSBjcmVhdGVkLgpAQCAtODgsOSArODgsOSBAQAogICAgIHByaXZhdGUgTGlzdDxKQW5ub3RhdGlvblVzZT4gYW5ub3RhdGlvbnMgPSBudWxsOwogCiAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gbnVsbDsKLSAgICAgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBudWxsOworICAgIH0KIAogICAgIC8qKiBUbyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQogICAgICAqICBhbm5vdGF0aW9uIG1lbWJlcgpAQCAtOTgsNDAgKzk4LDQwIEBACiAgICAgcHJpdmF0ZSBKRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUgPSBudWxsOwogCiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEpNZXRob2QgY29uc3RydWN0b3IKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1vZHMKLSAgICAgICAgICogICAgICAgIE1vZGlmaWVycyBmb3IgdGhpcyBtZXRob2QncyBkZWNsYXJhdGlvbgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdHlwZQotICAgICAgICAgKiAgICAgICAgUmV0dXJuIHR5cGUgZm9yIHRoZSBtZXRob2QKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgICAgICogICAgICAgIE5hbWUgb2YgdGhpcyBtZXRob2QKLSAgICAgICAgICovCi0gICAgICAgIEpNZXRob2QoSkRlZmluZWRDbGFzcyBvdXRlciwgaW50IG1vZHMsIEpUeXBlIHR5cGUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2RzID0gSk1vZHMuZm9yTWV0aG9kKG1vZHMpOwotICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICB0aGlzLm91dGVyID0gb3V0ZXI7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBKTWV0aG9kIGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kcworICAgICAqICAgICAgICBNb2RpZmllcnMgZm9yIHRoaXMgbWV0aG9kJ3MgZGVjbGFyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgIFJldHVybiB0eXBlIGZvciB0aGUgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICBOYW1lIG9mIHRoaXMgbWV0aG9kCisgICAgICovCisgICAgSk1ldGhvZChKRGVmaW5lZENsYXNzIG91dGVyLCBpbnQgbW9kcywgSlR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5tb2RzID0gSk1vZHMuZm9yTWV0aG9kKG1vZHMpOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLm91dGVyID0gb3V0ZXI7CisgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbW9kcwotICAgICAgICAgKiAgICAgICAgTW9kaWZpZXJzIGZvciB0aGlzIGNvbnN0cnVjdG9yJ3MgZGVjbGFyYXRpb24KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIF9jbGFzcwotICAgICAgICAgKiAgICAgICAgSkNsYXNzIGNvbnRhaW5pbmcgdGhpcyBjb25zdHJ1Y3RvcgotICAgICAgICAgKi8KLSAgICAgICAgSk1ldGhvZChpbnQgbW9kcywgSkRlZmluZWRDbGFzcyBfY2xhc3MpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1vZHMgPSBKTW9kcy5mb3JNZXRob2QobW9kcyk7Ci0gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBfY2xhc3MubmFtZSgpOwotICAgICAgICAgICAgICAgIHRoaXMub3V0ZXIgPSBfY2xhc3M7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIG1vZHMKKyAgICAgKiAgICAgICAgTW9kaWZpZXJzIGZvciB0aGlzIGNvbnN0cnVjdG9yJ3MgZGVjbGFyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBfY2xhc3MKKyAgICAgKiAgICAgICAgSkNsYXNzIGNvbnRhaW5pbmcgdGhpcyBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIEpNZXRob2QoaW50IG1vZHMsIEpEZWZpbmVkQ2xhc3MgX2NsYXNzKSB7CisgICAgICAgIHRoaXMubW9kcyA9IEpNb2RzLmZvck1ldGhvZChtb2RzKTsKKyAgICAgICAgdGhpcy50eXBlID0gbnVsbDsKKyAgICAgICAgdGhpcy5uYW1lID0gX2NsYXNzLm5hbWUoKTsKKyAgICAgICAgdGhpcy5vdXRlciA9IF9jbGFzczsKKyAgICB9CiAKICAgICBwcml2YXRlIFNldDxKQ2xhc3M+IGdldFRocm93cygpIHsKICAgICAgICAgaWYoX3Rocm93cz09bnVsbCkKQEAgLTEzOSw1NiArMTM5LDU2IEBACiAgICAgICAgIHJldHVybiBfdGhyb3dzOwogICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGFuIGV4Y2VwdGlvbiB0byB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRoYXQgdGhpcwotICAgICAgICAgKiBtZXRob2QgbWF5IHRocm93LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXhjZXB0aW9uCi0gICAgICAgICAqICAgICAgICBOYW1lIG9mIGFuIGV4Y2VwdGlvbiB0aGF0IHRoaXMgbWV0aG9kIG1heSB0aHJvdwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEpNZXRob2QgX3Rocm93cyhKQ2xhc3MgZXhjZXB0aW9uKSB7CisgICAgLyoqCisgICAgICogQWRkIGFuIGV4Y2VwdGlvbiB0byB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRoYXQgdGhpcworICAgICAqIG1ldGhvZCBtYXkgdGhyb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uCisgICAgICogICAgICAgIE5hbWUgb2YgYW4gZXhjZXB0aW9uIHRoYXQgdGhpcyBtZXRob2QgbWF5IHRocm93CisgICAgICovCisgICAgcHVibGljIEpNZXRob2QgX3Rocm93cyhKQ2xhc3MgZXhjZXB0aW9uKSB7CiAgICAgICAgIGdldFRocm93cygpLmFkZChleGNlcHRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KIAotICAgICAgICBwdWJsaWMgSk1ldGhvZCBfdGhyb3dzKENsYXNzIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiBfdGhyb3dzKG91dGVyLm93bmVyKCkucmVmKGV4Y2VwdGlvbikpOwotICAgICAgICB9CisgICAgcHVibGljIEpNZXRob2QgX3Rocm93cyhDbGFzcyBleGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIF90aHJvd3Mob3V0ZXIub3duZXIoKS5yZWYoZXhjZXB0aW9uKSk7CisgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCB2YXJpYWJsZSB0byB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzCi0gICAgICAgICAqIGZvciB0aGlzIG1ldGhvZCBzaWduYXR1cmUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICAgICAqICAgICAgICBKVHlwZSBvZiB0aGUgcGFyYW1ldGVyIGJlaW5nIGFkZGVkCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICAgICAqICAgICAgICBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgYmVpbmcgYWRkZWQKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBOZXcgcGFyYW1ldGVyIHZhcmlhYmxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSlZhciBwYXJhbShpbnQgbW9kcywgSlR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBKVmFyIHYgPSBuZXcgSlZhcihKTW9kcy5mb3JWYXIobW9kcyksIHR5cGUsIG5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgIHBhcmFtcy5hZGQodik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCB2YXJpYWJsZSB0byB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzCisgICAgICogZm9yIHRoaXMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgIEpUeXBlIG9mIHRoZSBwYXJhbWV0ZXIgYmVpbmcgYWRkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgIE5hbWUgb2YgdGhlIHBhcmFtZXRlciBiZWluZyBhZGRlZAorICAgICAqCisgICAgICogQHJldHVybiBOZXcgcGFyYW1ldGVyIHZhcmlhYmxlCisgICAgICovCisgICAgcHVibGljIEpWYXIgcGFyYW0oaW50IG1vZHMsIEpUeXBlIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIEpWYXIgdiA9IG5ldyBKVmFyKEpNb2RzLmZvclZhcihtb2RzKSwgdHlwZSwgbmFtZSwgbnVsbCk7CisgICAgICAgIHBhcmFtcy5hZGQodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KIAotICAgICAgICBwdWJsaWMgSlZhciBwYXJhbShKVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbShKTW9kLk5PTkUsIHR5cGUsIG5hbWUpOwotICAgICAgICB9CisgICAgcHVibGljIEpWYXIgcGFyYW0oSlR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtKEpNb2QuTk9ORSwgdHlwZSwgbmFtZSk7CisgICAgfQogCi0gICAgICAgIHB1YmxpYyBKVmFyIHBhcmFtKGludCBtb2RzLCBDbGFzcyB0eXBlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbShtb2RzLCBvdXRlci5vd25lcigpLl9yZWYodHlwZSksIG5hbWUpOwotICAgICAgICB9CisgICAgcHVibGljIEpWYXIgcGFyYW0oaW50IG1vZHMsIENsYXNzIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBwYXJhbShtb2RzLCBvdXRlci5vd25lcigpLl9yZWYodHlwZSksIG5hbWUpOworICAgIH0KIAotICAgICAgICBwdWJsaWMgSlZhciBwYXJhbShDbGFzcyB0eXBlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbShvdXRlci5vd25lcigpLl9yZWYodHlwZSksIG5hbWUpOwotICAgICAgICB9CisgICAgcHVibGljIEpWYXIgcGFyYW0oQ2xhc3MgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtKG91dGVyLm93bmVyKCkuX3JlZih0eXBlKSwgbmFtZSk7CisgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAc2VlICN2YXJQYXJhbShKVHlwZSwgU3RyaW5nKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEpWYXIgdmFyUGFyYW0oQ2xhc3MgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAvKioKKyAgICAgKiBAc2VlICN2YXJQYXJhbShKVHlwZSwgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBKVmFyIHZhclBhcmFtKENsYXNzIHR5cGUsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiB2YXJQYXJhbShvdXRlci5vd25lcigpLl9yZWYodHlwZSksbmFtZSk7CiAgICAgfQogCkBAIC0yMTAsMjUgKzIxMCwyNSBAQAogICAgICAqICAgICAgbWV0aG9kIHNpZ25hdHVyZS4KICAgICAgKi8KICAgICBwdWJsaWMgSlZhciB2YXJQYXJhbShKVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGlmICghaGFzVmFyQXJncygpKSB7CisgICAgICAgIGlmICghaGFzVmFyQXJncygpKSB7CiAKICAgICAgICAgICAgIHZhclBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEpWYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk1vZHMuZm9yVmFyKEpNb2QuTk9ORSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5hcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFyUGFyYW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaGF2ZSB0d28gdmFyYXJncyBpbiBhIG1ldGhvZCxcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJDaGVjayBpZiB2YXJQYXJhbSBtZXRob2Qgb2YgSk1ldGhvZCBpcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW52b2tlZCBtb3JlIHRoYW4gb25jZSIpOwotCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ldyBKVmFyKAorICAgICAgICAgICAgICAgICAgICBKTW9kcy5mb3JWYXIoSk1vZC5OT05FKSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZS5hcnJheSgpLAorICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiB2YXJQYXJhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCBoYXZlIHR3byB2YXJhcmdzIGluIGEgbWV0aG9kLFxuIgorICAgICAgICAgICAgICAgICAgICArICJDaGVjayBpZiB2YXJQYXJhbSBtZXRob2Qgb2YgSk1ldGhvZCBpcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGludm9rZWQgbW9yZSB0aGFuIG9uY2UiKTsKIAogICAgICAgICB9CiAKKyAgICB9CisKICAgICAvKioKICAgICAgKiBBZGRzIGFuIGFubm90YXRpb24gdG8gdGhpcyB2YXJpYWJsZS4KICAgICAgKiBAcGFyYW0gY2xhenoKQEAgLTI1Niw5MiArMjU2LDEwNiBAQAogICAgICAgICByZXR1cm4gVHlwZWRBbm5vdGF0aW9uV3JpdGVyLmNyZWF0ZShjbGF6eix0aGlzKTsKICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdmFyYXJncyBkZWNsYXJlZAotICAgICAgICAgKiBmb3IgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzVmFyQXJncygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YXJQYXJhbSE9bnVsbDsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdmFyYXJncyBkZWNsYXJlZAorICAgICAqIGZvciB0aGlzIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzVmFyQXJncygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmFyUGFyYW0hPW51bGw7CisgICAgfQogCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBKVHlwZSB0eXBlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5hbWUoU3RyaW5nIG4pIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbjsKKyAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYWxsIHRoZSBwYXJhbWV0ZXIgdHlwZXMgaW4gYW4gYXJyYXkuCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICogICAgICBJZiB0aGVyZSdzIG5vIHBhcmFtZXRlciwgYW4gZW1wdHkgYXJyYXkgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBKVHlwZVtdIGxpc3RQYXJhbVR5cGVzKCkgewotICAgICAgICAgICAgICAgIEpUeXBlW10gciA9IG5ldyBKVHlwZVtwYXJhbXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICByW2ldID0gcGFyYW1zLmdldChpKS50eXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSlR5cGUgdHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zICB0aGUgdmFyYWdzIHBhcmFtZXRlciB0eXBlLgotICAgICAgICAgKiBAcmV0dXJuCi0gICAgICAgICAqIElmIHRoZXJlJ3Mgbm8gdmFyYXJnIHBhcmFtZXRlciB0eXBlLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSlR5cGUgbGlzdFZhclBhcmFtVHlwZSgpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFyUGFyYW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJQYXJhbS50eXBlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIHJldHVybiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHR5cGUoSlR5cGUgdCkgeworICAgICAgICB0aGlzLnR5cGUgPSB0OworICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gYW4gYXJyYXkuCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICogICAgICBJZiB0aGVyZSdzIG5vIHBhcmFtZXRlciwgYW4gZW1wdHkgYXJyYXkgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBKVmFyW10gbGlzdFBhcmFtcygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLnRvQXJyYXkobmV3IEpWYXJbcGFyYW1zLnNpemUoKV0pOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgdGhlIHBhcmFtZXRlciB0eXBlcyBpbiBhbiBhcnJheS4KKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBJZiB0aGVyZSdzIG5vIHBhcmFtZXRlciwgYW4gZW1wdHkgYXJyYXkgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSlR5cGVbXSBsaXN0UGFyYW1UeXBlcygpIHsKKyAgICAgICAgSlR5cGVbXSByID0gbmV3IEpUeXBlW3BhcmFtcy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByW2ldID0gcGFyYW1zLmdldChpKS50eXBlKCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgdmFyaWFibGUgcGFyYW1ldGVyCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICogICAgICBJZiB0aGVyZSdzIG5vIHBhcmFtZXRlciwgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEpWYXIgbGlzdFZhclBhcmFtKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YXJQYXJhbTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIFJldHVybnMgIHRoZSB2YXJhZ3MgcGFyYW1ldGVyIHR5cGUuCisgICAgICogQHJldHVybgorICAgICAqIElmIHRoZXJlJ3Mgbm8gdmFyYXJnIHBhcmFtZXRlciB0eXBlLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIEpUeXBlIGxpc3RWYXJQYXJhbVR5cGUoKSB7CisgICAgICAgIGlmICh2YXJQYXJhbSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHZhclBhcmFtLnR5cGUoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBoYXMgdGhlIHNwZWNpZmllZCBzaWduYXR1cmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTaWduYXR1cmUoSlR5cGVbXSBhcmdUeXBlcykgewotICAgICAgICAgICAgICAgIEpWYXJbXSBwID0gbGlzdFBhcmFtcygpOwotICAgICAgICAgICAgICAgIGlmIChwLmxlbmd0aCAhPSBhcmdUeXBlcy5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gYW4gYXJyYXkuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgSWYgdGhlcmUncyBubyBwYXJhbWV0ZXIsIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIEpWYXJbXSBsaXN0UGFyYW1zKCkgeworICAgICAgICByZXR1cm4gcGFyYW1zLnRvQXJyYXkobmV3IEpWYXJbcGFyYW1zLnNpemUoKV0pOworICAgIH0KIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcFtpXS50eXBlKCkuZXF1YWxzKGFyZ1R5cGVzW2ldKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhcmlhYmxlIHBhcmFtZXRlcgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIElmIHRoZXJlJ3Mgbm8gcGFyYW1ldGVyLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIEpWYXIgbGlzdFZhclBhcmFtKCkgeworICAgICAgICByZXR1cm4gdmFyUGFyYW07CisgICAgfQogCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBoYXMgdGhlIHNwZWNpZmllZCBzaWduYXR1cmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzU2lnbmF0dXJlKEpUeXBlW10gYXJnVHlwZXMpIHsKKyAgICAgICAgSlZhcltdIHAgPSBsaXN0UGFyYW1zKCk7CisgICAgICAgIGlmIChwLmxlbmd0aCAhPSBhcmdUeXBlcy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgYmxvY2sgdGhhdCBtYWtlcyB1cCBib2R5IG9mIHRoaXMgbWV0aG9kCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQm9keSBvZiBtZXRob2QKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBKQmxvY2sgYm9keSgpIHsKLSAgICAgICAgICAgICAgICBpZiAoYm9keSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IG5ldyBKQmxvY2soKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYm9keTsKLSAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoIXBbaV0udHlwZSgpLmVxdWFscyhhcmdUeXBlc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYmxvY2sgdGhhdCBtYWtlcyB1cCBib2R5IG9mIHRoaXMgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEJvZHkgb2YgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIEpCbG9jayBib2R5KCkgeworICAgICAgICBpZiAoYm9keSA9PSBudWxsKQorICAgICAgICAgICAgYm9keSA9IG5ldyBKQmxvY2soKTsKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU3BlY2lmeSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhbm5vdGF0aW9uIG1lbWJlcgpAQCAtMzUzLDM3ICszNjcsMzcgQEAKICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTsKICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMsIGlmIG5lY2Vzc2FyeSwgYW5kIHJldHVybnMgdGhlIGNsYXNzIGphdmFkb2MgZm9yIHRoaXMKLSAgICAgICAgICogSkRlZmluZWRDbGFzcwotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEpEb2NDb21tZW50IGNvbnRhaW5pbmcgamF2YWRvY3MgZm9yIHRoaXMgY2xhc3MKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBKRG9jQ29tbWVudCBqYXZhZG9jKCkgewotICAgICAgICAgICAgICAgIGlmIChqZG9jID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBqZG9jID0gbmV3IEpEb2NDb21tZW50KG93bmVyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBqZG9jOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogQ3JlYXRlcywgaWYgbmVjZXNzYXJ5LCBhbmQgcmV0dXJucyB0aGUgY2xhc3MgamF2YWRvYyBmb3IgdGhpcworICAgICAqIEpEZWZpbmVkQ2xhc3MKKyAgICAgKgorICAgICAqIEByZXR1cm4gSkRvY0NvbW1lbnQgY29udGFpbmluZyBqYXZhZG9jcyBmb3IgdGhpcyBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBKRG9jQ29tbWVudCBqYXZhZG9jKCkgeworICAgICAgICBpZiAoamRvYyA9PSBudWxsKQorICAgICAgICAgICAgamRvYyA9IG5ldyBKRG9jQ29tbWVudChvd25lcigpKTsKKyAgICAgICAgcmV0dXJuIGpkb2M7CisgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlY2xhcmUoSkZvcm1hdHRlciBmKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGpkb2MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuZyhqZG9jKTsKKyAgICBwdWJsaWMgdm9pZCBkZWNsYXJlKEpGb3JtYXR0ZXIgZikgeworICAgICAgICBpZiAoamRvYyAhPSBudWxsKQorICAgICAgICAgICAgZi5nKGpkb2MpOwogCiAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKXsKICAgICAgICAgICAgIGZvciAoSkFubm90YXRpb25Vc2UgYSA6IGFubm90YXRpb25zKQogICAgICAgICAgICAgICAgIGYuZyhhKS5ubCgpOwogICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBkZWNsYXJlIHRoZSBnZW5lcmljcyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgc3VwZXIuZGVjbGFyZShmKTsKKyAgICAgICAgLy8gZGVjbGFyZSB0aGUgZ2VuZXJpY3MgcGFyYW1ldGVycworICAgICAgICBzdXBlci5kZWNsYXJlKGYpOwogCi0gICAgICAgICAgICAgICAgZi5nKG1vZHMpOwotICAgICAgICAgICAgICAgIGlmICghaXNDb25zdHJ1Y3RvcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgZi5nKHR5cGUpOwotICAgICAgICAgICAgICAgIGYuaWQobmFtZSkucCgnKCcpLmkoKTsKKyAgICAgICAgZi5nKG1vZHMpOworICAgICAgICBpZiAoIWlzQ29uc3RydWN0b3IoKSkKKyAgICAgICAgICAgIGYuZyh0eXBlKTsKKyAgICAgICAgZi5pZChuYW1lKS5wKCcoJykuaSgpOwogICAgICAgICAvLyB3aGVuIHBhcmFtZXRlcnMgYXJlIHByaW50ZWQgaW4gbmV3IGxpbmVzLCB3ZSB3YW50IHRoZW0gdG8gYmUgaW5kZW50ZWQuCiAgICAgICAgIC8vIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSBubyBuZXdsaW5lcyBoYXBwZW4sIHRvbywgYnV0IGp1c3QgaW4gY2FzZSBpdCBkb2VzLgotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgZm9yIChKVmFyIHZhciA6IHBhcmFtcykgewogICAgICAgICAgICAgaWYgKCFmaXJzdCkKICAgICAgICAgICAgICAgICBmLnAoJywnKTsKQEAgLTM5MiwzMyArNDA2LDMzIEBACiAgICAgICAgICAgICBmLmIodmFyKTsKICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGFzVmFyQXJncygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnAoJywnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuZyh2YXJQYXJhbS50eXBlKCkuZWxlbWVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLnAoIi4uLiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuaWQodmFyUGFyYW0ubmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmIChoYXNWYXJBcmdzKCkpIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgICAgZi5wKCcsJyk7CisgICAgICAgICAgICBmLmcodmFyUGFyYW0udHlwZSgpLmVsZW1lbnRUeXBlKCkpOworICAgICAgICAgICAgZi5wKCIuLi4gIik7CisgICAgICAgICAgICBmLmlkKHZhclBhcmFtLm5hbWUoKSk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGYubygpLnAoJyknKTsKLSAgICAgICAgICAgICAgICBpZiAoX3Rocm93cyE9bnVsbCAmJiAhX3Rocm93cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYubmwoKS5pKCkucCgidGhyb3dzIikuZyhfdGhyb3dzKS5ubCgpLm8oKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGYubygpLnAoJyknKTsKKyAgICAgICAgaWYgKF90aHJvd3MhPW51bGwgJiYgIV90aHJvd3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmLm5sKCkuaSgpLnAoInRocm93cyIpLmcoX3Rocm93cykubmwoKS5vKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgIGYucCgiZGVmYXVsdCAiKTsKICAgICAgICAgICAgIGYuZyhkZWZhdWx0VmFsdWUpOwogICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5zKGJvZHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAhb3V0ZXIuaXNJbnRlcmZhY2UoKSAmJiAhb3V0ZXIuaXNBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKCkgJiYgIW1vZHMuaXNBYnN0cmFjdCgpICYmICFtb2RzLmlzTmF0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByaW50IGFuIGVtcHR5IGJvZHkgZm9yIG5vbi1uYXRpdmUsIG5vbi1hYnN0cmFjdCBtZXRob2RzCi0gICAgICAgICAgICAgICAgICAgICAgICBmLnMobmV3IEpCbG9jaygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5wKCc7JykubmwoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGYucyhib2R5KTsKKyAgICAgICAgfSBlbHNlIGlmICgKKyAgICAgICAgICAgICFvdXRlci5pc0ludGVyZmFjZSgpICYmICFvdXRlci5pc0Fubm90YXRpb25UeXBlRGVjbGFyYXRpb24oKSAmJiAhbW9kcy5pc0Fic3RyYWN0KCkgJiYgIW1vZHMuaXNOYXRpdmUoKSkgeworICAgICAgICAgICAgLy8gUHJpbnQgYW4gZW1wdHkgYm9keSBmb3Igbm9uLW5hdGl2ZSwgbm9uLWFic3RyYWN0IG1ldGhvZHMKKyAgICAgICAgICAgIGYucyhuZXcgSkJsb2NrKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5wKCc7JykubmwoKTsKICAgICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIEByZXR1cm4KQEAgLTQzMywxMCArNDQ3LDEwIEBACiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjbW9kcygpfQogICAgICAqLwogICAgIHB1YmxpYyBKTW9kcyBnZXRNb2RzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtb2RzOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBtb2RzOworICAgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgSkNvZGVNb2RlbCBvd25lcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0ZXIub3duZXIoKTsKLSAgICAgICAgfQorICAgIHByb3RlY3RlZCBKQ29kZU1vZGVsIG93bmVyKCkgeworICAgICAgICByZXR1cm4gb3V0ZXIub3duZXIoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTW9kLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTW9kLmphdmEKaW5kZXggMGYzMmU3Ni4uNjRlMGM5MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSk1vZC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pNb2QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTW9kcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSk1vZHMuamF2YQppbmRleCBkYWY1Yjg1Li42MGFhZDhmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTW9kcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pNb2RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDEsMTcgKzQxLDE3IEBACiAgICAgICAgID0gSk1vZC5GSU5BTDsKIAogICAgIHByaXZhdGUgc3RhdGljIGludCBGSUVMRAotICAgICAgICA9IChKTW9kLlBVQkxJQyB8IEpNb2QuUFJJVkFURSB8IEpNb2QuUFJPVEVDVEVECi0gICAgICAgICAgIHwgSk1vZC5TVEFUSUMgfCBKTW9kLkZJTkFMCi0gICAgICAgICAgIHwgSk1vZC5UUkFOU0lFTlQgfCBKTW9kLlZPTEFUSUxFKTsKKyAgICA9IChKTW9kLlBVQkxJQyB8IEpNb2QuUFJJVkFURSB8IEpNb2QuUFJPVEVDVEVECisgICAgICAgfCBKTW9kLlNUQVRJQyB8IEpNb2QuRklOQUwKKyAgICAgICB8IEpNb2QuVFJBTlNJRU5UIHwgSk1vZC5WT0xBVElMRSk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTUVUSE9ECi0gICAgICAgID0gKEpNb2QuUFVCTElDIHwgSk1vZC5QUklWQVRFIHwgSk1vZC5QUk9URUNURUQgfCBKTW9kLkZJTkFMCi0gICAgICAgICAgIHwgSk1vZC5BQlNUUkFDVCB8IEpNb2QuU1RBVElDIHwgSk1vZC5OQVRJVkUgfCBKTW9kLlNZTkNIUk9OSVpFRCk7CisgICAgPSAoSk1vZC5QVUJMSUMgfCBKTW9kLlBSSVZBVEUgfCBKTW9kLlBST1RFQ1RFRCB8IEpNb2QuRklOQUwKKyAgICAgICB8IEpNb2QuQUJTVFJBQ1QgfCBKTW9kLlNUQVRJQyB8IEpNb2QuTkFUSVZFIHwgSk1vZC5TWU5DSFJPTklaRUQpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IENMQVNTCi0gICAgICAgID0gKEpNb2QuUFVCTElDIHwgSk1vZC5QUklWQVRFIHwgSk1vZC5QUk9URUNURUQKLSAgICAgICAgICAgfCBKTW9kLlNUQVRJQyB8IEpNb2QuRklOQUwgfCBKTW9kLkFCU1RSQUNUICk7CisgICAgPSAoSk1vZC5QVUJMSUMgfCBKTW9kLlBSSVZBVEUgfCBKTW9kLlBST1RFQ1RFRAorICAgICAgIHwgSk1vZC5TVEFUSUMgfCBKTW9kLkZJTkFMIHwgSk1vZC5BQlNUUkFDVCApOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IElOVEVSRkFDRSA9IEpNb2QuUFVCTElDOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTmFycm93ZWRDbGFzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSk5hcnJvd2VkQ2xhc3MuamF2YQppbmRleCBkYzEzNmY0Li4zMzIwZTdkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTmFycm93ZWRDbGFzcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pOYXJyb3dlZENsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSk51bGxUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTnVsbFR5cGUuamF2YQppbmRleCA3YmUzYzA2Li45M2ZmMDQ5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTnVsbFR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KTnVsbFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KT3AuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pPcC5qYXZhCmluZGV4IGNkNDM2NTQuLjIzZjc1ZDUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pPcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pPcC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pQYWNrYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KUGFja2FnZS5qYXZhCmluZGV4IDc2YjAyNTIuLmUyNmE5NjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pQYWNrYWdlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlBhY2thZ2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KUHJpbWl0aXZlVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlByaW1pdGl2ZVR5cGUuamF2YQppbmRleCA4ZTZmYmZlLi5mMWM5MjgzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KUHJpbWl0aXZlVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pQcmltaXRpdmVUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlJlc291cmNlRmlsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlJlc291cmNlRmlsZS5qYXZhCmluZGV4IGQxZTA5MjUuLmM4OGQzNzAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pSZXNvdXJjZUZpbGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KUmVzb3VyY2VGaWxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlJldHVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlJldHVybi5qYXZhCmluZGV4IDdkZjUyMTQuLmE2OTA3MzIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pSZXR1cm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KUmV0dXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlN0YXRlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlN0YXRlbWVudC5qYXZhCmluZGV4IDUxYTk0OTIuLjhkZjdiMzcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pTdGF0ZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlN0cmluZ0xpdGVyYWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pTdHJpbmdMaXRlcmFsLmphdmEKaW5kZXggNjE3OGE1OC4uYWZlNzAxMjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pTdHJpbmdMaXRlcmFsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlN0cmluZ0xpdGVyYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlN3aXRjaC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlN3aXRjaC5qYXZhCmluZGV4IDFiYjBiZGIuLjQ0YWY0ODcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pTd2l0Y2guamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KU3dpdGNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pUaHJvdy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlRocm93LmphdmEKaW5kZXggN2JmMDk5Zi4uMDUwY2Y4YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlRocm93LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlRocm93LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlRyeUJsb2NrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KVHJ5QmxvY2suamF2YQppbmRleCAzNWNjMWU1Li4xNzM5ZTEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KVHJ5QmxvY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KVHJ5QmxvY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlR5cGUuamF2YQppbmRleCA0ODljYzE3Li5iMjA4ZDQ5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlR5cGVWYXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pUeXBlVmFyLmphdmEKaW5kZXggY2U5YzhiYS4uZGU3NDU2OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlR5cGVWYXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KVHlwZVZhci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pUeXBlV2lsZGNhcmQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pUeXBlV2lsZGNhcmQuamF2YQppbmRleCA0YmIyNTExLi45NDEyZDNlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KVHlwZVdpbGRjYXJkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlR5cGVXaWxkY2FyZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pWYXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pWYXIuamF2YQppbmRleCAwYTk0ZjczLi4xNWIwYzRmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KVmFyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSlZhci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pXaGlsZUxvb3AuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL0pXaGlsZUxvb3AuamF2YQppbmRleCA0YzY3Mzg4Li45MzBlMmJlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9KV2hpbGVMb29wLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvSldoaWxlTG9vcC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL1R5cGVkQW5ub3RhdGlvbldyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvVHlwZWRBbm5vdGF0aW9uV3JpdGVyLmphdmEKaW5kZXggMTFmYTdlMy4uYjU4ZDFmNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvVHlwZWRBbm5vdGF0aW9uV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvVHlwZWRBbm5vdGF0aW9uV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvSkJpbmFyeUZpbGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KQmluYXJ5RmlsZS5qYXZhCmluZGV4IGY1MzkzN2YuLjYxYTIyZTggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KQmluYXJ5RmlsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KQmluYXJ5RmlsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5mbXQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KUHJvcGVydHlGaWxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvSlByb3BlcnR5RmlsZS5qYXZhCmluZGV4IDY3YzA5YjcuLjgxZTI5ZjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KUHJvcGVydHlGaWxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L0pQcm9wZXJ0eUZpbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuZm10OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KU2VyaWFsaXplZE9iamVjdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L0pTZXJpYWxpemVkT2JqZWN0LmphdmEKaW5kZXggNjhlOGI4ZC4uMTI0NTI2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L0pTZXJpYWxpemVkT2JqZWN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L0pTZXJpYWxpemVkT2JqZWN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L0pTdGF0aWNGaWxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvSlN0YXRpY0ZpbGUuamF2YQppbmRleCAzYzVkOTEyLi40NTBhYWMzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvSlN0YXRpY0ZpbGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvSlN0YXRpY0ZpbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuZm10OwogCiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvSlN0YXRpY0phdmFGaWxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvSlN0YXRpY0phdmFGaWxlLmphdmEKaW5kZXggMjM0Yjc2OC4uMDBkODhlOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L0pTdGF0aWNKYXZhRmlsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KU3RhdGljSmF2YUZpbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuZm10OwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KVGV4dEZpbGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9KVGV4dEZpbGUuamF2YQppbmRleCBlZTliNjI5Li5kYmM0NGRhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvSlRleHRGaWxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L0pUZXh0RmlsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5mbXQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL2ZtdC9wYWNrYWdlLmh0bWwKaW5kZXggYzUyMjdhMi4uMjQ5M2VkNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvZm10L3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9mbXQvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxIVE1MPgogPEJPRFk+CiBWYXJpb3VzIHJlc291cmNlIGZpbGUgZm9ybWF0cyAoY2xhc3NlcyB0aGF0IGltcGxlbWVudCA8Y29kZT5KUmVzb3VyY2VGaWxlPC9jb2RlPikuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCmluZGV4IDQ1ZjJkNWYuLmFhN2ExNjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyoqCiAgKiA8aDE+TGlicmFyeSBmb3IgZ2VuZXJhdGluZyBKYXZhIHNvdXJjZSBjb2RlPC9oMT4uCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvdXRpbC9DbGFzc05hbWVDb21wYXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL0NsYXNzTmFtZUNvbXBhcmF0b3IuamF2YQppbmRleCA0MDg3NDM2Li40NmI0MjcwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL0NsYXNzTmFtZUNvbXBhcmF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL0NsYXNzTmFtZUNvbXBhcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwudXRpbDsKIAogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvdXRpbC9FbmNvZGVyRmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvdXRpbC9FbmNvZGVyRmFjdG9yeS5qYXZhCmluZGV4IGM0ZDNmMDcuLmM3NTliMmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvRW5jb2RlckZhY3RvcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL0VuY29kZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTAgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpJElkOiBFbmNvZGVyRmFjdG9yeS5qYXZhLHYgMS4zIDIwMDUvMDkvMTAgMTk6MDc6MzMga29oc3VrZSBFeHAgJAorICovCisKIAogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC51dGlsOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL0phdmFkb2NFc2NhcGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvSmF2YWRvY0VzY2FwZVdyaXRlci5qYXZhCmluZGV4IGQ4OTQ3ZmYuLjZkYjQ3MWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvSmF2YWRvY0VzY2FwZVdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvSmF2YWRvY0VzY2FwZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC51dGlsOwogCiBpbXBvcnQgamF2YS5pby5GaWx0ZXJXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL01TMTI1MkVuY29kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvTVMxMjUyRW5jb2Rlci5qYXZhCmluZGV4IDJkYmNkNzguLjRmYTk5NzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvTVMxMjUyRW5jb2Rlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvTVMxMjUyRW5jb2Rlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDEwIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKSRJZDogTVMxMjUyRW5jb2Rlci5qYXZhLHYgMS4yIDIwMDUvMDkvMTAgMTk6MDc6MzMga29oc3VrZSBFeHAgJAorICovCisKIAogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC51dGlsOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL1NpbmdsZUJ5dGVFbmNvZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL1NpbmdsZUJ5dGVFbmNvZGVyLmphdmEKaW5kZXggM2YwZDMxMy4uM2UwMjVhNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvdXRpbC9TaW5nbGVCeXRlRW5jb2Rlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvU2luZ2xlQnl0ZUVuY29kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMyw2ICsyMywxMCBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCiAKKy8qCisgKiBAKCMpU2luZ2xlQnl0ZUVuY29kZXIuamF2YSAgICAgICAxLjE0IDAzLzAxLzIzCisgKi8KKwogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC51dGlsOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKQEAgLTQ3LDEwOSArNTEsMTA5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdXJyb2dhdGUuUGFyc2VyIHNncCA9IG5ldyBTdXJyb2dhdGUuUGFyc2VyKCk7CiAKICAgICBwcm90ZWN0ZWQgU2luZ2xlQnl0ZUVuY29kZXIoQ2hhcnNldCBjcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRbXSBpbmRleDEsIFN0cmluZyBpbmRleDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrMSwgaW50IG1hc2syLCBpbnQgc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRbXSBpbmRleDEsIFN0cmluZyBpbmRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2sxLCBpbnQgbWFzazIsIGludCBzaGlmdCkKICAgICB7Ci0gICAgICAgIHN1cGVyKGNzLCAxLjBmLCAxLjBmKTsKLSAgICAgICAgdGhpcy5pbmRleDEgPSBpbmRleDE7Ci0gICAgICAgIHRoaXMuaW5kZXgyID0gaW5kZXgyOwotICAgICAgICB0aGlzLm1hc2sxID0gbWFzazE7Ci0gICAgICAgIHRoaXMubWFzazIgPSBtYXNrMjsKLSAgICAgICAgdGhpcy5zaGlmdCA9IHNoaWZ0OworICAgICAgIHN1cGVyKGNzLCAxLjBmLCAxLjBmKTsKKyAgICAgICB0aGlzLmluZGV4MSA9IGluZGV4MTsKKyAgICAgICB0aGlzLmluZGV4MiA9IGluZGV4MjsKKyAgICAgICB0aGlzLm1hc2sxID0gbWFzazE7CisgICAgICAgdGhpcy5tYXNrMiA9IG1hc2syOworICAgICAgIHRoaXMuc2hpZnQgPSBzaGlmdDsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBjYW5FbmNvZGUoY2hhciBjKSB7Ci0gICAgICAgIGNoYXIgdGVzdEVuY29kZTsKLSAgICAgICAgdGVzdEVuY29kZSA9IGluZGV4Mi5jaGFyQXQoaW5kZXgxWyhjICYgbWFzazEpID4+IHNoaWZ0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChjICYgbWFzazIpKTsKLSAgICAgICAgaWYgKHRlc3RFbmNvZGUgPT0gJ1x1MDAwMCcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgIGNoYXIgdGVzdEVuY29kZTsKKyAgICAgICB0ZXN0RW5jb2RlID0gaW5kZXgyLmNoYXJBdChpbmRleDFbKGMgJiBtYXNrMSkgPj4gc2hpZnRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoYyAmIG1hc2syKSk7CisgICAgICAgaWYgKHRlc3RFbmNvZGUgPT0gJ1x1MDAwMCcpCisgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICBlbHNlCisgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgQ29kZXJSZXN1bHQgZW5jb2RlQXJyYXlMb29wKENoYXJCdWZmZXIgc3JjLCBCeXRlQnVmZmVyIGRzdCkgewotICAgICAgICBjaGFyW10gc2EgPSBzcmMuYXJyYXkoKTsKLSAgICAgICAgaW50IHNwID0gc3JjLmFycmF5T2Zmc2V0KCkgKyBzcmMucG9zaXRpb24oKTsKLSAgICAgICAgaW50IHNsID0gc3JjLmFycmF5T2Zmc2V0KCkgKyBzcmMubGltaXQoKTsKLSAgICAgICAgc3AgPSAoc3AgPD0gc2wgPyBzcCA6IHNsKTsKLSAgICAgICAgYnl0ZVtdIGRhID0gZHN0LmFycmF5KCk7Ci0gICAgICAgIGludCBkcCA9IGRzdC5hcnJheU9mZnNldCgpICsgZHN0LnBvc2l0aW9uKCk7Ci0gICAgICAgIGludCBkbCA9IGRzdC5hcnJheU9mZnNldCgpICsgZHN0LmxpbWl0KCk7Ci0gICAgICAgIGRwID0gKGRwIDw9IGRsID8gZHAgOiBkbCk7CisgICAgICAgY2hhcltdIHNhID0gc3JjLmFycmF5KCk7CisgICAgICAgaW50IHNwID0gc3JjLmFycmF5T2Zmc2V0KCkgKyBzcmMucG9zaXRpb24oKTsKKyAgICAgICBpbnQgc2wgPSBzcmMuYXJyYXlPZmZzZXQoKSArIHNyYy5saW1pdCgpOworICAgICAgIHNwID0gKHNwIDw9IHNsID8gc3AgOiBzbCk7CisgICAgICAgYnl0ZVtdIGRhID0gZHN0LmFycmF5KCk7CisgICAgICAgaW50IGRwID0gZHN0LmFycmF5T2Zmc2V0KCkgKyBkc3QucG9zaXRpb24oKTsKKyAgICAgICBpbnQgZGwgPSBkc3QuYXJyYXlPZmZzZXQoKSArIGRzdC5saW1pdCgpOworICAgICAgIGRwID0gKGRwIDw9IGRsID8gZHAgOiBkbCk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlIChzcCA8IHNsKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gc2Fbc3BdOwotICAgICAgICAgICAgICAgIGlmIChTdXJyb2dhdGUuaXMoYykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNncC5wYXJzZShjLCBzYSwgc3AsIHNsKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2dwLmVycm9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZ3AudW5tYXBwYWJsZVJlc3VsdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYyA+PSAnXHVGRkZFJykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0LnVubWFwcGFibGVGb3JMZW5ndGgoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRsIC0gZHAgPCAxKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZXJSZXN1bHQuT1ZFUkZMT1c7CisgICAgICAgdHJ5IHsKKyAgICAgICAgICAgd2hpbGUgKHNwIDwgc2wpIHsKKyAgICAgICAgICAgICAgY2hhciBjID0gc2Fbc3BdOworICAgICAgICAgICAgICBpZiAoU3Vycm9nYXRlLmlzKGMpKSB7CisgICAgICAgICAgICAgICAgICBpZiAoc2dwLnBhcnNlKGMsIHNhLCBzcCwgc2wpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZ3AuZXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzZ3AudW5tYXBwYWJsZVJlc3VsdCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjID49ICdcdUZGRkUnKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0LnVubWFwcGFibGVGb3JMZW5ndGgoMSk7CisgICAgICAgICAgICAgIGlmIChkbCAtIGRwIDwgMSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBDb2RlclJlc3VsdC5PVkVSRkxPVzsKIAotICAgICAgICAgICAgICAgIGNoYXIgZSA9IGluZGV4Mi5jaGFyQXQoaW5kZXgxWyhjICYgbWFzazEpID4+IHNoaWZ0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoYyAmIG1hc2syKSk7CisgICAgICAgICAgICAgIGNoYXIgZSA9IGluZGV4Mi5jaGFyQXQoaW5kZXgxWyhjICYgbWFzazEpID4+IHNoaWZ0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChjICYgbWFzazIpKTsKIAotICAgICAgICAgICAgICAgIC8vIElmIG91dHB1dCBieXRlIGlzIHplcm8gYmVjYXVzZSBpbnB1dCBjaGFyIGlzIHplcm8KLSAgICAgICAgICAgICAgICAvLyB0aGVuIGNoYXJhY3RlciBpcyBtYXBwYWJsZSwgby53LiBmYWlsCi0gICAgICAgICAgICAgICAgaWYgKGUgPT0gJ1x1MDAwMCcgJiYgYyAhPSAnXHUwMDAwJykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0LnVubWFwcGFibGVGb3JMZW5ndGgoMSk7CisgICAgICAgICAgICAgIC8vIElmIG91dHB1dCBieXRlIGlzIHplcm8gYmVjYXVzZSBpbnB1dCBjaGFyIGlzIHplcm8KKyAgICAgICAgICAgICAgLy8gdGhlbiBjaGFyYWN0ZXIgaXMgbWFwcGFibGUsIG8udy4gZmFpbAorICAgICAgICAgICAgICBpZiAoZSA9PSAnXHUwMDAwJyAmJiBjICE9ICdcdTAwMDAnKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0LnVubWFwcGFibGVGb3JMZW5ndGgoMSk7CiAKLSAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgIGRhW2RwKytdID0gKGJ5dGUpZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDb2RlclJlc3VsdC5VTkRFUkZMT1c7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzcmMucG9zaXRpb24oc3AgLSBzcmMuYXJyYXlPZmZzZXQoKSk7Ci0gICAgICAgICAgICBkc3QucG9zaXRpb24oZHAgLSBkc3QuYXJyYXlPZmZzZXQoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgZGFbZHArK10gPSAoYnl0ZSllOworICAgICAgICAgICB9CisgICAgICAgICAgIHJldHVybiBDb2RlclJlc3VsdC5VTkRFUkZMT1c7CisgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgc3JjLnBvc2l0aW9uKHNwIC0gc3JjLmFycmF5T2Zmc2V0KCkpOworICAgICAgICAgICBkc3QucG9zaXRpb24oZHAgLSBkc3QuYXJyYXlPZmZzZXQoKSk7CisgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgQ29kZXJSZXN1bHQgZW5jb2RlQnVmZmVyTG9vcChDaGFyQnVmZmVyIHNyYywgQnl0ZUJ1ZmZlciBkc3QpIHsKLSAgICAgICAgaW50IG1hcmsgPSBzcmMucG9zaXRpb24oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlIChzcmMuaGFzUmVtYWluaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGMgPSBzcmMuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKFN1cnJvZ2F0ZS5pcyhjKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2dwLnBhcnNlKGMsIHNyYykgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNncC5lcnJvcigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2dwLnVubWFwcGFibGVSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGMgPj0gJ1x1RkZGRScpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2RlclJlc3VsdC51bm1hcHBhYmxlRm9yTGVuZ3RoKDEpOwotICAgICAgICAgICAgICAgIGlmICghZHN0Lmhhc1JlbWFpbmluZygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZXJSZXN1bHQuT1ZFUkZMT1c7CisgICAgICAgaW50IG1hcmsgPSBzcmMucG9zaXRpb24oKTsKKyAgICAgICB0cnkgeworICAgICAgICAgICB3aGlsZSAoc3JjLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICAgIGNoYXIgYyA9IHNyYy5nZXQoKTsKKyAgICAgICAgICAgICAgaWYgKFN1cnJvZ2F0ZS5pcyhjKSkgeworICAgICAgICAgICAgICAgICAgaWYgKHNncC5wYXJzZShjLCBzcmMpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZ3AuZXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzZ3AudW5tYXBwYWJsZVJlc3VsdCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjID49ICdcdUZGRkUnKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0LnVubWFwcGFibGVGb3JMZW5ndGgoMSk7CisgICAgICAgICAgICAgIGlmICghZHN0Lmhhc1JlbWFpbmluZygpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0Lk9WRVJGTE9XOwogCi0gICAgICAgICAgICAgICAgY2hhciBlID0gaW5kZXgyLmNoYXJBdChpbmRleDFbKGMgJiBtYXNrMSkgPj4gc2hpZnRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChjICYgbWFzazIpKTsKKyAgICAgICAgICAgICAgY2hhciBlID0gaW5kZXgyLmNoYXJBdChpbmRleDFbKGMgJiBtYXNrMSkgPj4gc2hpZnRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGMgJiBtYXNrMikpOwogCi0gICAgICAgICAgICAgICAgLy8gSWYgb3V0cHV0IGJ5dGUgaXMgemVybyBiZWNhdXNlIGlucHV0IGNoYXIgaXMgemVybwotICAgICAgICAgICAgICAgIC8vIHRoZW4gY2hhcmFjdGVyIGlzIG1hcHBhYmxlLCBvLncuIGZhaWwKLSAgICAgICAgICAgICAgICBpZiAoZSA9PSAnXHUwMDAwJyAmJiBjICE9ICdcdTAwMDAnKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZXJSZXN1bHQudW5tYXBwYWJsZUZvckxlbmd0aCgxKTsKKyAgICAgICAgICAgICAgLy8gSWYgb3V0cHV0IGJ5dGUgaXMgemVybyBiZWNhdXNlIGlucHV0IGNoYXIgaXMgemVybworICAgICAgICAgICAgICAvLyB0aGVuIGNoYXJhY3RlciBpcyBtYXBwYWJsZSwgby53LiBmYWlsCisgICAgICAgICAgICAgIGlmIChlID09ICdcdTAwMDAnICYmIGMgIT0gJ1x1MDAwMCcpCisgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZXJSZXN1bHQudW5tYXBwYWJsZUZvckxlbmd0aCgxKTsKIAotICAgICAgICAgICAgICAgIG1hcmsrKzsKLSAgICAgICAgICAgICAgICBkc3QucHV0KChieXRlKWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0LlVOREVSRkxPVzsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNyYy5wb3NpdGlvbihtYXJrKTsKLSAgICAgICAgfQorICAgICAgICAgICAgICBtYXJrKys7CisgICAgICAgICAgICAgIGRzdC5wdXQoKGJ5dGUpZSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcmV0dXJuIENvZGVyUmVzdWx0LlVOREVSRkxPVzsKKyAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICBzcmMucG9zaXRpb24obWFyayk7CisgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBDb2RlclJlc3VsdCBlbmNvZGVMb29wKENoYXJCdWZmZXIgc3JjLCBCeXRlQnVmZmVyIGRzdCkgewotICAgICAgICBpZiAodHJ1ZSAmJiBzcmMuaGFzQXJyYXkoKSAmJiBkc3QuaGFzQXJyYXkoKSkKLSAgICAgICAgICAgIHJldHVybiBlbmNvZGVBcnJheUxvb3Aoc3JjLCBkc3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZW5jb2RlQnVmZmVyTG9vcChzcmMsIGRzdCk7CisgICAgICAgaWYgKHRydWUgJiYgc3JjLmhhc0FycmF5KCkgJiYgZHN0Lmhhc0FycmF5KCkpCisgICAgICAgICAgIHJldHVybiBlbmNvZGVBcnJheUxvb3Aoc3JjLCBkc3QpOworICAgICAgIGVsc2UKKyAgICAgICAgICAgcmV0dXJuIGVuY29kZUJ1ZmZlckxvb3Aoc3JjLCBkc3QpOwogICAgIH0KIAogICAgIHB1YmxpYyBieXRlIGVuY29kZShjaGFyIGlucHV0Q2hhcikgewotICAgICAgICByZXR1cm4gKGJ5dGUpaW5kZXgyLmNoYXJBdChpbmRleDFbKGlucHV0Q2hhciAmIG1hc2sxKSA+PiBzaGlmdF0gKwotICAgICAgICAgICAgICAgIChpbnB1dENoYXIgJiBtYXNrMikpOworICAgICAgIHJldHVybiAoYnl0ZSlpbmRleDIuY2hhckF0KGluZGV4MVsoaW5wdXRDaGFyICYgbWFzazEpID4+IHNoaWZ0XSArCisgICAgICAgICAgICAgIChpbnB1dENoYXIgJiBtYXNrMikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvU3Vycm9nYXRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL1N1cnJvZ2F0ZS5qYXZhCmluZGV4IDAwODFmMjQuLjljZjZiMjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3V0aWwvU3Vycm9nYXRlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvdXRpbC9TdXJyb2dhdGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMyw2ICszMyw3IEBACiAgKiBVdGlsaXR5IGNsYXNzIGZvciBkZWFsaW5nIHdpdGggc3Vycm9nYXRlcy4KICAqCiAgKiBAYXV0aG9yIE1hcmsgUmVpbmhvbGQKKyAqIEB2ZXJzaW9uIDEuMTEsIDAzLzAxLzIzCiAgKi8KIAogY2xhc3MgU3Vycm9nYXRlIHsKQEAgLTExMSw3ICsxMTIsNyBAQAogCiAgICAgICAgIHB1YmxpYyBQYXJzZXIoKSB7IH0KIAotICAgICAgICBwcml2YXRlIGludCBjaGFyYWN0ZXI7ICAgICAgICAgIC8vIFVDUy00CisgICAgICAgIHByaXZhdGUgaW50IGNoYXJhY3RlcjsgICAgICAgICAgICAgICAgLy8gVUNTLTQKICAgICAgICAgcHJpdmF0ZSBDb2RlclJlc3VsdCBlcnJvciA9IENvZGVyUmVzdWx0LlVOREVSRkxPVzsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUGFpcjsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvdXRpbC9Vbmljb2RlRXNjYXBlV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL1VuaWNvZGVFc2NhcGVXcml0ZXIuamF2YQppbmRleCA1NDljODljLi5hZDA5ZjE1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL1VuaWNvZGVFc2NhcGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC91dGlsL1VuaWNvZGVFc2NhcGVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsdGVyV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL0ZpbGVDb2RlV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC93cml0ZXIvRmlsZUNvZGVXcml0ZXIuamF2YQppbmRleCA1OGNkOWQ3Li41YTU1NDIzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC93cml0ZXIvRmlsZUNvZGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC93cml0ZXIvRmlsZUNvZGVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwud3JpdGVyOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL0ZpbHRlckNvZGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3dyaXRlci9GaWx0ZXJDb2RlV3JpdGVyLmphdmEKaW5kZXggY2FkOTljZS4uMTUyM2QxYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL0ZpbHRlckNvZGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC93cml0ZXIvRmlsdGVyQ29kZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC53cml0ZXI7CiAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3dyaXRlci9Qcm9ncmVzc0NvZGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3dyaXRlci9Qcm9ncmVzc0NvZGVXcml0ZXIuamF2YQppbmRleCA0YjkyM2FkLi4xYmY4Zjg0NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL1Byb2dyZXNzQ29kZVdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3dyaXRlci9Qcm9ncmVzc0NvZGVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwud3JpdGVyOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL1Byb2xvZ0NvZGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3dyaXRlci9Qcm9sb2dDb2RlV3JpdGVyLmphdmEKaW5kZXggY2I3ODVhNy4uY2JiNWIyMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL1Byb2xvZ0NvZGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC93cml0ZXIvUHJvbG9nQ29kZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC53cml0ZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL1NpbmdsZVN0cmVhbUNvZGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3dyaXRlci9TaW5nbGVTdHJlYW1Db2RlV3JpdGVyLmphdmEKaW5kZXggNTJiOTU5Ny4uMTA3NDBkZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL1NpbmdsZVN0cmVhbUNvZGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC93cml0ZXIvU2luZ2xlU3RyZWFtQ29kZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC53cml0ZXI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3dyaXRlci9aaXBDb2RlV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvZGVtb2RlbC9pbnRlcm5hbC93cml0ZXIvWmlwQ29kZVdyaXRlci5qYXZhCmluZGV4IDQ0OTc1ZDkuLjBkMzQ1OTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29kZW1vZGVsL2ludGVybmFsL3dyaXRlci9aaXBDb2RlV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb2RlbW9kZWwvaW50ZXJuYWwvd3JpdGVyL1ppcENvZGVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwud3JpdGVyOwogCiBpbXBvcnQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW07CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9CeXRlQXJyYXlEYXRhU291cmNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9CeXRlQXJyYXlEYXRhU291cmNlLmphdmEKaW5kZXggNzQxOTM0OS4uYjExZWIxYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvQnl0ZUFycmF5RGF0YVNvdXJjZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL0J5dGVBcnJheURhdGFTb3VyY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5pc3RhY2suaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9GaW5hbEFycmF5TGlzdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvRmluYWxBcnJheUxpc3QuamF2YQppbmRleCAzNTdlNmZmLi42Y2M2N2I0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9GaW5hbEFycmF5TGlzdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL0ZpbmFsQXJyYXlMaXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uaXN0YWNrLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL0ZyYWdtZW50Q29udGVudEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL0ZyYWdtZW50Q29udGVudEhhbmRsZXIuamF2YQppbmRleCA4MWE3MWJlLi5jOWI3NzcyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9GcmFnbWVudENvbnRlbnRIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvRnJhZ21lbnRDb250ZW50SGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmlzdGFjay5pbnRlcm5hbDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL0ludGVybmVkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9JbnRlcm5lZC5qYXZhCmluZGV4IDE3YmY1YzMuLjI2ZTZiZmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL0ludGVybmVkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvSW50ZXJuZWQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5pc3RhY2suaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvTm90TnVsbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvTm90TnVsbC5qYXZhCmluZGV4IGI4YTEwM2MuLmYzMWViNDYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL05vdE51bGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9Ob3ROdWxsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uaXN0YWNrLmludGVybmFsOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL051bGxhYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9OdWxsYWJsZS5qYXZhCmluZGV4IDJhNzg1ZmUuLjI2OWQyNDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL051bGxhYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvTnVsbGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5pc3RhY2suaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvUG9vbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvUG9vbC5qYXZhCmluZGV4IDY3NDA1MjEuLjk1N2EzMzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL1Bvb2wuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9Qb29sLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uaXN0YWNrLmludGVybmFsOwogCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvU0FYRXhjZXB0aW9uMi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvU0FYRXhjZXB0aW9uMi5qYXZhCmluZGV4IDk5ZmI2NjMuLjU1OGQ4Y2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL1NBWEV4Y2VwdGlvbjIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9TQVhFeGNlcHRpb24yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4uaXN0YWNrLmludGVybmFsOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvU0FYUGFyc2VFeGNlcHRpb24yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9TQVhQYXJzZUV4Y2VwdGlvbjIuamF2YQppbmRleCBkZmQ2OGZlLi4wYzYwOTVmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9TQVhQYXJzZUV4Y2VwdGlvbjIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9TQVhQYXJzZUV4Y2VwdGlvbjIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5pc3RhY2suaW50ZXJuYWw7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL1hNTFN0cmVhbUV4Y2VwdGlvbjIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL1hNTFN0cmVhbUV4Y2VwdGlvbjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODhmNmFlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvWE1MU3RyZWFtRXhjZXB0aW9uMi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi5pc3RhY2suaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOworCisvKioKKyAqIHtAbGluayBYTUxTdHJlYW1FeGNlcHRpb259IHRoYXQgcHJvcGVybHkgaGFuZGxlcyBleGNlcHRpb24gY2hhaW5pbmcuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgWE1MU3RyZWFtRXhjZXB0aW9uMiBleHRlbmRzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbjIoU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1FeGNlcHRpb24yKFRocm93YWJsZSB0aCkgeworICAgICAgICBzdXBlcih0aCk7CisgICAgfQorCisgICAgcHVibGljIFhNTFN0cmVhbUV4Y2VwdGlvbjIoU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKSB7CisgICAgICAgIHN1cGVyKG1zZywgdGgpOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1FeGNlcHRpb24yKFN0cmluZyBtc2csIExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKG1zZywgbG9jYXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1FeGNlcHRpb24yKFN0cmluZyBtc2csIExvY2F0aW9uIGxvY2F0aW9uLCBUaHJvd2FibGUgdGgpIHsKKyAgICAgICAgc3VwZXIobXNnLCBsb2NhdGlvbiwgdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBYTUxTdHJlYW1FeGNlcHRpb259IGRvZXNuJ3QgcmV0dXJuIHRoZSBjb3JyZWN0IGNhdXNlLgorICAgICAqLworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CisgICAgICAgIHJldHVybiBnZXROZXN0ZWRFeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9YTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9YTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2YzBkNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL1hNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLmlzdGFjay5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IGNsYXNzIHRoYXQgYWRhcHRzIFN0QVggZXZlbnRzIGZyb20gYW4KKyAqIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IHRvIFNBWCBldmVudHMgb24gYQorICoge0BsaW5rIENvbnRlbnRIYW5kbGVyfSwgYnJpZGdpbmcgYmV0d2VlbiB0aGUgdHdvCisgKiBwYXJzZXIgdGVjaG5vbG9naWVzLgorICoKKyAqIEBhdXRob3IgUnlhbi5TaG9lbWFrZXJAU3VuLkNPTQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyIHsKKworICAgIC8vIFN0QVggZXZlbnQgc291cmNlCisgICAgcHJpdmF0ZSBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgc3RheFN0cmVhbVJlYWRlcjsKKworICAgIC8vIFNBWCBldmVudCBzaW5rCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50SGFuZGxlciBzYXhIYW5kbGVyOworCisgICAgLy8gaWYgdHJ1ZSwgd2hlbiB0aGUgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQsIGxlYXZlIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3QKKyAgICAvLyBldmVudCB0aGF0IHdhcyBmaXJlZCAoc3VjaCBhcyBlbmQgZWxlbWVudCkKKyAgICBwcml2YXRlIGJvb2xlYW4gZWFnZXJRdWl0OworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgbm90IHN0YXJ0L2VuZERvY3VtZW50IGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmcmFnbWVudDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBTdEFYIHRvIFNBWCBhZGFwdGVyIHRoYXQgd2lsbCBjb252ZXJ0IGEgU3RBWCBldmVudAorICAgICAqIHN0cmVhbSBpbnRvIGEgU0FYIGV2ZW50IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF4Q29yZQorICAgICAqICAgICAgICAgICAgICAgIFN0QVggZXZlbnQgc291cmNlCisgICAgICogQHBhcmFtIHNheENvcmUKKyAgICAgKiAgICAgICAgICAgICAgICBTQVhldmVudCBzaW5rCisgICAgICovCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXIoWE1MU3RyZWFtUmVhZGVyIHN0YXhDb3JlLCBDb250ZW50SGFuZGxlciBzYXhDb3JlLCBib29sZWFuIGVhZ2VyUXVpdCwgYm9vbGVhbiBmcmFnbWVudCkgeworICAgICAgICB0aGlzLnN0YXhTdHJlYW1SZWFkZXIgPSBzdGF4Q29yZTsKKyAgICAgICAgdGhpcy5zYXhIYW5kbGVyID0gc2F4Q29yZTsKKyAgICAgICAgdGhpcy5lYWdlclF1aXQgPSBlYWdlclF1aXQ7CisgICAgICAgIHRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEBzZWUgU3RBWFJlYWRlclRvQ29udGVudEhhbmRsZXIjYnJpZGdlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBicmlkZ2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcmVtZW1iZXJzIHRoZSBuZXN0IGxldmVsIG9mIGVsZW1lbnRzIHRvIGtub3cgd2hlbiB3ZSBhcmUgZG9uZS4KKyAgICAgICAgICAgIGludCBkZXB0aD0wOworCisgICAgICAgICAgICAvLyBpZiB0aGUgcGFyc2VyIGlzIGF0IHRoZSBzdGFydCB0YWcsIHByb2NlZWQgdG8gdGhlIGZpcnN0IGVsZW1lbnQKKyAgICAgICAgICAgIGludCBldmVudCA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgICAgICBpZihldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICAvLyBuZXh0VGFnIGRvZXNuJ3QgY29ycmVjdGx5IGhhbmRsZSBEVERzCisgICAgICAgICAgICAgICAgd2hpbGUoICFzdGF4U3RyZWFtUmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgKQorICAgICAgICAgICAgICAgICAgICBldmVudCA9IHN0YXhTdHJlYW1SZWFkZXIubmV4dCgpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmKCBldmVudCE9WE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGN1cnJlbnQgZXZlbnQgaXMgbm90IFNUQVJUX0VMRU1FTlRcbiBidXQgIiArIGV2ZW50KTsKKworICAgICAgICAgICAgaGFuZGxlU3RhcnREb2N1bWVudCgpOworCisgICAgICAgICAgICBPVVRFUjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgYWxsIG9mIHRoZSBldmVudHMgbGlzdGVkIGluIHRoZSBqYXZhZG9jIGZvcgorICAgICAgICAgICAgICAgIC8vIFhNTEV2ZW50LgorICAgICAgICAgICAgICAgIC8vIFRoZSBzcGVjIG9ubHkgcmVhbGx5IGRlc2NyaWJlcyAxMSBvZiB0aGVtLgorICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA6CisgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RhcnRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQgOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRlcHRoPT0wICYmIGVhZ2VyUXVpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBPVVRFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYXJhY3RlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5FTlRJVFlfUkVGRVJFTkNFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVudGl0eVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT04gOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUEkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DT01NRU5UIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5EVEQgOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRFREKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuQVRUUklCVVRFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUF0dHJpYnV0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLk5BTUVTUEFDRSA6CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOYW1lc3BhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DREFUQSA6CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDREFUQSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkVOVElUWV9ERUNMQVJBVElPTiA6CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFbnRpdHlEZWNsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuTk9UQVRJT05fREVDTEFSQVRJT04gOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90YXRpb25EZWNsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuU1BBQ0UgOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3BhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJwcm9jZXNzaW5nIGV2ZW50OiAiICsgZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGV2ZW50PXN0YXhTdHJlYW1SZWFkZXIubmV4dCgpOworICAgICAgICAgICAgfSB3aGlsZSAoZGVwdGghPTApOworCisgICAgICAgICAgICBoYW5kbGVFbmREb2N1bWVudCgpOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbjIoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoZnJhZ21lbnQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgc2F4SGFuZGxlci5lbmREb2N1bWVudCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmKGZyYWdtZW50KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHNheEhhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKG5ldyBMb2NhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXhTdHJlYW1SZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRDb2x1bW5OdW1iZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RheFN0cmVhbVJlYWRlci5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXhTdHJlYW1SZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRQdWJsaWNJZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RheFN0cmVhbVJlYWRlci5nZXRMb2NhdGlvbigpLmdldFN5c3RlbUlkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzYXhIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlUEkoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNheEhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKAorICAgICAgICAgICAgICAgIHN0YXhTdHJlYW1SZWFkZXIuZ2V0UElUYXJnZXQoKSwKKyAgICAgICAgICAgICAgICBzdGF4U3RyZWFtUmVhZGVyLmdldFBJRGF0YSgpKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYXJhY3RlcnMoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNheEhhbmRsZXIuY2hhcmFjdGVycygKKyAgICAgICAgICAgICAgICBzdGF4U3RyZWFtUmVhZGVyLmdldFRleHRDaGFyYWN0ZXJzKCksCisgICAgICAgICAgICAgICAgc3RheFN0cmVhbVJlYWRlci5nZXRUZXh0U3RhcnQoKSwKKyAgICAgICAgICAgICAgICBzdGF4U3RyZWFtUmVhZGVyLmdldFRleHRMZW5ndGgoKSApOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbjIoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRW5kRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBRTmFtZSBxTmFtZSA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0TmFtZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcGZpeCA9IHFOYW1lLmdldFByZWZpeCgpOworICAgICAgICAgICAgU3RyaW5nIHJhd25hbWUgPSAocGZpeCA9PSBudWxsIHx8IHBmaXgubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBxTmFtZS5nZXRMb2NhbFBhcnQoKQorICAgICAgICAgICAgICAgICAgICA6IHBmaXggKyAnOicgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKKyAgICAgICAgICAgIC8vIGZpcmUgZW5kRWxlbWVudAorICAgICAgICAgICAgc2F4SGFuZGxlci5lbmRFbGVtZW50KAorICAgICAgICAgICAgICAgIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAorICAgICAgICAgICAgICAgIHFOYW1lLmdldExvY2FsUGFydCgpLAorICAgICAgICAgICAgICAgIHJhd25hbWUpOworCisgICAgICAgICAgICAvLyBlbmQgbmFtZXNwYWNlIGJpbmRpbmdzCisgICAgICAgICAgICBpbnQgbnNDb3VudCA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBuc0NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3RheFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSk7CisgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7IC8vIHRydWUgZm9yIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYXhIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVN0YXJ0RWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBzdGFydCBuYW1lc3BhY2UgYmluZGluZ3MKKyAgICAgICAgICAgIGludCBuc0NvdW50ID0gc3RheFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYXhIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZygKKyAgICAgICAgICAgICAgICAgICAgZml4TnVsbChzdGF4U3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpKSksCisgICAgICAgICAgICAgICAgICAgIGZpeE51bGwoc3RheFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VVUkkoaSkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZmlyZSBzdGFydEVsZW1lbnQKKyAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gc3RheFN0cmVhbVJlYWRlci5nZXROYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcU5hbWUuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICBTdHJpbmcgcmF3bmFtZTsKKyAgICAgICAgICAgIGlmKHByZWZpeD09bnVsbCB8fCBwcmVmaXgubGVuZ3RoKCk9PTApCisgICAgICAgICAgICAgICAgcmF3bmFtZSA9IHFOYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhd25hbWUgPSBwcmVmaXggKyAnOicgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBzYXhIYW5kbGVyLnN0YXJ0RWxlbWVudCgKKyAgICAgICAgICAgICAgICBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKKyAgICAgICAgICAgICAgICBxTmFtZS5nZXRMb2NhbFBhcnQoKSwKKyAgICAgICAgICAgICAgICByYXduYW1lLAorICAgICAgICAgICAgICAgIGF0dHJzKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYocz09bnVsbCkgICAgIHJldHVybiAiIjsKKyAgICAgICAgZWxzZSAgICAgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFNUQVJUX0VMRU1FTlQgb3IgQVRUUklCVVRFCisgICAgICogU3RBWGV2ZW50LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgU3RBWCBhdHRyaWJ1dGVzIGNvbnZlcnRlZCB0byBhbiBvcmcueG1sLnNheC5BdHRyaWJ1dGVzCisgICAgICovCisgICAgcHJpdmF0ZSBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7CisgICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7CisKKyAgICAgICAgaW50IGV2ZW50VHlwZSA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIGlmIChldmVudFR5cGUgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkFUVFJJQlVURQorICAgICAgICAgICAgJiYgZXZlbnRUeXBlICE9IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigKKyAgICAgICAgICAgICAgICAiZ2V0QXR0cmlidXRlcygpIGF0dGVtcHRpbmcgdG8gcHJvY2VzczogIiArIGV2ZW50VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbiBTQVgsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIGF0dHJpYnV0ZXMgYnkgZGVmYXVsdC4KKyAgICAgICAgLy8gKHRoZXJlJ3MgYSBwcm9wZXJ0eSB0byBjb250cm9sIHRoYXQsIGJ1dCBhcyBmYXIgYXMgd2UgYXJlIGNvbmNlcm5lZAorICAgICAgICAvLyB3ZSBkb24ndCB1c2UgaXQuKSBTbyBkb24ndCBhZGQgeG1sbnM6KiB0byBhdHRyaWJ1dGVzLgorCisgICAgICAgIC8vIGdhdGhlciBub24tbmFtZXNwYWNlIGF0dHJzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKKyAgICAgICAgICAgIGlmKHVyaT09bnVsbCkgICB1cmk9IiI7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSk7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSk7CisgICAgICAgICAgICBTdHJpbmcgcU5hbWU7CisgICAgICAgICAgICBpZihwcmVmaXg9PW51bGwgfHwgcHJlZml4Lmxlbmd0aCgpPT0wKQorICAgICAgICAgICAgICAgIHFOYW1lID0gbG9jYWxOYW1lOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHFOYW1lID0gcHJlZml4ICsgJzonICsgbG9jYWxOYW1lOworICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEF0dHJpYnV0ZVR5cGUoaSk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGkpOworCisgICAgICAgICAgICBhdHRycy5hZGRBdHRyaWJ1dGUodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYXR0cnM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5hbWVzcGFjZSgpIHsKKyAgICAgICAgLy8gbm8tb3AgPz8/CisgICAgICAgIC8vIG5hbWVzcGFjZSBldmVudHMgZG9uJ3Qgbm9ybWFsbHkgb2NjdXIgb3V0c2lkZSBvZiBhIHN0YXJ0RWxlbWVudAorICAgICAgICAvLyBvciBlbmRFbGVtZW50CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUF0dHJpYnV0ZSgpIHsKKyAgICAgICAgLy8gbm8tb3AgPz8/CisgICAgICAgIC8vIGF0dHJpYnV0ZSBldmVudHMgZG9uJ3Qgbm9ybWFsbHkgb2NjdXIgb3V0c2lkZSBvZiBhIHN0YXJ0RWxlbWVudAorICAgICAgICAvLyBvciBlbmRFbGVtZW50CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURURCgpIHsKKyAgICAgICAgLy8gbm8tb3AgPz8/CisgICAgICAgIC8vIGl0IHNlZW1zIGxpa2Ugd2UgbmVlZCB0byBwYXNzIHRoaXMgaW5mbyBhbG9uZywgYnV0IGhvdz8KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29tbWVudCgpIHsKKyAgICAgICAgLy8gbm8tb3AgPz8/CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUVudGl0eVJlZmVyZW5jZSgpIHsKKyAgICAgICAgLy8gbm8tb3AgPz8/CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNwYWNlKCkgeworICAgICAgICAvLyBuby1vcCA/Pz8KKyAgICAgICAgLy8gdGhpcyBldmVudCBpcyBsaXN0ZWQgaW4gdGhlIGphdmFkb2MsIGJ1dCBub3QgaW4gdGhlIHNwZWMuCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5vdGF0aW9uRGVjbCgpIHsKKyAgICAgICAgLy8gbm8tb3AgPz8/CisgICAgICAgIC8vIHRoaXMgZXZlbnQgaXMgbGlzdGVkIGluIHRoZSBqYXZhZG9jLCBidXQgbm90IGluIHRoZSBzcGVjLgorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFbnRpdHlEZWNsKCkgeworICAgICAgICAvLyBuby1vcCA/Pz8KKyAgICAgICAgLy8gdGhpcyBldmVudCBpcyBsaXN0ZWQgaW4gdGhlIGphdmFkb2MsIGJ1dCBub3QgaW4gdGhlIHNwZWMuCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNEQVRBKCkgeworICAgICAgICAvLyBuby1vcCA/Pz8KKyAgICAgICAgLy8gdGhpcyBldmVudCBpcyBsaXN0ZWQgaW4gdGhlIGphdmFkb2MsIGJ1dCBub3QgaW4gdGhlIHNwZWMuCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQppbmRleCBhOTc3MjkzLi42MGE5MTVkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qKgogICogaXN0YWNrLWNvbW1vbnMgcnVudGltZSB1dGlsaXRpZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL3Rvb2xzL0FQVFR5cGVWaXNpdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC90b29scy9BUFRUeXBlVmlzaXRvci5qYXZhCmluZGV4IDU1ZGQ5MGIuLjI2NzhmMTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL3Rvb2xzL0FQVFR5cGVWaXNpdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvdG9vbHMvQVBUVHlwZVZpc2l0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwudG9vbHM7CiAKIGltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC90b29scy9NYXNraW5nQ2xhc3NMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL3Rvb2xzL01hc2tpbmdDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTlhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC90b29scy9NYXNraW5nQ2xhc3NMb2FkZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4uaXN0YWNrLmludGVybmFsLnRvb2xzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICoge0BsaW5rIENsYXNzTG9hZGVyfSB0aGF0IG1hc2tzIGEgc3BlY2lmaWVkIHNldCBvZiBjbGFzc2VzCisgKiBmcm9tIGl0cyBwYXJlbnQgY2xhc3MgbG9hZGVyLgorICoKKyAqIDxwPgorICogVGhpcyBjb2RlIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGlzb2xhdGVkIGVudmlyb25tZW50LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGNsYXNzIE1hc2tpbmdDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbWFza3M7CisKKyAgICBwdWJsaWMgTWFza2luZ0NsYXNzTG9hZGVyKFN0cmluZy4uLiBtYXNrcykgeworICAgICAgICB0aGlzLm1hc2tzID0gbWFza3M7CisgICAgfQorCisgICAgcHVibGljIE1hc2tpbmdDbGFzc0xvYWRlcihDb2xsZWN0aW9uPFN0cmluZz4gbWFza3MpIHsKKyAgICAgICAgdGhpcyhtYXNrcy50b0FycmF5KG5ldyBTdHJpbmdbbWFza3Muc2l6ZSgpXSkpOworICAgIH0KKworICAgIHB1YmxpYyBNYXNraW5nQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50LCBTdHJpbmcuLi4gbWFza3MpIHsKKyAgICAgICAgc3VwZXIocGFyZW50KTsKKyAgICAgICAgdGhpcy5tYXNrcyA9IG1hc2tzOworICAgIH0KKworICAgIHB1YmxpYyBNYXNraW5nQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50LCBDb2xsZWN0aW9uPFN0cmluZz4gbWFza3MpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIG1hc2tzLnRvQXJyYXkobmV3IFN0cmluZ1ttYXNrcy5zaXplKCldKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDbGFzczw/PiBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBtYXNrIDogbWFza3MpIHsKKyAgICAgICAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChtYXNrKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lLCByZXNvbHZlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC90b29scy9QYXJhbGxlbFdvcmxkQ2xhc3NMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL3Rvb2xzL1BhcmFsbGVsV29ybGRDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxM2EwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC90b29scy9QYXJhbGxlbFdvcmxkQ2xhc3NMb2FkZXIuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC50b29sczsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKiBMb2FkIGNsYXNzZXMvcmVzb3VyY2VzIGZyb20gYSBzaWRlIGZvbGRlciwgc28gdGhhdAorICogY2xhc3NlcyBvZiB0aGUgc2FtZSBwYWNrYWdlIGNhbiBsaXZlIGluIGEgc2luZ2xlIGphciBmaWxlLgorICoKKyAqIDxwPgorICogRm9yIGV4YW1wbGUsIHdpdGggdGhlIGZvbGxvd2luZyBqYXIgZmlsZToKKyAqIDxwcmU+CisgKiAgLworICogICstIGZvbworICogICAgICstIFguY2xhc3MKKyAqICArLSBiYXIKKyAqICAgICArLSBYLmNsYXNzCisgKiA8L3ByZT4KKyAqIDxwPgorICoge0BsaW5rIFBhcmFsbGVsV29ybGRDbGFzc0xvYWRlcn0oImZvby8iKSB3b3VsZCBsb2FkIDx0dD5YLmNsYXNzPHR0PiBmcm9tCisgKiA8dHQ+L2Zvby9YLmNsYXNzPC90dD4gKG5vdGUgdGhhdCBYIGlzIGRlZmluZWQgaW4gdGhlIHJvb3QgcGFja2FnZSwgbm90CisgKiA8dHQ+Zm9vLlg8L3R0Pi4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2FuIGJlIGNvbWJpbmVkIHdpdGggIHtAbGluayBNYXNraW5nQ2xhc3NMb2FkZXJ9IHRvIG1hc2sgY2xhc3NlcyB3aGljaCBhcmUgbG9hZGVkIGJ5IHRoZSBwYXJlbnQKKyAqIGNsYXNzIGxvYWRlciBzbyB0aGF0IHRoZSBjaGlsZCBjbGFzcyBsb2FkZXIKKyAqIGNsYXNzZXMgbGl2aW5nIGluIGRpZmZlcmVudCBmb2xkZXJzIGFyZSBsb2FkZWQKKyAqIGJlZm9yZSB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciBsb2FkcyBjbGFzc2VzIGxpdmluZyB0aGUgamFyIGZpbGUgcHVibGljbHkKKyAqIHZpc2libGUKKyAqIEZvciBleGFtcGxlLCB3aXRoIHRoZSBmb2xsb3dpbmcgamFyIGZpbGU6CisgKiA8cHJlPgorICogIC8KKyAqICArLSBmb28KKyAqICAgICArLSBYLmNsYXNzCisgKiAgKy0gYmFyCisgKiAgICAgKy1mb28KKyAqICAgICAgICArLSBYLmNsYXNzCisgKiA8L3ByZT4KKyAqIDxwPgorICoge0BsaW5rIFBhcmFsbGVsV29ybGRDbGFzc0xvYWRlcn0oTWFza2luZ0NsYXNzTG9hZGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpIHdvdWxkIGxvYWQgPHR0PmZvby5YLmNsYXNzPHR0PiBmcm9tCisgKiA8dHQ+L2Jhci9mb28uWC5jbGFzczwvdHQ+IG5vdCB0aGUgPHR0PmZvby5YLmNsYXNzPHR0PiBpbiB0aGUgcHVibGljbHkgdmlzaWJsZSBwbGFjZSBpbiB0aGUgamFyIGZpbGUsIHRodXMKKyAqIG1hc2tpbmcgdGhlIHBhcmVudCBjbGFzc0xvYWRlciBmcm9tIGxvYWRpbmcgdGhlIGNsYXNzIGZyb20gIDx0dD5mb28uWC5jbGFzczx0dD4KKyAqIChub3RlIHRoYXQgWCBpcyBkZWZpbmVkIGluIHRoZSAgcGFja2FnZSBmb28sIG5vdAorICogPHR0PmJhci5mb28uWDwvdHQ+LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGNsYXNzIFBhcmFsbGVsV29ybGRDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKKworICAgIC8qKgorICAgICAqIFN0cmluZ3MgbGlrZSAicHJlZml4LyIsICJhYmMvIiwgb3IgIiIgdG8gaW5kaWNhdGUKKyAgICAgKiBjbGFzc2VzIHNob3VsZCBiZSBsb2FkZWQgbm9ybWFsbHkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJlZml4OworCisgICAgcHVibGljIFBhcmFsbGVsV29ybGRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnQsU3RyaW5nIHByZWZpeCkgeworICAgICAgICBzdXBlcihwYXJlbnQpOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKStwcmVmaXgubGVuZ3RoKCkrNik7CisgICAgICAgIHNiLmFwcGVuZChwcmVmaXgpLmFwcGVuZChuYW1lLnJlcGxhY2UoJy4nLCcvJykpLmFwcGVuZCgiLmNsYXNzIik7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRQYXJlbnQoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoaXM9PW51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgd2hpbGUoKGxlbj1pcy5yZWFkKGJ1ZikpPj0wKQorICAgICAgICAgICAgICAgIGJhb3Mud3JpdGUoYnVmLDAsbGVuKTsKKworICAgICAgICAgICAgYnVmID0gYmFvcy50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgaW50IHBhY2tJbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChwYWNrSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGtnbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIHBhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcGFja2FnZSBhbHJlYWR5IGxvYWRlZC4KKyAgICAgICAgICAgICAgICBQYWNrYWdlIHBrZyA9IGdldFBhY2thZ2UocGtnbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHBrZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmluZVBhY2thZ2UocGtnbmFtZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKG5hbWUsYnVmLDAsYnVmLmxlbmd0aCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UocHJlZml4K25hbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBFbnVtZXJhdGlvbjxVUkw+IGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5nZXRSZXNvdXJjZXMoICAgIHByZWZpeCtuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiB0aGUgVVJMIGluc2lkZSBqYXIsIHJldHVybnMgdGhlIFVSTCB0byB0aGUgamFyIGl0c2VsZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVSTCB0b0phclVybChVUkwgcmVzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHVybCA9IHJlcy50b0V4dGVybmFsRm9ybSgpOworICAgICAgICBpZighdXJsLnN0YXJ0c1dpdGgoImphcjoiKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJMb2FkZWQgb3V0c2lkZSBhIGphciAiK3VybCk7CisgICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoNCk7IC8vIGN1dCBvZmYgamFyOgorICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsdXJsLmxhc3RJbmRleE9mKCchJykpOyAgICAvLyBjdXQgb2ZmIGV2ZXJ5dGhpbmcgYWZ0ZXIgJyEnCisgICAgICAgIHJldHVybiBuZXcgVVJMKHVybCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvdG9vbHMvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC90b29scy9wYWNrYWdlLWluZm8uamF2YQppbmRleCBmNzcwNDgzLi4zY2U4YzgwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC90b29scy9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC90b29scy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qKgogICogaXN0YWNrLWNvbW1vbnMgdG9vbCB0aW1lIHV0aWxpdGllcy4KICAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC93cy9Bbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL3dzL0Fubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5SW1wbC5qYXZhCmluZGV4IGQ5NzZjZDYuLmM0ZjhmODIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL3dzL0Fubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vaXN0YWNrL2ludGVybmFsL3dzL0Fubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAgICAgICAgIGlmICh3c0FQID09IG51bGwpIHsKICAgICAgICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0IGNvbnRleHQgPSBuZXcgQW5ub3RhdGlvblByb2Nlc3NvckNvbnRleHQoKTsKLSAgICAgICAgICAgIHdzQVAgPSBuZXcgV2ViU2VydmljZUFQKG51bGwsIG51bGwsIG51bGwsIGNvbnRleHQpOworICAgICAgICAgICAgd3NBUCA9IG5ldyBXZWJTZXJ2aWNlQVAobnVsbCwgY29udGV4dCwgbnVsbCwgbnVsbCk7CiAKICAgICAgICAgfQogICAgICAgICB3c0FQLmluaXQoYXBFbnYpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9pc3RhY2svaW50ZXJuYWwvd3MvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC93cy9wYWNrYWdlLWluZm8uamF2YQppbmRleCA5Y2Y0NDI1Li4zMTg1MGUwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC93cy9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2lzdGFjay9pbnRlcm5hbC93cy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw3ICsyNiw3IEBACiAvKioKICAqCiAgKiA8UD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUge0BsaW5rIGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yIEFubm90YXRpb25Qcm9jZXNzb3J9Ci0gKiBpbmNsdWRlZCB3aXRoIEpBWC1XUyAyLjAuCisgKiBpbmNsdWRlZCB3aXRoIEpBWC1XUyAyLjAuMS4KICAqCiAgKiA8cD5UaGUge0BsaW5rIGNvbS5zdW4uaXN0YWNrLmludGVybmFsLndzLkFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5SW1wbCBBbm5vYXRhdGlvbm5Qcm9jZXNzb3JGYWN0b3J5SW1wbH0gY2xhc3MKICAqIHRlbGxzIHRoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy90b29sZG9jcy9zaGFyZS9hcHQuaHRtbCI+QVBUPC9hPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9ldGMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuUGx1Z2luIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9ldGMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuUGx1Z2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMTljODAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2V0Yy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW4KQEAgLTAsMCArMSw0IEBACitjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hZGRvbi5sb2NhdG9yLlNvdXJjZUxvY2F0aW9uQWRkT24KK2NvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFkZG9uLnN5bmMuU3luY2hyb25pemVkTWV0aG9kQWRkT24KK2NvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFkZG9uLmF0X2dlbmVyYXRlZC5QbHVnaW5JbXBsCitjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hZGRvbi5lcGlzb2RlLlBsdWdpbkltcGwKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL0NvbmZpZ1JlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvQ29uZmlnUmVhZGVyLmphdmEKaW5kZXggYzlhZmNhYS4uMmVjNDU1OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvQ29uZmlnUmVhZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvQ29uZmlnUmVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCmluZGV4IGRkYzVhNGEuLjVkZWM2ZGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKQEAgLTEsMyArMSwyOCBAQAorIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKIFVORVhQRUNURURfTkdDQ19UT0tFTiA9IFwKICAgICBVbmV4cGVjdGVkIHswfSBhcHBlYXJzIGF0IGxpbmUgezF9IGNvbHVtbiB7Mn0KIApAQCAtNSwxNSArMzAsMTYgQEAKICAgICBOb24tZXhpc3RlbnQgZGlyZWN0b3J5OiB7MH0KIAogVkVSU0lPTiA9IFwKLQlzY2hlbWFnZW4gdmVyc2lvbiAiSkFYQiAyLjAgaW4gSkRLIDEuNiIgXG5cCi0JSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCAoYnVpbGQgSkFYQiAyLjAgaW4gSkRLIDEuNikJCisJc2NoZW1hZ2VuIHZlcnNpb24gIkpBWEIgMi4xLjMiIFxuXAorCUphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgKGJ1aWxkIEpBWEIgMi4xLjMgaW4gSkRLKQkKIAogVVNBR0UgPSBcCiBVc2FnZTogc2NoZW1hZ2VuIFstb3B0aW9ucyAuLi5dIDxqYXZhIGZpbGVzPiBcblwKIE9wdGlvbnM6IFxuXAotXCBcIFwgXCAtZCA8cGF0aD4gICAgICAgICA6ICBzcGVjaWZ5IHdoZXJlIHRvIHBsYWNlIHByb2Nlc3NvciBhbmQgamF2YWMgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzIFxuXAotXCBcIFwgXCAtY3AgPHBhdGg+ICAgICAgICA6ICBzcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBzcGVjaWZpZWQgZmlsZXMgIFxuXAotXCBcIFwgXCAtY2xhc3NwYXRoIDxwYXRoPiA6ICBzcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBzcGVjaWZpZWQgZmlsZXMgIFxuXAotXCBcIFwgXCAtdmVyc2lvbiAgICAgICAgICA6ICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24KK1wgXCBcIFwgLWQgPHBhdGg+ICAgICAgICAgOiAgc3BlY2lmeSB3aGVyZSB0byBwbGFjZSBwcm9jZXNzb3IgYW5kIGphdmFjIGdlbmVyYXRlZCBjbGFzcyBmaWxlc1xuXAorXCBcIFwgXCAtY3AgPHBhdGg+ICAgICAgICA6ICBzcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBzcGVjaWZpZWQgZmlsZXNcblwKK1wgXCBcIFwgLWNsYXNzcGF0aCA8cGF0aD4gOiAgc3BlY2lmeSB3aGVyZSB0byBmaW5kIHVzZXIgc3BlY2lmaWVkIGZpbGVzXG5cCitcIFwgXCBcIC1lcGlzb2RlIDxmaWxlPiAgIDogIGdlbmVyYXRlIGVwaXNvZGUgZmlsZSBmb3Igc2VwYXJhdGUgY29tcGlsYXRpb25cblwKK1wgXCBcIFwgLXZlcnNpb24gICAgICAgICAgOiAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uXG5cCiBcIFwgXCBcIC1oZWxwICAgICAgICAgICAgIDogIGRpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9NZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvTWVzc2FnZXMuamF2YQppbmRleCBiMWYyMmY0Li44YTk2NTZmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjOwogCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9OR0NDUnVudGltZUV4LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9OR0NDUnVudGltZUV4LmphdmEKaW5kZXggOGY1MzgwNy4uNjk5ZjQ3OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvTkdDQ1J1bnRpbWVFeC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL05HQ0NSdW50aW1lRXguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC5qeGM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9TY2hlbWFHZW5lcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL1NjaGVtYUdlbmVyYXRvci5qYXZhCmluZGV4IGVmMTc4MzAuLjNiMjY4ZDUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL1NjaGVtYUdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL1NjaGVtYUdlbmVyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4YzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTEyMiw3ICsxMjEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQ2xhc3Mgc2NoZW1hZ2VuUnVubmVyID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKFJ1bm5lci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBNZXRob2QgbWFpbk1ldGhvZCA9IHNjaGVtYWdlblJ1bm5lci5nZXREZWNsYXJlZE1ldGhvZCgibWFpbiIsU3RyaW5nW10uY2xhc3MpOworICAgICAgICBNZXRob2QgbWFpbk1ldGhvZCA9IHNjaGVtYWdlblJ1bm5lci5nZXREZWNsYXJlZE1ldGhvZCgibWFpbiIsU3RyaW5nW10uY2xhc3MsRmlsZS5jbGFzcyk7CiAKICAgICAgICAgTGlzdDxTdHJpbmc+IGFwdGFyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKIApAQCAtMTUwLDcgKzE0OSw3IEBACiAgICAgICAgIGFwdGFyZ3MuYWRkQWxsKG9wdGlvbnMuYXJndW1lbnRzKTsKIAogICAgICAgICBTdHJpbmdbXSBhcmdzYXJyYXkgPSBhcHRhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1thcHRhcmdzLnNpemUoKV0pOwotICAgICAgICByZXR1cm4gKEludGVnZXIpbWFpbk1ldGhvZC5pbnZva2UobnVsbCxuZXcgT2JqZWN0W117YXJnc2FycmF5fSk7CisgICAgICAgIHJldHVybiAoSW50ZWdlciltYWluTWV0aG9kLmludm9rZShudWxsLG5ldyBPYmplY3RbXXthcmdzYXJyYXksb3B0aW9ucy5lcGlzb2RlRmlsZX0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjA0LDExICsyMDMsMTUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bm5lciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IG1haW4oU3RyaW5nW10gYXJncywgRmlsZSBlcGlzb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gUnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CiAgICAgICAgICAgICBDbGFzcyBhcHQgPSBjbC5sb2FkQ2xhc3MoImNvbS5zdW4udG9vbHMuYXB0Lk1haW4iKTsKICAgICAgICAgICAgIE1ldGhvZCBwcm9jZXNzTWV0aG9kID0gYXB0LmdldE1ldGhvZCgicHJvY2VzcyIsQW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnkuY2xhc3MsIFN0cmluZ1tdLmNsYXNzKTsKLSAgICAgICAgICAgIHJldHVybiAoSW50ZWdlcikgcHJvY2Vzc01ldGhvZC5pbnZva2UobnVsbCwgbmV3IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjLmFwdC5TY2hlbWFHZW5lcmF0b3IoKSwgYXJncyk7CisKKyAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjLmFwdC5TY2hlbWFHZW5lcmF0b3IgciA9IG5ldyBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5hcHQuU2NoZW1hR2VuZXJhdG9yKCk7CisgICAgICAgICAgICBpZihlcGlzb2RlIT1udWxsKQorICAgICAgICAgICAgICAgIHIuc2V0RXBpc29kZUZpbGUoZXBpc29kZSk7CisgICAgICAgICAgICByZXR1cm4gKEludGVnZXIpIHByb2Nlc3NNZXRob2QuaW52b2tlKG51bGwsIHIsIGFyZ3MpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L0Fubm90YXRpb25QYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9Bbm5vdGF0aW9uUGFyc2VyLmphdmEKaW5kZXggMDkxNzUyMy4uNDdkMWZjNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L0Fubm90YXRpb25QYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvQW5ub3RhdGlvblBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5hcHQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC04OCw3ICs4Nyw3IEBACiAgICAgICAgICAgICAgICAgLy8gLUFjb25maWc9Zm9vLmNvbmZpZzpiYXIuY29uZmlnIHdoZXJlIDogaXMgdGhlIHBhdGhTZXBhcmF0b3JDaGFyCiAgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSxGaWxlLnBhdGhTZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgIGlmKCFzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lci5lcnJvcihudWxsLE1lc3NhZ2VzLk5PX0ZJTEVfU1BFQ0lGSUVELmZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lci5lcnJvcihudWxsLE1lc3NhZ2VzLk9QRVJBTkRfTUlTU0lORy5mb3JtYXQoQ29uc3QuQ09ORklHX0ZJTEVfT1BUSU9OKSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L0Fubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L0Fubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5SW1wbC5qYXZhCmluZGV4IGNlODQyZjkuLjY4YWE1MTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9Bbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvQW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnlJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjLmFwdDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvQ29uc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9Db25zdC5qYXZhCmluZGV4IDZiNjAwOGIuLjhlYzljZGIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9Db25zdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9Db25zdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5hcHQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvRXJyb3JSZWNlaXZlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9FcnJvclJlY2VpdmVySW1wbC5qYXZhCmluZGV4IDExN2ZlYzcuLmU5YTA1MzQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9FcnJvclJlY2VpdmVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9FcnJvclJlY2VpdmVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5hcHQ7CiAKIGltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L0lubGluZUFubm90YXRpb25SZWFkZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvSW5saW5lQW5ub3RhdGlvblJlYWRlckltcGwuamF2YQppbmRleCA1NTNkYzY4Li4zMzkwYTVmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvSW5saW5lQW5ub3RhdGlvblJlYWRlckltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvSW5saW5lQW5ub3RhdGlvblJlYWRlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwyMSArMjIsMjIgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5hcHQ7CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7CitpbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247CiBpbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLk1pcnJvcmVkVHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLk1pcnJvcmVkVHlwZXNFeGNlcHRpb247CiBpbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbi5BYnN0cmFjdElubGluZUFubm90YXRpb25SZWFkZXJJbXBsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uUmVhZGVyOwpAQCAtNjcsNiArNjgsMTAgQEAKICAgICAgICAgcmV0dXJuIGYuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uVHlwZSkhPW51bGw7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NBbm5vdGF0aW9uKFR5cGVEZWNsYXJhdGlvbiBjbGF6eiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKSB7CisgICAgICAgIHJldHVybiBjbGF6ei5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25UeXBlKSE9bnVsbDsKKyAgICB9CisKICAgICBwdWJsaWMgQW5ub3RhdGlvbltdIGdldEFsbEZpZWxkQW5ub3RhdGlvbnMoRmllbGREZWNsYXJhdGlvbiBmaWVsZCwgTG9jYXRhYmxlIHNyY1BvcykgewogICAgICAgICByZXR1cm4gZ2V0QWxsQW5ub3RhdGlvbnMoZmllbGQsc3JjUG9zKTsKICAgICB9CkBAIC05NCw3ICs5OSw4IEBACiAgICAgICAgIGZvciggQW5ub3RhdGlvbk1pcnJvciBtIDogZGVjbC5nZXRBbm5vdGF0aW9uTWlycm9ycygpICkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBtLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZnVsbE5hbWUpOworICAgICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0eXBlID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhmdWxsTmFtZSkuYXNTdWJjbGFzcyhBbm5vdGF0aW9uLmNsYXNzKTsKICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBkZWNsLmdldEFubm90YXRpb24odHlwZSk7CiAgICAgICAgICAgICAgICAgaWYoYW5ub3RhdGlvbiE9bnVsbCkKICAgICAgICAgICAgICAgICAgICAgci5hZGQoIExvY2F0YWJsZUFubm90YXRpb24uY3JlYXRlKGFubm90YXRpb24sc3JjUG9zKSApOwpAQCAtMTM1LDYgKzE0MSwyNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFR5cGVNaXJyb3JbXSBnZXRDbGFzc0FycmF5VmFsdWUoQW5ub3RhdGlvbiBhLCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYS5hbm5vdGF0aW9uVHlwZSgpLmdldE1ldGhvZChuYW1lKS5pbnZva2UoYSk7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzaG91bGQgdGhyb3cgYSBNaXJyb3JlZFR5cGVzRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBY2Nlc3NFcnJvcihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYoIGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE1pcnJvcmVkVHlwZXNFeGNlcHRpb24gKSB7CisgICAgICAgICAgICAgICAgTWlycm9yZWRUeXBlc0V4Y2VwdGlvbiBtZSA9IChNaXJyb3JlZFR5cGVzRXhjZXB0aW9uKWUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFR5cGVNaXJyb3I+IHIgPSBtZS5nZXRUeXBlTWlycm9ycygpOworICAgICAgICAgICAgICAgIHJldHVybiByLnRvQXJyYXkobmV3IFR5cGVNaXJyb3Jbci5zaXplKCldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGltcG9zc2libGUKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCBTdHJpbmcgZnVsbE5hbWUoTWV0aG9kRGVjbGFyYXRpb24gbSkgewogICAgICAgICByZXR1cm4gbS5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKycjJyttLmdldFNpbXBsZU5hbWUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L01lc3NhZ2VCdW5kbGUucHJvcGVydGllcwppbmRleCA5ZjY5MTI0Li5jOWE0ZDRkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKQEAgLTEsMTIgKzEsMzQgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBOT05fRVhJU1RFTlRfRklMRSA9IFwKICAgICBEaXJlY3RvcnkgInswfSIgZG9lc24ndCBleGlzdC4KIAogVU5SRUNPR05JWkVEX1BBUkFNRVRFUiA9IFwKICAgICBVbnJlY29nbml6ZWQgb3B0aW9uIHswfSBpcyBub3QgdmFsaWQuCiAKLU5PX0ZJTEVfU1BFQ0lGSUVEID0gXAotICAgIE5vIGRpcmVjdG9yeSB3YXMgc3BlY2lmaWVkLgotCi1OT19DTEFTU1BBVEhfU1BFQ0lGSUVEID0gXAotICAgIE5vIGNsYXNzcGF0aCB3YXMgc3BlY2lmaWVkLgorT1BFUkFORF9NSVNTSU5HID0gXAorICAgIE9wdGlvbiAiezB9IiBpcyBtaXNzaW5nIGFuIG9wZXJhbmQuCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9NZXNzYWdlcy5qYXZhCmluZGV4IDYxZmM2MTMuLjEzZjMyOTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5hcHQ7CiAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTM2LDkgKzM1LDggQEAKIGVudW0gTWVzc2FnZXMgewogICAgIC8vIEFjY2Vzc29yCiAgICAgTk9OX0VYSVNURU5UX0ZJTEUsIC8vIDEgYXJnCi0gICAgTk9fRklMRV9TUEVDSUZJRUQsIC8vIDAgYXJncwotICAgIE5PX0NMQVNTUEFUSF9TUEVDSUZJRUQsIC8vIDAgYXJncwogICAgIFVOUkVDT0dOSVpFRF9QQVJBTUVURVIsIC8vMSBhcmcKKyAgICBPUEVSQU5EX01JU1NJTkcsIC8vIDEgYXJnCiAgICAgOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoTWVzc2FnZXMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArIi5NZXNzYWdlQnVuZGxlIik7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvT3B0aW9ucy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L09wdGlvbnMuamF2YQppbmRleCBhNjNmNGY5Li5mYmViNjFkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvT3B0aW9ucy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9PcHRpb25zLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjLmFwdDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTQ0LDYgKzQzLDggQEAKIAogICAgIHB1YmxpYyBGaWxlIHRhcmdldERpciA9IG51bGw7CiAKKyAgICBwdWJsaWMgRmlsZSBlcGlzb2RlRmlsZSA9IG51bGw7CisKICAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogCiAgICAgcHVibGljIHZvaWQgcGFyc2VBcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKQEAgLTY0LDcgKzY1LDcgQEAKICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZCIpKSB7CiAgICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VzLk5PX0ZJTEVfU1BFQ0lGSUVELmZvcm1hdCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZXMuT1BFUkFORF9NSVNTSU5HLmZvcm1hdChhcmdzW2ldKSkpOwogICAgICAgICAgICAgdGFyZ2V0RGlyID0gbmV3IEZpbGUoYXJnc1srK2ldKTsKICAgICAgICAgICAgIGlmKCAhdGFyZ2V0RGlyLmV4aXN0cygpICkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oCkBAIC03MiwxMCArNzMsMTggQEAKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZXBpc29kZSIpKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VzLk9QRVJBTkRfTUlTU0lORy5mb3JtYXQoYXJnc1tpXSkpKTsKKyAgICAgICAgICAgIGVwaXNvZGVGaWxlID0gbmV3IEZpbGUoYXJnc1srK2ldKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItY3AiKSB8fCBhcmdzW2ldLmVxdWFscygiLWNsYXNzcGF0aCIpKSB7CiAgICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VzLk5PX0NMQVNTUEFUSF9TUEVDSUZJRUQuZm9ybWF0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlcy5PUEVSQU5EX01JU1NJTkcuZm9ybWF0KGFyZ3NbaV0pKSk7CiAgICAgICAgICAgICBjbGFzc3BhdGggPSBhcmdzWysraV07CiAKICAgICAgICAgICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L1NjaGVtYUdlbmVyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L1NjaGVtYUdlbmVyYXRvci5qYXZhCmluZGV4IDYzZjFhNTAuLmJiYWRjZTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9TY2hlbWFHZW5lcmF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvU2NoZW1hR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjLmFwdDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTY3LDYgKzY2LDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsRmlsZT4gc2NoZW1hTG9jYXRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWxlPigpOwogCisgICAgcHJpdmF0ZSBGaWxlIGVwaXNvZGVGaWxlOworCiAgICAgcHVibGljIFNjaGVtYUdlbmVyYXRvcigpIHsKICAgICB9CiAKQEAgLTc0LDYgKzc1LDEwIEBACiAgICAgICAgIHNjaGVtYUxvY2F0aW9ucy5wdXRBbGwobSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0RXBpc29kZUZpbGUoRmlsZSBlcGlzb2RlRmlsZSkgeworICAgICAgICB0aGlzLmVwaXNvZGVGaWxlID0gZXBpc29kZUZpbGU7CisgICAgfQorCiAgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBzdXBwb3J0ZWRPcHRpb25zKCkgewogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgfQpAQCAtMTEzLDE0ICsxMTgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKHN1Z2dlc3RlZEZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IGVudi5nZXRGaWxlcigpLmNyZWF0ZUJpbmFyeUZpbGUoRmlsZXIuTG9jYXRpb24uQ0xBU1NfVFJFRSwiIixmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLmdldEFic29sdXRlRmlsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtUmVzdWx0IHNzID0gbmV3IFN0cmVhbVJlc3VsdChvdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYuZ2V0TWVzc2FnZXIoKS5wcmludE5vdGljZSgiV3JpdGluZyAiK2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcy5zZXRTeXN0ZW1JZChmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzLnNldFN5c3RlbUlkKGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGVycm9yTGlzdGVuZXIpOworCisgICAgICAgICAgICAgICAgICAgIGlmKGVwaXNvZGVGaWxlIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYuZ2V0TWVzc2FnZXIoKS5wcmludE5vdGljZSgiV3JpdGluZyAiK2VwaXNvZGVGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdlbmVyYXRlRXBpc29kZUZpbGUobmV3IFN0cmVhbVJlc3VsdChlcGlzb2RlRmlsZSkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3RlbmVyLmVycm9yKGUuZ2V0TWVzc2FnZSgpLGUpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9hcHQvcGFja2FnZS5odG1sCmluZGV4IDYwNDJkYTkuLmMzYmIxNzEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2FwdC9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvYXB0L3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aGVtbD48Ym9keT4KIEFQVCByZWxhdGVkIGNvZGUuCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvQXR0cmlidXRlc0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvQXR0cmlidXRlc0ltcGwuamF2YQppbmRleCBlNmUzYTkyLi44NmY4ZmRhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL0F0dHJpYnV0ZXNJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9BdHRyaWJ1dGVzSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLy8gQXR0cmlidXRlc0ltcGwuamF2YSAtIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQXR0cmlidXRlcy4KIC8vIFdyaXR0ZW4gYnkgRGF2aWQgTWVnZ2luc29uLCBzYXhAbWVnZ2luc29uLmNvbQogLy8gTk8gV0FSUkFOVFkhICBUaGlzIGNsYXNzIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgpAQCAtNjcsNiArNjYsNyBAQAogICogQHNpbmNlIFNBWCAyLjAKICAqIEBhdXRob3IgRGF2aWQgTWVnZ2luc29uLAogICogICAgICAgICA8YSBocmVmPSJtYWlsdG86c2F4QG1lZ2dpbnNvbi5jb20iPnNheEBtZWdnaW5zb24uY29tPC9hPgorICogQHZlcnNpb24gMi4wCiAgKi8KIHB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzSW1wbCBpbXBsZW1lbnRzIEF0dHJpYnV0ZXMKIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvQ2xhc3Nlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9DbGFzc2VzLmphdmEKaW5kZXggYWQ3MDFjMi4uNDc1YzgzMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9DbGFzc2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9DbGFzc2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5nZW4uY29uZmlnOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTc2LDEyICs3NSw2IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpID09ICIiICYmICRfX2xvY2FsID09ICJjbGFzc2VzIikpIHsKQEAgLTkzLDYgKzg2LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaSA9PSAiIiAmJiAkX19sb2NhbCA9PSAiZXhjbHVkZXMiKSkgewpAQCAtMTM0LDYgKzEzMywxNyBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkgPT0gIiIgJiYgJF9fbG9jYWwgPT0gImV4Y2x1ZGVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwpAQCAtMTU3LDExICsxNjcsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaSA9PSAiIiAmJiAkX19sb2NhbCA9PSAiaW5jbHVkZXMiKSkgewpAQCAtMTczLDE1ICsxNzgsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpID09ICIiICYmICRfX2xvY2FsID09ICJleGNsdWRlcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMjU0LDYgKzI1MywyMCBAQAogCiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmNsdWRlX2NvbnRlbnQgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OworICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhjbHVkZV9jb250ZW50ID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKKyAgICAgICAgICAgICAgICBhY3Rpb24wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGV4Y2x1ZGVfY29udGVudCA9ICR2YWx1ZTsKQEAgLTI2MSw3ICsyNzQsMjAgQEAKICAgICAgICAgICAgICAgICBhY3Rpb24wKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3RleHQgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OworICAgICAgICAgICAgICAgIGFjdGlvbjMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaW5jbHVkZV9jb250ZW50ID0gJHZhbHVlOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKQEAgLTI3NSwzOCArMzAxLDExIEBACiAgICAgICAgICAgICAgICAgYWN0aW9uMSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dCh0aGlzLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmNsdWRlX2NvbnRlbnQgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OwotICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9fdGV4dCA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleGNsdWRlX2NvbnRlbnQgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwotICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL0NvbmZpZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9Db25maWcuamF2YQppbmRleCA5NjFkZjFjLi5iNTg3MTlhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL0NvbmZpZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvQ29uZmlnLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5nZW4uY29uZmlnOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTc5LDcgKzc4LDcgQEAKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkgPT0gIiIgJiYgJF9fbG9jYWwgPT0gInNjaGVtYSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgU2NoZW1hKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMSwgYmFzZURpcik7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgU2NoZW1hKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzLCBiYXNlRGlyKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMTAxLDcgKzEwMCw3IEBACiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpID09ICIiICYmICRfX2xvY2FsID09ICJzY2hlbWEiKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IFNjaGVtYSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzIsIGJhc2VEaXIpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IFNjaGVtYSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNCwgYmFzZURpcik7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTEyNCw3ICsxMjMsNyBAQAogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaSA9PSAiIiAmJiAkX19sb2NhbCA9PSAiY2xhc3NlcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgQ2xhc3Nlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzQpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IENsYXNzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0yODksMjEgKzI4OCwyMSBAQAogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgMzE6CisgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBfc2NoZW1hID0gKChTY2hlbWEpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIF9zY2hlbWEgPSAoKFNjaGVtYSkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM0OgorICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2xhc3NlcyA9ICgoQ2xhc3NlcykkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9OR0NDRXZlbnRSZWNlaXZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9OR0NDRXZlbnRSZWNlaXZlci5qYXZhCmluZGV4IGI0ZWU5ODkuLjNjNjYyNGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvTkdDQ0V2ZW50UmVjZWl2ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL05HQ0NFdmVudFJlY2VpdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjLmdlbi5jb25maWc7CiAKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9OR0NDRXZlbnRTb3VyY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvTkdDQ0V2ZW50U291cmNlLmphdmEKaW5kZXggZWQ1OWEwOC4uNmVmOGQ2OWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvTkdDQ0V2ZW50U291cmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9OR0NDRXZlbnRTb3VyY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC5qeGMuZ2VuLmNvbmZpZzsKIAogaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL05HQ0NIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL05HQ0NIYW5kbGVyLmphdmEKaW5kZXggZGI3MjM1NC4uMjc5ZDU2NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9OR0NDSGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvTkdDQ0hhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC5qeGMuZ2VuLmNvbmZpZzsKIAogaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CkBAIC0zMSw2ICszMCw3IEBACiAvKioKICAqCiAgKgorICogQHZlcnNpb24gJElkOiBOR0NDSGFuZGxlci5qYXZhLHYgMS45IDIwMDIvMDkvMjkgMDI6NTU6NDggb2thamltYSBFeHAgJAogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaSAoa2tAa29oc3VrZS5vcmcpCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOR0NDSGFuZGxlciBpbXBsZW1lbnRzIE5HQ0NFdmVudFJlY2VpdmVyIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvTkdDQ0ludGVybGVhdmVGaWx0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvTkdDQ0ludGVybGVhdmVGaWx0ZXIuamF2YQppbmRleCAxODBhODMwLi4yYmQ2ZGM0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL05HQ0NJbnRlcmxlYXZlRmlsdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9OR0NDSW50ZXJsZWF2ZUZpbHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5nZW4uY29uZmlnOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvTkdDQ1J1bnRpbWUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvTkdDQ1J1bnRpbWUuamF2YQppbmRleCA2ZDk0MmEzLi41ODFmZWYzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL05HQ0NSdW50aW1lLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9OR0NDUnVudGltZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5nZW4uY29uZmlnOwogCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC01MSw2ICs1MCw3IEBACiAgKgogICogIDxsaT5UT0RPOiBwcm92aWRlIHN1cHBvcnQgZm9yIGludGVybGVhdmluZy4KICAqCisgKiBAdmVyc2lvbiAkSWQ6IE5HQ0NSdW50aW1lLmphdmEsdiAxLjE2IDIwMDMvMDMvMjMgMDI6NDc6NDYgb2thamltYSBFeHAgJAogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaSAoa2tAa29oc3VrZS5vcmcpCiAgKi8KIHB1YmxpYyBjbGFzcyBOR0NDUnVudGltZSBpbXBsZW1lbnRzIENvbnRlbnRIYW5kbGVyLCBOR0NDRXZlbnRTb3VyY2UgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9TY2hlbWEuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvU2NoZW1hLmphdmEKaW5kZXggNDg5NTQyMS4uMWE3ZjQxZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9TY2hlbWEuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL1NjaGVtYS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC5qeGMuZ2VuLmNvbmZpZzsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC02NiwxNCArNjUsMTQgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibG9jYXRpb24iKSk+PTApIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCkgewogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05NCwxNCArOTMsMTQgQEAKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgorICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImxvY2F0aW9uIikpPj0wKSB7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEyMCw2ICsxMTksMjMgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudCh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkgPT0gIiIgJiYgJF9fbG9jYWwgPT0gInNjaGVtYSIpKSB7CkBAIC0xNDMsMjMgKzE1OSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUVsZW1lbnQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTE3MywxMyArMTcyLDEzIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpID09ICIiICYmICRfX2xvY2FsID09ICJsb2NhdGlvbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpID09ICIiICYmICRfX2xvY2FsID09ICJuYW1lc3BhY2UiKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xODksMTMgKzE4OCwxMyBAQAogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6CisgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpID09ICIiICYmICRfX2xvY2FsID09ICJuYW1lc3BhY2UiKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaSA9PSAiIiAmJiAkX19sb2NhbCA9PSAibG9jYXRpb24iKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMTMsNiArMjEyLDE3IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaSA9PSAiIiAmJiAkX19sb2NhbCA9PSAibmFtZXNwYWNlIikpIHsKQEAgLTIyMywxMiArMjMzLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpID09ICIiICYmICRfX2xvY2FsID09ICJsb2NhdGlvbiIpKSB7CkBAIC0yMzksMTQgKzI0Myw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNjEsMTEgKzI2MCwyNyBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2MgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwotICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHRoaXMsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgpAQCAtMjgwLDI3ICsyOTUsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgorICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gJHZhbHVlOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dCh0aGlzLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvYyA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7CisgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvY29uZmlnLnJuZyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvY29uZmlnLnJuZwppbmRleCA2OTdmM2FjLi5lM2M1OTNmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL2NvbmZpZy5ybmcKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9jb25maWcucm5nCkBAIC0xLDQgKzEsMjggQEAKIDw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGdyYW1tYXIKICB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiCiAgeG1sbnM6cj0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL2NvbmZpZy54c2QgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9nZW4vY29uZmlnL2NvbmZpZy54c2QKaW5kZXggN2Q2NDU2Yy4uYmEyMTNlYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvZ2VuL2NvbmZpZy9jb25maWcueHNkCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL2dlbi9jb25maWcvY29uZmlnLnhzZApAQCAtMSw3ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KIDwhLS0KLSBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAKICBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsNyArMjMsNiBAQAogIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgaGF2ZSBhbnkgcXVlc3Rpb25zLgogLS0+Ci0KIDwhLS0gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFLiBETyBOT1QgTU9ESUZZLiAtLT4KIDx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CiAgIDx4czplbGVtZW50IG5hbWU9ImNvbmZpZyI+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9tb2RlbC9uYXYvQVBUTmF2aWdhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL2p4Yy9tb2RlbC9uYXYvQVBUTmF2aWdhdG9yLmphdmEKaW5kZXggODM2ZjE5MS4uNGViNzBhMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC9qeGMvbW9kZWwvbmF2L0FQVE5hdmlnYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvanhjL21vZGVsL25hdi9BUFROYXZpZ2F0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC5qeGMubW9kZWwubmF2OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTI4MSwyNCArMjgwLDIxIEBACiAgICAgICAgIHJldHVybiBtZXRob2QuZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuVk9MQVRJTEUpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGluZyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKLSAgICAgICAgVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICBpZighKGRlY2xhcmluZ1R5cGUgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBhY3QgZGVmZW5zaXZlbHkuIHRoaXMgbWlnaHQgYmUgYmVjYXVzZSB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tIGVycm9ycwotICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIHNjID0gKENsYXNzRGVjbGFyYXRpb24pIGRlY2xhcmluZ1R5cGU7CisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVycmlkaW5nKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgVHlwZURlY2xhcmF0aW9uIGJhc2UpIHsKKyAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBzYyA9IChDbGFzc0RlY2xhcmF0aW9uKSBiYXNlOwogCiAgICAgICAgIERlY2xhcmF0aW9ucyBkZWNsVXRpbCA9IGVudi5nZXREZWNsYXJhdGlvblV0aWxzKCk7CiAKLSAgICAgICAgd2hpbGUoc2MuZ2V0U3VwZXJjbGFzcygpIT1udWxsKSB7Ci0gICAgICAgICAgICBzYyA9IHNjLmdldFN1cGVyY2xhc3MoKS5nZXREZWNsYXJhdGlvbigpOwotCisgICAgICAgIHdoaWxlKHRydWUpIHsKICAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbSA6IHNjLmdldE1ldGhvZHMoKSkgewogICAgICAgICAgICAgICAgIGlmKGRlY2xVdGlsLm92ZXJyaWRlcyhtZXRob2QsbSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoc2MuZ2V0U3VwZXJjbGFzcygpPT1udWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHNjID0gc2MuZ2V0U3VwZXJjbGFzcygpLmdldERlY2xhcmF0aW9uKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZShUeXBlRGVjbGFyYXRpb24gY2xhenopIHsKQEAgLTMwOSw2ICszMDUsMTAgQEAKICAgICAgICAgcmV0dXJuIGYuZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuVFJBTlNJRU5UKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lubmVyQ2xhc3MoVHlwZURlY2xhcmF0aW9uIGNsYXp6KSB7CisgICAgICAgIHJldHVybiBjbGF6ei5nZXREZWNsYXJpbmdUeXBlKCkhPW51bGw7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBcnJheShUeXBlTWlycm9yIHQpIHsKICAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBBcnJheVR5cGU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL0FudEVycm9yTGlzdGVuZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9BbnRFcnJvckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNjY2ZWUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL0FudEVycm9yTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotcHVibGljIGNsYXNzIEFudEVycm9yTGlzdGVuZXIgaW1wbGVtZW50cyBFcnJvckxpc3RlbmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyBBbnRFcnJvckxpc3RlbmVyKFByb2plY3QgcCkgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgcHJpbnQoZSxQcm9qZWN0Lk1TR19FUlIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICBwcmludChlLFByb2plY3QuTVNHX0VSUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHByaW50KGUsUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50KFNBWFBhcnNlRXhjZXB0aW9uIGUsIGludCBsZXZlbCkgewotICAgICAgICBwcm9qZWN0LmxvZyhlLmdldE1lc3NhZ2UoKSxsZXZlbCk7Ci0gICAgICAgIHByb2plY3QubG9nKGdldExvY2F0aW9uKGUpLGxldmVsKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0TG9jYXRpb24oU0FYUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIiAgezB9OnsxfSBvZiB7Mn0iLAotICAgICAgICAgICAgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGUuZ2V0TGluZU51bWJlcigpKSwKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihlLmdldENvbHVtbk51bWJlcigpKSwKLSAgICAgICAgICAgICAgICBlLmdldFN5c3RlbUlkKCl9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvQ29uc29sZUVycm9yUmVwb3J0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9Db25zb2xlRXJyb3JSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzk4NTA2Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9Db25zb2xlRXJyb3JSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICogUHJpbnRzIHRoZSBlcnJvciB0byBhIHN0cmVhbS4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpIChrb2hzdWtlLmthd2FndWNoaUBzdW4uY29tKQotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZUVycm9yUmVwb3J0ZXIgaW1wbGVtZW50cyBFcnJvckxpc3RlbmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFByaW50U3RyZWFtIG91dDsKLQotICAgIHB1YmxpYyBDb25zb2xlRXJyb3JSZXBvcnRlcihQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgIG91dC5wcmludCgiW0VSUk9SXSAgICIpOwotICAgICAgICBwcmludChleGNlcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgIG91dC5wcmludCgiW0ZBVEFMXSAgICIpOwotICAgICAgICBwcmludChleGNlcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgIG91dC5wcmludCgiW1dBUk5JTkddICIpOwotICAgICAgICBwcmludChleGNlcHRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIG91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgb3V0LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoIiAgezB9OnsxfSBvZiB7Mn0iLAotICAgICAgICAgICAgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGUuZ2V0TGluZU51bWJlcigpKSwKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihlLmdldENvbHVtbk51bWJlcigpKSwKLSAgICAgICAgICAgICAgICBlLmdldFN5c3RlbUlkKCl9KSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9FcnJvckxpc3RlbmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvRXJyb3JMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjAyYTI2Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9FcnJvckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3MjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVc2VkIGludGVybmFsbHkgdG8gcmVwb3J0IGVycm9ycy4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpIChrb2hzdWtlLmthd2FndWNoaUBzdW4uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVycm9yTGlzdGVuZXIgZXh0ZW5kcyBFcnJvckhhbmRsZXIgewotICAgIGFic3RyYWN0IHZvaWQgZXJyb3IgKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbik7Ci0gICAgYWJzdHJhY3Qgdm9pZCBmYXRhbEVycm9yIChTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pOwotICAgIGFic3RyYWN0IHZvaWQgd2FybmluZyAoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL01haW4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzZmZWUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3MjsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLndyaXRlci5GaWxlQ29kZVdyaXRlcjsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC53cml0ZXIuU2luZ2xlU3RyZWFtQ29kZVdyaXRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTm9kZVNldDsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZVBhcnNlcjsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGoub3B0cy5Cb29sZWFuT3B0aW9uOwotaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5vcHRzLlN0cmluZ09wdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5wYXJzZS5JbGxlZ2FsU2NoZW1hRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLnBhcnNlLlBhcnNlYWJsZTsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5wYXJzZS5jb21wYWN0LkNvbXBhY3RQYXJzZWFibGU7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20ucGFyc2UueG1sLlNBWFBhcnNlYWJsZTsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIFByb2dyYW1hdGljIGVudHJ5IHBvaW50IHRvIHRoZSBUWFcgY29tcGlsZXIuCi0gKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIE1haW4gewotICAgIHByaXZhdGUgZmluYWwgVHh3T3B0aW9ucyBvcHRzOwotCi0gICAgcHVibGljIE1haW4oVHh3T3B0aW9ucyBvcHRzKSB7Ci0gICAgICAgIHRoaXMub3B0cyA9IG9wdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBTeXN0ZW0uZXhpdChydW4oYXJncykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3B0aW9ucyB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmdPcHRpb24gb3V0cHV0ID0gbmV3IFN0cmluZ09wdGlvbigiLW8iKTsKLSAgICAgICAgcHVibGljIFN0cmluZ09wdGlvbiBwa2cgPSBuZXcgU3RyaW5nT3B0aW9uKCItcCIpOwotICAgICAgICBwdWJsaWMgQm9vbGVhbk9wdGlvbiBjb21wYWN0ID0gbmV3IEJvb2xlYW5PcHRpb24oIi1jIik7Ci0gICAgICAgIHB1YmxpYyBCb29sZWFuT3B0aW9uIHhtbCA9IG5ldyBCb29sZWFuT3B0aW9uKCIteCIpOwotICAgICAgICBwdWJsaWMgQm9vbGVhbk9wdGlvbiB4c2QgPSBuZXcgQm9vbGVhbk9wdGlvbigiLXhzZCIpOwotICAgICAgICBwdWJsaWMgQm9vbGVhbk9wdGlvbiBjaGFpbiA9IG5ldyBCb29sZWFuT3B0aW9uKCItaCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHJ1bihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIE9wdGlvbnMgb3B0cyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIENtZExpbmVQYXJzZXIgcGFyc2VyID0gbmV3IENtZExpbmVQYXJzZXIoKTsKLSAgICAgICAgcGFyc2VyLmFkZE9wdGlvbkNsYXNzKG9wdHMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoYXJncyk7Ci0gICAgICAgIH0gY2F0Y2ggKENtZExpbmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgVHh3T3B0aW9ucyB0b3B0cyA9IG5ldyBUeHdPcHRpb25zKCk7Ci0gICAgICAgIHRvcHRzLmVycm9yTGlzdGVuZXIgPSBuZXcgQ29uc29sZUVycm9yUmVwb3J0ZXIoU3lzdGVtLm91dCk7Ci0KLSAgICAgICAgaWYob3B0cy5vdXRwdXQudmFsdWUhPW51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG9wdHMuY29kZVdyaXRlciA9IG5ldyBGaWxlQ29kZVdyaXRlcihuZXcgRmlsZShvcHRzLm91dHB1dC52YWx1ZSkpOwotICAgICAgICAgICAgfSBjYXRjaCggSU9FeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRvcHRzLmNvZGVXcml0ZXIgPSBuZXcgU2luZ2xlU3RyZWFtQ29kZVdyaXRlcihTeXN0ZW0ub3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG9wdHMuY2hhaW4uaXNPbigpKSB7Ci0gICAgICAgICAgICB0b3B0cy5jaGFpbk1ldGhvZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihvcHRzLnBrZy52YWx1ZSE9bnVsbCkgewotICAgICAgICAgICAgdG9wdHMuX3BhY2thZ2UgPSB0b3B0cy5jb2RlTW9kZWwuX3BhY2thZ2Uob3B0cy5wa2cudmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9wdHMuX3BhY2thZ2UgPSB0b3B0cy5jb2RlTW9kZWwucm9vdFBhY2thZ2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3Mgb25seSBvbmUgYXJndW1lbnQgKG5hbWVseSB0aGUgc2NoZW1hKQotICAgICAgICBpZihwYXJzZXIuZ2V0QXJndW1lbnRzKCkuc2l6ZSgpIT0xKSB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0b3B0cy5zb3VyY2UgPSBtYWtlU291cmNlU2NoZW1hKHBhcnNlcixvcHRzLHRvcHRzLmVycm9yTGlzdGVuZXIpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJ1bih0b3B0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYW5kIG1ha2VzIGEge0BsaW5rIFBhcnNlYWJsZX0gb2JqZWN0Ci0gICAgICogb3V0IG9mIHRoZSBzcGVjaWZpZWQgc2NoZW1hIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hQnVpbGRlciBtYWtlU291cmNlU2NoZW1hKENtZExpbmVQYXJzZXIgcGFyc2VyLCBPcHRpb25zIG9wdHMsIEVycm9ySGFuZGxlciBlaCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKChTdHJpbmcpcGFyc2VyLmdldEFyZ3VtZW50cygpLmdldCgwKSk7Ci0gICAgICAgIGZpbmFsIElucHV0U291cmNlIGluID0gbmV3IElucHV0U291cmNlKGYudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQotICAgICAgICBpZihvcHRzLnhzZC5pc09mZigpICYmIG9wdHMueG1sLmlzT2ZmKCkgJiYgb3B0cy5jb21wYWN0LmlzT2ZmKCkpIHsKLSAgICAgICAgICAgIC8vIGF1dG8gZGV0ZWN0Ci0gICAgICAgICAgICBpZihpbi5nZXRTeXN0ZW1JZCgpLmVuZHNXaXRoKCIucm5jIikpCi0gICAgICAgICAgICAgICAgb3B0cy5jb21wYWN0LnZhbHVlPXRydWU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZihpbi5nZXRTeXN0ZW1JZCgpLmVuZHNXaXRoKCIucm5nIikpCi0gICAgICAgICAgICAgICAgb3B0cy54bWwudmFsdWU9dHJ1ZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvcHRzLnhzZC52YWx1ZT10cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYob3B0cy54c2QuaXNPbigpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTY2hlbWFMb2FkZXIoaW4pOwotCi0gICAgICAgIGZpbmFsIFBhcnNlYWJsZSBwYXJzZWFibGUgPSBtYWtlUkVMQVhOR1NvdXJjZShvcHRzLCBpbiwgZWgsIGYpOwotCi0gICAgICAgIHJldHVybiBuZXcgUkVMQVhOR0xvYWRlcihwYXJzZWFibGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFBhcnNlYWJsZSBtYWtlUkVMQVhOR1NvdXJjZShPcHRpb25zIG9wdHMsIGZpbmFsIElucHV0U291cmNlIGluLCBFcnJvckhhbmRsZXIgZWgsIEZpbGUgZikgewotICAgICAgICBpZihvcHRzLmNvbXBhY3QuaXNPbigpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0UGFyc2VhYmxlKGluLGVoKTsKLQotICAgICAgICBpZihvcHRzLnhtbC5pc09uKCkpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFNBWFBhcnNlYWJsZShpbixlaCk7Ci0KLSAgICAgICAgLy8gb3RoZXJ3aXNlIHNuaWZmIGZyb20gdGhlIGZpbGUgZXh0ZW5zaW9uCi0gICAgICAgIGlmKGYuZ2V0UGF0aCgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoInJuYyIpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0UGFyc2VhYmxlKGluLGVoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTQVhQYXJzZWFibGUoaW4sZWgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlZCBYbWwgV3JpdGVyIHZlci4iK2dldFZlcnNpb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICJ0eHcgPHNjaGVtYSBmaWxlPlxuIisKLSAgICAgICAgICAgICIgLW8gPGRpcj4gICA6IFNwZWNpZnkgdGhlIGRpcmVjdG9yeSB0byBwbGFjZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzXG4iKwotICAgICAgICAgICAgIiAtcCA8cGtnPiAgIDogU3BlY2lmeSB0aGUgSmF2YSBwYWNrYWdlIHRvIHB1dCB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgaW50b1xuIisKLSAgICAgICAgICAgICIgLWMgICAgICAgICA6IFRoZSBpbnB1dCBzY2hlbWEgaXMgd3JpdHRlbiBpbiB0aGUgUkVMQVggTkcgY29tcGFjdCBzeW50YXhcbiIrCi0gICAgICAgICAgICAiIC14ICAgICAgICAgOiBUaGUgaW5wdXQgc2NoZW1hIGlzIHdyaXR0ZW4gaW4gdGhlIFJFTEFYIE5HIFhNTCBzeW50YXhcbiIrCi0gICAgICAgICAgICAiIC14c2QgICAgICAgOiBUaGUgaW5wdXQgc2NoZW1hIGlzIHdyaXR0ZW4gaW4gdGhlIFhNTCBTQ2hlbWFcbiIrCi0gICAgICAgICAgICAiIC1oICAgICAgICAgOiBHZW5lcmF0ZSBjb2RlIHRoYXQgYWxsb3dzIG1ldGhvZCBpbnZvY2F0aW9uIGNoYWluaW5nXG4iCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgcnVuKFR4d09wdGlvbnMgb3B0cykgewotICAgICAgICByZXR1cm4gbmV3IE1haW4ob3B0cykucnVuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcnVuKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTm9kZVNldCBucyA9IG9wdHMuc291cmNlLmJ1aWxkKG9wdHMpOwotICAgICAgICAgICAgbnMud3JpdGUob3B0cyk7Ci0gICAgICAgICAgICBvcHRzLmNvZGVNb2RlbC5idWlsZChvcHRzLmNvZGVXcml0ZXIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG9wdHMuZXJyb3JMaXN0ZW5lci5lcnJvcihuZXcgU0FYUGFyc2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksbnVsbCxlKSk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFNjaGVtYUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBvcHRzLmVycm9yTGlzdGVuZXIuZXJyb3IobmV3IFNBWFBhcnNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLG51bGwsZSkpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG9wdHMuZXJyb3JMaXN0ZW5lci5lcnJvcihlKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgb3B0cy5lcnJvckxpc3RlbmVyLmVycm9yKG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSxudWxsLGUpKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBUWFcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBwLmxvYWQoTWFpbi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ2ZXJzaW9uLnByb3BlcnRpZXMiKSk7Ci0gICAgICAgICAgICByZXR1cm4gcC5nZXQoInZlcnNpb24iKS50b1N0cmluZygpOwotICAgICAgICB9IGNhdGNoKCBUaHJvd2FibGUgXyApIHsKLSAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9OYW1lVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL05hbWVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YWMyZGIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL05hbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzI7Ci0KLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KSmF2YU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotcHVibGljIGNsYXNzIE5hbWVVdGlsIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1B1bmN0KGNoYXIgYykgewotICAgICAgICByZXR1cm4gKGMgPT0gJy0nIHx8IGMgPT0gJy4nIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nIHx8IGMgPT0gJ1x1MDBiNycKLSAgICAgICAgICAgICAgICB8fCBjID09ICdcdTAzODcnIHx8IGMgPT0gJ1x1MDZkZCcgfHwgYyA9PSAnXHUwNmRlJyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRGlnaXQoY2hhciBjKSB7Ci0gICAgICAgIHJldHVybiAoKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCBDaGFyYWN0ZXIuaXNEaWdpdChjKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVXBwZXIoY2hhciBjKSB7Ci0gICAgICAgIHJldHVybiAoKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0xvd2VyKGNoYXIgYykgewotICAgICAgICByZXR1cm4gKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNMZXR0ZXIoY2hhciBjKSB7Ci0gICAgICAgIHJldHVybiAoKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotICAgICAgICAgICAgICAgIHx8IChjID49ICdhJyAmJiBjIDw9ICd6JykKLSAgICAgICAgICAgICAgICB8fCBDaGFyYWN0ZXIuaXNMZXR0ZXIoYykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhcGl0YWxpemVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcsCi0gICAgICogYW5kIGRlLWNhcGl0YWxpemUgdGhlIHJlc3Qgb2YgY2hhcmFjdGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICghaXNMb3dlcihzLmNoYXJBdCgwKSkpCi0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLSAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzLmNoYXJBdCgwKSkpOwotICAgICAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8vIFByZWNvbmRpdGlvbjogc1tzdGFydF0gaXMgbm90IHB1bmN0dWF0aW9uCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgbmV4dEJyZWFrKFN0cmluZyBzLCBpbnQgc3RhcnQpIHsKLSAgICAgICAgaW50IG4gPSBzLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYzAgPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChpIDwgbiAtIDEpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGMxID0gcy5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgIGlmIChpc1B1bmN0KGMxKSkgcmV0dXJuIGkgKyAxOwotICAgICAgICAgICAgICAgIGlmIChpc0RpZ2l0KGMwKSAmJiAhaXNEaWdpdChjMSkpIHJldHVybiBpICsgMTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRGlnaXQoYzApICYmIGlzRGlnaXQoYzEpKSByZXR1cm4gaSArIDE7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTG93ZXIoYzApICYmICFpc0xvd2VyKGMxKSkgcmV0dXJuIGkgKyAxOwotICAgICAgICAgICAgICAgIGlmIChpc0xldHRlcihjMCkgJiYgIWlzTGV0dGVyKGMxKSkgcmV0dXJuIGkgKyAxOwotICAgICAgICAgICAgICAgIGlmICghaXNMZXR0ZXIoYzApICYmIGlzTGV0dGVyKGMxKSkgcmV0dXJuIGkgKyAxOwotICAgICAgICAgICAgICAgIGlmIChpIDwgbiAtIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjMiA9IHMuY2hhckF0KGkgKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVXBwZXIoYzApICYmIGlzVXBwZXIoYzEpICYmIGlzTG93ZXIoYzIpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUb2tlbml6ZXMgYSBzdHJpbmcgaW50byB3b3JkcyBhbmQgY2FwaXRhbGl6ZXMgdGhlIGZpcnN0Ci0gICAgICogY2hhcmFjdGVyIG9mIGVhY2ggd29yZC4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgYSBjaGFuZ2UgaW4gY2hhcmFjdGVyIHR5cGUgYXMgYSBzcGxpdHRlcgotICAgICAqIG9mIHR3byB3b3Jkcy4gRm9yIGV4YW1wbGUsICJhYmMxMDBnaGkiIHdpbGwgYmUgc3BsaXR0ZWQgaW50bwotICAgICAqIHsiQWJjIiwgIjEwMCIsIkdoaSJ9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9Xb3JkTGlzdChTdHJpbmcgcykgewotICAgICAgICBBcnJheUxpc3Qgc3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludCBuID0gcy5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOykgewotCi0gICAgICAgICAgICAvLyBTa2lwIHB1bmN0dWF0aW9uCi0gICAgICAgICAgICB3aGlsZSAoaSA8IG4pIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzUHVuY3Qocy5jaGFyQXQoaSkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA+PSBuKSBicmVhazsKLQotICAgICAgICAgICAgLy8gRmluZCBuZXh0IGJyZWFrIGFuZCBjb2xsZWN0IHdvcmQKLSAgICAgICAgICAgIGludCBiID0gbmV4dEJyZWFrKHMsIGkpOwotICAgICAgICAgICAgU3RyaW5nIHcgPSAoYiA9PSAtMSkgPyBzLnN1YnN0cmluZyhpKSA6IHMuc3Vic3RyaW5nKGksIGIpOwotICAgICAgICAgICAgc3MuYWRkKGVzY2FwZShjYXBpdGFsaXplKHcpKSk7Ci0gICAgICAgICAgICBpZiAoYiA9PSAtMSkgYnJlYWs7Ci0gICAgICAgICAgICBpID0gYjsKLSAgICAgICAgfQotCi0vLyAgICAgIHdlIGNhbid0IGd1YXJhbnRlZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBhbnl3YXksCi0vLyAgICAgIHNvIHRoZXJlJ3Mgbm90IG11Y2ggcG9pbnQgaW4gcmVqZWN0aW5nIHRoaW5ncyBpbiB0aGlzIHdheS4KLS8vICAgICAgICBpZiAoc3Muc2l6ZSgpID09IDApCi0vLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlplcm8tbGVuZ3RoIGlkZW50aWZpZXIiKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkoc3MudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdG9NaXhlZENhc2VOYW1lKFN0cmluZ1tdIHNzLCBib29sZWFuIHN0YXJ0VXBwZXIpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZihzcy5sZW5ndGg+MCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKHN0YXJ0VXBwZXIgPyBzc1swXSA6IHNzWzBdLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3NbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgIFN0cmluZyB0b01peGVkQ2FzZVZhcmlhYmxlTmFtZShTdHJpbmdbXSBzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGFydFVwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNkclVwcGVyKSB7Ci0gICAgICAgIGlmIChjZHJVcHBlcikKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgc3NbaV0gPSBjYXBpdGFsaXplKHNzW2ldKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiggc3MubGVuZ3RoPjAgKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc3RhcnRVcHBlciA/IHNzWzBdIDogc3NbMF0udG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBGb3JtYXRzIGEgc3RyaW5nIGludG8gIlRISVNfS0lORF9PRl9GT1JNQVRfQUJDX0RFRiIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgICBBbHdheXMgcmV0dXJuIGEgc3RyaW5nIGJ1dCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0Ci0gICAgICogICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Db25zdGFudE5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHRvQ29uc3RhbnROYW1lKHRvV29yZExpc3QocykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgYSBzdHJpbmcgaW50byAiVEhJU19LSU5EX09GX0ZPUk1BVF9BQkNfREVGIi4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgIEFsd2F5cyByZXR1cm4gYSBzdHJpbmcgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQKLSAgICAgKiAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0NvbnN0YW50TmFtZShTdHJpbmdbXSBzcykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmKCBzcy5sZW5ndGg+MCApIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzc1swXS50b1VwcGVyQ2FzZSgpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ18nKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3NbaV0udG9VcHBlckNhc2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIEVzY2FwZXMgY2hhcmFjdGVycyBpcyB0aGUgZ2l2ZW4gc3RyaW5nIHNvIHRoYXQgdGhleSBjYW4gYmUKLSAgICAgKiBwcmludGVkIGJ5IG9ubHkgdXNpbmcgVVMtQVNDSUkgY2hhcmFjdGVycy4KLSAgICAgKgotICAgICAqIFRoZSBlc2NhcGVkIGNoYXJhY3RlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZ2l2ZW4KLSAgICAgKiBTdHJpbmdCdWZmZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2IKLSAgICAgKiAgICAgIFN0cmluZ0J1ZmZlciB0aGF0IHJlY2VpdmVzIGVzY2FwZWQgc3RyaW5nLgotICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICBTdHJpbmcgdG8gYmUgZXNjYXBlZC4gPGNvZGU+cy5zdWJzdHJpbmcoc3RhcnQpPC9jb2RlPgotICAgICAqICAgICAgd2lsbCBiZSBlc2NhcGVkIGFuZCBjb3BpZWQgdG8gdGhlIHN0cmluZyBidWZmZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVzY2FwZShTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBzLCBpbnQgc3RhcnQpIHsKLSAgICAgICAgaW50IG4gPSBzLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl8iKTsKLSAgICAgICAgICAgICAgICBpZiAoYyA8PSAnXHUwMDBmJykgc2IuYXBwZW5kKCIwMDAiKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjIDw9ICdcdTAwZmYnKSBzYi5hcHBlbmQoIjAwIik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA8PSAnXHUwZmZmJykgc2IuYXBwZW5kKCIwIik7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYywgMTYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzY2FwZXMgY2hhcmFjdGVycyB0aGF0IGFyZSB1bnVzYWJsZSBhcyBKYXZhIGlkZW50aWZpZXJzCi0gICAgICogYnkgcmVwbGFjaW5nIHVuc2FmZSBjaGFyYWN0ZXJzIHdpdGggc2FmZSBjaGFyYWN0ZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHMpIHsKLSAgICAgICAgaW50IG4gPSBzLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHMuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocy5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICAgICAgICAgIGVzY2FwZShzYiwgcywgaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzY2FwZSBhbnkgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBzaW5nbGUgYXJnIGNvbnN0cnVjdG9yCi0gICAgICogb2YgamF2YS5uZXQuVVJJIHRvIGNvbXBsYWluIGFib3V0IGlsbGVnYWwgY2hhcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyBzb3VyY2Ugc3RyaW5nIHRvIGJlIGVzY2FwZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVVUkkoU3RyaW5nIHMpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKyApIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKGMpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIlMjAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGN1bGF0ZSB0aGUgcGFyZW50IFVSSSBwYXRoIG9mIHRoZSBnaXZlbiBVUkkgcGF0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmlQYXRoIHRoZSB1cmlQYXRoIChhcyByZXR1cm5lZCBieSBqYXZhLm5ldC5VUkkjZ2V0UGF0aCgpCi0gICAgICogQHJldHVybiB0aGUgcGFyZW50IFVSSSBwYXRoIG9mIHRoZSBnaXZlbiBVUkkgcGF0aAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcmVudFVyaVBhdGgoU3RyaW5nIHVyaVBhdGgpIHsKLSAgICAgICAgaW50IGlkeCA9IHVyaVBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQotICAgICAgICBpZiAodXJpUGF0aC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICB1cmlQYXRoID0gdXJpUGF0aC5zdWJzdHJpbmcoMCxpZHgpOyAvLyB0cmltIHRyYWlsaW5nIHNsYXNoCi0gICAgICAgICAgICBpZHggPSB1cmlQYXRoLmxhc3RJbmRleE9mKCcvJyk7IC8vIG1vdmUgaWR4IHRvIHBhcmVudCBjb250ZXh0Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdXJpUGF0aC5zdWJzdHJpbmcoMCwgaWR4KSsiLyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlIHRoZSBub3JtYWxpemVkIGZvcm0gb2YgdGhlIGdpdmVuIHVyaVBhdGguCi0gICAgICoKLSAgICAgKiBGb3IgZXhhbXBsZToKLSAgICAgKiAgICAvYS9iL2MvIC0+IC9hL2IvYy8KLSAgICAgKiAgICAvYS9iL2MgIC0+IC9hL2IvCi0gICAgICogICAgL2EvICAgICAtPiAvYS8KLSAgICAgKiAgICAvYSAgICAgIC0+IC8KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmlQYXRoIHBhdGggb2YgYSBVUkkgKGFzIHJldHVybmVkIGJ5IGphdmEubmV0LlVSSSNnZXRQYXRoKCkKLSAgICAgKiBAcmV0dXJuIHRoZSBub3JtYWxpemVkIHVyaSBwYXRoCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplVXJpUGF0aChTdHJpbmcgdXJpUGF0aCkgewotICAgICAgICBpZiAodXJpUGF0aC5lbmRzV2l0aCgiLyIpKQotICAgICAgICAgICAgcmV0dXJuIHVyaVBhdGg7Ci0KLSAgICAgICAgLy8gdGhlIHVyaSBwYXRoIHNob3VsZCBhbHdheXMgaGF2ZSBhdCBsZWFzdCBhIGxlYWRpbmcgc2xhc2gsCi0gICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgKCBpZHggPT0gLTEgKQotICAgICAgICBpbnQgaWR4ID0gdXJpUGF0aC5sYXN0SW5kZXhPZignLycpOwotICAgICAgICByZXR1cm4gdXJpUGF0aC5zdWJzdHJpbmcoMCwgaWR4KzEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRldGVybWluZSBpZiB0d28gU3RyaW5ncyBhcmUgZXF1YWwgaWdub3JpbmcgY2FzZSBhbGxvd2luZyBudWxsIHZhbHVlcwotICAgICAqCi0gICAgICogQHBhcmFtIHMgc3RyaW5nIDEKLSAgICAgKiBAcGFyYW0gdCBzdHJpbmcgMgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIGdpdmVuIHN0cmluZ3MgYXJlIGVxdWFsIGlnbm9yaW5nIGNhc2UsIGZhbHNlIGlmIHRoZXkgYXJlbid0Ci0gICAgICogZXF1YWwgb3IgZWl0aGVyIG9mIHRoZW0gYXJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsc0lnbm9yZUNhc2UoU3RyaW5nIHMsIFN0cmluZyB0KSB7Ci0gICAgICAgIGlmIChzID09IHQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoKHMgIT0gbnVsbCkgJiYgKHQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzLmVxdWFsc0lnbm9yZUNhc2UodCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRldGVybWluZSBpZiB0d28gU3RyaW5ncyBhcmUgaXF1YWwgYWxsb3dpbmcgbnVsbCB2YWx1ZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHN0cmluZyAxCi0gICAgICogQHBhcmFtIHQgc3RyaW5nIDIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBzdHJpbmdzIGFyZSBlcXVhbCwgZmFsc2UgaWYgdGhleSBhcmVuJ3QgZXF1YWwgb3IgZWl0aGVyIG9mCi0gICAgICogdGhlbSBhcmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWwoU3RyaW5nIHMsIFN0cmluZyB0KSB7Ci0gICAgICAgIGlmIChzID09IHQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoKHMgIT0gbnVsbCkgJiYgKHQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzLmVxdWFscyh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9DbGFzc05hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHRvTWl4ZWRDYXNlTmFtZSh0b1dvcmRMaXN0KHMpLCB0cnVlKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9WYXJpYWJsZU5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHRvTWl4ZWRDYXNlTmFtZSh0b1dvcmRMaXN0KHMpLCBmYWxzZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTWV0aG9kTmFtZShTdHJpbmcgcykgewotICAgICAgICBTdHJpbmcgbSA9IHRvTWl4ZWRDYXNlTmFtZSh0b1dvcmRMaXN0KHMpLCBmYWxzZSk7Ci0gICAgICAgIGlmKEpKYXZhTmFtZS5pc0phdmFJZGVudGlmaWVyKG0pKQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAnXycrbTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9JbnRlcmZhY2VOYW1lKCBTdHJpbmcgdG9rZW4gKSB7Ci0gICAgICAgIHJldHVybiB0b0NsYXNzTmFtZSh0b2tlbik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUHJvcGVydHlOYW1lKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiB0b0NsYXNzTmFtZShzKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyAgU3RyaW5nIHRvUGFja2FnZU5hbWUoIFN0cmluZyBzICkgewotICAgICAgICByZXR1cm4gdG9NaXhlZENhc2VOYW1lKHRvV29yZExpc3QocyksIGZhbHNlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL1JFTEFYTkdMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9SRUxBWE5HTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGJmYjIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL1JFTEFYTkdMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyOwotCi1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20ucGFyc2UuUGFyc2VhYmxlOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLnBhcnNlLklsbGVnYWxTY2hlbWFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LnV0aWwuQ2hlY2tpbmdTY2hlbWFCdWlsZGVyOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmR0LkNhc2NhZGluZ0RhdGF0eXBlTGlicmFyeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uZHQuYnVpbHRpbi5CdWlsdGluRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeTsKLWltcG9ydCBvcmcucmVsYXhuZy5kYXRhdHlwZS5oZWxwZXJzLkRhdGF0eXBlTGlicmFyeUxvYWRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTm9kZVNldDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTGVhZjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIuYnVpbGRlci5yZWxheG5nLlNjaGVtYUJ1aWxkZXJJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotY2xhc3MgUkVMQVhOR0xvYWRlciBpbXBsZW1lbnRzIFNjaGVtYUJ1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgUGFyc2VhYmxlIHBhcnNlYWJsZTsKLQotICAgIHB1YmxpYyBSRUxBWE5HTG9hZGVyKFBhcnNlYWJsZSBwYXJzZWFibGUpIHsKLSAgICAgICAgdGhpcy5wYXJzZWFibGUgPSBwYXJzZWFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVTZXQgYnVpbGQoVHh3T3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSWxsZWdhbFNjaGVtYUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNjaGVtYUJ1aWxkZXJJbXBsIHN0YWdlMSA9IG5ldyBTY2hlbWFCdWlsZGVySW1wbChvcHRpb25zLmNvZGVNb2RlbCk7Ci0gICAgICAgIExlYWYgcGF0dGVybiA9IChMZWFmKXBhcnNlYWJsZS5wYXJzZShuZXcgQ2hlY2tpbmdTY2hlbWFCdWlsZGVyKHN0YWdlMSxvcHRpb25zLmVycm9yTGlzdGVuZXIsCi0gICAgICAgICAgICBuZXcgQ2FzY2FkaW5nRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeSgKLSAgICAgICAgICAgICAgICBuZXcgQnVpbHRpbkRhdGF0eXBlTGlicmFyeUZhY3RvcnkobmV3IERhdGF0eXBlTGlicmFyeUxvYWRlcigpKSwKLSAgICAgICAgICAgICAgICBuZXcgRGF0YXR5cGVMaWJyYXJ5TG9hZGVyKCkpKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2V0KG9wdGlvbnMscGF0dGVybik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL1NjaGVtYUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9TY2hlbWFCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmNhNmQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL1NjaGVtYUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLk5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20ucGFyc2UuSWxsZWdhbFNjaGVtYUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogRW5jYXBzdWxhdGlvbiBvZiB0aGUgc2NoZW1hIGZpbGUgYW5kIHRoZSBidWlsZGVyLgotICoKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFCdWlsZGVyIHsKLSAgICBOb2RlU2V0IGJ1aWxkKFR4d09wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElsbGVnYWxTY2hlbWFFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9UeHdPcHRpb25zLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvVHh3T3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWU2MTZjLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9UeHdPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3MjsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkNvZGVXcml0ZXI7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSkNvZGVNb2RlbDsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KUGFja2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb24uWG1sTmFtZXNwYWNlOwotCi0vKioKLSAqIENvbnRyb2xzIHRoZSB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIFRYVyBnZW5lcmF0aW9uLgotICoKLSAqIEJ1dCB0aGlzIGRvZXNuJ3QgY29udGFpbiBvcHRpb25zIGZvciB0aGUgY29tbWFuZC1saW5lIGludGVyZmFjZQotICogbm9yIGFueSBvZiB0aGUgZHJpdmVyLWxldmVsIGNvbmZpZ3VyYXRpb24gKHN1Y2ggYXMgd2hlcmUgdG8gcGxhY2UKLSAqIHRoZSBnZW5lcmF0ZWQgc291cmNlIGNvZGUsIGV0Yy4pCi0gKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFR4d09wdGlvbnMgewotICAgIHB1YmxpYyBmaW5hbCBKQ29kZU1vZGVsIGNvZGVNb2RlbCA9IG5ldyBKQ29kZU1vZGVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFja2FnZSB0byBwdXQgdGhlIGdlbmVyYXRlZCBjb2RlIGludG8uCi0gICAgICovCi0gICAgcHVibGljIEpQYWNrYWdlIF9wYWNrYWdlOwotCi0gICAgLyoqCi0gICAgICogQWx3YXlzIG5vbi1udWxsLgotICAgICAqLwotICAgIHB1YmxpYyBFcnJvckxpc3RlbmVyIGVycm9yTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBiZSBzZW50IHRvIHRoaXMuCi0gICAgICovCi0gICAgQ29kZVdyaXRlciBjb2RlV3JpdGVyOwotCi0gICAgLyoqCi0gICAgICogU2NoZW1hIGZpbGUuCi0gICAgICovCi0gICAgU2NoZW1hQnVpbGRlciBzb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0cnVlLCBnZW5lcmF0ZSBhdHRyaWJ1dGUvdmFsdWUgbWV0aG9kcyB0aGF0Ci0gICAgICogcmV0dXJucyB0aGUgPHR0PnRoaXM8L3R0PiBvYmplY3QgZm9yIGNoYWluaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNoYWluTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogSWYgdHJ1ZSwgdGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgbm90IHVzZSB0aGUgcGFja2FnZS1sZXZlbAotICAgICAqIHtAbGluayBYbWxOYW1lc3BhY2V9IGFubm90YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbm9QYWNrYWdlTmFtZXNwYWNlOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL1R4d1Rhc2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9UeHdUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjhkNWEuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL1R4d1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3MjsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLndyaXRlci5GaWxlQ29kZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLnBhcnNlLmNvbXBhY3QuQ29tcGFjdFBhcnNlYWJsZTsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5wYXJzZS54bWwuU0FYUGFyc2VhYmxlOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi0vKioKLSAqIEFudCB0YXNrIGludGVyZmFjZSBmb3IgdHh3IGNvbXBpbGVyLgotICoKLSAqIEBhdXRob3Igcnlhbl9zaG9lbWFrZXJAZGV2LmphdmEubmV0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUeHdUYXNrIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayB7Ci0KLSAgICAvLyB0eHcgb3B0aW9ucyAtIHJldXNlIGNvbW1hbmQgbGluZSBvcHRpb25zIGZyb20gdGhlIG1haW4gZHJpdmVyCi0gICAgcHJpdmF0ZSBmaW5hbCBUeHdPcHRpb25zIG9wdGlvbnMgPSBuZXcgVHh3T3B0aW9ucygpOwotCi0gICAgLy8gc2NoZW1hIGZpbGUKLSAgICBwcml2YXRlIEZpbGUgc2NoZW1hRmlsZTsKLQotICAgIC8vIHN5bnRheCBzdHlsZSBvZiBSRUxBWCBORyBzb3VyY2Ugc2NoZW1hIC0gInhtbCIgb3IgImNvbXBhY3QiCi0gICAgcHJpdmF0ZSBzdGF0aWMgZW51bSBTdHlsZSB7Ci0gICAgICAgIENPTVBBQ1QsIFhNTCwgWE1MU0NIRU1BLCBBVVRPX0RFVEVDVAotICAgIH0KLSAgICBwcml2YXRlIFN0eWxlIHN0eWxlID0gU3R5bGUuQVVUT19ERVRFQ1Q7Ci0KLSAgICBwdWJsaWMgVHh3VGFzaygpIHsKLSAgICAgICAgLy8gZGVmYXVsdCBwYWNrYWdlCi0gICAgICAgIG9wdGlvbnMuX3BhY2thZ2UgPSBvcHRpb25zLmNvZGVNb2RlbC5yb290UGFja2FnZSgpOwotCi0gICAgICAgIC8vIGRlZmF1bHQgY29kZXdyaXRlcgotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3B0aW9ucy5jb2RlV3JpdGVyID0gbmV3IEZpbGVDb2RlV3JpdGVyKG5ldyBGaWxlKCIuIikpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBAcGFja2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIHBrZyBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGdlbmVyYXRlIHRoZSBqYXZhIGNsYXNzZXMgaW50bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2UoIFN0cmluZyBwa2cgKSB7Ci0gICAgICAgIG9wdGlvbnMuX3BhY2thZ2UgPSBvcHRpb25zLmNvZGVNb2RlbC5fcGFja2FnZSggcGtnICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgQHN5bnRheAotICAgICAqCi0gICAgICogQHBhcmFtIHN0eWxlIGVpdGhlciAiY29tcGFjdCIgZm9yIFJFTEFYIE5HIGNvbXBhY3Qgc3ludGF4IG9yICJYTUwiCi0gICAgICogZm9yIFJFTEFYIE5HIHhtbCBzeW50YXgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTeW50YXgoIFN0cmluZyBzdHlsZSApIHsKLSAgICAgICAgdGhpcy5zdHlsZSA9IFN0eWxlLnZhbHVlT2Yoc3R5bGUudG9VcHBlckNhc2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGFyc2UgQHNjaGVtYQotICAgICAqCi0gICAgICogQHBhcmFtIHNjaGVtYSB0aGUgc2NoZW1hIGZpbGUgdG8gYmUgcHJvY2Vzc2VkIGJ5IHR4dwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYSggRmlsZSBzY2hlbWEgKSB7Ci0gICAgICAgIHNjaGVtYUZpbGUgPSBzY2hlbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGFyc2UgQGRlc3RkaXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSB0byBwcm9kdWNlIGdlbmVyYXRlZCBzb3VyY2UgY29kZSBpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3RkaXIoIEZpbGUgZGlyICkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3B0aW9ucy5jb2RlV3JpdGVyID0gbmV3IEZpbGVDb2RlV3JpdGVyKGRpcik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHBhcnNlIEBtZXRob2RDaGFpbmluZwotICAgICAqCi0gICAgICogQHBhcmFtIGZsZyB0cnVlIGlmIHRoZSB0eHcgc2hvdWxkIGdlbmVyYXRlIGFwaSdzIHRoYXQgYWxsb3cKLSAgICAgKiBtZXRob2QgY2hhaW5pbmcgKHdoZW4gcG9zc2libGUsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZENoYWluaW5nKCBib29sZWFuIGZsZyApIHsKLSAgICAgICAgb3B0aW9ucy5jaGFpbk1ldGhvZCA9IGZsZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBsYXVuY2ggdHh3Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG9wdGlvbnMuZXJyb3JMaXN0ZW5lciA9IG5ldyBBbnRFcnJvckxpc3RlbmVyKGdldFByb2plY3QoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U291cmNlIGluID0gbmV3IElucHV0U291cmNlKHNjaGVtYUZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDb21waWxpbmc6ICIgKyBpbi5nZXRTeXN0ZW1JZCgpOwotICAgICAgICAgICAgbG9nKCBtc2csIFByb2plY3QuTVNHX0lORk8gKTsKLQotICAgICAgICAgICAgaWYoc3R5bGU9PVN0eWxlLkFVVE9fREVURUNUKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gc2NoZW1hRmlsZS5nZXRQYXRoKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICBpZihmaWxlTmFtZS5lbmRzV2l0aCgicm5jIikpCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gU3R5bGUuQ09NUEFDVDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWYoZmlsZU5hbWUuZW5kc1dpdGgoInhzZCIpKQotICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IFN0eWxlLlhNTFNDSEVNQTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gU3R5bGUuWE1MOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2goc3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgQ09NUEFDVDoKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNvdXJjZSA9IG5ldyBSRUxBWE5HTG9hZGVyKG5ldyBDb21wYWN0UGFyc2VhYmxlKGluLG9wdGlvbnMuZXJyb3JMaXN0ZW5lcikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYTUw6Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5zb3VyY2UgPSBuZXcgUkVMQVhOR0xvYWRlcihuZXcgU0FYUGFyc2VhYmxlKGluLG9wdGlvbnMuZXJyb3JMaXN0ZW5lcikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYTUxTQ0hFTUE6Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5zb3VyY2UgPSBuZXcgWG1sU2NoZW1hTG9hZGVyKGluKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGtpY2sgb2ZmIHRoZSBjb21waWxlcgotICAgICAgICBNYWluLnJ1bihvcHRpb25zKTsKLSAgICAgICAgbG9nKCAiQ29tcGlsYXRpb24gY29tcGxldGUuIiwgUHJvamVjdC5NU0dfSU5GTyApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9YbWxTY2hlbWFMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9YbWxTY2hlbWFMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1ZTRmYS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvWG1sU2NoZW1hTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3MjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTm9kZVNldDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIuYnVpbGRlci54c2QuWG1sU2NoZW1hQnVpbGRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC54c29tLnBhcnNlci5YU09NUGFyc2VyOwotCi0vKioKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotY2xhc3MgWG1sU2NoZW1hTG9hZGVyIGltcGxlbWVudHMgU2NoZW1hQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFNvdXJjZSBpbjsKLQotICAgIHB1YmxpYyBYbWxTY2hlbWFMb2FkZXIoSW5wdXRTb3VyY2UgaW4pIHsKLSAgICAgICAgdGhpcy5pbiA9IGluOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlU2V0IGJ1aWxkKFR4d09wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIFhTT01QYXJzZXIgeHNvbSA9IG5ldyBYU09NUGFyc2VyKCk7Ci0gICAgICAgIHhzb20ucGFyc2UoaW4pOwotICAgICAgICByZXR1cm4gWG1sU2NoZW1hQnVpbGRlci5idWlsZCh4c29tLmdldFJlc3VsdCgpLG9wdGlvbnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9idWlsZGVyL3JlbGF4bmcvQW5ub3RhdGlvbnNJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0Fubm90YXRpb25zSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDc4ODIwLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9idWlsZGVyL3JlbGF4bmcvQW5ub3RhdGlvbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5idWlsZGVyLnJlbGF4bmc7Ci0KLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5Bbm5vdGF0aW9uczsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3Qub20uUGFyc2VkRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LnV0aWwuTG9jYXRvckltcGw7Ci0KLS8qKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1maW5hbCBjbGFzcyBBbm5vdGF0aW9uc0ltcGwgaW1wbGVtZW50cyBBbm5vdGF0aW9uczxQYXJzZWRFbGVtZW50QW5ub3RhdGlvbixMb2NhdG9ySW1wbCxDb21tZW50TGlzdEltcGw+IHsKLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIG5zLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdmFsdWUsIExvY2F0b3JJbXBsIGxvY2F0b3IpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChQYXJzZWRFbGVtZW50QW5ub3RhdGlvbiBwYXJzZWRFbGVtZW50QW5ub3RhdGlvbikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21tZW50KENvbW1lbnRMaXN0SW1wbCBjb21tZW50TGlzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMZWFkaW5nQ29tbWVudChDb21tZW50TGlzdEltcGwgY29tbWVudExpc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9Db21tZW50TGlzdEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9idWlsZGVyL3JlbGF4bmcvQ29tbWVudExpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjhlMzQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9Db21tZW50TGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLmJ1aWxkZXIucmVsYXhuZzsKLQotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5idWlsZGVyLkNvbW1lbnRMaXN0OwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC51dGlsLkxvY2F0b3JJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50TGlzdEltcGwgZXh0ZW5kcyBDb21tZW50TGlzdDxMb2NhdG9ySW1wbD4gewotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9EYXRhUGF0dGVybkJ1aWxkZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0RhdGFQYXR0ZXJuQnVpbGRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyMTllNi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0RhdGFQYXR0ZXJuQnVpbGRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLmJ1aWxkZXIucmVsYXhuZzsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5EYXRhOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5MZWFmOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5idWlsZGVyLkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5idWlsZGVyLkRhdGFQYXR0ZXJuQnVpbGRlcjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3Qub20uUGFyc2VkRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LnV0aWwuTG9jYXRvckltcGw7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20ucGFyc2UuQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLWZpbmFsIGNsYXNzIERhdGFQYXR0ZXJuQnVpbGRlckltcGwgaW1wbGVtZW50cyBEYXRhUGF0dGVybkJ1aWxkZXI8TGVhZixQYXJzZWRFbGVtZW50QW5ub3RhdGlvbixMb2NhdG9ySW1wbCxBbm5vdGF0aW9uc0ltcGwsQ29tbWVudExpc3RJbXBsPiB7Ci0gICAgZmluYWwgSlR5cGUgdHlwZTsKLQotICAgIHB1YmxpYyBEYXRhUGF0dGVybkJ1aWxkZXJJbXBsKEpUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlUGF0dGVybihMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgRGF0YShsb2NhdG9yLHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5zLCBMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYW5ub3RhdGlvbihQYXJzZWRFbGVtZW50QW5ub3RhdGlvbiBwYXJzZWRFbGVtZW50QW5ub3RhdGlvbikgewotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIG1ha2VQYXR0ZXJuKExlYWYgZXhjZXB0LCBMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYWtlUGF0dGVybihsb2NhdG9yLGFubm90YXRpb25zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0RhdGF0eXBlRmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9EYXRhdHlwZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkZDYyMS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0RhdGF0eXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIuYnVpbGRlci5yZWxheG5nOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLkRhdGE7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSlR5cGU7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSkNvZGVNb2RlbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQnVpbGRzIHtAbGluayBEYXRhfSBmcm9tIGEgWE1MIFNjaGVtYSBkYXRhdHlwZS4KLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotcHVibGljIGNsYXNzIERhdGF0eXBlRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKQ29kZU1vZGVsIGNvZGVNb2RlbDsKLQotICAgIHB1YmxpYyBEYXRhdHlwZUZhY3RvcnkoSkNvZGVNb2RlbCBjb2RlTW9kZWwpIHsKLSAgICAgICAgdGhpcy5jb2RlTW9kZWwgPSBjb2RlTW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjaWRlcyB0aGUgSmF2YSBkYXRhdHlwZSBmcm9tIFhNTCBkYXRhdHlwZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVsbAotICAgICAqICAgICAgaWYgbm9uZSBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSlR5cGUgZ2V0VHlwZShTdHJpbmcgZGF0YXR5cGVMaWJyYXJ5LCBTdHJpbmcgdHlwZSkgewotICAgICAgICBpZihkYXRhdHlwZUxpYnJhcnkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1kYXRhdHlwZXMiKQotICAgICAgICB8fCBkYXRhdHlwZUxpYnJhcnkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZS5pbnRlcm4oKTsKLQotICAgICAgICAgICAgaWYodHlwZT09ImJvb2xlYW4iKQotICAgICAgICAgICAgICAgIHJldHVybiBjb2RlTW9kZWwuQk9PTEVBTjsKLSAgICAgICAgICAgIGlmKHR5cGU9PSJpbnQiIHx8IHR5cGU9PSJub25OZWdhdGl2ZUludGVnZXIiIHx8IHR5cGU9PSJwb3NpdGl2ZUludGVnZXIiKQotICAgICAgICAgICAgICAgIHJldHVybiBjb2RlTW9kZWwuSU5UOwotICAgICAgICAgICAgaWYodHlwZT09IlFOYW1lIikKLSAgICAgICAgICAgICAgICByZXR1cm4gY29kZU1vZGVsLnJlZihRTmFtZS5jbGFzcyk7Ci0gICAgICAgICAgICBpZih0eXBlPT0iZmxvYXQiKQotICAgICAgICAgICAgICAgIHJldHVybiBjb2RlTW9kZWwuRkxPQVQ7Ci0gICAgICAgICAgICBpZih0eXBlPT0iZG91YmxlIikKLSAgICAgICAgICAgICAgICByZXR1cm4gY29kZU1vZGVsLkRPVUJMRTsKLSAgICAgICAgICAgIGlmKHR5cGU9PSJhbnlTaW1wbGVUeXBlIiB8fCB0eXBlPT0iYW55VHlwZSIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVNb2RlbC5yZWYoU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9idWlsZGVyL3JlbGF4bmcvRGl2SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9EaXZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjg4MTcuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9EaXZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5idWlsZGVyLnJlbGF4bmc7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuR3JhbW1hcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTGVhZjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5EaXY7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuU2NvcGU7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0Lm9tLlBhcnNlZEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC51dGlsLkxvY2F0b3JJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotY2xhc3MgRGl2SW1wbAotICAgIGV4dGVuZHMgR3JhbW1hclNlY3Rpb25JbXBsCi0gICAgaW1wbGVtZW50cyBEaXY8TGVhZixQYXJzZWRFbGVtZW50QW5ub3RhdGlvbixMb2NhdG9ySW1wbCxBbm5vdGF0aW9uc0ltcGwsQ29tbWVudExpc3RJbXBsPiB7Ci0KLSAgICBEaXZJbXBsKFNjb3BlPExlYWYsUGFyc2VkRWxlbWVudEFubm90YXRpb24sTG9jYXRvckltcGwsQW5ub3RhdGlvbnNJbXBsLENvbW1lbnRMaXN0SW1wbD4gcGFyZW50LCBHcmFtbWFyIGdyYW1tYXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LGdyYW1tYXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZERpdihMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0VsZW1lbnRBbm5vdGF0aW9uQnVpbGRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9idWlsZGVyL3JlbGF4bmcvRWxlbWVudEFubm90YXRpb25CdWlsZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWNlYzgyLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9idWlsZGVyL3JlbGF4bmcvRWxlbWVudEFubm90YXRpb25CdWlsZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIuYnVpbGRlci5yZWxheG5nOwotCi1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuQ29tbWVudExpc3Q7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuRWxlbWVudEFubm90YXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5vbS5Mb2NhdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3Qub20uUGFyc2VkRWxlbWVudEFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1maW5hbCBjbGFzcyBFbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXJJbXBsIGltcGxlbWVudHMgRWxlbWVudEFubm90YXRpb25CdWlsZGVyIHsKLSAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB2YWx1ZSwgTG9jYXRpb24gbG9jYXRpb24sIENvbW1lbnRMaXN0IGNvbW1lbnRMaXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgIH0KLQotICAgIHB1YmxpYyBQYXJzZWRFbGVtZW50QW5ub3RhdGlvbiBtYWtlRWxlbWVudEFubm90YXRpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIG5zLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdmFsdWUsIExvY2F0aW9uIGxvY2F0aW9uKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoUGFyc2VkRWxlbWVudEFubm90YXRpb24gcGFyc2VkRWxlbWVudEFubm90YXRpb24pIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29tbWVudChDb21tZW50TGlzdCBjb21tZW50TGlzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMZWFkaW5nQ29tbWVudChDb21tZW50TGlzdCBjb21tZW50TGlzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0dyYW1tYXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0dyYW1tYXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNDk4NDQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9HcmFtbWFySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIuYnVpbGRlci5yZWxheG5nOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLkxlYWY7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLlJlZjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5HcmFtbWFyOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5idWlsZGVyLlNjb3BlOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5vbS5QYXJzZWRFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QudXRpbC5Mb2NhdG9ySW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLWNsYXNzIEdyYW1tYXJJbXBsIGV4dGVuZHMgR3JhbW1hclNlY3Rpb25JbXBsCi0gICAgaW1wbGVtZW50cyBHcmFtbWFyPExlYWYsUGFyc2VkRWxlbWVudEFubm90YXRpb24sTG9jYXRvckltcGwsQW5ub3RhdGlvbnNJbXBsLENvbW1lbnRMaXN0SW1wbD4gewotCi0gICAgR3JhbW1hckltcGwoU2NvcGU8TGVhZixQYXJzZWRFbGVtZW50QW5ub3RhdGlvbixMb2NhdG9ySW1wbCxBbm5vdGF0aW9uc0ltcGwsQ29tbWVudExpc3RJbXBsPiBzY29wZSkgewotICAgICAgICBzdXBlcihzY29wZSxuZXcgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLkdyYW1tYXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgZW5kR3JhbW1hcihMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVmKGxvY2F0b3IsZ3JhbW1hcixjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuR3JhbW1hci5TVEFSVCk7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgbWFrZVBhcmVudFJlZihTdHJpbmcgbmFtZSwgTG9jYXRvckltcGwgbG9jYXRvciwgQW5ub3RhdGlvbnNJbXBsIGFubm90YXRpb25zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcGFyZW50Lm1ha2VSZWYobmFtZSxsb2NhdG9yLGFubm90YXRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlUmVmKFN0cmluZyBuYW1lLCBMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVmKGxvY2F0b3IsZ3JhbW1hcixuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0dyYW1tYXJTZWN0aW9uSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9HcmFtbWFyU2VjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1MDc0OS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL0dyYW1tYXJTZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIuYnVpbGRlci5yZWxheG5nOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLkRlZmluZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuR3JhbW1hcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTGVhZjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5EaXY7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuR3JhbW1hclNlY3Rpb247Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuSW5jbHVkZTsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5TY29wZTsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3Qub20uUGFyc2VkRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LnV0aWwuTG9jYXRvckltcGw7Ci0KLS8qKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1hYnN0cmFjdCBjbGFzcyBHcmFtbWFyU2VjdGlvbkltcGwgaW1wbGVtZW50cyBHcmFtbWFyU2VjdGlvbjxMZWFmLFBhcnNlZEVsZW1lbnRBbm5vdGF0aW9uLExvY2F0b3JJbXBsLEFubm90YXRpb25zSW1wbCxDb21tZW50TGlzdEltcGw+IHsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBTY29wZTxMZWFmLFBhcnNlZEVsZW1lbnRBbm5vdGF0aW9uLExvY2F0b3JJbXBsLEFubm90YXRpb25zSW1wbCxDb21tZW50TGlzdEltcGw+IHBhcmVudDsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBHcmFtbWFyIGdyYW1tYXI7Ci0KLSAgICBHcmFtbWFyU2VjdGlvbkltcGwoCi0gICAgICAgIFNjb3BlPExlYWYsUGFyc2VkRWxlbWVudEFubm90YXRpb24sTG9jYXRvckltcGwsQW5ub3RhdGlvbnNJbXBsLENvbW1lbnRMaXN0SW1wbD4gc2NvcGUsCi0gICAgICAgIEdyYW1tYXIgZ3JhbW1hciApIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBzY29wZTsKLSAgICAgICAgdGhpcy5ncmFtbWFyID0gZ3JhbW1hcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0b3BMZXZlbEFubm90YXRpb24oUGFyc2VkRWxlbWVudEFubm90YXRpb24gcGFyc2VkRWxlbWVudEFubm90YXRpb24pIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdG9wTGV2ZWxDb21tZW50KENvbW1lbnRMaXN0SW1wbCBjb21tZW50TGlzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGl2PExlYWYsIFBhcnNlZEVsZW1lbnRBbm5vdGF0aW9uLCBMb2NhdG9ySW1wbCwgQW5ub3RhdGlvbnNJbXBsLCBDb21tZW50TGlzdEltcGw+IG1ha2VEaXYoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGl2SW1wbChwYXJlbnQsZ3JhbW1hcik7Ci0gICAgfQotCi0gICAgcHVibGljIEluY2x1ZGU8TGVhZiwgUGFyc2VkRWxlbWVudEFubm90YXRpb24sIExvY2F0b3JJbXBsLCBBbm5vdGF0aW9uc0ltcGwsIENvbW1lbnRMaXN0SW1wbD4gbWFrZUluY2x1ZGUoKSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVmaW5lKFN0cmluZyBuYW1lLCBDb21iaW5lIGNvbWJpbmUsIExlYWYgbGVhZiwgTG9jYXRvckltcGwgbG9jYXRvciwgQW5ub3RhdGlvbnNJbXBsIGFubm90YXRpb25zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBEZWZpbmUgZGVmID0gZ3JhbW1hci5nZXQobmFtZSk7Ci0gICAgICAgIGRlZi5sb2NhdGlvbiA9IGxvY2F0b3I7Ci0KLSAgICAgICAgaWYoY29tYmluZT09bnVsbCB8fCBkZWYubGVhZj09bnVsbCkgewotICAgICAgICAgICAgZGVmLmxlYWYgPSBsZWFmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVmLmxlYWYubWVyZ2UobGVhZik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL1NjaGVtYUJ1aWxkZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci9yZWxheG5nL1NjaGVtYUJ1aWxkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTY3NmQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9TY2hlbWFCdWlsZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLmJ1aWxkZXIucmVsYXhuZzsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpDbGFzczsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KQ29kZU1vZGVsOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLkRhdGE7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLkVsZW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLkVtcHR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5MZWFmOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5MaXN0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5WYWx1ZTsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5EYXRhUGF0dGVybkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuRWxlbWVudEFubm90YXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5idWlsZGVyLkdyYW1tYXI7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuTmFtZUNsYXNzQnVpbGRlcjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QuYnVpbGRlci5TY2hlbWFCdWlsZGVyOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5idWlsZGVyLlNjb3BlOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5vbS5QYXJzZWRFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5hc3QudXRpbC5Mb2NhdG9ySW1wbDsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5uYy5OYW1lQ2xhc3M7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20ubmMuTmFtZUNsYXNzQnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20ucGFyc2UuQ29udGV4dDsKLWltcG9ydCBvcmcua29oc3VrZS5ybmdvbS5wYXJzZS5JbGxlZ2FsU2NoZW1hRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLnBhcnNlLlBhcnNlYWJsZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQnVpbGRzIGEgbW9kZWwgZnJvbSBhIFJFTEFYIE5HIGdyYW1tYXIuCi0gKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2NoZW1hQnVpbGRlckltcGwgaW1wbGVtZW50cyBTY2hlbWFCdWlsZGVyPE5hbWVDbGFzcyxMZWFmLFBhcnNlZEVsZW1lbnRBbm5vdGF0aW9uLExvY2F0b3JJbXBsLEFubm90YXRpb25zSW1wbCxDb21tZW50TGlzdEltcGw+IHsKLSAgICBwcml2YXRlIGZpbmFsIE5hbWVDbGFzc0J1aWxkZXJJbXBsIG5jYiA9IG5ldyBOYW1lQ2xhc3NCdWlsZGVySW1wbCgpOwotICAgIHByaXZhdGUgZmluYWwgSkNsYXNzIHN0cmluZzsKLSAgICBwcml2YXRlIGZpbmFsIERhdGF0eXBlRmFjdG9yeSBkdGY7Ci0KLSAgICBwdWJsaWMgU2NoZW1hQnVpbGRlckltcGwoSkNvZGVNb2RlbCBjb2RlTW9kZWwpIHsKLSAgICAgICAgc3RyaW5nID0gY29kZU1vZGVsLnJlZihTdHJpbmcuY2xhc3MpOwotICAgICAgICBkdGYgPSBuZXcgRGF0YXR5cGVGYWN0b3J5KGNvZGVNb2RlbCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgTGVhZiBleHBhbmRQYXR0ZXJuKExlYWYgbGVhZikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGxlYWY7Ci0gICAgfQotCi0KLQotICAgIHB1YmxpYyBOYW1lQ2xhc3NCdWlsZGVyIGdldE5hbWVDbGFzc0J1aWxkZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmNiOwotICAgIH0KLQotICAgIHByaXZhdGUgTGVhZiBtZXJnZShqYXZhLnV0aWwuTGlzdDxMZWFmPiBsZWF2ZXMpIHsKLSAgICAgICAgZm9yKCBpbnQgaT0xOyBpPGxlYXZlcy5zaXplKCk7IGkrKyApCi0gICAgICAgICAgICBsZWF2ZXMuZ2V0KDApLm1lcmdlKGxlYXZlcy5nZXQoaSkpOwotICAgICAgICByZXR1cm4gbGVhdmVzLmdldCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlQ2hvaWNlKGphdmEudXRpbC5MaXN0PExlYWY+IGxlYXZlcywgTG9jYXRvckltcGwgbG9jYXRvciwgQW5ub3RhdGlvbnNJbXBsIGFubm90YXRpb25zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVyZ2UobGVhdmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlSW50ZXJsZWF2ZShqYXZhLnV0aWwuTGlzdDxMZWFmPiBsZWF2ZXMsIExvY2F0b3JJbXBsIGxvY2F0b3IsIEFubm90YXRpb25zSW1wbCBhbm5vdGF0aW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lcmdlKGxlYXZlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgbWFrZUdyb3VwKGphdmEudXRpbC5MaXN0PExlYWY+IGxlYXZlcywgTG9jYXRvckltcGwgbG9jYXRvciwgQW5ub3RhdGlvbnNJbXBsIGFubm90YXRpb25zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVyZ2UobGVhdmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlT25lT3JNb3JlKExlYWYgbGVhZiwgTG9jYXRvckltcGwgbG9jYXRvciwgQW5ub3RhdGlvbnNJbXBsIGFubm90YXRpb25zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbGVhZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlWmVyb09yTW9yZShMZWFmIGxlYWYsIExvY2F0b3JJbXBsIGxvY2F0b3IsIEFubm90YXRpb25zSW1wbCBhbm5vdGF0aW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGxlYWYubWVyZ2UobmV3IEVtcHR5KGxvY2F0b3IpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlT3B0aW9uYWwoTGVhZiBsZWFmLCBMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBsZWFmLm1lcmdlKG5ldyBFbXB0eShsb2NhdG9yKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgbWFrZUxpc3QoTGVhZiBsZWFmLCBMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlzdChsb2NhdG9yLGxlYWYpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIG1ha2VNaXhlZChMZWFmIGxlYWYsIExvY2F0b3JJbXBsIGxvY2F0b3IsIEFubm90YXRpb25zSW1wbCBhbm5vdGF0aW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGxlYWYubWVyZ2UobmV3IERhdGEobG9jYXRvcixzdHJpbmcpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlRW1wdHkoTG9jYXRvckltcGwgbG9jYXRvciwgQW5ub3RhdGlvbnNJbXBsIGFubm90YXRpb25zKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW1wdHkobG9jYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgbWFrZU5vdEFsbG93ZWQoTG9jYXRvckltcGwgbG9jYXRvciwgQW5ub3RhdGlvbnNJbXBsIGFubm90YXRpb25zKSB7Ci0gICAgICAgIC8vIHRlY2huaWNhbGx5IHRoaXMgaXMgaW5jb3JyZWN0LCBidXQgd2Ugd29uJ3QgYmUKLSAgICAgICAgLy8gYWJsZSB0byBoYW5kbGUgPG5vdEFsbG93ZWQvPiBjb3JyZWN0bHkgYW55d2F5LgotICAgICAgICByZXR1cm4gbmV3IEVtcHR5KGxvY2F0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIG1ha2VUZXh0KExvY2F0b3JJbXBsIGxvY2F0b3IsIEFubm90YXRpb25zSW1wbCBhbm5vdGF0aW9ucykgewotICAgICAgICByZXR1cm4gbmV3IERhdGEobG9jYXRvcixzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIG1ha2VBdHRyaWJ1dGUoTmFtZUNsYXNzIG5hbWVDbGFzcywgTGVhZiBsZWFmLCBMb2NhdG9ySW1wbCBsb2NhdG9yLCBBbm5vdGF0aW9uc0ltcGwgYW5ub3RhdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIExlYWYgciA9IG51bGw7Ci0gICAgICAgIGZvciggUU5hbWUgbiA6IG5hbWVDbGFzcy5saXN0TmFtZXMoKSApIHsKLSAgICAgICAgICAgIExlYWYgbCA9IG5ldyBBdHRyaWJ1dGUobG9jYXRvcixuLGxlYWYpOwotICAgICAgICAgICAgaWYociE9bnVsbCkgICAgIHIgPSByLm1lcmdlKGwpOwotICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIHIgPSBsOwotICAgICAgICB9Ci0gICAgICAgIGlmKHI9PW51bGwpICAgICByZXR1cm4gbmV3IEVtcHR5KGxvY2F0b3IpOwotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlRWxlbWVudChOYW1lQ2xhc3MgbmFtZUNsYXNzLCBMZWFmIGxlYWYsIExvY2F0b3JJbXBsIGxvY2F0b3IsIEFubm90YXRpb25zSW1wbCBhbm5vdGF0aW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgTGVhZiByID0gbnVsbDsKLSAgICAgICAgZm9yKCBRTmFtZSBuIDogbmFtZUNsYXNzLmxpc3ROYW1lcygpICkgewotICAgICAgICAgICAgTGVhZiBsID0gbmV3IEVsZW1lbnQobG9jYXRvcixuLGxlYWYpOwotICAgICAgICAgICAgaWYociE9bnVsbCkgICAgIHIgPSByLm1lcmdlKGwpOwotICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIHIgPSBsOwotICAgICAgICB9Ci0gICAgICAgIGlmKHI9PW51bGwpICAgICByZXR1cm4gbmV3IEVtcHR5KGxvY2F0b3IpOwotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0YVBhdHRlcm5CdWlsZGVyIG1ha2VEYXRhUGF0dGVybkJ1aWxkZXIoU3RyaW5nIGRhdGF0eXBlTGlicmFyeSwgU3RyaW5nIHR5cGUsIExvY2F0b3JJbXBsIGxvY2F0b3IpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgRGF0YVBhdHRlcm5CdWlsZGVySW1wbChnZXRUeXBlKGRhdGF0eXBlTGlicmFyeSwgdHlwZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgSlR5cGUgZ2V0VHlwZShTdHJpbmcgZGF0YXR5cGVMaWJyYXJ5LCBTdHJpbmcgdHlwZSkgewotICAgICAgICBKVHlwZSB0ID0gZHRmLmdldFR5cGUoZGF0YXR5cGVMaWJyYXJ5LHR5cGUpOwotICAgICAgICBpZih0PT1udWxsKSB0ID0gc3RyaW5nOwotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtYWtlVmFsdWUoU3RyaW5nIGRhdGF0eXBlTGlicmFyeSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSwgQ29udGV4dCBjLCBTdHJpbmcgbnMsIExvY2F0b3JJbXBsIGxvY2F0b3IsIEFubm90YXRpb25zSW1wbCBhbm5vdGF0aW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZShsb2NhdG9yLGdldFR5cGUoZGF0YXR5cGVMaWJyYXJ5LCB0eXBlKSx2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYW1tYXI8TGVhZixQYXJzZWRFbGVtZW50QW5ub3RhdGlvbixMb2NhdG9ySW1wbCxBbm5vdGF0aW9uc0ltcGwsQ29tbWVudExpc3RJbXBsPiBtYWtlR3JhbW1hcihTY29wZTxMZWFmLFBhcnNlZEVsZW1lbnRBbm5vdGF0aW9uLExvY2F0b3JJbXBsLEFubm90YXRpb25zSW1wbCxDb21tZW50TGlzdEltcGw+IHNjb3BlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgR3JhbW1hckltcGwoc2NvcGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIGFubm90YXRlKExlYWYgbGVhZiwgQW5ub3RhdGlvbnNJbXBsIGFubm90YXRpb25zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbGVhZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBhbm5vdGF0ZUFmdGVyKExlYWYgbGVhZiwgUGFyc2VkRWxlbWVudEFubm90YXRpb24gcGFyc2VkRWxlbWVudEFubm90YXRpb24pIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBsZWFmOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIG1ha2VFcnJvclBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW1wdHkobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdXNlc0NvbW1lbnRzKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgbWFrZUV4dGVybmFsUmVmKFBhcnNlYWJsZSBjdXJyZW50LCBTdHJpbmcgdXJpLCBTdHJpbmcgbnMsIFNjb3BlPExlYWYsUGFyc2VkRWxlbWVudEFubm90YXRpb24sTG9jYXRvckltcGwsQW5ub3RhdGlvbnNJbXBsLENvbW1lbnRMaXN0SW1wbD4gc2NvcGUsIExvY2F0b3JJbXBsIGxvY2F0b3IsIEFubm90YXRpb25zSW1wbCBhbm5vdGF0aW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uLCBJbGxlZ2FsU2NoZW1hRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSSdtIG5vdCB0b28gc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3QKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQucGFyc2VFeHRlcm5hbCh1cmksIHRoaXMsIHNjb3BlLCBucyApOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhdG9ySW1wbCBtYWtlTG9jYXRpb24oU3RyaW5nIHN5c3RlbUlkLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikgewotICAgICAgICByZXR1cm4gbmV3IExvY2F0b3JJbXBsKHN5c3RlbUlkLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbnNJbXBsIG1ha2VBbm5vdGF0aW9ucyhDb21tZW50TGlzdEltcGwgY29tbWVudExpc3QsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25zSW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXI8TGVhZiwgUGFyc2VkRWxlbWVudEFubm90YXRpb24sIExvY2F0b3JJbXBsLCBBbm5vdGF0aW9uc0ltcGwsIENvbW1lbnRMaXN0SW1wbD4gbWFrZUVsZW1lbnRBbm5vdGF0aW9uQnVpbGRlcihTdHJpbmcgbnMsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgsIExvY2F0b3JJbXBsIGxvY2F0b3IsIENvbW1lbnRMaXN0SW1wbCBjb21tZW50TGlzdCwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudEFubm90YXRpb25CdWlsZGVySW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tZW50TGlzdEltcGwgbWFrZUNvbW1lbnRMaXN0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBjb21tZW50QWZ0ZXIoTGVhZiBsZWFmLCBDb21tZW50TGlzdEltcGwgY29tbWVudExpc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBsZWFmOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9idWlsZGVyL3JlbGF4bmcvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2VmMTIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIvcmVsYXhuZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTxodG1sPjxib2R5PgotICBSZWFkcyBSRUxBWCBORyBncmFtbWFyIGZyb20gUk5HT00gYW5kIGJ1aWxkcyB0aGUgbW9kZWwgZm9yIFRYVy4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci94c2QvWG1sU2NoZW1hQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIveHNkL1htbFNjaGVtYUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0YTIxNS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci94c2QvWG1sU2NoZW1hQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLmJ1aWxkZXIueHNkOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSlR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLlR4d09wdGlvbnM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLmJ1aWxkZXIucmVsYXhuZy5EYXRhdHlwZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLkF0dHJpYnV0ZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuRGF0YTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuRGVmaW5lOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5FbXB0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuR3JhbW1hcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTGVhZjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTGlzdDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuTm9kZVNldDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuRWxlbWVudDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwuUmVmOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20uWFNBbm5vdGF0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20uWFNBdHRyaWJ1dGVEZWNsOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20uWFNBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU0NvbXBsZXhUeXBlOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20uWFNDb250ZW50VHlwZTsKLWltcG9ydCBjb20uc3VuLnhtbC54c29tLlhTRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU0ZhY2V0OwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20uWFNJZGVudGl0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU0xpc3RTaW1wbGVUeXBlOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20uWFNOb3RhdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC54c29tLlhTUGFydGljbGU7Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU1Jlc3RyaWN0aW9uU2ltcGxlVHlwZTsKLWltcG9ydCBjb20uc3VuLnhtbC54c29tLlhTU2NoZW1hOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20uWFNTY2hlbWFTZXQ7Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU1NpbXBsZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU1VuaW9uU2ltcGxlVHlwZTsKLWltcG9ydCBjb20uc3VuLnhtbC54c29tLlhTWFBhdGg7Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU1dpbGRjYXJkOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20uWFNNb2RlbEdyb3VwRGVjbDsKLWltcG9ydCBjb20uc3VuLnhtbC54c29tLlhTTW9kZWxHcm91cDsKLWltcG9ydCBjb20uc3VuLnhtbC54c29tLlhTRWxlbWVudERlY2w7Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU1R5cGU7Ci1pbXBvcnQgY29tLnN1bi54bWwueHNvbS5YU0F0dENvbnRhaW5lcjsKLWltcG9ydCBjb20uc3VuLnhtbC54c29tLlhTQXR0R3JvdXBEZWNsOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20udmlzaXRvci5YU0Z1bmN0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLnhzb20udmlzaXRvci5YU1NpbXBsZVR5cGVGdW5jdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxTY2hlbWFCdWlsZGVyIGltcGxlbWVudHMgWFNGdW5jdGlvbjxMZWFmPiwgWFNTaW1wbGVUeXBlRnVuY3Rpb248TGVhZj4gewotICAgIHB1YmxpYyBzdGF0aWMgTm9kZVNldCBidWlsZCggWFNTY2hlbWFTZXQgeHMsIFR4d09wdGlvbnMgb3B0cyApIHsKLSAgICAgICAgWG1sU2NoZW1hQnVpbGRlciBidWlsZGVyID0gbmV3IFhtbFNjaGVtYUJ1aWxkZXIoeHMsb3B0cyk7Ci0gICAgICAgIGJ1aWxkZXIuYnVpbGQoeHMpOwotICAgICAgICByZXR1cm4gYnVpbGRlci5ub2RlU2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZChYU1NjaGVtYVNldCB4cykgewotICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBiaW5kIGFsbCBjb21wbGV4IHR5cGVzCi0gICAgICAgIGZvciggWFNTY2hlbWEgcyA6IHhzLmdldFNjaGVtYXMoKSApIHsKLSAgICAgICAgICAgIGZvciggWFNDb21wbGV4VHlwZSB0IDogcy5nZXRDb21wbGV4VHlwZXMoKS52YWx1ZXMoKSApIHsKLSAgICAgICAgICAgICAgICB0LmFwcGx5KHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbm9kZVNldC5hZGRBbGwoY29tcGxleFR5cGVzLnZhbHVlcygpKTsKLSAgICAgICAgbm9kZVNldC5hZGRBbGwobW9kZWxHcm91cHMudmFsdWVzKCkpOwotICAgICAgICBub2RlU2V0LmFkZEFsbChhdHRHcm91cHMudmFsdWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIHNpbXBsZVR5cGUoWFNTaW1wbGVUeXBlIHNpbXBsZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHNpbXBsZVR5cGUuYXBwbHkoKFhTU2ltcGxlVHlwZUZ1bmN0aW9uPExlYWY+KXRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIHBhcnRpY2xlKFhTUGFydGljbGUgcGFydGljbGUpIHsKLSAgICAgICAgcmV0dXJuIHBhcnRpY2xlLmdldFRlcm0oKS5hcHBseSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBlbXB0eShYU0NvbnRlbnRUeXBlIGVtcHR5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW1wdHkoZW1wdHkuZ2V0TG9jYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlIGF0dHJpYnV0ZURlY2woWFNBdHRyaWJ1dGVEZWNsIGRlY2wpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGUoZGVjbC5nZXRMb2NhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRRTmFtZShkZWNsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUoZGVjbC5nZXRUeXBlKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlIGF0dHJpYnV0ZVVzZShYU0F0dHJpYnV0ZVVzZSB1c2UpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZURlY2wodXNlLmdldERlY2woKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgd2lsZGNhcmQoWFNXaWxkY2FyZCB3YykgewotICAgICAgICAvLyB3aWxkY2FyZCBjYW4gYmUgYWx3YXlzIHdyaXR0ZW4gdGhyb3VnaCB0aGUgd2VsbC1mb3JtZWRuZXNzIG1ldGhvZC4KLSAgICAgICAgLy8gbm8gbmVlZCB0byBnZW5lcmF0ZSBhbnl0aGluZyBmb3IgdGhpcy4KLSAgICAgICAgcmV0dXJuIG5ldyBFbXB0eSh3Yy5nZXRMb2NhdG9yKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIG1vZGVsR3JvdXBEZWNsKFhTTW9kZWxHcm91cERlY2wgbWcpIHsKLSAgICAgICAgRGVmaW5lIGRlZiA9IG1vZGVsR3JvdXBzLmdldChtZyk7Ci0gICAgICAgIGlmKGRlZj09bnVsbCkgewotICAgICAgICAgICAgZGVmID0gZ3JhbW1hci5nZXQobWcuZ2V0TmFtZSgpKTsgLy8gVE9ETzogbmFtZSBjb2xsaXNpb24gZGV0ZWN0aW9uIGFuZCBhdm9pZGFuY2UKLSAgICAgICAgICAgIG1vZGVsR3JvdXBzLnB1dChtZyxkZWYpOwotCi0gICAgICAgICAgICBkZWYuYWRkQ2hpbGQobWcuZ2V0TW9kZWxHcm91cCgpLmFwcGx5KHRoaXMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJlZihtZy5nZXRMb2NhdG9yKCksZGVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBtb2RlbEdyb3VwKFhTTW9kZWxHcm91cCBtZykgewotICAgICAgICBYU1BhcnRpY2xlW10gY2hpbGRyZW4gPSBtZy5nZXRDaGlsZHJlbigpOwotICAgICAgICBpZihjaGlsZHJlbi5sZW5ndGg9PTApICByZXR1cm4gbmV3IEVtcHR5KG1nLmdldExvY2F0b3IoKSk7Ci0KLSAgICAgICAgTGVhZiBsID0gcGFydGljbGUoY2hpbGRyZW5bMF0pOwotICAgICAgICBmb3IoIGludCBpPTE7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgbC5tZXJnZShwYXJ0aWNsZShjaGlsZHJlbltpXSkpOwotICAgICAgICByZXR1cm4gbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBlbGVtZW50RGVjbChYU0VsZW1lbnREZWNsIGUpIHsKLSAgICAgICAgRWxlbWVudCBlbCA9IG5ldyBFbGVtZW50KGUuZ2V0TG9jYXRvcigpLGdldFFOYW1lKGUpLGUuZ2V0VHlwZSgpLmFwcGx5KHRoaXMpKTsKLSAgICAgICAgbm9kZVNldC5hZGQoZWwpOwotICAgICAgICByZXR1cm4gZWw7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgY29tcGxleFR5cGUoWFNDb21wbGV4VHlwZSBjdCkgewotICAgICAgICBEZWZpbmUgZGVmID0gY29tcGxleFR5cGVzLmdldChjdCk7Ci0gICAgICAgIGlmKGRlZj09bnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgbmFtZSBjb2xsaXNpb24gYW5kIHN1Y2gKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY3QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYoY3QuaXNMb2NhbCgpKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGN0LmdldFNjb3BlKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmID0gZ3JhbW1hci5nZXQobmFtZSk7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZXMucHV0KGN0LGRlZik7Ci0KLSAgICAgICAgICAgIFhTVHlwZSBiYXNlVHlwZSA9IGN0LmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICBpZihiYXNlVHlwZS5pc0NvbXBsZXhUeXBlKCkgJiYgIWlzQW55VHlwZShiYXNlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBjb3B5IGluaGVyaXRhbmNlCi0gICAgICAgICAgICAgICAgZGVmLmFkZENoaWxkKGJhc2VUeXBlLmFwcGx5KHRoaXMpKTsKLQotICAgICAgICAgICAgICAgIGlmKGN0LmdldERlcml2YXRpb25NZXRob2QoKT09WFNUeXBlLkVYVEVOU0lPTikgewotICAgICAgICAgICAgICAgICAgICBYU0NvbnRlbnRUeXBlIGV4cGxpY2l0Q29udGVudCA9IGN0LmdldEV4cGxpY2l0Q29udGVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZihleHBsaWNpdENvbnRlbnQhPW51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWYuYWRkQ2hpbGQoZXhwbGljaXRDb250ZW50LmFwcGx5KHRoaXMpKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0SG9sZGVyKGN0LCBkZWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBzdGFydCBmcm9tIGZyZXNoCi0gICAgICAgICAgICAgICAgZGVmLmFkZENoaWxkKGN0LmdldENvbnRlbnRUeXBlKCkuYXBwbHkodGhpcykpOwotICAgICAgICAgICAgICAgIGF0dEhvbGRlcihjdCwgZGVmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgUmVmKGN0LmdldExvY2F0b3IoKSxkZWYpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhdHRIb2xkZXIoWFNBdHRDb250YWluZXIgY3QsIERlZmluZSBkZWYpIHsKLSAgICAgICAgZm9yKCBYU0F0dHJpYnV0ZVVzZSB1c2UgOiBjdC5nZXREZWNsYXJlZEF0dHJpYnV0ZVVzZXMoKSApIHsKLSAgICAgICAgICAgIGRlZi5hZGRDaGlsZChhdHRyaWJ1dGVVc2UodXNlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChYU0F0dEdyb3VwRGVjbCBhZyA6IGN0LmdldEF0dEdyb3VwcygpKSB7Ci0gICAgICAgICAgICBkZWYuYWRkQ2hpbGQoYXR0R3JvdXBEZWNsKGFnKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBhdHRHcm91cERlY2woWFNBdHRHcm91cERlY2wgYWcpIHsKLSAgICAgICAgRGVmaW5lIGRlZiA9IGF0dEdyb3Vwcy5nZXQoYWcpOwotICAgICAgICBpZihkZWY9PW51bGwpIHsKLSAgICAgICAgICAgIGRlZiA9IGdyYW1tYXIuZ2V0KGFnLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhdHRHcm91cHMucHV0KGFnLGRlZik7Ci0gICAgICAgICAgICBhdHRIb2xkZXIoYWcsZGVmKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJlZihhZy5nZXRMb2NhdG9yKCksZGVmKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBbnlUeXBlKFhTVHlwZSB0KSB7Ci0gICAgICAgIHJldHVybiB0LmdldE5hbWUoKS5lcXVhbHMoImFueVR5cGUiKSAmJiB0LmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiByZXN0cmljdGlvblNpbXBsZVR5cGUoWFNSZXN0cmljdGlvblNpbXBsZVR5cGUgcnN0KSB7Ci0gICAgICAgIEpUeXBlIHQgPSBkdGYuZ2V0VHlwZShyc3QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkscnN0LmdldE5hbWUoKSk7Ci0gICAgICAgIGlmKHQhPW51bGwpIHJldHVybiBuZXcgRGF0YShyc3QuZ2V0TG9jYXRvcigpLHQpOwotICAgICAgICByZXR1cm4gc2ltcGxlVHlwZShyc3QuZ2V0U2ltcGxlQmFzZVR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgdW5pb25TaW1wbGVUeXBlKFhTVW5pb25TaW1wbGVUeXBlIHN0KSB7Ci0gICAgICAgIExlYWYgbCA9IHNpbXBsZVR5cGUoc3QuZ2V0TWVtYmVyKDApKTsKLSAgICAgICAgZm9yKCBpbnQgaT0xOyBpPHN0LmdldE1lbWJlclNpemUoKTsgaSsrICkKLSAgICAgICAgICAgIGwubWVyZ2Uoc2ltcGxlVHlwZShzdC5nZXRNZW1iZXIoaSkpKTsKLSAgICAgICAgcmV0dXJuIGw7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgbGlzdFNpbXBsZVR5cGUoWFNMaXN0U2ltcGxlVHlwZSBzdCkgewotICAgICAgICByZXR1cm4gbmV3IExpc3Qoc3QuZ2V0TG9jYXRvcigpLHNpbXBsZVR5cGUoc3QuZ2V0SXRlbVR5cGUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2V0UU5hbWUoWFNEZWNsYXJhdGlvbiBkZWNsKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZGVjbC5nZXRUYXJnZXROYW1lc3BhY2UoKSxkZWNsLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFhTU2NoZW1hU2V0IHNjaGVtYVNldDsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBOb2RlU2V0IG5vZGVTZXQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERhdGF0eXBlRmFjdG9yeSBkdGY7Ci0KLSAgICAvKioKLSAgICAgKiBXZSBtYXAgbW9kZWwgZ3JvdXBzIHRvIGludGVyZmFjZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8WFNNb2RlbEdyb3VwRGVjbCxEZWZpbmU+IG1vZGVsR3JvdXBzID0gbmV3IEhhc2hNYXA8WFNNb2RlbEdyb3VwRGVjbCwgRGVmaW5lPigpOwotCi0gICAgLyoqCi0gICAgICogV2UgbWFwIGNvbXBsZXggdHlwZXMgdG8gaW50ZXJmYWNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxYU0NvbXBsZXhUeXBlLERlZmluZT4gY29tcGxleFR5cGVzID0gbmV3IEhhc2hNYXA8WFNDb21wbGV4VHlwZSxEZWZpbmU+KCk7Ci0KLSAgICAvKioKLSAgICAgKiAuLi4gYW5kIGF0dHJpYnV0ZSBncm91cHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxYU0F0dEdyb3VwRGVjbCxEZWZpbmU+IGF0dEdyb3VwcyA9IG5ldyBIYXNoTWFwPFhTQXR0R3JvdXBEZWNsLERlZmluZT4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgR3JhbW1hciBncmFtbWFyID0gbmV3IEdyYW1tYXIoKTsKLQotICAgIHByaXZhdGUgWG1sU2NoZW1hQnVpbGRlcihYU1NjaGVtYVNldCB4cyxUeHdPcHRpb25zIG9wdHMpIHsKLSAgICAgICAgdGhpcy5zY2hlbWFTZXQgPSB4czsKLSAgICAgICAgZ3JhbW1hci5hZGRDaGlsZChuZXcgRW1wdHkobnVsbCkpOwotICAgICAgICB0aGlzLm5vZGVTZXQgPSBuZXcgTm9kZVNldChvcHRzLGdyYW1tYXIpOwotICAgICAgICB0aGlzLmR0ZiA9IG5ldyBEYXRhdHlwZUZhY3Rvcnkob3B0cy5jb2RlTW9kZWwpOwotICAgIH0KLQotCi0KLS8vIHdvbid0IGJlIHVzZWQKLSAgICBwdWJsaWMgTGVhZiBhbm5vdGF0aW9uKFhTQW5ub3RhdGlvbiB4c0Fubm90YXRpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIHNjaGVtYShYU1NjaGVtYSB4c1NjaGVtYSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgZmFjZXQoWFNGYWNldCB4c0ZhY2V0KSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGVhZiBub3RhdGlvbihYU05vdGF0aW9uIHhzTm90YXRpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBMZWFmIGlkZW50aXR5Q29uc3RyYWludChYU0lkZW50aXR5Q29uc3RyYWludCB4c0lkZW50aXR5Q29uc3RyYWludCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgeHBhdGgoWFNYUGF0aCB4c3hQYXRoKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci94c2QvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL2J1aWxkZXIveHNkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5MGRjMy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvYnVpbGRlci94c2QvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08aHRtbD48Ym9keT4KLSAgUmVhZHMgWE1MIFNjaGVtYSBncmFtbWFyIGZyb20gWFNPTSBhbmQgYnVpbGRzIHRoZSBtb2RlbCBmb3IgVFhXLgotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9BdHRyaWJ1dGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5MDFkMS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbDsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpBbm5vdGF0aW9uVXNlOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpEZWZpbmVkQ2xhc3M7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSk1ldGhvZDsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KTW9kOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5OYW1lVXRpbDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcC5BdHRyaWJ1dGVQcm9wOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5wcm9wLlByb3A7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgZXh0ZW5kcyBYbWxOb2RlIHsKLSAgICBwdWJsaWMgQXR0cmlidXRlKExvY2F0b3IgbG9jYXRpb24sIFFOYW1lIG5hbWUsIExlYWYgbGVhZikgewotICAgICAgICBzdXBlcihsb2NhdGlvbiwgbmFtZSwgbGVhZik7Ci0gICAgfQotCi0gICAgdm9pZCBkZWNsYXJlKE5vZGVTZXQgbnNldCkgewotICAgICAgICA7IC8vIGF0dHJpYnV0ZXMgd29uJ3QgcHJvZHVjZSBhIGNsYXNzCi0gICAgfQotCi0gICAgdm9pZCBnZW5lcmF0ZShOb2RlU2V0IG5zZXQpIHsKLSAgICAgICAgOyAvLyBub3RoaW5nCi0gICAgfQotCi0gICAgdm9pZCBnZW5lcmF0ZShKRGVmaW5lZENsYXNzIGNsYXp6LCBOb2RlU2V0IG5zZXQsIFNldDxQcm9wPiBwcm9wcykgewotICAgICAgICBTZXQ8SlR5cGU+IHR5cGVzID0gbmV3IEhhc2hTZXQ8SlR5cGU+KCk7Ci0KLSAgICAgICAgZm9yKCBMZWFmIGwgOiBjb2xsZWN0Q2hpbGRyZW4oKSApIHsKLSAgICAgICAgICAgIGlmIChsIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIHR5cGVzLmFkZCgoKFRleHQpbCkuZ2V0RGF0YXR5cGUobnNldCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBOYW1lVXRpbC50b01ldGhvZE5hbWUobmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgZm9yKCBKVHlwZSB0IDogdHlwZXMgKSB7Ci0gICAgICAgICAgICBpZighcHJvcHMuYWRkKG5ldyBBdHRyaWJ1dGVQcm9wKG5hbWUsdCkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBKTWV0aG9kIG0gPSBjbGF6ei5tZXRob2QoSk1vZC5QVUJMSUMsCi0gICAgICAgICAgICAgICAgbnNldC5vcHRzLmNoYWluTWV0aG9kPyAoSlR5cGUpY2xhenogOiBuc2V0LmNvZGVNb2RlbC5WT0lELAotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgbS5wYXJhbSh0LCJ2YWx1ZSIpOwotCi0gICAgICAgICAgICBKQW5ub3RhdGlvblVzZSBhID0gbS5hbm5vdGF0ZShYbWxBdHRyaWJ1dGUuY2xhc3MpOwotICAgICAgICAgICAgaWYoIW1ldGhvZE5hbWUuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKQotICAgICAgICAgICAgICAgIGEucGFyYW0oInZhbHVlIixuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIGlmKCFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygiIikpCi0gICAgICAgICAgICAgICAgYS5wYXJhbSgibnMiLG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkF0dHJpYnV0ZSAiK25hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0N5Y2xlSXRlcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9DeWNsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWVkZjcuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0N5Y2xlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotZmluYWwgY2xhc3MgQ3ljbGVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPExlYWY+IHsKLSAgICBwcml2YXRlIExlYWYgc3RhcnQ7Ci0gICAgcHJpdmF0ZSBMZWFmIGN1cnJlbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc05leHQgPSB0cnVlOwotCi0gICAgcHVibGljIEN5Y2xlSXRlcmF0b3IoTGVhZiBzdGFydCkgewotICAgICAgICBhc3NlcnQgc3RhcnQhPW51bGw7Ci0gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgICAgICAgdGhpcy5jdXJyZW50ID0gc3RhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGhhc05leHQ7Ci0gICAgfQotCi0gICAgcHVibGljIExlYWYgbmV4dCgpIHsKLSAgICAgICAgTGVhZiBsYXN0ID0gY3VycmVudDsKLSAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0TmV4dCgpOwotICAgICAgICBpZihjdXJyZW50PT1zdGFydCkKLSAgICAgICAgICAgIGhhc05leHQgPSBmYWxzZTsKLQotICAgICAgICByZXR1cm4gbGFzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9EYXRhLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y1YWNjLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbDsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpEZWZpbmVkQ2xhc3M7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSlR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLnByb3AuUHJvcDsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhIGV4dGVuZHMgTGVhZiBpbXBsZW1lbnRzIFRleHQgewotICAgIC8qKgotICAgICAqIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSlR5cGUgdHlwZTsKLQotICAgIHB1YmxpYyBEYXRhKExvY2F0b3IgbG9jYXRpb24sIEpUeXBlIHR5cGUpIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBKVHlwZSBnZXREYXRhdHlwZShOb2RlU2V0IG5zZXQpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgdm9pZCBnZW5lcmF0ZShKRGVmaW5lZENsYXNzIGNsYXp6LCBOb2RlU2V0IG5zZXQsIFNldDxQcm9wPiBwcm9wcykgewotICAgICAgICBjcmVhdGVEYXRhTWV0aG9kKGNsYXp6LHR5cGUsbnNldCxwcm9wcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0RlZmluZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0RlZmluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjUxMjdmLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9EZWZpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSkRlZmluZWRDbGFzczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcC5Qcm9wOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLS8qKgotICogQSBuYW1lZCBwYXR0ZXJuLgotICoKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotcHVibGljIGNsYXNzIERlZmluZSBleHRlbmRzIFdyaXRlck5vZGUgewotICAgIHB1YmxpYyBmaW5hbCBHcmFtbWFyIHNjb3BlOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKLQotICAgIEpEZWZpbmVkQ2xhc3MgY2xheno7Ci0KLSAgICBwdWJsaWMgRGVmaW5lKEdyYW1tYXIgc2NvcGUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG51bGwsbnVsbCk7Ci0gICAgICAgIGlmKHNjb3BlPT1udWxsKSAgICAgc2NvcGUgPSAoR3JhbW1hcil0aGlzOyAgLy8gaGFjayBmb3Igc3RhcnQgcGF0dGVybgotICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIGFzc2VydCBuYW1lIT1udWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlZmluZSBvbmx5IGNvbnRhaW5zCi0gICAgICogb25lIGNoaWxkIChhbmQgdGh1cyBjb25zaWRlcmVkIGlubGluYWJsZS4pCi0gICAgICoKLSAgICAgKiBBIHBhdHRlcm4gZGVmaW5pdGlvbiBpcyBhbHNvIGlubGluZWFibGUgaWYKLSAgICAgKiBpdCdzIHRoZSBzdGFydCBvZiB0aGUgZ3JhbW1hciAoYmVjYXVzZSAic3RhcnQiIGlzbid0IGEgbWVhbmluZ2Z1bCBuYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW5saW5lKCkgewotICAgICAgICByZXR1cm4gaGFzT25lQ2hpbGQoKSB8fCBuYW1lPT1HcmFtbWFyLlNUQVJUOwotICAgIH0KLQotICAgIHZvaWQgZGVjbGFyZShOb2RlU2V0IG5zZXQpIHsKLSAgICAgICAgaWYoaXNJbmxpbmUoKSkgIHJldHVybjsKLQotICAgICAgICBjbGF6eiA9IG5zZXQuY3JlYXRlQ2xhc3MobmFtZSk7Ci0gICAgICAgIGNsYXp6Ll9pbXBsZW1lbnRzKFR5cGVkWG1sV3JpdGVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICB2b2lkIGdlbmVyYXRlKE5vZGVTZXQgbnNldCkgewotICAgICAgICBpZihjbGF6ej09bnVsbCkgICAgIHJldHVybjsKLQotICAgICAgICBIYXNoU2V0PFByb3A+IHByb3BzID0gbmV3IEhhc2hTZXQ8UHJvcD4oKTsKLSAgICAgICAgZm9yKCBMZWFmIGwgOiB0aGlzICkKLSAgICAgICAgICAgIGwuZ2VuZXJhdGUoY2xhenosbnNldCxwcm9wcyk7Ci0gICAgfQotCi0gICAgdm9pZCBnZW5lcmF0ZShKRGVmaW5lZENsYXNzIGNsYXp6LCBOb2RlU2V0IG5zZXQsIFNldDxQcm9wPiBwcm9wcykgewotICAgICAgICBpZihpc0lubGluZSgpKSB7Ci0gICAgICAgICAgICBmb3IoIExlYWYgbCA6IHRoaXMgKQotICAgICAgICAgICAgICAgIGwuZ2VuZXJhdGUoY2xhenosbnNldCwgcHJvcHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0IHRoaXMuY2xhenohPW51bGw7Ci0gICAgICAgICAgICBjbGF6ei5faW1wbGVtZW50cyh0aGlzLmNsYXp6KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJlcGFyZShOb2RlU2V0IG5zZXQpIHsKLSAgICAgICAgaWYoaXNJbmxpbmUoKSAmJiBsZWFmIGluc3RhbmNlb2YgV3JpdGVyTm9kZSAmJiAhbmFtZS5lcXVhbHMoR3JhbW1hci5TVEFSVCkpCi0gICAgICAgICAgICAoKFdyaXRlck5vZGUpbGVhZikuYWx0ZXJuYXRpdmVOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkRlZmluZSAiK25hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0VsZW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYWQ3MGYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbDsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpBbm5vdGF0aW9uVXNlOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpEZWZpbmVkQ2xhc3M7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSk1ldGhvZDsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KTW9kOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5OYW1lVXRpbDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcC5FbGVtZW50UHJvcDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcC5MZWFmRWxlbWVudFByb3A7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLnByb3AuUHJvcDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRWxlbWVudCBkZWNsYXJhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50IGV4dGVuZHMgWG1sTm9kZSB7Ci0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGEgcm9vdCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUm9vdDsKLQotICAgIHByaXZhdGUgU3RyYXRlZ3kgc3RyYXRlZ3k7Ci0KLSAgICBwdWJsaWMgRWxlbWVudChMb2NhdG9yIGxvY2F0aW9uLCBRTmFtZSBuYW1lLCBMZWFmIGxlYWYpIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24sIG5hbWUsIGxlYWYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgc2hvdWxkIGdlbmVyYXRlIGFuIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmF0ZWd5IGRlY2lkZVN0cmF0ZWd5KCkgewotICAgICAgICBpZihpc1Jvb3QpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFRvSW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgaWYoaGFzT25lQ2hpbGQoKSAmJiBsZWFmIGluc3RhbmNlb2YgUmVmICYmICEoKFJlZilsZWFmKS5pc0lubGluZSgpKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNPbmVSZWYoKFJlZilsZWFmKTsKLQotICAgICAgICBTZXQ8TGVhZj4gY2hpbGRyZW4gPSBjb2xsZWN0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yKCBMZWFmIGwgOiBjaGlsZHJlbiApIHsKLSAgICAgICAgICAgIGlmKCBsIGluc3RhbmNlb2YgWG1sTm9kZSApCi0gICAgICAgICAgICAgICAgLy8gaWYgaXQgaGFzIGF0dHJpYnV0ZXMvZWxlbWVudHMgaW4gY2hpbGRyZW4KLSAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRvSW50ZXJmYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvdGhlcndpc2UgdGhpcyBlbGVtZW50IG9ubHkgaGFzIGRhdGEsIHNvIGp1c3QgZ2VuZXJhdGUgbWV0aG9kcyBmb3IgdGhlbS4KLSAgICAgICAgcmV0dXJuIG5ldyBEYXRhT25seSgpOwotICAgIH0KLQotICAgIHZvaWQgZGVjbGFyZShOb2RlU2V0IG5zZXQpIHsKLSAgICAgICAgc3RyYXRlZ3kgPSBkZWNpZGVTdHJhdGVneSgpOwotICAgICAgICBzdHJhdGVneS5kZWNsYXJlKG5zZXQpOwotICAgIH0KLQotICAgIHZvaWQgZ2VuZXJhdGUoTm9kZVNldCBuc2V0KSB7Ci0gICAgICAgIHN0cmF0ZWd5LmdlbmVyYXRlKG5zZXQpOwotICAgIH0KLQotICAgIHZvaWQgZ2VuZXJhdGUoSkRlZmluZWRDbGFzcyBjbGF6eiwgTm9kZVNldCBuc2V0LCBTZXQ8UHJvcD4gcHJvcHMpIHsKLSAgICAgICAgc3RyYXRlZ3kuZ2VuZXJhdGUoY2xhenosbnNldCxwcm9wcyk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIEpNZXRob2QgZ2VuZXJhdGVNZXRob2QoSkRlZmluZWRDbGFzcyBjbGF6eiwgTm9kZVNldCBuc2V0LCBKVHlwZSByZXRUKSB7Ci0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gTmFtZVV0aWwudG9NZXRob2ROYW1lKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIEpNZXRob2QgbSA9IGNsYXp6Lm1ldGhvZChKTW9kLlBVQkxJQywgcmV0VCwgbWV0aG9kTmFtZSk7Ci0KLSAgICAgICAgSkFubm90YXRpb25Vc2UgYSA9IG0uYW5ub3RhdGUoWG1sRWxlbWVudC5jbGFzcyk7Ci0gICAgICAgIGlmKCFtZXRob2ROYW1lLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkKLSAgICAgICAgICAgIGEucGFyYW0oInZhbHVlIixuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgaWYobnNldC5kZWZhdWx0TmFtZXNwYWNlPT1udWxsIHx8ICFuc2V0LmRlZmF1bHROYW1lc3BhY2UuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgICAgYS5wYXJhbSgibnMiLG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAgIHJldHVybiBtOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiRWxlbWVudCAiK25hbWU7Ci0gICAgfQotCi0KLSAgICBpbnRlcmZhY2UgU3RyYXRlZ3kgewotICAgICAgICB2b2lkIGRlY2xhcmUoTm9kZVNldCBuc2V0KTsKLSAgICAgICAgdm9pZCBnZW5lcmF0ZShOb2RlU2V0IG5zZXQpOwotICAgICAgICB2b2lkIGdlbmVyYXRlKEpEZWZpbmVkQ2xhc3MgY2xhenosIE5vZGVTZXQgbnNldCwgU2V0PFByb3A+IHByb3BzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIHRvIGFuIGludGVyZmFjZQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVG9JbnRlcmZhY2UgaW1wbGVtZW50cyBTdHJhdGVneSB7Ci0gICAgICAgIHByaXZhdGUgSkRlZmluZWRDbGFzcyBjbGF6ejsKLQotICAgICAgICBwdWJsaWMgdm9pZCBkZWNsYXJlKE5vZGVTZXQgbnNldCkgewotICAgICAgICAgICAgU3RyaW5nIGNuYW1lOwotICAgICAgICAgICAgaWYoYWx0ZXJuYXRpdmVOYW1lIT1udWxsKQotICAgICAgICAgICAgICAgIGNuYW1lID0gYWx0ZXJuYXRpdmVOYW1lOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNuYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGNsYXp6ID0gbnNldC5jcmVhdGVDbGFzcyhjbmFtZSk7Ci0gICAgICAgICAgICBjbGF6ei5faW1wbGVtZW50cyhUeXBlZFhtbFdyaXRlci5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGNsYXp6LmFubm90YXRlKFhtbEVsZW1lbnQuY2xhc3MpCi0gICAgICAgICAgICAgICAgLnBhcmFtKCJ2YWx1ZSIsbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBuYW1lc3BhY2UKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKE5vZGVTZXQgbnNldCkgewotICAgICAgICAgICAgSGFzaFNldDxQcm9wPiBwcm9wcyA9IG5ldyBIYXNoU2V0PFByb3A+KCk7Ci0gICAgICAgICAgICBmb3IoIExlYWYgbCA6IEVsZW1lbnQudGhpcyApCi0gICAgICAgICAgICAgICAgbC5nZW5lcmF0ZShjbGF6eixuc2V0LCBwcm9wcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShKRGVmaW5lZENsYXNzIG91dGVyLCBOb2RlU2V0IG5zZXQsIFNldDxQcm9wPiBwcm9wcykgewotICAgICAgICAgICAgaWYocHJvcHMuYWRkKG5ldyBFbGVtZW50UHJvcChuYW1lLGNsYXp6KSkpCi0gICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXRob2Qob3V0ZXIsIG5zZXQsIGNsYXp6KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciB0aGluZ3MgbGlrZSAiZWxlbWVudCBmb28ge3JlZlRvQW5vdGhlclBhdHRlcm59IgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSGFzT25lUmVmIGltcGxlbWVudHMgU3RyYXRlZ3kgewotICAgICAgICBwcml2YXRlIGZpbmFsIFJlZiByZWY7Ci0KLSAgICAgICAgcHVibGljIEhhc09uZVJlZihSZWYgcmVmKSB7Ci0gICAgICAgICAgICB0aGlzLnJlZiA9IHJlZjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlY2xhcmUoTm9kZVNldCBuc2V0KSB7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgZ2VuZXJhdGUoTm9kZVNldCBuc2V0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShKRGVmaW5lZENsYXNzIGNsYXp6LCBOb2RlU2V0IG5zZXQsIFNldDxQcm9wPiBwcm9wcykgewotICAgICAgICAgICAgaWYocHJvcHMuYWRkKG5ldyBFbGVtZW50UHJvcChuYW1lLHJlZi5kZWYuY2xhenopKSkKLSAgICAgICAgICAgICAgICBnZW5lcmF0ZU1ldGhvZChjbGF6eiwgbnNldCwgcmVmLmRlZi5jbGF6eik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIERhdGFPbmx5IGltcGxlbWVudHMgU3RyYXRlZ3kgewotICAgICAgICBwdWJsaWMgdm9pZCBkZWNsYXJlKE5vZGVTZXQgbnNldCkgewotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKE5vZGVTZXQgbnNldCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogY29kZSBzaGFyZSB3aXRoIEF0dHJpYnV0ZQotICAgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShKRGVmaW5lZENsYXNzIGNsYXp6LCBOb2RlU2V0IG5zZXQsIFNldDxQcm9wPiBwcm9wcykgewotICAgICAgICAgICAgU2V0PEpUeXBlPiB0eXBlcyA9IG5ldyBIYXNoU2V0PEpUeXBlPigpOwotCi0gICAgICAgICAgICBmb3IoIExlYWYgbCA6IGNvbGxlY3RDaGlsZHJlbigpICkgewotICAgICAgICAgICAgICAgIGlmIChsIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGQoKChUZXh0KWwpLmdldERhdGF0eXBlKG5zZXQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciggSlR5cGUgdCA6IHR5cGVzICkgewotICAgICAgICAgICAgICAgIGlmKCFwcm9wcy5hZGQobmV3IExlYWZFbGVtZW50UHJvcChuYW1lLHQpKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXRob2QoY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICBuc2V0LCBuc2V0Lm9wdHMuY2hhaW5NZXRob2Q/IChKVHlwZSljbGF6eiA6IG5zZXQuY29kZU1vZGVsLlZPSUQKLSAgICAgICAgICAgICAgICApLnBhcmFtKHQsInZhbHVlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvRW1wdHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9FbXB0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzIwOWE0Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9FbXB0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWw7Ci0KLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KRGVmaW5lZENsYXNzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5wcm9wLlByb3A7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1wdWJsaWMgY2xhc3MgRW1wdHkgZXh0ZW5kcyBMZWFmIHsKLSAgICBwdWJsaWMgRW1wdHkoTG9jYXRvciBsb2NhdGlvbikgewotICAgICAgICBzdXBlcihsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgdm9pZCBnZW5lcmF0ZShKRGVmaW5lZENsYXNzIGNsYXp6LCBOb2RlU2V0IG5zZXQsIFNldDxQcm9wPiBwcm9wcykgewotICAgICAgICAvLyBub29wCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0dyYW1tYXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9HcmFtbWFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNWU5N2MuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0dyYW1tYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsOwotCi1pbXBvcnQgb3JnLmtvaHN1a2Uucm5nb20uYXN0LmJ1aWxkZXIuR3JhbW1hclNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBSRUxBWCBORyBncmFtbWFyLgotICoKLSAqIEEge0BsaW5rIEdyYW1tYXJ9IGV4dGVuZHMgYSB7QGxpbmsgRGVmaW5lfSBhcyAic3RhcnQiCi0gKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1wdWJsaWMgY2xhc3MgR3JhbW1hciBleHRlbmRzIERlZmluZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLERlZmluZT4gcGF0dGVybnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRGVmaW5lPigpOwotCi0gICAgcHVibGljIEdyYW1tYXIoKSB7Ci0gICAgICAgIHN1cGVyKG51bGwsU1RBUlQpOwotICAgICAgICBwYXR0ZXJucy5wdXQoU1RBUlQsdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIERlZmluZSBnZXQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgRGVmaW5lIGRlZiA9IHBhdHRlcm5zLmdldChuYW1lKTsKLSAgICAgICAgaWYoZGVmPT1udWxsKQotICAgICAgICAgICAgcGF0dGVybnMucHV0KG5hbWUsZGVmPW5ldyBEZWZpbmUodGhpcyxuYW1lKSk7Ci0gICAgICAgIHJldHVybiBkZWY7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248RGVmaW5lPiBnZXREZWZpbml0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm5zLnZhbHVlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIGZvciB0aGUgc3RhcnQgcGF0dGVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUID0gR3JhbW1hclNlY3Rpb24uU1RBUlQ7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvTGVhZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0xlYWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjY2YwYy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvTGVhZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSkRlZmluZWRDbGFzczsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KTWV0aG9kOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpNb2Q7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSlR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLnByb3AuUHJvcDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcC5WYWx1ZVByb3A7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5hbm5vdGF0aW9uLlhtbFZhbHVlOwotaW1wb3J0IG9yZy5rb2hzdWtlLnJuZ29tLmFzdC5vbS5QYXJzZWRQYXR0ZXJuOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiB7QGxpbmsgTGVhZn1zIGZvcm0gYSBzZXQgKGJ5IGEgY3ljbGljIGRvdWJseS1saW5rZWQgbGlzdC4pCi0gKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGVhZiBpbXBsZW1lbnRzIFBhcnNlZFBhdHRlcm4gewotICAgIHByaXZhdGUgTGVhZiBuZXh0OwotICAgIHByaXZhdGUgTGVhZiBwcmV2OwotCi0gICAgLyoqCi0gICAgICogU291cmNlIGxvY2F0aW9uIHdoZXJlIHRoaXMgbGVhZiB3YXMgZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYXRvciBsb2NhdGlvbjsKLQotICAgIHByb3RlY3RlZCBMZWFmKExvY2F0b3IgbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBwcmV2ID0gbmV4dCA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExlYWYgZ2V0TmV4dCgpIHsKLSAgICAgICAgYXNzZXJ0IG5leHQhPW51bGw7Ci0gICAgICAgIGFzc2VydCBuZXh0LnByZXYgPT0gdGhpczsKLSAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExlYWYgZ2V0UHJldigpIHsKLSAgICAgICAgYXNzZXJ0IHByZXYhPW51bGw7Ci0gICAgICAgIGFzc2VydCBwcmV2Lm5leHQgPT0gdGhpczsKLSAgICAgICAgcmV0dXJuIHByZXY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tYmluZXMgdHdvIHNldHMgaW50byBvbmUgc2V0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIExlYWYgbWVyZ2UoTGVhZiB0aGF0KSB7Ci0gICAgICAgIExlYWYgbjEgPSB0aGlzLm5leHQ7Ci0gICAgICAgIExlYWYgbjIgPSB0aGF0Lm5leHQ7Ci0KLSAgICAgICAgdGhhdC5uZXh0ID0gbjE7Ci0gICAgICAgIHRoYXQubmV4dC5wcmV2ID0gdGhhdDsKLSAgICAgICAgdGhpcy5uZXh0ID0gbjI7Ci0gICAgICAgIHRoaXMubmV4dC5wcmV2ID0gdGhpczsKLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgc2libGluZ3MKLSAgICAgKiAoaW5jbHVkaW5nIGl0c2VsZikKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSXRlcmFibGU8TGVhZj4gc2libGluZ3MoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSXRlcmFibGU8TGVhZj4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8TGVhZj4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDeWNsZUl0ZXJhdG9yKExlYWYudGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgdGhlIGJvZHkgb2YgdGhlIHdyaXRlciBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wcwotICAgICAqICAgICAgY2FwdHVyZXMgdGhlIGdlbmVyYXRlc2Qge0BsaW5rIFByb3B9cyB0bwotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGUoSkRlZmluZWRDbGFzcyBjbGF6eiwgTm9kZVNldCBuc2V0LCBTZXQ8UHJvcD4gcHJvcHMpOwotCi0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHByb3Agb2YgdGhlIGRhdGEgdmFsdWUgbWV0aG9kLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNyZWF0ZURhdGFNZXRob2QoSkRlZmluZWRDbGFzcyBjbGF6eiwgSlR5cGUgdmFsdWVUeXBlLCBOb2RlU2V0IG5zZXQsIFNldDxQcm9wPiBwcm9wcykgewotICAgICAgICBpZighcHJvcHMuYWRkKG5ldyBWYWx1ZVByb3AodmFsdWVUeXBlKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSk1ldGhvZCBtID0gY2xhenoubWV0aG9kKEpNb2QuUFVCTElDLAotICAgICAgICAgICAgbnNldC5vcHRzLmNoYWluTWV0aG9kPyAoSlR5cGUpY2xhenogOiBuc2V0LmNvZGVNb2RlbC5WT0lELAotICAgICAgICAgICAgIl90ZXh0Iik7Ci0gICAgICAgIG0uYW5ub3RhdGUoWG1sVmFsdWUuY2xhc3MpOwotICAgICAgICBtLnBhcmFtKHZhbHVlVHlwZSwidmFsdWUiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvTGlzdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzYTFhNy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWw7Ci0KLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KRGVmaW5lZENsYXNzOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5wcm9wLlByb3A7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTGlzdCBvZiB7QGxpbmsgRGF0YX0gb3Ige0BsaW5rIFZhbHVlfS4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0IGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIFRleHQgewotICAgIHB1YmxpYyBMaXN0KExvY2F0b3IgbG9jYXRpb24sIExlYWYgbGVhZikgewotICAgICAgICBzdXBlcihsb2NhdGlvbiwgbGVhZik7Ci0gICAgfQotCi0gICAgcHVibGljIEpUeXBlIGdldERhdGF0eXBlKE5vZGVTZXQgbnNldCkgewotICAgICAgICBpZihoYXNPbmVDaGlsZCgpICYmIGxlYWYgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUZXh0KWxlYWYpLmdldERhdGF0eXBlKG5zZXQpLmFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnNldC5jb2RlTW9kZWwucmVmKFN0cmluZy5jbGFzcykuYXJyYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZ2VuZXJhdGUoSkRlZmluZWRDbGFzcyBjbGF6eiwgTm9kZVNldCBuc2V0LCBTZXQ8UHJvcD4gcHJvcHMpIHsKLSAgICAgICAgY3JlYXRlRGF0YU1ldGhvZChjbGF6eixnZXREYXRhdHlwZShuc2V0KSxuc2V0LHByb3BzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvTm9kZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5MGU4My4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWw7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIHtAbGluayBOb2RlfSBpcyBhIHtAbGluayBMZWFmfSB0aGF0IGhhcyBjaGlsZHJlbi4KLSAqCi0gKiBDaGlsZHJlbiBhcmUgb3JkZXJsZXNzLgotICoKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGUgZXh0ZW5kcyBMZWFmIGltcGxlbWVudHMgSXRlcmFibGU8TGVhZj4gewotCi0gICAgLyoqCi0gICAgICogQ2hpbGRyZW4gb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBMZWFmIGxlYWY7Ci0KLSAgICBwcm90ZWN0ZWQgTm9kZShMb2NhdG9yIGxvY2F0aW9uLCBMZWFmIGxlYWYpIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotICAgICAgICB0aGlzLmxlYWYgPSBsZWFmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEl0ZXJhdGVzIGFsbCB0aGUgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIEl0ZXJhdG9yPExlYWY+IGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IEN5Y2xlSXRlcmF0b3IobGVhZik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBoYXMgb25seSBvbmUgY2hpbGQgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNPbmVDaGlsZCgpIHsKLSAgICAgICAgcmV0dXJuIGxlYWY9PWxlYWYuZ2V0TmV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIHtAbGluayBMZWFmfSBhbmQgdGhlaXIgc2libGluZyBhcyBjaGlsZHJlbiBvZiB0aGlzIHtAbGluayBOb2RlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRDaGlsZChMZWFmIGNoaWxkKSB7Ci0gICAgICAgIGlmKHRoaXMubGVhZj09bnVsbCkKLSAgICAgICAgICAgIGxlYWYgPSBjaGlsZDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVhZi5tZXJnZShjaGlsZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvTm9kZVNldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL05vZGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjMzgzOS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvTm9kZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuQ2xhc3NUeXBlOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSkNvZGVNb2RlbDsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KRGVmaW5lZENsYXNzOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpNb2Q7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLk5hbWVVdGlsOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5UeHdPcHRpb25zOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxOYW1lc3BhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogUm9vdCBvZiB0aGUgbW9kZWwuCi0gKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1wdWJsaWMgY2xhc3MgTm9kZVNldCBleHRlbmRzIExpbmtlZEhhc2hTZXQ8V3JpdGVyTm9kZT4gewotCi0gICAgLypwYWNrYWdlKi8gZmluYWwgVHh3T3B0aW9ucyBvcHRzOwotICAgIC8qcGFja2FnZSovIGZpbmFsIEpDb2RlTW9kZWwgY29kZU1vZGVsOwotCi0gICAgLyoqCi0gICAgICogU2V0IG9mIGFsbCB0aGUge0BsaW5rIEVsZW1lbnR9cyB0aGF0IGNhbiBiZSByb290LgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU2V0PEVsZW1lbnQ+IHJvb3RFbGVtZW50cyA9IG5ldyBIYXNoU2V0PEVsZW1lbnQ+KCk7Ci0KLSAgICAvKiogVGhlIG5hbWVzcGFjZSBVUkkgZGVjbGFyZWQgaW4ge0BsaW5rIFhtbE5hbWVzcGFjZX0uICovCi0gICAgLypwYWNrYWdlKi8gZmluYWwgU3RyaW5nIGRlZmF1bHROYW1lc3BhY2U7Ci0KLSAgICBwdWJsaWMgTm9kZVNldChUeHdPcHRpb25zIG9wdHMsIExlYWYgZW50cnkpIHsKLSAgICAgICAgdGhpcy5vcHRzID0gb3B0czsKLSAgICAgICAgdGhpcy5jb2RlTW9kZWwgPSBvcHRzLmNvZGVNb2RlbDsKLSAgICAgICAgYWRkQWxsKGVudHJ5LnNpYmxpbmdzKCkpOwotICAgICAgICBtYXJrUm9vdChlbnRyeS5zaWJsaW5ncygpLHJvb3RFbGVtZW50cyk7Ci0KLSAgICAgICAgLy8gZGVjaWRlIHdoYXQgdG8gcHV0IGluIEBYbWxOYW1lc3BhY2UKLSAgICAgICAgU2V0PFN0cmluZz4gbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciggRWxlbWVudCBlIDogcm9vdEVsZW1lbnRzICkKLSAgICAgICAgICAgIG5zLmFkZChlLm5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAgIGlmKG5zLnNpemUoKSE9MSB8fCBvcHRzLm5vUGFja2FnZU5hbWVzcGFjZSB8fCBvcHRzLl9wYWNrYWdlLmlzVW5uYW1lZCgpKQotICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZSA9IG5zLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgICAgICBvcHRzLl9wYWNrYWdlLmFubm90YXRlKFhtbE5hbWVzcGFjZS5jbGFzcykKLSAgICAgICAgICAgICAgICAucGFyYW0oInZhbHVlIixkZWZhdWx0TmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmtzIGFsbCB0aGUgZWxlbWVudCBjaGlsZHJlbiBhcyByb290LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYXJrUm9vdChJdGVyYWJsZTxMZWFmPiBjLCBTZXQ8RWxlbWVudD4gcm9vdEVsZW1lbnRzKSB7Ci0gICAgICAgIGZvciggTGVhZiBsIDogYyApIHsKLSAgICAgICAgICAgIGlmKCBsIGluc3RhbmNlb2YgRWxlbWVudCApIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudClsOwotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50cy5hZGQoZSk7Ci0gICAgICAgICAgICAgICAgZS5pc1Jvb3QgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIGwgaW5zdGFuY2VvZiBSZWYgKSB7Ci0gICAgICAgICAgICAgICAgbWFya1Jvb3QoKChSZWYpbCkuZGVmLHJvb3RFbGVtZW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPExlYWY+IGMpIHsKLSAgICAgICAgZm9yKCBMZWFmIGwgOiBjICkgewotICAgICAgICAgICAgaWYobCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgaWYoYWRkKChFbGVtZW50KWwpKQotICAgICAgICAgICAgICAgICAgICBhZGRBbGwoKEVsZW1lbnQpbCk7Ci0gICAgICAgICAgICBpZihsIGluc3RhbmNlb2YgR3JhbW1hcikgewotICAgICAgICAgICAgICAgIEdyYW1tYXIgZyA9IChHcmFtbWFyKWw7Ci0gICAgICAgICAgICAgICAgZm9yKCBEZWZpbmUgZCA6IGcuZ2V0RGVmaW5pdGlvbnMoKSApCi0gICAgICAgICAgICAgICAgICAgIGFkZChkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGwgaW5zdGFuY2VvZiBSZWYpIHsKLSAgICAgICAgICAgICAgICBSZWYgciA9IChSZWYpbDsKLSAgICAgICAgICAgICAgICBEZWZpbmUgZGVmID0gci5kZWY7Ci0vLyAgICAgICAgICAgICAgICBpZihkZWYgaW5zdGFuY2VvZiBHcmFtbWFyKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgZm9yKCBEZWZpbmUgZCA6ICgoR3JhbW1hcilkZWYpLmdldERlZmluaXRpb25zKCkgKQotLy8gICAgICAgICAgICAgICAgICAgICAgICBpZihhZGQoZCkpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGwoZCk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkKGRlZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYWRkKERlZmluZSBkZWYpIHsKLSAgICAgICAgYm9vbGVhbiBiID0gc3VwZXIuYWRkKGRlZik7Ci0gICAgICAgIGlmKGIpCi0gICAgICAgICAgICBhZGRBbGwoZGVmKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIDxUIGV4dGVuZHMgV3JpdGVyTm9kZT4gQ29sbGVjdGlvbjxUPiBzdWJzZXQoQ2xhc3M8VD4gdCkgewotICAgICAgICBBcnJheUxpc3Q8VD4gciA9IG5ldyBBcnJheUxpc3Q8VD4oc2l6ZSgpKTsKLSAgICAgICAgZm9yKCBXcml0ZXJOb2RlIG4gOiB0aGlzICkKLSAgICAgICAgICAgIGlmKHQuaXNJbnN0YW5jZShuKSkKLSAgICAgICAgICAgICAgICByLmFkZCgoVCluKTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgY29kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKFR4d09wdGlvbnMgb3B0cykgewotICAgICAgICBmb3IoIFdyaXRlck5vZGUgbiA6IHRoaXMgKQotICAgICAgICAgICAgbi5wcmVwYXJlKHRoaXMpOwotICAgICAgICBmb3IoIFdyaXRlck5vZGUgbiA6IHRoaXMgKQotICAgICAgICAgICAgbi5kZWNsYXJlKHRoaXMpOwotICAgICAgICBmb3IoIFdyaXRlck5vZGUgbiA6IHRoaXMgKQotICAgICAgICAgICAgbi5nZW5lcmF0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKnBhY2thZ2UqLyBmaW5hbCBKRGVmaW5lZENsYXNzIGNyZWF0ZUNsYXNzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gb3B0cy5fcGFja2FnZS5fY2xhc3MoCi0gICAgICAgICAgICAgICAgSk1vZC5QVUJMSUMsIE5hbWVVdGlsLnRvQ2xhc3NOYW1lKG5hbWUpLCBDbGFzc1R5cGUuSU5URVJGQUNFICk7Ci0gICAgICAgIH0gY2F0Y2ggKEpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZm9yKCBpbnQgaT0yOyB0cnVlOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuX3BhY2thZ2UuX2NsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgSk1vZC5QVUJMSUMsIE5hbWVVdGlsLnRvQ2xhc3NOYW1lKG5hbWUrU3RyaW5nLnZhbHVlT2YoaSkpLCBDbGFzc1R5cGUuSU5URVJGQUNFICk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSkNsYXNzQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICA7IC8vIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL1JlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL1JlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzBmMjNjLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9SZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSkRlZmluZWRDbGFzczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcC5Qcm9wOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEEgcmVmZXJlbmNlIHRvIGEgbmFtZWQgcGF0dGVybi4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZWYgZXh0ZW5kcyBMZWFmIHsKLSAgICBwdWJsaWMgZmluYWwgRGVmaW5lIGRlZjsKLQotICAgIHB1YmxpYyBSZWYoTG9jYXRvciBsb2NhdGlvbiwgR3JhbW1hciBzY29wZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotICAgICAgICB0aGlzLmRlZiA9IHNjb3BlLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVmKExvY2F0b3IgbG9jYXRpb24sIERlZmluZSBkZWYpIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotICAgICAgICB0aGlzLmRlZiA9IGRlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lubGluZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZi5pc0lubGluZSgpOwotICAgIH0KLQotICAgIHZvaWQgZ2VuZXJhdGUoSkRlZmluZWRDbGFzcyBjbGF6eiwgTm9kZVNldCBuc2V0LCBTZXQ8UHJvcD4gcHJvcHMpIHsKLSAgICAgICAgZGVmLmdlbmVyYXRlKGNsYXp6LG5zZXQscHJvcHMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9UZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2FjMDc1Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9UZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbDsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpUeXBlOwotCi0vKioKLSAqIEltcGxlbWVudGVkIGJ5IHtAbGluayBMZWFmfXMgdGhhdCBtYXAgdG8gUENEQVRBIGluIFhNTC4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dCB7Ci0gICAgLyoqCi0gICAgICogT2J0YWlucyB0aGUgSmF2YSBjbGFzcyBvZiB0aGlzIHtAbGluayBUZXh0fS4KLSAgICAgKi8KLSAgICBKVHlwZSBnZXREYXRhdHlwZShOb2RlU2V0IG5zZXQpOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL1ZhbHVlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkOGJkNC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSkRlZmluZWRDbGFzczsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KVHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcC5Qcm9wOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEEgY29uc3RhbnQgdmFsdWUuCi0gKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1wdWJsaWMgY2xhc3MgVmFsdWUgZXh0ZW5kcyBMZWFmIGltcGxlbWVudHMgVGV4dCB7Ci0gICAgLyoqCi0gICAgICogVGhlIHVuZGVybHlpbmcgZGF0YXR5cGUsIGluIGNhc2UKLSAgICAgKiB3ZSBuZWVkIHRvIHJldmVydCB0byB7QGxpbmsgRGF0YX0uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIEpUeXBlIHR5cGU7Ci0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgVmFsdWUoTG9jYXRvciBsb2NhdGlvbiwgSlR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24pOwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHZvaWQgZ2VuZXJhdGUoSkRlZmluZWRDbGFzcyBjbGF6eiwgTm9kZVNldCBuc2V0LCBTZXQ8UHJvcD4gcHJvcHMpIHsKLSAgICAgICAgY3JlYXRlRGF0YU1ldGhvZChjbGF6eix0eXBlLG5zZXQscHJvcHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBKVHlwZSBnZXREYXRhdHlwZShOb2RlU2V0IG5zZXQpIHsKLSAgICAgICAgLy8gVE9ETzogZW51bSBzdXBwb3J0Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9Xcml0ZXJOb2RlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvV3JpdGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2YxNzYyLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9Xcml0ZXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci0KLS8qKgotICogVGhlIHtAbGluayBOb2RlfSB0aGF0IG1hcHMgdG8gdGhlIHByb2dyYW0gZWxlbWVudC4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXcml0ZXJOb2RlIGV4dGVuZHMgTm9kZSB7Ci0gICAgLyoqCi0gICAgICogSWYgdGhpcyBub2RlIGlzIHRoZSBzb2xlIGNoaWxkIG9mIGEgcGF0dGVybiBibG9jaywKLSAgICAgKiB0aGlzIGZpZWxkIHBvaW50cyB0byBpdHMgbmFtZS4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhlIGVsZW1lbnQgbmFtZXMgYXJlIGluIGNvbmZsaWN0LCB0aGlzIGNhbiBiZSB1c2VkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVOYW1lOwotCi0gICAgcHVibGljIFdyaXRlck5vZGUoTG9jYXRvciBsb2NhdGlvbiwgTGVhZiBsZWFmKSB7Ci0gICAgICAgIHN1cGVyKGxvY2F0aW9uLCBsZWFmKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNsYXJlcyB0aGUgY2xhc3Mgd2l0aG91dCBpdHMgY29udGVudHMuCi0gICAgICoKLSAgICAgKiBUaGUgZmlyc3Qgc3RlcCBvZiB0aGUgY29kZSBnZW5lcmF0aW9uLgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgZGVjbGFyZShOb2RlU2V0IG5zZXQpOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBjb250ZW50cy4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlKE5vZGVTZXQgbnNldCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmVwYXJlcyBmb3IgdGhlIGNvZGUgZ2VuZXJhdGlvbi4KLSAgICAgKi8KLSAgICB2b2lkIHByZXBhcmUoTm9kZVNldCBuc2V0KSB7fQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL1htbE5vZGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9YbWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYmY5NjEuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL1htbE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogRWl0aGVyIGFuIHtAbGluayBFbGVtZW50fSBvciB7QGxpbmsgQXR0cmlidXRlfS4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxOb2RlIGV4dGVuZHMgV3JpdGVyTm9kZSB7Ci0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgYXR0cmlidXRlL2VsZW1lbnQuCi0gICAgICoKLSAgICAgKiBJbiBUWFcsIHdlIGlnbm9yZSBhbGwgaW5maW5pdGUgbmFtZXMuCi0gICAgICogKGZpbml0ZSBuYW1lIGNsYXNzIHdpbGwgYmUgZXhwYW5kZWQgdG8gYSBsaXN0IG9mIHtAbGluayBYbWxOb2RlfXMuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFFOYW1lIG5hbWU7Ci0KLSAgICBwcm90ZWN0ZWQgWG1sTm9kZShMb2NhdG9yIGxvY2F0aW9uLCBRTmFtZSBuYW1lLCBMZWFmIGxlYWYpIHsKLSAgICAgICAgc3VwZXIobG9jYXRpb24sIGxlYWYpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4cGFuZCBhbGwgcmVmcyBhbmQgY29sbGVjdCBhbGwgY2hpbGRyZW4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFNldDxMZWFmPiBjb2xsZWN0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIFNldDxMZWFmPiByZXN1bHQgPSBuZXcgSGFzaFNldDxMZWFmPigpOwotCi0gICAgICAgIFN0YWNrPE5vZGU+IHdvcmsgPSBuZXcgU3RhY2s8Tm9kZT4oKTsKLSAgICAgICAgd29yay5wdXNoKHRoaXMpOwotCi0gICAgICAgIHdoaWxlKCF3b3JrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yKCBMZWFmIGwgOiB3b3JrLnBvcCgpICkgewotICAgICAgICAgICAgICAgIGlmKCBsIGluc3RhbmNlb2YgUmVmICkgewotICAgICAgICAgICAgICAgICAgICB3b3JrLnB1c2goICgoUmVmKWwpLmRlZiApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvcHJvcC9BdHRyaWJ1dGVQcm9wLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvcHJvcC9BdHRyaWJ1dGVQcm9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzJmZTguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL3Byb3AvQXR0cmlidXRlUHJvcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcDsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdHRyaWJ1dGVQcm9wIGV4dGVuZHMgWG1sSXRlbVByb3AgewotICAgIHB1YmxpYyBBdHRyaWJ1dGVQcm9wKFFOYW1lIG5hbWUsIEpUeXBlIHZhbHVlVHlwZSkgewotICAgICAgICBzdXBlcihuYW1lLCB2YWx1ZVR5cGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9wcm9wL0VsZW1lbnRQcm9wLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvcHJvcC9FbGVtZW50UHJvcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjBiZDM0Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9wcm9wL0VsZW1lbnRQcm9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5wcm9wOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSlR5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFByb3BlcnR5IGdlbmVyYXRlZCBmcm9tIGVsZW1lbnRzLgotICoKLSAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVsZW1lbnRQcm9wIGV4dGVuZHMgWG1sSXRlbVByb3AgewotICAgIHB1YmxpYyBFbGVtZW50UHJvcChRTmFtZSBuYW1lLCBKVHlwZSB2YWx1ZVR5cGUpIHsKLSAgICAgICAgc3VwZXIobmFtZSwgdmFsdWVUeXBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvcHJvcC9MZWFmRWxlbWVudFByb3AuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9wcm9wL0xlYWZFbGVtZW50UHJvcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2QyYjg4Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9wcm9wL0xlYWZFbGVtZW50UHJvcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcDsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMZWFmRWxlbWVudFByb3AgZXh0ZW5kcyBYbWxJdGVtUHJvcCB7Ci0gICAgcHVibGljIExlYWZFbGVtZW50UHJvcChRTmFtZSBuYW1lLCBKVHlwZSB2YWx1ZVR5cGUpIHsKLSAgICAgICAgc3VwZXIobmFtZSwgdmFsdWVUeXBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvcHJvcC9Qcm9wLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3R4dzIvbW9kZWwvcHJvcC9Qcm9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NmFjNmYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL3Byb3AvUHJvcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnR4dzIubW9kZWwucHJvcDsKLQotLyoqCi0gKiBJbW11dGFibGUgb2JqZWN0IHRoYXQgY2FwdHVyZXMgdGhlIGNoYXJhY3RlcnN0aWMKLSAqIG9mIHRoZSBnZW5lcmF0ZWQgd3JpdGVyIG1ldGhvZC4KLSAqCi0gKiA8cD4KLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGltcGxlbWVudCB7QGxpbmsgI2VxdWFscyhPYmplY3QpfQotICogYW5kIHtAbGluayAjaGFzaENvZGUoKX0uIEJ5IHVzaW5nIHRoZXNlIHdlIGF2b2lkIGdlbmVyYXRpbmcKLSAqIHRoZSBzYW1lIG1ldGhvZCB0d2ljZS4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wIHsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9wcm9wL1ZhbHVlUHJvcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL3Byb3AvVmFsdWVQcm9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzE3YzUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL3Byb3AvVmFsdWVQcm9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwudHh3Mi5tb2RlbC5wcm9wOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuSlR5cGU7Ci0KLS8qKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVQcm9wIGV4dGVuZHMgUHJvcCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKVHlwZSB0eXBlOwotCi0gICAgcHVibGljIFZhbHVlUHJvcChKVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBWYWx1ZVByb3ApKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZmluYWwgVmFsdWVQcm9wIHRoYXQgPSAoVmFsdWVQcm9wKSBvOwotCi0gICAgICAgIHJldHVybiB0eXBlLmVxdWFscyh0aGF0LnR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL3Byb3AvWG1sSXRlbVByb3AuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvdHh3Mi9tb2RlbC9wcm9wL1htbEl0ZW1Qcm9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDJhNWUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC90eHcyL21vZGVsL3Byb3AvWG1sSXRlbVByb3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC50eHcyLm1vZGVsLnByb3A7Ci0KLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5KVHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQ29tbW9uIGltcGxlbWVudGF0aW9uIGJldHdlZW4gZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCi0gKgotICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQotICovCi1hYnN0cmFjdCBjbGFzcyBYbWxJdGVtUHJvcCBleHRlbmRzIFByb3AgewotICAgIHByaXZhdGUgZmluYWwgUU5hbWUgbmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEpUeXBlIHR5cGU7Ci0KLSAgICBwdWJsaWMgWG1sSXRlbVByb3AoUU5hbWUgbmFtZSwgSlR5cGUgdmFsdWVUeXBlKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMudHlwZSA9IHZhbHVlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKHRoaXMuZ2V0Q2xhc3MoKSE9by5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgWG1sSXRlbVByb3AgdGhhdCA9IChYbWxJdGVtUHJvcClvOwotCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWUuZXF1YWxzKHRoYXQubmFtZSkKLSAgICAgICAgICAgICYmIHRoaXMudHlwZS5lcXVhbHModGhhdC50eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSgpKjI5ICsgdHlwZS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvSW52b2tlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9JbnZva2VyLmphdmEKaW5kZXggZDJlZGNhOC4uNmY1MzQ0NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9JbnZva2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9JbnZva2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTMgKzI1LDI1IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53czsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS51dGlsLkFQVENsYXNzTG9hZGVyOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLnRvb2xzLk1hc2tpbmdDbGFzc0xvYWRlcjsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC50b29scy5QYXJhbGxlbFdvcmxkQ2xhc3NMb2FkZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuV3Njb21waWxlTWVzc2FnZXM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLnV0aWwuVG9vbHNKYXJOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnV0aWwuV2hpY2g7CiAKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7CitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqIEludm9rZXMgSkFYLVdTIHRvb2xzIGluIGEgc3BlY2lhbCBjbGFzcyBsb2FkZXIgdGhhdCBjYW4gcGljayB1cCBBUFQgY2xhc3NlcywKQEAgLTM5LDQwICs1MSwxNzMgQEAKICAqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCiAgKi8KLWZpbmFsIGNsYXNzIEludm9rZXIgewotICAgIC8qKgotICAgICAqIExpc3Qgb2YgcGFja2FnZXMgdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBpbiB7QGxpbmsgQVBUQ2xhc3NMb2FkZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHByZWZpeGVzID0gewotICAgICAgICAiY29tLnN1bi50b29scy5pbnRlcm5hbC5qeGMuIiwKLSAgICAgICAgImNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLiIsCi0gICAgICAgICJjb20uc3VuLnRvb2xzLmFwdC4iLAotICAgICAgICAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy4iLAotICAgICAgICAiY29tLnN1bi50b29scy5qYXZhYy4iLAotICAgICAgICAiY29tLnN1bi50b29scy5qYXZhZG9jLiIsCi0gICAgICAgICJjb20uc3VuLm1pcnJvci4iCi0gICAgfTsKK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnZva2VyIHsKKyAgICBzdGF0aWMgaW50IGludm9rZShTdHJpbmcgbWFpbkNsYXNzLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gdXNlIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IHByb3h5IGlmIGF2YWlsYWJsZS4KKyAgICAgICAgLy8gc2VlIHN1bi5uZXQuc3BpLkRlZmF1bHRQcm94eVNlbGVjdG9yIGZvciBkZXRhaWxzLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLm5ldC51c2VTeXN0ZW1Qcm94aWVzIiwidHJ1ZSIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBmYWlsaW5nIHRvIHNldCB0aGlzIHByb3BlcnR5IGlzbid0IGZhdGFsCisgICAgICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHRvb2xOYW1lLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgQ2xhc3NMb2FkZXIgb2xkY2MgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgQVBUQ2xhc3NMb2FkZXIgY2wgPSBuZXcgQVBUQ2xhc3NMb2FkZXIoSW52b2tlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLHByZWZpeGVzKTsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gSW52b2tlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgaWYoQXJyYXlzLmFzTGlzdChhcmdzKS5jb250YWlucygiLVhlbmRvcnNlZCIpKQorICAgICAgICAgICAgICAgIGNsID0gY3JlYXRlQ2xhc3NMb2FkZXIoY2wpOyAvLyBwZXJmb3JtIEpESzYgd29ya2Fyb3VuZCBoYWNrCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZighY2hlY2tJZkxvYWRpbmcyMUFQSSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKFNlcnZpY2UuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKT09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihXc2NvbXBpbGVNZXNzYWdlcy5JTlZPS0VSX05FRURfRU5ET1JTRUQoKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihXc2NvbXBpbGVNZXNzYWdlcy5XUkFQUEVSX1RBU0tfTE9BRElOR18yMF9BUEkoV2hpY2gud2hpY2goU2VydmljZS5jbGFzcykpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL2ZpbmQgYW5kIGxvYWQgdG9vbHMuamFyCisgICAgICAgICAgICAgICAgTGlzdDxVUkw+IHVybHMgPSBuZXcgQXJyYXlMaXN0PFVSTD4oKTsKKyAgICAgICAgICAgICAgICBmaW5kVG9vbHNKYXIoY2wsIHVybHMpOworCisgICAgICAgICAgICAgICAgaWYodXJscy5zaXplKCkgPiAwKXsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG1hc2sgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChtYXNrZWRQYWNrYWdlcykpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBhIHByb3RlY3RlZCBhcmVhIHNvIHRoYXQgd2UgbG9hZCBKQVhCL1dTIDIuMSBBUEkKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGV2ZXJ5dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHRoZW0gaW5zaWRlCisgICAgICAgICAgICAgICAgICAgIGNsID0gbmV3IE1hc2tpbmdDbGFzc0xvYWRlcihjbCxtYXNrKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoaXMgY2xhc3Nsb2FkZXIgbG9hZHMgdGhlIEFQSSBhbmQgdG9vbHMuamFyCisgICAgICAgICAgICAgICAgICAgIGNsID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSksIGNsKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IGxvYWQgdGhlIHJlc3Qgb2YgdGhlIFJJLiBUaGUgYWN0dWFsIGNsYXNzIGZpbGVzIGFyZSBsb2FkZWQgZnJvbSBhbmNlc3RvcnMKKyAgICAgICAgICAgICAgICAgICAgY2wgPSBuZXcgUGFyYWxsZWxXb3JsZENsYXNzTG9hZGVyKGNsLCIiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2wpOwogCi0gICAgICAgICAgICBDbGFzcyBjb21waWxlVG9vbCA9IGNsLmxvYWRDbGFzcygiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuQ29tcGlsZVRvb2wiKTsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGN0b3IgPSBjb21waWxlVG9vbC5nZXRDb25zdHJ1Y3RvcihPdXRwdXRTdHJlYW0uY2xhc3MsU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIE9iamVjdCB0b29sID0gY3Rvci5uZXdJbnN0YW5jZShTeXN0ZW0ub3V0LHRvb2xOYW1lKTsKKyAgICAgICAgICAgIENsYXNzIGNvbXBpbGVUb29sID0gY2wubG9hZENsYXNzKG1haW5DbGFzcyk7CisgICAgICAgICAgICBDb25zdHJ1Y3RvciBjdG9yID0gY29tcGlsZVRvb2wuZ2V0Q29uc3RydWN0b3IoT3V0cHV0U3RyZWFtLmNsYXNzKTsKKyAgICAgICAgICAgIE9iamVjdCB0b29sID0gY3Rvci5uZXdJbnN0YW5jZShTeXN0ZW0ub3V0KTsKICAgICAgICAgICAgIE1ldGhvZCBydW5NZXRob2QgPSBjb21waWxlVG9vbC5nZXRNZXRob2QoInJ1biIsU3RyaW5nW10uY2xhc3MpOwogICAgICAgICAgICAgYm9vbGVhbiByID0gKEJvb2xlYW4pcnVuTWV0aG9kLmludm9rZSh0b29sLG5ldyBPYmplY3RbXXthcmdzfSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdChyID8gMCA6IDEpOworICAgICAgICAgICAgcmV0dXJuIHIgPyAwIDogMTsKICAgICAgICAgfSBjYXRjaCAoVG9vbHNKYXJOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfWZpbmFsbHkgewogICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob2xkY2MpOwogICAgICAgICB9CiAKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFJJIGFwcGVhcnMgdG8gYmUgbG9hZGluZyB0aGUgSkFYLVdTIDIuMSBBUEkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrSWZMb2FkaW5nMjFBUEkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXJ2aWNlLmNsYXNzLmdldE1ldGhvZCgiZ2V0UG9ydCIsQ2xhc3MuY2xhc3MsIFdlYlNlcnZpY2VGZWF0dXJlW10uY2xhc3MpOworICAgICAgICAgICAgLy8geXVwLiB0aGluZ3MgbG9vayBnb29kLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKExpbmthZ2VFcnJvciBlKSB7CisgICAgICAgIH0KKyAgICAgICAgLy8gbm9wZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNsYXNzbG9hZGVyIHRoYXQgY2FuIGxvYWQgSkFYQi9XUyAyLjEgQVBJIGFuZCB0b29scy5qYXIsCisgICAgICogYW5kIHRoZW4gcmV0dXJuIGEgY2xhc3Nsb2FkZXIgdGhhdCBjYW4gUkkgY2xhc3Nlcywgd2hpY2ggY2FuIHNlZSBhbGwgdGhvc2UgQVBJcyBhbmQgdG9vbHMuamFyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgY3JlYXRlQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2wpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFRvb2xzSmFyTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFVSTFtdIHVybHMgPSBmaW5kSXN0YWNrQVBJcyhjbCk7CisgICAgICAgIGlmKHVybHMubGVuZ3RoPT0wKQorICAgICAgICAgICAgcmV0dXJuIGNsOyAgLy8gd2Ugc2VlbSB0byBiZSBhYmxlIHRvIGxvYWQgZXZlcnl0aGluZyBhbHJlYWR5LiBubyBuZWVkIGZvciB0aGUgaGFjaworCisgICAgICAgIExpc3Q8U3RyaW5nPiBtYXNrID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobWFza2VkUGFja2FnZXMpKTsKKyAgICAgICAgaWYodXJscy5sZW5ndGg+MSkgeworICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBsb2FkIDIuMSBBUEkgZnJvbSBzaWRlLiBzbyBhZGQgdGhlbSB0byB0aGUgbWFzaworICAgICAgICAgICAgbWFzay5hZGQoImphdmF4LnhtbC5iaW5kLiIpOworICAgICAgICAgICAgbWFzay5hZGQoImphdmF4LnhtbC53cy4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBhIHByb3RlY3RlZCBhcmVhIHNvIHRoYXQgd2UgbG9hZCBKQVhCL1dTIDIuMSBBUEkKKyAgICAgICAgLy8gYW5kIGV2ZXJ5dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHRoZW0gaW5zaWRlCisgICAgICAgIGNsID0gbmV3IE1hc2tpbmdDbGFzc0xvYWRlcihjbCxtYXNrKTsKKworICAgICAgICAvLyB0aGVuIHRoaXMgY2xhc3Nsb2FkZXIgbG9hZHMgdGhlIEFQSSBhbmQgdG9vbHMuamFyCisgICAgICAgIGNsID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMsIGNsKTsKKworICAgICAgICAvLyBmaW5hbGx5IGxvYWQgdGhlIHJlc3Qgb2YgdGhlIFJJLiBUaGUgYWN0dWFsIGNsYXNzIGZpbGVzIGFyZSBsb2FkZWQgZnJvbSBhbmNlc3RvcnMKKyAgICAgICAgY2wgPSBuZXcgUGFyYWxsZWxXb3JsZENsYXNzTG9hZGVyKGNsLCIiKTsKKworICAgICAgICByZXR1cm4gY2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNsYXNzbG9hZGVyIGZvciBsb2FkaW5nIEpBWEIvV1MgMi4xIGphciBhbmQgdG9vbHMuamFyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJMW10gZmluZElzdGFja0FQSXMoQ2xhc3NMb2FkZXIgY2wpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFRvb2xzSmFyTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBMaXN0PFVSTD4gdXJscyA9IG5ldyBBcnJheUxpc3Q8VVJMPigpOworCisgICAgICAgIGlmKFNlcnZpY2UuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKT09bnVsbCkgeworICAgICAgICAgICAgLy8gSkFYLVdTIEFQSSBpcyBsb2FkZWQgZnJvbSBib290c3RyYXAgY2xhc3Nsb2FkZXIKKyAgICAgICAgICAgIFVSTCByZXMgPSBjbC5nZXRSZXNvdXJjZSgiamF2YXgveG1sL3dzL0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzIik7CisgICAgICAgICAgICBpZihyZXM9PW51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oIlRoZXJlJ3Mgbm8gSkFYLVdTIDIuMSBBUEkgaW4gdGhlIGNsYXNzcGF0aCIpOworICAgICAgICAgICAgdXJscy5hZGQoUGFyYWxsZWxXb3JsZENsYXNzTG9hZGVyLnRvSmFyVXJsKHJlcykpOworCisgICAgICAgICAgICByZXMgPSBjbC5nZXRSZXNvdXJjZSgiamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxTZWVBbHNvLmNsYXNzIik7CisgICAgICAgICAgICBpZihyZXM9PW51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oIlRoZXJlJ3Mgbm8gSkFYQiAyLjEgQVBJIGluIHRoZSBjbGFzc3BhdGgiKTsKKyAgICAgICAgICAgIHVybHMuYWRkKFBhcmFsbGVsV29ybGRDbGFzc0xvYWRlci50b0phclVybChyZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmRUb29sc0phcihjbCwgdXJscyk7CisKKyAgICAgICAgcmV0dXJuIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kVG9vbHNKYXIoQ2xhc3NMb2FkZXIgY2wsIExpc3Q8VVJMPiB1cmxzKSB0aHJvd3MgVG9vbHNKYXJOb3RGb3VuZEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImNvbS5zdW4udG9vbHMuamF2YWMuTWFpbiIsZmFsc2UsY2wpOworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiY29tLnN1bi50b29scy5hcHQuTWFpbiIsZmFsc2UsY2wpOworICAgICAgICAgICAgLy8gd2UgY2FuIGFscmVhZHkgbG9hZCB0aGVtIGluIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyLgorICAgICAgICAgICAgLy8gc28gbm8gbmVlZCB0byBsb29rIGZvciB0b29scy5qYXIuCisgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgd2hlbiB3ZSBhcmUgcnVuIGluc2lkZSBJREUvQW50LCBvcgorICAgICAgICAgICAgLy8gaW4gTWFjIE9TLgorICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0cnkgdG8gZmluZCB0b29scy5qYXIKKyAgICAgICAgICAgIEZpbGUganJlSG9tZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikpOworICAgICAgICAgICAgRmlsZSB0b29sc0phciA9IG5ldyBGaWxlKCBqcmVIb21lLmdldFBhcmVudCgpLCAibGliL3Rvb2xzLmphciIgKTsKKworICAgICAgICAgICAgaWYgKCF0b29sc0phci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUb29sc0phck5vdEZvdW5kRXhjZXB0aW9uKHRvb2xzSmFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVybHMuYWRkKHRvb2xzSmFyLnRvVVJMKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgcGFja2FnZSBwcmVmaXhlcyB3ZSB3YW50IHRoZQorICAgICAqIHtAbGluayBNYXNraW5nQ2xhc3NMb2FkZXJ9IHRvIHByZXZlbnQgdGhlIHBhcmVudAorICAgICAqIGNsYXNzTG9hZGVyIGZyb20gbG9hZGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gbWFza2VkUGFja2FnZXMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICJjb20uc3VuLmlzdGFjay5pbnRlcm5hbC50b29scy4iLAorICAgICAgICAiY29tLnN1bi50b29scy5pbnRlcm5hbC5qeGMuIiwKKyAgICAgICAgImNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLiIsCisgICAgICAgICJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLiIsCisgICAgICAgICJjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC4iLAorICAgICAgICAiY29tLnN1bi5yZWxheG5nLiIsCisgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLiIsCisgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLiIsCisgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4iCisgICAgfTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvVG9vbFZlcnNpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvVG9vbFZlcnNpb24uamF2YQppbmRleCBmYTNjNTEzLi43ZDVhYTMyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL1Rvb2xWZXJzaW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9Ub29sVmVyc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvV3NHZW4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvV3NHZW4uamF2YQppbmRleCA3ZjZmYzFlLi5hNGIzZGU1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL1dzR2VuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9Xc0dlbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDEyICsyNCwzNyBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3M7CiAKLS8qKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqLworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLldzZ2VuVG9vbDsKIAorLyoqCisgKiBXc0dlbiB0b29sIGVudHJ5IHBvaW50LgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KIHB1YmxpYyBjbGFzcyBXc0dlbiB7CisgICAgLyoqCisgICAgICogQ0xJIGVudHJ5IHBvaW50LiBVc2Uge0BsaW5rIEludm9rZXJ9IHRvCisgICAgICogbG9hZCB0b29scy5qYXIKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSW52b2tlci5tYWluKCJ3c2dlbiIsYXJncyk7CisgICAgICAgIFN5c3RlbS5leGl0KEludm9rZXIuaW52b2tlKCJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5Xc2dlblRvb2wiLCBhcmdzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW50cnkgcG9pbnQgZm9yIHRvb2wgaW50ZWdyYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGRvZXMgdGhlIHNhbWUgYXMge0BsaW5rICNtYWluKFN0cmluZ1tdKX0gZXhjZXB0CisgICAgICogaXQgZG9lc24ndCBpbnZva2Uge0BsaW5rIFN5c3RlbSNleGl0KGludCl9LiBUaGlzIG1ldGhvZAorICAgICAqIGFsc28gZG9lc24ndCBwbGF5IHdpdGggY2xhc3Nsb2FkZXJzLiBJdCdzIHRoZSBjYWxsZXIncworICAgICAqIHJlc3BvbnNpYmlsaXR5IHRvIHNldCB1cCB0aGUgY2xhc3Nsb2FkZXIgdG8gbG9hZCBhbGwgamFycworICAgICAqIG5lZWRlZCB0byBydW4gdGhlIHRvb2wsIGluY2x1ZGluZyA8dHQ+JEpBVkFfSE9NRS9saWIvdG9vbHMuamFyPC90dD4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIDAgaWYgdGhlIHRvb2wgcnVucyBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZG9NYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZXR1cm4gbmV3IFdzZ2VuVG9vbChTeXN0ZW0ub3V0KS5ydW4oYXJncykgPyAwIDogMTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL1dzSW1wb3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL1dzSW1wb3J0LmphdmEKaW5kZXggOThiZTI5OC4uOTRmZDJhOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9Xc0ltcG9ydC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvV3NJbXBvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxMiArMjQsMzcgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzOwogCi0vKioKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKi8KK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5Xc2ltcG9ydFRvb2w7CiAKKy8qKgorICogV3NJbXBvcnQgdG9vbCBlbnRyeSBwb2ludC4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCiBwdWJsaWMgY2xhc3MgV3NJbXBvcnQgeworICAgIC8qKgorICAgICAqIENMSSBlbnRyeSBwb2ludC4gVXNlIHtAbGluayBJbnZva2VyfSB0bworICAgICAqIGxvYWQgdG9vbHMuamFyCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIEludm9rZXIubWFpbigid3NpbXBvcnQiLGFyZ3MpOworICAgICAgICBTeXN0ZW0uZXhpdChJbnZva2VyLmludm9rZSgiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRUb29sIiwgYXJncykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudHJ5IHBvaW50IGZvciB0b29sIGludGVncmF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBkb2VzIHRoZSBzYW1lIGFzIHtAbGluayAjbWFpbihTdHJpbmdbXSl9IGV4Y2VwdAorICAgICAqIGl0IGRvZXNuJ3QgaW52b2tlIHtAbGluayBTeXN0ZW0jZXhpdChpbnQpfS4gVGhpcyBtZXRob2QKKyAgICAgKiBhbHNvIGRvZXNuJ3QgcGxheSB3aXRoIGNsYXNzbG9hZGVycy4gSXQncyB0aGUgY2FsbGVyJ3MKKyAgICAgKiByZXNwb25zaWJpbGl0eSB0byBzZXQgdXAgdGhlIGNsYXNzbG9hZGVyIHRvIGxvYWQgYWxsIGphcnMKKyAgICAgKiBuZWVkZWQgdG8gcnVuIHRoZSB0b29sLCBpbmNsdWRpbmcgPHR0PiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphcjwvdHQ+CisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICAwIGlmIHRoZSB0b29sIHJ1bnMgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGRvTWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXc2ltcG9ydFRvb2woU3lzdGVtLm91dCkucnVuKGFyZ3MpID8gMCA6IDE7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9hcGkvVEphdmFHZW5lcmF0b3JFeHRlbnNpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvYXBpL1RKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljMmZmMwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvYXBpL1RKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpOworCitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSk1ldGhvZDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5KYXZhR2VuZXJhdG9yRXh0ZW5zaW9uRmFjYWRlOworCisvKioKKyAqIFByb3ZpZGVzIEphdmEgU0VJIENvZGUgZ2VuZXJhdGlvbiBFeHRlbnNpYmxpdHkgbWVjaGFuaXNtLgorICoKKyAqIEBzZWUgSmF2YUdlbmVyYXRvckV4dGVuc2lvbkZhY2FkZQorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byB3cml0ZSBhbm5vdGF0aW9ucyBvbiB7QGxpbmsgSk1ldGhvZH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3NkbE9wZXJhdGlvbiBub24tbnVsbCB3c2RsIGV4dGVuc2libGl0eSBlbGVtZW50IC0gIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24uCisgICAgICogQHBhcmFtIGpNZXRob2Qgbm9uLW51bGwge0BsaW5rIEpNZXRob2R9CisgICAgICovCisgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlTWV0aG9kQW5ub3RhdGlvbnMoVFdTRExPcGVyYXRpb24gd3NkbE9wZXJhdGlvbiwgSk1ldGhvZCBqTWV0aG9kKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvYXBpL3dzZGwvVFdTRExFeHRlbnNpYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL2FwaS93c2RsL1RXU0RMRXh0ZW5zaWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWJlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL2FwaS93c2RsL1RXU0RMRXh0ZW5zaWJsZS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsOworCisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIEEgV1NETCBlbGVtZW50IG9yIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSBleHRlbmRlZC4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFRXU0RMRXh0ZW5zaWJsZSB7CisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIHdzZGwgZXh0ZW5zaWJsaXR5IGVsZW1lbnQncyBuYW1lIGF0dHJpYnV0ZSB2YWx1ZS4gSXQgY2FuIGJlIG51bGwgYXMgQG5hbWUgb24gc29tZSBvZiB0aGUgd3NkbAorICAgICAqIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgYXJlIG9wdGluYWwgc3VjaCBhcyB3c2RsOmlucHV0CisgICAgICovCisgICAgU3RyaW5nIGdldE5hbWVWYWx1ZSgpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgbmFtZXNwYWNlIFVSSSBvZiBhIHdzZGwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgorICAgICAqLworICAgIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBXU0RMIGVsZW1lbnQgb3IgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgbmFtZQorICAgICAqLworICAgIFFOYW1lIGdldFdTRExFbGVtZW50TmFtZSgpOworCisgICAgLyoqCisgICAgICogQW4ge0BsaW5rIFRXU0RMRXh0ZW5zaW9uSGFuZGxlcn0gd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIGFkZCBhbiB7QGxpbmsgVFdTRExFeHRlbnNpb259IG9iamVjdAorICAgICAqCisgICAgICogQHBhcmFtIGUgbm9uLW51bGwgZXh0ZW5zaW9uIG9iamVjdAorICAgICAqLworICAgIHZvaWQgYWRkRXh0ZW5zaW9uKFRXU0RMRXh0ZW5zaW9uIGUpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgaXRlcmF0b3Igb3ZlciB7QGxpbmsgVFdTRExFeHRlbnNpb259cworICAgICAqLworICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUV1NETEV4dGVuc2lvbj4gZXh0ZW5zaW9ucygpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIHBhcmVudCBvZiBhIHdzZGwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgorICAgICAqIDxwcmU+CisgICAgICogRm9yIGV4YW1wbGUsCisgICAgICoKKyAgICAgKiAgICAgPHdzZGw6cG9ydFR5cGU+CisgICAgICogICAgICAgICA8d3NkbDpvcGVyYXRpb24+CisgICAgICogICAgIC4uLgorICAgICAqIEhlcmUsIHRoZSB7QGxpbmsgVFdTRExFeHRlbnNpYmxlfXJlcHJlc2VudGluZyB3c2RsOm9wZXJhdGlvbidzIHBhcmVudCB3b3VsZCBiZSB3c2RsOnBvcnRUeXBlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHtAbGluayBUV1NETEV4dGVuc2libGV9IGhhcyBubyBwYXJlbnQsIHJvb3Qgb2Ygd3NkbCBkb2N1bWVudCAtIHdzZGw6ZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBUV1NETEV4dGVuc2libGUgZ2V0UGFyZW50KCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL2FwaS93c2RsL1RXU0RMRXh0ZW5zaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL2FwaS93c2RsL1RXU0RMRXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwOWIzMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvYXBpL3dzZGwvVFdTRExFeHRlbnNpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbDsKKworLyoqCisgKiBBIFdTREwgZXh0ZW5zaW9uCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGludGVyZmFjZSBUV1NETEV4dGVuc2lvbiB7CisgICAgLyoqCisgICAgICogR2l2ZXMgUGFyZW50IHtAbGluayBUV1NETEV4dGVuc2libGV9IGVsZW1lbnQKKyAgICAgKi8KKyAgICBUV1NETEV4dGVuc2libGUgZ2V0UGFyZW50KCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL2FwaS93c2RsL1RXU0RMRXh0ZW5zaW9uSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9hcGkvd3NkbC9UV1NETEV4dGVuc2lvbkhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdmZTkzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9hcGkvd3NkbC9UV1NETEV4dGVuc2lvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGw7CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETENvbnN0YW50czsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEpBWFdTIFdTREwgcGFyc2VyIHtAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyLldTRExQYXJzZXJ9IHdpbGwgY2FsbCBhbiB7QGxpbmsgVFdTRExFeHRlbnNpb25IYW5kbGVyfSByZWdpc3RlcmVkCisgKiB3aXRoIGl0IGZvciB0aGUgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXRzIG5vdCBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIFdTREwgMS4xIHNwZWMsIHN1Y2ggYXMgU09BUCBvciBNSU1FLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUV1NETEV4dGVuc2lvbkhhbmRsZXIgeworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBuYW1lc3BhY2Ugb2YgYW4gZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgorICAgICAqIDxwLz4KKyAgICAgKiBGb3IgZXhhbXBsZSBhIHNvYXAgMS4xIFhYRXh0ZW5zaW9uSGFuZGxlciB3b3VsZCByZXR1cm4gPGNvZGU+IiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbnRlcmZhY2UgaXMgY2FsbGVkIGR1cmluZyBXU0RMIHBhcnNpbmcgb24gZGV0ZWN0aW5nIGFueSB3c2RsIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFBhcnNlciBjb250ZXh0IHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gYnkgdGhlIHdzZGwgcGFyc2VyCisgICAgICogQHBhcmFtIHBhcmVudCAgVGhlIFBhcmVudCBlbGVtZW50IHdpdGhpbiB3aGljaCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIGRlZmluZWQKKyAgICAgKiBAcGFyYW0gZSAgICAgICBUaGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW5ldAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgd2FzIHNvbWUgZXJyb3IgZHVyaW5nIHRoZSBleHRlbnNpb24gaGFuZGxpbmcgb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4gSWYgcmV0dXJuZWQgZmFsc2UKKyAgICAgKiAgICAgICAgIHRoZW4gdGhlIFdTREwgcGFyc2VyIGNhbiBhYm9ydCBpZiB0aGUgd3NkbCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaGFkIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkb0hhbmRsZUV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgIGlmIChwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfREVGSU5JVElPTlMpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlRGVmaW5pdGlvbnNFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfVFlQRVMpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHlwZXNFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfUE9SVF9UWVBFKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBvcnRUeXBlRXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7CisgICAgICAgIH0gZWxzZSBpZiAoCisgICAgICAgICAgICBwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfQklORElORykpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVCaW5kaW5nRXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7CisgICAgICAgIH0gZWxzZSBpZiAoCisgICAgICAgICAgICBwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfT1BFUkFUSU9OKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU9wZXJhdGlvbkV4dGVuc2lvbihjb250ZXh0LCBwYXJlbnQsIGUpOworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5nZXRXU0RMRWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9JTlBVVCkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVJbnB1dEV4dGVuc2lvbihjb250ZXh0LCBwYXJlbnQsIGUpOworICAgICAgICB9IGVsc2UgaWYgKAorICAgICAgICAgICAgcGFyZW50LmdldFdTRExFbGVtZW50TmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX09VVFBVVCkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVPdXRwdXRFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfRkFVTFQpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlRmF1bHRFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKKyAgICAgICAgfSBlbHNlIGlmICgKKyAgICAgICAgICAgIHBhcmVudC5nZXRXU0RMRWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVNlcnZpY2VFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfUE9SVCkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVQb3J0RXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgPGNvZGU+d3NkbDpwb3J0VHlwZTwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFBhcnNlciBjb250ZXh0IHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gYnkgdGhlIHdzZGwgcGFyc2VyCisgICAgICogQHBhcmFtIHBhcmVudCAgVGhlIFBhcmVudCBlbGVtZW50IHdpdGhpbiB3aGljaCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIGRlZmluZWQKKyAgICAgKiBAcGFyYW0gZSAgICAgICBUaGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW5ldAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgd2FzIHNvbWUgZXJyb3IgZHVyaW5nIHRoZSBleHRlbnNpb24gaGFuZGxpbmcgb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4gSWYgcmV0dXJuZWQgZmFsc2UKKyAgICAgKiAgICAgICAgIHRoZW4gdGhlIFdTREwgcGFyc2VyIGNhbiBhYm9ydCBpZiB0aGUgd3NkbCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaGFkIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVQb3J0VHlwZUV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgPGNvZGU+d3NkbDpkZWZpbml0aW9uczwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFBhcnNlciBjb250ZXh0IHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gYnkgdGhlIHdzZGwgcGFyc2VyCisgICAgICogQHBhcmFtIHBhcmVudCAgVGhlIFBhcmVudCBlbGVtZW50IHdpdGhpbiB3aGljaCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIGRlZmluZWQKKyAgICAgKiBAcGFyYW0gZSAgICAgICBUaGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW5ldAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgd2FzIHNvbWUgZXJyb3IgZHVyaW5nIHRoZSBleHRlbnNpb24gaGFuZGxpbmcgb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4gSWYgcmV0dXJuZWQgZmFsc2UKKyAgICAgKiAgICAgICAgIHRoZW4gdGhlIFdTREwgcGFyc2VyIGNhbiBhYm9ydCBpZiB0aGUgd3NkbCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaGFkIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVEZWZpbml0aW9uc0V4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgPGNvZGU+d3NkbDp0eXBlPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgUGFyc2VyIGNvbnRleHQgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiBieSB0aGUgd3NkbCBwYXJzZXIKKyAgICAgKiBAcGFyYW0gcGFyZW50ICBUaGUgUGFyZW50IGVsZW1lbnQgd2l0aGluIHdoaWNoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgZGVmaW5lZAorICAgICAqIEBwYXJhbSBlICAgICAgIFRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbmV0CisgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGVyZSB3YXMgc29tZSBlcnJvciBkdXJpbmcgdGhlIGV4dGVuc2lvbiBoYW5kbGluZyBvdGhlcndpc2UgcmV0dXJucyB0cnVlLiBJZiByZXR1cm5lZCBmYWxzZQorICAgICAqICAgICAgICAgdGhlbiB0aGUgV1NETCBwYXJzZXIgY2FuIGFib3J0IGlmIHRoZSB3c2RsIGV4dGVuc2liaWxpdHkgZWxlbWVudCBoYWQgPGNvZGU+cmVxdWlyZWQ8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVR5cGVzRXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciA8Y29kZT53c2RsOmJpbmRpbmc8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBQYXJzZXIgY29udGV4dCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIGJ5IHRoZSB3c2RsIHBhcnNlcgorICAgICAqIEBwYXJhbSBwYXJlbnQgIFRoZSBQYXJlbnQgZWxlbWVudCB3aXRoaW4gd2hpY2ggdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBkZWZpbmVkCisgICAgICogQHBhcmFtIGUgICAgICAgVGhlIGV4dGVuc2liaWxpdHkgZWxlbWVuZXQKKyAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZXJlIHdhcyBzb21lIGVycm9yIGR1cmluZyB0aGUgZXh0ZW5zaW9uIGhhbmRsaW5nIG90aGVyd2lzZSByZXR1cm5zIHRydWUuIElmIHJldHVybmVkIGZhbHNlCisgICAgICogICAgICAgICB0aGVuIHRoZSBXU0RMIHBhcnNlciBjYW4gYWJvcnQgaWYgdGhlIHdzZGwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGhhZCA8Y29kZT5yZXF1aXJlZDwvY29kZT4gYXR0cmlidXRlIHNldCB0byB0cnVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlQmluZGluZ0V4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgPGNvZGU+d3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBQYXJzZXIgY29udGV4dCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIGJ5IHRoZSB3c2RsIHBhcnNlcgorICAgICAqIEBwYXJhbSBwYXJlbnQgIFRoZSBQYXJlbnQgZWxlbWVudCB3aXRoaW4gd2hpY2ggdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBkZWZpbmVkCisgICAgICogQHBhcmFtIGUgICAgICAgVGhlIGV4dGVuc2liaWxpdHkgZWxlbWVuZXQKKyAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZXJlIHdhcyBzb21lIGVycm9yIGR1cmluZyB0aGUgZXh0ZW5zaW9uIGhhbmRsaW5nIG90aGVyd2lzZSByZXR1cm5zIHRydWUuIElmIHJldHVybmVkIGZhbHNlCisgICAgICogICAgICAgICB0aGVuIHRoZSBXU0RMIHBhcnNlciBjYW4gYWJvcnQgaWYgdGhlIHdzZGwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGhhZCA8Y29kZT5yZXF1aXJlZDwvY29kZT4gYXR0cmlidXRlIHNldCB0byB0cnVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlT3BlcmF0aW9uRXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciA8Y29kZT53c2RsOmlucHV0PC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgUGFyc2VyIGNvbnRleHQgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiBieSB0aGUgd3NkbCBwYXJzZXIKKyAgICAgKiBAcGFyYW0gcGFyZW50ICBUaGUgUGFyZW50IGVsZW1lbnQgd2l0aGluIHdoaWNoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgZGVmaW5lZAorICAgICAqIEBwYXJhbSBlICAgICAgIFRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbmV0CisgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGVyZSB3YXMgc29tZSBlcnJvciBkdXJpbmcgdGhlIGV4dGVuc2lvbiBoYW5kbGluZyBvdGhlcndpc2UgcmV0dXJucyB0cnVlLiBJZiByZXR1cm5lZCBmYWxzZQorICAgICAqICAgICAgICAgdGhlbiB0aGUgV1NETCBwYXJzZXIgY2FuIGFib3J0IGlmIHRoZSB3c2RsIGV4dGVuc2liaWxpdHkgZWxlbWVudCBoYWQgPGNvZGU+cmVxdWlyZWQ8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUlucHV0RXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciA8Y29kZT53c2RsOm91dHB1dDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFBhcnNlciBjb250ZXh0IHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gYnkgdGhlIHdzZGwgcGFyc2VyCisgICAgICogQHBhcmFtIHBhcmVudCAgVGhlIFBhcmVudCBlbGVtZW50IHdpdGhpbiB3aGljaCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIGRlZmluZWQKKyAgICAgKiBAcGFyYW0gZSAgICAgICBUaGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW5ldAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgd2FzIHNvbWUgZXJyb3IgZHVyaW5nIHRoZSBleHRlbnNpb24gaGFuZGxpbmcgb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4gSWYgcmV0dXJuZWQgZmFsc2UKKyAgICAgKiAgICAgICAgIHRoZW4gdGhlIFdTREwgcGFyc2VyIGNhbiBhYm9ydCBpZiB0aGUgd3NkbCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaGFkIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVPdXRwdXRFeHRlbnNpb24oVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZm9yIDxjb2RlPndzZGw6ZmF1bHQ8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBQYXJzZXIgY29udGV4dCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIGJ5IHRoZSB3c2RsIHBhcnNlcgorICAgICAqIEBwYXJhbSBwYXJlbnQgIFRoZSBQYXJlbnQgZWxlbWVudCB3aXRoaW4gd2hpY2ggdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBkZWZpbmVkCisgICAgICogQHBhcmFtIGUgICAgICAgVGhlIGV4dGVuc2liaWxpdHkgZWxlbWVuZXQKKyAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZXJlIHdhcyBzb21lIGVycm9yIGR1cmluZyB0aGUgZXh0ZW5zaW9uIGhhbmRsaW5nIG90aGVyd2lzZSByZXR1cm5zIHRydWUuIElmIHJldHVybmVkIGZhbHNlCisgICAgICogICAgICAgICB0aGVuIHRoZSBXU0RMIHBhcnNlciBjYW4gYWJvcnQgaWYgdGhlIHdzZGwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGhhZCA8Y29kZT5yZXF1aXJlZDwvY29kZT4gYXR0cmlidXRlIHNldCB0byB0cnVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHRFeHRlbnNpb24oVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZm9yIDxjb2RlPndzZGw6c2VydmljZTwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFBhcnNlciBjb250ZXh0IHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gYnkgdGhlIHdzZGwgcGFyc2VyCisgICAgICogQHBhcmFtIHBhcmVudCAgVGhlIFBhcmVudCBlbGVtZW50IHdpdGhpbiB3aGljaCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIGRlZmluZWQKKyAgICAgKiBAcGFyYW0gZSAgICAgICBUaGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW5ldAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgd2FzIHNvbWUgZXJyb3IgZHVyaW5nIHRoZSBleHRlbnNpb24gaGFuZGxpbmcgb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4gSWYgcmV0dXJuZWQgZmFsc2UKKyAgICAgKiAgICAgICAgIHRoZW4gdGhlIFdTREwgcGFyc2VyIGNhbiBhYm9ydCBpZiB0aGUgd3NkbCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaGFkIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVTZXJ2aWNlRXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciA8Y29kZT53c2RsOnBvcnQ8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBQYXJzZXIgY29udGV4dCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIGJ5IHRoZSB3c2RsIHBhcnNlcgorICAgICAqIEBwYXJhbSBwYXJlbnQgIFRoZSBQYXJlbnQgZWxlbWVudCB3aXRoaW4gd2hpY2ggdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBkZWZpbmVkCisgICAgICogQHBhcmFtIGUgICAgICAgVGhlIGV4dGVuc2liaWxpdHkgZWxlbWVuZXQKKyAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZXJlIHdhcyBzb21lIGVycm9yIGR1cmluZyB0aGUgZXh0ZW5zaW9uIGhhbmRsaW5nIG90aGVyd2lzZSByZXR1cm5zIHRydWUuIElmIHJldHVybmVkIGZhbHNlCisgICAgICogICAgICAgICB0aGVuIHRoZSBXU0RMIHBhcnNlciBjYW4gYWJvcnQgaWYgdGhlIHdzZGwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGhhZCA8Y29kZT5yZXF1aXJlZDwvY29kZT4gYXR0cmlidXRlIHNldCB0byB0cnVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlUG9ydEV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL2FwaS93c2RsL1RXU0RMT3BlcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL2FwaS93c2RsL1RXU0RMT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkMGEzYQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvYXBpL3dzZGwvVFdTRExPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbDsKKworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQWJzdHJhY3RzIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFRXU0RMT3BlcmF0aW9uIGV4dGVuZHMgVFdTRExFeHRlbnNpYmxleworICAgIC8qKgorICAgICAqIEdpdmVzIGEgTWFwIG9mIGZhdWx0IG5hbWUgYXR0cmlidXRlIHZhbHVlIHRvIHRoZSB7QGxpbmsgSkNsYXNzfQorICAgICAqLworICAgIE1hcDxTdHJpbmcsIEpDbGFzcz4gZ2V0RmF1bHRzKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL2FwaS93c2RsL1RXU0RMUGFyc2VyQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9hcGkvd3NkbC9UV1NETFBhcnNlckNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjZlM2UwCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9hcGkvd3NkbC9UV1NETFBhcnNlckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbDsKKworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKworLyoqCisgKiBQcm92aWRlcyBXU0RMIHBhcnNpbmcgY29udGV4dC4gSXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIFdTREwgZXh0ZW5zaW9uIGhhbmRsZXJzIHRvIHJlZ2lzdGVyIHRoZWlyIG5hbWVzcGFjZXMgc28gdGhhdAorICogaXQgY2FuIGJlIGxhdHRlciB1c2VkIGJ5IG90aGVyIGV4dGVuc2lvbnMgdG8gcmVzb2x2ZSB0aGUgbmFtZXNwYWNlcy4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFRXU0RMUGFyc2VyQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBQdXNoZXMgdGhlIHBhcnNpbmcgY29udGV4dAorICAgICAqLworICAgIHZvaWQgcHVzaCgpOworCisgICAgLyoqCisgICAgICogcG9wcyB0aGUgcGFyc2luZyBjb250ZXh0CisgICAgICovCisgICAgdm9pZCBwb3AoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBuYW1lc3BhY2UgVVJJIGZvciBhIGdpdmVuIHByZWZpeAorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBub24tbnVsbCBwcmVmaXgKKyAgICAgKiBAcmV0dXJuIG51bGwgb2YgdGhlIHByZWZpeCBpcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIHByZWZpeGVzIGluIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgKi8KKyAgICBJdGVyYWJsZTxTdHJpbmc+IGdldFByZWZpeGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyBkZWZhdWx0IG5hbWVzcGFjZQorICAgICAqCisgICAgICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGZvdW5kCisgICAgICovCisgICAgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2VVUkkoKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBuYWVtZXNwYWNlIGRlY2xhcmF0aW9ucyBvZiBhIGdpdmVuIHtAbGluayBFbGVtZW50fSBmb3VuZCBpbiB0aGUgV1NETAorICAgICAqCisgICAgICogQHBhcmFtIGUge0BsaW5rIEVsZW1lbnR9IHdob3NlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZWdpc3RlcmVkCisgICAgICovCisgICAgdm9pZCByZWdpc3Rlck5hbWVzcGFjZXMoRWxlbWVudCBlKTsKKworICAgIC8qKgorICAgICAqIGdpdmVzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIEVsZW1lbnQuCisgICAgICovCisgICAgTG9jYXRvciBnZXRMb2NhdGlvbihFbGVtZW50IGUpOworCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wYWNrYWdlLWluZm8uamF2YQppbmRleCAxODg5MDgwLi5hM2E1MTQwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcGFja2FnZS1pbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsOCArMjQsOCBAQAogICovCiAKIC8qKgotICogPGgxPkpBWC1XUyAyLjAgVG9vbHM8L2gxPgotICogVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHRvb2xzIGluY2x1ZGVkIHdpdGggSkFYLVdTIDIuMC4KKyAqIDxoMT5KQVgtV1MgMi4wLjEgVG9vbHM8L2gxPgorICogVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHRvb2xzIGluY2x1ZGVkIHdpdGggSkFYLVdTIDIuMC4xLgogICoKICAqIHtARG90RGlhZ3JhbQogICAgICBkaWdyYXBoIEcgewpAQCAtNTMsOSArNTMsOCBAQAogICAgICAgICJXc0ltcG9ydCBBTlQgVGFzayIgLT4gd3NpbXBvcnQgLT4gQ29tcGlsZVRvb2w7CiAKICAgICAgICBDb21waWxlVG9vbCAtPiBBUFQgLT4gV1NBUCAtPiBXZWJTZXJ2aWNlQVA7Ci0gICAgICAgQ29tcGlsZVRvb2wgLT4gUHJvY2Vzc29yOwotICAgICAgIENvbXBpbGVUb29sIC0+IE1vZGVsZXI7Ci0gICAgICAgQ29tcGlsZVRvb2wgLT4gUHJvY2Vzc29yQWN0aW9uczsKKyAgICAgICBDb21waWxlVG9vbCAtPiBQcm9jZXNzb3IgLT4gTW9kZWxlcjsKKyAgICAgICBQcm9jZXNzb3IgLT4gUHJvY2Vzc29yQWN0aW9uczsKICAgICAgICBDb21waWxlVG9vbCAtPiBXZWJTZXJ2aWNlQVA7CiAKICAgICAgICBNb2RlbGVyIC0+IFdTRExNb2RlbGVyOwpAQCAtNzAsMTEgKzY5LDExIEBACiAgKiAgPGR0PntAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFudC5BcHQgQXB0fQogICogIDxkZD5BbiBBTlQgdGFzayB0byBpbnZva2UgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvdG9vbGRvY3Mvc2hhcmUvYXB0Lmh0bWwiPkFQVDwvYT4uCiAKLSAqICA8ZHQ+e0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYW50LldzR2VuIFdzR2VufQorICogIDxkdD57QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hbnQuV3NHZW4yIFdzR2VufQogICogIDxkZD4KICAqICAgIEFuIEFOVCB0YXNrIHRvIGludm9rZSB7QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5Xc0dlbiBXc0dlbn0KIAotICogIDxkdD57QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hbnQuV3NJbXBvcnQgV3NJbXBvcnR9CisgKiAgPGR0PntAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFudC5Xc0ltcG9ydDIgV3NJbXBvcnR9CiAgKiAgPGRkPgogICogICAgQW4gQU5UIHRhc2sgdG8gaW52b2tlIHtAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLldzSW1wb3J0IFdzSW1wb3J0fQogICoKQEAgLTkxLDI5ICs5MCwxNyBAQAogICogIDxkZD5Ub29sIHRvIHByb2Nlc3MgYSBjb21waWxlZCBqYXZheC5qd3MuV2ViU2VydmljZSBhbm5vdGF0ZWQgY2xhc3MgYW5kIHRvIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkgY2xhc3NlcyB0byBtYWtlCiAgKiAgaXQgYSBXZWIgc2VydmljZS4KIAotICogIDxkdD57QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hbnQuV3NJbXBvcnQgV3NJbXBvcnR9CisgKiAgPGR0PntAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFudC5Xc0ltcG9ydDIgV3NJbXBvcnR9CiAgKiAgPGRkPgogICogICAgVG9vbCB0byBpbXBvcnQgYSBXU0RMIGFuZCB0byBnZW5lcmF0ZSBhbiBTRUkgKGEgamF2YXguandzLldlYlNlcnZpY2UpIGludGVyZmFjZSB0aGF0IGNhbiBiZSBlaXRoZXIgaW1wbGVtZW50ZWQKICAqICAgIG9uIHRoZSBzZXJ2ZXIgdG8gYnVpbGQgYSB3ZWIgc2VydmljZSwgb3IgY2FuIGJlIHVzZWQgb24gdGhlIGNsaWVudCB0byBpbnZva2UgdGhlIHdlYiBzZXJ2aWNlLgogICogIDwvZDE+CiAgKiA8aDI+SW1wbGVtZW50YXRpb24gQ2xhc3NlczwvaDI+CiAgKiAgPGQxPgotICAgICAgPGR0PntAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5Db21waWxlVG9vbCBDb21waWxlVG9vbH0KLSAqICAgIDxkZD4gVGhpcyBpcyB0aGUgbWFpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYm90aCBXc0dlbiBhbmQgV3NJbXBvcnQuCi0gKgotICoKLSAqIDxkdD57QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yIFByb2Nlc3Nvcn0KLSAqICAgIDxkZD5UaGlzIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgdG8gcHJvY2VzcyBhIHBhcnRpY3VsYXIge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5Db25maWd1cmF0aW9uCi0gKiAgICBDb25maWd1cmF0aW9ufSB0byBidWlsZCBhIHtAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbCBNb2RlbH0gYW5kIHRvIHJ1bgotICogICB7QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yQWN0aW9uIFByb2Nlc3NvckFjdGlvbnN9IG9uIHRoYXQgbW9kZWwuCi0KICAqICAgIDxkdD57QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWwgTW9kZWx9CiAgKiAgICA8ZGQ+VGhlIG1vZGVsIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBlbnRpcmUgV2ViIFNlcnZpY2UuICBUaGUgSkFYLVdTIFByb2Nlc3NvckFjdGlvbnMgY2FuIHByb2Nlc3MKICAqICAgIHRoaXMgTW9kZWwgdG8gZ2VuZXJhdGUgSmF2YSBhcnRpZmFjdHMgc3VjaCBhcyB0aGUgc2VydmljZSBpbnRlcmZhY2UuCiAgKgotICAgICAgPGR0PntAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5Qcm9jZXNzb3JBY3Rpb24gUHJvY2Vzc29yQWN0aW9uc30KLSAqICAgIDxkZD5BIFByb2Nlc3NvckFjdGlvbiBpcyB1c2VkIHRvIHBlcmZvcm0gc29tZSBvcGVyYXRpb24gb24gYSBNb2RlbCBvYmplY3Qgc3VjaCBhcwotICogICAgZ2VuZXJhdGluZyBhIEphdmEgc291cmNlIGZpbGUuCiAgKgogICogICAgPGR0PntAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLk1vZGVsZXIgTW9kZWxlcn0KICAqICAgIDxkZD5BIE1vZGVsZXIgaXMgdXNlZCB0byBjcmVhdGUgYSBNb2RlbCBvZiBhIFdlYiBTZXJ2aWNlIGZyb20gYSBwYXJ0aWN1bGFyIFdlYgpAQCAtMTI4LDcgKzExNSw3IEBACiAgKiAgICBqYXZheC54bWwud3MuKiBhbm5vdGF0aW9ucy4gVGhpcyBjbGFzcyBpcyB1c2VkIGVpdGhlciBieSB0aGUgV3NHZW4gKENvbXBpbGVUb29sKSB0b29sIG9yCiAgKiAgICBpZGlyZWN0bHkgdmlhIHRoZSB7QGxpbmsgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwud3MuV1NBUCBXU0FQfSB3aGVuIGludm9rZWQgYnkgQVBULgogICoKLSAqICAgIDxkdD57QGxpbmsgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwud3MuV1NBUCBXU0FQfQorICogICAgPGR0PntAbGluayBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC53cy5Bbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeUltcGwgV1NBUH0KICAqICAgIDxkZD5UaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIFdlYlNlcnZpY2VBUCB3aGVuIEFQVCBpcyBpbnZva2VkIG9uIGEgU0VJCiAgKiAgICBhbm5vdGF0ZWQgd2l0aCB0aGUgamF2YXguandzLldlYlNlcnZpY2UgYW5ub3RhdGlvbi4KICAqICAgPC9kMT4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL1Byb2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODk5YzUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3NvcjsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5Nb2RlbEluZm87Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmV4Y2VwdGlvbi5KQVhXU0V4Y2VwdGlvbkJhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgY29udGFpbnMgbWV0aG9kcyBmb3IgZ2V0dGluZyBhIE1vZGVsZXIgYW5kIGNyZWF0aW5nIGEgbW9kZWwKLSAqIGZyb20gdGhhdCBNb2RlbGVyIGdpdmVuIGEgcGFydGljdWxhciBjb25maWd1cmF0aW9uLiBQcm9jZXNzb3JBY3Rpb25zIGNhbiBhbHNvCi0gKiBiZSByZWdpc3RlcmVkIGFuZCBydW4gd2l0aCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3IgewotCi0gICAgcHVibGljIFByb2Nlc3NvcihDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFByb3BlcnRpZXMgb3B0aW9ucywgTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcyhjb25maWd1cmF0aW9uLG9wdGlvbnMpOwotICAgICAgICBfbW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvY2Vzc29yKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgUHJvcGVydGllcyBvcHRpb25zKSB7Ci0gICAgICAgIF9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLSAgICAgICAgX29wdGlvbnMgPSBvcHRpb25zOwotCi0gICAgICAgIC8vIGZpbmQgdGhlIHZhbHVlIG9mIHRoZSAicHJpbnQgc3RhY2sgdHJhY2VzIiBwcm9wZXJ0eQotICAgICAgICBfcHJpbnRTdGFja1RyYWNlID0gQm9vbGVhbi52YWx1ZU9mKF9vcHRpb25zLmdldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuUFJJTlRfU1RBQ0tfVFJBQ0VfUFJPUEVSVFkpKTsKLSAgICAgICAgX2VudiA9IF9jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkKFByb2Nlc3NvckFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgX2FjdGlvbnMuYWRkKGFjdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZGVsIGdldE1vZGVsKCkgewotICAgICAgICByZXR1cm4gX21vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgcnVuTW9kZWxlcigpOwotICAgICAgICBpZiAoX21vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJ1bkFjdGlvbnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bk1vZGVsZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNb2RlbEluZm8gbW9kZWxJbmZvID0gX2NvbmZpZ3VyYXRpb24uZ2V0TW9kZWxJbmZvKCk7Ci0gICAgICAgICAgICBpZiAobW9kZWxJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc29yRXhjZXB0aW9uKCJwcm9jZXNzb3IubWlzc2luZy5tb2RlbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfbW9kZWwgPSBtb2RlbEluZm8uYnVpbGRNb2RlbChfb3B0aW9ucyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSkFYV1NFeGNlcHRpb25CYXNlIGUpIHsKLSAgICAgICAgICAgIGlmIChfcHJpbnRTdGFja1RyYWNlKSB7Ci0gICAgICAgICAgICAgICAgX2Vudi5wcmludFN0YWNrVHJhY2UoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZW52LmVycm9yKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuQWN0aW9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChfbW9kZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGF2b2lkIHJlcG9ydGluZyB5ZXQgYW5vdGhlciBlcnJvciBoZXJlCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFByb2Nlc3NvckFjdGlvbiBhY3Rpb24gOiBfYWN0aW9ucykgewotICAgICAgICAgICAgICAgIGFjdGlvbi5wZXJmb3JtKF9tb2RlbCwgX2NvbmZpZ3VyYXRpb24sIF9vcHRpb25zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSkFYV1NFeGNlcHRpb25CYXNlIGUpIHsKLSAgICAgICAgICAgIGlmIChfcHJpbnRTdGFja1RyYWNlIHx8IF9lbnYudmVyYm9zZSgpKSB7Ci0gICAgICAgICAgICAgICAgX2Vudi5wcmludFN0YWNrVHJhY2UoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZW52LmVycm9yKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzIF9vcHRpb25zOwotICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBfY29uZmlndXJhdGlvbjsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvY2Vzc29yQWN0aW9uPiBfYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc29yQWN0aW9uPigpOwotICAgIHByaXZhdGUgTW9kZWwgX21vZGVsOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfcHJpbnRTdGFja1RyYWNlOwotICAgIHByaXZhdGUgZmluYWwgUHJvY2Vzc29yRW52aXJvbm1lbnQgX2VudjsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL1Byb2Nlc3NvckFjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmQ3M2QuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBIFByb2Nlc3NvckFjdGlvbiBpcyB1c2VkIHRvIHBlcmZvcm0gc29tZSBvcGVyYXRpb24gb24gYQotICoge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk1vZGVsIE1vZGVsfSBzdWNoIGFzCi0gKiBnZW5lcmF0aW5nIGEgSmF2YSBzb3VyY2UgZmlsZS4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzb3JBY3Rpb24gewotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm0oTW9kZWwgbW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9wZXJ0aWVzIG9wdGlvbnMpOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yQWN0aW9uVmVyc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yQWN0aW9uVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGViNGNiLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL1Byb2Nlc3NvckFjdGlvblZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICoKLSAqIFR5cGVzYWZlIGVudW0gY2xhc3MgdG8gaG9sZCB0aGUgUHJvY2Vzc29yQWN0aW9uVmVyc2lvbgotICovCi1wdWJsaWMgZW51bSBQcm9jZXNzb3JBY3Rpb25WZXJzaW9uIHsKLSAgICBQUkVfMjAoIjEuMS4yIiksIFZFUlNJT05fMjAoIjIuMCIpOwotCi0gICAgUHJvY2Vzc29yQWN0aW9uVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb247Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL1Byb2Nlc3NvckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzM0NTExLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL1Byb2Nlc3NvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3NvcjsKLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCBieSBNb2RlbCwgTW9kZWxlcnMsIENvbmZpZyBQcm9jZXNzb3JBY3Rpb25zCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JDb25zdGFudHMgewotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNPQVBfVkVSU0lPTl8xXzEgPSAiU09BUCAxLjEiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNPQVBfVkVSU0lPTl8xXzIgPSAiU09BUCAxLjIiOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JFeGNlcHRpb24uamF2YQppbmRleCA2ZjEzYWZmLi5mZDk5OGYyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw3ICsyNiw2IEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5leGNlcHRpb24uSkFYV1NFeGNlcHRpb25CYXNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOwogCiAvKioKICAqIFByb2Nlc3NvckV4Y2VwdGlvbiByZXByZXNlbnRzIGFuIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcKQEAgLTQyLDExICs0MSwxNSBAQAogICAgICAgICBzdXBlcihrZXksIGFyZ3MpOwogICAgIH0KIAorICAgIHB1YmxpYyBQcm9jZXNzb3JFeGNlcHRpb24oU3RyaW5nIG1zZyl7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCiAgICAgcHVibGljIFByb2Nlc3NvckV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAgICAgICAgIHN1cGVyKHRocm93YWJsZSk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICByZXR1cm4gImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLnByb2Nlc3NvciI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yTm90aWZpY2F0aW9uTGlzdGVuZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL1Byb2Nlc3Nvck5vdGlmaWNhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTllMWYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yTm90aWZpY2F0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3I7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKLQotLyoqCi0gKiBBIFByb2Nlc3Nvck5vdGlmaWNhdGlvbkxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgd2l0aCBhIFByb2Nlc3NvciBhbmQgcmVjZWl2ZXMKLSAqIG5vdGlmaWNhdGlvbnMgb2YgZXJyb3JzLCB3YXJuaW5ncyBhbmQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzb3JOb3RpZmljYXRpb25MaXN0ZW5lciB7Ci0gICAgcHVibGljIHZvaWQgb25FcnJvcihMb2NhbGl6YWJsZSBtc2cpOwotICAgIHB1YmxpYyB2b2lkIG9uV2FybmluZyhMb2NhbGl6YWJsZSBtc2cpOwotICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhMb2NhbGl6YWJsZSBtc2cpOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yT3B0aW9ucy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvUHJvY2Vzc29yT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTE5OGNkLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL1Byb2Nlc3Nvck9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3I7Ci0KLS8qKgotICogUHJvcGVydHkgbmFtZXMgdXNlZCBieSBQcm9jZXNzb3JBY3Rpb25zCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JPcHRpb25zIHsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNPVVJDRV9ESVJFQ1RPUllfUFJPUEVSVFkgPSAic291cmNlRGlyZWN0b3J5IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVNUSU5BVElPTl9ESVJFQ1RPUllfUFJPUEVSVFkgPQotICAgICAgICAiZGVzdGluYXRpb25EaXJlY3RvcnkiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PTkNMQVNTX0RFU1RJTkFUSU9OX0RJUkVDVE9SWV9QUk9QRVJUWSA9Ci0gICAgICAgICJub25jbGFzc0Rlc3RpbmF0aW9uRGlyZWN0b3J5IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxJREFURV9XU0RMX1BST1BFUlRZID0gInZhbGlkYXRpb25XU0RMIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFWFBMSUNJVF9TRVJWSUNFX0NPTlRFWFRfUFJPUEVSVFkgPQotICAgICAgICAiZXhwbGljaXRTZXJ2aWNlQ29udGV4dCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJJTlRfU1RBQ0tfVFJBQ0VfUFJPUEVSVFkgPSAicHJpbnRTdGFja1RyYWNlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET05PVF9PVkVSV1JJVEVfQ0xBU1NFUyA9ICJkb05vdE92ZXJXcml0ZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9fREFUQV9CSU5ESU5HX1BST1BFUlRZID0gIm5vRGF0YUJpbmRpbmciOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRV9XU0lfQkFTSUNfUFJPRklMRSA9ICJ1c2VXU0lCYXNpY1Byb2ZpbGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklDVF9DT01QTElBTkNFID0gInN0cmljdENvbXBsaWFuY2UiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBWFdTX1NPVVJDRV9WRVJTSU9OID0gInNvdXJjZVZlcnNpb24iOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOV1JBUF9ET0NfTElURVJBTF9XUkFQUEVSUyA9Ci0gICAgICAgICJ1bndyYXBEb2NMaXRXcmFwcGVycyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQklORElOR19GSUxFUyA9ICJiaW5kaW5nRmlsZXMiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTiA9ICJleHRlbnNpb24iOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1RPQ09MID0gInByb3RvY29sIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUUkFOU1BPUlQgPSAidHJhbnNwb3J0IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX0xPQ0FUSU9OID0gIndzZGxsb2NhdGlvbiI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9QQUNLQUdFID0gImRlZmF1bHRwYWNrYWdlIjsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9DbGFzc01vZGVsSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL0NsYXNzTW9kZWxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTZmYTIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL0NsYXNzTW9kZWxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3Nvck9wdGlvbnM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5WZXJzaW9uVXRpbDsKLQotLyoqCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc01vZGVsSW5mbyBleHRlbmRzIE1vZGVsSW5mbyB7Ci0KLSAgICBwdWJsaWMgQ2xhc3NNb2RlbEluZm8oU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBNb2RlbGVyIGdldE1vZGVsZXIoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9Db25maWd1cmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODJjNmE5Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZzsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbiB7Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbihQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpIHsKLSAgICAgICAgX2VudiA9IChQcm9jZXNzb3JFbnZpcm9ubWVudCllbnY7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZGVsSW5mbyBnZXRNb2RlbEluZm8oKSB7Ci0gICAgICAgIHJldHVybiBfbW9kZWxJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZGVsSW5mbyhNb2RlbEluZm8gaSkgewotICAgICAgICBfbW9kZWxJbmZvID0gKE1vZGVsSW5mbylpOwotICAgICAgICBfbW9kZWxJbmZvLnNldFBhcmVudCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvY2Vzc29yRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBfZW52OwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvY2Vzc29yRW52aXJvbm1lbnQgX2VudjsKLSAgICBwcml2YXRlIE1vZGVsSW5mbyBfbW9kZWxJbmZvOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9Db25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzdkZTIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBQcm9jZXNzb3JFeGNlcHRpb24gewotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nIGtleSwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgc3VwZXIoa2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKHRocm93YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuY29uZmlndXJhdGlvbiI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvSGFuZGxlckNoYWluSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL0hhbmRsZXJDaGFpbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjMzgxZS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvSGFuZGxlckNoYWluSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpbkluZm8gewotCi0gICAgcHVibGljIEhhbmRsZXJDaGFpbkluZm8oKSB7Ci0gICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByb2xlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkKEhhbmRsZXJJbmZvIGkpIHsKLSAgICAgICAgaGFuZGxlcnMuYWRkKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRIYW5kbGVycygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRIYW5kbGVyc0NvdW50KCkgewotICAgICAgICByZXR1cm4gaGFuZGxlcnMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qIHNlcmlhbGl6YXRpb24gKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRIYW5kbGVyc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyczsKLSAgICB9Ci0KLSAgICAvKiBzZXJpYWxpemF0aW9uICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcnNMaXN0KExpc3QgbCkgewotICAgICAgICBoYW5kbGVycyA9IGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUm9sZShTdHJpbmcgcykgewotICAgICAgICByb2xlcy5hZGQocyk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBnZXRSb2xlcygpIHsKLSAgICAgICAgcmV0dXJuIHJvbGVzOwotICAgIH0KLQotICAgIC8qIHNlcmlhbGl6YXRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlcyhTZXQgcykgewotICAgICAgICByb2xlcyA9IHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGhhbmRsZXJzOwotICAgIHByaXZhdGUgU2V0IHJvbGVzOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL0hhbmRsZXJJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvSGFuZGxlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyNDgwYi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvSGFuZGxlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckluZm8gewotCi0gICAgcHVibGljIEhhbmRsZXJJbmZvKCkgewotICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaGVhZGVyTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzTmFtZShTdHJpbmcgcykgewotICAgICAgICBoYW5kbGVyQ2xhc3NOYW1lID0gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qIHNlcmlhbGl6YXRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcCBtKSB7Ci0gICAgICAgIHByb3BlcnRpZXMgPSBtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlck5hbWUoUU5hbWUgbmFtZSkgewotICAgICAgICBoZWFkZXJOYW1lcy5hZGQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBnZXRIZWFkZXJOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGhlYWRlck5hbWVzOwotICAgIH0KLQotICAgIC8qIHNlcmlhbGl6YXRpb24gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJOYW1lcyhTZXQgcykgewotICAgICAgICBoZWFkZXJOYW1lcyA9IHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZTsKLSAgICBwcml2YXRlIE1hcCBwcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgU2V0IGhlYWRlck5hbWVzOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL01vZGVsSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL01vZGVsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTA3YmM1Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9Nb2RlbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZzsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250aWFpbnMgaW5mb3JtYXRpb24gdXNlZCBieSB7QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyCi0gKiBNb2RlbGVyc30gdG8gYnVpbGQge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk1vZGVsIE1vZGVsc30uCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2RlbEluZm8gewotCi0gICAgcHJvdGVjdGVkIE1vZGVsSW5mbygpIHt9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbiBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBfcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChDb25maWd1cmF0aW9uIGMpIHsKLSAgICAgICAgX3BhcmVudCA9IGM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgcykgewotICAgICAgICBfbmFtZSA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIF9wYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIEhhbmRsZXJDaGFpbkluZm8gZ2V0Q2xpZW50SGFuZGxlckNoYWluSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIF9jbGllbnRIYW5kbGVyQ2hhaW5JbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudEhhbmRsZXJDaGFpbkluZm8oSGFuZGxlckNoYWluSW5mbyBpKSB7Ci0gICAgICAgIF9jbGllbnRIYW5kbGVyQ2hhaW5JbmZvID0gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluSW5mbyBnZXRTZXJ2ZXJIYW5kbGVyQ2hhaW5JbmZvKCkgewotICAgICAgICByZXR1cm4gX3NlcnZlckhhbmRsZXJDaGFpbkluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVySGFuZGxlckNoYWluSW5mbyhIYW5kbGVyQ2hhaW5JbmZvIGkpIHsKLSAgICAgICAgX3NlcnZlckhhbmRsZXJDaGFpbkluZm8gPSBpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gX2phdmFQYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhUGFja2FnZU5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgX2phdmFQYWNrYWdlTmFtZSA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZGVsIGJ1aWxkTW9kZWwoUHJvcGVydGllcyBvcHRpb25zKXsKLSAgICAgICAgcmV0dXJuIGdldE1vZGVsZXIob3B0aW9ucykuYnVpbGRNb2RlbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLSAgICAgICAgcmV0dXJuIGVudGl0eVJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eVJlc29sdmVyKEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKSB7Ci0gICAgICAgIHRoaXMuZW50aXR5UmVzb2x2ZXIgPSBlbnRpdHlSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRKYXZhUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIF9kZWZhdWx0SmF2YVBhY2thZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEphdmFQYWNrYWdlKFN0cmluZyBfZGVmYXVsdEphdmFQYWNrYWdlKSB7Ci0gICAgICAgIHRoaXMuX2RlZmF1bHRKYXZhUGFja2FnZSA9IF9kZWZhdWx0SmF2YVBhY2thZ2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1vZGVsZXIgZ2V0TW9kZWxlcihQcm9wZXJ0aWVzIG9wdGlvbnMpOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIF9wYXJlbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2phdmFQYWNrYWdlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfZGVmYXVsdEphdmFQYWNrYWdlOwotICAgIHByaXZhdGUgSGFuZGxlckNoYWluSW5mbyBfY2xpZW50SGFuZGxlckNoYWluSW5mbzsKLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbkluZm8gX3NlcnZlckhhbmRsZXJDaGFpbkluZm87Ci0gICAgcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcjsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9XU0RMTW9kZWxJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvV1NETE1vZGVsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmVhYjAwLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9XU0RMTW9kZWxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZzsKLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC5KQVhXU0NsYXNzRmFjdG9yeTsKLQotLyoqCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTW9kZWxJbmZvIGV4dGVuZHMgTW9kZWxJbmZvIHsKLQotICAgIHB1YmxpYyBXU0RMTW9kZWxJbmZvKCkge30KLQotICAgIHByb3RlY3RlZCBNb2RlbGVyIGdldE1vZGVsZXIoUHJvcGVydGllcyBvcHRpb25zKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NsYXNzRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZVdTRExNb2RlbGVyKHRoaXMsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBfbG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIHMpIHsKLSAgICAgICAgX2xvY2F0aW9uID0gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgRG9jdW1lbnQ+IGdldEpBWFdTQmluZGluZ3MoKXsKLSAgICAgICAgcmV0dXJuIF9qYXh3c0JpbmRpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEpBWFdTQmluZGluZ3MoU3RyaW5nIHN5c3RlbUlkLCBEb2N1bWVudCBiaW5kaW5nKXsKLSAgICAgICAgX2pheHdzQmluZGluZ3MucHV0KHN5c3RlbUlkLCBiaW5kaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElucHV0U291cmNlPiBnZXRKQVhCQmluZGluZ3MoKXsKLSAgICAgICAgcmV0dXJuIF9qYXhiQmluZGluZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSkFYQkJJbmRpbmdzKElucHV0U291cmNlIGpheGJCaW5kaW5nKXsKLSAgICAgICAgX2pheGJCaW5kaW5ncy5hZGQoamF4YkJpbmRpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDb25maWcoRWxlbWVudCBoYW5kbGVyQ29uZmlnKXsKLSAgICAgICAgdGhpcy5oYW5kbGVyQ29uZmlnID0gaGFuZGxlckNvbmZpZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRIYW5kbGVyQ29uZmlnKCl7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ29uZmlnOwotICAgIH0KLQotICAgIHByaXZhdGUgRWxlbWVudCBoYW5kbGVyQ29uZmlnOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2xvY2F0aW9uOwotCi0gICAgLy9leHRlcm5hbCBqYXh3czpiaW5kaW5ncyBlbGVtZW50cwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRG9jdW1lbnQ+IF9qYXh3c0JpbmRpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEb2N1bWVudD4oKTsKLQotICAgIC8vd2UgbmVlZCBhbiBhcnJheSBvZiBqYXhiOmJpbmRpbmcgZWxlbWVudHMsIHRoZXkgYXJlIGNoaWxkcmVuIG9mIGpheHdzOmJpbmRpbmdzCi0gICAgLy9hbmQgY291bGQgY29tZSBmcm9tIGFuIGV4dGVybmFsIGN1c3RvbWl6YXRpb24gZmlsZSBvciB3c2RsLgotICAgIHByaXZhdGUgU2V0PElucHV0U291cmNlPiBfamF4YkJpbmRpbmdzID0gbmV3IEhhc2hTZXQ8SW5wdXRTb3VyY2U+KCk7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvcGFyc2VyL0NsYXNzTW9kZWxQYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvQ2xhc3NNb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzRhZGE3Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvQ2xhc3NNb2RlbFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcucGFyc2VyOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuQ2xhc3NNb2RlbEluZm87Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLQotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIENsYXNzTW9kZWxQYXJzZXIgZXh0ZW5kcyBJbnB1dFBhcnNlciB7Ci0KLSAgICBwdWJsaWMgQ2xhc3NNb2RlbFBhcnNlcihQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYsIFByb3BlcnRpZXMgb3B0aW9ucykgewotICAgICAgICBzdXBlcihlbnYsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uIHBhcnNlKExpc3Q8U3RyaW5nPiBpbnB1dENsYXNzZXMpIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlKG5ldyBGaWxlKGlucHV0Q2xhc3Nlcy5nZXQoMCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbiBwYXJzZShGaWxlIGZpbGUpIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihnZXRFbnYoKSk7Ci0KLSAgICAgICAgY29uZmlnLnNldE1vZGVsSW5mbyhuZXcgQ2xhc3NNb2RlbEluZm8oZmlsZS5nZXROYW1lKCkpKTsKLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvcGFyc2VyL0N1c3RvbWl6YXRpb25QYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvQ3VzdG9taXphdGlvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjY3MGJmLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvQ3VzdG9taXphdGlvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yT3B0aW9uczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuV1NETE1vZGVsSW5mbzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsLlByb2Nlc3NvckVudmlyb25tZW50OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSkFYV1NVdGlsczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuamF4d3MuSkFYV1NCaW5kaW5nc0NvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi0vKioKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXphdGlvblBhcnNlciBleHRlbmRzIElucHV0UGFyc2VyIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbnRpdHlSZXNvbHZlcgotICAgICAqIEBwYXJhbSBlbnYKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBDdXN0b21pemF0aW9uUGFyc2VyKEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyLCBQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYsIFByb3BlcnRpZXMgb3B0aW9ucykgewotICAgICAgICBzdXBlcihlbnYsIG9wdGlvbnMpOwotICAgICAgICB0aGlzLmVudGl0eVJlc29sdmVyID0gZW50aXR5UmVzb2x2ZXI7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLnBhcnNlci5JbnB1dFBhcnNlciNwYXJzZShqYXZhLmlvLkZpbGVbXSwgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBwYXJzZShMaXN0PFN0cmluZz4gaW5wdXRGaWxlcykgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgLy9GaWxlIHdzZGxGaWxlID0gaW5wdXRGaWxlc1swXTsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oZ2V0RW52KCkpOwotICAgICAgICB3c2RsTW9kZWxJbmZvID0gbmV3IFdTRExNb2RlbEluZm8oKTsKLSAgICAgICAgd3NkbE1vZGVsSW5mby5zZXRMb2NhdGlvbihpbnB1dEZpbGVzLmdldCgwKSk7Ci0gICAgICAgIGlmKF9vcHRpb25zLmdldChQcm9jZXNzb3JPcHRpb25zLldTRExfTE9DQVRJT04pID09IG51bGwpCi0gICAgICAgICAgICBfb3B0aW9ucy5zZXRQcm9wZXJ0eShQcm9jZXNzb3JPcHRpb25zLldTRExfTE9DQVRJT04sIGlucHV0RmlsZXMuZ2V0KDApKTsKLQotICAgICAgICAvL21vZGVsSW5mb1BhcnNlciA9IChKQVhXU0JpbmRpbmdJbmZvUGFyc2VyKWdldE1vZGVsSW5mb1BhcnNlcnMoKS5nZXQoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUyk7Ci0gICAgICAgIG1vZGVsSW5mb1BhcnNlciA9IG5ldyBKQVhXU0JpbmRpbmdJbmZvUGFyc2VyKGdldEVudigpKTsKLQotICAgICAgICAvL2dldCB0aGUgamF4d3MgYmluZGluZ2QgZmlsZSBhbmQgYWRkIGl0IHRvIHRoZSBtb2RlbEluZm8KLSAgICAgICAgU2V0PFN0cmluZz4gYmluZGluZ0ZpbGVzID0gKFNldDxTdHJpbmc+KV9vcHRpb25zLmdldChQcm9jZXNzb3JPcHRpb25zLkJJTkRJTkdfRklMRVMpOwotICAgICAgICBmb3IoU3RyaW5nIGJpbmRpbmdGaWxlIDogYmluZGluZ0ZpbGVzKXsKLSAgICAgICAgICAgIGFkZEJpbmRpbmcoYmluZGluZ0ZpbGUpOwotICAgICAgICB9Ci0KLQotICAgICAgICBmb3IoSW5wdXRTb3VyY2UgamF4d3NCaW5kaW5nIDogamF4d3NCaW5kaW5ncyl7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBtb2RlbEluZm9QYXJzZXIucGFyc2UoamF4d3NCaW5kaW5nKTsKLSAgICAgICAgICAgIGlmKGRvYyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICB3c2RsTW9kZWxJbmZvLnB1dEpBWFdTQmluZGluZ3MoamF4d3NCaW5kaW5nLmdldFN5c3RlbUlkKCksIGRvYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL2NvcHkgamF4YiBiaW5kaW5nIHNvdXJjZXMgaW4gbW9kZWxJbmZvCi0gICAgICAgIGZvcihJbnB1dFNvdXJjZSBqYXhiQmluZGluZyA6IGpheGJCaW5kaW5ncyl7Ci0gICAgICAgICAgICB3c2RsTW9kZWxJbmZvLmFkZEpBWEJCSW5kaW5ncyhqYXhiQmluZGluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRIYW5kbGVyQ2hhaW5JbmZvKCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TW9kZWxJbmZvKHdzZGxNb2RlbEluZm8pOwotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQmluZGluZyhTdHJpbmcgYmluZGluZ0xvY2F0aW9uKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBKQVhXU1V0aWxzLmNoZWNrQWJzb2x1dGVuZXNzKGJpbmRpbmdMb2NhdGlvbik7Ci0gICAgICAgIElucHV0U291cmNlIGlzID0gbnVsbDsKLSAgICAgICAgaWYoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICBpcyA9IGVudGl0eVJlc29sdmVyLnJlc29sdmVFbnRpdHkobnVsbCwgYmluZGluZ0xvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZihpcyA9PSBudWxsKQotICAgICAgICAgICAgaXMgPSBuZXcgSW5wdXRTb3VyY2UoYmluZGluZ0xvY2F0aW9uKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZUZyZXNoWE1MU3RyZWFtUmVhZGVyKGlzLCB0cnVlKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgaWYocmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUykpewotICAgICAgICAgICAgamF4d3NCaW5kaW5ncy5hZGQoaXMpOwotICAgICAgICB9ZWxzZSBpZihyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLkpBWEJfQklORElOR1MpKXsKLSAgICAgICAgICAgIGpheGJCaW5kaW5ncy5hZGQoaXMpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHdhcm4oImNvbmZpZ3VyYXRpb24ubm90QmluZGluZ0ZpbGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRIYW5kbGVyQ2hhaW5JbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgLy9zZXR1cCBoYW5kbGVyIGNoYWluIGluZm8KLSAgICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIERvY3VtZW50PiBlbnRyeTp3c2RsTW9kZWxJbmZvLmdldEpBWFdTQmluZGluZ3MoKS5lbnRyeVNldCgpKXsKLSAgICAgICAgICAgIEVsZW1lbnQgZSA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBOb2RlTGlzdCBubCA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgImhhbmRsZXItY2hhaW5zIik7Ci0gICAgICAgICAgICBpZihubC5nZXRMZW5ndGgoKT09IDApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAvL3Rha2UgdGhlIGZpcnN0IG9uZSwgYW55d2F5IGl0cyAxIGhhbmRsZXItY29uZmlnIHBlciBjdXN0b21pemF0aW9uCi0gICAgICAgICAgICBFbGVtZW50IGhjID0gKEVsZW1lbnQpbmwuaXRlbSgwKTsKLSAgICAgICAgICAgIHdzZGxNb2RlbEluZm8uc2V0SGFuZGxlckNvbmZpZyhoYyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFdTRExNb2RlbEluZm8gd3NkbE1vZGVsSW5mbzsKLSAgICBwcml2YXRlIEpBWFdTQmluZGluZ0luZm9QYXJzZXIgbW9kZWxJbmZvUGFyc2VyOwotICAgIHByaXZhdGUgU2V0PElucHV0U291cmNlPiBqYXh3c0JpbmRpbmdzID0gbmV3IEhhc2hTZXQ8SW5wdXRTb3VyY2U+KCk7Ci0gICAgcHJpdmF0ZSBTZXQ8SW5wdXRTb3VyY2U+IGpheGJCaW5kaW5ncyA9IG5ldyBIYXNoU2V0PElucHV0U291cmNlPigpOwotICAgIHByaXZhdGUgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvSW5wdXRQYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvSW5wdXRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlMmIwOC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvcGFyc2VyL0lucHV0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFZpdmVrIFBhbmRleQotICoKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnB1dFBhcnNlcnsKLSAgICBwcm90ZWN0ZWQgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBfbWVzc2FnZUZhY3RvcnkgPQotICAgICAgICBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgKLSAgICAgICAgICAgICJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5jb25maWd1cmF0aW9uIik7Ci0KLSAgICBwdWJsaWMgSW5wdXRQYXJzZXIoUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52LCBQcm9wZXJ0aWVzIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5fZW52ID0gZW52OwotICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgX21vZGVsSW5mb1BhcnNlcnMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgT2JqZWN0PigpOwotCi0vLyAgICAgICAgLyoKLS8vICAgICAgICAgKiBMb2FkIG1vZGVsaW5mbyBwYXJzZXJzIGZyb20gdGhlIHBsdWdpbnMgd2hpY2ggd2FudCB0byBleHRlbmQKLS8vICAgICAgICAgKiB0aGlzIGZ1bmN0aW9uYWxpdHkKLS8vICAgICAgICAgKi8KLS8vICAgICAgICBJdGVyYXRvciBpID0gVG9vbFBsdWdpbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpb25zKAotLy8gICAgICAgICAgICBUb29sUGx1Z2luQ29uc3RhbnRzLldTQ09NUElMRV9QTFVHSU4sCi0vLyAgICAgICAgICAgIFRvb2xQbHVnaW5Db25zdGFudHMuV1NDT01QSUxFX01PREVMX0lORk9fRVhUX1BPSU5UKTsKLS8vICAgICAgICB3aGlsZShpICE9IG51bGwgJiYgaS5oYXNOZXh0KCkpIHsKLS8vICAgICAgICAgICAgTW9kZWxJbmZvUGx1Z2luIHBsdWdpbiA9IChNb2RlbEluZm9QbHVnaW4paS5uZXh0KCk7Ci0vLyAgICAgICAgICAgIF9tb2RlbEluZm9QYXJzZXJzLnB1dChwbHVnaW4uZ2V0TW9kZWxJbmZvTmFtZSgpLAotLy8gICAgICAgICAgICAgICAgcGx1Z2luLmNyZWF0ZU1vZGVsSW5mb1BhcnNlcihlbnYpKTsKLS8vICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gcGFyc2UoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIC8vVE9ETzogTm90IGltcGxlbWVudGVkIGV4Y2VwdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBwYXJzZShJbnB1dFNvdXJjZSBpcykgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgLy9UT0RPOiBOb3QgaW1wbGVtZW50ZWQgZXhjZXB0aW9uCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uIHBhcnNlKExpc3Q8U3RyaW5nPiBpbnB1dFNvdXJjZXMpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIC8vVE9ETzogTm90IGltcGxlbWVudGVkIGV4Y2VwdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIF9lbnYuCi0gICAgICovCi0gICAgcHVibGljICBQcm9jZXNzb3JFbnZpcm9ubWVudCBnZXRFbnYoKXsKLSAgICAgICAgcmV0dXJuIF9lbnY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVudiBUaGUgUHJvY2Vzc29yRW52aXJvbm1lbnQgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudihQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpewotICAgICAgICB0aGlzLl9lbnYgPSBlbnY7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FybihTdHJpbmcga2V5KSB7Ci0gICAgICAgIF9lbnYud2FybihfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXkpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3YXJuKFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLSAgICAgICAgX2Vudi53YXJuKF9tZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSwgYXJnKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FybihTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIF9lbnYud2FybihfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXksIGFyZ3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbmZvKFN0cmluZyBrZXkpIHsKLSAgICAgICAgX2Vudi5pbmZvKF9tZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluZm8oU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgewotICAgICAgICBfZW52LmluZm8oX21lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5LCBhcmcpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvY2Vzc29yRW52aXJvbm1lbnQgX2VudjsKLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBfb3B0aW9uczsKLSAgICBwcm90ZWN0ZWQgTWFwPFFOYW1lLCBPYmplY3Q+IF9tb2RlbEluZm9QYXJzZXJzOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL3BhcnNlci9KQVhXU0JpbmRpbmdJbmZvUGFyc2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvcGFyc2VyL0pBWFdTQmluZGluZ0luZm9QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlNTYwZi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvcGFyc2VyL0pBWFdTQmluZGluZ0luZm9QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWwueG1sLk51bGxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKgotICogRXh0ZXJuYWwgamF4d3M6YmluZGluZ3MgcGFyc2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhXU0JpbmRpbmdJbmZvUGFyc2VyIHsKLQotICAgIHByaXZhdGUgUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52OwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVudgotICAgICAqLwotICAgIHB1YmxpYyBKQVhXU0JpbmRpbmdJbmZvUGFyc2VyKFByb2Nlc3NvckVudmlyb25tZW50IGVudikgewotICAgICAgICB0aGlzLmVudiA9IGVudjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgcGFyc2UoSW5wdXRTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgYnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICBidWlsZGVyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXJyKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IE51bGxFbnRpdHlSZXNvbHZlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnBhcnNlKHNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzaW5nLnBhcnNlckNvbmZpZ0V4Y2VwdGlvbiIsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzaW5nLmZhY3RvcnlDb25maWdFeGNlcHRpb24iLGUpOwotICAgICAgICB9Y2F0Y2goU0FYRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzaW5nLnNheEV4Y2VwdGlvbiIsZSk7Ci0gICAgICAgIH1jYXRjaChJT0V4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigicGFyc2luZy5zYXhFeGNlcHRpb24iLGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFNldDxFbGVtZW50PiBvdXRlckJpbmRpbmdzID0gbmV3IEhhc2hTZXQ8RWxlbWVudD4oKTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvUGFyc2VyVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL3BhcnNlci9QYXJzZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YjE4YzguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvY29uZmlnL3BhcnNlci9QYXJzZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5wYXJzZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFJlYWRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlclV0aWwgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmYWlsV2l0aEZ1bGxOYW1lKFN0cmluZyBrZXksIFN0cmluZyBmaWxlLCBYTUxSZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGtleSwgbmV3IE9iamVjdFtdIHsgZmlsZSwgSW50ZWdlci50b1N0cmluZygKLSAgICAgICAgICAgIHJlYWRlci5nZXRMaW5lTnVtYmVyKCkpLCByZWFkZXIuZ2V0TmFtZSgpLnRvU3RyaW5nKCkgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZhaWxXaXRoRnVsbE5hbWUoU3RyaW5nIGtleSwgU3RyaW5nIGZpbGUsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oa2V5LCBuZXcgT2JqZWN0W10geyBmaWxlLCBJbnRlZ2VyLnRvU3RyaW5nKAotICAgICAgICAgICAgcmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpKSwgcmVhZGVyLmdldE5hbWUoKS50b1N0cmluZygpIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvUmVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9jb25maWcvcGFyc2VyL1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDlhMTAwLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2NvbmZpZy9wYXJzZXIvUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLnBhcnNlcjsKLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkpBWFdTVXRpbHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LldTRExDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlckZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlclV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi0vKioKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKgotICogTWFpbiBlbnRyeSBwb2ludCBmcm9tIENvbXBpbGVUb29sCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkZXIgewotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVhZGVyKFByb2Nlc3NvckVudmlyb25tZW50IGVudiwgUHJvcGVydGllcyBvcHRpb25zKSB7Ci0gICAgICAgIHRoaXMuX2VudiA9IGVudjsKLSAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb24gcGFyc2UoRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIsIExpc3Q8U3RyaW5nPiBpbnB1dFNvdXJjZXMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9yZXNldCB0aGUgaW5wdXQgdHlwZSBmbGFncyBiZWZvcmUgcGFyc2luZwotICAgICAgICBpc0NsYXNzRmlsZSA9IGZhbHNlOwotCi0gICAgICAgIElucHV0UGFyc2VyIHBhcnNlciA9IG51bGw7Ci0gICAgICAgIC8vbm93IGl0cyBqdXN0IHRoZSBmaXJzdCBmaWxlLiBkbyB3ZSBleHBlY3QgbW9yZSB0aGFuIG9uZSBpbnB1dCBmaWxlcz8KLSAgICAgICAgdmFsaWRhdGVJbnB1dChpbnB1dFNvdXJjZXMuZ2V0KDApKTsKLQotICAgICAgICBpZihpc0NsYXNzRmlsZSl7Ci0gICAgICAgICAgICBwYXJzZXIgPSBuZXcgQ2xhc3NNb2RlbFBhcnNlcihfZW52LCBfb3B0aW9ucyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJzZXIgPSBuZXcgQ3VzdG9taXphdGlvblBhcnNlcihlbnRpdHlSZXNvbHZlciwgX2VudiwgX29wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5wdXRTb3VyY2VzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlucHV0KFN0cmluZyBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBpZihpc0NsYXNzKGZpbGUpKXsKLSAgICAgICAgICAgIGlzQ2xhc3NGaWxlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0vLyAgICAgICAgSkFYV1NVdGlscy5jaGVja0Fic29sdXRlbmVzcyhmaWxlKTsKLS8vICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChmaWxlKTsKLS8vCi0vLyAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9Ci0vLyAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpLCB0cnVlKTsKLS8vCi0vLyAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLS8vICAgICAgICBpZighcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9ERUZJTklUSU9OUykpewotLy8gICAgICAgICAgICAvL3dlIGFyZSBoZXJlLCBtZWFucyBpbnZhbGlkIGVsZW1lbnQKLS8vICAgICAgICAgICAgUGFyc2VyVXRpbC5mYWlsV2l0aEZ1bGxOYW1lKCJjb25maWd1cmF0aW9uLmludmFsaWRFbGVtZW50IiwgZmlsZSwgcmVhZGVyKTsKLS8vICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBfZW52LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbGFzc0ZpbGU7Ci0KLSAgICBwcm90ZWN0ZWQgUHJvY2Vzc29yRW52aXJvbm1lbnQgX2VudjsKLQotICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIF9vcHRpb25zOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0N1c3RvbUV4Y2VwdGlvbkdlbmVyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0N1c3RvbUV4Y2VwdGlvbkdlbmVyYXRvci5qYXZhCmluZGV4IDQ3MjZhNDcuLmE5MzNmYWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9DdXN0b21FeGNlcHRpb25HZW5lcmF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvQ3VzdG9tRXhjZXB0aW9uR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTYgKzI1LDI4IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yOwogCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5DbGFzc1R5cGU7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkFubm90YXRpb25Vc2U7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkJsb2NrOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ2xhc3NBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpEZWZpbmVkQ2xhc3M7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkV4cHI7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkZpZWxkUmVmOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpGaWVsZFZhcjsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KTWV0aG9kOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpNb2Q7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlR5cGU7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlZhcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5GYXVsdDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRPcHRpb25zOwogCiBpbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKIC8qKgogICoKQEAgLTQzLDM5ICs1NSwyNSBAQAogcHVibGljIGNsYXNzIEN1c3RvbUV4Y2VwdGlvbkdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvckJhc2UgewogICAgIHByaXZhdGUgTWFwPFN0cmluZywgSkNsYXNzPiBmYXVsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpDbGFzcz4oKTsKIAotICAgIHB1YmxpYyBDdXN0b21FeGNlcHRpb25HZW5lcmF0b3IoKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKE1vZGVsIG1vZGVsLAorICAgICAgICBXc2ltcG9ydE9wdGlvbnMgb3B0aW9ucywKKyAgICAgICAgRXJyb3JSZWNlaXZlciByZWNlaXZlcil7CisgICAgICAgIEN1c3RvbUV4Y2VwdGlvbkdlbmVyYXRvciBleGNlcHRpb25HZW4gPSBuZXcgQ3VzdG9tRXhjZXB0aW9uR2VuZXJhdG9yKG1vZGVsLCBvcHRpb25zLCByZWNlaXZlcik7CisgICAgICAgIGV4Y2VwdGlvbkdlbi5kb0dlbmVyYXRpb24oKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgR2VuZXJhdG9yQmFzZSBnZXRHZW5lcmF0b3IoCisgICAgcHJpdmF0ZSBDdXN0b21FeGNlcHRpb25HZW5lcmF0b3IoCiAgICAgICAgIE1vZGVsIG1vZGVsLAotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZywKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRXhjZXB0aW9uR2VuZXJhdG9yKG1vZGVsLCBjb25maWcsIHByb3BlcnRpZXMpOworICAgICAgICBXc2ltcG9ydE9wdGlvbnMgb3B0aW9ucywKKyAgICAgICAgRXJyb3JSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICBzdXBlcihtb2RlbCwgb3B0aW9ucywgcmVjZWl2ZXIpOwogICAgIH0KIAotICAgIHB1YmxpYyBHZW5lcmF0b3JCYXNlIGdldEdlbmVyYXRvcigKLSAgICAgICAgTW9kZWwgbW9kZWwsCi0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnLAotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgIFNPQVBWZXJzaW9uIHZlcikgewotICAgICAgICByZXR1cm4gbmV3IEN1c3RvbUV4Y2VwdGlvbkdlbmVyYXRvcihtb2RlbCwgY29uZmlnLCBwcm9wZXJ0aWVzKTsKKyAgICBwdWJsaWMgR2VuZXJhdG9yQmFzZSBnZXRHZW5lcmF0b3IoTW9kZWwgbW9kZWwsIFdzaW1wb3J0T3B0aW9ucyBvcHRpb25zLCBFcnJvclJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRXhjZXB0aW9uR2VuZXJhdG9yKG1vZGVsLCBvcHRpb25zLCByZWNlaXZlcik7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIEN1c3RvbUV4Y2VwdGlvbkdlbmVyYXRvcigKLSAgICAgICAgTW9kZWwgbW9kZWwsCi0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnLAotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgc3VwZXIobW9kZWwsIGNvbmZpZywgcHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlVmlzaXRNb2RlbChNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9zdFZpc2l0TW9kZWwoTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmYXVsdHMgPSBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZVZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpIHRocm93cyBFeGNlcHRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEZhdWx0IGZhdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzUmVnaXN0ZXJlZChmYXVsdCkpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIHJlZ2lzdGVyRmF1bHQoZmF1bHQpOwpAQCAtOTMsMTMgKzkxLDEzIEBACiAgICAgICAgICB0cnkgewogICAgICAgICAgICAgd3JpdGUoZmF1bHQpOwogICAgICAgICAgICAgZmF1bHRzLnB1dChmYXVsdC5nZXRKYXZhRXhjZXB0aW9uKCkuZ2V0TmFtZSgpLCBmYXVsdC5nZXRFeGNlcHRpb25DbGFzcygpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSkNsYXNzQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhdG9yRXhjZXB0aW9uKCJnZW5lcmF0b3IubmVzdGVkR2VuZXJhdG9yRXJyb3IiLGUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKEZhdWx0IGZhdWx0KSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZW52LmdldE5hbWVzKCkuY3VzdG9tRXhjZXB0aW9uQ2xhc3NOYW1lKGZhdWx0KTsKKyAgICBwcml2YXRlIHZvaWQgd3JpdGUoRmF1bHQgZmF1bHQpIHRocm93cyBKQ2xhc3NBbHJlYWR5RXhpc3RzRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IE5hbWVzLmN1c3RvbUV4Y2VwdGlvbkNsYXNzTmFtZShmYXVsdCk7CiAKICAgICAgICAgSkRlZmluZWRDbGFzcyBjbHMgPSBjbS5fY2xhc3MoY2xhc3NOYW1lLCBDbGFzc1R5cGUuQ0xBU1MpOwogICAgICAgICBKRG9jQ29tbWVudCBjb21tZW50ID0gY2xzLmphdmFkb2MoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9HZW5lcmF0b3JCYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvR2VuZXJhdG9yQmFzZS5qYXZhCmluZGV4IDQ5MzgyY2YuLjljZWU0NzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9HZW5lcmF0b3JCYXNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0dlbmVyYXRvckJhc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyMCArMjUsMTIgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3I7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5Qcm9jZXNzb3JBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yT3B0aW9uczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuV1NETE1vZGVsSW5mbzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuQ2xhc3NUeXBlOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpBbm5vdGF0aW9uVXNlOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkNvZGVNb2RlbDsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KRGVmaW5lZENsYXNzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuVG9vbFZlcnNpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuQmxvY2s7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuRmF1bHQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7CkBAIC00OSwyNyArNDEsMjUgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5SZXF1ZXN0OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlJlc3BvbnNlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlNlcnZpY2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCVHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLkpBWEJUeXBlVmlzaXRvcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLlJwY0xpdFN0cnVjdHVyZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsLkluZGVudGluZ1dyaXRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsLlByb2Nlc3NvckVudmlyb25tZW50OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuRGlyZWN0b3J5VXRpbDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsLkdlbmVyYXRlZEZpbGVJbmZvOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuVG9vbFZlcnNpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQVmVyc2lvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuSW5kZW50aW5nV3JpdGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRPcHRpb25zOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuKjsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwogCiBpbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICoKQEAgLTc4LDE3MyArNjgsNTMgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3JCYXNlCiAgICAgaW1wbGVtZW50cwogICAgICAgICBHZW5lcmF0b3JDb25zdGFudHMsCi0gICAgICAgIFByb2Nlc3NvckFjdGlvbiwKLSAgICAgICAgTW9kZWxWaXNpdG9yLAotICAgICAgICBKQVhCVHlwZVZpc2l0b3IgewotICAgIHByb3RlY3RlZCBGaWxlIHNvdXJjZURpcjsKLSAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RGlyOwotICAgIHByb3RlY3RlZCBGaWxlIG5vbmNsYXNzRGVzdERpcjsKLSAgICBwcm90ZWN0ZWQgUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52OwotICAgIHByb3RlY3RlZCBNb2RlbCBtb2RlbDsKLSAgICBwcm90ZWN0ZWQgU2VydmljZSBzZXJ2aWNlOwotICAgIHByb3RlY3RlZCBTT0FQVmVyc2lvbiBjdXJTT0FQVmVyc2lvbjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldFZlcnNpb247CisgICAgICAgIE1vZGVsVmlzaXRvcnsKKyAgICBwcml2YXRlIEZpbGUgZGVzdERpcjsKKyAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRWZXJzaW9uOwogICAgIHByb3RlY3RlZCBib29sZWFuIGRvbm90T3ZlcnJpZGU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlUGFja2FnZTsKICAgICBwcm90ZWN0ZWQgSkNvZGVNb2RlbCBjbTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmludFN0YWNrVHJhY2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB3c2RsTG9jYXRpb247CisgICAgcHJvdGVjdGVkIGZpbmFsIE1vZGVsIG1vZGVsOworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgd3NkbExvY2F0aW9uOworICAgIHByb3RlY3RlZCBmaW5hbCBFcnJvclJlY2VpdmVyIHJlY2VpdmVyOworICAgIHByb3RlY3RlZCBmaW5hbCBXc2ltcG9ydE9wdGlvbnMgb3B0aW9uczsKIAotICAgIHByaXZhdGUgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeTsKLQotICAgIHB1YmxpYyBHZW5lcmF0b3JCYXNlKCkgewotICAgICAgICBzb3VyY2VEaXIgPSBudWxsOwotICAgICAgICBkZXN0RGlyID0gbnVsbDsKLSAgICAgICAgbm9uY2xhc3NEZXN0RGlyID0gbnVsbDsKLSAgICAgICAgZW52ID0gbnVsbDsKLSAgICAgICAgbW9kZWwgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm0oCi0gICAgICAgIE1vZGVsIG1vZGVsLAotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZywKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIEdlbmVyYXRvckJhc2UgZ2VuZXJhdG9yID0gZ2V0R2VuZXJhdG9yKG1vZGVsLCBjb25maWcsIHByb3BlcnRpZXMpOwotCi0gICAgICAgIGdlbmVyYXRvci5kb0dlbmVyYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgR2VuZXJhdG9yQmFzZSBnZXRHZW5lcmF0b3IoCi0gICAgICAgIE1vZGVsIG1vZGVsLAotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZywKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgR2VuZXJhdG9yQmFzZSBnZXRHZW5lcmF0b3IoCi0gICAgICAgIE1vZGVsIG1vZGVsLAotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZywKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICBTT0FQVmVyc2lvbiB2ZXIpOwotCi0gICAgcHJvdGVjdGVkIEdlbmVyYXRvckJhc2UoCi0gICAgICAgIE1vZGVsIG1vZGVsLAotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZywKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0KKyAgICBwcm90ZWN0ZWQgR2VuZXJhdG9yQmFzZShNb2RlbCBtb2RlbCwgV3NpbXBvcnRPcHRpb25zIG9wdGlvbnMsIEVycm9yUmVjZWl2ZXIgcmVjZWl2ZXIpewogICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0KLSAgICAgICAgaWYobW9kZWwuZ2V0SkFYQk1vZGVsKCkuZ2V0UzJKSkFYQk1vZGVsKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIGNtID0gbW9kZWwuZ2V0SkFYQk1vZGVsKCkuZ2V0UzJKSkFYQk1vZGVsKCkuZ2VuZXJhdGVDb2RlKG51bGwsIG5ldyBKQVhCVHlwZUdlbmVyYXRvci5KQVhCRXJyb3JMaXN0ZW5lcigpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY20gPSBuZXcgSkNvZGVNb2RlbCgpOwotCi0gICAgICAgIHRoaXMuZW52ID0gKFByb2Nlc3NvckVudmlyb25tZW50KSBjb25maWcuZ2V0RW52aXJvbm1lbnQoKTsKLSAgICAgICAgU3RyaW5nIGtleSA9IFByb2Nlc3Nvck9wdGlvbnMuREVTVElOQVRJT05fRElSRUNUT1JZX1BST1BFUlRZOwotICAgICAgICBTdHJpbmcgZGlyUGF0aCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgdGhpcy5kZXN0RGlyID0gbmV3IEZpbGUoZGlyUGF0aCk7Ci0gICAgICAgIGtleSA9IFByb2Nlc3Nvck9wdGlvbnMuU09VUkNFX0RJUkVDVE9SWV9QUk9QRVJUWTsKLSAgICAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgIHRoaXMuc291cmNlRGlyID0gbmV3IEZpbGUoc291cmNlUGF0aCk7Ci0gICAgICAgIGtleSA9IFByb2Nlc3Nvck9wdGlvbnMuTk9OQ0xBU1NfREVTVElOQVRJT05fRElSRUNUT1JZX1BST1BFUlRZOwotICAgICAgICBTdHJpbmcgbm9uY2xhc3NEZXN0UGF0aCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgdGhpcy5ub25jbGFzc0Rlc3REaXIgPSBuZXcgRmlsZShub25jbGFzc0Rlc3RQYXRoKTsKLSAgICAgICAgaWYgKG5vbmNsYXNzRGVzdERpciA9PSBudWxsKQotICAgICAgICAgICAgbm9uY2xhc3NEZXN0RGlyID0gZGVzdERpcjsKLSAgICAgICAgbWVzc2FnZUZhY3RvcnkgPQotICAgICAgICAgICAgbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLmdlbmVyYXRvciIpOwotICAgICAgICB0aGlzLnRhcmdldFZlcnNpb24gPQotICAgICAgICAgICAgcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQcm9jZXNzb3JPcHRpb25zLkpBWFdTX1NPVVJDRV9WRVJTSU9OKTsKLSAgICAgICAga2V5ID0gUHJvY2Vzc29yT3B0aW9ucy5ET05PVF9PVkVSV1JJVEVfQ0xBU1NFUzsKLSAgICAgICAgdGhpcy5kb25vdE92ZXJyaWRlID0KLSAgICAgICAgICAgIEJvb2xlYW4udmFsdWVPZihwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSkpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB0aGlzLnByaW50U3RhY2tUcmFjZSA9IEJvb2xlYW4udmFsdWVPZihwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuUFJJTlRfU1RBQ0tfVFJBQ0VfUFJPUEVSVFkpKTsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuV1NETF9MT0NBVElPTik7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuZGVzdERpciA9IG9wdGlvbnMuZGVzdERpcjsKKyAgICAgICAgdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyOworICAgICAgICB0aGlzLndzZGxMb2NhdGlvbiA9IG9wdGlvbnMud3NkbExvY2F0aW9uOworICAgICAgICB0aGlzLnRhcmdldFZlcnNpb24gPSBvcHRpb25zLnRhcmdldC5nZXRWZXJzaW9uKCk7CisgICAgICAgIHRoaXMuY20gPSBvcHRpb25zLmdldENvZGVNb2RlbCgpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGRvR2VuZXJhdGlvbigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1vZGVsLmFjY2VwdCh0aGlzKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlbnYudmVyYm9zZSgpKQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhdG9yRXhjZXB0aW9uKCJnZW5lcmF0b3IubmVzdGVkR2VuZXJhdG9yRXJyb3IiLGUpOworICAgICAgICAgICAgcmVjZWl2ZXIuZXJyb3IoZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB2aXNpdChNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByZVZpc2l0TW9kZWwobW9kZWwpOwotICAgICAgICB2aXNpdE1vZGVsKG1vZGVsKTsKLSAgICAgICAgcG9zdFZpc2l0TW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZVZpc2l0TW9kZWwoTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0TW9kZWwoTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlbnYuZ2V0TmFtZXMoKS5yZXNldFByZWZpeEZhY3RvcnkoKTsKICAgICAgICAgZm9yIChTZXJ2aWNlIHNlcnZpY2UgOiBtb2RlbC5nZXRTZXJ2aWNlcygpKSB7CiAgICAgICAgICAgICBzZXJ2aWNlLmFjY2VwdCh0aGlzKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHBvc3RWaXNpdE1vZGVsKE1vZGVsIG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB2aXNpdChTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcmVWaXNpdFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgcG9zdFZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVWaXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZVBhY2thZ2UgPSBOYW1lcy5nZXRQYWNrYWdlTmFtZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLS8vICAgICAgICBJdGVyYXRvciBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKICAgICAgICAgZm9yIChQb3J0IHBvcnQgOiBzZXJ2aWNlLmdldFBvcnRzKCkpIHsKICAgICAgICAgICAgIHBvcnQuYWNjZXB0KHRoaXMpOwogICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9zdFZpc2l0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvciBleHRyYVR5cGVzID0gbW9kZWwuZ2V0RXh0cmFUeXBlcygpOwotICAgICAgICB3aGlsZSAoZXh0cmFUeXBlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEFic3RyYWN0VHlwZSB0eXBlID0gKEFic3RyYWN0VHlwZSkgZXh0cmFUeXBlcy5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZVBhY2thZ2UgPSBudWxsOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnQgcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByZVZpc2l0UG9ydChwb3J0KTsKLSAgICAgICAgdmlzaXRQb3J0KHBvcnQpOwotICAgICAgICBwb3N0VmlzaXRQb3J0KHBvcnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZVZpc2l0UG9ydChQb3J0IHBvcnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjdXJTT0FQVmVyc2lvbiA9IHBvcnQuZ2V0U09BUFZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnQoUG9ydCBwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChPcGVyYXRpb24gb3BlcmF0aW9uIDogcG9ydC5nZXRPcGVyYXRpb25zKCkpIHsKICAgICAgICAgICAgIG9wZXJhdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0VmlzaXRQb3J0KFBvcnQgcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGN1clNPQVBWZXJzaW9uID0gbnVsbDsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB2aXNpdChPcGVyYXRpb24gb3BlcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJlVmlzaXRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgdmlzaXRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgcG9zdFZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlVmlzaXRPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG9wZXJhdGlvbi5nZXRSZXF1ZXN0KCkuYWNjZXB0KHRoaXMpOwogICAgICAgICBpZiAob3BlcmF0aW9uLmdldFJlc3BvbnNlKCkgIT0gbnVsbCkKICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRSZXNwb25zZSgpLmFjY2VwdCh0aGlzKTsKQEAgLTI1OCwxNjEgKzEyOCwyMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9zdFZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHZpc2l0KFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByZVZpc2l0UGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgdmlzaXRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICBwb3N0VmlzaXRQYXJhbWV0ZXIocGFyYW0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZVZpc2l0UGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0VmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB2aXNpdChCbG9jayBibG9jaykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByZVZpc2l0QmxvY2soYmxvY2spOwotICAgICAgICB2aXNpdEJsb2NrKGJsb2NrKTsKLSAgICAgICAgcG9zdFZpc2l0QmxvY2soYmxvY2spOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZVZpc2l0QmxvY2soQmxvY2sgYmxvY2spIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0QmxvY2soQmxvY2sgYmxvY2spIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvc3RWaXNpdEJsb2NrKEJsb2NrIGJsb2NrKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB2aXNpdChSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByZVZpc2l0UmVzcG9uc2UocmVzcG9uc2UpOwotICAgICAgICB2aXNpdFJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICAgICAgcG9zdFZpc2l0UmVzcG9uc2UocmVzcG9uc2UpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHByZVZpc2l0UmVzcG9uc2UoUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0UmVzcG9uc2UoUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvciBpdGVyID0gcmVzcG9uc2UuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICBBYnN0cmFjdFR5cGUgdHlwZTsKLSAgICAgICAgQmxvY2sgYmxvY2s7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgKChQYXJhbWV0ZXIpIGl0ZXIubmV4dCgpKS5hY2NlcHQodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaXRlciA9IHJlc3BvbnNlLmdldEJvZHlCbG9ja3MoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBibG9jayA9IChCbG9jaykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB0eXBlID0gYmxvY2suZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIEpBWEJUeXBlKQotICAgICAgICAgICAgICAgICgoSkFYQlR5cGUpIHR5cGUpLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgICAgIGVsc2UgaWYodHlwZSBpbnN0YW5jZW9mIFJwY0xpdFN0cnVjdHVyZSkKLSAgICAgICAgICAgICAgICAoKFJwY0xpdFN0cnVjdHVyZSkgdHlwZSkuYWNjZXB0KHRoaXMpOwotCi0gICAgICAgICAgICByZXNwb25zZUJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgaXRlciA9IHJlc3BvbnNlLmdldEhlYWRlckJsb2NrcygpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGJsb2NrID0gKEJsb2NrKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHR5cGUgPSBibG9jay5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZih0eXBlIGluc3RhbmNlb2YgSkFYQlR5cGUpCi0gICAgICAgICAgICAgICAgKChKQVhCVHlwZSkgdHlwZSkuYWNjZXB0KHRoaXMpOwotICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJCbG9jayhibG9jayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2F0dGFjaG1lbnQKLSAgICAgICAgaXRlciA9IHJlc3BvbnNlLmdldEF0dGFjaG1lbnRCbG9ja3MoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBibG9jayA9IChCbG9jaykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB0eXBlID0gYmxvY2suZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIEpBWEJUeXBlKQotICAgICAgICAgICAgICAgICgoSkFYQlR5cGUpIHR5cGUpLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgICAgIHJlc3BvbnNlQXR0YWNobWVudEJsb2NrKGJsb2NrKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzcG9uc2VCb2R5QmxvY2soQmxvY2sgYmxvY2spIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlc3BvbnNlSGVhZGVyQmxvY2soQmxvY2sgYmxvY2spIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlc3BvbnNlQXR0YWNobWVudEJsb2NrKEJsb2NrIGJsb2NrKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0VmlzaXRSZXNwb25zZShSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQogCiAgICAgcHVibGljIHZvaWQgdmlzaXQoUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJlVmlzaXRSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB2aXNpdFJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgIHBvc3RWaXNpdFJlcXVlc3QocmVxdWVzdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlVmlzaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSByZXF1ZXN0LmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgQWJzdHJhY3RUeXBlIHR5cGU7Ci0gICAgICAgIEJsb2NrIGJsb2NrOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICgoUGFyYW1ldGVyKSBpdGVyLm5leHQoKSkuYWNjZXB0KHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGl0ZXIgPSByZXF1ZXN0LmdldEJvZHlCbG9ja3MoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBibG9jayA9IChCbG9jaykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB0eXBlID0gYmxvY2suZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIEpBWEJUeXBlKQotICAgICAgICAgICAgICAgICgoSkFYQlR5cGUpIHR5cGUpLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgICAgIGVsc2UgaWYodHlwZSBpbnN0YW5jZW9mIFJwY0xpdFN0cnVjdHVyZSkKLSAgICAgICAgICAgICAgICAoKFJwY0xpdFN0cnVjdHVyZSkgdHlwZSkuYWNjZXB0KHRoaXMpOwotICAgICAgICAgICAgcmVxdWVzdEJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgaXRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyQmxvY2tzKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgYmxvY2sgPSAoQmxvY2spIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgdHlwZSA9IGJsb2NrLmdldFR5cGUoKTsKLSAgICAgICAgICAgIGlmKHR5cGUgaW5zdGFuY2VvZiBKQVhCVHlwZSkKLSAgICAgICAgICAgICAgICAoKEpBWEJUeXBlKSB0eXBlKS5hY2NlcHQodGhpcyk7Ci0gICAgICAgICAgICByZXF1ZXN0SGVhZGVyQmxvY2soYmxvY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdEJvZHlCbG9jayhCbG9jayBibG9jaykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdEhlYWRlckJsb2NrKEJsb2NrIGJsb2NrKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0VmlzaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdmlzaXQoRmF1bHQgZmF1bHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcmVWaXNpdEZhdWx0KGZhdWx0KTsKLSAgICAgICAgdmlzaXRGYXVsdChmYXVsdCk7Ci0gICAgICAgIHBvc3RWaXNpdEZhdWx0KGZhdWx0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVWaXNpdEZhdWx0KEZhdWx0IGZhdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0VmlzaXRGYXVsdChGYXVsdCBmYXVsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVXYXJuaW5nKEluZGVudGluZ1dyaXRlciBwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZVdhcm5pbmcocCwgdGFyZ2V0VmVyc2lvbik7CiAgICAgfQogCiAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRKQVhXU0NsYXNzQ29tbWVudCgpewpAQCAtNDIxLDUyICsxNTAsMTQgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEpBWFdTQ2xhc3NDb21tZW50KFN0cmluZyB0YXJnZXRWZXJzaW9uKSB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBjb21tZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjb21tZW50cy5hZGQoIlRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuXG4iKTsKKyAgICAgICAgY29tbWVudHMuYWRkKCJUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWC1XUyBSSS5cbiIpOwogICAgICAgICBjb21tZW50cy5hZGQoVG9vbFZlcnNpb24uVkVSU0lPTi5CVUlMRF9WRVJTSU9OKyJcbiIpOwogICAgICAgICBjb21tZW50cy5hZGQoIkdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogIiArIHRhcmdldFZlcnNpb24pOwogICAgICAgICByZXR1cm4gY29tbWVudHM7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlV2FybmluZyhJbmRlbnRpbmdXcml0ZXIgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRWZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvKgotICAgICAgICAgKiBXcml0ZSBib2lsZXIgcGxhdGUgY29tbWVudC4KLSAgICAgICAgICovCi0gICAgICAgIHAucGxuKCIvLyBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWCBTSSwgZG8gbm90IGVkaXQuIik7Ci0gICAgICAgIHAucGxuKCIvLyBDb250ZW50cyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4iKTsKLSAgICAgICAgcC5wbG4oIi8vICIgKyBUb29sVmVyc2lvbi5WRVJTSU9OLkJVSUxEX1ZFUlNJT04pOwotICAgICAgICBwLnBsbigiLy8gR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAiICsgdGFyZ2V0VmVyc2lvbik7Ci0gICAgICAgIHAucGxuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVQYWNrYWdlKEluZGVudGluZ1dyaXRlciBwLCBTdHJpbmcgY2xhc3NOYW1lU3RyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIHdyaXRlUGFja2FnZShwLCBjbGFzc05hbWVTdHIsIHRhcmdldFZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVBhY2thZ2UoCi0gICAgICAgIEluZGVudGluZ1dyaXRlciBwLAotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lU3RyLAotICAgICAgICBTdHJpbmcgc291cmNlVmVyc2lvbikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICB3cml0ZVdhcm5pbmcocCwgc291cmNlVmVyc2lvbik7Ci0gICAgICAgIHdyaXRlUGFja2FnZU9ubHkocCwgY2xhc3NOYW1lU3RyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVQYWNrYWdlT25seShJbmRlbnRpbmdXcml0ZXIgcCwgU3RyaW5nIGNsYXNzTmFtZVN0cikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGlkeCA9IGNsYXNzTmFtZVN0ci5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICBpZiAoaWR4ID4gMCkgewotICAgICAgICAgICAgcC5wbG4oInBhY2thZ2UgIiArIGNsYXNzTmFtZVN0ci5zdWJzdHJpbmcoMCwgaWR4KSArICI7Iik7Ci0gICAgICAgICAgICBwLnBsbigpOwotICAgICAgICB9Ci0gICAgfQotCi0KICAgICBwcm90ZWN0ZWQgSkRlZmluZWRDbGFzcyBnZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc1R5cGUgdHlwZSkgewotICAgICAgICBKRGVmaW5lZENsYXNzIGNscyA9IG51bGw7CisgICAgICAgIEpEZWZpbmVkQ2xhc3MgY2xzOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgY2xzID0gY20uX2NsYXNzKGNsYXNzTmFtZSwgdHlwZSk7CiAgICAgICAgIH0gY2F0Y2ggKEpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb24gZSl7CkBAIC00NzYsNyArMTY3LDcgQEAKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBpZiAoZW52LnZlcmJvc2UoKSkgeworICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCiAgICAgICAgICAgICAgICAgIlsiCiAgICAgICAgICAgICAgICAgICAgICsgTmFtZXMuc3RyaXBRdWFsaWZpZXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSkKQEAgLTQ4NiwxMDEgKzE3NywxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FybihTdHJpbmcga2V5KSB7Ci0gICAgICAgIGVudi53YXJuKG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5KSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FybihTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIGVudi53YXJuKG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5LCBhcmcpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3YXJuKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgZW52Lndhcm4obWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXksIGFyZ3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbmZvKFN0cmluZyBrZXkpIHsKLSAgICAgICAgZW52LmluZm8obWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXkpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbmZvKFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLSAgICAgICAgZW52LmluZm8obWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXksIGFyZykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBmYWlsKFN0cmluZyBrZXkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbihrZXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBmYWlsKFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLSAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbihrZXksIGFyZyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZhaWwoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB7Ci0gICAgICAgIHRocm93IG5ldyBHZW5lcmF0b3JFeGNlcHRpb24oa2V5LCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyIH0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBmYWlsKExvY2FsaXphYmxlIGFyZykgewotICAgICAgICB0aHJvdyBuZXcgR2VuZXJhdG9yRXhjZXB0aW9uKCJnZW5lcmF0b3IubmVzdGVkR2VuZXJhdG9yRXJyb3IiLCBhcmcpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBmYWlsKFRocm93YWJsZSBhcmcpIHsKLSAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJnZW5lcmF0b3IubmVzdGVkR2VuZXJhdG9yRXJyb3IiLAotICAgICAgICAgICAgYXJnKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCVHlwZVZpc2l0b3IjdmlzaXQoY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQlR5cGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoSkFYQlR5cGUgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByZVZpc2l0SkFYQlR5cGUodHlwZSk7Ci0gICAgICAgIHZpc2l0SkFYQlR5cGUodHlwZSk7Ci0gICAgICAgIHBvc3RWaXNpdEpBWEJUeXBlKHR5cGUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0VmlzaXRKQVhCVHlwZShKQVhCVHlwZSB0eXBlKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRKQVhCVHlwZShKQVhCVHlwZSB0eXBlKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlVmlzaXRKQVhCVHlwZShKQVhCVHlwZSB0eXBlKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQlR5cGVWaXNpdG9yI3Zpc2l0KGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLlJwY0xpdFN0cnVjdHVyZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChScGNMaXRTdHJ1Y3R1cmUgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSGFuZGxlckNvbmZpZyhTdHJpbmcgY2xhc3NOYW1lLCBKRGVmaW5lZENsYXNzIGNscywgV1NETE1vZGVsSW5mbyB3c2RsTW9kZWxJbmZvKSB7Ci0gICAgICAgIEVsZW1lbnQgZSA9IHdzZGxNb2RlbEluZm8uZ2V0SGFuZGxlckNvbmZpZygpOworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSGFuZGxlckNvbmZpZyhTdHJpbmcgY2xhc3NOYW1lLCBKRGVmaW5lZENsYXNzIGNscywgV3NpbXBvcnRPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgRWxlbWVudCBlID0gb3B0aW9ucy5nZXRIYW5kbGVyQ2hhaW5Db25maWd1cmF0aW9uKCk7CiAgICAgICAgIGlmKGUgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgSkFubm90YXRpb25Vc2UgaGFuZGxlckNoYWluQW5uID0gY2xzLmFubm90YXRlKGNtLnJlZihIYW5kbGVyQ2hhaW4uY2xhc3MpKTsKLSAgICAgICAgLy9TdHJpbmcgZnVsbE5hbWUgPSBlbnYuZ2V0TmFtZXMoKS5jdXN0b21KYXZhVHlwZUNsYXNzTmFtZShwb3J0LmdldEphdmFJbnRlcmZhY2UoKSk7CiAgICAgICAgIE5vZGVMaXN0IG5sID0gZS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAogICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsICJoYW5kbGVyLWNoYWluIik7CiAgICAgICAgIGlmKG5sLmdldExlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICBFbGVtZW50IGhuID0gKEVsZW1lbnQpbmwuaXRlbSgwKTsKICAgICAgICAgICAgIFN0cmluZyBmTmFtZSA9IGdldEhhbmRsZXJDb25maWdGaWxlTmFtZShjbGFzc05hbWUpOwogICAgICAgICAgICAgaGFuZGxlckNoYWluQW5uLnBhcmFtKCJmaWxlIiwgZk5hbWUpOwogICAgICAgICAgICAgZ2VuZXJhdGVIYW5kbGVyQ2hhaW5GaWxlKGUsIGNsYXNzTmFtZSk7CkBAIC01OTUsMTQgKzE5OSwxMCBAQAogICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUhhbmRsZXJDaGFpbkZpbGUoRWxlbWVudCBoQ2hhaW5zLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBTdHJpbmcgaGNOYW1lID0gZ2V0SGFuZGxlckNvbmZpZ0ZpbGVOYW1lKG5hbWUpOwogCi0gICAgICAgIEZpbGUgcGFja2FnZURpciA9IERpcmVjdG9yeVV0aWwuZ2V0T3V0cHV0RGlyZWN0b3J5Rm9yKG5hbWUsIGRlc3REaXIsIGVudik7CisgICAgICAgIEZpbGUgcGFja2FnZURpciA9IERpcmVjdG9yeVV0aWwuZ2V0T3V0cHV0RGlyZWN0b3J5Rm9yKG5hbWUsIGRlc3REaXIpOwogICAgICAgICBGaWxlIGhjRmlsZSA9IG5ldyBGaWxlKHBhY2thZ2VEaXIsIGhjTmFtZSk7CiAKLSAgICAgICAgLyogYWRkaW5nIHRoZSBmaWxlIG5hbWUgYW5kIGl0cyB0eXBlICovCi0gICAgICAgIEdlbmVyYXRlZEZpbGVJbmZvIGZpID0gbmV3IEdlbmVyYXRlZEZpbGVJbmZvKCk7Ci0gICAgICAgIGZpLnNldEZpbGUoaGNGaWxlKTsKLSAgICAgICAgZmkuc2V0VHlwZSgiSGFuZGxlckNvbmZpZyIpOwotICAgICAgICBlbnYuYWRkR2VuZXJhdGVkRmlsZShmaSk7CisgICAgICAgIG9wdGlvbnMuYWRkR2VuZXJhdGVkRmlsZShoY0ZpbGUpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJbmRlbnRpbmdXcml0ZXIgcCA9CkBAIC02MTcsNiArMjE3LDcgQEAKICAgICAgICAgICAgICAgICAiMiIpOwogICAgICAgICAgICAgaXQuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7CiAgICAgICAgICAgICBpdC50cmFuc2Zvcm0oIG5ldyBET01Tb3VyY2UoaENoYWlucyksIG5ldyBTdHJlYW1SZXN1bHQocCkgKTsKKyAgICAgICAgICAgIHAuY2xvc2UoKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmF0b3JFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0b3IubmVzdGVkR2VuZXJhdG9yRXJyb3IiLApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0dlbmVyYXRvckNvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0dlbmVyYXRvckNvbnN0YW50cy5qYXZhCmluZGV4IGM4ZmNkNTEuLjA2ODhiNmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9HZW5lcmF0b3JDb25zdGFudHMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvR2VuZXJhdG9yQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzEsNTYgKzMxLDEyIEBACiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwogcHVibGljIGludGVyZmFjZSBHZW5lcmF0b3JDb25zdGFudHMgZXh0ZW5kcyBNb2RlbGVyQ29uc3RhbnRzIHsKLQotICAgIC8qCi0gICAgICogQ29uc3RhbnRzIHVzZWQgaW4gdGhlIGdlbmVyYXRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1RZUEVfV1NETCA9ICJXc2RsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1RZUEVfUkVNT1RFX0lOVEVSRkFDRSA9ICJSZW1vdGVJbnRlcmZhY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfVFlQRV9TRVJWSUNFID0gIlNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfVFlQRV9IQU5ETEVSX0NPTkZJRyA9ICJIYW5kbGVyQ29uZmlnIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1RZUEVfU0VSVklDRV9JTVBMID0gIlNlcnZpY2VJbXBsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1RZUEVfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9UWVBFX1dSQVBQRVJfQkVBTiA9ICJXcmFwcGVyQmVhbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9UWVBFX0VYQ0VQVElPTl9CRUFOID0gIkV4Y2VwdGlvbkJlYW4iOwotICAgIC8qCi0gICAgICogSWRlbnRpZmllcnMgcG90ZW50aWFsbHkgdXNlZnVsIGZvciBhbGwgR2VuZXJhdG9ycwotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfREVMRUdBVEVfQkFTRSA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zb2FwLmludGVybmFsLkRlbGVnYXRlQmFzZSI7Ci0KLQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBET1RDID0gJy4nOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19JTk5FUkNMQVNTID0gIiQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERVJTQ09SRSA9ICJfIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCX1NVRkZJWCA9ICJfU3R1YiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREVMRUdBVEVfU1VGRklYID0gIl9EZWxlZ2F0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0NPTlRBQ1RJTkZPTElTVF9TVUZGSVggPSAiX0NvbnRhY3RJbmZvTGlzdCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfRU5DT0RFUl9ERUNPREVSX1NVRkZJWCA9ICJfQ0VEIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRU5DT0RFUl9ERUNPREVSX1NVRkZJWCA9ICJfU0VEIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSUVfU1VGRklYID0gIl9UaWUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVQVF9USUVfU1VGRklYID0gIl9QVGllIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUFRGRl9TVUZGSVggPSAiX0VQVEZGIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1NSQ19TVUZGSVggPSAiLmphdmEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExfU1VGRklYID0gIl9JbXBsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlJBWSA9ICJBcnJheSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNQkVSX1BSRUZJWCA9ICJteSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUENPREVfU1VGRklYID0gIl9PUENPREUiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFOQU1FX1NVRkZJWCA9ICJfUU5BTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUU5BTUVfU1VGRklYID0gIl9UWVBFIiArIFFOQU1FX1NVRkZJWDsKLQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVCA9ICJnZXQiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTID0gImlzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVQgPSAic2V0IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJSZXNwb25zZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYID0gIm5zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1NVRkZJWCA9ICJfU2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QQUNLQUdFX1BSRUZJWCA9ICJqYXZhLiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfUEFDS0FHRV9QUkVGSVggPSAiamF2YXguIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9DTEFTU19NRU1CRVJfTkFNRSA9ICJmYXVsdEluZm8iOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0dlbmVyYXRvckV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0dlbmVyYXRvckV4Y2VwdGlvbi5qYXZhCmluZGV4IDEyYzUwMzguLjM2ZDZjNmQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9HZW5lcmF0b3JFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNyArMjYsNiBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3I7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5Qcm9jZXNzb3JFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CiAKIC8qKgogICoKQEAgLTQyLDcgKzQxLDcgQEAKICAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuZ2VuZXJhdG9yIjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvR2VuZXJhdG9yVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0dlbmVyYXRvclV0aWwuamF2YQppbmRleCA2ZjU1MjExLi42NGRiZTZmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvR2VuZXJhdG9yVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9HZW5lcmF0b3JVdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTcgKzI1LDcgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3I7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkJsb2NrOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkZhdWx0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk9wZXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFTdHJ1Y3R1cmVUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuSW5kZW50aW5nV3JpdGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuT3B0aW9uczsKIAogCiAvKioKQEAgLTQ0LDY3ICszNCwxOSBAQAogICovCiBwdWJsaWMgY2xhc3MgR2VuZXJhdG9yVXRpbCBpbXBsZW1lbnRzIEdlbmVyYXRvckNvbnN0YW50cyB7CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVOZXdRTmFtZShJbmRlbnRpbmdXcml0ZXIgcCwgUU5hbWUgbmFtZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcC5wKAotICAgICAgICAgICAgIm5ldyBRTmFtZShcIiIKLSAgICAgICAgICAgICAgICArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICArICJcIiwgXCIiCi0gICAgICAgICAgICAgICAgKyBuYW1lLmdldExvY2FsUGFydCgpCi0gICAgICAgICAgICAgICAgKyAiXCIpIik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVCbG9ja1FOYW1lRGVjbGFyYXRpb24oCi0gICAgICAgIEluZGVudGluZ1dyaXRlciBwLAotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgICAgICBCbG9jayBibG9jaywKLSAgICAgICAgTmFtZXMgbmFtZXMpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBxbmFtZSA9IG5hbWVzLmdldEJsb2NrUU5hbWVOYW1lKG9wZXJhdGlvbiwgYmxvY2spOwotICAgICAgICBwLnAoInByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lICIpOwotICAgICAgICBwLnAocW5hbWUgKyAiID0gIik7Ci0gICAgICAgIHdyaXRlTmV3UU5hbWUocCwgYmxvY2suZ2V0TmFtZSgpKTsKLSAgICAgICAgcC5wbG4oIjsiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVRTmFtZURlY2xhcmF0aW9uKAotICAgICAgICBJbmRlbnRpbmdXcml0ZXIgcCwKLSAgICAgICAgUU5hbWUgbmFtZSwKLSAgICAgICAgTmFtZXMgbmFtZXMpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBxbmFtZSA9IG5hbWVzLmdldFFOYW1lTmFtZShuYW1lKTsKLSAgICAgICAgcC5wKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSAiKTsKLSAgICAgICAgcC5wKHFuYW1lICsgIiA9ICIpOwotICAgICAgICB3cml0ZU5ld1FOYW1lKHAsIG5hbWUpOwotICAgICAgICBwLnBsbigiOyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVFOYW1lVHlwZURlY2xhcmF0aW9uKAotICAgICAgICBJbmRlbnRpbmdXcml0ZXIgcCwKLSAgICAgICAgUU5hbWUgbmFtZSwKLSAgICAgICAgTmFtZXMgbmFtZXMpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBxbmFtZSA9IG5hbWVzLmdldFR5cGVRTmFtZShuYW1lKTsKLSAgICAgICAgcC5wKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSAiKTsKLSAgICAgICAgcC5wKHFuYW1lICsgIiA9ICIpOwotICAgICAgICB3cml0ZU5ld1FOYW1lKHAsIG5hbWUpOwotICAgICAgICBwLnBsbigiOyIpOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0V4aXN0cygKLSAgICAgICAgUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52LAorICAgICAgICBPcHRpb25zIG9wdGlvbnMsCiAgICAgICAgIFN0cmluZyBjbGFzc05hbWUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFRha2VzIGNhcmUgb2YgaW5uZXIgY2xhc3Nlcy4KLSAgICAgICAgICAgIGdldExvYWRhYmxlQ2xhc3NOYW1lKGNsYXNzTmFtZSwgZW52LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgZ2V0TG9hZGFibGVDbGFzc05hbWUoY2xhc3NOYW1lLCBvcHRpb25zLmdldENsYXNzTG9hZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2FkYWJsZUNsYXNzTmFtZSgKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TG9hZGFibGVDbGFzc05hbWUoCiAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCiAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQogICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CkBAIC0xMjIsNjIgKzY0LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwogICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmF1bHRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzb3J0TmFtZSA9IGZhbHNlOwotICAgICAgICBwdWJsaWMgRmF1bHRDb21wYXJhdG9yKCkgewotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBGYXVsdENvbXBhcmF0b3IoYm9vbGVhbiBzb3J0TmFtZSkgewotICAgICAgICAgICAgdGhpcy5zb3J0TmFtZSA9IHNvcnROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgICAgICBpZiAoc29ydE5hbWUpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lMSA9ICgoRmF1bHQpIG8xKS5nZXRCbG9jaygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lMiA9ICgoRmF1bHQpIG8yKS5nZXRCbG9jaygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAvLyBGYXVsdHMgdGhhdCBhcmUgcHJvY2Vzc2VkIGJ5IG5hbWUgZmlyc3QsIHRoZW4gdHlwZQotICAgICAgICAgICAgICAgIGlmICghbmFtZTEuZXF1YWxzKG5hbWUyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTEudG9TdHJpbmcoKS5jb21wYXJlVG8obmFtZTIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgSmF2YVN0cnVjdHVyZVR5cGUgdHlwZTEgPSAoKEZhdWx0KSBvMSkuZ2V0SmF2YUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgSmF2YVN0cnVjdHVyZVR5cGUgdHlwZTIgPSAoKEZhdWx0KSBvMikuZ2V0SmF2YUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaW50IHJlc3VsdCA9IHNvcnQodHlwZTEsIHR5cGUyKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IHNvcnQoSmF2YVN0cnVjdHVyZVR5cGUgdHlwZTEsIEphdmFTdHJ1Y3R1cmVUeXBlIHR5cGUyKSB7Ci0gICAgICAgICAgICBpZiAodHlwZTEuZ2V0TmFtZSgpLmVxdWFscyh0eXBlMi5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBKYXZhU3RydWN0dXJlVHlwZSBzdXBlclR5cGU7Ci0gICAgICAgICAgICBzdXBlclR5cGUgPSB0eXBlMS5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoc3VwZXJUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VwZXJUeXBlLmVxdWFscyh0eXBlMikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdXBlclR5cGUgPSBzdXBlclR5cGUuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwZXJUeXBlID0gdHlwZTIuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgd2hpbGUgKHN1cGVyVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1cGVyVHlwZS5lcXVhbHModHlwZTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdXBlclR5cGUgPSBzdXBlclR5cGUuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUxLmdldFN1YmNsYXNzZXMoKSA9PSBudWxsICYmIHR5cGUyLmdldFN1YmNsYXNzZXMoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmICh0eXBlMS5nZXRTdWJjbGFzc2VzKCkgIT0gbnVsbCAmJiB0eXBlMi5nZXRTdWJjbGFzc2VzKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGlmICh0eXBlMS5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHR5cGUyLmdldFN1cGVyY2xhc3MoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZTEuZ2V0U3VwZXJjbGFzcygpID09IG51bGwKLSAgICAgICAgICAgICAgICAmJiB0eXBlMi5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0eXBlMS5nZXROYW1lKCkuY29tcGFyZVRvKHR5cGUyLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvSkFYQlR5cGVHZW5lcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9KQVhCVHlwZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGMyMDFiLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9KQVhCVHlwZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5Db2RlV3JpdGVyOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDb2RlTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwud3JpdGVyLlByb2dyZXNzQ29kZVdyaXRlcjsKLS8vaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFkZG9uLkF1Z21lbnRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuRXJyb3JMaXN0ZW5lcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuSkFYQk1vZGVsOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5TMkpKQVhCTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCVHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLlJwY0xpdFN0cnVjdHVyZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLndzZGwuQ29uc29sZUVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yT3B0aW9uczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBWZXJzaW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLldTQ29kZVdyaXRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFZpdmVrIFBhbmRleQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhCVHlwZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvckJhc2UgewotCi0gICAgLyoqCi0gICAgICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAgICAgKgotICAgICAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICAgICAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVycm9yTGlzdGVuZXIgaW1wbGVtZW50cyBFcnJvckxpc3RlbmVyIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICoKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBKQVhCRXJyb3JMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuRXJyb3JMaXN0ZW5lciNpbmZvKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgaW5mbyhTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICAgICAgfQotCi0gICAgfQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIEpBWEJUeXBlR2VuZXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICogQHBhcmFtIGNvbmZpZwotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIEpBWEJUeXBlR2VuZXJhdG9yKE1vZGVsIG1vZGVsLCBDb25maWd1cmF0aW9uIGNvbmZpZywKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBzdXBlcihtb2RlbCwgY29uZmlnLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgR2VuZXJhdG9yQmFzZSNnZXRHZW5lcmF0b3IoY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk1vZGVsLCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLkNvbmZpZ3VyYXRpb24sIGphdmEudXRpbC5Qcm9wZXJ0aWVzKQotICAgICAqLwotICAgIHB1YmxpYyBHZW5lcmF0b3JCYXNlIGdldEdlbmVyYXRvcihNb2RlbCBtb2RlbCwgQ29uZmlndXJhdGlvbiBjb25maWcsCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCVHlwZUdlbmVyYXRvcihtb2RlbCwgY29uZmlnLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY0dlbmVyYXRvckJhc2UjZ2V0R2VuZXJhdG9yKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbCwgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5Db25maWd1cmF0aW9uLCBqYXZhLnV0aWwuUHJvcGVydGllcywgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc29hcC5TT0FQVmVyc2lvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgR2VuZXJhdG9yQmFzZSBnZXRHZW5lcmF0b3IoTW9kZWwgbW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlnLAotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTT0FQVmVyc2lvbiB2ZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCVHlwZUdlbmVyYXRvcihtb2RlbCwgY29uZmlnLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBKQVhCVHlwZVZpc2l0b3IjdmlzaXQoSkFYQlR5cGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoSkFYQlR5cGUgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vdGhpcyBpcyBhIHJhdyB0eXBlLCBwcm9iYWJseSBmcm9tIHJwY2xpdAotICAgICAgICBpZih0eXBlLmdldEpheGJNb2RlbCgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFMySkpBWEJNb2RlbCBtb2RlbCA9IHR5cGUuZ2V0SmF4Yk1vZGVsKCkuZ2V0UzJKSkFYQk1vZGVsKCk7Ci0gICAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgZ2VuZXJhdGVKQVhCQ2xhc3Nlcyhtb2RlbCk7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBKQVhCVHlwZVZpc2l0b3IjdmlzaXQoY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuUnBjTGl0U3RydWN0dXJlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KFJwY0xpdFN0cnVjdHVyZSB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUzJKSkFYQk1vZGVsIG1vZGVsID0gdHlwZS5nZXRKYXhiTW9kZWwoKS5nZXRTMkpKQVhCTW9kZWwoKTsKLSAgICAgICAgZ2VuZXJhdGVKQVhCQ2xhc3Nlcyhtb2RlbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb25lR2VuZXJhdGlvbiA9IHRydWU7Ci0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSkFYQkNsYXNzZXMoUzJKSkFYQk1vZGVsIG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBpZihkb25lR2VuZXJhdGlvbikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgSkNvZGVNb2RlbCBjbSA9IG51bGw7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIGpheGIgc291cmNlIGZpbGVzCi0gICAgICAgIENvZGVXcml0ZXIgY3cgPSBuZXcgV1NDb2RlV3JpdGVyKHNvdXJjZURpcixlbnYpOwotCi0gICAgICAgIGlmKGVudi52ZXJib3NlKCkpCi0gICAgICAgICAgICBjdyA9IG5ldyBQcm9ncmVzc0NvZGVXcml0ZXIoY3csIFN5c3RlbS5vdXQpOyAvLyBUT0RPIHRoaXMgc2hvdWxkIG5vdCBiZSBTeXN0ZW0ub3V0LCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBmcm9tIFByb2Nlc3NvckVudmlyb25tZW50Ci0gICAgICAgIC8vVE9ETzpzZXQgcGFja2FnZSBsZXZlbCBqYXZhZG9jIGluIEpQYWNrYWdlCi0gICAgICAgIGNtID0gbW9kZWwuZ2VuZXJhdGVDb2RlKG51bGwsIG5ldyBDb25zb2xlRXJyb3JSZXBvcnRlcihlbnYsIHByaW50U3RhY2tUcmFjZSkpOwotICAgICAgICBjbS5idWlsZChjdyk7Ci0gICAgICAgIGRvbmVHZW5lcmF0aW9uID0gdHJ1ZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL0phdmFHZW5lcmF0b3JFeHRlbnNpb25GYWNhZGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9KYXZhR2VuZXJhdG9yRXh0ZW5zaW9uRmFjYWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzNjQzNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9KYXZhR2VuZXJhdG9yRXh0ZW5zaW9uRmFjYWRlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvcjsKKworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpNZXRob2Q7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkuVEphdmFHZW5lcmF0b3JFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETE9wZXJhdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEphdmFHZW5lcmF0b3JFeHRlbnNpb25GYWNhZGUgZXh0ZW5kcyBUSmF2YUdlbmVyYXRvckV4dGVuc2lvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBUSmF2YUdlbmVyYXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7CisKKyAgICBKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uRmFjYWRlKFRKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uLi4uIGV4dGVuc2lvbnMpIHsKKyAgICAgICAgYXNzZXJ0IGV4dGVuc2lvbnMgIT0gbnVsbDsKKyAgICAgICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1ldGhvZEFubm90YXRpb25zKFRXU0RMT3BlcmF0aW9uIHdzZGxPcGVyYXRpb24sIEpNZXRob2Qgak1ldGhvZCkgeworICAgICAgICBmb3IgKFRKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKSB7CisgICAgICAgICAgICBlLndyaXRlTWV0aG9kQW5ub3RhdGlvbnMod3NkbE9wZXJhdGlvbiwgak1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvTmFtZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9OYW1lcy5qYXZhCmluZGV4IGE3NjgyMDUuLjBkNzdhNDUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9OYW1lcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9OYW1lcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDIwICsyNSwxOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvcjsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLio7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuRmF1bHQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlBvcnQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuU2VydmljZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFJbnRlcmZhY2U7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhU3RydWN0dXJlTWVtYmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQlByb3BlcnR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuRGlyZWN0b3J5VXRpbDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsLlByb2Nlc3NvckVudmlyb25tZW50OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC5DbGFzc05hbWVJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5QcmVmaXhGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5QcmVmaXhGYWN0b3J5SW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkpBWEJSSUNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTUwLDQ1ICs0OCw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBOYW1lcyBpbXBsZW1lbnRzIEdlbmVyYXRvckNvbnN0YW50c3sKIAotICAgIHB1YmxpYyBOYW1lcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0dWJGb3IoUG9ydCBwb3J0LCBTdHJpbmcgaW5maXgpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBwb3J0LmdldFByb3BlcnR5KE1vZGVsUHJvcGVydGllcy5QUk9QRVJUWV9TVFVCX0NMQVNTX05BTUUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgbWFrZURlcml2ZWRDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgIHBvcnQuZ2V0SmF2YUludGVyZmFjZSgpLAotICAgICAgICAgICAgICAgICAgICBTVFVCX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgaW5maXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0aWVGb3IoUG9ydCBwb3J0LCBTdHJpbmcgaW5maXgpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBwb3J0LmdldFByb3BlcnR5KE1vZGVsUHJvcGVydGllcy5QUk9QRVJUWV9USUVfQ0xBU1NfTkFNRSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0KLSAgICAgICAgICAgICAgICBtYWtlRGVyaXZlZENsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcG9ydC5nZXRKYXZhSW50ZXJmYWNlKCksCi0gICAgICAgICAgICAgICAgICAgIFRJRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgIGluZml4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbWFrZURlcml2ZWRDbGFzc05hbWUoCi0gICAgICAgIEphdmFJbnRlcmZhY2UgamF2YUludGVyZmFjZSwKLSAgICAgICAgU3RyaW5nIHN1ZmZpeCwKLSAgICAgICAgU3RyaW5nIGluZml4KSB7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPQotICAgICAgICAgICAgQ2xhc3NOYW1lSW5mby5yZXBsYWNlSW5uZXJDbGFzc1N5bShqYXZhSW50ZXJmYWNlLmdldFJlYWxOYW1lKCkpOwotICAgICAgICByZXR1cm4gbmFtZSArIChpbmZpeCA9PSBudWxsID8gIiIgOiBVTkRFUlNDT1JFICsgaW5maXgpICsgc3VmZml4OwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnROYW1lKFBvcnQgcG9ydCkgewogICAgICAgICBTdHJpbmcgamF2YVBvcnROYW1lID0KICAgICAgICAgICAgIChTdHJpbmcpIHBvcnQuZ2V0UHJvcGVydHkoTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX0pBVkFfUE9SVF9OQU1FKTsKQEAgLTEwNywxMCArNjYsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdWFsaWZpZXIoQ2xhc3MgY2xhc3NPYmopIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjbGFzc09iai5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBzdHJpcFF1YWxpZmllcihuYW1lKTsKLSAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFF1YWxpZmllcihTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gQ2xhc3NOYW1lSW5mby5nZXROYW1lKG5hbWUpOwpAQCAtMTIxLDE0NyArNzYsMzcgQEAKICAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lICE9IG51bGwgPyBwYWNrYWdlTmFtZSA6ICIiOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVucXVhbGlmaWVkQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIENsYXNzTmFtZUluZm8uZ2V0TmFtZShjbGFzc05hbWUpLnJlcGxhY2UoJyQnLCAnLicpOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tSmF2YVR5cGVDbGFzc05hbWUoSmF2YUludGVyZmFjZSBpbnRmKSB7CisgICAgICAgIHJldHVybiBpbnRmLmdldE5hbWUoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIEZpbGUgb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHNvdXJjZSBmaWxlCi0gICAgICogZm9yIHRoZSBnaXZlbiBKYXZhIGNsYXNzLCB1c2luZyB0aGUgc3VwcGxpZWQgZGVzdGluYXRpb24KLSAgICAgKiBkaXJlY3RvcnkgZm9yIHRoZSB0b3Agb2YgdGhlIHBhY2thZ2UgaGllcmFyY2h5LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIHNvdXJjZUZpbGVGb3JDbGFzcygKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgU3RyaW5nIG91dHB1dENsYXNzTmFtZSwKLSAgICAgICAgRmlsZSBkZXN0RGlyLAotICAgICAgICBQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpCi0gICAgICAgIHRocm93cyBHZW5lcmF0b3JFeGNlcHRpb24gewotICAgICAgICBGaWxlIHBhY2thZ2VEaXIgPQotICAgICAgICAgICAgRGlyZWN0b3J5VXRpbC5nZXRPdXRwdXREaXJlY3RvcnlGb3IoY2xhc3NOYW1lLCBkZXN0RGlyLCBlbnYpOwotICAgICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9IHN0cmlwUXVhbGlmaWVyKG91dHB1dENsYXNzTmFtZSk7Ci0KLSAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVOYW1lID0gb3V0cHV0TmFtZSArIEpBVkFfU1JDX1NVRkZJWDsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhY2thZ2VEaXIsIG91dHB1dEZpbGVOYW1lKTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21FeGNlcHRpb25DbGFzc05hbWUoRmF1bHQgZmF1bHQpIHsKKyAgICAgICAgcmV0dXJuIGZhdWx0LmdldEphdmFFeGNlcHRpb24oKS5nZXROYW1lKCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIFN0cmluZyBwb3J0UGFja2FnZSA9Ci0gICAgICAgICAgICBnZXRQYWNrYWdlTmFtZShzZXJ2aWNlLmdldEphdmFJbnRlcmZhY2UoKS5nZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gcG9ydFBhY2thZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21KYXZhVHlwZUNsYXNzTmFtZShKYXZhSW50ZXJmYWNlIGludGYpIHsKLSAgICAgICAgU3RyaW5nIGludE5hbWUgPSBpbnRmLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIGludE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21FeGNlcHRpb25DbGFzc05hbWUoRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gZmF1bHQuZ2V0SmF2YUV4Y2VwdGlvbigpLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIHR5cGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uQ2xhc3NNZW1iZXJOYW1lKCl7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uQ2xhc3NNZW1iZXJOYW1lKCl7CiAgICAgICAgIHJldHVybiBGQVVMVF9DTEFTU19NRU1CRVJfTkFNRTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFFOYW1lTmFtZShRTmFtZSBuYW1lKSB7Ci0gICAgICAgIFN0cmluZyBxbmFtZSA9Ci0gICAgICAgICAgICBnZXRQcmVmaXgobmFtZSkgKyBVTkRFUlNDT1JFICsgbmFtZS5nZXRMb2NhbFBhcnQoKSArIFFOQU1FX1NVRkZJWDsKLSAgICAgICAgcmV0dXJuIHZhbGlkSW50ZXJuYWxKYXZhSWRlbnRpZmllcihxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCbG9ja1FOYW1lTmFtZShPcGVyYXRpb24gb3BlcmF0aW9uLCBCbG9jayBibG9jaykgewotICAgICAgICBRTmFtZSBibG9ja05hbWUgPSBibG9jay5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBxbmFtZSA9IGdldFByZWZpeChibG9ja05hbWUpOwotICAgICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBxbmFtZSArPSBVTkRFUlNDT1JFICsgb3BlcmF0aW9uLmdldFVuaXF1ZU5hbWUoKTsKLSAgICAgICAgcW5hbWUgKz0gVU5ERVJTQ09SRSArIGJsb2NrTmFtZS5nZXRMb2NhbFBhcnQoKSArIFFOQU1FX1NVRkZJWDsKLSAgICAgICAgcmV0dXJuIHZhbGlkSW50ZXJuYWxKYXZhSWRlbnRpZmllcihxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlUU5hbWUoUU5hbWUgbmFtZSkgewotICAgICAgICBTdHJpbmcgcW5hbWUgPQotICAgICAgICAgICAgZ2V0UHJlZml4KG5hbWUpCi0gICAgICAgICAgICAgICAgKyBVTkRFUlNDT1JFCi0gICAgICAgICAgICAgICAgKyBuYW1lLmdldExvY2FsUGFydCgpCi0gICAgICAgICAgICAgICAgKyBUWVBFX1FOQU1FX1NVRkZJWDsKLSAgICAgICAgcmV0dXJuIHZhbGlkSW50ZXJuYWxKYXZhSWRlbnRpZmllcihxbmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgTmFtZXMjdmFsaWRKYXZhQ2xhc3NOYW1lKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHZhbGlkSmF2YUNsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9DbGFzc05hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgTmFtZXMjdmFsaWRKYXZhTWVtYmVyTmFtZShTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB2YWxpZEphdmFNZW1iZXJOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBKQVhCUklDb250ZXh0Lm1hbmdsZU5hbWVUb1ZhcmlhYmxlTmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbGlkSW50ZXJuYWxKYXZhSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotICAgICAgICAvLyByZXR1cm4gYSB2YWxpZCBqYXZhIGlkZW50aWZpZXIgd2l0aG91dCBkcm9wcGluZyBjaGFyYWN0ZXJzIChpLmUuIGRvIG5vdCBhcHBseQotICAgICAgICAvLyB0aGUgbWFwcGluZyBvZiBYTUwgbmFtZXMgdG8gSmF2YSBpZGVudGlmaWVycyBpbiB0aGUgc3BlYyk7IGl0J3Mgb25seSBtZWFudAotICAgICAgICAvLyB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIGludGVybmFsIGlkZW50aWZpZXJzIChlLmcuIHZhcmlhYmxlIG5hbWVzIGluIGdlbmVyYXRlZCBjb2RlKQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBuYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl8kIik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKChpbnQpIGNoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiQiKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoKGludCkgY2gpKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gc2IudG9TdHJpbmcoKTsKLQotICAgICAgICBTdHJpbmcgdG1wID0gKFN0cmluZykgcmVzZXJ2ZWRXb3Jkcy5nZXQoaWQpOwotICAgICAgICBpZiAodG1wICE9IG51bGwpCi0gICAgICAgICAgICBpZCA9IHRtcDsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRFeHRlcm5hbEphdmFJZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZEludGVybmFsSmF2YUlkZW50aWZpZXIobmFtZSkucmVwbGFjZSgnJCcsICdfJyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWxpZEphdmFOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG5hbWUgPSB3b3JkQnJlYWtTdHJpbmcobmFtZSk7Ci0gICAgICAgIG5hbWUgPSByZW1vdmVXaGl0ZVNwYWNlKG5hbWUpOwotCi0gICAgICAgIFN0cmluZyB0bXAgPSAoU3RyaW5nKSByZXNlcnZlZFdvcmRzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHRtcCAhPSBudWxsKQotICAgICAgICAgICAgbmFtZSA9IHRtcDsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNKYXZhUmVzZXJ2ZWRXb3JkKFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVJlc2VydmVkV29yZChTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gcmVzZXJ2ZWRXb3Jkcy5nZXQobmFtZSkgIT0gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZWUgaWYgaXRzIGEgamF2YSBrZXl3b3JkIG5hbWUsIGlmIHNvIHRoZW4gbWFuZ2xlIHRoZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBTdHJpbmcgZ2V0SmF2YVJlc2VydmVyVmFyaWFsYmVOYW1lKEBOb3ROdWxsIFN0cmluZyBuYW1lKXsKKyAgICAgICAgcmV0dXJuIChyZXNlcnZlZFdvcmRzLmdldChuYW1lKSA9PSBudWxsKT9uYW1lOnJlc2VydmVkV29yZHMuZ2V0KG5hbWUpOworICAgIH0KKwogICAgIC8qIGhlcmUgd2UgY2hlY2sgb24gd2V0aGVyIHJldHVybiB2YWx1ZXMgZGF0YXR5cGUgaXMKICAgICAgICBib29sZWFuLiBJZiBpdHMgYm9vbGVhbiwgaW5zdGVhZCBvZiBhIGdldCBtZXRob2QKICAgICAgICBpdHMgc2V0IGEgaXM8TWV0aG9kTmFtZT4gdG8gY29tcGx5IHdpdGggSmF2YUJlYW5zCiAgICAgICAgUGF0dGVybiBzcGVjICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhTWVtYmVyUmVhZE1ldGhvZChKYXZhU3RydWN0dXJlTWVtYmVyIG1lbWJlcikgewotICAgICAgICBTdHJpbmcgcmV0dXJuX3ZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKChtZW1iZXIuZ2V0VHlwZSgpLmdldFJlYWxOYW1lKCkpID09ICJib29sZWFuIikgeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFNZW1iZXJSZWFkTWV0aG9kKEphdmFTdHJ1Y3R1cmVNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIFN0cmluZyByZXR1cm5fdmFsdWU7CisgICAgICAgIGlmIChtZW1iZXIuZ2V0VHlwZSgpLmdldFJlYWxOYW1lKCkuZXF1YWxzKCJib29sZWFuIikpIHsKICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IElTICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShtZW1iZXIuZ2V0TmFtZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IEdFVCArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUobWVtYmVyLmdldE5hbWUoKSk7CkBAIC0yNjksMTA0ICsxMTQsMTQgQEAKICAgICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YU1lbWJlcldyaXRlTWV0aG9kKEphdmFTdHJ1Y3R1cmVNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBTRVQgKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKG1lbWJlci5nZXROYW1lKCkpOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc3BvbnNlTmFtZShTdHJpbmcgbWVzc2FnZU5hbWUpIHsKICAgICAgICAgcmV0dXJuIG1lc3NhZ2VOYW1lICsgUkVTUE9OU0U7CiAgICAgfQogCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFSZWFkTWV0aG9kKEpBWEJQcm9wZXJ0eSBwcm9wKXsKLSAgICAgICAgaWYocHJvcC5nZXRUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiYm9vbGVhbiIpKQotICAgICAgICAgICAgcmV0dXJuIElTICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShwcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBnZXRKYXZhUmVhZE1ldGhvZChwcm9wLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhV3JpdGVNZXRob2QoSkFYQlByb3BlcnR5IHByb3ApewotICAgICAgICByZXR1cm4gZ2V0SmF2YVdyaXRlTWV0aG9kKHByb3AuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFSZWFkTWV0aG9kKFN0cmluZyBwcm9wKXsKLSAgICAgICAgcmV0dXJuIEdFVCArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUocHJvcCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhV3JpdGVNZXRob2QoU3RyaW5nIHByb3ApewotICAgICAgICByZXR1cm4gU0VUICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShwcm9wKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJlbW92ZVdoaXRlU3BhY2UoU3RyaW5nIHN0cikgewotICAgICAgICBTdHJpbmcgdG1wID0gcmVtb3ZlQ2hhcmFjdGVyKCcgJywgc3RyKTsKLSAgICAgICAgcmV0dXJuIHRtcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHdvcmRCcmVha1N0cmluZyhTdHJpbmcgc3RyKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cik7Ci0gICAgICAgIGNoYXIgY2g7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoID0gYnVmLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjaCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBidWYubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgIUNoYXJhY3Rlci5pc0RpZ2l0KGJ1Zi5jaGFyQXQoaSArIDEpKSkgewotICAgICAgICAgICAgICAgICAgICBidWYuaW5zZXJ0KDEgKyBpKyssICcgJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoY2gpIHx8IGNoID09ICdfJykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoKSkgewotICAgICAgICAgICAgICAgIGJ1Zi5zZXRDaGFyQXQoaSwgJyAnKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIUNoYXJhY3Rlci5pc0xldHRlcihjaCkpIHsKLSAgICAgICAgICAgICAgICBidWYuc2V0Q2hhckF0KGksICcgJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmVtb3ZlQ2hhcmFjdGVyKGludCBjaCwgU3RyaW5nIHN0cikgewotICAgICAgICBTdHJpbmcgdG1wOwotICAgICAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoY2gpOwotICAgICAgICB3aGlsZSAoaWR4ID49IDApIHsKLSAgICAgICAgICAgIHN0ciA9Ci0gICAgICAgICAgICAgICAgc3RyLnN1YnN0cmluZygwLCBpZHgpCi0gICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShzdHIuc3Vic3RyaW5nKGlkeCArIDEpLnRyaW0oKSk7Ci0gICAgICAgICAgICBpZHggPSBzdHIuaW5kZXhPZignICcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcmVmaXgobmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIHVyaSkgewotICAgICAgICByZXR1cm4gcHJlZml4RmFjdG9yeS5nZXRQcmVmaXgodXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldFByZWZpeEZhY3RvcnkoKSB7Ci0gICAgICAgIHByZWZpeEZhY3RvcnkgPSBuZXcgUHJlZml4RmFjdG9yeUltcGwoTlNfUFJFRklYKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJpYWxpemVyTmFtZUluZml4KFN0cmluZyBzZXJOYW1lSW5maXgpIHsKLSAgICAgICAgaWYgKHNlck5hbWVJbmZpeCAhPSBudWxsICYmIHNlck5hbWVJbmZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICBzZXJpYWxpemVyTmFtZUluZml4ID0gVU5ERVJTQ09SRSArIHNlck5hbWVJbmZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcmlhbGl6ZXJOYW1lSW5maXgoKSB7Ci0gICAgICAgIC8vIEZpeCBmb3IgYnVnIDQ4MTE2MjUgYW5kIDQ3NzgxMzYsIHVuZG9pbmcgd2hhdCBzZXR0ZXIgZG9lcyAocmVtb3ZlIGJlZ2lubmluZyB1bmRlcnNjb3JlKQotICAgICAgICBTdHJpbmcgc3RyID0gc2VyaWFsaXplck5hbWVJbmZpeDsKLSAgICAgICAgaWYgKChzZXJpYWxpemVyTmFtZUluZml4ICE9IG51bGwpCi0gICAgICAgICAgICAmJiAoc2VyaWFsaXplck5hbWVJbmZpeC5jaGFyQXQoMCkgPT0gJ18nKSkKLSAgICAgICAgICAgIHN0ciA9IHNlcmlhbGl6ZXJOYW1lSW5maXguc3Vic3RyaW5nKDEpOwotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VyaWFsaXplck5hbWVJbmZpeCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFByZWZpeEZhY3RvcnkgcHJlZml4RmFjdG9yeSA9IG5ldyBQcmVmaXhGYWN0b3J5SW1wbChOU19QUkVGSVgpOwotICAgIHByb3RlY3RlZCBzdGF0aWMgTWFwIHJlc2VydmVkV29yZHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZXNlcnZlZFdvcmRzOwogCiAgICAgc3RhdGljIHsKLSAgICAgICAgcmVzZXJ2ZWRXb3JkcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHJlc2VydmVkV29yZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICAgcmVzZXJ2ZWRXb3Jkcy5wdXQoImFic3RyYWN0IiwgIl9hYnN0cmFjdCIpOwogICAgICAgICByZXNlcnZlZFdvcmRzLnB1dCgiYXNzZXJ0IiwgIl9hc3NlcnQiKTsKICAgICAgICAgcmVzZXJ2ZWRXb3Jkcy5wdXQoImJvb2xlYW4iLCAiX2Jvb2xlYW4iKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9TZWlHZW5lcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9TZWlHZW5lcmF0b3IuamF2YQppbmRleCA1NDJmMTYxLi43OTMzNGVkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvU2VpR2VuZXJhdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL1NlaUdlbmVyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDg3ICsyNiw1OCBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3I7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC4qOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLndyaXRlci5Qcm9ncmVzc0NvZGVXcml0ZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yQWN0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5XU0RMTW9kZWxJbmZvOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLlRKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhSW50ZXJmYWNlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YU1ldGhvZDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFQYXJhbWV0ZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCVHlwZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLkpBWEJUeXBlQW5kQW5ub3RhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsLkRpcmVjdG9yeVV0aWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5HZW5lcmF0ZWRGaWxlSW5mbzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsLkluZGVudGluZ1dyaXRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5XU0NvZGVXcml0ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuRXJyb3JSZWNlaXZlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5PcHRpb25zOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLldzaW1wb3J0T3B0aW9uczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQU3R5bGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlBvcnRUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5UeXBlQW5kQW5ub3RhdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBWZXJzaW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKIAotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47CiBpbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKIGltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07CiBpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7CiBpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbzsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCi1wdWJsaWMgY2xhc3MgU2VpR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSBpbXBsZW1lbnRzIFByb2Nlc3NvckFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBXU0RMTW9kZWxJbmZvIHdzZGxNb2RlbEluZm87CitwdWJsaWMgY2xhc3MgU2VpR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yQmFzZXsKICAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTlM7CisgICAgcHJpdmF0ZSBUSmF2YUdlbmVyYXRvckV4dGVuc2lvbiBleHRlbnNpb247CisgICAgcHJpdmF0ZSBMaXN0PFRKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uPiBleHRlbnNpb25IYW5kbGVyczsKIAotICAgIHB1YmxpYyBTZWlHZW5lcmF0b3IoKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKE1vZGVsIG1vZGVsLCBXc2ltcG9ydE9wdGlvbnMgb3B0aW9ucywgRXJyb3JSZWNlaXZlciByZWNlaXZlciwgVEphdmFHZW5lcmF0b3JFeHRlbnNpb24uLi4gZXh0ZW5zaW9ucyl7CisgICAgICAgIFNlaUdlbmVyYXRvciBzZWlHZW5lcmF0b3IgPSBuZXcgU2VpR2VuZXJhdG9yKG1vZGVsLCBvcHRpb25zLCByZWNlaXZlciwgZXh0ZW5zaW9ucyk7CisgICAgICAgIHNlaUdlbmVyYXRvci5kb0dlbmVyYXRpb24oKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0dlbmVyYXRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtb2RlbC5hY2NlcHQodGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZW52LnZlcmJvc2UoKSkKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yLm5lc3RlZEdlbmVyYXRvckVycm9yIiwKLSAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgfQorICAgIHByaXZhdGUgU2VpR2VuZXJhdG9yKE1vZGVsIG1vZGVsLCBXc2ltcG9ydE9wdGlvbnMgb3B0aW9ucywgRXJyb3JSZWNlaXZlciByZWNlaXZlciwgVEphdmFHZW5lcmF0b3JFeHRlbnNpb24uLi4gZXh0ZW5zaW9ucykgeworICAgICAgICBzdXBlcihtb2RlbCwgb3B0aW9ucywgcmVjZWl2ZXIpOworICAgICAgICBleHRlbnNpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8VEphdmFHZW5lcmF0b3JFeHRlbnNpb24+KCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgaGFuZGxlcnMgZm9yIGRlZmF1bHQgZXh0ZW5zaW9ucworICAgICAgICAvL3NwZWMgZG9lcyBub3QgcmVxdWlyZSBnZW5lcmF0aW9uIG9mIHRoZXNlIGFubm90YXRpb25zCisgICAgICAgIC8vIGFuZCB3ZSBjYW4gaW5mZXIgZnJvbSB3c2RsIGFueXdheSwgc28gbGV0cyBkaXNhYmxlIGl0CisgICAgICAgIC8vcmVnaXN0ZXIobmV3IFczQ0FkZHJlc3NpbmdKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uKCkpOworCisgICAgICAgIGZvciAoVEphdmFHZW5lcmF0b3JFeHRlbnNpb24gaiA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICByZWdpc3RlcihqKTsKKworICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IG5ldyBKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uRmFjYWRlKGV4dGVuc2lvbkhhbmRsZXJzLnRvQXJyYXkobmV3IFRKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uWzBdKSk7CiAgICAgfQogCi0gICAgcHVibGljIEdlbmVyYXRvckJhc2UgZ2V0R2VuZXJhdG9yKE1vZGVsIG1vZGVsLCBDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VpR2VuZXJhdG9yKG1vZGVsLCBjb25maWcsIHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZWlHZW5lcmF0b3IoTW9kZWwgbW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgc3VwZXIobW9kZWwsIGNvbmZpZywgcHJvcGVydGllcyk7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgdGhpcy53c2RsTW9kZWxJbmZvID0gKFdTRExNb2RlbEluZm8pY29uZmlnLmdldE1vZGVsSW5mbygpOwotICAgIH0KLQotICAgIHB1YmxpYyBHZW5lcmF0b3JCYXNlIGdldEdlbmVyYXRvcihNb2RlbCBtb2RlbCwgQ29uZmlndXJhdGlvbiBjb25maWcsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU09BUFZlcnNpb24gdmVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VpR2VuZXJhdG9yKG1vZGVsLCBjb25maWcsIHByb3BlcnRpZXMpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKFNlcnZpY2Ugc2VydmljZSwgUG9ydCBwb3J0KSB0aHJvd3MgRXhjZXB0aW9ueworICAgIHByaXZhdGUgdm9pZCB3cml0ZShQb3J0IHBvcnQpIHsKICAgICAgICAgSmF2YUludGVyZmFjZSBpbnRmID0gcG9ydC5nZXRKYXZhSW50ZXJmYWNlKCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbnYuZ2V0TmFtZXMoKS5jdXN0b21KYXZhVHlwZUNsYXNzTmFtZShpbnRmKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IE5hbWVzLmN1c3RvbUphdmFUeXBlQ2xhc3NOYW1lKGludGYpOwogCi0gICAgICAgIGlmIChkb25vdE92ZXJyaWRlICYmIEdlbmVyYXRvclV0aWwuY2xhc3NFeGlzdHMoZW52LCBjbGFzc05hbWUpKSB7CisgICAgICAgIGlmIChkb25vdE92ZXJyaWRlICYmIEdlbmVyYXRvclV0aWwuY2xhc3NFeGlzdHMob3B0aW9ucywgY2xhc3NOYW1lKSkgewogICAgICAgICAgICAgbG9nKCJDbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleGlzdHMuIE5vdCBvdmVycmlkaW5nLiIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMzcsMjAgKzEwOCwyNCBAQAogCiAgICAgICAgIC8vQFdlYlNlcnZpY2UKICAgICAgICAgSkFubm90YXRpb25Vc2Ugd2ViU2VydmljZUFubiA9IGNscy5hbm5vdGF0ZShjbS5yZWYoV2ViU2VydmljZS5jbGFzcykpOwotICAgICAgICB3cml0ZVdlYlNlcnZpY2VBbm5vdGF0aW9uKHNlcnZpY2UsIHBvcnQsIHdlYlNlcnZpY2VBbm4pOworICAgICAgICB3cml0ZVdlYlNlcnZpY2VBbm5vdGF0aW9uKHBvcnQsIHdlYlNlcnZpY2VBbm4pOwogCiAgICAgICAgIC8vQEhhbmRsZXJDaGFpbgotICAgICAgICB3cml0ZUhhbmRsZXJDb25maWcoZW52LmdldE5hbWVzKCkuY3VzdG9tSmF2YVR5cGVDbGFzc05hbWUocG9ydC5nZXRKYXZhSW50ZXJmYWNlKCkpLCBjbHMsIHdzZGxNb2RlbEluZm8pOworICAgICAgICB3cml0ZUhhbmRsZXJDb25maWcoTmFtZXMuY3VzdG9tSmF2YVR5cGVDbGFzc05hbWUocG9ydC5nZXRKYXZhSW50ZXJmYWNlKCkpLCBjbHMsIG9wdGlvbnMpOwogCiAgICAgICAgIC8vQFNPQVBCaW5kaW5nCiAgICAgICAgIHdyaXRlU09BUEJpbmRpbmcocG9ydCwgY2xzKTsKIAorICAgICAgICAvL0BYbWxTZWVBbHNvCisgICAgICAgIGlmKG9wdGlvbnMudGFyZ2V0LmlzTGF0ZXJUaGFuKE9wdGlvbnMuVGFyZ2V0LlYyXzEpKQorICAgICAgICAgICAgd3JpdGVYbWxTZWVBbHNvKGNscyk7CisKICAgICAgICAgZm9yIChPcGVyYXRpb24gb3BlcmF0aW9uOiBwb3J0LmdldE9wZXJhdGlvbnMoKSkgewogICAgICAgICAgICAgSmF2YU1ldGhvZCBtZXRob2QgPSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpOwogCiAgICAgICAgICAgICAvL0BXZWJNZXRob2QKLSAgICAgICAgICAgIEpNZXRob2QgbSA9IG51bGw7Ci0gICAgICAgICAgICBKRG9jQ29tbWVudCBtZXRob2REb2MgPSBudWxsOworICAgICAgICAgICAgSk1ldGhvZCBtOworICAgICAgICAgICAgSkRvY0NvbW1lbnQgbWV0aG9kRG9jOwogICAgICAgICAgICAgU3RyaW5nIG1ldGhvZEphdmFEb2MgPSBvcGVyYXRpb24uZ2V0SmF2YURvYygpOwogICAgICAgICAgICAgaWYobWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikpewogICAgICAgICAgICAgICAgIG0gPSBjbHMubWV0aG9kKEpNb2QuUFVCTElDLCB2b2lkLmNsYXNzLCBtZXRob2QuZ2V0TmFtZSgpKTsKQEAgLTE2OSw3ICsxNDQsNyBAQAogICAgICAgICAgICAgd3JpdGVXZWJNZXRob2Qob3BlcmF0aW9uLCBtKTsKICAgICAgICAgICAgIEpDbGFzcyBob2xkZXIgPSBjbS5yZWYoSG9sZGVyLmNsYXNzKTsKICAgICAgICAgICAgIGZvciAoSmF2YVBhcmFtZXRlciBwYXJhbWV0ZXI6IG1ldGhvZC5nZXRQYXJhbWV0ZXJzTGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgSlZhciB2YXIgPSBudWxsOworICAgICAgICAgICAgICAgIEpWYXIgdmFyOwogICAgICAgICAgICAgICAgIEpBWEJUeXBlQW5kQW5ub3RhdGlvbiBwYXJhbVR5cGUgPSBwYXJhbWV0ZXIuZ2V0VHlwZSgpLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmlzSG9sZGVyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdmFyID0gbS5wYXJhbShob2xkZXIubmFycm93KHBhcmFtVHlwZS5nZXRUeXBlKCkuYm94aWZ5KCkpLCBwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKQEAgLTE4MywyMSArMTU4LDM4IEBACiAgICAgICAgICAgICAgICAgSkFubm90YXRpb25Vc2UgcGFyYW1Bbm4gPSB2YXIuYW5ub3RhdGUoY20ucmVmKFdlYlBhcmFtLmNsYXNzKSk7CiAgICAgICAgICAgICAgICAgd3JpdGVXZWJQYXJhbShvcGVyYXRpb24sIHBhcmFtZXRlciwgcGFyYW1Bbm4pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbiB3c2RsT3AgPSBvcGVyYXRpb24uZ2V0V1NETFBvcnRUeXBlT3BlcmF0aW9uKCk7CiAgICAgICAgICAgICBmb3IoRmF1bHQgZmF1bHQ6b3BlcmF0aW9uLmdldEZhdWx0c1NldCgpKXsKICAgICAgICAgICAgICAgICBtLl90aHJvd3MoZmF1bHQuZ2V0RXhjZXB0aW9uQ2xhc3MoKSk7CiAgICAgICAgICAgICAgICAgbWV0aG9kRG9jLmFkZFRocm93cyhmYXVsdC5nZXRFeGNlcHRpb25DbGFzcygpKTsKKyAgICAgICAgICAgICAgICB3c2RsT3AucHV0RmF1bHQoZmF1bHQuZ2V0V3NkbEZhdWx0TmFtZSgpLCBmYXVsdC5nZXRFeGNlcHRpb25DbGFzcygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9JdCBzaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgdG8gaW52b2tlIGFmdGVyIEpNZXRob2QgaXMgYnVpbHQgY29tcGxldGVseQorICAgICAgICAgICAgZXh0ZW5zaW9uLndyaXRlTWV0aG9kQW5ub3RhdGlvbnMod3NkbE9wLCBtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZVhtbFNlZUFsc28oSkRlZmluZWRDbGFzcyBjbHMpIHsKKyAgICAgICAgaWYgKG1vZGVsLmdldEpBWEJNb2RlbCgpLmdldFMySkpBWEJNb2RlbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIExpc3Q8SkNsYXNzPiBvYmplY3RGYWN0b3JpZXMgPSBtb2RlbC5nZXRKQVhCTW9kZWwoKS5nZXRTMkpKQVhCTW9kZWwoKS5nZXRBbGxPYmplY3RGYWN0b3JpZXMoKTsKKworICAgICAgICAgICAgLy9pZiB0aGVyZSBhcmUgbm8gb2JqZWN0IGZhY290aXJlcywgZG9udCBnZW5lcmF0ZSBAWG1sU2VlQWxzbworICAgICAgICAgICAgaWYob2JqZWN0RmFjdG9yaWVzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgSkFubm90YXRpb25Vc2UgeG1sU2VlQWxzbyA9IGNscy5hbm5vdGF0ZShjbS5yZWYoWG1sU2VlQWxzby5jbGFzcykpOworICAgICAgICAgICAgSkFubm90YXRpb25BcnJheU1lbWJlciBwYXJhbUFycmF5ID0geG1sU2VlQWxzby5wYXJhbUFycmF5KCJ2YWx1ZSIpOworICAgICAgICAgICAgZm9yIChKQ2xhc3Mgb2YgOiBvYmplY3RGYWN0b3JpZXMpIHsKKyAgICAgICAgICAgICAgICBwYXJhbUFycmF5ID0gcGFyYW1BcnJheS5wYXJhbShvZik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQ29kZVdyaXRlciBjdyA9IG5ldyBXU0NvZGVXcml0ZXIoc291cmNlRGlyLGVudik7CiAKLSAgICAgICAgaWYoZW52LnZlcmJvc2UoKSkKLSAgICAgICAgICAgIGN3ID0gbmV3IFByb2dyZXNzQ29kZVdyaXRlcihjdywgU3lzdGVtLm91dCk7Ci0gICAgICAgIGNtLmJ1aWxkKGN3KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgd3JpdGVXZWJNZXRob2QoT3BlcmF0aW9uIG9wZXJhdGlvbiwgSk1ldGhvZCBtKSB7CiAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gb3BlcmF0aW9uLmdldFJlc3BvbnNlKCk7Ci0gICAgICAgIEpBbm5vdGF0aW9uVXNlIHdlYk1ldGhvZEFubiA9IG0uYW5ub3RhdGUoY20ucmVmKFdlYk1ldGhvZC5jbGFzcykpOzsKKyAgICAgICAgSkFubm90YXRpb25Vc2Ugd2ViTWV0aG9kQW5uID0gbS5hbm5vdGF0ZShjbS5yZWYoV2ViTWV0aG9kLmNsYXNzKSk7CiAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFzeW5jT3BlcmF0aW9uKT8KICAgICAgICAgICAgICAgICAoKEFzeW5jT3BlcmF0aW9uKW9wZXJhdGlvbikuZ2V0Tm9ybWFsT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOgogICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7CkBAIC0yMTQsNyArMjA2LDcgQEAKICAgICAgICAgICAgIG0uYW5ub3RhdGUoamF2YXguandzLk9uZXdheS5jbGFzcyk7CiAgICAgICAgIH1lbHNlIGlmICghb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpICYmCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRSZXNwb25zZSgpLmdldFBhcmFtZXRlcnNMaXN0KCkuc2l6ZSgpID4gMCl7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IG51bGw7CisgICAgICAgICAgICBCbG9jayBibG9jazsKICAgICAgICAgICAgIFN0cmluZyByZXN1bHROYW1lID0gbnVsbDsKICAgICAgICAgICAgIFN0cmluZyBuc1VSSSA9IG51bGw7CiAgICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldFJlc3BvbnNlKCkuZ2V0Qm9keUJsb2NrcygpLmhhc05leHQoKSkgewpAQCAtMjQ1LDExICsyMzcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgSkFubm90YXRpb25Vc2Ugd3IgPSBudWxsOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZighcmVzdWx0TmFtZS5lcXVhbHMoInJldHVybiIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3ciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ciA9IG0uYW5ub3RhdGUoamF2YXguandzLldlYlJlc3VsdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3IgPSBtLmFubm90YXRlKGphdmF4Lmp3cy5XZWJSZXN1bHQuY2xhc3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyLnBhcmFtKCJuYW1lIiwgcmVzdWx0TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChvcGVyYXRpb24uZ2V0U3R5bGUoKS5lcXVhbHMoU09BUFN0eWxlLkRPQ1VNRU5UKSAmJiAhKG5zVVJJLmVxdWFscyhzZXJ2aWNlTlMpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG5zVVJJICE9IG51bGwpICYmICghbnNVUkkuZXF1YWxzKHNlcnZpY2VOUykgfHwgKGlzRG9jU3R5bGUgJiYgb3BlcmF0aW9uLmlzV3JhcHBlZCgpKSkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdyID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyID0gbS5hbm5vdGF0ZShqYXZheC5qd3MuV2ViUmVzdWx0LmNsYXNzKTsKQEAgLTI5OCwxOCArMjg4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vVE9ETzogSkFYQiBzaG91bGQgZXhwb3NlIHRoZSBhbm5vdGF0aW9ucyBzbyB0aGF0IGl0IGNhbiBiZSBhZGRlZCB0byBKQW5ub3RhdGlvblVzZQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSkFYQlR5cGVBbm5vdGF0aW9ucyhKQW5ub3RhdGlvblVzZSBhbm5Vc2UsIFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uewotICAgICAgICBMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBwYXJhbS5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBpZihhbm5vdGF0aW9ucyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGZvcihTdHJpbmcgYW5ub3RhdGlvbjpwYXJhbS5nZXRBbm5vdGF0aW9ucygpKXsKLSAgICAgICAgICAgIC8vcC5wbG4oYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICAvL2FublVzZS4KLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBpc01lc3NhZ2VQYXJhbShQYXJhbWV0ZXIgcGFyYW0sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICBCbG9jayBibG9jayA9IHBhcmFtLmdldEJsb2NrKCk7CiAKQEAgLTM1Nyw3ICszMzUsNyBAQAogICAgICAgICBSZXNwb25zZSByZXMgPSBvcGVyYXRpb24uZ2V0UmVzcG9uc2UoKTsKIAogICAgICAgICBib29sZWFuIGhlYWRlciA9IGlzSGVhZGVyUGFyYW0ocGFyYW0sIHJlcSkgfHwKLSAgICAgICAgICAgIChyZXMgIT0gbnVsbCA/IGlzSGVhZGVyUGFyYW0ocGFyYW0sIHJlcykgOiBmYWxzZSk7CisgICAgICAgICAgICAocmVzICE9IG51bGwgJiYgaXNIZWFkZXJQYXJhbShwYXJhbSwgcmVzKSk7CiAKICAgICAgICAgU3RyaW5nIG5hbWU7CiAgICAgICAgIGJvb2xlYW4gaXNXcmFwcGVkID0gb3BlcmF0aW9uLmlzV3JhcHBlZCgpOwpAQCAtMzc0LDkgKzM1Miw5IEBACiAgICAgICAgIGlmIChpc0RvY1N0eWxlKSB7CiAgICAgICAgICAgICBucyA9IHBhcmFtLmdldEJsb2NrKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOyAvLyBpdHMgYmFyZSBuc3VyaQogICAgICAgICAgICAgaWYoaXNXcmFwcGVkKXsKLSAgICAgICAgICAgICAgICBucyA9ICgoSkFYQlR5cGUpcGFyYW0uZ2V0VHlwZSgpKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICAgICAgbnMgPSBwYXJhbS5nZXRUeXBlKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwogICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZSBpZighaXNEb2NTdHlsZSAmJiBoZWFkZXIpeworICAgICAgICB9ZWxzZSBpZihoZWFkZXIpewogICAgICAgICAgICAgbnMgPSBwYXJhbS5nZXRCbG9jaygpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKICAgICAgICAgfQogCkBAIC0zOTAsNyArMzY4LDcgQEAKICAgICAgICAgaWYgKHBhcmFtLmlzSU5PVVQoKSl7CiAgICAgICAgICAgICBwYXJhbUFubm8ucGFyYW0oIm1vZGUiLCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZS5JTk9VVCk7CiAgICAgICAgIH1lbHNlIGlmICgocmVzICE9IG51bGwpICYmIChpc01lc3NhZ2VQYXJhbShwYXJhbSwgcmVzKSB8fCBpc0hlYWRlclBhcmFtKHBhcmFtLCByZXMpIHx8IGlzQXR0YWNobWVudFBhcmFtKHBhcmFtLCByZXMpIHx8Ci0gICAgICAgICAgICAgICAgaXNVbmJvdW5kUGFyYW0ocGFyYW0scmVzKSkpeworICAgICAgICAgICAgICAgIGlzVW5ib3VuZFBhcmFtKHBhcmFtLHJlcykgfHwgcGFyYW0uaXNPVVQoKSkpewogICAgICAgICAgICAgcGFyYW1Bbm5vLnBhcmFtKCJtb2RlIiwgamF2YXguandzLldlYlBhcmFtLk1vZGUuT1VUKTsKICAgICAgICAgfQogCkBAIC0zOTksMTQgKzM3NywxMyBAQAogICAgICAgICAgICAgcGFyYW1Bbm5vLnBhcmFtKCJwYXJ0TmFtZSIsIGphdmFQYXJhbWV0ZXIuZ2V0UGFyYW1ldGVyKCkuZ2V0TmFtZSgpKTsKICAgICB9CiAKLSAgICBib29sZWFuIGlzRG9jU3R5bGUgPSB0cnVlOwotICAgIGJvb2xlYW4gc2FtZVBhcmFtU3R5bGUgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RvY1N0eWxlID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2FtZVBhcmFtU3R5bGUgPSB0cnVlOwogICAgIHByaXZhdGUgdm9pZCB3cml0ZVNPQVBCaW5kaW5nKFBvcnQgcG9ydCwgSkRlZmluZWRDbGFzcyBjbHMpIHsKICAgICAgICAgSkFubm90YXRpb25Vc2Ugc29hcEJpbmRpbmdBbm4gPSBudWxsOwotICAgICAgICBpc0RvY1N0eWxlID0gcG9ydC5nZXRTdHlsZSgpICE9IG51bGwgPyBwb3J0LmdldFN0eWxlKCkuZXF1YWxzKFNPQVBTdHlsZS5ET0NVTUVOVCkgOiB0cnVlOworICAgICAgICBpc0RvY1N0eWxlID0gcG9ydC5nZXRTdHlsZSgpID09IG51bGwgfHwgcG9ydC5nZXRTdHlsZSgpLmVxdWFscyhTT0FQU3R5bGUuRE9DVU1FTlQpOwogICAgICAgICBpZighaXNEb2NTdHlsZSl7Ci0gICAgICAgICAgICBpZihzb2FwQmluZGluZ0FubiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nQW5uID0gY2xzLmFubm90YXRlKFNPQVBCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIHNvYXBCaW5kaW5nQW5uID0gY2xzLmFubm90YXRlKFNPQVBCaW5kaW5nLmNsYXNzKTsKICAgICAgICAgICAgIHNvYXBCaW5kaW5nQW5uLnBhcmFtKCJzdHlsZSIsIFNPQVBCaW5kaW5nLlN0eWxlLlJQQyk7CiAgICAgICAgICAgICBwb3J0LnNldFdyYXBwZWQodHJ1ZSk7CiAgICAgICAgIH0KQEAgLTQzMyw3ICs0MTAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlV2ViU2VydmljZUFubm90YXRpb24oU2VydmljZSBzZXJ2aWNlLCBQb3J0IHBvcnQsIEpBbm5vdGF0aW9uVXNlIHdzYSkgeworICAgIHByaXZhdGUgdm9pZCB3cml0ZVdlYlNlcnZpY2VBbm5vdGF0aW9uKFBvcnQgcG9ydCwgSkFubm90YXRpb25Vc2Ugd3NhKSB7CiAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpIHBvcnQuZ2V0UHJvcGVydHkoTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1dTRExfUE9SVF9UWVBFX05BTUUpOwogICAgICAgICB3c2EucGFyYW0oIm5hbWUiLCBuYW1lLmdldExvY2FsUGFydCgpKTsKICAgICAgICAgd3NhLnBhcmFtKCJ0YXJnZXROYW1lc3BhY2UiLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKQEAgLTQ1MSw3ICs0MjgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHZpc2l0KFNlcnZpY2Ugc2VydmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBqZCA9IG1vZGVsLmdldEphdmFEb2MoKTsKICAgICAgICAgaWYoamQgIT0gbnVsbCl7Ci0gICAgICAgICAgICBKUGFja2FnZSBwa2cgPSBjbS5fcGFja2FnZSh3c2RsTW9kZWxJbmZvLmdldEphdmFQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIEpQYWNrYWdlIHBrZyA9IGNtLl9wYWNrYWdlKG9wdGlvbnMuZGVmYXVsdFBhY2thZ2UpOwogICAgICAgICAgICAgcGtnLmphdmFkb2MoKS5hZGQoamQpOwogICAgICAgICB9CiAKQEAgLTQ2NywxMSArNDQ0LDE1IEBACiAKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGUoc2VydmljZSwgcG9ydCk7CisgICAgICAgICAgICB3cml0ZShwb3J0KTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmF0b3JFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgImdlbmVyYXRvci5uZXN0ZWRHZW5lcmF0b3JFcnJvciIsCiAgICAgICAgICAgICAgICAgZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXIoVEphdmFHZW5lcmF0b3JFeHRlbnNpb24gaCkgeworICAgICAgICBleHRlbnNpb25IYW5kbGVycy5hZGQoaCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL1NlcnZpY2VHZW5lcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9TZXJ2aWNlR2VuZXJhdG9yLmphdmEKaW5kZXggMWUyZWFkYi4uMmNlYTExOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL1NlcnZpY2VHZW5lcmF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9nZW5lcmF0b3IvU2VydmljZUdlbmVyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDk3ICsyNSw1MSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvcjsKIAotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzc0FscmVhZHlFeGlzdHNFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuQ2xhc3NUeXBlOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkNvZGVXcml0ZXI7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkFubm90YXRpb25Vc2U7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkNsYXNzOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDb21tZW50UGFydDsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KRGVmaW5lZENsYXNzOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpEb2NDb21tZW50OwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpFeHByZXNzaW9uOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpGaWVsZFZhcjsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KTWV0aG9kOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpNb2Q7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlR5cGU7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuKjsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC53cml0ZXIuUHJvZ3Jlc3NDb2RlV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlhKQzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5Qcm9jZXNzb3JBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLldTRExNb2RlbEluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuUG9ydDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5TZXJ2aWNlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YUludGVyZmFjZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5XU0NvZGVXcml0ZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQVmVyc2lvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkpBWFdTVXRpbHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLk9wdGlvbnM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRPcHRpb25zOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLkdlbmVyYXRvck1lc3NhZ2VzOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkpBWEJSSUNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5KQVhXU1V0aWxzOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsKIGltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CiAKIAogLyoqCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSBpbXBsZW1lbnRzIFByb2Nlc3NvckFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5TOwotICAgIHByaXZhdGUgV1NETE1vZGVsSW5mbyB3c2RsTW9kZWxJbmZvOworcHVibGljIGNsYXNzIFNlcnZpY2VHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3JCYXNlewogCi0gICAgcHVibGljIFNlcnZpY2VHZW5lcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKE1vZGVsIG1vZGVsLCBXc2ltcG9ydE9wdGlvbnMgb3B0aW9ucywgRXJyb3JSZWNlaXZlciByZWNlaXZlcil7CisgICAgICAgIFNlcnZpY2VHZW5lcmF0b3Igc2VydmljZUdlbmVyYXRvciA9IG5ldyBTZXJ2aWNlR2VuZXJhdG9yKG1vZGVsLCBvcHRpb25zLCByZWNlaXZlcik7CisgICAgICAgIHNlcnZpY2VHZW5lcmF0b3IuZG9HZW5lcmF0aW9uKCk7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlR2VuZXJhdG9yKAotICAgICAgICBNb2RlbCBtb2RlbCwKLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcsCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBzdXBlcihtb2RlbCwgY29uZmlnLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgdGhpcy53c2RsTW9kZWxJbmZvID0gKFdTRExNb2RlbEluZm8pY29uZmlnLmdldE1vZGVsSW5mbygpOwotICAgIH0KLQotICAgIHB1YmxpYyBHZW5lcmF0b3JCYXNlIGdldEdlbmVyYXRvcigKLSAgICAgICAgTW9kZWwgbW9kZWwsCi0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnLAotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlR2VuZXJhdG9yKG1vZGVsLCBjb25maWcsIHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBHZW5lcmF0b3JCYXNlIGdldEdlbmVyYXRvcigKLSAgICAgICAgTW9kZWwgbW9kZWwsCi0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnLAotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgIFNPQVBWZXJzaW9uIHZlcikgewotICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VHZW5lcmF0b3IobW9kZWwsIGNvbmZpZywgcHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gIm5ldyBRTmFtZSguLi4pIgotICAgICAqLwotICAgIHByaXZhdGUgSkludm9jYXRpb24gY3JlYXRlUU5hbWUoUU5hbWUgbmFtZSkgewotICAgICAgICByZXR1cm4gSkV4cHIuX25ldyhjbS5yZWYoUU5hbWUuY2xhc3MpKS5hcmcobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkuYXJnKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOworICAgIHByaXZhdGUgU2VydmljZUdlbmVyYXRvcihNb2RlbCBtb2RlbCwgV3NpbXBvcnRPcHRpb25zIG9wdGlvbnMsIEVycm9yUmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgc3VwZXIobW9kZWwsIG9wdGlvbnMsIHJlY2VpdmVyKTsKICAgICB9CiAKICAgICBwcml2YXRlIEpJbnZvY2F0aW9uIGNyZWF0ZVVSTChVUkwgdXJsKSB7CiAgICAgICAgIHJldHVybiBKRXhwci5fbmV3KGNtLnJlZihVUkwuY2xhc3MpKS5hcmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChTZXJ2aWNlIHNlcnZpY2UpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEphdmFJbnRlcmZhY2UgaW50ZiA9IChKYXZhSW50ZXJmYWNlKSBzZXJ2aWNlLmdldEphdmFJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbnYuZ2V0TmFtZXMoKS5jdXN0b21KYXZhVHlwZUNsYXNzTmFtZShpbnRmKTsKLSAgICAgICAgICAgIGlmIChkb25vdE92ZXJyaWRlICYmIEdlbmVyYXRvclV0aWwuY2xhc3NFeGlzdHMoZW52LCBjbGFzc05hbWUpKSB7CisgICAgICAgICAgICBKYXZhSW50ZXJmYWNlIGludGYgPSBzZXJ2aWNlLmdldEphdmFJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBOYW1lcy5jdXN0b21KYXZhVHlwZUNsYXNzTmFtZShpbnRmKTsKKyAgICAgICAgICAgIGlmIChkb25vdE92ZXJyaWRlICYmIEdlbmVyYXRvclV0aWwuY2xhc3NFeGlzdHMob3B0aW9ucywgY2xhc3NOYW1lKSkgewogICAgICAgICAgICAgICAgIGxvZygiQ2xhc3MgIiArIGNsYXNzTmFtZSArICIgZXhpc3RzLiBOb3Qgb3ZlcnJpZGluZy4iKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xNjgsNDYgKzEyMiw3MCBAQAogICAgICAgICAgICAgd3JpdGVXZWJTZXJ2aWNlQ2xpZW50QW5ub3RhdGlvbihzZXJ2aWNlLCB3ZWJTZXJ2aWNlQ2xpZW50QW5uKTsKIAogICAgICAgICAgICAgLy9ASGFuZGxlckNoYWluCi0gICAgICAgICAgICB3cml0ZUhhbmRsZXJDb25maWcoZW52LmdldE5hbWVzKCkuY3VzdG9tSmF2YVR5cGVDbGFzc05hbWUoc2VydmljZS5nZXRKYXZhSW50ZXJmYWNlKCkpLCBjbHMsIHdzZGxNb2RlbEluZm8pOworICAgICAgICAgICAgd3JpdGVIYW5kbGVyQ29uZmlnKE5hbWVzLmN1c3RvbUphdmFUeXBlQ2xhc3NOYW1lKHNlcnZpY2UuZ2V0SmF2YUludGVyZmFjZSgpKSwgY2xzLCBvcHRpb25zKTsKIAogICAgICAgICAgICAgZm9yIChQb3J0IHBvcnQ6IHNlcnZpY2UuZ2V0UG9ydHMoKSkgewogICAgICAgICAgICAgICAgIGlmIChwb3J0LmlzUHJvdmlkZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8vIE5vIGdldFhZWlBvcnQoKSBmb3IgcG9ydmlkZXIgYmFzZWQgZW5kcG9pbnQKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9AV2ViRW5kcG9pbnQKLSAgICAgICAgICAgICAgICBKTWV0aG9kIG0gPSBudWxsOwotICAgICAgICAgICAgICAgIEpEb2NDb21tZW50IG1ldGhvZERvYyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgSlR5cGUgcmV0VHlwZSA9IGdldENsYXNzKHBvcnQuZ2V0SmF2YUludGVyZmFjZSgpLmdldE5hbWUoKSwgQ2xhc3NUeXBlLklOVEVSRkFDRSk7Ci0gICAgICAgICAgICAgICAgbSA9IGNscy5tZXRob2QoSk1vZC5QVUJMSUMsIHJldFR5cGUsIHBvcnQuZ2V0UG9ydEdldHRlcigpKTsKLSAgICAgICAgICAgICAgICBtZXRob2REb2MgPSBtLmphdmFkb2MoKTsKLSAgICAgICAgICAgICAgICBpZihwb3J0LmdldEphdmFEb2MoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBtZXRob2REb2MuYWRkKHBvcnQuZ2V0SmF2YURvYygpKTsKLSAgICAgICAgICAgICAgICBKQ29tbWVudFBhcnQgcmV0ID0gbWV0aG9kRG9jLmFkZFJldHVybigpOwotICAgICAgICAgICAgICAgIHJldC5hZGQoInJldHVybnMgIityZXRUeXBlLm5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgSkJsb2NrIGJvZHkgPSBtLmJvZHkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc3RhdGVtZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigicmV0dXJuICgiKTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYXBwZW5kKHJldFR5cGUubmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYXBwZW5kKCIpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoXCIiK3BvcnQuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKyJcIiwgXCIiKyBwb3J0LmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSsiXCIpLCAiKTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYXBwZW5kKHJldFR5cGUubmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYXBwZW5kKCIuY2xhc3MpOyIpOwotICAgICAgICAgICAgICAgIGJvZHkuZGlyZWN0U3RhdGVtZW50KHN0YXRlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB3cml0ZVdlYkVuZHBvaW50KHBvcnQsIG0pOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBnZXRYeXpQb3J0KCkKKyAgICAgICAgICAgICAgICB3cml0ZURlZmF1bHRHZXRQb3J0KHBvcnQsIGNscyk7CisKKyAgICAgICAgICAgICAgICAvL3dyaXRlIGdldFh5elBvcnQoV2ViU2VydmljZXNGZWF0dXJlLi4uKQorICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMudGFyZ2V0LmlzTGF0ZXJUaGFuKE9wdGlvbnMuVGFyZ2V0LlYyXzEpKQorICAgICAgICAgICAgICAgICAgICB3cml0ZUdldFBvcnQocG9ydCwgY2xzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvZGVXcml0ZXIgY3cgPSBuZXcgV1NDb2RlV3JpdGVyKHNvdXJjZURpcixlbnYpOwotCi0gICAgICAgICAgICBpZihlbnYudmVyYm9zZSgpKQotICAgICAgICAgICAgICAgIGN3ID0gbmV3IFByb2dyZXNzQ29kZVdyaXRlcihjdywgU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBjbS5idWlsZChjdyk7Ci0KICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yLm5lc3RlZEdlbmVyYXRvckVycm9yIiwKLSAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIHJlY2VpdmVyLmVycm9yKGUpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlR2V0UG9ydChQb3J0IHBvcnQsIEpEZWZpbmVkQ2xhc3MgY2xzKSB7CisgICAgICAgIEpUeXBlIHJldFR5cGUgPSBnZXRDbGFzcyhwb3J0LmdldEphdmFJbnRlcmZhY2UoKS5nZXROYW1lKCksIENsYXNzVHlwZS5JTlRFUkZBQ0UpOworICAgICAgICBKTWV0aG9kIG0gPSBjbHMubWV0aG9kKEpNb2QuUFVCTElDLCByZXRUeXBlLCBwb3J0LmdldFBvcnRHZXR0ZXIoKSk7CisgICAgICAgIEpEb2NDb21tZW50IG1ldGhvZERvYyA9IG0uamF2YWRvYygpOworICAgICAgICBpZihwb3J0LmdldEphdmFEb2MoKSAhPSBudWxsKQorICAgICAgICAgICAgbWV0aG9kRG9jLmFkZChwb3J0LmdldEphdmFEb2MoKSk7CisgICAgICAgIEpDb21tZW50UGFydCByZXQgPSBtZXRob2REb2MuYWRkUmV0dXJuKCk7CisgICAgICAgIEpDb21tZW50UGFydCBwYXJhbURvYyA9IG1ldGhvZERvYy5hZGRQYXJhbSgiZmVhdHVyZXMiKTsKKyAgICAgICAgcGFyYW1Eb2MuYXBwZW5kKCJBIGxpc3Qgb2YgIik7CisgICAgICAgIHBhcmFtRG9jLmFwcGVuZCgie0BsaW5rICIrV2ViU2VydmljZUZlYXR1cmUuY2xhc3MuZ2V0TmFtZSgpKyJ9Iik7CisgICAgICAgIHBhcmFtRG9jLmFwcGVuZCgidG8gY29uZmlndXJlIG9uIHRoZSBwcm94eS4gIFN1cHBvcnRlZCBmZWF0dXJlcyBub3QgaW4gdGhlIDxjb2RlPmZlYXR1cmVzPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiIpOworICAgICAgICByZXQuYWRkKCJyZXR1cm5zICIrcmV0VHlwZS5uYW1lKCkpOworICAgICAgICBtLnZhclBhcmFtKFdlYlNlcnZpY2VGZWF0dXJlLmNsYXNzLCAiZmVhdHVyZXMiKTsKKyAgICAgICAgSkJsb2NrIGJvZHkgPSBtLmJvZHkoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHN0YXRlbWVudCA9IG5ldyBTdHJpbmdCdWZmZXIoInJldHVybiAoIik7CisgICAgICAgIHN0YXRlbWVudC5hcHBlbmQocmV0VHlwZS5uYW1lKCkpOworICAgICAgICBzdGF0ZW1lbnQuYXBwZW5kKCIpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoXCIiKS5hcHBlbmQocG9ydC5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpLmFwcGVuZCgiXCIsIFwiIikuYXBwZW5kKHBvcnQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKS5hcHBlbmQoIlwiKSwgIik7CisgICAgICAgIHN0YXRlbWVudC5hcHBlbmQocmV0VHlwZS5uYW1lKCkpOworICAgICAgICBzdGF0ZW1lbnQuYXBwZW5kKCIuY2xhc3MsIGZlYXR1cmVzKTsiKTsKKyAgICAgICAgYm9keS5kaXJlY3RTdGF0ZW1lbnQoc3RhdGVtZW50LnRvU3RyaW5nKCkpOworICAgICAgICB3cml0ZVdlYkVuZHBvaW50KHBvcnQsIG0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZURlZmF1bHRHZXRQb3J0KFBvcnQgcG9ydCwgSkRlZmluZWRDbGFzcyBjbHMpIHsKKyAgICAgICAgSlR5cGUgcmV0VHlwZSA9IGdldENsYXNzKHBvcnQuZ2V0SmF2YUludGVyZmFjZSgpLmdldE5hbWUoKSwgQ2xhc3NUeXBlLklOVEVSRkFDRSk7CisgICAgICAgIFN0cmluZyBwb3J0R2V0dGVyID0gcG9ydC5nZXRQb3J0R2V0dGVyKCk7CisgICAgICAgIEpNZXRob2QgbSA9IGNscy5tZXRob2QoSk1vZC5QVUJMSUMsIHJldFR5cGUsIHBvcnRHZXR0ZXIpOworICAgICAgICBKRG9jQ29tbWVudCBtZXRob2REb2MgPSBtLmphdmFkb2MoKTsKKyAgICAgICAgaWYocG9ydC5nZXRKYXZhRG9jKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIG1ldGhvZERvYy5hZGQocG9ydC5nZXRKYXZhRG9jKCkpOworICAgICAgICBKQ29tbWVudFBhcnQgcmV0ID0gbWV0aG9kRG9jLmFkZFJldHVybigpOworICAgICAgICByZXQuYWRkKCJyZXR1cm5zICIrcmV0VHlwZS5uYW1lKCkpOworICAgICAgICBKQmxvY2sgYm9keSA9IG0uYm9keSgpOworICAgICAgICBTdHJpbmdCdWZmZXIgc3RhdGVtZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigicmV0dXJuICgiKTsKKyAgICAgICAgc3RhdGVtZW50LmFwcGVuZChyZXRUeXBlLm5hbWUoKSk7CisgICAgICAgIHN0YXRlbWVudC5hcHBlbmQoIilzdXBlci5nZXRQb3J0KG5ldyBRTmFtZShcIiIpLmFwcGVuZChwb3J0LmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSkuYXBwZW5kKCJcIiwgXCIiKS5hcHBlbmQocG9ydC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpLmFwcGVuZCgiXCIpLCAiKTsKKyAgICAgICAgc3RhdGVtZW50LmFwcGVuZChyZXRUeXBlLm5hbWUoKSk7CisgICAgICAgIHN0YXRlbWVudC5hcHBlbmQoIi5jbGFzcyk7Iik7CisgICAgICAgIGJvZHkuZGlyZWN0U3RhdGVtZW50KHN0YXRlbWVudC50b1N0cmluZygpKTsKKyAgICAgICAgd3JpdGVXZWJFbmRwb2ludChwb3J0LCBtKTsKKyAgICB9CisKKwogICAgIHByb3RlY3RlZCBKRGVmaW5lZENsYXNzIGdldENsYXNzKFN0cmluZyBjbGFzc05hbWUsIENsYXNzVHlwZSB0eXBlKSB7Ci0gICAgICAgIEpEZWZpbmVkQ2xhc3MgY2xzID0gbnVsbDsKKyAgICAgICAgSkRlZmluZWRDbGFzcyBjbHM7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbHMgPSBjbS5fY2xhc3MoY2xhc3NOYW1lLCB0eXBlKTsKICAgICAgICAgfSBjYXRjaCAoSkNsYXNzQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBlKXsKQEAgLTIxOCw3ICsxOTYsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlV2ViU2VydmljZUNsaWVudEFubm90YXRpb24oU2VydmljZSBzZXJ2aWNlLCBKQW5ub3RhdGlvblVzZSB3c2EpIHsKICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIHNlcnZpY2VOUyA9IHNlcnZpY2UuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICBTdHJpbmcgc2VydmljZU5TPSBzZXJ2aWNlLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKICAgICAgICAgd3NhLnBhcmFtKCJuYW1lIiwgc2VydmljZU5hbWUpOwogICAgICAgICB3c2EucGFyYW0oInRhcmdldE5hbWVzcGFjZSIsIHNlcnZpY2VOUyk7CiAgICAgICAgIHdzYS5wYXJhbSgid3NkbExvY2F0aW9uIiwgd3NkbExvY2F0aW9uKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9TaW1wbGVUb0JveGVkVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL1NpbXBsZVRvQm94ZWRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmE4ODAuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL1NpbXBsZVRvQm94ZWRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZVRvQm94ZWRVdGlsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJveGVkRXhwcmVzc2lvbk9mVHlwZShTdHJpbmcgcywgU3RyaW5nIGMpIHsKLSAgICAgICAgaWYgKGlzUHJpbWl0aXZlKGMpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIm5ldyAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChnZXRCb3hlZENsYXNzTmFtZShjKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJygnKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnKScpOwotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5ib3hlZEV4cHJlc3Npb25PZlR5cGUoU3RyaW5nIHMsIFN0cmluZyBjKSB7Ci0gICAgICAgIGlmIChpc1ByaW1pdGl2ZShjKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCcoJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIikuIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlZhbHVlKCkiKTsKLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uRnJvbVR5cGVUb1R5cGUoCi0gICAgICAgIFN0cmluZyBzLAotICAgICAgICBTdHJpbmcgZnJvbSwKLSAgICAgICAgU3RyaW5nIHRvKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZyb20uZXF1YWxzKHRvKSkKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaXNQcmltaXRpdmUodG8pICYmIGlzUHJpbWl0aXZlKGZyb20pKQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRCb3hlZEV4cHJlc3Npb25PZlR5cGUocywgZnJvbSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChpc1ByaW1pdGl2ZSh0bykgJiYgaXNQcmltaXRpdmUoZnJvbSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFVuYm94ZWRFeHByZXNzaW9uT2ZUeXBlKHMsIHRvKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJveGVkQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgaWYgKGlzUHJpbWl0aXZlKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiamF2YS5sYW5nLiIpOwotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5lcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJJbnRlZ2VyIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChjbGFzc05hbWUuZXF1YWxzKGNoYXIuY2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkNoYXJhY3RlciIpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjbGFzc05hbWUuY2hhckF0KDApKSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNsYXNzTmFtZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gcHJpbWl0aXZlU2V0LmNvbnRhaW5zKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIFNldCBwcmltaXRpdmVTZXQgPSBudWxsOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgcHJpbWl0aXZlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgcHJpbWl0aXZlU2V0LmFkZCgiYm9vbGVhbiIpOwotICAgICAgICBwcmltaXRpdmVTZXQuYWRkKCJieXRlIik7Ci0gICAgICAgIHByaW1pdGl2ZVNldC5hZGQoImRvdWJsZSIpOwotICAgICAgICBwcmltaXRpdmVTZXQuYWRkKCJmbG9hdCIpOwotICAgICAgICBwcmltaXRpdmVTZXQuYWRkKCJpbnQiKTsKLSAgICAgICAgcHJpbWl0aXZlU2V0LmFkZCgibG9uZyIpOwotICAgICAgICBwcmltaXRpdmVTZXQuYWRkKCJzaG9ydCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9XM0NBZGRyZXNzaW5nSmF2YUdlbmVyYXRvckV4dGVuc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvZ2VuZXJhdG9yL1czQ0FkZHJlc3NpbmdKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjMTBkZAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL2dlbmVyYXRvci9XM0NBZGRyZXNzaW5nSmF2YUdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKy8qCisgKiAkSWQ6IFczQ0FkZHJlc3NpbmdKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uLmphdmEsdiAxLjEuMi40IDIwMDYvMTAvMzEgMTk6NTc6Mjggdml2ZWtwIEV4cCAkCisgKi8KKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3I7CisKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQW5ub3RhdGlvbkFycmF5TWVtYmVyOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpBbm5vdGF0aW9uVXNlOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KTWV0aG9kOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLlRKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExPcGVyYXRpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkZhdWx0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5PcGVyYXRpb247CisKK2ltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5GYXVsdEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEBhdXRob3IgQXJ1biBHdXB0YQorICovCitwdWJsaWMgY2xhc3MgVzNDQWRkcmVzc2luZ0phdmFHZW5lcmF0b3JFeHRlbnNpb24gZXh0ZW5kcyBUSmF2YUdlbmVyYXRvckV4dGVuc2lvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVNZXRob2RBbm5vdGF0aW9ucyhUV1NETE9wZXJhdGlvbiB0d28sIEpNZXRob2Qgak1ldGhvZCkgeworICAgICAgICBKQW5ub3RhdGlvblVzZSBhY3Rpb25Bbm4gPSBudWxsOworCisgICAgICAgIGlmICghKHR3byBpbnN0YW5jZW9mIE9wZXJhdGlvbikpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgT3BlcmF0aW9uIG8gPSAoKE9wZXJhdGlvbil0d28pOworCisgICAgICAgIC8vIGV4cGxpY2l0IGlucHV0IGFjdGlvbgorICAgICAgICBpZiAoby5nZXRJbnB1dCgpLmdldEFjdGlvbigpICE9IG51bGwgJiYgIW8uZ2V0SW5wdXQoKS5nZXRBY3Rpb24oKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHNwZWNpZmllZAorICAgICAgICAgICAgYWN0aW9uQW5uID0gak1ldGhvZC5hbm5vdGF0ZShBY3Rpb24uY2xhc3MpOworICAgICAgICAgICAgYWN0aW9uQW5uLnBhcmFtKCJpbnB1dCIsIG8uZ2V0SW5wdXQoKS5nZXRBY3Rpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBleHBsaWNpdCBvdXRwdXQgYWN0aW9uCisgICAgICAgIGlmIChvLmdldE91dHB1dCgpICE9IG51bGwgJiYgby5nZXRPdXRwdXQoKS5nZXRBY3Rpb24oKSAhPSBudWxsICYmICFvLmdldE91dHB1dCgpLmdldEFjdGlvbigpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgc3BlY2lmaWVkCisgICAgICAgICAgICBpZiAoYWN0aW9uQW5uID09IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uQW5uID0gak1ldGhvZC5hbm5vdGF0ZShBY3Rpb24uY2xhc3MpOworCisgICAgICAgICAgICBhY3Rpb25Bbm4ucGFyYW0oIm91dHB1dCIsIG8uZ2V0T3V0cHV0KCkuZ2V0QWN0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwbGljaXQgZmF1bHQgYWN0aW9uCisgICAgICAgIGlmIChvLmdldEZhdWx0cygpICE9IG51bGwgJiYgby5nZXRGYXVsdHMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBKQ2xhc3M+IG1hcCA9IG8uZ2V0RmF1bHRzKCk7CisgICAgICAgICAgICBKQW5ub3RhdGlvbkFycmF5TWVtYmVyIGphbSA9IG51bGw7CisKKyAgICAgICAgICAgIGZvciAoRmF1bHQgZiA6IG8uZmF1bHRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXRBY3Rpb24oKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmIChmLmdldEFjdGlvbigpLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkFubiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbkFubiA9IGpNZXRob2QuYW5ub3RhdGUoQWN0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGphbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGphbSA9IGFjdGlvbkFubi5wYXJhbUFycmF5KCJmYXVsdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBKQW5ub3RhdGlvblVzZSBmYUFubiA9IGphbS5hbm5vdGF0ZShGYXVsdEFjdGlvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgZmFBbm4ucGFyYW0oImNsYXNzTmFtZSIsIG1hcC5nZXQoZi5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBmYUFubi5wYXJhbSgidmFsdWUiLCBmLmdldEFjdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0Fic3RyYWN0VHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvQWJzdHJhY3RUeXBlLmphdmEKaW5kZXggNTZhYWRmYi4uYjg0YmJlMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvQWJzdHJhY3RUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvQWJzdHJhY3RUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTUgKzI1LDE0IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWw7CiAKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFUeXBlOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhVHlwZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk51bGxJdGVyYXRvcjsKLQogLyoqCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCkBAIC0xMjMsNyArMTIyLDcgQEAKIAogICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcm9wZXJ0aWVzKCkgewogICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTnVsbEl0ZXJhdG9yLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0FzeW5jT3BlcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Bc3luY09wZXJhdGlvbi5qYXZhCmluZGV4IDI4MmMzZWEuLjlhYTI2NDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0FzeW5jT3BlcmF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvQXN5bmNPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxNCArMjQsMTQgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbDsKIAotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLkpBWEJUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQlR5cGVBbmRBbm5vdGF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhU2ltcGxlVHlwZTsKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ2xhc3M7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkNvZGVNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFTaW1wbGVUeXBlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVR5cGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCVHlwZUFuZEFubm90YXRpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiAKIC8qKgpAQCAtNDQsMjQgKzQ0LDI0IEBACiAgICAgLyoqCiAgICAgICoKICAgICAgKi8KLSAgICBwdWJsaWMgQXN5bmNPcGVyYXRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7CisgICAgcHVibGljIEFzeW5jT3BlcmF0aW9uKEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgc3VwZXIoZW50aXR5KTsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIG9wZXJhdGlvbgogICAgICAqLwotICAgIHB1YmxpYyBBc3luY09wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIHN1cGVyKG9wZXJhdGlvbik7CisgICAgcHVibGljIEFzeW5jT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24sIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgc3VwZXIob3BlcmF0aW9uLCBlbnRpdHkpOwogICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAqLwotICAgIHB1YmxpYyBBc3luY09wZXJhdGlvbihRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOworICAgIHB1YmxpYyBBc3luY09wZXJhdGlvbihRTmFtZSBuYW1lLCBFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIHN1cGVyKG5hbWUsIGVudGl0eSk7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvQXN5bmNPcGVyYXRpb25UeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Bc3luY09wZXJhdGlvblR5cGUuamF2YQppbmRleCAyODc1ODk5Li43ODYyODFkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Bc3luY09wZXJhdGlvblR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Bc3luY09wZXJhdGlvblR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOSw3ICsyOSw3IEBACiAvKioKICAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CiAgKgotICogQXN5bmMgT3BlcmF0aW9uIHR5cGUKKyAqIEFzeW5jIFdTRExPcGVyYXRpb24gdHlwZQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQXN5bmNPcGVyYXRpb25UeXBlIHsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvQmxvY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0Jsb2NrLmphdmEKaW5kZXggNTczMjg1My4uNjkwZWI1ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvQmxvY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9CbG9jay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDYgKzI0LDEwIEBACiAgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWw7CiAKKworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC4qOworCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCkBAIC0zNywxMyArNDEsOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURFUiA9IDI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUQUNITUVOVCA9IDM7CiAKLSAgICBwdWJsaWMgQmxvY2soKSB7fQotCi0gICAgcHVibGljIEJsb2NrKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmxvY2soUU5hbWUgbmFtZSwgQWJzdHJhY3RUeXBlIHR5cGUpIHsKKyAgICBwdWJsaWMgQmxvY2soUU5hbWUgbmFtZSwgQWJzdHJhY3RUeXBlIHR5cGUsIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgc3VwZXIoZW50aXR5KTsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICB9CkBAIC01MiwxMCArNTEsNiBAQAogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG4pIHsKLSAgICAgICAgbmFtZSA9IG47Ci0gICAgfQotCiAgICAgcHVibGljIEFic3RyYWN0VHlwZSBnZXRUeXBlKCkgewogICAgICAgICByZXR1cm4gdHlwZTsKICAgICB9CkBAIC03NiwxNiArNzEsNyBAQAogICAgICAgICB2aXNpdG9yLnZpc2l0KHRoaXMpOwogICAgIH0KIAotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFFOYW1lIG5hbWU7CiAgICAgcHJpdmF0ZSBBYnN0cmFjdFR5cGUgdHlwZTsKICAgICBwcml2YXRlIGludCBsb2NhdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgaXMgdW5ib3VuZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVW5ib3VuZCgpIHsKLSAgICAgICAgaWYobG9jYXRpb24gPT0gVU5CT1VORCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvRXh0ZW5kZWRNb2RlbFZpc2l0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0V4dGVuZGVkTW9kZWxWaXNpdG9yLmphdmEKaW5kZXggNDg5Nzg0My4uZTJkNjNkZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvRXh0ZW5kZWRNb2RlbFZpc2l0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9FeHRlbmRlZE1vZGVsVmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0ZhdWx0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9GYXVsdC5qYXZhCmluZGV4IDRiNjI3MDUuLmU1YzFmMDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0ZhdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvRmF1bHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwyNiArMjQsMjkgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbDsKIAoraW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuR2VuZXJhdG9yVXRpbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5HZW5lcmF0b3JVdGlsOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ2xhc3M7Ci0KIC8qKgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCiBwdWJsaWMgY2xhc3MgRmF1bHQgZXh0ZW5kcyBNb2RlbE9iamVjdCB7CiAKLSAgICBwdWJsaWMgRmF1bHQoKSB7fQorICAgIHB1YmxpYyBGYXVsdChFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIHN1cGVyKGVudGl0eSk7CisgICAgfQogCi0gICAgcHVibGljIEZhdWx0KFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIEZhdWx0KFN0cmluZyBuYW1lLCBFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIHN1cGVyKGVudGl0eSk7CiAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgIHBhcmVudEZhdWx0ID0gbnVsbDsKICAgICB9CkBAIC04MCwyNiArODMsNiBAQAogICAgICAgICByZXR1cm4gcGFyZW50RmF1bHQ7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50RmF1bHQoRmF1bHQgcGFyZW50RmF1bHQpIHsKLSAgICAgICAgaWYgKHRoaXMucGFyZW50RmF1bHQgIT0gbnVsbCAmJgotICAgICAgICAgICAgcGFyZW50RmF1bHQgIT0gbnVsbCAmJgotICAgICAgICAgICAgIXRoaXMucGFyZW50RmF1bHQuZXF1YWxzKHBhcmVudEZhdWx0KSkgewotCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxFeGNlcHRpb24oIm1vZGVsLnBhcmVudC5mYXVsdC5hbHJlYWR5LnNldCIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZhdWx0LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50RmF1bHQuZ2V0TmFtZSgpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnBhcmVudEZhdWx0ID0gcGFyZW50RmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU3ViZmF1bHQoRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgc3ViZmF1bHRzLmFkZChmYXVsdCk7Ci0gICAgICAgIGZhdWx0LnNldFBhcmVudEZhdWx0KHRoaXMpOwotICAgIH0KLQogICAgIHB1YmxpYyBJdGVyYXRvciBnZXRTdWJmYXVsdHMoKSB7CiAgICAgICAgIGlmIChzdWJmYXVsdHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTA3LDEyICs5MCw2IEBACiAgICAgICAgIHJldHVybiBzdWJmYXVsdHMuaXRlcmF0b3IoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0U29ydGVkU3ViZmF1bHRzKCkgewotICAgICAgICBTZXQgc29ydGVkRmF1bHRzID0gbmV3IFRyZWVTZXQobmV3IEdlbmVyYXRvclV0aWwuRmF1bHRDb21wYXJhdG9yKCkpOwotICAgICAgICBzb3J0ZWRGYXVsdHMuYWRkQWxsKHN1YmZhdWx0cyk7Ci0gICAgICAgIHJldHVybiBzb3J0ZWRGYXVsdHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KICAgICAvKiBzZXJpYWxpemF0aW9uICovCiAgICAgcHVibGljIFNldCBnZXRTdWJmYXVsdHNTZXQoKSB7CiAgICAgICAgIHJldHVybiBzdWJmYXVsdHM7CkBAIC0xODcsNCArMTY0LDE0IEBACiAgICAgcHJpdmF0ZSBRTmFtZSBlbGVtZW50TmFtZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgamF2YU1lbWJlck5hbWUgPSBudWxsOwogICAgIHByaXZhdGUgSkNsYXNzIGV4Y2VwdGlvbkNsYXNzOworCisgICAgcHVibGljIFN0cmluZyBnZXRXc2RsRmF1bHROYW1lKCkgeworICAgICAgICByZXR1cm4gd3NkbEZhdWx0TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmF1bHROYW1lKFN0cmluZyB3c2RsRmF1bHROYW1lKSB7CisgICAgICAgIHRoaXMud3NkbEZhdWx0TmFtZSA9IHdzZGxGYXVsdE5hbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZhdWx0TmFtZTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0hlYWRlckZhdWx0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9IZWFkZXJGYXVsdC5qYXZhCmluZGV4IGJmOWFkOGYuLjM5N2M5NjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL0hlYWRlckZhdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvSGVhZGVyRmF1bHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxNCArMjQsMTggQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbDsKIAoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OworCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogcHVibGljIGNsYXNzIEhlYWRlckZhdWx0IGV4dGVuZHMgRmF1bHQgewogCi0gICAgcHVibGljIEhlYWRlckZhdWx0KCkge30KKyAgICBwdWJsaWMgSGVhZGVyRmF1bHQoRW50aXR5IGVudGl0eSkgeworICAgICAgICBzdXBlcihlbnRpdHkpOworICAgIH0KIAotICAgIHB1YmxpYyBIZWFkZXJGYXVsdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKKyAgICBwdWJsaWMgSGVhZGVyRmF1bHQoU3RyaW5nIG5hbWUsIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgZW50aXR5KTsKICAgICB9CiAKICAgICBwdWJsaWMgUU5hbWUgZ2V0TWVzc2FnZSgpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01lc3NhZ2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01lc3NhZ2UuamF2YQppbmRleCBlZDgwN2NhLi4xMTdhZWIzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9NZXNzYWdlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvTWVzc2FnZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDI2ICsyNSwyOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuQWJvcnRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuTW9kZWxNZXNzYWdlczsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLio7CiAKIC8qKgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVzc2FnZSBleHRlbmRzIE1vZGVsT2JqZWN0IHsKKyAgICBwcm90ZWN0ZWQgTWVzc2FnZShjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuTWVzc2FnZSBlbnRpdHksIEVycm9yUmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgc3VwZXIoZW50aXR5KTsKKyAgICAgICAgc2V0RXJyb3JSZWNlaXZlcihyZWNlaXZlcik7CisgICAgfQogCiAgICAgcHVibGljIHZvaWQgYWRkQm9keUJsb2NrKEJsb2NrIGIpIHsKICAgICAgICAgaWYgKF9ib2R5QmxvY2tzLmNvbnRhaW5zS2V5KGIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsRXhjZXB0aW9uKCJtb2RlbC51bmlxdWVuZXNzIik7CisgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKGdldEVudGl0eSgpLmdldExvY2F0b3IoKSwgTW9kZWxNZXNzYWdlcy5NT0RFTF9QQVJUX05PVF9VTklRVUUoKChjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuTWVzc2FnZSlnZXRFbnRpdHkoKSkuZ2V0TmFtZSgpLCBiLmdldE5hbWUoKSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgX2JvZHlCbG9ja3MucHV0KGIuZ2V0TmFtZSgpLCBiKTsKICAgICAgICAgYi5zZXRMb2NhdGlvbihCbG9jay5CT0RZKTsKQEAgLTg1LDcgKzg3LDggQEAKIAogICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlckJsb2NrKEJsb2NrIGIpIHsKICAgICAgICAgaWYgKF9oZWFkZXJCbG9ja3MuY29udGFpbnNLZXkoYi5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxFeGNlcHRpb24oIm1vZGVsLnVuaXF1ZW5lc3MiKTsKKyAgICAgICAgICAgIGVycm9yUmVjZWl2ZXIuZXJyb3IoZ2V0RW50aXR5KCkuZ2V0TG9jYXRvcigpLCBNb2RlbE1lc3NhZ2VzLk1PREVMX1BBUlRfTk9UX1VOSVFVRSgoKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlKWdldEVudGl0eSgpKS5nZXROYW1lKCksIGIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICBfaGVhZGVyQmxvY2tzLnB1dChiLmdldE5hbWUoKSwgYik7CiAgICAgICAgIGIuc2V0TG9jYXRpb24oQmxvY2suSEVBREVSKTsKQEAgLTExNiw3ICsxMTksOCBAQAogICAgIC8qKiBhdHRhY2htZW50IGJsb2NrICovCiAgICAgcHVibGljIHZvaWQgYWRkQXR0YWNobWVudEJsb2NrKEJsb2NrIGIpIHsKICAgICAgICAgaWYgKF9hdHRhY2htZW50QmxvY2tzLmNvbnRhaW5zS2V5KGIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsRXhjZXB0aW9uKCJtb2RlbC51bmlxdWVuZXNzIik7CisgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKGdldEVudGl0eSgpLmdldExvY2F0b3IoKSwgTW9kZWxNZXNzYWdlcy5NT0RFTF9QQVJUX05PVF9VTklRVUUoKChjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuTWVzc2FnZSlnZXRFbnRpdHkoKSkuZ2V0TmFtZSgpLCBiLmdldE5hbWUoKSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgX2F0dGFjaG1lbnRCbG9ja3MucHV0KGIuZ2V0TmFtZSgpLCBiKTsKICAgICAgICAgYi5zZXRMb2NhdGlvbihCbG9jay5BVFRBQ0hNRU5UKTsKQEAgLTE2OSw3ICsxNzMsOCBAQAogCiAgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwKSB7CiAgICAgICAgIGlmIChfcGFyYW1ldGVyc0J5TmFtZS5jb250YWluc0tleShwLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEV4Y2VwdGlvbigibW9kZWwudW5pcXVlbmVzcyIpOworICAgICAgICAgICAgZXJyb3JSZWNlaXZlci5lcnJvcihnZXRFbnRpdHkoKS5nZXRMb2NhdG9yKCksIE1vZGVsTWVzc2FnZXMuTU9ERUxfUEFSQU1FVEVSX05PVFVOSVFVRShwLmdldE5hbWUoKSwgcC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIF9wYXJhbWV0ZXJzLmFkZChwKTsKICAgICAgICAgX3BhcmFtZXRlcnNCeU5hbWUucHV0KHAuZ2V0TmFtZSgpLCBwKTsKQEAgLTE3OSw3ICsxODQsNyBAQAogICAgICAgICBpZiAoX3BhcmFtZXRlcnNCeU5hbWUuc2l6ZSgpICE9IF9wYXJhbWV0ZXJzLnNpemUoKSkgewogICAgICAgICAgICAgaW5pdGlhbGl6ZVBhcmFtZXRlcnNCeU5hbWUoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKFBhcmFtZXRlcikgX3BhcmFtZXRlcnNCeU5hbWUuZ2V0KG5hbWUpOworICAgICAgICByZXR1cm4gX3BhcmFtZXRlcnNCeU5hbWUuZ2V0KG5hbWUpOwogICAgIH0KIAogICAgIHB1YmxpYyBJdGVyYXRvcjxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7CkBAIC0yMDMsOCArMjA4LDggQEAKICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSAoUGFyYW1ldGVyKSBpdGVyLm5leHQoKTsKICAgICAgICAgICAgICAgICBpZiAocGFyYW0uZ2V0TmFtZSgpICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICAgICAgX3BhcmFtZXRlcnNCeU5hbWUuY29udGFpbnNLZXkocGFyYW0uZ2V0TmFtZSgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEV4Y2VwdGlvbigibW9kZWwudW5pcXVlbmVzcyIpOworICAgICAgICAgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKGdldEVudGl0eSgpLmdldExvY2F0b3IoKSwgTW9kZWxNZXNzYWdlcy5NT0RFTF9QQVJBTUVURVJfTk9UVU5JUVVFKHBhcmFtLmdldE5hbWUoKSwgcGFyYW0uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEV4Y2VwdGlvbigpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBfcGFyYW1ldGVyc0J5TmFtZS5wdXQocGFyYW0uZ2V0TmFtZSgpLCBwYXJhbSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Nb2RlbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvTW9kZWwuamF2YQppbmRleCA1OWFlNDkwLi5lZjY4NzAzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Nb2RlbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01vZGVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDExIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQk1vZGVsOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3NvckFjdGlvblZlcnNpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEudXRpbC4qOwogCiAvKioKICAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZW50aXJlIFdlYiBTZXJ2aWNlLiAgVGhlIEpBWC1XUyBQcm9jZXNzb3JBY3Rpb25zIGNhbiBwcm9jZXNzCkBAIC00NiwxMCArMzksMTIgQEAKICAqLwogcHVibGljIGNsYXNzIE1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3QgewogCi0gICAgcHVibGljIE1vZGVsKCkgeworICAgIHB1YmxpYyBNb2RlbChFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIHN1cGVyKGVudGl0eSk7CiAgICAgfQogCi0gICAgcHVibGljIE1vZGVsKFFOYW1lIG5hbWUpIHsKKyAgICBwdWJsaWMgTW9kZWwoUU5hbWUgbmFtZSwgRW50aXR5IGVudGl0eSkgeworICAgICAgICBzdXBlcihlbnRpdHkpOwogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgIH0KIApAQCAtMTQ1LDMxICsxNDAsNiBAQAogICAgICAgICBzb3VyY2UgPSBzdHJpbmc7CiAgICAgfQogCi0gICAgcHVibGljIFByb2Nlc3NvckFjdGlvblZlcnNpb24gZ2V0UHJvY2Vzc29yQWN0aW9uVmVyc2lvbigpewotICAgICAgICByZXR1cm4gcHJvY2Vzc29yQWN0aW9uVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzb3JBY3Rpb25WZXJzaW9uKFByb2Nlc3NvckFjdGlvblZlcnNpb24gdmVyc2lvbil7Ci0gICAgICAgIHRoaXMucHJvY2Vzc29yQWN0aW9uVmVyc2lvbiA9IHZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc29yQWN0aW9uVmVyc2lvbihTdHJpbmcgdmVyc2lvbil7Ci0gICAgICAgIGZvcihQcm9jZXNzb3JBY3Rpb25WZXJzaW9uIHBhVmVyc2lvbiA6IEVudW1TZXQuYWxsT2YoUHJvY2Vzc29yQWN0aW9uVmVyc2lvbi5jbGFzcykpewotICAgICAgICAgICAgc3dpdGNoKHBhVmVyc2lvbil7Ci0gICAgICAgICAgICAgICAgY2FzZSBQUkVfMjA6Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZlcnNpb24uZXF1YWxzKFByb2Nlc3NvckFjdGlvblZlcnNpb24uUFJFXzIwLnRvU3RyaW5nKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yQWN0aW9uVmVyc2lvbiA9IFByb2Nlc3NvckFjdGlvblZlcnNpb24uUFJFXzIwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZFUlNJT05fMjA6Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZlcnNpb24uZXF1YWxzKFByb2Nlc3NvckFjdGlvblZlcnNpb24uVkVSU0lPTl8yMC50b1N0cmluZygpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckFjdGlvblZlcnNpb24gPSBQcm9jZXNzb3JBY3Rpb25WZXJzaW9uLlZFUlNJT05fMjA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEV4Y2VwdGlvbigibW9kZWwuaW52YWxpZC5wcm9jZXNzb3JBY3Rpb25WZXJzaW9uIiwgbmV3IE9iamVjdFtde3ZlcnNpb259KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHNldEpBWEJNb2RlbChKQVhCTW9kZWwgamF4Qk1vZGVsKSB7CiAgICAgICAgIHRoaXMuamF4Qk1vZGVsID0gamF4Qk1vZGVsOwogICAgIH0KQEAgLTE4NSw1ICsxNTUsNCBAQAogICAgIHByaXZhdGUgU2V0PEFic3RyYWN0VHlwZT4gZXh0cmFUeXBlcyA9IG5ldyBIYXNoU2V0PEFic3RyYWN0VHlwZT4oKTsKICAgICBwcml2YXRlIFN0cmluZyBzb3VyY2U7CiAgICAgcHJpdmF0ZSBKQVhCTW9kZWwgamF4Qk1vZGVsID0gbnVsbDsKLSAgICBwcml2YXRlIFByb2Nlc3NvckFjdGlvblZlcnNpb24gcHJvY2Vzc29yQWN0aW9uVmVyc2lvbiA9IFByb2Nlc3NvckFjdGlvblZlcnNpb24uVkVSU0lPTl8yMDsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01vZGVsRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Nb2RlbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDExYjQ5YTcuLjRiMTRkYjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01vZGVsRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvTW9kZWxFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgIHN1cGVyKCJtb2RlbC5uZXN0ZWRNb2RlbEVycm9yIiwgYXJnKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMubW9kZWwiOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01vZGVsT2JqZWN0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Nb2RlbE9iamVjdC5qYXZhCmluZGV4IGMwYzQ3ZWEuLjFmMmZhZWIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01vZGVsT2JqZWN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvTW9kZWxPYmplY3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyMCArMjUsMzggQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbDsKIAoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk51bGxJdGVyYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCiAvKioKICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsT2JqZWN0IHsKLQogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFjY2VwdChNb2RlbFZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIEV4Y2VwdGlvbjsKIAorICAgIHByaXZhdGUgZmluYWwgRW50aXR5IGVudGl0eTsKKyAgICBwcm90ZWN0ZWQgRXJyb3JSZWNlaXZlciBlcnJvclJlY2VpdmVyOworCisgICAgcHJvdGVjdGVkIE1vZGVsT2JqZWN0KEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JSZWNlaXZlcihFcnJvclJlY2VpdmVyIGVycm9yUmVjZWl2ZXIpIHsKKyAgICAgICAgdGhpcy5lcnJvclJlY2VpdmVyID0gZXJyb3JSZWNlaXZlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRW50aXR5IGdldEVudGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICB9CisKICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKICAgICAgICAgaWYgKF9wcm9wZXJ0aWVzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtNjYsMTggKzg0LDIwIEBACiAKICAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJvcGVydGllcygpIHsKICAgICAgICAgaWYgKF9wcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBOdWxsSXRlcmF0b3IuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKS5pdGVyYXRvcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIF9wcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBzZXJpYWxpemF0aW9uICovCisgICAgcHVibGljIExvY2F0b3IgZ2V0TG9jYXRvcigpeworICAgICAgICByZXR1cm4gZW50aXR5LmdldExvY2F0b3IoKTsKKyAgICB9CisKICAgICBwdWJsaWMgTWFwIGdldFByb3BlcnRpZXNNYXAoKSB7CiAgICAgICAgIHJldHVybiBfcHJvcGVydGllczsKICAgICB9CiAKLSAgICAvKiBzZXJpYWxpemF0aW9uICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllc01hcChNYXAgbSkgewogICAgICAgICBfcHJvcGVydGllcyA9IG07CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Nb2RlbFByb3BlcnRpZXMuamF2YQppbmRleCBhYmVhOGQ2Li45ODg1ZjRiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Nb2RlbFByb3BlcnRpZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Nb2RlbFByb3BlcnRpZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Nb2RlbFZpc2l0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01vZGVsVmlzaXRvci5qYXZhCmluZGV4IGIyODc1NWUuLjQ0OGNiNjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01vZGVsVmlzaXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL01vZGVsVmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL09wZXJhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvT3BlcmF0aW9uLmphdmEKaW5kZXggNmI0ODJlZS4uNDhjMDQ1MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvT3BlcmF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YU1ldGhvZDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQU3R5bGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUFVzZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKQEAgLTQxLDE1ICs0MiwxOCBAQAogICovCiBwdWJsaWMgY2xhc3MgT3BlcmF0aW9uIGV4dGVuZHMgTW9kZWxPYmplY3QgewogCi0gICAgcHVibGljIE9wZXJhdGlvbigpIHt9CisgICAgcHVibGljIE9wZXJhdGlvbihFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIHN1cGVyKGVudGl0eSk7CisgICAgfQogCi0gICAgcHVibGljIE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKXsKLSAgICAgICAgdGhpcyhvcGVyYXRpb24uX25hbWUpOworICAgIHB1YmxpYyBPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbiwgRW50aXR5IGVudGl0eSl7CisgICAgICAgIHRoaXMob3BlcmF0aW9uLl9uYW1lLCBlbnRpdHkpOwogICAgICAgICB0aGlzLl9zdHlsZSA9IG9wZXJhdGlvbi5fc3R5bGU7CiAgICAgICAgIHRoaXMuX3VzZSA9IG9wZXJhdGlvbi5fdXNlOwogICAgICAgICB0aGlzLmN1c3RvbWl6ZWROYW1lID0gb3BlcmF0aW9uLmN1c3RvbWl6ZWROYW1lOwogICAgIH0KLSAgICBwdWJsaWMgT3BlcmF0aW9uKFFOYW1lIG5hbWUpIHsKKyAgICBwdWJsaWMgT3BlcmF0aW9uKFFOYW1lIG5hbWUsIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgc3VwZXIoZW50aXR5KTsKICAgICAgICAgX25hbWUgPSBuYW1lOwogICAgICAgICBfdW5pcXVlTmFtZSA9IG5hbWUuZ2V0TG9jYWxQYXJ0KCk7CiAgICAgICAgIF9mYXVsdE5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwpAQCAtMjI2LDYgKzIzMCwxNiBAQAogICAgICAgICByZXR1cm4gSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9WYXJpYWJsZU5hbWUoX25hbWUuZ2V0TG9jYWxQYXJ0KCkpOwogICAgIH0KIAorICAgIHB1YmxpYyBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuT3BlcmF0aW9uIGdldFdTRExQb3J0VHlwZU9wZXJhdGlvbigpeworICAgICAgICByZXR1cm4gd3NkbE9wZXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXU0RMUG9ydFR5cGVPcGVyYXRpb24oY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbiB3c2RsT3BlcmF0aW9uKXsKKyAgICAgICAgdGhpcy53c2RsT3BlcmF0aW9uID0gd3NkbE9wZXJhdGlvbjsKKyAgICB9CisKKworCiAgICAgcHJpdmF0ZSBTdHJpbmcgY3VzdG9taXplZE5hbWU7CiAgICAgcHJpdmF0ZSBib29sZWFuIF9pc1dyYXBwZWQgPSB0cnVlOwogICAgIHByaXZhdGUgUU5hbWUgX25hbWU7CkBAIC0yMzgsNSArMjUyLDYgQEAKICAgICBwcml2YXRlIFNPQVBVc2UgX3VzZSA9IFNPQVBVc2UuTElURVJBTDsKICAgICBwcml2YXRlIFNldDxTdHJpbmc+IF9mYXVsdE5hbWVzOwogICAgIHByaXZhdGUgU2V0PEZhdWx0PiBfZmF1bHRzOworICAgIHByaXZhdGUgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbiB3c2RsT3BlcmF0aW9uOwogCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9QYXJhbWV0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1BhcmFtZXRlci5qYXZhCmluZGV4IDRmMjIwYWMuLjEyOTlkZTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1BhcmFtZXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1BhcmFtZXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDIyICsyNSwzNyBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsOwogCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhUGFyYW1ldGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlUGFydDsKKworaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuTW9kZTsKLQogLyoqCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBNb2RlbE9iamVjdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZW50aXR5TmFtZTsKIAotICAgIHB1YmxpYyBQYXJhbWV0ZXIoKSB7fQotCi0gICAgcHVibGljIFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyBQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgc3VwZXIoZW50aXR5KTsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgaWYoZW50aXR5IGluc3RhbmNlb2YgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2UpeworICAgICAgICAgICAgdGhpcy5lbnRpdHlOYW1lID0gKChjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuTWVzc2FnZSllbnRpdHkpLmdldE5hbWUoKTsKKyAgICAgICAgfWVsc2UgaWYoZW50aXR5IGluc3RhbmNlb2YgTWVzc2FnZVBhcnQpeworICAgICAgICAgICAgdGhpcy5lbnRpdHlOYW1lID0gKChNZXNzYWdlUGFydCllbnRpdHkpLmdldE5hbWUoKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB0aGlzLmVudGl0eU5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW50aXR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGVudGl0eU5hbWU7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvUG9ydC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvUG9ydC5qYXZhCmluZGV4IGE1NjgwYjYuLjQxOWQ0ZDEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1BvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9Qb3J0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjkgKzI1LDI3IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWw7CiAKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFJbnRlcmZhY2U7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUFN0eWxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLkhhbmRsZXJDaGFpbkluZm87Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBVc2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQVmVyc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQU3R5bGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUFVzZTsKLQogLyoqCi0gKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KIHB1YmxpYyBjbGFzcyBQb3J0IGV4dGVuZHMgTW9kZWxPYmplY3QgewogCi0gICAgcHVibGljIFBvcnQoKSB7fQorICAgIHB1YmxpYyBQb3J0KEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgc3VwZXIoZW50aXR5KTsKKyAgICB9CiAKLSAgICBwdWJsaWMgUG9ydChRTmFtZSBuYW1lKSB7CisgICAgcHVibGljIFBvcnQoUU5hbWUgbmFtZSwgRW50aXR5IGVudGl0eSkgeworICAgICAgICBzdXBlcihlbnRpdHkpOwogICAgICAgICBfbmFtZSA9IG5hbWU7CiAgICAgfQogCkBAIC02OCwxNSArNjYsMTUgQEAKICAgICAgICAgaWYgKG9wZXJhdGlvbnNCeU5hbWUuc2l6ZSgpICE9IF9vcGVyYXRpb25zLnNpemUoKSkgewogICAgICAgICAgICAgaW5pdGlhbGl6ZU9wZXJhdGlvbnNCeU5hbWUoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKE9wZXJhdGlvbilvcGVyYXRpb25zQnlOYW1lLmdldChuYW1lKTsKKyAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnNCeU5hbWUuZ2V0KG5hbWUpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplT3BlcmF0aW9uc0J5TmFtZSgpIHsKLSAgICAgICAgb3BlcmF0aW9uc0J5TmFtZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIG9wZXJhdGlvbnNCeU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9wZXJhdGlvbj4oKTsKICAgICAgICAgaWYgKF9vcGVyYXRpb25zICE9IG51bGwpIHsKICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uIG9wZXJhdGlvbiA6IF9vcGVyYXRpb25zKSB7CiAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRVbmlxdWVOYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zQnlOYW1lLmNvbnRhaW5zS2V5KG9wZXJhdGlvbi5nZXRVbmlxdWVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zQnlOYW1lLmNvbnRhaW5zS2V5KG9wZXJhdGlvbi5nZXRVbmlxdWVOYW1lKCkpKSB7CiAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsRXhjZXB0aW9uKCJtb2RlbC51bmlxdWVuZXNzIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTExLDM2ICsxMDksNiBAQAogICAgICAgICBfYWRkcmVzcyA9IHM7CiAgICAgfQogCi0gICAgcHVibGljIEhhbmRsZXJDaGFpbkluZm8gZ2V0Q2xpZW50SGFuZGxlckNoYWluSW5mbygpIHsKLSAgICAgICAgaWYgKF9jbGllbnRIYW5kbGVyQ2hhaW5JbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIF9jbGllbnRIYW5kbGVyQ2hhaW5JbmZvICA9IG5ldyBIYW5kbGVyQ2hhaW5JbmZvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9jbGllbnRIYW5kbGVyQ2hhaW5JbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudEhhbmRsZXJDaGFpbkluZm8oSGFuZGxlckNoYWluSW5mbyBpKSB7Ci0gICAgICAgIF9jbGllbnRIYW5kbGVyQ2hhaW5JbmZvID0gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluSW5mbyBnZXRTZXJ2ZXJIYW5kbGVyQ2hhaW5JbmZvKCkgewotICAgICAgICBpZiAoX3NlcnZlckhhbmRsZXJDaGFpbkluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgX3NlcnZlckhhbmRsZXJDaGFpbkluZm8gID0gbmV3IEhhbmRsZXJDaGFpbkluZm8oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3NlcnZlckhhbmRsZXJDaGFpbkluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVySGFuZGxlckNoYWluSW5mbyhIYW5kbGVyQ2hhaW5JbmZvIGkpIHsKLSAgICAgICAgX3NlcnZlckhhbmRsZXJDaGFpbkluZm8gPSBpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQVmVyc2lvbiBnZXRTT0FQVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIF9zb2FwVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTT0FQVmVyc2lvbihTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgewotICAgICAgICBfc29hcFZlcnNpb24gPSBzb2FwVmVyc2lvbjsKLSAgICB9Ci0KICAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbXBsTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIF9zZXJ2aWNlSW1wbE5hbWU7CiAgICAgfQpAQCAtMTY1LDE2ICsxMzMsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAqIFhZWl9TZXJ2aWNlLmdldEFCQygpIG1ldGhvZCBuYW1lCi0gICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBvcnRHZXR0ZXJOYW1lLgotICAgICovCisgICAgICogWFlaX1NlcnZpY2UuZ2V0QUJDKCkgbWV0aG9kIG5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9ydEdldHRlck5hbWUuCisgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQb3J0R2V0dGVyKCkgewogICAgICAgICByZXR1cm4gcG9ydEdldHRlcjsKICAgICB9CiAKICAgICAvKioKLSAgICAqIEBwYXJhbSBwb3J0R2V0dGVyTmFtZSBUaGUgcG9ydEdldHRlck5hbWUgdG8gc2V0LgotICAgICovCisgICAgICogQHBhcmFtIHBvcnRHZXR0ZXJOYW1lIFRoZSBwb3J0R2V0dGVyTmFtZSB0byBzZXQuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UG9ydEdldHRlcihTdHJpbmcgcG9ydEdldHRlck5hbWUpIHsKICAgICAgICAgdGhpcy5wb3J0R2V0dGVyID0gcG9ydEdldHRlck5hbWU7CiAgICAgfQpAQCAtMjAwLDEyICsxNjksOSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgcG9ydEdldHRlcjsKICAgICBwcml2YXRlIFFOYW1lIF9uYW1lOwotICAgIHByaXZhdGUgTGlzdDxPcGVyYXRpb24+IF9vcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdDxPcGVyYXRpb24+IF9vcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdDxPcGVyYXRpb24+KCk7CiAgICAgcHJpdmF0ZSBKYXZhSW50ZXJmYWNlIF9qYXZhSW50ZXJmYWNlOwogICAgIHByaXZhdGUgU3RyaW5nIF9hZGRyZXNzOwogICAgIHByaXZhdGUgU3RyaW5nIF9zZXJ2aWNlSW1wbE5hbWU7Ci0gICAgcHJpdmF0ZSBNYXAgb3BlcmF0aW9uc0J5TmFtZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5JbmZvIF9jbGllbnRIYW5kbGVyQ2hhaW5JbmZvOwotICAgIHByaXZhdGUgSGFuZGxlckNoYWluSW5mbyBfc2VydmVySGFuZGxlckNoYWluSW5mbzsKLSAgICBwcml2YXRlIFNPQVBWZXJzaW9uIF9zb2FwVmVyc2lvbiA9IFNPQVBWZXJzaW9uLlNPQVBfMTE7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbnNCeU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9wZXJhdGlvbj4oKTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1JlcXVlc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1JlcXVlc3QuamF2YQppbmRleCAxNzI3MDRkLi4xYzUwZGVlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9SZXF1ZXN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvUmVxdWVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEzICsyNSwxOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsOwogCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuRXJyb3JSZWNlaXZlcjsKKwogLyoqCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgTWVzc2FnZSB7CiAKLSAgICBwdWJsaWMgUmVxdWVzdCgpIHt9CisgICAgcHVibGljIFJlcXVlc3QoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2UgZW50aXR5LCBFcnJvclJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIHN1cGVyKGVudGl0eSwgcmVjZWl2ZXIpOworICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFjY2VwdChNb2RlbFZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHZpc2l0b3IudmlzaXQodGhpcyk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9SZXNwb25zZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvUmVzcG9uc2UuamF2YQppbmRleCBhNTE5OWIzLi4xOTM0OWMwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9SZXNwb25zZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1Jlc3BvbnNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNiArMjUsOSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsOwogCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuRXJyb3JSZWNlaXZlcjsKKwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMzUsNyArMzgsOSBAQAogICovCiBwdWJsaWMgY2xhc3MgUmVzcG9uc2UgZXh0ZW5kcyBNZXNzYWdlIHsKIAotICAgIHB1YmxpYyBSZXNwb25zZSgpIHt9CisgICAgcHVibGljIFJlc3BvbnNlKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlIGVudGl0eSwgRXJyb3JSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICBzdXBlcihlbnRpdHksIHJlY2VpdmVyKTsKKyAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhZGRGYXVsdEJsb2NrKEJsb2NrIGIpIHsKICAgICAgICAgaWYgKF9mYXVsdEJsb2Nrcy5jb250YWluc0tleShiLmdldE5hbWUoKSkpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1NlcnZpY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL1NlcnZpY2UuamF2YQppbmRleCBkMzY3OGNlLi40ZjJjMDYyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9TZXJ2aWNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvU2VydmljZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDE0ICsyNiwxMCBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbDsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YUludGVyZmFjZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC4qOwogCiAvKioKICAqCkBAIC00MSw5ICszNywxMiBAQAogICovCiBwdWJsaWMgY2xhc3MgU2VydmljZSBleHRlbmRzIE1vZGVsT2JqZWN0IHsKIAotICAgIHB1YmxpYyBTZXJ2aWNlKCkge30KKyAgICBwdWJsaWMgU2VydmljZShFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIHN1cGVyKGVudGl0eSk7CisgICAgfQogCi0gICAgcHVibGljIFNlcnZpY2UoUU5hbWUgbmFtZSwgSmF2YUludGVyZmFjZSBqYXZhSW50ZXJmYWNlKSB7CisgICAgcHVibGljIFNlcnZpY2UoUU5hbWUgbmFtZSwgSmF2YUludGVyZmFjZSBqYXZhSW50ZXJmYWNlLCBFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIHN1cGVyKGVudGl0eSk7CiAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgIHRoaXMuamF2YUludGVyZmFjZSA9IGphdmFJbnRlcmZhY2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvZXhwb3J0ZXIvRXh0ZXJuYWxPYmplY3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2V4cG9ydGVyL0V4dGVybmFsT2JqZWN0LmphdmEKaW5kZXggMjI0YzYwZC4uMjgxYmE2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvZXhwb3J0ZXIvRXh0ZXJuYWxPYmplY3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9leHBvcnRlci9FeHRlcm5hbE9iamVjdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YUFycmF5VHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhQXJyYXlUeXBlLmphdmEKaW5kZXggN2Q4Y2JkMi4uMWMxNzJmNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhQXJyYXlUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhQXJyYXlUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFFeGNlcHRpb24uamF2YQppbmRleCAwMTlhZWRjLi4zNDNkNDdiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFJbnRlcmZhY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YUludGVyZmFjZS5qYXZhCmluZGV4IDliZjIyMWYuLjExZjk4ZjggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YUludGVyZmFjZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YUludGVyZmFjZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE0ICsyNSwxMyBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmE7CiAKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWwuQ2xhc3NOYW1lSW5mbzsKKwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLkNsYXNzTmFtZUluZm87Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbEV4Y2VwdGlvbjsKLQogLyoqCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFNZXRob2QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YU1ldGhvZC5qYXZhCmluZGV4IDY5OTllNWMuLmUwNzk3ZmQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YU1ldGhvZC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YU1ldGhvZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSwzNSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmE7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5Nb2RlbE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuUGFyYW1ldGVyOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkNsYXNzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiAvKioKLSAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwogcHVibGljIGNsYXNzIEphdmFNZXRob2QgewogCi0gICAgcHVibGljIEphdmFNZXRob2QoKSB7fQorICAgIHByaXZhdGUgZmluYWwgRXJyb3JSZWNlaXZlciBlcnJvclJlY2VpdmVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEphdmFQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PEphdmFQYXJhbWV0ZXI+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gZXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHByaXZhdGUgSmF2YVR5cGUgcmV0dXJuVHlwZTsKIAotICAgIHB1YmxpYyBKYXZhTWV0aG9kKFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIEphdmFNZXRob2QoU3RyaW5nIG5hbWUsIEVycm9yUmVjZWl2ZXIgcmVjZWl2ZXIpIHsKICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gbnVsbDsKKyAgICAgICAgdGhpcy5lcnJvclJlY2VpdmVyID0gcmVjZWl2ZXI7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCiAgICAgcHVibGljIEphdmFUeXBlIGdldFJldHVyblR5cGUoKSB7CiAgICAgICAgIHJldHVybiByZXR1cm5UeXBlOwogICAgIH0KQEAgLTYxLDEwOSArNjIsNDggQEAKICAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtTmFtZSkgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8cGFyYW1ldGVycy5zaXplKCk7aSsrKSB7Ci0gICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFscygKLSAgICAgICAgICAgICAgICAoKEphdmFQYXJhbWV0ZXIpcGFyYW1ldGVycy5nZXQoaSkpLmdldE5hbWUoKSkpIHsKLQorICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtTmFtZSkgeworICAgICAgICBmb3IgKEphdmFQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcGFyYW1ldGVycykgeworICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHMocGFyYW1ldGVyLmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKEphdmFQYXJhbWV0ZXIgcGFyYW0pIHsKLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhpcyBtZW1iZXIgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotICAgICAgICBpZiAoaGFzUGFyYW1ldGVyKHBhcmFtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEV4Y2VwdGlvbigibW9kZWwudW5pcXVlbmVzcyIpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtZXRlcnMuYWRkKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmF2YVBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtTmFtZSl7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxwYXJhbWV0ZXJzLnNpemUoKTtpKyspIHsKLSAgICAgICAgICAgIEphdmFQYXJhbWV0ZXIgalBhcmFtID0gcGFyYW1ldGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFscyhqUGFyYW0uZ2V0UGFyYW1ldGVyKCkuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBqUGFyYW07CisgICAgcHJpdmF0ZSBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbU5hbWUpeworICAgICAgICBmb3IgKEphdmFQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcGFyYW1ldGVycykgeworICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHMocGFyYW1ldGVyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyLmdldFBhcmFtZXRlcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBJdGVyYXRvcjxKYXZhUGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5pdGVyYXRvcigpOworICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihKYXZhUGFyYW1ldGVyIHBhcmFtKSB7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoaXMgbWVtYmVyIGRvZXMgbm90IGFscmVhZHkgZXhpc3QKKyAgICAgICAgaWYgKGhhc1BhcmFtZXRlcihwYXJhbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKHBhcmFtLmdldFBhcmFtZXRlcigpLmdldExvY2F0b3IoKSwgTW9kZWxNZXNzYWdlcy5NT0RFTF9QQVJBTUVURVJfTk9UVU5JUVVFKHBhcmFtLmdldE5hbWUoKSwgcGFyYW0uZ2V0UGFyYW1ldGVyKCkuZ2V0RW50aXR5TmFtZSgpKSk7CisgICAgICAgICAgICBQYXJhbWV0ZXIgZHVwbGljUGFyYW0gPSBnZXRQYXJhbWV0ZXIocGFyYW0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGVycm9yUmVjZWl2ZXIuZXJyb3IoZHVwbGljUGFyYW0uZ2V0TG9jYXRvcigpLCBNb2RlbE1lc3NhZ2VzLk1PREVMX1BBUkFNRVRFUl9OT1RVTklRVUUocGFyYW0uZ2V0TmFtZSgpLCBkdXBsaWNQYXJhbS5nZXRFbnRpdHlOYW1lKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwYXJhbWV0ZXJzLmFkZChwYXJhbSk7CiAgICAgfQogCi0gICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXJDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qIHNlcmlhbGl6YXRpb24gKi8KICAgICBwdWJsaWMgTGlzdDxKYXZhUGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzTGlzdCgpIHsKICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7CiAgICAgfQogCi0gICAgLyogc2VyaWFsaXphdGlvbiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnNMaXN0KExpc3Q8SmF2YVBhcmFtZXRlcj4gbCkgewotICAgICAgICBwYXJhbWV0ZXJzID0gbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFeGNlcHRpb24oU3RyaW5nIGV4Y2VwdGlvbikgewotICAgICAgICByZXR1cm4gZXhjZXB0aW9ucy5jb250YWlucyhleGNlcHRpb24pOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2VwdGlvbihTdHJpbmcgZXhjZXB0aW9uKSB7Ci0KICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhpcyBleGNlcHRpb24gZG9lcyBub3QgYWxyZWFkeSBleGlzdAotICAgICAgICBpZiAoaGFzRXhjZXB0aW9uKGV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEV4Y2VwdGlvbigibW9kZWwudW5pcXVlbmVzcyIpOworICAgICAgICBpZiAoIWV4Y2VwdGlvbnMuY29udGFpbnMoZXhjZXB0aW9uKSkgeworICAgICAgICAgICAgZXhjZXB0aW9ucy5hZGQoZXhjZXB0aW9uKTsKICAgICAgICAgfQotICAgICAgICBleGNlcHRpb25zLmFkZChleGNlcHRpb24pOwogICAgIH0KIAotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRFeGNlcHRpb25zKCkgeworICAgIC8qKiBUT0RPOiBOQiB1c2VzIGl0LCByZW1vdmUgaXQgb25jZSB3ZSBleHBvc2UgaXQgdGhydSBzb21lIEFQSSAqKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBnZXRFeGNlcHRpb25zKCkgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwogICAgIH0KLQotICAgIC8qIHNlcmlhbGl6YXRpb24gKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRFeGNlcHRpb25zTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbnM7Ci0gICAgfQotCi0gICAgLyogc2VyaWFsaXphdGlvbiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbnNMaXN0KExpc3QgbCkgewotICAgICAgICBleGNlcHRpb25zID0gbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ0NsYXNzKCkgewotICAgICAgICByZXR1cm4gZGVjbGFyaW5nQ2xhc3M7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldERlY2xhcmluZ0NsYXNzKFN0cmluZyBkZWNsYXJpbmdDbGFzcykgewotICAgICAgICB0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7Ci0gICAgfQotCi0gICAgLy8gVE9ETyBmaXggbW9kZWwgaW1wb3J0ZXIvZXhwb3J0ZXIgdG8gaGFuZGxlIHRoaXMKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRUaHJvd3NSZW1vdGVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aHJvd3NSZW1vdGVFeGNlcHRpb247Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFRocm93c1JlbW90ZUV4Y2VwdGlvbihib29sZWFuIHRocm93c1JlbW90ZUV4Y2VwdGlvbikgewotICAgICAgICB0aGlzLnRocm93c1JlbW90ZUV4Y2VwdGlvbiA9IHRocm93c1JlbW90ZUV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeGNlcHRpb25DbGFzcyhKQ2xhc3MgZXgpewotICAgICAgICBleGNlcHRpb25DbGFzc2VzLmFkZChleCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8SkNsYXNzPiBnZXRFeGNlcHRpb25DbGFzc2VzKCl7Ci0gICAgICAgIHJldHVybiBleGNlcHRpb25DbGFzc2VzOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PEphdmFQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PEphdmFQYXJhbWV0ZXI+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxKQ2xhc3M+IGV4Y2VwdGlvbkNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PEpDbGFzcz4oKTsKLQotICAgIHByaXZhdGUgSmF2YVR5cGUgcmV0dXJuVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdDbGFzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gdGhyb3dzUmVtb3RlRXhjZXB0aW9uID0gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YVBhcmFtZXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhUGFyYW1ldGVyLmphdmEKaW5kZXggZTM0MWI4Mi4uY2ViZTUzNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhUGFyYW1ldGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhUGFyYW1ldGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhU2ltcGxlVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhU2ltcGxlVHlwZS5qYXZhCmluZGV4IDY3OGEyMzQuLjcyMDY5MTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YVNpbXBsZVR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFTaW1wbGVUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsOCArMjUsNiBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmE7CiAKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KVHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuVHlwZUFuZEFubm90YXRpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCVHlwZUFuZEFubm90YXRpb247CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhU3RydWN0dXJlTWVtYmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFTdHJ1Y3R1cmVNZW1iZXIuamF2YQppbmRleCBjMGIwOGQzLi5mMmM5MmRlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFTdHJ1Y3R1cmVNZW1iZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFTdHJ1Y3R1cmVNZW1iZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFTdHJ1Y3R1cmVUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFTdHJ1Y3R1cmVUeXBlLmphdmEKaW5kZXggOTA3YTUyNi4uYzJkZjBkNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhU3RydWN0dXJlVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YVN0cnVjdHVyZVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNiArMjUsMTAgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWxFeGNlcHRpb247CiAKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKwogLyoqCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXZhL0phdmFUeXBlLmphdmEKaW5kZXggODcyMjA4OC4uODk3MjFlYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF2YS9KYXZhVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2phdmEvSmF2YVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw4ICsyNSw2IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YTsKIAotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5UeXBlQW5kQW5ub3RhdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLkpBWEJUeXBlQW5kQW5ub3RhdGlvbjsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJFbGVtZW50TWVtYmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJFbGVtZW50TWVtYmVyLmphdmEKaW5kZXggZWYyNDJlYi4uNmE5MzI1MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCRWxlbWVudE1lbWJlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQkVsZW1lbnRNZW1iZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCw5ICsyNCwxMCBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGI7CiAKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFTdHJ1Y3R1cmVNZW1iZXI7CisKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhU3RydWN0dXJlTWVtYmVyOwogLyoqCiAgKiBAYXV0aG9yIEthdGh5IFdhbHNoLCBWaXZlayBQYW5kZXkKICAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJNYXBwaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJNYXBwaW5nLmphdmEKaW5kZXggNjk2NDM4OS4uMTdlN2QyZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCTWFwcGluZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQk1hcHBpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxNSArMjQsMTMgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuTWFwcGluZzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuUHJvcGVydHk7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlR5cGVBbmRBbm5vdGF0aW9uOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpUeXBlOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGksIFZpdmVrIFBhbmRleQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCTW9kZWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQk1vZGVsLmphdmEKaW5kZXggNmZiMjVjZi4uMGExNmQ0OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCTW9kZWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJNb2RlbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDE4ICsyNCwxMiBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGI7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuSjJTSkFYQk1vZGVsOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5NYXBwaW5nOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5TMkpKQVhCTW9kZWw7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKIAogLyoqCiAgKiBSb290IG9mIHRoZSBKQVhCIE1vZGVsLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCUHJvcGVydHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQlByb3BlcnR5LmphdmEKaW5kZXggN2U3YTdjMy4uM2ZlOWVkNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCUHJvcGVydHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJQcm9wZXJ0eS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDExICsyNCwxMCBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGI7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlByb3BlcnR5OwogCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlR5cGU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKwogLyoqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCiAgKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQlN0cnVjdHVyZWRUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJTdHJ1Y3R1cmVkVHlwZS5qYXZhCmluZGV4IGJkNTk0MGIuLmE5ZGJkZjMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQlN0cnVjdHVyZWRUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCU3RydWN0dXJlZFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxOSArMjQsMTIgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVN0cnVjdHVyZVR5cGU7CiAKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEudXRpbC4qOworCiAvKioKICAqIFRvcC1sZXZlbCBiaW5kaW5nIGJldHdlZW4gSkFYQiBnZW5lcmF0ZWQgSmF2YSB0eXBlCiAgKiBhbmQgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCVHlwZS5qYXZhCmluZGV4IGFkMzQ2MjguLjY2NWNlN2EgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQlR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsOCArMjYsNiBAQAogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlR5cGVBbmRBbm5vdGF0aW9uOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpUeXBlOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCVHlwZUFuZEFubm90YXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQlR5cGVBbmRBbm5vdGF0aW9uLmphdmEKaW5kZXggY2ZhMzQwYy4uMDdiZTY0ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCVHlwZUFuZEFubm90YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJUeXBlQW5kQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDkgKzI0LDkgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlR5cGVBbmRBbm5vdGF0aW9uOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpUeXBlOwogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpBbm5vdGF0YWJsZTsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KVHlwZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuVHlwZUFuZEFubm90YXRpb247CiAKIC8qKgogICogSG9sZHMgSkFYQiBKVHlwZSBhbmQgVHlwZUFuZEFubm90YXRpb24uIFRoaXMgcHJvdmlkZXMgYWJzdHJhdGlvbiBvdmVyCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJUeXBlVmlzaXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9KQVhCVHlwZVZpc2l0b3IuamF2YQppbmRleCA5NGZiYThiLi5lMTkyNjU4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL0pBWEJUeXBlVmlzaXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvSkFYQlR5cGVWaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9ScGNMaXRNZW1iZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvUnBjTGl0TWVtYmVyLmphdmEKaW5kZXggMGU0ZDZmYi4uNzBmYjkxOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9ScGNMaXRNZW1iZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL1JwY0xpdE1lbWJlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDEwICsyNCwxMCBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGI7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuQWJzdHJhY3RUeXBlOwogCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKwogLyoqCiAgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvUnBjTGl0U3RydWN0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbC9qYXhiL1JwY0xpdFN0cnVjdHVyZS5qYXZhCmluZGV4IDE3ZDU4YzcuLjA5NWViNjggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvUnBjTGl0U3RydWN0dXJlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9ScGNMaXRTdHJ1Y3R1cmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxMiArMjQsMTEgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5BYnN0cmFjdFR5cGU7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICogQGF1dGhvciBWaXZlayBQYW5kZXkKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsL2pheGIvVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9VdGlsLmphdmEKaW5kZXggNWZiNzdhNy4uYzk2ZTJjNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9VdGlsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWwvamF4Yi9VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9KYXZhU2ltcGxlVHlwZUNyZWF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvSmF2YVNpbXBsZVR5cGVDcmVhdG9yLmphdmEKaW5kZXggNDQyNDNlNy4uNzFkZjNjYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9KYXZhU2ltcGxlVHlwZUNyZWF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL0phdmFTaW1wbGVUeXBlQ3JlYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEyICsyNSwxMSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXI7CiAKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFTaW1wbGVUeXBlOworCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVNpbXBsZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5WZXJzaW9uVXRpbDsKLQogLyoqCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL01vZGVsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvTW9kZWxlci5qYXZhCmluZGV4IDg4MDkxZDAuLjUzOWRlMzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvTW9kZWxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvTW9kZWxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvTW9kZWxlckNvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9Nb2RlbGVyQ29uc3RhbnRzLmphdmEKaW5kZXggMTM2MmY4NC4uZWMyODBmNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9Nb2RlbGVyQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9Nb2RlbGVyQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9Nb2RlbGVyRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL01vZGVsZXJFeGNlcHRpb24uamF2YQppbmRleCAyZjg1MzQ5Li5iMDk1M2FhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL01vZGVsZXJFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL01vZGVsZXJFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgIHN1cGVyKCJtb2RlbGVyLm5lc3RlZE1vZGVsRXJyb3IiLCBhcmcpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlc291cmNlQnVuZGxlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5tb2RlbGVyIjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvTW9kZWxlclV0aWxzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL01vZGVsZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmQ0NzZjLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvTW9kZWxlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5TMkpKQVhCTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlR5cGVBbmRBbm5vdGF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkFic3RyYWN0VHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5CbG9jazsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuUGFyYW1ldGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVNpbXBsZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhU3RydWN0dXJlTWVtYmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVN0cnVjdHVyZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhVHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLkNsYXNzTmFtZUluZm87Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2VQYXJ0OwotCi0vKioKLSAqIFV0aWxpdGllcyB0byBiZSB1c2VkIGJ5IG1vZGVsZXJzIHN1Y2ggYXMgV1NETE1vZGVsZXIgYW5kIFJtaW1vZGVsZXIKLSAqCi0gKiBAYXV0aG9yIFZpdmVrIFBhbmRleQotICoKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsZXJVdGlscyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluY2FzZSBvZiB3cmFwcGVyIHN0eWxlIG9wZXJhdGlvbnMuIFRoaXMgaXMKLSAgICAgKiBlcXVpdmFsZW50IHRvIHdyYXBwZXIgc3R5bGUgc2NoZW1hIGNvbXBvbmVudCBvciBKQVhCIE1hcHBpbmcgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGpheGJUeXBlIEpBWEJUeXBlIGZyb20gd2hpY2ggYSBKQVhCU3RydWN0dXJlZCB0eXBlIHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgSkFYQlN0cnVjdHVyZWQgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSkFYQlN0cnVjdHVyZWRUeXBlIGNyZWF0ZUpBWEJTdHJ1Y3R1cmVUeXBlKEpBWEJUeXBlIGpheGJUeXBlKSB7Ci0gICAgICAgIEpBWEJTdHJ1Y3R1cmVkVHlwZSB0eXBlID0gbmV3IEpBWEJTdHJ1Y3R1cmVkVHlwZShqYXhiVHlwZSk7Ci0gICAgICAgIHR5cGUuc2V0TmFtZShqYXhiVHlwZS5nZXROYW1lKCkpOwotICAgICAgICB0eXBlLnNldEphdmFUeXBlKGpheGJUeXBlLmdldEphdmFUeXBlKCkpOwotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIEpBWEJTdHJ1Y3R1cmVkIHR5cGUgKHdyYXBwZXIgc3R5bGUgb3BlcmF0aW9ucykgYW5kCi0gICAgICogdW53cmFwcyBpdCB0byBjcmVhdGUgbGlzdCBvZiBwYXJhbWV0ZXJzLgotICAgICAqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF4YlR5cGUgaW5zdGFuY2Ugb2YgSkFYQlR5cGUsIGNvdWxkIGJlIEpBWEJTdHJ1Y3R1cmVkIHR5cGUuCi0gICAgICogQHBhcmFtIGJsb2NrIFRoZSBCbG9jayAoYm9keS9IZWFkZXIvQXR0YWNobWVudCkgdG8gd2hpY2ggdGhlIGNyZWF0ZWQgUGFyYW1ldGVyIGJlbG9uZy4KLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgUGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxQYXJhbWV0ZXI+IGNyZWF0ZVVud3JhcHBlZFBhcmFtZXRlcnMoSkFYQlR5cGUgamF4YlR5cGUsCi0gICAgICAgICAgICBCbG9jayBibG9jaykgewotICAgICAgICBMaXN0PFBhcmFtZXRlcj4gcGFyYW1MaXN0ID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7Ci0gICAgICAgIEpBWEJTdHJ1Y3R1cmVkVHlwZSB0eXBlID0gbnVsbDsKLSAgICAgICAgaWYgKCEoamF4YlR5cGUgaW5zdGFuY2VvZiBKQVhCU3RydWN0dXJlZFR5cGUpKQotICAgICAgICAgICAgdHlwZSA9IGNyZWF0ZUpBWEJTdHJ1Y3R1cmVUeXBlKGpheGJUeXBlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdHlwZSA9IChKQVhCU3RydWN0dXJlZFR5cGUpIGpheGJUeXBlOwotCi0gICAgICAgIEphdmFTdHJ1Y3R1cmVUeXBlIGpzdCA9IG5ldyBKYXZhU3RydWN0dXJlVHlwZShqYXhiVHlwZS5nZXRKYXZhVHlwZSgpCi0gICAgICAgICAgICAgICAgLmdldFJlYWxOYW1lKCksIHRydWUsIHR5cGUpOwotICAgICAgICB0eXBlLnNldEphdmFUeXBlKGpzdCk7Ci0gICAgICAgIGJsb2NrLnNldFR5cGUodHlwZSk7Ci0gICAgICAgIExpc3QgbWVtYmVyTGlzdCA9IGpheGJUeXBlLmdldFdyYXBwZXJDaGlsZHJlbigpOwotICAgICAgICBJdGVyYXRvciBwcm9wcyA9IG1lbWJlckxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHByb3BzLmhhc05leHQoKSkgewotICAgICAgICAgICAgSkFYQlByb3BlcnR5IHByb3AgPSAoSkFYQlByb3BlcnR5KSBwcm9wcy5uZXh0KCk7Ci0gICAgICAgICAgICBwYXJhbUxpc3QuYWRkKGNyZWF0ZVVud3JhcHBlZFBhcmFtZXRlcihwcm9wLCBqYXhiVHlwZSwgYmxvY2ssIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGpzdCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvcAotICAgICAqIEBwYXJhbSBqYXhiVHlwZQotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQYXJhbWV0ZXIgY3JlYXRlVW53cmFwcGVkUGFyYW1ldGVyKEpBWEJQcm9wZXJ0eSBwcm9wLAotICAgICAgICAgICAgSkFYQlR5cGUgamF4YlR5cGUsIEJsb2NrIGJsb2NrLCBKQVhCU3RydWN0dXJlZFR5cGUgdHlwZSwKLSAgICAgICAgICAgIEphdmFTdHJ1Y3R1cmVUeXBlIGpzdCkgewotICAgICAgICBRTmFtZSBlbGVtZW50TmFtZSA9IHByb3AuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgSmF2YVNpbXBsZVR5cGUocHJvcC5nZXRUeXBlKCkpOwotICAgICAgICBKQVhCRWxlbWVudE1lbWJlciBlVHlwZSA9IG5ldyBKQVhCRWxlbWVudE1lbWJlcihlbGVtZW50TmFtZSwgamF4YlR5cGUpOwotICAgICAgICBKYXZhU3RydWN0dXJlTWVtYmVyIGpzbSA9IG5ldyBKYXZhU3RydWN0dXJlTWVtYmVyKGVsZW1lbnROYW1lCi0gICAgICAgICAgICAgICAgLmdldExvY2FsUGFydCgpLCBqYXZhVHlwZSwgZVR5cGUpOwotICAgICAgICBlVHlwZS5zZXRKYXZhU3RydWN0dXJlTWVtYmVyKGpzbSk7Ci0gICAgICAgIGpzdC5hZGQoanNtKTsKLSAgICAgICAgZVR5cGUuc2V0UHJvcGVydHkocHJvcCk7Ci0gICAgICAgIHR5cGUuYWRkKGVUeXBlKTsKLSAgICAgICAgSkFYQlR5cGUgdCA9IG5ldyBKQVhCVHlwZShlbGVtZW50TmFtZSwgamF2YVR5cGUsIGpheGJUeXBlCi0gICAgICAgICAgICAgICAgLmdldEpheGJNYXBwaW5nKCksIGpheGJUeXBlLmdldEpheGJNb2RlbCgpKTsKLSAgICAgICAgdC5zZXRVbndyYXBwZWQodHJ1ZSk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBjcmVhdGVQYXJhbWV0ZXIoZWxlbWVudE5hbWUuZ2V0TG9jYWxQYXJ0KCksIHQsIGJsb2NrKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldEVtYmVkZGVkKHRydWUpOwotICAgICAgICByZXR1cm4gcGFyYW1ldGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxQYXJhbWV0ZXI+IGNyZWF0ZVJwY0xpdFBhcmFtZXRlcnMoTWVzc2FnZSBtZXNzYWdlLCBCbG9jayBibG9jaywgUzJKSkFYQk1vZGVsIGpheGJNb2RlbCl7Ci0gICAgICAgIFJwY0xpdFN0cnVjdHVyZSBycGNTdHJ1Y3QgPSAoUnBjTGl0U3RydWN0dXJlKWJsb2NrLmdldFR5cGUoKTsKLQotICAgICAgICBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOwotICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydCA6IG1lc3NhZ2UuZ2V0UGFydHMoKSl7Ci0gICAgICAgICAgICBpZighTW9kZWxlclV0aWxzLmlzQm91bmRUb1NPQVBCb2R5KHBhcnQpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHBhcnQuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgVHlwZUFuZEFubm90YXRpb24gdHlwZUFuZEFubiA9IGpheGJNb2RlbC5nZXRKYXZhVHlwZShuYW1lKTsKLSAgICAgICAgICAgIGlmKHR5cGVBbmRBbm4gPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZ1FOYW1lID0gInsiK21lc3NhZ2UuZ2V0RGVmaW5pbmcoKS5nZXRUYXJnZXROYW1lc3BhY2VVUkkoKSsifSIrbWVzc2FnZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oIndzZGxtb2RlbGVyLnJwY2xpdC51bmtvd25zY2hlbWF0eXBlIiwgbmFtZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5nZXROYW1lKCksIG1zZ1FOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB0eXBlID0gdHlwZUFuZEFubi5nZXRUeXBlQ2xhc3MoKS5mdWxsTmFtZSgpOwotICAgICAgICAgICAgdHlwZSA9IENsYXNzTmFtZUluZm8uZ2V0R2VuZXJpY0NsYXNzKHR5cGUpOwotICAgICAgICAgICAgUnBjTGl0TWVtYmVyIHBhcmFtID0gbmV3IFJwY0xpdE1lbWJlcihuZXcgUU5hbWUoIiIsIHBhcnQuZ2V0TmFtZSgpKSwgdHlwZSk7Ci0gICAgICAgICAgICBKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBKYXZhU2ltcGxlVHlwZShuZXcgSkFYQlR5cGVBbmRBbm5vdGF0aW9uKHR5cGVBbmRBbm4pKTsKLSAgICAgICAgICAgIHBhcmFtLnNldEphdmFUeXBlKGphdmFUeXBlKTsKLSAgICAgICAgICAgIHJwY1N0cnVjdC5hZGRScGNMaXRNZW1iZXIocGFyYW0pOwotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IE1vZGVsZXJVdGlscy5jcmVhdGVQYXJhbWV0ZXIocGFydC5nZXROYW1lKCksIHBhcmFtLCBibG9jayk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0RW1iZWRkZWQodHJ1ZSk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBmb3Igbm9uLXdyYXBwZXIgc3R5bGUgb3BlcmF0aW9ucy4gSXQgcmV0dXJucyBhIFBhcmFtZXRlciBjb25zdHJ1Y3RlZAotICAgICAqIHVzaW5nIHRoZSBKQVhCVHlwZSBhbmQgdGhlIEJsb2NrLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcnROYW1lIHR5cGljYWxseSB3c2RsOnBhcnQgb3IgYW55IG5hbWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIHBhcmFtZXRlcgotICAgICAqIEBwYXJhbSBqYXhiVHlwZSB0eXBlIG9mIFBhcmFtZXRlcgotICAgICAqIEBwYXJhbSBibG9jayBCbG9jayB0byB3aGljaCB0aGUgcGFyYW1ldGVyIGJlbG9uZ3MgdG8KLSAgICAgKiBAcmV0dXJuIFBhcmFtZXRlciBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyIGNyZWF0ZVBhcmFtZXRlcihTdHJpbmcgcGFydE5hbWUsIEFic3RyYWN0VHlwZSBqYXhiVHlwZSwKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHBhcnROYW1lKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldFByb3BlcnR5KE1vZGVsUHJvcGVydGllcy5QUk9QRVJUWV9QQVJBTV9NRVNTQUdFX1BBUlRfTkFNRSwKLSAgICAgICAgICAgICAgICBwYXJ0TmFtZSk7Ci0gICAgICAgIHBhcmFtZXRlci5zZXRFbWJlZGRlZChmYWxzZSk7Ci0gICAgICAgIHBhcmFtZXRlci5zZXRUeXBlKGpheGJUeXBlKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldFR5cGVOYW1lKGpheGJUeXBlLmdldEphdmFUeXBlKCkuZ2V0VHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIHBhcmFtZXRlci5zZXRCbG9jayhibG9jayk7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IFBhcmFtZXRlciBmcm9tIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1OYW1lCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMKLSAgICAgKiBAcmV0dXJuIHRoZSBQYXJhbWV0ZXIgd2l0aCBuYW1lIHBhcmFtTmFtZSBmcm9tIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtTmFtZSwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpewotICAgICAgICBpZihwYXJhbWV0ZXJzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgZm9yKFBhcmFtZXRlciBwYXJhbTogcGFyYW1ldGVycyl7Ci0gICAgICAgICAgICAvL2lmKHBhcmFtLmdldE5hbWUoKS5lcXVhbHMoIl9yZXR1cm4iKSAmJiBwYXJhbU5hbWUuZXF1YWxzKCJyZXR1cm4iKSB8fCBwYXJhbS5nZXROYW1lKCkuZXF1YWxzKHBhcmFtTmFtZSkpIHsKLSAgICAgICAgICAgIGlmKHBhcmFtLmdldE5hbWUoKS5lcXVhbHMocGFyYW1OYW1lKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBKQVhCU3RydWN0dXJlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJ1Y3QxCi0gICAgICogQHBhcmFtIHN0cnVjdDIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3RydWN0MSBhbmQgc3RydWN0MiBhcmUgZXF1aXZhbGVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFcXVpdmFsZW50TGl0ZXJhbFN0cnVjdHVyZXMoCi0gICAgICAgIEpBWEJTdHJ1Y3R1cmVkVHlwZSBzdHJ1Y3QxLAotICAgICAgICBKQVhCU3RydWN0dXJlZFR5cGUgc3RydWN0MikgewotICAgICAgICBpZiAoc3RydWN0MS5nZXRFbGVtZW50TWVtYmVyc0NvdW50KCkgIT0gc3RydWN0Mi5nZXRFbGVtZW50TWVtYmVyc0NvdW50KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIEl0ZXJhdG9yIG1lbWJlcnMgPSBzdHJ1Y3QxLmdldEVsZW1lbnRNZW1iZXJzKCk7Ci0gICAgICAgIEpBWEJFbGVtZW50TWVtYmVyIG1lbWJlcjE7Ci0gICAgICAgIEphdmFTdHJ1Y3R1cmVNZW1iZXIgamF2YU1lbWJlcjEsIGphdmFNZW1iZXIyOwotICAgICAgICBmb3IgKGludCBpID0gMDsgbWVtYmVycy5oYXNOZXh0KCk7IGkrKykgewotICAgICAgICAgICAgbWVtYmVyMSA9IChKQVhCRWxlbWVudE1lbWJlciltZW1iZXJzLm5leHQoKTsKLSAgICAgICAgICAgIGphdmFNZW1iZXIxID0gbWVtYmVyMS5nZXRKYXZhU3RydWN0dXJlTWVtYmVyKCk7Ci0gICAgICAgICAgICBqYXZhTWVtYmVyMiA9Ci0gICAgICAgICAgICAgICAgKChKYXZhU3RydWN0dXJlVHlwZSlzdHJ1Y3QyLmdldEphdmFUeXBlKCkpLmdldE1lbWJlckJ5TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyMS5nZXRKYXZhU3RydWN0dXJlTWVtYmVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChqYXZhTWVtYmVyMi5nZXRDb25zdHJ1Y3RvclBvcygpICE9IGkKLSAgICAgICAgICAgICAgICB8fCAhamF2YU1lbWJlcjEuZ2V0VHlwZSgpLmVxdWFscyhqYXZhTWVtYmVyMi5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFydAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwYXJ0IGlzIGJvdW5kIHRvIE1pbWUgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JvdW5kVG9NaW1lQ29udGVudChNZXNzYWdlUGFydCBwYXJ0KSB7Ci0gICAgICAgIGlmKChwYXJ0ICE9IG51bGwpICYmIHBhcnQuZ2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZCgpID09IE1lc3NhZ2VQYXJ0LldTRExfTUlNRV9CSU5ESU5HKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFydAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwYXJ0IGlzIGJvdW5kIHRvIFNPQVBCb2R5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm91bmRUb1NPQVBCb2R5KE1lc3NhZ2VQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYoKHBhcnQgIT0gbnVsbCkgJiYgcGFydC5nZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRLaW5kKCkgPT0gTWVzc2FnZVBhcnQuU09BUF9CT0RZX0JJTkRJTkcpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJ0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHBhcnQgaXMgYm91bmQgdG8gU09BUEhlYWRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JvdW5kVG9TT0FQSGVhZGVyKE1lc3NhZ2VQYXJ0IHBhcnQpIHsKLSAgICAgICAgaWYoKHBhcnQgIT0gbnVsbCkgJiYgcGFydC5nZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRLaW5kKCkgPT0gTWVzc2FnZVBhcnQuU09BUF9IRUFERVJfQklORElORykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5ib3VuZChNZXNzYWdlUGFydCBwYXJ0KSB7Ci0gICAgICAgIGlmKChwYXJ0ICE9IG51bGwpICYmIHBhcnQuZ2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZCgpID09IE1lc3NhZ2VQYXJ0LlBBUlRfTk9UX0JPVU5ERUQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uUHJvY2Vzc29yQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL0Fubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0LmphdmEKaW5kZXggZWFlYjgxNC4uYzZjMzc1MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL0Fubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL0Fubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMjggKzI0LDE4IEBACiAgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5hbm5vdGF0aW9uOwogCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk1vZGVsOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk9wZXJhdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Qb3J0OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlNlcnZpY2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCTW9kZWw7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUFVzZTsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5SZWZlcmVuY2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbi4qOwogCiAKIC8qKgpAQCAtODUsMTQgKzc1LDYgQEAKICAgICAgICAgcmV0dXJuIHNlaUNvbnRleHRNYXAudmFsdWVzKCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gYWxsRW5jb2RlZCgpIHsKLSAgICAgICAgZm9yIChTRUlDb250ZXh0IHNlaUNvbnRleHQgOiBzZWlDb250ZXh0TWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoIWlzRW5jb2RlZChzZWlDb250ZXh0LmdldE1vZGVsKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBwdWJsaWMgaW50IGdldFJvdW5kKCkgewogICAgICAgICByZXR1cm4gcm91bmQ7CiAgICAgfQpAQCAtMTI4LDIzICsxMTAsMTUgQEAKICAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBXcmFwcGVySW5mbz4gcmVzT3BlcmF0aW9uV3JhcHBlck1hcDsKICAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGYXVsdEluZm8+IGV4Y2VwdGlvbkJlYW5NYXA7CiAKLSAgICAgICAgcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLSAgICAgICAgcHJpdmF0ZSBNYXA8T2JqZWN0LCBSZWZlcmVuY2U+IHNjaGVtYVJlZmVyZW5jZXM7Ci0gICAgICAgIHByaXZhdGUgTWFwPFFOYW1lLCBSZWZlcmVuY2U+IHNjaGVtYUVsZW1lbnRzOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtb2RlbENvbXBpbGVkID0gZmFsc2U7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHNlaU5hbWU7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHNlaUltcGxOYW1lOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50c1NFSSA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIEpBWEJNb2RlbCBqYXhCTW9kZWw7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7CiAKICAgICAgICAgcHVibGljIFNFSUNvbnRleHQoU3RyaW5nIHNlaU5hbWUpIHsKICAgICAgICAgICAgIHJlcU9wZXJhdGlvbldyYXBwZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdyYXBwZXJJbmZvPigpOwogICAgICAgICAgICAgcmVzT3BlcmF0aW9uV3JhcHBlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgV3JhcHBlckluZm8+KCk7CiAgICAgICAgICAgICBleGNlcHRpb25CZWFuTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLEZhdWx0SW5mbz4oKTsKLSAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFJlZmVyZW5jZT4oKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnRzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFJlZmVyZW5jZT4oKTsKICAgICAgICAgICAgIHRoaXMuc2VpTmFtZSA9IHNlaU5hbWU7CiAgICAgICAgIH0KIApAQCAtMTY0LDIwICsxMzgsNiBAQAogICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEpBWEJNb2RlbChKQVhCTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgICAgIHRoaXMuamF4Qk1vZGVsID0gbW9kZWw7Ci0gICAgICAgICAgICBpZiAodGhpcy5tb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0SkFYQk1vZGVsKG1vZGVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBKQVhCTW9kZWwgZ2V0SkFYQk1vZGVsKCkgewotICAgICAgICAgICAgcmV0dXJuIGpheEJNb2RlbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U0VJTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBzZWlOYW1lOwotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTRUlJbXBsTmFtZSgpIHsKICAgICAgICAgICAgIHJldHVybiBzZWlJbXBsTmFtZTsKICAgICAgICAgfQpAQCAtMjA5LDM1ICsxNjksNiBAQAogICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TW9kZWwoTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgICAgIG1vZGVsLnNldEpBWEJNb2RlbChqYXhCTW9kZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1vZGVsIGdldE1vZGVsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0TW9kZWxDb21waWxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtb2RlbENvbXBpbGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TW9kZWxDb21waWxlZChib29sZWFuIGNvbXBpbGVkKSB7Ci0gICAgICAgICAgICBtb2RlbENvbXBpbGVkID0gY29tcGlsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxSZWZlcmVuY2U+IGdldFNjaGVtYVJlZmVyZW5jZXMoTW9kZWxCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWFSZWZlcmVuY2VzLnZhbHVlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1hcDxRTmFtZSwgUmVmZXJlbmNlPiBnZXRTY2hlbWFFbGVtZW50TWFwKE1vZGVsQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2NoZW1hRWxlbWVudHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxSZWZlcmVuY2U+IGdldFNjaGVtYVJlZmVyZW5jZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2NoZW1hUmVmZXJlbmNlcy52YWx1ZXMoKTsKLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyRXhjZXB0aW9uTWFwKCkgewogICAgICAgICAgICAgZXhjZXB0aW9uQmVhbk1hcC5jbGVhcigpOwogICAgICAgICB9CkBAIC0yNDksNTEgKzE4MCw1IEBACiAgICAgICAgIHB1YmxpYyBGYXVsdEluZm8gZ2V0RXhjZXB0aW9uQmVhbk5hbWUoU3RyaW5nIGV4Y2VwdGlvbikgewogICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbkJlYW5NYXAuZ2V0KGV4Y2VwdGlvbik7CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVmZXJlbmNlIGFkZFJlZmVyZW5jZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKLSAgICAgICAgICAgIFJlZmVyZW5jZSByZWYgPSBzY2hlbWFSZWZlcmVuY2VzLmdldChtZXRob2QpOwotICAgICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJlZiA9IG5ldyBSZWZlcmVuY2UobWV0aG9kKTsKLSAgICAgICAgICAgIGFkZFJlZmVyZW5jZShtZXRob2QsIHJlZik7Ci0gICAgICAgICAgICByZXR1cm4gcmVmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlZmVyZW5jZSBhZGRSZWZlcmVuY2UoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW0pIHsKLSAgICAgICAgICAgIFJlZmVyZW5jZSByZWYgPSBzY2hlbWFSZWZlcmVuY2VzLmdldChwYXJhbSk7Ci0gICAgICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmVmID0gbmV3IFJlZmVyZW5jZShwYXJhbSk7Ci0gICAgICAgICAgICBhZGRSZWZlcmVuY2UocGFyYW0sIHJlZik7Ci0gICAgICAgICAgICByZXR1cm4gcmVmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlZmVyZW5jZSBhZGRSZWZlcmVuY2UoVHlwZU1pcnJvciB0eXBlLCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbSkgewotICAgICAgICAgICAgUmVmZXJlbmNlIHJlZiA9IHNjaGVtYVJlZmVyZW5jZXMuZ2V0KHBhcmFtKTsKLSAgICAgICAgICAgIGlmIChyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZWYgPSBuZXcgUmVmZXJlbmNlKHR5cGUsIHBhcmFtKTsKLSAgICAgICAgICAgIGFkZFJlZmVyZW5jZShwYXJhbSwgcmVmKTsKLSAgICAgICAgICAgIHJldHVybiByZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVmZXJlbmNlIGFkZFJlZmVyZW5jZShUeXBlRGVjbGFyYXRpb24gdHlwZSwgQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGFwRW52KSB7Ci0gICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gc2NoZW1hUmVmZXJlbmNlcy5nZXQodHlwZSk7Ci0gICAgICAgICAgICBpZiAocmVmID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmVmID0gbmV3IFJlZmVyZW5jZSh0eXBlLCBhcEVudik7Ci0gICAgICAgICAgICBhZGRSZWZlcmVuY2UodHlwZSwgcmVmKTsKLSAgICAgICAgICAgIHJldHVybiByZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkUmVmZXJlbmNlKE9iamVjdCBrZXksIFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLSAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZXMucHV0KGtleSwgcmVmZXJlbmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWFSZWZlcmVuY2VzLmdldChrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkU2NoZW1hRWxlbWVudChRTmFtZSBlbGVtTmFtZSwgUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotICAgICAgICAgICAgaWYgKGVsZW1OYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnRzLnB1dChlbGVtTmFtZSwgcmVmZXJlbmNlKTsKLSAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9GYXVsdEluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9GYXVsdEluZm8uamF2YQppbmRleCBlMTRjNjQ3Li5iYWQwZTY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vRmF1bHRJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL0ZhdWx0SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDcgKzI3LDYgQEAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5hbm5vdGF0aW9uLio7CiAKIC8qKgogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9NYWtlU2FmZVR5cGVWaXNpdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vTWFrZVNhZmVUeXBlVmlzaXRvci5qYXZhCmluZGV4IDE2NjZlNTAuLjU2NTFkZDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9NYWtlU2FmZVR5cGVWaXNpdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL01ha2VTYWZlVHlwZVZpc2l0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyOCArMjUsMTMgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb247CiAKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotCi0KIGltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC50b29scy5BUFRUeXBlVmlzaXRvcjsKLQoraW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ7CiBpbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuQXJyYXlUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuQ2xhc3NUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuRGVjbGFyZWRUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuSW50ZXJmYWNlVHlwZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlByaW1pdGl2ZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5SZWZlcmVuY2VUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVWYXJpYWJsZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlZvaWRUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuV2lsZGNhcmRUeXBlOworaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuKjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci51dGlsLlR5cGVzOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL01lbWJlckluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9NZW1iZXJJbmZvLmphdmEKaW5kZXggZTNhYTA1ZS4uZWE0ZjdkMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL01lbWJlckluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vTWVtYmVySW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDMwICsyNCwzOCBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbjsKIAotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwogaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKIAoraW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKwogLyoqCiAgKgogICogQGF1dGhvciAgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgTWVtYmVySW5mbyBpbXBsZW1lbnRzIENvbXBhcmFibGU8TWVtYmVySW5mbz4gewotICAgIGludCBwYXJhbUluZGV4OwotICAgIFR5cGVNaXJyb3IgcGFyYW1UeXBlOwotICAgIFN0cmluZyBwYXJhbU5hbWU7Ci0gICAgUU5hbWUgZWxlbWVudE5hbWU7CitwdWJsaWMgZmluYWwgY2xhc3MgTWVtYmVySW5mbyBpbXBsZW1lbnRzIENvbXBhcmFibGU8TWVtYmVySW5mbz4geworICAgIHByaXZhdGUgZmluYWwgVHlwZU1pcnJvciBwYXJhbVR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lOworICAgIHByaXZhdGUgZmluYWwgUU5hbWUgZWxlbWVudE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uW10gamF4YkFubm90YXRpb25zOworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHRvIGxvb2sgdXAgYW5ub3RhdGlvbnMgb24gdGhpcyBwYXJhbWV0ZXIvcmV0dXJuIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbiBkZWNsOwogCi0gICAgcHVibGljIE1lbWJlckluZm8oaW50IHBhcmFtSW5kZXgsIFR5cGVNaXJyb3IgcGFyYW1UeXBlLCBTdHJpbmcgcGFyYW1OYW1lLAotICAgICAgICBRTmFtZSBlbGVtZW50TmFtZSkgewotICAgICAgICB0aGlzLnBhcmFtSW5kZXggPSBwYXJhbUluZGV4OworICAgIHB1YmxpYyBNZW1iZXJJbmZvKFR5cGVNaXJyb3IgcGFyYW1UeXBlLCBTdHJpbmcgcGFyYW1OYW1lLCBRTmFtZSBlbGVtZW50TmFtZSwgQE5vdE51bGwgRGVjbGFyYXRpb24gZGVjbCwgQW5ub3RhdGlvbi4uLiBqYXhiQW5ub3RhdGlvbnMpIHsKICAgICAgICAgdGhpcy5wYXJhbVR5cGUgPSBwYXJhbVR5cGU7CiAgICAgICAgIHRoaXMucGFyYW1OYW1lID0gcGFyYW1OYW1lOwogICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7CisgICAgICAgIHRoaXMuZGVjbCA9IGRlY2w7CisgICAgICAgIHRoaXMuamF4YkFubm90YXRpb25zID0gamF4YkFubm90YXRpb25zOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW1JbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtSW5kZXg7CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbltdIGdldEpheGJBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGpheGJBbm5vdGF0aW9uczsKICAgICB9CiAKICAgICBwdWJsaWMgVHlwZU1pcnJvciBnZXRQYXJhbVR5cGUoKSB7CkBAIC02Miw2ICs3MCwxMCBAQAogICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7CiAgICAgfQogCisgICAgcHVibGljIEBOb3ROdWxsIERlY2xhcmF0aW9uIGdldERlY2woKSB7CisgICAgICAgIHJldHVybiBkZWNsOworICAgIH0KKwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE1lbWJlckluZm8gbWVtYmVyKSB7CiAgICAgICAgIHJldHVybiBwYXJhbU5hbWUuY29tcGFyZVRvKG1lbWJlci5wYXJhbU5hbWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9Nb2RlbEJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9Nb2RlbEJ1aWxkZXIuamF2YQppbmRleCAxM2IyNmM1Li5lZjBmNTIyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vTW9kZWxCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL01vZGVsQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDI0ICsyNCwxNyBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbjsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQoraW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ7CitpbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKK2ltcG9ydCBjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlBvcnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuU2VydmljZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLk1vZGVsZXJFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5Xc2dlbk9wdGlvbnM7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CiAKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuKjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi4qOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuKjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci51dGlsLio7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbi4qOworaW1wb3J0IGphdmEuaW8uRmlsZTsKIAogLyoqCiAgKgpAQCAtNDksNyArNDIsNiBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE1vZGVsQnVpbGRlciB7CiAgICAgcHVibGljIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBnZXRBUEVudigpOwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKFR5cGVEZWNsYXJhdGlvbiBkLCBRTmFtZSBtb2RlbE5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyBtb2RlbGVyQ2xhc3NOYW1lKTsKICAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSk7CiAgICAgcHVibGljIHZvaWQgc2V0UG9ydChQb3J0IHBvcnQpOwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0aW9uTmFtZShTdHJpbmcgbWV0aG9kTmFtZSk7CkBAIC02MiwxNCArNTQsMTEgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVyR2VuZXJhdGVkKGJvb2xlYW4gd3JhcHBlckdlbmVyYXRlZCk7CiAgICAgcHVibGljIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVOYW1lKTsKICAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZVZlcnNpb24oKTsKLSAgICBwdWJsaWMgUHJvY2Vzc29yRW52aXJvbm1lbnQgZ2V0UHJvY2Vzc29yRW52aXJvbm1lbnQoKTsKKyAgICBwdWJsaWMgV3NnZW5PcHRpb25zIGdldE9wdGlvbnMoKTsKICAgICBwdWJsaWMgRmlsZSBnZXRTb3VyY2VEaXIoKTsKICAgICBwdWJsaWMgU3RyaW5nIGdldFhNTE5hbWUoU3RyaW5nIGphdmFOYW1lKTsKLSAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBrZXkpOwotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgdGhyb3dzIE1vZGVsZXJFeGNlcHRpb247Ci0gICAgcHVibGljIHZvaWQgb25FcnJvcihTb3VyY2VQb3NpdGlvbiBzcmNQb3MsIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHRocm93cyBNb2RlbGVyRXhjZXB0aW9uOwotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTG9jYWxpemFibGUgbXNnKSB0aHJvd3MgTW9kZWxlckV4Y2VwdGlvbjsKLSAgICBwdWJsaWMgdm9pZCBvbldhcm5pbmcoTG9jYWxpemFibGUgbXNnKTsKLSAgICBwdWJsaWMgdm9pZCBvbkluZm8oTG9jYWxpemFibGUgbXNnKTsKICAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZyk7CisKKyAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBzKTsKKyAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFNvdXJjZVBvc2l0aW9uIHBvcywgTG9jYWxpemFibGUgbXNnKSB0aHJvd3MgTW9kZWxlckV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9UeXBlTW9kZWxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1R5cGVNb2RlbGVyLmphdmEKaW5kZXggOTU5YWNiYS4uNmNhZDg4MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1R5cGVNb2RlbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1R5cGVNb2RlbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMjAgKzI0LDEzIEBACiAgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5hbm5vdGF0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0Lio7CitpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi4qOwogaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuKjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci51dGlsLio7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb24uKjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlN0cmluZ1V0aWxzOwogCitpbXBvcnQgamF2YS51dGlsLio7CisKIAogLyoqCiAgKgpAQCAtNDYsMzkgKzM5LDExIEBACiBwdWJsaWMgY2xhc3MgVHlwZU1vZGVsZXIgaW1wbGVtZW50cyBXZWJTZXJ2aWNlQ29uc3RhbnRzIHsKIAogICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKFR5cGVNaXJyb3IgdHlwZU1pcnJvcikgewotICAgICAgICBUeXBlRGVjbGFyYXRpb24gcmV0RGVjbCA9IG51bGw7CiAgICAgICAgIGlmICh0eXBlTWlycm9yIGluc3RhbmNlb2YgRGVjbGFyZWRUeXBlKQogICAgICAgICAgICAgcmV0dXJuICgoRGVjbGFyZWRUeXBlKXR5cGVNaXJyb3IpLmdldERlY2xhcmF0aW9uKCk7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihUeXBlTWlycm9yIHR5cGUpIHsKLSAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gbnVsbDsKLSAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzc1R5cGUpCi0gICAgICAgICAgICB0eXBlRGVjbCA9ICgoQ2xhc3NUeXBlKXR5cGUpLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHR5cGVEZWNsID0gKChJbnRlcmZhY2VUeXBlKXR5cGUpLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIHJldHVybiB0eXBlRGVjbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gZ2V0U3VwZXJpbnRlcmZhY2VzKFR5cGVNaXJyb3IgdHlwZSkgewotICAgICAgICBDb2xsZWN0aW9uPEludGVyZmFjZVR5cGU+IGludGVyZmFjZXMgPSBudWxsOwotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzVHlwZSkKLSAgICAgICAgICAgIGludGVyZmFjZXMgPSAoKENsYXNzVHlwZSl0eXBlKS5nZXRTdXBlcmludGVyZmFjZXMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW50ZXJmYWNlcyA9ICgoSW50ZXJmYWNlVHlwZSl0eXBlKS5nZXRTdXBlcmludGVyZmFjZXMoKTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEludGVyZmFjZVR5cGU+IGdldFN1cGVyaW50ZXJmYWNlcyhUeXBlRGVjbGFyYXRpb24gdHlwZSkgewotICAgICAgICBDb2xsZWN0aW9uPEludGVyZmFjZVR5cGU+IGludGVyZmFjZXMgPSBudWxsOwotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pCi0gICAgICAgICAgICBpbnRlcmZhY2VzID0gKChDbGFzc0RlY2xhcmF0aW9uKXR5cGUpLmdldFN1cGVyaW50ZXJmYWNlcygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbnRlcmZhY2VzID0gKChJbnRlcmZhY2VEZWNsYXJhdGlvbil0eXBlKS5nZXRTdXBlcmludGVyZmFjZXMoKTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZXM7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gZ2V0RGVjbGFyaW5nQ2xhc3NNZXRob2QoCiAgICAgICAgIFR5cGVNaXJyb3IgdGhlQ2xhc3MsCiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lLApAQCAtOTksNyArNjQsNyBAQAogICAgICAgICAgICAgICAgIHJldENsYXNzID0gZ2V0RGVjbGFyaW5nQ2xhc3NNZXRob2Qoc3VwZXJDbGFzcywgbWV0aG9kTmFtZSwgYXJncyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJldENsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlIDogZ2V0U3VwZXJpbnRlcmZhY2VzKHRoZUNsYXNzKSkKKyAgICAgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlIDogdGhlQ2xhc3MuZ2V0U3VwZXJpbnRlcmZhY2VzKCkpCiAgICAgICAgICAgICAgICAgcmV0Q2xhc3MgPQogICAgICAgICAgICAgICAgICAgICBnZXREZWNsYXJpbmdDbGFzc01ldGhvZChpbnRlcmZhY2VUeXBlLCBtZXRob2ROYW1lLCBhcmdzKTsKICAgICAgICAgfQpAQCAtMTQzLDggKzEwOCw4IEBACiAKICAgICBwdWJsaWMgc3RhdGljIFR5cGVNaXJyb3IgZ2V0SG9sZGVyVmFsdWVUeXBlKAogICAgICAgICBUeXBlTWlycm9yIHR5cGUsCi0gICAgICAgIFR5cGVEZWNsYXJhdGlvbiBkZWZIb2xkZXIsCi0gICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpIHsKKyAgICAgICAgVHlwZURlY2xhcmF0aW9uIGRlZkhvbGRlcgorICAgICkgewogCiAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IGdldERlY2xhcmF0aW9uKHR5cGUpOwogICAgICAgICBpZiAodHlwZURlY2wgPT0gbnVsbCkKQEAgLTIxNiwyMSArMTgxLDIxIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsVHlwZU1pcnJvcj4gZ2V0RXhjZXB0aW9uUHJvcGVydGllcyhUeXBlTWlycm9yIHR5cGUpIHsKKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsTWV0aG9kRGVjbGFyYXRpb24+IGdldEV4Y2VwdGlvblByb3BlcnRpZXMoVHlwZU1pcnJvciB0eXBlKSB7CiAgICAgICAgIHJldHVybiBnZXRFeGNlcHRpb25Qcm9wZXJ0aWVzKGdldERlY2xhcmF0aW9uKHR5cGUpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsVHlwZU1pcnJvcj4gZ2V0RXhjZXB0aW9uUHJvcGVydGllcyhUeXBlRGVjbGFyYXRpb24gdHlwZSkgewotICAgICAgICBNYXA8U3RyaW5nLCBUeXBlTWlycm9yPiBtZW1iZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUeXBlTWlycm9yPigpOworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZyxNZXRob2REZWNsYXJhdGlvbj4gZ2V0RXhjZXB0aW9uUHJvcGVydGllcyhUeXBlRGVjbGFyYXRpb24gdHlwZSkgeworICAgICAgICBNYXA8U3RyaW5nLE1ldGhvZERlY2xhcmF0aW9uPiBtZW1iZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1ldGhvZERlY2xhcmF0aW9uPigpOwogICAgICAgICBjb2xsZWN0RXhjZXB0aW9uUHJvcGVydGllcyh0eXBlLCBtZW1iZXJzKTsKICAgICAgICAgcmV0dXJuIG1lbWJlcnM7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3RFeGNlcHRpb25Qcm9wZXJ0aWVzKFR5cGVNaXJyb3IgdHlwZSwgTWFwPFN0cmluZyxUeXBlTWlycm9yPiBtZW1iZXJzKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3RFeGNlcHRpb25Qcm9wZXJ0aWVzKFR5cGVNaXJyb3IgdHlwZSwgTWFwPFN0cmluZyxNZXRob2REZWNsYXJhdGlvbj4gbWVtYmVycykgewogICAgICAgICBjb2xsZWN0RXhjZXB0aW9uUHJvcGVydGllcyhnZXREZWNsYXJhdGlvbih0eXBlKSwgbWVtYmVycyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3RFeGNlcHRpb25Qcm9wZXJ0aWVzKFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBNYXA8U3RyaW5nLFR5cGVNaXJyb3I+IG1lbWJlcnMpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdEV4Y2VwdGlvblByb3BlcnRpZXMoVHlwZURlY2xhcmF0aW9uIHR5cGUsIE1hcDxTdHJpbmcsTWV0aG9kRGVjbGFyYXRpb24+IG1lbWJlcnMpIHsKIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInR5cGU6ICIrdHlwZS50b1N0cmluZygpKTsKICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHM7CiAgICAgICAgIG1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKQEAgLTI1NiwxMyArMjIxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFByaW1pdGl2ZVR5cGUpcmVzdWx0VHlwZSkuZ2V0S2luZCgpID09IFByaW1pdGl2ZVR5cGUuS2luZC5CT09MRUFOKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGUgZ2V0dGVyCiAvLyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleGNlcHRpb24gcHJvcGVydHk6ICIrIFN0cmluZ1V0aWxzLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygzKSkpOwotICAgICAgICAgICAgICAgIG1lbWJlcnMucHV0KFN0cmluZ1V0aWxzLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygzKSksIHJlc3VsdFR5cGUpOworICAgICAgICAgICAgICAgIG1lbWJlcnMucHV0KFN0cmluZ1V0aWxzLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygzKSksIG1ldGhvZCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdFR5cGUgaW5zdGFuY2VvZiBQcmltaXRpdmVUeXBlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFByaW1pdGl2ZVR5cGUpcmVzdWx0VHlwZSkuZ2V0S2luZCgpID09IFByaW1pdGl2ZVR5cGUuS2luZC5CT09MRUFOICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoSVNfUFJFRklYKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBCb29sZWFuIGdldHRlcgogLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhjZXB0aW9uIHByb3BlcnR5OiAiKyBTdHJpbmdVdGlscy5kZWNhcGl0YWxpemUobmFtZS5zdWJzdHJpbmcoMikpKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVycy5wdXQoU3RyaW5nVXRpbHMuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDIpKSwgcmVzdWx0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWJlcnMucHV0KFN0cmluZ1V0aWxzLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygyKSksIG1ldGhvZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNzAsNyArMjM1LDcgQEAKICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uICYmICgoQ2xhc3NEZWNsYXJhdGlvbil0eXBlKS5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbCkgIHsKICAgICAgICAgICAgIGNvbGxlY3RFeGNlcHRpb25Qcm9wZXJ0aWVzKCgoQ2xhc3NEZWNsYXJhdGlvbil0eXBlKS5nZXRTdXBlcmNsYXNzKCksIG1lbWJlcnMpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRmVHlwZSA6IGdldFN1cGVyaW50ZXJmYWNlcyh0eXBlKSkgeworICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZlR5cGUgOiB0eXBlLmdldFN1cGVyaW50ZXJmYWNlcygpKSB7CiAgICAgICAgICAgICBjb2xsZWN0RXhjZXB0aW9uUHJvcGVydGllcyhpbnRmVHlwZSwgbWVtYmVycyk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vVHlwZU1vbmlrZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9UeXBlTW9uaWtlci5qYXZhCmluZGV4IDQxOTM0Y2IuLjRhNzVmMmQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9UeXBlTW9uaWtlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9UeXBlTW9uaWtlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDkgKzI0LDggQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb247CiAKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7CiBpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb24uKjsKK2ltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7CiAKIC8qKgogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9UeXBlTW9uaWtlckZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9UeXBlTW9uaWtlckZhY3RvcnkuamF2YQppbmRleCBjNGRiYTU0Li5hYTkzNzU5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vVHlwZU1vbmlrZXJGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1R5cGVNb25pa2VyRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE0ICsyNSwxNSBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb247CiAKIAotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLio7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudXRpbC5UeXBlczsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OworaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLkFycmF5VHlwZTsKK2ltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLkRlY2xhcmVkVHlwZTsKK2ltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb24uKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAogLyoqCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dlYlNlcnZpY2VBUC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dlYlNlcnZpY2VBUC5qYXZhCmluZGV4IGRiMjNiNzQuLjllMmUxZDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9XZWJTZXJ2aWNlQVAuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vV2ViU2VydmljZUFQLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsNzAgKzI3LDQ5IEBACiBpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3I7CiBpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKIGltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuTWVzc2FnZXI7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLio7CiBpbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5DbGFzc1R5cGU7CiBpbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5JbnRlcmZhY2VUeXBlOwogaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3Nvck5vdGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3Nvck9wdGlvbnM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5Ub29sVmVyc2lvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuR2VuZXJhdG9yVXRpbDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuTmFtZXM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk9wZXJhdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Qb3J0OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlNlcnZpY2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCTW9kZWw7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uUHJvY2Vzc29yQ29udGV4dC5TRUlDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuQ2xpZW50UHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWwuVG9vbEJhc2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5Ub29sVmVyc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuSmF2YUNvbXBpbGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5SZWZlcmVuY2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlhKQzsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLndzZGwuQ29uc29sZUVycm9yUmVwb3J0ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuV2Vic2VydmljZWFwTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuKjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogCi0KIC8qKgogICogV2ViU2VydmljZUFQIGlzIGEgQVBUIEFubm90YXRpb25Qcm9jZXNzb3IgZm9yIHByb2Nlc3NpbmcgamF2YXguandzLiogYW5kCiAgKiBqYXZheC54bWwud3MuKiBhbm5vdGF0aW9ucy4gVGhpcyBjbGFzcyBpcyB1c2VkIGVpdGhlciBieSB0aGUgV3NHZW4gKENvbXBpbGVUb29sKSB0b29sIG9yCi0gKiAgICBpZGlyZWN0bHkgdmlhIHRoZSB7QGxpbmsgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwud3MuV1NBUCBXU0FQfSB3aGVuIGludm9rZWQgYnkgQVBULgorICogICAgaWRpcmVjdGx5IHZpYSB0aGUge0BsaW5rIGNvbS5zdW4uaXN0YWNrLmludGVybmFsLndzLkFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5SW1wbH0gd2hlbiBpbnZva2VkIGJ5IEFQVC4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBUCBleHRlbmRzIFRvb2xCYXNlIGltcGxlbWVudHMgQW5ub3RhdGlvblByb2Nlc3NvciwgTW9kZWxCdWlsZGVyLCBXZWJTZXJ2aWNlQ29uc3RhbnRzLAotICAgIFByb2Nlc3Nvck5vdGlmaWNhdGlvbkxpc3RlbmVyIHsKK3B1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQVAgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yLCBNb2RlbEJ1aWxkZXIsIFdlYlNlcnZpY2VDb25zdGFudHN7CiAKICAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGFwRW52OwotICAgIHByb3RlY3RlZCBQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnY7CiAKICAgICBwcml2YXRlIEZpbGUgc291cmNlRGlyOwogCi0gICAgLy8gdGhlIG1vZGVsIGJlaW5nIGJ1aWxkCi0gICAgcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQogICAgIHByaXZhdGUgVHlwZURlY2xhcmF0aW9uIHJlbW90ZURlY2w7CiAgICAgcHJpdmF0ZSBUeXBlRGVjbGFyYXRpb24gcmVtb3RlRXhjZXB0aW9uRGVjbDsKICAgICBwcml2YXRlIFR5cGVEZWNsYXJhdGlvbiBleGNlcHRpb25EZWNsOwpAQCAtMTAwLDEzICs3OSwxNCBAQAogICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uUHJvY2Vzc29yQ29udGV4dCBjb250ZXh0OwogICAgIHByaXZhdGUgU2V0PFR5cGVEZWNsYXJhdGlvbj4gcHJvY2Vzc2VkVHlwZURlY2xzID0gbmV3IEhhc2hTZXQ8VHlwZURlY2xhcmF0aW9uPigpOwogICAgIHByb3RlY3RlZCBNZXNzYWdlciBtZXNzYWdlcjsKLSAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQ7Ci0gICAgcHJpdmF0ZSBUb29sQmFzZSB0b29sOwogICAgIHByaXZhdGUgYm9vbGVhbiBkb05vdE92ZXJXcml0ZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB3cmFwcGVyR2VuZXJhdGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBXc2dlbk9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIEVycm9yUmVjZWl2ZXIgcmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQ7CisKICAgICAvKgotICAgICAqIElzIHRoaXMgaW52b2NhdGlvbiBmcm9tIEFQVCBvciBKYXZhQz8KLSAgICAgKi8KKyAgICAqIElzIHRoaXMgaW52b2NhdGlvbiBmcm9tIEFQVCBvciBKYXZhQz8KKyAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc0FQVEludm9jYXRpb24gPSBmYWxzZTsKIAogCkBAIC0xMTcsMTcgKzk3LDE0IEBACiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHVibGljIFdlYlNlcnZpY2VBUChUb29sQmFzZSB0b29sLCBQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYsIFByb3BlcnRpZXMgb3B0aW9ucywgIEFubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoU3lzdGVtLm91dCwgIldlYlNlcnZpY2VBUCIpOworCisgICAgcHVibGljIFdlYlNlcnZpY2VBUChXc2dlbk9wdGlvbnMgb3B0aW9ucywgQW5ub3RhdGlvblByb2Nlc3NvckNvbnRleHQgY29udGV4dCwgRXJyb3JSZWNlaXZlciByZWNlaXZlciwgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuc291cmNlRGlyID0gKG9wdGlvbnMgIT0gbnVsbCk/b3B0aW9ucy5zb3VyY2VEaXI6bnVsbDsKKyAgICAgICAgdGhpcy5kb05vdE92ZXJXcml0ZSA9IChvcHRpb25zICE9IG51bGwpICYmIG9wdGlvbnMuZG9Ob3RPdmVyV3JpdGU7CisgICAgICAgIHRoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CiAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIHRoaXMudG9vbCA9IHRvb2w7Ci0gICAgICAgIHRoaXMuZW52ID0gZW52OwotICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzb3VyY2VEaXIgPSBuZXcgRmlsZShvcHRpb25zLmdldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuU09VUkNFX0RJUkVDVE9SWV9QUk9QRVJUWSkpOwotICAgICAgICAgICAgU3RyaW5nIGtleSA9IFByb2Nlc3Nvck9wdGlvbnMuRE9OT1RfT1ZFUldSSVRFX0NMQVNTRVM7Ci0gICAgICAgICAgICB0aGlzLmRvTm90T3ZlcldyaXRlID0KLSAgICAgICAgICAgICAgICBCb29sZWFuLnZhbHVlT2Yob3B0aW9ucy5nZXRQcm9wZXJ0eShrZXkpKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGluaXQoQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGFwRW52KSB7CkBAIC0xMzYsMTAgKzExMyw2MiBAQAogICAgICAgICByZW1vdGVFeGNlcHRpb25EZWNsID0gdGhpcy5hcEVudi5nZXRUeXBlRGVjbGFyYXRpb24oUkVNT1RFX0VYQ0VQVElPTl9DTEFTU05BTUUpOwogICAgICAgICBleGNlcHRpb25EZWNsID0gdGhpcy5hcEVudi5nZXRUeXBlRGVjbGFyYXRpb24oRVhDRVBUSU9OX0NMQVNTTkFNRSk7CiAgICAgICAgIGRlZkhvbGRlckRlY2wgPSB0aGlzLmFwRW52LmdldFR5cGVEZWNsYXJhdGlvbihIT0xERVJfQ0xBU1NOQU1FKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBXc2dlbk9wdGlvbnMoKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgY2xhc3MgTGlzdGVuZXIgZXh0ZW5kcyBXc2ltcG9ydExpc3RlbmVyIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlRXJyb3JSZXBvcnRlciBjZXIgPSBuZXcgQ29uc29sZUVycm9yUmVwb3J0ZXIob3V0KTsKIAotICAgICAgICBpZiAoZW52ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZWRGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlKFN0cmluZyBtc2cpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4obXNnKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgY2VyLmVycm9yKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgY2VyLmZhdGFsRXJyb3IoZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBjZXIud2FybmluZyhleGNlcHRpb24pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGNlci5pbmZvKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpOworICAgICAgICAgICAgcmVjZWl2ZXIgPSBuZXcgRXJyb3JSZWNlaXZlckZpbHRlcihuZXcgTGlzdGVuZXIoKSkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbmZvKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnF1aWV0KQorICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIud2FybmluZyhleGNlcHRpb24pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvbGxBYm9ydCgpIHRocm93cyBBYm9ydEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0NhbmNlbGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OwogICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhcE9wdGlvbnMgPSBhcEVudi5nZXRPcHRpb25zKCk7Ci0gICAgICAgICAgICBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICBTdHJpbmcgY2xhc3NEaXIgPSBhcE9wdGlvbnMuZ2V0KCItZCIpOwogICAgICAgICAgICAgaWYgKGNsYXNzRGlyID09IG51bGwpCiAgICAgICAgICAgICAgICAgY2xhc3NEaXIgPSAiLiI7CkBAIC0xNTIsNTMgKzE4MSw0MSBAQAogICAgICAgICAgICAgICAgICAgICBGaWxlLnBhdGhTZXBhcmF0b3IgKwogICAgICAgICAgICAgICAgICAgICBjcCArIEZpbGUucGF0aFNlcGFyYXRvciArCiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0gICAgICAgICAgICBlbnYgPSBuZXcgQ2xpZW50UHJvY2Vzc29yRW52aXJvbm1lbnQob3V0cHV0LCBjcGF0aCwgdGhpcyk7Ci0gICAgICAgICAgICAoKENsaWVudFByb2Nlc3NvckVudmlyb25tZW50KSBlbnYpLnNldE5hbWVzKG5ldyBOYW1lcygpKTsKKyAgICAgICAgICAgIG9wdGlvbnMuY2xhc3NwYXRoID0gY3BhdGg7CiAgICAgICAgICAgICBib29sZWFuIHNldFZlcmJvc2UgPSBmYWxzZTsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGFwT3B0aW9ucy5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCItdmVyYm9zZSIpKQotICAgICAgICAgICAgICAgICAgICBzZXRWZXJib3NlPXRydWU7CisgICAgICAgICAgICAgICAgICAgIHNldFZlcmJvc2UgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNldFZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBlbnYuc2V0RmxhZ3MoUHJvY2Vzc29yRW52aXJvbm1lbnQuRl9WRVJCT1NFKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wdGlvbnMudmVyYm9zZSA9IHNldFZlcmJvc2U7CiAgICAgICAgICAgICBtZXNzYWdlciA9IGFwRW52LmdldE1lc3NhZ2VyKCk7CiAgICAgICAgICAgICBpc0FQVEludm9jYXRpb24gPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGVudi5zZXRGaWxlcihhcEVudi5nZXRGaWxlcigpKTsKKyAgICAgICAgb3B0aW9ucy5maWxlciA9IGFwRW52LmdldEZpbGVyKCk7CisvLyAgICAgICAgZW52LnNldEZpbGVyKGFwRW52LmdldEZpbGVyKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZ2V0QVBFbnYoKSB7CiAgICAgICAgIHJldHVybiBhcEVudjsKICAgICB9CiAKLSAgICBwdWJsaWMgUHJvY2Vzc29yRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBlbnY7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2Nlc3NvckVudmlyb25tZW50IGdldFByb2Nlc3NvckVudmlyb25tZW50KCkgewotICAgICAgICByZXR1cm4gZW52OworICAgIHB1YmxpYyBXc2dlbk9wdGlvbnMgZ2V0T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgfQogCiAgICAgcHVibGljIEZpbGUgZ2V0U291cmNlRGlyKCkgewogICAgICAgICByZXR1cm4gc291cmNlRGlyOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGtleSkgewotICAgICAgICBvbkVycm9yKG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2UoZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCksIGtleSkpOworICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKG1lc3NhZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50RXJyb3IobWVzc2FnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgdGhyb3dzIE1vZGVsZXJFeGNlcHRpb24gewotICAgICAgICBvbkVycm9yKG51bGwsIGtleSwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FcnJvcihTb3VyY2VQb3NpdGlvbiBwb3MsIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHRocm93cyBNb2RlbGVyRXhjZXB0aW9uIHsKLSAgICAgICAgb25FcnJvcihwb3MsIG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2UoZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCksIGtleSwgYXJncykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTG9jYWxpemFibGUgbXNnKSB0aHJvd3MgTW9kZWxlckV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uRXJyb3IobnVsbCwgbXNnKTsKLSAgICB9CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKIAogICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU291cmNlUG9zaXRpb24gcG9zLCBMb2NhbGl6YWJsZSBtc2cpIHRocm93cyBNb2RlbGVyRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG1lc3NhZ2VyICE9IG51bGwpIHsKQEAgLTIwOCw1NCArMjI1LDM1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBvbldhcm5pbmcoU3RyaW5nIGtleSkgewotICAgICAgICBvbldhcm5pbmcobmV3IExvY2FsaXphYmxlTWVzc2FnZShnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSwga2V5KSk7Ci0gICAgfQogCi0gICAgcHVibGljIHZvaWQgb25XYXJuaW5nKExvY2FsaXphYmxlIG1zZykgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGxvY2FsaXplci5sb2NhbGl6ZShnZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAud2FybmluZyIsIGxvY2FsaXplci5sb2NhbGl6ZShtc2cpKSk7CisgICAgcHVibGljIHZvaWQgb25XYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgIGlmIChtZXNzYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtZXNzYWdlci5wcmludFdhcm5pbmcobWVzc2FnZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXBvcnQobWVzc2FnZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcHVibGljIHZvaWQgb25JbmZvKExvY2FsaXphYmxlIG1zZykgeworICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICBpZiAobWVzc2FnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBsb2NhbGl6ZXIubG9jYWxpemUobXNnKTsKICAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Tm90aWNlKG1lc3NhZ2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBsb2NhbGl6ZXIubG9jYWxpemUoZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmluZm8iLCBsb2NhbGl6ZXIubG9jYWxpemUobXNnKSkpOwogICAgICAgICAgICAgcmVwb3J0KG1lc3NhZ2UpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgcmVwb3J0KFN0cmluZyBtc2cpIHsKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0c3RyZWFtID0KKyAgICAgICAgICAgICAgICBvdXQgaW5zdGFuY2VvZiBQcmludFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgPyBvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFByaW50U3RyZWFtKG91dCwgdHJ1ZSk7CisgICAgICAgIG91dHN0cmVhbS5wcmludGxuKG1zZyk7CisgICAgICAgIG91dHN0cmVhbS5mbHVzaCgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7CiAgICAgICAgIGlmIChjb250ZXh0LmdldFJvdW5kKCkgPT0gMSkgewogICAgICAgICAgICAgYnVpbGRNb2RlbCgpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghd3JhcHBlckdlbmVyYXRlZCAgfHwgLy8gdGhlIHdyYXBwZXJzIGFscmVhZHkgZXhpc3QKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0Um91bmQoKSA9PSAyIHx8Ci0gICAgICAgICAgICBjb250ZXh0LmFsbEVuY29kZWQoKSkgewotICAgICAgICAgICAgaWYgKChjb250ZXh0LmdldFJvdW5kKCkgPT0gMiB8fCAhd3JhcHBlckdlbmVyYXRlZCkgJiYgIWNvbnRleHQuaXNNb2RlbENvbXBsZXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGVNb2RlbCgpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0TW9kZWxDb21wbGV0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoU0VJQ29udGV4dCBzZWlDb250ZXh0IDogY29udGV4dC5nZXRTRUlDb250ZXh0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2VpQ29udGV4dC5nZXRNb2RlbENvbXBpbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1blByb2Nlc3NvckFjdGlvbnMoc2VpQ29udGV4dC5nZXRNb2RlbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlaUNvbnRleHQuc2V0TW9kZWxDb21waWxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXIgIT0gbnVsbCAmJiBvdXRwdXQgIT0gbnVsbCAmJiBvdXRwdXQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlci5wcmludE5vdGljZShvdXRwdXQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIGNvbnRleHQuaW5jcmVtZW50Um91bmQoKTsKICAgICB9CiAKQEAgLTI3MSw0MCArMjY5LDggQEAKICAgICAgICAgcHJvY2Vzc2VkVHlwZURlY2xzLmNsZWFyKCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuUHJvY2Vzc29yQWN0aW9ucyhNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0b29sICE9IG51bGwpCi0gICAgICAgICAgICB0b29sLnJ1blByb2Nlc3NvckFjdGlvbnMoKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJpY0Vycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3ZWJzZXJ2aWNlYXAuZXJyb3IiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLndlYnNlcnZpY2VhcCI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoVHlwZURlY2xhcmF0aW9uIGQsIFFOYW1lIG1vZGVsTmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgU3RyaW5nIG1vZGVsZXJDbGFzc05hbWUpewotCi0gICAgICAgIFNFSUNvbnRleHQgc2VpQ29udGV4dCA9IGNvbnRleHQuZ2V0U0VJQ29udGV4dChkKTsKLSAgICAgICAgaWYgKHNlaUNvbnRleHQuZ2V0TW9kZWwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvbkVycm9yKCJ3ZWJzZXJ2aWNlYXAubW9kZWwuYWxyZWFkeS5leGlzdHMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsb2coImNyZWF0aW5nIG1vZGVsOiAiICsgbW9kZWxOYW1lKTsKLSAgICAgICAgbW9kZWwgPSBuZXcgTW9kZWwobW9kZWxOYW1lKTsKLSAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlVVJJKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIG1vZGVsLnNldFByb3BlcnR5KAotICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX01PREVMRVJfTkFNRSwKLSAgICAgICAgICAgIG1vZGVsZXJDbGFzc05hbWUpOwotICAgICAgICBzZWlDb250ZXh0LnNldE1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewogICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgICAgICBtb2RlbC5hZGRTZXJ2aWNlKHNlcnZpY2UpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoUG9ydCBwb3J0KSB7CkBAIC0zMTcsNyArMjgzLDYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVyR2VuZXJhdGVkKGJvb2xlYW4gd3JhcHBlckdlbmVyYXRlZCkgewotICAgICAgICB0aGlzLndyYXBwZXJHZW5lcmF0ZWQgPSB3cmFwcGVyR2VuZXJhdGVkOwogICAgIH0KIAogICAgIHB1YmxpYyBUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlTmFtZSkgewpAQCAtMzMwLDcgKzI5NSw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgYnVpbGRNb2RlbCgpIHsKICAgICAgICAgV2ViU2VydmljZSB3ZWJTZXJ2aWNlOwotICAgICAgICBXZWJTZXJ2aWNlUHJvdmlkZXIgd2ViU2VydmljZVByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyIHdlYlNlcnZpY2VQcm92aWRlcjsKICAgICAgICAgV2ViU2VydmljZVZpc2l0b3Igd3JhcHBlckdlbmVyYXRvciA9IGNyZWF0ZVdyYXBwZXJHZW5lcmF0b3IoKTsKICAgICAgICAgYm9vbGVhbiBwcm9jZXNzZWRFbmRwb2ludCA9IGZhbHNlOwogICAgICAgICBmb3IgKFR5cGVEZWNsYXJhdGlvbiB0eXBlZGVjbDogYXBFbnYuZ2V0VHlwZURlY2xhcmF0aW9ucygpKSB7CkBAIC0zNDAsOCArMzA1LDcgQEAKICAgICAgICAgICAgIHdlYlNlcnZpY2UgPSB0eXBlZGVjbC5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MpOwogICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VQcm92aWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbkVycm9yKCJ3ZWJzZXJ2aWNlYXAud2Vic2VydmljZS5hbmQud2Vic2VydmljZXByb3ZpZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3R5cGVkZWNsLmdldFF1YWxpZmllZE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICBvbkVycm9yKFdlYnNlcnZpY2VhcE1lc3NhZ2VzLldFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX0FORF9XRUJTRVJWSUNFUFJPVklERVIodHlwZWRlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVuZHBvaW50ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTM1Miw5ICszMTYsOSBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghcHJvY2Vzc2VkRW5kcG9pbnQpIHsKICAgICAgICAgICAgIGlmIChpc0FQVEludm9jYXRpb24pCi0gICAgICAgICAgICAgICAgb25XYXJuaW5nKCJ3ZWJzZXJ2aWNlYXAubm8ud2Vic2VydmljZS5lbmRwb2ludC5mb3VuZCIpOworICAgICAgICAgICAgICAgIG9uV2FybmluZyhXZWJzZXJ2aWNlYXBNZXNzYWdlcy5XRUJTRVJWSUNFQVBfTk9fV0VCU0VSVklDRV9FTkRQT0lOVF9GT1VORCgpKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvbkVycm9yKCJ3ZWJzZXJ2aWNlYXAubm8ud2Vic2VydmljZS5lbmRwb2ludC5mb3VuZCIpOworICAgICAgICAgICAgICAgIG9uRXJyb3IoV2Vic2VydmljZWFwTWVzc2FnZXMuV0VCU0VSVklDRUFQX05PX1dFQlNFUlZJQ0VfRU5EUE9JTlRfRk9VTkQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM2Miw0OCArMzI2LDExIEBACiAgICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZVdyYXBwZXJHZW5lcmF0b3IodGhpcywgY29udGV4dCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFdlYlNlcnZpY2VWaXNpdG9yIGNyZWF0ZVJlZmVyZW5jZUNvbGxlY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlUmVmZXJlbmNlQ29sbGVjdG9yKHRoaXMsIGNvbnRleHQpOwotICAgIH0KLQogICAgIHByb3RlY3RlZCBib29sZWFuIHNob3VsZFByb2Nlc3NXZWJTZXJ2aWNlKFdlYlNlcnZpY2Ugd2ViU2VydmljZSkgewogICAgICAgICByZXR1cm4gd2ViU2VydmljZSAhPSBudWxsOwogICAgIH0KIAogCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBsZXRlTW9kZWwoKSB7Ci0gICAgICAgIGNsZWFyUHJvY2Vzc2VkKCk7Ci0gICAgICAgIEphdmFDb21waWxlciBqYXZhQyA9IFhKQy5jcmVhdGVKYXZhQ29tcGlsZXIoKTsKLSAgICAgICAgSkFYQk1vZGVsIGpheEJNb2RlbDsKLSAgICAgICAgV2ViU2VydmljZVZpc2l0b3IgcmVmZXJlbmNlQ29sbGVjdG9yID0gY3JlYXRlUmVmZXJlbmNlQ29sbGVjdG9yKCk7Ci0gICAgICAgIGZvciAoU0VJQ29udGV4dCBzZWlDb250ZXh0IDogY29udGV4dC5nZXRTRUlDb250ZXh0cygpKSB7Ci0gICAgICAgICAgICBsb2coImNvbXBsZXRpbmcgbW9kZWwgZm9yIGVuZHBvaW50OiAiK3NlaUNvbnRleHQuZ2V0U0VJSW1wbE5hbWUoKSk7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gZGVjbCA9IGFwRW52LmdldFR5cGVEZWNsYXJhdGlvbihzZWlDb250ZXh0LmdldFNFSUltcGxOYW1lKCkpOwotICAgICAgICAgICAgaWYgKGRlY2wgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBvbkVycm9yKCJ3ZWJzZXJ2aWNlYXAuY291bGQubm90LmZpbmQudHlwZWRlY2wiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7c2VpQ29udGV4dC5nZXRTRUlJbXBsTmFtZSgpLCBjb250ZXh0LmdldFJvdW5kKCl9KTsKLSAgICAgICAgICAgIGRlY2wuYWNjZXB0KHJlZmVyZW5jZUNvbGxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2xlYXJQcm9jZXNzZWQoKTsKLSAgICAgICAgZm9yIChTRUlDb250ZXh0IHNlaUNvbnRleHQgOiBjb250ZXh0LmdldFNFSUNvbnRleHRzKCkpIHsKLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiBkZWNsID0gYXBFbnYuZ2V0VHlwZURlY2xhcmF0aW9uKHNlaUNvbnRleHQuZ2V0U0VJTmFtZSgpKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248UmVmZXJlbmNlPiBzY2hlbWFNaXJyb3JzID0gc2VpQ29udGV4dC5nZXRTY2hlbWFSZWZlcmVuY2VzKHRoaXMpOwotCi0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2NoZW1hTWlycm9ycyBjb3VudDogIiArIHNjaGVtYU1pcnJvcnMuc2l6ZSgpKTsKLS8vICAgICAgICAgICAgZm9yIChSZWZlcmVuY2UgcmVmZXJlbmNlIDogc2NoZW1hTWlycm9ycykge1N5c3RlbS5vdXQucHJpbnRsbigicmVmZXJlbmNlOiAiK3JlZmVyZW5jZS50eXBlKTt9Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzY2hlbWFFbGVtZW50TWFwIGNvdW50OiAiKyBzZWlDb250ZXh0LmdldFNjaGVtYUVsZW1lbnRNYXAodGhpcykuZW50cnlTZXQoKS5zaXplKCkpOwotLy8gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxRTmFtZSwgPyBleHRlbmRzIFJlZmVyZW5jZT4gZW50cnkgOiBzZWlDb250ZXh0LmdldFNjaGVtYUVsZW1lbnRNYXAodGhpcykuZW50cnlTZXQoKSkgewotLy8gICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm5hbWU6ICIgKyBlbnRyeS5nZXRLZXkoKSsiIHZhbHVlOiAiK2VudHJ5LmdldFZhbHVlKCkudHlwZSk7Ci0vLyAgICAgICAgICAgIH0KLQotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldHRpbmcgZGVmYXVsdCBuYW1lc3BhY2VVUkk6ICIrc2VpQ29udGV4dC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBqYXhCTW9kZWwgPSBuZXcgSkFYQk1vZGVsKGphdmFDLmJpbmQoc2NoZW1hTWlycm9ycywgc2VpQ29udGV4dC5nZXRTY2hlbWFFbGVtZW50TWFwKHRoaXMpLAotICAgICAgICAgICAgICAgIHNlaUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKCksIGFwRW52KSk7Ci0vLyAgICAgICAgICAgIGZvciAoSkFYQk1hcHBpbmcgbWFwIDogamF4Qk1vZGVsLmdldE1hcHBpbmdzKCkpIHtTeXN0ZW0ub3V0LnByaW50bG4oIm1hcC5nZXRDbGF6ejogIittYXAuZ2V0Q2xhenooKSk7fQotICAgICAgICAgICAgc2VpQ29udGV4dC5zZXRKQVhCTW9kZWwoamF4Qk1vZGVsKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGlzRXhjZXB0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCkgewogICAgICAgICByZXR1cm4gaXNTdWJ0eXBlKHR5cGVEZWNsLCBleGNlcHRpb25EZWNsKTsKICAgICB9CkBAIC00NjgsMTUgKzM5NSwxNSBAQAogCiAKICAgICBwdWJsaWMgVHlwZU1pcnJvciBnZXRIb2xkZXJWYWx1ZVR5cGUoVHlwZU1pcnJvciB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBUeXBlTW9kZWxlci5nZXRIb2xkZXJWYWx1ZVR5cGUodHlwZSwgZGVmSG9sZGVyRGVjbCwgYXBFbnYpOworICAgICAgICByZXR1cm4gVHlwZU1vZGVsZXIuZ2V0SG9sZGVyVmFsdWVUeXBlKHR5cGUsIGRlZkhvbGRlckRlY2wpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGNhbk92ZXJXcml0ZUNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuICEoKGRvTm90T3ZlcldyaXRlICYmIEdlbmVyYXRvclV0aWwuY2xhc3NFeGlzdHMoZW52LCBjbGFzc05hbWUpKSk7CisgICAgICAgIHJldHVybiAhKChkb05vdE92ZXJXcml0ZSAmJiBHZW5lcmF0b3JVdGlsLmNsYXNzRXhpc3RzKG9wdGlvbnMsIGNsYXNzTmFtZSkpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBpZiAoZW52ICE9IG51bGwgJiYgZW52LnZlcmJvc2UoKSkgeworICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMudmVyYm9zZSkgewogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiWyIgKyBtc2cgKyAiXSI7CiAgICAgICAgICAgICBpZiAobWVzc2FnZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Tm90aWNlKG1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dlYlNlcnZpY2VDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9XZWJTZXJ2aWNlQ29uc3RhbnRzLmphdmEKaW5kZXggOWZmMjBiNy4uOTRmZmFmYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dlYlNlcnZpY2VDb25zdGFudHMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vV2ViU2VydmljZUNvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDcgKzI1LDYgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5hbm5vdGF0aW9uOwogCiAKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwogLyoqCiAgKgogICogQGF1dGhvciAgZGtvaGxlcnQKQEAgLTU0LDcgKzUzLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0lHQ19VTkRFUlNDT1JFICA9ICdfJzsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUID0gIlBvcnQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAiV1NETFBvcnQiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkcgPSAiQmluZGluZyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vV2ViU2VydmljZVJlZmVyZW5jZUNvbGxlY3Rvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dlYlNlcnZpY2VSZWZlcmVuY2VDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1M2NlMy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vV2ViU2VydmljZVJlZmVyZW5jZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0Lio7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uKjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLio7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuKjsKLQotaW1wb3J0IGphdmF4Lmp3cy4qOwotCi0vKioKLSAqCi0gKiBAYXV0aG9yICBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUmVmZXJlbmNlQ29sbGVjdG9yIGV4dGVuZHMgV2ViU2VydmljZVZpc2l0b3IgewotCi0gICAgcHVibGljIFdlYlNlcnZpY2VSZWZlcmVuY2VDb2xsZWN0b3IoTW9kZWxCdWlsZGVyIGJ1aWxkZXIsIEFubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoYnVpbGRlciwgY29udGV4dCk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzV2ViU2VydmljZShXZWJTZXJ2aWNlIHdlYlNlcnZpY2UsIFR5cGVEZWNsYXJhdGlvbiBkKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01ldGhvZChNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIFdlYk1ldGhvZCB3ZWJNZXRob2QpIHsKLSAgICAgICAgYm9vbGVhbiBpc09uZXdheSA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKE9uZXdheS5jbGFzcykgIT0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBnZW5lcmF0ZWRXcmFwcGVyID0gZmFsc2U7Ci0gICAgICAgIGJ1aWxkZXIubG9nKCJXZWJTZXJ2aWNlUmVmZXJlbmNlQ29sbGVjdG9yIC0gbWV0aG9kOiAiK21ldGhvZCk7Ci0gICAgICAgIGNvbGxlY3RUeXBlcyhtZXRob2QsIHdlYk1ldGhvZCwgc2VpQ29udGV4dC5nZXRSZXFPcGVyYXRpb25XcmFwcGVyKG1ldGhvZCkgIT0gbnVsbCk7Ci0gICAgICAgIGlmIChzZWlDb250ZXh0LmdldFJlcU9wZXJhdGlvbldyYXBwZXIobWV0aG9kKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgYXBFbnYgPSBidWlsZGVyLmdldEFQRW52KCk7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2w7Ci0gICAgICAgICAgICB0eXBlRGVjbCA9IGJ1aWxkZXIuZ2V0VHlwZURlY2xhcmF0aW9uKHNlaUNvbnRleHQuZ2V0UmVxT3BlcmF0aW9uV3JhcHBlcihtZXRob2QpLmdldFdyYXBwZXJOYW1lKCkpOwotICAgICAgICAgICAgc2VpQ29udGV4dC5hZGRSZWZlcmVuY2UodHlwZURlY2wsIGFwRW52KTsKLSAgICAgICAgICAgIGlmICghaXNPbmV3YXkpIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVjbCA9IGJ1aWxkZXIuZ2V0VHlwZURlY2xhcmF0aW9uKHNlaUNvbnRleHQuZ2V0UmVzT3BlcmF0aW9uV3JhcHBlcihtZXRob2QpLmdldFdyYXBwZXJOYW1lKCkpOwotICAgICAgICAgICAgICAgIHNlaUNvbnRleHQuYWRkUmVmZXJlbmNlKHR5cGVEZWNsLCBhcEVudik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29sbGVjdEV4Y2VwdGlvbkJlYW5zKG1ldGhvZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbGxlY3RUeXBlcyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIFdlYk1ldGhvZCB3ZWJNZXRob2QsIGJvb2xlYW4gaXNEb2NMaXRXcmFwcGVkKSB7Ci0gICAgICAgIGFkZFNjaGVtYUVsZW1lbnRzKG1ldGhvZCwgaXNEb2NMaXRXcmFwcGVkKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0RXhjZXB0aW9uQmVhbnMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7Ci0gICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBhcEVudiA9IGJ1aWxkZXIuZ2V0QVBFbnYoKTsKLSAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIHRocm93blR5cGUgOiBtZXRob2QuZ2V0VGhyb3duVHlwZXMoKSkgewotICAgICAgICAgICAgRmF1bHRJbmZvIGZhdWx0SW5mbyA9IHNlaUNvbnRleHQuZ2V0RXhjZXB0aW9uQmVhbk5hbWUodGhyb3duVHlwZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmIChmYXVsdEluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghZmF1bHRJbmZvLmlzV1NETEV4Y2VwdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlaUNvbnRleHQuYWRkUmVmZXJlbmNlKGJ1aWxkZXIuZ2V0VHlwZURlY2xhcmF0aW9uKGZhdWx0SW5mby5nZXRCZWFuTmFtZSgpKSwgYXBFbnYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFR5cGVNaXJyb3IgYmVhbiA9IGZhdWx0SW5mby5iZWFuVHlwZU1vbmlrZXIuY3JlYXRlKGFwRW52KTsKLSAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHJlZiA9IHNlaUNvbnRleHQuYWRkUmVmZXJlbmNlKCgoRGVjbGFyZWRUeXBlKWJlYW4pLmdldERlY2xhcmF0aW9uKCksIGFwRW52KTsKLSAgICAgICAgICAgICAgICAgICAgc2VpQ29udGV4dC5hZGRTY2hlbWFFbGVtZW50KGZhdWx0SW5mby5nZXRFbGVtZW50TmFtZSgpLCByZWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9XZWJTZXJ2aWNlVmlzaXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dlYlNlcnZpY2VWaXNpdG9yLmphdmEKaW5kZXggNmM3OGIxNS4uOWVmYTAwNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dlYlNlcnZpY2VWaXNpdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dlYlNlcnZpY2VWaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNjMgKzI1LDI4IEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbjsKIAogCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTW9kaWZpZXI7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLkNsYXNzVHlwZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLkRlY2xhcmVkVHlwZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLkludGVyZmFjZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5SZWZlcmVuY2VUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlZvaWRUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnV0aWwuRGVjbGFyYXRpb25WaXNpdG9yOworaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLio7CitpbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS4qOwogaW1wb3J0IGNvbS5zdW4ubWlycm9yLnV0aWwuU2ltcGxlRGVjbGFyYXRpb25WaXNpdG9yOwogaW1wb3J0IGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbGVyLlJ1bnRpbWVNb2RlbGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlBhcmFtZXRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Qb3J0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlNlcnZpY2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVNpbXBsZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhVHlwZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLkphdmFTaW1wbGVUeXBlQ3JlYXRvcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb24uQW5ub3RhdGlvblByb2Nlc3NvckNvbnRleHQuU0VJQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5XZWJzZXJ2aWNlYXBNZXNzYWdlczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWwuQ2xhc3NOYW1lSW5mbzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQU3R5bGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUFVzZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuU3RhdGVmdWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUnVudGltZU1vZGVsZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CiAKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsKLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7CitpbXBvcnQgamF2YXguandzLio7CiBpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7CiBpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5SZWZlcmVuY2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5hbm5vdGF0aW9uLkFubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbi5Nb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5hbm5vdGF0aW9uLldlYlNlcnZpY2VDb25zdGFudHM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIC8qKgogICoKQEAgLTEyNSwxNSArOTAsMTQgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB2aXNpdEludGVyZmFjZURlY2xhcmF0aW9uKEludGVyZmFjZURlY2xhcmF0aW9uIGQpIHsKLSAgICAgICAgV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gKFdlYlNlcnZpY2UpZC5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgPSBkLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7CiAgICAgICAgIGlmICghc2hvdWxkUHJvY2Vzc1dlYlNlcnZpY2Uod2ViU2VydmljZSwgZCkpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGlmIChidWlsZGVyLmNoZWNrQW5kU2V0UHJvY2Vzc2VkKGQpKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB0eXBlRGVjbCA9IGQ7CiAgICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiAhZW5kcG9pbnRJbnRlcmZhY2VOYW1lLmVxdWFscyhkLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihkLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAuZW5kcG9pbnRpbnRlcmZhY2VzLmRvLm5vdC5tYXRjaCIsIG5ldyBPYmplY3RbXQotICAgICAgICAgICAge2VuZHBvaW50SW50ZXJmYWNlTmFtZSwgZC5nZXRRdWFsaWZpZWROYW1lKCl9KTsKKyAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihkLmdldFBvc2l0aW9uKCksIFdlYnNlcnZpY2VhcE1lc3NhZ2VzLmxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URVJGQUNFU19ET19OT1RfTUFUQ0goZW5kcG9pbnRJbnRlcmZhY2VOYW1lLCBkLmdldFF1YWxpZmllZE5hbWUoKSkpOwogICAgICAgICB9CiAgICAgICAgIHZlcmlmeVNFSUFubm90YXRpb25zKHdlYlNlcnZpY2UsIGQpOwogICAgICAgICBlbmRwb2ludEludGVyZmFjZU5hbWUgPSBkLmdldFF1YWxpZmllZE5hbWUoKTsKQEAgLTE1OCw3ICsxMjIsNyBAQAogICAgICAgICAgICAgU291cmNlUG9zaXRpb24gcG9zID0gcG9zID0gZC5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICAgY2hlY2tGb3JJbnZhbGlkSW1wbEFubm90YXRpb24oZCwgU09BUEJpbmRpbmcuY2xhc3MpOwogICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2UubmFtZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRXJyb3IocG9zLCBBTk5PVEFUSU9OX0VMRU1FTlRfRVJST1IsIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRXJyb3IocG9zLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9FTkRQT0lOVElOVEVGQUNFX1BMVVNfRUxFTUVOVCgibmFtZSIpKTsKICAgICAgICAgICAgIGVuZHBvaW50UmVmZXJlbmNlc0ludGVyZmFjZSA9IHRydWU7CiAgICAgICAgICAgICB2ZXJpZnlJbXBsQW5ub3RhdGlvbnMoZCk7CiAgICAgICAgICAgICBpbnNwZWN0RW5kcG9pbnRJbnRlcmZhY2UoZW5kcG9pbnRJbnRlcmZhY2VOYW1lLCBkKTsKQEAgLTE3NSwxNiArMTM5LDEzIEBACiAKICAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTRUlBbm5vdGF0aW9ucyhXZWJTZXJ2aWNlIHdlYlNlcnZpY2UsIEludGVyZmFjZURlY2xhcmF0aW9uIGQpIHsKICAgICAgICAgaWYgKHdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihkLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlZmFjdG9yeS5lbmRwb2ludGludGVyZmFjZS5vbi5pbnRlcmZhY2UiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2QuZ2V0UXVhbGlmaWVkTmFtZSgpLCB3ZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlKCl9KTsKKyAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihkLmdldFBvc2l0aW9uKCksIFdlYnNlcnZpY2VhcE1lc3NhZ2VzLmxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URVJGQUNFX09OX0lOVEVSRkFDRShkLmdldFF1YWxpZmllZE5hbWUoKSwgd2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdlYlNlcnZpY2Uuc2VydmljZU5hbWUoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihkLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAuaW52YWxpZC5zZWkuYW5ub3RhdGlvbi5lbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsic2VydmljZU5hbWUiLCBkLmdldFF1YWxpZmllZE5hbWUoKX0pOworICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKGQuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5WQUxJRF9TRUlfQU5OT1RBVElPTl9FTEVNRU5UKCJzZXJ2aWNlTmFtZSIsIGQuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdlYlNlcnZpY2UucG9ydE5hbWUoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihkLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAuaW52YWxpZC5zZWkuYW5ub3RhdGlvbi5lbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsicG9ydE5hbWUiLCBkLmdldFF1YWxpZmllZE5hbWUoKX0pOworICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKGQuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5WQUxJRF9TRUlfQU5OT1RBVElPTl9FTEVNRU5UKCJwb3J0TmFtZSIsIGQuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIwMyw4ICsxNjQsNyBAQAogICAgICAgICBPYmplY3QgYW5ub3RhdGlvbiA9IGQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uQ2xhc3MpOwogICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBTb3VyY2VQb3NpdGlvbiBwb3MgPSBkLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uRXJyb3IocG9zLCAid2Vic2VydmljZWFwLmludmFsaWQuc2VpLmFubm90YXRpb24iLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2Fubm90YXRpb25DbGFzcy5nZXROYW1lKCksIGQuZ2V0UXVhbGlmaWVkTmFtZSgpfSk7CisgICAgICAgICAgICBhbm5vdGF0aW9uRXJyb3IocG9zLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9JTlZBTElEX1NFSV9BTk5PVEFUSU9OKGFubm90YXRpb25DbGFzcy5nZXROYW1lKCksIGQuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxMiwyMSArMTcyLDE3IEBACiAgICAgICAgIE9iamVjdCBhbm5vdGF0aW9uID0gZC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25DbGFzcyk7CiAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgIFNvdXJjZVBvc2l0aW9uIHBvcyA9IGQuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgICAgIGFubm90YXRpb25FcnJvcihwb3MsICJ3ZWJzZXJ2aWNlYXAuZW5kcG9pbnRpbnRlZmFjZS5wbHVzLmFubm90YXRpb24iLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFubm90YXRpb25FcnJvcihwb3MsIFdlYnNlcnZpY2VhcE1lc3NhZ2VzLmxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URUZBQ0VfUExVU19BTk5PVEFUSU9OKGFubm90YXRpb25DbGFzcy5nZXROYW1lKCkpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGFubm90YXRpb25FcnJvcihTb3VyY2VQb3NpdGlvbiBwb3MsIFN0cmluZyBrZXksIFN0cmluZyBlbGVtZW50KSB7Ci0gICAgICAgIGFubm90YXRpb25FcnJvcihwb3MsIGtleSwgbmV3IE9iamVjdFtdIHtlbGVtZW50fSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYW5ub3RhdGlvbkVycm9yKFNvdXJjZVBvc2l0aW9uIHBvcywgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotICAgICAgICBidWlsZGVyLm9uRXJyb3IocG9zLCBrZXksIGFyZ3MpOworICAgIHByb3RlY3RlZCB2b2lkIGFubm90YXRpb25FcnJvcihTb3VyY2VQb3NpdGlvbiBwb3MsIExvY2FsaXphYmxlIG1lc3NhZ2UpIHsKKyAgICAgICAgYnVpbGRlci5vbkVycm9yKHBvcywgbWVzc2FnZSk7CiAgICAgfQogCiAKICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVQcm9jZXNzV2ViU2VydmljZShXZWJTZXJ2aWNlIHdlYlNlcnZpY2UsIFR5cGVEZWNsYXJhdGlvbiBkKSB7CisgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAgICAgICAgIHNlaUNvbnRleHQgPSBjb250ZXh0LmdldFNFSUNvbnRleHQoZCk7CiAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBudWxsOwogICAgICAgICBpZiAod2ViU2VydmljZSAhPSBudWxsKQpAQCAtMjM0LDggKzE5MCw3IEBACiAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fCB0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZC5nZXRQYWNrYWdlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwogICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihkLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAubm8ucGFja2FnZS5jbGFzcy5tdXN0LmhhdmUudGFyZ2V0bmFtZXNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ZC5nZXRRdWFsaWZpZWROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoZC5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9OT19QQUNLQUdFX0NMQVNTX01VU1RfSEFWRV9UQVJHRVROQU1FU1BBQ0UoZC5nZXRRdWFsaWZpZWROYW1lKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShkLmdldFBhY2thZ2UoKSk7CiAgICAgICAgIH0KQEAgLTI4NCwxNSArMjM5LDEzIEBACiAgICAgICAgIGlmICghc2FtZVN0eWxlKHNvYXBCaW5kaW5nLnN0eWxlKCksIHNvYXBTdHlsZSkpIHsKICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgaWYgKHB1c2hlZFNPQVBCaW5kaW5nKQotICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihiaW5kaW5nRGVjbC5nZXRQb3NpdGlvbigpLCAid2Vic2VydmljZWFwLm1peGVkLmJpbmRpbmcuc3R5bGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjbGFzc0RlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpfSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKGJpbmRpbmdEZWNsLmdldFBvc2l0aW9uKCksIFdlYnNlcnZpY2VhcE1lc3NhZ2VzLmxvY2FsaXphYmxlV0VCU0VSVklDRUFQX01JWEVEX0JJTkRJTkdfU1RZTEUoY2xhc3NEZWNsLmdldFF1YWxpZmllZE5hbWUoKSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChzb2FwQmluZGluZy5zdHlsZSgpLmVxdWFscyhTT0FQQmluZGluZy5TdHlsZS5SUEMpKSB7CiAgICAgICAgICAgICBzb2FwU3R5bGUgPSBTT0FQU3R5bGUuUlBDOwogICAgICAgICAgICAgd3JhcHBlZCA9IHRydWU7CiAgICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcucGFyYW1ldGVyU3R5bGUoKS5lcXVhbHMoUGFyYW1ldGVyU3R5bGUuQkFSRSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoYmluZGluZ0RlY2wuZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC5ycGMubGl0ZXJhbC5tdXN0Lm5vdC5iZS5iYXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y2xhc3NEZWNsLmdldFF1YWxpZmllZE5hbWUoKX0pOworICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihiaW5kaW5nRGVjbC5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9SUENfTElURVJBTF9NVVNUX05PVF9CRV9CQVJFKGNsYXNzRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICB9IGVsc2UgewpAQCAtMzAzLDggKzI1NiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzb2FwQmluZGluZy51c2UoKS5lcXVhbHMoU09BUEJpbmRpbmcuVXNlLkVOQ09ERUQpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoYmluZGluZ0RlY2wuZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC5ycGMuZW5jb2RlZC5ub3Quc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjbGFzc0RlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpfSk7CisgICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSAicnBjIjsKKyAgICAgICAgICAgIGlmKHNvYXBCaW5kaW5nLnN0eWxlKCkuZXF1YWxzKFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5UKSkKKyAgICAgICAgICAgICAgICBzdHlsZSA9ICJkb2N1bWVudCI7CisgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoYmluZGluZ0RlY2wuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFX0VOQ09ERURfTk9UX1NVUFBPUlRFRChjbGFzc0RlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBzdHlsZSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjaGFuZ2VkIHx8IHNvYXBCaW5kaW5nU3RhY2suZW1wdHkoKSkgewogICAgICAgICAgICAgc29hcEJpbmRpbmdTdGFjay5wdXNoKHNvYXBCaW5kaW5nKTsKQEAgLTM0MSw4ICsyOTYsNyBAQAogICAgIHByb3RlY3RlZCBib29sZWFuIHNob3VsZFByb2Nlc3NXZWJTZXJ2aWNlKFdlYlNlcnZpY2Ugd2ViU2VydmljZSwgSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZikgewogICAgICAgICBoYXNXZWJNZXRob2RzID0gZmFsc2U7CiAgICAgICAgIGlmICh3ZWJTZXJ2aWNlID09IG51bGwpCi0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoaW50Zi5nZXRQb3NpdGlvbigpLCAid2Vic2VydmljZWFwLmVuZHBvaW50aW50ZXJmYWNlLmhhcy5uby53ZWJzZXJ2aWNlLmFubm90YXRpb24iLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2ludGYuZ2V0UXVhbGlmaWVkTmFtZSgpfSk7CisgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoaW50Zi5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9FTkRQT0lOVElOVEVSRkFDRV9IQVNfTk9fV0VCU0VSVklDRV9BTk5PVEFUSU9OKGludGYuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CiAgICAgICAgIGlmIChpc0xlZ2FsU0VJKGludGYpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM3NywxMSArMzMxLDkgQEAKICAgICAgICAgICAgIGlmICh3ZWJNZXRob2QgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmICh3ZWJNZXRob2QuZXhjbHVkZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJNZXRob2Qub3BlcmF0aW9uTmFtZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC5pbnZhbGlkLndlYm1ldGhvZC5lbGVtZW50LndpdGguZXhjbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Im9wZXJhdGlvbk5hbWUiLCBkLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5WQUxJRF9XRUJNRVRIT0RfRUxFTUVOVF9XSVRIX0VYQ0xVREUoIm9wZXJhdGlvbk5hbWUiLCBkLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYk1ldGhvZC5hY3Rpb24oKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IobWV0aG9kLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAuaW52YWxpZC53ZWJtZXRob2QuZWxlbWVudC53aXRoLmV4Y2x1ZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyJhY3Rpb24iLCBkLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5WQUxJRF9XRUJNRVRIT0RfRUxFTUVOVF9XSVRIX0VYQ0xVREUoImFjdGlvbiIsIGQuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKSkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTM5NCw3ICszNDYsNyBAQAogICAgICAgICBidWlsZGVyLmxvZygiUHJvY2Vzc2VkTWV0aG9kcyBJbnRlcmZhY2U6ICIrZCk7CiAgICAgICAgIGhhc1dlYk1ldGhvZHMgPSBmYWxzZTsKICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsIDogZC5nZXRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIG1ldGhvZERlY2wuYWNjZXB0KChEZWNsYXJhdGlvblZpc2l0b3IpdGhpcyk7CisgICAgICAgICAgICBtZXRob2REZWNsLmFjY2VwdCh0aGlzKTsKICAgICAgICAgfQogICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgc3VwZXJUeXBlIDogZC5nZXRTdXBlcmludGVyZmFjZXMoKSkKICAgICAgICAgICAgIHByb2Nlc3NNZXRob2RzKHN1cGVyVHlwZS5nZXREZWNsYXJhdGlvbigpKTsKQEAgLTQwOCw3ICszNjAsNyBAQAogICAgICAgICBpZiAoZC5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MpICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIFN1cGVyIGNsYXNzZXMgbXVzdCBoYXZlIEBXZWJTZXJ2aWNlIGFubm90YXRpb25zIHRvIHBpY2sgdXAgdGhlaXIgbWV0aG9kcwogICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsIDogZC5nZXRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgICAgICBtZXRob2REZWNsLmFjY2VwdCgoRGVjbGFyYXRpb25WaXNpdG9yKXRoaXMpOworICAgICAgICAgICAgICAgIG1ldGhvZERlY2wuYWNjZXB0KHRoaXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChkLmdldFN1cGVyY2xhc3MoKSAhPSBudWxsKSB7CkBAIC00MzIsMTYgKzM4NCwxNSBAQAogICAgICAgICAgICAgaW50VHlwZURlY2wgPSAoSW50ZXJmYWNlRGVjbGFyYXRpb24pYnVpbGRlci5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2VOYW1lKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW50VHlwZURlY2wgPT0gbnVsbCkKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcigid2Vic2VydmljZWFwLmVuZHBvaW50aW50ZXJmYWNlLmNsYXNzLm5vdC5mb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ZW5kcG9pbnRJbnRlcmZhY2VOYW1lfSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRUeXBlRGVjbDsKKyAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihXZWJzZXJ2aWNlYXBNZXNzYWdlcy5XRUJTRVJWSUNFQVBfRU5EUE9JTlRJTlRFUkZBQ0VfQ0xBU1NfTk9UX0ZPVU5EKGVuZHBvaW50SW50ZXJmYWNlTmFtZSkpOworICAgICAgICByZXR1cm4gaW50VHlwZURlY2w7CiAgICAgfQogCiAKICAgICBwcml2YXRlIHZvaWQgaW5zcGVjdEVuZHBvaW50SW50ZXJmYWNlKFN0cmluZyBlbmRwb2ludEludGVyZmFjZU5hbWUsIENsYXNzRGVjbGFyYXRpb24gZCkgewogICAgICAgICBUeXBlRGVjbGFyYXRpb24gaW50VHlwZURlY2wgPSBnZXRFbmRwb2ludEludGVyZmFjZURlY2woZW5kcG9pbnRJbnRlcmZhY2VOYW1lLCBkKTsKICAgICAgICAgaWYgKGludFR5cGVEZWNsICE9IG51bGwpCi0gICAgICAgICAgICBpbnRUeXBlRGVjbC5hY2NlcHQoKERlY2xhcmF0aW9uVmlzaXRvcil0aGlzKTsKKyAgICAgICAgICAgIGludFR5cGVEZWNsLmFjY2VwdCh0aGlzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZERlY2xhcmF0aW9uKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgewpAQCAtNTA3LDI2ICs0NTgsMjUgQEAKIAogCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMZWdhbEltcGxlbWVudGF0aW9uKFdlYlNlcnZpY2Ugd2ViU2VydmljZSwgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2wpIHsKKworICAgICAgICBib29sZWFuIGlzU3RhdGVmdWwgPSBpc1N0YXRlZnVsKGNsYXNzRGVjbCk7CisKICAgICAgICAgQ29sbGVjdGlvbjxNb2RpZmllcj4gbW9kaWZpZXJzID0gY2xhc3NEZWNsLmdldE1vZGlmaWVycygpOwogICAgICAgICBpZiAoIW1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5QVUJMSUMpKXsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihjbGFzc0RlY2wuZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC53ZWJzZXJ2aWNlLmNsYXNzLm5vdC5wdWJsaWMiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NsYXNzRGVjbC5nZXRRdWFsaWZpZWROYW1lKCl9KTsKKyAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihjbGFzc0RlY2wuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9DTEFTU19OT1RfUFVCTElDKGNsYXNzRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuRklOQUwpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoY2xhc3NEZWNsLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAud2Vic2VydmljZS5jbGFzcy5pcy5maW5hbCIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y2xhc3NEZWNsLmdldFF1YWxpZmllZE5hbWUoKX0pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuRklOQUwpICYmICFpc1N0YXRlZnVsKSB7CisgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoY2xhc3NEZWNsLmdldFBvc2l0aW9uKCksIFdlYnNlcnZpY2VhcE1lc3NhZ2VzLmxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfQ0xBU1NfSVNfRklOQUwoY2xhc3NEZWNsLmdldFF1YWxpZmllZE5hbWUoKSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuQUJTVFJBQ1QpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoY2xhc3NEZWNsLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAud2Vic2VydmljZS5jbGFzcy5pcy5hYnN0cmFjdCIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y2xhc3NEZWNsLmdldFF1YWxpZmllZE5hbWUoKX0pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuQUJTVFJBQ1QpICYmICFpc1N0YXRlZnVsKSB7CisgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoY2xhc3NEZWNsLmdldFBvc2l0aW9uKCksIFdlYnNlcnZpY2VhcE1lc3NhZ2VzLmxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfQ0xBU1NfSVNfQUJTVFJBQ1QoY2xhc3NEZWNsLmdldFF1YWxpZmllZE5hbWUoKSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjbGFzc0RlY2wuZ2V0RGVjbGFyaW5nVHlwZSgpICE9IG51bGwgJiYgIW1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5TVEFUSUMpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IoY2xhc3NEZWNsLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAud2Vic2VydmljZS5jbGFzcy5pcy5pbm5lcmNsYXNzLm5vdC5zdGF0aWMiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NsYXNzRGVjbC5nZXRRdWFsaWZpZWROYW1lKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY2xhc3NEZWNsLmdldERlY2xhcmluZ1R5cGUoKSAhPSBudWxsICYmICFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSAmJiAhaXNTdGF0ZWZ1bCkgeworICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKGNsYXNzRGVjbC5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX0NMQVNTX0lTX0lOTkVSQ0xBU1NfTk9UX1NUQVRJQyhjbGFzc0RlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSBmYWxzZTsKICAgICAgICAgZm9yIChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yIDogY2xhc3NEZWNsLmdldENvbnN0cnVjdG9ycygpKSB7CkBAIC01MzYsMTAgKzQ4Niw5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFoYXNEZWZhdWx0Q29uc3RydWN0b3IpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihjbGFzc0RlY2wuZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC53ZWJzZXJ2aWNlLm5vLmRlZmF1bHQuY29uc3RydWN0b3IiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NsYXNzRGVjbC5nZXRRdWFsaWZpZWROYW1lKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWhhc0RlZmF1bHRDb25zdHJ1Y3RvciAmJiAhaXNTdGF0ZWZ1bCkgeworICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKGNsYXNzRGVjbC5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX05PX0RFRkFVTFRfQ09OU1RSVUNUT1IoY2xhc3NEZWNsLmdldFF1YWxpZmllZE5hbWUoKSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICh3ZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlKCkubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgaWYgKCFtZXRob2RzQXJlTGVnYWwoY2xhc3NEZWNsKSkKQEAgLTU1Myw2ICs1MDIsMTAgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGVmdWwoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2wpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzRGVjbC5nZXRBbm5vdGF0aW9uKFN0YXRlZnVsLmNsYXNzKSE9bnVsbDsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc0ltcGxlbWVudHNTRUkoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2wsCiAgICAgICAgICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRmRGVjbCkgewogICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA6IGNsYXNzRGVjbC5nZXRTdXBlcmludGVyZmFjZXMoKSkgewpAQCAtNTY5LDEwICs1MjIsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghaW1wbGVtZW50c01ldGhvZCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC5tZXRob2Qubm90LmltcGxlbWVudGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7aW50ZkRlY2wuZ2V0U2ltcGxlTmFtZSgpLCBjbGFzc0RlY2wuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2R9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUVUSE9EX05PVF9JTVBMRU1FTlRFRChpbnRmRGVjbC5nZXRTaW1wbGVOYW1lKCksIGNsYXNzRGVjbC5nZXRTaW1wbGVOYW1lKCksIG1ldGhvZCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTU5NiwxMyArNTQ3LDExIEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMZWdhbFNFSShJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRmKSB7Ci0gICAgICAgIGZvciAoRmllbGREZWNsYXJhdGlvbiBmaWVsZCA6IGludGYuZ2V0RmllbGRzKCkpIHsKKyAgICAgICAgZm9yIChGaWVsZERlY2xhcmF0aW9uIGZpZWxkIDogaW50Zi5nZXRGaWVsZHMoKSkKICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRDb25zdGFudFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcigid2Vic2VydmljZWFwLnNlaS5jYW5ub3QuY29udGFpbi5jb25zdGFudC52YWx1ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtpbnRmLmdldFF1YWxpZmllZE5hbWUoKSwgZmllbGQuZ2V0U2ltcGxlTmFtZSgpfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKFdlYnNlcnZpY2VhcE1lc3NhZ2VzLldFQlNFUlZJQ0VBUF9TRUlfQ0FOTk9UX0NPTlRBSU5fQ09OU1RBTlRfVkFMVUVTKGludGYuZ2V0UXVhbGlmaWVkTmFtZSgpLCBmaWVsZC5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgaWYgKCFtZXRob2RzQXJlTGVnYWwoaW50ZikpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNjI4LDcgKzU3Nyw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIENsYXNzVHlwZSBzdXBlckNsYXNzID0gY2xhc3NEZWNsLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiAhbWV0aG9kc0FyZUxlZ2FsKHN1cGVyQ2xhc3MuZ2V0RGVjbGFyYXRpb24oKSkpIHsKKworICAgICAgICBpZiAoIXN1cGVyQ2xhc3MuZ2V0RGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKEpBVkFfTEFOR19PQkpFQ1QpICYmIHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiAhbWV0aG9kc0FyZUxlZ2FsKHN1cGVyQ2xhc3MuZ2V0RGVjbGFyYXRpb24oKSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTYzNiwxOSArNTg2LDI1IEBACiAKIAogICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGVnYWxNZXRob2QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wpIHsKLSAgICAgICAgaWYgKGhhc1dlYk1ldGhvZHMgJiYgbWV0aG9kLmdldEFubm90YXRpb24oV2ViTWV0aG9kLmNsYXNzKSA9PSBudWxsKQorICAgICAgICBXZWJNZXRob2Qgd2ViTWV0aG9kID0gbWV0aG9kLmdldEFubm90YXRpb24oV2ViTWV0aG9kLmNsYXNzKTsKKyAgICAgICAgLy9TRUkgY2Fubm90IGhhdmUgbWV0aG9kcyB3aXRoIEBXZWJNZXRob2QoZXhjbHVkZT10cnVlKQorICAgICAgICBpZiAodHlwZURlY2wgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiB3ZWJNZXRob2QgIT0gbnVsbCAmJiB3ZWJNZXRob2QuZXhjbHVkZSgpKQorICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKG1ldGhvZC5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9JTlZBTElEX1NFSV9BTk5PVEFUSU9OX0VMRU1FTlRfRVhDTFVERSgiZXhjbHVkZT10cnVlIiwgdHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKSkpOworCisgICAgICAgIGlmIChoYXNXZWJNZXRob2RzICYmICh3ZWJNZXRob2QgPT0gbnVsbCkpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCFoYXNXZWJNZXRob2RzICYmICh3ZWJNZXRob2QgIT1udWxsKSAmJiB3ZWJNZXRob2QuZXhjbHVkZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogICAgICAgICBpZiAodHlwZURlY2wgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uICYmIG1ldGhvZC5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5BQlNUUkFDVCkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC53ZWJzZXJ2aWNlLm1ldGhvZC5pcy5hYnN0cmFjdCIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7dHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QuZ2V0U2ltcGxlTmFtZSgpfSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9NRVRIT0RfSVNfQUJTVFJBQ1QodHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIWlzTGVnYWxUeXBlKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IobWV0aG9kLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAubWV0aG9kLnJldHVybi50eXBlLmNhbm5vdC5pbXBsZW1lbnQucmVtb3RlIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpfSk7CisgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IobWV0aG9kLmdldFBvc2l0aW9uKCksIFdlYnNlcnZpY2VhcE1lc3NhZ2VzLmxvY2FsaXphYmxlV0VCU0VSVklDRUFQX01FVEhPRF9SRVRVUk5fVFlQRV9DQU5OT1RfSU1QTEVNRU5UX1JFTU9URSh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksCisgICAgICAgICAgICAgICAgbWV0aG9kLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBpc09uZXdheSA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKE9uZXdheS5jbGFzcykgIT0gbnVsbDsKICAgICAgICAgaWYgKGlzT25ld2F5ICYmICFpc1ZhbGlkT25ld2F5TWV0aG9kKG1ldGhvZCwgdHlwZURlY2wpKQpAQCAtNjU4LDggKzYxNCw3IEBACiAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gbWV0aG9kLmdldEFubm90YXRpb24oU09BUEJpbmRpbmcuY2xhc3MpOwogICAgICAgICBpZiAoc29hcEJpbmRpbmcgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHNvYXBCaW5kaW5nLnN0eWxlKCkuZXF1YWxzKFNPQVBCaW5kaW5nLlN0eWxlLlJQQykpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IobWV0aG9kLmdldFBvc2l0aW9uKCksIndlYnNlcnZpY2VhcC5ycGMuc29hcGJpbmRpbmcubm90LmFsbG93ZWQub24ubWV0aG9kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7dHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKX0pOworICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfUlBDX1NPQVBCSU5ESU5HX05PVF9BTExPV0VEX09OX01FVEhPRCh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNjc1LDI3ICs2MzAsMTkgQEAKICAgICAgICAgICAgIGludCBpblBhcmFtcyA9IGdldE1vZGVQYXJhbWV0ZXJDb3VudChtZXRob2QsIFdlYlBhcmFtLk1vZGUuSU4pOwogICAgICAgICAgICAgaW50IG91dFBhcmFtcyA9IGdldE1vZGVQYXJhbWV0ZXJDb3VudChtZXRob2QsIFdlYlBhcmFtLk1vZGUuT1VUKTsKICAgICAgICAgICAgIGlmIChpblBhcmFtcyAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKG1ldGhvZC5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIndlYnNlcnZpY2VhcC5kb2MuYmFyZS5hbmQubm8ub25lLmluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7dHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKX0pOworICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRE9DX0JBUkVfQU5EX05PX09ORV9JTih0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKSBpbnN0YW5jZW9mIFZvaWRUeXBlKSB7CiAgICAgICAgICAgICAgICAgaWYgKG91dFBhcmFtID09IG51bGwgJiYgIWlzT25ld2F5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2Vic2VydmljZWFwLmRvYy5iYXJlLm5vLm91dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpfSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRE9DX0JBUkVfTk9fT1VUKHR5cGVEZWNsLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG91dFBhcmFtcyAhPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghaXNPbmV3YXkgJiYgb3V0UGFyYW1zICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IobWV0aG9kLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJzZXJ2aWNlYXAuZG9jLmJhcmUubm8ucmV0dXJuLmFuZC5uby5vdXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3R5cGVEZWNsLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRE9DX0JBUkVfTk9fUkVUVVJOX0FORF9OT19PVVQodHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKG91dFBhcmFtcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKG91dFBhcmFtLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYnNlcnZpY2VhcC5kb2MuYmFyZS5yZXR1cm4uYW5kLm91dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpfSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihvdXRQYXJhbS5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9ET0NfQkFSRV9SRVRVUk5fQU5EX09VVCh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03MDcsMTIgKzY1NCwxMSBAQAogICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsLAogICAgICAgICAgICAgaW50IHBhcmFtSW5kZXgpIHsKICAgICAgICAgaWYgKCFpc0xlZ2FsVHlwZShwYXJhbS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IocGFyYW0uZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC5tZXRob2QucGFyYW1ldGVyLnR5cGVzLmNhbm5vdC5pbXBsZW1lbnQucmVtb3RlIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZ2V0VHlwZSgpLnRvU3RyaW5nKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IocGFyYW0uZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUVUSE9EX1BBUkFNRVRFUl9UWVBFU19DQU5OT1RfSU1QTEVNRU5UX1JFTU9URSh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksCisgICAgICAgICAgICAgICAgbWV0aG9kLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBwYXJhbS5nZXRTaW1wbGVOYW1lKCksCisgICAgICAgICAgICAgICAgcGFyYW0uZ2V0VHlwZSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBUeXBlTWlycm9yIGhvbGRlclR5cGU7CiAgICAgICAgIGhvbGRlclR5cGUgPSBidWlsZGVyLmdldEhvbGRlclZhbHVlVHlwZShwYXJhbS5nZXRUeXBlKCkpOwpAQCAtNzIyLDE0ICs2NjgsMTQgQEAKICAgICAgICAgICAgIG1vZGUgPSB3ZWJQYXJhbS5tb2RlKCk7CiAKICAgICAgICAgaWYgKGhvbGRlclR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCAmJiAgbW9kZS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5JTikpCi0gICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKHBhcmFtLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAuaG9sZGVyLnBhcmFtZXRlcnMubXVzdC5ub3QuYmUuaW4ub25seSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3R5cGVEZWNsLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCksIHBhcmFtSW5kZXh9KTsKLSAgICAgICAgfSBlbHNlIGlmIChtb2RlICE9IG51bGwgJiYgIW1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4pKSB7Ci0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IocGFyYW0uZ2V0UG9zaXRpb24oKSwgIndlYnNlcnZpY2VhcC5ub24uaW4ucGFyYW1ldGVycy5tdXN0LmJlLmhvbGRlciIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7dHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKSwgcGFyYW1JbmRleH0pOworICAgICAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCAmJiAgbW9kZT09V2ViUGFyYW0uTW9kZS5JTikKKyAgICAgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IocGFyYW0uZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSE9MREVSX1BBUkFNRVRFUlNfTVVTVF9OT1RfQkVfSU5fT05MWSh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpLCBwYXJhbUluZGV4KSk7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSAhPSBudWxsICYmIG1vZGUhPVdlYlBhcmFtLk1vZGUuSU4pIHsKKyAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihwYXJhbS5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9OT05fSU5fUEFSQU1FVEVSU19NVVNUX0JFX0hPTERFUih0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpLCBwYXJhbUluZGV4KSk7CiAgICAgICAgIH0KIAorCisKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC03NDEsMjMgKzY4NywxOCBAQAogICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgaWYgKCEobWV0aG9kLmdldFJldHVyblR5cGUoKSBpbnN0YW5jZW9mIFZvaWRUeXBlKSkgewogICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvciwgY2Fubm90IGJlIE9uZXdheSBhbmQgaGF2ZSBhIHJldHVybiB0eXBlCi0gICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IobWV0aG9kLmdldFBvc2l0aW9uKCksICJ3ZWJzZXJ2aWNlYXAub25ld2F5Lm9wZXJhdGlvbi5jYW5ub3QuaGF2ZS5yZXR1cm4udHlwZSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7dHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKX0pOworICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKG1ldGhvZC5nZXRQb3NpdGlvbigpLCBXZWJzZXJ2aWNlYXBNZXNzYWdlcy5sb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9PTkVXQVlfT1BFUkFUSU9OX0NBTk5PVF9IQVZFX1JFVFVSTl9UWVBFKHR5cGVEZWNsLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gb3V0UGFyYW0gPSBnZXRPdXRQYXJhbWV0ZXIobWV0aG9kKTsKICAgICAgICAgaWYgKG91dFBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihvdXRQYXJhbS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAid2Vic2VydmljZWFwLm9uZXdheS5hbmQub3V0IiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpfSk7CisgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3Iob3V0UGFyYW0uZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfT05FV0FZX0FORF9PVVQodHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKSkpOwogICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWlzRG9jTGl0V3JhcHBlZCgpICYmIHNvYXBTdHlsZS5lcXVhbHMoU09BUFN0eWxlLkRPQ1VNRU5UKSkgewogICAgICAgICAgICAgaW50IGluQ250ID0gZ2V0TW9kZVBhcmFtZXRlckNvdW50KG1ldGhvZCwgV2ViUGFyYW0uTW9kZS5JTik7CiAgICAgICAgICAgICBpZiAoaW5DbnQgIT0gMSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJzZXJ2aWNlYXAub25ld2F5LmFuZC5ub3Qub25lLmluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7dHlwZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLCBtZXRob2QudG9TdHJpbmcoKX0pOworICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihtZXRob2QuZ2V0UG9zaXRpb24oKSwgV2Vic2VydmljZWFwTWVzc2FnZXMubG9jYWxpemFibGVXRUJTRVJWSUNFQVBfT05FV0FZX0FORF9OT1RfT05FX0lOKHR5cGVEZWNsLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03NjUsOCArNzA2LDcgQEAKICAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIHRocm93blR5cGUgOiBtZXRob2QuZ2V0VGhyb3duVHlwZXMoKSkgewogICAgICAgICAgICAgZXhEZWNsID0gKChDbGFzc1R5cGUpdGhyb3duVHlwZSkuZ2V0RGVjbGFyYXRpb24oKTsKICAgICAgICAgICAgIGlmICghYnVpbGRlci5pc1JlbW90ZUV4Y2VwdGlvbihleERlY2wpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKG1ldGhvZC5nZXRQb3NpdGlvbigpLCAid2Vic2VydmljZWFwLm9uZXdheS5vcGVyYXRpb24uY2Fubm90LmRlY2xhcmUuZXhjZXB0aW9ucyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3R5cGVEZWNsLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCksIGV4RGVjbC5nZXRRdWFsaWZpZWROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLm9uRXJyb3IobWV0aG9kLmdldFBvc2l0aW9uKCksIFdlYnNlcnZpY2VhcE1lc3NhZ2VzLmxvY2FsaXphYmxlV0VCU0VSVklDRUFQX09ORVdBWV9PUEVSQVRJT05fQ0FOTk9UX0RFQ0xBUkVfRVhDRVBUSU9OUyh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpLCBleERlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzk1LDEzICs3MzUsMTAgQEAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0VxdWl2YWxlbnRNb2RlcyhXZWJQYXJhbS5Nb2RlIG1vZGUxLCBXZWJQYXJhbS5Nb2RlIG1vZGUyKSB7CiAgICAgICAgIGlmIChtb2RlMS5lcXVhbHMobW9kZTIpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGFzc2VydChtb2RlMS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5JTikgfHwKLSAgICAgICAgICAgICAgICBtb2RlMS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5PVVQpKTsKLSAgICAgICAgaWYgKG1vZGUxLmVxdWFscyhXZWJQYXJhbS5Nb2RlLklOKSAmJgotICAgICAgICAgICAgICAgICEobW9kZTIuZXF1YWxzKFdlYlBhcmFtLk1vZGUuT1VUKSkpCisgICAgICAgIGFzc2VydCBtb2RlMT09V2ViUGFyYW0uTW9kZS5JTiB8fCBtb2RlMT09V2ViUGFyYW0uTW9kZS5PVVQ7CisgICAgICAgIGlmIChtb2RlMT09V2ViUGFyYW0uTW9kZS5JTiAmJiBtb2RlMiE9V2ViUGFyYW0uTW9kZS5PVVQpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKG1vZGUxLmVxdWFscyhXZWJQYXJhbS5Nb2RlLk9VVCkgJiYKLSAgICAgICAgICAgICAgICAhKG1vZGUyLmVxdWFscyhXZWJQYXJhbS5Nb2RlLklOKSkpCisgICAgICAgIGlmIChtb2RlMT09V2ViUGFyYW0uTW9kZS5PVVQgJiYgbW9kZTIhPVdlYlBhcmFtLk1vZGUuSU4pCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTgxNiw3OCArNzUzLDExIEBACiAgICAgICAgIHJldHVybiAhYnVpbGRlci5pc1JlbW90ZSgoKERlY2xhcmVkVHlwZSl0eXBlKS5nZXREZWNsYXJhdGlvbigpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRTY2hlbWFFbGVtZW50cyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIGJvb2xlYW4gaXNEb2NMaXRXcmFwcGVkKSB7Ci0gICAgICAgIGFkZFJldHVyblNjaGVtYUVsZW1lbnQobWV0aG9kLCBpc0RvY0xpdFdyYXBwZWQpOwotICAgICAgICBib29sZWFuIGhhc0luUGFyYW0gPSBmYWxzZTsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbSA6IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIGhhc0luUGFyYW0gfD0gYWRkUGFyYW1TY2hlbWFFbGVtZW50KHBhcmFtLCBtZXRob2QsIGlzRG9jTGl0V3JhcHBlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFoYXNJblBhcmFtICYmIHNvYXBTdHlsZS5lcXVhbHMoU09BUFN0eWxlLkRPQ1VNRU5UKSAmJiAhaXNEb2NMaXRXcmFwcGVkKSB7Ci0gICAgICAgICAgICBRTmFtZSBwYXJhbVFOYW1lID0gbmV3IFFOYW1lKHdzZGxOYW1lc3BhY2UsIG1ldGhvZC5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICAgICAgc2VpQ29udGV4dC5hZGRTY2hlbWFFbGVtZW50KHBhcmFtUU5hbWUsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmV0dXJuU2NoZW1hRWxlbWVudChNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIGJvb2xlYW4gaXNEb2NMaXRXcmFwcGVkKSB7Ci0gICAgICAgIFR5cGVNaXJyb3IgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIFdlYlJlc3VsdCB3ZWJSZXN1bHQgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJSZXN1bHQuY2xhc3MpOwotICAgICAgICBTdHJpbmcgcmVzcG9uc2VOYW1lID0gYnVpbGRlci5nZXRSZXNwb25zZU5hbWUobWV0aG9kLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZU5hbWVzcGFjZSA9IHdzZGxOYW1lc3BhY2U7Ci0gICAgICAgIGJvb2xlYW4gaXNSZXN1bHRIZWFkZXIgPSBmYWxzZTsKLSAgICAgICAgaWYgKHdlYlJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZU5hbWUgPSB3ZWJSZXN1bHQubmFtZSgpLmxlbmd0aCgpID4gMCA/IHdlYlJlc3VsdC5uYW1lKCkgOiByZXNwb25zZU5hbWU7Ci0gICAgICAgICAgICByZXNwb25zZU5hbWVzcGFjZSA9IHdlYlJlc3VsdC50YXJnZXROYW1lc3BhY2UoKS5sZW5ndGgoKSA+IDAgPyB3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCkgOiByZXNwb25zZU5hbWVzcGFjZTsKLSAgICAgICAgICAgIGlzUmVzdWx0SGVhZGVyID0gd2ViUmVzdWx0LmhlYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIHR5cGVOYW1lID0gbmV3IFFOYW1lKHJlc3BvbnNlTmFtZXNwYWNlLCByZXNwb25zZU5hbWUpOwotICAgICAgICBpZiAoIShyZXR1cm5UeXBlIGluc3RhbmNlb2YgVm9pZFR5cGUpICYmCi0gICAgICAgICAgICAgICAgKCFpc0RvY0xpdFdyYXBwZWQgfHwgaXNSZXN1bHRIZWFkZXIpKSB7Ci0gICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gc2VpQ29udGV4dC5hZGRSZWZlcmVuY2UobWV0aG9kKTsKLSAgICAgICAgICAgIGlmICghc29hcFN0eWxlLmVxdWFscyhTT0FQU3R5bGUuUlBDKSkKLSAgICAgICAgICAgICAgICBzZWlDb250ZXh0LmFkZFNjaGVtYUVsZW1lbnQodHlwZU5hbWUsIHJlZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRQYXJhbVNjaGVtYUVsZW1lbnQoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW0sIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgYm9vbGVhbiBpc0RvY0xpdFdyYXBwcGVkKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNJblBhcmFtID0gZmFsc2U7Ci0gICAgICAgIFdlYlBhcmFtIHdlYlBhcmFtID0gcGFyYW0uZ2V0QW5ub3RhdGlvbihXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBwYXJhbS5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwYXJhbU5hbWVzcGFjZSA9IHdzZGxOYW1lc3BhY2U7Ci0gICAgICAgIFR5cGVNaXJyb3IgcGFyYW1UeXBlID0gcGFyYW0uZ2V0VHlwZSgpOwotICAgICAgICBUeXBlTWlycm9yIGhvbGRlclR5cGUgPSBidWlsZGVyLmdldEhvbGRlclZhbHVlVHlwZShwYXJhbVR5cGUpOwotICAgICAgICBib29sZWFuIGlzSGVhZGVyID0gZmFsc2U7Ci0gICAgICAgIGlmIChzb2FwU3R5bGUuZXF1YWxzKFNPQVBTdHlsZS5ET0NVTUVOVCkgJiYgIXdyYXBwZWQpIHsKLSAgICAgICAgICAgIHBhcmFtTmFtZSA9IG1ldGhvZC5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmFtTmFtZSA9IHdlYlBhcmFtLm5hbWUoKSAhPSBudWxsICYmIHdlYlBhcmFtLm5hbWUoKS5sZW5ndGgoKSA+IDAgPyB3ZWJQYXJhbS5uYW1lKCkgOiBwYXJhbU5hbWU7Ci0gICAgICAgICAgICBpc0hlYWRlciA9IHdlYlBhcmFtLmhlYWRlcigpOwotICAgICAgICAgICAgcGFyYW1OYW1lc3BhY2UgPSB3ZWJQYXJhbS50YXJnZXROYW1lc3BhY2UoKS5sZW5ndGgoKSA+IDAgPyB3ZWJQYXJhbS50YXJnZXROYW1lc3BhY2UoKSA6IHBhcmFtTmFtZXNwYWNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChob2xkZXJUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmFtVHlwZSA9IGhvbGRlclR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzSGVhZGVyIHx8IHNvYXBTdHlsZS5lcXVhbHMoU09BUFN0eWxlLkRPQ1VNRU5UKSkgewotICAgICAgICAgICAgaWYgKGlzSGVhZGVyIHx8ICFpc0RvY0xpdFdyYXBwcGVkKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSA9IG5ldyBRTmFtZShwYXJhbU5hbWVzcGFjZSwgcGFyYW1OYW1lKTsKLSAgICAgICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gc2VpQ29udGV4dC5hZGRSZWZlcmVuY2UocGFyYW1UeXBlLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgc2VpQ29udGV4dC5hZGRTY2hlbWFFbGVtZW50KHBhcmFtUU5hbWUsIHJlZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc2VpQ29udGV4dC5hZGRSZWZlcmVuY2UocGFyYW1UeXBlLCBwYXJhbSk7Ci0gICAgICAgIGlmICghaXNIZWFkZXIgJiYgKGhvbGRlclR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICh3ZWJQYXJhbSA9PSBudWxsIHx8ICF3ZWJQYXJhbS5tb2RlKCkuZXF1YWxzKFdlYlBhcmFtLk1vZGUuT1VUKSkpKSB7Ci0gICAgICAgICAgICBpc0luUGFyYW0gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0luUGFyYW07Ci0gICAgfQotCiAgICAgcHJvdGVjdGVkIFBhcmFtZXRlckRlY2xhcmF0aW9uIGdldE91dFBhcmFtZXRlcihNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKICAgICAgICAgV2ViUGFyYW0gd2ViUGFyYW07CiAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW0gOiBtZXRob2QuZ2V0UGFyYW1ldGVycygpKSB7Ci0gICAgICAgICAgICB3ZWJQYXJhbSA9IChXZWJQYXJhbSlwYXJhbS5nZXRBbm5vdGF0aW9uKFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICF3ZWJQYXJhbS5tb2RlKCkuZXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4pKSB7CisgICAgICAgICAgICB3ZWJQYXJhbSA9IHBhcmFtLmdldEFubm90YXRpb24oV2ViUGFyYW0uY2xhc3MpOworICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwgJiYgd2ViUGFyYW0ubW9kZSgpIT1XZWJQYXJhbS5Nb2RlLklOKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vV2ViU2VydmljZVdyYXBwZXJHZW5lcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9XZWJTZXJ2aWNlV3JhcHBlckdlbmVyYXRvci5qYXZhCmluZGV4IGRmZmQ2ODkuLjVmZmQ0ZGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9XZWJTZXJ2aWNlV3JhcHBlckdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvYW5ub3RhdGlvbi9XZWJTZXJ2aWNlV3JhcHBlckdlbmVyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcxICsyMiwzOSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5DbGFzc1R5cGUuQ0xBU1M7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuQ29kZVdyaXRlcjsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQW5ub3RhdGlvbkFycmF5TWVtYmVyOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpBbm5vdGF0aW9uVXNlOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpCbG9jazsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ29kZU1vZGVsOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDb21tZW50UGFydDsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KRGVmaW5lZENsYXNzOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpEb2NDb21tZW50OwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpFeHByOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpGaWVsZFZhcjsKLWltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KTWV0aG9kOwotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpNb2Q7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlR5cGU7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlZhcjsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC4qOwogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLndyaXRlci5Qcm9ncmVzc0NvZGVXcml0ZXI7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCitpbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uKjsKIGltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLkNsYXNzVHlwZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlJlZmVyZW5jZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVm9pZFR5cGU7Ci0KK2ltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLkdlbmVyYXRvckJhc2U7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLkdlbmVyYXRvckNvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuTmFtZXM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5EaXJlY3RvcnlVdGlsOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldlYnNlcnZpY2VhcE1lc3NhZ2VzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC5DbGFzc05hbWVJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkZpbGVyQ29kZVdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5Xc2dlbk9wdGlvbnM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUFN0eWxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuVG9vbFZlcnNpb247CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLmltcGwuTmFtZUNvbnZlcnRlcjsKIAotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7CitpbXBvcnQgamF2YXguandzLio7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi4qOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwogaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7CiBpbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CiAKIAogLyoqCkBAIC0xMjYsMTEgKzk0LDEwIEBACiAgICAgICAgIGlmIChjbSAhPSBudWxsKSB7CiAgICAgICAgICAgICBGaWxlIHNvdXJjZURpciA9IGJ1aWxkZXIuZ2V0U291cmNlRGlyKCk7CiAgICAgICAgICAgICBhc3NlcnQoc291cmNlRGlyICE9IG51bGwpOwotICAgICAgICAgICAgUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52ID0gYnVpbGRlci5nZXRQcm9jZXNzb3JFbnZpcm9ubWVudCgpOworICAgICAgICAgICAgV3NnZW5PcHRpb25zIG9wdGlvbnMgPSBidWlsZGVyLmdldE9wdGlvbnMoKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29kZVdyaXRlciBjdyA9IG5ldyBGaWxlckNvZGVXcml0ZXIoc291cmNlRGlyLCBlbnYpOwotCi0gICAgICAgICAgICAgICAgaWYoZW52LnZlcmJvc2UoKSkKKyAgICAgICAgICAgICAgICBDb2RlV3JpdGVyIGN3ID0gbmV3IEZpbGVyQ29kZVdyaXRlcihzb3VyY2VEaXIsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMudmVyYm9zZSkKICAgICAgICAgICAgICAgICAgICAgY3cgPSBuZXcgUHJvZ3Jlc3NDb2RlV3JpdGVyKGN3LCBTeXN0ZW0ub3V0KTsKICAgICAgICAgICAgICAgICBjbS5idWlsZChjdyk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0xNTgsMTcgKzEyNSwxMiBAQAogICAgICAgICBpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkKICAgICAgICAgICAgIGJlYW5QYWNrYWdlID0gSkFYV1NfUEFDS0FHRV9QRDsKICAgICAgICAgYm9vbGVhbiBiZWFuR2VuZXJhdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKFJlZmVyZW5jZVR5cGUgdGhyb3duVHlwZSA6IG1ldGhvZC5nZXRUaHJvd25UeXBlcygpKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiB0eXBlRGVjbCA9ICgoQ2xhc3NUeXBlKXRocm93blR5cGUpLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcigid2Vic2VydmljZWFwLmNvdWxkLm5vdC5maW5kLnR5cGVkZWNsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3Rocm93blR5cGUudG9TdHJpbmcoKSwgY29udGV4dC5nZXRSb3VuZCgpfSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB0bXAgPSBnZW5lcmF0ZUV4Y2VwdGlvbkJlYW4odHlwZURlY2wsIGJlYW5QYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBiZWFuR2VuZXJhdGVkID0gYmVhbkdlbmVyYXRlZCB8fCB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigibW9kZWxlci5uZXN0ZWRHZW5lcmF0b3JFcnJvciIsZSk7CisgICAgICAgIGZvciAoUmVmZXJlbmNlVHlwZSB0aHJvd25UeXBlIDogbWV0aG9kLmdldFRocm93blR5cGVzKCkpIHsKKyAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoKENsYXNzVHlwZSl0aHJvd25UeXBlKS5nZXREZWNsYXJhdGlvbigpOworICAgICAgICAgICAgaWYgKHR5cGVEZWNsID09IG51bGwpCisgICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKFdlYnNlcnZpY2VhcE1lc3NhZ2VzLldFQlNFUlZJQ0VBUF9DT1VMRF9OT1RfRklORF9UWVBFREVDTCh0aHJvd25UeXBlLnRvU3RyaW5nKCksIGNvbnRleHQuZ2V0Um91bmQoKSkpOworICAgICAgICAgICAgYm9vbGVhbiB0bXAgPSBnZW5lcmF0ZUV4Y2VwdGlvbkJlYW4odHlwZURlY2wsIGJlYW5QYWNrYWdlKTsKKyAgICAgICAgICAgIGJlYW5HZW5lcmF0ZWQgPSBiZWFuR2VuZXJhdGVkIHx8IHRtcDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYmVhbkdlbmVyYXRlZDsKICAgICB9CkBAIC0xNzYsMTAgKzEzOCwxMCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBkdXBsaWNhdGVOYW1lKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIGZvciAoU3RyaW5nIHN0ciA6IHdyYXBwZXJOYW1lcykgewogICAgICAgICAgICAgaWYgKHN0ci5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICB3cmFwcGVyTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVdyYXBwZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgV2ViTWV0aG9kIHdlYk1ldGhvZCkgewpAQCAtMjA3LDEzICsxNjksMTcgQEAKICAgICAgICAgICAgICAgICByZXFOYW1lc3BhY2UgPSByZXFXcmFwcGVyLnRhcmdldE5hbWVzcGFjZSgpOwogICAgICAgICB9CiAgICAgICAgIGJ1aWxkZXIubG9nKCJyZXF1ZXN0V3JhcHBlcjogIityZXF1ZXN0Q2xhc3NOYW1lKTsKKy8vLy8vIGZpeCBmb3Igd3NnZW4gQ1IgNjQ0MjM0NAorICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShEaXJlY3RvcnlVdGlsLmdldE91dHB1dERpcmVjdG9yeUZvcihyZXF1ZXN0Q2xhc3NOYW1lLCBidWlsZGVyLmdldFNvdXJjZURpcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMuc3RyaXBRdWFsaWZpZXIocmVxdWVzdENsYXNzTmFtZSkgKyBHZW5lcmF0b3JDb25zdGFudHMuSkFWQV9TUkNfU1VGRklYKTsKKyAgICAgICAgYnVpbGRlci5nZXRPcHRpb25zKCkuYWRkR2VuZXJhdGVkRmlsZShmaWxlKTsKKy8vLy8vLy8vLy8KICAgICAgICAgYm9vbGVhbiBjYW5PdmVyd3JpdGVSZXF1ZXN0ID0gYnVpbGRlci5jYW5PdmVyV3JpdGVDbGFzcyhyZXF1ZXN0Q2xhc3NOYW1lKTsKICAgICAgICAgaWYgKCFjYW5PdmVyd3JpdGVSZXF1ZXN0KSB7CiAgICAgICAgICAgICBidWlsZGVyLmxvZygiQ2xhc3MgIiArIHJlcXVlc3RDbGFzc05hbWUgKyAiIGV4aXN0cy4gTm90IG92ZXJ3cml0aW5nLiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChkdXBsaWNhdGVOYW1lKHJlcXVlc3RDbGFzc05hbWUpICYmIGNhbk92ZXJ3cml0ZVJlcXVlc3QpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcigid2Vic2VydmljZWFwLm1ldGhvZC5yZXF1ZXN0LndyYXBwZXIuYmVhbi5uYW1lLm5vdC51bmlxdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3R5cGVEZWNsLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kLnRvU3RyaW5nKCl9KTsKKyAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihXZWJzZXJ2aWNlYXBNZXNzYWdlcy5XRUJTRVJWSUNFQVBfTUVUSE9EX1JFUVVFU1RfV1JBUFBFUl9CRUFOX05BTUVfTk9UX1VOSVFVRSh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgcmVzcG9uc2VDbGFzc05hbWUgPSBudWxsOwpAQCAtMjM0LDkgKzIwMCwxMSBAQAogICAgICAgICAgICAgICAgIGJ1aWxkZXIubG9nKCJDbGFzcyAiICsgcmVzcG9uc2VDbGFzc05hbWUgKyAiIGV4aXN0cy4gTm90IG92ZXJ3cml0aW5nLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZU5hbWUocmVzcG9uc2VDbGFzc05hbWUpICYmIGNhbk92ZXJ3cml0ZVJlc3BvbnNlKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKCJ3ZWJzZXJ2aWNlYXAubWV0aG9kLnJlc3BvbnNlLndyYXBwZXIuYmVhbi5uYW1lLm5vdC51bmlxdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpfSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5vbkVycm9yKFdlYnNlcnZpY2VhcE1lc3NhZ2VzLldFQlNFUlZJQ0VBUF9NRVRIT0RfUkVTUE9OU0VfV1JBUFBFUl9CRUFOX05BTUVfTk9UX1VOSVFVRSh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIG1ldGhvZC50b1N0cmluZygpKSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoRGlyZWN0b3J5VXRpbC5nZXRPdXRwdXREaXJlY3RvcnlGb3IocmVzcG9uc2VDbGFzc05hbWUsIGJ1aWxkZXIuZ2V0U291cmNlRGlyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMuc3RyaXBRdWFsaWZpZXIocmVzcG9uc2VDbGFzc05hbWUpICsgR2VuZXJhdG9yQ29uc3RhbnRzLkpBVkFfU1JDX1NVRkZJWCk7CisgICAgICAgICAgICBidWlsZGVyLmdldE9wdGlvbnMoKS5hZGRHZW5lcmF0ZWRGaWxlKGZpbGUpOwogICAgICAgICB9CiAgICAgICAgIEFycmF5TGlzdDxNZW1iZXJJbmZvPiByZXFNZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJJbmZvPigpOwogICAgICAgICBBcnJheUxpc3Q8TWVtYmVySW5mbz4gcmVzTWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVySW5mbz4oKTsKQEAgLTI1Miw4ICsyMjAsNiBAQAogICAgICAgICAgICAgc2VpQ29udGV4dC5zZXRSZXNXcmFwcGVyT3BlcmF0aW9uKG1ldGhvZCwgcmVzV3JhcHBlckluZm8pOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKCFjYW5PdmVyd3JpdGVSZXF1ZXN0ICYmICFjYW5PdmVyd3JpdGVSZXNwb25zZSkgewotLy8gICAgICAgICAgICAgICAgZ2V0V3JhcHBlck1lbWJlcnMocmVxV3JhcHBlckluZm8pOwotLy8gICAgICAgICAgICAgICAgZ2V0V3JhcHBlck1lbWJlcnMocmVzV3JhcHBlckluZm8pOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIApAQCAtMjcxLDcgKzIzNyw3IEBACiAgICAgICAgICAgICB3cml0ZVhtbEVsZW1lbnREZWNsYXJhdGlvbihyZXFDbHMsIHJlcU5hbWUscmVxTmFtZXNwYWNlKTsKICAgICAgICAgICAgIHdyaXRlWG1sRWxlbWVudERlY2xhcmF0aW9uKHJlc0NscywgcmVzTmFtZSwgcmVzTmFtZXNwYWNlKTsKIAotICAgICAgICAgICAgY29sbGVjdE1lbWJlcnMobWV0aG9kLCBvcGVyYXRpb25OYW1lLCB0eXBlTmFtZXNwYWNlLCByZXFNZW1iZXJzLCByZXNNZW1iZXJzKTsKKyAgICAgICAgICAgIGNvbGxlY3RNZW1iZXJzKG1ldGhvZCwgcmVxTWVtYmVycywgcmVzTWVtYmVycyk7CiAKICAgICAgICAgICAgIC8vIFhtbFR5cGUKICAgICAgICAgICAgIHdyaXRlWG1sVHlwZURlY2xhcmF0aW9uKHJlcUNscywgcmVxTmFtZSwgcmVxTmFtZXNwYWNlLCByZXFNZW1iZXJzKTsKQEAgLTI4MCw1NiArMjQ2LDMxIEBACiAgICAgICAgICAgICAvLyBjbGFzcyBtZW1iZXJzCiAgICAgICAgICAgICB3cml0ZU1lbWJlcnMocmVxQ2xzLCByZXFNZW1iZXJzKTsKICAgICAgICAgICAgIHdyaXRlTWVtYmVycyhyZXNDbHMsIHJlc01lbWJlcnMpOworCiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigibW9kZWxlci5uZXN0ZWRHZW5lcmF0b3JFcnJvciIsZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0vKiAgICBwcml2YXRlIHZvaWQgZ2V0V3JhcHBlck1lbWJlcnMoV3JhcHBlckluZm8gd3JhcHBlckluZm8pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAod3JhcHBlckluZm8gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGUgPSBidWlsZGVyLmdldFR5cGVEZWNsYXJhdGlvbih3cmFwcGVySW5mby5nZXRXcmFwcGVyTmFtZSgpKTsKLSAgICAgICAgQ29sbGVjdGlvbjxGaWVsZERlY2xhcmF0aW9uPiBmaWVsZHMgPSB0eXBlLmdldEZpZWxkcygpOwotICAgICAgICBBcnJheUxpc3Q8TWVtYmVySW5mbz4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVySW5mbz4oKTsKLSAgICAgICAgTWVtYmVySW5mbyBtZW1iZXI7Ci0gICAgICAgIGludCBpPTA7Ci0gICAgICAgIGZvciAoRmllbGREZWNsYXJhdGlvbiBmaWVsZCA6IGZpZWxkcykgewotICAgICAgICAgICAgWG1sRWxlbWVudCB4bWxFbGVtZW50ID0gZmllbGQuZ2V0QW5ub3RhdGlvbihYbWxFbGVtZW50LmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSBmaWVsZC5nZXRTaW1wbGVOYW1lKCk7Ci0vLyAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGZpZWxkLmdldFR5cGUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0geG1sRWxlbWVudCAhPSBudWxsID8geG1sRWxlbWVudC5uYW1lKCkgOiBmaWVsZE5hbWU7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gIHhtbEVsZW1lbnQgIT0gbnVsbCA/IHhtbEVsZW1lbnQubmFtZXNwYWNlKCkgOiAiIjsKKyAgICBwcml2YXRlIHZvaWQgY29sbGVjdE1lbWJlcnMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8TWVtYmVySW5mbz4gcmVxdWVzdE1lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxNZW1iZXJJbmZvPiByZXNwb25zZU1lbWJlcnMpIHsKIAotICAgICAgICAgICAgU3RyaW5nIGlkeFN0ciA9IGZpZWxkTmFtZS5zdWJzdHJpbmcoMyk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KGlkeFN0cik7Ci0gICAgICAgICAgICBtZW1iZXIgPSBuZXcgTWVtYmVySW5mbyhpbmRleCwgZmllbGQuZ2V0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKG5hbWVzcGFjZSwgZWxlbWVudE5hbWUpKTsKLSAgICAgICAgICAgIGludCBqPTA7Ci0gICAgICAgICAgICB3aGlsZSAoajxtZW1iZXJzLnNpemUoKSAmJiBtZW1iZXJzLmdldChqKyspLmdldFBhcmFtSW5kZXgoKSA8IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1iZXJzLmFkZChqLCBtZW1iZXIpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoTWVtYmVySW5mbyBtZW1iZXIyIDogbWVtYmVycykgewotICAgICAgICAgICAgd3JhcHBlckluZm8uYWRkTWVtYmVyKG1lbWJlcjIpOwotICAgICAgICB9Ci0gICAgfSovCi0KLSAgICBwcml2YXRlIHZvaWQgY29sbGVjdE1lbWJlcnMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8TWVtYmVySW5mbz4gcmVxdWVzdE1lbWJlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PE1lbWJlckluZm8+IHJlc3BvbnNlTWVtYmVycykgewotCi0gICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBhcEVudiA9IGJ1aWxkZXIuZ2V0QVBFbnYoKTsKICAgICAgICAgV2ViUmVzdWx0IHdlYlJlc3VsdCA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKFdlYlJlc3VsdC5jbGFzcyk7CisgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gamF4YlJlc3BBbm5vdGF0aW9ucyA9IGNvbGxlY3RKQVhCQW5ub3RhdGlvbnMobWV0aG9kKTsKICAgICAgICAgU3RyaW5nIHJlc3BvbnNlRWxlbWVudE5hbWUgPSBSRVRVUk47CisgICAgICAgIFN0cmluZyByZXNwb25zZU5hbWUgPSBSRVRVUk5fVkFMVUU7CiAgICAgICAgIFN0cmluZyByZXNwb25zZU5hbWVzcGFjZSA9IHdyYXBwZWQgPyBFTVRQWV9OQU1FU1BBQ0VfSUQgOiB0eXBlTmFtZXNwYWNlOwogICAgICAgICBib29sZWFuIGlzUmVzdWx0SGVhZGVyID0gZmFsc2U7CiAgICAgICAgIGlmICh3ZWJSZXN1bHQgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHdlYlJlc3VsdC5uYW1lKCkubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgcmVzcG9uc2VFbGVtZW50TmFtZSA9IHdlYlJlc3VsdC5uYW1lKCk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VOYW1lID0gSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9WYXJpYWJsZU5hbWUod2ViUmVzdWx0Lm5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAvL1dlIHdvbnQgaGF2ZSB0byBkbyB0aGlzIGlmIEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvVmFyaWFibGVOYW1lKCkgdGFrZXMKKyAgICAgICAgICAgICAgICAvL2NhcmUgb2YgbWFuZ2xpbmcgamF2YSBpZGVudGlmaWVycworICAgICAgICAgICAgICAgIHJlc3BvbnNlTmFtZSA9IE5hbWVzLmdldEphdmFSZXNlcnZlclZhcmlhbGJlTmFtZShyZXNwb25zZU5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzcG9uc2VOYW1lc3BhY2UgPSB3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAxID8KICAgICAgICAgICAgICAgICB3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCkgOgpAQCAtMzQxLDI3ICsyODIsMjMgQEAKICAgICAgICAgV2ViUGFyYW0gd2ViUGFyYW07CiAgICAgICAgIFR5cGVNaXJyb3IgcGFyYW1UeXBlOwogICAgICAgICBTdHJpbmcgcGFyYW1OYW1lOworCiAgICAgICAgIFN0cmluZyBwYXJhbU5hbWVzcGFjZTsKICAgICAgICAgVHlwZU1pcnJvciBob2xkZXJUeXBlOwogICAgICAgICBpbnQgcGFyYW1JbmRleCA9IC0xOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWV0aG9kOiAiK21ldGhvZC50b1N0cmluZygpKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJldHVyblR5cGU6ICIrIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpOwotCi0vLyAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gYXBFbnYuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKICAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZ2V0U2FmZVR5cGUobWV0aG9kLmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgIFN0cmluZyByZXRUeXBlID0gdHlwZU1pcnJvci50b1N0cmluZygpOworCiAgICAgICAgIGlmICghKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgaW5zdGFuY2VvZiBWb2lkVHlwZSkgJiYgIWlzUmVzdWx0SGVhZGVyKSB7Ci0gICAgICAgICAgICByZXNwb25zZU1lbWJlcnMuYWRkKG5ldyBNZW1iZXJJbmZvKC0xLCB0eXBlTWlycm9yLCBSRVRVUk5fVkFMVUUsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKHJlc3BvbnNlTmFtZXNwYWNlLCByZXNwb25zZUVsZW1lbnROYW1lKSkpOworICAgICAgICAgICAgcmVzcG9uc2VNZW1iZXJzLmFkZChuZXcgTWVtYmVySW5mbyh0eXBlTWlycm9yLCByZXNwb25zZU5hbWUsCisgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHJlc3BvbnNlTmFtZXNwYWNlLCByZXNwb25zZUVsZW1lbnROYW1lKSwgbWV0aG9kLCBqYXhiUmVzcEFubm90YXRpb25zLnRvQXJyYXkobmV3IEFubm90YXRpb25bamF4YlJlc3BBbm5vdGF0aW9ucy5zaXplKCldKSkpOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbSA6IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gamF4YkFubm90YXRpb24gPSBjb2xsZWN0SkFYQkFubm90YXRpb25zKHBhcmFtKTsKICAgICAgICAgICAgIFdlYlBhcmFtLk1vZGUgbW9kZSA9IG51bGw7CiAgICAgICAgICAgICBwYXJhbUluZGV4Kys7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGFyYW0uZ2V0VHlwZSgpOiAiK3BhcmFtLmdldFR5cGUoKSk7CiAgICAgICAgICAgICBob2xkZXJUeXBlID0gYnVpbGRlci5nZXRIb2xkZXJWYWx1ZVR5cGUocGFyYW0uZ2V0VHlwZSgpKTsKICAgICAgICAgICAgIHdlYlBhcmFtID0gcGFyYW0uZ2V0QW5ub3RhdGlvbihXZWJQYXJhbS5jbGFzcyk7Ci0vLyAgICAgICAgICAgIHR5cGVNaXJyb3IgPSBhcEVudi5nZXRUeXBlVXRpbHMoKS5nZXRFcmFzdXJlKHBhcmFtLmdldFR5cGUoKSk7CiAgICAgICAgICAgICB0eXBlTWlycm9yID0gIGdldFNhZmVUeXBlKHBhcmFtLmdldFR5cGUoKSk7CiAgICAgICAgICAgICBwYXJhbVR5cGUgPSB0eXBlTWlycm9yOwogICAgICAgICAgICAgcGFyYW1OYW1lc3BhY2UgPSB3cmFwcGVkID8gRU1UUFlfTkFNRVNQQUNFX0lEIDogdHlwZU5hbWVzcGFjZTsKQEAgLTM3OSw4ICszMTYsMTQgQEAKICAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW0udGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAwKQogICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzcGFjZSA9IHdlYlBhcmFtLnRhcmdldE5hbWVzcGFjZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVtYmVySW5mbyBtZW1JbmZvID0gbmV3IE1lbWJlckluZm8ocGFyYW1JbmRleCwgcGFyYW1UeXBlLCBwYXJhbU5hbWUsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKHBhcmFtTmFtZXNwYWNlLCBwYXJhbU5hbWUpKTsKKworICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvVmFyaWFibGVOYW1lKHBhcmFtTmFtZSk7CisgICAgICAgICAgICAvL1dlIHdvbnQgaGF2ZSB0byBkbyB0aGlzIGlmIEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvVmFyaWFibGVOYW1lKCkgdGFrZXMKKyAgICAgICAgICAgIC8vY2FyZSBvZiBtYW5nbGluZyBqYXZhIGlkZW50aWZpZXJzCisgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBOYW1lcy5nZXRKYXZhUmVzZXJ2ZXJWYXJpYWxiZU5hbWUocHJvcGVydHlOYW1lKTsKKworICAgICAgICAgICAgTWVtYmVySW5mbyBtZW1JbmZvID0gbmV3IE1lbWJlckluZm8ocGFyYW1UeXBlLCBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHBhcmFtTmFtZXNwYWNlLCBwYXJhbU5hbWUpLCBwYXJhbSwgamF4YkFubm90YXRpb24udG9BcnJheShuZXcgQW5ub3RhdGlvbltqYXhiQW5ub3RhdGlvbi5zaXplKCldKSk7CiAgICAgICAgICAgICBpZiAoaG9sZGVyVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCB8fCBtb2RlLmVxdWFscyhXZWJQYXJhbS5Nb2RlLklOT1VUKSkgewogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWVtYmVycy5hZGQobWVtSW5mbyk7CkBAIC0zOTIsMjUgKzMzNSw1OSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBUeXBlTWlycm9yIGdldFNhZmVUeXBlKFR5cGVNaXJyb3IgdHlwZSkgewotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidHlwZTogIit0eXBlKyIgdHlwZS5nZXRDbGFzcygpOiAiK3R5cGUuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIFR5cGVNaXJyb3IgcmV0VHlwZSA9IG1ha2VTYWZlVmlzaXRvci5hcHBseSh0eXBlLCBidWlsZGVyLmdldEFQRW52KCkuZ2V0VHlwZVV0aWxzKCkpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmV0VHlwZTogIityZXRUeXBlKyIgcmV0VHlwZS5nZXRDbGFzcygpOiAiK3JldFR5cGUuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIHJldHVybiByZXRUeXBlOworICAgIHByaXZhdGUgTGlzdDxBbm5vdGF0aW9uPiBjb2xsZWN0SkFYQkFubm90YXRpb25zKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtKSB7CisgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gamF4YkFubm90YXRpb24gPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb24+KCk7CisgICAgICAgIEFubm90YXRpb24gYW5uID0gcGFyYW0uZ2V0QW5ub3RhdGlvbihYbWxBdHRhY2htZW50UmVmLmNsYXNzKTsKKyAgICAgICAgaWYoYW5uICE9IG51bGwpCisgICAgICAgICAgICBqYXhiQW5ub3RhdGlvbi5hZGQoYW5uKTsKKworICAgICAgICBhbm4gPSBwYXJhbS5nZXRBbm5vdGF0aW9uKFhtbE1pbWVUeXBlLmNsYXNzKTsKKyAgICAgICAgaWYoYW5uICE9IG51bGwpCisgICAgICAgICAgICBqYXhiQW5ub3RhdGlvbi5hZGQoYW5uKTsKKworICAgICAgICBhbm4gPSBwYXJhbS5nZXRBbm5vdGF0aW9uKFhtbEphdmFUeXBlQWRhcHRlci5jbGFzcyk7CisgICAgICAgIGlmKGFubiAhPSBudWxsKQorICAgICAgICAgICAgamF4YkFubm90YXRpb24uYWRkKGFubik7CisKKyAgICAgICAgYW5uID0gcGFyYW0uZ2V0QW5ub3RhdGlvbihYbWxMaXN0LmNsYXNzKTsKKyAgICAgICAgaWYoYW5uICE9IG51bGwpCisgICAgICAgICAgICBqYXhiQW5ub3RhdGlvbi5hZGQoYW5uKTsKKyAgICAgICAgcmV0dXJuIGpheGJBbm5vdGF0aW9uOwogICAgIH0KIAotICAgIHByaXZhdGUgSlR5cGUgZ2V0VHlwZShUeXBlTWlycm9yIHR5cGVNaXJyb3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBMaXN0PEFubm90YXRpb24+IGNvbGxlY3RKQVhCQW5ub3RhdGlvbnMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CisgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gamF4YkFubm90YXRpb24gPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb24+KCk7CisgICAgICAgIEFubm90YXRpb24gYW5uID0gbWV0aG9kLmdldEFubm90YXRpb24oWG1sQXR0YWNobWVudFJlZi5jbGFzcyk7CisgICAgICAgIGlmKGFubiAhPSBudWxsKQorICAgICAgICAgICAgamF4YkFubm90YXRpb24uYWRkKGFubik7CisKKyAgICAgICAgYW5uID0gbWV0aG9kLmdldEFubm90YXRpb24oWG1sTWltZVR5cGUuY2xhc3MpOworICAgICAgICBpZihhbm4gIT0gbnVsbCkKKyAgICAgICAgICAgIGpheGJBbm5vdGF0aW9uLmFkZChhbm4pOworCisgICAgICAgIGFubiA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKFhtbEphdmFUeXBlQWRhcHRlci5jbGFzcyk7CisgICAgICAgIGlmKGFubiAhPSBudWxsKQorICAgICAgICAgICAgamF4YkFubm90YXRpb24uYWRkKGFubik7CisKKyAgICAgICAgYW5uID0gbWV0aG9kLmdldEFubm90YXRpb24oWG1sTGlzdC5jbGFzcyk7CisgICAgICAgIGlmKGFubiAhPSBudWxsKQorICAgICAgICAgICAgamF4YkFubm90YXRpb24uYWRkKGFubik7CisgICAgICAgIHJldHVybiBqYXhiQW5ub3RhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIFR5cGVNaXJyb3IgZ2V0U2FmZVR5cGUoVHlwZU1pcnJvciB0eXBlKSB7CisgICAgICAgIHJldHVybiBtYWtlU2FmZVZpc2l0b3IuYXBwbHkodHlwZSwgYnVpbGRlci5nZXRBUEVudigpLmdldFR5cGVVdGlscygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpUeXBlIGdldFR5cGUoVHlwZU1pcnJvciB0eXBlTWlycm9yKSB7CiAgICAgICAgIFN0cmluZyB0eXBlID0gdHlwZU1pcnJvci50b1N0cmluZygpOwotICAgICAgICBKVHlwZSBqVHlwZSA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidHlwZU5hbWU6ICIrdHlwZU5hbWUpOwotICAgICAgICAgICAgalR5cGUgPSBjbS5wYXJzZVR5cGUodHlwZSk7CisgICAgICAgICAgICByZXR1cm4gY20ucGFyc2VUeXBlKHR5cGUpOwogLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInR5cGU6ICIrdHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4galR5cGU7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgalR5cGUgPSBjbS5yZWYodHlwZSk7CisgICAgICAgICAgICByZXR1cm4gY20ucmVmKHR5cGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqVHlwZTsKICAgICB9CiAKICAgICBwcml2YXRlIEFycmF5TGlzdDxNZW1iZXJJbmZvPiBzb3J0TWVtYmVycyhBcnJheUxpc3Q8TWVtYmVySW5mbz4gbWVtYmVycykgewpAQCAtNDIzLDcgKzQwMCw3IEBACiAgICAgICAgIHJldHVybiBzb3J0ZWRNZW1iZXJzOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB3cml0ZU1lbWJlcnMoSkRlZmluZWRDbGFzcyBjbHMsIEFycmF5TGlzdDxNZW1iZXJJbmZvPiBtZW1iZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCB3cml0ZU1lbWJlcnMoSkRlZmluZWRDbGFzcyBjbHMsIEFycmF5TGlzdDxNZW1iZXJJbmZvPiBtZW1iZXJzKSB7CiAgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgZm9yIChNZW1iZXJJbmZvIG1lbUluZm8gOiBtZW1iZXJzKSB7CkBAIC00MzUsMTkgKzQxMiw1NCBAQAogICAgICAgICAgICAgICAgICAgICBKQW5ub3RhdGlvblVzZSB4bWxFbGVtZW50QW5uID0gZmllbGQuYW5ub3RhdGUoWG1sRWxlbWVudC5jbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgIHhtbEVsZW1lbnRBbm4ucGFyYW0oIm5hbWUiLCBlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHhtbEVsZW1lbnRBbm4ucGFyYW0oIm5hbWVzcGFjZSIsIGVsZW1lbnROYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobWVtSW5mby5nZXRQYXJhbVR5cGUoKSBpbnN0YW5jZW9mIEFycmF5VHlwZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxFbGVtZW50QW5uLnBhcmFtKCJuaWxsYWJsZSIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSkFubm90YXRpb25Vc2UgeG1sVmFsdWVBbm5uID0gZmllbGQuYW5ub3RhdGUoWG1sVmFsdWUuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBmaWVsZC5hbm5vdGF0ZShYbWxWYWx1ZS5jbGFzcyk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFubm90YXRlUGFyYW1ldGVyV2l0aEpBWEJBbm5vdGF0aW9ucyhmaWVsZCwgbWVtSW5mby5nZXRKYXhiQW5ub3RhdGlvbnMoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgYWRhcHRlciBpZiBuZWVkZWQKKyAgICAgICAgICAgIFhtbEphdmFUeXBlQWRhcHRlciB4anRhID0gbWVtSW5mby5nZXREZWNsKCkuZ2V0QW5ub3RhdGlvbihYbWxKYXZhVHlwZUFkYXB0ZXIuY2xhc3MpOworICAgICAgICAgICAgaWYoeGp0YSE9bnVsbCkgeworICAgICAgICAgICAgICAgIEpBbm5vdGF0aW9uVXNlIHhqdGFBID0gZmllbGQuYW5ub3RhdGUoWG1sSmF2YVR5cGVBZGFwdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB4anRhLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1pcnJvcmVkVHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHhqdGFBLnBhcmFtKCJ2YWx1ZSIsZ2V0VHlwZShlLmdldFR5cGVNaXJyb3IoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBYbWxKYXZhVHlwZUFkYXB0ZXIudHlwZSgpIGlzIGZvciBwYWNrYWdlIG9ubHkuIE5vIG5lZWQgdG8gY29weS4KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmb3IgKE1lbWJlckluZm8gbWVtSW5mbyA6IG1lbWJlcnMpIHsKLSAgICAgICAgICAgIHdyaXRlTWVtYmVyKGNscywgbWVtSW5mby5nZXRQYXJhbUluZGV4KCksIG1lbUluZm8uZ2V0UGFyYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1JbmZvLmdldFBhcmFtTmFtZSgpLCBtZW1JbmZvLmdldEVsZW1lbnROYW1lKCkpOworICAgICAgICAgICAgd3JpdGVNZW1iZXIoY2xzLCBtZW1JbmZvLmdldFBhcmFtVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtSW5mby5nZXRQYXJhbU5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYW5ub3RhdGVQYXJhbWV0ZXJXaXRoSkFYQkFubm90YXRpb25zKEpGaWVsZFZhciBmaWVsZCwgQW5ub3RhdGlvbltdIGpheGJBbm5vdGF0aW9ucykgeworICAgICAgICBmb3IoQW5ub3RhdGlvbiBhbm4gOiBqYXhiQW5ub3RhdGlvbnMpeworICAgICAgICAgICAgaWYoYW5uIGluc3RhbmNlb2YgWG1sTWltZVR5cGUpeworICAgICAgICAgICAgICAgIEpBbm5vdGF0aW9uVXNlIGpheGJBbm4gPSBmaWVsZC5hbm5vdGF0ZShYbWxNaW1lVHlwZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgamF4YkFubi5wYXJhbSgidmFsdWUiLCAoKFhtbE1pbWVUeXBlKWFubikudmFsdWUoKSk7CisgICAgICAgICAgICB9ZWxzZSBpZihhbm4gaW5zdGFuY2VvZiBYbWxKYXZhVHlwZUFkYXB0ZXIpeworICAgICAgICAgICAgICAgIEpBbm5vdGF0aW9uVXNlIGpheGJBbm4gPSBmaWVsZC5hbm5vdGF0ZShYbWxKYXZhVHlwZUFkYXB0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIFhtbEphdmFUeXBlQWRhcHRlciBqYSA9IChYbWxKYXZhVHlwZUFkYXB0ZXIpIGFubjsKKyAgICAgICAgICAgICAgICBqYXhiQW5uLnBhcmFtKCJ2YWx1ZSIsIGphLnZhbHVlKCkpOworICAgICAgICAgICAgICAgIGpheGJBbm4ucGFyYW0oInR5cGUiLCBqYS50eXBlKCkpOworICAgICAgICAgICAgfWVsc2UgaWYoYW5uIGluc3RhbmNlb2YgWG1sQXR0YWNobWVudFJlZil7CisgICAgICAgICAgICAgICAgZmllbGQuYW5ub3RhdGUoWG1sQXR0YWNobWVudFJlZi5jbGFzcyk7CisgICAgICAgICAgICB9ZWxzZSBpZihhbm4gaW5zdGFuY2VvZiBYbWxMaXN0KXsKKyAgICAgICAgICAgICAgICBmaWVsZC5hbm5vdGF0ZShYbWxMaXN0LmNsYXNzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBKRGVmaW5lZENsYXNzIGdldENNQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuQ2xhc3NUeXBlIHR5cGUpIHsKLSAgICAgICAgSkRlZmluZWRDbGFzcyBjbHMgPSBudWxsOworICAgICAgICBKRGVmaW5lZENsYXNzIGNsczsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGNscyA9IGNtLl9jbGFzcyhjbGFzc05hbWUsIHR5cGUpOwogICAgICAgICB9IGNhdGNoIChjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ2xhc3NBbHJlYWR5RXhpc3RzRXhjZXB0aW9uIGUpewpAQCAtNDU2LDEwICs0NjgsMTAgQEAKICAgICAgICAgcmV0dXJuIGNsczsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVFeGNlcHRpb25CZWFuKENsYXNzRGVjbGFyYXRpb24gdGhyb3duRGVjbCwgU3RyaW5nIGJlYW5QYWNrYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUV4Y2VwdGlvbkJlYW4oQ2xhc3NEZWNsYXJhdGlvbiB0aHJvd25EZWNsLCBTdHJpbmcgYmVhblBhY2thZ2UpIHsKICAgICAgICAgaWYgKGJ1aWxkZXIuaXNSZW1vdGVFeGNlcHRpb24odGhyb3duRGVjbCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBhcEVudiA9IGJ1aWxkZXIuZ2V0QVBFbnYoKTsKKwogICAgICAgICBTdHJpbmcgZXhjZXB0aW9uTmFtZSA9IENsYXNzTmFtZUluZm8uZ2V0TmFtZSh0aHJvd25EZWNsLmdldFF1YWxpZmllZE5hbWUoKSk7CiAgICAgICAgIGlmIChwcm9jZXNzZWRFeGNlcHRpb25zLmNvbnRhaW5zKGV4Y2VwdGlvbk5hbWUpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDY3LDE0ICs0NzksMTYgQEAKICAgICAgICAgV2ViRmF1bHQgd2ViRmF1bHQgPSB0aHJvd25EZWNsLmdldEFubm90YXRpb24oV2ViRmF1bHQuY2xhc3MpOwogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYmVhblBhY2thZ2UrIGV4Y2VwdGlvbk5hbWUgKyBCRUFOOwogCi0gICAgICAgIE1hcDxTdHJpbmcsIFR5cGVNaXJyb3I+IHByb3BlcnR5VG9UeXBlTWFwOwotICAgICAgICBwcm9wZXJ0eVRvVHlwZU1hcCA9IFR5cGVNb2RlbGVyLmdldEV4Y2VwdGlvblByb3BlcnRpZXModGhyb3duRGVjbCk7CisgICAgICAgIFRyZWVNYXA8U3RyaW5nLE1ldGhvZERlY2xhcmF0aW9uPiBwcm9wZXJ0eVRvVHlwZU1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZyxNZXRob2REZWNsYXJhdGlvbj4oKTsKKworICAgICAgICBUeXBlTW9kZWxlci5jb2xsZWN0RXhjZXB0aW9uUHJvcGVydGllcyh0aHJvd25EZWNsLHByb3BlcnR5VG9UeXBlTWFwKTsKKwogICAgICAgICBib29sZWFuIGlzV1NETEV4Y2VwdGlvbiA9IGlzV1NETEV4Y2VwdGlvbihwcm9wZXJ0eVRvVHlwZU1hcCwgdGhyb3duRGVjbCk7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSB0eXBlTmFtZXNwYWNlOwogICAgICAgICBTdHJpbmcgbmFtZSA9IGV4Y2VwdGlvbk5hbWU7CiAgICAgICAgIEZhdWx0SW5mbyBmYXVsdEluZm87CiAgICAgICAgIGlmIChpc1dTRExFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIFR5cGVNaXJyb3IgYmVhblR5cGUgPSAgZ2V0U2FmZVR5cGUocHJvcGVydHlUb1R5cGVNYXAuZ2V0KEZBVUxUX0lORk8pKTsKKyAgICAgICAgICAgIFR5cGVNaXJyb3IgYmVhblR5cGUgPSAgZ2V0U2FmZVR5cGUocHJvcGVydHlUb1R5cGVNYXAuZ2V0KEZBVUxUX0lORk8pLmdldFJldHVyblR5cGUoKSk7CiAgICAgICAgICAgICBmYXVsdEluZm8gPSBuZXcgRmF1bHRJbmZvKFR5cGVNb25pa2VyRmFjdG9yeS5nZXRUeXBlTW9uaWtlcihiZWFuVHlwZSksIHRydWUpOwogICAgICAgICAgICAgbmFtZXNwYWNlID0gd2ViRmF1bHQudGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCk+MCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViRmF1bHQudGFyZ2V0TmFtZXNwYWNlKCkgOiBuYW1lc3BhY2U7CkBAIC00OTcsMTkgKzUxMSwxNCBAQAogICAgICAgICBmYXVsdEluZm8gPSBuZXcgRmF1bHRJbmZvKGNsYXNzTmFtZSwgZmFsc2UpOwogCiAgICAgICAgIGlmIChkdXBsaWNhdGVOYW1lKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcigid2Vic2VydmljZWFwLm1ldGhvZC5leGNlcHRpb24uYmVhbi5uYW1lLm5vdC51bmlxdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3R5cGVEZWNsLmdldFF1YWxpZmllZE5hbWUoKSwgdGhyb3duRGVjbC5nZXRRdWFsaWZpZWROYW1lKCl9KTsKKyAgICAgICAgICAgIGJ1aWxkZXIub25FcnJvcihXZWJzZXJ2aWNlYXBNZXNzYWdlcy5XRUJTRVJWSUNFQVBfTUVUSE9EX0VYQ0VQVElPTl9CRUFOX05BTUVfTk9UX1VOSVFVRSh0eXBlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCksIHRocm93bkRlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBBcnJheUxpc3Q8TWVtYmVySW5mbz4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVySW5mbz4oKTsKLSAgICAgICAgTWVtYmVySW5mbyBtZW1iZXI7Ci0gICAgICAgIFN0cmluZyB0eXBlU3RyaW5nOwotICAgICAgICBUeXBlTWlycm9yIGVyYXN1cmVUeXBlOwotICAgICAgICBUcmVlU2V0PFN0cmluZz4ga2V5cyA9IG5ldyBUcmVlU2V0PFN0cmluZz4ocHJvcGVydHlUb1R5cGVNYXAua2V5U2V0KCkpOwotICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBrZXlzKSB7Ci0gICAgICAgICAgICBUeXBlTWlycm9yIHR5cGUgPSBwcm9wZXJ0eVRvVHlwZU1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgIGVyYXN1cmVUeXBlID0gIGdldFNhZmVUeXBlKHR5cGUpOwotICAgICAgICAgICAgbWVtYmVyID0gbmV3IE1lbWJlckluZm8oLTEwLCBlcmFzdXJlVHlwZSwga2V5LCBudWxsKTsKKyAgICAgICAgZm9yIChTdHJpbmcga2V5IDogcHJvcGVydHlUb1R5cGVNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IHByb3BlcnR5VG9UeXBlTWFwLmdldChrZXkpOworICAgICAgICAgICAgVHlwZU1pcnJvciBlcmFzdXJlVHlwZSA9ICBnZXRTYWZlVHlwZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgIE1lbWJlckluZm8gbWVtYmVyID0gbmV3IE1lbWJlckluZm8oZXJhc3VyZVR5cGUsIGtleSwgbnVsbCwgbWV0aG9kKTsKICAgICAgICAgICAgIG1lbWJlcnMuYWRkKG1lbWJlcik7CiAgICAgICAgIH0KICAgICAgICAgZmF1bHRJbmZvLnNldE1lbWJlcnMobWVtYmVycyk7CkBAIC01NDIsMTcgKzU1MSwxNCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1dTRExFeGNlcHRpb24oTWFwPFN0cmluZywgVHlwZU1pcnJvcj5tYXAsIENsYXNzRGVjbGFyYXRpb24gdGhyb3duRGVjbCkgeworICAgIHByb3RlY3RlZCBib29sZWFuIGlzV1NETEV4Y2VwdGlvbihNYXA8U3RyaW5nLE1ldGhvZERlY2xhcmF0aW9uPiBtYXAsIENsYXNzRGVjbGFyYXRpb24gdGhyb3duRGVjbCkgewogICAgICAgICBXZWJGYXVsdCB3ZWJGYXVsdCA9IHRocm93bkRlY2wuZ2V0QW5ub3RhdGlvbihXZWJGYXVsdC5jbGFzcyk7CiAgICAgICAgIGlmICh3ZWJGYXVsdCA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobWFwLnNpemUoKSAhPSAyIHx8IG1hcC5nZXQoRkFVTFRfSU5GTykgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiAhKG1hcC5zaXplKCkgIT0gMiB8fCBtYXAuZ2V0KEZBVUxUX0lORk8pID09IG51bGwpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB3cml0ZVhtbEVsZW1lbnREZWNsYXJhdGlvbihKRGVmaW5lZENsYXNzIGNscywgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgbmFtZXNwYWNlVXJpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCB3cml0ZVhtbEVsZW1lbnREZWNsYXJhdGlvbihKRGVmaW5lZENsYXNzIGNscywgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgbmFtZXNwYWNlVXJpKSB7CiAKICAgICAgICBpZiAoY2xzID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm47CkBAIC01NjYsNyArNTcyLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgd3JpdGVYbWxUeXBlRGVjbGFyYXRpb24oSkRlZmluZWRDbGFzcyBjbHMsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIG5hbWVzcGFjZVVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PE1lbWJlckluZm8+IG1lbWJlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxNZW1iZXJJbmZvPiBtZW1iZXJzKSB7CiAgICAgICAgIGlmIChjbHMgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgSkFubm90YXRpb25Vc2UgeG1sVHlwZUFubiA9IGNscy5hbm5vdGF0ZShjbS5yZWYoWG1sVHlwZS5jbGFzcykpOwpAQCAtNTgwLDI0ICs1ODYsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB3cml0ZU1lbWJlcihKRGVmaW5lZENsYXNzIGNscywgaW50IHBhcmFtSW5kZXgsIFR5cGVNaXJyb3IgcGFyYW1UeXBlLAotICAgICAgICBTdHJpbmcgcGFyYW1OYW1lLCBRTmFtZSBlbGVtZW50TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVNZW1iZXIoSkRlZmluZWRDbGFzcyBjbHMsIFR5cGVNaXJyb3IgcGFyYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lKSB7CiAKICAgICAgICAgaWYgKGNscyA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBTdHJpbmcgY2FwUHJvcE5hbWUgPSBTdHJpbmdVdGlscy5jYXBpdGFsaXplKHBhcmFtTmFtZSk7CisKKyAgICAgICAgU3RyaW5nIGFjY2Vzc29yTmFtZSA9SkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9Qcm9wZXJ0eU5hbWUocGFyYW1OYW1lKTsKICAgICAgICAgU3RyaW5nIGdldHRlclByZWZpeCA9IHBhcmFtVHlwZS5lcXVhbHMoImJvb2xlYW4iKSB8fCBwYXJhbVR5cGUuZXF1YWxzKCJqYXZhLmxhbmcuQm9vbGVhbiIpID8gImlzIiA6ICJnZXQiOwotICAgICAgICBKTWV0aG9kIG0gPSBudWxsOwotICAgICAgICBKRG9jQ29tbWVudCBtZXRob2REb2MgPSBudWxsOwogICAgICAgICBKVHlwZSBwcm9wVHlwZSA9IGdldFR5cGUocGFyYW1UeXBlKTsKLSAgICAgICAgbSA9IGNscy5tZXRob2QoSk1vZC5QVUJMSUMsIHByb3BUeXBlLCBnZXR0ZXJQcmVmaXgrY2FwUHJvcE5hbWUpOwotICAgICAgICBtZXRob2REb2MgPSBtLmphdmFkb2MoKTsKKyAgICAgICAgSk1ldGhvZCBtID0gY2xzLm1ldGhvZChKTW9kLlBVQkxJQywgcHJvcFR5cGUsIGdldHRlclByZWZpeCsgYWNjZXNzb3JOYW1lKTsKKyAgICAgICAgSkRvY0NvbW1lbnQgbWV0aG9kRG9jID0gbS5qYXZhZG9jKCk7CiAgICAgICAgIEpDb21tZW50UGFydCByZXQgPSBtZXRob2REb2MuYWRkUmV0dXJuKCk7CiAgICAgICAgIHJldC5hZGQoInJldHVybnMgIitwcm9wVHlwZS5uYW1lKCkpOwogICAgICAgICBKQmxvY2sgYm9keSA9IG0uYm9keSgpOwogICAgICAgICBib2R5Ll9yZXR1cm4oIEpFeHByLl90aGlzKCkucmVmKHBhcmFtTmFtZSkgKTsKIAotICAgICAgICBtID0gY2xzLm1ldGhvZChKTW9kLlBVQkxJQywgY20uVk9JRCwgInNldCIrY2FwUHJvcE5hbWUpOworICAgICAgICBtID0gY2xzLm1ldGhvZChKTW9kLlBVQkxJQywgY20uVk9JRCwgInNldCIrYWNjZXNzb3JOYW1lKTsKICAgICAgICAgSlZhciBwYXJhbSA9IG0ucGFyYW0ocHJvcFR5cGUsIHBhcmFtTmFtZSk7CiAgICAgICAgIG1ldGhvZERvYyA9IG0uamF2YWRvYygpOwogICAgICAgICBKQ29tbWVudFBhcnQgcGFydCA9IG1ldGhvZERvYy5hZGRQYXJhbShwYXJhbU5hbWUpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci9hbm5vdGF0aW9uL1dyYXBwZXJJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vV3JhcHBlckluZm8uamF2YQppbmRleCA0M2NlOTI1Li42MzVmNTNiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vV3JhcHBlckluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL2Fubm90YXRpb24vV3JhcHBlckluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxMCArMjQsOCBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbjsKIAotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb24uKjsKIAogLyoqCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL0FjY2Vzc29yRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL0FjY2Vzc29yRWxlbWVudC5qYXZhCmluZGV4IDE5ZWI0ZTIuLmFlZjhmMjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9BY2Nlc3NvckVsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL3dzZGwvQWNjZXNzb3JFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL0NsYXNzTmFtZUFsbG9jYXRvckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9DbGFzc05hbWVBbGxvY2F0b3JJbXBsLmphdmEKaW5kZXggZjNhYjFlMi4uNGY2YzZjZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL0NsYXNzTmFtZUFsbG9jYXRvckltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL3dzZGwvQ2xhc3NOYW1lQWxsb2NhdG9ySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDEzICsyNCwxMSBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5DbGFzc05hbWVBbGxvY2F0b3I7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5DbGFzc05hbWVDb2xsZWN0b3I7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLkNsYXNzTmFtZUFsbG9jYXRvcjsKIAotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL3dzZGwvQ29uc29sZUVycm9yUmVwb3J0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9Db25zb2xlRXJyb3JSZXBvcnRlci5qYXZhCmluZGV4IDI0MGE2ZTkuLmE5NGEwZTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9Db25zb2xlRXJyb3JSZXBvcnRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9Db25zb2xlRXJyb3JSZXBvcnRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDYxICsyNSw0NyBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5FcnJvckxpc3RlbmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5Xc2NvbXBpbGVNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiAKLXB1YmxpYyBjbGFzcyBDb25zb2xlRXJyb3JSZXBvcnRlciBpbXBsZW1lbnRzIEVycm9yTGlzdGVuZXJ7CitwdWJsaWMgY2xhc3MgQ29uc29sZUVycm9yUmVwb3J0ZXIgZXh0ZW5kcyBFcnJvclJlY2VpdmVyIHsKIAotICAgIHByaXZhdGUgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeTsKLSAgICBwcml2YXRlIFByb2Nlc3NvckVudmlyb25tZW50IGVudjsKLSAgICBwcml2YXRlIGJvb2xlYW4gcHJpbnRTdGFja1RyYWNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFcnJvcjsKKyAgICBwcml2YXRlIFByaW50U3RyZWFtIG91dHB1dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWc7CiAKLSAgICBwdWJsaWMgQ29uc29sZUVycm9yUmVwb3J0ZXIoUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52LCBib29sZWFuIHByaW50U3RhY2tUcmFjZSkgewotICAgICAgICB0aGlzLmVudiA9IGVudjsKLSAgICAgICAgdGhpcy5wcmludFN0YWNrVHJhY2UgPSBwcmludFN0YWNrVHJhY2U7Ci0gICAgICAgIG1lc3NhZ2VGYWN0b3J5ID0KLSAgICAgICAgICAgIG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5tb2RlbCIpOworICAgIHB1YmxpYyBDb25zb2xlRXJyb3JSZXBvcnRlcihQcmludFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgdGhpcy5vdXRwdXQgPSBzdHJlYW07CisgICAgfQorCisgICAgcHVibGljIENvbnNvbGVFcnJvclJlcG9ydGVyKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5vdXRwdXQgPSBuZXcgUHJpbnRTdHJlYW0ob3V0cHV0U3RyZWFtKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcigpIHsKICAgICAgICAgcmV0dXJuIGhhc0Vycm9yOwogICAgIH0KIAotICAgIC8vIHdpbGwgYmUgbnVsbCB1bmxlc3Mgc2V0IGluICNlcnJvciBvciAjZmF0YWxFcnJvcgotICAgIC8vVE9ETzogcmVtb3ZlIGl0IGFmdGVyIGVycm9yIGhhbmRsaW5nIGlzIHN0cmFpZ2h0ZW5lZAotICAgIHByaXZhdGUgRXhjZXB0aW9uIGU7Ci0gICAgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpewotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5lID0gZTsKLSAgICAgICAgaWYocHJpbnRTdGFja1RyYWNlKQorICAgICAgICBpZihkZWJ1ZykKICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIGVudi5lcnJvcihtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5zYXhwYXJzZXIuZXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZS5nZXRNZXNzYWdlKCksIGdldExvY2F0aW9uU3RyaW5nKGUpfSkpOworICAgICAgICBoYXNFcnJvciA9IHRydWU7CisgICAgICAgIHByaW50KFdzY29tcGlsZU1lc3NhZ2VzLldTSU1QT1JUX0VSUk9SX01FU1NBR0UoZS5nZXRNZXNzYWdlKCkpLCBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwotICAgICAgICB0aGlzLmUgPSBlOwotICAgICAgICBpZihwcmludFN0YWNrVHJhY2UpCisgICAgICAgIGlmKGRlYnVnKQogICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQotICAgICAgICBlbnYuZXJyb3IobWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuc2F4cGFyc2VyLmV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2UuZ2V0TWVzc2FnZSgpLCBnZXRMb2NhdGlvblN0cmluZyhlKX0pKTsKKyAgICAgICAgaGFzRXJyb3IgPSB0cnVlOworICAgICAgICBwcmludChXc2NvbXBpbGVNZXNzYWdlcy5XU0lNUE9SVF9FUlJPUl9NRVNTQUdFKGUuZ2V0TWVzc2FnZSgpKSwgZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGVudi53YXJuKG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNheHBhcnNlci5leGNlcHRpb24iLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtlLmdldE1lc3NhZ2UoKSwgZ2V0TG9jYXRpb25TdHJpbmcoZSl9KSk7CisgICAgICAgIHByaW50KFdzY29tcGlsZU1lc3NhZ2VzLldTSU1QT1JUX1dBUk5JTkdfTUVTU0FHRShlLmdldE1lc3NhZ2UoKSksIGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODcsMzcgKzczLDE3IEBACiAgICAgICogY2FuIGJlIHNhZmVseSBpZ25vcmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICBlbnYuaW5mbyhtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5zYXhwYXJzZXIuZXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZS5nZXRNZXNzYWdlKCksIGdldExvY2F0aW9uU3RyaW5nKGUpfSkpOworICAgICAgICBwcmludChXc2NvbXBpbGVNZXNzYWdlcy5XU0lNUE9SVF9JTkZPX01FU1NBR0UoZS5nZXRNZXNzYWdlKCkpLCBlKTsKICAgICB9CiAKLSAgICAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBodW1hbiByZWFkYWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAgKiB7QGxpbmsgb3JnLnhtbC5zYXguTG9jYXRvcn0gcGFydCBvZiB0aGUgc3BlY2lmaWVkCi0gICAgKiB7QGxpbmsgU0FYUGFyc2VFeGNlcHRpb259LgotICAgICoKLSAgICAqIEByZXR1cm4gIG5vbi1udWxsIHZhbGlkIG9iamVjdC4KLSAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TG9jYXRpb25TdHJpbmcoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKSB7Ci0gICAgICBpZihlLmdldExpbmVOdW1iZXIoKSE9LTEgfHwgZS5nZXRTeXN0ZW1JZCgpIT1udWxsKSB7Ci0gICAgICAgICAgaW50IGxpbmUgPSBlLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICByZXR1cm4gZm9ybWF0KCJDb25zb2xlRXJyb3JSZXBvcnRlci5MaW5lWE9mWSIsIGxpbmU9PS0xPyI/IjpJbnRlZ2VyLnRvU3RyaW5nKCBsaW5lICksCi0gICAgICAgICAgICAgIGdldFNob3J0TmFtZSggZS5nZXRTeXN0ZW1JZCgpICkgKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIGZvcm1hdCgiQ29uc29sZUVycm9yUmVwb3J0ZXIuVW5rbm93bkxvY2F0aW9uIik7Ci0gICAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHByaW50KFN0cmluZyBtZXNzYWdlLCBTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIG91dHB1dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICBvdXRwdXQucHJpbnRsbihnZXRMb2NhdGlvblN0cmluZyhlKSk7CisgICAgICAgIG91dHB1dC5wcmludGxuKCk7CiAgICAgfQogCi0gICAgLyoqIENvbXB1dGVzIGEgc2hvcnQgbmFtZSBvZiBhIGdpdmVuIFVSTCBmb3IgZGlzcGxheS4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTaG9ydE5hbWUoIFN0cmluZyB1cmwgKSB7Ci0gICAgICAgIGlmKHVybD09bnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmb3JtYXQoIkNvbnNvbGVFcnJvclJlcG9ydGVyLlVua25vd25Mb2NhdGlvbiIpOwotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGZvcm1hdCggU3RyaW5nIHByb3BlcnR5LCBPYmplY3QuLi4gYXJncyApIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLm1vZGVsIikuZ2V0U3RyaW5nKHByb3BlcnR5KTsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsYXJncyk7CisgICAgcHVibGljIHZvaWQgZW5hYmxlRGVidWdnaW5nKCl7CisgICAgICAgIHRoaXMuZGVidWcgPSB0cnVlOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL0pBWEJNb2RlbEJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9KQVhCTW9kZWxCdWlsZGVyLmphdmEKaW5kZXggYjg1ZTAyMS4uODgwZDYzZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL0pBWEJNb2RlbEJ1aWxkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL3dzZGwvSkFYQk1vZGVsQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDUzICsyNCw0NSBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbDsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuRXJyb3JMaXN0ZW5lcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuU2NoZW1hQ29tcGlsZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlhKQzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuVHlwZUFuZEFubm90YXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yT3B0aW9uczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuTW9kZWxJbmZvOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5XU0RMTW9kZWxJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVNpbXBsZVR5cGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhVHlwZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLkpBWEJNYXBwaW5nOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQk1vZGVsOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQlR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5KYXZhU2ltcGxlVHlwZUNyZWF0b3I7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5DbGFzc05hbWVDb2xsZWN0b3I7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkpBWFdTVXRpbHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5BYm9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLldzaW1wb3J0T3B0aW9uczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyLkRPTUZvcmVzdFNjYW5uZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5NZXRhZGF0YUZpbmRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuUzJKSkFYQk1vZGVsOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5TY2hlbWFDb21waWxlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuVHlwZUFuZEFubm90YXRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkxvY2F0b3JJbXBsOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCi0gKiBAYXV0aG9yIEthdGh5IFdhbHNoLCBWaXZlayBQYW5kZXkKKyAqIEBhdXRob3IgIFZpdmVrIFBhbmRleQogICoKICAqIFVzZXMgSkFYQiBYSkMgYXBpcyB0byBidWlsZCBKQVhCTW9kZWwgYW5kIHJlc29sdmVzIHhtbCB0byBqYXZhIHR5cGUgbWFwcGluZyBmcm9tIEpBWEJNb2RlbAogICovCiBwdWJsaWMgY2xhc3MgSkFYQk1vZGVsQnVpbGRlciB7Ci0gICAgcHVibGljIEpBWEJNb2RlbEJ1aWxkZXIoTW9kZWxJbmZvIG1vZGVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIG9wdGlvbnMsIENsYXNzTmFtZUNvbGxlY3RvciBjbGFzc05hbWVDb2xsZWN0b3IsIExpc3QgZWxlbWVudHMpIHsKLSAgICAgICAgX21lc3NhZ2VGYWN0b3J5ID0KLSAgICAgICAgICAgIG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5tb2RlbCIpOwotICAgICAgICBfbW9kZWxJbmZvID0gbW9kZWxJbmZvOwotICAgICAgICBfZW52ID0gKFByb2Nlc3NvckVudmlyb25tZW50KSBtb2RlbEluZm8uZ2V0UGFyZW50KCkuZ2V0RW52aXJvbm1lbnQoKTsKLSAgICAgICAgX2NsYXNzTmFtZUFsbG9jYXRvciA9IG5ldyBDbGFzc05hbWVBbGxvY2F0b3JJbXBsKGNsYXNzTmFtZUNvbGxlY3Rvcik7CiAKLSAgICAgICAgcHJpbnRzdGFja3RyYWNlID0gQm9vbGVhbi52YWx1ZU9mKG9wdGlvbnMuZ2V0UHJvcGVydHkoUHJvY2Vzc29yT3B0aW9ucy5QUklOVF9TVEFDS19UUkFDRV9QUk9QRVJUWSkpOwotICAgICAgICBjb25zb2xlRXJyb3JSZXBvcnRlciA9IG5ldyBDb25zb2xlRXJyb3JSZXBvcnRlcihfZW52LCBmYWxzZSk7Ci0gICAgICAgIGludGVybmFsQnVpbGRKQVhCTW9kZWwoZWxlbWVudHMpOworICAgIHByaXZhdGUgZmluYWwgRXJyb3JSZWNlaXZlciBlcnJSZWNlaXZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdzaW1wb3J0T3B0aW9ucyBvcHRpb25zOworICAgIHByaXZhdGUgZmluYWwgTWV0YWRhdGFGaW5kZXIgZm9yZXN0OworCisgICAgcHVibGljIEpBWEJNb2RlbEJ1aWxkZXIoV3NpbXBvcnRPcHRpb25zIG9wdGlvbnMsIENsYXNzTmFtZUNvbGxlY3RvciBjbGFzc05hbWVDb2xsZWN0b3IsIE1ldGFkYXRhRmluZGVyIGZpbmRlciwgRXJyb3JSZWNlaXZlciBlcnJSZWNlaXZlcikgeworICAgICAgICB0aGlzLl9jbGFzc05hbWVBbGxvY2F0b3IgPSBuZXcgQ2xhc3NOYW1lQWxsb2NhdG9ySW1wbChjbGFzc05hbWVDb2xsZWN0b3IpOworICAgICAgICB0aGlzLmVyclJlY2VpdmVyID0gZXJyUmVjZWl2ZXI7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuZm9yZXN0ID0gZmluZGVyOworCisgICAgICAgIGludGVybmFsQnVpbGRKQVhCTW9kZWwoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTgwLDIyICs3MiwyNiBAQAogICAgICAqIEBzZWUgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyI2J1aWxkTW9kZWwoKQogICAgICAqLwogCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsQnVpbGRKQVhCTW9kZWwoTGlzdCBlbGVtZW50cyl7CisgICAgcHJpdmF0ZSB2b2lkIGludGVybmFsQnVpbGRKQVhCTW9kZWwoKXsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNjaGVtYUNvbXBpbGVyID0gWEpDLmNyZWF0ZVNjaGVtYUNvbXBpbGVyKCk7CisgICAgICAgICAgICBzY2hlbWFDb21waWxlciA9ICBvcHRpb25zLmdldFNjaGVtYUNvbXBpbGVyKCk7CisgICAgICAgICAgICBzY2hlbWFDb21waWxlci5yZXNldFNjaGVtYSgpOworICAgICAgICAgICAgc2NoZW1hQ29tcGlsZXIuc2V0RW50aXR5UmVzb2x2ZXIob3B0aW9ucy5lbnRpdHlSZXNvbHZlcik7CiAgICAgICAgICAgICBzY2hlbWFDb21waWxlci5zZXRDbGFzc05hbWVBbGxvY2F0b3IoX2NsYXNzTmFtZUFsbG9jYXRvcik7Ci0gICAgICAgICAgICBzY2hlbWFDb21waWxlci5zZXRFcnJvckxpc3RlbmVyKGNvbnNvbGVFcnJvclJlcG9ydGVyKTsKLSAgICAgICAgICAgIHNjaGVtYUNvbXBpbGVyLnNldEVudGl0eVJlc29sdmVyKF9tb2RlbEluZm8uZ2V0RW50aXR5UmVzb2x2ZXIoKSk7CisgICAgICAgICAgICBzY2hlbWFDb21waWxlci5zZXRFcnJvckxpc3RlbmVyKGVyclJlY2VpdmVyKTsKICAgICAgICAgICAgIGludCBzY2hlbWFFbGVtZW50Q291bnQgPSAxOwotICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IChFbGVtZW50KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50VVJJKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkID0gbmV3IFN0cmluZyhsb2NhdGlvbiArICIjdHlwZXM/c2NoZW1hIitzY2hlbWFFbGVtZW50Q291bnQrKyk7Ci0gICAgICAgICAgICAgICAgc2NoZW1hQ29tcGlsZXIucGFyc2VTY2hlbWEoc3lzdGVtSWQsc2NoZW1hRWxlbWVudCk7CisKKyAgICAgICAgICAgIGZvciAoRWxlbWVudCBlbGVtZW50IDogZm9yZXN0LmdldElubGluZWRTY2hlbWFFbGVtZW50KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudFVSSSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IGxvY2F0aW9uICsgIiN0eXBlcz9zY2hlbWEiICsgc2NoZW1hRWxlbWVudENvdW50Kys7CisgICAgICAgICAgICAgICAgaWYoZm9yZXN0LmlzTWV4TWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBpbGVyLnBhcnNlU2NoZW1hKHN5c3RlbUlkLGVsZW1lbnQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbmV3IERPTUZvcmVzdFNjYW5uZXIoZm9yZXN0KS5zY2FuKGVsZW1lbnQsc2NoZW1hQ29tcGlsZXIuZ2V0UGFyc2VySGFuZGxlcihzeXN0ZW1JZCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvL2ZlZWQgZXh0ZXJuYWwgamF4YjpiaW5kaW5ncyBmaWxlCi0gICAgICAgICAgICBTZXQ8SW5wdXRTb3VyY2U+IGV4dGVybmFsQmluZGluZ3MgPSAoKFdTRExNb2RlbEluZm8pX21vZGVsSW5mbykuZ2V0SkFYQkJpbmRpbmdzKCk7CisgICAgICAgICAgICBJbnB1dFNvdXJjZVtdIGV4dGVybmFsQmluZGluZ3MgPSBvcHRpb25zLmdldFNjaGVtYUJpbmRpbmdzKCk7CiAgICAgICAgICAgICBpZihleHRlcm5hbEJpbmRpbmdzICE9IG51bGwpewogICAgICAgICAgICAgICAgIGZvcihJbnB1dFNvdXJjZSBqYXhiQmluZGluZyA6IGV4dGVybmFsQmluZGluZ3MpewogICAgICAgICAgICAgICAgICAgICBzY2hlbWFDb21waWxlci5wYXJzZVNjaGVtYShqYXhiQmluZGluZyk7CkBAIC0xMDksMjcgKzEwNSwyNSBAQAogICAgIHB1YmxpYyBKQVhCVHlwZSAgZ2V0SkFYQlR5cGUoUU5hbWUgcW5hbWUpewogICAgICAgICBKQVhCTWFwcGluZyBtYXBwaW5nID0gamF4Yk1vZGVsLmdldChxbmFtZSk7CiAgICAgICAgIGlmIChtYXBwaW5nID09IG51bGwpewotICAgICAgICAgICAgZmFpbCgibW9kZWwuc2NoZW1hLmVsZW1lbnROb3RGb3VuZCIsIG5ldyBPYmplY3RbXXtxbmFtZX0pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLQogICAgICAgICBKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBKYXZhU2ltcGxlVHlwZShtYXBwaW5nLmdldFR5cGUoKSk7Ci0gICAgICAgIEpBWEJUeXBlIHR5cGUgPSAgbmV3IEpBWEJUeXBlKHFuYW1lLCBqYXZhVHlwZSwgbWFwcGluZywgamF4Yk1vZGVsKTsKLSAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIHJldHVybiBuZXcgSkFYQlR5cGUocW5hbWUsIGphdmFUeXBlLCBtYXBwaW5nLCBqYXhiTW9kZWwpOwogICAgIH0KIAogICAgIHB1YmxpYyBUeXBlQW5kQW5ub3RhdGlvbiBnZXRFbGVtZW50VHlwZUFuZEFubihRTmFtZSBxbmFtZSl7CiAgICAgICAgIEpBWEJNYXBwaW5nIG1hcHBpbmcgPSBqYXhiTW9kZWwuZ2V0KHFuYW1lKTsKICAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCl7Ci0gICAgICAgICAgICBmYWlsKCJtb2RlbC5zY2hlbWEuZWxlbWVudE5vdEZvdW5kIiwgbmV3IE9iamVjdFtde3FuYW1lfSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbWFwcGluZy5nZXRUeXBlKCkuZ2V0VHlwZUFubigpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGJpbmQoKXsKLSAgICAgICAgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLkpBWEJNb2RlbCByYXdKYXhiTW9kZWwgPSBzY2hlbWFDb21waWxlci5iaW5kKCk7Ci0gICAgICAgIGlmKGNvbnNvbGVFcnJvclJlcG9ydGVyLmhhc0Vycm9yKCkpewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsRXhjZXB0aW9uKGNvbnNvbGVFcnJvclJlcG9ydGVyLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQorICAgICAgICBTMkpKQVhCTW9kZWwgcmF3SmF4Yk1vZGVsID0gc2NoZW1hQ29tcGlsZXIuYmluZCgpOworICAgICAgICBpZihyYXdKYXhiTW9kZWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEV4Y2VwdGlvbigpOworICAgICAgICBvcHRpb25zLnNldENvZGVNb2RlbChyYXdKYXhiTW9kZWwuZ2VuZXJhdGVDb2RlKG51bGwsIGVyclJlY2VpdmVyKSk7CiAgICAgICAgIGpheGJNb2RlbCA9IG5ldyBKQVhCTW9kZWwocmF3SmF4Yk1vZGVsKTsKICAgICAgICAgamF4Yk1vZGVsLnNldEdlbmVyYXRlZENsYXNzTmFtZXMoX2NsYXNzTmFtZUFsbG9jYXRvci5nZXRKYXhiR2VuZXJhdGVkQ2xhc3NlcygpKTsKICAgICB9CkBAIC0xMzgsMzIgKzEzMiwxMyBAQAogICAgICAgICByZXR1cm4gc2NoZW1hQ29tcGlsZXI7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgZmFpbChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmcpIHsKLSAgICAgICAgdGhyb3cgbmV3IE1vZGVsRXhjZXB0aW9uKGtleSwgYXJnKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBlcnJvcihTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKXsKLSAgICAgICAgX2Vudi5lcnJvcihfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXksIGFyZ3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3YXJuKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgX2Vudi53YXJuKF9tZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSwgYXJncykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluZm9ybShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIF9lbnYuaW5mbyhfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXksIGFyZ3MpKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgSkFYQk1vZGVsIGdldEpBWEJNb2RlbCgpewogICAgICAgICByZXR1cm4gamF4Yk1vZGVsOwogICAgIH0KIAogICAgIHByaXZhdGUgSkFYQk1vZGVsIGpheGJNb2RlbDsKICAgICBwcml2YXRlIFNjaGVtYUNvbXBpbGVyIHNjaGVtYUNvbXBpbGVyOwotICAgIHByaXZhdGUgZmluYWwgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBfbWVzc2FnZUZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNb2RlbEluZm8gX21vZGVsSW5mbzsKLSAgICBwcml2YXRlIGZpbmFsIFByb2Nlc3NvckVudmlyb25tZW50IF9lbnY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHByaW50c3RhY2t0cmFjZTsKICAgICBwcml2YXRlIGZpbmFsIENsYXNzTmFtZUFsbG9jYXRvckltcGwgX2NsYXNzTmFtZUFsbG9jYXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIENvbnNvbGVFcnJvclJlcG9ydGVyIGNvbnNvbGVFcnJvclJlcG9ydGVyOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9jYXRvckltcGwgTlVMTF9MT0NBVE9SID0gbmV3IExvY2F0b3JJbXBsKCk7CisKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9NaW1lSGVscGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL3dzZGwvTWltZUhlbHBlci5qYXZhCmluZGV4IDgwYTE3ZGMuLmJkNjYxMDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9NaW1lSGVscGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL01pbWVIZWxwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxMSArMjQsMTEgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLndzZGw7CiAKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLkphdmFTaW1wbGVUeXBlQ3JlYXRvcjsKKwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLkphdmFTaW1wbGVUeXBlQ3JlYXRvcjsKLQogLyoqCiAgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9Nb2RlbGVyVXRpbHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9Nb2RlbGVyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjlkZmIwCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL01vZGVsZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbDsKKworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5CbG9jazsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVNpbXBsZVR5cGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhU3RydWN0dXJlTWVtYmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVN0cnVjdHVyZVR5cGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhVHlwZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLio7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuTW9kZWxlck1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC5DbGFzc05hbWVJbmZvOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkFib3J0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXJGaWx0ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2VQYXJ0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5TMkpKQVhCTW9kZWw7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlR5cGVBbmRBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBVdGlsaXRpZXMgdG8gYmUgdXNlZCBieSBXU0RMTW9kZWxlcgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKgorICovCitjbGFzcyBNb2RlbGVyVXRpbHMgeworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbmNhc2Ugb2Ygd3JhcHBlciBzdHlsZSBvcGVyYXRpb25zLiBUaGlzIGlzCisgICAgICogZXF1aXZhbGVudCB0byB3cmFwcGVyIHN0eWxlIHNjaGVtYSBjb21wb25lbnQgb3IgSkFYQiBNYXBwaW5nIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXhiVHlwZSBKQVhCVHlwZSBmcm9tIHdoaWNoIGEgSkFYQlN0cnVjdHVyZWQgdHlwZSB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICogQHJldHVybiByZXR1cm5zIEpBWEJTdHJ1Y3R1cmVkIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEpBWEJTdHJ1Y3R1cmVkVHlwZSBjcmVhdGVKQVhCU3RydWN0dXJlVHlwZShKQVhCVHlwZSBqYXhiVHlwZSkgeworICAgICAgICBKQVhCU3RydWN0dXJlZFR5cGUgdHlwZSA9IG5ldyBKQVhCU3RydWN0dXJlZFR5cGUoamF4YlR5cGUpOworICAgICAgICB0eXBlLnNldE5hbWUoamF4YlR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgdHlwZS5zZXRKYXZhVHlwZShqYXhiVHlwZS5nZXRKYXZhVHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdXNlcyBKQVhCU3RydWN0dXJlZCB0eXBlICh3cmFwcGVyIHN0eWxlIG9wZXJhdGlvbnMpIGFuZAorICAgICAqIHVud3JhcHMgaXQgdG8gY3JlYXRlIGxpc3Qgb2YgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIGpheGJUeXBlIGluc3RhbmNlIG9mIEpBWEJUeXBlLCBjb3VsZCBiZSBKQVhCU3RydWN0dXJlZCB0eXBlLgorICAgICAqIEBwYXJhbSBibG9jayBUaGUgQmxvY2sgKGJvZHkvSGVhZGVyL0F0dGFjaG1lbnQpIHRvIHdoaWNoIHRoZSBjcmVhdGVkIFBhcmFtZXRlciBiZWxvbmcuCisgICAgICogQHJldHVybiBsaXN0IG9mIFBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGFyYW1ldGVyPiBjcmVhdGVVbndyYXBwZWRQYXJhbWV0ZXJzKEpBWEJUeXBlIGpheGJUeXBlLAorICAgICAgICAgICAgQmxvY2sgYmxvY2spIHsKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOworICAgICAgICBKQVhCU3RydWN0dXJlZFR5cGUgdHlwZSA9IG51bGw7CisgICAgICAgIGlmICghKGpheGJUeXBlIGluc3RhbmNlb2YgSkFYQlN0cnVjdHVyZWRUeXBlKSkKKyAgICAgICAgICAgIHR5cGUgPSBjcmVhdGVKQVhCU3RydWN0dXJlVHlwZShqYXhiVHlwZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGUgPSAoSkFYQlN0cnVjdHVyZWRUeXBlKSBqYXhiVHlwZTsKKworICAgICAgICBKYXZhU3RydWN0dXJlVHlwZSBqc3QgPSBuZXcgSmF2YVN0cnVjdHVyZVR5cGUoamF4YlR5cGUuZ2V0SmF2YVR5cGUoKQorICAgICAgICAgICAgICAgIC5nZXRSZWFsTmFtZSgpLCB0cnVlLCB0eXBlKTsKKyAgICAgICAgdHlwZS5zZXRKYXZhVHlwZShqc3QpOworICAgICAgICBibG9jay5zZXRUeXBlKHR5cGUpOworICAgICAgICBMaXN0IG1lbWJlckxpc3QgPSBqYXhiVHlwZS5nZXRXcmFwcGVyQ2hpbGRyZW4oKTsKKyAgICAgICAgSXRlcmF0b3IgcHJvcHMgPSBtZW1iZXJMaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChwcm9wcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEpBWEJQcm9wZXJ0eSBwcm9wID0gKEpBWEJQcm9wZXJ0eSkgcHJvcHMubmV4dCgpOworICAgICAgICAgICAgcGFyYW1MaXN0LmFkZChjcmVhdGVVbndyYXBwZWRQYXJhbWV0ZXIocHJvcCwgamF4YlR5cGUsIGJsb2NrLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICBqc3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXJhbUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByb3AKKyAgICAgKiBAcGFyYW0gamF4YlR5cGUKKyAgICAgKiBAcGFyYW0gYmxvY2sKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUGFyYW1ldGVyIGNyZWF0ZVVud3JhcHBlZFBhcmFtZXRlcihKQVhCUHJvcGVydHkgcHJvcCwKKyAgICAgICAgICAgIEpBWEJUeXBlIGpheGJUeXBlLCBCbG9jayBibG9jaywgSkFYQlN0cnVjdHVyZWRUeXBlIHR5cGUsCisgICAgICAgICAgICBKYXZhU3RydWN0dXJlVHlwZSBqc3QpIHsKKyAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPSBwcm9wLmdldEVsZW1lbnROYW1lKCk7CisgICAgICAgIEphdmFUeXBlIGphdmFUeXBlID0gbmV3IEphdmFTaW1wbGVUeXBlKHByb3AuZ2V0VHlwZSgpKTsKKyAgICAgICAgSkFYQkVsZW1lbnRNZW1iZXIgZVR5cGUgPSBuZXcgSkFYQkVsZW1lbnRNZW1iZXIoZWxlbWVudE5hbWUsIGpheGJUeXBlKTsKKyAgICAgICAgSmF2YVN0cnVjdHVyZU1lbWJlciBqc20gPSBuZXcgSmF2YVN0cnVjdHVyZU1lbWJlcihlbGVtZW50TmFtZQorICAgICAgICAgICAgICAgIC5nZXRMb2NhbFBhcnQoKSwgamF2YVR5cGUsIGVUeXBlKTsKKyAgICAgICAgZVR5cGUuc2V0SmF2YVN0cnVjdHVyZU1lbWJlcihqc20pOworICAgICAgICBqc3QuYWRkKGpzbSk7CisgICAgICAgIGVUeXBlLnNldFByb3BlcnR5KHByb3ApOworICAgICAgICB0eXBlLmFkZChlVHlwZSk7CisgICAgICAgIEpBWEJUeXBlIHQgPSBuZXcgSkFYQlR5cGUoZWxlbWVudE5hbWUsIGphdmFUeXBlLCBqYXhiVHlwZQorICAgICAgICAgICAgICAgIC5nZXRKYXhiTWFwcGluZygpLCBqYXhiVHlwZS5nZXRKYXhiTW9kZWwoKSk7CisgICAgICAgIHQuc2V0VW53cmFwcGVkKHRydWUpOworICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gY3JlYXRlUGFyYW1ldGVyKGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpLCB0LCBibG9jayk7CisgICAgICAgIHBhcmFtZXRlci5zZXRFbWJlZGRlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGFyYW1ldGVyPiBjcmVhdGVScGNMaXRQYXJhbWV0ZXJzKE1lc3NhZ2UgbWVzc2FnZSwgQmxvY2sgYmxvY2ssIFMySkpBWEJNb2RlbCBqYXhiTW9kZWwsIEVycm9yUmVjZWl2ZXJGaWx0ZXIgZXJyUmVjZWl2ZXIpeworICAgICAgICBScGNMaXRTdHJ1Y3R1cmUgcnBjU3RydWN0ID0gKFJwY0xpdFN0cnVjdHVyZSlibG9jay5nZXRUeXBlKCk7CisKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKKyAgICAgICAgZm9yKE1lc3NhZ2VQYXJ0IHBhcnQgOiBtZXNzYWdlLmdldFBhcnRzKCkpeworICAgICAgICAgICAgaWYoIU1vZGVsZXJVdGlscy5pc0JvdW5kVG9TT0FQQm9keShwYXJ0KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJ0LmdldERlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgIFR5cGVBbmRBbm5vdGF0aW9uIHR5cGVBbmRBbm4gPSBqYXhiTW9kZWwuZ2V0SmF2YVR5cGUobmFtZSk7CisgICAgICAgICAgICBpZih0eXBlQW5kQW5uID09IG51bGwpeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2dRTmFtZSA9ICJ7IittZXNzYWdlLmdldERlZmluaW5nKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJKCkrIn0iK21lc3NhZ2UuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKHBhcnQuZ2V0TG9jYXRvcigpLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfUlBDTElUX1VOS09XTlNDSEVNQVRZUEUobmFtZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5nZXROYW1lKCksIG1zZ1FOYW1lKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHR5cGVBbmRBbm4uZ2V0VHlwZUNsYXNzKCkuZnVsbE5hbWUoKTsKKyAgICAgICAgICAgIHR5cGUgPSBDbGFzc05hbWVJbmZvLmdldEdlbmVyaWNDbGFzcyh0eXBlKTsKKyAgICAgICAgICAgIFJwY0xpdE1lbWJlciBwYXJhbSA9IG5ldyBScGNMaXRNZW1iZXIobmV3IFFOYW1lKCIiLCBwYXJ0LmdldE5hbWUoKSksIHR5cGUpOworICAgICAgICAgICAgSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgSmF2YVNpbXBsZVR5cGUobmV3IEpBWEJUeXBlQW5kQW5ub3RhdGlvbih0eXBlQW5kQW5uKSk7CisgICAgICAgICAgICBwYXJhbS5zZXRKYXZhVHlwZShqYXZhVHlwZSk7CisgICAgICAgICAgICBycGNTdHJ1Y3QuYWRkUnBjTGl0TWVtYmVyKHBhcmFtKTsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBNb2RlbGVyVXRpbHMuY3JlYXRlUGFyYW1ldGVyKHBhcnQuZ2V0TmFtZSgpLCBwYXJhbSwgYmxvY2spOworICAgICAgICAgICAgcGFyYW1ldGVyLnNldEVtYmVkZGVkKHRydWUpOworICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZm9yIG5vbi13cmFwcGVyIHN0eWxlIG9wZXJhdGlvbnMuIEl0IHJldHVybnMgYSBQYXJhbWV0ZXIgY29uc3RydWN0ZWQKKyAgICAgKiB1c2luZyB0aGUgSkFYQlR5cGUgYW5kIHRoZSBCbG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJ0TmFtZSB0eXBpY2FsbHkgd3NkbDpwYXJ0IG9yIGFueSBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gamF4YlR5cGUgdHlwZSBvZiBQYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gYmxvY2sgQmxvY2sgdG8gd2hpY2ggdGhlIHBhcmFtZXRlciBiZWxvbmdzIHRvCisgICAgICogQHJldHVybiBQYXJhbWV0ZXIgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmFtZXRlciBjcmVhdGVQYXJhbWV0ZXIoU3RyaW5nIHBhcnROYW1lLCBBYnN0cmFjdFR5cGUgamF4YlR5cGUsCisgICAgICAgICAgICBCbG9jayBibG9jaykgeworICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihwYXJ0TmFtZSwgYmxvY2suZ2V0RW50aXR5KCkpOworICAgICAgICBwYXJhbWV0ZXIuc2V0UHJvcGVydHkoTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1BBUkFNX01FU1NBR0VfUEFSVF9OQU1FLAorICAgICAgICAgICAgICAgIHBhcnROYW1lKTsKKyAgICAgICAgcGFyYW1ldGVyLnNldEVtYmVkZGVkKGZhbHNlKTsKKyAgICAgICAgcGFyYW1ldGVyLnNldFR5cGUoamF4YlR5cGUpOworICAgICAgICBwYXJhbWV0ZXIuc2V0VHlwZU5hbWUoamF4YlR5cGUuZ2V0SmF2YVR5cGUoKS5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgcGFyYW1ldGVyLnNldEJsb2NrKGJsb2NrKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgUGFyYW1ldGVyIGZyb20gdGhlIGxpc3Qgb2YgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbU5hbWUKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgICAqIEByZXR1cm4gdGhlIFBhcmFtZXRlciB3aXRoIG5hbWUgcGFyYW1OYW1lIGZyb20gcGFyYW1ldGVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW1OYW1lLCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyl7CisgICAgICAgIGlmKHBhcmFtZXRlcnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBmb3IoUGFyYW1ldGVyIHBhcmFtOiBwYXJhbWV0ZXJzKXsKKyAgICAgICAgICAgIC8vaWYocGFyYW0uZ2V0TmFtZSgpLmVxdWFscygiX3JldHVybiIpICYmIHBhcmFtTmFtZS5lcXVhbHMoInJldHVybiIpIHx8IHBhcmFtLmdldE5hbWUoKS5lcXVhbHMocGFyYW1OYW1lKSkgeworICAgICAgICAgICAgaWYocGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhwYXJhbU5hbWUpKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdHdvIEpBWEJTdHJ1Y3R1cmVzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cnVjdDEKKyAgICAgKiBAcGFyYW0gc3RydWN0MgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdHJ1Y3QxIGFuZCBzdHJ1Y3QyIGFyZSBlcXVpdmFsZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRMaXRlcmFsU3RydWN0dXJlcygKKyAgICAgICAgSkFYQlN0cnVjdHVyZWRUeXBlIHN0cnVjdDEsCisgICAgICAgIEpBWEJTdHJ1Y3R1cmVkVHlwZSBzdHJ1Y3QyKSB7CisgICAgICAgIGlmIChzdHJ1Y3QxLmdldEVsZW1lbnRNZW1iZXJzQ291bnQoKSAhPSBzdHJ1Y3QyLmdldEVsZW1lbnRNZW1iZXJzQ291bnQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgSXRlcmF0b3IgbWVtYmVycyA9IHN0cnVjdDEuZ2V0RWxlbWVudE1lbWJlcnMoKTsKKyAgICAgICAgSkFYQkVsZW1lbnRNZW1iZXIgbWVtYmVyMTsKKyAgICAgICAgSmF2YVN0cnVjdHVyZU1lbWJlciBqYXZhTWVtYmVyMSwgamF2YU1lbWJlcjI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBtZW1iZXJzLmhhc05leHQoKTsgaSsrKSB7CisgICAgICAgICAgICBtZW1iZXIxID0gKEpBWEJFbGVtZW50TWVtYmVyKW1lbWJlcnMubmV4dCgpOworICAgICAgICAgICAgamF2YU1lbWJlcjEgPSBtZW1iZXIxLmdldEphdmFTdHJ1Y3R1cmVNZW1iZXIoKTsKKyAgICAgICAgICAgIGphdmFNZW1iZXIyID0KKyAgICAgICAgICAgICAgICAoKEphdmFTdHJ1Y3R1cmVUeXBlKXN0cnVjdDIuZ2V0SmF2YVR5cGUoKSkuZ2V0TWVtYmVyQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICBtZW1iZXIxLmdldEphdmFTdHJ1Y3R1cmVNZW1iZXIoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKGphdmFNZW1iZXIyLmdldENvbnN0cnVjdG9yUG9zKCkgIT0gaQorICAgICAgICAgICAgICAgIHx8ICFqYXZhTWVtYmVyMS5nZXRUeXBlKCkuZXF1YWxzKGphdmFNZW1iZXIyLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwYXJ0CisgICAgICogQHJldHVybiB0cnVlIGlmIHBhcnQgaXMgYm91bmQgdG8gTWltZSBjb250ZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm91bmRUb01pbWVDb250ZW50KE1lc3NhZ2VQYXJ0IHBhcnQpIHsKKyAgICAgICAgaWYoKHBhcnQgIT0gbnVsbCkgJiYgcGFydC5nZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRLaW5kKCkgPT0gTWVzc2FnZVBhcnQuV1NETF9NSU1FX0JJTkRJTkcpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwYXJ0CisgICAgICogQHJldHVybiB0cnVlIGlmIHBhcnQgaXMgYm91bmQgdG8gU09BUEJvZHkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCb3VuZFRvU09BUEJvZHkoTWVzc2FnZVBhcnQgcGFydCkgeworICAgICAgICBpZigocGFydCAhPSBudWxsKSAmJiBwYXJ0LmdldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudEtpbmQoKSA9PSBNZXNzYWdlUGFydC5TT0FQX0JPRFlfQklORElORykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhcnQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGFydCBpcyBib3VuZCB0byBTT0FQSGVhZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm91bmRUb1NPQVBIZWFkZXIoTWVzc2FnZVBhcnQgcGFydCkgeworICAgICAgICBpZigocGFydCAhPSBudWxsKSAmJiBwYXJ0LmdldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudEtpbmQoKSA9PSBNZXNzYWdlUGFydC5TT0FQX0hFQURFUl9CSU5ESU5HKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmJvdW5kKE1lc3NhZ2VQYXJ0IHBhcnQpIHsKKyAgICAgICAgaWYoKHBhcnQgIT0gbnVsbCkgJiYgcGFydC5nZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRLaW5kKCkgPT0gTWVzc2FnZVBhcnQuUEFSVF9OT1RfQk9VTkRFRCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL1BzZXVkb1NjaGVtYUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9Qc2V1ZG9TY2hlbWFCdWlsZGVyLmphdmEKaW5kZXggMzNhYjhjMi4uZDA5NWM3ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL1BzZXVkb1NjaGVtYUJ1aWxkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL3dzZGwvUHNldWRvU2NoZW1hQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDcwICsyNCwxMDIgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLndzZGw7CiAKLWltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci53c2RsLldTRExNb2RlbGVyQmFzZS4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5Nb2RlbEluZm87Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci53c2RsLldTRExNb2RlbGVyQmFzZS5Qcm9jZXNzU09BUE9wZXJhdGlvbkluZm87CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLk5hbWVzOworaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLndzZGwuV1NETE1vZGVsZXJCYXNlLmdldEV4dGVuc2lvbk9mVHlwZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLldzaW1wb3J0T3B0aW9uczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuamF4d3MuSkFYV1NCaW5kaW5nOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hS2luZHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwotCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUDEyQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQQmluZGluZzsKIGltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2VQYXJ0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5PcGVyYXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LktpbmRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5Qb3J0VHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuUG9ydDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuU2VydmljZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5CaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5qYXh3cy5KQVhXU0JpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuKjsKLQoraW1wb3J0IGphdmEudXRpbC4qOwogCiAKIC8qKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqCiAgKiBCdWlsZHMgYWxsIHBvc3NpYmxlIHBzZXVkbyBzY2hlbWFzIGZvciBhc3luYyBvcGVyYXRpb24gUmVzcG9uc2VCZWFuIHRvIGZlZWQgdG8gWEpDLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CiAgKi8KIHB1YmxpYyBjbGFzcyBQc2V1ZG9TY2hlbWFCdWlsZGVyIHsKIAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nV3JpdGVyIGJ1ZiA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICBwcml2YXRlIGZpbmFsIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNb2RlbEluZm8gbW9kZWxJbmZvOwogICAgIHByaXZhdGUgV1NETE1vZGVsZXIgd3NkbE1vZGVsZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElucHV0U291cmNlPiBzY2hlbWFzID0gbmV3IEFycmF5TGlzdDxJbnB1dFNvdXJjZT4oKTsKICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8UU5hbWUsIFBvcnQ+IGJpbmRpbmdOYW1lVG9Qb3J0TWFwID0gbmV3IEhhc2hNYXA8UU5hbWUsIFBvcnQ+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHczY2VwclNjaGVtYUJpbmRpbmcgPSAiPGJpbmRpbmdzXG4iICsKKyAgICAgICAgICAgICIgIHhtbG5zPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YlwiXG4iICsKKyAgICAgICAgICAgICIgIHhtbG5zOndzYT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ1wiXG4iICsKKyAgICAgICAgICAgICIgIHZlcnNpb249XCIyLjFcIj5cbiIgKworICAgICAgICAgICAgIiAgXG4iICsKKyAgICAgICAgICAgICIgIDxiaW5kaW5ncyBzY2Q9XCJ4LXNjaGVtYTo6d3NhXCIgaWYtZXhpc3RzPVwidHJ1ZVwiPlxuIiArCisgICAgICAgICAgICAiICAgIDxzY2hlbWFCaW5kaW5ncyBtYXA9XCJmYWxzZVwiIC8+XG4iICsKKyAgICAgICAgICAgICIgICAgPGJpbmRpbmdzIHNjZD1cIndzYTpFbmRwb2ludFJlZmVyZW5jZVwiPlxuIiArCisgICAgICAgICAgICAiICAgICAgPGNsYXNzIHJlZj1cImphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VcIi8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC9iaW5kaW5ncz5cbiIgKworICAgICAgICAgICAgIiAgICA8YmluZGluZ3Mgc2NkPVwifndzYTpFbmRwb2ludFJlZmVyZW5jZVR5cGVcIj5cbiIgKworICAgICAgICAgICAgIiAgICAgIDxjbGFzcyByZWY9XCJqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlXCIvPlxuIiArCisgICAgICAgICAgICAiICAgIDwvYmluZGluZ3M+XG4iICsKKyAgICAgICAgICAgICIgIDwvYmluZGluZ3M+XG4iICsKKyAgICAgICAgICAgICI8L2JpbmRpbmdzPiI7CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8SW5wdXRTb3VyY2U+IGJ1aWxkKFdTRExNb2RlbGVyIHdzZGxNb2RlbGVyLCBNb2RlbEluZm8gbW9kZWxJbmZvKSB7Ci0gICAgICAgIFBzZXVkb1NjaGVtYUJ1aWxkZXIgYiA9IG5ldyBQc2V1ZG9TY2hlbWFCdWlsZGVyKHdzZGxNb2RlbGVyLmRvY3VtZW50LCBtb2RlbEluZm8pOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtZW1iZXJTdWJtaXNzaW9uRVBSID0gIjxiaW5kaW5nc1xuIiArCisgICAgICAgICAgICAiICB4bWxucz1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGJcIlxuIiArCisgICAgICAgICAgICAiICB4bWxuczp3c2E9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmdcIlxuIiArCisgICAgICAgICAgICAiICB2ZXJzaW9uPVwiMi4xXCI+XG4iICsKKyAgICAgICAgICAgICIgIFxuIiArCisgICAgICAgICAgICAiICA8YmluZGluZ3Mgc2NkPVwieC1zY2hlbWE6OndzYVwiIGlmLWV4aXN0cz1cInRydWVcIj5cbiIgKworICAgICAgICAgICAgIiAgICA8c2NoZW1hQmluZGluZ3MgbWFwPVwiZmFsc2VcIiAvPlxuIiArCisgICAgICAgICAgICAiICAgIDxiaW5kaW5ncyBzY2Q9XCJ3c2E6RW5kcG9pbnRSZWZlcmVuY2VcIj5cbiIgKworICAgICAgICAgICAgIiAgICAgIDxjbGFzcyByZWY9XCJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlXCIvPlxuIiArCisgICAgICAgICAgICAiICAgIDwvYmluZGluZ3M+XG4iICsKKyAgICAgICAgICAgICIgICAgPGJpbmRpbmdzIHNjZD1cIn53c2E6RW5kcG9pbnRSZWZlcmVuY2VUeXBlXCI+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8Y2xhc3MgcmVmPVwiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLk1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZVwiLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L2JpbmRpbmdzPlxuIiArCisgICAgICAgICAgICAiICA8L2JpbmRpbmdzPlxuIiArCisgICAgICAgICAgICAiPC9iaW5kaW5ncz4iOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIHN5c0lkID0gImh0dHA6Ly9kdW1teS5wc2V1ZG8tc2NoZW1hI3NjaGVtYSI7CisKKyAgICBwcml2YXRlIFdzaW1wb3J0T3B0aW9ucyBvcHRpb25zOworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxJbnB1dFNvdXJjZT4gYnVpbGQoV1NETE1vZGVsZXIgd3NkbE1vZGVsZXIsIFdzaW1wb3J0T3B0aW9ucyBvcHRpb25zLCBFcnJvclJlY2VpdmVyIGVyclJlY2VpdmVyKSB7CisgICAgICAgIFBzZXVkb1NjaGVtYUJ1aWxkZXIgYiA9IG5ldyBQc2V1ZG9TY2hlbWFCdWlsZGVyKHdzZGxNb2RlbGVyLmRvY3VtZW50KTsKICAgICAgICAgYi53c2RsTW9kZWxlciA9IHdzZGxNb2RlbGVyOwotICAgICAgICBKQVhCTW9kZWxCdWlsZGVyIGFuYWx5emVyID0gd3NkbE1vZGVsZXIuZ2V0SkFYQk1vZGVsQnVpbGRlcigpOworICAgICAgICBiLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICBiLmJ1aWxkKCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBiLnNjaGVtYXMuc2l6ZSgpOyBpKyspeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgYi5zY2hlbWFzLnNpemUoKTsgaSsrKXsKICAgICAgICAgICAgIElucHV0U291cmNlIGlzID0gYi5zY2hlbWFzLmdldChpKTsKLSAgICAgICAgICAgIGlzLnNldFN5c3RlbUlkKCJodHRwOi8vZHVtbXkucHNldWRvLXNjaGVtYSNzY2hlbWEiKyhpKzEpKTsKKyAgICAgICAgICAgIGlzLnNldFN5c3RlbUlkKHN5c0lkKyhpICsgMSkpOwogICAgICAgICB9CisgICAgICAgIC8vYWRkIHczYyBFUFIgYmluZGluZworICAgICAgICBpZighKG9wdGlvbnMubm9BZGRyZXNzaW5nQmJpbmRpbmcgJiYgb3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSkpeworICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHczY2VwclNjaGVtYUJpbmRpbmcuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgaXMuc2V0U3lzdGVtSWQoc3lzSWQrKCsraSArMSkpOworICAgICAgICAgICAgYi5zY2hlbWFzLmFkZChpcyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vVE9ETzogdW5jb21tZW50IGFmdGVyIEpBWEIgZml4ZXMgdGhlIGlzc3VlIHJlbGF0ZWQgdG8gcGFzc2luZyBtdWx0aXBsZXMgb2Ygc3VjaCBiaW5kaW5ncworICAgICAgICAvL2FkZCBtZW1iZXIgc3VibWlzc2lvbiBFUFIgYmluZGluZworLy8gICAgICAgIElucHV0U291cmNlIGlzMSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obWVtYmVyU3VibWlzc2lvbkVQUi5nZXRCeXRlcygpKSk7CisvLyAgICAgICAgaXMxLnNldFN5c3RlbUlkKHN5c0lkKygrK2kgKyAxKSk7CisvLyAgICAgICAgYi5zY2hlbWFzLmFkZChpczEpOworCiAgICAgICAgIHJldHVybiBiLnNjaGVtYXM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQc2V1ZG9TY2hlbWFCdWlsZGVyKFdTRExEb2N1bWVudCBfd3NkbCwgTW9kZWxJbmZvIF9tb2RlbEluZm8pIHsKKworICAgIHByaXZhdGUgUHNldWRvU2NoZW1hQnVpbGRlcihXU0RMRG9jdW1lbnQgX3dzZGwpIHsKICAgICAgICAgdGhpcy53c2RsRG9jdW1lbnQgPSBfd3NkbDsKLSAgICAgICAgdGhpcy5tb2RlbEluZm8gPSBfbW9kZWxJbmZvOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBidWlsZCgpIHsKQEAgLTEyOCw5ICsxNjAsNiBAQAogCiAgICAgICAgIGZvcihJdGVyYXRvciBpdHI9YmluZGluZy5vcGVyYXRpb25zKCk7IGl0ci5oYXNOZXh0KCk7KXsKICAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKWl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPQotICAgICAgICAgICAgKFNPQVBPcGVyYXRpb24pZ2V0RXh0ZW5zaW9uT2ZUeXBlKGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgU09BUE9wZXJhdGlvbi5jbGFzcyk7CiAKICAgICAgICAgICAgIC8vIGdldCBvbmx5IHRoZSBib3VuZGVkIG9wZXJhdGlvbnMKICAgICAgICAgICAgIFNldCBib3VuZGVkT3BzID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9uc05hbWVkKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKTsKQEAgLTEzOSw4ICsxNjgsNiBAQAogICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pYm91bmRlZE9wcy5pdGVyYXRvcigpLm5leHQoKTsKIAogICAgICAgICAgICAgLy8gTm8gcHNldWRvIHNjaGVtYSByZXF1aXJlZCBmb3IgZG9jL2xpdAotICAgICAgICAgICAgU09BUFN0eWxlIGJpbmRpbmdTdHlsZSA9IHNvYXBCaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBTT0FQU3R5bGUgb3BlcmF0aW9uU3R5bGUgPSAoc29hcE9wZXJhdGlvbiAhPSBudWxsKSA/IHNvYXBPcGVyYXRpb24uZ2V0U3R5bGUoKSA6IGJpbmRpbmdTdHlsZTsKICAgICAgICAgICAgIGlmKHdzZGxNb2RlbGVyLmlzQXN5bmMocG9ydFR5cGUsIG9wZXJhdGlvbikpewogICAgICAgICAgICAgICAgIGJ1aWxkQXN5bmMocG9ydFR5cGUsIG9wZXJhdGlvbiwgYmluZGluZ09wZXJhdGlvbik7CiAgICAgICAgICAgICB9CkBAIC0xNjIsNyArMTg5LDcgQEAKICAgICAgICAgaWYob3V0cHV0TWVzc2FnZSAhPSBudWxsKXsKICAgICAgICAgICAgIExpc3Q8TWVzc2FnZVBhcnQ+IGFsbFBhcnRzID0gbmV3IEFycmF5TGlzdDxNZXNzYWdlUGFydD4ob3V0cHV0TWVzc2FnZS5nZXRQYXJ0cygpKTsKICAgICAgICAgICAgIGlmKGFsbFBhcnRzLnNpemUoKSA+IDEpCi0gICAgICAgICAgICAgICAgYnVpbGQoZ2V0T3BlcmF0aW9uTmFtZShwb3J0VHlwZSwgb3BlcmF0aW9uTmFtZSwgYmluZGluZ09wZXJhdGlvbi5nZXRPdXRwdXQoKSksIGFsbFBhcnRzKTsKKyAgICAgICAgICAgICAgICBidWlsZChnZXRPcGVyYXRpb25OYW1lKG9wZXJhdGlvbk5hbWUpLCBhbGxQYXJ0cyk7CiAgICAgICAgIH0KIAogICAgIH0KQEAgLTE3MSw3ICsxOTgsNyBAQAogICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NDdXN0b21pemF0aW9uID0gKEpBWFdTQmluZGluZylnZXRFeHRlbnNpb25PZlR5cGUob3BlcmF0aW9uLCBKQVhXU0JpbmRpbmcuY2xhc3MpOwogICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IChqYXh3c0N1c3RvbWl6YXRpb24gIT0gbnVsbCk/KChqYXh3c0N1c3RvbWl6YXRpb24uZ2V0TWV0aG9kTmFtZSgpICE9IG51bGwpP2pheHdzQ3VzdG9taXphdGlvbi5nZXRNZXRob2ROYW1lKCkuZ2V0TmFtZSgpOm51bGwpOm51bGw7CiAgICAgICAgIGlmKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICBpZih3c2RsTW9kZWxlci5nZXRFbnZpcm9ubWVudCgpLmdldE5hbWVzKCkuaXNKYXZhUmVzZXJ2ZWRXb3JkKG9wZXJhdGlvbk5hbWUpKXsKKyAgICAgICAgICAgIGlmKE5hbWVzLmlzSmF2YVJlc2VydmVkV29yZChvcGVyYXRpb25OYW1lKSl7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAKQEAgLTE5OSwxMiArMjI2LDkgQEAKICAgICAgICAgICAgICAgICAiICAgICAgICAgICB4bWxuczpqYXhiPScnaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YicnIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgeG1sbnM6eGpjPScnaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMnJyIgKwogICAgICAgICAgICAgICAgICIgICAgICAgICAgIGpheGI6ZXh0ZW5zaW9uQmluZGluZ1ByZWZpeGVzPScneGpjJyciICsKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICBqYXhiOnZlcnNpb249JycxLjAnJyIpOwotICAgICAgICBpZigoZWxlbWVudE5hbWUgIT0gbnVsbCkgJiYgZWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgIHByaW50KCIgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0nJ3swfScnPiIsIGVsZW1lbnROYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBwcmludCgiICAgICAgICAgICA+Iik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICAiICAgICAgICAgICBqYXhiOnZlcnNpb249JycxLjAnJyIgKworICAgICAgICAgICAgICAgICIgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0nJ3swfScnPiIsCisgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwogCiAgICAgICAgIHdyaXRlSW1wb3J0cyhlbGVtZW50TmFtZSwgYWxsUGFydHMpOwogCkBAIC0yNDMsMTQgKzI2NywxNCBAQAogCiAgICAgICAgIC8vIHJlc2V0IHRoZSBTdHJpbmdXcml0ZXIsIHNvIHRoYXQgbmV4dCBvcGVyYXRpb24gZWxlbWVudCBjb3VsZCBiZSB3cml0dGVuCiAgICAgICAgIGlmKGJ1Zi50b1N0cmluZygpLmxlbmd0aCgpID4gMCl7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzcG9uc2UgYmVhbiBTY2hlbWEgZm9yIG9wZXJhdGlvbj09PT09PT09PiAiKyBlbGVtZW50TmFtZSsiXG5cbiIrYnVmKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNwb25zZSBiZWFuIFNjaGVtYSBmb3Igb3BlcmF0aW9uPT09PT09PT0+ICIrIGVsZW1lbnROYW1lKyJcblxuIitidWYpOwogICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihidWYudG9TdHJpbmcoKSkpOwogICAgICAgICAgICAgc2NoZW1hcy5hZGQoaXMpOwogICAgICAgICAgICAgYnVmLmdldEJ1ZmZlcigpLnNldExlbmd0aCgwKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgUU5hbWUgZ2V0T3BlcmF0aW9uTmFtZShQb3J0VHlwZSBwb3J0VHlwZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIEV4dGVuc2libGUgYmluZGluZyl7CisgICAgcHJpdmF0ZSBRTmFtZSBnZXRPcGVyYXRpb25OYW1lKFN0cmluZyBvcGVyYXRpb25OYW1lKXsKICAgICAgICAgaWYob3BlcmF0aW9uTmFtZSA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAvLyAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpKyI/Iitwb3J0VHlwZS5nZXROYW1lKCkrIj8iICsgb3BlcmF0aW9uTmFtZTsKQEAgLTI3NSw2ICsyOTksNCBAQAogICAgICAgICBidWYud3JpdGUoJ1xuJyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFFOYW1lPiBuc3BhY2VUb1BhY2thZ2VTY2hlbWEgPSBuZXcgSGFzaFNldDxRTmFtZT4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgIHNjaGVtYUNvdW50ZXI7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL3dzZGwvV1NETE1vZGVsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9XU0RMTW9kZWxlci5qYXZhCmluZGV4IDEwNzA0MzguLjE1ZWExOGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9XU0RMTW9kZWxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9XU0RMTW9kZWxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDk2ICsyNCw0NiBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbDsKIAotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDb2RlTW9kZWw7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yT3B0aW9uczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuV1NETE1vZGVsSW5mbzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuR2VuZXJhdG9yQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkFzeW5jT3BlcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkFzeW5jT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5CbG9jazsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5TQVhQYXJzZUV4Y2VwdGlvbjI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLk5hbWVzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuRmF1bHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWxPYmplY3Q7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk9wZXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5QYXJhbWV0ZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuUG9ydDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5SZXF1ZXN0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlJlc3BvbnNlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlNlcnZpY2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YUludGVyZmFjZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXZhLkphdmFNZXRob2Q7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVNpbXBsZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhU3RydWN0dXJlTWVtYmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YVR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCRWxlbWVudE1lbWJlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLkpBWEJQcm9wZXJ0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLkpBWEJTdHJ1Y3R1cmVkVHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLkpBWEJUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQlR5cGVBbmRBbm5vdGF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuUnBjTGl0TWVtYmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuUnBjTGl0U3RydWN0dXJlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5qYXhiLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5KYXZhU2ltcGxlVHlwZUNyZWF0b3I7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuTW9kZWxlclV0aWxzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuQ2xhc3NOYW1lQ29sbGVjdG9yOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkJpbmRpbmdGYXVsdDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuRG9jdW1lbnRhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuS2luZHM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuTW9kZWxlck1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRPcHRpb25zOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlUGFydDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuT3BlcmF0aW9uU3R5bGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlBvcnRUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5XU0RMRG9jdW1lbnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LmpheHdzLkN1c3RvbU5hbWU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LmpheHdzLkpBWFdTQmluZGluZzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQubWltZS5NSU1FQ29udGVudDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc2NoZW1hLlNjaGVtYUtpbmRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVAxMkJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQU3R5bGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUFVzZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2libGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5Ob1N1Y2hFbnRpdHlFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlBhcnNlckxpc3RlbmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyLlNPQVBFbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3I7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5XU0RMUGFyc2VyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5TMkpKQVhCTW9kZWw7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlR5cGVBbmRBbm5vdGF0aW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5YSkM7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuSkFYQlJJQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7CiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5Mb2NhdG9ySW1wbDsKIAoraW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogCiAvKioKQEAgLTEyNywxMTEgKzc3LDExMSBAQAogICAgIHByaXZhdGUgZmluYWwgTWFwPFFOYW1lLCBRTmFtZT4gdW5pcXVlQm9keUJsb2NrcyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBRTmFtZT4oKTsKICAgICBwcml2YXRlIGZpbmFsIFFOYW1lIFZPSURfQk9EWUJMT0NLID0gbmV3IFFOYW1lKCIiKTsKICAgICBwcml2YXRlIENsYXNzTmFtZUNvbGxlY3RvciBjbGFzc05hbWVDb2xsZWN0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGV4dGVuc2lvbnMgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgZW51bSBTdHlsZUFuZFVzZSAge1JQQ19MSVRFUkFMLCBET0NfTElURVJBTH07Ci0gICAgcHJpdmF0ZSBNb2RlbGVyVXRpbHMgbW9kZWxlclV0aWxzOwotICAgIHByaXZhdGUgSkFYQk1vZGVsQnVpbGRlciBqYXhiTW9kZWxCdWlsZGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGV4cGxpY2l0RGVmYXVsdFBhY2thZ2U7CiAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbW9kZWxJbmZvCi0gICAgICogQHBhcmFtIG9wdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETE1vZGVsZXIoV1NETE1vZGVsSW5mbyBtb2RlbEluZm8sIFByb3BlcnRpZXMgb3B0aW9ucykgewotICAgICAgICBzdXBlcihtb2RlbEluZm8sIG9wdGlvbnMpOwotICAgICAgICBjbGFzc05hbWVDb2xsZWN0b3IgPSBuZXcgQ2xhc3NOYW1lQ29sbGVjdG9yKCk7CisgICAgcHVibGljIFdTRExNb2RlbGVyKFdzaW1wb3J0T3B0aW9ucyBvcHRpb25zLCBFcnJvclJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIHN1cGVyKG9wdGlvbnMsIHJlY2VpdmVyKTsKKyAgICAgICAgdGhpcy5jbGFzc05hbWVDb2xsZWN0b3IgPSBuZXcgQ2xhc3NOYW1lQ29sbGVjdG9yKCk7CisgICAgICAgIHRoaXMuZXhwbGljaXREZWZhdWx0UGFja2FnZSA9IG9wdGlvbnMuZGVmYXVsdFBhY2thZ2U7CiAgICAgfQogCisKKyAgICBwcm90ZWN0ZWQgZW51bSBTdHlsZUFuZFVzZSB7CisgICAgICAgIFJQQ19MSVRFUkFMLCBET0NfTElURVJBTAorICAgIH0KKworICAgIHByaXZhdGUgSkFYQk1vZGVsQnVpbGRlciBqYXhiTW9kZWxCdWlsZGVyOworCiAgICAgcHVibGljIE1vZGVsIGJ1aWxkTW9kZWwoKSB7CiAgICAgICAgIHRyeSB7CiAKLSAgICAgICAgICAgIHBhcnNlciA9IG5ldyBXU0RMUGFyc2VyKF9tb2RlbEluZm8pOworICAgICAgICAgICAgcGFyc2VyID0gbmV3IFdTRExQYXJzZXIob3B0aW9ucywgZXJyUmVjZWl2ZXIpOwogICAgICAgICAgICAgcGFyc2VyLmFkZFBhcnNlckxpc3RlbmVyKG5ldyBQYXJzZXJMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBpZ25vcmluZ0V4dGVuc2lvbihRTmFtZSBuYW1lLCBRTmFtZSBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBpZ25vcmluZ0V4dGVuc2lvbihFbnRpdHkgZW50aXR5LCBRTmFtZSBuYW1lLCBRTmFtZSBwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9UWVBFUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhIHNjaGVtYSBlbGVtZW50IHdpdGggdGhlIHdyb25nIG5hbWVzcGFjZSBVUkkKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmdldExvY2FsUGFydCgpLmVxdWFscygic2NoZW1hIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdVbnJlY29nbml6ZWRTY2hlbWFFeHRlbnNpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoZW50aXR5LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19VTlJFQ09HTklaRURfU0NIRU1BX0VYVEVOU0lPTihuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvbmVQYXJzaW5nRW50aXR5KFFOYW1lIGVsZW1lbnQsIEVudGl0eSBlbnRpdHkpIHsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGhTZXQgPSBwYXJzZXIuZ2V0VXNlKCk7CiAKLSAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBCb29sZWFuLnZhbHVlT2YoX29wdGlvbnMuZ2V0UHJvcGVydHkoUHJvY2Vzc29yT3B0aW9ucy5FWFRFTlNJT04pKTsKKyAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKCk7CisgICAgICAgICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCBkb2N1bWVudC5nZXREZWZpbml0aW9ucygpID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgICAgIHVzZVdTSUJhc2ljUHJvZmlsZSA9ICFleHRlbnNpb25zOwotICAgICAgICAgICAgZG9jdW1lbnQgPQotICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZSgpOwogICAgICAgICAgICAgZG9jdW1lbnQudmFsaWRhdGVMb2NhbGx5KCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRhdGVXU0RMID0KLSAgICAgICAgICAgICAgICBCb29sZWFuCi0gICAgICAgICAgICAgICAgICAgIC52YWx1ZU9mKAotICAgICAgICAgICAgICAgICAgICAgICAgX29wdGlvbnMuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc29yT3B0aW9ucy5WQUxJREFURV9XU0RMX1BST1BFUlRZKSkKLSAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbGlkYXRlV1NETCkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50LnZhbGlkYXRlKG5ldyBTT0FQRW50aXR5UmVmZXJlbmNlVmFsaWRhdG9yKCkpOwotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBmb3Jlc3QgPSBwYXJzZXIuZ2V0RE9NRm9yZXN0KCk7CiAKICAgICAgICAgICAgIE1vZGVsIG1vZGVsID0gaW50ZXJuYWxCdWlsZE1vZGVsKGRvY3VtZW50KTsKKyAgICAgICAgICAgIGlmKG1vZGVsID09IG51bGwgfHwgZXJyUmVjZWl2ZXIuaGFkRXJyb3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIC8vQ2xhc3NOYW1lQ29sbGVjdG9yIGNsYXNzTmFtZUNvbGxlY3RvciA9IG5ldyBDbGFzc05hbWVDb2xsZWN0b3IoKTsKICAgICAgICAgICAgIGNsYXNzTmFtZUNvbGxlY3Rvci5wcm9jZXNzKG1vZGVsKTsKICAgICAgICAgICAgIGlmIChjbGFzc05hbWVDb2xsZWN0b3IuZ2V0Q29uZmxpY3RpbmdDbGFzc05hbWVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYoZXJyUmVjZWl2ZXIuaGFkRXJyb3IoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZG8gYW5vdGhlciBwYXNzLCB0aGlzIHRpbWUgd2l0aCBjb25mbGljdCByZXNvbHV0aW9uIGVuYWJsZWQKICAgICAgICAgICAgIG1vZGVsID0gaW50ZXJuYWxCdWlsZE1vZGVsKGRvY3VtZW50KTsKKwogICAgICAgICAgICAgY2xhc3NOYW1lQ29sbGVjdG9yLnByb2Nlc3MobW9kZWwpOwogICAgICAgICAgICAgaWYgKGNsYXNzTmFtZUNvbGxlY3Rvci5nZXRDb25mbGljdGluZ0NsYXNzTmFtZXMoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgaWYoZXJyUmVjZWl2ZXIuaGFkRXJyb3IoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZ2l2ZSB1cAogICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGNvbmZsaWN0TGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwogICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0KLSAgICAgICAgICAgICAgICBjbGFzc05hbWVDb2xsZWN0b3IuZ2V0Q29uZmxpY3RpbmdDbGFzc05hbWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lQ29sbGVjdG9yLmdldENvbmZsaWN0aW5nQ2xhc3NOYW1lcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0TGlzdC5hcHBlbmQoIiwgIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uZmxpY3RMaXN0LmFwcGVuZCgoU3RyaW5nKWl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgICAgICBjb25mbGljdExpc3QuYXBwZW5kKChTdHJpbmcpIGl0ZXIubmV4dCgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJ3c2RsbW9kZWxlci51bnNvbHZhYmxlTmFtaW5nQ29uZmxpY3RzIiwKLSAgICAgICAgICAgICAgICBjb25mbGljdExpc3QudG9TdHJpbmcoKSk7Ci0KKyAgICAgICAgICAgIGVycm9yKGRvY3VtZW50LmdldERlZmluaXRpb25zKCksIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9VTlNPTFZBQkxFX05BTUlOR19DT05GTElDVFMoY29uZmxpY3RMaXN0LnRvU3RyaW5nKCkpKTsKICAgICAgICAgfSBjYXRjaCAoTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oKEV4Y2VwdGlvbillKTsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKGRvY3VtZW50LmdldERlZmluaXRpb25zKCksIGUuZ2V0TWVzc2FnZSgpLCBlKTsKICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oKEV4Y2VwdGlvbillKTsKKyAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGUpOwogICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKChFeGNlcHRpb24pZSk7CisgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZSk7CiAgICAgICAgIH0KKyAgICAgICAgLy9zaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQorICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBwcml2YXRlIE1vZGVsIGludGVybmFsQnVpbGRNb2RlbChXU0RMRG9jdW1lbnQgZG9jdW1lbnQpIHsKKyAgICAgICAgbnVtUGFzc2VzKys7CiAKICAgICAgICAgLy9idWlsZCB0aGUgamF4Yk1vZGVsIHRvIGJlIHVzZWQgbGF0dGVyCi0gICAgICAgIGJ1aWxkSkFYQk1vZGVsKGRvY3VtZW50LCBfbW9kZWxJbmZvLCBjbGFzc05hbWVDb2xsZWN0b3IpOworICAgICAgICBidWlsZEpBWEJNb2RlbChkb2N1bWVudCk7CiAKICAgICAgICAgUU5hbWUgbW9kZWxOYW1lID0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXREZWZpbml0aW9ucygpLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldERlZmluaXRpb25zKCkuZ2V0TmFtZSgpID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyAibW9kZWwiCi0gICAgICAgICAgICAgICAgICAgIDogZG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKS5nZXROYW1lKCkpOwotICAgICAgICBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbChtb2RlbE5hbWUpOworICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldERlZmluaXRpb25zKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXREZWZpbml0aW9ucygpLmdldE5hbWUoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIm1vZGVsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRvY3VtZW50LmdldERlZmluaXRpb25zKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwobW9kZWxOYW1lLCBkb2N1bWVudC5nZXREZWZpbml0aW9ucygpKTsKICAgICAgICAgbW9kZWwuc2V0SkFYQk1vZGVsKGdldEpBWEJNb2RlbEJ1aWxkZXIoKS5nZXRKQVhCTW9kZWwoKSk7CiAKICAgICAgICAgLy8gVGhpcyBmYWlscyB3aXRoIHRoZSBjaGFuZ2VkIGNsYXNzbmFtZSAoV1NETE1vZGVsZXIgdG8gV1NETE1vZGVsZXIxMSBldGMuKQpAQCAtMjM5LDM3ICsxODksMzYgQEAKICAgICAgICAgLy8gbW9kZWxlciBjbGFzcyBuYW1lIHRvIHRoZSBzYW1lIG9uZSBiZWluZyBjaGVja2VkIGluIFdTRExHZW5lcmF0b3IuCiAKICAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICBNb2RlbFByb3BlcnRpZXMuUFJPUEVSVFlfTU9ERUxFUl9OQU1FLAotICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLldTRExfTU9ERUxFUl9OQU1FKTsKKyAgICAgICAgICAgICAgICBNb2RlbFByb3BlcnRpZXMuUFJPUEVSVFlfTU9ERUxFUl9OQU1FLAorICAgICAgICAgICAgICAgIE1vZGVsUHJvcGVydGllcy5XU0RMX01PREVMRVJfTkFNRSk7CiAKICAgICAgICAgX2phdmFUeXBlcyA9IG5ldyBKYXZhU2ltcGxlVHlwZUNyZWF0b3IoKTsKLSAgICAgICAgX2phdmFFeGNlcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgX2JpbmRpbmdOYW1lVG9Qb3J0TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgX2phdmFFeGNlcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKYXZhRXhjZXB0aW9uPigpOworICAgICAgICBfYmluZGluZ05hbWVUb1BvcnRNYXAgPSBuZXcgSGFzaE1hcDxRTmFtZSwgUG9ydD4oKTsKIAogICAgICAgICAvLyBncmFiIHRhcmdldCBuYW1lc3BhY2UKICAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlVVJJKGRvY3VtZW50LmdldERlZmluaXRpb25zKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJKCkpOwogCiAgICAgICAgIHNldERvY3VtZW50YXRpb25JZlByZXNlbnQobW9kZWwsCi0gICAgICAgICAgICBkb2N1bWVudC5nZXREZWZpbml0aW9ucygpLmdldERvY3VtZW50YXRpb24oKSk7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKS5nZXREb2N1bWVudGF0aW9uKCkpOwogCiAgICAgICAgIGJvb2xlYW4gaGFzU2VydmljZXMgPSBkb2N1bWVudC5nZXREZWZpbml0aW9ucygpLnNlcnZpY2VzKCkuaGFzTmV4dCgpOwogICAgICAgICBpZiAoaGFzU2VydmljZXMpIHsKICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGRvY3VtZW50LmdldERlZmluaXRpb25zKCkuc2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzU2VydmljZSgoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlNlcnZpY2UpaXRlci5uZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLCBkb2N1bWVudCk7CisgICAgICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzU2VydmljZSgoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlNlcnZpY2UpIGl0ZXIubmV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsIGRvY3VtZW50KTsKICAgICAgICAgICAgICAgICBoYXNTZXJ2aWNlcyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBlbWl0IGEgd2FybmluZyBpZiB0aGVyZSBhcmUgbm8gc2VydmljZSBkZWZpbml0aW9ucwotICAgICAgICAgICAgd2Fybigid3NkbG1vZGVsZXIud2FybmluZy5ub1NlcnZpY2VEZWZpbml0aW9uc0ZvdW5kIik7CisgICAgICAgICAgICB3YXJuaW5nKG1vZGVsLmdldEVudGl0eSgpLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19OT19TRVJWSUNFX0RFRklOSVRJT05TX0ZPVU5EKCkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgIH0KIAotCiAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgV1NETE1vZGVsZXJCYXNlI3Byb2Nlc3NTZXJ2aWNlKFNlcnZpY2UsIE1vZGVsLCBXU0RMRG9jdW1lbnQpCiAgICAgICovCkBAIC0yODEsNzEgKzIzMCw3NSBAQAogICAgICAgICAgICAgc2VydmljZUludGVyZmFjZSArPSAiX1NlcnZpY2UiOwogICAgICAgICB9CiAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICBuZXcgU2VydmljZSgKLSAgICAgICAgICAgICAgICBzZXJ2aWNlUU5hbWUsCi0gICAgICAgICAgICAgICAgbmV3IEphdmFJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSwgc2VydmljZUludGVyZmFjZSArICJJbXBsIikpOworICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVFOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSwgc2VydmljZUludGVyZmFjZSArICJJbXBsIiksIHdzZGxTZXJ2aWNlKTsKIAogICAgICAgICBzZXREb2N1bWVudGF0aW9uSWZQcmVzZW50KHNlcnZpY2UsIHdzZGxTZXJ2aWNlLmdldERvY3VtZW50YXRpb24oKSk7CiAgICAgICAgIGJvb2xlYW4gaGFzUG9ydHMgPSBmYWxzZTsKICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gd3NkbFNlcnZpY2UucG9ydHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NlZCA9Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BvcnQoCi0gICAgICAgICAgICAgICAgICAgIChjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuUG9ydClpdGVyLm5leHQoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlBvcnQpIGl0ZXIubmV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQpOwogICAgICAgICAgICAgaGFzUG9ydHMgPSBoYXNQb3J0cyB8fCBwcm9jZXNzZWQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFoYXNQb3J0cykgewogICAgICAgICAgICAgLy8gZW1pdCBhIHdhcm5pbmcgaWYgdGhlcmUgYXJlIG5vIHBvcnRzCi0gICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLm5vUG9ydHNJblNlcnZpY2UiLCB3c2RsU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHdhcm5pbmcod3NkbFNlcnZpY2UsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX05PX1BPUlRTX0lOX1NFUlZJQ0Uod3NkbFNlcnZpY2UuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtb2RlbC5hZGRTZXJ2aWNlKHNlcnZpY2UpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgV1NETE1vZGVsZXJCYXNlI3Byb2Nlc3NQb3J0KFBvcnQsIFNlcnZpY2UsIFdTRExEb2N1bWVudCkKKyAgICAgKiBAc2VlIFdTRExNb2RlbGVyQmFzZSNwcm9jZXNzUG9ydChXU0RMUG9ydCwgU2VydmljZSwgV1NETERvY3VtZW50KQogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQb3J0KGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5Qb3J0IHdzZGxQb3J0LAotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlLCBXU0RMRG9jdW1lbnQgZG9jdW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UsIFdTRExEb2N1bWVudCBkb2N1bWVudCkgewogICAgICAgICB0cnkgewogCiAgICAgICAgICAgICAvL2NsZWFyIHRoZSAgdW5pcXVlIGJsb2NrIG1hcAogICAgICAgICAgICAgdW5pcXVlQm9keUJsb2Nrcy5jbGVhcigpOwogCiAgICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBnZXRRTmFtZU9mKHdzZGxQb3J0KTsKLSAgICAgICAgICAgIFBvcnQgcG9ydCA9IG5ldyBQb3J0KHBvcnRRTmFtZSk7CisgICAgICAgICAgICBQb3J0IHBvcnQgPSBuZXcgUG9ydChwb3J0UU5hbWUsIHdzZGxQb3J0KTsKIAogICAgICAgICAgICAgc2V0RG9jdW1lbnRhdGlvbklmUHJlc2VudChwb3J0LCB3c2RsUG9ydC5nZXREb2N1bWVudGF0aW9uKCkpOwogCiAgICAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgKFNPQVBBZGRyZXNzKWdldEV4dGVuc2lvbk9mVHlwZSh3c2RsUG9ydCwgU09BUEFkZHJlc3MuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAoU09BUEFkZHJlc3MpIGdldEV4dGVuc2lvbk9mVHlwZSh3c2RsUG9ydCwgU09BUEFkZHJlc3MuY2xhc3MpOwogICAgICAgICAgICAgaWYgKHNvYXBBZGRyZXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBub3QgYSBTT0FQIHBvcnQsIGlnbm9yZSBpdAotICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdOb25TT0FQUG9ydC5ub0FkZHJlc3MiLCB3c2RsUG9ydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZihvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpKXsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyh3c2RsUG9ydCwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX1dBUk5JTkdfTk9fU09BUF9BRERSRVNTKHdzZGxQb3J0LmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBTT0FQIHBvcnQsIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKHdzZGxQb3J0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19OT05fU09BUF9QT1JUX05PX0FERFJFU1Mod3NkbFBvcnQuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBvcnQuc2V0QWRkcmVzcyhzb2FwQWRkcmVzcy5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIGlmKHNvYXBBZGRyZXNzICE9IG51bGwpCisgICAgICAgICAgICAgICAgcG9ydC5zZXRBZGRyZXNzKHNvYXBBZGRyZXNzLmdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gd3NkbFBvcnQucmVzb2x2ZUJpbmRpbmcoZG9jdW1lbnQpOwogICAgICAgICAgICAgUU5hbWUgYmluZGluZ05hbWUgPSBnZXRRTmFtZU9mKGJpbmRpbmcpOwogICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLnJlc29sdmVQb3J0VHlwZShkb2N1bWVudCk7CiAKICAgICAgICAgICAgIHBvcnQuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1dTRExfUE9SVF9OQU1FLAotICAgICAgICAgICAgICAgIGdldFFOYW1lT2Yod3NkbFBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1dTRExfUE9SVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICBnZXRRTmFtZU9mKHdzZGxQb3J0KSk7CiAgICAgICAgICAgICBwb3J0LnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIE1vZGVsUHJvcGVydGllcy5QUk9QRVJUWV9XU0RMX1BPUlRfVFlQRV9OQU1FLAotICAgICAgICAgICAgICAgIGdldFFOYW1lT2YocG9ydFR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1dTRExfUE9SVF9UWVBFX05BTUUsCisgICAgICAgICAgICAgICAgICAgIGdldFFOYW1lT2YocG9ydFR5cGUpKTsKICAgICAgICAgICAgIHBvcnQuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1dTRExfQklORElOR19OQU1FLAotICAgICAgICAgICAgICAgIGJpbmRpbmdOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1dTRExfQklORElOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICBiaW5kaW5nTmFtZSk7CiAKICAgICAgICAgICAgIGJvb2xlYW4gaXNQcm92aWRlciA9IGlzUHJvdmlkZXIod3NkbFBvcnQpOwogICAgICAgICAgICAgaWYgKF9iaW5kaW5nTmFtZVRvUG9ydE1hcC5jb250YWluc0tleShiaW5kaW5nTmFtZSkgJiYgIWlzUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIGJpbmRpbmcgaGFzIGJlZW4gcHJvY2Vzc2VkIGJlZm9yZQogICAgICAgICAgICAgICAgIFBvcnQgZXhpc3RpbmdQb3J0ID0KLSAgICAgICAgICAgICAgICAgICAgX2JpbmRpbmdOYW1lVG9Qb3J0TWFwLmdldChiaW5kaW5nTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfYmluZGluZ05hbWVUb1BvcnRNYXAuZ2V0KGJpbmRpbmdOYW1lKTsKICAgICAgICAgICAgICAgICBwb3J0LnNldE9wZXJhdGlvbnMoZXhpc3RpbmdQb3J0LmdldE9wZXJhdGlvbnMoKSk7CiAgICAgICAgICAgICAgICAgcG9ydC5zZXRKYXZhSW50ZXJmYWNlKGV4aXN0aW5nUG9ydC5nZXRKYXZhSW50ZXJmYWNlKCkpOwogICAgICAgICAgICAgICAgIHBvcnQuc2V0U3R5bGUoZXhpc3RpbmdQb3J0LmdldFN0eWxlKCkpOwpAQCAtMzUzLDU5ICszMDYsNjIgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gZmluZCBvdXQgdGhlIFNPQVAgYmluZGluZyBleHRlbnNpb24sIGlmIGFueQogICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0KLSAgICAgICAgICAgICAgICAgICAgKFNPQVBCaW5kaW5nKWdldEV4dGVuc2lvbk9mVHlwZShiaW5kaW5nLCBTT0FQQmluZGluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEJpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShiaW5kaW5nLCBTT0FQQmluZGluZy5jbGFzcyk7CiAKICAgICAgICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBCaW5kaW5nKWdldEV4dGVuc2lvbk9mVHlwZShiaW5kaW5nLCBTT0FQMTJCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEJpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShiaW5kaW5nLCBTT0FQMTJCaW5kaW5nLmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNvYXBCaW5kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBkZWFsIHdpdGggbm9uLVNPQVAgcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdOb25TT0FQUG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gb25seSBkbyBzb2FwMS4yIGlmIGV4dGVuc2lvbnMgYXJlIG9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLnBvcnQuU09BUEJpbmRpbmcxMiIsIHdzZGxQb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nU09BUEJpbmRpbmcxMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxQb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighb3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGRlYWwgd2l0aCBub24tU09BUCBwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcod3NkbFBvcnQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX05PTl9TT0FQX1BPUlQod3NkbFBvcnQuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyh3c2RsUG9ydCwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX1dBUk5JTkdfTk9OX1NPQVBfUE9SVCh3c2RsUG9ydC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gb25seSBkbyBzb2FwMS4yIGlmIGV4dGVuc2lvbnMgYXJlIG9uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcod3NkbFBvcnQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX1BPUlRfU09BUF9CSU5ESU5HXzEyKHdzZGxQb3J0LmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKHdzZGxQb3J0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19TT0FQX0JJTkRJTkdfMTIod3NkbFBvcnQuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydCgpID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgKCFzb2FwQmluZGluZy5nZXRUcmFuc3BvcnQoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwgICYmIChzb2FwQmluZGluZy5nZXRUcmFuc3BvcnQoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIXNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydCgpLmVxdWFscygKICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuVVJJX1NPQVBfVFJBTlNQT1JUX0hUVFApICYmICFzb2FwQmluZGluZy5nZXRUcmFuc3BvcnQoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuVVJJX1NPQVBfVFJBTlNQT1JUX0hUVFApKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgZGVhbCB3aXRoIG5vbi1IVFRQIHBvcnRzCi0gICAgICAgICAgICAgICAgICAgIHdhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ1NPQVBCaW5kaW5nLm5vbkhUVFBUcmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlVSSV9TT0FQX1RSQU5TUE9SVF9IVFRQKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcod3NkbFBvcnQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX1NPQVBfQklORElOR19OT05fSFRUUF9UUkFOU1BPUlQod3NkbFBvcnQuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGRlYWwgd2l0aCBub24tSFRUUCBwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgICogdmFsaWRhdGUgd3NkbDpiaW5kaW5nIHVuaXF1ZW5lc3MgaW4gc3R5bGUsIGUuZy4gcnBjbGl0IG9yIGRvY2xpdAogICAgICAgICAgICAgICAgICAqIHJlZjogV1NJIEJQIDEuMSBSIDI3MDUKICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZighdmFsaWRhdGVXU0RMQmluZGluZ1N0eWxlKGJpbmRpbmcpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoZXh0ZW5zaW9ucyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLnBvcnQuU09BUEJpbmRpbmcubWl4ZWRTdHlsZSIsIHdzZGxQb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ1NPQVBCaW5kaW5nLm1peGVkU3R5bGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsUG9ydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsICYmICF2YWxpZGF0ZVdTRExCaW5kaW5nU3R5bGUoYmluZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNFeHRlbnNpb25Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcod3NkbFBvcnQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX1BPUlRfU09BUF9CSU5ESU5HX01JWEVEX1NUWUxFKHdzZGxQb3J0LmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Iod3NkbFBvcnQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX1NPQVBfQklORElOR19NSVhFRF9TVFlMRSh3c2RsUG9ydC5nZXROYW1lKCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHBvcnQuc2V0U3R5bGUoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSk7CisgICAgICAgICAgICAgICAgaWYoc29hcEJpbmRpbmcgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIHBvcnQuc2V0U3R5bGUoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNPdmVybG9hZGVkT3BlcmF0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IG9wZXJhdGlvbk5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHBvcnRUeXBlLm9wZXJhdGlvbnMoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5PcGVyYXRpb24gb3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuT3BlcmF0aW9uKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZXMuY29udGFpbnMob3BlcmF0aW9uLmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGhhc092ZXJsb2FkZWRPcGVyYXRpb25zID0gdHJ1ZTsKQEAgLTQxNCwyMCArMzcwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWVzLmFkZChvcGVyYXRpb24uZ2V0TmFtZSgpKTsKIAogICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IGJpbmRpbmcub3BlcmF0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJpbmRpbmdPcGVyYXRpb24paXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJpbmRpbmdPcGVyYXRpb24pIGl0ci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ09wZXJhdGlvbi5ub3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZy5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihiaW5kaW5nT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9OT1RfRk9VTkQob3BlcmF0aW9uLmdldE5hbWUoKSwgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTQzNiw2NSArMzg4LDQ5IEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNPcGVyYXRpb25zID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYmluZGluZy5vcGVyYXRpb25zKCk7IGl0ZXIuaGFzTmV4dCgpOykgewogICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKEJpbmRpbmdPcGVyYXRpb24paXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJpbmRpbmdPcGVyYXRpb24pIGl0ZXIubmV4dCgpOwogCiAgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5PcGVyYXRpb24gcG9ydFR5cGVPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOwogICAgICAgICAgICAgICAgICAgICBTZXQgb3BlcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZS5nZXRPcGVyYXRpb25zTmFtZWQoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlLmdldE9wZXJhdGlvbnNOYW1lZChiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25zLnNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV1NETCBkb2N1bWVudCBpcyBpbnZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nT3BlcmF0aW9uLm5vdEluUG9ydFR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoYmluZGluZ09wZXJhdGlvbiwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fTk9UX0lOX1BPUlRfVFlQRShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgYmluZGluZy5nZXROYW1lKCkpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb25zLnNpemUoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5PcGVyYXRpb24pb3BlcmF0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbikgb3BlcmF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZElucHV0TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRJbnB1dCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRJbnB1dCgpLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZE91dHB1dE5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0T3V0cHV0KCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldE91dHB1dCgpLmdldE5hbWUoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyMiA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTtpdGVyMi5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOyBpdGVyMi5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbiBjYW5kaWRhdGVPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbilpdGVyMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuT3BlcmF0aW9uKSBpdGVyMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkSW5wdXROYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdTREwgZG9jdW1lbnQgaXMgaW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24ubWlzc2luZ0lucHV0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKGJpbmRpbmdPcGVyYXRpb24sIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX01JU1NJTkdfSU5QVVRfTkFNRShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRPdXRwdXROYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdTREwgZG9jdW1lbnQgaXMgaW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24ubWlzc2luZ091dHB1dE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihiaW5kaW5nT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9NSVNTSU5HX09VVFBVVF9OQU1FKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZElucHV0TmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGNhbmRpZGF0ZU9wZXJhdGlvbi5nZXRJbnB1dCgpLmdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXhwZWN0ZWRPdXRwdXROYW1lLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoY2FuZGlkYXRlT3BlcmF0aW9uLmdldElucHV0KCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXhwZWN0ZWRPdXRwdXROYW1lLmVxdWFscygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZU9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPdXRwdXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPdXRwdXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXU0RMIGRvY3VtZW50IGlzIGludmFsaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24ubXVsdGlwbGVNYXRjaGluZ09wZXJhdGlvbnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoYmluZGluZ09wZXJhdGlvbiwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fTVVMVElQTEVfTUFUQ0hJTkdfT1BFUkFUSU9OUyhiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnb3QgaXQhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKQEAgLTUwMywyNiArNDM5LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdTREwgZG9jdW1lbnQgaXMgaW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nT3BlcmF0aW9uLm5vdEZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZy5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihiaW5kaW5nT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9OT1RfRk9VTkQoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCksIGJpbmRpbmcuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoIWlzUHJvdmlkZXIpeworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb2Nlc3NTT0FQT3BlcmF0aW9uSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc092ZXJsb2FkZWRPcGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb2Nlc3NTT0FQT3BlcmF0aW9uSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3ZlcmxvYWRlZE9wZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBwcm9jZXNzU09BUE9wZXJhdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc29hcEJpbmRpbmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBwcm9jZXNzU09BUE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBwcm9jZXNzTm9uU09BUE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5hZGRPcGVyYXRpb24ob3BlcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVyYXRpb25zID0gdHJ1ZTsKQEAgLTUzMSwyMyArNDY5LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICghaXNQcm92aWRlciAmJiAhaGFzT3BlcmF0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IGEgd2FybmluZyBpZiB0aGVyZSBhcmUgbm8gb3BlcmF0aW9ucywgZXhjZXB0IHdoZW4gaXRzIGEgcHJvdmlkZXIgcG9ydAotICAgICAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLm5vT3BlcmF0aW9uc0luUG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsUG9ydC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKHdzZGxQb3J0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19OT19PUEVSQVRJT05TX0lOX1BPUlQod3NkbFBvcnQuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY3JlYXRlSmF2YUludGVyZmFjZUZvclBvcnQocG9ydCwgaXNQcm92aWRlcik7CiAgICAgICAgICAgICAgICAgUG9ydFR5cGUgcHQgPSBiaW5kaW5nLnJlc29sdmVQb3J0VHlwZShkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGpkID0gKHB0LmdldERvY3VtZW50YXRpb24oKSAhPSBudWxsKT9wdC5nZXREb2N1bWVudGF0aW9uKCkuZ2V0Q29udGVudCgpOm51bGw7CisgICAgICAgICAgICAgICAgU3RyaW5nIGpkID0gKHB0LmdldERvY3VtZW50YXRpb24oKSAhPSBudWxsKSA/IHB0LmdldERvY3VtZW50YXRpb24oKS5nZXRDb250ZW50KCkgOiBudWxsOwogICAgICAgICAgICAgICAgIHBvcnQuZ2V0SmF2YUludGVyZmFjZSgpLnNldEphdmFEb2MoamQpOwogICAgICAgICAgICAgICAgIF9iaW5kaW5nTmFtZVRvUG9ydE1hcC5wdXQoYmluZGluZ05hbWUsIHBvcnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBub3cgZGVhbCB3aXRoIHRoZSBjb25maWd1cmVkIGhhbmRsZXJzCi0gICAgICAgICAgICBwb3J0LnNldENsaWVudEhhbmRsZXJDaGFpbkluZm8oCi0gICAgICAgICAgICAgICAgX21vZGVsSW5mby5nZXRDbGllbnRIYW5kbGVyQ2hhaW5JbmZvKCkpOwotICAgICAgICAgICAgcG9ydC5zZXRTZXJ2ZXJIYW5kbGVyQ2hhaW5JbmZvKAotICAgICAgICAgICAgICAgIF9tb2RlbEluZm8uZ2V0U2VydmVySGFuZGxlckNoYWluSW5mbygpKTsKLQogICAgICAgICAgICAgc2VydmljZS5hZGRQb3J0KHBvcnQpOwogICAgICAgICAgICAgYXBwbHlQb3J0TWV0aG9kQ3VzdG9taXphdGlvbihwb3J0LCB3c2RsUG9ydCk7CiAgICAgICAgICAgICBhcHBseVdyYXBwZXJTdHlsZUN1c3RvbWl6YXRpb24ocG9ydCwgYmluZGluZy5yZXNvbHZlUG9ydFR5cGUoZG9jdW1lbnQpKTsKQEAgLTU1NSw0MyArNDg2LDE2OSBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRW50aXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHdhcm4oZSk7CisgICAgICAgICAgICB3YXJuaW5nKGRvY3VtZW50LmdldERlZmluaXRpb25zKCksIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIG9wZXJhdGlvbiBwdXJlbHkgZnJvbSBhYnN0cmFjdCBvcGVyYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIE9wZXJhdGlvbiBwcm9jZXNzTm9uU09BUE9wZXJhdGlvbigpIHsKKyAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9CisgICAgICAgICAgICAgICAgbmV3IE9wZXJhdGlvbihuZXcgUU5hbWUobnVsbCwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSksIGluZm8uYmluZGluZ09wZXJhdGlvbik7CisKKyAgICAgICAgc2V0RG9jdW1lbnRhdGlvbklmUHJlc2VudCgKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKCkpOworCisgICAgICAgIGlmIChpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldFN0eWxlKCkKKyAgICAgICAgICAgICAgICAhPSBPcGVyYXRpb25TdHlsZS5SRVFVRVNUX1JFU1BPTlNFCisgICAgICAgICAgICAgICAgJiYgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXRTdHlsZSgpICE9IE9wZXJhdGlvblN0eWxlLk9ORV9XQVkpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgd2FybmluZyhpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9TVFlMRShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvcihpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9TVFlMRShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucG9ydC5yZXNvbHZlQmluZGluZyhkb2N1bWVudCkucmVzb2x2ZVBvcnRUeXBlKGRvY3VtZW50KS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNSZXF1ZXN0UmVzcG9uc2UgPSBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldFN0eWxlKCkgPT0gT3BlcmF0aW9uU3R5bGUuUkVRVUVTVF9SRVNQT05TRTsKKyAgICAgICAgTWVzc2FnZSBpbnB1dE1lc3NhZ2UgPSBnZXRJbnB1dE1lc3NhZ2UoKTsKKyAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXRNZXNzYWdlLCBlcnJSZWNlaXZlcik7CisgICAgICAgIHJlcXVlc3Quc2V0RXJyb3JSZWNlaXZlcihlcnJSZWNlaXZlcik7CisgICAgICAgIGluZm8ub3BlcmF0aW9uID0gb3BlcmF0aW9uOworICAgICAgICBpbmZvLm9wZXJhdGlvbi5zZXRXU0RMUG9ydFR5cGVPcGVyYXRpb24oaW5mby5wb3J0VHlwZU9wZXJhdGlvbik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisgICAgICAgIE1lc3NhZ2Ugb3V0cHV0TWVzc2FnZSA9IG51bGw7CisgICAgICAgIGlmIChpc1JlcXVlc3RSZXNwb25zZSkgeworICAgICAgICAgICAgb3V0cHV0TWVzc2FnZSA9IGdldE91dHB1dE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG91dHB1dE1lc3NhZ2UsIGVyclJlY2VpdmVyKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCBlcnJSZWNlaXZlcik7CisgICAgICAgIH0KKworICAgICAgICAvL3NldCB0aGUgc3R5bGUgYmFzZWQgb24gaGV1cmlzdGljIHRoYXQgbWVzc2FnZSBoYXMgZWl0aGVyIGFsbCBwYXJ0cyBkZWZpbmVkCisgICAgICAgIC8vIHVzaW5nIHR5cGUoUlBDKSBvciBlbGVtZW50KERPQ1VNRU5UKQorICAgICAgICBzZXROb25Tb2FwU3R5bGUoaW5wdXRNZXNzYWdlLCBvdXRwdXRNZXNzYWdlKTsKKworICAgICAgICAvLyBQcm9jZXNzIHBhcmFtZXRlck9yZGVyIGFuZCBnZXQgdGhlIHBhcmFtZXRlckxpc3QKKyAgICAgICAgTGlzdDxNZXNzYWdlUGFydD4gcGFyYW1ldGVyTGlzdCA9IGdldFBhcmFtZXRlck9yZGVyKCk7CisKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtcyA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gdW53cmFwcGFibGUgPSBpc1Vud3JhcHBhYmxlKCk7CisgICAgICAgIGluZm8ub3BlcmF0aW9uLnNldFdyYXBwZWQodW53cmFwcGFibGUpOworICAgICAgICAgICAgcGFyYW1zID0gZ2V0RG9jbGl0UGFyYW1ldGVycyhyZXF1ZXN0LCByZXNwb25zZSwgcGFyYW1ldGVyTGlzdCk7CisgICAgICAgIGlmICghdmFsaWRhdGVQYXJhbWV0ZXJOYW1lKHBhcmFtcykpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGVmaW5pdGl2ZSBsaXN0IG9mIHBhcmFtZXRlcnMgdG8gbWF0Y2ggd2hhdCB3ZSdkIGxpa2UgdG8gZ2V0CisgICAgICAgIC8vIGluIHRoZSBqYXZhIGludGVyZmFjZSAod2hpY2ggaXMgZ2VuZXJhdGVkIG11Y2ggbGF0ZXIpLCBwYXJhbWV0ZXJPcmRlcgorICAgICAgICBMaXN0PFBhcmFtZXRlcj4gZGVmaW5pdGl2ZVBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS5pc1JldHVybigpKSB7CisgICAgICAgICAgICAgICAgaW5mby5vcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETF9SRVNVTFRfUEFSQU1FVEVSLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkUGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5pc0lOKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmlzT1VUKCkpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRQYXJhbWV0ZXIocGFyYW0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5pc0lOT1VUKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkUGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmluaXRpdmVQYXJhbWV0ZXJMaXN0LmFkZChwYXJhbSk7CisgICAgICAgIH0KKworICAgICAgICBpbmZvLm9wZXJhdGlvbi5zZXRSZXF1ZXN0KHJlcXVlc3QpOworCisgICAgICAgIGlmIChpc1JlcXVlc3RSZXNwb25zZSkgeworICAgICAgICAgICAgaW5mby5vcGVyYXRpb24uc2V0UmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmF1bHRzIHdpdGggZHVwbGljYXRlIG5hbWVzCisgICAgICAgIFNldCBkdXBsaWNhdGVOYW1lcyA9IGdldER1cGxpY2F0ZUZhdWx0TmFtZXMoKTsKKworICAgICAgICAvLyBoYW5kbGUgc29hcDpmYXVsdAorICAgICAgICBoYW5kbGVMaXRlcmFsU09BUEZhdWx0KHJlc3BvbnNlLCBkdXBsaWNhdGVOYW1lcyk7CisgICAgICAgIGluZm8ub3BlcmF0aW9uLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgIFdTRExfUEFSQU1FVEVSX09SREVSLAorICAgICAgICAgICAgICAgIGRlZmluaXRpdmVQYXJhbWV0ZXJMaXN0KTsKKworICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBpbmZvLnBvcnQucmVzb2x2ZUJpbmRpbmcoZG9jdW1lbnQpOworICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcucmVzb2x2ZVBvcnRUeXBlKGRvY3VtZW50KTsKKyAgICAgICAgaWYgKGlzQXN5bmMocG9ydFR5cGUsIGluZm8ucG9ydFR5cGVPcGVyYXRpb24pKSB7CisgICAgICAgICAgICB3YXJuaW5nKHBvcnRUeXBlLCAiQ2FuIG5vdCBnZW5lcmF0ZSBBc3luYyBtZXRob2RzIGZvciBub24tc29hcCBiaW5kaW5nISIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmZvLm9wZXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBhZGRlZCB0byBmaXggb25lIG9mIHRoZSB1c2UgY2FzZSBmb3IgajJlZSBzZSBmb2xrcywgc28gdGhhdCB3ZSBkZXRlcm1pbmUKKyAgICAgKiBmb3Igbm9uX3NvYXAgd3NkbCB3aGF0IGNvdWxkIGJlIHRoZSBzdHlsZSAtIHJwYyBvciBkb2N1bWVudCBiYXNlZCBvbiBwYXJ0cyBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIFdlIGFzc3VtZSB0aGF0IHRoZSBtZXNzYWdlIHBhcnRzIGNvdWxkIGhhdmUgZWl0aGVyIGFsbCBvZiB0aGVtIHdpdGggdHlwZSBhdHRyaWJ1dGUgKFJQQykKKyAgICAgKiBvciBlbGVtZW50IChET0NVTUVOVCkKKyAgICAgKgorICAgICAqIFNoYWxsIHRoaXMgY2hlY2sgaWYgcGFydHMgYXJlIG1peGVkIGFuZCB0aHJvdyBlcnJvciBtZXNzYWdlPworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXROb25Tb2FwU3R5bGUoTWVzc2FnZSBpbnB1dE1lc3NhZ2UsIE1lc3NhZ2Ugb3V0cHV0TWVzc2FnZSkgeworICAgICAgICBTT0FQU3R5bGUgc3R5bGUgPSBTT0FQU3R5bGUuRE9DVU1FTlQ7CisgICAgICAgIGZvcihNZXNzYWdlUGFydCBwYXJ0OmlucHV0TWVzc2FnZS5nZXRQYXJ0cygpKXsKKyAgICAgICAgICAgIGlmKHBhcnQuZ2V0RGVzY3JpcHRvcktpbmQoKSA9PSBTY2hlbWFLaW5kcy5YU0RfVFlQRSkKKyAgICAgICAgICAgICAgICBzdHlsZSA9IFNPQVBTdHlsZS5SUEM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3R5bGUgPSBTT0FQU3R5bGUuRE9DVU1FTlQ7CisgICAgICAgIH0KKworICAgICAgICAvL2NoZWNrIHRoZSBvdXRwdXRNZXNzYWdlIHBhcnRzCisgICAgICAgIGlmKG91dHB1dE1lc3NhZ2UgIT0gbnVsbCl7CisgICAgICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydDpvdXRwdXRNZXNzYWdlLmdldFBhcnRzKCkpeworICAgICAgICAgICAgICAgIGlmKHBhcnQuZ2V0RGVzY3JpcHRvcktpbmQoKSA9PSBTY2hlbWFLaW5kcy5YU0RfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBTT0FQU3R5bGUuUlBDOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBTT0FQU3R5bGUuRE9DVU1FTlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5mby5tb2RlbFBvcnQuc2V0U3R5bGUoc3R5bGUpOworICAgIH0KKwogICAgIC8qIChub24tSmF2YWRvYykKICAgICAgKiBAc2VlIFdTRExNb2RlbGVyQmFzZSNwcm9jZXNzU09BUE9wZXJhdGlvbigpCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9wZXJhdGlvbiBwcm9jZXNzU09BUE9wZXJhdGlvbigpIHsKICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgT3BlcmF0aW9uKG5ldyBRTmFtZShudWxsLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgbmV3IE9wZXJhdGlvbihuZXcgUU5hbWUobnVsbCwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSksIGluZm8uYmluZGluZ09wZXJhdGlvbik7CiAKICAgICAgICAgc2V0RG9jdW1lbnRhdGlvbklmUHJlc2VudCgKLSAgICAgICAgICAgIG9wZXJhdGlvbiwKLSAgICAgICAgICAgIGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbigpKTsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKCkpOwogCiAgICAgICAgIGlmIChpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldFN0eWxlKCkKLSAgICAgICAgICAgICE9IE9wZXJhdGlvblN0eWxlLlJFUVVFU1RfUkVTUE9OU0UKLSAgICAgICAgICAgICYmIGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0U3R5bGUoKSAhPSBPcGVyYXRpb25TdHlsZS5PTkVfV0FZKSB7Ci0gICAgICAgICAgICBpZihleHRlbnNpb25zKXsKLSAgICAgICAgICAgICAgICB3YXJuKAotICAgICAgICAgICAgICAgICAgICAid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ09wZXJhdGlvbi5ub3RTdXBwb3J0ZWRTdHlsZSIsCi0gICAgICAgICAgICAgICAgICAgIGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAhPSBPcGVyYXRpb25TdHlsZS5SRVFVRVNUX1JFU1BPTlNFCisgICAgICAgICAgICAgICAgJiYgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXRTdHlsZSgpICE9IE9wZXJhdGlvblN0eWxlLk9ORV9XQVkpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgd2FybmluZyhpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9TVFlMRShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvcihpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9TVFlMRShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucG9ydC5yZXNvbHZlQmluZGluZyhkb2N1bWVudCkucmVzb2x2ZVBvcnRUeXBlKGRvY3VtZW50KS5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLm5vdFN1cHBvcnRlZFN0eWxlIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2luZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBpbmZvLnBvcnQucmVzb2x2ZUJpbmRpbmcoZG9jdW1lbnQpLnJlc29sdmVQb3J0VHlwZShkb2N1bWVudCkuZ2V0TmFtZSgpfSk7CiAgICAgICAgIH0KIAogICAgICAgICBTT0FQU3R5bGUgc29hcFN0eWxlID0gaW5mby5zb2FwQmluZGluZy5nZXRTdHlsZSgpOwogCiAgICAgICAgIC8vIGZpbmQgb3V0IHRoZSBTT0FQIG9wZXJhdGlvbiBleHRlbnNpb24sIGlmIGFueQogICAgICAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPQotICAgICAgICAgICAgKFNPQVBPcGVyYXRpb24pZ2V0RXh0ZW5zaW9uT2ZUeXBlKGluZm8uYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICBTT0FQT3BlcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAoU09BUE9wZXJhdGlvbikgZ2V0RXh0ZW5zaW9uT2ZUeXBlKGluZm8uYmluZGluZ09wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBPcGVyYXRpb24uY2xhc3MpOwogCiAgICAgICAgIGlmIChzb2FwT3BlcmF0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChzb2FwT3BlcmF0aW9uLmdldFN0eWxlKCkgIT0gbnVsbCkgewpAQCAtNjA1LDcgKzY2Miw3IEBACiAgICAgICAgIG9wZXJhdGlvbi5zZXRTdHlsZShzb2FwU3R5bGUpOwogCiAgICAgICAgIFN0cmluZyB1bmlxdWVPcGVyYXRpb25OYW1lID0KLSAgICAgICAgICAgIGdldFVuaXF1ZU5hbWUoaW5mby5wb3J0VHlwZU9wZXJhdGlvbiwgaW5mby5oYXNPdmVybG9hZGVkT3BlcmF0aW9ucyk7CisgICAgICAgICAgICAgICAgZ2V0VW5pcXVlTmFtZShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBpbmZvLmhhc092ZXJsb2FkZWRPcGVyYXRpb25zKTsKICAgICAgICAgaWYgKGluZm8uaGFzT3ZlcmxvYWRlZE9wZXJhdGlvbnMpIHsKICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRVbmlxdWVOYW1lKHVuaXF1ZU9wZXJhdGlvbk5hbWUpOwogICAgICAgICB9CkBAIC02MTcsMTQgKzY3NCwxMiBAQAogICAgICAgICBTT0FQQm9keSBzb2FwUmVxdWVzdEJvZHkgPSBnZXRTT0FQUmVxdWVzdEJvZHkoKTsKICAgICAgICAgaWYgKHNvYXBSZXF1ZXN0Qm9keSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyB0aGUgV1NETCBkb2N1bWVudCBpcyBpbnZhbGlkCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nT3BlcmF0aW9uLmlucHV0TWlzc2luZ1NvYXBCb2R5IiwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICBlcnJvcihpbmZvLmJpbmRpbmdPcGVyYXRpb24sIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0lOUFVUX01JU1NJTkdfU09BUF9CT0RZKGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzb2FwU3R5bGUgPT0gU09BUFN0eWxlLlJQQykgewogICAgICAgICAgICAgaWYgKHNvYXBSZXF1ZXN0Qm9keS5pc0VuY29kZWQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKCJ3c2RsbW9kZWxlcjIwLnJwY2VuYy5ub3Quc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgZXJyb3Ioc29hcFJlcXVlc3RCb2R5LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfMjBfUlBDRU5DX05PVF9TVVBQT1JURUQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0xpdGVyYWxTT0FQT3BlcmF0aW9uKFN0eWxlQW5kVXNlLlJQQ19MSVRFUkFMKTsKICAgICAgICAgfQpAQCAtNjMyLDU1ICs2ODcsNjEgQEAKICAgICAgICAgcmV0dXJuIHByb2Nlc3NMaXRlcmFsU09BUE9wZXJhdGlvbihTdHlsZUFuZFVzZS5ET0NfTElURVJBTCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIE9wZXJhdGlvbiBwcm9jZXNzTGl0ZXJhbFNPQVBPcGVyYXRpb24oU3R5bGVBbmRVc2Ugc3R5bGVBbmRVc2UpeworICAgIHByb3RlY3RlZCBPcGVyYXRpb24gcHJvY2Vzc0xpdGVyYWxTT0FQT3BlcmF0aW9uKFN0eWxlQW5kVXNlIHN0eWxlQW5kVXNlKSB7CiAgICAgICAgIC8vcmV0dXJucyBmYWxzZSBpZiB0aGUgb3BlcmF0aW9uIG5hbWUgaXMgbm90IGFjY2VwdGFibGUKLSAgICAgICAgaWYoIWFwcGx5T3BlcmF0aW9uTmFtZUN1c3RvbWl6YXRpb24oKSkKKyAgICAgICAgaWYgKCFhcHBseU9wZXJhdGlvbk5hbWVDdXN0b21pemF0aW9uKCkpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIAogICAgICAgICBib29sZWFuIGlzUmVxdWVzdFJlc3BvbnNlID0gaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXRTdHlsZSgpID09IE9wZXJhdGlvblN0eWxlLlJFUVVFU1RfUkVTUE9OU0U7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCk7Ci0gICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKCk7CisgICAgICAgIE1lc3NhZ2UgaW5wdXRNZXNzYWdlID0gZ2V0SW5wdXRNZXNzYWdlKCk7CisgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0TWVzc2FnZSwgZXJyUmVjZWl2ZXIpOworICAgICAgICByZXF1ZXN0LnNldEVycm9yUmVjZWl2ZXIoZXJyUmVjZWl2ZXIpOwogICAgICAgICBpbmZvLm9wZXJhdGlvbi5zZXRVc2UoU09BUFVzZS5MSVRFUkFMKTsKKyAgICAgICAgaW5mby5vcGVyYXRpb24uc2V0V1NETFBvcnRUeXBlT3BlcmF0aW9uKGluZm8ucG9ydFR5cGVPcGVyYXRpb24pOwogICAgICAgICBTT0FQQm9keSBzb2FwUmVxdWVzdEJvZHkgPSBnZXRTT0FQUmVxdWVzdEJvZHkoKTsKLSAgICAgICAgaWYoKFN0eWxlQW5kVXNlLkRPQ19MSVRFUkFMID09IHN0eWxlQW5kVXNlKSAmJiAoc29hcFJlcXVlc3RCb2R5LmdldE5hbWVzcGFjZSgpICE9IG51bGwpKXsKLSAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcucjI3MTYiLCBuZXcgT2JqZWN0W117InNvYXBiaW5kOmJvZHkiLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgIGlmICgoU3R5bGVBbmRVc2UuRE9DX0xJVEVSQUwgPT0gc3R5bGVBbmRVc2UpICYmIChzb2FwUmVxdWVzdEJvZHkuZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHdhcm5pbmcoc29hcFJlcXVlc3RCb2R5LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19SXzI3MTYoInNvYXBiaW5kOmJvZHkiLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgIH0KIAotICAgICAgICBNZXNzYWdlIGlucHV0TWVzc2FnZSA9IGdldElucHV0TWVzc2FnZSgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKIAogICAgICAgICBTT0FQQm9keSBzb2FwUmVzcG9uc2VCb2R5ID0gbnVsbDsKICAgICAgICAgTWVzc2FnZSBvdXRwdXRNZXNzYWdlID0gbnVsbDsKICAgICAgICAgaWYgKGlzUmVxdWVzdFJlc3BvbnNlKSB7CiAgICAgICAgICAgICBzb2FwUmVzcG9uc2VCb2R5ID0gZ2V0U09BUFJlc3BvbnNlQm9keSgpOwogICAgICAgICAgICAgaWYgKGlzT3BlcmF0aW9uRG9jdW1lbnRMaXRlcmFsKHN0eWxlQW5kVXNlKSAmJiAoc29hcFJlc3BvbnNlQm9keS5nZXROYW1lc3BhY2UoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcucjI3MTYiLCBuZXcgT2JqZWN0W117InNvYXBiaW5kOmJvZHkiLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICAgICAgd2FybmluZyhzb2FwUmVzcG9uc2VCb2R5LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19SXzI3MTYoInNvYXBiaW5kOmJvZHkiLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvdXRwdXRNZXNzYWdlID0gZ2V0T3V0cHV0TWVzc2FnZSgpOworICAgICAgICAgICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uob3V0cHV0TWVzc2FnZSwgZXJyUmVjZWl2ZXIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIGVyclJlY2VpdmVyKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vaWdub3JlIG9wZXJhdGlvbiBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSByb290IHBhcnQKLSAgICAgICAgaWYoIXZhbGlkYXRlTWltZVBhcnRzKGdldE1pbWVQYXJ0cyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKSkpIHx8CisgICAgICAgIGlmICghdmFsaWRhdGVNaW1lUGFydHMoZ2V0TWltZVBhcnRzKGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXRJbnB1dCgpKSkgfHwKICAgICAgICAgICAgICAgICAhdmFsaWRhdGVNaW1lUGFydHMoZ2V0TWltZVBhcnRzKGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXRPdXRwdXQoKSkpKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKIAotICAgICAgICBpZighdmFsaWRhdGVCb2R5UGFydHMoaW5mby5iaW5kaW5nT3BlcmF0aW9uKSl7CisgICAgICAgIGlmICghdmFsaWRhdGVCb2R5UGFydHMoaW5mby5iaW5kaW5nT3BlcmF0aW9uKSkgewogICAgICAgICAgICAgLy8gQlAgMS4xCiAgICAgICAgICAgICAvLyBSMjIwNCAgIEEgZG9jdW1lbnQtbGl0ZXJhbCBiaW5kaW5nIGluIGEgREVTQ1JJUFRJT04gTVVTVCByZWZlciwgaW4gZWFjaCBvZiBpdHMgc29hcGJpbmQ6Ym9keSBlbGVtZW50KHMpLAogICAgICAgICAgICAgLy8gb25seSB0byB3c2RsOnBhcnQgZWxlbWVudChzKSB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIHVzaW5nIHRoZSBlbGVtZW50IGF0dHJpYnV0ZS4KIAogICAgICAgICAgICAgLy8gUjIyMDMgICBBbiBycGMtbGl0ZXJhbCBiaW5kaW5nIGluIGEgREVTQ1JJUFRJT04gTVVTVCByZWZlciwgaW4gaXRzIHNvYXBiaW5kOmJvZHkgZWxlbWVudChzKSwKICAgICAgICAgICAgIC8vIG9ubHkgdG8gd3NkTmw6cGFydCBlbGVtZW50KHMpIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgdXNpbmcgdGhlIHR5cGUgYXR0cmlidXRlLgotICAgICAgICAgICAgaWYoaXNPcGVyYXRpb25Eb2N1bWVudExpdGVyYWwoc3R5bGVBbmRVc2UpKQotICAgICAgICAgICAgICAgIGlmKGV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24uY2Fubm90SGFuZGxlVHlwZU1lc3NhZ2VQYXJ0IiwgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKGlzT3BlcmF0aW9uRG9jdW1lbnRMaXRlcmFsKHN0eWxlQW5kVXNlKSkKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyhpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fQ0FOTk9UX0hBTkRMRV9UWVBFX01FU1NBR0VfUEFSVChpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgid3NkbG1vZGVsZXIuaW52YWxpZC5kb2NsaXRvcGVyYXRpb24iLCBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmKGlzT3BlcmF0aW9uUnBjTGl0ZXJhbChzdHlsZUFuZFVzZSkpIHsKLSAgICAgICAgICAgICAgICBpZihleHRlbnNpb25zKQotICAgICAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmNhbm5vdEhhbmRsZUVsZW1lbnRNZXNzYWdlUGFydCIsIGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoaW5mby5wb3J0VHlwZU9wZXJhdGlvbiwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfRE9DTElUT1BFUkFUSU9OKGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICBlbHNlIGlmIChpc09wZXJhdGlvblJwY0xpdGVyYWwoc3R5bGVBbmRVc2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNFeHRlbnNpb25Nb2RlKCkpCisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoaW5mby5wb3J0VHlwZU9wZXJhdGlvbiwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfRUxFTUVOVF9NRVNTQUdFX1BBUlQoaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQucnBjbGl0b3BlcmF0aW9uIiwgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBlcnJvcihpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9SUENMSVRPUEVSQVRJT04oaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CkBAIC02ODksMjIgKzc1MCwyMiBAQAogICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBwYXJhbWV0ZXJMaXN0ID0gZ2V0UGFyYW1ldGVyT3JkZXIoKTsKIAogICAgICAgICAvL2JpbmRpbmcgaXMgaW52YWxpZCBpbiB0aGUgd3NkbCwgaWdub3JlIHRoZSBvcGVyYXRpb24uCi0gICAgICAgIGlmKCFzZXRNZXNzYWdlUGFydHNCaW5kaW5nKHN0eWxlQW5kVXNlKSkKKyAgICAgICAgaWYgKCFzZXRNZXNzYWdlUGFydHNCaW5kaW5nKHN0eWxlQW5kVXNlKSkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogCiAgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMgPSBudWxsOwogICAgICAgICBib29sZWFuIHVud3JhcHBhYmxlID0gaXNVbndyYXBwYWJsZSgpOwogICAgICAgICBpbmZvLm9wZXJhdGlvbi5zZXRXcmFwcGVkKHVud3JhcHBhYmxlKTsKLSAgICAgICAgaWYoaXNPcGVyYXRpb25Eb2N1bWVudExpdGVyYWwoc3R5bGVBbmRVc2UpKXsKKyAgICAgICAgaWYgKGlzT3BlcmF0aW9uRG9jdW1lbnRMaXRlcmFsKHN0eWxlQW5kVXNlKSkgewogICAgICAgICAgICAgcGFyYW1zID0gZ2V0RG9jbGl0UGFyYW1ldGVycyhyZXF1ZXN0LCByZXNwb25zZSwgcGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH1lbHNlIGlmKGlzT3BlcmF0aW9uUnBjTGl0ZXJhbChzdHlsZUFuZFVzZSkpeworICAgICAgICB9IGVsc2UgaWYgKGlzT3BlcmF0aW9uUnBjTGl0ZXJhbChzdHlsZUFuZFVzZSkpIHsKICAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKTsKICAgICAgICAgICAgIEJsb2NrIHJlcUJsb2NrID0gbnVsbDsKICAgICAgICAgICAgIGlmIChpbnB1dE1lc3NhZ2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoZ2V0UmVxdWVzdE5hbWVzcGFjZVVSSShzb2FwUmVxdWVzdEJvZHkpLCBvcGVyYXRpb25OYW1lKTsKICAgICAgICAgICAgICAgICBScGNMaXRTdHJ1Y3R1cmUgcnBjU3RydWN0ID0gbmV3IFJwY0xpdFN0cnVjdHVyZShuYW1lLCBnZXRKQVhCTW9kZWxCdWlsZGVyKCkuZ2V0SkFYQk1vZGVsKCkpOwogICAgICAgICAgICAgICAgIHJwY1N0cnVjdC5zZXRKYXZhVHlwZShuZXcgSmF2YVNpbXBsZVR5cGUoImNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuUnBjTGl0UGF5bG9hZCIsIG51bGwpKTsKLSAgICAgICAgICAgICAgICByZXFCbG9jayA9IG5ldyBCbG9jayhuYW1lLCBycGNTdHJ1Y3QpOworICAgICAgICAgICAgICAgIHJlcUJsb2NrID0gbmV3IEJsb2NrKG5hbWUsIHJwY1N0cnVjdCwgaW5wdXRNZXNzYWdlKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZEJvZHlCbG9jayhyZXFCbG9jayk7CiAgICAgICAgICAgICB9CiAKQEAgLTcxMywzMSArNzc0LDMxIEBACiAgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZShnZXRSZXNwb25zZU5hbWVzcGFjZVVSSShzb2FwUmVzcG9uc2VCb2R5KSwgb3BlcmF0aW9uTmFtZSArICJSZXNwb25zZSIpOwogICAgICAgICAgICAgICAgIFJwY0xpdFN0cnVjdHVyZSBycGNTdHJ1Y3QgPSBuZXcgUnBjTGl0U3RydWN0dXJlKG5hbWUsIGdldEpBWEJNb2RlbEJ1aWxkZXIoKS5nZXRKQVhCTW9kZWwoKSk7CiAgICAgICAgICAgICAgICAgcnBjU3RydWN0LnNldEphdmFUeXBlKG5ldyBKYXZhU2ltcGxlVHlwZSgiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5ScGNMaXRQYXlsb2FkIiwgbnVsbCkpOwotICAgICAgICAgICAgICAgIHJlc0Jsb2NrID0gbmV3IEJsb2NrKG5hbWUsIHJwY1N0cnVjdCk7CisgICAgICAgICAgICAgICAgcmVzQmxvY2sgPSBuZXcgQmxvY2sobmFtZSwgcnBjU3RydWN0LCBvdXRwdXRNZXNzYWdlKTsKICAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRCb2R5QmxvY2socmVzQmxvY2spOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGFyYW1zID0gZ2V0UnBjTGl0UGFyYW1ldGVycyhyZXF1ZXN0LCByZXNwb25zZSwgcmVxQmxvY2ssIHJlc0Jsb2NrLCBwYXJhbWV0ZXJMaXN0KTsKICAgICAgICAgfQogCiAKLSAgICAgICAgaWYoIXZhbGlkYXRlUGFyYW1ldGVyTmFtZShwYXJhbXMpKSB7CisgICAgICAgIGlmICghdmFsaWRhdGVQYXJhbWV0ZXJOYW1lKHBhcmFtcykpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY3JlYXRlIGEgZGVmaW5pdGl2ZSBsaXN0IG9mIHBhcmFtZXRlcnMgdG8gbWF0Y2ggd2hhdCB3ZSdkIGxpa2UgdG8gZ2V0CiAgICAgICAgIC8vIGluIHRoZSBqYXZhIGludGVyZmFjZSAod2hpY2ggaXMgZ2VuZXJhdGVkIG11Y2ggbGF0ZXIpLCBwYXJhbWV0ZXJPcmRlcgogICAgICAgICBMaXN0PFBhcmFtZXRlcj4gZGVmaW5pdGl2ZVBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW06IHBhcmFtcykgewotICAgICAgICAgICAgaWYocGFyYW0uaXNSZXR1cm4oKSl7CisgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgICAgICBpZiAocGFyYW0uaXNSZXR1cm4oKSkgewogICAgICAgICAgICAgICAgIGluZm8ub3BlcmF0aW9uLnNldFByb3BlcnR5KFdTRExfUkVTVUxUX1BBUkFNRVRFUiwgcGFyYW0pOwogICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZFBhcmFtZXRlcihwYXJhbSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwYXJhbS5pc0lOKCkpeworICAgICAgICAgICAgaWYgKHBhcmFtLmlzSU4oKSkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgICAgIH1lbHNlIGlmKHBhcmFtLmlzT1VUKCkpeworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5pc09VVCgpKSB7CiAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgICAgIH1lbHNlIGlmKHBhcmFtLmlzSU5PVVQoKSl7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmlzSU5PVVQoKSkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkUGFyYW1ldGVyKHBhcmFtKTsKICAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRQYXJhbWV0ZXIocGFyYW0pOwogICAgICAgICAgICAgfQpAQCAtNzU0LDE3ICs4MTUsMTcgQEAKICAgICAgICAgUU5hbWUgYm9keSA9IFZPSURfQk9EWUJMT0NLOwogICAgICAgICBRTmFtZSBvcE5hbWUgPSBudWxsOwogCi0gICAgICAgIGlmKGJiLmhhc05leHQoKSl7CisgICAgICAgIGlmIChiYi5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIGJvZHkgPSBiYi5uZXh0KCkuZ2V0TmFtZSgpOwogICAgICAgICAgICAgb3BOYW1lID0gdW5pcXVlQm9keUJsb2Nrcy5nZXQoYm9keSk7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy90aGVyZSBpcyBubyBib2R5IGJsb2NrCiAgICAgICAgICAgICBib2R5ID0gVk9JRF9CT0RZQkxPQ0s7CiAgICAgICAgICAgICBvcE5hbWUgPSB1bmlxdWVCb2R5QmxvY2tzLmdldChWT0lEX0JPRFlCTE9DSyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYob3BOYW1lICE9IG51bGwpewotICAgICAgICAgICAgZmFpbCgid3NkbG1vZGVsZXIubm9uVW5pcXVlLmJvZHkiLCBuZXcgT2JqZWN0W117aW5mby5wb3J0LmdldE5hbWUoKSwgaW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBvcE5hbWUsIGJvZHl9KTsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIGlmIChvcE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgZXJyb3IoaW5mby5wb3J0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfTk9OX1VOSVFVRV9CT0RZKGluZm8ucG9ydC5nZXROYW1lKCksIGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKSwgb3BOYW1lLCBib2R5KSk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1bmlxdWVCb2R5QmxvY2tzLnB1dChib2R5LCBpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCkpOwogICAgICAgICB9CiAKQEAgLTc4MCw5OCArODQxLDcxIEBACiAgICAgICAgIC8vc2V0IEFzeW5jIHByb3BlcnR5CiAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGluZm8ucG9ydC5yZXNvbHZlQmluZGluZyhkb2N1bWVudCk7CiAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYmluZGluZy5yZXNvbHZlUG9ydFR5cGUoZG9jdW1lbnQpOwotICAgICAgICBpZihpc0FzeW5jKHBvcnRUeXBlLCBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uKSl7CisgICAgICAgIGlmIChpc0FzeW5jKHBvcnRUeXBlLCBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uKSkgewogICAgICAgICAgICAgYWRkQXN5bmNPcGVyYXRpb25zKGluZm8ub3BlcmF0aW9uLCBzdHlsZUFuZFVzZSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gaW5mby5vcGVyYXRpb247CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1zCi0gICAgICogQHJldHVybgotICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlck5hbWUoTGlzdDxQYXJhbWV0ZXI+IHBhcmFtcykgeworICAgICAgICBpZiAob3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCiAgICAgICAgIE1lc3NhZ2UgbXNnID0gZ2V0SW5wdXRNZXNzYWdlKCk7Ci0gICAgICAgIGZvcihQYXJhbWV0ZXIgcGFyYW0gOiBwYXJhbXMpewotICAgICAgICAgICAgaWYocGFyYW0uaXNPVVQoKSkKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS5pc09VVCgpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYocGFyYW0uZ2V0Q3VzdG9tTmFtZSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgIGlmKGdldEVudmlyb25tZW50KCkuZ2V0TmFtZXMoKS5pc0phdmFSZXNlcnZlZFdvcmQocGFyYW0uZ2V0Q3VzdG9tTmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLmN1c3RvbU5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117aW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBwYXJhbS5nZXRDdXN0b21OYW1lKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgid3NkbG1vZGVsZXIuaW52YWxpZC5vcGVyYXRpb24uamF2YVJlc2VydmVkV29yZE5vdEFsbG93ZWQuY3VzdG9tTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCksIHBhcmFtLmdldEN1c3RvbU5hbWUoKX0pOworICAgICAgICAgICAgaWYgKHBhcmFtLmdldEN1c3RvbU5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKE5hbWVzLmlzSmF2YVJlc2VydmVkV29yZChwYXJhbS5nZXRDdXN0b21OYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yKHBhcmFtLmdldEVudGl0eSgpLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX0NVU1RPTV9OQU1FKGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKSwgcGFyYW0uZ2V0Q3VzdG9tTmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvL3Byb2Nlc3MgZG9jbGl0IHdyYXBwZXIgc3R5bGUKLSAgICAgICAgICAgIGlmKHBhcmFtLmlzRW1iZWRkZWQoKSAmJiAhKHBhcmFtLmdldEJsb2NrKCkuZ2V0VHlwZSgpIGluc3RhbmNlb2YgUnBjTGl0U3RydWN0dXJlKSl7Ci0gICAgICAgICAgICAgICAgaWYoZ2V0RW52aXJvbm1lbnQoKS5nZXROYW1lcygpLmlzSmF2YVJlc2VydmVkV29yZChwYXJhbS5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoZXh0ZW5zaW9ucykKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24uamF2YVJlc2VydmVkV29yZE5vdEFsbG93ZWQud3JhcHBlclN0eWxlIiwgbmV3IE9iamVjdFtde2luZm8ub3BlcmF0aW9uLmdldE5hbWUoKSwgcGFyYW0uZ2V0TmFtZSgpLCBwYXJhbS5nZXRCbG9jaygpLmdldE5hbWUoKX0pOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm9wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC53cmFwcGVyU3R5bGUiLCBuZXcgT2JqZWN0W117aW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBwYXJhbS5nZXROYW1lKCksIHBhcmFtLmdldEJsb2NrKCkuZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICBpZiAocGFyYW0uaXNFbWJlZGRlZCgpICYmICEocGFyYW0uZ2V0QmxvY2soKS5nZXRUeXBlKCkgaW5zdGFuY2VvZiBScGNMaXRTdHJ1Y3R1cmUpKSB7CisgICAgICAgICAgICAgICAgaWYgKE5hbWVzLmlzSmF2YVJlc2VydmVkV29yZChwYXJhbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yKHBhcmFtLmdldEVudGl0eSgpLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX1dSQVBQRVJfU1RZTEUoaW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBwYXJhbS5nZXROYW1lKCksIHBhcmFtLmdldEJsb2NrKCkuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy9ub24td3JhcHBlciBzdHlsZSBhbmQgcnBjbGl0Ci0gICAgICAgICAgICAgICAgaWYoZ2V0RW52aXJvbm1lbnQoKS5nZXROYW1lcygpLmlzSmF2YVJlc2VydmVkV29yZChwYXJhbS5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoZXh0ZW5zaW9ucykKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24uamF2YVJlc2VydmVkV29yZE5vdEFsbG93ZWQubm9uV3JhcHBlclN0eWxlIiwgbmV3IE9iamVjdFtde2luZm8ub3BlcmF0aW9uLmdldE5hbWUoKSwgbXNnLmdldE5hbWUoKSwgcGFyYW0uZ2V0TmFtZSgpfSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLm5vbldyYXBwZXJTdHlsZSIsIG5ldyBPYmplY3RbXXtpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCksIG1zZy5nZXROYW1lKCksIHBhcmFtLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgIGlmIChOYW1lcy5pc0phdmFSZXNlcnZlZFdvcmQocGFyYW0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcihwYXJhbS5nZXRFbnRpdHkoKSwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfT1BFUkFUSU9OX0pBVkFfUkVTRVJWRURfV09SRF9OT1RfQUxMT1dFRF9OT05fV1JBUFBFUl9TVFlMRShpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCksIG1zZy5nZXROYW1lKCksIHBhcmFtLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3RSZXNwb25zZSA9IGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0U3R5bGUoKSA9PSBPcGVyYXRpb25TdHlsZS5SRVFVRVNUX1JFU1BPTlNFOwotICAgICAgICBpZihpc1JlcXVlc3RSZXNwb25zZSl7CisgICAgICAgIGlmIChpc1JlcXVlc3RSZXNwb25zZSkgewogICAgICAgICAgICAgbXNnID0gZ2V0T3V0cHV0TWVzc2FnZSgpOwotICAgICAgICAgICAgZm9yKFBhcmFtZXRlciBwYXJhbSA6IHBhcmFtcyl7Ci0gICAgICAgICAgICAgICAgaWYocGFyYW0uaXNJTigpKQorICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uaXNJTigpKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZihwYXJhbS5nZXRDdXN0b21OYW1lKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGdldEVudmlyb25tZW50KCkuZ2V0TmFtZXMoKS5pc0phdmFSZXNlcnZlZFdvcmQocGFyYW0uZ2V0Q3VzdG9tTmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihleHRlbnNpb25zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24uamF2YVJlc2VydmVkV29yZE5vdEFsbG93ZWQuY3VzdG9tTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117aW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBwYXJhbS5nZXRDdXN0b21OYW1lKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm9wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC5jdXN0b21OYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCksIHBhcmFtLmdldEN1c3RvbU5hbWUoKX0pOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5nZXRDdXN0b21OYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoTmFtZXMuaXNKYXZhUmVzZXJ2ZWRXb3JkKHBhcmFtLmdldEN1c3RvbU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKHBhcmFtLmdldEVudGl0eSgpLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX0NVU1RPTV9OQU1FKGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKSwgcGFyYW0uZ2V0Q3VzdG9tTmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vcHJvY2VzcyBkb2NsaXQgd3JhcHBlciBzdHlsZQotICAgICAgICAgICAgICAgIGlmKHBhcmFtLmlzRW1iZWRkZWQoKSAmJiAhKHBhcmFtLmdldEJsb2NrKCkuZ2V0VHlwZSgpIGluc3RhbmNlb2YgUnBjTGl0U3RydWN0dXJlKSl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtLmlzUmV0dXJuKCkpCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmlzRW1iZWRkZWQoKSAmJiAhKHBhcmFtLmdldEJsb2NrKCkuZ2V0VHlwZSgpIGluc3RhbmNlb2YgUnBjTGl0U3RydWN0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uaXNSZXR1cm4oKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpZighcGFyYW0uZ2V0TmFtZSgpLmVxdWFscygicmV0dXJuIikgJiYgZ2V0RW52aXJvbm1lbnQoKS5nZXROYW1lcygpLmlzSmF2YVJlc2VydmVkV29yZChwYXJhbS5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fybigid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ09wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC53cmFwcGVyU3R5bGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2luZm8ub3BlcmF0aW9uLmdldE5hbWUoKSwgcGFyYW0uZ2V0TmFtZSgpLCBwYXJhbS5nZXRCbG9jaygpLmdldE5hbWUoKX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLndyYXBwZXJTdHlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117aW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBwYXJhbS5nZXROYW1lKCksIHBhcmFtLmdldEJsb2NrKCkuZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW0uZ2V0TmFtZSgpLmVxdWFscygicmV0dXJuIikgJiYgTmFtZXMuaXNKYXZhUmVzZXJ2ZWRXb3JkKHBhcmFtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKHBhcmFtLmdldEVudGl0eSgpLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX1dSQVBQRVJfU1RZTEUoaW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBwYXJhbS5nZXROYW1lKCksIHBhcmFtLmdldEJsb2NrKCkuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgaWYocGFyYW0uaXNSZXR1cm4oKSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uaXNSZXR1cm4oKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgICAgIC8vbm9uLXdyYXBwZXIgc3R5bGUgYW5kIHJwY2xpdAotICAgICAgICAgICAgICAgICAgICBpZihnZXRFbnZpcm9ubWVudCgpLmdldE5hbWVzKCkuaXNKYXZhUmVzZXJ2ZWRXb3JkKHBhcmFtLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXh0ZW5zaW9ucykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLm5vbldyYXBwZXJTdHlsZSIsIG5ldyBPYmplY3RbXXtpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCksIG1zZy5nZXROYW1lKCksIHBhcmFtLmdldE5hbWUoKX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLm5vbldyYXBwZXJTdHlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117aW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBtc2cuZ2V0TmFtZSgpLCBwYXJhbS5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5hbWVzLmlzSmF2YVJlc2VydmVkV29yZChwYXJhbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihwYXJhbS5nZXRFbnRpdHkoKSwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfT1BFUkFUSU9OX0pBVkFfUkVTRVJWRURfV09SRF9OT1RfQUxMT1dFRF9OT05fV1JBUFBFUl9TVFlMRShpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCksIG1zZy5nZXROYW1lKCksIHBhcmFtLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtODgxLDYyICs5MTUsNTYgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVNaW1lQ29udGVudCgpIHsKICAgICAgICAgLy9maXJzdCB3ZSBsb29rIGF0IGJpbmRpbmcgb3BlcmF0aW9uCi0gICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0N1c3RvbWl6YXRpb24gPSAoSkFYV1NCaW5kaW5nKWdldEV4dGVuc2lvbk9mVHlwZShpbmZvLmJpbmRpbmdPcGVyYXRpb24sIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIEJvb2xlYW4gbWltZUNvbnRlbnRNYXBwaW5nID0gKGpheHdzQ3VzdG9taXphdGlvbiAhPSBudWxsKT9qYXh3c0N1c3RvbWl6YXRpb24uaXNFbmFibGVNaW1lQ29udGVudE1hcHBpbmcoKTpudWxsOwotICAgICAgICBpZihtaW1lQ29udGVudE1hcHBpbmcgIT0gbnVsbCkKKyAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQ3VzdG9taXphdGlvbiA9IChKQVhXU0JpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShpbmZvLmJpbmRpbmdPcGVyYXRpb24sIEpBWFdTQmluZGluZy5jbGFzcyk7CisgICAgICAgIEJvb2xlYW4gbWltZUNvbnRlbnRNYXBwaW5nID0gKGpheHdzQ3VzdG9taXphdGlvbiAhPSBudWxsKSA/IGpheHdzQ3VzdG9taXphdGlvbi5pc0VuYWJsZU1pbWVDb250ZW50TWFwcGluZygpIDogbnVsbDsKKyAgICAgICAgaWYgKG1pbWVDb250ZW50TWFwcGluZyAhPSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG1pbWVDb250ZW50TWFwcGluZzsKIAogICAgICAgICAvL3RoZW4gaW4gd3NkbDpiaW5kaW5nCiAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGluZm8ucG9ydC5yZXNvbHZlQmluZGluZyhpbmZvLmRvY3VtZW50KTsKLSAgICAgICAgamF4d3NDdXN0b21pemF0aW9uID0gKEpBWFdTQmluZGluZylnZXRFeHRlbnNpb25PZlR5cGUoYmluZGluZywgSkFYV1NCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgbWltZUNvbnRlbnRNYXBwaW5nID0gKGpheHdzQ3VzdG9taXphdGlvbiAhPSBudWxsKT9qYXh3c0N1c3RvbWl6YXRpb24uaXNFbmFibGVNaW1lQ29udGVudE1hcHBpbmcoKTpudWxsOwotICAgICAgICBpZihtaW1lQ29udGVudE1hcHBpbmcgIT0gbnVsbCkKKyAgICAgICAgamF4d3NDdXN0b21pemF0aW9uID0gKEpBWFdTQmluZGluZykgZ2V0RXh0ZW5zaW9uT2ZUeXBlKGJpbmRpbmcsIEpBWFdTQmluZGluZy5jbGFzcyk7CisgICAgICAgIG1pbWVDb250ZW50TWFwcGluZyA9IChqYXh3c0N1c3RvbWl6YXRpb24gIT0gbnVsbCkgPyBqYXh3c0N1c3RvbWl6YXRpb24uaXNFbmFibGVNaW1lQ29udGVudE1hcHBpbmcoKSA6IG51bGw7CisgICAgICAgIGlmIChtaW1lQ29udGVudE1hcHBpbmcgIT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBtaW1lQ29udGVudE1hcHBpbmc7CiAKICAgICAgICAgLy9hdCBsYXN0IGxvb2sgaW4gd3NkbDpkZWZpbml0aW9ucwotICAgICAgICBqYXh3c0N1c3RvbWl6YXRpb24gPSAoSkFYV1NCaW5kaW5nKWdldEV4dGVuc2lvbk9mVHlwZShpbmZvLmRvY3VtZW50LmdldERlZmluaXRpb25zKCksIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIG1pbWVDb250ZW50TWFwcGluZyA9IChqYXh3c0N1c3RvbWl6YXRpb24gIT0gbnVsbCk/amF4d3NDdXN0b21pemF0aW9uLmlzRW5hYmxlTWltZUNvbnRlbnRNYXBwaW5nKCk6bnVsbDsKLSAgICAgICAgaWYobWltZUNvbnRlbnRNYXBwaW5nICE9IG51bGwpCisgICAgICAgIGpheHdzQ3VzdG9taXphdGlvbiA9IChKQVhXU0JpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShpbmZvLmRvY3VtZW50LmdldERlZmluaXRpb25zKCksIEpBWFdTQmluZGluZy5jbGFzcyk7CisgICAgICAgIG1pbWVDb250ZW50TWFwcGluZyA9IChqYXh3c0N1c3RvbWl6YXRpb24gIT0gbnVsbCkgPyBqYXh3c0N1c3RvbWl6YXRpb24uaXNFbmFibGVNaW1lQ29udGVudE1hcHBpbmcoKSA6IG51bGw7CisgICAgICAgIGlmIChtaW1lQ29udGVudE1hcHBpbmcgIT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBtaW1lQ29udGVudE1hcHBpbmc7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKgotICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBhcHBseU9wZXJhdGlvbk5hbWVDdXN0b21pemF0aW9uKCkgewotICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NDdXN0b21pemF0aW9uID0gKEpBWFdTQmluZGluZylnZXRFeHRlbnNpb25PZlR5cGUoaW5mby5wb3J0VHlwZU9wZXJhdGlvbiwgSkFYV1NCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSAoamF4d3NDdXN0b21pemF0aW9uICE9IG51bGwpPygoamF4d3NDdXN0b21pemF0aW9uLmdldE1ldGhvZE5hbWUoKSAhPSBudWxsKT9qYXh3c0N1c3RvbWl6YXRpb24uZ2V0TWV0aG9kTmFtZSgpLmdldE5hbWUoKTpudWxsKTpudWxsOwotICAgICAgICBpZihvcGVyYXRpb25OYW1lICE9IG51bGwpewotICAgICAgICAgICAgaWYoZ2V0RW52aXJvbm1lbnQoKS5nZXROYW1lcygpLmlzSmF2YVJlc2VydmVkV29yZChvcGVyYXRpb25OYW1lKSl7Ci0gICAgICAgICAgICAgICAgaWYoZXh0ZW5zaW9ucykKLSAgICAgICAgICAgICAgICAgICAgd2Fybigid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ09wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC5jdXN0b21pemVkT3BlcmF0aW9uTmFtZSIsIG5ldyBPYmplY3RbXXtpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCksIG9wZXJhdGlvbk5hbWV9KTsKKyAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQ3VzdG9taXphdGlvbiA9IChKQVhXU0JpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBKQVhXU0JpbmRpbmcuY2xhc3MpOworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IChqYXh3c0N1c3RvbWl6YXRpb24gIT0gbnVsbCkgPyAoKGpheHdzQ3VzdG9taXphdGlvbi5nZXRNZXRob2ROYW1lKCkgIT0gbnVsbCkgPyBqYXh3c0N1c3RvbWl6YXRpb24uZ2V0TWV0aG9kTmFtZSgpLmdldE5hbWUoKSA6IG51bGwpIDogbnVsbDsKKyAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKE5hbWVzLmlzSmF2YVJlc2VydmVkV29yZChvcGVyYXRpb25OYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpKQorICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKGluZm8ucG9ydFR5cGVPcGVyYXRpb24sIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfQ1VTVE9NSVpFRF9PUEVSQVRJT05fTkFNRShpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCksIG9wZXJhdGlvbk5hbWUpKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLmN1c3RvbWl6ZWRPcGVyYXRpb25OYW1lIiwgbmV3IE9iamVjdFtde2luZm8ub3BlcmF0aW9uLmdldE5hbWUoKSwgb3BlcmF0aW9uTmFtZX0pOworICAgICAgICAgICAgICAgICAgICBlcnJvcihpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX0NVU1RPTUlaRURfT1BFUkFUSU9OX05BTUUoaW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLCBvcGVyYXRpb25OYW1lKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbmZvLm9wZXJhdGlvbi5zZXRDdXN0b21pemVkTmFtZShvcGVyYXRpb25OYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmKGdldEVudmlyb25tZW50KCkuZ2V0TmFtZXMoKS5pc0phdmFSZXNlcnZlZFdvcmQoaW5mby5vcGVyYXRpb24uZ2V0SmF2YU1ldGhvZE5hbWUoKSkpewotICAgICAgICAgICAgaWYoZXh0ZW5zaW9ucykKLSAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLm9wZXJhdGlvbk5hbWUiLCBuZXcgT2JqZWN0W117aW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgIGlmIChOYW1lcy5pc0phdmFSZXNlcnZlZFdvcmQoaW5mby5vcGVyYXRpb24uZ2V0SmF2YU1ldGhvZE5hbWUoKSkpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpKQorICAgICAgICAgICAgICAgIHdhcm5pbmcoaW5mby5wb3J0VHlwZU9wZXJhdGlvbiwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0pBVkFfUkVTRVJWRURfV09SRF9OT1RfQUxMT1dFRF9PUEVSQVRJT05fTkFNRShpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmYWlsKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm9wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC5vcGVyYXRpb25OYW1lIiwgbmV3IE9iamVjdFtde2luZm8ub3BlcmF0aW9uLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgIGVycm9yKGluZm8ucG9ydFR5cGVPcGVyYXRpb24sIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfT1BFUkFUSU9OX05BTUUoaW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBc3luY09wZXJhdGlvbk5hbWUoT3BlcmF0aW9uIG9wZXJhdGlvbil7CisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBc3luY09wZXJhdGlvbk5hbWUoT3BlcmF0aW9uIG9wZXJhdGlvbikgewogICAgICAgICBTdHJpbmcgbmFtZSA9IG9wZXJhdGlvbi5nZXRDdXN0b21pemVkTmFtZSgpOwotICAgICAgICBpZihuYW1lID09IG51bGwpCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCiAgICAgICAgICAgICBuYW1lID0gb3BlcmF0aW9uLmdldFVuaXF1ZU5hbWUoKTsKICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfQpAQCAtOTQ2LDQxICs5NzQsMzIgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYWRkQXN5bmNPcGVyYXRpb25zKE9wZXJhdGlvbiBzeW5jT3BlcmF0aW9uLCBTdHlsZUFuZFVzZSBzdHlsZUFuZFVzZSkgewogICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gY3JlYXRlQXN5bmNPcGVyYXRpb24oc3luY09wZXJhdGlvbiwgc3R5bGVBbmRVc2UsIEFzeW5jT3BlcmF0aW9uVHlwZS5QT0xMSU5HKTsKLSAgICAgICAgaWYob3BlcmF0aW9uICE9IG51bGwpCisgICAgICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKICAgICAgICAgICAgIGluZm8ubW9kZWxQb3J0LmFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwogCiAgICAgICAgIG9wZXJhdGlvbiA9IGNyZWF0ZUFzeW5jT3BlcmF0aW9uKHN5bmNPcGVyYXRpb24sIHN0eWxlQW5kVXNlLCBBc3luY09wZXJhdGlvblR5cGUuQ0FMTEJBQ0spOwotICAgICAgICBpZihvcGVyYXRpb24gIT0gbnVsbCkKKyAgICAgICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQogICAgICAgICAgICAgaW5mby5tb2RlbFBvcnQuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3luY09wZXJhdGlvbgotICAgICAqIEBwYXJhbSBzdHlsZUFuZFVzZQotICAgICAqIEBwYXJhbSBhc3luY1R5cGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCiAgICAgcHJpdmF0ZSBPcGVyYXRpb24gY3JlYXRlQXN5bmNPcGVyYXRpb24oT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24sIFN0eWxlQW5kVXNlIHN0eWxlQW5kVXNlLCBBc3luY09wZXJhdGlvblR5cGUgYXN5bmNUeXBlKSB7CiAgICAgICAgIGJvb2xlYW4gaXNSZXF1ZXN0UmVzcG9uc2UgPSBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldFN0eWxlKCkgPT0gT3BlcmF0aW9uU3R5bGUuUkVRVUVTVF9SRVNQT05TRTsKLSAgICAgICAgaWYoIWlzUmVxdWVzdFJlc3BvbnNlKQorICAgICAgICBpZiAoIWlzUmVxdWVzdFJlc3BvbnNlKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCk7Ci0gICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKCk7CiAKICAgICAgICAgLy9jcmVhdGUgYXN5bmMgb3BlcmF0aW9ucwotICAgICAgICBBc3luY09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQXN5bmNPcGVyYXRpb24oaW5mby5vcGVyYXRpb24pOworICAgICAgICBBc3luY09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQXN5bmNPcGVyYXRpb24oaW5mby5vcGVyYXRpb24sIGluZm8uYmluZGluZ09wZXJhdGlvbik7CiAKICAgICAgICAgLy9jcmVhdGlvbiB0aGUgYXN5bmMgb3BlcmF0aW9uIG5hbWU6IG9wZXJhdGlvbk5hbWUrQXN5bmMgb3IgY3VzdG9taXplZCBuYW1lCiAgICAgICAgIC8vb3BlcmF0aW9uLnNldE5hbWUobmV3IFFOYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIGdldEFzeW5jT3BlcmF0aW9uTmFtZShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBvcGVyYXRpb24pKSk7Ci0gICAgICAgIGlmKGFzeW5jVHlwZS5lcXVhbHMoQXN5bmNPcGVyYXRpb25UeXBlLkNBTExCQUNLKSkKLSAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRVbmlxdWVOYW1lKGluZm8ub3BlcmF0aW9uLmdldFVuaXF1ZU5hbWUoKSsiX2FzeW5jX2NhbGxiYWNrIik7Ci0gICAgICAgIGVsc2UgaWYoYXN5bmNUeXBlLmVxdWFscyhBc3luY09wZXJhdGlvblR5cGUuUE9MTElORykpCi0gICAgICAgICAgICBvcGVyYXRpb24uc2V0VW5pcXVlTmFtZShpbmZvLm9wZXJhdGlvbi5nZXRVbmlxdWVOYW1lKCkrIl9hc3luY19wb2xsaW5nIik7CisgICAgICAgIGlmIChhc3luY1R5cGUuZXF1YWxzKEFzeW5jT3BlcmF0aW9uVHlwZS5DQUxMQkFDSykpCisgICAgICAgICAgICBvcGVyYXRpb24uc2V0VW5pcXVlTmFtZShpbmZvLm9wZXJhdGlvbi5nZXRVbmlxdWVOYW1lKCkgKyAiX2FzeW5jX2NhbGxiYWNrIik7CisgICAgICAgIGVsc2UgaWYgKGFzeW5jVHlwZS5lcXVhbHMoQXN5bmNPcGVyYXRpb25UeXBlLlBPTExJTkcpKQorICAgICAgICAgICAgb3BlcmF0aW9uLnNldFVuaXF1ZU5hbWUoaW5mby5vcGVyYXRpb24uZ2V0VW5pcXVlTmFtZSgpICsgIl9hc3luY19wb2xsaW5nIik7CiAKICAgICAgICAgc2V0RG9jdW1lbnRhdGlvbklmUHJlc2VudCgKLSAgICAgICAgICAgIG9wZXJhdGlvbiwKLSAgICAgICAgICAgIGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbigpKTsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKCkpOwogCiAgICAgICAgIG9wZXJhdGlvbi5zZXRBc3luY1R5cGUoYXN5bmNUeXBlKTsKICAgICAgICAgb3BlcmF0aW9uLnNldFNPQVBBY3Rpb24oaW5mby5vcGVyYXRpb24uZ2V0U09BUEFjdGlvbigpKTsKQEAgLTk4OSwzMiArMTAwOCwzNSBAQAogICAgICAgICBTT0FQQm9keSBzb2FwUmVxdWVzdEJvZHkgPSBnZXRTT0FQUmVxdWVzdEJvZHkoKTsKIAogICAgICAgICBNZXNzYWdlIGlucHV0TWVzc2FnZSA9IGdldElucHV0TWVzc2FnZSgpOworICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dE1lc3NhZ2UsIGVyclJlY2VpdmVyKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwgZXJyUmVjZWl2ZXIpOwogCiAgICAgICAgIFNPQVBCb2R5IHNvYXBSZXNwb25zZUJvZHkgPSBudWxsOwogICAgICAgICBNZXNzYWdlIG91dHB1dE1lc3NhZ2UgPSBudWxsOwogICAgICAgICBpZiAoaXNSZXF1ZXN0UmVzcG9uc2UpIHsKICAgICAgICAgICAgIHNvYXBSZXNwb25zZUJvZHkgPSBnZXRTT0FQUmVzcG9uc2VCb2R5KCk7CiAgICAgICAgICAgICBvdXRwdXRNZXNzYWdlID0gZ2V0T3V0cHV0TWVzc2FnZSgpOworICAgICAgICAgICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uob3V0cHV0TWVzc2FnZSwgZXJyUmVjZWl2ZXIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUHJvY2VzcyBwYXJhbWV0ZXJPcmRlciBhbmQgZ2V0IHRoZSBwYXJhbWV0ZXJMaXN0CiAgICAgICAgIGphdmEudXRpbC5MaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IGdldEFzeW5QYXJhbWV0ZXJPcmRlcigpOwogCiAgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBpblBhcmFtZXRlcnMgPSBudWxsOwotICAgICAgICBpZihpc09wZXJhdGlvbkRvY3VtZW50TGl0ZXJhbChzdHlsZUFuZFVzZSkpeworICAgICAgICBpZiAoaXNPcGVyYXRpb25Eb2N1bWVudExpdGVyYWwoc3R5bGVBbmRVc2UpKSB7CiAgICAgICAgICAgICBpblBhcmFtZXRlcnMgPSBnZXRSZXF1ZXN0UGFyYW1ldGVycyhyZXF1ZXN0LCBwYXJhbWV0ZXJMaXN0KTsKICAgICAgICAgICAgIC8vIG91dFBhcmFtZXRlcnMgPSBnZXRSZXNwb25zZVBhcmFtZXRlcnMocmVzcG9uc2UpOwogICAgICAgICAgICAgLy8gcmUtY3JlYXRlIHBhcmFtZXRlckxpc3Qgd2l0aCB1bndyYXBwZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgaWYodW53cmFwcGFibGUpeworICAgICAgICAgICAgaWYgKHVud3JhcHBhYmxlKSB7CiAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHVud3JhcHBlZFBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBpZihpbnB1dE1lc3NhZ2UgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0TWVzc2FnZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1lc3NhZ2VQYXJ0PiBwYXJ0cyA9IGlucHV0TWVzc2FnZS5wYXJ0cygpOwotICAgICAgICAgICAgICAgICAgICBpZihwYXJ0cy5oYXNOZXh0KCkpeworICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUGFydCBwYXJ0ID0gcGFydHMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgSkFYQlR5cGUgamF4YlR5cGUgPSBnZXRKQVhCVHlwZShwYXJ0LmdldERlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBKQVhCVHlwZSBqYXhiVHlwZSA9IGdldEpBWEJUeXBlKHBhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxKQVhCUHJvcGVydHk+IG1lbWJlckxpc3QgPSBqYXhiVHlwZS5nZXRXcmFwcGVyQ2hpbGRyZW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPEpBWEJQcm9wZXJ0eT4gcHJvcHMgPSBtZW1iZXJMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShwcm9wcy5oYXNOZXh0KCkpeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHByb3BzLmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWEJQcm9wZXJ0eSBwcm9wID0gcHJvcHMubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBlZFBhcmFtZXRlckxpc3QuYWRkKHByb3AuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMDI0LDE0ICsxMDQ2LDE0IEBACiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5jbGVhcigpOwogICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKHVud3JhcHBlZFBhcmFtZXRlckxpc3QpOwogICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZSBpZihpc09wZXJhdGlvblJwY0xpdGVyYWwoc3R5bGVBbmRVc2UpKXsKKyAgICAgICAgfSBlbHNlIGlmIChpc09wZXJhdGlvblJwY0xpdGVyYWwoc3R5bGVBbmRVc2UpKSB7CiAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCk7CiAgICAgICAgICAgICBCbG9jayByZXFCbG9jayA9IG51bGw7CiAgICAgICAgICAgICBpZiAoaW5wdXRNZXNzYWdlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKGdldFJlcXVlc3ROYW1lc3BhY2VVUkkoc29hcFJlcXVlc3RCb2R5KSwgb3BlcmF0aW9uTmFtZSk7CiAgICAgICAgICAgICAgICAgUnBjTGl0U3RydWN0dXJlIHJwY1N0cnVjdCA9IG5ldyBScGNMaXRTdHJ1Y3R1cmUobmFtZSwgZ2V0SkFYQk1vZGVsQnVpbGRlcigpLmdldEpBWEJNb2RlbCgpKTsKICAgICAgICAgICAgICAgICBycGNTdHJ1Y3Quc2V0SmF2YVR5cGUobmV3IEphdmFTaW1wbGVUeXBlKCJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLlJwY0xpdFBheWxvYWQiLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgcmVxQmxvY2sgPSBuZXcgQmxvY2sobmFtZSwgcnBjU3RydWN0KTsKKyAgICAgICAgICAgICAgICByZXFCbG9jayA9IG5ldyBCbG9jayhuYW1lLCBycGNTdHJ1Y3QsIGlucHV0TWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRCb2R5QmxvY2socmVxQmxvY2spOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW5QYXJhbWV0ZXJzID0gY3JlYXRlUnBjTGl0UmVxdWVzdFBhcmFtZXRlcnMocmVxdWVzdCwgcGFyYW1ldGVyTGlzdCwgcmVxQmxvY2spOwpAQCAtMTA0MiwxNyArMTA2NCwxNyBAQAogICAgICAgICAvL2NvcHkgdGhlIHJlc3BvbnNlIGJsb2NrcyBmcm9tIHRoZSBzeW5jIG9wZXJhdGlvbgogICAgICAgICBJdGVyYXRvcjxCbG9jaz4gYmxvY2tzID0gaW5mby5vcGVyYXRpb24uZ2V0UmVzcG9uc2UoKS5nZXRCb2R5QmxvY2tzKCk7CiAKLSAgICAgICAgd2hpbGUoYmxvY2tzLmhhc05leHQoKSl7CisgICAgICAgIHdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICByZXNwb25zZS5hZGRCb2R5QmxvY2soYmxvY2tzLm5leHQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBibG9ja3MgPSBpbmZvLm9wZXJhdGlvbi5nZXRSZXNwb25zZSgpLmdldEhlYWRlckJsb2NrcygpOwotICAgICAgICB3aGlsZShibG9ja3MuaGFzTmV4dCgpKXsKKyAgICAgICAgd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlckJsb2NrKGJsb2Nrcy5uZXh0KCkpOwogICAgICAgICB9CiAKICAgICAgICAgYmxvY2tzID0gaW5mby5vcGVyYXRpb24uZ2V0UmVzcG9uc2UoKS5nZXRBdHRhY2htZW50QmxvY2tzKCk7Ci0gICAgICAgIHdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpeworICAgICAgICB3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgewogICAgICAgICAgICAgcmVzcG9uc2UuYWRkQXR0YWNobWVudEJsb2NrKGJsb2Nrcy5uZXh0KCkpOwogICAgICAgICB9CiAKQEAgLTEwNjEsMzcgKzEwODMsNDAgQEAKICAgICAgICAgLy8gaGFuZGxlIGhlYWRlcnMKICAgICAgICAgaW50IG51bU9mT3V0TXNnUGFydHMgPSBvdXRwdXRQYXJ0cy5zaXplKCk7CiAKLSAgICAgICAgaWYoaXNSZXF1ZXN0UmVzcG9uc2UpewotICAgICAgICAgICAgaWYobnVtT2ZPdXRNc2dQYXJ0cyA9PSAxKXsKKyAgICAgICAgaWYgKGlzUmVxdWVzdFJlc3BvbnNlKSB7CisgICAgICAgICAgICBpZiAobnVtT2ZPdXRNc2dQYXJ0cyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IG91dHB1dFBhcnRzLmdldCgwKTsKLSAgICAgICAgICAgICAgICBpZihpc09wZXJhdGlvbkRvY3VtZW50TGl0ZXJhbChzdHlsZUFuZFVzZSkpewotICAgICAgICAgICAgICAgICAgICBKQVhCVHlwZSB0eXBlID0gZ2V0SkFYQlR5cGUocGFydC5nZXREZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgICAgIGlmIChpc09wZXJhdGlvbkRvY3VtZW50TGl0ZXJhbChzdHlsZUFuZFVzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSkFYQlR5cGUgdHlwZSA9IGdldEpBWEJUeXBlKHBhcnQpOwogICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0UmVzcG9uc2VCZWFuKHR5cGUpOwotICAgICAgICAgICAgICAgIH1lbHNlIGlmKGlzT3BlcmF0aW9uUnBjTGl0ZXJhbChzdHlsZUFuZFVzZSkpeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPcGVyYXRpb25ScGNMaXRlcmFsKHN0eWxlQW5kVXNlKSkgewogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIEJsb2NrIHJlc0Jsb2NrID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVxdWVzdFJlc3BvbnNlICYmIG91dHB1dE1lc3NhZ2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzQmxvY2sgPSBpbmZvLm9wZXJhdGlvbi5nZXRSZXNwb25zZSgpLmdldEJvZHlCbG9ja3NNYXAoKS5nZXQobmV3IFFOYW1lKGdldFJlc3BvbnNlTmFtZXNwYWNlVVJJKHNvYXBSZXNwb25zZUJvZHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lICsgIlJlc3BvbnNlIikpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFJwY0xpdFN0cnVjdHVyZSByZXNCZWFuID0gKHJlc0Jsb2NrID09IG51bGwpID8gbnVsbCA6IChScGNMaXRTdHJ1Y3R1cmUpcmVzQmxvY2suZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBScGNMaXRTdHJ1Y3R1cmUgcmVzQmVhbiA9IChyZXNCbG9jayA9PSBudWxsKSA/IG51bGwgOiAoUnBjTGl0U3RydWN0dXJlKSByZXNCbG9jay5nZXRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIExpc3Q8UnBjTGl0TWVtYmVyPiBtZW1iZXJzID0gcmVzQmVhbi5nZXRScGNMaXRNZW1iZXJzKCk7CiAKICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLnNldFJlc3BvbnNlQmVhbihtZW1iZXJzLmdldCgwKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vY3JlYXRlIHJlc3BvbnNlIGJlYW4KICAgICAgICAgICAgICAgICBTdHJpbmcgbnNwYWNlID0gIiI7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcmVzcG9uc2VCZWFuTmFtZSA9IG5ldyBRTmFtZShuc3BhY2UsZ2V0QXN5bmNPcGVyYXRpb25OYW1lKGluZm8ub3BlcmF0aW9uKSArIlJlc3BvbnNlIik7Ci0gICAgICAgICAgICAgICAgSkFYQlR5cGUgcmVzcG9uc2VCZWFuVHlwZSA9IGdldEpBWEJUeXBlKHJlc3BvbnNlQmVhbk5hbWUpOworICAgICAgICAgICAgICAgIFFOYW1lIHJlc3BvbnNlQmVhbk5hbWUgPSBuZXcgUU5hbWUobnNwYWNlLCBnZXRBc3luY09wZXJhdGlvbk5hbWUoaW5mby5vcGVyYXRpb24pICsgIlJlc3BvbnNlIik7CisgICAgICAgICAgICAgICAgSkFYQlR5cGUgcmVzcG9uc2VCZWFuVHlwZSA9IGpheGJNb2RlbEJ1aWxkZXIuZ2V0SkFYQlR5cGUocmVzcG9uc2VCZWFuTmFtZSk7CisgICAgICAgICAgICAgICAgaWYocmVzcG9uc2VCZWFuVHlwZSA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoaW5mby5vcGVyYXRpb24uZ2V0RW50aXR5KCksIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9SRVNQT05TRUJFQU5fTk9URk9VTkQoaW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRSZXNwb25zZUJlYW4ocmVzcG9uc2VCZWFuVHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgUU5hbWUgcmVzcEJlYW5OYW1lID0gbmV3IFFOYW1lKHNvYXBSZXNwb25zZUJvZHkuZ2V0TmFtZXNwYWNlKCksZ2V0QXN5bmNPcGVyYXRpb25OYW1lKGluZm8ub3BlcmF0aW9uKSsiUmVzcG9uc2UiKTsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2socmVzcEJlYW5OYW1lLCBvcGVyYXRpb24uZ2V0UmVzcG9uc2VCZWFuVHlwZSgpKTsKKyAgICAgICAgUU5hbWUgcmVzcEJlYW5OYW1lID0gbmV3IFFOYW1lKHNvYXBSZXNwb25zZUJvZHkuZ2V0TmFtZXNwYWNlKCksIGdldEFzeW5jT3BlcmF0aW9uTmFtZShpbmZvLm9wZXJhdGlvbikgKyAiUmVzcG9uc2UiKTsKKyAgICAgICAgQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2socmVzcEJlYW5OYW1lLCBvcGVyYXRpb24uZ2V0UmVzcG9uc2VCZWFuVHlwZSgpLCBvdXRwdXRNZXNzYWdlKTsKICAgICAgICAgSmF2YVR5cGUgcmVzcEphdmFUeXBlID0gb3BlcmF0aW9uLmdldFJlc3BvbnNlQmVhbkphdmFUeXBlKCk7CiAgICAgICAgIEpBWEJUeXBlIHJlc3BUeXBlID0gbmV3IEpBWEJUeXBlKHJlc3BCZWFuTmFtZSwgcmVzcEphdmFUeXBlKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlc3BQYXJhbSA9IE1vZGVsZXJVdGlscy5jcmVhdGVQYXJhbWV0ZXIoaW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpKyJSZXNwb25zZSIsIHJlc3BUeXBlLCBibG9jayk7CisgICAgICAgIFBhcmFtZXRlciByZXNwUGFyYW0gPSBNb2RlbGVyVXRpbHMuY3JlYXRlUGFyYW1ldGVyKGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKSArICJSZXNwb25zZSIsIHJlc3BUeXBlLCBibG9jayk7CiAgICAgICAgIHJlc3BQYXJhbS5zZXRQYXJhbWV0ZXJJbmRleCgtMSk7CiAgICAgICAgIHJlc3BvbnNlLmFkZFBhcmFtZXRlcihyZXNwUGFyYW0pOwogICAgICAgICBvcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETF9SRVNVTFRfUEFSQU1FVEVSLCByZXNwUGFyYW0uZ2V0TmFtZSgpKTsKQEAgLTEwOTksMTUgKzExMjQsMTUgQEAKIAogICAgICAgICBMaXN0PFN0cmluZz4gZGVmaW5pdGl2ZVBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICAgICAgaW50IHBhcmFtZXRlck9yZGVyUG9zaXRpb24gPSAwOwotICAgICAgICBmb3IgKFN0cmluZyBuYW1lOiBwYXJhbWV0ZXJMaXN0KSB7CisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBwYXJhbWV0ZXJMaXN0KSB7CiAgICAgICAgICAgICBQYXJhbWV0ZXIgaW5QYXJhbWV0ZXIgPSBudWxsOwogCiAgICAgICAgICAgICBpblBhcmFtZXRlciA9IE1vZGVsZXJVdGlscy5nZXRQYXJhbWV0ZXIobmFtZSwgaW5QYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIGlmKGluUGFyYW1ldGVyID09IG51bGwpewotICAgICAgICAgICAgICAgIGlmKGV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24ucGFydE5vdEZvdW5kIiwgbmV3IE9iamVjdFtde2luZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbmFtZX0pOworICAgICAgICAgICAgaWYgKGluUGFyYW1ldGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyhpbmZvLm9wZXJhdGlvbi5nZXRFbnRpdHkoKSwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX1BBUlRfTk9UX0ZPVU5EKGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbmFtZSkpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgid3NkbG1vZGVsZXIuZXJyb3IucGFydE5vdEZvdW5kIiwgbmV3IE9iamVjdFtde2luZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbmFtZX0pOworICAgICAgICAgICAgICAgICAgICBlcnJvcihpbmZvLm9wZXJhdGlvbi5nZXRFbnRpdHkoKSwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0VSUk9SX1BBUlRfTk9UX0ZPVU5EKGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbmFtZSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVxdWVzdC5hZGRQYXJhbWV0ZXIoaW5QYXJhbWV0ZXIpOwpAQCAtMTEyMSw3ICsxMTQ2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vICBhZGQgY2FsbGJhY2sgaGFuZGxlcmIgUGFyYW1ldGVyIHRvIHJlcXVlc3QKLSAgICAgICAgaWYob3BlcmF0aW9uLmdldEFzeW5jVHlwZSgpLmVxdWFscyhBc3luY09wZXJhdGlvblR5cGUuQ0FMTEJBQ0spKXsKKyAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRBc3luY1R5cGUoKS5lcXVhbHMoQXN5bmNPcGVyYXRpb25UeXBlLkNBTExCQUNLKSkgewogICAgICAgICAgICAgSmF2YVR5cGUgY2JKYXZhVHlwZSA9IG9wZXJhdGlvbi5nZXRDYWxsQmFja1R5cGUoKTsKICAgICAgICAgICAgIEpBWEJUeXBlIGNhbGxiYWNrVHlwZSA9IG5ldyBKQVhCVHlwZShyZXNwQmVhbk5hbWUsIGNiSmF2YVR5cGUpOwogICAgICAgICAgICAgUGFyYW1ldGVyIGNiUGFyYW0gPSBNb2RlbGVyVXRpbHMuY3JlYXRlUGFyYW1ldGVyKCJhc3luY0hhbmRsZXIiLCBjYWxsYmFja1R5cGUsIGJsb2NrKTsKQEAgLTExMzMsNTIgKzExNTgsNTIgQEAKICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FzeW5jKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5Qb3J0VHlwZSBwb3J0VHlwZSwgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbiB3c2RsT3BlcmF0aW9uKXsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FzeW5jKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5Qb3J0VHlwZSBwb3J0VHlwZSwgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbiB3c2RsT3BlcmF0aW9uKSB7CiAgICAgICAgIC8vRmlyc3QgbG9vayBpbnRvIHdzZGw6b3BlcmF0aW9uCi0gICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0N1c3RvbWl6YXRpb24gPSAoSkFYV1NCaW5kaW5nKWdldEV4dGVuc2lvbk9mVHlwZSh3c2RsT3BlcmF0aW9uLCBKQVhXU0JpbmRpbmcuY2xhc3MpOwotICAgICAgICBCb29sZWFuIGlzQXN5bmMgPSAoamF4d3NDdXN0b21pemF0aW9uICE9IG51bGwpP2pheHdzQ3VzdG9taXphdGlvbi5pc0VuYWJsZUFzeW5jTWFwcGluZygpOm51bGw7CisgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0N1c3RvbWl6YXRpb24gPSAoSkFYV1NCaW5kaW5nKSBnZXRFeHRlbnNpb25PZlR5cGUod3NkbE9wZXJhdGlvbiwgSkFYV1NCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgQm9vbGVhbiBpc0FzeW5jID0gKGpheHdzQ3VzdG9taXphdGlvbiAhPSBudWxsKSA/IGpheHdzQ3VzdG9taXphdGlvbi5pc0VuYWJsZUFzeW5jTWFwcGluZygpIDogbnVsbDsKIAotICAgICAgICBpZihpc0FzeW5jICE9IG51bGwpCisgICAgICAgIGlmIChpc0FzeW5jICE9IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gaXNBc3luYzsKIAogICAgICAgICAvLyB0aGVuIGludG8gd3NkbDpwb3J0VHlwZQogICAgICAgICBRTmFtZSBwb3J0VHlwZU5hbWUgPSBuZXcgUU5hbWUocG9ydFR5cGUuZ2V0RGVmaW5pbmcoKS5nZXRUYXJnZXROYW1lc3BhY2VVUkkoKSwgcG9ydFR5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYocG9ydFR5cGVOYW1lICE9IG51bGwpewotICAgICAgICAgICAgamF4d3NDdXN0b21pemF0aW9uID0gKEpBWFdTQmluZGluZylnZXRFeHRlbnNpb25PZlR5cGUocG9ydFR5cGUsIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgICAgICBpc0FzeW5jID0gKGpheHdzQ3VzdG9taXphdGlvbiAhPSBudWxsKT9qYXh3c0N1c3RvbWl6YXRpb24uaXNFbmFibGVBc3luY01hcHBpbmcoKTpudWxsOwotICAgICAgICAgICAgaWYoaXNBc3luYyAhPSBudWxsKQorICAgICAgICBpZiAocG9ydFR5cGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGpheHdzQ3VzdG9taXphdGlvbiA9IChKQVhXU0JpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShwb3J0VHlwZSwgSkFYV1NCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGlzQXN5bmMgPSAoamF4d3NDdXN0b21pemF0aW9uICE9IG51bGwpID8gamF4d3NDdXN0b21pemF0aW9uLmlzRW5hYmxlQXN5bmNNYXBwaW5nKCkgOiBudWxsOworICAgICAgICAgICAgaWYgKGlzQXN5bmMgIT0gbnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gaXNBc3luYzsKICAgICAgICAgfQogCiAgICAgICAgIC8vdGhlbiB3c2RsOmRlZmluaXRpb25zCi0gICAgICAgIGpheHdzQ3VzdG9taXphdGlvbiA9IChKQVhXU0JpbmRpbmcpZ2V0RXh0ZW5zaW9uT2ZUeXBlKGRvY3VtZW50LmdldERlZmluaXRpb25zKCksIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlzQXN5bmMgPSAoamF4d3NDdXN0b21pemF0aW9uICE9IG51bGwpP2pheHdzQ3VzdG9taXphdGlvbi5pc0VuYWJsZUFzeW5jTWFwcGluZygpOm51bGw7Ci0gICAgICAgIGlmKGlzQXN5bmMgIT0gbnVsbCkKKyAgICAgICAgamF4d3NDdXN0b21pemF0aW9uID0gKEpBWFdTQmluZGluZykgZ2V0RXh0ZW5zaW9uT2ZUeXBlKGRvY3VtZW50LmdldERlZmluaXRpb25zKCksIEpBWFdTQmluZGluZy5jbGFzcyk7CisgICAgICAgIGlzQXN5bmMgPSAoamF4d3NDdXN0b21pemF0aW9uICE9IG51bGwpID8gamF4d3NDdXN0b21pemF0aW9uLmlzRW5hYmxlQXN5bmNNYXBwaW5nKCkgOiBudWxsOworICAgICAgICBpZiAoaXNBc3luYyAhPSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIGlzQXN5bmM7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMaXRlcmFsU09BUEhlYWRlcnMoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSwgSXRlcmF0b3IgaGVhZGVyUGFydHMsIFNldCBkdXBsaWNhdGVOYW1lcywgTGlzdCBkZWZpbml0aXZlUGFyYW1ldGVyTGlzdCwgYm9vbGVhbiBwcm9jZXNzUmVxdWVzdCkgeworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUxpdGVyYWxTT0FQSGVhZGVycyhSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlLCBJdGVyYXRvciBoZWFkZXJQYXJ0cywgU2V0IGR1cGxpY2F0ZU5hbWVzLCBMaXN0PFN0cmluZz4gZGVmaW5pdGl2ZVBhcmFtZXRlckxpc3QsIGJvb2xlYW4gcHJvY2Vzc1JlcXVlc3QpIHsKICAgICAgICAgUU5hbWUgaGVhZGVyTmFtZSA9IG51bGw7CiAgICAgICAgIEJsb2NrIGhlYWRlckJsb2NrID0gbnVsbDsKICAgICAgICAgSkFYQlR5cGUgamF4YlR5cGUgPSBudWxsOwogICAgICAgICBpbnQgcGFyYW1ldGVyT3JkZXJQb3NpdGlvbiA9IGRlZmluaXRpdmVQYXJhbWV0ZXJMaXN0LnNpemUoKTsKLSAgICAgICAgd2hpbGUoaGVhZGVyUGFydHMuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgIE1lc3NhZ2VQYXJ0IHBhcnQgPSAoTWVzc2FnZVBhcnQpaGVhZGVyUGFydHMubmV4dCgpOworICAgICAgICB3aGlsZSAoaGVhZGVyUGFydHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNZXNzYWdlUGFydCBwYXJ0ID0gKE1lc3NhZ2VQYXJ0KSBoZWFkZXJQYXJ0cy5uZXh0KCk7CiAgICAgICAgICAgICBoZWFkZXJOYW1lID0gcGFydC5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBqYXhiVHlwZSA9IGdldEpBWEJUeXBlKGhlYWRlck5hbWUpOwotICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSBuZXcgQmxvY2soaGVhZGVyTmFtZSwgamF4YlR5cGUpOwotICAgICAgICAgICAgRXh0ZW5zaWJsZSBleHQ7Ci0gICAgICAgICAgICBpZihwcm9jZXNzUmVxdWVzdCl7CisgICAgICAgICAgICBqYXhiVHlwZSA9IGdldEpBWEJUeXBlKHBhcnQpOworICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSBuZXcgQmxvY2soaGVhZGVyTmFtZSwgamF4YlR5cGUsIHBhcnQpOworICAgICAgICAgICAgVFdTRExFeHRlbnNpYmxlIGV4dDsKKyAgICAgICAgICAgIGlmIChwcm9jZXNzUmVxdWVzdCkgewogICAgICAgICAgICAgICAgIGV4dCA9IGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXRJbnB1dCgpOwotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGV4dCA9IGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXRPdXRwdXQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIE1lc3NhZ2UgaGVhZGVyTWVzc2FnZSA9IGdldEhlYWRlck1lc3NhZ2UocGFydCwgZXh0KTsKIAotICAgICAgICAgICAgaWYocHJvY2Vzc1JlcXVlc3QpeworICAgICAgICAgICAgaWYgKHByb2Nlc3NSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRIZWFkZXJCbG9jayhoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyQmxvY2soaGVhZGVyQmxvY2spOwogICAgICAgICAgICAgfQogCkBAIC0xMTkyLDcgKzEyMTcsNyBAQAogICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aXZlUGFyYW1ldGVyTGlzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlckluUGFyYW1zID0gZGVmaW5pdGl2ZVBhcmFtZXRlckxpc3QuaXRlcmF0b3IoKTsgaXRlckluUGFyYW1zLmhhc05leHQoKTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpblBhcmFtTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZylpdGVySW5QYXJhbXMubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBpdGVySW5QYXJhbXMubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluUGFyYW1OYW1lLmVxdWFscyhwYXJhbWV0ZXIuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBpblBhcmFtID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJCeU5hbWUoaW5QYXJhbU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRMaW5rZWRQYXJhbWV0ZXIoaW5QYXJhbSk7CkBAIC0xMjEyLDE0MiArMTIzNywxMjcgQEAKIAogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUxpdGVyYWxTT0FQRmF1bHQoUmVzcG9uc2UgcmVzcG9uc2UsIFNldCBkdXBsaWNhdGVOYW1lcyl7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGluZm8uYmluZGluZ09wZXJhdGlvbi5mYXVsdHMoKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KWl0ZXIubmV4dCgpOworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUxpdGVyYWxTT0FQRmF1bHQoUmVzcG9uc2UgcmVzcG9uc2UsIFNldCBkdXBsaWNhdGVOYW1lcykgeworICAgICAgICBmb3IgKEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgOiBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZmF1bHRzKCkpIHsKICAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5GYXVsdCBwb3J0VHlwZUZhdWx0ID0gbnVsbDsKLSAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyMiA9IGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZmF1bHRzKCk7IGl0ZXIyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5GYXVsdCBhRmF1bHQgPQotICAgICAgICAgICAgICAgICAgICAoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkZhdWx0KWl0ZXIyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZihhRmF1bHQuZ2V0TmFtZSgpLmVxdWFscyhiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBvcnRUeXBlRmF1bHQgIT0gbnVsbCl7CisgICAgICAgICAgICBmb3IgKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5GYXVsdCBhRmF1bHQgOiBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmZhdWx0cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFGYXVsdC5nZXROYW1lKCkuZXF1YWxzKGJpbmRpbmdGYXVsdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0VHlwZUZhdWx0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXU0RMIGRvY3VtZW50IGlzIGludmFsaWQsIGEgd3NsZDpmYXVsdCBpbiBhIHdzZGw6b3BlcmF0aW9uIG9mIGEgcG9ydFR5cGUgY2FuIGJlIGJvdW5kIG9ubHkgb25jZQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lm5vdFVuaXF1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihwb3J0VHlwZUZhdWx0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX05PVF9VTklRVUUoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlRmF1bHQgPSBhRmF1bHQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBUaGUgV1NETCBkb2N1bWVudCBpcyBpbnZhbGlkLCB0aGUgd3NkbDpmYXVsdCBpbiBhYnN0cmFjdCBvcGVyYXRpb24gaXMgZG9lcyBub3QgaGF2ZSBhbnkgYmluZGluZwotICAgICAgICAgICAgaWYocG9ydFR5cGVGYXVsdCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nRmF1bHQubm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICBpZiAocG9ydFR5cGVGYXVsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoYmluZGluZ0ZhdWx0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX05PVF9GT1VORChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gd3NkbDpmYXVsdCBtZXNzYWdlIG5hbWUgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGphdmEgZXhjZXB0aW9uIG5hbWUgbGF0ZXIgb24KICAgICAgICAgICAgIFN0cmluZyBmYXVsdE5hbWUgPSBnZXRGYXVsdENsYXNzTmFtZShwb3J0VHlwZUZhdWx0KTsKLSAgICAgICAgICAgIEZhdWx0IGZhdWx0ID0gbmV3IEZhdWx0KGZhdWx0TmFtZSk7CisgICAgICAgICAgICBGYXVsdCBmYXVsdCA9IG5ldyBGYXVsdChmYXVsdE5hbWUsIHBvcnRUeXBlRmF1bHQpOworICAgICAgICAgICAgZmF1bHQuc2V0V3NkbEZhdWx0TmFtZShwb3J0VHlwZUZhdWx0LmdldE5hbWUoKSk7CiAgICAgICAgICAgICBzZXREb2N1bWVudGF0aW9uSWZQcmVzZW50KGZhdWx0LCBwb3J0VHlwZUZhdWx0LmdldERvY3VtZW50YXRpb24oKSk7CiAKICAgICAgICAgICAgIC8vZ2V0IHRoZSBzb2FwYmluZDpmYXVsdCBmcm9tIHdzZGw6ZmF1bHQgaW4gdGhlIGJpbmRpbmcKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSAoU09BUEZhdWx0KWdldEV4dGVuc2lvbk9mVHlwZShiaW5kaW5nRmF1bHQsIFNPQVBGYXVsdC5jbGFzcyk7CisgICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gKFNPQVBGYXVsdCkgZ2V0RXh0ZW5zaW9uT2ZUeXBlKGJpbmRpbmdGYXVsdCwgU09BUEZhdWx0LmNsYXNzKTsKIAogICAgICAgICAgICAgLy8gVGhlIFdTREwgZG9jdW1lbnQgaXMgaW52YWxpZCwgY2FuJ3QgaGF2ZSB3c2RsOmZhdWx0IHdpdGhvdXQgc29hcGJpbmQ6ZmF1bHQKLSAgICAgICAgICAgIGlmKHNvYXBGYXVsdCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nRmF1bHQub3V0cHV0TWlzc2luZ1NvYXBGYXVsdCIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICBpZiAoc29hcEZhdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZihvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpKXsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyhiaW5kaW5nRmF1bHQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfT1VUUFVUX01JU1NJTkdfU09BUF9GQVVMVChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHNvYXBGYXVsdCA9IG5ldyBTT0FQRmF1bHQobmV3IExvY2F0b3JJbXBsKCkpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBlcnJvcihiaW5kaW5nRmF1bHQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfT1VUUFVUX01JU1NJTkdfU09BUF9GQVVMVChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvL3RoZSBzb2FwYmluZDpmYXVsdCBtdXN0IGhhdmUgdXNlPSJsaXRlcmFsIiBvciBubyB1c2UgYXR0cmlidXRlLCBpbiB0aGF0IGNhc2UgaXRzIGFzc3VtZWQgImxpdGVyYWwiCi0gICAgICAgICAgICBpZighc29hcEZhdWx0LmlzTGl0ZXJhbCgpKXsKLSAgICAgICAgICAgICAgICBpZihleHRlbnNpb25zKQotICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdGYXVsdC5ub3RMaXRlcmFsIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2JpbmRpbmdGYXVsdC5nZXROYW1lKCksIGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgIGlmICghc29hcEZhdWx0LmlzTGl0ZXJhbCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNFeHRlbnNpb25Nb2RlKCkpCisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoc29hcEZhdWx0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVF9OT1RfTElURVJBTChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmYWlsKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm9wZXJhdGlvbi5mYXVsdC5ub3RMaXRlcmFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117YmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICBlcnJvcihzb2FwRmF1bHQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9GQVVMVF9OT1RfTElURVJBTChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHRoZSBzb2FwRmF1bHQgbmFtZSBtdXN0IGJlIHByZXNlbnQKLSAgICAgICAgICAgIGlmKHNvYXBGYXVsdC5nZXROYW1lKCkgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgd2Fybigid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nRmF1bHQubm9Tb2FwRmF1bHROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2JpbmRpbmdGYXVsdC5nZXROYW1lKCksIGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCl9KTsKLSAgICAgICAgICAgIH1lbHNlIGlmICghc29hcEZhdWx0LmdldE5hbWUoKS5lcXVhbHMoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGUgc29hcEZhdWx0IG5hbWUgbXVzdCBtYXRjaCBiaW5kaW5nRmF1bHQgbmFtZQotICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lndyb25nU29hcEZhdWx0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtzb2FwRmF1bHQuZ2V0TmFtZSgpLCBiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7Ci0gICAgICAgICAgICB9ZWxzZSBpZihzb2FwRmF1bHQuZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgLy8gYnVnIGZpeDogNDg1MjcyOQotICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcucjI3MTZyMjcyNiIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICJzb2FwYmluZDpmYXVsdCIsIHNvYXBGYXVsdC5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgIGlmIChzb2FwRmF1bHQuZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3YXJuaW5nKGJpbmRpbmdGYXVsdCwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19GQVVMVF9OT19TT0FQX0ZBVUxUX05BTUUoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc29hcEZhdWx0LmdldE5hbWUoKS5lcXVhbHMoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB3YXJuaW5nKHNvYXBGYXVsdCwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19GQVVMVF9XUk9OR19TT0FQX0ZBVUxUX05BTUUoc29hcEZhdWx0LmdldE5hbWUoKSwgYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzb2FwRmF1bHQuZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdhcm5pbmcoc29hcEZhdWx0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19SXzI3MTZfUl8yNzI2KCJzb2FwYmluZDpmYXVsdCIsIHNvYXBGYXVsdC5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nIGZhdWx0TmFtZXNwYWNlVVJJID0gc29hcEZhdWx0LmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgaWYoZmF1bHROYW1lc3BhY2VVUkkgPT0gbnVsbCl7CisgICAgICAgICAgICBpZiAoZmF1bHROYW1lc3BhY2VVUkkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZhdWx0TmFtZXNwYWNlVVJJID0gcG9ydFR5cGVGYXVsdC5nZXRNZXNzYWdlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlIGZhdWx0TWVzc2FnZSA9IHBvcnRUeXBlRmF1bHQucmVzb2x2ZU1lc3NhZ2UoaW5mby5kb2N1bWVudCk7CiAgICAgICAgICAgICBJdGVyYXRvciBpdGVyMiA9IGZhdWx0TWVzc2FnZS5wYXJ0cygpOwotICAgICAgICAgICAgaWYoIWl0ZXIyLmhhc05leHQoKSl7CisgICAgICAgICAgICBpZiAoIWl0ZXIyLmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgIC8vIHRoZSBXU0RMIGRvY3VtZW50IGlzIGludmFsaWQKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nRmF1bHQuZW1wdHlNZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2JpbmRpbmdGYXVsdC5nZXROYW1lKCksIGZhdWx0TWVzc2FnZS5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICBlcnJvcihmYXVsdE1lc3NhZ2UsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfRU1QVFlfTUVTU0FHRShiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXNzYWdlUGFydCBmYXVsdFBhcnQgPSAoTWVzc2FnZVBhcnQpaXRlcjIubmV4dCgpOworICAgICAgICAgICAgTWVzc2FnZVBhcnQgZmF1bHRQYXJ0ID0gKE1lc3NhZ2VQYXJ0KSBpdGVyMi5uZXh0KCk7CiAgICAgICAgICAgICBRTmFtZSBmYXVsdFFOYW1lID0gZmF1bHRQYXJ0LmdldERlc2NyaXB0b3IoKTsKIAogICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBmYXVsdCBtZXNzYWdlcyB3aXRoIG5vbi11bmlxdWUgc29hcDpmYXVsdCBuYW1lcwogICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZU5hbWVzLmNvbnRhaW5zKGZhdWx0UU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgd2Fybigid3NkbG1vZGVsZXIuZHVwbGljYXRlLmZhdWx0LnNvYXAubmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7YmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCksIGZhdWx0UGFydC5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICB3YXJuaW5nKGZhdWx0UGFydCwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0RVUExJQ0FURV9GQVVMVF9TT0FQX05BTUUoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCksIGZhdWx0UGFydC5nZXROYW1lKCkpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGl0ZXIyLmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgIC8vIHRoZSBXU0RMIGRvY3VtZW50IGlzIGludmFsaWQKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nRmF1bHQubWVzc2FnZUhhc01vcmVUaGFuT25lUGFydCIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICAgICAgZXJyb3IoZmF1bHRNZXNzYWdlLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX01FU1NBR0VfSEFTX01PUkVfVEhBTl9PTkVfUEFSVChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChmYXVsdFBhcnQuZ2V0RGVzY3JpcHRvcktpbmQoKSAhPSBTY2hlbWFLaW5kcy5YU0RfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm1lc3NhZ2UucGFydE11c3RIYXZlRWxlbWVudERlc2NyaXB0b3IiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZmF1bHRNZXNzYWdlLmdldE5hbWUoKSwgZmF1bHRQYXJ0LmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgIGVycm9yKGZhdWx0UGFydCwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfTUVTU0FHRV9QQVJUX01VU1RfSEFWRV9FTEVNRU5UX0RFU0NSSVBUT1IoZmF1bHRNZXNzYWdlLmdldE5hbWUoKSwgZmF1bHRQYXJ0LmdldE5hbWUoKSkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBKQVhCVHlwZSBqYXhiVHlwZSA9IGdldEpBWEJUeXBlKGZhdWx0UGFydC5nZXREZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgSkFYQlR5cGUgamF4YlR5cGUgPSBnZXRKQVhCVHlwZShmYXVsdFBhcnQpOwogCiAgICAgICAgICAgICBmYXVsdC5zZXRFbGVtZW50TmFtZShmYXVsdFBhcnQuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIGZhdWx0LnNldEphdmFNZW1iZXJOYW1lKGdldEVudmlyb25tZW50KCkuZ2V0TmFtZXMoKS5nZXRFeGNlcHRpb25DbGFzc01lbWJlck5hbWUoKSk7CisgICAgICAgICAgICBmYXVsdC5zZXRKYXZhTWVtYmVyTmFtZShOYW1lcy5nZXRFeGNlcHRpb25DbGFzc01lbWJlck5hbWUoKSk7CiAKLSAgICAgICAgICAgIEJsb2NrIGZhdWx0QmxvY2sgPSBuZXcgQmxvY2soZmF1bHRRTmFtZSwgamF4YlR5cGUpOworICAgICAgICAgICAgQmxvY2sgZmF1bHRCbG9jayA9IG5ldyBCbG9jayhmYXVsdFFOYW1lLCBqYXhiVHlwZSwgZmF1bHRQYXJ0KTsKICAgICAgICAgICAgIGZhdWx0LnNldEJsb2NrKGZhdWx0QmxvY2spOwotICAgICAgICAgICAgY3JlYXRlUGFyZW50RmF1bHQoZmF1bHQpOwotICAgICAgICAgICAgY3JlYXRlU3ViZmF1bHRzKGZhdWx0KTsKLSAgICAgICAgICAgIGlmKCFyZXNwb25zZS5nZXRGYXVsdEJsb2Nrc01hcCgpLmNvbnRhaW5zS2V5KGZhdWx0QmxvY2suZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIC8vY3JlYXRlUGFyZW50RmF1bHQoZmF1bHQpOworICAgICAgICAgICAgLy9jcmVhdGVTdWJmYXVsdHMoZmF1bHQpOworICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5nZXRGYXVsdEJsb2Nrc01hcCgpLmNvbnRhaW5zS2V5KGZhdWx0QmxvY2suZ2V0TmFtZSgpKSkKICAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRGYXVsdEJsb2NrKGZhdWx0QmxvY2spOwogICAgICAgICAgICAgaW5mby5vcGVyYXRpb24uYWRkRmF1bHQoZmF1bHQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBvcnRUeXBlRmF1bHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmF1bHRDbGFzc05hbWUoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkZhdWx0IHBvcnRUeXBlRmF1bHQpIHsKLSAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQmluZGluZyA9IChKQVhXU0JpbmRpbmcpZ2V0RXh0ZW5zaW9uT2ZUeXBlKHBvcnRUeXBlRmF1bHQsIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmKGpheHdzQmluZGluZyAhPSBudWxsKXsKKyAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQmluZGluZyA9IChKQVhXU0JpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShwb3J0VHlwZUZhdWx0LCBKQVhXU0JpbmRpbmcuY2xhc3MpOworICAgICAgICBpZiAoamF4d3NCaW5kaW5nICE9IG51bGwpIHsKICAgICAgICAgICAgIEN1c3RvbU5hbWUgY2xhc3NOYW1lID0gamF4d3NCaW5kaW5nLmdldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgaWYoY2xhc3NOYW1lICE9IG51bGwpeworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS5nZXROYW1lKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBvcnRUeXBlRmF1bHQuZ2V0TWVzc2FnZSgpLmdldExvY2FsUGFydCgpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCAgYm9vbGVhbiBzZXRNZXNzYWdlUGFydHNCaW5kaW5nKFN0eWxlQW5kVXNlIHN0eWxlQW5kVXNlKXsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRNZXNzYWdlUGFydHNCaW5kaW5nKFN0eWxlQW5kVXNlIHN0eWxlQW5kVXNlKSB7CiAgICAgICAgIFNPQVBCb2R5IGluQm9keSA9IGdldFNPQVBSZXF1ZXN0Qm9keSgpOwogICAgICAgICBNZXNzYWdlIGluTWVzc2FnZSA9IGdldElucHV0TWVzc2FnZSgpOwotICAgICAgICBpZighc2V0TWVzc2FnZVBhcnRzQmluZGluZyhpbkJvZHksIGluTWVzc2FnZSwgc3R5bGVBbmRVc2UsIHRydWUpKQorICAgICAgICBpZiAoIXNldE1lc3NhZ2VQYXJ0c0JpbmRpbmcoaW5Cb2R5LCBpbk1lc3NhZ2UsIHN0eWxlQW5kVXNlLCB0cnVlKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBpZihpc1JlcXVlc3RSZXNwb25zZSgpKXsKKyAgICAgICAgaWYgKGlzUmVxdWVzdFJlc3BvbnNlKCkpIHsKICAgICAgICAgICAgIFNPQVBCb2R5IG91dEJvZHkgPSBnZXRTT0FQUmVzcG9uc2VCb2R5KCk7CiAgICAgICAgICAgICBNZXNzYWdlIG91dE1lc3NhZ2UgPSBnZXRPdXRwdXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZighc2V0TWVzc2FnZVBhcnRzQmluZGluZyhvdXRCb2R5LCBvdXRNZXNzYWdlLCBzdHlsZUFuZFVzZSwgZmFsc2UpKQorICAgICAgICAgICAgaWYgKCFzZXRNZXNzYWdlUGFydHNCaW5kaW5nKG91dEJvZHksIG91dE1lc3NhZ2UsIHN0eWxlQW5kVXNlLCBmYWxzZSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTM2MiwxMCArMTM3MiwxMCBAQAogICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBoZWFkZXJQYXJ0cyA9IG51bGw7CiAgICAgICAgIExpc3Q8TWVzc2FnZVBhcnQ+IGJvZHlQYXJ0cyA9IGdldEJvZHlQYXJ0cyhib2R5LCBtZXNzYWdlKTsKIAotICAgICAgICBpZihpc0lucHV0KXsKKyAgICAgICAgaWYgKGlzSW5wdXQpIHsKICAgICAgICAgICAgIGhlYWRlclBhcnRzID0gZ2V0SGVhZGVyUGFydHNGcm9tTWVzc2FnZShtZXNzYWdlLCBpc0lucHV0KTsKICAgICAgICAgICAgIG1pbWVQYXJ0cyA9IGdldE1pbWVDb250ZW50UGFydHMobWVzc2FnZSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldElucHV0KCkpOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGhlYWRlclBhcnRzID0gZ2V0SGVhZGVyUGFydHNGcm9tTWVzc2FnZShtZXNzYWdlLCBpc0lucHV0KTsKICAgICAgICAgICAgIG1pbWVQYXJ0cyA9IGdldE1pbWVDb250ZW50UGFydHMobWVzc2FnZSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE91dHB1dCgpKTsKICAgICAgICAgfQpAQCAtMTM3Nyw2NSArMTM4Nyw2MSBAQAogCiAgICAgICAgIC8vaWYgc29hcDpib2R5IHBhcnRzIGF0dHJpYnV0ZSBub3QgdGhlcmUsIHRoZW4gYWxsIHVuYm91bmRlZCBtZXNzYWdlIHBhcnRzIHdpbGwKICAgICAgICAgLy8gYmVsb25nIHRvIHRoZSBzb2FwIGJvZHkKLSAgICAgICAgaWYoYm9keVBhcnRzID09IG51bGwpeworICAgICAgICBpZiAoYm9keVBhcnRzID09IG51bGwpIHsKICAgICAgICAgICAgIGJvZHlQYXJ0cyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZVBhcnQ+KCk7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3I8TWVzc2FnZVBhcnQ+IGl0ZXIgPSBtZXNzYWdlLnBhcnRzKCk7aXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPE1lc3NhZ2VQYXJ0PiBpdGVyID0gbWVzc2FnZS5wYXJ0cygpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAgICAgICAgICBNZXNzYWdlUGFydCBtUGFydCA9IGl0ZXIubmV4dCgpOwogICAgICAgICAgICAgICAgIC8vSXRzIGEgc2FmZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBhcnRzIGluIHRoZSBtZXNzYWdlIG5vdCBiZWxvbmdpbmcgdG8gaGVhZGVyIG9yIG1pbWUgd2lsbAogICAgICAgICAgICAgICAgIC8vIGJlbG9uZyB0byB0aGUgYm9keT8KLSAgICAgICAgICAgICAgICBpZihtaW1lUGFydHMuY29udGFpbnMobVBhcnQpIHx8IGhlYWRlclBhcnRzLmNvbnRhaW5zKG1QYXJ0KSB8fCBib3VuZFRvRmF1bHQobVBhcnQuZ2V0TmFtZSgpKSl7CisgICAgICAgICAgICAgICAgaWYgKG1pbWVQYXJ0cy5jb250YWlucyhtUGFydCkgfHwgaGVhZGVyUGFydHMuY29udGFpbnMobVBhcnQpIHx8IGJvdW5kVG9GYXVsdChtUGFydC5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgZXJyb3IgdGhhdCBhIHBhcnQgY2FudCBiZSBib3VuZCBtdWx0aXBsZSB0aW1lcywgbm90IGlnbm9yaW5nIG9wZXJhdGlvbiwgaWYgdGhlcmUKICAgICAgICAgICAgICAgICAgICAgLy9pcyBjb25mbGljdCBpdCB3aWxsIGZhaWwgbGF0dGVyCi0gICAgICAgICAgICAgICAgICAgIGlmKGV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCJ3c2RsbW9kZWxlci53YXJuaW5nLmJpbmRpbmdPcGVyYXRpb24ubXVsdGlwbGVQYXJ0QmluZGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLCBtUGFydC5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNFeHRlbnNpb25Nb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKG1QYXJ0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19CSU5ESU5HX09QRVJBVElPTl9NVUxUSVBMRV9QQVJUX0JJTkRJTkcoaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgbVBhcnQuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ09wZXJhdGlvbi5tdWx0aXBsZVBhcnRCaW5kaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2luZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCksIG1QYXJ0LmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IobVBhcnQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX01VTFRJUExFX1BBUlRfQklORElORyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLCBtUGFydC5nZXROYW1lKCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9keVBhcnRzLmFkZChtUGFydCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvL25vdyBidWlsZCB0aGUgZmluYWwgcGFydHMgbGlzdCB3aXRoIGhlYWRlciwgbWltZSBwYXJ0cyBhbmQgYm9keSBwYXJ0cwotICAgICAgICBmb3IoSXRlcmF0b3IgaXRlciA9IG1lc3NhZ2UucGFydHMoKTtpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1lc3NhZ2VQYXJ0IG1QYXJ0ID0gKE1lc3NhZ2VQYXJ0KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYobWltZVBhcnRzLmNvbnRhaW5zKG1QYXJ0KSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXNzYWdlLnBhcnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWVzc2FnZVBhcnQgbVBhcnQgPSAoTWVzc2FnZVBhcnQpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKG1pbWVQYXJ0cy5jb250YWlucyhtUGFydCkpIHsKICAgICAgICAgICAgICAgICBtUGFydC5zZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRLaW5kKE1lc3NhZ2VQYXJ0LldTRExfTUlNRV9CSU5ESU5HKTsKICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQobVBhcnQpOwotICAgICAgICAgICAgfWVsc2UgaWYoaGVhZGVyUGFydHMuY29udGFpbnMobVBhcnQpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclBhcnRzLmNvbnRhaW5zKG1QYXJ0KSkgewogICAgICAgICAgICAgICAgIG1QYXJ0LnNldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudEtpbmQoTWVzc2FnZVBhcnQuU09BUF9IRUFERVJfQklORElORyk7CiAgICAgICAgICAgICAgICAgcGFydHMuYWRkKG1QYXJ0KTsKLSAgICAgICAgICAgIH1lbHNlIGlmKGJvZHlQYXJ0cy5jb250YWlucyhtUGFydCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keVBhcnRzLmNvbnRhaW5zKG1QYXJ0KSkgewogICAgICAgICAgICAgICAgIG1QYXJ0LnNldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudEtpbmQoTWVzc2FnZVBhcnQuU09BUF9CT0RZX0JJTkRJTkcpOwogICAgICAgICAgICAgICAgIHBhcnRzLmFkZChtUGFydCk7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVBhcnQuc2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZChNZXNzYWdlUGFydC5QQVJUX05PVF9CT1VOREVEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmKGlzT3BlcmF0aW9uRG9jdW1lbnRMaXRlcmFsKHN0eWxlQW5kVXNlKSAmJiBib2R5UGFydHMuc2l6ZSgpID4gMSl7Ci0gICAgICAgICAgICBpZihleHRlbnNpb25zKQotICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcub3BlcmF0aW9uLk1vcmVUaGFuT25lUGFydEluTWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICBpZiAoaXNPcGVyYXRpb25Eb2N1bWVudExpdGVyYWwoc3R5bGVBbmRVc2UpICYmIGJvZHlQYXJ0cy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSkKKyAgICAgICAgICAgICAgICB3YXJuaW5nKG1lc3NhZ2UsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX09QRVJBVElPTl9NT1JFX1RIQU5fT05FX1BBUlRfSU5fTUVTU0FHRShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLk1vcmVUaGFuT25lUGFydEluTWVzc2FnZSIsIGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBlcnJvcihtZXNzYWdlLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fTU9SRV9USEFOX09ORV9QQVJUX0lOX01FU1NBR0UoaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gYm91bmRUb0ZhdWx0KFN0cmluZyBwYXJ0TmFtZSl7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGluZm8uYmluZGluZ09wZXJhdGlvbi5mYXVsdHMoKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYocGFydE5hbWUuZXF1YWxzKGJpbmRpbmdGYXVsdC5nZXROYW1lKCkpKQorICAgIHByaXZhdGUgYm9vbGVhbiBib3VuZFRvRmF1bHQoU3RyaW5nIHBhcnROYW1lKSB7CisgICAgICAgIGZvciAoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA6IGluZm8uYmluZGluZ09wZXJhdGlvbi5mYXVsdHMoKSkgeworICAgICAgICAgICAgaWYgKHBhcnROYW1lLmVxdWFscyhiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpKSkKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy9nZXQgTWVzc2FnZVBhcnQocykgcmVmZXJlbmNlZCBieSBwYXJ0cyBhdHRyaWJ1dGUgb2Ygc29hcDpib2R5IGVsZW1lbnQKLSAgICBwcml2YXRlIExpc3Q8TWVzc2FnZVBhcnQ+IGdldEJvZHlQYXJ0cyhTT0FQQm9keSBib2R5LCBNZXNzYWdlIG1lc3NhZ2UpeworICAgIHByaXZhdGUgTGlzdDxNZXNzYWdlUGFydD4gZ2V0Qm9keVBhcnRzKFNPQVBCb2R5IGJvZHksIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICBTdHJpbmcgYm9keVBhcnRzID0gYm9keS5nZXRQYXJ0cygpOwogICAgICAgICBpZiAoYm9keVBhcnRzICE9IG51bGwpIHsKICAgICAgICAgICAgIExpc3Q8TWVzc2FnZVBhcnQ+IHBhcnRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZVBhcnQ+KCk7CkBAIC0xNDQ0LDkgKzE0NTAsNyBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0ID0gaW4ubmV4dFRva2VuKCk7CiAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgbVBhcnQgPSBtZXNzYWdlLmdldFBhcnQocGFydCk7CiAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbVBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAid3NkbG1vZGVsZXIuZXJyb3IucGFydHNOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBwYXJ0LCBtZXNzYWdlLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICBlcnJvcihtZXNzYWdlLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfRVJST1JfUEFSVFNfTk9UX0ZPVU5EKHBhcnQsIG1lc3NhZ2UuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1QYXJ0LnNldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudEtpbmQoTWVzc2FnZVBhcnQuU09BUF9CT0RZX0JJTkRJTkcpOwogICAgICAgICAgICAgICAgIHBhcnRzTGlzdC5hZGQobVBhcnQpOwpAQCAtMTQ1NiwyMiArMTQ2MCwyMiBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwcml2YXRlIExpc3Q8TWVzc2FnZVBhcnQ+IGdldEhlYWRlclBhcnRzRnJvbU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlLCBib29sZWFuIGlzSW5wdXQpeworICAgIHByaXZhdGUgTGlzdDxNZXNzYWdlUGFydD4gZ2V0SGVhZGVyUGFydHNGcm9tTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UsIGJvb2xlYW4gaXNJbnB1dCkgewogICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBoZWFkZXJQYXJ0cyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZVBhcnQ+KCk7CiAgICAgICAgIEl0ZXJhdG9yPE1lc3NhZ2VQYXJ0PiBwYXJ0cyA9IG1lc3NhZ2UucGFydHMoKTsKICAgICAgICAgTGlzdDxNZXNzYWdlUGFydD4gaGVhZGVycyA9IGdldEhlYWRlclBhcnRzKGlzSW5wdXQpOwotICAgICAgICB3aGlsZShwYXJ0cy5oYXNOZXh0KCkpeworICAgICAgICB3aGlsZSAocGFydHMuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICBNZXNzYWdlUGFydCBwYXJ0ID0gcGFydHMubmV4dCgpOwotICAgICAgICAgICAgaWYoaGVhZGVycy5jb250YWlucyhwYXJ0KSl7CisgICAgICAgICAgICBpZiAoaGVhZGVycy5jb250YWlucyhwYXJ0KSkgewogICAgICAgICAgICAgICAgIGhlYWRlclBhcnRzLmFkZChwYXJ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gaGVhZGVyUGFydHM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBNZXNzYWdlIGdldEhlYWRlck1lc3NhZ2UoTWVzc2FnZVBhcnQgcGFydCwgRXh0ZW5zaWJsZSBleHQpIHsKLSAgICAgICAgSXRlcmF0b3I8U09BUEhlYWRlcj4gaGVhZGVycyA9ICBnZXRIZWFkZXJFeHRlbnNpb25zKGV4dCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoaGVhZGVycy5oYXNOZXh0KCkpeworICAgIHByaXZhdGUgTWVzc2FnZSBnZXRIZWFkZXJNZXNzYWdlKE1lc3NhZ2VQYXJ0IHBhcnQsIFRXU0RMRXh0ZW5zaWJsZSBleHQpIHsKKyAgICAgICAgSXRlcmF0b3I8U09BUEhlYWRlcj4gaGVhZGVycyA9IGdldEhlYWRlckV4dGVuc2lvbnMoZXh0KS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaGVhZGVycy5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gaGVhZGVycy5uZXh0KCk7CiAgICAgICAgICAgICBpZiAoIWhlYWRlci5pc0xpdGVyYWwoKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE0ODAsMTkgKzE0ODQsMTkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgTWVzc2FnZVBhcnQgaGVhZGVyUGFydCA9IGhlYWRlck1lc3NhZ2UuZ2V0UGFydChoZWFkZXIuZ2V0UGFydCgpKTsKLSAgICAgICAgICAgIGlmKGhlYWRlclBhcnQgPT0gcGFydCkKKyAgICAgICAgICAgIGlmIChoZWFkZXJQYXJ0ID09IHBhcnQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlck1lc3NhZ2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBMaXN0PE1lc3NhZ2VQYXJ0PiBnZXRIZWFkZXJQYXJ0c05vdEZyb21NZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSwgYm9vbGVhbiBpc0lucHV0KXsKKyAgICBwcml2YXRlIExpc3Q8TWVzc2FnZVBhcnQ+IGdldEhlYWRlclBhcnRzTm90RnJvbU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlLCBib29sZWFuIGlzSW5wdXQpIHsKICAgICAgICAgTGlzdDxNZXNzYWdlUGFydD4gaGVhZGVyUGFydHMgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VQYXJ0PigpOwogICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBwYXJ0cyA9IG1lc3NhZ2UuZ2V0UGFydHMoKTsKICAgICAgICAgSXRlcmF0b3I8TWVzc2FnZVBhcnQ+IGhlYWRlcnMgPSBnZXRIZWFkZXJQYXJ0cyhpc0lucHV0KS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShoZWFkZXJzLmhhc05leHQoKSl7CisgICAgICAgIHdoaWxlIChoZWFkZXJzLmhhc05leHQoKSkgewogICAgICAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IGhlYWRlcnMubmV4dCgpOwotICAgICAgICAgICAgaWYoIXBhcnRzLmNvbnRhaW5zKHBhcnQpKXsKKyAgICAgICAgICAgIGlmICghcGFydHMuY29udGFpbnMocGFydCkpIHsKICAgICAgICAgICAgICAgICBoZWFkZXJQYXJ0cy5hZGQocGFydCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1MDAsNDAgKzE1MDQsMzUgQEAKICAgICB9CiAKICAgICBwcml2YXRlIExpc3Q8TWVzc2FnZVBhcnQ+IGdldEhlYWRlclBhcnRzKGJvb2xlYW4gaXNJbnB1dCkgewotICAgICAgICBFeHRlbnNpYmxlIGV4dDsKLSAgICAgICAgaWYoaXNJbnB1dCl7CisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBleHQ7CisgICAgICAgIGlmIChpc0lucHV0KSB7CiAgICAgICAgICAgICBleHQgPSBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKTsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBleHQgPSBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0T3V0cHV0KCk7CiAgICAgICAgIH0KIAogICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBwYXJ0cyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZVBhcnQ+KCk7Ci0gICAgICAgIEl0ZXJhdG9yPFNPQVBIZWFkZXI+IGhlYWRlcnMgPSAgZ2V0SGVhZGVyRXh0ZW5zaW9ucyhleHQpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGhlYWRlcnMuaGFzTmV4dCgpKXsKKyAgICAgICAgSXRlcmF0b3I8U09BUEhlYWRlcj4gaGVhZGVycyA9IGdldEhlYWRlckV4dGVuc2lvbnMoZXh0KS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaGVhZGVycy5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gaGVhZGVycy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWhlYWRlci5pc0xpdGVyYWwoKSl7Ci0gICAgICAgICAgICAgICAgZmFpbCgid3NkbG1vZGVsZXIuaW52YWxpZC5oZWFkZXIubm90TGl0ZXJhbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2hlYWRlci5nZXRQYXJ0KCksIGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgIGlmICghaGVhZGVyLmlzTGl0ZXJhbCgpKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoaGVhZGVyLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJfTk9UX0xJVEVSQUwoaGVhZGVyLmdldFBhcnQoKSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaGVhZGVyLmdldE5hbWVzcGFjZSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLndhcm5pbmcucjI3MTZyMjcyNiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117InNvYXBiaW5kOmhlYWRlciIsIGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgIGlmIChoZWFkZXIuZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdhcm5pbmcoaGVhZGVyLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfV0FSTklOR19SXzI3MTZfUl8yNzI2KCJzb2FwYmluZDpoZWFkZXIiLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuTWVzc2FnZSBoZWFkZXJNZXNzYWdlID0gZmluZE1lc3NhZ2UoaGVhZGVyLmdldE1lc3NhZ2UoKSwgaW5mbyk7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyTWVzc2FnZSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICBmYWlsKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmhlYWRlci5jYW50LnJlc29sdmUubWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117aGVhZGVyLmdldE1lc3NhZ2UoKSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKX0pOworICAgICAgICAgICAgaWYgKGhlYWRlck1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVycm9yKGhlYWRlciwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfSEVBREVSX0NBTlRfUkVTT0xWRV9NRVNTQUdFKGhlYWRlci5nZXRNZXNzYWdlKCksIGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IGhlYWRlck1lc3NhZ2UuZ2V0UGFydChoZWFkZXIuZ2V0UGFydCgpKTsKLSAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpewotICAgICAgICAgICAgICAgIGZhaWwoIndzZGxtb2RlbGVyLmludmFsaWQuaGVhZGVyLm5vdEZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtoZWFkZXIuZ2V0UGFydCgpLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICBpZiAocGFydCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoaGVhZGVyLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJfTk9UX0ZPVU5EKGhlYWRlci5nZXRQYXJ0KCksIGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwYXJ0LmdldERlc2NyaXB0b3JLaW5kKCkgIT0gU2NoZW1hS2luZHMuWFNEX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmhlYWRlci5tZXNzYWdlLnBhcnRNdXN0SGF2ZUVsZW1lbnREZXNjcmlwdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtwYXJ0LmdldE5hbWUoKSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgIGVycm9yKHBhcnQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0hFQURFUl9NRVNTQUdFX1BBUlRfTVVTVF9IQVZFX0VMRU1FTlRfREVTQ1JJUFRPUihwYXJ0LmdldE5hbWUoKSwgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGFydC5zZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRLaW5kKE1lc3NhZ2VQYXJ0LlNPQVBfSEVBREVSX0JJTkRJTkcpOwogICAgICAgICAgICAgcGFydHMuYWRkKHBhcnQpOwpAQCAtMTU0MSwxMSArMTU0MCwxMSBAQAogICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT3BlcmF0aW9uRG9jdW1lbnRMaXRlcmFsKFN0eWxlQW5kVXNlIHN0eWxlQW5kVXNlKXsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPcGVyYXRpb25Eb2N1bWVudExpdGVyYWwoU3R5bGVBbmRVc2Ugc3R5bGVBbmRVc2UpIHsKICAgICAgICAgcmV0dXJuIFN0eWxlQW5kVXNlLkRPQ19MSVRFUkFMID09IHN0eWxlQW5kVXNlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc09wZXJhdGlvblJwY0xpdGVyYWwoU3R5bGVBbmRVc2Ugc3R5bGVBbmRVc2UpeworICAgIHByaXZhdGUgYm9vbGVhbiBpc09wZXJhdGlvblJwY0xpdGVyYWwoU3R5bGVBbmRVc2Ugc3R5bGVBbmRVc2UpIHsKICAgICAgICAgcmV0dXJuIFN0eWxlQW5kVXNlLlJQQ19MSVRFUkFMID09IHN0eWxlQW5kVXNlOwogICAgIH0KIApAQCAtMTU1MywxMjAgKzE1NTIsMTIzIEBACiAgICAgICogQHBhcmFtIHBhcnQKICAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBKQVhCVHlwZSBvYmplY3QKICAgICAgKi8KLSAgICBwcml2YXRlIEpBWEJUeXBlIGdldEpBWEJUeXBlKE1lc3NhZ2VQYXJ0IHBhcnQpewotICAgICAgICBKQVhCVHlwZSB0eXBlPW51bGw7CisgICAgcHJpdmF0ZSBKQVhCVHlwZSBnZXRKQVhCVHlwZShNZXNzYWdlUGFydCBwYXJ0KSB7CisgICAgICAgIEpBWEJUeXBlIHR5cGUgPSBudWxsOwogICAgICAgICBRTmFtZSBuYW1lID0gcGFydC5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmKHBhcnQuZ2V0RGVzY3JpcHRvcktpbmQoKS5lcXVhbHMoU2NoZW1hS2luZHMuWFNEX0VMRU1FTlQpKXsKLSAgICAgICAgICAgIHR5cGUgPSBnZXRKQVhCVHlwZShuYW1lKTsKLSAgICAgICAgfWVsc2UgeworICAgICAgICBpZiAocGFydC5nZXREZXNjcmlwdG9yS2luZCgpLmVxdWFscyhTY2hlbWFLaW5kcy5YU0RfRUxFTUVOVCkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBqYXhiTW9kZWxCdWlsZGVyLmdldEpBWEJUeXBlKG5hbWUpOworICAgICAgICAgICAgaWYodHlwZSA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICBlcnJvcihwYXJ0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSkFYQl9KQVZBVFlQRV9OT1RGT1VORChuYW1lLCBwYXJ0LmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUzJKSkFYQk1vZGVsIGpheGJNb2RlbCA9IGdldEpBWEJNb2RlbEJ1aWxkZXIoKS5nZXRKQVhCTW9kZWwoKS5nZXRTMkpKQVhCTW9kZWwoKTsKICAgICAgICAgICAgIFR5cGVBbmRBbm5vdGF0aW9uIHR5cGVBbm5vID0gamF4Yk1vZGVsLmdldEphdmFUeXBlKG5hbWUpOwotICAgICAgICAgICAgaWYodHlwZUFubm8gPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgZmFpbCgid3NkbG1vZGVsZXIuamF4Yi5qYXZhdHlwZS5ub3Rmb3VuZCIsIG5ldyBPYmplY3RbXXtuYW1lLCBwYXJ0LmdldE5hbWUoKX0pOworICAgICAgICAgICAgaWYgKHR5cGVBbm5vID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnJvcihwYXJ0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSkFYQl9KQVZBVFlQRV9OT1RGT1VORChuYW1lLCBwYXJ0LmdldE5hbWUoKSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgIEphdmFTaW1wbGVUeXBlKG5ldyBKQVhCVHlwZUFuZEFubm90YXRpb24odHlwZUFubm8pKTsKKyAgICAgICAgICAgIEphdmFUeXBlIGphdmFUeXBlID0gbmV3IEphdmFTaW1wbGVUeXBlKG5ldyBKQVhCVHlwZUFuZEFubm90YXRpb24odHlwZUFubm8pKTsKICAgICAgICAgICAgIHR5cGUgPSBuZXcgSkFYQlR5cGUobmV3IFFOYW1lKCIiLCBwYXJ0LmdldE5hbWUoKSksIGphdmFUeXBlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHlwZTsKICAgICB9CiAKLSAgICBwcml2YXRlIExpc3Q8UGFyYW1ldGVyPiBnZXREb2NsaXRQYXJhbWV0ZXJzKFJlcXVlc3QgcmVxLCBSZXNwb25zZSByZXMsIExpc3Q8TWVzc2FnZVBhcnQ+IHBhcmFtZXRlckxpc3QpewotICAgICAgICBpZihwYXJhbWV0ZXJMaXN0LnNpemUoKSA9PSAwKQorICAgIHByaXZhdGUgTGlzdDxQYXJhbWV0ZXI+IGdldERvY2xpdFBhcmFtZXRlcnMoUmVxdWVzdCByZXEsIFJlc3BvbnNlIHJlcywgTGlzdDxNZXNzYWdlUGFydD4gcGFyYW1ldGVyTGlzdCkgeworICAgICAgICBpZiAocGFyYW1ldGVyTGlzdC5zaXplKCkgPT0gMCkKICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLSAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtcyA9IG51bGw7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKICAgICAgICAgTWVzc2FnZSBpbk1zZyA9IGdldElucHV0TWVzc2FnZSgpOwogICAgICAgICBNZXNzYWdlIG91dE1zZyA9IGdldE91dHB1dE1lc3NhZ2UoKTsKICAgICAgICAgYm9vbGVhbiB1bndyYXBwYWJsZSA9IGlzVW53cmFwcGFibGUoKTsKICAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IG91dFBhcmFtcyA9IG51bGw7CiAgICAgICAgIGludCBwSW5kZXggPSAwOwotICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydDpwYXJhbWV0ZXJMaXN0KXsKKyAgICAgICAgZm9yIChNZXNzYWdlUGFydCBwYXJ0IDogcGFyYW1ldGVyTGlzdCkgewogICAgICAgICAgICAgUU5hbWUgcmVxQm9keU5hbWUgPSBwYXJ0LmdldERlc2NyaXB0b3IoKTsKICAgICAgICAgICAgIEpBWEJUeXBlIGpheGJUeXBlID0gZ2V0SkFYQlR5cGUocGFydCk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IG5ldyBCbG9jayhyZXFCb2R5TmFtZSwgamF4YlR5cGUpOwotICAgICAgICAgICAgaWYodW53cmFwcGFibGUpeworICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2socmVxQm9keU5hbWUsIGpheGJUeXBlLCBwYXJ0KTsKKyAgICAgICAgICAgIGlmICh1bndyYXBwYWJsZSkgewogICAgICAgICAgICAgICAgIC8vU28gYnVpbGQgYm9keSBhbmQgaGVhZGVyIGJsb2NrcyBhbmQgc2V0IHRvIHJlcXVlc3QgYW5kIHJlc3BvbnNlCiAgICAgICAgICAgICAgICAgSkFYQlN0cnVjdHVyZWRUeXBlIGpheGJTdHJ1Y3RUeXBlID0gTW9kZWxlclV0aWxzLmNyZWF0ZUpBWEJTdHJ1Y3R1cmVUeXBlKGpheGJUeXBlKTsKLSAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBCbG9jayhyZXFCb2R5TmFtZSwgamF4YlN0cnVjdFR5cGUpOwotICAgICAgICAgICAgICAgIGlmKE1vZGVsZXJVdGlscy5pc0JvdW5kVG9TT0FQQm9keShwYXJ0KSl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBhcnQuaXNJTigpKXsKKyAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBCbG9jayhyZXFCb2R5TmFtZSwgamF4YlN0cnVjdFR5cGUsIHBhcnQpOworICAgICAgICAgICAgICAgIGlmIChNb2RlbGVyVXRpbHMuaXNCb3VuZFRvU09BUEJvZHkocGFydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNJTigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXEuYWRkQm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocGFydC5pc09VVCgpKXsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LmlzT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5hZGRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihwYXJ0LmlzSU5PVVQoKSl7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5pc0lOT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRCb2R5QmxvY2soYmxvY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmFkZEJvZHlCbG9jayhibG9jayk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ZWxzZSBpZihNb2RlbGVyVXRpbHMuaXNVbmJvdW5kKHBhcnQpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYocGFydC5pc0lOKCkpCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNb2RlbGVyVXRpbHMuaXNVbmJvdW5kKHBhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmlzSU4oKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRVbmJvdW5kQmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBhcnQuaXNPVVQoKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFydC5pc09VVCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmFkZFVuYm91bmRCbG9jayhibG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocGFydC5pc0lOT1VUKCkpeworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJ0LmlzSU5PVVQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmFkZFVuYm91bmRCbG9jayhibG9jayk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXMuYWRkVW5ib3VuZEJsb2NrKGJsb2NrKTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBhcnQuaXNJTigpIHx8IHBhcnQuaXNJTk9VVCgpKXsKKyAgICAgICAgICAgICAgICBpZiAocGFydC5pc0lOKCkgfHwgcGFydC5pc0lOT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gTW9kZWxlclV0aWxzLmNyZWF0ZVVud3JhcHBlZFBhcmFtZXRlcnMoamF4YlN0cnVjdFR5cGUsIGJsb2NrKTsKICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgTW9kZSBtb2RlID0gKHBhcnQuaXNJTk9VVCgpKT9Nb2RlLklOT1VUOk1vZGUuSU47Ci0gICAgICAgICAgICAgICAgICAgIGZvcihQYXJhbWV0ZXIgcGFyYW06IHBhcmFtcyl7CisgICAgICAgICAgICAgICAgICAgIE1vZGUgbW9kZSA9IHBhcnQuaXNJTk9VVCgpID8gTW9kZS5JTk9VVCA6IE1vZGUuSU47CisgICAgICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRQYXJhbWV0ZXJJbmRleChpbmRleCsrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldE1vZGUobW9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXN0b21pemVkUGFyYW1ldGVyTmFtZShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBpbk1zZywgcGFydCwgcGFyYW0sIHVud3JhcHBhYmxlKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH1lbHNlIGlmKHBhcnQuaXNPVVQoKSl7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LmlzT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgb3V0UGFyYW1zID0gTW9kZWxlclV0aWxzLmNyZWF0ZVVud3JhcHBlZFBhcmFtZXRlcnMoamF4YlN0cnVjdFR5cGUsIGJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yKFBhcmFtZXRlciBwYXJhbTogb3V0UGFyYW1zKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBvdXRQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldE1vZGUoTW9kZS5PVVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VzdG9taXplZFBhcmFtZXRlck5hbWUoaW5mby5wb3J0VHlwZU9wZXJhdGlvbiwgb3V0TXNnLCBwYXJ0LCBwYXJhbSwgdW53cmFwcGFibGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgaWYoTW9kZWxlclV0aWxzLmlzQm91bmRUb1NPQVBCb2R5KHBhcnQpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYocGFydC5pc0lOKCkpeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoTW9kZWxlclV0aWxzLmlzQm91bmRUb1NPQVBCb2R5KHBhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmlzSU4oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmFkZEJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHBhcnQuaXNPVVQoKSl7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5pc09VVCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXMuYWRkQm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocGFydC5pc0lOT1VUKCkpeworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuaXNJTk9VVCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXEuYWRkQm9keUJsb2NrKGJsb2NrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5hZGRCb2R5QmxvY2soYmxvY2spOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYoTW9kZWxlclV0aWxzLmlzQm91bmRUb1NPQVBIZWFkZXIocGFydCkpewotICAgICAgICAgICAgICAgICAgICBpZihwYXJ0LmlzSU4oKSl7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNb2RlbGVyVXRpbHMuaXNCb3VuZFRvU09BUEhlYWRlcihwYXJ0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5pc0lOKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRIZWFkZXJCbG9jayhibG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHBhcnQuaXNPVVQoKSl7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5pc09VVCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXMuYWRkSGVhZGVyQmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihwYXJ0LmlzSU5PVVQoKSl7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5pc0lOT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRIZWFkZXJCbG9jayhibG9jayk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXMuYWRkSGVhZGVyQmxvY2soYmxvY2spOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYoTW9kZWxlclV0aWxzLmlzQm91bmRUb01pbWVDb250ZW50KHBhcnQpKXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1vZGVsZXJVdGlscy5pc0JvdW5kVG9NaW1lQ29udGVudChwYXJ0KSkgewogICAgICAgICAgICAgICAgICAgICBMaXN0PE1JTUVDb250ZW50PiBtaW1lQ29udGVudHMgPSBudWxsOwogCi0gICAgICAgICAgICAgICAgICAgIGlmKHBhcnQuaXNJTigpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNJTigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lQ29udGVudHMgPSBnZXRNaW1lQ29udGVudHMoaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldElucHV0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5wdXRNZXNzYWdlKCksIHBhcnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5wdXRNZXNzYWdlKCksIHBhcnQuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGpheGJUeXBlID0gZ2V0QXR0YWNobWVudFR5cGUobWltZUNvbnRlbnRzLCBwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbmV3IEJsb2NrKGpheGJUeXBlLmdldE5hbWUoKSwgamF4YlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBuZXcgQmxvY2soamF4YlR5cGUuZ2V0TmFtZSgpLCBqYXhiVHlwZSwgcGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXEuYWRkQXR0YWNobWVudEJsb2NrKGJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocGFydC5pc09VVCgpKXsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LmlzT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50cyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0T3V0cHV0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0TWVzc2FnZSgpLCBwYXJ0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dE1lc3NhZ2UoKSwgcGFydC5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgamF4YlR5cGUgPSBnZXRBdHRhY2htZW50VHlwZShtaW1lQ29udGVudHMsIHBhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBuZXcgQmxvY2soamF4YlR5cGUuZ2V0TmFtZSgpLCBqYXhiVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBCbG9jayhqYXhiVHlwZS5nZXROYW1lKCksIGpheGJUeXBlLCBwYXJ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5hZGRBdHRhY2htZW50QmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihwYXJ0LmlzSU5PVVQoKSl7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5pc0lOT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50cyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnB1dE1lc3NhZ2UoKSwgcGFydC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnB1dE1lc3NhZ2UoKSwgcGFydC5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgamF4YlR5cGUgPSBnZXRBdHRhY2htZW50VHlwZShtaW1lQ29udGVudHMsIHBhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBuZXcgQmxvY2soamF4YlR5cGUuZ2V0TmFtZSgpLCBqYXhiVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBCbG9jayhqYXhiVHlwZS5nZXROYW1lKCksIGpheGJUeXBlLCBwYXJ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRBdHRhY2htZW50QmxvY2soYmxvY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmFkZEF0dGFjaG1lbnRCbG9jayhibG9jayk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50cyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0T3V0cHV0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0TWVzc2FnZSgpLCBwYXJ0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dE1lc3NhZ2UoKSwgcGFydC5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgSkFYQlR5cGUgb3V0SmF4YlR5cGUgPSBnZXRBdHRhY2htZW50VHlwZShtaW1lQ29udGVudHMsIHBhcnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5UeXBlID0gamF4YlR5cGUuZ2V0SmF2YVR5cGUoKS5nZXRUeXBlKCkuZ2V0TmFtZSgpOwpAQCAtMTY3NCw3MCArMTY3Niw2NiBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQW5kQW5ub3RhdGlvbiBpblRhID0gamF4YlR5cGUuZ2V0SmF2YVR5cGUoKS5nZXRUeXBlKCkuZ2V0VHlwZUFubigpOwogICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUFuZEFubm90YXRpb24gb3V0VGEgPSBvdXRKYXhiVHlwZS5nZXRKYXZhVHlwZSgpLmdldFR5cGUoKS5nZXRUeXBlQW5uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZigoKChpblRhICE9IG51bGwpICYmIChvdXRUYSAhPSBudWxsKSAmJiBpblRhLmVxdWFscyhvdXRUYSkpKSAmJiAhaW5UeXBlLmVxdWFscyhvdXRUeXBlKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgoaW5UYSAhPSBudWxsKSAmJiAob3V0VGEgIT0gbnVsbCkgJiYgaW5UYS5lcXVhbHMob3V0VGEpKSkgJiYgIWluVHlwZS5lcXVhbHMob3V0VHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamF2YVR5cGUgPSAiamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciI7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTMkpKQVhCTW9kZWwgamF4Yk1vZGVsID0gZ2V0SkFYQk1vZGVsQnVpbGRlcigpLmdldEpBWEJNb2RlbCgpLmdldFMySkpBWEJNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDb2RlTW9kZWwgY20gPSBqYXhiTW9kZWwuZ2VuZXJhdGVDb2RlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnNvbGVFcnJvclJlcG9ydGVyKGdldEVudmlyb25tZW50KCksIGZhbHNlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlR5cGUganQ9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAganQgPSBjbS5yZWYoamF2YVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSkNvZGVNb2RlbCBjbSA9IGpheGJNb2RlbC5nZW5lcmF0ZUNvZGUobnVsbCwgZXJyUmVjZWl2ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpUeXBlIGp0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdCA9IG9wdGlvbnMuZ2V0Q29kZU1vZGVsKCkucmVmKGphdmFUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhCVHlwZUFuZEFubm90YXRpb24gamF4YlRhID0gamF4YlR5cGUuZ2V0SmF2YVR5cGUoKS5nZXRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4YlRhLnNldFR5cGUoanQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYoTW9kZWxlclV0aWxzLmlzVW5ib3VuZChwYXJ0KSl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBhcnQuaXNJTigpKXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1vZGVsZXJVdGlscy5pc1VuYm91bmQocGFydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNJTigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXEuYWRkVW5ib3VuZEJsb2NrKGJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocGFydC5pc09VVCgpKXsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LmlzT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5hZGRVbmJvdW5kQmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihwYXJ0LmlzSU5PVVQoKSl7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5pc0lOT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRVbmJvdW5kQmxvY2soYmxvY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmFkZFVuYm91bmRCbG9jayhibG9jayk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocGFyYW1zID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOwogICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IE1vZGVsZXJVdGlscy5jcmVhdGVQYXJhbWV0ZXIocGFydC5nZXROYW1lKCksIGpheGJUeXBlLCBibG9jayk7CiAgICAgICAgICAgICAgICAgcGFyYW0uc2V0TW9kZShwYXJ0LmdldE1vZGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYocGFydC5pc1JldHVybigpKXsKKyAgICAgICAgICAgICAgICBpZiAocGFydC5pc1JldHVybigpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFBhcmFtZXRlckluZGV4KC0xKTsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRQYXJhbWV0ZXJJbmRleChwSW5kZXgrKyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYocGFydC5pc0lOKCkpCisgICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNJTigpKQogICAgICAgICAgICAgICAgICAgICBzZXRDdXN0b21pemVkUGFyYW1ldGVyTmFtZShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBpbk1zZywgcGFydCwgcGFyYW0sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmKG91dE1zZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG91dE1zZyAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICBzZXRDdXN0b21pemVkUGFyYW1ldGVyTmFtZShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBvdXRNc2csIHBhcnQsIHBhcmFtLCBmYWxzZSk7CiAKICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKHBhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZih1bndyYXBwYWJsZSAmJiAob3V0UGFyYW1zICE9IG51bGwpKXsKKyAgICAgICAgaWYgKHVud3JhcHBhYmxlICYmIChvdXRQYXJhbXMgIT0gbnVsbCkpIHsKICAgICAgICAgICAgIGludCBpbmRleCA9IHBhcmFtcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IoUGFyYW1ldGVyIHBhcmFtOm91dFBhcmFtcyl7Ci0gICAgICAgICAgICAgICAgaWYocGFyYW0uZ2V0TmFtZSgpLmVxdWFscygicmV0dXJuIikpeworICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9WYXJpYWJsZU5hbWUocGFyYW0uZ2V0TmFtZSgpKS5lcXVhbHMoInJldHVybiIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFBhcmFtZXRlckluZGV4KC0xKTsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgaW5QYXJhbSA9IE1vZGVsZXJVdGlscy5nZXRQYXJhbWV0ZXIocGFyYW0uZ2V0TmFtZSgpLCBwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBpZigoaW5QYXJhbSAhPSBudWxsKSAmJiBpblBhcmFtLmlzSU4oKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBpbkVsZW1lbnROYW1lID0gKChKQVhCVHlwZSlpblBhcmFtLmdldFR5cGUoKSkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3V0RWxlbWVudE5hbWUgPSAoKEpBWEJUeXBlKXBhcmFtLmdldFR5cGUoKSkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGluUGFyYW0gIT0gbnVsbCkgJiYgaW5QYXJhbS5pc0lOKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGluRWxlbWVudE5hbWUgPSBpblBhcmFtLmdldFR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvdXRFbGVtZW50TmFtZSA9IHBhcmFtLmdldFR5cGUoKS5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5KYXZhVHlwZSA9IGluUGFyYW0uZ2V0VHlwZU5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvdXRKYXZhVHlwZSA9IHBhcmFtLmdldFR5cGVOYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQW5kQW5ub3RhdGlvbiBpblRhID0gaW5QYXJhbS5nZXRUeXBlKCkuZ2V0SmF2YVR5cGUoKS5nZXRUeXBlKCkuZ2V0VHlwZUFubigpOwogICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUFuZEFubm90YXRpb24gb3V0VGEgPSBwYXJhbS5nZXRUeXBlKCkuZ2V0SmF2YVR5cGUoKS5nZXRUeXBlKCkuZ2V0VHlwZUFubigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5FbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMob3V0RWxlbWVudE5hbWUuZ2V0TG9jYWxQYXJ0KCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSmF2YVR5cGUuZXF1YWxzKG91dEphdmFUeXBlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluVGEgPT0gbnVsbCB8fCBvdXRUYSA9PSBudWxsKXx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5UYSAhPSBudWxsKSAmJiAob3V0VGEgIT0gbnVsbCkgJiYgaW5UYS5lcXVhbHMob3V0VGEpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbkVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhvdXRFbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKSkgJiYgaW5KYXZhVHlwZS5lcXVhbHMob3V0SmF2YVR5cGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpblRhID09IG51bGwgfHwgb3V0VGEgPT0gbnVsbCB8fCBpblRhLmVxdWFscyhvdXRUYSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJhbS5zZXRNb2RlKE1vZGUuSU5PVVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihvdXRQYXJhbXMuc2l6ZSgpID09IDEpeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRQYXJhbXMuc2l6ZSgpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFBhcmFtZXRlckluZGV4KC0xKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRQYXJhbWV0ZXJJbmRleChpbmRleCsrKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTE3NDcsNDIgKzE3NDUsNDIgQEAKICAgICAgICAgcmV0dXJuIHBhcmFtczsKICAgICB9CiAKLSAgICBwcml2YXRlIExpc3Q8UGFyYW1ldGVyPiBnZXRScGNMaXRQYXJhbWV0ZXJzKFJlcXVlc3QgcmVxLCBSZXNwb25zZSByZXMsIEJsb2NrIHJlcUJsb2NrLCBCbG9jayByZXNCbG9jaywgTGlzdDxNZXNzYWdlUGFydD4gcGFyYW1MaXN0KXsKKyAgICBwcml2YXRlIExpc3Q8UGFyYW1ldGVyPiBnZXRScGNMaXRQYXJhbWV0ZXJzKFJlcXVlc3QgcmVxLCBSZXNwb25zZSByZXMsIEJsb2NrIHJlcUJsb2NrLCBCbG9jayByZXNCbG9jaywgTGlzdDxNZXNzYWdlUGFydD4gcGFyYW1MaXN0KSB7CiAgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKICAgICAgICAgTWVzc2FnZSBpbk1zZyA9IGdldElucHV0TWVzc2FnZSgpOwogICAgICAgICBNZXNzYWdlIG91dE1zZyA9IGdldE91dHB1dE1lc3NhZ2UoKTsKLSAgICAgICAgUzJKSkFYQk1vZGVsIGpheGJNb2RlbCA9ICgoUnBjTGl0U3RydWN0dXJlKXJlcUJsb2NrLmdldFR5cGUoKSkuZ2V0SmF4Yk1vZGVsKCkuZ2V0UzJKSkFYQk1vZGVsKCk7Ci0gICAgICAgIExpc3Q8UGFyYW1ldGVyPiBpblBhcmFtcyA9IE1vZGVsZXJVdGlscy5jcmVhdGVScGNMaXRQYXJhbWV0ZXJzKGluTXNnLCByZXFCbG9jaywgamF4Yk1vZGVsKTsKKyAgICAgICAgUzJKSkFYQk1vZGVsIGpheGJNb2RlbCA9ICgoUnBjTGl0U3RydWN0dXJlKSByZXFCbG9jay5nZXRUeXBlKCkpLmdldEpheGJNb2RlbCgpLmdldFMySkpBWEJNb2RlbCgpOworICAgICAgICBMaXN0PFBhcmFtZXRlcj4gaW5QYXJhbXMgPSBNb2RlbGVyVXRpbHMuY3JlYXRlUnBjTGl0UGFyYW1ldGVycyhpbk1zZywgcmVxQmxvY2ssIGpheGJNb2RlbCwgZXJyUmVjZWl2ZXIpOwogICAgICAgICBMaXN0PFBhcmFtZXRlcj4gb3V0UGFyYW1zID0gbnVsbDsKLSAgICAgICAgaWYob3V0TXNnICE9IG51bGwpCi0gICAgICAgICAgICBvdXRQYXJhbXMgPSBNb2RlbGVyVXRpbHMuY3JlYXRlUnBjTGl0UGFyYW1ldGVycyhvdXRNc2csIHJlc0Jsb2NrLCBqYXhiTW9kZWwpOworICAgICAgICBpZiAob3V0TXNnICE9IG51bGwpCisgICAgICAgICAgICBvdXRQYXJhbXMgPSBNb2RlbGVyVXRpbHMuY3JlYXRlUnBjTGl0UGFyYW1ldGVycyhvdXRNc2csIHJlc0Jsb2NrLCBqYXhiTW9kZWwsIGVyclJlY2VpdmVyKTsKIAogICAgICAgICAvL2NyZWF0ZSBwYXJhbWV0ZXJzIGZvciBoZWFkZXIgYW5kIG1pbWUgcGFydHMKICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZm9yKE1lc3NhZ2VQYXJ0IHBhcnQ6IHBhcmFtTGlzdCl7Ci0gICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbnVsbDsKLSAgICAgICAgICAgIGlmKE1vZGVsZXJVdGlscy5pc0JvdW5kVG9TT0FQQm9keShwYXJ0KSl7Ci0gICAgICAgICAgICAgICAgaWYocGFydC5pc0lOKCkpeworICAgICAgICBmb3IgKE1lc3NhZ2VQYXJ0IHBhcnQgOiBwYXJhbUxpc3QpIHsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG51bGw7CisgICAgICAgICAgICBpZiAoTW9kZWxlclV0aWxzLmlzQm91bmRUb1NPQVBCb2R5KHBhcnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNJTigpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtID0gTW9kZWxlclV0aWxzLmdldFBhcmFtZXRlcihwYXJ0LmdldE5hbWUoKSwgaW5QYXJhbXMpOwotICAgICAgICAgICAgICAgIH1lbHNlIGlmKG91dFBhcmFtcyAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG91dFBhcmFtcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtID0gTW9kZWxlclV0aWxzLmdldFBhcmFtZXRlcihwYXJ0LmdldE5hbWUoKSwgb3V0UGFyYW1zKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZSBpZihNb2RlbGVyVXRpbHMuaXNCb3VuZFRvU09BUEhlYWRlcihwYXJ0KSl7CisgICAgICAgICAgICB9IGVsc2UgaWYgKE1vZGVsZXJVdGlscy5pc0JvdW5kVG9TT0FQSGVhZGVyKHBhcnQpKSB7CiAgICAgICAgICAgICAgICAgUU5hbWUgaGVhZGVyTmFtZSA9IHBhcnQuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgICAgIEpBWEJUeXBlIGpheGJUeXBlID0gZ2V0SkFYQlR5cGUoaGVhZGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgQmxvY2sgaGVhZGVyQmxvY2sgPSBuZXcgQmxvY2soaGVhZGVyTmFtZSwgamF4YlR5cGUpOworICAgICAgICAgICAgICAgIEpBWEJUeXBlIGpheGJUeXBlID0gZ2V0SkFYQlR5cGUocGFydCk7CisgICAgICAgICAgICAgICAgQmxvY2sgaGVhZGVyQmxvY2sgPSBuZXcgQmxvY2soaGVhZGVyTmFtZSwgamF4YlR5cGUsIHBhcnQpOwogICAgICAgICAgICAgICAgIHBhcmFtID0gTW9kZWxlclV0aWxzLmNyZWF0ZVBhcmFtZXRlcihwYXJ0LmdldE5hbWUoKSwgamF4YlR5cGUsIGhlYWRlckJsb2NrKTsKLSAgICAgICAgICAgICAgICBpZihwYXJ0LmlzSU4oKSl7CisgICAgICAgICAgICAgICAgaWYgKHBhcnQuaXNJTigpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRIZWFkZXJCbG9jayhoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYocGFydC5pc09VVCgpKXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuaXNPVVQoKSkgewogICAgICAgICAgICAgICAgICAgICByZXMuYWRkSGVhZGVyQmxvY2soaGVhZGVyQmxvY2spOwotICAgICAgICAgICAgICAgIH1lbHNlIGlmKHBhcnQuaXNJTk9VVCgpKXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuaXNJTk9VVCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRIZWFkZXJCbG9jayhoZWFkZXJCbG9jayk7CiAgICAgICAgICAgICAgICAgICAgIHJlcy5hZGRIZWFkZXJCbG9jayhoZWFkZXJCbG9jayk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2UgaWYoTW9kZWxlclV0aWxzLmlzQm91bmRUb01pbWVDb250ZW50KHBhcnQpKXsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTW9kZWxlclV0aWxzLmlzQm91bmRUb01pbWVDb250ZW50KHBhcnQpKSB7CiAgICAgICAgICAgICAgICAgTGlzdDxNSU1FQ29udGVudD4gbWltZUNvbnRlbnRzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZihwYXJ0LmlzSU4oKSB8fCBwYXJ0LmlzSU5PVVQoKSkKKyAgICAgICAgICAgICAgICBpZiAocGFydC5pc0lOKCkgfHwgcGFydC5pc0lOT1VUKCkpCiAgICAgICAgICAgICAgICAgICAgIG1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50cyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnB1dE1lc3NhZ2UoKSwgcGFydC5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIGVsc2UKQEAgLTE3OTIsNTkgKzE3OTAsNTcgQEAKICAgICAgICAgICAgICAgICBKQVhCVHlwZSB0eXBlID0gZ2V0QXR0YWNobWVudFR5cGUobWltZUNvbnRlbnRzLCBwYXJ0KTsKICAgICAgICAgICAgICAgICAvL2NyZWF0ZSBQYXJhbWV0ZXJzIGluIHJlcXVlc3Qgb3IgcmVzcG9uc2UKICAgICAgICAgICAgICAgICAvL0Jsb2NrIG1pbWVCbG9jayA9IG5ldyBCbG9jayhuZXcgUU5hbWUocGFydC5nZXROYW1lKCkpLCB0eXBlKTsKLSAgICAgICAgICAgICAgICBCbG9jayBtaW1lQmxvY2sgPSBuZXcgQmxvY2sodHlwZS5nZXROYW1lKCksIHR5cGUpOworICAgICAgICAgICAgICAgIEJsb2NrIG1pbWVCbG9jayA9IG5ldyBCbG9jayh0eXBlLmdldE5hbWUoKSwgdHlwZSwgcGFydCk7CiAgICAgICAgICAgICAgICAgcGFyYW0gPSBNb2RlbGVyVXRpbHMuY3JlYXRlUGFyYW1ldGVyKHBhcnQuZ2V0TmFtZSgpLCB0eXBlLCBtaW1lQmxvY2spOwotICAgICAgICAgICAgICAgIGlmKHBhcnQuaXNJTigpKXsKKyAgICAgICAgICAgICAgICBpZiAocGFydC5pc0lOKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmVxLmFkZEF0dGFjaG1lbnRCbG9jayhtaW1lQmxvY2spOwotICAgICAgICAgICAgICAgIH1lbHNlIGlmKHBhcnQuaXNPVVQoKSl7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LmlzT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmVzLmFkZEF0dGFjaG1lbnRCbG9jayhtaW1lQmxvY2spOwotICAgICAgICAgICAgICAgIH1lbHNlIGlmKHBhcnQuaXNJTk9VVCgpKXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuaXNJTk9VVCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50cyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0T3V0cHV0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRNZXNzYWdlKCksIHBhcnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRNZXNzYWdlKCksIHBhcnQuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgSkFYQlR5cGUgb3V0SmF4YlR5cGUgPSBnZXRBdHRhY2htZW50VHlwZShtaW1lQ29udGVudHMsIHBhcnQpOwogCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpblR5cGUgPSB0eXBlLmdldEphdmFUeXBlKCkuZ2V0VHlwZSgpLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dFR5cGUgPSBvdXRKYXhiVHlwZS5nZXRKYXZhVHlwZSgpLmdldFR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFpblR5cGUuZXF1YWxzKG91dFR5cGUpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpblR5cGUuZXF1YWxzKG91dFR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamF2YVR5cGUgPSAiamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKQ29kZU1vZGVsIGNtID0gamF4Yk1vZGVsLmdlbmVyYXRlQ29kZShudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnNvbGVFcnJvclJlcG9ydGVyKGdldEVudmlyb25tZW50KCksIGZhbHNlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKVHlwZSBqdD0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGp0ID0gY20ucmVmKGphdmFUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpUeXBlIGp0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGp0ID0gb3B0aW9ucy5nZXRDb2RlTW9kZWwoKS5yZWYoamF2YVR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgSkFYQlR5cGVBbmRBbm5vdGF0aW9uIGpheGJUYSA9IHR5cGUuZ2V0SmF2YVR5cGUoKS5nZXRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBqYXhiVGEuc2V0VHlwZShqdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmVxLmFkZEF0dGFjaG1lbnRCbG9jayhtaW1lQmxvY2spOwogICAgICAgICAgICAgICAgICAgICByZXMuYWRkQXR0YWNobWVudEJsb2NrKG1pbWVCbG9jayk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2UgaWYoTW9kZWxlclV0aWxzLmlzVW5ib3VuZChwYXJ0KSl7CisgICAgICAgICAgICB9IGVsc2UgaWYgKE1vZGVsZXJVdGlscy5pc1VuYm91bmQocGFydCkpIHsKICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcGFydC5nZXREZXNjcmlwdG9yKCk7CiAgICAgICAgICAgICAgICAgSkFYQlR5cGUgdHlwZSA9IGdldEpBWEJUeXBlKHBhcnQpOwotICAgICAgICAgICAgICAgIEJsb2NrIHVuYm91bmRCbG9jayA9IG5ldyBCbG9jayhuYW1lLCB0eXBlKTsKLSAgICAgICAgICAgICAgICBpZihwYXJ0LmlzSU4oKSl7CisgICAgICAgICAgICAgICAgQmxvY2sgdW5ib3VuZEJsb2NrID0gbmV3IEJsb2NrKG5hbWUsIHR5cGUsIHBhcnQpOworICAgICAgICAgICAgICAgIGlmIChwYXJ0LmlzSU4oKSkgewogICAgICAgICAgICAgICAgICAgICByZXEuYWRkVW5ib3VuZEJsb2NrKHVuYm91bmRCbG9jayk7Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYocGFydC5pc09VVCgpKXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuaXNPVVQoKSkgewogICAgICAgICAgICAgICAgICAgICByZXMuYWRkVW5ib3VuZEJsb2NrKHVuYm91bmRCbG9jayk7Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYocGFydC5pc0lOT1VUKCkpeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5pc0lOT1VUKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmVxLmFkZFVuYm91bmRCbG9jayh1bmJvdW5kQmxvY2spOwogICAgICAgICAgICAgICAgICAgICByZXMuYWRkVW5ib3VuZEJsb2NrKHVuYm91bmRCbG9jayk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBhcmFtID0gTW9kZWxlclV0aWxzLmNyZWF0ZVBhcmFtZXRlcihwYXJ0LmdldE5hbWUoKSwgdHlwZSwgdW5ib3VuZEJsb2NrKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBhcmFtICE9IG51bGwpewotICAgICAgICAgICAgICAgIGlmKHBhcnQuaXNSZXR1cm4oKSl7CisgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0LmlzUmV0dXJuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0UGFyYW1ldGVySW5kZXgoLTEpOwotICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFBhcmFtZXRlckluZGV4KGluZGV4KyspOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwYXJhbS5zZXRNb2RlKHBhcnQuZ2V0TW9kZSgpKTsKICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKHBhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmb3IoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1zKXsKLSAgICAgICAgICAgIGlmKHBhcmFtLmlzSU4oKSkKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS5pc0lOKCkpCiAgICAgICAgICAgICAgICAgc2V0Q3VzdG9taXplZFBhcmFtZXRlck5hbWUoaW5mby5wb3J0VHlwZU9wZXJhdGlvbiwgaW5Nc2csIGluTXNnLmdldFBhcnQocGFyYW0uZ2V0TmFtZSgpKSwgcGFyYW0sIGZhbHNlKTsKLSAgICAgICAgICAgIGVsc2UgaWYob3V0TXNnICE9IG51bGwpCisgICAgICAgICAgICBlbHNlIGlmIChvdXRNc2cgIT0gbnVsbCkKICAgICAgICAgICAgICAgICBzZXRDdXN0b21pemVkUGFyYW1ldGVyTmFtZShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBvdXRNc2csIG91dE1zZy5nZXRQYXJ0KHBhcmFtLmdldE5hbWUoKSksIHBhcmFtLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBhcmFtczsKQEAgLTE4NTMsNyArMTg0OSw3IEBACiAgICAgcHJpdmF0ZSBMaXN0PFBhcmFtZXRlcj4gZ2V0UmVxdWVzdFBhcmFtZXRlcnMoUmVxdWVzdCByZXF1ZXN0LCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCkgewogICAgICAgICBNZXNzYWdlIGlucHV0TWVzc2FnZSA9IGdldElucHV0TWVzc2FnZSgpOwogICAgICAgICAvL3RoZXJlIGlzIG5vIGlucHV0IG1lc3NhZ2UsIHJldHVybiB6ZXJvIHBhcmFtZXRlcnMKLSAgICAgICAgaWYoaW5wdXRNZXNzYWdlICE9IG51bGwgJiYgIWlucHV0TWVzc2FnZS5wYXJ0cygpLmhhc05leHQoKSkKKyAgICAgICAgaWYgKGlucHV0TWVzc2FnZSAhPSBudWxsICYmICFpbnB1dE1lc3NhZ2UucGFydHMoKS5oYXNOZXh0KCkpCiAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7CiAKICAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IGluUGFyYW1ldGVycyA9IG51bGw7CkBAIC0xODYzLDQzICsxODU5LDQzIEBACiAgICAgICAgIGJvb2xlYW4gdW53cmFwcGFibGUgPSBpc1Vud3JhcHBhYmxlKCk7CiAgICAgICAgIGJvb2xlYW4gZG9uZVNPQVBCb2R5ID0gZmFsc2U7CiAgICAgICAgIC8vc2V0dXAgcmVxdWVzdCBwYXJhbWV0ZXJzCi0gICAgICAgIGZvcihTdHJpbmcgaW5QYXJhbU5hbWU6IHBhcmFtZXRlckxpc3QpeworICAgICAgICBmb3IgKFN0cmluZyBpblBhcmFtTmFtZSA6IHBhcmFtZXRlckxpc3QpIHsKICAgICAgICAgICAgIE1lc3NhZ2VQYXJ0IHBhcnQgPSBpbnB1dE1lc3NhZ2UuZ2V0UGFydChpblBhcmFtTmFtZSk7Ci0gICAgICAgICAgICBpZihwYXJ0ID09IG51bGwpCisgICAgICAgICAgICBpZiAocGFydCA9PSBudWxsKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgcmVxQm9keU5hbWUgPSBwYXJ0LmdldERlc2NyaXB0b3IoKTsKICAgICAgICAgICAgIGpheGJSZXFUeXBlID0gZ2V0SkFYQlR5cGUocGFydCk7Ci0gICAgICAgICAgICBpZih1bndyYXBwYWJsZSl7CisgICAgICAgICAgICBpZiAodW53cmFwcGFibGUpIHsKICAgICAgICAgICAgICAgICAvL1NvIGJ1aWxkIGJvZHkgYW5kIGhlYWRlciBibG9ja3MgYW5kIHNldCB0byByZXF1ZXN0IGFuZCByZXNwb25zZQogICAgICAgICAgICAgICAgIEpBWEJTdHJ1Y3R1cmVkVHlwZSBqYXhiUmVxdWVzdFR5cGUgPSBNb2RlbGVyVXRpbHMuY3JlYXRlSkFYQlN0cnVjdHVyZVR5cGUoamF4YlJlcVR5cGUpOwotICAgICAgICAgICAgICAgIHJlcUJsb2NrID0gbmV3IEJsb2NrKHJlcUJvZHlOYW1lLCBqYXhiUmVxdWVzdFR5cGUpOwotICAgICAgICAgICAgICAgIGlmKE1vZGVsZXJVdGlscy5pc0JvdW5kVG9TT0FQQm9keShwYXJ0KSl7CisgICAgICAgICAgICAgICAgcmVxQmxvY2sgPSBuZXcgQmxvY2socmVxQm9keU5hbWUsIGpheGJSZXF1ZXN0VHlwZSwgcGFydCk7CisgICAgICAgICAgICAgICAgaWYgKE1vZGVsZXJVdGlscy5pc0JvdW5kVG9TT0FQQm9keShwYXJ0KSkgewogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZEJvZHlCbG9jayhyZXFCbG9jayk7Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYoTW9kZWxlclV0aWxzLmlzVW5ib3VuZChwYXJ0KSl7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNb2RlbGVyVXRpbHMuaXNVbmJvdW5kKHBhcnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkVW5ib3VuZEJsb2NrKHJlcUJsb2NrKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5QYXJhbWV0ZXJzID0gTW9kZWxlclV0aWxzLmNyZWF0ZVVud3JhcHBlZFBhcmFtZXRlcnMoamF4YlJlcXVlc3RUeXBlLCByZXFCbG9jayk7Ci0gICAgICAgICAgICAgICAgZm9yKFBhcmFtZXRlciBwYXJhbTogaW5QYXJhbWV0ZXJzKXsKKyAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IGluUGFyYW1ldGVycykgewogICAgICAgICAgICAgICAgICAgICBzZXRDdXN0b21pemVkUGFyYW1ldGVyTmFtZShpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLCBpbnB1dE1lc3NhZ2UsIHBhcnQsIHBhcmFtLCB1bndyYXBwYWJsZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgcmVxQmxvY2sgPSBuZXcgQmxvY2socmVxQm9keU5hbWUsIGpheGJSZXFUeXBlKTsKLSAgICAgICAgICAgICAgICBpZihNb2RlbGVyVXRpbHMuaXNCb3VuZFRvU09BUEJvZHkocGFydCkgJiYgIWRvbmVTT0FQQm9keSl7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcUJsb2NrID0gbmV3IEJsb2NrKHJlcUJvZHlOYW1lLCBqYXhiUmVxVHlwZSwgcGFydCk7CisgICAgICAgICAgICAgICAgaWYgKE1vZGVsZXJVdGlscy5pc0JvdW5kVG9TT0FQQm9keShwYXJ0KSAmJiAhZG9uZVNPQVBCb2R5KSB7CiAgICAgICAgICAgICAgICAgICAgIGRvbmVTT0FQQm9keSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkQm9keUJsb2NrKHJlcUJsb2NrKTsKLSAgICAgICAgICAgICAgICB9ZWxzZSBpZihNb2RlbGVyVXRpbHMuaXNCb3VuZFRvU09BUEhlYWRlcihwYXJ0KSl7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNb2RlbGVyVXRpbHMuaXNCb3VuZFRvU09BUEhlYWRlcihwYXJ0KSkgewogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZEhlYWRlckJsb2NrKHJlcUJsb2NrKTsKLSAgICAgICAgICAgICAgICB9ZWxzZSBpZihNb2RlbGVyVXRpbHMuaXNCb3VuZFRvTWltZUNvbnRlbnQocGFydCkpeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTW9kZWxlclV0aWxzLmlzQm91bmRUb01pbWVDb250ZW50KHBhcnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIExpc3Q8TUlNRUNvbnRlbnQ+IG1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50cyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldElucHV0TWVzc2FnZSgpLCBwYXJ0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5wdXRNZXNzYWdlKCksIHBhcnQuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgamF4YlJlcVR5cGUgPSBnZXRBdHRhY2htZW50VHlwZShtaW1lQ29udGVudHMsIHBhcnQpOwogICAgICAgICAgICAgICAgICAgICAvL3JlcUJsb2NrID0gbmV3IEJsb2NrKG5ldyBRTmFtZShwYXJ0LmdldE5hbWUoKSksIGpheGJSZXFUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxQmxvY2sgPSBuZXcgQmxvY2soamF4YlJlcVR5cGUuZ2V0TmFtZSgpLCBqYXhiUmVxVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJlcUJsb2NrID0gbmV3IEJsb2NrKGpheGJSZXFUeXBlLmdldE5hbWUoKSwgamF4YlJlcVR5cGUsIHBhcnQpOwogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRCbG9jayhyZXFCbG9jayk7Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYoTW9kZWxlclV0aWxzLmlzVW5ib3VuZChwYXJ0KSl7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNb2RlbGVyVXRpbHMuaXNVbmJvdW5kKHBhcnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkVW5ib3VuZEJsb2NrKHJlcUJsb2NrKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoaW5QYXJhbWV0ZXJzID09IG51bGwpCisgICAgICAgICAgICAgICAgaWYgKGluUGFyYW1ldGVycyA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICBpblBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBNb2RlbGVyVXRpbHMuY3JlYXRlUGFyYW1ldGVyKHBhcnQuZ2V0TmFtZSgpLCBqYXhiUmVxVHlwZSwgcmVxQmxvY2spOwogICAgICAgICAgICAgICAgIHNldEN1c3RvbWl6ZWRQYXJhbWV0ZXJOYW1lKGluZm8ucG9ydFR5cGVPcGVyYXRpb24sIGlucHV0TWVzc2FnZSwgcGFydCwgcGFyYW0sIGZhbHNlKTsKQEAgLTE5MTQsNDYgKzE5MTAsMjYgQEAKICAgICAgKiBAcGFyYW0gcGFyYW0KICAgICAgKiBAcGFyYW0gd3JhcHBlclN0eWxlIFRPRE8KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0Q3VzdG9taXplZFBhcmFtZXRlck5hbWUoRXh0ZW5zaWJsZSBleHRlbnNpb24sIE1lc3NhZ2UgbXNnLCBNZXNzYWdlUGFydCBwYXJ0LCBQYXJhbWV0ZXIgcGFyYW0sIGJvb2xlYW4gd3JhcHBlclN0eWxlKSB7Ci0gICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSAoSkFYV1NCaW5kaW5nKWdldEV4dGVuc2lvbk9mVHlwZShleHRlbnNpb24sIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmKGpheHdzQmluZGluZyA9PSBudWxsKQorICAgIHByaXZhdGUgdm9pZCBzZXRDdXN0b21pemVkUGFyYW1ldGVyTmFtZShUV1NETEV4dGVuc2libGUgZXh0ZW5zaW9uLCBNZXNzYWdlIG1zZywgTWVzc2FnZVBhcnQgcGFydCwgUGFyYW1ldGVyIHBhcmFtLCBib29sZWFuIHdyYXBwZXJTdHlsZSkgeworICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nID0gKEpBWFdTQmluZGluZykgZ2V0RXh0ZW5zaW9uT2ZUeXBlKGV4dGVuc2lvbiwgSkFYV1NCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgaWYgKGpheHdzQmluZGluZyA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFydC5nZXROYW1lKCk7CiAgICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0gcGFydC5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmKHdyYXBwZXJTdHlsZSkKKyAgICAgICAgaWYgKHdyYXBwZXJTdHlsZSkKICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gcGFyYW0uZ2V0VHlwZSgpLmdldE5hbWUoKTsKICAgICAgICAgU3RyaW5nIGN1c3RvbU5hbWUgPSBqYXh3c0JpbmRpbmcuZ2V0UGFyYW1ldGVyTmFtZShtc2cuZ2V0TmFtZSgpLCBwYXJhbU5hbWUsIGVsZW1lbnROYW1lLCB3cmFwcGVyU3R5bGUpOwotICAgICAgICBpZihjdXN0b21OYW1lICE9IG51bGwgJiYgIWN1c3RvbU5hbWUuZXF1YWxzKCIiKSl7CisgICAgICAgIGlmIChjdXN0b21OYW1lICE9IG51bGwgJiYgIWN1c3RvbU5hbWUuZXF1YWxzKCIiKSkgewogICAgICAgICAgICAgcGFyYW0uc2V0Q3VzdG9tTmFtZShjdXN0b21OYW1lKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgSkFYQlR5cGUgZ2V0SkFYQlR5cGUoUU5hbWUgbmFtZSkgewotICAgICAgICByZXR1cm4gamF4Yk1vZGVsQnVpbGRlci5nZXRKQVhCVHlwZShuYW1lKTsKLSAgICB9Ci0KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbmZsaWN0aW5nUG9ydENsYXNzTmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgV1NETE1vZGVsZXJCYXNlI2dldEpBWEJTY2hlbWFBbmFseXplckluc3RuYWNlKFdTRExNb2RlbEluZm8sIFByb3BlcnRpZXMsIG9yZy53M2MuZG9tLkVsZW1lbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEpBWEJNb2RlbEJ1aWxkZXIgZ2V0SkFYQlNjaGVtYUFuYWx5emVySW5zdG5hY2UoV1NETE1vZGVsSW5mbyBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVDb2xsZWN0b3IgY2xhc3NOYW1lQ29sbGVjdG9yLCBMaXN0IGVsZW1lbnRzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQk1vZGVsQnVpbGRlcihpbmZvLCBvcHRpb25zLCBjbGFzc05hbWVDb2xsZWN0b3IsIGVsZW1lbnRzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBXU0RMTW9kZWxlckJhc2UjaXNVbndyYXBwYWJsZSgpCi0gICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVbndyYXBwYWJsZSgpIHsKLSAgICAgICAgaWYoIWdldFdyYXBwZXJTdHlsZUN1c3RvbWl6YXRpb24oKSkKKyAgICAgICAgaWYgKCFnZXRXcmFwcGVyU3R5bGVDdXN0b21pemF0aW9uKCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2UgaW5wdXRNZXNzYWdlID0gZ2V0SW5wdXRNZXNzYWdlKCk7CkBAIC0xOTYyLDI3ICsxOTM4LDI3IEBACiAgICAgICAgIC8vIFdyYXBwZXIgc3R5bGUgaWYgdGhlIG9wZXJhdGlvbidzIGlucHV0IGFuZCBvdXRwdXQgbWVzc2FnZXMgZWFjaCBjb250YWluCiAgICAgICAgIC8vIG9ubHkgYSBzaW5nbGUgcGFydAogICAgICAgICBpZiAoKGlucHV0TWVzc2FnZSAhPSBudWxsICYmIGlucHV0TWVzc2FnZS5udW1QYXJ0cygpICE9IDEpCi0gICAgICAgICAgICB8fCAob3V0cHV0TWVzc2FnZSAhPSBudWxsICYmIG91dHB1dE1lc3NhZ2UubnVtUGFydHMoKSAhPSAxKSkgeworICAgICAgICAgICAgICAgIHx8IChvdXRwdXRNZXNzYWdlICE9IG51bGwgJiYgb3V0cHV0TWVzc2FnZS5udW1QYXJ0cygpICE9IDEpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBNZXNzYWdlUGFydCBpbnB1dFBhcnQgPSBpbnB1dE1lc3NhZ2UgIT0gbnVsbAotICAgICAgICAgICAgICAgID8gKE1lc3NhZ2VQYXJ0KWlucHV0TWVzc2FnZS5wYXJ0cygpLm5leHQoKSA6IG51bGw7CisgICAgICAgICAgICAgICAgPyBpbnB1dE1lc3NhZ2UucGFydHMoKS5uZXh0KCkgOiBudWxsOwogICAgICAgICBNZXNzYWdlUGFydCBvdXRwdXRQYXJ0ID0gb3V0cHV0TWVzc2FnZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgPyAoTWVzc2FnZVBhcnQpb3V0cHV0TWVzc2FnZS5wYXJ0cygpLm5leHQoKSA6IG51bGw7CisgICAgICAgICAgICAgICAgPyBvdXRwdXRNZXNzYWdlLnBhcnRzKCkubmV4dCgpIDogbnVsbDsKICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldE5hbWUoKTsKIAogICAgICAgICAvLyBXcmFwcGVyIHN0eWxlIGlmIHRoZSBpbnB1dCBtZXNzYWdlIHBhcnQgcmVmZXJzIHRvIGEgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24gd2hvc2UgbG9jYWxuYW1lCiAgICAgICAgIC8vIGlzIGVxdWFsIHRvIHRoZSBvcGVyYXRpb24gbmFtZQogICAgICAgICAvLyBXcmFwcGVyIHN0eWxlIGlmIHRoZSBvdXRwdXQgbWVzc2FnZSBwYXJ0IHJlZmVycyB0byBhIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uCiAgICAgICAgIGlmICgoaW5wdXRQYXJ0ICE9IG51bGwgJiYgIWlucHV0UGFydC5nZXREZXNjcmlwdG9yKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKG9wZXJhdGlvbk5hbWUpKSB8fAotICAgICAgICAgICAgKG91dHB1dFBhcnQgIT0gbnVsbCAmJiBvdXRwdXRQYXJ0LmdldERlc2NyaXB0b3JLaW5kKCkgIT0gU2NoZW1hS2luZHMuWFNEX0VMRU1FTlQpKQorICAgICAgICAgICAgICAgIChvdXRwdXRQYXJ0ICE9IG51bGwgJiYgb3V0cHV0UGFydC5nZXREZXNjcmlwdG9yS2luZCgpICE9IFNjaGVtYUtpbmRzLlhTRF9FTEVNRU5UKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAvL2NoZWNrIHRvIHNlZSBpZiBlaXRoZXIgaW5wdXQgb3Igb3V0cHV0IG1lc3NhZ2UgcGFydCBub3QgYm91bmQgdG8gc29hcGJpbmc6Ym9keQogICAgICAgICAvL2luIHRoYXQgY2FzZSB0aGUgb3BlcmF0aW9uIGlzIG5vdCB3cmFwcGVyIHN0eWxlCi0gICAgICAgIGlmKCgoaW5wdXRQYXJ0ICE9IG51bGwpICYmIChpbnB1dFBhcnQuZ2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZCgpICE9IE1lc3NhZ2VQYXJ0LlNPQVBfQk9EWV9CSU5ESU5HKSkgfHwKLSAgICAgICAgICAgICAgICAoKG91dHB1dFBhcnQgIT0gbnVsbCkgJiYob3V0cHV0UGFydC5nZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRLaW5kKCkgIT0gTWVzc2FnZVBhcnQuU09BUF9CT0RZX0JJTkRJTkcpKSkKKyAgICAgICAgaWYgKCgoaW5wdXRQYXJ0ICE9IG51bGwpICYmIChpbnB1dFBhcnQuZ2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZCgpICE9IE1lc3NhZ2VQYXJ0LlNPQVBfQk9EWV9CSU5ESU5HKSkgfHwKKyAgICAgICAgICAgICAgICAoKG91dHB1dFBhcnQgIT0gbnVsbCkgJiYgKG91dHB1dFBhcnQuZ2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZCgpICE9IE1lc3NhZ2VQYXJ0LlNPQVBfQk9EWV9CSU5ESU5HKSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgLy8gV3JhcHBlciBzdHlsZSBpZiB0aGUgZWxlbWVudHMgcmVmZXJyZWQgdG8gYnkgdGhlIGlucHV0IGFuZCBvdXRwdXQgbWVzc2FnZSBwYXJ0cwpAQCAtMTk5Myw1MiArMTk2OSw0OSBAQAogICAgICAgICAvL1RoZXNlIGNoZWNraW5zIGFyZSBkb25lIGJ5IGpheGIsIHdlIGp1c3QgY2hlY2sgaWYgamF4YiBoYXMgd3JhcHBlciBjaGlsZHJlbi4gSWYgdGhlcmUKICAgICAgICAgLy8gYXJlIHRoZW4gaXRzIHdyYXBwZXIgc3R5bGUKICAgICAgICAgLy9pZihpbnB1dFBhcnQgIT0gbnVsbCAmJiBvdXRwdXRQYXJ0ICE9IG51bGwpewotICAgICAgICBpZihpbnB1dFBhcnQgIT0gbnVsbCl7CisgICAgICAgIGlmIChpbnB1dFBhcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgYm9vbGVhbiBpbnB1dFdyYXBwYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgSkFYQlR5cGUgaW5wdXRUeXBlID0gZ2V0SkFYQlR5cGUoaW5wdXRQYXJ0LmdldERlc2NyaXB0b3IoKSk7Ci0gICAgICAgICAgICBpZihpbnB1dFR5cGUgIT0gbnVsbCl7CisgICAgICAgICAgICBKQVhCVHlwZSBpbnB1dFR5cGUgPSBnZXRKQVhCVHlwZShpbnB1dFBhcnQpOworICAgICAgICAgICAgaWYgKGlucHV0VHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW5wdXRXcmFwcGFibGUgPSBpbnB1dFR5cGUuaXNVbndyYXBwYWJsZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy9pZiB0aGVyZSBhcmUgbm8gb3V0cHV0IHBhcnQgKG9uZXdheSksIHRoZSBvcGVyYXRpb24gY2FuIHN0aWxsIGJlIHdyYXBwZXIgc3R5bGUKLSAgICAgICAgICAgIGlmKG91dHB1dFBhcnQgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICByZXR1cm4gaW5wdXRXcmFwcGFibGU7CisgICAgICAgICAgICBpZiAob3V0cHV0UGFydCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0V3JhcHBhYmxlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgSkFYQlR5cGUgb3V0cHV0VHlwZSA9IGdldEpBWEJUeXBlKG91dHB1dFBhcnQuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIGlmKChpbnB1dFR5cGUgIT0gbnVsbCkgJiYgKG91dHB1dFR5cGUgIT0gbnVsbCkpCisgICAgICAgICAgICBKQVhCVHlwZSBvdXRwdXRUeXBlID0gZ2V0SkFYQlR5cGUob3V0cHV0UGFydCk7CisgICAgICAgICAgICBpZiAoKGlucHV0VHlwZSAhPSBudWxsKSAmJiAob3V0cHV0VHlwZSAhPSBudWxsKSkKICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRUeXBlLmlzVW53cmFwcGFibGUoKSAmJiBvdXRwdXRUeXBlLmlzVW53cmFwcGFibGUoKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGdldFdyYXBwZXJTdHlsZUN1c3RvbWl6YXRpb24oKSB7CiAgICAgICAgIC8vZmlyc3Qgd2UgbG9vayBpbnRvIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24KICAgICAgICAgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk9wZXJhdGlvbiBwb3J0VHlwZU9wZXJhdGlvbiA9IGluZm8ucG9ydFR5cGVPcGVyYXRpb247Ci0gICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSAoSkFYV1NCaW5kaW5nKWdldEV4dGVuc2lvbk9mVHlwZShwb3J0VHlwZU9wZXJhdGlvbiwgSkFYV1NCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgaWYoamF4d3NCaW5kaW5nICE9IG51bGwpewotICAgICAgICAgICAgIEJvb2xlYW4gaXNXcmFwcGFibGUgPSBqYXh3c0JpbmRpbmcuaXNFbmFibGVXcmFwcGVyU3R5bGUoKTsKLSAgICAgICAgICAgICBpZihpc1dyYXBwYWJsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICByZXR1cm4gaXNXcmFwcGFibGU7CisgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSAoSkFYV1NCaW5kaW5nKSBnZXRFeHRlbnNpb25PZlR5cGUocG9ydFR5cGVPcGVyYXRpb24sIEpBWFdTQmluZGluZy5jbGFzcyk7CisgICAgICAgIGlmIChqYXh3c0JpbmRpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgQm9vbGVhbiBpc1dyYXBwYWJsZSA9IGpheHdzQmluZGluZy5pc0VuYWJsZVdyYXBwZXJTdHlsZSgpOworICAgICAgICAgICAgaWYgKGlzV3JhcHBhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzV3JhcHBhYmxlOwogICAgICAgICB9CiAKICAgICAgICAgLy90aGVuIGludG8gd3NkbDpwb3J0VHlwZQogICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGluZm8ucG9ydC5yZXNvbHZlQmluZGluZyhkb2N1bWVudCkucmVzb2x2ZVBvcnRUeXBlKGRvY3VtZW50KTsKLSAgICAgICAgamF4d3NCaW5kaW5nID0gKEpBWFdTQmluZGluZylnZXRFeHRlbnNpb25PZlR5cGUocG9ydFR5cGUsIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmKGpheHdzQmluZGluZyAhPSBudWxsKXsKLSAgICAgICAgICAgICBCb29sZWFuIGlzV3JhcHBhYmxlID0gamF4d3NCaW5kaW5nLmlzRW5hYmxlV3JhcHBlclN0eWxlKCk7Ci0gICAgICAgICAgICAgaWYoaXNXcmFwcGFibGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgcmV0dXJuIGlzV3JhcHBhYmxlOworICAgICAgICBqYXh3c0JpbmRpbmcgPSAoSkFYV1NCaW5kaW5nKSBnZXRFeHRlbnNpb25PZlR5cGUocG9ydFR5cGUsIEpBWFdTQmluZGluZy5jbGFzcyk7CisgICAgICAgIGlmIChqYXh3c0JpbmRpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgQm9vbGVhbiBpc1dyYXBwYWJsZSA9IGpheHdzQmluZGluZy5pc0VuYWJsZVdyYXBwZXJTdHlsZSgpOworICAgICAgICAgICAgaWYgKGlzV3JhcHBhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzV3JhcHBhYmxlOwogICAgICAgICB9CiAKICAgICAgICAgLy90aGVuIHdzZGw6ZGVmaW5pdGlvbnMKLSAgICAgICAgamF4d3NCaW5kaW5nID0gKEpBWFdTQmluZGluZylnZXRFeHRlbnNpb25PZlR5cGUoZG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKSwgSkFYV1NCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgaWYoamF4d3NCaW5kaW5nICE9IG51bGwpewotICAgICAgICAgICAgIEJvb2xlYW4gaXNXcmFwcGFibGUgPSBqYXh3c0JpbmRpbmcuaXNFbmFibGVXcmFwcGVyU3R5bGUoKTsKLSAgICAgICAgICAgICBpZihpc1dyYXBwYWJsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICByZXR1cm4gaXNXcmFwcGFibGU7CisgICAgICAgIGpheHdzQmluZGluZyA9IChKQVhXU0JpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShkb2N1bWVudC5nZXREZWZpbml0aW9ucygpLCBKQVhXU0JpbmRpbmcuY2xhc3MpOworICAgICAgICBpZiAoamF4d3NCaW5kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJvb2xlYW4gaXNXcmFwcGFibGUgPSBqYXh3c0JpbmRpbmcuaXNFbmFibGVXcmFwcGVyU3R5bGUoKTsKKyAgICAgICAgICAgIGlmIChpc1dyYXBwYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBpc1dyYXBwYWJsZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0yMDQ3LDIxICsyMDIwLDIxIEBACiAgICAgICogQHNlZSBXU0RMTW9kZWxlckJhc2UjaXNTaW5nbGVJbk91dFBhcnQoU2V0LCBNZXNzYWdlUGFydCkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbmdsZUluT3V0UGFydChTZXQgaW5wdXRQYXJhbWV0ZXJOYW1lcywKLSAgICAgICAgICAgIE1lc3NhZ2VQYXJ0IG91dHB1dFBhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUGFydCBvdXRwdXRQYXJ0KSB7CiAgICAgICAgIC8vIEFzIG9mIG5vdywgd2UgZG9udCBoYXZlIHN1cHBvcnQgZm9yIGluL291dCBpbiBkb2MtbGl0LiBTbyByZXR1cm4gZmFsc2UuCiAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAoU09BUE9wZXJhdGlvbikgZ2V0RXh0ZW5zaW9uT2ZUeXBlKGluZm8uYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgU09BUE9wZXJhdGlvbi5jbGFzcyk7Ci0gICAgICAgIGlmKChzb2FwT3BlcmF0aW9uICE9IG51bGwpICYmIChzb2FwT3BlcmF0aW9uLmlzRG9jdW1lbnQoKSB8fCBpbmZvLnNvYXBCaW5kaW5nLmlzRG9jdW1lbnQoKSkpIHsKKyAgICAgICAgICAgICAgICAoU09BUE9wZXJhdGlvbikgZ2V0RXh0ZW5zaW9uT2ZUeXBlKGluZm8uYmluZGluZ09wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBPcGVyYXRpb24uY2xhc3MpOworICAgICAgICBpZiAoKHNvYXBPcGVyYXRpb24gIT0gbnVsbCkgJiYgKHNvYXBPcGVyYXRpb24uaXNEb2N1bWVudCgpIHx8IGluZm8uc29hcEJpbmRpbmcuaXNEb2N1bWVudCgpKSkgewogICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGdldElucHV0TWVzc2FnZSgpLnBhcnRzKCk7Ci0gICAgICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IChNZXNzYWdlUGFydClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZihvdXRwdXRQYXJ0LmdldE5hbWUoKS5lcXVhbHMocGFydC5nZXROYW1lKCkpICYmIG91dHB1dFBhcnQuZ2V0RGVzY3JpcHRvcigpLmVxdWFscyhwYXJ0LmdldERlc2NyaXB0b3IoKSkpCisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBNZXNzYWdlUGFydCBwYXJ0ID0gKE1lc3NhZ2VQYXJ0KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UGFydC5nZXROYW1lKCkuZXF1YWxzKHBhcnQuZ2V0TmFtZSgpKSAmJiBvdXRwdXRQYXJ0LmdldERlc2NyaXB0b3IoKS5lcXVhbHMocGFydC5nZXREZXNjcmlwdG9yKCkpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2UgaWYoc29hcE9wZXJhdGlvbiAhPSBudWxsICYmIHNvYXBPcGVyYXRpb24uaXNSUEMoKXx8IGluZm8uc29hcEJpbmRpbmcuaXNSUEMoKSl7CisgICAgICAgIH0gZWxzZSBpZiAoc29hcE9wZXJhdGlvbiAhPSBudWxsICYmIHNvYXBPcGVyYXRpb24uaXNSUEMoKSB8fCBpbmZvLnNvYXBCaW5kaW5nLmlzUlBDKCkpIHsKICAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlIGlucHV0TWVzc2FnZSA9IGdldElucHV0TWVzc2FnZSgpOwotICAgICAgICAgICAgaWYoaW5wdXRQYXJhbWV0ZXJOYW1lcy5jb250YWlucyhvdXRwdXRQYXJ0LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dFBhcmFtZXRlck5hbWVzLmNvbnRhaW5zKG91dHB1dFBhcnQuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgIGlmIChpbnB1dE1lc3NhZ2UuZ2V0UGFydChvdXRwdXRQYXJ0LmdldE5hbWUoKSkuZ2V0RGVzY3JpcHRvcigpLmVxdWFscyhvdXRwdXRQYXJ0LmdldERlc2NyaXB0b3IoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjA3MiwyNyArMjA0NSwyNyBAQAogCiAgICAgcHJpdmF0ZSBMaXN0PFBhcmFtZXRlcj4gY3JlYXRlUnBjTGl0UmVxdWVzdFBhcmFtZXRlcnMoUmVxdWVzdCByZXF1ZXN0LCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgQmxvY2sgYmxvY2spIHsKICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0SW5wdXRNZXNzYWdlKCk7Ci0gICAgICAgIFMySkpBWEJNb2RlbCBqYXhiTW9kZWwgPSAoKFJwY0xpdFN0cnVjdHVyZSlibG9jay5nZXRUeXBlKCkpLmdldEpheGJNb2RlbCgpLmdldFMySkpBWEJNb2RlbCgpOwotICAgICAgICBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IE1vZGVsZXJVdGlscy5jcmVhdGVScGNMaXRQYXJhbWV0ZXJzKG1lc3NhZ2UsIGJsb2NrLCBqYXhiTW9kZWwpOworICAgICAgICBTMkpKQVhCTW9kZWwgamF4Yk1vZGVsID0gKChScGNMaXRTdHJ1Y3R1cmUpIGJsb2NrLmdldFR5cGUoKSkuZ2V0SmF4Yk1vZGVsKCkuZ2V0UzJKSkFYQk1vZGVsKCk7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gTW9kZWxlclV0aWxzLmNyZWF0ZVJwY0xpdFBhcmFtZXRlcnMobWVzc2FnZSwgYmxvY2ssIGpheGJNb2RlbCwgZXJyUmVjZWl2ZXIpOwogCiAgICAgICAgIC8vY3JlYXRlIHBhcmFtZXRlcnMgZm9yIGhlYWRlciBhbmQgbWltZSBwYXJ0cwotICAgICAgICBmb3IoU3RyaW5nIHBhcmFtTmFtZTogcGFyYW1ldGVyTGlzdCl7CisgICAgICAgIGZvciAoU3RyaW5nIHBhcmFtTmFtZSA6IHBhcmFtZXRlckxpc3QpIHsKICAgICAgICAgICAgIE1lc3NhZ2VQYXJ0IHBhcnQgPSBtZXNzYWdlLmdldFBhcnQocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIGlmKHBhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZihNb2RlbGVyVXRpbHMuaXNCb3VuZFRvU09BUEhlYWRlcihwYXJ0KSl7Ci0gICAgICAgICAgICAgICAgaWYocGFyYW1ldGVycyA9PSBudWxsKQorICAgICAgICAgICAgaWYgKE1vZGVsZXJVdGlscy5pc0JvdW5kVG9TT0FQSGVhZGVyKHBhcnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOwogICAgICAgICAgICAgICAgIFFOYW1lIGhlYWRlck5hbWUgPSBwYXJ0LmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgICAgICBKQVhCVHlwZSBqYXhiVHlwZSA9IGdldEpBWEJUeXBlKGhlYWRlck5hbWUpOwotICAgICAgICAgICAgICAgIEJsb2NrIGhlYWRlckJsb2NrID0gbmV3IEJsb2NrKGhlYWRlck5hbWUsIGpheGJUeXBlKTsKKyAgICAgICAgICAgICAgICBKQVhCVHlwZSBqYXhiVHlwZSA9IGdldEpBWEJUeXBlKHBhcnQpOworICAgICAgICAgICAgICAgIEJsb2NrIGhlYWRlckJsb2NrID0gbmV3IEJsb2NrKGhlYWRlck5hbWUsIGpheGJUeXBlLCBwYXJ0KTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZEhlYWRlckJsb2NrKGhlYWRlckJsb2NrKTsKICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBNb2RlbGVyVXRpbHMuY3JlYXRlUGFyYW1ldGVyKHBhcnQuZ2V0TmFtZSgpLCBqYXhiVHlwZSwgaGVhZGVyQmxvY2spOwotICAgICAgICAgICAgICAgIGlmKHBhcmFtICE9IG51bGwpeworICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKHBhcmFtKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZSBpZihNb2RlbGVyVXRpbHMuaXNCb3VuZFRvTWltZUNvbnRlbnQocGFydCkpewotICAgICAgICAgICAgICAgIGlmKHBhcmFtZXRlcnMgPT0gbnVsbCkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTW9kZWxlclV0aWxzLmlzQm91bmRUb01pbWVDb250ZW50KHBhcnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOwogICAgICAgICAgICAgICAgIExpc3Q8TUlNRUNvbnRlbnQ+IG1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50cyhpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGdldElucHV0TWVzc2FnZSgpLCBwYXJhbU5hbWUpOwpAQCAtMjEwMCw3MyArMjA3Myw3MCBAQAogICAgICAgICAgICAgICAgIEpBWEJUeXBlIHR5cGUgPSBnZXRBdHRhY2htZW50VHlwZShtaW1lQ29udGVudHMsIHBhcnQpOwogICAgICAgICAgICAgICAgIC8vY3JlYXRlIFBhcmFtZXRlcnMgaW4gcmVxdWVzdCBvciByZXNwb25zZQogICAgICAgICAgICAgICAgIC8vQmxvY2sgbWltZUJsb2NrID0gbmV3IEJsb2NrKG5ldyBRTmFtZShwYXJ0LmdldE5hbWUoKSksIHR5cGUpOwotICAgICAgICAgICAgICAgIEJsb2NrIG1pbWVCbG9jayA9IG5ldyBCbG9jayh0eXBlLmdldE5hbWUoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgQmxvY2sgbWltZUJsb2NrID0gbmV3IEJsb2NrKHR5cGUuZ2V0TmFtZSgpLCB0eXBlLCBwYXJ0KTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRCbG9jayhtaW1lQmxvY2spOwogICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IE1vZGVsZXJVdGlscy5jcmVhdGVQYXJhbWV0ZXIocGFydC5nZXROYW1lKCksIHR5cGUsIG1pbWVCbG9jayk7Ci0gICAgICAgICAgICAgICAgaWYocGFyYW0gIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH1lbHNlIGlmKE1vZGVsZXJVdGlscy5pc1VuYm91bmQocGFydCkpewotICAgICAgICAgICAgICAgIGlmKHBhcmFtZXRlcnMgPT0gbnVsbCkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTW9kZWxlclV0aWxzLmlzVW5ib3VuZChwYXJ0KSkgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcGFydC5nZXREZXNjcmlwdG9yKCk7CiAgICAgICAgICAgICAgICAgSkFYQlR5cGUgdHlwZSA9IGdldEpBWEJUeXBlKHBhcnQpOwotICAgICAgICAgICAgICAgIEJsb2NrIHVuYm91bmRCbG9jayA9IG5ldyBCbG9jayhuYW1lLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBCbG9jayB1bmJvdW5kQmxvY2sgPSBuZXcgQmxvY2sobmFtZSwgdHlwZSwgcGFydCk7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRVbmJvdW5kQmxvY2sodW5ib3VuZEJsb2NrKTsKICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBNb2RlbGVyVXRpbHMuY3JlYXRlUGFyYW1ldGVyKHBhcnQuZ2V0TmFtZSgpLCB0eXBlLCB1bmJvdW5kQmxvY2spOwotICAgICAgICAgICAgICAgIGlmKHBhcmFtICE9IG51bGwpeworICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKHBhcmFtKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZm9yKFBhcmFtZXRlciBwYXJhbSA6IHBhcmFtZXRlcnMpeworICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgIHNldEN1c3RvbWl6ZWRQYXJhbWV0ZXJOYW1lKGluZm8ucG9ydFR5cGVPcGVyYXRpb24sIG1lc3NhZ2UsIG1lc3NhZ2UuZ2V0UGFydChwYXJhbS5nZXROYW1lKCkpLCBwYXJhbSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEphdmFUeXBlRm9yTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKXsKLSAgICAgICAgaWYobWltZVR5cGUuZXF1YWxzKCJpbWFnZS9qcGVnIikgfHwgbWltZVR5cGUuZXF1YWxzKCJpbWFnZS9naWYiKSl7CisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SmF2YVR5cGVGb3JNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgaWYgKG1pbWVUeXBlLmVxdWFscygiaW1hZ2UvanBlZyIpIHx8IG1pbWVUeXBlLmVxdWFscygiaW1hZ2UvZ2lmIikpIHsKICAgICAgICAgICAgIHJldHVybiAiamF2YS5hd3QuSW1hZ2UiOwotICAgICAgICB9ZWxzZSBpZihtaW1lVHlwZS5lcXVhbHMoInRleHQveG1sIikgfHwgbWltZVR5cGUuZXF1YWxzKCJhcHBsaWNhdGlvbi94bWwiKSl7CisgICAgICAgIH0gZWxzZSBpZiAobWltZVR5cGUuZXF1YWxzKCJ0ZXh0L3htbCIpIHx8IG1pbWVUeXBlLmVxdWFscygiYXBwbGljYXRpb24veG1sIikpIHsKICAgICAgICAgICAgIHJldHVybiAiamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UiOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAiamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciI7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1pbWVDb250ZW50cwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KICAgICBwcml2YXRlIEpBWEJUeXBlIGdldEF0dGFjaG1lbnRUeXBlKExpc3Q8TUlNRUNvbnRlbnQ+IG1pbWVDb250ZW50cywgTWVzc2FnZVBhcnQgcGFydCkgewotICAgICAgICBpZighZW5hYmxlTWltZUNvbnRlbnQoKSl7CisgICAgICAgIGlmICghZW5hYmxlTWltZUNvbnRlbnQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldEpBWEJUeXBlKHBhcnQpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBqYXZhVHlwZSA9IG51bGw7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBtaW1lVHlwZXMgPSBnZXRBbHRlcm5hdGVNaW1lVHlwZXMobWltZUNvbnRlbnRzKTsKLSAgICAgICAgaWYobWltZVR5cGVzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgaWYgKG1pbWVUeXBlcy5zaXplKCkgPiAxKSB7CiAgICAgICAgICAgICBqYXZhVHlwZSA9ICJqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIjsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgIGphdmFUeXBlID0gZ2V0SmF2YVR5cGVGb3JNaW1lVHlwZShtaW1lVHlwZXMuZ2V0KDApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGphdmFUeXBlID0gZ2V0SmF2YVR5cGVGb3JNaW1lVHlwZShtaW1lVHlwZXMuZ2V0KDApKTsKICAgICAgICAgfQogCiAgICAgICAgIFMySkpBWEJNb2RlbCBqYXhiTW9kZWwgPSBnZXRKQVhCTW9kZWxCdWlsZGVyKCkuZ2V0SkFYQk1vZGVsKCkuZ2V0UzJKSkFYQk1vZGVsKCk7Ci0gICAgICAgIEpDb2RlTW9kZWwgY20gPSBqYXhiTW9kZWwuZ2VuZXJhdGVDb2RlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb25zb2xlRXJyb3JSZXBvcnRlcihnZXRFbnZpcm9ubWVudCgpLCBmYWxzZSkpOwotICAgICAgICBKVHlwZSBqdD0gbnVsbDsKLSAgICAgICAganQgPSBjbS5yZWYoamF2YVR5cGUpOworICAgICAgICBKVHlwZSBqdCA9IG51bGw7CisgICAgICAgIGp0ID0gb3B0aW9ucy5nZXRDb2RlTW9kZWwoKS5yZWYoamF2YVR5cGUpOwogICAgICAgICBRTmFtZSBkZXNjID0gcGFydC5nZXREZXNjcmlwdG9yKCk7CiAgICAgICAgIFR5cGVBbmRBbm5vdGF0aW9uIHR5cGVBbm5vID0gbnVsbDsKIAogICAgICAgICBpZiAocGFydC5nZXREZXNjcmlwdG9yS2luZCgpID09IFNjaGVtYUtpbmRzLlhTRF9UWVBFKSB7CiAgICAgICAgICAgICB0eXBlQW5ubyA9IGpheGJNb2RlbC5nZXRKYXZhVHlwZShkZXNjKTsKICAgICAgICAgICAgIGRlc2MgPSBuZXcgUU5hbWUoIiIsIHBhcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJ0LmdldERlc2NyaXB0b3JLaW5kKCk9PSBTY2hlbWFLaW5kcy5YU0RfRUxFTUVOVCkgeworICAgICAgICB9IGVsc2UgaWYgKHBhcnQuZ2V0RGVzY3JpcHRvcktpbmQoKSA9PSBTY2hlbWFLaW5kcy5YU0RfRUxFTUVOVCkgewogICAgICAgICAgICAgdHlwZUFubm8gPSBnZXRKQVhCTW9kZWxCdWlsZGVyKCkuZ2V0RWxlbWVudFR5cGVBbmRBbm4oZGVzYyk7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgbWltZVR5cGVJdGVyID0gbWltZVR5cGVzLml0ZXJhdG9yKCk7IG1pbWVUeXBlSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gKFN0cmluZyltaW1lVHlwZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmKCghbWltZVR5cGUuZXF1YWxzKCJ0ZXh0L3htbCIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhbWltZVR5cGUuZXF1YWxzKCJhcHBsaWNhdGlvbi94bWwiKSkpeworICAgICAgICAgICAgaWYodHlwZUFubm8gPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgZXJyb3IocGFydCwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0pBWEJfSkFWQVRZUEVfTk9URk9VTkQocGFydC5nZXREZXNjcmlwdG9yKCksIHBhcnQuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1pbWVUeXBlSXRlciA9IG1pbWVUeXBlcy5pdGVyYXRvcigpOyBtaW1lVHlwZUl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IChTdHJpbmcpIG1pbWVUeXBlSXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCghbWltZVR5cGUuZXF1YWxzKCJ0ZXh0L3htbCIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbWltZVR5cGUuZXF1YWxzKCJhcHBsaWNhdGlvbi94bWwiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgLy9BY2NvcmRpbmcgdG8gQVAgMS4wLAogICAgICAgICAgICAgICAgICAgICAvL1JaWlpaOiBJbiBhIERFU0NSSVBUSU9OLCBpZiBhIHdzZGw6cGFydCBlbGVtZW50IHJlZmVycyB0byBhCiAgICAgICAgICAgICAgICAgICAgIC8vZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24gKHZpYSB0aGUgZWxlbWVudCBhdHRyaWJ1dGUgb2YgdGhlIHdzZGw6cGFydApAQCAtMjE3NSw0OCArMjE0NSw0NSBAQAogICAgICAgICAgICAgICAgICAgICAvL1hNTCBzZXJpYWxpemF0aW9uLgogICAgICAgICAgICAgICAgICAgICAvL3Nob3VsZCB3ZSB0aHJvdyB3YXJuaW5nPwogICAgICAgICAgICAgICAgICAgICAvL3R5cGUgPSBNaW1lSGVscGVyLmphdmFUeXBlLkRBVEFfSEFORExFUl9KQVZBVFlQRTsKLSAgICAgICAgICAgICAgICAgICAgd2FybigibWltZW1vZGVsZXIuZWxlbWVudFBhcnQuaW52YWxpZEVsZW1lbnRNaW1lVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LmdldE5hbWUoKSwgbWltZVR5cGV9KTsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyhwYXJ0LCBNb2RlbGVyTWVzc2FnZXMuTUlNRU1PREVMRVJfRUxFTUVOVF9QQVJUX0lOVkFMSURfRUxFTUVOVF9NSU1FX1RZUEUocGFydC5nZXROYW1lKCksIG1pbWVUeXBlKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmKHR5cGVBbm5vID09IG51bGwpewotICAgICAgICAgICAgZmFpbCgid3NkbG1vZGVsZXIuamF4Yi5qYXZhdHlwZS5ub3Rmb3VuZCIsIG5ldyBPYmplY3RbXXtkZXNjLCBwYXJ0LmdldE5hbWUoKX0pOworICAgICAgICBpZiAodHlwZUFubm8gPT0gbnVsbCkgeworICAgICAgICAgICAgZXJyb3IocGFydCwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0pBWEJfSkFWQVRZUEVfTk9URk9VTkQoZGVzYywgcGFydC5nZXROYW1lKCkpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IEpBWEJUeXBlKGRlc2MsIG5ldyBKYXZhU2ltcGxlVHlwZShuZXcgSkFYQlR5cGVBbmRBbm5vdGF0aW9uKHR5cGVBbm5vLCBqdCkpLAogICAgICAgICAgICAgICAgIG51bGwsIGdldEpBWEJNb2RlbEJ1aWxkZXIoKS5nZXRKQVhCTW9kZWwoKSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRKQVhCTW9kZWwoV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwgV1NETE1vZGVsSW5mbyBtb2RlbEluZm8sIENsYXNzTmFtZUNvbGxlY3RvciBjbGFzc05hbWVDb2xsZWN0b3IpIHsKLSAgICAgICAgSkFYQk1vZGVsQnVpbGRlciBqYXhiTW9kZWxCdWlsZGVyID0gbmV3IEpBWEJNb2RlbEJ1aWxkZXIoZ2V0V1NETE1vZGVsSW5mbygpLCBfb3B0aW9ucywgY2xhc3NOYW1lQ29sbGVjdG9yLCBwYXJzZXIuZ2V0U2NoZW1hRWxlbWVudHMoKSk7CisgICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRKQVhCTW9kZWwoV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkgeworICAgICAgICBKQVhCTW9kZWxCdWlsZGVyIGpheGJNb2RlbEJ1aWxkZXIgPSBuZXcgSkFYQk1vZGVsQnVpbGRlcihvcHRpb25zLCBjbGFzc05hbWVDb2xsZWN0b3IsIGZvcmVzdCwgZXJyUmVjZWl2ZXIpOwogICAgICAgICAvL3NldCB0aGUgamF2YSBwYWNrYWdlIHdoZXJlIHdzZGwgYXJ0aWZhY3RzIHdpbGwgYmUgZ2VuZXJhdGVkCiAgICAgICAgIC8vaWYgdXNlciBwcm92aWRlZCBwYWNrYWdlIG5hbWUgIHVzaW5nIC1wIHN3aXRjaCAob3IgcGFja2FnZSBwcm9wZXJ0eSBvbiB3c2ltcG9ydCBhbnQgdGFzaykKICAgICAgICAgLy9pZ25vcmUgdGhlIHBhY2thZ2UgY3VzdG9taXphdGlvbiBpbiB0aGUgd3NkbCBhbmQgc2NoZW1hIGJpZG5pbmdzCi0gICAgICAgIGlmKGdldFdTRExNb2RlbEluZm8oKS5nZXREZWZhdWx0SmF2YVBhY2thZ2UoKSAhPSBudWxsKXsKLSAgICAgICAgICAgIGdldFdTRExNb2RlbEluZm8oKS5zZXRKYXZhUGFja2FnZU5hbWUoZ2V0V1NETE1vZGVsSW5mbygpLmdldERlZmF1bHRKYXZhUGFja2FnZSgpKTsKLSAgICAgICAgICAgIGpheGJNb2RlbEJ1aWxkZXIuZ2V0SkFYQlNjaGVtYUNvbXBpbGVyKCkuZm9yY2VQYWNrYWdlTmFtZShnZXRXU0RMTW9kZWxJbmZvKCkuZ2V0SmF2YVBhY2thZ2VOYW1lKCkpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIFN0cmluZyBqYXh3c1BhY2thZ2UgPSBnZXRKYXZhUGFja2FnZSgpOwotICAgICAgICAgICAgZ2V0V1NETE1vZGVsSW5mbygpLnNldEphdmFQYWNrYWdlTmFtZShqYXh3c1BhY2thZ2UpOworICAgICAgICAvL2Zvcm1jZSB0aGUgLXAgb3B0aW9uIG9ubHkgaW4gdGhlIGZpcnN0IHBhc3MKKyAgICAgICAgaWYgKGV4cGxpY2l0RGVmYXVsdFBhY2thZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgamF4Yk1vZGVsQnVpbGRlci5nZXRKQVhCU2NoZW1hQ29tcGlsZXIoKS5mb3JjZVBhY2thZ2VOYW1lKG9wdGlvbnMuZGVmYXVsdFBhY2thZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0UGFja2FnZSA9IGdldEphdmFQYWNrYWdlKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvL2NyZWF0ZSBwc2V1ZG8gc2NoZW1hIGZvciBhc3luYyBvcGVyYXRpb25zKGlmIGFueSkgcmVzcG9uc2UgYmVhbgotICAgICAgICBMaXN0PElucHV0U291cmNlPiBzY2hlbWFzID0gUHNldWRvU2NoZW1hQnVpbGRlci5idWlsZCh0aGlzLCBfbW9kZWxJbmZvKTsKLSAgICAgICAgZm9yKElucHV0U291cmNlIHNjaGVtYSA6IHNjaGVtYXMpeworICAgICAgICBMaXN0PElucHV0U291cmNlPiBzY2hlbWFzID0gUHNldWRvU2NoZW1hQnVpbGRlci5idWlsZCh0aGlzLCBvcHRpb25zLCBlcnJSZWNlaXZlcik7CisgICAgICAgIGZvciAoSW5wdXRTb3VyY2Ugc2NoZW1hIDogc2NoZW1hcykgewogICAgICAgICAgICAgamF4Yk1vZGVsQnVpbGRlci5nZXRKQVhCU2NoZW1hQ29tcGlsZXIoKS5wYXJzZVNjaGVtYShzY2hlbWEpOwogICAgICAgICB9CiAgICAgICAgIGpheGJNb2RlbEJ1aWxkZXIuYmluZCgpOwogICAgICAgICB0aGlzLmpheGJNb2RlbEJ1aWxkZXIgPSBqYXhiTW9kZWxCdWlsZGVyOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SmF2YVBhY2thZ2UoKXsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEphdmFQYWNrYWdlKCkgewogICAgICAgICBTdHJpbmcgamF4d3NQYWNrYWdlID0gbnVsbDsKLSAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQ3VzdG9taXphdGlvbiA9IChKQVhXU0JpbmRpbmcpZ2V0RXh0ZW5zaW9uT2ZUeXBlKGRvY3VtZW50LmdldERlZmluaXRpb25zKCksIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmKGpheHdzQ3VzdG9taXphdGlvbiAhPSBudWxsICYmIGpheHdzQ3VzdG9taXphdGlvbi5nZXRKYXh3c1BhY2thZ2UoKSAhPSBudWxsKXsKKyAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQ3VzdG9taXphdGlvbiA9IChKQVhXU0JpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShkb2N1bWVudC5nZXREZWZpbml0aW9ucygpLCBKQVhXU0JpbmRpbmcuY2xhc3MpOworICAgICAgICBpZiAoamF4d3NDdXN0b21pemF0aW9uICE9IG51bGwgJiYgamF4d3NDdXN0b21pemF0aW9uLmdldEpheHdzUGFja2FnZSgpICE9IG51bGwpIHsKICAgICAgICAgICAgIGpheHdzUGFja2FnZSA9IGpheHdzQ3VzdG9taXphdGlvbi5nZXRKYXh3c1BhY2thZ2UoKS5nZXROYW1lKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYoamF4d3NQYWNrYWdlICE9IG51bGwpeworICAgICAgICBpZiAoamF4d3NQYWNrYWdlICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBqYXh3c1BhY2thZ2U7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIHdzZGxVcmkgPSBkb2N1bWVudC5nZXREZWZpbml0aW9ucygpLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpOwpAQCAtMjIzMSw3ICsyMTk4LDcgQEAKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKYXZhSW50ZXJmYWNlRm9yUG9ydChQb3J0IHBvcnQsIGJvb2xlYW4gaXNQcm92aWRlcikgewotICAgICAgICBpZihpc1Byb3ZpZGVyKXsKKyAgICAgICAgaWYgKGlzUHJvdmlkZXIpIHsKICAgICAgICAgICAgIGNyZWF0ZUphdmFJbnRlcmZhY2VGb3JQcm92aWRlclBvcnQocG9ydCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTIyNDQsMTMgKzIyMTEsMTMgQEAKICAgICAgICAgSmF2YUludGVyZmFjZSBpbnRmID0gbmV3IEphdmFJbnRlcmZhY2UoaW50ZXJmYWNlTmFtZSk7CiAgICAgICAgIGZvciAoT3BlcmF0aW9uIG9wZXJhdGlvbiA6IHBvcnQuZ2V0T3BlcmF0aW9ucygpKSB7CiAgICAgICAgICAgICBjcmVhdGVKYXZhTWV0aG9kRm9yT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgIGludGYpOworICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGludGYpOwogCi0gICAgICAgICAgICBmb3IoSmF2YVBhcmFtZXRlciBqUGFyYW0gOiBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmdldFBhcmFtZXRlcnNMaXN0KCkpeworICAgICAgICAgICAgZm9yIChKYXZhUGFyYW1ldGVyIGpQYXJhbSA6IG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuZ2V0UGFyYW1ldGVyc0xpc3QoKSkgewogICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGpQYXJhbS5nZXRQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICBpZihwYXJhbS5nZXRDdXN0b21OYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uZ2V0Q3VzdG9tTmFtZSgpICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIGpQYXJhbS5zZXROYW1lKHBhcmFtLmdldEN1c3RvbU5hbWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIyNjAsMzkgKzIyMjcsMzEgQEAKIAogICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmljZUludGVyZmFjZU5hbWUoUU5hbWUgc2VydmljZVFOYW1lLCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuU2VydmljZSB3c2RsU2VydmljZSkgewogICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSB3c2RsU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0N1c3QgPSAoSkFYV1NCaW5kaW5nKWdldEV4dGVuc2lvbk9mVHlwZSh3c2RsU2VydmljZSwgSkFYV1NCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgaWYoamF4d3NDdXN0ICE9IG51bGwgJiYgamF4d3NDdXN0LmdldENsYXNzTmFtZSgpICE9IG51bGwpeworICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NDdXN0ID0gKEpBWFdTQmluZGluZykgZ2V0RXh0ZW5zaW9uT2ZUeXBlKHdzZGxTZXJ2aWNlLCBKQVhXU0JpbmRpbmcuY2xhc3MpOworICAgICAgICBpZiAoamF4d3NDdXN0ICE9IG51bGwgJiYgamF4d3NDdXN0LmdldENsYXNzTmFtZSgpICE9IG51bGwpIHsKICAgICAgICAgICAgIEN1c3RvbU5hbWUgbmFtZSA9IGpheHdzQ3VzdC5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIGlmKG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMoIiIpKQorICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMoIiIpKQogICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gbmFtZS5nZXROYW1lKCk7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIHNlcnZpY2VJbnRlcmZhY2UgPSAiIjsKLSAgICAgICAgU3RyaW5nIGphdmFQYWNrYWdlTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChfbW9kZWxJbmZvLmdldEphdmFQYWNrYWdlTmFtZSgpICE9IG51bGwKLSAgICAgICAgICAgICYmICFfbW9kZWxJbmZvLmdldEphdmFQYWNrYWdlTmFtZSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGphdmFQYWNrYWdlTmFtZSA9IF9tb2RlbEluZm8uZ2V0SmF2YVBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFQYWNrYWdlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlSW50ZXJmYWNlID0gamF2YVBhY2thZ2VOYW1lICsgIi4iOwotICAgICAgICB9CisgICAgICAgIFN0cmluZyBqYXZhUGFja2FnZU5hbWUgPSBvcHRpb25zLmRlZmF1bHRQYWNrYWdlOworICAgICAgICBzZXJ2aWNlSW50ZXJmYWNlID0gamF2YVBhY2thZ2VOYW1lICsgIi4iOworCiAgICAgICAgIHNlcnZpY2VJbnRlcmZhY2UKLSAgICAgICAgICAgICs9IGdldEVudmlyb25tZW50KCkuZ2V0TmFtZXMoKS52YWxpZEphdmFDbGFzc05hbWUoc2VydmljZU5hbWUpOworICAgICAgICAgICAgICAgICs9IEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvQ2xhc3NOYW1lKHNlcnZpY2VOYW1lKTsKICAgICAgICAgcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2U7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRKYXZhTmFtZU9mU0VJKFBvcnQgcG9ydCkgewogICAgICAgICBRTmFtZSBwb3J0VHlwZU5hbWUgPQotICAgICAgICAgICAgKFFOYW1lKXBvcnQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1dTRExfUE9SVF9UWVBFX05BTUUpOwotICAgICAgICBQb3J0VHlwZSBwdCA9IChQb3J0VHlwZSlkb2N1bWVudC5maW5kKEtpbmRzLlBPUlRfVFlQRSwgcG9ydFR5cGVOYW1lKTsKLSAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQ3VzdCA9IChKQVhXU0JpbmRpbmcpZ2V0RXh0ZW5zaW9uT2ZUeXBlKHB0LCBKQVhXU0JpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZihqYXh3c0N1c3QgIT0gbnVsbCAmJiBqYXh3c0N1c3QuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgKFFOYW1lKSBwb3J0LmdldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX1dTRExfUE9SVF9UWVBFX05BTUUpOworICAgICAgICBQb3J0VHlwZSBwdCA9IChQb3J0VHlwZSkgZG9jdW1lbnQuZmluZChLaW5kcy5QT1JUX1RZUEUsIHBvcnRUeXBlTmFtZSk7CisgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0N1c3QgPSAoSkFYV1NCaW5kaW5nKSBnZXRFeHRlbnNpb25PZlR5cGUocHQsIEpBWFdTQmluZGluZy5jbGFzcyk7CisgICAgICAgIGlmIChqYXh3c0N1c3QgIT0gbnVsbCAmJiBqYXh3c0N1c3QuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgQ3VzdG9tTmFtZSBuYW1lID0gamF4d3NDdXN0LmdldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgaWYobmFtZSAhPSBudWxsICYmICFuYW1lLmVxdWFscygiIikpewotICAgICAgICAgICAgICAgIHJldHVybiBtYWtlUGFja2FnZVF1YWxpZmllZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VQYWNrYWdlUXVhbGlmaWVkKG5hbWUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMzAwLDYyICsyMjU5LDU0IEBACiAgICAgICAgIGlmIChwb3J0VHlwZU5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gZ290IHBvcnRUeXBlIGluZm9ybWF0aW9uIGZyb20gV1NETCwgdXNlIGl0IHRvIG5hbWUgdGhlIGludGVyZmFjZQogICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9Ci0gICAgICAgICAgICAgICAgbWFrZVBhY2thZ2VRdWFsaWZpZWQoSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9DbGFzc05hbWUocG9ydFR5cGVOYW1lLmdldExvY2FsUGFydCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtYWtlUGFja2FnZVF1YWxpZmllZChKQVhCUklDb250ZXh0Lm1hbmdsZU5hbWVUb0NsYXNzTmFtZShwb3J0VHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHNvbWVob3cgd2Ugb25seSBnb3QgdGhlIHBvcnQgbmFtZSwgc28gd2UgdXNlIHRoYXQKICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgPQotICAgICAgICAgICAgICAgIG1ha2VQYWNrYWdlUXVhbGlmaWVkKAotICAgICAgICAgICAgICAgICAgICBKQVhCUklDb250ZXh0Lm1hbmdsZU5hbWVUb0NsYXNzTmFtZShwb3J0LmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSksCi0gICAgICAgICAgICAgICAgICAgIHBvcnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1ha2VQYWNrYWdlUXVhbGlmaWVkKEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvQ2xhc3NOYW1lKHBvcnQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGludGVyZmFjZU5hbWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUphdmFNZXRob2RGb3JBc3luY09wZXJhdGlvbihQb3J0IHBvcnQsIE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgICAgICAgICBKYXZhSW50ZXJmYWNlIGludGYpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludGVyZmFjZSBpbnRmKSB7CiAgICAgICAgIFN0cmluZyBjYW5kaWRhdGVOYW1lID0gZ2V0SmF2YU5hbWVGb3JPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgSmF2YU1ldGhvZCBtZXRob2QgPSBuZXcgSmF2YU1ldGhvZChjYW5kaWRhdGVOYW1lKTsKLSAgICAgICAgbWV0aG9kLnNldFRocm93c1JlbW90ZUV4Y2VwdGlvbihmYWxzZSk7CisgICAgICAgIEphdmFNZXRob2QgbWV0aG9kID0gbmV3IEphdmFNZXRob2QoY2FuZGlkYXRlTmFtZSwgZXJyUmVjZWl2ZXIpOwogICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBvcGVyYXRpb24uZ2V0UmVxdWVzdCgpOwogICAgICAgICBJdGVyYXRvciByZXF1ZXN0Qm9keUJsb2NrcyA9IHJlcXVlc3QuZ2V0Qm9keUJsb2NrcygpOwogICAgICAgICBCbG9jayByZXF1ZXN0QmxvY2sgPQotICAgICAgICAgICAgKHJlcXVlc3RCb2R5QmxvY2tzLmhhc05leHQoKQotICAgICAgICAgICAgICAgID8gKEJsb2NrKXJlcXVlc3QuZ2V0Qm9keUJsb2NrcygpLm5leHQoKQotICAgICAgICAgICAgICAgIDogbnVsbCk7CisgICAgICAgICAgICAgICAgKHJlcXVlc3RCb2R5QmxvY2tzLmhhc05leHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPyAoQmxvY2spIHJlcXVlc3QuZ2V0Qm9keUJsb2NrcygpLm5leHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKTsKIAogICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IG9wZXJhdGlvbi5nZXRSZXNwb25zZSgpOwogICAgICAgICBJdGVyYXRvciByZXNwb25zZUJvZHlCbG9ja3MgPSBudWxsOwotICAgICAgICBCbG9jayByZXNwb25zZUJsb2NrID0gbnVsbDsKKyAgICAgICAgQmxvY2sgcmVzcG9uc2VCbG9jazsKICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlc3BvbnNlQm9keUJsb2NrcyA9IHJlc3BvbnNlLmdldEJvZHlCbG9ja3MoKTsKICAgICAgICAgICAgIHJlc3BvbnNlQmxvY2sgPQotICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keUJsb2Nrcy5oYXNOZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgPyAoQmxvY2spcmVzcG9uc2UuZ2V0Qm9keUJsb2NrcygpLm5leHQoKQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keUJsb2Nrcy5oYXNOZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChCbG9jaykgcmVzcG9uc2UuZ2V0Qm9keUJsb2NrcygpLm5leHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGJ1aWxkIGEgc2lnbmF0dXJlIG9mIHRoZSBmb3JtICJvcE5hbWUlYXJnMXR5cGUlYXJnMnR5cGUlLi4uJWFyZ250eXBlIHNvIHRoYXQgd2UKICAgICAgICAgLy8gZGV0ZWN0IG92ZXJsb2FkaW5nIGNvbmZsaWN0cyBpbiB0aGUgZ2VuZXJhdGVkIGphdmEgaW50ZXJmYWNlL2NsYXNzZXMKICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGNhbmRpZGF0ZU5hbWU7CiAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIGl0ZXIubmV4dCgpOwogCiAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldEphdmFQYXJhbWV0ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJ3c2RsbW9kZWxlci5pbnZhbGlkT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgZXJyb3Iob3BlcmF0aW9uLmdldEVudGl0eSgpLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT04ob3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBKYXZhVHlwZSBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyLmdldFR5cGUoKS5nZXRKYXZhVHlwZSgpOwogICAgICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyID0KLSAgICAgICAgICAgICAgICBuZXcgSmF2YVBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9WYXJpYWJsZU5hbWUocGFyYW1ldGVyLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmdldExpbmtlZFBhcmFtZXRlcigpICE9IG51bGwpOworICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YVBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhCUklDb250ZXh0Lm1hbmdsZU5hbWVUb1ZhcmlhYmxlTmFtZShwYXJhbWV0ZXIuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0TGlua2VkUGFyYW1ldGVyKCkgIT0gbnVsbCk7CiAgICAgICAgICAgICBpZiAoamF2YVBhcmFtZXRlci5pc0hvbGRlcigpKSB7CiAgICAgICAgICAgICAgICAgamF2YVBhcmFtZXRlci5zZXRIb2xkZXJOYW1lKGphdmF4LnhtbC53cy5Ib2xkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KQEAgLTIzNjcsOSArMjMxOCw5IEBACiAKICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyByZXN1bHRQYXJhbWV0ZXJOYW1lID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKW9wZXJhdGlvbi5nZXRQcm9wZXJ0eShXU0RMX1JFU1VMVF9QQVJBTUVURVIpOworICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBvcGVyYXRpb24uZ2V0UHJvcGVydHkoV1NETF9SRVNVTFRfUEFSQU1FVEVSKTsKICAgICAgICAgICAgIFBhcmFtZXRlciByZXN1bHRQYXJhbWV0ZXIgPQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFBhcmFtZXRlckJ5TmFtZShyZXN1bHRQYXJhbWV0ZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0UGFyYW1ldGVyQnlOYW1lKHJlc3VsdFBhcmFtZXRlck5hbWUpOwogICAgICAgICAgICAgSmF2YVR5cGUgcmV0dXJuVHlwZSA9IHJlc3VsdFBhcmFtZXRlci5nZXRUeXBlKCkuZ2V0SmF2YVR5cGUoKTsKICAgICAgICAgICAgIG1ldGhvZC5zZXRSZXR1cm5UeXBlKHJldHVyblR5cGUpOwogCkBAIC0yMzc5LDM0ICsyMzMwLDQwIEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgV1NETE1vZGVsZXJCYXNlI2NyZWF0ZUphdmFNZXRob2RGb3JPcGVyYXRpb24oUG9ydCwgT3BlcmF0aW9uLCBKYXZhSW50ZXJmYWNlLCBTZXQsIFNldCkKKyAgICAgKiBAc2VlIFdTRExNb2RlbGVyQmFzZSNjcmVhdGVKYXZhTWV0aG9kRm9yT3BlcmF0aW9uKFdTRExQb3J0LCBXU0RMT3BlcmF0aW9uLCBKYXZhSW50ZXJmYWNlLCBTZXQsIFNldCkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKYXZhTWV0aG9kRm9yT3BlcmF0aW9uKFBvcnQgcG9ydCwgT3BlcmF0aW9uIG9wZXJhdGlvbiwgSmF2YUludGVyZmFjZSBpbnRmKSB7Ci0gICAgICAgIGlmKChvcGVyYXRpb24gaW5zdGFuY2VvZiBBc3luY09wZXJhdGlvbikpeworICAgICAgICBpZiAoKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFzeW5jT3BlcmF0aW9uKSkgewogICAgICAgICAgICAgY3JlYXRlSmF2YU1ldGhvZEZvckFzeW5jT3BlcmF0aW9uKHBvcnQsIG9wZXJhdGlvbiwgaW50Zik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZU5hbWUgPSBnZXRKYXZhTmFtZUZvck9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICBKYXZhTWV0aG9kIG1ldGhvZCA9IG5ldyBKYXZhTWV0aG9kKGNhbmRpZGF0ZU5hbWUpOworICAgICAgICBKYXZhTWV0aG9kIG1ldGhvZCA9IG5ldyBKYXZhTWV0aG9kKGNhbmRpZGF0ZU5hbWUsIGVyclJlY2VpdmVyKTsKICAgICAgICAgUmVxdWVzdCByZXF1ZXN0ID0gb3BlcmF0aW9uLmdldFJlcXVlc3QoKTsKLSAgICAgICAgUGFyYW1ldGVyIHJldHVyblBhcmFtID0gKFBhcmFtZXRlcilvcGVyYXRpb24uZ2V0UHJvcGVydHkoV1NETF9SRVNVTFRfUEFSQU1FVEVSKTsKLSAgICAgICAgaWYocmV0dXJuUGFyYW0gIT0gbnVsbCl7CisgICAgICAgIFBhcmFtZXRlciByZXR1cm5QYXJhbSA9IChQYXJhbWV0ZXIpIG9wZXJhdGlvbi5nZXRQcm9wZXJ0eShXU0RMX1JFU1VMVF9QQVJBTUVURVIpOworICAgICAgICBpZiAocmV0dXJuUGFyYW0gIT0gbnVsbCkgewogICAgICAgICAgICAgSmF2YVR5cGUgcGFyYW1ldGVyVHlwZSA9IHJldHVyblBhcmFtLmdldFR5cGUoKS5nZXRKYXZhVHlwZSgpOwogICAgICAgICAgICAgbWV0aG9kLnNldFJldHVyblR5cGUocGFyYW1ldGVyVHlwZSk7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgSmF2YVR5cGUgcmV0ID0gbmV3IEphdmFTaW1wbGVUeXBlQ3JlYXRvcigpLlZPSURfSkFWQVRZUEU7CiAgICAgICAgICAgICBtZXRob2Quc2V0UmV0dXJuVHlwZShyZXQpOwogICAgICAgICB9Ci0gICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJPcmRlciA9IChMaXN0PFBhcmFtZXRlcj4pb3BlcmF0aW9uLmdldFByb3BlcnR5KFdTRExfUEFSQU1FVEVSX09SREVSKTsKLSAgICAgICAgZm9yKFBhcmFtZXRlciBwYXJhbTpwYXJhbWV0ZXJPcmRlcil7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJPcmRlciA9IChMaXN0PFBhcmFtZXRlcj4pIG9wZXJhdGlvbi5nZXRQcm9wZXJ0eShXU0RMX1BBUkFNRVRFUl9PUkRFUik7CisgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1ldGVyT3JkZXIpIHsKICAgICAgICAgICAgIEphdmFUeXBlIHBhcmFtZXRlclR5cGUgPSBwYXJhbS5nZXRUeXBlKCkuZ2V0SmF2YVR5cGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKHBhcmFtLmdldEN1c3RvbU5hbWUoKSAhPSBudWxsKT9wYXJhbS5nZXRDdXN0b21OYW1lKCk6cGFyYW0uZ2V0TmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAocGFyYW0uZ2V0Q3VzdG9tTmFtZSgpICE9IG51bGwpID8gcGFyYW0uZ2V0Q3VzdG9tTmFtZSgpIDogcGFyYW0uZ2V0TmFtZSgpOworICAgICAgICAgICAgbmFtZSA9IEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvVmFyaWFibGVOYW1lKG5hbWUpOworICAgICAgICAgICAgLy9pZiBpdHMgYSBqYXZhIGtleXdvcmQgYWZ0ZXIgbmFtZSBtYW5nbGluZywgdGhlbiB3ZSBzaW1wbHkgcHV0IHVuZGVyc2NvcmUgYXMgdGhlcmUgaXMgbm8KKyAgICAgICAgICAgIC8vbmVlZCB0byBhc2sgdXNlciB0byBjdXN0b21pemUgdGhlIHBhcmFtZXRlciBuYW1lIGlmIGl0cyBqYXZhIGtleXdvcmQKKyAgICAgICAgICAgIGlmKE5hbWVzLmlzSmF2YVJlc2VydmVkV29yZChuYW1lKSl7CisgICAgICAgICAgICAgICAgbmFtZSA9ICJfIituYW1lOworICAgICAgICAgICAgfQogICAgICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyID0KLSAgICAgICAgICAgICAgICBuZXcgSmF2YVBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9WYXJpYWJsZU5hbWUobmFtZSksCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICBwYXJhbS5pc0lOT1VUKCl8fHBhcmFtLmlzT1VUKCkpOworICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YVBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uaXNJTk9VVCgpIHx8IHBhcmFtLmlzT1VUKCkpOwogICAgICAgICAgICAgaWYgKGphdmFQYXJhbWV0ZXIuaXNIb2xkZXIoKSkgewogICAgICAgICAgICAgICAgIGphdmFQYXJhbWV0ZXIuc2V0SG9sZGVyTmFtZShqYXZheC54bWwud3MuSG9sZGVyLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9CkBAIC0yNDE4LDE1ICsyMzc1LDE1IEBACiAKICAgICAgICAgU3RyaW5nIG9wTmFtZSA9IEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvVmFyaWFibGVOYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcGVyYXRpb24uZ2V0RmF1bHRzKCk7Ci0gICAgICAgICAgICBpdGVyICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCk7Ci0gICAgICAgICAgICApIHsKLSAgICAgICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KWl0ZXIubmV4dCgpOworICAgICAgICAgICAgIGl0ZXIgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpdGVyLm5leHQoKTsKICAgICAgICAgICAgIGNyZWF0ZUphdmFFeGNlcHRpb25Gcm9tTGl0ZXJhbFR5cGUoZmF1bHQsIHBvcnQsIG9wTmFtZSk7CiAgICAgICAgIH0KICAgICAgICAgSmF2YUV4Y2VwdGlvbiBqYXZhRXhjZXB0aW9uOwogICAgICAgICBGYXVsdCBmYXVsdDsKICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb3BlcmF0aW9uLmdldEZhdWx0cygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGZhdWx0ID0gKEZhdWx0KWl0ZXIubmV4dCgpOworICAgICAgICAgICAgZmF1bHQgPSAoRmF1bHQpIGl0ZXIubmV4dCgpOwogICAgICAgICAgICAgamF2YUV4Y2VwdGlvbiA9IGZhdWx0LmdldEphdmFFeGNlcHRpb24oKTsKICAgICAgICAgICAgIG1ldGhvZC5hZGRFeGNlcHRpb24oamF2YUV4Y2VwdGlvbi5nZXROYW1lKCkpOwogICAgICAgICB9CkBAIC0yNDM0LDMyICsyMzkxLDI4IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlSmF2YUV4Y2VwdGlvbkZyb21MaXRlcmFsVHlwZShGYXVsdCBmYXVsdCwgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuUG9ydCBwb3J0LCBTdHJpbmcgb3BlcmF0aW9uTmFtZSkgewotICAgICAgICBQcm9jZXNzb3JFbnZpcm9ubWVudCBfZW52ID0gZ2V0UHJvY2Vzc29yRW52aXJvbm1lbnQoKTsKLQotICAgICAgICBKQVhCVHlwZSBmYXVsdFR5cGUgPSAoSkFYQlR5cGUpZmF1bHQuZ2V0QmxvY2soKS5nZXRUeXBlKCk7CisgICAgICAgIEpBWEJUeXBlIGZhdWx0VHlwZSA9IChKQVhCVHlwZSkgZmF1bHQuZ2V0QmxvY2soKS5nZXRUeXBlKCk7CiAKICAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbk5hbWUgPQotICAgICAgICAgICAgbWFrZVBhY2thZ2VRdWFsaWZpZWQoCi0gICAgICAgICAgICAgICAgX2Vudi5nZXROYW1lcygpLnZhbGlkSmF2YUNsYXNzTmFtZShmYXVsdC5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgIHBvcnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBtYWtlUGFja2FnZVF1YWxpZmllZChKQVhCUklDb250ZXh0Lm1hbmdsZU5hbWVUb0NsYXNzTmFtZShmYXVsdC5nZXROYW1lKCkpKTsKIAogICAgICAgICAvLyB1c2UgZmF1bHQgbmFtZXNwYWNlIGF0dHJpYnV0ZQogICAgICAgICBKQVhCU3RydWN0dXJlZFR5cGUgamF4YlN0cnVjdCA9IG5ldyBKQVhCU3RydWN0dXJlZFR5cGUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdC5nZXRCbG9jaygpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgZmF1bHQuZ2V0QmxvY2soKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksCisgICAgICAgICAgICAgICAgZmF1bHQuZ2V0TmFtZSgpKSk7CiAKICAgICAgICAgUU5hbWUgbWVtYmVyTmFtZSA9IGZhdWx0LmdldEVsZW1lbnROYW1lKCk7CiAgICAgICAgIEpBWEJFbGVtZW50TWVtYmVyIGpheGJNZW1iZXIgPQotICAgICAgICAgICAgbmV3IEpBWEJFbGVtZW50TWVtYmVyKG1lbWJlck5hbWUsIGZhdWx0VHlwZSk7CisgICAgICAgICAgICAgICAgbmV3IEpBWEJFbGVtZW50TWVtYmVyKG1lbWJlck5hbWUsIGZhdWx0VHlwZSk7CiAgICAgICAgIC8vamF4Yk1lbWJlci5zZXROaWxsYWJsZShmYXVsdFR5cGUuaXNOaWxsYWJsZSgpKTsKIAogICAgICAgICBTdHJpbmcgamF2YU1lbWJlck5hbWUgPSBnZXRMaXRlcmFsSmF2YU1lbWJlck5hbWUoZmF1bHQpOwogICAgICAgICBKYXZhU3RydWN0dXJlTWVtYmVyIGphdmFNZW1iZXIgPSBuZXcgSmF2YVN0cnVjdHVyZU1lbWJlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YU1lbWJlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0VHlwZS5nZXRKYXZhVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXhiTWVtYmVyKTsKKyAgICAgICAgICAgICAgICBqYXZhTWVtYmVyTmFtZSwKKyAgICAgICAgICAgICAgICBmYXVsdFR5cGUuZ2V0SmF2YVR5cGUoKSwKKyAgICAgICAgICAgICAgICBqYXhiTWVtYmVyKTsKICAgICAgICAgamF4Yk1lbWJlci5zZXRKYXZhU3RydWN0dXJlTWVtYmVyKGphdmFNZW1iZXIpOwotICAgICAgICBqYXZhTWVtYmVyLnNldFJlYWRNZXRob2QoX2Vudi5nZXROYW1lcygpLmdldEphdmFNZW1iZXJSZWFkTWV0aG9kKGphdmFNZW1iZXIpKTsKKyAgICAgICAgamF2YU1lbWJlci5zZXRSZWFkTWV0aG9kKE5hbWVzLmdldEphdmFNZW1iZXJSZWFkTWV0aG9kKGphdmFNZW1iZXIpKTsKICAgICAgICAgamF2YU1lbWJlci5zZXRJbmhlcml0ZWQoZmFsc2UpOwogICAgICAgICBqYXhiTWVtYmVyLnNldEphdmFTdHJ1Y3R1cmVNZW1iZXIoamF2YU1lbWJlcik7CiAgICAgICAgIGpheGJTdHJ1Y3QuYWRkKGpheGJNZW1iZXIpOwpAQCAtMjQ2OCwxMSArMjQyMSwxMSBAQAogICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSArPSAiX0V4Y2VwdGlvbiI7CiAgICAgICAgIH0KIAotICAgICAgICBKYXZhRXhjZXB0aW9uIGV4aXN0aW5nSmF2YUV4Y2VwdGlvbiA9IChKYXZhRXhjZXB0aW9uKV9qYXZhRXhjZXB0aW9ucy5nZXQoZXhjZXB0aW9uTmFtZSk7CisgICAgICAgIEphdmFFeGNlcHRpb24gZXhpc3RpbmdKYXZhRXhjZXB0aW9uID0gKEphdmFFeGNlcHRpb24pIF9qYXZhRXhjZXB0aW9ucy5nZXQoZXhjZXB0aW9uTmFtZSk7CiAgICAgICAgIGlmIChleGlzdGluZ0phdmFFeGNlcHRpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGV4aXN0aW5nSmF2YUV4Y2VwdGlvbi5nZXROYW1lKCkuZXF1YWxzKGV4Y2VwdGlvbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgoSkFYQlR5cGUpZXhpc3RpbmdKYXZhRXhjZXB0aW9uLmdldE93bmVyKCkpLmdldE5hbWUoKS5lcXVhbHMoamF4YlN0cnVjdC5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIHx8IE1vZGVsZXJVdGlscy5pc0VxdWl2YWxlbnRMaXRlcmFsU3RydWN0dXJlcyhqYXhiU3RydWN0LCAoSkFYQlN0cnVjdHVyZWRUeXBlKSBleGlzdGluZ0phdmFFeGNlcHRpb24uZ2V0T3duZXIoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKChKQVhCVHlwZSkgZXhpc3RpbmdKYXZhRXhjZXB0aW9uLmdldE93bmVyKCkpLmdldE5hbWUoKS5lcXVhbHMoamF4YlN0cnVjdC5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBNb2RlbGVyVXRpbHMuaXNFcXVpdmFsZW50TGl0ZXJhbFN0cnVjdHVyZXMoamF4YlN0cnVjdCwgKEpBWEJTdHJ1Y3R1cmVkVHlwZSkgZXhpc3RpbmdKYXZhRXhjZXB0aW9uLmdldE93bmVyKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgbWFwcGVkIHRoaXMgZmF1bHQgYWxyZWFkeQogICAgICAgICAgICAgICAgICAgICBpZiAoZmF1bHRUeXBlIGluc3RhbmNlb2YgSkFYQlN0cnVjdHVyZWRUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdC5nZXRCbG9jaygpLnNldFR5cGUoKEpBWEJUeXBlKSBleGlzdGluZ0phdmFFeGNlcHRpb24uZ2V0T3duZXIoKSk7CkBAIC0yNDkzLDIzICsyNDQ2LDIzIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWVzdFJlc3BvbnNlKCl7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1ZXN0UmVzcG9uc2UoKSB7CiAgICAgICAgIHJldHVybiBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldFN0eWxlKCkgPT0gT3BlcmF0aW9uU3R5bGUuUkVRVUVTVF9SRVNQT05TRTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Q8U3RyaW5nPiBnZXRBc3luUGFyYW1ldGVyT3JkZXIoKXsKKyAgICBwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Q8U3RyaW5nPiBnZXRBc3luUGFyYW1ldGVyT3JkZXIoKSB7CiAgICAgICAgIC8vZm9yIGFzeW5jIG9wZXJhdGlvbiBpZ25vcmUgdGhlIHBhcmFtZXRlck9yZGVyCiAgICAgICAgIGphdmEudXRpbC5MaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgICAgICBNZXNzYWdlIGlucHV0TWVzc2FnZSA9IGdldElucHV0TWVzc2FnZSgpOwogICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBpbnB1dFBhcnRzID0gaW5wdXRNZXNzYWdlLmdldFBhcnRzKCk7Ci0gICAgICAgIGZvcihNZXNzYWdlUGFydCBwYXJ0OiBpbnB1dFBhcnRzKXsKKyAgICAgICAgZm9yIChNZXNzYWdlUGFydCBwYXJ0IDogaW5wdXRQYXJ0cykgewogICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQocGFydC5nZXROYW1lKCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJMaXN0OwogICAgIH0KIAogCi0gICAgcHJvdGVjdGVkIExpc3Q8TWVzc2FnZVBhcnQ+IGdldFBhcmFtZXRlck9yZGVyKCl7CisgICAgcHJvdGVjdGVkIExpc3Q8TWVzc2FnZVBhcnQ+IGdldFBhcmFtZXRlck9yZGVyKCkgewogICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VQYXJ0PigpOwogICAgICAgICBTdHJpbmcgcGFyYW1ldGVyT3JkZXIgPSBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldFBhcmFtZXRlck9yZGVyKCk7CiAgICAgICAgIGphdmEudXRpbC5MaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwpAQCAtMjUyNSw0NCArMjQ3OCw0MyBAQAogICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBvdXRwdXRQYXJ0cyA9IG51bGw7CiAgICAgICAgIExpc3Q8TWVzc2FnZVBhcnQ+IGlucHV0UGFydHMgPSBpbnB1dE1lc3NhZ2UuZ2V0UGFydHMoKTsKICAgICAgICAgLy9yZXNldCB0aGUgbW9kZSBhbmQgcmV0IGZsYWcsIGFzIE1Fc3NhZ2VQQXJ0cyBhZXIgc2hhcmVkIGFjcm9zcyBwb3J0cwotICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydDppbnB1dFBhcnRzKXsKKyAgICAgICAgZm9yIChNZXNzYWdlUGFydCBwYXJ0IDogaW5wdXRQYXJ0cykgewogICAgICAgICAgICAgcGFydC5zZXRNb2RlKE1vZGUuSU4pOwogICAgICAgICAgICAgcGFydC5zZXRSZXR1cm4oZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIGlmKGlzUmVxdWVzdFJlc3BvbnNlKCkpeworICAgICAgICBpZiAoaXNSZXF1ZXN0UmVzcG9uc2UoKSkgewogICAgICAgICAgICAgb3V0cHV0UGFydHMgPSBvdXRwdXRNZXNzYWdlLmdldFBhcnRzKCk7Ci0gICAgICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydDpvdXRwdXRQYXJ0cyl7CisgICAgICAgICAgICBmb3IgKE1lc3NhZ2VQYXJ0IHBhcnQgOiBvdXRwdXRQYXJ0cykgewogICAgICAgICAgICAgICAgIHBhcnQuc2V0TW9kZShNb2RlLk9VVCk7CiAgICAgICAgICAgICAgICAgcGFydC5zZXRSZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYocGFyYW1ldGVyT3JkZXJQcmVzZW50KXsKKyAgICAgICAgaWYgKHBhcmFtZXRlck9yZGVyUHJlc2VudCkgewogICAgICAgICAgICAgYm9vbGVhbiB2YWxpZFBhcmFtZXRlck9yZGVyID0gdHJ1ZTsKICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gcGFyYW1PcmRlcnMgPSBwYXJhbWV0ZXJMaXN0Lml0ZXJhdG9yKCk7CiAgICAgICAgICAgICAvLyBJZiBhbnkgcGFydCBpbiB0aGUgcGFyYW1ldGVyT3JkZXIgaXMgbm90IHByZXNlbnQgaW4gdGhlIHJlcXVlc3Qgb3IKICAgICAgICAgICAgIC8vIHJlc3BvbnNlIG1lc3NhZ2UsIHdlIGNvbXBsZXRlbHkgaWdub3JlIHRoZSBwYXJhbWV0ZXJPcmRlciBoaW50Ci0gICAgICAgICAgICB3aGlsZShwYXJhbU9yZGVycy5oYXNOZXh0KCkpeworICAgICAgICAgICAgd2hpbGUgKHBhcmFtT3JkZXJzLmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbSA9IHBhcmFtT3JkZXJzLm5leHQoKTsKICAgICAgICAgICAgICAgICBib29sZWFuIHBhcnRGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvcihNZXNzYWdlUGFydCBwYXJ0IDogaW5wdXRQYXJ0cyl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtLmVxdWFscyhwYXJ0LmdldE5hbWUoKSkpeworICAgICAgICAgICAgICAgIGZvciAoTWVzc2FnZVBhcnQgcGFydCA6IGlucHV0UGFydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmVxdWFscyhwYXJ0LmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBpZiBub3QgZm91bmQsIGNoZWNrIGluIG91dHB1dCBwYXJ0cwotICAgICAgICAgICAgICAgIGlmKCFwYXJ0Rm91bmQpewotICAgICAgICAgICAgICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydCA6IG91dHB1dFBhcnRzKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtLmVxdWFscyhwYXJ0LmdldE5hbWUoKSkpeworICAgICAgICAgICAgICAgIGlmICghcGFydEZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWVzc2FnZVBhcnQgcGFydCA6IG91dHB1dFBhcnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uZXF1YWxzKHBhcnQuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIXBhcnRGb3VuZCl7Ci0gICAgICAgICAgICAgICAgICAgIHdhcm4oIndzZGxtb2RlbGVyLmludmFsaWQucGFyYW1ldGVyb3JkZXIucGFyYW1ldGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BhcmFtLCBpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCl9KTsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnRGb3VuZCkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKGluZm8ub3BlcmF0aW9uLmdldEVudGl0eSgpLCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9QQVJBTUVURVJPUkRFUl9QQVJBTUVURVIocGFyYW0sIGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwogICAgICAgICAgICAgICAgICAgICB2YWxpZFBhcmFtZXRlck9yZGVyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjU3MSw1MSArMjUyMyw1MSBAQAogICAgICAgICAgICAgTGlzdDxNZXNzYWdlUGFydD4gb3V0cHV0VW5saXN0ZWRQYXJ0cyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZVBhcnQ+KCk7CiAKICAgICAgICAgICAgIC8vZ2F0aGVyIGlucHV0IFBhcnRzCi0gICAgICAgICAgICBpZih2YWxpZFBhcmFtZXRlck9yZGVyKXsKLSAgICAgICAgICAgICAgICBmb3IoU3RyaW5nIHBhcmFtOnBhcmFtZXRlckxpc3QpeworICAgICAgICAgICAgaWYgKHZhbGlkUGFyYW1ldGVyT3JkZXIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwYXJhbSA6IHBhcmFtZXRlckxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IGlucHV0TWVzc2FnZS5nZXRQYXJ0KHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocGFydCAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFkZChwYXJ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGlzUmVxdWVzdFJlc3BvbnNlKCkpeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZXF1ZXN0UmVzcG9uc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgb3V0UGFydCA9IG91dHB1dE1lc3NhZ2UuZ2V0UGFydChwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihvdXRQYXJ0ICE9IG51bGwpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dFBhcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hZGQob3V0UGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydDogaW5wdXRQYXJ0cyl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFwYXJhbWV0ZXJMaXN0LmNvbnRhaW5zKHBhcnQuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGZvciAoTWVzc2FnZVBhcnQgcGFydCA6IGlucHV0UGFydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJMaXN0LmNvbnRhaW5zKHBhcnQuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRVbmxpc3RlZFBhcnRzLmFkZChwYXJ0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmKGlzUmVxdWVzdFJlc3BvbnNlKCkpeworICAgICAgICAgICAgICAgIGlmIChpc1JlcXVlc3RSZXNwb25zZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGF0IG1vc3Qgb25lIG91dHB1dCBwYXJ0IHNob3VsZCBiZSB1bmxpc3RlZAotICAgICAgICAgICAgICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydDogb3V0cHV0UGFydHMpewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBhcmFtZXRlckxpc3QuY29udGFpbnMocGFydC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWVzc2FnZVBhcnQgcGFydCA6IG91dHB1dFBhcnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtZXRlckxpc3QuY29udGFpbnMocGFydC5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgaW5QYXJ0ID0gaW5wdXRNZXNzYWdlLmdldFBhcnQocGFydC5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9udCBhZGQgaW5vdXQgYXMgdW5saXN0ZWQgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpblBhcnQgIT0gbnVsbCkgJiYgaW5QYXJ0LmdldERlc2NyaXB0b3IoKS5lcXVhbHMocGFydC5nZXREZXNjcmlwdG9yKCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluUGFydCAhPSBudWxsKSAmJiBpblBhcnQuZ2V0RGVzY3JpcHRvcigpLmVxdWFscyhwYXJ0LmdldERlc2NyaXB0b3IoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LnNldE1vZGUoTW9kZS5JTk9VVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VW5saXN0ZWRQYXJ0cy5hZGQocGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcGFyYW0gbGlzdCBtYXkgY29udGFpbiBpdCwgY2hlY2sgaWYgaXRzIElOT1VUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgaW5QYXJ0ID0gaW5wdXRNZXNzYWdlLmdldFBhcnQocGFydC5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9udCBhZGQgaW5vdXQgYXMgdW5saXN0ZWQgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpblBhcnQgIT0gbnVsbCkgJiYgaW5QYXJ0LmdldERlc2NyaXB0b3IoKS5lcXVhbHMocGFydC5nZXREZXNjcmlwdG9yKCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluUGFydCAhPSBudWxsKSAmJiBpblBhcnQuZ2V0RGVzY3JpcHRvcigpLmVxdWFscyhwYXJ0LmdldERlc2NyaXB0b3IoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LnNldE1vZGUoTW9kZS5JTk9VVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoIXBhcmFtcy5jb250YWlucyhwYXJ0KSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGFyYW1zLmNvbnRhaW5zKHBhcnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hZGQocGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKG91dHB1dFVubGlzdGVkUGFydHMuc2l6ZSgpID09IDEpeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VW5saXN0ZWRQYXJ0cy5zaXplKCkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgcmVzdWx0UGFydCA9IG91dHB1dFVubGlzdGVkUGFydHMuZ2V0KDApOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGFydC5zZXRSZXR1cm4odHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKHJlc3VsdFBhcnQpOwpAQCAtMjYyNCwxOSArMjU3NiwxOCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vYWRkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHVubGlzdGVkIHBhcnRzCi0gICAgICAgICAgICAgICAgZm9yKE1lc3NhZ2VQYXJ0IHBhcnQgOiBpbnB1dFVubGlzdGVkUGFydHMpeworICAgICAgICAgICAgICAgIGZvciAoTWVzc2FnZVBhcnQgcGFydCA6IGlucHV0VW5saXN0ZWRQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKHBhcnQpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZvcihNZXNzYWdlUGFydCBwYXJ0IDogb3V0cHV0VW5saXN0ZWRQYXJ0cyl7CisgICAgICAgICAgICAgICAgZm9yIChNZXNzYWdlUGFydCBwYXJ0IDogb3V0cHV0VW5saXN0ZWRQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKHBhcnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zOwogCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvL3BhcmFtZXRlck9yZGVyIGF0dHJpYnV0ZSBpcyBub3QgdmFsaWQsIHdlIGlnbm9yZSBpdAotICAgICAgICAgICAgd2Fybigid3NkbG1vZGVsZXIuaW52YWxpZC5wYXJhbWV0ZXJPcmRlci5pbnZhbGlkUGFyYW1ldGVyT3JkZXIiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2luZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKX0pOworICAgICAgICAgICAgd2FybmluZyhpbmZvLm9wZXJhdGlvbi5nZXRFbnRpdHkoKSwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfUEFSQU1FVEVSX09SREVSX0lOVkFMSURfUEFSQU1FVEVSX09SREVSKGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwogICAgICAgICAgICAgcGFyYW1ldGVyT3JkZXJQcmVzZW50ID0gZmFsc2U7CiAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmNsZWFyKCk7CiAgICAgICAgIH0KQEAgLTI2NDQsMTUgKzI1OTUsMTUgQEAKICAgICAgICAgTGlzdDxNZXNzYWdlUGFydD4gb3V0UGFydHMgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VQYXJ0PigpOwogCiAgICAgICAgIC8vY29uc3RydWN0IGlucHV0IHBhcmFtZXRlciBsaXN0IHdpdGggdGhlIHNhbWUgb3JkZXIgYXMgaW4gaW5wdXQgbWVzc2FnZQotICAgICAgICBmb3IoTWVzc2FnZVBhcnQgcGFydDogaW5wdXRQYXJ0cyl7CisgICAgICAgIGZvciAoTWVzc2FnZVBhcnQgcGFydCA6IGlucHV0UGFydHMpIHsKICAgICAgICAgICAgIHBhcmFtcy5hZGQocGFydCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZihpc1JlcXVlc3RSZXNwb25zZSgpKXsKLSAgICAgICAgICAgIGZvcihNZXNzYWdlUGFydCBwYXJ0Om91dHB1dFBhcnRzKXsKKyAgICAgICAgaWYgKGlzUmVxdWVzdFJlc3BvbnNlKCkpIHsKKyAgICAgICAgICAgIGZvciAoTWVzc2FnZVBhcnQgcGFydCA6IG91dHB1dFBhcnRzKSB7CiAgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgaW5QYXJ0ID0gaW5wdXRNZXNzYWdlLmdldFBhcnQocGFydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmKGluUGFydCAhPSBudWxsICYmIHBhcnQuZ2V0RGVzY3JpcHRvcktpbmQoKSA9PSBpblBhcnQuZ2V0RGVzY3JpcHRvcktpbmQoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5nZXREZXNjcmlwdG9yKCkuZXF1YWxzKGluUGFydC5nZXREZXNjcmlwdG9yKCkpKXsKKyAgICAgICAgICAgICAgICBpZiAoaW5QYXJ0ICE9IG51bGwgJiYgcGFydC5nZXREZXNjcmlwdG9yS2luZCgpID09IGluUGFydC5nZXREZXNjcmlwdG9yS2luZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LmdldERlc2NyaXB0b3IoKS5lcXVhbHMoaW5QYXJ0LmdldERlc2NyaXB0b3IoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LnNldE1vZGUoTW9kZS5JTk9VVCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTI2NjAsOCArMjYxMSw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vYXBwZW5kIHRoZSBvdXQgcGFydHMgdG8gdGhlIHBhcmFtZXRlckxpc3QKLSAgICAgICAgICAgIGZvcihNZXNzYWdlUGFydCBwYXJ0IDogb3V0UGFydHMpewotICAgICAgICAgICAgICAgIGlmKG91dFBhcnRzLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgZm9yIChNZXNzYWdlUGFydCBwYXJ0IDogb3V0UGFydHMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0UGFydHMuc2l6ZSgpID09IDEpCiAgICAgICAgICAgICAgICAgICAgIHBhcnQuc2V0UmV0dXJuKHRydWUpOwogICAgICAgICAgICAgICAgIHBhcmFtcy5hZGQocGFydCk7CiAgICAgICAgICAgICB9CkBAIC0yNjcwLDU2ICsyNjIxLDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICoKICAgICAgKiBAcGFyYW0gcG9ydAogICAgICAqIEBwYXJhbSBzdWZmaXgKICAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIENsYXNzTmFtZSBmb3IgYSBwb3J0CiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoUG9ydCBwb3J0LCBTdHJpbmcgc3VmZml4KSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgICAgIFN0cmluZyBqYXZhUGFja2FnZU5hbWUgPSAiIjsKLSAgICAgICAgaWYgKF9tb2RlbEluZm8uZ2V0SmF2YVBhY2thZ2VOYW1lKCkgIT0gbnVsbAotICAgICAgICAgICAgJiYgIV9tb2RlbEluZm8uZ2V0SmF2YVBhY2thZ2VOYW1lKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgamF2YVBhY2thZ2VOYW1lID0gX21vZGVsSW5mby5nZXRKYXZhUGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0RW52aXJvbm1lbnQoKS5nZXROYW1lcygpLnZhbGlkSmF2YUNsYXNzTmFtZShwb3J0LmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG5hbWUgPSBqYXZhUGFja2FnZU5hbWUrIi4iK3ByZWZpeCtzdWZmaXg7Ci0gICAgICAgIHJldHVybiBuYW1lOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9DbGFzc05hbWUoKHBvcnQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSk7CisgICAgICAgIHJldHVybiBvcHRpb25zLmRlZmF1bHRQYWNrYWdlICsgIi4iICsgcHJlZml4ICsgc3VmZml4OwogICAgIH0KIAogICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29uZmxpY3RpbmdTZXJ2aWNlQ2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgaWYoY29uZmxpY3RzV2l0aFNFSUNsYXNzKG5hbWUpIHx8IGNvbmZsaWN0c1dpdGhKQVhCQ2xhc3MobmFtZSkgfHxjb25mbGljdHNXaXRoRXhjZXB0aW9uQ2xhc3MobmFtZSkpewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gY29uZmxpY3RzV2l0aFNFSUNsYXNzKG5hbWUpIHx8IGNvbmZsaWN0c1dpdGhKQVhCQ2xhc3MobmFtZSkgfHwgY29uZmxpY3RzV2l0aEV4Y2VwdGlvbkNsYXNzKG5hbWUpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb25mbGljdHNXaXRoU0VJQ2xhc3MoU3RyaW5nIG5hbWUpeworICAgIHByaXZhdGUgYm9vbGVhbiBjb25mbGljdHNXaXRoU0VJQ2xhc3MoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgU2V0PFN0cmluZz4gc2VpTmFtZXMgPSBjbGFzc05hbWVDb2xsZWN0b3IuZ2V0U2VpQ2xhc3NOYW1lcygpOwotICAgICAgICBpZihzZWlOYW1lcyAhPSBudWxsICYmIHNlaU5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHNlaU5hbWVzICE9IG51bGwgJiYgc2VpTmFtZXMuY29udGFpbnMobmFtZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbmZsaWN0c1dpdGhKQVhCQ2xhc3MoU3RyaW5nIG5hbWUpeworICAgIHByaXZhdGUgYm9vbGVhbiBjb25mbGljdHNXaXRoSkFYQkNsYXNzKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIFNldDxTdHJpbmc+IGpheGJOYW1lcyA9IGNsYXNzTmFtZUNvbGxlY3Rvci5nZXRKYXhiR2VuZXJhdGVkQ2xhc3NOYW1lcygpOwotICAgICAgICBpZihqYXhiTmFtZXMgIT0gbnVsbCAmJiBqYXhiTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gamF4Yk5hbWVzICE9IG51bGwgJiYgamF4Yk5hbWVzLmNvbnRhaW5zKG5hbWUpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb25mbGljdHNXaXRoRXhjZXB0aW9uQ2xhc3MoU3RyaW5nIG5hbWUpeworICAgIHByaXZhdGUgYm9vbGVhbiBjb25mbGljdHNXaXRoRXhjZXB0aW9uQ2xhc3MoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgU2V0PFN0cmluZz4gZXhjZXB0aW9uTmFtZXMgPSBjbGFzc05hbWVDb2xsZWN0b3IuZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lcygpOwotICAgICAgICBpZihleGNlcHRpb25OYW1lcyAhPSBudWxsICYmIGV4Y2VwdGlvbk5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbk5hbWVzICE9IG51bGwgJiYgZXhjZXB0aW9uTmFtZXMuY29udGFpbnMobmFtZSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25mbGljdGluZ0V4Y2VwdGlvbkNsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZihjb25mbGljdHNXaXRoU0VJQ2xhc3MobmFtZSkgfHwgY29uZmxpY3RzV2l0aEpBWEJDbGFzcyhuYW1lKSl7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBjb25mbGljdHNXaXRoU0VJQ2xhc3MobmFtZSkgfHwgY29uZmxpY3RzV2l0aEpBWEJDbGFzcyhuYW1lKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgSkFYQk1vZGVsQnVpbGRlciBnZXRKQVhCTW9kZWxCdWlsZGVyKCkgewpAQCAtMjcyNywzMiArMjY1OCwzMSBAQAogICAgIH0KIAogICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlV1NETEJpbmRpbmdTdHlsZShCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgYm9vbGVhbiBtaXhlZFN0eWxlID0gZmFsc2U7CiAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0KLSAgICAgICAgICAgIChTT0FQQmluZGluZylnZXRFeHRlbnNpb25PZlR5cGUoYmluZGluZywgU09BUEJpbmRpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIChTT0FQQmluZGluZykgZ2V0RXh0ZW5zaW9uT2ZUeXBlKGJpbmRpbmcsIFNPQVBCaW5kaW5nLmNsYXNzKTsKIAogICAgICAgICAvL2RvbnQgcHJvY2VzcyB0aGUgYmluZGluZwotICAgICAgICBpZihzb2FwQmluZGluZyA9PSBudWxsKQorICAgICAgICBpZiAoc29hcEJpbmRpbmcgPT0gbnVsbCkKICAgICAgICAgICAgIHNvYXBCaW5kaW5nID0KLSAgICAgICAgICAgICAgICAoU09BUEJpbmRpbmcpZ2V0RXh0ZW5zaW9uT2ZUeXBlKGJpbmRpbmcsIFNPQVAxMkJpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZihzb2FwQmluZGluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAoU09BUEJpbmRpbmcpIGdldEV4dGVuc2lvbk9mVHlwZShiaW5kaW5nLCBTT0FQMTJCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgaWYgKHNvYXBCaW5kaW5nID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgLy9pZiBzb2FwYmluZDpiaW5kaW5nIGhhcyBubyBzdHlsZSBhdHRyaWJ1dGUsIHRoZSBkZWZhdWx0IGlzIERPQ1VNRU5UCi0gICAgICAgIGlmKHNvYXBCaW5kaW5nLmdldFN0eWxlKCkgPT0gbnVsbCkKKyAgICAgICAgaWYgKHNvYXBCaW5kaW5nLmdldFN0eWxlKCkgPT0gbnVsbCkKICAgICAgICAgICAgIHNvYXBCaW5kaW5nLnNldFN0eWxlKFNPQVBTdHlsZS5ET0NVTUVOVCk7CiAKICAgICAgICAgU09BUFN0eWxlIG9wU3R5bGUgPSBzb2FwQmluZGluZy5nZXRTdHlsZSgpOwogICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiaW5kaW5nLm9wZXJhdGlvbnMoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgIChCaW5kaW5nT3BlcmF0aW9uKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAoQmluZGluZ09wZXJhdGlvbikgaXRlci5uZXh0KCk7CiAgICAgICAgICAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgIChTT0FQT3BlcmF0aW9uKSBnZXRFeHRlbnNpb25PZlR5cGUoYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgU09BUE9wZXJhdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICBpZihzb2FwT3BlcmF0aW9uICE9IG51bGwpewotICAgICAgICAgICAgICAgIFNPQVBTdHlsZSBjdXJyT3BTdHlsZSA9IChzb2FwT3BlcmF0aW9uLmdldFN0eWxlKCkgIT0gbnVsbCk/c29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpOnNvYXBCaW5kaW5nLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgICAgICAgIChTT0FQT3BlcmF0aW9uKSBnZXRFeHRlbnNpb25PZlR5cGUoYmluZGluZ09wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQT3BlcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChzb2FwT3BlcmF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTT0FQU3R5bGUgY3Vyck9wU3R5bGUgPSAoc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpICE9IG51bGwpID8gc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpIDogc29hcEJpbmRpbmcuZ2V0U3R5bGUoKTsKICAgICAgICAgICAgICAgICAvL2RvbnQgY2hlY2sgZm9yIHRoZSBmaXJzdCBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICBpZighY3Vyck9wU3R5bGUuZXF1YWxzKG9wU3R5bGUpKQorICAgICAgICAgICAgICAgIGlmICghY3Vyck9wU3R5bGUuZXF1YWxzKG9wU3R5bGUpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI3NjMsMTYgKzI2OTMsMTYgQEAKICAgICAgKiBAcGFyYW0gcG9ydAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBhcHBseVdyYXBwZXJTdHlsZUN1c3RvbWl6YXRpb24oUG9ydCBwb3J0LCBQb3J0VHlwZSBwb3J0VHlwZSkgewotICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nID0gKEpBWFdTQmluZGluZylnZXRFeHRlbnNpb25PZlR5cGUocG9ydFR5cGUsIEpBWFdTQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIEJvb2xlYW4gd3JhcHBlclN0eWxlID0gKGpheHdzQmluZGluZyAhPSBudWxsKT9qYXh3c0JpbmRpbmcuaXNFbmFibGVXcmFwcGVyU3R5bGUoKTpudWxsOwotICAgICAgICBpZih3cmFwcGVyU3R5bGUgIT0gbnVsbCl7CisgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSAoSkFYV1NCaW5kaW5nKSBnZXRFeHRlbnNpb25PZlR5cGUocG9ydFR5cGUsIEpBWFdTQmluZGluZy5jbGFzcyk7CisgICAgICAgIEJvb2xlYW4gd3JhcHBlclN0eWxlID0gKGpheHdzQmluZGluZyAhPSBudWxsKSA/IGpheHdzQmluZGluZy5pc0VuYWJsZVdyYXBwZXJTdHlsZSgpIDogbnVsbDsKKyAgICAgICAgaWYgKHdyYXBwZXJTdHlsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBwb3J0LnNldFdyYXBwZWQod3JhcHBlclN0eWxlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXREb2N1bWVudGF0aW9uSWZQcmVzZW50KAotICAgICAgICBNb2RlbE9iamVjdCBvYmosCi0gICAgICAgIERvY3VtZW50YXRpb24gZG9jdW1lbnRhdGlvbikgeworICAgICAgICAgICAgTW9kZWxPYmplY3Qgb2JqLAorICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uKSB7CiAgICAgICAgIGlmIChkb2N1bWVudGF0aW9uICE9IG51bGwgJiYgZG9jdW1lbnRhdGlvbi5nZXRDb250ZW50KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgb2JqLnNldEphdmFEb2MoZG9jdW1lbnRhdGlvbi5nZXRDb250ZW50KCkpOwogICAgICAgICB9CkBAIC0yNzgwLDE2ICsyNzEwLDIwIEBACiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEphdmFOYW1lRm9yT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKICAgICAgICAgU3RyaW5nIG5hbWUgPSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZE5hbWUoKTsKLSAgICAgICAgaWYoZ2V0RW52aXJvbm1lbnQoKS5nZXROYW1lcygpLmlzSmF2YVJlc2VydmVkV29yZChuYW1lKSl7Ci0gICAgICAgICAgICBuYW1lID0gIl8iK25hbWU7CisgICAgICAgIGlmIChOYW1lcy5pc0phdmFSZXNlcnZlZFdvcmQobmFtZSkpIHsKKyAgICAgICAgICAgIG5hbWUgPSAiXyIgKyBuYW1lOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGZhaWwoU3RyaW5nIGtleSwgU3RyaW5nIGFyZyl7Ci0gICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKGtleSwgYXJnKTsKKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0RXJyb3IoRW50aXR5IGVudGl0eSwKKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZE1zZywgRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbiApIHsKKyAgICAgICAgTG9jYXRvciBsb2NhdG9yID0gKGVudGl0eSA9PSBudWxsKT9OVUxMX0xPQ0FUT1I6ZW50aXR5LmdldExvY2F0b3IoKTsKKworICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBlID0gbmV3IFNBWFBhcnNlRXhjZXB0aW9uMiggZm9ybWF0dGVkTXNnLAorICAgICAgICAgICAgbG9jYXRvciwKKyAgICAgICAgICAgIG5lc3RlZEV4Y2VwdGlvbiApOworICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihlKTsKICAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgZmFpbChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKXsKLSAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oa2V5LCBhcmdzKTsKLSAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9XU0RMTW9kZWxlckJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL21vZGVsZXIvd3NkbC9XU0RMTW9kZWxlckJhc2UuamF2YQppbmRleCBmYzVmMDI4Li44OWVhYjkxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci9tb2RlbGVyL3dzZGwvV1NETE1vZGVsZXJCYXNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvbW9kZWxlci93c2RsL1dTRExNb2RlbGVyQmFzZS5qYXZhCkBAIC0xLDYgKzEsNSBAQAotCiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsNjQgKzIzLDQxIEBACiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KIAorCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5XU0RMTW9kZWxJbmZvOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLk5hbWVzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkFic3RyYWN0VHlwZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5CbG9jazsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5GYXVsdDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbE9iamVjdDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuT3BlcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLlBhcmFtZXRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Qb3J0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmphdmEuSmF2YUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLkphdmFTaW1wbGVUeXBlQ3JlYXRvcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLk1vZGVsZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5Nb2RlbGVyRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkJpbmRpbmdGYXVsdDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuRG9jdW1lbnRhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuS2luZHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2VQYXJ0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5PcGVyYXRpb25TdHlsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETERvY3VtZW50OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLk1vZGVsZXJNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5BYm9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXJGaWx0ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRPcHRpb25zOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5qYXh3cy5KQVhXU0JpbmRpbmc7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lm1pbWUuTUlNRUNvbnRlbnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lm1pbWUuTUlNRVBhcnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNjaGVtYS5TY2hlbWFLaW5kczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQQm9keTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuR2xvYmFsbHlLbm93bjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyLkNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyLlV0aWw7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5ET01Gb3Jlc3Q7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5XU0RMUGFyc2VyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuTWV0YWRhdGFGaW5kZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuSkFYQlJJQ29udGV4dDsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkxvY2F0b3JJbXBsOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKIAogLyoqCiAgKgpAQCAtOTAsNTMgKzY2LDE4IEBACiAgKiBCYXNlIGNsYXNzIGZvciBXU0RMLT5Nb2RlbCBjbGFzc2VzLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETE1vZGVsZXJCYXNlIGltcGxlbWVudHMgTW9kZWxlciB7Ci0gICAgcHVibGljIFdTRExNb2RlbGVyQmFzZShXU0RMTW9kZWxJbmZvIG1vZGVsSW5mbywgUHJvcGVydGllcyBvcHRpb25zKSB7Ci0gICAgICAgIC8vaW5pdCgpOwotICAgICAgICBfbW9kZWxJbmZvID0gbW9kZWxJbmZvOwotICAgICAgICBfb3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgICAgIF9tZXNzYWdlRmFjdG9yeSA9Ci0gICAgICAgICAgICBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMubW9kZWxlciIpOwotICAgICAgICBfY29uZmxpY3RpbmdDbGFzc05hbWVzID0gbnVsbDsKLSAgICAgICAgX2VudiA9IChQcm9jZXNzb3JFbnZpcm9ubWVudCltb2RlbEluZm8uZ2V0UGFyZW50KCkuZ2V0RW52aXJvbm1lbnQoKTsKLSAgICAgICAgaFNldCA9IG51bGw7Ci0gICAgICAgIHJlcVJlc05hbWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICB9CisgICAgcHJvdGVjdGVkIGZpbmFsIEVycm9yUmVjZWl2ZXJGaWx0ZXIgZXJyUmVjZWl2ZXI7CisgICAgcHJvdGVjdGVkIGZpbmFsIFdzaW1wb3J0T3B0aW9ucyBvcHRpb25zOworICAgIHByb3RlY3RlZCBNZXRhZGF0YUZpbmRlciBmb3Jlc3Q7CiAKIAotICAgIHByb3RlY3RlZCBXU0RMUGFyc2VyIGNyZWF0ZVdTRExQYXJzZXIoKXsKLSAgICAgICAgcmV0dXJuIG5ldyBXU0RMUGFyc2VyKF9tb2RlbEluZm8pOworICAgIHB1YmxpYyBXU0RMTW9kZWxlckJhc2UoV3NpbXBvcnRPcHRpb25zIG9wdGlvbnMsIEVycm9yUmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgdGhpcy5lcnJSZWNlaXZlciA9IG5ldyBFcnJvclJlY2VpdmVyRmlsdGVyKHJlY2VpdmVyKTs7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQnVpbGRzIG1vZGVsIGZyb20gV1NETCBkb2N1bWVudC4gTW9kZWwgY29udGFpbnMgYWJzdHJhY3Rpb24gd2hpY2ggaXMgdXNlZCBieSB0aGUKLSAgICAgKiBnZW5lcmF0b3JzIHRvIGdlbmVyYXRlIHRoZSBzdHViL3RpZS9zZXJpYWxpemVycyBldGMuIGNvZGUuCiAgICAgICoKLSAgICAgKiBAc2VlIE1vZGVsZXIjYnVpbGRNb2RlbCgpCi0gICAgICovCi0gICAgcHVibGljIE1vZGVsIGJ1aWxkTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBXU0RMTW9kZWxJbmZvIGdldFdTRExNb2RlbEluZm8oKXsKLSAgICAgICAgcmV0dXJuIF9tb2RlbEluZm87Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50YXRpb24gZ2V0RG9jdW1lbnRhdGlvbkZvcihFbGVtZW50IGUpIHsKLSAgICAgICAgU3RyaW5nIHMgPSBYbWxVdGlsLmdldFRleHRGb3JOb2RlKGUpOwotICAgICAgICBpZiAocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRhdGlvbihzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTm90V3NkbEVsZW1lbnQoRWxlbWVudCBlKSB7Ci0gICAgICAgIC8vIHBvc3NpYmxlIGV4dGVuc2liaWxpdHkgZWxlbWVudCAtLSBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICAgICAgaWYgKGUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKENvbnN0YW50cy5OU19XU0RMKSkKLSAgICAgICAgICAgIFV0aWwuZmFpbCgicGFyc2luZy5pbnZhbGlkV3NkbEVsZW1lbnQiLCBlLmdldFRhZ05hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQHBhcmFtIHBvcnQKICAgICAgKiBAcGFyYW0gd3NkbFBvcnQKICAgICAgKi8KQEAgLTE1MCw3ICs5MSw3IEBACiAgICAgICAgICAgICBwb3J0LnNldFBvcnRHZXR0ZXIocG9ydE1ldGhvZE5hbWUpOwogICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgIHBvcnRNZXRob2ROYW1lID0gTmFtZXMuZ2V0UG9ydE5hbWUocG9ydCk7Ci0gICAgICAgICAgICBwb3J0TWV0aG9kTmFtZSA9IGdldEVudmlyb25tZW50KCkuZ2V0TmFtZXMoKS52YWxpZEphdmFDbGFzc05hbWUocG9ydE1ldGhvZE5hbWUpOworICAgICAgICAgICAgcG9ydE1ldGhvZE5hbWUgPSBKQVhCUklDb250ZXh0Lm1hbmdsZU5hbWVUb0NsYXNzTmFtZShwb3J0TWV0aG9kTmFtZSk7CiAgICAgICAgICAgICBwb3J0LnNldFBvcnRHZXR0ZXIoImdldCIrcG9ydE1ldGhvZE5hbWUpOwogICAgICAgICB9CiAKQEAgLTE3MCw3OCArMTExLDE5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYXJlbnRGYXVsdChGYXVsdCBmYXVsdCkgewotICAgICAgICBBYnN0cmFjdFR5cGUgZmF1bHRUeXBlID0gZmF1bHQuZ2V0QmxvY2soKS5nZXRUeXBlKCk7Ci0gICAgICAgIEFic3RyYWN0VHlwZSBwYXJlbnRUeXBlID0gbnVsbDsKLQotCi0gICAgICAgIGlmIChwYXJlbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYXVsdC5nZXRQYXJlbnRGYXVsdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGYXVsdCBwYXJlbnRGYXVsdCA9Ci0gICAgICAgICAgICBuZXcgRmF1bHQoKChBYnN0cmFjdFR5cGUpcGFyZW50VHlwZSkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgLyogdGhpcyBpcyB3aGF0IGl0IHJlYWxseSBzaG91bGQgYmUgYnV0IGZvciBpbnRlcm9wIHdpdGggSkFYUlBDIDEuMC4xIHdlIGFyZSBub3QgZG9pbmcKLSAgICAgICAgICogdGhpcyBhdCB0aGlzIHRpbWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE8gLSB3ZSBzaG91bGQgZG91YmxlLWNoZWNrIHRoaXM7IHRoZSBhYm92ZSBzdGF0ZW1lbnQgbWlnaHQgbm90IGJlIHRydWUgYW55bW9yZS4KLSAgICAgICAgICovCi0gICAgICAgIFFOYW1lIGZhdWx0UU5hbWUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIGZhdWx0LmdldEJsb2NrKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgIHBhcmVudEZhdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKGZhdWx0UU5hbWUpOwotICAgICAgICBibG9jay5zZXRUeXBlKChBYnN0cmFjdFR5cGUpcGFyZW50VHlwZSk7Ci0gICAgICAgIHBhcmVudEZhdWx0LnNldEJsb2NrKGJsb2NrKTsKLSAgICAgICAgcGFyZW50RmF1bHQuYWRkU3ViZmF1bHQoZmF1bHQpOwotICAgICAgICBjcmVhdGVQYXJlbnRGYXVsdChwYXJlbnRGYXVsdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3ViZmF1bHRzKEZhdWx0IGZhdWx0KSB7Ci0gICAgICAgIEFic3RyYWN0VHlwZSBmYXVsdFR5cGUgPSBmYXVsdC5nZXRCbG9jaygpLmdldFR5cGUoKTsKLSAgICAgICAgSXRlcmF0b3Igc3VidHlwZXMgPSBudWxsOwotICAgICAgICBpZiAoc3VidHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgQWJzdHJhY3RUeXBlIHN1YnR5cGU7Ci0gICAgICAgICAgICB3aGlsZSAoc3VidHlwZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgc3VidHlwZSA9IChBYnN0cmFjdFR5cGUpc3VidHlwZXMubmV4dCgpOwotICAgICAgICAgICAgICAgIEZhdWx0IHN1YkZhdWx0ID0gbmV3IEZhdWx0KHN1YnR5cGUuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIHdoYXQgaXQgcmVhbGx5IGlzIGJ1dCBmb3IgaW50ZXJvcCB3aXRoIEpBWFJQQyAxLjAuMSB3ZSBhcmUgbm90IGRvaW5nCi0gICAgICAgICAgICAgICAgICogdGhpcyBhdCB0aGlzIHRpbWUKLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIFRPRE8gLSB3ZSBzaG91bGQgZG91YmxlLWNoZWNrIHRoaXM7IHRoZSBhYm92ZSBzdGF0ZW1lbnQgbWlnaHQgbm90IGJlIHRydWUgYW55bW9yZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBRTmFtZSBmYXVsdFFOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0QmxvY2soKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJGYXVsdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKGZhdWx0UU5hbWUpOwotICAgICAgICAgICAgICAgIGJsb2NrLnNldFR5cGUoc3VidHlwZSk7Ci0gICAgICAgICAgICAgICAgc3ViRmF1bHQuc2V0QmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgIGZhdWx0LmFkZFN1YmZhdWx0KHN1YkZhdWx0KTsKLSAgICAgICAgICAgICAgICBjcmVhdGVTdWJmYXVsdHMoc3ViRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJvdGVjdGVkIFNPQVBCb2R5IGdldFNPQVBSZXF1ZXN0Qm9keSgpIHsKICAgICAgICAgU09BUEJvZHkgcmVxdWVzdEJvZHkgPQogICAgICAgICAgICAgKFNPQVBCb2R5KWdldEFueUV4dGVuc2lvbk9mVHlwZShpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKSwKICAgICAgICAgICAgICAgICBTT0FQQm9keS5jbGFzcyk7CiAgICAgICAgIGlmIChyZXF1ZXN0Qm9keSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyB0aGUgV1NETCBkb2N1bWVudCBpcyBpbnZhbGlkCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nT3BlcmF0aW9uLmlucHV0TWlzc2luZ1NvYXBCb2R5IiwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICBlcnJvcihpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKSwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fSU5QVVRfTUlTU0lOR19TT0FQX0JPRFkoaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXF1ZXN0Qm9keTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVlc3RNaW1lTXVsdGlwYXJ0KCkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKS5leHRlbnNpb25zKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChFeHRlbnNpb24paXRlci5uZXh0KCk7CisgICAgICAgIGZvciAoVFdTRExFeHRlbnNpb24gZXh0ZW5zaW9uOiBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKS5leHRlbnNpb25zKCkpIHsKICAgICAgICAgICAgIGlmIChleHRlbnNpb24uZ2V0Q2xhc3MoKS5lcXVhbHMoTUlNRU11bHRpcGFydFJlbGF0ZWQuY2xhc3MpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CkBAIC0yNTAsOCArMTMyLDcgQEAKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc3BvbnNlTWltZU11bHRpcGFydCgpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE91dHB1dCgpLmV4dGVuc2lvbnMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0gKEV4dGVuc2lvbilpdGVyLm5leHQoKTsKKyAgICAgICAgZm9yIChUV1NETEV4dGVuc2lvbiBleHRlbnNpb246IGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXRPdXRwdXQoKS5leHRlbnNpb25zKCkpIHsKICAgICAgICAgICAgIGlmIChleHRlbnNpb24uZ2V0Q2xhc3MoKS5lcXVhbHMoTUlNRU11bHRpcGFydFJlbGF0ZWQuY2xhc3MpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CkBAIC0yNjgsOSArMTQ5LDcgQEAKICAgICAgICAgICAgICAgICBTT0FQQm9keS5jbGFzcyk7CiAgICAgICAgIGlmIChyZXNwb25zZUJvZHkgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gdGhlIFdTREwgZG9jdW1lbnQgaXMgaW52YWxpZAotICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ09wZXJhdGlvbi5vdXRwdXRNaXNzaW5nU29hcEJvZHkiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgIGVycm9yKGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXRPdXRwdXQoKSwgIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX09VVFBVVF9NSVNTSU5HX1NPQVBfQk9EWShpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3BvbnNlQm9keTsKICAgICB9CkBAIC0yOTAsMTUgKzE2OSwxNSBAQAogICAgICAqIEBwYXJhbSBtZXNzYWdlIElucHV0IG9yIG91dHB1dCBtZXNzYWdlLCBlcXVpdmFsZW50IHRvIHdzZGw6bWVzc2FnZQogICAgICAqIEByZXR1cm4gaXRlcmF0b3Igb3ZlciBNZXNzYWdlUGFydAogICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldE1lc3NhZ2VQYXJ0cygKKyAgICBwcm90ZWN0ZWQgTGlzdDxNZXNzYWdlUGFydD4gZ2V0TWVzc2FnZVBhcnRzKAogICAgICAgICBTT0FQQm9keSBib2R5LAogICAgICAgICBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuTWVzc2FnZSBtZXNzYWdlLCBib29sZWFuIGlzSW5wdXQpIHsKICAgICAgICAgU3RyaW5nIGJvZHlQYXJ0cyA9IGJvZHkuZ2V0UGFydHMoKTsKLSAgICAgICAgQXJyYXlMaXN0IHBhcnRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBwYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0PE1lc3NhZ2VQYXJ0PiBwYXJ0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VQYXJ0PigpOworICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBwYXJ0cyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZVBhcnQ+KCk7CiAKICAgICAgICAgLy9nZXQgTWltZSBwYXJ0cwotICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9IG51bGw7CisgICAgICAgIExpc3QgbWltZVBhcnRzOwogICAgICAgICBpZihpc0lucHV0KQogICAgICAgICAgICAgbWltZVBhcnRzID0gZ2V0TWltZUNvbnRlbnRQYXJ0cyhtZXNzYWdlLCBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0SW5wdXQoKSk7CiAgICAgICAgIGVsc2UKQEAgLTMwOCwyNiArMTg3LDIyIEBACiAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgaW4gPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJvZHlQYXJ0cy50cmltKCksICIgIik7CiAgICAgICAgICAgICB3aGlsZSAoaW4uaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSBpbi5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlUGFydCBtUGFydCA9IChNZXNzYWdlUGFydCltZXNzYWdlLmdldFBhcnQocGFydCk7CisgICAgICAgICAgICAgICAgTWVzc2FnZVBhcnQgbVBhcnQgPSBtZXNzYWdlLmdldFBhcnQocGFydCk7CiAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbVBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAid3NkbG1vZGVsZXIuZXJyb3IucGFydHNOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBwYXJ0LCBtZXNzYWdlLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICBlcnJvcihtZXNzYWdlLCAgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0VSUk9SX1BBUlRTX05PVF9GT1VORChwYXJ0LCBtZXNzYWdlLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtUGFydC5zZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRLaW5kKE1lc3NhZ2VQYXJ0LlNPQVBfQk9EWV9CSU5ESU5HKTsKICAgICAgICAgICAgICAgICBwYXJ0c0xpc3QuYWRkKG1QYXJ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gbWVzc2FnZS5wYXJ0cygpO2l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VQYXJ0IG1QYXJ0ID0gKE1lc3NhZ2VQYXJ0KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmKCFtaW1lUGFydHMuY29udGFpbnMobVBhcnQpKQorICAgICAgICAgICAgZm9yIChNZXNzYWdlUGFydCBtUGFydCA6IG1lc3NhZ2UuZ2V0UGFydHMoKSkgeworICAgICAgICAgICAgICAgIGlmICghbWltZVBhcnRzLmNvbnRhaW5zKG1QYXJ0KSkKICAgICAgICAgICAgICAgICAgICAgbVBhcnQuc2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZChNZXNzYWdlUGFydC5TT0FQX0JPRFlfQklORElORyk7CiAgICAgICAgICAgICAgICAgcGFydHNMaXN0LmFkZChtUGFydCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmb3IoSXRlcmF0b3IgaXRlciA9IG1lc3NhZ2UucGFydHMoKTtpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1lc3NhZ2VQYXJ0IG1QYXJ0ID0gKE1lc3NhZ2VQYXJ0KWl0ZXIubmV4dCgpOworICAgICAgICBmb3IgKE1lc3NhZ2VQYXJ0IG1QYXJ0IDogbWVzc2FnZS5nZXRQYXJ0cygpKSB7CiAgICAgICAgICAgICBpZihtaW1lUGFydHMuY29udGFpbnMobVBhcnQpKSB7CiAgICAgICAgICAgICAgICAgbVBhcnQuc2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZChNZXNzYWdlUGFydC5XU0RMX01JTUVfQklORElORyk7CiAgICAgICAgICAgICAgICAgcGFydHMuYWRkKG1QYXJ0KTsKQEAgLTM0NCwxNCArMjE5LDEyIEBACiAgICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAgKiBAcmV0dXJuIE1lc3NhZ2VQYXJ0cyByZWZlcmVuY2VkIGJ5IHRoZSBtaW1lOmNvbnRlbnQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRNaW1lQ29udGVudFBhcnRzKE1lc3NhZ2UgbWVzc2FnZSwgRXh0ZW5zaWJsZSBleHQpIHsKLSAgICAgICAgQXJyYXlMaXN0IG1pbWVDb250ZW50UGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFN0cmluZyBtaW1lQ29udGVudFBhcnROYW1lID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3IgbWltZVBhcnRzID0gZ2V0TWltZVBhcnRzKGV4dCk7CisgICAgcHJvdGVjdGVkIExpc3Q8TWVzc2FnZVBhcnQ+IGdldE1pbWVDb250ZW50UGFydHMoTWVzc2FnZSBtZXNzYWdlLCBUV1NETEV4dGVuc2libGUgZXh0KSB7CisgICAgICAgIEFycmF5TGlzdDxNZXNzYWdlUGFydD4gbWltZUNvbnRlbnRQYXJ0cyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZVBhcnQ+KCk7CiAKLSAgICAgICAgd2hpbGUobWltZVBhcnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IGdldE1pbWVDb250ZW50UGFydChtZXNzYWdlLCAoTUlNRVBhcnQpbWltZVBhcnRzLm5leHQoKSk7Ci0gICAgICAgICAgICBpZihwYXJ0ICE9IG51bGwpCisgICAgICAgIGZvciAoTUlNRVBhcnQgbWltZVBhcnQgOiBnZXRNaW1lUGFydHMoZXh0KSkgeworICAgICAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IGdldE1pbWVDb250ZW50UGFydChtZXNzYWdlLCBtaW1lUGFydCk7CisgICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQogICAgICAgICAgICAgICAgIG1pbWVDb250ZW50UGFydHMuYWRkKHBhcnQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtaW1lQ29udGVudFBhcnRzOwpAQCAtMzYwLDMyICsyMzMsMjUgQEAKICAgICAvKioKICAgICAgKiBAcGFyYW0gbWltZVBhcnRzCiAgICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVNaW1lUGFydHMoSXRlcmF0b3IgbWltZVBhcnRzKSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVNaW1lUGFydHMoSXRlcmFibGU8TUlNRVBhcnQ+IG1pbWVQYXJ0cykgewogICAgICAgICBib29sZWFuIGdvdFJvb3RQYXJ0ID0gZmFsc2U7Ci0gICAgICAgIExpc3QgbWltZUNvbnRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZShtaW1lUGFydHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNSU1FUGFydCBtUGFydCA9IChNSU1FUGFydCltaW1lUGFydHMubmV4dCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgZXh0bnMgPSBtUGFydC5leHRlbnNpb25zKCk7Ci0gICAgICAgICAgICB3aGlsZShleHRucy5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBleHRucy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYob2JqIGluc3RhbmNlb2YgU09BUEJvZHkpewotICAgICAgICAgICAgICAgICAgICBpZihnb3RSb290UGFydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9idWcgZml4OiA1MDI0MDIwCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCJtaW1lbW9kZWxlci5pbnZhbGlkTWltZVBhcnQubW9yZVRoYW5PbmVTT0FQQm9keSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7aW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpfSk7CisgICAgICAgIExpc3Q8TUlNRUNvbnRlbnQ+IG1pbWVDb250ZW50cyA9IG5ldyBBcnJheUxpc3Q8TUlNRUNvbnRlbnQ+KCk7CisgICAgICAgIGZvciAoTUlNRVBhcnQgbVBhcnQgOiBtaW1lUGFydHMpIHsKKyAgICAgICAgICAgIGZvciAoVFdTRExFeHRlbnNpb24gb2JqIDogbVBhcnQuZXh0ZW5zaW9ucygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNPQVBCb2R5KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnb3RSb290UGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyhtUGFydCwgTW9kZWxlck1lc3NhZ2VzLk1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9QQVJUX01PUkVfVEhBTl9PTkVfU09BUF9CT0RZKGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGdvdFJvb3RQYXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9ZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTUlNRUNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWltZUNvbnRlbnRzLmFkZCgoTUlNRUNvbnRlbnQpb2JqKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1JTUVDb250ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1pbWVDb250ZW50cy5hZGQoKE1JTUVDb250ZW50KSBvYmopOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZU1pbWVDb250ZW50UGFydE5hbWVzKG1pbWVDb250ZW50cy5pdGVyYXRvcigpKSkKKyAgICAgICAgICAgIGlmKCF2YWxpZGF0ZU1pbWVDb250ZW50UGFydE5hbWVzKG1pbWVDb250ZW50cykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYobVBhcnQuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL2J1ZyBmaXg6IDUwMjQwMTgKLSAgICAgICAgICAgICAgICB3YXJuKCJtaW1lbW9kZWxlci5pbnZhbGlkTWltZVBhcnQubmFtZU5vdEFsbG93ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5wb3J0VHlwZU9wZXJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHdhcm5pbmcobVBhcnQsIE1vZGVsZXJNZXNzYWdlcy5NSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfUEFSVF9OQU1FX05PVF9BTExPV0VEKGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zOTMsMTUgKzI1OSwxMiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgTWVzc2FnZVBhcnQgZ2V0TWltZUNvbnRlbnRQYXJ0KE1lc3NhZ2UgbWVzc2FnZSwgTUlNRVBhcnQgcGFydCkgewotICAgICAgICBTdHJpbmcgbWltZUNvbnRlbnRQYXJ0TmFtZSA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yIG1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50cyhwYXJ0KS5pdGVyYXRvcigpOwotICAgICAgICBpZihtaW1lQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBtaW1lQ29udGVudFBhcnROYW1lID0gKChNSU1FQ29udGVudCltaW1lQ29udGVudHMubmV4dCgpKS5nZXRQYXJ0KCk7Ci0gICAgICAgICAgICBNZXNzYWdlUGFydCBtUGFydCA9IChNZXNzYWdlUGFydCltZXNzYWdlLmdldFBhcnQobWltZUNvbnRlbnRQYXJ0TmFtZSk7CisgICAgICAgIGZvciggTUlNRUNvbnRlbnQgbWltZUNvbnRlbnQgOiBnZXRNaW1lQ29udGVudHMocGFydCkgKSB7CisgICAgICAgICAgICBTdHJpbmcgbWltZUNvbnRlbnRQYXJ0TmFtZSA9IG1pbWVDb250ZW50LmdldFBhcnQoKTsKKyAgICAgICAgICAgIE1lc3NhZ2VQYXJ0IG1QYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KG1pbWVDb250ZW50UGFydE5hbWUpOwogICAgICAgICAgICAgLy9SWFhYWCBtaW1lOmNvbnRlbnQgTVVTVCBoYXZlIHBhcnQgYXR0cmlidXRlCiAgICAgICAgICAgICBpZihudWxsID09IG1QYXJ0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oIndzZGxtb2RlbGVyLmVycm9yLnBhcnRzTm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttaW1lQ29udGVudFBhcnROYW1lLCBtZXNzYWdlLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgIGVycm9yKG1pbWVDb250ZW50LCAgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0VSUk9SX1BBUlRTX05PVF9GT1VORChtaW1lQ29udGVudFBhcnROYW1lLCBtZXNzYWdlLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBhcnQuc2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZChNZXNzYWdlUGFydC5XU0RMX01JTUVfQklORElORyk7CiAgICAgICAgICAgICByZXR1cm4gbVBhcnQ7CkBAIC00MjIsMjkgKzI4NSwyNCBAQAogICAgICAgICByZXR1cm4gbWltZVR5cGVzOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBpdGVyYXRvcgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU1pbWVDb250ZW50UGFydE5hbWVzKEl0ZXJhdG9yIG1pbWVDb250ZW50cykgeworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU1pbWVDb250ZW50UGFydE5hbWVzKExpc3Q8TUlNRUNvbnRlbnQ+IG1pbWVDb250ZW50cykgewogICAgICAgICAvL3ZhbGlkYXRlIG1pbWU6Y29udGVudChzKSBpbiB0aGUgbWltZTpwYXJ0IGFzIHBlciBSMjkwOQotICAgICAgICB3aGlsZShtaW1lQ29udGVudHMuaGFzTmV4dCgpKXsKKyAgICAgICAgZm9yIChNSU1FQ29udGVudCBtaW1lQ29udGVudCA6IG1pbWVDb250ZW50cykgewogICAgICAgICAgICAgU3RyaW5nIG1pbWVDb250bmV0UGFydCA9IG51bGw7CiAgICAgICAgICAgICBpZihtaW1lQ29udG5ldFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1pbWVDb250bmV0UGFydCA9IGdldE1pbWVDb250ZW50UGFydE5hbWUoKE1JTUVDb250ZW50KW1pbWVDb250ZW50cy5uZXh0KCkpOworICAgICAgICAgICAgICAgIG1pbWVDb250bmV0UGFydCA9IGdldE1pbWVDb250ZW50UGFydE5hbWUobWltZUNvbnRlbnQpOwogICAgICAgICAgICAgICAgIGlmKG1pbWVDb250bmV0UGFydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhcm4oIm1pbWVtb2RlbGVyLmludmFsaWRNaW1lQ29udGVudC5taXNzaW5nUGFydEF0dHJpYnV0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCl9KTsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyhtaW1lQ29udGVudCwgTW9kZWxlck1lc3NhZ2VzLk1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9DT05URU5UX01JU1NJTkdfUEFSVF9BVFRSSUJVVEUoaW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld01pbWVDb250bmV0UGFydCA9IGdldE1pbWVDb250ZW50UGFydE5hbWUoKE1JTUVDb250ZW50KW1pbWVDb250ZW50cy5uZXh0KCkpOworICAgICAgICAgICAgICAgIFN0cmluZyBuZXdNaW1lQ29udG5ldFBhcnQgPSBnZXRNaW1lQ29udGVudFBhcnROYW1lKG1pbWVDb250ZW50KTsKICAgICAgICAgICAgICAgICBpZihuZXdNaW1lQ29udG5ldFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3YXJuKCJtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQubWlzc2luZ1BhcnRBdHRyaWJ1dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7aW5mby5vcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpfSk7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcobWltZUNvbnRlbnQsIE1vZGVsZXJNZXNzYWdlcy5NSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9NSVNTSU5HX1BBUlRfQVRUUklCVVRFKGluZm8ub3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfWVsc2UgaWYoIW5ld01pbWVDb250bmV0UGFydC5lcXVhbHMobWltZUNvbnRuZXRQYXJ0KSkgewogICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKCJtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQuZGlmZmVyZW50UGFydCIpOwotICAgICAgICAgICAgICAgICAgICB3YXJuKCJtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQuZGlmZmVyZW50UGFydCIpOworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKG1pbWVDb250ZW50LCBNb2RlbGVyTWVzc2FnZXMuTUlNRU1PREVMRVJfSU5WQUxJRF9NSU1FX0NPTlRFTlRfRElGRkVSRU5UX1BBUlQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00NTIsMTMgKzMxMCwxMiBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8TUlNRVBhcnQ+IGdldE1pbWVQYXJ0cyhFeHRlbnNpYmxlIGV4dCkgeworICAgIHByb3RlY3RlZCBJdGVyYWJsZTxNSU1FUGFydD4gZ2V0TWltZVBhcnRzKFRXU0RMRXh0ZW5zaWJsZSBleHQpIHsKICAgICAgICAgTUlNRU11bHRpcGFydFJlbGF0ZWQgbXVsdGlQYXJ0UmVsYXRlZCA9CiAgICAgICAgICAgICAoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGdldEFueUV4dGVuc2lvbk9mVHlwZShleHQsCiAgICAgICAgICAgICAgICAgICAgIE1JTUVNdWx0aXBhcnRSZWxhdGVkLmNsYXNzKTsKICAgICAgICAgaWYobXVsdGlQYXJ0UmVsYXRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PE1JTUVQYXJ0PiBwYXJ0cyA9IG5ldyBBcnJheUxpc3Q8TUlNRVBhcnQ+KCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFydHMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbXVsdGlQYXJ0UmVsYXRlZC5nZXRQYXJ0cygpOwogICAgIH0KQEAgLTQ2NiwxMSArMzIzLDkgQEAKICAgICAvL3JldHVybnMgTUlNRUNvbnRlbnRzCiAgICAgcHJvdGVjdGVkIExpc3Q8TUlNRUNvbnRlbnQ+IGdldE1pbWVDb250ZW50cyhNSU1FUGFydCBwYXJ0KSB7CiAgICAgICAgIExpc3Q8TUlNRUNvbnRlbnQ+IG1pbWVDb250ZW50cyA9IG5ldyBBcnJheUxpc3Q8TUlNRUNvbnRlbnQ+KCk7Ci0gICAgICAgIEl0ZXJhdG9yIHBhcnRzID0gcGFydC5leHRlbnNpb25zKCk7Ci0gICAgICAgIHdoaWxlKHBhcnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgRXh0ZW5zaW9uIG1pbWVDb250ZW50ID0gKEV4dGVuc2lvbikgcGFydHMubmV4dCgpOworICAgICAgICBmb3IgKFRXU0RMRXh0ZW5zaW9uIG1pbWVDb250ZW50IDogcGFydC5leHRlbnNpb25zKCkpIHsKICAgICAgICAgICAgIGlmIChtaW1lQ29udGVudCBpbnN0YW5jZW9mIE1JTUVDb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgbWltZUNvbnRlbnRzLmFkZCgoTUlNRUNvbnRlbnQpbWltZUNvbnRlbnQpOworICAgICAgICAgICAgICAgIG1pbWVDb250ZW50cy5hZGQoKE1JTUVDb250ZW50KSBtaW1lQ29udGVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy92YWxpZGF0ZU1pbWVDb250ZW50UGFydE5hbWVzKG1pbWVDb250ZW50cy5pdGVyYXRvcigpKTsKQEAgLTQ5MCw4ICszNDUsNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIGdldE1pbWVDb250ZW50VHlwZShNSU1FQ29udGVudCBtaW1lQ29udGVudCl7CiAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IG1pbWVDb250ZW50LmdldFR5cGUoKTsKICAgICAgICAgaWYobWltZVR5cGUgPT0gbnVsbCl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigibWltZW1vZGVsZXIuaW52YWxpZE1pbWVDb250ZW50Lm1pc3NpbmdUeXBlQXR0cmlidXRlIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCl9KTsKKyAgICAgICAgICAgIGVycm9yKG1pbWVDb250ZW50LCBNb2RlbGVyTWVzc2FnZXMuTUlNRU1PREVMRVJfSU5WQUxJRF9NSU1FX0NPTlRFTlRfTUlTU0lOR19UWVBFX0FUVFJJQlVURShpbmZvLm9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbWltZVR5cGU7CiAgICAgfQpAQCAtNTM0LDkgKzM4OCw3IEBACiAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gdGhlIFdTREwgZG9jdW1lbnQgaXMgaW52YWxpZAogICAgICAgICAgICAgLy8gYXQgbGVhc3QsIHRoYXQncyBteSBpbnRlcnByZXRhdGlvbiBvZiBzZWN0aW9uIDMuNSBvZiB0aGUgV1NETCAxLjEgc3BlYyEKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24uaW5wdXRTb2FwQm9keS5taXNzaW5nTmFtZXNwYWNlIiwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7CisgICAgICAgICAgICBlcnJvcihib2R5LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9JTlBVVF9TT0FQX0JPRFlfTUlTU0lOR19OQU1FU1BBQ0UoaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkk7CiAgICAgfQpAQCAtNTQ2LDkgKzM5OCw3IEBACiAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gdGhlIFdTREwgZG9jdW1lbnQgaXMgaW52YWxpZAogICAgICAgICAgICAgLy8gYXQgbGVhc3QsIHRoYXQncyBteSBpbnRlcnByZXRhdGlvbiBvZiBzZWN0aW9uIDMuNSBvZiB0aGUgV1NETCAxLjEgc3BlYyEKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24ub3V0cHV0U29hcEJvZHkubWlzc2luZ05hbWVzcGFjZSIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKX0pOworICAgICAgICAgICAgZXJyb3IoYm9keSwgTW9kZWxlck1lc3NhZ2VzLldTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fT1VUUFVUX1NPQVBfQk9EWV9NSVNTSU5HX05BTUVTUEFDRShpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKICAgICB9CkBAIC01NTYsMzkgKzQwNiwyNyBAQAogICAgIC8qKgogICAgICAqIEByZXR1cm4gTGlzdCBvZiBTT0FQSGVhZGVyIGV4dGVuc2lvbnMKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxTT0FQSGVhZGVyPiBnZXRIZWFkZXJFeHRlbnNpb25zKEV4dGVuc2libGUgZXh0ZW5zaWJsZSkgeworICAgIHByb3RlY3RlZCBMaXN0PFNPQVBIZWFkZXI+IGdldEhlYWRlckV4dGVuc2lvbnMoVFdTRExFeHRlbnNpYmxlIGV4dGVuc2libGUpIHsKICAgICAgICAgTGlzdDxTT0FQSGVhZGVyPiBoZWFkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTT0FQSGVhZGVyPigpOwotICAgICAgICBJdGVyYXRvciBiaW5kaW5nSXRlciA9IGV4dGVuc2libGUuZXh0ZW5zaW9ucygpOwotICAgICAgICB3aGlsZSAoYmluZGluZ0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0gKEV4dGVuc2lvbikgYmluZGluZ0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRDbGFzcygpLmVxdWFscyhNSU1FTXVsdGlwYXJ0UmVsYXRlZC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0ZW5zaW9uKS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgIHBhcnRzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIHBhcnQgPSAoRXh0ZW5zaW9uKSBwYXJ0cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmdldENsYXNzKCkuZXF1YWxzKE1JTUVQYXJ0LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1Jvb3RQYXJ0ID0gaXNSb290UGFydCgoTUlNRVBhcnQpcGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gKChNSU1FUGFydClwYXJ0KS5leHRlbnNpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBTT0FQSGVhZGVyKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9idWcgZml4OiA1MDI0MDE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc1Jvb3RQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWltZW1vZGVsZXIud2FybmluZy5JZ25vcmluZ2ludmFsaWRIZWFkZXJQYXJ0Lm5vdERlY2xhcmVkSW5Sb290UGFydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U09BUEhlYWRlcj4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMaXN0LmFkZCgoU09BUEhlYWRlcilvYmopOworICAgICAgICBmb3IgKFRXU0RMRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IGV4dGVuc2libGUuZXh0ZW5zaW9ucygpKSB7CisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldENsYXNzKCk9PU1JTUVNdWx0aXBhcnRSZWxhdGVkLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgZm9yKCBNSU1FUGFydCBwYXJ0IDogKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0ZW5zaW9uKS5nZXRQYXJ0cygpICkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUm9vdFBhcnQgPSBpc1Jvb3RQYXJ0KHBhcnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFRXU0RMRXh0ZW5zaW9uIG9iaiA6IHBhcnQuZXh0ZW5zaW9ucygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU09BUEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYnVnIGZpeDogNTAyNDAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNSb290UGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKChFbnRpdHkpIG9iaiwgTW9kZWxlck1lc3NhZ2VzLk1JTUVNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdJTlZBTElEX0hFQURFUl9QQVJUX05PVF9ERUNMQVJFRF9JTl9ST09UX1BBUlQoaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTT0FQSGVhZGVyPigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMaXN0LmFkZCgoU09BUEhlYWRlcikgb2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2UgaWYoZXh0ZW5zaW9uIGluc3RhbmNlb2YgU09BUEhlYWRlcikgewotICAgICAgICAgICAgICAgIGhlYWRlckxpc3QuYWRkKChTT0FQSGVhZGVyKWV4dGVuc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJMaXN0LmFkZCgoU09BUEhlYWRlcikgZXh0ZW5zaW9uKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGhlYWRlckxpc3Q7CiAgICAgfQogCkBAIC01OTcsOSArNDM1LDggQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGFydCBpcyB0aGUgUm9vdCBwYXJ0CiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzUm9vdFBhcnQoTUlNRVBhcnQgcGFydCkgewotICAgICAgICBJdGVyYXRvciBpdGVyID0gcGFydC5leHRlbnNpb25zKCk7Ci0gICAgICAgIHdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgIGlmKGl0ZXIubmV4dCgpIGluc3RhbmNlb2YgU09BUEJvZHkpCisgICAgICAgIGZvciAoVFdTRExFeHRlbnNpb24gdHdzZGxFeHRlbnNpb24gOiBwYXJ0LmV4dGVuc2lvbnMoKSkgeworICAgICAgICAgICAgaWYgKHR3c2RsRXh0ZW5zaW9uIGluc3RhbmNlb2YgU09BUEJvZHkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjA3LDI1ICs0NDQsMTYgQEAKIAogICAgIHByb3RlY3RlZCBTZXQgZ2V0RHVwbGljYXRlRmF1bHROYW1lcygpIHsKICAgICAgICAgLy8gbG9vayBmb3IgZmF1bHQgbWVzc2FnZXMgd2l0aCB0aGUgc2FtZSBzb2FwOmZhdWx0IG5hbWUKLSAgICAgICAgU2V0IGZhdWx0TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBTZXQgZHVwbGljYXRlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZmF1bHRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpaXRlci5uZXh0KCk7CisgICAgICAgIFNldDxRTmFtZT4gZmF1bHROYW1lcyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOworICAgICAgICBTZXQ8UU5hbWU+IGR1cGxpY2F0ZU5hbWVzID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7CisgICAgICAgIGZvciggQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA6IGluZm8uYmluZGluZ09wZXJhdGlvbi5mYXVsdHMoKSApIHsKICAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5GYXVsdCBwb3J0VHlwZUZhdWx0ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcjIgPSBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmZhdWx0cygpOwotICAgICAgICAgICAgICAgIGl0ZXIyLmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuRmF1bHQgYUZhdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5GYXVsdClpdGVyMi5uZXh0KCk7Ci0KKyAgICAgICAgICAgIGZvciAoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkZhdWx0IGFGYXVsdCA6IGluZm8ucG9ydFR5cGVPcGVyYXRpb24uZmF1bHRzKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoYUZhdWx0LmdldE5hbWUoKS5lcXVhbHMoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRUeXBlRmF1bHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdTREwgZG9jdW1lbnQgaXMgaW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lm5vdFVuaXF1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoYmluZGluZ0ZhdWx0LCBNb2RlbGVyTWVzc2FnZXMuV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX05PVF9VTklRVUUoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZUZhdWx0ID0gYUZhdWx0OwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02MzMsNDYgKzQ2MSwzNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBvcnRUeXBlRmF1bHQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIHRoZSBXU0RMIGRvY3VtZW50IGlzIGludmFsaWQKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lm5vdEZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdGYXVsdC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpfSk7Ci0KKyAgICAgICAgICAgICAgICBlcnJvcihiaW5kaW5nRmF1bHQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfTk9UX0ZPVU5EKGJpbmRpbmdGYXVsdC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPQogICAgICAgICAgICAgICAgIChTT0FQRmF1bHQpZ2V0RXh0ZW5zaW9uT2ZUeXBlKGJpbmRpbmdGYXVsdCwgU09BUEZhdWx0LmNsYXNzKTsKICAgICAgICAgICAgIGlmIChzb2FwRmF1bHQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIHRoZSBXU0RMIGRvY3VtZW50IGlzIGludmFsaWQKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lm91dHB1dE1pc3NpbmdTb2FwRmF1bHQiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICBpZihvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpKXsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyhiaW5kaW5nRmF1bHQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfT1VUUFVUX01JU1NJTkdfU09BUF9GQVVMVChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBpbmZvLmJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgICBlcnJvcihiaW5kaW5nRmF1bHQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfT1VUUFVUX01JU1NJTkdfU09BUF9GQVVMVChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5iaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk1lc3NhZ2UgZmF1bHRNZXNzYWdlID0KICAgICAgICAgICAgICAgICBwb3J0VHlwZUZhdWx0LnJlc29sdmVNZXNzYWdlKGluZm8uZG9jdW1lbnQpOwotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcjIgPSBmYXVsdE1lc3NhZ2UucGFydHMoKTsKLSAgICAgICAgICAgIGlmICghaXRlcjIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBpZihmYXVsdE1lc3NhZ2UuZ2V0UGFydHMoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAvLyB0aGUgV1NETCBkb2N1bWVudCBpcyBpbnZhbGlkCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdGYXVsdC5lbXB0eU1lc3NhZ2UiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICBlcnJvcihmYXVsdE1lc3NhZ2UsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfRU1QVFlfTUVTU0FHRShiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyAgYnVnIGZpeDogNDg1MjcyOQotICAgICAgICAgICAgaWYgKHVzZVdTSUJhc2ljUHJvZmlsZSAmJiAoc29hcEZhdWx0LmdldE5hbWVzcGFjZSgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgd2FybigKLSAgICAgICAgICAgICAgICAgICAgIndzZGxtb2RlbGVyLndhcm5pbmcucjI3MTZyMjcyNiIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICJzb2FwYmluZDpmYXVsdCIsIHNvYXBGYXVsdC5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgIGlmICghb3B0aW9ucy5pc0V4dGVuc2lvbk1vZGUoKSAmJiAoc29hcEZhdWx0ICE9IG51bGwgJiYgc29hcEZhdWx0LmdldE5hbWVzcGFjZSgpICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgd2FybmluZyhzb2FwRmF1bHQsIE1vZGVsZXJNZXNzYWdlcy5XU0RMTU9ERUxFUl9XQVJOSU5HX1JfMjcxNl9SXzI3MjYoInNvYXBiaW5kOmZhdWx0Iiwgc29hcEZhdWx0LmdldE5hbWUoKSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGZhdWx0TmFtZXNwYWNlVVJJID0gc29hcEZhdWx0LmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgaWYgKGZhdWx0TmFtZXNwYWNlVVJJID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYXVsdE5hbWVzcGFjZVVSSSA9Ci0gICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlRmF1bHQuZ2V0TWVzc2FnZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGZhdWx0TmFtZXNwYWNlVVJJID0gKHNvYXBGYXVsdCAhPSBudWxsICYmIHNvYXBGYXVsdC5nZXROYW1lc3BhY2UoKSAhPSBudWxsKT9zb2FwRmF1bHQuZ2V0TmFtZXNwYWNlKCk6cG9ydFR5cGVGYXVsdC5nZXRNZXNzYWdlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CiAgICAgICAgICAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHRNZXNzYWdlLmdldE5hbWUoKTsKICAgICAgICAgICAgIFFOYW1lIGZhdWx0UU5hbWUgPSBuZXcgUU5hbWUoZmF1bHROYW1lc3BhY2VVUkksIGZhdWx0TmFtZSk7CiAgICAgICAgICAgICBpZiAoZmF1bHROYW1lcy5jb250YWlucyhmYXVsdFFOYW1lKSkgewpAQCAtNjkzLDEyICs1MDksMTIgQEAKICAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3RSZXNwb25zZSA9CiAgICAgICAgICAgICBpbmZvLnBvcnRUeXBlT3BlcmF0aW9uLmdldFN0eWxlKCkKICAgICAgICAgICAgID09IE9wZXJhdGlvblN0eWxlLlJFUVVFU1RfUkVTUE9OU0U7Ci0gICAgICAgIExpc3QgaW5wdXRQYXJ0cyA9IGdldE1lc3NhZ2VQYXJ0cyhnZXRTT0FQUmVxdWVzdEJvZHkoKSwgZ2V0SW5wdXRNZXNzYWdlKCksIHRydWUpOworICAgICAgICBMaXN0PE1lc3NhZ2VQYXJ0PiBpbnB1dFBhcnRzID0gZ2V0TWVzc2FnZVBhcnRzKGdldFNPQVBSZXF1ZXN0Qm9keSgpLCBnZXRJbnB1dE1lc3NhZ2UoKSwgdHJ1ZSk7CiAgICAgICAgIGlmKCF2YWxpZGF0ZVN0eWxlQW5kUGFydChvcGVyYXRpb24sIGlucHV0UGFydHMpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGlmKGlzUmVxdWVzdFJlc3BvbnNlKXsKLSAgICAgICAgICAgIExpc3Qgb3V0cHV0UGFydHMgPSBnZXRNZXNzYWdlUGFydHMoZ2V0U09BUFJlc3BvbnNlQm9keSgpLCBnZXRPdXRwdXRNZXNzYWdlKCksIGZhbHNlKTsKKyAgICAgICAgICAgIExpc3Q8TWVzc2FnZVBhcnQ+IG91dHB1dFBhcnRzID0gZ2V0TWVzc2FnZVBhcnRzKGdldFNPQVBSZXNwb25zZUJvZHkoKSwgZ2V0T3V0cHV0TWVzc2FnZSgpLCBmYWxzZSk7CiAgICAgICAgICAgICBpZighdmFsaWRhdGVTdHlsZUFuZFBhcnQob3BlcmF0aW9uLCBvdXRwdXRQYXJ0cykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC03MDksMTMgKzUyNSwxMiBAQAogICAgICAqIEBwYXJhbSBvcGVyYXRpb24KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIGhhcyB2YWxpZCBzdHlsZSBhbmQgcGFydAogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVN0eWxlQW5kUGFydChCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiwgTGlzdCBwYXJ0cykgeworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVN0eWxlQW5kUGFydChCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiwgTGlzdDxNZXNzYWdlUGFydD4gcGFydHMpIHsKICAgICAgICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0KICAgICAgICAgICAgIChTT0FQT3BlcmF0aW9uKSBnZXRFeHRlbnNpb25PZlR5cGUob3BlcmF0aW9uLCBTT0FQT3BlcmF0aW9uLmNsYXNzKTsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ZXIgPSBwYXJ0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IChNZXNzYWdlUGFydClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmKHBhcnQuZ2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50S2luZCgpID09IE1lc3NhZ2VQYXJ0LlNPQVBfQk9EWV9CSU5ESU5HKXsKLSAgICAgICAgICAgICAgICBpZighaXNTdHlsZUFuZFBhcnRNYXRjaChzb2FwT3BlcmF0aW9uLCBwYXJ0KSkKKyAgICAgICAgZm9yIChNZXNzYWdlUGFydCBwYXJ0IDogcGFydHMpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0LmdldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudEtpbmQoKSA9PSBNZXNzYWdlUGFydC5TT0FQX0JPRFlfQklORElORykgeworICAgICAgICAgICAgICAgIGlmICghaXNTdHlsZUFuZFBhcnRNYXRjaChzb2FwT3BlcmF0aW9uLCBwYXJ0KSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03MzgsOTQgKzU1MywyNiBAQAogICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICogQHJldHVybiBMaXN0IG9mIE1pbWVDb250ZW50cyBmcm9tIGV4dAogICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0PE1JTUVDb250ZW50PiBnZXRNaW1lQ29udGVudHMoRXh0ZW5zaWJsZSBleHQsIE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgSXRlcmF0b3IgbWltZVBhcnRzID0gZ2V0TWltZVBhcnRzKGV4dCk7Ci0gICAgICAgIHdoaWxlKG1pbWVQYXJ0cy5oYXNOZXh0KCkpewotICAgICAgICAgICAgTUlNRVBhcnQgbWltZVBhcnQgPSAoTUlNRVBhcnQpbWltZVBhcnRzLm5leHQoKTsKKyAgICBwcm90ZWN0ZWQgTGlzdDxNSU1FQ29udGVudD4gZ2V0TWltZUNvbnRlbnRzKFRXU0RMRXh0ZW5zaWJsZSBleHQsIE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChNSU1FUGFydCBtaW1lUGFydCA6IGdldE1pbWVQYXJ0cyhleHQpKSB7CiAgICAgICAgICAgICBMaXN0PE1JTUVDb250ZW50PiBtaW1lQ29udGVudHMgPSBnZXRNaW1lQ29udGVudHMobWltZVBhcnQpOwotICAgICAgICAgICAgZm9yKE1JTUVDb250ZW50IG1pbWVDb250ZW50Om1pbWVDb250ZW50cyl7Ci0gICAgICAgICAgICAgICAgaWYobWltZUNvbnRlbnQuZ2V0UGFydCgpLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIGZvciAoTUlNRUNvbnRlbnQgbWltZUNvbnRlbnQgOiBtaW1lQ29udGVudHMpIHsKKyAgICAgICAgICAgICAgICBpZiAobWltZUNvbnRlbnQuZ2V0UGFydCgpLmVxdWFscyhuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pbWVDb250ZW50czsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgUHJvY2Vzc29yRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBfZW52OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdhcm4oTG9jYWxpemFibGUgbXNnKSB7Ci0gICAgICAgIGdldEVudmlyb25tZW50KCkud2Fybihtc2cpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdhcm4oU3RyaW5nIGtleSkgewotICAgICAgICBnZXRFbnZpcm9ubWVudCgpLndhcm4oX21lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5KSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FybihTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIGdldEVudmlyb25tZW50KCkud2FybihfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXksIGFyZykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGVycm9yKFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLSAgICAgICAgZ2V0RW52aXJvbm1lbnQoKS5lcnJvcihfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXksIGFyZykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdhcm4oU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotICAgICAgICBnZXRFbnZpcm9ubWVudCgpLndhcm4oX21lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5LCBhcmdzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5mbyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIGdldEVudmlyb25tZW50KCkuaW5mbyhfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXkpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbmZvKFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLSAgICAgICAgZ2V0RW52aXJvbm1lbnQoKS5pbmZvKF9tZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSwgYXJnKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYWtlUGFja2FnZVF1YWxpZmllZChTdHJpbmcgcywgUU5hbWUgbmFtZSkgewotICAgICAgICByZXR1cm4gbWFrZVBhY2thZ2VRdWFsaWZpZWQocywgbmFtZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYWtlUGFja2FnZVF1YWxpZmllZCgKLSAgICAgICAgU3RyaW5nIHMsCi0gICAgICAgIFFOYW1lIG5hbWUsCi0gICAgICAgIGJvb2xlYW4gdXNlTmFtZXNwYWNlTWFwcGluZykgewotICAgICAgICBTdHJpbmcgamF2YVBhY2thZ2VOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHVzZU5hbWVzcGFjZU1hcHBpbmcpIHsKLSAgICAgICAgICAgIGphdmFQYWNrYWdlTmFtZSA9IGdldEphdmFQYWNrYWdlTmFtZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YVBhY2thZ2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhUGFja2FnZU5hbWUgKyAiLiIgKyBzOwotICAgICAgICB9IGVsc2UgaWYgKAotICAgICAgICAgICAgX21vZGVsSW5mby5nZXRKYXZhUGFja2FnZU5hbWUoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgIV9tb2RlbEluZm8uZ2V0SmF2YVBhY2thZ2VOYW1lKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgcmV0dXJuIF9tb2RlbEluZm8uZ2V0SmF2YVBhY2thZ2VOYW1lKCkgKyAiLiIgKyBzOworICAgIHByb3RlY3RlZCBTdHJpbmcgbWFrZVBhY2thZ2VRdWFsaWZpZWQoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKG9wdGlvbnMuZGVmYXVsdFBhY2thZ2UgIT0gbnVsbAorICAgICAgICAgICAgJiYgIW9wdGlvbnMuZGVmYXVsdFBhY2thZ2UuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFBhY2thZ2UgKyAiLiIgKyBzOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgUU5hbWUgbWFrZVBhY2thZ2VRdWFsaWZpZWQoUU5hbWUgbmFtZSkgewotICAgICAgICByZXR1cm4gbWFrZVBhY2thZ2VRdWFsaWZpZWQobmFtZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFFOYW1lIG1ha2VQYWNrYWdlUXVhbGlmaWVkKAotICAgICAgICBRTmFtZSBuYW1lLAotICAgICAgICBib29sZWFuIHVzZU5hbWVzcGFjZU1hcHBpbmcpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgKLSAgICAgICAgICAgIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICBtYWtlUGFja2FnZVF1YWxpZmllZChuYW1lLmdldExvY2FsUGFydCgpLCBuYW1lKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYWtlTmFtZVVuaXF1ZUluU2V0KFN0cmluZyBjYW5kaWRhdGVOYW1lLCBTZXQgbmFtZXMpIHsKLSAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gY2FuZGlkYXRlTmFtZTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBiYXNlTmFtZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDI7IG5hbWVzLmNvbnRhaW5zKG5hbWUpOyArK2kpIHsKLSAgICAgICAgICAgIG5hbWUgPSBiYXNlTmFtZSArIEludGVnZXIudG9TdHJpbmcoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQogCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVOYW1lKAogICAgICAgICBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuT3BlcmF0aW9uIG9wZXJhdGlvbiwKQEAgLTgzNyw1MiArNTg0LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVuaXF1ZVBhcmFtZXRlck5hbWUoCi0gICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgICAgIFN0cmluZyBiYXNlTmFtZSkgewotICAgICAgICBTZXQgbmFtZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcGVyYXRpb24uZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcCA9IChQYXJhbWV0ZXIpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBuYW1lcy5hZGQocC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9wZXJhdGlvbi5nZXRSZXNwb25zZSgpLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcCA9IChQYXJhbWV0ZXIpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBuYW1lcy5hZGQocC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjYW5kaWRhdGVOYW1lID0gYmFzZU5hbWU7Ci0gICAgICAgIHdoaWxlIChuYW1lcy5jb250YWlucyhjYW5kaWRhdGVOYW1lKSkgewotICAgICAgICAgICAgY2FuZGlkYXRlTmFtZSArPSAiX3ByaW1lIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuZGlkYXRlTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vblF1YWxpZmllZE5hbWVGb3IoUU5hbWUgbmFtZSkgewotICAgICAgICByZXR1cm4gX2Vudi5nZXROYW1lcygpLnZhbGlkSmF2YUNsYXNzTmFtZShuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0RG9jdW1lbnRhdGlvbklmUHJlc2VudCgKLSAgICAgICAgTW9kZWxPYmplY3Qgb2JqLAotICAgICAgICBEb2N1bWVudGF0aW9uIGRvY3VtZW50YXRpb24pIHsKLSAgICAgICAgaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCAmJiBkb2N1bWVudGF0aW9uLmdldENvbnRlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvYmouc2V0UHJvcGVydHkoV1NETF9ET0NVTUVOVEFUSU9OLCBkb2N1bWVudGF0aW9uLmdldENvbnRlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcm90ZWN0ZWQgc3RhdGljIFFOYW1lIGdldFFOYW1lT2YoR2xvYmFsbHlLbm93biBlbnRpdHkpIHsKICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgKICAgICAgICAgICAgIGVudGl0eS5nZXREZWZpbmluZygpLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpLAogICAgICAgICAgICAgZW50aXR5LmdldE5hbWUoKSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBFeHRlbnNpb24gZ2V0RXh0ZW5zaW9uT2ZUeXBlKAotICAgICAgICAgICAgRXh0ZW5zaWJsZSBleHRlbnNpYmxlLAorICAgIHByb3RlY3RlZCBzdGF0aWMgVFdTRExFeHRlbnNpb24gZ2V0RXh0ZW5zaW9uT2ZUeXBlKAorICAgICAgICAgICAgVFdTRExFeHRlbnNpYmxlIGV4dGVuc2libGUsCiAgICAgICAgICAgICBDbGFzcyB0eXBlKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVuc2libGUuZXh0ZW5zaW9ucygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24gPSAoRXh0ZW5zaW9uKWl0ZXIubmV4dCgpOworICAgICAgICBmb3IgKFRXU0RMRXh0ZW5zaW9uIGV4dGVuc2lvbjpleHRlbnNpYmxlLmV4dGVuc2lvbnMoKSkgewogICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRDbGFzcygpLmVxdWFscyh0eXBlKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnNpb247CiAgICAgICAgICAgICB9CkBAIC04OTEsMzAgKzYwMiwyMiBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uIGdldEFueUV4dGVuc2lvbk9mVHlwZSgKLSAgICAgICAgRXh0ZW5zaWJsZSBleHRlbnNpYmxlLAorICAgIHByb3RlY3RlZCBUV1NETEV4dGVuc2lvbiBnZXRBbnlFeHRlbnNpb25PZlR5cGUoCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBleHRlbnNpYmxlLAogICAgICAgICBDbGFzcyB0eXBlKSB7CiAgICAgICAgIGlmKGV4dGVuc2libGUgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpYmxlLmV4dGVuc2lvbnMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0gKEV4dGVuc2lvbilpdGVyLm5leHQoKTsKKyAgICAgICAgZm9yIChUV1NETEV4dGVuc2lvbiBleHRlbnNpb246ZXh0ZW5zaWJsZS5leHRlbnNpb25zKCkpIHsKICAgICAgICAgICAgIGlmKGV4dGVuc2lvbi5nZXRDbGFzcygpLmVxdWFscyh0eXBlKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnNpb247CiAgICAgICAgICAgICB9ZWxzZSBpZiAoZXh0ZW5zaW9uLmdldENsYXNzKCkuZXF1YWxzKE1JTUVNdWx0aXBhcnRSZWxhdGVkLmNsYXNzKSAmJgogICAgICAgICAgICAgICAgICAgICAodHlwZS5lcXVhbHMoU09BUEJvZHkuY2xhc3MpIHx8IHR5cGUuZXF1YWxzKE1JTUVDb250ZW50LmNsYXNzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuZXF1YWxzKE1JTUVQYXJ0LmNsYXNzKSkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHBhcnRzID0KLSAgICAgICAgICAgICAgICAgICAgKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0ZW5zaW9uKS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgIHBhcnRzLmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIHBhcnQgPSAoRXh0ZW5zaW9uKSBwYXJ0cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmdldENsYXNzKCkuZXF1YWxzKE1JTUVQYXJ0LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTUlNRVBhcnQgbVBhcnQgPSAoTUlNRVBhcnQpcGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYnVnIGZpeDogNTAyNDAwMQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGV4dG4gPSAgZ2V0RXh0ZW5zaW9uT2ZUeXBlKChFeHRlbnNpYmxlKSBwYXJ0LCB0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV4dG4gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0bjsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoTUlNRVBhcnQgcGFydCA6ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpZXh0ZW5zaW9uKS5nZXRQYXJ0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vYnVnIGZpeDogNTAyNDAwMQorICAgICAgICAgICAgICAgICAgICBUV1NETEV4dGVuc2lvbiBleHRuID0gZ2V0RXh0ZW5zaW9uT2ZUeXBlKHBhcnQsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0biAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dG47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05NjUsMjAgKzY2OCw2IEBACiAgICAgICAgIHJldHVybiB1bmlxdWVOYW1lOwogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEphdmFQYWNrYWdlTmFtZShRTmFtZSBuYW1lKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0vKiAgICAgICAgaWYgKF9tb2RlbEluZm8uZ2V0TmFtZXNwYWNlTWFwcGluZ1JlZ2lzdHJ5KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgTmFtZXNwYWNlTWFwcGluZ0luZm8gaSA9Ci0gICAgICAgICAgICAgICAgX21vZGVsSW5mbwotICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZXNwYWNlTWFwcGluZ1JlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldE5hbWVzcGFjZU1hcHBpbmdJbmZvKAotICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgIGlmIChpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGkuZ2V0SmF2YVBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIH0qLwotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7Ci0gICAgfQotCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25mbGljdGluZ0NsYXNzTmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAoX2NvbmZsaWN0aW5nQ2xhc3NOYW1lcyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDA3LDEwICs2OTYsMjggQEAKICAgICAgICAgcmV0dXJuIGlzQ29uZmxpY3RpbmdDbGFzc05hbWUobmFtZSk7CiAgICAgfQogCisgICAgaW50IG51bVBhc3NlcyA9IDA7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3YXJuaW5nKEVudGl0eSBlbnRpdHksIFN0cmluZyBtZXNzYWdlKXsKKyAgICAgICAgLy9hdm9pZCBkdXBsaWNhdGUgd2FybmluZyBmb3IgdGhlIHNlY29uZCBwYXNzCisgICAgICAgIGlmKG51bVBhc3NlcyA+IDEpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmKGVudGl0eSA9PSBudWxsKQorICAgICAgICAgICAgZXJyUmVjZWl2ZXIud2FybmluZyhOVUxMX0xPQ0FUT1IsIG1lc3NhZ2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJSZWNlaXZlci53YXJuaW5nKGVudGl0eS5nZXRMb2NhdG9yKCksIG1lc3NhZ2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVycm9yKEVudGl0eSBlbnRpdHksIFN0cmluZyBtZXNzYWdlKXsKKyAgICAgICAgaWYoZW50aXR5ID09IG51bGwpCisgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihOVUxMX0xPQ0FUT1IsIG1lc3NhZ2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihlbnRpdHkuZ2V0TG9jYXRvcigpLCBtZXNzYWdlKTsKKyAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX0hBU19WT0lEX1JFVFVSTl9UWVBFID0KICAgICAgICAgImNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLndzZGwub3BlcmF0aW9uSGFzVm9pZFJldHVyblR5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0RPQ1VNRU5UQVRJT04gPQotICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbC5kb2N1bWVudGF0aW9uIjsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1BBUkFNRVRFUl9PUkRFUiA9CiAgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci53c2RsLnBhcmFtZXRlck9yZGVyIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1JFU1VMVF9QQVJBTUVURVIgPQpAQCAtMTAxOSwyMyArNzI2LDE3IEBACiAgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci53c2RsLm1pbWVNdWx0aXBhcnRSZWxhdGVkQmluZGluZyI7CiAKIAotICAgIHB1YmxpYyBQcm9jZXNzb3JFbnZpcm9ubWVudCBnZXRQcm9jZXNzb3JFbnZpcm9ubWVudCgpewotICAgICAgICByZXR1cm4gX2VudjsKLSAgICB9CiAgICAgcHJvdGVjdGVkIFByb2Nlc3NTT0FQT3BlcmF0aW9uSW5mbyBpbmZvOwogCi0gICAgcHJvdGVjdGVkIFdTRExNb2RlbEluZm8gX21vZGVsSW5mbzsKLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBfb3B0aW9uczsKLSAgICBwcm90ZWN0ZWQgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBfbWVzc2FnZUZhY3Rvcnk7CiAgICAgcHJpdmF0ZSBTZXQgX2NvbmZsaWN0aW5nQ2xhc3NOYW1lczsKLSAgICBwcm90ZWN0ZWQgTWFwIF9qYXZhRXhjZXB0aW9uczsKKyAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZyxKYXZhRXhjZXB0aW9uPiBfamF2YUV4Y2VwdGlvbnM7CiAgICAgcHJvdGVjdGVkIE1hcCBfZmF1bHRUeXBlVG9TdHJ1Y3R1cmVNYXA7Ci0gICAgcHJpdmF0ZSBQcm9jZXNzb3JFbnZpcm9ubWVudCBfZW52OwogICAgIHByb3RlY3RlZCBKYXZhU2ltcGxlVHlwZUNyZWF0b3IgX2phdmFUeXBlczsKICAgICBwcm90ZWN0ZWQgTWFwPFFOYW1lLCBQb3J0PiBfYmluZGluZ05hbWVUb1BvcnRNYXA7CiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlV1NJQmFzaWNQcm9maWxlID0gdHJ1ZTsKIAotICAgIHByaXZhdGUgU2V0IHJlcVJlc05hbWVzOworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gcmVxUmVzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKICAgICBwdWJsaWMgY2xhc3MgUHJvY2Vzc1NPQVBPcGVyYXRpb25JbmZvIHsKIAogICAgICAgICBwdWJsaWMgUHJvY2Vzc1NPQVBPcGVyYXRpb25JbmZvKApAQCAtMTA3NywxMCArNzc4LDEwIEBACiAgICAgICAgIHB1YmxpYyBTdHJpbmcgd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKICAgICAgICAgcHVibGljIEhhc2hNYXAgY29uc3RydWN0b3JPcmRlcjsgLy8gbWFwcGluZyBvZiBlbGVtZW50IG5hbWUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yIG9yZGVyIChvZiB0eXBlIEludGVnZXIpCi0gICAgfTsKKyAgICB9CiAKIAogICAgIHByb3RlY3RlZCBXU0RMUGFyc2VyIHBhcnNlcjsKICAgICBwcm90ZWN0ZWQgV1NETERvY3VtZW50IGRvY3VtZW50OwotICAgIHByb3RlY3RlZCBIYXNoU2V0IGhTZXQ7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2NhdG9ySW1wbCBOVUxMX0xPQ0FUT1IgPSBuZXcgTG9jYXRvckltcGwoKTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL3V0aWwvQ2xhc3NOYW1lQ29sbGVjdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL0NsYXNzTmFtZUNvbGxlY3Rvci5qYXZhCmluZGV4IDljNzVlNzkuLjQ3MDhiMDYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL3V0aWwvQ2xhc3NOYW1lQ29sbGVjdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvdXRpbC9DbGFzc05hbWVDb2xsZWN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyNiArMjUsMTYgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuQWJzdHJhY3RUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkJsb2NrOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkV4dGVuZGVkTW9kZWxWaXNpdG9yOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLkZhdWx0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk1vZGVsOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLk1vZGVsUHJvcGVydGllczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5QYXJhbWV0ZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuUG9ydDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLio7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhSW50ZXJmYWNlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsLmpheGIuSkFYQlR5cGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5KQVhCVHlwZVZpc2l0b3I7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF4Yi5ScGNMaXRTdHJ1Y3R1cmU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuamF2YS5KYXZhSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuVmVyc2lvblV0aWw7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIFRoaXMgY2xhc3Mgd3JpdGVzIG91dCBhIE1vZGVsIGFzIGFuIFhNTCBkb2N1bWVudC4KQEAgLTIzOCw3ICsyMjgsNyBAQAogICAgIHByaXZhdGUgU2V0PFN0cmluZz4gX2V4Y2VwdGlvbkNsYXNzTmFtZXM7CiAgICAgYm9vbGVhbiBkb25lVmlzaXRpbmdKQVhCTW9kZWwgPSBmYWxzZTsKICAgICBwdWJsaWMgdm9pZCB2aXNpdChKQVhCVHlwZSB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYoIWRvbmVWaXNpdGluZ0pBWEJNb2RlbCl7CisgICAgICAgIGlmKCFkb25lVmlzaXRpbmdKQVhCTW9kZWwgJiYgdHlwZS5nZXRKYXhiTW9kZWwoKSAhPSBudWxsKXsKICAgICAgICAgICAgIFNldDxTdHJpbmc+IGNsYXNzTmFtZXMgPSB0eXBlLmdldEpheGJNb2RlbCgpLmdldEdlbmVyYXRlZENsYXNzTmFtZXMoKTsKICAgICAgICAgICAgIGZvcihTdHJpbmcgY2xhc3NOYW1lIDogY2xhc3NOYW1lcyl7CiAgICAgICAgICAgICAgICAgYWRkSkFYQkdlbmVyYXRlZENsYXNzTmFtZShjbGFzc05hbWUpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvdXRpbC9DbGllbnRQcm9jZXNzb3JFbnZpcm9ubWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvdXRpbC9DbGllbnRQcm9jZXNzb3JFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGFkMDIzLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL3V0aWwvQ2xpZW50UHJvY2Vzc29yRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3Nvck5vdGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5OYW1lczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWwuSkFYV1NDbGFzc0ZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50UHJvY2Vzc29yRW52aXJvbm1lbnQgZXh0ZW5kcyBQcm9jZXNzb3JFbnZpcm9ubWVudEJhc2UKLSAgICBpbXBsZW1lbnRzIFByb2Nlc3NvckVudmlyb25tZW50IHsKLQotICAgIC8qKgotICAgICAqIFRoZSBzdHJlYW0gd2hlcmUgZXJyb3IgbWVzc2FnZSBhcmUgcHJpbnRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBBIHByaW50d3JpdGVyIGNyZWF0ZWQgbGF6aWx5IGluIGNhc2UgdGhlcmUgYXJlIGV4Y2VwdGlvbnMgdG8gcmVwb3J0LgotICAgICAqLwotICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gb3V0cHJpbnRzdHJlYW07Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0ZW5lciBmb3IgZXJyb3Ivd2FybmluZy9pbmZvIG5vdGlmaWNhdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb2Nlc3Nvck5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzcGF0aCB0byB1c2UKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc1BhdGg7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgY3JlYXRlZCBpbiB0aGlzIGVudmlyb25tZW50IGFuZAotICAgICAqIGl0cyB0eXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGdlbmVyYXRlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbndhcm5pbmdzOwotICAgIHByaXZhdGUgaW50IG5lcnJvcnM7Ci0KLSAgICAvKioKLSAgICAgKiBmbGFncwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGZsYWdzOwotCi0gICAgcHJpdmF0ZSBOYW1lcyBuYW1lczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIENsaWVudFByb2Nlc3NvckVudmlyb25tZW50IHdpdGggdGhlIGdpdmVuIGNsYXNzIHBhdGgsCi0gICAgICogc3RyZWFtIGZvciBtZXNzYWdlcyBhbmQgUHJvY2Vzc29yTm90aWZpY2F0aW9uTGlzdGVuZXIuCi0gICAgICovCi0gICAgcHVibGljIENsaWVudFByb2Nlc3NvckVudmlyb25tZW50KAotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICBTdHJpbmcgY2xhc3NQYXRoLAotICAgICAgICBQcm9jZXNzb3JOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCi0gICAgICAgIHRoaXMub3V0ID0gb3V0OwotICAgICAgICB0aGlzLmNsYXNzUGF0aCA9IGNsYXNzUGF0aDsKLSAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICBmbGFncyA9IDA7Ci0KLSAgICAgICAgLy9idWcgZml4OjQ5MDQ2MDQKLSAgICAgICAgbmFtZXMgPSBKQVhXU0NsYXNzRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU5hbWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBlbnZpcm9ubWVudCBmbGFncwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZsYWdzKGludCBmbGFncykgewotICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBlbnZpcm9ubWVudCBmbGFncwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBmbGFnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIENsYXNzUGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB2ZXJib3NlIHR1cm5lZCBvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHZlcmJvc2UoKSB7Ci0gICAgICAgIHJldHVybiAoZmxhZ3MgJiBGX1ZFUkJPU0UpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtZW1iZXIgaW5mbyBvbiAgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlIGdlbmVyYXRlZCBzbyB0aGF0IGl0Ci0gICAgICogY2FuIGJlIHJlbW92ZWQgbGF0ZXIsIGlmIGFwcHJvcHJpYXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEdlbmVyYXRlZEZpbGUoR2VuZXJhdGVkRmlsZUluZm8gZmlsZSkgewotICAgICAgICBnZW5lcmF0ZWRGaWxlcy5hZGQoZmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCB0aGUgZ2VuZXJhdGVkIGZpbGVzIGFuZCBpdHMgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEdlbmVyYXRlZEZpbGVzKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkRmlsZXMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgYWxsIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIG1hZGUgZHVyaW5nIHRoZSBleGVjdXRpb24KLSAgICAgKiBvZiB0aGlzIGVudmlyb25tZW50ICh0aG9zZSB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlCi0gICAgICogImFkZEdlbmVyYXRlZEZpbGUiIG1ldGhvZCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlR2VuZXJhdGVkRmlsZXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoZ2VuZXJhdGVkRmlsZXMpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZW5lcmF0ZWRGaWxlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gKChHZW5lcmF0ZWRGaWxlSW5mbylpdGVyLm5leHQoKSkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphdmEiKSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdlbmVyYXRlZEZpbGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHJlc291cmNlcywgaWYgYW55LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotICAgICAgICBsaXN0ZW5lciA9IG51bGw7Ci0gICAgICAgIGdlbmVyYXRlZEZpbGVzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihMb2NhbGl6YWJsZSBtc2cpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLm9uRXJyb3IobXNnKTsKLSAgICAgICAgfQotICAgICAgICBuZXJyb3JzKys7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2FybihMb2NhbGl6YWJsZSBtc2cpIHsKLSAgICAgICAgaWYgKHdhcm5pbmdzKCkpIHsKLSAgICAgICAgICAgIG53YXJuaW5ncysrOwotICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbldhcm5pbmcobXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluZm8oTG9jYWxpemFibGUgbXNnKSB7Ci0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci5vbkluZm8obXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShUaHJvd2FibGUgdCkgewotICAgICAgICBpZiAob3V0cHJpbnRzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0cHJpbnRzdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0ob3V0KTsKLSAgICAgICAgfQotICAgICAgICB0LnByaW50U3RhY2tUcmFjZShvdXRwcmludHN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzIGdldE5hbWVzKCkgewotICAgICAgICByZXR1cm4gbmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotICAgICAgICByZXR1cm4gbmVycm9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdhcm5pbmdDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG53YXJuaW5nczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gd2FybmluZ3MoKSB7Ci0gICAgICAgIHJldHVybiAoZmxhZ3MgJiBGX1dBUk5JTkdTKSAhPSAwOwotICAgIH0KLQotICAgIC8vYnVnIGZpeDo0OTA0NjA0Ci0gICAgLy90byBjYWxsZWQgaW4gY29tcGlsZVRvb2wgYWZ0ZXIgZW52IGlzCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXMoTmFtZXMgbmFtZXMpIHsKLSAgICAgICAgdGhpcy5uYW1lcyA9IG5hbWVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvdXRpbC9EaXJlY3RvcnlVdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL0RpcmVjdG9yeVV0aWwuamF2YQppbmRleCAzYTllMDc5Li40ZDVmMjFjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL0RpcmVjdG9yeVV0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL0RpcmVjdG9yeVV0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMSArMjUsMTEgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLkdlbmVyYXRvckV4Y2VwdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWwuQ2xhc3NOYW1lSW5mbzsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKKwogLyoqCiAgKiBVdGlsIHByb3ZpZGVzIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgdXNlZCBieSBvdGhlciB3c2NvbXBpbGUgY2xhc3Nlcy4KICAqCkBAIC0zNyw4ICszNyw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBEaXJlY3RvcnlVdGlsICB7CiAKLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5Rm9yKFN0cmluZyB0aGVDbGFzcywKLSAgICAgICAgRmlsZSByb290RGlyLCBQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpIHRocm93cyBHZW5lcmF0b3JFeGNlcHRpb24geworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnlGb3IoU3RyaW5nIHRoZUNsYXNzLCBGaWxlIHJvb3REaXIpIHRocm93cyBHZW5lcmF0b3JFeGNlcHRpb24gewogCiAgICAgICAgIEZpbGUgb3V0cHV0RGlyID0gbnVsbDsKICAgICAgICAgU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9IHRoZUNsYXNzOwpAQCAtNTgsNyArNTcsNyBAQAogICAgICAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKHJvb3REaXIsIHBhY2thZ2VQYXRoKTsKIAogICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4uLgotICAgICAgICAgICAgICAgIGVuc3VyZURpcmVjdG9yeShvdXRwdXREaXIsZW52KTsKKyAgICAgICAgICAgICAgICBlbnN1cmVEaXJlY3Rvcnkob3V0cHV0RGlyKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAKICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHBhY2thZ2UsIHNvIHVzZSByb290IGFzIG91dHB1dCBkaXIuLi4KQEAgLTgxLDcgKzgwLDcgQEAKICAgICAgICAgICAgICAgICBvdXRwdXREaXIgPSBuZXcgRmlsZSh3b3JraW5nRGlyLCBwYWNrYWdlUGF0aCk7CiAKICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuLi4KLSAgICAgICAgICAgICAgICBlbnN1cmVEaXJlY3Rvcnkob3V0cHV0RGlyLGVudik7CisgICAgICAgICAgICAgICAgZW5zdXJlRGlyZWN0b3J5KG91dHB1dERpcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtODksNyArODgsNyBAQAogICAgICAgICByZXR1cm4gb3V0cHV0RGlyOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5zdXJlRGlyZWN0b3J5KEZpbGUgZGlyLCBQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbnN1cmVEaXJlY3RvcnkoRmlsZSBkaXIpCiAgICAgICAgIHRocm93cyBHZW5lcmF0b3JFeGNlcHRpb24gewogCiAgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL0dlbmVyYXRlZEZpbGVJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL0dlbmVyYXRlZEZpbGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmNjOTYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvdXRpbC9HZW5lcmF0ZWRGaWxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEEgY29udGFpbmVyIHRvIGhvbGQgaW5mbyBvbiB0aGUgZmlsZXMgdGhhdCBnZXQKLSAqIGdlbmVyYXRlZC4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlZEZpbGVJbmZvIHsKLQotICAgIC8qKgotICAgICAqIGxvY2FsIHZhcmlhYmxlcwotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBmaWxlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKLQotICAgIC8qIGNvbnN0cnVjdG9yICovCi0gICAgcHVibGljIEdlbmVyYXRlZEZpbGVJbmZvKCkge30KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGZpbGUgb2JqZWN0IHRvIHRoZSBjb250YWluZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIGluc3RhbmNlIG9mIHRoZSBmaWxlIHRvIGJlIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZSggRmlsZSBmaWxlICkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHR5cGUgb2YgZmlsZSBpdCBpcyB0aGUgY29udGFpbmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBzdHJpbmcgd2hpY2ggc3BlY2lmaWNlcyB0aGUgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoIFN0cmluZyB0eXBlICkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpbGUgdGhhdCBnb3QgYWRkZWQKLSAgICAgKgotICAgICAqIEByZXR1cm4gRmlsZSB0aGF0IGdvdCBhZGRlZAotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiggZmlsZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmlsZSB0eXBlIHRoYXQgZ290IGFkZGVkCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEZpbGUgdHlwZSBvZiBkYXRhdHlwZSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoIHR5cGUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL0luZGVudGluZ1dyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvdXRpbC9JbmRlbnRpbmdXcml0ZXIuamF2YQppbmRleCA5OTUzMDIzLi40YWNjNDY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL0luZGVudGluZ1dyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL3V0aWwvSW5kZW50aW5nV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTQgKzI1LDE0IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbDsKIAoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5HZW5lcmF0b3JFeGNlcHRpb247CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlcjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuR2VuZXJhdG9yRXhjZXB0aW9uOwogCiAvKioKICAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL1Byb2Nlc3NvckVudmlyb25tZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL1Byb2Nlc3NvckVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDcwNGQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9wcm9jZXNzb3IvdXRpbC9Qcm9jZXNzb3JFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5OYW1lczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5GaWxlcjsKLQotLyoqCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc29yRW52aXJvbm1lbnQgewotCi0gICAgLyoKLSAgICAgKiBGbGFncwotICAgICAqLwotICAgIGludCBGX1ZFUkJPU0UgICAgICAgPSAxIDw8IDA7Ci0gICAgaW50IEZfV0FSTklOR1MgICAgICA9IDEgPDwgMTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW52aXJvbm1lbnQgZmxhZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBlbnZpcm9ubWVudCBmbGFncwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgQ2xhc3NQYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NQYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJcyB2ZXJib3NlIHR1cm5lZCBvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHZlcmJvc2UoKTsKLQotICAgIC8qKgotICAgICAqIFJlbWVtYmVyIGEgZ2VuZXJhdGVkIGZpbGUgYW5kIGl0cyB0eXBlIHNvIHRoYXQgaXQKLSAgICAgKiBjYW4gYmUgcmVtb3ZlZCBsYXRlciwgaWYgYXBwcm9wcmlhdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkR2VuZXJhdGVkRmlsZShHZW5lcmF0ZWRGaWxlSW5mbyBmaWxlKTsKLQotICAgIHB1YmxpYyBGaWxlciBnZXRGaWxlcigpOwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVyKEZpbGVyIGZpbGVyKTsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBhbGwgdGhlIGdlbmVyYXRlZCBmaWxlcyBtYWRlIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMKLSAgICAgKiBlbnZpcm9ubWVudCAodGhvc2UgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSAiYWRkR2VuZXJhdGVkRmlsZSIKLSAgICAgKiBtZXRob2QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlR2VuZXJhdGVkRmlsZXMoKTsKLQotICAgIC8qKgotICAgICAqIEdldCBhIFVSTENsYXNzTG9hZGVyIGZyb20gdXNpbmcgdGhlIGNsYXNzcGF0aAotICAgICAqLwotICAgIHB1YmxpYyBVUkxDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpOwotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEdlbmVyYXRlZEZpbGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHJlc291cmNlcywgaWYgYW55LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihMb2NhbGl6YWJsZSBtc2cpOwotCi0gICAgcHVibGljIHZvaWQgd2FybihMb2NhbGl6YWJsZSBtc2cpOwotCi0gICAgcHVibGljIHZvaWQgaW5mbyhMb2NhbGl6YWJsZSBtc2cpOwotCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFRocm93YWJsZSB0KTsKLQotICAgIHB1YmxpYyBOYW1lcyBnZXROYW1lcygpOwotCi0gICAgcHVibGljIGludCBnZXRFcnJvckNvdW50KCk7Ci0gICAgcHVibGljIGludCBnZXRXYXJuaW5nQ291bnQoKTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL3V0aWwvUHJvY2Vzc29yRW52aXJvbm1lbnRCYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Byb2Nlc3Nvci91dGlsL1Byb2Nlc3NvckVudmlyb25tZW50QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTVkOTIzLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcHJvY2Vzc29yL3V0aWwvUHJvY2Vzc29yRW52aXJvbm1lbnRCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5GaWxlcjsKLQotLyoqCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzb3JFbnZpcm9ubWVudEJhc2UgaW1wbGVtZW50cyBQcm9jZXNzb3JFbnZpcm9ubWVudCB7Ci0KLSAgICBwcm90ZWN0ZWQgVVJMQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotICAgIHByb3RlY3RlZCBGaWxlciBmaWxlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBVUkxDbGFzc0xvYWRlciBmcm9tIHVzaW5nIHRoZSBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIGlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc0xvYWRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFVSTENsYXNzTG9hZGVyKHBhdGhUb1VSTHMoZ2V0Q2xhc3NQYXRoKCkpLAotICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciBjb252ZXJ0aW5nIGEgc2VhcmNoIHBhdGggc3RyaW5nIHRvIGFuIGFycmF5Ci0gICAgICogb2YgZGlyZWN0b3J5IGFuZCBKQVIgZmlsZSBVUkxzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHNlYXJjaCBwYXRoIHN0cmluZwotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBhcnJheSBvZiBkaXJlY3RvcnkgYW5kIEpBUiBmaWxlIFVSTHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFVSTFtdIHBhdGhUb1VSTHMoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCBGaWxlLnBhdGhTZXBhcmF0b3IpOwotICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFtzdC5jb3VudFRva2VucygpXTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgVVJMIHVybCA9IGZpbGVUb1VSTChuZXcgRmlsZShzdC5uZXh0VG9rZW4oKSkpOwotICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXJsc1tjb3VudCsrXSA9IHVybDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodXJscy5sZW5ndGggIT0gY291bnQpIHsKLSAgICAgICAgICAgIFVSTFtdIHRtcCA9IG5ldyBVUkxbY291bnRdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh1cmxzLCAwLCB0bXAsIDAsIGNvdW50KTsKLSAgICAgICAgICAgIHVybHMgPSB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVybHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG9yIEpBUiBmaWxlIFVSTCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBsb2NhbCBmaWxlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgRmlsZSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgZGlyZWN0b3J5IG9yIEpBUiBmaWxlIFVSTCwgb3IgbnVsbCBpZiB1bmtub3duCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBVUkwgZmlsZVRvVVJMKEZpbGUgZmlsZSkgewotICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hbWUgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbmFtZSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0gICAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIG5hbWUgPSAiLyIgKyBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gYXNzdW1lIHRoYXQgaXQncyBhIGRpcmVjdG9yeQotICAgICAgICBpZiAoIWZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgIi8iOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSTCgiZmlsZSIsICIiLCBuYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlciBnZXRGaWxlcigpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVyKEZpbGVyIGZpbGVyKSB7Ci0gICAgICAgIHRoaXMuZmlsZXIgPSBmaWxlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9Db25maWd1cmF0aW9uTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0NvbmZpZ3VyYXRpb25NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjN2Q3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9Db25maWd1cmF0aW9uTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ3VyYXRpb25NZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLmNvbmZpZ3VyYXRpb24iKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6ZXIgbG9jYWxpemVyID0gbmV3IExvY2FsaXplcigpOworCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUNPTkZJR1VSQVRJT05fSU5WQUxJRF9FTEVNRU5UKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImNvbmZpZ3VyYXRpb24uaW52YWxpZEVsZW1lbnQiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIGVsZW1lbnQgInsyfSIgaW4gZmlsZSAiezB9IiAobGluZSB7MX0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05GSUdVUkFUSU9OX0lOVkFMSURfRUxFTUVOVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVDT05GSUdVUkFUSU9OX0lOVkFMSURfRUxFTUVOVChhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUNPTkZJR1VSQVRJT05fTk9UX0JJTkRJTkdfRklMRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiY29uZmlndXJhdGlvbi5ub3RCaW5kaW5nRmlsZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yaW5nOiBiaW5kaW5nIGZpbGUgIiJ7MH0iLiBJdCBpcyBub3QgYSBqYXh3cyBvciBhIGpheGIgYmluZGluZyBmaWxlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09ORklHVVJBVElPTl9OT1RfQklORElOR19GSUxFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVDT05GSUdVUkFUSU9OX05PVF9CSU5ESU5HX0ZJTEUoYXJnMCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvR2VuZXJhdG9yTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0dlbmVyYXRvck1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4ZmRlMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0dlbmVyYXRvck1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXM7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKKworCisvKioKKyAqIERlZmluZXMgc3RyaW5nIGZvcm1hdHRpbmcgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGluIHRoZSByZXNvdXJjZSBmaWxlCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJhdG9yTWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5nZW5lcmF0b3IiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6ZXIgbG9jYWxpemVyID0gbmV3IExvY2FsaXplcigpOworCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUdFTkVSQVRPUl9ORVNURURfR0VORVJBVE9SX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJnZW5lcmF0b3IubmVzdGVkR2VuZXJhdG9yRXJyb3IiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZW5lcmF0b3IgZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgR0VORVJBVE9SX05FU1RFRF9HRU5FUkFUT1JfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUdFTkVSQVRPUl9ORVNURURfR0VORVJBVE9SX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlR0VORVJBVE9SX0lOVEVSTkFMX0VSUk9SX1NIT1VMRF9OT1RfSEFQUEVOKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJnZW5lcmF0b3IuaW50ZXJuYWwuZXJyb3Iuc2hvdWxkLm5vdC5oYXBwZW4iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnRlcm5hbCBlcnJvciAoc2hvdWxkIG5vdCBoYXBwZW4pOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRPUl9JTlRFUk5BTF9FUlJPUl9TSE9VTERfTk9UX0hBUFBFTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlR0VORVJBVE9SX0lOVEVSTkFMX0VSUk9SX1NIT1VMRF9OT1RfSEFQUEVOKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlR0VORVJBVE9SX0lOREVOVElOR1dSSVRFUl9DSEFSU0VUX0NBTlRFTkNPREUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImdlbmVyYXRvci5pbmRlbnRpbmd3cml0ZXIuY2hhcnNldC5jYW50ZW5jb2RlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NETCBoYXMgc29tZSBjaGFyYWN0ZXJzIHdoaWNoIG5hdGl2ZSBqYXZhIGVuY29kZXIgY2FuJyd0IGVuY29kZTogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRPUl9JTkRFTlRJTkdXUklURVJfQ0hBUlNFVF9DQU5URU5DT0RFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVHRU5FUkFUT1JfSU5ERU5USU5HV1JJVEVSX0NIQVJTRVRfQ0FOVEVOQ09ERShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUdFTkVSQVRPUl9DQU5OT1RfQ1JFQVRFX0RJUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZ2VuZXJhdG9yLmNhbm5vdC5jcmVhdGUuZGlyIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2FuJyd0IGNyZWF0ZSBkaXJlY3Rvcnk6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgR0VORVJBVE9SX0NBTk5PVF9DUkVBVEVfRElSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVHRU5FUkFUT1JfQ0FOTk9UX0NSRUFURV9ESVIoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVHRU5FUkFUT1JfQ0FOVF9XUklURShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZ2VuZXJhdG9yLmNhbnQud3JpdGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYW4nJ3Qgd3JpdGUgZmlsZTogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBHRU5FUkFUT1JfQ0FOVF9XUklURShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlR0VORVJBVE9SX0NBTlRfV1JJVEUoYXJnMCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvSmF2YWNvbXBpbGVyTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0phdmFjb21waWxlck1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1MmQxOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0phdmFjb21waWxlck1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKYXZhY29tcGlsZXJNZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLmphdmFjb21waWxlciIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSkFWQUNPTVBJTEVSX0NMQVNTUEFUSF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiamF2YWNvbXBpbGVyLmNsYXNzcGF0aC5lcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHswfSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBjbGFzc3BhdGgsIHJlcXVpcmVzIFN1bidzIEpESyB2ZXJzaW9uIDUuMCBvciBsYXR0ZXIuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBQ09NUElMRVJfQ0xBU1NQQVRIX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVKQVZBQ09NUElMRVJfQ0xBU1NQQVRIX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSkFWQUNPTVBJTEVSX05PU1VDSE1FVEhPRF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiamF2YWNvbXBpbGVyLm5vc3VjaG1ldGhvZC5lcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZXJlIGlzIG5vIHN1Y2ggbWV0aG9kIHswfSBhdmFpbGFibGUsIHJlcXVpcmVzIFN1bidzIEpESyB2ZXJzaW9uIDUuMCBvciBsYXR0ZXIuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBQ09NUElMRVJfTk9TVUNITUVUSE9EX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVKQVZBQ09NUElMRVJfTk9TVUNITUVUSE9EX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSkFWQUNPTVBJTEVSX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJqYXZhY29tcGlsZXIuZXJyb3IiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlcnJvciA6IHswfS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFDT01QSUxFUl9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSkFWQUNPTVBJTEVSX0VSUk9SKGFyZzApKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL01vZGVsTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL01vZGVsTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUyMTUzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvTW9kZWxNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1vZGVsTWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5tb2RlbCIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfRFVQTElDQVRFX1NFUlZJQ0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmR1cGxpY2F0ZS5zZXJ2aWNlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZHVwbGljYXRlIHNlcnZpY2UgYWRkZWQgdG8gbW9kZWw6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfRFVQTElDQVRFX1NFUlZJQ0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0RVUExJQ0FURV9TRVJWSUNFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfTkVTVEVEX01PREVMX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5uZXN0ZWRNb2RlbEVycm9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbW9kZWwgZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfTkVTVEVEX01PREVMX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9ORVNURURfTU9ERUxfRVJST1IoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9EVVBMSUNBVEVfUE9SVFRZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmR1cGxpY2F0ZS5wb3J0dHlwZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGR1cGxpY2F0ZSBQb3J0VHlwZSBhZGRlZCB0byBtb2RlbDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9EVVBMSUNBVEVfUE9SVFRZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0RVUExJQ0FURV9QT1JUVFlQRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX0VYQ0VQVElPTl9OT1RVTklRVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5leGNlcHRpb24ubm90dW5pcXVlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbGVkIHRvIGdlbmVyYXRlIEphdmEgc2lnbmF0dXJlOiBkdXBsaWNhdGUgZXhjZXB0aW9uIG5hbWVzIHswfS4gVXNlIEpBWFdTIGJpbmRpbmcgY3VzdG9taXphdGlvbiB0byByZW5hbWUgdGhlIHdzZGw6cGFydCAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfRVhDRVBUSU9OX05PVFVOSVFVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0VYQ0VQVElPTl9OT1RVTklRVUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfSU5WQUxJRF9XSUxEQ0FSRF9BTExfQ09NUE9TSVRPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuc2NoZW1hLmludmFsaWRXaWxkY2FyZC5hbGxDb21wb3NpdG9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogeHNkOmFsbCBjb21wb3NpdG9yIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSB3aWxkY2FyZCBpbiBzY2hlbWEgdHlwZTogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9JTlZBTElEX1dJTERDQVJEX0FMTF9DT01QT1NJVE9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfSU5WQUxJRF9XSUxEQ0FSRF9BTExfQ09NUE9TSVRPUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9TSU1QTEVfVFlQRV9XSVRIX0ZBQ0VUUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuc2NoZW1hLnNpbXBsZVR5cGVXaXRoRmFjZXRzIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmFjZXQgInswfSIgbm90IHN1cHBvcnRlZCBvbiBzaW1wbGUgdHlwZTogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9TSU1QTEVfVFlQRV9XSVRIX0ZBQ0VUUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX1NJTVBMRV9UWVBFX1dJVEhfRkFDRVRTKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX1VOU1VQUE9SVEVEX1RZUEVfQU5PTllNT1VTKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5zY2hlbWEudW5zdXBwb3J0ZWRUeXBlLmFub255bW91cyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVuc3VwcG9ydGVkIGFub255bW91cyB0eXBlICh7MH0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9TQ0hFTUFfVU5TVVBQT1JURURfVFlQRV9BTk9OWU1PVVMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9VTlNVUFBPUlRFRF9UWVBFX0FOT05ZTU9VUyhhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX0NPTVBMRVhfVFlQRV9TSU1QTEVfQ09OVEVOVF9SRVNFUlZFRF9OQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5jb21wbGV4VHlwZS5zaW1wbGVDb250ZW50LnJlc2VydmVkTmFtZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgYXR0cmlidXRlIG5hbWU6ICJfdmFsdWUiIGluIGNvbXBsZXhUeXBlOiAiezB9IiwgX3ZhbHVlIGlzIEpBWFdTIHJlc2VydmVkIG5hbWUsIHRoaXMgbmFtZSBpcyBnZW5lcmF0ZWQgaW4gdGhlIGdlbmVyYXRlZCBqYXZhYmVhbiBjbGFzcyB0byBob2xkIGNvbnRlbnQgdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCBqYXZhYmVhbiBjbGFzcyBmb3IgY29tcGxleFR5cGUvc2ltcGxlQ29udGVudC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0NPTVBMRVhfVFlQRV9TSU1QTEVfQ09OVEVOVF9SRVNFUlZFRF9OQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9DT01QTEVYX1RZUEVfU0lNUExFX0NPTlRFTlRfUkVTRVJWRURfTkFNRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9VTklPTl9OT1RfU1VQUE9SVEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5zY2hlbWEudW5pb25Ob3RTdXBwb3J0ZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzaW1wbGVUeXBlOiAiezB9IiBkZXJpdmF0aW9uIGJ5IHhzZDp1bmlvbiBub3Qgc3VwcG9ydGVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9TQ0hFTUFfVU5JT05fTk9UX1NVUFBPUlRFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX1VOSU9OX05PVF9TVVBQT1JURUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfSkFYQl9FWENFUFRJT05fTUVTU0FHRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuc2NoZW1hLmpheGJFeGNlcHRpb24ubWVzc2FnZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9TQ0hFTUFfSkFYQl9FWENFUFRJT05fTUVTU0FHRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0pBWEJfRVhDRVBUSU9OX01FU1NBR0UoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9JTVBPUlRFUl9JTlZBTElEX0lEKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuaW1wb3J0ZXIuaW52YWxpZElkIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBpZCAiezF9IGluIG1vZGVsIGRvY3VtZW50IChsaW5lIHswfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0lNUE9SVEVSX0lOVkFMSURfSUQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9JTVBPUlRFUl9JTlZBTElEX0lEKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfSU5WQUxJRF9NRVNTQUdFX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmludmFsaWQubWVzc2FnZS50eXBlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBtZXNzYWdlIHR5cGU6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfSU5WQUxJRF9NRVNTQUdFX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0lOVkFMSURfTUVTU0FHRV9UWVBFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlQ09OU09MRV9FUlJPUl9SRVBPUlRFUl9VTktOT1dOX0xPQ0FUSU9OKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiQ29uc29sZUVycm9yUmVwb3J0ZXIuVW5rbm93bkxvY2F0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5rbm93biBsb2NhdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OU09MRV9FUlJPUl9SRVBPUlRFUl9VTktOT1dOX0xPQ0FUSU9OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlQ09OU09MRV9FUlJPUl9SRVBPUlRFUl9VTktOT1dOX0xPQ0FUSU9OKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9FWFBPUlRFUl9VTlNVUFBPUlRFRF9DTEFTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuZXhwb3J0ZXIudW5zdXBwb3J0ZWRDbGFzcyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIG1vZGVsIGV4cG9ydGVyOiB1bnN1cHBvcnRlZCBjbGFzczogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9FWFBPUlRFUl9VTlNVUFBPUlRFRF9DTEFTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfRVhQT1JURVJfVU5TVVBQT1JURURfQ0xBU1MoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfRU5DT0RFUl9OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5lbmNvZGVyTm90Rm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBubyBlbmNvZGVyIGZvdW5kIGZvciBzaW1wbGVUeXBlOiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfU0NIRU1BX0VOQ09ERVJfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfRU5DT0RFUl9OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfRUxFTUVOVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5lbGVtZW50Tm90Rm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbGVtZW50ICJ7MH0iIG5vdCBmb3VuZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9FTEVNRU5UX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0VMRU1FTlRfTk9UX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfVU5JUVVFTkVTU19KQVZBU1RSVUNUVVJFVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnVuaXF1ZW5lc3MuamF2YXN0cnVjdHVyZXR5cGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgdmlvbGF0aW9uLCBkdXBsaWNhdGUgbWVtYmVyICJ7MH0iIGFkZGVkIHRvIEphdmFTdHJ1Y3R1cmVUeXBlICJ7MX0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9VTklRVUVORVNTX0pBVkFTVFJVQ1RVUkVUWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfVU5JUVVFTkVTU19KQVZBU1RSVUNUVVJFVFlQRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1NBWFBBUlNFUl9FWENFUFRJT04oT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5zYXhwYXJzZXIuZXhjZXB0aW9uIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogezB9CisgICAgICogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9TQVhQQVJTRVJfRVhDRVBUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0FYUEFSU0VSX0VYQ0VQVElPTihhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZV8wMDJGXzAwMkZfSkFYV1MoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCIvL0pBWFdTIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogIDIuMAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgXzAwMkZfMDAyRl9KQVhXUygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZV8wMDJGXzAwMkZfSkFYV1MoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX0RVUExJQ0FURV9GQVVMVE1FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmR1cGxpY2F0ZS5mYXVsdG1lc3NhZ2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkdXBsaWNhdGUgZmF1bHQgbWVzc2FnZSBhZGRlZCB0byBtb2RlbDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9EVVBMSUNBVEVfRkFVTFRNRVNTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9EVVBMSUNBVEVfRkFVTFRNRVNTQUdFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfSU1QT1JURVJfSU5WQUxJRF9QUk9QRVJUWShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuaW1wb3J0ZXIuaW52YWxpZFByb3BlcnR5IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBwcm9wZXJ0eSBpbiBtb2RlbCBkb2N1bWVudCAobGluZSB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0lNUE9SVEVSX0lOVkFMSURfUFJPUEVSVFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0lNUE9SVEVSX0lOVkFMSURfUFJPUEVSVFkoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9JTVBPUlRFUl9TWU5UQVhfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmltcG9ydGVyLnN5bnRheEVycm9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc3ludGF4IGVycm9yIGluIG1vZGVsIGRvY3VtZW50IChsaW5lIHswfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0lNUE9SVEVSX1NZTlRBWF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfSU1QT1JURVJfU1lOVEFYX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX1VOU1VQUE9SVEVEX1RZUEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuc2NoZW1hLnVuc3VwcG9ydGVkVHlwZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVuc3VwcG9ydGVkIHR5cGUgKHswfSk6ICJ7MX0iIChuYW1lc3BhY2U6IHsyfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9VTlNVUFBPUlRFRF9UWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9VTlNVUFBPUlRFRF9UWVBFKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0lOVkFMSURfU0lNUExFX1RZUEVfTk9fSkFWQV9UWVBFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5zY2hlbWEuaW52YWxpZFNpbXBsZVR5cGUubm9KYXZhVHlwZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5vIGphdmEgbWFwcGluZyBmb3Igc2ltcGxlVHlwZTogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9JTlZBTElEX1NJTVBMRV9UWVBFX05PX0pBVkFfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0lOVkFMSURfU0lNUExFX1RZUEVfTk9fSkFWQV9UWVBFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0xJU1RfTk9UX1NVUFBPUlRFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuc2NoZW1hLmxpc3ROb3RTdXBwb3J0ZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzaW1wbGVUeXBlOiAiezB9IiBkZXJpdmF0aW9uIGJ5IHhzZDpsaXN0IG5vdCBzdXBwb3J0ZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9MSVNUX05PVF9TVVBQT1JURUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9MSVNUX05PVF9TVVBQT1JURUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9BUlJBWVdSQVBQRVJfTk9fUEFSRU5UKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuYXJyYXl3cmFwcGVyLm5vLnBhcmVudCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpdGVyYWxBcnJheVdyYXBwZXIgY2Fubm90IGhhdmUgYSBwYXJlbnQgdHlwZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfQVJSQVlXUkFQUEVSX05PX1BBUkVOVCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0FSUkFZV1JBUFBFUl9OT19QQVJFTlQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX0RVUExJQ0FURV9QQVJUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5kdXBsaWNhdGUucGFydCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGR1cGxpY2F0ZSBwYXJ0IGFkZGVkIHRvIG1vZGVsOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0RVUExJQ0FURV9QQVJUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9EVVBMSUNBVEVfUEFSVChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX0RVUExJQ0FURV9PUEVSQVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmR1cGxpY2F0ZS5vcGVyYXRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkdXBsaWNhdGUgT3BlcmF0aW9uIGFkZGVkIHRvIG1vZGVsOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0RVUExJQ0FURV9PUEVSQVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0RVUExJQ0FURV9PUEVSQVRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9QQVJFTlRfVFlQRV9BTFJFQURZX1NFVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5wYXJlbnQudHlwZS5hbHJlYWR5LnNldCIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhcmVudCBvZiB0eXBlICJ7MH0iIGFscmVhZHkgc2V0IHRvICJ7MX0iLCBuZXcgdmFsdWUgPSAiezJ9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfUEFSRU5UX1RZUEVfQUxSRUFEWV9TRVQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfUEFSRU5UX1RZUEVfQUxSRUFEWV9TRVQoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9BUlJBWVdSQVBQRVJfTk9fU1VCVFlQRVMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5hcnJheXdyYXBwZXIubm8uc3VidHlwZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXRlcmFsQXJyYXlXcmFwcGVyIGNhbm5vdCBoYXZlIHN1YnR5cGVzCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9BUlJBWVdSQVBQRVJfTk9fU1VCVFlQRVMoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9BUlJBWVdSQVBQRVJfTk9fU1VCVFlQRVMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9JTlZBTElEX0xJVEVSQUxfSU5fRU5VTUVSQVRJT04oT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuc2NoZW1hLmludmFsaWRMaXRlcmFsSW5FbnVtZXJhdGlvbiIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgbGl0ZXJhbCAiezB9IiBpbiBlbnVtZXJhdGlvbiAiezF9IiAobmFtZXNwYWNlOiB7Mn0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9TQ0hFTUFfSU5WQUxJRF9MSVRFUkFMX0lOX0VOVU1FUkFUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9JTlZBTElEX0xJVEVSQUxfSU5fRU5VTUVSQVRJT04oYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfVU5TVVBQT1JURURfU0NIRU1BX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS51bnN1cHBvcnRlZFNjaGVtYVR5cGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bnN1cHBvcnRlZCBzY2hlbWEgdHlwZTogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9VTlNVUFBPUlRFRF9TQ0hFTUFfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX1VOU1VQUE9SVEVEX1NDSEVNQV9UWVBFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfSU1QT1JURVJfSU5WQUxJRF9NSU5PUl9NSU5PUl9PUl9QQVRDSF9WRVJTSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmltcG9ydGVyLmludmFsaWRNaW5vck1pbm9yT3JQYXRjaFZlcnNpb24iLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2RlbCB2ZXJzaW9uICJ7MX0iIG5ld2VyIHRoYW4gcnVudGltZSB2ZXJzaW9uICJ7Mn0iIChsaW5lIHswfSk6IG5lZWQgdG8gdXBncmFkZSB0byBhIG5ld2VyIHJ1bnRpbWUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0lNUE9SVEVSX0lOVkFMSURfTUlOT1JfTUlOT1JfT1JfUEFUQ0hfVkVSU0lPTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9JTVBPUlRFUl9JTlZBTElEX01JTk9SX01JTk9SX09SX1BBVENIX1ZFUlNJT04oYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfQ0lSQ1VMQVJJVFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5jaXJjdWxhcml0eSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNpcmN1bGFyaXR5IGRldGVjdGVkIGluIHNjaGVtYTogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9DSVJDVUxBUklUWShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0NJUkNVTEFSSVRZKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX05PVF9JTVBMRU1FTlRFRF9HRU5FUkFUSU5HX1NPQVBfRUxFTUVOVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5ub3RJbXBsZW1lbnRlZC5nZW5lcmF0aW5nU09BUEVsZW1lbnQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bnN1cHBvcnRlZCBYTUwgU2NoZW1hIGZlYXR1cmU6ICJ7MH0iIGluIGNvbXBvbmVudCB7MX0sIG1hcHBpbmcgaXQgdG8gamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9OT1RfSU1QTEVNRU5URURfR0VORVJBVElOR19TT0FQX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfTk9UX0lNUExFTUVOVEVEX0dFTkVSQVRJTkdfU09BUF9FTEVNRU5UKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfQVJSQVlXUkFQUEVSX01FTUJFUl9BTFJFQURZX1NFVCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmFycmF5d3JhcHBlci5tZW1iZXIuYWxyZWFkeS5zZXQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXRlcmFsQXJyYXlXcmFwcGVyIGVsZW1lbnQgbWVtYmVyIGFscmVhZHkgc2V0LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfQVJSQVlXUkFQUEVSX01FTUJFUl9BTFJFQURZX1NFVCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0FSUkFZV1JBUFBFUl9NRU1CRVJfQUxSRUFEWV9TRVQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX0lNUE9SVEVSX0lOVkFMSURfQ0xBU1MoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5pbXBvcnRlci5pbnZhbGlkQ2xhc3MiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIGNsYXNzIG5hbWUgInsxfSIgaW4gbW9kZWwgZG9jdW1lbnQgKGxpbmUgezB9KQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfSU1QT1JURVJfSU5WQUxJRF9DTEFTUyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0lNUE9SVEVSX0lOVkFMSURfQ0xBU1MoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9JTVBPUlRFUl9OT05fTU9ERUwoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5pbXBvcnRlci5ub25Nb2RlbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5vdCBhIHZhbGlkIG1vZGVsIGRvY3VtZW50CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9JTVBPUlRFUl9OT05fTU9ERUwoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9JTVBPUlRFUl9OT05fTU9ERUwoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX0lNUE9SVEVSX0lOVkFMSURfVkVSU0lPTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmltcG9ydGVyLmludmFsaWRWZXJzaW9uIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCB2ZXJzaW9uICJ7MX0iIGluIG1vZGVsIGRvY3VtZW50IChsaW5lIHswfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0lNUE9SVEVSX0lOVkFMSURfVkVSU0lPTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0lNUE9SVEVSX0lOVkFMSURfVkVSU0lPTihhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9JTlZBTElEX1NJTVBMRV9UWVBFX05PX05BTUVTUEFDRV9VUkkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5pbnZhbGlkU2ltcGxlVHlwZS5ub05hbWVzcGFjZVVSSSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgc2ltcGxlVHlwZTogInswfSIsIGhhZCBudWxsIG5hbWVzcGFjZVVSSQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfU0NIRU1BX0lOVkFMSURfU0lNUExFX1RZUEVfTk9fTkFNRVNQQUNFX1VSSShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0lOVkFMSURfU0lNUExFX1RZUEVfTk9fTkFNRVNQQUNFX1VSSShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUNPTlNPTEVfRVJST1JfUkVQT1JURVJfTElORV9YX09GX1koT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJDb25zb2xlRXJyb3JSZXBvcnRlci5MaW5lWE9mWSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgbGluZSB7MH0gb2YgezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05TT0xFX0VSUk9SX1JFUE9SVEVSX0xJTkVfWF9PRl9ZKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlQ09OU09MRV9FUlJPUl9SRVBPUlRFUl9MSU5FX1hfT0ZfWShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1BBUkFNRVRFUl9OT1RVTklRVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5wYXJhbWV0ZXIubm90dW5pcXVlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbGVkIHRvIGdlbmVyYXRlIEphdmEgc2lnbmF0dXJlOiBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzIHswfS4gVXNlIEpBWFdTIGJpbmRpbmcgY3VzdG9taXphdGlvbiB0byByZW5hbWUgdGhlIHdzZGw6cGFydCAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfUEFSQU1FVEVSX05PVFVOSVFVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1BBUkFNRVRFUl9OT1RVTklRVUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfSU5WQUxJRF9TSU1QTEVfVFlQRV9JTlZBTElEX0lURU1fVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5pbnZhbGlkU2ltcGxlVHlwZS5pbnZhbGlkSXRlbVR5cGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbiBzaW1wbGVUeXBlOiAiezB9IiwgaXRlbVR5cGUgInsxfSIgY2FuIG5vdCBiZSBkZXJpdmVkIGJ5IGxpc3QKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9JTlZBTElEX1NJTVBMRV9UWVBFX0lOVkFMSURfSVRFTV9UWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0lOVkFMSURfU0lNUExFX1RZUEVfSU5WQUxJRF9JVEVNX1RZUEUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9EVVBMSUNBVEVfUFJPUEVSVFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmR1cGxpY2F0ZS5wcm9wZXJ0eSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGR1cGxpY2F0ZSBwcm9wZXJ0eSBhZGRlZCB0byBtb2RlbDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9EVVBMSUNBVEVfUFJPUEVSVFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX0RVUExJQ0FURV9QUk9QRVJUWShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1VOSVFVRU5FU1MoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC51bmlxdWVuZXNzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5pcXVlbmVzcyBjb25zdHJhaW50IHZpb2xhdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfVU5JUVVFTkVTUygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1VOSVFVRU5FU1MoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZV8wMDJGXzAwMkZfUkVQTEFDRU1FTlQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCIvL3JlcGxhY2VtZW50Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZm9yIFV4eHggY29kZXMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF8wMDJGXzAwMkZfUkVQTEFDRU1FTlQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVfMDAyRl8wMDJGX1JFUExBQ0VNRU5UKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfSU5WQUxJRF9TSU1QTEVfVFlQRV9OT19JVEVNX0xJVEVSQUxfVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5pbnZhbGlkU2ltcGxlVHlwZS5ub0l0ZW1MaXRlcmFsVHlwZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGluIHNpbXBsZVR5cGU6ICJ7MH0iLCB4c2Q6bGlzdCBpdGVtVHlwZSAiezF9IiBpcyBpbnZhbGlkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9TQ0hFTUFfSU5WQUxJRF9TSU1QTEVfVFlQRV9OT19JVEVNX0xJVEVSQUxfVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9JTlZBTElEX1NJTVBMRV9UWVBFX05PX0lURU1fTElURVJBTF9UWVBFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0lOVkFMSURfU0lNUExFX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5pbnZhbGlkU2ltcGxlVHlwZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgc2ltcGxlVHlwZTogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1NDSEVNQV9JTlZBTElEX1NJTVBMRV9UWVBFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfSU5WQUxJRF9TSU1QTEVfVFlQRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX0FSUkFZV1JBUFBFUl9PTkxZX09ORV9NRU1CRVIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5hcnJheXdyYXBwZXIub25seS5vbmUubWVtYmVyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGl0ZXJhbEFycmF5V3JhcHBlciBtYXkgb25seSBoYXZlIG9uZSBlbGVtZW50IG1lbWJlci4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0FSUkFZV1JBUFBFUl9PTkxZX09ORV9NRU1CRVIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9BUlJBWVdSQVBQRVJfT05MWV9PTkVfTUVNQkVSKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTF9JTVBPUlRFUl9JTlZBTElEX0xJVEVSQUwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLmltcG9ydGVyLmludmFsaWRMaXRlcmFsIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBsaXRlcmFsIHZhbHVlIGluIG1vZGVsIGRvY3VtZW50IChsaW5lIHswfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX0lNUE9SVEVSX0lOVkFMSURfTElURVJBTChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfSU1QT1JURVJfSU5WQUxJRF9MSVRFUkFMKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX05PVF9JTVBMRU1FTlRFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuc2NoZW1hLm5vdEltcGxlbWVudGVkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5zdXBwb3J0ZWQgWE1MIFNjaGVtYSBmZWF0dXJlICh7MH0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9TQ0hFTUFfTk9UX0lNUExFTUVOVEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9TQ0hFTUFfTk9UX0lNUExFTUVOVEVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfU0NIRU1BX0lOVkFMSURfTElURVJBTF9JTl9FTlVNRVJBVElPTl9BTk9OWU1PVVMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnNjaGVtYS5pbnZhbGlkTGl0ZXJhbEluRW51bWVyYXRpb24uYW5vbnltb3VzIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBsaXRlcmFsICJ7MH0iIGluIGFub255bW91cyBlbnVtZXJhdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ERUxfU0NIRU1BX0lOVkFMSURfTElURVJBTF9JTl9FTlVNRVJBVElPTl9BTk9OWU1PVVMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1NDSEVNQV9JTlZBTElEX0xJVEVSQUxfSU5fRU5VTUVSQVRJT05fQU5PTllNT1VTKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTU9ERUxfQVJSQVlXUkFQUEVSX05PX0NPTlRFTlRfTUVNQkVSKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWwuYXJyYXl3cmFwcGVyLm5vLmNvbnRlbnQubWVtYmVyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGl0ZXJhbEFycmF5V3JhcHBlciBjYW5ub3QgaGF2ZSBhIGNvbnRlbnQgbWVtYmVyCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9BUlJBWVdSQVBQRVJfTk9fQ09OVEVOVF9NRU1CRVIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNT0RFTF9BUlJBWVdSQVBQRVJfTk9fQ09OVEVOVF9NRU1CRVIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1BBUlRfTk9UX1VOSVFVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1vZGVsLnBhcnQubm90VW5pcXVlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFydHMgaW4gd3NkbDptZXNzYWdlICJ7MH0iLCByZWZlcmVuY2UgInsxfSIsIHRoZXkgbXVzdCByZWZlcmVuY2UgdW5pcXVlIGdsb2JhbCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PREVMX1BBUlRfTk9UX1VOSVFVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1PREVMX1BBUlRfTk9UX1VOSVFVRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1PREVMX1BBUkVOVF9GQVVMVF9BTFJFQURZX1NFVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtb2RlbC5wYXJlbnQuZmF1bHQuYWxyZWFkeS5zZXQiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwYXJlbnQgb2YgZmF1bHQgInswfSIgYWxyZWFkeSBzZXQgdG8gInsxfSIsIG5ldyB2YWx1ZSA9ICJ7Mn0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTF9QQVJFTlRfRkFVTFRfQUxSRUFEWV9TRVQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxfUEFSRU5UX0ZBVUxUX0FMUkVBRFlfU0VUKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL01vZGVsZXJNZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvTW9kZWxlck1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjMDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL01vZGVsZXJNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMTYwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNb2RlbGVyTWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5tb2RlbGVyIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9JTlZBTElEX1NDSEVNQV9UWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibWltZW1vZGVsZXIuaW52YWxpZE1pbWVDb250ZW50LmludmFsaWRTY2hlbWFUeXBlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3JpbmcgdGhlIG1pbWU6cGFydC4gbWltZSBwYXJ0OiB7MH0gY2FuIG5vdCBiZSBtYXBwZWQgdG8gc2NoZW1hIHR5cGU6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUlNRU1PREVMRVJfSU5WQUxJRF9NSU1FX0NPTlRFTlRfSU5WQUxJRF9TQ0hFTUFfVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9DT05URU5UX0lOVkFMSURfU0NIRU1BX1RZUEUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX1BBUkFNRVRFUk9SREVSX1BBUkFNRVRFUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQucGFyYW1ldGVyb3JkZXIucGFyYW1ldGVyIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogInswfSIgc3BlY2lmaWVkIGluIHRoZSBwYXJhbWV0ZXJPcmRlciBhdHRyaWJ1dGUgb2Ygb3BlcmF0aW9uICJ7MX0iIGlzIG5vdCBhIHZhbGlkIHBhcnQgb2YgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX1BBUkFNRVRFUk9SREVSX1BBUkFNRVRFUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfUEFSQU1FVEVST1JERVJfUEFSQU1FVEVSKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX05PX1NPQVBfRkFVTFRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lm5vU29hcEZhdWx0TmFtZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNvYXA6ZmF1bHQgbmFtZSBub3Qgc3BlY2lmaWVkLCB3c2RsOmZhdWx0ICJ7MH0iIGluIG9wZXJhdGlvbiAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX05PX1NPQVBfRkFVTFRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19GQVVMVF9OT19TT0FQX0ZBVUxUX05BTUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX05PTkNPTkZPUk1JTkdfV1NETF9JTVBPUlQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLm5vbmNvbmZvcm1pbmcud3NkbC5pbXBvcnQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb24gY29uZm9ybWluZyBXUy1JIFdTREwgdXNlZCBmb3Igd3NkbDppbXBvcnQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfTk9OQ09ORk9STUlOR19XU0RMX0lNUE9SVCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfTk9OQ09ORk9STUlOR19XU0RMX0lNUE9SVCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9PVVRQVVRfU09BUF9CT0RZX01JU1NJTkdfTkFNRVNQQUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24ub3V0cHV0U29hcEJvZHkubWlzc2luZ05hbWVzcGFjZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIG91dHB1dCBtZXNzYWdlIG9mIGJpbmRpbmcgb3BlcmF0aW9uICJ7MH0iIG11c3Qgc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgIm5hbWVzcGFjZSIgYXR0cmlidXRlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX09VVFBVVF9TT0FQX0JPRFlfTUlTU0lOR19OQU1FU1BBQ0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fT1VUUFVUX1NPQVBfQk9EWV9NSVNTSU5HX05BTUVTUEFDRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfT1BFUkFUSU9OX0ZBVUxUX05PVF9MSVRFUkFMKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5vcGVyYXRpb24uZmF1bHQubm90TGl0ZXJhbCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIGVuY29kZWQgZmF1bHQgInswfSIgaW4gbGl0ZXJhbCBiaW5kaW5nIG9wZXJhdGlvbiAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fRkFVTFRfTk9UX0xJVEVSQUwoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9GQVVMVF9OT1RfTElURVJBTChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fSU5QVVRfTUlTU0lOR19TT0FQX0JPRFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ09wZXJhdGlvbi5pbnB1dE1pc3NpbmdTb2FwQm9keSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlucHV0IG1lc3NhZ2Ugb2YgYmluZGluZyBvcGVyYXRpb24gInswfSIgZG9lcyBub3QgaGF2ZSBhIFNPQVAgYm9keSBleHRlbnNpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fSU5QVVRfTUlTU0lOR19TT0FQX0JPRFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fSU5QVVRfTUlTU0lOR19TT0FQX0JPRFkoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX1NPQVBfQklORElOR19OT05fSFRUUF9UUkFOU1BPUlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdTT0FQQmluZGluZy5ub25IVFRQVHJhbnNwb3J0IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgU09BUCBwb3J0ICJ7MH0iOiB1bnJlY29nbml6ZWQgdHJhbnNwb3J0LiB0cnkgcnVubmluZyB3c2ltcG9ydCB3aXRoIC1leHRlbnNpb24gc3dpdGNoLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19TT0FQX0JJTkRJTkdfTk9OX0hUVFBfVFJBTlNQT1JUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX1NPQVBfQklORElOR19OT05fSFRUUF9UUkFOU1BPUlQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX05PVF9GT1VORChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ09wZXJhdGlvbi5ub3RGb3VuZCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGluIGJpbmRpbmcgInsxfSIsIG9wZXJhdGlvbiAiezB9IiBkb2VzIG5vdCBtYXRjaCBhbnkgb3BlcmF0aW9uIGluIHRoZSBjb3JyZXNwb25kaW5nIHBvcnQgdHlwZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9OT1RfRk9VTkQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX05PVF9GT1VORChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1VOU1VQUE9SVEVEX0JJTkRJTkdfTUlNRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLnVuc3VwcG9ydGVkQmluZGluZy5taW1lIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NETCBNSU1FIGJpbmRpbmcgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQhCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9VTlNVUFBPUlRFRF9CSU5ESU5HX01JTUUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9VTlNVUFBPUlRFRF9CSU5ESU5HX01JTUUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX0ZBVUxUX05PX0VMRU1FTlRfQVRUUklCVVRFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdIZWFkZXJGYXVsdC5ub0VsZW1lbnRBdHRyaWJ1dGUiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBoZWFkZXIgZmF1bHQgcGFydD0iezB9IiBtZXNzYWdlPSJ7MX0iIG9mIG9wZXJhdGlvbiB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX0ZBVUxUX05PX0VMRU1FTlRfQVRUUklCVVRFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX0ZBVUxUX05PX0VMRU1FTlRfQVRUUklCVVRFKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX05PTl9XUkFQUEVSX1NUWUxFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLm5vbldyYXBwZXJTdHlsZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludmFsaWQgb3BlcmF0aW9uICJ7MH0iLCBjYW4nJ3QgZ2VuZXJhdGUgamF2YSBtZXRob2QuIFBhcmFtZXRlcjogcGFydCAiezJ9IiBpbiB3c2RsOm1lc3NhZ2UgInsxfSIsIGlzIGEgamF2YSBrZXl3b3JkLiBVc2UgY3VzdG9taXphdGlvbiB0byBjaGFuZ2UgdGhlIHBhcmFtZXRlciBuYW1lIG9yIGNoYW5nZSB0aGUgd3NkbDpwYXJ0IG5hbWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfTk9OX1dSQVBQRVJfU1RZTEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX05PTl9XUkFQUEVSX1NUWUxFKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJGQVVMVF9OT1RfTElURVJBTChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuaGVhZGVyZmF1bHQubm90TGl0ZXJhbCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludmFsaWQgaGVhZGVyZmF1bHQgInswfSIgb2YgYmluZGluZyBvcGVyYXRpb24gInsxfSI6IG5vdCBsaXRlcmFsCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0hFQURFUkZBVUxUX05PVF9MSVRFUkFMKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJGQVVMVF9OT1RfTElURVJBTChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9DT05URU5UX0RJRkZFUkVOVF9QQVJUKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibWltZW1vZGVsZXIuaW52YWxpZE1pbWVDb250ZW50LmRpZmZlcmVudFBhcnQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZ25vcmluZyB0aGUgbWltZTpwYXJ0LiBJbnZhbGlkIG1pbWU6cGFydCwgdGhlIG1pbWU6Y29udGVudCBoYXMgZGlmZmVyZW50IHBhcnQgYXR0cmlidXRlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUlNRU1PREVMRVJfSU5WQUxJRF9NSU1FX0NPTlRFTlRfRElGRkVSRU5UX1BBUlQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9ESUZGRVJFTlRfUEFSVCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfRVJST1JfUEFSVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5lcnJvci5wYXJ0Tm90Rm91bmQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwYXJ0ICJ7MX0iIG9mIG9wZXJhdGlvbiAiezB9IiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQhCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9FUlJPUl9QQVJUX05PVF9GT1VORChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0VSUk9SX1BBUlRfTk9UX0ZPVU5EKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJfTUVTU0FHRV9QQVJUX01VU1RfSEFWRV9FTEVNRU5UX0RFU0NSSVBUT1IoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmhlYWRlci5tZXNzYWdlLnBhcnRNdXN0SGF2ZUVsZW1lbnREZXNjcmlwdG9yIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBoZWFkZXIgInswfSIgaW4gb3BlcmF0aW9uIHsxfTogcGFydCBtdXN0IHNwZWNpZnkgYSAiZWxlbWVudCIgYXR0cmlidXRlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0hFQURFUl9NRVNTQUdFX1BBUlRfTVVTVF9IQVZFX0VMRU1FTlRfREVTQ1JJUFRPUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfSEVBREVSX01FU1NBR0VfUEFSVF9NVVNUX0hBVkVfRUxFTUVOVF9ERVNDUklQVE9SKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX09QRVJBVElPTl9OQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm9wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC5vcGVyYXRpb25OYW1lIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBvcGVyYXRpb24gInswfSIsIGl0JydzIGphdmEgcmVzZXJ2ZWQgd29yZCwgY2FuJyd0IGdlbmVyYXRlIGphdmEgbWV0aG9kLiBVc2UgY3VzdG9taXphdGlvbiB0byBjaGFuZ2UgdGhlIG9wZXJhdGlvbiBuYW1lLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX09QRVJBVElPTl9OQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfT1BFUkFUSU9OX05BTUUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfT1VUUFVUX01JU1NJTkdfU09BUF9GQVVMVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lm91dHB1dE1pc3NpbmdTb2FwRmF1bHQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmYXVsdCAiezB9IiBpbiBvcGVyYXRpb24gInsxfSIgZG9lcyBub3QgaGF2ZSBhIFNPQVAgZmF1bHQgZXh0ZW5zaW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfT1VUUFVUX01JU1NJTkdfU09BUF9GQVVMVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19GQVVMVF9PVVRQVVRfTUlTU0lOR19TT0FQX0ZBVUxUKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fQ0FOTk9UX0hBTkRMRV9FTEVNRU5UX01FU1NBR0VfUEFSVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ09wZXJhdGlvbi5jYW5ub3RIYW5kbGVFbGVtZW50TWVzc2FnZVBhcnQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBvcGVyYXRpb24gInswfSI6IG1lc3NhZ2UgcGFydCBkb2VzIG5vdCByZWZlciB0byBhIHNjaGVtYSB0eXBlIGRlY2xhcmF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX0VMRU1FTlRfTUVTU0FHRV9QQVJUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX0VMRU1FTlRfTUVTU0FHRV9QQVJUKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PRExFUl9XQVJOSU5HX09QRVJBVElPTl9VU0UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kbGVyLndhcm5pbmcub3BlcmF0aW9uLnVzZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBXU0RMIHVzZWQgaGFzIG9wZXJhdGlvbnMgd2l0aCBsaXRlcmFsIGFuZCBlbmNvZGVkIHVzZS4gLWY6c2VhcmNoc2NoZW1hIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgc2NlbmFyaW8uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ETEVSX1dBUk5JTkdfT1BFUkFUSU9OX1VTRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RMRVJfV0FSTklOR19PUEVSQVRJT05fVVNFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX05PTl9TT0FQX1BPUlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdOb25TT0FQUG9ydCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIHBvcnQgInswfSI6IG5vdCBhIHN0YW5kYXJkIFNPQVAgcG9ydC4gdHJ5IHJ1bm5pbmcgd3NpbXBvcnQgd2l0aCAtZXh0ZW5zaW9uIHN3aXRjaC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfTk9OX1NPQVBfUE9SVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19OT05fU09BUF9QT1JUKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX01FU1NBR0VfSEFTX01PUkVfVEhBTl9PTkVfUEFSVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lm1lc3NhZ2VIYXNNb3JlVGhhbk9uZVBhcnQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmYXVsdCAiezB9IiByZWZlcnMgdG8gbWVzc2FnZSAiezF9IiwgYnV0IHRoZSBtZXNzYWdlIGhhcyBtb3JlIHRoYW4gb25lIHBhcnRzCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfTUVTU0FHRV9IQVNfTU9SRV9USEFOX09ORV9QQVJUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX01FU1NBR0VfSEFTX01PUkVfVEhBTl9PTkVfUEFSVChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfTk9fU0VSVklDRV9ERUZJTklUSU9OU19GT1VORCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcubm9TZXJ2aWNlRGVmaW5pdGlvbnNGb3VuZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTREwgZG9jdW1lbnQgZG9lcyBub3QgZGVmaW5lIGFueSBzZXJ2aWNlcworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19OT19TRVJWSUNFX0RFRklOSVRJT05TX0ZPVU5EKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19OT19TRVJWSUNFX0RFRklOSVRJT05TX0ZPVU5EKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0ZBVUxUX0NBTlRfUkVTT0xWRV9NRVNTQUdFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ0ZhdWx0LmNhbnQucmVzb2x2ZS5tZXNzYWdlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgZmF1bHQgInswfSIgb2YgYmluZGluZyBvcGVyYXRpb24gInsxfSI6IGNhbm5vdCByZXNvbHZlIG1lc3NhZ2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfRkFVTFRfQ0FOVF9SRVNPTFZFX01FU1NBR0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0ZBVUxUX0NBTlRfUkVTT0xWRV9NRVNTQUdFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSkFYQl9KQVZBVFlQRV9OT1RGT1VORChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmpheGIuamF2YXR5cGUubm90Zm91bmQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2hlbWEgZGVzY3JpcHRvciB7MH0gaW4gbWVzc2FnZSBwYXJ0ICJ7MX0iIGNvdWxkIG5vdCBiZSBib3VuZCB0byBKYXZhIQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSkFYQl9KQVZBVFlQRV9OT1RGT1VORChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0pBWEJfSkFWQVRZUEVfTk9URk9VTkQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX1BPUlRfU09BUF9CSU5ESU5HX01JWEVEX1NUWUxFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLnBvcnQuU09BUEJpbmRpbmcubWl4ZWRTdHlsZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5vdCBhIFdTLUkgQlAxLjEgY29tcGxpYW50IFNPQVAgcG9ydCAiezB9IjogdGhlIHdzZGwgYmluZGluZyBoYXMgbWl4ZWQgc3R5bGUsIGl0IG11c3QgYmUgcnBjLWxpdGVyYWwgb3IgZG9jdW1lbnQtbGl0ZXJhbCBvcGVyYXRpb24hCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX1BPUlRfU09BUF9CSU5ESU5HX01JWEVEX1NUWUxFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX1BPUlRfU09BUF9CSU5ESU5HX01JWEVEX1NUWUxFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9ET0NMSVRPUEVSQVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuZG9jbGl0b3BlcmF0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCB3c2RsOm9wZXJhdGlvbiAiezB9IjogaXRzIGEgZG9jdW1lbnQtbGl0ZXJhbCBvcGVyYXRpb24sICBtZXNzYWdlIHBhcnQgbXVzdCByZWZlciB0byBhIHNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0RPQ0xJVE9QRVJBVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9ET0NMSVRPUEVSQVRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNT0RFTEVSX05FU1RFRF9NT0RFTF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibW9kZWxlci5uZXN0ZWRNb2RlbEVycm9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbW9kZWxlciBlcnJvcjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RFTEVSX05FU1RFRF9NT0RFTF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTU9ERUxFUl9ORVNURURfTU9ERUxfRVJST1IoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9EVVBMSUNBVEVfRkFVTFRfU09BUF9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmR1cGxpY2F0ZS5mYXVsdC5zb2FwLm5hbWUiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBmYXVsdCAiezB9IiBvZiBvcGVyYXRpb24gInsxfSIsIHNvYXA6ZmF1bHQgbmFtZSAiezJ9IiBpcyBub3QgdW5pcXVlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9EVVBMSUNBVEVfRkFVTFRfU09BUF9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0RVUExJQ0FURV9GQVVMVF9TT0FQX05BTUUoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfV1JPTkdfU09BUF9GQVVMVF9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lndyb25nU29hcEZhdWx0TmFtZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5hbWUgb2Ygc29hcDpmYXVsdCAiezB9IiBkb2VzbicndCBtYXRjaCB0aGUgbmFtZSBvZiB3c2RsOmZhdWx0ICJ7MX0iIGluIG9wZXJhdGlvbiAiezJ9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX1dST05HX1NPQVBfRkFVTFRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfV1JPTkdfU09BUF9GQVVMVF9OQU1FKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fTk9UX0xJVEVSQUwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24ubm90TGl0ZXJhbCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIGRvY3VtZW50LXN0eWxlIG9wZXJhdGlvbiAiezB9IjogcGFyYW1ldGVycyBhcmUgbm90IGxpdGVyYWwKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX05PVF9MSVRFUkFMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9OT1RfTElURVJBTChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfRE9DVU1FTlRfU1RZTEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24uY2Fubm90SGFuZGxlRG9jdW1lbnRTdHlsZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIG9wZXJhdGlvbiAiezB9IjogY2Fubm90IGhhbmRsZSBkb2N1bWVudC1zdHlsZSBvcGVyYXRpb25zCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX0RPQ1VNRU5UX1NUWUxFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX0RPQ1VNRU5UX1NUWUxFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVF9OT1RfTElURVJBTChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdGYXVsdC5ub3RMaXRlcmFsIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgZW5jb2RlZCBmYXVsdCAiezB9IiBvZiBiaW5kaW5nIG9wZXJhdGlvbiAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVF9OT1RfTElURVJBTChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfRkFVTFRfTk9UX0xJVEVSQUwoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX1JQQ0xJVE9QRVJBVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5ycGNsaXRvcGVyYXRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIHdzZGw6b3BlcmF0aW9uICJ7MH0iOiBpdHMgYSBycGMtbGl0ZXJhbCBvcGVyYXRpb24sICBtZXNzYWdlIHBhcnQgbXVzdCByZWZlciB0byBhIHNjaGVtYSB0eXBlIGRlY2xhcmF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX1JQQ0xJVE9QRVJBVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9SUENMSVRPUEVSQVRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfQ1VTVE9NX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm9wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC5jdXN0b21OYW1lIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBvcGVyYXRpb24gInswfSIsIGNhbicndCBnZW5lcmF0ZSBqYXZhIG1ldGhvZC4gUGFyYW1ldGVyLGN1c3RvbWl6ZWQgbmFtZSAiezF9IiAgaXMgYSBqYXZhIGtleXdvcmQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfQ1VTVE9NX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfQ1VTVE9NX05BTUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0JJTkRJTkdfT1BFUkFUSU9OX01VTFRJUExFX1BBUlRfQklORElORyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuYmluZGluZ09wZXJhdGlvbi5tdWx0aXBsZVBhcnRCaW5kaW5nIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGFic3RyYWN0IG9wZXJhdGlvbiAiezB9IiBiaW5kaW5nLCBwYXJ0ICJ7MX0iIGhhcyBtdWx0aXBsZSBiaW5kaW5nLiBXaWxsIHRyeSB0byBnZW5lcmF0ZWQgYXJ0aWZmYWN0cyBhbnl3YXkuLi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfQklORElOR19PUEVSQVRJT05fTVVMVElQTEVfUEFSVF9CSU5ESU5HKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19CSU5ESU5HX09QRVJBVElPTl9NVUxUSVBMRV9QQVJUX0JJTkRJTkcoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX1BPUlRfU09BUF9CSU5ESU5HXzEyKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLnBvcnQuU09BUEJpbmRpbmcxMiIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNPQVAgcG9ydCAiezB9IjogdXNlcyBhIG5vbi1zdGFuZGFyZCBTT0FQIDEuMiBiaW5kaW5nLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19QT1JUX1NPQVBfQklORElOR18xMihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19QT1JUX1NPQVBfQklORElOR18xMihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9QQVJUX05BTUVfTk9UX0FMTE9XRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1pbWVtb2RlbGVyLmludmFsaWRNaW1lUGFydC5uYW1lTm90QWxsb3dlZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5hbWUgYXR0cmlidXRlIG9uIHdzZGw6cGFydCBpbiBPcGVyYXRpb24gInswfSIgaXMgaWdub3JlZC4gSXRzIG5vdCBhbGxvd2VkIGFzIHBlciBXUy1JIEFQIDEuMC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9QQVJUX05BTUVfTk9UX0FMTE9XRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9QQVJUX05BTUVfTk9UX0FMTE9XRUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX01JTUVfUEFSVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nTWltZVBhcnQubm90Rm91bmQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBtaW1lOnBhcnQsIGNhbm5vdCBmaW5kIHBhcnQgInswfSIgcmVmZXJlbmNlZCBieSB0aGUgbWltZTpjb250ZW50IGluIHRoZSB3c2RsOm9wZXJhdGlvbiAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19NSU1FX1BBUlRfTk9UX0ZPVU5EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19NSU1FX1BBUlRfTk9UX0ZPVU5EKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19PUEVSQVRJT05fTU9SRV9USEFOX09ORV9QQVJUX0lOX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcub3BlcmF0aW9uLk1vcmVUaGFuT25lUGFydEluTWVzc2FnZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZ29yaW5nIG9wZXJhdGlvbiAiezB9IjogbW9yZSB0aGFuIG9uZSBwYXJ0IGJvdW5kIHRvIGJvZHkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfT1BFUkFUSU9OX01PUkVfVEhBTl9PTkVfUEFSVF9JTl9NRVNTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX09QRVJBVElPTl9NT1JFX1RIQU5fT05FX1BBUlRfSU5fTUVTU0FHRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0pBVkFfUkVTRVJWRURfV09SRF9OT1RfQUxMT1dFRF9OT05fV1JBUFBFUl9TVFlMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLm5vbldyYXBwZXJTdHlsZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yaW5nIG9wZXJhdGlvbiAiezB9IiwgY2FuJyd0IGdlbmVyYXRlIGphdmEgbWV0aG9kLiBQYXJhbWV0ZXI6IHBhcnQgInsyfSIgaW4gd3NkbDptZXNzYWdlICJ7MX0iLCBpcyBhIGphdmEga2V5d29yZC4gVXNlIGN1c3RvbWl6YXRpb24gdG8gY2hhbmdlIHRoZSBwYXJhbWV0ZXIgbmFtZSBvciBjaGFuZ2UgdGhlIHdzZGw6cGFydCBuYW1lLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX05PTl9XUkFQUEVSX1NUWUxFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0pBVkFfUkVTRVJWRURfV09SRF9OT1RfQUxMT1dFRF9OT05fV1JBUFBFUl9TVFlMRShhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfRkFVTFRfQ0FOVF9SRVNPTFZFX01FU1NBR0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmZhdWx0LmNhbnQucmVzb2x2ZS5tZXNzYWdlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmF1bHQgbWVzc2FnZSAiezB9IiBpbiBiaW5kaW5nIG9wZXJhdGlvbiAiezF9IiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfRkFVTFRfQ0FOVF9SRVNPTFZFX01FU1NBR0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0ZBVUxUX0NBTlRfUkVTT0xWRV9NRVNTQUdFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX0VNUFRZX01FU1NBR0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdGYXVsdC5lbXB0eU1lc3NhZ2UiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmYXVsdCAiezB9IiByZWZlcnMgdG8gbWVzc2FnZSAiezF9IiwgYnV0IHRoZSBtZXNzYWdlIGhhcyBubyBwYXJ0cworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX0VNUFRZX01FU1NBR0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfRU1QVFlfTUVTU0FHRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1JQQ0xJVF9VTktPV05TQ0hFTUFUWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLnJwY2xpdC51bmtvd25zY2hlbWF0eXBlIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogWE1MIHR5cGUgInswfSIgY291bGQgbm90IGJlIHJlc29sdmVkLCBYTUwgdG8gSkFWQSBiaW5kaW5nIGZhaWxlZCEgUGxlYXNlIGNoZWNrIHRoZSB3c2RsOnBhcnQgInsxfSIgaW4gdGhlIHdzZGw6bWVzc2FnZSAiezJ9Ii4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1JQQ0xJVF9VTktPV05TQ0hFTUFUWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1JQQ0xJVF9VTktPV05TQ0hFTUFUWVBFKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSEVBREVSRkFVTFRfUEFSVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaGVhZGVyZmF1bHQucGFydC5ub3RGb3VuZCIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhcnQgInsxfSIgbm90IGZvdW5kIGZvciB0aGUgaGVhZGVyIGZhdWx0ICJ7MH0iLCBpbiBiaW5kaW5nICJ7Mn0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9IRUFERVJGQVVMVF9QQVJUX05PVF9GT1VORChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9IRUFERVJGQVVMVF9QQVJUX05PVF9GT1VORChhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfQk9EWV9QQVJUU19BVFRSSUJVVEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24uY2Fubm90SGFuZGxlQm9keVBhcnRzQXR0cmlidXRlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3Jpbmcgb3BlcmF0aW9uICJ7MH0iOiBjYW5ub3QgaGFuZGxlICJwYXJ0cyIgYXR0cmlidXRlIG9mICJzb2FwOmJvZHkiIGVsZW1lbnQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfQk9EWV9QQVJUU19BVFRSSUJVVEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfQk9EWV9QQVJUU19BVFRSSUJVVEUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX1NPQVBfQklORElOR19NSVhFRF9TVFlMRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ1NPQVBCaW5kaW5nLm1peGVkU3R5bGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBwb3J0ICJ7MH0iLCBpdHMgbm90IFdTLUkgQlAgMS4xIGNvbXBsaWFudDogdGhlIHdzZGwgYmluZGluZyBoYXMgbWl4ZWQgc3R5bGUsIGl0IG11c3QgYmUgcnBjLWxpdGVyYWwgb3IgZG9jdW1lbnQtbGl0ZXJhbCBvcGVyYXRpb24uIHRyeSBydW5uaW5nIHdzaW1wb3J0IHdpdGggLWV4dGVuc2lvbiBzd2l0Y2guCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX1NPQVBfQklORElOR19NSVhFRF9TVFlMRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19TT0FQX0JJTkRJTkdfTUlYRURfU1RZTEUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9NSVNTSU5HX1RZUEVfQVRUUklCVVRFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQubWlzc2luZ1R5cGVBdHRyaWJ1dGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNaXNzaW5nIHR5cGUgYXR0cmlidXRlIGluIG1pbWU6Y29udGVudCBpbiBvcGVyYXRpb24gInswfSIuIHBhcnQgYXR0cmlidXRlIG11c3QgYmUgcHJlc2VudCBpbiBtaW1lOmNvbnRlbnQgZGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9NSVNTSU5HX1RZUEVfQVRUUklCVVRFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9NSVNTSU5HX1RZUEVfQVRUUklCVVRFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fQ0FOTk9UX0hBTkRMRV9FTVBUWV9JTlBVVF9NRVNTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmNhbm5vdEhhbmRsZUVtcHR5SW5wdXRNZXNzYWdlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3Jpbmcgb3BlcmF0aW9uICJ7MH0iOiBpbnB1dCBtZXNzYWdlIGlzIGVtcHR5CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX0VNUFRZX0lOUFVUX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfRU1QVFlfSU5QVVRfTUVTU0FHRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfTk9fUE9SVFNfSU5fU0VSVklDRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5ub1BvcnRzSW5TZXJ2aWNlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmljZSAiezB9IiBkb2VzIG5vdCBjb250YWluIGFueSB1c2FibGUgcG9ydHMuIHRyeSBydW5uaW5nIHdzaW1wb3J0IHdpdGggLWV4dGVuc2lvbiBzd2l0Y2guCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX05PX1BPUlRTX0lOX1NFUlZJQ0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfTk9fUE9SVFNfSU5fU0VSVklDRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfUEFSQU1FVEVSX09SREVSX1RPT19NQU5ZX1VOTUVOVElPTkVEX1BBUlRTKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLnBhcmFtZXRlck9yZGVyLnRvb01hbnlVbm1lbnRpb25lZFBhcnRzIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbW9yZSB0aGFuIG9uZSBwYXJ0IGxlZnQgb3V0IGluIHRoZSBwYXJhbWV0ZXJPcmRlciBhdHRyaWJ1dGUgb2Ygb3BlcmF0aW9uICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX1BBUkFNRVRFUl9PUkRFUl9UT09fTUFOWV9VTk1FTlRJT05FRF9QQVJUUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9QQVJBTUVURVJfT1JERVJfVE9PX01BTllfVU5NRU5USU9ORURfUEFSVFMoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0lOUFVUX1NPQVBfQk9EWV9NSVNTSU5HX05BTUVTUEFDRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nT3BlcmF0aW9uLmlucHV0U29hcEJvZHkubWlzc2luZ05hbWVzcGFjZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlucHV0IG1lc3NhZ2Ugb2YgYmluZGluZyBvcGVyYXRpb24gInswfSIgbXVzdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIHRoZSAibmFtZXNwYWNlIiBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fSU5QVVRfU09BUF9CT0RZX01JU1NJTkdfTkFNRVNQQUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0lOUFVUX1NPQVBfQk9EWV9NSVNTSU5HX05BTUVTUEFDRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ0hlYWRlciIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIGhlYWRlciAiezB9IiBvZiBiaW5kaW5nIG9wZXJhdGlvbiAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19IRUFERVIoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUihhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1JFU1BPTlNFQkVBTl9OT1RGT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIucmVzcG9uc2ViZWFuLm5vdGZvdW5kIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogd3NpbXBvcnQgZmFpbGVkIHRvIGdlbmVyYXRlIGFzeW5jIHJlc3BvbnNlIGJlYW4gZm9yIG9wZXJhdGlvbjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9SRVNQT05TRUJFQU5fTk9URk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1JFU1BPTlNFQkVBTl9OT1RGT1VORChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSXzIwX1JQQ0VOQ19OT1RfU1VQUE9SVEVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIyMC5ycGNlbmMubm90LnN1cHBvcnRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJwYy9lbmNvZGVkIHdzZGwncyBhcmUgbm90IHN1cHBvcnRlZCBpbiBKQVhXUyAyLjAuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl8yMF9SUENFTkNfTk9UX1NVUFBPUlRFRCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSXzIwX1JQQ0VOQ19OT1RfU1VQUE9SVEVEKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9QQVJUX05PVF9GT1VORChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24ucGFydE5vdEZvdW5kIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3Jpbmcgb3BlcmF0aW9uICJ7MH0iOiBwYXJ0ICJ7MX0iIG5vdCBmb3VuZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fUEFSVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9QQVJUX05PVF9GT1VORChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfTUVTU0FHRV9QQVJUX01VU1RfSEFWRV9FTEVNRU5UX0RFU0NSSVBUT1IoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm1lc3NhZ2UucGFydE11c3RIYXZlRWxlbWVudERlc2NyaXB0b3IiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbiBtZXNzYWdlICJ7MH0iLCBwYXJ0ICJ7MX0iIG11c3Qgc3BlY2lmeSBhICJlbGVtZW50IiBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfTUVTU0FHRV9QQVJUX01VU1RfSEFWRV9FTEVNRU5UX0RFU0NSSVBUT1IoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX01FU1NBR0VfUEFSVF9NVVNUX0hBVkVfRUxFTUVOVF9ERVNDUklQVE9SKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfRVJST1JfUEFSVFNfTk9UX0ZPVU5EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuZXJyb3IucGFydHNOb3RGb3VuZCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhcnRzICJ7MH0iIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSAiezF9Iiwgd3JvbmcgV1NETAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfRVJST1JfUEFSVFNfTk9UX0ZPVU5EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfRVJST1JfUEFSVFNfTk9UX0ZPVU5EKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVF9OT1RfRU5DT0RFRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdGYXVsdC5ub3RFbmNvZGVkIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgbGl0ZXJhbCBmYXVsdCAiezB9IiBvZiBiaW5kaW5nIG9wZXJhdGlvbiAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVF9OT1RfRU5DT0RFRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfRkFVTFRfTk9UX0VOQ09ERUQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX1NUWUxFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLm5vdFN1cHBvcnRlZFN0eWxlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3Jpbmcgb3BlcmF0aW9uICJ7MH0iOiBub3QgcmVxdWVzdC1yZXNwb25zZSBvciBvbmUtd2F5CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX1NUWUxFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX1NUWUxFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9NRVNTQUdFX1BBUlRfTVVTVF9IQVZFX1RZUEVfREVTQ1JJUFRPUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQubWVzc2FnZS5wYXJ0TXVzdEhhdmVUeXBlRGVzY3JpcHRvciIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGluIG1lc3NhZ2UgInswfSIsIHBhcnQgInsxfSIgbXVzdCBzcGVjaWZ5IGEgInR5cGUiIGF0dHJpYnV0ZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9NRVNTQUdFX1BBUlRfTVVTVF9IQVZFX1RZUEVfREVTQ1JJUFRPUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfTUVTU0FHRV9QQVJUX01VU1RfSEFWRV9UWVBFX0RFU0NSSVBUT1IoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9NVUxUSVBMRV9PVVRQVVRfUEFSQU1FVEVSUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIubXVsdGlwbGVPdXRwdXRQYXJhbWV0ZXJzIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbXVsdGlwbGUgIm91dCIgcGFyYW1ldGVycyBpbiBvcGVyYXRpb246IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfTVVMVElQTEVfT1VUUFVUX1BBUkFNRVRFUlMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX01VTFRJUExFX09VVFBVVF9QQVJBTUVURVJTKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9NVUxUSVBMRV9QQVJUX0JJTkRJTkcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24ubXVsdGlwbGVQYXJ0QmluZGluZyIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFic3RyYWN0IG9wZXJhdGlvbiAiezB9IiBiaW5kaW5nLCBwYXJ0ICJ7MX0iIGhhcyBtdWx0aXBsZSBiaW5kaW5nLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9NVUxUSVBMRV9QQVJUX0JJTkRJTkcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX01VTFRJUExFX1BBUlRfQklORElORyhhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSUQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBXU0RMIGRvY3VtZW50CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9NVUxUSVBMRV9NQVRDSElOR19PUEVSQVRJT05TKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nT3BlcmF0aW9uLm11bHRpcGxlTWF0Y2hpbmdPcGVyYXRpb25zIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW4gYmluZGluZyAiezF9Iiwgb3BlcmF0aW9uICJ7MH0iIGRvZXMgbm90IHJlZmVyZW5jZSBhIHVuaXF1ZSBvcGVyYXRpb24gaW4gdGhlIGNvcnJlc3BvbmRpbmcgcG9ydCB0eXBlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX01VTFRJUExFX01BVENISU5HX09QRVJBVElPTlMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX01VTFRJUExFX01BVENISU5HX09QRVJBVElPTlMoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9OT05fVU5JUVVFX0JPRFkoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwgT2JqZWN0IGFyZzMpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLm5vblVuaXF1ZS5ib2R5IiwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9uIHVuaXF1ZSBib2R5IHBhcnRzISBJbiBhIHBvcnQsIG9wZXJhdGlvbnMgbXVzdCBoYXZlIHVuaXF1ZSBvcGVyYXRpb24gc2lnbmF1cmUgb24gdGhlIHdpcmUgZm9yIHN1Y2Nlc3NmdWwgZGlzcGF0Y2guIEluIHBvcnQgezB9LCBPcGVyYXRpb25zICJ7MX0iIGFuZCAiezJ9IiBoYXZlIHRoZSBzYW1lIHJlcXVlc3QgYm9keSBibG9jayB7M30KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX05PTl9VTklRVUVfQk9EWShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLCBPYmplY3QgYXJnMykgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfTk9OX1VOSVFVRV9CT0RZKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19IRUFERVJfQ0FOVF9SRVNPTFZFX01FU1NBR0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nSGVhZGVyLmNhbnQucmVzb2x2ZS5tZXNzYWdlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgaGVhZGVyICJ7MH0iIG9mIGJpbmRpbmcgb3BlcmF0aW9uICJ7MX0iOiBjYW5ub3QgcmVzb2x2ZSBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9DQU5UX1JFU09MVkVfTUVTU0FHRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX0NBTlRfUkVTT0xWRV9NRVNTQUdFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX0NVU1RPTUlaRURfT1BFUkFUSU9OX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLmN1c3RvbWl6ZWRPcGVyYXRpb25OYW1lIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3Jpbmcgb3BlcmF0aW9uICJ7MH0iLCBjYW4nJ3QgZ2VuZXJhdGUgamF2YSBtZXRob2QgLGN1c3RvbWl6ZWQgbmFtZSAiezF9IiBvZiB0aGUgd3NkbDpvcGVyYXRpb24gaXMgYSBqYXZhIGtleXdvcmQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfQ1VTVE9NSVpFRF9PUEVSQVRJT05fTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0pBVkFfUkVTRVJWRURfV09SRF9OT1RfQUxMT1dFRF9DVVNUT01JWkVEX09QRVJBVElPTl9OQU1FKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19IRUFERVJfTk9UX0xJVEVSQUwoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nSGVhZGVyLm5vdExpdGVyYWwiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBoZWFkZXIgInswfSIgb2YgYmluZGluZyBvcGVyYXRpb24gInsxfSI6IG5vdCBsaXRlcmFsCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9OT1RfTElURVJBTChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX05PVF9MSVRFUkFMKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9JTlBVVF9IRUFERVJfTUlTU0lOR19OQU1FU1BBQ0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24uaW5wdXRIZWFkZXIubWlzc2luZ05hbWVzcGFjZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlucHV0IGhlYWRlciAiezF9IiBvZiBiaW5kaW5nIG9wZXJhdGlvbiAiezB9IiBtdXN0IHNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlICJuYW1lc3BhY2UiIGF0dHJpYnV0ZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9JTlBVVF9IRUFERVJfTUlTU0lOR19OQU1FU1BBQ0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0lOUFVUX0hFQURFUl9NSVNTSU5HX05BTUVTUEFDRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fTUlTU0lOR19JTlBVVF9OQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24ubWlzc2luZ0lucHV0TmFtZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGJpbmRpbmcgb3BlcmF0aW9uICJ7MH0iIG11c3Qgc3BlY2lmeSBhIG5hbWUgZm9yIGl0cyBpbnB1dCBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX01JU1NJTkdfSU5QVVRfTkFNRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9NSVNTSU5HX0lOUFVUX05BTUUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX05PTl9TT0FQX1BPUlRfTk9fQUREUkVTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ05vblNPQVBQb3J0Lm5vQWRkcmVzcyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIHBvcnQgInswfSI6IG5vIFNPQVAgYWRkcmVzcyBzcGVjaWZpZWQuIHRyeSBydW5uaW5nIHdzaW1wb3J0IHdpdGggLWV4dGVuc2lvbiBzd2l0Y2guCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX05PTl9TT0FQX1BPUlRfTk9fQUREUkVTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19OT05fU09BUF9QT1JUX05PX0FERFJFU1MoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9SRVNVTFRfSVNfSU5fT1VUX1BBUkFNRVRFUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIucmVzdWx0SXNJbk91dFBhcmFtZXRlciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlc3VsdCBpcyAiaW5vdXQiIHBhcmFtZXRlciBpbiBvcGVyYXRpb246IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfUkVTVUxUX0lTX0lOX09VVF9QQVJBTUVURVIoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1JFU1VMVF9JU19JTl9PVVRfUEFSQU1FVEVSKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJfTk9UX0ZPVU5EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5oZWFkZXIubm90Rm91bmQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoZWFkZXIgInswfSIgb2YgYmluZGluZyBvcGVyYXRpb24gInsxfSI6IG5vdCBmb3VuZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJfTk9UX0ZPVU5EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJfTk9UX0ZPVU5EKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTUlNRU1PREVMRVJfRUxFTUVOVF9QQVJUX0lOVkFMSURfRUxFTUVOVF9NSU1FX1RZUEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtaW1lbW9kZWxlci5lbGVtZW50UGFydC5pbnZhbGlkRWxlbWVudE1pbWVUeXBlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1pbWU6Y29udGVudCBwYXJ0IHJlZmVycyB0byB3c2RsOnBhcnQgInswfSIsIGRlZmluZWQgdXNpbmcgZWxlbWVudCBhdHRyaWJ1dGUuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIG1pbWUgdHlwZTogInsxfSIgaXMgYXBwcm9wcmlhdGUgdG8gc2VyaWFsaXplIFhNTC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JTUVNT0RFTEVSX0VMRU1FTlRfUEFSVF9JTlZBTElEX0VMRU1FTlRfTUlNRV9UWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTUlNRU1PREVMRVJfRUxFTUVOVF9QQVJUX0lOVkFMSURfRUxFTUVOVF9NSU1FX1RZUEUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0hFQURFUl9OT1RfTElURVJBTChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuaGVhZGVyLm5vdExpdGVyYWwiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIGhlYWRlciAiezB9IiBvZiBiaW5kaW5nIG9wZXJhdGlvbiAiezF9Ijogbm90IGxpdGVyYWwKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfSEVBREVSX05PVF9MSVRFUkFMKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJfTk9UX0xJVEVSQUwoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9NRVNBR0VfUEFSVF9FTEVNRU5UX0tJTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1pbWVtb2RlbGVyLmludmFsaWRNaW1lQ29udGVudC5tZXNhZ2VQYXJ0RWxlbWVudEtpbmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3c2RsOnBhcnQgZWxlbWVudCByZWZlcmVuY2VkIGJ5IG1pbWU6Y29udGVudCBwYXJ0IGF0dHJpYnV0ZTogezB9IG11c3QgYmUgZGVmaW5lZCB1c2luZyB0eXBlIGF0dHJpYnV0ZSEKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9DT05URU5UX01FU0FHRV9QQVJUX0VMRU1FTlRfS0lORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTUlNRU1PREVMRVJfSU5WQUxJRF9NSU1FX0NPTlRFTlRfTUVTQUdFX1BBUlRfRUxFTUVOVF9LSU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fTk9UX0VOQ09ERUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24ubm90RW5jb2RlZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIFJQQy1zdHlsZSBvcGVyYXRpb24gInswfSI6IHBhcmFtZXRlcnMgYXJlIG5vdCBlbmNvZGVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9OT1RfRU5DT0RFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fTk9UX0VOQ09ERUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX05PTkNPTkZPUk1JTkdfV1NETF9UWVBFUygpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcubm9uY29uZm9ybWluZy53c2RsLnR5cGVzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9uIGNvbmZvcm1pbmcgV1MtSSBXU0RMIHVzZWQgZm9yIHdzZGw6dHlwZXMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfTk9OQ09ORk9STUlOR19XU0RMX1RZUEVTKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19OT05DT05GT1JNSU5HX1dTRExfVFlQRVMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfTU9SRV9USEFOX09ORV9QQVJUX0lOX0lOUFVUX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24uY2Fubm90SGFuZGxlTW9yZVRoYW5PbmVQYXJ0SW5JbnB1dE1lc3NhZ2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBvcGVyYXRpb24gInswfSI6IG1vcmUgdGhhbiBvbmUgcGFydCBpbiBpbnB1dCBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX01PUkVfVEhBTl9PTkVfUEFSVF9JTl9JTlBVVF9NRVNTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX01PUkVfVEhBTl9PTkVfUEFSVF9JTl9JTlBVVF9NRVNTQUdFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fQ0FOTk9UX0hBTkRMRV9FTVBUWV9PVVRQVVRfTUVTU0FHRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ09wZXJhdGlvbi5jYW5ub3RIYW5kbGVFbXB0eU91dHB1dE1lc3NhZ2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBvcGVyYXRpb24gInswfSI6IG91dHB1dCBtZXNzYWdlIGlzIGVtcHR5CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX0VNUFRZX09VVFBVVF9NRVNTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX0VNUFRZX09VVFBVVF9NRVNTQUdFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19SXzI3MTZfUl8yNzI2KE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5yMjcxNnIyNzI2IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUjI3MTYvUjI3MjYgV1NJLUJhc2ljUHJvZmlsZSB2ZXIuIDEuMCwgbmFtZXNwYWNlIGF0dHJpYnV0ZSBub3QgYWxsb3dlZCBpbiBkb2MvbGl0IG9yIHJwYy9saXQgZm9yIHswfTogInsxfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfUl8yNzE2X1JfMjcyNihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfUl8yNzE2X1JfMjcyNihhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfTk9fU09BUF9BRERSRVNTKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLm5vU09BUEFkZHJlc3MiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwb3J0ICJ7MH0iIGlzIG5vdCBhIFNPQVAgcG9ydCwgaXQgaGFzIG5vIHNvYXA6YWRkcmVzcworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19OT19TT0FQX0FERFJFU1MoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfTk9fU09BUF9BRERSRVNTKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVFMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdGYXVsdHMiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBmYXVsdHMgZGVjbGFyZWQgYnkgb3BlcmF0aW9uICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0ZBVUxUUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVFMoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfTUlTU0lOR19OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nRmF1bHQubWlzc2luZ05hbWUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmYXVsdCAiezB9IiBpbiBvcGVyYXRpb24gInsxfSIgbXVzdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIHRoZSAibmFtZSIgYXR0cmlidXRlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfTUlTU0lOR19OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX01JU1NJTkdfTkFNRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1JTUVNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdJTlZBTElEX0hFQURFUl9QQVJUX05PVF9ERUNMQVJFRF9JTl9ST09UX1BBUlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1pbWVtb2RlbGVyLndhcm5pbmcuSWdub3JpbmdpbnZhbGlkSGVhZGVyUGFydC5ub3REZWNsYXJlZEluUm9vdFBhcnQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWFkZXJzIG5vdCBpbiByb290IG1pbWU6cGFydCB3aXRoIHNvYXA6Ym9keSwgaWdub3JpbmcgaGVhZGVycyBpbiBvcGVyYXRpb24gInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JTUVNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdJTlZBTElEX0hFQURFUl9QQVJUX05PVF9ERUNMQVJFRF9JTl9ST09UX1BBUlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1JTUVNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdJTlZBTElEX0hFQURFUl9QQVJUX05PVF9ERUNMQVJFRF9JTl9ST09UX1BBUlQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9FUlJPUl9MT0FESU5HX0pBVkFfQ0xBU1MoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQuZXJyb3JMb2FkaW5nSmF2YUNsYXNzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ291bGRuJ3QgZmluZCBjbGFzcyAiezB9IiBmb3IgbWltZSB0eXBlICJ7MX0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9FUlJPUl9MT0FESU5HX0pBVkFfQ0xBU1MoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9FUlJPUl9MT0FESU5HX0pBVkFfQ0xBU1MoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fTk9UX0lOX1BPUlRfVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ09wZXJhdGlvbi5ub3RJblBvcnRUeXBlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW4gYmluZGluZyAiezF9Iiwgb3BlcmF0aW9uICJ7MH0iIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgY29ycmVzcG9uZGluZyBwb3J0IHR5cGUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fTk9UX0lOX1BPUlRfVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fTk9UX0lOX1BPUlRfVFlQRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NPTkZMSUNUX1NUWUxFX0lOX1dTSV9NT0RFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmNvbmZsaWN0U3R5bGVJbldTSU1vZGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBvcGVyYXRpb24gInswfSI6IGJpbmRpbmcgc3R5bGUgYW5kIG9wZXJhdGlvbiBzdHlsZSBhcmUgY29uZmxpY3RpbmcKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NPTkZMSUNUX1NUWUxFX0lOX1dTSV9NT0RFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DT05GTElDVF9TVFlMRV9JTl9XU0lfTU9ERShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9DT05URU5UX01JU1NJTkdfUEFSVF9BVFRSSUJVVEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1pbWVtb2RlbGVyLmludmFsaWRNaW1lQ29udGVudC5taXNzaW5nUGFydEF0dHJpYnV0ZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yaW5nIG9wZXJhdGlvbiAiezB9IiwgbWlzc2luZyBwYXJ0IGF0dHJpYnV0ZSBpbiBtaW1lOmNvbnRlbnQuIHBhcnQgYXR0cmlidXRlIG11c3QgYmUgcHJlc2VudCBpbiBtaW1lOmNvbnRlbnQgZGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9NSVNTSU5HX1BBUlRfQVRUUklCVVRFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9NSVNTSU5HX1BBUlRfQVRUUklCVVRFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19TRUFSQ0hfU0NIRU1BX1VOUkVDT0dOSVpFRF9UWVBFUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5zZWFyY2hTY2hlbWEudW5yZWNvZ25pemVkVHlwZXMiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbmNvdW50ZXJlZCB7MH0gdW5yZWNvZ25pemVkIHR5cGUocykKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfU0VBUkNIX1NDSEVNQV9VTlJFQ09HTklaRURfVFlQRVMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfU0VBUkNIX1NDSEVNQV9VTlJFQ09HTklaRURfVFlQRVMoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfQ1VTVE9NSVpFRF9PUEVSQVRJT05fTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLmN1c3RvbWl6ZWRPcGVyYXRpb25OYW1lIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBvcGVyYXRpb24gInswfSIsIGNhbicndCBnZW5lcmF0ZSBqYXZhIG1ldGhvZCAsY3VzdG9taXplZCBuYW1lICJ7MX0iIG9mIHRoZSB3c2RsOm9wZXJhdGlvbiBpcyBhIGphdmEga2V5d29yZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfT1BFUkFUSU9OX0pBVkFfUkVTRVJWRURfV09SRF9OT1RfQUxMT1dFRF9DVVNUT01JWkVEX09QRVJBVElPTl9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX0NVU1RPTUlaRURfT1BFUkFUSU9OX05BTUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0hFQURFUl9DQU5UX1JFU09MVkVfTUVTU0FHRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuaGVhZGVyLmNhbnQucmVzb2x2ZS5tZXNzYWdlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGVhZGVyICJ7MH0iIG9mIGJpbmRpbmcgb3BlcmF0aW9uICJ7MX0iOiBjYW5ub3QgcmVzb2x2ZSBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0hFQURFUl9DQU5UX1JFU09MVkVfTUVTU0FHRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfSEVBREVSX0NBTlRfUkVTT0xWRV9NRVNTQUdFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX01JU1NJTkdfTkFNRVNQQUNFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nRmF1bHQubWlzc2luZ05hbWVzcGFjZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZhdWx0ICJ7MH0iIGluIG9wZXJhdGlvbiAiezF9IiBtdXN0IHNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlICJuYW1lc3BhY2UiIGF0dHJpYnV0ZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX01JU1NJTkdfTkFNRVNQQUNFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX01JU1NJTkdfTkFNRVNQQUNFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTUlNRU1PREVMRVJfSU5WQUxJRF9NSU1FX1BBUlRfTU9SRV9USEFOX09ORV9TT0FQX0JPRFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm1pbWVtb2RlbGVyLmludmFsaWRNaW1lUGFydC5tb3JlVGhhbk9uZVNPQVBCb2R5IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3Jpbmcgb3BlcmF0aW9uICJ7MH0iLiBUaGUgTXVsdGlwYXJ0L1JlbGF0ZWQgc3RydWN0dXJlIGhhcyBpbnZhbGlkIHJvb3QgcGFydDogbW9yZSB0aGFuIG9uZSBzb2FwOmJvZHkgcGFydHMgZm91bmQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9QQVJUX01PUkVfVEhBTl9PTkVfU09BUF9CT0RZKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfUEFSVF9NT1JFX1RIQU5fT05FX1NPQVBfQk9EWShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX0lOQ09OU0lTVEVOVF9ERUZJTklUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ0hlYWRlci5pbmNvbnNpc3RlbnREZWZpbml0aW9uIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgaGVhZGVyICJ7MH0iIG9mIG9wZXJhdGlvbiAiezF9IjogcGFydCBub3QgZm91bmQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX0lOQ09OU0lTVEVOVF9ERUZJTklUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19IRUFERVJfSU5DT05TSVNURU5UX0RFRklOSVRJT04oYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfTk9UX0ZPVU5EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nRmF1bHQubm90Rm91bmQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmYXVsdCAiezB9IiBpbiBvcGVyYXRpb24gInsxfSIgZG9lcyBub3QgbWF0Y2ggYW55IGZhdWx0IGluIHRoZSBjb3JyZXNwb25kaW5nIHBvcnQgdHlwZSBvcGVyYXRpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19GQVVMVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfTk9UX0ZPVU5EKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fSkFWQV9SRVNFUlZFRF9XT1JEX05PVF9BTExPV0VEX0NVU1RPTV9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ09wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC5jdXN0b21OYW1lIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3Jpbmcgb3BlcmF0aW9uICJ7MH0iLCBjYW4nJ3QgZ2VuZXJhdGUgamF2YSBtZXRob2QuIFBhcmFtZXRlcixjdXN0b21pemVkIG5hbWUgInsxfSIgaXMgYSBqYXZhIGtleXdvcmQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfQ1VTVE9NX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfQ1VTVE9NX05BTUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX1VOUkVDT0dOSVpFRF9TQ0hFTUFfRVhURU5TSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nVW5yZWNvZ25pemVkU2NoZW1hRXh0ZW5zaW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3Jpbmcgc2NoZW1hIGVsZW1lbnQgKHVuc3VwcG9ydGVkIHZlcnNpb24pOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfVU5SRUNPR05JWkVEX1NDSEVNQV9FWFRFTlNJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfVU5SRUNPR05JWkVEX1NDSEVNQV9FWFRFTlNJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9GQVVMVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ0hlYWRlckZhdWx0Lm5vdEZvdW5kIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgaGVhZGVyIGZhdWx0ICJ7MH0iLCBjYW5ub3QgZmluZCBwYXJ0ICJ7MX0iIGluIGJpbmRpbmcgInsyfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX0ZBVUxUX05PVF9GT1VORChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9GQVVMVF9OT1RfRk9VTkQoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfV1JBUFBFUl9TVFlMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLm9wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC53cmFwcGVyU3R5bGUiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIG9wZXJhdGlvbiAiezB9IiwgY2FuJyd0IGdlbmVyYXRlIGphdmEgbWV0aG9kIHBhcmFtZXRlci4gTG9jYWwgbmFtZSBvZiB0aGUgd3JhcHBlciBjaGlsZCAiezF9IiBpbiB0aGUgZ2xvYmFsIGVsZW1lbnQgInsyfSIgaXMgYSBqYXZhIGtleXdvcmQuIFVzZSBjdXN0b21pemF0aW9uIHRvIGNoYW5nZSB0aGUgcGFyYW1ldGVyIG5hbWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfV1JBUFBFUl9TVFlMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfV1JBUFBFUl9TVFlMRShhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9DT05URU5UX1VOS05PV05fU0NIRU1BX1RZUEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQudW5rbm93blNjaGVtYVR5cGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmtub3duIHNjaGVtYSB0eXBlOiB7MX0gZm9yIG1pbWU6Y29udGVudCBwYXJ0OiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JTUVNT0RFTEVSX0lOVkFMSURfTUlNRV9DT05URU5UX1VOS05PV05fU0NIRU1BX1RZUEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVNSU1FTU9ERUxFUl9JTlZBTElEX01JTUVfQ09OVEVOVF9VTktOT1dOX1NDSEVNQV9UWVBFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19SXzI3MTYoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLnIyNzE2IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUjI3MTYgV1NJLUJhc2ljUHJvZmlsZSB2ZXIuIDEuMCwgbmFtZXNwYWNlIGF0dHJpYnV0ZSBub3QgYWxsb3dlZCBpbiBkb2MvbGl0IGZvciB7MH06ICJ7MX0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX1JfMjcxNihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfUl8yNzE2KGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19IRUFERVJfTk9UX0ZPVU5EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ0hlYWRlci5ub3RGb3VuZCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIGhlYWRlciAiezB9IiBvZiBiaW5kaW5nIG9wZXJhdGlvbiAiezF9Ijogbm90IGZvdW5kCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9OT1RfRk9VTkQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9OT1RfRk9VTkQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX1RZUEVfTUVTU0FHRV9QQVJUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmNhbm5vdEhhbmRsZVR5cGVNZXNzYWdlUGFydCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIG9wZXJhdGlvbiAiezB9IjogbWVzc2FnZSBwYXJ0IGRvZXMgbm90IHJlZmVyIHRvIGEgc2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfVFlQRV9NRVNTQUdFX1BBUlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfVFlQRV9NRVNTQUdFX1BBUlQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX1BBUkFNRVRFUl9PUkRFUl9JTlZBTElEX1BBUkFNRVRFUl9PUkRFUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5wYXJhbWV0ZXJPcmRlci5pbnZhbGlkUGFyYW1ldGVyT3JkZXIiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwYXJhbWV0ZXJPcmRlciBhdHRyaWJ1dGUgb24gb3BlcmF0aW9uICJ7MH0iIGlzIGludmFsaWQsIGlnbm9yaW5nIHBhcmFtZXRlck9yZGVyIGhpbnQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfUEFSQU1FVEVSX09SREVSX0lOVkFMSURfUEFSQU1FVEVSX09SREVSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX1BBUkFNRVRFUl9PUkRFUl9JTlZBTElEX1BBUkFNRVRFUl9PUkRFUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fTUlTU0lOR19PVVRQVVRfTkFNRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nT3BlcmF0aW9uLm1pc3NpbmdPdXRwdXROYW1lIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYmluZGluZyBvcGVyYXRpb24gInswfSIgbXVzdCBzcGVjaWZ5IGEgbmFtZSBmb3IgaXRzIG91dHB1dCBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX01JU1NJTkdfT1VUUFVUX05BTUUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fTUlTU0lOR19PVVRQVVRfTkFNRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfT1BFUkFUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkT3BlcmF0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBvcGVyYXRpb246IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfT1BFUkFUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9PVVRQVVRfSEVBREVSX01JU1NJTkdfTkFNRVNQQUNFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5iaW5kaW5nT3BlcmF0aW9uLm91dHB1dEhlYWRlci5taXNzaW5nTmFtZXNwYWNlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogb3V0cHV0IGhlYWRlciAiezF9IiBvZiBiaW5kaW5nIG9wZXJhdGlvbiAiezB9IiBtdXN0IHNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlICJuYW1lc3BhY2UiIGF0dHJpYnV0ZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9PVVRQVVRfSEVBREVSX01JU1NJTkdfTkFNRVNQQUNFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9PVVRQVVRfSEVBREVSX01JU1NJTkdfTkFNRVNQQUNFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19IRUFERVJfUEFSVF9GUk9NX0JPRFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdIZWFkZXIucGFydEZyb21Cb2R5IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGVhZGVyIHBhcnQ6ICJ7MH0iIGFscmVhZHkgYm91bmQgYnkgc29hcGJpbmQ6Ym9keSwgaWxsZWdhbCB0byBiaW5kIHRoZSBwYXJ0IHR3aWNlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9QQVJUX0ZST01fQk9EWShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19IRUFERVJfUEFSVF9GUk9NX0JPRFkoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX1NUWUxFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5vcGVyYXRpb24ubm90U3VwcG9ydGVkU3R5bGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIFdTREwsIHdzZGw6b3BlcmF0aW9uICJ7MH0iIGluIHdzZGw6cG9ydFR5cGUgInsxfSI6IG5vdCByZXF1ZXN0LXJlc3BvbnNlIG9yIG9uZS13YXkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfU1RZTEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX1NUWUxFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fTk9UX05DX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLm5vdE5DTmFtZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yaW5nIG9wZXJhdGlvbiAiezB9IiwgaXQgaGFzIGlsbGVnYWwgY2hhcmFjdGVyICcnezF9JycgaW4gaXRzIG5hbWUuIEl0cyBycGMtbGl0ZXJhbCBvcGVyYXRpb24gLSBqYXh3cyB3b24ndCBiZSBhYmxlIHRvIHNlcmlhbGl6ZSBpdCEKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX05PVF9OQ19OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fTk9UX05DX05BTUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX1BBUkFNRVRFUl9ESUZGRVJFTlRfVFlQRVMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLnBhcmFtZXRlci5kaWZmZXJlbnRUeXBlcyIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhcmFtZXRlciAiezB9IiBvZiBvcGVyYXRpb24gInsxfSIgYXBwZWFycyB3aXRoIGRpZmZlcmVudCB0eXBlcyBpbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9QQVJBTUVURVJfRElGRkVSRU5UX1RZUEVTKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9QQVJBTUVURVJfRElGRkVSRU5UX1RZUEVTKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVF9ET0NVTUVOVF9PUEVSQVRJT04oT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nRmF1bHQuZG9jdW1lbnRPcGVyYXRpb24iLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBmYXVsdCAiezB9IiBvZiBkb2N1bWVudC1zdHlsZSBvcGVyYXRpb24gInsxfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfRkFVTFRfRE9DVU1FTlRfT1BFUkFUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19GQVVMVF9ET0NVTUVOVF9PUEVSQVRJT04oYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX05PTkNPTkZPUk1JTkdfV1NETF9VU0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcubm9uY29uZm9ybWluZy53c2RsLnVzZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3NpbmcgV1MtSSBub24gY29uZm9ybWluZyBvcGVyYXRpb24gInswfSIgd2l0aCBSUEMtU3R5bGUgYW5kIFNPQVAtZW5jb2RlZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfV0FSTklOR19OT05DT05GT1JNSU5HX1dTRExfVVNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX05PTkNPTkZPUk1JTkdfV1NETF9VU0UoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX05PTl9TT0FQX1BPUlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcubm9uU09BUFBvcnQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwb3J0ICJ7MH0iOiBub3QgYSBzdGFuZGFyZCBTT0FQIHBvcnQuIFRoZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzIG1heSBub3Qgd29yayB3aXRoIEpBWFdTIHJ1bnRpbWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX05PTl9TT0FQX1BPUlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfTk9OX1NPQVBfUE9SVChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfSEVBREVSRkFVTFRfTUVTU0FHRV9QQVJUX01VU1RfSEFWRV9FTEVNRU5UX0RFU0NSSVBUT1IoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIuaW52YWxpZC5oZWFkZXJmYXVsdC5tZXNzYWdlLnBhcnRNdXN0SGF2ZUVsZW1lbnREZXNjcmlwdG9yIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBoZWFkZXJmYXVsdCAiezB9IiBmb3IgaGVhZGVyIHsxfSBpbiBvcGVyYXRpb24gezJ9OiBwYXJ0IG11c3Qgc3BlY2lmeSBhICJlbGVtZW50IiBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfSEVBREVSRkFVTFRfTUVTU0FHRV9QQVJUX01VU1RfSEFWRV9FTEVNRU5UX0RFU0NSSVBUT1IoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9IRUFERVJGQVVMVF9NRVNTQUdFX1BBUlRfTVVTVF9IQVZFX0VMRU1FTlRfREVTQ1JJUFRPUihhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfU1RBVEVfTU9ERUxJTkdfT1BFUkFUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkU3RhdGUubW9kZWxpbmdPcGVyYXRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIHN0YXRlIHdoaWxlIG1vZGVsaW5nIG9wZXJhdGlvbjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9JTlZBTElEX1NUQVRFX01PREVMSU5HX09QRVJBVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9TVEFURV9NT0RFTElOR19PUEVSQVRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfT1BFUkFUSU9OX05BTUUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdPcGVyYXRpb24uamF2YVJlc2VydmVkV29yZE5vdEFsbG93ZWQub3BlcmF0aW9uTmFtZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yaW5nIG9wZXJhdGlvbiAiezB9IiwgaXQnJ3MgamF2YSByZXNlcnZlZCB3b3JkLCBjYW4nJ3QgZ2VuZXJhdGUgamF2YSBtZXRob2QuIFVzZSBjdXN0b21pemF0aW9uIHRvIGNoYW5nZSB0aGUgb3BlcmF0aW9uIG5hbWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfT1BFUkFUSU9OX05BTUUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0pBVkFfUkVTRVJWRURfV09SRF9OT1RfQUxMT1dFRF9PUEVSQVRJT05fTkFNRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX05PVF9FTkNPREVEKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ0hlYWRlci5ub3RFbmNvZGVkIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgaGVhZGVyICJ7MH0iIG9mIGJpbmRpbmcgb3BlcmF0aW9uICJ7MX0iOiBub3QgU09BUC1lbmNvZGVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9OT1RfRU5DT0RFRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX05PVF9FTkNPREVEKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfRFVQTElDQVRFX0ZBVUxUX1BBUlRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5kdXBsaWNhdGUuZmF1bHQucGFydC5uYW1lIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgZmF1bHQgInswfSIgb2Ygb3BlcmF0aW9uICJ7MX0iLCBwYXJ0IG5hbWUgInsyfSIgaXMgbm90IHVuaXF1ZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfRFVQTElDQVRFX0ZBVUxUX1BBUlRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9EVVBMSUNBVEVfRkFVTFRfUEFSVF9OQU1FKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETE1PREVMRVJfSU5WQUxJRF9PUEVSQVRJT05fTU9SRV9USEFOX09ORV9QQVJUX0lOX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQub3BlcmF0aW9uLk1vcmVUaGFuT25lUGFydEluTWVzc2FnZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIG9wZXJhdGlvbiAiezB9IjogbW9yZSB0aGFuIG9uZSBwYXJ0IGJvdW5kIHRvIGJvZHkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfT1BFUkFUSU9OX01PUkVfVEhBTl9PTkVfUEFSVF9JTl9NRVNTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX09QRVJBVElPTl9NT1JFX1RIQU5fT05FX1BBUlRfSU5fTUVTU0FHRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfU09BUF9CSU5ESU5HXzEyKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nU09BUEJpbmRpbmcxMiIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yaW5nIFNPQVAgcG9ydCAiezB9IjogaXQgdXNlcyBub24tc3RhbmRhcmQgU09BUCAxLjIgYmluZGluZy4KKyAgICAgKiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSAiLWV4dGVuc2lvbiIgb3B0aW9uIHRvIHVzZSB0aGlzIGJpbmRpbmcuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX1NPQVBfQklORElOR18xMihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19TT0FQX0JJTkRJTkdfMTIoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfTk9UX1VOSVFVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLmludmFsaWQuYmluZGluZ0ZhdWx0Lm5vdFVuaXF1ZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZhdWx0ICJ7MH0iIGluIG9wZXJhdGlvbiAiezF9IiBtYXRjaGVzIG1vcmUgdGhhbiBvbmUgZmF1bHQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcG9ydCB0eXBlIG9wZXJhdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETE1PREVMRVJfSU5WQUxJRF9CSU5ESU5HX0ZBVUxUX05PVF9VTklRVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfRkFVTFRfTk9UX1VOSVFVRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fT1VUUFVUX01JU1NJTkdfU09BUF9CT0RZKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci5pbnZhbGlkLmJpbmRpbmdPcGVyYXRpb24ub3V0cHV0TWlzc2luZ1NvYXBCb2R5IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogb3V0cHV0IG1lc3NhZ2Ugb2YgYmluZGluZyBvcGVyYXRpb24gInswfSIgZG9lcyBub3QgaGF2ZSBhIFNPQVAgYm9keSBleHRlbnNpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExNT0RFTEVSX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fT1VUUFVUX01JU1NJTkdfU09BUF9CT0RZKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX09VVFBVVF9NSVNTSU5HX1NPQVBfQk9EWShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfSEVBREVSX0ZBVUxUX05PVF9MSVRFUkFMKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdIZWFkZXJGYXVsdC5ub3RMaXRlcmFsIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgaGVhZGVyIGZhdWx0IHBhcnQ9InswfSIgbWVzc2FnZT0iezF9IiBvZiBvcGVyYXRpb24gezJ9LCB1c2UgYXR0cmlidXRlIE1VU1QgYmUgImxpdGVyYWwiCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9GQVVMVF9OT1RfTElURVJBTChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX0hFQURFUl9GQVVMVF9OT1RfTElURVJBTChhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1dBUk5JTkdfSUdOT1JJTkdfT1BFUkFUSU9OX0NBTk5PVF9IQU5ETEVfTU9SRV9USEFOX09ORV9QQVJUX0lOX09VVFBVVF9NRVNTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmNhbm5vdEhhbmRsZU1vcmVUaGFuT25lUGFydEluT3V0cHV0TWVzc2FnZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlnbm9yaW5nIG9wZXJhdGlvbiAiezB9IjogbW9yZSB0aGFuIG9uZSBwYXJ0IGluIG91dHB1dCBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9DQU5OT1RfSEFORExFX01PUkVfVEhBTl9PTkVfUEFSVF9JTl9PVVRQVVRfTUVTU0FHRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19JR05PUklOR19PUEVSQVRJT05fQ0FOTk9UX0hBTkRMRV9NT1JFX1RIQU5fT05FX1BBUlRfSU5fT1VUUFVUX01FU1NBR0UoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX05PX09QRVJBVElPTlNfSU5fUE9SVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIud2FybmluZy5ub09wZXJhdGlvbnNJblBvcnQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3J0ICJ7MH0iIGRvZXMgbm90IGNvbnRhaW4gYW55IHVzYWJsZSBvcGVyYXRpb25zCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX05PX09QRVJBVElPTlNfSU5fUE9SVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETE1PREVMRVJfV0FSTklOR19OT19PUEVSQVRJT05TX0lOX1BPUlQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfV1JBUFBFUl9TVFlMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLmphdmFSZXNlcnZlZFdvcmROb3RBbGxvd2VkLndyYXBwZXJTdHlsZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yaW5nIG9wZXJhdGlvbiAiezB9IiwgY2FuJyd0IGdlbmVyYXRlIGphdmEgbWV0aG9kIHBhcmFtZXRlci4gTG9jYWwgbmFtZSBvZiB0aGUgd3JhcHBlciBjaGlsZCAiezF9IiBpbiB0aGUgZ2xvYmFsIGVsZW1lbnQgInsyfSIgaXMgYSBqYXZhIGtleXdvcmQuIFVzZSBjdXN0b21pemF0aW9uIHRvIGNoYW5nZSB0aGUgcGFyYW1ldGVyIG5hbWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfV1JBUFBFUl9TVFlMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMTU9ERUxFUl9XQVJOSU5HX0lHTk9SSU5HX09QRVJBVElPTl9KQVZBX1JFU0VSVkVEX1dPUkRfTk9UX0FMTE9XRURfV1JBUFBFUl9TVFlMRShhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1VOU09MVkFCTEVfTkFNSU5HX0NPTkZMSUNUUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbG1vZGVsZXIudW5zb2x2YWJsZU5hbWluZ0NvbmZsaWN0cyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoZSBmb2xsb3dpbmcgbmFtaW5nIGNvbmZsaWN0cyBvY2N1cnJlZDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMTU9ERUxFUl9VTlNPTFZBQkxFX05BTUlOR19DT05GTElDVFMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExNT0RFTEVSX1VOU09MVkFCTEVfTkFNSU5HX0NPTkZMSUNUUyhhcmcwKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9Qcm9jZXNzb3JNZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvUHJvY2Vzc29yTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ2YmIxCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvUHJvY2Vzc29yTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFByb2Nlc3Nvck1lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMucHJvY2Vzc29yIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQUk9DRVNTT1JfTUlTU0lOR19NT0RFTCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInByb2Nlc3Nvci5taXNzaW5nLm1vZGVsIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogbW9kZWwgaXMgbWlzc2luZworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPQ0VTU09SX01JU1NJTkdfTU9ERUwoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQUk9DRVNTT1JfTUlTU0lOR19NT0RFTCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1V0aWxNZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvVXRpbE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlOWVlZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1V0aWxNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXM7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKKworCisvKioKKyAqIERlZmluZXMgc3RyaW5nIGZvcm1hdHRpbmcgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGluIHRoZSByZXNvdXJjZSBmaWxlCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVXRpbE1lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMudXRpbCIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0FYXzJfRE9NX05PVFNVUFBPUlRFRF9DUkVBVEVFTEVNRU5UKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzYXgyZG9tLm5vdHN1cHBvcnRlZC5jcmVhdGVlbGVtZW50IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU0FYMkRPTUV4LkRvbUltcGxEb2VzbnRTdXBwb3J0Q3JlYXRlRWxlbWVudE5zOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNBWF8yX0RPTV9OT1RTVVBQT1JURURfQ1JFQVRFRUxFTUVOVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU0FYXzJfRE9NX05PVFNVUFBPUlRFRF9DUkVBVEVFTEVNRU5UKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTlVMTF9OQU1FU1BBQ0VfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm51bGwubmFtZXNwYWNlLmZvdW5kIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb3VudGVyZWQgZXJyb3IgaW4gd3NkbC4gQ2hlY2sgbmFtZXNwYWNlIG9mIGVsZW1lbnQgPHswfT4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfTkFNRVNQQUNFX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVOVUxMX05BTUVTUEFDRV9GT1VORChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUhPTERFUl9WQUxVRUZJRUxEX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaG9sZGVyLnZhbHVlZmllbGQubm90LmZvdW5kIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ291bGQgbm90IGZpbmQgdGhlIGZpZWxkIGluIHRoZSBIb2xkZXIgdGhhdCBjb250YWlucyB0aGUgSG9sZGVyJydzIHZhbHVlOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhPTERFUl9WQUxVRUZJRUxEX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSE9MREVSX1ZBTFVFRklFTERfTk9UX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1dlYnNlcnZpY2VhcE1lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9XZWJzZXJ2aWNlYXBNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjYxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9XZWJzZXJ2aWNlYXBNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsODkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdlYnNlcnZpY2VhcE1lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMud2Vic2VydmljZWFwIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfUlBDX0xJVEVSQUxfTVVTVF9OT1RfQkVfQkFSRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLnJwYy5saXRlcmFsLm11c3Qubm90LmJlLmJhcmUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSUEMgbGl0ZXJhbCBTT0FQQmluZGluZ3MgbXVzdCBoYXZlIHBhcmFtZXRlclN0eWxlIFdSQVBQUEVELiBDbGFzczogezB9LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX1JQQ19MSVRFUkFMX01VU1RfTk9UX0JFX0JBUkUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9SUENfTElURVJBTF9NVVNUX05PVF9CRV9CQVJFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0lOVkFMSURfU0VJX0FOTk9UQVRJT05fRUxFTUVOVF9FWENMVURFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5pbnZhbGlkLnNlaS5hbm5vdGF0aW9uLmVsZW1lbnQuZXhjbHVkZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBAamF2YXguandzLldlYk1ldGhvZCh7MH0pIGNhbm5vdCBiZSB1c2VkIG9uIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIENsYXNzOiB7MX0gbWV0aG9kOiB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9JTlZBTElEX1NFSV9BTk5PVEFUSU9OX0VMRU1FTlRfRVhDTFVERShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5WQUxJRF9TRUlfQU5OT1RBVElPTl9FTEVNRU5UX0VYQ0xVREUoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9DTEFTU19JU19JTk5FUkNMQVNTX05PVF9TVEFUSUMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC53ZWJzZXJ2aWNlLmNsYXNzLmlzLmlubmVyY2xhc3Mubm90LnN0YXRpYyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIElubmVyIGNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIG11c3QgYmUgc3RhdGljLiBDbGFzczogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9DTEFTU19JU19JTk5FUkNMQVNTX05PVF9TVEFUSUMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX0NMQVNTX0lTX0lOTkVSQ0xBU1NfTk9UX1NUQVRJQyhhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX01FVEhPRF9JU19BQlNUUkFDVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC53ZWJzZXJ2aWNlLm1ldGhvZC5pcy5hYnN0cmFjdCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzZXMgYW5ub3RhdGVkIHdpdGggQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIG11c3Qgbm90IGhhdmUgYWJzdHJhY3QgbWV0aG9kcy4gQ2xhc3M6IHswfSBNZXRob2Q6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfTUVUSE9EX0lTX0FCU1RSQUNUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfTUVUSE9EX0lTX0FCU1RSQUNUKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX09ORVdBWV9PUEVSQVRJT05fQ0FOTk9UX0hBVkVfUkVUVVJOX1RZUEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAub25ld2F5Lm9wZXJhdGlvbi5jYW5ub3QuaGF2ZS5yZXR1cm4udHlwZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2QgezF9IG9mIGNsYXNzIHswfSBpcyBhbm5vdGF0ZWQgQE9uZXdheSBidXQgaGFzIGEgcmV0dXJuIHR5cGUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfT05FV0FZX09QRVJBVElPTl9DQU5OT1RfSEFWRV9SRVRVUk5fVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9PTkVXQVlfT1BFUkFUSU9OX0NBTk5PVF9IQVZFX1JFVFVSTl9UWVBFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1dBUk5JTkcoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC53YXJuaW5nIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogd2FybmluZzogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfV0FSTklORyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1dBUk5JTkcoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfUlBDX1NPQVBCSU5ESU5HX05PVF9BTExPV0VEX09OX01FVEhPRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5ycGMuc29hcGJpbmRpbmcubm90LmFsbG93ZWQub24ubWV0aG9kIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU09BUEJpbmRpbmcuU3R5bGUuUlBDIGJpbmRpbmcgYW5ub3RhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIG9uIG1ldGhvZHMuICBDbGFzczogezB9IE1ldGhvZDogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfUlBDX1NPQVBCSU5ESU5HX05PVF9BTExPV0VEX09OX01FVEhPRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9SUENfU09BUEJJTkRJTkdfTk9UX0FMTE9XRURfT05fTUVUSE9EKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0NPVUxEX05PVF9GSU5EX0hBTkRMRVJDSEFJTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5jb3VsZC5ub3QuZmluZC5oYW5kbGVyY2hhaW4iLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3VsZCBub3QgZmluZCB0aGUgaGFuZGxlcmNoYWluIHswfSBpbiB0aGUgaGFuZGxlciBmaWxlIHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0NPVUxEX05PVF9GSU5EX0hBTkRMRVJDSEFJTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9DT1VMRF9OT1RfRklORF9IQU5ETEVSQ0hBSU4oYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTk9fUEFDS0FHRV9DTEFTU19NVVNUX0hBVkVfVEFSR0VUTkFNRVNQQUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAubm8ucGFja2FnZS5jbGFzcy5tdXN0LmhhdmUudGFyZ2V0bmFtZXNwYWNlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGphdmF4Lmp3cy5XZWJzZXJ2aWNlIGFubm90YXRlZCBjbGFzc2VzIHRoYXQgZG8gbm90IGJlbG9uZyB0byBhIHBhY2thZ2UgbXVzdCBoYXZlIHRoZSBAamF2YXguandzLldlYnNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlIGVsZW1lbnQuICBDbGFzczogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfTk9fUEFDS0FHRV9DTEFTU19NVVNUX0hBVkVfVEFSR0VUTkFNRVNQQUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTk9fUEFDS0FHRV9DTEFTU19NVVNUX0hBVkVfVEFSR0VUTkFNRVNQQUNFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0NMQVNTX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmNsYXNzLm5vdC5mb3VuZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzIE5vdCBGb3VuZDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfQ0xBU1NfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfQ0xBU1NfTk9UX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ19CQVJFX05PX1JFVFVSTl9BTkRfTk9fT1VUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmRvYy5iYXJlLm5vLnJldHVybi5hbmQubm8ub3V0IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9jdW1lbnQgbGl0ZXJhbCBiYXJlIG1ldGhvZHMgdGhhdCBkbyBub3QgaGF2ZSBhIHJldHVybiB2YWx1ZSBtdXN0IGhhdmUgYSBzaW5nbGUgT1VUL0lOT1VUIHBhcmFtZXRlci4gIENsYXNzOiB7MH0gTWV0aG9kOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9ET0NfQkFSRV9OT19SRVRVUk5fQU5EX05PX09VVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9ET0NfQkFSRV9OT19SRVRVUk5fQU5EX05PX09VVChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9ET0NVTUVOVF9MSVRFUkFMX0JBUkVfTUVUSE9EX1JFVFVSTl9OT1RfVU5JUVVFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuZG9jdW1lbnQubGl0ZXJhbC5iYXJlLm1ldGhvZC5yZXR1cm4ubm90LnVuaXF1ZSIsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIG11c3QgaGF2ZSBhIHVuaXF1ZSByZXN1bHQgbmFtZSByZXR1cm4gdHlwZSBjb21iaW5hdGlvbi4gIENsYXNzIHswfSBtZXRob2Q6IHsxfSwgcmVzdWx0IG5hbWU6IHsyfSByZXR1cm4gdHlwZTogezN9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfRE9DVU1FTlRfTElURVJBTF9CQVJFX01FVEhPRF9SRVRVUk5fTk9UX1VOSVFVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLCBPYmplY3QgYXJnMykgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0xJVEVSQUxfQkFSRV9NRVRIT0RfUkVUVVJOX05PVF9VTklRVUUoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRE9DX0JBUkVfTk9fT1VUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmRvYy5iYXJlLm5vLm91dCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvY3VtZW50L2xpdGVyYWwgYmFyZSBtZXRob2RzIHdpdGggbm8gcmV0dXJuIHR5cGUgb3IgT1VUL0lOT1VUIHBhcmFtZXRlcnMgbXVzdCBiZSBhbm5vdGF0ZWQgYXMgQE9uZXdheS4gQ2xhc3M6IHswfSwgbWV0aG9kOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9ET0NfQkFSRV9OT19PVVQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRE9DX0JBUkVfTk9fT1VUKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1JQQ19MSVRFUkFMX1BBUkFNRVRFUlNfTVVTVF9IQVZFX1dFQlBBUkFNKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5ycGMubGl0ZXJhbC5wYXJhbWV0ZXJzLm11c3QuaGF2ZS53ZWJwYXJhbSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbCBycGMgbGl0ZXJhbCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBhIFdlYlBhcmFtIGFubm90YXRpb24uICBDbGFzczogezB9IG1ldGhvZDogezF9IHBhcmFtZXRlciB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9SUENfTElURVJBTF9QQVJBTUVURVJTX01VU1RfSEFWRV9XRUJQQVJBTShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfUlBDX0xJVEVSQUxfUEFSQU1FVEVSU19NVVNUX0hBVkVfV0VCUEFSQU0oYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTU9ERUxfQUxSRUFEWV9FWElTVFMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAubW9kZWwuYWxyZWFkeS5leGlzdHMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2RlbCBhbHJlYWR5IGV4aXN0cworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX01PREVMX0FMUkVBRFlfRVhJU1RTKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX01PREVMX0FMUkVBRFlfRVhJU1RTKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRU5EUE9JTlRJTlRFUkZBQ0VfT05fSU5URVJGQUNFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmVuZHBvaW50aW50ZXJmYWNlLm9uLmludGVyZmFjZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcnZpY2UgZW5kcG9pbnRwb2ludCBpbnRlcmZhY2U6IHswfSBoYXMgY2Fubm90IGhhdmUgYSBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlIGFubm90YXRpb246IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0VORFBPSU5USU5URVJGQUNFX09OX0lOVEVSRkFDRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9FTkRQT0lOVElOVEVSRkFDRV9PTl9JTlRFUkZBQ0UoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUVUSE9EX05PVF9BTk5PVEFURUQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAubWV0aG9kLm5vdC5hbm5vdGF0ZWQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIHswfSBvbiBjbGFzcyB7MX0gaXMgbm90IGFubm90YXRlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9NRVRIT0RfTk9UX0FOTk9UQVRFRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9NRVRIT0RfTk9UX0FOTk9UQVRFRChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9OT05fSU5fUEFSQU1FVEVSU19NVVNUX0JFX0hPTERFUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAubm9uLmluLnBhcmFtZXRlcnMubXVzdC5iZS5ob2xkZXIiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzczogezB9LCBtZXRob2Q6IHsxfSwgcGFyYW1ldGVyOiB7Mn0gaXMgbm90IFdlYlBhcmFtLk1vZGUuSU4gYW5kIGlzIG5vdCBvZiB0eXBlIGphdmF4LnhtbC53cy5Ib2xkZXIuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfTk9OX0lOX1BBUkFNRVRFUlNfTVVTVF9CRV9IT0xERVIoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX05PTl9JTl9QQVJBTUVURVJTX01VU1RfQkVfSE9MREVSKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0ZBSUxFRF9UT19GSU5EX0hBTkRMRVJDSEFJTl9GSUxFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmZhaWxlZC50by5maW5kLmhhbmRsZXJjaGFpbi5maWxlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2Fubm90IGZpbmQgSGFuZGxlckNoYWluIGZpbGUuIGNsYXNzOiB7MH0sIGZpbGU6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0ZBSUxFRF9UT19GSU5EX0hBTkRMRVJDSEFJTl9GSUxFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0ZBSUxFRF9UT19GSU5EX0hBTkRMRVJDSEFJTl9GSUxFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX09QRVJBVElPTl9OQU1FX05PVF9VTklRVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLm9wZXJhdGlvbi5uYW1lLm5vdC51bmlxdWUiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVyYXRpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUuICBDbGFzczogezB9IG1ldGhvZDogezF9IG9wZXJhdGlvbiBuYW1lOiB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9PUEVSQVRJT05fTkFNRV9OT1RfVU5JUVVFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9PUEVSQVRJT05fTkFNRV9OT1RfVU5JUVVFKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLm1ldGhvZC5ub3QuaW1wbGVtZW50ZWQiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2RzIGluIGFuIGVuZHBvaW50SW50ZXJmYWNlIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSW50ZXJmYWNlIENsYXNzOnswfSBJbXBsZW1lbnRhdGlvbiBDbGFzczp7MX0gTWV0aG9kOiB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0hFQURFUl9QQVJBTUVURVJTX01VU1RfSEFWRV9XRUJQQVJBTV9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5oZWFkZXIucGFyYW1ldGVycy5tdXN0LmhhdmUud2VicGFyYW0ubmFtZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbCBXZWJQYXJhbSBhbm5vdGF0aW9ucyBvbiBoZWFkZXIgcGFyYW1ldGVycyBtdXN0IHNwZWNpZnkgYSBuYW1lLiAgQ2xhc3M6IHswfSBtZXRob2QgezF9IHBhcmFtdGVyIHsyfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0hFQURFUl9QQVJBTUVURVJTX01VU1RfSEFWRV9XRUJQQVJBTV9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9IRUFERVJfUEFSQU1FVEVSU19NVVNUX0hBVkVfV0VCUEFSQU1fTkFNRShhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9JTlZBTElEX0hBTkRMRVJDSEFJTl9GSUxFX05PSEFORExFUl9DT05GSUcoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5pbnZhbGlkLmhhbmRsZXJjaGFpbi5maWxlLm5vaGFuZGxlci1jb25maWciLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGFuZGxlcmNoYWluIGZpbGUgezB9IGlzIGludmFsaWQsIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBoYW5kbGVyLWNvbmZpZyBlbGVtZW50CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfSU5WQUxJRF9IQU5ETEVSQ0hBSU5fRklMRV9OT0hBTkRMRVJfQ09ORklHKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5WQUxJRF9IQU5ETEVSQ0hBSU5fRklMRV9OT0hBTkRMRVJfQ09ORklHKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX09ORVdBWV9PUEVSQVRJT05fQ0FOTk9UX0RFQ0xBUkVfRVhDRVBUSU9OUyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAub25ld2F5Lm9wZXJhdGlvbi5jYW5ub3QuZGVjbGFyZS5leGNlcHRpb25zIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCB7MX0gb2YgY2xhc3MgezB9IGlzIGFubm90YXRlZCBAT25ld2F5IGJ1dCBkZWNsYXJlcyB0aGUgZXhjZXB0aW9uIHsyfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX09ORVdBWV9PUEVSQVRJT05fQ0FOTk9UX0RFQ0xBUkVfRVhDRVBUSU9OUyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfT05FV0FZX09QRVJBVElPTl9DQU5OT1RfREVDTEFSRV9FWENFUFRJT05TKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX09ORVdBWV9PUEVSQVRJT05fQ0FOTk9UX0hBVkVfSE9MREVSUyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5vbmV3YXkub3BlcmF0aW9uLmNhbm5vdC5oYXZlLmhvbGRlcnMiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIHsxfSBvZiBjbGFzcyB7MH0gaXMgYW5ub3RhdGVkIEBPbmV3YXkgYnV0IGNvbnRhaW5zIGlub3V0IG9yIG91dCBwYXJhbWVydGVycyAoamF2YXgueG1sLndzLkhvbGRlcikKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9PTkVXQVlfT1BFUkFUSU9OX0NBTk5PVF9IQVZFX0hPTERFUlMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfT05FV0FZX09QRVJBVElPTl9DQU5OT1RfSEFWRV9IT0xERVJTKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX09ORVdBWV9BTkRfTk9UX09ORV9JTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5vbmV3YXkuYW5kLm5vdC5vbmUuaW4iLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAamF2YXguandzLk9uZXdheSBtdXN0IGhhdmUgb25lIG5vbi1oZWFkZXIgSU4gcGFyYW1ldGVyLiAgQ2xhc3M6IHswfSBNZXRob2Q6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX09ORVdBWV9BTkRfTk9UX09ORV9JTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9PTkVXQVlfQU5EX05PVF9PTkVfSU4oYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfUlBDX0VOQ09ERURfTk9UX1NVUFBPUlRFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLnJwYy5lbmNvZGVkLm5vdC5zdXBwb3J0ZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgezB9IGNsYXNzIGhhcyBhIHJwYy9lbmNvZGVkIFNPQVBCaW5kaW5nLiAgUnBjL2VuY29kZWQgU09BUEJpbmRpbmdzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEpBWFdTIDIuMC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfUlBDX0VOQ09ERURfTk9UX1NVUFBPUlRFRChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9KQVZBX1RZUEVfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuamF2YS50eXBlTm90Rm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZTogezB9IHdhcyBub3QgZm91bmQgaW4gdGhlIG1hcHBpbmcKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9KQVZBX1RZUEVfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSkFWQV9UWVBFX05PVF9GT1VORChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9JTlZBTElEX1NFSV9BTk5PVEFUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmludmFsaWQuc2VpLmFubm90YXRpb24iLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgQHswfSBhbm5vdGF0aW9uIGNhbm5vdCBiZSB1c2VkIG9uIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIENsYXNzOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9JTlZBTElEX1NFSV9BTk5PVEFUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0lOVkFMSURfU0VJX0FOTk9UQVRJT04oYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTk9fV0VCU0VSVklDRV9FTkRQT0lOVF9GT1VORCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5uby53ZWJzZXJ2aWNlLmVuZHBvaW50LmZvdW5kIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB3ZWIgc2VydmljZSBlbmRwb2ludCBjb3VsZCBub3QgYmUgZm91bmQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9OT19XRUJTRVJWSUNFX0VORFBPSU5UX0ZPVU5EKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX05PX1dFQlNFUlZJQ0VfRU5EUE9JTlRfRk9VTkQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9JTlZBTElEX1dFQk1FVEhPRF9FTEVNRU5UX1dJVEhfRVhDTFVERShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuaW52YWxpZC53ZWJtZXRob2QuZWxlbWVudC53aXRoLmV4Y2x1ZGUiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgQGphdmF4Lmp3cy5XZWJNZXRob2QuezB9IGVsZW1lbnQgY2Fubm90IGJlIHNwZWNpZmllZCB3aXRoIHRoZSBAamF2YXguandzLldlYk1ldGhvZC5leGNsdWRlIGVsZW1lbnQuIENsYXNzOiB7MX0gbWV0aG9kOiB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9JTlZBTElEX1dFQk1FVEhPRF9FTEVNRU5UX1dJVEhfRVhDTFVERShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5WQUxJRF9XRUJNRVRIT0RfRUxFTUVOVF9XSVRIX0VYQ0xVREUoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfQ09VTERfTk9UX0ZJTkRfVFlQRURFQ0woT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuY291bGQubm90LmZpbmQudHlwZWRlY2wiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3VsZCBub3QgZ2V0IFR5cGVEZWNsYXJhdGlvbiBmb3I6IHswfSBpbiBhcHQgcm91bmQ6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0NPVUxEX05PVF9GSU5EX1RZUEVERUNMKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0NPVUxEX05PVF9GSU5EX1RZUEVERUNMKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0xJVEVSQUxfQkFSRV9DQU5OT1RfSEFWRV9NT1JFX1RIQU5fT05FX09VVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5kb2N1bWVudC5saXRlcmFsLmJhcmUuY2Fubm90LmhhdmUubW9yZS50aGFuLm9uZS5vdXQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyBtdXN0IGhhdmUgYSByZXR1cm4gdmFsdWUgb3Igb25lIG91dCBwYXJhbWV0ZXIuICBDbGFzczogezB9IE1ldGhvZDogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfRE9DVU1FTlRfTElURVJBTF9CQVJFX0NBTk5PVF9IQVZFX01PUkVfVEhBTl9PTkVfT1VUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0xJVEVSQUxfQkFSRV9DQU5OT1RfSEFWRV9NT1JFX1RIQU5fT05FX09VVChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZS5lbmNvZGVkLm5vdC5zdXBwb3J0ZWQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgezB9IGNsYXNzIGhhcyBpbnZhbGlkIFNPQVBCaW5kaW5nIGFubm90YXRpb24uIHsxfS9lbmNvZGVkIFNPQVBCaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRV9FTkNPREVEX05PVF9TVVBQT1JURUQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9DTEFTU19JU19GSU5BTChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLndlYnNlcnZpY2UuY2xhc3MuaXMuZmluYWwiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzc2VzIGFubm90YXRlZCB3aXRoIEBqYXZheC5qd3MuV2ViU2VydmljZSBtdXN0IG5vdCBiZSBmaW5hbC4gQ2xhc3M6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfQ0xBU1NfSVNfRklOQUwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX0NMQVNTX0lTX0ZJTkFMKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfTk9fREVGQVVMVF9DT05TVFJVQ1RPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLndlYnNlcnZpY2Uubm8uZGVmYXVsdC5jb25zdHJ1Y3RvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzZXMgYW5ub3RhdGVkIHdpdGggQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIG11c3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDbGFzczogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9OT19ERUZBVUxUX0NPTlNUUlVDVE9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9OT19ERUZBVUxUX0NPTlNUUlVDVE9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1NFSV9DQU5OT1RfQ09OVEFJTl9DT05TVEFOVF9WQUxVRVMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuc2VpLmNhbm5vdC5jb250YWluLmNvbnN0YW50LnZhbHVlcyIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIGNhbm5vdCBjb250YWluIGNvbnN0YW50IGRlY2xhcmF0aW9uOiBJbnRlcmZhY2U6IHswfSBmaWVsZDogezF9LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX1NFSV9DQU5OT1RfQ09OVEFJTl9DT05TVEFOVF9WQUxVRVMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfU0VJX0NBTk5PVF9DT05UQUlOX0NPTlNUQU5UX1ZBTFVFUyhhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9FTkRQT0lOVElOVEVSRkFDRV9DTEFTU19OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5lbmRwb2ludGludGVyZmFjZS5jbGFzcy5ub3QuZm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5kcG9pbnRJbnRlcmZhY2UgY2xhc3MgezB9IGNvdWxkIG5vdCBiZSBmb3VuZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0VORFBPSU5USU5URVJGQUNFX0NMQVNTX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URVJGQUNFX0NMQVNTX05PVF9GT1VORChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9ET0NVTUVOVF9MSVRFUkFMX0JBUkVfTVVTVF9IQVZFX09OTFlfT05FX0lOX1BBUkFNRVRFUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuZG9jdW1lbnQubGl0ZXJhbC5iYXJlLm11c3QuaGF2ZS5vbmx5Lm9uZS5pbi5wYXJhbWV0ZXIiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuIDEgbm9uLWhlYWRlciBpbiBwYXJhbWV0ZXIuIENsYXNzOiB7MH0gbWV0aG9kOiB7MX0gbnVtYmVyIG9mIG5vbi1oZWFkZXIgcGFyYW1ldGVyczogezJ9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfRE9DVU1FTlRfTElURVJBTF9CQVJFX01VU1RfSEFWRV9PTkxZX09ORV9JTl9QQVJBTUVURVIoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0xJVEVSQUxfQkFSRV9NVVNUX0hBVkVfT05MWV9PTkVfSU5fUEFSQU1FVEVSKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0lORk8oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5pbmZvIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW5mbzogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfSU5GTyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0lORk8oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSEFORExFUkNMQVNTX05PVFNQRUNJRklFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmhhbmRsZXJjbGFzcy5ub3RzcGVjaWZpZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhhbmRsZXIgaW4gdGhlIEhhbmRsZXJDaGFpbiBmaWxlOiB7MH0gZG9lcyBub3Qgc3BlY2lmeSBhIGhhbmRsZXItY2xhc3MKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9IQU5ETEVSQ0xBU1NfTk9UU1BFQ0lGSUVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSEFORExFUkNMQVNTX05PVFNQRUNJRklFRChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9JTlZBTElEX1NFSV9BTk5PVEFUSU9OX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuaW52YWxpZC5zZWkuYW5ub3RhdGlvbi5lbGVtZW50IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEBqYXZheC5qd3MuV2ViU2VydmljZS57MH0gZWxlbWVudCBjYW5ub3QgYmUgc3BlY2lmaWVkIG9uIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIENsYXNzOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9JTlZBTElEX1NFSV9BTk5PVEFUSU9OX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5WQUxJRF9TRUlfQU5OT1RBVElPTl9FTEVNRU5UKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0xJVEVSQUxfQkFSRV9NRVRIT0RfTk9UX1VOSVFVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuZG9jdW1lbnQubGl0ZXJhbC5iYXJlLm1ldGhvZC5ub3QudW5pcXVlIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9jdW1lbnQgbGl0ZXJhbCBiYXJlIG1ldGhvZHMgbXVzdCBoYXZlIHVuaXF1ZSBwYXJhbWV0ZXIgbmFtZXMuICBDbGFzczogezB9IG1ldGhvZDogezF9IHBhcmFtZXRlciBuYW1lOiB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9ET0NVTUVOVF9MSVRFUkFMX0JBUkVfTUVUSE9EX05PVF9VTklRVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0xJVEVSQUxfQkFSRV9NRVRIT0RfTk9UX1VOSVFVRShhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9NRVRIT0RfRVhDRVBUSU9OX0JFQU5fTkFNRV9OT1RfVU5JUVVFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLm1ldGhvZC5leGNlcHRpb24uYmVhbi5uYW1lLm5vdC51bmlxdWUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGNlcHRpb24gYmVhbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZSBhbmQgbXVzdCBub3QgY2xhc2ggd2l0aCBvdGhlciBnZW5lcmF0ZWQgY2xhc3Nlcy4gIENsYXNzOiB7MH0gZXhjZXB0aW9uIHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX01FVEhPRF9FWENFUFRJT05fQkVBTl9OQU1FX05PVF9VTklRVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUVUSE9EX0VYQ0VQVElPTl9CRUFOX05BTUVfTk9UX1VOSVFVRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9IT0xERVJfUEFSQU1FVEVSU19NVVNUX05PVF9CRV9JTl9PTkxZKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5ob2xkZXIucGFyYW1ldGVycy5tdXN0Lm5vdC5iZS5pbi5vbmx5IiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogamF2YXgueG1sLndzLkhvbGRlciBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIGFubm90YXRlZCB3aXRoIHRoZSBXZWJQYXJhbS5Nb2RlLklOIHByb3BlcnR5LiAgQ2xhc3M6IHswfSBtZXRob2Q6IHsxfSBwYXJhbWV0ZXI6IHsyfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0hPTERFUl9QQVJBTUVURVJTX01VU1RfTk9UX0JFX0lOX09OTFkoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0hPTERFUl9QQVJBTUVURVJTX01VU1RfTk9UX0JFX0lOX09OTFkoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRE9DX0JBUkVfQU5EX05PX09ORV9JTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5kb2MuYmFyZS5hbmQubm8ub25lLmluIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9jdW1lbnQgbGl0ZXJhbCBiYXJlIG1ldGhvZHMgbXVzdCBoYXZlIG9uZSBub24taGVhZGVyLCBJTi9JTk9VVCBwYXJhbWV0ZXIuICBDbGFzczogezB9IE1ldGhvZDogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfRE9DX0JBUkVfQU5EX05PX09ORV9JTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9ET0NfQkFSRV9BTkRfTk9fT05FX0lOKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1JQQ19MSVRFUkFMX1dFQlBBUkFNU19NVVNUX1NQRUNJRllfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAucnBjLmxpdGVyYWwud2VicGFyYW1zLm11c3Quc3BlY2lmeS5uYW1lIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsIHJwYyBsaXRlcmFsIFdlYlBhcmFtcyBtdXN0IHNwZWNpZnkgYSBuYW1lLiAgQ2xhc3M6IHswfSBtZXRob2QgezF9IHBhcmFtdGVyIHsyfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX1JQQ19MSVRFUkFMX1dFQlBBUkFNU19NVVNUX1NQRUNJRllfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfUlBDX0xJVEVSQUxfV0VCUEFSQU1TX01VU1RfU1BFQ0lGWV9OQU1FKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URVJGQUNFX0hBU19OT19XRUJTRVJWSUNFX0FOTk9UQVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5lbmRwb2ludGludGVyZmFjZS5oYXMubm8ud2Vic2VydmljZS5hbm5vdGF0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVuZHBvaW50IGludGVyZmFjZSB7MH0gbXVzdCBoYXZlIGEgV2ViU2VydmljZSBhbm5vdGF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfRU5EUE9JTlRJTlRFUkZBQ0VfSEFTX05PX1dFQlNFUlZJQ0VfQU5OT1RBVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URVJGQUNFX0hBU19OT19XRUJTRVJWSUNFX0FOTk9UQVRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfQ0FOTk9UX0NPTUJJTkVfSEFORExFUkNIQUlOX1NPQVBNRVNTQUdFSEFORExFUlMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuY2Fubm90LmNvbWJpbmUuaGFuZGxlcmNoYWluLnNvYXBtZXNzYWdlaGFuZGxlcnMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBZb3UgY2Fubm90IHNwZWNpZnkgYm90aCBIYW5sZGVyQ2hhaW4gYW5kIFNPQVBNZXNzYWdlSGFuZGxlcnMgYW5ub3RhdGlvbnMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9DQU5OT1RfQ09NQklORV9IQU5ETEVSQ0hBSU5fU09BUE1FU1NBR0VIQU5ETEVSUygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9DQU5OT1RfQ09NQklORV9IQU5ETEVSQ0hBSU5fU09BUE1FU1NBR0VIQU5ETEVSUygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX05FU1RFRF9NT0RFTF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLm5lc3RlZE1vZGVsRXJyb3IiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2RlbGVyIGVycm9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9ORVNURURfTU9ERUxfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9ORVNURURfTU9ERUxfRVJST1IoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUVUSE9EX1JFUVVFU1RfV1JBUFBFUl9CRUFOX05BTUVfTk9UX1VOSVFVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5tZXRob2QucmVxdWVzdC53cmFwcGVyLmJlYW4ubmFtZS5ub3QudW5pcXVlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWVzdCB3cmFwcGVyIGJlYW4gbmFtZXMgbXVzdCBiZSB1bmlxdWUgYW5kIG11c3Qgbm90IGNsYXNoIHdpdGggb3RoZXIgZ2VuZXJhdGVkIGNsYXNzZXMuICBDbGFzczogezB9IG1ldGhvZCB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9NRVRIT0RfUkVRVUVTVF9XUkFQUEVSX0JFQU5fTkFNRV9OT1RfVU5JUVVFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX01FVEhPRF9SRVFVRVNUX1dSQVBQRVJfQkVBTl9OQU1FX05PVF9VTklRVUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9DTEFTU19OT1RfUFVCTElDKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAud2Vic2VydmljZS5jbGFzcy5ub3QucHVibGljIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAamF2YXguandzLldlYlNlcnZpY2UgbXVzdCBiZSBwdWJsaWMuIENsYXNzOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX0NMQVNTX05PVF9QVUJMSUMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX0NMQVNTX05PVF9QVUJMSUMoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUlYRURfQklORElOR19TVFlMRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLm1peGVkLmJpbmRpbmcuc3R5bGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzczogezB9IGNvbnRhaW5zIG1peGVkIGJpbmRpbmdzLiAgU09BUEJpbmRpbmcuU3R5bGUuUlBDIGFuZCBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCBjYW5ub3QgYmUgbWl4ZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfTUlYRURfQklORElOR19TVFlMRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX01JWEVEX0JJTkRJTkdfU1RZTEUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRklMRV9OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5maWxlTm90Rm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlcnJvcjogZmlsZSBub3QgZm91bmQ6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0ZJTEVfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRklMRV9OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfT05FV0FZX0FORF9PVVQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAub25ld2F5LmFuZC5vdXQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAT25ld2F5IG1ldGhvZHMgY2Fubm90IGhhdmUgb3V0IHBhcmFtZXRlcnMuIENsYXNzOiB7MH0gbWV0aG9kIHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX09ORVdBWV9BTkRfT1VUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX09ORVdBWV9BTkRfT1VUKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX01FVEhPRF9SRVNQT05TRV9XUkFQUEVSX0JFQU5fTkFNRV9OT1RfVU5JUVVFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLm1ldGhvZC5yZXNwb25zZS53cmFwcGVyLmJlYW4ubmFtZS5ub3QudW5pcXVlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzcG9uc2Ugd3JhcHBlciBiZWFuIG5hbWVzIG11c3QgYmUgdW5pcXVlIGFuZCBtdXN0IG5vdCBjbGFzaCB3aXRoIG90aGVyIGdlbmVyYXRlZCBjbGFzc2VzLiAgQ2xhc3M6IHswfSBtZXRob2QgezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfTUVUSE9EX1JFU1BPTlNFX1dSQVBQRVJfQkVBTl9OQU1FX05PVF9VTklRVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUVUSE9EX1JFU1BPTlNFX1dSQVBQRVJfQkVBTl9OQU1FX05PVF9VTklRVUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfQ09NUElMQVRJT05fRkFJTEVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmNvbXBpbGF0aW9uRmFpbGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGlsYXRpb24gZmFpbGVkLCBlcnJvcnMgc2hvdWxkIGhhdmUgYmVlbiByZXBvcnRlZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0NPTVBJTEFUSU9OX0ZBSUxFRCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9DT01QSUxBVElPTl9GQUlMRUQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9ET0NVTUVOVF9MSVRFUkFMX0JBUkVfTVVTVF9IQVZFX09ORV9JTl9PUl9PVVQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuZG9jdW1lbnQubGl0ZXJhbC5iYXJlLm11c3QuaGF2ZS5vbmUuaW4ub3Iub3V0IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9jdW1lbnQgbGl0ZXJhbCBiYXJlIG1ldGhvZHMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBvZjogYSByZXR1cm4sIGFuIGluIHBhcmFtZXRlciBvciBhbiBvdXQgcGFyYW1ldGVyLiAgQ2xhc3M6IHswfSBNZXRob2Q6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0xJVEVSQUxfQkFSRV9NVVNUX0hBVkVfT05FX0lOX09SX09VVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9ET0NVTUVOVF9MSVRFUkFMX0JBUkVfTVVTVF9IQVZFX09ORV9JTl9PUl9PVVQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRU5EUE9JTlRJTlRFRkFDRV9QTFVTX0VMRU1FTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5lbmRwb2ludGludGVmYWNlLnBsdXMuZWxlbWVudCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBAamF2YXguandzLldlYlNlcnZpY2UuezB9IGVsZW1lbnQgY2Fubm90IGJlIHVzZWQgaW4gd2l0aCBAamF2YXguandzLldlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UgZWxlbWVudC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9FTkRQT0lOVElOVEVGQUNFX1BMVVNfRUxFTUVOVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URUZBQ0VfUExVU19FTEVNRU5UKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ19CQVJFX1JFVFVSTl9BTkRfT1VUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmRvYy5iYXJlLnJldHVybi5hbmQub3V0IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9jdW1lbnQvbGl0ZXJhbCBiYXJlIG1ldGhvZHMgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZSBhbmQgb3V0IHBhcmFtZXRlcnMuIENsYXNzOiB7MH0sIG1ldGhvZDogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfRE9DX0JBUkVfUkVUVVJOX0FORF9PVVQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRE9DX0JBUkVfUkVUVVJOX0FORF9PVVQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfU1VDQ0VFREVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLnN1Y2NlZWRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1Y2Nlc3MKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9TVUNDRUVERUQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfU1VDQ0VFREVEKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRE9DVU1FTlRfQkFSRV9IT0xERVJfUEFSQU1FVEVSU19NVVNUX05PVF9CRV9JTk9VVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAuZG9jdW1lbnQuYmFyZS5ob2xkZXIucGFyYW1ldGVycy5tdXN0Lm5vdC5iZS5pbm91dCIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGphdmF4LnhtbC53cy5Ib2xkZXIgcGFyYW1ldGVycyBpbiBkb2N1bWVudCBiYXJlIG9wZXJhdGlvbnMgbXVzdCBiZSBXZWJQYXJhbS5Nb2RlLklOT1VUOyAgQ2xhc3M6IHswfSBtZXRob2Q6IHsxfSBwYXJhbWV0ZXI6IHsyfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0JBUkVfSE9MREVSX1BBUkFNRVRFUlNfTVVTVF9OT1RfQkVfSU5PVVQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0RPQ1VNRU5UX0JBUkVfSE9MREVSX1BBUkFNRVRFUlNfTVVTVF9OT1RfQkVfSU5PVVQoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9BTkRfV0VCU0VSVklDRVBST1ZJREVSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3ZWJzZXJ2aWNlYXAud2Vic2VydmljZS5hbmQud2Vic2VydmljZXByb3ZpZGVyIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3NlcyBjYW5ub3QgYmUgYW5ub3RhdGVkIHdpdGggYm90aCBAamF2YXguandzLldlYlNlcnZpY2UgYW5kIEBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyLiAgQ2xhc3M6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfQU5EX1dFQlNFUlZJQ0VQUk9WSURFUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfQU5EX1dFQlNFUlZJQ0VQUk9WSURFUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9FTkRQT0lOVElOVEVSRkFDRVNfRE9fTk9UX01BVENIKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmVuZHBvaW50aW50ZXJmYWNlcy5kby5ub3QubWF0Y2giLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5kcG9pbnQgaW50ZXJmYWNlIHswfSBkb2VzIG5vdCBtYXRjaCB0aGUgaW50ZXJmYWNlIHsxfS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9FTkRQT0lOVElOVEVSRkFDRVNfRE9fTk9UX01BVENIKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URVJGQUNFU19ET19OT1RfTUFUQ0goYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRU5EUE9JTlRJTlRFRkFDRV9QTFVTX0FOTk9UQVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5lbmRwb2ludGludGVmYWNlLnBsdXMuYW5ub3RhdGlvbiIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBAezB9IGFubm90YXRpb24gY2Fubm90IGJlIHVzZWQgaW4gd2l0aCBAamF2YXguandzLldlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UgZWxlbWVudC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9FTkRQT0lOVElOVEVGQUNFX1BMVVNfQU5OT1RBVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0VORFBPSU5USU5URUZBQ0VfUExVU19BTk5PVEFUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0ZBSUxFRF9UT19QQVJTRV9IQU5ETEVSQ0hBSU5fRklMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndlYnNlcnZpY2VhcC5mYWlsZWQudG8ucGFyc2UuaGFuZGxlcmNoYWluLmZpbGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsZWQgdG8gcGFyc2UgSGFuZGxlckNoYWluIGZpbGUuIENsYXNzOiB7MH0sIGZpbGU6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0ZBSUxFRF9UT19QQVJTRV9IQU5ETEVSQ0hBSU5fRklMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9GQUlMRURfVE9fUEFSU0VfSEFORExFUkNIQUlOX0ZJTEUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUVUSE9EX1BBUkFNRVRFUl9UWVBFU19DQU5OT1RfSU1QTEVNRU5UX1JFTU9URShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLCBPYmplY3QgYXJnMykgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLm1ldGhvZC5wYXJhbWV0ZXIudHlwZXMuY2Fubm90LmltcGxlbWVudC5yZW1vdGUiLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgcGFyYW1ldGVyIHR5cGVzIGNhbm5vdCBpbXBsZW1lbnQgamF2YS5ybWkuUmVtb3RlLiAgQ2xhc3M6IHswfSBtZXRob2Q6IHsxfSBwYXJhbWV0ZXI6IHsyfSB0eXBlOiB7M30KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9NRVRIT0RfUEFSQU1FVEVSX1RZUEVTX0NBTk5PVF9JTVBMRU1FTlRfUkVNT1RFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfTUVUSE9EX1BBUkFNRVRFUl9UWVBFU19DQU5OT1RfSU1QTEVNRU5UX1JFTU9URShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9NRVRIT0RfUkVUVVJOX1RZUEVfQ0FOTk9UX0lNUExFTUVOVF9SRU1PVEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLm1ldGhvZC5yZXR1cm4udHlwZS5jYW5ub3QuaW1wbGVtZW50LnJlbW90ZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCByZXR1cm4gdHlwZXMgY2Fubm90IGltcGxlbWVudCBqYXZhLnJtaS5SZW1vdGUuICBDbGFzczogezB9IG1ldGhvZDogezF9IHJldHVybiB0eXBlOiB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VBUF9NRVRIT0RfUkVUVVJOX1RZUEVfQ0FOTk9UX0lNUExFTUVOVF9SRU1PVEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX01FVEhPRF9SRVRVUk5fVFlQRV9DQU5OT1RfSU1QTEVNRU5UX1JFTU9URShhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmVycm9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfRVJST1IoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXRUJTRVJWSUNFQVBfV0VCU0VSVklDRV9DTEFTU19JU19BQlNUUkFDVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLndlYnNlcnZpY2UuY2xhc3MuaXMuYWJzdHJhY3QiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzc2VzIGFubm90YXRlZCB3aXRoIEBqYXZheC5qd3MuV2ViU2VydmljZSBtdXN0IG5vdCBiZSBhYnN0cmFjdC4gQ2xhc3M6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRUFQX1dFQlNFUlZJQ0VfQ0xBU1NfSVNfQUJTVFJBQ1QoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdFQlNFUlZJQ0VBUF9XRUJTRVJWSUNFX0NMQVNTX0lTX0FCU1RSQUNUKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0VCU0VSVklDRUFQX0lOSVRfUEFSQU1fRk9STUFUX0VSUk9SKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2Vic2VydmljZWFwLmluaXRfcGFyYW0uZm9ybWF0LmVycm9yIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYSA8aW5pdC1wYXJhbT4gZWxlbWVudCBtdXN0IGhhdmUgZXhhY3RseSAxIDxwYXJhbS1uYW1lPiBhbmQgMSA8cGFyYW0tdmFsdWU+CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFQVBfSU5JVF9QQVJBTV9GT1JNQVRfRVJST1IoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXRUJTRVJWSUNFQVBfSU5JVF9QQVJBTV9GT1JNQVRfRVJST1IoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9Xc2NvbXBpbGVNZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvV3Njb21waWxlTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZlNjkxCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvV3Njb21waWxlTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDY0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXc2NvbXBpbGVNZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLndzY29tcGlsZSIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NHRU5fQ0xBU1NfTVVTVF9CRV9JTVBMRU1FTlRBVElPTl9DTEFTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NnZW4uY2xhc3MubXVzdC5iZS5pbXBsZW1lbnRhdGlvbi5jbGFzcyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyAiezB9IiBpcyBub3QgYW4gZW5kcG9pbnQgaW1wbGVtZW50YXRpb24gY2xhc3MuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0dFTl9DTEFTU19NVVNUX0JFX0lNUExFTUVOVEFUSU9OX0NMQVNTKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0dFTl9DTEFTU19NVVNUX0JFX0lNUExFTUVOVEFUSU9OX0NMQVNTKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NHRU5fQ0xBU1NfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2dlbi5jbGFzcy5ub3QuZm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyBub3QgZm91bmQ6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0dFTl9DTEFTU19OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTR0VOX0NMQVNTX05PVF9GT1VORChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTR0VOX1VTQUdFX0VYQU1QTEVTKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NnZW4udXNhZ2UuZXhhbXBsZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEV4YW1wbGVzOgorICAgICAqICAgd3NnZW4gLWNwIC4gZXhhbXBsZS5TdG9jaworICAgICAqICAgd3NnZW4gLWNwIC4gZXhhbXBsZS5TdG9jayAtd3NkbCAtc2VydmljZW5hbWUgJ3todHRwOi8vbXluYW1lc3BhY2V9TXlTZXJ2aWNlJworICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0dFTl9VU0FHRV9FWEFNUExFUygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTR0VOX1VTQUdFX0VYQU1QTEVTKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXUkFQUEVSX1RBU0tfTE9BRElOR18yMF9BUEkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndyYXBwZXJUYXNrLmxvYWRpbmcyMEFwaSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFlvdSBhcmUgbG9hZGluZyBKQVgtV1MgMi4wIEFQSSBmcm9tIHswfSBidXQgdGhpcyB0b29sIHJlcXVpcmVzIEpBWC1XUyAyLjEgQVBJLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1JBUFBFUl9UQVNLX0xPQURJTkdfMjBfQVBJKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXUkFQUEVSX1RBU0tfTE9BRElOR18yMF9BUEkoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0dFTl9JTlZBTElEX1BST1RPQ09MKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NnZW4uaW52YWxpZC5wcm90b2NvbCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqICJ7MH0iIGlzIG5vdCBhIHN1cHBvcnRlZCBwcm90b2NvbC4gIFN1cHBvcnRlZCBwcm90b2NvbHMgaW5jbHVkZTogezF9LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NHRU5fSU5WQUxJRF9QUk9UT0NPTChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTR0VOX0lOVkFMSURfUFJPVE9DT0woYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0lNUE9SVF9VU0FHRV9FWEFNUExFUygpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzaW1wb3J0LnVzYWdlLmV4YW1wbGVzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBFeGFtcGxlczoKKyAgICAgKiAgIHdzaW1wb3J0IHN0b2NrLndzZGwgLWIgc3RvY2sueG1sIC1iIHN0b2NrLnhqYgorICAgICAqICAgd3NpbXBvcnQgLWQgZ2VuZXJhdGVkIGh0dHA6Ly9leGFtcGxlLm9yZy9zdG9jaz93c2RsCisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSU1QT1JUX1VTQUdFX0VYQU1QTEVTKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NJTVBPUlRfVVNBR0VfRVhBTVBMRVMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVk9LRVJfTkVFRF9FTkRPUlNFRCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludm9rZXIubmVlZEVuZG9yc2VkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogWW91IGFyZSBydW5uaW5nIG9uIEpESzYgd2hpY2ggY29tZXMgd2l0aCBKQVgtV1MgMi4wIEFQSSwgYnV0IHRoaXMgdG9vbCByZXF1aXJlcyBKQVgtV1MgMi4xIEFQSS4gVXNlIHRoZSBlbmRvcnNlZCBzdGFuZGFyZHMgb3ZlcnJpZGUgbWVjaGFuaXNtIChodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zdGFuZGFyZHMvKSwgb3IgdXNlIC1YZW5kb3JzZWQgb3B0aW9uLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WT0tFUl9ORUVEX0VORE9SU0VEKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WT0tFUl9ORUVEX0VORE9SU0VEKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0lNUE9SVF9NSVNTSU5HX0ZJTEUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2ltcG9ydC5taXNzaW5nRmlsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1pc3NpbmcgV1NETF9VUkkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSU1QT1JUX01JU1NJTkdfRklMRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTSU1QT1JUX01JU1NJTkdfRklMRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NJTVBPUlRfVVNBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzaW1wb3J0LnVzYWdlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNhZ2U6IHswfSBbb3B0aW9uc10gPFdTRExfVVJJPgorICAgICAqCisgICAgICogVXNlICJ3c2ltcG9ydCAtaGVscCIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2Ygb3B0aW9ucy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSU1QT1JUX1VTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0lNUE9SVF9VU0FHRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBMRUFTRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIlBsZWFzZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNwZWNpZnkgIi1leHRlbnNpb24iIGFuZCAiLXdzZGw6cHJvdG9jb2wgWFNvYXAxLjIiIHN3aXRjaGVzLiBGb3IgZXhhbXBsZToKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQTEVBU0UoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQTEVBU0UoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTSU1QT1JUX1BBUlNJTkdfV1NETCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzaW1wb3J0LlBhcnNpbmdXU0RMIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFyc2luZyBXU0RMLi4uCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NJTVBPUlRfUEFSU0lOR19XU0RMKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NJTVBPUlRfUEFSU0lOR19XU0RMKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0dFTl9NSVNTSU5HX0ZJTEUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2dlbi5taXNzaW5nRmlsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1pc3NpbmcgU0VJCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0dFTl9NSVNTSU5HX0ZJTEUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0dFTl9NSVNTSU5HX0ZJTEUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTSU1QT1JUX0hFTFAoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzaW1wb3J0LmhlbHAiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFVzYWdlOiB7MH0gW29wdGlvbnNdIDxXU0RMX1VSST4KKyAgICAgKgorICAgICAqIHdoZXJlIFtvcHRpb25zXSBpbmNsdWRlOgorICAgICAqICAgLWIgPHBhdGg+ICAgICAgICAgICAgICAgICBzcGVjaWZ5IGpheHdzL2pheGIgYmluZGluZyBmaWxlcyBvciBhZGRpdGlvbmFsIHNjaGVtYXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVhY2ggPHBhdGg+IG11c3QgaGF2ZSBpdHMgb3duIC1iKQorICAgICAqICAgLUI8amF4Yk9wdGlvbj4gICAgICAgICAgICBQYXNzIHRoaXMgb3B0aW9uIHRvIEpBWEIgc2NoZW1hIGNvbXBpbGVyCisgICAgICogICAtY2F0YWxvZyA8ZmlsZT4gICAgICAgICAgIHNwZWNpZnkgY2F0YWxvZyBmaWxlIHRvIHJlc29sdmUgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgVFI5NDAxLCBYQ2F0YWxvZywgYW5kIE9BU0lTIFhNTCBDYXRhbG9nIGZvcm1hdC4KKyAgICAgKiAgIC1kIDxkaXJlY3Rvcnk+ICAgICAgICAgICAgc3BlY2lmeSB3aGVyZSB0byBwbGFjZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGVzCisgICAgICogICAtZXh0ZW5zaW9uICAgICAgICAgICAgICAgIGFsbG93IHZlbmRvciBleHRlbnNpb25zIC0gZnVuY3Rpb25hbGl0eSBub3Qgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBzcGVjaWZpY2F0aW9uLiAgVXNlIG9mIGV4dGVuc2lvbnMgbWF5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCBpbiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgbm90IHBvcnRhYmxlIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBub3QgaW50ZXJvcGVyYXRlIHdpdGggb3RoZXIgaW1wbGVtZW50YXRpb25zCisgICAgICogICAtaGVscCAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgaGVscAorICAgICAqICAgLWh0dHBwcm94eTo8aG9zdD46PHBvcnQ+ICBzcGVjaWZ5IGEgSFRUUCBwcm94eSBzZXJ2ZXIgKHBvcnQgZGVmYXVsdHMgdG8gODA4MCkKKyAgICAgKiAgIC1rZWVwICAgICAgICAgICAgICAgICAgICAga2VlcCBnZW5lcmF0ZWQgZmlsZXMKKyAgICAgKiAgIC1wIDxwa2c+ICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcGFja2FnZQorICAgICAqICAgLXF1aWV0ICAgICAgICAgICAgICAgICAgICBzdXBwcmVzcyB3c2ltcG9ydCBvdXRwdXQKKyAgICAgKiAgIC1zIDxkaXJlY3Rvcnk+ICAgICAgICAgICAgc3BlY2lmeSB3aGVyZSB0byBwbGFjZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzCisgICAgICogICAtdGFyZ2V0IDx2ZXJzaW9uPiAgICAgICAgIGdlbmVyYXRlIGNvZGUgYXMgcGVyIHRoZSBnaXZlbiBKQVhXUyBzcGVjaWZpY2F0aW9uIHZlcnNpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gMi4wIHdpbGwgZ2VuZXJhdGUgY29tcGxpYW50IGNvZGUgZm9yIEpBWFdTIDIuMCBzcGVjLgorICAgICAqICAgLXZlcmJvc2UgICAgICAgICAgICAgICAgICBvdXRwdXQgbWVzc2FnZXMgYWJvdXQgd2hhdCB0aGUgY29tcGlsZXIgaXMgZG9pbmcKKyAgICAgKiAgIC12ZXJzaW9uICAgICAgICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgorICAgICAqICAgLXdzZGxsb2NhdGlvbiA8bG9jYXRpb24+ICBAV2ViU2VydmljZUNsaWVudC53c2RsTG9jYXRpb24gdmFsdWUKKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NJTVBPUlRfSEVMUChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NJTVBPUlRfSEVMUChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTQ09NUElMRV9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3Njb21waWxlLmVycm9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NDT01QSUxFX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0NPTVBJTEVfRVJST1IoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0dFTl9OT19XRUJTRVJWSUNFU19DTEFTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NnZW4ubm8ud2Vic2VydmljZXMuY2xhc3MiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3c2dlbiBkaWQgbm90IGZpbmQgYW55IGNsYXNzIHdpdGggQFdlYlNlcnZpY2UgYW5ub3RhdGlvbi4gUGxlYXNlIHNwZWNpZnkgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBvbiB7MH0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0dFTl9OT19XRUJTRVJWSUNFU19DTEFTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NHRU5fTk9fV0VCU0VSVklDRVNfQ0xBU1MoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0NPTVBJTEVfTk9fU1VDSF9ESVJFQ1RPUlkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzY29tcGlsZS5ub1N1Y2hEaXJlY3RvcnkiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkaXJlY3Rvcnkgbm90IGZvdW5kOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTQ09NUElMRV9OT19TVUNIX0RJUkVDVE9SWShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NDT01QSUxFX05PX1NVQ0hfRElSRUNUT1JZKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NDT01QSUxFX0lORk8oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzY29tcGlsZS5pbmZvIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW5mbzogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0NPTVBJTEVfSU5GTyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NDT01QSUxFX0lORk8oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0lNUE9SVF9XQVJOSU5HX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzaW1wb3J0Lldhcm5pbmdNZXNzYWdlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogW1dBUk5JTkddIHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NJTVBPUlRfV0FSTklOR19NRVNTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0lNUE9SVF9XQVJOSU5HX01FU1NBR0UoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0NPTVBJTEVfSU5WQUxJRF9PUFRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzY29tcGlsZS5pbnZhbGlkT3B0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5yZWNvZ25pemVkIHBhcmFtZXRlciB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTQ09NUElMRV9JTlZBTElEX09QVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NDT01QSUxFX0lOVkFMSURfT1BUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NJTVBPUlRfRVJST1JfTUVTU0FHRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NpbXBvcnQuRXJyb3JNZXNzYWdlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogW0VSUk9SXSB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSU1QT1JUX0VSUk9SX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTSU1QT1JUX0VSUk9SX01FU1NBR0UoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0lNUE9SVF9HRU5FUkFUSU5HX0NPREUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2ltcG9ydC5HZW5lcmF0aW5nQ29kZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdlbmVyYXRpbmcgY29kZS4uLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NJTVBPUlRfR0VORVJBVElOR19DT0RFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NJTVBPUlRfR0VORVJBVElOR19DT0RFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0dFTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZ2VuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogLXdzZGw6cHJvdG9jb2wgWFNvYXAxLjIgLWV4dGVuc29uIHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NHRU4oKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0dFTigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NJTVBPUlRfTk9UX0FfRklMRV9OT1JfVVJMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2ltcG9ydC5Ob3RBRmlsZU5vclVSTCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqICJ7MH0iIGlzIG5laXRoZXIgYSBmaWxlIG5hbWUgbm9yIGFuIFVSTAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NJTVBPUlRfTk9UX0FfRklMRV9OT1JfVVJMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0lNUE9SVF9OT1RfQV9GSUxFX05PUl9VUkwoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0NPTVBJTEVfV0FSTklORyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3Njb21waWxlLndhcm5pbmciLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3YXJuaW5nOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTQ09NUElMRV9XQVJOSU5HKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0NPTVBJTEVfV0FSTklORyhhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdSQVBQRVJfVEFTS19ORUVEX0VORE9SU0VEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3cmFwcGVyVGFzay5uZWVkRW5kb3JzZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBZb3UgYXJlIHJ1bm5pbmcgb24gSkRLNiB3aGljaCBjb21lcyB3aXRoIEpBWC1XUyAyLjAgQVBJLCBidXQgdGhpcyB0b29sIHJlcXVpcmVzIEpBWC1XUyAyLjEgQVBJLiBVc2UgdGhlIGVuZG9yc2VkIHN0YW5kYXJkcyBvdmVycmlkZSBtZWNoYW5pc20gKGh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL3N0YW5kYXJkcy8pLCBvciBzZXQgeGVuZG9yc2VkPSJ0cnVlIiBvbiA8ezB9Pi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdSQVBQRVJfVEFTS19ORUVEX0VORE9SU0VEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXUkFQUEVSX1RBU0tfTkVFRF9FTkRPUlNFRChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTSU1QT1JUX05PX1NVQ0hfSkFYQl9PUFRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzaW1wb3J0Lm5vU3VjaEpheGJPcHRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBubyBzdWNoIEpBWEIgb3B0aW9uOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSU1QT1JUX05PX1NVQ0hfSkFYQl9PUFRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTSU1QT1JUX05PX1NVQ0hfSkFYQl9PUFRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0dFTl9DT1VMRF9OT1RfQ1JFQVRFX0ZJTEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZ2VuLmNvdWxkLm5vdC5jcmVhdGUuZmlsZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqICJDb3VsZCBub3QgY3JlYXRlIGZpbGU6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0dFTl9DT1VMRF9OT1RfQ1JFQVRFX0ZJTEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTR0VOX0NPVUxEX05PVF9DUkVBVEVfRklMRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTR0VOX1dTRExfQVJHX05PX0dFTldTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZ2VuLndzZGwuYXJnLm5vLmdlbndzZGwiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgInswfSIgb3B0aW9uIGNhbiBvbmx5IGJlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlICItd3NkbCIgb3B0aW9uLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NHRU5fV1NETF9BUkdfTk9fR0VOV1NETChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NHRU5fV1NETF9BUkdfTk9fR0VOV1NETChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTR0VOX0hFTFAoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZ2VuLmhlbHAiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFVzYWdlOiB7MH0gW29wdGlvbnNdIDxTRUk+CisgICAgICoKKyAgICAgKiB3aGVyZSBbb3B0aW9uc10gaW5jbHVkZToKKyAgICAgKiAgIC1jbGFzc3BhdGggPHBhdGg+ICAgICAgICAgIHNwZWNpZnkgd2hlcmUgdG8gZmluZCBpbnB1dCBjbGFzcyBmaWxlcworICAgICAqICAgLWNwIDxwYXRoPiAgICAgICAgICAgICAgICAgc2FtZSBhcyAtY2xhc3NwYXRoIDxwYXRoPgorICAgICAqICAgLWQgPGRpcmVjdG9yeT4gICAgICAgICAgICAgc3BlY2lmeSB3aGVyZSB0byBwbGFjZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGVzCisgICAgICogICAtZXh0ZW5zaW9uICAgICAgICAgICAgICAgICBhbGxvdyB2ZW5kb3IgZXh0ZW5zaW9ucyAtIGZ1bmN0aW9uYWxpdHkgbm90IHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHNwZWNpZmljYXRpb24uICBVc2Ugb2YgZXh0ZW5zaW9ucyBtYXkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCBpbiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgbm90IHBvcnRhYmxlIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgbm90IGludGVyb3BlcmF0ZSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucworICAgICAqICAgLWhlbHAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBoZWxwCisgICAgICogICAta2VlcCAgICAgICAgICAgICAgICAgICAgICBrZWVwIGdlbmVyYXRlZCBmaWxlcworICAgICAqICAgLXIgPGRpcmVjdG9yeT4gICAgICAgICAgICAgcmVzb3VyY2UgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBzcGVjaWZ5IHdoZXJlIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSByZXNvdWNlIGZpbGVzIHN1Y2ggYXMgV1NETHMKKyAgICAgKiAgIC1zIDxkaXJlY3Rvcnk+ICAgICAgICAgICAgIHNwZWNpZnkgd2hlcmUgdG8gcGxhY2UgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcworICAgICAqICAgLXZlcmJvc2UgICAgICAgICAgICAgICAgICAgb3V0cHV0IG1lc3NhZ2VzIGFib3V0IHdoYXQgdGhlIGNvbXBpbGVyIGlzIGRvaW5nCisgICAgICogICAtdmVyc2lvbiAgICAgICAgICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisgICAgICogICAtd3NkbFs6cHJvdG9jb2xdICAgICAgICAgICBnZW5lcmF0ZSBhIFdTREwgZmlsZS4gIFRoZSBwcm90b2NvbCBpcyBvcHRpb25hbC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIHByb3RvY29scyBhcmUgc29hcDEuMSBhbmQgWHNvYXAxLjIsIHRoZSBkZWZhdWx0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzb2FwMS4xLiAgWHNvYXAxLjIgaXMgbm90IHN0YW5kYXJkIGFuZCBjYW4gb25seSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSAtZXh0ZW5zaW9uIG9wdGlvbgorICAgICAqICAgLXNlcnZpY2VuYW1lIDxuYW1lPiAgICAgICAgc3BlY2lmeSB0aGUgU2VydmljZSBuYW1lIHRvIHVzZSBpbiB0aGUgZ2VuZXJhdGVkIFdTREwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgLXdzZGwgb3B0aW9uLgorICAgICAqICAgLXBvcnRuYW1lIDxuYW1lPiAgICAgICAgICAgc3BlY2lmeSB0aGUgUG9ydCBuYW1lIHRvIHVzZSBpbiB0aGUgZ2VuZXJhdGVkIFdTREwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgLXdzZGwgb3B0aW9uLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NHRU5fSEVMUChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NHRU5fSEVMUChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTSU1QT1JUX0lORk9fTUVTU0FHRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NpbXBvcnQuSW5mb01lc3NhZ2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBbSU5GT10gezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0lNUE9SVF9JTkZPX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTSU1QT1JUX0lORk9fTUVTU0FHRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTR0VOX1NPQVBfMTJfV0lUSE9VVF9FWFRFTlNJT04oKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2dlbi5zb2FwMTIud2l0aG91dC5leHRlbnNpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3B0aW9uYWwgcHJvdG9jb2wgIlhzb2FwMS4yIiBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgIi1leHRlbnNpb24iIG9wdGlvbi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTR0VOX1NPQVBfMTJfV0lUSE9VVF9FWFRFTlNJT04oKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0dFTl9TT0FQXzEyX1dJVEhPVVRfRVhURU5TSU9OKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0NPTVBJTEVfQ09NUElMQVRJT05fRkFJTEVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3Njb21waWxlLmNvbXBpbGF0aW9uRmFpbGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGlsYXRpb24gZmFpbGVkLCBlcnJvcnMgc2hvdWxkIGhhdmUgYmVlbiByZXBvcnRlZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NDT01QSUxFX0NPTVBJTEFUSU9OX0ZBSUxFRCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTQ09NUElMRV9DT01QSUxBVElPTl9GQUlMRUQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTQ09NUElMRV9NSVNTSU5HX09QVElPTl9BUkdVTUVOVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3Njb21waWxlLm1pc3NpbmdPcHRpb25Bcmd1bWVudCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIG9wdGlvbiAiezB9IiByZXF1aXJlcyBhbiBhcmd1bWVudAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NDT01QSUxFX01JU1NJTkdfT1BUSU9OX0FSR1VNRU5UKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0NPTVBJTEVfTUlTU0lOR19PUFRJT05fQVJHVU1FTlQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0dFTl9DQU5OT1RfR0VOX1dTRExfRk9SX05PTl9TT0FQX0JJTkRJTkcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2dlbi5jYW5ub3QuZ2VuLndzZGwuZm9yLm5vbi5zb2FwLmJpbmRpbmciLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3c2dlbiBjYW4gbm90IGdlbmVyYXRlIFdTREwgZm9yIG5vbi1TT0FQIGJpbmRpbmc6IHswfSBvbiBDbGFzcyB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTR0VOX0NBTk5PVF9HRU5fV1NETF9GT1JfTk9OX1NPQVBfQklORElORyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTR0VOX0NBTk5PVF9HRU5fV1NETF9GT1JfTk9OX1NPQVBfQklORElORyhhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTQ09NUElMRV9EVVBMSUNBVEVfT1BUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2NvbXBpbGUuZHVwbGljYXRlT3B0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZHVwbGljYXRlIG9wdGlvbjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0NPTVBJTEVfRFVQTElDQVRFX09QVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NDT01QSUxFX0RVUExJQ0FURV9PUFRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0lNUE9SVF9GQUlMRURfVE9fUEFSU0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2ltcG9ydC5GYWlsZWRUb1BhcnNlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbGVkIHRvIHBhcnNlICJ7MH0iOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSU1QT1JUX0ZBSUxFRF9UT19QQVJTRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTSU1QT1JUX0ZBSUxFRF9UT19QQVJTRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTSU1QT1JUX05PX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzaW1wb3J0Lm5vLndzZGwiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsZWQgdG8gcmVhZCB0aGUgV1NETCBkb2N1bWVudDogezB9LCBiZWNhdXNlIDEpIGNvdWxkIG5vdCBmaW5kIHRoZSBkb2N1bWVudDsgLzIpIHRoZSBkb2N1bWVudCBjb3VsZCBub3QgYmUgcmVhZDsgMykgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQgaXMgbm90IDx3c2RsOmRlZmluaXRpb25zPi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSU1QT1JUX05PX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTSU1QT1JUX05PX1dTREwoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0dFTl9VU0FHRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NnZW4udXNhZ2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2FnZTogezB9IFtvcHRpb25zXSA8U0VJPgorICAgICAqCisgICAgICogVXNlICJ3c2dlbiAtaGVscCIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2Ygb3B0aW9ucy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTR0VOX1VTQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0dFTl9VU0FHRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTR0VOX1NFUlZJQ0VOQU1FX01JU1NJTkdfTE9DQUxOQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2dlbi5zZXJ2aWNlbmFtZS5taXNzaW5nLmxvY2FsbmFtZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2aWNlIG5hbWUgInswfSIgaXMgbWlzc2luZyBhIGxvY2FsbmFtZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTR0VOX1NFUlZJQ0VOQU1FX01JU1NJTkdfTE9DQUxOQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0dFTl9TRVJWSUNFTkFNRV9NSVNTSU5HX0xPQ0FMTkFNRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTR0VOX1NFUlZJQ0VOQU1FX01JU1NJTkdfTkFNRVNQQUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2dlbi5zZXJ2aWNlbmFtZS5taXNzaW5nLm5hbWVzcGFjZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2aWNlIG5hbWUgInswfSIgaXMgbWlzc2luZyBhIG5hbWVzcGFjZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTR0VOX1NFUlZJQ0VOQU1FX01JU1NJTkdfTkFNRVNQQUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0dFTl9TRVJWSUNFTkFNRV9NSVNTSU5HX05BTUVTUEFDRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTR0VOX0lOVkFMSURfVFJBTlNQT1JUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NnZW4uaW52YWxpZC50cmFuc3BvcnQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAiezB9IiBpcyBub3QgYSBzdXBwb3J0ZWQgdHJhbnNwb3J0LiAgU3VwcG9ydGVkIHRyYW5zcG9ydCBpbmNsdWRlOiB7MX0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0dFTl9JTlZBTElEX1RSQU5TUE9SVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTR0VOX0lOVkFMSURfVFJBTlNQT1JUKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NHRU5fQ0FOTk9UX0dFTl9XU0RMX0ZPUl9TT0FQXzEyX0JJTkRJTkcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2dlbi5jYW5ub3QuZ2VuLndzZGwuZm9yLnNvYXAxMi5iaW5kaW5nIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogd3NnZW4gY2FuIG5vdCBnZW5lcmF0ZSBXU0RMIGZvciBTT0FQIDEuMiBiaW5kaW5nOiB7MH0gb24gY2xhc3M6IHsxfS4KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NHRU5fQ0FOTk9UX0dFTl9XU0RMX0ZPUl9TT0FQXzEyX0JJTkRJTkcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0dFTl9DQU5OT1RfR0VOX1dTRExfRk9SX1NPQVBfMTJfQklORElORyhhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTSU1QT1JUX0lMTEVHQUxfVEFSR0VUX1ZFUlNJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzaW1wb3J0LklMTEVHQUxfVEFSR0VUX1ZFUlNJT04iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAiezB9IiBpcyBub3QgYSB2YWxpZCB0YXJnZXQgdmVyc2lvbi4gIjIuMCIgYW5kICIyLjEiIGFyZSBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0lNUE9SVF9JTExFR0FMX1RBUkdFVF9WRVJTSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0lNUE9SVF9JTExFR0FMX1RBUkdFVF9WRVJTSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NHRU5fUE9SVE5BTUVfTUlTU0lOR19MT0NBTE5BTUUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZ2VuLnBvcnRuYW1lLm1pc3NpbmcubG9jYWxuYW1lIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgbmFtZSAiezB9IiBpcyBtaXNzaW5nIGEgbG9jYWxuYW1lLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NHRU5fUE9SVE5BTUVfTUlTU0lOR19MT0NBTE5BTUUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTR0VOX1BPUlROQU1FX01JU1NJTkdfTE9DQUxOQU1FKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NHRU5fUE9SVE5BTUVfTUlTU0lOR19OQU1FU1BBQ0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZ2VuLnBvcnRuYW1lLm1pc3NpbmcubmFtZXNwYWNlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgbmFtZSAiezB9IiBpcyBtaXNzaW5nIGEgbmFtZXNwYWNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NHRU5fUE9SVE5BTUVfTUlTU0lOR19OQU1FU1BBQ0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTR0VOX1BPUlROQU1FX01JU1NJTkdfTkFNRVNQQUNFKGFyZzApKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1dzZGxNZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvV3NkbE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzNDkwOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1dzZGxNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsOTc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdzZGxNZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLndzZGwiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6ZXIgbG9jYWxpemVyID0gbmV3IExvY2FsaXplcigpOworCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfRUxFTUVOVF9FWFBFQ1RFRCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcuZWxlbWVudEV4cGVjdGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5leHBlY3RlZCBub24tZWxlbWVudCBmb3VuZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19FTEVNRU5UX0VYUEVDVEVEKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19FTEVNRU5UX0VYUEVDVEVEKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFTlRJVFlfTk9UX0ZPVU5EX0JJTkRJTkcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlbnRpdHkubm90Rm91bmQuYmluZGluZyIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHdzZGw6YmluZGluZyAiezB9IiByZWZlcmVuY2VkIGJ5IHdzZGw6cG9ydCAiezF9IiwgYnV0IGl0cyBub3QgZm91bmQgaW4gdGhlIHdzZGwKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9OT1RfRk9VTkRfQklORElORyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVOVElUWV9OT1RfRk9VTkRfQklORElORyhhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfUEFSU0VfRkFJTEVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiUGFyc2luZy5QYXJzZUZhaWxlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWxlZCB0byBwYXJzZSB0aGUgV1NETC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfUEFSU0VfRkFJTEVEKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19QQVJTRV9GQUlMRUQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfVU5BQkxFX1RPX0dFVF9NRVRBREFUQShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy51bmFibGVUb0dldE1ldGFkYXRhIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5hYmxlIHRvIGdldCBNZXRhZGF0YSBmcm9tOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfVU5BQkxFX1RPX0dFVF9NRVRBREFUQShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19VTkFCTEVfVE9fR0VUX01FVEFEQVRBKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVkFMSURBVElPTl9JTlZBTElEX1BSRUZJWChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidmFsaWRhdGlvbi5pbnZhbGlkUHJlZml4IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5kZWNsYXJlZCBuYW1lc3BhY2UgcHJlZml4OiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9JTlZBTElEX1BSRUZJWChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9JTlZBTElEX1BSRUZJWChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJwYXJzaW5nLmludmFsaWRBdHRyaWJ1dGVWYWx1ZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgdmFsdWUgInsxfSIgZm9yIGF0dHJpYnV0ZSAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19JTlZBTElEX0FUVFJJQlVURV9WQUxVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNJTkdfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidmFsaWRhdGlvbi5pbnZhbGlkQXR0cmlidXRlVmFsdWUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIHZhbHVlICJ7MX0iIGZvciBhdHRyaWJ1dGUgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVkFMSURBVElPTl9JTlZBTElEX1JBTkdFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidmFsaWRhdGlvbi5pbnZhbGlkUmFuZ2UiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIHJhbmdlIGZvdW5kIChtaW46IHswfSwgbWF4OiB7MX0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0lOVkFMSURfUkFOR0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfUkFOR0UoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX0lOVkFMSURfVEFHKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5pbnZhbGlkVGFnIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXhwZWN0ZWQgZWxlbWVudCAiezF9IiwgZm91bmQgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfSU5WQUxJRF9UQUcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX0lOVkFMSURfVEFHKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRU5USVRZX05PVF9GT1VORF9QT1JUX1RZUEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlbnRpdHkubm90Rm91bmQucG9ydFR5cGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3c2RsOnBvcnRUeXBlICJ7MH0iIHJlZmVyZW5jZWQgYnkgd3NkbDpiaW5kaW5nICJ7MX0iLCBidXQgaXRzIG5vdCBmb3VuZCBpbiB0aGUgd3NkbAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX05PVF9GT1VORF9QT1JUX1RZUEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFTlRJVFlfTk9UX0ZPVU5EX1BPUlRfVFlQRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJwYXJzaW5nLm1pc3NpbmdSZXF1aXJlZEF0dHJpYnV0ZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlICJ7MX0iIG9mIGVsZW1lbnQgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUEFSU0lOR19JTlZBTElEX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJwYXJzaW5nLmludmFsaWRFbGVtZW50IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBlbGVtZW50OiAiezB9IiAoaW4gbmFtZXNwYWNlICJ7MX0iKQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19JTlZBTElEX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX0lOVkFMSURfRUxFTUVOVChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVZBTElEQVRJT05fSU5WQUxJRF9FTEVNRU5UKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ2YWxpZGF0aW9uLmludmFsaWRFbGVtZW50IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBlbGVtZW50OiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9JTlZBTElEX0VMRU1FTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVZBTElEQVRJT05fSU5WQUxJRF9FTEVNRU5UKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5URVJOQUxJWkVSX1RXT19WRVJTSU9OX0FUVFJJQlVURVMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJJbnRlcm5hbGl6ZXIuVHdvVmVyc2lvbkF0dHJpYnV0ZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCb3RoIGpheHdzOnZlcnNpb24gYW5kIHZlcnNpb24gYXJlIHByZXNlbnQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSTkFMSVpFUl9UV09fVkVSU0lPTl9BVFRSSUJVVEVTKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5URVJOQUxJWkVSX1RXT19WRVJTSU9OX0FUVFJJQlVURVMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVZBTElEQVRJT05fRFVQTElDQVRFX1BBUlRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24uZHVwbGljYXRlUGFydE5hbWUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIFdTREwsIGR1cGxpY2F0ZSBwYXJ0cyBpbiBhIHdzZGw6bWVzc2FnZSBpcyBub3QgYWxsb3dlZC4KKyAgICAgKiB3c2RsOm1lc3NhZ2UgezB9IGhhcyBkdXBsaWNhdGVkIHBhcnQgbmFtZTogInsxfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRFVQTElDQVRFX1BBUlRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVZBTElEQVRJT05fRFVQTElDQVRFX1BBUlRfTkFNRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfSU5WQUxJRF9XU0RMX0VMRU1FTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcuaW52YWxpZFdzZGxFbGVtZW50IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBXU0RMIGVsZW1lbnQ6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJTSU5HX0lOVkFMSURfV1NETF9FTEVNRU5UKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX0lOVkFMSURfV1NETF9FTEVNRU5UKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVkFMSURBVElPTl9JTlZBTElEX0NPTVBMRVhfVFlQRV9JTl9FTEVNRU5UKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidmFsaWRhdGlvbi5pbnZhbGlkQ29tcGxleFR5cGVJbkVsZW1lbnQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIGVsZW1lbnQ6ICJ7MX0iLCBoYXMgbmFtZWQgY29tcGxleFR5cGU6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0lOVkFMSURfQ09NUExFWF9UWVBFX0lOX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfQ09NUExFWF9UWVBFX0lOX0VMRU1FTlQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX05PTl9XSElURVNQQUNFX1RFWFRfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcubm9uV2hpdGVzcGFjZVRleHRGb3VuZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZvdW5kIHVuZXhwZWN0ZWQgbm9uIHdoaXRlc3BhY2UgdGV4dDogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfTk9OX1dISVRFU1BBQ0VfVEVYVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19OT05fV0hJVEVTUEFDRV9URVhUX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5URVJOQUxJWkVSX1RBUkdFVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludGVybmFsaXplci50YXJnZXROb3RGb3VuZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIHRhcmdldCBmb3VuZCBmb3IgdGhlIHdzZGxMb2NhdGlvbjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlRFUk5BTElaRVJfVEFSR0VUX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5URVJOQUxJWkVSX1RBUkdFVF9OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVWQUxJREFUSU9OX05PVF9TSU1QTEVfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidmFsaWRhdGlvbi5ub3RTaW1wbGVUeXBlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbm90IGEgc2ltcGxlIHR5cGU6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX05PVF9TSU1QTEVfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9OT1RfU0lNUExFX1RZUEUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX1NBWF9FWENFUFRJT05fV0lUSF9TWVNURU1fSUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcuc2F4RXhjZXB0aW9uV2l0aFN5c3RlbUlkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBXU0RMIGZpbGUhIGZhaWxlZCB0byBwYXJzZSBkb2N1bWVudCBhdCAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19TQVhfRVhDRVBUSU9OX1dJVEhfU1lTVEVNX0lEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX1NBWF9FWENFUFRJT05fV0lUSF9TWVNURU1fSUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX1JFUVVJUkVEX0VYVEVOU0lCSUxJVFlfRUxFTUVOVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcucmVxdWlyZWRFeHRlbnNpYmlsaXR5RWxlbWVudCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVua25vd24gcmVxdWlyZWQgZXh0ZW5zaWJpbGl0eSBlbGVtZW50ICJ7MH0iIChpbiBuYW1lc3BhY2UgInsxfSIpCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJTSU5HX1JFUVVJUkVEX0VYVEVOU0lCSUxJVFlfRUxFTUVOVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNJTkdfUkVRVUlSRURfRVhURU5TSUJJTElUWV9FTEVNRU5UKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRU5USVRZX05PVF9GT1VORF9CWV9JRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZW50aXR5Lm5vdEZvdW5kQnlJRCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgZW50aXR5IGlkOiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX05PVF9GT1VORF9CWV9JRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRU5USVRZX05PVF9GT1VORF9CWV9JRChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVZBTElEQVRJT05fRVhDTFVTSVZFX0FUVFJJQlVURVMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ2YWxpZGF0aW9uLmV4Y2x1c2l2ZUF0dHJpYnV0ZXMiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBleGNsdXNpdmUgYXR0cmlidXRlczogInswfSIsICJ7MX0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0VYQ0xVU0lWRV9BVFRSSUJVVEVTKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9FWENMVVNJVkVfQVRUUklCVVRFUyhhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVZBTElEQVRJT05fTUlTU0lOR19SRVFVSVJFRF9TVUJfRU5USVRZKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidmFsaWRhdGlvbi5taXNzaW5nUmVxdWlyZWRTdWJFbnRpdHkiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtaXNzaW5nIHJlcXVpcmVkIHN1Yi1lbnRpdHkgInswfSIgb2YgZWxlbWVudCAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9NSVNTSU5HX1JFUVVJUkVEX1NVQl9FTlRJVFkoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVWQUxJREFUSU9OX01JU1NJTkdfUkVRVUlSRURfU1VCX0VOVElUWShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVEVSTkFMSVpFUl9JTkNPUlJFQ1RfVkVSU0lPTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIkludGVybmFsaXplci5JbmNvcnJlY3RWZXJzaW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkFYV1MgdmVyc2lvbiBhdHRyaWJ1dGUgbXVzdCBiZSAiMi4wIgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5URVJOQUxJWkVSX0lOQ09SUkVDVF9WRVJTSU9OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5URVJOQUxJWkVSX0lOQ09SUkVDVF9WRVJTSU9OKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVMT0NBTElaRURfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImxvY2FsaXplZC5lcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUxJWkVEX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVMT0NBTElaRURfRVJST1IoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFTlRJVFlfRFVQTElDQVRFX1dJVEhfVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImVudGl0eS5kdXBsaWNhdGVXaXRoVHlwZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGR1cGxpY2F0ZSAiezB9IiBlbnRpdHk6ICJ7MX0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfRFVQTElDQVRFX1dJVEhfVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVOVElUWV9EVVBMSUNBVEVfV0lUSF9UWVBFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUEFSU0lOR19PTkxZX09ORV9PRl9FTEVNRU5UX09SX1RZUEVfUkVRVUlSRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcub25seU9uZU9mRWxlbWVudE9yVHlwZVJlcXVpcmVkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogb25seSBvbmUgb2YgdGhlICJlbGVtZW50IiBvciAidHlwZSIgYXR0cmlidXRlcyBpcyBhbGxvd2VkIGluIHBhcnQgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfT05MWV9PTkVfT0ZfRUxFTUVOVF9PUl9UWVBFX1JFUVVJUkVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX09OTFlfT05FX09GX0VMRU1FTlRfT1JfVFlQRV9SRVFVSVJFRChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfSU5DT1JSRUNUX1JPT1RfRUxFTUVOVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLCBPYmplY3QgYXJnMykgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5pbmNvcnJlY3RSb290RWxlbWVudCIsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4cGVjdGVkIHJvb3QgZWxlbWVudCAiezJ9IiAoaW4gbmFtZXNwYWNlICJ7M30iKSwgZm91bmQgZWxlbWVudCAiezB9IiAoaW4gbmFtZXNwYWNlICJ7MX0iKQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19JTkNPUlJFQ1RfUk9PVF9FTEVNRU5UKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX0lOQ09SUkVDVF9ST09UX0VMRU1FTlQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVWQUxJREFUSU9OX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidmFsaWRhdGlvbi5taXNzaW5nUmVxdWlyZWRBdHRyaWJ1dGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSAiezB9IiBvZiBlbGVtZW50ICJ7MX0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9NSVNTSU5HX1JFUVVJUkVEX0FUVFJJQlVURShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVEVSTkFMSVpFUl9YX1BBVEhfRVZBVUxBVEVTX1RPX1RPT19NQU5ZX1RBUkdFVFMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnRlcm5hbGl6ZXIuWFBhdGhFdmF1bGF0ZXNUb1Rvb01hbnlUYXJnZXRzIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWFBhdGggZXZhbHVhdGlvbiBvZiAiezB9IiByZXN1bHRzIGluIHRvbyBtYW55ICh7MX0pIHRhcmdldCBub2RlcworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5URVJOQUxJWkVSX1hfUEFUSF9FVkFVTEFURVNfVE9fVE9PX01BTllfVEFSR0VUUyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVEVSTkFMSVpFUl9YX1BBVEhfRVZBVUxBVEVTX1RPX1RPT19NQU5ZX1RBUkdFVFMoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX0lPX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5pb0V4Y2VwdGlvbiIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhcnNpbmcgZmFpbGVkOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfSU9fRVhDRVBUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX0lPX0VYQ0VQVElPTihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNFUl9OT1RfQV9CSU5ESU5HX0ZJTEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJQYXJzZXIuTm90QUJpbmRpbmdGaWxlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbm90IGFuIGV4dGVybmFsIGJpbmRpbmcgZmlsZS4gVGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlICd7J2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheHdzJ30nYmluZGluZ3MgYnV0IGl0IGlzICd7J3swfSd9J3sxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0VSX05PVF9BX0JJTkRJTkdfRklMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNFUl9OT1RfQV9CSU5ESU5HX0ZJTEUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX1VOS05PV05fTkFNRVNQQUNFX1BSRUZJWChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy51bmtub3duTmFtZXNwYWNlUHJlZml4IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5kZWNsYXJlZCBuYW1lc3BhY2UgcHJlZml4OiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19VTktOT1dOX05BTUVTUEFDRV9QUkVGSVgoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNJTkdfVU5LTk9XTl9OQU1FU1BBQ0VfUFJFRklYKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUEFSU0lOR19GQUNUT1JZX0NPTkZJR19FWENFUFRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcuZmFjdG9yeUNvbmZpZ0V4Y2VwdGlvbiIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgV1NETCBmaWxlISBwYXJzaW5nIGZhaWxlZDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJTSU5HX0ZBQ1RPUllfQ09ORklHX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19GQUNUT1JZX0NPTkZJR19FWENFUFRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVWQUxJREFUSU9OX01JU1NJTkdfUkVRVUlSRURfUFJPUEVSVFkoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ2YWxpZGF0aW9uLm1pc3NpbmdSZXF1aXJlZFByb3BlcnR5IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSAiezB9IiBvZiBlbGVtZW50ICJ7MX0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX01JU1NJTkdfUkVRVUlSRURfUFJPUEVSVFkoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVWQUxJREFUSU9OX01JU1NJTkdfUkVRVUlSRURfUFJPUEVSVFkoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX0lOVkFMSURfT1BFUkFUSU9OX1NUWUxFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJwYXJzaW5nLmludmFsaWRPcGVyYXRpb25TdHlsZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIG9wZXJhdGlvbiAiezB9IiBoYXMgYW4gaW52YWxpZCBzdHlsZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19JTlZBTElEX09QRVJBVElPTl9TVFlMRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19JTlZBTElEX09QRVJBVElPTl9TVFlMRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVEVSTkFMSVpFUl9YX1BBVEhfRVZBTFVBVElPTl9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW50ZXJuYWxpemVyLlhQYXRoRXZhbHVhdGlvbkVycm9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWFBhdGggZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5URVJOQUxJWkVSX1hfUEFUSF9FVkFMVUFUSU9OX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlRFUk5BTElaRVJfWF9QQVRIX0VWQUxVQVRJT05fRVJST1IoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfVE9LRU4oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24uaW52YWxpZFRva2VuIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCB0b2tlbiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9JTlZBTElEX1RPS0VOKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfVE9LRU4oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfU1VCX0VOVElUWShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24uaW52YWxpZFN1YkVudGl0eSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgc3ViLWVsZW1lbnQgInswfSIgb2YgZWxlbWVudCAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9JTlZBTElEX1NVQl9FTlRJVFkoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfU1VCX0VOVElUWShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVZBTElEQVRJT05fU0hPVUxEX05PVF9IQVBQRU4oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24uc2hvdWxkTm90SGFwcGVuIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW50ZXJuYWwgZXJyb3IgKCJ7MH0iKQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9TSE9VTERfTk9UX0hBUFBFTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9TSE9VTERfTk9UX0hBUFBFTihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUFCU1RSQUNUX1JFRkVSRU5DRV9GSU5ERVJfSU1QTF9VTkFCTEVfVE9fUEFSU0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJBYnN0cmFjdFJlZmVyZW5jZUZpbmRlckltcGwuVW5hYmxlVG9QYXJzZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuYWJsZSB0byBwYXJzZSAiezB9IiA6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUJTVFJBQ1RfUkVGRVJFTkNFX0ZJTkRFUl9JTVBMX1VOQUJMRV9UT19QQVJTRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUFCU1RSQUNUX1JFRkVSRU5DRV9GSU5ERVJfSU1QTF9VTkFCTEVfVE9fUEFSU0UoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXQVJOSU5HX0ZBVUxUX0VNUFRZX0FDVElPTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3YXJuaW5nLmZhdWx0RW1wdHlBY3Rpb24iLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmluZyBlbXB0eSBBY3Rpb24gaW4gInswfSIgezF9IGVsZW1lbnQgb2YgInsyfSIgb3BlcmF0aW9uLCB1c2luZyBkZWZhdWx0IGluc3RlYWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfRkFVTFRfRU1QVFlfQUNUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdBUk5JTkdfRkFVTFRfRU1QVFlfQUNUSU9OKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUEFSU0lOR19JTlZBTElEX0VYVEVOU0lPTl9FTEVNRU5UKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5pbnZhbGlkRXh0ZW5zaW9uRWxlbWVudCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgZXh0ZW5zaW9uIGVsZW1lbnQ6ICJ7MH0iIChpbiBuYW1lc3BhY2UgInsxfSIpCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJTSU5HX0lOVkFMSURfRVhURU5TSU9OX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX0lOVkFMSURfRVhURU5TSU9OX0VMRU1FTlQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlRFUk5BTElaRVJfWF9QQVRIX0VWQUxVQVRFU19UT19OT05fRUxFTUVOVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW50ZXJuYWxpemVyLlhQYXRoRXZhbHVhdGVzVG9Ob25FbGVtZW50IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWFBhdGggZXZhbHVhdGlvbiBvZiAiezB9IiBuZWVkcyB0byByZXN1bHQgaW4gYW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSTkFMSVpFUl9YX1BBVEhfRVZBTFVBVEVTX1RPX05PTl9FTEVNRU5UKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlRFUk5BTElaRVJfWF9QQVRIX0VWQUxVQVRFU19UT19OT05fRUxFTUVOVChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVEVSTkFMSVpFUl9YX1BBVEhfRVZBTFVBVEVTX1RPX05PX1RBUkdFVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW50ZXJuYWxpemVyLlhQYXRoRXZhbHVhdGVzVG9Ob1RhcmdldCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFhQYXRoIGV2YWx1YXRpb24gb2YgInswfSIgcmVzdWx0cyBpbiBlbXB0eSB0YXJnZXQgbm9kZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5URVJOQUxJWkVSX1hfUEFUSF9FVkFMVUFURVNfVE9fTk9fVEFSR0VUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlRFUk5BTElaRVJfWF9QQVRIX0VWQUxVQVRFU19UT19OT19UQVJHRVQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX1NBWF9FWENFUFRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcuc2F4RXhjZXB0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBXU0RMIGZpbGUhIHBhcnNpbmcgZmFpbGVkOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfU0FYX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19TQVhfRVhDRVBUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9DVVNUT01JWkFUSU9OX05BTUVTUEFDRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC5jdXN0b21pemF0aW9uLm5hbWVzcGFjZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yaW5nIGN1c3RvbWl6YXRpb246ICJ7MH0iLCBpdCBoYXMgbm8gbmFtZXNwYWNlLiBJdCBtdXN0IGJlbG9uZyB0byB0aGUgY3VzdG9taXphdGlvbiBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX0NVU1RPTUlaQVRJT05fTkFNRVNQQUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX0NVU1RPTUlaQVRJT05fTkFNRVNQQUNFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVkFMSURBVElPTl9JTlZBTElEX0FUVFJJQlVURShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24uaW52YWxpZEF0dHJpYnV0ZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgYXR0cmlidXRlICJ7MH0iIG9mIGVsZW1lbnQgInsxfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fSU5WQUxJRF9BVFRSSUJVVEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVWQUxJREFUSU9OX0lOVkFMSURfQVRUUklCVVRFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUEFSU0lOR19QQVJTRVJfQ09ORklHX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5wYXJzZXJDb25maWdFeGNlcHRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIFdTREwgZmlsZSEgcGFyc2luZyBmYWlsZWQ6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19QQVJTRVJfQ09ORklHX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19QQVJTRVJfQ09ORklHX0VYQ0VQVElPTihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfT05MWV9PTkVfVFlQRVNfQUxMT1dFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5vbmx5T25lVHlwZXNBbGxvd2VkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogb25seSBvbmUgInR5cGVzIiBlbGVtZW50IGFsbG93ZWQgaW4gInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlNJTkdfT05MWV9PTkVfVFlQRVNfQUxMT1dFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19PTkxZX09ORV9UWVBFU19BTExPV0VEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUEFSU0lOR19JTlZBTElEX1VSSShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5pbnZhbGlkVVJJIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBVUkk6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19JTlZBTElEX1VSSShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19JTlZBTElEX1VSSShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVZBTElEQVRJT05fSU5DT1JSRUNUX1RBUkdFVF9OQU1FU1BBQ0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ2YWxpZGF0aW9uLmluY29ycmVjdFRhcmdldE5hbWVzcGFjZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRhcmdldCBuYW1lc3BhY2UgaXMgaW5jb3JyZWN0IChleHBlY3RlZDogezF9LCBmb3VuZDogezB9KQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9JTkNPUlJFQ1RfVEFSR0VUX05BTUVTUEFDRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVZBTElEQVRJT05fSU5DT1JSRUNUX1RBUkdFVF9OQU1FU1BBQ0UoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFTlRJVFlfTk9UX0ZPVU5EX0JZX1FfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImVudGl0eS5ub3RGb3VuZEJ5UU5hbWUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIGVudGl0eSBuYW1lOiAiezB9IiAoaW4gbmFtZXNwYWNlOiAiezF9IikKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9OT1RfRk9VTkRfQllfUV9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRU5USVRZX05PVF9GT1VORF9CWV9RX05BTUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQud3NkbCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqICJ7MH0gZG9lcyBub3QgbG9vayBsaWtlIGEgV1NETCBkb2N1bWVudCwgcmV0cnlpbmcgd2l0aCBNRVguLi4iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfV1NETChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVZBTElEQVRJT05fVU5TVVBQT1JURURfU0NIRU1BX0ZFQVRVUkUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24udW5zdXBwb3J0ZWRTY2hlbWFGZWF0dXJlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5zdXBwb3J0ZWQgWE1MIFNjaGVtYSBmZWF0dXJlOiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9VTlNVUFBPUlRFRF9TQ0hFTUFfRkVBVFVSRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9VTlNVUFBPUlRFRF9TQ0hFTUFfRkVBVFVSRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfVU5LTk9XTl9JTVBPUlRFRF9ET0NVTUVOVF9UWVBFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJwYXJzaW5nLnVua25vd25JbXBvcnRlZERvY3VtZW50VHlwZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGltcG9ydGVkIGRvY3VtZW50IGlzIG9mIHVua25vd24gdHlwZTogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJTSU5HX1VOS05PV05fSU1QT1JURURfRE9DVU1FTlRfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19VTktOT1dOX0lNUE9SVEVEX0RPQ1VNRU5UX1RZUEUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX0lPX0VYQ0VQVElPTl9XSVRIX1NZU1RFTV9JRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5pb0V4Y2VwdGlvbldpdGhTeXN0ZW1JZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZhaWxlZCB0byBwYXJzZSBkb2N1bWVudCBhdCAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19JT19FWENFUFRJT05fV0lUSF9TWVNURU1fSUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNJTkdfSU9fRVhDRVBUSU9OX1dJVEhfU1lTVEVNX0lEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVkFMSURBVElPTl9BTUJJR1VPVVNfTkFNRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidmFsaWRhdGlvbi5hbWJpZ3VvdXNOYW1lIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYW1iaWd1b3VzIG9wZXJhdGlvbiBuYW1lOiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9BTUJJR1VPVVNfTkFNRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9BTUJJR1VPVVNfTkFNRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfV1NETF9OT1RfREVGQVVMVF9OQU1FU1BBQ0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcud3NkbE5vdERlZmF1bHROYW1lc3BhY2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZWZhdWx0IG5hbWVzcGFjZSBtdXN0IGJlICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJTSU5HX1dTRExfTk9UX0RFRkFVTFRfTkFNRVNQQUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVQQVJTSU5HX1dTRExfTk9UX0RFRkFVTFRfTkFNRVNQQUNFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVkFMSURBVElPTl9EVVBMSUNBVEVEX0VMRU1FTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24uZHVwbGljYXRlZEVsZW1lbnQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkdXBsaWNhdGVkIGVsZW1lbnQ6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0RVUExJQ0FURURfRUxFTUVOVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9EVVBMSUNBVEVEX0VMRU1FTlQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlRFUk5BTElaRVJfVEFSR0VUX05PVF9BTl9FTEVNRU5UKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW50ZXJuYWxpemVyLnRhcmdldE5vdEFuRWxlbWVudCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRhcmdldCBub2RlIGlzIG5vdCBhbiBlbGVtZW50CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlRFUk5BTElaRVJfVEFSR0VUX05PVF9BTl9FTEVNRU5UKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5URVJOQUxJWkVSX1RBUkdFVF9OT1RfQU5fRUxFTUVOVCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0FSTklOR19JTlBVVF9PVVRQVVRfRU1QVFlfQUNUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2FybmluZy5pbnB1dE91dHB1dEVtcHR5QWN0aW9uIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JpbmcgZW1wdHkgQWN0aW9uIGluIHswfSBlbGVtZW50IG9mICJ7MX0iIG9wZXJhdGlvbiwgdXNpbmcgZGVmYXVsdCBpbnN0ZWFkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXQVJOSU5HX0lOUFVUX09VVFBVVF9FTVBUWV9BQ1RJT04oT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXQVJOSU5HX0lOUFVUX09VVFBVVF9FTVBUWV9BQ1RJT04oYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX0lOVkFMSURfVEFHX05TKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczLCBPYmplY3QgYXJnNCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy5pbnZhbGlkVGFnTlMiLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIFdTREwgYXQgezR9OiBleHBlY3RlZCBlbGVtZW50ICJ7Mn0iIChpbiBuYW1lc3BhY2UgInszfSIpLCBmb3VuZCBlbGVtZW50ICJ7MH0iIChpbiBuYW1lc3BhY2UgInsxfSIpCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJTSU5HX0lOVkFMSURfVEFHX05TKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczLCBPYmplY3QgYXJnNCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUEFSU0lOR19JTlZBTElEX1RBR19OUyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVkFMSURfV1NETF9XSVRIX0RPT0MoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLndzZGwud2l0aC5kb29jIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIk5vdCBhIFdTREwgZG9jdW1lbnQ6IHswfSwgaXQgZ2l2ZXMgInsxfSIsIHJldHJ5aW5nIHdpdGggTUVYLi4uIgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9XU0RMX1dJVEhfRE9PQyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfV1NETF9XSVRIX0RPT0MoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVQQVJTSU5HX05PVF9BV1NETChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiUGFyc2luZy5Ob3RBV1NETCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWxlZCB0byBnZXQgV1NETCBjb21wb25lbnRzLCBwcm9iYWJseSB7MH0gaXMgbm90IGEgdmFsaWQgV1NETCBmaWxlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19OT1RfQVdTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNJTkdfTk9UX0FXU0RMKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRU5USVRZX0RVUExJQ0FURShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZW50aXR5LmR1cGxpY2F0ZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGR1cGxpY2F0ZSBlbnRpdHk6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfRFVQTElDQVRFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFTlRJVFlfRFVQTElDQVRFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0FSTklOR19XU0lfUl8yMDA0KCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2FybmluZy53c2kucjIwMDQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3QgYSBXU0ktQlAgY29tcGxpYW50IFdTREwgKFIyMDAxLCBSMjAwNCkuIHhzZDppbXBvcnQgbXVzdCBub3QgaW1wb3J0IFhNTCBTY2hlbWEgZGVmaW5pdGlvbiBlbW1iZWRkZWQgaW5saW5lIHdpdGhpbiBXU0RMRG9jdW1lbnQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXQVJOSU5HX1dTSV9SXzIwMDQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXQVJOSU5HX1dTSV9SXzIwMDQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdBUk5JTkdfV1NJX1JfMjAwMygpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndhcm5pbmcud3NpLnIyMDAzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90IGEgV1NJLUJQIGNvbXBsaWFudCBXU0RMIChSMjAwMykuIHhzZDppbXBvcnQgbXVzdCBvbmx5IGJlIHVzZWQgaW5zaWRlIHhzZDpzY2hlbWEgZWxlbWVudC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfV1NJX1JfMjAwMygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdBUk5JTkdfV1NJX1JfMjAwMygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0FSTklOR19XU0lfUl8yMDAyKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2FybmluZy53c2kucjIwMDIiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3QgYSBXU0ktQlAgY29tcGxpYW50IFdTREwgKFIyMDAyKS4gd3NkbDppbXBvcnQgbXVzdCBub3QgYmUgdXNlZCB0byBpbXBvcnQgWE1MIFNjaGVtYSBlbWJlZGRlZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gRXhwZWN0ZWQgd3NkbCBuYW1lc2FwY2U6IHswfSwgZm91bmQ6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSTklOR19XU0lfUl8yMDAyKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0FSTklOR19XU0lfUl8yMDAyKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUEFSU0lOR19FTEVNRU5UX09SX1RZUEVfUkVRVUlSRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcuZWxlbWVudE9yVHlwZVJlcXVpcmVkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogd2FybmluZzogcGFydCB7MH0gaXMgaWdub3JlZCwgZWl0aGVyIHRoZSAiZWxlbWVudCIgb3IgdGhlICJ0eXBlIiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaW4gcGFydCAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19FTEVNRU5UX09SX1RZUEVfUkVRVUlSRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNJTkdfRUxFTUVOVF9PUl9UWVBFX1JFUVVJUkVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV0FSTklOR19XU0lfUl8yMDAxKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3YXJuaW5nLndzaS5yMjAwMSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdCBhIFdTSS1CUCBjb21wbGlhbnQgV1NETCAoUjIwMDEsIFIyMDAyKS4gd3NkbDppbXBvcnQgbXVzdCBvbmx5IGltcG9ydCBXU0RMIGRvY3VtZW50LiBJdHMgdHJ5aW5nIHRvIGltcG9ydDogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfV1NJX1JfMjAwMShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV0FSTklOR19XU0lfUl8yMDAxKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVkFMSURBVElPTl9JTlZBTElEX1NJTVBMRV9UWVBFX0lOX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ2YWxpZGF0aW9uLmludmFsaWRTaW1wbGVUeXBlSW5FbGVtZW50IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW52YWxpZCBlbGVtZW50OiAiezF9IiwgaGFzIG5hbWVkIHNpbXBsZVR5cGU6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0lOVkFMSURfU0lNUExFX1RZUEVfSU5fRUxFTUVOVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVZBTElEQVRJT05fSU5WQUxJRF9TSU1QTEVfVFlQRV9JTl9FTEVNRU5UKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogb25seSBvbmUgImRvY3VtZW50YXRpb24iIGVsZW1lbnQgYWxsb3dlZCBpbiAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNJTkdfT05MWV9PTkVfRE9DVU1FTlRBVElPTl9BTExPV0VEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5URVJOQUxJWkVSX1ZFUlNJT05fTk9UX1BSRVNFTlQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJJbnRlcm5hbGl6ZXIuVmVyc2lvbk5vdFByZXNlbnQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKQVhXUyB2ZXJzaW9uIGF0dHJpYnV0ZSBtdXN0IGJlIHByZXNlbnQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSTkFMSVpFUl9WRVJTSU9OX05PVF9QUkVTRU5UKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5URVJOQUxJWkVSX1ZFUlNJT05fTk9UX1BSRVNFTlQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBBUlNJTkdfVE9PX01BTllfRUxFTUVOVFMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicGFyc2luZy50b29NYW55RWxlbWVudHMiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b28gbWFueSAiezB9IiBlbGVtZW50cyB1bmRlciAiezF9IiBlbGVtZW50ICJ7Mn0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJTSU5HX1RPT19NQU5ZX0VMRU1FTlRTKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBBUlNJTkdfVE9PX01BTllfRUxFTUVOVFMoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlRFUk5BTElaRVJfSU5DT1JSRUNUX1NDSEVNQV9SRUZFUkVOQ0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJJbnRlcm5hbGl6ZXIuSW5jb3JyZWN0U2NoZW1hUmVmZXJlbmNlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogInswfSIgaXMgbm90IGEgcGFydCBvZiB0aGlzIGNvbXBpbGF0aW9uLiBJcyB0aGlzIGEgbWlzdGFrZSBmb3IgInsxfSI/CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlRFUk5BTElaRVJfSU5DT1JSRUNUX1NDSEVNQV9SRUZFUkVOQ0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlRFUk5BTElaRVJfSU5DT1JSRUNUX1NDSEVNQV9SRUZFUkVOQ0UoYXJnMCwgYXJnMSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvY29uZmlndXJhdGlvbi5wcm9wZXJ0aWVzCmluZGV4IDdjODFmNDguLjU2YWRlYjMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24ucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9jb25maWd1cmF0aW9uLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsNyArMjEsNyBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogY29uZmlndXJhdGlvbi5pbnZhbGlkRWxlbWVudD1pbnZhbGlkIGVsZW1lbnQgXCJ7Mn1cIiBpbiBmaWxlIFwiezB9XCIgKGxpbmUgezF9KQogY29uZmlndXJhdGlvbi5ub3RCaW5kaW5nRmlsZT1JZ25vcmluZzogYmluZGluZyBmaWxlICJcInswfVwiLiBJdCBpcyBub3QgYSBqYXh3cyBvciBhIGpheGIgYmluZGluZyBmaWxlLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvZ2VuZXJhdG9yLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9nZW5lcmF0b3IucHJvcGVydGllcwppbmRleCAxYzk2ZDg2Li4zNWU1ZWU0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9nZW5lcmF0b3IucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9nZW5lcmF0b3IucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw3ICsyMSw3IEBACiAjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIyBoYXZlIGFueSBxdWVzdGlvbnMuCi0jIAorIwogCiAjIEdlbmVyYXRvcgogZ2VuZXJhdG9yLm5lc3RlZEdlbmVyYXRvckVycm9yPWdlbmVyYXRvciBlcnJvcjogezB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9qYXZhY29tcGlsZXIucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2phdmFjb21waWxlci5wcm9wZXJ0aWVzCmluZGV4IDI4MWVjZjguLjYwNGRhNWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2phdmFjb21waWxlci5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2phdmFjb21waWxlci5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDEyICsyMSwxMiBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogIwogIyBHZW5lcmljIE1lc3NhZ2VzCiAjCi1qYXZhY29tcGlsZXIuY2xhc3NwYXRoLmVycm9yPXswfSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBjbGFzc3BhdGguCi1qYXZhY29tcGlsZXIubm9zdWNobWV0aG9kLmVycm9yPVRoZXJlIGlzIG5vIHN1Y2ggbWV0aG9kIHswfSBhdmFpbGFibGUuCitqYXZhY29tcGlsZXIuY2xhc3NwYXRoLmVycm9yPXswfSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBjbGFzc3BhdGgsIHJlcXVpcmVzIFN1bidzIEpESyB2ZXJzaW9uIDUuMCBvciBsYXR0ZXIuCitqYXZhY29tcGlsZXIubm9zdWNobWV0aG9kLmVycm9yPVRoZXJlIGlzIG5vIHN1Y2ggbWV0aG9kIHswfSBhdmFpbGFibGUsIHJlcXVpcmVzIFN1bidzIEpESyB2ZXJzaW9uIDUuMCBvciBsYXR0ZXIuCiBqYXZhY29tcGlsZXIuZXJyb3I9ZXJyb3IgOiB7MH0uCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9tb2RlbC5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvbW9kZWwucHJvcGVydGllcwppbmRleCAyY2RlYjdkLi4xNzA3NmNmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9tb2RlbC5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL21vZGVsLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsNyArMjEsOCBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKKwogCiBtb2RlbC5uZXN0ZWRNb2RlbEVycm9yPW1vZGVsIGVycm9yOiB7MH0KIG1vZGVsLmR1cGxpY2F0ZS5wb3J0dHlwZT1kdXBsaWNhdGUgUG9ydFR5cGUgYWRkZWQgdG8gbW9kZWw6IHswfQpAQCAtMzEsNyArMzIsNiBAQAogbW9kZWwuZHVwbGljYXRlLnByb3BlcnR5PWR1cGxpY2F0ZSBwcm9wZXJ0eSBhZGRlZCB0byBtb2RlbDogezB9CiBtb2RlbC5kdXBsaWNhdGUuc2VydmljZT1kdXBsaWNhdGUgc2VydmljZSBhZGRlZCB0byBtb2RlbDogezB9CiBtb2RlbC5pbnZhbGlkLm1lc3NhZ2UudHlwZT1pbnZhbGlkIG1lc3NhZ2UgdHlwZTogezB9Ci1tb2RlbC5pbnZhbGlkLnByb2Nlc3NvckFjdGlvblZlcnNpb249aW52YWxpZCBQcm9jZXNzb3JBY3Rpb25WZXJzaW9uOiB7MH0KIAogbW9kZWwuc2NoZW1hLm5vdEltcGxlbWVudGVkPXVuc3VwcG9ydGVkIFhNTCBTY2hlbWEgZmVhdHVyZSAoezB9KQogbW9kZWwuc2NoZW1hLmNpcmN1bGFyaXR5PWNpcmN1bGFyaXR5IGRldGVjdGVkIGluIHNjaGVtYTogXCJ7MH1cIgpAQCAtNTcsNiArNTcsOSBAQAogbW9kZWwuc2NoZW1hLmludmFsaWRXaWxkY2FyZC5hbGxDb21wb3NpdG9yPXhzZDphbGwgY29tcG9zaXRvciBub3Qgc3VwcG9ydGVkIGZvciB0aGUgd2lsZGNhcmQgaW4gc2NoZW1hIHR5cGU6IFwiezB9XCIKIAogbW9kZWwudW5pcXVlbmVzcz11bmlxdWVuZXNzIGNvbnN0cmFpbnQgdmlvbGF0aW9uCittb2RlbC5wYXJ0Lm5vdFVuaXF1ZT1wYXJ0cyBpbiB3c2RsOm1lc3NhZ2UgXCJ7MH1cIiwgcmVmZXJlbmNlIFwiezF9XCIsIHRoZXkgbXVzdCByZWZlcmVuY2UgdW5pcXVlIGdsb2JhbCBlbGVtZW50cy4KK21vZGVsLnBhcmFtZXRlci5ub3R1bmlxdWU9RmFpbGVkIHRvIGdlbmVyYXRlIEphdmEgc2lnbmF0dXJlOiBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzIHswfS4gVXNlIEpBWFdTIGJpbmRpbmcgY3VzdG9taXphdGlvbiB0byByZW5hbWUgdGhlIHdzZGw6cGFydCBcInsxfVwiCittb2RlbC5leGNlcHRpb24ubm90dW5pcXVlPUZhaWxlZCB0byBnZW5lcmF0ZSBKYXZhIHNpZ25hdHVyZTogZHVwbGljYXRlIGV4Y2VwdGlvbiBuYW1lcyB7MH0uIFVzZSBKQVhXUyBiaW5kaW5nIGN1c3RvbWl6YXRpb24gdG8gcmVuYW1lIHRoZSB3c2RsOnBhcnQgXCJ7MX1cIgogbW9kZWwudW5pcXVlbmVzcy5qYXZhc3RydWN0dXJldHlwZT11bmlxdWVuZXNzIGNvbnN0cmFpbnQgdmlvbGF0aW9uLCBkdXBsaWNhdGUgbWVtYmVyIFwiezB9XCIgYWRkZWQgdG8gSmF2YVN0cnVjdHVyZVR5cGUgXCJ7MX1cIgogbW9kZWwucGFyZW50LnR5cGUuYWxyZWFkeS5zZXQ9cGFyZW50IG9mIHR5cGUgXCJ7MH1cIiBhbHJlYWR5IHNldCB0byBcInsxfVwiLCBuZXcgdmFsdWUgPSBcInsyfVwiCiBtb2RlbC5wYXJlbnQuZmF1bHQuYWxyZWFkeS5zZXQ9cGFyZW50IG9mIGZhdWx0IFwiezB9XCIgYWxyZWFkeSBzZXQgdG8gXCJ7MX1cIiwgbmV3IHZhbHVlID0gXCJ7Mn1cIgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvbW9kZWxlci5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvbW9kZWxlci5wcm9wZXJ0aWVzCmluZGV4IDkwNmRkYzQuLmI0MjI4NjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL21vZGVsZXIucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy9tb2RlbGVyLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsNyArMjEsNyBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogIyBnZW5lcmFsCiBtb2RlbGVyLm5lc3RlZE1vZGVsRXJyb3I9bW9kZWxlciBlcnJvcjogezB9CkBAIC02MiwxNCArNjIsMTYgQEAKIHdzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdVbnJlY29nbml6ZWRTY2hlbWFFeHRlbnNpb249aWdub3Jpbmcgc2NoZW1hIGVsZW1lbnQgKHVuc3VwcG9ydGVkIHZlcnNpb24pOiB7MH0KIHdzZGxtb2RlbGVyLndhcm5pbmcuc2VhcmNoU2NoZW1hLnVucmVjb2duaXplZFR5cGVzPWVuY291bnRlcmVkIHswfSB1bnJlY29nbml6ZWQgdHlwZShzKQogd3NkbG1vZGVsZXIud2FybmluZy5ub1NlcnZpY2VEZWZpbml0aW9uc0ZvdW5kPVdTREwgZG9jdW1lbnQgZG9lcyBub3QgZGVmaW5lIGFueSBzZXJ2aWNlcwotd3NkbG1vZGVsZXIud2FybmluZy5ub1BvcnRzSW5TZXJ2aWNlPVNlcnZpY2UgXCJ7MH1cIiBkb2VzIG5vdCBjb250YWluIGFueSB1c2FibGUgcG9ydHMKK3dzZGxtb2RlbGVyLndhcm5pbmcubm9Qb3J0c0luU2VydmljZT1TZXJ2aWNlIFwiezB9XCIgZG9lcyBub3QgY29udGFpbiBhbnkgdXNhYmxlIHBvcnRzLiB0cnkgcnVubmluZyB3c2ltcG9ydCB3aXRoIC1leHRlbnNpb24gc3dpdGNoLgogd3NkbG1vZGVsZXIud2FybmluZy5ub09wZXJhdGlvbnNJblBvcnQ9UG9ydCBcInswfVwiIGRvZXMgbm90IGNvbnRhaW4gYW55IHVzYWJsZSBvcGVyYXRpb25zCi13c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nTm9uU09BUFBvcnQ9aWdub3JpbmcgcG9ydCBcInswfVwiOiBub3QgYSBTT0FQIHBvcnQKLXdzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdOb25TT0FQUG9ydC5ub0FkZHJlc3M9aWdub3JpbmcgcG9ydCBcInswfVwiOiBubyBTT0FQIGFkZHJlc3Mgc3BlY2lmaWVkCi13c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nU09BUEJpbmRpbmcubm9uSFRUUFRyYW5zcG9ydDppZ25vcmluZyBTT0FQIHBvcnQgXCJ7MH1cIjogdW5yZWNvZ25pemVkIHRyYW5zcG9ydAord3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ05vblNPQVBQb3J0PWlnbm9yaW5nIHBvcnQgXCJ7MH1cIjogbm90IGEgc3RhbmRhcmQgU09BUCBwb3J0LiB0cnkgcnVubmluZyB3c2ltcG9ydCB3aXRoIC1leHRlbnNpb24gc3dpdGNoLgord3NkbG1vZGVsZXIud2FybmluZy5ub25TT0FQUG9ydD1wb3J0IFwiezB9XCI6IG5vdCBhIHN0YW5kYXJkIFNPQVAgcG9ydC4gVGhlIGdlbmVyYXRlZCBhcnRpZmFjdHMgbWF5IG5vdCB3b3JrIHdpdGggSkFYV1MgcnVudGltZS4gCit3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nTm9uU09BUFBvcnQubm9BZGRyZXNzPWlnbm9yaW5nIHBvcnQgXCJ7MH1cIjogbm8gU09BUCBhZGRyZXNzIHNwZWNpZmllZC4gdHJ5IHJ1bm5pbmcgd3NpbXBvcnQgd2l0aCAtZXh0ZW5zaW9uIHN3aXRjaC4KK3dzZGxtb2RlbGVyLndhcm5pbmcubm9TT0FQQWRkcmVzcz1wb3J0IFwiezB9XCIgaXMgbm90IGEgU09BUCBwb3J0LCBpdCBoYXMgbm8gc29hcDphZGRyZXNzIAord3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ1NPQVBCaW5kaW5nLm5vbkhUVFBUcmFuc3BvcnQ6aWdub3JpbmcgU09BUCBwb3J0IFwiezB9XCI6IHVucmVjb2duaXplZCB0cmFuc3BvcnQuIHRyeSBydW5uaW5nIHdzaW1wb3J0IHdpdGggLWV4dGVuc2lvbiBzd2l0Y2guCiAKICNCUDEuMSBSMjcwNQotd3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ1NPQVBCaW5kaW5nLm1peGVkU3R5bGU9aWdub3JpbmcgU09BUCBwb3J0IFwiezB9XCIsIGl0cyBub3QgV1MtSSBCUCAxLjEgY29tcGxpYW50OiB0aGUgd3NkbCBiaW5kaW5nIGhhcyBtaXhlZCBzdHlsZSwgaXQgbXVzdCBiZSBycGMtbGl0ZXJhbCBvciBkb2N1bWVudC1saXRlcmFsIG9wZXJhdGlvbiEKK3dzZGxtb2RlbGVyLndhcm5pbmcuaWdub3JpbmdTT0FQQmluZGluZy5taXhlZFN0eWxlPWlnbm9yaW5nIHBvcnQgXCJ7MH1cIiwgaXRzIG5vdCBXUy1JIEJQIDEuMSBjb21wbGlhbnQ6IHRoZSB3c2RsIGJpbmRpbmcgaGFzIG1peGVkIHN0eWxlLCBpdCBtdXN0IGJlIHJwYy1saXRlcmFsIG9yIGRvY3VtZW50LWxpdGVyYWwgb3BlcmF0aW9uLiB0cnkgcnVubmluZyB3c2ltcG9ydCB3aXRoIC1leHRlbnNpb24gc3dpdGNoLgogd3NkbG1vZGVsZXIud2FybmluZy5wb3J0LlNPQVBCaW5kaW5nLm1peGVkU3R5bGU9bm90IGEgV1MtSSBCUDEuMSBjb21wbGlhbnQgU09BUCBwb3J0IFwiezB9XCI6IHRoZSB3c2RsIGJpbmRpbmcgaGFzIG1peGVkIHN0eWxlLCBpdCBtdXN0IGJlIHJwYy1saXRlcmFsIG9yIGRvY3VtZW50LWxpdGVyYWwgb3BlcmF0aW9uIQogCiB3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nT3BlcmF0aW9uLm5vdFN1cHBvcnRlZFN0eWxlPWlnbm9yaW5nIG9wZXJhdGlvbiBcInswfVwiOiBub3QgcmVxdWVzdC1yZXNwb25zZSBvciBvbmUtd2F5CkBAIC0xNTUsMzUgKzE1NywzNSBAQAogd3NkbG1vZGVsZXIud2FybmluZy5yMjcxNnIyNzI2PVIyNzE2L1IyNzI2IFdTSS1CYXNpY1Byb2ZpbGUgdmVyLiAxLjAsIG5hbWVzcGFjZSBhdHRyaWJ1dGUgbm90IGFsbG93ZWQgaW4gZG9jL2xpdCBvciBycGMvbGl0IGZvciB7MH06IFwiezF9XCIKIAogI1dTSS1CUCAxLjEgV2FybmluZy9FcnJvcnMKLS8vUjI5MTEKKyMgUjI5MTEKIG1pbWVtb2RlbGVyLmludmFsaWRNaW1lUGFydC5tb3JlVGhhbk9uZVNPQVBCb2R5PUlnbm9yaW5nIG9wZXJhdGlvbiBcInswfVwiLiBUaGUgTXVsdGlwYXJ0L1JlbGF0ZWQgc3RydWN0dXJlIGhhcyBpbnZhbGlkIHJvb3QgcGFydDogbW9yZSB0aGFuIG9uZSBzb2FwOmJvZHkgcGFydHMgZm91bmQKIAotLy9SMjkwNgorIyBSMjkwNgogbWltZW1vZGVsZXIud2FybmluZy5JZ25vcmluZ2ludmFsaWRIZWFkZXJQYXJ0Lm5vdERlY2xhcmVkSW5Sb290UGFydD1IZWFkZXJzIG5vdCBpbiByb290IG1pbWU6cGFydCB3aXRoIHNvYXA6Ym9keSwgaWdub3JpbmcgaGVhZGVycyBpbiBvcGVyYXRpb24gXCJ7MH1cIgogCi0vL1IyOTA5CisjIFIyOTA5CiBtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQuZGlmZmVyZW50UGFydD1JZ25vcmluZyB0aGUgbWltZTpwYXJ0LiBJbnZhbGlkIG1pbWU6cGFydCwgdGhlIG1pbWU6Y29udGVudCBoYXMgZGlmZmVyZW50IHBhcnQgYXR0cmlidXRlLgogCiBtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQuaW52YWxpZFNjaGVtYVR5cGU9SWdub3JpbmcgdGhlIG1pbWU6cGFydC4gbWltZSBwYXJ0OiB7MH0gY2FuIG5vdCBiZSBtYXBwZWQgdG8gc2NoZW1hIHR5cGU6IHsxfQogCi0vL1J4eHh4IEEgbWltZTpjb250ZW50IGluIGEgREVTQ1JJUFRJT04gTVVTVCByZWZlciB0byBhIHdzZGw6cGFydCBlbGVtZW50IGRlZmluZWQgdXNpbmcgdGhlIHR5cGUgYXR0cmlidXRlLgorIyBSeHh4eCBBIG1pbWU6Y29udGVudCBpbiBhIERFU0NSSVBUSU9OIE1VU1QgcmVmZXIgdG8gYSB3c2RsOnBhcnQgZWxlbWVudCBkZWZpbmVkIHVzaW5nIHRoZSB0eXBlIGF0dHJpYnV0ZS4KIG1pbWVtb2RlbGVyLmludmFsaWRNaW1lQ29udGVudC5tZXNhZ2VQYXJ0RWxlbWVudEtpbmQ9d3NkbDpwYXJ0IGVsZW1lbnQgcmVmZXJlbmNlZCBieSBtaW1lOmNvbnRlbnQgcGFydCBhdHRyaWJ1dGU6IHswfSBtdXN0IGJlIGRlZmluZWQgdXNpbmcgdHlwZSBhdHRyaWJ1dGUhCiAKLS8vUlhYWFggUllZWVk6IEluIGEgZGVzY3JpcHRpb24sIGEgbWltZTpjb250ZW50IGVsZW1lbnQgTVVTVCBpbmNsdWRlIHRoZSBwYXJ0IGF0dHJpYnV0ZS4KKyMgUlhYWFggUllZWVk6IEluIGEgZGVzY3JpcHRpb24sIGEgbWltZTpjb250ZW50IGVsZW1lbnQgTVVTVCBpbmNsdWRlIHRoZSBwYXJ0IGF0dHJpYnV0ZS4KIG1pbWVtb2RlbGVyLmludmFsaWRNaW1lQ29udGVudC5taXNzaW5nUGFydEF0dHJpYnV0ZT1JZ25vcmluZyBvcGVyYXRpb24gXCJ7MH1cIiwgbWlzc2luZyBwYXJ0IGF0dHJpYnV0ZSBpbiBtaW1lOmNvbnRlbnQuIHBhcnQgYXR0cmlidXRlIG11c3QgYmUgcHJlc2VudCBpbiBtaW1lOmNvbnRlbnQgZGVjbGFyYXRpb24uCiAKIG1pbWVtb2RlbGVyLmludmFsaWRNaW1lQ29udGVudC5taXNzaW5nVHlwZUF0dHJpYnV0ZT1NaXNzaW5nIHR5cGUgYXR0cmlidXRlIGluIG1pbWU6Y29udGVudCBpbiBvcGVyYXRpb24gXCJ7MH1cIi4gcGFydCBhdHRyaWJ1dGUgbXVzdCBiZSBwcmVzZW50IGluIG1pbWU6Y29udGVudCBkZWNsYXJhdGlvbi4KIAotLy91bmtub3duIHNjaGVtYXR5cGUKKyMgdW5rbm93biBzY2hlbWF0eXBlCiBtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQudW5rbm93blNjaGVtYVR5cGU9VW5rbm93biBzY2hlbWEgdHlwZTogezF9IGZvciBtaW1lOmNvbnRlbnQgcGFydDogezB9CiBtaW1lbW9kZWxlci5pbnZhbGlkTWltZUNvbnRlbnQuZXJyb3JMb2FkaW5nSmF2YUNsYXNzPUNvdWxkbid0IGZpbmQgY2xhc3MgXCJ7MH1cIiBmb3IgbWltZSB0eXBlIFwiezF9XCIKIAotLy9taXNzaW5nIHdzZGw6cGFydCByZWZlcmVuY2VkIGJ5IHRoZSBtaW1lOmNvbnRlbnQKKyMgbWlzc2luZyB3c2RsOnBhcnQgcmVmZXJlbmNlZCBieSB0aGUgbWltZTpjb250ZW50CiB3c2RsbW9kZWxlci53YXJuaW5nLmlnbm9yaW5nTWltZVBhcnQubm90Rm91bmQ9aWdub3JpbmcgbWltZTpwYXJ0LCBjYW5ub3QgZmluZCBwYXJ0IFwiezB9XCIgcmVmZXJlbmNlZCBieSB0aGUgbWltZTpjb250ZW50IGluIHRoZSB3c2RsOm9wZXJhdGlvbiBcInsxfVwiCiAKIG1pbWVtb2RlbGVyLmVsZW1lbnRQYXJ0LmludmFsaWRFbGVtZW50TWltZVR5cGU9VGhlIG1pbWU6Y29udGVudCBwYXJ0IHJlZmVycyB0byB3c2RsOnBhcnQgXCJ7MH1cIiwgZGVmaW5lZCB1c2luZyBlbGVtZW50IGF0dHJpYnV0ZS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgbWltZSB0eXBlOiBcInsxfVwiIGlzIGFwcHJvcHJpYXRlIHRvIHNlcmlhbGl6ZSBYTUwuCiAKLS8vUjI3MDggVGhlIG1pbWU6cGFydCBlbGVtZW50IGluIGEgREVTQ1JJUFRJT04gTVVTVCBOT1QgaGF2ZSBhIG5hbWUgYXR0cmlidXRlLgorIyBSMjcwOCBUaGUgbWltZTpwYXJ0IGVsZW1lbnQgaW4gYSBERVNDUklQVElPTiBNVVNUIE5PVCBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUuCiBtaW1lbW9kZWxlci5pbnZhbGlkTWltZVBhcnQubmFtZU5vdEFsbG93ZWQ9bmFtZSBhdHRyaWJ1dGUgb24gd3NkbDpwYXJ0IGluIE9wZXJhdGlvbiBcInswfVwiIGlzIGlnbm9yZWQuIEl0cyBub3QgYWxsb3dlZCBhcyBwZXIgV1MtSSBBUCAxLjAuCiAKIApAQCAtMjA1LDkgKzIwNywxMSBAQAogd3NkbG1vZGVsZXIud2FybmluZy5pZ25vcmluZ09wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC5jdXN0b21pemVkT3BlcmF0aW9uTmFtZT1JZ25vcmluZyBvcGVyYXRpb24gXCJ7MH1cIiwgY2FuJyd0IGdlbmVyYXRlIGphdmEgbWV0aG9kICxjdXN0b21pemVkIG5hbWUgXCJ7MX1cIiBvZiB0aGUgd3NkbDpvcGVyYXRpb24gaXMgYSBqYXZhIGtleXdvcmQuCiB3c2RsbW9kZWxlci5pbnZhbGlkLm9wZXJhdGlvbi5qYXZhUmVzZXJ2ZWRXb3JkTm90QWxsb3dlZC5jdXN0b21pemVkT3BlcmF0aW9uTmFtZT1JbnZhbGlkIG9wZXJhdGlvbiBcInswfVwiLCBjYW4nJ3QgZ2VuZXJhdGUgamF2YSBtZXRob2QgLGN1c3RvbWl6ZWQgbmFtZSBcInsxfVwiIG9mIHRoZSB3c2RsOm9wZXJhdGlvbiBpcyBhIGphdmEga2V5d29yZC4KIAotd3NkbG1vZGVsZXIuamF4Yi5qYXZhdHlwZS5ub3Rmb3VuZD1TY2hlbWEgZGVzY3JpcHRvciB7MH0gaW4gbWVzc2FnZSBwYXJ0IHsxfSBjb3VsZCBub3QgYmUgYm91bmQgdG8gSmF2YSEKK3dzZGxtb2RlbGVyLmpheGIuamF2YXR5cGUubm90Zm91bmQ9U2NoZW1hIGRlc2NyaXB0b3IgezB9IGluIG1lc3NhZ2UgcGFydCBcInsxfVwiIGNvdWxkIG5vdCBiZSBib3VuZCB0byBKYXZhIQogd3NkbG1vZGVsZXIudW5zdXBwb3J0ZWRCaW5kaW5nLm1pbWU9V1NETCBNSU1FIGJpbmRpbmcgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQhCiAKIHdzZGxtb2RlbGVyLm5vblVuaXF1ZS5ib2R5PU5vbiB1bmlxdWUgYm9keSBwYXJ0cyEgSW4gYSBwb3J0LCBvcGVyYXRpb25zIG11c3QgaGF2ZSB1bmlxdWUgb3BlcmF0aW9uIHNpZ25hdXJlIG9uIHRoZSB3aXJlIGZvciBzdWNjZXNzZnVsIGRpc3BhdGNoLiBJbiBwb3J0IHswfSwgT3BlcmF0aW9ucyBcInsxfVwiIGFuZCBcInsyfVwiIGhhdmUgdGhlIHNhbWUgcmVxdWVzdCBib2R5IGJsb2NrIHszfQogd3NkbG1vZGVsZXIucnBjbGl0LnVua293bnNjaGVtYXR5cGU9WE1MIHR5cGUgXCJ7MH1cIiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQsIFhNTCB0byBKQVZBIGJpbmRpbmcgZmFpbGVkISBQbGVhc2UgY2hlY2sgdGhlIHdzZGw6cGFydCBcInsxfVwiIGluIHRoZSB3c2RsOm1lc3NhZ2UgXCJ7Mn1cIi4gICAgCisKK3dzZGxtb2RlbGVyLnJlc3BvbnNlYmVhbi5ub3Rmb3VuZD13c2ltcG9ydCBmYWlsZWQgdG8gZ2VuZXJhdGUgYXN5bmMgcmVzcG9uc2UgYmVhbiBmb3Igb3BlcmF0aW9uOiB7MH0KICAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3Byb2Nlc3Nvci5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvcHJvY2Vzc29yLnByb3BlcnRpZXMKaW5kZXggNDhjYzIzYS4uNjVlMzNiYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvcHJvY2Vzc29yLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvcHJvY2Vzc29yLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsNyArMjEsNyBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogcHJvY2Vzc29yLm1pc3NpbmcubW9kZWw9bW9kZWwgaXMgbWlzc2luZwogIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvdXRpbC5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvdXRpbC5wcm9wZXJ0aWVzCmluZGV4IDc5OWJhZmQuLjAzMDY0ZTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3V0aWwucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy91dGlsLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsNyArMjEsNyBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogaG9sZGVyLnZhbHVlZmllbGQubm90LmZvdW5kPUNvdWxkIG5vdCBmaW5kIHRoZSBmaWVsZCBpbiB0aGUgSG9sZGVyIHRoYXQgY29udGFpbnMgdGhlIEhvbGRlcicncyB2YWx1ZTogezB9CiBudWxsLm5hbWVzcGFjZS5mb3VuZD1FbmNvdW50ZXJlZCBlcnJvciBpbiB3c2RsLiBDaGVjayBuYW1lc3BhY2Ugb2YgZWxlbWVudCA8ezB9PgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvd2Vic2VydmljZWFwLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy93ZWJzZXJ2aWNlYXAucHJvcGVydGllcwppbmRleCBlYjczNTk3Li5mMzczODZiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy93ZWJzZXJ2aWNlYXAucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy93ZWJzZXJ2aWNlYXAucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw3ICsyMSw3IEBACiAjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIyBoYXZlIGFueSBxdWVzdGlvbnMuCi0jIAorIwogCiB3ZWJzZXJ2aWNlYXAubmVzdGVkTW9kZWxFcnJvcj1tb2RlbGVyIGVycm9yOiB7MH0KIHdlYnNlcnZpY2VhcC5maWxlTm90Rm91bmQ9ZXJyb3I6IGZpbGUgbm90IGZvdW5kOiB7MH0KQEAgLTMyLDcgKzMyLDggQEAKIHdlYnNlcnZpY2VhcC5zdWNjZWVkZWQ6IFN1Y2Nlc3MKIAogd2Vic2VydmljZWFwLm1ldGhvZC5ub3QuYW5ub3RhdGVkPVRoZSBtZXRob2QgezB9IG9uIGNsYXNzIHsxfSBpcyBub3QgYW5ub3RhdGVkLgotd2Vic2VydmljZWFwLnJwYy5lbmNvZGVkLm5vdC5zdXBwb3J0ZWQ9VGhlIHswfSBjbGFzcyBoYXMgYSBycGMvZW5jb2RlZCBTT0FQQmluZGluZy4gIFJwYy9lbmNvZGVkIFNPQVBCaW5kaW5ncyBhcmUgbm90IHN1cHBvcnRlZCBpbiBKQVhXUyAyLjAuIAord2Vic2VydmljZWFwLnJwYy5lbmNvZGVkLm5vdC5zdXBwb3J0ZWQ9VGhlIHswfSBjbGFzcyBoYXMgYSBycGMvZW5jb2RlZCBTT0FQQmluZGluZy4gIFJwYy9lbmNvZGVkIFNPQVBCaW5kaW5ncyBhcmUgbm90IHN1cHBvcnRlZCBpbiBKQVhXUyAyLjAuCit3ZWJzZXJ2aWNlLmVuY29kZWQubm90LnN1cHBvcnRlZD1UaGUgezB9IGNsYXNzIGhhcyBpbnZhbGlkIFNPQVBCaW5kaW5nIGFubm90YXRpb24uIHsxfS9lbmNvZGVkIFNPQVBCaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKIHdlYnNlcnZpY2VhcC5tb2RlbC5hbHJlYWR5LmV4aXN0cz1tb2RlbCBhbHJlYWR5IGV4aXN0cwogd2Vic2VydmljZWFwLmVuZHBvaW50aW50ZXJmYWNlLm9uLmludGVyZmFjZT1TZXJ2aWNlIGVuZHBvaW50cG9pbnQgaW50ZXJmYWNlXDogezB9IGhhcyBjYW5ub3QgaGF2ZSBhIFdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UgYW5ub3RhdGlvblw6IHsxfQogd2Vic2VydmljZWFwLmphdmEudHlwZU5vdEZvdW5kPVRoZSB0eXBlOiB7MH0gd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWFwcGluZwpAQCAtMTE4LDcgKzExOSw5IEBACiAKIHdlYnNlcnZpY2VhcC5pbnZhbGlkLnNlaS5hbm5vdGF0aW9uPVRoZSBAezB9IGFubm90YXRpb24gY2Fubm90IGJlIHVzZWQgb24gYSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gQ2xhc3NcOiB7MX0gCiAKLXdlYnNlcnZpY2VhcC5pbnZhbGlkLndlYm1ldGhvZC5lbGVtZW50LndpdGguZXhjbHVkZT1UaGUgQGphdmF4Lmp3cy5XZWJNZXRob2QuezB9IGVsZW1lbnQgY2Fubm90IGJlIHNwZWNpZmllZCB3aXRoIHRoZSBAamF2YXguandzLldlYk1ldGhvZC5leGNsdWRlIGVsZW1lbnQuIENsYXNzXDogezF9IG1ldGhvZFw6IHswfSAKK3dlYnNlcnZpY2VhcC5pbnZhbGlkLnNlaS5hbm5vdGF0aW9uLmVsZW1lbnQuZXhjbHVkZT1UaGUgQGphdmF4Lmp3cy5XZWJNZXRob2QoezB9KSBjYW5ub3QgYmUgdXNlZCBvbiBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLiBDbGFzc1w6IHsxfSBtZXRob2RcOiB7Mn0KKword2Vic2VydmljZWFwLmludmFsaWQud2VibWV0aG9kLmVsZW1lbnQud2l0aC5leGNsdWRlPVRoZSBAamF2YXguandzLldlYk1ldGhvZC57MH0gZWxlbWVudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIEBqYXZheC5qd3MuV2ViTWV0aG9kLmV4Y2x1ZGUgZWxlbWVudC4gQ2xhc3NcOiB7MX0gbWV0aG9kXDogezJ9IAogCiB3ZWJzZXJ2aWNlYXAuZG9jLmJhcmUubm8ub3V0PURvY3VtZW50L2xpdGVyYWwgYmFyZSBtZXRob2RzIHdpdGggbm8gcmV0dXJuIHR5cGUgb3IgT1VUL0lOT1VUIHBhcmFtZXRlcnMgbXVzdCBiZSBhbm5vdGF0ZWQgYXMgQE9uZXdheS4gQ2xhc3NcOiB7MH0sIG1ldGhvZDogezF9CiB3ZWJzZXJ2aWNlYXAuZG9jLmJhcmUucmV0dXJuLmFuZC5vdXQ9RG9jdW1lbnQvbGl0ZXJhbCBiYXJlIG1ldGhvZHMgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZSBhbmQgb3V0IHBhcmFtZXRlcnMuIENsYXNzXDogezB9LCBtZXRob2Q6IHsxfQpAQCAtMTM0LDcgKzEzNyw3IEBACiAKIHdlYnNlcnZpY2VhcC53ZWJzZXJ2aWNlLm1ldGhvZC5pcy5hYnN0cmFjdD1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBqYXZheC5qd3MuV2ViU2VydmljZSBtdXN0IG5vdCBoYXZlIGFic3RyYWN0IG1ldGhvZHMuIENsYXNzXDogezB9IE1ldGhvZDogezF9CiAKLXdlYnNlcnZpY2VhcC5kb2MuYmFyZS5yZXR1cm4uYW5kLm91dD1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyBtdXN0IG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFuZCBhbiBPVVQvSU5PVVQgcGFyYW1ldGVyLiAgQ2xhc3NcOiB7MH0gTWV0aG9kXDogezF9IAorI3dlYnNlcnZpY2VhcC5kb2MuYmFyZS5yZXR1cm4uYW5kLm91dD1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyBtdXN0IG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFuZCBhbiBPVVQvSU5PVVQgcGFyYW1ldGVyLiAgQ2xhc3NcOiB7MH0gTWV0aG9kXDogezF9IAogCiB3ZWJzZXJ2aWNlYXAud2Vic2VydmljZS5uby5kZWZhdWx0LmNvbnN0cnVjdG9yPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIG11c3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDbGFzc1w6IHswfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy93c2NvbXBpbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3dzY29tcGlsZS5wcm9wZXJ0aWVzCmluZGV4IGYzYTZjYjEuLjZkYWMxNjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3dzY29tcGlsZS5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3dzY29tcGlsZS5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDE1ICsyMSwxNiBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogd3NpbXBvcnQudXNhZ2U9VXNhZ2U6IHswfSBbb3B0aW9uc10gPFdTRExfVVJJPlxuXG5cCiBVc2UgIndzaW1wb3J0IC1oZWxwIiBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBvcHRpb25zLgogCiB3c2ltcG9ydC5oZWxwPVxuVXNhZ2U6IHswfSBbb3B0aW9uc10gPFdTRExfVVJJPlxuXG5cCiBcd2hlcmUgW29wdGlvbnNdIGluY2x1ZGU6XG5cCi1cICAtYiA8cGF0aD4gICAgICAgICAgICAgICAgIHNwZWNpZnkgZXh0ZXJuYWwgamF4d3Mgb3IgamF4YiBiaW5kaW5nIGZpbGVzXG5cCi1cICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFYWNoIDxmaWxlPiBtdXN0IGhhdmUgaXRzIG93biAtYilcblwKK1wgIC1iIDxwYXRoPiAgICAgICAgICAgICAgICAgc3BlY2lmeSBqYXh3cy9qYXhiIGJpbmRpbmcgZmlsZXMgb3IgYWRkaXRpb25hbCBzY2hlbWFzXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFYWNoIDxwYXRoPiBtdXN0IGhhdmUgaXRzIG93biAtYilcblwKK1wgIC1CPGpheGJPcHRpb24+ICAgICAgICAgICAgUGFzcyB0aGlzIG9wdGlvbiB0byBKQVhCIHNjaGVtYSBjb21waWxlclxuXAogXCAgLWNhdGFsb2cgPGZpbGU+ICAgICAgICAgICBzcGVjaWZ5IGNhdGFsb2cgZmlsZSB0byByZXNvbHZlIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIFRSOTQwMSwgWENhdGFsb2csIGFuZCBPQVNJUyBYTUwgQ2F0YWxvZyBmb3JtYXQuXG5cCiBcICAtZCA8ZGlyZWN0b3J5PiAgICAgICAgICAgIHNwZWNpZnkgd2hlcmUgdG8gcGxhY2UgZ2VuZXJhdGVkIG91dHB1dCBmaWxlc1xuXApAQCAtNDEsMTAgKzQyLDE0IEBACiBcICAtaHR0cHByb3h5Ojxob3N0Pjo8cG9ydD4gIHNwZWNpZnkgYSBIVFRQIHByb3h5IHNlcnZlciAocG9ydCBkZWZhdWx0cyB0byA4MDgwKVxuXAogXCAgLWtlZXAgICAgICAgICAgICAgICAgICAgICBrZWVwIGdlbmVyYXRlZCBmaWxlc1xuXAogXCAgLXAgPHBrZz4gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIHRhcmdldCBwYWNrYWdlXG5cCitcICAtcXVpZXQgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzIHdzaW1wb3J0IG91dHB1dFxuXAogXCAgLXMgPGRpcmVjdG9yeT4gICAgICAgICAgICBzcGVjaWZ5IHdoZXJlIHRvIHBsYWNlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXNcblwKK1wgIC10YXJnZXQgPHZlcnNpb24+ICAgICAgICAgZ2VuZXJhdGUgY29kZSBhcyBwZXIgdGhlIGdpdmVuIEpBWFdTIHNwZWNpZmljYXRpb24gdmVyc2lvbi5cblwKK1wgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiAyLjAgd2lsbCBnZW5lcmF0ZSBjb21wbGlhbnQgY29kZSBmb3IgSkFYV1MgMi4wIHNwZWMuXG5cCiBcICAtdmVyYm9zZSAgICAgICAgICAgICAgICAgIG91dHB1dCBtZXNzYWdlcyBhYm91dCB3aGF0IHRoZSBjb21waWxlciBpcyBkb2luZ1xuXAogXCAgLXZlcnNpb24gICAgICAgICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uXG5cCi1cICAtd3NkbGxvY2F0aW9uIDxsb2NhdGlvbj4gIEBXZWJTZXJ2aWNlLndzZGxMb2NhdGlvbiBhbmQgQFdlYlNlcnZpY2VDbGllbnQud3NkbExvY2F0aW9uIHZhbHVlCitcICAtd3NkbGxvY2F0aW9uIDxsb2NhdGlvbj4gIEBXZWJTZXJ2aWNlQ2xpZW50LndzZGxMb2NhdGlvbiB2YWx1ZVxuXAorCiAKIHdzaW1wb3J0LnVzYWdlLmV4YW1wbGVzPVxuXAogXEV4YW1wbGVzOlxuXApAQCAtODUsMTIgKzkwLDI2IEBACiBcICB3c2dlbiAtY3AgLiBleGFtcGxlLlN0b2NrXG5cCiBcICB3c2dlbiAtY3AgLiBleGFtcGxlLlN0b2NrIC13c2RsIC1zZXJ2aWNlbmFtZSAne2h0dHA6Ly9teW5hbWVzcGFjZX1NeVNlcnZpY2UnXG5cCiAKK3dyYXBwZXJUYXNrLm5lZWRFbmRvcnNlZD1cCitZb3UgYXJlIHJ1bm5pbmcgb24gSkRLNiB3aGljaCBjb21lcyB3aXRoIEpBWC1XUyAyLjAgQVBJLCBidXQgdGhpcyB0b29sIHJlcXVpcmVzIEpBWC1XUyAyLjEgQVBJLiBcCitVc2UgdGhlIGVuZG9yc2VkIHN0YW5kYXJkcyBvdmVycmlkZSBtZWNoYW5pc20gKGh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL3N0YW5kYXJkcy8pLCBcCitvciBzZXQgeGVuZG9yc2VkPSJ0cnVlIiBvbiA8ezB9Pi4gCisKK3dyYXBwZXJUYXNrLmxvYWRpbmcyMEFwaT1cCitZb3UgYXJlIGxvYWRpbmcgSkFYLVdTIDIuMCBBUEkgZnJvbSB7MH0gYnV0IHRoaXMgdG9vbCByZXF1aXJlcyBKQVgtV1MgMi4xIEFQSS4KKworaW52b2tlci5uZWVkRW5kb3JzZWQ9XAorWW91IGFyZSBydW5uaW5nIG9uIEpESzYgd2hpY2ggY29tZXMgd2l0aCBKQVgtV1MgMi4wIEFQSSwgYnV0IHRoaXMgdG9vbCByZXF1aXJlcyBKQVgtV1MgMi4xIEFQSS4gXAorVXNlIHRoZSBlbmRvcnNlZCBzdGFuZGFyZHMgb3ZlcnJpZGUgbWVjaGFuaXNtIChodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zdGFuZGFyZHMvKSwgXAorb3IgdXNlIC1YZW5kb3JzZWQgb3B0aW9uLgogCiAKICMKICMgR2VuZXJpYyBNZXNzYWdlcwogIwotd3Njb21waWxlLmludmFsaWRPcHRpb249ezB9IGlzIGFuIGludmFsaWQgb3B0aW9uIG9yIGFyZ3VtZW50Cit3c2NvbXBpbGUuaW52YWxpZE9wdGlvbj11bnJlY29nbml6ZWQgcGFyYW1ldGVyIHswfQord3NpbXBvcnQubm9TdWNoSmF4Yk9wdGlvbj1ubyBzdWNoIEpBWEIgb3B0aW9uOiB7MH0KKwogd3Njb21waWxlLmVycm9yPWVycm9yOiB7MH0KIHdzY29tcGlsZS53YXJuaW5nPXdhcm5pbmc6IHswfQogd3Njb21waWxlLmluZm89aW5mbzogezB9CkBAIC05OCw3ICsxMTcsNiBAQAogd3Njb21waWxlLm5vU3VjaERpcmVjdG9yeT1kaXJlY3Rvcnkgbm90IGZvdW5kOiB7MH0KIHdzY29tcGlsZS5taXNzaW5nT3B0aW9uQXJndW1lbnQ9b3B0aW9uIFwiezB9XCIgcmVxdWlyZXMgYW4gYXJndW1lbnQKIHdzY29tcGlsZS5jb21waWxhdGlvbkZhaWxlZD1jb21waWxhdGlvbiBmYWlsZWQsIGVycm9ycyBzaG91bGQgaGF2ZSBiZWVuIHJlcG9ydGVkCi13c2NvbXBpbGUuY2xhc3Ntb2RlbGluZm8uZXhwZWN0ZWQ9RXhwZWN0ZWQgYSBDbGFzc01vZGVsSW5mbyBidXQgZ290IGEgezB9LgogCiB3c2ltcG9ydC5taXNzaW5nRmlsZT1NaXNzaW5nIFdTRExfVVJJCiAKQEAgLTExNCwxMCArMTMyLDM2IEBACiB3c2dlbi5wb3J0bmFtZS5taXNzaW5nLm5hbWVzcGFjZT1UaGUgcG9ydCBuYW1lIFwiezB9XCIgaXMgbWlzc2luZyBhIG5hbWVzcGFjZS4KIHdzZ2VuLnBvcnRuYW1lLm1pc3NpbmcubG9jYWxuYW1lPVRoZSBwb3J0IG5hbWUgXCJ7MH1cIiBpcyBtaXNzaW5nIGEgbG9jYWxuYW1lLgogd3NnZW4uY2xhc3MubXVzdC5iZS5pbXBsZW1lbnRhdGlvbi5jbGFzcz1UaGUgY2xhc3MgXCJ7MH1cIiBpcyBub3QgYW4gZW5kcG9pbnQgaW1wbGVtZW50YXRpb24gY2xhc3MuCi13c2dlbi5jYW5ub3QuZ2VuLndzZGwuZm9yLm5vbi5zb2FwLmJpbmRpbmc9VGhlIC13c2RsIG9wdGlvbiBjYW5ub3QgYmUgdXNlZCB3aXRoIG5vbi1TT0FQIGJpbmRpbmdzLiBDbGFzcyBcInswfVwiIGJpbmRpbmc6IFwiezF9XCIuCi13c2dlbi5jYW5ub3QuZ2VuLndzZGwuZm9yLnNvYXAxMi5iaW5kaW5nPVRoZSAtd3NkbCBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCBTT0FQMS4yIGJpbmRpbmdzLlxuXAotVHJ5IHVzaW5nIFwiLXdzZGw6WHNvYXAxLjIgLWV4dGVuc2lvblwiLlxuXAotQ2xhc3MgXCJ7MH1cIiBiaW5kaW5nOiBcInsxfVwiLgotd3NnZW4uY2Fubm90Lmdlbi53c2RsLmZvci54c29hcDEyLmJpbmRpbmcud28uZXh0ZW50aW9uPVRoZSAtd3NkbCBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCB0aGUgU09BUDEuMiBleHRlbnNpb24gYmluZGluZyB3aXRob3V0IHRoZSBcIi1leHRlbnNpb25cIiBvcHRpb24uXG5cCi1DbGFzcyBcInswfVwiIGJpbmRpbmc6IFwiezF9XCIuCit3c2ltcG9ydC5Ob3RBRmlsZU5vclVSTCA9IFwKKyAgICAiezB9IiBpcyBuZWl0aGVyIGEgZmlsZSBuYW1lIG5vciBhbiBVUkwKKword3NnZW4uY2Fubm90Lmdlbi53c2RsLmZvci5ub24uc29hcC5iaW5kaW5nPXdzZ2VuIGNhbiBub3QgZ2VuZXJhdGUgV1NETCBmb3Igbm9uLVNPQVAgYmluZGluZzogezB9IG9uIENsYXNzIHsxfQorCit3c2dlbi5jYW5ub3QuZ2VuLndzZGwuZm9yLnNvYXAxMi5iaW5kaW5nPXdzZ2VuIGNhbiBub3QgZ2VuZXJhdGUgV1NETCBmb3IgU09BUCAxLjIgYmluZGluZzogezB9IG9uIGNsYXNzOiB7MX0uXG4KK1BsZWFzZSBzcGVjaWZ5IFwiLWV4dGVuc2lvblwiIGFuZCBcIi13c2RsOnByb3RvY29sIFhTb2FwMS4yXCIgc3dpdGNoZXMuIEZvciBleGFtcGxlOlxuXG4KK3dzZ2VuIC13c2RsOnByb3RvY29sIFhTb2FwMS4yIC1leHRlbnNvbiB7MX0KKword3NnZW4ubm8ud2Vic2VydmljZXMuY2xhc3M9d3NnZW4gZGlkIG5vdCBmaW5kIGFueSBjbGFzcyB3aXRoIEBXZWJTZXJ2aWNlIGFubm90YXRpb24uIFBsZWFzZSBzcGVjaWZ5IEBXZWJTZXJ2aWNlIGFubm90YXRpb24gb24gezB9LgorCit3c2ltcG9ydC5uby53c2RsPUZhaWxlZCB0byByZWFkIHRoZSBXU0RMIGRvY3VtZW50OiB7MH0sIGJlY2F1c2UgMSkgY291bGQgbm90IGZpbmQgdGhlIGRvY3VtZW50OyAvXAorICAyKSB0aGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHJlYWQ7IFwKKyAgMykgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQgaXMgbm90IDx3c2RsOmRlZmluaXRpb25zPi4KKword3NpbXBvcnQuRmFpbGVkVG9QYXJzZSA9IFwKKyAgICBGYWlsZWQgdG8gcGFyc2UgInswfSI6IHsxfQorCit3c2ltcG9ydC5QYXJzaW5nV1NETD1wYXJzaW5nIFdTREwuLi5cblxuCit3c2ltcG9ydC5HZW5lcmF0aW5nQ29kZT1nZW5lcmF0aW5nIGNvZGUuLi4KKword3NpbXBvcnQuSUxMRUdBTF9UQVJHRVRfVkVSU0lPTiA9IFwKKyAgICAiezB9IiBpcyBub3QgYSB2YWxpZCB0YXJnZXQgdmVyc2lvbi4gIjIuMCIgYW5kICIyLjEiIGFyZSBzdXBwb3J0ZWQuCisKK3dzaW1wb3J0LkVycm9yTWVzc2FnZSA9IFwKKwlbRVJST1JdIHswfQorCit3c2ltcG9ydC5XYXJuaW5nTWVzc2FnZSA9IFwKKwlbV0FSTklOR10gezB9CisKK3dzaW1wb3J0LkluZm9NZXNzYWdlID0gXAorCVtJTkZPXSB7MH0KICAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3dzZGwucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3dzZGwucHJvcGVydGllcwppbmRleCBmODQxODRmLi43NzlkOTA4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3Jlc291cmNlcy93c2RsLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9yZXNvdXJjZXMvd3NkbC5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDExICsyMSwxMiBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAorbG9jYWxpemVkLmVycm9yPXswfQogcGFyc2luZy53c2RsTm90RGVmYXVsdE5hbWVzcGFjZT1kZWZhdWx0IG5hbWVzcGFjZSBtdXN0IGJlIFwiezB9XCIKIHBhcnNpbmcub25seU9uZU9mRWxlbWVudE9yVHlwZVJlcXVpcmVkPW9ubHkgb25lIG9mIHRoZSBcImVsZW1lbnRcIiBvciBcInR5cGVcIiBhdHRyaWJ1dGVzIGlzIGFsbG93ZWQgaW4gcGFydCBcInswfVwiCi1wYXJzaW5nLmVsZW1lbnRPclR5cGVSZXF1aXJlZD1laXRoZXIgdGhlIFwiZWxlbWVudFwiIG9yIHRoZSBcInR5cGVcIiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaW4gcGFydCBcInswfVwiCitwYXJzaW5nLmVsZW1lbnRPclR5cGVSZXF1aXJlZD13YXJuaW5nOiBwYXJ0IHswfSBpcyBpZ25vcmVkLCBlaXRoZXIgdGhlIFwiZWxlbWVudFwiIG9yIHRoZSBcInR5cGVcIiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaW4gcGFydCBcInswfVwiCiBwYXJzaW5nLmludmFsaWRFbGVtZW50PWludmFsaWQgZWxlbWVudDogXCJ7MH1cIiAoaW4gbmFtZXNwYWNlIFwiezF9XCIpCiBwYXJzaW5nLmludmFsaWRBdHRyaWJ1dGVWYWx1ZT1pbnZhbGlkIHZhbHVlIFwiezF9XCIgZm9yIGF0dHJpYnV0ZSBcInswfVwiCiBwYXJzaW5nLmludmFsaWRFeHRlbnNpb25FbGVtZW50PWludmFsaWQgZXh0ZW5zaW9uIGVsZW1lbnQ6IFwiezB9XCIgKGluIG5hbWVzcGFjZSBcInsxfVwiKQpAQCAtMzksOSArNDAsMTAgQEAKIHBhcnNpbmcudW5rbm93bkltcG9ydGVkRG9jdW1lbnRUeXBlPWltcG9ydGVkIGRvY3VtZW50IGlzIG9mIHVua25vd24gdHlwZTogezB9CiBwYXJzaW5nLnVua25vd25OYW1lc3BhY2VQcmVmaXg9dW5kZWNsYXJlZCBuYW1lc3BhY2UgcHJlZml4OiBcInswfVwiCiBwYXJzaW5nLmludmFsaWRVUkk9aW52YWxpZCBVUkk6IHswfQotcGFyc2luZy5pb0V4Y2VwdGlvbldpdGhTeXN0ZW1JZD1mYWlsZWQgdG8gcGFyc2UgZG9jdW1lbnQgYXQgXCJ7MH1cIjogezF9CitwYXJzaW5nLmlvRXhjZXB0aW9uV2l0aFN5c3RlbUlkPWZhaWxlZCB0byBwYXJzZSBkb2N1bWVudCBhdCBcInswfVwiCitwYXJzaW5nLnVuYWJsZVRvR2V0TWV0YWRhdGE9IFVuYWJsZSB0byBnZXQgTWV0YWRhdGEgZnJvbTogezB9CiBwYXJzaW5nLmlvRXhjZXB0aW9uPXBhcnNpbmcgZmFpbGVkOiB7MH0KLXBhcnNpbmcuc2F4RXhjZXB0aW9uV2l0aFN5c3RlbUlkPWludmFsaWQgV1NETCBmaWxlISBmYWlsZWQgdG8gcGFyc2UgZG9jdW1lbnQgYXQgXCJ7MH1cIjogezF9CitwYXJzaW5nLnNheEV4Y2VwdGlvbldpdGhTeXN0ZW1JZD1pbnZhbGlkIFdTREwgZmlsZSEgZmFpbGVkIHRvIHBhcnNlIGRvY3VtZW50IGF0IFwiezB9XCIKIHBhcnNpbmcuc2F4RXhjZXB0aW9uPWludmFsaWQgV1NETCBmaWxlISBwYXJzaW5nIGZhaWxlZDogezB9CiBwYXJzaW5nLnBhcnNlckNvbmZpZ0V4Y2VwdGlvbj1pbnZhbGlkIFdTREwgZmlsZSEgcGFyc2luZyBmYWlsZWQ6IHswfQogcGFyc2luZy5mYWN0b3J5Q29uZmlnRXhjZXB0aW9uPWludmFsaWQgV1NETCBmaWxlISBwYXJzaW5nIGZhaWxlZDogezB9CkBAIC00OSwxNCArNTEsMTggQEAKICMKIHBhcnNpbmcubWlzc2luZ1JlcXVpcmVkQXR0cmlidXRlPW1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFwiezF9XCIgb2YgZWxlbWVudCBcInswfVwiCiBwYXJzaW5nLmludmFsaWRUYWc9ZXhwZWN0ZWQgZWxlbWVudCBcInsxfVwiLCBmb3VuZCBcInswfVwiCi1wYXJzaW5nLmludmFsaWRUYWdOUz1leHBlY3RlZCBlbGVtZW50IFwiezJ9XCIgKGluIG5hbWVzcGFjZSBcInszfVwiKSwgZm91bmQgZWxlbWVudCBcInswfVwiIChpbiBuYW1lc3BhY2UgXCJ7MX1cIikKK3BhcnNpbmcuaW52YWxpZFRhZ05TPUludmFsaWQgV1NETCBhdCB7NH06IGV4cGVjdGVkIGVsZW1lbnQgXCJ7Mn1cIiAoaW4gbmFtZXNwYWNlIFwiezN9XCIpLCBmb3VuZCBlbGVtZW50IFwiezB9XCIgKGluIG5hbWVzcGFjZSBcInsxfVwiKQogcGFyc2luZy5ub25XaGl0ZXNwYWNlVGV4dEZvdW5kPWZvdW5kIHVuZXhwZWN0ZWQgbm9uIHdoaXRlc3BhY2UgdGV4dDogXCJ7MH1cIgogcGFyc2luZy5lbGVtZW50RXhwZWN0ZWQ9dW5leHBlY3RlZCBub24tZWxlbWVudCBmb3VuZAogIwogZW50aXR5LmR1cGxpY2F0ZT1kdXBsaWNhdGUgZW50aXR5OiBcInswfVwiCiBlbnRpdHkuZHVwbGljYXRlV2l0aFR5cGU9ZHVwbGljYXRlIFwiezB9XCIgZW50aXR5OiBcInsxfVwiCi1lbnRpdHkubm90Rm91bmRCeVFOYW1lPWludmFsaWQgZW50aXR5IG5hbWU6IFwiezB9XCIgKGluIG5hbWVzcGFjZTogXCJ7MX1cIikKKwogZW50aXR5Lm5vdEZvdW5kQnlJRD1pbnZhbGlkIGVudGl0eSBpZDogXCJ7MH1cIgorZW50aXR5Lm5vdEZvdW5kQnlRTmFtZT1pbnZhbGlkIGVudGl0eSBuYW1lOiBcInswfVwiIChpbiBuYW1lc3BhY2U6IFwiezF9XCIpCitlbnRpdHkubm90Rm91bmQucG9ydFR5cGU9d3NkbDpwb3J0VHlwZSBcInswfVwiIHJlZmVyZW5jZWQgYnkgd3NkbDpiaW5kaW5nIFwiezF9XCIsIGJ1dCBpdHMgbm90IGZvdW5kIGluIHRoZSB3c2RsCitlbnRpdHkubm90Rm91bmQuYmluZGluZz13c2RsOmJpbmRpbmcgXCJ7MH0iIHJlZmVyZW5jZWQgYnkgd3NkbDpwb3J0IFwiezF9XCIsIGJ1dCBpdHMgbm90IGZvdW5kIGluIHRoZSB3c2RsCisKICMKIHZhbGlkYXRpb24ubWlzc2luZ1JlcXVpcmVkQXR0cmlidXRlPW1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFwiezB9XCIgb2YgZWxlbWVudCBcInsxfVwiCiB2YWxpZGF0aW9uLm1pc3NpbmdSZXF1aXJlZFByb3BlcnR5PW1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJ7MH1cIiBvZiBlbGVtZW50IFwiezF9XCIKQEAgLTY1LDcgKzcxLDcgQEAKIHZhbGlkYXRpb24uaW52YWxpZENvbXBsZXhUeXBlSW5FbGVtZW50PWludmFsaWQgZWxlbWVudDogXCJ7MX1cIiwgaGFzIG5hbWVkIGNvbXBsZXhUeXBlOiBcInswfVwiCiB2YWxpZGF0aW9uLmludmFsaWRTaW1wbGVUeXBlSW5FbGVtZW50PWludmFsaWQgZWxlbWVudDogXCJ7MX1cIiwgaGFzIG5hbWVkIHNpbXBsZVR5cGU6IFwiezB9XCIKIHZhbGlkYXRpb24uZHVwbGljYXRlZEVsZW1lbnQ9ZHVwbGljYXRlZCBlbGVtZW50OiBcInswfVwiCi12YWxpZGF0aW9uLmR1cGxpY2F0ZU5hbWU9ZHVwbGljYXRlZCBwYXJ0IG5hbWU6IFwiezB9XCIKK3ZhbGlkYXRpb24uZHVwbGljYXRlUGFydE5hbWU9SW52YWxpZCBXU0RMLCBkdXBsaWNhdGUgcGFydHMgaW4gYSB3c2RsOm1lc3NhZ2UgaXMgbm90IGFsbG93ZWQuIFxud3NkbDptZXNzYWdlIHswfSBoYXMgZHVwbGljYXRlZCBwYXJ0IG5hbWU6IFwiezF9XCIKIHZhbGlkYXRpb24uaW52YWxpZFN1YkVudGl0eT1pbnZhbGlkIHN1Yi1lbGVtZW50IFwiezB9XCIgb2YgZWxlbWVudCBcInsxfVwiCiB2YWxpZGF0aW9uLmludmFsaWRBdHRyaWJ1dGU9aW52YWxpZCBhdHRyaWJ1dGUgXCJ7MH1cIiBvZiBlbGVtZW50IFwiezF9XCIKIHZhbGlkYXRpb24uaW52YWxpZEF0dHJpYnV0ZVZhbHVlPWludmFsaWQgdmFsdWUgXCJ7MX1cIiBmb3IgYXR0cmlidXRlIFwiezB9XCIKQEAgLTc4LDYgKzg0LDggQEAKIHZhbGlkYXRpb24ubm90U2ltcGxlVHlwZT1ub3QgYSBzaW1wbGUgdHlwZTogXCJ7MH1cIgogdmFsaWRhdGlvbi5hbWJpZ3VvdXNOYW1lPWFtYmlndW91cyBvcGVyYXRpb24gbmFtZTogXCJ7MH1cIgogdmFsaWRhdGlvbi5pbnZhbGlkUHJlZml4PXVuZGVjbGFyZWQgbmFtZXNwYWNlIHByZWZpeDogXCJ7MH1cIgord2FybmluZy5mYXVsdEVtcHR5QWN0aW9uPWlnbm9yaW5nIGVtcHR5IEFjdGlvbiBpbiBcInswfVwiIHsxfSBlbGVtZW50IG9mIFwiezJ9XCIgb3BlcmF0aW9uLCB1c2luZyBkZWZhdWx0IGluc3RlYWQKK3dhcm5pbmcuaW5wdXRPdXRwdXRFbXB0eUFjdGlvbj1pZ25vcmluZyBlbXB0eSBBY3Rpb24gaW4gezB9IGVsZW1lbnQgb2YgXCJ7MX1cIiBvcGVyYXRpb24sIHVzaW5nIGRlZmF1bHQgaW5zdGVhZAogCiAjd3NpIGNvbXBsaWFudCBXU0RMIHdhcm5pbmdzCiB3YXJuaW5nLndzaS5yMjAwMT1Ob3QgYSBXU0ktQlAgY29tcGxpYW50IFdTREwgKFIyMDAxLCBSMjAwMikuIHdzZGw6aW1wb3J0IG11c3Qgb25seSBpbXBvcnQgV1NETCBkb2N1bWVudC4gSXRzIHRyeWluZyB0byBpbXBvcnQ6IFwiezB9XCIKQEAgLTg1LDExICs5MywzNiBAQAogd2FybmluZy53c2kucjIwMDM9Tm90IGEgV1NJLUJQIGNvbXBsaWFudCBXU0RMIChSMjAwMykuIHhzZDppbXBvcnQgbXVzdCBvbmx5IGJlIHVzZWQgaW5zaWRlIHhzZDpzY2hlbWEgZWxlbWVudC4KIHdhcm5pbmcud3NpLnIyMDA0PU5vdCBhIFdTSS1CUCBjb21wbGlhbnQgV1NETCAoUjIwMDEsIFIyMDA0KS4geHNkOmltcG9ydCBtdXN0IG5vdCBpbXBvcnQgWE1MIFNjaGVtYSBkZWZpbml0aW9uIGVtbWJlZGRlZCBpbmxpbmUgd2l0aGluIFdTRExEb2N1bWVudC4KIAorI1BhcnNlcgorUGFyc2luZy5QYXJzZUZhaWxlZCA9IFwKKwlGYWlsZWQgdG8gcGFyc2UgdGhlIFdTREwuCisKK1BhcnNpbmcuTm90QVdTREw9RmFpbGVkIHRvIGdldCBXU0RMIGNvbXBvbmVudHMsIHByb2JhYmx5IHswfSBpcyBub3QgYSB2YWxpZCBXU0RMIGZpbGUuCisKK0Fic3RyYWN0UmVmZXJlbmNlRmluZGVySW1wbC5VbmFibGVUb1BhcnNlID0gXAorCVVuYWJsZSB0byBwYXJzZSAiezB9IiA6IHsxfQorCitQYXJzZXIuTm90QUJpbmRpbmdGaWxlID0gXAorCW5vdCBhbiBleHRlcm5hbCBiaW5kaW5nIGZpbGUuIFRoZSByb290IGVsZW1lbnQgbXVzdCBiZSAneydodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXh3cyd9J2JpbmRpbmdzIGJ1dCBpdCBpcyAneyd7MH0nfSd7MX0KKworCiAjSW50ZXJuYWxpemVyCitJbnRlcm5hbGl6ZXIuVHdvVmVyc2lvbkF0dHJpYnV0ZXMgPSBcCisJQm90aCBqYXh3czp2ZXJzaW9uIGFuZCB2ZXJzaW9uIGFyZSBwcmVzZW50CitJbnRlcm5hbGl6ZXIuSW5jb3JyZWN0VmVyc2lvbiA9IFwKKwlKQVhXUyB2ZXJzaW9uIGF0dHJpYnV0ZSBtdXN0IGJlICIyLjAiCisKK0ludGVybmFsaXplci5WZXJzaW9uTm90UHJlc2VudCA9IFwKKwlKQVhXUyB2ZXJzaW9uIGF0dHJpYnV0ZSBtdXN0IGJlIHByZXNlbnQKKwogaW50ZXJuYWxpemVyLnRhcmdldE5vdEFuRWxlbWVudD0gXAogICAgIFRhcmdldCBub2RlIGlzIG5vdCBhbiBlbGVtZW50CiBpbnRlcm5hbGl6ZXIudGFyZ2V0Tm90Rm91bmQ9IFwKICAgICBObyB0YXJnZXQgZm91bmQgZm9yIHRoZSB3c2RsTG9jYXRpb246IHswfQorCitJbnRlcm5hbGl6ZXIuSW5jb3JyZWN0U2NoZW1hUmVmZXJlbmNlPSBcCisJInswfSIgaXMgbm90IGEgcGFydCBvZiB0aGlzIGNvbXBpbGF0aW9uLiBJcyB0aGlzIGEgbWlzdGFrZSBmb3IgInsxfSI/CisKIGludGVybmFsaXplci5YUGF0aEV2YWx1YXRpb25FcnJvciA9IFwKICAgICBYUGF0aCBlcnJvcjogezB9CiBpbnRlcm5hbGl6ZXIuWFBhdGhFdmFsdWF0ZXNUb05vVGFyZ2V0ID0gXApAQCAtOTksNCArMTMyLDcgQEAKIGludGVybmFsaXplci5YUGF0aEV2YWx1YXRlc1RvTm9uRWxlbWVudCA9IFwKICAgICBYUGF0aCBldmFsdWF0aW9uIG9mICJ7MH0iIG5lZWRzIHRvIHJlc3VsdCBpbiBhbiBlbGVtZW50LgogaW52YWxpZC5jdXN0b21pemF0aW9uLm5hbWVzcGFjZT1JZ25vcmluZyBjdXN0b21pemF0aW9uOiBcInswfVwiLCBpdCBoYXMgbm8gbmFtZXNwYWNlLiBJdCBtdXN0IGJlbG9uZyB0byB0aGUgY3VzdG9taXphdGlvbiBuYW1lc3BhY2UuICAgIAorCitpbnZhbGlkLndzZGwud2l0aC5kb29jPSJOb3QgYSBXU0RMIGRvY3VtZW50OiB7MH0sIGl0IGdpdmVzIFwiezF9XCIsIHJldHJ5aW5nIHdpdGggTUVYLi4uIgoraW52YWxpZC53c2RsPSJ7MH0gZG9lcyBub3QgbG9vayBsaWtlIGEgV1NETCBkb2N1bWVudCwgcmV0cnlpbmcgd2l0aCBNRVguLi4iCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3NwaS9XU1Rvb2xzT2JqZWN0RmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9zcGkvV1NUb29sc09iamVjdEZhY3RvcnkuamF2YQppbmRleCA3MzI4MmNkLi5kZWFlNjA2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3NwaS9XU1Rvb2xzT2JqZWN0RmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvc3BpL1dTVG9vbHNPYmplY3RGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNiArMjUsOCBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnNwaTsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC5XU1Rvb2xzT2JqZWN0RmFjdG9yeUltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Db250YWluZXI7CisKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIAogCkBAIC0zNSwxNiArMzcsMTMgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFdTVG9vbHNPYmplY3RGYWN0b3J5IHsKIAotICAgIHByaXZhdGUgc3RhdGljIFdTVG9vbHNPYmplY3RGYWN0b3J5IGZhY3Rvcnk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV1NUb29sc09iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBXU1Rvb2xzT2JqZWN0RmFjdG9yeUltcGwoKTsKIAogICAgIC8qKgogICAgICAqIE9idGFpbiBhbiBpbnN0YW5jZSBvZiBhIGZhY3RvcnkuIERvbid0IHdvcnJ5IGFib3V0IHN5bmNocm9uaXphdGlvbihhdCB0aGUKICAgICAgKiBtb3N0LCBvbmUgbW9yZSBmYWN0b3J5IGlzIGNyZWF0ZWQpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgV1NUb29sc09iamVjdEZhY3RvcnkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBuZXcgV1NUb29sc09iamVjdEZhY3RvcnlJbXBsKCk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgfQogCkBAIC01MiwxNiArNTEsNDkgQEAKICAgICAgKiBJbnZva2VzIHdzaW1wb3J0IG9uIHRoZSB3c2RsIFVSTCBhcmd1bWVudCwgYW5kIGdlbmVyYXRlcyB0aGUgbmVjZXNzYXJ5CiAgICAgICogcG9ydGFibGUgYXJ0aWZhY3RzIGxpa2UgU0VJLCBTZXJ2aWNlLCBCZWFuIGNsYXNzZXMgZXRjLgogICAgICAqCisgICAgICogQHBhcmFtIGxvZ1N0cmVhbSBTdHJlYW0gdXNlZCBmb3IgcmVwb3J0aW5nIGxvZyBtZXNzYWdlcyBsaWtlIGVycm9ycywgd2FybmluZ3MgZXRjCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBnaXZlcyBhbiBlbnZpcm9ubWVudCBmb3IgdG9vbCBpZiBpdCBpcyBydW4gZHVyaW5nIGFwcHNlcnZlcgorICAgICAqICAgICAgICAgICAgICAgICAgZGVwbG95bWVudAorICAgICAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyB3aXRoIHZhcmlvdXMgb3B0aW9ucyBhbmQgd3NkbCB1cmwKKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBubyBlcnJvciwgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gd3NpbXBvcnQoT3V0cHV0U3RyZWFtIGxvZ1N0cmVhbSwgU3RyaW5nW10gYXJncyk7CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gd3NpbXBvcnQoT3V0cHV0U3RyZWFtIGxvZ1N0cmVhbSwgQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nW10gYXJncyk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHdzaW1wb3J0IG9uIHRoZSB3c2RsIFVSTCBhcmd1bWVudCwgYW5kIGdlbmVyYXRlcyB0aGUgbmVjZXNzYXJ5CisgICAgICogcG9ydGFibGUgYXJ0aWZhY3RzIGxpa2UgU0VJLCBTZXJ2aWNlLCBCZWFuIGNsYXNzZXMgZXRjLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vIGVycm9yLCBvdGhlcndpc2UgZmFsc2UKKyAgICAgKgorICAgICAqIEBzZWUge0BsaW5rICN3c2ltcG9ydChPdXRwdXRTdHJlYW0sIENvbnRhaW5lciwgU3RyaW5nW10pfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHdzaW1wb3J0KE91dHB1dFN0cmVhbSBsb2dTdHJlYW0sIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIHdzaW1wb3J0KGxvZ1N0cmVhbSwgQ29udGFpbmVyLk5PTkUsIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgd3NnZW4gb24gdGhlIGVuZHBvaW50IGltcGxlbWVudGF0aW9uLCBhbmQgZ2VuZXJhdGVzIHRoZSBuZWNlc3NhcnkKKyAgICAgKiBhcnRpZmFjdHMgbGlrZSB3cmFwcGVyLCBleGNlcHRpb24gYmVhbiBjbGFzc2VzIGV0Yy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2dTdHJlYW0gU3RyZWFtIHVzZWQgZm9yIHJlcG9ydGluZyBsb2cgbWVzc2FnZXMgbGlrZSBlcnJvcnMsIHdhcm5pbmdzIGV0YworICAgICAqIEBwYXJhbSBjb250YWluZXIgZ2l2ZXMgYW4gZW52aXJvbm1lbnQgZm9yIHRvb2wgaWYgaXQgaXMgcnVuIGR1cmluZyBhcHBzZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnQKKyAgICAgKiBAcGFyYW0gYXJncyBhcmd1bWVudHMgd2l0aCB2YXJpb3VzIG9wdGlvbnMgYW5kIGVuZHBvaW50IGNsYXNzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbm8gZXJyb3IsIG90aGVyd2lzZSBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHdzZ2VuKE91dHB1dFN0cmVhbSBsb2dTdHJlYW0sIENvbnRhaW5lciBjb250YWluZXIsIFN0cmluZ1tdIGFyZ3MpOwogCiAgICAgLyoqCiAgICAgICogSW52b2tlcyB3c2dlbiBvbiB0aGUgZW5kcG9pbnQgaW1wbGVtZW50YXRpb24sIGFuZCBnZW5lcmF0ZXMgdGhlIG5lY2Vzc2FyeQogICAgICAqIGFydGlmYWN0cyBsaWtlIHdyYXBwZXIsIGV4Y2VwdGlvbiBiZWFuIGNsYXNzZXMgZXRjLgogICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vIGVycm9yLCBvdGhlcndpc2UgZmFsc2UKKyAgICAgKiBAc2VlIHtAbGluayAjd3NnZW4oT3V0cHV0U3RyZWFtLCBDb250YWluZXIsIFN0cmluZ1tdKX0KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB3c2dlbihPdXRwdXRTdHJlYW0gbG9nU3RyZWFtLCBTdHJpbmdbXSBhcmdzKTsKKyAgICBwdWJsaWMgYm9vbGVhbiB3c2dlbihPdXRwdXRTdHJlYW0gbG9nU3RyZWFtLCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHJldHVybiB3c2dlbihsb2dTdHJlYW0sIENvbnRhaW5lci5OT05FLCBhcmdzKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvc3BpL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9zcGkvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggNmQ5NTU3OS4uYTA4MWZkMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9zcGkvcGFja2FnZS1pbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy9zcGkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNyArMjUsNyBAQAogCiAvKioKICAqCi0gKiA8UD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgU1BJIGZvciB0aGUgSkFYLVdTIDIuMCB0b29scy4KKyAqIDxQPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBTUEkgZm9yIHRoZSBKQVgtV1MgMi4wLjEgdG9vbHMuCiAgKiAgVGhlIFdTVG9vbHNPYmplY3RGYWN0b3J5IGlzIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiBXc0dlbgogICogIGFuZCBXc0ltcG9ydCB0aGF0IG90aGVyIGFwcGxpY2F0aW9ucyBjYW4gdXNlLgogKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9DbGFzc05hbWVJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvQ2xhc3NOYW1lSW5mby5qYXZhCmluZGV4IDg2YjFlNDguLmYxYTdiZTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9DbGFzc05hbWVJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL0NsYXNzTmFtZUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvRm9ya0VudGl0eVJlc29sdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvRm9ya0VudGl0eVJlc29sdmVyLmphdmEKaW5kZXggZjc5ZDJkZS4uNmVhNmEwMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL0ZvcmtFbnRpdHlSZXNvbHZlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9Gb3JrRW50aXR5UmVzb2x2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMiArMjUsMTIgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogLyoqCiAgKiB7QGxpbmsgRW50aXR5UmVzb2x2ZXJ9IHRoYXQgZGVsZWdhdGVzIHRvIHR3byB7QGxpbmsgRW50aXR5UmVzb2x2ZXJ9cy4KICAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvSkFYV1NDbGFzc0ZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9KQVhXU0NsYXNzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzAyMDljLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9KQVhXU0NsYXNzRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuV1NETE1vZGVsSW5mbzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuTmFtZXM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci53c2RsLldTRExNb2RlbGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbC5XU0RMTW9kZWxlckJhc2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuVmVyc2lvblV0aWw7Ci0KLS8qKgotICogU2luZ2xldG9uIGZhY3RvcnkgY2xhc3MgdG8gaW5zdGFudGlhdGUgY29uY3JldGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgamF4d3MgdmVyc2lvbgotICogdG8gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZS4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEpBWFdTQ2xhc3NGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKQVhXU0NsYXNzRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEpBWFdTQ2xhc3NGYWN0b3J5KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2xhc3NWZXJzaW9uID0gVmVyc2lvblV0aWwuSkFYV1NfVkVSU0lPTl9ERUZBVUxUOwotCi0gICAgcHJpdmF0ZSBKQVhXU0NsYXNzRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZhY3RvcnkgaW5zdGFuY2UgZm9yIHRoZSBkZWZhdWx0IHZlcnNpb24uCi0gICAgICogQHJldHVybiAgICAgICAgSkFYV1NDbGFzc0ZhY3RvcnkgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpBWFdTQ2xhc3NGYWN0b3J5IG5ld0luc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2ZXJzaW9uIHRvIGEgc3RhdGljIGNsYXNzVmVyc2lvbgotICAgICAqIEBwYXJhbSB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotICAgICAgICBpZiAodmVyc2lvbiA9PSBudWxsKQotICAgICAgICAgICAgdmVyc2lvbiA9IFZlcnNpb25VdGlsLkpBWFdTX1ZFUlNJT05fREVGQVVMVDsKLQotICAgICAgICBpZiAoIVZlcnNpb25VdGlsLmlzVmFsaWRWZXJzaW9uKHZlcnNpb24pKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBjbGFzc1ZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFdTRExNb2RlbGVyIGZvciBzcGVjaWZpYyB0YXJnZXQgdmVyc2lvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2RlbEluZm8KLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqIEByZXR1cm4gdGhlIFdTRExNb2RlbGVyIGZvciBzcGVjaWZpYyB0YXJnZXQgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETE1vZGVsZXJCYXNlIGNyZWF0ZVdTRExNb2RlbGVyKAotICAgICAgICBXU0RMTW9kZWxJbmZvIG1vZGVsSW5mbywKLSAgICAgICAgUHJvcGVydGllcyBvcHRpb25zKSB7Ci0gICAgICAgIFdTRExNb2RlbGVyQmFzZSB3c2RsTW9kZWxlciA9IG51bGw7Ci0gICAgICAgIGlmIChjbGFzc1ZlcnNpb24uZXF1YWxzKFZlcnNpb25VdGlsLkpBWFdTX1ZFUlNJT05fMjApKQotICAgICAgICAgICAgd3NkbE1vZGVsZXIgPSBuZXcgV1NETE1vZGVsZXIobW9kZWxJbmZvLCBvcHRpb25zKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbE1vZGVsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgTmFtZXMgZm9yIHNwZWNpZmljIHRhcmdldCB2ZXJzaW9uLgotICAgICAqIC8vYnVnIGZpeDo0OTA0NjA0Ci0gICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBOYW1lcwotICAgICAqLwotICAgIHB1YmxpYyBOYW1lcyBjcmVhdGVOYW1lcygpIHsKLSAgICAgICAgTmFtZXMgbmFtZXMgPSBuZXcgTmFtZXMoKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzVmVyc2lvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvSmF2YUNvbXBpbGVySGVscGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvSmF2YUNvbXBpbGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTJlN2QuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL0phdmFDb21waWxlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHRvIGludm9rZSBqYXZhYy4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEphdmFDb21waWxlckhlbHBlciBleHRlbmRzIFRvb2xCYXNlIHsKLQotICAgIHB1YmxpYyBKYXZhQ29tcGlsZXJIZWxwZXIoT3V0cHV0U3RyZWFtIG91dCkgewotICAgICAgICBzdXBlcihvdXQsICIgIik7Ci0gICAgICAgIHRoaXMub3V0ID0gb3V0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbXBpbGUoU3RyaW5nW10gYXJncykgewotICAgICAgICByZXR1cm4gaW50ZXJuYWxDb21waWxlKGFyZ3MpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLmphdmFjb21waWxlciI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJuYWxDb21waWxlKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBDbGFzcyBjb21TdW5Ub29sc0phdmFjTWFpbkNsYXNzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qIHRyeSB0byB1c2UgdGhlIG5ldyBjb21waWxlciAqLwotICAgICAgICAgICAgY29tU3VuVG9vbHNKYXZhY01haW5DbGFzcyA9Ci0gICAgICAgICAgICAgICAgICAgIGNsLmxvYWRDbGFzcygiY29tLnN1bi50b29scy5qYXZhYy5NYWluIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1ldGhvZCBjb21waWxlTWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbVN1blRvb2xzSmF2YWNNYWluQ2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUxNDFNZXRob2RTaWduYXR1cmUpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVNZXRob2QuaW52b2tlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGFyZ3MsIG5ldyBQcmludFdyaXRlcihvdXQpfSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIEludGVnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgcmVzdWx0KS5pbnRWYWx1ZSgpID09IDA7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAvL3RyeW91dCAxLjMuMSBzaWduYXR1cmUKLSAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxDb21waWxlUHJlMTQxKGFyZ3MpOwotICAgICAgICAgICAgICAgIC8vb25FcnJvcihnZXRNZXNzYWdlKCJqYXZhY29tcGlsZXIubm9zdWNobWV0aG9kLmVycm9yIiwgImdldE1ldGhvZChcImNvbXBpbGVcIiwgY29tcGlsZTE0MU1ldGhvZFNpZ25hdHVyZSkiKSk7Ci0gICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgb25FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YWNvbXBpbGVyLmNsYXNzcGF0aC5lcnJvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5zdW4udG9vbHMuamF2YWMuTWFpbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJuYWxDb21waWxlUHJlMTQxKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIHN1blRvb2xzSmF2YWNNYWluQ2xhc3MgPSBjbC5sb2FkQ2xhc3MoInN1bi50b29scy5qYXZhYy5NYWluIik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuVG9vbHNKYXZhY01haW5DbGFzcy5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvclNpZ25hdHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBqYXZhY01haW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyBvdXQsICJqYXZhYyIgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgY29tcGlsZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1blRvb2xzSmF2YWNNYWluQ2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlTWV0aG9kU2lnbmF0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlTWV0aG9kLmludm9rZShqYXZhY01haW4sIG5ldyBPYmplY3RbXSB7IGFyZ3MgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBCb29sZWFuKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCb29sZWFuKSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZTQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGU0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGU0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmFjb21waWxlci5ub3N1Y2htZXRob2QuZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0TWV0aG9kKFwiY29tcGlsZVwiLCBjb21waWxlTWV0aG9kU2lnbmF0dXJlKSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJpY0Vycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiamF2YWNvbXBpbGVyLmVycm9yIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VBcmd1bWVudHMoU3RyaW5nW10gYXJncykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTG9jYWxpemFibGUgbXNnKSB7Ci0gICAgICAgICAgICByZXBvcnQoZ2V0TWVzc2FnZSgiamF2YWNvbXBpbGVyLmVycm9yIiwgbG9jYWxpemVyLmxvY2FsaXplKG1zZykpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dDsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3NbXSBjb21waWxlMTQxTWV0aG9kU2lnbmF0dXJlOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3NbXSBjb25zdHJ1Y3RvclNpZ25hdHVyZTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzW10gY29tcGlsZU1ldGhvZFNpZ25hdHVyZTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBjb21waWxlMTQxTWV0aG9kU2lnbmF0dXJlID0gbmV3IENsYXNzWzJdOwotICAgICAgICAgICAgY29tcGlsZTE0MU1ldGhvZFNpZ25hdHVyZVswXSA9IChuZXcgU3RyaW5nWzBdKS5nZXRDbGFzcygpOwotICAgICAgICAgICAgY29tcGlsZTE0MU1ldGhvZFNpZ25hdHVyZVsxXSA9IFByaW50V3JpdGVyLmNsYXNzOwotICAgICAgICAgICAgLy9qZGsgdmVyc2lvbiA8IDEuNC4xIHNpZ25hdHVyZQotICAgICAgICAgICAgY29uc3RydWN0b3JTaWduYXR1cmUgPSBuZXcgQ2xhc3NbMl07Ci0gICAgICAgICAgICBjb25zdHJ1Y3RvclNpZ25hdHVyZVswXSA9IE91dHB1dFN0cmVhbS5jbGFzczsKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yU2lnbmF0dXJlWzFdID0gU3RyaW5nLmNsYXNzOwotICAgICAgICAgICAgY29tcGlsZU1ldGhvZFNpZ25hdHVyZSA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgICAgIGNvbXBpbGVNZXRob2RTaWduYXR1cmVbMF0gPSBjb21waWxlMTQxTWV0aG9kU2lnbmF0dXJlWzBdOyAvLyBTdHJpbmdbXQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL01hcEJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9NYXBCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGViY2YuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL01hcEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qCi0gKiBUaGlzIGNsYXNzIHdhcyBsaWZ0ZWQgZnJvbSBKREsgMS40ICh3aGVyZSBpdCdzIGNhbGxlZCBqYXZhLnV0aWwuQWJzdHJhY3RNYXApCi0gKiBzbyB0aGF0IHdlIGNhbiB1c2UgaXQgb24gMS4zLjEuCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2tlbGV0YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIDx0dD5NYXA8L3R0PgotICogaW50ZXJmYWNlLCB0byBtaW5pbWl6ZSB0aGUgZWZmb3J0IHJlcXVpcmVkIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gPHA+Ci0gKgotICogVG8gaW1wbGVtZW50IGFuIHVubW9kaWZpYWJsZSBtYXAsIHRoZSBwcm9ncmFtbWVyIG5lZWRzIG9ubHkgdG8gZXh0ZW5kIHRoaXMKLSAqIGNsYXNzIGFuZCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgPHR0PmVudHJ5U2V0PC90dD4gbWV0aG9kLCB3aGljaAotICogcmV0dXJucyBhIHNldC12aWV3IG9mIHRoZSBtYXAncyBtYXBwaW5ncy4gIFR5cGljYWxseSwgdGhlIHJldHVybmVkIHNldAotICogd2lsbCwgaW4gdHVybiwgYmUgaW1wbGVtZW50ZWQgYXRvcCA8dHQ+QWJzdHJhY3RTZXQ8L3R0Pi4gIFRoaXMgc2V0IHNob3VsZAotICogbm90IHN1cHBvcnQgdGhlIDx0dD5hZGQ8L3R0PiBvciA8dHQ+cmVtb3ZlPC90dD4gbWV0aG9kcywgYW5kIGl0cyBpdGVyYXRvcgotICogc2hvdWxkIG5vdCBzdXBwb3J0IHRoZSA8dHQ+cmVtb3ZlPC90dD4gbWV0aG9kLjxwPgotICoKLSAqIFRvIGltcGxlbWVudCBhIG1vZGlmaWFibGUgbWFwLCB0aGUgcHJvZ3JhbW1lciBtdXN0IGFkZGl0aW9uYWxseSBvdmVycmlkZQotICogdGhpcyBjbGFzcydzIDx0dD5wdXQ8L3R0PiBtZXRob2QgKHdoaWNoIG90aGVyd2lzZSB0aHJvd3MgYW4KLSAqIDx0dD5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvdHQ+KSwgYW5kIHRoZSBpdGVyYXRvciByZXR1cm5lZCBieQotICogPHR0PmVudHJ5U2V0KCkuaXRlcmF0b3IoKTwvdHQ+IG11c3QgYWRkaXRpb25hbGx5IGltcGxlbWVudCBpdHMKLSAqIDx0dD5yZW1vdmU8L3R0PiBtZXRob2QuPHA+Ci0gKgotICogVGhlIHByb2dyYW1tZXIgc2hvdWxkIGdlbmVyYWxseSBwcm92aWRlIGEgdm9pZCAobm8gYXJndW1lbnQpIGFuZCBtYXAKLSAqIGNvbnN0cnVjdG9yLCBhcyBwZXIgdGhlIHJlY29tbWVuZGF0aW9uIGluIHRoZSA8dHQ+TWFwPC90dD4gaW50ZXJmYWNlCi0gKiBzcGVjaWZpY2F0aW9uLjxwPgotICoKLSAqIFRoZSBkb2N1bWVudGF0aW9uIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBtZXRob2RzIGluIHRoaXMgY2xhc3MgZGVzY3JpYmVzIGl0cwotICogaW1wbGVtZW50YXRpb24gaW4gZGV0YWlsLiAgRWFjaCBvZiB0aGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIGlmIHRoZQotICogbWFwIGJlaW5nIGltcGxlbWVudGVkIGFkbWl0cyBhIG1vcmUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBhdXRob3IgIEpvc2ggQmxvY2gKLSAqIEBzZWUgTWFwCi0gKiBAc2VlIENvbGxlY3Rpb24KLSAqIEBzaW5jZSAxLjIKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFwQmFzZSBpbXBsZW1lbnRzIE1hcCB7Ci0gICAgLyoqCi0gICAgICogU29sZSBjb25zdHJ1Y3Rvci4gIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIHR5cGljYWxseQotICAgICAqIGltcGxpY2l0LikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwQmFzZSgpIHsKLSAgICB9Ci0KLSAgICAvLyBRdWVyeSBPcGVyYXRpb25zCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLiAgSWYgdGhlIG1hcAotICAgICAqIGNvbnRhaW5zIG1vcmUgdGhhbiA8dHQ+SW50ZWdlci5NQVhfVkFMVUU8L3R0PiBlbGVtZW50cywgcmV0dXJucwotICAgICAqIDx0dD5JbnRlZ2VyLk1BWF9WQUxVRTwvdHQ+LjxwPgotICAgICAqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDx0dD5lbnRyeVNldCgpLnNpemUoKTwvdHQ+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBlbnRyeVNldCgpLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgY29udGFpbnMgbm8ga2V5LXZhbHVlIG1hcHBpbmdzLiA8cD4KLSAgICAgKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8dHQ+c2l6ZSgpID09IDA8L3R0Pi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBjb250YWlucyBubyBrZXktdmFsdWUgbWFwcGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIHNpemUoKSA9PSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBtYXBzIG9uZSBvciBtb3JlIGtleXMgdG8gdGhpcyB2YWx1ZS4KLSAgICAgKiBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgYW5kIG9ubHkgaWYgdGhpcyBtYXAgY29udGFpbnMKLSAgICAgKiBhdCBsZWFzdCBvbmUgbWFwcGluZyB0byBhIHZhbHVlIDx0dD52PC90dD4gc3VjaCB0aGF0IDx0dD4odmFsdWU9PW51bGwgPwotICAgICAqIHY9PW51bGwgOiB2YWx1ZS5lcXVhbHModikpPC90dD4uICBUaGlzIG9wZXJhdGlvbiB3aWxsIHByb2JhYmx5IHJlcXVpcmUKLSAgICAgKiB0aW1lIGxpbmVhciBpbiB0aGUgbWFwIHNpemUgZm9yIG1vc3QgaW1wbGVtZW50YXRpb25zIG9mIG1hcC48cD4KLSAgICAgKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciBlbnRyeVNldCgpIHNlYXJjaGluZyBmb3IgYW4gZW50cnkKLSAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZiBzdWNoIGFuIGVudHJ5IGlzIGZvdW5kLCA8dHQ+dHJ1ZTwvdHQ+IGlzCi0gICAgICogcmV0dXJuZWQuICBJZiB0aGUgaXRlcmF0aW9uIHRlcm1pbmF0ZXMgd2l0aG91dCBmaW5kaW5nIHN1Y2ggYW4gZW50cnksCi0gICAgICogPHR0PmZhbHNlPC90dD4gaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcwotICAgICAqIGxpbmVhciB0aW1lIGluIHRoZSBzaXplIG9mIHRoZSBtYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIG1hcHMgb25lIG9yIG1vcmUga2V5cyB0byB0aGlzIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFbnRyeSBlID0gKEVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50cnkgZSA9IChFbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhlLmdldFZhbHVlKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZAotICAgICAqIGtleS4gPHA+Ci0gICAgICoKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGl0ZXJhdGVzIG92ZXIgPHR0PmVudHJ5U2V0KCk8L3R0PiBzZWFyY2hpbmcgZm9yIGFuCi0gICAgICogZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4gIElmIHN1Y2ggYW4gZW50cnkgaXMgZm91bmQsIDx0dD50cnVlPC90dD4KLSAgICAgKiBpcyByZXR1cm5lZC4gIElmIHRoZSBpdGVyYXRpb24gdGVybWluYXRlcyB3aXRob3V0IGZpbmRpbmcgc3VjaCBhbgotICAgICAqIGVudHJ5LCA8dHQ+ZmFsc2U8L3R0PiBpcyByZXR1cm5lZC4gIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogcmVxdWlyZXMgbGluZWFyIHRpbWUgaW4gdGhlIHNpemUgb2YgdGhlIG1hcDsgbWFueSBpbXBsZW1lbnRhdGlvbnMgd2lsbAotICAgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBrZXkgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkLgotICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgICAgIGtleS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24ga2V5IGlzIDx0dD5udWxsPC90dD4gYW5kIHRoaXMgbWFwIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICBub3QgcGVybWl0IDx0dD5udWxsPC90dD4ga2V5cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50cnkgZSA9IChFbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFbnRyeSBlID0gKEVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCBrZXkuICBSZXR1cm5zCi0gICAgICogPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LiAgQSByZXR1cm4KLSAgICAgKiB2YWx1ZSBvZiA8dHQ+bnVsbDwvdHQ+IGRvZXMgbm90IDxpPm5lY2Vzc2FyaWx5PC9pPiBpbmRpY2F0ZSB0aGF0IHRoZQotICAgICAqIG1hcCBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGUga2V5OyBpdCdzIGFsc28gcG9zc2libGUgdGhhdCB0aGUgbWFwCi0gICAgICogZXhwbGljaXRseSBtYXBzIHRoZSBrZXkgdG8gPHR0Pm51bGw8L3R0Pi4gIFRoZSBjb250YWluc0tleSBvcGVyYXRpb24KLSAgICAgKiBtYXkgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVzZSB0d28gY2FzZXMuIDxwPgotICAgICAqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIDx0dD5lbnRyeVNldCgpPC90dD4gc2VhcmNoaW5nIGZvciBhbgotICAgICAqIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBrZXkuICBJZiBzdWNoIGFuIGVudHJ5IGlzIGZvdW5kLCB0aGUgZW50cnkncwotICAgICAqIHZhbHVlIGlzIHJldHVybmVkLiAgSWYgdGhlIGl0ZXJhdGlvbiB0ZXJtaW5hdGVzIHdpdGhvdXQgZmluZGluZyBzdWNoIGFuCi0gICAgICogZW50cnksIDx0dD5udWxsPC90dD4gaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbgotICAgICAqIHJlcXVpcmVzIGxpbmVhciB0aW1lIGluIHRoZSBzaXplIG9mIHRoZSBtYXA7IG1hbnkgaW1wbGVtZW50YXRpb25zIHdpbGwKLSAgICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkga2V5IHdob3NlIGFzc29jaWF0ZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQuCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgdG8gd2hpY2ggdGhpcyBtYXAgbWFwcyB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGtleSBpcyA8dHQ+bnVsbDwvdHQ+IGFuZCB0aGlzIG1hcAotICAgICAqICAgICAgICBkb2VzIG5vdCBub3QgcGVybWl0IDx0dD5udWxsPC90dD4ga2V5cy4KLSAgICAgKgotICAgICAqIEBzZWUgI2NvbnRhaW5zS2V5KE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50cnkgZSA9IChFbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEVudHJ5IGUgPSAoRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKGUuZ2V0S2V5KCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIE1vZGlmaWNhdGlvbiBPcGVyYXRpb25zCi0KLSAgICAvKioKLSAgICAgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIG1hcAotICAgICAqIChvcHRpb25hbCBvcGVyYXRpb24pLiAgSWYgdGhlIG1hcCBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yCi0gICAgICogdGhpcyBrZXksIHRoZSBvbGQgdmFsdWUgaXMgcmVwbGFjZWQuPHA+Ci0gICAgICoKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgYW4KLSAgICAgKiA8dHQ+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L3R0Pi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkga2V5IHdpdGggd2hpY2ggdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkLgotICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5LCBvciA8dHQ+bnVsbDwvdHQ+Ci0gICAgICogICAgICAgICBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LiAgKEEgPHR0Pm51bGw8L3R0PiByZXR1cm4gY2FuCi0gICAgICogICAgICAgICBhbHNvIGluZGljYXRlIHRoYXQgdGhlIG1hcCBwcmV2aW91c2x5IGFzc29jaWF0ZWQgPHR0Pm51bGw8L3R0PgotICAgICAqICAgICAgICAgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgaWYgdGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCi0gICAgICogICAgICAgICA8dHQ+bnVsbDwvdHQ+IHZhbHVlcy4pCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSA8dHQ+cHV0PC90dD4gb3BlcmF0aW9uIGlzCi0gICAgICogICAgICAgICAgICBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWFwLgotICAgICAqCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQga2V5IG9yIHZhbHVlCi0gICAgICogICAgICAgICAgICBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0b3JlZCBpbiB0aGlzIG1hcC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNvbWUgYXNwZWN0IG9mIHRoaXMga2V5IG9yIHZhbHVlICoKLSAgICAgKiAgICAgICAgICAgIHByZXZlbnRzIGl0IGZyb20gYmVpbmcgc3RvcmVkIGluIHRoaXMgbWFwLgotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aGlzIG1hcCBkb2VzIG5vdCBwZXJtaXQgPHR0Pm51bGw8L3R0PgotICAgICAqICAgICAgICAgICAga2V5cyBvciB2YWx1ZXMsIGFuZCB0aGUgc3BlY2lmaWVkIGtleSBvciB2YWx1ZSBpcwotICAgICAqICAgICAgICAgICAgPHR0Pm51bGw8L3R0Pi4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBmb3IgdGhpcyBrZXkgZnJvbSB0aGlzIG1hcCBpZiBwcmVzZW50IChvcHRpb25hbAotICAgICAqIG9wZXJhdGlvbikuIDxwPgotICAgICAqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIDx0dD5lbnRyeVNldCgpPC90dD4gc2VhcmNoaW5nIGZvciBhbgotICAgICAqIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBrZXkuICBJZiBzdWNoIGFuIGVudHJ5IGlzIGZvdW5kLCBpdHMgdmFsdWUgaXMKLSAgICAgKiBvYnRhaW5lZCB3aXRoIGl0cyA8dHQ+Z2V0VmFsdWU8L3R0PiBvcGVyYXRpb24sIHRoZSBlbnRyeSBpcyBpcyByZW1vdmVkCi0gICAgICogZnJvbSB0aGUgQ29sbGVjdGlvbiAoYW5kIHRoZSBiYWNraW5nIG1hcCkgd2l0aCB0aGUgaXRlcmF0b3IncwotICAgICAqIDx0dD5yZW1vdmU8L3R0PiBvcGVyYXRpb24sIGFuZCB0aGUgc2F2ZWQgdmFsdWUgaXMgcmV0dXJuZWQuICBJZiB0aGUKLSAgICAgKiBpdGVyYXRpb24gdGVybWluYXRlcyB3aXRob3V0IGZpbmRpbmcgc3VjaCBhbiBlbnRyeSwgPHR0Pm51bGw8L3R0PiBpcwotICAgICAqIHJldHVybmVkLiAgTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgbGluZWFyIHRpbWUgaW4gdGhlCi0gICAgICogc2l6ZSBvZiB0aGUgbWFwOyBtYW55IGltcGxlbWVudGF0aW9ucyB3aWxsIG92ZXJyaWRlIHRoaXMgbWV0aG9kLjxwPgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gdGhyb3dzIGFuCi0gICAgICogPHR0PlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC90dD4gaWYgdGhlIDx0dD5lbnRyeVNldDwvdHQ+IGl0ZXJhdG9yCi0gICAgICogZG9lcyBub3Qgc3VwcG9ydCB0aGUgPHR0PnJlbW92ZTwvdHQ+IG1ldGhvZCBhbmQgdGhpcyBtYXAgY29udGFpbnMgYQotICAgICAqIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBrZXkgd2hvc2UgbWFwcGluZyBpcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIG1hcC4KLSAgICAgKiBAcmV0dXJuIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5LCBvciA8dHQ+bnVsbDwvdHQ+Ci0gICAgICogICAgICAgICBpZiB0aGVyZSB3YXMgbm8gZW50cnkgZm9yIGtleS4gIChBIDx0dD5udWxsPC90dD4gcmV0dXJuIGNhbgotICAgICAqICAgICAgICAgYWxzbyBpbmRpY2F0ZSB0aGF0IHRoZSBtYXAgcHJldmlvdXNseSBhc3NvY2lhdGVkIDx0dD5udWxsPC90dD4KLSAgICAgKiAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cwotICAgICAqICAgICAgICAgPHR0Pm51bGw8L3R0PiB2YWx1ZXMuKQotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIDx0dD5yZW1vdmU8L3R0PiBvcGVyYXRpb24KLSAgICAgKiAgICAgICAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIEVudHJ5IGNvcnJlY3RFbnRyeSA9IG51bGw7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgd2hpbGUgKGNvcnJlY3RFbnRyeSA9PSBudWxsICYmIGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50cnkgZSA9IChFbnRyeSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29ycmVjdEVudHJ5ID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdoaWxlIChjb3JyZWN0RW50cnkgPT0gbnVsbCAmJiBpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEVudHJ5IGUgPSAoRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKGUuZ2V0S2V5KCkpKQotICAgICAgICAgICAgICAgICAgICBjb3JyZWN0RW50cnkgPSBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKGNvcnJlY3RFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvbGRWYWx1ZSA9IGNvcnJlY3RFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgfQotCi0gICAgLy8gQnVsayBPcGVyYXRpb25zCi0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgbWFwCi0gICAgICogKG9wdGlvbmFsIG9wZXJhdGlvbikuICBUaGVzZSBtYXBwaW5ncyB3aWxsIHJlcGxhY2UgYW55IG1hcHBpbmdzIHRoYXQKLSAgICAgKiB0aGlzIG1hcCBoYWQgZm9yIGFueSBvZiB0aGUga2V5cyBjdXJyZW50bHkgaW4gdGhlIHNwZWNpZmllZCBtYXAuPHA+Ci0gICAgICoKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGl0ZXJhdGVzIG92ZXIgdGhlIHNwZWNpZmllZCBtYXAncwotICAgICAqIDx0dD5lbnRyeVNldCgpPC90dD4gY29sbGVjdGlvbiwgYW5kIGNhbGxzIHRoaXMgbWFwJ3MgPHR0PnB1dDwvdHQ+Ci0gICAgICogb3BlcmF0aW9uIG9uY2UgZm9yIGVhY2ggZW50cnkgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdGlvbi48cD4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIHRocm93cyBhbgotICAgICAqIDx0dD5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvdHQ+IGlmIHRoaXMgbWFwIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgKiB0aGUgPHR0PnB1dDwvdHQ+IG9wZXJhdGlvbiBhbmQgdGhlIHNwZWNpZmllZCBtYXAgaXMgbm9uZW1wdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdCBtYXBwaW5ncyB0byBiZSBzdG9yZWQgaW4gdGhpcyBtYXAuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSA8dHQ+cHV0QWxsPC90dD4gb3BlcmF0aW9uCi0gICAgICogICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBtYXAuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgb2YgYSBrZXkgb3IgdmFsdWUgaW4gdGhlCi0gICAgICogICAgICAgICAgICBzcGVjaWZpZWQgbWFwIHByZXZlbnRzIGl0IGZyb20gYmVpbmcgc3RvcmVkIGluIHRoaXMgbWFwLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc29tZSBhc3BlY3Qgb2YgYSBrZXkgb3IgdmFsdWUgaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbWFwIHByZXZlbnRzIGl0IGZyb20gYmVpbmcgc3RvcmVkIGluIHRoaXMgbWFwLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhlIHNwZWNpZmllZCBtYXAgaXMgPHR0Pm51bGw8L3R0Piwgb3IgaWYKLSAgICAgKiAgICAgICAgIHRoaXMgbWFwIGRvZXMgbm90IHBlcm1pdCA8dHQ+bnVsbDwvdHQ+IGtleXMgb3IgdmFsdWVzLCBhbmQgdGhlCi0gICAgICogICAgICAgICBzcGVjaWZpZWQgbWFwIGNvbnRhaW5zIDx0dD5udWxsPC90dD4ga2V5cyBvciB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCB0KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSB0LmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBFbnRyeSBlID0gKEVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgIHB1dChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGlzIG1hcCAob3B0aW9uYWwgb3BlcmF0aW9uKS4gPHA+Ci0gICAgICoKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbGxzIDx0dD5lbnRyeVNldCgpLmNsZWFyKCk8L3R0Pi4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIHRocm93cyBhbgotICAgICAqIDx0dD5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvdHQ+IGlmIHRoZSA8dHQ+ZW50cnlTZXQ8L3R0PgotICAgICAqIGRvZXMgbm90IHN1cHBvcnQgdGhlIDx0dD5jbGVhcjwvdHQ+IG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gY2xlYXIgaXMgbm90IHN1cHBvcnRlZAotICAgICAqICAgICAgICBieSB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZW50cnlTZXQoKS5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIFZpZXdzCi0KLSAgICAvKioKLSAgICAgKiBFYWNoIG9mIHRoZXNlIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgdG8gY29udGFpbiBhbiBpbnN0YW5jZSBvZiB0aGUKLSAgICAgKiBhcHByb3ByaWF0ZSB2aWV3IHRoZSBmaXJzdCB0aW1lIHRoaXMgdmlldyBpcyByZXF1ZXN0ZWQuICBUaGUgdmlld3MgYXJlCi0gICAgICogc3RhdGVsZXNzLCBzbyB0aGVyZSdzIG5vIHJlYXNvbiB0byBjcmVhdGUgbW9yZSB0aGFuIG9uZSBvZiBlYWNoLgotICAgICAqLwotICAgIHRyYW5zaWVudCB2b2xhdGlsZSBTZXQga2V5U2V0ID0gbnVsbDsKLSAgICB0cmFuc2llbnQgdm9sYXRpbGUgQ29sbGVjdGlvbiB2YWx1ZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNldCB2aWV3IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gIFRoZSBTZXQgaXMKLSAgICAgKiBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4gdGhlIFNldCwKLSAgICAgKiBhbmQgdmljZS12ZXJzYS4gIChJZiB0aGUgbWFwIGlzIG1vZGlmaWVkIHdoaWxlIGFuIGl0ZXJhdGlvbiBvdmVyCi0gICAgICogdGhlIFNldCBpcyBpbiBwcm9ncmVzcywgdGhlIHJlc3VsdHMgb2YgdGhlIGl0ZXJhdGlvbiBhcmUgdW5kZWZpbmVkLikKLSAgICAgKiBUaGUgU2V0IHN1cHBvcnRzIGVsZW1lbnQgcmVtb3ZhbCwgd2hpY2ggcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyBlbnRyeQotICAgICAqIGZyb20gdGhlIG1hcCwgdmlhIHRoZSBJdGVyYXRvci5yZW1vdmUsIFNldC5yZW1vdmUsICByZW1vdmVBbGwKLSAgICAgKiByZXRhaW5BbGwsIGFuZCBjbGVhciBvcGVyYXRpb25zLiAgSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWRkIG9yCi0gICAgICogYWRkQWxsIG9wZXJhdGlvbnMuPHA+Ci0gICAgICoKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBTZXQgdGhhdCBzdWJjbGFzc2VzCi0gICAgICogQWJzdHJhY3RTZXQuICBUaGUgc3ViY2xhc3MncyBpdGVyYXRvciBtZXRob2QgcmV0dXJucyBhICJ3cmFwcGVyCi0gICAgICogb2JqZWN0IiBvdmVyIHRoaXMgbWFwJ3MgZW50cnlTZXQoKSBpdGVyYXRvci4gIFRoZSBzaXplIG1ldGhvZCBkZWxlZ2F0ZXMKLSAgICAgKiB0byB0aGlzIG1hcCdzIHNpemUgbWV0aG9kIGFuZCB0aGUgY29udGFpbnMgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGlzCi0gICAgICogbWFwJ3MgY29udGFpbnNLZXkgbWV0aG9kLjxwPgotICAgICAqCi0gICAgICogVGhlIFNldCBpcyBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwKLSAgICAgKiBhbmQgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gYWxsIHN1YnNlcXVlbnQgY2FsbHMuICBObyBzeW5jaHJvbml6YXRpb24KLSAgICAgKiBpcyBwZXJmb3JtZWQsIHNvIHRoZXJlIGlzIGEgc2xpZ2h0IGNoYW5jZSB0aGF0IG11bHRpcGxlIGNhbGxzIHRvIHRoaXMKLSAgICAgKiBtZXRob2Qgd2lsbCBub3QgYWxsIHJldHVybiB0aGUgc2FtZSBTZXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU2V0IHZpZXcgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICBpZiAoa2V5U2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGtleVNldCA9IG5ldyBBYnN0cmFjdFNldCgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yIGkgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuaGFzTmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoRW50cnkpIGkubmV4dCgpKS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWFwQmFzZS50aGlzLnNpemUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgaykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWFwQmFzZS50aGlzLmNvbnRhaW5zS2V5KGspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleVNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgVGhlCi0gICAgICogY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4KLSAgICAgKiB0aGUgY29sbGVjdGlvbiwgYW5kIHZpY2UtdmVyc2EuICAoSWYgdGhlIG1hcCBpcyBtb2RpZmllZCB3aGlsZSBhbgotICAgICAqIGl0ZXJhdGlvbiBvdmVyIHRoZSBjb2xsZWN0aW9uIGlzIGluIHByb2dyZXNzLCB0aGUgcmVzdWx0cyBvZiB0aGUKLSAgICAgKiBpdGVyYXRpb24gYXJlIHVuZGVmaW5lZC4pICBUaGUgY29sbGVjdGlvbiBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsCi0gICAgICogd2hpY2ggcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBmcm9tIHRoZSBtYXAsIHZpYSB0aGUKLSAgICAgKiA8dHQ+SXRlcmF0b3IucmVtb3ZlPC90dD4sIDx0dD5Db2xsZWN0aW9uLnJlbW92ZTwvdHQ+LAotICAgICAqIDx0dD5yZW1vdmVBbGw8L3R0PiwgPHR0PnJldGFpbkFsbDwvdHQ+IGFuZCA8dHQ+Y2xlYXI8L3R0PiBvcGVyYXRpb25zLgotICAgICAqIEl0IGRvZXMgbm90IHN1cHBvcnQgdGhlIDx0dD5hZGQ8L3R0PiBvciA8dHQ+YWRkQWxsPC90dD4gb3BlcmF0aW9ucy48cD4KLSAgICAgKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIGNvbGxlY3Rpb24gdGhhdCBzdWJjbGFzc2VzIGFic3RyYWN0Ci0gICAgICogY29sbGVjdGlvbi4gIFRoZSBzdWJjbGFzcydzIGl0ZXJhdG9yIG1ldGhvZCByZXR1cm5zIGEgIndyYXBwZXIgb2JqZWN0IgotICAgICAqIG92ZXIgdGhpcyBtYXAncyA8dHQ+ZW50cnlTZXQoKTwvdHQ+IGl0ZXJhdG9yLiAgVGhlIHNpemUgbWV0aG9kCi0gICAgICogZGVsZWdhdGVzIHRvIHRoaXMgbWFwJ3Mgc2l6ZSBtZXRob2QgYW5kIHRoZSBjb250YWlucyBtZXRob2QgZGVsZWdhdGVzCi0gICAgICogdG8gdGhpcyBtYXAncyBjb250YWluc1ZhbHVlIG1ldGhvZC48cD4KLSAgICAgKgotICAgICAqIFRoZSBjb2xsZWN0aW9uIGlzIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBhbmQKLSAgICAgKiByZXR1cm5lZCBpbiByZXNwb25zZSB0byBhbGwgc3Vic2VxdWVudCBjYWxscy4gIE5vIHN5bmNocm9uaXphdGlvbiBpcwotICAgICAqIHBlcmZvcm1lZCwgc28gdGhlcmUgaXMgYSBzbGlnaHQgY2hhbmNlIHRoYXQgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcwotICAgICAqIG1ldGhvZCB3aWxsIG5vdCBhbGwgcmV0dXJuIHRoZSBzYW1lIENvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQWJzdHJhY3RDb2xsZWN0aW9uKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3IgaSA9IGVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5oYXNOZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChFbnRyeSkgaS5uZXh0KCkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hcEJhc2UudGhpcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IHYpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hcEJhc2UudGhpcy5jb250YWluc1ZhbHVlKHYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2V0IHZpZXcgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gIEVhY2ggZWxlbWVudAotICAgICAqIGluIHRoaXMgc2V0IGlzIGEgTWFwLkVudHJ5LiAgVGhlIHNldCBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcwotICAgICAqIHRvIHRoZSBtYXAgYXJlIHJlZmxlY3RlZCBpbiB0aGUgc2V0LCBhbmQgdmljZS12ZXJzYS4gIChJZiB0aGUgbWFwIGlzCi0gICAgICogbW9kaWZpZWQgd2hpbGUgYW4gaXRlcmF0aW9uIG92ZXIgdGhlIHNldCBpcyBpbiBwcm9ncmVzcywgdGhlIHJlc3VsdHMgb2YKLSAgICAgKiB0aGUgaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuKSAgVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsIHdoaWNoCi0gICAgICogcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBmcm9tIHRoZSBtYXAsIHZpYSB0aGUKLSAgICAgKiA8dHQ+SXRlcmF0b3IucmVtb3ZlPC90dD4sIDx0dD5TZXQucmVtb3ZlPC90dD4sIDx0dD5yZW1vdmVBbGw8L3R0PiwKLSAgICAgKiA8dHQ+cmV0YWluQWxsPC90dD4gYW5kIDx0dD5jbGVhcjwvdHQ+IG9wZXJhdGlvbnMuICBJdCBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICogdGhlIDx0dD5hZGQ8L3R0PiBvciA8dHQ+YWRkQWxsPC90dD4gb3BlcmF0aW9ucy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzZXQgdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTZXQgZW50cnlTZXQoKTsKLQotICAgIC8vIENvbXBhcmlzb24gYW5kIGhhc2hpbmcKLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyBtYXAgZm9yIGVxdWFsaXR5LiAgUmV0dXJucwotICAgICAqIDx0dD50cnVlPC90dD4gaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhbHNvIGEgbWFwIGFuZCB0aGUgdHdvIG1hcHMKLSAgICAgKiByZXByZXNlbnQgdGhlIHNhbWUgbWFwcGluZ3MuICBNb3JlIGZvcm1hbGx5LCB0d28gbWFwcyA8dHQ+dDE8L3R0PiBhbmQKLSAgICAgKiA8dHQ+dDI8L3R0PiByZXByZXNlbnQgdGhlIHNhbWUgbWFwcGluZ3MgaWYKLSAgICAgKiA8dHQ+dDEua2V5U2V0KCkuZXF1YWxzKHQyLmtleVNldCgpKTwvdHQ+IGFuZCBmb3IgZXZlcnkga2V5IDx0dD5rPC90dD4KLSAgICAgKiBpbiA8dHQ+dDEua2V5U2V0KCk8L3R0PiwgPHR0PiAodDEuZ2V0KGspPT1udWxsID8gdDIuZ2V0KGspPT1udWxsIDoKLSAgICAgKiB0MS5nZXQoaykuZXF1YWxzKHQyLmdldChrKSkpIDwvdHQ+LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlCi0gICAgICogPHR0PmVxdWFsczwvdHQ+IG1ldGhvZCB3b3JrcyBwcm9wZXJseSBhY3Jvc3MgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucwotICAgICAqIG9mIHRoZSBtYXAgaW50ZXJmYWNlLjxwPgotICAgICAqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBmaXJzdCBjaGVja3MgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgdGhpcyBtYXA7Ci0gICAgICogaWYgc28gaXQgcmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+LiAgVGhlbiwgaXQgY2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBvYmplY3QgaXMgYSBtYXAgd2hvc2Ugc2l6ZSBpcyBpZGVudGljYWwgdG8gdGhlIHNpemUgb2YgdGhpcyBzZXQ7IGlmCi0gICAgICogbm90LCBpdCBpdCByZXR1cm5zIDx0dD5mYWxzZTwvdHQ+LiAgSWYgc28sIGl0IGl0ZXJhdGVzIG92ZXIgdGhpcyBtYXAncwotICAgICAqIDx0dD5lbnRyeVNldDwvdHQ+IGNvbGxlY3Rpb24sIGFuZCBjaGVja3MgdGhhdCB0aGUgc3BlY2lmaWVkIG1hcAotICAgICAqIGNvbnRhaW5zIGVhY2ggbWFwcGluZyB0aGF0IHRoaXMgbWFwIGNvbnRhaW5zLiAgSWYgdGhlIHNwZWNpZmllZCBtYXAKLSAgICAgKiBmYWlscyB0byBjb250YWluIHN1Y2ggYSBtYXBwaW5nLCA8dHQ+ZmFsc2U8L3R0PiBpcyByZXR1cm5lZC4gIElmIHRoZQotICAgICAqIGl0ZXJhdGlvbiBjb21wbGV0ZXMsIDx0dD50cnVlPC90dD4gaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyBtYXAuCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyA9PSB0aGlzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1hcCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIE1hcCB0ID0gKE1hcCkgbzsKLSAgICAgICAgaWYgKHQuc2l6ZSgpICE9IHNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEVudHJ5IGUgPSAoRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlLmdldEtleSgpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoISh0LmdldChrZXkpID09IG51bGwgJiYgdC5jb250YWluc0tleShrZXkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmVxdWFscyh0LmdldChrZXkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiB1bnVzZWQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gdW51c2VkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgbWFwLiAgVGhlIGhhc2ggY29kZSBvZiBhIG1hcCBpcwotICAgICAqIGRlZmluZWQgdG8gYmUgdGhlIHN1bSBvZiB0aGUgaGFzaCBjb2RlcyBvZiBlYWNoIGVudHJ5IGluIHRoZSBtYXAncwotICAgICAqIDx0dD5lbnRyeVNldCgpPC90dD4gdmlldy4gIFRoaXMgZW5zdXJlcyB0aGF0IDx0dD50MS5lcXVhbHModDIpPC90dD4KLSAgICAgKiBpbXBsaWVzIHRoYXQgPHR0PnQxLmhhc2hDb2RlKCk9PXQyLmhhc2hDb2RlKCk8L3R0PiBmb3IgYW55IHR3byBtYXBzCi0gICAgICogPHR0PnQxPC90dD4gYW5kIDx0dD50MjwvdHQ+LCBhcyByZXF1aXJlZCBieSB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZgotICAgICAqIE9iamVjdC5oYXNoQ29kZS48cD4KLSAgICAgKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciA8dHQ+ZW50cnlTZXQoKTwvdHQ+LCBjYWxsaW5nCi0gICAgICogPHR0Pmhhc2hDb2RlPC90dD4gb24gZWFjaCBlbGVtZW50IChlbnRyeSkgaW4gdGhlIENvbGxlY3Rpb24sIGFuZCBhZGRpbmcKLSAgICAgKiB1cCB0aGUgcmVzdWx0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtYXAuCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwLkVudHJ5I2hhc2hDb2RlKCkKLSAgICAgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0gICAgICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLSAgICAgKiBAc2VlIFNldCNlcXVhbHMoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCBoID0gMDsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgaCArPSBpLm5leHQoKS5oYXNoQ29kZSgpOwotICAgICAgICByZXR1cm4gaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWFwLiAgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgotICAgICAqIGNvbnNpc3RzIG9mIGEgbGlzdCBvZiBrZXktdmFsdWUgbWFwcGluZ3MgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZQotICAgICAqIG1hcCdzIDx0dD5lbnRyeVNldDwvdHQ+IHZpZXcncyBpdGVyYXRvciwgZW5jbG9zZWQgaW4gYnJhY2VzCi0gICAgICogKDx0dD4ie30iPC90dD4pLiAgQWRqYWNlbnQgbWFwcGluZ3MgYXJlIHNlcGFyYXRlZCBieSB0aGUgY2hhcmFjdGVycwotICAgICAqIDx0dD4iLCAiPC90dD4gKGNvbW1hIGFuZCBzcGFjZSkuICBFYWNoIGtleS12YWx1ZSBtYXBwaW5nIGlzIHJlbmRlcmVkIGFzCi0gICAgICogdGhlIGtleSBmb2xsb3dlZCBieSBhbiBlcXVhbHMgc2lnbiAoPHR0PiI9IjwvdHQ+KSBmb2xsb3dlZCBieSB0aGUKLSAgICAgKiBhc3NvY2lhdGVkIHZhbHVlLiAgS2V5cyBhbmQgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhcyBieQotICAgICAqIDx0dD5TdHJpbmcudmFsdWVPZihPYmplY3QpPC90dD4uPHA+Ci0gICAgICoKLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgYW4gZW1wdHkgc3RyaW5nIGJ1ZmZlciwgYXBwZW5kcyBhIGxlZnQKLSAgICAgKiBicmFjZSwgYW5kIGl0ZXJhdGVzIG92ZXIgdGhlIG1hcCdzIDx0dD5lbnRyeVNldDwvdHQ+IHZpZXcsIGFwcGVuZGluZwotICAgICAqIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZWFjaCA8dHQ+bWFwLmVudHJ5PC90dD4gaW4gdHVybi4gIEFmdGVyCi0gICAgICogYXBwZW5kaW5nIGVhY2ggZW50cnkgZXhjZXB0IHRoZSBsYXN0LCB0aGUgc3RyaW5nIDx0dD4iLCAiPC90dD4gaXMKLSAgICAgKiBhcHBlbmRlZC4gIEZpbmFsbHkgYSByaWdodCBicmFjZSBpcyBhcHBlbmRlZC4gIEEgc3RyaW5nIGlzIG9idGFpbmVkCi0gICAgICogZnJvbSB0aGUgc3RyaW5nYnVmZmVyLCBhbmQgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoInsiKTsKLQotICAgICAgICBJdGVyYXRvciBpID0gZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICBib29sZWFuIGhhc05leHQgPSBpLmhhc05leHQoKTsKLSAgICAgICAgd2hpbGUgKGhhc05leHQpIHsKLSAgICAgICAgICAgIEVudHJ5IGUgPSAoRW50cnkpIChpLm5leHQoKSk7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoCi0gICAgICAgICAgICAgICAgKGtleSA9PSB0aGlzID8gIih0aGlzIE1hcCkiIDoga2V5KQotICAgICAgICAgICAgICAgICAgICArICI9IgotICAgICAgICAgICAgICAgICAgICArICh2YWx1ZSA9PSB0aGlzID8gIih0aGlzIE1hcCkiIDogdmFsdWUpKTsKLQotICAgICAgICAgICAgaGFzTmV4dCA9IGkuaGFzTmV4dCgpOwotICAgICAgICAgICAgaWYgKGhhc05leHQpCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhpcyA8dHQ+TWFwQmFzZTwvdHQ+IGluc3RhbmNlOiB0aGUga2V5cwotICAgICAqIGFuZCB2YWx1ZXMgdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcEJhc2UgcmVzdWx0ID0gKE1hcEJhc2UpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIHJlc3VsdC5rZXlTZXQgPSBudWxsOwotICAgICAgICByZXN1bHQudmFsdWVzID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNob3VsZCBiZSBtYWRlIHB1YmxpYyBhcyBzb29uIGFzIHBvc3NpYmxlLiAgSXQgZ3JlYXRlbHkgc2ltcGxpZmllcwotICAgICAqIHRoZSB0YXNrIG9mIGltcGxlbWVudGluZyBNYXAuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFNpbXBsZUVudHJ5IGltcGxlbWVudHMgRW50cnkgewotICAgICAgICBPYmplY3Qga2V5OwotICAgICAgICBPYmplY3QgdmFsdWU7Ci0KLSAgICAgICAgcHVibGljIFNpbXBsZUVudHJ5KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2ltcGxlRW50cnkoTWFwLkVudHJ5IGUpIHsKLSAgICAgICAgICAgIHRoaXMua2V5ID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBlLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIHJldHVybiBrZXk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgbzsKLSAgICAgICAgICAgIHJldHVybiBlcShrZXksIGUuZ2V0S2V5KCkpICYmIGVxKHZhbHVlLCBlLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIE9iamVjdCB2OwotICAgICAgICAgICAgcmV0dXJuICgoa2V5ID09IG51bGwpID8gMCA6IGtleS5oYXNoQ29kZSgpKQotICAgICAgICAgICAgICAgIF4gKCh2YWx1ZSA9PSBudWxsKSA/IDAgOiB2YWx1ZS5oYXNoQ29kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4ga2V5ICsgIj0iICsgdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvVG9vbEJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9Ub29sQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDExYzg1Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9Ub29sQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOwotCi0vKioKLSAqIEEgYmFzZSBjbGFzcyBmb3IgY29tbWFuZC1saW5lIHRvb2xzLgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9vbEJhc2UgewotCi0gICAgcHVibGljIFRvb2xCYXNlKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBwcm9ncmFtKSB7Ci0gICAgICAgIHRoaXMub3V0ID0gb3V0OwotICAgICAgICB0aGlzLnByb2dyYW0gPSBwcm9ncmFtOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeShnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSk7Ci0gICAgICAgIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBydW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBpZiAoIXBhcnNlQXJndW1lbnRzKGFyZ3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVuKCk7Ci0gICAgICAgICAgICByZXR1cm4gd2FzU3VjY2Vzc2Z1bCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBMb2NhbGl6YWJsZSkgewotICAgICAgICAgICAgICAgIHJlcG9ydCgoTG9jYWxpemFibGUpIGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBvcnQoZ2V0TWVzc2FnZShnZXRHZW5lcmljRXJyb3JNZXNzYWdlKCksIGUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRTdGFja1RyYWNlKGUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gd2FzU3VjY2Vzc2Z1bCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcGFyc2VBcmd1bWVudHMoU3RyaW5nW10gYXJncyk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICBwdWJsaWMgdm9pZCBydW5Qcm9jZXNzb3JBY3Rpb25zKCkge30KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEdlbmVyaWNFcnJvck1lc3NhZ2UoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpOwotCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIFByaW50U3RyZWFtIG91dHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgb3V0IGluc3RhbmNlb2YgUHJpbnRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgID8gKFByaW50U3RyZWFtKSBvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFByaW50U3RyZWFtKG91dCwgdHJ1ZSk7Ci0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKG91dHN0cmVhbSk7Ci0gICAgICAgIG91dHN0cmVhbS5mbHVzaCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlcG9ydChTdHJpbmcgbXNnKSB7Ci0gICAgICAgIFByaW50U3RyZWFtIG91dHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgb3V0IGluc3RhbmNlb2YgUHJpbnRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgID8gKFByaW50U3RyZWFtKSBvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFByaW50U3RyZWFtKG91dCwgdHJ1ZSk7Ci0gICAgICAgIG91dHN0cmVhbS5wcmludGxuKG1zZyk7Ci0gICAgICAgIG91dHN0cmVhbS5mbHVzaCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlcG9ydChMb2NhbGl6YWJsZSBtc2cpIHsKLSAgICAgICAgcmVwb3J0KGxvY2FsaXplci5sb2NhbGl6ZShtc2cpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYWxpemFibGUgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgKE9iamVjdFtdKSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYWxpemFibGUgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSwgbmV3IE9iamVjdFtdIHsgYXJnIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhbGl6YWJsZSBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikgewotICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXksIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2FsaXphYmxlIGdldE1lc3NhZ2UoCi0gICAgICAgIFN0cmluZyBrZXksCi0gICAgICAgIFN0cmluZyBhcmcxLAotICAgICAgICBTdHJpbmcgYXJnMiwKLSAgICAgICAgU3RyaW5nIGFyZzMpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAga2V5LAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2FsaXphYmxlIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxpemFibGUgbG9jYWxpemFibGUpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5LCBuZXcgT2JqZWN0W10geyBsb2NhbGl6YWJsZSB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYWxpemFibGUgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSwgYXJncyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm9ncmFtOwotICAgIHByb3RlY3RlZCBMb2NhbGl6ZXIgbG9jYWxpemVyOwotICAgIHByb3RlY3RlZCBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5OwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9XU0RMUGFyc2VFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC9XU0RMUGFyc2VFeGNlcHRpb24uamF2YQppbmRleCAwNTlmNzQ2Li4yY2M4YzkyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvV1NETFBhcnNlRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL1dTRExQYXJzZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDcgKzI2LDYgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5leGNlcHRpb24uSkFYV1NFeGNlcHRpb25CYXNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOwogCiAvKioKICAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KQEAgLTQxLDcgKzQwLDcgQEAKICAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMudXRpbCI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL1dTVG9vbHNPYmplY3RGYWN0b3J5SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL1dTVG9vbHNPYmplY3RGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDQyYzhiYzQ1Li43ZjNmZjhlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwvV1NUb29sc09iamVjdEZhY3RvcnlJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL1dTVG9vbHNPYmplY3RGYWN0b3J5SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDcgKzI1LDEwIEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbDsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Muc3BpLldTVG9vbHNPYmplY3RGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkNvbXBpbGVUb29sOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLldzZ2VuVG9vbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5Xc2ltcG9ydFRvb2w7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Db250YWluZXI7CisKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIAogLyoqCkBAIC0zNiwxNCArMzksMTQgQEAKIHB1YmxpYyBjbGFzcyBXU1Rvb2xzT2JqZWN0RmFjdG9yeUltcGwgZXh0ZW5kcyBXU1Rvb2xzT2JqZWN0RmFjdG9yeSB7CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB3c2ltcG9ydChPdXRwdXRTdHJlYW0gbG9nU3RyZWFtLCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIENvbXBpbGVUb29sIHRvb2wgPSBuZXcgQ29tcGlsZVRvb2wobG9nU3RyZWFtLCAid3NpbXBvcnQiKTsKKyAgICBwdWJsaWMgYm9vbGVhbiB3c2ltcG9ydChPdXRwdXRTdHJlYW0gbG9nU3RyZWFtLCBDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFdzaW1wb3J0VG9vbCB0b29sID0gbmV3IFdzaW1wb3J0VG9vbChsb2dTdHJlYW0sIGNvbnRhaW5lcik7CiAgICAgICAgIHJldHVybiB0b29sLnJ1bihhcmdzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB3c2dlbihPdXRwdXRTdHJlYW0gbG9nU3RyZWFtLCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIENvbXBpbGVUb29sIHRvb2wgPSBuZXcgQ29tcGlsZVRvb2wobG9nU3RyZWFtLCAid3NnZW4iKTsKKyAgICBwdWJsaWMgYm9vbGVhbiB3c2dlbihPdXRwdXRTdHJlYW0gbG9nU3RyZWFtLCBDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFdzZ2VuVG9vbCB0b29sID0gbmV3IFdzZ2VuVG9vbChsb2dTdHJlYW0sIGNvbnRhaW5lcik7CiAgICAgICAgIHJldHVybiB0b29sLnJ1bihhcmdzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwveG1sL05vZGVMaXN0SXRlcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC94bWwvTm9kZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Y1MDRlLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC94bWwvTm9kZUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWwueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0gICAgcHJvdGVjdGVkIE5vZGVMaXN0IF9saXN0OwotICAgIHByb3RlY3RlZCBpbnQgX2luZGV4OwotCi0gICAgcHVibGljIE5vZGVMaXN0SXRlcmF0b3IoTm9kZUxpc3QgbGlzdCkgewotICAgICAgICBfbGlzdCA9IGxpc3Q7Ci0gICAgICAgIF9pbmRleCA9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgaWYgKF9saXN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBfaW5kZXggPCBfbGlzdC5nZXRMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChfbGlzdC5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IF9saXN0Lml0ZW0oX2luZGV4KTsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgICAgKytfaW5kZXg7Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwveG1sL051bGxFbnRpdHlSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL3htbC9OdWxsRW50aXR5UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3OGU2NC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwveG1sL051bGxFbnRpdHlSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnV0aWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIE51bGxFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyIHsKLQotICAgIHB1YmxpYyBOdWxsRW50aXR5UmVzb2x2ZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLSAgICAgICAgLy8gYWx3YXlzIHJlc29sdmUgdG8gYW4gZW1wdHkgZG9jdW1lbnQKLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKCIiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL3htbC9QcmV0dHlQcmludGluZ1htbFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL3htbC9QcmV0dHlQcmludGluZ1htbFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTI4ODc2Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdXRpbC94bWwvUHJldHR5UHJpbnRpbmdYbWxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuQ0RBVEE7Ci0KLS8vICMjIERlbGF5IElPRXhjZXB0aW9ucyB1bnRpbCBmbHVzaCBvciBjbG9zZQotLy8gIyMgTmVlZCBET00sIFNBWCBvdXRwdXQKLQotLyoqCi0gKiBBIHdyaXRlciBvZiBYTUwgb3V0cHV0IHN0cmVhbXMuCi0gKgotICogPHA+IEFuIFhNTCB3cml0ZXIga25vd3MgaGFyZGx5IGFueXRoaW5nIGFib3V0IFhNTCBkb2N1bWVudCB3ZWxsLWZvcm1lZG5lc3MsCi0gKiB0byBzYXkgbm90aGluZyBvZiB2YWxpZGl0eS4gIEl0IHJlbGllcyB1cG9uIHRoZSBpbnZva2VyIHRvIGVuc3VyZSB0aGF0IHRoZQotICogZ2VuZXJhdGVkIGRvY3VtZW50IGlzIHdlbGwtZm9ybWVkIGFuZCwgaWYgcmVxdWlyZWQsIHZhbGlkLgotICoKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJldHR5UHJpbnRpbmdYbWxXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBzaG91bGRQcmV0dHlwcmludCA9IHRydWU7Ci0KLSAgICBwcml2YXRlIEJ1ZmZlcmVkV3JpdGVyIG91dDsKLQotICAgIHByaXZhdGUgUHJldHR5UHJpbnRpbmdYbWxXcml0ZXIoT3V0cHV0U3RyZWFtV3JpdGVyIHcsIGJvb2xlYW4gZGVjbGFyZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gWFhYLU5PVEUgLSBzZXQgdGhlIGJ1ZmZlciBzaXplIHRvIDEwMjQgaGVyZQotICAgICAgICB0aGlzLm91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcih3LCAxMDI0KTsKLSAgICAgICAgU3RyaW5nIGVuYyA9IHcuZ2V0RW5jb2RpbmcoKTsKLQotICAgICAgICAvKiBXb3JrIGFyb3VuZCBib2d1cyBjYW5vbmljYWwgZW5jb2RpbmcgbmFtZXMgKi8KLSAgICAgICAgaWYgKGVuYy5lcXVhbHMoIlVURjgiKSkKLSAgICAgICAgICAgIGVuYyA9ICJVVEYtOCI7Ci0gICAgICAgIGVsc2UgaWYgKGVuYy5lcXVhbHMoIkFTQ0lJIikpCi0gICAgICAgICAgICBlbmMgPSAiVVMtQVNDSUkiOwotCi0gICAgICAgIGlmIChkZWNsYXJlKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBlbmMgKyAiXCI/PiIpOwotICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKLSAgICAgICAgICAgIG5lZWROZXdsaW5lID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgd3JpdGVyIHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgZ2l2ZW4gYnl0ZS1vdXRwdXQgc3RyZWFtCi0gICAgICogdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nLiAgQW4gaW5pdGlhbCBYTUwgZGVjbGFyYXRpb24gd2lsbCBvcHRpb25hbGx5IGJlCi0gICAgICogd3JpdHRlbiB0byB0aGUgc3RyZWFtLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBvdXQKLSAgICAgKiAgICAgICAgIFRoZSB0YXJnZXQgYnl0ZS1vdXRwdXQgc3RyZWFtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIGVuYwotICAgICAqICAgICAgICAgVGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIGRlY2xhcmUKLSAgICAgKiAgICAgICAgIElmIDx0dD50cnVlPC90dD4sIHdyaXRlIHRoZSBYTUwgZGVjbGFyYXRpb24gdG8gdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqCi0gICAgICogQHRocm93cyAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZSBuYW1lZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIFByZXR0eVByaW50aW5nWG1sV3JpdGVyKAotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICBTdHJpbmcgZW5jLAotICAgICAgICBib29sZWFuIGRlY2xhcmUpCi0gICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIGVuYyksIGRlY2xhcmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgd3JpdGVyIHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgZ2l2ZW4gYnl0ZS1vdXRwdXQgc3RyZWFtCi0gICAgICogdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nLiAgQW4gaW5pdGlhbCBYTUwgZGVjbGFyYXRpb24gd2lsbCBiZSB3cml0dGVuIHRvCi0gICAgICogdGhlIHN0cmVhbS4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgb3V0Ci0gICAgICogICAgICAgICBUaGUgdGFyZ2V0IGJ5dGUtb3V0cHV0IHN0cmVhbQotICAgICAqCi0gICAgICogQHBhcmFtICBlbmMKLSAgICAgKiAgICAgICAgIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZAotICAgICAqCi0gICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIG5hbWVkIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJldHR5UHJpbnRpbmdYbWxXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGVuYykKLSAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgZW5jKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3cml0ZXIgdGhhdCB3aWxsIHdyaXRlIHRvIHRoZSBnaXZlbiBieXRlLW91dHB1dCBzdHJlYW0KLSAgICAgKiB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuICBBbiBpbml0aWFsIFhNTCBkZWNsYXJhdGlvbiB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAgICAgKiB0aGUgc3RyZWFtLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBvdXQKLSAgICAgKiAgICAgICAgIFRoZSB0YXJnZXQgYnl0ZS1vdXRwdXQgc3RyZWFtCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJldHR5UHJpbnRpbmdYbWxXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURi04IiksIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2hhciBxdW90ZUNoYXIgPSAnIic7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBxdW90ZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBieSB0aGlzIHdyaXRlciB3aGVuIHdyaXRpbmcKLSAgICAgKiBhdHRyaWJ1dGUgdmFsdWVzLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBxdW90ZSAgVGhlIG5ldyBxdW90ZSBjaGFyYWN0ZXIsIGVpdGhlciBhCi0gICAgICogICAgICAgICAgICAgICAgPHNtYWxsPlFVT1RBVElPTiBNQVJLPC9zbWFsbD4gKDx0dD4nJiM5Mjt1MDAyMic8L3R0PiksCi0gICAgICogICAgICAgICAgICAgICAgb3IgYW4gPHNtYWxsPkFQT1NUUk9QSEUtUVVPVEU8L3NtYWxsPgotICAgICAqICAgICAgICAgICAgICAgICg8dHQ+JyYjOTI7dTAwMjcnPC90dD4pCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiB0aGUgYXJndW1lbnQgaXMgbmVpdGhlciBvZiB0aGUgYWJvdmUgY2hhcmFjdGVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFF1b3RlKGNoYXIgcXVvdGUpIHsKLSAgICAgICAgaWYgKHF1b3RlICE9ICciJyAmJiBxdW90ZSAhPSAnXCcnKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiSWxsZWdhbCBxdW90ZSBjaGFyYWN0ZXI6ICIgKyBxdW90ZSk7Ci0gICAgICAgIHF1b3RlQ2hhciA9IHF1b3RlOwotICAgIH0KLQotICAgIC8vIFF1b3RlIGEgY2hhcmFjdGVyCi0gICAgcHJpdmF0ZSB2b2lkIHF1b3RlKGNoYXIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICcmJyA6Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCImYW1wOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnPCcgOgotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiJmx0OyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnPicgOgotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiJmd0OyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUXVvdGUgYSBjaGFyYWN0ZXIgaW4gYW4gYXR0cmlidXRlIHZhbHVlCi0gICAgcHJpdmF0ZSB2b2lkIGFxdW90ZShjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgICAgY2FzZSAnXCcnIDoKLSAgICAgICAgICAgICAgICBpZiAocXVvdGVDaGFyID09IGMpCi0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiJmFwb3M7Iik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICciJyA6Ci0gICAgICAgICAgICAgICAgaWYgKHF1b3RlQ2hhciA9PSBjKQotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIiZxdW90OyIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgcXVvdGUoYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwotICAgIHByaXZhdGUgdm9pZCBub25RdW90ZShjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC53cml0ZShjKTsKLSAgICB9Ci0KLSAgICAvLyBRdW90ZSBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlciBkYXRhCi0gICAgcHJpdmF0ZSB2b2lkIHF1b3RlKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIHF1b3RlKHMuY2hhckF0KGkpKTsKLSAgICB9Ci0KLSAgICAvKiBBbGxvd2luZyBzdXBwb3J0IGZvciBDREFUQSAqLwotICAgIHByaXZhdGUgdm9pZCBub25RdW90ZShTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICBub25RdW90ZShzLmNoYXJBdChpKSk7Ci0gICAgfQotCi0gICAgLy8gUXVvdGUgYSBzdHJpbmcgY29udGFpbmluZyBhbiBhdHRyaWJ1dGUgdmFsdWUKLSAgICBwcml2YXRlIHZvaWQgYXF1b3RlKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIGFxdW90ZShzLmNoYXJBdChpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluZGVudChpbnQgZGVwdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKLSAgICAgICAgICAgIG91dC53cml0ZSgiICAiKTsKLSAgICB9Ci0KLSAgICAvLyBGb3JtYXR0aW5nIHN0YXRlCi0gICAgcHJpdmF0ZSBpbnQgZGVwdGggPSAwOwotICAgIHByaXZhdGUgYm9vbGVhbiBpblN0YXJ0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG5lZWROZXdsaW5lID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHdyaXR0ZW5DaGFycyA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbkF0dHJpYnV0ZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbkF0dHJpYnV0ZVZhbHVlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBET0NUWVBFIGRlY2xhcmF0aW9uLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICByb290ICBUaGUgbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIGR0ZCAgIFRoZSBVUkkgb2YgdGhlIGRvY3VtZW50LXR5cGUgZGVmaW5pdGlvbgotICAgICAqCi0gICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9jdHlwZShTdHJpbmcgcm9vdCwgU3RyaW5nIGR0ZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNob3VsZFByZXR0eXByaW50ICYmIG5lZWROZXdsaW5lKQotICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKLSAgICAgICAgbmVlZE5ld2xpbmUgPSB0cnVlOwotICAgICAgICBvdXQud3JpdGUoIjwhRE9DVFlQRSAiICsgcm9vdCArICIgU1lTVEVNICIgKyBxdW90ZUNoYXIpOwotICAgICAgICBxdW90ZShkdGQpOwotICAgICAgICBvdXQud3JpdGUocXVvdGVDaGFyICsgIj4iKTsKLSAgICAgICAgaWYgKHNob3VsZFByZXR0eXByaW50KQotICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnQwKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5pc2hTdGFydCgpOwotICAgICAgICBpZiAoc2hvdWxkUHJldHR5cHJpbnQgJiYgIXdyaXR0ZW5DaGFycykgewotICAgICAgICAgICAgbmVlZE5ld2xpbmUgPSB0cnVlOwotICAgICAgICAgICAgaW5kZW50KGRlcHRoKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoJzwnKTsKLSAgICAgICAgb3V0LndyaXRlKG5hbWUpOwotICAgICAgICBpblN0YXJ0ID0gdHJ1ZTsKLSAgICAgICAgd3JpdHRlbkNoYXJzID0gZmFsc2U7Ci0gICAgICAgIGRlcHRoKys7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0MShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluaXNoU3RhcnQoKTsKLSAgICAgICAgaWYgKHNob3VsZFByZXR0eXByaW50ICYmICF3cml0dGVuQ2hhcnMpIHsKLSAgICAgICAgICAgIGlmIChuZWVkTmV3bGluZSkKLSAgICAgICAgICAgICAgICBvdXQubmV3TGluZSgpOwotICAgICAgICAgICAgbmVlZE5ld2xpbmUgPSB0cnVlOwotICAgICAgICAgICAgaW5kZW50KGRlcHRoKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoJzwnKTsKLSAgICAgICAgb3V0LndyaXRlKG5hbWUpOwotICAgICAgICBpblN0YXJ0ID0gdHJ1ZTsKLSAgICAgICAgd3JpdHRlbkNoYXJzID0gZmFsc2U7Ci0gICAgICAgIGRlcHRoKys7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmlzaFN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGluU3RhcnQpIHsKLSAgICAgICAgICAgIGlmIChpbkF0dHJpYnV0ZSkKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUocXVvdGVDaGFyKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgnPicpOwotICAgICAgICAgICAgaW5TdGFydCA9IGZhbHNlOwotICAgICAgICAgICAgaW5BdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGluQXR0cmlidXRlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN0YXJ0IHRhZyBmb3IgdGhlIG5hbWVkIGVsZW1lbnQuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIHRvIGJlIHVzZWQgaW4gdGhlIHN0YXJ0IHRhZwotICAgICAqCi0gICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0MShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgY3VycmVudCBlbGVtZW50LiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgYXR0cmlidXRlJ3MgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIGF0dHJpYnV0ZSdzIHZhbHVlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiB0aGUgcHJldmlvdXMgbWV0aG9kIGludm9rZWQgdXBvbiB0aGlzIG9iamVjdCB3YXMgbmVpdGhlcgotICAgICAqICAgICAgICAgIHtAbGluayAjc3RhcnQgc3RhcnR9IG5vciB7QGxpbmsgI2F0dHJpYnV0ZSBhdHRyaWJ1dGV9Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXR0cmlidXRlTmFtZShuYW1lKTsKLSAgICAgICAgYXR0cmlidXRlVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBhdHRyaWJ1dGUgKHVucXVvdGVkKSBmb3IgdGhlIGN1cnJlbnQgZWxlbWVudC4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIGF0dHJpYnV0ZSdzIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotICAgICAqCi0gICAgICogQHRocm93cyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIHByZXZpb3VzIG1ldGhvZCBpbnZva2VkIHVwb24gdGhpcyBvYmplY3Qgd2FzIG5laXRoZXIKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI3N0YXJ0IHN0YXJ0fSBub3Ige0BsaW5rICNhdHRyaWJ1dGUgYXR0cmlidXRlfQotICAgICAqCi0gICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlVW5xdW90ZWQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXR0cmlidXRlTmFtZShuYW1lKTsKLSAgICAgICAgYXR0cmlidXRlVmFsdWVVbnF1b3RlZCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIGN1cnJlbnQgZWxlbWVudC4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgcHJlZml4ICBUaGUgYXR0cmlidXRlJ3MgcHJlZml4Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBhdHRyaWJ1dGUncyBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgYXR0cmlidXRlJ3MgdmFsdWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBtZXRob2QgaW52b2tlZCB1cG9uIHRoaXMgb2JqZWN0IHdhcyBuZWl0aGVyCi0gICAgICogICAgICAgICAge0BsaW5rICNzdGFydCBzdGFydH0gbm9yIHtAbGluayAjYXR0cmlidXRlIGF0dHJpYnV0ZX0KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBhdHRyaWJ1dGVOYW1lKHByZWZpeCwgbmFtZSk7Ci0gICAgICAgIGF0dHJpYnV0ZVZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gYXR0cmlidXRlICh1bnF1b3RlZCkgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIHByZWZpeCAgVGhlIGF0dHJpYnV0ZSdzIHByZWZpeAotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgYXR0cmlidXRlJ3MgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIGF0dHJpYnV0ZSdzIHZhbHVlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiB0aGUgcHJldmlvdXMgbWV0aG9kIGludm9rZWQgdXBvbiB0aGlzIG9iamVjdCB3YXMgbmVpdGhlcgotICAgICAqICAgICAgICAgIHtAbGluayAjc3RhcnQgc3RhcnR9IG5vciB7QGxpbmsgI2F0dHJpYnV0ZSBhdHRyaWJ1dGV9Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVVbnF1b3RlZChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBhdHRyaWJ1dGVOYW1lKHByZWZpeCwgbmFtZSk7Ci0gICAgICAgIGF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgZWxlbWVudC4gIEFmdGVyIGludm9raW5nIHRoaXMKLSAgICAgKiBtZXRob2QsIGludm9rZSB0aGUge0BsaW5rICNhdHRyaWJ1dGVWYWx1ZSBhdHRyaWJ1dGVWYWx1ZX0gbWV0aG9kIHRvCi0gICAgICogd3JpdGUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSwgb3IgaW52b2tlIHRoZSB7QGxpbmsgI2F0dHJpYnV0ZVZhbHVlVG9rZW4KLSAgICAgKiBhdHRyaWJ1dGVWYWx1ZVRva2VufSBtZXRob2QgdG8gd3JpdGUgb25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIHZhbHVlCi0gICAgICogdG9rZW5zLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICAgbmFtZSAgVGhlIGF0dHJpYnV0ZSdzIG5hbWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBtZXRob2QgaW52b2tlZCB1cG9uIHRoaXMgb2JqZWN0IHdhcyBuZWl0aGVyCi0gICAgICogICAgICAgICAge0BsaW5rICNzdGFydCBzdGFydH0gbm9yIHtAbGluayAjYXR0cmlidXRlIGF0dHJpYnV0ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIWluU3RhcnQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChpbkF0dHJpYnV0ZSkgewotICAgICAgICAgICAgb3V0LndyaXRlKHF1b3RlQ2hhcik7Ci0gICAgICAgICAgICBpbkF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaW5BdHRyaWJ1dGVWYWx1ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZSgnICcpOwotICAgICAgICBvdXQud3JpdGUobmFtZSk7Ci0gICAgICAgIG91dC53cml0ZSgnPScpOwotICAgICAgICBvdXQud3JpdGUocXVvdGVDaGFyKTsKLSAgICAgICAgaW5BdHRyaWJ1dGUgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgZWxlbWVudC4gIEFmdGVyIGludm9raW5nIHRoaXMKLSAgICAgKiBtZXRob2QsIGludm9rZSB0aGUge0BsaW5rICNhdHRyaWJ1dGVWYWx1ZSBhdHRyaWJ1dGVWYWx1ZX0gbWV0aG9kIHRvCi0gICAgICogd3JpdGUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSwgb3IgaW52b2tlIHRoZSB7QGxpbmsgI2F0dHJpYnV0ZVZhbHVlVG9rZW4KLSAgICAgKiBhdHRyaWJ1dGVWYWx1ZVRva2VufSBtZXRob2QgdG8gd3JpdGUgb25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIHZhbHVlCi0gICAgICogdG9rZW5zLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICAgcHJlZml4IFRoZSBhdHRyaWJ1dGUncyBwcmVmaXgKLSAgICAgKiBAcGFyYW0gICBuYW1lICBUaGUgYXR0cmlidXRlJ3MgbmFtZQotICAgICAqCi0gICAgICogQHRocm93cyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIHByZXZpb3VzIG1ldGhvZCBpbnZva2VkIHVwb24gdGhpcyBvYmplY3Qgd2FzIG5laXRoZXIKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI3N0YXJ0IHN0YXJ0fSBub3Ige0BsaW5rICNhdHRyaWJ1dGUgYXR0cmlidXRlfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZU5hbWUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaW5TdGFydCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgaWYgKGluQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUocXVvdGVDaGFyKTsKLSAgICAgICAgICAgIGluQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBpbkF0dHJpYnV0ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKCcgJyk7Ci0gICAgICAgIG91dC53cml0ZShwcmVmaXgpOwotICAgICAgICBvdXQud3JpdGUoJzonKTsKLSAgICAgICAgb3V0LndyaXRlKG5hbWUpOwotICAgICAgICBvdXQud3JpdGUoJz0nKTsKLSAgICAgICAgb3V0LndyaXRlKHF1b3RlQ2hhcik7Ci0gICAgICAgIGluQXR0cmlidXRlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgYXR0cmlidXRlLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICAgdmFsdWUgIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotICAgICAqCi0gICAgICogQHRocm93cyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIHByZXZpb3VzIG1ldGhvZCBpbnZva2VkIHVwb24gdGhpcyBvYmplY3Qgd2FzIG5vdAotICAgICAqICAgICAgICAgIHtAbGluayAjYXR0cmlidXRlTmFtZSBhdHRyaWJ1dGVOYW1lfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpbkF0dHJpYnV0ZSB8fCBpbkF0dHJpYnV0ZVZhbHVlKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBhcXVvdGUodmFsdWUpOwotICAgICAgICBvdXQud3JpdGUocXVvdGVDaGFyKTsKLSAgICAgICAgaW5BdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSB2YWx1ZSAodW5xdW90ZWQpIGZvciB0aGUgY3VycmVudCBhdHRyaWJ1dGUuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gICB2YWx1ZSAgVGhlIGF0dHJpYnV0ZSdzIHZhbHVlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiB0aGUgcHJldmlvdXMgbWV0aG9kIGludm9rZWQgdXBvbiB0aGlzIG9iamVjdCB3YXMgbm90Ci0gICAgICogICAgICAgICAge0BsaW5rICNhdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZU5hbWV9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlVmFsdWVVbnF1b3RlZChTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaW5BdHRyaWJ1dGUgfHwgaW5BdHRyaWJ1dGVWYWx1ZSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgb3V0LndyaXRlKHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSk7Ci0gICAgICAgIG91dC53cml0ZShxdW90ZUNoYXIpOwotICAgICAgICBpbkF0dHJpYnV0ZSA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBvbmUgdG9rZW4gb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlJ3MgdmFsdWUuICBBZGphY2VudCB0b2tlbnMgd2lsbAotICAgICAqIGJlIHNlcGFyYXRlZCBieSBzaW5nbGUgc3BhY2UgY2hhcmFjdGVycy4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgIHRva2VuICBUaGUgdG9rZW4gdG8gYmUgd3JpdHRlbgotICAgICAqCi0gICAgICogQHRocm93cyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIHByZXZpb3VzIG1ldGhvZCBpbnZva2VkIHVwb24gdGhpcyBvYmplY3Qgd2FzIG5laXRoZXIKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI2F0dHJpYnV0ZU5hbWUgYXR0cmlidXRlTmFtZX0gbm9yCi0gICAgICogICAgICAgICAge0BsaW5rICNhdHRyaWJ1dGVWYWx1ZVRva2VuIGF0dHJpYnV0ZVZhbHVlVG9rZW59Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlVmFsdWVUb2tlbihTdHJpbmcgdG9rZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaW5BdHRyaWJ1dGUpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChpbkF0dHJpYnV0ZVZhbHVlKQotICAgICAgICAgICAgb3V0LndyaXRlKCcgJyk7Ci0gICAgICAgIGFxdW90ZSh0b2tlbik7Ci0gICAgICAgIGluQXR0cmlidXRlVmFsdWUgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBlbmQgdGFnIGZvciB0aGUgbmFtZWQgZWxlbWVudC4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgdG8gYmUgdXNlZCBpbiB0aGUgZW5kIHRhZwotICAgICAqCi0gICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoaW5TdGFydCkgewotICAgICAgICAgICAgaWYgKGluQXR0cmlidXRlKQotICAgICAgICAgICAgICAgIG91dC53cml0ZShxdW90ZUNoYXIpOwotICAgICAgICAgICAgb3V0LndyaXRlKCIvPiIpOwotICAgICAgICAgICAgaW5TdGFydCA9IGZhbHNlOwotICAgICAgICAgICAgaW5BdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGluQXR0cmlidXRlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPC8iKTsKLSAgICAgICAgICAgIG91dC53cml0ZShuYW1lKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgnPicpOwotICAgICAgICB9Ci0gICAgICAgIGRlcHRoLS07Ci0gICAgICAgIHdyaXR0ZW5DaGFycyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBzb21lIGNoYXJhY3RlciBkYXRhLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBjaGFycyAgVGhlIGNoYXJhY3RlciBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYXJzKFN0cmluZyBjaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluaXNoU3RhcnQoKTsKLSAgICAgICAgcXVvdGUoY2hhcnMpOwotICAgICAgICB3cml0dGVuQ2hhcnMgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYXJzKENEQVRBIGNoYXJzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5pc2hTdGFydCgpOwotICAgICAgICBub25RdW90ZShjaGFycy5nZXRUZXh0KCkpOwotICAgICAgICB3cml0dGVuQ2hhcnMgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBzb21lIGNoYXJhY3RlciBkYXRhLCBza2lwcGluZyBxdW90aW5nLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBjaGFycyAgVGhlIGNoYXJhY3RlciBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYXJzVW5xdW90ZWQoU3RyaW5nIGNoYXJzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5pc2hTdGFydCgpOwotICAgICAgICBvdXQud3JpdGUoY2hhcnMsIDAsIGNoYXJzLmxlbmd0aCgpKTsKLSAgICAgICAgd3JpdHRlbkNoYXJzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgc29tZSBjaGFyYWN0ZXIgZGF0YSwgc2tpcHBpbmcgcXVvdGluZy4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgYnVmICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gIG9mZiAgICBUaGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gIGxlbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYXJzVW5xdW90ZWQoY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluaXNoU3RhcnQoKTsKLSAgICAgICAgb3V0LndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgICB3cml0dGVuQ2hhcnMgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGxlYWYgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY29udGVudC4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lICBhbWUgdG8gYmUgdXNlZCBpbiB0aGUgc3RhcnQgYW5kIGVuZCB0YWdzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hhcnMgIGNoYXJhY3RlciBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgICAgKgotICAgICAqIDxwPiBUaGlzIG1ldGhvZCB3cml0ZXMgYSBzdGFydCB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgZm9sbG93ZWQgYnkgdGhlCi0gICAgICogZ2l2ZW4gY2hhcmFjdGVyIGRhdGEsIGZvbGxvd2VkIGJ5IGFuIGVuZCB0YWcuICBJZiB0aGUgPHR0PmNoYXJzPC90dD4KLSAgICAgKiBwYXJhbWV0ZXIgaXMgPHR0Pm51bGw8L3R0PiBvciB0aGUgZW1wdHkgc3RyaW5nIHRoZW4gYW4gZW1wdHkgdGFnIGlzCi0gICAgICogd3JpdHRlbi4gIDwvcD4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxlYWYoU3RyaW5nIG5hbWUsIFN0cmluZyBjaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3RhcnQxKG5hbWUpOwotICAgICAgICBpZiAoKGNoYXJzICE9IG51bGwpICYmIChjaGFycy5sZW5ndGgoKSAhPSAwKSkKLSAgICAgICAgICAgIGNoYXJzKGNoYXJzKTsKLSAgICAgICAgZW5kKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlubGluZUxlYWYoU3RyaW5nIG5hbWUsIFN0cmluZyBjaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3RhcnQwKG5hbWUpOwotICAgICAgICBpZiAoKGNoYXJzICE9IG51bGwpICYmIChjaGFycy5sZW5ndGgoKSAhPSAwKSkKLSAgICAgICAgICAgIGNoYXJzKGNoYXJzKTsKLSAgICAgICAgZW5kKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBlbXB0eSBsZWFmIGVsZW1lbnQuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgbmFtZSB0byBiZSB1c2VkIGluIHRoZSBlbXB0eS1lbGVtZW50IHRhZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxlYWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxlYWYobmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5saW5lTGVhZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW5saW5lTGVhZihuYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGbHVzaGVzIHRoZSB3cml0ZXIuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkZXB0aCAhPSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm9uemVybyBkZXB0aCIpOwotICAgICAgICAvLyBpZiAoc2hvdWxkUHJldHR5cHJpbnQpCi0gICAgICAgIG91dC5uZXdMaW5lKCk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZsdXNoZXMgdGhlIHdyaXRlciBhbmQgY2xvc2VzIHRoZSB1bmRlcmx5aW5nIGJ5dGUtb3V0cHV0IHN0cmVhbS4gIDwvcD4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmx1c2goKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL3htbC9YbWxVdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwveG1sL1htbFV0aWwuamF2YQppbmRleCBiMWU0MGU3Li5jNGQ0YWUwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwveG1sL1htbFV0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwveG1sL1htbFV0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMiArMjUsOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWw7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbC5CeXRlSW5wdXRTdHJlYW07CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLldTRExQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5OYW1lZE5vZGVNYXBJdGVyYXRvcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5Ob2RlTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiAKIC8qKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwveG1sL1htbFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy91dGlsL3htbC9YbWxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0NmYwNC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3V0aWwveG1sL1htbFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5DREFUQTsKLQotLy8gIyMgRGVsYXkgSU9FeGNlcHRpb25zIHVudGlsIGZsdXNoIG9yIGNsb3NlCi0vLyAjIyBOZWVkIERPTSwgU0FYIG91dHB1dAotCi0vKioKLSAqIEEgd3JpdGVyIG9mIFhNTCBvdXRwdXQgc3RyZWFtcy4KLSAqCi0gKiA8cD4gQW4gWE1MIHdyaXRlciBrbm93cyBoYXJkbHkgYW55dGhpbmcgYWJvdXQgWE1MIGRvY3VtZW50IHdlbGwtZm9ybWVkbmVzcywKLSAqIHRvIHNheSBub3RoaW5nIG9mIHZhbGlkaXR5LiAgSXQgcmVsaWVzIHVwb24gdGhlIGludm9rZXIgdG8gZW5zdXJlIHRoYXQgdGhlCi0gKiBnZW5lcmF0ZWQgZG9jdW1lbnQgaXMgd2VsbC1mb3JtZWQgYW5kLCBpZiByZXF1aXJlZCwgdmFsaWQuCi0gKgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi0KLXB1YmxpYyBjbGFzcyBYbWxXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBzaG91bGRQcmV0dHlwcmludCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBCdWZmZXJlZFdyaXRlciBvdXQ7Ci0KLSAgICBwcml2YXRlIFhtbFdyaXRlcihPdXRwdXRTdHJlYW1Xcml0ZXIgdywgYm9vbGVhbiBkZWNsYXJlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBYWFgtTk9URSAtIHNldCB0aGUgYnVmZmVyIHNpemUgdG8gMTAyNCBoZXJlCi0gICAgICAgIHRoaXMub3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKHcsIDEwMjQpOwotICAgICAgICBTdHJpbmcgZW5jID0gdy5nZXRFbmNvZGluZygpOwotCi0gICAgICAgIC8qIFdvcmsgYXJvdW5kIGJvZ3VzIGNhbm9uaWNhbCBlbmNvZGluZyBuYW1lcyAqLwotICAgICAgICBpZiAoZW5jLmVxdWFscygiVVRGOCIpKQotICAgICAgICAgICAgZW5jID0gIlVURi04IjsKLSAgICAgICAgZWxzZSBpZiAoZW5jLmVxdWFscygiQVNDSUkiKSkKLSAgICAgICAgICAgIGVuYyA9ICJVUy1BU0NJSSI7Ci0KLSAgICAgICAgaWYgKGRlY2xhcmUpIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGVuYyArICJcIj8+Iik7Ci0gICAgICAgICAgICBvdXQubmV3TGluZSgpOwotICAgICAgICAgICAgbmVlZE5ld2xpbmUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3cml0ZXIgdGhhdCB3aWxsIHdyaXRlIHRvIHRoZSBnaXZlbiBieXRlLW91dHB1dCBzdHJlYW0KLSAgICAgKiB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcuICBBbiBpbml0aWFsIFhNTCBkZWNsYXJhdGlvbiB3aWxsIG9wdGlvbmFsbHkgYmUKLSAgICAgKiB3cml0dGVuIHRvIHRoZSBzdHJlYW0uICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIG91dAotICAgICAqICAgICAgICAgVGhlIHRhcmdldCBieXRlLW91dHB1dCBzdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSAgZW5jCi0gICAgICogICAgICAgICBUaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSAgZGVjbGFyZQotICAgICAqICAgICAgICAgSWYgPHR0PnRydWU8L3R0Piwgd3JpdGUgdGhlIFhNTCBkZWNsYXJhdGlvbiB0byB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqCi0gICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIG5hbWVkIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBlbmMsIGJvb2xlYW4gZGVjbGFyZSkKLSAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgZW5jKSwgZGVjbGFyZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3cml0ZXIgdGhhdCB3aWxsIHdyaXRlIHRvIHRoZSBnaXZlbiBieXRlLW91dHB1dCBzdHJlYW0KLSAgICAgKiB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcuICBBbiBpbml0aWFsIFhNTCBkZWNsYXJhdGlvbiB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAgICAgKiB0aGUgc3RyZWFtLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBvdXQKLSAgICAgKiAgICAgICAgIFRoZSB0YXJnZXQgYnl0ZS1vdXRwdXQgc3RyZWFtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIGVuYwotICAgICAqICAgICAgICAgVGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiB0aGUgbmFtZWQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBYbWxXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGVuYykKLSAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgZW5jKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB3cml0ZXIgdGhhdCB3aWxsIHdyaXRlIHRvIHRoZSBnaXZlbiBieXRlLW91dHB1dCBzdHJlYW0KLSAgICAgKiB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuICBBbiBpbml0aWFsIFhNTCBkZWNsYXJhdGlvbiB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAgICAgKiB0aGUgc3RyZWFtLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBvdXQKLSAgICAgKiAgICAgICAgIFRoZSB0YXJnZXQgYnl0ZS1vdXRwdXQgc3RyZWFtCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJVVEYtOCIpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNoYXIgcXVvdGVDaGFyID0gJyInOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcXVvdGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgYnkgdGhpcyB3cml0ZXIgd2hlbiB3cml0aW5nCi0gICAgICogYXR0cmlidXRlIHZhbHVlcy4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgcXVvdGUgIFRoZSBuZXcgcXVvdGUgY2hhcmFjdGVyLCBlaXRoZXIgYQotICAgICAqICAgICAgICAgICAgICAgIDxzbWFsbD5RVU9UQVRJT04gTUFSSzwvc21hbGw+ICg8dHQ+JyYjOTI7dTAwMjInPC90dD4pLAotICAgICAqICAgICAgICAgICAgICAgIG9yIGFuIDxzbWFsbD5BUE9TVFJPUEhFLVFVT1RFPC9zbWFsbD4KLSAgICAgKiAgICAgICAgICAgICAgICAoPHR0PicmIzkyO3UwMDI3JzwvdHQ+KQotICAgICAqCi0gICAgICogQHRocm93cyAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIGFyZ3VtZW50IGlzIG5laXRoZXIgb2YgdGhlIGFib3ZlIGNoYXJhY3RlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRRdW90ZShjaGFyIHF1b3RlKSB7Ci0gICAgICAgIGlmIChxdW90ZSAhPSAnIicgJiYgcXVvdGUgIT0gJ1wnJykKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIklsbGVnYWwgcXVvdGUgY2hhcmFjdGVyOiAiICsgcXVvdGUpOwotICAgICAgICBxdW90ZUNoYXIgPSBxdW90ZTsKLSAgICB9Ci0KLSAgICAvLyBRdW90ZSBhIGNoYXJhY3RlcgotICAgIHByaXZhdGUgdm9pZCBxdW90ZShjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgICAgY2FzZSAnJicgOgotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiJmFtcDsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJzwnIDoKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIiZsdDsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJz4nIDoKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIiZndDsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIG91dC53cml0ZShjKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgcHJpdmF0ZSB2b2lkIG5vblF1b3RlKGNoYXIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKGMpOwotICAgIH0KLQotICAgIC8vIFF1b3RlIGEgY2hhcmFjdGVyIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZQotICAgIHByaXZhdGUgdm9pZCBhcXVvdGUoY2hhciBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJ1wnJyA6Ci0gICAgICAgICAgICAgICAgaWYgKHF1b3RlQ2hhciA9PSBjKQotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIiZhcG9zOyIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnIicgOgotICAgICAgICAgICAgICAgIGlmIChxdW90ZUNoYXIgPT0gYykKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCImcXVvdDsiKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHF1b3RlKGMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUXVvdGUgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXIgZGF0YQotICAgIHByaXZhdGUgdm9pZCBxdW90ZShTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICBxdW90ZShzLmNoYXJBdChpKSk7Ci0gICAgfQotCi0gICAgLyogQWxsb3dpbmcgc3VwcG9ydCBmb3IgQ0RBVEEgKi8KLSAgICBwcml2YXRlIHZvaWQgbm9uUXVvdGUoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgbm9uUXVvdGUocy5jaGFyQXQoaSkpOwotICAgIH0KLQotICAgIC8vIFF1b3RlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW4gYXR0cmlidXRlIHZhbHVlCi0gICAgcHJpdmF0ZSB2b2lkIGFxdW90ZShTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICBhcXVvdGUocy5jaGFyQXQoaSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbmRlbnQoaW50IGRlcHRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspCi0gICAgICAgICAgICBvdXQud3JpdGUoIiAgIik7Ci0gICAgfQotCi0gICAgLy8gRm9ybWF0dGluZyBzdGF0ZQotICAgIHByaXZhdGUgaW50IGRlcHRoID0gMDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5TdGFydCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkTmV3bGluZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB3cml0dGVuQ2hhcnMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5BdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5BdHRyaWJ1dGVWYWx1ZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgRE9DVFlQRSBkZWNsYXJhdGlvbi4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgcm9vdCAgVGhlIG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtICBkdGQgICBUaGUgVVJJIG9mIHRoZSBkb2N1bWVudC10eXBlIGRlZmluaXRpb24KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvY3R5cGUoU3RyaW5nIHJvb3QsIFN0cmluZyBkdGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzaG91bGRQcmV0dHlwcmludCAmJiBuZWVkTmV3bGluZSkKLSAgICAgICAgICAgIG91dC5uZXdMaW5lKCk7Ci0gICAgICAgIG5lZWROZXdsaW5lID0gdHJ1ZTsKLSAgICAgICAgb3V0LndyaXRlKCI8IURPQ1RZUEUgIiArIHJvb3QgKyAiIFNZU1RFTSAiICsgcXVvdGVDaGFyKTsKLSAgICAgICAgcXVvdGUoZHRkKTsKLSAgICAgICAgb3V0LndyaXRlKHF1b3RlQ2hhciArICI+Iik7Ci0gICAgICAgIGlmIChzaG91bGRQcmV0dHlwcmludCkKLSAgICAgICAgICAgIG91dC5uZXdMaW5lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0MChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluaXNoU3RhcnQoKTsKLSAgICAgICAgaWYgKHNob3VsZFByZXR0eXByaW50ICYmICF3cml0dGVuQ2hhcnMpIHsKLSAgICAgICAgICAgIG5lZWROZXdsaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgIGluZGVudChkZXB0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKCc8Jyk7Ci0gICAgICAgIG91dC53cml0ZShuYW1lKTsKLSAgICAgICAgaW5TdGFydCA9IHRydWU7Ci0gICAgICAgIHdyaXR0ZW5DaGFycyA9IGZhbHNlOwotICAgICAgICBkZXB0aCsrOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydDEoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmlzaFN0YXJ0KCk7Ci0gICAgICAgIGlmIChzaG91bGRQcmV0dHlwcmludCAmJiAhd3JpdHRlbkNoYXJzKSB7Ci0gICAgICAgICAgICBpZiAobmVlZE5ld2xpbmUpCi0gICAgICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKLSAgICAgICAgICAgIG5lZWROZXdsaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgIGluZGVudChkZXB0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKCc8Jyk7Ci0gICAgICAgIG91dC53cml0ZShuYW1lKTsKLSAgICAgICAgaW5TdGFydCA9IHRydWU7Ci0gICAgICAgIHdyaXR0ZW5DaGFycyA9IGZhbHNlOwotICAgICAgICBkZXB0aCsrOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaW5pc2hTdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpblN0YXJ0KSB7Ci0gICAgICAgICAgICBpZiAoaW5BdHRyaWJ1dGUpCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHF1b3RlQ2hhcik7Ci0gICAgICAgICAgICBvdXQud3JpdGUoJz4nKTsKLSAgICAgICAgICAgIGluU3RhcnQgPSBmYWxzZTsKLSAgICAgICAgICAgIGluQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBpbkF0dHJpYnV0ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzdGFydCB0YWcgZm9yIHRoZSBuYW1lZCBlbGVtZW50LiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSB0byBiZSB1c2VkIGluIHRoZSBzdGFydCB0YWcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdGFydDEobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIGN1cnJlbnQgZWxlbWVudC4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIGF0dHJpYnV0ZSdzIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotICAgICAqCi0gICAgICogQHRocm93cyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIHByZXZpb3VzIG1ldGhvZCBpbnZva2VkIHVwb24gdGhpcyBvYmplY3Qgd2FzIG5laXRoZXIKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI3N0YXJ0IHN0YXJ0fSBub3Ige0BsaW5rICNhdHRyaWJ1dGUgYXR0cmlidXRlfQotICAgICAqCi0gICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0gICAgICAgIGF0dHJpYnV0ZVZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gYXR0cmlidXRlICh1bnF1b3RlZCkgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBhdHRyaWJ1dGUncyBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgYXR0cmlidXRlJ3MgdmFsdWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBtZXRob2QgaW52b2tlZCB1cG9uIHRoaXMgb2JqZWN0IHdhcyBuZWl0aGVyCi0gICAgICogICAgICAgICAge0BsaW5rICNzdGFydCBzdGFydH0gbm9yIHtAbGluayAjYXR0cmlidXRlIGF0dHJpYnV0ZX0KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVVucXVvdGVkKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0gICAgICAgIGF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIHByZWZpeCAgVGhlIGF0dHJpYnV0ZSdzIHByZWZpeAotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICBUaGUgYXR0cmlidXRlJ3MgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIGF0dHJpYnV0ZSdzIHZhbHVlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiB0aGUgcHJldmlvdXMgbWV0aG9kIGludm9rZWQgdXBvbiB0aGlzIG9iamVjdCB3YXMgbmVpdGhlcgotICAgICAqICAgICAgICAgIHtAbGluayAjc3RhcnQgc3RhcnR9IG5vciB7QGxpbmsgI2F0dHJpYnV0ZSBhdHRyaWJ1dGV9Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXR0cmlidXRlTmFtZShwcmVmaXgsIG5hbWUpOwotICAgICAgICBhdHRyaWJ1dGVWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIGF0dHJpYnV0ZSAodW5xdW90ZWQpIGZvciB0aGUgY3VycmVudCBlbGVtZW50LiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBwcmVmaXggIFRoZSBhdHRyaWJ1dGUncyBwcmVmaXgKLSAgICAgKgotICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIGF0dHJpYnV0ZSdzIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotICAgICAqCi0gICAgICogQHRocm93cyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIHByZXZpb3VzIG1ldGhvZCBpbnZva2VkIHVwb24gdGhpcyBvYmplY3Qgd2FzIG5laXRoZXIKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI3N0YXJ0IHN0YXJ0fSBub3Ige0BsaW5rICNhdHRyaWJ1dGUgYXR0cmlidXRlfQotICAgICAqCi0gICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlVW5xdW90ZWQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXR0cmlidXRlTmFtZShwcmVmaXgsIG5hbWUpOwotICAgICAgICBhdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQuICBBZnRlciBpbnZva2luZyB0aGlzCi0gICAgICogbWV0aG9kLCBpbnZva2UgdGhlIHtAbGluayAjYXR0cmlidXRlVmFsdWUgYXR0cmlidXRlVmFsdWV9IG1ldGhvZCB0bwotICAgICAqIHdyaXRlIHRoZSBhdHRyaWJ1dGUgdmFsdWUsIG9yIGludm9rZSB0aGUge0BsaW5rICNhdHRyaWJ1dGVWYWx1ZVRva2VuCi0gICAgICogYXR0cmlidXRlVmFsdWVUb2tlbn0gbWV0aG9kIHRvIHdyaXRlIG9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCB2YWx1ZQotICAgICAqIHRva2Vucy4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgIG5hbWUgIFRoZSBhdHRyaWJ1dGUncyBuYW1lCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiB0aGUgcHJldmlvdXMgbWV0aG9kIGludm9rZWQgdXBvbiB0aGlzIG9iamVjdCB3YXMgbmVpdGhlcgotICAgICAqICAgICAgICAgIHtAbGluayAjc3RhcnQgc3RhcnR9IG5vciB7QGxpbmsgI2F0dHJpYnV0ZSBhdHRyaWJ1dGV9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpblN0YXJ0KQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBpZiAoaW5BdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgIG91dC53cml0ZShxdW90ZUNoYXIpOwotICAgICAgICAgICAgaW5BdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGluQXR0cmlidXRlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoJyAnKTsKLSAgICAgICAgb3V0LndyaXRlKG5hbWUpOwotICAgICAgICBvdXQud3JpdGUoJz0nKTsKLSAgICAgICAgb3V0LndyaXRlKHF1b3RlQ2hhcik7Ci0gICAgICAgIGluQXR0cmlidXRlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQuICBBZnRlciBpbnZva2luZyB0aGlzCi0gICAgICogbWV0aG9kLCBpbnZva2UgdGhlIHtAbGluayAjYXR0cmlidXRlVmFsdWUgYXR0cmlidXRlVmFsdWV9IG1ldGhvZCB0bwotICAgICAqIHdyaXRlIHRoZSBhdHRyaWJ1dGUgdmFsdWUsIG9yIGludm9rZSB0aGUge0BsaW5rICNhdHRyaWJ1dGVWYWx1ZVRva2VuCi0gICAgICogYXR0cmlidXRlVmFsdWVUb2tlbn0gbWV0aG9kIHRvIHdyaXRlIG9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCB2YWx1ZQotICAgICAqIHRva2Vucy4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgIHByZWZpeCBUaGUgYXR0cmlidXRlJ3MgcHJlZml4Ci0gICAgICogQHBhcmFtICAgbmFtZSAgVGhlIGF0dHJpYnV0ZSdzIG5hbWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBtZXRob2QgaW52b2tlZCB1cG9uIHRoaXMgb2JqZWN0IHdhcyBuZWl0aGVyCi0gICAgICogICAgICAgICAge0BsaW5rICNzdGFydCBzdGFydH0gbm9yIHtAbGluayAjYXR0cmlidXRlIGF0dHJpYnV0ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVOYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIWluU3RhcnQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChpbkF0dHJpYnV0ZSkgewotICAgICAgICAgICAgb3V0LndyaXRlKHF1b3RlQ2hhcik7Ci0gICAgICAgICAgICBpbkF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaW5BdHRyaWJ1dGVWYWx1ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZSgnICcpOwotICAgICAgICBvdXQud3JpdGUocHJlZml4KTsKLSAgICAgICAgb3V0LndyaXRlKCc6Jyk7Ci0gICAgICAgIG91dC53cml0ZShuYW1lKTsKLSAgICAgICAgb3V0LndyaXRlKCc9Jyk7Ci0gICAgICAgIG91dC53cml0ZShxdW90ZUNoYXIpOwotICAgICAgICBpbkF0dHJpYnV0ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGF0dHJpYnV0ZS4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgIHZhbHVlICBUaGUgYXR0cmlidXRlJ3MgdmFsdWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBtZXRob2QgaW52b2tlZCB1cG9uIHRoaXMgb2JqZWN0IHdhcyBub3QKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI2F0dHJpYnV0ZU5hbWUgYXR0cmlidXRlTmFtZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVWYWx1ZShTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaW5BdHRyaWJ1dGUgfHwgaW5BdHRyaWJ1dGVWYWx1ZSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgYXF1b3RlKHZhbHVlKTsKLSAgICAgICAgb3V0LndyaXRlKHF1b3RlQ2hhcik7Ci0gICAgICAgIGluQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgdmFsdWUgKHVucXVvdGVkKSBmb3IgdGhlIGN1cnJlbnQgYXR0cmlidXRlLiAgPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICAgdmFsdWUgIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotICAgICAqCi0gICAgICogQHRocm93cyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlIHByZXZpb3VzIG1ldGhvZCBpbnZva2VkIHVwb24gdGhpcyBvYmplY3Qgd2FzIG5vdAotICAgICAqICAgICAgICAgIHtAbGluayAjYXR0cmlidXRlTmFtZSBhdHRyaWJ1dGVOYW1lfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIWluQXR0cmlidXRlIHx8IGluQXR0cmlidXRlVmFsdWUpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIG91dC53cml0ZSh2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKCkpOwotICAgICAgICBvdXQud3JpdGUocXVvdGVDaGFyKTsKLSAgICAgICAgaW5BdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgb25lIHRva2VuIG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSdzIHZhbHVlLiAgQWRqYWNlbnQgdG9rZW5zIHdpbGwKLSAgICAgKiBiZSBzZXBhcmF0ZWQgYnkgc2luZ2xlIHNwYWNlIGNoYXJhY3RlcnMuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gICB0b2tlbiAgVGhlIHRva2VuIHRvIGJlIHdyaXR0ZW4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBtZXRob2QgaW52b2tlZCB1cG9uIHRoaXMgb2JqZWN0IHdhcyBuZWl0aGVyCi0gICAgICogICAgICAgICAge0BsaW5rICNhdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZU5hbWV9IG5vcgotICAgICAqICAgICAgICAgIHtAbGluayAjYXR0cmlidXRlVmFsdWVUb2tlbiBhdHRyaWJ1dGVWYWx1ZVRva2VufQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVZhbHVlVG9rZW4oU3RyaW5nIHRva2VuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIWluQXR0cmlidXRlKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICBpZiAoaW5BdHRyaWJ1dGVWYWx1ZSkKLSAgICAgICAgICAgIG91dC53cml0ZSgnICcpOwotICAgICAgICBhcXVvdGUodG9rZW4pOwotICAgICAgICBpbkF0dHJpYnV0ZVZhbHVlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gZW5kIHRhZyBmb3IgdGhlIG5hbWVkIGVsZW1lbnQuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIHRvIGJlIHVzZWQgaW4gdGhlIGVuZCB0YWcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGluU3RhcnQpIHsKLSAgICAgICAgICAgIGlmIChpbkF0dHJpYnV0ZSkKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUocXVvdGVDaGFyKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiLz4iKTsKLSAgICAgICAgICAgIGluU3RhcnQgPSBmYWxzZTsKLSAgICAgICAgICAgIGluQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBpbkF0dHJpYnV0ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjwvIik7Ci0gICAgICAgICAgICBvdXQud3JpdGUobmFtZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoJz4nKTsKLSAgICAgICAgfQotICAgICAgICBkZXB0aC0tOwotICAgICAgICB3cml0dGVuQ2hhcnMgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgc29tZSBjaGFyYWN0ZXIgZGF0YS4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgY2hhcnMgIFRoZSBjaGFyYWN0ZXIgZGF0YSB0byBiZSB3cml0dGVuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFycyhTdHJpbmcgY2hhcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmlzaFN0YXJ0KCk7Ci0gICAgICAgIHF1b3RlKGNoYXJzKTsKLSAgICAgICAgd3JpdHRlbkNoYXJzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGFycyhDREFUQSBjaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluaXNoU3RhcnQoKTsKLSAgICAgICAgbm9uUXVvdGUoY2hhcnMuZ2V0VGV4dCgpKTsKLSAgICAgICAgd3JpdHRlbkNoYXJzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgc29tZSBjaGFyYWN0ZXIgZGF0YSwgc2tpcHBpbmcgcXVvdGluZy4gIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgY2hhcnMgIFRoZSBjaGFyYWN0ZXIgZGF0YSB0byBiZSB3cml0dGVuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFyc1VucXVvdGVkKFN0cmluZyBjaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluaXNoU3RhcnQoKTsKLSAgICAgICAgb3V0LndyaXRlKGNoYXJzLCAwLCBjaGFycy5sZW5ndGgoKSk7Ci0gICAgICAgIHdyaXR0ZW5DaGFycyA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHNvbWUgY2hhcmFjdGVyIGRhdGEsIHNraXBwaW5nIHF1b3RpbmcuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIGJ1ZiAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgZGF0YSB0byBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtICBvZmYgICAgVGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtICBsZW4gICAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFyc1VucXVvdGVkKGNoYXJbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmlzaFN0YXJ0KCk7Ci0gICAgICAgIG91dC53cml0ZShidWYsIG9mZiwgbGVuKTsKLSAgICAgICAgd3JpdHRlbkNoYXJzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBsZWFmIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGNvbnRlbnQuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIHRvIGJlIHVzZWQgaW4gdGhlIHN0YXJ0IGFuZCBlbmQgdGFncwotICAgICAqCi0gICAgICogQHBhcmFtICBjaGFycyAgVGhlIGNoYXJhY3RlciBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgICAgKgotICAgICAqIDxwPiBUaGlzIG1ldGhvZCB3cml0ZXMgYSBzdGFydCB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgZm9sbG93ZWQgYnkgdGhlCi0gICAgICogZ2l2ZW4gY2hhcmFjdGVyIGRhdGEsIGZvbGxvd2VkIGJ5IGFuIGVuZCB0YWcuICBJZiB0aGUgPHR0PmNoYXJzPC90dD4KLSAgICAgKiBwYXJhbWV0ZXIgaXMgPHR0Pm51bGw8L3R0PiBvciB0aGUgZW1wdHkgc3RyaW5nIHRoZW4gYW4gZW1wdHkgdGFnIGlzCi0gICAgICogd3JpdHRlbi4gIDwvcD4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxlYWYoU3RyaW5nIG5hbWUsIFN0cmluZyBjaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3RhcnQxKG5hbWUpOwotICAgICAgICBpZiAoKGNoYXJzICE9IG51bGwpICYmIChjaGFycy5sZW5ndGgoKSAhPSAwKSkKLSAgICAgICAgICAgIGNoYXJzKGNoYXJzKTsKLSAgICAgICAgZW5kKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlubGluZUxlYWYoU3RyaW5nIG5hbWUsIFN0cmluZyBjaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3RhcnQwKG5hbWUpOwotICAgICAgICBpZiAoKGNoYXJzICE9IG51bGwpICYmIChjaGFycy5sZW5ndGgoKSAhPSAwKSkKLSAgICAgICAgICAgIGNoYXJzKGNoYXJzKTsKLSAgICAgICAgZW5kKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBlbXB0eSBsZWFmIGVsZW1lbnQuICA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIHRvIGJlIHVzZWQgaW4gdGhlIGVtcHR5LWVsZW1lbnQgdGFnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGVhZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbGVhZihuYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbmxpbmVMZWFmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbmxpbmVMZWFmKG5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZsdXNoZXMgdGhlIHdyaXRlci4gIDwvcD4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRlcHRoICE9IDApCi0gICAgICAgICAgICAvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb256ZXJvIGRlcHRoIik7Ci0gICAgICAgICAgICAvLyBpZiAoc2hvdWxkUHJldHR5cHJpbnQpCi0gICAgICAgICAgICBvdXQubmV3TGluZSgpOwotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGbHVzaGVzIHRoZSB3cml0ZXIgYW5kIGNsb3NlcyB0aGUgdW5kZXJseWluZyBieXRlLW91dHB1dCBzdHJlYW0uICA8L3A+Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZsdXNoKCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3MvdmVyc2lvbi5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy92ZXJzaW9uLnByb3BlcnRpZXMKaW5kZXggYjI2OTgxMC4uMjdmMGY3MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy92ZXJzaW9uLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy92ZXJzaW9uLnByb3BlcnRpZXMKQEAgLTEsMyArMSwyOSBAQAotYnVpbGQtaWQ9YjA4Ci1idWlsZC12ZXJzaW9uPUpBWC1XUyBSSSAyLjBfMDItYjA4LWZjcwotbWFqb3ItdmVyc2lvbj0yLjBfMDIKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCitidWlsZC1pZD1KQVgtV1MgUkkgMi4xLjEKK2J1aWxkLXZlcnNpb249SkFYLVdTIFJJIDIuMS4xCittYWpvci12ZXJzaW9uPTIuMS4xCisgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9BYm9ydEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvQWJvcnRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBmODk2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvQWJvcnRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlOworCisvKioKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KKy8qKgorICogU2lnbmFscyB0aGUgYWJvcnRpb24gb2YgdGhlIGNvbXBpbGF0aW9uLgorICogPHA+CisgKiBUaGlzIGV4Y2VwdGlvbiBzaG91bGQgYmUgb25seSB0aHJvd24gZnJvbSB7QGxpbmsgRXJyb3JSZWNlaXZlcn0KKyAqIGZvciB0aGUgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpIChrb2hzdWtlLmthd2FndWNoaUBzdW4uY29tKQorICovCitwdWJsaWMgY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQWJvcnRFeGNlcHRpb24oKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvQWN0aW9uQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9BY3Rpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxZjZmNy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9BY3Rpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGlvbkNvbnN0YW50cyB7Ci0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VSVklDRV9JTlRFUkZBQ0VfR0VORVJBVE9SID0KLS8vICAgICAgICAic2VydmljZS5pbnRlcmZhY2UuZ2VuZXJhdG9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VSVklDRV9HRU5FUkFUT1IgPQotICAgICAgICAic2VydmljZS5nZW5lcmF0b3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRU1PVEVfSU5URVJGQUNFX0dFTkVSQVRPUiAgPQotICAgICAgICAicmVtb3RlLmludGVyZmFjZS5pbXBsLmdlbmVyYXRvciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFTU9URV9JTlRFUkZBQ0VfSU1QTF9HRU5FUkFUT1IgID0KLSAgICAgICAgInJlbW90ZS5pbnRlcmZhY2UuaW1wbC5nZW5lcmF0b3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9KQVhCX1RZUEVfR0VORVJBVE9SID0KLSAgICAgICAgImpheGIudHlwZS5nZW5lcmF0b3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DVVNUT01fRVhDRVBUSU9OX0dFTkVSQVRPUiA9Ci0gICAgICAgICJjdXN0b20uZXhjZXB0aW9uLmdlbmVyYXRvciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1dTRExfR0VORVJBVE9SID0KLSAgICAgICAgIndzZGwuZ2VuZXJhdG9yIjsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL0JhZENvbW1hbmRMaW5lRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9CYWRDb21tYW5kTGluZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODBlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9CYWRDb21tYW5kTGluZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGU7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworLyoqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgY2xhc3MgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICAgIHByaXZhdGUgT3B0aW9ucyBvcHRpb25zOworCisgICAgcHVibGljIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRPcHRpb25zKE9wdGlvbnMgb3B0KSB7CisgICAgICAgIGFzc2VydCB0aGlzLm9wdGlvbnM9PW51bGw7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwYXJ0bHkgcGFyc2VkIG9wdGlvbiBvYmplY3QsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlCisgICAgT3B0aW9ucyBnZXRPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9Db21waWxlVG9vbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvQ29tcGlsZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExMGU4NS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9Db21waWxlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY3ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5Qcm9jZXNzb3I7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuUHJvY2Vzc29yQWN0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3NvckNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5Qcm9jZXNzb3JOb3RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5Qcm9jZXNzb3JPcHRpb25zOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmNvbmZpZy5DbGFzc01vZGVsSW5mbzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcuV1NETE1vZGVsSW5mbzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5jb25maWcucGFyc2VyLlJlYWRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuQ3VzdG9tRXhjZXB0aW9uR2VuZXJhdG9yOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5TZWlHZW5lcmF0b3I7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci5hbm5vdGF0aW9uLkFubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbi5XZWJTZXJ2aWNlQVA7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5DbGllbnRQcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci51dGlsLkdlbmVyYXRlZEZpbGVJbmZvOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudEJhc2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5KQVhXU1V0aWxzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC5KYXZhQ29tcGlsZXJIZWxwZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLlRvb2xCYXNlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC5Gb3JrRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5Ub29sVmVyc2lvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlZlcnNpb25VdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuV1NETEdlbmVyYXRvcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZ0ltcGw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi0vKioKLSAqICAgIFRoaXMgaXMgdGhlIHJlYWwgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJvdGggV3NHZW4gYW5kIFdzSW1wb3J0LgotICoKLSAqICAgIDxQPklmIHRoZSBwcm9ncmFtIGJlaW5nIGV4ZWN1dGVkIGlzIFdzR2VuLCB0aGUgQ29tcGlsZVRvb2wgYWN0cyBhcyBhbgotICogICAge0BsaW5rIGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeX0KLSAqICAgIGFuZCB1c2VzIHtAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb24uV2ViU2VydmljZUFQCi0gKiAgICBXZWJTZXJ2aWNlQVB9IGFzIHRoZSB7QGxpbmsgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3IKLSAqICAgIEFubm90YXRpb25Qcm9jZXNzb3J9IGZvciB0aGUgQVBUIGZyYW1ld29yay4gIEluIHRoaXMgY2FzZSBBUFQgdGFrZXMgY29udHJvbAotICogICAgd2hpbGUgcHJvY2Vzc2luZyB0aGUgU0VJIHBhc3NlZCB0byBXc0dlbi4gIFRoZSBBUFQgZnJhbWV3b3JrIHRoZW4gaW52b2tlcyB0aGUKLSAqICAgIFdlYlNlcnZpY2VBUCB0byBwcm9jZXNzIGNsYXNzZXMgdGhhdCBjb250YWluIGphdmF4Lmp3cy4qIGFubm90YXRpb25zLgotICogICAgV3NHZW4gdXNlcyB0aGUgQVBUIHJlZmxlY3Rpb24gbGlicmFyeSB0byBwcm9jZXNzIHRoZSBTRUkgYW5kIHRvIGdlbmVyYXRlIGFueQotICogICAgSkFYLVdTIHNwZWMgbWFuZGF0ZWQgSmF2YSBiZWFucy4KLSAqCi0gKiAgICA8cD5JZiB0aGUgcHJvZ3JhbSBiZWluZyBleGVjdXRlZCBpcyBXc0ltcG9ydCwgdGhlIENvbXBpbGVUb29sIGNyZWF0ZXMgYQotICogICAge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3NvciAgUHJvY2Vzc29yfSB0byBoZWxwIHdpdGggdGhlCi0gKiAgICBwcm9jZXNzaW5nLiAgRmlyc3QgdGhlIHtAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5Qcm9jZXNzb3IjcnVuTW9kZWxlcigpCi0gKiAgICBQcm9jZXNzb3IucnVuTW9kZWxlcigpfSBtZXRob2QgaXMgY2FsbGVkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUKLSAqICAgIHtAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLndzZGwuV1NETE1vZGVsZXIgV1NETE1vZGVsZXJ9IHRvCi0gKiAgICBwcm9jZXNzIHRoZSBXU0RMIGJlaW5nIGltcG9ydGVkLCB3aGljaCBpbnRlcm4gcHJvY2Vzc2VzIHRoZSBXU0RMIGFuZCBjcmVhdGVzCi0gKiAgICBhIHtAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbC5Nb2RlbCBNb2RlbH0gdGhhdCBpcyByZXR1cm5lZCB0byB0aGUKLSAqICAgIFByb2Nlc3Nvci4gIFRoZSBDb21waWxlVG9vbCB0aGVuIHJlZ2lzdGVycyBhIG51bWJlciBvZgotICogICAge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3NvckFjdGlvbiBQcm9jZXNzb3JBY3Rpb25zfSB3aXRoIHRoZQotICogICAgUHJvY2Vzc29yLiAgU29tZSBvZiB0aGVzZSBQcm9jZXNzb3JBY3Rpb25zIGluY2x1ZGUKLSAqICAgIHRoZSB7QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLkN1c3RvbUV4Y2VwdGlvbkdlbmVyYXRvcgotICogICAgQ3VzdG9tRXhjZXB0aW9uR2VuZXJhdG9yfSB0byBnZW5lcmF0ZSBFeGNlcHRpb24gY2xhc3NlcywKLSAqICAgIHRoZSB7QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLkpBWEJUeXBlR2VuZXJhdG9yCi0gKiAgICBKQVhCVHlwZUdlbmVyYXRvcn0gdG8gZ2VuZXJhdGUgSkFYQiB0eXBlcywKLSAqICAgIHRoZSB7QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLlNlcnZpY2VHZW5lcmF0b3IKLSAqICAgIFNlcnZpY2VHZW5lcmF0b3J9IHRvIGdlbmVyYXRlIHRoZSBTZXJ2aWNlIGludGVyZmFjZSwgYW5kCi0gKiAgICB0aGUge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5TZWlHZW5lcmF0b3IKLSAqICAgIFJlbW90ZUludGVyZmFjZUdlbmVyYXRvcn0gdG8gZ2VuZXJhdGUgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotICogICAgVGhlIENvbXBpbGVUb29sIHRoZW4gaW52b2tlcyB0aGUge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLlByb2Nlc3NvciNydW5BY3Rpb25zKCkKLSAqICAgIFByb2Nlc3Nvci5ydW5BY3Rpb25zKCl9IG1ldGhvZCB0byBjYXVzZSB0aGVzZSBQcm9jZXNzb3JBY3Rpb25zIHRvIHJ1bi4KLSAqICAgIE9uY2UgdGhlIFByb2Nlc3NvckFjdGlvbnMgaGF2ZSBiZWVuIHJ1biwgdGhlIENvbXBpbGVUb29sIHdpbGwgaW52b2tlIGphdmFjCi0gKiAgICB0byBjb21waWxlIGFueSBjbGFzc2VzIGdlbmVyYXRlZCBieSB0aGUgIFByb2Nlc3NvckFjdGlvbnMuCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGlsZVRvb2wgZXh0ZW5kcyBUb29sQmFzZSBpbXBsZW1lbnRzIFByb2Nlc3Nvck5vdGlmaWNhdGlvbkxpc3RlbmVyLAotICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgQ29tcGlsZVRvb2woT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHByb2dyYW0pIHsKLSAgICAgICAgc3VwZXIob3V0LCBwcm9ncmFtKTsKLSAgICAgICAgbGlzdGVuZXIgPSB0aGlzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZyIpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGlsZXJEZWJ1ZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9IC8qZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1PIikpIHsKLSAgICAgICAgICAgICAgICBjb21waWxlck9wdGltaXplID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0qLyBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXZlcmJvc2UiKSkgewotICAgICAgICAgICAgICAgIHZlcmJvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWIiKSkgewotICAgICAgICAgICAgICAgIGlmKHByb2dyYW0uZXF1YWxzKFdTR0VOKSkgewotICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzY29tcGlsZS5pbnZhbGlkT3B0aW9uIiwgYXJnc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoaSArIDEpIDwgYXJncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzLmFkZChKQVhXU1V0aWxzLmFic29sdXRpemUoSkFYV1NVdGlscy5nZXRGaWxlT3JVUkxOYW1lKGZpbGUpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUubWlzc2luZ09wdGlvbkFyZ3VtZW50IiwgIi1iIikpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXZlcnNpb24iKSkgewotICAgICAgICAgICAgICAgIHJlcG9ydChUb29sVmVyc2lvbi5WRVJTSU9OLkJVSUxEX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIGRvTm90aGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCIta2VlcCIpKSB7Ci0gICAgICAgICAgICAgICAga2VlcEdlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoYXJnc1tpXS5lcXVhbHMoIi13c2RsbG9jYXRpb24iKSl7Ci0gICAgICAgICAgICAgICAgaWYocHJvZ3JhbS5lcXVhbHMoV1NHRU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmludmFsaWRPcHRpb24iLCBhcmdzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChpICsgMSkgPCBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldPW51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXT1udWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLm1pc3NpbmdPcHRpb25Bcmd1bWVudCIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZihhcmdzW2ldLmVxdWFscygiLXAiKSl7Ci0gICAgICAgICAgICAgICAgaWYocHJvZ3JhbS5lcXVhbHMoV1NHRU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmludmFsaWRPcHRpb24iLCBhcmdzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChpICsgMSkgPCBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldPW51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQYWNrYWdlID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldPW51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUubWlzc2luZ09wdGlvbkFyZ3VtZW50IiwgYXJnc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2UgaWYoYXJnc1tpXS5lcXVhbHMoIi1jYXRhbG9nIikpewotICAgICAgICAgICAgICAgIGlmKHByb2dyYW0uZXF1YWxzKFdTR0VOKSkgewotICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzY29tcGlsZS5pbnZhbGlkT3B0aW9uIiwgYXJnc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoaSArIDEpIDwgYXJncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXT1udWxsOwotICAgICAgICAgICAgICAgICAgICBjYXRhbG9nID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldPW51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUubWlzc2luZ09wdGlvbkFyZ3VtZW50IiwgYXJnc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKFNFUlZJQ0VOQU1FX09QVElPTikpIHsKLSAgICAgICAgICAgICAgICBpZihwcm9ncmFtLmVxdWFscyhXU0lNUE9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUuaW52YWxpZE9wdGlvbiIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGkgKyAxKSA8IGFyZ3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IFFOYW1lLnZhbHVlT2YoYXJnc1srK2ldKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgc2VydmljZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2dlbi5zZXJ2aWNlbmFtZS5taXNzaW5nLm5hbWVzcGFjZSIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpID09IG51bGwgfHwgc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2dlbi5zZXJ2aWNlbmFtZS5taXNzaW5nLmxvY2FsbmFtZSIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUubWlzc2luZ09wdGlvbkFyZ3VtZW50IiwgYXJnc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscyhQT1JUTkFNRV9PUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgaWYocHJvZ3JhbS5lcXVhbHMoV1NJTVBPUlQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmludmFsaWRPcHRpb24iLCBhcmdzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChpICsgMSkgPCBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUgPSBRTmFtZS52YWx1ZU9mKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0TmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8IHBvcnROYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3NnZW4ucG9ydG5hbWUubWlzc2luZy5uYW1lc3BhY2UiLCBhcmdzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0TmFtZS5nZXRMb2NhbFBhcnQoKSA9PSBudWxsIHx8IHBvcnROYW1lLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3NnZW4ucG9ydG5hbWUubWlzc2luZy5sb2NhbG5hbWUiLCBhcmdzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLm1pc3NpbmdPcHRpb25Bcmd1bWVudCIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1kIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGkgKyAxKSA8IGFyZ3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmR1cGxpY2F0ZU9wdGlvbiIsICItZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3REaXIgPSBuZXcgRmlsZShhcmdzWysraV0pOwotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXN0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzY29tcGlsZS5ub1N1Y2hEaXJlY3RvcnkiLCBkZXN0RGlyLmdldFBhdGgoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLm1pc3NpbmdPcHRpb25Bcmd1bWVudCIsICItZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1yIikpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZ3JhbS5lcXVhbHMoV1NJTVBPUlQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmludmFsaWRPcHRpb24iLCBhcmdzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChpICsgMSkgPCBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobm9uY2xhc3NEZXN0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmR1cGxpY2F0ZU9wdGlvbiIsICItciIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG5vbmNsYXNzRGVzdERpciA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW5vbmNsYXNzRGVzdERpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUubm9TdWNoRGlyZWN0b3J5Iiwgbm9uY2xhc3NEZXN0RGlyLmdldFBhdGgoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUubWlzc2luZ09wdGlvbkFyZ3VtZW50IiwgIi1yIikpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXMiKSkgewotICAgICAgICAgICAgICAgIGlmICgoaSArIDEpIDwgYXJncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZURpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzY29tcGlsZS5kdXBsaWNhdGVPcHRpb24iLCAiLXMiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2VEaXIgPSBuZXcgRmlsZShhcmdzWysraV0pOwotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLm5vU3VjaERpcmVjdG9yeSIsIHNvdXJjZURpci5nZXRQYXRoKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAga2VlcEdlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUubWlzc2luZ09wdGlvbkFyZ3VtZW50IiwgIi1zIikpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWNsYXNzcGF0aCIpIHx8IGFyZ3NbaV0uZXF1YWxzKCItY3AiKSkgewotICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLmVxdWFscyhXU0lNUE9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUuaW52YWxpZE9wdGlvbiIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGkgKyAxKSA8IGFyZ3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyQ2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmR1cGxpY2F0ZU9wdGlvbiIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHVzZXJDbGFzc3BhdGggPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLm1pc3NpbmdPcHRpb25Bcmd1bWVudCIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi1odHRwcHJveHk6IikpIHsKLSAgICAgICAgICAgICAgICBpZihwcm9ncmFtLmVxdWFscyhXU0dFTikpIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUuaW52YWxpZE9wdGlvbiIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhcmdzW2ldLnN1YnN0cmluZygxMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2NvbXBpbGUuaW52YWxpZE9wdGlvbiIsIGFyZ3NbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgicHJveHlTZXQiLCBUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJwcm94eUhvc3QiLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgicHJveHlQb3J0IiwgIjgwODAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInByb3h5U2V0IiwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgicHJveHlIb3N0IiwgdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgicHJveHlQb3J0IiwgdmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItd3NkbCIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2dyYW0uZXF1YWxzKFdTSU1QT1JUKSkgewotICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzY29tcGlsZS5pbnZhbGlkT3B0aW9uIiwgYXJnc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdlbldzZGwgPSB0cnVlOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGFyZ3NbaV0uc3Vic3RyaW5nKDUpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHZhbHVlLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IEhUVFA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IHZhbHVlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSB2YWx1ZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRQcm90b2NvbChwcm90b2NvbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3NnZW4uaW52YWxpZC5wcm90b2NvbCIsIHByb3RvY29sLCBWQUxJRF9QUk9UT0NPTFMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcm90b2NvbFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZFRyYW5zcG9ydCh0cmFuc3BvcnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzZ2VuLmludmFsaWQudHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBWQUxJRF9UUkFOU1BPUlRTKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZXh0ZW5zaW9uIikpIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItaGVscCIpKSB7Ci0gICAgICAgICAgICAgICAgaGVscCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1YZG9ub3RvdmVyd3JpdGUiKSkgewotICAgICAgICAgICAgICAgIGlmKHByb2dyYW0uZXF1YWxzKFdTSU1QT1JUKSkgewotICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzY29tcGlsZS5pbnZhbGlkT3B0aW9uIiwgYXJnc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRvTm90T3ZlcldyaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhcmdzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKLSAgICAgICAgICAgIGlmIChhcmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChhcmcuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmludmFsaWRPcHRpb24iLCBhcmcpKTsKLSAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dCBzb3VyY2UgY291bGQgYmUgYSBsb2NhbCBmaWxlIG9yIGEgVVJMLGdldCB0aGUKLSAgICAgICAgICAgICAgICAvLyBhYm9sdXRpemVkIFVSTCBzdHJpbmcKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBhcmc7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2dyYW0uZXF1YWxzKFdTR0VOKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRXU0dlbkNsYXNzKGZpbGVOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wdXRGaWxlcy5hZGQoZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlucHV0RmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UocHJvZ3JhbSsiLm1pc3NpbmdGaWxlIikpOwotICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4dGVuc2lvbnMgJiYgaGFzRXh0ZW5zaW9ucygpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIHB1dCBqYXh3cyBhbmQgamF4YiBiaW5kaW5nIGZpbGVzCi0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb2Nlc3Nvck9wdGlvbnMuQklORElOR19GSUxFUywgYmluZGluZ0ZpbGVzKTsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZUFyZ3VtZW50cygpKSB7Ci0gICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRXU0dlbkNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBnZXRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgewotICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2dlbi5jbGFzcy5ub3QuZm91bmQiLCBjbGFzc05hbWUpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xhenouaXNFbnVtKCkgfHwgY2xhenouaXNJbnRlcmZhY2UoKSB8fAotICAgICAgICAgICAgY2xhenouaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgb25FcnJvcihnZXRNZXNzYWdlKCJ3c2dlbi5jbGFzcy5tdXN0LmJlLmltcGxlbWVudGF0aW9uLmNsYXNzIiwgY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdlbldzZGwpIHsKLSAgICAgICAgICAgIEJpbmRpbmdJbXBsIGJpbmRpbmcgPSAoQmluZGluZ0ltcGwpQmluZGluZ0ltcGwuZ2V0QmluZGluZyhudWxsLCBjbGF6eiwgbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKSkgewotICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3NnZW4uY2Fubm90Lmdlbi53c2RsLmZvci5ub24uc29hcC5iaW5kaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y2xhc3NOYW1lLCBiaW5kaW5nLmdldEJpbmRpbmdJZCgpfSkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNPQVBCaW5kaW5nSW1wbCBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZ0ltcGwpYmluZGluZzsKLSAgICAgICAgICAgIGlmICgoc29hcEJpbmRpbmcuZ2V0QWN0dWFsQmluZGluZ0lkKCkuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICBzb2FwQmluZGluZy5nZXRBY3R1YWxCaW5kaW5nSWQoKS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpKSAmJgotICAgICAgICAgICAgICAgICAgICAhKHByb3RvY29sLmVxdWFscyhYX1NPQVAxMikgJiYgZXh0ZW5zaW9ucykpIHsKLSAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzZ2VuLmNhbm5vdC5nZW4ud3NkbC5mb3Iuc29hcDEyLmJpbmRpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjbGFzc05hbWUsIGJpbmRpbmcuZ2V0QmluZGluZ0lkKCl9KSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNvYXBCaW5kaW5nLmdldEFjdHVhbEJpbmRpbmdJZCgpLmVxdWFscyhTT0FQQmluZGluZ0ltcGwuWF9TT0FQMTJIVFRQX0JJTkRJTkcpICYmCi0gICAgICAgICAgICAgICAgIWV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzZ2VuLmNhbm5vdC5nZW4ud3NkbC5mb3IueHNvYXAxMi5iaW5kaW5nLndvLmV4dGVudGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NsYXNzTmFtZSwgYmluZGluZy5nZXRCaW5kaW5nSWQoKX0pKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVBcmd1bWVudHMoKSB7Ci0gICAgICAgIGlmICghZ2VuV3NkbCkgewotICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvbkVycm9yKGdldE1lc3NhZ2UoIndzZ2VuLndzZGwuYXJnLm5vLmdlbndzZGwiLCBTRVJWSUNFTkFNRV9PUFRJT04pKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9ydE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3NnZW4ud3NkbC5hcmcubm8uZ2Vud3NkbCIsIFBPUlROQU1FX09QVElPTikpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNFeHRlbnNpb25zKCkgewotICAgICAgICBpZiAocHJvdG9jb2wuZXF1YWxzSWdub3JlQ2FzZShYX1NPQVAxMikpIHsKLSAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3NnZW4uc29hcDEyLndpdGhvdXQuZXh0ZW5zaW9uIikpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzVmFsaWRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKLSAgICAgICAgcmV0dXJuIChwcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKFNPQVAxMSkgfHwKLSAgICAgICAgICAgICAgICBwcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKFhfU09BUDEyKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzVmFsaWRUcmFuc3BvcnQoU3RyaW5nIHRyYW5zcG9ydCkgewotICAgICAgICByZXR1cm4gKHRyYW5zcG9ydC5lcXVhbHNJZ25vcmVDYXNlKEhUVFApKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRvTm90aGluZykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiZWZvcmVIb29rKCk7Ci0gICAgICAgICAgICBpZihlbnRpdHlSZXNvbHZlciA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICBpZihjYXRhbG9nICE9IG51bGwgJiYgY2F0YWxvZy5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVudGl0eVJlc29sdmVyID0gWG1sVXRpbC5jcmVhdGVFbnRpdHlSZXNvbHZlcihKQVhXU1V0aWxzLmdldEZpbGVPclVSTChjYXRhbG9nKSk7Ci0gICAgICAgICAgICB9ZWxzZSBpZihjYXRhbG9nICE9IG51bGwgJiYgY2F0YWxvZy5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgIEVudGl0eVJlc29sdmVyIGVyID0gWG1sVXRpbC5jcmVhdGVFbnRpdHlSZXNvbHZlcihKQVhXU1V0aWxzLmdldEZpbGVPclVSTChjYXRhbG9nKSk7Ci0gICAgICAgICAgICAgICAgZW50aXR5UmVzb2x2ZXIgPSAgbmV3IEZvcmtFbnRpdHlSZXNvbHZlcihlciwgZW50aXR5UmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW52aXJvbm1lbnQgPSBjcmVhdGVFbnZpcm9ubWVudCgpOwotICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIHNldEVudmlyb25tZW50VmFsdWVzKGVudmlyb25tZW50KTsKLSAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldE1vZGVsSW5mbygpIGluc3RhbmNlb2YgQ2xhc3NNb2RlbEluZm8pIHsKLSAgICAgICAgICAgICAgICBidWlsZE1vZGVsKCgoQ2xhc3NNb2RlbEluZm8pIGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxJbmZvKCkpLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IFByb2Nlc3Nvcihjb25maWd1cmF0aW9uLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldE1vZGVsSW5mbygpLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldE1vZGVsSW5mbygpLnNldERlZmF1bHRKYXZhUGFja2FnZShkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc29yLnJ1bk1vZGVsZXIoKTsKLSAgICAgICAgICAgICAgICB3aXRoTW9kZWxIb29rKCk7Ci0gICAgICAgICAgICAgICAgcmVnaXN0ZXJQcm9jZXNzb3JBY3Rpb25zKHByb2Nlc3Nvcik7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc29yLnJ1bkFjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0RXJyb3JDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZUdlbmVyYXRlZENsYXNzZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZnRlckhvb2soKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICgha2VlcEdlbmVyYXRlZCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUdlbmVyYXRlZEZpbGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudmlyb25tZW50LnNodXRkb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFbnZpcm9ubWVudFZhbHVlcyhQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpIHsKLSAgICAgICAgaW50IGVudkZsYWdzID0gZW52LmdldEZsYWdzKCk7Ci0gICAgICAgIGVudkZsYWdzIHw9IFByb2Nlc3NvckVudmlyb25tZW50LkZfV0FSTklOR1M7Ci0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICBlbnZGbGFncyB8PSBQcm9jZXNzb3JFbnZpcm9ubWVudC5GX1ZFUkJPU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZW52LnNldEZsYWdzKGVudkZsYWdzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7Ci0gICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBhY3Rpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLFByb2Nlc3NvckFjdGlvbj4oKTsKLSAgICAgICAgYWN0aW9ucy5wdXQoQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9TRVJWSUNFX0dFTkVSQVRPUiwKLSAgICAgICAgICAgICAgICBuZXcgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLlNlcnZpY2VHZW5lcmF0b3IoKSk7Ci0gICAgICAgIGFjdGlvbnMucHV0KEFjdGlvbkNvbnN0YW50cy5BQ1RJT05fUkVNT1RFX0lOVEVSRkFDRV9HRU5FUkFUT1IsCi0gICAgICAgICAgICAgICAgbmV3IFNlaUdlbmVyYXRvcigpKTsKLSAgICAgICAgYWN0aW9ucy5wdXQoQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9DVVNUT01fRVhDRVBUSU9OX0dFTkVSQVRPUiwKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXhjZXB0aW9uR2VuZXJhdG9yKCkpOwotICAgICAgICBhY3Rpb25zLnB1dChBY3Rpb25Db25zdGFudHMuQUNUSU9OX0pBWEJfVFlQRV9HRU5FUkFUT1IsCi0gICAgICAgICAgICAgICAgbmV3IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5KQVhCVHlwZUdlbmVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVHZW5lcmF0ZWRGaWxlcygpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZGVsZXRlR2VuZXJhdGVkRmlsZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZE1vZGVsKFN0cmluZyBlbmRwb2ludCkgewotICAgICAgICBjb250ZXh0ID0gbmV3IEFubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0KCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBUCA9IG5ldyBXZWJTZXJ2aWNlQVAodGhpcywgZW52aXJvbm1lbnQsIHByb3BlcnRpZXMsIGNvbnRleHQpOwotCi0gICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBlbnZpcm9ubWVudC5nZXRDbGFzc1BhdGgoKTsKLQotICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1s4XTsKLSAgICAgICAgYXJnc1swXSA9ICItZCI7Ci0gICAgICAgIGFyZ3NbMV0gPSBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBhcmdzWzJdID0gIi1jbGFzc3BhdGgiOwotICAgICAgICBhcmdzWzNdID0gY2xhc3NwYXRoOwotICAgICAgICBhcmdzWzRdID0gIi1zIjsKLSAgICAgICAgYXJnc1s1XSA9IHNvdXJjZURpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgYXJnc1s2XSA9ICItWGNsYXNzZXNBc0RlY2xzIjsKLSAgICAgICAgYXJnc1s3XSA9IGVuZHBvaW50OwotCi0gICAgICAgIGludCByZXN1bHQgPSBjb20uc3VuLnRvb2xzLmFwdC5NYWluLnByb2Nlc3ModGhpcywgYXJncyk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gMCkgewotICAgICAgICAgICAgZW52aXJvbm1lbnQuZXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmNvbXBpbGF0aW9uRmFpbGVkIikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZW5Xc2RsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdG1wUGF0aCA9IGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkrRmlsZS5wYXRoU2VwYXJhdG9yK2NsYXNzcGF0aDsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKFByb2Nlc3NvckVudmlyb25tZW50QmFzZS5wYXRoVG9VUkxzKHRtcFBhdGgpLAotICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICBDbGFzczw/PiBlbmRwb2ludENsYXNzID0gbnVsbDsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludENsYXNzID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKGVuZHBvaW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgotICAgICAgICAgICAgICAgIGVudmlyb25tZW50LmVycm9yKGdldE1lc3NhZ2UoIndzZ2VuLmNsYXNzLm5vdC5mb3VuZCIsIGVuZHBvaW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lEID0gZ2V0QmluZGluZ0lEKHByb3RvY29sKTsKLSAgICAgICAgICAgIGlmICghcHJvdG9jb2xTZXQpIHsKLSAgICAgICAgICAgICAgICBCaW5kaW5nSW1wbCBiaW5kaW5nID0gKEJpbmRpbmdJbXBsKUJpbmRpbmdJbXBsLmdldEJpbmRpbmcobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludENsYXNzLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lEID0gYmluZGluZy5nZXRCaW5kaW5nSWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsZXIuUnVudGltZU1vZGVsZXIgcnRNb2RlbGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsZXIuUnVudGltZU1vZGVsZXIoZW5kcG9pbnRDbGFzcywgc2VydmljZU5hbWUsIGJpbmRpbmdJRCk7Ci0gICAgICAgICAgICBydE1vZGVsZXIuc2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgaWYgKHBvcnROYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcnRNb2RlbGVyLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLSAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlJ1bnRpbWVNb2RlbCBydE1vZGVsID0gcnRNb2RlbGVyLmJ1aWxkUnVudGltZU1vZGVsKCk7Ci0gICAgICAgICAgICBXU0RMR2VuZXJhdG9yIHdzZGxHZW5lcmF0b3IgPSBuZXcgV1NETEdlbmVyYXRvcihydE1vZGVsLAotICAgICAgICAgICAgICAgICAgICBuZXcgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuV1NETE91dHB1dFJlc29sdmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlc3VsdCBnZXRXU0RMT3V0cHV0KFN0cmluZyBzdWdnZXN0ZWRGaWxlbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgd3NkbEZpbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShub25jbGFzc0Rlc3REaXIsIHN1Z2dlc3RlZEZpbGVuYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZU91dHB1dFN0cmVhbSh3c2RsRmlsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0U3lzdGVtSWQod3NkbEZpbGUudG9TdHJpbmcoKS5yZXBsYWNlKCdcXCcsICcvJykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50LmVycm9yKGdldE1lc3NhZ2UoIndzZ2VuLmNvdWxkLm5vdC5jcmVhdGUuZmlsZSIsIHdzZGxGaWxlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZXN1bHQgZ2V0U2NoZW1hT3V0cHV0KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzdWdnZXN0ZWRGaWxlbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFdTRExPdXRwdXQoc3VnZ2VzdGVkRmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlc3VsdCBnZXRBYnN0cmFjdFdTRExPdXRwdXQoSG9sZGVyPFN0cmluZz4gZmlsZW5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V1NETE91dHB1dChmaWxlbmFtZS52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVzdWx0IGdldFNjaGVtYU91dHB1dChTdHJpbmcgbmFtZXNwYWNlLCBIb2xkZXI8U3RyaW5nPiBmaWxlbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTY2hlbWFPdXRwdXQobmFtZXNwYWNlLCBmaWxlbmFtZS52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0sIGJpbmRpbmdJRCk7Ci0gICAgICAgICAgICB3c2RsR2VuZXJhdG9yLmRvR2VuZXJhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lEKFN0cmluZyBwcm90b2NvbCkgewotICAgICAgICBpZiAocHJvdG9jb2wuZXF1YWxzKFNPQVAxMSkpCi0gICAgICAgICAgICByZXR1cm4gU09BUDExX0lEOwotICAgICAgICBpZiAocHJvdG9jb2wuZXF1YWxzKFhfU09BUDEyKSkKLSAgICAgICAgICAgIHJldHVybiBTT0FQMTJfSUQ7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1blByb2Nlc3NvckFjdGlvbnMoKSB7Ci0gICAgICAgIGlmICghKGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxJbmZvKCkgaW5zdGFuY2VvZiBDbGFzc01vZGVsSW5mbykpIHsKLSAgICAgICAgICAgIG9uRXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmNsYXNzbW9kZWxpbmZvLmV4cGVjdGVkIiwgbmV3IE9iamVjdFtdIHsgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAuZ2V0TW9kZWxJbmZvKCkgfSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1vZGVsIG1vZGVsID0gY29udGV4dC5nZXRTRUlDb250ZXh0KAotICAgICAgICAgICAgICAgICgoQ2xhc3NNb2RlbEluZm8pIGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxJbmZvKCkpLmdldENsYXNzTmFtZSgpKS5nZXRNb2RlbCgpOwotICAgICAgICBwcm9jZXNzb3IgPSBuZXcgUHJvY2Vzc29yKGNvbmZpZ3VyYXRpb24sIHByb3BlcnRpZXMsIG1vZGVsKTsKLSAgICAgICAgd2l0aE1vZGVsSG9vaygpOwotICAgICAgICByZWdpc3RlclByb2Nlc3NvckFjdGlvbnMocHJvY2Vzc29yKTsKLSAgICAgICAgcHJvY2Vzc29yLnJ1bkFjdGlvbnMoKTsKLSAgICAgICAvLyBUT0RPIHRocm93IGFuIGVycm9yCi0vLyAgICAgICAgaWYgKGVudmlyb25tZW50LmdldEVycm9yQ291bnQoKSAhPSAwKSB7Ci0vLyAgICAgICAgfQotCi0gICAgfQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIFNvdXJjZVZlcnNpb24gc3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VWZXJzaW9uKCkgewotICAgICAgICBpZiAodGFyZ2V0VmVyc2lvbiA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8qIG5vIHRhcmdldCBzcGVjaWZpZWQsIGRlZmF1bHRpbmcgdG8gdGhlIGRlZmF1bHQgdmVyc2lvbiwKLSAgICAgICAgICAgICAqIHdoaWNoIGlzIHRoZSBsYXRlc3QgdmVyc2lvbgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXR1cm4gVmVyc2lvblV0aWwuSkFYV1NfVkVSU0lPTl9ERUZBVUxUOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YXJnZXRWZXJzaW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdpdGhNb2RlbEhvb2soKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXJIb29rKCkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBpbGVHZW5lcmF0ZWRDbGFzc2VzKCkgewotICAgICAgICBMaXN0PFN0cmluZz4gc291cmNlRmlsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbnZpcm9ubWVudC5nZXRHZW5lcmF0ZWRGaWxlcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEdlbmVyYXRlZEZpbGVJbmZvIGZpbGVJbmZvID0gKEdlbmVyYXRlZEZpbGVJbmZvKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIEZpbGUgZiA9IGZpbGVJbmZvLmdldEZpbGUoKTsKLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpICYmIGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlRmlsZXMuYWRkKGYuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZUZpbGVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc0RpciA9IGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NwYXRoU3RyaW5nID0gY3JlYXRlQ2xhc3NwYXRoU3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1s0ICsgKGNvbXBpbGVyRGVidWcgPyAxIDogMCkKLSAgICAgICAgICAgICAgICAgICAgKyAoY29tcGlsZXJPcHRpbWl6ZSA/IDEgOiAwKSArIHNvdXJjZUZpbGVzLnNpemUoKV07Ci0gICAgICAgICAgICBhcmdzWzBdID0gIi1kIjsKLSAgICAgICAgICAgIGFyZ3NbMV0gPSBjbGFzc0RpcjsKLSAgICAgICAgICAgIGFyZ3NbMl0gPSAiLWNsYXNzcGF0aCI7Ci0gICAgICAgICAgICBhcmdzWzNdID0gY2xhc3NwYXRoU3RyaW5nOwotICAgICAgICAgICAgaW50IGJhc2VJbmRleCA9IDQ7Ci0gICAgICAgICAgICBpZiAoY29tcGlsZXJEZWJ1ZykgewotICAgICAgICAgICAgICAgIGFyZ3NbYmFzZUluZGV4KytdID0gIi1nIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb21waWxlck9wdGltaXplKSB7Ci0gICAgICAgICAgICAgICAgYXJnc1tiYXNlSW5kZXgrK10gPSAiLU8iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIGFyZ3NbYmFzZUluZGV4ICsgaV0gPSBzb3VyY2VGaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBqYXZhY091dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIEphdmFDb21waWxlckhlbHBlciBjb21waWxlckhlbHBlciA9IG5ldyBKYXZhQ29tcGlsZXJIZWxwZXIob3V0KTsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gY29tcGlsZXJIZWxwZXIuY29tcGlsZShhcmdzKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgZW52aXJvbm1lbnQuZXJyb3IoZ2V0TWVzc2FnZSgid3Njb21waWxlLmNvbXBpbGF0aW9uRmFpbGVkIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFByb2Nlc3NvckFjdGlvbiBnZXRBY3Rpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGFjdGlvbnMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQ2xhc3NwYXRoU3RyaW5nKCkgewotICAgICAgICBpZiAodXNlckNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1c2VyQ2xhc3NwYXRoID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVzZXJDbGFzc3BhdGggKyBGaWxlLnBhdGhTZXBhcmF0b3IgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUHJvY2Vzc29yQWN0aW9ucyhQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0gICAgICAgIHJlZ2lzdGVyKHByb2Nlc3Nvcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoUHJvY2Vzc29yIHByb2Nlc3NvcikgewotICAgICAgICBib29sZWFuIGdlblNlcnZpY2VJbnRlcmZhY2UgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBnZW5JbnRlcmZhY2UgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBnZW5DdXN0b21DbGFzc2VzID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxJbmZvKCkgaW5zdGFuY2VvZiBXU0RMTW9kZWxJbmZvKSB7Ci0gICAgICAgICAgICBnZW5JbnRlcmZhY2UgPSB0cnVlOwotICAgICAgICAgICAgLy9nZW5JbnRlcmZhY2VUZW1wbGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICBnZW5TZXJ2aWNlSW50ZXJmYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgIGdlbkN1c3RvbUNsYXNzZXMgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdlblNlcnZpY2VJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgIHByb2Nlc3Nvci5hZGQoZ2V0QWN0aW9uKEFjdGlvbkNvbnN0YW50cy5BQ1RJT05fU0VSVklDRV9HRU5FUkFUT1IpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZW5DdXN0b21DbGFzc2VzKSB7Ci0gICAgICAgICAgICBwcm9jZXNzb3IuYWRkKGdldEFjdGlvbihBY3Rpb25Db25zdGFudHMuQUNUSU9OX0pBWEJfVFlQRV9HRU5FUkFUT1IpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZW5JbnRlcmZhY2UpIHsKLSAgICAgICAgICAgIHByb2Nlc3Nvci5hZGQoZ2V0QWN0aW9uKEFjdGlvbkNvbnN0YW50cy5BQ1RJT05fQ1VTVE9NX0VYQ0VQVElPTl9HRU5FUkFUT1IpKTsKLSAgICAgICAgICAgIHByb2Nlc3Nvci5hZGQoZ2V0QWN0aW9uKEFjdGlvbkNvbnN0YW50cy5BQ1RJT05fUkVNT1RFX0lOVEVSRkFDRV9HRU5FUkFUT1IpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVudmlyb25tZW50ID09IG51bGwpCi0gICAgICAgICAgICBlbnZpcm9ubWVudCA9IGNyZWF0ZUVudmlyb25tZW50KCk7Ci0gICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgUmVhZGVyKGVudmlyb25tZW50LCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5wYXJzZShlbnRpdHlSZXNvbHZlciwgaW5wdXRGaWxlcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlSG9vaygpIHsKLSAgICAgICAgaWYgKGRlc3REaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzdERpciA9IG5ldyBGaWxlKCIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvdXJjZURpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzb3VyY2VEaXIgPSBkZXN0RGlyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChub25jbGFzc0Rlc3REaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbm9uY2xhc3NEZXN0RGlyID0gZGVzdERpcjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoUHJvY2Vzc29yT3B0aW9ucy5TT1VSQ0VfRElSRUNUT1JZX1BST1BFUlRZLCBzb3VyY2VEaXIKLSAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuREVTVElOQVRJT05fRElSRUNUT1JZX1BST1BFUlRZLCBkZXN0RGlyCi0gICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShQcm9jZXNzb3JPcHRpb25zLk5PTkNMQVNTX0RFU1RJTkFUSU9OX0RJUkVDVE9SWV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBub25jbGFzc0Rlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuRVhURU5TSU9OLCAoZXh0ZW5zaW9ucyA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKLSAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShQcm9jZXNzb3JPcHRpb25zLlBSSU5UX1NUQUNLX1RSQUNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICh2ZXJib3NlID8gVFJVRSA6IEZBTFNFKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoUHJvY2Vzc29yT3B0aW9ucy5QUk9UT0NPTCwgcHJvdG9jb2wpOwotICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuVFJBTlNQT1JULCB0cmFuc3BvcnQpOwotICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuSkFYV1NfU09VUkNFX1ZFUlNJT04sIGdldFNvdXJjZVZlcnNpb24oKSk7Ci0gICAgICAgIGlmKHdzZGxMb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShQcm9jZXNzb3JPcHRpb25zLldTRExfTE9DQVRJT04sIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIGlmKGRlZmF1bHRQYWNrYWdlICE9IG51bGwpCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KFByb2Nlc3Nvck9wdGlvbnMuREVGQVVMVF9QQUNLQUdFLCBkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoUHJvY2Vzc29yT3B0aW9ucy5ET05PVF9PVkVSV1JJVEVfQ0xBU1NFUywgKGRvTm90T3ZlcldyaXRlID8gVFJVRSA6IEZBTFNFKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRHZW5lcmljRXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gIndzY29tcGlsZS5lcnJvciI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMud3Njb21waWxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBwb3J0ZWRPcHRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gc3VwcG9ydGVkQW5ub3RhdGlvblR5cGVzKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydGVkQW5ub3RhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FcnJvcihMb2NhbGl6YWJsZSBtc2cpIHsKLSAgICAgICAgcmVwb3J0KGdldE1lc3NhZ2UoIndzY29tcGlsZS5lcnJvciIsIGxvY2FsaXplci5sb2NhbGl6ZShtc2cpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25XYXJuaW5nKExvY2FsaXphYmxlIG1zZykgewotICAgICAgICByZXBvcnQoZ2V0TWVzc2FnZSgid3Njb21waWxlLndhcm5pbmciLCBsb2NhbGl6ZXIubG9jYWxpemUobXNnKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhMb2NhbGl6YWJsZSBtc2cpIHsKLSAgICAgICAgcmVwb3J0KGdldE1lc3NhZ2UoIndzY29tcGlsZS5pbmZvIiwgbG9jYWxpemVyLmxvY2FsaXplKG1zZykpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblByb2Nlc3NvciBnZXRQcm9jZXNzb3JGb3IoU2V0PEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+IGF0ZHMsCi0gICAgICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgYXBFbnYpIHsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBhcEVudi5nZXRNZXNzYWdlcigpLnByaW50Tm90aWNlKCJcdGFwIHJvdW5kOiAiICsgKytyb3VuZCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBUC5pbml0KGFwRW52KTsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VBUDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIGdldENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb2Nlc3NvckVudmlyb25tZW50IGVudiA9IGNyZWF0ZUVudmlyb25tZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gZW52LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvY2Vzc29yRW52aXJvbm1lbnQgY3JlYXRlRW52aXJvbm1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNwYXRoID0gdXNlckNsYXNzcGF0aCArIEZpbGUucGF0aFNlcGFyYXRvciArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0gICAgICAgIFByb2Nlc3NvckVudmlyb25tZW50IGVudiA9IG5ldyBDbGllbnRQcm9jZXNzb3JFbnZpcm9ubWVudChTeXN0ZW0ub3V0LCBjcGF0aCwgbGlzdGVuZXIpOwotICAgICAgICByZXR1cm4gZW52OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVzYWdlKCkgewotICAgICAgICBoZWxwKCk7Ci0gICAgICAgIC8vcmVwb3J0KGdldE1lc3NhZ2UocHJvZ3JhbSsiLnVzYWdlIiwgcHJvZ3JhbSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhlbHAoKSB7Ci0gICAgICAgIHJlcG9ydChnZXRNZXNzYWdlKHByb2dyYW0rIi5oZWxwIiwgcHJvZ3JhbSkpOwotICAgICAgICByZXBvcnQoZ2V0TWVzc2FnZShwcm9ncmFtKyIudXNhZ2UuZXhhbXBsZXMiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHsKLSAgICAgICAgdGhpcy5lbnRpdHlSZXNvbHZlciA9IGVudGl0eVJlc29sdmVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvY2Vzc29yIGRvZXNuJ3QgZXhhbWluZSBhbnkgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHN1cHBvcnRlZE9wdGlvbnMgPSBDb2xsZWN0aW9ucwotICAgICAgICAgICAgLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KCkpOwotCi0gICAgLyoKLSAgICAgKiBBbGwgYW5ub3RhdGlvbiB0eXBlcyBhcmUgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gc3VwcG9ydGVkQW5ub3RhdGlvbnM7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB0eXBlcy5hZGQoIioiKTsKLSAgICAgICAgdHlwZXMuYWRkKCJqYXZheC5qd3MuKiIpOwotICAgICAgICB0eXBlcy5hZGQoImphdmF4Lmp3cy5zb2FwLioiKTsKLSAgICAgICAgc3VwcG9ydGVkQW5ub3RhdGlvbnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHR5cGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25Qcm9jZXNzb3JDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VBUCB3ZWJTZXJ2aWNlQVA7Ci0KLSAgICBwcml2YXRlIGludCByb3VuZCA9IDA7Ci0KLSAgICAvLyBFbmQgQW5ub3RhdGlvblByb2Nlc3NvckZhY3Rvcnkgc3R1ZmYKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllczsKLSAgICBwcm90ZWN0ZWQgUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLSAgICBwcm90ZWN0ZWQgUHJvY2Vzc29yTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0gICAgcHJvdGVjdGVkIFByb2Nlc3NvciBwcm9jZXNzb3I7Ci0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsUHJvY2Vzc29yQWN0aW9uPiBhY3Rpb25zOwotICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gaW5wdXRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByb3RlY3RlZCBGaWxlIHNvdXJjZURpcjsKLSAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RGlyOwotICAgIHByb3RlY3RlZCBGaWxlIG5vbmNsYXNzRGVzdERpcjsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb05vdGhpbmcgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21waWxlckRlYnVnID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGlsZXJPcHRpbWl6ZSA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBrZWVwR2VuZXJhdGVkID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZG9Ob3RPdmVyV3JpdGUgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHRlbnNpb25zID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyQ2xhc3NwYXRoID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gYmluZGluZ0ZpbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbldzZGwgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sID0gU09BUDExOwotICAgIHByb3RlY3RlZCBib29sZWFuIHByb3RvY29sU2V0ID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0cmFuc3BvcnQgPSBIVFRQOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMSA9ICJzb2FwMS4xIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYX1NPQVAxMiA9ICJYc29hcDEuMiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUCAgID0gImh0dHAiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTSU1QT1JUID0gIndzaW1wb3J0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0dFTiAgICA9ICJ3c2dlbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0lEID0gamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9JRCA9IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORzsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9QUk9UT0NPTFMgPSBTT0FQMTEgKyIsICIrWF9TT0FQMTI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfVFJBTlNQT1JUUyA9ICJodHRwIjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nICB0YXJnZXRWZXJzaW9uID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxMb2NhdGlvbjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRQYWNrYWdlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZzsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgc2VydmljZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFFOYW1lIHBvcnROYW1lOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlROQU1FX09QVElPTiA9ICItcG9ydG5hbWUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VOQU1FX09QVElPTiA9ICItc2VydmljZW5hbWUiOwotICAgIHByb3RlY3RlZCBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcjsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL0Vycm9yUmVjZWl2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL0Vycm9yUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzk4Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvRXJyb3JSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuU0FYUGFyc2VFeGNlcHRpb24yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLk1vZGVsTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLkVycm9yTGlzdGVuZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50ZWQgYnkgdGhlIGRyaXZlciBvZiB0aGUgY29tcGlsZXIgZW5naW5lIHRvIGhhbmRsZQorICogZXJyb3JzIGZvdW5kIGR1cmluZyB0aGUgY29tcGlsaWF0aW9uLgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHtAbGluayBvcmcueG1sLnNheC5FcnJvckhhbmRsZXJ9IHNvIGl0IGNhbiBiZQorICogcGFzc2VkIHRvIGFueXdoZXJlIHdoZXJlIHtAbGluayBvcmcueG1sLnNheC5FcnJvckhhbmRsZXJ9IGlzIGV4cGVjdGVkLgorICoKKyAqIDxwPgorICogSG93ZXZlciwgdG8gbWFrZSB0aGUgZXJyb3IgaGFuZGxpbmcgZWFzeSAoYW5kIG1ha2UgaXQgd29yaworICogd2l0aCB2aXNpdG9yIHBhdHRlcm5zIG5pY2VseSksCisgKiBub25lIG9mIHRoZSBtZXRob2RzIG9uIHRoaSBjbGFzcyB0aHJvd3Mge0BsaW5rIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbn0uCisgKiBJbnN0ZWFkLCB3aGVuIHRoZSBjb21waWxhdGlvbiBuZWVkcyB0byBiZSBhYm9ydGVkLAorICogaXQgdGhyb3dzIHtAbGluayBBYm9ydEV4Y2VwdGlvbn0sIHdoaWNoIGlzIHVuY2hlY2tlZC4KKyAqCisgKiA8cD4KKyAqIFRoaXMgYWxzbyBpbXBsZW1lbnRzIHRoZSBleHRlcm5hbGx5IHZpc2libGUge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5FcnJvckxpc3RlbmVyfQorICogc28gdGhhdCB3ZSBjYW4gcmV1c2Ugb3VyIGludGVybmFsIGltcGxlbWVudGF0aW9uIGZvciB0ZXN0aW5nIGFuZCBzdWNoLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkgKGtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20pCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXJyb3JSZWNlaXZlciAgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIsIEVycm9yTGlzdGVuZXIgeworCisvLworLy8KKy8vIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNhbGxlcnMKKy8vCisvLworICAgIC8qKgorICAgICAqIEBwYXJhbSBsb2MKKyAgICAgKiAgICAgIGNhbiBiZSBudWxsIGlmIHRoZSBsb2NhdGlvbiBpcyB1bmtub3duCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgZXJyb3IoIExvY2F0b3IgbG9jLCBTdHJpbmcgbXNnICkgeworICAgICAgICBlcnJvciggbmV3IFNBWFBhcnNlRXhjZXB0aW9uMihtc2csbG9jKSApOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVycm9yKCBMb2NhdG9yIGxvYywgU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUgKSB7CisgICAgICAgIGVycm9yKCBuZXcgU0FYUGFyc2VFeGNlcHRpb24yKG1zZyxsb2MsZSkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlcnJvciggU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUgKSB7CisgICAgICAgIGVycm9yKCBuZXcgU0FYUGFyc2VFeGNlcHRpb24yKG1zZyxudWxsLGUpICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXJyb3IoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZXJyb3IoZS5nZXRNZXNzYWdlKCksZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0cyBhIHdhcm5pbmcuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgd2FybmluZyggQE51bGxhYmxlIExvY2F0b3IgbG9jLCBTdHJpbmcgbXNnICkgeworICAgICAgICB3YXJuaW5nKCBuZXcgU0FYUGFyc2VFeGNlcHRpb24obXNnLGxvYykgKTsKKyAgICB9CisKKy8vCisvLworLy8gRXJyb3JIYW5kbGVyIGltcGxlbWVudGF0aW9uLCBidXQgY2FuJ3QgdGhyb3cgU0FYRXhjZXB0aW9uCisvLworLy8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBBYm9ydEV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIEFib3J0RXhjZXB0aW9uOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgQWJvcnRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgcGVyaW9kaWNhbGx5IHRvIGFsbG93IHtAbGluayBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5BYm9ydEV4Y2VwdGlvbn0KKyAgICAgKiB0byBiZSB0aHJvd24sIGVzcGVjaWFsbHkgd2hlbiB0aGlzIGlzIGRyaXZlbiBieSBzb21lIGtpbmQgb2YgR1VJLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvbGxBYm9ydCgpIHRocm93cyBBYm9ydEV4Y2VwdGlvbiB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXBvcnRzIHZlcmJvc2UgbWVzc2FnZXMgdG8gdXNlcnMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZXBvcnQgYWRkaXRpb25hbCBub24tZXNzZW50aWFsCisgICAgICogbWVzc2FnZXMuIFRoZSBpbXBsZW1lbnRhdGlvbiB1c3VhbGx5IGRpc2NhcmRzIHRoZW0KKyAgICAgKiB1bmxlc3Mgc29tZSBzcGVjaWZpYyBkZWJ1ZyBvcHRpb24gaXMgdHVybmVkIG9uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSAvKlJFVklTSVQ6dGhyb3dzIEFib3J0RXhjZXB0aW9uKi87CisKKyAgICAvKioKKyAgICAgKiBSZXBvcnRzIGEgZGVidWcgbWVzc2FnZSB0byB1c2Vycy4KKyAgICAgKgorICAgICAqIEBzZWUgI2luZm8oU0FYUGFyc2VFeGNlcHRpb24pCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgZGVidWcoIFN0cmluZyBtc2cgKSB7CisgICAgICAgIGluZm8oIG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihtc2csbnVsbCkgKTsKKyAgICB9CisKKy8vCisvLworLy8gY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZGVyaXZlZCBjbGFzc2VzCisvLworLy8KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgKiB7QGxpbmsgb3JnLnhtbC5zYXguTG9jYXRvcn0gcGFydCBvZiB0aGUgc3BlY2lmaWVkCisgICAqIHtAbGluayBTQVhQYXJzZUV4Y2VwdGlvbn0uCisgICAqCisgICAqIEByZXR1cm4gIG5vbi1udWxsIHZhbGlkIG9iamVjdC4KKyAgICovCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TG9jYXRpb25TdHJpbmcoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKSB7CisgICAgICBpZihlLmdldExpbmVOdW1iZXIoKSE9LTEgfHwgZS5nZXRTeXN0ZW1JZCgpIT1udWxsKSB7CisgICAgICAgICAgaW50IGxpbmUgPSBlLmdldExpbmVOdW1iZXIoKTsKKyAgICAgICAgICByZXR1cm4gTW9kZWxNZXNzYWdlcy5DT05TT0xFX0VSUk9SX1JFUE9SVEVSX0xJTkVfWF9PRl9ZKGxpbmU9PS0xPyI/IjpJbnRlZ2VyLnRvU3RyaW5nKCBsaW5lICksCisgICAgICAgICAgICAgIGdldFNob3J0TmFtZSggZS5nZXRTeXN0ZW1JZCgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBNb2RlbE1lc3NhZ2VzLkNPTlNPTEVfRVJST1JfUkVQT1JURVJfVU5LTk9XTl9MT0NBVElPTigpOworICAgICAgfQorICB9CisKKyAgLyoqIENvbXB1dGVzIGEgc2hvcnQgbmFtZSBvZiBhIGdpdmVuIFVSTCBmb3IgZGlzcGxheS4gKi8KKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2hvcnROYW1lKCBTdHJpbmcgdXJsICkgeworICAgICAgaWYodXJsPT1udWxsKQorICAgICAgICAgIHJldHVybiBNb2RlbE1lc3NhZ2VzLkNPTlNPTEVfRVJST1JfUkVQT1JURVJfVU5LTk9XTl9MT0NBVElPTigpOworICAgICAgcmV0dXJuIHVybDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvRXJyb3JSZWNlaXZlckZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvRXJyb3JSZWNlaXZlckZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTE2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9FcnJvclJlY2VpdmVyRmlsdGVyLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisKKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZTsKKworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5FcnJvckxpc3RlbmVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIEZpbHRlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRXJyb3JSZWNlaXZlci4KKyAqCisgKiBJZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCwgdGhpcyBmaWx0ZXIgc2V0cyBhIGZsYWcuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBjbGFzcyBFcnJvclJlY2VpdmVyRmlsdGVyIGV4dGVuZHMgRXJyb3JSZWNlaXZlciB7CisKKyAgICBwdWJsaWMgRXJyb3JSZWNlaXZlckZpbHRlcigpIHt9CisKKyAgICBwdWJsaWMgRXJyb3JSZWNlaXZlckZpbHRlciggRXJyb3JMaXN0ZW5lciBoICkgeworICAgICAgICBzZXRFcnJvclJlY2VpdmVyKGgpOworICAgIH0KKworICAgIHByaXZhdGUgRXJyb3JMaXN0ZW5lciBjb3JlOworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUmVjZWl2ZXIoIEVycm9yTGlzdGVuZXIgaGFuZGxlciApIHsKKyAgICAgICAgY29yZSA9IGhhbmRsZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhZEVycm9yID0gZmFsc2U7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFkRXJyb3IoKSB7IHJldHVybiBoYWRFcnJvcjsgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBlcnJvciBzdGF0ZSBpdHMgY3VycmVudGx5IGluLiBJdCBhbGxvd3MgdG8gaWdub3JlIHRoZSBlcnJvciByZXBvcnRlZCBieQorICAgICAqIGFueSBzdWItc3lzdGVtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCl7CisgICAgICAgIGhhZEVycm9yID0gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5mbyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgaWYoY29yZSE9bnVsbCkgIGNvcmUuaW5mbyhleGNlcHRpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIGlmKGNvcmUhPW51bGwpICBjb3JlLndhcm5pbmcoZXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgaGFkRXJyb3IgPSB0cnVlOworICAgICAgICBpZihjb3JlIT1udWxsKSAgY29yZS5lcnJvcihleGNlcHRpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIGhhZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgaWYoY29yZSE9bnVsbCkgIGNvcmUuZmF0YWxFcnJvcihleGNlcHRpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvRmlsZXJDb2RlV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9GaWxlckNvZGVXcml0ZXIuamF2YQppbmRleCBjNmJiY2NhLi5kZTU3ZDgyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9GaWxlckNvZGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9GaWxlckNvZGVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxOSArMjQsMTMgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZTsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuQ29kZVdyaXRlcjsKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KUGFja2FnZTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotCiBpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkZpbGVyOwogCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKIC8qKgogICogV3JpdGVzIGFsbCB0aGUgc291cmNlIGZpbGVzIHVzaW5nIHRoZSBzcGVjaWZpZWQgRmlsZXIuCiAgKgpAQCAtNDksOSArNDMsOSBAQAogCiAgICAgcHJpdmF0ZSBXcml0ZXIgdzsKIAotICAgIHB1YmxpYyBGaWxlckNvZGVXcml0ZXIoRmlsZSBvdXREaXIsIFByb2Nlc3NvckVudmlyb25tZW50IGVudiApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKG91dERpciwgZW52KTsKLSAgICAgICAgdGhpcy5maWxlciA9IGVudi5nZXRGaWxlcigpOworICAgIHB1YmxpYyBGaWxlckNvZGVXcml0ZXIoRmlsZSBvdXREaXIsIFdzZ2VuT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlcihvdXREaXIsIG9wdGlvbnMpOworICAgICAgICB0aGlzLmZpbGVyID0gb3B0aW9ucy5maWxlcjsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvSmF2YUNvbXBpbGVySGVscGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9KYXZhQ29tcGlsZXJIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTdhM2RjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvSmF2YUNvbXBpbGVySGVscGVyLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwudG9vbHMuUGFyYWxsZWxXb3JsZENsYXNzTG9hZGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLkphdmFjb21waWxlck1lc3NhZ2VzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyB0byBpbnZva2UgamF2YWMuCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKi8KK2NsYXNzIEphdmFDb21waWxlckhlbHBlcnsKKyAgICBzdGF0aWMgRmlsZSBnZXRKYXJGaWxlKENsYXNzIGNsYXp6KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gUGFyYWxsZWxXb3JsZENsYXNzTG9hZGVyLnRvSmFyVXJsKGNsYXp6LmdldFJlc291cmNlKCcvJytjbGF6ei5nZXROYW1lKCkucmVwbGFjZSgnLicsJy8nKSsiLmNsYXNzIikpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHVybC5nZXRQYXRoKCkpOyAgIC8vIHRoaXMgY29kZSBpcyBhc3N1bWluZyB0aGF0IHVybCBpcyBhIGZpbGUgVVJMCisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWYgd2UgY2FuJ3QgZmlndXJlIG91dCB3aGVyZSBKQVhCL0pBWC1XUyBBUEkgYXJlLCB3ZSBjb3VsZG4ndCBoYXZlIGJlZW4gZXhlY3V0aW5nIHRoaXMgY29kZS4KKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGZpZ3VyZSBvdXQgd2hlcmUgSkFYQi9KQVgtV1MgQVBJIGFyZSwgd2UgY291bGRuJ3QgaGF2ZSBiZWVuIGV4ZWN1dGluZyB0aGlzIGNvZGUuCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBjb21waWxlKFN0cmluZ1tdIGFyZ3MsIE91dHB1dFN0cmVhbSBvdXQsIEVycm9yUmVjZWl2ZXIgcmVjZWl2ZXIpeworICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvKiB0cnkgdG8gdXNlIHRoZSBuZXcgY29tcGlsZXIgKi8KKyAgICAgICAgICAgIENsYXNzIGNvbVN1blRvb2xzSmF2YWNNYWluQ2xhc3MgPQorICAgICAgICAgICAgICAgICAgICBjbC5sb2FkQ2xhc3MoImNvbS5zdW4udG9vbHMuamF2YWMuTWFpbiIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNZXRob2QgY29tcGlsZU1ldGhvZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb21TdW5Ub29sc0phdmFjTWFpbkNsYXNzLmdldE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlTWV0aG9kU2lnbmF0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZU1ldGhvZC5pbnZva2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBhcmdzLCBuZXcgUHJpbnRXcml0ZXIob3V0KSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgaW5zdGFuY2VvZiBJbnRlZ2VyICYmIChJbnRlZ2VyKSByZXN1bHQgPT0gMDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIHJlY2VpdmVyLmVycm9yKEphdmFjb21waWxlck1lc3NhZ2VzLkpBVkFDT01QSUxFUl9OT1NVQ0hNRVRIT0RfRVJST1IoImdldE1ldGhvZChcImNvbXBpbGVcIiwgQ2xhc3NbXSkiKSwgZTIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmVjZWl2ZXIuZXJyb3IoZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZWNlaXZlci5lcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZWNlaXZlci5lcnJvcihKYXZhY29tcGlsZXJNZXNzYWdlcy5KQVZBQ09NUElMRVJfQ0xBU1NQQVRIX0VSUk9SKCJjb20uc3VuLnRvb2xzLmphdmFjLk1haW4iKSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlY2VpdmVyLmVycm9yKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIGNvbXBpbGVNZXRob2RTaWduYXR1cmUgPSB7U3RyaW5nW10uY2xhc3MsIFByaW50V3JpdGVyLmNsYXNzfTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL09wdGlvbnMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL09wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2YwNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlOworCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuV3Njb21waWxlTWVzc2FnZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqCisgKiBQcm92aWRlIGNvbW1vbiBqYXh3cyB0b29sIG9wdGlvbnMuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGNsYXNzIE9wdGlvbnMgeworICAgIC8qKgorICAgICAqIC12ZXJib3NlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdmVyYm9zZTsKKworICAgIC8qKgorICAgICAqIC0gcXVpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBxdWlldDsKKworICAgIC8qKgorICAgICAqIC1rZWVwCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4ga2VlcDsKKworCisKKyAgICAvKioKKyAgICAgKiAtZAorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGRlc3REaXIgPSBuZXcgRmlsZSgiLiIpOworCisKKyAgICAvKioKKyAgICAgKiAtcworICAgICAqLworICAgIHB1YmxpYyBGaWxlIHNvdXJjZURpcjsKKworICAgIHB1YmxpYyBTdHJpbmcgY2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKworCisgICAgLyoqCisgICAgICogLVhub2NvbXBpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBub2NvbXBpbGU7CisKKyAgICBwdWJsaWMgZW51bSBUYXJnZXQgeworICAgICAgICBWMl8wLCBWMl8xOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2ZXJzaW9uIGlzIGVxdWFsIG9yIGxhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGF0ZXJUaGFuKFRhcmdldCB0KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5vcmRpbmFsKCkgPj0gdC5vcmRpbmFsKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2VzICIyLjAiIGFuZCAiMi4xIiBpbnRvIHRoZSB7QGxpbmsgVGFyZ2V0fSBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbnVsbCBmb3IgcGFyc2luZyBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBUYXJnZXQgcGFyc2UoU3RyaW5nIHRva2VuKSB7CisgICAgICAgICAgICBpZiAodG9rZW4uZXF1YWxzKCIyLjAiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0LlYyXzA7CisgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIjIuMSIpKQorICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXQuVjJfMTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmVzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBUYXJnZXR9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKXsKKyAgICAgICAgICAgIHN3aXRjaCh0aGlzKXsKKyAgICAgICAgICAgIGNhc2UgVjJfMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIjIuMCI7CisgICAgICAgICAgICBjYXNlIFYyXzE6CisgICAgICAgICAgICAgICAgcmV0dXJuICIyLjEiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBUYXJnZXQgdGFyZ2V0ID0gVGFyZ2V0LlYyXzE7CisKKyAgICAvKioKKyAgICAgKiBzdHJpY3RseSBmb2xsb3cgdGhlIGNvbXBhdGliaWxpdHkgcnVsZXMgc3BlY2lmaWVkIGluIEpBWFdTIHNwZWMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJQ1QgPSAxOworCisgICAgLyoqCisgICAgICogbG9vc2VseSBmb2xsb3cgdGhlIGNvbXBhdGliaWxpdHkgcnVsZXMgYW5kIGFsbG93IHRoZSB1c2Ugb2YgdmVuZG9yCisgICAgICogYmluZGluZyBleHRlbnNpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5TSU9OID0gMjsKKworICAgIC8qKgorICAgICAqIHRoaXMgc3dpdGNoIGRldGVybWluZXMgaG93IGNhcmVmdWxseSB0aGUgY29tcGlsZXIgd2lsbCBmb2xsb3cKKyAgICAgKiB0aGUgY29tcGF0aWJpbGl0eSBydWxlcyBpbiB0aGUgc3BlYy4gRWl0aGVyIDxjb2RlPlNUUklDVDwvY29kZT4KKyAgICAgKiBvciA8Y29kZT5FWFRFTlNJT048L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGF0aWJpbGl0eU1vZGUgPSBTVFJJQ1Q7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVuc2lvbk1vZGUoKSB7CisgICAgICAgIHJldHVybiBjb21wYXRpYmlsaXR5TW9kZSA9PSBFWFRFTlNJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFyZ2V0IGRpcmVjb3R5IHdoZW4gcHJvZHVjaW5nIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKCIuIik7CisKKworCisgICAgcHVibGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBkZWJ1Z01vZGUgPSBmYWxzZTsKKworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEZpbGU+IGdlbmVyYXRlZEZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7CisKKworICAgIC8qKgorICAgICAqIFJlbWVtYmVyIGluZm8gb24gIGdlbmVyYXRlZCBzb3VyY2UgZmlsZSBnZW5lcmF0ZWQgc28gdGhhdCBpdAorICAgICAqIGNhbiBiZSByZW1vdmVkIGxhdGVyLCBpZiBhcHByb3ByaWF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRHZW5lcmF0ZWRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICBnZW5lcmF0ZWRGaWxlcy5hZGQoZmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGdlbmVyYXRlZCBmaWxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdlbmVyYXRlZEZpbGVzKCl7CisgICAgICAgIGZvcihGaWxlIGZpbGUgOiBnZW5lcmF0ZWRGaWxlcyl7CisgICAgICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKKyAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlZEZpbGVzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCB0aGUgZ2VuZXJhdGVkIGZpbGVzIGFuZCBpdHMgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhYmxlPEZpbGU+IGdldEdlbmVyYXRlZEZpbGVzKCkgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkRmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGFsbCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBtYWRlIGR1cmluZyB0aGUgZXhlY3V0aW9uCisgICAgICogb2YgdGhpcyBlbnZpcm9ubWVudCAodGhvc2UgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZQorICAgICAqICJhZGRHZW5lcmF0ZWRGaWxlIiBtZXRob2QpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUdlbmVyYXRlZEZpbGVzKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGdlbmVyYXRlZEZpbGVzKSB7CisgICAgICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGdlbmVyYXRlZEZpbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuZXJhdGVkRmlsZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhcmd1bWVudHMgYW5kIGZpbGwgZmllbGRzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbgorICAgICAqICAgICAgdGhyb3duIHdoZW4gdGhlcmUncyBhIHByb2JsZW0gaW4gdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBwYXJzZUFyZ3VtZW50cyggU3RyaW5nW10gYXJncyApIHRocm93cyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZihhcmdzW2ldLmxlbmd0aCgpPT0wKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uY2hhckF0KDApID09ICctJykgeworICAgICAgICAgICAgICAgIGludCBqID0gcGFyc2VBcmd1bWVudHMoYXJncyxpKTsKKyAgICAgICAgICAgICAgICBpZihqPT0wKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NDT01QSUxFX0lOVkFMSURfT1BUSU9OKGFyZ3NbaV0pKTsKKyAgICAgICAgICAgICAgICBpICs9IChqLTEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRGaWxlKGFyZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGRlc3REaXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGRlc3REaXIgPSBuZXcgRmlsZSgiLiIpOworICAgICAgICBpZihzb3VyY2VEaXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHNvdXJjZURpciA9IGRlc3REaXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZmlsZSBmcm9tIHRoZSBhcmd1bWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmcgYSBmaWxlLCBjb3VsZCBiZSBhIHdzZGwgb3IgeHNkIG9yIGEgQ2xhc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlKFN0cmluZyBhcmcpIHRocm93cyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbiB7fQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGFuIG9wdGlvbiA8Y29kZT5hcmdzW2ldPC9jb2RlPiBhbmQgcmV0dXJuCisgICAgICogdGhlIG51bWJlciBvZiB0b2tlbnMgY29uc3VtZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICAwIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgdW5kZXJzdG9vZC4gUmV0dXJuaW5nIDAKKyAgICAgKiAgICAgIHdpbGwgbGV0IHRoZSBjYWxsZXIgcmVwb3J0IGFuIGVycm9yLgorICAgICAqIEBleGNlcHRpb24gQmFkQ29tbWFuZExpbmVFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIHRoZSBjYWxsZWUgd2FudHMgdG8gcHJvdmlkZSBhIGN1c3RvbSBtZXNzYWdlIGZvciBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MsIGludCBpKSB0aHJvd3MgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24geworICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1nIikpIHsKKyAgICAgICAgICAgIGRlYnVnID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWGRlYnVnIikpIHsKKyAgICAgICAgICAgIGRlYnVnTW9kZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLVhlbmRvcnNlZCIpKSB7CisgICAgICAgICAgICAvLyB0aGlzIG9wdGlvbiBpcyBwcm9jZXNzZWQgbXVjaCBlYXJsaWVyLCBzbyBqdXN0IGlnbm9yZS4KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdmVyYm9zZSIpKSB7CisgICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcXVpZXQiKSkgeworICAgICAgICAgICAgcXVpZXQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1rZWVwIikpIHsKKyAgICAgICAgICAgIGtlZXAgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdGFyZ2V0IikpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHJlcXVpcmVBcmd1bWVudCgiLXRhcmdldCIsIGFyZ3MsICsraSk7CisgICAgICAgICAgICB0YXJnZXQgPSBUYXJnZXQucGFyc2UodG9rZW4pOworICAgICAgICAgICAgaWYodGFyZ2V0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFdzY29tcGlsZU1lc3NhZ2VzLldTSU1QT1JUX0lMTEVHQUxfVEFSR0VUX1ZFUlNJT04odG9rZW4pKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9ZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1kIikpIHsKKyAgICAgICAgICAgIGRlc3REaXIgPSBuZXcgRmlsZShyZXF1aXJlQXJndW1lbnQoIi1kIiwgYXJncywgKytpKSk7CisgICAgICAgICAgICBpZiAoIWRlc3REaXIuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFdzY29tcGlsZU1lc3NhZ2VzLldTQ09NUElMRV9OT19TVUNIX0RJUkVDVE9SWShkZXN0RGlyLmdldFBhdGgoKSkpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1zIikpIHsKKyAgICAgICAgICAgIHNvdXJjZURpciA9IG5ldyBGaWxlKHJlcXVpcmVBcmd1bWVudCgiLXMiLCBhcmdzLCArK2kpKTsKKyAgICAgICAgICAgIGtlZXAgPSB0cnVlOworICAgICAgICAgICAgaWYgKCFzb3VyY2VEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NDT01QSUxFX05PX1NVQ0hfRElSRUNUT1JZKHNvdXJjZURpci5nZXRQYXRoKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZXh0ZW5zaW9uIikpIHsKKyAgICAgICAgICAgIGNvbXBhdGliaWxpdHlNb2RlID0gRVhURU5TSU9OOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItaGVscCIpKSB7CisgICAgICAgICAgICBXZUFyZURvbmUgZG9uZSA9IG5ldyBXZUFyZURvbmUoKTsKKyAgICAgICAgICAgIGRvbmUuaW5pdE9wdGlvbnModGhpcyk7CisgICAgICAgICAgICB0aHJvdyBkb25lOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWG5vY29tcGlsZSIpKSB7CisgICAgICAgICAgICAvLyAtbm9jb21waWxlIGltcGxpZXMgLWtlZXAuIHRoaXMgaXMgdW5kb2N1bWVudGVkIHN3aXRjaC4KKyAgICAgICAgICAgIG5vY29tcGlsZSA9IHRydWU7CisgICAgICAgICAgICBrZWVwID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9idGFpbnMgYW4gb3BlcmFuZCBhbmQgcmVwb3J0cyBhbiBlcnJvciBpZiBpdCdzIG5vdCB0aGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlcXVpcmVBcmd1bWVudChTdHJpbmcgb3B0aW9uTmFtZSwgU3RyaW5nW10gYXJncywgaW50IGkpIHRocm93cyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vaWYgKGkgPT0gYXJncy5sZW5ndGggfHwgYXJnc1tpXS5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLSIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NDT01QSUxFX01JU1NJTkdfT1BUSU9OX0FSR1VNRU5UKG9wdGlvbk5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJnc1tpXTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogVXNlZCB0byBzaWduYWwgdGhhdCB3ZSd2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2VBcmVEb25lIGV4dGVuZHMgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24ge30KKworICAgIC8qKgorICAgICAqIEdldCBhIFVSTENsYXNzTG9hZGVyIGZyb20gdXNpbmcgdGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgaWYgKGNsYXNzTG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgVVJMQ2xhc3NMb2FkZXIocGF0aFRvVVJMcyhjbGFzc3BhdGgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciBjb252ZXJ0aW5nIGEgc2VhcmNoIHBhdGggc3RyaW5nIHRvIGFuIGFycmF5CisgICAgICogb2YgZGlyZWN0b3J5IGFuZCBKQVIgZmlsZSBVUkxzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggdGhlIHNlYXJjaCBwYXRoIHN0cmluZworICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBhcnJheSBvZiBkaXJlY3RvcnkgYW5kIEpBUiBmaWxlIFVSTHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVSTFtdIHBhdGhUb1VSTHMoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFtzdC5jb3VudFRva2VucygpXTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgVVJMIHVybCA9IGZpbGVUb1VSTChuZXcgRmlsZShzdC5uZXh0VG9rZW4oKSkpOworICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdXJsc1tjb3VudCsrXSA9IHVybDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodXJscy5sZW5ndGggIT0gY291bnQpIHsKKyAgICAgICAgICAgIFVSTFtdIHRtcCA9IG5ldyBVUkxbY291bnRdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh1cmxzLCAwLCB0bXAsIDAsIGNvdW50KTsKKyAgICAgICAgICAgIHVybHMgPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVybHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG9yIEpBUiBmaWxlIFVSTCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBsb2NhbCBmaWxlIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgRmlsZSBvYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgZGlyZWN0b3J5IG9yIEpBUiBmaWxlIFVSTCwgb3IgbnVsbCBpZiB1bmtub3duCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVUkwgZmlsZVRvVVJMKEZpbGUgZmlsZSkgeworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5hbWUgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbmFtZSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIG5hbWUgPSAiLyIgKyBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gYXNzdW1lIHRoYXQgaXQncyBhIGRpcmVjdG9yeQorICAgICAgICBpZiAoIWZpbGUuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgIi8iOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCgiZmlsZSIsICIiLCBuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbGUiKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvV1NDb2RlV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9XU0NvZGVXcml0ZXIuamF2YQppbmRleCAwYTExNmEzLi42OGNjYjk0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9XU0NvZGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9XU0NvZGVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxMyArMjQsMTEgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZTsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlBhY2thZ2U7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwud3JpdGVyLkZpbGVDb2RlV3JpdGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuR2VuZXJhdGVkRmlsZUluZm87Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IudXRpbC5Qcm9jZXNzb3JFbnZpcm9ubWVudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKICAqIHtAbGluayBGaWxlQ29kZVdyaXRlcn0gaW1wbGVtZW50YXRpb24gdGhhdCBub3RpZmllcwpAQCAtNDAsMjEgKzM4LDE3IEBACiAgKiAgICAgS29oc3VrZSBLYXdhZ3VjaGkgKGtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20pCiAgKi8KIHB1YmxpYyBjbGFzcyBXU0NvZGVXcml0ZXIgZXh0ZW5kcyBGaWxlQ29kZVdyaXRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnY7CisgICAgcHJpdmF0ZSBmaW5hbCBPcHRpb25zIG9wdGlvbnM7CiAKLSAgICBwdWJsaWMgV1NDb2RlV3JpdGVyKCBGaWxlIG91dERpciwgUHJvY2Vzc29yRW52aXJvbm1lbnQgX2VudiApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIFdTQ29kZVdyaXRlciggRmlsZSBvdXREaXIsIE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIob3V0RGlyKTsKLSAgICAgICAgdGhpcy5lbnYgPSBfZW52OworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBGaWxlIGdldEZpbGUoSlBhY2thZ2UgcGtnLCBTdHJpbmcgZmlsZU5hbWUgKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGaWxlIGYgPSBzdXBlci5nZXRGaWxlKHBrZywgZmlsZU5hbWUpOwogCi0gICAgICAgIC8vIG5vdGlmeSBKQVgtV1MgUkkKLSAgICAgICAgR2VuZXJhdGVkRmlsZUluZm8gZmkgPSBuZXcgR2VuZXJhdGVkRmlsZUluZm8oKTsKLSAgICAgICAgZmkuc2V0VHlwZSgiSkFYQiIvKkdlbmVyYXRvckNvbnN0YW50cy5GSUxFX1RZUEVfVkFMVUVUWVBFKi8pOwotICAgICAgICBmaS5zZXRGaWxlKGYpOwotICAgICAgICBlbnYuYWRkR2VuZXJhdGVkRmlsZShmaSk7CisgICAgICAgIG9wdGlvbnMuYWRkR2VuZXJhdGVkRmlsZShmKTsKICAgICAgICAgLy8gd2UgY2FuJ3QgcmVhbGx5IHRlbGwgdGhlIGZpbGUgdHlwZSwgZm9yIHdlIGRvbid0IGtub3cKICAgICAgICAgLy8gd2hhdCB0aGlzIGZpbGUgaXMgdXNlZCBmb3IuIEZvcnR1bmF0ZWx5LAogICAgICAgICAvLyBGSUxFX1RZUEUgZG9lc24ndCBzZWVtIHRvIGJlIHVzZWQsIHNvIGl0IGRvZXNuJ3QgcmVhbGx5CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9Xc2dlbk9wdGlvbnMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL1dzZ2VuT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDY4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9Xc2dlbk9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisKKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZTsKKworaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5GaWxlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5Xc2NvbXBpbGVNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuQmluZGluZ0lEOworCitpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgY2xhc3MgV3NnZW5PcHRpb25zIGV4dGVuZHMgT3B0aW9ucyB7CisgICAgLyoqCisgICAgICogLXNlcnZpY2VuYW1lCisgICAgICovCisgICAgcHVibGljIFFOYW1lIHNlcnZpY2VOYW1lOworCisgICAgLyoqCisgICAgICogLXBvcnRuYW1lCisgICAgICovCisgICAgcHVibGljIFFOYW1lIHBvcnROYW1lOworCisgICAgLyoqCisgICAgICogLXIKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBub25jbGFzc0Rlc3REaXI7CisKKworICAgIC8qKgorICAgICAqIC13c2RsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2VuV3NkbDsKKworICAgIC8qKgorICAgICAqIHByb3RvY29sIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBwcm90b2NvbCA9ICJzb2FwMS4xIjsKKyAgICBwdWJsaWMgU3RyaW5nIHRyYW5zcG9ydDsKKworICAgIC8qKgorICAgICAqIC1Yd3NnZW5SZXBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSB3c2dlblJlcG9ydDsKKworICAgIC8qKgorICAgICAqIC1YZG9ub3RvdmVyd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkb05vdE92ZXJXcml0ZTsKKworICAgIHB1YmxpYyBGaWxlciBmaWxlcjsKKworCisgICAgLyoqCisgICAgICogVGVsbHMgaWYgdXNlciBzcGVjaWZpZWQgYSBzcGVjaWZpYyBwcm90b2NvbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByb3RvY29sU2V0ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRU5BTUVfT1BUSU9OID0gIi1zZXJ2aWNlbmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlROQU1FX09QVElPTiA9ICItcG9ydG5hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQICAgPSAiaHR0cCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMSA9ICJzb2FwMS4xIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYX1NPQVAxMiA9ICJYc29hcDEuMiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MsIGludCBpKSB0aHJvd3MgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24geworICAgICAgICBpbnQgaiA9IHN1cGVyLnBhcnNlQXJndW1lbnRzKGFyZ3MsIGkpOworICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoU0VSVklDRU5BTUVfT1BUSU9OKSkgeworICAgICAgICAgICAgc2VydmljZU5hbWUgPSBRTmFtZS52YWx1ZU9mKHJlcXVpcmVBcmd1bWVudChTRVJWSUNFTkFNRV9PUFRJT04sIGFyZ3MsICsraSkpOworICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgc2VydmljZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihXc2NvbXBpbGVNZXNzYWdlcy5XU0dFTl9TRVJWSUNFTkFNRV9NSVNTSU5HX05BTUVTUEFDRShhcmdzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkgPT0gbnVsbCB8fCBzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFdzY29tcGlsZU1lc3NhZ2VzLldTR0VOX1NFUlZJQ0VOQU1FX01JU1NJTkdfTE9DQUxOQU1FKGFyZ3NbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKFBPUlROQU1FX09QVElPTikpIHsKKyAgICAgICAgICAgIHBvcnROYW1lID0gUU5hbWUudmFsdWVPZihyZXF1aXJlQXJndW1lbnQoUE9SVE5BTUVfT1BUSU9OLCBhcmdzLCArK2kpKTsKKyAgICAgICAgICAgIGlmIChwb3J0TmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8IHBvcnROYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NHRU5fUE9SVE5BTUVfTUlTU0lOR19OQU1FU1BBQ0UoYXJnc1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcnROYW1lLmdldExvY2FsUGFydCgpID09IG51bGwgfHwgcG9ydE5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihXc2NvbXBpbGVNZXNzYWdlcy5XU0dFTl9QT1JUTkFNRV9NSVNTSU5HX0xPQ0FMTkFNRShhcmdzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXIiKSkgeworICAgICAgICAgICAgbm9uY2xhc3NEZXN0RGlyID0gbmV3IEZpbGUocmVxdWlyZUFyZ3VtZW50KCItciIsIGFyZ3MsICsraSkpOworICAgICAgICAgICAgaWYgKCFub25jbGFzc0Rlc3REaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NDT01QSUxFX05PX1NVQ0hfRElSRUNUT1JZKG5vbmNsYXNzRGVzdERpci5nZXRQYXRoKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItY2xhc3NwYXRoIikgfHwgYXJnc1tpXS5lcXVhbHMoIi1jcCIpKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSByZXF1aXJlQXJndW1lbnQoIi1jbGFzc3BhdGgiLCBhcmdzLCArK2kpICsgRmlsZS5wYXRoU2VwYXJhdG9yICsgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLXdzZGwiKSkgeworICAgICAgICAgICAgZ2VuV3NkbCA9IHRydWU7CisgICAgICAgICAgICAvL1N0cmluZyB2YWx1ZSA9IHJlcXVpcmVBcmd1bWVudCgiLXdzZGwiLCBhcmdzLCArK2kpLnN1YnN0cmluZyg1KTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGFyZ3NbaV0uc3Vic3RyaW5nKDUpOworICAgICAgICAgICAgaW50IGluZGV4ID0gdmFsdWUuaW5kZXhPZignOicpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gSFRUUDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IHZhbHVlLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHZhbHVlLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm90b2NvbFNldCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLVh3c2dlblJlcG9ydCIpKSB7CisgICAgICAgICAgICAvLyB1bmRvY3VtZW50ZWQgc3dpdGNoIGZvciB0aGUgdGVzdCBoYXJuZXNzCisgICAgICAgICAgICB3c2dlblJlcG9ydCA9IG5ldyBGaWxlKHJlcXVpcmVBcmd1bWVudCgiLVh3c2dlblJlcG9ydCIsIGFyZ3MsICsraSkpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1YZG9ub3RvdmVyd3JpdGUiKSkgeworICAgICAgICAgICAgZG9Ob3RPdmVyV3JpdGUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGo7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlKFN0cmluZyBhcmcpIHsKKyAgICAgICAgZW5kcG9pbnRzLmFkZChhcmcpOworICAgIH0KKworICAgIExpc3Q8U3RyaW5nPiBlbmRwb2ludHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIHB1YmxpYyBDbGFzcyBlbmRwb2ludDsKKworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSW1wbENsYXNzOworICAgIHByaXZhdGUgYm9vbGVhbiBub1dlYlNlcnZpY2VFbmRwb2ludDsKKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYobm9uY2xhc3NEZXN0RGlyID09IG51bGwpCisgICAgICAgICAgICBub25jbGFzc0Rlc3REaXIgPSBkZXN0RGlyOworICAgICAgICBpZiAoIXByb3RvY29sLmVxdWFsc0lnbm9yZUNhc2UoU09BUDExKSAmJgorICAgICAgICAgICAgICAgICFwcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKFhfU09BUDEyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFdzY29tcGlsZU1lc3NhZ2VzLldTR0VOX0lOVkFMSURfUFJPVE9DT0wocHJvdG9jb2wsIFNPQVAxMSArICIsICIgKyBYX1NPQVAxMikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsICYmICF0cmFuc3BvcnQuZXF1YWxzSWdub3JlQ2FzZShIVFRQKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFdzY29tcGlsZU1lc3NhZ2VzLldTR0VOX0lOVkFMSURfVFJBTlNQT1JUKHRyYW5zcG9ydCwgSFRUUCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZHBvaW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihXc2NvbXBpbGVNZXNzYWdlcy5XU0dFTl9NSVNTSU5HX0ZJTEUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwgfHwgcHJvdG9jb2wuZXF1YWxzSWdub3JlQ2FzZShYX1NPQVAxMikgJiYgIWlzRXh0ZW5zaW9uTW9kZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NHRU5fU09BUF8xMl9XSVRIT1VUX0VYVEVOU0lPTigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbGlkYXRlRW5kcG9pbnRDbGFzcygpOworICAgICAgICB2YWxpZGF0ZUFyZ3VtZW50cygpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFbmRwb2ludENsYXNzKCkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICBmb3IoU3RyaW5nIGNscyA6IGVuZHBvaW50cyl7CisgICAgICAgICAgICBjbGF6eiA9IGdldENsYXNzKGNscyk7CisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGNsYXp6LmlzRW51bSgpIHx8IGNsYXp6LmlzSW50ZXJmYWNlKCkgfHwKKyAgICAgICAgICAgICAgICBjbGF6ei5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc0ltcGxDbGFzcyA9IHRydWU7CisgICAgICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgPSAoV2ViU2VydmljZSkgY2xhenouZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIGlmKHdlYlNlcnZpY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKGNsYXp6ID09IG51bGwpeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFdzY29tcGlsZU1lc3NhZ2VzLldTR0VOX0NMQVNTX05PVF9GT1VORChlbmRwb2ludHMuZ2V0KDApKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIWlzSW1wbENsYXNzKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihXc2NvbXBpbGVNZXNzYWdlcy5XU0dFTl9DTEFTU19NVVNUX0JFX0lNUExFTUVOVEFUSU9OX0NMQVNTKGNsYXp6LmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIGlmKG5vV2ViU2VydmljZUVuZHBvaW50KXsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihXc2NvbXBpbGVNZXNzYWdlcy5XU0dFTl9OT19XRUJTRVJWSUNFU19DTEFTUyhjbGF6ei5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICBlbmRwb2ludCA9IGNsYXp6OworICAgICAgICB2YWxpZGF0ZUJpbmRpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCaW5kaW5nKCkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdlbldzZGwpIHsKKyAgICAgICAgICAgIEJpbmRpbmdJRCBiaW5kaW5nID0gQmluZGluZ0lELnBhcnNlKGVuZHBvaW50KTsKKyAgICAgICAgICAgIGlmICgoYmluZGluZy5lcXVhbHMoQmluZGluZ0lELlNPQVAxMl9IVFRQKSB8fAorICAgICAgICAgICAgICAgICBiaW5kaW5nLmVxdWFscyhCaW5kaW5nSUQuU09BUDEyX0hUVFBfTVRPTSkpICYmCisgICAgICAgICAgICAgICAgICAgICEocHJvdG9jb2wuZXF1YWxzKFhfU09BUDEyKSAmJiBpc0V4dGVuc2lvbk1vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NHRU5fQ0FOTk9UX0dFTl9XU0RMX0ZPUl9TT0FQXzEyX0JJTkRJTkcoYmluZGluZy50b1N0cmluZygpLCBlbmRwb2ludC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaW5kaW5nLmVxdWFscyhCaW5kaW5nSUQuWE1MX0hUVFApKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFdzY29tcGlsZU1lc3NhZ2VzLldTR0VOX0NBTk5PVF9HRU5fV1NETF9GT1JfTk9OX1NPQVBfQklORElORyhiaW5kaW5nLnRvU3RyaW5nKCksIGVuZHBvaW50LmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQXJndW1lbnRzKCkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZW5Xc2RsKSB7CisgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihXc2NvbXBpbGVNZXNzYWdlcy5XU0dFTl9XU0RMX0FSR19OT19HRU5XU0RMKFNFUlZJQ0VOQU1FX09QVElPTikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcnROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NHRU5fV1NETF9BUkdfTk9fR0VOV1NETChQT1JUTkFNRV9PUFRJT04pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQmluZGluZ0lEIGdldEJpbmRpbmdJRChTdHJpbmcgcHJvdG9jb2wpIHsKKyAgICAgICAgaWYgKHByb3RvY29sLmVxdWFscyhTT0FQMTEpKQorICAgICAgICAgICAgcmV0dXJuIEJpbmRpbmdJRC5TT0FQMTFfSFRUUDsKKyAgICAgICAgaWYgKHByb3RvY29sLmVxdWFscyhYX1NPQVAxMikpCisgICAgICAgICAgICByZXR1cm4gQmluZGluZ0lELlNPQVAxMl9IVFRQOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIHByaXZhdGUgQ2xhc3MgZ2V0Q2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL1dzZ2VuVG9vbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvV3NnZW5Ub29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczNzJhNgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL1dzZ2VuVG9vbC5qYXZhCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlOworCitpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3I7CitpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKK2ltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLlRvb2xWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uUHJvY2Vzc29yQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5tb2RlbGVyLmFubm90YXRpb24uV2ViU2VydmljZUFQOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbC5Db25zb2xlRXJyb3JSZXBvcnRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5Xc2NvbXBpbGVNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsLk51bGxTdHJlYW07CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UWFc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIub3V0cHV0LlN0cmVhbVNlcmlhbGl6ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC53cml0ZXIuV1NETEdlbmVyYXRvckV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLldlYlNlcnZpY2VGZWF0dXJlTGlzdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5BYnN0cmFjdFNFSU1vZGVsSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5SdW50aW1lTW9kZWxlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNlcnZpY2VGaW5kZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuV1NETEdlbmVyYXRvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5XU0RMUmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc287CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGNsYXNzIFdzZ2VuVG9vbCBpbXBsZW1lbnRzIEFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5IHsKKyAgICBwcml2YXRlIGZpbmFsIFByaW50U3RyZWFtIG91dDsKKyAgICBwcml2YXRlIGZpbmFsIFdzZ2VuT3B0aW9ucyBvcHRpb25zID0gbmV3IFdzZ2VuT3B0aW9ucygpOworCisKKyAgICBwdWJsaWMgV3NnZW5Ub29sKE91dHB1dFN0cmVhbSBvdXQsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgdGhpcy5vdXQgPSAob3V0IGluc3RhbmNlb2YgUHJpbnRTdHJlYW0pPyhQcmludFN0cmVhbSlvdXQ6bmV3IFByaW50U3RyZWFtKG91dCk7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIH0KKworCisgICAgcHVibGljIFdzZ2VuVG9vbChPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHRoaXMob3V0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBydW4oU3RyaW5nW10gYXJncyl7CisgICAgICAgIGZpbmFsIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChhcmcuZXF1YWxzKCItdmVyc2lvbiIpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIubWVzc2FnZShUb29sVmVyc2lvbi5WRVJTSU9OLkJVSUxEX1ZFUlNJT04pOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcHRpb25zLnBhcnNlQXJndW1lbnRzKGFyZ3MpOworICAgICAgICAgICAgb3B0aW9ucy52YWxpZGF0ZSgpOworICAgICAgICAgICAgaWYoIWJ1aWxkTW9kZWwob3B0aW9ucy5lbmRwb2ludC5nZXROYW1lKCksIGxpc3RlbmVyKSl7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9Y2F0Y2ggKE9wdGlvbnMuV2VBcmVEb25lIGRvbmUpeworICAgICAgICAgICAgdXNhZ2UoZG9uZS5nZXRPcHRpb25zKCkpOworICAgICAgICB9Y2F0Y2ggKEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmKGUuZ2V0TWVzc2FnZSgpIT1udWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVzYWdlKGUuZ2V0T3B0aW9ucygpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfWZpbmFsbHl7CisgICAgICAgICAgICBpZighb3B0aW9ucy5rZWVwKXsKKyAgICAgICAgICAgICAgICBvcHRpb25zLnJlbW92ZUdlbmVyYXRlZEZpbGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uUHJvY2Vzc29yQ29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgZmluYWwgQ29udGFpbmVyIGNvbnRhaW5lcjsKKworICAgIHByaXZhdGUgV2ViU2VydmljZUFQIHdlYlNlcnZpY2VBUDsKKworICAgIHByaXZhdGUgaW50IHJvdW5kID0gMDsKKworICAgIC8vIFdvcmthcm91bmQgZm9yIGJ1ZyA2NDk5MTY1IG9uIGpheC13cywKKyAgICAvLyBPcmlnaW5hbCBidWcgd2l0aCBKREsgNjUwMDU5NCAsIDY1MDA1OTQgd2hlbiBjb21waWxlZCB3aXRoIGRlYnVnIG9wdGlvbiwKKyAgICBwcml2YXRlIHZvaWQgd29ya0Fyb3VuZEphdmFjRGVidWcoKSB7CisgICAgICAgIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIGFwdE1haW4gPSBjbC5sb2FkQ2xhc3MoImNvbS5zdW4udG9vbHMuYXB0Lm1haW4uTWFpbiIpOworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Vm9pZD4oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIFZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgZm9yY2VkT3B0cyA9IGFwdE1haW4uZ2V0RGVjbGFyZWRGaWVsZCgiZm9yY2VkT3B0cyIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VkT3B0cy5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VkT3B0cy5zZXQobnVsbCwgbmV3IFN0cmluZ1tde30pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25zLnZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25zLnZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZihvcHRpb25zLnZlcmJvc2UpCisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJ1aWxkTW9kZWwoU3RyaW5nIGVuZHBvaW50LCBMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRXJyb3JSZWNlaXZlckZpbHRlciBlcnJSZWNlaXZlciA9IG5ldyBFcnJvclJlY2VpdmVyRmlsdGVyKGxpc3RlbmVyKTsKKyAgICAgICAgY29udGV4dCA9IG5ldyBBbm5vdGF0aW9uUHJvY2Vzc29yQ29udGV4dCgpOworICAgICAgICB3ZWJTZXJ2aWNlQVAgPSBuZXcgV2ViU2VydmljZUFQKG9wdGlvbnMsIGNvbnRleHQsIGVyclJlY2VpdmVyLCBvdXQpOworCisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nWzldOworICAgICAgICBhcmdzWzBdID0gIi1kIjsKKyAgICAgICAgYXJnc1sxXSA9IG9wdGlvbnMuZGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgYXJnc1syXSA9ICItY2xhc3NwYXRoIjsKKyAgICAgICAgYXJnc1szXSA9IG9wdGlvbnMuY2xhc3NwYXRoOworICAgICAgICBhcmdzWzRdID0gIi1zIjsKKyAgICAgICAgYXJnc1s1XSA9IG9wdGlvbnMuc291cmNlRGlyLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBhcmdzWzZdID0gIi1YY2xhc3Nlc0FzRGVjbHMiOworICAgICAgICBhcmdzWzddID0gZW5kcG9pbnQ7CisgICAgICAgIGFyZ3NbOF0gPSAiLVhib290Y2xhc3NwYXRoL3A6IitKYXZhQ29tcGlsZXJIZWxwZXIuZ2V0SmFyRmlsZShFbmRwb2ludFJlZmVyZW5jZS5jbGFzcykrRmlsZS5wYXRoU2VwYXJhdG9yK0phdmFDb21waWxlckhlbHBlci5nZXRKYXJGaWxlKFhtbFNlZUFsc28uY2xhc3MpOworCisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGJ1ZyA2NDk5MTY1OiBpc3N1ZSB3aXRoIGphdmFjIGRlYnVnIG9wdGlvbgorICAgICAgICB3b3JrQXJvdW5kSmF2YWNEZWJ1ZygpOworICAgICAgICBpbnQgcmVzdWx0ID0gY29tLnN1bi50b29scy5hcHQuTWFpbi5wcm9jZXNzKHRoaXMsIGFyZ3MpOworICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKFdzY29tcGlsZU1lc3NhZ2VzLldTQ09NUElMRV9FUlJPUihXc2NvbXBpbGVNZXNzYWdlcy5XU0NPTVBJTEVfQ09NUElMQVRJT05fRkFJTEVEKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0aW9ucy5nZW5Xc2RsKSB7CisgICAgICAgICAgICBTdHJpbmcgdG1wUGF0aCA9IG9wdGlvbnMuZGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSsgRmlsZS5wYXRoU2VwYXJhdG9yK29wdGlvbnMuY2xhc3NwYXRoOworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoT3B0aW9ucy5wYXRoVG9VUkxzKHRtcFBhdGgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBDbGFzczw/PiBlbmRwb2ludENsYXNzOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBlbmRwb2ludENsYXNzID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKGVuZHBvaW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihXc2NvbXBpbGVNZXNzYWdlcy5XU0dFTl9DTEFTU19OT1RfRk9VTkQoZW5kcG9pbnQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQmluZGluZ0lEIGJpbmRpbmdJRCA9IFdzZ2VuT3B0aW9ucy5nZXRCaW5kaW5nSUQob3B0aW9ucy5wcm90b2NvbCk7CisgICAgICAgICAgICBpZiAoIW9wdGlvbnMucHJvdG9jb2xTZXQpIHsKKyAgICAgICAgICAgICAgICBiaW5kaW5nSUQgPSBCaW5kaW5nSUQucGFyc2UoZW5kcG9pbnRDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSdW50aW1lTW9kZWxlciBydE1vZGVsZXIgPSBuZXcgUnVudGltZU1vZGVsZXIoZW5kcG9pbnRDbGFzcywgb3B0aW9ucy5zZXJ2aWNlTmFtZSwgYmluZGluZ0lEKTsKKyAgICAgICAgICAgIHJ0TW9kZWxlci5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3J0TmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJ0TW9kZWxlci5zZXRQb3J0TmFtZShvcHRpb25zLnBvcnROYW1lKTsKKyAgICAgICAgICAgIEFic3RyYWN0U0VJTW9kZWxJbXBsIHJ0TW9kZWwgPSBydE1vZGVsZXIuYnVpbGRSdW50aW1lTW9kZWwoKTsKKworICAgICAgICAgICAgZmluYWwgRmlsZVtdIHdzZGxGaWxlTmFtZSA9IG5ldyBGaWxlWzFdOyAvLyB1c2VkIHRvIGNhcHR1cmUgdGhlIGdlbmVyYXRlZCBXU0RMIGZpbGUuCisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLEZpbGU+IHNjaGVtYUZpbGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLEZpbGU+KCk7CisgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZUxpc3Qgd3NmZWF0dXJlcyA9IG5ldyBXZWJTZXJ2aWNlRmVhdHVyZUxpc3QoZW5kcG9pbnRDbGFzcyk7CisgICAgICAgICAgICBXU0RMR2VuZXJhdG9yIHdzZGxHZW5lcmF0b3IgPSBuZXcgV1NETEdlbmVyYXRvcihydE1vZGVsLAorICAgICAgICAgICAgICAgICAgICBuZXcgV1NETFJlc29sdmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBGaWxlIHRvRmlsZShTdHJpbmcgc3VnZ2VzdGVkRmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUob3B0aW9ucy5ub25jbGFzc0Rlc3REaXIsIHN1Z2dlc3RlZEZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgUmVzdWx0IHRvUmVzdWx0KEZpbGUgZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRTeXN0ZW1JZChmaWxlLmdldFBhdGgoKS5yZXBsYWNlKCdcXCcsICcvJykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlc3VsdCBnZXRXU0RMKFN0cmluZyBzdWdnZXN0ZWRGaWxlbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IHRvRmlsZShzdWdnZXN0ZWRGaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbEZpbGVOYW1lWzBdID0gZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9SZXN1bHQoZik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVzdWx0IGdldFNjaGVtYU91dHB1dChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IHRvRmlsZShzdWdnZXN0ZWRGaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRmlsZXMucHV0KG5hbWVzcGFjZSxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9SZXN1bHQoZik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVzdWx0IGdldEFic3RyYWN0V1NETChIb2xkZXI8U3RyaW5nPiBmaWxlbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1Jlc3VsdCh0b0ZpbGUoZmlsZW5hbWUudmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZXN1bHQgZ2V0U2NoZW1hT3V0cHV0KFN0cmluZyBuYW1lc3BhY2UsIEhvbGRlcjxTdHJpbmc+IGZpbGVuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNjaGVtYU91dHB1dChuYW1lc3BhY2UsIGZpbGVuYW1lLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcGFzcyBjb3JyZWN0IGltcGwncyBjbGFzcyBuYW1lCisgICAgICAgICAgICAgICAgICAgIH0sIGJpbmRpbmdJRC5jcmVhdGVCaW5kaW5nKHdzZmVhdHVyZXMudG9BcnJheSgpKSwgY29udGFpbmVyLCBlbmRwb2ludENsYXNzLCBTZXJ2aWNlRmluZGVyLmZpbmQoV1NETEdlbmVyYXRvckV4dGVuc2lvbi5jbGFzcykudG9BcnJheSgpKTsKKyAgICAgICAgICAgIHdzZGxHZW5lcmF0b3IuZG9HZW5lcmF0aW9uKCk7CisKKyAgICAgICAgICAgIGlmKG9wdGlvbnMud3NnZW5SZXBvcnQhPW51bGwpCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVXc2dlblJlcG9ydChlbmRwb2ludENsYXNzLHJ0TW9kZWwsd3NkbEZpbGVOYW1lWzBdLHNjaGVtYUZpbGVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYSBzbWFsbCBYTUwgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBrZXkgYWN0aXZpdHkgb2Ygd3NnZW4sCisgICAgICogc28gdGhhdCB0ZXN0IGhhcm5lc3MgY2FuIHBpY2sgdXAgYXJ0aWZhY3RzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVdzZ2VuUmVwb3J0KENsYXNzPD8+IGVuZHBvaW50Q2xhc3MsIEFic3RyYWN0U0VJTW9kZWxJbXBsIHJ0TW9kZWwsIEZpbGUgd3NkbEZpbGUsIE1hcDxTdHJpbmcsRmlsZT4gc2NoZW1hRmlsZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlcG9ydE91dHB1dC5SZXBvcnQgcmVwb3J0ID0gVFhXLmNyZWF0ZShSZXBvcnRPdXRwdXQuUmVwb3J0LmNsYXNzLAorICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1TZXJpYWxpemVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvcHRpb25zLndzZ2VuUmVwb3J0KSkpKTsKKworICAgICAgICAgICAgcmVwb3J0LndzZGwod3NkbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgUmVwb3J0T3V0cHV0LndyaXRlUU5hbWUocnRNb2RlbC5nZXRTZXJ2aWNlUU5hbWUoKSwgcmVwb3J0LnNlcnZpY2UoKSk7CisgICAgICAgICAgICBSZXBvcnRPdXRwdXQud3JpdGVRTmFtZShydE1vZGVsLmdldFBvcnROYW1lKCksIHJlcG9ydC5wb3J0KCkpOworICAgICAgICAgICAgUmVwb3J0T3V0cHV0LndyaXRlUU5hbWUocnRNb2RlbC5nZXRQb3J0VHlwZU5hbWUoKSwgcmVwb3J0LnBvcnRUeXBlKCkpOworCisgICAgICAgICAgICByZXBvcnQuaW1wbENsYXNzKGVuZHBvaW50Q2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLEZpbGU+IGUgOiBzY2hlbWFGaWxlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgUmVwb3J0T3V0cHV0LlNjaGVtYSBzID0gcmVwb3J0LnNjaGVtYSgpOworICAgICAgICAgICAgICAgIHMubnMoZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgcy5sb2NhdGlvbihlLmdldFZhbHVlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXBvcnQuY29tbWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgY29kZSBmb3IgdGhlIHRlc3QsIHNvIHdlIGNhbiBiZSBsb3VzeSBpbiB0aGUgZXJyb3IgaGFuZGxpbmcKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICJOYW1lc3BhY2UiIGZvciBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0IGZpbGUuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFJlcG9ydE91dHB1dCB7CisgICAgICAgIEBYbWxFbGVtZW50KCJyZXBvcnQiKQorICAgICAgICBpbnRlcmZhY2UgUmVwb3J0IGV4dGVuZHMgVHlwZWRYbWxXcml0ZXIgeworICAgICAgICAgICAgQFhtbEVsZW1lbnQKKyAgICAgICAgICAgIHZvaWQgd3NkbChTdHJpbmcgZmlsZSk7IC8vIGxvY2F0aW9uIG9mIFdTREwKKyAgICAgICAgICAgIEBYbWxFbGVtZW50CisgICAgICAgICAgICBRdWFsaWZpZWROYW1lIHBvcnRUeXBlKCk7CisgICAgICAgICAgICBAWG1sRWxlbWVudAorICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBzZXJ2aWNlKCk7CisgICAgICAgICAgICBAWG1sRWxlbWVudAorICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBwb3J0KCk7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogTmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBoYXMge0BsaW5rIGphdmF4Lmp3cy5XZWJTZXJ2aWNlfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQFhtbEVsZW1lbnQKKyAgICAgICAgICAgIHZvaWQgaW1wbENsYXNzKFN0cmluZyBuYW1lKTsKKworICAgICAgICAgICAgQFhtbEVsZW1lbnQKKyAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBRdWFsaWZpZWROYW1lIGV4dGVuZHMgVHlwZWRYbWxXcml0ZXIgeworICAgICAgICAgICAgQFhtbEF0dHJpYnV0ZQorICAgICAgICAgICAgdm9pZCB1cmkoU3RyaW5nIG5zKTsKKyAgICAgICAgICAgIEBYbWxBdHRyaWJ1dGUKKyAgICAgICAgICAgIHZvaWQgbG9jYWxOYW1lKFN0cmluZyBsb2NhbE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIFNjaGVtYSBleHRlbmRzIFR5cGVkWG1sV3JpdGVyIHsKKyAgICAgICAgICAgIEBYbWxBdHRyaWJ1dGUKKyAgICAgICAgICAgIHZvaWQgbnMoU3RyaW5nIG5zKTsKKyAgICAgICAgICAgIEBYbWxBdHRyaWJ1dGUKKyAgICAgICAgICAgIHZvaWQgbG9jYXRpb24oU3RyaW5nIGZpbGVQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVRTmFtZSggUU5hbWUgbiwgUXVhbGlmaWVkTmFtZSB3ICkgeworICAgICAgICAgICAgdy51cmkobi5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICB3LmxvY2FsTmFtZShuLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVzYWdlKE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oV3Njb21waWxlTWVzc2FnZXMuV1NHRU5fSEVMUCgiV1NHRU4iKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihXc2NvbXBpbGVNZXNzYWdlcy5XU0dFTl9VU0FHRV9FWEFNUExFUygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHN1cHBvcnRlZE9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRPcHRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gc3VwcG9ydGVkQW5ub3RhdGlvblR5cGVzKCkgeworICAgICAgICByZXR1cm4gc3VwcG9ydGVkQW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25Qcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yKFNldDxBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uPiBzZXQsIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBhcEVudikgeworICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKQorICAgICAgICAgICAgYXBFbnYuZ2V0TWVzc2FnZXIoKS5wcmludE5vdGljZSgiXHRhcCByb3VuZDogIiArICsrcm91bmQpOworICAgICAgICB3ZWJTZXJ2aWNlQVAuaW5pdChhcEVudik7CisgICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlQVA7CisgICAgfQorCisgICAgY2xhc3MgTGlzdGVuZXIgZXh0ZW5kcyBXc2ltcG9ydExpc3RlbmVyIHsKKyAgICAgICAgQ29uc29sZUVycm9yUmVwb3J0ZXIgY2VyID0gbmV3IENvbnNvbGVFcnJvclJlcG9ydGVyKG91dCA9PSBudWxsID8gbmV3IFByaW50U3RyZWFtKG5ldyBOdWxsU3RyZWFtKCkpIDogb3V0KTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UoZmlsZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIG1zZykgeworICAgICAgICAgICAgb3V0LnByaW50bG4obXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIGNlci5lcnJvcihleGNlcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBjZXIuZmF0YWxFcnJvcihleGNlcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBjZXIud2FybmluZyhleGNlcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBjZXIuaW5mbyhleGNlcHRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQcm9jZXNzb3IgZG9lc24ndCBleGFtaW5lIGFueSBvcHRpb25zLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gc3VwcG9ydGVkT3B0aW9ucyA9IENvbGxlY3Rpb25zCisgICAgICAgICAgICAudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oKSk7CisKKyAgICAvKgorICAgICAqIEFsbCBhbm5vdGF0aW9uIHR5cGVzIGFyZSBzdXBwb3J0ZWQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBzdXBwb3J0ZWRBbm5vdGF0aW9uczsKKyAgICBzdGF0aWMgeworICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIHR5cGVzLmFkZCgiKiIpOworICAgICAgICB0eXBlcy5hZGQoImphdmF4Lmp3cy4qIik7CisgICAgICAgIHR5cGVzLmFkZCgiamF2YXguandzLnNvYXAuKiIpOworICAgICAgICBzdXBwb3J0ZWRBbm5vdGF0aW9ucyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24odHlwZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL1dzaW1wb3J0TGlzdGVuZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL1dzaW1wb3J0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I4YzhmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvV3NpbXBvcnRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGU7CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuRXJyb3JMaXN0ZW5lcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgY2xhc3MgV3NpbXBvcnRMaXN0ZW5lciBpbXBsZW1lbnRzIEVycm9yTGlzdGVuZXIgeworICAgIC8qKgorICAgICAqIENhbGxlZCBmb3IgZWFjaCBmaWxlIGdlbmVyYXRlZCBieSB3c2ltcG9ydCBvciB3c2dlbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBmaWxlIG5hbWUgaW5jbHVkZXMgdGhlIHBhdGggcG9ydGlvbnMgdGhhdCBjb3JyZXNwb25kIHdpdGggdGhlIHBhY2thZ2UgbmFtZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoZW4gZ2VuZXJhdGluZyBmaWxlcyBpbnRvIGEgZGlyZWN0b3J5LCBmaWxlIG5hbWVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlCisgICAgICogb3V0cHV0IGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlTmFtZQorICAgICAqICAgICAgZmlsZSBuYW1lcyBsaWtlICJvcmcvYWNtZS9mb28vRm9vLmphdmEiCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZWRGaWxlKFN0cmluZyBmaWxlTmFtZSkge30KKworICAgIC8qKgorICAgICAqIE90aGVyIG1pc2NlbGxlbm91cyBtZXNzYWdlcyB0aGF0IGRvIG5vdCBoYXZlIHN0cnVjdHVyZXMKKyAgICAgKiB3aWxsIGJlIHJlcG9ydGVkIHRocm91Z2ggdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGxpa2Uge0BsaW5rIGphdmEuaW8uUHJpbnRTdHJlYW0jcHJpbnRsbihTdHJpbmcpfS4KKyAgICAgKiBUaGUgY2FsbGVlIGlzIGV4cGVjdGVkIHRvIGFkZCAnXG4nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIG1zZykge30KKworICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmZvKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCisgICAgfQorCisgICAgLyoqCisgICAgICogd3NpbXBvcnQgd2lsbCBwZXJpb2RpY2FsbHkgaW52b2tlIHRoaXMgbWV0aG9kIHRvIHNlZSBpZiBpdCBzaG91bGQgY2FuY2VsIGEgY29tcGlsYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0cnVlIGlmIHRoZSB7QGxpbmsgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRMaXN0ZW5lcn0gd2FudHMgdG8gYWJvcnQgdGhlIHByb2Nlc3NpbmcuCisgICAgICogQHNpbmNlIDIuMQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL1dzaW1wb3J0T3B0aW9ucy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvV3NpbXBvcnRPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3YmY5MgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3Njb21waWxlL1dzaW1wb3J0T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlOworCitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkNvZGVNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5Db25maWd1cmF0aW9uTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuV3Njb21waWxlTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLkZvcmtFbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuamF4d3MuSkFYV1NCaW5kaW5nc0NvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuU2NoZW1hQ29tcGlsZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlNwZWNWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5YSkM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLlV0aWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSkFYV1NVdGlsczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5Mb2NhdG9ySW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBjbGFzcyBXc2ltcG9ydE9wdGlvbnMgZXh0ZW5kcyBPcHRpb25zIHsKKyAgICAvKioKKyAgICAgKiAtd3NkbExvY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB3c2RsTG9jYXRpb247CisKKyAgICAvKioKKyAgICAgKiBBY3R1YWxseSBzdG9yZXMge0BsaW5rIGNvbS5zdW4ub3JnLmFwYWNoZS54bWwuaW50ZXJuYWwucmVzb2x2ZXIudG9vbHMuQ2F0YWxvZ1Jlc29sdmVyfSwgYnV0IHRoZSBmaWVsZAorICAgICAqIHR5cGUgaXMgbWFkZSB0byB7QGxpbmsgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXJ9IHNvIHRoYXQgWEpDIGNhbiBiZQorICAgICAqIHVzZWQgZXZlbiBpZiByZXNvbHZlci5qYXIgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgLXAgb3B0aW9uIHRoYXQgc2hvdWxkIGNvbnRyb2wgdGhlIGRlZmF1bHQgSmF2YSBwYWNrYWdlIHRoYXQKKyAgICAgKiB3aWxsIGNvbnRhaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBOdWxsIGlmIHVuc3BlY2lmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVmYXVsdFBhY2thZ2UgPSBudWxsOworCisgICAgLyoqCisgICAgICogSkFYQidzIHtAbGluayBTY2hlbWFDb21waWxlcn0gdG8gYmUgdXNlZCBmb3IgaGFuZGxpbmcgdGhlIHNjaGVtYSBwb3J0aW9uLgorICAgICAqIFRoaXMgb2JqZWN0IGlzIGFsc28gY29uZmlndXJlZCB0aHJvdWdoIG9wdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTY2hlbWFDb21waWxlciBzY2hlbWFDb21waWxlciA9IFhKQy5jcmVhdGVTY2hlbWFDb21waWxlcigpOworCisgICAgcHVibGljIEpDb2RlTW9kZWwgZ2V0Q29kZU1vZGVsKCkgeworICAgICAgICBpZihjb2RlTW9kZWwgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvZGVNb2RlbCA9IG5ldyBKQ29kZU1vZGVsKCk7CisgICAgICAgIHJldHVybiBjb2RlTW9kZWw7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUNvbXBpbGVyIGdldFNjaGVtYUNvbXBpbGVyKCkgeworICAgICAgICBzY2hlbWFDb21waWxlci5zZXRUYXJnZXRWZXJzaW9uKFNwZWNWZXJzaW9uLnBhcnNlKHRhcmdldC5nZXRWZXJzaW9uKCkpKTsKKyAgICAgICAgc2NoZW1hQ29tcGlsZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOworICAgICAgICByZXR1cm4gc2NoZW1hQ29tcGlsZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29kZU1vZGVsKEpDb2RlTW9kZWwgY29kZU1vZGVsKSB7CisgICAgICAgIHRoaXMuY29kZU1vZGVsID0gY29kZU1vZGVsOworICAgIH0KKworICAgIHByaXZhdGUgSkNvZGVNb2RlbCBjb2RlTW9kZWw7CisKKyAgICAvKiogLVhuby1hZGRyZXNzaW5nLWRhdGFiaW5kaW5nIG9wdGlvbiB0byBkaXNhYmxlIGFkZHJlc3NpbmcgbmFtZXNwYWNlIGRhdGEgYmluZGluZy4gVGhpcyBpcworICAgICAqIGV4cGVyaW1lbnRhbCBzd2l0Y2ggYW5kIHdpbGwgYmUgd29ya2luZyBhcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIHRpbGwKKyAgICAgKiBqYXhiIGNhbiBwcm92aWRlIGEgYmV0dGVyIHdheSB0byBzZWxlbGN0aXZlbHkgZGlzYWJsZSBjb21waWxpbmcgb2YgYW4KKyAgICAgKiBzY2hlbWEgY29tcG9uZW50LgorICAgICAqICoqLworICAgIHB1YmxpYyBib29sZWFuIG5vQWRkcmVzc2luZ0JiaW5kaW5nOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzLCBpbnQgaSkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGogPSBzdXBlci5wYXJzZUFyZ3VtZW50cyhhcmdzICxpKTsKKyAgICAgICAgaWYoaj4wKSByZXR1cm4gajsgICAvLyB1bmRlcnN0b29kIGJ5IHRoZSBzdXBlciBjbGFzcworCisgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLWIiKSkgeworICAgICAgICAgICAgYWRkQmluZGluZ3MocmVxdWlyZUFyZ3VtZW50KCItYiIsIGFyZ3MsICsraSkpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi13c2RsbG9jYXRpb24iKSkgeworICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gcmVxdWlyZUFyZ3VtZW50KCItd3NkbGxvY2F0aW9uIiwgYXJncywgKytpKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcCIpKSB7CisgICAgICAgICAgICBkZWZhdWx0UGFja2FnZSA9IHJlcXVpcmVBcmd1bWVudCgiLXAiLCBhcmdzLCArK2kpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1jYXRhbG9nIikpIHsKKyAgICAgICAgICAgIFN0cmluZyBjYXRhbG9nID0gcmVxdWlyZUFyZ3VtZW50KCItY2F0YWxvZyIsIGFyZ3MsICsraSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChlbnRpdHlSZXNvbHZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYXRhbG9nICE9IG51bGwgJiYgY2F0YWxvZy5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlSZXNvbHZlciA9IFhtbFV0aWwuY3JlYXRlRW50aXR5UmVzb2x2ZXIoSkFYV1NVdGlscy5nZXRGaWxlT3JVUkwoSkFYV1NVdGlscy5hYnNvbHV0aXplKFV0aWwuZXNjYXBlU3BhY2UoY2F0YWxvZykpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXRhbG9nICE9IG51bGwgJiYgY2F0YWxvZy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgRW50aXR5UmVzb2x2ZXIgZXIgPSBYbWxVdGlsLmNyZWF0ZUVudGl0eVJlc29sdmVyKEpBWFdTVXRpbHMuZ2V0RmlsZU9yVVJMKEpBWFdTVXRpbHMuYWJzb2x1dGl6ZShVdGlsLmVzY2FwZVNwYWNlKGNhdGFsb2cpKSkpOworICAgICAgICAgICAgICAgICAgICBlbnRpdHlSZXNvbHZlciA9IG5ldyBGb3JrRW50aXR5UmVzb2x2ZXIoZXIsIGVudGl0eVJlc29sdmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKFdzY29tcGlsZU1lc3NhZ2VzLldTSU1QT1JUX0ZBSUxFRF9UT19QQVJTRShjYXRhbG9nLCBlLmdldE1lc3NhZ2UoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItaHR0cHByb3h5OiIpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhcmdzW2ldLnN1YnN0cmluZygxMSk7CisgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihXc2NvbXBpbGVNZXNzYWdlcy5XU0NPTVBJTEVfSU5WQUxJRF9PUFRJT04oYXJnc1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGluZGV4ID0gdmFsdWUuaW5kZXhPZignOicpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJwcm94eVNldCIsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJwcm94eUhvc3QiLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJwcm94eVBvcnQiLCAiODA4MCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInByb3h5U2V0IiwgInRydWUiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInByb3h5SG9zdCIsIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgicHJveHlQb3J0IiwgdmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1Ybm8tYWRkcmVzc2luZy1kYXRhYmluZGluZyIpKSB7CisgICAgICAgICAgICBub0FkZHJlc3NpbmdCYmluZGluZyA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi1CIikpIHsKKyAgICAgICAgICAgIC8vIEpBWEIgb3B0aW9uIHBhc3MgdGhyb3VnaC4KKyAgICAgICAgICAgIFN0cmluZ1tdIHN1YkNtZCA9IG5ldyBTdHJpbmdbYXJncy5sZW5ndGgtaV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsaSxzdWJDbWQsMCxzdWJDbWQubGVuZ3RoKTsKKyAgICAgICAgICAgIHN1YkNtZFswXSA9IHN1YkNtZFswXS5zdWJzdHJpbmcoMik7IC8vIHRyaW0gb2ZmIHRoZSBmaXJzdCAiLUIiCisKKyAgICAgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLk9wdGlvbnMgamF4Yk9wdGlvbnMgPSBzY2hlbWFDb21waWxlci5nZXRPcHRpb25zKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCByID0gamF4Yk9wdGlvbnMucGFyc2VBcmd1bWVudChzdWJDbWQsIDApOworICAgICAgICAgICAgICAgIGlmKHI9PTApIHsKKyAgICAgICAgICAgICAgICAgICAgLy9Ecml2ZXIudXNhZ2UoamF4Yk9wdGlvbnMsZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NJTVBPUlRfTk9fU1VDSF9KQVhCX09QVElPTihzdWJDbWRbMF0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICB9IGNhdGNoIChjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5CYWRDb21tYW5kTGluZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy9Ecml2ZXIudXNhZ2UoamF4Yk9wdGlvbnMsZmFsc2UpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOyAvLyB3aGF0J3MgdGhpcyBvcHRpb24/CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24geworICAgICAgICBpZiAod3NkbHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NJTVBPUlRfTUlTU0lOR19GSUxFKCkpOworICAgICAgICB9CisgICAgICAgIGlmKHdzZGxMb2NhdGlvbiA9PSBudWxsKXsKKyAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IHdzZGxzLmdldCgwKS5nZXRTeXN0ZW1JZCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlKFN0cmluZyBhcmcpIHRocm93cyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbiB7CisgICAgICAgIGFkZEZpbGUoYXJnLCB3c2RscywgIioud3NkbCIpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbnB1dFNvdXJjZT4gd3NkbHMgPSBuZXcgQXJyYXlMaXN0PElucHV0U291cmNlPigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbnB1dFNvdXJjZT4gc2NoZW1hcyA9IG5ldyBBcnJheUxpc3Q8SW5wdXRTb3VyY2U+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElucHV0U291cmNlPiBiaW5kaW5nRmlsZXMgPSBuZXcgQXJyYXlMaXN0PElucHV0U291cmNlPigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbnB1dFNvdXJjZT4gamF4d3NDdXN0b21CaW5kaW5ncyA9IG5ldyBBcnJheUxpc3Q8SW5wdXRTb3VyY2U+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElucHV0U291cmNlPiBqYXhiQ3VzdG9tQmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PElucHV0U291cmNlPigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxFbGVtZW50PiBoYW5kbGVyQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKKworICAgIC8qKgorICAgICAqIFRoZXJlIGlzIHN1cHBvc2VkIHRvIGJlIG9uZSBoYW5kbGVyIGNoYWluIHBlciBnZW5lcmF0ZWQgU0VJLgorICAgICAqIFRPRE86IFRoZXJlIGlzIHBvc3NpYmxlIGJ1ZywgaG93IHRvIGFzc29jaWF0ZSBhIEBIYW5kbGVyQ2hhaW4KKyAgICAgKiB3aXRoIGVhY2ggcG9ydCBvbiB0aGUgZ2VuZXJhdGVkIFNFSS4gRm9yIG5vdyBsZXRzIHByZXNlcnZlIHRoZSBKQVhXUyAyLjAgRkNTCisgICAgICogYmVoYXZpb3VyIGFuZCBnZW5lcmF0ZSBvbmx5IG9uZSBASGFuZGxlckNoYWluIG9uIHRoZSBTRUkKKyAgICAgKi8KKyAgICBwdWJsaWMgRWxlbWVudCBnZXRIYW5kbGVyQ2hhaW5Db25maWd1cmF0aW9uKCl7CisgICAgICAgIGlmKGhhbmRsZXJDb25maWdzLnNpemUoKSA+IDApCisgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNvbmZpZ3MuZ2V0KDApOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVyQ2hhaW5Db25maWd1cmF0aW9uKEVsZW1lbnQgY29uZmlnKXsKKyAgICAgICAgaGFuZGxlckNvbmZpZ3MuYWRkKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIElucHV0U291cmNlW10gZ2V0V1NETHMoKSB7CisgICAgICAgIHJldHVybiB3c2Rscy50b0FycmF5KG5ldyBJbnB1dFNvdXJjZVt3c2Rscy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTb3VyY2VbXSBnZXRTY2hlbWFzKCkgeworICAgICAgICByZXR1cm4gc2NoZW1hcy50b0FycmF5KG5ldyBJbnB1dFNvdXJjZVtzY2hlbWFzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFNvdXJjZVtdIGdldFdTRExCaW5kaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIGpheHdzQ3VzdG9tQmluZGluZ3MudG9BcnJheShuZXcgSW5wdXRTb3VyY2VbamF4d3NDdXN0b21CaW5kaW5ncy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTb3VyY2VbXSBnZXRTY2hlbWFCaW5kaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIGpheGJDdXN0b21CaW5kaW5ncy50b0FycmF5KG5ldyBJbnB1dFNvdXJjZVtqYXhiQ3VzdG9tQmluZGluZ3Muc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkV1NETChGaWxlIHNvdXJjZSkgeworICAgICAgICBhZGRXU0RMKGZpbGVUb0lucHV0U291cmNlKHNvdXJjZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFdTREwoSW5wdXRTb3VyY2UgaXMpIHsKKyAgICAgICAgd3NkbHMuYWRkKGFic29sdXRpemUoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTY2hlbWEoRmlsZSBzb3VyY2UpIHsKKyAgICAgICAgYWRkU2NoZW1hKGZpbGVUb0lucHV0U291cmNlKHNvdXJjZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShJbnB1dFNvdXJjZSBpcykgeworICAgICAgICBzY2hlbWFzLmFkZChpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnB1dFNvdXJjZSBmaWxlVG9JbnB1dFNvdXJjZShGaWxlIHNvdXJjZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHVybCA9IHNvdXJjZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKFV0aWwuZXNjYXBlU3BhY2UodXJsKSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKHNvdXJjZS5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjdXJzaXZlbHkgc2NhbiBkaXJlY3RvcmllcyBhbmQgYWRkIGFsbCBYU0QgZmlsZXMgaW4gaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkR3JhbW1hclJlY3Vyc2l2ZShGaWxlIGRpcikgeworICAgICAgICBhZGRSZWN1cnNpdmUoZGlyLCAiLndzZGwiLCB3c2Rscyk7CisgICAgICAgIGFkZFJlY3Vyc2l2ZShkaXIsICIueHNkIiwgc2NoZW1hcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBpbnB1dCBzY2hlbWEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV1NETEJpbmRGaWxlKElucHV0U291cmNlIGlzKSB7CisgICAgICAgIGpheHdzQ3VzdG9tQmluZGluZ3MuYWRkKGFic29sdXRpemUoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTY2hlbW1hQmluZEZpbGUoSW5wdXRTb3VyY2UgaXMpIHsKKyAgICAgICAgamF4YkN1c3RvbUJpbmRpbmdzLmFkZChhYnNvbHV0aXplKGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlY3Vyc2l2ZShGaWxlIGRpciwgU3RyaW5nIHN1ZmZpeCwgTGlzdDxJbnB1dFNvdXJjZT4gcmVzdWx0KSB7CisgICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHJldHVybjsgLy8gd29yayBkZWZlbnNpdmVseQorCisgICAgICAgIGZvciAoRmlsZSBmIDogZmlsZXMpIHsKKyAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICAgICAgYWRkUmVjdXJzaXZlKGYsIHN1ZmZpeCwgcmVzdWx0KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGYuZ2V0UGF0aCgpLmVuZHNXaXRoKHN1ZmZpeCkpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChhYnNvbHV0aXplKGZpbGVUb0lucHV0U291cmNlKGYpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIElucHV0U291cmNlIGFic29sdXRpemUoSW5wdXRTb3VyY2UgaXMpIHsKKyAgICAgICAgLy8gYWJzb2x1dGl6ZSBhbGwgdGhlIHN5c3RlbSBJRHMgaW4gdGhlIGlucHV0LAorICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBtYXAgc3lzdGVtIElEcyB0byBET00gdHJlZXMuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgYmFzZVVSTCA9IG5ldyBGaWxlKCIuIikuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJMKCk7CisgICAgICAgICAgICBpcy5zZXRTeXN0ZW1JZChuZXcgVVJMKGJhc2VVUkwsIGlzLmdldFN5c3RlbUlkKCkpLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmluZGluZ3MoU3RyaW5nIG5hbWUpIHRocm93cyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbiB7CisgICAgICAgIGFkZEZpbGUobmFtZSwgYmluZGluZ0ZpbGVzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSB0b2tlbiB0byBhIGZpbGUgKG9yIGEgc2V0IG9mIGZpbGVzKQorICAgICAqIGFuZCBhZGQgdGhlbSBhcyB7QGxpbmsgSW5wdXRTb3VyY2V9IHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWZmaXggSWYgdGhlIGdpdmVuIHRva2VuIGlzIGEgZGlyZWN0b3J5IG5hbWUsIHdlIGRvIGEgcmVjdXNpdmUgc2VhcmNoCisgICAgICogICAgICAgICAgICAgICBhbmQgZmluZCBhbGwgZmlsZXMgdGhhdCBoYXZlIHRoZSBnaXZlbiBzdWZmaXguCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEZpbGUoU3RyaW5nIG5hbWUsIExpc3Q8SW5wdXRTb3VyY2U+IHRhcmdldCwgU3RyaW5nIHN1ZmZpeCkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHNyYzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNyYyA9IFV0aWwuZ2V0RmlsZU9yVVJMKG5hbWUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oV3Njb21waWxlTWVzc2FnZXMuV1NJTVBPUlRfTk9UX0FfRklMRV9OT1JfVVJMKG5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgVVJMKSB7CisgICAgICAgICAgICB0YXJnZXQuYWRkKGFic29sdXRpemUobmV3IElucHV0U291cmNlKFV0aWwuZXNjYXBlU3BhY2UoKChVUkwpIHNyYykudG9FeHRlcm5hbEZvcm0oKSkpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlIGZzcmMgPSAoRmlsZSkgc3JjOworICAgICAgICAgICAgaWYgKGZzcmMuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGFkZFJlY3Vyc2l2ZShmc3JjLCBzdWZmaXgsIHRhcmdldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRhcmdldC5hZGQoYWJzb2x1dGl6ZShmaWxlVG9JbnB1dFNvdXJjZShmc3JjKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeHBvc2luZyBpdCBhcyBhIHB1YmxpYyBtZXRob2QgdG8gYWxsb3cgZXh0ZXJuYWwgdG9vbHMgc3VjaCBhcyBOQiB0byByZWFkIGZyb20gd3NkbCBtb2RlbCBhbmQgd29yayBvbiBpdC4KKyAgICAgKiBUT0RPOiBXU0RMIG1vZGVsIG5lZWRzIHRvIGJlIGV4cG9zZWQgLSBiYXNpY2FsbHkgYXQgdG9vbCB0aW1lIHdlIG5lZWQgdG8gdXNlIHRoZSBydW50aW13IHdzZGwgbW9kZWwKKyAgICAgKgorICAgICAqIEJpbmRpbmcgZmlsZXMgY291bGQgYmUgamF4d3Mgb3IgamF4Yi4gVGhpcyBtZXRob2QgaWRlbnRpZmllcyBqYXh3cyBhbmQgamF4YiBiaW5kaW5nIGZpbGVzIGFuZCBrZWVwcyB0aGVtIHNlcGFyYXRlbHkuIGpheGIgYmluZGluZyBmaWxlcyBhcmUgZ2l2ZW4gc2VwYXJhdGVseQorICAgICAqIHRvIEpBWEIgaW4ge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbC5KQVhCTW9kZWxCdWlsZGVyfQorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVyIHtAbGluayBFcnJvclJlY2VpdmVyfQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBhcnNlQmluZGluZ3MoRXJyb3JSZWNlaXZlciByZWNlaXZlcil7CisgICAgICAgIGZvciAoSW5wdXRTb3VyY2UgaXMgOiBiaW5kaW5nRmlsZXMpIHsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZShpcyx0cnVlKTsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7CisgICAgICAgICAgICBpZiAocmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUykpIHsKKyAgICAgICAgICAgICAgICBqYXh3c0N1c3RvbUJpbmRpbmdzLmFkZChpcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYQl9CSU5ESU5HUykgfHwKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMobmV3IFFOYW1lKFNjaGVtYUNvbnN0YW50cy5OU19YU0QsICJzY2hlbWEiKSkpIHsKKyAgICAgICAgICAgICAgICBqYXhiQ3VzdG9tQmluZGluZ3MuYWRkKGlzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9jYXRvckltcGwgbG9jYXRvciA9IG5ldyBMb2NhdG9ySW1wbCgpOworICAgICAgICAgICAgICAgIGxvY2F0b3Iuc2V0U3lzdGVtSWQocmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgICAgICAgICAgbG9jYXRvci5zZXRQdWJsaWNJZChyZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRQdWJsaWNJZCgpKTsKKyAgICAgICAgICAgICAgICBsb2NhdG9yLnNldExpbmVOdW1iZXIocmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpKTsKKyAgICAgICAgICAgICAgICBsb2NhdG9yLnNldENvbHVtbk51bWJlcihyZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRDb2x1bW5OdW1iZXIoKSk7CisgICAgICAgICAgICAgICAgcmVjZWl2ZXIud2FybmluZyhsb2NhdG9yLCBDb25maWd1cmF0aW9uTWVzc2FnZXMuQ09ORklHVVJBVElPTl9OT1RfQklORElOR19GSUxFKGlzLmdldFN5c3RlbUlkKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvV3NpbXBvcnRUb29sLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzY29tcGlsZS9Xc2ltcG9ydFRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDJiYjk0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2NvbXBpbGUvV3NpbXBvcnRUb29sLmphdmEKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGU7CisKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5Db2RlV3JpdGVyOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLndyaXRlci5Qcm9ncmVzc0NvZGVXcml0ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5Ub29sVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS5USmF2YUdlbmVyYXRvckV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnByb2Nlc3Nvci5nZW5lcmF0b3IuQ3VzdG9tRXhjZXB0aW9uR2VuZXJhdG9yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLmdlbmVyYXRvci5TZWlHZW5lcmF0b3I7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuZ2VuZXJhdG9yLlNlcnZpY2VHZW5lcmF0b3I7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWwuTW9kZWw7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IubW9kZWxlci53c2RsLkNvbnNvbGVFcnJvclJlcG9ydGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLm1vZGVsZXIud3NkbC5XU0RMTW9kZWxlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5Xc2NvbXBpbGVNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5Xc2RsTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMudXRpbC5OdWxsU3RyZWFtOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQ29udGFpbmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUZpbmRlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbzsKK2ltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBjbGFzcyBXc2ltcG9ydFRvb2wgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lNUE9SVCA9ICJ3c2ltcG9ydCI7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBvdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250YWluZXIgY29udGFpbmVyOworCisgICAgLyoqCisgICAgICogV3NpbXBvcnQgc3BlY2lmaWMgb3B0aW9ucworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgV3NpbXBvcnRPcHRpb25zIG9wdGlvbnMgPSBuZXcgV3NpbXBvcnRPcHRpb25zKCk7CisKKyAgICBwdWJsaWMgV3NpbXBvcnRUb29sKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgdGhpcyhvdXQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBXc2ltcG9ydFRvb2woT3V0cHV0U3RyZWFtIGxvZ1N0cmVhbSwgQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICB0aGlzLm91dCA9IChsb2dTdHJlYW0gaW5zdGFuY2VvZiBQcmludFN0cmVhbSk/KFByaW50U3RyZWFtKWxvZ1N0cmVhbTpuZXcgUHJpbnRTdHJlYW0obG9nU3RyZWFtKTsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBydW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBjbGFzcyBMaXN0ZW5lciBleHRlbmRzIFdzaW1wb3J0TGlzdGVuZXIgeworICAgICAgICAgICAgQ29uc29sZUVycm9yUmVwb3J0ZXIgY2VyID0gbmV3IENvbnNvbGVFcnJvclJlcG9ydGVyKG91dCA9PSBudWxsID8gbmV3IFByaW50U3RyZWFtKG5ldyBOdWxsU3RyZWFtKCkpIDogb3V0KTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZWRGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UoZmlsZU5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIG1zZykgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKG1zZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgY2VyLmVycm9yKGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBjZXIuZmF0YWxFcnJvcihleGNlcHRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgY2VyLndhcm5pbmcoZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBpbmZvKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGNlci5pbmZvKGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVuYWJsZURlYnVnZ2luZygpeworICAgICAgICAgICAgICAgIGNlci5lbmFibGVEZWJ1Z2dpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbCBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpOworICAgICAgICBFcnJvclJlY2VpdmVyRmlsdGVyIHJlY2VpdmVyID0gbmV3IEVycm9yUmVjZWl2ZXJGaWx0ZXIobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuaW5mbyhleGNlcHRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5xdWlldCkKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIud2FybmluZyhleGNlcHRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvbGxBYm9ydCgpIHRocm93cyBBYm9ydEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLmlzQ2FuY2VsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogYXJncykgeworICAgICAgICAgICAgaWYgKGFyZy5lcXVhbHMoIi12ZXJzaW9uIikpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5tZXNzYWdlKFRvb2xWZXJzaW9uLlZFUlNJT04uQlVJTERfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wdGlvbnMucGFyc2VBcmd1bWVudHMoYXJncyk7CisgICAgICAgICAgICBvcHRpb25zLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBpZihvcHRpb25zLmRlYnVnTW9kZSkKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5lbmFibGVEZWJ1Z2dpbmcoKTsKKyAgICAgICAgICAgIG9wdGlvbnMucGFyc2VCaW5kaW5ncyhyZWNlaXZlcik7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYoICFvcHRpb25zLnF1aWV0ICkKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubWVzc2FnZShXc2NvbXBpbGVNZXNzYWdlcy5XU0lNUE9SVF9QQVJTSU5HX1dTREwoKSk7CisKKyAgICAgICAgICAgICAgICBXU0RMTW9kZWxlciB3c2RsTW9kZWxlciA9IG5ldyBXU0RMTW9kZWxlcihvcHRpb25zLCByZWNlaXZlcik7CisgICAgICAgICAgICAgICAgTW9kZWwgd3NkbE1vZGVsID0gd3NkbE1vZGVsZXIuYnVpbGRNb2RlbCgpOworICAgICAgICAgICAgICAgIGlmICh3c2RsTW9kZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5tZXNzYWdlKFdzZGxNZXNzYWdlcy5QQVJTSU5HX1BBUlNFX0ZBSUxFRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vZ2VuZXJhdGVkIGNvZGUKKyAgICAgICAgICAgICAgICBpZiggIW9wdGlvbnMucXVpZXQgKQorICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5tZXNzYWdlKFdzY29tcGlsZU1lc3NhZ2VzLldTSU1QT1JUX0dFTkVSQVRJTkdfQ09ERSgpKTsKKworICAgICAgICAgICAgICAgIFRKYXZhR2VuZXJhdG9yRXh0ZW5zaW9uW10gZ2VuRXh0biA9IFNlcnZpY2VGaW5kZXIuZmluZChUSmF2YUdlbmVyYXRvckV4dGVuc2lvbi5jbGFzcykudG9BcnJheSgpOworICAgICAgICAgICAgICAgIEN1c3RvbUV4Y2VwdGlvbkdlbmVyYXRvci5nZW5lcmF0ZSh3c2RsTW9kZWwsICBvcHRpb25zLCByZWNlaXZlcik7CisgICAgICAgICAgICAgICAgU2VpR2VuZXJhdG9yLmdlbmVyYXRlKHdzZGxNb2RlbCwgb3B0aW9ucywgcmVjZWl2ZXIsIGdlbkV4dG4pOworICAgICAgICAgICAgICAgIFNlcnZpY2VHZW5lcmF0b3IuZ2VuZXJhdGUod3NkbE1vZGVsLCBvcHRpb25zLCByZWNlaXZlcik7CisgICAgICAgICAgICAgICAgQ29kZVdyaXRlciBjdyA9IG5ldyBXU0NvZGVXcml0ZXIob3B0aW9ucy5zb3VyY2VEaXIsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgIGN3ID0gbmV3IFByb2dyZXNzQ29kZVdyaXRlcihjdywgU3lzdGVtLm91dCk7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXRDb2RlTW9kZWwoKS5idWlsZChjdyk7CisgICAgICAgICAgICB9IGNhdGNoKEFib3J0RXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIC8vZXJyb3IgbWlnaHQgaGF2ZSBiZWVuIHJlcG9ydGVkCisgICAgICAgICAgICB9Y2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZWNlaXZlci5lcnJvcihlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFvcHRpb25zLm5vY29tcGlsZSl7CisgICAgICAgICAgICAgICAgaWYoIWNvbXBpbGVHZW5lcmF0ZWRDbGFzc2VzKHJlY2VpdmVyKSl7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm1lc3NhZ2UoV3Njb21waWxlTWVzc2FnZXMuV1NDT01QSUxFX0NPTVBJTEFUSU9OX0ZBSUxFRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChPcHRpb25zLldlQXJlRG9uZSBkb25lKSB7CisgICAgICAgICAgICB1c2FnZShkb25lLmdldE9wdGlvbnMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVzYWdlKGUuZ2V0T3B0aW9ucygpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBmaW5hbGx5eworICAgICAgICAgICAgaWYoIW9wdGlvbnMua2VlcCl7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5yZW1vdmVHZW5lcmF0ZWRGaWxlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eVJlc29sdmVyKEVudGl0eVJlc29sdmVyIHJlc29sdmVyKXsKKyAgICAgICAgdGhpcy5vcHRpb25zLmVudGl0eVJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGlsZUdlbmVyYXRlZENsYXNzZXMoRXJyb3JSZWNlaXZlciByZWNlaXZlcil7CisgICAgICAgIExpc3Q8U3RyaW5nPiBzb3VyY2VGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgICAgIGZvciAoRmlsZSBmIDogb3B0aW9ucy5nZXRHZW5lcmF0ZWRGaWxlcygpKSB7CisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSAmJiBmLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphdmEiKSkgeworICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVzLmFkZChmLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzb3VyY2VGaWxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NEaXIgPSBvcHRpb25zLmRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NwYXRoU3RyaW5nID0gY3JlYXRlQ2xhc3NwYXRoU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1s1ICsgKG9wdGlvbnMuZGVidWcgPyAxIDogMCkKKyAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2VGaWxlcy5zaXplKCldOworICAgICAgICAgICAgYXJnc1swXSA9ICItZCI7CisgICAgICAgICAgICBhcmdzWzFdID0gY2xhc3NEaXI7CisgICAgICAgICAgICBhcmdzWzJdID0gIi1jbGFzc3BhdGgiOworICAgICAgICAgICAgYXJnc1szXSA9IGNsYXNzcGF0aFN0cmluZzsKKyAgICAgICAgICAgIGFyZ3NbNF0gPSAiLVhib290Y2xhc3NwYXRoL3A6IitKYXZhQ29tcGlsZXJIZWxwZXIuZ2V0SmFyRmlsZShFbmRwb2ludFJlZmVyZW5jZS5jbGFzcykrRmlsZS5wYXRoU2VwYXJhdG9yK0phdmFDb21waWxlckhlbHBlci5nZXRKYXJGaWxlKFhtbFNlZUFsc28uY2xhc3MpOworICAgICAgICAgICAgaW50IGJhc2VJbmRleCA9IDU7CisgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWJ1ZykgeworICAgICAgICAgICAgICAgIGFyZ3NbYmFzZUluZGV4KytdID0gIi1nIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRmlsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhcmdzW2Jhc2VJbmRleCArIGldID0gc291cmNlRmlsZXMuZ2V0KGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gSmF2YUNvbXBpbGVySGVscGVyLmNvbXBpbGUoYXJncywgb3V0LCByZWNlaXZlcik7CisgICAgICAgIH0KKyAgICAgICAgLy90aGVyZSBhcmUgbm8gZmlsZXMgdG8gY29tcGlsZSwgc28gcmV0dXJuIHRydWU/CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUNsYXNzcGF0aFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdXNhZ2UoT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihXc2NvbXBpbGVNZXNzYWdlcy5XU0lNUE9SVF9IRUxQKFdTSU1QT1JUKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihXc2NvbXBpbGVNZXNzYWdlcy5XU0lNUE9SVF9VU0FHRV9FWEFNUExFUygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvQmluZGluZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0JpbmRpbmcuamF2YQppbmRleCAyOGIyZjNiLi5hY2VjYzFhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvQmluZGluZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9CaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDI4IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLio7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuV3NkbE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkFib3J0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRGVmaW5pbmc7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlSZWZlcmVuY2VBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmlsaXR5SGVscGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkdsb2JhbEVudGl0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLktpbmQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5RTmFtZUFjdGlvbjsKLQogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgImJpbmRpbmciIFdTREwgZWxlbWVudC4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIEJpbmRpbmcgZXh0ZW5kcyBHbG9iYWxFbnRpdHkgaW1wbGVtZW50cyBFeHRlbnNpYmxlIHsKK3B1YmxpYyBjbGFzcyBCaW5kaW5nIGV4dGVuZHMgR2xvYmFsRW50aXR5IGltcGxlbWVudHMgVFdTRExFeHRlbnNpYmxlIHsKIAotICAgIHB1YmxpYyBCaW5kaW5nKERlZmluaW5nIGRlZmluaW5nKSB7Ci0gICAgICAgIHN1cGVyKGRlZmluaW5nKTsKKyAgICBwdWJsaWMgQmluZGluZyhEZWZpbmluZyBkZWZpbmluZywgTG9jYXRvciBsb2NhdG9yLCBFcnJvclJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIHN1cGVyKGRlZmluaW5nLCBsb2NhdG9yLCByZWNlaXZlcik7CiAgICAgICAgIF9vcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICBfaGVscGVyID0gbmV3IEV4dGVuc2liaWxpdHlIZWxwZXIoKTsKICAgICB9CkBAIC03Myw3ICs2OCwxMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBQb3J0VHlwZSByZXNvbHZlUG9ydFR5cGUoQWJzdHJhY3REb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICByZXR1cm4gKFBvcnRUeXBlKSBkb2N1bWVudC5maW5kKEtpbmRzLlBPUlRfVFlQRSwgX3BvcnRUeXBlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoUG9ydFR5cGUpIGRvY3VtZW50LmZpbmQoS2luZHMuUE9SVF9UWVBFLCBfcG9ydFR5cGUpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbnRpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JSZWNlaXZlci5lcnJvcihnZXRMb2NhdG9yKCksIFdzZGxNZXNzYWdlcy5FTlRJVFlfTk9UX0ZPVU5EX1BPUlRfVFlQRShfcG9ydFR5cGUsIG5ldyBRTmFtZShnZXROYW1lc3BhY2VVUkkoKSwgZ2V0TmFtZSgpKSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgS2luZCBnZXRLaW5kKCkgewpAQCAtMTMzLDE2ICsxMzMsMzggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihFeHRlbnNpb24gZSkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZVZhbHVlKCkgeworICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVmaW5pbmcoKS5nZXRUYXJnZXROYW1lc3BhY2VVUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0V1NETEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oVFdTRExFeHRlbnNpb24gZSkgewogICAgICAgICBfaGVscGVyLmFkZEV4dGVuc2lvbihlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgSXRlcmF0b3IgZXh0ZW5zaW9ucygpIHsKKyAgICBwdWJsaWMgSXRlcmFibGU8VFdTRExFeHRlbnNpb24+IGV4dGVuc2lvbnMoKSB7CiAgICAgICAgIHJldHVybiBfaGVscGVyLmV4dGVuc2lvbnMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgVFdTRExFeHRlbnNpYmxlIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKICAgICBwcml2YXRlIEV4dGVuc2liaWxpdHlIZWxwZXIgX2hlbHBlcjsKICAgICBwcml2YXRlIERvY3VtZW50YXRpb24gX2RvY3VtZW50YXRpb247CiAgICAgcHJpdmF0ZSBRTmFtZSBfcG9ydFR5cGU7CiAgICAgcHJpdmF0ZSBMaXN0IF9vcGVyYXRpb25zOworCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBUV1NETEV4dGVuc2libGUgcGFyZW50OwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0JpbmRpbmdGYXVsdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0JpbmRpbmdGYXVsdC5qYXZhCmluZGV4IDY1YzFiYTkuLmQ4YWFhZjggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9CaW5kaW5nRmF1bHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvQmluZGluZ0ZhdWx0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjQgKzI1LDI0IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlBY3Rpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmlsaXR5SGVscGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgImZhdWx0IiBjaGlsZCBlbGVtZW50IG9mIGEgYmluZGluZyBvcGVyYXRpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nRmF1bHQgZXh0ZW5kcyBFbnRpdHkgaW1wbGVtZW50cyBFeHRlbnNpYmxlIHsKK3B1YmxpYyBjbGFzcyBCaW5kaW5nRmF1bHQgZXh0ZW5kcyBFbnRpdHkgaW1wbGVtZW50cyBUV1NETEV4dGVuc2libGUgewogCi0gICAgcHVibGljIEJpbmRpbmdGYXVsdCgpIHsKKyAgICBwdWJsaWMgQmluZGluZ0ZhdWx0KExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICAgICAgX2hlbHBlciA9IG5ldyBFeHRlbnNpYmlsaXR5SGVscGVyKCk7CiAgICAgfQogCkBAIC02NiwxNCArNjYsMzAgQEAKICAgICAgICAgX2RvY3VtZW50YXRpb24gPSBkOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihFeHRlbnNpb24gZSkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZVZhbHVlKCkgeworICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFdTRExFbGVtZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEVsZW1lbnROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKFRXU0RMRXh0ZW5zaW9uIGUpIHsKICAgICAgICAgX2hlbHBlci5hZGRFeHRlbnNpb24oZSk7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4dGVuc2lvbnMoKSB7CisgICAgcHVibGljIEl0ZXJhYmxlPFRXU0RMRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewogICAgICAgICByZXR1cm4gX2hlbHBlci5leHRlbnNpb25zKCk7CiAgICAgfQogCisgICAgcHVibGljIFRXU0RMRXh0ZW5zaWJsZSBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2l0aEFsbFN1YkVudGl0aWVzRG8oRW50aXR5QWN0aW9uIGFjdGlvbikgewogICAgICAgICBfaGVscGVyLndpdGhBbGxTdWJFbnRpdGllc0RvKGFjdGlvbik7CiAgICAgfQpAQCAtOTMsNCArMTA5LDEwIEBACiAgICAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5SGVscGVyIF9oZWxwZXI7CiAgICAgcHJpdmF0ZSBEb2N1bWVudGF0aW9uIF9kb2N1bWVudGF0aW9uOwogICAgIHByaXZhdGUgU3RyaW5nIF9uYW1lOworCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBUV1NETEV4dGVuc2libGUgcGFyZW50OwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0JpbmRpbmdJbnB1dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0JpbmRpbmdJbnB1dC5qYXZhCmluZGV4IDVhY2E5NTcuLjE3NWU0OTEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9CaW5kaW5nSW5wdXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvQmluZGluZ0lucHV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjIgKzI1LDI0IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2liaWxpdHlIZWxwZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiAvKioKICAqIEVudGl0eSBjb3JyZXNwb25kaW5nIHRvIHRoZSAiaW5wdXQiIGNoaWxkIGVsZW1lbnQgb2YgYSBiaW5kaW5nIG9wZXJhdGlvbi4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdJbnB1dCBleHRlbmRzIEVudGl0eSBpbXBsZW1lbnRzIEV4dGVuc2libGUgeworcHVibGljIGNsYXNzIEJpbmRpbmdJbnB1dCBleHRlbmRzIEVudGl0eSBpbXBsZW1lbnRzIFRXU0RMRXh0ZW5zaWJsZSB7CiAKLSAgICBwdWJsaWMgQmluZGluZ0lucHV0KCkgeworICAgIHB1YmxpYyBCaW5kaW5nSW5wdXQoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgICAgICBfaGVscGVyID0gbmV3IEV4dGVuc2liaWxpdHlIZWxwZXIoKTsKICAgICB9CiAKQEAgLTY0LDE0ICs2NiwzMCBAQAogICAgICAgICBfZG9jdW1lbnRhdGlvbiA9IGQ7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBlKSB7CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0V1NETEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oVFdTRExFeHRlbnNpb24gZSkgewogICAgICAgICBfaGVscGVyLmFkZEV4dGVuc2lvbihlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgSXRlcmF0b3IgZXh0ZW5zaW9ucygpIHsKKyAgICBwdWJsaWMgSXRlcmFibGU8VFdTRExFeHRlbnNpb24+IGV4dGVuc2lvbnMoKSB7CiAgICAgICAgIHJldHVybiBfaGVscGVyLmV4dGVuc2lvbnMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgVFdTRExFeHRlbnNpYmxlIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB3aXRoQWxsU3ViRW50aXRpZXNEbyhFbnRpdHlBY3Rpb24gYWN0aW9uKSB7CiAgICAgICAgIF9oZWxwZXIud2l0aEFsbFN1YkVudGl0aWVzRG8oYWN0aW9uKTsKICAgICB9CkBAIC04OCw0ICsxMDYsMTAgQEAKICAgICBwcml2YXRlIEV4dGVuc2liaWxpdHlIZWxwZXIgX2hlbHBlcjsKICAgICBwcml2YXRlIERvY3VtZW50YXRpb24gX2RvY3VtZW50YXRpb247CiAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVFdTRExFeHRlbnNpYmxlIHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisKKyAgICBwcml2YXRlIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQ7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvQmluZGluZ09wZXJhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0JpbmRpbmdPcGVyYXRpb24uamF2YQppbmRleCAyNzI3ODRiLi4yZGUwNjg0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvQmluZGluZ09wZXJhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9CaW5kaW5nT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjcgKzI1LDI3IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2liaWxpdHlIZWxwZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICogRW50aXR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlICJvcGVyYXRpb24iIGNoaWxkIGVsZW1lbnQgb2YgYSBXU0RMICJiaW5kaW5nIiBlbGVtZW50LgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ09wZXJhdGlvbiBleHRlbmRzIEVudGl0eSBpbXBsZW1lbnRzIEV4dGVuc2libGUgeworcHVibGljIGNsYXNzIEJpbmRpbmdPcGVyYXRpb24gZXh0ZW5kcyBFbnRpdHkgaW1wbGVtZW50cyBUV1NETEV4dGVuc2libGUgewogCi0gICAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24oKSB7Ci0gICAgICAgIF9mYXVsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24oTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOworICAgICAgICBfZmF1bHRzID0gbmV3IEFycmF5TGlzdDxCaW5kaW5nRmF1bHQ+KCk7CiAgICAgICAgIF9oZWxwZXIgPSBuZXcgRXh0ZW5zaWJpbGl0eUhlbHBlcigpOwogICAgIH0KIApAQCAtMTE3LDggKzExNyw4IEBACiAgICAgICAgIF9mYXVsdHMuYWRkKGYpOwogICAgIH0KIAotICAgIHB1YmxpYyBJdGVyYXRvciBmYXVsdHMoKSB7Ci0gICAgICAgIHJldHVybiBfZmF1bHRzLml0ZXJhdG9yKCk7CisgICAgcHVibGljIEl0ZXJhYmxlPEJpbmRpbmdGYXVsdD4gZmF1bHRzKCkgeworICAgICAgICByZXR1cm4gX2ZhdWx0czsKICAgICB9CiAKICAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKSB7CkBAIC0xMzMsMTQgKzEzMywzMCBAQAogICAgICAgICBfZG9jdW1lbnRhdGlvbiA9IGQ7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBlKSB7CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFdTRExFbGVtZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEVsZW1lbnROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKFRXU0RMRXh0ZW5zaW9uIGUpIHsKICAgICAgICAgX2hlbHBlci5hZGRFeHRlbnNpb24oZSk7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4dGVuc2lvbnMoKSB7CisgICAgcHVibGljIEl0ZXJhYmxlPFRXU0RMRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewogICAgICAgICByZXR1cm4gX2hlbHBlci5leHRlbnNpb25zKCk7CiAgICAgfQogCisgICAgcHVibGljIFRXU0RMRXh0ZW5zaWJsZSBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2l0aEFsbFN1YkVudGl0aWVzRG8oRW50aXR5QWN0aW9uIGFjdGlvbikgewogICAgICAgICBpZiAoX2lucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgIGFjdGlvbi5wZXJmb3JtKF9pbnB1dCk7CkBAIC0xNDgsOCArMTY0LDggQEAKICAgICAgICAgaWYgKF9vdXRwdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgYWN0aW9uLnBlcmZvcm0oX291dHB1dCk7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gX2ZhdWx0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGFjdGlvbi5wZXJmb3JtKChFbnRpdHkpIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgZm9yIChCaW5kaW5nRmF1bHQgX2ZhdWx0IDogX2ZhdWx0cykgeworICAgICAgICAgICAgYWN0aW9uLnBlcmZvcm0oX2ZhdWx0KTsKICAgICAgICAgfQogICAgICAgICBfaGVscGVyLndpdGhBbGxTdWJFbnRpdGllc0RvKGFjdGlvbik7CiAgICAgfQpAQCAtMTY0LDggKzE4MCw4IEBACiAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgIF9vdXRwdXQuYWNjZXB0KHZpc2l0b3IpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF9mYXVsdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAoKEJpbmRpbmdGYXVsdCkgaXRlci5uZXh0KCkpLmFjY2VwdCh2aXNpdG9yKTsKKyAgICAgICAgZm9yIChCaW5kaW5nRmF1bHQgX2ZhdWx0IDogX2ZhdWx0cykgeworICAgICAgICAgICAgX2ZhdWx0LmFjY2VwdCh2aXNpdG9yKTsKICAgICAgICAgfQogICAgICAgICB2aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTsKICAgICB9CkBAIC0xOTcsNyArMjEzLDEzIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7CiAgICAgcHJpdmF0ZSBCaW5kaW5nSW5wdXQgX2lucHV0OwogICAgIHByaXZhdGUgQmluZGluZ091dHB1dCBfb3V0cHV0OwotICAgIHByaXZhdGUgTGlzdCBfZmF1bHRzOworICAgIHByaXZhdGUgTGlzdDxCaW5kaW5nRmF1bHQ+IF9mYXVsdHM7CiAgICAgcHJpdmF0ZSBPcGVyYXRpb25TdHlsZSBfc3R5bGU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgX3VuaXF1ZUtleTsKKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUV1NETEV4dGVuc2libGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHByaXZhdGUgVFdTRExFeHRlbnNpYmxlIHBhcmVudDsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9CaW5kaW5nT3V0cHV0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvQmluZGluZ091dHB1dC5qYXZhCmluZGV4IDJiZjQ3NTcuLjcwNDgyYTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9CaW5kaW5nT3V0cHV0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0JpbmRpbmdPdXRwdXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyNCArMjUsMjQgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2liaWxpdHlIZWxwZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiAvKioKICAqIEVudGl0eSBjb3JyZXNwb25kaW5nIHRvIHRoZSAib3V0cHV0IiBjaGlsZCBlbGVtZW50IG9mIGEgYmluZGluZyBvcGVyYXRpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nT3V0cHV0IGV4dGVuZHMgRW50aXR5IGltcGxlbWVudHMgRXh0ZW5zaWJsZSB7CitwdWJsaWMgY2xhc3MgQmluZGluZ091dHB1dCBleHRlbmRzIEVudGl0eSBpbXBsZW1lbnRzIFRXU0RMRXh0ZW5zaWJsZSB7CiAKLSAgICBwdWJsaWMgQmluZGluZ091dHB1dCgpIHsKKyAgICBwdWJsaWMgQmluZGluZ091dHB1dChMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgc3VwZXIobG9jYXRvcik7CiAgICAgICAgIF9oZWxwZXIgPSBuZXcgRXh0ZW5zaWJpbGl0eUhlbHBlcigpOwogICAgIH0KIApAQCAtNjYsMTQgKzY2LDMwIEBACiAgICAgICAgIF9kb2N1bWVudGF0aW9uID0gZDsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oRXh0ZW5zaW9uIGUpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgorICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRXU0RMRWxlbWVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihUV1NETEV4dGVuc2lvbiBlKSB7CiAgICAgICAgIF9oZWxwZXIuYWRkRXh0ZW5zaW9uKGUpOwogICAgIH0KIAotICAgIHB1YmxpYyBJdGVyYXRvciBleHRlbnNpb25zKCkgeworICAgIHB1YmxpYyBJdGVyYWJsZTxUV1NETEV4dGVuc2lvbj4gZXh0ZW5zaW9ucygpIHsKICAgICAgICAgcmV0dXJuIF9oZWxwZXIuZXh0ZW5zaW9ucygpOwogICAgIH0KIAorICAgIHB1YmxpYyBUV1NETEV4dGVuc2libGUgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHdpdGhBbGxTdWJFbnRpdGllc0RvKEVudGl0eUFjdGlvbiBhY3Rpb24pIHsKICAgICAgICAgX2hlbHBlci53aXRoQWxsU3ViRW50aXRpZXNEbyhhY3Rpb24pOwogICAgIH0KQEAgLTg3LDYgKzEwMywxMiBAQAogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVGhpcygpIHsKICAgICB9CiAKKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUV1NETEV4dGVuc2libGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHByaXZhdGUgVFdTRExFeHRlbnNpYmxlIHBhcmVudDsKICAgICBwcml2YXRlIEV4dGVuc2liaWxpdHlIZWxwZXIgX2hlbHBlcjsKICAgICBwcml2YXRlIERvY3VtZW50YXRpb24gX2RvY3VtZW50YXRpb247CiAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvRGVmaW5pdGlvbnMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9EZWZpbml0aW9ucy5qYXZhCmluZGV4IDY0ZDE5ZGYuLjhmZDcwNzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9EZWZpbml0aW9ucy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9EZWZpbml0aW9ucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMxICsyNSwyMyBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudDsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLio7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkFic3RyYWN0RG9jdW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5EZWZpbmluZzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkR1cGxpY2F0ZUVudGl0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2liaWxpdHlIZWxwZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IGphdmEudXRpbC4qOwogCiAvKioKICAqIEVudGl0eSBjb3JyZXNwb25kaW5nIHRvIHRoZSAiZGVmaW5pdGlvbnMiIFdTREwgZWxlbWVudC4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIERlZmluaXRpb25zIGV4dGVuZHMgRW50aXR5IGltcGxlbWVudHMgRGVmaW5pbmcsIEV4dGVuc2libGUgeworcHVibGljIGNsYXNzIERlZmluaXRpb25zIGV4dGVuZHMgRW50aXR5IGltcGxlbWVudHMgRGVmaW5pbmcsIFRXU0RMRXh0ZW5zaWJsZSB7CiAKLSAgICBwdWJsaWMgRGVmaW5pdGlvbnMoQWJzdHJhY3REb2N1bWVudCBkb2N1bWVudCkgeworICAgIHB1YmxpYyBEZWZpbml0aW9ucyhBYnN0cmFjdERvY3VtZW50IGRvY3VtZW50LCBMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgc3VwZXIobG9jYXRvcik7CiAgICAgICAgIF9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgICBfYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIF9pbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwpAQCAtMTMzLDcgKzEyNSwxNSBAQAogICAgICAgICByZXR1cm4gX3NlcnZpY2VzLml0ZXJhdG9yKCk7CiAgICAgfQogCi0gICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZVZhbHVlKCkgeworICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFdTRExFbGVtZW50TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuUU5BTUVfREVGSU5JVElPTlM7CiAgICAgfQogCkBAIC0xNDUsMTQgKzE0NSwyMSBAQAogICAgICAgICBfZG9jdW1lbnRhdGlvbiA9IGQ7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBlKSB7CisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKFRXU0RMRXh0ZW5zaW9uIGUpIHsKICAgICAgICAgX2hlbHBlci5hZGRFeHRlbnNpb24oZSk7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4dGVuc2lvbnMoKSB7CisgICAgcHVibGljIEl0ZXJhYmxlPFRXU0RMRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewogICAgICAgICByZXR1cm4gX2hlbHBlci5leHRlbnNpb25zKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogd3NkbDpkZWZpbml0aW9uIGlzIHRoZSByb290IGhlbmNlIG5vIHBhcmVudCBzbyByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVFdTRExFeHRlbnNpYmxlIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2l0aEFsbFN1YkVudGl0aWVzRG8oRW50aXR5QWN0aW9uIGFjdGlvbikgewogICAgICAgICBpZiAoX3R5cGVzICE9IG51bGwpIHsKICAgICAgICAgICAgIGFjdGlvbi5wZXJmb3JtKF90eXBlcyk7CkBAIC0yMTgsNCArMjI1LDggQEAKICAgICBwcml2YXRlIExpc3Q8U2VydmljZT4gX3NlcnZpY2VzOwogICAgIHByaXZhdGUgTGlzdCBfaW1wb3J0czsKICAgICBwcml2YXRlIFNldCBfaW1wb3J0ZWROYW1lc3BhY2VzOworCisgICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0V1NETEVsZW1lbnROYW1lKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0RvY3VtZW50YXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9Eb2N1bWVudGF0aW9uLmphdmEKaW5kZXggYjQ5Nzc5Zi4uODIwYThiOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0RvY3VtZW50YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvRG9jdW1lbnRhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9GYXVsdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0ZhdWx0LmphdmEKaW5kZXggZDI4MGQ4OS4uYTZkMWEzZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0ZhdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0ZhdWx0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjYgKzI1LDIyIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay4qOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5UmVmZXJlbmNlQWN0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJpbGl0eUhlbHBlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2libGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5RTmFtZUFjdGlvbjsKLQogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgImZhdWx0IiBjaGlsZCBlbGVtZW50IG9mIGEgcG9ydCB0eXBlIG9wZXJhdGlvbi4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIEZhdWx0IGV4dGVuZHMgRW50aXR5IGltcGxlbWVudHMgRXh0ZW5zaWJsZXsKK3B1YmxpYyBjbGFzcyBGYXVsdCBleHRlbmRzIEVudGl0eSBpbXBsZW1lbnRzIFRXU0RMRXh0ZW5zaWJsZSB7CiAKLSAgICBwdWJsaWMgRmF1bHQoKSB7CisgICAgcHVibGljIEZhdWx0KExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICAgICAgX2hlbHBlciA9IG5ldyBFeHRlbnNpYmlsaXR5SGVscGVyKCk7CiAgICAgfQogCkBAIC0xMTAsMjAgKzEwNiw1MiBAQAogICAgIHByaXZhdGUgRG9jdW1lbnRhdGlvbiBfZG9jdW1lbnRhdGlvbjsKICAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKICAgICBwcml2YXRlIFFOYW1lIF9tZXNzYWdlOworICAgIHByaXZhdGUgU3RyaW5nIF9hY3Rpb247CiAgICAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5SGVscGVyIF9oZWxwZXI7CiAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudC5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0V1NETEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKKyAgICB9CisKICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpYmxlI2FkZEV4dGVuc2lvbihFeHRlbnNpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBlKSB7CisgICAgKiBAc2VlIFRXU0RMRXh0ZW5zaWJsZSNhZGRFeHRlbnNpb24oRXh0ZW5zaW9uSW1wbCkKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihUV1NETEV4dGVuc2lvbiBlKSB7CiAgICAgICAgIF9oZWxwZXIuYWRkRXh0ZW5zaW9uKGUpOwogCiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgRXh0ZW5zaWJsZSNleHRlbnNpb25zKCkKKyAgICAgKiBAc2VlIFRXU0RMRXh0ZW5zaWJsZSNleHRlbnNpb25zKCkKICAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZXh0ZW5zaW9ucygpIHsKKyAgICBwdWJsaWMgSXRlcmFibGU8VFdTRExFeHRlbnNpb24+IGV4dGVuc2lvbnMoKSB7CiAgICAgICAgIHJldHVybiBfaGVscGVyLmV4dGVuc2lvbnMoKTsKICAgICB9CisKKyAgICBwdWJsaWMgVFdTRExFeHRlbnNpYmxlIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUV1NETEV4dGVuc2libGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHByaXZhdGUgVFdTRExFeHRlbnNpYmxlIHBhcmVudDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX2FjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIF9hY3Rpb24pIHsKKyAgICAgICAgdGhpcy5fYWN0aW9uID0gX2FjdGlvbjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvSW1wb3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvSW1wb3J0LmphdmEKaW5kZXggMzQ5ZGQzZi4uYzViODYyZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0ltcG9ydC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9JbXBvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw5ICsyNSwxMCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudDsKIAotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgImltcG9ydCIgV1NETCBlbGVtZW50LgpAQCAtMzYsNyArMzcsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgSW1wb3J0IGV4dGVuZHMgRW50aXR5ewogCi0gICAgcHVibGljIEltcG9ydCgpIHsKKyAgICBwdWJsaWMgSW1wb3J0KExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9JbnB1dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0lucHV0LmphdmEKaW5kZXggZmY5OGI5OS4uNWUzMzI0YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0lucHV0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L0lucHV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjEgKzI1LDI3IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaWJsZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkFib3J0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxNZXNzYWdlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5UmVmZXJlbmNlQWN0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUU5hbWVBY3Rpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgImlucHV0IiBjaGlsZCBlbGVtZW50IG9mIGEgcG9ydCB0eXBlIG9wZXJhdGlvbi4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIElucHV0IGV4dGVuZHMgRW50aXR5IHsKK3B1YmxpYyBjbGFzcyBJbnB1dCBleHRlbmRzIEVudGl0eSBpbXBsZW1lbnRzIFRXU0RMRXh0ZW5zaWJsZSB7CiAKLSAgICBwdWJsaWMgSW5wdXQoKSB7CisgICAgcHVibGljIElucHV0KExvY2F0b3IgbG9jYXRvciwgRXJyb3JSZWNlaXZlciBlcnJSZWNlaXZlcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKKyAgICAgICAgdGhpcy5lcnJvclJlY2VpdmVyID0gZXJyUmVjZWl2ZXI7CisgICAgICAgIF9oZWxwZXIgPSBuZXcgRXh0ZW5zaWJpbGl0eUhlbHBlcigpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKQEAgLTk0LDExICsxMDAsNTEgQEAKIAogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVGhpcygpIHsKICAgICAgICAgaWYgKF9tZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKCJ2YWxpZGF0aW9uLm1pc3NpbmdSZXF1aXJlZEF0dHJpYnV0ZSIsICJtZXNzYWdlIik7CisgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKGdldExvY2F0b3IoKSwgV3NkbE1lc3NhZ2VzLlZBTElEQVRJT05fTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUoIm5hbWUiLCAid3NkbDptZXNzYWdlIikpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIERvY3VtZW50YXRpb24gX2RvY3VtZW50YXRpb247CiAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7CiAgICAgcHJpdmF0ZSBRTmFtZSBfbWVzc2FnZTsKKyAgICBwcml2YXRlIFN0cmluZyBfYWN0aW9uOworICAgIHByaXZhdGUgRXh0ZW5zaWJpbGl0eUhlbHBlciBfaGVscGVyOworICAgIHByaXZhdGUgVFdTRExFeHRlbnNpYmxlIHBhcmVudDsKKworICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihUV1NETEV4dGVuc2lvbiBlKSB7CisgICAgICAgIF9oZWxwZXIuYWRkRXh0ZW5zaW9uKGUpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRXU0RMRWxlbWVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBUV1NETEV4dGVuc2libGUgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUV1NETEV4dGVuc2libGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUV1NETEV4dGVuc2lvbj4gZXh0ZW5zaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIF9oZWxwZXIuZXh0ZW5zaW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX2FjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIF9hY3Rpb24pIHsKKyAgICAgICAgdGhpcy5fYWN0aW9uID0gX2FjdGlvbjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvS2luZHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9LaW5kcy5qYXZhCmluZGV4IDhhNDQzNWEuLjc4ZWM1NmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9LaW5kcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9LaW5kcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9NZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvTWVzc2FnZS5qYXZhCmluZGV4IDAwMzMxMjIuLjNlZGVhMzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9NZXNzYWdlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L01lc3NhZ2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyMCArMjUsMTQgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkFib3J0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxNZXNzYWdlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRGVmaW5pbmc7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5HbG9iYWxFbnRpdHk7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5LaW5kOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKIAogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgIm1lc3NhZ2UiIFdTREwgZWxlbWVudC4KQEAgLTQ3LDE3ICs0MSwxOCBAQAogICovCiBwdWJsaWMgY2xhc3MgTWVzc2FnZSBleHRlbmRzIEdsb2JhbEVudGl0eSB7CiAKLSAgICBwdWJsaWMgTWVzc2FnZShEZWZpbmluZyBkZWZpbmluZykgewotICAgICAgICBzdXBlcihkZWZpbmluZyk7CisgICAgcHVibGljIE1lc3NhZ2UoRGVmaW5pbmcgZGVmaW5pbmcsIExvY2F0b3IgbG9jYXRvciwgRXJyb3JSZWNlaXZlciBlcnJSZWNlaXZlcikgeworICAgICAgICBzdXBlcihkZWZpbmluZywgbG9jYXRvciwgZXJyUmVjZWl2ZXIpOwogICAgICAgICBfcGFydHMgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VQYXJ0PigpOwogICAgICAgICBfcGFydHNCeU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lc3NhZ2VQYXJ0PigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZChNZXNzYWdlUGFydCBwYXJ0KSB7Ci0gICAgICAgIGlmIChfcGFydHNCeU5hbWUuZ2V0KHBhcnQuZ2V0TmFtZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgInZhbGlkYXRpb24uZHVwbGljYXRlTmFtZSIsCi0gICAgICAgICAgICAgICAgcGFydC5nZXROYW1lKCkpOworICAgICAgICBpZiAoX3BhcnRzQnlOYW1lLmdldChwYXJ0LmdldE5hbWUoKSkgIT0gbnVsbCl7CisgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKHBhcnQuZ2V0TG9jYXRvcigpLCBXc2RsTWVzc2FnZXMuVkFMSURBVElPTl9EVVBMSUNBVEVfUEFSVF9OQU1FKGdldE5hbWUoKSwgcGFydC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEV4Y2VwdGlvbigpOworICAgICAgICB9CisKICAgICAgICAgX3BhcnRzQnlOYW1lLnB1dChwYXJ0LmdldE5hbWUoKSwgcGFydCk7CiAgICAgICAgIF9wYXJ0cy5hZGQocGFydCk7CiAgICAgfQpAQCAtMTEyLDcgKzEwNyw4IEBACiAKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVRoaXMoKSB7CiAgICAgICAgIGlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oInZhbGlkYXRpb24ubWlzc2luZ1JlcXVpcmVkQXR0cmlidXRlIiwgIm5hbWUiKTsKKyAgICAgICAgICAgIGVycm9yUmVjZWl2ZXIuZXJyb3IoZ2V0TG9jYXRvcigpLCBXc2RsTWVzc2FnZXMuVkFMSURBVElPTl9NSVNTSU5HX1JFUVVJUkVEX0FUVFJJQlVURSgibmFtZSIsICJ3c2RsOm1lc3NhZ2UiKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L01lc3NhZ2VQYXJ0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvTWVzc2FnZVBhcnQuamF2YQppbmRleCA2NjViZTMyLi5mNzkwMDUxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvTWVzc2FnZVBhcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvTWVzc2FnZVBhcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMyArMjUsMTQgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQ7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlSZWZlcmVuY2VBY3Rpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5LaW5kOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUU5hbWVBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuTW9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCitpbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byBhIFdTREwgbWVzc2FnZSBwYXJ0LgpAQCAtNDcsNyArNDgsOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTRExfTUlNRV9CSU5ESU5HID0gNTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUX05PVF9CT1VOREVEID0gLTE7CiAKLSAgICBwdWJsaWMgTWVzc2FnZVBhcnQoKSB7CisgICAgcHVibGljIE1lc3NhZ2VQYXJ0KExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CkBAIC0xMDQsOSArMTA2LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVRoaXMoKSB7Ci0gICAgICAgIGlmIChfZGVzY3JpcHRvcktpbmQgPT0gbnVsbCB8fCBfZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsVmFsaWRhdGlvbigidmFsaWRhdGlvbi5taXNzaW5nUmVxdWlyZWRQcm9wZXJ0eSIsICJkZXNjcmlwdG9yIik7Ci0gICAgICAgIH1lbHNlIGlmKF9kZXNjcmlwdG9yLmdldExvY2FsUGFydCgpLmVxdWFscygiIikpeworICAgICAgICBpZihfZGVzY3JpcHRvciAhPSBudWxsICYmIF9kZXNjcmlwdG9yLmdldExvY2FsUGFydCgpLmVxdWFscygiIikpewogICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oInZhbGlkYXRpb24uaW52YWxpZEVsZW1lbnQiLCBfZGVzY3JpcHRvci50b1N0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9PcGVyYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9PcGVyYXRpb24uamF2YQppbmRleCA1MjE5ZWZhLi41MWUxY2QxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvT3BlcmF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L09wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDI3ICsyNSwyOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudDsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQoraW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaWJsZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExPcGVyYXRpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlBY3Rpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmlsaXR5SGVscGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKIAogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgIm9wZXJhdGlvbiIgY2hpbGQgZWxlbWVudCBvZiBhICJwb3J0VHlwZSIgV1NETCBlbGVtZW50LgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uIGV4dGVuZHMgRW50aXR5IGltcGxlbWVudHMgRXh0ZW5zaWJsZXsKK3B1YmxpYyBjbGFzcyBPcGVyYXRpb24gZXh0ZW5kcyBFbnRpdHkgaW1wbGVtZW50cyBUV1NETE9wZXJhdGlvbiB7CiAKLSAgICBwdWJsaWMgT3BlcmF0aW9uKCkgewotICAgICAgICBfZmF1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHB1YmxpYyBPcGVyYXRpb24oTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOworICAgICAgICBfZmF1bHRzID0gbmV3IEFycmF5TGlzdDxGYXVsdD4oKTsKICAgICAgICAgX2hlbHBlciA9IG5ldyBFeHRlbnNpYmlsaXR5SGVscGVyKCk7CiAgICAgfQogCkBAIC0xMTcsOCArMTE4LDggQEAKICAgICAgICAgX2ZhdWx0cy5hZGQoZik7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yIGZhdWx0cygpIHsKLSAgICAgICAgcmV0dXJuIF9mYXVsdHMuaXRlcmF0b3IoKTsKKyAgICBwdWJsaWMgSXRlcmFibGU8RmF1bHQ+IGZhdWx0cygpIHsKKyAgICAgICAgcmV0dXJuIF9mYXVsdHM7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJPcmRlcigpIHsKQEAgLTE1MCw4ICsxNTEsOCBAQAogICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICBhY3Rpb24ucGVyZm9ybShfb3V0cHV0KTsKICAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfZmF1bHRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYWN0aW9uLnBlcmZvcm0oKEVudGl0eSkgaXRlci5uZXh0KCkpOworICAgICAgICBmb3IgKEZhdWx0IF9mYXVsdCA6IF9mYXVsdHMpIHsKKyAgICAgICAgICAgIGFjdGlvbi5wZXJmb3JtKF9mYXVsdCk7CiAgICAgICAgIH0KICAgICAgICAgX2hlbHBlci53aXRoQWxsU3ViRW50aXRpZXNEbyhhY3Rpb24pOwogICAgIH0KQEAgLTE2NCw4ICsxNjUsOCBAQAogICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICBfb3V0cHV0LmFjY2VwdCh2aXNpdG9yKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfZmF1bHRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgKChGYXVsdCkgaXRlci5uZXh0KCkpLmFjY2VwdCh2aXNpdG9yKTsKKyAgICAgICAgZm9yIChGYXVsdCBfZmF1bHQgOiBfZmF1bHRzKSB7CisgICAgICAgICAgICBfZmF1bHQuYWNjZXB0KHZpc2l0b3IpOwogICAgICAgICB9CiAgICAgICAgIHZpc2l0b3IucG9zdFZpc2l0KHRoaXMpOwogICAgIH0KQEAgLTE4OSw5ICsxOTAsNiBAQAogICAgICAgICAgICAgaWYgKF9mYXVsdHMgIT0gbnVsbCAmJiBfZmF1bHRzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oInZhbGlkYXRpb24uaW52YWxpZFN1YkVudGl0eSIsICJmYXVsdCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF9wYXJhbWV0ZXJPcmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oInZhbGlkYXRpb24uaW52YWxpZEF0dHJpYnV0ZSIsICJwYXJhbWV0ZXJPcmRlciIpOwotICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKF9zdHlsZSA9PSBPcGVyYXRpb25TdHlsZS5OT1RJRklDQVRJT04pIHsKICAgICAgICAgICAgIGlmIChfcGFyYW1ldGVyT3JkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKCJ2YWxpZGF0aW9uLmludmFsaWRBdHRyaWJ1dGUiLCAicGFyYW1ldGVyT3JkZXIiKTsKQEAgLTE5OSwyOSArMTk3LDU5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudC5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0V1NETEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKKyAgICB9CisKICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpYmxlI2FkZEV4dGVuc2lvbihFeHRlbnNpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBlKSB7CisgICAgKiBAc2VlIFRXU0RMRXh0ZW5zaWJsZSNhZGRFeHRlbnNpb24oRXh0ZW5zaW9uSW1wbCkKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihUV1NETEV4dGVuc2lvbiBlKSB7CiAgICAgICAgIF9oZWxwZXIuYWRkRXh0ZW5zaW9uKGUpOwogCiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgRXh0ZW5zaWJsZSNleHRlbnNpb25zKCkKKyAgICAgKiBAc2VlIFRXU0RMRXh0ZW5zaWJsZSNleHRlbnNpb25zKCkKICAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZXh0ZW5zaW9ucygpIHsKKyAgICBwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIFRXU0RMRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewogICAgICAgICByZXR1cm4gX2hlbHBlci5leHRlbnNpb25zKCk7CiAgICAgfQogCisgICAgcHVibGljIFRXU0RMRXh0ZW5zaWJsZSBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIE1hcDxTdHJpbmcsIEpDbGFzcz4gZ2V0RmF1bHRzKCkgeworICAgICAgICByZXR1cm4gdW5tb2RpZmlhYmxlRmF1bHRDbGFzc01hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRGYXVsdChTdHJpbmcgZmF1bHROYW1lLCBKQ2xhc3MgZXhjZXB0aW9uKXsKKyAgICAgICAgZmF1bHRDbGFzc01hcC5wdXQoZmF1bHROYW1lLCBleGNlcHRpb24pOworICAgIH0KKworICAgIHByaXZhdGUgVFdTRExFeHRlbnNpYmxlIHBhcmVudDsKICAgICBwcml2YXRlIERvY3VtZW50YXRpb24gX2RvY3VtZW50YXRpb247CiAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7CiAgICAgcHJpdmF0ZSBJbnB1dCBfaW5wdXQ7CiAgICAgcHJpdmF0ZSBPdXRwdXQgX291dHB1dDsKLSAgICBwcml2YXRlIExpc3QgX2ZhdWx0czsKKyAgICBwcml2YXRlIExpc3Q8RmF1bHQ+IF9mYXVsdHM7CiAgICAgcHJpdmF0ZSBPcGVyYXRpb25TdHlsZSBfc3R5bGU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgX3BhcmFtZXRlck9yZGVyOwogICAgIHByaXZhdGUgU3RyaW5nIF91bmlxdWVLZXk7CiAgICAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5SGVscGVyIF9oZWxwZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBKQ2xhc3M+IGZhdWx0Q2xhc3NNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpDbGFzcz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEpDbGFzcz4gdW5tb2RpZmlhYmxlRmF1bHRDbGFzc01hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChmYXVsdENsYXNzTWFwKTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9PcGVyYXRpb25TdHlsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L09wZXJhdGlvblN0eWxlLmphdmEKaW5kZXggMDBjZGFiMy4uODk3YzE1MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L09wZXJhdGlvblN0eWxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L09wZXJhdGlvblN0eWxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L091dHB1dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L091dHB1dC5qYXZhCmluZGV4IDg4NDIyMjcuLjIyZjA5Y2IgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9PdXRwdXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvT3V0cHV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjEgKzI1LDI2IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaWJsZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkFib3J0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxNZXNzYWdlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5UmVmZXJlbmNlQWN0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUU5hbWVBY3Rpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgIm91dHB1dCIgY2hpbGQgZWxlbWVudCBvZiBhIHBvcnQgdHlwZSBvcGVyYXRpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXQgZXh0ZW5kcyBFbnRpdHkgeworcHVibGljIGNsYXNzIE91dHB1dCBleHRlbmRzIEVudGl0eSBpbXBsZW1lbnRzIFRXU0RMRXh0ZW5zaWJsZSB7CiAKLSAgICBwdWJsaWMgT3V0cHV0KCkgeworICAgIHB1YmxpYyBPdXRwdXQoTG9jYXRvciBsb2NhdG9yLCBFcnJvclJlY2VpdmVyIGVyclJlY2VpdmVyKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOworICAgICAgICB0aGlzLmVycm9yUmVjZWl2ZXIgPSBlcnJSZWNlaXZlcjsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CkBAIC05NCwxMSArOTksNTEgQEAKIAogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVGhpcygpIHsKICAgICAgICAgaWYgKF9tZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKCJ2YWxpZGF0aW9uLm1pc3NpbmdSZXF1aXJlZEF0dHJpYnV0ZSIsICJtZXNzYWdlIik7CisgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKGdldExvY2F0b3IoKSwgV3NkbE1lc3NhZ2VzLlZBTElEQVRJT05fTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUoIm5hbWUiLCAid3NkbDptZXNzYWdlIikpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIERvY3VtZW50YXRpb24gX2RvY3VtZW50YXRpb247CiAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7CiAgICAgcHJpdmF0ZSBRTmFtZSBfbWVzc2FnZTsKKyAgICBwcml2YXRlIFN0cmluZyBfYWN0aW9uOworICAgIHByaXZhdGUgRXh0ZW5zaWJpbGl0eUhlbHBlciBfaGVscGVyOworICAgIHByaXZhdGUgVFdTRExFeHRlbnNpYmxlIHBhcmVudDsKKworICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihUV1NETEV4dGVuc2lvbiBlKSB7CisgICAgICAgIF9oZWxwZXIuYWRkRXh0ZW5zaW9uKGUpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRXU0RMRWxlbWVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBUV1NETEV4dGVuc2libGUgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUV1NETEV4dGVuc2libGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUV1NETEV4dGVuc2lvbj4gZXh0ZW5zaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIF9oZWxwZXIuZXh0ZW5zaW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gX2FjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIF9hY3Rpb24pIHsKKyAgICAgICAgdGhpcy5fYWN0aW9uID0gX2FjdGlvbjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvUG9ydC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1BvcnQuamF2YQppbmRleCBiMzdhNjY2Li5lZTZlNTJkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvUG9ydC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9Qb3J0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzAgKzI1LDI1IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5BYm9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRGVmaW5pbmc7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlSZWZlcmVuY2VBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmlsaXR5SGVscGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkdsb2JhbEVudGl0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLktpbmQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5RTmFtZUFjdGlvbjsKLQogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgInBvcnQiIFdTREwgZWxlbWVudC4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIFBvcnQgZXh0ZW5kcyBHbG9iYWxFbnRpdHkgaW1wbGVtZW50cyBFeHRlbnNpYmxlIHsKK3B1YmxpYyBjbGFzcyBQb3J0IGV4dGVuZHMgR2xvYmFsRW50aXR5IGltcGxlbWVudHMgVFdTRExFeHRlbnNpYmxlIHsKIAotICAgIHB1YmxpYyBQb3J0KERlZmluaW5nIGRlZmluaW5nKSB7Ci0gICAgICAgIHN1cGVyKGRlZmluaW5nKTsKKyAgICBwdWJsaWMgUG9ydChEZWZpbmluZyBkZWZpbmluZywgTG9jYXRvciBsb2NhdG9yLCBFcnJvclJlY2VpdmVyIGVyclJlY2VpdmVyKSB7CisgICAgICAgIHN1cGVyKGRlZmluaW5nLCBsb2NhdG9yLCBlcnJSZWNlaXZlcik7CiAgICAgICAgIF9oZWxwZXIgPSBuZXcgRXh0ZW5zaWJpbGl0eUhlbHBlcigpOwogICAgIH0KIApAQCAtNjksMTQgKzY0LDI3IEBACiAgICAgfQogCiAgICAgcHVibGljIEJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoQWJzdHJhY3REb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICByZXR1cm4gKEJpbmRpbmcpIGRvY3VtZW50LmZpbmQoS2luZHMuQklORElORywgX2JpbmRpbmcpOworICAgICAgICB0cnl7CisgICAgICAgICAgICByZXR1cm4gKEJpbmRpbmcpIGRvY3VtZW50LmZpbmQoS2luZHMuQklORElORywgX2JpbmRpbmcpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbnRpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JSZWNlaXZlci5lcnJvcihnZXRMb2NhdG9yKCksIFdzZGxNZXNzYWdlcy5FTlRJVFlfTk9UX0ZPVU5EX0JJTkRJTkcoX2JpbmRpbmcsIG5ldyBRTmFtZShnZXROYW1lc3BhY2VVUkkoKSwgZ2V0TmFtZSgpKSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgS2luZCBnZXRLaW5kKCkgewogICAgICAgICByZXR1cm4gS2luZHMuUE9SVDsKICAgICB9CiAKLSAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBnZXREZWZpbmluZygpLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRXU0RMRWxlbWVudE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLlFOQU1FX1BPUlQ7CiAgICAgfQogCkBAIC0xMTgsMTQgKzEyNiwyMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBlKSB7CisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKFRXU0RMRXh0ZW5zaW9uIGUpIHsKICAgICAgICAgX2hlbHBlci5hZGRFeHRlbnNpb24oZSk7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4dGVuc2lvbnMoKSB7CisgICAgcHVibGljIEl0ZXJhYmxlPFRXU0RMRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewogICAgICAgICByZXR1cm4gX2hlbHBlci5leHRlbnNpb25zKCk7CiAgICAgfQogCisgICAgcHVibGljIFRXU0RMRXh0ZW5zaWJsZSBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2l0aEFsbFN1YkVudGl0aWVzRG8oRW50aXR5QWN0aW9uIGFjdGlvbikgewogICAgICAgICBfaGVscGVyLndpdGhBbGxTdWJFbnRpdGllc0RvKGFjdGlvbik7CiAgICAgfQpAQCAtMTM0LDQgKzE1MCwxMCBAQAogICAgIHByaXZhdGUgRG9jdW1lbnRhdGlvbiBfZG9jdW1lbnRhdGlvbjsKICAgICBwcml2YXRlIFNlcnZpY2UgX3NlcnZpY2U7CiAgICAgcHJpdmF0ZSBRTmFtZSBfYmluZGluZzsKKworICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFdTRExFbGVtZW50TmFtZSgpOworICAgIH0KKworICAgIHByaXZhdGUgVFdTRExFeHRlbnNpYmxlIHBhcmVudDsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9Qb3J0VHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1BvcnRUeXBlLmphdmEKaW5kZXggOGQ2ZGVlYi4uMzFjNDZmYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1BvcnRUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1BvcnRUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDI0IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50OwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaWJsZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5EZWZpbmluZzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2liaWxpdHlIZWxwZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuR2xvYmFsRW50aXR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuS2luZDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CiAKIC8qKgogICogRW50aXR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlICJwb3J0VHlwZSIgV1NETCBlbGVtZW50LgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGUgZXh0ZW5kcyBHbG9iYWxFbnRpdHkgaW1wbGVtZW50cyBFeHRlbnNpYmxleworcHVibGljIGNsYXNzIFBvcnRUeXBlIGV4dGVuZHMgR2xvYmFsRW50aXR5IGltcGxlbWVudHMgVFdTRExFeHRlbnNpYmxlIHsKIAotICAgIHB1YmxpYyBQb3J0VHlwZShEZWZpbmluZyBkZWZpbmluZykgewotICAgICAgICBzdXBlcihkZWZpbmluZyk7CisgICAgcHVibGljIFBvcnRUeXBlKERlZmluaW5nIGRlZmluaW5nLCBMb2NhdG9yIGxvY2F0b3IsIEVycm9yUmVjZWl2ZXIgZXJyUmVjZWl2ZXIpIHsKKyAgICAgICAgc3VwZXIoZGVmaW5pbmcsIGxvY2F0b3IsIGVyclJlY2VpdmVyKTsKICAgICAgICAgX29wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIF9vcGVyYXRpb25LZXlzID0gbmV3IEhhc2hTZXQoKTsKICAgICAgICAgX2hlbHBlciA9IG5ldyBFeHRlbnNpYmlsaXR5SGVscGVyKCk7CkBAIC0xMjIsMjEgKzExMyw0MiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBnZXREZWZpbmluZygpLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRXU0RMRWxlbWVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZSgpOworICAgIH0KKwogICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIEV4dGVuc2libGUjYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oRXh0ZW5zaW9uIGUpIHsKKyAgICAqIEBzZWUgVFdTRExFeHRlbnNpYmxlI2FkZEV4dGVuc2lvbihFeHRlbnNpb25JbXBsKQorICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKFRXU0RMRXh0ZW5zaW9uIGUpIHsKICAgICAgICAgX2hlbHBlci5hZGRFeHRlbnNpb24oZSk7CiAKICAgICB9CiAKICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpYmxlI2V4dGVuc2lvbnMoKQorICAgICAqIEBzZWUgVFdTRExFeHRlbnNpYmxlI2V4dGVuc2lvbnMoKQogICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBleHRlbnNpb25zKCkgeworICAgIHB1YmxpYyBJdGVyYWJsZTxUV1NETEV4dGVuc2lvbj4gZXh0ZW5zaW9ucygpIHsKICAgICAgICAgcmV0dXJuIF9oZWxwZXIuZXh0ZW5zaW9ucygpOwogICAgIH0KIAorICAgIHB1YmxpYyBUV1NETEV4dGVuc2libGUgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUV1NETEV4dGVuc2libGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHByaXZhdGUgVFdTRExFeHRlbnNpYmxlIHBhcmVudDsKICAgICBwcml2YXRlIERvY3VtZW50YXRpb24gX2RvY3VtZW50YXRpb247CiAgICAgcHJpdmF0ZSBMaXN0IF9vcGVyYXRpb25zOwogICAgIHByaXZhdGUgU2V0IF9vcGVyYXRpb25LZXlzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1NlcnZpY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9TZXJ2aWNlLmphdmEKaW5kZXggODc5MjVjMy4uYzg2NjMyOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1NlcnZpY2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvU2VydmljZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMwICsyNSwyNiBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudDsKIAoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5EZWZpbmluZzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2liaWxpdHlIZWxwZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuR2xvYmFsRW50aXR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuS2luZDsKLQogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgInNlcnZpY2UiIFdTREwgZWxlbWVudC4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIFNlcnZpY2UgZXh0ZW5kcyBHbG9iYWxFbnRpdHkgaW1wbGVtZW50cyBFeHRlbnNpYmxlIHsKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlIGV4dGVuZHMgR2xvYmFsRW50aXR5IGltcGxlbWVudHMgVFdTRExFeHRlbnNpYmxlIHsKIAotICAgIHB1YmxpYyBTZXJ2aWNlKERlZmluaW5nIGRlZmluaW5nKSB7Ci0gICAgICAgIHN1cGVyKGRlZmluaW5nKTsKKyAgICBwdWJsaWMgU2VydmljZShEZWZpbmluZyBkZWZpbmluZywgTG9jYXRvciBsb2NhdG9yLCBFcnJvclJlY2VpdmVyIGVyclJlY2VpdmVyKSB7CisgICAgICAgIHN1cGVyKGRlZmluaW5nLCBsb2NhdG9yLCBlcnJSZWNlaXZlcik7CiAgICAgICAgIF9wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgX2hlbHBlciA9IG5ldyBFeHRlbnNpYmlsaXR5SGVscGVyKCk7CiAgICAgfQpAQCAtMTAwLDE0ICs5NiwzMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBlKSB7CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBnZXREZWZpbmluZygpLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRXU0RMRWxlbWVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihUV1NETEV4dGVuc2lvbiBlKSB7CiAgICAgICAgIF9oZWxwZXIuYWRkRXh0ZW5zaW9uKGUpOwogICAgIH0KIAotICAgIHB1YmxpYyBJdGVyYXRvciBleHRlbnNpb25zKCkgeworICAgIHB1YmxpYyBJdGVyYWJsZTxUV1NETEV4dGVuc2lvbj4gZXh0ZW5zaW9ucygpIHsKICAgICAgICAgcmV0dXJuIF9oZWxwZXIuZXh0ZW5zaW9ucygpOwogICAgIH0KIAorICAgIHB1YmxpYyBUV1NETEV4dGVuc2libGUgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gbnVsbDsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCisgICAgfQorCiAgICAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5SGVscGVyIF9oZWxwZXI7CiAgICAgcHJpdmF0ZSBEb2N1bWVudGF0aW9uIF9kb2N1bWVudGF0aW9uOwogICAgIHByaXZhdGUgTGlzdCA8UG9ydD4gX3BvcnRzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1R5cGVzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvVHlwZXMuamF2YQppbmRleCA5ODc2MmUwLi4xNDJiYTFhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvVHlwZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvVHlwZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyNSArMjUsMjUgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2liaWxpdHlIZWxwZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uVmlzaXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBFbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgInR5cGVzIiBXU0RMIGVsZW1lbnQuCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBUeXBlcyBleHRlbmRzIEVudGl0eSBpbXBsZW1lbnRzIEV4dGVuc2libGUgeworcHVibGljIGNsYXNzIFR5cGVzIGV4dGVuZHMgRW50aXR5IGltcGxlbWVudHMgVFdTRExFeHRlbnNpYmxlIHsKIAotICAgIHB1YmxpYyBUeXBlcygpIHsKKyAgICBwdWJsaWMgVHlwZXMoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgICAgICBfaGVscGVyID0gbmV3IEV4dGVuc2liaWxpdHlIZWxwZXIoKTsKICAgICB9CiAKQEAgLTY4LDE0ICs2OCwzNyBAQAogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVGhpcygpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oRXh0ZW5zaW9uIGUpIHsKKyAgICAvKioKKyAgICAgKiB3c2RsOnR5cGUgZG9lcyBub3QgaGF2ZSBhbnkgbmFtZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFdTRExFbGVtZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEVsZW1lbnROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKFRXU0RMRXh0ZW5zaW9uIGUpIHsKICAgICAgICAgX2hlbHBlci5hZGRFeHRlbnNpb24oZSk7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4dGVuc2lvbnMoKSB7CisgICAgcHVibGljIEl0ZXJhYmxlPFRXU0RMRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewogICAgICAgICByZXR1cm4gX2hlbHBlci5leHRlbnNpb25zKCk7CiAgICAgfQogCisgICAgcHVibGljIFRXU0RMRXh0ZW5zaWJsZSBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2l0aEFsbFN1YkVudGl0aWVzRG8oRW50aXR5QWN0aW9uIGFjdGlvbikgewogICAgICAgICBfaGVscGVyLndpdGhBbGxTdWJFbnRpdGllc0RvKGFjdGlvbik7CiAgICAgfQpAQCAtODQsNiArMTA3LDcgQEAKICAgICAgICAgX2hlbHBlci5hY2NlcHQodmlzaXRvcik7CiAgICAgfQogCisgICAgcHJpdmF0ZSBUV1NETEV4dGVuc2libGUgcGFyZW50OwogICAgIHByaXZhdGUgRXh0ZW5zaWJpbGl0eUhlbHBlciBfaGVscGVyOwogICAgIHByaXZhdGUgRG9jdW1lbnRhdGlvbiBfZG9jdW1lbnRhdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9XU0RMQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvV1NETENvbnN0YW50cy5qYXZhCmluZGV4IDY2MDkzM2UuLjM5NzRmMmQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9XU0RMQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1dTRExDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvV1NETERvY3VtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvV1NETERvY3VtZW50LmphdmEKaW5kZXggMjUxY2MzZS4uNGRiMGI1ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1dTRExEb2N1bWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9XU0RMRG9jdW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyMiArMjUsMTUgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQ7CiAKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLio7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5NZXRhZGF0YUZpbmRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuQWJzdHJhY3REb2N1bWVudDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eVJlZmVyZW5jZUFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eVJlZmVyZW5jZVZhbGlkYXRvcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkdsb2JhbGx5S25vd247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5LaW5kOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQogLyoqCiAgKiBBIFdTREwgZG9jdW1lbnQuCiAgKgpAQCAtNDgsNyArNDEsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgV1NETERvY3VtZW50IGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudHsKIAotICAgIHB1YmxpYyBXU0RMRG9jdW1lbnQoKSB7CisgICAgcHVibGljIFdTRExEb2N1bWVudChNZXRhZGF0YUZpbmRlciBmb3Jlc3QsIEVycm9yUmVjZWl2ZXIgZXJyUmVjZWl2ZXIpIHsKKyAgICAgICAgc3VwZXIoZm9yZXN0LCBlcnJSZWNlaXZlcik7CiAgICAgfQogCiAgICAgcHVibGljIERlZmluaXRpb25zIGdldERlZmluaXRpb25zKCkgewpAQCAtNTksMTQgKzUzLDYgQEAKICAgICAgICAgX2RlZmluaXRpb25zID0gZDsKICAgICB9CiAKLSAgICBwdWJsaWMgU2V0IGNvbGxlY3RBbGxOYW1lc3BhY2VzKCkgewotICAgICAgICBTZXQgcmVzdWx0ID0gc3VwZXIuY29sbGVjdEFsbE5hbWVzcGFjZXMoKTsKLSAgICAgICAgaWYgKF9kZWZpbml0aW9ucy5nZXRUYXJnZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKF9kZWZpbml0aW9ucy5nZXRUYXJnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KICAgICBwdWJsaWMgUU5hbWVbXSBnZXRBbGxTZXJ2aWNlUU5hbWVzKCkgewogCiAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlUU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1dTRExEb2N1bWVudFZpc2l0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9XU0RMRG9jdW1lbnRWaXNpdG9yLmphdmEKaW5kZXggOTlkN2Q5YS4uYjVlYmRiMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1dTRExEb2N1bWVudFZpc2l0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvV1NETERvY3VtZW50VmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9XU0RMRG9jdW1lbnRWaXNpdG9yQmFzZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1dTRExEb2N1bWVudFZpc2l0b3JCYXNlLmphdmEKaW5kZXggZjhjZjJlNS4uYjdlM2Q4YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1dTRExEb2N1bWVudFZpc2l0b3JCYXNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L1dTRExEb2N1bWVudFZpc2l0b3JCYXNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUEFkZHJlc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9odHRwL0hUVFBBZGRyZXNzLmphdmEKaW5kZXggNjkzYzUzYS4uM2MwNzJlNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUEFkZHJlc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvaHR0cC9IVFRQQWRkcmVzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE4ICsyNSwyMCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5odHRwOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbkltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIC8qKgogICogQSBIVFRQIGFkZHJlc3MgZXh0ZW5zaW9uLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgSFRUUEFkZHJlc3MgZXh0ZW5kcyBFeHRlbnNpb24geworcHVibGljIGNsYXNzIEhUVFBBZGRyZXNzIGV4dGVuZHMgRXh0ZW5zaW9uSW1wbCB7CiAKLSAgICBwdWJsaWMgSFRUUEFkZHJlc3MoKSB7CisgICAgcHVibGljIEhUVFBBZGRyZXNzKExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICB9CiAKICAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvaHR0cC9IVFRQQmluZGluZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUEJpbmRpbmcuamF2YQppbmRleCBhODFmYWQzLi4zOGFhYWU4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvaHR0cC9IVFRQQmluZGluZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9odHRwL0hUVFBCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDIwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lmh0dHA7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uSW1wbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBBIEhUVFAgYmluZGluZyBleHRlbnNpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBIVFRQQmluZGluZyBleHRlbmRzIEV4dGVuc2lvbiB7CitwdWJsaWMgY2xhc3MgSFRUUEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpb25JbXBsIHsKIAotICAgIHB1YmxpYyBIVFRQQmluZGluZygpIHsKKyAgICBwdWJsaWMgSFRUUEJpbmRpbmcoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgIH0KIAogICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50TmFtZSgpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9odHRwL0hUVFBDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9odHRwL0hUVFBDb25zdGFudHMuamF2YQppbmRleCAxZWM2NGEyLi5hMWMwNzUzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvaHR0cC9IVFRQQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUENvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9odHRwL0hUVFBPcGVyYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9odHRwL0hUVFBPcGVyYXRpb24uamF2YQppbmRleCBhNTYyOTdlLi4wNzY0MTVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvaHR0cC9IVFRQT3BlcmF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUE9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE4ICsyNSwyMCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5odHRwOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbkltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIC8qKgogICogQSBIVFRQIG9wZXJhdGlvbiBleHRlbnNpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBIVFRQT3BlcmF0aW9uIGV4dGVuZHMgRXh0ZW5zaW9uIHsKK3B1YmxpYyBjbGFzcyBIVFRQT3BlcmF0aW9uIGV4dGVuZHMgRXh0ZW5zaW9uSW1wbCB7CiAKLSAgICBwdWJsaWMgSFRUUE9wZXJhdGlvbigpIHsKKyAgICBwdWJsaWMgSFRUUE9wZXJhdGlvbihMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgc3VwZXIobG9jYXRvcik7CiAgICAgfQogCiAgICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUFVybEVuY29kZWQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9odHRwL0hUVFBVcmxFbmNvZGVkLmphdmEKaW5kZXggM2U3ZTg0Ny4uNmY1MjI2ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUFVybEVuY29kZWQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvaHR0cC9IVFRQVXJsRW5jb2RlZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE4ICsyNSwyMSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5odHRwOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbkltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIC8qKgogICogQSBIVFRQIHVybEVuY29kZWQgZXh0ZW5zaW9uLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgSFRUUFVybEVuY29kZWQgZXh0ZW5kcyBFeHRlbnNpb24geworcHVibGljIGNsYXNzIEhUVFBVcmxFbmNvZGVkIGV4dGVuZHMgRXh0ZW5zaW9uSW1wbCB7CiAKLSAgICBwdWJsaWMgSFRUUFVybEVuY29kZWQoKSB7fQorICAgIHB1YmxpYyBIVFRQVXJsRW5jb2RlZChMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgc3VwZXIobG9jYXRvcik7CisgICAgfQogCiAgICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkgewogICAgICAgICByZXR1cm4gSFRUUENvbnN0YW50cy5RTkFNRV9VUkxfRU5DT0RFRDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9odHRwL0hUVFBVcmxSZXBsYWNlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUFVybFJlcGxhY2VtZW50LmphdmEKaW5kZXggODc2YTRlNS4uZTMyNTQxYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUFVybFJlcGxhY2VtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2h0dHAvSFRUUFVybFJlcGxhY2VtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDIwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lmh0dHA7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uSW1wbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBBIEhUVFAgdXJsUmVwbGFjZW1lbnQgZXh0ZW5zaW9uLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgSFRUUFVybFJlcGxhY2VtZW50IGV4dGVuZHMgRXh0ZW5zaW9uIHsKK3B1YmxpYyBjbGFzcyBIVFRQVXJsUmVwbGFjZW1lbnQgZXh0ZW5kcyBFeHRlbnNpb25JbXBsIHsKIAotICAgIHB1YmxpYyBIVFRQVXJsUmVwbGFjZW1lbnQoKSB7CisgICAgcHVibGljIEhUVFBVcmxSZXBsYWNlbWVudChMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgc3VwZXIobG9jYXRvcik7CiAgICAgfQogCiAgICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2pheHdzL0N1c3RvbU5hbWUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9qYXh3cy9DdXN0b21OYW1lLmphdmEKaW5kZXggZjVmYTAxMy4uZTRmY2NhMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2pheHdzL0N1c3RvbU5hbWUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvamF4d3MvQ3VzdG9tTmFtZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9qYXh3cy9FeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9qYXh3cy9FeGNlcHRpb24uamF2YQppbmRleCBiNzQxNzg4Li43OTdlNDE5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvamF4d3MvRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2pheHdzL0V4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9qYXh3cy9KQVhXU0JpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9qYXh3cy9KQVhXU0JpbmRpbmcuamF2YQppbmRleCBhOGY0OGY5Li42OTMwZjMwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvamF4d3MvSkFYV1NCaW5kaW5nLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2pheHdzL0pBWFdTQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDE4ICsyNCwxMiBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5qYXh3czsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb25JbXBsOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IGphdmEudXRpbC4qOwogCiAKIC8qKgpAQCAtNDQsMTMgKzM4LDEzIEBACiAgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KICAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwogICovCi1wdWJsaWMgY2xhc3MgSkFYV1NCaW5kaW5nIGV4dGVuZHMgRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaWJsZSB7CitwdWJsaWMgY2xhc3MgSkFYV1NCaW5kaW5nIGV4dGVuZHMgRXh0ZW5zaW9uSW1wbCB7CiAKICAgICAvKioKICAgICAgKgogICAgICAqLwotICAgIHB1YmxpYyBKQVhXU0JpbmRpbmcoKXsKLSAgICAgICAgc3VwZXIoKTsKKyAgICBwdWJsaWMgSkFYV1NCaW5kaW5nKExvY2F0b3IgbG9jYXRvcil7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgICAgICBqYXhiQmluZGluZ3MgPSBuZXcgSGFzaFNldDxFbGVtZW50PigpOwogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKICAgICB9CkBAIC03MiwxOCArNjYsMjIgQEAKICAgICAgICAgcmV0dXJuIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1M7CiAgICAgfQogCisgICAgcHVibGljIFFOYW1lIGdldFdTRExFbGVtZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEVsZW1lbnROYW1lKCk7CisgICAgfQorCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgRXh0ZW5zaWJsZSNhZGRFeHRlbnNpb24oRXh0ZW5zaW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihFeHRlbnNpb24gZSkgeworICAgICogQHNlZSBUV1NETEV4dGVuc2libGUjYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbkltcGwpCisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oRXh0ZW5zaW9uSW1wbCBlKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAogICAgIH0KIAogICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIEV4dGVuc2libGUjZXh0ZW5zaW9ucygpCisgICAgICogQHNlZSBUV1NETEV4dGVuc2libGUjZXh0ZW5zaW9ucygpCiAgICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4dGVuc2lvbnMoKSB7CisgICAgcHVibGljIEl0ZXJhYmxlPEV4dGVuc2lvbkltcGw+IGV4dGVuc2lvbnMoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMzMzLDYgKzMzMSw2IEBACiAgICAgLy8gcG9ydFR5cGUgY2xhc3NOYW1lCiAgICAgcHJpdmF0ZSBDdXN0b21OYW1lIGNsYXNzTmFtZTsKIAotICAgIC8vcG9ydFR5cGUgT3BlcmF0aW9uCisgICAgLy9wb3J0VHlwZSBXU0RMT3BlcmF0aW9uCiAgICAgcHJpdmF0ZSBDdXN0b21OYW1lIG1ldGhvZE5hbWU7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvamF4d3MvSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2pheHdzL0pBWFdTQmluZGluZ3NDb25zdGFudHMuamF2YQppbmRleCA0YWRhN2RiLi5lZmNkZDcwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvamF4d3MvSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9qYXh3cy9KQVhXU0JpbmRpbmdzQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTAgKzI1LDEwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LmpheHdzOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuQ29uc3RhbnRzOwogCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKwogLyoqCiAgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQogICoKQEAgLTM3LDYgKzM3LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5TX0pBWFdTX0JJTkRJTkdTID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheHdzIjsKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOU19KQVhCX0JJTkRJTkdTID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5TX1hKQ19CSU5ESU5HUyA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiL3hqYyI7CiAKICAgICAvKioKICAgICAgKiBqYXh3czpiaW5kaW5ncyBzY2hlbWEgY29tcG9uZW50CkBAIC0xMjAsNyArMTIxLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIFFOYW1lIENMQVNTID0gbmV3IFFOYW1lKE5TX0pBWFdTX0JJTkRJTkdTLCAiY2xhc3MiKTsKIAogICAgIC8qCi0gICAgICogUG9ydFR5cGUgT3BlcmF0aW9uCisgICAgICogUG9ydFR5cGUgV1NETE9wZXJhdGlvbgogICAgICAqCiAgICAgICogPGpheHdzOm1ldGhvZCBuYW1lPSJ4czpzdHJpbmciPj8KICAgICAgKiAgIDxqYXh3czpqYXZhZG9jPnhzOnN0cmluZzwvamF4d3M6amF2YWRvYz4/CkBAIC0xNTksNyArMTYwLDcgQEAKICAgICAgKi8KIAogICAgIC8qCi0gICAgICogQmluZGluZ09wZXJhdGlvbgorICAgICAqIFdTRExCb3VuZE9wZXJhdGlvbgogICAgICAqCiAgICAgICogPGpheHdzOmVuYWJsZUFkZGl0aW9uYWxTT0FQSGVhZGVyTWFwcGluZz4KICAgICAgKiAgeHM6Ym9vbGVhbgpAQCAtMTg3LDcgKzE4OCw3IEBACiAgICAgICogamF4YjpiaW5kZ3MgUU5hbWUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFFOYW1lIEpBWEJfQklORElOR1MgPSBuZXcgUU5hbWUoTlNfSkFYQl9CSU5ESU5HUywgImJpbmRpbmdzIik7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYQl9CSU5ESU5HX1ZFUlNJT04gPSAiMS4wIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhCX0JJTkRJTkdfVkVSU0lPTiA9ICIyLjAiOwogICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgWFNEX0FQUElORk8gPSBuZXcgUU5hbWUoQ29uc3RhbnRzLk5TX1hTRCwgImFwcGluZm8iKTsKICAgICBwdWJsaWMgc3RhdGljIFFOYW1lIFhTRF9BTk5PVEFUSU9OID0gbmV3IFFOYW1lKENvbnN0YW50cy5OU19YU0QsICJhbm5vdGF0aW9uIik7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvamF4d3MvUGFyYW1ldGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvamF4d3MvUGFyYW1ldGVyLmphdmEKaW5kZXggNzQ1ODhlYS4uMDJhN2IyMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L2pheHdzL1BhcmFtZXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9qYXh3cy9QYXJhbWV0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvbWltZS9NSU1FQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvbWltZS9NSU1FQ29uc3RhbnRzLmphdmEKaW5kZXggNDAxZGQ4MC4uNzdkNzYwNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L21pbWUvTUlNRUNvbnN0YW50cy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9taW1lL01JTUVDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvbWltZS9NSU1FQ29udGVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L21pbWUvTUlNRUNvbnRlbnQuamF2YQppbmRleCAyNGU2ZmNmLi5jMTNiYTU3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvbWltZS9NSU1FQ29udGVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9taW1lL01JTUVDb250ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDIwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lm1pbWU7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uSW1wbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBBIE1JTUUgY29udGVudCBleHRlbnNpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBNSU1FQ29udGVudCBleHRlbmRzIEV4dGVuc2lvbiB7CitwdWJsaWMgY2xhc3MgTUlNRUNvbnRlbnQgZXh0ZW5kcyBFeHRlbnNpb25JbXBsIHsKIAotICAgIHB1YmxpYyBNSU1FQ29udGVudCgpIHsKKyAgICBwdWJsaWMgTUlNRUNvbnRlbnQoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgIH0KIAogICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50TmFtZSgpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9taW1lL01JTUVNdWx0aXBhcnRSZWxhdGVkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvbWltZS9NSU1FTXVsdGlwYXJ0UmVsYXRlZC5qYXZhCmluZGV4IDRkMDg3NzcuLjVlMTI0NmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9taW1lL01JTUVNdWx0aXBhcnRSZWxhdGVkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L21pbWUvTUlNRU11bHRpcGFydFJlbGF0ZWQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyNSArMjUsMjYgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQubWltZTsKIAoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5QWN0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uSW1wbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvblZpc2l0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb25WaXNpdG9yOwotCiAvKioKICAqIEEgTUlNRSBtdWx0aXBhcnRSZWxhdGVkIGV4dGVuc2lvbi4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIE1JTUVNdWx0aXBhcnRSZWxhdGVkIGV4dGVuZHMgRXh0ZW5zaW9uIHsKK3B1YmxpYyBjbGFzcyBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBleHRlbmRzIEV4dGVuc2lvbkltcGwgewogCi0gICAgcHVibGljIE1JTUVNdWx0aXBhcnRSZWxhdGVkKCkgeworICAgIHB1YmxpYyBNSU1FTXVsdGlwYXJ0UmVsYXRlZChMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgc3VwZXIobG9jYXRvcik7CiAgICAgICAgIF9wYXJ0cyA9IG5ldyBBcnJheUxpc3Q8TUlNRVBhcnQ+KCk7CiAgICAgfQogCkBAIC01NSw4ICs1Niw4IEBACiAgICAgICAgIF9wYXJ0cy5hZGQocGFydCk7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yPE1JTUVQYXJ0PiBnZXRQYXJ0cygpIHsKLSAgICAgICAgcmV0dXJuIF9wYXJ0cy5pdGVyYXRvcigpOworICAgIHB1YmxpYyBJdGVyYWJsZTxNSU1FUGFydD4gZ2V0UGFydHMoKSB7CisgICAgICAgIHJldHVybiBfcGFydHM7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd2l0aEFsbFN1YkVudGl0aWVzRG8oRW50aXR5QWN0aW9uIGFjdGlvbikgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L21pbWUvTUlNRVBhcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9taW1lL01JTUVQYXJ0LmphdmEKaW5kZXggN2VlY2ZlMGUuLmE4YmQwOGMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9taW1lL01JTUVQYXJ0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L21pbWUvTUlNRVBhcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyMyArMjUsMjQgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQubWltZTsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaWJsZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMRXh0ZW5zaW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5QWN0aW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJpbGl0eUhlbHBlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2libGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb25JbXBsOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiAvKioKICAqIEEgTUlNRSBwYXJ0IGV4dGVuc2lvbi4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIE1JTUVQYXJ0IGV4dGVuZHMgRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaWJsZSB7CitwdWJsaWMgY2xhc3MgTUlNRVBhcnQgZXh0ZW5kcyBFeHRlbnNpb25JbXBsIGltcGxlbWVudHMgVFdTRExFeHRlbnNpYmxlIHsKIAotICAgIHB1YmxpYyBNSU1FUGFydCgpIHsKKyAgICBwdWJsaWMgTUlNRVBhcnQoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgICAgICBfaGVscGVyID0gbmV3IEV4dGVuc2liaWxpdHlIZWxwZXIoKTsKICAgICB9CiAKQEAgLTU3LDExICs1OCwyMyBAQAogICAgICAgICBfbmFtZSA9IHM7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBlKSB7CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0V1NETEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oVFdTRExFeHRlbnNpb24gZSkgewogICAgICAgICBfaGVscGVyLmFkZEV4dGVuc2lvbihlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgSXRlcmF0b3IgZXh0ZW5zaW9ucygpIHsKKyAgICBwdWJsaWMgSXRlcmFibGU8VFdTRExFeHRlbnNpb24+IGV4dGVuc2lvbnMoKSB7CiAgICAgICAgIHJldHVybiBfaGVscGVyLmV4dGVuc2lvbnMoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9taW1lL01JTUVYbWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9taW1lL01JTUVYbWwuamF2YQppbmRleCA0Mzk1OTdkLi43YTQ0NGJhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvbWltZS9NSU1FWG1sLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L21pbWUvTUlNRVhtbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE4ICsyNSwyMCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5taW1lOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbkltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIC8qKgogICogQSBNSU1FIG1pbWVYbWwgZXh0ZW5zaW9uLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgTUlNRVhtbCBleHRlbmRzIEV4dGVuc2lvbiB7CitwdWJsaWMgY2xhc3MgTUlNRVhtbCBleHRlbmRzIEV4dGVuc2lvbkltcGwgewogCi0gICAgcHVibGljIE1JTUVYbWwoKSB7CisgICAgcHVibGljIE1JTUVYbWwoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgIH0KIAogICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50TmFtZSgpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvQnVpbHRJblR5cGVzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc2NoZW1hL0J1aWx0SW5UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmY5N2VkLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvQnVpbHRJblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGludGVyZmFjZSBCdWlsdEluVHlwZXMgewotICAgIHB1YmxpYyBRTmFtZSBTVFJJTkcgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9TVFJJTkc7Ci0gICAgcHVibGljIFFOYW1lIE5PUk1BTElaRURfU1RSSU5HID0KLSAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfTk9STUFMSVpFRF9TVFJJTkc7Ci0gICAgcHVibGljIFFOYW1lIFRPS0VOID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfVE9LRU47Ci0gICAgcHVibGljIFFOYW1lIEJZVEUgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9CWVRFOwotICAgIHB1YmxpYyBRTmFtZSBVTlNJR05FRF9CWVRFID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfVU5TSUdORURfQllURTsKLSAgICBwdWJsaWMgUU5hbWUgQkFTRTY0X0JJTkFSWSA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX0JBU0U2NF9CSU5BUlk7Ci0gICAgcHVibGljIFFOYW1lIEhFWF9CSU5BUlkgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9IRVhfQklOQVJZOwotICAgIHB1YmxpYyBRTmFtZSBJTlRFR0VSID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfSU5URUdFUjsKLSAgICBwdWJsaWMgUU5hbWUgUE9TSVRJVkVfSU5URUdFUiA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX1BPU0lUSVZFX0lOVEVHRVI7Ci0gICAgcHVibGljIFFOYW1lIE5FR0FUSVZFX0lOVEVHRVIgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9ORUdBVElWRV9JTlRFR0VSOwotICAgIHB1YmxpYyBRTmFtZSBOT05fTkVHQVRJVkVfSU5URUdFUiA9Ci0gICAgICAgIFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX05PTl9ORUdBVElWRV9JTlRFR0VSOwotICAgIHB1YmxpYyBRTmFtZSBOT05fUE9TSVRJVkVfSU5URUdFUiA9Ci0gICAgICAgIFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX05PTl9QT1NJVElWRV9JTlRFR0VSOwotICAgIHB1YmxpYyBRTmFtZSBJTlQgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9JTlQ7Ci0gICAgcHVibGljIFFOYW1lIFVOU0lHTkVEX0lOVCA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX1VOU0lHTkVEX0lOVDsKLSAgICBwdWJsaWMgUU5hbWUgTE9ORyA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX0xPTkc7Ci0gICAgcHVibGljIFFOYW1lIFVOU0lHTkVEX0xPTkcgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9VTlNJR05FRF9MT05HOwotICAgIHB1YmxpYyBRTmFtZSBTSE9SVCA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX1NIT1JUOwotICAgIHB1YmxpYyBRTmFtZSBVTlNJR05FRF9TSE9SVCA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX1VOU0lHTkVEX1NIT1JUOwotICAgIHB1YmxpYyBRTmFtZSBERUNJTUFMID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfREVDSU1BTDsKLSAgICBwdWJsaWMgUU5hbWUgRkxPQVQgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9GTE9BVDsKLSAgICBwdWJsaWMgUU5hbWUgRE9VQkxFID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfRE9VQkxFOwotICAgIHB1YmxpYyBRTmFtZSBCT09MRUFOID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfQk9PTEVBTjsKLSAgICBwdWJsaWMgUU5hbWUgVElNRSA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX1RJTUU7Ci0gICAgcHVibGljIFFOYW1lIERBVEVfVElNRSA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX0RBVEVfVElNRTsKLSAgICBwdWJsaWMgUU5hbWUgRFVSQVRJT04gPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9EVVJBVElPTjsKLSAgICBwdWJsaWMgUU5hbWUgREFURSA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX0RBVEU7Ci0gICAgcHVibGljIFFOYW1lIEdfTU9OVEggPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9HX01PTlRIOwotICAgIHB1YmxpYyBRTmFtZSBHX1lFQVIgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9HX1lFQVI7Ci0gICAgcHVibGljIFFOYW1lIEdfWUVBUl9NT05USCA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX0dfWUVBUl9NT05USDsKLSAgICBwdWJsaWMgUU5hbWUgR19EQVkgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9HX0RBWTsKLSAgICBwdWJsaWMgUU5hbWUgR19NT05USF9EQVkgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9HX01PTlRIX0RBWTsKLSAgICBwdWJsaWMgUU5hbWUgTkFNRSA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX05BTUU7Ci0gICAgcHVibGljIFFOYW1lIFFOQU1FID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfUU5BTUU7Ci0gICAgcHVibGljIFFOYW1lIE5DTkFNRSA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX05DTkFNRTsKLSAgICBwdWJsaWMgUU5hbWUgQU5ZX1VSSSA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX0FOWV9VUkk7Ci0gICAgcHVibGljIFFOYW1lIElEID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfSUQ7Ci0gICAgcHVibGljIFFOYW1lIElEUkVGID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfSURSRUY7Ci0gICAgcHVibGljIFFOYW1lIElEUkVGUyA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX0lEUkVGUzsKLSAgICBwdWJsaWMgUU5hbWUgRU5USVRZID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfRU5USVRZOwotICAgIHB1YmxpYyBRTmFtZSBFTlRJVElFUyA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX0VOVElUSUVTOwotICAgIHB1YmxpYyBRTmFtZSBOT1RBVElPTiA9IFNjaGVtYUNvbnN0YW50cy5RTkFNRV9UWVBFX05PVEFUSU9OOwotICAgIHB1YmxpYyBRTmFtZSBOTVRPS0VOID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1RZUEVfTk1UT0tFTjsKLSAgICBwdWJsaWMgUU5hbWUgTk1UT0tFTlMgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9OTVRPS0VOUzsKLSAgICBwdWJsaWMgUU5hbWUgTEFOR1VBR0UgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9MQU5HVUFHRTsKLSAgICBwdWJsaWMgUU5hbWUgQU5ZX1NJTVBMRV9VUlRZUEUgPSBTY2hlbWFDb25zdGFudHMuUU5BTUVfVFlQRV9TSU1QTEVfVVJUWVBFOwotCi0gICAgLy94c2Q6bGlzdAotICAgIHB1YmxpYyBRTmFtZSBMSVNUID0gU2NoZW1hQ29uc3RhbnRzLlFOQU1FX0xJU1Q7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc2NoZW1hL1NjaGVtYS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzMDJiZC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc2NoZW1hL1NjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNjaGVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRGVmaW5pbmc7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5LaW5kOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyLkNvbnN0YW50czsKLQotLyoqCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWEgZXh0ZW5kcyBFeHRlbnNpb24gaW1wbGVtZW50cyBEZWZpbmluZyB7Ci0KLSAgICBwdWJsaWMgU2NoZW1hKEFic3RyYWN0RG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgX2RvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gICAgICAgIF9uc1ByZWZpeGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgX2RlZmluZWRFbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBTY2hlbWFDb25zdGFudHMuUU5BTUVfU0NIRU1BOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFFbGVtZW50IGdldENvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBfY29udGVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KFNjaGVtYUVsZW1lbnQgZW50aXR5KSB7Ci0gICAgICAgIF9jb250ZW50ID0gZW50aXR5OwotICAgICAgICBfY29udGVudC5zZXRTY2hlbWEodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgX3RhcmdldE5hbWVzcGFjZVVSSSA9IHVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIF90YXJnZXROYW1lc3BhY2VVUkk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgX25zUHJlZml4ZXMucHV0KHByZWZpeCwgdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSSUZvclByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBfbnNQcmVmaXhlcy5nZXQocHJlZml4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgcHJlZml4ZXMoKSB7Ci0gICAgICAgIHJldHVybiBfbnNQcmVmaXhlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlZmluZUFsbEVudGl0aWVzKCkgewotICAgICAgICBpZiAoX2NvbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgInZhbGlkYXRpb24uc2hvdWxkTm90SGFwcGVuIiwKLSAgICAgICAgICAgICAgICAibWlzc2luZyBzY2hlbWEgY29udGVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gX2NvbnRlbnQuY2hpbGRyZW4oKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTY2hlbWFFbGVtZW50IGNoaWxkID0gKFNjaGVtYUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNoaWxkLmdldFFOYW1lKCkuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5RTkFNRV9BVFRSSUJVVEUpKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIF90YXJnZXROYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRWYWx1ZU9mTWFuZGF0b3J5QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUUpKTsKLSAgICAgICAgICAgICAgICBkZWZpbmVFbnRpdHkoY2hpbGQsIFNjaGVtYUtpbmRzLlhTRF9BVFRSSUJVVEUsIG5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICBjaGlsZC5nZXRRTmFtZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlFOQU1FX0FUVFJJQlVURV9HUk9VUCkpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldE5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldFZhbHVlT2ZNYW5kYXRvcnlBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICAgICAgICAgIGRlZmluZUVudGl0eShjaGlsZCwgU2NoZW1hS2luZHMuWFNEX0FUVFJJQlVURV9HUk9VUCwgbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKAotICAgICAgICAgICAgICAgIGNoaWxkLmdldFFOYW1lKCkuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5RTkFNRV9FTEVNRU5UKSkgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBfdGFyZ2V0TmFtZXNwYWNlVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0VmFsdWVPZk1hbmRhdG9yeUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgZGVmaW5lRW50aXR5KGNoaWxkLCBTY2hlbWFLaW5kcy5YU0RfRUxFTUVOVCwgbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmdldFFOYW1lKCkuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5RTkFNRV9HUk9VUCkpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldE5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldFZhbHVlT2ZNYW5kYXRvcnlBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICAgICAgICAgIGRlZmluZUVudGl0eShjaGlsZCwgU2NoZW1hS2luZHMuWFNEX0dST1VQLCBuYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoCi0gICAgICAgICAgICAgICAgY2hpbGQuZ2V0UU5hbWUoKS5lcXVhbHMoU2NoZW1hQ29uc3RhbnRzLlFOQU1FX0NPTVBMRVhfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldE5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldFZhbHVlT2ZNYW5kYXRvcnlBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICAgICAgICAgIGRlZmluZUVudGl0eShjaGlsZCwgU2NoZW1hS2luZHMuWFNEX1RZUEUsIG5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICBjaGlsZC5nZXRRTmFtZSgpLmVxdWFscyhTY2hlbWFDb25zdGFudHMuUU5BTUVfU0lNUExFX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIF90YXJnZXROYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRWYWx1ZU9mTWFuZGF0b3J5QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUUpKTsKLSAgICAgICAgICAgICAgICBkZWZpbmVFbnRpdHkoY2hpbGQsIFNjaGVtYUtpbmRzLlhTRF9UWVBFLCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlZmluZUVudGl0eShTY2hlbWFFbGVtZW50IGVsZW1lbnQsIEtpbmQga2luZCwgUU5hbWUgbmFtZSkgewotICAgICAgICBTY2hlbWFFbnRpdHkgZW50aXR5ID0gbmV3IFNjaGVtYUVudGl0eSh0aGlzLCBlbGVtZW50LCBraW5kLCBuYW1lKTsKLSAgICAgICAgX2RvY3VtZW50LmRlZmluZShlbnRpdHkpOwotICAgICAgICBfZGVmaW5lZEVudGl0aWVzLmFkZChlbnRpdHkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBkZWZpbmVkRW50aXRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBfZGVmaW5lZEVudGl0aWVzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGVUaGlzKCkgewotICAgICAgICBpZiAoX2NvbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgInZhbGlkYXRpb24uc2hvdWxkTm90SGFwcGVuIiwKLSAgICAgICAgICAgICAgICAibWlzc2luZyBzY2hlbWEgY29udGVudCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbG9vayBmb3IgYSBwcmVmaXgKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByZWZpeGVzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdCBmb3VuZAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFic3RyYWN0RG9jdW1lbnQgX2RvY3VtZW50OwotICAgIHByaXZhdGUgU3RyaW5nIF90YXJnZXROYW1lc3BhY2VVUkk7Ci0gICAgcHJpdmF0ZSBTY2hlbWFFbGVtZW50IF9jb250ZW50OwotICAgIHByaXZhdGUgTGlzdCBfZGVmaW5lZEVudGl0aWVzOwotICAgIHByaXZhdGUgTWFwIF9uc1ByZWZpeGVzOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTczYTYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5Xcml0ZXJDb250ZXh0OwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUF0dHJpYnV0ZSB7Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGUoU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBfbG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gX25zVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgcykgewotICAgICAgICBfbnNVUkkgPSBzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gX2xvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgX2xvY2FsTmFtZSA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKF9uc1VSSSwgX2xvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKF9xbmFtZVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChfcGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBfcGFyZW50LmFzU3RyaW5nKF9xbmFtZVZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBfdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKFdyaXRlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoX3FuYW1lVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UU5hbWVTdHJpbmcoX3FuYW1lVmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBzKSB7Ci0gICAgICAgIF92YWx1ZSA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoUU5hbWUgbmFtZSkgewotICAgICAgICBfcW5hbWVWYWx1ZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUVsZW1lbnQgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gX3BhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoU2NoZW1hRWxlbWVudCBlKSB7Ci0gICAgICAgIF9wYXJlbnQgPSBlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF9uc1VSSTsKLSAgICBwcml2YXRlIFN0cmluZyBfbG9jYWxOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsKLSAgICBwcml2YXRlIFFOYW1lIF9xbmFtZVZhbHVlOwotICAgIHByaXZhdGUgU2NoZW1hRWxlbWVudCBfcGFyZW50OwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvU2NoZW1hQ29uc3RhbnRzLmphdmEKaW5kZXggMzgxYWU2Mi4uM2Q1MTkwNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFDb25zdGFudHMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc2NoZW1hL1NjaGVtYUNvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvU2NoZW1hRG9jdW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvU2NoZW1hRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkMDAyZS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc2NoZW1hL1NjaGVtYURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc2NoZW1hOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkFic3RyYWN0RG9jdW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlSZWZlcmVuY2VBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3I7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5HbG9iYWxseUtub3duOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuS2luZDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogQSBYTUwgU2NoZW1hIGRvY3VtZW50LgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hRG9jdW1lbnQgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50IHsKLQotICAgIHB1YmxpYyBTY2hlbWFEb2N1bWVudCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKLSAgICAgICAgcmV0dXJuIF9zY2hlbWE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFNjaGVtYSBzKSB7Ci0gICAgICAgIF9zY2hlbWEgPSBzOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgY29sbGVjdEFsbE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIFNldCByZXN1bHQgPSBzdXBlci5jb2xsZWN0QWxsTmFtZXNwYWNlcygpOwotICAgICAgICBpZiAoX3NjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKF9zY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRW50aXR5UmVmZXJlbmNlVmFsaWRhdG9yIHZhbGlkYXRvcikgewotICAgICAgICBHbG9iYWxseVZhbGlkYXRpbmdBY3Rpb24gYWN0aW9uID0KLSAgICAgICAgICAgIG5ldyBHbG9iYWxseVZhbGlkYXRpbmdBY3Rpb24odGhpcywgdmFsaWRhdG9yKTsKLSAgICAgICAgd2l0aEFsbFN1YkVudGl0aWVzRG8oYWN0aW9uKTsKLSAgICAgICAgaWYgKGFjdGlvbi5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBhY3Rpb24uZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRW50aXR5IGdldFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBfc2NoZW1hOwotICAgIH0KLQotICAgIHByaXZhdGUgU2NoZW1hIF9zY2hlbWE7Ci0KLSAgICBwcml2YXRlIGNsYXNzIEdsb2JhbGx5VmFsaWRhdGluZ0FjdGlvbgotICAgICAgICBpbXBsZW1lbnRzIEVudGl0eUFjdGlvbiwgRW50aXR5UmVmZXJlbmNlQWN0aW9uIHsKLSAgICAgICAgcHVibGljIEdsb2JhbGx5VmFsaWRhdGluZ0FjdGlvbigKLSAgICAgICAgICAgIEFic3RyYWN0RG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICBFbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0gICAgICAgICAgICBfZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgICAgICAgICAgIF92YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtKEVudGl0eSBlbnRpdHkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW50aXR5LnZhbGlkYXRlVGhpcygpOwotICAgICAgICAgICAgICAgIGVudGl0eS53aXRoQWxsRW50aXR5UmVmZXJlbmNlc0RvKHRoaXMpOwotICAgICAgICAgICAgICAgIGVudGl0eS53aXRoQWxsU3ViRW50aXRpZXNEbyh0aGlzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChfZXhjZXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgX2V4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybShLaW5kIGtpbmQsIFFOYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsbHlLbm93biBlbnRpdHkgPSBfZG9jdW1lbnQuZmluZChraW5kLCBuYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVudGl0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIHJlc29sdmUsIGNoZWNrIHdpdGggdGhlIHZhbGlkYXRvcgotICAgICAgICAgICAgICAgIGlmIChfZXhjZXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF92YWxpZGF0b3IgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIV92YWxpZGF0b3IuaXNWYWxpZChraW5kLCBuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgX2V4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmFsaWRhdGlvbkV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gX2V4Y2VwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVmFsaWRhdGlvbkV4Y2VwdGlvbiBfZXhjZXB0aW9uOwotICAgICAgICBwcml2YXRlIEFic3RyYWN0RG9jdW1lbnQgX2RvY3VtZW50OwotICAgICAgICBwcml2YXRlIEVudGl0eVJlZmVyZW5jZVZhbGlkYXRvciBfdmFsaWRhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvU2NoZW1hRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTM0MDUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc2NoZW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5OdWxsSXRlcmF0b3I7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKLQotLyoqCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFFbGVtZW50IHsKLQotICAgIHB1YmxpYyBTY2hlbWFFbGVtZW50KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgX2xvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hRWxlbWVudChRTmFtZSBuYW1lKSB7Ci0gICAgICAgIF9xbmFtZSA9IG5hbWU7Ci0gICAgICAgIF9sb2NhbE5hbWUgPSBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBfbnNVUkkgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gX25zVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgcykgewotICAgICAgICBfbnNVUkkgPSBzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gX2xvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgX2xvY2FsTmFtZSA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgewotICAgICAgICBpZiAoX3FuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIF9xbmFtZSA9IG5ldyBRTmFtZShfbnNVUkksIF9sb2NhbE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfcW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUVsZW1lbnQgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gX3BhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoU2NoZW1hRWxlbWVudCBlKSB7Ci0gICAgICAgIF9wYXJlbnQgPSBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFFbGVtZW50IGdldFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBfcGFyZW50ID09IG51bGwgPyB0aGlzIDogX3BhcmVudC5nZXRSb290KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0gICAgICAgIHJldHVybiBfcGFyZW50ID09IG51bGwgPyBfc2NoZW1hIDogX3BhcmVudC5nZXRTY2hlbWEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU2NoZW1hIHMpIHsKLSAgICAgICAgX3NjaGVtYSA9IHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoU2NoZW1hRWxlbWVudCBlKSB7Ci0gICAgICAgIGlmIChfY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgX2NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2NoaWxkcmVuLmFkZChlKTsKLSAgICAgICAgZS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0Q2hpbGRBdFRvcChTY2hlbWFFbGVtZW50IGUpIHsKLSAgICAgICAgaWYgKF9jaGlsZHJlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBfY2hpbGRyZW4uYWRkKDAsIGUpOwotICAgICAgICBlLnNldFBhcmVudCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgY2hpbGRyZW4oKSB7Ci0gICAgICAgIGlmIChfY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE51bGxJdGVyYXRvci5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIF9jaGlsZHJlbi5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFNjaGVtYUF0dHJpYnV0ZSBhKSB7Ci0gICAgICAgIGlmIChfYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9hdHRyaWJ1dGVzLmFkZChhKTsKLSAgICAgICAgYS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGEuZ2V0VmFsdWUoKTsKLSAgICAgICAgLy8gdGhpcyBpcyBhIGhhY2sgdG8gZm9yY2UgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0byBiZSBhZGRlZCwgaWYgbmVlZGVkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlIGF0dHIgPSBuZXcgU2NoZW1hQXR0cmlidXRlKCk7Ci0gICAgICAgIGF0dHIuc2V0TG9jYWxOYW1lKG5hbWUpOwotICAgICAgICBhdHRyLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGF0dHIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgUU5hbWUgdmFsdWUpIHsKLSAgICAgICAgU2NoZW1hQXR0cmlidXRlIGF0dHIgPSBuZXcgU2NoZW1hQXR0cmlidXRlKCk7Ci0gICAgICAgIGF0dHIuc2V0TG9jYWxOYW1lKG5hbWUpOwotICAgICAgICBhdHRyLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGF0dHIpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBhdHRyaWJ1dGVzKCkgewotICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE51bGxJdGVyYXRvci5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlIGdldEF0dHJpYnV0ZShTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIGlmIChfYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGUgYXR0ciA9IChTY2hlbWFBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKGF0dHIuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlT2ZNYW5kYXRvcnlBdHRyaWJ1dGUoU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBTY2hlbWFBdHRyaWJ1dGUgYXR0ciA9IGdldEF0dHJpYnV0ZShsb2NhbE5hbWUpOwotICAgICAgICBpZiAoYXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbi5taXNzaW5nUmVxdWlyZWRBdHRyaWJ1dGUiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGxvY2FsTmFtZSwgX2xvY2FsTmFtZSB9KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVPZkF0dHJpYnV0ZU9yTnVsbChTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIFNjaGVtYUF0dHJpYnV0ZSBhdHRyID0gZ2V0QXR0cmlidXRlKGxvY2FsTmFtZSk7Ci0gICAgICAgIGlmIChhdHRyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFZhbHVlT2ZCb29sZWFuQXR0cmlidXRlT3JEZWZhdWx0KAotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSBnZXRWYWx1ZU9mQXR0cmlidXRlT3JOdWxsKGxvY2FsTmFtZSk7Ci0gICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJpbmdWYWx1ZS5lcXVhbHMoInRydWUiKSB8fCBzdHJpbmdWYWx1ZS5lcXVhbHMoIjEiKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUuZXF1YWxzKCJmYWxzZSIpIHx8IHN0cmluZ1ZhbHVlLmVxdWFscygiMCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbi5pbnZhbGlkQXR0cmlidXRlVmFsdWUiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGxvY2FsTmFtZSwgc3RyaW5nVmFsdWUgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlT2ZJbnRlZ2VyQXR0cmlidXRlT3JEZWZhdWx0KAotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IGdldFZhbHVlT2ZBdHRyaWJ1dGVPck51bGwobG9jYWxOYW1lKTsKLSAgICAgICAgaWYgKHN0cmluZ1ZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZ1ZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uLmludmFsaWRBdHRyaWJ1dGVWYWx1ZSIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbG9jYWxOYW1lLCBzdHJpbmdWYWx1ZSB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRWYWx1ZU9mUU5hbWVBdHRyaWJ1dGVPck51bGwoU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSBnZXRWYWx1ZU9mQXR0cmlidXRlT3JOdWxsKGxvY2FsTmFtZSk7Ci0gICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IFhtbFV0aWwuZ2V0UHJlZml4KHN0cmluZ1ZhbHVlKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9Ci0gICAgICAgICAgICAocHJlZml4ID09IG51bGwgPyBnZXRVUklGb3JQcmVmaXgoIiIpIDogZ2V0VVJJRm9yUHJlZml4KHByZWZpeCkpOwotICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uLmludmFsaWRBdHRyaWJ1dGVWYWx1ZSIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbG9jYWxOYW1lLCBzdHJpbmdWYWx1ZSB9KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSwgWG1sVXRpbC5nZXRMb2NhbFBhcnQoc3RyaW5nVmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcmVmaXgoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotICAgICAgICBpZiAoX25zUHJlZml4ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgX25zUHJlZml4ZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX25zUHJlZml4ZXMucHV0KHByZWZpeCwgdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSSUZvclByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIGlmIChfbnNQcmVmaXhlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgX25zUHJlZml4ZXMuZ2V0KHByZWZpeCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBpZiAoX3BhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3BhcmVudC5nZXRVUklGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoX3NjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5nZXRVUklGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICAvLyBnaXZlIHVwCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVzUHJlZml4ZXMoKSB7Ci0gICAgICAgIHJldHVybiBfbnNQcmVmaXhlcyAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBwcmVmaXhlcygpIHsKLSAgICAgICAgaWYgKF9uc1ByZWZpeGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBOdWxsSXRlcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBfbnNQcmVmaXhlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGFzUU5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IFhtbFV0aWwuZ2V0UHJlZml4KHMpOwotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB1cmkgPSBnZXRVUklGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigidmFsaWRhdGlvbi5pbnZhbGlkUHJlZml4IiwgcHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gWG1sVXRpbC5nZXRMb2NhbFBhcnQocyk7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUodXJpLCBsb2NhbFBhcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoUU5hbWUgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgcHJlZml4Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVmaXhlcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldFVSSUZvclByZWZpeChwcmVmaXgpOwotICAgICAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90IGZvdW5kCi0gICAgICAgICAgICBpZiAoX3BhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJlbnQuYXNTdHJpbmcobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX3NjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IF9zY2hlbWEuYXNTdHJpbmcobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3QgZm91bmQgYW5kIG5vIHBhcmVudAotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldE5ld1ByZWZpeCgpOwotICAgICAgICAgICAgYWRkUHJlZml4KHByZWZpeCwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICByZXR1cm4gYXNTdHJpbmcobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld1ByZWZpeCgpIHsKLSAgICAgICAgU3RyaW5nIGJhc2UgPSBORVdfTlNfUFJFRklYX0JBU0U7Ci0gICAgICAgIGludCBjb3VudCA9IDI7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICBmb3IgKGJvb2xlYW4gbmVlZE5ld09uZSA9IHRydWU7IG5lZWROZXdPbmU7ICsrY291bnQpIHsKLSAgICAgICAgICAgIHByZWZpeCA9IGJhc2UgKyBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50KTsKLSAgICAgICAgICAgIG5lZWROZXdPbmUgPSBnZXRVUklGb3JQcmVmaXgocHJlZml4KSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX25zVVJJOwotICAgIHByaXZhdGUgU3RyaW5nIF9sb2NhbE5hbWU7Ci0gICAgcHJpdmF0ZSBMaXN0IF9jaGlsZHJlbjsKLSAgICBwcml2YXRlIExpc3QgX2F0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBNYXAgX25zUHJlZml4ZXM7Ci0gICAgcHJpdmF0ZSBTY2hlbWFFbGVtZW50IF9wYXJlbnQ7Ci0gICAgcHJpdmF0ZSBRTmFtZSBfcW5hbWU7Ci0gICAgcHJpdmF0ZSBTY2hlbWEgX3NjaGVtYTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTlNfUFJFRklYX0JBU0UgPSAibnMiOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFFbnRpdHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvU2NoZW1hRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmNiOGEuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkRlZmluaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRW50aXR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuR2xvYmFsbHlLbm93bjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLktpbmQ7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hRW50aXR5IGV4dGVuZHMgRW50aXR5IGltcGxlbWVudHMgR2xvYmFsbHlLbm93biB7Ci0KLSAgICBwdWJsaWMgU2NoZW1hRW50aXR5KAotICAgICAgICBTY2hlbWEgcGFyZW50LAotICAgICAgICBTY2hlbWFFbGVtZW50IGVsZW1lbnQsCi0gICAgICAgIEtpbmQga2luZCwKLSAgICAgICAgUU5hbWUgbmFtZSkgewotICAgICAgICBfcGFyZW50ID0gcGFyZW50OwotICAgICAgICBfZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgIF9raW5kID0ga2luZDsKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBfZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBfZWxlbWVudC5nZXRRTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0gICAgICAgIHJldHVybiBfa2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKLSAgICAgICAgcmV0dXJuIF9wYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIERlZmluaW5nIGdldERlZmluaW5nKCkgewotICAgICAgICByZXR1cm4gX3BhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVRoaXMoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNjaGVtYSBfcGFyZW50OwotICAgIHByaXZhdGUgU2NoZW1hRWxlbWVudCBfZWxlbWVudDsKLSAgICBwcml2YXRlIEtpbmQgX2tpbmQ7Ci0gICAgcHJpdmF0ZSBRTmFtZSBfbmFtZTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvU2NoZW1hS2luZHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zY2hlbWEvU2NoZW1hS2luZHMuamF2YQppbmRleCBlNDNhNTc3Li4xMzFhYTI2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc2NoZW1hL1NjaGVtYUtpbmRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NjaGVtYS9TY2hlbWFLaW5kcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVAxMkJpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVAxMkJpbmRpbmcuamF2YQppbmRleCAwY2FlNDg2Li4zNmM5ODJmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQMTJCaW5kaW5nLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUDEyQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDkgKzI0LDE1IEBACiAgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXA7CiAKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogcHVibGljIGNsYXNzIFNPQVAxMkJpbmRpbmcgZXh0ZW5kcyBTT0FQQmluZGluZ3sKKyAgICBwdWJsaWMgU09BUDEyQmluZGluZyhMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgc3VwZXIobG9jYXRvcik7CisgICAgfQorCiAgICAgQE92ZXJyaWRlIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9CSU5ESU5HOwogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVAxMkNvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUDEyQ29uc3RhbnRzLmphdmEKaW5kZXggZTg3MzhkNC4uYTViYTk3ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUDEyQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUDEyQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEFkZHJlc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBBZGRyZXNzLmphdmEKaW5kZXggOTVhMmJmYS4uODk4MDhhOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEFkZHJlc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQQWRkcmVzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE4ICsyNSwyMCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbkltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIC8qKgogICogQSBTT0FQIGFkZHJlc3MgZXh0ZW5zaW9uLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgU09BUEFkZHJlc3MgZXh0ZW5kcyBFeHRlbnNpb24geworcHVibGljIGNsYXNzIFNPQVBBZGRyZXNzIGV4dGVuZHMgRXh0ZW5zaW9uSW1wbCB7CiAKLSAgICBwdWJsaWMgU09BUEFkZHJlc3MoKSB7CisgICAgcHVibGljIFNPQVBBZGRyZXNzKExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICB9CiAKICAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQQmluZGluZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEJpbmRpbmcuamF2YQppbmRleCBiZTJmZTg5Li40MWVlNmEyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQQmluZGluZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDIwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXA7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uSW1wbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBBIFNPQVAgYmluZGluZyBleHRlbnNpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZyBleHRlbmRzIEV4dGVuc2lvbiB7CitwdWJsaWMgY2xhc3MgU09BUEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpb25JbXBsIHsKIAotICAgIHB1YmxpYyBTT0FQQmluZGluZygpIHsKKyAgICBwdWJsaWMgU09BUEJpbmRpbmcoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgICAgICBfc3R5bGUgPSBTT0FQU3R5bGUuRE9DVU1FTlQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQQm9keS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEJvZHkuamF2YQppbmRleCAwYmFlNzUwLi42Zjc4ZmE0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQQm9keS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBCb2R5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDIwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXA7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uSW1wbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBBIFNPQVAgYm9keSBleHRlbnNpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBTT0FQQm9keSBleHRlbmRzIEV4dGVuc2lvbiB7CitwdWJsaWMgY2xhc3MgU09BUEJvZHkgZXh0ZW5kcyBFeHRlbnNpb25JbXBsIHsKIAotICAgIHB1YmxpYyBTT0FQQm9keSgpIHsKKyAgICBwdWJsaWMgU09BUEJvZHkoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOwogICAgIH0KIAogICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50TmFtZSgpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBDb25zdGFudHMuamF2YQppbmRleCBkOGFjMGNmLi4xMWExNzlhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUENvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEwICsyNSwxMCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVBOYW1lc3BhY2VDb25zdGFudHM7CiAKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCiAvKioKICAqIEludGVyZmFjZSBkZWZpbmluZyBTT0FQLXJlbGF0ZWQgY29uc3RhbnRzLgogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBGYXVsdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEZhdWx0LmphdmEKaW5kZXggYjEyY2YzNS4uNDUyZTAwNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEZhdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEZhdWx0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDIwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXA7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uSW1wbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiBBIFNPQVAgZmF1bHQgZXh0ZW5zaW9uLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgU09BUEZhdWx0IGV4dGVuZHMgRXh0ZW5zaW9uIHsKK3B1YmxpYyBjbGFzcyBTT0FQRmF1bHQgZXh0ZW5kcyBFeHRlbnNpb25JbXBsIHsKIAotICAgIHB1YmxpYyBTT0FQRmF1bHQoKSB7CisgICAgcHVibGljIFNPQVBGYXVsdChMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgc3VwZXIobG9jYXRvcik7CiAgICAgICAgIF91c2UgPSBTT0FQVXNlLkxJVEVSQUw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQSGVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQSGVhZGVyLmphdmEKaW5kZXggYzc1ZTc1OC4uZDhlNTg2YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEhlYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBIZWFkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyNiArMjUsMjMgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcDsKIAoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkVudGl0eUFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvblZpc2l0b3I7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5RTmFtZUFjdGlvbjsKLQogLyoqCiAgKiBBIFNPQVAgaGVhZGVyIGV4dGVuc2lvbi4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIFNPQVBIZWFkZXIgZXh0ZW5kcyBFeHRlbnNpb24geworcHVibGljIGNsYXNzIFNPQVBIZWFkZXIgZXh0ZW5kcyBFeHRlbnNpb25JbXBsIHsKIAotICAgIHB1YmxpYyBTT0FQSGVhZGVyKCkgeworICAgIHB1YmxpYyBTT0FQSGVhZGVyKExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICAgICAgX2ZhdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBIZWFkZXJGYXVsdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEhlYWRlckZhdWx0LmphdmEKaW5kZXggZmEwZTFmYy4uZjMwZTk0ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEhlYWRlckZhdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUEhlYWRlckZhdWx0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTkgKzI1LDIxIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXA7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb25JbXBsOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUU5hbWVBY3Rpb247CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIC8qKgogICogQSBTT0FQIGhlYWRlciBmYXVsdCBleHRlbnNpb24uCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVyRmF1bHQgZXh0ZW5kcyBFeHRlbnNpb24geworcHVibGljIGNsYXNzIFNPQVBIZWFkZXJGYXVsdCBleHRlbmRzIEV4dGVuc2lvbkltcGwgewogCi0gICAgcHVibGljIFNPQVBIZWFkZXJGYXVsdCgpIHsKKyAgICBwdWJsaWMgU09BUEhlYWRlckZhdWx0KExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICB9CiAKICAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQT3BlcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQT3BlcmF0aW9uLmphdmEKaW5kZXggYzUxOWRlYi4uZjA1NjMxNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxOCArMjUsMjEgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcDsKIAotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb25JbXBsOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiAvKioKICAqIEEgU09BUCBvcGVyYXRpb24gZXh0ZW5zaW9uLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgU09BUE9wZXJhdGlvbiBleHRlbmRzIEV4dGVuc2lvbiB7CitwdWJsaWMgY2xhc3MgU09BUE9wZXJhdGlvbiBleHRlbmRzIEV4dGVuc2lvbkltcGwgewogCi0gICAgcHVibGljIFNPQVBPcGVyYXRpb24oKSB7CisgICAgcHVibGljIFNPQVBPcGVyYXRpb24oTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOworCiAgICAgfQogCiAgICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUFN0eWxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQU3R5bGUuamF2YQppbmRleCBjZDVkNDA3Li40ZGM4NTJlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQU3R5bGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQU3R5bGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQVXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZG9jdW1lbnQvc29hcC9TT0FQVXNlLmphdmEKaW5kZXggYjA3ZTAzOC4uNzkzYTBkNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2RvY3VtZW50L3NvYXAvU09BUFVzZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9kb2N1bWVudC9zb2FwL1NPQVBVc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0Fic3RyYWN0RG9jdW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvQWJzdHJhY3REb2N1bWVudC5qYXZhCmluZGV4IDMzNGFhMDAuLmE0ODM4MDggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvQWJzdHJhY3REb2N1bWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvQWJzdHJhY3REb2N1bWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE1ICsyNSwxNiBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcms7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5NZXRhZGF0YUZpbmRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyLkRPTUZvcmVzdDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkFib3J0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxNZXNzYWdlczsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkxvY2F0b3JJbXBsOwogCiAvKioKICAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBkb2N1bWVudHMgY29udGFpbmluZyBlbnRpdGllcy4KQEAgLTQyLDEzICs0MywxNyBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REb2N1bWVudCB7CiAKLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3REb2N1bWVudCgpIHsKLSAgICAgICAgX2tpbmRzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgX2lkZW50aWZpYWJsZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBfaW1wb3J0ZWRFbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgX2ltcG9ydGVkRG9jdW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgX2luY2x1ZGVkRW50aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIF9pbmNsdWRlZERvY3VtZW50cyA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIERPTUZvcmVzdCBmb3Jlc3Q7CisgICAgcHJvdGVjdGVkIGZpbmFsIEVycm9yUmVjZWl2ZXIgZXJyUmVjZWl2ZXI7CisKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3REb2N1bWVudChNZXRhZGF0YUZpbmRlciBmb3Jlc3QsIEVycm9yUmVjZWl2ZXIgZXJyUmVjZWl2ZXIpIHsKKyAgICAgICAgdGhpcy5mb3Jlc3QgPSBmb3Jlc3Q7CisgICAgICAgIHRoaXMuZXJyUmVjZWl2ZXIgPSBlcnJSZWNlaXZlcjsKKyAgICAgICAga2luZHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBpbXBvcnRlZEVudGl0aWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBpbXBvcnRlZERvY3VtZW50cyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIGluY2x1ZGVkRW50aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGluY2x1ZGVkRG9jdW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewpAQCAtNjMsMzIgKzY4LDMyIEBACiAKICAgICAgICAgX3N5c3RlbUlkID0gczsKICAgICAgICAgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgX2ltcG9ydGVkRG9jdW1lbnRzLmFkZChzKTsKKyAgICAgICAgICAgIGltcG9ydGVkRG9jdW1lbnRzLmFkZChzKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZEluY2x1ZGVkRG9jdW1lbnQoU3RyaW5nIHN5c3RlbUlkKSB7Ci0gICAgICAgIF9pbmNsdWRlZERvY3VtZW50cy5hZGQoc3lzdGVtSWQpOworICAgICAgICBpbmNsdWRlZERvY3VtZW50cy5hZGQoc3lzdGVtSWQpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZWREb2N1bWVudChTdHJpbmcgc3lzdGVtSWQpIHsKLSAgICAgICAgcmV0dXJuIF9pbmNsdWRlZERvY3VtZW50cy5jb250YWlucyhzeXN0ZW1JZCk7CisgICAgICAgIHJldHVybiBpbmNsdWRlZERvY3VtZW50cy5jb250YWlucyhzeXN0ZW1JZCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYWRkSW5jbHVkZWRFbnRpdHkoRW50aXR5IGVudGl0eSkgewotICAgICAgICBfaW5jbHVkZWRFbnRpdGllcy5hZGQoZW50aXR5KTsKKyAgICAgICAgaW5jbHVkZWRFbnRpdGllcy5hZGQoZW50aXR5KTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnRlZERvY3VtZW50KFN0cmluZyBzeXN0ZW1JZCkgewotICAgICAgICBfaW1wb3J0ZWREb2N1bWVudHMuYWRkKHN5c3RlbUlkKTsKKyAgICAgICAgaW1wb3J0ZWREb2N1bWVudHMuYWRkKHN5c3RlbUlkKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0ltcG9ydGVkRG9jdW1lbnQoU3RyaW5nIHN5c3RlbUlkKSB7Ci0gICAgICAgIHJldHVybiBfaW1wb3J0ZWREb2N1bWVudHMuY29udGFpbnMoc3lzdGVtSWQpOworICAgICAgICByZXR1cm4gaW1wb3J0ZWREb2N1bWVudHMuY29udGFpbnMoc3lzdGVtSWQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZEltcG9ydGVkRW50aXR5KEVudGl0eSBlbnRpdHkpIHsKLSAgICAgICAgX2ltcG9ydGVkRW50aXRpZXMuYWRkKGVudGl0eSk7CisgICAgICAgIGltcG9ydGVkRW50aXRpZXMuYWRkKGVudGl0eSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd2l0aEFsbFN1YkVudGl0aWVzRG8oRW50aXR5QWN0aW9uIGFjdGlvbikgewpAQCAtOTYsMjAgKzEwMSwyMCBAQAogICAgICAgICAgICAgYWN0aW9uLnBlcmZvcm0oZ2V0Um9vdCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF9pbXBvcnRlZEVudGl0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbXBvcnRlZEVudGl0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewogICAgICAgICAgICAgYWN0aW9uLnBlcmZvcm0oKEVudGl0eSkgaXRlci5uZXh0KCkpOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gX2luY2x1ZGVkRW50aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGluY2x1ZGVkRW50aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICBhY3Rpb24ucGVyZm9ybSgoRW50aXR5KSBpdGVyLm5leHQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgTWFwIGdldE1hcChLaW5kIGspIHsKLSAgICAgICAgTWFwIG0gPSAoTWFwKSBfa2luZHMuZ2V0KGsuZ2V0TmFtZSgpKTsKKyAgICAgICAgTWFwIG0gPSAoTWFwKSBraW5kcy5nZXQoay5nZXROYW1lKCkpOwogICAgICAgICBpZiAobSA9PSBudWxsKSB7CiAgICAgICAgICAgICBtID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIF9raW5kcy5wdXQoay5nZXROYW1lKCksIG0pOworICAgICAgICAgICAga2luZHMucHV0KGsuZ2V0TmFtZSgpLCBtKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbTsKICAgICB9CkBAIC0xMjEsMTAgKzEyNiwxMiBAQAogICAgICAgICBRTmFtZSBuYW1lID0KICAgICAgICAgICAgIG5ldyBRTmFtZShlLmdldERlZmluaW5nKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJKCksIGUuZ2V0TmFtZSgpKTsKIAotICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZUVudGl0eUV4Y2VwdGlvbihlKTsKLSAgICAgICAgZWxzZQorICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KG5hbWUpKXsKKyAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGUuZ2V0TG9jYXRvcigpLCBXc2RsTWVzc2FnZXMuRU5USVRZX0RVUExJQ0FURV9XSVRIX1RZUEUoZS5nZXRFbGVtZW50TmFtZSgpLmdldExvY2FsUGFydCgpLCBlLmdldE5hbWUoKSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXhjZXB0aW9uKCk7CisgICAgICAgIH1lbHNlewogICAgICAgICAgICAgbWFwLnB1dChuYW1lLCBlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVuZGVmaW5lKEdsb2JhbGx5S25vd24gZSkgewpAQCAtMTM0LDg0ICsxNDEsMjQgQEAKICAgICAgICAgUU5hbWUgbmFtZSA9CiAgICAgICAgICAgICBuZXcgUU5hbWUoZS5nZXREZWZpbmluZygpLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpLCBlLmdldE5hbWUoKSk7CiAKLSAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24obmFtZSk7Ci0gICAgICAgIGVsc2UKKyAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShuYW1lKSl7CisgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihlLmdldExvY2F0b3IoKSwgV3NkbE1lc3NhZ2VzLkVOVElUWV9OT1RfRk9VTkRfQllfUV9OQU1FKGUuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgZS5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgbWFwLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBHbG9iYWxseUtub3duIGZpbmQoS2luZCBrLCBRTmFtZSBuYW1lKSB7CiAgICAgICAgIE1hcCBtYXAgPSBnZXRNYXAoayk7CiAgICAgICAgIE9iamVjdCByZXN1bHQgPSBtYXAuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKG5hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpeworICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IobmV3IExvY2F0b3JJbXBsKCksIFdzZGxNZXNzYWdlcy5FTlRJVFlfTk9UX0ZPVU5EX0JZX1FfTkFNRShuYW1lLmdldExvY2FsUGFydCgpLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gKEdsb2JhbGx5S25vd24pIHJlc3VsdDsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBkZWZpbmVJRChJZGVudGlmaWFibGUgZSkgewotICAgICAgICBTdHJpbmcgaWQgPSBlLmdldElEKCk7Ci0gICAgICAgIGlmIChpZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChfaWRlbnRpZmlhYmxlcy5jb250YWluc0tleShpZCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRHVwbGljYXRlRW50aXR5RXhjZXB0aW9uKGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBfaWRlbnRpZmlhYmxlcy5wdXQoaWQsIGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuZGVmaW5lSUQoSWRlbnRpZmlhYmxlIGUpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gZS5nZXRJRCgpOwotCi0gICAgICAgIGlmIChpZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChfaWRlbnRpZmlhYmxlcy5jb250YWluc0tleShpZCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKGlkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX2lkZW50aWZpYWJsZXMucmVtb3ZlKGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSWRlbnRpZmlhYmxlIGZpbmRCeUlEKFN0cmluZyBpZCkgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gX2lkZW50aWZpYWJsZXMuZ2V0KGlkKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVudGl0eUV4Y2VwdGlvbihpZCk7Ci0gICAgICAgIHJldHVybiAoSWRlbnRpZmlhYmxlKSByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBjb2xsZWN0QWxsUU5hbWVzKCkgewotICAgICAgICBmaW5hbCBTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgRW50aXR5QWN0aW9uIGFjdGlvbiA9IG5ldyBFbnRpdHlBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtKEVudGl0eSBlbnRpdHkpIHsKLSAgICAgICAgICAgICAgICBlbnRpdHkud2l0aEFsbFFOYW1lc0RvKG5ldyBRTmFtZUFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybShRTmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgZW50aXR5LndpdGhBbGxTdWJFbnRpdGllc0RvKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB3aXRoQWxsU3ViRW50aXRpZXNEbyhhY3Rpb24pOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgY29sbGVjdEFsbE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIGZpbmFsIFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIEVudGl0eUFjdGlvbiBhY3Rpb24gPSBuZXcgRW50aXR5QWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybShFbnRpdHkgZW50aXR5KSB7Ci0gICAgICAgICAgICAgICAgZW50aXR5LndpdGhBbGxRTmFtZXNEbyhuZXcgUU5hbWVBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBlcmZvcm0oUU5hbWUgbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICAgICAgZW50aXR5LndpdGhBbGxTdWJFbnRpdGllc0RvKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB3aXRoQWxsU3ViRW50aXRpZXNEbyhhY3Rpb24pOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlTG9jYWxseSgpIHsKICAgICAgICAgTG9jYWxseVZhbGlkYXRpbmdBY3Rpb24gYWN0aW9uID0gbmV3IExvY2FsbHlWYWxpZGF0aW5nQWN0aW9uKCk7CiAgICAgICAgIHdpdGhBbGxTdWJFbnRpdGllc0RvKGFjdGlvbik7CkBAIC0yMjAsMjEgKzE2NywxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0gICAgICAgIHZhbGlkYXRlKG51bGwpOwotICAgIH0KLQogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlKEVudGl0eVJlZmVyZW5jZVZhbGlkYXRvciB2YWxpZGF0b3IpOwogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEVudGl0eSBnZXRSb290KCk7CiAKLSAgICBwcml2YXRlIE1hcCBfa2luZHM7Ci0gICAgcHJpdmF0ZSBNYXAgX2lkZW50aWZpYWJsZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAga2luZHM7CiAgICAgcHJpdmF0ZSBTdHJpbmcgX3N5c3RlbUlkOwotICAgIHByaXZhdGUgU2V0IF9pbXBvcnRlZERvY3VtZW50czsKLSAgICBwcml2YXRlIExpc3QgX2ltcG9ydGVkRW50aXRpZXM7Ci0gICAgcHJpdmF0ZSBTZXQgX2luY2x1ZGVkRG9jdW1lbnRzOwotICAgIHByaXZhdGUgTGlzdCBfaW5jbHVkZWRFbnRpdGllczsKKyAgICBwcml2YXRlIGZpbmFsIFNldCBpbXBvcnRlZERvY3VtZW50czsKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgaW1wb3J0ZWRFbnRpdGllczsKKyAgICBwcml2YXRlIGZpbmFsIFNldCBpbmNsdWRlZERvY3VtZW50czsKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgaW5jbHVkZWRFbnRpdGllczsKIAogICAgIHByaXZhdGUgY2xhc3MgTG9jYWxseVZhbGlkYXRpbmdBY3Rpb24gaW1wbGVtZW50cyBFbnRpdHlBY3Rpb24gewogICAgICAgICBwdWJsaWMgTG9jYWxseVZhbGlkYXRpbmdBY3Rpb24oKSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0RlZmluaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0RlZmluaW5nLmphdmEKaW5kZXggYjYxYWQ3Yy4uMTFhOWI5ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9EZWZpbmluZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRGVmaW5pbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0R1cGxpY2F0ZUVudGl0eUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9EdXBsaWNhdGVFbnRpdHlFeGNlcHRpb24uamF2YQppbmRleCBiMmRhMmI3Li5lOTUxNmE3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0R1cGxpY2F0ZUVudGl0eUV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRHVwbGljYXRlRW50aXR5RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTIsNyArNTIsNyBAQAogICAgICAgICAgICAgICAgIGVudGl0eS5nZXRFbGVtZW50TmFtZSgpLmdldExvY2FsUGFydCgpLCBuYW1lKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMud3NkbCI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FbGVtZW50YWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRWxlbWVudGFsLmphdmEKaW5kZXggMWJhMDY1My4uOGRmZTE0YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FbGVtZW50YWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0VsZW1lbnRhbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDYgKzI1LDggQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrOwogCitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIC8qKgpAQCAtMzQsNCArMzYsNSBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRhbCB7CiAgICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCk7CisgICAgcHVibGljIExvY2F0b3IgZ2V0TG9jYXRvcigpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FbnRpdHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRW50aXR5LmphdmEKaW5kZXggYzU2ODEyMi4uZGQzNzUyYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FbnRpdHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0VudGl0eS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDkgKzI1LDEzIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yazsKIAoraW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CisKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuRXJyb3JSZWNlaXZlcjsKKwogLyoqCiAgKiBBbiBlbnRpdHksIHR5cGljYWxseSBjb3JyZXNwb25kaW5nIHRvIGFuIFhNTCBlbGVtZW50LgogICoKQEAgLTM1LDcgKzM5LDE4IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBFbGVtZW50YWwgewogCi0gICAgcHVibGljIEVudGl0eSgpIHsKKyAgICBwcml2YXRlIGZpbmFsIExvY2F0b3IgbG9jYXRvcjsKKyAgICBwcm90ZWN0ZWQgRXJyb3JSZWNlaXZlciBlcnJvclJlY2VpdmVyOworICAgIHB1YmxpYyBFbnRpdHkoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JSZWNlaXZlcihFcnJvclJlY2VpdmVyIGVycm9yUmVjZWl2ZXIpIHsKKyAgICAgICAgdGhpcy5lcnJvclJlY2VpdmVyID0gZXJyb3JSZWNlaXZlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdG9yKCkgeworICAgICAgICByZXR1cm4gbG9jYXRvcjsKICAgICB9CiAKICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRW50aXR5QWN0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0VudGl0eUFjdGlvbi5qYXZhCmluZGV4IDBiMWY5NDguLmY4MTk5MWQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRW50aXR5QWN0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FbnRpdHlBY3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0VudGl0eVJlZmVyZW5jZUFjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQppbmRleCA3MTVlYWExLi40M2Q1YmQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0VudGl0eVJlZmVyZW5jZUFjdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRW50aXR5UmVmZXJlbmNlQWN0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRW50aXR5UmVmZXJlbmNlVmFsaWRhdG9yLmphdmEKaW5kZXggYTA5Y2U5NC4uY2YxZmJjZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0VudGl0eVJlZmVyZW5jZVZhbGlkYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRXh0ZW5zaWJpbGl0eUhlbHBlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlbnNpYmlsaXR5SGVscGVyLmphdmEKaW5kZXggNzE0NTJjYi4uOThjNDgxZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlbnNpYmlsaXR5SGVscGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlbnNpYmlsaXR5SGVscGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTAgKzI1LDExIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yazsKIAoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpb247CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBBIGhlbHBlciBjbGFzcyBmb3IgZXh0ZW5zaWJsZSBlbnRpdGllcy4KQEAgLTQwLDQ4ICs0MSwzNiBAQAogICAgIHB1YmxpYyBFeHRlbnNpYmlsaXR5SGVscGVyKCkgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihFeHRlbnNpb24gZSkgeworICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihUV1NETEV4dGVuc2lvbiBlKSB7CiAgICAgICAgIGlmIChfZXh0ZW5zaW9ucyA9PSBudWxsKSB7CiAgICAgICAgICAgICBfZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgfQogICAgICAgICBfZXh0ZW5zaW9ucy5hZGQoZSk7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4dGVuc2lvbnMoKSB7CisgICAgcHVibGljIEl0ZXJhYmxlPFRXU0RMRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewogICAgICAgICBpZiAoX2V4dGVuc2lvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFRXU0RMRXh0ZW5zaW9uPigpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIF9leHRlbnNpb25zLml0ZXJhdG9yKCk7CisgICAgICAgICAgICByZXR1cm4gX2V4dGVuc2lvbnM7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3aXRoQWxsU3ViRW50aXRpZXNEbyhFbnRpdHlBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChfZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfZXh0ZW5zaW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24ucGVyZm9ybSgoRW50aXR5KSBpdGVyLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKy8vICAgICAgICBpZiAoX2V4dGVuc2lvbnMgIT0gbnVsbCkgeworLy8gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfZXh0ZW5zaW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKy8vICAgICAgICAgICAgICAgIGFjdGlvbi5wZXJmb3JtKChFbnRpdHkpIGl0ZXIubmV4dCgpKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoRXh0ZW5zaW9uVmlzaXRvciB2aXNpdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKF9leHRlbnNpb25zICE9IG51bGwpIHsKICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF9leHRlbnNpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICgoRXh0ZW5zaW9uKSBpdGVyLm5leHQoKSkuYWNjZXB0KHZpc2l0b3IpOworICAgICAgICAgICAgICAgICgoRXh0ZW5zaW9uSW1wbCkgaXRlci5uZXh0KCkpLmFjY2VwdCh2aXNpdG9yKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgTGlzdCBfZXh0ZW5zaW9uczsKKyAgICBwcml2YXRlIExpc3Q8VFdTRExFeHRlbnNpb24+IF9leHRlbnNpb25zOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlbnNpYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVuc2libGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwYTZiZWM0Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRXh0ZW5zaWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEFuIGVudGl0eSB0aGF0IGNhbiBiZSBleHRlbmRlZC4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbnNpYmxlIGV4dGVuZHMgRWxlbWVudGFsIHsKLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oRXh0ZW5zaW9uIGUpOwotICAgIHB1YmxpYyBJdGVyYXRvciBleHRlbnNpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVuc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzZDY0My4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrOwotCi0vKioKLSAqIEFuIGVudGl0eSBleHRlbmRpbmcgYW5vdGhlciBlbnRpdHkuCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlbnNpb24gZXh0ZW5kcyBFbnRpdHkgewotCi0gICAgcHVibGljIEV4dGVuc2lvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0ZW5zaWJsZSBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBfcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChFeHRlbnNpYmxlIHBhcmVudCkgewotICAgICAgICBfcGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjY2VwdChFeHRlbnNpb25WaXNpdG9yIHZpc2l0b3IpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2aXNpdG9yLnByZVZpc2l0KHRoaXMpOwotICAgICAgICB2aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEV4dGVuc2libGUgX3BhcmVudDsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRXh0ZW5zaW9uSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlbnNpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NDdjNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRXh0ZW5zaW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrOworCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCisvKioKKyAqIEFuIGVudGl0eSBleHRlbmRpbmcgYW5vdGhlciBlbnRpdHkuCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlbnNpb25JbXBsIGV4dGVuZHMgRW50aXR5IGltcGxlbWVudHMgVFdTRExFeHRlbnNpb24geworCisgICAgcHVibGljIEV4dGVuc2lvbkltcGwoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyKGxvY2F0b3IpOworICAgIH0KKworICAgIHB1YmxpYyBUV1NETEV4dGVuc2libGUgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gX3BhcmVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVFdTRExFeHRlbnNpYmxlIHBhcmVudCkgeworICAgICAgICBfcGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2VwdChFeHRlbnNpb25WaXNpdG9yIHZpc2l0b3IpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB2aXNpdG9yLnByZVZpc2l0KHRoaXMpOworICAgICAgICB2aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFRXU0RMRXh0ZW5zaWJsZSBfcGFyZW50OworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlbnNpb25WaXNpdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVuc2lvblZpc2l0b3IuamF2YQppbmRleCA3Njc2YTc4Li4xNjYzY2M1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVuc2lvblZpc2l0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVuc2lvblZpc2l0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMiArMjUsMTQgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrOwogCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKKwogLyoqCiAgKiBBIHZpc2l0b3Igd29ya2luZyBvbiBleHRlbnNpb24gZW50aXRpZXMuCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uVmlzaXRvciB7Ci0gICAgcHVibGljIHZvaWQgcHJlVmlzaXQoRXh0ZW5zaW9uIGV4dGVuc2lvbikgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICBwdWJsaWMgdm9pZCBwb3N0VmlzaXQoRXh0ZW5zaW9uIGV4dGVuc2lvbikgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgdm9pZCBwcmVWaXNpdChUV1NETEV4dGVuc2lvbiBleHRlbnNpb24pIHRocm93cyBFeGNlcHRpb247CisgICAgcHVibGljIHZvaWQgcG9zdFZpc2l0KFRXU0RMRXh0ZW5zaW9uIGV4dGVuc2lvbikgdGhyb3dzIEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRXh0ZW5zaW9uVmlzaXRvckJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRXh0ZW5zaW9uVmlzaXRvckJhc2UuamF2YQppbmRleCBlNTcwYjcxLi42YTJmMjEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVuc2lvblZpc2l0b3JCYXNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlbnNpb25WaXNpdG9yQmFzZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDYgKzI1LDggQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrOwogCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbjsKKwogLyoqCiAgKiBBIGJhc2UgY2xhc3MgZm9yIGV4dGVuc2lvbiB2aXNpdG9ycy4KICAqCkBAIC0zNCw4ICszNiw4IEBACiAgICAgcHVibGljIEV4dGVuc2lvblZpc2l0b3JCYXNlKCkgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByZVZpc2l0KEV4dGVuc2lvbiBleHRlbnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHByZVZpc2l0KFRXU0RMRXh0ZW5zaW9uIGV4dGVuc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgfQotICAgIHB1YmxpYyB2b2lkIHBvc3RWaXNpdChFeHRlbnNpb24gZXh0ZW5zaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBwb3N0VmlzaXQoVFdTRExFeHRlbnNpb24gZXh0ZW5zaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVybmFsRW50aXR5UmVmZXJlbmNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0V4dGVybmFsRW50aXR5UmVmZXJlbmNlLmphdmEKaW5kZXggZTQzNzBhMy4uYTc3ZTM3MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9FeHRlcm5hbEVudGl0eVJlZmVyZW5jZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvRXh0ZXJuYWxFbnRpdHlSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0dsb2JhbEVudGl0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9HbG9iYWxFbnRpdHkuamF2YQppbmRleCBmZGE3MjkxLi45NTJjM2E3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0dsb2JhbEVudGl0eS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvR2xvYmFsRW50aXR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNiArMjUsOSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcms7CiAKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CisKIC8qKgogICogQW4gZW50aXR5IHRoYXQgY2FuIGJlIGRlZmluZWQgaW4gYSB0YXJnZXQgbmFtZXNwYWNlLgogICoKQEAgLTMyLDggKzM1LDEwIEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHbG9iYWxFbnRpdHkgZXh0ZW5kcyBFbnRpdHkgaW1wbGVtZW50cyBHbG9iYWxseUtub3duIHsKIAotICAgIHB1YmxpYyBHbG9iYWxFbnRpdHkoRGVmaW5pbmcgZGVmaW5pbmcpIHsKKyAgICBwdWJsaWMgR2xvYmFsRW50aXR5KERlZmluaW5nIGRlZmluaW5nLCBMb2NhdG9yIGxvY2F0b3IsIEVycm9yUmVjZWl2ZXIgZXJyb3JSZWNlaXZlcikgeworICAgICAgICBzdXBlcihsb2NhdG9yKTsKICAgICAgICAgX2RlZmluaW5nID0gZGVmaW5pbmc7CisgICAgICAgIHRoaXMuZXJyb3JSZWNlaXZlciA9IGVycm9yUmVjZWl2ZXI7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9HbG9iYWxseUtub3duLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0dsb2JhbGx5S25vd24uamF2YQppbmRleCBiNTlkYzIzLi45MjVkNWZkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0dsb2JhbGx5S25vd24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0dsb2JhbGx5S25vd24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0lkZW50aWZpYWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9JZGVudGlmaWFibGUuamF2YQppbmRleCAwZjcwOTM1Li5iNDZmMzY4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0lkZW50aWZpYWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvSWRlbnRpZmlhYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9LaW5kLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0tpbmQuamF2YQppbmRleCBmMjBkMGRmLi41MDFiMDRjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0tpbmQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL0tpbmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL05vU3VjaEVudGl0eUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9Ob1N1Y2hFbnRpdHlFeGNlcHRpb24uamF2YQppbmRleCA4N2FjMGEwLi42ZWY4MWZhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL05vU3VjaEVudGl0eUV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvTm9TdWNoRW50aXR5RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICBzdXBlcigiZW50aXR5Lm5vdEZvdW5kQnlJRCIsIGlkKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMud3NkbCI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9QYXJzZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDU4NDFlMmMuLjJhZWZlMjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvUGFyc2VFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzksMTEgKzM5LDE1IEBACiAgICAgICAgIHN1cGVyKGtleSwgYXJncyk7CiAgICAgfQogCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKExvY2FsaXphYmxlIG1lc3NhZ2UpeworICAgICAgICBzdXBlcigibG9jYWxpemVkLmVycm9yIiwgbWVzc2FnZSk7CisgICAgfQorCiAgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKICAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMud3NkbCI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9QYXJzZXJDb250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1BhcnNlckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4MWMwOC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1BhcnNlckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcms7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk5hbWVzcGFjZVN1cHBvcnQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKLQotLyoqCi0gKiBUaGUgY29udGV4dCB1c2VkIGJ5IHBhcnNlciBjbGFzc2VzLgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VyQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRklYX1hNTE5TID0gInhtbG5zIjsKLQotICAgIHB1YmxpYyBQYXJzZXJDb250ZXh0KEFic3RyYWN0RG9jdW1lbnQgZG9jLCBBcnJheUxpc3QgbGlzdGVuZXJzKSB7Ci0gICAgICAgIF9kb2N1bWVudCA9IGRvYzsKLSAgICAgICAgX2xpc3RlbmVycyA9IGxpc3RlbmVyczsKLSAgICAgICAgX25zU3VwcG9ydCA9IG5ldyBOYW1lc3BhY2VTdXBwb3J0KCk7Ci0gICAgICAgIF93c2RsTG9jYXRpb24gPSBuZXcgV1NETExvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFic3RyYWN0RG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBfZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9sbG93SW1wb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIF9mb2xsb3dJbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvbGxvd0ltcG9ydHMoYm9vbGVhbiBiKSB7Ci0gICAgICAgIF9mb2xsb3dJbXBvcnRzID0gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXNoKCkgewotICAgICAgICBfbnNTdXBwb3J0LnB1c2hDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wKCkgewotICAgICAgICBfbnNTdXBwb3J0LnBvcENvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBfbnNTdXBwb3J0LmdldFVSSShwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVmaXhlcygpIHsKLSAgICAgICAgcmV0dXJuIF9uc1N1cHBvcnQuZ2V0UHJlZml4ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lc3BhY2VVUkkoIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTmFtZXNwYWNlcyhFbGVtZW50IGUpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gWG1sVXRpbC5nZXRBbGxBdHRyaWJ1dGVzKGUpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEF0dHIgYSA9IChBdHRyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChhLmdldE5hbWUoKS5lcXVhbHMoUFJFRklYX1hNTE5TKSkgewotICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgX25zU3VwcG9ydC5kZWNsYXJlUHJlZml4KCIiLCBhLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gWG1sVXRpbC5nZXRQcmVmaXgoYS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKFBSRUZJWF9YTUxOUykpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gWG1sVXRpbC5nZXRMb2NhbFBhcnQoYS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBfbnNTdXBwb3J0LmRlY2xhcmVQcmVmaXgobnNQcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIHRyYW5zbGF0ZVF1YWxpZmllZE5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBYbWxVdGlsLmdldFByZWZpeChzKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1cmkgPSBnZXREZWZhdWx0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1cmkgPSBnZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcudW5rbm93bk5hbWVzcGFjZVByZWZpeCIsCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSwgWG1sVXRpbC5nZXRMb2NhbFBhcnQocykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVJZ25vcmluZ0V4dGVuc2lvbihRTmFtZSBuYW1lLCBRTmFtZSBwYXJlbnQpIHsKLSAgICAgICAgTGlzdCBfdGFyZ2V0cyA9IG51bGw7Ci0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAoX2xpc3RlbmVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX3RhcmdldHMgPSAoTGlzdCkgX2xpc3RlbmVycy5jbG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF90YXJnZXRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF90YXJnZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFBhcnNlckxpc3RlbmVyIGwgPSAoUGFyc2VyTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGwuaWdub3JpbmdFeHRlbnNpb24obmFtZSwgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVEb25lUGFyc2luZ0VudGl0eShRTmFtZSBlbGVtZW50LCBFbnRpdHkgZW50aXR5KSB7Ci0gICAgICAgIExpc3QgX3RhcmdldHMgPSBudWxsOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKF9saXN0ZW5lcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF90YXJnZXRzID0gKExpc3QpIF9saXN0ZW5lcnMuY2xvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChfdGFyZ2V0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBfdGFyZ2V0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBQYXJzZXJMaXN0ZW5lciBsID0gKFBhcnNlckxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBsLmRvbmVQYXJzaW5nRW50aXR5KGVsZW1lbnQsIGVudGl0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL2J1ZyBmaXg6IDQ4NTY2NzQsIFdTRExMb2NhdGlvbiBjb250ZXh0IG1haW50YWluZW5jZQotICAgIC8vYW5kIHV0aWxpdHkgZnVuY2l0b25zCi0gICAgcHVibGljIHZvaWQgcHVzaFdTRExMb2NhdGlvbigpIHsKLSAgICAgICAgX3dzZGxMb2NhdGlvbi5wdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wV1NETExvY2F0aW9uKCkgewotICAgICAgICBfd3NkbExvY2F0aW9uLnBvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTRExMb2NhdGlvbihTdHJpbmcgbG9jKSB7Ci0gICAgICAgIF93c2RsTG9jYXRpb24uc2V0TG9jYXRpb24obG9jKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIF93c2RsTG9jYXRpb24uZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2ZvbGxvd0ltcG9ydHM7Ci0gICAgcHJpdmF0ZSBBYnN0cmFjdERvY3VtZW50IF9kb2N1bWVudDsKLSAgICBwcml2YXRlIE5hbWVzcGFjZVN1cHBvcnQgX25zU3VwcG9ydDsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBfbGlzdGVuZXJzOwotICAgIC8vYnVnIGZpeDo0ODU2Njc0Ci0gICAgcHJpdmF0ZSBXU0RMTG9jYXRpb24gX3dzZGxMb2NhdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9QYXJzZXJMaXN0ZW5lci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9QYXJzZXJMaXN0ZW5lci5qYXZhCmluZGV4IGI4NTdiZjAuLjg3YTExNDggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvUGFyc2VyTGlzdGVuZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1BhcnNlckxpc3RlbmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzMsNiArMzMsNiBAQAogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUGFyc2VyTGlzdGVuZXIgewotICAgIHB1YmxpYyB2b2lkIGlnbm9yaW5nRXh0ZW5zaW9uKFFOYW1lIG5hbWUsIFFOYW1lIHBhcmVudCk7CisgICAgcHVibGljIHZvaWQgaWdub3JpbmdFeHRlbnNpb24oRW50aXR5IGVudGl0eSwgUU5hbWUgbmFtZSwgUU5hbWUgcGFyZW50KTsKICAgICBwdWJsaWMgdm9pZCBkb25lUGFyc2luZ0VudGl0eShRTmFtZSBlbGVtZW50LCBFbnRpdHkgZW50aXR5KTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvUU5hbWVBY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvUU5hbWVBY3Rpb24uamF2YQppbmRleCAxNTg4Y2RlZi4uOTg4Y2RhYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9RTmFtZUFjdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvUU5hbWVBY3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1RXU0RMUGFyc2VyQ29udGV4dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvVFdTRExQYXJzZXJDb250ZXh0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmJmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1RXU0RMUGFyc2VyQ29udGV4dEltcGwuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcms7CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMUGFyc2VyQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyLkRPTUZvcmVzdDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk5hbWVzcGFjZVN1cHBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhlIGNvbnRleHQgdXNlZCBieSBwYXJzZXIgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworcHVibGljIGNsYXNzIFRXU0RMUGFyc2VyQ29udGV4dEltcGwgaW1wbGVtZW50cyBUV1NETFBhcnNlckNvbnRleHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZJWF9YTUxOUyA9ICJ4bWxucyI7CisgICAgcHJpdmF0ZSBib29sZWFuIF9mb2xsb3dJbXBvcnRzOworICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3REb2N1bWVudCBfZG9jdW1lbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBOYW1lc3BhY2VTdXBwb3J0IF9uc1N1cHBvcnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UGFyc2VyTGlzdGVuZXI+IF9saXN0ZW5lcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBXU0RMTG9jYXRpb24gX3dzZGxMb2NhdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIERPTUZvcmVzdCBmb3Jlc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBFcnJvclJlY2VpdmVyIGVycm9yUmVjZWl2ZXI7CisKKyAgICBwdWJsaWMgVFdTRExQYXJzZXJDb250ZXh0SW1wbChET01Gb3Jlc3QgZm9yZXN0LCBBYnN0cmFjdERvY3VtZW50IGRvYywgQXJyYXlMaXN0PFBhcnNlckxpc3RlbmVyPiBsaXN0ZW5lcnMsIEVycm9yUmVjZWl2ZXIgZXJyUmVjZWl2ZXIpIHsKKyAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2M7CisgICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IGxpc3RlbmVyczsKKyAgICAgICAgdGhpcy5fbnNTdXBwb3J0ID0gbmV3IE5hbWVzcGFjZVN1cHBvcnQoKTsKKyAgICAgICAgdGhpcy5fd3NkbExvY2F0aW9uID0gbmV3IFdTRExMb2NhdGlvbigpOworICAgICAgICB0aGlzLmZvcmVzdCA9IGZvcmVzdDsKKyAgICAgICAgdGhpcy5lcnJvclJlY2VpdmVyID0gZXJyUmVjZWl2ZXI7CisgICAgfQorCisgICAgcHVibGljIEFic3RyYWN0RG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7CisgICAgICAgIHJldHVybiBfZG9jdW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9sbG93SW1wb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIF9mb2xsb3dJbXBvcnRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZvbGxvd0ltcG9ydHMoYm9vbGVhbiBiKSB7CisgICAgICAgIF9mb2xsb3dJbXBvcnRzID0gYjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXNoKCkgeworICAgICAgICBfbnNTdXBwb3J0LnB1c2hDb250ZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9wKCkgeworICAgICAgICBfbnNTdXBwb3J0LnBvcENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHJldHVybiBfbnNTdXBwb3J0LmdldFVSSShwcmVmaXgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFByZWZpeGVzKCkgeworICAgICAgICByZXR1cm4gX25zU3VwcG9ydC5nZXRQcmVmaXhlcygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgiIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJOYW1lc3BhY2VzKEVsZW1lbnQgZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBYbWxVdGlsLmdldEFsbEF0dHJpYnV0ZXMoZSk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQXR0ciBhID0gKEF0dHIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGEuZ2V0TmFtZSgpLmVxdWFscyhQUkVGSVhfWE1MTlMpKSB7CisgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBuYW1lc3BhY2UgZGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICBfbnNTdXBwb3J0LmRlY2xhcmVQcmVmaXgoIiIsIGEuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBYbWxVdGlsLmdldFByZWZpeChhLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoUFJFRklYX1hNTE5TKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnNQcmVmaXggPSBYbWxVdGlsLmdldExvY2FsUGFydChhLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBhLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIF9uc1N1cHBvcnQuZGVjbGFyZVByZWZpeChuc1ByZWZpeCwgdXJpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdGlvbihFbGVtZW50IGUpIHsKKyAgICAgICAgcmV0dXJuIGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgdHJhbnNsYXRlUXVhbGlmaWVkTmFtZShMb2NhdG9yIGxvY2F0b3IsIFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgcHJlZml4ID0gWG1sVXRpbC5nZXRQcmVmaXgocyk7CisgICAgICAgIFN0cmluZyB1cmkgPSBudWxsOworCisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgeworICAgICAgICAgICAgdXJpID0gZ2V0RGVmYXVsdE5hbWVzcGFjZVVSSSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXJpID0gZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7CisgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKGxvY2F0b3IsIFdzZGxNZXNzYWdlcy5QQVJTSU5HX1VOS05PV05fTkFNRVNQQUNFX1BSRUZJWChwcmVmaXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUU5hbWUodXJpLCBYbWxVdGlsLmdldExvY2FsUGFydChzKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmlyZUlnbm9yaW5nRXh0ZW5zaW9uKEVsZW1lbnQgZSwgRW50aXR5IGVudGl0eSkgeworICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKGUuZ2V0TmFtZXNwYWNlVVJJKCksIGUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICBRTmFtZSBwYXJlbnQgPSBlbnRpdHkuZ2V0RWxlbWVudE5hbWUoKTsKKyAgICAgICAgTGlzdCBfdGFyZ2V0cyA9IG51bGw7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoX2xpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX3RhcmdldHMgPSAoTGlzdCkgX2xpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKF90YXJnZXRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF90YXJnZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFBhcnNlckxpc3RlbmVyIGwgPSAoUGFyc2VyTGlzdGVuZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGwuaWdub3JpbmdFeHRlbnNpb24oZW50aXR5LCBuYW1lLCBwYXJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmlyZURvbmVQYXJzaW5nRW50aXR5KFFOYW1lIGVsZW1lbnQsIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgTGlzdCBfdGFyZ2V0cyA9IG51bGw7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoX2xpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX3RhcmdldHMgPSAoTGlzdCkgX2xpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKF90YXJnZXRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF90YXJnZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFBhcnNlckxpc3RlbmVyIGwgPSAoUGFyc2VyTGlzdGVuZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGwuZG9uZVBhcnNpbmdFbnRpdHkoZWxlbWVudCwgZW50aXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vYnVnIGZpeDogNDg1NjY3NCwgV1NETExvY2F0aW9uIGNvbnRleHQgbWFpbnRhaW5lbmNlCisgICAgLy9hbmQgdXRpbGl0eSBmdW5jaXRvbnMKKyAgICBwdWJsaWMgdm9pZCBwdXNoV1NETExvY2F0aW9uKCkgeworICAgICAgICBfd3NkbExvY2F0aW9uLnB1c2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3BXU0RMTG9jYXRpb24oKSB7CisgICAgICAgIF93c2RsTG9jYXRpb24ucG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V1NETExvY2F0aW9uKFN0cmluZyBsb2MpIHsKKyAgICAgICAgX3dzZGxMb2NhdGlvbi5zZXRMb2NhdGlvbihsb2MpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gX3dzZGxMb2NhdGlvbi5nZXRMb2NhdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggOGIyZDUxZi4uZDRjZDhmYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNyArMjYsNiBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5leGNlcHRpb24uSkFYV1NFeGNlcHRpb25CYXNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOwogCiAvKioKICAqIEFuIGV4Y2VwdGlvbiBzaWduYWxsaW5nIHRoYXQgdmFsaWRhdGlvbiBvZiBhbiBlbnRpdHkgZmFpbGVkLgpAQCAtNDMsNyArNDIsNyBAQAogICAgICAgICBzdXBlcih0aHJvd2FibGUpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlc291cmNlQnVuZGxlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy53c2RsIjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1dTRExMb2NhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9XU0RMTG9jYXRpb24uamF2YQppbmRleCAzZTRjMDNlLi44MDBhMmE0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1dTRExMb2NhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9mcmFtZXdvcmsvV1NETExvY2F0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsOCArMjcsNyBAQAogLyoqCiAgKgogICogTWFpbnRhaW5zIHdzZGw6bG9jYXRpb24gY29udGV4dC4gVGhpcyBpcyB1c2VkIHdpdGgKLSAqIFBhcnNlckNvbnRleHQsIHdoZXJlIG9uZSBlYWNoIFdTREwgYmVpbmcgaW1wb3J0ZWQgaXRzIGxvY2F0aW9uIGlzIHB1c2hlZCwgdGhpcyB3aWxsIGJlIHVzZWQKLSAqIGxhdHRlciB0byByZXNvbHZlIHJlbGF0aXZlIGltcG9ydHMgb2Ygc2NoZW1hIGluIFNjaGVtYVBhcnNlci4KKyAqIFRXU0RMUGFyc2VyQ29udGV4dEltcGwsIHdoZXJlIG9uZSBlYWNoIFdTREwgYmVpbmcgaW1wb3J0ZWQgaXRzIGxvY2F0aW9uIGlzIHB1c2hlZC4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL2ZyYW1ld29yay9Xcml0ZXJDb250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1dyaXRlckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1MjE3ZC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvZnJhbWV3b3JrL1dyaXRlckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcms7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5OYW1lc3BhY2VTdXBwb3J0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuUHJldHR5UHJpbnRpbmdYbWxXcml0ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRleHQgdXNlZCBieSB3cml0ZXIgY2xhc3Nlcy4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFdyaXRlckNvbnRleHQgewotCi0gICAgcHVibGljIFdyaXRlckNvbnRleHQoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBfd3JpdGVyID0gbmV3IFByZXR0eVByaW50aW5nWG1sV3JpdGVyKG9zKTsKLSAgICAgICAgX25zU3VwcG9ydCA9IG5ldyBOYW1lc3BhY2VTdXBwb3J0KCk7Ci0gICAgICAgIF9uZXdQcmVmaXhDb3VudCA9IDI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBfd3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBfd3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHVzaCgpIHsKLSAgICAgICAgaWYgKF9wZW5kaW5nTmFtZXNwYWNlRGVjbGFyYXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInByZWZpeCBkZWNsYXJhdGlvbnMgYXJlIHBlbmRpbmciKTsKLSAgICAgICAgfQotICAgICAgICBfbnNTdXBwb3J0LnB1c2hDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wKCkgewotICAgICAgICBfbnNTdXBwb3J0LnBvcENvbnRleHQoKTsKLSAgICAgICAgX3BlbmRpbmdOYW1lc3BhY2VEZWNsYXJhdGlvbnMgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIF9uc1N1cHBvcnQuZ2V0VVJJKHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFByZWZpeGVzKCkgewotICAgICAgICByZXR1cm4gX25zU3VwcG9ydC5nZXRQcmVmaXhlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVjbGFyZVByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIF9uc1N1cHBvcnQuZGVjbGFyZVByZWZpeChwcmVmaXgsIHVyaSk7Ci0gICAgICAgIGlmIChfcGVuZGluZ05hbWVzcGFjZURlY2xhcmF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfcGVuZGluZ05hbWVzcGFjZURlY2xhcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotICAgICAgICBfcGVuZGluZ05hbWVzcGFjZURlY2xhcmF0aW9ucy5hZGQobmV3IFN0cmluZ1tdIHsgcHJlZml4LCB1cmkgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhGb3IoU3RyaW5nIHVyaSkgewotICAgICAgICBpZiAoKGdldERlZmF1bHROYW1lc3BhY2VVUkkoKSAhPSBudWxsICYmIGdldERlZmF1bHROYW1lc3BhY2VVUkkoKS5lcXVhbHModXJpKSkKLSAgICAgICAgICAgIHx8IHVyaS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gX25zU3VwcG9ydC5nZXRQcmVmaXgodXJpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZmluZE5ld1ByZWZpeChTdHJpbmcgYmFzZSkgewotICAgICAgICByZXR1cm4gYmFzZSArIEludGVnZXIudG9TdHJpbmcoX25ld1ByZWZpeENvdW50KyspOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gX3RhcmdldE5hbWVzcGFjZVVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHVyaSkgewotICAgICAgICBfdGFyZ2V0TmFtZXNwYWNlVVJJID0gdXJpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRUYWcoUU5hbWUgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgX3dyaXRlci5zdGFydChnZXRRTmFtZVN0cmluZyhuYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmRUYWcoUU5hbWUgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgX3dyaXRlci5lbmQoZ2V0UU5hbWVTdHJpbmcobmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBfd3JpdGVyLmF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgUU5hbWUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBfd3JpdGVyLmF0dHJpYnV0ZShuYW1lLCBnZXRRTmFtZVN0cmluZyh2YWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlQXR0cmlidXRlKG5hbWUsIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIEJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZUF0dHJpYnV0ZShuYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIHZhbHVlVG9YbWxNYXApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhY3R1YWxWYWx1ZSA9IChTdHJpbmcpIHZhbHVlVG9YbWxNYXAuZ2V0KHZhbHVlKTsKLSAgICAgICAgd3JpdGVBdHRyaWJ1dGUobmFtZSwgYWN0dWFsVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTmFtZXNwYWNlRGVjbGFyYXRpb24oU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgX3dyaXRlci5hdHRyaWJ1dGUoZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25BdHRyaWJ1dGVOYW1lKHByZWZpeCksIHVyaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBbGxQZW5kaW5nTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKF9wZW5kaW5nTmFtZXNwYWNlRGVjbGFyYXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IF9wZW5kaW5nTmFtZXNwYWNlRGVjbGFyYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7Ci0gICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFpciA9IChTdHJpbmdbXSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVOYW1lc3BhY2VEZWNsYXJhdGlvbihwYWlyWzBdLCBwYWlyWzFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBfcGVuZGluZ05hbWVzcGFjZURlY2xhcmF0aW9ucyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25BdHRyaWJ1dGVOYW1lKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gInhtbG5zIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAieG1sbnM6IiArIHByZWZpeDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVGFnKFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgX3dyaXRlci5sZWFmKGdldFFOYW1lU3RyaW5nKG5hbWUpLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRRTmFtZVN0cmluZyhRTmFtZSBuYW1lKSB7Ci0gICAgICAgIFN0cmluZyBuc1VSSSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXhGb3IobnNVUkkpOwotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmVmaXguZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UU5hbWVTdHJpbmdXaXRoVGFyZ2V0TmFtZXNwYWNlQ2hlY2soUU5hbWUgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoX3RhcmdldE5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldFFOYW1lU3RyaW5nKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDaGFycyhTdHJpbmcgY2hhcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIF93cml0ZXIuY2hhcnMoY2hhcnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJldHR5UHJpbnRpbmdYbWxXcml0ZXIgX3dyaXRlcjsKLSAgICBwcml2YXRlIE5hbWVzcGFjZVN1cHBvcnQgX25zU3VwcG9ydDsKLSAgICBwcml2YXRlIFN0cmluZyBfdGFyZ2V0TmFtZXNwYWNlVVJJOwotICAgIHByaXZhdGUgaW50IF9uZXdQcmVmaXhDb3VudDsKLSAgICBwcml2YXRlIExpc3QgX3BlbmRpbmdOYW1lc3BhY2VEZWNsYXJhdGlvbnM7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0Fic3RyYWN0RXh0ZW5zaW9uSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9BYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzk1NmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9BYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpb25IYW5kbGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5taW1lLk1JTUVDb25zdGFudHM7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIGNsYXNzIG9mIHtAbGluayBUV1NETEV4dGVuc2lvbkhhbmRsZXJ9CisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlciBleHRlbmRzIFRXU0RMRXh0ZW5zaW9uSGFuZGxlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXI+IGV4dGVuc2lvbkhhbmRsZXJzOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQWJzdHJhY3RFeHRlbnNpb25IYW5kbGVyPiB1bm1vZEV4dGVuSGFuZGxlcnM7CisKKyAgICBwdWJsaWMgQWJzdHJhY3RFeHRlbnNpb25IYW5kbGVyKE1hcDxTdHJpbmcsIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlcj4gZXh0ZW5zaW9uSGFuZGxlck1hcCkgeworICAgICAgICB0aGlzLmV4dGVuc2lvbkhhbmRsZXJzID0gZXh0ZW5zaW9uSGFuZGxlck1hcDsKKyAgICAgICAgdGhpcy51bm1vZEV4dGVuSGFuZGxlcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoZXh0ZW5zaW9uSGFuZGxlcnMpOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXI+IGdldEV4dGVuc2lvbkhhbmRsZXJzKCl7CisgICAgICAgIHJldHVybiB1bm1vZEV4dGVuSGFuZGxlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgdGhhdCBnZXRzIGNhbGxlZCBieSB0aGUgV1NETCBwYXJzZXIgb3IgYW55IG90aGVyIGV4dGVuc2lvbiBoYW5kbGVyIG9uIGZpbmRpbmcgYW4gZXh0ZW5zaWJpbGl0eSBlbGVtZW50CisgICAgICogdGhhdCBpdCBjYW4ndCB1bmRlcnN0YW5kLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCAgVGhlIFBhcmVudCBlbGVtZW50IHdpdGhpbiB3aGljaCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIGRlZmluZWQKKyAgICAgKiBAcGFyYW0gZSAgICAgICBUaGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW5ldAorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgd2FzIHNvbWUgZXJyb3IgZHVyaW5nIHRoZSBleHRlbnNpb24gaGFuZGxpbmcgb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4gSWYgcmV0dXJuZWQgZmFsc2UKKyAgICAgKiAgICAgICAgIHRoZW4gdGhlIFdTREwgcGFyc2VyIGNhbiBhYm9ydCBpZiB0aGUgd3NkbCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaGFkIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkb0hhbmRsZUV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgIGlmIChwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKE1JTUVDb25zdGFudHMuUU5BTUVfUEFSVCkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVNSU1FUGFydEV4dGVuc2lvbihjb250ZXh0LCBwYXJlbnQsIGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRvSGFuZGxlRXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgPGNvZGU+d3NkbDptaW1lPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgUGFyc2VyIGNvbnRleHQgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiBieSB0aGUgd3NkbCBwYXJzZXIKKyAgICAgKiBAcGFyYW0gcGFyZW50ICBUaGUgUGFyZW50IGVsZW1lbnQgd2l0aGluIHdoaWNoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgZGVmaW5lZAorICAgICAqIEBwYXJhbSBlICAgICAgIFRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbmV0CisgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGVyZSB3YXMgc29tZSBlcnJvciBkdXJpbmcgdGhlIGV4dGVuc2lvbiBoYW5kbGluZyBvdGhlcndpc2UgcmV0dXJucyB0cnVlLiBJZiByZXR1cm5lZCBmYWxzZQorICAgICAqICAgICAgICAgdGhlbiB0aGUgV1NETCBwYXJzZXIgY2FuIGFib3J0IGlmIHRoZSB3c2RsIGV4dGVuc2liaWxpdHkgZWxlbWVudCBoYWQgPGNvZGU+cmVxdWlyZWQ8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZU1JTUVQYXJ0RXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9BYnN0cmFjdFJlZmVyZW5jZUZpbmRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvQWJzdHJhY3RSZWZlcmVuY2VGaW5kZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkYTJhYQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvQWJzdHJhY3RSZWZlcmVuY2VGaW5kZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLlNBWFBhcnNlRXhjZXB0aW9uMjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy5Xc2RsTWVzc2FnZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CisKKy8qKgorICogWE1MRmlsdGVyIHRoYXQgZmluZHMgcmVmZXJlbmNlcyB0byBvdGhlciBzY2hlbWEgZmlsZXMgZnJvbQorICogU0FYIGV2ZW50cy4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGEgYmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgdHlwaWNhbCBjYXNlCisgKiB3aGVyZSB3ZSBqdXN0IG5lZWQgdG8gbG9vayBmb3IgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB3aGljaAorICogY29udGFpbnMgYW4gVVJMIHRvIGFub3RoZXIgc2NoZW1hIGZpbGUuCisgKgorICogQGF1dGhvcgorICogIEtvaHN1a2UgS2F3YWd1Y2hpIChrb2hzdWtlLmthd2FndWNoaUBzdW4uY29tKQorICogIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWZlcmVuY2VGaW5kZXJJbXBsIGV4dGVuZHMgWE1MRmlsdGVySW1wbCB7CisgICAgcHJvdGVjdGVkIGZpbmFsIERPTUZvcmVzdCBwYXJlbnQ7CisKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZWZlcmVuY2VGaW5kZXJJbXBsKCBET01Gb3Jlc3QgX3BhcmVudCApIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBfcGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIElGIHRoZSBnaXZlbiBlbGVtZW50IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLAorICAgICAqIHJldHVybiBpdHMgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIG5zVVJJCisgICAgICogICAgICBOYW1lc3BhY2UgVVJJIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lCisgICAgICogICAgICBMb2NhbCBuYW1lIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBJdCdzIE9LIHRvIHJldHVybiBhIHJlbGF0aXZlIFVSTC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGZpbmRFeHRlcm5hbFJlc291cmNlKCBTdHJpbmcgbnNVUkksIFN0cmluZyBsb2NhbE5hbWUsIEF0dHJpYnV0ZXMgYXR0cyk7CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRzKTsKKworICAgICAgICBTdHJpbmcgcmVsYXRpdmVSZWYgPSBmaW5kRXh0ZXJuYWxSZXNvdXJjZShuYW1lc3BhY2VVUkksbG9jYWxOYW1lLGF0dHMpOworICAgICAgICBpZihyZWxhdGl2ZVJlZj09bnVsbCkgICByZXR1cm47IC8vIG5vbiBmb3VuZAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBhYnNvbHV0aXplIFVSTC4KKyAgICAgICAgICAgIFN0cmluZyByZWYgPSBuZXcgVVJJKGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSkucmVzb2x2ZShuZXcgVVJJKHJlbGF0aXZlUmVmKSkudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgLy8gdGhlbiBwYXJzZSB0aGlzIHNjaGVtYSBhcyB3ZWxsLAorICAgICAgICAgICAgLy8gYnV0IGRvbid0IG1hcmsgdGhpcyBkb2N1bWVudCBhcyBhIHJvb3QuCisgICAgICAgICAgICBwYXJlbnQucGFyc2UocmVmLGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCggVVJJU3ludGF4RXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBzcGUgPSBuZXcgU0FYUGFyc2VFeGNlcHRpb24yKAorICAgICAgICAgICAgICAgICAgICBXc2RsTWVzc2FnZXMuQUJTVFJBQ1RfUkVGRVJFTkNFX0ZJTkRFUl9JTVBMX1VOQUJMRV9UT19QQVJTRShyZWxhdGl2ZVJlZixlLmdldE1lc3NhZ2UoKSksCisgICAgICAgICAgICAgICAgbG9jYXRvciwgZSApOworCisgICAgICAgICAgICBmYXRhbEVycm9yKHNwZSk7CisgICAgICAgICAgICB0aHJvdyBzcGU7CisgICAgICAgIH0gY2F0Y2goIElPRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBzcGUgPSBuZXcgU0FYUGFyc2VFeGNlcHRpb24yKAorICAgICAgICAgICAgICAgIFdzZGxNZXNzYWdlcy5BQlNUUkFDVF9SRUZFUkVOQ0VfRklOREVSX0lNUExfVU5BQkxFX1RPX1BBUlNFKHJlbGF0aXZlUmVmLGUuZ2V0TWVzc2FnZSgpKSwKKyAgICAgICAgICAgICAgICBsb2NhdG9yLCBlICk7CisKKyAgICAgICAgICAgIGZhdGFsRXJyb3Ioc3BlKTsKKyAgICAgICAgICAgIHRocm93IHNwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTG9jYXRvciBsb2NhdG9yOworCisgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzdXBlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7CisgICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9Db25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvQ29uc3RhbnRzLmphdmEKaW5kZXggYTU5ZDBhYi4uOGNjOGM1OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9Db25zdGFudHMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0NvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRE9NQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9ET01CdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxNGVjNgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRE9NQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuamF4d3MuSkFYV1NCaW5kaW5nc0NvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuaW50ZXJuYWxpemVyLkxvY2F0b3JUYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLm1hcnNoYWxsZXIuU0FYMkRPTUV4OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEJ1aWxkcyBET00gd2hpbGUga2VlcGluZyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIGFsc28gbG9va3MgZm9yIG91dGVyIG1vc3QgJmx0O2pheHdzOmJpbmRpbmdzPgorICogY3VzdG9taXphdGlvbnMuCisgKgorICogQGF1dGhvcgorICogICAgIEtvaHN1a2UgS2F3YWd1Y2hpIChrb2hzdWtlLmthd2FndWNoaUBzdW4uY29tKQorICogICAgIFZpdmVrIFBhbmRleQorICovCitjbGFzcyBET01CdWlsZGVyIGV4dGVuZHMgU0FYMkRPTUV4IHsKKyAgICAvKioKKyAgICAgKiBHcm93cyBhIERPTSB0cmVlIHVuZGVyIHRoZSBnaXZlbiBkb2N1bWVudCwgYW5kCisgICAgICogc3RvcmVzIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHRoZSBnaXZlbiB0YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRlck1vc3RCaW5kaW5ncworICAgICAqICAgICAgVGhpcyBzZXQgd2lsbCByZWNlaXZlIG5ld2x5IGZvdW5kIG91dGVybW9zdAorICAgICAqICAgICAgamF4YjpiaW5kaW5ncyBjdXN0b21pemF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRE9NQnVpbGRlciggRG9jdW1lbnQgZG9tLCBMb2NhdG9yVGFibGUgbHRhYmxlLCBTZXQgb3V0ZXJNb3N0QmluZGluZ3MgKSB7CisgICAgICAgIHN1cGVyKCBkb20gKTsKKyAgICAgICAgdGhpcy5sb2NhdG9yVGFibGUgPSBsdGFibGU7CisgICAgICAgIHRoaXMub3V0ZXJNb3N0QmluZGluZ3MgPSBvdXRlck1vc3RCaW5kaW5nczsKKyAgICB9CisKKyAgICAvKiogTG9jYXRpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBzdG9yZWQgaW50byB0aGlzIG9iamVjdC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIExvY2F0b3JUYWJsZSBsb2NhdG9yVGFibGU7CisKKyAgICBwcml2YXRlIGZpbmFsIFNldCBvdXRlck1vc3RCaW5kaW5nczsKKworICAgIHByaXZhdGUgTG9jYXRvciBsb2NhdG9yOworCisgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworICAgICAgICBzdXBlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpIHsKKyAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7CisKKyAgICAgICAgRWxlbWVudCBlID0gZ2V0Q3VycmVudEVsZW1lbnQoKTsKKyAgICAgICAgbG9jYXRvclRhYmxlLnN0b3JlU3RhcnRMb2NhdGlvbiggZSwgbG9jYXRvciApOworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbiBvdXRlci1tb3N0IDxqYXhiOmJpbmRpbmdzPgorICAgICAgICBpZiggSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoZS5nZXROYW1lc3BhY2VVUkkoKSkKKyAgICAgICAgJiYgICJiaW5kaW5ncyIuZXF1YWxzKGUuZ2V0TG9jYWxOYW1lKCkpICkgeworCisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSByb290IG5vZGUgKG1lYW5pbmcgdGhhdCB0aGlzIGZpbGUgaXMgYW4KKyAgICAgICAgICAgIC8vIGV4dGVybmFsIGJpbmRpbmcgZmlsZSkgb3IgaWYgdGhlIHBhcmVudCBpcyBYTUwgU2NoZW1hIGVsZW1lbnQKKyAgICAgICAgICAgIC8vIChtZWFuaW5nIHRoYXQgdGhpcyBpcyBhbiAiaW5saW5lZCIgZXh0ZXJuYWwgYmluZGluZykKKyAgICAgICAgICAgIE5vZGUgcCA9IGUuZ2V0UGFyZW50Tm9kZSgpOworICAgICAgICAgICAgaWYoIHAgaW5zdGFuY2VvZiBEb2N1bWVudCkgeworICAgICAgICAgICAgICAgIG91dGVyTW9zdEJpbmRpbmdzLmFkZChlKTsgICAvLyByZW1lbWJlciB0aGlzIHZhbHVlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgeworICAgICAgICBsb2NhdG9yVGFibGUuc3RvcmVFbmRMb2NhdGlvbiggZ2V0Q3VycmVudEVsZW1lbnQoKSwgbG9jYXRvciApOworICAgICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9ET01Gb3Jlc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRE9NRm9yZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1OWRlNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRE9NRm9yZXN0LmphdmEKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRPcHRpb25zOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzY29tcGlsZU1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5pbnRlcm5hbGl6ZXIuTG9jYXRvclRhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQubWFyc2hhbGxlci5EYXRhV3JpdGVyOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBjbGFzcyBET01Gb3Jlc3QgeworICAgIC8qKgorICAgICAqIFRvIGNvcnJlY3RseSBmZWVkIGRvY3VtZW50cyB0byBhIHNjaGVtYSBwYXJzZXIsIHdlIG5lZWQgdG8gcmVtZW1iZXIKKyAgICAgKiB3aGljaCBkb2N1bWVudHMgKG9mIHRoZSBmb3Jlc3QpIHdlcmUgZ2l2ZW4gYXMgdGhlIHJvb3QKKyAgICAgKiBkb2N1bWVudHMsIGFuZCB3aGljaCBvZiB0aGVtIGFyZSByZWFkIGFzIGluY2x1ZGVkL2ltcG9ydGVkCisgICAgICogZG9jdW1lbnRzLgorICAgICAqIDxwLz4KKyAgICAgKiA8cC8+CisgICAgICogU2V0IG9mIHN5c3RlbSBpZHMgYXMgc3RyaW5ncy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gcm9vdERvY3VtZW50cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIHdzZGw6aW1wb3J0KHMpCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IGV4dGVybmFsUmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIGFjdHVhbCBkYXRhIHN0b3JhZ2UgbWFwJmx0O1N5c3RlbUlkLERvY3VtZW50Pi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPFN0cmluZywgRG9jdW1lbnQ+IGNvcmUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERvY3VtZW50PigpOworICAgIHByb3RlY3RlZCBmaW5hbCBXc2ltcG9ydE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgRXJyb3JSZWNlaXZlciBlcnJvclJlY2VpdmVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyOworICAgIHByaXZhdGUgZmluYWwgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5OworCisgICAgLyoqCisgICAgICogaW5saW5lZCBzY2hlbWEgZWxlbWVudHMgaW5zaWRlIHdzZGw6dHlwZSBzZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8RWxlbWVudD4gaW5saW5lZFNjaGVtYUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOworCisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGFsbCB0aGUgdHJlZXMgaW4gdGhpcyBmb3Jlc3QuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIExvY2F0b3JUYWJsZSBsb2NhdG9yVGFibGUgPSBuZXcgTG9jYXRvclRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYWxsIHRoZSBvdXRlci1tb3N0ICZsdDtqYXhiOmJpbmRpbmdzPiBjdXN0b21pemF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU2V0PEVsZW1lbnQ+IG91dGVyTW9zdEJpbmRpbmdzID0gbmV3IEhhc2hTZXQ8RWxlbWVudD4oKTsKKworICAgIC8qKgorICAgICAqIFNjaGVtYSBsYW5ndWFnZSBkZXBlbmRlbnQgcGFydCBvZiB0aGUgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgSW50ZXJuYWxpemF0aW9uTG9naWMgbG9naWM7CisKKyAgICBwdWJsaWMgRE9NRm9yZXN0KEludGVybmFsaXphdGlvbkxvZ2ljIGxvZ2ljLCBXc2ltcG9ydE9wdGlvbnMgb3B0aW9ucywgRXJyb3JSZWNlaXZlciBlcnJSZWNlaXZlcikgeworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLmVycm9yUmVjZWl2ZXIgPSBlcnJSZWNlaXZlcjsKKyAgICAgICAgdGhpcy5sb2dpYyA9IGxvZ2ljOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmRvY3VtZW50QnVpbGRlciA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKworICAgICAgICAgICAgdGhpcy5wYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgdGhpcy5wYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEVsZW1lbnQ+IGdldElubGluZWRTY2hlbWFFbGVtZW50KCkgeworICAgICAgICByZXR1cm4gaW5saW5lZFNjaGVtYUVsZW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyBEb2N1bWVudCBwYXJzZShJbnB1dFNvdXJjZSBzb3VyY2UsIGJvb2xlYW4gcm9vdCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzb3VyY2UuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIHJldHVybiBwYXJzZShzb3VyY2UuZ2V0U3lzdGVtSWQoKSwgc291cmNlLCByb290KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYW4gWE1MIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiAoCisgICAgICogYW5kIFhNTHMgcmVmZXJlbmNlZCBieSBpdCkgaW50byBET00gdHJlZXMKKyAgICAgKiBhbmQgc3RvcmVzIHRoZW0gdG8gdGhpcyBmb3Jlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQgRE9NIGRvY3VtZW50IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRG9jdW1lbnQgcGFyc2UoU3RyaW5nIHN5c3RlbUlkLCBib29sZWFuIHJvb3QpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBzeXN0ZW1JZCA9IG5vcm1hbGl6ZVN5c3RlbUlkKHN5c3RlbUlkKTsKKworICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG51bGw7CisKKyAgICAgICAgLy8gYWxsb3cgZW50aXR5IHJlc29sdmVyIHRvIGZpbmQgdGhlIGFjdHVhbCBieXRlIHN0cmVhbS4KKyAgICAgICAgaWYgKG9wdGlvbnMuZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGlzID0gb3B0aW9ucy5lbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5KG51bGwsIHN5c3RlbUlkKTsKKyAgICAgICAgaWYgKGlzID09IG51bGwpCisgICAgICAgICAgICBpcyA9IG5ldyBJbnB1dFNvdXJjZShzeXN0ZW1JZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN5c3RlbUlkPWlzLmdldFN5c3RlbUlkKCk7CisKKyAgICAgICAgaWYgKGNvcmUuY29udGFpbnNLZXkoc3lzdGVtSWQpKSB7CisgICAgICAgICAgICAvLyB0aGlzIGRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLiBKdXN0IGlnbm9yZS4KKyAgICAgICAgICAgIHJldHVybiBjb3JlLmdldChzeXN0ZW1JZCk7CisgICAgICAgIH0KKworICAgICAgICBpZighcm9vdCkKKyAgICAgICAgICAgIGFkZEV4dGVybmFsUmVmZXJlbmNlcyhzeXN0ZW1JZCk7CisKKyAgICAgICAgLy8gYnV0IHdlIHN0aWxsIHVzZSB0aGUgb3JpZ2luYWwgc3lzdGVtIElkIGFzIHRoZSBrZXkuCisgICAgICAgIHJldHVybiBwYXJzZShzeXN0ZW1JZCwgaXMsIHJvb3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgYW5kIGFkZCBpdCB0byB0aGUgRE9NIGZvcmVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSB3YXMgYSBwYXJzZSBlcnJvci4gb3RoZXJ3aXNlIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBEb2N1bWVudCBwYXJzZShTdHJpbmcgc3lzdGVtSWQsIElucHV0U291cmNlIGlucHV0U291cmNlLCBib29sZWFuIHJvb3QpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBEb2N1bWVudCBkb20gPSBkb2N1bWVudEJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKKworICAgICAgICBzeXN0ZW1JZCA9IG5vcm1hbGl6ZVN5c3RlbUlkKHN5c3RlbUlkKTsKKworICAgICAgICBib29sZWFuIHJldHJ5TWV4ID0gZmFsc2U7CisgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICAvLyBwdXQgaW50byB0aGUgbWFwIGJlZm9yZSBncm93aW5nIGEgdHJlZSwgdG8KKyAgICAgICAgLy8gcHJldmVudCByZWN1cnNpdmUgcmVmZXJlbmNlIGZyb20gY2F1c2luZyBpbmZpbml0ZSBsb29wLgorICAgICAgICBjb3JlLnB1dChzeXN0ZW1JZCwgZG9tKTsKKworICAgICAgICBkb20uc2V0RG9jdW1lbnRVUkkoc3lzdGVtSWQpOworICAgICAgICBpZiAocm9vdCkKKyAgICAgICAgICAgIHJvb3REb2N1bWVudHMuYWRkKHN5c3RlbUlkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCk7CisgICAgICAgICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoZ2V0UGFyc2VySGFuZGxlcihkb20pKTsKKyAgICAgICAgICAgIGlmIChlcnJvclJlY2VpdmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcihlcnJvclJlY2VpdmVyKTsKKyAgICAgICAgICAgIGlmIChvcHRpb25zLmVudGl0eVJlc29sdmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKG9wdGlvbnMuZW50aXR5UmVzb2x2ZXIpOworICAgICAgICAgICAgcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgICAgICBFbGVtZW50IGRvYyA9IGRvbS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9kZUxpc3Qgc2NoZW1hcyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFNjaGVtYUNvbnN0YW50cy5OU19YU0QsICJzY2hlbWEiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW5saW5lZFNjaGVtYUVsZW1lbnRzLmFkZCgoRWxlbWVudCkgc2NoZW1hcy5pdGVtKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZXJyb3JSZWNlaXZlci5lcnJvcihXc2NvbXBpbGVNZXNzYWdlcy5XU0lNUE9SVF9OT19XU0RMKHN5c3RlbUlkKSwgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGNvcmUucmVtb3ZlKHN5c3RlbUlkKTsKKyAgICAgICAgICAgIHJvb3REb2N1bWVudHMucmVtb3ZlKHN5c3RlbUlkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZG9tOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVybmFsUmVmZXJlbmNlcyhTdHJpbmcgcmVmKSB7CisgICAgICAgIGlmICghZXh0ZXJuYWxSZWZlcmVuY2VzLmNvbnRhaW5zKHJlZikpCisgICAgICAgICAgICBleHRlcm5hbFJlZmVyZW5jZXMuYWRkKHJlZik7CisgICAgfQorCisKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RXh0ZXJuYWxSZWZlcmVuY2VzKCkgeworICAgICAgICByZXR1cm4gZXh0ZXJuYWxSZWZlcmVuY2VzOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlciBleHRlbmRzIENvbnRlbnRIYW5kbGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIERPTSB0aGF0IHdhcyBidWlsdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEhhbmRsZXJJbXBsIGV4dGVuZHMgWE1MRmlsdGVySW1wbCBpbXBsZW1lbnRzIEhhbmRsZXIgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29udGVudEhhbmRsZXJ9IHRvIGZlZWQgU0FYIGV2ZW50cyBpbnRvLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgY2xpZW50IG9mIHRoaXMgY2xhc3MgY2FuIGZlZWQgU0FYIGV2ZW50cyBpbnRvIHRoZSBoYW5kbGVyCisgICAgICogdG8gcGFyc2UgYSBkb2N1bWVudCBpbnRvIHRoaXMgRE9NIGZvcmVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGFuZGxlciBnZXRQYXJzZXJIYW5kbGVyKFN0cmluZyBzeXN0ZW1JZCwgYm9vbGVhbiByb290KSB7CisgICAgICAgIGZpbmFsIERvY3VtZW50IGRvbSA9IGRvY3VtZW50QnVpbGRlci5uZXdEb2N1bWVudCgpOworICAgICAgICBjb3JlLnB1dChzeXN0ZW1JZCwgZG9tKTsKKyAgICAgICAgaWYgKHJvb3QpCisgICAgICAgICAgICByb290RG9jdW1lbnRzLmFkZChzeXN0ZW1JZCk7CisKKyAgICAgICAgQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IGdldFBhcnNlckhhbmRsZXIoZG9tKTsKKworICAgICAgICAvLyB3ZSB3aWxsIHJlZ2lzdGVyIHRoZSBET00gdG8gdGhlIG1hcCBvbmNlIHRoZSBzeXN0ZW0gSUQgYmVjb21lcyBhdmFpbGFibGUuCisgICAgICAgIC8vIGJ1dCB0aGUgU0FYIGFsbG93cyB0aGUgZXZlbnQgc291cmNlIHRvIG5vdCB0byBwcm92aWRlIHRoYXQgaW5mb3JtYXRpb24sCisgICAgICAgIC8vIHNvIGJlIHByZXBhcmVkIGZvciBzdWNoIGNhc2UuCisgICAgICAgIEhhbmRsZXJJbXBsIHggPSBuZXcgSGFuZGxlckltcGwoKSB7CisgICAgICAgICAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgeC5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKKworICAgICAgICByZXR1cm4geDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyfSB0byBmZWVkIFNBWCBldmVudHMgaW50by4KKyAgICAgKiA8cC8+CisgICAgICogPHAvPgorICAgICAqIFRoZSBjbGllbnQgb2YgdGhpcyBjbGFzcyBjYW4gZmVlZCBTQVggZXZlbnRzIGludG8gdGhlIGhhbmRsZXIKKyAgICAgKiB0byBwYXJzZSBhIGRvY3VtZW50IGludG8gdGhpcyBET00gZm9yZXN0LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIHZlcnNpb24gcmVxdWlyZXMgdGhhdCB0aGUgRE9NIG9iamVjdCB0byBiZSBjcmVhdGVkIGFuZCByZWdpc3RlcmVkCisgICAgICogdG8gdGhlIG1hcCBiZWZvcmVoYW5kLgorICAgICAqLworICAgIHByaXZhdGUgQ29udGVudEhhbmRsZXIgZ2V0UGFyc2VySGFuZGxlcihEb2N1bWVudCBkb20pIHsKKyAgICAgICAgQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBET01CdWlsZGVyKGRvbSwgbG9jYXRvclRhYmxlLCBvdXRlck1vc3RCaW5kaW5ncyk7CisgICAgICAgIGhhbmRsZXIgPSBuZXcgV2hpdGVzcGFjZVN0cmlwcGVyKGhhbmRsZXIsIGVycm9yUmVjZWl2ZXIsIG9wdGlvbnMuZW50aXR5UmVzb2x2ZXIpOworICAgICAgICBoYW5kbGVyID0gbmV3IFZlcnNpb25DaGVja2VyKGhhbmRsZXIsIGVycm9yUmVjZWl2ZXIsIG9wdGlvbnMuZW50aXR5UmVzb2x2ZXIpOworCisgICAgICAgIC8vIGluc2VydCB0aGUgcmVmZXJlbmNlIGZpbmRlciBzbyB0aGF0CisgICAgICAgIC8vIGluY2x1ZGVkL2ltcG9ydGVkIHNjaGVtYXMgd2lsbCBiZSBhbHNvIHBhcnNlZAorICAgICAgICBYTUxGaWx0ZXJJbXBsIGYgPSBsb2dpYy5jcmVhdGVFeHRlcm5hbFJlZmVyZW5jZUZpbmRlcih0aGlzKTsKKyAgICAgICAgZi5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKKworICAgICAgICBpZiAoZXJyb3JSZWNlaXZlciAhPSBudWxsKQorICAgICAgICAgICAgZi5zZXRFcnJvckhhbmRsZXIoZXJyb3JSZWNlaXZlcik7CisgICAgICAgIGlmIChvcHRpb25zLmVudGl0eVJlc29sdmVyICE9IG51bGwpCisgICAgICAgICAgICBmLnNldEVudGl0eVJlc29sdmVyKG9wdGlvbnMuZW50aXR5UmVzb2x2ZXIpOworCisgICAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZVN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lzdGVtSWQgPSBuZXcgVVJJKHN5c3RlbUlkKS5ub3JtYWxpemUoKS50b1N0cmluZygpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gbGVhdmUgdGhlIHN5c3RlbSBJRCB1bnRvdWNoZWQuIEluIG15IGV4cGVyaWVuY2UgVVJJIGlzIG9mdGVuIHRvbyBzdHJpY3QKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3lzdGVtSWQ7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0V4dGVuc2lvbk1vZGUoKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgRE9NIHRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc3lzdGVtIElELAorICAgICAqIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0KFN0cmluZyBzeXN0ZW1JZCkgeworICAgICAgICBEb2N1bWVudCBkb2MgPSBjb3JlLmdldChzeXN0ZW1JZCk7CisKKyAgICAgICAgaWYgKGRvYyA9PSBudWxsICYmIHN5c3RlbUlkLnN0YXJ0c1dpdGgoImZpbGU6LyIpICYmICFzeXN0ZW1JZC5zdGFydHNXaXRoKCJmaWxlOi8vIikpIHsKKyAgICAgICAgICAgIC8vIEFzIG9mIEpESzEuNCwgamF2YS5uZXQuVVJMLnRvRXh0ZXJuYWwgbWV0aG9kIHJldHVybnMgVVJMcyBsaWtlCisgICAgICAgICAgICAvLyAiZmlsZTovYWJjL2RlZi9naGkiIHdoaWNoIGlzIGFuIGluY29ycmVjdCBmaWxlIHByb3RvY29sIFVSTCBhY2NvcmRpbmcgdG8gUkZDMTczOC4KKyAgICAgICAgICAgIC8vIFNvbWUgb3RoZXIgY29ycmVjdGx5IGZ1bmN0aW9uaW5nIHBhcnRzIHJldHVybiB0aGUgY29ycmVjdCBVUkxzICgiZmlsZTovLy9hYmMvZGVmL2doaSIpLAorICAgICAgICAgICAgLy8gYW5kIHRoaXMgZGVzY3JpcGFuY3kgYnJlYWtzIERPTSBsb29rIHVwIGJ5IHN5c3RlbSBJRC4KKworICAgICAgICAgICAgLy8gdGhpcyBleHRyYSBjaGVjayBzb2x2ZXMgdGhpcyBwcm9ibGVtLgorICAgICAgICAgICAgZG9jID0gY29yZS5nZXQoImZpbGU6Ly8iICsgc3lzdGVtSWQuc3Vic3RyaW5nKDUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb2MgPT0gbnVsbCAmJiBzeXN0ZW1JZC5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CisgICAgICAgICAgICAvLyBvbiBXaW5kb3dzLCBmaWxlbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuCisgICAgICAgICAgICAvLyBwZXJmb3JtIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoIGZvciBpbXByb3ZlZCB1c2VyIGV4cGVyaWVuY2UKKyAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1QYXRoID0gZ2V0UGF0aChzeXN0ZW1JZCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBjb3JlLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCJmaWxlOiIpICYmIGdldFBhdGgoa2V5KS5lcXVhbHNJZ25vcmVDYXNlKHN5c3RlbVBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGRvYyA9IGNvcmUuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkb2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaXBzIG9mZiB0aGUgbGVhZGluZyAnZmlsZTovLy8nIHBvcnRpb24gZnJvbSBhbiBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChTdHJpbmcga2V5KSB7CisgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoNSk7IC8vIHNraXAgJ2ZpbGU6JworICAgICAgICB3aGlsZSAoa2V5Lmxlbmd0aCgpID4gMCAmJiBrZXkuY2hhckF0KDApID09ICcvJykKKyAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoMSk7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgdGhlIHN5c3RlbSBJRHMgb2YgdGhlIGRvY3VtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gbGlzdFN5c3RlbUlEcygpIHsKKyAgICAgICAgcmV0dXJuIGNvcmUua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW2NvcmUua2V5U2V0KCkuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3lzdGVtIElEIGZyb20gd2hpY2ggdGhlIGdpdmVuIERPTSBpcyBwYXJzZWQuCisgICAgICogPHAvPgorICAgICAqIFBvb3ItbWFuJ3MgYmFzZSBVUkkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZChEb2N1bWVudCBkb20pIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEb2N1bWVudD4gZSA6IGNvcmUuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGUuZ2V0VmFsdWUoKSA9PSBkb20pCisgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0S2V5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZmlyc3Qgb25lICh3aGljaCBpcyBtb3JlIG9yIGxlc3MgcmFuZG9tKSBpbiB7QGxpbmsgI3Jvb3REb2N1bWVudHN9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RSb290RG9jdW1lbnQoKSB7CisgICAgICAgIGlmKHJvb3REb2N1bWVudHMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJvb3REb2N1bWVudHMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFJvb3REb2N1bWVudHMoKSB7CisgICAgICAgIHJldHVybiByb290RG9jdW1lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIER1bXBzIHRoZSBjb250ZW50cyBvZiB0aGUgZm9yZXN0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIGlzIGEgZGVidWcgbWV0aG9kLiBBcyBzdWNoLCBlcnJvciBoYW5kbGluZyBpcyBzbG9wcHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHVtcChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gY3JlYXRlIGlkZW50aXR5IHRyYW5zZm9ybWVyCisgICAgICAgICAgICBUcmFuc2Zvcm1lciBpdCA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7CisKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgRG9jdW1lbnQ+IGUgOiBjb3JlLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoKCItLS08PCAiICsgZS5nZXRLZXkoKSArICdcbicpLmdldEJ5dGVzKCkpOworCisgICAgICAgICAgICAgICAgRGF0YVdyaXRlciBkdyA9IG5ldyBEYXRhV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0KSwgbnVsbCk7CisgICAgICAgICAgICAgICAgZHcuc2V0SW5kZW50U3RlcCgiICAiKTsKKyAgICAgICAgICAgICAgICBpdC50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShlLmdldFZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNBWFJlc3VsdChkdykpOworCisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcblxuXG4iLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0RPTUZvcmVzdFNjYW5uZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRE9NRm9yZXN0U2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzgxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0RPTUZvcmVzdFNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisKKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC51bm1hcnNoYWxsZXIuRE9NU2Nhbm5lcjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7CisKKy8qKgorICogUHJvZHVjZXMgYSBjb21wbGV0ZSBzZXJpZXMgb2YgU0FYIGV2ZW50cyBmcm9tIGFueSBET00gbm9kZQorICogaW4gdGhlIERPTUZvcmVzdC4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaGlkZXMgYSBsb2dpYyBvZiByZS1hc3NvY2lhdGluZyB7QGxpbmsgb3JnLnhtbC5zYXguTG9jYXRvcn0KKyAqIHRvIHRoZSBnZW5lcmF0ZWQgU0FYIGV2ZW50IHN0cmVhbS4KKyAqCisgKiBAYXV0aG9yCisgKiAgICAgS29oc3VrZSBLYXdhZ3VjaGkgKGtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBET01Gb3Jlc3RTY2FubmVyIHsKKworICAgIHByaXZhdGUgZmluYWwgRE9NRm9yZXN0IGZvcmVzdDsKKworICAgIC8qKgorICAgICAqIFNjYW5zIERPTSBub2RlcyBvZiB0aGUgZ2l2ZW4gZm9yZXN0LgorICAgICAqCisgICAgICogRE9NIG5vZGUgcGFyYW1ldGVycyB0byB0aGUgc2NhbiBtZXRob2QgbXVzdCBiZSBhIHBhcnQgb2YKKyAgICAgKiB0aGlzIGZvcmVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRE9NRm9yZXN0U2Nhbm5lciggRE9NRm9yZXN0IF9mb3Jlc3QgKSB7CisgICAgICAgIHRoaXMuZm9yZXN0ID0gX2ZvcmVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHdob2xlIHNldCBvZiBTQVggZXZlbnRzIGJ5IHRyZWF0aW5nCisgICAgICogZWxlbWVudCBlIGFzIGlmIGl0J3MgYSByb290IGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2NhbiggRWxlbWVudCBlLCBDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciApIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBET01TY2FubmVyIHNjYW5uZXIgPSBuZXcgRE9NU2Nhbm5lcigpOworCisgICAgICAgIC8vIGluc2VydCB0aGUgbG9jYXRpb24gcmVzb2x2ZXIgaW50byB0aGUgcGlwZSBsaW5lCisgICAgICAgIExvY2F0aW9uUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgTG9jYXRpb25SZXNvbHZlcihzY2FubmVyKTsKKyAgICAgICAgcmVzb2x2ZXIuc2V0Q29udGVudEhhbmRsZXIoY29udGVudEhhbmRsZXIpOworCisgICAgICAgIC8vIHBhcnNlIHRoaXMgRE9NLgorICAgICAgICBzY2FubmVyLnNldENvbnRlbnRIYW5kbGVyKHJlc29sdmVyKTsKKyAgICAgICAgc2Nhbm5lci5zY2FuKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgd2hvbGUgc2V0IG9mIFNBWCBldmVudHMgZnJvbSB0aGUgZ2l2ZW4gRG9jdW1lbnQKKyAgICAgKiBpbiB0aGUgRE9NRm9yZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNjYW4oIERvY3VtZW50IGQsIENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHNjYW4oIGQuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGNvbnRlbnRIYW5kbGVyICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJjZXB0cyB0aGUgaW52b2NhdGlvbiBvZiB0aGUgc2V0RG9jdW1lbnRMb2NhdG9yIG1ldGhvZAorICAgICAqIGFuZCBwYXNzZXMgaXRzZWxmIGFzIHRoZSBsb2NhdG9yLgorICAgICAqCisgICAgICogSWYgdGhlIGNsaWVudCBjYWxscyBvbmUgb2YgdGhlIG1ldGhvZHMgb24gdGhlIExvY2F0b3IgaW50ZXJmYWNlLAorICAgICAqIHVzZSB0aGUgTG9jYXRvclRhYmxlIHRvIHJlc29sdmUgdGhlIHNvdXJjZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIExvY2F0aW9uUmVzb2x2ZXIgZXh0ZW5kcyBYTUxGaWx0ZXJJbXBsIGltcGxlbWVudHMgTG9jYXRvciB7CisgICAgICAgIExvY2F0aW9uUmVzb2x2ZXIoIERPTVNjYW5uZXIgX3BhcmVudCApIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50ID0gX3BhcmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgRE9NU2Nhbm5lciBwYXJlbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHdlIGFyZSBwcm9jZXNzaW5nIGEgc3RhcnQgZWxlbWVudCBldmVudAorICAgICAgICAgKiBvciBhbiBlbmQgZWxlbWVudCBldmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogRE9NU2Nhbm5lcidzIGdldEN1cnJlbnRMb2NhdGlvbiBtZXRob2QgZG9lc24ndCB0ZWxsIHVzIHdoaWNoLCBidXQKKyAgICAgICAgICogdGhpcyBpbmZvcm1hdGlvbiBpcyBuZWNlc3NhcnkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUaHVzIHdlIHNldCB0aGlzIGZsYWcgYXBwcm9wcmlhdGVseSBiZWZvcmUgd2UgcGFzcyBhbiBldmVudCB0bworICAgICAgICAgKiB0aGUgbmV4dCBDb250ZW50SGFuZGxlciwgdGhlcmVieSBtYWtpbmcgaXQgcG9zc2libGUgdG8gZmlndXJlCisgICAgICAgICAqIG91dCB3aGljaCBsb2NhdGlvbiB0byByZXR1cm4uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5TdGFydCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBvbmUgc2V0IGJ5IHRoZSBwYXJlbnQuCisKKyAgICAgICAgICAgIHN1cGVyLnNldERvY3VtZW50TG9jYXRvcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGluU3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgaW5TdGFydCA9IHRydWU7CisgICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRzKTsKKyAgICAgICAgfQorCisKKworCisgICAgICAgIHByaXZhdGUgTG9jYXRvciBmaW5kTG9jYXRvcigpIHsKKyAgICAgICAgICAgIE5vZGUgbiA9IHBhcmVudC5nZXRDdXJyZW50TG9jYXRpb24oKTsKKyAgICAgICAgICAgIGlmKCBuIGluc3RhbmNlb2YgRWxlbWVudCApIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudCluOworICAgICAgICAgICAgICAgIGlmKCBpblN0YXJ0ICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbiggZSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0RW5kTG9jYXRpb24oIGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTG9jYXRvciBtZXRob2RzCisgICAgICAgIC8vCisgICAgICAgIC8vCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgeworICAgICAgICAgICAgTG9jYXRvciBsID0gZmluZExvY2F0b3IoKTsKKyAgICAgICAgICAgIGlmKGwhPW51bGwpICAgICByZXR1cm4gbC5nZXRDb2x1bW5OdW1iZXIoKTsKKyAgICAgICAgICAgIHJldHVybiAgICAgICAgICAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKyAgICAgICAgICAgIExvY2F0b3IgbCA9IGZpbmRMb2NhdG9yKCk7CisgICAgICAgICAgICBpZihsIT1udWxsKSAgICAgcmV0dXJuIGwuZ2V0TGluZU51bWJlcigpOworICAgICAgICAgICAgcmV0dXJuICAgICAgICAgIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKKyAgICAgICAgICAgIExvY2F0b3IgbCA9IGZpbmRMb2NhdG9yKCk7CisgICAgICAgICAgICBpZihsIT1udWxsKSAgICAgcmV0dXJuIGwuZ2V0UHVibGljSWQoKTsKKyAgICAgICAgICAgIHJldHVybiAgICAgICAgICBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKKyAgICAgICAgICAgIExvY2F0b3IgbCA9IGZpbmRMb2NhdG9yKCk7CisgICAgICAgICAgICBpZihsIT1udWxsKSAgICAgcmV0dXJuIGwuZ2V0U3lzdGVtSWQoKTsKKyAgICAgICAgICAgIHJldHVybiAgICAgICAgICBudWxsOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0V4dGVuc2lvbkhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRXh0ZW5zaW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE5NDBlLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRXh0ZW5zaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlBhcnNlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5Xcml0ZXJDb250ZXh0OwotCi0vKioKLSAqIEEgaGFuZGxlciBmb3IgZXh0ZW5zaW9ucyBlbGVtZW50cyBkZWZpbmluZWQgaW4gb25lIG5hbWVzcGFjZS4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dGVuc2lvbkhhbmRsZXIgewotCi0gICAgcHJvdGVjdGVkIEV4dGVuc2lvbkhhbmRsZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkhhbmRsZXJzKE1hcCBtKSB7Ci0gICAgICAgIF9leHRlbnNpb25IYW5kbGVycyA9IG07Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZG9IYW5kbGVFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCi0gICAgICAgIEVsZW1lbnQgZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9IYW5kbGVFeHRlbnNpb24oV3JpdGVyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpb24gZXh0ZW5zaW9uKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXAgX2V4dGVuc2lvbkhhbmRsZXJzOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9FeHRlbnNpb25IYW5kbGVyQmFzZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9FeHRlbnNpb25IYW5kbGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJmZmE1Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRXh0ZW5zaW9uSGFuZGxlckJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LldTRExDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lm1pbWUuTUlNRUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2libGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5QYXJzZXJDb250ZXh0OwotLyoqCi0gKiBBIGJhc2UgY2xhc3MgZm9yIFdTREwgZXh0ZW5zaW9uIGhhbmRsZXJzLgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaW9uSGFuZGxlckJhc2UgZXh0ZW5kcyBFeHRlbnNpb25IYW5kbGVyIHsKLQotICAgIHByb3RlY3RlZCBFeHRlbnNpb25IYW5kbGVyQmFzZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkb0hhbmRsZUV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKLSAgICAgICAgRWxlbWVudCBlKSB7Ci0gICAgICAgIGlmIChwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9ERUZJTklUSU9OUykpIHsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVEZWZpbml0aW9uc0V4dGVuc2lvbihjb250ZXh0LCBwYXJlbnQsIGUpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX1RZUEVTKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVR5cGVzRXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfUE9SVF9UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBvcnRUeXBlRXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoCi0gICAgICAgICAgICBwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9CSU5ESU5HKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUJpbmRpbmdFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKLSAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgIHBhcmVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX09QRVJBVElPTikpIHsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVPcGVyYXRpb25FeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9JTlBVVCkpIHsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVJbnB1dEV4dGVuc2lvbihjb250ZXh0LCBwYXJlbnQsIGUpOwotICAgICAgICB9IGVsc2UgaWYgKAotICAgICAgICAgICAgcGFyZW50LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfT1VUUFVUKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU91dHB1dEV4dGVuc2lvbihjb250ZXh0LCBwYXJlbnQsIGUpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX0ZBVUxUKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZhdWx0RXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoCi0gICAgICAgICAgICBwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVNlcnZpY2VFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9QT1JUKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBvcnRFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoTUlNRUNvbnN0YW50cy5RTkFNRV9QQVJUKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU1JTUVQYXJ0RXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcGFyYW0gZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgUG9ydFR5cGVFeHRlbnNpb24gc2hvdWxkIGJlIGhhbmRsZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYW5kbGVQb3J0VHlwZUV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKLSAgICAgICAgRWxlbWVudCBlKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhbmRsZURlZmluaXRpb25zRXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAotICAgICAgICBFbGVtZW50IGUpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhbmRsZVR5cGVzRXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAotICAgICAgICBFbGVtZW50IGUpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhbmRsZUJpbmRpbmdFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCi0gICAgICAgIEVsZW1lbnQgZSk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlT3BlcmF0aW9uRXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAotICAgICAgICBFbGVtZW50IGUpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhbmRsZUlucHV0RXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAotICAgICAgICBFbGVtZW50IGUpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhbmRsZU91dHB1dEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKLSAgICAgICAgRWxlbWVudCBlKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYW5kbGVGYXVsdEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKLSAgICAgICAgRWxlbWVudCBlKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYW5kbGVTZXJ2aWNlRXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAotICAgICAgICBFbGVtZW50IGUpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhbmRsZVBvcnRFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCi0gICAgICAgIEVsZW1lbnQgZSk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlTUlNRVBhcnRFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCi0gICAgICAgIEVsZW1lbnQgZSk7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0hUVFBFeHRlbnNpb25IYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0hUVFBFeHRlbnNpb25IYW5kbGVyLmphdmEKaW5kZXggYmNlNmM0Yy4uMmJmYTM3MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9IVFRQRXh0ZW5zaW9uSGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvSFRUUEV4dGVuc2lvbkhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw5MyArMjUsODcgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuaHR0cC4qOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5odHRwLkhUVFBPcGVyYXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lmh0dHAuSFRUUFVybEVuY29kZWQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lmh0dHAuSFRUUFVybFJlcGxhY2VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlBhcnNlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5Xcml0ZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKICAqIFRoZSBIVFRQIGV4dGVuc2lvbiBoYW5kbGVyIGZvciBXU0RMLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgSFRUUEV4dGVuc2lvbkhhbmRsZXIgZXh0ZW5kcyBFeHRlbnNpb25IYW5kbGVyQmFzZSB7CitwdWJsaWMgY2xhc3MgSFRUUEV4dGVuc2lvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXIgewogCi0gICAgcHVibGljIEhUVFBFeHRlbnNpb25IYW5kbGVyKCkgeworCisgICAgcHVibGljIEhUVFBFeHRlbnNpb25IYW5kbGVyKE1hcDxTdHJpbmcsIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlcj4gZXh0ZW5zaW9uSGFuZGxlck1hcCkgeworICAgICAgICBzdXBlcihleHRlbnNpb25IYW5kbGVyTWFwKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKICAgICAgICAgcmV0dXJuIENvbnN0YW50cy5OU19XU0RMX0hUVFA7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGVmaW5pdGlvbnNFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRGVmaW5pdGlvbnNFeHRlbnNpb24oCisgICAgICAgIFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBUV1NETEV4dGVuc2libGUgcGFyZW50LAogICAgICAgICBFbGVtZW50IGUpIHsKICAgICAgICAgVXRpbC5mYWlsKAogICAgICAgICAgICAgInBhcnNpbmcuaW52YWxpZEV4dGVuc2lvbkVsZW1lbnQiLAogICAgICAgICAgICAgZS5nZXRUYWdOYW1lKCksCiAgICAgICAgICAgICBlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBrZWVwIGNvbXBpbGVyIGhhcHB5CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUeXBlc0V4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVUeXBlc0V4dGVuc2lvbigKKyAgICAgICAgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwKKyAgICAgICAgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwKICAgICAgICAgRWxlbWVudCBlKSB7CiAgICAgICAgIFV0aWwuZmFpbCgKICAgICAgICAgICAgICJwYXJzaW5nLmludmFsaWRFeHRlbnNpb25FbGVtZW50IiwKICAgICAgICAgICAgIGUuZ2V0VGFnTmFtZSgpLAogICAgICAgICAgICAgZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy8ga2VlcCBjb21waWxlciBoYXBweQorICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlQmluZGluZ0V4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVCaW5kaW5nRXh0ZW5zaW9uKAorICAgICAgICBUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwKKyAgICAgICAgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwKICAgICAgICAgRWxlbWVudCBlKSB7CiAgICAgICAgIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlLCBIVFRQQ29uc3RhbnRzLlFOQU1FX0JJTkRJTkcpKSB7CiAgICAgICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOwogCi0gICAgICAgICAgICBIVFRQQmluZGluZyBiaW5kaW5nID0gbmV3IEhUVFBCaW5kaW5nKCk7CisgICAgICAgICAgICBIVFRQQmluZGluZyBiaW5kaW5nID0gbmV3IEhUVFBCaW5kaW5nKGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOwogCiAgICAgICAgICAgICBTdHJpbmcgdmVyYiA9IFV0aWwuZ2V0UmVxdWlyZWRBdHRyaWJ1dGUoZSwgQ29uc3RhbnRzLkFUVFJfVkVSQik7CiAgICAgICAgICAgICBiaW5kaW5nLnNldFZlcmIodmVyYik7CiAKICAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24oYmluZGluZyk7CiAgICAgICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoSFRUUENvbnN0YW50cy5RTkFNRV9CSU5ESU5HLCBiaW5kaW5nKTsKKy8vICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoSFRUUENvbnN0YW50cy5RTkFNRV9CSU5ESU5HLCBiaW5kaW5nKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgVXRpbC5mYWlsKAogICAgICAgICAgICAgICAgICJwYXJzaW5nLmludmFsaWRFeHRlbnNpb25FbGVtZW50IiwKICAgICAgICAgICAgICAgICBlLmdldFRhZ05hbWUoKSwKICAgICAgICAgICAgICAgICBlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8ga2VlcCBjb21waWxlciBoYXBweQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlT3BlcmF0aW9uRXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU9wZXJhdGlvbkV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgSFRUUENvbnN0YW50cy5RTkFNRV9PUEVSQVRJT04pKSB7CiAgICAgICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOwogCi0gICAgICAgICAgICBIVFRQT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBIVFRQT3BlcmF0aW9uKCk7CisgICAgICAgICAgICBIVFRQT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBIVFRQT3BlcmF0aW9uKGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOwogCiAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPQogICAgICAgICAgICAgICAgIFV0aWwuZ2V0UmVxdWlyZWRBdHRyaWJ1dGUoZSwgQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04pOwpAQCAtMTE5LDgxICsxMTMsODEgQEAKIAogICAgICAgICAgICAgcGFyZW50LmFkZEV4dGVuc2lvbihvcGVyYXRpb24pOwogICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAotICAgICAgICAgICAgICAgIEhUVFBDb25zdGFudHMuUU5BTUVfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbik7CisvLyAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAorLy8gICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5RTkFNRV9PUEVSQVRJT04sCisvLyAgICAgICAgICAgICAgICBvcGVyYXRpb24pOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBVdGlsLmZhaWwoCiAgICAgICAgICAgICAgICAgInBhcnNpbmcuaW52YWxpZEV4dGVuc2lvbkVsZW1lbnQiLAogICAgICAgICAgICAgICAgIGUuZ2V0VGFnTmFtZSgpLAogICAgICAgICAgICAgICAgIGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBrZWVwIGNvbXBpbGVyIGhhcHB5CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVJbnB1dEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVJbnB1dEV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgSFRUUENvbnN0YW50cy5RTkFNRV9VUkxfRU5DT0RFRCkpIHsKLSAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24obmV3IEhUVFBVcmxFbmNvZGVkKCkpOworICAgICAgICAgICAgcGFyZW50LmFkZEV4dGVuc2lvbihuZXcgSFRUUFVybEVuY29kZWQoY29udGV4dC5nZXRMb2NhdGlvbihlKSkpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICAgICBYbWxVdGlsLm1hdGNoZXNUYWdOUyhlLCBIVFRQQ29uc3RhbnRzLlFOQU1FX1VSTF9SRVBMQUNFTUVOVCkpIHsKLSAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24obmV3IEhUVFBVcmxSZXBsYWNlbWVudCgpKTsKKyAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24obmV3IEhUVFBVcmxSZXBsYWNlbWVudChjb250ZXh0LmdldExvY2F0aW9uKGUpKSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFV0aWwuZmFpbCgKICAgICAgICAgICAgICAgICAicGFyc2luZy5pbnZhbGlkRXh0ZW5zaW9uRWxlbWVudCIsCiAgICAgICAgICAgICAgICAgZS5nZXRUYWdOYW1lKCksCiAgICAgICAgICAgICAgICAgZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGtlZXAgY29tcGlsZXIgaGFwcHkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZU91dHB1dEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVPdXRwdXRFeHRlbnNpb24oCisgICAgICAgIFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBUV1NETEV4dGVuc2libGUgcGFyZW50LAogICAgICAgICBFbGVtZW50IGUpIHsKICAgICAgICAgVXRpbC5mYWlsKAogICAgICAgICAgICAgInBhcnNpbmcuaW52YWxpZEV4dGVuc2lvbkVsZW1lbnQiLAogICAgICAgICAgICAgZS5nZXRUYWdOYW1lKCksCiAgICAgICAgICAgICBlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBrZWVwIGNvbXBpbGVyIGhhcHB5CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVGYXVsdEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdEV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBVdGlsLmZhaWwoCiAgICAgICAgICAgICAicGFyc2luZy5pbnZhbGlkRXh0ZW5zaW9uRWxlbWVudCIsCiAgICAgICAgICAgICBlLmdldFRhZ05hbWUoKSwKICAgICAgICAgICAgIGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGtlZXAgY29tcGlsZXIgaGFwcHkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNlcnZpY2VFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlU2VydmljZUV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBVdGlsLmZhaWwoCiAgICAgICAgICAgICAicGFyc2luZy5pbnZhbGlkRXh0ZW5zaW9uRWxlbWVudCIsCiAgICAgICAgICAgICBlLmdldFRhZ05hbWUoKSwKICAgICAgICAgICAgIGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGtlZXAgY29tcGlsZXIgaGFwcHkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVBvcnRFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlUG9ydEV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgSFRUUENvbnN0YW50cy5RTkFNRV9BRERSRVNTKSkgewogICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKIAotICAgICAgICAgICAgSFRUUEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBIVFRQQWRkcmVzcygpOworICAgICAgICAgICAgSFRUUEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBIVFRQQWRkcmVzcyhjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0KICAgICAgICAgICAgICAgICBVdGlsLmdldFJlcXVpcmVkQXR0cmlidXRlKGUsIENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OKTsKQEAgLTIwMSw2OCArMTk1LDIyIEBACiAKICAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24oYWRkcmVzcyk7CiAgICAgICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoSFRUUENvbnN0YW50cy5RTkFNRV9BRERSRVNTLCBhZGRyZXNzKTsKKy8vICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoSFRUUENvbnN0YW50cy5RTkFNRV9BRERSRVNTLCBhZGRyZXNzKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgVXRpbC5mYWlsKAogICAgICAgICAgICAgICAgICJwYXJzaW5nLmludmFsaWRFeHRlbnNpb25FbGVtZW50IiwKICAgICAgICAgICAgICAgICBlLmdldFRhZ05hbWUoKSwKICAgICAgICAgICAgICAgICBlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8ga2VlcCBjb21waWxlciBoYXBweQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlTUlNRVBhcnRFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCi0gICAgICAgIEVsZW1lbnQgZSkgeworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVBvcnRUeXBlRXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKICAgICAgICAgVXRpbC5mYWlsKAogICAgICAgICAgICAgInBhcnNpbmcuaW52YWxpZEV4dGVuc2lvbkVsZW1lbnQiLAogICAgICAgICAgICAgZS5nZXRUYWdOYW1lKCksCiAgICAgICAgICAgICBlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBrZWVwIGNvbXBpbGVyIGhhcHB5Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9IYW5kbGVFeHRlbnNpb24oV3JpdGVyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpb24gZXh0ZW5zaW9uKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZXh0ZW5zaW9uIGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpIHsKLSAgICAgICAgICAgIEhUVFBBZGRyZXNzIGFkZHJlc3MgPSAoSFRUUEFkZHJlc3MpIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhhZGRyZXNzLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9MT0NBVElPTiwKLSAgICAgICAgICAgICAgICBhZGRyZXNzLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhhZGRyZXNzLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIEhUVFBCaW5kaW5nKSB7Ci0gICAgICAgICAgICBIVFRQQmluZGluZyBiaW5kaW5nID0gKEhUVFBCaW5kaW5nKSBleHRlbnNpb247Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcoYmluZGluZy5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVkVSQiwgYmluZGluZy5nZXRWZXJiKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhiaW5kaW5nLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIEhUVFBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgIEhUVFBPcGVyYXRpb24gb3BlcmF0aW9uID0gKEhUVFBPcGVyYXRpb24pIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhvcGVyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVFbmRUYWcob3BlcmF0aW9uLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIEhUVFBVcmxFbmNvZGVkKSB7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcoZXh0ZW5zaW9uLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhleHRlbnNpb24uZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uIGluc3RhbmNlb2YgSFRUUFVybFJlcGxhY2VtZW50KSB7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcoZXh0ZW5zaW9uLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhleHRlbnNpb24uZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpb25IYW5kbGVyQmFzZSNoYW5kbGVQb3J0VHlwZUV4dGVuc2lvbihQYXJzZXJDb250ZXh0LCBFeHRlbnNpYmxlLCBvcmcudzNjLmRvbS5FbGVtZW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVBvcnRUeXBlRXh0ZW5zaW9uKFBhcnNlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgewotICAgICAgICBVdGlsLmZhaWwoCi0gICAgICAgICAgICAicGFyc2luZy5pbnZhbGlkRXh0ZW5zaW9uRWxlbWVudCIsCi0gICAgICAgICAgICBlLmdldFRhZ05hbWUoKSwKLSAgICAgICAgICAgIGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGtlZXAgY29tcGlsZXIgaGFwcHkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvSW50ZXJuYWxpemF0aW9uTG9naWMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvSW50ZXJuYWxpemF0aW9uTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q1Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9JbnRlcm5hbGl6YXRpb25Mb2dpYy5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKKworLyoqCisgKiBFbmNhcHN1bGF0ZXMgc2NoZW1hLWxhbmd1YWdlIGRlcGVuZGVudCBpbnRlcm5hbGl6YXRpb24gbG9naWMuCisgKgorICoge0BsaW5rIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5pbnRlcm5hbGl6ZXIuSW50ZXJuYWxpemVyfSBhbmQge0BsaW5rIERPTUZvcmVzdH0gYXJlIHJlc3BvbnNpYmxlIGZvcgorICogZG9pbmcgc2NoZW1hIGxhbmd1YWdlIGluZGVwZW5kZW50IHBhcnQsIGFuZCB0aGlzIG9iamVjdCBpcyByZXNwb25zaWJsZQorICogZm9yIHNjaGVtYSBsYW5ndWFnZSBkZXBlbmRlbnQgcGFydC4KKyAqCisgKiBAYXV0aG9yCisgKiAgICAgS29oc3VrZSBLYXdhZ3VjaGkgKGtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20pCisgKiAgICAgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW50ZXJuYWxpemF0aW9uTG9naWMgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgWE1MRmlsdGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgKiBmaW5kIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgc2NoZW1hcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNjaGVtYXMgdGhhdCBhcmUgaW5jbHVkZWQvaW1wb3J0ZWQgbmVlZCB0byBiZSBhIHBhcnQgb2YKKyAgICAgKiB7QGxpbmsgRE9NRm9yZXN0fSwgYW5kIHRoaXMgZmlsdGVyIHdpbGwgYmUgZXhwZWN0ZWQgdG8KKyAgICAgKiBmaW5kIHN1Y2ggcmVmZXJlbmNlcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9uY2Ugc3VjaCBhIHJlZmVyZW5jZSBpcyBmb3VuZCwgdGhlIGZpbHRlciBpcyBleHBlY3RlZCB0bworICAgICAqIGNhbGwgdGhlIHBhcnNlIG1ldGhvZCBvZiBET01Gb3Jlc3QuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgRE9NRm9yZXN0fSB3aWxsIHJlZ2lzdGVyIEVycm9ySGFuZGxlciB0byB0aGUgcmV0dXJuZWQKKyAgICAgKiBvYmplY3QsIHNvIGFueSBlcnJvciBzaG91bGQgYmUgc2VudCB0byB0aGF0IGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIHtAbGluayBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGx9IGJlY2F1c2UKKyAgICAgKiAgICAgIHRoZSBmaWx0ZXIgaGFzIHRvIGJlIHVzYWJsZSBmb3IgdHdvIGRpcmVjdGlvbnMKKyAgICAgKiAgICAgICh3cmFwcGluZyBhIHJlYWRlciBhbmQgd3JhcHBpbmcgYSBDb250ZW50SGFuZGxlcikKKyAgICAgKi8KKyAgICBYTUxGaWx0ZXJJbXBsIGNyZWF0ZUV4dGVybmFsUmVmZXJlbmNlRmluZGVyKCBET01Gb3Jlc3QgcGFyZW50ICk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIGEgdmFsaWQgdGFyZ2V0IG5vZGUKKyAgICAgKiB0byBhdHRhY2ggYSBjdXN0b21pemF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudAorICAgICAqICAgICAgVGhlIG93bmVyIERPTUZvcmVzdCBvYmplY3QuIFByb2JhYmx5IHVzZWZ1bCBvbmx5CisgICAgICogICAgICB0byBvYnRhaW4gY29udGV4dCBpbmZvcm1hdGlvbiwgc3VjaCBhcyBlcnJvciBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBiaW5kaW5ncworICAgICAqICAgICAgJmx0O2pheGI6YmluZGluZ3M+IGVsZW1lbnQgb3IgYSBjdXN0b21pemF0aW9uIGVsZW1lbnQuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgdHJ1ZSBpZiBpdCdzIE9LLCBmYWxzZSBpZiBub3QuCisgICAgICovCisgICAgYm9vbGVhbiBjaGVja0lmVmFsaWRUYXJnZXROb2RlKCBET01Gb3Jlc3QgcGFyZW50LCBFbGVtZW50IGJpbmRpbmdzLCBFbGVtZW50IHRhcmdldCApOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgYW4gZWxlbWVudCB0aGF0IGFjdHVhbGx5IHJlY2VpdmVzIGN1c3RvbWl6YXRpb25zLgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIGluIFhNTCBTY2hlbWEsIHRhcmdldCBub2RlcyBjYW4gYmUgYW55IHNjaGVtYQorICAgICAqIGVsZW1lbnQgYnV0IGl0IGlzIGFsd2F5cyB0aGUgJmx0O3hzZDphcHBpbmZvPiBlbGVtZW50IHRoYXQKKyAgICAgKiByZWNlaXZlcyBjdXN0b21pemF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldAorICAgICAqICAgICAgVGhlIHRhcmdldCBub2RlIGRlc2lnbmF0ZWQgYnkgdGhlIGN1c3RvbWl6YXRpb24uCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQWx3YXlzIHJldHVybiBub24tbnVsbCB2YWxpZCBvYmplY3QKKyAgICAgKi8KKyAgICBFbGVtZW50IHJlZmluZVNjaGVtYVRhcmdldCggRWxlbWVudCB0YXJnZXQgKTsKKworICAgIC8qKgorICAgICAqIFByZXBhcmVzIGEgV1NETCBlbGVtZW50IHRoYXQgYWN0dWFsbHkgcmVjZWl2ZXMgY3VzdG9taXphdGlvbnMuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKiAgICAgIFRoZSB0YXJnZXQgbm9kZSBkZXNpZ25hdGVkIGJ5IHRoZSBjdXN0b21pemF0aW9uLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIEFsd2F5cyByZXR1cm4gbm9uLW51bGwgdmFsaWQgb2JqZWN0CisgICAgICovCisgICAgRWxlbWVudCByZWZpbmVXU0RMVGFyZ2V0KCBFbGVtZW50IHRhcmdldCApOworCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0ludGVybmFsaXplci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9JbnRlcm5hbGl6ZXIuamF2YQppbmRleCBiZjg1YjI5Li5lYzY1NDgyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0ludGVybmFsaXplci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvSW50ZXJuYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMzkgKzI0LDI4IEBACiAgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKIAotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuU0FYUGFyc2VFeGNlcHRpb24yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLldzaW1wb3J0T3B0aW9uczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuamF4d3MuSkFYV1NCaW5kaW5nc0NvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsLkRPTVV0aWxzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIudXRpbC5FZGl0RGlzdGFuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5KQVhXU1V0aWxzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuRE9NVXRpbDsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CiBpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOwogaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKIGltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsLkRPTVV0aWxzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5KQVhXU1V0aWxzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSkFYV1NVdGlsczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5qYXh3cy5KQVhXU0JpbmRpbmdzQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC4qOwogCiAKIC8qKgpAQCAtNjQsMzMgKzUzLDI3IEBACiAgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQogICovCiBwdWJsaWMgY2xhc3MgSW50ZXJuYWxpemVyIHsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIERvY3VtZW50PiB3c2RsRG9jdW1lbnRzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRG9jdW1lbnQ+IGpheHdzQmluZGluZ3M7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgIHByaXZhdGUgZmluYWwgWFBhdGggeHBhdGggPSB4cGYubmV3WFBhdGgoKTsKLSAgICBwcml2YXRlIGZpbmFsICBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLndzZGwiKTs7Ci0gICAgcHJpdmF0ZSBQcm9jZXNzb3JFbnZpcm9ubWVudCBlbnY7Ci0gICAgcHVibGljICB2b2lkIHRyYW5zZm9ybShNYXA8U3RyaW5nLCBEb2N1bWVudD4gamF4d3NCaW5kaW5ncywgTWFwPFN0cmluZywgRG9jdW1lbnQ+IHdzZGxEb2N1bWVudHMsIFByb2Nlc3NvckVudmlyb25tZW50IGVudikgewotICAgICAgICBpZihqYXh3c0JpbmRpbmdzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHRoaXMuZW52ID0gZW52OwotICAgICAgICB0aGlzLndzZGxEb2N1bWVudHMgPSB3c2RsRG9jdW1lbnRzOwotICAgICAgICB0aGlzLmpheHdzQmluZGluZ3MgPSBqYXh3c0JpbmRpbmdzOwotICAgICAgICBNYXAgdGFyZ2V0Tm9kZXMgPSBuZXcgSGFzaE1hcDxFbGVtZW50LCBOb2RlPigpOworICAgIHByaXZhdGUgZmluYWwgV3NpbXBvcnRPcHRpb25zIG9wdGlvbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBET01Gb3Jlc3QgZm9yZXN0OworICAgIHByaXZhdGUgZmluYWwgRXJyb3JSZWNlaXZlciBlcnJvclJlY2VpdmVyOwogCi0gICAgICAgIC8vIGlkZW50aWZ5IHRhcmdldCBub2RlcyBmb3IgYWxsIDxKQVhXUzpiaW5kaW5ncz4KLSAgICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIERvY3VtZW50PiBqYXh3c0JpbmRpbmcgOiBqYXh3c0JpbmRpbmdzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZSA9IGpheHdzQmluZGluZy5nZXRWYWx1ZSgpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgLy8gaW5pdGlhbGx5LCB0aGUgaW5oZXJpdGVkIGNvbnRleHQgaXMgaXRzZWxmCi0gICAgICAgICAgICBidWlsZFRhcmdldE5vZGVNYXAoIGUsIGUsIHRhcmdldE5vZGVzICk7CisKKyAgICBwdWJsaWMgSW50ZXJuYWxpemVyKERPTUZvcmVzdCBmb3Jlc3QsIFdzaW1wb3J0T3B0aW9ucyBvcHRpb25zLCBFcnJvclJlY2VpdmVyIGVycm9yUmVjZWl2ZXIpIHsKKyAgICAgICAgdGhpcy5mb3Jlc3QgPSBmb3Jlc3Q7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuZXJyb3JSZWNlaXZlciA9IGVycm9yUmVjZWl2ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKCl7CisgICAgICAgIE1hcDxFbGVtZW50LE5vZGU+IHRhcmdldE5vZGVzID0gbmV3IEhhc2hNYXA8RWxlbWVudCxOb2RlPigpOworICAgICAgICBmb3IoRWxlbWVudCBqYXh3c0JpbmRpbmcgOiBmb3Jlc3Qub3V0ZXJNb3N0QmluZGluZ3MpeworICAgICAgICAgICAgYnVpbGRUYXJnZXROb2RlTWFwKGpheHdzQmluZGluZywgamF4d3NCaW5kaW5nLCB0YXJnZXROb2RlcyApOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlbiBtb3ZlIHRoZW0gdG8gdGhlaXIgcmVzcGVjdGl2ZSBwb3NpdGlvbnMuCi0gICAgICAgIGZvcihNYXAuRW50cnk8U3RyaW5nLCBEb2N1bWVudD4gamF4d3NCaW5kaW5nIDogamF4d3NCaW5kaW5ncy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBFbGVtZW50IGUgPSBqYXh3c0JpbmRpbmcuZ2V0VmFsdWUoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIG1vdmUoIGUsIHRhcmdldE5vZGVzICk7CisgICAgICAgIGZvcihFbGVtZW50IGpheHdzQmluZGluZyA6IGZvcmVzdC5vdXRlck1vc3RCaW5kaW5ncyl7CisgICAgICAgICAgICBtb3ZlKGpheHdzQmluZGluZywgdGFyZ2V0Tm9kZXMgKTsKICAgICAgICAgfQotCiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTIsNDcgKzk1LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBET00gdHJlZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzeXN0ZW0gSUQsCi0gICAgICogb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBnZXQoIFN0cmluZyBzeXN0ZW1JZCApIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gd3NkbERvY3VtZW50cy5nZXQoc3lzdGVtSWQpOwotCi0gICAgICAgIGlmKCBkb2M9PW51bGwgJiYgc3lzdGVtSWQuc3RhcnRzV2l0aCgiZmlsZTovIikgJiYgIXN5c3RlbUlkLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSApIHsKLSAgICAgICAgICAgIC8vIEFzIG9mIEpESzEuNCwgamF2YS5uZXQuVVJMLnRvRXh0ZXJuYWwgbWV0aG9kIHJldHVybnMgVVJMcyBsaWtlCi0gICAgICAgICAgICAvLyAiZmlsZTovYWJjL2RlZi9naGkiIHdoaWNoIGlzIGFuIGluY29ycmVjdCBmaWxlIHByb3RvY29sIFVSTCBhY2NvcmRpbmcgdG8gUkZDMTczOC4KLSAgICAgICAgICAgIC8vIFNvbWUgb3RoZXIgY29ycmVjdGx5IGZ1bmN0aW9uaW5nIHBhcnRzIHJldHVybiB0aGUgY29ycmVjdCBVUkxzICgiZmlsZTovLy9hYmMvZGVmL2doaSIpLAotICAgICAgICAgICAgLy8gYW5kIHRoaXMgZGVzY3JpcGFuY3kgYnJlYWtzIERPTSBsb29rIHVwIGJ5IHN5c3RlbSBJRC4KLQotICAgICAgICAgICAgLy8gdGhpcyBleHRyYSBjaGVjayBzb2x2ZXMgdGhpcyBwcm9ibGVtLgotICAgICAgICAgICAgZG9jID0gd3NkbERvY3VtZW50cy5nZXQoICJmaWxlOi8vIitzeXN0ZW1JZC5zdWJzdHJpbmcoNSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBkb2M9PW51bGwgJiYgc3lzdGVtSWQuc3RhcnRzV2l0aCgiZmlsZToiKSApIHsKLSAgICAgICAgICAgIC8vIG9uIFdpbmRvd3MsIGZpbGVuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4KLSAgICAgICAgICAgIC8vIHBlcmZvcm0gY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2ggZm9yIGltcHJvdmVkIHVzZXIgZXhwZXJpZW5jZQotICAgICAgICAgICAgU3RyaW5nIHN5c3RlbVBhdGggPSBnZXRQYXRoKHN5c3RlbUlkKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHdzZGxEb2N1bWVudHMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBpZihrZXkuc3RhcnRzV2l0aCgiZmlsZToiKSAmJiBnZXRQYXRoKGtleSkuZXF1YWxzSWdub3JlQ2FzZShzeXN0ZW1QYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBkb2MgPSB3c2RsRG9jdW1lbnRzLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpcHMgb2ZmIHRoZSBsZWFkaW5nICdmaWxlOi8vLycgcG9ydGlvbiBmcm9tIGFuIFVSTC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYXRoKFN0cmluZyBrZXkpIHsKLSAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyg1KTsgLy8gc2tpcCAnZmlsZTonCi0gICAgICAgIHdoaWxlKGtleS5sZW5ndGgoKT4wICYmIGtleS5jaGFyQXQoMCk9PScvJykKLSAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogRGV0ZXJtaW5lcyB0aGUgdGFyZ2V0IG5vZGUgb2YgdGhlICJiaW5kaW5ncyIgZWxlbWVudAogICAgICAqIGJ5IHVzaW5nIHRoZSBpbmhlcml0ZWQgdGFyZ2V0IG5vZGUsIHRoZW4gcHV0CiAgICAgICogdGhlIHJlc3VsdCBpbnRvIHRoZSAicmVzdWx0IiBtYXAuCkBAIC0xNzEsMjYgKzExMyw0OSBAQAogICAgICAgICAgICAgICAgIC8vIGFic29sdXRpemUgdGhpcyBVUkkuCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIHRoZSBVUkkgY2xhc3MKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBob25vciB4bWw6YmFzZQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBVUkwobmV3IFVSTChnZXRTeXN0ZW1JZChiaW5kaW5ncy5nZXRPd25lckRvY3VtZW50KCkpKSwKKyAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgVVJMKG5ldyBVUkwoZm9yZXN0LmdldFN5c3RlbUlkKGJpbmRpbmdzLmdldE93bmVyRG9jdW1lbnQoKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uICkudG9FeHRlcm5hbEZvcm0oKTsKICAgICAgICAgICAgIH0gY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlICkgewogICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IEpBWFdTVXRpbHMuYWJzb2x1dGl6ZShKQVhXU1V0aWxzLmdldEZpbGVPclVSTE5hbWUod3NkbExvY2F0aW9uKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHRhcmdldCA9IGdldCh3c2RsTG9jYXRpb24pOworICAgICAgICAgICAgLy90YXJnZXQgPSB3c2RsRG9jdW1lbnRzLmdldCh3c2RsTG9jYXRpb24pOworICAgICAgICAgICAgdGFyZ2V0ID0gZm9yZXN0LmdldCh3c2RsTG9jYXRpb24pOwogICAgICAgICAgICAgaWYodGFyZ2V0PT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IoImludGVybmFsaXplci50YXJnZXROb3RGb3VuZCIsIG5ldyBPYmplY3RbXXt3c2RsTG9jYXRpb259KTsKKyAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihiaW5kaW5ncywgV3NkbE1lc3NhZ2VzLklOVEVSTkFMSVpFUl9JTkNPUlJFQ1RfU0NIRU1BX1JFRkVSRU5DRSh3c2RsTG9jYXRpb24sIEVkaXREaXN0YW5jZS5maW5kTmVhcmVzdCh3c2RsTG9jYXRpb24sIGZvcmVzdC5saXN0U3lzdGVtSURzKCkpKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydCBwcm9jZXNzaW5nIHRoaXMgPEpBWFdTOmJpbmRpbmdzPgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgLy9pZiB0aGUgdGFyZ2V0IG5vZGUgaXMgeHM6c2NoZW1hLCBkZWNsYXJlIHRoZSBqYXhiIHZlcnNpb24gb24gaXQgYXMgbGF0dGVyIG9uIGl0IHdpbGwgYmUKKyAgICAgICAgLy9yZXF1aXJlZCBieSB0aGUgaW5saW5lZCBzY2hlbWEgYmluZGluZ3MKKworICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBET01VdGlsLmdldEZpcnN0RWxlbWVudENoaWxkKHRhcmdldCk7CisgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoQ29uc3RhbnRzLk5TX1dTREwpICYmIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkZWZpbml0aW9ucyIpKSB7CisgICAgICAgICAgICAvL2dldCBhbGwgc2NoZW1hIGVsZW1lbnRzCisgICAgICAgICAgICBFbGVtZW50IHR5cGUgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChlbGVtZW50LCBDb25zdGFudHMuTlNfV1NETCwgInR5cGVzIik7CisgICAgICAgICAgICBpZih0eXBlICE9IG51bGwpeworICAgICAgICAgICAgICAgIGZvciAoRWxlbWVudCBzY2hlbWFFbGVtZW50IDogRE9NVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cyh0eXBlLCBDb25zdGFudHMuTlNfWFNELCAic2NoZW1hIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFFbGVtZW50Lmhhc0F0dHJpYnV0ZU5TKENvbnN0YW50cy5OU19YTUxOUywgImpheGIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhDb25zdGFudHMuTlNfWE1MTlMsICJ4bWxuczpqYXhiIiwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhCX0JJTkRJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vYWRkIGpheGI6YmluZGluZ3MgdmVyc2lvbiBpbmZvLiBMZXRzIHB1dCBpdCB0byAxLjAsIG1heSBuZWVkIHRvIGNoYW5nZSBsYXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFFbGVtZW50Lmhhc0F0dHJpYnV0ZU5TKEpBWFdTQmluZGluZ3NDb25zdGFudHMuTlNfSkFYQl9CSU5ESU5HUywgInZlcnNpb24iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLk5TX0pBWEJfQklORElOR1MsICJqYXhiOnZlcnNpb24iLCBKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLkpBWEJfQklORElOR19WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKICAgICAgICAgYm9vbGVhbiBoYXNOb2RlID0gdHJ1ZTsKLSAgICAgICAgaWYoaXNKQVhXU0JpbmRpbmdzKGJpbmRpbmdzKSAmJiBiaW5kaW5ncy5nZXRBdHRyaWJ1dGVOb2RlKCJub2RlIikhPW51bGwgKSB7Ci0gICAgICAgICAgICB0YXJnZXQgPSBldmFsdWF0ZVhQYXRoTm9kZSh0YXJnZXQsIGJpbmRpbmdzLmdldEF0dHJpYnV0ZSgibm9kZSIpLCBuZXcgTmFtZXNwYWNlQ29udGV4dEltcGwoYmluZGluZ3MpKTsKKyAgICAgICAgaWYoKGlzSkFYV1NCaW5kaW5ncyhiaW5kaW5ncykgfHwgaXNKQVhCQmluZGluZ3MoYmluZGluZ3MpKSAmJiBiaW5kaW5ncy5nZXRBdHRyaWJ1dGVOb2RlKCJub2RlIikhPW51bGwgKSB7CisgICAgICAgICAgICB0YXJnZXQgPSBldmFsdWF0ZVhQYXRoTm9kZShiaW5kaW5ncywgdGFyZ2V0LCBiaW5kaW5ncy5nZXRBdHRyaWJ1dGUoIm5vZGUiKSwgbmV3IE5hbWVzcGFjZUNvbnRleHRJbXBsKGJpbmRpbmdzKSk7CiAgICAgICAgIH1lbHNlIGlmKGlzSkFYV1NCaW5kaW5ncyhiaW5kaW5ncykgJiYgKGJpbmRpbmdzLmdldEF0dHJpYnV0ZU5vZGUoIm5vZGUiKT09bnVsbCkgJiYgIWlzVG9wTGV2ZWxCaW5kaW5nKGJpbmRpbmdzKSkgewogICAgICAgICAgICAgaGFzTm9kZSA9IGZhbHNlOwogICAgICAgICB9ZWxzZSBpZihpc0dsb2JhbEJpbmRpbmcoYmluZGluZ3MpICYmICFpc1dTRExEZWZpbml0aW9uKHRhcmdldCkgJiYgaXNUb3BMZXZlbEJpbmRpbmcoYmluZGluZ3MuZ2V0UGFyZW50Tm9kZSgpKSl7Ci0gICAgICAgICAgICB0YXJnZXQgPSBnZXRXU0RMRGVmaW50aW9uTm9kZSh0YXJnZXQpOworICAgICAgICAgICAgdGFyZ2V0ID0gZ2V0V1NETERlZmludGlvbk5vZGUoYmluZGluZ3MsIHRhcmdldCk7CiAgICAgICAgIH0KIAogICAgICAgICAvL2lmIHRhcmdldCBpcyBudWxsIGl0IG1lYW5zIHRoZSB4cGF0aCBldmFsdWF0aW9uIGhhcyBzb21lIHByb2JsZW0sCkBAIC0yMDMsMTQgKzE2OCwxNCBAQAogICAgICAgICAgICAgcmVzdWx0LnB1dCggYmluZGluZ3MsIHRhcmdldCApOwogCiAgICAgICAgIC8vIGxvb2sgZm9yIGNoaWxkIDxKQVhXUzpiaW5kaW5ncz4gYW5kIHByb2Nlc3MgdGhlbSByZWN1cnNpdmVseQotICAgICAgICBFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRDaGlsZEVsZW1lbnRzKCBiaW5kaW5ncywgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhXU19CSU5ESU5HUyk7Ci0gICAgICAgIGZvciggaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICBidWlsZFRhcmdldE5vZGVNYXAoIGNoaWxkcmVuW2ldLCB0YXJnZXQsIHJlc3VsdCApOworICAgICAgICBFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRDaGlsZEVsZW1lbnRzKCBiaW5kaW5ncyk7CisgICAgICAgIGZvciAoRWxlbWVudCBjaGlsZCA6IGNoaWxkcmVuKQorICAgICAgICAgICAgYnVpbGRUYXJnZXROb2RlTWFwKGNoaWxkLCB0YXJnZXQsIHJlc3VsdCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBOb2RlIGdldFdTRExEZWZpbnRpb25Ob2RlKE5vZGUgdGFyZ2V0KXsKLSAgICAgICAgcmV0dXJuIGV2YWx1YXRlWFBhdGhOb2RlKHRhcmdldCwgIndzZGw6ZGVmaW5pdGlvbnMiLAotICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dCgpeworICAgIHByaXZhdGUgTm9kZSBnZXRXU0RMRGVmaW50aW9uTm9kZShOb2RlIGJpbmRpbmdzLCBOb2RlIHRhcmdldCl7CisgICAgICAgIHJldHVybiBldmFsdWF0ZVhQYXRoTm9kZShiaW5kaW5ncywgdGFyZ2V0LCAid3NkbDpkZWZpbml0aW9ucyIsCisgICAgICAgICAgICBuZXcgTmFtZXNwYWNlQ29udGV4dCgpewogICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKICAgICAgICAgICAgICAgICB9CkBAIC0yMjcsMTEgKzE5Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0YXJnZXQuZ2V0TG9jYWxOYW1lKCk7CiAgICAgICAgIFN0cmluZyBuc1VSSSA9IHRhcmdldC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYoKChsb2NhbE5hbWUgIT0gbnVsbCkgJiYgbG9jYWxOYW1lLmVxdWFscygiZGVmaW5pdGlvbnMiKSkgJiYKLSAgICAgICAgICAgIChuc1VSSSAhPSBudWxsICYmIG5zVVJJLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCisgICAgICAgIHJldHVybiBmaXhOdWxsKGxvY2FsTmFtZSkuZXF1YWxzKCJkZWZpbml0aW9ucyIpICYmIGZpeE51bGwobnNVUkkpLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNUb3BMZXZlbEJpbmRpbmcoTm9kZSBub2RlKXsKQEAgLTI0NCw5ICsyMDUsMTMgQEAKICAgICAgICAgcmV0dXJuIChiaW5kaW5ncy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhXU19CSU5ESU5HUykgJiYgYmluZGluZ3MuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJiaW5kaW5ncyIpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNKQVhCQmluZGluZ3MoTm9kZSBiaW5kaW5ncyl7CisgICAgICAgIHJldHVybiAoYmluZGluZ3MuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKEpBWFdTQmluZGluZ3NDb25zdGFudHMuTlNfSkFYQl9CSU5ESU5HUykgJiYgYmluZGluZ3MuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJiaW5kaW5ncyIpKTsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gaXNHbG9iYWxCaW5kaW5nKE5vZGUgYmluZGluZ3MpewotICAgICAgICBpZigoYmluZGluZ3MuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkpewotICAgICAgICAgICAgd2FybigiaW52YWxpZC5jdXN0b21pemF0aW9uLm5hbWVzcGFjZSIsIG5ldyBPYmplY3RbXXtiaW5kaW5ncy5nZXRMb2NhbE5hbWUoKX0pOworICAgICAgICBpZihiaW5kaW5ncy5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsKXsKKyAgICAgICAgICAgIGVycm9yUmVjZWl2ZXIud2FybmluZyhmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oKEVsZW1lbnQpIGJpbmRpbmdzKSwgV3NkbE1lc3NhZ2VzLklOVkFMSURfQ1VTVE9NSVpBVElPTl9OQU1FU1BBQ0UoYmluZGluZ3MuZ2V0TG9jYWxOYW1lKCkpKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gIChiaW5kaW5ncy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhXU19CSU5ESU5HUykgJiYKQEAgLTI1Nyw0NyArMjIyLDQ2IEBACiAgICAgICAgICAgICAgICAgYmluZGluZ3MuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJlbmFibGVNSU1FQ29udGVudCIpKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgRWxlbWVudFtdIGdldENoaWxkRWxlbWVudHMoRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuc1VyaSkgewotICAgICAgICBBcnJheUxpc3QgYSA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBFbGVtZW50W10gZ2V0Q2hpbGRFbGVtZW50cyhFbGVtZW50IHBhcmVudCkgeworICAgICAgICBBcnJheUxpc3Q8RWxlbWVudD4gYSA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKICAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwogICAgICAgICBmb3IoIGludCBpPTA7IGk8Y2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKyApIHsKICAgICAgICAgICAgIE5vZGUgaXRlbSA9IGNoaWxkcmVuLml0ZW0oaSk7CiAgICAgICAgICAgICBpZighKGl0ZW0gaW5zdGFuY2VvZiBFbGVtZW50ICkpICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgaWYobnNVcmkuZXF1YWxzKGl0ZW0uZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgICAgICAgIGEuYWRkKGl0ZW0pOworICAgICAgICAgICAgaWYoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhXU19CSU5ESU5HUy5lcXVhbHMoaXRlbS5nZXROYW1lc3BhY2VVUkkoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhCX0JJTkRJTkdTLmVxdWFscyhpdGVtLmdldE5hbWVzcGFjZVVSSSgpKSkKKyAgICAgICAgICAgICAgICBhLmFkZCgoRWxlbWVudClpdGVtKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKEVsZW1lbnRbXSkgYS50b0FycmF5KG5ldyBFbGVtZW50W2Euc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBhLnRvQXJyYXkobmV3IEVsZW1lbnRbYS5zaXplKCldKTsKICAgICB9CiAKLSAgICBwcml2YXRlIE5vZGUgZXZhbHVhdGVYUGF0aE5vZGUoTm9kZSB0YXJnZXQsIFN0cmluZyBleHByZXNzaW9uLCBOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQpIHsKKyAgICBwcml2YXRlIE5vZGUgZXZhbHVhdGVYUGF0aE5vZGUoTm9kZSBiaW5kaW5ncywgTm9kZSB0YXJnZXQsIFN0cmluZyBleHByZXNzaW9uLCBOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQpIHsKICAgICAgICAgTm9kZUxpc3QgbmxzdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHhwYXRoLnNldE5hbWVzcGFjZUNvbnRleHQobmFtZXNwYWNlQ29udGV4dCk7CiAgICAgICAgICAgICBubHN0ID0gKE5vZGVMaXN0KXhwYXRoLmV2YWx1YXRlKGV4cHJlc3Npb24sIHRhcmdldCwgWFBhdGhDb25zdGFudHMuTk9ERVNFVCk7CiAgICAgICAgIH0gY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlcnJvcigiaW50ZXJuYWxpemVyLlhQYXRoRXZhbHVhdGlvbkVycm9yIiwgbmV3IE9iamVjdFtde2UuZ2V0TWVzc2FnZSgpfSk7Ci0gICAgICAgICAgICBpZihlbnYudmVyYm9zZSgpKQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXBvcnRFcnJvcigoRWxlbWVudCkgYmluZGluZ3MsIFdzZGxNZXNzYWdlcy5JTlRFUk5BTElaRVJfWF9QQVRIX0VWQUxVQVRJT05fRVJST1IoZS5nZXRNZXNzYWdlKCkpLCBlKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBhYm9ydCBwcm9jZXNzaW5nIHRoaXMgPGpheGI6YmluZGluZ3M+CiAgICAgICAgIH0KIAogICAgICAgICBpZiggbmxzdC5nZXRMZW5ndGgoKT09MCApIHsKLSAgICAgICAgICAgIGVycm9yKCJpbnRlcm5hbGl6ZXIuWFBhdGhFdmFsdWF0ZXNUb05vVGFyZ2V0IiwgbmV3IE9iamVjdFtde2V4cHJlc3Npb259KTsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKChFbGVtZW50KSBiaW5kaW5ncywgV3NkbE1lc3NhZ2VzLklOVEVSTkFMSVpFUl9YX1BBVEhfRVZBTFVBVEVTX1RPX05PX1RBUkdFVChleHByZXNzaW9uKSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gYWJvcnQKICAgICAgICAgfQogCiAgICAgICAgIGlmKCBubHN0LmdldExlbmd0aCgpIT0xICkgewotICAgICAgICAgICAgZXJyb3IoImludGVybmFsaXplci5YUGF0aEV2YXVsYXRlc1RvVG9vTWFueVRhcmdldHMiLCBuZXcgT2JqZWN0W117ZXhwcmVzc2lvbiwgbmxzdC5nZXRMZW5ndGgoKX0pOworICAgICAgICAgICAgcmVwb3J0RXJyb3IoKEVsZW1lbnQpIGJpbmRpbmdzLCBXc2RsTWVzc2FnZXMuSU5URVJOQUxJWkVSX1hfUEFUSF9FVkFVTEFURVNfVE9fVE9PX01BTllfVEFSR0VUUyhleHByZXNzaW9uLCBubHN0LmdldExlbmd0aCgpKSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gYWJvcnQKICAgICAgICAgfQogCiAgICAgICAgIE5vZGUgcm5vZGUgPSBubHN0Lml0ZW0oMCk7CiAgICAgICAgIGlmKCEocm5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICkpIHsKLSAgICAgICAgICAgIGVycm9yKCJpbnRlcm5hbGl6ZXIuWFBhdGhFdmFsdWF0ZXNUb05vbkVsZW1lbnQiLCBuZXcgT2JqZWN0W117ZXhwcmVzc2lvbn0pOworICAgICAgICAgICAgcmVwb3J0RXJyb3IoKEVsZW1lbnQpIGJpbmRpbmdzLCBXc2RsTWVzc2FnZXMuSU5URVJOQUxJWkVSX1hfUEFUSF9FVkFMVUFURVNfVE9fTk9OX0VMRU1FTlQoZXhwcmVzc2lvbikpOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGFib3J0CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChFbGVtZW50KXJub2RlOworICAgICAgICByZXR1cm4gcm5vZGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzAsMTUgKzI5NCwxMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc0pBWEJCaW5kaW5nRWxlbWVudChFbGVtZW50IGUpewotICAgICAgICBpZigoZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsICkgJiYgZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhCX0JJTkRJTkdTKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBmaXhOdWxsKGUuZ2V0TmFtZXNwYWNlVVJJKCkpLmVxdWFscyhKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLk5TX0pBWEJfQklORElOR1MpOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc0pBWFdTQmluZGluZ0VsZW1lbnQoRWxlbWVudCBlKXsKLSAgICAgICAgaWYoKGUuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCApICYmIGUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKEpBWFdTQmluZGluZ3NDb25zdGFudHMuTlNfSkFYV1NfQklORElOR1MpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZpeE51bGwoZS5nZXROYW1lc3BhY2VVUkkoKSkuZXF1YWxzKEpBWFdTQmluZGluZ3NDb25zdGFudHMuTlNfSkFYV1NfQklORElOR1MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzY2LDYgKzMyNiwxOSBAQAogICAgICAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGVOUyhKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLk5TX0pBWEJfQklORElOR1MsICJqYXhiOnZlcnNpb24iLCBKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLkpBWEJfQklORElOR19WRVJTSU9OKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gSEFDSzogYWxsb3cgWEpDIGV4dGVuc2lvbiBhbGwgdGhlIHRpbWUuIFRoaXMgYWxsb3dzIHBlb3BsZSB0byBzcGVjaWZ5CisgICAgICAgICAgICAvLyB0aGUgPHhqYzpzb21lRXh0ZW5zaW9uPiBpbiB0aGUgZXh0ZXJuYWwgYmluZGluZ3MuIE90aGVyd2lzZSB1c2VycyBsYWNrIHRoZSBhYmlsaXR5CisgICAgICAgICAgICAvLyB0byBzcGVjaWZ5IGpheGI6ZXh0ZW5zaW9uQmluZGluZ1ByZWZpeGVzLCBzbyBpdCB3b24ndCB3b3JrLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHdvcmthcm91bmQgaXMgc3RpbGwgcHJvYmxlbWF0aWMgaW4gdGhlIHNlbnNlIHRoYXQKKyAgICAgICAgICAgIC8vIGl0IGNhbid0IHN1cHBvcnQgdXNlci1kZWZpbmVkIGV4dGVuc2lvbnMuIFRoaXMgbmVlZHMgbW9yZSBjYXJlZnVsIHRob3VnaHQuCisKKyAgICAgICAgICAgIC8vSkFYQiBkb2Vzbid0IGFsbG93IHdyaXRpbmcgamF4YjpleHRlbnNpb25iaW5kaW5nUHJlZml4IGFueXdoZXJlIG90aGVyIHRoYW4gcm9vdCBlbGVtZW50IHNvIGxldHMgd3JpdGUgb25seSBvbiA8eHM6c2NoZW1hPgorICAgICAgICAgICAgaWYodGFyZ2V0LmdldExvY2FsTmFtZSgpLmVxdWFscygic2NoZW1hIikgJiYgdGFyZ2V0LmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuTlNfWFNEKSYmICF0YXJnZXQuaGFzQXR0cmlidXRlTlMoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhCX0JJTkRJTkdTLCAiZXh0ZW5zaW9uQmluZGluZ1ByZWZpeGVzIikpeworICAgICAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGVOUyhKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLk5TX0pBWEJfQklORElOR1MsICJqYXhiOmV4dGVuc2lvbkJpbmRpbmdQcmVmaXhlcyIsICJ4amMiKTsKKyAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5TX1hNTE5TLCAieG1sbnM6eGpjIiwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19YSkNfQklORElOR1MpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvL2luc2VydCB4czphbm5vdGF0aW9uL3hzOmFwcGluZm8gd2hlcmUgaW4gamF4YjpiaW5kaW5nIHdpbGwgYmUgcHV0CiAgICAgICAgICAgICB0YXJnZXQgPSByZWZpbmVTY2hlbWFUYXJnZXQodGFyZ2V0KTsKICAgICAgICAgICAgIGNvcHlJbnNjb3BlTlNBdHRyaWJ1dGVzKGRlY2wpOwpAQCAtMzg1LDcgKzM1OCw2IEBACiAgICAgICAgIC8vIGZpbmFsbHkgbW92ZSB0aGUgZGVjbGFyYXRpb24gdG8gdGhlIHRhcmdldCBub2RlLgogICAgICAgICBpZiggdGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKSE9ZGVjbC5nZXRPd25lckRvY3VtZW50KCkgKSB7CiAgICAgICAgICAgICAvLyBpZiB0aGV5IGJlbG9uZyB0byBkaWZmZXJlbnQgRE9NIGRvY3VtZW50cywgd2UgbmVlZCB0byBjbG9uZSB0aGVtCi0gICAgICAgICAgICBFbGVtZW50IG9yaWdpbmFsID0gZGVjbDsKICAgICAgICAgICAgIGRlY2wgPSAoRWxlbWVudCl0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpLmltcG9ydE5vZGUoZGVjbCx0cnVlKTsKIAogICAgICAgICB9CkBAIC00MDAsNyArMzcyLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY29weUluc2NvcGVOU0F0dHJpYnV0ZXMoRWxlbWVudCBlKXsKICAgICAgICAgRWxlbWVudCBwID0gZTsKLSAgICAgICAgU2V0IGluc2NvcGVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU2V0PFN0cmluZz4gaW5zY29wZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAgICAgICAgIHdoaWxlKHRydWUpIHsKICAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gcC5nZXRBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8YXR0cy5nZXRMZW5ndGgoKTsgaSsrICkgewpAQCAtNTAyLDM3ICs0NzQsMjUgQEAKICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFN5c3RlbUlkKERvY3VtZW50IGRvYyl7Ci0gICAgICAgIGZvcihNYXAuRW50cnk8U3RyaW5nLCBEb2N1bWVudD4gZTpqYXh3c0JpbmRpbmdzLmVudHJ5U2V0KCkpewotICAgICAgICAgICAgaWYgKGUuZ2V0VmFsdWUoKSA9PSBkb2MpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FybihMb2NhbGl6YWJsZSBtc2cpIHsKLSAgICAgICAgZW52Lndhcm4obXNnKTsKKyAgICBwcml2YXRlIHN0YXRpYyBATm90TnVsbCBTdHJpbmcgZml4TnVsbChATnVsbGFibGUgU3RyaW5nIHMpIHsKKyAgICAgICAgaWYocz09bnVsbCkgcmV0dXJuICIiOworICAgICAgICBlbHNlICAgICAgICByZXR1cm4gczsKICAgICB9CiAKIAotICAgIHByb3RlY3RlZCB2b2lkIGVycm9yKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgZW52LmVycm9yKG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5LCBhcmdzKSk7CisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydEVycm9yKCBFbGVtZW50IGVycm9yU291cmNlLCBTdHJpbmcgZm9ybWF0dGVkTXNnICkgeworICAgICAgICByZXBvcnRFcnJvciggZXJyb3JTb3VyY2UsIGZvcm1hdHRlZE1zZywgbnVsbCApOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHdhcm4oU3RyaW5nIGtleSkgewotICAgICAgICBlbnYud2FybihtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSkpOworICAgIHByaXZhdGUgdm9pZCByZXBvcnRFcnJvciggRWxlbWVudCBlcnJvclNvdXJjZSwKKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZE1zZywgRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbiApIHsKKworICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBlID0gbmV3IFNBWFBhcnNlRXhjZXB0aW9uMiggZm9ybWF0dGVkTXNnLAorICAgICAgICAgICAgZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGVycm9yU291cmNlKSwKKyAgICAgICAgICAgIG5lc3RlZEV4Y2VwdGlvbiApOworICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKGUpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHdhcm4oU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotICAgICAgICBlbnYud2FybihtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSwgYXJncykpOwotICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGluZm8oU3RyaW5nIGtleSkgewotICAgICAgICBlbnYuaW5mbyhtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluZm8oU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgewotICAgICAgICBlbnYuaW5mbyhtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKGtleSwgYXJnKSk7Ci0gICAgfQogCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0pBWFdTQmluZGluZ0V4dGVuc2lvbkhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvSkFYV1NCaW5kaW5nRXh0ZW5zaW9uSGFuZGxlci5qYXZhCmluZGV4IDc3NWEyZTguLjU4YzYwNWI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0pBWFdTQmluZGluZ0V4dGVuc2lvbkhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0pBWFdTQmluZGluZ0V4dGVuc2lvbkhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwzMSArMjQsMjcgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETFBhcnNlckNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5qYXh3cy5DdXN0b21OYW1lOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5qYXh3cy5KQVhXU0JpbmRpbmc7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LmpheHdzLkpBWFdTQmluZGluZ3NDb25zdGFudHM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LmpheHdzLlBhcmFtZXRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc2NoZW1hLlNjaGVtYUtpbmRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlBhcnNlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5Xcml0ZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogCiAvKioKQEAgLTU3LDE5ICs1MywxNyBAQAogICogamF4d3M6YmluZGluZ3MgZXhlbnNpb24gaGFuZGxlci4KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBKQVhXU0JpbmRpbmdFeHRlbnNpb25IYW5kbGVyIGV4dGVuZHMgRXh0ZW5zaW9uSGFuZGxlckJhc2UgeworcHVibGljIGNsYXNzIEpBWFdTQmluZGluZ0V4dGVuc2lvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXIgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgIHByaXZhdGUgZmluYWwgWFBhdGggeHBhdGggPSB4cGYubmV3WFBhdGgoKTsKIAotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIEpBWFdTQmluZGluZ0V4dGVuc2lvbkhhbmRsZXIoKSB7CisgICAgcHVibGljIEpBWFdTQmluZGluZ0V4dGVuc2lvbkhhbmRsZXIoTWFwPFN0cmluZywgQWJzdHJhY3RFeHRlbnNpb25IYW5kbGVyPiBleHRlbnNpb25IYW5kbGVyTWFwKSB7CisgICAgICAgIHN1cGVyKGV4dGVuc2lvbkhhbmRsZXJNYXApOwogICAgIH0KIAogICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIEV4dGVuc2lvbkhhbmRsZXIjZ2V0TmFtZXNwYWNlVVJJKCkKKyAgICAgKiBAc2VlIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlciNnZXROYW1lc3BhY2VVUkkoKQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewogICAgICAgICByZXR1cm4gSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhXU19CSU5ESU5HUzsKQEAgLTgwLDEzICs3NCwxMyBAQAogICAgICAqIEBwYXJhbSBwYXJlbnQKICAgICAgKiBAcGFyYW0gZQogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUdsb2JhbEpBWFdTQmluZGluZ3MoUGFyc2VyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlR2xvYmFsSkFYV1NCaW5kaW5ncyhUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CiAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKIAogICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nID0gIGdldEpBWFdTRXh0ZW5zaW9uKHBhcmVudCk7CiAgICAgICAgIGlmKGpheHdzQmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgamF4d3NCaW5kaW5nID0gbmV3IEpBWFdTQmluZGluZygpOworICAgICAgICAgICAgamF4d3NCaW5kaW5nID0gbmV3IEpBWFdTQmluZGluZyhjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKICAgICAgICAgU3RyaW5nIGF0dHIgPSBYbWxVdGlsLmdldEF0dHJpYnV0ZU9yTnVsbChlLCBKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLldTRExfTE9DQVRJT05fQVRUUik7CiAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKICAgICAgICAgICAgIGpheHdzQmluZGluZy5zZXRXc2RsTG9jYXRpb24oYXR0cik7CkBAIC0xMzIsMTUgKzEyNiwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24oamF4d3NCaW5kaW5nKTsKICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoCi0gICAgICAgICAgICAgICAgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUywKLSAgICAgICAgICAgICAgICBqYXh3c0JpbmRpbmcpOworLy8gICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAorLy8gICAgICAgICAgICAgICAgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUywKKy8vICAgICAgICAgICAgICAgIGpheHdzQmluZGluZyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIEpBWFdTQmluZGluZyBnZXRKQVhXU0V4dGVuc2lvbihFeHRlbnNpYmxlIGV4dGVuc2libGUpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZXh0ZW5zaWJsZS5leHRlbnNpb25zKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChFeHRlbnNpb24paXRlci5uZXh0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgSkFYV1NCaW5kaW5nIGdldEpBWFdTRXh0ZW5zaW9uKFRXU0RMRXh0ZW5zaWJsZSBleHRlbnNpYmxlKSB7CisgICAgICAgIGZvciAoVFdTRExFeHRlbnNpb24gZXh0ZW5zaW9uOmV4dGVuc2libGUuZXh0ZW5zaW9ucygpKSB7CiAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldENsYXNzKCkuZXF1YWxzKEpBWFdTQmluZGluZy5jbGFzcykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gKEpBWFdTQmluZGluZylleHRlbnNpb247CiAgICAgICAgICAgICB9CkBAIC0xNTQsNyArMTQ3LDcgQEAKICAgICAgKiBAcGFyYW0gcGFyZW50CiAgICAgICogQHBhcmFtIGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VQcm92aWRlcihQYXJzZXJDb250ZXh0IGNvbnRleHQsIEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQcm92aWRlcihjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBKQVhXU0JpbmRpbmcgcGFyZW50LCBFbGVtZW50IGUpIHsKICAgICAgICAgU3RyaW5nIHZhbCA9IGUuZ2V0VGV4dENvbnRlbnQoKTsKICAgICAgICAgaWYodmFsID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNzIsNyArMTY1LDcgQEAKICAgICAgKiBAcGFyYW0gcGFyZW50CiAgICAgICogQHBhcmFtIGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VKQVhCQmluZGluZ3MoUGFyc2VyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlSkFYQkJpbmRpbmdzKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgewogICAgICAgICBKQVhXU0JpbmRpbmcgYmluZGluZyA9IChKQVhXU0JpbmRpbmcpcGFyZW50OwogICAgICAgICBiaW5kaW5nLmFkZEpheGJCaW5kaW5ncyhlKTsKICAgICB9CkBAIC0xODIsNyArMTc1LDcgQEAKICAgICAgKiBAcGFyYW0gcGFyZW50CiAgICAgICogQHBhcmFtIGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VQYWNrYWdlKFBhcnNlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgIHByaXZhdGUgdm9pZCBwYXJzZVBhY2thZ2UoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgSkFYV1NCaW5kaW5nIHBhcmVudCwgRWxlbWVudCBlKSB7CiAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJJbiBoYW5kbGVQYWNrYWdlRXh0ZW5zaW9uOiAiICsgZS5nZXROb2RlTmFtZSgpKTsKICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gWG1sVXRpbC5nZXRBdHRyaWJ1dGVPck51bGwoZSwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OQU1FX0FUVFIpOwogICAgICAgICBKQVhXU0JpbmRpbmcgYmluZGluZyA9IChKQVhXU0JpbmRpbmcpcGFyZW50OwpAQCAtMTk0LDcgKzE4Nyw3IEBACiAgICAgICogQHBhcmFtIHBhcmVudAogICAgICAqIEBwYXJhbSBlCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlV3JhcHBlclN0eWxlKFBhcnNlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgIHByaXZhdGUgdm9pZCBwYXJzZVdyYXBwZXJTdHlsZShjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBKQVhXU0JpbmRpbmcgcGFyZW50LCBFbGVtZW50IGUpIHsKICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkluIGhhbmRsZVdyYXBwZXJTdHlsZUV4dGVuc2lvbjogIiArIGUuZ2V0Tm9kZU5hbWUoKSk7CiAgICAgICAgIFN0cmluZyB2YWwgPSBlLmdldFRleHRDb250ZW50KCk7CiAgICAgICAgIGlmKHZhbCA9PSBudWxsKQpAQCAtMjExLDcgKzIwNCw3IEBACiAgICAgICogQHBhcmFtIHBhcmVudAogICAgICAqIEBwYXJhbSBlCiAgICAgICovCi0vLyAgICBwcml2YXRlIHZvaWQgcGFyc2VBZGRpdGlvbmFsU09BUEhlYWRlck1hcHBpbmcoUGFyc2VyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisvLyAgICBwcml2YXRlIHZvaWQgcGFyc2VBZGRpdGlvbmFsU09BUEhlYWRlck1hcHBpbmcoVFdTRExQYXJzZXJDb250ZXh0SW1wbCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKIC8vICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiSW4gaGFuZGxlQWRkaXRpb25hbFNPQVBIZWFkZXJFeHRlbnNpb246ICIgKyBlLmdldE5vZGVOYW1lKCkpOwogLy8gICAgICAgIFN0cmluZyB2YWwgPSBlLmdldFRleHRDb250ZW50KCk7CiAvLyAgICAgICAgaWYodmFsID09IG51bGwpCkBAIC0yMjgsNyArMjIxLDcgQEAKICAgICAgKiBAcGFyYW0gcGFyZW50CiAgICAgICogQHBhcmFtIGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VBc3luTWFwcGluZyhQYXJzZXJDb250ZXh0IGNvbnRleHQsIEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VBc3luTWFwcGluZyhjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBKQVhXU0JpbmRpbmcgcGFyZW50LCBFbGVtZW50IGUpIHsKICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkluIGhhbmRsZUFzeW5NYXBwaW5nRXh0ZW5zaW9uOiAiICsgZS5nZXROb2RlTmFtZSgpKTsKICAgICAgICAgU3RyaW5nIHZhbCA9IGUuZ2V0VGV4dENvbnRlbnQoKTsKICAgICAgICAgaWYodmFsID09IG51bGwpCkBAIC0yNDUsNyArMjM4LDcgQEAKICAgICAgKiBAcGFyYW0gcGFyZW50CiAgICAgICogQHBhcmFtIGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VNaW1lQ29udGVudChQYXJzZXJDb250ZXh0IGNvbnRleHQsIEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VNaW1lQ29udGVudChjb20uc3VuLnRvb2xzLmludGVybmFsLndzLmFwaS53c2RsLlRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBKQVhXU0JpbmRpbmcgcGFyZW50LCBFbGVtZW50IGUpIHsKICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkluIGhhbmRsZU1pbWVDb250ZW50RXh0ZW5zaW9uOiAiICsgZS5nZXROb2RlTmFtZSgpKTsKICAgICAgICAgU3RyaW5nIHZhbCA9IGUuZ2V0VGV4dENvbnRlbnQoKTsKICAgICAgICAgaWYodmFsID09IG51bGwpCkBAIC0yNjIsNyArMjU1LDcgQEAKICAgICAgKiBAcGFyYW0gamF4d3NCaW5kaW5nCiAgICAgICogQHBhcmFtIGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VNZXRob2QoUGFyc2VyQ29udGV4dCBjb250ZXh0LCBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nLCBFbGVtZW50IGUpIHsKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VNZXRob2QoY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgSkFYV1NCaW5kaW5nIGpheHdzQmluZGluZywgRWxlbWVudCBlKSB7CiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gWG1sVXRpbC5nZXRBdHRyaWJ1dGVPck51bGwoZSwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OQU1FX0FUVFIpOwogICAgICAgICBTdHJpbmcgamF2YURvYyA9IGdldEphdmFEb2MoZSk7CiAgICAgICAgIEN1c3RvbU5hbWUgbmFtZSA9IG5ldyBDdXN0b21OYW1lKG1ldGhvZE5hbWUsIGphdmFEb2MpOwpAQCAtMjc0LDcgKzI2Nyw3IEBACiAgICAgICogQHBhcmFtIGpheHdzQmluZGluZwogICAgICAqIEBwYXJhbSBlCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGFyYW1ldGVyKFBhcnNlckNvbnRleHQgY29udGV4dCwgSkFYV1NCaW5kaW5nIGpheHdzQmluZGluZywgRWxlbWVudCBlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGFyYW1ldGVyKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcsIEVsZW1lbnQgZSkgewogICAgICAgICBTdHJpbmcgcGFydCA9IFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUsIEpBWFdTQmluZGluZ3NDb25zdGFudHMuUEFSVF9BVFRSKTsKICAgICAgICAgRWxlbWVudCBtc2dQYXJ0RWxtID0gZXZhbHVhdGVYUGF0aE5vZGUoZS5nZXRPd25lckRvY3VtZW50KCksIHBhcnQsIG5ldyBOYW1lc3BhY2VDb250ZXh0SW1wbChlKSk7CiAgICAgICAgIE5vZGUgbXNnRWxtID0gbXNnUGFydEVsbS5nZXRQYXJlbnROb2RlKCk7CkBAIC0zMzIsNyArMzI1LDcgQEAKICAgICAgKiBAcGFyYW0gamF4d3NCaW5kaW5nCiAgICAgICogQHBhcmFtIGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VDbGFzcyhQYXJzZXJDb250ZXh0IGNvbnRleHQsIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcsIEVsZW1lbnQgZSkgeworICAgIHByaXZhdGUgdm9pZCBwYXJzZUNsYXNzKGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcsIEVsZW1lbnQgZSkgewogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gWG1sVXRpbC5nZXRBdHRyaWJ1dGVPck51bGwoZSwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OQU1FX0FUVFIpOwogICAgICAgICBTdHJpbmcgamF2YURvYyA9IGdldEphdmFEb2MoZSk7CiAgICAgICAgIGpheHdzQmluZGluZy5zZXRDbGFzc05hbWUobmV3IEN1c3RvbU5hbWUoY2xhc3NOYW1lLCBqYXZhRG9jKSk7CkBAIC0zNDQsNyArMzM3LDcgQEAKICAgICAgKiBAcGFyYW0gamF4d3NCaW5kaW5nCiAgICAgICogQHBhcmFtIGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VFeGNlcHRpb24oUGFyc2VyQ29udGV4dCBjb250ZXh0LCBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nLCBFbGVtZW50IGUpIHsKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFeGNlcHRpb24oY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgSkFYV1NCaW5kaW5nIGpheHdzQmluZGluZywgRWxlbWVudCBlKSB7CiAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gWG1sVXRpbC5nZXRBbGxDaGlsZHJlbihlKTsgaXRlci5oYXNOZXh0KCk7KXsKICAgICAgICAgICAgIEVsZW1lbnQgZTIgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIpOwogICAgICAgICAgICAgaWYgKGUyID09IG51bGwpCkBAIC0zNTcsMjkgKzM1MCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgRXh0ZW5zaW9uSGFuZGxlckJhc2UjaGFuZGxlRGVmaW5pdGlvbnNFeHRlbnNpb24oUGFyc2VyQ29udGV4dCwgRXh0ZW5zaWJsZSwgb3JnLnczYy5kb20uRWxlbWVudCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEZWZpbml0aW9uc0V4dGVuc2lvbihQYXJzZXJDb250ZXh0IGNvbnRleHQsIEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVEZWZpbml0aW9uc0V4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CiAgICAgICAgIHJldHVybiBwYXJzZUdsb2JhbEpBWFdTQmluZGluZ3MoY29udGV4dCwgcGFyZW50LCBlKTsKICAgICB9CiAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpb25IYW5kbGVyQmFzZSNoYW5kbGVUeXBlc0V4dGVuc2lvbihQYXJzZXJDb250ZXh0LCBFeHRlbnNpYmxlLCBvcmcudzNjLmRvbS5FbGVtZW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVR5cGVzRXh0ZW5zaW9uKFBhcnNlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpb25IYW5kbGVyQmFzZSNoYW5kbGVQb3J0VHlwZUV4dGVuc2lvbihQYXJzZXJDb250ZXh0LCBFeHRlbnNpYmxlLCBvcmcudzNjLmRvbS5FbGVtZW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVBvcnRUeXBlRXh0ZW5zaW9uKFBhcnNlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVBvcnRUeXBlRXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKICAgICAgICAgaWYoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUykpewogICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKLSAgICAgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSBuZXcgSkFYV1NCaW5kaW5nKCk7CisgICAgICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nID0gbmV3IEpBWFdTQmluZGluZyhjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ZXIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUpOyBpdGVyLmhhc05leHQoKTspewogICAgICAgICAgICAgICAgIEVsZW1lbnQgZTIgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIpOwpAQCAtNDA1LDkgKzM4NCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXJlbnQuYWRkRXh0ZW5zaW9uKGpheHdzQmluZGluZyk7CiAgICAgICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MsCi0gICAgICAgICAgICAgICAgICAgIGpheHdzQmluZGluZyk7CisvLyAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAorLy8gICAgICAgICAgICAgICAgICAgIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MsCisvLyAgICAgICAgICAgICAgICAgICAgamF4d3NCaW5kaW5nKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICBVdGlsLmZhaWwoCkBAIC00MTgsMTIgKzM5Nyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgRXh0ZW5zaW9uSGFuZGxlckJhc2UjaGFuZGxlT3BlcmF0aW9uRXh0ZW5zaW9uKFBhcnNlckNvbnRleHQsIEV4dGVuc2libGUsIG9yZy53M2MuZG9tLkVsZW1lbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlT3BlcmF0aW9uRXh0ZW5zaW9uKFBhcnNlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU9wZXJhdGlvbkV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CiAgICAgICAgIGlmKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MpKXsKICAgICAgICAgICAgIGlmKHBhcmVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbil7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBvcnRUeXBlT3BlcmF0aW9uKGNvbnRleHQsIChPcGVyYXRpb24pcGFyZW50LCBlKTsKQEAgLTQ0MCwxNyArNDE0LDExIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQmluZGluZ09wZXJhdGlvbihQYXJzZXJDb250ZXh0IGNvbnRleHQsIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uLCBFbGVtZW50IGUpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQmluZGluZ09wZXJhdGlvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24sIEVsZW1lbnQgZSkgewogICAgICAgICBpZihYbWxVdGlsLm1hdGNoZXNUYWdOUyhlLCBKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLkpBWFdTX0JJTkRJTkdTKSl7CiAgICAgICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOwotICAgICAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQmluZGluZyA9IG5ldyBKQVhXU0JpbmRpbmcoKTsKKyAgICAgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSBuZXcgSkFYV1NCaW5kaW5nKGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOwogCiAgICAgICAgICAgICBmb3IoSXRlcmF0b3IgaXRlciA9IFhtbFV0aWwuZ2V0QWxsQ2hpbGRyZW4oZSk7IGl0ZXIuaGFzTmV4dCgpOyl7CiAgICAgICAgICAgICAgICAgRWxlbWVudCBlMiA9IFV0aWwubmV4dEVsZW1lbnQoaXRlcik7CkBAIC00NzQsOSArNDQyLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRFeHRlbnNpb24oamF4d3NCaW5kaW5nKTsKICAgICAgICAgICAgIGNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUywKLSAgICAgICAgICAgICAgICAgICAgamF4d3NCaW5kaW5nKTsKKy8vICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoCisvLyAgICAgICAgICAgICAgICAgICAgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUywKKy8vICAgICAgICAgICAgICAgICAgICBqYXh3c0JpbmRpbmcpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgIFV0aWwuZmFpbCgKQEAgLTQ4NywxNiArNDU1LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcGFyYW0gZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUG9ydFR5cGVPcGVyYXRpb24oUGFyc2VyQ29udGV4dCBjb250ZXh0LCBPcGVyYXRpb24gcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUG9ydFR5cGVPcGVyYXRpb24oVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIE9wZXJhdGlvbiBwYXJlbnQsIEVsZW1lbnQgZSkgewogICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7Ci0gICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSBuZXcgSkFYV1NCaW5kaW5nKCk7CisgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSBuZXcgSkFYV1NCaW5kaW5nKGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOwogCiAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gWG1sVXRpbC5nZXRBbGxDaGlsZHJlbihlKTsgaXRlci5oYXNOZXh0KCk7KXsKICAgICAgICAgICAgIEVsZW1lbnQgZTIgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIpOwpAQCAtNTI0LDIwICs0ODYsMTcgQEAKICAgICAgICAgfQogICAgICAgICBwYXJlbnQuYWRkRXh0ZW5zaW9uKGpheHdzQmluZGluZyk7CiAgICAgICAgIGNvbnRleHQucG9wKCk7Ci0gICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAotICAgICAgICAgICAgICAgIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MsCi0gICAgICAgICAgICAgICAgamF4d3NCaW5kaW5nKTsKKy8vICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eSgKKy8vICAgICAgICAgICAgICAgIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MsCisvLyAgICAgICAgICAgICAgICBqYXh3c0JpbmRpbmcpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpb25IYW5kbGVyQmFzZSNoYW5kbGVCaW5kaW5nRXh0ZW5zaW9uKFBhcnNlckNvbnRleHQsIEV4dGVuc2libGUsIG9yZy53M2MuZG9tLkVsZW1lbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlQmluZGluZ0V4dGVuc2lvbihQYXJzZXJDb250ZXh0IGNvbnRleHQsIEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVCaW5kaW5nRXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKICAgICAgICAgaWYoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUykpewogICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKLSAgICAgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSBuZXcgSkFYV1NCaW5kaW5nKCk7CisgICAgICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nID0gbmV3IEpBWFdTQmluZGluZyhjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ZXIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUpOyBpdGVyLmhhc05leHQoKTspewogICAgICAgICAgICAgICAgIEVsZW1lbnQgZTIgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIpOwpAQCAtNTU5LDkgKzUxOCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXJlbnQuYWRkRXh0ZW5zaW9uKGpheHdzQmluZGluZyk7CiAgICAgICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MsCi0gICAgICAgICAgICAgICAgICAgIGpheHdzQmluZGluZyk7CisvLyAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAorLy8gICAgICAgICAgICAgICAgICAgIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MsCisvLyAgICAgICAgICAgICAgICAgICAgamF4d3NCaW5kaW5nKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICBVdGlsLmZhaWwoCkBAIC01NzMsMjkgKzUzMiwxMyBAQAogICAgIH0KIAogICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIEV4dGVuc2lvbkhhbmRsZXJCYXNlI2hhbmRsZUlucHV0RXh0ZW5zaW9uKFBhcnNlckNvbnRleHQsIEV4dGVuc2libGUsIG9yZy53M2MuZG9tLkVsZW1lbnQpCisgICAgICogQHNlZSBFeHRlbnNpb25IYW5kbGVyQmFzZSNoYW5kbGVGYXVsdEV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHRJbXBsLCBUV1NETEV4dGVuc2libGUsIG9yZy53M2MuZG9tLkVsZW1lbnQpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlSW5wdXRFeHRlbnNpb24oUGFyc2VyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIEV4dGVuc2lvbkhhbmRsZXJCYXNlI2hhbmRsZU91dHB1dEV4dGVuc2lvbihQYXJzZXJDb250ZXh0LCBFeHRlbnNpYmxlLCBvcmcudzNjLmRvbS5FbGVtZW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZU91dHB1dEV4dGVuc2lvbihQYXJzZXJDb250ZXh0IGNvbnRleHQsIEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgRXh0ZW5zaW9uSGFuZGxlckJhc2UjaGFuZGxlRmF1bHRFeHRlbnNpb24oUGFyc2VyQ29udGV4dCwgRXh0ZW5zaWJsZSwgb3JnLnczYy5kb20uRWxlbWVudCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVGYXVsdEV4dGVuc2lvbihQYXJzZXJDb250ZXh0IGNvbnRleHQsIEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdEV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CiAgICAgICAgIGlmKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MpKXsKICAgICAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7Ci0gICAgICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nID0gbmV3IEpBWFdTQmluZGluZygpOworICAgICAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQmluZGluZyA9IG5ldyBKQVhXU0JpbmRpbmcoY29udGV4dC5nZXRMb2NhdGlvbihlKSk7CiAKICAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gWG1sVXRpbC5nZXRBbGxDaGlsZHJlbihlKTsgaXRlci5oYXNOZXh0KCk7KXsKICAgICAgICAgICAgICAgICBFbGVtZW50IGUyID0gVXRpbC5uZXh0RWxlbWVudChpdGVyKTsKQEAgLTYxNiw5ICs1NTksOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGFyZW50LmFkZEV4dGVuc2lvbihqYXh3c0JpbmRpbmcpOwogICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAotICAgICAgICAgICAgICAgICAgICBKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLkpBWFdTX0JJTkRJTkdTLAotICAgICAgICAgICAgICAgICAgICBqYXh3c0JpbmRpbmcpOworLy8gICAgICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eSgKKy8vICAgICAgICAgICAgICAgICAgICBKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLkpBWFdTX0JJTkRJTkdTLAorLy8gICAgICAgICAgICAgICAgICAgIGpheHdzQmluZGluZyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfWVsc2UgewogICAgICAgICAgICAgVXRpbC5mYWlsKApAQCAtNjI5LDE0ICs1NzIsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIEV4dGVuc2lvbkhhbmRsZXJCYXNlI2hhbmRsZVNlcnZpY2VFeHRlbnNpb24oUGFyc2VyQ29udGV4dCwgRXh0ZW5zaWJsZSwgb3JnLnczYy5kb20uRWxlbWVudCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTZXJ2aWNlRXh0ZW5zaW9uKFBhcnNlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVNlcnZpY2VFeHRlbnNpb24oVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgewogICAgICAgICBpZihYbWxVdGlsLm1hdGNoZXNUYWdOUyhlLCBKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLkpBWFdTX0JJTkRJTkdTKSl7CiAgICAgICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOwotICAgICAgICAgICAgSkFYV1NCaW5kaW5nIGpheHdzQmluZGluZyA9IG5ldyBKQVhXU0JpbmRpbmcoKTsKKyAgICAgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSBuZXcgSkFYV1NCaW5kaW5nKGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOwogCiAgICAgICAgICAgICBmb3IoSXRlcmF0b3IgaXRlciA9IFhtbFV0aWwuZ2V0QWxsQ2hpbGRyZW4oZSk7IGl0ZXIuaGFzTmV4dCgpOyl7CiAgICAgICAgICAgICAgICAgRWxlbWVudCBlMiA9IFV0aWwubmV4dEVsZW1lbnQoaXRlcik7CkBAIC02NTcsOSArNTk3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24oamF4d3NCaW5kaW5nKTsKICAgICAgICAgICAgIGNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUywKLSAgICAgICAgICAgICAgICAgICAgamF4d3NCaW5kaW5nKTsKKy8vICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoCisvLyAgICAgICAgICAgICAgICAgICAgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUywKKy8vICAgICAgICAgICAgICAgICAgICBqYXh3c0JpbmRpbmcpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgIFV0aWwuZmFpbCgKQEAgLTY3MCwxNCArNjEwLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpb25IYW5kbGVyQmFzZSNoYW5kbGVQb3J0RXh0ZW5zaW9uKFBhcnNlckNvbnRleHQsIEV4dGVuc2libGUsIG9yZy53M2MuZG9tLkVsZW1lbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlUG9ydEV4dGVuc2lvbihQYXJzZXJDb250ZXh0IGNvbnRleHQsIEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVQb3J0RXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKICAgICAgICAgaWYoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5KQVhXU19CSU5ESU5HUykpewogICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKLSAgICAgICAgICAgIEpBWFdTQmluZGluZyBqYXh3c0JpbmRpbmcgPSBuZXcgSkFYV1NCaW5kaW5nKCk7CisgICAgICAgICAgICBKQVhXU0JpbmRpbmcgamF4d3NCaW5kaW5nID0gbmV3IEpBWFdTQmluZGluZyhjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ZXIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUpOyBpdGVyLmhhc05leHQoKTspewogICAgICAgICAgICAgICAgIEVsZW1lbnQgZTIgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIpOwpAQCAtNzAxLDkgKzYzOCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXJlbnQuYWRkRXh0ZW5zaW9uKGpheHdzQmluZGluZyk7CiAgICAgICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MsCi0gICAgICAgICAgICAgICAgICAgIGpheHdzQmluZGluZyk7CisvLyAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAorLy8gICAgICAgICAgICAgICAgICAgIEpBWFdTQmluZGluZ3NDb25zdGFudHMuSkFYV1NfQklORElOR1MsCisvLyAgICAgICAgICAgICAgICAgICAgamF4d3NCaW5kaW5nKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICBVdGlsLmZhaWwoCkBAIC03MTQsMTQgKzY1MSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBFeHRlbnNpb25IYW5kbGVyQmFzZSNoYW5kbGVNSU1FUGFydEV4dGVuc2lvbihQYXJzZXJDb250ZXh0LCBFeHRlbnNpYmxlLCBvcmcudzNjLmRvbS5FbGVtZW50KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZU1JTUVQYXJ0RXh0ZW5zaW9uKFBhcnNlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICBwcml2YXRlIFN0cmluZyBnZXRKYXZhRG9jKEVsZW1lbnQgZSl7CiAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gWG1sVXRpbC5nZXRBbGxDaGlsZHJlbihlKTsgaXRlci5oYXNOZXh0KCk7KXsKICAgICAgICAgICAgIEVsZW1lbnQgZTIgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIpOwpAQCAtNzMzLDIzICs2NjIsNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXh0ZW5zaW9uKFdyaXRlckNvbnRleHQgY29udGV4dCwgRXh0ZW5zaW9uIGV4dGVuc2lvbikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkpBWFdTQmluZGluZ0V4dGVuc2lvbkhhbmRsZXIgZG9IYW5kbGVFeHRlbnNpb246ICIrZXh0ZW5zaW9uKTsKLSAgICAgICAgLy8gTk9URSAtIHRoaXMgdWdsaW5lc3MgY2FuIGJlIGF2b2lkZWQgYnkgbW92aW5nIGFsbCB0aGUgWE1MIHBhcnNpbmcvd3JpdGluZyBjb2RlCi0gICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50IGNsYXNzZXMgdGhlbXNlbHZlcwotICAgICAgICBpZiAoZXh0ZW5zaW9uIGluc3RhbmNlb2YgSkFYV1NCaW5kaW5nKSB7Ci0gICAgICAgICAgICBKQVhXU0JpbmRpbmcgYmluZGluZyA9IChKQVhXU0JpbmRpbmcpIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmluZGluZy5nZXRFbGVtZW50TmFtZTogIitiaW5kaW5nLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKGJpbmRpbmcuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5FTkFCTEVfV1JBUFBFUl9TVFlMRSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQ2hhcnMoYmluZGluZy5pc0VuYWJsZVdyYXBwZXJTdHlsZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLkVOQUJMRV9XUkFQUEVSX1NUWUxFKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVFbmRUYWcoYmluZGluZy5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9NSU1FRXh0ZW5zaW9uSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9NSU1FRXh0ZW5zaW9uSGFuZGxlci5qYXZhCmluZGV4IGZiOGVhNzUuLjQzOGU3NDMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTUlNRUV4dGVuc2lvbkhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01JTUVFeHRlbnNpb25IYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNjYgKzI1LDU5IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETENvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQubWltZS4qOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETENvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQubWltZS5NSU1FQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5taW1lLk1JTUVYbWw7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUGFyc2VyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLldyaXRlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKICAqIFRoZSBNSU1FIGV4dGVuc2lvbiBoYW5kbGVyIGZvciBXU0RMLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgTUlNRUV4dGVuc2lvbkhhbmRsZXIgZXh0ZW5kcyBFeHRlbnNpb25IYW5kbGVyIHsKK3B1YmxpYyBjbGFzcyBNSU1FRXh0ZW5zaW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlciB7CiAKLSAgICBwdWJsaWMgTUlNRUV4dGVuc2lvbkhhbmRsZXIoKSB7CisgICAgcHVibGljIE1JTUVFeHRlbnNpb25IYW5kbGVyKE1hcDxTdHJpbmcsIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlcj4gZXh0ZW5zaW9uSGFuZGxlck1hcCkgeworICAgICAgICBzdXBlcihleHRlbnNpb25IYW5kbGVyTWFwKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKICAgICAgICAgcmV0dXJuIENvbnN0YW50cy5OU19XU0RMX01JTUU7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZG9IYW5kbGVFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgICAgIFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBUV1NETEV4dGVuc2libGUgcGFyZW50LAogICAgICAgICBFbGVtZW50IGUpIHsKLSAgICAgICAgaWYgKHBhcmVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX09VVFBVVCkpIHsKKyAgICAgICAgaWYgKHBhcmVudC5nZXRXU0RMRWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9PVVRQVVQpKSB7CiAgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW5wdXRPdXRwdXRFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9JTlBVVCkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0V1NETEVsZW1lbnROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfSU5QVVQpKSB7CiAgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW5wdXRPdXRwdXRFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoTUlNRUNvbnN0YW50cy5RTkFNRV9QQVJUKSkgeworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5nZXRXU0RMRWxlbWVudE5hbWUoKS5lcXVhbHMoTUlNRUNvbnN0YW50cy5RTkFNRV9QQVJUKSkgewogICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU1JTUVQYXJ0RXh0ZW5zaW9uKGNvbnRleHQsIHBhcmVudCwgZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0LmZpcmVJZ25vcmluZ0V4dGVuc2lvbigKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoZS5nZXROYW1lc3BhY2VVUkkoKSwgZS5nZXRMb2NhbE5hbWUoKSksCi0gICAgICAgICAgICAgICAgcGFyZW50LmdldEVsZW1lbnROYW1lKCkpOworLy8gICAgICAgICAgICBjb250ZXh0LmZpcmVJZ25vcmluZ0V4dGVuc2lvbigKKy8vICAgICAgICAgICAgICAgIG5ldyBRTmFtZShlLmdldE5hbWVzcGFjZVVSSSgpLCBlLmdldExvY2FsTmFtZSgpKSwKKy8vICAgICAgICAgICAgICAgIHBhcmVudC5nZXRXU0RMRWxlbWVudE5hbWUoKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVJbnB1dE91dHB1dEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgTUlNRUNvbnN0YW50cy5RTkFNRV9NVUxUSVBBUlRfUkVMQVRFRCkpIHsKICAgICAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7CiAKLSAgICAgICAgICAgIE1JTUVNdWx0aXBhcnRSZWxhdGVkIG1wciA9IG5ldyBNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOworICAgICAgICAgICAgTUlNRU11bHRpcGFydFJlbGF0ZWQgbXByID0gbmV3IE1JTUVNdWx0aXBhcnRSZWxhdGVkKGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOwogCiAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAgICAgICAgICBFbGVtZW50IGUyID0gVXRpbC5uZXh0RWxlbWVudChpdGVyKTsKQEAgLTk1LDcgKzg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUyKTsKIAotICAgICAgICAgICAgICAgICAgICBNSU1FUGFydCBwYXJ0ID0gbmV3IE1JTUVQYXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIE1JTUVQYXJ0IHBhcnQgPSBuZXcgTUlNRVBhcnQoY29udGV4dC5nZXRMb2NhdGlvbihlMikpOwogCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUyLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKQEAgLTEwNCwxNSArOTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcjIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyMi5oYXNOZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZTMgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlMyA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25IYW5kbGVyIGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFeHRlbnNpb25IYW5kbGVyKSBfZXh0ZW5zaW9uSGFuZGxlcnMuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMy5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXIgaCA9IGdldEV4dGVuc2lvbkhhbmRsZXJzKCkuZ2V0KGUzLmdldE5hbWVzcGFjZVVSSSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBoLmRvSGFuZGxlRXh0ZW5zaW9uKGNvbnRleHQsIHBhcnQsIGUzKTsKQEAgLTEzMSwyMCArMTIyLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMy5nZXRUYWdOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMy5nZXROYW1lc3BhY2VVUkkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maXJlSWdub3JpbmdFeHRlbnNpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTMuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTMuZ2V0TG9jYWxOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5nZXRFbGVtZW50TmFtZSgpKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVJZ25vcmluZ0V4dGVuc2lvbigKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTMuZ2V0TmFtZXNwYWNlVVJJKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMy5nZXRMb2NhbE5hbWUoKSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuZ2V0RWxlbWVudE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbXByLmFkZChwYXJ0KTsKICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBNSU1FQ29uc3RhbnRzLlFOQU1FX1BBUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0KTsKKy8vICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eSgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgTUlNRUNvbnN0YW50cy5RTkFNRV9QQVJULAorLy8gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBVdGlsLmZhaWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2luZy5pbnZhbGlkRWxlbWVudCIsCkBAIC0xNTUsOSArMTQ2LDkgQEAKIAogICAgICAgICAgICAgcGFyZW50LmFkZEV4dGVuc2lvbihtcHIpOwogICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAotICAgICAgICAgICAgICAgIE1JTUVDb25zdGFudHMuUU5BTUVfTVVMVElQQVJUX1JFTEFURUQsCi0gICAgICAgICAgICAgICAgbXByKTsKKy8vICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoCisvLyAgICAgICAgICAgICAgICBNSU1FQ29uc3RhbnRzLlFOQU1FX01VTFRJUEFSVF9SRUxBVEVELAorLy8gICAgICAgICAgICAgICAgbXByKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIE1JTUVDb25zdGFudHMuUU5BTUVfQ09OVEVOVCkpIHsKICAgICAgICAgICAgIE1JTUVDb250ZW50IGNvbnRlbnQgPSBwYXJzZU1JTUVDb250ZW50KGNvbnRleHQsIGUpOwpAQCAtMTc2LDkgKzE2NywxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlTUlNRVBhcnRFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgICAgIFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBUV1NETEV4dGVuc2libGUgcGFyZW50LAogICAgICAgICBFbGVtZW50IGUpIHsKICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIE1JTUVDb25zdGFudHMuUU5BTUVfQ09OVEVOVCkpIHsKICAgICAgICAgICAgIE1JTUVDb250ZW50IGNvbnRlbnQgPSBwYXJzZU1JTUVDb250ZW50KGNvbnRleHQsIGUpOwpAQCAtMTk3LDExICsxODksMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBNSU1FQ29udGVudCBwYXJzZU1JTUVDb250ZW50KFBhcnNlckNvbnRleHQgY29udGV4dCwgRWxlbWVudCBlKSB7CisgICAgcHJvdGVjdGVkIE1JTUVDb250ZW50IHBhcnNlTUlNRUNvbnRlbnQoVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIEVsZW1lbnQgZSkgewogICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7CiAKLSAgICAgICAgTUlNRUNvbnRlbnQgY29udGVudCA9IG5ldyBNSU1FQ29udGVudCgpOworICAgICAgICBNSU1FQ29udGVudCBjb250ZW50ID0gbmV3IE1JTUVDb250ZW50KGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOwogCiAgICAgICAgIFN0cmluZyBwYXJ0ID0gWG1sVXRpbC5nZXRBdHRyaWJ1dGVPck51bGwoZSwgQ29uc3RhbnRzLkFUVFJfUEFSVCk7CiAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKQEAgLTIxNCwxNSArMjA2LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eShNSU1FQ29uc3RhbnRzLlFOQU1FX0NPTlRFTlQsIGNvbnRlbnQpOworLy8gICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KE1JTUVDb25zdGFudHMuUU5BTUVfQ09OVEVOVCwgY29udGVudCk7CiAgICAgICAgIHJldHVybiBjb250ZW50OwogICAgIH0KIAotICAgIHByb3RlY3RlZCBNSU1FWG1sIHBhcnNlTUlNRVhtbChQYXJzZXJDb250ZXh0IGNvbnRleHQsIEVsZW1lbnQgZSkgeworICAgIHByb3RlY3RlZCBNSU1FWG1sIHBhcnNlTUlNRVhtbChUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgRWxlbWVudCBlKSB7CiAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKIAotICAgICAgICBNSU1FWG1sIG1pbWVYbWwgPSBuZXcgTUlNRVhtbCgpOworICAgICAgICBNSU1FWG1sIG1pbWVYbWwgPSBuZXcgTUlNRVhtbChjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICBTdHJpbmcgcGFydCA9IFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUsIENvbnN0YW50cy5BVFRSX1BBUlQpOwogICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7CkBAIC0yMzAsNDUgKzIyMiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eShNSU1FQ29uc3RhbnRzLlFOQU1FX01JTUVfWE1MLCBtaW1lWG1sKTsKKy8vICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eShNSU1FQ29uc3RhbnRzLlFOQU1FX01JTUVfWE1MLCBtaW1lWG1sKTsKICAgICAgICAgcmV0dXJuIG1pbWVYbWw7CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9IYW5kbGVFeHRlbnNpb24oV3JpdGVyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpb24gZXh0ZW5zaW9uKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFIC0gdGhpcyB1Z2xpbmVzcyBjYW4gYmUgYXZvaWRlZCBieSBtb3ZpbmcgYWxsIHRoZSBYTUwgcGFyc2luZy93cml0aW5nIGNvZGUKLSAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQgY2xhc3NlcyB0aGVtc2VsdmVzCi0gICAgICAgIGlmIChleHRlbnNpb24gaW5zdGFuY2VvZiBNSU1FQ29udGVudCkgewotICAgICAgICAgICAgTUlNRUNvbnRlbnQgY29udGVudCA9IChNSU1FQ29udGVudCkgZXh0ZW5zaW9uOwotICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKGNvbnRlbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1BBUlQsIGNvbnRlbnQuZ2V0UGFydCgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVFlQRSwgY29udGVudC5nZXRUeXBlKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhjb250ZW50LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIE1JTUVYbWwpIHsKLSAgICAgICAgICAgIE1JTUVYbWwgbWltZVhtbCA9IChNSU1FWG1sKSBleHRlbnNpb247Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcobWltZVhtbC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfUEFSVCwgbWltZVhtbC5nZXRQYXJ0KCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhtaW1lWG1sLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIE1JTUVNdWx0aXBhcnRSZWxhdGVkKSB7Ci0gICAgICAgICAgICBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBtcHIgPSAoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhtcHIuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtcHIuZ2V0UGFydHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgTUlNRVBhcnQgcGFydCA9IChNSU1FUGFydCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyMiA9IHBhcnQuZXh0ZW5zaW9ucygpOyBpdGVyMi5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlID0gKEV4dGVuc2lvbikgaXRlcjIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25IYW5kbGVyIGggPQotICAgICAgICAgICAgICAgICAgICAgICAgKEV4dGVuc2lvbkhhbmRsZXIpIF9leHRlbnNpb25IYW5kbGVycy5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaC5kb0hhbmRsZUV4dGVuc2lvbihjb250ZXh0LCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKG1wci5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdFeHRlbnNpb25IYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRXh0ZW5zaW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNWQwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRXh0ZW5zaW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKy8qCisgKiAkSWQ6IE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRXh0ZW5zaW9uSGFuZGxlci5qYXZhLHYgMS4xLjIuNiAyMDA2LzEwLzMxIDE5OjUyOjA3IHZpdmVrcCBFeHAgJAorICovCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGNsYXNzIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRXh0ZW5zaW9uSGFuZGxlciBleHRlbmRzIFczQ0FkZHJlc3NpbmdFeHRlbnNpb25IYW5kbGVyIHsKKyAgICBwdWJsaWMgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdFeHRlbnNpb25IYW5kbGVyKE1hcDxTdHJpbmcsIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlcj4gZXh0ZW5zaW9uSGFuZGxlck1hcCkgeworICAgICAgICBzdXBlcihleHRlbnNpb25IYW5kbGVyTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdFeHRlbnNpb25IYW5kbGVyKE1hcDxTdHJpbmcsIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlcj4gZXh0ZW5zaW9uSGFuZGxlck1hcCwgRXJyb3JSZWNlaXZlciBlbnYpIHsKKyAgICAgICAgc3VwZXIoZXh0ZW5zaW9uSGFuZGxlck1hcCwgZW52KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUi53c2RsTnNVcmk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFFOYW1lIGdldEFjdGlvblFOYW1lKCkgeworICAgICAgICByZXR1cm4gQWRkcmVzc2luZ1ZlcnNpb24uTUVNQkVSLndzZGxBY3Rpb25UYWc7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFFOYW1lIGdldFdTRExFeHRlbnNpb25RTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUi53c2RsRXh0ZW5zaW9uVGFnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVBvcnRFeHRlbnNpb24oVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgICAgICAvLyBpZ25vcmUgYW55IGV4dGVuc2lvbiBlbGVtZW50cworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01ldGFkYXRhRmluZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01ldGFkYXRhRmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4OTA1YwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTWV0YWRhdGFGaW5kZXIuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisKKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOworCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuV3NkbE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuV3NpbXBvcnRPcHRpb25zOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5XU0RMQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLk1ldGFEYXRhUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLk1ldGFkYXRhUmVzb2x2ZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlci5TZXJ2aWNlRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkRPTVV0aWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5TZXJ2aWNlRmluZGVyOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkxvY2F0b3JJbXBsOworCitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZXRhZGF0YUZpbmRlciBleHRlbmRzIERPTUZvcmVzdHsKKworICAgIHB1YmxpYyBib29sZWFuIGlzTWV4TWV0YWRhdGE7CisgICAgcHJpdmF0ZSBTdHJpbmcgcm9vdFdTREw7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiByb290V3NkbHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKworICAgIHB1YmxpYyBNZXRhZGF0YUZpbmRlcihJbnRlcm5hbGl6YXRpb25Mb2dpYyBsb2dpYywgV3NpbXBvcnRPcHRpb25zIG9wdGlvbnMsIEVycm9yUmVjZWl2ZXIgZXJyUmVjZWl2ZXIpIHsKKyAgICAgICAgc3VwZXIobG9naWMsIG9wdGlvbnMsIGVyclJlY2VpdmVyKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhcnNlV1NETCgpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcGFyc2Ugc291cmNlIGdyYW1tYXJzCisgICAgICAgIGZvciAoSW5wdXRTb3VyY2UgdmFsdWUgOiBvcHRpb25zLmdldFdTRExzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JRCA9IHZhbHVlLmdldFN5c3RlbUlkKCk7CisgICAgICAgICAgICBlcnJvclJlY2VpdmVyLnBvbGxBYm9ydCgpOworCisgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGVudGl0eSByZXNvbHZlciB1c2UgaXQKKyAgICAgICAgICAgIGlmIChvcHRpb25zLmVudGl0eVJlc29sdmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25zLmVudGl0eVJlc29sdmVyLnJlc29sdmVFbnRpdHkobnVsbCwgc3lzdGVtSUQpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSUQpOworCisKKyAgICAgICAgICAgIERvY3VtZW50IGRvbSA9IHBhcnNlKHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChkb20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEVsZW1lbnQgZG9jID0gZG9tLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKGRvYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2lmIGl0cyBub3QgYSBXU0RMIGRvY3VtZW50LCByZXRyeSB3aXRoIE1FWAorICAgICAgICAgICAgaWYgKGRvYy5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8ICFkb2MuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTRExDb25zdGFudHMuTlNfV1NETCkgfHwgIWRvYy5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImRlZmluaXRpb25zIikpIHsKKyAgICAgICAgICAgICAgICBjb3JlLnJlbW92ZShzeXN0ZW1JRCk7CisgICAgICAgICAgICAgICAgcm9vdERvY3VtZW50cy5yZW1vdmUoc3lzdGVtSUQpOworICAgICAgICAgICAgICAgIGVycm9yUmVjZWl2ZXIud2FybmluZyhsb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihkb2MpLCBXc2RsTWVzc2FnZXMuSU5WQUxJRF9XU0RMX1dJVEhfRE9PQyhzeXN0ZW1JRCwgInsiICsgZml4TnVsbChkb2MuZ2V0TmFtZXNwYWNlVVJJKCkpICsgIn0iICsgZG9jLmdldExvY2FsTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgZG9tID0gZ2V0RnJvbU1ldGFkYXRhUmVzb2x2ZXIoc3lzdGVtSUQpOworICAgICAgICAgICAgICAgIGlmKGRvbSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBkb2MgPSBkb20uZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb2RlTGlzdCBzY2hlbWFzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU2NoZW1hQ29uc3RhbnRzLk5TX1hTRCwgInNjaGVtYSIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZighaW5saW5lZFNjaGVtYUVsZW1lbnRzLmNvbnRhaW5zKHNjaGVtYXMuaXRlbShpKSkpCisgICAgICAgICAgICAgICAgICAgIGlubGluZWRTY2hlbWFFbGVtZW50cy5hZGQoKEVsZW1lbnQpIHNjaGVtYXMuaXRlbShpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWRlbnRpZnlSb290V3NsZHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgcm9vdCB3c2RsIGRvY3VtZW50IHN5c3RlbUlkLiBBIHJvb3Qgd3NkbCBkb2N1bWVudCBpcyB0aGUgb25lIHdoaWNoIGhhcyB3c2RsOnNlcnZpY2UuCisgICAgICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHJvb3Qgd3NkbAorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0Um9vdFdTREwoKXsKKyAgICAgICAgcmV0dXJuIHJvb3RXU0RMOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVzIGFsbCB0aGUgV1NETCBkb2N1bWVudHMuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsCisgICAgU2V0PFN0cmluZz4gZ2V0Um9vdFdTRExzKCl7CisgICAgICAgIHJldHVybiByb290V3NkbHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZGVudGlmaWVzIFdTREwgZG9jdW1lbnRzIGZyb20gdGhlIHtAbGluayBET01Gb3Jlc3R9LiBBbHNvIGlkZW50aWZpZXMgdGhlIHJvb3Qgd3NkbCBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaWRlbnRpZnlSb290V3NsZHMoKXsKKyAgICAgICAgZm9yKFN0cmluZyBsb2NhdGlvbjogcm9vdERvY3VtZW50cyl7CisgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXQobG9jYXRpb24pOworICAgICAgICAgICAgaWYoZG9jIT1udWxsKXsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGRlZmluaXRpb24gPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYoZGVmaW5pdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZihkZWZpbml0aW9uLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLk5TX1dTREwpICYmIGRlZmluaXRpb24uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkZWZpbml0aW9ucyIpKXsKKyAgICAgICAgICAgICAgICAgICAgcm9vdFdzZGxzLmFkZChsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIC8vc2V0IHRoZSByb290IHdzZGwgYXQgdGhpcyBwb2ludC4gUm9vdCB3c2RsIGlzIG9uZSB3aGljaCBoYXMgd3NkbDpzZXJ2aWNlIGluIGl0CisgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IG5sID0gZGVmaW5pdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTRExDb25zdGFudHMuTlNfV1NETCwgInNlcnZpY2UiKTsKKworICAgICAgICAgICAgICAgICAgICAvL1RPRE86d2hhdCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3c2RsIHdpdGggd3NkbDpzZXJ2aWNlIGVsZW1lbnQuIFByb2JhYmx5IHN1Y2ggY2FzZXMKKyAgICAgICAgICAgICAgICAgICAgLy9hcmUgcmFyZSBhbmQgd2Ugd2lsbCB0YWtlIGFueSBvbmUgb2YgdGhlbSwgdGhpcyBsb2dpYyBzaG91bGQgc3RpbGwgd29yaworICAgICAgICAgICAgICAgICAgICBpZihubC5nZXRMZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICByb290V1NETCA9IGxvY2F0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisKKworICAgIHByaXZhdGUgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuICIiOworICAgICAgICBlbHNlIHJldHVybiBzOworICAgIH0KKworCisgICAgLyoKKyAgICAqIElmIHNvdXJjZSBhbmQgdGFyZ2V0IG5hbWVzcGFjZSBhcmUgYWxzbyBwYXNzZWQgaW4sCisgICAgKiB0aGVuIGlmIHRoZSBtZXggcmVzb2x2ZXIgaXMgZm91bmQgYW5kIGl0IGNhbm5vdCBnZXQKKyAgICAqIHRoZSBkYXRhLCB3c2ltcG9ydCBhdHRlbXB0cyB0byBhZGQgP3dzZGwgdG8gdGhlCisgICAgKiBhZGRyZXNzIGFuZCByZXRyaWV2ZSB0aGUgZGF0YSB3aXRoIGEgbm9ybWFsIGh0dHAgZ2V0LgorICAgICogVGhpcyBiZWhhdmlvciBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB0cnlpbmcgYQorICAgICogbWV4IHJlcXVlc3QgZmlyc3QuCisgICAgKi8KKyAgICBwcml2YXRlIERvY3VtZW50IGdldEZyb21NZXRhZGF0YVJlc29sdmVyKFN0cmluZyBzeXN0ZW1JZCkgeworCisgICAgICAgIC8vdHJ5IE1FWAorICAgICAgICBNZXRhRGF0YVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKKyAgICAgICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZURlc2NyaXB0b3IgPSBudWxsOworICAgICAgICBmb3IgKE1ldGFkYXRhUmVzb2x2ZXJGYWN0b3J5IHJlc29sdmVyRmFjdG9yeSA6IFNlcnZpY2VGaW5kZXIuZmluZChNZXRhZGF0YVJlc29sdmVyRmFjdG9yeS5jbGFzcykpIHsKKyAgICAgICAgICAgIHJlc29sdmVyID0gcmVzb2x2ZXJGYWN0b3J5Lm1ldGFkYXRhUmVzb2x2ZXIob3B0aW9ucy5lbnRpdHlSZXNvbHZlcik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdG9yID0gcmVzb2x2ZXIucmVzb2x2ZShuZXcgVVJJKHN5c3RlbUlkKSk7CisgICAgICAgICAgICAgICAgLy93ZSBnb3QgdGhlIFNlcnZpY2VEZXNjcmlwdG9yLCBub3cgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmljZURlc2NyaXB0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXJ2aWNlRGVzY3JpcHRvciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VNZXRhZGF0YShzeXN0ZW1JZCwgc2VydmljZURlc2NyaXB0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyb3JSZWNlaXZlci5lcnJvcihuZXcgTG9jYXRvckltcGwoKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfVU5BQkxFX1RPX0dFVF9NRVRBREFUQShzeXN0ZW1JZCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgRG9jdW1lbnQgcGFyc2VNZXRhZGF0YShTdHJpbmcgc3lzdGVtSWQsIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2VEZXNjcmlwdG9yKSB7CisgICAgICAgIExpc3Q8PyBleHRlbmRzIFNvdXJjZT4gbWV4V3NkbHMgPSBzZXJ2aWNlRGVzY3JpcHRvci5nZXRXU0RMcygpOworICAgICAgICBMaXN0PD8gZXh0ZW5kcyBTb3VyY2U+IG1leFNjaGVtYXMgPSBzZXJ2aWNlRGVzY3JpcHRvci5nZXRTY2hlbWFzKCk7CisgICAgICAgIERvY3VtZW50IHJvb3QgPSBudWxsOworICAgICAgICBmb3IgKFNvdXJjZSBzcmMgOiBtZXhXc2RscykgeworICAgICAgICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIERPTVNvdXJjZSkgeworICAgICAgICAgICAgICAgIE5vZGUgbiA9ICgoRE9NU291cmNlKSBzcmMpLmdldE5vZGUoKTsKKyAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2M7CisgICAgICAgICAgICAgICAgaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBuLmdldE93bmVyRG9jdW1lbnQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRvYyA9IERPTVV0aWwuY3JlYXRlRG9tKCk7CisgICAgICAgICAgICAgICAgICAgIGRvYy5pbXBvcnROb2RlKG4sIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRvYyA9IG4uZ2V0T3duZXJEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIH0KKworLy8gICAgICAgICAgICAgICAgRWxlbWVudCBlID0gKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSk/KEVsZW1lbnQpbjogRE9NVXRpbC5nZXRGaXJzdEVsZW1lbnRDaGlsZChuKTsKKyAgICAgICAgICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXRzIG1haW4gd3NkbCwgdGhlbiBzZXQgaXQgdG8gcm9vdAorICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBubCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTRExDb25zdGFudHMuTlNfV1NETCwgInNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5sLmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IGRvYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RXU0RMID0gc3JjLmdldFN5c3RlbUlkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTm9kZUxpc3QgbmwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0RMQ29uc3RhbnRzLk5TX1dTREwsICJpbXBvcnQiKTsKKyAgICAgICAgICAgICAgICBpZiAobmwuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgaW1wID0gKEVsZW1lbnQpIG5sLml0ZW0oMCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2MgPSBpbXAuZ2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9jICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXh0ZXJuYWxSZWZlcmVuY2VzLmNvbnRhaW5zKGxvYykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxSZWZlcmVuY2VzLmFkZChsb2MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3JlLmtleVNldCgpLmNvbnRhaW5zKHN5c3RlbUlkKSkKKyAgICAgICAgICAgICAgICAgICAgY29yZS5yZW1vdmUoc3lzdGVtSWQpOworICAgICAgICAgICAgICAgIGNvcmUucHV0KHNyYy5nZXRTeXN0ZW1JZCgpLCBkb2MpOworICAgICAgICAgICAgICAgIGlzTWV4TWV0YWRhdGEgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL1RPRE86aGFuZGxlIFNBWFNvdXJjZQorICAgICAgICAgICAgLy9UT0RPOmhhbmRsZXIgU3RyZWFtU291cmNlCisgICAgICAgIH0KKworICAgICAgICBmb3IgKFNvdXJjZSBzcmMgOiBtZXhTY2hlbWFzKSB7CisgICAgICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRE9NU291cmNlKSB7CisgICAgICAgICAgICAgICAgTm9kZSBuID0gKChET01Tb3VyY2UpIHNyYykuZ2V0Tm9kZSgpOworICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpID8gKEVsZW1lbnQpIG4gOiBET01VdGlsLmdldEZpcnN0RWxlbWVudENoaWxkKG4pOworICAgICAgICAgICAgICAgIGlubGluZWRTY2hlbWFFbGVtZW50cy5hZGQoZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1RPRE86aGFuZGxlIFNBWFNvdXJjZQorICAgICAgICAgICAgLy9UT0RPOmhhbmRsZXIgU3RyZWFtU291cmNlCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9OYW1lc3BhY2VDb250ZXh0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9OYW1lc3BhY2VDb250ZXh0SW1wbC5qYXZhCmluZGV4IGU2ZjI0ODUuLmIwMDEwZmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTmFtZXNwYWNlQ29udGV4dEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL05hbWVzcGFjZUNvbnRleHRJbXBsLmphdmEKQEAgLTEsNSArMSw5IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIHJlc2VydmVkIGNvbW1lbnQgYmxvY2sKKyAqIERPIE5PVCBSRU1PVkUgT1IgQUxURVIhCisgKi8KKy8qCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDE3ICsyOCwxNiBAQAogICoKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCisKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLQoraW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuV2VsbEtub3duTmFtZXNwYWNlOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLldlbGxLbm93bk5hbWVzcGFjZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBwdWJsaWMgY2xhc3MgTmFtZXNwYWNlQ29udGV4dEltcGwgaW1wbGVtZW50cyBOYW1lc3BhY2VDb250ZXh0IHsKIApAQCAtNDYsNyArNDksMTkgQEAKIAogICAgIC8qCiAgICAgICogQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICAgICogICAgICovCisgICAgICoKKyAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICAgICoKKyAgICAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICoKKyAgICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewogICAgICAgICBOb2RlIHBhcmVudCA9IGU7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TT0FQMTJFeHRlbnNpb25IYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NPQVAxMkV4dGVuc2lvbkhhbmRsZXIuamF2YQppbmRleCBmODZiZDQxLi42M2UyMDY4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NPQVAxMkV4dGVuc2lvbkhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NPQVAxMkV4dGVuc2lvbkhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxNCArMjQsMTkgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQoraW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVAxMkJpbmRpbmc7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUDEyQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVAxMkJpbmRpbmc7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogCiBwdWJsaWMgY2xhc3MgU09BUDEyRXh0ZW5zaW9uSGFuZGxlciBleHRlbmRzIFNPQVBFeHRlbnNpb25IYW5kbGVyIHsKKyAgICBwdWJsaWMgU09BUDEyRXh0ZW5zaW9uSGFuZGxlcihNYXA8U3RyaW5nLCBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXI+IGV4dGVuc2lvbkhhbmRsZXJNYXApIHsKKyAgICAgICAgc3VwZXIoZXh0ZW5zaW9uSGFuZGxlck1hcCk7CisgICAgfQogCiAgICAgLyoKICAgICAgKiBAc2VlIFNPQVBFeHRlbnNpb25IYW5kbGVyI2dldE5hbWVzcGFjZVVSSSgpCkBAIC01Nyw4ICs2Miw4IEBACiAgICAgICAgIHJldHVybiBTT0FQMTJDb25zdGFudHMuUU5BTUVfQklORElORzsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIFNPQVBCaW5kaW5nIGdldFNPQVBCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFNPQVAxMkJpbmRpbmcoKTsKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIFNPQVBCaW5kaW5nIGdldFNPQVBCaW5kaW5nKExvY2F0b3IgbG9jYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTT0FQMTJCaW5kaW5nKGxvY2F0aW9uKTsKICAgICB9CiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TT0FQRW50aXR5UmVmZXJlbmNlVmFsaWRhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NPQVBFbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3IuamF2YQppbmRleCAwNDgyMDAyLi4xYjgxODk0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NPQVBFbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NPQVBFbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNyArMjUsMTYgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc2NoZW1hLlNjaGVtYUtpbmRzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBDb25zdGFudHM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHlSZWZlcmVuY2VWYWxpZGF0b3I7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5LaW5kOwogCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiAvKioKICAqIEFuIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhIGNsYXNzIHRoYXQgaXMgY2FwYWJsZSBvZiB2YWxpZGF0aW5nCiAgKiBhIFFOYW1lL0tpbmQgcGFpciByZWZlcnJpbmcgdG8gYW4gZXh0ZXJuYWwgZW50aXR5LgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TT0FQRXh0ZW5zaW9uSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TT0FQRXh0ZW5zaW9uSGFuZGxlci5qYXZhCmluZGV4IGRlMTliYjEuLjJmMzk3MjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvU09BUEV4dGVuc2lvbkhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NPQVBFeHRlbnNpb25IYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNDYgKzI1LDM2IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuVFdTRExQYXJzZXJDb250ZXh0SW1wbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNvYXAuU09BUFN0eWxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zb2FwLlNPQVBVc2U7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUGFyc2VyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLldyaXRlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKICAqIFRoZSBTT0FQIGV4dGVuc2lvbiBoYW5kbGVyIGZvciBXU0RMLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgU09BUEV4dGVuc2lvbkhhbmRsZXIgZXh0ZW5kcyBFeHRlbnNpb25IYW5kbGVyQmFzZSB7CitwdWJsaWMgY2xhc3MgU09BUEV4dGVuc2lvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXIgewogCi0gICAgcHVibGljIFNPQVBFeHRlbnNpb25IYW5kbGVyKCkgeworICAgIHB1YmxpYyBTT0FQRXh0ZW5zaW9uSGFuZGxlcihNYXA8U3RyaW5nLCBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXI+IGV4dGVuc2lvbkhhbmRsZXJNYXApIHsKKyAgICAgICAgc3VwZXIoZXh0ZW5zaW9uSGFuZGxlck1hcCk7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CiAgICAgICAgIHJldHVybiBDb25zdGFudHMuTlNfV1NETF9TT0FQOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZURlZmluaXRpb25zRXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZURlZmluaXRpb25zRXh0ZW5zaW9uKAorICAgICAgICBUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwKKyAgICAgICAgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwKICAgICAgICAgRWxlbWVudCBlKSB7CiAgICAgICAgIFV0aWwuZmFpbCgKICAgICAgICAgICAgICJwYXJzaW5nLmludmFsaWRFeHRlbnNpb25FbGVtZW50IiwKQEAgLTczLDkgKzYzLDkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBrZWVwIGNvbXBpbGVyIGhhcHB5CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVHlwZXNFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlVHlwZXNFeHRlbnNpb24oCisgICAgICAgIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuYXBpLndzZGwuVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBVdGlsLmZhaWwoCiAgICAgICAgICAgICAicGFyc2luZy5pbnZhbGlkRXh0ZW5zaW9uRWxlbWVudCIsCkBAIC04NCwxOSArNzQsMTkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBrZWVwIGNvbXBpbGVyIGhhcHB5CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNPQVBCaW5kaW5nIGdldFNPQVBCaW5kaW5nKCl7Ci0gICAgICAgIHJldHVybiBuZXcgU09BUEJpbmRpbmcoKTsKKyAgICBwcm90ZWN0ZWQgU09BUEJpbmRpbmcgZ2V0U09BUEJpbmRpbmcoTG9jYXRvciBsb2NhdGlvbil7CisgICAgICAgIHJldHVybiBuZXcgU09BUEJpbmRpbmcobG9jYXRpb24pOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZUJpbmRpbmdFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlQmluZGluZ0V4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgZ2V0QmluZGluZ1FOYW1lKCkpKSB7CiAgICAgICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOwogCi0gICAgICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gZ2V0U09BUEJpbmRpbmcoKTsKKyAgICAgICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSBnZXRTT0FQQmluZGluZyhjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICAgICAgLy8gTk9URSAtIHRoZSAidHJhbnNwb3J0IiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgYWNjb3JkaW5nIHRvIHNlY3Rpb24gMy4zIG9mIHRoZSBXU0RMIDEuMSBzcGVjLAogICAgICAgICAgICAgLy8gYnV0IG9wdGlvbmFsIGFjY29yZGluZyB0byB0aGUgc2NoZW1hIGluIGFwcGVuZGl4IEEgNC4yIG9mIHRoZSBzYW1lIGRvY3VtZW50IQpAQCAtMTE5LDcgKzEwOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXJlbnQuYWRkRXh0ZW5zaW9uKGJpbmRpbmcpOwogICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KGdldEJpbmRpbmdRTmFtZSgpLCBiaW5kaW5nKTsKKy8vICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoZ2V0QmluZGluZ1FOYW1lKCksIGJpbmRpbmcpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBVdGlsLmZhaWwoCkBAIC0xMzAsMTUgKzEyMCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlT3BlcmF0aW9uRXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU9wZXJhdGlvbkV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgZ2V0T3BlcmF0aW9uUU5hbWUoKSkpIHsKICAgICAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7CiAKLSAgICAgICAgICAgIFNPQVBPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFNPQVBPcGVyYXRpb24oKTsKKyAgICAgICAgICAgIFNPQVBPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFNPQVBPcGVyYXRpb24oY29udGV4dC5nZXRMb2NhdGlvbihlKSk7CiAKICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0KICAgICAgICAgICAgICAgICBYbWxVdGlsLmdldEF0dHJpYnV0ZU9yTnVsbChlLCBDb25zdGFudHMuQVRUUl9TT0FQX0FDVElPTik7CkBAIC0xNjEsOSArMTUxLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24ob3BlcmF0aW9uKTsKICAgICAgICAgICAgIGNvbnRleHQucG9wKCk7Ci0gICAgICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eSgKLSAgICAgICAgICAgICAgICBnZXRPcGVyYXRpb25RTmFtZSgpLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbik7CisvLyAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KAorLy8gICAgICAgICAgICAgICAgZ2V0T3BlcmF0aW9uUU5hbWUoKSwKKy8vICAgICAgICAgICAgICAgIG9wZXJhdGlvbik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFV0aWwuZmFpbCgKQEAgLTE3NCwzNSArMTY0LDM3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVJbnB1dEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVJbnB1dEV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICByZXR1cm4gaGFuZGxlSW5wdXRPdXRwdXRFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKICAgICB9Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlT3V0cHV0RXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU91dHB1dEV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICByZXR1cm4gaGFuZGxlSW5wdXRPdXRwdXRFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVNSU1FUGFydEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICByZXR1cm4gaGFuZGxlSW5wdXRPdXRwdXRFeHRlbnNpb24oY29udGV4dCwgcGFyZW50LCBlKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVJbnB1dE91dHB1dEV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHRpZiwKKyAgICAgICAgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwKICAgICAgICAgRWxlbWVudCBlKSB7CisgICAgICAgIFRXU0RMUGFyc2VyQ29udGV4dEltcGwgY29udGV4dCA9IChUV1NETFBhcnNlckNvbnRleHRJbXBsKWNvbnRleHRpZjsKICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIGdldEJvZHlRTmFtZSgpKSkgewogICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKIAotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IG5ldyBTT0FQQm9keSgpOworICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IG5ldyBTT0FQQm9keShjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICAgICAgU3RyaW5nIHVzZSA9IFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUsIENvbnN0YW50cy5BVFRSX1VTRSk7CiAgICAgICAgICAgICBpZiAodXNlICE9IG51bGwpIHsKQEAgLTIzNywxMyArMjI5LDEzIEBACiAKICAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24oYm9keSk7CiAgICAgICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoZ2V0Qm9keVFOYW1lKCksIGJvZHkpOworLy8gICAgICAgICAgICBjb250ZXh0LmZpcmVEb25lUGFyc2luZ0VudGl0eShnZXRCb2R5UU5hbWUoKSwgYm9keSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlLCBnZXRIZWFkZXJRTmFtZSgpKSkgewogICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKIAotICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBuZXcgU09BUEhlYWRlcigpOworICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBuZXcgU09BUEhlYWRlcihjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICAgICAgU3RyaW5nIHVzZSA9IFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUsIENvbnN0YW50cy5BVFRSX1VTRSk7CiAgICAgICAgICAgICBpZiAodXNlICE9IG51bGwpIHsKQEAgLTI3OSw3ICsyNzEsNyBAQAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VBdHRyID0KICAgICAgICAgICAgICAgICBYbWxVdGlsLmdldEF0dHJpYnV0ZU9yTnVsbChlLCBDb25zdGFudHMuQVRUUl9NRVNTQUdFKTsKICAgICAgICAgICAgIGlmIChtZXNzYWdlQXR0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVyLnNldE1lc3NhZ2UoY29udGV4dC50cmFuc2xhdGVRdWFsaWZpZWROYW1lKG1lc3NhZ2VBdHRyKSk7CisgICAgICAgICAgICAgICAgaGVhZGVyLnNldE1lc3NhZ2UoY29udGV4dC50cmFuc2xhdGVRdWFsaWZpZWROYW1lKGNvbnRleHQuZ2V0TG9jYXRpb24oZSksIG1lc3NhZ2VBdHRyKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IFhtbFV0aWwuZ2V0QWxsQ2hpbGRyZW4oZSk7IGl0ZXIuaGFzTmV4dCgpOykgewpAQCAtMjkyLDcgKzI4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKIAotICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyRmF1bHQgaGVhZGVyZmF1bHQgPSBuZXcgU09BUEhlYWRlckZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJGYXVsdCBoZWFkZXJmYXVsdCA9IG5ldyBTT0FQSGVhZGVyRmF1bHQoY29udGV4dC5nZXRMb2NhdGlvbihlKSk7CiAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZTIgPQogICAgICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbC5nZXRBdHRyaWJ1dGVPck51bGwoZTIsIENvbnN0YW50cy5BVFRSX1VTRSk7CkBAIC0zMzUsNyArMzI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUyLCBDb25zdGFudHMuQVRUUl9NRVNTQUdFKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VBdHRyMiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJmYXVsdC5zZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZShtZXNzYWdlQXR0cjIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZVF1YWxpZmllZE5hbWUoY29udGV4dC5nZXRMb2NhdGlvbihlMiksIG1lc3NhZ2VBdHRyMikpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmFkZChoZWFkZXJmYXVsdCk7CkBAIC0zNjEsMTUgKzM1MywxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRmF1bHRFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHRFeHRlbnNpb24oCisgICAgICAgIFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBUV1NETEV4dGVuc2libGUgcGFyZW50LAogICAgICAgICBFbGVtZW50IGUpIHsKICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIGdldEZhdWx0UU5hbWUoKSkpIHsKICAgICAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7CiAKLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IG5ldyBTT0FQRmF1bHQoKTsKKyAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IG5ldyBTT0FQRmF1bHQoY29udGV4dC5nZXRMb2NhdGlvbihlKSk7CiAKICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gWG1sVXRpbC5nZXRBdHRyaWJ1dGVPck51bGwoZSwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7CiAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CkBAIC00MDQsNyArMzk2LDcgQEAKIAogICAgICAgICAgICAgcGFyZW50LmFkZEV4dGVuc2lvbihmYXVsdCk7CiAgICAgICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoZ2V0RmF1bHRRTmFtZSgpLCBmYXVsdCk7CisvLyAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KGdldEZhdWx0UU5hbWUoKSwgZmF1bHQpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBVdGlsLmZhaWwoCkBAIC00MTUsOSArNDA3LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNlcnZpY2VFeHRlbnNpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRXh0ZW5zaWJsZSBwYXJlbnQsCisgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlU2VydmljZUV4dGVuc2lvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBVdGlsLmZhaWwoCiAgICAgICAgICAgICAicGFyc2luZy5pbnZhbGlkRXh0ZW5zaW9uRWxlbWVudCIsCkBAIC00MjYsMTUgKzQxOCwxNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGtlZXAgY29tcGlsZXIgaGFwcHkKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVQb3J0RXh0ZW5zaW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEV4dGVuc2libGUgcGFyZW50LAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVBvcnRFeHRlbnNpb24oCisgICAgICAgIFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBUV1NETEV4dGVuc2libGUgcGFyZW50LAogICAgICAgICBFbGVtZW50IGUpIHsKICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIGdldEFkZHJlc3NRTmFtZSgpKSkgewogICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKIAotICAgICAgICAgICAgU09BUEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBTT0FQQWRkcmVzcygpOworICAgICAgICAgICAgU09BUEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBTT0FQQWRkcmVzcyhjb250ZXh0LmdldExvY2F0aW9uKGUpKTsKIAogICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0KICAgICAgICAgICAgICAgICBVdGlsLmdldFJlcXVpcmVkQXR0cmlidXRlKGUsIENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OKTsKQEAgLTQ0Miw3ICs0MzUsNyBAQAogCiAgICAgICAgICAgICBwYXJlbnQuYWRkRXh0ZW5zaW9uKGFkZHJlc3MpOwogICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KGdldEFkZHJlc3NRTmFtZSgpLCBhZGRyZXNzKTsKKy8vICAgICAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoZ2V0QWRkcmVzc1FOYW1lKCksIGFkZHJlc3MpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBVdGlsLmZhaWwoCkBAIC00NTMsMTMxICs0NDYsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgZG9IYW5kbGVFeHRlbnNpb24oV3JpdGVyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpb24gZXh0ZW5zaW9uKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFIC0gdGhpcyB1Z2xpbmVzcyBjYW4gYmUgYXZvaWRlZCBieSBtb3ZpbmcgYWxsIHRoZSBYTUwgcGFyc2luZy93cml0aW5nIGNvZGUKLSAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQgY2xhc3NlcyB0aGVtc2VsdmVzCi0gICAgICAgIGlmIChleHRlbnNpb24gaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotICAgICAgICAgICAgU09BUEFkZHJlc3MgYWRkcmVzcyA9IChTT0FQQWRkcmVzcykgZXh0ZW5zaW9uOwotICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKGFkZHJlc3MuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLAotICAgICAgICAgICAgICAgIGFkZHJlc3MuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKGFkZHJlc3MuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKLSAgICAgICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhiaW5kaW5nLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgYmluZGluZy5nZXRUcmFuc3BvcnQoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgICAgICAgICAgIChiaW5kaW5nLmdldFN0eWxlKCkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiAoYmluZGluZy5nZXRTdHlsZSgpID09IFNPQVBTdHlsZS5ET0NVTUVOVAotICAgICAgICAgICAgICAgICAgICAgICAgPyBDb25zdGFudHMuQVRUUlZBTFVFX0RPQ1VNRU5UCi0gICAgICAgICAgICAgICAgICAgICAgICA6IENvbnN0YW50cy5BVFRSVkFMVUVfUlBDKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1NUWUxFLCBzdHlsZSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKGJpbmRpbmcuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uIGluc3RhbmNlb2YgU09BUEJvZHkpIHsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSAoU09BUEJvZHkpIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhib2R5LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9FTkNPRElOR19TVFlMRSwKLSAgICAgICAgICAgICAgICBib2R5LmdldEVuY29kaW5nU3R5bGUoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1BBUlRTLCBib2R5LmdldFBhcnRzKCkpOwotICAgICAgICAgICAgU3RyaW5nIHVzZSA9Ci0gICAgICAgICAgICAgICAgKGJvZHkuZ2V0VXNlKCkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiAoYm9keS5nZXRVc2UoKSA9PSBTT0FQVXNlLkxJVEVSQUwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gQ29uc3RhbnRzLkFUVFJWQUxVRV9MSVRFUkFMCi0gICAgICAgICAgICAgICAgICAgICAgICA6IENvbnN0YW50cy5BVFRSVkFMVUVfRU5DT0RFRCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9VU0UsIHVzZSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBib2R5LmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVFbmRUYWcoYm9keS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChleHRlbnNpb24gaW5zdGFuY2VvZiBTT0FQRmF1bHQpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IChTT0FQRmF1bHQpIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhmYXVsdC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfTkFNRSwgZmF1bHQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfRU5DT0RJTkdfU1RZTEUsCi0gICAgICAgICAgICAgICAgZmF1bHQuZ2V0RW5jb2RpbmdTdHlsZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyB1c2UgPQotICAgICAgICAgICAgICAgIChmYXVsdC5nZXRVc2UoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IChmYXVsdC5nZXRVc2UoKSA9PSBTT0FQVXNlLkxJVEVSQUwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gQ29uc3RhbnRzLkFUVFJWQUxVRV9MSVRFUkFMCi0gICAgICAgICAgICAgICAgICAgICAgICA6IENvbnN0YW50cy5BVFRSVkFMVUVfRU5DT0RFRCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9VU0UsIHVzZSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKGZhdWx0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gKFNPQVBIZWFkZXIpIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhoZWFkZXIuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX01FU1NBR0UsIGhlYWRlci5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9QQVJULCBoZWFkZXIuZ2V0UGFydCgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfRU5DT0RJTkdfU1RZTEUsCi0gICAgICAgICAgICAgICAgaGVhZGVyLmdldEVuY29kaW5nU3R5bGUoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlID0KLSAgICAgICAgICAgICAgICAoaGVhZGVyLmdldFVzZSgpID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogKGhlYWRlci5nZXRVc2UoKSA9PSBTT0FQVXNlLkxJVEVSQUwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gQ29uc3RhbnRzLkFUVFJWQUxVRV9MSVRFUkFMCi0gICAgICAgICAgICAgICAgICAgICAgICA6IENvbnN0YW50cy5BVFRSVkFMVUVfRU5DT0RFRCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9VU0UsIHVzZSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBoZWFkZXIuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhoZWFkZXIuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uIGluc3RhbmNlb2YgU09BUEhlYWRlckZhdWx0KSB7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyRmF1bHQgaGVhZGVyZmF1bHQgPSAoU09BUEhlYWRlckZhdWx0KSBleHRlbnNpb247Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcoaGVhZGVyZmF1bHQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgaGVhZGVyZmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfUEFSVCwgaGVhZGVyZmF1bHQuZ2V0UGFydCgpKTsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfRU5DT0RJTkdfU1RZTEUsCi0gICAgICAgICAgICAgICAgaGVhZGVyZmF1bHQuZ2V0RW5jb2RpbmdTdHlsZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyB1c2UgPQotICAgICAgICAgICAgICAgIChoZWFkZXJmYXVsdC5nZXRVc2UoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IChoZWFkZXJmYXVsdC5nZXRVc2UoKSA9PSBTT0FQVXNlLkxJVEVSQUwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gQ29uc3RhbnRzLkFUVFJWQUxVRV9MSVRFUkFMCi0gICAgICAgICAgICAgICAgICAgICAgICA6IENvbnN0YW50cy5BVFRSVkFMVUVfRU5DT0RFRCkpOwotICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9VU0UsIHVzZSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBoZWFkZXJmYXVsdC5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKGhlYWRlcmZhdWx0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgIFNPQVBPcGVyYXRpb24gb3BlcmF0aW9uID0gKFNPQVBPcGVyYXRpb24pIGV4dGVuc2lvbjsKLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhvcGVyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX1NPQVBfQUNUSU9OLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRTT0FQQWN0aW9uKCkpOwotICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0KLSAgICAgICAgICAgICAgICAob3BlcmF0aW9uLmdldFN0eWxlKCkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiAob3BlcmF0aW9uLmlzRG9jdW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBDb25zdGFudHMuQVRUUlZBTFVFX0RPQ1VNRU5UCi0gICAgICAgICAgICAgICAgICAgICAgICA6IENvbnN0YW50cy5BVFRSVkFMVUVfUlBDKSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1NUWUxFLCBzdHlsZSk7Ci0gICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKG9wZXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIEV4dGVuc2lvbkhhbmRsZXJCYXNlI2hhbmRsZVBvcnRUeXBlRXh0ZW5zaW9uKFBhcnNlckNvbnRleHQsIEV4dGVuc2libGUsIG9yZy53M2MuZG9tLkVsZW1lbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlUG9ydFR5cGVFeHRlbnNpb24oUGFyc2VyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7Ci0gICAgICAgIFV0aWwuZmFpbCgKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVQb3J0VHlwZUV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgVXRpbC5mYWlsKAogICAgICAgICAgICAgInBhcnNpbmcuaW52YWxpZEV4dGVuc2lvbkVsZW1lbnQiLAogICAgICAgICAgICAgZS5nZXRUYWdOYW1lKCksCiAgICAgICAgICAgICBlLmdldE5hbWVzcGFjZVVSSSgpKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvU2NoZW1hRXh0ZW5zaW9uSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TY2hlbWFFeHRlbnNpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZGNiNjcuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TY2hlbWFFeHRlbnNpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuRXh0ZW5zaWJsZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLkV4dGVuc2lvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlBhcnNlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5Xcml0ZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKLQotLyoqCi0gKiBUaGUgWE1MIFNjaGVtYSBleHRlbnNpb24gaGFuZGxlciBmb3IgV1NETC4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUV4dGVuc2lvbkhhbmRsZXIgZXh0ZW5kcyBFeHRlbnNpb25IYW5kbGVyIHsKLQotICAgIHB1YmxpYyBTY2hlbWFFeHRlbnNpb25IYW5kbGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gQ29uc3RhbnRzLk5TX1hTRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkb0hhbmRsZUV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIHBhcmVudCwKLSAgICAgICAgRWxlbWVudCBlKSB7Ci0gICAgICAgIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlLCBTY2hlbWFDb25zdGFudHMuUU5BTUVfU0NIRU1BKSkgewotICAgICAgICAgICAgU2NoZW1hUGFyc2VyIHBhcnNlciA9IG5ldyBTY2hlbWFQYXJzZXIoKTsKLSAgICAgICAgICAgIHBhcmVudC5hZGRFeHRlbnNpb24ocGFyc2VyLnBhcnNlU2NoZW1hKGNvbnRleHQsIGUsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9IYW5kbGVFeHRlbnNpb24oV3JpdGVyQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpb24gZXh0ZW5zaW9uKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZXh0ZW5zaW9uIGluc3RhbmNlb2YgU2NoZW1hKSB7Ci0gICAgICAgICAgICBTY2hlbWFXcml0ZXIgd3JpdGVyID0gbmV3IFNjaGVtYVdyaXRlcigpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlU2NoZW1hKGNvbnRleHQsIChTY2hlbWEpIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB1bmtub3duIGV4dGVuc2lvbgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TY2hlbWFQYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvU2NoZW1hUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjk5MWJjLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvU2NoZW1hUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLk5hbWVkTm9kZU1hcEl0ZXJhdG9yOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuTnVsbEVudGl0eVJlc29sdmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hQXR0cmlidXRlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hRG9jdW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNjaGVtYS5TY2hlbWFFbGVtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5QYXJzZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwotCi0vKioKLSAqIEEgcGFyc2VyIGZvciBYTUwgU2NoZW1hLCBpbmNsdWRpbmcgdGhlIGZyYWdtZW50cyBmb3VuZCBpbnNpZGUgYSBXU0RMIGRvY3VtZW50LgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hUGFyc2VyIHsKLQotICAgIHB1YmxpYyBTY2hlbWFQYXJzZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9sbG93SW1wb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIF9mb2xsb3dJbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvbGxvd0ltcG9ydHMoYm9vbGVhbiBiKSB7Ci0gICAgICAgIF9mb2xsb3dJbXBvcnRzID0gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hRG9jdW1lbnQgcGFyc2UoSW5wdXRTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIFNjaGVtYURvY3VtZW50IHNjaGVtYURvY3VtZW50ID0gbmV3IFNjaGVtYURvY3VtZW50KCk7Ci0gICAgICAgIHNjaGVtYURvY3VtZW50LnNldFN5c3RlbUlkKHNvdXJjZS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0ID0gbmV3IFBhcnNlckNvbnRleHQoc2NoZW1hRG9jdW1lbnQsIG51bGwpOwotICAgICAgICBjb250ZXh0LnNldEZvbGxvd0ltcG9ydHMoX2ZvbGxvd0ltcG9ydHMpOwotICAgICAgICBzY2hlbWFEb2N1bWVudC5zZXRTY2hlbWEocGFyc2VTY2hlbWEoY29udGV4dCwgc291cmNlLCBudWxsKSk7Ci0gICAgICAgIHJldHVybiBzY2hlbWFEb2N1bWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hIHBhcnNlU2NoZW1hKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIElucHV0U291cmNlIHNvdXJjZSwKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIFNjaGVtYSBzY2hlbWEgPQotICAgICAgICAgICAgcGFyc2VTY2hlbWFOb0ltcG9ydChjb250ZXh0LCBzb3VyY2UsIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJKTsKLSAgICAgICAgc2NoZW1hLmRlZmluZUFsbEVudGl0aWVzKCk7Ci0gICAgICAgIHByb2Nlc3NJbXBvcnRzKGNvbnRleHQsIHNvdXJjZSwgc2NoZW1hKTsKLSAgICAgICAgcmV0dXJuIHNjaGVtYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hIHBhcnNlU2NoZW1hKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIEVsZW1lbnQgZSwKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIFNjaGVtYSBzY2hlbWEgPQotICAgICAgICAgICAgcGFyc2VTY2hlbWFOb0ltcG9ydChjb250ZXh0LCBlLCBleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIHNjaGVtYS5kZWZpbmVBbGxFbnRpdGllcygpOwotICAgICAgICBwcm9jZXNzSW1wb3J0cyhjb250ZXh0LCBudWxsLCBzY2hlbWEpOwotICAgICAgICByZXR1cm4gc2NoZW1hOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbXBvcnRzKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIElucHV0U291cmNlIHNvdXJjZSwKLSAgICAgICAgU2NoZW1hIHNjaGVtYSkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWEuZ2V0Q29udGVudCgpLmNoaWxkcmVuKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU2NoZW1hRWxlbWVudCBjaGlsZCA9IChTY2hlbWFFbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRRTmFtZSgpLmVxdWFscyhTY2hlbWFDb25zdGFudHMuUU5BTUVfSU1QT1JUKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldFZhbHVlT2ZBdHRyaWJ1dGVPck51bGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9TQ0hFTUFfTE9DQVRJT04pOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRWYWx1ZU9mQXR0cmlidXRlT3JOdWxsKENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICAgICAgLy9idWcgZml4OiA0ODU3NzYyLCBhZGQgYWRqdXN0ZWRMb2NhdGlvbiB0byB0ZWggaW1wb3J0RG9jdW1lbnRzIGFuZCBpZ25vcmUgaWYgaXQKLSAgICAgICAgICAgICAgICAvL2V4aXN0cywgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGp1c3RlZExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdGVkTG9jYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwucHJvY2Vzc1N5c3RlbUlkV2l0aEJhc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRTeXN0ZW1JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9idWcgZml4OiA0ODU2Njc0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGp1c3RlZExvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdGVkTG9jYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0V1NETExvY2F0aW9uKCkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVXRpbC5wcm9jZXNzU3lzdGVtSWRXaXRoQmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0V1NETExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmlzSW1wb3J0ZWREb2N1bWVudChhZGp1c3RlZExvY2F0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREb2N1bWVudCgpLmFkZEltcG9ydGVkRW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlU2NoZW1hKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UoYWRqdXN0ZWRMb2NhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREb2N1bWVudCgpLmFkZEltcG9ydGVkRG9jdW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKAotICAgICAgICAgICAgICAgIGNoaWxkLmdldFFOYW1lKCkuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5RTkFNRV9JTkNMVURFKQotICAgICAgICAgICAgICAgICAgICAmJiAoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0VmFsdWVPZkF0dHJpYnV0ZU9yTnVsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX1NDSEVNQV9MT0NBVElPTik7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIWNvbnRleHQuZ2V0RG9jdW1lbnQoKS5pc0luY2x1ZGVkRG9jdW1lbnQobG9jYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RG9jdW1lbnQoKS5hZGRJbmNsdWRlZERvY3VtZW50KGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkanVzdGVkTG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRMb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5wcm9jZXNzU3lzdGVtSWRXaXRoQmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFN5c3RlbUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYWRqdXN0ZWRMb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZExvY2F0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldERvY3VtZW50KCkuZ2V0U3lzdGVtSWQoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBVdGlsLnByb2Nlc3NTeXN0ZW1JZFdpdGhCYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREb2N1bWVudCgpLmdldFN5c3RlbUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREb2N1bWVudCgpLmFkZEluY2x1ZGVkRW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VTY2hlbWEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UoYWRqdXN0ZWRMb2NhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICBjaGlsZC5nZXRRTmFtZSgpLmVxdWFscyhTY2hlbWFDb25zdGFudHMuUU5BTUVfUkVERUZJTkUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90IHN1cHBvcnRlZAotICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgidmFsaWRhdGlvbi51bnN1cHBvcnRlZFNjaGVtYUZlYXR1cmUiLCAicmVkZWZpbmUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTY2hlbWEgcGFyc2VTY2hlbWFOb0ltcG9ydCgKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UsCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBidWlsZGVyRmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgYnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICBidWlsZGVyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IE51bGxFbnRpdHlSZXNvbHZlcigpKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VTY2hlbWFOb0ltcG9ydCgKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLmlvRXhjZXB0aW9uIixlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAicGFyc2luZy5zYXhFeGNlcHRpb24iLGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAicGFyc2luZy5wYXJzZXJDb25maWdFeGNlcHRpb24iLGUpOwotICAgICAgICB9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAicGFyc2luZy5mYWN0b3J5Q29uZmlnRXhjZXB0aW9uIixlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTY2hlbWEgcGFyc2VTY2hlbWFOb0ltcG9ydCgKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBEb2N1bWVudCBkb2MsCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSSkgewotICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIFV0aWwudmVyaWZ5VGFnTlNSb290RWxlbWVudChyb290LCBTY2hlbWFDb25zdGFudHMuUU5BTUVfU0NIRU1BKTsKLSAgICAgICAgcmV0dXJuIHBhcnNlU2NoZW1hTm9JbXBvcnQoY29udGV4dCwgcm9vdCwgZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTY2hlbWEgcGFyc2VTY2hlbWFOb0ltcG9ydCgKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFbGVtZW50IGUsCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSSkgewotICAgICAgICBTY2hlbWEgc2NoZW1hID0gbmV3IFNjaGVtYShjb250ZXh0LmdldERvY3VtZW50KCkpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJID0KLSAgICAgICAgICAgIFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUsIENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICAvL2J1ZyA0ODQ5NzU0IGZpeCwgaW4gYm90aCB0aGUgY2FzZSBvZiB4c2Q6aW5jbHVkZSBhbmQgeHNkOmltcG9ydCB0aGlzIHNob3VsZCB3b3JrCi0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2VVUkkgIT0gbnVsbAotICAgICAgICAgICAgJiYgZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2VVUkkgIT0gbnVsbAotICAgICAgICAgICAgJiYgIWV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJLmVxdWFscyh0YXJnZXROYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbi5pbmNvcnJlY3RUYXJnZXROYW1lc3BhY2UiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2VVUkkgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZVVSSSA9PSBudWxsKQotICAgICAgICAgICAgc2NoZW1hLnNldFRhcmdldE5hbWVzcGFjZVVSSShleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2VVUkkodGFyZ2V0TmFtZXNwYWNlVVJJKTsKLQotICAgICAgICAvLyBzbmFwc2hvdCB0aGUgY3VycmVudCBwcmVmaXhlcwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZXh0LmdldFByZWZpeGVzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5zVVJJID0gY29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgIGlmIChuc1VSSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oInBhcnNpbmcuc2hvdWxkTm90SGFwcGVuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzY2hlbWEuYWRkUHJlZml4KHByZWZpeCwgbnNVUkkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC5wdXNoKCk7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOwotCi0gICAgICAgIC8vIGp1c3QgaW50ZXJuYWxpemUgdGhlIFhNTCBmcmFnbWVudAotICAgICAgICBTY2hlbWFFbGVtZW50IHNjaGVtYUVsZW1lbnQgPQotICAgICAgICAgICAgbmV3IFNjaGVtYUVsZW1lbnQoU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1NDSEVNQSk7Ci0KLSAgICAgICAgY29weU5hbWVzcGFjZURlY2xhcmF0aW9ucyhzY2hlbWFFbGVtZW50LCBlKTsKLSAgICAgICAgY29weUF0dHJpYnV0ZXNOb05zKHNjaGVtYUVsZW1lbnQsIGUpOwotICAgICAgICBjb3B5RWxlbWVudENvbnRlbnQoc2NoZW1hRWxlbWVudCwgZSk7Ci0KLSAgICAgICAgc2NoZW1hLnNldENvbnRlbnQoc2NoZW1hRWxlbWVudCk7Ci0gICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hKHNjaGVtYSk7Ci0KLSAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgY29udGV4dC5maXJlRG9uZVBhcnNpbmdFbnRpdHkoU2NoZW1hQ29uc3RhbnRzLlFOQU1FX1NDSEVNQSwgc2NoZW1hKTsKLSAgICAgICAgcmV0dXJuIHNjaGVtYTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5QXR0cmlidXRlc05vTnMoU2NoZW1hRWxlbWVudCB0YXJnZXQsIEVsZW1lbnQgc291cmNlKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBOYW1lZE5vZGVNYXBJdGVyYXRvcihzb3VyY2UuZ2V0QXR0cmlidXRlcygpKTsKLSAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKFBSRUZJWF9YTUxOUykKLSAgICAgICAgICAgICAgICB8fCBhdHRyLmdldE5hbWUoKS5zdGFydHNXaXRoKFBSRUZJWF9YTUxOU19DT0xPTikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlIGF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFNjaGVtYUF0dHJpYnV0ZShhdHRyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lc3BhY2VVUkkoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUuc2V0VmFsdWUoYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHRhcmdldC5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlOYW1lc3BhY2VEZWNsYXJhdGlvbnMoCi0gICAgICAgIFNjaGVtYUVsZW1lbnQgdGFyZ2V0LAotICAgICAgICBFbGVtZW50IHNvdXJjZSkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgTmFtZWROb2RlTWFwSXRlcmF0b3Ioc291cmNlLmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKLSAgICAgICAgICAgICkgewotICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhQUkVGSVhfWE1MTlMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJlZml4KCIiLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gWG1sVXRpbC5nZXRQcmVmaXgoYXR0ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKFBSRUZJWF9YTUxOUykpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gWG1sVXRpbC5nZXRMb2NhbFBhcnQoYXR0ci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJlZml4KG5zUHJlZml4LCB1cmkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlFbGVtZW50Q29udGVudChTY2hlbWFFbGVtZW50IHRhcmdldCwgRWxlbWVudCBzb3VyY2UpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gWG1sVXRpbC5nZXRBbGxDaGlsZHJlbihzb3VyY2UpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZTIgPSBVdGlsLm5leHRFbGVtZW50SWdub3JpbmdDaGFyYWN0ZXJDb250ZW50KGl0ZXIpOwotICAgICAgICAgICAgaWYgKGUyID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBTY2hlbWFFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgU2NoZW1hRWxlbWVudChlMi5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICBuZXdFbGVtZW50LnNldE5hbWVzcGFjZVVSSShlMi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBjb3B5TmFtZXNwYWNlRGVjbGFyYXRpb25zKG5ld0VsZW1lbnQsIGUyKTsKLSAgICAgICAgICAgIGNvcHlBdHRyaWJ1dGVzTm9OcyhuZXdFbGVtZW50LCBlMik7Ci0gICAgICAgICAgICBjb3B5RWxlbWVudENvbnRlbnQobmV3RWxlbWVudCwgZTIpOwotICAgICAgICAgICAgdGFyZ2V0LmFkZENoaWxkKG5ld0VsZW1lbnQpOwotICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRQYXJlbnQodGFyZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfZm9sbG93SW1wb3J0czsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGSVhfWE1MTlMgPSAieG1sbnMiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGSVhfWE1MTlNfQ09MT04gPSAieG1sbnM6IjsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvU2NoZW1hV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NjaGVtYVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQ5MWJkLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvU2NoZW1hV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNjaGVtYS5TY2hlbWFBdHRyaWJ1dGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LnNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc2NoZW1hLlNjaGVtYUVsZW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5Xcml0ZXJDb250ZXh0OwotCi0vKioKLSAqIEEgd3JpdGVyIGZvciBYTUwgU2NoZW1hIGZyYWdtZW50cyB3aXRoaW4gYSBXU0RMIGRvY3VtZW50LgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hV3JpdGVyIHsKLQotICAgIHB1YmxpYyBTY2hlbWFXcml0ZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoU2NoZW1hRG9jdW1lbnQgZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBvcykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgV3JpdGVyQ29udGV4dCBjb250ZXh0ID0gbmV3IFdyaXRlckNvbnRleHQob3MpOwotICAgICAgICB3cml0ZVNjaGVtYShjb250ZXh0LCBkb2N1bWVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgIGNvbnRleHQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVNjaGVtYShXcml0ZXJDb250ZXh0IGNvbnRleHQsIFNjaGVtYSBzY2hlbWEpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRleHQucHVzaCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVUb3BTY2hlbWFFbGVtZW50KGNvbnRleHQsIHNjaGVtYSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjb250ZXh0LnBvcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVUb3BTY2hlbWFFbGVtZW50KFdyaXRlckNvbnRleHQgY29udGV4dCwgU2NoZW1hIHNjaGVtYSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2NoZW1hRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gc2NoZW1hLmdldENvbnRlbnQoKTsKLSAgICAgICAgUU5hbWUgbmFtZSA9IHNjaGVtYUVsZW1lbnQuZ2V0UU5hbWUoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgbmFtZXNwYWNlcyB3ZSBleHBlY3QgYXJlIGFjdHVhbGx5IGRlY2xhcmVkCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYS5wcmVmaXhlcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFVSSSA9IHNjaGVtYS5nZXRVUklGb3JQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICAgIGlmICghZXhwZWN0ZWRVUkkuZXF1YWxzKGNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5kZWNsYXJlUHJlZml4KHByZWZpeCwgZXhwZWN0ZWRVUkkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2NoZW1hRWxlbWVudC5wcmVmaXhlcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzY2hlbWFFbGVtZW50LmdldFVSSUZvclByZWZpeChwcmVmaXgpOwotICAgICAgICAgICAgY29udGV4dC5kZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhuYW1lKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFFbGVtZW50LmF0dHJpYnV0ZXMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGUgYXR0cmlidXRlID0gKFNjaGVtYUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRWYWx1ZShjb250ZXh0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UU5hbWVTdHJpbmcoYXR0cmlidXRlLmdldFFOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0VmFsdWUoY29udGV4dCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC53cml0ZUFsbFBlbmRpbmdOYW1lc3BhY2VEZWNsYXJhdGlvbnMoKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFFbGVtZW50LmNoaWxkcmVuKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU2NoZW1hRWxlbWVudCBjaGlsZCA9IChTY2hlbWFFbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHdyaXRlU2NoZW1hRWxlbWVudChjb250ZXh0LCBjaGlsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU2NoZW1hRWxlbWVudCgKLSAgICAgICAgV3JpdGVyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBTY2hlbWFFbGVtZW50IHNjaGVtYUVsZW1lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBzY2hlbWFFbGVtZW50LmdldFFOYW1lKCk7Ci0KLSAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnQuZGVjbGFyZXNQcmVmaXhlcygpKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnB1c2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhuYW1lKTsKLQotICAgICAgICBpZiAoc2NoZW1hRWxlbWVudC5kZWNsYXJlc1ByZWZpeGVzKCkpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYUVsZW1lbnQucHJlZml4ZXMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzY2hlbWFFbGVtZW50LmdldFVSSUZvclByZWZpeChwcmVmaXgpOwotICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVOYW1lc3BhY2VEZWNsYXJhdGlvbihwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5kZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYUVsZW1lbnQuYXR0cmlidXRlcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoU2NoZW1hQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmdldFZhbHVlKGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRRTmFtZVN0cmluZyhhdHRyaWJ1dGUuZ2V0UU5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRWYWx1ZShjb250ZXh0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFFbGVtZW50LmNoaWxkcmVuKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU2NoZW1hRWxlbWVudCBjaGlsZCA9IChTY2hlbWFFbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHdyaXRlU2NoZW1hRWxlbWVudChjb250ZXh0LCBjaGlsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKG5hbWUpOwotCi0gICAgICAgIGlmIChzY2hlbWFFbGVtZW50LmRlY2xhcmVzUHJlZml4ZXMoKSkgewotICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9VdGlsLmphdmEKaW5kZXggNDQ4ZWIzNC4uODc5Y2ZiZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9VdGlsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjAgKzI1LDE4IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZnJhbWV3b3JrLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7CiBpbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAogLyoqMgogICogRGVmaW5lcyB2YXJpb3VzIHV0aWxpdHkgbWV0aG9kcy4KQEAgLTc2LDkgKzc0LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5VGFnTlMoRWxlbWVudCBlbGVtZW50LCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmICghZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkKLSAgICAgICAgICAgIHx8IChlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiAhZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpKQorICAgICAgICBpZiAoIWlzVGFnTmFtZShlbGVtZW50LCBuYW1lKSkKICAgICAgICAgICAgIGZhaWwoCiAgICAgICAgICAgICAgICAgInBhcnNpbmcuaW52YWxpZFRhZ05TIiwKICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewpAQCAtODgsNiArODQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKX0pOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RhZ05hbWUoRWxlbWVudCBlbGVtZW50LCBRTmFtZSBuYW1lKXsKKyAgICAgICAgcmV0dXJuIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKQorICAgICAgICAgICAgJiYgKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSk7CisKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5VGFnTlNSb290RWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFFOYW1lIG5hbWUpIHsKICAgICAgICAgaWYgKCFlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKQogICAgICAgICAgICAgfHwgKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9WZXJzaW9uQ2hlY2tlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9WZXJzaW9uQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzUyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1ZlcnNpb25DaGVja2VyLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuamF4d3MuSkFYV1NCaW5kaW5nc0NvbnN0YW50czsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTG9jYXRvckltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxGaWx0ZXJJbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIENoZWNrcyB0aGUgamF4Yjp2ZXJzaW9uIGF0dHJpYnV0ZSBvbiBhIFhNTCBTY2hlbWEgZG9jdW1lbnQuCisgKgorICogamF4d3M6dmVyc2lvbiBpcyBvcHRpb25hbCwgaWYgYWJzZW50IGl0cyB2YWx1ZSBpcyBhc3N1bWVkIHRvIGJlICIyLjAiIGFuZCBpZiBwcmVzZW50IGl0cyB2YWx1ZSBtdXN0IGJlCisgKiAiMi4wIiBvciBtb3JlLgorICoKKyAqIEBhdXRob3IKKyAqICAgICBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKKyAqICAgICBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGNsYXNzIFZlcnNpb25DaGVja2VyIGV4dGVuZHMgWE1MRmlsdGVySW1wbCB7CisKKyAgICAvKioKKyAgICAgKiBXZSBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHZlcnNpb24gYXR0cmlidXRlIGluIHRoaXMgdmFyaWFibGUKKyAgICAgKiB3aGVuIHdlIGhpdCB0aGUgcm9vdCBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSBudWxsIDsKKworICAgIC8qKiBXaWxsIGJlIHNldCB0byB0cnVlIG9uY2Ugd2UgaGl0IHRoZSByb290IGVsZW1lbnQuICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNlZW5Sb290ID0gZmFsc2U7CisKKyAgICAvKiogV2lsbCBiZSBzZXQgdG8gdHJ1ZSBvbmNlIHdlIGhpdCBhIGJpbmRpbmcgZGVjbGFyYXRpb24uICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNlZW5CaW5kaW5ncyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3I7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCB0YWcgb2YgdGhlIHJvb3QgdGFnLgorICAgICAqLworICAgIHByaXZhdGUgTG9jYXRvciByb290VGFnU3RhcnQ7CisKKyAgICBwdWJsaWMgVmVyc2lvbkNoZWNrZXIoIFhNTFJlYWRlciBwYXJlbnQgKSB7CisgICAgICAgIHNldFBhcmVudChwYXJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBWZXJzaW9uQ2hlY2tlciggQ29udGVudEhhbmRsZXIgaGFuZGxlciwgRXJyb3JIYW5kbGVyIGVoLCBFbnRpdHlSZXNvbHZlciBlciApIHsKKyAgICAgICAgc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7CisgICAgICAgIGlmKGVoIT1udWxsKSAgICBzZXRFcnJvckhhbmRsZXIoZWgpOworICAgICAgICBpZihlciE9bnVsbCkgICAgc2V0RW50aXR5UmVzb2x2ZXIoZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7CisKKyAgICAgICAgaWYoIXNlZW5Sb290KSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSByb290IGVsZW1lbnQKKyAgICAgICAgICAgIHNlZW5Sb290ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJvb3RUYWdTdGFydCA9IG5ldyBMb2NhdG9ySW1wbChsb2NhdG9yKTsKKworICAgICAgICAgICAgdmVyc2lvbiA9IGF0dHMuZ2V0VmFsdWUoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhXU19CSU5ESU5HUywidmVyc2lvbiIpOworICAgICAgICAgICAgaWYoIG5hbWVzcGFjZVVSSS5lcXVhbHMoSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhXU19CSU5ESU5HUykgKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24yID0gYXR0cy5nZXRWYWx1ZSgiIiwidmVyc2lvbiIpOworICAgICAgICAgICAgICAgIGlmKCB2ZXJzaW9uIT1udWxsICYmIHZlcnNpb24yIT1udWxsICkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGJvdGggQHZlcnNpb24gYW5kIEBqYXhiOnZlcnNpb24uIGVycm9yLgorICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBlID0gbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgV3NkbE1lc3NhZ2VzLklOVEVSTkFMSVpFUl9UV09fVkVSU0lPTl9BVFRSSUJVVEVTKCksIGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckhhbmRsZXIoKS5lcnJvcihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9BY2NvcmRpbmcgdG8gSkFYV1MgMi4wIHNwZWMsIGlmIHZlcnNpb24gYXR0cmlidXRlIGlzIG1pc3NpbmcgaXRzIGFzc3VtZWQgdG8gYmUgIjIuMCIKKyAgICAgICAgICAgICAgICBpZiggdmVyc2lvbj09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9ICh2ZXJzaW9uMiE9bnVsbCk/dmVyc2lvbjI6IjIuMCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLk5TX0pBWFdTX0JJTkRJTkdTLmVxdWFscyhuYW1lc3BhY2VVUkkpKXsKKyAgICAgICAgICAgIHNlZW5CaW5kaW5ncyA9IHRydWU7CisgICAgICAgICAgICBpZih2ZXJzaW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgdmVyc2lvbiA9ICIyLjAiOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdXBlci5lbmREb2N1bWVudCgpOworCisgICAgICAgIGlmKCBzZWVuQmluZGluZ3MgJiYgdmVyc2lvbj09bnVsbCApIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIHNlZSBhIGJpbmRpbmcgZGVjbGFyYXRpb24gYnV0IG5vdCB2ZXJzaW9uIGF0dHJpYnV0ZQorICAgICAgICAgICAgU0FYUGFyc2VFeGNlcHRpb24gZSA9IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihXc2RsTWVzc2FnZXMuSU5URVJOQUxJWkVSX1ZFUlNJT05fTk9UX1BSRVNFTlQoKSwgcm9vdFRhZ1N0YXJ0KTsKKyAgICAgICAgICAgIGdldEVycm9ySGFuZGxlcigpLmVycm9yKGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgcHJlc2VudCwgdGhlIHZhbHVlIG11c3QgYmUgPj0gMi4wCisgICAgICAgIGlmKCB2ZXJzaW9uIT1udWxsICYmICFWRVJTSU9OUy5jb250YWlucyh2ZXJzaW9uKSApIHsKKyAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uIGUgPSBuZXcgU0FYUGFyc2VFeGNlcHRpb24oV3NkbE1lc3NhZ2VzLklOVEVSTkFMSVpFUl9JTkNPUlJFQ1RfVkVSU0lPTigpLCByb290VGFnU3RhcnQpOworICAgICAgICAgICAgZ2V0RXJyb3JIYW5kbGVyKCkuZXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKKyAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBWRVJTSU9OUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgiMi4wIiwiMi4xIikpOworCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1czQ0FkZHJlc3NpbmdFeHRlbnNpb25IYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1czQ0FkZHJlc3NpbmdFeHRlbnNpb25IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0OGE4OAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvVzNDQWRkcmVzc2luZ0V4dGVuc2lvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworLyoKKyAqICRJZDogVzNDQWRkcmVzc2luZ0V4dGVuc2lvbkhhbmRsZXIuamF2YSx2IDEuMS4yLjkgMjAwNy8wMi8wNiAwMDozMzozOCBrb2hzdWtlIEV4cCAkCisgKi8KKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOworCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETFBhcnNlckNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuV3NkbE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5GYXVsdDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuSW5wdXQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50Lk91dHB1dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK3B1YmxpYyBjbGFzcyBXM0NBZGRyZXNzaW5nRXh0ZW5zaW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlciB7CisgICAgcHJpdmF0ZSBFcnJvclJlY2VpdmVyIGVyclJlY2VpdmVyOworCisgICAgcHVibGljIFczQ0FkZHJlc3NpbmdFeHRlbnNpb25IYW5kbGVyKE1hcDxTdHJpbmcsIEFic3RyYWN0RXh0ZW5zaW9uSGFuZGxlcj4gZXh0ZW5zaW9uSGFuZGxlck1hcCkgeworICAgICAgICB0aGlzKGV4dGVuc2lvbkhhbmRsZXJNYXAsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBXM0NBZGRyZXNzaW5nRXh0ZW5zaW9uSGFuZGxlcihNYXA8U3RyaW5nLCBBYnN0cmFjdEV4dGVuc2lvbkhhbmRsZXI+IGV4dGVuc2lvbkhhbmRsZXJNYXAsIEVycm9yUmVjZWl2ZXIgZXJyUmVjZWl2ZXIpIHsKKyAgICAgICAgc3VwZXIoZXh0ZW5zaW9uSGFuZGxlck1hcCk7CisgICAgICAgIHRoaXMuZXJyUmVjZWl2ZXIgPSBlcnJSZWNlaXZlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIEFkZHJlc3NpbmdWZXJzaW9uLlczQy53c2RsTnNVcmk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFFOYW1lIGdldEFjdGlvblFOYW1lKCkgeworICAgICAgICByZXR1cm4gQWRkcmVzc2luZ1ZlcnNpb24uVzNDLndzZGxBY3Rpb25UYWc7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFFOYW1lIGdldFdTRExFeHRlbnNpb25RTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIEFkZHJlc3NpbmdWZXJzaW9uLlczQy53c2RsRXh0ZW5zaW9uVGFnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUJpbmRpbmdFeHRlbnNpb24oVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgICAgICBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZSwgZ2V0V1NETEV4dGVuc2lvblFOYW1lKCkpKSB7CisgICAgICAgICAgICBjb250ZXh0LnB1c2goKTsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOworCisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIFVzaW5nQWRkcmVzc2luZyBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYW5kIHN0b3JlCisgICAgICAgICAgICAvLyBUT0RPOiBpdCBhcyBleHRlbnNpb24gaW4gInBhcmVudCIuIEl0IG1heSBiZSB1c2VkIHRvIGdlbmVyYXRlCisgICAgICAgICAgICAvLyBUT0RPOiBAQWN0aW9uL0BGYXVsdEFjdGlvbiBsYXRlci4KKworICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsgLy8ga2VlcCBjb21waWxlciBoYXBweQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUlucHV0RXh0ZW5zaW9uKFRXU0RMUGFyc2VyQ29udGV4dCBjb250ZXh0LCBUV1NETEV4dGVuc2libGUgcGFyZW50LCBFbGVtZW50IGUpIHsKKyAgICAgICAgU3RyaW5nIGFjdGlvblZhbHVlID0gWG1sVXRpbC5nZXRBdHRyaWJ1dGVOU09yTnVsbChlLCBnZXRBY3Rpb25RTmFtZSgpKTsKKyAgICAgICAgaWYgKGFjdGlvblZhbHVlID09IG51bGwgfHwgYWN0aW9uVmFsdWUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgcmV0dXJuIHdhcm5FbXB0eUFjdGlvbihwYXJlbnQsIGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC5wdXNoKCk7CisgICAgICAgICgoSW5wdXQpcGFyZW50KS5zZXRBY3Rpb24oYWN0aW9uVmFsdWUpOworICAgICAgICBjb250ZXh0LnBvcCgpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU91dHB1dEV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgIFN0cmluZyBhY3Rpb25WYWx1ZSA9IFhtbFV0aWwuZ2V0QXR0cmlidXRlTlNPck51bGwoZSwgZ2V0QWN0aW9uUU5hbWUoKSk7CisgICAgICAgIGlmIChhY3Rpb25WYWx1ZSA9PSBudWxsIHx8IGFjdGlvblZhbHVlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiB3YXJuRW1wdHlBY3Rpb24ocGFyZW50LGNvbnRleHQuZ2V0TG9jYXRpb24oZSkpOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC5wdXNoKCk7CisgICAgICAgICgoT3V0cHV0KXBhcmVudCkuc2V0QWN0aW9uKGFjdGlvblZhbHVlKTsKKyAgICAgICAgY29udGV4dC5wb3AoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdEV4dGVuc2lvbihUV1NETFBhcnNlckNvbnRleHQgY29udGV4dCwgVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgRWxlbWVudCBlKSB7CisgICAgICAgIFN0cmluZyBhY3Rpb25WYWx1ZSA9IFhtbFV0aWwuZ2V0QXR0cmlidXRlTlNPck51bGwoZSwgZ2V0QWN0aW9uUU5hbWUoKSk7CisgICAgICAgIGlmIChhY3Rpb25WYWx1ZSA9PSBudWxsIHx8IGFjdGlvblZhbHVlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGVyclJlY2VpdmVyLndhcm5pbmcoY29udGV4dC5nZXRMb2NhdGlvbihlKSwgV3NkbE1lc3NhZ2VzLldBUk5JTkdfRkFVTFRfRU1QVFlfQUNUSU9OKHBhcmVudC5nZXROYW1lVmFsdWUoKSwgcGFyZW50LmdldFdTRExFbGVtZW50TmFtZSgpLmdldExvY2FsUGFydCgpLCBwYXJlbnQuZ2V0UGFyZW50KCkuZ2V0TmFtZVZhbHVlKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8ga2VlcCBjb21waWxlciBoYXBweQorICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC5wdXNoKCk7CisgICAgICAgICgoRmF1bHQpcGFyZW50KS5zZXRBY3Rpb24oYWN0aW9uVmFsdWUpOworICAgICAgICBjb250ZXh0LnBvcCgpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVBvcnRFeHRlbnNpb24oVFdTRExQYXJzZXJDb250ZXh0IGNvbnRleHQsIFRXU0RMRXh0ZW5zaWJsZSBwYXJlbnQsIEVsZW1lbnQgZSkgeworICAgICAgICByZXR1cm4gaGFuZGxlQmluZGluZ0V4dGVuc2lvbihjb250ZXh0LCBwYXJlbnQsIGUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB3YXJuRW1wdHlBY3Rpb24oVFdTRExFeHRlbnNpYmxlIHBhcmVudCwgTG9jYXRvciBwb3MpIHsKKyAgICAgICAgZXJyUmVjZWl2ZXIud2FybmluZyhwb3MsIFdzZGxNZXNzYWdlcy5XQVJOSU5HX0lOUFVUX09VVFBVVF9FTVBUWV9BQ1RJT04ocGFyZW50LmdldFdTRExFbGVtZW50TmFtZSgpLmdldExvY2FsUGFydCgpLCBwYXJlbnQuZ2V0UGFyZW50KCkuZ2V0TmFtZVZhbHVlKCkpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBrZWVwIGNvbXBpbGVyIGhhcHB5CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XU0RMSW50ZXJuYWxpemF0aW9uTG9naWMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETEludGVybmFsaXphdGlvbkxvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1ZjgyMQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETEludGVybmFsaXphdGlvbkxvZ2ljLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCisKK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5XU0RMQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5qYXh3cy5KQVhXU0JpbmRpbmdzQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnV0aWwuRE9NVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKKworLyoqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgY2xhc3MgV1NETEludGVybmFsaXphdGlvbkxvZ2ljIGltcGxlbWVudHMgSW50ZXJuYWxpemF0aW9uTG9naWN7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZpbHRlciBsb29rcyBmb3IgJmx0O3hzOmltcG9ydD4gYW5kICZsdDt4czppbmNsdWRlPgorICAgICAqIGFuZCBwYXJzZXMgdGhvc2UgZG9jdW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWZlcmVuY2VGaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZmVyZW5jZUZpbmRlckltcGwgeworICAgICAgICBSZWZlcmVuY2VGaW5kZXIoIERPTUZvcmVzdCBwYXJlbnQgKSB7CisgICAgICAgICAgICBzdXBlcihwYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kRXh0ZXJuYWxSZXNvdXJjZSggU3RyaW5nIG5zVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpIHsKKyAgICAgICAgICAgIGlmKFdTRExDb25zdGFudHMuTlNfV1NETC5lcXVhbHMobnNVUkkpICYmICJpbXBvcnQiLmVxdWFscyhsb2NhbE5hbWUpKXsKKyAgICAgICAgICAgICAgICBpZihwYXJlbnQuaXNFeHRlbnNpb25Nb2RlKCkpeworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGFkZCBzdXBwb3J0IGZvciBpbXBvcnRpbmcgc2NoZW1hIHVzaW5nIHdzZGw6aW1wb3J0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBhdHRzLmdldFZhbHVlKCJsb2NhdGlvbiIpOworICAgICAgICAgICAgfWVsc2UgaWYoU2NoZW1hQ29uc3RhbnRzLk5TX1hTRC5lcXVhbHMobnNVUkkpICYmICJpbXBvcnQiLmVxdWFscyhsb2NhbE5hbWUpKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXR0cy5nZXRWYWx1ZSgic2NoZW1hTG9jYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBYTUxGaWx0ZXJJbXBsIGNyZWF0ZUV4dGVybmFsUmVmZXJlbmNlRmluZGVyKERPTUZvcmVzdCBwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VGaW5kZXIocGFyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0lmVmFsaWRUYXJnZXROb2RlKERPTUZvcmVzdCBwYXJlbnQsIEVsZW1lbnQgYmluZGluZ3MsIEVsZW1lbnQgdGFyZ2V0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRWxlbWVudCByZWZpbmVTY2hlbWFUYXJnZXQoRWxlbWVudCB0YXJnZXQpIHsKKyAgICAgICAgLy8gbG9vayBmb3IgZXhpc3RpbmcgeHM6YW5ub3RhdGlvbgorICAgICAgICBFbGVtZW50IGFubm90YXRpb24gPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudCh0YXJnZXQsIENvbnN0YW50cy5OU19YU0QsICJhbm5vdGF0aW9uIik7CisgICAgICAgIGlmKGFubm90YXRpb249PW51bGwpCisgICAgICAgICAgICAvLyBub25lIGV4aXN0cy4gbmVlZCB0byBtYWtlIG9uZQorICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGluc2VydFhNTFNjaGVtYUVsZW1lbnQoIHRhcmdldCwgImFubm90YXRpb24iICk7CisKKyAgICAgICAgLy8gdGhlbiBsb29rIGZvciBhcHBpbmZvCisgICAgICAgIEVsZW1lbnQgYXBwaW5mbyA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGFubm90YXRpb24sIENvbnN0YW50cy5OU19YU0QsICJhcHBpbmZvIiApOworICAgICAgICBpZihhcHBpbmZvPT1udWxsKQorICAgICAgICAgICAgLy8gbm9uZSBleGlzdHMuIG5lZWQgdG8gbWFrZSBvbmUKKyAgICAgICAgICAgIGFwcGluZm8gPSBpbnNlcnRYTUxTY2hlbWFFbGVtZW50KCBhbm5vdGF0aW9uLCAiYXBwaW5mbyIgKTsKKworICAgICAgICByZXR1cm4gYXBwaW5mbzsKKworICAgIH0KKworICAgIHB1YmxpYyBFbGVtZW50IHJlZmluZVdTRExUYXJnZXQoRWxlbWVudCB0YXJnZXQpeworICAgICAgICAvLyBsb29rIGZvciBleGlzdGluZyB4czphbm5vdGF0aW9uCisgICAgICAgIEVsZW1lbnQgSkFYV1NCaW5kaW5ncyA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KHRhcmdldCwgSkFYV1NCaW5kaW5nc0NvbnN0YW50cy5OU19KQVhXU19CSU5ESU5HUywgImJpbmRpbmdzIik7CisgICAgICAgIGlmKEpBWFdTQmluZGluZ3M9PW51bGwpCisgICAgICAgICAgICAvLyBub25lIGV4aXN0cy4gbmVlZCB0byBtYWtlIG9uZQorICAgICAgICAgICAgSkFYV1NCaW5kaW5ncyA9IGluc2VydEpBWFdTQmluZGluZ3NFbGVtZW50KHRhcmdldCwgImJpbmRpbmdzIiApOworICAgICAgICByZXR1cm4gSkFYV1NCaW5kaW5nczsKKyAgICB9CisKKyAgICBwcml2YXRlIEVsZW1lbnQgaW5zZXJ0SkFYV1NCaW5kaW5nc0VsZW1lbnQoIEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbG9jYWxOYW1lICkgeworICAgICAgICBTdHJpbmcgcW5hbWUgPSAiSkFYV1M6Iitsb2NhbE5hbWU7CisKKyAgICAgICAgRWxlbWVudCBjaGlsZCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKEpBWFdTQmluZGluZ3NDb25zdGFudHMuTlNfSkFYV1NfQklORElOR1MsIHFuYW1lICk7CisKKyAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOworCisgICAgICAgIGlmKCBjaGlsZHJlbi5nZXRMZW5ndGgoKT09MCApCisgICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKCBjaGlsZCwgY2hpbGRyZW4uaXRlbSgwKSApOworCisgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgWE1MIFNjaGVtYSBlbGVtZW50IG9mIHRoZSBnaXZlbiBsb2NhbCBuYW1lCisgICAgICogYW5kIGluc2VydCBpdCBhcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGdpdmVuIHBhcmVudCBub2RlLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgTmV3bHkgY3JlYXRlIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBFbGVtZW50IGluc2VydFhNTFNjaGVtYUVsZW1lbnQoIEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbG9jYWxOYW1lICkgeworICAgICAgICAvLyB1c2UgdGhlIHNhbWUgcHJlZml4IGFzIHRoZSBwYXJlbnQgbm9kZSB0byBhdm9pZCBtb2RpZnlpbmcKKyAgICAgICAgLy8gdGhlIG5hbWVzcGFjZSBiaW5kaW5nLgorICAgICAgICBTdHJpbmcgcW5hbWUgPSBwYXJlbnQuZ2V0VGFnTmFtZSgpOworICAgICAgICBpbnQgaWR4ID0gcW5hbWUuaW5kZXhPZignOicpOworICAgICAgICBpZihpZHg9PS0xKSAgICAgcW5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgIGVsc2UgICAgICAgICAgICBxbmFtZSA9IHFuYW1lLnN1YnN0cmluZygwLGlkeCsxKStsb2NhbE5hbWU7CisKKyAgICAgICAgRWxlbWVudCBjaGlsZCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKCBDb25zdGFudHMuTlNfWFNELCBxbmFtZSApOworCisgICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKKworICAgICAgICBpZiggY2hpbGRyZW4uZ2V0TGVuZ3RoKCk9PTAgKQorICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSggY2hpbGQsIGNoaWxkcmVuLml0ZW0oMCkgKTsKKworICAgICAgICByZXR1cm4gY2hpbGQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1dTRExQYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETFBhcnNlci5qYXZhCmluZGV4IDkzZDNjZjkuLmMzYmY4YWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETFBhcnNlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETFBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDQyICsyNSwxMyBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkpBWFdTVXRpbHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLnhtbC5OdWxsRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5hcGkud3NkbC5UV1NETEV4dGVuc2lvbkhhbmRsZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5yZXNvdXJjZXMuV3NkbE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLldzaW1wb3J0T3B0aW9uczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5FcnJvclJlY2VpdmVyRmlsdGVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5CaW5kaW5nOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5CaW5kaW5nRmF1bHQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkJpbmRpbmdJbnB1dDsKQEAgLTc5LDMwOSArNTAsMTkyIEBACiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlBvcnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlBvcnRUeXBlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5TZXJ2aWNlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5UeXBlczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETENvbnN0YW50czsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETERvY3VtZW50OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5qYXh3cy5KQVhXU0JpbmRpbmdzQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hS2luZHM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FbnRpdHk7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5QYXJzZXJDb250ZXh0OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuUGFyc2VyTGlzdGVuZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MucHJvY2Vzc29yLnV0aWwuUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5wcm9jZXNzb3IuY29uZmlnLldTRExNb2RlbEluZm87CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5UV1NETFBhcnNlckNvbnRleHRJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUZpbmRlcjsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiBBIHBhcnNlciBmb3IgV1NETCBkb2N1bWVudHMuCisgKiBBIHBhcnNlciBmb3IgV1NETCBkb2N1bWVudHMuIFRoaXMgcGFyc2VyIGlzIHVzZWQgb25seSBhdCB0aGUgdG9vbCB0aW1lLgorICogRXh0ZW5zaW9ucyBzaG91bGQgZXh0ZW5kIFRXU0RMRXh0ZW5zaW9uSGFuZGxlciwgc28gdGhhdCBpdCB3aWxsIGJlIGNhbGxlZCBkdXJpbmcKKyAqIHBhcnNpbmcgd3NkbCB0byBoYW5kbGUgd3NkbCBleHRlbmlzYmlsaXR5IGVsZW1lbnRzLiBHZW5lcmFsbHkgdGhlc2UgZXh0ZW5zaW9ucworICogd2lsbCBlZmZlY3QgdGhlIGFydGlmYWN0cyBnZW5lcmF0ZWQgZHVyaW5nIFdTREwgcHJvY2Vzc2luZy4KKyAqCisgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLlJ1bnRpbWVXU0RMUGFyc2VyIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgV1NETCBwYXJzaW5nCisgKiBhdCBydW50aW1lLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCiBwdWJsaWMgY2xhc3MgV1NETFBhcnNlciB7Ci0gICAgcHJpdmF0ZSBXU0RMTW9kZWxJbmZvIG1vZGVsSW5mbzsKLSAgICBwcml2YXRlIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyOwotICAgIC8vYWxsIHRoZSB3c2RsOmltcG9ydCBzeXN0ZW0gSWRzCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBpbXBvcnRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIC8vTWFwIHdoaWNoIGhvbGRzIHdzZGwgRG9jdW1lbnQocykgZm9yIGEgZ2l2ZW4gU3lzdGVtSWQKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIERvY3VtZW50PiB3c2RsRG9jdW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEb2N1bWVudD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEVycm9yUmVjZWl2ZXJGaWx0ZXIgZXJyUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBXc2ltcG9ydE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIE1ldGFkYXRhRmluZGVyIGZvcmVzdDsKIAotICAgIHByaXZhdGUgV1NETFBhcnNlcigpIHsKLSAgICAgICAgX2V4dGVuc2lvbkhhbmRsZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaFNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgLy93c2RsIGV4dGVuc2lvbiBoYW5kbGVycworICAgIHByaXZhdGUgZmluYWwgTWFwIGV4dGVuc2lvbkhhbmRsZXJzOworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8UGFyc2VyTGlzdGVuZXI+IGxpc3RlbmVyczsKKworICAgIHB1YmxpYyBXU0RMUGFyc2VyKFdzaW1wb3J0T3B0aW9ucyBvcHRpb25zLCBFcnJvclJlY2VpdmVyRmlsdGVyIGVyclJlY2VpdmVyKSB7CisgICAgICAgIHRoaXMuZXh0ZW5zaW9uSGFuZGxlcnMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLmVyclJlY2VpdmVyID0gZXJyUmVjZWl2ZXI7CiAKICAgICAgICAgLy8gcmVnaXN0ZXIgaGFuZGxlcnMgZm9yIGRlZmF1bHQgZXh0ZW5zaW9ucwotICAgICAgICByZWdpc3RlcihuZXcgU09BUEV4dGVuc2lvbkhhbmRsZXIoKSk7Ci0gICAgICAgIHJlZ2lzdGVyKG5ldyBIVFRQRXh0ZW5zaW9uSGFuZGxlcigpKTsKLSAgICAgICAgcmVnaXN0ZXIobmV3IE1JTUVFeHRlbnNpb25IYW5kbGVyKCkpOwotICAgICAgICByZWdpc3RlcihuZXcgU2NoZW1hRXh0ZW5zaW9uSGFuZGxlcigpKTsKLSAgICAgICAgcmVnaXN0ZXIobmV3IEpBWFdTQmluZGluZ0V4dGVuc2lvbkhhbmRsZXIoKSk7Ci0gICAgICAgIHJlZ2lzdGVyKG5ldyBTT0FQMTJFeHRlbnNpb25IYW5kbGVyKCkpOworICAgICAgICByZWdpc3RlcihuZXcgU09BUEV4dGVuc2lvbkhhbmRsZXIoZXh0ZW5zaW9uSGFuZGxlcnMpKTsKKyAgICAgICAgcmVnaXN0ZXIobmV3IEhUVFBFeHRlbnNpb25IYW5kbGVyKGV4dGVuc2lvbkhhbmRsZXJzKSk7CisgICAgICAgIHJlZ2lzdGVyKG5ldyBNSU1FRXh0ZW5zaW9uSGFuZGxlcihleHRlbnNpb25IYW5kbGVycykpOworICAgICAgICByZWdpc3RlcihuZXcgSkFYV1NCaW5kaW5nRXh0ZW5zaW9uSGFuZGxlcihleHRlbnNpb25IYW5kbGVycykpOworICAgICAgICByZWdpc3RlcihuZXcgU09BUDEyRXh0ZW5zaW9uSGFuZGxlcihleHRlbnNpb25IYW5kbGVycykpOworICAgICAgICByZWdpc3RlcihuZXcgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdFeHRlbnNpb25IYW5kbGVyKGV4dGVuc2lvbkhhbmRsZXJzLCBlcnJSZWNlaXZlcikpOworICAgICAgICByZWdpc3RlcihuZXcgVzNDQWRkcmVzc2luZ0V4dGVuc2lvbkhhbmRsZXIoZXh0ZW5zaW9uSGFuZGxlcnMsIGVyclJlY2VpdmVyKSk7CisKKyAgICAgICAgZm9yIChUV1NETEV4dGVuc2lvbkhhbmRsZXIgdGUgOiBTZXJ2aWNlRmluZGVyLmZpbmQoVFdTRExFeHRlbnNpb25IYW5kbGVyLmNsYXNzKSkgeworICAgICAgICAgICAgcmVnaXN0ZXIodGUpOworICAgICAgICB9CisKICAgICB9CiAKLSAgICBwdWJsaWMgV1NETFBhcnNlcihXU0RMTW9kZWxJbmZvIG1vZGVsSW5mbykgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIGFzc2VydChtb2RlbEluZm8gIT0gbnVsbCk7Ci0gICAgICAgIHRoaXMubW9kZWxJbmZvID0gbW9kZWxJbmZvOwotICAgICAgICB0aGlzLmVudGl0eVJlc29sdmVyID0gbW9kZWxJbmZvLmdldEVudGl0eVJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoRXh0ZW5zaW9uSGFuZGxlciBoKSB7Ci0gICAgICAgIF9leHRlbnNpb25IYW5kbGVycy5wdXQoaC5nZXROYW1lc3BhY2VVUkkoKSwgaCk7Ci0gICAgICAgIGguc2V0RXh0ZW5zaW9uSGFuZGxlcnMoX2V4dGVuc2lvbkhhbmRsZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKEV4dGVuc2lvbkhhbmRsZXIgaCkgewotICAgICAgICBfZXh0ZW5zaW9uSGFuZGxlcnMucHV0KGguZ2V0TmFtZXNwYWNlVVJJKCksIG51bGwpOwotICAgICAgICBoLnNldEV4dGVuc2lvbkhhbmRsZXJzKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXIoU3RyaW5nIHVyaSkgewotICAgICAgICBfZXh0ZW5zaW9uSGFuZGxlcnMucHV0KHVyaSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9sbG93SW1wb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIF9mb2xsb3dJbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvbGxvd0ltcG9ydHMoYm9vbGVhbiBiKSB7Ci0gICAgICAgIF9mb2xsb3dJbXBvcnRzID0gYjsKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXIoVFdTRExFeHRlbnNpb25IYW5kbGVyIGgpIHsKKyAgICAgICAgZXh0ZW5zaW9uSGFuZGxlcnMucHV0KGguZ2V0TmFtZXNwYWNlVVJJKCksIGgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZFBhcnNlckxpc3RlbmVyKFBhcnNlckxpc3RlbmVyIGwpIHsKLSAgICAgICAgaWYgKF9saXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgX2xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFBhcnNlckxpc3RlbmVyPigpOwogICAgICAgICB9Ci0gICAgICAgIF9saXN0ZW5lcnMuYWRkKGwpOworICAgICAgICBsaXN0ZW5lcnMuYWRkKGwpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcnNlckxpc3RlbmVyKFBhcnNlckxpc3RlbmVyIGwpIHsKLSAgICAgICAgaWYgKF9saXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIF9saXN0ZW5lcnMucmVtb3ZlKGwpOwotICAgIH0KKyAgICBwdWJsaWMgV1NETERvY3VtZW50IHBhcnNlKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBmb3Jlc3QgPSBuZXcgTWV0YWRhdGFGaW5kZXIobmV3IFdTRExJbnRlcm5hbGl6YXRpb25Mb2dpYygpLCBvcHRpb25zLCBlcnJSZWNlaXZlcik7CisgICAgICAgIGZvcmVzdC5wYXJzZVdTREwoKTsKKyAgICAgICAgaWYoZm9yZXN0LmlzTWV4TWV0YWRhdGEpCisgICAgICAgICAgICBlcnJSZWNlaXZlci5yZXNldCgpOwogCi0vLyAgICBwdWJsaWMgV1NETERvY3VtZW50IHBhcnNlKElucHV0U291cmNlIHNvdXJjZSkgewotLy8gICAgICAgIF9tZXNzYWdlRmFjdG9yeSA9Ci0vLyAgICAgICAgICAgIG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy53c2RsIik7Ci0vLyAgICAgICAgX2xvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKLS8vCi0vLyAgICAgICAgV1NETERvY3VtZW50IGRvY3VtZW50ID0gbmV3IFdTRExEb2N1bWVudCgpOwotLy8gICAgICAgIGRvY3VtZW50LnNldFN5c3RlbUlkKHNvdXJjZS5nZXRTeXN0ZW1JZCgpKTsKLS8vICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQgPSBuZXcgUGFyc2VyQ29udGV4dChkb2N1bWVudCwgX2xpc3RlbmVycyk7Ci0vLyAgICAgICAgY29udGV4dC5zZXRGb2xsb3dJbXBvcnRzKF9mb2xsb3dJbXBvcnRzKTsKLS8vICAgICAgICBkb2N1bWVudC5zZXREZWZpbml0aW9ucyhwYXJzZURlZmluaXRpb25zKGNvbnRleHQsIHNvdXJjZSwgbnVsbCkpOwotLy8gICAgICAgIHJldHVybiBkb2N1bWVudDsKLS8vICAgIH0KLQotICAgIHB1YmxpYyBXU0RMRG9jdW1lbnQgcGFyc2UoKXsKLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gbW9kZWxJbmZvLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIGFzc2VydChsb2NhdGlvbiAhPSBudWxsKTsKLSAgICAgICAgX21lc3NhZ2VGYWN0b3J5ID0KLSAgICAgICAgICAgIG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLnJlc291cmNlcy53c2RsIik7Ci0gICAgICAgIF9sb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7Ci0KLSAgICAgICAgV1NETERvY3VtZW50IGRvY3VtZW50ID0gbmV3IFdTRExEb2N1bWVudCgpOwotICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICBTdHJpbmcgd3NkbExvYyA9IEpBWFdTVXRpbHMuYWJzb2x1dGl6ZShKQVhXU1V0aWxzLmdldEZpbGVPclVSTE5hbWUobG9jYXRpb24pKTsKLSAgICAgICAgaWYoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNvdXJjZSA9IGVudGl0eVJlc29sdmVyLnJlc29sdmVFbnRpdHkobnVsbCwgd3NkbExvYyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLnNheEV4Y2VwdGlvbldpdGhTeXN0ZW1JZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0U3lzdGVtSWQoKSxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oInBhcnNpbmcuc2F4RXhjZXB0aW9uIixlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcuaW9FeGNlcHRpb25XaXRoU3lzdGVtSWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFN5c3RlbUlkKCksZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzaW5nLmlvRXhjZXB0aW9uIixlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vIHBhcnNlIGV4dGVybmFsIGJpbmRpbmcgZmlsZXMKKyAgICAgICAgZm9yIChJbnB1dFNvdXJjZSB2YWx1ZSA6IG9wdGlvbnMuZ2V0V1NETEJpbmRpbmdzKCkpIHsKKyAgICAgICAgICAgIGVyclJlY2VpdmVyLnBvbGxBYm9ydCgpOworICAgICAgICAgICAgRG9jdW1lbnQgcm9vdCA9IGZvcmVzdC5wYXJzZSh2YWx1ZSwgdHJ1ZSk7IC8vIFRPRE86IEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgZmFsc2UgLSBLSworICAgICAgICAgICAgaWYocm9vdD09bnVsbCkgICAgICAgY29udGludWU7ICAgLy8gZXJyb3IgbXVzdCBoYXZlIGJlZW4gcmVwb3J0ZWQKKyAgICAgICAgICAgIEVsZW1lbnQgYmluZGluZyA9IHJvb3QuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoIWZpeE51bGwoYmluZGluZy5nZXROYW1lc3BhY2VVUkkoKSkuZXF1YWxzKEpBWFdTQmluZGluZ3NDb25zdGFudHMuTlNfSkFYV1NfQklORElOR1MpCisgICAgICAgICAgICAgICAgICAgIHx8ICFiaW5kaW5nLmdldExvY2FsTmFtZSgpLmVxdWFscygiYmluZGluZ3MiKSl7CisgICAgICAgICAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihiaW5kaW5nKSwgV3NkbE1lc3NhZ2VzLlBBUlNFUl9OT1RfQV9CSU5ESU5HX0ZJTEUoCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldE5hbWVzcGFjZVVSSSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZy5nZXRMb2NhbE5hbWUoKSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOb2RlTGlzdCBubCA9IGJpbmRpbmcuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKKyAgICAgICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgImhhbmRsZXItY2hhaW5zIik7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKyl7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5hZGRIYW5kbGVyQ2hhaW5Db25maWd1cmF0aW9uKChFbGVtZW50KSBubC5pdGVtKGkpKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICB9Ci0gICAgICAgIGlmKHNvdXJjZSA9PSBudWxsKXsKLSAgICAgICAgICAgIC8vZGVmYXVsdCByZXNvbHV0aW9uCi0gICAgICAgICAgICBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2Uod3NkbExvYyk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9jdW1lbnQuc2V0U3lzdGVtSWQod3NkbExvYyk7Ci0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCA9IG5ldyBQYXJzZXJDb250ZXh0KGRvY3VtZW50LCBfbGlzdGVuZXJzKTsKLSAgICAgICAgY29udGV4dC5zZXRGb2xsb3dJbXBvcnRzKF9mb2xsb3dJbXBvcnRzKTsKLSAgICAgICAgZG9jdW1lbnQuc2V0RGVmaW5pdGlvbnMocGFyc2VEZWZpbml0aW9ucyhjb250ZXh0LCBzb3VyY2UsIG51bGwpKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkV1NETERvY3VtZW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZml4TnVsbChTdHJpbmcgcykgeworICAgICAgICBpZihzPT1udWxsKSByZXR1cm4gIiI7CisgICAgICAgIGVsc2UgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhZGF0YUZpbmRlciBnZXRET01Gb3Jlc3QoKSB7CisgICAgICAgIHJldHVybiBmb3Jlc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBXU0RMRG9jdW1lbnQgYnVpbGRXU0RMRG9jdW1lbnQoKXsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEN1cnJlbnRseSB3ZSBhcmUgd29ya2luZyBvZmYgZmlyc3QgV1NETCBkb2N1bWVudAorICAgICAgICAgKiBUT0RPOiBhZGQgc3VwcG9ydCBvZiBjcmVhdGluZyBXU0RMRG9jdW1lbnQgZnJvbSBjb2xsZWN0aW9uIG9mIFdTREwgZG9jdW1lbnRzCisgICAgICAgICAqLworCisgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGZvcmVzdC5nZXRSb290V1NETCgpOworCisgICAgICAgIC8vSXQgbWVhbnMgdGhhdCBXU0RMIGlzIG5vdCBmb3VuZCwgYW4gZXJyb3IgbWlnaHQgaGF2ZSBiZWVuIHJlcG9ydGVkLCBsZXRzIHRyeSB0byByZWNvdmVyCisgICAgICAgIGlmKGxvY2F0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBEb2N1bWVudCByb290ID0gZm9yZXN0LmdldChsb2NhdGlvbik7CisKKyAgICAgICAgaWYocm9vdCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgV1NETERvY3VtZW50IGRvY3VtZW50ID0gbmV3IFdTRExEb2N1bWVudChmb3Jlc3QsIGVyclJlY2VpdmVyKTsKKyAgICAgICAgZG9jdW1lbnQuc2V0U3lzdGVtSWQobG9jYXRpb24pOworICAgICAgICBUV1NETFBhcnNlckNvbnRleHRJbXBsIGNvbnRleHQgPSBuZXcgVFdTRExQYXJzZXJDb250ZXh0SW1wbChmb3Jlc3QsIGRvY3VtZW50LCBsaXN0ZW5lcnMsIGVyclJlY2VpdmVyKTsKKworICAgICAgICBEZWZpbml0aW9ucyBkZWZpbml0aW9ucyA9IHBhcnNlRGVmaW5pdGlvbnMoY29udGV4dCwgcm9vdCk7CisgICAgICAgIGRvY3VtZW50LnNldERlZmluaXRpb25zKGRlZmluaXRpb25zKTsKICAgICAgICAgcmV0dXJuIGRvY3VtZW50OwogICAgIH0KIAotICAgIHByb3RlY3RlZCBEZWZpbml0aW9ucyBwYXJzZURlZmluaXRpb25zKFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZSwgU3RyaW5nIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJKSB7CisgICAgcHJpdmF0ZSBEZWZpbml0aW9ucyBwYXJzZURlZmluaXRpb25zKFRXU0RMUGFyc2VyQ29udGV4dEltcGwgY29udGV4dCwgRG9jdW1lbnQgcm9vdCkgewogICAgICAgICBjb250ZXh0LnB1c2hXU0RMTG9jYXRpb24oKTsKICAgICAgICAgY29udGV4dC5zZXRXU0RMTG9jYXRpb24oY29udGV4dC5nZXREb2N1bWVudCgpLmdldFN5c3RlbUlkKCkpOwotICAgICAgICBTdHJpbmcgc3lzSWQgPSBjb250ZXh0LmdldERvY3VtZW50KCkuZ2V0U3lzdGVtSWQoKTsKLSAgICAgICAgYnVpbGREb2N1bWVudEZyb21XU0RMKHN5c0lkLCBzb3VyY2UsIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJKTsKLSAgICAgICAgRG9jdW1lbnQgcm9vdCA9IHdzZGxEb2N1bWVudHMuZ2V0KHN5c0lkKTsKIAotICAgICAgICAvL0ludGVybmFsaXplci50cmFuc2Zvcm0gdGFrZXMgU2V0IG9mIGpheHdzOmJpbmRpbmdzIGVsZW1lbnRzLCB0aGlzIGlzIHRvIGFsbG93IG11bHRpcGxlIGV4dGVybmFsCi0gICAgICAgIC8vYmluZGluZ3MgdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICAgIG5ldyBJbnRlcm5hbGl6ZXIoKS50cmFuc2Zvcm0obW9kZWxJbmZvLmdldEpBWFdTQmluZGluZ3MoKSwgd3NkbERvY3VtZW50cywKLSAgICAgICAgICAgICAgICAoUHJvY2Vzc29yRW52aXJvbm1lbnQpbW9kZWxJbmZvLmdldFBhcmVudCgpLmdldEVudmlyb25tZW50KCkpOworICAgICAgICBuZXcgSW50ZXJuYWxpemVyKGZvcmVzdCwgb3B0aW9ucywgZXJyUmVjZWl2ZXIpLnRyYW5zZm9ybSgpOwogCiAgICAgICAgIC8vcHJpbnQgdGhlIHdzZGwKIC8vICAgICAgICB0cnl7Ci0vLyAgICAgICAgICAgIGR1bXAoU3lzdGVtLm91dCk7CisvLyAgICAgICAgICAgIGZvcmVzdC5kdW1wKFN5c3RlbS5vdXQpOwogLy8gICAgICAgIH1jYXRjaChJT0V4Y2VwdGlvbiBlKXsKIC8vICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKIC8vICAgICAgICB9CiAKLSAgICAgICAgRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMgPSBwYXJzZURlZmluaXRpb25zTm9JbXBvcnQoY29udGV4dCwgcm9vdCwgZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2VVUkkpOwotICAgICAgICBwcm9jZXNzSW1wb3J0cyhjb250ZXh0LCBzb3VyY2UsIGRlZmluaXRpb25zKTsKKyAgICAgICAgRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMgPSBwYXJzZURlZmluaXRpb25zTm9JbXBvcnQoY29udGV4dCwgcm9vdCk7CisgICAgICAgIGlmKGRlZmluaXRpb25zID09IG51bGwpeworICAgICAgICAgICAgTG9jYXRvciBsb2NhdG9yID0gZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKHJvb3QuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOworICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IobG9jYXRvciwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfTk9UX0FXU0RMKGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSkpOworCisgICAgICAgIH0KKyAgICAgICAgcHJvY2Vzc0ltcG9ydHMoY29udGV4dCk7CiAgICAgICAgIGNvbnRleHQucG9wV1NETExvY2F0aW9uKCk7CiAgICAgICAgIHJldHVybiBkZWZpbml0aW9uczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQKLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogQHBhcmFtIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkRG9jdW1lbnRGcm9tV1NETChTdHJpbmcgc3lzdGVtSWQsIElucHV0U291cmNlIHNvdXJjZSwgU3RyaW5nIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgYnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICBidWlsZGVyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXJyKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBpZihlbnRpdHlSZXNvbHZlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IE51bGxFbnRpdHlSZXNvbHZlcigpKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICB3c2RsRG9jdW1lbnRzLnB1dChzeXN0ZW1JZCwgZG9jdW1lbnQpOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIFV0aWwudmVyaWZ5VGFnTlNSb290RWxlbWVudChlLCBXU0RMQ29uc3RhbnRzLlFOQU1FX0RFRklOSVRJT05TKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIF90YXJnZXROYW1lc3BhY2VVUkkgPQotICAgICAgICAgICAgICAgICAgICBYbWxVdGlsLmdldEF0dHJpYnV0ZU9yTnVsbChlLCBDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsKLQotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSS5lcXVhbHMoX3RhcmdldE5hbWVzcGFjZVVSSSkpewotICAgICAgICAgICAgICAgICAgICAvL1RPRE86IHRocm93IGFuIGV4Y2VwdGlvbj8/PwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IFhtbFV0aWwuZ2V0QWxsQ2hpbGRyZW4oZSk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGUyID0gVXRpbC5uZXh0RWxlbWVudChpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIHRvIHNlZSBpZiBpdCBoYXMgaW1wb3J0cwotICAgICAgICAgICAgICAgICAgICBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZTIsIFdTRExDb25zdGFudHMuUU5BTUVfSU1QT1JUKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gVXRpbC5nZXRSZXF1aXJlZEF0dHJpYnV0ZShlMiwgQ29uc3RhbnRzLkFUVFJfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IFV0aWwuZ2V0UmVxdWlyZWRBdHRyaWJ1dGUoZTIsIENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gZ2V0QWRqdXN0ZWRMb2NhdGlvbihzb3VyY2UsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uICE9IG51bGwgJiYgIWxvY2F0aW9uLmVxdWFscygiIikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpbXBvcnRzLmNvbnRhaW5zKGxvY2F0aW9uKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW1wU291cmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBTb3VyY2UgPSBlbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5KG51bGwsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGltcFNvdXJjZT09bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShsb2NhdGlvbik7ICAvLyBkZWZhdWx0IHJlc29sdXRpb257Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGREb2N1bWVudEZyb21XU0RMKGxvY2F0aW9uLCBpbXBTb3VyY2UsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLmlvRXhjZXB0aW9uV2l0aFN5c3RlbUlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRTeXN0ZW1JZCgpLGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigicGFyc2luZy5pb0V4Y2VwdGlvbiIsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAicGFyc2luZy5zYXhFeGNlcHRpb25XaXRoU3lzdGVtSWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFN5c3RlbUlkKCksZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzaW5nLnNheEV4Y2VwdGlvbiIsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAicGFyc2luZy5wYXJzZXJDb25maWdFeGNlcHRpb24iLGUpOwotICAgICAgICB9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAicGFyc2luZy5mYWN0b3J5Q29uZmlnRXhjZXB0aW9uIixlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFkanVzdGVkTG9jYXRpb24oSW5wdXRTb3VyY2Ugc291cmNlLCBTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRTeXN0ZW1JZCgpID09IG51bGwKLSAgICAgICAgICAgID8gbG9jYXRpb24KLSAgICAgICAgICAgIDogVXRpbC5wcm9jZXNzU3lzdGVtSWRXaXRoQmFzZSgKLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0U3lzdGVtSWQoKSwKLSAgICAgICAgICAgICAgICBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHVtcHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmb3Jlc3QgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGEgZGVidWcgbWV0aG9kLiBBcyBzdWNoLCBlcnJvciBoYW5kbGluZyBpcyBzbG9wcHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZHVtcCggT3V0cHV0U3RyZWFtIG91dCApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgaWRlbnRpdHkgdHJhbnNmb3JtZXIKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIGl0ID0gWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpOwotCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cj13c2RsRG9jdW1lbnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KWl0ci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoICgiLS0tPDwgIitlLmdldEtleSgpKyJcbiIpLmdldEJ5dGVzKCkgKTsKLQotICAgICAgICAgICAgICAgIGl0LnRyYW5zZm9ybSggbmV3IERPTVNvdXJjZSgoRG9jdW1lbnQpZS5nZXRWYWx1ZSgpKSwgbmV3IFN0cmVhbVJlc3VsdChvdXQpICk7Ci0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoICJcblxuXG4iLmdldEJ5dGVzKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCggVHJhbnNmb3JtZXJFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBXU0RMUGFyc2VyI3Byb2Nlc3NJbXBvcnRzKFBhcnNlckNvbnRleHQsIG9yZy54bWwuc2F4LklucHV0U291cmNlLCBEZWZpbml0aW9ucykKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW1wb3J0cyhQYXJzZXJDb250ZXh0IGNvbnRleHQsIElucHV0U291cmNlIHNvdXJjZSwgRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMpIHsKLSAgICAgICAgZm9yKFN0cmluZyBsb2NhdGlvbiA6IGltcG9ydHMpeworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV4RG9jcyhUV1NETFBhcnNlckNvbnRleHRJbXBsIGNvbnRleHQpeworICAgICAgICBmb3IoU3RyaW5nIGxvY2F0aW9uIDogZm9yZXN0Lmxpc3RTeXN0ZW1JRHMoKSl7CiAgICAgICAgICAgICBpZiAoIWNvbnRleHQuZ2V0RG9jdW1lbnQoKS5pc0ltcG9ydGVkRG9jdW1lbnQobG9jYXRpb24pKXsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9ucyBpbXBvcnRlZERlZmluaXRpb25zID0gcGFyc2VEZWZpbml0aW9uc05vSW1wb3J0KGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsRG9jdW1lbnRzLmdldChsb2NhdGlvbiksIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBmb3Jlc3QuZ2V0KGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBpZihkb2MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgRGVmaW5pdGlvbnMgaW1wb3J0ZWREZWZpbml0aW9ucyA9IHBhcnNlRGVmaW5pdGlvbnNOb0ltcG9ydChjb250ZXh0LCBkb2MpOworICAgICAgICAgICAgICAgIGlmKGltcG9ydGVkRGVmaW5pdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXREb2N1bWVudCgpLmFkZEltcG9ydGVkRW50aXR5KGltcG9ydGVkRGVmaW5pdGlvbnMpOworICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RG9jdW1lbnQoKS5hZGRJbXBvcnRlZERvY3VtZW50KGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ltcG9ydHMoVFdTRExQYXJzZXJDb250ZXh0SW1wbCBjb250ZXh0KSB7CisgICAgICAgIGZvcihTdHJpbmcgbG9jYXRpb24gOiBmb3Jlc3QuZ2V0RXh0ZXJuYWxSZWZlcmVuY2VzKCkpeworICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldERvY3VtZW50KCkuaXNJbXBvcnRlZERvY3VtZW50KGxvY2F0aW9uKSl7CisgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZm9yZXN0LmdldChsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgaWYoZG9jID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIERlZmluaXRpb25zIGltcG9ydGVkRGVmaW5pdGlvbnMgPSBwYXJzZURlZmluaXRpb25zTm9JbXBvcnQoY29udGV4dCwgZG9jKTsKICAgICAgICAgICAgICAgICBpZihpbXBvcnRlZERlZmluaXRpb25zID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RG9jdW1lbnQoKS5hZGRJbXBvcnRlZEVudGl0eShpbXBvcnRlZERlZmluaXRpb25zKTsKQEAgLTM5MCw5MyArMjQ0LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgRGVmaW5pdGlvbnMgcGFyc2VEZWZpbml0aW9uc05vSW1wb3J0KAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIElucHV0U291cmNlIHNvdXJjZSwKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBidWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIGJ1aWxkZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBidWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJvckhhbmRsZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IE51bGxFbnRpdHlSZXNvbHZlcigpKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2Uoc291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VEZWZpbml0aW9uc05vSW1wb3J0KAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLmlvRXhjZXB0aW9uV2l0aFN5c3RlbUlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRTeXN0ZW1JZCgpLGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigicGFyc2luZy5pb0V4Y2VwdGlvbiIsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAicGFyc2luZy5zYXhFeGNlcHRpb25XaXRoU3lzdGVtSWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFN5c3RlbUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oInBhcnNpbmcuc2F4RXhjZXB0aW9uIixlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzaW5nLnBhcnNlckNvbmZpZ0V4Y2VwdGlvbiIsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzaW5nLmZhY3RvcnlDb25maWdFeGNlcHRpb24iLGUpOworICAgIHByaXZhdGUgRGVmaW5pdGlvbnMgcGFyc2VEZWZpbml0aW9uc05vSW1wb3J0KAorICAgICAgICBUV1NETFBhcnNlckNvbnRleHRJbXBsIGNvbnRleHQsCisgICAgICAgIERvY3VtZW50IGRvYykgeworICAgICAgICBFbGVtZW50IGUgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgIC8vYXQgdGhpcyBwb2luanQgd2UgZXhwZWN0IGEgd3NkbCBvciBzY2hlbWEgZG9jdW1lbnQgdG8gYmUgZnVsbHkgcXVhbGlmaWVkCisgICAgICAgIGlmKGUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCB8fCAoIWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTRExDb25zdGFudHMuTlNfV1NETCkgfHwgIWUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkZWZpbml0aW9ucyIpKSl7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBEZWZpbml0aW9ucyBwYXJzZURlZmluaXRpb25zTm9JbXBvcnQoCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgRG9jdW1lbnQgZG9jLAotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUYXJnZXROYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgX3RhcmdldE5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgVXRpbC52ZXJpZnlUYWdOU1Jvb3RFbGVtZW50KHJvb3QsIFdTRExDb25zdGFudHMuUU5BTUVfREVGSU5JVElPTlMpOwotICAgICAgICByZXR1cm4gcGFyc2VEZWZpbml0aW9uc05vSW1wb3J0KAotICAgICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgIHJvb3QsCi0gICAgICAgICAgICBleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlZmluaXRpb25zIHBhcnNlRGVmaW5pdGlvbnNOb0ltcG9ydCgKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFbGVtZW50IGUsCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFRhcmdldE5hbWVzcGFjZVVSSSkgewogICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7CiAKLSAgICAgICAgRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMgPSBuZXcgRGVmaW5pdGlvbnMoY29udGV4dC5nZXREb2N1bWVudCgpKTsKKyAgICAgICAgRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMgPSBuZXcgRGVmaW5pdGlvbnMoY29udGV4dC5nZXREb2N1bWVudCgpLCBmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSkpOwogICAgICAgICBTdHJpbmcgbmFtZSA9IFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUsIENvbnN0YW50cy5BVFRSX05BTUUpOwogICAgICAgICBkZWZpbml0aW9ucy5zZXROYW1lKG5hbWUpOwogCi0gICAgICAgIF90YXJnZXROYW1lc3BhY2VVUkkgPQorICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJID0KICAgICAgICAgICAgIFhtbFV0aWwuZ2V0QXR0cmlidXRlT3JOdWxsKGUsIENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwogCi0gICAgICAgIGRlZmluaXRpb25zLnNldFRhcmdldE5hbWVzcGFjZVVSSShfdGFyZ2V0TmFtZXNwYWNlVVJJKTsKKyAgICAgICAgZGVmaW5pdGlvbnMuc2V0VGFyZ2V0TmFtZXNwYWNlVVJJKHRhcmdldE5hbWVzcGFjZVVSSSk7CiAKICAgICAgICAgYm9vbGVhbiBnb3REb2N1bWVudGF0aW9uID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gZ290VHlwZXMgPSBmYWxzZTsKQEAgLTQ4OCwyNCArMjc0LDIyIEBACiAKICAgICAgICAgICAgIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlMiwgV1NETENvbnN0YW50cy5RTkFNRV9ET0NVTUVOVEFUSU9OKSkgewogICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLm9ubHlPbmVEb2N1bWVudGF0aW9uQWxsb3dlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUyKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfT05MWV9PTkVfRE9DVU1FTlRBVElPTl9BTExPV0VEKGUuZ2V0TG9jYWxOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGdvdERvY3VtZW50YXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmKGRlZmluaXRpb25zLmdldERvY3VtZW50YXRpb24oKSA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucy5zZXREb2N1bWVudGF0aW9uKGdldERvY3VtZW50YXRpb25Gb3IoZTIpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZTIsIFdTRExDb25zdGFudHMuUU5BTUVfVFlQRVMpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdvdFR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLm9ubHlPbmVUeXBlc0FsbG93ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRBR19ERUZJTklUSU9OUyk7CisgICAgICAgICAgICAgICAgaWYgKGdvdFR5cGVzICYmICFvcHRpb25zLmlzRXh0ZW5zaW9uTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlMiksIFdzZGxNZXNzYWdlcy5QQVJTSU5HX09OTFlfT05FX1RZUEVTX0FMTE9XRUQoQ29uc3RhbnRzLlRBR19ERUZJTklUSU9OUykpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290VHlwZXMgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vYWRkIGFsbCB0aGUgd3NkbDp0eXBlIGVsZW1lbnRzIHRvIGxhdHRlciBtYWtlIGEgbGlzdCBvZiBhbGwgdGhlIHNjaGVtYSBlbGVtZW50cwogICAgICAgICAgICAgICAgIC8vIHRoYXQgd2lsbCBiZSBuZWVkZWQgdG8gY3JlYXRlIGpheGIgbW9kZWwKLSAgICAgICAgICAgICAgICBhZGRTY2hlbWFFbGVtZW50cyhlMik7Ci0KLSAgICAgICAgICAgICAgICAvL2RlZmluaXRpb25zLnNldFR5cGVzKHBhcnNlVHlwZXMoY29udGV4dCwgZGVmaW5pdGlvbnMsIGUyKSk7CisgICAgICAgICAgICAgICAgaWYoIW9wdGlvbnMuaXNFeHRlbnNpb25Nb2RlKCkpCisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlU2NoZW1hSW1wb3J0cyhlMik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUyLCBXU0RMQ29uc3RhbnRzLlFOQU1FX01FU1NBR0UpKSB7CiAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gcGFyc2VNZXNzYWdlKGNvbnRleHQsIGRlZmluaXRpb25zLCBlMik7CiAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMuYWRkKG1lc3NhZ2UpOwpAQCAtNTIxLDEwICszMDUsOCBAQAogICAgICAgICAgICAgICAgIGRlZmluaXRpb25zLmFkZChzZXJ2aWNlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZTIsIFdTRExDb25zdGFudHMuUU5BTUVfSU1QT1JUKSkgewogICAgICAgICAgICAgICAgIGRlZmluaXRpb25zLmFkZChwYXJzZUltcG9ydChjb250ZXh0LCBkZWZpbml0aW9ucywgZTIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoCi0gICAgICAgICAgICAgICAgKF91c2VXU0lCYXNpY1Byb2ZpbGUpCi0gICAgICAgICAgICAgICAgICAgICYmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlMiwgU2NoZW1hQ29uc3RhbnRzLlFOQU1FX0lNUE9SVCkpKSB7Ci0gICAgICAgICAgICAgICAgd2Fybigid2FybmluZy53c2kucjIwMDMiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZTIsIFNjaGVtYUNvbnN0YW50cy5RTkFNRV9JTVBPUlQpKSB7CisgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIud2FybmluZyhmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZTIpLCBXc2RsTWVzc2FnZXMuV0FSTklOR19XU0lfUl8yMDAzKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgLS0gbXVzdCBsaXZlIG91dHNpZGUgdGhlIFdTREwgbmFtZXNwYWNlCiAgICAgICAgICAgICAgICAgY2hlY2tOb3RXc2RsRWxlbWVudChlMik7CkBAIC01NDEsMTMgKzMyMywxMyBAQAogICAgICAgICByZXR1cm4gZGVmaW5pdGlvbnM7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2UgcGFyc2VNZXNzYWdlKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgcHJpdmF0ZSBNZXNzYWdlIHBhcnNlTWVzc2FnZSgKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0SW1wbCBjb250ZXh0LAogICAgICAgICBEZWZpbml0aW9ucyBkZWZpbml0aW9ucywKICAgICAgICAgRWxlbWVudCBlKSB7CiAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoZGVmaW5pdGlvbnMpOworICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShkZWZpbml0aW9ucywgZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBlcnJSZWNlaXZlcik7CiAgICAgICAgIFN0cmluZyBuYW1lID0gVXRpbC5nZXRSZXF1aXJlZEF0dHJpYnV0ZShlLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKICAgICAgICAgbWVzc2FnZS5zZXROYW1lKG5hbWUpOwogCkBAIC01ODIsMTAgKzM2NCwxMCBAQAogICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZVBhcnQgcGFyc2VNZXNzYWdlUGFydChQYXJzZXJDb250ZXh0IGNvbnRleHQsIEVsZW1lbnQgZSkgeworICAgIHByaXZhdGUgTWVzc2FnZVBhcnQgcGFyc2VNZXNzYWdlUGFydChUV1NETFBhcnNlckNvbnRleHRJbXBsIGNvbnRleHQsIEVsZW1lbnQgZSkgewogICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7Ci0gICAgICAgIE1lc3NhZ2VQYXJ0IHBhcnQgPSBuZXcgTWVzc2FnZVBhcnQoKTsKKyAgICAgICAgTWVzc2FnZVBhcnQgcGFydCA9IG5ldyBNZXNzYWdlUGFydChmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSkpOwogICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBVdGlsLmdldFJlcXVpcmVkQXR0cmlidXRlKGUsIENvbnN0YW50cy5BVFRSX05BTUUpOwogICAgICAgICBwYXJ0LnNldE5hbWUocGFydE5hbWUpOwogCkBAIC01OTUsMTkgKzM3NywyMCBAQAogCiAgICAgICAgIGlmIChlbGVtZW50QXR0ciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgicGFyc2luZy5vbmx5T25lT2ZFbGVtZW50T3JUeXBlUmVxdWlyZWQiLCBwYXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoY29udGV4dC5nZXRMb2NhdGlvbihlKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfT05MWV9PTkVfT0ZfRUxFTUVOVF9PUl9UWVBFX1JFUVVJUkVEKHBhcnROYW1lKSk7CisKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcGFydC5zZXREZXNjcmlwdG9yKGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZShlbGVtZW50QXR0cikpOworICAgICAgICAgICAgcGFydC5zZXREZXNjcmlwdG9yKGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZShjb250ZXh0LmdldExvY2F0aW9uKGUpLCBlbGVtZW50QXR0cikpOwogICAgICAgICAgICAgcGFydC5zZXREZXNjcmlwdG9yS2luZChTY2hlbWFLaW5kcy5YU0RfRUxFTUVOVCk7CiAgICAgICAgIH0gZWxzZSBpZiAodHlwZUF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFydC5zZXREZXNjcmlwdG9yKGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZSh0eXBlQXR0cikpOworICAgICAgICAgICAgcGFydC5zZXREZXNjcmlwdG9yKGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZShjb250ZXh0LmdldExvY2F0aW9uKGUpLCB0eXBlQXR0cikpOwogICAgICAgICAgICAgcGFydC5zZXREZXNjcmlwdG9yS2luZChTY2hlbWFLaW5kcy5YU0RfVFlQRSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBYWFgtTk9URSAtIHRoaXMgaXMgd3Jvbmc7IGZvciBleHRlbnNpYmlsaXR5IHB1cnBvc2VzLAogICAgICAgICAgICAgLy8gYW55IGF0dHJpYnV0ZSBjYW4gYmUgc3BlY2lmaWVkIG9uIGEgPHBhcnQ+IGVsZW1lbnQsIHNvCiAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHB1dCBhbiBleHRlbnNpYmlsaXR5IGhvb2sgaGVyZQotICAgICAgICAgICAgVXRpbC5mYWlsKCJwYXJzaW5nLmVsZW1lbnRPclR5cGVSZXF1aXJlZCIsIHBhcnROYW1lKTsKKyAgICAgICAgICAgIGVyclJlY2VpdmVyLndhcm5pbmcoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19FTEVNRU5UX09SX1RZUEVfUkVRVUlSRUQocGFydE5hbWUpKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnRleHQucG9wKCk7CkBAIC02MTUsMTMgKzM5OCwxMyBAQAogICAgICAgICByZXR1cm4gcGFydDsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgUG9ydFR5cGUgcGFyc2VQb3J0VHlwZSgKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgIHByaXZhdGUgUG9ydFR5cGUgcGFyc2VQb3J0VHlwZSgKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0SW1wbCBjb250ZXh0LAogICAgICAgICBEZWZpbml0aW9ucyBkZWZpbml0aW9ucywKICAgICAgICAgRWxlbWVudCBlKSB7CiAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKLSAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBuZXcgUG9ydFR5cGUoZGVmaW5pdGlvbnMpOworICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IG5ldyBQb3J0VHlwZShkZWZpbml0aW9ucywgZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBlcnJSZWNlaXZlcik7CiAgICAgICAgIFN0cmluZyBuYW1lID0gVXRpbC5nZXRSZXF1aXJlZEF0dHJpYnV0ZShlLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKICAgICAgICAgcG9ydFR5cGUuc2V0TmFtZShuYW1lKTsKIApAQCAtNjM0LDkgKzQxNyw3IEBACiAKICAgICAgICAgICAgIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlMiwgV1NETENvbnN0YW50cy5RTkFNRV9ET0NVTUVOVEFUSU9OKSkgewogICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLm9ubHlPbmVEb2N1bWVudGF0aW9uQWxsb3dlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoZS5nZXRMb2NhbE5hbWUoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBnb3REb2N1bWVudGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZihwb3J0VHlwZS5nZXREb2N1bWVudGF0aW9uKCkgPT0gbnVsbCkKQEAgLTY0NCw2ICs0MjUsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICgKICAgICAgICAgICAgICAgICBYbWxVdGlsLm1hdGNoZXNUYWdOUyhlMiwgV1NETENvbnN0YW50cy5RTkFNRV9PUEVSQVRJT04pKSB7CiAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wID0gcGFyc2VQb3J0VHlwZU9wZXJhdGlvbihjb250ZXh0LCBlMik7CisgICAgICAgICAgICAgICAgb3Auc2V0UGFyZW50KHBvcnRUeXBlKTsKICAgICAgICAgICAgICAgICBwb3J0VHlwZS5hZGQob3ApOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgLS0gbXVzdCBsaXZlIG91dHNpZGUgdGhlIFdTREwgbmFtZXNwYWNlCkBAIC02NjQsMTMgKzQ0NiwxMyBAQAogICAgICAgICByZXR1cm4gcG9ydFR5cGU7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIE9wZXJhdGlvbiBwYXJzZVBvcnRUeXBlT3BlcmF0aW9uKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgcHJpdmF0ZSBPcGVyYXRpb24gcGFyc2VQb3J0VHlwZU9wZXJhdGlvbigKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0SW1wbCBjb250ZXh0LAogICAgICAgICBFbGVtZW50IGUpIHsKICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOwogCi0gICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKCk7CisgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlKSk7CiAgICAgICAgIFN0cmluZyBuYW1lID0gVXRpbC5nZXRSZXF1aXJlZEF0dHJpYnV0ZShlLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKICAgICAgICAgb3BlcmF0aW9uLnNldE5hbWUobmFtZSk7CiAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJPcmRlckF0dHIgPQpAQCAtNjkxLDI5ICs0NzMsMjUgQEAKIAogICAgICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUyLCBXU0RMQ29uc3RhbnRzLlFOQU1FX0RPQ1VNRU5UQVRJT04pKSB7CiAgICAgICAgICAgICAgICAgaWYgKGdvdERvY3VtZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgVXRpbC5mYWlsKAotICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZTIpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoZTIuZ2V0TG9jYWxOYW1lKCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZ290RG9jdW1lbnRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgaWYob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb24oKSA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0RG9jdW1lbnRhdGlvbihnZXREb2N1bWVudGF0aW9uRm9yKGUyKSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUyLCBXU0RMQ29uc3RhbnRzLlFOQU1FX0lOUFVUKSkgewogICAgICAgICAgICAgICAgIGlmIChnb3RJbnB1dCkgewotICAgICAgICAgICAgICAgICAgICBVdGlsLmZhaWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAicGFyc2luZy50b29NYW55RWxlbWVudHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVEFHX0lOUFVULAorICAgICAgICAgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSksIFdzZGxNZXNzYWdlcy5QQVJTSU5HX1RPT19NQU5ZX0VMRU1FTlRTKENvbnN0YW50cy5UQUdfSU5QVVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRBR19PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZTIpOwotICAgICAgICAgICAgICAgIElucHV0IGlucHV0ID0gbmV3IElucHV0KCk7CisgICAgICAgICAgICAgICAgSW5wdXQgaW5wdXQgPSBuZXcgSW5wdXQoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUyKSwgZXJyUmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIGlucHV0LnNldFBhcmVudChvcGVyYXRpb24pOwogICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlQXR0ciA9CiAgICAgICAgICAgICAgICAgICAgIFV0aWwuZ2V0UmVxdWlyZWRBdHRyaWJ1dGUoZTIsIENvbnN0YW50cy5BVFRSX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIGlucHV0LnNldE1lc3NhZ2UoY29udGV4dC50cmFuc2xhdGVRdWFsaWZpZWROYW1lKG1lc3NhZ2VBdHRyKSk7CisgICAgICAgICAgICAgICAgaW5wdXQuc2V0TWVzc2FnZShjb250ZXh0LnRyYW5zbGF0ZVF1YWxpZmllZE5hbWUoY29udGV4dC5nZXRMb2NhdGlvbihlMiksIG1lc3NhZ2VBdHRyKSk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVBdHRyID0KICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbC5nZXRBdHRyaWJ1dGVPck51bGwoZTIsIENvbnN0YW50cy5BVFRSX05BTUUpOwogICAgICAgICAgICAgICAgIGlucHV0LnNldE5hbWUobmFtZUF0dHIpOwpAQCAtNzIzLDEwICs1MDEsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgaW5wdXRCZWZvcmVPdXRwdXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgZXh0ZW5zaWJsaXR5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gWG1sVXRpbC5nZXRBbGxBdHRyaWJ1dGVzKGUyKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ZXIyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0ciBlMyA9IChBdHRyKWl0ZXIyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUzLmdldExvY2FsTmFtZSgpLmVxdWFscyhDb25zdGFudHMuQVRUUl9NRVNTQUdFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZTMuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKENvbnN0YW50cy5BVFRSX05BTUUpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IC0tIG11c3QgbGl2ZSBvdXRzaWRlIHRoZSBXU0RMIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICBjaGVja05vdFdzZGxBdHRyaWJ1dGUoZTMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZUV4dGVuc2lvbihjb250ZXh0LCBpbnB1dCwgZTMsIGUyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBleHRlbnNpYmxpdHkgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHRocm93IGEgV0FSTklORworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYXQgbW9zdCBvbmUgY2hpbGQgZWxlbWVudCBhbmQgaXQgaXMgYSBkb2N1bWVudGF0aW9uIGVsZW1lbnQKICAgICAgICAgICAgICAgICBib29sZWFuIGdvdERvY3VtZW50YXRpb24yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyMiA9IFhtbFV0aWwuZ2V0QWxsQ2hpbGRyZW4oZTIpOwotICAgICAgICAgICAgICAgICAgICBpdGVyMi5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICBpdGVyMi5oYXNOZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGUzID0gVXRpbC5uZXh0RWxlbWVudChpdGVyMik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlMyA9PSBudWxsKQpAQCAtNzM1LDM2ICs1MzAsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbFV0aWwKICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaGVzVGFnTlMoZTMsIFdTRExDb25zdGFudHMuUU5BTUVfRE9DVU1FTlRBVElPTikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoZS5nZXRMb2NhbE5hbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZ290RG9jdW1lbnRhdGlvbjIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2V0RG9jdW1lbnRhdGlvbihnZXREb2N1bWVudGF0aW9uRm9yKGUzKSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVdGlsLmZhaWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcuaW52YWxpZEVsZW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUzLmdldFRhZ05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMy5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZTMpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19JTlZBTElEX0VMRU1FTlQoZTMuZ2V0VGFnTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUzLmdldE5hbWVzcGFjZVVSSSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZTIsIFdTRExDb25zdGFudHMuUU5BTUVfT1VUUFVUKSkgewogICAgICAgICAgICAgICAgIGlmIChnb3RPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgVXRpbC5mYWlsKAotICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcudG9vTWFueUVsZW1lbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRBR19PVVRQVVQsCisgICAgICAgICAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfVE9PX01BTllfRUxFTUVOVFMoQ29uc3RhbnRzLlRBR19JTlBVVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVEFHX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlMik7Ci0gICAgICAgICAgICAgICAgT3V0cHV0IG91dHB1dCA9IG5ldyBPdXRwdXQoKTsKKyAgICAgICAgICAgICAgICBPdXRwdXQgb3V0cHV0ID0gbmV3IE91dHB1dChmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZTIpLCBlcnJSZWNlaXZlcik7CisgICAgICAgICAgICAgICAgb3V0cHV0LnNldFBhcmVudChvcGVyYXRpb24pOwogICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlQXR0ciA9CiAgICAgICAgICAgICAgICAgICAgIFV0aWwuZ2V0UmVxdWlyZWRBdHRyaWJ1dGUoZTIsIENvbnN0YW50cy5BVFRSX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIG91dHB1dC5zZXRNZXNzYWdlKGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZShtZXNzYWdlQXR0cikpOworICAgICAgICAgICAgICAgIG91dHB1dC5zZXRNZXNzYWdlKGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZShjb250ZXh0LmdldExvY2F0aW9uKGUyKSwgbWVzc2FnZUF0dHIpKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZUF0dHIgPQogICAgICAgICAgICAgICAgICAgICBYbWxVdGlsLmdldEF0dHJpYnV0ZU9yTnVsbChlMiwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7CiAgICAgICAgICAgICAgICAgb3V0cHV0LnNldE5hbWUobmFtZUF0dHIpOwpAQCAtNzc0LDEwICs1NjMsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgaW5wdXRCZWZvcmVPdXRwdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBleHRlbnNpYmxpdHkgYXR0cmlidXRlcworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcjIgPSBYbWxVdGlsLmdldEFsbEF0dHJpYnV0ZXMoZTIpOworICAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBBdHRyIGUzID0gKEF0dHIpaXRlcjIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZTMuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKENvbnN0YW50cy5BVFRSX01FU1NBR0UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBlMy5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoQ29uc3RhbnRzLkFUVFJfTkFNRSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgLS0gbXVzdCBsaXZlIG91dHNpZGUgdGhlIFdTREwgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIGNoZWNrTm90V3NkbEF0dHJpYnV0ZShlMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlRXh0ZW5zaW9uKGNvbnRleHQsIG91dHB1dCwgZTMsIGUyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBleHRlbnNpYmxpdHkgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHRocm93IGEgV0FSTklORworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYXQgbW9zdCBvbmUgY2hpbGQgZWxlbWVudCBhbmQgaXQgaXMgYSBkb2N1bWVudGF0aW9uIGVsZW1lbnQKICAgICAgICAgICAgICAgICBib29sZWFuIGdvdERvY3VtZW50YXRpb24yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyMiA9IFhtbFV0aWwuZ2V0QWxsQ2hpbGRyZW4oZTIpOwotICAgICAgICAgICAgICAgICAgICBpdGVyMi5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICBpdGVyMi5oYXNOZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGUzID0gVXRpbC5uZXh0RWxlbWVudChpdGVyMik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlMyA9PSBudWxsKQpAQCAtNzg2LDM3ICs1OTIsNTEgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbFV0aWwKICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaGVzVGFnTlMoZTMsIFdTRExDb25zdGFudHMuUU5BTUVfRE9DVU1FTlRBVElPTikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoZS5nZXRMb2NhbE5hbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZ290RG9jdW1lbnRhdGlvbjIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNldERvY3VtZW50YXRpb24oZ2V0RG9jdW1lbnRhdGlvbkZvcihlMykpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5mYWlsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLmludmFsaWRFbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMy5nZXRUYWdOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTMuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUzKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfSU5WQUxJRF9FTEVNRU5UKGUzLmdldFRhZ05hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMy5nZXROYW1lc3BhY2VVUkkoKSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnRleHQucG9wKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUyLCBXU0RMQ29uc3RhbnRzLlFOQU1FX0ZBVUxUKSkgewogICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUyKTsKLSAgICAgICAgICAgICAgICBGYXVsdCBmYXVsdCA9IG5ldyBGYXVsdCgpOworICAgICAgICAgICAgICAgIEZhdWx0IGZhdWx0ID0gbmV3IEZhdWx0KGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlMikpOworICAgICAgICAgICAgICAgIGZhdWx0LnNldFBhcmVudChvcGVyYXRpb24pOwogICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlQXR0ciA9CiAgICAgICAgICAgICAgICAgICAgIFV0aWwuZ2V0UmVxdWlyZWRBdHRyaWJ1dGUoZTIsIENvbnN0YW50cy5BVFRSX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIGZhdWx0LnNldE1lc3NhZ2UoY29udGV4dC50cmFuc2xhdGVRdWFsaWZpZWROYW1lKG1lc3NhZ2VBdHRyKSk7CisgICAgICAgICAgICAgICAgZmF1bHQuc2V0TWVzc2FnZShjb250ZXh0LnRyYW5zbGF0ZVF1YWxpZmllZE5hbWUoY29udGV4dC5nZXRMb2NhdGlvbihlMiksIG1lc3NhZ2VBdHRyKSk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVBdHRyID0KICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbC5nZXRBdHRyaWJ1dGVPck51bGwoZTIsIENvbnN0YW50cy5BVFRSX05BTUUpOwogICAgICAgICAgICAgICAgIGZhdWx0LnNldE5hbWUobmFtZUF0dHIpOwogICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRGYXVsdChmYXVsdCk7CiAgICAgICAgICAgICAgICAgZ290RmF1bHQgPSB0cnVlOwogCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGV4dGVuc2libGl0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyMiA9IFhtbFV0aWwuZ2V0QWxsQXR0cmlidXRlcyhlMik7CisgICAgICAgICAgICAgICAgICAgICBpdGVyMi5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIEF0dHIgZTMgPSAoQXR0cilpdGVyMi5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlMy5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoQ29uc3RhbnRzLkFUVFJfTUVTU0FHRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUzLmdldExvY2FsTmFtZSgpLmVxdWFscyhDb25zdGFudHMuQVRUUl9OQU1FKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGV4dGVuc2liaWxpdHkgZWxlbWVudCAtLSBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgV1NETCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tOb3RXc2RsQXR0cmlidXRlKGUzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVFeHRlbnNpb24oY29udGV4dCwgZmF1bHQsIGUzLCBlMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZXh0ZW5zaWJsaXR5IGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB0aHJvdyBhIFdBUk5JTkcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIGNoaWxkIGVsZW1lbnQgYW5kIGl0IGlzIGEgZG9jdW1lbnRhdGlvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBnb3REb2N1bWVudGF0aW9uMiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcjIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOwogICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlMyA9IFV0aWwubmV4dEVsZW1lbnQoaXRlcjIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZTMgPT0gbnVsbCkKQEAgLTgyNSw5ICs2NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoWG1sVXRpbAogICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoZXNUYWdOUyhlMywgV1NETENvbnN0YW50cy5RTkFNRV9ET0NVTUVOVEFUSU9OKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvdERvY3VtZW50YXRpb24yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5mYWlsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2luZy5vbmx5T25lRG9jdW1lbnRhdGlvbkFsbG93ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSksIFdzZGxNZXNzYWdlcy5QQVJTSU5HX09OTFlfT05FX0RPQ1VNRU5UQVRJT05fQUxMT1dFRChlLmdldExvY2FsTmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3REb2N1bWVudGF0aW9uMiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihmYXVsdC5nZXREb2N1bWVudGF0aW9uKCkgPT0gbnVsbCkKQEAgLTg2OSw3ICs2ODcsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKGdvdE91dHB1dCAmJiAhZ290SW5wdXQgJiYgIWdvdEZhdWx0KSB7CiAgICAgICAgICAgICBvcGVyYXRpb24uc2V0U3R5bGUoT3BlcmF0aW9uU3R5bGUuTk9USUZJQ0FUSU9OKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFV0aWwuZmFpbCgicGFyc2luZy5pbnZhbGlkT3BlcmF0aW9uU3R5bGUiLCBuYW1lKTsKKyAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfSU5WQUxJRF9PUEVSQVRJT05fU1RZTEUobmFtZSkpOwogICAgICAgICB9CiAKICAgICAgICAgY29udGV4dC5wb3AoKTsKQEAgLTg3NywxNyArNjk1LDE3IEBACiAgICAgICAgIHJldHVybiBvcGVyYXRpb247CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIEJpbmRpbmcgcGFyc2VCaW5kaW5nKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgcHJpdmF0ZSBCaW5kaW5nIHBhcnNlQmluZGluZygKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0SW1wbCBjb250ZXh0LAogICAgICAgICBEZWZpbml0aW9ucyBkZWZpbml0aW9ucywKICAgICAgICAgRWxlbWVudCBlKSB7CiAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gbmV3IEJpbmRpbmcoZGVmaW5pdGlvbnMpOworICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBuZXcgQmluZGluZyhkZWZpbml0aW9ucywgZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBlcnJSZWNlaXZlcik7CiAgICAgICAgIFN0cmluZyBuYW1lID0gVXRpbC5nZXRSZXF1aXJlZEF0dHJpYnV0ZShlLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKICAgICAgICAgYmluZGluZy5zZXROYW1lKG5hbWUpOwogICAgICAgICBTdHJpbmcgdHlwZUF0dHIgPSBVdGlsLmdldFJlcXVpcmVkQXR0cmlidXRlKGUsIENvbnN0YW50cy5BVFRSX1RZUEUpOwotICAgICAgICBiaW5kaW5nLnNldFBvcnRUeXBlKGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZSh0eXBlQXR0cikpOworICAgICAgICBiaW5kaW5nLnNldFBvcnRUeXBlKGNvbnRleHQudHJhbnNsYXRlUXVhbGlmaWVkTmFtZShjb250ZXh0LmdldExvY2F0aW9uKGUpLCB0eXBlQXR0cikpOwogCiAgICAgICAgIGJvb2xlYW4gZ290RG9jdW1lbnRhdGlvbiA9IGZhbHNlOwogCkBAIC04OTgsOSArNzE2LDcgQEAKIAogICAgICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUyLCBXU0RMQ29uc3RhbnRzLlFOQU1FX0RPQ1VNRU5UQVRJT04pKSB7CiAgICAgICAgICAgICAgICAgaWYgKGdvdERvY3VtZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgVXRpbC5mYWlsKAotICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSksIFdzZGxNZXNzYWdlcy5QQVJTSU5HX09OTFlfT05FX0RPQ1VNRU5UQVRJT05fQUxMT1dFRChlLmdldExvY2FsTmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGdvdERvY3VtZW50YXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0RG9jdW1lbnRhdGlvbihnZXREb2N1bWVudGF0aW9uRm9yKGUyKSk7CkBAIC05MjIsMTIgKzczOCwxMiBAQAogICAgICAgICByZXR1cm4gYmluZGluZzsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgQmluZGluZ09wZXJhdGlvbiBwYXJzZUJpbmRpbmdPcGVyYXRpb24oCi0gICAgICAgIFBhcnNlckNvbnRleHQgY29udGV4dCwKKyAgICBwcml2YXRlIEJpbmRpbmdPcGVyYXRpb24gcGFyc2VCaW5kaW5nT3BlcmF0aW9uKAorICAgICAgICBUV1NETFBhcnNlckNvbnRleHRJbXBsIGNvbnRleHQsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEJpbmRpbmdPcGVyYXRpb24oKTsKKyAgICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQmluZGluZ09wZXJhdGlvbihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSkpOwogICAgICAgICBTdHJpbmcgbmFtZSA9IFV0aWwuZ2V0UmVxdWlyZWRBdHRyaWJ1dGUoZSwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7CiAgICAgICAgIG9wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwogCkBAIC05NDQsMzkgKzc2MCwyMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUyLCBXU0RMQ29uc3RhbnRzLlFOQU1FX0RPQ1VNRU5UQVRJT04pKSB7CiAgICAgICAgICAgICAgICAgaWYgKGdvdERvY3VtZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgVXRpbC5mYWlsKAotICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSksIFdzZGxNZXNzYWdlcy5QQVJTSU5HX09OTFlfT05FX0RPQ1VNRU5UQVRJT05fQUxMT1dFRChlLmdldExvY2FsTmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGdvdERvY3VtZW50YXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uKGdldERvY3VtZW50YXRpb25Gb3IoZTIpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZTIsIFdTRExDb25zdGFudHMuUU5BTUVfSU5QVVQpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGdvdElucHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLnRvb01hbnlFbGVtZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5UQUdfSU5QVVQsCisgICAgICAgICAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfVE9PX01BTllfRUxFTUVOVFMoQ29uc3RhbnRzLlRBR19JTlBVVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVEFHX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvKiBIZXJlIHdlIGNoZWNrIGZvciB0aGUgdXNlIHNjZW5hcmlvICovCiAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmUyID0gWG1sVXRpbC5nZXRBbGxDaGlsZHJlbihlMik7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlZSA9IFV0aWwubmV4dEVsZW1lbnQoaXRlcmUyKTsKLSAgICAgICAgICAgICAgICBpZiAoaFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaFNldC5hZGQoZWUuZ2V0QXR0cmlidXRlKCJ1c2UiKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBjb2RpdGlvbiB3aWxsIGhhcHBlbiB3aGVuIHRoZSB3c2RsIHVzZWQgaGFzIGEgbWl4dHVyZSBvZgotICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsIGFuZCBlbmNvZGVkIHN0eWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmICghaFNldC5jb250YWlucyhlZS5nZXRBdHRyaWJ1dGUoInVzZSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVlLmdldEF0dHJpYnV0ZSgidXNlIikgIT0gIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoU2V0LmFkZChlZS5nZXRBdHRyaWJ1dGUoInVzZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUyKTsKLSAgICAgICAgICAgICAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSBuZXcgQmluZGluZ0lucHV0KCk7CisgICAgICAgICAgICAgICAgQmluZGluZ0lucHV0IGlucHV0ID0gbmV3IEJpbmRpbmdJbnB1dChmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZTIpKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZUF0dHIgPQogICAgICAgICAgICAgICAgICAgICBYbWxVdGlsLmdldEF0dHJpYnV0ZU9yTnVsbChlMiwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7CiAgICAgICAgICAgICAgICAgaW5wdXQuc2V0TmFtZShuYW1lQXR0cik7CkBAIC05ODksNyArNzg4LDcgQEAKICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhdCBtb3N0IG9uZSBjaGlsZCBlbGVtZW50IGFuZCBpdCBpcyBhIGRvY3VtZW50YXRpb24gZWxlbWVudAogICAgICAgICAgICAgICAgIGJvb2xlYW4gZ290RG9jdW1lbnRhdGlvbjIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gWG1sVXRpbC5nZXRBbGxDaGlsZHJlbihlMik7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZXIyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ZXIyLmhhc05leHQoKTsKICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZTMgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIyKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGUzID09IG51bGwpCkBAIC05OTgsOSArNzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbFV0aWwKICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaGVzVGFnTlMoZTMsIFdTRExDb25zdGFudHMuUU5BTUVfRE9DVU1FTlRBVElPTikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoZS5nZXRMb2NhbE5hbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZ290RG9jdW1lbnRhdGlvbjIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2V0RG9jdW1lbnRhdGlvbihnZXREb2N1bWVudGF0aW9uRm9yKGUzKSk7CkBAIC0xMDE1LDE3ICs4MTIsMTQgQEAKICAgICAgICAgICAgICAgICBjb250ZXh0LnBvcCgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlMiwgV1NETENvbnN0YW50cy5RTkFNRV9PVVRQVVQpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGdvdE91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICBVdGlsLmZhaWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAicGFyc2luZy50b29NYW55RWxlbWVudHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVEFHX09VVFBVVCwKKyAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19UT09fTUFOWV9FTEVNRU5UUyhDb25zdGFudHMuVEFHX0lOUFVULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5UQUdfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUyKTsKLSAgICAgICAgICAgICAgICBCaW5kaW5nT3V0cHV0IG91dHB1dCA9IG5ldyBCaW5kaW5nT3V0cHV0KCk7CisgICAgICAgICAgICAgICAgQmluZGluZ091dHB1dCBvdXRwdXQgPSBuZXcgQmluZGluZ091dHB1dChmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZTIpKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZUF0dHIgPQogICAgICAgICAgICAgICAgICAgICBYbWxVdGlsLmdldEF0dHJpYnV0ZU9yTnVsbChlMiwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7CiAgICAgICAgICAgICAgICAgb3V0cHV0LnNldE5hbWUobmFtZUF0dHIpOwpAQCAtMTAzOCw3ICs4MzIsNyBAQAogICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIGNoaWxkIGVsZW1lbnQgYW5kIGl0IGlzIGEgZG9jdW1lbnRhdGlvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBnb3REb2N1bWVudGF0aW9uMiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcjIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOwogICAgICAgICAgICAgICAgICAgICApIHsKIAogICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGUzID0gVXRpbC5uZXh0RWxlbWVudChpdGVyMik7CkBAIC0xMDQ4LDkgKzg0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxVdGlsCiAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2hlc1RhZ05TKGUzLCBXU0RMQ29uc3RhbnRzLlFOQU1FX0RPQ1VNRU5UQVRJT04pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ290RG9jdW1lbnRhdGlvbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsLmZhaWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLm9ubHlPbmVEb2N1bWVudGF0aW9uQWxsb3dlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfT05MWV9PTkVfRE9DVU1FTlRBVElPTl9BTExPV0VEKGUuZ2V0TG9jYWxOYW1lKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGdvdERvY3VtZW50YXRpb24yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zZXREb2N1bWVudGF0aW9uKGdldERvY3VtZW50YXRpb25Gb3IoZTMpKTsKQEAgLTEwNjYsNyArODU4LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoWG1sVXRpbC5tYXRjaGVzVGFnTlMoZTIsIFdTRExDb25zdGFudHMuUU5BTUVfRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZTIpOwotICAgICAgICAgICAgICAgIEJpbmRpbmdGYXVsdCBmYXVsdCA9IG5ldyBCaW5kaW5nRmF1bHQoKTsKKyAgICAgICAgICAgICAgICBCaW5kaW5nRmF1bHQgZmF1bHQgPSBuZXcgQmluZGluZ0ZhdWx0KGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlMikpOwogICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lQXR0ciA9CiAgICAgICAgICAgICAgICAgICAgIFV0aWwuZ2V0UmVxdWlyZWRBdHRyaWJ1dGUoZTIsIENvbnN0YW50cy5BVFRSX05BTUUpOwogICAgICAgICAgICAgICAgIGZhdWx0LnNldE5hbWUobmFtZUF0dHIpOwpAQCAtMTA3Niw3ICs4NjgsNyBAQAogICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIGNoaWxkIGVsZW1lbnQgYW5kIGl0IGlzIGEgZG9jdW1lbnRhdGlvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBnb3REb2N1bWVudGF0aW9uMiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcjIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOwogICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlMyA9IFV0aWwubmV4dEVsZW1lbnQoaXRlcjIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZTMgPT0gbnVsbCkKQEAgLTEwODUsOSArODc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbFV0aWwKICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaGVzVGFnTlMoZTMsIFdTRExDb25zdGFudHMuUU5BTUVfRE9DVU1FTlRBVElPTikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoZS5nZXRMb2NhbE5hbWUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZ290RG9jdW1lbnRhdGlvbjIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmF1bHQuZ2V0RG9jdW1lbnRhdGlvbigpID09IG51bGwpCkBAIC0xMTE5LDcgKzkwOSw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAoZ290T3V0cHV0ICYmICFnb3RJbnB1dCAmJiAhZ290RmF1bHQpIHsKICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRTdHlsZShPcGVyYXRpb25TdHlsZS5OT1RJRklDQVRJT04pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVXRpbC5mYWlsKCJwYXJzaW5nLmludmFsaWRPcGVyYXRpb25TdHlsZSIsIG5hbWUpOworICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19JTlZBTElEX09QRVJBVElPTl9TVFlMRShuYW1lKSk7CiAgICAgICAgIH0KIAogICAgICAgICBjb250ZXh0LnBvcCgpOwpAQCAtMTEyNywxMyArOTE3LDEzIEBACiAgICAgICAgIHJldHVybiBvcGVyYXRpb247CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIEltcG9ydCBwYXJzZUltcG9ydCgKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgIHByaXZhdGUgSW1wb3J0IHBhcnNlSW1wb3J0KAorICAgICAgICBUV1NETFBhcnNlckNvbnRleHRJbXBsIGNvbnRleHQsCiAgICAgICAgIERlZmluaXRpb25zIGRlZmluaXRpb25zLAogICAgICAgICBFbGVtZW50IGUpIHsKICAgICAgICAgY29udGV4dC5wdXNoKCk7CiAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2VzKGUpOwotICAgICAgICBJbXBvcnQgYW5JbXBvcnQgPSBuZXcgSW1wb3J0KCk7CisgICAgICAgIEltcG9ydCBhbkltcG9ydCA9IG5ldyBJbXBvcnQoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpKTsKICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9CiAgICAgICAgICAgICBVdGlsLmdldFJlcXVpcmVkQXR0cmlidXRlKGUsIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSk7CiAgICAgICAgIGFuSW1wb3J0LnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwpAQCAtMTE1MCwxNyArOTQwLDEzIEBACiAKICAgICAgICAgICAgIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlMiwgV1NETENvbnN0YW50cy5RTkFNRV9ET0NVTUVOVEFUSU9OKSkgewogICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLm9ubHlPbmVEb2N1bWVudGF0aW9uQWxsb3dlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoZS5nZXRMb2NhbE5hbWUoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBnb3REb2N1bWVudGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBhbkltcG9ydC5zZXREb2N1bWVudGF0aW9uKGdldERvY3VtZW50YXRpb25Gb3IoZTIpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVXRpbC5mYWlsKAotICAgICAgICAgICAgICAgICAgICAicGFyc2luZy5pbnZhbGlkRWxlbWVudCIsCi0gICAgICAgICAgICAgICAgICAgIGUyLmdldFRhZ05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgZTIuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlMiksIFdzZGxNZXNzYWdlcy5QQVJTSU5HX0lOVkFMSURfRUxFTUVOVChlMi5nZXRUYWdOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGUyLmdldE5hbWVzcGFjZVVSSSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY29udGV4dC5wb3AoKTsKQEAgLTExNjgsMTMgKzk1NCwxMyBAQAogICAgICAgICByZXR1cm4gYW5JbXBvcnQ7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNlcnZpY2UgcGFyc2VTZXJ2aWNlKAotICAgICAgICBQYXJzZXJDb250ZXh0IGNvbnRleHQsCisgICAgcHJpdmF0ZSBTZXJ2aWNlIHBhcnNlU2VydmljZSgKKyAgICAgICAgVFdTRExQYXJzZXJDb250ZXh0SW1wbCBjb250ZXh0LAogICAgICAgICBEZWZpbml0aW9ucyBkZWZpbml0aW9ucywKICAgICAgICAgRWxlbWVudCBlKSB7CiAgICAgICAgIGNvbnRleHQucHVzaCgpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoZGVmaW5pdGlvbnMpOworICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZShkZWZpbml0aW9ucywgZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBlcnJSZWNlaXZlcik7CiAgICAgICAgIFN0cmluZyBuYW1lID0gVXRpbC5nZXRSZXF1aXJlZEF0dHJpYnV0ZShlLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKICAgICAgICAgc2VydmljZS5zZXROYW1lKG5hbWUpOwogCkBAIC0xMTg3LDkgKzk3Myw3IEBACiAKICAgICAgICAgICAgIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlMiwgV1NETENvbnN0YW50cy5RTkFNRV9ET0NVTUVOVEFUSU9OKSkgewogICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLm9ubHlPbmVEb2N1bWVudGF0aW9uQWxsb3dlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIuZXJyb3IoZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBXc2RsTWVzc2FnZXMuUEFSU0lOR19PTkxZX09ORV9ET0NVTUVOVEFUSU9OX0FMTE9XRUQoZS5nZXRMb2NhbE5hbWUoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBnb3REb2N1bWVudGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZihzZXJ2aWNlLmdldERvY3VtZW50YXRpb24oKSA9PSBudWxsKQpAQCAtMTIxMSwyMCArOTk1LDIwIEBACiAgICAgICAgIHJldHVybiBzZXJ2aWNlOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBQb3J0IHBhcnNlUG9ydCgKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAorICAgIHByaXZhdGUgUG9ydCBwYXJzZVBvcnQoCisgICAgICAgIFRXU0RMUGFyc2VyQ29udGV4dEltcGwgY29udGV4dCwKICAgICAgICAgRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMsCiAgICAgICAgIEVsZW1lbnQgZSkgewogICAgICAgICBjb250ZXh0LnB1c2goKTsKICAgICAgICAgY29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZXMoZSk7CiAKLSAgICAgICAgUG9ydCBwb3J0ID0gbmV3IFBvcnQoZGVmaW5pdGlvbnMpOworICAgICAgICBQb3J0IHBvcnQgPSBuZXcgUG9ydChkZWZpbml0aW9ucywgZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGUpLCBlcnJSZWNlaXZlcik7CiAgICAgICAgIFN0cmluZyBuYW1lID0gVXRpbC5nZXRSZXF1aXJlZEF0dHJpYnV0ZShlLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKICAgICAgICAgcG9ydC5zZXROYW1lKG5hbWUpOwogCiAgICAgICAgIFN0cmluZyBiaW5kaW5nQXR0ciA9CiAgICAgICAgICAgICBVdGlsLmdldFJlcXVpcmVkQXR0cmlidXRlKGUsIENvbnN0YW50cy5BVFRSX0JJTkRJTkcpOwotICAgICAgICBwb3J0LnNldEJpbmRpbmcoY29udGV4dC50cmFuc2xhdGVRdWFsaWZpZWROYW1lKGJpbmRpbmdBdHRyKSk7CisgICAgICAgIHBvcnQuc2V0QmluZGluZyhjb250ZXh0LnRyYW5zbGF0ZVF1YWxpZmllZE5hbWUoY29udGV4dC5nZXRMb2NhdGlvbihlKSwgYmluZGluZ0F0dHIpKTsKIAogICAgICAgICBib29sZWFuIGdvdERvY3VtZW50YXRpb24gPSBmYWxzZTsKIApAQCAtMTIzNSw5ICsxMDE5LDcgQEAKIAogICAgICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUyLCBXU0RMQ29uc3RhbnRzLlFOQU1FX0RPQ1VNRU5UQVRJT04pKSB7CiAgICAgICAgICAgICAgICAgaWYgKGdvdERvY3VtZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgVXRpbC5mYWlsKAotICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcub25seU9uZURvY3VtZW50YXRpb25BbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSksIFdzZGxNZXNzYWdlcy5QQVJTSU5HX09OTFlfT05FX0RPQ1VNRU5UQVRJT05fQUxMT1dFRChlLmdldExvY2FsTmFtZSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGdvdERvY3VtZW50YXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmKHBvcnQuZ2V0RG9jdW1lbnRhdGlvbigpID09IG51bGwpCkBAIC0xMjU2LDExNiArMTAzOCw3OSBAQAogICAgICAgICByZXR1cm4gcG9ydDsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgVHlwZXMgcGFyc2VUeXBlcygKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBEZWZpbml0aW9ucyBkZWZpbml0aW9ucywKLSAgICAgICAgRWxlbWVudCBlKSB7Ci0gICAgICAgIGNvbnRleHQucHVzaCgpOwotICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlcyhlKTsKLSAgICAgICAgVHlwZXMgdHlwZXMgPSBuZXcgVHlwZXMoKTsKLQotICAgICAgICBib29sZWFuIGdvdERvY3VtZW50YXRpb24gPSBmYWxzZTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBYbWxVdGlsLmdldEFsbENoaWxkcmVuKGUpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZTIgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIpOwotICAgICAgICAgICAgaWYgKGUyID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmIChYbWxVdGlsLm1hdGNoZXNUYWdOUyhlMiwgV1NETENvbnN0YW50cy5RTkFNRV9ET0NVTUVOVEFUSU9OKSkgewotICAgICAgICAgICAgICAgIGlmIChnb3REb2N1bWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWwuZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nLm9ubHlPbmVEb2N1bWVudGF0aW9uQWxsb3dlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ290RG9jdW1lbnRhdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdHlwZXMuc2V0RG9jdW1lbnRhdGlvbihnZXREb2N1bWVudGF0aW9uRm9yKGUyKSk7Ci0gICAgICAgICAgICB9IC8vYnVnIGZpeCA0ODU0MDA0Ci0gICAgICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICAoX3VzZVdTSUJhc2ljUHJvZmlsZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUyLCBTY2hlbWFDb25zdGFudHMuUU5BTUVfSU1QT1JUKSkpIHsKLSAgICAgICAgICAgICAgICB3YXJuKCJ3YXJuaW5nLndzaS5yMjAwMyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgLS0gbXVzdCBsaXZlIG91dHNpZGUgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgY2hlY2tOb3RXc2RsRWxlbWVudChlMik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVFeHRlbnNpb24oY29udGV4dCwgdHlwZXMsIGUyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tOb3RXc2RsUmVxdWlyZWQoZTIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBlLmdldEtleSgpLmVxdWFscygicGFyc2luZy5pbmNvcnJlY3RSb290RWxlbWVudCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZVdTSUJhc2ljUHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oIndhcm5pbmcud3NpLnIyMDA0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBwZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQucG9wKCk7Ci0gICAgICAgIGNvbnRleHQuZmlyZURvbmVQYXJzaW5nRW50aXR5KFdTRExDb25zdGFudHMuUU5BTUVfVFlQRVMsIHR5cGVzKTsKLSAgICAgICAgcmV0dXJuIHR5cGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBfZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTY2hlbWFFbGVtZW50cyhFbGVtZW50IHR5cGVzRWxlbWVudCl7CisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2NoZW1hSW1wb3J0cyhFbGVtZW50IHR5cGVzRWxlbWVudCl7CiAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IFhtbFV0aWwuZ2V0QWxsQ2hpbGRyZW4odHlwZXNFbGVtZW50KTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICBFbGVtZW50IGUgPSBVdGlsLm5leHRFbGVtZW50KGl0ZXIpOwogICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkKICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIFNjaGVtYUNvbnN0YW50cy5RTkFNRV9TQ0hFTUEpKSB7Ci0gICAgICAgICAgICAgICAgX2VsZW1lbnRzLmFkZChlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcG9zc2libGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IC0tIG11c3QgbGl2ZSBvdXRzaWRlIHRoZSBXU0RMIG5hbWVzcGFjZQorICAgICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIFNjaGVtYUNvbnN0YW50cy5RTkFNRV9JTVBPUlQpKSB7CisgICAgICAgICAgICAgICAgZXJyUmVjZWl2ZXIud2FybmluZyhmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oZSksIFdzZGxNZXNzYWdlcy5XQVJOSU5HX1dTSV9SXzIwMDMoKSk7CisgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICBjaGVja05vdFdzZGxFbGVtZW50KGUpOworLy8gICAgICAgICAgICAgICAgaWYgKFhtbFV0aWwubWF0Y2hlc1RhZ05TKGUsIFNjaGVtYUNvbnN0YW50cy5RTkFNRV9TQ0hFTUEpKSB7CisvLyAgICAgICAgICAgICAgICAgICAgZm9yZXN0LmdldElubGluZWRTY2hlbWFFbGVtZW50KCkuYWRkKGUpOworLy8gICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgTGlzdCBnZXRTY2hlbWFFbGVtZW50cygpewotICAgICAgICByZXR1cm4gX2VsZW1lbnRzOwotICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZUV4dGVuc2lvbigKLSAgICAgICAgUGFyc2VyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBFeHRlbnNpYmxlIGVudGl0eSwKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRXh0ZW5zaW9uKAorICAgICAgICBUV1NETFBhcnNlckNvbnRleHRJbXBsIGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBlbnRpdHksCiAgICAgICAgIEVsZW1lbnQgZSkgewotICAgICAgICBFeHRlbnNpb25IYW5kbGVyIGggPQotICAgICAgICAgICAgKEV4dGVuc2lvbkhhbmRsZXIpIF9leHRlbnNpb25IYW5kbGVycy5nZXQoZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIFRXU0RMRXh0ZW5zaW9uSGFuZGxlciBoID0KKyAgICAgICAgICAgICAoVFdTRExFeHRlbnNpb25IYW5kbGVyKSBleHRlbnNpb25IYW5kbGVycy5nZXQoZS5nZXROYW1lc3BhY2VVUkkoKSk7CiAgICAgICAgIGlmIChoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQuZmlyZUlnbm9yaW5nRXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShlLmdldE5hbWVzcGFjZVVSSSgpLCBlLmdldExvY2FsTmFtZSgpKSwKLSAgICAgICAgICAgICAgICAoKEVudGl0eSkgZW50aXR5KS5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgICAgICAgIGNvbnRleHQuZmlyZUlnbm9yaW5nRXh0ZW5zaW9uKGUsIChFbnRpdHkpIGVudGl0eSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gaC5kb0hhbmRsZUV4dGVuc2lvbihjb250ZXh0LCBlbnRpdHksIGUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tOb3RXc2RsRWxlbWVudChFbGVtZW50IGUpIHsKLSAgICAgICAgLy8gcG9zc2libGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IC0tIG11c3QgbGl2ZSBvdXRzaWRlIHRoZSBXU0RMIG5hbWVzcGFjZQotICAgICAgICBpZiAoZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoQ29uc3RhbnRzLk5TX1dTREwpKQotICAgICAgICAgICAgVXRpbC5mYWlsKCJwYXJzaW5nLmludmFsaWRXc2RsRWxlbWVudCIsIGUuZ2V0VGFnTmFtZSgpKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRXh0ZW5zaW9uKAorICAgICAgICBUV1NETFBhcnNlckNvbnRleHRJbXBsIGNvbnRleHQsCisgICAgICAgIFRXU0RMRXh0ZW5zaWJsZSBlbnRpdHksCisgICAgICAgIE5vZGUgbiwKKyAgICAgICAgRWxlbWVudCBlKSB7CisgICAgICAgIFRXU0RMRXh0ZW5zaW9uSGFuZGxlciBoID0KKyAgICAgICAgICAgIChUV1NETEV4dGVuc2lvbkhhbmRsZXIpIGV4dGVuc2lvbkhhbmRsZXJzLmdldChuLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgaWYgKGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29udGV4dC5maXJlSWdub3JpbmdFeHRlbnNpb24oZSwgKEVudGl0eSkgZW50aXR5KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBoLmRvSGFuZGxlRXh0ZW5zaW9uKGNvbnRleHQsIGVudGl0eSwgZSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja05vdFdzZGxSZXF1aXJlZChFbGVtZW50IGUpIHsKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb3RXc2RsRWxlbWVudChFbGVtZW50IGUpIHsKKyAgICAgICAgLy8gcG9zc2libGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IC0tIG11c3QgbGl2ZSBvdXRzaWRlIHRoZSBXU0RMIG5hbWVzcGFjZQorICAgICAgICBpZiAoZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsICYmIGUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKENvbnN0YW50cy5OU19XU0RMKSkKKyAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfSU5WQUxJRF9XU0RMX0VMRU1FTlQoZS5nZXRUYWdOYW1lKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb3RXc2RsQXR0cmlidXRlKEF0dHIgYSkgeworICAgICAgICAvLyBwb3NzaWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgLS0gbXVzdCBsaXZlIG91dHNpZGUgdGhlIFdTREwgbmFtZXNwYWNlCisgICAgICAgIGlmIChhLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuTlNfV1NETCkpCisgICAgICAgICAgICBlcnJSZWNlaXZlci5lcnJvcihmb3Jlc3QubG9jYXRvclRhYmxlLmdldFN0YXJ0TG9jYXRpb24oYS5nZXRPd25lckVsZW1lbnQoKSksIFdzZGxNZXNzYWdlcy5QQVJTSU5HX0lOVkFMSURfV1NETF9FTEVNRU5UKGEuZ2V0TG9jYWxOYW1lKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb3RXc2RsUmVxdWlyZWQoRWxlbWVudCBlKSB7CiAgICAgICAgIC8vIGNoZWNrIHRoZSB3c2RsOnJlcXVpcmVkIGF0dHJpYnV0ZSwgZmFpbCBpZiBzZXQgdG8gInRydWUiCiAgICAgICAgIFN0cmluZyByZXF1aXJlZCA9CiAgICAgICAgICAgICBYbWxVdGlsLmdldEF0dHJpYnV0ZU5TT3JOdWxsKAogICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfUkVRVUlSRUQsCiAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLk5TX1dTREwpOwotICAgICAgICBpZiAocmVxdWlyZWQgIT0gbnVsbCAmJiByZXF1aXJlZC5lcXVhbHMoQ29uc3RhbnRzLlRSVUUpKSB7Ci0gICAgICAgICAgICBVdGlsLmZhaWwoCi0gICAgICAgICAgICAgICAgInBhcnNpbmcucmVxdWlyZWRFeHRlbnNpYmlsaXR5RWxlbWVudCIsCi0gICAgICAgICAgICAgICAgZS5nZXRUYWdOYW1lKCksCi0gICAgICAgICAgICAgICAgZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIGlmIChyZXF1aXJlZCAhPSBudWxsICYmIHJlcXVpcmVkLmVxdWFscyhDb25zdGFudHMuVFJVRSkgJiYgIW9wdGlvbnMuaXNFeHRlbnNpb25Nb2RlKCkpIHsKKyAgICAgICAgICAgIGVyclJlY2VpdmVyLmVycm9yKGZvcmVzdC5sb2NhdG9yVGFibGUuZ2V0U3RhcnRMb2NhdGlvbihlKSwgV3NkbE1lc3NhZ2VzLlBBUlNJTkdfUkVRVUlSRURfRVhURU5TSUJJTElUWV9FTEVNRU5UKGUuZ2V0VGFnTmFtZSgpLAorICAgICAgICAgICAgICAgIGUuZ2V0TmFtZXNwYWNlVVJJKCkpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBEb2N1bWVudGF0aW9uIGdldERvY3VtZW50YXRpb25Gb3IoRWxlbWVudCBlKSB7CisgICAgcHJpdmF0ZSBEb2N1bWVudGF0aW9uIGdldERvY3VtZW50YXRpb25Gb3IoRWxlbWVudCBlKSB7CiAgICAgICAgIFN0cmluZyBzID0gWG1sVXRpbC5nZXRUZXh0Rm9yTm9kZShlKTsKICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMzczLDM3ICsxMTE4LDQgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRhdGlvbihzKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGVycm9yKFN0cmluZyBrZXkpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICAgICAgX2xvY2FsaXplci5sb2NhbGl6ZShfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXkpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2hTZXQgZ2V0VXNlKCkgewotICAgICAgICByZXR1cm4gaFNldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3YXJuKFN0cmluZyBrZXkpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICAgICAgX2xvY2FsaXplci5sb2NhbGl6ZShfbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZShrZXkpKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FybihTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgIF9sb2NhbGl6ZXIubG9jYWxpemUoX21lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5LCBhcmcpKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FybihTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgIF9sb2NhbGl6ZXIubG9jYWxpemUoX21lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2Uoa2V5LCBhcmdzKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfZm9sbG93SW1wb3J0czsKLSAgICBwcml2YXRlIFN0cmluZyBfdGFyZ2V0TmFtZXNwYWNlVVJJOwotICAgIHByaXZhdGUgTWFwIF9leHRlbnNpb25IYW5kbGVyczsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBfbGlzdGVuZXJzOwotICAgIHByaXZhdGUgYm9vbGVhbiBfdXNlV1NJQmFzaWNQcm9maWxlID0gdHJ1ZTsKLSAgICBwcml2YXRlIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgX21lc3NhZ2VGYWN0b3J5ID0gbnVsbDsKLSAgICBwcml2YXRlIExvY2FsaXplciBfbG9jYWxpemVyOwotICAgIHByaXZhdGUgSGFzaFNldCBoU2V0ID0gbnVsbDsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XU0RMV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjljODguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XU0RMV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5CaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkJpbmRpbmdJbnB1dDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuQmluZGluZ091dHB1dDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuRGVmaW5pdGlvbnM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkRvY3VtZW50YXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LkZhdWx0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5JbXBvcnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LklucHV0OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5NZXNzYWdlUGFydDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuT3BlcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5PdXRwdXQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlBvcnQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LlBvcnRUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5TZXJ2aWNlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5UeXBlczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETENvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuV1NETERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5XU0RMRG9jdW1lbnRWaXNpdG9yOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5kb2N1bWVudC5zY2hlbWEuU2NoZW1hS2luZHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmRvY3VtZW50LmpheHdzLkpBWFdTQmluZGluZ3NDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5FeHRlbnNpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2RsLmZyYW1ld29yay5LaW5kOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3NkbC5mcmFtZXdvcmsuV3JpdGVyQ29udGV4dDsKLQotLyoqCi0gKiBBIHdyaXRlciBmb3IgV1NETCBkb2N1bWVudHMuCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMV3JpdGVyIHsKLQotICAgIHB1YmxpYyBXU0RMV3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgX2V4dGVuc2lvbkhhbmRsZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLyByZWdpc3RlciBoYW5kbGVycyBmb3IgZGVmYXVsdCBleHRlbnNpb25zCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBTT0FQRXh0ZW5zaW9uSGFuZGxlcigpKTsKLSAgICAgICAgcmVnaXN0ZXIobmV3IEhUVFBFeHRlbnNpb25IYW5kbGVyKCkpOwotICAgICAgICByZWdpc3RlcihuZXcgTUlNRUV4dGVuc2lvbkhhbmRsZXIoKSk7Ci0gICAgICAgIHJlZ2lzdGVyKG5ldyBTY2hlbWFFeHRlbnNpb25IYW5kbGVyKCkpOwotICAgICAgICByZWdpc3RlcihuZXcgSkFYV1NCaW5kaW5nRXh0ZW5zaW9uSGFuZGxlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihFeHRlbnNpb25IYW5kbGVyIGgpIHsKLSAgICAgICAgX2V4dGVuc2lvbkhhbmRsZXJzLnB1dChoLmdldE5hbWVzcGFjZVVSSSgpLCBoKTsKLSAgICAgICAgaC5zZXRFeHRlbnNpb25IYW5kbGVycyhfZXh0ZW5zaW9uSGFuZGxlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXIoRXh0ZW5zaW9uSGFuZGxlciBoKSB7Ci0gICAgICAgIF9leHRlbnNpb25IYW5kbGVycy5wdXQoaC5nZXROYW1lc3BhY2VVUkkoKSwgbnVsbCk7Ci0gICAgICAgIGguc2V0RXh0ZW5zaW9uSGFuZGxlcnMobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5yZWdpc3RlcihTdHJpbmcgdXJpKSB7Ci0gICAgICAgIF9leHRlbnNpb25IYW5kbGVycy5wdXQodXJpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBXU0RMRG9jdW1lbnQgZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBvcykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgV3JpdGVyQ29udGV4dCBjb250ZXh0ID0gbmV3IFdyaXRlckNvbnRleHQob3MpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZG9jdW1lbnQuYWNjZXB0KG5ldyBXU0RMRG9jdW1lbnRWaXNpdG9yKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVZpc2l0KERlZmluaXRpb25zIGRlZmluaXRpb25zKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVQcmVmaXhlcyhjb250ZXh0LCBkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhkZWZpbml0aW9ucy5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zLmdldFRhcmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUFsbFBlbmRpbmdOYW1lc3BhY2VEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdFZpc2l0KERlZmluaXRpb25zIGRlZmluaXRpb25zKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhkZWZpbml0aW9ucy5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoSW1wb3J0IGkpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcoaS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGkuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBpLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKGkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVZpc2l0KFR5cGVzIHR5cGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKHR5cGVzLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0VmlzaXQoVHlwZXMgdHlwZXMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKHR5cGVzLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmVWaXNpdChNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcobWVzc2FnZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RWaXNpdChNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKG1lc3NhZ2UuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1lc3NhZ2VQYXJ0IHBhcnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcocGFydC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9OQU1FLCBwYXJ0LmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgZG5hbWUgPSBwYXJ0LmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgS2luZCBka2luZCA9IHBhcnQuZ2V0RGVzY3JpcHRvcktpbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRuYW1lICE9IG51bGwgJiYgZGtpbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRraW5kLmVxdWFscyhTY2hlbWFLaW5kcy5YU0RfRUxFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9FTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRraW5kLmVxdWFscyhTY2hlbWFLaW5kcy5YU0RfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RZUEUsIGRuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGFkZCBzdXBwb3J0IGZvciBhdHRyaWJ1dGUgZXh0ZW5zaW9ucyBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhwYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmVWaXNpdChQb3J0VHlwZSBwb3J0VHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhwb3J0VHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0VmlzaXQoUG9ydFR5cGUgcG9ydFR5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKHBvcnRUeXBlLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmVWaXNpdChPcGVyYXRpb24gb3BlcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKG9wZXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BVFRSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgLy9idWcgZml4OiA0OTQ3MzQwLCBwYXJhbWV0ZXJPZGVyPSIiIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgIGlmKG9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJPcmRlcigpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJPcmRlcigpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9QQVJBTUVURVJfT1JERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldFBhcmFtZXRlck9yZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RWaXNpdChPcGVyYXRpb24gb3BlcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhvcGVyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVZpc2l0KElucHV0IGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKGlucHV0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdFZpc2l0KElucHV0IGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhpbnB1dC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlVmlzaXQoT3V0cHV0IG91dHB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhvdXRwdXQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RWaXNpdChPdXRwdXQgb3V0cHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhvdXRwdXQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVZpc2l0KEZhdWx0IGZhdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKGZhdWx0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdFZpc2l0KEZhdWx0IGZhdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhmYXVsdC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlVmlzaXQoQmluZGluZyBiaW5kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKGJpbmRpbmcuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RWaXNpdChCaW5kaW5nIGJpbmRpbmcpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKGJpbmRpbmcuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlVmlzaXQoQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcob3BlcmF0aW9uLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0VmlzaXQoQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKG9wZXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlVmlzaXQoQmluZGluZ0lucHV0IGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKGlucHV0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFUVFJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RWaXNpdChCaW5kaW5nSW5wdXQgaW5wdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlRW5kVGFnKGlucHV0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmVWaXNpdChCaW5kaW5nT3V0cHV0IG91dHB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVTdGFydFRhZyhvdXRwdXQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RWaXNpdChCaW5kaW5nT3V0cHV0IG91dHB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVFbmRUYWcob3V0cHV0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmVWaXNpdChCaW5kaW5nRmF1bHQgZmF1bHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcoZmF1bHQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdFZpc2l0KEJpbmRpbmdGYXVsdCBmYXVsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVFbmRUYWcoZmF1bHQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlVmlzaXQoU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZVN0YXJ0VGFnKHNlcnZpY2UuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0VmlzaXQoU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhzZXJ2aWNlLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmVWaXNpdChQb3J0IHBvcnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlU3RhcnRUYWcocG9ydC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9OQU1FLCBwb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVRUUl9CSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5nZXRCaW5kaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0VmlzaXQoUG9ydCBwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZUVuZFRhZyhwb3J0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmVWaXNpdChFeHRlbnNpb24gZXh0ZW5zaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uSGFuZGxlciBoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChFeHRlbnNpb25IYW5kbGVyKSBfZXh0ZW5zaW9uSGFuZGxlcnMuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaC5kb0hhbmRsZUV4dGVuc2lvbihjb250ZXh0LCBleHRlbnNpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0VmlzaXQoRXh0ZW5zaW9uIGV4dGVuc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KERvY3VtZW50YXRpb24gZG9jdW1lbnRhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVUYWcoV1NETENvbnN0YW50cy5RTkFNRV9ET0NVTUVOVEFUSU9OLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGNvbnRleHQuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5IHVuZXhwZWN0ZWQgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcmVmaXhlcygKLSAgICAgICAgV3JpdGVyQ29udGV4dCBjb250ZXh0LAotICAgICAgICBXU0RMRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBmaXJzdAotICAgICAgICBTdHJpbmcgdG5zVVJJID0gZG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKS5nZXRUYXJnZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKHRuc1VSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFRhcmdldE5hbWVzcGFjZVVSSSh0bnNVUkkpOwotICAgICAgICAgICAgY29udGV4dC5kZWNsYXJlUHJlZml4KFRBUkdFVF9OQU1FU1BBQ0VfUFJFRklYLCB0bnNVUkkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlbiB3aXRoIHRoZSBXU0RMIG5hbWVzcGFjZQotLy8gICAgICAgIGNvbnRleHQuZGVjbGFyZVByZWZpeChfY29tbW9uUHJlZml4ZXMuZ2V0KENvbnN0YW50cy5OU19XU0RMKSwgQ29uc3RhbnRzLk5TX1dTREwpOwotICAgICAgICBjb250ZXh0LmRlY2xhcmVQcmVmaXgoIiIsIENvbnN0YW50cy5OU19XU0RMKTsKLQotICAgICAgICAvLyB0aGVuIHdpdGggYWxsIG90aGVyIG5hbWVzcGFjZXMKLSAgICAgICAgU2V0IG5hbWVzcGFjZXMgPSBkb2N1bWVudC5jb2xsZWN0QWxsTmFtZXNwYWNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuYW1lc3BhY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIG5zVVJJID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQcmVmaXhGb3IobnNVUkkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBfY29tbW9uUHJlZml4ZXMuZ2V0KG5zVVJJKTsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBwcmVmaXggZm9yIGl0Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gY29udGV4dC5maW5kTmV3UHJlZml4KE5FV19OQU1FU1BBQ0VfUFJFRklYX0JBU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dC5kZWNsYXJlUHJlZml4KHByZWZpeCwgbnNVUkkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgX2V4dGVuc2lvbkhhbmRsZXJzOwotCi0gICAgLy8vLy8vLy8KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gX2NvbW1vblByZWZpeGVzOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgX2NvbW1vblByZWZpeGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIF9jb21tb25QcmVmaXhlcy5wdXQoQ29uc3RhbnRzLk5TX1dTREwsICJ3c2RsIik7Ci0gICAgICAgIF9jb21tb25QcmVmaXhlcy5wdXQoQ29uc3RhbnRzLk5TX1dTRExfU09BUCwgInNvYXAiKTsKLSAgICAgICAgX2NvbW1vblByZWZpeGVzLnB1dChDb25zdGFudHMuTlNfV1NETF9IVFRQLCAiaHR0cCIpOwotICAgICAgICBfY29tbW9uUHJlZml4ZXMucHV0KENvbnN0YW50cy5OU19XU0RMX01JTUUsICJtaW1lIik7Ci0gICAgICAgIF9jb21tb25QcmVmaXhlcy5wdXQoQ29uc3RhbnRzLk5TX1hTRCwgInhzZCIpOwotICAgICAgICBfY29tbW9uUHJlZml4ZXMucHV0KENvbnN0YW50cy5OU19YU0ksICJ4c2kiKTsKLSAgICAgICAgX2NvbW1vblByZWZpeGVzLnB1dChKQVhXU0JpbmRpbmdzQ29uc3RhbnRzLk5TX0pBWFdTX0JJTkRJTkdTLCAiamF4d3MiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9QUkVGSVggPSAidG5zIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX05BTUVTUEFDRV9QUkVGSVhfQkFTRSA9ICJucyI7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1doaXRlc3BhY2VTdHJpcHBlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XaGl0ZXNwYWNlU3RyaXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZjMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XaGl0ZXNwYWNlU3RyaXBwZXIuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisKKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwucGFyc2VyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5XaGl0ZVNwYWNlUHJvY2Vzc29yOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxGaWx0ZXJJbXBsOworCisvKioKKyAqIFN0cmlwcyBpZ25vcmFibGUgd2hpdGVzcGFjZSBmcm9tIFNBWCBldmVudCBzdHJlYW0uCisgKgorICogPHA+CisgKiBUaGlzIGZpbHRlciB3b3JrcyBvbmx5IHdoZW4gdGhlIGV2ZW50IHN0cmVhbSBkb2Vzbid0CisgKiBjb250YWluIGFueSBtaXhlZCBjb250ZW50LgorICoKKyAqIEBhdXRob3IKKyAqICAgICBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKKyAqICAgICBWaXZlayBQYW5kZXkKKyAqLworY2xhc3MgV2hpdGVzcGFjZVN0cmlwcGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbCB7CisKKyAgICBwcml2YXRlIGludCBzdGF0ZSA9IDA7CisKKyAgICBwcml2YXRlIGNoYXJbXSBidWYgPSBuZXcgY2hhclsxMDI0XTsKKyAgICBwcml2YXRlIGludCBidWZMZW4gPSAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFGVEVSX1NUQVJUX0VMRU1FTlQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRlRFUl9FTkRfRUxFTUVOVCA9IDI7CisKKyAgICBwdWJsaWMgV2hpdGVzcGFjZVN0cmlwcGVyKFhNTFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgc2V0UGFyZW50KHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIFdoaXRlc3BhY2VTdHJpcHBlcihDb250ZW50SGFuZGxlciBoYW5kbGVyLCBFcnJvckhhbmRsZXIgZWgsIEVudGl0eVJlc29sdmVyIGVyKSB7CisgICAgICAgIHNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOworICAgICAgICBpZihlaCE9bnVsbCkgICAgc2V0RXJyb3JIYW5kbGVyKGVoKTsKKyAgICAgICAgaWYoZXIhPW51bGwpICAgIHNldEVudGl0eVJlc29sdmVyKGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoKHN0YXRlKSB7CisgICAgICAgIGNhc2UgQUZURVJfU1RBUlRfRUxFTUVOVDoKKyAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhlIGNoYXJhY3RlcnMgaGVyZSwgZXZlbiBpZiBpdCBjb25zaXN0cyBlbnRpcmVseQorICAgICAgICAgICAgLy8gb2Ygd2hpdGVzcGFjZXMuIFRoaXMgaXMgYmVjYXVzZSBzdWNjZXNzaXZlIGNoYXJhY3RlcnMgZXZlbnQgbWlnaHQKKyAgICAgICAgICAgIC8vIGluY2x1ZGUgbm9uLXdoaXRlc3BhY2UgY2hhciwgaW4gd2hpY2ggY2FzZSBhbGwgdGhlIHdoaXRlc3BhY2VzIGluCisgICAgICAgICAgICAvLyB0aGlzIGV2ZW50IG1heSBzdWRkZW5seSBiZWNvbWUgc2lnbmlmaWNhbnQuCisgICAgICAgICAgICBpZiggYnVmTGVuK2xlbmd0aD5idWYubGVuZ3RoICkgeworICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgYnVmZmVyCisgICAgICAgICAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyW01hdGgubWF4KGJ1ZkxlbitsZW5ndGgsYnVmLmxlbmd0aCoyKV07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsMCxuZXdCdWYsMCxidWZMZW4pOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5ld0J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2gsc3RhcnQsYnVmLGJ1ZkxlbixsZW5ndGgpOworICAgICAgICAgICAgYnVmTGVuICs9IGxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFGVEVSX0VORF9FTEVNRU5UOgorICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBpZ25vcmFibGUuCisgICAgICAgICAgICBpbnQgbGVuID0gc3RhcnQrbGVuZ3RoOworICAgICAgICAgICAgZm9yKCBpbnQgaT1zdGFydDsgaTxsZW47IGkrKyApCisgICAgICAgICAgICAgICAgaWYoICFXaGl0ZVNwYWNlUHJvY2Vzc29yLmlzV2hpdGVTcGFjZShjaFtpXSkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgaXQncyBlbnRpcmVseSB3aGl0ZXNwYWNlLCBpZ25vcmUgaXQuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHByb2Nlc3NQZW5kaW5nVGV4dCgpOworICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRzKTsKKyAgICAgICAgc3RhdGUgPSBBRlRFUl9TVEFSVF9FTEVNRU5UOworICAgICAgICBidWZMZW4gPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvY2Vzc1BlbmRpbmdUZXh0KCk7CisgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lKTsKKyAgICAgICAgc3RhdGUgPSBBRlRFUl9FTkRfRUxFTUVOVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3J3YXJzIHRoZSBidWZmZXJlZCBjaGFyYWN0ZXJzIGlmIGl0IGNvbnRhaW5zIGFueSBub24td2hpdGVzcGFjZQorICAgICAqIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BlbmRpbmdUZXh0KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmKHN0YXRlPT1BRlRFUl9TVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICBmb3IoIGludCBpPWJ1Zkxlbi0xOyBpPj0wOyBpLS0gKQorICAgICAgICAgICAgICAgIGlmKCAhV2hpdGVTcGFjZVByb2Nlc3Nvci5pc1doaXRlU3BhY2UoYnVmW2ldKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2hhcmFjdGVycyhidWYsIDAsIGJ1Zkxlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAvLyBpZ25vcmUgY29tcGxldGVseS4KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9BYm9ydEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvQWJvcnRFeGNlcHRpb24uamF2YQppbmRleCA5N2FjYjFmLi5lOTVmNWI0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9BYm9ydEV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL0Fib3J0RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvQmFkQ29tbWFuZExpbmVFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL0JhZENvbW1hbmRMaW5lRXhjZXB0aW9uLmphdmEKaW5kZXggOGZmNGNhZS4uNGJlNmI0ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvQmFkQ29tbWFuZExpbmVFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9CYWRDb21tYW5kTGluZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYzsKIAogaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvQ29uc29sZUVycm9yUmVwb3J0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL0NvbnNvbGVFcnJvclJlcG9ydGVyLmphdmEKaW5kZXggYzIwNGYyYy4uYTY1ZjY5YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvQ29uc29sZUVycm9yUmVwb3J0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9Db25zb2xlRXJyb3JSZXBvcnRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYzsKIAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvRHJpdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9Ecml2ZXIuamF2YQppbmRleCBmYjVhMzQyLi43NWEzMDJmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9Ecml2ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9Ecml2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC0zNSw2ICszNCw3IEBACiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuQ29kZVdyaXRlcjsKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ29kZU1vZGVsOwogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLndyaXRlci5aaXBDb2RlV3JpdGVyOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CiBpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uQmVhbkdlbmVyYXRvcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5Nb2RlbDsKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgICAqICAgICAgQWxsIG5vbi16ZXJvIHZhbHVlcyBpbmRpY2F0ZSBhbiBlcnJvci4gVGhlIGVycm9yIG1lc3NhZ2UKICAgICAgKiAgICAgIHdpbGwgYmUgc2VudCB0byB0aGUgc3BlY2lmaWVkIFByaW50U3RyZWFtLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHJ1bihTdHJpbmdbXSBhcmdzLCBYSkNMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIGludCBydW4oU3RyaW5nW10gYXJncywgQE5vdE51bGwgZmluYWwgWEpDTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gcmVjb2duaXplIHRob3NlIHNwZWNpYWwgb3B0aW9ucyBiZWZvcmUgd2Ugc3RhcnQgcGFyc2luZyBvcHRpb25zLgogICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKSB7CkBAIC0yNDksNiArMjQ5LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGlmKCFvcHQucXVpZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci53YXJuaW5nKGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvbGxBYm9ydCgpIHRocm93cyBBYm9ydEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGlmKGxpc3RlbmVyLmlzQ2FuY2VsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIGlmKCBvcHQubW9kZT09TW9kZS5GT1JFU1QgKSB7CkBAIC00MjIsNyArNDI3LDcgQEAKICAgICAgICAgcHVibGljIGJvb2xlYW4gbm9OUyA9IGZhbHNlOwogCiAgICAgICAgIC8qKiBQYXJzZSBYSkMtc3BlY2lmaWMgb3B0aW9ucy4gKi8KLSAgICAgICAgcHJvdGVjdGVkIGludCBwYXJzZUFyZ3VtZW50KFN0cmluZ1tdIGFyZ3MsIGludCBpKSB0aHJvd3MgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgaW50IHBhcnNlQXJndW1lbnQoU3RyaW5nW10gYXJncywgaW50IGkpIHRocm93cyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1ub05TIikpIHsKICAgICAgICAgICAgICAgICBub05TID0gdHJ1ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKQEAgLTQ3MSw3ICs0NzYsNyBAQAogICAgICAqICAgICAgSWYgdGhlIHBhcnNpbmcgb2Ygb3B0aW9ucyBoYXZlIHN0YXJ0ZWQsIHNldCBhIHBhcnRseSBwb3B1bGF0ZWQKICAgICAgKiAgICAgIHtAbGluayBPcHRpb25zfSBvYmplY3QuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVzYWdlKCBATnVsbGFibGUgT3B0aW9ucyBvcHRzLCBib29sZWFuIHByaXZhdGVVc2FnZSApIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXNhZ2UoIEBOdWxsYWJsZSBPcHRpb25zIG9wdHMsIGJvb2xlYW4gcHJpdmF0ZVVzYWdlICkgewogICAgICAgICBpZiggcHJpdmF0ZVVzYWdlICkgewogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5EUklWRVJfUFJJVkFURV9VU0FHRSkpOwogICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvRXJyb3JSZWNlaXZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvRXJyb3JSZWNlaXZlci5qYXZhCmluZGV4IGI2MDI4MjkuLjUzMTAwNTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL0Vycm9yUmVjZWl2ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9FcnJvclJlY2VpdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsOCArMjgsOCBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLkVycm9yTGlzdGVuZXI7CiBpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuU0FYUGFyc2VFeGNlcHRpb24yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5FcnJvckxpc3RlbmVyOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CkBAIC0xMDEsNiArMTAxLDEzIEBACiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBBYm9ydEV4Y2VwdGlvbjsKIAogICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBwZXJpb2RpY2FsbHkgdG8gYWxsb3cge0BsaW5rIEFib3J0RXhjZXB0aW9ufQorICAgICAqIHRvIGJlIHRocm93biwgZXNwZWNpYWxseSB3aGVuIHRoaXMgaXMgZHJpdmVuIGJ5IHNvbWUga2luZCBvZiBHVUkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9sbEFib3J0KCkgdGhyb3dzIEFib3J0RXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXBvcnRzIHZlcmJvc2UgbWVzc2FnZXMgdG8gdXNlcnMuCiAgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZXBvcnQgYWRkaXRpb25hbCBub24tZXNzZW50aWFsCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9MYW5ndWFnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvTGFuZ3VhZ2UuamF2YQppbmRleCAzNjQ0NGVlLi5iZTQ1NzI4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9MYW5ndWFnZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL0xhbmd1YWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcwppbmRleCAzN2Y1NWJkLi4yNDMzMjNlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBDb25zb2xlRXJyb3JSZXBvcnRlci5Vbmtub3duTG9jYXRpb24gPSBcCiAJdW5rbm93biBsb2NhdGlvbgogCQpAQCAtOCw3ICszMyw5IEBACiAJdW5rbm93biBmaWxlCiAJCiBEcml2ZXIuUHJpdmF0ZS5Vc2FnZSA9IFwKLVVzYWdlOiB4amMgWy1vcHRpb25zIC4uLl0gPHNjaGVtYSBmaWxlL1VSTC9kaXI+IC4uLiBbLWIgPGJpbmRpbmZvPl0gLi4uXG5cCitVc2FnZTogeGpjIFstb3B0aW9ucyAuLi5dIDxzY2hlbWEgZmlsZS9VUkwvZGlyL2phcj4gLi4uIFstYiA8YmluZGluZm8+XSAuLi5cblwKK0lmIGRpciBpcyBzcGVjaWZpZWQsIGFsbCBzY2hlbWEgZmlsZXMgaW4gaXQgd2lsbCBiZSBjb21waWxlZC5cblwKK0lmIGphciBpcyBzcGVjaWZpZWQsIC9NRVRBLUlORi9zdW4tamF4Yi5lcGlzb2RlIGJpbmRpbmcgZmlsZSB3aWxsIGJlIGNvbXBpbGVkLlxuXAogT3B0aW9uczpcblwKIFwgXCAtZGVidWcgICAgICAgICAgICAgOiAgcnVuIGluIHRoZSBkZWJ1ZyBtb2RlXG5cCiBcIFwgLW52ICAgICAgICAgICAgICAgIDogIGRvIG5vdCBwZXJmb3JtIHN0cmljdCB2YWxpZGF0aW9uIG9mIHRoZSBpbnB1dCBzY2hlbWEocylcblwKQEAgLTI2LDYgKzUzLDcgQEAKIFwgXCAtcmVhZE9ubHkgICAgICAgICAgOiAgZ2VuZXJhdGVkIGZpbGVzIHdpbGwgYmUgaW4gcmVhZC1vbmx5IG1vZGVcblwKIFwgXCAtbnBhICAgICAgICAgICAgICAgOiAgc3VwcHJlc3MgZ2VuZXJhdGlvbiBvZiBwYWNrYWdlIGxldmVsIGFubm90YXRpb25zICgqKi9wYWNrYWdlLWluZm8uamF2YSlcblwKIFwgXCAtbm8taGVhZGVyICAgICAgICAgOiAgc3VwcHJlc3MgZ2VuZXJhdGlvbiBvZiBhIGZpbGUgaGVhZGVyIHdpdGggdGltZXN0YW1wXG5cCitcIFwgLXRhcmdldCAyLjAgICAgICAgIDogIGJlaGF2ZSBsaWtlIFhKQyAyLjAgYW5kIGdlbmVyYXRlIGNvZGUgdGhhdCBkb2Vzbid0IHVzZSBhbnkgMi4xIGZlYXR1cmVzLlxuXAogXCBcIC1wcml2YXRlICAgICAgICAgICA6ICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlXG5cCiBcIFwgLXhtbHNjaGVtYSAgICAgICAgIDogIHRyZWF0IGlucHV0IGFzIFczQyBYTUwgU2NoZW1hIChkZWZhdWx0KVxuXAogXCBcIC1yZWxheG5nICAgICAgICAgICA6ICB0cmVhdCBpbnB1dCBhcyBSRUxBWCBORyAoZXhwZXJpbWVudGFsLHVuc3VwcG9ydGVkKVxuXApAQCAtNDUsNyArNzMsOSBAQAogXCBcIC1wIDxwa2c+ICAgICA6ICBzcGVjaWZpZXMgdGhlIHRhcmdldCBwYWNrYWdlXG4KIAogRHJpdmVyLlB1YmxpYy5Vc2FnZSA9IFwKLVVzYWdlOiB4amMgWy1vcHRpb25zIC4uLl0gPHNjaGVtYSBmaWxlL1VSTC9kaXI+IC4uLiBbLWIgPGJpbmRpbmZvPl0gLi4uXG5cCitVc2FnZTogeGpjIFstb3B0aW9ucyAuLi5dIDxzY2hlbWEgZmlsZS9VUkwvZGlyL2phcj4gLi4uIFstYiA8YmluZGluZm8+XSAuLi5cblwKK0lmIGRpciBpcyBzcGVjaWZpZWQsIGFsbCBzY2hlbWEgZmlsZXMgaW4gaXQgd2lsbCBiZSBjb21waWxlZC5cblwKK0lmIGphciBpcyBzcGVjaWZpZWQsIC9NRVRBLUlORi9zdW4tamF4Yi5lcGlzb2RlIGJpbmRpbmcgZmlsZSB3aWxsIGJlIGNvbXBpbGVkLlxuXAogT3B0aW9uczpcblwKIFwgXCAtbnYgICAgICAgICAgICAgICAgOiAgZG8gbm90IHBlcmZvcm0gc3RyaWN0IHZhbGlkYXRpb24gb2YgdGhlIGlucHV0IHNjaGVtYShzKVxuXAogXCBcIC1leHRlbnNpb24gICAgICAgICA6ICBhbGxvdyB2ZW5kb3IgZXh0ZW5zaW9ucyAtIGRvIG5vdCBzdHJpY3RseSBmb2xsb3cgdGhlXG5cCkBAIC02Miw2ICs5Miw3IEBACiBcIFwgLXJlYWRPbmx5ICAgICAgICAgIDogIGdlbmVyYXRlZCBmaWxlcyB3aWxsIGJlIGluIHJlYWQtb25seSBtb2RlXG5cCiBcIFwgLW5wYSAgICAgICAgICAgICAgIDogIHN1cHByZXNzIGdlbmVyYXRpb24gb2YgcGFja2FnZSBsZXZlbCBhbm5vdGF0aW9ucyAoKiovcGFja2FnZS1pbmZvLmphdmEpXG5cCiBcIFwgLW5vLWhlYWRlciAgICAgICAgIDogIHN1cHByZXNzIGdlbmVyYXRpb24gb2YgYSBmaWxlIGhlYWRlciB3aXRoIHRpbWVzdGFtcFxuXAorXCBcIC10YXJnZXQgMi4wICAgICAgICA6ICBiZWhhdmUgbGlrZSBYSkMgMi4wIGFuZCBnZW5lcmF0ZSBjb2RlIHRoYXQgZG9lc24ndCB1c2UgYW55IDIuMSBmZWF0dXJlcy5cblwKIFwgXCAteG1sc2NoZW1hICAgICAgICAgOiAgdHJlYXQgaW5wdXQgYXMgVzNDIFhNTCBTY2hlbWEgKGRlZmF1bHQpXG5cCiBcIFwgLXJlbGF4bmcgICAgICAgICAgIDogIHRyZWF0IGlucHV0IGFzIFJFTEFYIE5HIChleHBlcmltZW50YWwsdW5zdXBwb3J0ZWQpXG5cCiBcIFwgLXJlbGF4bmctY29tcGFjdCAgIDogIHRyZWF0IGlucHV0IGFzIFJFTEFYIE5HIGNvbXBhY3Qgc3ludGF4IChleHBlcmltZW50YWwsdW5zdXBwb3J0ZWQpXG5cCkBAIC03OCwyNCArMTA5LDkgQEAKIAlBcmUgeW91IHRyeWluZyB0byBjb21waWxlIHswfT8gU3VwcG9ydCBmb3IgezB9IGlzIGV4cGVyaW1lbnRhbC4gXAogCVlvdSBtYXkgZW5hYmxlIGl0IGJ5IHVzaW5nIHRoZSB7MX0gb3B0aW9uLgogCi1Ecml2ZXIuTWlzc2luZ0NhdGFsb2cgPSBcCi0JdGhlIC1jYXRhbG9nIG9wdGlvbiBpcyBtaXNzaW5nIGEgZmlsZSBuYW1lCi0KLURyaXZlci5NaXNzaW5nQ2xhc3NQYXRoID0gXAotCXRoZSAtY2xhc3NwYXRoIG9wdGlvbiBpcyBtaXNzaW5nIGEgZGlyZWN0b3J5L2phcmZpbGUgbmFtZQotCi1Ecml2ZXIuTWlzc2luZ0RpciA9IFwKLQl0aGUgLWQgb3B0aW9uIGlzIG1pc3NpbmcgYSBkaXJlY3RvcnkgbmFtZQotCiBEcml2ZXIuTm9uRXhpc3RlbnREaXIgPSBcCiAgICAgY293YXJkbHkgcmVmdXNlcyB0byB3cml0ZSB0byBhIG5vbi1leGlzdGVudCBkaXJlY3RvcnkgInswfSIKIAkKLURyaXZlci5NaXNzaW5nRmlsZU5hbWUgPSBcCi0JdGhlIC1iIG9wdGlvbiBpcyBtaXNzaW5nIGEgZmlsZSBuYW1lCi0JCi1Ecml2ZXIuTWlzc2luZ1BhY2thZ2VOYW1lID0gXAotCXRoZSAtcCBvcHRpb24gaXMgbWlzc2luZyBhIHBhY2thZ2UgbmFtZQotCQogRHJpdmVyLk1pc3NpbmdSdW50aW1lUGFja2FnZU5hbWUgPSBcCiAJdGhlIC11c2UtcnVudGltZSBvcHRpb24gaXMgbWlzc2luZyBhIHBhY2thZ2UgbmFtZQogCQpAQCAtMTEzLDggKzEyOSwxMSBAQAogCWVpdGhlciB0aGUgLXBvcnQgb3B0aW9uIGlzIG1pc3NpbmcgYW4gb3BlcmFuZCBcblwKICAgICAgICAgb3IgLWhvc3Qgd2FzIHNwZWNpZmllZCBidXQgbm90IC1wb3J0CiAKLURyaXZlci5NSVNTSU5HX1BST1hZID0gXAotICAgIHRoZSAtaHR0cHByb3h5IG9wdGlvbiBpcyBtaXNzaW5nIGFuIG9wZXJhbmQKK0RyaXZlci5JTExFR0FMX1BST1hZID0gXAorICAgICJ7MH0iIGlzIG5vdCBhIHZhbGlkIHByb3h5IGZvcm1hdC4gVGhlIGZvcm1hdCBpcyBbdXNlcls6cGFzc3dvcmRdQF1wcm94eUhvc3RbOnByb3h5UG9ydF0KKworRHJpdmVyLklMTEVHQUxfVEFSR0VUX1ZFUlNJT04gPSBcCisgICAgInswfSIgaXMgbm90IGEgdmFsaWQgdGFyZ2V0IHZlcnNpb24uICIyLjAiIGFuZCAiMi4xIiBhcmUgc3VwcG9ydGVkLgogCiBEcml2ZXIuTUlTU0lOR19QUk9YWUZJTEUgPSBcCiAgICAgdGhlIC1odHRwcHJveHlmaWxlIG9wdGlvbiBpcyBtaXNzaW5nIGFuIG9wZXJhbmQKQEAgLTE1NSwxOCArMTc0LDE4IEBACiBEcml2ZXIuRmFpbGVkVG9HZW5lcmF0ZUNvZGUgPSBcCiAJRmFpbGVkIHRvIHByb2R1Y2UgY29kZS4KIAotIyBETyBOT1QgbG9jYWxpemUgdGhlIEpBWEIgMi4wIGluIEpESyAxLjYgc3RyaW5nIC0gaXQgaXMgYSB0b2tlbiBmb3IgYW4gYW50IDxyZXBsYWNlRmlsdGVyPgkKKyMgRE8gTk9UIGxvY2FsaXplIHRoZSBKQVhCIDIuMS4zIGluIEpESyBzdHJpbmcgLSBpdCBpcyBhIHRva2VuIGZvciBhbiBhbnQgPHJlcGxhY2VGaWx0ZXI+CQogRHJpdmVyLkZpbGVQcm9sb2dDb21tZW50ID0gXAotCVRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHZKQVhCIDIuMCBpbiBKREsgMS42IFxuXAorCVRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHZKQVhCIDIuMS4zIGluIEpESyBcblwKIAlTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gXG5cCiAJQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIFxuXAogCUdlbmVyYXRlZCBvbjogezB9IFxuCiAKIERyaXZlci5WZXJzaW9uID0gXAotCXhqYyB2ZXJzaW9uICJKQVhCIDIuMCBpbiBKREsgMS42IiBcblwKLQlKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIChidWlsZCBKQVhCIDIuMCBpbiBKREsgMS42KQkKKwl4amMgdmVyc2lvbiAiSkFYQiAyLjEuMyIgXG5cCisJSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCAoYnVpbGQgSkFYQiAyLjEuMyBpbiBKREspCQogCi1Ecml2ZXIuQnVpbGRJRCA9IEpBWEIgMi4wIGluIEpESyAxLjYKK0RyaXZlci5CdWlsZElEID0gSkFYQiAyLjEuMyBpbiBKREsKIAkKICMgc2VlIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0IGZvciBmb3JtYXQgc3ludGF4CiBEcml2ZXIuRGF0ZUZvcm1hdCA9IFwKQEAgLTE5NSw5ICsyMTQsNiBAQAogTW9kZWxMb2FkZXIuQmluZGluZ0ZpbGVOb3RTdXBwb3J0ZWRGb3JSTkMgPSBcCiAgICAgRXh0ZXJuYWwgYmluZGluZyBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdGhlIFJFTEFYIE5HIGNvbXBhY3Qgc3ludGF4LgogCi1Ecml2ZXIuTWlzc2luZ1ZlcnNpb24gPSBcCi0JdGhlIC1zb3VyY2Ugb3B0aW9uIGlzIG1pc3NpbmcgdGhlIHZlcnNpb24gdmFsdWUKLQogRHJpdmVyLkRlZmF1bHRWZXJzaW9uID0gXAogCURlZmF1bHRpbmcgdGhlIHZlcnNpb24gdG8gSkFYQiAyLjAKIApAQCAtMjE2LDYgKzIzMiwxMyBAQAogRklFTERfUkVOREVSRVJfQ09ORkxJQ1QgPSBcCiAgICAgIi17MH0iIGFuZCAiLXsxfSIgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBzaW5jZSBib3RoIGFmZmVjdCB0aGUgY29kZSBnZW5lcmF0aW9uIAogCi1OQU1FX0NPTlZFUlRFUl9DT05GTElDVCAtIFwKK05BTUVfQ09OVkVSVEVSX0NPTkZMSUNUID0gXAogICAgICItezB9IiBhbmQgIi17MX0iIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgc2luY2UgYm90aCBhZmZlY3QgdGhlIGNvZGUgZ2VuZXJhdGlvbgorCitGQUlMRURfVE9fTE9BRCA9IFwKKyAgICBGYWlsZWQgdG8gbG9hZCAiezB9IjogezF9CisKK1BMVUdJTl9MT0FEX0ZBSUxVUkUgPSBcCisgICAgRmFpbHVyZSB0byBsb2FkIGEgcGx1Z2luOiAiezB9Ii4gVXNlIHRoZSBzeXN0ZW0gcHJvcGVydHkgJyctRGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLk9wdGlvbnMuZmluZFNlcnZpY2VzPXRydWUnJyB0byBcCisgICAgZGlhZ25vc2UgaXQgZnVydGhlcgogIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL01lc3NhZ2VzLmphdmEKaW5kZXggZWEzMjY4Zi4uYWMwNmQ2YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvTWVzc2FnZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTY1LDMwICs2NSwxNSBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRVJJTUVOVEFMX0xBTkdVQUdFX1dBUk5JTkcgPSAvLyAyIGFyZwogICAgICAgICAiRHJpdmVyLkV4cGVyaW1lbnRhbExhbmd1YWdlV2FybmluZyI7CiAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfQ0xBU1NQQVRIID0gLy8gMCBhcmdzCi0gICAgICAgICJEcml2ZXIuTWlzc2luZ0NsYXNzUGF0aCI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfRElSID0gLy8gMCBhcmdzCi0gICAgICAgICJEcml2ZXIuTWlzc2luZ0RpciI7Ci0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9FWElTVEVOVF9ESVIgPSAvLyAxIGFyZwogICAgICAgICAiRHJpdmVyLk5vbkV4aXN0ZW50RGlyIjsKIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19GSUxFTkFNRSA9IC8vIDAgYXJncwotICAgICAgICAiRHJpdmVyLk1pc3NpbmdGaWxlTmFtZSI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUEFDS0FHRU5BTUUgPSAvLyAwIGFyZ3MKLSAgICAgICAgIkRyaXZlci5NaXNzaW5nUGFja2FnZU5hbWUiOwotCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JVTlRJTUVfUEFDS0FHRU5BTUUgPSAvLyAwIGFyZ3MKICAgICAgICAgIkRyaXZlci5NaXNzaW5nUnVudGltZVBhY2thZ2VOYW1lIjsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19NT0RFX09QRVJBTkQgPSAvLyAwIGFyZ3MKICAgICAgICAgIkRyaXZlci5NaXNzaW5nTW9kZU9wZXJhbmQiOwogCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX0NBVEFMT0cgPSAvLyAwIGFyZ3MKLSAgICAgICAgIkRyaXZlci5NaXNzaW5nQ2F0YWxvZyI7Ci0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfQ09NUEFUSUJJTElUWV9PUEVSQU5EID0gLy8gMCBhcmdzCiAgICAgICAgICJEcml2ZXIuTWlzc2luZ0NvbXBhdGliaWxpdHlPcGVyYW5kIjsKIApAQCAtMTA0LDYgKzg5LDEyIEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTExFR0FMX1BST1hZID0gLy8gMSBhcmcKICAgICAgICAgIkRyaXZlci5JTExFR0FMX1BST1hZIjsKIAorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUxMRUdBTF9UQVJHRVRfVkVSU0lPTiA9IC8vIDEgYXJnCisgICAgICAgICJEcml2ZXIuSUxMRUdBTF9UQVJHRVRfVkVSU0lPTiI7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfT1BFUkFORCA9IC8vIDEgYXJnCisgICAgICAgICJEcml2ZXIuTWlzc2luZ09wZXJhbmQiOworCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1BST1hZSE9TVCA9IC8vIDAgYXJncwogICAgICAgICAiRHJpdmVyLk1pc3NpbmdQcm94eUhvc3QiOwogCkBAIC0xNzAsOSArMTYxLDYgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9CSU5ESU5HX0ZJTEVfTk9UX1NVUFBPUlRFRF9GT1JfUk5DID0gLy8gMCBhcmdzCiAgICAgICAgICJNb2RlbExvYWRlci5CaW5kaW5nRmlsZU5vdFN1cHBvcnRlZEZvclJOQyI7CiAKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1ZFUlNJT04gPSAvLyAwIGFyZ3MKLSAgICAgICAgIkRyaXZlci5NaXNzaW5nVmVyc2lvbiI7Ci0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkVSU0lPTiA9IC8vIDAgYXJncwogICAgICAgICAiRHJpdmVyLkRlZmF1bHRWZXJzaW9uIjsKIApAQCAtMTkwLDUgKzE3OCwxMCBAQAogICAgICAgICAiRklFTERfUkVOREVSRVJfQ09ORkxJQ1QiOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0NPTlZFUlRFUl9DT05GTElDVCA9IC8vIDIgYXJncwotICAgICAgICAgICAgIk5BTUVfQ09OVkVSVEVSX0NPTkZMSUNUIjsKKyAgICAgICAgIk5BTUVfQ09OVkVSVEVSX0NPTkZMSUNUIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxFRF9UT19MT0FEID0gLy8gMiBhcmdzCisgICAgICAgICJGQUlMRURfVE9fTE9BRCI7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9MT0FEX0ZBSUxVUkUgPSAvLyAxIGFyZworICAgICAgICAiUExVR0lOX0xPQURfRkFJTFVSRSI7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9Nb2RlbExvYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvTW9kZWxMb2FkZXIuamF2YQppbmRleCA1Yzg0ZjZhLi4xMmRkNmYxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9Nb2RlbExvYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL01vZGVsTG9hZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTM3LDYgKzM2LDcgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuaW50ZXJuYWxpemVyLkRPTUZvcmVzdFNjYW5uZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplci5JbnRlcm5hbGl6YXRpb25Mb2dpYzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuaW50ZXJuYWxpemVyLlZlcnNpb25DaGVja2VyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5pbnRlcm5hbGl6ZXIuU0NEQmFzZWRCaW5kaW5nU2V0OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5yZWxheG5nLlJFTEFYTkdDb21waWxlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIucmVsYXhuZy5SRUxBWE5HSW50ZXJuYWxpemF0aW9uTG9naWM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5CR01CdWlsZGVyOwpAQCAtODksNiArODksMTEgQEAKICAgICBwcml2YXRlIGZpbmFsIE9wdGlvbnMgb3B0OwogICAgIHByaXZhdGUgZmluYWwgRXJyb3JSZWNlaXZlckZpbHRlciBlcnJvclJlY2VpdmVyOwogICAgIHByaXZhdGUgZmluYWwgSkNvZGVNb2RlbCBjb2RlTW9kZWw7CisgICAgLyoqCisgICAgICoge0BsaW5rIERPTUZvcmVzdCN0cmFuc2Zvcm0oYm9vbGVhbil9IGNyZWF0ZXMgdGhpcyBvbiB0aGUgc2lkZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNDREJhc2VkQmluZGluZ1NldCBzY2RCYXNlZEJpbmRpbmdTZXQ7CisKIAogICAgIC8qKgogICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGxvYWQgc2NoZW1hcyBpbnRvIGEge0BsaW5rIE1vZGVsfS4KQEAgLTE3Nyw2ICsxODIsOSBAQAogICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEFib3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQgYWxyZWFkeSwgc2luY2UgdGhpcyBpcyByZXF1ZXN0ZWQgYnkgdGhlIGVycm9yIHJlY2VpdmVyCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjk3LDExICszMDUsMTQgQEAKICAgICAgICAgZm9yZXN0LnNldEVudGl0eVJlc29sdmVyKG9wdC5lbnRpdHlSZXNvbHZlcik7CiAKICAgICAgICAgLy8gcGFyc2Ugc291cmNlIGdyYW1tYXJzCi0gICAgICAgIGZvciAoSW5wdXRTb3VyY2UgdmFsdWUgOiBvcHQuZ2V0R3JhbW1hcnMoKSkKKyAgICAgICAgZm9yIChJbnB1dFNvdXJjZSB2YWx1ZSA6IG9wdC5nZXRHcmFtbWFycygpKSB7CisgICAgICAgICAgICBlcnJvclJlY2VpdmVyLnBvbGxBYm9ydCgpOwogICAgICAgICAgICAgZm9yZXN0LnBhcnNlKHZhbHVlLCB0cnVlKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHBhcnNlIGV4dGVybmFsIGJpbmRpbmcgZmlsZXMKICAgICAgICAgZm9yIChJbnB1dFNvdXJjZSB2YWx1ZSA6IG9wdC5nZXRCaW5kRmlsZXMoKSkgeworICAgICAgICAgICAgZXJyb3JSZWNlaXZlci5wb2xsQWJvcnQoKTsKICAgICAgICAgICAgIERvY3VtZW50IGRvbSA9IGZvcmVzdC5wYXJzZSh2YWx1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICBpZihkb209PW51bGwpICAgICAgIGNvbnRpbnVlOyAgIC8vIGVycm9yIG11c3QgaGF2ZSBiZWVuIHJlcG9ydGVkCiAgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSBkb20uZ2V0RG9jdW1lbnRFbGVtZW50KCk7CkBAIC0zMTcsNyArMzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSkpOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yZXN0LnRyYW5zZm9ybSgpOworICAgICAgICBzY2RCYXNlZEJpbmRpbmdTZXQgPSBmb3Jlc3QudHJhbnNmb3JtKG9wdC5pc0V4dGVuc2lvbk1vZGUoKSk7CiAKICAgICAgICAgcmV0dXJuIGZvcmVzdDsKICAgICB9CkBAIC0zNTAsNyArMzYxLDcgQEAKICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc2xvd2VyIHdheSBpcyB0byBwYXJzZSBldmVyeXRoaW5nIGludG8gRE9NIGZpcnN0LgogICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiB0YWtlIGV4dGVybmFsIGFubm90YXRpb25zIGludG8gYWNjb3VudC4KICAgICAgICAgRE9NRm9yZXN0IGZvcmVzdCA9IGJ1aWxkRE9NRm9yZXN0KCBuZXcgWE1MU2NoZW1hSW50ZXJuYWxpemF0aW9uTG9naWMoKSApOwotICAgICAgICByZXR1cm4gY3JlYXRlWFNPTShmb3Jlc3QpOworICAgICAgICByZXR1cm4gY3JlYXRlWFNPTShmb3Jlc3QsIHNjZEJhc2VkQmluZGluZ1NldCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzksMTggKzQ5MCwyMyBAQAogICAgIC8qKgogICAgICAqIFBhcnNlcyBhIHtAbGluayBET01Gb3Jlc3R9IGludG8gYSB7QGxpbmsgWFNTY2hlbWFTZXR9LgogICAgICAqLwotICAgIHB1YmxpYyBYU1NjaGVtYVNldCBjcmVhdGVYU09NKERPTUZvcmVzdCBmb3Jlc3QpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIHB1YmxpYyBYU1NjaGVtYVNldCBjcmVhdGVYU09NKERPTUZvcmVzdCBmb3Jlc3QsIFNDREJhc2VkQmluZGluZ1NldCBzY2RCYXNlZEJpbmRpbmdTZXQpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICAvLyBzZXQgdXAgb3RoZXIgcGFyYW1ldGVycyB0byBYU09NUGFyc2VyCiAgICAgICAgIFhTT01QYXJzZXIgcmVhZGVyID0gY3JlYXRlWFNPTVBhcnNlcihmb3Jlc3QpOwogCiAgICAgICAgIC8vIHJlLXBhcnNlIHRoZSB0cmFuc2Zvcm1lZCBzY2hlbWFzCiAgICAgICAgIGZvciAoU3RyaW5nIHN5c3RlbUlkIDogZm9yZXN0LmdldFJvb3REb2N1bWVudHMoKSkgeworICAgICAgICAgICAgZXJyb3JSZWNlaXZlci5wb2xsQWJvcnQoKTsKICAgICAgICAgICAgIERvY3VtZW50IGRvbSA9IGZvcmVzdC5nZXQoc3lzdGVtSWQpOwogICAgICAgICAgICAgaWYgKCFkb20uZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKENvbnN0LkpBWEJfTlNVUkkpKQogICAgICAgICAgICAgICAgIHJlYWRlci5wYXJzZShzeXN0ZW1JZCk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFJlc3VsdCgpOworICAgICAgICBYU1NjaGVtYVNldCByZXN1bHQgPSByZWFkZXIuZ2V0UmVzdWx0KCk7CisKKyAgICAgICAgc2NkQmFzZWRCaW5kaW5nU2V0LmFwcGx5KHJlc3VsdCxlcnJvclJlY2VpdmVyKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvT3B0aW9ucy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvT3B0aW9ucy5qYXZhCmluZGV4IGI3NDFiZTQuLmI4MWU0YWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL09wdGlvbnMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9PcHRpb25zLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzAsNiArMzAsOCBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CkBAIC01MCw2ICs1Miw3IEBACiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhtbC5pbnRlcm5hbC5yZXNvbHZlci5DYXRhbG9nTWFuYWdlcjsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueG1sLmludGVybmFsLnJlc29sdmVyLnRvb2xzLkNhdGFsb2dSZXNvbHZlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuQ2xhc3NOYW1lQWxsb2NhdG9yOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5TcGVjVmVyc2lvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbi5maWVsZC5GaWVsZFJlbmRlcmVyRmFjdG9yeTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5Nb2RlbDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuVXRpbDsKQEAgLTk3LDYgKzEwMCwxMSBAQAogICAgIHB1YmxpYyBib29sZWFuIHJ1bnRpbWUxNCA9IGZhbHNlOwogCiAgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdHJ5IHRvIHJlc29sdmUgbmFtZSBjb25mbGljdHMgYXV0b21hdGljYWxseSBieSBhc3NpZ25pbmcgbWVjaGFuaWNhbCBudW1iZXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGF1dG9tYXRpY05hbWVDb25mbGljdFJlc29sdXRpb24gPSBmYWxzZTsKKworICAgIC8qKgogICAgICAqIHN0cmljdGx5IGZvbGxvdyB0aGUgY29tcGF0aWJpbGl0eSBydWxlcyBhbmQgcmVqZWN0IHNjaGVtYXMgdGhhdAogICAgICAqIGNvbnRhaW4gZmVhdHVyZXMgZnJvbSBBcHAuIEUuMiwgdXNlIHZlbmRvciBiaW5kaW5nIGV4dGVuc2lvbnMKICAgICAgKi8KQEAgLTExNCw2ICsxMjIsMTYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbXBhdGliaWxpdHlNb2RlID0gU1RSSUNUOwogCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gY29tcGF0aWJpbGl0eU1vZGU9PUVYVEVOU0lPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgb3V0cHV0IGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb24gb2YgdGhlIHJ1bnRpbWUuCisgICAgICovCisgICAgcHVibGljIFNwZWNWZXJzaW9uIHRhcmdldCA9IFNwZWNWZXJzaW9uLlYyXzE7CisKKwogICAgIC8qKiBUYXJnZXQgZGlyZWNvdHkgd2hlbiBwcm9kdWNpbmcgZmlsZXMuICovCiAgICAgcHVibGljIEZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoIi4iKTsKIApAQCAtMzc2LDEzICszOTQsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGlucHV0IHNjaGVtYS4KKyAgICAgKiBBZGRzIGEgbmV3IGJpbmRpbmcgZmlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRCaW5kRmlsZSggSW5wdXRTb3VyY2UgaXMgKSB7CiAgICAgICAgIGJpbmRGaWxlcy5hZGQoYWJzb2x1dGl6ZShpcykpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgYmluZGluZyBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJpbmRGaWxlKCBGaWxlIGJpbmRGaWxlICkgeworICAgICAgICBiaW5kRmlsZXMuYWRkKGZpbGVUb0lucHV0U291cmNlKGJpbmRGaWxlKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmVjdXJzaXZlbHkgc2NhbiBkaXJlY3RvcmllcyBhbmQgYWRkIGFsbCAiLnhqYiIgZmlsZXMgaW4gaXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQmluZEZpbGVSZWN1cnNpdmUoIEZpbGUgZGlyICkgewpAQCAtNDEwLDEyICs0MzUsOSBAQAogICAgICAqIEBleGNlcHRpb24gQmFkQ29tbWFuZExpbmVFeGNlcHRpb24KICAgICAgKiAgICAgIElmIHRoZSBjYWxsZWUgd2FudHMgdG8gcHJvdmlkZSBhIGN1c3RvbSBtZXNzYWdlIGZvciBhbiBlcnJvci4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHBhcnNlQXJndW1lbnQoIFN0cmluZ1tdIGFyZ3MsIGludCBpICkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgaW50IHBhcnNlQXJndW1lbnQoIFN0cmluZ1tdIGFyZ3MsIGludCBpICkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItY2xhc3NwYXRoIikgfHwgYXJnc1tpXS5lcXVhbHMoIi1jcCIpKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuTUlTU0lOR19DTEFTU1BBVEgpKTsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXF1aXJlQXJndW1lbnQoYXJnc1tpXSxhcmdzLCsraSkpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBjbGFzc3BhdGhzLmFkZChmaWxlLnRvVVJMKCkpOwogICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKQEAgLTQyNSwxMCArNDQ3LDcgQEAKICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICB9CiAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLWQiKSkgewotICAgICAgICAgICAgaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLk1JU1NJTkdfRElSKSk7Ci0gICAgICAgICAgICB0YXJnZXREaXIgPSBuZXcgRmlsZShhcmdzWysraV0pOworICAgICAgICAgICAgdGFyZ2V0RGlyID0gbmV3IEZpbGUocmVxdWlyZUFyZ3VtZW50KCItZCIsYXJncywrK2kpKTsKICAgICAgICAgICAgIGlmKCAhdGFyZ2V0RGlyLmV4aXN0cygpICkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5OT05fRVhJU1RFTlRfRElSLHRhcmdldERpcikpOwpAQCAtNDM5LDEwICs0NTgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcCIpKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuTUlTU0lOR19QQUNLQUdFTkFNRSkpOwotICAgICAgICAgICAgZGVmYXVsdFBhY2thZ2UgPSBhcmdzWysraV07CisgICAgICAgICAgICBkZWZhdWx0UGFja2FnZSA9IHJlcXVpcmVBcmd1bWVudCgiLXAiLGFyZ3MsKytpKTsKICAgICAgICAgICAgIGlmKGRlZmF1bHRQYWNrYWdlLmxlbmd0aCgpPT0wKSB7IC8vIHVzZXIgc3BlY2lmaWVkIGRlZmF1bHQgcGFja2FnZQogICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdvbid0IGJlIGFueSBwYWNrYWdlIHRvIGFubm90YXRlLCBzbyBkaXNhYmxlIHRoZW0KICAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGFzIGEgdXNhYmlsaXR5IGZlYXR1cmUKQEAgLTQ3OSwxMiArNDk1LDEyIEBACiAgICAgICAgICAgICBydW50aW1lMTQgPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWGF1dG9OYW1lUmVzb2x1dGlvbiIpKSB7CisgICAgICAgICAgICBhdXRvbWF0aWNOYW1lQ29uZmxpY3RSZXNvbHV0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLWIiKSkgewotICAgICAgICAgICAgaWYgKGk9PWFyZ3MubGVuZ3RoLTEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLk1JU1NJTkdfRklMRU5BTUUpKTsKLQotICAgICAgICAgICAgYWRkRmlsZShhcmdzW2kgKyAxXSxiaW5kRmlsZXMsIi54amIiKTsKKyAgICAgICAgICAgIGFkZEZpbGUocmVxdWlyZUFyZ3VtZW50KCItYiIsYXJncywrK2kpLGJpbmRGaWxlcywiLnhqYiIpOwogICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZHRkIikpIHsKQEAgLTUxMSw2ICs1MjcsMTMgQEAKICAgICAgICAgICAgIGNvbXBhdGliaWxpdHlNb2RlID0gRVhURU5TSU9OOwogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdGFyZ2V0IikpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHJlcXVpcmVBcmd1bWVudCgiLXRhcmdldCIsYXJncywrK2kpOworICAgICAgICAgICAgdGFyZ2V0ID0gU3BlY1ZlcnNpb24ucGFyc2UodG9rZW4pOworICAgICAgICAgICAgaWYodGFyZ2V0PT1udWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbihNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuSUxMRUdBTF9UQVJHRVRfVkVSU0lPTix0b2tlbikpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItaHR0cHByb3h5ZmlsZSIpKSB7CiAgICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKApAQCAtNTQ0LDMyICs1NjcsMTkgQEAKICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICB9CiAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLWhvc3QiKSkgewotICAgICAgICAgICAgLy8gbGVnYWN5IG9wdGlvbi4gd2UgdXNlIC1odHRwcHJveHkgZm9yIG1vcmUgY29udHJvbAotICAgICAgICAgICAgaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxIHx8IGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLk1JU1NJTkdfUFJPWFlIT1NUKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm94eUhvc3QgPSBhcmdzWysraV07CisgICAgICAgICAgICBwcm94eUhvc3QgPSByZXF1aXJlQXJndW1lbnQoIi1ob3N0IixhcmdzLCsraSk7CiAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgfQogICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1wb3J0IikpIHsKLSAgICAgICAgICAgIC8vIGxlZ2FjeSBvcHRpb24uIHdlIHVzZSAtaHR0cHByb3h5IGZvciBtb3JlIGNvbnRyb2wKLSAgICAgICAgICAgIGlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5NSVNTSU5HX1BST1hZUE9SVCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJveHlQb3J0ID0gYXJnc1srK2ldOworICAgICAgICAgICAgcHJveHlQb3J0ID0gcmVxdWlyZUFyZ3VtZW50KCItcG9ydCIsYXJncywrK2kpOwogICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgIH0KICAgICAgICAgaWYoIGFyZ3NbaV0uZXF1YWxzKCItY2F0YWxvZyIpICkgewogICAgICAgICAgICAgLy8gdXNlIFN1bidzICJYTUwgRW50aXR5IGFuZCBVUkkgUmVzb2x2ZXJzIiBieSBOb3JtYW4gV2Fsc2gKICAgICAgICAgICAgIC8vIHRvIHJlc29sdmUgZXh0ZXJuYWwgZW50aXRpZXMuCiAgICAgICAgICAgICAvLyBodHRwOi8vd3d3LnN1bi5jb20veG1sL2RldmVsb3BlcnMvcmVzb2x2ZXIvCi0gICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuTUlTU0lOR19DQVRBTE9HKSk7CiAKLSAgICAgICAgICAgIEZpbGUgY2F0YWxvZ0ZpbGUgPSBuZXcgRmlsZShhcmdzWysraV0pOworICAgICAgICAgICAgRmlsZSBjYXRhbG9nRmlsZSA9IG5ldyBGaWxlKHJlcXVpcmVBcmd1bWVudCgiLWNhdGFsb2ciLGFyZ3MsKytpKSk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGFkZENhdGFsb2coY2F0YWxvZ0ZpbGUpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtNTc5LDE0ICs1ODksMTEgQEAKICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICB9CiAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLXNvdXJjZSIpKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuTUlTU0lOR19WRVJTSU9OKSk7Ci0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gcmVxdWlyZUFyZ3VtZW50KCItc291cmNlIixhcmdzLCsraSk7CiAgICAgICAgICAgICAvL0ZvciBzb3VyY2UgMS4wIHRoZSAxLjAgRHJpdmVyIGlzIGxvYWRlZAogICAgICAgICAgICAgLy9IZW5jZSBhbnl0aGluZyBvdGhlciB0aGFuIDIuMCBpcyBkZWZhdWx0ZWQgdG8KICAgICAgICAgICAgIC8vMi4wCi0gICAgICAgICAgICBpZiggIXZlcnNpb24uZXF1YWxzKCIyLjAiKSApCisgICAgICAgICAgICBpZiggIXZlcnNpb24uZXF1YWxzKCIyLjAiKSAmJiAhdmVyc2lvbi5lcXVhbHMoIjIuMSIpICkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5ERUZBVUxUX1ZFUlNJT04pKTsKICAgICAgICAgICAgIHJldHVybiAyOwpAQCAtNjAzLDE0ICs2MTAsMjMgQEAKIAogICAgICAgICAvLyBzZWUgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIGV4dGVuc2lvbnMKICAgICAgICAgZm9yKCBQbHVnaW4gcGx1Z2luIDogZ2V0QWxsUGx1Z2lucygpICkgewotICAgICAgICAgICAgaWYoICgnLScrcGx1Z2luLmdldE9wdGlvbk5hbWUoKSkuZXF1YWxzKGFyZ3NbaV0pICkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVBsdWdpbnMuYWRkKHBsdWdpbik7Ci0gICAgICAgICAgICAgICAgcGx1Z2luLm9uQWN0aXZhdGVkKHRoaXMpOwotICAgICAgICAgICAgICAgIHBsdWdpblVSSXMuYWRkQWxsKHBsdWdpbi5nZXRDdXN0b21pemF0aW9uVVJJcygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiggKCctJytwbHVnaW4uZ2V0T3B0aW9uTmFtZSgpKS5lcXVhbHMoYXJnc1tpXSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBsdWdpbnMuYWRkKHBsdWdpbik7CisgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5vbkFjdGl2YXRlZCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgcGx1Z2luVVJJcy5hZGRBbGwocGx1Z2luLmdldEN1c3RvbWl6YXRpb25VUklzKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgdGhlIHBsdWdpbiBhIGNoYW5jZSB0byBwYXJzZSBhcmd1bWVudHMgdG8gdGhpcyBvcHRpb24uCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmV3IGluIDIuMSwgYW5kIGR1ZSB0byB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb24sCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBsdWdpbiBkaWRuJ3QgdW5kZXJzdGFuZCBpdCwgd2Ugc3RpbGwgcmV0dXJuIDEgdG8gaW5kaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGlzIG9wdGlvbiBpcyBjb25zdW1lZC4KKyAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBwbHVnaW4ucGFyc2VBcmd1bWVudCh0aGlzLGFyZ3MsaSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHIhPTApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaW50IHIgPSBwbHVnaW4ucGFyc2VBcmd1bWVudCh0aGlzLGFyZ3MsaSk7CiAgICAgICAgICAgICAgICAgaWYociE9MCkgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC02NDIsNiArNjU4LDE3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogT2J0YWlucyBhbiBvcGVyYW5kIGFuZCByZXBvcnRzIGFuIGVycm9yIGlmIGl0J3Mgbm90IHRoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgcmVxdWlyZUFyZ3VtZW50KFN0cmluZyBvcHRpb25OYW1lLCBTdHJpbmdbXSBhcmdzLCBpbnQgaSkgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGkgPT0gYXJncy5sZW5ndGggfHwgYXJnc1tpXS5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuTUlTU0lOR19PUEVSQU5ELG9wdGlvbk5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJnc1tpXTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBQYXJzZXMgYSB0b2tlbiB0byBhIGZpbGUgKG9yIGEgc2V0IG9mIGZpbGVzKQogICAgICAqIGFuZCBhZGQgdGhlbSBhcyB7QGxpbmsgSW5wdXRTb3VyY2V9IHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KICAgICAgKgpAQCAtNjk4LDcgKzcyNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLlVOUkVDT0dOSVpFRF9QQVJBTUVURVIsIGFyZ3NbaV0pKTsKICAgICAgICAgICAgICAgICBpICs9IChqLTEpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRGaWxlKGFyZ3NbaV0sZ3JhbW1hcnMsIi54c2QiKTsKKyAgICAgICAgICAgICAgICBpZihhcmdzW2ldLmVuZHNXaXRoKCIuamFyIikpCisgICAgICAgICAgICAgICAgICAgIHNjYW5FcGlzb2RlRmlsZShuZXcgRmlsZShhcmdzW2ldKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhZGRGaWxlKGFyZ3NbaV0sZ3JhbW1hcnMsIi54c2QiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03MjksNiArNzU5LDI3IEBACiAKICAgICAgICAgaWYoIHNjaGVtYUxhbmd1YWdlPT1udWxsICkKICAgICAgICAgICAgIHNjaGVtYUxhbmd1YWdlID0gZ3Vlc3NTY2hlbWFMYW5ndWFnZSgpOworCisgICAgICAgIGlmKHBsdWdpbkxvYWRGYWlsdXJlIT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5QTFVHSU5fTE9BRF9GQUlMVVJFLHBsdWdpbkxvYWRGYWlsdXJlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgdGhlIDx0dD5NRVRBLUlORi9zdW4tamF4Yi5lcGlzb2RlPC90dD4gZmlsZSB0byBhZGQgYXMgYSBiaW5kaW5nIGN1c3RvbWl6YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5FcGlzb2RlRmlsZShGaWxlIGphcikgdGhyb3dzIEJhZENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTENsYXNzTG9hZGVyIHVjbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW117amFyLnRvVVJMKCl9KTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uPFVSTD4gcmVzb3VyY2VzID0gdWNsLmZpbmRSZXNvdXJjZXMoIk1FVEEtSU5GL3N1bi1qYXhiLmVwaXNvZGUiKTsKKyAgICAgICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBVUkwgdXJsID0gcmVzb3VyY2VzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgYWRkQmluZEZpbGUobmV3IElucHV0U291cmNlKHVybC50b0V4dGVybmFsRm9ybSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLkZBSUxFRF9UT19MT0FELGphcixlLmdldE1lc3NhZ2UoKSksIGUpOworICAgICAgICB9CiAgICAgfQogCiAKQEAgLTc2Nyw2ICs4MTgsMTQgQEAKICAgICAgICAgaWYobm9GaWxlSGVhZGVyKQogICAgICAgICAgICAgcmV0dXJuIGNvcmU7CiAKKyAgICAgICAgcmV0dXJuIG5ldyBQcm9sb2dDb2RlV3JpdGVyKCBjb3JlLGdldFByb2xvZ0NvbW1lbnQoKSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0cmluZyBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIHRoZSBwcm9sb2cgY29tbWVudCBiYWtlZCBpbnRvIGFydGlmYWN0cy4KKyAgICAgKiBUaGlzIGlzIHRoZSBzdHJpbmcgbGlrZSAiVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWEIgUkkgb24gWVlZWS9tbS9kZC4uLiIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2xvZ0NvbW1lbnQoKSB7CiAgICAgICAgIC8vIGdlbmVyYXRlIGZvcm1hdCBzeW50YXg6IDxkYXRlPiAnYXQnIDx0aW1lPgogICAgICAgICBTdHJpbmcgZm9ybWF0ID0KICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5EQVRFX0ZPUk1BVCkKQEAgLTc3NiwxNCArODM1LDE1IEBACiAgICAgICAgICAgICAgICAgKyBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuVElNRV9GT1JNQVQpOwogICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQpOwogCi0gICAgICAgIHJldHVybiBuZXcgUHJvbG9nQ29kZVdyaXRlciggY29yZSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkZJTEVfUFJPTE9HX0NPTU1FTlQsCi0gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKCkpKSApOworICAgICAgICByZXR1cm4gTWVzc2FnZXMuZm9ybWF0KAorICAgICAgICAgICAgTWVzc2FnZXMuRklMRV9QUk9MT0dfQ09NTUVOVCwKKyAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKCkpKTsKICAgICB9CiAKLQotCisgICAgLyoqCisgICAgICogSWYgYSBwbHVnaW4gZmFpbGVkIHRvIGxvYWQsIHJlcG9ydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGx1Z2luTG9hZEZhaWx1cmU7CiAKICAgICAvKioKICAgICAgKiBMb29rcyBmb3IgYWxsICJNRVRBLUlORi9zZXJ2aWNlcy9bY2xhc3NOYW1lXSIgZmlsZXMgYW5kCkBAIC04MjUsOSArODg1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNsYXNzTmFtZXMuYWRkKGltcGwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaW1wbENsYXNzID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKGltcGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjbGF6ei5pc0Fzc2lnbmFibGVGcm9tKGltcGxDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVidWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbXBsKyIgaXMgbm90IGEgc3ViY2xhc3Mgb2YgIitjbGF6eisiLiBTa2lwcGluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbkxvYWRGYWlsdXJlID0gaW1wbCsiIGlzIG5vdCBhIHN1YmNsYXNzIG9mICIrY2xhenorIi4gU2tpcHBpbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwbHVnaW5Mb2FkRmFpbHVyZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZWJ1ZykgewpAQCAtODM5LDggKzg5OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpdCBnby4KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIodykpOworICAgICAgICAgICAgICAgICAgICBwbHVnaW5Mb2FkRmFpbHVyZSA9IHcudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgaWYoZGVidWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwbHVnaW5Mb2FkRmFpbHVyZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYoIHJlYWRlciE9bnVsbCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CkBAIC04NTUsOCArOTE4LDExIEBACiAgICAgICAgICAgICByZXR1cm4gYS50b0FycmF5KChUW10pQXJyYXkubmV3SW5zdGFuY2UoY2xhenosYS5zaXplKCkpKTsKICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIGUgKSB7CiAgICAgICAgICAgICAvLyBpZ25vcmUgYW55IGVycm9yCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcih3KSk7CisgICAgICAgICAgICBwbHVnaW5Mb2FkRmFpbHVyZSA9IHcudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGlmKGRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBsdWdpbkxvYWRGYWlsdXJlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAoVFtdKUFycmF5Lm5ld0luc3RhbmNlKGNsYXp6LDApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9QbHVnaW4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL1BsdWdpbi5qYXZhCmluZGV4IDgyZDIxZDMuLjQwODBlOWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL1BsdWdpbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL1BsdWdpbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zNSw2ICszNCw3IEBACiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMub3V0bGluZS5PdXRsaW5lOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBBZGQtb24gdGhhdCB3b3JrcyBvbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlLgpAQCAtNTksNiArNTksMTEgQEAKICAgICAgKiB0dXJuIG9uIHRoaXMgcGx1Z2luLiBBIHBsdWdpbiBuZWVkcyB0byBiZSB0dXJuZWQKICAgICAgKiBvbiBleHBsaWNpdGx5LCBvciBlbHNlIG5vIG90aGVyIG1ldGhvZHMgb2Yge0BsaW5rIFBsdWdpbn0KICAgICAgKiB3aWxsIGJlIGludm9rZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTdGFydGluZyAyLjEsIHdoZW4gYW4gb3B0aW9uIG1hdGNoZXMgdGhlIG5hbWUgcmV0dXJuZWQKKyAgICAgKiBmcm9tIHRoaXMgbWV0aG9kLCBYSkMgd2lsbCB0aGVuIGludm9rZSB7QGxpbmsgI3BhcnNlQXJndW1lbnQoT3B0aW9ucywgU3RyaW5nW10sIGludCl9LAorICAgICAqIGFsbG93aW5nIHBsdWdpbnMgdG8gaGFuZGxlIGFyZ3VtZW50cyB0byB0aGlzIG9wdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE9wdGlvbk5hbWUoKTsKIApAQCAtMjI3LDcgKzIzMiwxMyBAQAogICAgICAqICAgICAgSWYgdGhlIGFkZC1vbiBleGVjdXRlcyBzdWNjZXNzZnVsbHksIHJldHVybiB0cnVlLgogICAgICAqICAgICAgSWYgaXQgZGV0ZWN0cyBzb21lIGVycm9ycyBidXQgdGhvc2UgYXJlIHJlcG9ydGVkIGFuZAogICAgICAqICAgICAgcmVjb3ZlcmVkIGdyYWNlZnVsbHksIHJldHVybiBmYWxzZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICogICAgICBBZnRlciBhbiBlcnJvciBpcyByZXBvcnRlZCB0byB7QGxpbmsgRXJyb3JIYW5kbGVyfSwgdGhlCisgICAgICogICAgICBzYW1lIGV4Y2VwdGlvbiBjYW4gYmUgdGhyb3duIHRvIGluZGljYXRlIGEgZmF0YWwgaXJyZWNvdmVyYWJsZQorICAgICAqICAgICAgZXJyb3IuIHtAbGluayBFcnJvckhhbmRsZXJ9IGl0c2VsZiBtYXkgdGhyb3cgaXQsIGlmIGl0IGNob29zZXMKKyAgICAgKiAgICAgIG5vdCB0byByZWNvdmVyIGZyb20gdGhlIGVycm9yLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJ1bigKLSAgICAgICAgT3V0bGluZSBvdXRsaW5lLCBPcHRpb25zIG9wdCwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciApOworICAgICAgICBPdXRsaW5lIG91dGxpbmUsIE9wdGlvbnMgb3B0LCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiA7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9Qcm9ncmVzc0NvZGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL1Byb2dyZXNzQ29kZVdyaXRlci5qYXZhCmluZGV4IGIwZGM4N2MuLmQ1YzcxNWQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL1Byb2dyZXNzQ29kZVdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL1Byb2dyZXNzQ29kZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTY3LDYgKzY2LDggQEAKICAgICAgICAgaWYobmFtZS5sZW5ndGgoKSE9MCkgICAgbmFtZSArPSAgICAgRmlsZS5zZXBhcmF0b3JDaGFyOwogICAgICAgICBuYW1lICs9IGZpbGVOYW1lOwogCisgICAgICAgIGlmKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEV4Y2VwdGlvbigpOwogICAgICAgICBwcm9ncmVzcy5nZW5lcmF0ZWRGaWxlKG5hbWUsY3VycmVudCsrLHRvdGFsRmlsZUNvdW50KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9TY2hlbWFDYWNoZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvU2NoZW1hQ2FjaGUuamF2YQppbmRleCBjNDE5MzQ0Li4yZWQxYjZjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9TY2hlbWFDYWNoZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL1NjaGVtYUNhY2hlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9YSkNMaXN0ZW5lci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvWEpDTGlzdGVuZXIuamF2YQppbmRleCA5ZGYwY2QzLi44ZjY0NGNhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9YSkNMaXN0ZW5lci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL1hKQ0xpc3RlbmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjOwogCiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKQEAgLTkzLDQgKzkyLDI3IEBACiAgICAgICogICAgICBuZXZlciBudWxsLiB0aGlzIGlzIHRoZSByb290IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvZGUgZ2VuZXJhdGlvbiBzdHJhdGVneS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb21waWxlZChPdXRsaW5lIG91dGxpbmUpIHt9CisKKyAgICAvKioKKyAgICAgKiBYSkMgd2lsbCBwZXJpb2RpY2FsbHkgaW52b2tlIHRoaXMgbWV0aG9kIHRvIHNlZSBpZiBpdCBzaG91bGQgY2FuY2VsIGEgY29tcGlsYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBcyBsb25nIGFzIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIFhKQyB3aWxsIGtlZXAgZ29pbmcuIElmIHRoaXMgbWV0aG9kIGV2ZXIgcmV0dXJucworICAgICAqIHRydWUsIFhKQyB3aWxsIGFib3J0IHRoZSBwcm9jZXNzaW5nIHJpZ2h0IGF3YXkgYW5kCisgICAgICogcmV0dXJucyBub24temVybyBmcm9tIHtAbGluayBEcml2ZXIjcnVuKFN0cmluZ1tdLCBYSkNMaXN0ZW5lcil9LgorICAgICAqIE5vdGUgdGhhdCBYSkMgd2lsbCBub3QgcmVwb3J0IGFuIGFib3J0aW9uIHRocm91Z2ggdGhlIHtAbGluayAjbWVzc2FnZShTdHJpbmcpfSBtZXRob2QuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgZGVzcGl0ZSBhbGwgdGhlIGVmZm9ydHMgdG8gY2hlY2sgdGhpcyBtZXRob2QgZnJlcXVlbnRseSwgWEpDIG1heSBzdGlsbCBmYWlsIHRvCisgICAgICogaW52b2tlIHRoaXMgbWV0aG9kIGZvciBhIGxvbmcgdGltZS4gU3VjaCBzY2VuYXJpbyB3b3VsZCBpbmNsdWRlIG5ldHdvcmsgcmVsYXRlZCBwcm9ibGVtcworICAgICAqIG9yIG90aGVyIEkvTyBibG9jayAoeW91IGNhbid0IGV2ZW4gaW50ZXJydXB0IHRoZSB0aHJlYWQgd2hpbGUgSS9PIGlzIGJsb2NraW5nLikKKyAgICAgKiBTbyBqdXN0IGJld2FyZSB0aGF0IHRoaXMgaXMgbm90IGEgY3VyZS1hbGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0cnVlIGlmIHRoZSB7QGxpbmsgWEpDTGlzdGVuZXJ9IHdhbnRzIHRvIGFib3J0IHRoZSBwcm9jZXNzaW5nLgorICAgICAqIEBzaW5jZSAyLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vYXRfZ2VuZXJhdGVkL1BsdWdpbkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FkZG9uL2F0X2dlbmVyYXRlZC9QbHVnaW5JbXBsLmphdmEKaW5kZXggNmI3MmRkYy4uOGZmZDk0MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vYXRfZ2VuZXJhdGVkL1BsdWdpbkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hZGRvbi9hdF9nZW5lcmF0ZWQvUGx1Z2luSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hZGRvbi5hdF9nZW5lcmF0ZWQ7CiAKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKQEAgLTkxLDcgKzkwLDcgQEAKICAgICAgICAgbS5hbm5vdGF0ZShhbm5vdGF0aW9uKQogICAgICAgICAgICAgICAgIC5wYXJhbSgidmFsdWUiLERyaXZlci5jbGFzcy5nZXROYW1lKCkpCiAgICAgICAgICAgICAgICAgLnBhcmFtKCJkYXRlIiwgZ2V0SVNPODYwMURhdGUoKSkKLSAgICAgICAgICAgICAgICAucGFyYW0oImNvbW1lbnQiLCAiSkFYQiBSSSB2IiArIE9wdGlvbnMuZ2V0QnVpbGRJRCgpKTsKKyAgICAgICAgICAgICAgICAucGFyYW0oImNvbW1lbnRzIiwgIkpBWEIgUkkgdiIgKyBPcHRpb25zLmdldEJ1aWxkSUQoKSk7CiAgICAgfQogCiAgICAgLy8gY2FjaGUgdGhlIHRpbWVzdGFtcCBzbyB0aGF0IGFsbCB0aGUgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucyBtYXRjaApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vY29kZV9pbmplY3Rvci9Db25zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vY29kZV9pbmplY3Rvci9Db25zdC5qYXZhCmluZGV4IGY3ZWM5ODUuLjMyNGQxMzcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FkZG9uL2NvZGVfaW5qZWN0b3IvQ29uc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hZGRvbi9jb2RlX2luamVjdG9yL0NvbnN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFkZG9uLmNvZGVfaW5qZWN0b3I7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vY29kZV9pbmplY3Rvci9QbHVnaW5JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hZGRvbi9jb2RlX2luamVjdG9yL1BsdWdpbkltcGwuamF2YQppbmRleCA5OTljMTkwLi4xYzMxYjBiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hZGRvbi9jb2RlX2luamVjdG9yL1BsdWdpbkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hZGRvbi9jb2RlX2luamVjdG9yL1BsdWdpbkltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYWRkb24uY29kZV9pbmplY3RvcjsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FkZG9uL2VwaXNvZGUvUGx1Z2luSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vZXBpc29kZS9QbHVnaW5JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkZmU3MwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FkZG9uL2VwaXNvZGUvUGx1Z2luSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFkZG9uLmVwaXNvZGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuQmFkQ29tbWFuZExpbmVFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuT3B0aW9uczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW47CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMub3V0bGluZS5DbGFzc091dGxpbmU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMub3V0bGluZS5PdXRsaW5lOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5Db25zdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlRYVzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dC5TdHJlYW1TZXJpYWxpemVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBbm5vdGF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBdHRHcm91cERlY2w7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dHJpYnV0ZURlY2w7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dHJpYnV0ZVVzZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcGxleFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbXBvbmVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29udGVudFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNFbGVtZW50RGVjbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRmFjZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0lkZW50aXR5Q29uc3RyYWludDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTTW9kZWxHcm91cDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTTW9kZWxHcm91cERlY2w7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU05vdGF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNQYXJ0aWNsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTU2NoZW1hOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNTaW1wbGVUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNXaWxkY2FyZDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTWFBhdGg7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS52aXNpdG9yLlhTRnVuY3Rpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4uZXBpc29kZS5CaW5kaW5nczsKKworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKKy8qKgorICogQ3JlYXRlcyB0aGUgZXBpc29kZSBmaWxlLAorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGNsYXNzIFBsdWdpbkltcGwgZXh0ZW5kcyBQbHVnaW4geworCisgICAgcHJpdmF0ZSBGaWxlIGVwaXNvZGVGaWxlOworCisgICAgcHVibGljIFN0cmluZyBnZXRPcHRpb25OYW1lKCkgeworICAgICAgICByZXR1cm4gImVwaXNvZGUiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2UoKSB7CisgICAgICAgIHJldHVybiAiICAtZXBpc29kZSA8RklMRT4gICAgOiAgZ2VuZXJhdGUgdGhlIGVwaXNvZGUgZmlsZSBmb3Igc2VwYXJhdGUgY29tcGlsYXRpb24iOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudChPcHRpb25zIG9wdCwgU3RyaW5nW10gYXJncywgaW50IGkpIHRocm93cyBCYWRDb21tYW5kTGluZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpZihhcmdzW2ldLmVxdWFscygiLWVwaXNvZGUiKSkgeworICAgICAgICAgICAgZXBpc29kZUZpbGUgPSBuZXcgRmlsZShvcHQucmVxdWlyZUFyZ3VtZW50KCItZXBpc29kZSIsYXJncywrK2kpKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhcHR1cmUgYWxsIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBmcm9tIGdsb2JhbCBzY2hlbWEgY29tcG9uZW50cworICAgICAqIGFuZCBnZW5lcmF0ZSB0aGVtIGluIGFuIGVwaXNvZGUgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBydW4oT3V0bGluZSBtb2RlbCwgT3B0aW9ucyBvcHQsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gcmVvcmdhbml6ZSBxdWFsaWZ5aW5nIGNvbXBvbmVudHMgYnkgdGhlaXIgbmFtZXNwYWNlcyB0bworICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIGxpc3QgbmljZWx5CisgICAgICAgICAgICBNYXA8WFNTY2hlbWEsIExpc3Q8Q2xhc3NPdXRsaW5lPj4gcGVyU2NoZW1hID0gbmV3IEhhc2hNYXA8WFNTY2hlbWEsTGlzdDxDbGFzc091dGxpbmU+PigpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNDb21wb25lbnRJbk5vTmFtZXNwYWNlID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZvciggQ2xhc3NPdXRsaW5lIGNvIDogbW9kZWwuZ2V0Q2xhc3NlcygpICkgeworICAgICAgICAgICAgICAgIFhTQ29tcG9uZW50IHNjID0gY28udGFyZ2V0LmdldFNjaGVtYUNvbXBvbmVudCgpOworICAgICAgICAgICAgICAgIGlmKHNjPT1udWxsKSAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKCEoc2MgaW5zdGFuY2VvZiBYU0RlY2xhcmF0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgWFNEZWNsYXJhdGlvbiBkZWNsID0gKFhTRGVjbGFyYXRpb24pIHNjOworICAgICAgICAgICAgICAgIGlmKGRlY2wuaXNMb2NhbCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAvLyBsb2NhbCBjb21wb25lbnRzIGNhbm5vdCBiZSByZWZlcmVuY2VkIGZyb20gb3V0c2lkZSwgc28gbm8gbmVlZCB0byBsaXN0LgorCisgICAgICAgICAgICAgICAgTGlzdDxDbGFzc091dGxpbmU+IGxpc3QgPSBwZXJTY2hlbWEuZ2V0KGRlY2wuZ2V0T3duZXJTY2hlbWEoKSk7CisgICAgICAgICAgICAgICAgaWYobGlzdD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzc091dGxpbmU+KCk7CisgICAgICAgICAgICAgICAgICAgIHBlclNjaGVtYS5wdXQoZGVjbC5nZXRPd25lclNjaGVtYSgpLGxpc3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvKTsKKworICAgICAgICAgICAgICAgIGlmKGRlY2wuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgICAgICAgICAgaGFzQ29tcG9uZW50SW5Ob05hbWVzcGFjZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGVwaXNvZGVGaWxlKTsKKyAgICAgICAgICAgIEJpbmRpbmdzIGJpbmRpbmdzID0gVFhXLmNyZWF0ZShCaW5kaW5ncy5jbGFzcywgbmV3IFN0cmVhbVNlcmlhbGl6ZXIob3MsICJVVEYtOCIpKTsKKyAgICAgICAgICAgIGlmKGhhc0NvbXBvbmVudEluTm9OYW1lc3BhY2UpIC8vIG90aGVyd2lzZSBqYXhiIGJpbmRpbmcgTlMgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQorICAgICAgICAgICAgICAgIGJpbmRpbmdzLl9uYW1lc3BhY2UoQ29uc3QuSkFYQl9OU1VSSSwiamF4YiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJpbmRpbmdzLl9uYW1lc3BhY2UoQ29uc3QuSkFYQl9OU1VSSSwiIik7CisgICAgICAgICAgICBiaW5kaW5ncy52ZXJzaW9uKCIyLjEiKTsKKyAgICAgICAgICAgIGJpbmRpbmdzLl9jb21tZW50KCJcblxuIitvcHQuZ2V0UHJvbG9nQ29tbWVudCgpKyJcbiAgIik7CisKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIGxpc3RpbmcgcGVyIHNjaGVtYQorICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8WFNTY2hlbWEsTGlzdDxDbGFzc091dGxpbmU+PiBlIDogcGVyU2NoZW1hLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBCaW5kaW5ncyBncm91cCA9IGJpbmRpbmdzLmJpbmRpbmdzKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRucyA9IGUuZ2V0S2V5KCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgICAgICAgICAgaWYoIXRucy5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgICAgICBncm91cC5fbmFtZXNwYWNlKHRucywidG5zIik7CisKKyAgICAgICAgICAgICAgICBncm91cC5zY2QoIngtc2NoZW1hOjoiKyh0bnMuZXF1YWxzKCIiKT8iIjoidG5zIikpOworICAgICAgICAgICAgICAgIGdyb3VwLnNjaGVtYUJpbmRpbmdzKCkubWFwKGZhbHNlKTsKKworICAgICAgICAgICAgICAgIGZvciAoQ2xhc3NPdXRsaW5lIGNvIDogZS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzIGNoaWxkID0gZ3JvdXAuYmluZGluZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2NkKGNvLnRhcmdldC5nZXRTY2hlbWFDb21wb25lbnQoKS5hcHBseShTQ0QpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQua2xhc3MoKS5yZWYoY28uaW1wbENsYXNzLmZ1bGxOYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBncm91cC5jb21taXQodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJpbmRpbmdzLmNvbW1pdCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmVycm9yKG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHdyaXRlIHRvICIrZXBpc29kZUZpbGUsbnVsbCxlKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyBTQ0QuCisgICAgICogVGhpcyBpcyBmYWlybHkgbGltaXRlZCBhcyBKQVhCIGNhbiBvbmx5IG1hcCBhIGNlcnRhaW4ga2luZCBvZiBjb21wb25lbnRzIHRvIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWFNGdW5jdGlvbjxTdHJpbmc+IFNDRCA9IG5ldyBYU0Z1bmN0aW9uPFN0cmluZz4oKSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWUoWFNEZWNsYXJhdGlvbiBkZWNsKSB7CisgICAgICAgICAgICBpZihkZWNsLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2wuZ2V0TmFtZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAidG5zOiIrZGVjbC5nZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBsZXhUeXBlKFhTQ29tcGxleFR5cGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICJ+IituYW1lKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBzaW1wbGVUeXBlKFhTU2ltcGxlVHlwZSBzaW1wbGVUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gIn4iK25hbWUoc2ltcGxlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGVsZW1lbnREZWNsKFhTRWxlbWVudERlY2wgZGVjbCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUoZGVjbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGUgcmVzdCBpcyBkb2luZyBub3RoaW5nCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYW5ub3RhdGlvbihYU0Fubm90YXRpb24gYW5uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYXR0R3JvdXBEZWNsKFhTQXR0R3JvdXBEZWNsIGRlY2wpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBhdHRyaWJ1dGVEZWNsKFhTQXR0cmlidXRlRGVjbCBkZWNsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYXR0cmlidXRlVXNlKFhTQXR0cmlidXRlVXNlIHVzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHNjaGVtYShYU1NjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBmYWNldChYU0ZhY2V0IGZhY2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbm90YXRpb24oWFNOb3RhdGlvbiBub3RhdGlvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGlkZW50aXR5Q29uc3RyYWludChYU0lkZW50aXR5Q29uc3RyYWludCBkZWNsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgeHBhdGgoWFNYUGF0aCB4cGF0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHBhcnRpY2xlKFhTUGFydGljbGUgcGFydGljbGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBlbXB0eShYU0NvbnRlbnRUeXBlIGVtcHR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgd2lsZGNhcmQoWFNXaWxkY2FyZCB3YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIG1vZGVsR3JvdXBEZWNsKFhTTW9kZWxHcm91cERlY2wgZGVjbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIG1vZGVsR3JvdXAoWFNNb2RlbEdyb3VwIGdyb3VwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hZGRvbi9lcGlzb2RlL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vZXBpc29kZS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODk0M2RkCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vZXBpc29kZS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitAWG1sTmFtZXNwYWNlKENvbnN0LkpBWEJfTlNVUkkpCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFkZG9uLmVwaXNvZGU7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb24uWG1sTmFtZXNwYWNlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5Db25zdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FkZG9uL2xvY2F0b3IvU291cmNlTG9jYXRpb25BZGRPbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vbG9jYXRvci9Tb3VyY2VMb2NhdGlvbkFkZE9uLmphdmEKaW5kZXggYjM1MjI4NC4uODkxN2RkZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vbG9jYXRvci9Tb3VyY2VMb2NhdGlvbkFkZE9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vbG9jYXRvci9Tb3VyY2VMb2NhdGlvbkFkZE9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFkZG9uLmxvY2F0b3I7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzIsNiArMzEsNyBAQAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpEZWZpbmVkQ2xhc3M7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSk1vZDsKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KVmFyOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpNZXRob2Q7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuQmFkQ29tbWFuZExpbmVFeGNlcHRpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuT3B0aW9uczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW47CkBAIC04MCw2ICs4MCwxMCBAQAogICAgICAgICAgICAgICAgIGltcGwuX2ltcGxlbWVudHMoTG9jYXRhYmxlLmNsYXNzKTsKIAogICAgICAgICAgICAgICAgIGltcGwubWV0aG9kKEpNb2QuUFVCTElDLCBMb2NhdG9yLmNsYXNzLCAic291cmNlTG9jYXRpb24iKS5ib2R5KCkuX3JldHVybigkbG9jKTsKKworICAgICAgICAgICAgICAgIEpNZXRob2Qgc2V0dGVyID0gaW1wbC5tZXRob2QoSk1vZC5QVUJMSUMsIFZvaWQuVFlQRSwgInNldFNvdXJjZUxvY2F0aW9uIik7CisgICAgICAgICAgICAgICAgSlZhciAkbmV3TG9jID0gc2V0dGVyLnBhcmFtKExvY2F0b3IuY2xhc3MsICJuZXdMb2NhdG9yIik7CisgICAgICAgICAgICAgICAgc2V0dGVyLmJvZHkoKS5hc3NpZ24oJGxvYywgJG5ld0xvYyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vc3luYy9TeW5jaHJvbml6ZWRNZXRob2RBZGRPbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYWRkb24vc3luYy9TeW5jaHJvbml6ZWRNZXRob2RBZGRPbi5qYXZhCmluZGV4IDEwMGNjYjAuLmVmNzkwODEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FkZG9uL3N5bmMvU3luY2hyb25pemVkTWV0aG9kQWRkT24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hZGRvbi9zeW5jL1N5bmNocm9uaXplZE1ldGhvZEFkZE9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFkZG9uLnN5bmM7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0NsYXNzTmFtZUFsbG9jYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0NsYXNzTmFtZUFsbG9jYXRvci5qYXZhCmluZGV4IGNhZDJkNDEuLjliMjZkMDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9DbGFzc05hbWVBbGxvY2F0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvQ2xhc3NOYW1lQWxsb2NhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvRXJyb3JMaXN0ZW5lci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0Vycm9yTGlzdGVuZXIuamF2YQppbmRleCBhODNkMzEzLi44NjM4YWFkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvRXJyb3JMaXN0ZW5lci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9FcnJvckxpc3RlbmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaTsKIAogaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKQEAgLTQzLDcgKzQyLDcgQEAKICAqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpIChrb2hzdWtlLmthd2FndWNoaUBzdW4uY29tKQogICovCi1wdWJsaWMgaW50ZXJmYWNlIEVycm9yTGlzdGVuZXIgZXh0ZW5kcyBFcnJvckhhbmRsZXIgeworcHVibGljIGludGVyZmFjZSBFcnJvckxpc3RlbmVyIGV4dGVuZHMgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuRXJyb3JMaXN0ZW5lciB7CiAgICAgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pOwogICAgIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pOwogICAgIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0oyU0pBWEJNb2RlbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0oyU0pBWEJNb2RlbC5qYXZhCmluZGV4IDJmYTAxNTQuLmY4Yjc5NjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9KMlNKQVhCTW9kZWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvSjJTSkFYQk1vZGVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTMgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLlNjaGVtYU91dHB1dFJlc29sdmVyOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7CiAKIC8qKgogICoge0BsaW5rIEpBWEJNb2RlbH0gdGhhdCBleHBvc2VzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYXZhaWxhYmxlCkBAIC01NiwyMCArNTYsNiBAQAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyB0aGUgc2NoZW1hIGRvY3VtZW50cyBmcm9tIHRoZSBtb2RlbC4KICAgICAgKgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsZXIgY2FuIHVzZSB0aGUgYWRkaXRpb25hbEVsZW1lbnREZWNscyBwYXJhbWV0ZXIgdG8KLSAgICAgKiBhZGQgZWxlbWVudCBkZWNsYXJhdGlvbnMgdG8gdGhlIGdlbmVyYXRlIHNjaGVtYS4KLSAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIEpBWC1SUEMgcGFzc2VzIGluIHRoZSBmb2xsb3dpbmcgZW50cnk6Ci0gICAgICoKLSAgICAgKiB7Zm9vfWJhciAtPiBEZWNsYXJlZFR5cGUgZm9yIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKgotICAgICAqIHRoZW4gSkFYQiBnZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBlbGVtZW50IGRlY2xhcmF0aW9uIChpbiB0aGUgc2NoZW1hCi0gICAgICogZG9jdW1lbnQgZm9yIHRoZSBuYW1lc3BhY2UgImZvbyIpIgotICAgICAqCi0gICAgICogJmx0O3hzOmVsZW1lbnQgbmFtZT0iYmFyIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICoKLSAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBnZW5lcmF0aW5nIHNjaGVtYSBjb21wb25lbnRzIG5lY2Vzc2FyeSBmb3IgV1NETC4KLSAgICAgKgogICAgICAqIEBwYXJhbSBvdXRwdXRSZXNvbHZlcgogICAgICAqICAgICAgdGhpcyBvYmplY3QgY29udHJvbHMgdGhlIG91dHB1dCB0byB3aGljaCBzY2hlbWFzCiAgICAgICogICAgICB3aWxsIGJlIHNlbnQuCkBAIC03OCw0ICs2NCwxOCBAQAogICAgICAqICAgICAgaWYge0BsaW5rIFNjaGVtYU91dHB1dFJlc29sdmVyfSB0aHJvd3MgYW4ge0BsaW5rIElPRXhjZXB0aW9ufS4KICAgICAgKi8KICAgICB2b2lkIGdlbmVyYXRlU2NoZW1hKFNjaGVtYU91dHB1dFJlc29sdmVyIG91dHB1dFJlc29sdmVyLCBFcnJvckxpc3RlbmVyIGVycm9yTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgZXBpc29kZSBmaWxlIGZyb20gdGhlIG1vZGVsLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlICJlcGlzb2RlIGZpbGUiIGlzIHJlYWxseSBqdXN0IGEgSkFYQiBjdXN0b21pemF0aW9uIGZpbGUgKGJ1dCB3aXRoIHZlbmRvciBleHRlbnNpb25zLAorICAgICAqIGF0IHRoaXMgcG9pbnQpLCB0aGF0IGNhbiBiZSB1c2VkIGxhdGVyIHdpdGggYSBzY2hlbWEgY29tcGlsYXRpb24gdG8gc3VwcG9ydCBzZXBhcmF0ZQorICAgICAqIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgVGhpcyByZWNlaXZlcyB0aGUgZ2VuZXJhdGVkIGVwaXNvZGUgZmlsZS4KKyAgICAgKiBAc2luY2UgMi4xCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZUVwaXNvZGVGaWxlKFJlc3VsdCBvdXRwdXQpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0pBWEJNb2RlbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0pBWEJNb2RlbC5qYXZhCmluZGV4IGM1ODYyNDYuLjU1ZDcyZmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9KQVhCTW9kZWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvSkFYQk1vZGVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0phdmFDb21waWxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL0phdmFDb21waWxlci5qYXZhCmluZGV4IGE1ODQwYzIuLmVlYTAwNDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9KYXZhQ29tcGlsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvSmF2YUNvbXBpbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaTsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL01hcHBpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9NYXBwaW5nLmphdmEKaW5kZXggMTRkYjg5MC4uYWYwM2E1OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL01hcHBpbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGk7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9Qcm9wZXJ0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1Byb3BlcnR5LmphdmEKaW5kZXggMjNkMjUxMi4uZTI5ZmMyNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1Byb3BlcnR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1Byb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvUmVmZXJlbmNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvUmVmZXJlbmNlLmphdmEKaW5kZXggYjVlNjMyNS4uNDFmZjBhNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1JlZmVyZW5jZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9SZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpOwogCiBpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9TMkpKQVhCTW9kZWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9TMkpKQVhCTW9kZWwuamF2YQppbmRleCBiODRmODliLi5hNWM0YzI5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvUzJKSkFYQk1vZGVsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1MySkpBWEJNb2RlbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDE1ICsyMiwxNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaTsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc287CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5Db2RlV3JpdGVyOwogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDb2RlTW9kZWw7CitpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkNsYXNzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLk9wdGlvbnM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuUGx1Z2luOwogCkBAIC01MSw2ICs1MywxNSBAQAogICAgIE1hcHBpbmcgZ2V0KCBRTmFtZSBlbGVtZW50TmFtZSApOwogCiAgICAgLyoqCisgICAgICogR2V0cyBhbGwgdGhlIDx0dD5PYmplY3RGYWN0b3J5PC90dD4gY2xhc3NlcyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgZ2VuZXJhdGluZyB7QGxpbmsgWG1sU2VlQWxzb30gb24gdGhlIFNFSS4KKyAgICAgKi8KKyAgICBMaXN0PEpDbGFzcz4gZ2V0QWxsT2JqZWN0RmFjdG9yaWVzKCk7CisKKworICAgIC8qKgogICAgICAqIEdldHMgYSByZWFkLW9ubHkgdmlldyBvZiBhbGwgdGhlIHtAbGluayBNYXBwaW5nfXMuCiAgICAgICovCiAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWFwcGluZz4gZ2V0TWFwcGluZ3MoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9TY2hlbWFDb21waWxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1NjaGVtYUNvbXBpbGVyLmphdmEKaW5kZXggNTNiOGI4Zi4uMzZhZGY0OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1NjaGVtYUNvbXBpbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1NjaGVtYUNvbXBpbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaTsKIAogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwpAQCAtOTgsNiArOTcsMTYgQEAKICAgICB2b2lkIHBhcnNlU2NoZW1hKCBJbnB1dFNvdXJjZSBzb3VyY2UgKTsKIAogICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgdGFyZ2V0IHNwZWMgdmVyc2lvbiBmb3IgdGhpcyBjb21waWxhaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHZlcnNpb24KKyAgICAgKiAgICAgIElmIG51bGwsIFhKQyB3aWxsIGdlbmVyYXRlIHRoZSBzb3VyY2UgY29kZSB0aGF0CisgICAgICogICAgICB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGxhdGVzdCBKQVhCIHNwZWMgdGhhdCBpdCB1bmRlcnN0YW5kcy4KKyAgICAgKiBAc2luY2UgMi4xIEVBMgorICAgICAqLworICAgIHZvaWQgc2V0VGFyZ2V0VmVyc2lvbiggU3BlY1ZlcnNpb24gdmVyc2lvbiApOworCisgICAgLyoqCiAgICAgICogUGFyc2VzIGEgc2NoZW1hIG9yIGFuIGV4dGVybmFsIGJpbmRpbmcgZmlsZQogICAgICAqIGZyb20gdGhlIHNwZWNpZmllZCBET00gZWxlbWVudC4KICAgICAgKgpAQCAtMjAzLDYgKzIxMiwxMyBAQAogICAgIHZvaWQgc2V0Q2xhc3NOYW1lQWxsb2NhdG9yKCBDbGFzc05hbWVBbGxvY2F0b3IgYWxsb2NhdG9yICk7CiAKICAgICAvKioKKyAgICAgKiBDbGVhcnMgYWxsIHRoZSBzY2hlbWEgZmlsZXMgcGFyc2VkIHNvIGZhci4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjEuMQorICAgICAqLworICAgIHZvaWQgcmVzZXRTY2hlbWEoKTsKKworICAgIC8qKgogICAgICAqIE9idGFpbnMgdGhlIGNvbXBpbGVkIHNjaGVtYSBvYmplY3QgbW9kZWwuCiAgICAgICoKICAgICAgKiBPbmNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgbm8gb3RoZXIgbWV0aG9kIHNob3VsZCBiZQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1NwZWNWZXJzaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvU3BlY1ZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTIwODFiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1NwZWNWZXJzaW9uLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGk7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgc3BlYyB2ZXJzaW9uIGNvbnN0YW50LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGVudW0gU3BlY1ZlcnNpb24geworICAgIFYyXzAsIFYyXzE7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2ZXJzaW9uIGlzIGVxdWFsIG9yIGxhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhdGVyVGhhbihTcGVjVmVyc2lvbiB0KSB7CisgICAgICAgIHJldHVybiB0aGlzLm9yZGluYWwoKT49dC5vcmRpbmFsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzICIyLjAiIGFuZCAiMi4xIiBpbnRvIHRoZSB7QGxpbmsgU3BlY1ZlcnNpb259IG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBmb3IgcGFyc2luZyBmYWlsdXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3BlY1ZlcnNpb24gcGFyc2UoU3RyaW5nIHRva2VuKSB7CisgICAgICAgIGlmKHRva2VuLmVxdWFscygiMi4wIikpCisgICAgICAgICAgICByZXR1cm4gVjJfMDsKKyAgICAgICAgZWxzZQorICAgICAgICBpZih0b2tlbi5lcXVhbHMoIjIuMSIpKQorICAgICAgICAgICAgcmV0dXJuIFYyXzE7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3BlY1ZlcnNpb24gTEFURVNUID0gVjJfMTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9UeXBlQW5kQW5ub3RhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1R5cGVBbmRBbm5vdGF0aW9uLmphdmEKaW5kZXggNjYwZjYxMC4uNDhmZjNjNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1R5cGVBbmRBbm5vdGF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1R5cGVBbmRBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaTsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpBbm5vdGF0YWJsZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9YSkMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9YSkMuamF2YQppbmRleCAyZjllNWI5Li43MzRkZDQxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvWEpDLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL1hKQy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGk7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuaW1wbC5qMnMuSmF2YUNvbXBpbGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL2oycy9KQVhCTW9kZWxJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9qMnMvSkFYQk1vZGVsSW1wbC5qYXZhCmluZGV4IDkzYmU5MGIuLmZjYzM2NTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL2oycy9KQVhCTW9kZWxJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvajJzL0pBWEJNb2RlbEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLmltcGwuajJzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTM3LDYgKzM2LDcgQEAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3Q7CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7CiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKIAogaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkZpZWxkRGVjbGFyYXRpb247CiBpbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247CkBAIC01Nyw2ICs1Nyw3IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLlR5cGVJbmZvU2V0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwubmF2Lk5hdmlnYXRvcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi5YbWxTY2hlbWFHZW5lcmF0b3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5vdXRwdXQuUmVzdWx0RmFjdG9yeTsKIAogLyoqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpIChra0Brb2hzdWtlLm9yZykKQEAgLTcyLDYgKzczLDExIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uUmVhZGVyPFR5cGVNaXJyb3IsVHlwZURlY2xhcmF0aW9uLEZpZWxkRGVjbGFyYXRpb24sTWV0aG9kRGVjbGFyYXRpb24+IHJlYWRlcjsKIAogICAgIC8qKgorICAgICAqIExhemlseSBjcmVhdGVkIHNjaGVtYSBnZW5lcmF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBYbWxTY2hlbWFHZW5lcmF0b3I8VHlwZU1pcnJvcixUeXBlRGVjbGFyYXRpb24sRmllbGREZWNsYXJhdGlvbixNZXRob2REZWNsYXJhdGlvbj4geHNkZ2VuOworCisgICAgLyoqCiAgICAgICogTG9vayB1cCB0YWJsZSBmcm9tIGFuIGV4dGVybmFsbHkgdmlzaWJsZSB7QGxpbmsgUmVmZXJlbmNlfSBvYmplY3QKICAgICAgKiB0byBvdXIgaW50ZXJuYWwgZm9ybWF0LgogICAgICAqLwpAQCAtMTYwLDIxICsxNjYsMjkgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVNjaGVtYShTY2hlbWFPdXRwdXRSZXNvbHZlciBvdXRwdXRSZXNvbHZlciwgRXJyb3JMaXN0ZW5lciBlcnJvckxpc3RlbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBYbWxTY2hlbWFHZW5lcmF0b3I8VHlwZU1pcnJvcixUeXBlRGVjbGFyYXRpb24sRmllbGREZWNsYXJhdGlvbixNZXRob2REZWNsYXJhdGlvbj4geHNkZ2VuCi0gICAgICAgICAgICA9IG5ldyBYbWxTY2hlbWFHZW5lcmF0b3I8VHlwZU1pcnJvcixUeXBlRGVjbGFyYXRpb24sRmllbGREZWNsYXJhdGlvbixNZXRob2REZWNsYXJhdGlvbj4oIHR5cGVzLmdldE5hdmlnYXRvcigpLCB0eXBlcyApOworICAgICAgICBnZXRTY2hlbWFHZW5lcmF0b3IoKS53cml0ZShvdXRwdXRSZXNvbHZlcixlcnJvckxpc3RlbmVyKTsKKyAgICB9CiAKLSAgICAgICAgZm9yIChNYXAuRW50cnk8UU5hbWUsUmVmZXJlbmNlPiBlIDogYWRkaXRpb25hbEVsZW1lbnREZWNscy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBSZWZlcmVuY2UgdmFsdWUgPSBlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZih2YWx1ZSE9bnVsbCkgewotICAgICAgICAgICAgICAgIE5vbkVsZW1lbnQ8VHlwZU1pcnJvciwgVHlwZURlY2xhcmF0aW9uPiB0eXBlSW5mbyA9IHJlZk1hcC5nZXQodmFsdWUpOwotICAgICAgICAgICAgICAgIGlmKHR5cGVJbmZvPT1udWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUuZ2V0VmFsdWUoKSsiIHdhcyBub3Qgc3BlY2lmaWVkIHRvIEphdmFDb21waWxlci5iaW5kIik7Ci0gICAgICAgICAgICAgICAgeHNkZ2VuLmFkZChlLmdldEtleSgpLCEodmFsdWUudHlwZSBpbnN0YW5jZW9mIFByaW1pdGl2ZVR5cGUpLHR5cGVJbmZvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeHNkZ2VuLmFkZChlLmdldEtleSgpLGZhbHNlLG51bGwpOworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlRXBpc29kZUZpbGUoUmVzdWx0IG91dHB1dCkgeworICAgICAgICBnZXRTY2hlbWFHZW5lcmF0b3IoKS53cml0ZUVwaXNvZGVGaWxlKFJlc3VsdEZhY3RvcnkuY3JlYXRlU2VyaWFsaXplcihvdXRwdXQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBYbWxTY2hlbWFHZW5lcmF0b3I8VHlwZU1pcnJvciwgVHlwZURlY2xhcmF0aW9uLCBGaWVsZERlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbj4gZ2V0U2NoZW1hR2VuZXJhdG9yKCkgeworICAgICAgICBpZih4c2RnZW49PW51bGwpIHsKKyAgICAgICAgICAgIHhzZGdlbiA9IG5ldyBYbWxTY2hlbWFHZW5lcmF0b3I8VHlwZU1pcnJvcixUeXBlRGVjbGFyYXRpb24sRmllbGREZWNsYXJhdGlvbixNZXRob2REZWNsYXJhdGlvbj4oIHR5cGVzLmdldE5hdmlnYXRvcigpLCB0eXBlcyApOworCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxRTmFtZSwgUmVmZXJlbmNlPiBlIDogYWRkaXRpb25hbEVsZW1lbnREZWNscy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHZhbHVlID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmKHZhbHVlIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIE5vbkVsZW1lbnQ8VHlwZU1pcnJvciwgVHlwZURlY2xhcmF0aW9uPiB0eXBlSW5mbyA9IHJlZk1hcC5nZXQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZih0eXBlSW5mbz09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRWYWx1ZSgpKyIgd2FzIG5vdCBzcGVjaWZpZWQgdG8gSmF2YUNvbXBpbGVyLmJpbmQiKTsKKyAgICAgICAgICAgICAgICAgICAgeHNkZ2VuLmFkZChlLmdldEtleSgpLCEodmFsdWUudHlwZSBpbnN0YW5jZW9mIFByaW1pdGl2ZVR5cGUpLHR5cGVJbmZvKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4c2RnZW4uYWRkKGUuZ2V0S2V5KCksZmFsc2UsbnVsbCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgeHNkZ2VuLndyaXRlKG91dHB1dFJlc29sdmVyKTsKKyAgICAgICAgcmV0dXJuIHhzZGdlbjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9qMnMvSmF2YUNvbXBpbGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvajJzL0phdmFDb21waWxlckltcGwuamF2YQppbmRleCA0YzkxOTg1Li45ZjhmZTQyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9qMnMvSmF2YUNvbXBpbGVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL2oycy9KYXZhQ29tcGlsZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5pbXBsLmoyczsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtNjUsOCArNjQsOCBAQAogICAgICAgICAgICAgbmV3IE1vZGVsQnVpbGRlcjxUeXBlTWlycm9yLFR5cGVEZWNsYXJhdGlvbixGaWVsZERlY2xhcmF0aW9uLE1ldGhvZERlY2xhcmF0aW9uPigKICAgICAgICAgICAgICAgICBJbmxpbmVBbm5vdGF0aW9uUmVhZGVySW1wbC50aGVJbnN0YW5jZSwKICAgICAgICAgICAgICAgICBuZXcgQVBUTmF2aWdhdG9yKGVudiksCi0gICAgICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZVJlbWFwCi0gICAgICAgICAgICApOworICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxUeXBlRGVjbGFyYXRpb24sVHlwZURlY2xhcmF0aW9uPmVtcHR5TWFwKCksCisgICAgICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZVJlbWFwICk7CiAKICAgICAgICAgYnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IEVycm9ySGFuZGxlckltcGwoZW52LmdldE1lc3NhZ2VyKCkpKTsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvajJzL01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9qMnMvTWVzc2FnZXMuamF2YQppbmRleCA5YmNhZDVlLi5mMjBhZTAwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9qMnMvTWVzc2FnZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9qMnMvTWVzc2FnZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLmltcGwuajJzOwogCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9qMnMvTWVzc2FnZXMucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL2oycy9NZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IDhkMWM4YjYuLmEzNmYyMzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL2oycy9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL2oycy9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xICsxLDI2IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0Fic3RyYWN0TWFwcGluZ0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9BYnN0cmFjdE1hcHBpbmdJbXBsLmphdmEKaW5kZXggMzNkZDM3My4uN2U1OTgxMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0Fic3RyYWN0TWFwcGluZ0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovQWJzdHJhY3RNYXBwaW5nSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuaW1wbC5zMmo7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0JlYW5NYXBwaW5nSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0JlYW5NYXBwaW5nSW1wbC5qYXZhCmluZGV4IDc4ZmU2NjIuLmRiZDIyZDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9CZWFuTWFwcGluZ0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovQmVhbk1hcHBpbmdJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5pbXBsLnMyajsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0Rvd25ncmFkaW5nRXJyb3JIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRG93bmdyYWRpbmdFcnJvckhhbmRsZXIuamF2YQppbmRleCAyYjU0MjRlLi4wY2VmZGU5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRG93bmdyYWRpbmdFcnJvckhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRG93bmdyYWRpbmdFcnJvckhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLmltcGwuczJqOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0VsZW1lbnRBZGFwdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRWxlbWVudEFkYXB0ZXIuamF2YQppbmRleCBiMDY5MzBjLi41YWUwNDdkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRWxlbWVudEFkYXB0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRWxlbWVudEFkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLmltcGwuczJqOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRWxlbWVudENvbGxlY3Rpb25BZGFwdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRWxlbWVudENvbGxlY3Rpb25BZGFwdGVyLmphdmEKaW5kZXggNzNhZDIyMy4uOWI1MTMwYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0VsZW1lbnRDb2xsZWN0aW9uQWRhcHRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9FbGVtZW50Q29sbGVjdGlvbkFkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLmltcGwuczJqOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9FbGVtZW50TWFwcGluZ0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9FbGVtZW50TWFwcGluZ0ltcGwuamF2YQppbmRleCAyN2Q2ZjM3Li5kNmJkMDA3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovRWxlbWVudE1hcHBpbmdJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0VsZW1lbnRNYXBwaW5nSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuaW1wbC5zMmo7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9FbGVtZW50U2luZ2xlQWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0VsZW1lbnRTaW5nbGVBZGFwdGVyLmphdmEKaW5kZXggZjFjNTg0NC4uOWIwOTE0YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0VsZW1lbnRTaW5nbGVBZGFwdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0VsZW1lbnRTaW5nbGVBZGFwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5pbXBsLnMyajsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0pBWEJNb2RlbEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9KQVhCTW9kZWxJbXBsLmphdmEKaW5kZXggZGIzMzUwNy4uOGI4NDIxOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL0pBWEJNb2RlbEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovSkFYQk1vZGVsSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuaW1wbC5zMmo7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzQsNiArMzMsNyBAQAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ29kZU1vZGVsOworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW47CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLkVycm9yTGlzdGVuZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLkpBWEJNb2RlbDsKQEAgLTgyLDYgKzgyLDEzIEBACiAgICAgICAgIHJldHVybiBvdXRsaW5lLmdldENvZGVNb2RlbCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBMaXN0PEpDbGFzcz4gZ2V0QWxsT2JqZWN0RmFjdG9yaWVzKCkgeworICAgICAgICBMaXN0PEpDbGFzcz4gciA9IG5ldyBBcnJheUxpc3Q8SkNsYXNzPigpOworICAgICAgICBmb3IgKFBhY2thZ2VPdXRsaW5lIHBrZyA6IG91dGxpbmUuZ2V0QWxsUGFja2FnZUNvbnRleHRzKCkpIHsKKyAgICAgICAgICAgIHIuYWRkKHBrZy5vYmplY3RGYWN0b3J5KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBNYXBwaW5nIGdldChRTmFtZSBlbGVtZW50TmFtZSkgewogICAgICAgICByZXR1cm4gYnlYbWxOYW1lLmdldChlbGVtZW50TmFtZSk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovUHJvcGVydHlJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovUHJvcGVydHlJbXBsLmphdmEKaW5kZXggZDRkYTllNi4uMjRhN2NkMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL1Byb3BlcnR5SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9Qcm9wZXJ0eUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLmltcGwuczJqOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9TY2hlbWFDb21waWxlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9TY2hlbWFDb21waWxlckltcGwuamF2YQppbmRleCA3NmNkNDE2Li5jNDVjNTVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovU2NoZW1hQ29tcGlsZXJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL1NjaGVtYUNvbXBpbGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuaW1wbC5zMmo7CiAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CkBAIC00NCw5ICs0MywxMSBAQAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5DbGFzc05hbWVBbGxvY2F0b3I7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLkVycm9yTGlzdGVuZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlNjaGVtYUNvbXBpbGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5TcGVjVmVyc2lvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5Nb2RlbDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lLk91dGxpbmU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplci5ET01Gb3Jlc3Q7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplci5TQ0RCYXNlZEJpbmRpbmdTZXQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5wYXJzZXIuWE1MU2NoZW1hSW50ZXJuYWxpemF0aW9uTG9naWM7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC51bm1hcnNoYWxsZXIuRE9NU2Nhbm5lcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTU2NoZW1hU2V0OwpAQCAtODAsNyArODEsNyBAQAogCiAgICAgcHJvdGVjdGVkIGZpbmFsIE9wdGlvbnMgb3B0cyA9IG5ldyBPcHRpb25zKCk7CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgRE9NRm9yZXN0IGZvcmVzdDsKKyAgICBwcm90ZWN0ZWQgQE5vdE51bGwgRE9NRm9yZXN0IGZvcmVzdDsKIAogICAgIC8qKgogICAgICAqIFNldCB0byB0cnVlIG9uY2UgYW4gZXJyb3IgaXMgZm91bmQuCkBAIC04OCw5ICs4OSw4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGhhZEVycm9yOwogCiAgICAgcHVibGljIFNjaGVtYUNvbXBpbGVySW1wbCgpIHsKLSAgICAgICAgZm9yZXN0ID0gbmV3IERPTUZvcmVzdChuZXcgWE1MU2NoZW1hSW50ZXJuYWxpemF0aW9uTG9naWMoKSk7CiAgICAgICAgIG9wdHMuY29tcGF0aWJpbGl0eU1vZGUgPSBPcHRpb25zLkVYVEVOU0lPTjsKLSAgICAgICAgZm9yZXN0LnNldEVycm9ySGFuZGxlcih0aGlzKTsKKyAgICAgICAgcmVzZXRTY2hlbWEoKTsKIAogICAgICAgICBpZihTeXN0ZW0uZ2V0UHJvcGVydHkoInhqYy1hcGkudGVzdCIpIT1udWxsKSB7CiAgICAgICAgICAgICBvcHRzLmRlYnVnTW9kZSA9IHRydWU7CkBAIC0xNDIsNiArMTQyLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRWZXJzaW9uKFNwZWNWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgaWYodmVyc2lvbj09bnVsbCkKKyAgICAgICAgICAgIHZlcnNpb24gPSBTcGVjVmVyc2lvbi5MQVRFU1Q7CisgICAgICAgIG9wdHMudGFyZ2V0ID0gdmVyc2lvbjsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBwYXJzZVNjaGVtYShTdHJpbmcgc3lzdGVtSWQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewogICAgICAgICBjaGVja0Fic29sdXRlbmVzcyhzeXN0ZW1JZCk7CiAgICAgICAgIGZvcmVzdC5wYXJzZShzeXN0ZW1JZCxyZWFkZXIsdHJ1ZSk7CkBAIC0xODMsNiArMTg5LDEyIEBACiAgICAgICAgIG9wdHMuY2xhc3NOYW1lQWxsb2NhdG9yID0gYWxsb2NhdG9yOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHJlc2V0U2NoZW1hKCkgeworICAgICAgICBmb3Jlc3QgPSBuZXcgRE9NRm9yZXN0KG5ldyBYTUxTY2hlbWFJbnRlcm5hbGl6YXRpb25Mb2dpYygpKTsKKyAgICAgICAgZm9yZXN0LnNldEVycm9ySGFuZGxlcih0aGlzKTsKKyAgICAgICAgZm9yZXN0LnNldEVudGl0eVJlc29sdmVyKG9wdHMuZW50aXR5UmVzb2x2ZXIpOworICAgIH0KKwogCiAgICAgcHVibGljIEpBWEJNb2RlbEltcGwgYmluZCgpIHsKICAgICAgICAgLy8gdGhpcyBoYXMgYmVlbiBwcm9ibGVtYXRpYy4gdHVybiBpdCBvZmYuCkBAIC0xOTAsNyArMjAyLDcgQEAKIC8vICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKICAgICAgICAgLy8gaW50ZXJuYWxpemF0aW9uCi0gICAgICAgIGZvcmVzdC50cmFuc2Zvcm0oKTsKKyAgICAgICAgU0NEQmFzZWRCaW5kaW5nU2V0IHNjZEJhc2VkQmluZGluZ1NldCA9IGZvcmVzdC50cmFuc2Zvcm0ob3B0cy5pc0V4dGVuc2lvbk1vZGUoKSk7CiAKICAgICAgICAgaWYoIU5PX0NPUlJFQ1RORVNTX0NIRUNLKSB7CiAgICAgICAgICAgICAvLyBjb3JyZWN0bmVzcyBjaGVjawpAQCAtMjA2LDcgKzIxOCw3IEBACiAgICAgICAgIE1vZGVsTG9hZGVyIGdsID0gbmV3IE1vZGVsTG9hZGVyKG9wdHMsY29kZU1vZGVsLHRoaXMpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYU1NjaGVtYVNldCByZXN1bHQgPSBnbC5jcmVhdGVYU09NKGZvcmVzdCk7CisgICAgICAgICAgICBYU1NjaGVtYVNldCByZXN1bHQgPSBnbC5jcmVhdGVYU09NKGZvcmVzdCwgc2NkQmFzZWRCaW5kaW5nU2V0KTsKICAgICAgICAgICAgIGlmKHJlc3VsdD09bnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL1R5cGVBbmRBbm5vdGF0aW9uSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL1R5cGVBbmRBbm5vdGF0aW9uSW1wbC5qYXZhCmluZGV4IGYxYmFmODIuLmQ1YjhlNWQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9UeXBlQW5kQW5ub3RhdGlvbkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovVHlwZUFuZEFubm90YXRpb25JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS5pbXBsLnMyajsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0YWNobWVudFJlZjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvaW1wbC9zMmovcGFja2FnZS5odG1sCmluZGV4IDFiMTdkMTkuLjhiZGQyZTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9pbXBsL3Myai9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL2ltcGwvczJqL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD48Ym9keT4KIGltcGxlbWVudGF0aW9uIG9mIHRoZSBYSkMgQVBJIGZvciBzY2hlbWEgdG8gamF2YS4KIDwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3BhY2thZ2UuaHRtbAppbmRleCA0ZmZlYjc0Li42OWZlMzczIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGh0bWw+PGJvZHk+CiBBUEkgZm9yIHByb2dyYW1hdGljIGludm9jYXRpb24gb2YgWEpDIGFuZCBzY2hlbWFnZW4uCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL0FQVENsYXNzTG9hZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvdXRpbC9BUFRDbGFzc0xvYWRlci5qYXZhCmluZGV4IDRkZGZmMzMuLmY5NDVjYWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL0FQVENsYXNzTG9hZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvQVBUQ2xhc3NMb2FkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLnV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTMzLDYgKzMyLDggQEAKIGltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiAKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKwogLyoqCiAgKiB7QGxpbmsgQ2xhc3NMb2FkZXJ9IHRoYXQgbG9hZHMgQVBUIGFuZCBzcGVjaWZpZWQgY2xhc3NlcwogICogYm90aCBpbnRvIHRoZSBzYW1lIGNsYXNzbG9hZGVyLCBzbyB0aGF0IHRoZXkgY2FuIHJlZmVyZW5jZSBlYWNoIG90aGVyLgpAQCAtNTIsOSArNTMsOSBAQAogICAgICAqIEBwYXJhbSBwYWNrYWdlUHJlZml4ZXMKICAgICAgKiAgICAgIFRoZSBwYWNrYWdlIHByZWZpeGVzIHRoYXQgYXJlIGZvcmNlZCB0byByZXNvbHZlIHdpdGhpbiB0aGlzIGNsYXNzIGxvYWRlci4KICAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogICAgICBUaGUgcGFyZW50IGNsYXNzIGxvYWRlciB0byBkZWxlZ2F0ZSB0by4KKyAgICAgKiAgICAgIFRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIHRvIGRlbGVnYXRlIHRvLiBOdWxsIHRvIGluZGljYXRlIGJvb3RzdHJhcCBjbGFzc2xvYWRlci4KICAgICAgKi8KLSAgICBwdWJsaWMgQVBUQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50LCBTdHJpbmdbXSBwYWNrYWdlUHJlZml4ZXMpIHRocm93cyBUb29sc0phck5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQVBUQ2xhc3NMb2FkZXIoQE51bGxhYmxlIENsYXNzTG9hZGVyIHBhcmVudCwgU3RyaW5nW10gcGFja2FnZVByZWZpeGVzKSB0aHJvd3MgVG9vbHNKYXJOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKGdldFRvb2xzSmFyKHBhcmVudCkscGFyZW50KTsKICAgICAgICAgaWYoZ2V0VVJMcygpLmxlbmd0aD09MCkKICAgICAgICAgICAgIC8vIGlmIHRvb2xzLmphciB3YXMgZm91bmQgaW4gb3VyIGNsYXNzbG9hZGVyLCBubyBuZWVkIHRvIGNyZWF0ZQpAQCAtMTE0LDExICsxMTUsMTEgQEAKICAgICAgKiBSZXR1cm5zIGEgY2xhc3MgbG9hZGVyIHRoYXQgY2FuIGxvYWQgY2xhc3NlcyBmcm9tIEpESyB0b29scy5qYXIuCiAgICAgICogQHBhcmFtIHBhcmVudAogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFVSTFtdIGdldFRvb2xzSmFyKENsYXNzTG9hZGVyIHBhcmVudCkgdGhyb3dzIFRvb2xzSmFyTm90Rm91bmRFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIFVSTFtdIGdldFRvb2xzSmFyKEBOdWxsYWJsZSBDbGFzc0xvYWRlciBwYXJlbnQpIHRocm93cyBUb29sc0phck5vdEZvdW5kRXhjZXB0aW9uIHsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyZW50LmxvYWRDbGFzcygiY29tLnN1bi50b29scy5qYXZhYy5NYWluIik7Ci0gICAgICAgICAgICBwYXJlbnQubG9hZENsYXNzKCJjb20uc3VuLnRvb2xzLmFwdC5NYWluIik7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLmphdmFjLk1haW4iLGZhbHNlLHBhcmVudCk7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLmFwdC5NYWluIixmYWxzZSxwYXJlbnQpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkxbMF07CiAgICAgICAgICAgICAvLyB3ZSBjYW4gYWxyZWFkeSBsb2FkIHRoZW0gaW4gdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIuCiAgICAgICAgICAgICAvLyBzbyBubyBuZWVkIHRvIGxvb2sgZm9yIHRvb2xzLmphci4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL0ZpbGVyQ29kZVdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvRmlsZXJDb2RlV3JpdGVyLmphdmEKaW5kZXggMGM5MjY4Yi4uZjRjZWEwZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvRmlsZXJDb2RlV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvRmlsZXJDb2RlV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmFwaS51dGlsOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL01lc3NhZ2VzLmphdmEKaW5kZXggZWNlZGM2Mi4uYTk0MzkzNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvTWVzc2FnZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvdXRpbC9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkudXRpbDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvdXRpbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvTWVzc2FnZXMucHJvcGVydGllcwppbmRleCBlZDEwOTUzLi5jN2NlOWU2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvdXRpbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL01lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsMyArMSwyOCBAQAorIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKIFRPT0xTX0pBUl9OT1RfRk9VTkQgPSBcCiAgICAgSkRLJydzIHRvb2xzLmphciB3YXMgbm90IGZvdW5kIGluIHswfS4gVXN1YWxseSB0aGlzIG1lYW5zIHlvdSBhcmUgcnVubmluZyBKUkUsIG5vdCBKREsuIFBsZWFzZSB1c2UgdGhlIGphdmEgY29tbWFuZCBpbiBKREsgNS4wIG9yIGxhdGVyIChub3QgSlJFLikKICAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL1Rvb2xzSmFyTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL1Rvb2xzSmFyTm90Rm91bmRFeGNlcHRpb24uamF2YQppbmRleCBjNDhhNjlkLi4zMTU4ZGVjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvdXRpbC9Ub29sc0phck5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvVG9vbHNKYXJOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2FwaS91dGlsL3BhY2thZ2UuaHRtbAppbmRleCAzYmQzNDBmLi4yYjNjMTk0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9hcGkvdXRpbC9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvYXBpL3V0aWwvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPjxib2R5PgogICBVdGlsaXR5IGNvZGUgc2hhcmVkIGJldHdlZW4gSkFYQiBhbmQgSkFYLVdTCiA8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vcmkvWG1sSXNTZXRXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3JpL1htbElzU2V0V3JpdGVyLmphdmEKaW5kZXggMWY2ZTY1Mi4uYjY2MTgwOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vcmkvWG1sSXNTZXRXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9yaS9YbWxJc1NldFdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnJpOwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkFubm90YXRpb25Xcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9yaS9YbWxMb2NhdGlvbldyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vcmkvWG1sTG9jYXRpb25Xcml0ZXIuamF2YQppbmRleCA2Y2JjZDg3Li42MjBmZDNiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9yaS9YbWxMb2NhdGlvbldyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3JpL1htbExvY2F0aW9uV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24ucmk7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQW5ub3RhdGlvbldyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQWNjZXNzb3JPcmRlcldyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxBY2Nlc3Nvck9yZGVyV3JpdGVyLmphdmEKaW5kZXggYmMyMzRkMC4uNDk0ODJlNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxBY2Nlc3Nvck9yZGVyV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxBY2Nlc3Nvck9yZGVyV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzT3JkZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEFjY2Vzc29yVHlwZVdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxBY2Nlc3NvclR5cGVXcml0ZXIuamF2YQppbmRleCBlMzVlMmI1Li5hYTU1ZTFmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEFjY2Vzc29yVHlwZVdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQWNjZXNzb3JUeXBlV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQW55QXR0cmlidXRlV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEFueUF0dHJpYnV0ZVdyaXRlci5qYXZhCmluZGV4IGRiZGJhMWEuLjkxOGU2NTggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQW55QXR0cmlidXRlV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxBbnlBdHRyaWJ1dGVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEFueUVsZW1lbnRXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQW55RWxlbWVudFdyaXRlci5qYXZhCmluZGV4IGM2YzM5ZjcuLmM0Njk3MTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQW55RWxlbWVudFdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQW55RWxlbWVudFdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEF0dGFjaG1lbnRSZWZXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQXR0YWNobWVudFJlZldyaXRlci5qYXZhCmluZGV4IGZiOTEzODMuLjNmZWFlMjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQXR0YWNobWVudFJlZldyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQXR0YWNobWVudFJlZldyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dGFjaG1lbnRSZWY7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEF0dHJpYnV0ZVdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxBdHRyaWJ1dGVXcml0ZXIuamF2YQppbmRleCAzMWExOGNkLi41NjdiYjZiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEF0dHJpYnV0ZVdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sQXR0cmlidXRlV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxFbGVtZW50RGVjbFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxFbGVtZW50RGVjbFdyaXRlci5qYXZhCmluZGV4IGRjNjg3NDQuLmEwM2ZlODEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudERlY2xXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVsZW1lbnREZWNsV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2w7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVsZW1lbnRSZWZXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFJlZldyaXRlci5qYXZhCmluZGV4IDBjZjVhY2UuLmZjOGFjYjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFJlZldyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFJlZldyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWY7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVsZW1lbnRSZWZzV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVsZW1lbnRSZWZzV3JpdGVyLmphdmEKaW5kZXggMWFkNmFlZS4uNDdlOTQ1NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxFbGVtZW50UmVmc1dyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFJlZnNXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFdyYXBwZXJXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFdyYXBwZXJXcml0ZXIuamF2YQppbmRleCBjMjM0MWZmLi43N2JjNzkzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVsZW1lbnRXcmFwcGVyV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxFbGVtZW50V3JhcHBlcldyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyOwpAQCAtMzgsNiArMzYsOCBAQAogCiAgICAgWG1sRWxlbWVudFdyYXBwZXJXcml0ZXIgbmFtZXNwYWNlKFN0cmluZyB2YWx1ZSk7CiAKKyAgICBYbWxFbGVtZW50V3JhcHBlcldyaXRlciByZXF1aXJlZChib29sZWFuIHZhbHVlKTsKKwogICAgIFhtbEVsZW1lbnRXcmFwcGVyV3JpdGVyIG5pbGxhYmxlKGJvb2xlYW4gdmFsdWUpOwogCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVsZW1lbnRXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFdyaXRlci5qYXZhCmluZGV4IDcxNGY4MDcuLjMxNDg3MWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudFdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVsZW1lbnRzV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVsZW1lbnRzV3JpdGVyLmphdmEKaW5kZXggMDcwN2M1NC4uNzM4Mzc5MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxFbGVtZW50c1dyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRWxlbWVudHNXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50czsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRW51bVZhbHVlV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVudW1WYWx1ZVdyaXRlci5qYXZhCmluZGV4IDgwMjUxMDUuLjgwYzFkZmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRW51bVZhbHVlV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxFbnVtVmFsdWVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtVmFsdWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEVudW1Xcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRW51bVdyaXRlci5qYXZhCmluZGV4IDYwNDIyZWMuLjIzYzE5N2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRW51bVdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sRW51bVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW07CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbElEUkVGV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbElEUkVGV3JpdGVyLmphdmEKaW5kZXggYjc2OGQ5Zi4uNGQwNGJlMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxJRFJFRldyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sSURSRUZXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRFJFRjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sSURXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sSURXcml0ZXIuamF2YQppbmRleCAzNjc2MzNiLi5lMDRjNmM4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbElEV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxJRFdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxJbmxpbmVCaW5hcnlEYXRhV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbElubGluZUJpbmFyeURhdGFXcml0ZXIuamF2YQppbmRleCA3ZjVjYjRhLi5hYmNmNWI4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbElubGluZUJpbmFyeURhdGFXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbElubGluZUJpbmFyeURhdGFXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJbmxpbmVCaW5hcnlEYXRhOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxKYXZhVHlwZUFkYXB0ZXJXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sSmF2YVR5cGVBZGFwdGVyV3JpdGVyLmphdmEKaW5kZXggM2ZhMWM5Zi4uODUwZGI4NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxKYXZhVHlwZUFkYXB0ZXJXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbEphdmFUeXBlQWRhcHRlcldyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sTGlzdFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxMaXN0V3JpdGVyLmphdmEKaW5kZXggOTQyN2I2MS4uZWVlMGE1OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxMaXN0V3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxMaXN0V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sTWltZVR5cGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sTWltZVR5cGVXcml0ZXIuamF2YQppbmRleCA4Y2MyMGRiLi5lY2I1NDU1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbE1pbWVUeXBlV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxNaW1lVHlwZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1pbWVUeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxNaXhlZFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxNaXhlZFdyaXRlci5qYXZhCmluZGV4IGVjMmY4ODkuLmJlY2RiMjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sTWl4ZWRXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbE1peGVkV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWl4ZWQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbE5zV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbE5zV3JpdGVyLmphdmEKaW5kZXggYTAzNGIxMS4uMTRjMTRiMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxOc1dyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sTnNXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxOczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sUmVnaXN0cnlXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sUmVnaXN0cnlXcml0ZXIuamF2YQppbmRleCAzNzUxYWYwLi5hZWU5NTNjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFJlZ2lzdHJ5V3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxSZWdpc3RyeVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxSb290RWxlbWVudFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxSb290RWxlbWVudFdyaXRlci5qYXZhCmluZGV4IGMyZTEyM2IuLjgxOTdjYTEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sUm9vdEVsZW1lbnRXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFJvb3RFbGVtZW50V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFNjaGVtYVR5cGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sU2NoZW1hVHlwZVdyaXRlci5qYXZhCmluZGV4IDA0YTJiZDkuLmI0YjJhNGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sU2NoZW1hVHlwZVdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sU2NoZW1hVHlwZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWM7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFNjaGVtYVR5cGVzV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFNjaGVtYVR5cGVzV3JpdGVyLmphdmEKaW5kZXggMmQ2ZmJkNy4uODEzN2I2NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxTY2hlbWFUeXBlc1dyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sU2NoZW1hVHlwZXNXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sU2NoZW1hV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFNjaGVtYVdyaXRlci5qYXZhCmluZGV4IGY1MmI1MzYuLjU5NmVkMTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sU2NoZW1hV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxTY2hlbWFXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxOc0Zvcm07CkBAIC0zNSw2ICszMyw4IEBACiB7CiAKIAorICAgIFhtbFNjaGVtYVdyaXRlciBsb2NhdGlvbihTdHJpbmcgdmFsdWUpOworCiAgICAgWG1sU2NoZW1hV3JpdGVyIG5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOwogCiAgICAgWG1sTnNXcml0ZXIgeG1sbnMoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sU2VlQWxzb1dyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxTZWVBbHNvV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5OTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sU2VlQWxzb1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbzsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQW5ub3RhdGlvbldyaXRlcjsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KVHlwZTsKKworcHVibGljIGludGVyZmFjZSBYbWxTZWVBbHNvV3JpdGVyCisgICAgZXh0ZW5kcyBKQW5ub3RhdGlvbldyaXRlcjxYbWxTZWVBbHNvPgoreworCisKKyAgICBYbWxTZWVBbHNvV3JpdGVyIHZhbHVlKENsYXNzIHZhbHVlKTsKKworICAgIFhtbFNlZUFsc29Xcml0ZXIgdmFsdWUoSlR5cGUgdmFsdWUpOworCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFRyYW5zaWVudFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxUcmFuc2llbnRXcml0ZXIuamF2YQppbmRleCAxZjJjNjdhLi44OWY0MWQwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFRyYW5zaWVudFdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sVHJhbnNpZW50V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxUeXBlV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFR5cGVXcml0ZXIuamF2YQppbmRleCAyZjA0ZGJjLi45Y2E3MDBiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFR5cGVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFR5cGVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxWYWx1ZVdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2Fubm90YXRpb24vc3BlYy9YbWxWYWx1ZVdyaXRlci5qYXZhCmluZGV4IDlhYWY1MGUuLmQ0NzVmODYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9hbm5vdGF0aW9uL3NwZWMvWG1sVmFsdWVXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYW5ub3RhdGlvbi9zcGVjL1htbFZhbHVlV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9CZWFuR2VuZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9CZWFuR2VuZXJhdG9yLmphdmEKaW5kZXggMjk3MDYzYi4uNDIyN2U4MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vQmVhbkdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL0JlYW5HZW5lcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMSArMjUsMTQgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbjsKIAoraW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lLkFzcGVjdC5FWFBPU0VEOworCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CkBAIC02NSwxMiArNjgsMTQgQEAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5mbXQuSlN0YXRpY0phdmFGaWxlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLkFib3J0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLkVycm9yUmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuYXBpLlNwZWNWZXJzaW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWMuWG1sQW55QXR0cmlidXRlV3JpdGVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWMuWG1sRW51bVZhbHVlV3JpdGVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWMuWG1sRW51bVdyaXRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjLlhtbEphdmFUeXBlQWRhcHRlcldyaXRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjLlhtbE1pbWVUeXBlV3JpdGVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWMuWG1sUm9vdEVsZW1lbnRXcml0ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYy5YbWxTZWVBbHNvV3JpdGVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5hbm5vdGF0aW9uLnNwZWMuWG1sVHlwZVdyaXRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbi5maWVsZC5GaWVsZFJlbmRlcmVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNBZGFwdGVyOwpAQCAtODMsNiArODgsNyBAQAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNQcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ1R5cGVSZWY7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuTW9kZWw7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0NsYXNzUmVmOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmUuQXNwZWN0OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmUuQ2xhc3NPdXRsaW5lOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmUuRW51bUNvbnN0YW50T3V0bGluZTsKQEAgLTk0LDYgKzEwMCw3IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLlByb3BlcnR5SW5mbzsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuU3dhUmVmQWRhcHRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhtbFN0cmluZzsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOwogCiAvKioKICAqIEdlbmVyYXRlcyBmaWVsZHMgYW5kIGFjY2Vzc29ycy4KQEAgLTE2OSw5ICsxNzYsOSBAQAogCiAgICAgICAgIC8vIGJ1aWxkIGVudW0gY2xhc3NlcwogICAgICAgICBmb3IoIENFbnVtTGVhZkluZm8gcCA6IG1vZGVsLmVudW1zKCkudmFsdWVzKCkgKQotICAgICAgICAgICAgZW51bXMucHV0KCBwLCBnZW5lcmF0ZUVudW0ocCkgKTsKKyAgICAgICAgICAgIGVudW1zLnB1dCggcCwgZ2VuZXJhdGVFbnVtRGVmKHApICk7CiAKLSAgICAgICAgSlBhY2thZ2VbXSBwYWNrYWdlcyA9IGdldFVzZWRQYWNrYWdlcyhBc3BlY3QuRVhQT1NFRCk7CisgICAgICAgIEpQYWNrYWdlW10gcGFja2FnZXMgPSBnZXRVc2VkUGFja2FnZXMoRVhQT1NFRCk7CiAKICAgICAgICAgLy8gZ2VuZXJhdGVzIHBlci1wYWNrYWdlIGNvZGUgYW5kIHJlbWVtYmVyIHRoZSByZXN1bHRzIGFzIGNvbnRleHRzLgogICAgICAgICBmb3IoIEpQYWNrYWdlIHBrZyA6IHBhY2thZ2VzICkKQEAgLTE5OCwxMSArMjA1LDE2IEBACiAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWZpZWQgc3VwZXIgY2xhc3MKICAgICAgICAgICAgICAgICBtb2RlbC5zdHJhdGVneS5fZXh0ZW5kcyhjYyxnZXRDbGF6eihzdXBlckNsYXNzKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBvbmUsIGlmIGFueQotICAgICAgICAgICAgICAgIGlmKCBtb2RlbC5yb290Q2xhc3MhPW51bGwgJiYgY2MuaW1wbENsYXNzLl9leHRlbmRzKCkuZXF1YWxzKE9CSkVDVCkgKQotICAgICAgICAgICAgICAgICAgICBjYy5pbXBsQ2xhc3MuX2V4dGVuZHMobW9kZWwucm9vdENsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiggbW9kZWwucm9vdEludGVyZmFjZSE9bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2MucmVmLl9pbXBsZW1lbnRzKG1vZGVsLnJvb3RJbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIENDbGFzc1JlZiByZWZTdXBlckNsYXNzID0gY2MudGFyZ2V0LmdldFJlZkJhc2VDbGFzcygpOworICAgICAgICAgICAgICAgIGlmKHJlZlN1cGVyQ2xhc3MhPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2MuaW1wbENsYXNzLl9leHRlbmRzKHJlZlN1cGVyQ2xhc3MudG9UeXBlKHRoaXMsRVhQT1NFRCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBvbmUsIGlmIGFueQorICAgICAgICAgICAgICAgICAgICBpZiggbW9kZWwucm9vdENsYXNzIT1udWxsICYmIGNjLmltcGxDbGFzcy5fZXh0ZW5kcygpLmVxdWFscyhPQkpFQ1QpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjLmltcGxDbGFzcy5fZXh0ZW5kcyhtb2RlbC5yb290Q2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiggbW9kZWwucm9vdEludGVyZmFjZSE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjLnJlZi5faW1wbGVtZW50cyhtb2RlbC5yb290SW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjEwLDYgKzIyMiw5IEBACiAgICAgICAgIGZvciggQ2xhc3NPdXRsaW5lSW1wbCBjbyA6IGdldENsYXNzZXMoKSApCiAgICAgICAgICAgICBnZW5lcmF0ZUNsYXNzQm9keShjbyk7CiAKKyAgICAgICAgZm9yKCBFbnVtT3V0bGluZSBlbyA6IGVudW1zLnZhbHVlcygpICkKKyAgICAgICAgICAgIGdlbmVyYXRlRW51bUJvZHkoZW8pOworCiAgICAgICAgIC8vIGNyZWF0ZSBmYWN0b3JpZXMgZm9yIHRoZSBpbXBsLWxlc3MgZWxlbWVudHMKICAgICAgICAgZm9yKCBDRWxlbWVudEluZm8gZWkgOiBtb2RlbC5nZXRBbGxFbGVtZW50cygpKQogICAgICAgICAgICAgZ2V0UGFja2FnZUNvbnRleHQoZWkuX3BhY2thZ2UoKSkub2JqZWN0RmFjdG9yeUdlbmVyYXRvcigpLnBvcHVsYXRlKGVpKTsKQEAgLTMwMiw3ICszMTcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIEpDbGFzc0NvbnRhaW5lciBvblBhY2thZ2UoSlBhY2thZ2UgcGtnKSB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWwuc3RyYXRlZ3kuZ2V0UGFja2FnZShwa2csQXNwZWN0LkVYUE9TRUQpOworICAgICAgICAgICAgcmV0dXJuIG1vZGVsLnN0cmF0ZWd5LmdldFBhY2thZ2UocGtnLCBFWFBPU0VEKTsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTQ2NSwxNiArNDgwLDE5IEBACiAgICAgICAgIC8vIFtSRVNVTFRdCiAgICAgICAgIC8vIEBYbWxUeXBlKG5hbWU9ImZvbyIsIHRhcmdldE5hbWVzcGFjZT0iYmFyOi8vYmF6IikKICAgICAgICAgWG1sVHlwZVdyaXRlciB4dHcgPSBjYy5pbXBsQ2xhc3MuYW5ub3RhdGUyKFhtbFR5cGVXcml0ZXIuY2xhc3MpOwotICAgICAgICBRTmFtZSB0eXBlTmFtZSA9IGNjLnRhcmdldC5nZXRUeXBlTmFtZSgpOwotICAgICAgICBpZih0eXBlTmFtZT09bnVsbCkgewotICAgICAgICAgICAgeHR3Lm5hbWUoIiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeHR3Lm5hbWUodHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVOYW1lVVJJID0gdHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZighdHlwZU5hbWVVUkkuZXF1YWxzKG1vc3RVc2VkTmFtZXNwYWNlVVJJKSkgLy8gb25seSBnZW5lcmF0ZSBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICB4dHcubmFtZXNwYWNlKHR5cGVOYW1lVVJJKTsKLSAgICAgICAgfQorICAgICAgICB3cml0ZVR5cGVOYW1lKGNjLnRhcmdldC5nZXRUeXBlTmFtZSgpLCB4dHcsIG1vc3RVc2VkTmFtZXNwYWNlVVJJKTsKIAorICAgICAgICBpZihtb2RlbC5vcHRpb25zLnRhcmdldC5pc0xhdGVyVGhhbihTcGVjVmVyc2lvbi5WMl8xKSkgeworICAgICAgICAgICAgLy8gQFhtbFNlZUFsc28KKyAgICAgICAgICAgIEl0ZXJhdG9yPENDbGFzc0luZm8+IHN1YmNsYXNzZXMgPSBjYy50YXJnZXQubGlzdFN1YmNsYXNzZXMoKTsKKyAgICAgICAgICAgIGlmKHN1YmNsYXNzZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgWG1sU2VlQWxzb1dyaXRlciBzYXcgPSBjYy5pbXBsQ2xhc3MuYW5ub3RhdGUyKFhtbFNlZUFsc29Xcml0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIHdoaWxlIChzdWJjbGFzc2VzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBDQ2xhc3NJbmZvIHMgPSBzdWJjbGFzc2VzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2F3LnZhbHVlKGdldENsYXp6KHMpLmltcGxSZWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlmKHRhcmdldC5pc0VsZW1lbnQoKSkgewogICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHRhcmdldC5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwpAQCAtNTEzLDYgKzUzMSwxNyBAQAogICAgICAgICBjYy5fcGFja2FnZSgpLm9iamVjdEZhY3RvcnlHZW5lcmF0b3IoKS5wb3B1bGF0ZShjYyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVHlwZU5hbWUoUU5hbWUgdHlwZU5hbWUsIFhtbFR5cGVXcml0ZXIgeHR3LCBTdHJpbmcgbW9zdFVzZWROYW1lc3BhY2VVUkkpIHsKKyAgICAgICAgaWYodHlwZU5hbWUgPT1udWxsKSB7CisgICAgICAgICAgICB4dHcubmFtZSgiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4dHcubmFtZSh0eXBlTmFtZS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZU5hbWVVUkkgPSB0eXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgIGlmKCF0eXBlTmFtZVVSSS5lcXVhbHMobW9zdFVzZWROYW1lc3BhY2VVUkkpKSAvLyBvbmx5IGdlbmVyYXRlIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIHh0dy5uYW1lc3BhY2UodHlwZU5hbWVVUkkpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2VuZXJhdGVzIGFuIGF0dHJpYnV0ZSB3aWxkY2FyZCBwcm9wZXJ0eSBvbiBhIGNsYXNzLgogICAgICAqLwpAQCAtNTQ3LDI0ICs1NzYsNDMgQEAKIAogCiAKLSAgICBwcml2YXRlIEVudW1PdXRsaW5lIGdlbmVyYXRlRW51bShDRW51bUxlYWZJbmZvIGUpIHsKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIG1pbmltdW0ge0BsaW5rIEpEZWZpbmVkQ2xhc3N9IHNrZWxldG9uCisgICAgICogd2l0aG91dCBmaWxsaW5nIGluIGl0cyBib2R5LgorICAgICAqLworICAgIHByaXZhdGUgRW51bU91dGxpbmUgZ2VuZXJhdGVFbnVtRGVmKENFbnVtTGVhZkluZm8gZSkgewogICAgICAgICBKRGVmaW5lZENsYXNzIHR5cGU7CiAKKyAgICAgICAgdHlwZSA9IGdldENsYXNzRmFjdG9yeSgpLmNyZWF0ZUNsYXNzKAorICAgICAgICAgICAgZ2V0Q29udGFpbmVyKGUucGFyZW50LCBFWFBPU0VEKSxlLnNob3J0TmFtZSxlLmdldExvY2F0b3IoKSwgQ2xhc3NUeXBlLkVOVU0pOworICAgICAgICB0eXBlLmphdmFkb2MoKS5hcHBlbmQoZS5qYXZhZG9jKTsKKworICAgICAgICByZXR1cm4gbmV3IEVudW1PdXRsaW5lKGUsIHR5cGUpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEBOb3ROdWxsIE91dGxpbmUgcGFyZW50KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCZWFuR2VuZXJhdG9yLnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRW51bUJvZHkoRW51bU91dGxpbmUgZW8pIHsKKyAgICAgICAgSkRlZmluZWRDbGFzcyB0eXBlID0gZW8uY2xheno7CisgICAgICAgIENFbnVtTGVhZkluZm8gZSA9IGVvLnRhcmdldDsKKworICAgICAgICBYbWxUeXBlV3JpdGVyIHh0dyA9IHR5cGUuYW5ub3RhdGUyKFhtbFR5cGVXcml0ZXIuY2xhc3MpOworICAgICAgICB3cml0ZVR5cGVOYW1lKGUuZ2V0VHlwZU5hbWUoKSwgeHR3LAorICAgICAgICAgICAgICAgIGVvLl9wYWNrYWdlKCkuZ2V0TW9zdFVzZWROYW1lc3BhY2VVUkkoKSk7CisKKyAgICAgICAgSkNvZGVNb2RlbCBjb2RlTW9kZWwgPSBtb2RlbC5jb2RlTW9kZWw7CisKICAgICAgICAgLy8gc2luY2UgY29uc3RhbnQgdmFsdWVzIGFyZSBuZXZlciBudWxsLCBubyBwb2ludCBpbiB1c2luZyB0aGUgYm94ZWQgdHlwZXMuCi0gICAgICAgIEpUeXBlIGJhc2VFeHBvc2VkVHlwZSA9IGUuYmFzZS50b1R5cGUodGhpcyxBc3BlY3QuRVhQT1NFRCkudW5ib3hpZnkoKTsKKyAgICAgICAgSlR5cGUgYmFzZUV4cG9zZWRUeXBlID0gZS5iYXNlLnRvVHlwZSh0aGlzLCBFWFBPU0VEKS51bmJveGlmeSgpOwogICAgICAgICBKVHlwZSBiYXNlSW1wbFR5cGUgPSBlLmJhc2UudG9UeXBlKHRoaXMsQXNwZWN0LklNUExFTUVOVEFUSU9OKS51bmJveGlmeSgpOwogCiAKLSAgICAgICAgdHlwZSA9IGdldENsYXNzRmFjdG9yeSgpLmNyZWF0ZUNsYXNzKAotICAgICAgICAgICAgZ2V0Q29udGFpbmVyKGUucGFyZW50LEFzcGVjdC5FWFBPU0VEKSxlLnNob3J0TmFtZSxlLmdldExvY2F0b3IoKSwgQ2xhc3NUeXBlLkVOVU0pOwotICAgICAgICB0eXBlLmphdmFkb2MoKS5hcHBlbmQoZS5qYXZhZG9jKTsKLQogICAgICAgICBYbWxFbnVtV3JpdGVyIHhldyA9IHR5cGUuYW5ub3RhdGUyKFhtbEVudW1Xcml0ZXIuY2xhc3MpOwogICAgICAgICB4ZXcudmFsdWUoYmFzZUV4cG9zZWRUeXBlKTsKIAotICAgICAgICBKQ29kZU1vZGVsIGNvZGVNb2RlbCA9IG1vZGVsLmNvZGVNb2RlbDsKLQotICAgICAgICBFbnVtT3V0bGluZSBlbnVtT3V0bGluZSA9IG5ldyBFbnVtT3V0bGluZShlLCB0eXBlKSB7fTsKIAogICAgICAgICBib29sZWFuIG5lZWRzVmFsdWUgPSBlLm5lZWRzVmFsdWVGaWVsZCgpOwogCkBAIC02MDAsNyArNjQ4LDcgQEAKICAgICAgICAgICAgIGlmKCBtZW0uamF2YWRvYyE9bnVsbCApCiAgICAgICAgICAgICAgICAgY29uc3RSZWYuamF2YWRvYygpLmFwcGVuZChtZW0uamF2YWRvYyk7CiAKLSAgICAgICAgICAgIGVudW1PdXRsaW5lLmNvbnN0YW50cy5hZGQobmV3IEVudW1Db25zdGFudE91dGxpbmUobWVtLGNvbnN0UmVmKXt9KTsKKyAgICAgICAgICAgIGVvLmNvbnN0YW50cy5hZGQobmV3IEVudW1Db25zdGFudE91dGxpbmUobWVtLGNvbnN0UmVmKXt9KTsKICAgICAgICAgfQogCiAKQEAgLTY0NCwxMSArNjkyLDE2IEBACiAKICAgICAgICAgICAgICAgICBKSW52b2NhdGlvbiBleCA9IEpFeHByLl9uZXcoY29kZU1vZGVsLnJlZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpKTsKIAorICAgICAgICAgICAgICAgIEpFeHByZXNzaW9uIHN0ckZvcm07CiAgICAgICAgICAgICAgICAgaWYoYmFzZUV4cG9zZWRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbS5ib2R5KCkuX3Rocm93KGV4LmFyZyhjb2RlTW9kZWwucmVmKFN0cmluZy5jbGFzcykuc3RhdGljSW52b2tlKCJ2YWx1ZU9mIikuYXJnKCR2KSkpOworICAgICAgICAgICAgICAgICAgICBzdHJGb3JtID0gY29kZU1vZGVsLnJlZihTdHJpbmcuY2xhc3MpLnN0YXRpY0ludm9rZSgidmFsdWVPZiIpLmFyZygkdik7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaWYoYmFzZUV4cG9zZWRUeXBlPT1jb2RlTW9kZWwucmVmKFN0cmluZy5jbGFzcykpeworICAgICAgICAgICAgICAgICAgICBzdHJGb3JtID0gJHY7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbS5ib2R5KCkuX3Rocm93KGV4LmFyZygkdi5pbnZva2UoInRvU3RyaW5nIikpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyRm9ybSA9ICR2Lmludm9rZSgidG9TdHJpbmciKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbS5ib2R5KCkuX3Rocm93KGV4LmFyZyhzdHJGb3JtKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBbUkVTVUxUXQpAQCAtNjYwLDEzICs3MTMsMTAgQEAKICAgICAgICAgICAgIEpNZXRob2QgbSA9IHR5cGUubWV0aG9kKEpNb2QuUFVCTElDfEpNb2QuU1RBVElDLCB0eXBlLCAiZnJvbVZhbHVlIiApOwogICAgICAgICAgICAgbS5ib2R5KCkuX3JldHVybiggSkV4cHIuaW52b2tlKCJ2YWx1ZU9mIikuYXJnKG0ucGFyYW0oU3RyaW5nLmNsYXNzLCJ2IikpKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbnVtT3V0bGluZTsKICAgICB9CiAKIAogCi0KICAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHRoZSBGaWVsZFJlbmRlcmVyIHVzZWQgZm9yIHRoZSBnaXZlbiBGaWVsZFVzZSwKICAgICAgKiB0aGVuIGdlbmVyYXRlcyB0aGUgZmllbGQgZGVjbGFyYXRpb24gYW5kIGFjY2Vzc29yIG1ldGhvZHMuCkBAIC03MDEsNyArNzUxLDcgQEAKICAgICAgICAgICAgICAgICAvLyBbUkVTVUxUXQogICAgICAgICAgICAgICAgIC8vIEBYbWxKYXZhVHlwZUFkYXB0ZXIoIEZvby5jbGFzcyApCiAgICAgICAgICAgICAgICAgWG1sSmF2YVR5cGVBZGFwdGVyV3JpdGVyIHhqdHcgPSBmaWVsZC5hbm5vdGF0ZTIoWG1sSmF2YVR5cGVBZGFwdGVyV3JpdGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgICB4anR3LnZhbHVlKGFkYXB0ZXIuYWRhcHRlclR5cGUudG9UeXBlKHRoaXMsQXNwZWN0LkVYUE9TRUQpKTsKKyAgICAgICAgICAgICAgICB4anR3LnZhbHVlKGFkYXB0ZXIuYWRhcHRlclR5cGUudG9UeXBlKHRoaXMsIEVYUE9TRUQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9DbGFzc091dGxpbmVJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9DbGFzc091dGxpbmVJbXBsLmphdmEKaW5kZXggYjgzOTMzMS4uZjliMjcyZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vQ2xhc3NPdXRsaW5lSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL0NsYXNzT3V0bGluZUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW47CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ2xhc3M7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9EdWFsT2JqZWN0RmFjdG9yeUdlbmVyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vRHVhbE9iamVjdEZhY3RvcnlHZW5lcmF0b3IuamF2YQppbmRleCBiZDVkNTRlLi4yM2Y2ZjE4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9EdWFsT2JqZWN0RmFjdG9yeUdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL0R1YWxPYmplY3RGYWN0b3J5R2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuOwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkRlZmluZWRDbGFzczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL0VsZW1lbnRPdXRsaW5lSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vRWxlbWVudE91dGxpbmVJbXBsLmphdmEKaW5kZXggYzY2NDUzNS4uNzEwYTAwYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vRWxlbWVudE91dGxpbmVJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vRWxlbWVudE91dGxpbmVJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9JbXBsU3RydWN0dXJlU3RyYXRlZ3kuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL0ltcGxTdHJ1Y3R1cmVTdHJhdGVneS5qYXZhCmluZGV4IDMyNTYyZTQuLjY2Mjg0MmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL0ltcGxTdHJ1Y3R1cmVTdHJhdGVneS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL0ltcGxTdHJ1Y3R1cmVTdHJhdGVneS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyoKICAqIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBsaWNlbnNlIHRlcm1zLgogICovCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKaW5kZXggMWZhYWIzNS4uNzQ1NTdiNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogTUVUSE9EX0NPTExJU0lPTiA9IFwKIAlUaGUgInswfSIgbWV0aG9kIGlzIGRlZmluZWQgb24gYm90aCAiezF9IiBhbmQgInsyfSIgYW5kIGlzIGNhdXNpbmcgYSBjb2xsaXNpb24uCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9NZXNzYWdlcy5qYXZhCmluZGV4IGUwZWJhZDIuLjc3MGRlNmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vTWVzc2FnZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9NZXRob2RXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL01ldGhvZFdyaXRlci5qYXZhCmluZGV4IDIwZjI5NDcuLjNmNjMyZGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL01ldGhvZFdyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL01ldGhvZFdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyoKICAqIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBsaWNlbnNlIHRlcm1zLgogICovCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9PYmplY3RGYWN0b3J5R2VuZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9PYmplY3RGYWN0b3J5R2VuZXJhdG9yLmphdmEKaW5kZXggNjcwZTQ1Ni4uNDIxNTM4YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vT2JqZWN0RmFjdG9yeUdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL09iamVjdEZhY3RvcnlHZW5lcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW47CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KRGVmaW5lZENsYXNzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vT2JqZWN0RmFjdG9yeUdlbmVyYXRvckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL09iamVjdEZhY3RvcnlHZW5lcmF0b3JJbXBsLmphdmEKaW5kZXggZmVkODk5Mi4uMzAxOGJlMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vT2JqZWN0RmFjdG9yeUdlbmVyYXRvckltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9PYmplY3RGYWN0b3J5R2VuZXJhdG9ySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbjsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vUGFja2FnZU91dGxpbmVJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9QYWNrYWdlT3V0bGluZUltcGwuamF2YQppbmRleCA2YzJjYzc2Li5jYjkzYzBjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9QYWNrYWdlT3V0bGluZUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9QYWNrYWdlT3V0bGluZUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW47CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC00OSw2ICs0OCw3IEBACiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ1ZhbHVlUHJvcGVydHlJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLk1vZGVsOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmUuUGFja2FnZU91dGxpbmU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMub3V0bGluZS5Bc3BlY3Q7CiAKIC8qKgogICoge0BsaW5rIFBhY2thZ2VPdXRsaW5lfSBlbmhhbmNlZCB3aXRoIHNjaGVtYTJqYXZhIHNwZWNpZmljCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgLy8gZ2VuZXJhdGUgcGFja2FnZS1pbmZvLmphdmEKICAgICAgICAgLy8gd2Ugd29uJ3QgZ2V0IHRoaXMgZmFyIGlmIHRoZSB1c2VyIHNwZWNpZmllZCAtbnBhCiAgICAgICAgIGlmKCFtb3N0VXNlZE5hbWVzcGFjZVVSSS5lcXVhbHMoIiIpIHx8IGVsZW1lbnRGb3JtRGVmYXVsdD09WG1sTnNGb3JtLlFVQUxJRklFRCkgewotICAgICAgICAgICAgWG1sU2NoZW1hV3JpdGVyIHcgPSBfcGFja2FnZS5hbm5vdGF0ZTIoWG1sU2NoZW1hV3JpdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIFhtbFNjaGVtYVdyaXRlciB3ID0gX21vZGVsLnN0cmF0ZWd5LmdldFBhY2thZ2UoX3BhY2thZ2UsIEFzcGVjdC5JTVBMRU1FTlRBVElPTikuYW5ub3RhdGUyKFhtbFNjaGVtYVdyaXRlci5jbGFzcyk7CiAgICAgICAgICAgICBpZighbW9zdFVzZWROYW1lc3BhY2VVUkkuZXF1YWxzKCIiKSkKICAgICAgICAgICAgICAgICB3Lm5hbWVzcGFjZShtb3N0VXNlZE5hbWVzcGFjZVVSSSk7CiAgICAgICAgICAgICBpZihlbGVtZW50Rm9ybURlZmF1bHQ9PVhtbE5zRm9ybS5RVUFMSUZJRUQpCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9Qcml2YXRlT2JqZWN0RmFjdG9yeUdlbmVyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vUHJpdmF0ZU9iamVjdEZhY3RvcnlHZW5lcmF0b3IuamF2YQppbmRleCA2ZjA1ODRjLi4yMTZjMmQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9Qcml2YXRlT2JqZWN0RmFjdG9yeUdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL1ByaXZhdGVPYmplY3RGYWN0b3J5R2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9QdWJsaWNPYmplY3RGYWN0b3J5R2VuZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9QdWJsaWNPYmplY3RGYWN0b3J5R2VuZXJhdG9yLmphdmEKaW5kZXggMmY3NWFmOC4uM2NkYzNjMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vUHVibGljT2JqZWN0RmFjdG9yeUdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL1B1YmxpY09iamVjdEZhY3RvcnlHZW5lcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW47CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KUGFja2FnZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0Fic3RyYWN0RmllbGQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0Fic3RyYWN0RmllbGQuamF2YQppbmRleCAyMWM4ZTUwLi5hMWM3YjUxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9BYnN0cmFjdEZpZWxkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvQWJzdHJhY3RGaWVsZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbi5maWVsZDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC01MCw2ICs0OSw3IEBACiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYy5YbWxFbGVtZW50UmVmc1dyaXRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjLlhtbEVsZW1lbnRXcml0ZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmFubm90YXRpb24uc3BlYy5YbWxFbGVtZW50c1dyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYW5ub3RhdGlvbi5zcGVjLlhtbFNjaGVtYVR5cGVXcml0ZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uQ2xhc3NPdXRsaW5lSW1wbDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQXR0cmlidXRlUHJvcGVydHlJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50OwpAQCAtMTQyLDYgKzE0MiwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgb3V0bGluZS5wYXJlbnQoKS5nZW5lcmF0ZUFkYXB0ZXJJZk5lY2Vzc2FyeShwcm9wLGZpZWxkKTsKKworICAgICAgICBRTmFtZSBzdCA9IHByb3AuZ2V0U2NoZW1hVHlwZSgpOworICAgICAgICBpZihzdCE9bnVsbCkKKyAgICAgICAgICAgIGZpZWxkLmFubm90YXRlMihYbWxTY2hlbWFUeXBlV3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5uYW1lKHN0LmdldExvY2FsUGFydCgpKQorICAgICAgICAgICAgICAgIC5uYW1lc3BhY2Uoc3QuZ2V0TmFtZXNwYWNlVVJJKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhbm5vdGF0ZVJlZmVyZW5jZShKQW5ub3RhdGFibGUgZmllbGQpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0Fic3RyYWN0RmllbGRXaXRoVmFyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9BYnN0cmFjdEZpZWxkV2l0aFZhci5qYXZhCmluZGV4IDBlMTZiODIuLjkxN2YzZTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0Fic3RyYWN0RmllbGRXaXRoVmFyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvQWJzdHJhY3RGaWVsZFdpdGhWYXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQmxvY2s7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9BYnN0cmFjdExpc3RGaWVsZC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvQWJzdHJhY3RMaXN0RmllbGQuamF2YQppbmRleCAwODZlYjQyLi5hMzRhZjI0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9BYnN0cmFjdExpc3RGaWVsZC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0Fic3RyYWN0TGlzdEZpZWxkLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuLmZpZWxkOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9BcnJheUZpZWxkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9BcnJheUZpZWxkLmphdmEKaW5kZXggMDk1MDQwYi4uYmMyNjQwMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvQXJyYXlGaWVsZC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0FycmF5RmllbGQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvQ29uc3RGaWVsZC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvQ29uc3RGaWVsZC5qYXZhCmluZGV4IDhjYzE4OTIuLjdjZWJjZTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0NvbnN0RmllbGQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9Db25zdEZpZWxkLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuLmZpZWxkOwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkJsb2NrOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvQ29uc3RGaWVsZFJlbmRlcmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9Db25zdEZpZWxkUmVuZGVyZXIuamF2YQppbmRleCAxYTRhYTAyLi4xNzc4NmY4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9Db25zdEZpZWxkUmVuZGVyZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9Db25zdEZpZWxkUmVuZGVyZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbi5DbGFzc091dGxpbmVJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvRGVmYXVsdEZpZWxkUmVuZGVyZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0RlZmF1bHRGaWVsZFJlbmRlcmVyLmphdmEKaW5kZXggYzc1NmZhZi4uNDJmYzBiMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvRGVmYXVsdEZpZWxkUmVuZGVyZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9EZWZhdWx0RmllbGRSZW5kZXJlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbi5maWVsZDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9GaWVsZFJlbmRlcmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9GaWVsZFJlbmRlcmVyLmphdmEKaW5kZXggN2YxMzQ1OS4uNWI1ZThiNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvRmllbGRSZW5kZXJlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0ZpZWxkUmVuZGVyZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9GaWVsZFJlbmRlcmVyRmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvRmllbGRSZW5kZXJlckZhY3RvcnkuamF2YQppbmRleCBjZDc0MjNkLi42ZDVlZWE2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9GaWVsZFJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0ZpZWxkUmVuZGVyZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuLmZpZWxkOwogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuT3B0aW9uczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0dlbmVyaWNGaWVsZFJlbmRlcmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9HZW5lcmljRmllbGRSZW5kZXJlci5qYXZhCmluZGV4IDE4ODhlYjguLmU4OWFjYjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0dlbmVyaWNGaWVsZFJlbmRlcmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvR2VuZXJpY0ZpZWxkUmVuZGVyZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0lzU2V0RmllbGQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0lzU2V0RmllbGQuamF2YQppbmRleCAxNjMwNTk0Li5iYWY1YzQ3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9Jc1NldEZpZWxkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvSXNTZXRGaWVsZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbi5maWVsZDsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpCbG9jazsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL0lzU2V0RmllbGRSZW5kZXJlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvSXNTZXRGaWVsZFJlbmRlcmVyLmphdmEKaW5kZXggOGNkMGQ0Yy4uN2FiNmRkOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvSXNTZXRGaWVsZFJlbmRlcmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvSXNTZXRGaWVsZFJlbmRlcmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuLmZpZWxkOwogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uQ2xhc3NPdXRsaW5lSW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcwppbmRleCBhNzdiNmEzLi43N2Y2MzI4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBERUZBVUxUX1NFVFRFUl9KQVZBRE9DID0gXAogICAgICAgICBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgezB9IHByb3BlcnR5LgogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9NZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvTWVzc2FnZXMuamF2YQppbmRleCBlNjU0ZWY2Li42MWZhNmVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuLmZpZWxkOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL1NpbmdsZUZpZWxkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9TaW5nbGVGaWVsZC5qYXZhCmluZGV4IDk5YjdjOTEuLmEyYjNhYjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL1NpbmdsZUZpZWxkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvU2luZ2xlRmllbGQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL1NpbmdsZVByaW1pdGl2ZUFjY2Vzc0ZpZWxkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9TaW5nbGVQcmltaXRpdmVBY2Nlc3NGaWVsZC5qYXZhCmluZGV4IGVmNDcwYjMuLmViZDY0MGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL1NpbmdsZVByaW1pdGl2ZUFjY2Vzc0ZpZWxkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvU2luZ2xlUHJpbWl0aXZlQWNjZXNzRmllbGQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IuYmVhbi5DbGFzc091dGxpbmVJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvVW5ib3hlZEZpZWxkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9VbmJveGVkRmllbGQuamF2YQppbmRleCA4ZmE1NWRhLi5hNTA2MzhlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9VbmJveGVkRmllbGQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9VbmJveGVkRmllbGQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQmxvY2s7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9VbnR5cGVkTGlzdEZpZWxkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9VbnR5cGVkTGlzdEZpZWxkLmphdmEKaW5kZXggMGM4Yzg1Ni4uYmYzZmRkZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvVW50eXBlZExpc3RGaWVsZC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL1VudHlwZWRMaXN0RmllbGQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvVW50eXBlZExpc3RGaWVsZFJlbmRlcmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9VbnR5cGVkTGlzdEZpZWxkUmVuZGVyZXIuamF2YQppbmRleCBiZjJhMjRkLi5iMzkzNTM4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9VbnR5cGVkTGlzdEZpZWxkUmVuZGVyZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9VbnR5cGVkTGlzdEZpZWxkUmVuZGVyZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uZmllbGQ7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ2xhc3M7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvYmVhbi9maWVsZC9wYWNrYWdlLmh0bWwKaW5kZXggZDhlZWQ1YS4uNzgxMDY3MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL2JlYW4vZmllbGQvcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9iZWFuL2ZpZWxkL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8Ym9keT48cD4KIEZpZWxkUmVuZGVyZXIgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLgogVW5sZXNzIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSB0aGVzZSBjbGFzc2VzIHRvIGRlZmluZSB5b3VyIG93biBjdXN0b20gcmVuZGVyZXIsCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggYTNkMWU1Ni4uNTAyNWMxYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qKgogICogPGgxPkNvZGUgR2VuZXJhdG9yPC9oMT4uCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3V0aWwvQmxvY2tSZWZlcmVuY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci91dGlsL0Jsb2NrUmVmZXJlbmNlLmphdmEKaW5kZXggZWMxOTJiNS4uMGI3NzA2ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3V0aWwvQmxvY2tSZWZlcmVuY2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvdXRpbC9CbG9ja1JlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IudXRpbDsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpCbG9jazsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci91dGlsL0V4aXN0aW5nQmxvY2tSZWZlcmVuY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci91dGlsL0V4aXN0aW5nQmxvY2tSZWZlcmVuY2UuamF2YQppbmRleCA3M2MyZmNkLi43YWQ1ZDMxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvdXRpbC9FeGlzdGluZ0Jsb2NrUmVmZXJlbmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3V0aWwvRXhpc3RpbmdCbG9ja1JlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IudXRpbDsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpCbG9jazsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci91dGlsL0xhenlCbG9ja1JlZmVyZW5jZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3V0aWwvTGF6eUJsb2NrUmVmZXJlbmNlLmphdmEKaW5kZXggYTcxZmQyMy4uZGQ3NDg3ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3V0aWwvTGF6eUJsb2NrUmVmZXJlbmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3V0aWwvTGF6eUJsb2NrUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci51dGlsOwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkJsb2NrOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3V0aWwvV2hpdGVzcGFjZU5vcm1hbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL2dlbmVyYXRvci91dGlsL1doaXRlc3BhY2VOb3JtYWxpemVyLmphdmEKaW5kZXggYWFiNTdlOC4uYzk2YjY2OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvZ2VuZXJhdG9yL3V0aWwvV2hpdGVzcGFjZU5vcm1hbGl6ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9nZW5lcmF0b3IvdXRpbC9XaGl0ZXNwYWNlTm9ybWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5nZW5lcmF0b3IudXRpbDsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDb2RlTW9kZWw7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9BYnN0cmFjdENFbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9BYnN0cmFjdENFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlZjEwOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0Fic3RyYWN0Q0VsZW1lbnQuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OworCitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKworLyoqCisgKiBQYXJ0aWFsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENFbGVtZW50fS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0Q0VsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdENUeXBlSW5mb0ltcGwgaW1wbGVtZW50cyBDRWxlbWVudCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoaXMgY2xhc3Mgd2FzIGRlY2xhcmVkLgorICAgICAqLworICAgIEBYbWxUcmFuc2llbnQKKyAgICBwcml2YXRlIGZpbmFsIExvY2F0b3IgbG9jYXRvcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0Fic3RyYWN0OworCisgICAgcHJvdGVjdGVkIEFic3RyYWN0Q0VsZW1lbnQoTW9kZWwgbW9kZWwsIFhTQ29tcG9uZW50IHNvdXJjZSwgTG9jYXRvciBsb2NhdG9yLCBDQ3VzdG9taXphdGlvbnMgY3VzdG9taXphdGlvbnMpIHsKKyAgICAgICAgc3VwZXIobW9kZWwsIHNvdXJjZSwgY3VzdG9taXphdGlvbnMpOworICAgICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworICAgIH0KKworICAgIHB1YmxpYyBMb2NhdG9yIGdldExvY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBsb2NhdG9yOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisgICAgICAgIHJldHVybiBpc0Fic3RyYWN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFic3RyYWN0KCkgeworICAgICAgICBpc0Fic3RyYWN0ID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9BYnN0cmFjdENUeXBlSW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0Fic3RyYWN0Q1R5cGVJbmZvSW1wbC5qYXZhCmluZGV4IGJhYTJkYjQuLmMzZGYwYzMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0Fic3RyYWN0Q1R5cGVJbmZvSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0Fic3RyYWN0Q1R5cGVJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDE5ICsyMiwxNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5NaW1lVHlwZTsKIAotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDb2RlTW9kZWw7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkV4cHJlc3Npb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMub3V0bGluZS5PdXRsaW5lOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbi5Mb2NhdGFibGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLklEOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5Mb2NhdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWG1sU3RyaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmUuT3V0bGluZTsKIAogLyoqCiAgKiBQYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDVHlwZUluZm99LgpAQCAtNjksMTAgKzY3LDYgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIGZpbmFsIENUeXBlSW5mbyBnZXRJbmZvKCkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KICAgICBwdWJsaWMgZmluYWwgSUQgaWRVc2UoKSB7CiAgICAgICAgIHJldHVybiBJRC5OT05FOwogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0F1dG9DbGFzc05hbWVBbGxvY2F0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0F1dG9DbGFzc05hbWVBbGxvY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTRjZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQXV0b0NsYXNzTmFtZUFsbG9jYXRvci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5hcGkuQ2xhc3NOYW1lQWxsb2NhdG9yOworCisvKioKKyAqIHtAbGluayBDbGFzc05hbWVBbGxvY2F0b3J9IGZpbHRlciB0aGF0IHBlcmZvcm1zIGF1dG9tYXRpYyBuYW1lIGNvbmZsaWN0IHJlc29sdXRpb24uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgQXV0b0NsYXNzTmFtZUFsbG9jYXRvciBpbXBsZW1lbnRzIENsYXNzTmFtZUFsbG9jYXRvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc05hbWVBbGxvY2F0b3IgY29yZTsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxTZXQ8U3RyaW5nPj4gbmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU2V0PFN0cmluZz4+KCk7CisKKyAgICBwdWJsaWMgQXV0b0NsYXNzTmFtZUFsbG9jYXRvcihDbGFzc05hbWVBbGxvY2F0b3IgY29yZSkgeworICAgICAgICB0aGlzLmNvcmUgPSBjb3JlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgYXNzaWduQ2xhc3NOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBjbGFzc05hbWUgPSBkZXRlcm1pbmVOYW1lKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpOworICAgICAgICBpZihjb3JlIT1udWxsKQorICAgICAgICAgICAgY2xhc3NOYW1lID0gY29yZS5hc3NpZ25DbGFzc05hbWUocGFja2FnZU5hbWUsY2xhc3NOYW1lKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBkZXRlcm1pbmVOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBTZXQ8U3RyaW5nPiBzID0gbmFtZXMuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgaWYocz09bnVsbCkgeworICAgICAgICAgICAgcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIG5hbWVzLnB1dChwYWNrYWdlTmFtZSxzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHMuYWRkKGNsYXNzTmFtZSkpCisgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworCisgICAgICAgIGZvcihpbnQgaT0yO3RydWU7aSsrKSB7CisgICAgICAgICAgICBpZihzLmFkZChjbGFzc05hbWUraSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZStpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0FkYXB0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NBZGFwdGVyLmphdmEKaW5kZXggMjE2MzllMC4uNmI1YTgyMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0FkYXB0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQWRhcHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NBcnJheUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NBcnJheUluZm8uamF2YQppbmRleCBmM2IyNmZhLi43ZTY2NzMyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQXJyYXlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0FycmF5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CkBAIC02Nyw2ICs2NiwxMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQgLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gdGhpcworICAgIHB1YmxpYyBDTm9uRWxlbWVudCBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKICAgICBwdWJsaWMgSlR5cGUgdG9UeXBlKE91dGxpbmUgbywgQXNwZWN0IGFzcGVjdCkgewogICAgICAgICByZXR1cm4gaXRlbVR5cGUudG9UeXBlKG8sYXNwZWN0KS5hcnJheSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NBdHRyaWJ1dGVQcm9wZXJ0eUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NBdHRyaWJ1dGVQcm9wZXJ0eUluZm8uamF2YQppbmRleCA4MTQwMDJkLi4zMDI0MDQ0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQXR0cmlidXRlUHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0F0dHJpYnV0ZVByb3BlcnR5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CkBAIC0zMiw2ICszMSw3IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLkF0dHJpYnV0ZVByb3BlcnR5SW5mbzsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuUHJvcGVydHlLaW5kOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wb25lbnQ7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiAKIGltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCkBAIC00NSw5ICs0NSwxNiBAQAogICAgIHByaXZhdGUgZmluYWwgUU5hbWUgYXR0TmFtZTsKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNSZXF1aXJlZDsKIAorICAgIC8qKgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICBSZXByZXNlbnRzIHRoZSBib3VuZCB0eXBlIG9mIHRoaXMgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB0eXBlTmFtZQorICAgICAqICAgICAgWE1MIFNjaGVtYSB0eXBlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuIE9wdGlvbmFsIGZvciBvdGhlciBzY2hlbWEgbGFuZ3VhZ2VzLgorICAgICAqLwogICAgIHB1YmxpYyBDQXR0cmlidXRlUHJvcGVydHlJbmZvKFN0cmluZyBuYW1lLCBYU0NvbXBvbmVudCBzb3VyY2UsIENDdXN0b21pemF0aW9ucyBjdXN0b21pemF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdG9yIGxvY2F0b3IsIFFOYW1lIGF0dE5hbWUsIFR5cGVVc2UgdHlwZSwgYm9vbGVhbiByZXF1aXJlZCApIHsKLSAgICAgICAgc3VwZXIobmFtZSwgdHlwZSwgc291cmNlLCBjdXN0b21pemF0aW9ucywgbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRvciBsb2NhdG9yLCBRTmFtZSBhdHROYW1lLCBUeXBlVXNlIHR5cGUsIEBOdWxsYWJsZSBRTmFtZSB0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkICkgeworICAgICAgICBzdXBlcihuYW1lLCB0eXBlLCB0eXBlTmFtZSwgc291cmNlLCBjdXN0b21pemF0aW9ucywgbG9jYXRvcik7CiAgICAgICAgIGlzUmVxdWlyZWQgPSByZXF1aXJlZDsKICAgICAgICAgdGhpcy5hdHROYW1lID0gYXR0TmFtZTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQnVpbHRpbkxlYWZJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQnVpbHRpbkxlYWZJbmZvLmphdmEKaW5kZXggZjEwYWU2NC4uODZiZjYwNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0J1aWx0aW5MZWFmSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NCdWlsdGluTGVhZkluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBqYXZhLmF3dC4qOwpAQCAtMTEzLDEwICsxMTIsMTkgQEAKICAgICAgKiBTaW5jZSB7QGxpbmsgQ0J1aWx0aW5MZWFmSW5mb30gcmVwcmVzZW50cyBhIGRlZmF1bHQgYmluZGluZywKICAgICAgKiBpdCBpcyBuZXZlciBhIGNvbGxlY3Rpb24uCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVkIHRvIHJldHVybiB0aGlzLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIENOb25FbGVtZW50IGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIHB1YmxpYyBJRCBpZFVzZSgpIHsKICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KQEAgLTEyOCwxNyArMTM2LDExIEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEJ5IGRlZmluaXRpb24sIGEgZGVmYXVsdCBoYW5kbGluZyBkb2Vzbid0IG5lZWQgYW55IGFkYXB0ZXIuCi0gICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgZmluYWwgQ0FkYXB0ZXIgZ2V0QWRhcHRlclVzZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIGZpbmFsIENCdWlsdGluTGVhZkluZm8gZ2V0SW5mbygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCiAgICAgcHVibGljIExvY2F0b3IgZ2V0TG9jYXRvcigpIHsKICAgICAgICAgcmV0dXJuIE1vZGVsLkVNUFRZX0xPQ0FUT1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0NsYXNzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDUzYjcyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0NsYXNzLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKKworLyoqCisgKiBFaXRoZXIge0BsaW5rIENDbGFzc0luZm99IG9yIHtAbGluayBDQ2xhc3NSZWZ9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBDQ2xhc3MgZXh0ZW5kcyBDTm9uRWxlbWVudCwgQ0VsZW1lbnQgeworICAgIC8vIGhvdyBjYW4gYW55dGhpbmcgYmUgQ05vbkVsZW1lbnQgYW5kIENFbGVtZW50IGF0IHRoZSBzYW1lIHRpbWUsIHlvdSBtYXkgYXNrLgorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQ2xhc3NJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQ2xhc3NJbmZvLmphdmEKaW5kZXggNzNiMWU1Ni4uYTFjYTAwOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0NsYXNzSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NDbGFzc0luZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwyNCArMjIsMjUgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEUkVGOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ29kZU1vZGVsOwogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpQYWNrYWdlOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLm5hdi5OQ2xhc3M7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwubmF2Lk5UeXBlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmUuQXNwZWN0OwpAQCAtNTgsMTkgKzU5LDM0IEBACiAgKgogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ0NsYXNzSW5mbyBleHRlbmRzIEFic3RyYWN0Q1R5cGVJbmZvSW1wbCBpbXBsZW1lbnRzIENsYXNzSW5mbzxOVHlwZSxOQ2xhc3M+LCBDQ2xhc3NJbmZvUGFyZW50LCBDRWxlbWVudCwgQ05vbkVsZW1lbnQsIE5DbGFzcywgQ1R5cGVJbmZvIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBDQ2xhc3NJbmZvIGV4dGVuZHMgQWJzdHJhY3RDRWxlbWVudCBpbXBsZW1lbnRzIENsYXNzSW5mbzxOVHlwZSxOQ2xhc3M+LCBDQ2xhc3NJbmZvUGFyZW50LCBDQ2xhc3MsIE5DbGFzcyB7CiAKICAgICBAWG1sSURSRUYKLSAgICBwcml2YXRlIENDbGFzc0luZm8gYmFzZUNsYXNzOworICAgIHByaXZhdGUgQ0NsYXNzIGJhc2VDbGFzczsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgYWxsIHN1YmNsYXNzZXMsIHRvZ2V0aGVyIHdpdGgge0BsaW5rICNuZXh0U2libGluZ30uCisgICAgICoKKyAgICAgKiBJZiB0aGlzIGNsYXNzIGhhcyBubyBzdWItY2xhc3MsIHRoaXMgZmllbGQgaXMgbnVsbC4gT3RoZXJ3aXNlLAorICAgICAqIHRoaXMgZmllbGQgcG9pbnRzIHRvIGEgc3ViLWNsYXNzIG9mIHRoaXMgY2xhc3MuIEZyb20gdGhlcmUgeW91IGNhbiBlbnVtZXJhdGUKKyAgICAgKiBhbGwgdGhlIHN1Yi1jbGFzc2VzIGJ5IHVzaW5nIHtAbGluayAjbmV4dFNpYmxpbmd9LgorICAgICAqLworICAgIHByaXZhdGUgQ0NsYXNzSW5mbyBmaXJzdFN1YmNsYXNzOworCisgICAgLyoqCisgICAgICogQHNlZSAjZmlyc3RTdWJjbGFzcworICAgICAqLworICAgIHByaXZhdGUgQ0NsYXNzSW5mbyBuZXh0U2libGluZyA9IG51bGw7CiAKICAgICAvKioKICAgICAgKiBAc2VlICNnZXRUeXBlTmFtZSgpCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSB0eXBlTmFtZTsKKwogICAgIC8qKgotICAgICAqIENhbiBiZSBudWxsLgorICAgICAqIElmIHRoaXMgY2xhc3MgYWxzbyBnZXRzIHtAbGluayBYbWxSb290RWxlbWVudH0sIHRoZSBjbGFzcyBuYW1lLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgUU5hbWUgZWxlbWVudE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBATnVsbGFibGUgUU5hbWUgZWxlbWVudE5hbWU7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNPcmRlcmVkID0gdHJ1ZTsKIApAQCAtOTMsMTcgKzEwOSw5IEBACiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzaG9ydE5hbWU7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoaXMgY2xhc3Mgd2FzIGRlY2xhcmVkLgotICAgICAqLwotICAgIEBYbWxUcmFuc2llbnQKLSAgICBwcml2YXRlIGZpbmFsIExvY2F0b3IgbG9jYXRpb247Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBYnN0cmFjdDsKLQotICAgIC8qKgogICAgICAqIE9wdGlvbmFsIHVzZXItc3BlY2lmaWVkIGltcGxlbWVudGF0aW9uIG92ZXJyaWRlIGNsYXNzLgogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGltcGxDbGFzczsKKyAgICBwcml2YXRlIEBOdWxsYWJsZSBTdHJpbmcgaW1wbENsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIHtAbGluayBNb2RlbH0gb2JqZWN0IHRvIHdoaWNoIHRoaXMgYmVhbiBiZWxvbmdzLgpAQCAtMTIxLDExICsxMjksMTAgQEAKICAgICB9CiAKICAgICBwdWJsaWMgQ0NsYXNzSW5mbyhNb2RlbCBtb2RlbCxDQ2xhc3NJbmZvUGFyZW50IHAsIFN0cmluZyBzaG9ydE5hbWUsIExvY2F0b3IgbG9jYXRpb24sIFFOYW1lIHR5cGVOYW1lLCBRTmFtZSBlbGVtZW50TmFtZSwgWFNDb21wb25lbnQgc291cmNlLCBDQ3VzdG9taXphdGlvbnMgY3VzdG9taXphdGlvbnMpIHsKLSAgICAgICAgc3VwZXIobW9kZWwsc291cmNlLGN1c3RvbWl6YXRpb25zKTsKKyAgICAgICAgc3VwZXIobW9kZWwsc291cmNlLGxvY2F0aW9uLGN1c3RvbWl6YXRpb25zKTsKICAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwogICAgICAgICB0aGlzLnBhcmVudCA9IHA7CiAgICAgICAgIHRoaXMuc2hvcnROYW1lID0gbW9kZWwuYWxsb2NhdG9yLmFzc2lnbkNsYXNzTmFtZShwYXJlbnQsc2hvcnROYW1lKTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwogICAgICAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7CiAgICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKIApAQCAtMTMzLDcgKzE0MCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIENDbGFzc0luZm8oTW9kZWwgbW9kZWwsSkNvZGVNb2RlbCBjbSwgU3RyaW5nIGZ1bGxOYW1lLCBMb2NhdG9yIGxvY2F0aW9uLCBRTmFtZSB0eXBlTmFtZSwgUU5hbWUgZWxlbWVudE5hbWUsIFhTQ29tcG9uZW50IHNvdXJjZSwgQ0N1c3RvbWl6YXRpb25zIGN1c3RvbWl6YXRpb25zKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsLHNvdXJjZSxjdXN0b21pemF0aW9ucyk7CisgICAgICAgIHN1cGVyKG1vZGVsLHNvdXJjZSxsb2NhdGlvbixjdXN0b21pemF0aW9ucyk7CiAgICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKICAgICAgICAgaW50IGlkeCA9IGZ1bGxOYW1lLmluZGV4T2YoJy4nKTsKICAgICAgICAgaWYoaWR4PDApIHsKQEAgLTE0MywxNyArMTUwLDEyIEBACiAgICAgICAgICAgICB0aGlzLnBhcmVudCA9IG1vZGVsLmdldFBhY2thZ2UoY20uX3BhY2thZ2UoZnVsbE5hbWUuc3Vic3RyaW5nKDAsaWR4KSkpOwogICAgICAgICAgICAgdGhpcy5zaG9ydE5hbWUgPSBtb2RlbC5hbGxvY2F0b3IuYXNzaWduQ2xhc3NOYW1lKHBhcmVudCxmdWxsTmFtZS5zdWJzdHJpbmcoaWR4KzEpKTsKICAgICAgICAgfQotICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CiAgICAgICAgIHRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKICAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwogCiAgICAgICAgIG1vZGVsLmFkZCh0aGlzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gbG9jYXRpb247Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlV2lsZGNhcmQoKSB7CiAgICAgICAgIHJldHVybiBoYXNBdHRyaWJ1dGVXaWxkY2FyZDsKICAgICB9CkBAIC0xNjMsNyArMTY1LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJDbGFzc2VzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIGZpcnN0U3ViY2xhc3MhPW51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzcsMTAgKzIzOSwxMiBAQAogICAgICAgICByZXR1cm4gcHJvcGVydGllczsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZVByb3BlcnR5KCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBHZXRzIGEgcHJvcGVyeSBieSBuYW1lLgotICAgICAqCi0gICAgICogVE9ETzogY29uc2lkZXIgbW92aW5nIHRoaXMgdXAgdG8ge0BsaW5rIENsYXNzSW5mb30KICAgICAgKi8KICAgICBwdWJsaWMgQ1Byb3BlcnR5SW5mbyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewogICAgICAgICAvLyBUT0RPOiBkb2VzIHRoaXMgbWV0aG9kIG5lZWQgdG8gYmUgZmFzdD8KQEAgLTI1OCw2ICsyNjIsMTQgQEAKICAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lIT1udWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoaXMuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgQ05vbkVsZW1lbnQgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgcHVibGljIEVsZW1lbnQ8TlR5cGUsTkNsYXNzPiBhc0VsZW1lbnQoKSB7CiAgICAgICAgIGlmKGlzRWxlbWVudCgpKQogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CkBAIC0zMjksMjAgKzM0MSw3NSBAQAogICAgICAgICBwcm9wZXJ0aWVzLmFkZChwcm9wKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlQ2xhc3MoQ0NsYXNzSW5mbyBiYXNlKSB7CisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgYWNjZXB0cyBib3RoIHtAbGluayBDQ2xhc3NJbmZvfSAod2hpY2ggbWVhbnMgdGhlIGJhc2UgY2xhc3MKKyAgICAgKiBpcyBhbHNvIGdlbmVyYXRlZCksIG9yIHtAbGluayBDQ2xhc3NSZWZ9ICh3aGljaCBtZWFucyB0aGUgYmFzZSBjbGFzcyBpcworICAgICAqIGFscmVhZHkgZ2VuZXJhdGVkIGFuZCBzaW1wbHkgcmVmZXJlbmNlZC4pCisgICAgICoKKyAgICAgKiBUaGUgbGF0dGVyIGlzIHRyZWF0ZWQgc29tZXdoYXQgc3BlY2lhbCAtLS0gZnJvbSB0aGUgcmVzdCBvZiB0aGUgbW9kZWwKKyAgICAgKiB0aGlzIGV4dGVybmFsIGJhc2UgY2xhc3MgaXMgaW52aXNpYmxlLiBUaGlzIG1vZGVsaW5nIG1pZ2h0IG5lZWQgbW9yZQorICAgICAqIHRob3VnaHRzIHRvIGdldCByaWdodC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlQ2xhc3MoQ0NsYXNzIGJhc2UpIHsKICAgICAgICAgYXNzZXJ0IGJhc2VDbGFzcz09bnVsbDsKICAgICAgICAgYXNzZXJ0IGJhc2UhPW51bGw7CiAgICAgICAgIGJhc2VDbGFzcyA9IGJhc2U7CisKKyAgICAgICAgYXNzZXJ0IG5leHRTaWJsaW5nPT1udWxsOworICAgICAgICBpZiAoYmFzZSBpbnN0YW5jZW9mIENDbGFzc0luZm8pIHsKKyAgICAgICAgICAgIENDbGFzc0luZm8gcmVhbEJhc2UgPSAoQ0NsYXNzSW5mbykgYmFzZTsKKyAgICAgICAgICAgIHRoaXMubmV4dFNpYmxpbmcgPSByZWFsQmFzZS5maXJzdFN1YmNsYXNzOworICAgICAgICAgICAgcmVhbEJhc2UuZmlyc3RTdWJjbGFzcyA9IHRoaXM7CisgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGluaGVyaXRlZCB2ZXJzaW9uIHJldHVybnMgbnVsbCBpZiB0aGlzIGNsYXNzIGV4dGVuZHMgZnJvbSB7QGxpbmsgQ0NsYXNzUmVmfS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFJlZkJhc2VDbGFzcygpCisgICAgICovCiAgICAgcHVibGljIENDbGFzc0luZm8gZ2V0QmFzZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gYmFzZUNsYXNzOworICAgICAgICBpZiAoYmFzZUNsYXNzIGluc3RhbmNlb2YgQ0NsYXNzSW5mbykgeworICAgICAgICAgICAgcmV0dXJuIChDQ2xhc3NJbmZvKSBiYXNlQ2xhc3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDQ2xhc3NSZWYgZ2V0UmVmQmFzZUNsYXNzKCkgeworICAgICAgICBpZiAoYmFzZUNsYXNzIGluc3RhbmNlb2YgQ0NsYXNzUmVmKSB7CisgICAgICAgICAgICByZXR1cm4gKENDbGFzc1JlZikgYmFzZUNsYXNzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCB0aGUgc3ViLWNsYXNzZXMgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8Q0NsYXNzSW5mbz4gbGlzdFN1YmNsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8Q0NsYXNzSW5mbz4oKSB7CisgICAgICAgICAgICBDQ2xhc3NJbmZvIGN1ciA9IGZpcnN0U3ViY2xhc3M7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjdXIhPW51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDQ2xhc3NJbmZvIG5leHQoKSB7CisgICAgICAgICAgICAgICAgQ0NsYXNzSW5mbyByID0gY3VyOworICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5uZXh0U2libGluZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OwogICAgIH0KIAogICAgIHB1YmxpYyBDQ2xhc3NJbmZvIGdldFN1YnN0aXR1dGlvbkhlYWQoKSB7Ci0gICAgICAgIENDbGFzc0luZm8gYz1iYXNlQ2xhc3M7CisgICAgICAgIENDbGFzc0luZm8gYz1nZXRCYXNlQ2xhc3MoKTsKICAgICAgICAgd2hpbGUoYyE9bnVsbCAmJiAhYy5pc0VsZW1lbnQoKSkKLSAgICAgICAgICAgIGM9Yy5iYXNlQ2xhc3M7CisgICAgICAgICAgICBjPWMuZ2V0QmFzZUNsYXNzKCk7CiAgICAgICAgIHJldHVybiBjOwogICAgIH0KIApAQCAtNDAzLDEyICs0NzAsNCBAQAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBmdWxsTmFtZSgpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFic3RyYWN0KCkgewotICAgICAgICBpc0Fic3RyYWN0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgewotICAgICAgICByZXR1cm4gaXNBYnN0cmFjdDsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQ2xhc3NJbmZvUGFyZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQ2xhc3NJbmZvUGFyZW50LmphdmEKaW5kZXggNzIwOTNlNi4uNjNiMzEzOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0NsYXNzSW5mb1BhcmVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NDbGFzc0luZm9QYXJlbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KUGFja2FnZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NDbGFzc1JlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0NsYXNzUmVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmYzZjNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NDbGFzc1JlZi5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5uYXYuTkNsYXNzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLm5hdi5OVHlwZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lLkFzcGVjdDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lLk91dGxpbmU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mby5CSUNsYXNzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm8uQklFbnVtOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wb25lbnQ7CisKKy8qKgorICogUmVmZXJuZWNlIHRvIGFuIGV4aXN0aW5nIGNsYXNzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENDbGFzc1JlZiBleHRlbmRzIEFic3RyYWN0Q0VsZW1lbnQgaW1wbGVtZW50cyBOQ2xhc3MsIENDbGFzcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZTsKKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIGRlY2wKKyAgICAgKiAgICAgIFRoZSB7QGxpbmsgQklDbGFzc30gZGVjbGFyYXRpb24gdGhhdCBoYXMge0BsaW5rIEJJQ2xhc3MjZ2V0RXhpc3RpbmdDbGFzc1JlZigpfQorICAgICAqLworICAgIHB1YmxpYyBDQ2xhc3NSZWYoTW9kZWwgbW9kZWwsIFhTQ29tcG9uZW50IHNvdXJjZSwgQklDbGFzcyBkZWNsLCBDQ3VzdG9taXphdGlvbnMgY3VzdG9taXphdGlvbnMpIHsKKyAgICAgICAgc3VwZXIobW9kZWwsIHNvdXJjZSwgZGVjbC5nZXRMb2NhdGlvbigpLCBjdXN0b21pemF0aW9ucyk7CisgICAgICAgIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gZGVjbC5nZXRFeGlzdGluZ0NsYXNzUmVmKCk7CisgICAgICAgIGFzc2VydCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSE9bnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWNsCisgICAgICogICAgICBUaGUge0BsaW5rIEJJQ2xhc3N9IGRlY2xhcmF0aW9uIHRoYXQgaGFzIHtAbGluayBCSUVudW0jcmVmfQorICAgICAqLworICAgIHB1YmxpYyBDQ2xhc3NSZWYoTW9kZWwgbW9kZWwsIFhTQ29tcG9uZW50IHNvdXJjZSwgQklFbnVtIGRlY2wsIENDdXN0b21pemF0aW9ucyBjdXN0b21pemF0aW9ucykgeworICAgICAgICBzdXBlcihtb2RlbCwgc291cmNlLCBkZWNsLmdldExvY2F0aW9uKCksIGN1c3RvbWl6YXRpb25zKTsKKyAgICAgICAgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgPSBkZWNsLnJlZjsKKyAgICAgICAgYXNzZXJ0IGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lIT1udWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFic3RyYWN0KCkgeworICAgICAgICAvLyBhc3N1bWUgdGhhdCB0aGUgcmVmZXJlbmNlZCBjbGFzcyBpcyBtYXJrZWQgYXMgYWJzdHJhY3QgdG8gYmVnaW4gd2l0aC4KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgeworICAgICAgICAvLyBubyB3YXkgdG8gZmluZCBvdXQgZm9yIHN1cmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBOVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZWQgZm9yIGJvdGggcGVyZm9ybWFuY2UgYW5kIHNpbmdsZSBpZGVudGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpDbGFzcyBjbGF6ejsKKworICAgIHB1YmxpYyBKQ2xhc3MgdG9UeXBlKE91dGxpbmUgbywgQXNwZWN0IGFzcGVjdCkgeworICAgICAgICBpZihjbGF6ej09bnVsbCkKKyAgICAgICAgICAgIGNsYXp6ID0gby5nZXRDb2RlTW9kZWwoKS5yZWYoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOworICAgICAgICByZXR1cm4gY2xheno7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBmdWxsTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRUeXBlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3VhcmFudGVlZCB0byByZXR1cm4gdGhpcy4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBDTm9uRWxlbWVudCBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKy8vIGFyZSB0aGVzZSBnb2luZyB0byBiaXRlIHVzPworLy8gICAgd2UgY2FuIGNvbXB1dGUgc29tZSBvZiB0aGVtLCBidXQgbm90IGFsbC4KKworICAgIHB1YmxpYyBDRWxlbWVudCBnZXRTdWJzdGl0dXRpb25IZWFkKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ0NsYXNzSW5mbyBnZXRTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JveGVkVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2ltcGxlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQ3VzdG9taXphYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQ3VzdG9taXphYmxlLmphdmEKaW5kZXggM2U2MTYwZC4uMGEzMzc0OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0N1c3RvbWl6YWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NDdXN0b21pemFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW47CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DQ3VzdG9taXphdGlvbnMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NDdXN0b21pemF0aW9ucy5qYXZhCmluZGV4IDgzYzI1NWYuLjQyOWIzNDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NDdXN0b21pemF0aW9ucy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NDdXN0b21pemF0aW9ucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRGVmYXVsdFZhbHVlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRGVmYXVsdFZhbHVlLmphdmEKaW5kZXggNmEzYjA3Ny4uZmUxYzMwYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0RlZmF1bHRWYWx1ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NEZWZhdWx0VmFsdWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KRXhwcmVzc2lvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NFbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRWxlbWVudC5qYXZhCmluZGV4IDhkOWEzMGEuLjQ5NmNiYTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NFbGVtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0VsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5uYXYuTkNsYXNzOwpAQCAtMzAsMTEgKzI5LDExIEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLkVsZW1lbnQ7CiAKIC8qKgotICogRWl0aGVyIHtAbGluayBDRWxlbWVudEluZm99IG9yIHtAbGluayBDQ2xhc3NJbmZvfS4KKyAqIEVpdGhlciB7QGxpbmsgQ0VsZW1lbnRJbmZvfSwge0BsaW5rIENDbGFzc0luZm99LCBvciB7QGxpbmsgQ0NsYXNzUmVmfS4KICAqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ0VsZW1lbnQgZXh0ZW5kcyBDVHlwZUluZm8sIEVsZW1lbnQ8TlR5cGUsTkNsYXNzPiwgQ0NsYXNzSW5mb1BhcmVudCB7CitwdWJsaWMgaW50ZXJmYWNlIENFbGVtZW50IGV4dGVuZHMgQ1R5cGVJbmZvLCBFbGVtZW50PE5UeXBlLE5DbGFzcz4gewogICAgIC8qKgogICAgICAqIE1hcmtzIHRoaXMgZWxlbWVudCBhcyBhbiBhYnN0cmFjdCBlbGVtZW50LgogICAgICAqLwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0VsZW1lbnRJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRWxlbWVudEluZm8uamF2YQppbmRleCA5YjM0NmZlLi45MWRlNzljIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRWxlbWVudEluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRWxlbWVudEluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTMzLDI1ICszMiwyNCBAQAogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KUGFja2FnZTsKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KVHlwZTsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0VsZW1lbnRQcm9wZXJ0eUluZm8uQ29sbGVjdGlvbk1vZGUuTk9UX1JFUEVBVEVEOworaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DRWxlbWVudFByb3BlcnR5SW5mby5Db2xsZWN0aW9uTW9kZS5SRVBFQVRFRF9WQUxVRTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5uYXYuTkNsYXNzOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLm5hdi5OVHlwZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5uYXYuTmF2aWdhdG9ySW1wbDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lLkFzcGVjdDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lLk91dGxpbmU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLkVsZW1lbnRJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wb25lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0VsZW1lbnREZWNsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWG1sU3RyaW5nOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DRWxlbWVudFByb3BlcnR5SW5mby5Db2xsZWN0aW9uTW9kZS5SRVBFQVRFRF9WQUxVRTsKLWltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0VsZW1lbnRQcm9wZXJ0eUluZm8uQ29sbGVjdGlvbk1vZGUuTk9UX1JFUEVBVEVEOwotCiAvKioKICAqIHtAbGluayBFbGVtZW50SW5mb30gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjb21waWxlLXRpbWUgbW9kZWwuCiAgKgpAQCAtNjEsOCArNTksOCBAQAogICoKICAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIENFbGVtZW50SW5mbyBleHRlbmRzIEFic3RyYWN0Q1R5cGVJbmZvSW1wbAotICAgIGltcGxlbWVudHMgRWxlbWVudEluZm88TlR5cGUsTkNsYXNzPiwgQ0VsZW1lbnQsIENUeXBlSW5mbywgTlR5cGUsIENDbGFzc0luZm9QYXJlbnQgeworcHVibGljIGZpbmFsIGNsYXNzIENFbGVtZW50SW5mbyBleHRlbmRzIEFic3RyYWN0Q0VsZW1lbnQKKyAgICBpbXBsZW1lbnRzIEVsZW1lbnRJbmZvPE5UeXBlLE5DbGFzcz4sIE5UeXBlLCBDQ2xhc3NJbmZvUGFyZW50IHsKIAogICAgIHByaXZhdGUgZmluYWwgUU5hbWUgdGFnTmFtZTsKIApAQCAtODcsMTQgKzg1LDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ0NsYXNzSW5mb1BhcmVudCBwYXJlbnQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoaXMgY2xhc3Mgd2FzIGRlY2xhcmVkLgotICAgICAqLwotICAgIEBYbWxUcmFuc2llbnQKLSAgICBwcml2YXRlIGZpbmFsIExvY2F0b3IgbG9jYXRpb247Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBYnN0cmFjdDsKLQogICAgIHByaXZhdGUgQ0VsZW1lbnRJbmZvIHN1YnN0aXR1dGlvbkhlYWQ7CiAKICAgICAvKioKQEAgLTExMywxNSArMTAzLDE0IEBACiAgICAgICogQ3JlYXRlcyBhbiBlbGVtZW50IGluIHRoZSBnaXZlbiBwYXJlbnQuCiAgICAgICoKICAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHVzaW5nIHRoaXMgY29uc3RydWN0aW9uLCB7QGxpbmsgI2luaXRDb250ZW50VHlwZShUeXBlVXNlLCBYU0NvbXBvbmVudCwgWG1sU3RyaW5nKX0KKyAgICAgKiBXaGVuIHVzaW5nIHRoaXMgY29uc3RydWN0aW9uLCB7QGxpbmsgI2luaXRDb250ZW50VHlwZShUeXBlVXNlLCBYU0VsZW1lbnREZWNsLCBYbWxTdHJpbmcpfQogICAgICAqIG11c3Qgbm90IGJlIGludm9rZWQuCiAgICAgICovCi0gICAgcHVibGljIENFbGVtZW50SW5mbyhNb2RlbCBtb2RlbCxRTmFtZSB0YWdOYW1lLCBDQ2xhc3NJbmZvUGFyZW50IHBhcmVudCwgVHlwZVVzZSBjb250ZW50VHlwZSwgWG1sU3RyaW5nIGRlZmF1bHRWYWx1ZSwgWFNDb21wb25lbnQgc291cmNlLCBDQ3VzdG9taXphdGlvbnMgY3VzdG9taXphdGlvbnMsIExvY2F0b3IgbG9jYXRpb24gKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsLHNvdXJjZSxjdXN0b21pemF0aW9ucyk7CisgICAgcHVibGljIENFbGVtZW50SW5mbyhNb2RlbCBtb2RlbCxRTmFtZSB0YWdOYW1lLCBDQ2xhc3NJbmZvUGFyZW50IHBhcmVudCwgVHlwZVVzZSBjb250ZW50VHlwZSwgWG1sU3RyaW5nIGRlZmF1bHRWYWx1ZSwgWFNFbGVtZW50RGVjbCBzb3VyY2UsIENDdXN0b21pemF0aW9ucyBjdXN0b21pemF0aW9ucywgTG9jYXRvciBsb2NhdGlvbiApIHsKKyAgICAgICAgc3VwZXIobW9kZWwsc291cmNlLGxvY2F0aW9uLGN1c3RvbWl6YXRpb25zKTsKICAgICAgICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKICAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwogICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwogICAgICAgICBpZihjb250ZW50VHlwZSE9bnVsbCkKICAgICAgICAgICAgIGluaXRDb250ZW50VHlwZShjb250ZW50VHlwZSwgc291cmNlLCBkZWZhdWx0VmFsdWUpOwogCkBAIC0xMzMsNyArMTIyLDcgQEAKICAgICAgKgogICAgICAqIDxwPgogICAgICAqIFdoZW4gdXNpbmcgdGhpcyBjb25zdHJ1Y3Rpb24sIHRoZSBjYWxsZXIgbXVzdCB1c2UKLSAgICAgKiB7QGxpbmsgI2luaXRDb250ZW50VHlwZShUeXBlVXNlLCBYU0NvbXBvbmVudCwgWG1sU3RyaW5nKX0gdG8gZmlsbCBpbiB0aGUgY29udGVudCB0eXBlCisgICAgICoge0BsaW5rICNpbml0Q29udGVudFR5cGUoVHlwZVVzZSwgWFNFbGVtZW50RGVjbCwgWG1sU3RyaW5nKX0gdG8gZmlsbCBpbiB0aGUgY29udGVudCB0eXBlCiAgICAgICogbGF0ZXIuCiAgICAgICoKICAgICAgKiBUaGlzIGlzIHRvIGF2b2lkIGEgY2lyY3VsYXIgbW9kZWwgY29uc3RydWN0aW9uIGRlcGVuZGVuY3kgYmV0d2VlbiBidWlkbGluZyBhIHR5cGUKQEAgLTE0NSwxNiArMTM0LDE2IEBACiAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGluaXRDb250ZW50VHlwZShUeXBlVXNlIGNvbnRlbnRUeXBlLCBYU0NvbXBvbmVudCBzb3VyY2UsIFhtbFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICBwdWJsaWMgdm9pZCBpbml0Q29udGVudFR5cGUoVHlwZVVzZSBjb250ZW50VHlwZSwgQE51bGxhYmxlIFhTRWxlbWVudERlY2wgc291cmNlLCBYbWxTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgIGFzc2VydCB0aGlzLnByb3BlcnR5PT1udWxsOyAvLyBtdXN0IG5vdCBiZSBjYWxsZWQgdHdpY2UKIAogICAgICAgICB0aGlzLnByb3BlcnR5ID0gbmV3IENFbGVtZW50UHJvcGVydHlJbmZvKCJWYWx1ZSIsCiAgICAgICAgICAgICAgICAgY29udGVudFR5cGUuaXNDb2xsZWN0aW9uKCk/UkVQRUFURURfVkFMVUU6Tk9UX1JFUEVBVEVELAogICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLmlkVXNlKCksCiAgICAgICAgICAgICAgICAgY29udGVudFR5cGUuZ2V0RXhwZWN0ZWRNaW1lVHlwZSgpLAotICAgICAgICAgICAgICAgIHNvdXJjZSxudWxsLGxvY2F0aW9uLHRydWUpOworICAgICAgICAgICAgICAgIHNvdXJjZSxudWxsLGdldExvY2F0b3IoKSx0cnVlKTsKICAgICAgICAgdGhpcy5wcm9wZXJ0eS5zZXRBZGFwdGVyKGNvbnRlbnRUeXBlLmdldEFkYXB0ZXJVc2UoKSk7Ci0gICAgICAgIHByb3BlcnR5LmdldFR5cGVzKCkuYWRkKG5ldyBDVHlwZVJlZigoQ05vbkVsZW1lbnQpY29udGVudFR5cGUuZ2V0SW5mbygpLHRhZ05hbWUsdHJ1ZSxkZWZhdWx0VmFsdWUpKTsKKyAgICAgICAgcHJvcGVydHkuZ2V0VHlwZXMoKS5hZGQobmV3IENUeXBlUmVmKGNvbnRlbnRUeXBlLmdldEluZm8oKSx0YWdOYW1lLENUeXBlUmVmLmdldFNpbXBsZVR5cGVOYW1lKHNvdXJjZSksIHRydWUsZGVmYXVsdFZhbHVlKSk7CiAgICAgICAgIHRoaXMudHlwZSA9IE5hdmlnYXRvckltcGwuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoCiAgICAgICAgICAgICBOYXZpZ2F0b3JJbXBsLnRoZUluc3RhbmNlLnJlZihKQVhCRWxlbWVudC5jbGFzcyksCiAgICAgICAgICAgICBnZXRDb250ZW50SW5NZW1vcnlUeXBlKCkgKTsKQEAgLTIzMCwxNCArMjE5LDYgQEAKICAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRBYnN0cmFjdCgpIHsKLSAgICAgICAgaXNBYnN0cmFjdCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKLSAgICAgICAgcmV0dXJuIGlzQWJzdHJhY3Q7Ci0gICAgfQotCiAgICAgcHVibGljIENFbGVtZW50SW5mbyBnZXRTdWJzdGl0dXRpb25IZWFkKCkgewogICAgICAgICByZXR1cm4gc3Vic3RpdHV0aW9uSGVhZDsKICAgICB9CkBAIC0yOTMsOCArMjc0LDQgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGFzcygpIHsKICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZSE9bnVsbDsKICAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gbG9jYXRpb247Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0VsZW1lbnRQcm9wZXJ0eUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NFbGVtZW50UHJvcGVydHlJbmZvLmphdmEKaW5kZXggYTlkZDZkZi4uZmUyZjNhMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0VsZW1lbnRQcm9wZXJ0eUluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRWxlbWVudFByb3BlcnR5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEyICsyMiwxMiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5hY3RpdmF0aW9uLk1pbWVUeXBlOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CkBAIC0xMDMsNiArMTAzLDE5IEBACiAgICAgICAgIHJldHVybiByZWY7CiAgICAgfQogCisgICAgcHVibGljIFFOYW1lIGdldFNjaGVtYVR5cGUoKSB7CisgICAgICAgIGlmKHR5cGVzLnNpemUoKSE9MSkKKyAgICAgICAgICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUga2luZCBpcyBoZXJlLCBjYW4ndCBwcm9kdWNlIEBYbWxTY2hlbWFUeXBlLgorICAgICAgICAgICAgLy8gVE9ETzogaXMgaXQgYWxsb3dlZCB0byBoYXZlIG9uZSBnZW5lcmF0ZWQgaWYgdHlwZXMKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIENUeXBlUmVmIHQgPSB0eXBlcy5nZXQoMCk7CisgICAgICAgIGlmKG5lZWRzRXhwbGljaXRUeXBlTmFtZSh0LmdldFRhcmdldCgpLHQudHlwZU5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHQudHlwZU5hbWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFhKQyBuZXZlciB1c2VzIHRoZSB3cmFwcGVyIGVsZW1lbnQuIEFsd2F5cyByZXR1cm4gbnVsbC4KICAgICAgKi8KQEAgLTExMSw2ICsxMjQsMTEgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uUmVxdWlyZWQoKSB7CisgICAgICAgIC8vIGluIFhKQywgd2UgbmV2ZXIgcmVjb2duaXplIGEgbmlsbGFibGUgY29sbGVjdGlvbiBwYXR0ZXJuLCBzbyB0aGlzIGlzIGFsd2F5cyBmYWxzZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGlvbk5pbGxhYmxlKCkgewogICAgICAgICAvLyBpbiBYSkMsIHdlIG5ldmVyIHJlY29nbml6ZSBhIG5pbGxhYmxlIGNvbGxlY3Rpb24gcGF0dGVybiwgc28gdGhpcyBpcyBhbHdheXMgZmFsc2UuCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE4MSw0ICsxOTksMTQgQEAKIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGVkKCkgeyByZXR1cm4gY29sOyB9CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFFOYW1lIGNvbGxlY3RFbGVtZW50TmFtZXMoTWFwPFFOYW1lLCBDUHJvcGVydHlJbmZvPiB0YWJsZSkgeworICAgICAgICBmb3IgKENUeXBlUmVmIHQgOiB0eXBlcykgeworICAgICAgICAgICAgUU5hbWUgbiA9IHQuZ2V0VGFnTmFtZSgpOworICAgICAgICAgICAgaWYodGFibGUuY29udGFpbnNLZXkobikpICAgIHJldHVybiBuOworICAgICAgICAgICAgdGFibGUucHV0KG4sIHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NFbnVtQ29uc3RhbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NFbnVtQ29uc3RhbnQuamF2YQppbmRleCBlYTc4OGNkLi5mYjE2YzAyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRW51bUNvbnN0YW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0VudW1Db25zdGFudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLm5hdi5OQ2xhc3M7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRW51bUxlYWZJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DRW51bUxlYWZJbmZvLmphdmEKaW5kZXggMGE4ZDAxMC4uNWQwZmY0OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ0VudW1MZWFmSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NFbnVtTGVhZkluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTExOCw3ICsxMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0b3IgX3NvdXJjZUxvY2F0b3IpIHsKICAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwogICAgICAgICB0aGlzLnBhcmVudCA9IGNvbnRhaW5lcjsKLSAgICAgICAgdGhpcy5zaG9ydE5hbWUgPSBzaG9ydE5hbWU7CisgICAgICAgIHRoaXMuc2hvcnROYW1lID0gbW9kZWwuYWxsb2NhdG9yLmFzc2lnbkNsYXNzTmFtZShwYXJlbnQsc2hvcnROYW1lKTsKICAgICAgICAgdGhpcy5iYXNlID0gYmFzZTsKICAgICAgICAgdGhpcy5tZW1iZXJzID0gX21lbWJlcnM7CiAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwpAQCAtMjMyLDE1ICsyMzEsMTggQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbGxlY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBDQWRhcHRlciBnZXRBZGFwdGVyVXNlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgQ1R5cGVJbmZvIGdldEluZm8oKSB7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgQ05vbkVsZW1lbnQgZ2V0SW5mbygpIHsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DTm9uRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ05vbkVsZW1lbnQuamF2YQppbmRleCBhODg1NmFiLi5hNjQ3MWNhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DTm9uRWxlbWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NOb25FbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwubmF2Lk5DbGFzczsKQEAgLTMwLDcgKzI5LDMwIEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLk5vbkVsZW1lbnQ7CiAKIC8qKgorICoge0BsaW5rIE5vbkVsZW1lbnR9IGF0IGNvbXBpbGUtdGltZS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGltcGxlbWVudHMge0BsaW5rIFR5cGVVc2V9IHNvIHRoYXQgYSB7QGxpbmsgQ05vbkVsZW1lbnR9CisgKiBpbnN0YW5jZSBjYW4gYmUgdXNlZCBhcyBhIHtAbGluayBUeXBlVXNlfSBpbnN0YW5jZS4KKyAqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ05vbkVsZW1lbnQgZXh0ZW5kcyBOb25FbGVtZW50PE5UeXBlLE5DbGFzcz4sIENUeXBlSW5mbyB7CitwdWJsaWMgaW50ZXJmYWNlIENOb25FbGVtZW50IGV4dGVuZHMgTm9uRWxlbWVudDxOVHlwZSxOQ2xhc3M+LCBUeXBlVXNlLCBDVHlwZUluZm8geworICAgIC8qKgorICAgICAqIEd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoaXMuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBDTm9uRWxlbWVudCBnZXRJbmZvKCk7CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVkIHRvIHJldHVybiBmYWxzZS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIGJvb2xlYW4gaXNDb2xsZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVkIHRvIHJldHVybiBudWxsLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgQ0FkYXB0ZXIgZ2V0QWRhcHRlclVzZSgpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1BsdWdpbkN1c3RvbWl6YXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NQbHVnaW5DdXN0b21pemF0aW9uLmphdmEKaW5kZXggNjg1OGY2OS4uYjFjNTA1ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1BsdWdpbkN1c3RvbWl6YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DUGx1Z2luQ3VzdG9taXphdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLlBsdWdpbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NQcm9wZXJ0eUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NQcm9wZXJ0eUluZm8uamF2YQppbmRleCA1NTc3ZGFlLi5lYzJiNzVmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DUHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1Byb3BlcnR5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEyICsyMiwxNCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKQEAgLTQxLDEyICs0MywxNSBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLmltcGwuTmFtZUNvbnZlcnRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuUHJvcGVydHlJbmZvOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5SdW50aW1lVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLldlbGxLbm93bk5hbWVzcGFjZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OwogCiBpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKIC8qKgorICogTW9kZWwgb2YgYSBwcm9wZXJ0eSB0byBiZSBnZW5lcmF0ZWQuCisgKgogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ1Byb3BlcnR5SW5mbyBpbXBsZW1lbnRzIFByb3BlcnR5SW5mbzxOVHlwZSxOQ2xhc3M+LCBDQ3VzdG9taXphYmxlIHsKQEAgLTkxLDEwICs5Niw2IEBACiAgICAgcHVibGljIENEZWZhdWx0VmFsdWUgZGVmYXVsdFZhbHVlOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBDQ3VzdG9taXphdGlvbnMgY3VzdG9taXphdGlvbnM7Ci0gICAgLyoqCi0gICAgICogQHNlZSAjZ2V0U2NoZW1hVHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIHNjaGVtYVR5cGU7CiAKICAgICBwcm90ZWN0ZWQgQ1Byb3BlcnR5SW5mbyhTdHJpbmcgbmFtZSwgYm9vbGVhbiBjb2xsZWN0aW9uLCBYU0NvbXBvbmVudCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0N1c3RvbWl6YXRpb25zIGN1c3RvbWl6YXRpb25zLCBMb2NhdG9yIGxvY2F0b3IpIHsKQEAgLTI3MCwxMCArMjcxLDYgQEAKICAgICAgICAgcmV0dXJuIGN1c3RvbWl6YXRpb25zOwogICAgIH0KIAotICAgIHB1YmxpYyBRTmFtZSBnZXRTY2hlbWFUeXBlKCkgewotICAgICAgICByZXR1cm4gc2NoZW1hVHlwZTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBAZGVwcmVjYXRlZCBpZiB5b3UgYXJlIGNhbGxpbmcgdGhpcyBtZXRob2QgZGlyZWN0bHksIHRoZXJlJ3Mgc29tZXRoaW5nIHdyb25nLgogICAgICAqLwpAQCAtMjgyLDQgKzI3OSw1NCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBhYnN0cmFjdCA8Vj4gViBhY2NlcHQoIENQcm9wZXJ0eVZpc2l0b3I8Vj4gdmlzaXRvciApOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB7QGxpbmsgVHlwZVVzZX0gd291bGQgbmVlZCBhbiBleHBsaWNpdCB7QGxpbmsgWG1sU2NoZW1hVHlwZX0KKyAgICAgKiBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIHR5cGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbmVlZHNFeHBsaWNpdFR5cGVOYW1lKFR5cGVVc2UgdHlwZSwgUU5hbWUgdHlwZU5hbWUpIHsKKyAgICAgICAgaWYodHlwZU5hbWU9PW51bGwpCisgICAgICAgICAgICAvLyB0aGlzIGlzIGFub255bW91cyB0eXBlLiBjYW4ndCBoYXZlIEBYbWxTY2hlbWFUeXBlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYoIXR5cGVOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXZWxsS25vd25OYW1lc3BhY2UuWE1MX1NDSEVNQSkpCisgICAgICAgICAgICAvLyBpZiB3ZSBwdXQgYXBwbGljYXRpb24tZGVmaW5lZCB0eXBlIG5hbWUsIGl0IHdpbGwgYmUgdW5kZWZpbmVkCisgICAgICAgICAgICAvLyBieSB0aGUgdGltZSB3ZSBnZW5lcmF0ZSBhIHNjaGVtYS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZih0eXBlLmlzQ29sbGVjdGlvbigpKQorICAgICAgICAgICAgLy8gdGhlcmUncyBubyBidWlsdC1pbiBiaW5kaW5nIGZvciBhIGxpc3Qgc2ltcGxlIHR5cGUsCisgICAgICAgICAgICAvLyBzbyBhbnkgY29sbGVjdGlvbiB0eXBlIGFsd2F5cyBuZWVkIEBYbWxTY2hlbWFUeXBlCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBRTmFtZSBpdGVtVHlwZSA9IHR5cGUuZ2V0SW5mbygpLmdldFR5cGVOYW1lKCk7CisgICAgICAgIGlmKGl0ZW1UeXBlPT1udWxsKQorICAgICAgICAgICAgLy8gdGhpcyBpcyBzb21ld2hhdCBzdHJhbmdlIGNhc2UsIGFzIGl0IG1lYW5zIHRoZSBib3VuZCB0eXBlIGlzIGFub255bW91cworICAgICAgICAgICAgLy8gYnV0IGl0J3MgZXZlbnR1YWxseSBkZXJpdmVkIGJ5IGEgbmFtZWQgdHlwZSBhbmQgdXNlZC4KKyAgICAgICAgICAgIC8vIGJ1dCB3ZSBjYW4gY2VydGFpbmx5IHVzZSB0eXBlTmFtZSBhcyBAWG1sU2NoZW1hVHlwZSB2YWx1ZSBoZXJlCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBpZiBpdCdzIHRoZSBkZWZhdWx0IHR5cGUgbmFtZSBmb3IgdGhpcyBpdGVtLCB0aGVuIG5vIG5lZWQKKyAgICAgICAgcmV0dXJuICFpdGVtVHlwZS5lcXVhbHModHlwZU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgdGhlIGVsZW1lbnQgbmFtZXMgdGhhdCB0aGlzIHByb3BlcnR5IHBvc3Nlc3NlcyB0byB0aGUgbWFwLAorICAgICAqIHNvIHRoYXQgd2UgY2FuIGZpbmQgdHdvIHByb3BlcnRpZXMgdGhhdCBvd24gdGhlIHNhbWUgZWxlbWVudCBuYW1lLAorICAgICAqIHdoaWNoIGlzIGFuIGVycm9yLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiBubyBjb25mbGljdCB3YXMgZm91bmQuIE90aGVyd2lzZSByZXR1cm4gdGhlIFFOYW1lIHRoYXQgaGFzIHRoZSBjb2xsaXNpb24uCisgICAgICovCisgICAgcHVibGljIFFOYW1lIGNvbGxlY3RFbGVtZW50TmFtZXMoTWFwPFFOYW1lLENQcm9wZXJ0eUluZm8+IHRhYmxlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCA8QSBleHRlbmRzIEFubm90YXRpb24+IEEgcmVhZEFubm90YXRpb24oQ2xhc3M8QT4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQW5ub3RhdGlvbihDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1Byb3BlcnR5VmlzaXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1Byb3BlcnR5VmlzaXRvci5qYXZhCmluZGV4IDhlNWM5ZDYuLjQ5YjBiYjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NQcm9wZXJ0eVZpc2l0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DUHJvcGVydHlWaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NSZWZlcmVuY2VQcm9wZXJ0eUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NSZWZlcmVuY2VQcm9wZXJ0eUluZm8uamF2YQppbmRleCBhZTY4NmJjLi4zODk3M2IxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DUmVmZXJlbmNlUHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1JlZmVyZW5jZVByb3BlcnR5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEyICsyMiwxMiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5NaW1lVHlwZTsKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlczQ0RvbUhhbmRsZXI7CkBAIC0xODcsNCArMTg3LDI1IEBACiAgICAgICAgIC8vIGluIFhKQywgd2UgbmV2ZXIgcmVjb2duaXplIGEgbmlsbGFibGUgY29sbGVjdGlvbiBwYXR0ZXJuLCBzbyB0aGlzIGlzIGFsd2F5cyBmYWxzZS4KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGlvblJlcXVpcmVkKCkgeworICAgICAgICAvLyBpbiBYSkMsIHdlIG5ldmVyIHJlY29nbml6ZSBhIG5pbGxhYmxlIGNvbGxlY3Rpb24gcGF0dGVybiwgc28gdGhpcyBpcyBhbHdheXMgZmFsc2UuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyByZWZlcmVuY2UgcHJvcGVydHkgY2Fubm90IGhhdmUgYSB0eXBlLgorICAgIHB1YmxpYyBRTmFtZSBnZXRTY2hlbWFUeXBlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUU5hbWUgY29sbGVjdEVsZW1lbnROYW1lcyhNYXA8UU5hbWUsIENQcm9wZXJ0eUluZm8+IHRhYmxlKSB7CisgICAgICAgIGZvciAoQ0VsZW1lbnQgZSA6IGVsZW1lbnRzKSB7CisgICAgICAgICAgICBRTmFtZSBuID0gZS5nZXRFbGVtZW50TmFtZSgpOworICAgICAgICAgICAgaWYodGFibGUuY29udGFpbnNLZXkobikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgICAgICB0YWJsZS5wdXQobix0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DU2luZ2xlVHlwZVByb3BlcnR5SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1NpbmdsZVR5cGVQcm9wZXJ0eUluZm8uamF2YQppbmRleCBlOGJmNzEwLi4yNTkzNmJkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DU2luZ2xlVHlwZVByb3BlcnR5SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NTaW5nbGVUeXBlUHJvcGVydHlJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMjggKzIyLDQ5IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqYXZheC5hY3RpdmF0aW9uLk1pbWVUeXBlOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLldlbGxLbm93bk5hbWVzcGFjZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuSUQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbXBvbmVudDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKIC8qKgorICoge0BsaW5rIENQcm9wZXJ0eUluZm99IGJhY2tlZCBieSBhIHNpbmdsZSB7QGxpbmsgVHlwZVVzZX0uCisgKgogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQogICovCiBhYnN0cmFjdCBjbGFzcyBDU2luZ2xlVHlwZVByb3BlcnR5SW5mbyBleHRlbmRzIENQcm9wZXJ0eUluZm8gewogICAgIHByb3RlY3RlZCBmaW5hbCBUeXBlVXNlIHR5cGU7CiAKLSAgICBwcm90ZWN0ZWQgQ1NpbmdsZVR5cGVQcm9wZXJ0eUluZm8oU3RyaW5nIG5hbWUsIFR5cGVVc2UgdHlwZSwgWFNDb21wb25lbnQgc291cmNlLCBDQ3VzdG9taXphdGlvbnMgY3VzdG9taXphdGlvbnMsIExvY2F0b3IgbG9jYXRvcikgeworICAgIHByaXZhdGUgZmluYWwgUU5hbWUgc2NoZW1hVHlwZTsKKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGVOYW1lCisgICAgICogICAgICBYTUwgU2NoZW1hIHR5cGUgbmFtZSBvZiB0aGlzIHByb3BlcnR5J3Mgc2luZ2xlIHZhbHVlLiBPcHRpb25hbAorICAgICAqICAgICAgZm9yIG90aGVyIHNjaGVtYSBsYW5ndWFnZXMuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkCisgICAgICogICAgICBnZW5lcmF0ZSB7QGxpbmsgQFhtbFNjaGVtYVR5cGV9IGFubm90YXRpb24gdG8gaW1wcm92ZSB0aGUgcm91bmR0cmlwLgorICAgICAqLworICAgIHByb3RlY3RlZCBDU2luZ2xlVHlwZVByb3BlcnR5SW5mbyhTdHJpbmcgbmFtZSwgVHlwZVVzZSB0eXBlLCBRTmFtZSB0eXBlTmFtZSwgWFNDb21wb25lbnQgc291cmNlLCBDQ3VzdG9taXphdGlvbnMgY3VzdG9taXphdGlvbnMsIExvY2F0b3IgbG9jYXRvcikgewogICAgICAgICBzdXBlcihuYW1lLCB0eXBlLmlzQ29sbGVjdGlvbigpLCBzb3VyY2UsIGN1c3RvbWl6YXRpb25zLCBsb2NhdG9yKTsKICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKworICAgICAgICBpZihuZWVkc0V4cGxpY2l0VHlwZU5hbWUodHlwZSx0eXBlTmFtZSkpCisgICAgICAgICAgICBzY2hlbWFUeXBlID0gdHlwZU5hbWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNjaGVtYVR5cGUgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRTY2hlbWFUeXBlKCkgeworICAgICAgICByZXR1cm4gc2NoZW1hVHlwZTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgSUQgaWQoKSB7CkBAIC01OSw3ICs4MCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIENOb25FbGVtZW50IGdldFRhcmdldCgpIHsKLSAgICAgICAgQ05vbkVsZW1lbnQgciA9IChDTm9uRWxlbWVudCl0eXBlLmdldEluZm8oKTsKKyAgICAgICAgQ05vbkVsZW1lbnQgciA9IHR5cGUuZ2V0SW5mbygpOwogICAgICAgICBhc3NlcnQgciE9bnVsbDsKICAgICAgICAgcmV0dXJuIHI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1R5cGVJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DVHlwZUluZm8uamF2YQppbmRleCBiYTlkYzI0Li42NmExZGFjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DVHlwZUluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DVHlwZUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ2xhc3M7CkBAIC00MCwxMyArMzksOSBAQAogICoge0BsaW5rIFR5cGVJbmZvfSBhdCB0aGUgY29tcGlsZS10aW1lLgogICogRWl0aGVyIHtAbGluayBDQ2xhc3NJbmZvfSwge0BsaW5rIENCdWlsdGluTGVhZkluZm99LCBvciB7QGxpbmsgQ0VsZW1lbnRJbmZvfS4KICAqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGltcGxlbWVudHMge0BsaW5rIFR5cGVVc2V9IHNvIHRoYXQgYSB7QGxpbmsgQ1R5cGVJbmZvfQotICogaW5zdGFuY2UgY2FuIGJlIHVzZWQgYXMgYSB7QGxpbmsgVHlwZVVzZX0gaW5zdGFuY2UuCi0gKgogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQogICovCi1wdWJsaWMgaW50ZXJmYWNlIENUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvPE5UeXBlLE5DbGFzcz4sIFR5cGVVc2UsIENDdXN0b21pemFibGUgeworcHVibGljIGludGVyZmFjZSBDVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbzxOVHlwZSxOQ2xhc3M+LCBDQ3VzdG9taXphYmxlIHsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKQ2xhc3N9IHRoYXQgcmVwcmVzZW50cyB0aGUgY2xhc3MgYmVpbmcgYm91bmQsCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DVHlwZVJlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1R5cGVSZWYuamF2YQppbmRleCBhOWU3YzY2Li5hNGUxODNmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DVHlwZVJlZi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NUeXBlUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7CkBAIC0zMCwxMCArMjksMTMgQEAKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLm5hdi5OQ2xhc3M7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwubmF2Lk5UeXBlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuQkdNQnVpbGRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuUHJvcGVydHlJbmZvOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5UeXBlUmVmOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5SdW50aW1lVXRpbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhtbFN0cmluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRWxlbWVudERlY2w7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiAKIC8qKgogICoge0BsaW5rIFR5cGVSZWZ9IGZvciBYSkMuCkBAIC01MywxNSArNTUsMzQgQEAKIAogICAgIHByaXZhdGUgZmluYWwgUU5hbWUgZWxlbWVudE5hbWU7CiAKKyAgICAvKioKKyAgICAgKiBYTUwgU2NoZW1hIHR5cGUgbmFtZSBvZiB7QGxpbmsgI3R5cGV9LCBpZiBhdmFpbGFibGUuCisgICAgICovCisgICAgLypwYWNrYWdlKi8gZmluYWwgQE51bGxhYmxlIFFOYW1lIHR5cGVOYW1lOworCiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG5pbGxhYmxlOwogICAgIHB1YmxpYyBmaW5hbCBYbWxTdHJpbmcgZGVmYXVsdFZhbHVlOwogCi0gICAgcHVibGljIENUeXBlUmVmKENOb25FbGVtZW50IHR5cGUsIFFOYW1lIGVsZW1lbnROYW1lLCBib29sZWFuIG5pbGxhYmxlLCBYbWxTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgcHVibGljIENUeXBlUmVmKENOb25FbGVtZW50IHR5cGUsIFhTRWxlbWVudERlY2wgZGVjbCkgeworICAgICAgICB0aGlzKHR5cGUsIEJHTUJ1aWxkZXIuZ2V0TmFtZShkZWNsKSxnZXRTaW1wbGVUeXBlTmFtZShkZWNsKSwgZGVjbC5pc05pbGxhYmxlKCksIGRlY2wuZ2V0RGVmYXVsdFZhbHVlKCkgKTsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0U2ltcGxlVHlwZU5hbWUoWFNFbGVtZW50RGVjbCBkZWNsKSB7CisgICAgICAgIGlmKGRlY2w9PW51bGwpICByZXR1cm4gbnVsbDsKKyAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBudWxsOworICAgICAgICBpZihkZWNsLmdldFR5cGUoKS5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgICAgIHR5cGVOYW1lID0gQkdNQnVpbGRlci5nZXROYW1lKGRlY2wuZ2V0VHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIHR5cGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDVHlwZVJlZihDTm9uRWxlbWVudCB0eXBlLCBRTmFtZSBlbGVtZW50TmFtZSwgUU5hbWUgdHlwZU5hbWUsIGJvb2xlYW4gbmlsbGFibGUsIFhtbFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgYXNzZXJ0IHR5cGUhPW51bGw7CiAgICAgICAgIGFzc2VydCBlbGVtZW50TmFtZSE9bnVsbDsKIAogICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7CisgICAgICAgIHRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKICAgICAgICAgdGhpcy5uaWxsYWJsZSA9IG5pbGxhYmxlOwogICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DVmFsdWVQcm9wZXJ0eUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NWYWx1ZVByb3BlcnR5SW5mby5qYXZhCmluZGV4IDMxNjIyNWQuLjEwNWNlNjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NWYWx1ZVByb3BlcnR5SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NWYWx1ZVByb3BlcnR5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDkgKzIyLDEwIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwubmF2Lk5DbGFzczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5uYXYuTlR5cGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLlByb3BlcnR5S2luZDsKQEAgLTM5LDggKzQwLDggQEAKICAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENWYWx1ZVByb3BlcnR5SW5mbyBleHRlbmRzIENTaW5nbGVUeXBlUHJvcGVydHlJbmZvIGltcGxlbWVudHMgVmFsdWVQcm9wZXJ0eUluZm88TlR5cGUsTkNsYXNzPiB7Ci0gICAgcHVibGljIENWYWx1ZVByb3BlcnR5SW5mbyhTdHJpbmcgbmFtZSwgWFNDb21wb25lbnQgc291cmNlLCBDQ3VzdG9taXphdGlvbnMgY3VzdG9taXphdGlvbnMsIExvY2F0b3IgbG9jYXRvciwgVHlwZVVzZSB0eXBlKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIHR5cGUsIHNvdXJjZSwgY3VzdG9taXphdGlvbnMsIGxvY2F0b3IpOworICAgIHB1YmxpYyBDVmFsdWVQcm9wZXJ0eUluZm8oU3RyaW5nIG5hbWUsIFhTQ29tcG9uZW50IHNvdXJjZSwgQ0N1c3RvbWl6YXRpb25zIGN1c3RvbWl6YXRpb25zLCBMb2NhdG9yIGxvY2F0b3IsIFR5cGVVc2UgdHlwZSwgUU5hbWUgdHlwZU5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgdHlwZSwgdHlwZU5hbWUsIHNvdXJjZSwgY3VzdG9taXphdGlvbnMsIGxvY2F0b3IpOwogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBQcm9wZXJ0eUtpbmQga2luZCgpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NXaWxkY2FyZFR5cGVJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DV2lsZGNhcmRUeXBlSW5mby5qYXZhCmluZGV4IDc5Mzc5N2YuLmY1Y2JmNGIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NXaWxkY2FyZFR5cGVJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ1dpbGRjYXJkVHlwZUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NsYXNzTmFtZUFsbG9jYXRvcldyYXBwZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NsYXNzTmFtZUFsbG9jYXRvcldyYXBwZXIuamF2YQppbmRleCA0ZmM2OTM2Li5iZjcxODhhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9DbGFzc05hbWVBbGxvY2F0b3JXcmFwcGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ2xhc3NOYW1lQWxsb2NhdG9yV3JhcHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpQYWNrYWdlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ29uc3RydWN0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL0NvbnN0cnVjdG9yLmphdmEKaW5kZXggMWIxMzlhMC4uYTE3NTJkMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvQ29uc3RydWN0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9Db25zdHJ1Y3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9Nb2RlbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvTW9kZWwuamF2YQppbmRleCBmOWQzMDYyLi5kNTNkNzk3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9Nb2RlbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL01vZGVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNTksOCArNTgsMTEgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuVHlwZUluZm9TZXQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5uYXYuTmF2aWdhdG9yOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIudXRpbC5GbGF0dGVuSXRlcmF0b3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbXBvbmVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTU2NoZW1hU2V0OwogCiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiBpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5Mb2NhdG9ySW1wbDsKIAogLyoqCkBAIC03Myw3ICs3NSw3IEBACiAgKgogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9kZWwgaW1wbGVtZW50cyBUeXBlSW5mb1NldDxOVHlwZSxOQ2xhc3MsVm9pZCxWb2lkPiB7CitwdWJsaWMgZmluYWwgY2xhc3MgTW9kZWwgaW1wbGVtZW50cyBUeXBlSW5mb1NldDxOVHlwZSxOQ2xhc3MsVm9pZCxWb2lkPiwgQ0N1c3RvbWl6YWJsZSB7CiAKICAgICAvKioKICAgICAgKiBHZW5lcmF0ZWQgYmVhbnMuCkBAIC0xMjUsMTEgKzEyNywyNCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBwYWNrYWdlTGV2ZWxBbm5vdGF0aW9ucyA9IHRydWU7CiAKICAgICAvKioKKyAgICAgKiBJZiB0aGlzIG1vZGVsIHdhcyBidWlsdCBmcm9tIFhNTCBTY2hlbWEsIHRoaXMgZmllbGQKKyAgICAgKiBzdG9yZXMgdGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSBwYXJzZSBzY2hlbWEgbW9kZWwuCisgICAgICogT3RoZXJ3aXNlIG51bGwuCisgICAgICoKKyAgICAgKiBAc2luZSAyLjEuMQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBYU1NjaGVtYVNldCBzY2hlbWFDb21wb25lbnQ7CisKKyAgICBwcml2YXRlIENDdXN0b21pemF0aW9ucyBnbG9hYmxDdXN0b21pemF0aW9ucyA9IG5ldyBDQ3VzdG9taXphdGlvbnMoKTsKKworICAgIC8qKgogICAgICAqIEBwYXJhbSBuYwogICAgICAqICAgICAgVXN1YWxseSB0aGlzIHNob3VsZCBiZSBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgd2UgZG8gYWxsb3cgdGhpcyBwYXJhbWV0ZXIKICAgICAgKiAgICAgIHRvIGJlIGluaXRpYWxseSBudWxsLCBhbmQgdGhlbiBzZXQgbGF0ZXIuCisgICAgICogQHBhcmFtIHNjaGVtYUNvbXBvbmVudAorICAgICAqICAgICAgVGhlIHNvdXJjZSBzY2hlbWEgbW9kZWwsIGlmIHRoaXMgaXMgYnVpbHQgZnJvbSBYU0QuCiAgICAgICovCi0gICAgcHVibGljIE1vZGVsKCBPcHRpb25zIG9wdHMsIEpDb2RlTW9kZWwgY20sIE5hbWVDb252ZXJ0ZXIgbmMsIENsYXNzTmFtZUFsbG9jYXRvciBhbGxvY2F0b3IgKSB7CisgICAgcHVibGljIE1vZGVsKCBPcHRpb25zIG9wdHMsIEpDb2RlTW9kZWwgY20sIE5hbWVDb252ZXJ0ZXIgbmMsIENsYXNzTmFtZUFsbG9jYXRvciBhbGxvY2F0b3IsIFhTU2NoZW1hU2V0IHNjaGVtYUNvbXBvbmVudCApIHsKICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0czsKICAgICAgICAgdGhpcy5jb2RlTW9kZWwgPSBjbTsKICAgICAgICAgdGhpcy5uYW1lQ29udmVydGVyID0gbmM7CkBAIC0xMzgsNyArMTUzLDExIEBACiAKICAgICAgICAgZWxlbWVudE1hcHBpbmdzLnB1dChudWxsLG5ldyBIYXNoTWFwPFFOYW1lLENFbGVtZW50SW5mbz4oKSk7CiAKKyAgICAgICAgaWYob3B0cy5hdXRvbWF0aWNOYW1lQ29uZmxpY3RSZXNvbHV0aW9uKQorICAgICAgICAgICAgYWxsb2NhdG9yID0gbmV3IEF1dG9DbGFzc05hbWVBbGxvY2F0b3IoYWxsb2NhdG9yKTsKICAgICAgICAgdGhpcy5hbGxvY2F0b3IgPSBuZXcgQ2xhc3NOYW1lQWxsb2NhdG9yV3JhcHBlcihhbGxvY2F0b3IpOworICAgICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudCA9IHNjaGVtYUNvbXBvbmVudDsKKyAgICAgICAgdGhpcy5nbG9hYmxDdXN0b21pemF0aW9ucy5zZXRQYXJlbnQodGhpcyx0aGlzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXROYW1lQ29udmVydGVyKE5hbWVDb252ZXJ0ZXIgbmFtZUNvbnZlcnRlcikgewpAQCAtMjU0LDkgKzI3MywxMyBAQAogCiAgICAgICAgIE91dGxpbmUgbyA9IEJlYW5HZW5lcmF0b3IuZ2VuZXJhdGUodGhpcywgZWhmKTsKIAotICAgICAgICAvLyBydW4gZXh0ZW5zaW9ucwotICAgICAgICBmb3IoIFBsdWdpbiBtYSA6IG9wdC5hY3RpdmVQbHVnaW5zICkKLSAgICAgICAgICAgIG1hLnJ1bihvLG9wdCxlaGYpOworICAgICAgICB0cnkgey8vIHJ1biBleHRlbnNpb25zCisgICAgICAgICAgICBmb3IoIFBsdWdpbiBtYSA6IG9wdC5hY3RpdmVQbHVnaW5zICkKKyAgICAgICAgICAgICAgICBtYS5ydW4obyxvcHQsZWhmKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGZhdGFsIGVycm9yLiBlcnJvciBzaG91bGQgaGF2ZSBiZWVuIHJlcG9ydGVkCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIGNoZWNrIGZvciB1bnVzZWQgcGx1Zy1pbiBjdXN0b21pemF0aW9ucy4KICAgICAgICAgLy8gdGhlc2UgY2FuIGJlIG9ubHkgY2hlY2tlZCBhZnRlciB0aGUgcGx1Zy1pbnMgcnVuLCBzbyBpdCdzIGhlcmUuCkBAIC0zNzgsMTIgKzQwMSw0MiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBBbHdheXMgcmV0dXJuIG51bGwuIFBlcmhhcHMgeW91IGFyZSBpbnRlcmVzdGVkIGluIHtAbGluayAjc2NoZW1hQ29tcG9uZW50fT8KKyAgICAgKi8KKyAgICBwdWJsaWMgWFNDb21wb25lbnQgZ2V0U2NoZW1hQ29tcG9uZW50KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgTm8gbGluZSBudW1iZXIgYXZhaWxhYmxlIGZvciB0aGUgInJvb3QiIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdG9yKCkgeworICAgICAgICBMb2NhdG9ySW1wbCByID0gbmV3IExvY2F0b3JJbXBsKCk7CisgICAgICAgIHIuc2V0TGluZU51bWJlcigtMSk7CisgICAgICAgIHIuc2V0Q29sdW1uTnVtYmVyKC0xKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZ2xvYmFsIGN1c3RvbWl6YXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBDQ3VzdG9taXphdGlvbnMgZ2V0Q3VzdG9taXphdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBnbG9hYmxDdXN0b21pemF0aW9uczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOb3QgaW1wbGVtZW50ZWQgaW4gdGhlIGNvbXBpbGUtdGltZSBtb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYbWxOcyhTdHJpbmcgbmFtZXNwYWNlVXJpKSB7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFNjaGVtYUxvY2F0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorCiAgICAgcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoU3RyaW5nIG5zVXJpKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL011bHRpcGxpY2l0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvTXVsdGlwbGljaXR5LmphdmEKaW5kZXggNGNkYmQ0Yi4uZjEwNjg4MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvTXVsdGlwbGljaXR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvTXVsdGlwbGljaXR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL1BvcHVsYXRhYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9Qb3B1bGF0YWJsZS5qYXZhCmluZGV4IDE2YTM1NzIuLjYyYjhhMTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL1BvcHVsYXRhYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvUG9wdWxhdGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWw7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lLk91dGxpbmU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9TeW1ib2xTcGFjZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvU3ltYm9sU3BhY2UuamF2YQppbmRleCA0MGY0MWMyLi5iNWViN2Y4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9TeW1ib2xTcGFjZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL1N5bWJvbFNwYWNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkNvZGVNb2RlbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL1R5cGVVc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL1R5cGVVc2UuamF2YQppbmRleCA5ZmFlNGFjLi5mYTIyNGQ0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9UeXBlVXNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvVHlwZVVzZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEyICsyMiwxMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5NaW1lVHlwZTsKIAotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDb2RlTW9kZWw7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkV4cHJlc3Npb247CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwubmF2Lk5UeXBlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmUuT3V0bGluZTsKQEAgLTU5LDcgKzU3LDcgQEAKICAgICAvKioKICAgICAgKiBJbmRpdmlkdWFsIGl0ZW0gdHlwZS4KICAgICAgKi8KLSAgICBDVHlwZUluZm8gZ2V0SW5mbygpOworICAgIENOb25FbGVtZW50IGdldEluZm8oKTsKIAogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIHJlZmVyZW5jZWQgdHlwZSAoaW5kaXZpZHVhbCBpdGVtIHR5cGUgaW4gY2FzZSBvZiBjb2xsZWN0aW9uKQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvVHlwZVVzZUZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL1R5cGVVc2VGYWN0b3J5LmphdmEKaW5kZXggNzJiMWMwMi4uNGY0MTRiYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvVHlwZVVzZUZhY3RvcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9UeXBlVXNlRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbDsKIAogaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uTWltZVR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9UeXBlVXNlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvVHlwZVVzZUltcGwuamF2YQppbmRleCA2ZTk1NjQ0Li45YjAzNGIzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9UeXBlVXNlSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL1R5cGVVc2VJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsOwogCiBpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5NaW1lVHlwZTsKQEAgLTQzLDE0ICs0MiwxNCBAQAogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQogICovCiBmaW5hbCBjbGFzcyBUeXBlVXNlSW1wbCBpbXBsZW1lbnRzIFR5cGVVc2UgewotICAgIHByaXZhdGUgZmluYWwgQ1R5cGVJbmZvIGNvcmVUeXBlOworICAgIHByaXZhdGUgZmluYWwgQ05vbkVsZW1lbnQgY29yZVR5cGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbGxlY3Rpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBDQWRhcHRlciBhZGFwdGVyOwogICAgIHByaXZhdGUgZmluYWwgSUQgaWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBNaW1lVHlwZSBleHBlY3RlZE1pbWVUeXBlOwogCiAKLSAgICBwdWJsaWMgVHlwZVVzZUltcGwoQ1R5cGVJbmZvIGl0ZW1UeXBlLCBib29sZWFuIGNvbGxlY3Rpb24sIElEIGlkLCBNaW1lVHlwZSBleHBlY3RlZE1pbWVUeXBlLCBDQWRhcHRlciBhZGFwdGVyKSB7CisgICAgcHVibGljIFR5cGVVc2VJbXBsKENOb25FbGVtZW50IGl0ZW1UeXBlLCBib29sZWFuIGNvbGxlY3Rpb24sIElEIGlkLCBNaW1lVHlwZSBleHBlY3RlZE1pbWVUeXBlLCBDQWRhcHRlciBhZGFwdGVyKSB7CiAgICAgICAgIHRoaXMuY29yZVR5cGUgPSBpdGVtVHlwZTsKICAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKICAgICAgICAgdGhpcy5pZCA9IGlkOwpAQCAtNjIsNyArNjEsNyBAQAogICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKICAgICB9CiAKLSAgICBwdWJsaWMgQ1R5cGVJbmZvIGdldEluZm8oKSB7CisgICAgcHVibGljIENOb25FbGVtZW50IGdldEluZm8oKSB7CiAgICAgICAgIHJldHVybiBjb3JlVHlwZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9FYWdlck5DbGFzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L0VhZ2VyTkNsYXNzLmphdmEKaW5kZXggMDYwM2Y0ZS4uOGNjZGJhNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L0VhZ2VyTkNsYXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L0VhZ2VyTkNsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLm5hdjsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L0VhZ2VyTlR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9FYWdlck5UeXBlLmphdmEKaW5kZXggMmFkMzVlYS4uNDBmNWFjMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L0VhZ2VyTlR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9uYXYvRWFnZXJOVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5uYXY7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L05DbGFzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L05DbGFzcy5qYXZhCmluZGV4IDMwY2ZmZjYuLmU4MDc2Y2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OQ2xhc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9uYXYvTkNsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLm5hdjsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OQ2xhc3NCeUpDbGFzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L05DbGFzc0J5SkNsYXNzLmphdmEKaW5kZXggNjVjYjk1MS4uODhmNDFlNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L05DbGFzc0J5SkNsYXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L05DbGFzc0J5SkNsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLm5hdjsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkpDbGFzczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OUGFyYW1ldGVyaXplZFR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OUGFyYW1ldGVyaXplZFR5cGUuamF2YQppbmRleCAxYmE4NzVjLi43OThiOWE0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9uYXYvTlBhcmFtZXRlcml6ZWRUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L05QYXJhbWV0ZXJpemVkVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5uYXY7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ2xhc3M7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9uYXYvTlR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OVHlwZS5qYXZhCmluZGV4IDA5NWQyNDIuLjhmNWQ0NTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5uYXY7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OYXZpZ2F0b3JJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9uYXYvTmF2aWdhdG9ySW1wbC5qYXZhCmluZGV4IGI5NjhiN2QuLjIzNjFkMTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9OYXZpZ2F0b3JJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L05hdmlnYXRvckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwubmF2OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKQEAgLTMwOCw3ICszMDcsNyBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRpbmcoVm9pZCBtZXRob2QpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRpbmcoVm9pZCBtZXRob2QsTkNsYXNzIGNsYXp6KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIApAQCAtMzE5LDQgKzMxOCw4IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoVm9pZCBmKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5uZXJDbGFzcyhOQ2xhc3MgY2xhenopIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL25hdi9wYWNrYWdlLmh0bWwKaW5kZXggODgxMmU4ZS4uZmZmN2NjNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvbmF2L3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9tb2RlbC9uYXYvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPjxib2R5PgogICA8cD4KICAgICBDb21waWxlLXRpbWUgcmVwcmVzZW50YXRpb24gb2YgSmF2YSB0eXBlIHN5c3RlbS4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL21vZGVsL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggODdiZTAxOC4uYmE1YTE3YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlfSBwYWNrYWdlIGZvciBYSkMuCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9Bc3BlY3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvQXNwZWN0LmphdmEKaW5kZXggYTI1N2EzYS4uNTMzY2IwYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9Bc3BlY3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL0FzcGVjdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lOwogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuZ2VuZXJhdG9yLmJlYW4uSW1wbFN0cnVjdHVyZVN0cmF0ZWd5OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9DbGFzc091dGxpbmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvQ2xhc3NPdXRsaW5lLmphdmEKaW5kZXggYWM5M2ViZi4uNDhkYWZiNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9DbGFzc091dGxpbmUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL0NsYXNzT3V0bGluZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyoKICAqIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBsaWNlbnNlIHRlcm1zLgogICovCkBAIC0zNCw2ICszMyw3IEBACiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkRlZmluZWRDbGFzczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNQcm9wZXJ0eUluZm87CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKIAogLyoqCiAgKiBPdXRsaW5lIG9iamVjdCB0aGF0IHByb3ZpZGVzIHBlci17QGxpbmsgQ0NsYXNzSW5mb30gaW5mb3JtYXRpb24KQEAgLTQ4LDE5ICs0OCwxOSBAQAogICAgIC8qKgogICAgICAqIEEge0BsaW5rIE91dGxpbmV9IHRoYXQgZW5jbG9zZXMgYWxsIHRoZSBjbGFzcyBvdXRsaW5lcy4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgT3V0bGluZSBwYXJlbnQoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgQE5vdE51bGwgT3V0bGluZSBwYXJlbnQoKTsKIAogICAgIC8qKgogICAgICAqIHtAbGluayBQYWNrYWdlT3V0bGluZX0gdGhhdCBjb250YWlucyB0aGlzIGNsYXNzLgogICAgICAqLwotICAgIHB1YmxpYyBQYWNrYWdlT3V0bGluZSBfcGFja2FnZSgpIHsKKyAgICBwdWJsaWMgQE5vdE51bGwgUGFja2FnZU91dGxpbmUgX3BhY2thZ2UoKSB7CiAgICAgICAgIHJldHVybiBwYXJlbnQoKS5nZXRQYWNrYWdlQ29udGV4dChyZWYuX3BhY2thZ2UoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyB7QGxpbmsgQ2xhc3NPdXRsaW5lfSBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHtAbGluayBDQ2xhc3NJbmZvfS4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQ0NsYXNzSW5mbyB0YXJnZXQ7CisgICAgcHVibGljIGZpbmFsIEBOb3ROdWxsIENDbGFzc0luZm8gdGFyZ2V0OwogCiAgICAgLyoqCiAgICAgICogVGhlIGV4cG9zZWQgYXNwZWN0IG9mIHRoZSBhIGJlYW4uCkBAIC03MCwxMyArNzAsMTMgQEAKICAgICAgKiBVc3VhbGx5IHRoaXMgaXMgdGhlIHB1YmxpYyBjb250ZW50IGludGVyZmFjZSwgYnV0CiAgICAgICogaXQgY291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGltcGxDbGFzcy4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSkRlZmluZWRDbGFzcyByZWY7CisgICAgcHVibGljIGZpbmFsIEBOb3ROdWxsIEpEZWZpbmVkQ2xhc3MgcmVmOwogCiAgICAgLyoqCiAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIGFzcGVjdCBvZiBhIGJlYW4uCiAgICAgICogVGhlIGFjdHVhbCBwbGFjZSB3aGVyZSBmaWVsZHMvbWV0aG9kcyBzaG91bGQgYmUgZ2VuZXJhdGVkIGludG8uCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIEpEZWZpbmVkQ2xhc3MgaW1wbENsYXNzOworICAgIHB1YmxpYyBmaW5hbCBATm90TnVsbCBKRGVmaW5lZENsYXNzIGltcGxDbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNoYWxsIGJlIHVzZWQgZm9yIHJlZmVyZW5jZS4KQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgKiA8cD4KICAgICAgKiBUaGlzIGlzIHRoZSB0eXBlIHRoYXQgbmVlZHMgdG8gYmUgdXNlZCBmb3IgZ2VuZXJhdGluZyBmaWVsZHMuCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIEpDbGFzcyBpbXBsUmVmOworICAgIHB1YmxpYyBmaW5hbCBATm90TnVsbCBKQ2xhc3MgaW1wbFJlZjsKIAogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvRWxlbWVudE91dGxpbmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvRWxlbWVudE91dGxpbmUuamF2YQppbmRleCBjMmM5NWQzLi5jMGU0ODlmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL0VsZW1lbnRPdXRsaW5lLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9FbGVtZW50T3V0bGluZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lOwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkRlZmluZWRDbGFzczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvRW51bUNvbnN0YW50T3V0bGluZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9FbnVtQ29uc3RhbnRPdXRsaW5lLmphdmEKaW5kZXggYmRjNTJjNC4uNGJjM2RmOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9FbnVtQ29uc3RhbnRPdXRsaW5lLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9FbnVtQ29uc3RhbnRPdXRsaW5lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmU7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KRW51bUNvbnN0YW50OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9FbnVtT3V0bGluZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9FbnVtT3V0bGluZS5qYXZhCmluZGV4IDQyMjQyOTQuLjc2ZTAyMjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvRW51bU91dGxpbmUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL0VudW1PdXRsaW5lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm91dGxpbmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzAsNiArMjksNyBAQAogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkRlZmluZWRDbGFzczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DRW51bUxlYWZJbmZvOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CiAKIC8qKgogICogT3V0bGluZSBvYmplY3QgdGhhdCBwcm92aWRlcyBwZXIte0BsaW5rIENFbnVtTGVhZkluZm99IGluZm9ybWF0aW9uCkBAIC01Niw2ICs1NiwxOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBMaXN0PEVudW1Db25zdGFudE91dGxpbmU+IGNvbnN0YW50cyA9IG5ldyBBcnJheUxpc3Q8RW51bUNvbnN0YW50T3V0bGluZT4oKTsKIAorICAgIC8qKgorICAgICAqIHtAbGluayBQYWNrYWdlT3V0bGluZX0gdGhhdCBjb250YWlucyB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbAorICAgIFBhY2thZ2VPdXRsaW5lIF9wYWNrYWdlKCkgeworICAgICAgICByZXR1cm4gcGFyZW50KCkuZ2V0UGFja2FnZUNvbnRleHQoY2xhenouX3BhY2thZ2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB7QGxpbmsgT3V0bGluZX0gdGhhdCBlbmNsb3NlcyBhbGwgdGhlIGNsYXNzIG91dGxpbmVzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBPdXRsaW5lIHBhcmVudCgpOworCiAgICAgcHJvdGVjdGVkIEVudW1PdXRsaW5lKENFbnVtTGVhZkluZm8gdGFyZ2V0LCBKRGVmaW5lZENsYXNzIGNsYXp6KSB7CiAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgICB0aGlzLmNsYXp6ID0gY2xheno7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL0ZpZWxkQWNjZXNzb3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvRmllbGRBY2Nlc3Nvci5qYXZhCmluZGV4IGRiMjQwNDkuLjc2NTI4ZTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvRmllbGRBY2Nlc3Nvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvRmllbGRBY2Nlc3Nvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lOwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkJsb2NrOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9GaWVsZE91dGxpbmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvRmllbGRPdXRsaW5lLmphdmEKaW5kZXggZDMyNmQ5Ni4uOGYyZGI2ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9GaWVsZE91dGxpbmUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL0ZpZWxkT3V0bGluZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lOwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkV4cHJlc3Npb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL091dGxpbmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvT3V0bGluZS5qYXZhCmluZGV4IDcxNDViYjYuLmVlZGEwYWIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvT3V0bGluZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvT3V0bGluZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5vdXRsaW5lOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL1BhY2thZ2VPdXRsaW5lLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL1BhY2thZ2VPdXRsaW5lLmphdmEKaW5kZXggMWRmZDRkMy4uNzhhZTZkNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvb3V0bGluZS9QYWNrYWdlT3V0bGluZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvUGFja2FnZU91dGxpbmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMub3V0bGluZTsKIAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9vdXRsaW5lL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvcGFja2FnZS5odG1sCmluZGV4IDBmMjBlMzMuLmMwZGY2NzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL291dGxpbmUvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPjxib2R5PgogICBQcm92aWRlcyB0aGUgb3V0bGluZSBvZiB0aGUgZ2VuZXJhdGVkIEphdmEgc291cmNlIGNvZGUgc28gdGhhdAogICBhZGRpdGlvbmFsIHByb2Nlc3NpbmdzIChzdWNoIGFzIGFkZGluZyBtb3JlIGFubm90YXRpb25zKSBjYW4gYmUKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggMDRkYmQ4Yi4uODgxMjk4OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcGFja2FnZS1pbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcGFja2FnZS1pbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKioKICAqIDxoMT5TY2hlbWEgdG8gSmF2YSBjb21waWxlcjwvaDE+LgogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9BYnN0cmFjdEV4dGVuc2lvbkJpbmRpbmdDaGVja2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvQWJzdHJhY3RFeHRlbnNpb25CaW5kaW5nQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDRhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvQWJzdHJhY3RFeHRlbnNpb25CaW5kaW5nQ2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsLlN1YnRyZWVDdXR0ZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuT3B0aW9uczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW47CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi51dGlsLkVkaXREaXN0YW5jZTsKKworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTmFtZXNwYWNlU3VwcG9ydDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogQ29tbW9uIGNvZGUgYmV0d2VlbiB7QGNvZGUgRFRERXh0ZW5zaW9uQmluZGluZ0NoZWNrZXJ9IGFuZCB7QGxpbmsgRXh0ZW5zaW9uQmluZGluZ0NoZWNrZXJ9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXh0ZW5zaW9uQmluZGluZ0NoZWNrZXIgZXh0ZW5kcyBTdWJ0cmVlQ3V0dGVyIHsKKyAgICAvKiogUmVtZW1iZXJzIGluLXNjb3BlIG5hbWVzcGFjZSBiaW5kaW5ncy4gKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgTmFtZXNwYWNlU3VwcG9ydCBuc1N1cHBvcnQgPSBuZXcgTmFtZXNwYWNlU3VwcG9ydCgpOworCisgICAgLyoqCisgICAgICogU2V0IG9mIG5hbWVzcGFjZSBVUklzIHRoYXQgZGVzaWduYXRlcyBlbmFibGVkIGV4dGVuc2lvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IGVuYWJsZWRFeHRlbnNpb25zID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiByZWNvZ25pemFibGVFeHRlbnNpb25zID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3I7CisKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2UgVVJJIG9mIHRoZSB0YXJnZXQgc2NoZW1hIGxhbmd1YWdlLiBFbGVtZW50cyBpbiB0aGlzCisgICAgICogbmFtZXNwYWNlIGFyZSBhbHdheXMgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHNjaGVtYUxhbmd1YWdlOworCisgICAgLyoqCisgICAgICogSWYgZmFsc2UsIGFueSB1c2Ugb2YgZXh0ZW5zaW9ucyBpcyByZXBvcnRlZCBhcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBhbGxvd0V4dGVuc2lvbnM7CisKKyAgICBwcml2YXRlIGZpbmFsIE9wdGlvbnMgb3B0aW9uczsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBoYW5kbGVyCisgICAgICogICAgICBUaGlzIGVycm9yIGhhbmRsZXIgd2lsbCByZWNlaXZlIGRldGVjdGVkIGVycm9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RFeHRlbnNpb25CaW5kaW5nQ2hlY2tlciggU3RyaW5nIHNjaGVtYUxhbmd1YWdlLCBPcHRpb25zIG9wdGlvbnMsIEVycm9ySGFuZGxlciBoYW5kbGVyICkgeworICAgICAgICB0aGlzLnNjaGVtYUxhbmd1YWdlID0gc2NoZW1hTGFuZ3VhZ2U7CisgICAgICAgIHRoaXMuYWxsb3dFeHRlbnNpb25zID0gb3B0aW9ucy5jb21wYXRpYmlsaXR5TW9kZSE9T3B0aW9ucy5TVFJJQ1Q7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHNldEVycm9ySGFuZGxlcihoYW5kbGVyKTsKKworICAgICAgICBmb3IgKFBsdWdpbiBwbHVnaW4gOiBvcHRpb25zLmdldEFsbFBsdWdpbnMoKSkKKyAgICAgICAgICAgIHJlY29nbml6YWJsZUV4dGVuc2lvbnMuYWRkQWxsKHBsdWdpbi5nZXRDdXN0b21pemF0aW9uVVJJcygpKTsKKyAgICAgICAgcmVjb2duaXphYmxlRXh0ZW5zaW9ucy5hZGQoQ29uc3QuWEpDX0VYVEVOU0lPTl9VUkkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBVUkkgaXMgaW5kZWVkIGEgdmFsaWQgZXh0ZW5zaW9uIG5hbWVzcGFjZSBVUkksCisgICAgICogYW5kIGlmIHNvIGVuYWJsZSBpdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIGFsbCB0aGUgZXJyb3IgaGFuZGxpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tBbmRFbmFibGUoU3RyaW5nIHVyaSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCAhaXNSZWNvZ25pemFibGVFeHRlbnNpb24odXJpKSApIHsKKyAgICAgICAgICAgIFN0cmluZyBuZWFyZXN0ID0gRWRpdERpc3RhbmNlLmZpbmROZWFyZXN0KHVyaSwgcmVjb2duaXphYmxlRXh0ZW5zaW9ucyk7CisgICAgICAgICAgICAvLyBub3QgdGhlIG5hbWVzcGFjZSBVUkkgd2Uga25vdyBvZgorICAgICAgICAgICAgZXJyb3IoIE1lc3NhZ2VzLkVSUl9VTlNVUFBPUlRFRF9FWFRFTlNJT04uZm9ybWF0KHVyaSxuZWFyZXN0KSApOworICAgICAgICB9IGVsc2UKKyAgICAgICAgaWYoICFpc1N1cHBvcnRlZEV4dGVuc2lvbih1cmkpICkgeworICAgICAgICAgICAgLy8gcmVjb2duaXphYmxlIGJ1dCBub3Qgbm90IHN1cHBvcnRlZCwgbWVhbmluZworICAgICAgICAgICAgLy8gdGhlIHBsdWctaW4gaXNuJ3QgZW5hYmxlZAorCisgICAgICAgICAgICAvLyBsb29rIGZvciBwbHVnLWluIHRoYXQgaGFuZGxlcyB0aGlzIFVSSQorICAgICAgICAgICAgUGx1Z2luIG93bmVyID0gbnVsbDsKKyAgICAgICAgICAgIGZvciggUGx1Z2luIHAgOiBvcHRpb25zLmdldEFsbFBsdWdpbnMoKSApIHsKKyAgICAgICAgICAgICAgICBpZihwLmdldEN1c3RvbWl6YXRpb25VUklzKCkuY29udGFpbnModXJpKSkgeworICAgICAgICAgICAgICAgICAgICBvd25lciA9IHA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG93bmVyIT1udWxsKQorICAgICAgICAgICAgICAgIC8vIHdlIGtub3cgdGhlIHBsdWctaW4gdGhhdCBzdXBwb3J0cyB0aGlzIG5hbWVzcGFjZSwgYnV0IGl0J3Mgbm90IGVuYWJsZWQKKyAgICAgICAgICAgICAgICBlcnJvciggTWVzc2FnZXMuRVJSX1BMVUdJTl9OT1RfRU5BQkxFRC5mb3JtYXQob3duZXIuZ2V0T3B0aW9uTmFtZSgpLHVyaSkpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgYmUgZGVmZW5zaXZlLi4uCisgICAgICAgICAgICAgICAgZXJyb3IoIE1lc3NhZ2VzLkVSUl9VTlNVUFBPUlRFRF9FWFRFTlNJT04uZm9ybWF0KHVyaSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFzIGFuIGVycm9yIHJlY292ZXJ5IGVuYWJsZSB0aGlzIG5hbWVzcGFjZSBVUkkgYW55d2F5LgorICAgICAgICBlbmFibGVkRXh0ZW5zaW9ucy5hZGQodXJpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgdGFnIG5hbWUgYmVsb25ncyB0byBhIHBsdWdpbiBuYW1lc3BhY2Utd2lzZSwgY2hlY2sgaXRzIGxvY2FsIG5hbWUKKyAgICAgKiB0byBtYWtlIHN1cmUgaXQncyBjb3JyZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHZlcmlmeVRhZ05hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYob3B0aW9ucy5wbHVnaW5VUklzLmNvbnRhaW5zKG5hbWVzcGFjZVVSSSkpIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgYSB2YWxpZCB0YWcgbmFtZQorICAgICAgICAgICAgYm9vbGVhbiBjb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IoIFBsdWdpbiBwIDogb3B0aW9ucy5hY3RpdmVQbHVnaW5zICkgeworICAgICAgICAgICAgICAgIGlmKHAuaXNDdXN0b21pemF0aW9uVGFnTmFtZShuYW1lc3BhY2VVUkksbG9jYWxOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBjb3JyZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIWNvcnJlY3QpIHsKKyAgICAgICAgICAgICAgICBlcnJvciggTWVzc2FnZXMuRVJSX0lMTEVHQUxfQ1VTVE9NSVpBVElPTl9UQUdOQU1FLmZvcm1hdChxTmFtZSkgKTsKKyAgICAgICAgICAgICAgICBzdGFydEN1dHRpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZXNwYWNlIFVSSSBpcyBzdXBwb3J0ZWQgYXMgdGhlIGV4dGVuc2lvbgorICAgICAqIGJpbmRpbmdzLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzU3VwcG9ydGVkRXh0ZW5zaW9uKCBTdHJpbmcgbmFtZXNwYWNlVXJpICkgeworICAgICAgICByZXR1cm4gbmFtZXNwYWNlVXJpLmVxdWFscyhDb25zdC5YSkNfRVhURU5TSU9OX1VSSSkgfHwgb3B0aW9ucy5wbHVnaW5VUklzLmNvbnRhaW5zKG5hbWVzcGFjZVVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lc3BhY2UgVVJJIGNhbiBiZSBwb3RlbnRpYWxseSByZWNvZ25pemVkCisgICAgICogYnkgdGhpcyBYSkMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNSZWNvZ25pemFibGVFeHRlbnNpb24oIFN0cmluZyBuYW1lc3BhY2VVcmkgKSB7CisgICAgICAgIHJldHVybiByZWNvZ25pemFibGVFeHRlbnNpb25zLmNvbnRhaW5zKG5hbWVzcGFjZVVyaSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHN1cGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKKyAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKKworICAgICAgICBuc1N1cHBvcnQucmVzZXQoKTsKKyAgICAgICAgZW5hYmxlZEV4dGVuc2lvbnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIHVyaSk7CisgICAgICAgIG5zU3VwcG9ydC5wdXNoQ29udGV4dCgpOworICAgICAgICBuc1N1cHBvcnQuZGVjbGFyZVByZWZpeChwcmVmaXgsdXJpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdXBlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCk7CisgICAgICAgIG5zU3VwcG9ydC5wb3BDb250ZXh0KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXBvcnRzIGFuIGVycm9yIGFuZCByZXR1cm5zIHRoZSBjcmVhdGVkIFNBWFBhcnNlRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFNBWFBhcnNlRXhjZXB0aW9uIGVycm9yKCBTdHJpbmcgbXNnICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uIHNwZSA9IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbiggbXNnLCBsb2NhdG9yICk7CisgICAgICAgIGdldEVycm9ySGFuZGxlcigpLmVycm9yKHNwZSk7CisgICAgICAgIHJldHVybiBzcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0cyBhIHdhcm5pbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgd2FybmluZyggU3RyaW5nIG1zZyApIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBzcGUgPSBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIG1zZywgbG9jYXRvciApOworICAgICAgICBnZXRFcnJvckhhbmRsZXIoKS53YXJuaW5nKHNwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL0NvbnN0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvQ29uc3QuamF2YQppbmRleCBkYzBlODNmLi5lZDkzNGNmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvQ29uc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvQ29uc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9FeHRlbnNpb25CaW5kaW5nQ2hlY2tlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL0V4dGVuc2lvbkJpbmRpbmdDaGVja2VyLmphdmEKaW5kZXggMWNiYWFjNC4uNGE5ZWNjYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL0V4dGVuc2lvbkJpbmRpbmdDaGVja2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL0V4dGVuc2lvbkJpbmRpbmdDaGVja2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMjUgKzIyLDE2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuT3B0aW9uczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW47CiAKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwogaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTmFtZXNwYWNlU3VwcG9ydDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7CiAKIC8qKgogICogVGhpcyBmaWx0ZXIgY2hlY2tzIGpheGI6ZXh0ZW5zaW9uQmluZGluZ1ByZWZpeCBhbmQKQEAgLTYxLDkzICs1MiwxOCBAQAogICogdGhhdCB0aGUgUkkgcmVjb2duaXplcy4KICAqIFRvIGFkZCBuZXcgVVJJLCBtb2RpZnkgdGhlIGlzU3VwcG9ydGVkRXh0ZW5zaW9uIG1ldGhvZC4KICAqCi0KICAqIEBhdXRob3IKICAqICAgICBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbkJpbmRpbmdDaGVja2VyIGV4dGVuZHMgWE1MRmlsdGVySW1wbCB7Ci0KLSAgICAvKiogUmVtZW1iZXJzIGluLXNjb3BlIG5hbWVzcGFjZSBiaW5kaW5ncy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE5hbWVzcGFjZVN1cHBvcnQgbnNTdXBwb3J0ID0gbmV3IE5hbWVzcGFjZVN1cHBvcnQoKTsKK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHRlbnNpb25CaW5kaW5nQ2hlY2tlciBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uQmluZGluZ0NoZWNrZXIgewogCiAgICAgLyoqCiAgICAgICogTnVtYmVyIG9mIHRoZSBlbGVtZW50cyBlbmNvdW50ZXJlZC4gVXNlZCB0byBkZXRlY3QgdGhlIHJvb3QgZWxlbWVudC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBjb3VudD0wOwogCi0gICAgLyoqCi0gICAgICogU2V0IG9mIG5hbWVzcGFjZSBVUklzIHRoYXQgZGVzaWduYXRlcyBlbmFibGVkIGV4dGVuc2lvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBlbmFibGVkRXh0ZW5zaW9ucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gcmVjb2duaXphYmxlRXh0ZW5zaW9ucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgTG9jYXRvciBsb2NhdG9yOwotCi0gICAgLyoqCi0gICAgICogV2hlbiB3ZSBhcmUgcHJ1bmluZyBhIHN1YiB0cmVlLCB0aGlzIGZpZWxkIGhvbGRzIHRoZSBkZXB0aCBvZgotICAgICAqIGVsZW1lbnRzIHRoYXQgYXJlIGJlaW5nIGN1dC4gVXNlZCB0byByZXN1bWUgZXZlbnQgZm9yd2FyZGluZy4KLSAgICAgKgotICAgICAqIEFzIGxvbmcgYXMgdGhpcyB2YWx1ZSBpcyAwLCB3ZSB3aWxsIHBhc3MgdGhyb3VnaCBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGN1dERlcHRoPTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9iamVjdCB3aWxsIHJlY2VpdmUgU0FYIGV2ZW50cyB3aGlsZSBhIHN1YiB0cmVlIGlzIGJlaW5nCi0gICAgICogcHJ1bmVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRlbnRIYW5kbGVyIHN0dWIgPSBuZXcgRGVmYXVsdEhhbmRsZXIoKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgZmllbGQgcmVtZW1iZXJzIHRoZSB1c2VyLXNwZWNpZmllZCBDb250ZW50SGFuZGxlci4KLSAgICAgKiBTbyB0aGF0IHdlIGNhbiByZXN0b3JlIGl0IG9uY2UgdGhlIHN1YiB0cmVlIGlzIGNvbXBsZXRlbHkgcHJ1bmVkLgotICAgICAqLwotICAgIHByaXZhdGUgQ29udGVudEhhbmRsZXIgbmV4dDsKLQotICAgIC8qKgotICAgICAqIE5hbWVzcGFjZSBVUkkgb2YgdGhlIHRhcmdldCBzY2hlbWEgbGFuZ3VhZ2UuIEVsZW1lbnRzIGluIHRoaXMKLSAgICAgKiBuYW1lc3BhY2UgYXJlIGFsd2F5cyBhbGxvd2VkLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNjaGVtYUxhbmd1YWdlOwotCi0gICAgLyoqCi0gICAgICogSWYgZmFsc2UsIGFueSB1c2Ugb2YgZXh0ZW5zaW9ucyBpcyByZXBvcnRlZCBhcyBhbiBlcnJvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWxsb3dFeHRlbnNpb25zOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaGFuZGxlcgotICAgICAqICAgICAgVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgcmVjZWl2ZSBkZXRlY3RlZCBlcnJvcnMuCi0gICAgICovCi0gICAgcHVibGljIEV4dGVuc2lvbkJpbmRpbmdDaGVja2VyKCBTdHJpbmcgc2NoZW1hTGFuZ3VhZ2UsIE9wdGlvbnMgb3B0aW9ucywgRXJyb3JIYW5kbGVyIGhhbmRsZXIgKSB7Ci0gICAgICAgIHRoaXMuc2NoZW1hTGFuZ3VhZ2UgPSBzY2hlbWFMYW5ndWFnZTsKLSAgICAgICAgdGhpcy5hbGxvd0V4dGVuc2lvbnMgPSBvcHRpb25zLmNvbXBhdGliaWxpdHlNb2RlIT1PcHRpb25zLlNUUklDVDsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXIpOwotCi0gICAgICAgIGZvciAoUGx1Z2luIHBsdWdpbiA6IG9wdGlvbnMuZ2V0QWxsUGx1Z2lucygpKQotICAgICAgICAgICAgcmVjb2duaXphYmxlRXh0ZW5zaW9ucy5hZGRBbGwocGx1Z2luLmdldEN1c3RvbWl6YXRpb25VUklzKCkpOwotICAgICAgICByZWNvZ25pemFibGVFeHRlbnNpb25zLmFkZChDb25zdC5YSkNfRVhURU5TSU9OX1VSSSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lc3BhY2UgVVJJIGlzIHN1cHBvcnRlZCBhcyB0aGUgZXh0ZW5zaW9uCi0gICAgICogYmluZGluZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3VwcG9ydGVkRXh0ZW5zaW9uKCBTdHJpbmcgbmFtZXNwYWNlVXJpICkgewotICAgICAgICBpZihuYW1lc3BhY2VVcmkuZXF1YWxzKENvbnN0LlhKQ19FWFRFTlNJT05fVVJJKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gb3B0aW9ucy5wbHVnaW5VUklzLmNvbnRhaW5zKG5hbWVzcGFjZVVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lc3BhY2UgVVJJIGNhbiBiZSBwb3RlbnRpYWxseSByZWNvZ25pemVkCi0gICAgICogYnkgdGhpcyBYSkMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVjb2duaXphYmxlRXh0ZW5zaW9uKCBTdHJpbmcgbmFtZXNwYWNlVXJpICkgewotICAgICAgICByZXR1cm4gcmVjb2duaXphYmxlRXh0ZW5zaW9ucy5jb250YWlucyhuYW1lc3BhY2VVcmkpOworICAgIHB1YmxpYyBFeHRlbnNpb25CaW5kaW5nQ2hlY2tlcihTdHJpbmcgc2NoZW1hTGFuZ3VhZ2UsIE9wdGlvbnMgb3B0aW9ucywgRXJyb3JIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgc3VwZXIoc2NoZW1hTGFuZ3VhZ2UsIG9wdGlvbnMsIGhhbmRsZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcwLDMxICs4NiwxNSBAQAogICAgIH0KIAogCi0KICAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKLQogICAgICAgICBjb3VudD0wOwotICAgICAgICBjdXREZXB0aD0wOwotICAgICAgICBuc1N1cHBvcnQucmVzZXQoKTsKLSAgICAgICAgZW5hYmxlZEV4dGVuc2lvbnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIHVyaSk7Ci0gICAgICAgIG5zU3VwcG9ydC5wdXNoQ29udGV4dCgpOwotICAgICAgICBuc1N1cHBvcnQuZGVjbGFyZVByZWZpeChwcmVmaXgsdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBzdXBlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCk7Ci0gICAgICAgIG5zU3VwcG9ydC5wb3BDb250ZXh0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKQogICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKIAotICAgICAgICBpZiggY3V0RGVwdGg9PTAgKSB7CisgICAgICAgIGlmKCFpc0N1dHRpbmcoKSkgewogICAgICAgICAgICAgU3RyaW5nIHYgPSBhdHRzLmdldFZhbHVlKENvbnN0LkpBWEJfTlNVUkksImV4dGVuc2lvbkJpbmRpbmdQcmVmaXhlcyIpOwogICAgICAgICAgICAgaWYodiE9bnVsbCkgewogICAgICAgICAgICAgICAgIGlmKGNvdW50IT0wKQpAQCAtMjA5LDM4ICsxMDksMTEgQEAKICAgICAgICAgICAgICAgICB3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB0b2tlbnMubmV4dFRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc1N1cHBvcnQuZ2V0VVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB1cmk9PW51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB1cmk9PW51bGwgKQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWNsYXJlZCBwcmVmaXgKICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCBNZXNzYWdlcy5FUlJfVU5ERUNMQVJFRF9QUkVGSVguZm9ybWF0KHByZWZpeCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhaXNSZWNvZ25pemFibGVFeHRlbnNpb24odXJpKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRoZSBuYW1lc3BhY2UgVVJJIHdlIGtub3cgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciggTWVzc2FnZXMuRVJSX1VOU1VQUE9SVEVEX0VYVEVOU0lPTi5mb3JtYXQocHJlZml4KSApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFpc1N1cHBvcnRlZEV4dGVuc2lvbih1cmkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29nbml6YWJsZSBidXQgbm90IG5vdCBzdXBwb3J0ZWQsIG1lYW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGx1Zy1pbiBpc24ndCBlbmFibGVkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBwbHVnLWluIHRoYXQgaGFuZGxlcyB0aGlzIFVSSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbiBvd25lciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBQbHVnaW4gcCA6IG9wdGlvbnMuZ2V0QWxsUGx1Z2lucygpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwLmdldEN1c3RvbWl6YXRpb25VUklzKCkuY29udGFpbnModXJpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPSBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYob3duZXIhPW51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGtub3cgdGhlIHBsdWctaW4gdGhhdCBzdXBwb3J0cyB0aGlzIG5hbWVzcGFjZSwgYnV0IGl0J3Mgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIE1lc3NhZ2VzLkVSUl9QTFVHSU5fTk9UX0VOQUJMRUQuZm9ybWF0KG93bmVyLmdldE9wdGlvbk5hbWUoKSx1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgYmUgZGVmZW5zaXZlLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCBNZXNzYWdlcy5FUlJfVU5TVVBQT1JURURfRVhURU5TSU9OLmZvcm1hdChwcmVmaXgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhbiBlcnJvciByZWNvdmVyeSBlbmFibGUgdGhpcyBuYW1lc3BhY2UgVVJJIGFueXdheS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRFeHRlbnNpb25zLmFkZCh1cmkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQW5kRW5hYmxlKHVyaSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0yNTEsNzEgKzEyNCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAvLyBpc24ndCB0aGUgdXNlciBmb3JnZXR0aW5nIEBqYXhiOmV4dGVuc2lvbkJpbmRpbmdQcmVmaXhlcz8KICAgICAgICAgICAgICAgICAgICAgd2FybmluZyggTWVzc2FnZXMuRVJSX1NVUFBPUlRFRF9FWFRFTlNJT05fSUdOT1JFRC5mb3JtYXQobmFtZXNwYWNlVVJJKSApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdXBlci5zZXRDb250ZW50SGFuZGxlcihzdHViKTsKLSAgICAgICAgICAgICAgICBjdXREZXB0aD0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYob3B0aW9ucy5wbHVnaW5VUklzLmNvbnRhaW5zKG5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGEgdmFsaWQgdGFnIG5hbWUKLSAgICAgICAgICAgICAgICBib29sZWFuIGNvcnJlY3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IoIFBsdWdpbiBwIDogb3B0aW9ucy5hY3RpdmVQbHVnaW5zICkgewotICAgICAgICAgICAgICAgICAgICBpZihwLmlzQ3VzdG9taXphdGlvblRhZ05hbWUobmFtZXNwYWNlVVJJLGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIWNvcnJlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIE1lc3NhZ2VzLkVSUl9JTExFR0FMX0NVU1RPTUlaQVRJT05fVEFHTkFNRS5mb3JtYXQocU5hbWUpICk7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnNldENvbnRlbnRIYW5kbGVyKHN0dWIpOwotICAgICAgICAgICAgICAgICAgICBjdXREZXB0aD0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBjdXREZXB0aCsrOworICAgICAgICAgICAgICAgIHN0YXJ0Q3V0dGluZygpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdmVyaWZ5VGFnTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcU5hbWUpOworICAgICAgICB9CiAKICAgICAgICAgY291bnQrKzsKICAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0KLSAgICAgICAgaWYoIGN1dERlcHRoIT0wICkgewotICAgICAgICAgICAgY3V0RGVwdGgtLTsKLSAgICAgICAgICAgIGlmKCBjdXREZXB0aCA9PSAwICkKLSAgICAgICAgICAgICAgICAvLyBwcnVuaW5nIGNvbXBsZXRlZC4gcmVzdG9yZSB0aGUgdXNlciBoYW5kbGVyCi0gICAgICAgICAgICAgICAgc3VwZXIuc2V0Q29udGVudEhhbmRsZXIobmV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0gICAgICAgIHN1cGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKLSAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIG5leHQgPSBoYW5kbGVyOwotICAgICAgICAvLyBjaGFuZ2VzIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5IHVubGVzcyB0aGUgc3ViLXRyZWUgaXMgYmVpbmcgcHJ1bmVkCi0gICAgICAgIGlmKGdldENvbnRlbnRIYW5kbGVyKCkhPXN0dWIpCi0gICAgICAgICAgICBzdXBlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydHMgYW4gZXJyb3IgYW5kIHJldHVybnMgdGhlIGNyZWF0ZWQgU0FYUGFyc2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFNBWFBhcnNlRXhjZXB0aW9uIGVycm9yKCBTdHJpbmcgbXNnICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uIHNwZSA9IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbiggbXNnLCBsb2NhdG9yICk7Ci0gICAgICAgIGdldEVycm9ySGFuZGxlcigpLmVycm9yKHNwZSk7Ci0gICAgICAgIHJldHVybiBzcGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdhcm5pbmcoIFN0cmluZyBtc2cgKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgU0FYUGFyc2VFeGNlcHRpb24gc3BlID0gbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCBtc2csIGxvY2F0b3IgKTsKLSAgICAgICAgZ2V0RXJyb3JIYW5kbGVyKCkud2FybmluZyhzcGUpOwotICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKaW5kZXggOTc5MDdjZi4uMzNmMjhjNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDQgKzEsMjkgQEAKICMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCisjCiAjIE1lc3NhZ2UgcmVzb3VyY2UgZmlsZQogIwogCkBAIC0xNCw3ICszOSw3IEBACiAgICAgdmVuZG9yIGV4dGVuc2lvbiBiaW5kaW5ncyAoamF4YjpleHRlbnNpb25CaW5kaW5nUHJlZml4ZXMpIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgc3RyaWN0IG1vZGUuIFVzZSAtZXh0ZW5zaW9uLgogCiBFUlJfVU5TVVBQT1JURURfRVhURU5TSU9OID0gXAotCVVuc3VwcG9ydGVkIGJpbmRpbmcgbmFtZXNwYWNlICJ7MH0iCisJVW5zdXBwb3J0ZWQgYmluZGluZyBuYW1lc3BhY2UgInswfSIuIFBlcmhhcHMgeW91IG1lYW50ICJ7MX0iPwogCiBFUlJfU1VQUE9SVEVEX0VYVEVOU0lPTl9JR05PUkVEID0gXAogCUJpbmRpbmcgZGVjbGFyYXRpb24gbmFtZXNwYWNlICJ7MH0iIHdpbGwgYmUgaWdub3JlZCBiZWNhdXNlIGl0IGlzIFwKQEAgLTMwLDcgKzU1LDEwIEBACiAJTWFrZSB0aGlzIGNsYXNzIGF2YWlsYWJsZSB2aWEgdGhlIC1jbGFzc3BhdGggb3B0aW9uLgogCQogRFVQTElDQVRFX1BST1BFUlRZID0gXAotICAgIFByb3BlcnR5ICJ7MH0iIGlzIGFscmVhZHkgZGVmaW5lZC4KKyAgICBQcm9wZXJ0eSAiezB9IiBpcyBhbHJlYWR5IGRlZmluZWQuIFVzZSAmbHQ7amF4Yjpwcm9wZXJ0eT4gdG8gcmVzb2x2ZSB0aGlzIGNvbmZsaWN0LgorCitEVVBMSUNBVEVfRUxFTUVOVCA9IFwKKyAgICBFbGVtZW50ICJ7MH0iIHNob3dzIHVwIGluIG1vcmUgdGhhbiBvbmUgcHJvcGVydGllcy4KIAogRFVQTElDQVRFX1BST1BFUlRZX0xPQyA9IFwKICAgICAocmVsYXRlZCB0byBhYm92ZSBlcnJvcikgYW5vdGhlciBkZWZpbml0aW9uIGlzIGdpdmVuIGhlcmUuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9NZXNzYWdlcy5qYXZhCmluZGV4IGE3OTk1NGYuLjYyNDI4ODIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDcgKzIzLDYgQEAKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwogCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyOwogCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC0zMiw4ICszMSw5IEBACiAvKioKICAqIEZvcm1hdHMgZXJyb3IgbWVzc2FnZXMuCiAgKi8KLWVudW0gTWVzc2FnZXMgeworcHVibGljIGVudW0gTWVzc2FnZXMgewogICAgIERVUExJQ0FURV9QUk9QRVJUWSwgLy8gMSBhcmcKKyAgICBEVVBMSUNBVEVfRUxFTUVOVCwgLy8gMSBhcmcKIAogICAgIEVSUl9VTkRFQ0xBUkVEX1BSRUZJWCwKICAgICBFUlJfVU5FWFBFQ1RFRF9FWFRFTlNJT05fQklORElOR19QUkVGSVhFUywKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9Nb2RlbENoZWNrZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9Nb2RlbENoZWNrZXIuamF2YQppbmRleCBmYWZkOWM1Li5iZTM2ZGRlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvTW9kZWxDaGVja2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL01vZGVsQ2hlY2tlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEwICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlcjsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuRXJyb3JSZWNlaXZlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NJbmZvOwpAQCAtNTQsNiArNTcsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrKCBDQ2xhc3NJbmZvIGNpICkgewogICAgICAgICBMaXN0PENQcm9wZXJ0eUluZm8+IHByb3BzID0gY2kuZ2V0UHJvcGVydGllcygpOworICAgICAgICBNYXA8UU5hbWUsQ1Byb3BlcnR5SW5mbz4gY29sbGlzaW9uVGFibGUgPSBuZXcgSGFzaE1hcDxRTmFtZSxDUHJvcGVydHlJbmZvPigpOwogCiAgICAgICAgIE9VVEVSOgogICAgICAgICBmb3IoIGludCBpPTA7IGk8cHJvcHMuc2l6ZSgpOyBpKysgKSB7CkBAIC02NCw2ICs2OCwxMyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBRTmFtZSBuID0gcDEuY29sbGVjdEVsZW1lbnROYW1lcyhjb2xsaXNpb25UYWJsZSk7CisgICAgICAgICAgICBpZihuIT1udWxsKSB7CisgICAgICAgICAgICAgICAgQ1Byb3BlcnR5SW5mbyBwMiA9IGNvbGxpc2lvblRhYmxlLmdldChuKTsKKyAgICAgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKHAxLmxvY2F0b3IsTWVzc2FnZXMuRFVQTElDQVRFX0VMRU1FTlQuZm9ybWF0KG4pKTsKKyAgICAgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKHAyLmxvY2F0b3IsTWVzc2FnZXMuRVJSX1JFTEVWQU5UX0xPQ0FUSU9OLmZvcm1hdCgpKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZm9yKCBpbnQgaj1pKzE7IGo8cHJvcHMuc2l6ZSgpOyBqKysgKSB7CiAgICAgICAgICAgICAgICAgaWYoY2hlY2tQcm9wZXJ0eUNvbGxpc2lvbihwMSxwcm9wcy5nZXQoaikpKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBPVVRFUjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9SYXdUeXBlU2V0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvUmF3VHlwZVNldC5qYXZhCmluZGV4IGEwYTgxNTQuLjZlN2U0YzEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9SYXdUeXBlU2V0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL1Jhd1R5cGVTZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0zMCwzMiArMjksMTUgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5NaW1lVHlwZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0NsYXNzSW5mbzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ3VzdG9taXphdGlvbnM7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0VsZW1lbnRJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50UHJvcGVydHlJbmZvOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DRWxlbWVudFByb3BlcnR5SW5mby5Db2xsZWN0aW9uTW9kZS4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNOb25FbGVtZW50OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNSZWZlcmVuY2VQcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ1R5cGVSZWY7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuTW9kZWw7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuTXVsdGlwbGljaXR5OwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLlR5cGVVc2U7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwubmF2Lk5UeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuQkdNQnVpbGRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLkNsYXNzU2VsZWN0b3I7Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5TaW1wbGVUeXBlQnVpbGRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJR2xvYmFsQmluZGluZzsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuRWxlbWVudDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuSUQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbXBvbmVudDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRWxlbWVudERlY2w7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1R5cGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YbWxTdHJpbmc7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCiAvKioKICAqIFNldCBvZiB7QGxpbmsgUmVmfS4KQEAgLTI0MCwxMDkgKzIyMiw0IEBACiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgTWltZVR5cGUgZ2V0RXhwZWN0ZWRNaW1lVHlwZSgpIHsgcmV0dXJuIG51bGw7IH0KICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZlcmVuY2VzIHRvIGEgdHlwZS4gQ291bGQgYmUgZ2xvYmFsIG9yIGxvY2FsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgWG1sVHlwZVJlZiBleHRlbmRzIFJlZiB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBRTmFtZSBlbGVtZW50TmFtZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFR5cGVVc2UgdGFyZ2V0OwotICAgICAgICBwdWJsaWMgZmluYWwgTG9jYXRvciBsb2NhdG9yOwotICAgICAgICBwdWJsaWMgZmluYWwgWFNDb21wb25lbnQgc291cmNlOwotICAgICAgICBwdWJsaWMgZmluYWwgQ0N1c3RvbWl6YXRpb25zIGN1c3RzOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBuaWxsYWJsZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFhtbFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0KLSAgICAgICAgcHVibGljIFhtbFR5cGVSZWYoUU5hbWUgZWxlbWVudE5hbWUsIFR5cGVVc2UgdGFyZ2V0LCBib29sZWFuIG5pbGxhYmxlLCBYbWxTdHJpbmcgZGVmYXVsdFZhbHVlLCBYU0NvbXBvbmVudCBzb3VyY2UsIENDdXN0b21pemF0aW9ucyBjdXN0cywgTG9jYXRvciBsb2MpIHsKLSAgICAgICAgICAgIGFzc2VydCBlbGVtZW50TmFtZSE9bnVsbDsKLSAgICAgICAgICAgIGFzc2VydCB0YXJnZXQhPW51bGw7Ci0KLSAgICAgICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgICAgICAgICB0aGlzLmN1c3RzID0gY3VzdHM7Ci0gICAgICAgICAgICB0aGlzLm5pbGxhYmxlID0gbmlsbGFibGU7Ci0gICAgICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIHRoaXMubG9jYXRvciA9IGxvYzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBYbWxUeXBlUmVmKFFOYW1lIGVsZW1lbnROYW1lLCBYU1R5cGUgdGFyZ2V0LCBib29sZWFuIG5pbGxhYmxlLCBYbWxTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzKGVsZW1lbnROYW1lLFJpbmcuZ2V0KENsYXNzU2VsZWN0b3IuY2xhc3MpLmJpbmRUb1R5cGUodGFyZ2V0KSwgbmlsbGFibGUsIGRlZmF1bHRWYWx1ZSwgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICBSaW5nLmdldChCR01CdWlsZGVyLmNsYXNzKS5nZXRCaW5kSW5mbyh0YXJnZXQpLnRvQ3VzdG9taXphdGlvbkxpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldExvY2F0b3IoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgWG1sVHlwZVJlZihYU0VsZW1lbnREZWNsIGRlY2wpIHsKLSAgICAgICAgICAgIHRoaXMobmV3IFFOYW1lKGRlY2wuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksZGVjbC5nZXROYW1lKCkpLGJpbmRUb1R5cGUoZGVjbCksCi0gICAgICAgICAgICAgICAgICAgIGRlY2wuaXNOaWxsYWJsZSgpLCBkZWNsLmdldERlZmF1bHRWYWx1ZSgpLCBkZWNsLAotICAgICAgICAgICAgICAgICAgICBSaW5nLmdldChCR01CdWlsZGVyLmNsYXNzKS5nZXRCaW5kSW5mbyhkZWNsKS50b0N1c3RvbWl6YXRpb25MaXN0KCksCi0gICAgICAgICAgICAgICAgICAgIGRlY2wuZ2V0TG9jYXRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBDVHlwZVJlZiB0b1R5cGVSZWYoQ0VsZW1lbnRQcm9wZXJ0eUluZm8gZXApIHsKLSAgICAgICAgICAgIGlmKGVwIT1udWxsICYmIHRhcmdldC5nZXRBZGFwdGVyVXNlKCkhPW51bGwpCi0gICAgICAgICAgICAgICAgZXAuc2V0QWRhcHRlcih0YXJnZXQuZ2V0QWRhcHRlclVzZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1R5cGVSZWYoKENOb25FbGVtZW50KXRhcmdldC5nZXRJbmZvKCksZWxlbWVudE5hbWUsbmlsbGFibGUsZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgd2hvbGUgdHlwZSBzZXQgY2FuIGJlIGxhdGVyIGJvdW5kIHRvIGEgcmVmZXJlbmNlIHByb3BlcnR5LAotICAgICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYWRkaXRpb25hbCBjb2RlIHRvIHdyYXAgdGhpcwotICAgICAgICAgKiB0eXBlIHJlZmVyZW5jZSBpbnRvIGFuIGVsZW1lbnQgY2xhc3MuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBzdWNoIGFuIGVsZW1lbnQgY2xhc3MgYW5kIHJldHVybnMgaXQuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0b0VsZW1lbnRSZWYoQ1JlZmVyZW5jZVByb3BlcnR5SW5mbyBwcm9wKSB7Ci0gICAgICAgICAgICBDQ2xhc3NJbmZvIHNjb3BlID0gUmluZy5nZXQoQ2xhc3NTZWxlY3Rvci5jbGFzcykuZ2V0Q3VycmVudEJlYW4oKTsKLSAgICAgICAgICAgIE1vZGVsIG1vZGVsID0gUmluZy5nZXQoTW9kZWwuY2xhc3MpOwotCi0gICAgICAgICAgICBpZih0YXJnZXQgaW5zdGFuY2VvZiBDQ2xhc3NJbmZvICYmIFJpbmcuZ2V0KEJJR2xvYmFsQmluZGluZy5jbGFzcykuaXNTaW1wbGVNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICBDQ2xhc3NJbmZvIGJlYW4gPSBuZXcgQ0NsYXNzSW5mbyhtb2RlbCxzY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0TmFtZUNvbnZlcnRlcigpLnRvQ2xhc3NOYW1lKGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvcixudWxsLGVsZW1lbnROYW1lLHNvdXJjZSxjdXN0cyk7Ci0gICAgICAgICAgICAgICAgYmVhbi5zZXRCYXNlQ2xhc3MoKENDbGFzc0luZm8pdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICBwcm9wLmdldEVsZW1lbnRzKCkuYWRkKGJlYW4pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDRWxlbWVudEluZm8gZSA9IG5ldyBDRWxlbWVudEluZm8obW9kZWwsZWxlbWVudE5hbWUsc2NvcGUsdGFyZ2V0LGRlZmF1bHRWYWx1ZSxzb3VyY2UsY3VzdHMsbG9jYXRvcik7Ci0gICAgICAgICAgICAgICAgcHJvcC5nZXRFbGVtZW50cygpLmFkZChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBNb2RlIGNhbkJlVHlwZShSYXdUeXBlU2V0IHBhcmVudCkgewotICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhZGFwdGVyIG9yIElEbmVzcywgd2hpY2ggcmVxdWlyZXMgc3BlY2lhbAotICAgICAgICAgICAgLy8gYW5ub3RhdGlvbiwgYW5kIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBlbGVtZW50LAotICAgICAgICAgICAgLy8gd2UgaGF2ZSBubyBwbGFjZSB0byBwdXQgdGhlIHNwZWNpYWwgYW5ub3RhdGlvbiwgc28gd2UgbmVlZCBKQVhCRWxlbWVudC4KLSAgICAgICAgICAgIGlmKHBhcmVudC5yZWZzLnNpemUoKT4xIHx8ICFwYXJlbnQubXVsLmlzQXRNb3N0T25jZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYodGFyZ2V0LmdldEFkYXB0ZXJVc2UoKSE9bnVsbCB8fCB0YXJnZXQuaWRVc2UoKSE9SUQuTk9ORSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZGUuTVVTVF9CRV9SRUZFUkVOQ0U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5pbGxhYmxlIGFuZCBvcHRpb25hbCBhdCB0aGUgc2FtZSB0aW1lLiBuZWVkcyBhbiBlbGVtZW50IHdyYXBwZXIgdG8gZGlzdGluZ3Vpc2ggdGhvc2UKLSAgICAgICAgICAgIC8vIHR3byBzdGF0ZXMuIEJ1dCB0aGlzIGlzIG5vdCBhIGhhcmQgcmVxdWlyZW1lbnQuCi0gICAgICAgICAgICBpZihuaWxsYWJsZSAmJiBwYXJlbnQubXVsLmlzT3B0aW9uYWwoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTW9kZS5DQU5fQkVfVFlQRVJFRjsKLQotICAgICAgICAgICAgcmV0dXJuIE1vZGUuU0hPVUxEX0JFX1RZUEVSRUY7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpc3RPZlZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXQuaXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgSUQgaWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmlkVXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgTWltZVR5cGUgZ2V0RXhwZWN0ZWRNaW1lVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZ2V0RXhwZWN0ZWRNaW1lVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVHlwZVVzZSBiaW5kVG9UeXBlKFhTRWxlbWVudERlY2wgZGVjbCkgewotICAgICAgICBTaW1wbGVUeXBlQnVpbGRlciBzdGIgPSBSaW5nLmdldChTaW1wbGVUeXBlQnVpbGRlci5jbGFzcyk7Ci0gICAgICAgIHN0Yi5yZWZlcmVyU3RhY2sucHVzaChkZWNsKTsKLSAgICAgICAgVHlwZVVzZSByID0gUmluZy5nZXQoQ2xhc3NTZWxlY3Rvci5jbGFzcykuYmluZFRvVHlwZShkZWNsLmdldFR5cGUoKSk7Ci0gICAgICAgIHN0Yi5yZWZlcmVyU3RhY2sucG9wKCk7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9SaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvUmluZy5qYXZhCmluZGV4IGNkZWVkZWUuLmZhZmY4ODggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9SaW5nLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL1JpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvVHlwZVV0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9UeXBlVXRpbC5qYXZhCmluZGV4IDU2NDNhYTQuLmUxY2M5ZGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9UeXBlVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9UeXBlVXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL1V0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9VdGlsLmphdmEKaW5kZXggY2I0YjgxNC4uODJlZjdiMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL1V0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvVXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL0Jsb2NrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL0Jsb2NrLmphdmEKaW5kZXggZTRjNjZmMS4uNjhhZTJlNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9CbG9jay5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvQmxvY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZDsKIAogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9FbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL0VsZW1lbnQuamF2YQppbmRleCA2NzY1NDlhLi5kNGI2MzFlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL0VsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL0VsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zNSw3ICszNCw3IEBACiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0J1aWx0aW5MZWFmSW5mbzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50UHJvcGVydHlJbmZvOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNOb25FbGVtZW50OworaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DRWxlbWVudFByb3BlcnR5SW5mby5Db2xsZWN0aW9uTW9kZS4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNQcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ1JlZmVyZW5jZVByb3BlcnR5SW5mbzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DVHlwZVJlZjsKQEAgLTQ5LDEwICs0OCw2IEBACiAKIGltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50UHJvcGVydHlJbmZvLkNvbGxlY3Rpb25Nb2RlLk5PVF9SRVBFQVRFRDsKLWltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0VsZW1lbnRQcm9wZXJ0eUluZm8uQ29sbGVjdGlvbk1vZGUuUkVQRUFURURfVkFMVUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50UHJvcGVydHlJbmZvLkNvbGxlY3Rpb25Nb2RlLlJFUEVBVEVEX0VMRU1FTlQ7Ci0KIC8qKgogICogRFREIEVsZW1lbnQuCiAgKgpAQCAtMjM4LDcgKzIzMyw3IEBACiAKICAgICAgICAgICAgIGlmKGNpIT1udWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBlbGVtZW50IGlzIG1hcHBlZCB0byBhIGNsYXNzLCBqdXN0IHB1dCBvbmUgcHJvcGVydHkKLSAgICAgICAgICAgICAgICBDVmFsdWVQcm9wZXJ0eUluZm8gcCA9IG5ldyBDVmFsdWVQcm9wZXJ0eUluZm8oInZhbHVlIiwgbnVsbCxudWxsLypUT0RPKi8sbG9jYXRvcixnZXRDb252ZXJzaW9uKCkpOworICAgICAgICAgICAgICAgIENWYWx1ZVByb3BlcnR5SW5mbyBwID0gbmV3IENWYWx1ZVByb3BlcnR5SW5mbygidmFsdWUiLCBudWxsLG51bGwvKlRPRE8qLyxsb2NhdG9yLGdldENvbnZlcnNpb24oKSxudWxsKTsKICAgICAgICAgICAgICAgICBjaS5hZGRQcm9wZXJ0eShwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKQEAgLTI4OCw3ICsyODMsNyBAQAogICAgICAgICAgICAgICAgIGZvciggRWxlbWVudCBlIDogYi5lbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAgQ0NsYXNzSW5mbyBjaGlsZCA9IG93bmVyLmdldE9yQ3JlYXRlRWxlbWVudChlLm5hbWUpLmdldENsYXNzSW5mbygpOwogICAgICAgICAgICAgICAgICAgICBhc3NlcnQgY2hpbGQhPW51bGw7IC8vIHdlIGFyZSByZXF1aXJpbmcgdGhlbSB0byBiZSBjbGFzc2VzLgotICAgICAgICAgICAgICAgICAgICBwLmdldFR5cGVzKCkuYWRkKG5ldyBDVHlwZVJlZihjaGlsZCxuZXcgUU5hbWUoIiIsZS5uYW1lKSxmYWxzZSxudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIHAuZ2V0VHlwZXMoKS5hZGQobmV3IENUeXBlUmVmKGNoaWxkLG5ldyBRTmFtZSgiIixlLm5hbWUpLG51bGwsZmFsc2UsbnVsbCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIHByb3BlcnR5CkBAIC0zMDYsNyArMzAxLDcgQEAKICAgICAgICAgICAgICAgICBwID0gbmV3IENFbGVtZW50UHJvcGVydHlJbmZvKHByb3BOYW1lLAogICAgICAgICAgICAgICAgICAgICByZWZUeXBlLmlzQ29sbGVjdGlvbigpP1JFUEVBVEVEX1ZBTFVFOk5PVF9SRVBFQVRFRCwgSUQuTk9ORSwgbnVsbCwgbnVsbCxudWxsLypUT0RPKi8sIGxvY2F0b3IsICFiLmlzT3B0aW9uYWwgKTsKIAotICAgICAgICAgICAgICAgIHAuZ2V0VHlwZXMoKS5hZGQobmV3IENUeXBlUmVmKChDTm9uRWxlbWVudClyZWZUeXBlLmdldEluZm8oKSxuZXcgUU5hbWUoIiIsbmFtZSksZmFsc2UsbnVsbCkpOworICAgICAgICAgICAgICAgIHAuZ2V0VHlwZXMoKS5hZGQobmV3IENUeXBlUmVmKHJlZlR5cGUuZ2V0SW5mbygpLG5ldyBRTmFtZSgiIixuYW1lKSxudWxsLGZhbHNlLG51bGwpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNpLmFkZFByb3BlcnR5KHApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCmluZGV4IGYwZTk5NjAuLjIzN2ZiOWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBURFREUmVhZGVyLk5vUm9vdEVsZW1lbnQgPSBcCiAJTm8gcm9vdCBlbGVtZW50IHdhcyBzcGVjaWZpZWQuCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvTWVzc2FnZXMuamF2YQppbmRleCA5M2FhZTNjLi44NDEwYTQzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvTW9kZWxHcm91cC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9Nb2RlbEdyb3VwLmphdmEKaW5kZXggMWY4M2Q4OC4uNTg3ZWViMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9Nb2RlbEdyb3VwLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9Nb2RlbEdyb3VwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5kdGQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9PY2N1cmVuY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvT2NjdXJlbmNlLmphdmEKaW5kZXggNDE5MjRhMy4uNzJhMzdjMTEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvT2NjdXJlbmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9PY2N1cmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9URFREUmVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL1REVERSZWFkZXIuamF2YQppbmRleCAwODI5YmEzLi41N2IxODI1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL1REVERSZWFkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL1REVERSZWFkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xMDEsMTQgKzEwMCwxMyBAQAogICAgICAgICAgICAgICAgIEVycm9yUmVjZWl2ZXJGaWx0ZXIgZWYgPSBuZXcgRXJyb3JSZWNlaXZlckZpbHRlcihlcnJvclJlY2VpdmVyKTsKIAogICAgICAgICAgICAgICAgIEpDb2RlTW9kZWwgY20gPSBuZXcgSkNvZGVNb2RlbCgpOwotICAgICAgICAgICAgICAgIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKG9wdHMsY20sTmFtZUNvbnZlcnRlci5zdGFuZGFyZCxvcHRzLmNsYXNzTmFtZUFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwob3B0cyxjbSxOYW1lQ29udmVydGVyLnN0YW5kYXJkLG9wdHMuY2xhc3NOYW1lQWxsb2NhdG9yLG51bGwpOwogCiAgICAgICAgICAgICAgICAgUmluZy5hZGQoY20pOwogICAgICAgICAgICAgICAgIFJpbmcuYWRkKG1vZGVsKTsKICAgICAgICAgICAgICAgICBSaW5nLmFkZChFcnJvclJlY2VpdmVyLmNsYXNzLGVmKTsKIAotICAgICAgICAgICAgICAgIFREVERSZWFkZXIgcmVhZGVyID0gbmV3IFREVERSZWFkZXIoIGVmLCBvcHRzLmVudGl0eVJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICBvcHRzLCBiaW5kaW5nSW5mbyk7CisgICAgICAgICAgICAgICAgVERURFJlYWRlciByZWFkZXIgPSBuZXcgVERURFJlYWRlciggZWYsIG9wdHMsIGJpbmRpbmdJbmZvKTsKIAogICAgICAgICAgICAgICAgIERURFBhcnNlciBwYXJzZXIgPSBuZXcgRFREUGFyc2VyKCk7CiAgICAgICAgICAgICAgICAgcGFyc2VyLnNldER0ZEhhbmRsZXIocmVhZGVyKTsKQEAgLTEzOSwxOSArMTM3LDE2IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICBwcm90ZWN0ZWQgVERURFJlYWRlcihFcnJvclJlY2VpdmVyIGVycm9yUmVjZWl2ZXIsIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyLCBPcHRpb25zIG9wdHMsIElucHV0U291cmNlIF9iaW5kSW5mbykKKyAgICBwcm90ZWN0ZWQgVERURFJlYWRlcihFcnJvclJlY2VpdmVyIGVycm9yUmVjZWl2ZXIsIE9wdGlvbnMgb3B0cywgSW5wdXRTb3VyY2UgX2JpbmRJbmZvKQogICAgICAgICB0aHJvd3MgQWJvcnRFeGNlcHRpb24gewotICAgICAgICB0aGlzLmVudGl0eVJlc29sdmVyID0gZW50aXR5UmVzb2x2ZXI7CisgICAgICAgIHRoaXMuZW50aXR5UmVzb2x2ZXIgPSBvcHRzLmVudGl0eVJlc29sdmVyOwogICAgICAgICB0aGlzLmVycm9yUmVjZWl2ZXIgPSBuZXcgRXJyb3JSZWNlaXZlckZpbHRlcihlcnJvclJlY2VpdmVyKTsKLSAgICAgICAgdGhpcy5vcHRzID0gb3B0czsKICAgICAgICAgYmluZEluZm8gPSBuZXcgQmluZEluZm8obW9kZWwsX2JpbmRJbmZvLCB0aGlzLmVycm9yUmVjZWl2ZXIpOwogICAgICAgICBjbGFzc0ZhY3RvcnkgPSBuZXcgQ29kZU1vZGVsQ2xhc3NGYWN0b3J5KGVycm9yUmVjZWl2ZXIpOwogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXI7CiAKLSAgICBwcml2YXRlIGZpbmFsIE9wdGlvbnMgb3B0czsKLQogICAgIC8qKgogICAgICAqIGJpbmRpbmcgaW5mb3JtYXRpb24uCiAgICAgICoKQEAgLTE2MSw4ICsxNTYsNiBAQAogICAgICAqLwogICAgIGZpbmFsIEJpbmRJbmZvIGJpbmRJbmZvOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBKQ29kZU1vZGVsIGNvZGVNb2RlbCA9IFJpbmcuZ2V0KEpDb2RlTW9kZWwuY2xhc3MpOwotCiAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBSaW5nLmdldChNb2RlbC5jbGFzcyk7CiAKICAgICBwcml2YXRlIGZpbmFsIENvZGVNb2RlbENsYXNzRmFjdG9yeSBjbGFzc0ZhY3Rvcnk7CkBAIC0xOTQsNiArMTg3LDggQEAKIAogICAgICAgICAvLyBjaGVjayBYSkMgZXh0ZW5zaW9ucyBhbmQgcmVhbGl6ZSB0aGVtCiAgICAgICAgIG1vZGVsLnNlcmlhbFZlcnNpb25VSUQgPSBiaW5kSW5mby5nZXRTZXJpYWxWZXJzaW9uVUlEKCk7CisgICAgICAgIGlmKG1vZGVsLnNlcmlhbFZlcnNpb25VSUQhPW51bGwpCisgICAgICAgICAgICBtb2RlbC5zZXJpYWxpemFibGU9dHJ1ZTsKICAgICAgICAgbW9kZWwucm9vdENsYXNzID0gYmluZEluZm8uZ2V0U3VwZXJDbGFzcygpOwogICAgICAgICBtb2RlbC5yb290SW50ZXJmYWNlID0gYmluZEluZm8uZ2V0U3VwZXJJbnRlcmZhY2UoKTsKIApAQCAtMjE3LDcgKzIxMiw3IEBACiAKICAgICAgICAgZm9yKCBCSUludGVyZmFjZSBkZWNsIDogYmluZEluZm8uaW50ZXJmYWNlcygpICkgewogICAgICAgICAgICAgZmluYWwgSkRlZmluZWRDbGFzcyBpbnRmID0gY2xhc3NGYWN0b3J5LmNyZWF0ZUludGVyZmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFyZ2V0UGFja2FnZSgpLCBkZWNsLm5hbWUoKSwgY29weUxvY2F0b3IoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mby5nZXRUYXJnZXRQYWNrYWdlKCksIGRlY2wubmFtZSgpLCBjb3B5TG9jYXRvcigpICk7CiAgICAgICAgICAgICBkZWNscy5wdXQoZGVjbCxpbnRmKTsKICAgICAgICAgICAgIGZyb21OYW1lLnB1dChkZWNsLm5hbWUoKSxuZXcgSW50ZXJmYWNlQWNjZXB0b3IoKSB7CiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaW1wbGVtZW50KEpDbGFzcyBjKSB7CkBAIC0yNjQsMTEgKzI1OSw3IEBACiAKIAogICAgIEpQYWNrYWdlIGdldFRhcmdldFBhY2thZ2UoKSB7Ci0gICAgICAgIC8vICItcCIgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV2ZXJ5dGhpbmcgZWxzZQotICAgICAgICBpZihvcHRzLmRlZmF1bHRQYWNrYWdlIT1udWxsKQotICAgICAgICAgICAgcmV0dXJuIGNvZGVNb2RlbC5fcGFja2FnZShvcHRzLmRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGJpbmRJbmZvLmdldFRhcmdldFBhY2thZ2UoKTsKKyAgICAgICAgcmV0dXJuIGJpbmRJbmZvLmdldFRhcmdldFBhY2thZ2UoKTsKICAgICB9CiAKIApAQCAtMzMxLDcgKzMyMiw3IEBACiAgICAgICAgICAgICB1c2UgPSBidWlsdGluQ29udmVyc2lvbnMuZ2V0KGF0dHJpYnV0ZVR5cGUpOwogCiAgICAgICAgIENQcm9wZXJ0eUluZm8gciA9IG5ldyBDQXR0cmlidXRlUHJvcGVydHlJbmZvKAotICAgICAgICAgICAgcHJvcE5hbWUsIG51bGwsbnVsbC8qVE9ETyovLCBjb3B5TG9jYXRvcigpLCBxbmFtZSwgdXNlLCByZXF1aXJlZCApOworICAgICAgICAgICAgcHJvcE5hbWUsIG51bGwsbnVsbC8qVE9ETyovLCBjb3B5TG9jYXRvcigpLCBxbmFtZSwgdXNlLCBudWxsLCByZXF1aXJlZCApOwogCiAgICAgICAgIGlmKGRlZmF1bHRWYWx1ZSE9bnVsbCkKICAgICAgICAgICAgIHIuZGVmYXVsdFZhbHVlID0gQ0RlZmF1bHRWYWx1ZS5jcmVhdGUoIHVzZSwgbmV3IFhtbFN0cmluZyhkZWZhdWx0VmFsdWUpICk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL1Rlcm0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvVGVybS5qYXZhCmluZGV4IDk3NWE5ZjUuLjhmMTE0ZjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvVGVybS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvVGVybS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZHRkOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJQXR0cmlidXRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJQXR0cmlidXRlLmphdmEKaW5kZXggYTQ3YzcyNy4uMjJmZTFjYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSUF0dHJpYnV0ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZC5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJQ29uc3RydWN0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklDb25zdHJ1Y3Rvci5qYXZhCmluZGV4IGEwNGQ3MDcuLjYwYTBmNWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklDb25zdHJ1Y3Rvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklDb25zdHJ1Y3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZHRkLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTgzLDcgKzgyLDcgQEAKIAogICAgIC8qKiBHZXRzIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGlzIGRlY2xhcmF0aW9uIGlzIGRlY2xhcmVkLiAqLwogICAgIHB1YmxpYyBMb2NhdG9yIGdldFNvdXJjZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gRE9NNEpMb2NhdG9yLmdldExvY2F0aW9uSW5mbyhkb20pOworICAgICAgICByZXR1cm4gRE9NTG9jYXRvci5nZXRMb2NhdGlvbkluZm8oZG9tKTsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSUNvbnRlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklDb250ZW50LmphdmEKaW5kZXggZjE1MjlhMC4uODdkMGRiOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSUNvbnRlbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJQ29udGVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZHRkLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklDb252ZXJzaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJQ29udmVyc2lvbi5qYXZhCmluZGV4IGE2NmU3MWEuLjAxMDY3NTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklDb252ZXJzaW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSUNvbnZlcnNpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZC5iaW5kaW5mbzsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLlR5cGVVc2U7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSUVsZW1lbnQuamF2YQppbmRleCBlYTY5NWQ5Li4yMzE1MjZiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJRWxlbWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5kdGQuYmluZGluZm87CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMTE1LDcgKzExNCw3IEBACiAgICAgICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIHdoZXJlIHRoaXMgZWxlbWVudCBpcyBkZWNsYXJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIERPTTRKTG9jYXRvci5nZXRMb2NhdGlvbkluZm8oZSk7CisgICAgICAgIHJldHVybiBET01Mb2NhdG9yLmdldExvY2F0aW9uSW5mbyhlKTsKICAgICB9CiAKIApAQCAtMjY4LDYgKzI2Nyw2IEBACiAKICAgICAvKiogR2V0cyB0aGUgbG9jYXRpb24gd2hlcmUgdGhpcyBkZWNsYXJhdGlvbiBpcyBkZWNsYXJlZC4gKi8KICAgICBwdWJsaWMgTG9jYXRvciBnZXRTb3VyY2VMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIERPTTRKTG9jYXRvci5nZXRMb2NhdGlvbkluZm8oZSk7CisgICAgICAgIHJldHVybiBET01Mb2NhdG9yLmdldExvY2F0aW9uSW5mbyhlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJRW51bWVyYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklFbnVtZXJhdGlvbi5qYXZhCmluZGV4IDNiOTM4MmEuLjM3YjFhZjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklFbnVtZXJhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklFbnVtZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZHRkLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTc1LDcgKzc0LDcgQEAKICAgICAgICAgICAgICAgICBDQnVpbHRpbkxlYWZJbmZvLlNUUklORywKICAgICAgICAgICAgICAgICBidWlsZE1lbWJlckxpc3QocGFyZW50Lm1vZGVsLGRvbSksCiAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbC8qVE9ETyovLAotICAgICAgICAgICAgICAgIERPTTRKTG9jYXRvci5nZXRMb2NhdGlvbkluZm8oZG9tKSkpOworICAgICAgICAgICAgICAgIERPTUxvY2F0b3IuZ2V0TG9jYXRpb25JbmZvKGRvbSkpKTsKICAgICB9CiAKICAgICAvKiogQ3JlYXRlcyBhbiBlbGVtZW50LWxvY2FsIGVudW1lcmF0aW9uIGRlY2xhcmF0aW9uLiAqLwpAQCAtOTEsNyArOTAsNyBAQAogICAgICAgICAgICAgICAgIENCdWlsdGluTGVhZkluZm8uU1RSSU5HLAogICAgICAgICAgICAgICAgIGJ1aWxkTWVtYmVyTGlzdChwYXJlbnQucGFyZW50Lm1vZGVsLGRvbSksCiAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbC8qVE9ETyovLAotICAgICAgICAgICAgICAgIERPTTRKTG9jYXRvci5nZXRMb2NhdGlvbkluZm8oZG9tKSApKTsKKyAgICAgICAgICAgICAgICBET01Mb2NhdG9yLmdldExvY2F0aW9uSW5mbyhkb20pICkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q0VudW1Db25zdGFudD4gYnVpbGRNZW1iZXJMaXN0KCBNb2RlbCBtb2RlbCwgRWxlbWVudCBkb20gKSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJSW50ZXJmYWNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JJSW50ZXJmYWNlLmphdmEKaW5kZXggNWNjNjhmOC4uMjY4ZjgzMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSUludGVyZmFjZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklJbnRlcmZhY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZC5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CkBAIC03Nyw3ICs3Niw3IEBACiAKICAgICAvKiogR2V0cyB0aGUgbG9jYXRpb24gd2hlcmUgdGhpcyBkZWNsYXJhdGlvbiBpcyBkZWNsYXJlZC4gKi8KICAgICBwdWJsaWMgTG9jYXRvciBnZXRTb3VyY2VMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIERPTTRKTG9jYXRvci5nZXRMb2NhdGlvbkluZm8oZG9tKTsKKyAgICAgICAgcmV0dXJuIERPTUxvY2F0b3IuZ2V0TG9jYXRpb25JbmZvKGRvbSk7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vQklVc2VyQ29udmVyc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSVVzZXJDb252ZXJzaW9uLmphdmEKaW5kZXggMzVlZGQ1Ny4uMmFmYzU0ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSVVzZXJDb252ZXJzaW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CSVVzZXJDb252ZXJzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5kdGQuYmluZGluZm87CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDksOCArNDgsNiBAQAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNCdWlsdGluTGVhZkluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuVHlwZVVzZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5UeXBlVXNlRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuUmluZzsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLkNsYXNzU2VsZWN0b3I7CiAKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwpAQCAtMTEyLDcgKzEwOSw3IEBACiAKICAgICAvKiogR2V0cyB0aGUgbG9jYXRpb24gd2hlcmUgdGhpcyBkZWNsYXJhdGlvbiBpcyBkZWNsYXJlZC4gKi8KICAgICBwdWJsaWMgTG9jYXRvciBnZXRTb3VyY2VMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIERPTTRKTG9jYXRvci5nZXRMb2NhdGlvbkluZm8oZSk7CisgICAgICAgIHJldHVybiBET01Mb2NhdG9yLmdldExvY2F0aW9uSW5mbyhlKTsKICAgICB9CiAKICAgICAvKiogR2V0cyB0aGUgY29udmVyc2lvbiBuYW1lLiAqLwpAQCAtMTUzLDcgKzE1MCw3IEBACiAgICAgICAgIGlmKHBhcnNlPT1udWxsKSAgcGFyc2U9Im5ldyI7CiAKICAgICAgICAgU3RyaW5nIHByaW50ID0gRE9NVXRpbC5nZXRBdHRyaWJ1dGUoZSwicHJpbnQiKTsKLSAgICAgICAgaWYocHJpbnQ9PW51bGwpICBwYXJzZT0idG9TdHJpbmciOworICAgICAgICBpZihwcmludD09bnVsbCkgIHByaW50PSJ0b1N0cmluZyI7CiAKICAgICAgICAgSkRlZmluZWRDbGFzcyBhZGFwdGVyID0gZ2VuZXJhdGVBZGFwdGVyKG93bmVyLmNvZGVNb2RlbCwgcGFyc2UsIHByaW50LCB0LmJveGlmeSgpKTsKIApAQCAtMTY4LDcgKzE2NSw3IEBACiAgICAgICAgIGludCBpZCA9IDE7CiAgICAgICAgIHdoaWxlKGFkYXB0ZXI9PW51bGwpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSlBhY2thZ2UgcGtnID0gUmluZy5nZXQoQ2xhc3NTZWxlY3Rvci5jbGFzcykuZ2V0Q2xhc3NTY29wZSgpLmdldE93bmVyUGFja2FnZSgpOworICAgICAgICAgICAgICAgIEpQYWNrYWdlIHBrZyA9IG93bmVyLmdldFRhcmdldFBhY2thZ2UoKTsKICAgICAgICAgICAgICAgICBhZGFwdGVyID0gcGtnLl9jbGFzcygiQWRhcHRlciIraWQpOwogICAgICAgICAgICAgfSBjYXRjaCAoSkNsYXNzQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gdHJ5IGFub3RoZXIgbmFtZSBpbiBzZWFyY2ggZm9yIGFuIHVuaXF1ZSBuYW1lLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CaW5kSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CaW5kSW5mby5qYXZhCmluZGV4IDFhMGQ5N2ZkLi40MWZiNjEyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0JpbmRJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9CaW5kSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZHRkLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTQ0LDYgKzQzLDggQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5BYm9ydEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5FcnJvclJlY2VpdmVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLlNjaGVtYUNhY2hlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNDdXN0b21pemF0aW9uczsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DUGx1Z2luQ3VzdG9taXphdGlvbjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5Nb2RlbDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuQ29uc3Q7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMudXRpbC5Db2RlTW9kZWxDbGFzc0ZhY3Rvcnk7CkBAIC03NCw4ICs3NSw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdFBhY2thZ2U7CiAKICAgICBwdWJsaWMgQmluZEluZm8oTW9kZWwgbW9kZWwsIElucHV0U291cmNlIHNvdXJjZSwgRXJyb3JSZWNlaXZlciBfZXJyb3JSZWNlaXZlcikgdGhyb3dzIEFib3J0RXhjZXB0aW9uIHsKLQotICAgICAgICB0aGlzKCBtb2RlbCwgcGFyc2Uoc291cmNlLF9lcnJvclJlY2VpdmVyKSwgX2Vycm9yUmVjZWl2ZXIpOworICAgICAgICB0aGlzKCBtb2RlbCwgcGFyc2UobW9kZWwsc291cmNlLF9lcnJvclJlY2VpdmVyKSwgX2Vycm9yUmVjZWl2ZXIpOwogICAgIH0KIAogICAgIHB1YmxpYyBCaW5kSW5mbyhNb2RlbCBtb2RlbCwgRG9jdW1lbnQgX2RvbSwgRXJyb3JSZWNlaXZlciBfZXJyb3JSZWNlaXZlcikgewpAQCAtODgsNiArODgsOSBAQAogCiAgICAgICAgIHRoaXMuZGVmYXVsdFBhY2thZ2UgPSBtb2RlbC5vcHRpb25zLmRlZmF1bHRQYWNrYWdlOwogCisgICAgICAgIC8vIGNvcHkgZ2xvYmFsIGN1c3RvbWl6YXRpb25zIHRvIHRoZSBtb2RlbAorICAgICAgICBtb2RlbC5nZXRDdXN0b21pemF0aW9ucygpLmFkZEFsbChnZXRHbG9iYWxDdXN0b21pemF0aW9ucygpKTsKKwogICAgICAgICAvLyBwcm9jZXNzIGVsZW1lbnQgZGVjbGFyYXRpb25zCiAgICAgICAgIGZvciggRWxlbWVudCBlbGUgOiBET01VdGlsLmdldENoaWxkRWxlbWVudHMoZG9tLCJlbGVtZW50IikpIHsKICAgICAgICAgICAgIEJJRWxlbWVudCBlID0gbmV3IEJJRWxlbWVudCh0aGlzLGVsZSk7CkBAIC0xOTMsOCArMTk2LDE0IEBACiAgICAgICAgIHJldHVybiBjOwogICAgIH0KIAotICAgIC8qKiBHZXRzIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBuYW1lIChvcHRpb25zL0BwYWNrYWdlKS4gKi8KKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBuYW1lIChvcHRpb25zL0BwYWNrYWdlKS4KKyAgICAgKi8KICAgICBwdWJsaWMgSlBhY2thZ2UgZ2V0VGFyZ2V0UGFja2FnZSgpIHsKKyAgICAgICAgaWYobW9kZWwub3B0aW9ucy5kZWZhdWx0UGFja2FnZSE9bnVsbCkKKyAgICAgICAgICAgIC8vICItcCIgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNvZGVNb2RlbC5fcGFja2FnZShtb2RlbC5vcHRpb25zLmRlZmF1bHRQYWNrYWdlKTsKKwogICAgICAgICBTdHJpbmcgcDsKICAgICAgICAgaWYoIGRlZmF1bHRQYWNrYWdlIT1udWxsICkKICAgICAgICAgICAgIHAgPSBkZWZhdWx0UGFja2FnZTsKQEAgLTIzNiw2ICsyNDUsMjQgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZXMudmFsdWVzKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiB0b3AtbGV2ZWwge0BsaW5rIENQbHVnaW5DdXN0b21pemF0aW9ufXMuCisgICAgICovCisgICAgcHJpdmF0ZSBDQ3VzdG9taXphdGlvbnMgZ2V0R2xvYmFsQ3VzdG9taXphdGlvbnMoKSB7CisgICAgICAgIENDdXN0b21pemF0aW9ucyByPW51bGw7CisgICAgICAgIGZvciggRWxlbWVudCBlIDogRE9NVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGRvbSkgKSB7CisgICAgICAgICAgICBpZighbW9kZWwub3B0aW9ucy5wbHVnaW5VUklzLmNvbnRhaW5zKGUuZ2V0TmFtZXNwYWNlVVJJKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIHRoaXMgaXNuJ3QgYSBwbHVnaW4gY3VzdG9taXphdGlvbgorICAgICAgICAgICAgaWYocj09bnVsbCkKKyAgICAgICAgICAgICAgICByID0gbmV3IENDdXN0b21pemF0aW9ucygpOworICAgICAgICAgICAgci5hZGQobmV3IENQbHVnaW5DdXN0b21pemF0aW9uKGUsIERPTUxvY2F0b3IuZ2V0TG9jYXRpb25JbmZvKGUpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZihyPT1udWxsKSAgICAgciA9IENDdXN0b21pemF0aW9ucy5FTVBUWTsKKyAgICAgICAgcmV0dXJuIG5ldyBDQ3VzdG9taXphdGlvbnMocik7CisgICAgfQorCisKIAogCiAvLwpAQCAtMjY1LDEyICsyOTIsMTQgQEAKICAgICAgKiBQYXJzZXMgYW4gSW5wdXRTb3VyY2UgaW50byBkb200aiBEb2N1bWVudC4KICAgICAgKiBSZXR1cm5zIG51bGwgaW4gY2FzZSBvZiBhbiBleGNlcHRpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnQgcGFyc2UoIElucHV0U291cmNlIGlzLCBFcnJvclJlY2VpdmVyIHJlY2VpdmVyICkgdGhyb3dzIEFib3J0RXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudCBwYXJzZSggTW9kZWwgbW9kZWwsIElucHV0U291cmNlIGlzLCBFcnJvclJlY2VpdmVyIHJlY2VpdmVyICkgdGhyb3dzIEFib3J0RXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFZhbGlkYXRvckhhbmRsZXIgdmFsaWRhdG9yID0gYmluZGluZ0ZpbGVTY2hlbWEubmV3VmFsaWRhdG9yKCk7CiAKICAgICAgICAgICAgIC8vIHNldCB1cCB0aGUgcGlwZSBsaW5lIGFzIDoKLSAgICAgICAgICAgIC8vICAgcGFyc2VyLT52YWxpZGF0b3ItPmZhY3RvcnkKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAvLT4gZXh0ZW5zaW9uQ2hlY2tlciAtPiB2YWxpZGF0b3IKKyAgICAgICAgICAgIC8vICAgcGFyc2VyLT4gLTwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICBcLT4gRE9NIGJ1aWxkZXIKICAgICAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgICAgICBwZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKICAgICAgICAgICAgIERPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBET01CdWlsZGVyKCk7CkBAIC0yNzksNyArMzA4LDExIEBACiAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0RXJyb3JIYW5kbGVyKGNvbnRyb2xsZXIpOwogICAgICAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IHBmLm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpOwogICAgICAgICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcihjb250cm9sbGVyKTsKLSAgICAgICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgRm9ya0NvbnRlbnRIYW5kbGVyKHZhbGlkYXRvcixidWlsZGVyKSk7CisKKyAgICAgICAgICAgIERUREV4dGVuc2lvbkJpbmRpbmdDaGVja2VyIGNoZWNrZXIgPSBuZXcgRFRERXh0ZW5zaW9uQmluZGluZ0NoZWNrZXIoIiIsIG1vZGVsLm9wdGlvbnMsIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgY2hlY2tlci5zZXRDb250ZW50SGFuZGxlcih2YWxpZGF0b3IpOworCisgICAgICAgICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEZvcmtDb250ZW50SGFuZGxlcihjaGVja2VyLGJ1aWxkZXIpKTsKIAogICAgICAgICAgICAgcmVhZGVyLnBhcnNlKGlzKTsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9ET000SkxvY2F0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vRE9NNEpMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDRhMWMuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9ET000SkxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZC5iaW5kaW5mbzsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLQotY2xhc3MgRE9NNEpMb2NhdG9yCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxvY2F0aW9uTmFtZXNwYWNlID0KLSAgICAgICAgImh0dHA6Ly93d3cuc3VuLmNvbS94bWxucy9qYXhiL2RvbTRqLWxvY2F0aW9uIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3lzdGVtSWQgICAgPSAic3lzdGVtaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb2x1bW4gICAgICA9ICJjb2x1bW4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lICAgICAgICA9ICJsaW5lIjsKLQotICAgIC8qKiBTZXRzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhIHNwZWNpZmllZCBlbGVtZW50LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2NhdGlvbkluZm8oIEVsZW1lbnQgZSwgTG9jYXRvciBsb2MgKSB7Ci0gICAgICAgIGUuc2V0QXR0cmlidXRlTlMobG9jYXRpb25OYW1lc3BhY2UsImxvYzoiK3N5c3RlbUlkLGxvYy5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgZS5zZXRBdHRyaWJ1dGVOUyhsb2NhdGlvbk5hbWVzcGFjZSwibG9jOiIrY29sdW1uLEludGVnZXIudG9TdHJpbmcobG9jLmdldExpbmVOdW1iZXIoKSkpOwotICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKGxvY2F0aW9uTmFtZXNwYWNlLCJsb2M6IitsaW5lLEludGVnZXIudG9TdHJpbmcobG9jLmdldENvbHVtbk51bWJlcigpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZnJvbSBhbiBlbGVtZW50LgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogRm9yIHRoaXMgbWV0aG9kIHRvIHdvcmssIHRoZSBzZXRMb2NhdGlvbkluZm8gbWV0aG9kIGhhcyB0byBiZQotICAgICAqIGNhbGxlZCBiZWZvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMb2NhdG9yIGdldExvY2F0aW9uSW5mbyggZmluYWwgRWxlbWVudCBlICkgewotICAgICAgICBpZihET01VdGlsLmdldEF0dHJpYnV0ZShlLGxvY2F0aW9uTmFtZXNwYWNlLHN5c3RlbUlkKT09bnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAvLyBubyBsb2NhdGlvbiBpbmZvcm1hdGlvbgotCi0gICAgICAgIHJldHVybiBuZXcgTG9jYXRvcigpewotICAgICAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KERPTVV0aWwuZ2V0QXR0cmlidXRlKGUsbG9jYXRpb25OYW1lc3BhY2UsbGluZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoRE9NVXRpbC5nZXRBdHRyaWJ1dGUoZSxsb2NhdGlvbk5hbWVzcGFjZSxjb2x1bW4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERPTVV0aWwuZ2V0QXR0cmlidXRlKGUsbG9jYXRpb25OYW1lc3BhY2Usc3lzdGVtSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIFBVQkxJQyBJRC4KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7IHJldHVybiBudWxsOyB9Ci0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9ET01CdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0RPTUJ1aWxkZXIuamF2YQppbmRleCA3YWU4ZTY5Li45ODI5NTY4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0RPTUJ1aWxkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0RPTUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZC5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CkBAIC00OCw2ICs0Nyw2IEBACiAKICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKSB7CiAgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHJzKTsKLSAgICAgICAgRE9NNEpMb2NhdG9yLnNldExvY2F0aW9uSW5mbyhnZXRDdXJyZW50RWxlbWVudCgpLGxvY2F0b3IpOworICAgICAgICBET01Mb2NhdG9yLnNldExvY2F0aW9uSW5mbyhnZXRDdXJyZW50RWxlbWVudCgpLGxvY2F0b3IpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vRE9NTG9jYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9ET01Mb2NhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlYjVmYQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vRE9NTG9jYXRvci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZHRkLmJpbmRpbmZvOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCitjbGFzcyBET01Mb2NhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbG9jYXRpb25OYW1lc3BhY2UgPQorICAgICAgICAiaHR0cDovL3d3dy5zdW4uY29tL3htbG5zL2pheGIvZG9tLWxvY2F0aW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3lzdGVtSWQgICAgPSAic3lzdGVtaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb2x1bW4gICAgICA9ICJjb2x1bW4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lICAgICAgICA9ICJsaW5lIjsKKworICAgIC8qKiBTZXRzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhIHNwZWNpZmllZCBlbGVtZW50LiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2NhdGlvbkluZm8oIEVsZW1lbnQgZSwgTG9jYXRvciBsb2MgKSB7CisgICAgICAgIGUuc2V0QXR0cmlidXRlTlMobG9jYXRpb25OYW1lc3BhY2UsImxvYzoiK3N5c3RlbUlkLGxvYy5nZXRTeXN0ZW1JZCgpKTsKKyAgICAgICAgZS5zZXRBdHRyaWJ1dGVOUyhsb2NhdGlvbk5hbWVzcGFjZSwibG9jOiIrY29sdW1uLEludGVnZXIudG9TdHJpbmcobG9jLmdldExpbmVOdW1iZXIoKSkpOworICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKGxvY2F0aW9uTmFtZXNwYWNlLCJsb2M6IitsaW5lLEludGVnZXIudG9TdHJpbmcobG9jLmdldENvbHVtbk51bWJlcigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZnJvbSBhbiBlbGVtZW50LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIHRoaXMgbWV0aG9kIHRvIHdvcmssIHRoZSBzZXRMb2NhdGlvbkluZm8gbWV0aG9kIGhhcyB0byBiZQorICAgICAqIGNhbGxlZCBiZWZvcmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMb2NhdG9yIGdldExvY2F0aW9uSW5mbyggZmluYWwgRWxlbWVudCBlICkgeworICAgICAgICBpZihET01VdGlsLmdldEF0dHJpYnV0ZShlLGxvY2F0aW9uTmFtZXNwYWNlLHN5c3RlbUlkKT09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAvLyBubyBsb2NhdGlvbiBpbmZvcm1hdGlvbgorCisgICAgICAgIHJldHVybiBuZXcgTG9jYXRvcigpeworICAgICAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KERPTVV0aWwuZ2V0QXR0cmlidXRlKGUsbG9jYXRpb25OYW1lc3BhY2UsbGluZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoRE9NVXRpbC5nZXRBdHRyaWJ1dGUoZSxsb2NhdGlvbk5hbWVzcGFjZSxjb2x1bW4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERPTVV0aWwuZ2V0QXR0cmlidXRlKGUsbG9jYXRpb25OYW1lc3BhY2Usc3lzdGVtSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIFBVQkxJQyBJRC4KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7IHJldHVybiBudWxsOyB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9ET01VdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0RPTVV0aWwuamF2YQppbmRleCBhNWZmZDNmLi5kYzEyMWFjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0RPTVV0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0RPTVV0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmR0ZC5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0RUREV4dGVuc2lvbkJpbmRpbmdDaGVja2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL0RUREV4dGVuc2lvbkJpbmRpbmdDaGVja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwODIyZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vRFRERXh0ZW5zaW9uQmluZGluZ0NoZWNrZXIuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5kdGQuYmluZGluZm87CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5PcHRpb25zOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5BYnN0cmFjdEV4dGVuc2lvbkJpbmRpbmdDaGVja2VyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5Db25zdDsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxGaWx0ZXI7CisKKy8qKgorICoge0BsaW5rIFhNTEZpbHRlcn0gdGhhdCBjaGVja3MgdGhlIHVzZSBvZiBleHRlbnNpb24gbmFtZXNwYWNlIFVSSXMKKyAqICh0byBzZWUgaWYgdGhleSBoYXZlIGNvcnJlc3BvbmRpbmcgcGx1Z2lucyksIGFuZCBvdGhlcndpc2UgcmVwb3J0IGFuIGVycm9yLgorICoKKyAqIDxwPgorICogVGhpcyBjb2RlIGFsc28gbWFza3MgdGhlIHJlY29nbml6ZWQgZXh0ZW5zaW9ucyBmcm9tIHRoZSB2YWxpZGF0b3IgdGhhdAorICogd2lsbCBiZSBwbHVnZ2VkIGFzIHRoZSBuZXh0IGNvbXBvbmVudCB0byB0aGlzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZmluYWwgY2xhc3MgRFRERXh0ZW5zaW9uQmluZGluZ0NoZWNrZXIgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkJpbmRpbmdDaGVja2VyIHsKKyAgICBwdWJsaWMgRFRERXh0ZW5zaW9uQmluZGluZ0NoZWNrZXIoU3RyaW5nIHNjaGVtYUxhbmd1YWdlLCBPcHRpb25zIG9wdGlvbnMsIEVycm9ySGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIHN1cGVyKHNjaGVtYUxhbmd1YWdlLCBvcHRpb25zLCBoYW5kbGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkkKKyAgICAgKiBzaG91bGQgYmUgYmxvY2tlZCBieSB0aGlzIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbmVlZHNUb0JlUHJ1bmVkKCBTdHJpbmcgdXJpICkgeworICAgICAgICBpZiggdXJpLmVxdWFscyhzY2hlbWFMYW5ndWFnZSkgKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiggdXJpLmVxdWFscyhDb25zdC5KQVhCX05TVVJJKSApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmKCB1cmkuZXF1YWxzKENvbnN0LlhKQ19FWFRFTlNJT05fVVJJKSApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdmFsaWRhdG9yIHRvIHNlZSBleHRlbnNpb25zIHRoYXQgd2UgdW5kZXJzdGFuZCAsCisgICAgICAgIC8vIGJlY2F1c2UgdGhleSB3aWxsIGNvbXBsYWluLgorICAgICAgICAvLyBPVE9ILCBpZiAgdGhpcyBpcyBhbiBleHRlbnNpb24gdGhhdCB3ZSBkaWRuJ3QgdW5kZXJzdGFuZCwKKyAgICAgICAgLy8gd2Ugd2FudCB0aGUgdmFsaWRhdG9yIHRvIHJlcG9ydCBhbiBlcnJvcgorICAgICAgICByZXR1cm4gZW5hYmxlZEV4dGVuc2lvbnMuY29udGFpbnModXJpKTsKKyAgICB9CisKKworCisgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBpZiggIWlzQ3V0dGluZygpICkgeworICAgICAgICAgICAgaWYoIXVyaS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgLy8gIiIgaXMgdGhlIHN0YW5kYXJkIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgIGNoZWNrQW5kRW5hYmxlKHVyaSk7CisKKyAgICAgICAgICAgICAgICB2ZXJpZnlUYWdOYW1lKHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZihuZWVkc1RvQmVQcnVuZWQodXJpKSkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRDdXR0aW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCmluZGV4IGE2MzQzZDEuLmRjNjYyZTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjcgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIwogCiBCSUNvbnN0cnVjdG9yLlVuZGVmaW5lZEZpZWxkID0gXAogCVByb3BlcnR5ICJ7MH0iIGlzIGRlY2xhcmVkIGluIHRoZSA8Y29uc3RydWN0b3I+IGRlY2xhcmF0aW9uIFwKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vTWVzc2FnZXMuamF2YQppbmRleCA2NTM2YmM3Li45ZmNkMTBmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vYmluZGluZ2ZpbGUucm5nIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9iaW5kaW5nZmlsZS5ybmcKaW5kZXggMmU2MzlmNS4uYTcxZTQ1YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9iaW5kaW5nZmlsZS5ybmcKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9iaW5kaW5nZmlsZS5ybmcKQEAgLTEsNSArMSwyOSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIj8+CiA8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+Cis8IS0tCiBEVEQgYmluZGluZyBpbmZvcm1hdGlvbiBmaWxlIHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YgWEpDLgogJElkOiBiaW5kaW5nZmlsZS5ybmcsdiAxLjEgMjAwNS8wNC8xNSAyMDowOTo0MyBrb2hzdWtlIEV4cCAkCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8vYmluZGluZ2ZpbGUueHNkIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9iaW5kaW5nZmlsZS54c2QKaW5kZXggODI1ZjNhOC4uNDU4MWFiOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9iaW5kaW5nZmlsZS54c2QKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9iaW5kaW5nZmlsZS54c2QKQEAgLTEsNyArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCiA8IS0tCi0gQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogCiAgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDcgKzIzLDYgQEAKICBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIGhhdmUgYW55IHF1ZXN0aW9ucy4KIC0tPgotCiA8IS0tCiAgIERURCBiaW5kaW5nIGluZm9ybWF0aW9uIGZpbGUgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiBYSkMuCiAgICRJZDogYmluZGluZ2ZpbGUueHNkLHYgMS4xIDIwMDUvMDQvMjkgMTg6MTE6MDUga29oc3VrZSBFeHAgJApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL3BhY2thZ2UuaHRtbAppbmRleCBhYjQ5ODhhLi40ZTJjN2JhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL3BhY2thZ2UuaHRtbApAQCAtMSArMSwyNSBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGJvZHk+PHA+T2JqZWN0IE1vZGVsIHRoYXQgcmVwcmVzZW50cyBEVEQgYmluZGluZyBpbmZvcm1hdGlvbi48L3A+PC9ib2R5PgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby94amMueHNkIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2R0ZC9iaW5kaW5mby94amMueHNkCmluZGV4IDJmY2VhYmQuLmU4MGJiMmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9kdGQvYmluZGluZm8veGpjLnhzZAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZHRkL2JpbmRpbmZvL3hqYy54c2QKQEAgLTEsNyArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCiA8IS0tCi0gQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogCiAgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDcgKzIzLDYgQEAKICBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIGhhdmUgYW55IHF1ZXN0aW9ucy4KIC0tPgotCiA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMiIHhtbG5zOnhqYz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMiPgogICA8eHM6aW1wb3J0IHNjaGVtYUxvY2F0aW9uPSJiaW5kaW5nZmlsZS54c2QiLz4KICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VyaWFsaXphYmxlIj4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9DaG9pY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9DaG9pY2UuamF2YQppbmRleCBlNTgzMjIyLi45MWJlODVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvQ2hvaWNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0Nob2ljZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZ2JpbmQ7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0Nvbm5lY3RlZENvbXBvbmVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0Nvbm5lY3RlZENvbXBvbmVudC5qYXZhCmluZGV4IDAwNjFkYmEuLjI5NzU5YzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9Db25uZWN0ZWRDb21wb25lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvQ29ubmVjdGVkQ29tcG9uZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5nYmluZDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0VsZW1lbnQuamF2YQppbmRleCBjMDdlZDA4Li40ZTY0NzM5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvRWxlbWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9FbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTIgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmdiaW5kOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCkBAIC01MSw4ICs1MCw4IEBACiAgICAgICogd2UgcmVwcmVzZW50IGFuIGVkZ2UgZTEgLT4gZTIgYnkge0Bjb2RlIGUxLmZvcmVFZGdlcy5jb250YWlucyhlMil9CiAgICAgICogYW5kIHtAY29kZSBlMi5iYWNrRWRnZXMuY29udGFpbnMoZTEpfS4KICAgICAgKi8KLSAgICBmaW5hbCBTZXQ8RWxlbWVudD4gZm9yZUVkZ2VzID0gbmV3IEhhc2hTZXQ8RWxlbWVudD4oKTsKLSAgICBmaW5hbCBTZXQ8RWxlbWVudD4gYmFja0VkZ2VzID0gbmV3IEhhc2hTZXQ8RWxlbWVudD4oKTsKKyAgICBmaW5hbCBTZXQ8RWxlbWVudD4gZm9yZUVkZ2VzID0gbmV3IExpbmtlZEhhc2hTZXQ8RWxlbWVudD4oKTsKKyAgICBmaW5hbCBTZXQ8RWxlbWVudD4gYmFja0VkZ2VzID0gbmV3IExpbmtlZEhhc2hTZXQ8RWxlbWVudD4oKTsKIAogICAgIC8qKgogICAgICAqIFByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIERGUyBwb3N0LW9yZGVyIHRyYXZlcmFsCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvRWxlbWVudFNldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0VsZW1lbnRTZXQuamF2YQppbmRleCAwOGNkZmM2Li42ZTczYzkyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvRWxlbWVudFNldC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9FbGVtZW50U2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5nYmluZDsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9FbGVtZW50U2V0cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0VsZW1lbnRTZXRzLmphdmEKaW5kZXggYmJjZTRhOS4uNDcxMTI2MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0VsZW1lbnRTZXRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0VsZW1lbnRTZXRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTAgKzIyLDkgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZ2JpbmQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIAogLyoqCiAgKiBGYWN0b3J5IG1ldGhvZHMgZm9yIHtAbGluayBFbGVtZW50U2V0fS4KQEAgLTUzLDcgKzUyLDcgQEAKICAgICAgKgogICAgICAqIFRoaXMgaXNuJ3QgcGFydGljdWxhcmx5IGVmZmljaWVudCBvciBhbnl0aGluZywgYnV0IGl0IHdpbGwgZG8gZm9yIG5vdy4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNdWx0aVZhbHVlU2V0IGV4dGVuZHMgSGFzaFNldDxFbGVtZW50PiBpbXBsZW1lbnRzIEVsZW1lbnRTZXQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE11bHRpVmFsdWVTZXQgZXh0ZW5kcyBMaW5rZWRIYXNoU2V0PEVsZW1lbnQ+IGltcGxlbWVudHMgRWxlbWVudFNldCB7CiAgICAgICAgIHB1YmxpYyBNdWx0aVZhbHVlU2V0KEVsZW1lbnRTZXQgbGhzLCBFbGVtZW50U2V0IHJocykgewogICAgICAgICAgICAgYWRkQWxsKGxocyk7CiAgICAgICAgICAgICBhZGRBbGwocmhzKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9FeHByZXNzaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvRXhwcmVzc2lvbi5qYXZhCmluZGV4IGVmZDZiYjAuLjk1ODMxNTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9FeHByZXNzaW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0V4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmdiaW5kOwogCiBpbXBvcnQgamF2YS51dGlsLlNldDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9HcmFwaC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0dyYXBoLmphdmEKaW5kZXggYzNkMGJjZS4uYzYxMmZkZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0dyYXBoLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL0dyYXBoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5nYmluZDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvT25lT3JNb3JlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvT25lT3JNb3JlLmphdmEKaW5kZXggNWE1ZTJhYi4uNGJlMzg5MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL09uZU9yTW9yZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9PbmVPck1vcmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmdiaW5kOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9TZXF1ZW5jZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL1NlcXVlbmNlLmphdmEKaW5kZXggMWE3ODg4Yy4uYWE2MjhjYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL1NlcXVlbmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL1NlcXVlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5nYmluZDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvU2lua05vZGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9TaW5rTm9kZS5qYXZhCmluZGV4IGE1ODgwM2IuLmRlZDVhNzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9TaW5rTm9kZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9TaW5rTm9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZ2JpbmQ7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL1NvdXJjZU5vZGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9Tb3VyY2VOb2RlLmphdmEKaW5kZXggOTY1ODRiMi4uYzk2ZDc4YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL1NvdXJjZU5vZGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvU291cmNlTm9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuZ2JpbmQ7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9nYmluZC9wYWNrYWdlLmh0bWwKaW5kZXggYWI5YTkxYi4uYTg2NzZmYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2diaW5kL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvZ2JpbmQvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPgogPGJvZHk+CiAgICAgQmluYXJ5IGV4cHJlc3Npb25zIGFyZSBsZWZ0LWFzc29jaWF0aXZlLiBJT1csICgoQSxCKSxDKSBpbnN0ZWFkIG9mIChBLChCLEMpKQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9BYnN0cmFjdFJlZmVyZW5jZUZpbmRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvQWJzdHJhY3RSZWZlcmVuY2VGaW5kZXJJbXBsLmphdmEKaW5kZXggNTViNTdkMi4uMWZjNmY0MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9BYnN0cmFjdFJlZmVyZW5jZUZpbmRlckltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0Fic3RyYWN0UmVmZXJlbmNlRmluZGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEwICsyMiwxMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5pbnRlcm5hbGl6ZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogCkBAIC04Myw4ICs4MywxMyBAQAogICAgICAgICAgICAgLy8gYnV0IGRvbid0IG1hcmsgdGhpcyBkb2N1bWVudCBhcyBhIHJvb3QuCiAgICAgICAgICAgICBwYXJlbnQucGFyc2UocmVmLGZhbHNlKTsKICAgICAgICAgfSBjYXRjaCggVVJJU3ludGF4RXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBpZihuZXcgRmlsZShyZWxhdGl2ZVJlZikuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX0ZJTEVOQU1FX0lTX05PVF9VUkkpKycgJyttc2c7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uIHNwZSA9IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbjIoCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLkVSUl9VTkFCTEVfVE9fUEFSU0UscmVsYXRpdmVSZWYsZS5nZXRNZXNzYWdlKCkpLAorICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5FUlJfVU5BQkxFX1RPX1BBUlNFLHJlbGF0aXZlUmVmLCBtc2cpLAogICAgICAgICAgICAgICAgIGxvY2F0b3IsIGUgKTsKIAogICAgICAgICAgICAgZmF0YWxFcnJvcihzcGUpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9Db250ZW50SGFuZGxlck5hbWVzcGFjZVByZWZpeEFkYXB0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvQ29udGVudEhhbmRsZXJOYW1lc3BhY2VQcmVmaXhBZGFwdGVyLmphdmEKaW5kZXggYWE5Yzk5MTQuLjBjYzAwMDMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvQ29udGVudEhhbmRsZXJOYW1lc3BhY2VQcmVmaXhBZGFwdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9Db250ZW50SGFuZGxlck5hbWVzcGFjZVByZWZpeEFkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplcjsKIAogaW1wb3J0IGphdmF4LnhtbC5YTUxDb25zdGFudHM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0RPTUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvRE9NQnVpbGRlci5qYXZhCmluZGV4IDk2YmI0MjguLmQ4OGMxNTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvRE9NQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvRE9NQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuaW50ZXJuYWxpemVyOwogCiBpbXBvcnQgamF2YS51dGlsLlNldDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvRE9NRm9yZXN0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0RPTUZvcmVzdC5qYXZhCmluZGV4IDAzZmUyZTIuLjgxODAzYTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvRE9NRm9yZXN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9ET01Gb3Jlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC01NSwxMSArNTQsMTEgQEAKIGltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWFGYWN0b3J5OwogCiBpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5YTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLkVycm9yUmVjZWl2ZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLkNvbnN0OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEucGFyc2VyLlNjaGVtYUNvbnN0cmFpbnRDaGVja2VyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnV0aWwuRXJyb3JSZWNlaXZlckZpbHRlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsLlhNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5tYXJzaGFsbGVyLkRhdGFXcml0ZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5wYXJzZXIuSkFYUFBhcnNlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnBhcnNlci5YTUxQYXJzZXI7CkBAIC0yMDMsNiArMjAyLDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUGlja3Mgb25lIGRvY3VtZW50IGF0IHJhbmRvbSBhbmQgcmV0dXJucyBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0T25lRG9jdW1lbnQoKSB7CisgICAgICAgIGZvciAoRG9jdW1lbnQgZG9tIDogY29yZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKCFkb20uZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKENvbnN0LkpBWEJfTlNVUkkpKQorICAgICAgICAgICAgICAgIHJldHVybiBkb207CisgICAgICAgIH0KKyAgICAgICAgLy8gd2Ugc2hvdWxkIGhhdmUgY2F1Z2h0IHRoaXMgZXJyb3IgdmVyeSBlYXJseSBvbgorICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVja3MgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBYTUwgU2NoZW1hIGRvY3VtZW50cyBhbmQgcmV0dXJuIHRydWUKICAgICAgKiBpZiBpdCdzIE9LLgogICAgICAqCkBAIC00MDcsNyArNDE4LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN5c3RlbSBpZCBjYW5ub3QgYmUgbnVsbCIpOwogICAgICAgICBjb3JlLnB1dCggc3lzdGVtSWQsIGRvbSApOwogCi0gICAgICAgIG5ldyBYTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyKHBhcnNlcixnZXRQYXJzZXJIYW5kbGVyKGRvbSkpLmJyaWRnZSgpOworICAgICAgICBuZXcgWE1MU3RyZWFtUmVhZGVyVG9Db250ZW50SGFuZGxlcihwYXJzZXIsZ2V0UGFyc2VySGFuZGxlcihkb20pLGZhbHNlLGZhbHNlKS5icmlkZ2UoKTsKIAogICAgICAgICByZXR1cm4gZG9tOwogICAgIH0KQEAgLTQxNyw5ICs0MjgsMTMgQEAKICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLCBvbmx5IGFmdGVyIGFsbCB0aGUKICAgICAgKiBzY2hlbWFzIGFyZSBwYXJzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgcmV0dXJuZWQgYmluZGluZ3MgbmVlZCB0byBiZSBhcHBsaWVkIGFmdGVyIHNjaGVtYQorICAgICAqICAgICAgY29tcG9uZW50cyBhcmUgYnVpbHQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKCkgewotICAgICAgICBJbnRlcm5hbGl6ZXIudHJhbnNmb3JtKHRoaXMpOworICAgIHB1YmxpYyBTQ0RCYXNlZEJpbmRpbmdTZXQgdHJhbnNmb3JtKGJvb2xlYW4gZW5hYmxlU0NEKSB7CisgICAgICAgIHJldHVybiBJbnRlcm5hbGl6ZXIudHJhbnNmb3JtKHRoaXMsZW5hYmxlU0NEKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvRE9NRm9yZXN0UGFyc2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0RPTUZvcmVzdFBhcnNlci5qYXZhCmluZGV4IDQxODI5MzguLmQ1YzI1YzUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvRE9NRm9yZXN0UGFyc2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9ET01Gb3Jlc3RQYXJzZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0RPTUZvcmVzdFNjYW5uZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvRE9NRm9yZXN0U2Nhbm5lci5qYXZhCmluZGV4IDNmOWI2MzkuLmFmM2M0MjMxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0RPTUZvcmVzdFNjYW5uZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0RPTUZvcmVzdFNjYW5uZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyLkRPTVNjYW5uZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0ludGVybmFsaXphdGlvbkxvZ2ljLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0ludGVybmFsaXphdGlvbkxvZ2ljLmphdmEKaW5kZXggMzAyODMwMC4uZWZlMTkyYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9JbnRlcm5hbGl6YXRpb25Mb2dpYy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvSW50ZXJuYWxpemF0aW9uTG9naWMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplcjsKIAogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0ludGVybmFsaXplci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9JbnRlcm5hbGl6ZXIuamF2YQppbmRleCBiMmQ3MWVmLi5iZWUxZGM4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0ludGVybmFsaXplci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvSW50ZXJuYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5pbnRlcm5hbGl6ZXI7CiAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CkBAIC0zMSw2ICszMCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKIGltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7CkBAIC0zOCwxMCArMzgsMTMgQEAKIGltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OwogCiBpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuU0FYUGFyc2VFeGNlcHRpb24yOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuRXJyb3JSZWNlaXZlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuQ29uc3Q7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMudXRpbC5ET01VdGlsczsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnV0aWwuRWRpdERpc3RhbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uU0NEOwogCiBpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKQEAgLTU1LDggKzU4LDkgQEAKIAogLyoqCiAgKiBJbnRlcm5hbGl6ZXMgZXh0ZXJuYWwgYmluZGluZyBkZWNsYXJhdGlvbnMuCisgKgogICogPHA+Ci0gKiBUaGUgc3RhdGljICJ0cmFuc2Zvcm0iIG1ldGhvZCBpcyB0aGUgZW50cnkgcG9pbnQuCisgKiBUaGUge0BsaW5rICN0cmFuc2Zvcm0oRE9NRm9yZXN0LGJvb2xlYW4pfSBtZXRob2QgaXMgdGhlIGVudHJ5IHBvaW50LgogICoKICAqIEBhdXRob3IKICAqICAgICBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKQEAgLTY5LDE1ICs3MywyMyBAQAogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWxpemUgYWxsICZsdDtqYXhiOmJpbmRpbmdzPiBjdXN0b21pemF0aW9ucyBpbiB0aGUgZ2l2ZW4gZm9yZXN0LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgaWYgdGhlIFNDRCBzdXBwb3J0IGlzIGVuYWJsZWQsIHRoZSByZXR1cm4gYmluZGluZ3MgbmVlZCB0byBiZSBhcHBsaWVkCisgICAgICogICAgICBhZnRlciBzY2hlbWEgY29tcG9uZW50cyBhcmUgcGFyc2VkLgorICAgICAqICAgICAgSWYgZGlzYWJsZWQsIHRoZSByZXR1cm5lZCBiaW5kaW5nIHNldCB3aWxsIGJlIGVtcHR5LgorICAgICAqICAgICAgU0NEcyBhcmUgb25seSBmb3IgWE1MIFNjaGVtYSwgYW5kIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgZm9yIG90aGVyCisgICAgICogICAgICBzY2hlbWEgbGFuZ3VhZ2VzLgogICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHRyYW5zZm9ybSggRE9NRm9yZXN0IGZvcmVzdCApIHsKLSAgICAgICAgbmV3IEludGVybmFsaXplciggZm9yZXN0ICkudHJhbnNmb3JtKCk7CisgICAgc3RhdGljIFNDREJhc2VkQmluZGluZ1NldCB0cmFuc2Zvcm0oIERPTUZvcmVzdCBmb3Jlc3QsIGJvb2xlYW4gZW5hYmxlU0NEICkgeworICAgICAgICByZXR1cm4gbmV3IEludGVybmFsaXplciggZm9yZXN0LCBlbmFibGVTQ0QgKS50cmFuc2Zvcm0oKTsKICAgICB9CiAKIAotICAgIHByaXZhdGUgSW50ZXJuYWxpemVyKCBET01Gb3Jlc3QgZm9yZXN0ICkgeworICAgIHByaXZhdGUgSW50ZXJuYWxpemVyKCBET01Gb3Jlc3QgZm9yZXN0LCBib29sZWFuIGVuYWJsZVNDRCApIHsKICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBmb3Jlc3QuZ2V0RXJyb3JIYW5kbGVyKCk7CiAgICAgICAgIHRoaXMuZm9yZXN0ID0gZm9yZXN0OworICAgICAgICB0aGlzLmVuYWJsZVNDRCA9IGVuYWJsZVNDRDsKICAgICB9CiAKICAgICAvKioKQEAgLTkwLDE4ICsxMDIsMjUgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEVycm9yUmVjZWl2ZXIgZXJyb3JIYW5kbGVyOwogCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlIFNDRC1iYXNlZCB0YXJnZXQgc2VsZWN0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlU0NEOwogCiAKLSAgICBwcml2YXRlIHZvaWQgdHJhbnNmb3JtKCkgeworICAgIHByaXZhdGUgU0NEQmFzZWRCaW5kaW5nU2V0IHRyYW5zZm9ybSgpIHsKIAorICAgICAgICAvLyBlaXRoZXIgdGFyZ2V0IG5vZGVzIGFyZSBjb252ZW50aW9uYWwgRE9NIG5vZGVzIChhcyBwZXIgc3BlYyksCiAgICAgICAgIE1hcDxFbGVtZW50LE5vZGU+IHRhcmdldE5vZGVzID0gbmV3IEhhc2hNYXA8RWxlbWVudCxOb2RlPigpOworICAgICAgICAvLyAuLi4gb3IgaXQgd2lsbCBiZSBzY2hlbWEgY29tcG9uZW50cyBieSBtZWFucyBvZiBTQ0QgKFJJIGV4dGVuc2lvbikKKyAgICAgICAgU0NEQmFzZWRCaW5kaW5nU2V0IHNjZCA9IG5ldyBTQ0RCYXNlZEJpbmRpbmdTZXQoZm9yZXN0KTsKIAogICAgICAgICAvLwogICAgICAgICAvLyBpZGVudGlmeSB0YXJnZXQgbm9kZXMgZm9yIGFsbCA8amF4YjpiaW5kaW5ncz4KICAgICAgICAgLy8KICAgICAgICAgZm9yIChFbGVtZW50IGpheGJCaW5kaW5ncyA6IGZvcmVzdC5vdXRlck1vc3RCaW5kaW5ncykgewogICAgICAgICAgICAgLy8gaW5pdGlhbGx5LCB0aGUgaW5oZXJpdGVkIGNvbnRleHQgaXMgaXRzZWxmCi0gICAgICAgICAgICBidWlsZFRhcmdldE5vZGVNYXAoamF4YkJpbmRpbmdzLCBqYXhiQmluZGluZ3MsIHRhcmdldE5vZGVzKTsKKyAgICAgICAgICAgIGJ1aWxkVGFyZ2V0Tm9kZU1hcChqYXhiQmluZGluZ3MsIGpheGJCaW5kaW5ncywgbnVsbCwgdGFyZ2V0Tm9kZXMsIHNjZCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLwpAQCAtMTEwLDYgKzEyOSw4IEBACiAgICAgICAgIGZvciAoRWxlbWVudCBqYXhiQmluZGluZ3MgOiBmb3Jlc3Qub3V0ZXJNb3N0QmluZGluZ3MpIHsKICAgICAgICAgICAgIG1vdmUoamF4YkJpbmRpbmdzLCB0YXJnZXROb2Rlcyk7CiAgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2NkOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI1LDYgKzE0Niw4IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBpZiggYS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoInNjaGVtYUxvY2F0aW9uIikpCiAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiggYS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoInNjZCIpICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgLy8gVE9ETzogZmxhZyBlcnJvciBmb3IgdGhpcyB1bmRlZmluZWQgYXR0cmlidXRlCiAgICAgICAgIH0KQEAgLTEzMyw5ICsxNTYsMTkgQEAKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHRoZSB0YXJnZXQgbm9kZSBvZiB0aGUgImJpbmRpbmdzIiBlbGVtZW50CiAgICAgICogYnkgdXNpbmcgdGhlIGluaGVyaXRlZCB0YXJnZXQgbm9kZSwgdGhlbiBwdXQKLSAgICAgKiB0aGUgcmVzdWx0IGludG8gdGhlICJyZXN1bHQiIG1hcC4KKyAgICAgKiB0aGUgcmVzdWx0IGludG8gdGhlICJyZXN1bHQiIG1hcCBhbmQgdGhlICJzY2QiIG1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmhlcml0ZWRUYXJnZXQKKyAgICAgKiAgICAgIFRoZSBjdXJyZW50IHRhcmdldCBub2RlLiBUaGlzIGFsd2F5cyBleGlzdHMsIGV2ZW4gaWYKKyAgICAgKiAgICAgIHRoZSB1c2VyIHN0YXJ0cyBzcGVjaWZ5aW5nIHRhcmdldHMgdmlhIFNDRCAoaW4gdGhhdCBjYXNlCisgICAgICogICAgICB0aGlzIGluaGVyaXRlZCB0YXJnZXQgaXMganVzdCBub3QgZ29pbmcgdG8gYmUgdXNlZC4pCisgICAgICogQHBhcmFtIGluaGVyaXRlZFNDRAorICAgICAqICAgICAgSWYgdGhlIGFuY2VzdG9yICZsdDtiaW5kaW5ncz4gbm9kZSBzcGVjaWZpZXMgQHNjZCB0bworICAgICAqICAgICAgc3BlY2lmeSB0aGUgdGFyZ2V0IHZpYSBTQ0QsIHRoZW4gdGhpcyBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGF0IGNvbnRleHQuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkVGFyZ2V0Tm9kZU1hcCggRWxlbWVudCBiaW5kaW5ncywgTm9kZSBpbmhlcml0ZWRUYXJnZXQsIE1hcDxFbGVtZW50LE5vZGU+IHJlc3VsdCApIHsKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRUYXJnZXROb2RlTWFwKCBFbGVtZW50IGJpbmRpbmdzLCBATm90TnVsbCBOb2RlIGluaGVyaXRlZFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU0NEQmFzZWRCaW5kaW5nU2V0LlRhcmdldCBpbmhlcml0ZWRTQ0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEVsZW1lbnQsTm9kZT4gcmVzdWx0LCBTQ0RCYXNlZEJpbmRpbmdTZXQgc2NkUmVzdWx0ICkgewogICAgICAgICAvLyBzdGFydCBieSB0aGUgaW5oZXJpdGVkIHRhcmdldAogICAgICAgICBOb2RlIHRhcmdldCA9IGluaGVyaXRlZFRhcmdldDsKIApAQCAtMTUzLDcgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoIGZvcmVzdC5nZXRTeXN0ZW1JZChiaW5kaW5ncy5nZXRPd25lckRvY3VtZW50KCkpICksCiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uICkudG9FeHRlcm5hbEZvcm0oKTsKICAgICAgICAgICAgIH0gY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgICAgIDsgICAvLyBjb250aW51ZSB3aXRoIHRoZSBvcmlnaW5hbCBzY2hlbWFMb2NhdGlvbiB2YWx1ZQorICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG9yaWdpbmFsIHNjaGVtYUxvY2F0aW9uIHZhbHVlCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRhcmdldCA9IGZvcmVzdC5nZXQoc2NoZW1hTG9jYXRpb24pOwpAQCAtMTY1LDYgKzE5OCw4IEBACiAKICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0IHByb2Nlc3NpbmcgdGhpcyA8amF4YjpiaW5kaW5ncz4KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFyZ2V0ID0gKChEb2N1bWVudCl0YXJnZXQpLmdldERvY3VtZW50RWxlbWVudCgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gbG9vayBmb3IgQG5vZGUKQEAgLTE3OCw1MSArMjEzLDY5IEBACiAgICAgICAgICAgICAgICAgbmxzdCA9IChOb2RlTGlzdCl4cGF0aC5ldmFsdWF0ZShub2RlWFBhdGgsdGFyZ2V0LFhQYXRoQ29uc3RhbnRzLk5PREVTRVQpOwogICAgICAgICAgICAgfSBjYXRjaCAoWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICByZXBvcnRFcnJvciggYmluZGluZ3MsCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5FUlJfWFBBVEhfRVZBTCxlLmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgIGUgKTsKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLkVSUl9YUEFUSF9FVkFMLGUuZ2V0TWVzc2FnZSgpKSwgZSApOwogICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnQgcHJvY2Vzc2luZyB0aGlzIDxqYXhiOmJpbmRpbmdzPgogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiggbmxzdC5nZXRMZW5ndGgoKT09MCApIHsKICAgICAgICAgICAgICAgICByZXBvcnRFcnJvciggYmluZGluZ3MsCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5OT19YUEFUSF9FVkFMX1RPX05PX1RBUkdFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVYUGF0aCkgKTsKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLk5PX1hQQVRIX0VWQUxfVE9fTk9fVEFSR0VULCBub2RlWFBhdGgpICk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiggbmxzdC5nZXRMZW5ndGgoKSE9MSApIHsKICAgICAgICAgICAgICAgICByZXBvcnRFcnJvciggYmluZGluZ3MsCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5OT19YUEFUSF9FVkFMX1RPT19NQU5ZX1RBUkdFVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICBub2RlWFBhdGgsbmxzdC5nZXRMZW5ndGgoKSkgKTsKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLk5PX1hQQVRIX0VWQUxfVE9PX01BTllfVEFSR0VUUywgbm9kZVhQYXRoLG5sc3QuZ2V0TGVuZ3RoKCkpICk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBOb2RlIHJub2RlID0gbmxzdC5pdGVtKDApOwogICAgICAgICAgICAgaWYoIShybm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgKSkgewogICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKCBiaW5kaW5ncywKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLk5PX1hQQVRIX0VWQUxfVE9fTk9OX0VMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICBub2RlWFBhdGgpICk7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5OT19YUEFUSF9FVkFMX1RPX05PTl9FTEVNRU5ULCBub2RlWFBhdGgpICk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiggIWZvcmVzdC5sb2dpYy5jaGVja0lmVmFsaWRUYXJnZXROb2RlKGZvcmVzdCxiaW5kaW5ncywoRWxlbWVudClybm9kZSkgKSB7CiAgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IoIGJpbmRpbmdzLAogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuWFBBVEhfRVZBTF9UT19OT05fU0NIRU1BX0VMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICBub2RlWFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBybm9kZS5nZXROb2RlTmFtZSgpICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVYUGF0aCwgcm5vZGUuZ2V0Tm9kZU5hbWUoKSApICk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0YXJnZXQgPSBybm9kZTsKICAgICAgICAgfQogCisgICAgICAgIC8vIGxvb2sgZm9yIEBzY2QKKyAgICAgICAgaWYoIGJpbmRpbmdzLmdldEF0dHJpYnV0ZU5vZGUoInNjZCIpIT1udWxsICkgeworICAgICAgICAgICAgU3RyaW5nIHNjZFBhdGggPSBiaW5kaW5ncy5nZXRBdHRyaWJ1dGUoInNjZCIpOworICAgICAgICAgICAgaWYoIWVuYWJsZVNDRCkgeworICAgICAgICAgICAgICAgIC8vIFNDRCBzZWxlY3RvciB3YXMgZm91bmQsIGJ1dCBpdCdzIG5vdCBhY3RpdmF0ZWQuIHJlcG9ydCBhbiBlcnJvcgorICAgICAgICAgICAgICAgIC8vIGJ1dCByZWNvdmVyIGJ5IGhhbmRsaW5nIGl0IGFueXdheS4gdGhpcyBhbHNvIGF2b2lkcyByZXBlYXRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihiaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLlNDRF9OT1RfRU5BQkxFRCkpOworICAgICAgICAgICAgICAgIGVuYWJsZVNDRCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5oZXJpdGVkU0NEID0gc2NkUmVzdWx0LmNyZWF0ZU5ld1RhcmdldCggaW5oZXJpdGVkU0NELCBiaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNDRC5jcmVhdGUoc2NkUGF0aCwgbmV3IE5hbWVzcGFjZUNvbnRleHRJbXBsKGJpbmRpbmdzKSkgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRFcnJvciggYmluZGluZ3MsIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5FUlJfU0NEX0VWQUwsZS5nZXRNZXNzYWdlKCkpLGUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFib3J0IHByb2Nlc3NpbmcgdGhpcyBiaW5kaW5ncworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gdXBkYXRlIHRoZSByZXN1bHQgbWFwCi0gICAgICAgIHJlc3VsdC5wdXQoIGJpbmRpbmdzLCB0YXJnZXQgKTsKKyAgICAgICAgaWYoaW5oZXJpdGVkU0NEIT1udWxsKQorICAgICAgICAgICAgaW5oZXJpdGVkU0NELmFkZEJpbmlkbmcoYmluZGluZ3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQucHV0KCBiaW5kaW5ncywgdGFyZ2V0ICk7CiAKICAgICAgICAgLy8gbG9vayBmb3IgY2hpbGQgPGpheGI6YmluZGluZ3M+IGFuZCBwcm9jZXNzIHRoZW0gcmVjdXJzaXZlbHkKICAgICAgICAgRWxlbWVudFtdIGNoaWxkcmVuID0gRE9NVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cyggYmluZGluZ3MsIENvbnN0LkpBWEJfTlNVUkksICJiaW5kaW5ncyIgKTsKICAgICAgICAgZm9yIChFbGVtZW50IHZhbHVlIDogY2hpbGRyZW4pCi0gICAgICAgICAgICBidWlsZFRhcmdldE5vZGVNYXAodmFsdWUsIHRhcmdldCwgcmVzdWx0KTsKKyAgICAgICAgICAgIGJ1aWxkVGFyZ2V0Tm9kZU1hcCh2YWx1ZSwgdGFyZ2V0LCBpbmhlcml0ZWRTQ0QsIHJlc3VsdCwgc2NkUmVzdWx0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzNSwyMSArMjg4LDIwIEBACiAgICAgICAgICAgICAvLyByZWNvdmVyIGZyb20gdGhlIGVycm9yIGJ5IGlnbm9yaW5nIHRoaXMgbm9kZQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIEVsZW1lbnRbXSBjaGlsZHJlbiA9IERPTVV0aWxzLmdldENoaWxkRWxlbWVudHMoYmluZGluZ3MpOwotICAgICAgICBmb3IgKEVsZW1lbnQgaXRlbSA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBpZiAoImJpbmRpbmdzIi5lcXVhbHMoaXRlbS5nZXRMb2NhbE5hbWUoKSkpCi0gICAgICAgICAgICAvLyBwcm9jZXNzIGNoaWxkIDxqYXhiOmJpbmRpbmdzPiByZWN1cnNpdmVseQorICAgICAgICBmb3IgKEVsZW1lbnQgaXRlbSA6IERPTVV0aWxzLmdldENoaWxkRWxlbWVudHMoYmluZGluZ3MpKSB7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gaXRlbS5nZXRMb2NhbE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKCJiaW5kaW5ncyIuZXF1YWxzKGxvY2FsTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGNoaWxkIDxqYXhiOmJpbmRpbmdzPiByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgIG1vdmUoaXRlbSwgdGFyZ2V0Tm9kZXMpOwotICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmICgiZ2xvYmFsQmluZGluZ3MiLmVxdWFscyhsb2NhbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gPGpheGI6Z2xvYmFsQmluZGluZ3M+IGFsd2F5cyBnbyB0byB0aGUgcm9vdCBvZiBkb2N1bWVudC4KKyAgICAgICAgICAgICAgICBtb3ZlVW5kZXIoaXRlbSxmb3Jlc3QuZ2V0T25lRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRhcmdldCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzZXQgdGhlIGNvbnRleHQgbm9kZSB0byB0aGUgZG9jdW1lbnQgd2hlbiBAc2NoZW1hTG9jYXRpb24gaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKGl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5OT19DT05URVhUX05PREVfU1BFQ0lGSUVEKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihpdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuQ09OVEVYVF9OT0RFX0lTX05PVF9FTEVNRU5UKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IoaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuQ09OVEVYVF9OT0RFX0lTX05PVF9FTEVNRU5UKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWJvcnQKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI1OCw2ICszMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5PUlBIQU5FRF9DVVNUT01JWkFUSU9OLCBpdGVtLmdldE5vZGVOYW1lKCkpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhYm9ydAogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhpcyBub2RlIHVuZGVyIHRoZSB0YXJnZXQKICAgICAgICAgICAgICAgICBtb3ZlVW5kZXIoaXRlbSwoRWxlbWVudCl0YXJnZXQpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9Mb2NhdG9yVGFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvTG9jYXRvclRhYmxlLmphdmEKaW5kZXggZGVkZjllYy4uMWJhYjhmOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9Mb2NhdG9yVGFibGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL0xvY2F0b3JUYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuaW50ZXJuYWxpemVyOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCmluZGV4IDk1YmY3ODAuLjVkZDk5OGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDQgKzEsMjkgQEAKICMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCisjCiAjIE1lc3NhZ2UgcmVzb3VyY2UgZmlsZQogIwogCkBAIC0zMSw5ICs1Niw2IEBACiBJbnRlcm5hbGl6ZXIuQ29udGV4dE5vZGVJc05vdEVsZW1lbnQgPSBcCiAJQ29udGV4dCBub2RlIGlzIG5vdCBhbiBlbGVtZW50LgogCi1JbnRlcm5hbGl6ZXIuTm9Db250ZXh0Tm9kZVNwZWNpZmllZCA9IFwKLQlBIHNjaGVtYSBkb2N1bWVudCBpcyBzZWxlY3RlZCBidXQgQG5vZGUgaXMgbm90IHNwZWNpZmllZC4gTWF5YmUgeW91IG1lYW50IG5vZGU9Ii94czpzY2hlbWEiPyAKLQogSW50ZXJuYWxpemVyLk9ycGhhbmVkQ3VzdG9taXphdGlvbiA9IFwKIAlUaGUgInswfSIgY3VzdG9taXphdGlvbiBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBzY2hlbWEgZWxlbWVudC4KIApAQCAtNDgsNCArNzAsMjUgQEAKIAogRVJSX0dFTkVSQUxfU0NIRU1BX0NPUlJFQ1RORVNTX0VSUk9SID0gXAogICAgIFdlIHdlcmUgdW5hYmxlIHRvIGVuc3VyZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHNjaGVtYTogezB9CisKK1NDRF9OT1RfRU5BQkxFRCA9IFwKKyAgICBTY2hlbWEgY29tcG9uZW50IGRlc2lnbmF0b3Igc3VwcG9ydCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBVc2UgdGhlIC1leHRlbnNpb24gc3dpdGNoIHRvIGVuYWJsZSB0aGlzIHZlbmRvciBleHRlbnNpb24uCisKK0VSUl9TQ0RfRVZBTCA9IFwKKyAgICBJbnZhbGlkIFNDRDogezB9CisKK0VSUl9TQ0RfRVZBTFVBVEVEX0VNUFRZID0gXAorICAgIFNDRCAiezB9IiBkaWRuJ3QgbWF0Y2ggYW55IHNjaGVtYSBjb21wb25lbnQKKworRVJSX1NDRF9NQVRDSEVEX01VTFRJUExFX05PREVTID0gXAorICAgIFNDRCAiezB9IiBtYXRjaGVkIHsxfSBzY2hlbWEgY29tcG9uZW50cyB3aGVyZWFzIG9ubHkgMSBpcyBleHBlY3RlZAorCitFUlJfU0NEX01BVENIRURfTVVMVElQTEVfTk9ERVNfRklSU1QgPSBcCisgICAgKHJlbGF0ZWQgdG8gYWJvdmUpIG9uZSBvZiB0aGUgbWF0Y2hlZCBzY2hlbWEgY29tcG9uZW50cyBpcyBkZWZpbmVkIGhlcmUKKworRVJSX1NDRF9NQVRDSEVEX01VTFRJUExFX05PREVTX1NFQ09ORCA9IFwKKyAgICAocmVsYXRlZCB0byBhYm92ZSkgYW5vdGhlciBtYXRjaGVkIHNjaGVtYSBjb21wb25lbnQgaXMgZGVmaW5lZCBoZXJlCisKK0VSUl9GSUxFTkFNRV9JU19OT1RfVVJJID0gXAorICAgIEZpbGUgbmFtZSBpcyBub3QgYW4gVVJJLgogIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9NZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9NZXNzYWdlcy5qYXZhCmluZGV4IDI3MGQzZmMuLmU5YjUwMjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvTWVzc2FnZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTEsMTAgKzUxLDIwIEBACiAgICAgICAgICJJbnRlcm5hbGl6ZXIuWFBhdGhFdmFsdWF0ZXNUb05vbkVsZW1lbnQiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhfRVZBTF9UT19OT05fU0NIRU1BX0VMRU1FTlQgPSAvLyBhcmc6MgogICAgICAgICAiSW50ZXJuYWxpemVyLlhQYXRoRXZhbHVhdGVzVG9Ob25TY2hlbWFFbGVtZW50IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNDRF9OT1RfRU5BQkxFRCA9IC8vIGFyZzowCisgICAgICAgICJTQ0RfTk9UX0VOQUJMRUQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX1NDRF9FVkFMID0gLy8gYXJnOiAxCisgICAgICAgICJFUlJfU0NEX0VWQUwiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX1NDRF9FVkFMVUFURURfRU1QVFkgPSAvLyBhcmc6MQorICAgICAgICAiRVJSX1NDRF9FVkFMVUFURURfRU1QVFkiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX1NDRF9NQVRDSEVEX01VTFRJUExFX05PREVTID0gLy8gYXJnOjIKKyAgICAgICAgIkVSUl9TQ0RfTUFUQ0hFRF9NVUxUSVBMRV9OT0RFUyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfU0NEX01BVENIRURfTVVMVElQTEVfTk9ERVNfRklSU1QgPSAvLyBhcmc6MQorICAgICAgICAiRVJSX1NDRF9NQVRDSEVEX01VTFRJUExFX05PREVTX0ZJUlNUIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9TQ0RfTUFUQ0hFRF9NVUxUSVBMRV9OT0RFU19TRUNPTkQgPSAvLyBhcmc6MQorICAgICAgICAiRVJSX1NDRF9NQVRDSEVEX01VTFRJUExFX05PREVTX1NFQ09ORCI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX05PREVfSVNfTk9UX0VMRU1FTlQgPSAvLyBhcmc6MAogICAgICAgICAiSW50ZXJuYWxpemVyLkNvbnRleHROb2RlSXNOb3RFbGVtZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0NPTlRFWFRfTk9ERV9TUEVDSUZJRUQgPSAvLyBhcmc6MAotICAgICAgICAgICAgIkludGVybmFsaXplci5Ob0NvbnRleHROb2RlU3BlY2lmaWVkIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9JTkNPUlJFQ1RfVkVSU0lPTiA9IC8vIGFyZzowCiAgICAgICAgICJJbnRlcm5hbGl6ZXIuSW5jb3JyZWN0VmVyc2lvbiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfVkVSU0lPTl9OT1RfRk9VTkQgPSAvLyBhcmc6MApAQCAtNjUsNiArNzUsOCBAQAogICAgICAgICAiSW50ZXJuYWxpemVyLk9ycGhhbmVkQ3VzdG9taXphdGlvbiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfVU5BQkxFX1RPX1BBUlNFID0gLy8gYXJnOjIKICAgICAgICAgIkFic3RyYWN0UmVmZXJlbmNlRmluZGVySW1wbC5VbmFibGVUb1BhcnNlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9GSUxFTkFNRV9JU19OT1RfVVJJID0gLy8gYXJnOjAKKyAgICAgICAgIkVSUl9GSUxFTkFNRV9JU19OT1RfVVJJIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9HRU5FUkFMX1NDSEVNQV9DT1JSRUNUTkVTU19FUlJPUiA9IC8vIGFyZzoxCiAgICAgICAgICJFUlJfR0VORVJBTF9TQ0hFTUFfQ09SUkVDVE5FU1NfRVJST1IiOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9OYW1lc3BhY2VDb250ZXh0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9OYW1lc3BhY2VDb250ZXh0SW1wbC5qYXZhCmluZGV4IGYzMGE1NTAuLmJjNmQ1MTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvTmFtZXNwYWNlQ29udGV4dEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL05hbWVzcGFjZUNvbnRleHRJbXBsLmphdmEKQEAgLTIsNiArMiwzMiBAQAogICogcmVzZXJ2ZWQgY29tbWVudCBibG9jawogICogRE8gTk9UIFJFTU9WRSBPUiBBTFRFUiEKICAqLworLyoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqCisgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KKyAqLwogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuaW50ZXJuYWxpemVyOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpAQCAtNDUsNiArNzEsNyBAQAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgTm9kZSBwYXJlbnQgPSBlOwogICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeENvbG9uID0gcHJlZml4ICsgJzonOwogCiAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCJ4bWwiKSkgewogICAgICAgICAgICAgbmFtZXNwYWNlID0gV2VsbEtub3duTmFtZXNwYWNlLlhNTF9OQU1FU1BBQ0VfVVJJOwpAQCAtNTUsNyArODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiAoKCh0eXBlID0gcGFyZW50LmdldE5vZGVUeXBlKCkpID09IE5vZGUuRUxFTUVOVF9OT0RFKQogICAgICAgICAgICAgICAgICAgICB8fCAodHlwZSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5nZXROb2RlTmFtZSgpLmluZGV4T2YocHJlZml4ICsgJzonKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmdldE5vZGVOYW1lKCkuc3RhcnRzV2l0aChwcmVmaXhDb2xvbikpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldE5hbWVzcGFjZVVSSSgpOwogICAgICAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgbm5tID0gcGFyZW50LmdldEF0dHJpYnV0ZXMoKTsKIApAQCAtODEsNiArMTA4LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmKHByZWZpeC5lcXVhbHMoIiIpKQorICAgICAgICAgICAgcmV0dXJuICIiOyAgLy8gZGVmYXVsdCBuYW1lc3BhY2UKICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvU0NEQmFzZWRCaW5kaW5nU2V0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL1NDREJhc2VkQmluZGluZ1NldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDg3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL1NDREJhc2VkQmluZGluZ1NldC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5pbnRlcm5hbGl6ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVySGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5WYWxpZGF0b3JIYW5kbGVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5TQVhQYXJzZUV4Y2VwdGlvbjI7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuRXJyb3JSZWNlaXZlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJRGVjbGFyYXRpb247CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mby5CaW5kSW5mbzsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsLkZvcmtDb250ZW50SGFuZGxlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsLkRPTVV0aWxzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uU0NEOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBbm5vdGF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wb25lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1NjaGVtYVNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlVubWFyc2hhbGxlckltcGw7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBTZXQgb2YgYmluZGluZyBub2RlcyB0aGF0IGhhdmUgdGFyZ2V0IG5vZGVzIHNwZWNpZmllZCB2aWEgU0NELgorICoKKyAqIFRoaXMgaXMgcGFyc2VkIGR1cmluZyB7QGxpbmsgSW50ZXJuYWxpemVyfSB3b3JrcyBvbiB0aGUgdHJlZSwKKyAqIGJ1dCBhcHBseWluZyB0aGlzIGhhcyB0byB3YWl0IGZvciB7QGxpbmsgWFNTY2hlbWFTZXR9IHRvIGJlIHBhcnNlZC4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAc2VlIFNDRAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU0NEQmFzZWRCaW5kaW5nU2V0IHsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIHRhcmdldCBzY2hlbWEgY29tcG9uZW50IG9mIHRoZQorICAgICAqIGN1c3RvbWl6YXRpb24gaWRlbnRpZmllZCBieSBTQ0QuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgICAgICovCisgICAgZmluYWwgY2xhc3MgVGFyZ2V0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNDRHMgY2FuIGJlIHNwZWNpZmllZCB2aWEgbXVsdGlwbGUgc3RlcHMsIGxpa2U6CisgICAgICAgICAqCisgICAgICAgICAqIDx4bXA+CisgICAgICAgICAqIDxiaW5kaW5ncyBzY2Q9ImZvby9iYXIiPgorICAgICAgICAgKiAgIDxiaW5kaW5ncyBzY2Q9InpvdC94eXoiPgorICAgICAgICAgKiA8L3htcD4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBmaWVsZCBhbmQge0BsaW5rICNuZXh0U2libGluZ30gZm9ybSBhIHNpbmdsZS1saW5rZWQgbGlzdCB0aGF0CisgICAgICAgICAqIHJlcHJlc2VudCB0aGUgY2hpbGRyZW4gdGhhdCBzaGFsbCBiZSBldmFsdWF0ZWQgd2l0aGluIHRoaXMgdGFyZ2V0LgorICAgICAgICAgKiBUaGluayBvZiBpdCBhcyB7QGNvZGUgTGlzdDxUYXJnZXQ+fS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgVGFyZ2V0IGZpcnN0Q2hpbGQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGFyZ2V0IG5leHRTaWJsaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21waWxlZCBTQ0QuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIFNDRCBzY2Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBlbGVtZW50IG9uIHdoaWNoIFNDRCB3YXMgZm91bmQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIEVsZW1lbnQgc3JjOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kaW5ncyB0aGF0IGFwcGx5IHRvIHRoaXMgU0NELgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEVsZW1lbnQ+IGJpbmRpbmdzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOworCisgICAgICAgIHByaXZhdGUgVGFyZ2V0KFRhcmdldCBwYXJlbnQsIEVsZW1lbnQgc3JjLCBTQ0Qgc2NkKSB7CisgICAgICAgICAgICBpZihwYXJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gdG9wTGV2ZWw7CisgICAgICAgICAgICAgICAgdG9wTGV2ZWwgPSB0aGlzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gcGFyZW50LmZpcnN0Q2hpbGQ7CisgICAgICAgICAgICAgICAgcGFyZW50LmZpcnN0Q2hpbGQgPSB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5zcmMgPSBzcmM7CisgICAgICAgICAgICB0aGlzLnNjZCA9IHNjZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3IGJpbmRpbmcgZGVjbGFyYXRpb24gdG8gYmUgYXNzb2NpYXRlZCB0byB0aGUgc2NoZW1hIGNvbXBvbmVudAorICAgICAgICAgKiBpZGVudGlmaWVkIGJ5IHtAbGluayAjc2NkfS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkQmluaWRuZyhFbGVtZW50IGJpbmRpbmcpIHsKKyAgICAgICAgICAgIGJpbmRpbmdzLmFkZChiaW5kaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBsaWVzIGJpbmRpbmdzIHRvIHRoZSBzY2hlbWEgY29tcG9uZW50IGZvciB0aGlzIGFuZCBpdHMgc2libGluZ3MuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXBwbHlBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWFNDb21wb25lbnQ+IGNvbnRleHROb2RlKSB7CisgICAgICAgICAgICBmb3IoIFRhcmdldCBzZWxmPXRoaXM7IHNlbGYhPW51bGw7IHNlbGY9c2VsZi5uZXh0U2libGluZyApCisgICAgICAgICAgICAgICAgc2VsZi5hcHBseShjb250ZXh0Tm9kZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXBwbGllcyBiaW5kaW5ncyB0byB0aGUgc2NoZW1hIGNvbXBvbmVudCBmb3IganVzdCB0aGlzIG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYXBwbHkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWFNDb21wb25lbnQ+IGNvbnRleHROb2RlKSB7CisgICAgICAgICAgICAvLyBhcHBseSB0aGUgU0NELi4uCisgICAgICAgICAgICBDb2xsZWN0aW9uPFhTQ29tcG9uZW50PiBjaGlsZE5vZGVzID0gc2NkLnNlbGVjdChjb250ZXh0Tm9kZSk7CisgICAgICAgICAgICBpZihjaGlsZE5vZGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIG5vIG5vZGUgbWF0Y2hlZAorICAgICAgICAgICAgICAgIGlmKHNyYy5nZXRBdHRyaWJ1dGVOb2RlKCJpZi1leGlzdHMiKSE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGF0dHJpYnV0ZSBleGlzdHMsIGl0J3Mgbm90IGFuIGVycm9yIGlmIFNDRCBkaWRuJ3QgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXBvcnRFcnJvciggc3JjLCBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX1NDRF9FVkFMVUFURURfRU1QVFksc2NkKSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoZmlyc3RDaGlsZCE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGlsZC5hcHBseUFsbChjaGlsZE5vZGVzKTsKKworICAgICAgICAgICAgaWYoIWJpbmRpbmdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIGVycm9yIHRvIG1hdGNoIG1vcmUgdGhhbiBvbmUgY29tcG9uZW50cworICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBpdHIgPSBjaGlsZE5vZGVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgWFNDb21wb25lbnQgdGFyZ2V0ID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZihpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKCBzcmMsIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5FUlJfU0NEX01BVENIRURfTVVMVElQTEVfTk9ERVMsc2NkLGNoaWxkTm9kZXMuc2l6ZSgpKSApOworICAgICAgICAgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKCB0YXJnZXQuZ2V0TG9jYXRvcigpLCBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX1NDRF9NQVRDSEVEX01VTFRJUExFX05PREVTX0ZJUlNUKSApOworICAgICAgICAgICAgICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKCBpdHIubmV4dCgpLmdldExvY2F0b3IoKSwgTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLkVSUl9TQ0RfTUFUQ0hFRF9NVUxUSVBMRV9OT0RFU19TRUNPTkQpICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gYXBwbHkgYmluZGluZ3MgdG8gdGhlIHRhcmdldAorICAgICAgICAgICAgICAgIGZvciAoRWxlbWVudCBiaW5kaW5nIDogYmluZGluZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChFbGVtZW50IGl0ZW0gOiBET01VdGlscy5nZXRDaGlsZEVsZW1lbnRzKGJpbmRpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gaXRlbS5nZXRMb2NhbE5hbWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJiaW5kaW5ncyIuZXF1YWxzKGxvY2FsTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgLy8gdGhpcyBzaG91bGQgYmUgYWxyZWFkeSBpbiBUYXJnZXQuYmluZGluZ3Mgb2Ygc29tZSBTcGVjVmVyc2lvbi4KKworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRE9NRm9yZXN0U2Nhbm5lcihmb3Jlc3QpLnNjYW4oaXRlbSxsb2FkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJRGVjbGFyYXRpb24gZGVjbCA9IChCSURlY2xhcmF0aW9uKXVubWFyc2hhbGxlci5nZXRSZXN1bHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIGJpbmRpbmcgdG8gdGhlIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTQW5ub3RhdGlvbiBhbm4gPSB0YXJnZXQuZ2V0QW5ub3RhdGlvbih0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kSW5mbyBiaSA9IChCaW5kSW5mbylhbm4uZ2V0QW5ub3RhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJpPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpID0gbmV3IEJpbmRJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubi5zZXRBbm5vdGF0aW9uKGJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmkuYWRkRGVjbChkZWNsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVycm9yIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHZhbGlkYXRpb24gZGlkbid0IGZhaWwsIHRoZW4gdW5tYXJzaGFsbGluZyBjYW4ndCBnbyB3cm9uZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVGFyZ2V0IHRvcExldmVsOworCisgICAgLyoqCisgICAgICogVGhlIGZvcmVzdCB3aGVyZSBiaW5kaW5nIGVsZW1lbnRzIGNhbWUgZnJvbS4gTmVlZGVkIHRvIHJlcG9ydCBsaW5lIG51bWJlcnMgZm9yIGVycm9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIERPTUZvcmVzdCBmb3Jlc3Q7CisKKworICAgIC8vIHZhcmlhYmxlcyB1c2VkIG9ubHkgZHVyaW5nIHRoZSBhcHBseSBtZXRob2QKKyAgICAvLworICAgIHByaXZhdGUgRXJyb3JSZWNlaXZlciBlcnJvclJlY2VpdmVyOworICAgIHByaXZhdGUgVW5tYXJzaGFsbGVySGFuZGxlciB1bm1hcnNoYWxsZXI7CisgICAgcHJpdmF0ZSBGb3JrQ29udGVudEhhbmRsZXIgbG9hZGVyOyAvLyB1bm1hcnNoYWxsZXIrdmFsaWRhdG9yCisKKyAgICBTQ0RCYXNlZEJpbmRpbmdTZXQoRE9NRm9yZXN0IGZvcmVzdCkgeworICAgICAgICB0aGlzLmZvcmVzdCA9IGZvcmVzdDsKKyAgICB9CisKKyAgICBUYXJnZXQgY3JlYXRlTmV3VGFyZ2V0KFRhcmdldCBwYXJlbnQsIEVsZW1lbnQgc3JjLCBTQ0Qgc2NkKSB7CisgICAgICAgIHJldHVybiBuZXcgVGFyZ2V0KHBhcmVudCxzcmMsc2NkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBsaWVzIHRoZSBhZGRpdGlvbmFsIGJpbmRpbmcgY3VzdG9taXphdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwbHkoWFNTY2hlbWFTZXQgc2NoZW1hLCBFcnJvclJlY2VpdmVyIGVycm9yUmVjZWl2ZXIpIHsKKyAgICAgICAgaWYodG9wTGV2ZWwhPW51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JSZWNlaXZlciA9IGVycm9yUmVjZWl2ZXI7CisgICAgICAgICAgICBVbm1hcnNoYWxsZXJJbXBsIHUgPSBCaW5kSW5mby5nZXRKQVhCQ29udGV4dCgpLmNyZWF0ZVVubWFyc2hhbGxlcigpOworICAgICAgICAgICAgdGhpcy51bm1hcnNoYWxsZXIgPSB1LmdldFVubWFyc2hhbGxlckhhbmRsZXIoKTsKKyAgICAgICAgICAgIFZhbGlkYXRvckhhbmRsZXIgdiA9IEJpbmRJbmZvLmJpbmRpbmdGaWxlU2NoZW1hLm5ld1ZhbGlkYXRvcigpOworICAgICAgICAgICAgdi5zZXRFcnJvckhhbmRsZXIoZXJyb3JSZWNlaXZlcik7CisgICAgICAgICAgICBsb2FkZXIgPSBuZXcgRm9ya0NvbnRlbnRIYW5kbGVyKHYsdW5tYXJzaGFsbGVyKTsKKworICAgICAgICAgICAgdG9wTGV2ZWwuYXBwbHlBbGwoc2NoZW1hLmdldFNjaGVtYXMoKSk7CisKKyAgICAgICAgICAgIHRoaXMubG9hZGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMudW5tYXJzaGFsbGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JSZWNlaXZlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0RXJyb3IoIEVsZW1lbnQgZXJyb3JTb3VyY2UsIFN0cmluZyBmb3JtYXR0ZWRNc2cgKSB7CisgICAgICAgIHJlcG9ydEVycm9yKCBlcnJvclNvdXJjZSwgZm9ybWF0dGVkTXNnLCBudWxsICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydEVycm9yKCBFbGVtZW50IGVycm9yU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdHRlZE1zZywgRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbiApIHsKKworICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBlID0gbmV3IFNBWFBhcnNlRXhjZXB0aW9uMiggZm9ybWF0dGVkTXNnLAorICAgICAgICAgICAgZm9yZXN0LmxvY2F0b3JUYWJsZS5nZXRTdGFydExvY2F0aW9uKGVycm9yU291cmNlKSwKKyAgICAgICAgICAgIG5lc3RlZEV4Y2VwdGlvbiApOworICAgICAgICBlcnJvclJlY2VpdmVyLmVycm9yKGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvVmVyc2lvbkNoZWNrZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvVmVyc2lvbkNoZWNrZXIuamF2YQppbmRleCAxMTcwZDQ3Li5mMDIyNDUxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL1ZlcnNpb25DaGVja2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9WZXJzaW9uQ2hlY2tlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDkgKzIyLDEyIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplcjsKIAoraW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5Db25zdDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CkBAIC0xMTgsNyArMTIxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGlmIHByZXNlbnQsIHRoZSB2YWx1ZSBtdXN0IGJlIGVpdGhlciAxLjAgb3IgMi4wCi0gICAgICAgIGlmKCB2ZXJzaW9uIT1udWxsICYmICF2ZXJzaW9uLmVxdWFscygiMS4wIikgJiYgIXZlcnNpb24uZXF1YWxzKCIyLjAiKSApIHsKKyAgICAgICAgaWYoIHZlcnNpb24hPW51bGwgJiYgIVZFUlNJT05TLmNvbnRhaW5zKHZlcnNpb24pICkgewogICAgICAgICAgICAgU0FYUGFyc2VFeGNlcHRpb24gZSA9IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX0lOQ09SUkVDVF9WRVJTSU9OKSxyb290VGFnU3RhcnQpOwogICAgICAgICAgICAgZ2V0RXJyb3JIYW5kbGVyKCkuZXJyb3IoZSk7CkBAIC0xMzAsNCArMTMzLDYgQEAKICAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBWRVJTSU9OUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgiMS4wIiwiMi4wIiwiMi4xIikpOworCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL1doaXRlc3BhY2VTdHJpcHBlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9XaGl0ZXNwYWNlU3RyaXBwZXIuamF2YQppbmRleCBjNTU4MTNkLi5mOGZlOTZjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL1doaXRlc3BhY2VTdHJpcHBlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9pbnRlcm5hbGl6ZXIvV2hpdGVzcGFjZVN0cmlwcGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTAgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpJElkOiBXaGl0ZXNwYWNlU3RyaXBwZXIuamF2YSx2IDEuMiAyMDA1LzA0LzI5IDE5OjU2OjU3IGtvaHN1a2UgRXhwICQKKyAqLworCiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLmludGVybmFsaXplcjsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL2ludGVybmFsaXplci9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL3BhY2thZ2UuaHRtbAppbmRleCAyNTliNGZmLi41YjlkNjY1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvaW50ZXJuYWxpemVyL3BhY2thZ2UuaHRtbApAQCAtMSArMSwyNSBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGJvZHk+PHA+aW50ZXJuYWxpemF0aW9uIG9mIGV4dGVybmFsIGJpbmRpbmcgZmlsZXMgYW5kICZsdDtqYXhiOmJpbmRpbmdzPiBjdXN0b21pemF0aW9ucy48L3A+PC9ib2R5PgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9wYWNrYWdlLmh0bWwKaW5kZXggZDM1NWJjOC4uZDBkYTRmZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcGFja2FnZS5odG1sCkBAIC0xICsxLDI1IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8Ym9keT48cD5Gcm9udC1lbmQgdGhhdCByZWFkcyBzY2hlbWEocykgYW5kIHByb2R1Y2UgQkdNLjwvcD48L2JvZHk+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9CaW5kU3R5bGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0JpbmRTdHlsZS5qYXZhCmluZGV4IDYzZjIzYjcuLjlkNWEzZGYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0JpbmRTdHlsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0JpbmRTdHlsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIucmVsYXhuZzsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9Db250ZW50TW9kZWxCaW5kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0NvbnRlbnRNb2RlbEJpbmRlci5qYXZhCmluZGV4IDUzZmQzZjguLjg4N2IxMjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0NvbnRlbnRNb2RlbEJpbmRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0NvbnRlbnRNb2RlbEJpbmRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIucmVsYXhuZzsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CkBAIC0xMTYsNyArMTE1LDcgQEAKIAogICAgICAgICBDQXR0cmlidXRlUHJvcGVydHlJbmZvIGFwID0gbmV3IENBdHRyaWJ1dGVQcm9wZXJ0eUluZm8oCiAgICAgICAgICAgIGNhbGNOYW1lKHApLCBudWxsLG51bGwvKlRPRE8qLywgcC5nZXRMb2NhdGlvbigpLCBuYW1lLAotICAgICAgICAgICAgICAgIHAuZ2V0Q2hpbGQoKS5hY2NlcHQoY29tcGlsZXIudHlwZVVzZUJpbmRlciksCisgICAgICAgICAgICAgICAgcC5nZXRDaGlsZCgpLmFjY2VwdChjb21waWxlci50eXBlVXNlQmluZGVyKSwgbnVsbCwKICAgICAgICAgICAgICAgICAhaW5zaWRlT3B0aW9uYWwpOwogICAgICAgICBjbGF6ei5hZGRQcm9wZXJ0eShhcCk7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0RhdGF0eXBlTGliLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9EYXRhdHlwZUxpYi5qYXZhCmluZGV4IDhhYWJlNTUuLjM2MzMyNTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0RhdGF0eXBlTGliLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3JlbGF4bmcvRGF0YXR5cGVMaWIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnJlbGF4bmc7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL0RlZmluZUZpbmRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3JlbGF4bmcvRGVmaW5lRmluZGVyLmphdmEKaW5kZXggMzJmMjg2MS4uZjU4MjNkZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3JlbGF4bmcvRGVmaW5lRmluZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3JlbGF4bmcvRGVmaW5lRmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5yZWxheG5nOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9OYW1lQ2FsY3VsYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3JlbGF4bmcvTmFtZUNhbGN1bGF0b3IuamF2YQppbmRleCBlNDVmZWNmLi44MDdiYTJhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9OYW1lQ2FsY3VsYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL05hbWVDYWxjdWxhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5yZWxheG5nOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQuRFBhdHRlcm5XYWxrZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9SRUxBWE5HQ29tcGlsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1JFTEFYTkdDb21waWxlci5qYXZhCmluZGV4IGM1MzJlMzcuLjdhN2UwYzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1JFTEFYTkdDb21waWxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1JFTEFYTkdDb21waWxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIucmVsYXhuZzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xMTIsNyArMTExLDcgQEAKICAgICBwdWJsaWMgUkVMQVhOR0NvbXBpbGVyKERQYXR0ZXJuIGdyYW1tYXIsIEpDb2RlTW9kZWwgY29kZU1vZGVsLCBPcHRpb25zIG9wdHMpIHsKICAgICAgICAgdGhpcy5ncmFtbWFyID0gZ3JhbW1hcjsKICAgICAgICAgdGhpcy5vcHRzID0gb3B0czsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBNb2RlbChvcHRzLGNvZGVNb2RlbCwgTmFtZUNvbnZlcnRlci5zbWFydCxvcHRzLmNsYXNzTmFtZUFsbG9jYXRvcik7CisgICAgICAgIHRoaXMubW9kZWwgPSBuZXcgTW9kZWwob3B0cyxjb2RlTW9kZWwsIE5hbWVDb252ZXJ0ZXIuc21hcnQsb3B0cy5jbGFzc05hbWVBbGxvY2F0b3IsbnVsbCk7CiAKICAgICAgICAgZGF0YXR5cGVzLnB1dCgiIixEYXRhdHlwZUxpYi5CVUlMVElOKTsKICAgICAgICAgZGF0YXR5cGVzLnB1dChXZWxsS25vd25OYW1lc3BhY2VzLlhNTF9TQ0hFTUFfREFUQVRZUEVTLERhdGF0eXBlTGliLlhNTFNDSEVNQSk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9SRUxBWE5HSW50ZXJuYWxpemF0aW9uTG9naWMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1JFTEFYTkdJbnRlcm5hbGl6YXRpb25Mb2dpYy5qYXZhCmluZGV4IDE4ZTdlZTguLjUyOTFkZjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1JFTEFYTkdJbnRlcm5hbGl6YXRpb25Mb2dpYy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1JFTEFYTkdJbnRlcm5hbGl6YXRpb25Mb2dpYy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIucmVsYXhuZzsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5Db25zdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1Jhd1R5cGVTZXRCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9SYXdUeXBlU2V0QnVpbGRlci5qYXZhCmluZGV4IDA0YTcwNzYuLjA1NmI1NDEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1Jhd1R5cGVTZXRCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3JlbGF4bmcvUmF3VHlwZVNldEJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnJlbGF4bmc7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTEzMSw3ICsxMzAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIENUeXBlUmVmIHRvVHlwZVJlZihDRWxlbWVudFByb3BlcnR5SW5mbyBlcCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDVHlwZVJlZihjaSxjaS5nZXRFbGVtZW50TmFtZSgpLGZhbHNlLG51bGwpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDVHlwZVJlZihjaSxjaS5nZXRFbGVtZW50TmFtZSgpLGNpLmdldFR5cGVOYW1lKCksZmFsc2UsbnVsbCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9UeXBlUGF0dGVybkJpbmRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3JlbGF4bmcvVHlwZVBhdHRlcm5CaW5kZXIuamF2YQppbmRleCAxOGQ2ZGE0Li44ZTU4NTY1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9UeXBlUGF0dGVybkJpbmRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1R5cGVQYXR0ZXJuQmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5yZWxheG5nOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9UeXBlVXNlQmluZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIvcmVsYXhuZy9UeXBlVXNlQmluZGVyLmphdmEKaW5kZXggOGFiODgwZC4uM2RmYzNlMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3JlbGF4bmcvVHlwZVVzZUJpbmRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci9yZWxheG5nL1R5cGVVc2VCaW5kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnJlbGF4bmc7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQnVpbHRpbkxlYWZJbmZvOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9BYnN0cmFjdGlmaWVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0Fic3RyYWN0aWZpZXIuamF2YQppbmRleCA4OTUxMWU1Li45NDZkNzM5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0Fic3RyYWN0aWZpZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0Fic3RyYWN0aWZpZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwxMCArMjIsOCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRWxlbWVudERlY2w7CkBAIC00MCw4ICszOCw4IEBACiAgICAgICAgIHN1cGVyKGNvcmUpOwogICAgIH0KIAotICAgIHB1YmxpYyBDQ2xhc3NJbmZvIGNvbXBsZXhUeXBlKFhTQ29tcGxleFR5cGUgeHMpIHsKLSAgICAgICAgQ0NsYXNzSW5mbyBjaSA9IChDQ2xhc3NJbmZvKXN1cGVyLmNvbXBsZXhUeXBlKHhzKTsKKyAgICBwdWJsaWMgQ0VsZW1lbnQgY29tcGxleFR5cGUoWFNDb21wbGV4VHlwZSB4cykgeworICAgICAgICBDRWxlbWVudCBjaSA9IHN1cGVyLmNvbXBsZXhUeXBlKHhzKTsKICAgICAgICAgaWYoY2khPW51bGwgJiYgeHMuaXNBYnN0cmFjdCgpKQogICAgICAgICAgICAgY2kuc2V0QWJzdHJhY3QoKTsKICAgICAgICAgcmV0dXJuIGNpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CR01CdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JHTUJ1aWxkZXIuamF2YQppbmRleCBmM2MyZjNmLi5iNmU1MDQwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JHTUJ1aWxkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JHTUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zOSw2ICszOCw3IEBACiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkNvZGVNb2RlbDsKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5mbXQuSlRleHRGaWxlOwogaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuRXJyb3JSZWNlaXZlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5PcHRpb25zOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLmdlbmVyYXRvci5iZWFuLmZpZWxkLkZpZWxkUmVuZGVyZXJGYWN0b3J5OwpAQCAtNTYsMTAgKzU2LDEwIEBACiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMudXRpbC5FcnJvclJlY2VpdmVyRmlsdGVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXJJbXBsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLmltcGwuTmFtZUNvbnZlcnRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLldlbGxLbm93bk5hbWVzcGFjZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQW5ub3RhdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlVXNlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wb25lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0RlY2xhcmF0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNQYXJ0aWNsZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTU2NoZW1hOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNTY2hlbWFTZXQ7CkBAIC05MiwxMyArOTIsMTMgQEAKIAogICAgICAgICAgICAgUmluZy5hZGQoWFNTY2hlbWFTZXQuY2xhc3MsX3NjaGVtYXMpOwogICAgICAgICAgICAgUmluZy5hZGQoY29kZU1vZGVsKTsKLSAgICAgICAgICAgIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKG9wdHMsIGNvZGVNb2RlbCwgbnVsbC8qc2V0IGxhdGVyKi8sIG9wdHMuY2xhc3NOYW1lQWxsb2NhdG9yKTsKKyAgICAgICAgICAgIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKG9wdHMsIGNvZGVNb2RlbCwgbnVsbC8qc2V0IGxhdGVyKi8sIG9wdHMuY2xhc3NOYW1lQWxsb2NhdG9yLCBfc2NoZW1hcyk7CiAgICAgICAgICAgICBSaW5nLmFkZChtb2RlbCk7CiAgICAgICAgICAgICBSaW5nLmFkZChFcnJvclJlY2VpdmVyLmNsYXNzLGVmKTsKICAgICAgICAgICAgIFJpbmcuYWRkKENvZGVNb2RlbENsYXNzRmFjdG9yeS5jbGFzcyxuZXcgQ29kZU1vZGVsQ2xhc3NGYWN0b3J5KGVmKSk7CiAKICAgICAgICAgICAgIEJHTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCR01CdWlsZGVyKG9wdHMuZGVmYXVsdFBhY2thZ2Usb3B0cy5kZWZhdWx0UGFja2FnZTIsCi0gICAgICAgICAgICAgICAgb3B0cy5jb21wYXRpYmlsaXR5TW9kZT09T3B0aW9ucy5FWFRFTlNJT04sb3B0cy5nZXRGaWVsZFJlbmRlcmVyRmFjdG9yeSgpKTsKKyAgICAgICAgICAgICAgICBvcHRzLmlzRXh0ZW5zaW9uTW9kZSgpLG9wdHMuZ2V0RmllbGRSZW5kZXJlckZhY3RvcnkoKSk7CiAgICAgICAgICAgICBidWlsZGVyLl9idWlsZCgpOwogCiAgICAgICAgICAgICBpZihlZi5oYWRFcnJvcigpKSAgIHJldHVybiBudWxsOwpAQCAtMTc5LDYgKzE3OSw5IEBACiAgICAgICAgIGZvciggWFNTY2hlbWEgcyA6IHNjaGVtYXMuZ2V0U2NoZW1hcygpICkgewogICAgICAgICAgICAgQmluZEluZm8gYmkgPSBnZXRCaW5kSW5mbyhzKTsKIAorICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZ2xvYmFsIGN1c3RvbWl6YXRpb25zCisgICAgICAgICAgICBtb2RlbC5nZXRDdXN0b21pemF0aW9ucygpLmFkZEFsbChiaS50b0N1c3RvbWl6YXRpb25MaXN0KCkpOworCiAgICAgICAgICAgICBCSUdsb2JhbEJpbmRpbmcgZ2IgPSBiaS5nZXQoQklHbG9iYWxCaW5kaW5nLmNsYXNzKTsKICAgICAgICAgICAgIGlmKGdiPT1udWxsKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjc2LDIyICsyNzksMjcgQEAKICAgICAgICAgU2ltcGxlVHlwZUJ1aWxkZXIgc3RiID0gUmluZy5nZXQoU2ltcGxlVHlwZUJ1aWxkZXIuY2xhc3MpOwogCiAgICAgICAgIGZvciggWFNTY2hlbWEgcyA6IFJpbmcuZ2V0KFhTU2NoZW1hU2V0LmNsYXNzKS5nZXRTY2hlbWFzKCkgKSB7CisgICAgICAgICAgICBCSVNjaGVtYUJpbmRpbmcgc2IgPSBnZXRCaW5kSW5mbyhzKS5nZXQoQklTY2hlbWFCaW5kaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgaWYoc2IhPW51bGwgJiYgIXNiLm1hcCkgeworICAgICAgICAgICAgICAgIHNiLm1hcmtBc0Fja25vd2xlZGdlZCgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvLyBubyBtYXBwaW5nIGZvciB0aGlzIHBhY2thZ2UKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZ2V0Q2xhc3NTZWxlY3RvcigpLnB1c2hDbGFzc1Njb3BlKCBuZXcgQ0NsYXNzSW5mb1BhcmVudC5QYWNrYWdlKAogICAgICAgICAgICAgICAgIGdldENsYXNzU2VsZWN0b3IoKS5nZXRQYWNrYWdlKHMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSApOwogCi0gICAgICAgICAgICBpZighcy5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoV2VsbEtub3duTmFtZXNwYWNlLlhNTF9TQ0hFTUEpKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tNdWx0aXBsZVNjaGVtYUJpbmRpbmdzKHMpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NQYWNrYWdlSmF2YWRvYyhzKTsKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZShzLmdldEF0dEdyb3VwRGVjbHMoKSk7Ci0gICAgICAgICAgICAgICAgcG9wdWxhdGUocy5nZXRBdHRyaWJ1dGVEZWNscygpKTsKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZShzLmdldEVsZW1lbnREZWNscygpKTsKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZShzLmdldE1vZGVsR3JvdXBEZWNscygpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrTXVsdGlwbGVTY2hlbWFCaW5kaW5ncyhzKTsKKyAgICAgICAgICAgIHByb2Nlc3NQYWNrYWdlSmF2YWRvYyhzKTsKKyAgICAgICAgICAgIHBvcHVsYXRlKHMuZ2V0QXR0R3JvdXBEZWNscygpLHMpOworICAgICAgICAgICAgcG9wdWxhdGUocy5nZXRBdHRyaWJ1dGVEZWNscygpLHMpOworICAgICAgICAgICAgcG9wdWxhdGUocy5nZXRFbGVtZW50RGVjbHMoKSxzKTsKKyAgICAgICAgICAgIHBvcHVsYXRlKHMuZ2V0TW9kZWxHcm91cERlY2xzKCkscyk7CiAKICAgICAgICAgICAgIC8vIGZpbGwgaW4gdHlwZVVzZXMKICAgICAgICAgICAgIGZvciAoWFNUeXBlIHQgOiBzLmdldFR5cGVzKCkudmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICBzdGIucmVmZXJlclN0YWNrLnB1c2godCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwudHlwZVVzZXMoKS5wdXQoIG5ldyBRTmFtZSh0LmdldFRhcmdldE5hbWVzcGFjZSgpLHQuZ2V0TmFtZSgpKSwgY3MuYmluZFRvVHlwZSh0KSApOworICAgICAgICAgICAgICAgIG1vZGVsLnR5cGVVc2VzKCkucHV0KCBnZXROYW1lKHQpLCBjcy5iaW5kVG9UeXBlKHQscykgKTsKICAgICAgICAgICAgICAgICBzdGIucmVmZXJlclN0YWNrLnBvcCgpOwogICAgICAgICAgICAgfQogCkBAIC0zMjMsMTAgKzMzMSwxMCBAQAogICAgICAqIENhbGxzIHtAbGluayBDbGFzc1NlbGVjdG9yfSBmb3IgZWFjaCBpdGVtIGluIHRoZSBpdGVyYXRvcgogICAgICAqIHRvIHBvcHVsYXRlIGNsYXNzIGl0ZW1zIGlmIHRoZXJlIGlzIGFueS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGUoIE1hcDxTdHJpbmcsPyBleHRlbmRzIFhTQ29tcG9uZW50PiBjb2wgKSB7CisgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKCBNYXA8U3RyaW5nLD8gZXh0ZW5kcyBYU0NvbXBvbmVudD4gY29sLCBYU1NjaGVtYSBzY2hlbWEgKSB7CiAgICAgICAgIENsYXNzU2VsZWN0b3IgY3MgPSBnZXRDbGFzc1NlbGVjdG9yKCk7CiAgICAgICAgIGZvciggWFNDb21wb25lbnQgc2MgOiBjb2wudmFsdWVzKCkgKQotICAgICAgICAgICAgY3MuYmluZFRvVHlwZShzYyk7CisgICAgICAgICAgICBjcy5iaW5kVG9UeXBlKHNjLHNjaGVtYSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzEsOCArNDc5LDggQEAKICAgICAgKiBJZiB0aGUgY29tcG9uZW50IGlzIG1hcHBlZCB0byBhIHR5cGUsIHRoaXMgbWV0aG9kIG5lZWRzIHRvIHJldHVybiB0cnVlLgogICAgICAqIFNlZSB0aGUgY2hhcnQgYXQgdGhlIGNsYXNzIGphdmFkb2MuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgeWluZyggWFNDb21wb25lbnQgc2MgKSB7Ci0gICAgICAgIGlmKHNjLmFwcGx5KHRvUHVycGxlKT09dHJ1ZSB8fCBnZXRDbGFzc1NlbGVjdG9yKCkuYmluZFRvVHlwZShzYykhPW51bGwpCisgICAgcHVibGljIHZvaWQgeWluZyggWFNDb21wb25lbnQgc2MsIEBOdWxsYWJsZSBYU0NvbXBvbmVudCByZWZlcmVyICkgeworICAgICAgICBpZihzYy5hcHBseSh0b1B1cnBsZSk9PXRydWUgfHwgZ2V0Q2xhc3NTZWxlY3RvcigpLmJpbmRUb1R5cGUoc2MscmVmZXJlcikhPW51bGwpCiAgICAgICAgICAgICBzYy52aXNpdChwdXJwbGUpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzYy52aXNpdChncmVlbik7CkBAIC01MDMsNCArNTExLDQyIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlZkZpbmRlci5nZXRSZWZlcmVyKGMpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFFOYW1lIG9mIHRoZSBkZWNsYXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuIG51bGwKKyAgICAgKiAgICAgIGlmIHRoZSBkZWNsYXJhdGlvbiBpcyBhbm9ueW1vdXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXROYW1lKFhTRGVjbGFyYXRpb24gZGVjbCkgeworICAgICAgICBTdHJpbmcgbG9jYWwgPSBkZWNsLmdldE5hbWUoKTsKKyAgICAgICAgaWYobG9jYWw9PW51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGRlY2wuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksbG9jYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlcml2ZXMgYSBuYW1lIGZyb20gYSBzY2hlbWEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBwcmVmaXgvc3VmZml4IG1vZGlmaWNhdGlvbiBhbmQKKyAgICAgKiBYTUwtdG8tSmF2YSBuYW1lIGNvbnZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgVGhlIGJhc2UgbmFtZS4gVGhpcyBzaG91bGQgYmUgdGhpbmdzIGxpa2UgZWxlbWVudCBuYW1lcworICAgICAqICAgICAgb3IgdHlwZSBuYW1lcy4KKyAgICAgKiBAcGFyYW0gY29tcAorICAgICAqICAgICAgVGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRoZSBiYXNlIG5hbWUgd2FzIHRha2VuLgorICAgICAqICAgICAgVXNlZCB0byBkZXRlcm1pbmUgaG93IG5hbWVzIGFyZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRlcml2ZU5hbWUoIFN0cmluZyBuYW1lLCBYU0NvbXBvbmVudCBjb21wICkgeworICAgICAgICBYU1NjaGVtYSBvd25lciA9IGNvbXAuZ2V0T3duZXJTY2hlbWEoKTsKKworICAgICAgICBuYW1lID0gZ2V0TmFtZUNvbnZlcnRlcigpLnRvQ2xhc3NOYW1lKG5hbWUpOworCisgICAgICAgIGlmKCBvd25lciE9bnVsbCApIHsKKyAgICAgICAgICAgIEJJU2NoZW1hQmluZGluZyBzYiA9IGdldEJpbmRJbmZvKG93bmVyKS5nZXQoQklTY2hlbWFCaW5kaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgaWYoc2IhPW51bGwpICAgIG5hbWUgPSBzYi5tYW5nbGVDbGFzc05hbWUobmFtZSxjb21wKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQmluZEJsdWUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQmluZEJsdWUuamF2YQppbmRleCA2Nzc5MmE5Li44Y2U1MTUxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRCbHVlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CaW5kQmx1ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dEdyb3VwRGVjbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQmluZEdyZWVuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRHcmVlbi5qYXZhCmluZGV4IDFjYzVmMTQuLjY5NTVmMDQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQmluZEdyZWVuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CaW5kR3JlZW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTU3LDE0ICs1NiwxNCBAQAogICAgICAgICAvLyBpbmxpbmUKICAgICAgICAgSXRlcmF0b3IgaXRyID0gY29udC5pdGVyYXRlRGVjbGFyZWRBdHRyaWJ1dGVVc2VzKCk7CiAgICAgICAgIHdoaWxlKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICBidWlsZGVyLnlpbmcoKFhTQXR0cmlidXRlVXNlKWl0ci5uZXh0KCkpOworICAgICAgICAgICAgYnVpbGRlci55aW5nKChYU0F0dHJpYnV0ZVVzZSlpdHIubmV4dCgpLGNvbnQpOwogICAgICAgICBpdHIgPSBjb250Lml0ZXJhdGVBdHRHcm91cHMoKTsKICAgICAgICAgd2hpbGUoaXRyLmhhc05leHQoKSkKLSAgICAgICAgICAgIGJ1aWxkZXIueWluZygoWFNBdHRHcm91cERlY2wpaXRyLm5leHQoKSk7CisgICAgICAgICAgICBidWlsZGVyLnlpbmcoKFhTQXR0R3JvdXBEZWNsKWl0ci5uZXh0KCksY29udCk7CiAKICAgICAgICAgWFNXaWxkY2FyZCB3ID0gY29udC5nZXRBdHRyaWJ1dGVXaWxkY2FyZCgpOwogICAgICAgICBpZih3IT1udWxsKQotICAgICAgICAgICAgYnVpbGRlci55aW5nKHcpOworICAgICAgICAgICAgYnVpbGRlci55aW5nKHcsY29udCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY29tcGxleFR5cGUoWFNDb21wbGV4VHlwZSBjdCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CaW5kUHVycGxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRQdXJwbGUuamF2YQppbmRleCA0YWQxMDNmLi4zNGQ4M2M4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRQdXJwbGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRQdXJwbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwxMyArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0NsYXNzSW5mbzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DRGVmYXVsdFZhbHVlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNQcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuVHlwZVVzZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3M7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLlJpbmc7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mby5CSVByb3BlcnR5OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBdHRHcm91cERlY2w7CkBAIC0xMDMsNyArMTAzLDcgQEAKIAogCiAgICAgcHVibGljIHZvaWQgY29tcGxleFR5cGUoWFNDb21wbGV4VHlwZSBjdCkgewotICAgICAgICBDQ2xhc3NJbmZvIGN0QmVhbiA9IHNlbGVjdG9yLmJpbmRUb1R5cGUoY3QsIGZhbHNlKTsKKyAgICAgICAgQ0NsYXNzIGN0QmVhbiA9IHNlbGVjdG9yLmJpbmRUb1R5cGUoY3QsbnVsbCxmYWxzZSk7CiAgICAgICAgIGlmKGdldEN1cnJlbnRCZWFuKCkhPWN0QmVhbikKICAgICAgICAgICAgIC8vIGluIHNvbWUgY2FzZSBjb21wbGV4IHR5cGUgYW5kIGVsZW1lbnQgYmluZHMgdG8gdGhlIHNhbWUgY2xhc3MKICAgICAgICAgICAgIC8vIGRvbid0IG1ha2UgaXQgaGFzLWEuIEp1c3QgbWFrZSBpdCBpcy1hLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CaW5kUmVkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRSZWQuamF2YQppbmRleCBmYzkyZTMxLi5mMmM4NmE4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRSZWQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRSZWQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5SaW5nOwpAQCAtNzUsNyArNzQsNyBAQAogICAgIHB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFhTRWxlbWVudERlY2wgZSkgewogICAgICAgICBTaW1wbGVUeXBlQnVpbGRlciBzdGIgPSBSaW5nLmdldChTaW1wbGVUeXBlQnVpbGRlci5jbGFzcyk7CiAgICAgICAgIHN0Yi5yZWZlcmVyU3RhY2sucHVzaChlKTsgICAgLy8gcmVmZXJlciBpcyBlbGVtZW50Ci0gICAgICAgIGJ1aWxkZXIueWluZyhlLmdldFR5cGUoKSk7CisgICAgICAgIGJ1aWxkZXIueWluZyhlLmdldFR5cGUoKSxlKTsKICAgICAgICAgc3RiLnJlZmVyZXJTdGFjay5wb3AoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQmluZFllbGxvdy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CaW5kWWVsbG93LmphdmEKaW5kZXggOWZjOWE3NS4uYWYzNWZjNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CaW5kWWVsbG93LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CaW5kWWVsbG93LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0R3JvdXBEZWNsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9CaW5kaW5nQ29tcG9uZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRpbmdDb21wb25lbnQuamF2YQppbmRleCBhODg0NTI3Li4yMzM4Yzk3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRpbmdDb21wb25lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0JpbmRpbmdDb21wb25lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5SaW5nOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9DbGFzc0JpbmRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9DbGFzc0JpbmRlci5qYXZhCmluZGV4IDM5MWQxOTEuLjE2ODMxNDUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQ2xhc3NCaW5kZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0NsYXNzQmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NJbmZvOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9DbGFzc0JpbmRlckZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9DbGFzc0JpbmRlckZpbHRlci5qYXZhCmluZGV4IGFiZTJhYzMuLjRiZmNjMjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQ2xhc3NCaW5kZXJGaWx0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0NsYXNzQmluZGVyRmlsdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DRWxlbWVudDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQ2xhc3NTZWxlY3Rvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9DbGFzc1NlbGVjdG9yLmphdmEKaW5kZXggZGUyNjhkNi4uNDliZTE2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9DbGFzc1NlbGVjdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9DbGFzc1NlbGVjdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKQEAgLTQ0LDYgKzQzLDggQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DRWxlbWVudEluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ1R5cGVJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLlR5cGVVc2U7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0NsYXNzOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNOb25FbGVtZW50OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5SaW5nOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm8uQklQcm9wZXJ0eTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJU2NoZW1hQmluZGluZzsKQEAgLTYzLDEyICs2NCwxMiBAQAogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKIC8qKgotICogTWFuYWdlcyBhc3NvY2lhdGlvbiBiZXR3ZWVuIFhTQ29tcG9uZW50cyBhbmQgZ2VuZXJhdGVkCi0gKiBjb250ZW50IGludGVyZmFjZXMuCisgKiBNYW5hZ2VzIGFzc29jaWF0aW9uIGJldHdlZW4ge0BsaW5rIFhTQ29tcG9uZW50fXMgYW5kIGdlbmVyYXRlZAorICoge0BsaW5rIENUeXBlSW5mb31zLgogICoKICAqIDxwPgotICogQWxsIHRoZSBjb250ZW50IGludGVyZmFjZXMgYXJlIGNyZWF0ZWQsIHJlZ2lzdGVyZWQsIGFuZAotICogbWFpbnRhaW5lZCBpbiB0aGlzIGNsYXNzLgorICogVGhpcyBjbGFzcyBkZXRlcm1pbmVzIHdoaWNoIGNvbXBvbmVudCBpcyBtYXBwZWQgdG8gKG9yIGlzIG5vdCBtYXBwZWQgdG8pCisgKiB3aGF0IHR5cGVzLgogICoKICAqIEBhdXRob3IKICAqICAgICBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKQEAgLTIyOSwxMSArMjMwLDExIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYm91bmQgdG8gYSBjbGFzcy4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQ0VsZW1lbnQgaXNCb3VuZCggWFNFbGVtZW50RGVjbCB4ICkgeworICAgIHB1YmxpYyBmaW5hbCBDRWxlbWVudCBpc0JvdW5kKCBYU0VsZW1lbnREZWNsIHgsIFhTQ29tcG9uZW50IHJlZmVyZXIgKSB7CiAgICAgICAgIENFbGVtZW50SW5mbyByID0gYm91bmRFbGVtZW50cy5nZXQoeCk7CiAgICAgICAgIGlmKHIhPW51bGwpCiAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgcmV0dXJuIGJpbmRUb1R5cGUoeCk7CisgICAgICAgIHJldHVybiBiaW5kVG9UeXBlKHgscmVmZXJlcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDEsMTEgKzI0Miw4IEBACiAgICAgICogSWYgc28sIGJ1aWxkIHRoYXQgdHlwZSBhbmQgcmV0dXJuIHRoYXQgb2JqZWN0LgogICAgICAqIElmIGl0IGlzIG5vdCBiZWluZyBtYXBwZWQgdG8gYSB0eXBlIGl0ZW0sIHJldHVybiBudWxsLgogICAgICAqLwotICAgIHB1YmxpYyBDVHlwZUluZm8gYmluZFRvVHlwZSggWFNDb21wb25lbnQgc2MgKSB7Ci0vLyAgICAgICAgVHlwZVRva2VuIHQgPSBkb21CaW5kZXIuYmluZChzYyk7Ci0vLyAgICAgICAgaWYodCE9bnVsbCkgICAgIHJldHVybiB0OwotLy8gICAgICAgIGVsc2UgICAgICAgICAgICByZXR1cm4gX2JpbmRUb0NsYXNzKHNjLGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIF9iaW5kVG9DbGFzcyhzYyxmYWxzZSk7CisgICAgcHVibGljIENUeXBlSW5mbyBiaW5kVG9UeXBlKCBYU0NvbXBvbmVudCBzYywgWFNDb21wb25lbnQgcmVmZXJlciApIHsKKyAgICAgICAgcmV0dXJuIF9iaW5kVG9DbGFzcyhzYyxyZWZlcmVyLGZhbHNlKTsKICAgICB9CiAKICAgICAvLwpAQCAtMjU0LDM4ICsyNTIsNDAgQEAKICAgICAvLyBhbmQgbWFraW5nIHRoZSBiaW5kVG9UeXBlIGludm9jYXRpb24gbW9yZSB0eXBlIHNhZmUuCiAgICAgLy8KIAotICAgIHB1YmxpYyBDRWxlbWVudCBiaW5kVG9UeXBlKCBYU0VsZW1lbnREZWNsIGUgKSB7Ci0gICAgICAgIHJldHVybiAoQ0VsZW1lbnQpX2JpbmRUb0NsYXNzKGUsZmFsc2UpOworICAgIHB1YmxpYyBDRWxlbWVudCBiaW5kVG9UeXBlKCBYU0VsZW1lbnREZWNsIGUsIFhTQ29tcG9uZW50IHJlZmVyZXIgKSB7CisgICAgICAgIHJldHVybiAoQ0VsZW1lbnQpX2JpbmRUb0NsYXNzKGUscmVmZXJlcixmYWxzZSk7CiAgICAgfQogCi0gICAgcHVibGljIENDbGFzc0luZm8gYmluZFRvVHlwZSggWFNDb21wbGV4VHlwZSB0ICkgewotICAgICAgICByZXR1cm4gYmluZFRvVHlwZSh0LGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ0NsYXNzSW5mbyBiaW5kVG9UeXBlKCBYU0NvbXBsZXhUeXBlIHQsIGJvb2xlYW4gY2Fubm90QmVEZWxheWVkICkgeworICAgIHB1YmxpYyBDQ2xhc3MgYmluZFRvVHlwZSggWFNDb21wbGV4VHlwZSB0LCBYU0NvbXBvbmVudCByZWZlcmVyLCBib29sZWFuIGNhbm5vdEJlRGVsYXllZCApIHsKICAgICAgICAgLy8gdGhpcyBhc3N1bXB0aW9uIHRoYXQgYSBjb21wbGV4IHR5cGUgYWx3YXlzIGJpbmRzIHRvIGEgQ2xhc3NJbmZvCiAgICAgICAgIC8vIGRvZXMgbm90IGhvbGQgZm9yIHhzOmFueVR5cGUgLS0tIG91ciBjdXJyZW50IGFwcHJvYWNoIG9mIGhhbmRsaW5nCiAgICAgICAgIC8vIHRoaXMgaWRpb3N5bmNocmFjeSBpcyB0byBtYWtlIHN1cmUgdGhhdCB4czphbnlUeXBlIGRvZXNuJ3QgdXNlCiAgICAgICAgIC8vIHRoaXMgY29kZXBhdGguCi0gICAgICAgIHJldHVybiAoQ0NsYXNzSW5mbylfYmluZFRvQ2xhc3ModCxjYW5ub3RCZURlbGF5ZWQpOworICAgICAgICByZXR1cm4gKENDbGFzcylfYmluZFRvQ2xhc3ModCxyZWZlcmVyLGNhbm5vdEJlRGVsYXllZCk7CiAgICAgfQogCi0gICAgcHVibGljIFR5cGVVc2UgYmluZFRvVHlwZSggWFNUeXBlIHQgKSB7CisgICAgcHVibGljIFR5cGVVc2UgYmluZFRvVHlwZSggWFNUeXBlIHQsIFhTQ29tcG9uZW50IHJlZmVyZXIgKSB7CiAgICAgICAgIGlmKHQgaW5zdGFuY2VvZiBYU1NpbXBsZVR5cGUpIHsKICAgICAgICAgICAgIHJldHVybiBSaW5nLmdldChTaW1wbGVUeXBlQnVpbGRlci5jbGFzcykuYnVpbGQoKFhTU2ltcGxlVHlwZSl0KTsKICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm4gX2JpbmRUb0NsYXNzKHQsZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIChDTm9uRWxlbWVudClfYmluZFRvQ2xhc3ModCxyZWZlcmVyLGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgcmVhbCBtZWF0IG9mIHRoZSAiYmluZFRvVHlwZSIgY29kZS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBjYW5ub3RCZURlbGF5ZWQKICAgICAgKiAgICAgIGlmIHRoZSBiaW5kaW5nIG9mIHRoZSBib2R5IG9mIHRoZSBjbGFzcyBjYW5ub3QgYmUgZGVmZXJlZAogICAgICAqICAgICAgYW5kIG5lZWRzIHRvIGJlIGRvbmUgaW1tZWRpYXRlbHkuIElmIHRoZSBmbGFnIGlzIGZhbHNlLAogICAgICAqICAgICAgdGhlIGJpbmRpbmcgb2YgdGhlIGJvZHkgd2lsbCBiZSBkb25lIGxhdGVyLCB0byBhdm9pZAogICAgICAqICAgICAgY3ljbGljIGJpbmRpbmcgcHJvYmxlbS4KKyAgICAgKiBAcGFyYW0gcmVmZXJlcgorICAgICAqICAgICAgVGhlIGNvbXBvbmVudCB0aGF0IHJlZmVycyB0byA8dHQ+c2M8L3R0Pi4gVGhpcyBjYW4gYmUgbnVsbCwKKyAgICAgKiAgICAgIGlmIGZpZ3VyaW5nIG91dCB0aGUgcmVmZXJlciBpcyB0b28gaGFyZCwgaW4gd2hpY2ggY2FzZQorICAgICAqICAgICAgdGhlIGVycm9yIG1lc3NhZ2UgbWlnaHQgYmUgbGVzcyB1c2VyIGZyaWVuZGx5LgogICAgICAqLwogICAgIC8vIFRPRE86IGNvbnNpZGVyIGdldHRpbmcgcmlkIG9mICJjYW5ub3RCZURlbGF5ZWQiCi0gICAgQ1R5cGVJbmZvIF9iaW5kVG9DbGFzcyggQE5vdE51bGwgWFNDb21wb25lbnQgc2MsIGJvb2xlYW4gY2Fubm90QmVEZWxheWVkICkgeworICAgIENUeXBlSW5mbyBfYmluZFRvQ2xhc3MoIEBOb3ROdWxsIFhTQ29tcG9uZW50IHNjLCBYU0NvbXBvbmVudCByZWZlcmVyLCBib29sZWFuIGNhbm5vdEJlRGVsYXllZCApIHsKICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBjbGFzcyBpcyBhbHJlYWR5IGJ1aWx0LgogICAgICAgICBpZighYmluZE1hcC5jb250YWluc0tleShzYykpIHsKICAgICAgICAgICAgIC8vIGNyYWV0ZSBhIGJpbmQgdGFzawpAQCAtMzA5LDYgKzMwOSwyMyBAQAogICAgICAgICAgICAgaWYoYmVhbj09bnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIAorICAgICAgICAgICAgLy8gY2FuIHRoaXMgbmFtZXNwYWNlIGdlbmVyYXRlIGEgY2xhc3M/CisgICAgICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIENDbGFzc0luZm8pIHsKKyAgICAgICAgICAgICAgICBYU1NjaGVtYSBvcyA9IHNjLmdldE93bmVyU2NoZW1hKCk7CisgICAgICAgICAgICAgICAgQklTY2hlbWFCaW5kaW5nIHNiID0gYnVpbGRlci5nZXRCaW5kSW5mbyhvcykuZ2V0KEJJU2NoZW1hQmluZGluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYoc2IhPW51bGwgJiYgIXNiLm1hcCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3BlCisgICAgICAgICAgICAgICAgICAgIGdldEVycm9yUmVwb3J0ZXIoKS5lcnJvcihzYy5nZXRMb2NhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5FUlJfUkVGRVJFTkNFX1RPX05PTkVYUE9SVEVEX0NMQVNTLCBzYy5hcHBseSggbmV3IENvbXBvbmVudE5hbWVGdW5jdGlvbigpICkgKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JSZXBvcnRlcigpLmVycm9yKHNiLmdldExvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5FUlJfUkVGRVJFTkNFX1RPX05PTkVYUE9SVEVEX0NMQVNTX01BUF9GQUxTRSwgb3MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocmVmZXJlciE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yUmVwb3J0ZXIoKS5lcnJvcihyZWZlcmVyLmdldExvY2F0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5FUlJfUkVGRVJFTkNFX1RPX05PTkVYUE9SVEVEX0NMQVNTX1JFRkVSRVIsIHJlZmVyZXIuYXBwbHkoIG5ldyBDb21wb25lbnROYW1lRnVuY3Rpb24oKSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKICAgICAgICAgICAgIHF1ZXVlQnVpbGQoIHNjLCBiZWFuICk7CiAgICAgICAgIH0KIApAQCAtNDI1LDYgKzQ0Miw3IEBACiAKICAgICAgICAgQklTY2hlbWFCaW5kaW5nIHNiID0KICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0QmluZEluZm8ocykuZ2V0KEJJU2NoZW1hQmluZGluZy5jbGFzcyk7CisgICAgICAgIGlmKHNiIT1udWxsKSAgICBzYi5tYXJrQXNBY2tub3dsZWRnZWQoKTsKIAogICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQ29sbGlzaW9uSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9Db2xsaXNpb25JbmZvLmphdmEKaW5kZXggOTU4MjY3Yi4uY2NkMWM4NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9Db2xsaXNpb25JbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9Db2xsaXNpb25JbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTAgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpJElkOiBDb2xsaXNpb25JbmZvLmphdmEsdiAxLjEgMjAwNS8wNC8xNSAyMDowOTo1MyBrb2hzdWtlIEV4cCAkCisgKi8KKwogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQ29sb3JCaW5kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvQ29sb3JCaW5kZXIuamF2YQppbmRleCBlZmVkMWRmLi5iZmQwZDYxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0NvbG9yQmluZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9Db2xvckJpbmRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEzICsyMiwxMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNQcm9wZXJ0eUluZm87Ci1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ1R5cGVJbmZvOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLlR5cGVVc2U7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLlJpbmc7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mby5CSVByb3BlcnR5OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBbm5vdGF0aW9uOwpAQCAtNTUsMjAgKzUyLDEzIEBACiAgICAgICAgIHJldHVybiBzZWxlY3Rvci5nZXRDdXJyZW50Um9vdCgpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBDVHlwZUluZm8gYm91bmRUb1R5cGUoWFNDb21wb25lbnQgc2MpIHsKLSAgICAgICAgaWYoc2M9PXNlbGVjdG9yLmdldEN1cnJlbnRSb290KCkpICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gc2VsZWN0b3IuYmluZFRvVHlwZShzYyk7Ci0gICAgfQotCi0KLQogCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlU2ltcGxlVHlwZVByb3BlcnR5KFhTU2ltcGxlVHlwZSB0eXBlLFN0cmluZyBwcm9wTmFtZSkgewogICAgICAgICBCSVByb3BlcnR5IHByb3AgPSBCSVByb3BlcnR5LmdldEN1c3RvbWl6YXRpb24odHlwZSk7CiAKICAgICAgICAgU2ltcGxlVHlwZUJ1aWxkZXIgc3RiID0gUmluZy5nZXQoU2ltcGxlVHlwZUJ1aWxkZXIuY2xhc3MpOwogICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgdGhlIHNpbXBsZSB0eXBlIGhlcmUsIHVzZSBidWlsZERlZgotICAgICAgICBDUHJvcGVydHlJbmZvIHAgPSBwcm9wLmNyZWF0ZVZhbHVlUHJvcGVydHkocHJvcE5hbWUsZmFsc2UsdHlwZSxzdGIuYnVpbGREZWYodHlwZSkpOworICAgICAgICBDUHJvcGVydHlJbmZvIHAgPSBwcm9wLmNyZWF0ZVZhbHVlUHJvcGVydHkocHJvcE5hbWUsZmFsc2UsdHlwZSxzdGIuYnVpbGREZWYodHlwZSksQkdNQnVpbGRlci5nZXROYW1lKHR5cGUpKTsKICAgICAgICAgZ2V0Q3VycmVudEJlYW4oKS5hZGRQcm9wZXJ0eShwKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvRGVmYXVsdENsYXNzQmluZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0RlZmF1bHRDbGFzc0JpbmRlci5qYXZhCmluZGV4IGU0YzcyMmIuLjhjZjUwY2IgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvRGVmYXVsdENsYXNzQmluZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9EZWZhdWx0Q2xhc3NCaW5kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw5IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKK2ltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5CR01CdWlsZGVyLmdldE5hbWU7CisKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKQEAgLTM1LDYgKzM2LDcgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5FcnJvclJlY2VpdmVyOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNDbGFzc0luZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0NsYXNzSW5mb1BhcmVudDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NSZWY7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0N1c3RvbWl6YXRpb25zOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50SW5mbzsKQEAgLTQ0LDcgKzQ2LDkgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJR2xvYmFsQmluZGluZzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJU2NoZW1hQmluZGluZzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJpbmRJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuVE9ETzsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJWFN1YnN0aXR1dGFibGU7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5jdC5Db21wbGV4VHlwZUZpZWxkQnVpbGRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmN0LkNvbXBsZXhUeXBlQmluZGluZ01vZGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0Fubm90YXRpb247CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dEdyb3VwRGVjbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlRGVjbDsKQEAgLTY2LDYgKzcwLDggQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTV2lsZGNhcmQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1hQYXRoOwogCitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKKwogLyoqCiAgKiBEZWZhdWx0IGNsYXNzQmluZGVyIGltcGxlbWVudGF0aW9uLiBIb25vcnMgJmx0O2pheGI6Y2xhc3M+IGN1c3RvbWl6YXRpb25zCiAgKiBhbmQgZGVmYXVsdCBiaW5kaW5ncy4KQEAgLTEwNyw2ICsxMTMsOCBAQAogICAgICAgICBpZih0eXBlLmlzR2xvYmFsKCkpIHsKICAgICAgICAgICAgIFFOYW1lIHRhZ05hbWUgPSBudWxsOwogICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGRlcml2ZU5hbWUodHlwZSk7CisgICAgICAgICAgICBMb2NhdG9yIGxvYyA9IHR5cGUuZ2V0TG9jYXRvcigpOworCiAgICAgICAgICAgICBpZihnZXRHbG9iYWxCaW5kaW5nKCkuaXNTaW1wbGVNb2RlKCkpIHsKICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgc2ltcGxlIG1vZGUsIHdlIG1heSBvcHRpbWl6ZSBpdCBhd2F5CiAgICAgICAgICAgICAgICAgWFNFbGVtZW50RGVjbCByZWZlcmVyID0gZ2V0U29sZUVsZW1lbnRSZWZlcmVyKHR5cGUpOwpAQCAtMTE0LDggKzEyMiw5IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgZ2xvYmFsIGVsZW1lbnQgY29udGFpbnMKICAgICAgICAgICAgICAgICAgICAgLy8gYSBjb2xscHNhYmxlIGNvbXBsZXggdHlwZSwgd2UgYmluZCB0aGlzIGVsZW1lbnQgdG8gYSBuYW1lZCBvbmUKICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbGxhcHNlcyBlbGVtZW50IGFuZCBjb21wbGV4IHR5cGUuCi0gICAgICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBuZXcgUU5hbWUocmVmZXJlci5nZXRUYXJnZXROYW1lc3BhY2UoKSxyZWZlcmVyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBnZXROYW1lKHJlZmVyZXIpOwogICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBkZXJpdmVOYW1lKHJlZmVyZXIpOworICAgICAgICAgICAgICAgICAgICBsb2MgPSByZWZlcmVyLmdldExvY2F0b3IoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTEyMyw3ICsxMzIsNyBAQAogCiAgICAgICAgICAgICBKUGFja2FnZSBwa2cgPSBzZWxlY3Rvci5nZXRQYWNrYWdlKHR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwogCi0gICAgICAgICAgICByZXR1cm4gbmV3IENDbGFzc0luZm8obW9kZWwscGtnLGNsYXNzTmFtZSx0eXBlLmdldExvY2F0b3IoKSxnZXRUeXBlTmFtZSh0eXBlKSx0YWdOYW1lLHR5cGUsYmkudG9DdXN0b21pemF0aW9uTGlzdCgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ0NsYXNzSW5mbyhtb2RlbCxwa2csY2xhc3NOYW1lLCBsb2MsZ2V0VHlwZU5hbWUodHlwZSksdGFnTmFtZSx0eXBlLGJpLnRvQ3VzdG9taXphdGlvbkxpc3QoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBYU0VsZW1lbnREZWNsIGVsZW1lbnQgPSB0eXBlLmdldFNjb3BlKCk7CiAKQEAgLTE0MCwxMSArMTQ5LDExIEBACiAgICAgICAgICAgICAgICAgLy8gd2hpY2ggY3JlYXRlcyB1bm5lY2Vzc2FyeSBjbGFzc2VzCiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDQ2xhc3NJbmZvKCBtb2RlbCwgc2VsZWN0b3IuZ2V0Q2xhc3NTY29wZSgpLAogICAgICAgICAgICAgICAgICAgICBkZXJpdmVOYW1lKGVsZW1lbnQpLCBlbGVtZW50LmdldExvY2F0b3IoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKGVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksZWxlbWVudC5nZXROYW1lKCkpLCBlbGVtZW50LCBiaS50b0N1c3RvbWl6YXRpb25MaXN0KCkgKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZShlbGVtZW50KSwgZWxlbWVudCwgYmkudG9DdXN0b21pemF0aW9uTGlzdCgpICk7CiAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgQ0VsZW1lbnQgcGFyZW50VHlwZSA9IHNlbGVjdG9yLmlzQm91bmQoZWxlbWVudCk7CisgICAgICAgICAgICBDRWxlbWVudCBwYXJlbnRUeXBlID0gc2VsZWN0b3IuaXNCb3VuZChlbGVtZW50LHR5cGUpOwogCiAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lOwogICAgICAgICAgICAgQ0NsYXNzSW5mb1BhcmVudCBzY29wZTsKQEAgLTE1NCw3ICsxNjMsNyBAQAogICAgICAgICAgICAgICYmIHBhcmVudFR5cGUgaW5zdGFuY2VvZiBDRWxlbWVudEluZm8KICAgICAgICAgICAgICAmJiAoKENFbGVtZW50SW5mbylwYXJlbnRUeXBlKS5oYXNDbGFzcygpICkgewogICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBwdXQgYSBuZXN0ZWQgJ1R5cGUnIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBzY29wZSA9IHBhcmVudFR5cGU7CisgICAgICAgICAgICAgICAgc2NvcGUgPSAoQ0VsZW1lbnRJbmZvKXBhcmVudFR5cGU7CiAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIlR5cGUiOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGFyZW50IGVsZW1lbnQgaXNuJ3QgYm91bmQgdG8gYSB0eXBlLCBtZXJnZSB0aGUgY3VzdG9taXphdGlvbnMgYXNzb2NpYXRlZCB0byBpdCwgdG9vLgpAQCAtMTcxLDE1ICsxODAsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgUU5hbWUgZ2V0VHlwZU5hbWUoWFNUeXBlIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpLHR5cGUuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIFFOYW1lIGdldFR5cGVOYW1lKFhTQ29tcGxleFR5cGUgdHlwZSkgewogICAgICAgICBpZih0eXBlLmdldFJlZGVmaW5lZEJ5KCkhPW51bGwpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVOYW1lKChYU1R5cGUpdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSh0eXBlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMCw2ICsyMDUsMTQgQEAKICAgICAgICAgICAgIC8vIGJlY2F1c2UgbmlsbGFibGUgbmVlZHMgSkFYQkVsZW1lbnQgdG8gcmVwcmVzZW50IGNvcnJlY3RseQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCisgICAgICAgIEJJWFN1YnN0aXR1dGFibGUgYml4U3Vic3RpdHV0YWJsZSA9IGJ1aWxkZXIuZ2V0QmluZEluZm8oZGVjbCkuZ2V0KEJJWFN1YnN0aXR1dGFibGUuY2xhc3MpOworICAgICAgICBpZihiaXhTdWJzdGl0dXRhYmxlICE9bnVsbCkgeworICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vamF4Yi5kZXYuamF2YS5uZXQvaXNzdWVzL3Nob3dfYnVnLmNnaT9pZD0yODkKKyAgICAgICAgICAgIC8vIHRoaXMgY3VzdG9taXphdGlvbiBmb3JjZXMgbm9uLWNvbGxhcHNpbmcgYmVoYXZpb3IuCisgICAgICAgICAgICBiaXhTdWJzdGl0dXRhYmxlLm1hcmtBc0Fja25vd2xlZGdlZCgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgaWYoIGdldEdsb2JhbEJpbmRpbmcoKS5pc1NpbXBsZU1vZGUoKSAmJiBkZWNsLmlzR2xvYmFsKCkpIHsKICAgICAgICAgICAgIC8vIGluIHRoZSBzaW1wbGUgbW9kZSwgd2UgZG8gbW9yZSBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbiwgYW5kIGdldCByaWQgb2YKICAgICAgICAgICAgIC8vIGEgY29tcGxleCB0eXBlIGNsYXNzIGlmIGl0J3Mgb25seSB1c2VkIG9uY2UgZnJvbSBhIGdsb2JhbCBlbGVtZW50CkBAIC0yNDcsMTQgKzI2MCwxNCBAQAogICAgICAgICBDRWxlbWVudCByID0gYWxsb3coZGVjbCxkZWNsLmdldE5hbWUoKSk7CiAKICAgICAgICAgaWYocj09bnVsbCkgewotICAgICAgICAgICAgUU5hbWUgdGFnTmFtZSA9IG5ldyBRTmFtZShkZWNsLmdldFRhcmdldE5hbWVzcGFjZSgpLGRlY2wuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIFFOYW1lIHRhZ05hbWUgPSBnZXROYW1lKGRlY2wpOwogICAgICAgICAgICAgQ0N1c3RvbWl6YXRpb25zIGN1c3RzID0gYnVpbGRlci5nZXRCaW5kSW5mbyhkZWNsKS50b0N1c3RvbWl6YXRpb25MaXN0KCk7CiAKICAgICAgICAgICAgIGlmKGRlY2wuaXNHbG9iYWwoKSkgewogICAgICAgICAgICAgICAgIGlmKGlzQ29sbGFwc2FibGUoZGVjbCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0aGUgcmV0dXJuZWQgdHlwZSB0byBiZSBidWlsdCBhcyBhIGNvbXBsZXggdHlwZSwKICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIGJpbmRpbmcgY2Fubm90IGJlIGRlbGF5ZWQuCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3Rvci5iaW5kVG9UeXBlKGRlY2wuZ2V0VHlwZSgpLmFzQ29tcGxleFR5cGUoKSx0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmJpbmRUb1R5cGUoZGVjbC5nZXRUeXBlKCkuYXNDb21wbGV4VHlwZSgpLGRlY2wsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIGlmKGdldEdsb2JhbEJpbmRpbmcoKS5pc0dlbmVyYXRlRWxlbWVudENsYXNzKCkpCkBAIC0yNjYsNyArMjc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IuYm91bmRFbGVtZW50cy5wdXQoZGVjbCxjZWkpOwogCiAgICAgICAgICAgICAgICAgICAgIHN0Yi5yZWZlcmVyU3RhY2sucHVzaChkZWNsKTsgICAgLy8gcmVmZXJlciBpcyBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIGNlaS5pbml0Q29udGVudFR5cGUoIHNlbGVjdG9yLmJpbmRUb1R5cGUoZGVjbC5nZXRUeXBlKCkpLCBkZWNsLCBkZWNsLmdldERlZmF1bHRWYWx1ZSgpICk7CisgICAgICAgICAgICAgICAgICAgIGNlaS5pbml0Q29udGVudFR5cGUoIHNlbGVjdG9yLmJpbmRUb1R5cGUoZGVjbC5nZXRUeXBlKCksZGVjbCksIGRlY2wsIGRlY2wuZ2V0RGVmYXVsdFZhbHVlKCkgKTsKICAgICAgICAgICAgICAgICAgICAgc3RiLnJlZmVyZXJTdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgciA9IGNlaTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNzYsNyArMjg5LDcgQEAKICAgICAgICAgLy8gaGF2ZSB0aGUgc3Vic3RpdHV0aW9uIG1lbWJlciBkZXJpdmUgZnJvbSB0aGUgc3Vic3RpdHV0aW9uIGhlYWQKICAgICAgICAgWFNFbGVtZW50RGVjbCB0b3AgPSBkZWNsLmdldFN1YnN0QWZmaWxpYXRpb24oKTsKICAgICAgICAgaWYodG9wIT1udWxsKSB7Ci0gICAgICAgICAgICBDRWxlbWVudCB0b3BjaSA9IHNlbGVjdG9yLmJpbmRUb1R5cGUodG9wKTsKKyAgICAgICAgICAgIENFbGVtZW50IHRvcGNpID0gc2VsZWN0b3IuYmluZFRvVHlwZSh0b3AsZGVjbCk7CiAKICAgICAgICAgICAgIGlmKHIgaW5zdGFuY2VvZiBDQ2xhc3NJbmZvICYmIHRvcGNpIGluc3RhbmNlb2YgQ0NsYXNzSW5mbykKICAgICAgICAgICAgICAgICAoKENDbGFzc0luZm8pcikuc2V0QmFzZUNsYXNzKChDQ2xhc3NJbmZvKXRvcGNpKTsKQEAgLTI4NCw4ICsyOTcsNiBAQAogICAgICAgICAgICAgICAgICgoQ0VsZW1lbnRJbmZvKXIpLnNldFN1YnN0aXR1dGlvbkhlYWQoKENFbGVtZW50SW5mbyl0b3BjaSk7CiAgICAgICAgIH0KIAotICAgICAgICBUT0RPLmNoZWNrU3BlYygpOwotCiAgICAgICAgIHJldHVybiByOwogICAgIH0KIApAQCAtMzA5LDcgKzMyMCw3IEBACiAKICAgICAgICAgaWYoZ2V0R2xvYmFsQmluZGluZygpLmlzU2ltcGxlVHlwZVN1YnN0aXR1dGlvbigpICYmIHR5cGUuaXNHbG9iYWwoKSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBDQ2xhc3NJbmZvKG1vZGVsLHNlbGVjdG9yLmdldENsYXNzU2NvcGUoKSwKLSAgICAgICAgICAgICAgICAgICAgZGVyaXZlTmFtZSh0eXBlKSwgdHlwZS5nZXRMb2NhdG9yKCksIGdldFR5cGVOYW1lKHR5cGUpLCBudWxsLCB0eXBlLCBudWxsICk7CisgICAgICAgICAgICAgICAgICAgIGRlcml2ZU5hbWUodHlwZSksIHR5cGUuZ2V0TG9jYXRvcigpLCBnZXROYW1lKHR5cGUpLCBudWxsLCB0eXBlLCBudWxsICk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gbmV2ZXIoKTsKQEAgLTM5NCw3ICs0MDUsMzAgQEAKIAogICAgICAgICBkZWNsLm1hcmtBc0Fja25vd2xlZGdlZCgpOwogCi0gICAgICAgIC8vIGRldGVybWluZSB0aGUgcGFja2FnZSB0byBwdXQgdGhpcyBjbGFzcyBpbi4KKyAgICAgICAgLy8gZmlyc3QgY29uc2lkZXIgYmluZGluZyB0byB0aGUgY2xhc3MgcmVmZXJlbmNlLgorICAgICAgICBTdHJpbmcgcmVmID0gZGVjbC5nZXRFeGlzdGluZ0NsYXNzUmVmKCk7CisgICAgICAgIGlmKHJlZiE9bnVsbCkgeworICAgICAgICAgICAgaWYoIUpKYXZhTmFtZS5pc0Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKHJlZikpIHsKKyAgICAgICAgICAgICAgICBSaW5nLmdldChFcnJvclJlY2VpdmVyLmNsYXNzKS5lcnJvciggZGVjbC5nZXRMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX0lOQ09SUkVDVF9DTEFTU19OQU1FLHJlZikgKTsKKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGJ5IGlnbm9yaW5nIEByZWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoY29tcG9uZW50IGluc3RhbmNlb2YgWFNDb21wbGV4VHlwZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBVR0xZIFVHTFkgVUdMWQorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgbm90IGdvaW5nIHRvIGJpbmQgdGhpcyBjb21wbGV4IHR5cGUsIHdlIG5lZWQgdG8gZmlndXJlIG91dAorICAgICAgICAgICAgICAgICAgICAvLyBpdHMgYmluZGluZyBtb2RlIHdpdGhvdXQgYWN0dWFsbHkgYmluZGluZyBpdCAoYW5kIGFsc28gZXhwb3NlIHRoaXMgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgIC8vIGhpZGRlbiBtZWNoYW5pc20gaW50byB0aGlzIHBhcnQgb2YgdGhlIGNvZGUuKQorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNvZGUgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGFzIHRoZSBiYXNlIGNsYXNzIG1pZ2h0IGhhdmUgYmVlbiBib3VuZAorICAgICAgICAgICAgICAgICAgICAvLyBpbiBkaWZmZXJlbnQgd2F5cy4gVG8gYmUgY29ycmVjdCwgd2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0aGUgY29udGVudCB0eXBlCisgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGhhdmUgYmVlbiBib3VuZCwgZnJvbSB0aGUgc2NoZW1hLgorICAgICAgICAgICAgICAgICAgICBSaW5nLmdldChDb21wbGV4VHlwZUZpZWxkQnVpbGRlci5jbGFzcykucmVjb3JkQmluZGluZ01vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAoWFNDb21wbGV4VHlwZSljb21wb25lbnQsIENvbXBsZXhUeXBlQmluZGluZ01vZGUuTk9STUFMCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ0NsYXNzUmVmKG1vZGVsLCBjb21wb25lbnQsIGRlY2wsIGJpbmRJbmZvLnRvQ3VzdG9taXphdGlvbkxpc3QoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nIGNsc05hbWUgPSBkZWNsLmdldENsYXNzTmFtZSgpOwogICAgICAgICBpZihjbHNOYW1lPT1udWxsKSB7CkBAIC00MDcsNyArNDQxLDcgQEAKICAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGJ5IGdlbmVyYXRpbmcgYSBwc2V1ZG8tcmFuZG9tIG5hbWUKICAgICAgICAgICAgICAgICBkZWZhdWx0QmFzZU5hbWUgPSAidW5kZWZpbmVkIitjb21wb25lbnQuaGFzaENvZGUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsc05hbWUgPSBkZXJpdmVOYW1lKCBkZWZhdWx0QmFzZU5hbWUsIGNvbXBvbmVudCApOworICAgICAgICAgICAgY2xzTmFtZSA9IGJ1aWxkZXIuZGVyaXZlTmFtZSggZGVmYXVsdEJhc2VOYW1lLCBjb21wb25lbnQgKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmKCAhSkphdmFOYW1lLmlzSmF2YUlkZW50aWZpZXIoY2xzTmFtZSkgKSB7CiAgICAgICAgICAgICAgICAgLy8gbm90IGEgdmFsaWQgSmF2YSBjbGFzcyBuYW1lCkBAIC00MjMsMTMgKzQ1NywxMiBAQAogCiAgICAgICAgIGlmKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTVHlwZSkgewogICAgICAgICAgICAgWFNUeXBlIHQgPSAoWFNUeXBlKSBjb21wb25lbnQ7Ci0gICAgICAgICAgICBpZih0LmlzR2xvYmFsKCkpCi0gICAgICAgICAgICAgICAgdHlwZU5hbWUgPSBuZXcgUU5hbWUodC5nZXRUYXJnZXROYW1lc3BhY2UoKSx0LmdldE5hbWUoKSk7CisgICAgICAgICAgICB0eXBlTmFtZSA9IGdldE5hbWUodCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNFbGVtZW50RGVjbCkgewogICAgICAgICAgICAgWFNFbGVtZW50RGVjbCBlID0gKFhTRWxlbWVudERlY2wpIGNvbXBvbmVudDsKLSAgICAgICAgICAgIGVsZW1lbnROYW1lID0gbmV3IFFOYW1lKGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksZS5nZXROYW1lKCkpOworICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBnZXROYW1lKGUpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRWxlbWVudERlY2wgJiYgIWlzQ29sbGFwc2FibGUoKFhTRWxlbWVudERlY2wpY29tcG9uZW50KSkgewpAQCAtNDQyLDcgKzQ3NSw3IEBACiAKICAgICAgICAgICAgIHN0Yi5yZWZlcmVyU3RhY2sucHVzaChjb21wb25lbnQpOyAgICAvLyByZWZlcmVyIGlzIGVsZW1lbnQKICAgICAgICAgICAgIGNlaS5pbml0Q29udGVudFR5cGUoCi0gICAgICAgICAgICAgICAgc2VsZWN0b3IuYmluZFRvVHlwZShlLmdldFR5cGUoKSksCisgICAgICAgICAgICAgICAgc2VsZWN0b3IuYmluZFRvVHlwZShlLmdldFR5cGUoKSxlKSwKICAgICAgICAgICAgICAgICBlLGUuZ2V0RGVmYXVsdFZhbHVlKCkpOwogICAgICAgICAgICAgc3RiLnJlZmVyZXJTdGFjay5wb3AoKTsKICAgICAgICAgICAgIHJldHVybiBjZWk7CkBAIC00NzYsNyArNTA5LDcgQEAKICAgICAgKiBVc2UgdGhlIG5hbWUgb2YgdGhlIHNjaGVtYSBjb21wb25lbnQgYXMgdGhlIGRlZmF1bHQgbmFtZS4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBkZXJpdmVOYW1lKCBYU0RlY2xhcmF0aW9uIGNvbXAgKSB7Ci0gICAgICAgIHJldHVybiBkZXJpdmVOYW1lKCBjb21wLmdldE5hbWUoKSwgY29tcCApOworICAgICAgICByZXR1cm4gYnVpbGRlci5kZXJpdmVOYW1lKCBjb21wLmdldE5hbWUoKSwgY29tcCApOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDg1LDM4ICs1MTgsMTEgQEAKICAgICAgKiBkZXJpdmluZyBhIGRlZmF1bHQgbmFtZS4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBkZXJpdmVOYW1lKCBYU0NvbXBsZXhUeXBlIGNvbXAgKSB7Ci0gICAgICAgIFN0cmluZyBzZWVkID0gZGVyaXZlTmFtZSggY29tcC5nZXROYW1lKCksIGNvbXAgKTsKKyAgICAgICAgU3RyaW5nIHNlZWQgPSBidWlsZGVyLmRlcml2ZU5hbWUoIGNvbXAuZ2V0TmFtZSgpLCBjb21wICk7CiAgICAgICAgIGludCBjbnQgPSBjb21wLmdldFJlZGVmaW5lZENvdW50KCk7CiAgICAgICAgIGZvciggOyBjbnQ+MDsgY250LS0gKQogICAgICAgICAgICAgc2VlZCA9ICJPcmlnaW5hbCIrc2VlZDsKICAgICAgICAgcmV0dXJuIHNlZWQ7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRGVyaXZlcyBhIG5hbWUgZnJvbSBhIHNjaGVtYSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIHByZWZpeC9zdWZmaXggbW9kaWZpY2F0aW9uIGFuZAotICAgICAqIFhNTC10by1KYXZhIG5hbWUgY29udmVyc2lvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICBUaGUgYmFzZSBuYW1lLiBUaGlzIHNob3VsZCBiZSB0aGluZ3MgbGlrZSBlbGVtZW50IG5hbWVzCi0gICAgICogICAgICBvciB0eXBlIG5hbWVzLgotICAgICAqIEBwYXJhbSBjb21wCi0gICAgICogICAgICBUaGUgY29tcG9uZW50IGZyb20gd2hpY2ggdGhlIGJhc2UgbmFtZSB3YXMgdGFrZW4uCi0gICAgICogICAgICBVc2VkIHRvIGRldGVybWluZSBob3cgbmFtZXMgYXJlIG1vZGlmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlcml2ZU5hbWUoIFN0cmluZyBuYW1lLCBYU0NvbXBvbmVudCBjb21wICkgewotICAgICAgICBYU1NjaGVtYSBvd25lciA9IGNvbXAuZ2V0T3duZXJTY2hlbWEoKTsKLQotICAgICAgICBuYW1lID0gYnVpbGRlci5nZXROYW1lQ29udmVydGVyKCkudG9DbGFzc05hbWUobmFtZSk7Ci0KLSAgICAgICAgaWYoIG93bmVyIT1udWxsICkgewotICAgICAgICAgICAgQklTY2hlbWFCaW5kaW5nIHNiID0gYnVpbGRlci5nZXRCaW5kSW5mbygKLSAgICAgICAgICAgICAgICBvd25lcikuZ2V0KEJJU2NoZW1hQmluZGluZy5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmKHNiIT1udWxsKSAgICBuYW1lID0gc2IubWFuZ2xlQ2xhc3NOYW1lKG5hbWUsY29tcCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0RlZmF1bHRQYXJ0aWNsZUJpbmRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9EZWZhdWx0UGFydGljbGVCaW5kZXIuamF2YQppbmRleCBjMTc0ZDc0Li42NTU4YzEyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0RlZmF1bHRQYXJ0aWNsZUJpbmRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvRGVmYXVsdFBhcnRpY2xlQmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9FcnJvclJlcG9ydGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0Vycm9yUmVwb3J0ZXIuamF2YQppbmRleCBjNWZmYjU1Li5lOTgyZGQ3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0Vycm9yUmVwb3J0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0Vycm9yUmVwb3J0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLkVycm9yUmVjZWl2ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0V4cHJlc3Npb25CdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0V4cHJlc3Npb25CdWlsZGVyLmphdmEKaW5kZXggNGUyNWFmNi4uODBjYmZjOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9FeHByZXNzaW9uQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvRXhwcmVzc2lvbkJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtNzIsNiArNzEsNyBAQAogICAgIHB1YmxpYyBFeHByZXNzaW9uIHdpbGRjYXJkKFhTV2lsZGNhcmQgd2MpIHsKICAgICAgICAgaWYod2lsZGNhcmQ9PW51bGwpCiAgICAgICAgICAgICB3aWxkY2FyZCA9IG5ldyBHV2lsZGNhcmRFbGVtZW50KCk7CisgICAgICAgIHdpbGRjYXJkLm1lcmdlKHdjKTsKICAgICAgICAgd2lsZGNhcmQucGFydGljbGVzLmFkZChjdXJyZW50KTsKICAgICAgICAgcmV0dXJuIHdpbGRjYXJkOwogICAgIH0KQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBFbGVtZW50IGVsZW1lbnREZWNsKFhTRWxlbWVudERlY2wgZGVjbCkgewotICAgICAgICBRTmFtZSBuID0gbmV3IFFOYW1lKGRlY2wuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksZGVjbC5nZXROYW1lKCkpOworICAgICAgICBRTmFtZSBuID0gQkdNQnVpbGRlci5nZXROYW1lKGRlY2wpOwogCiAgICAgICAgIEdFbGVtZW50SW1wbCBlID0gZGVjbHMuZ2V0KG4pOwogICAgICAgICBpZihlPT1udWxsKQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9FeHByZXNzaW9uUGFydGljbGVCaW5kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvRXhwcmVzc2lvblBhcnRpY2xlQmluZGVyLmphdmEKaW5kZXggY2RhYmNlYy4uNTBmZmJkMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9FeHByZXNzaW9uUGFydGljbGVCaW5kZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0V4cHJlc3Npb25QYXJ0aWNsZUJpbmRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC04Myw3ICs4Miw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihlIGluc3RhbmNlb2YgR1dpbGRjYXJkRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJ0c2IuZ2V0UmVmcygpLmFkZChuZXcgUmF3VHlwZVNldEJ1aWxkZXIuV2lsZGNhcmRSZWYoV2lsZGNhcmRNb2RlLlNLSVApKTsKKyAgICAgICAgICAgICAgICBHV2lsZGNhcmRFbGVtZW50IHcgPSAoR1dpbGRjYXJkRWxlbWVudCllOworICAgICAgICAgICAgICAgIHJ0c2IuZ2V0UmVmcygpLmFkZChuZXcgUmF3VHlwZVNldEJ1aWxkZXIuV2lsZGNhcmRSZWYoCisgICAgICAgICAgICAgICAgICAgIHcuaXNTdHJpY3QoKSA/IFdpbGRjYXJkTW9kZS5TVFJJQ1QgOiBXaWxkY2FyZE1vZGUuU0tJUCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogZTsgICAvLyBubyBvdGhlciBraW5kIHNob3VsZCBiZSBoZXJlCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0dFbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0dFbGVtZW50LmphdmEKaW5kZXggMDc2ZWU1MS4uODcxZTQwOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9HRWxlbWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvR0VsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9HRWxlbWVudEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvR0VsZW1lbnRJbXBsLmphdmEKaW5kZXggNmQyMWZiZi4uMmQxNTFmYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9HRWxlbWVudEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL0dFbGVtZW50SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvR1dpbGRjYXJkRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9HV2lsZGNhcmRFbGVtZW50LmphdmEKaW5kZXggYTFjMThiMy4uZTJiYjVlMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9HV2lsZGNhcmRFbGVtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9HV2lsZGNhcmRFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTAgKzIyLDEwIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5nYmluZC5FbGVtZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNXaWxkY2FyZDsKIAogLyoqCiAgKiB7QGxpbmsgRWxlbWVudH0gdGhhdCByZXByZXNlbnRzIGEgd2lsZGNhcmQsCkBAIC0zMyw2ICszMywxNCBAQAogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQogICovCiBmaW5hbCBjbGFzcyBHV2lsZGNhcmRFbGVtZW50IGV4dGVuZHMgR0VsZW1lbnQgeworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgYmluZCB0byA8dHQ+T2JqZWN0PC90dD4gZm9yIGVhZ2VyIEpBWEIgdW5tYXJzaGFsbGluZy4KKyAgICAgKiBPdGhlcndpc2UgYmluZCB0byBET00gKEkgaGF0ZSAieW91IGNhbiBwdXQgYm90aCIgc2VtYW50aWNzLAorICAgICAqIHNvIEknbSBub3QgZ29pbmcgdG8gZG8gdGhhdCBpbiB0aGlzIGJpbmRpbmcgbW9kZS4pCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0cmljdCA9IHRydWU7CisKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gIiNhbnkiOwogICAgIH0KQEAgLTQwLDQgKzQ4LDE2IEBACiAgICAgU3RyaW5nIGdldFByb3BlcnR5TmFtZVNlZWQoKSB7CiAgICAgICAgIHJldHVybiAiYW55IjsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZXJnZShYU1dpbGRjYXJkIHdjKSB7CisgICAgICAgIHN3aXRjaCh3Yy5nZXRNb2RlKCkpIHsKKyAgICAgICAgY2FzZSBYU1dpbGRjYXJkLkxBWDoKKyAgICAgICAgY2FzZSBYU1dpbGRjYXJkLlNLSVA6CisgICAgICAgICAgICBzdHJpY3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaWN0KCkgeworICAgICAgICByZXR1cm4gc3RyaWN0OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKaW5kZXggNGI1ZDgyNC4uMmVjY2Q5YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKQEAgLTEsNCArMSwyOSBAQAogIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKKyMKICMgTWVzc2FnZSByZXNvdXJjZSBmaWxlCiAjCiAKQEAgLTE0Miw0ICsxNjcsMTUgQEAKIAogRVJSX01VTFRJUExFX0dMT0JBTF9CSU5ESU5HU19PVEhFUiA9IFwKICAgICAocmVsYXRlZCB0byBhYm92ZSkgYnV0IG9uZSBpcyBhbHJlYWR5IGdpdmVuIGF0IHRoaXMgbG9jYXRpb24KKworRVJSX1JFRkVSRU5DRV9UT19OT05FWFBPUlRFRF9DTEFTUyA9IFwKKyAgICB7MH0gaXMgaW4gYSByZWZlcmVuY2VkIHNjaGVtYSBhbmQgZG8gbm90IGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBjbGFzcyBzcGVjaWZpZWQgYnkgXAorICAgIDxqYXhiOmNsYXNzIHJlZj0iLi4uIi8+IGN1c3RvbWl6YXRpb24uIFRoZXJlZm9yZSBpdCBjYW5ub3QgYmUgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUuCisKK0VSUl9SRUZFUkVOQ0VfVE9fTk9ORVhQT1JURURfQ0xBU1NfTUFQX0ZBTFNFID0gXAorICAgIChyZWxhdGVkIHRvIGFib3ZlKSBUaGUgc2NoZW1hIGZvciBuYW1lc3BhY2UgInswfSIgKHdoaWNoIGluY2x1ZGVzIHRoZSBhYm92ZSBjb21wb25lbnQpIGlzIFwKKyAgICBkZXNpZ25hdGVkIGZvciByZWZlcmVuY2Ugb25seSBieSB0aGlzIGN1c3RvbWl6YXRpb24uCisKK0VSUl9SRUZFUkVOQ0VfVE9fTk9ORVhQT1JURURfQ0xBU1NfUkVGRVJFUiA9IFwKKyAgICAocmVsYXRlZCB0byBhYm92ZSkgVGhlIHByb2JsZW1hdGljIHNjaGVtYSBjb21wb25lbnQgaXMgcmVmZXJlbmNlZCBmcm9tIHRoaXMgY29tcG9uZW50OiB7MH0KICAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvTWVzc2FnZXMuamF2YQppbmRleCA1OWY5YTM1Li5lMGRiNzEyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDcgKzIzLDYgQEAKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwogCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtMTM3LDQgKzEzNiwxMSBAQAogICAgICAgICAiRVJSX01VTFRJUExFX0dMT0JBTF9CSU5ESU5HUyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX01VTFRJUExFX0dMT0JBTF9CSU5ESU5HU19PVEhFUiA9CiAgICAgICAgICJFUlJfTVVMVElQTEVfR0xPQkFMX0JJTkRJTkdTX09USEVSIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9SRUZFUkVOQ0VfVE9fTk9ORVhQT1JURURfQ0xBU1MgPQorICAgICAgICAiRVJSX1JFRkVSRU5DRV9UT19OT05FWFBPUlRFRF9DTEFTUyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX1JFRkVSRU5DRV9UT19OT05FWFBPUlRFRF9DTEFTU19NQVBfRkFMU0UgPQorICAgICAgICAiRVJSX1JFRkVSRU5DRV9UT19OT05FWFBPUlRFRF9DTEFTU19NQVBfRkFMU0UiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9SRUZFUkVOQ0VfVE9fTk9ORVhQT1JURURfQ0xBU1NfUkVGRVJFUiA9CisgICAgICAgICJFUlJfUkVGRVJFTkNFX1RPX05PTkVYUE9SVEVEX0NMQVNTX1JFRkVSRVIiOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9NdWx0aXBsaWNpdHlDb3VudGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL011bHRpcGxpY2l0eUNvdW50ZXIuamF2YQppbmRleCA5YjUzYWMxLi44OThkYmE2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL011bHRpcGxpY2l0eUNvdW50ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL011bHRpcGxpY2l0eUNvdW50ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLk11bHRpcGxpY2l0eTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvUGFydGljbGVCaW5kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvUGFydGljbGVCaW5kZXIuamF2YQppbmRleCA0NzgzMjE1Li5mMzQ1YWIxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL1BhcnRpY2xlQmluZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9QYXJ0aWNsZUJpbmRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9SYXdUeXBlU2V0QnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9SYXdUeXBlU2V0QnVpbGRlci5qYXZhCmluZGV4IDQ4NjJlOWEuLjU1ZDZhMjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvUmF3VHlwZVNldEJ1aWxkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL1Jhd1R5cGVTZXRCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTMyLDE2ICszMSwyMiBAQAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQWRhcHRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3M7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0NsYXNzSW5mbzsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ3VzdG9taXphdGlvbnM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0VsZW1lbnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0VsZW1lbnRJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbGVtZW50UHJvcGVydHlJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNSZWZlcmVuY2VQcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ1R5cGVSZWY7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuTW9kZWw7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuTXVsdGlwbGljaXR5OworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLlR5cGVVc2U7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLlJhd1R5cGVTZXQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLlJpbmc7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mby5CSURvbTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJR2xvYmFsQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJWFN1YnN0aXR1dGFibGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLklEOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5XaWxkY2FyZE1vZGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0VsZW1lbnREZWNsOwpAQCAtMTI1LDE0ICsxMzAsMTUgQEAKIAogICAgIHB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFhTRWxlbWVudERlY2wgZGVjbCkgewogCi0gICAgICAgIFFOYW1lIG4gPSBuZXcgUU5hbWUoZGVjbC5nZXRUYXJnZXROYW1lc3BhY2UoKSxkZWNsLmdldE5hbWUoKSk7CisgICAgICAgIFFOYW1lIG4gPSBCR01CdWlsZGVyLmdldE5hbWUoZGVjbCk7CiAgICAgICAgIGlmKGVsZW1lbnROYW1lcy5hZGQobikpIHsKLSAgICAgICAgICAgIENFbGVtZW50IGVsZW1lbnRCZWFuID0gUmluZy5nZXQoQ2xhc3NTZWxlY3Rvci5jbGFzcykuYmluZFRvVHlwZShkZWNsKTsKKyAgICAgICAgICAgIENFbGVtZW50IGVsZW1lbnRCZWFuID0gUmluZy5nZXQoQ2xhc3NTZWxlY3Rvci5jbGFzcykuYmluZFRvVHlwZShkZWNsLG51bGwpOwogICAgICAgICAgICAgaWYoZWxlbWVudEJlYW49PW51bGwpCi0gICAgICAgICAgICAgICAgcmVmcy5hZGQobmV3IFJhd1R5cGVTZXQuWG1sVHlwZVJlZihkZWNsKSk7CisgICAgICAgICAgICAgICAgcmVmcy5hZGQobmV3IFhtbFR5cGVSZWYoZGVjbCkpOwogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoZWxlbWVudEJlYW4gaW5zdGFuY2VvZiBDQ2xhc3NJbmZvKQotICAgICAgICAgICAgICAgICAgICByZWZzLmFkZChuZXcgQ0NsYXNzSW5mb1JlZihkZWNsLChDQ2xhc3NJbmZvKWVsZW1lbnRCZWFuKSk7CisgICAgICAgICAgICAgICAgLy8geWlrZXMhCisgICAgICAgICAgICAgICAgaWYoZWxlbWVudEJlYW4gaW5zdGFuY2VvZiBDQ2xhc3MpCisgICAgICAgICAgICAgICAgICAgIHJlZnMuYWRkKG5ldyBDQ2xhc3NSZWYoZGVjbCwoQ0NsYXNzKWVsZW1lbnRCZWFuKSk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICByZWZzLmFkZChuZXcgQ0VsZW1lbnRJbmZvUmVmKGRlY2wsKENFbGVtZW50SW5mbyllbGVtZW50QmVhbikpOwogICAgICAgICAgICAgfQpAQCAtMTg3LDIxICsxOTMsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogUmVmZXJlbmNlIHRvIGEgY2xhc3MgdGhhdCBtYXBzIGZyb20gYW4gZWxlbWVudC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENDbGFzc0luZm9SZWYgZXh0ZW5kcyBSYXdUeXBlU2V0LlJlZiB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBDQ2xhc3NJbmZvIHRhcmdldDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENDbGFzc1JlZiBleHRlbmRzIFJhd1R5cGVTZXQuUmVmIHsKKyAgICAgICAgcHVibGljIGZpbmFsIENDbGFzcyB0YXJnZXQ7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBYU0VsZW1lbnREZWNsIGRlY2w7CiAKLSAgICAgICAgQ0NsYXNzSW5mb1JlZihYU0VsZW1lbnREZWNsIGRlY2wsIENDbGFzc0luZm8gdGFyZ2V0KSB7CisgICAgICAgIENDbGFzc1JlZihYU0VsZW1lbnREZWNsIGRlY2wsIENDbGFzcyB0YXJnZXQpIHsKICAgICAgICAgICAgIHRoaXMuZGVjbCA9IGRlY2w7CiAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCBDVHlwZVJlZiB0b1R5cGVSZWYoQ0VsZW1lbnRQcm9wZXJ0eUluZm8gZXApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1R5cGVSZWYodGFyZ2V0LHRhcmdldC5nZXRFbGVtZW50TmFtZSgpLGRlY2wuaXNOaWxsYWJsZSgpLGRlY2wuZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDVHlwZVJlZih0YXJnZXQsZGVjbCk7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0b0VsZW1lbnRSZWYoQ1JlZmVyZW5jZVByb3BlcnR5SW5mbyBwcm9wKSB7CkBAIC0yMjgsNyArMjMzLDcgQEAKICAgICAvKioKICAgICAgKiBSZWZlcmVuY2UgdG8gYSBjbGFzcyB0aGF0IG1hcHMgZnJvbSBhbiBlbGVtZW50LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ0VsZW1lbnRJbmZvUmVmIGV4dGVuZHMgUmF3VHlwZVNldC5SZWYgeworICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBDRWxlbWVudEluZm9SZWYgZXh0ZW5kcyBSYXdUeXBlU2V0LlJlZiB7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBDRWxlbWVudEluZm8gdGFyZ2V0OwogICAgICAgICBwdWJsaWMgZmluYWwgWFNFbGVtZW50RGVjbCBkZWNsOwogCkBAIC0yNDIsOCArMjQ3LDcgQEAKICAgICAgICAgICAgIENBZGFwdGVyIGEgPSB0YXJnZXQuZ2V0UHJvcGVydHkoKS5nZXRBZGFwdGVyKCk7CiAgICAgICAgICAgICBpZihhIT1udWxsICYmIGVwIT1udWxsKSBlcC5zZXRBZGFwdGVyKGEpOwogCi0gICAgICAgICAgICByZXR1cm4gbmV3IENUeXBlUmVmKHRhcmdldC5nZXRDb250ZW50VHlwZSgpLHRhcmdldC5nZXRFbGVtZW50TmFtZSgpLAotICAgICAgICAgICAgICAgIGRlY2wuaXNOaWxsYWJsZSgpLGRlY2wuZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDVHlwZVJlZih0YXJnZXQuZ2V0Q29udGVudFR5cGUoKSxkZWNsKTsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIHRvRWxlbWVudFJlZihDUmVmZXJlbmNlUHJvcGVydHlJbmZvIHByb3ApIHsKQEAgLTI1NCwxNiArMjU4LDIyIEBACiAgICAgICAgICAgICAvLyBpZiBlbGVtZW50IHN1YnN0aXR1dGlvbiBjYW4gb2NjdXIsIG5vIHdheSBpdCBjYW4gYmUgbWFwcGVkIHRvIGEgbGlzdCBvZiB0eXBlcwogICAgICAgICAgICAgaWYoZGVjbC5nZXRTdWJzdGl0dXRhYmxlcygpLnNpemUoKT4xKQogICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlU2V0Lk1vZGUuTVVTVF9CRV9SRUZFUkVOQ0U7CisgICAgICAgICAgICAvLyBCSVhTdWJzdGl0dXRhYmxlIGFsc28gc2ltdWxhdGVzIHRoaXMgZWZmZWN0LiBVc2VmdWwgZm9yIHNlcGFyYXRlIGNvbXBpbGF0aW9uCisgICAgICAgICAgICBCSVhTdWJzdGl0dXRhYmxlIHN1YnN0ID0gYnVpbGRlci5nZXRCaW5kSW5mbyhkZWNsKS5nZXQoQklYU3Vic3RpdHV0YWJsZS5jbGFzcyk7CisgICAgICAgICAgICBpZihzdWJzdCE9bnVsbCkgeworICAgICAgICAgICAgICAgIHN1YnN0Lm1hcmtBc0Fja25vd2xlZGdlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlU2V0Lk1vZGUuTVVTVF9CRV9SRUZFUkVOQ0U7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHdlIGhhdmUgbm8gcGxhY2UgdG8gcHV0IGFuIGFkYXRlciBpZiB0aGlzIHRoaW5nIG1hcHMgdG8gYSB0eXBlCiAgICAgICAgICAgICBDRWxlbWVudFByb3BlcnR5SW5mbyBwID0gdGFyZ2V0LmdldFByb3BlcnR5KCk7CiAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGFkYXB0ZXIgb3IgSURuZXNzLCB3aGljaCByZXF1aXJlcyBzcGVjaWFsCiAgICAgICAgICAgICAvLyBhbm5vdGF0aW9uLCBhbmQgdGhlcmUncyBtb3JlIHRoYW4gb25lIGVsZW1lbnQsCiAgICAgICAgICAgICAvLyB3ZSBoYXZlIG5vIHBsYWNlIHRvIHB1dCB0aGUgc3BlY2lhbCBhbm5vdGF0aW9uLCBzbyB3ZSBuZWVkIEpBWEJFbGVtZW50LgotICAgICAgICAgICAgaWYocGFyZW50LnJlZnMuc2l6ZSgpPjEgfHwgIXBhcmVudC5tdWwuaXNBdE1vc3RPbmNlKCkpIHsKLSAgICAgICAgICAgICAgICBpZihwLmdldEFkYXB0ZXIoKSE9bnVsbCB8fCBwLmlkKCkhPUlELk5PTkUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlU2V0Lk1vZGUuTVVTVF9CRV9SRUZFUkVOQ0U7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZigocGFyZW50LnJlZnMuc2l6ZSgpPjEgfHwgIXBhcmVudC5tdWwuaXNBdE1vc3RPbmNlKCkpICYmIHAuaWQoKSE9SUQuTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZVNldC5Nb2RlLk1VU1RfQkVfUkVGRVJFTkNFOworICAgICAgICAgICAgaWYocGFyZW50LnJlZnMuc2l6ZSgpID4gMSAmJiBwLmdldEFkYXB0ZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlU2V0Lk1vZGUuTVVTVF9CRV9SRUZFUkVOQ0U7CiAKICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlU2V0Lk1vZGUuU0hPVUxEX0JFX1RZUEVSRUY7CiAgICAgICAgIH0KQEAgLTI4MCw0ICsyOTAsODMgQEAKICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZ2V0UHJvcGVydHkoKS5nZXRFeHBlY3RlZE1pbWVUeXBlKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWZlcmVuY2VzIHRvIGEgdHlwZS4gQ291bGQgYmUgZ2xvYmFsIG9yIGxvY2FsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgWG1sVHlwZVJlZiBleHRlbmRzIFJhd1R5cGVTZXQuUmVmIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBYU0VsZW1lbnREZWNsIGRlY2w7CisgICAgICAgIHByaXZhdGUgZmluYWwgVHlwZVVzZSB0YXJnZXQ7CisKKyAgICAgICAgcHVibGljIFhtbFR5cGVSZWYoWFNFbGVtZW50RGVjbCBkZWNsKSB7CisgICAgICAgICAgICB0aGlzLmRlY2wgPSBkZWNsOworICAgICAgICAgICAgU2ltcGxlVHlwZUJ1aWxkZXIgc3RiID0gUmluZy5nZXQoU2ltcGxlVHlwZUJ1aWxkZXIuY2xhc3MpOworICAgICAgICAgICAgc3RiLnJlZmVyZXJTdGFjay5wdXNoKGRlY2wpOworICAgICAgICAgICAgVHlwZVVzZSByID0gUmluZy5nZXQoQ2xhc3NTZWxlY3Rvci5jbGFzcykuYmluZFRvVHlwZShkZWNsLmdldFR5cGUoKSxkZWNsKTsKKyAgICAgICAgICAgIHN0Yi5yZWZlcmVyU3RhY2sucG9wKCk7CisgICAgICAgICAgICB0YXJnZXQgPSByOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIENUeXBlUmVmIHRvVHlwZVJlZihDRWxlbWVudFByb3BlcnR5SW5mbyBlcCkgeworICAgICAgICAgICAgaWYoZXAhPW51bGwgJiYgdGFyZ2V0LmdldEFkYXB0ZXJVc2UoKSE9bnVsbCkKKyAgICAgICAgICAgICAgICBlcC5zZXRBZGFwdGVyKHRhcmdldC5nZXRBZGFwdGVyVXNlKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDVHlwZVJlZih0YXJnZXQuZ2V0SW5mbygpLGRlY2wpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aG9sZSB0eXBlIHNldCBjYW4gYmUgbGF0ZXIgYm91bmQgdG8gYSByZWZlcmVuY2UgcHJvcGVydHksCisgICAgICAgICAqIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBnZW5lcmF0ZSBhZGRpdGlvbmFsIGNvZGUgdG8gd3JhcCB0aGlzCisgICAgICAgICAqIHR5cGUgcmVmZXJlbmNlIGludG8gYW4gZWxlbWVudCBjbGFzcy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHN1Y2ggYW4gZWxlbWVudCBjbGFzcyBhbmQgcmV0dXJucyBpdC4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRvRWxlbWVudFJlZihDUmVmZXJlbmNlUHJvcGVydHlJbmZvIHByb3ApIHsKKyAgICAgICAgICAgIENDbGFzc0luZm8gc2NvcGUgPSBSaW5nLmdldChDbGFzc1NlbGVjdG9yLmNsYXNzKS5nZXRDdXJyZW50QmVhbigpOworICAgICAgICAgICAgTW9kZWwgbW9kZWwgPSBSaW5nLmdldChNb2RlbC5jbGFzcyk7CisKKyAgICAgICAgICAgIENDdXN0b21pemF0aW9ucyBjdXN0cyA9IFJpbmcuZ2V0KEJHTUJ1aWxkZXIuY2xhc3MpLmdldEJpbmRJbmZvKGRlY2wpLnRvQ3VzdG9taXphdGlvbkxpc3QoKTsKKworICAgICAgICAgICAgaWYodGFyZ2V0IGluc3RhbmNlb2YgQ0NsYXNzSW5mbyAmJiBSaW5nLmdldChCSUdsb2JhbEJpbmRpbmcuY2xhc3MpLmlzU2ltcGxlTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgQ0NsYXNzSW5mbyBiZWFuID0gbmV3IENDbGFzc0luZm8obW9kZWwsc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldE5hbWVDb252ZXJ0ZXIoKS50b0NsYXNzTmFtZShkZWNsLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wuZ2V0TG9jYXRvcigpLCBudWxsLCBCR01CdWlsZGVyLmdldE5hbWUoZGVjbCksIGRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RzKTsKKyAgICAgICAgICAgICAgICBiZWFuLnNldEJhc2VDbGFzcygoQ0NsYXNzSW5mbyl0YXJnZXQpOworICAgICAgICAgICAgICAgIHByb3AuZ2V0RWxlbWVudHMoKS5hZGQoYmVhbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENFbGVtZW50SW5mbyBlID0gbmV3IENFbGVtZW50SW5mbyhtb2RlbCxCR01CdWlsZGVyLmdldE5hbWUoZGVjbCksc2NvcGUsdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbC5nZXREZWZhdWx0VmFsdWUoKSwgZGVjbCwgY3VzdHMsIGRlY2wuZ2V0TG9jYXRvcigpKTsKKyAgICAgICAgICAgICAgICBwcm9wLmdldEVsZW1lbnRzKCkuYWRkKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJhd1R5cGVTZXQuTW9kZSBjYW5CZVR5cGUoUmF3VHlwZVNldCBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYWRhcHRlciBvciBJRG5lc3MsIHdoaWNoIHJlcXVpcmVzIHNwZWNpYWwKKyAgICAgICAgICAgIC8vIGFubm90YXRpb24sIGFuZCB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgZWxlbWVudCwKKyAgICAgICAgICAgIC8vIHdlIGhhdmUgbm8gcGxhY2UgdG8gcHV0IHRoZSBzcGVjaWFsIGFubm90YXRpb24sIHNvIHdlIG5lZWQgSkFYQkVsZW1lbnQuCisgICAgICAgICAgICBpZigocGFyZW50LnJlZnMuc2l6ZSgpPjEgfHwgIXBhcmVudC5tdWwuaXNBdE1vc3RPbmNlKCkpICYmIHRhcmdldC5pZFVzZSgpIT1JRC5OT05FKQorICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlU2V0Lk1vZGUuTVVTVF9CRV9SRUZFUkVOQ0U7CisgICAgICAgICAgICBpZihwYXJlbnQucmVmcy5zaXplKCkgPiAxICYmIHRhcmdldC5nZXRBZGFwdGVyVXNlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZVNldC5Nb2RlLk1VU1RfQkVfUkVGRVJFTkNFOworCisgICAgICAgICAgICAvLyBuaWxsYWJsZSBhbmQgb3B0aW9uYWwgYXQgdGhlIHNhbWUgdGltZS4gbmVlZHMgYW4gZWxlbWVudCB3cmFwcGVyIHRvIGRpc3Rpbmd1aXNoIHRob3NlCisgICAgICAgICAgICAvLyB0d28gc3RhdGVzLiBCdXQgdGhpcyBpcyBub3QgYSBoYXJkIHJlcXVpcmVtZW50LgorICAgICAgICAgICAgaWYoZGVjbC5pc05pbGxhYmxlKCkgJiYgcGFyZW50Lm11bC5pc09wdGlvbmFsKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJhd1R5cGVTZXQuTW9kZS5DQU5fQkVfVFlQRVJFRjsKKworICAgICAgICAgICAgcmV0dXJuIFJhd1R5cGVTZXQuTW9kZS5TSE9VTERfQkVfVFlQRVJFRjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGlzdE9mVmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5pc0NvbGxlY3Rpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBJRCBpZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXQuaWRVc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBNaW1lVHlwZSBnZXRFeHBlY3RlZE1pbWVUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXRFeHBlY3RlZE1pbWVUeXBlKCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL1JlZmVyZXJGaW5kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvUmVmZXJlckZpbmRlci5qYXZhCmluZGV4IDY1Mzg4NzIuLmZiYmU1NjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvUmVmZXJlckZpbmRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvUmVmZXJlckZpbmRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL1NpbXBsZVR5cGVCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL1NpbXBsZVR5cGVCdWlsZGVyLmphdmEKaW5kZXggMzlmYzM5ZC4uYjcyYTAzYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9TaW1wbGVUeXBlQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvU2ltcGxlVHlwZUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYTsKIAogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwpAQCAtMzgsMTMgKzM3LDE0IEBACiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCiBpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5NaW1lVHlwZVBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIGltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KSmF2YU5hbWU7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwudXRpbC5KYXZhZG9jRXNjYXBlV3JpdGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLkVycm9yUmVjZWl2ZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0J1aWx0aW5MZWFmSW5mbzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NJbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNDbGFzc0luZm9QYXJlbnQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0NsYXNzUmVmOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNFbnVtQ29uc3RhbnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0VudW1MZWFmSW5mbzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DTm9uRWxlbWVudDsKQEAgLTMyOCw3ICszMjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNvbnYuZ2V0VHlwZVVzZSh0eXBlKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGxvb2sgZm9yIGVudW0gY3VzdG9taXphdGlvbiwgd2hpY2ggaXMgbm9hdGhlciB1c2VyIHNwZWNpZmllZCBjb252ZXJzaW9uCisgICAgICAgIC8vIGxvb2sgZm9yIGVudW0gY3VzdG9taXphdGlvbiwgd2hpY2ggaXMgYW5vdGhlciB1c2VyIHNwZWNpZmllZCBjb252ZXJzaW9uCiAgICAgICAgIEJJRW51bSBlbiA9IGluZm8uZ2V0KEJJRW51bS5jbGFzcyk7CiAgICAgICAgIGlmKCBlbiE9bnVsbCApIHsKICAgICAgICAgICAgIGVuLm1hcmtBc0Fja25vd2xlZGdlZCgpOwpAQCAtMzQ2LDYgKzM0NiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGJ5IGlnbm9yaW5nIHRoaXMgY3VzdG9taXphdGlvbgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2U/CisgICAgICAgICAgICAgICAgaWYoZW4ucmVmIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCFKSmF2YU5hbWUuaXNGdWxseVF1YWxpZmllZENsYXNzTmFtZShlbi5yZWYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSaW5nLmdldChFcnJvclJlY2VpdmVyLmNsYXNzKS5lcnJvciggZW4uZ2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX0lOQ09SUkVDVF9DTEFTU19OQU1FLCBlbi5yZWYpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGJ5IGlnbm9yaW5nIEByZWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDQ2xhc3NSZWYobW9kZWwsIHR5cGUsIGVuLCBpbmZvLnRvQ3VzdG9taXphdGlvbkxpc3QoKSApOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIGxpc3QgYW5kIHVuaW9uIGNhbm5vdCBiZSBtYXBwZWQgdG8gYSB0eXBlLXNhZmUgZW51bSwKICAgICAgICAgICAgICAgICAvLyBzbyBpbiB0aGlzIHN0YWdlIHdlIGNhbiBzYWZlbHkgY2FzdCBpdCB0byBYU1Jlc3RyaWN0aW9uU2ltcGxlVHlwZQogICAgICAgICAgICAgICAgIHJldHVybiBiaW5kVG9UeXBlU2FmZUVudW0oIChYU1Jlc3RyaWN0aW9uU2ltcGxlVHlwZSl0eXBlLApAQCAtMzg2LDcgKzM5OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gZ2V0Q2xhc3NTZWxlY3RvcigpLl9iaW5kVG9DbGFzcyh0eXBlLGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIChDTm9uRWxlbWVudClnZXRDbGFzc1NlbGVjdG9yKCkuX2JpbmRUb0NsYXNzKHR5cGUsbnVsbCxmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTIsOCArNTI1LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwogICAgICAgICB9CisKICAgICAgICAgLy8gd2UgYXBwbHkgbmFtZSBjb252ZXJzaW9uIGluIGFueSBjYXNlCi0gICAgICAgIGNsYXNzTmFtZSA9IGJ1aWxkZXIuZ2V0TmFtZUNvbnZlcnRlcigpLnRvQ2xhc3NOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgIGNsYXNzTmFtZSA9IGJ1aWxkZXIuZGVyaXZlTmFtZShjbGFzc05hbWUsdHlwZSk7CiAKICAgICAgICAgey8vIGNvbXB1dGUgSmF2YWRvYwogICAgICAgICAgICAgU3RyaW5nV3JpdGVyIG91dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKQEAgLTUzNiw3ICs1NTAsNyBAQAogICAgICAgICBpZih1c2UuaXNDb2xsZWN0aW9uKCkpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgLy8gY2FuJ3QgYmluZCBhIGxpc3QgdG8gZW51bSBjb25zdGFudAogCi0gICAgICAgIENOb25FbGVtZW50IGJhc2VEdCA9IChDTm9uRWxlbWVudCl1c2UuZ2V0SW5mbygpOyAgIC8vIGZvciBub3cganVzdCBpZ25vcmUgdGhhdCBjYXNlCisgICAgICAgIENOb25FbGVtZW50IGJhc2VEdCA9IHVzZS5nZXRJbmZvKCk7ICAgLy8gZm9yIG5vdyBqdXN0IGlnbm9yZSB0aGF0IGNhc2UKIAogICAgICAgICBpZihiYXNlRHQgaW5zdGFuY2VvZiBDQ2xhc3NJbmZvKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIC8vIGNhbid0IGJpbmQgdG8gYW4gZW51bSBpZiB0aGUgYmFzZSBpcyBhIGNsYXNzLCBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSB2YWx1ZSBjb25zdHJjdG9yCkBAIC01NzEsMTggKzU4NSwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBudWxsOwotICAgICAgICBpZih0eXBlLmlzR2xvYmFsKCkpCi0gICAgICAgICAgICB0eXBlTmFtZSA9IG5ldyBRTmFtZSh0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpLHR5cGUuZ2V0TmFtZSgpKTsKLQotCiAgICAgICAgIC8vIHVzZSB0aGUgbmFtZSBvZiB0aGUgc2ltcGxlIHR5cGUgYXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgogICAgICAgICBDQ2xhc3NJbmZvUGFyZW50IHNjb3BlOwogICAgICAgICBpZih0eXBlLmlzR2xvYmFsKCkpCiAgICAgICAgICAgICBzY29wZSA9IG5ldyBDQ2xhc3NJbmZvUGFyZW50LlBhY2thZ2UoZ2V0Q2xhc3NTZWxlY3RvcigpLmdldFBhY2thZ2UodHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzY29wZSA9IGdldENsYXNzU2VsZWN0b3IoKS5nZXRDbGFzc1Njb3BlKCk7Ci0gICAgICAgIENFbnVtTGVhZkluZm8geGR1Y2VyID0gbmV3IENFbnVtTGVhZkluZm8oIG1vZGVsLCB0eXBlTmFtZSwgc2NvcGUsCisgICAgICAgIENFbnVtTGVhZkluZm8geGR1Y2VyID0gbmV3IENFbnVtTGVhZkluZm8oIG1vZGVsLCBCR01CdWlsZGVyLmdldE5hbWUodHlwZSksIHNjb3BlLAogICAgICAgICAgICAgY2xhc3NOYW1lLCBiYXNlRHQsIG1lbWJlckxpc3QsIHR5cGUsCiAgICAgICAgICAgICBidWlsZGVyLmdldEJpbmRJbmZvKHR5cGUpLnRvQ3VzdG9taXphdGlvbkxpc3QoKSwgbG9jICk7CiAgICAgICAgIHhkdWNlci5qYXZhZG9jID0gamF2YWRvYzsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvVW51c2VkQ3VzdG9taXphdGlvbkNoZWNrZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvVW51c2VkQ3VzdG9taXphdGlvbkNoZWNrZXIuamF2YQppbmRleCA5YTQyNGExLi5lNDI1ZDI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL1VudXNlZEN1c3RvbWl6YXRpb25DaGVja2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9VbnVzZWRDdXN0b21pemF0aW9uQ2hlY2tlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL1dpbGRjYXJkTmFtZUNsYXNzQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9XaWxkY2FyZE5hbWVDbGFzc0J1aWxkZXIuamF2YQppbmRleCAyNzEwMTI1Li43NzRhYjk2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL1dpbGRjYXJkTmFtZUNsYXNzQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvV2lsZGNhcmROYW1lQ2xhc3NCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9BYnN0cmFjdERlY2xhcmF0aW9uSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9BYnN0cmFjdERlY2xhcmF0aW9uSW1wbC5qYXZhCmluZGV4IGY0NWMxMmMuLmU3MmRlYzQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQWJzdHJhY3REZWNsYXJhdGlvbkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0Fic3RyYWN0RGVjbGFyYXRpb25JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm87CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQW5ub3RhdGlvblBhcnNlckZhY3RvcnlJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0Fubm90YXRpb25QYXJzZXJGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDIxMDczOGMuLmM1ZGU1MDMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQW5ub3RhdGlvblBhcnNlckZhY3RvcnlJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Bbm5vdGF0aW9uUGFyc2VyRmFjdG9yeUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwxMiArMjIsOCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm87CiAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKIGltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKIGltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXJIYW5kbGVyOwpAQCAtMzcsOCArMzMsNiBAQAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLk9wdGlvbnM7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuU2NoZW1hQ2FjaGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLkNvbnN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLlR5cGVSZWZlcmVuY2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkpBWEJDb250ZXh0SW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnBhcnNlci5Bbm5vdGF0aW9uQ29udGV4dDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnBhcnNlci5Bbm5vdGF0aW9uUGFyc2VyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyLkFubm90YXRpb25QYXJzZXJGYWN0b3J5OwpAQCAtNjksNDQgKzYzLDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFZhbGlkYXRvckhhbmRsZXIgdmFsaWRhdG9yOwogCi0gICAgLyoqCi0gICAgICogTGF6aWx5IHBhcnNlZCBzY2hlbWEgZm9yIHRoZSBiaW5kaW5nIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hQ2FjaGUgYmluZGluZ0ZpbGVTY2hlbWEgPSBuZXcgU2NoZW1hQ2FjaGUoQW5ub3RhdGlvblBhcnNlckZhY3RvcnlJbXBsLmNsYXNzLmdldFJlc291cmNlKCJiaW5kaW5nLnhzZCIpKTsKLQotICAgIC8qKgotICAgICAqIExhemlseSBwcmVwYXJlZCB7QGxpbmsgSkFYQkNvbnRleHR9LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0SW1wbCBjdXN0b21pemF0aW9uQ29udGV4dDsKLQotICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0SW1wbCBnZXRKQVhCQ29udGV4dCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkKEFubm90YXRpb25QYXJzZXJGYWN0b3J5SW1wbC5jbGFzcykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZihjdXN0b21pemF0aW9uQ29udGV4dD09bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9taXphdGlvbkNvbnRleHQgPSBuZXcgSkFYQkNvbnRleHRJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRJbmZvLmNsYXNzLCAvLyBmb3IgeHM6YW5ub3RhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJQ2xhc3MuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQklDb252ZXJzaW9uLlVzZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQklDb252ZXJzaW9uLlVzZXJBZGFwdGVyLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJRG9tLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJWERvbS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUVudW0uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQklFbnVtTWVtYmVyLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR2xvYmFsQmluZGluZy5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVByb3BlcnR5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJU2NoZW1hQmluZGluZy5jbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgfSwgQ29sbGVjdGlvbnMuPFR5cGVSZWZlcmVuY2U+ZW1wdHlMaXN0KCksIG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphdGlvbkNvbnRleHQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgQW5ub3RhdGlvblBhcnNlciBjcmVhdGUoKSB7CiAgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvblBhcnNlcigpIHsKLSAgICAgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyIHUgPSBnZXRKQVhCQ29udGV4dCgpLmNyZWF0ZVVubWFyc2hhbGxlcigpOworICAgICAgICAgICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXIgdSA9IEJpbmRJbmZvLmdldEpBWEJDb250ZXh0KCkuY3JlYXRlVW5tYXJzaGFsbGVyKCk7CiAKICAgICAgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVySGFuZGxlciBoYW5kbGVyOwogCkBAIC0xMzksNyArOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0U2lkZUhhbmRsZXIoKT09bnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB1cCB2YWxpZGF0b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2YWxpZGF0b3I9PW51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvciA9IGJpbmRpbmdGaWxlU2NoZW1hLm5ld1ZhbGlkYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IgPSBCaW5kSW5mby5iaW5kaW5nRmlsZVNjaGVtYS5uZXdWYWxpZGF0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRGb3JraW5nKHVyaSxsb2NhbE5hbWUscU5hbWUsYXR0cyxuZXcgVmFsaWRhdG9yUHJvdGVjdGVyKHZhbGlkYXRvcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSUNsYXNzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJQ2xhc3MuamF2YQppbmRleCA0ZTMyYzkxLi5mYzgwYmY0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJQ2xhc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJQ2xhc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwpAQCAtMzIsOCArMzEsNyBAQAogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLkNvbnN0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLmltcGwuTmFtZUNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiAKIC8qKgogICogQ2xhc3MgZGVjbGFyYXRpb24uCkBAIC00OSwxNCArNDcsNiBAQAogICovCiBAWG1sUm9vdEVsZW1lbnQobmFtZT0iY2xhc3MiKQogcHVibGljIGZpbmFsIGNsYXNzIEJJQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aW9uSW1wbCB7Ci0KLSAgICBwdWJsaWMgQklDbGFzcyggTG9jYXRvciBsb2MsIFN0cmluZyBfY2xhc3NOYW1lLCBTdHJpbmcgX2ltcGxDbGFzcywgU3RyaW5nIF9qYXZhZG9jICkgewotICAgICAgICBzdXBlcihsb2MpOwotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IF9jbGFzc05hbWU7Ci0gICAgICAgIHRoaXMuamF2YWRvYyA9IF9qYXZhZG9jOwotICAgICAgICB0aGlzLnVzZXJTcGVjaWZpZWRJbXBsQ2xhc3MgPSBfaW1wbENsYXNzOwotICAgIH0KLQogICAgIHByb3RlY3RlZCBCSUNsYXNzKCkgewogICAgIH0KIApAQCAtNjUsMTMgKzU1LDE0IEBACiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZSwgb3IgbnVsbCBpZiBub3Qgc3BlY2lmaWVkLgorICAgICAqIChOb3QgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4pCiAgICAgICoKICAgICAgKiBAcmV0dXJuCiAgICAgICogICAgICBSZXR1cm5zIGEgY2xhc3MgbmFtZS4gVGhlIGNhbGxlciBzaG91bGQgPGVtPk5PVDwvZW0+CiAgICAgICogICAgICBhcHBseSBYTUwtdG8tSmF2YSBuYW1lIGNvbnZlcnNpb24gdG8gdGhlIG5hbWUKICAgICAgKiAgICAgIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QuCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewogICAgICAgICBpZiggY2xhc3NOYW1lPT1udWxsICkgICByZXR1cm4gbnVsbDsKIAogICAgICAgICBCSUdsb2JhbEJpbmRpbmcgZ2IgPSBnZXRCdWlsZGVyKCkuZ2V0R2xvYmFsQmluZGluZygpOwpAQCAtOTUsNiArODYsMjAgQEAKICAgICAgICAgcmV0dXJuIHVzZXJTcGVjaWZpZWRJbXBsQ2xhc3M7CiAgICAgfQogCisgICAgQFhtbEF0dHJpYnV0ZShuYW1lPSJyZWYiKQorICAgIHByaXZhdGUgU3RyaW5nIHJlZjsKKworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgY2xhc3MsIG9yIG51bGwuCisgICAgICogRnVsbHkgcXVhbGlmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsZXIgbmVlZHMgdG8gcGVyZm9ybSBlcnJvciBjaGVjayBvbiB0aGlzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhpc3RpbmdDbGFzc1JlZigpIHsKKyAgICAgICAgcmV0dXJuIHJlZjsKKyAgICB9CisKICAgICBAWG1sRWxlbWVudAogICAgIHByaXZhdGUgU3RyaW5nIGphdmFkb2M7CiAgICAgLyoqCkBAIC0xMDUsNyArMTEwLDE0IEBACiAKICAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsgcmV0dXJuIE5BTUU7IH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChCaW5kSW5mbyBwKSB7CisgICAgICAgIHN1cGVyLnNldFBhcmVudChwKTsKKyAgICAgICAgLy8gaWYgdGhpcyBzcGVjaWZpZXMgYSByZWZlcmVuY2UgdG8gZXh0ZXJuYWwgY2xhc3MsCisgICAgICAgIC8vIHRoZW4gaXQncyBPSyBldmVuIGlmIG5vb25lIGFjdHVhbGx5IHJlZmVycyB0aGlzIGNsYXNzLgorICAgICAgICBpZihyZWYhPW51bGwpCisgICAgICAgICAgICBtYXJrQXNBY2tub3dsZWRnZWQoKTsKKyAgICB9CisKICAgICAvKiogTmFtZSBvZiB0aGlzIGRlY2xhcmF0aW9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgTkFNRSA9IG5ldyBRTmFtZSgKLSAgICAgICAgQ29uc3QuSkFYQl9OU1VSSSwgImNsYXNzIiApOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgTkFNRSA9IG5ldyBRTmFtZSggQ29uc3QuSkFYQl9OU1VSSSwgImNsYXNzIiApOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSUNvbnZlcnNpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklDb252ZXJzaW9uLmphdmEKaW5kZXggMjY1ZmZlMS4uNDJkODJkNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSUNvbnZlcnNpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJQ29udmVyc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXI7CkBAIC00Miw2ICs0MSw3IEBACiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlBhY2thZ2U7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlR5cGU7CiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSlZhcjsKK2ltcG9ydCBjb20uc3VuLmNvZGVtb2RlbC5pbnRlcm5hbC5KQ29uZGl0aW9uYWw7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuRXJyb3JSZWNlaXZlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQWRhcHRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQnVpbHRpbkxlYWZJbmZvOwpAQCAtMjMzLDYgKzIzMywxMCBAQAogCiAgICAgICAgICAgICAgICAgLy8gUkVTVUxUOiA8dmFsdWU+LjxtZXRob2Q+KCkKICAgICAgICAgICAgICAgICBpbnYgPSAkdmFsdWUuaW52b2tlKHByaW50TWV0aG9kKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHZhbHVlIGlzIG5vdCBudWxsIC4uLiBpZih2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBKQ29uZGl0aW9uYWwgamNvbiA9IG1hcnNoYWwuYm9keSgpLl9pZigkdmFsdWUuZXEoSkV4cHIuX251bGwoKSkpOworICAgICAgICAgICAgICAgIGpjb24uX3RoZW4oKS5fcmV0dXJuKEpFeHByLl9udWxsKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBSRVNVTFQ6IDxjbGFzc05hbWU+LjxtZXRob2Q+KDx2YWx1ZT4pCiAgICAgICAgICAgICAgICAgaWYodGhpcy5wcmludE1ldGhvZD09bnVsbCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSURlY2xhcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJRGVjbGFyYXRpb24uamF2YQppbmRleCA3N2ZhYjBmLi40YTEzYzIwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJRGVjbGFyYXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJRGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtNTIsNyArNTEsOSBAQAogICAgICAqCiAgICAgICogPHA+CiAgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIG9ubHkgY2FsbGVkIGZyb20ge0BsaW5rIEJpbmRJbmZvfSwKLSAgICAgKiBhbmQgb25seSBvbmNlLgorICAgICAqIGFuZCBvbmx5IG9uY2UuIFRoaXMgaXMgYSBnb29kIG9wcG9ydHVuaXR5IHRvIGRvIHNvbWUKKyAgICAgKiBmb2xsb3ctdXAgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgSkFYQiB1bm1hcnNoYWxsaW5nCisgICAgICogcG9wdWxhdGVkIHtAbGluayBCSURlY2xhcmF0aW9ufS4KICAgICAgKi8KICAgICB2b2lkIHNldFBhcmVudCggQmluZEluZm8gcGFyZW50ICk7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklEb20uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklEb20uamF2YQppbmRleCA1NTNjYmQ5Li5hZTQ1ZmIxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJRG9tLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSURvbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJRW51bS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSUVudW0uamF2YQppbmRleCA2NDNlOGI5Li4yZWRlMTM2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJRW51bS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklFbnVtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm87CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTYyLDcgKzYxLDEzIEBACiAKICAgICAvKiogR2V0cyB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUsIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZC4gKi8KICAgICBAWG1sQXR0cmlidXRlKG5hbWU9Im5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKKyAgICBwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBAc2VlIEJJQ2xhc3MjZ2V0RXhpc3RpbmdDbGFzc1JlZigpCisgICAgICovCisgICAgQFhtbEF0dHJpYnV0ZShuYW1lPSJyZWYiKQorICAgIHB1YmxpYyBTdHJpbmcgcmVmOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgamF2YWRvYyBjb21tZW50IHNwZWNpZmllZCBpbiB0aGUgY3VzdG9taXphdGlvbi4KQEAgLTkwLDYgKzk1LDExIEBACiAgICAgICAgIHN1cGVyLnNldFBhcmVudChwKTsKICAgICAgICAgZm9yKCBCSUVudW1NZW1iZXIgbWVtIDogbWVtYmVycy52YWx1ZXMoKSApCiAgICAgICAgICAgICBtZW0uc2V0UGFyZW50KHApOworCisgICAgICAgIC8vIGlmIHRoaXMgc3BlY2lmaWVzIGEgcmVmZXJlbmNlIHRvIGV4dGVybmFsIGNsYXNzLAorICAgICAgICAvLyB0aGVuIGl0J3MgT0sgZXZlbiBpZiBub29uZSBhY3R1YWxseSByZWZlcnMgdGhpcyBjbGFzcy4KKyAgICAgICAgaWYocmVmIT1udWxsKQorICAgICAgICAgICAgbWFya0FzQWNrbm93bGVkZ2VkKCk7CiAgICAgfQogCiAgICAgLyoqIE5hbWUgb2YgdGhpcyBkZWNsYXJhdGlvbi4gKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklFbnVtTWVtYmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJRW51bU1lbWJlci5qYXZhCmluZGV4IDE2OTY3NzEuLjBhM2E2NTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklFbnVtTWVtYmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSUVudW1NZW1iZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSUdsb2JhbEJpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklHbG9iYWxCaW5kaW5nLmphdmEKaW5kZXggMDYyNTE2ZS4uNDY5NTQ3NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSUdsb2JhbEJpbmRpbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJR2xvYmFsQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtMTMzLDYgKzEzMiwxMCBAQAogICAgICAgICByZXR1cm4gc2ltcGxlTW9kZSE9bnVsbDsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0aW9uRnJlc2hUeXBlKCkgeworICAgICAgICByZXR1cm4gdHJlYXRSZXN0cmljdGlvbkxpa2VOZXdUeXBlICE9bnVsbDsKKyAgICB9CisKICAgICBwdWJsaWMgRW51bU1lbWJlck1vZGUgZ2V0RW51bU1lbWJlck1vZGUoKSB7CiAgICAgICAgIHJldHVybiBnZW5lcmF0ZUVudW1NZW1iZXJOYW1lOwogICAgIH0KQEAgLTI3MSw2ICsyNzQsMTIgQEAKICAgICBTdHJpbmcgc2ltcGxlTW9kZSA9IG51bGw7CiAKICAgICAvKioKKyAgICAgKiBIYW5kbGVzIGNvbXBsZXggdHlwZSByZXN0cmljdGlvbiBhcyBpZiBpdCB3ZXJlIGEgbmV3IHR5cGUuCisgICAgICovCisgICAgQFhtbEVsZW1lbnQobmFtZT0idHJlYXRSZXN0cmljdGlvbkxpa2VOZXdUeXBlIixuYW1lc3BhY2U9Q29uc3QuWEpDX0VYVEVOU0lPTl9VUkkpCisgICAgU3RyaW5nIHRyZWF0UmVzdHJpY3Rpb25MaWtlTmV3VHlwZSA9IG51bGw7CisKKyAgICAvKioKICAgICAgKiBUcnVlIHRvIGdlbmVyYXRlIGEgY2xhc3MgZm9yIGVsZW1lbnRzIGJ5IGRlZmF1bHQuCiAgICAgICovCiAgICAgQFhtbEF0dHJpYnV0ZQpAQCAtMjc5LDYgKzI4OCwxMSBAQAogICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZT1Db25zdC5YSkNfRVhURU5TSU9OX1VSSSkKICAgICBCb29sZWFuIGdlbmVyYXRlRWxlbWVudFByb3BlcnR5ID0gbnVsbDsKIAorICAgIEBYbWxBdHRyaWJ1dGUobmFtZT0iZ2VuZXJhdGVFbGVtZW50UHJvcGVydHkiKSAgICAgLy8gZm9yIEpBWEIgdW5tYXJzaGFsbGVyCisgICAgcHJpdmF0ZSB2b2lkIHNldEdlbmVyYXRlRWxlbWVudFByb3BlcnR5U3RkKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgZ2VuZXJhdGVFbGVtZW50UHJvcGVydHkgPSB2YWx1ZTsKKyAgICB9CisKICAgICBAWG1sQXR0cmlidXRlCiAgICAgYm9vbGVhbiBjaG9pY2VDb250ZW50UHJvcGVydHkgPSBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSVByb3BlcnR5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJUHJvcGVydHkuamF2YQppbmRleCA4MDI2ODQ4Li5kMmIzYjQzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJUHJvcGVydHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJUHJvcGVydHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMjgwLDcgKzI3OSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIENWYWx1ZVByb3BlcnR5SW5mbyBjcmVhdGVWYWx1ZVByb3BlcnR5KFN0cmluZyBkZWZhdWx0TmFtZSxib29sZWFuIGZvckNvbnN0YW50LAotICAgICAgICBYU0NvbXBvbmVudCBzb3VyY2UsVHlwZVVzZSB0dSkgeworICAgICAgICBYU0NvbXBvbmVudCBzb3VyY2UsVHlwZVVzZSB0dSwgUU5hbWUgdHlwZU5hbWUpIHsKIAogICAgICAgICBtYXJrQXNBY2tub3dsZWRnZWQoKTsKICAgICAgICAgY29uc3RhbnRQcm9wZXJ0eUVycm9yQ2hlY2soKTsKQEAgLTI5Miw3ICsyOTEsNyBAQAogICAgICAgICAgICAgICAgIG5hbWUgPSBKSmF2YU5hbWUuZ2V0UGx1cmFsRm9ybShuYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiB3cmFwVXAobmV3IENWYWx1ZVByb3BlcnR5SW5mbyhuYW1lLCBzb3VyY2UsZ2V0Q3VzdG9taXphdGlvbnMoc291cmNlKSxzb3VyY2UuZ2V0TG9jYXRvcigpLCB0dSApLHNvdXJjZSk7CisgICAgICAgIHJldHVybiB3cmFwVXAobmV3IENWYWx1ZVByb3BlcnR5SW5mbyhuYW1lLCBzb3VyY2UsZ2V0Q3VzdG9taXphdGlvbnMoc291cmNlKSxzb3VyY2UuZ2V0TG9jYXRvcigpLCB0dSwgdHlwZU5hbWUgKSxzb3VyY2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBDQXR0cmlidXRlUHJvcGVydHlJbmZvIGNyZWF0ZUF0dHJpYnV0ZVByb3BlcnR5KCBYU0F0dHJpYnV0ZVVzZSB1c2UsIFR5cGVVc2UgdHUgKSB7CkBAIC0zMTIsMTIgKzMxMSwxMiBAQAogICAgICAgICAgICAgICAgIG5hbWUgPSBKSmF2YU5hbWUuZ2V0UGx1cmFsRm9ybShuYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIFFOYW1lIG4gPSBuZXcgUU5hbWUodXNlLmdldERlY2woKS5nZXRUYXJnZXROYW1lc3BhY2UoKSx1c2UuZ2V0RGVjbCgpLmdldE5hbWUoKSk7Ci0KICAgICAgICAgbWFya0FzQWNrbm93bGVkZ2VkKCk7CiAgICAgICAgIGNvbnN0YW50UHJvcGVydHlFcnJvckNoZWNrKCk7CiAKLSAgICAgICAgcmV0dXJuIHdyYXBVcChuZXcgQ0F0dHJpYnV0ZVByb3BlcnR5SW5mbyhuYW1lLHVzZSxnZXRDdXN0b21pemF0aW9ucyh1c2UpLHVzZS5nZXRMb2NhdG9yKCksIG4sIHR1LCB1c2UuaXNSZXF1aXJlZCgpICksdXNlKTsKKyAgICAgICAgcmV0dXJuIHdyYXBVcChuZXcgQ0F0dHJpYnV0ZVByb3BlcnR5SW5mbyhuYW1lLHVzZSxnZXRDdXN0b21pemF0aW9ucyh1c2UpLHVzZS5nZXRMb2NhdG9yKCksCisgICAgICAgICAgICAgICAgQkdNQnVpbGRlci5nZXROYW1lKHVzZS5nZXREZWNsKCkpLCB0dSwKKyAgICAgICAgICAgICAgICBCR01CdWlsZGVyLmdldE5hbWUodXNlLmdldERlY2woKS5nZXRUeXBlKCkpLCB1c2UuaXNSZXF1aXJlZCgpICksdXNlKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklTY2hlbWFCaW5kaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJU2NoZW1hQmluZGluZy5qYXZhCmluZGV4IDIxMGVhNGUuLmYwYWI2ZTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklTY2hlbWFCaW5kaW5nLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSVNjaGVtYUJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwpAQCAtNzksNiArNzgsMTQgQEAKICAgICBwcml2YXRlIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvID0gbmV3IFBhY2thZ2VJbmZvKCk7CiAKICAgICAvKioKKyAgICAgKiBJZiBmYWxzZSwgaXQgbWVhbnMgbm90IHRvIGdlbmVyYXRlIGFueSBjbGFzc2VzIGZyb20gdGhpcyBuYW1lc3BhY2UuCisgICAgICogTm8gT2JqZWN0RmFjdG9yeSwgbm8gY2xhc3NlcyAodGhlIG9ubHkgd2F5IHRvIGJpbmQgdGhlbSBpcyBieSB1c2luZworICAgICAqICZsdDtqYXhiOmNsYXNzIHJlZj0iLi4uIi8+KQorICAgICAqLworICAgIEBYbWxBdHRyaWJ1dGUobmFtZT0ibWFwIikKKyAgICBwdWJsaWMgYm9vbGVhbiBtYXAgPSB0cnVlOworCisgICAgLyoqCiAgICAgICogRGVmYXVsdCBuYW1pbmcgcnVsZSwgdGhhdCBkb2Vzbid0IGNoYW5nZSB0aGUgbmFtZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1pbmdSdWxlIGRlZmF1bHROYW1pbmdSdWxlID0gbmV3IE5hbWluZ1J1bGUoIiIsIiIpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSVNlcmlhbGl6YWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSVNlcmlhbGl6YWJsZS5qYXZhCmluZGV4IDk1NDg3OGMuLjVjNjQxZGYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklTZXJpYWxpemFibGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJU2VyaWFsaXphYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm87CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklYRG9tLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJWERvbS5qYXZhCmluZGV4IDVlNzBlMzQuLmM3YWQ5NWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklYRG9tLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSVhEb20uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CSVhQbHVnaW5DdXN0b21pemF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJWFBsdWdpbkN1c3RvbWl6YXRpb24uamF2YQppbmRleCBlOTgwOGMzLi45ZTNhNTQ3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJWFBsdWdpbkN1c3RvbWl6YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJWFBsdWdpbkN1c3RvbWl6YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJWFN1YnN0aXR1dGFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQklYU3Vic3RpdHV0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjM3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JJWFN1YnN0aXR1dGFibGUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm87CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuQ29uc3Q7CisKKy8qKgorICogRm9yY2VzIGEgbm9uLWNvbGxhcHNpbmcgYmVoYXZpb3IgdG8gYWxsb3cgZXh0ZW5zaW9uIHNjaGVtYXMKKyAqIHRvIHBlcmZvcm0gZWxlbWVudCBzdWJzdGl0dXRpb25zLgorICoKKyAqIFNlZSBodHRwczovL2pheGIuZGV2LmphdmEubmV0L2lzc3Vlcy9zaG93X2J1Zy5jZ2k/aWQ9Mjg5CisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQHNpbmNlIDIuMS4xCisgKi8KK0BYbWxSb290RWxlbWVudChuYW1lPSJzdWJzdGl0dXRhYmxlIixuYW1lc3BhY2U9IENvbnN0LlhKQ19FWFRFTlNJT05fVVJJKQorcHVibGljIGZpbmFsIGNsYXNzIEJJWFN1YnN0aXR1dGFibGUgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aW9uSW1wbCB7CisgICAgcHVibGljIGZpbmFsIFFOYW1lIGdldE5hbWUoKSB7IHJldHVybiBOQU1FOyB9CisKKyAgICAvKiogTmFtZSBvZiB0aGUgY29udmVyc2lvbiBkZWNsYXJhdGlvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIE5BTUUgPSBuZXcgUU5hbWUoQ29uc3QuWEpDX0VYVEVOU0lPTl9VUkksInN1YnN0aXR1dGFibGUiKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQmluZEluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQmluZEluZm8uamF2YQppbmRleCAwOWY4ODllLi5jZmM3ZDc1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0JpbmRJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9CaW5kSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YS5pby5GaWx0ZXJXcml0ZXI7CkBAIC0zMCw5ICsyOSwxMiBAQAogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1peGVkOwpAQCAtNDQsMTQgKzQ2LDE3IEBACiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwogCiBpbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwuaW50ZXJuYWwuSkRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuU2NoZW1hQ2FjaGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0N1c3RvbWl6YXRpb25zOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNQbHVnaW5DdXN0b21pemF0aW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLk1vZGVsOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci5SaW5nOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuQkdNQnVpbGRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFubm90YXRpb24uWG1sTG9jYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLm1hcnNoYWxsZXIuTWluaW11bUVzY2FwZUhhbmRsZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5XZWxsS25vd25OYW1lc3BhY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkpBWEJDb250ZXh0SW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OwogCiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKQEAgLTMwNCw0ICszMDksNDAgQEAKICAgICAvKiogQW4gaW5zdGFuY2Ugd2l0aCB0aGUgZW1wdHkgY29udGVudHMuICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBCaW5kSW5mbyBlbXB0eSA9IG5ldyBCaW5kSW5mbygpOwogCisgICAgLyoqCisgICAgICogTGF6aWx5IHByZXBhcmVkIHtAbGluayBKQVhCQ29udGV4dH0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvbnRleHRJbXBsIGN1c3RvbWl6YXRpb25Db250ZXh0OworCisgICAgcHVibGljIHN0YXRpYyBKQVhCQ29udGV4dEltcGwgZ2V0SkFYQkNvbnRleHQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChBbm5vdGF0aW9uUGFyc2VyRmFjdG9yeUltcGwuY2xhc3MpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYoY3VzdG9taXphdGlvbkNvbnRleHQ9PW51bGwpCisgICAgICAgICAgICAgICAgICAgIGN1c3RvbWl6YXRpb25Db250ZXh0ID0gbmV3IEpBWEJDb250ZXh0SW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kSW5mby5jbGFzcywgLy8gZm9yIHhzOmFubm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUNsYXNzLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJQ29udmVyc2lvbi5Vc2VyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJQ29udmVyc2lvbi5Vc2VyQWRhcHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSURvbS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVhEb20uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklYU3Vic3RpdHV0YWJsZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUVudW0uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklFbnVtTWVtYmVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJR2xvYmFsQmluZGluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVByb3BlcnR5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJU2NoZW1hQmluZGluZy5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgfSwgQ29sbGVjdGlvbnMuPFR5cGVSZWZlcmVuY2U+ZW1wdHlMaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPENsYXNzLENsYXNzPmVtcHR5TWFwKCksIG51bGwsIGZhbHNlLCBudWxsLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemF0aW9uQ29udGV4dDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExhemlseSBwYXJzZWQgc2NoZW1hIGZvciB0aGUgYmluZGluZyBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hQ2FjaGUgYmluZGluZ0ZpbGVTY2hlbWEgPSBuZXcgU2NoZW1hQ2FjaGUoQmluZEluZm8uY2xhc3MuZ2V0UmVzb3VyY2UoImJpbmRpbmcueHNkIikpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Db2xsZWN0aW9uVHlwZUF0dHJpYnV0ZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Db2xsZWN0aW9uVHlwZUF0dHJpYnV0ZS5qYXZhCmluZGV4IGM2MWUzMjMuLjNlOThiZGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vQ29sbGVjdGlvblR5cGVBdHRyaWJ1dGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0NvbGxlY3Rpb25UeXBlQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm87CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vRG9tSGFuZGxlckV4LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0RvbUhhbmRsZXJFeC5qYXZhCmluZGV4IDhhNjVhNGMuLjAzMTU0MjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vRG9tSGFuZGxlckV4LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Eb21IYW5kbGVyRXguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0VudW1NZW1iZXJNb2RlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0VudW1NZW1iZXJNb2RlLmphdmEKaW5kZXggYzQ4YThhYy4uODEyZWJjNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9FbnVtTWVtYmVyTW9kZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vRW51bU1lbWJlck1vZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vRm9ya2luZ0ZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Gb3JraW5nRmlsdGVyLmphdmEKaW5kZXggMzQzMDhmOC4uZjJiNzQ3YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Gb3JraW5nRmlsdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Gb3JraW5nRmlsdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuYmluZGluZm87CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Mb2NhbFNjb3BpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vTG9jYWxTY29waW5nLmphdmEKaW5kZXggN2FiNTI4YS4uMTY0NGRkYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9Mb2NhbFNjb3BpbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL0xvY2FsU2NvcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtVmFsdWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCmluZGV4IDBjOWRiNjIuLmQxMDI5YmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDQgKzEsMjkgQEAKICMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCisjCiAjIE1lc3NhZ2UgcmVzb3VyY2UgZmlsZQogIwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL01lc3NhZ2VzLmphdmEKaW5kZXggN2RjODU0OS4uZmExYTE4NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vTWVzc2FnZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL09wdGlvbmFsUHJvcGVydHlNb2RlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL09wdGlvbmFsUHJvcGVydHlNb2RlLmphdmEKaW5kZXggZGZjY2QzNS4uZDk0NDU5ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9PcHRpb25hbFByb3BlcnR5TW9kZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vT3B0aW9uYWxQcm9wZXJ0eU1vZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bVZhbHVlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9iaW5kaW5nLnJuZyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vYmluZGluZy5ybmcKaW5kZXggZDhkZTRhYi4uMzM4NmFmNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9iaW5kaW5nLnJuZworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL2JpbmRpbmcucm5nCkBAIC0xLDQgKzEsMjggQEAKIDw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPCFET0NUWVBFIGdyYW1tYXIgWwogCiA8IUVOVElUWSBYSkNVUkkgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIveGpjIj4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vYmluZGluZy54c2QgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL2JpbmRpbmcueHNkCmluZGV4IDc3YjhjZDEuLmY3NDZhODggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vYmluZGluZy54c2QKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9iaW5kaW5nLnhzZApAQCAtMSw3ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KIDwhLS0KLSBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAKICBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMTEgKzIzLDE5IEBACiAgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICBoYXZlIGFueSBxdWVzdGlvbnMuCiAtLT4KLQogPCEtLSBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUuIERPIE5PVCBNT0RJRlkuIC0tPgogPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHhtbG5zOnhqYz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMiPgogICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMiIHNjaGVtYUxvY2F0aW9uPSJ4amMueHNkIi8+CiAgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgc2NoZW1hTG9jYXRpb249InhzLnhzZCIvPgorICA8eHM6ZWxlbWVudCBuYW1lPSJiaW5kaW5ncyI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOnN0cmluZyIgLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm9kZSIgdHlwZT0ieHM6c3RyaW5nIiAvPiAKKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CiAgIDx4czplbGVtZW50IG5hbWU9ImRlY2xhcmF0aW9uIiBhYnN0cmFjdD0idHJ1ZSIvPgogICA8eHM6ZWxlbWVudCBuYW1lPSJnbG9iYWxCaW5kaW5ncyIgc3Vic3RpdHV0aW9uR3JvdXA9ImpheGI6ZGVjbGFyYXRpb24iPgogICAgIDx4czpjb21wbGV4VHlwZT4KQEAgLTQ2LDYgKzUzLDcgQEAKICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4amM6dHlwZVN1YnN0aXR1dGlvbiIvPgogICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhqYzpzbWFydFdpbGRjYXJkRGVmYXVsdEJpbmRpbmciLz4KICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4amM6c2ltcGxlIi8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0ieGpjOnRyZWF0UmVzdHJpY3Rpb25MaWtlTmV3VHlwZSIvPgogICAgICAgICA8eHM6Z3JvdXAgICByZWY9InhqYzpnbG9iYWxKYXZhVHlwZSIgLz4KICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4amM6Z2VuZXJhdGVFbGVtZW50UHJvcGVydHkiLz4KICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4amM6bm9NYXJzaGFsbGVyIi8+CkBAIC0xMTQsNiArMTIyLDcgQEAKICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2hvaWNlQ29udGVudFByb3BlcnR5IiB0eXBlPSJ4czpib29sZWFuIi8+CiAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRlVmFsdWVDbGFzcyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgogICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0ZUVsZW1lbnRDbGFzcyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0ZUVsZW1lbnRQcm9wZXJ0eSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgogICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmFibGVWYWxpZGF0aW9uIiB0eXBlPSJ4czpib29sZWFuIi8+CiAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuYWJsZUZhaWxGYXN0Q2hlY2siIHR5cGU9InhzOmJvb2xlYW4iLz4KICAgICA8L3hzOmNvbXBsZXhUeXBlPgpAQCAtMTI5LDYgKzEzOCw3IEBACiAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJqYXhiOnBhY2thZ2UiLz4KICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImpheGI6bmFtZVhtbFRyYW5zZm9ybSIvPgogICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWFwIiB0eXBlPSJ4czpib29sZWFuIiAvPgogICAgIDwveHM6Y29tcGxleFR5cGU+CiAgIDwveHM6ZWxlbWVudD4KICAgPHhzOmVsZW1lbnQgbmFtZT0icGFja2FnZSI+CkBAIC0xNDEsMTMgKzE1MSwxMyBAQAogICA8L3hzOmVsZW1lbnQ+CiAgIDx4czplbGVtZW50IG5hbWU9Im5hbWVYbWxUcmFuc2Zvcm0iPgogICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0iamF4Yjp0eXBlTmFtZSIvPgotICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImpheGI6ZWxlbWVudE5hbWUiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXhiOmF0dHJpYnV0ZU5hbWUiLz4KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXhiOm1vZGVsR3JvdXBOYW1lIi8+Ci0gICAgICAgIDx4czplbGVtZW50IHJlZj0iamF4Yjphbm9ueW1vdXNUeXBlTmFtZSIvPgotICAgICAgPC94czpjaG9pY2U+CisgICAgICA8eHM6YWxsPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImpheGI6dHlwZU5hbWUiIG1pbk9jY3Vycz0nMCcvPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImpheGI6ZWxlbWVudE5hbWUiIG1pbk9jY3Vycz0nMCcvPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImpheGI6YXR0cmlidXRlTmFtZSIgbWluT2NjdXJzPScwJy8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF4Yjptb2RlbEdyb3VwTmFtZSIgbWluT2NjdXJzPScwJy8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF4Yjphbm9ueW1vdXNUeXBlTmFtZSIgbWluT2NjdXJzPScwJy8+CisgICAgICA8L3hzOmFsbD4KICAgICA8L3hzOmNvbXBsZXhUeXBlPgogICA8L3hzOmVsZW1lbnQ+CiAgIDx4czplbGVtZW50IG5hbWU9InR5cGVOYW1lIj4KQEAgLTE5MCw2ICsyMDAsNyBAQAogICAgICAgPC94czpzZXF1ZW5jZT4KICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CiAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImltcGxDbGFzcyIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiLz4KICAgICA8L3hzOmNvbXBsZXhUeXBlPgogICA8L3hzOmVsZW1lbnQ+CiAgIDx4czplbGVtZW50IG5hbWU9InByb3BlcnR5IiBzdWJzdGl0dXRpb25Hcm91cD0iamF4YjpkZWNsYXJhdGlvbiI+CkBAIC0yNTAsNiArMjYxLDcgQEAKICAgICAgICAgPC94czpzaW1wbGVUeXBlPgogICAgICAgPC94czphdHRyaWJ1dGU+CiAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIi8+CiAgICAgPC94czpjb21wbGV4VHlwZT4KICAgPC94czplbGVtZW50PgogICA8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlc2FmZUVudW1NZW1iZXIiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXhiOmRlY2xhcmF0aW9uIj4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL3BhY2thZ2UtaW5mby5qYXZhCmluZGV4IDJhNGM2Y2YuLjNmYWNkMzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8vcGFja2FnZS1pbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIEBYbWxTY2hlbWEoZWxlbWVudEZvcm1EZWZhdWx0ID0gUVVBTElGSUVELCBuYW1lc3BhY2U9Q29uc3QuSkFYQl9OU1VSSSkKIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5iaW5kaW5mbzsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL3BhY2thZ2UuaHRtbAppbmRleCA0ZTBjMWNiLi5hZjJiMGE1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8Ym9keT4KIE9iamVjdCBNb2RlbCB0aGF0IHJlcHJlc2VudHMgY3VzdG9taXphdGlvbiBkZWNsYXJhdGlvbnMuCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8veGpjLnhzZCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8veGpjLnhzZAppbmRleCA1ODViNDgwLi40NTM2ZGEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2JpbmRpbmZvL3hqYy54c2QKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby94amMueHNkCkBAIC0xLDcgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQogPCEtLQotIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KIAogIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCw3ICsyMyw2IEBACiAgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICBoYXZlIGFueSBxdWVzdGlvbnMuCiAtLT4KLQogPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIveGpjIiB4bWxuczpqYXhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIiB4bWxuczp4amM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIveGpjIj4KICAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHNjaGVtYUxvY2F0aW9uPSJiaW5kaW5nLnhzZCIvPgogICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHNjaGVtYUxvY2F0aW9uPSJ4cy54c2QiLz4KQEAgLTM0LDYgKzMyLDkgQEAKICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlIj4KICAgICA8eHM6Y29tcGxleFR5cGUvPgogICA8L3hzOmVsZW1lbnQ+CisgIDx4czplbGVtZW50IG5hbWU9InRyZWF0UmVzdHJpY3Rpb25MaWtlTmV3VHlwZSI+CisgICAgPHhzOmNvbXBsZXhUeXBlLz4KKyAgPC94czplbGVtZW50PgogICA8eHM6ZWxlbWVudCBuYW1lPSJub01hcnNoYWxsZXIiPgogICAgIDx4czpjb21wbGV4VHlwZS8+CiAgIDwveHM6ZWxlbWVudD4KQEAgLTQzLDYgKzQ0LDkgQEAKICAgPHhzOmVsZW1lbnQgbmFtZT0ibm9WYWxpZGF0b3IiPgogICAgIDx4czpjb21wbGV4VHlwZS8+CiAgIDwveHM6ZWxlbWVudD4KKyAgPHhzOmVsZW1lbnQgbmFtZT0ic3Vic3RpdHV0YWJsZSI+CisgICAgPHhzOmNvbXBsZXhUeXBlLz4KKyAgPC94czplbGVtZW50PgogICA8eHM6ZWxlbWVudCBuYW1lPSJub1ZhbGlkYXRpbmdVbm1hcnNoYWxsZXIiPgogICAgIDx4czpjb21wbGV4VHlwZS8+CiAgIDwveHM6ZWxlbWVudD4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvYmluZGluZm8veHMueHNkIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby94cy54c2QKaW5kZXggMjc5NmViZC4uMzc5MTc0YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby94cy54c2QKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9iaW5kaW5mby94cy54c2QKQEAgLTEsNyArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCiA8IS0tCi0gQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogCiAgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDcgKzIzLDYgQEAKICBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIGhhdmUgYW55IHF1ZXN0aW9ucy4KIC0tPgotCiA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHhtbG5zOnhqYz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMiPgogICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgc2NoZW1hTG9jYXRpb249ImJpbmRpbmcueHNkIi8+CiAgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiL3hqYyIgc2NoZW1hTG9jYXRpb249InhqYy54c2QiLz4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvQ1RCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0NUQnVpbGRlci5qYXZhCmluZGV4IGI5NmQxYTcuLmRlZGY3MzcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvQ1RCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9DVEJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5jdDsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLkVycm9yUmVjZWl2ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0Nob2ljZUNvbnRlbnRDb21wbGV4VHlwZUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvQ2hvaWNlQ29udGVudENvbXBsZXhUeXBlQnVpbGRlci5qYXZhCmluZGV4IDFjZmJhYWMuLjI0MzE3YTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvQ2hvaWNlQ29udGVudENvbXBsZXhUeXBlQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvQ2hvaWNlQ29udGVudENvbXBsZXhUeXBlQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmN0OwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9Db21wbGV4VHlwZUJpbmRpbmdNb2RlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0NvbXBsZXhUeXBlQmluZGluZ01vZGUuamF2YQppbmRleCAyODgwZmNlLi5kYzllNDBjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0NvbXBsZXhUeXBlQmluZGluZ01vZGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0NvbXBsZXhUeXBlQmluZGluZ01vZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5jdDsKIAogLyoqCkBAIC0zMSw3ICszMCw3IEBACiAgKiBAYXV0aG9yCiAgKiAgICAgS29oc3VrZSBLYXdhZ3VjaGkgKGtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20pCiAgKi8KLWVudW0gQ29tcGxleFR5cGVCaW5kaW5nTW9kZSB7CitwdWJsaWMgZW51bSBDb21wbGV4VHlwZUJpbmRpbmdNb2RlIHsKIAogICAgIC8qKgogICAgICAqIE5laXRoZXIgRkFMTEJBQ0sgbm9yIE5PTU9SRUVYVEVOU0lPTi4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvQ29tcGxleFR5cGVGaWVsZEJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvQ29tcGxleFR5cGVGaWVsZEJ1aWxkZXIuamF2YQppbmRleCA2MTE3NTU0Li5kZGY3ZjM4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0NvbXBsZXhUeXBlRmllbGRCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9Db21wbGV4VHlwZUZpZWxkQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmN0OwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC04Nyw3ICs4Niw3IEBACiAgICAgICogRm9yIHRoaXMgcmVhc29uLCB3ZSBoYXZlIHRvIHJlY29yZCBob3cgZWFjaCBjb21wbGV4IHR5cGUgaXMgYmVpbmcKICAgICAgKiBib3VuZC4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWNvcmRCaW5kaW5nTW9kZSggWFNDb21wbGV4VHlwZSB0eXBlLCBDb21wbGV4VHlwZUJpbmRpbmdNb2RlIGZsYWcgKSB7CisgICAgcHVibGljIHZvaWQgcmVjb3JkQmluZGluZ01vZGUoIFhTQ29tcGxleFR5cGUgdHlwZSwgQ29tcGxleFR5cGVCaW5kaW5nTW9kZSBmbGFnICkgewogICAgICAgICAvLyBpdCBpcyBhbiBlcnJvciB0byBvdmVycmlkZSB0aGUgZmxhZy4KICAgICAgICAgT2JqZWN0IG8gPSBjb21wbGV4VHlwZUJpbmRpbmdNb2Rlcy5wdXQodHlwZSxmbGFnKTsKICAgICAgICAgYXNzZXJ0IG89PW51bGw7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0V4dGVuZGVkQ29tcGxleFR5cGVCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0V4dGVuZGVkQ29tcGxleFR5cGVCdWlsZGVyLmphdmEKaW5kZXggMTM0MWE4NC4uM2I4NTFjZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9FeHRlbmRlZENvbXBsZXhUeXBlQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvRXh0ZW5kZWRDb21wbGV4VHlwZUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5jdDsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMzAsNiArMjksNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3NJbmZvOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNDbGFzczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLldpbGRjYXJkTmFtZUNsYXNzQnVpbGRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlVXNlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgWFNDb21wbGV4VHlwZSBiYXNlVHlwZSA9IGN0LmdldEJhc2VUeXBlKCkuYXNDb21wbGV4VHlwZSgpOwogCiAgICAgICAgIC8vIGJ1aWxkIHRoZSBiYXNlIGNsYXNzCi0gICAgICAgIENDbGFzc0luZm8gYmFzZUNsYXNzID0gc2VsZWN0b3IuYmluZFRvVHlwZShiYXNlVHlwZSx0cnVlKTsKKyAgICAgICAgQ0NsYXNzIGJhc2VDbGFzcyA9IHNlbGVjdG9yLmJpbmRUb1R5cGUoYmFzZVR5cGUsY3QsdHJ1ZSk7CiAgICAgICAgIGFzc2VydCBiYXNlQ2xhc3MhPW51bGw7ICAgLy8gZ2xvYmFsIGNvbXBsZXggdHlwZSBtdXN0IG1hcCB0byBhIGNsYXNzCiAKICAgICAgICAgc2VsZWN0b3IuZ2V0Q3VycmVudEJlYW4oKS5zZXRCYXNlQ2xhc3MoYmFzZUNsYXNzKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvRnJlc2hDb21wbGV4VHlwZUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvRnJlc2hDb21wbGV4VHlwZUJ1aWxkZXIuamF2YQppbmRleCA5ZTExMDY4Li42ODYzYjgxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L0ZyZXNoQ29tcGxleFR5cGVCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9GcmVzaENvbXBsZXhUeXBlQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmN0OwogCiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ1Byb3BlcnR5SW5mbzsKQEAgLTMwLDYgKzI5LDcgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJUHJvcGVydHk7CiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuY3QuQ29tcGxleFR5cGVCaW5kaW5nTW9kZS5GQUxMQkFDS19DT05URU5UOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmN0LkNvbXBsZXhUeXBlQmluZGluZ01vZGUuTk9STUFMOworaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuQkdNQnVpbGRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcGxleFR5cGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbnRlbnRUeXBlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNNb2RlbEdyb3VwOwpAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVCdWlsZGVyLnJlZmVyZXJTdGFjay5wb3AoKTsKIAogICAgICAgICAgICAgICAgIEJJUHJvcGVydHkgcHJvcCA9IEJJUHJvcGVydHkuZ2V0Q3VzdG9taXphdGlvbihjdCk7Ci0gICAgICAgICAgICAgICAgQ1Byb3BlcnR5SW5mbyBwID0gcHJvcC5jcmVhdGVWYWx1ZVByb3BlcnR5KCJWYWx1ZSIsZmFsc2UsY3QsdXNlKTsKKyAgICAgICAgICAgICAgICBDUHJvcGVydHlJbmZvIHAgPSBwcm9wLmNyZWF0ZVZhbHVlUHJvcGVydHkoIlZhbHVlIixmYWxzZSxjdCx1c2UsIEJHTUJ1aWxkZXIuZ2V0TmFtZShzdCkpOwogICAgICAgICAgICAgICAgIHNlbGVjdG9yLmdldEN1cnJlbnRCZWFuKCkuYWRkUHJvcGVydHkocCk7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKaW5kZXggY2RiYjk2ZC4uM2Y0NmYxNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKQEAgLTEsMyArMSwyOCBAQAorIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKIEVSUl9OT19GVVJUSEVSX0VYVEVOU0lPTiA9IFwKICAgICBCYXNlIGNvbXBsZXggdHlwZSAiezB9IiBpcyBkZXJpdmVkIGJ5IHJlc3RyaWN0aW9uLCB3aGlsZSB0aGlzIGNvbXBsZXggdHlwZSAiezF9IiBcCiAgICAgaXMgZGVyaXZlZCBieSBleHRlbnNpb24uIFRoaXMgaXMgbm90IGN1cnJlbnRseSBoYW5kbGVkIGJ5IFhKQywgYnV0IHdlIGFyZSBcCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L01lc3NhZ2VzLmphdmEKaW5kZXggNDliMmJmYy4uYTAzNjlkYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvTWVzc2FnZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5jdDsKIAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9NaXhlZENvbXBsZXhUeXBlQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9NaXhlZENvbXBsZXhUeXBlQnVpbGRlci5qYXZhCmluZGV4IDk2ZjVhOGIuLjk2MzM1MGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvTWl4ZWRDb21wbGV4VHlwZUJ1aWxkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L01peGVkQ29tcGxleFR5cGVCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEuY3Q7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQnVpbHRpbkxlYWZJbmZvOwpAQCAtNjYsNyArNjUsNyBAQAogICAgICAgICBDUHJvcGVydHlJbmZvIHA7CiAKICAgICAgICAgaWYoY29udGVudFR5cGUuYXNFbXB0eSgpIT1udWxsKSB7Ci0gICAgICAgICAgICBwID0gcHJvcC5jcmVhdGVWYWx1ZVByb3BlcnR5KCJDb250ZW50IixmYWxzZSxjdCxDQnVpbHRpbkxlYWZJbmZvLlNUUklORyk7CisgICAgICAgICAgICBwID0gcHJvcC5jcmVhdGVWYWx1ZVByb3BlcnR5KCJDb250ZW50IixmYWxzZSxjdCxDQnVpbHRpbkxlYWZJbmZvLlNUUklORyxudWxsKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFJhd1R5cGVTZXQgdHMgPSBSYXdUeXBlU2V0QnVpbGRlci5idWlsZChjb250ZW50VHlwZS5hc1BhcnRpY2xlKCksZmFsc2UpOwogICAgICAgICAgICAgcCA9IHByb3AuY3JlYXRlUmVmZXJlbmNlUHJvcGVydHkoIkNvbnRlbnQiLGZhbHNlLGN0LHRzLCB0cnVlKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvUmVzdHJpY3RlZENvbXBsZXhUeXBlQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9SZXN0cmljdGVkQ29tcGxleFR5cGVCdWlsZGVyLmphdmEKaW5kZXggM2IwMGE3Ny4uMzVmY2U5NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9SZXN0cmljdGVkQ29tcGxleFR5cGVCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9SZXN0cmljdGVkQ29tcGxleFR5cGVCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTAgKzIyLDkgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmN0OwogCi1pbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuQ0NsYXNzSW5mbzsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5tb2RlbC5DQ2xhc3M7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbXBsZXhUeXBlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNUeXBlOwogCkBAIC00NiwxMCArNDUsMTcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBidWlsZChYU0NvbXBsZXhUeXBlIGN0KSB7CisgICAgICAgIGlmKGJnbUJ1aWxkZXIuZ2V0R2xvYmFsQmluZGluZygpLmlzUmVzdHJpY3Rpb25GcmVzaFR5cGUoKSkgeworICAgICAgICAgICAgLy8gaGFuZGxlIGRlcml2YXRpb24tYnktcmVzdHJpY3Rpb24gbGlrZSBhIHdob2xlIG5ldyB0eXBlCisgICAgICAgICAgICBuZXcgRnJlc2hDb21wbGV4VHlwZUJ1aWxkZXIoKS5idWlsZChjdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCiAgICAgICAgIFhTQ29tcGxleFR5cGUgYmFzZVR5cGUgPSBjdC5nZXRCYXNlVHlwZSgpLmFzQ29tcGxleFR5cGUoKTsKIAogICAgICAgICAvLyBidWlsZCB0aGUgYmFzZSBjbGFzcwotICAgICAgICBDQ2xhc3NJbmZvIGJhc2VDbGFzcyA9IHNlbGVjdG9yLmJpbmRUb1R5cGUoYmFzZVR5cGUsdHJ1ZSk7CisgICAgICAgIENDbGFzcyBiYXNlQ2xhc3MgPSBzZWxlY3Rvci5iaW5kVG9UeXBlKGJhc2VUeXBlLGN0LHRydWUpOwogICAgICAgICBhc3NlcnQgYmFzZUNsYXNzIT1udWxsOyAgIC8vIGdsb2JhbCBjb21wbGV4IHR5cGUgbXVzdCBtYXAgdG8gYSBjbGFzcwogCiAgICAgICAgIHNlbGVjdG9yLmdldEN1cnJlbnRCZWFuKCkuc2V0QmFzZUNsYXNzKGJhc2VDbGFzcyk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L1NURGVyaXZlZENvbXBsZXhUeXBlQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9jdC9TVERlcml2ZWRDb21wbGV4VHlwZUJ1aWxkZXIuamF2YQppbmRleCBkNTNmYjJlLi45Njc5ZjFjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL2N0L1NURGVyaXZlZENvbXBsZXhUeXBlQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvY3QvU1REZXJpdmVkQ29tcGxleFR5cGVCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTIgKzIyLDEyIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5jdDsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLm1vZGVsLkNQcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMubW9kZWwuVHlwZVVzZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLmJpbmRpbmZvLkJJUHJvcGVydHk7CitpbXBvcnQgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5CR01CdWlsZGVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTU2ltcGxlVHlwZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTVHlwZTsKQEAgLTYwLDcgKzYwLDcgQEAKICAgICAgICAgc2ltcGxlVHlwZUJ1aWxkZXIucmVmZXJlclN0YWNrLnBvcCgpOwogCiAgICAgICAgIEJJUHJvcGVydHkgcHJvcCA9IEJJUHJvcGVydHkuZ2V0Q3VzdG9taXphdGlvbihjdCk7Ci0gICAgICAgIENQcm9wZXJ0eUluZm8gcCA9IHByb3AuY3JlYXRlVmFsdWVQcm9wZXJ0eSgiVmFsdWUiLGZhbHNlLGJhc2VUeXBlLHVzZSk7CisgICAgICAgIENQcm9wZXJ0eUluZm8gcCA9IHByb3AuY3JlYXRlVmFsdWVQcm9wZXJ0eSgiVmFsdWUiLGZhbHNlLGJhc2VUeXBlLHVzZSwgQkdNQnVpbGRlci5nZXROYW1lKGJhc2VUeXBlKSk7CiAgICAgICAgIHNlbGVjdG9yLmdldEN1cnJlbnRCZWFuKCkuYWRkUHJvcGVydHkocCk7CiAKICAgICAgICAgLy8gYWRkcyBhdHRyaWJ1dGVzIGFuZCB3ZSBhcmUgdGhyb3VnaC4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL0N1c3RvbWl6YXRpb25Db250ZXh0Q2hlY2tlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvQ3VzdG9taXphdGlvbkNvbnRleHRDaGVja2VyLmphdmEKaW5kZXggZWZlODZhNi4uNGM0MzFlYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvQ3VzdG9taXphdGlvbkNvbnRleHRDaGVja2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvQ3VzdG9taXphdGlvbkNvbnRleHRDaGVja2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEucGFyc2VyOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9JbmNvcnJlY3ROYW1lc3BhY2VVUklDaGVja2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9JbmNvcnJlY3ROYW1lc3BhY2VVUklDaGVja2VyLmphdmEKaW5kZXggNDY3N2ZhOS4uMjQ0NmQ5NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvSW5jb3JyZWN0TmFtZXNwYWNlVVJJQ2hlY2tlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL0luY29ycmVjdE5hbWVzcGFjZVVSSUNoZWNrZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5wYXJzZXI7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuQ29uc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9MU0lucHV0U0FYV3JhcHBlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvTFNJbnB1dFNBWFdyYXBwZXIuamF2YQppbmRleCBkYTk5MGFjLi40NTdjNzhiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9MU0lucHV0U0FYV3JhcHBlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL0xTSW5wdXRTQVhXcmFwcGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJlYWRlci54bWxzY2hlbWEucGFyc2VyOwogCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcwppbmRleCBhNjIwZWExLi4yNThhZGZjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvTWVzc2FnZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDQgKzEsMjkgQEAKICMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCisjCiAjIE1lc3NhZ2UgcmVzb3VyY2UgZmlsZQogIwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9NZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvTWVzc2FnZXMuamF2YQppbmRleCA5ODFhZGYyLi42YzNmZDFjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvU2NoZW1hQ29uc3RyYWludENoZWNrZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL1NjaGVtYUNvbnN0cmFpbnRDaGVja2VyLmphdmEKaW5kZXggYTEyOTY3Yy4uYzZhZmZmMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvU2NoZW1hQ29uc3RyYWludENoZWNrZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9TY2hlbWFDb25zdHJhaW50Q2hlY2tlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIueG1sc2NoZW1hLnBhcnNlcjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL1hNTFNjaGVtYUludGVybmFsaXphdGlvbkxvZ2ljLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9yZWFkZXIveG1sc2NoZW1hL3BhcnNlci9YTUxTY2hlbWFJbnRlcm5hbGl6YXRpb25Mb2dpYy5qYXZhCmluZGV4IDFhYjE3NmEuLjE2ZWI4NjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3JlYWRlci94bWxzY2hlbWEvcGFyc2VyL1hNTFNjaGVtYUludGVybmFsaXphdGlvbkxvZ2ljLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcmVhZGVyL3htbHNjaGVtYS9wYXJzZXIvWE1MU2NoZW1hSW50ZXJuYWxpemF0aW9uTG9naWMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucmVhZGVyLnhtbHNjaGVtYS5wYXJzZXI7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5yZWFkZXIuaW50ZXJuYWxpemVyLkFic3RyYWN0UmVmZXJlbmNlRmluZGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3J1bnRpbWUvSkFYQkNvbnRleHRGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9ydW50aW1lL0pBWEJDb250ZXh0RmFjdG9yeS5qYXZhCmluZGV4IGU3MTA2NGYuLjMxZjA0MzAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3J1bnRpbWUvSkFYQkNvbnRleHRGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcnVudGltZS9KQVhCQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMucnVudGltZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC05Myw3ICs5Miw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmaW5kIG9uZSwgdGVsbCB0aGUgcmVhbCBKQVhCIHByb3ZpZGVyIHRvCiAgICAgICAgICAgICAgICAgLy8gbG9hZCBmb28uYmFyLmltcGwuT2JqZWN0RmFjdG9yeQotICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxlbmd0aCgpLURPVF9PQkpFQ1RfRkFDVE9SWS5sZW5ndGgoKSkrSU1QTF9ET1RfT0JKRUNUX0ZBQ1RPUlk7CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsbmFtZS5sZW5ndGgoKS1ET1RfT0JKRUNUX0ZBQ1RPUlkubGVuZ3RoKCkpK0lNUExfRE9UX09CSkVDVF9GQUNUT1JZOwogCiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgYyA9IGMuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobmFtZSk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9ydW50aW1lL1plcm9PbmVCb29sZWFuQWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcnVudGltZS9aZXJvT25lQm9vbGVhbkFkYXB0ZXIuamF2YQppbmRleCA4OTliNDU0Li40MmU0ZjJkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9ydW50aW1lL1plcm9PbmVCb29sZWFuQWRhcHRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3J1bnRpbWUvWmVyb09uZUJvb2xlYW5BZGFwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5EYXRhdHlwZUNvbnZlcnRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3J1bnRpbWUvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcnVudGltZS9wYWNrYWdlLmh0bWwKaW5kZXggOWI4N2ZhNy4uMjE4MmViNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcnVudGltZS9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcnVudGltZS9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGh0bWw+PGJvZHk+CiAgIENvZGUgZ2VuZXJhdGVkIGludG8gdGhlIHVzZXIncyBwYWNrYWdlcyBpbiBjZXJ0YWluIGNvbXBpbGF0aW9uIG1vZGUuCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvQ29kZU1vZGVsQ2xhc3NGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0NvZGVNb2RlbENsYXNzRmFjdG9yeS5qYXZhCmluZGV4IGU1ZThhMTQuLmEyMGY1ZWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvQ29kZU1vZGVsQ2xhc3NGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9Db2RlTW9kZWxDbGFzc0ZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMudXRpbDsKIAogaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLmludGVybmFsLkNsYXNzVHlwZTsKQEAgLTExNyw2ICsxMTYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGNscy5uYW1lKCkgKSwgbnVsbCApICk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmKFV0aWwuZXF1YWxzKChMb2NhdG9yKWNscy5tZXRhZGF0YSxzb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JSZWNlaXZlci5lcnJvciggbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoIE1lc3NhZ2VzLkVSUl9DSEFNRUxFT05fU0NIRU1BX0dPTkVfV0lMRCApLAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UgKSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdW1teUNsYXNzKHBhcmVudCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0RPTVV0aWxzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0RPTVV0aWxzLmphdmEKaW5kZXggZjVmOTRiNS4uMDk5OWJlYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9ET01VdGlscy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvRE9NVXRpbHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMyw3ICsyMyw2IEBACiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KIAotCiAvKgogICogRE9NVXRpbHMuamF2YQogICoKQEAgLTQ2LDYgKzQ1LDcgQEAKIC8qKgogICoKICAqIEBhdXRob3IgIFZpdmVrIFBhbmRleQorICogQHZlcnNpb24gMS4wCiAgKgogICovCiBwdWJsaWMgY2xhc3MgRE9NVXRpbHMgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9FcnJvclJlY2VpdmVyRmlsdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0Vycm9yUmVjZWl2ZXJGaWx0ZXIuamF2YQppbmRleCBkZjdiMGM0Li41MmQ5Njg5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0Vycm9yUmVjZWl2ZXJGaWx0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0Vycm9yUmVjZWl2ZXJGaWx0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMudXRpbDsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLkVycm9yUmVjZWl2ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0ZvcmtDb250ZW50SGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9Gb3JrQ29udGVudEhhbmRsZXIuamF2YQppbmRleCA2MGYyYWI1Li4zNTg3MmYzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0ZvcmtDb250ZW50SGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvRm9ya0NvbnRlbnRIYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnV0aWw7CiAKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwpAQCAtMzUsNiArMzQsNyBAQAogICogdHdvIENvbnRlbnRIYW5kbGVycy4KICAqCiAgKgorICogQHZlcnNpb24gICAgICRJZDogRm9ya0NvbnRlbnRIYW5kbGVyLmphdmEsdiAxLjEgMjAwNS8wNS8yMyAxNzowNDo1OCBrb2hzdWtlIEV4cCAkCiAgKiBAYXV0aG9yICA8YSBocmVmPSJtYWlsdG86a29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSI+S29oc3VrZSBLQVdBR1VDSEk8L2E+CiAgKi8KIHB1YmxpYyBjbGFzcyBGb3JrQ29udGVudEhhbmRsZXIgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlciB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0ZvcmtFbnRpdHlSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9Gb3JrRW50aXR5UmVzb2x2ZXIuamF2YQppbmRleCBiZWNmMzY5Li40ZmJlNWMxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL0ZvcmtFbnRpdHlSZXNvbHZlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvRm9ya0VudGl0eVJlc29sdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9NZXNzYWdlQnVuZGxlLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcwppbmRleCBkZjE5NjI3Li41YjgwZTNmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL01lc3NhZ2VCdW5kbGUucHJvcGVydGllcwpAQCAtMSw0ICsxLDI5IEBACiAjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKworIwogIyBNZXNzYWdlIHJlc291cmNlIGZpbGUKICMKIApAQCAtMTksNCArNDQsMTAgQEAKIENvZGVNb2RlbENsYXNzRmFjdG9yeS5DYXNlU2Vuc2l0aXZpdHlDb2xsaXNpb24gPSBcCiAJVGhpcyBlcnJvciBpcyBjYXVzZWQgYmVjYXVzZSBvbiBXaW5kb3dzIHlvdSBjYW5ub3QgaGF2ZSBib3RoICJ7MH0uamF2YSIgYW5kICJ7MX0uamF2YSIgXAogCWluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKworRVJSX0NIQU1FTEVPTl9TQ0hFTUFfR09ORV9XSUxEID0gXAorICAgIChSZWxldmFudCB0byBhYm92ZSBlcnJvcikgVGhpcyBjb25mdXNpbmcgZXJyb3IgaGFwcGVuZWQgbW9zdCBsaWtlbHkgYmVjYXVzZSB0aGUgc2NoZW1hIHVzZXMgYSB0ZWNobmlxdWUgY2FsbGVkIFwKKyAgICAiY2hhbWVsZW9uIHNjaGVtYSIsIHdoaWNoIGNhdXNlcyBhIHNpbmdsZSBkZWZpbml0aW9uIHRvIGJlIGxvYWRlZCBtdWx0aXBsZSB0aW1lcyBpbnRvIFwKKyAgICBkaWZmZXJlbnQgbmFtZXNwYWNlcy4gU2VlIGh0dHA6Ly9mb3J1bXMuamF2YS5uZXQvaml2ZS90aHJlYWQuanNwYT90aHJlYWRJRD0xODYzMSBmb3IgXAorICAgIG1vcmUgYWJvdXQgdGhpcy4KICAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTWVzc2FnZXMuamF2YQppbmRleCBiMDBhZjY1Li5kOGZlMmM3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTUxLDQgKzUxLDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX0NBU0VfU0VOU0lUSVZJVFlfQ09MTElTSU9OID0gLy8gMiBhcmdzCiAgICAgICAgICJDb2RlTW9kZWxDbGFzc0ZhY3RvcnkuQ2FzZVNlbnNpdGl2aXR5Q29sbGlzaW9uIjsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX0NIQU1FTEVPTl9TQ0hFTUFfR09ORV9XSUxEID0gLy8gbm8gYXJndHMKKyAgICAgICAgIkVSUl9DSEFNRUxFT05fU0NIRU1BX0dPTkVfV0lMRCI7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL01pbWVUeXBlUmFuZ2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTWltZVR5cGVSYW5nZS5qYXZhCmluZGV4IDVmODE0YWEuLjJiYzAyYzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTWltZVR5cGVSYW5nZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTWltZVR5cGVSYW5nZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsOwogCiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9OYW1lc3BhY2VDb250ZXh0QWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9OYW1lc3BhY2VDb250ZXh0QWRhcHRlci5qYXZhCmluZGV4IDNjNjIyNTMuLmMxNTE2M2QgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTmFtZXNwYWNlQ29udGV4dEFkYXB0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL05hbWVzcGFjZUNvbnRleHRBZGFwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL051bGxTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTnVsbFN0cmVhbS5qYXZhCmluZGV4IDAzZjUwZTguLjg4ZDE1YzQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTnVsbFN0cmVhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvTnVsbFN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy51dGlsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvUmVhZE9ubHlBZGFwdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL1JlYWRPbmx5QWRhcHRlci5qYXZhCmluZGV4IGRiMzJlMjQuLmU3ZGVjMmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvUmVhZE9ubHlBZGFwdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9SZWFkT25seUFkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMudXRpbDsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sQWRhcHRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvU3RyaW5nQ3V0dGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL1N0cmluZ0N1dHRlci5qYXZhCmluZGV4IDQxNDM0NGYuLjVmZTcxMjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvU3RyaW5nQ3V0dGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9TdHJpbmdDdXR0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMudXRpbDsKIAogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvU3VidHJlZUN1dHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9TdWJ0cmVlQ3V0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzOWVjOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3V0aWwvU3VidHJlZUN1dHRlci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnV0aWw7CisKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxGaWx0ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKy8qKgorICoge0BsaW5rIFhNTEZpbHRlcn0gdGhhdCBjYW4gY3V0IHN1Yi10cmVlcy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJ0cmVlQ3V0dGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbCB7CisgICAgLyoqCisgICAgICogV2hlbiB3ZSBhcmUgcHJ1bmluZyBhIHN1YiB0cmVlLCB0aGlzIGZpZWxkIGhvbGRzIHRoZSBkZXB0aCBvZgorICAgICAqIGVsZW1lbnRzIHRoYXQgYXJlIGJlaW5nIGN1dC4gVXNlZCB0byByZXN1bWUgZXZlbnQgZm9yd2FyZGluZy4KKyAgICAgKgorICAgICAqIEFzIGxvbmcgYXMgdGhpcyB2YWx1ZSBpcyAwLCB3ZSB3aWxsIHBhc3MgdGhyb3VnaCBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGN1dERlcHRoPTA7CisKKworICAgIC8qKgorICAgICAqIFRoaXMgb2JqZWN0IHdpbGwgcmVjZWl2ZSBTQVggZXZlbnRzIHdoaWxlIGEgc3ViIHRyZWUgaXMgYmVpbmcKKyAgICAgKiBwcnVuZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29udGVudEhhbmRsZXIgc3R1YiA9IG5ldyBEZWZhdWx0SGFuZGxlcigpOworCisgICAgLyoqCisgICAgICogVGhpcyBmaWVsZCByZW1lbWJlcnMgdGhlIHVzZXItc3BlY2lmaWVkIENvbnRlbnRIYW5kbGVyLgorICAgICAqIFNvIHRoYXQgd2UgY2FuIHJlc3RvcmUgaXQgb25jZSB0aGUgc3ViIHRyZWUgaXMgY29tcGxldGVseSBwcnVuZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBDb250ZW50SGFuZGxlciBuZXh0OworCisKKyAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGN1dERlcHRoPTA7CisgICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0N1dHRpbmcoKSB7CisgICAgICAgIHJldHVybiBjdXREZXB0aD4wOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBjdXR0aW5nIGEgc3ViLXRyZWUuIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlCisgICAgICoge0BsaW5rICNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQXR0cmlidXRlcyl9IGltcGxlbWVudGF0aW9uCisgICAgICogYmVmb3JlIHRoZSBleGVjdXRpb24gaXMgcGFzc2VkIHRvIHtAbGluayBTdWJ0cmVlQ3V0dGVyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBBdHRyaWJ1dGVzKX0gLgorICAgICAqIFRoZSBjdXJyZW50IGVsZW1lbnQgd2lsbCBiZSBjdXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRDdXR0aW5nKCkgeworICAgICAgICBzdXBlci5zZXRDb250ZW50SGFuZGxlcihzdHViKTsKKyAgICAgICAgY3V0RGVwdGg9MTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIG5leHQgPSBoYW5kbGVyOworICAgICAgICAvLyBjaGFuZ2VzIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5IHVubGVzcyB0aGUgc3ViLXRyZWUgaXMgYmVpbmcgcHJ1bmVkCisgICAgICAgIGlmKGdldENvbnRlbnRIYW5kbGVyKCkhPXN0dWIpCisgICAgICAgICAgICBzdXBlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZihjdXREZXB0aD4wKQorICAgICAgICAgICAgY3V0RGVwdGgrKzsKKyAgICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSk7CisKKyAgICAgICAgaWYoIGN1dERlcHRoIT0wICkgeworICAgICAgICAgICAgY3V0RGVwdGgtLTsKKyAgICAgICAgICAgIGlmKCBjdXREZXB0aCA9PSAxICkgeworICAgICAgICAgICAgICAgIC8vIHBydW5pbmcgY29tcGxldGVkLiByZXN0b3JlIHRoZSB1c2VyIGhhbmRsZXIKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRDb250ZW50SGFuZGxlcihuZXh0KTsKKyAgICAgICAgICAgICAgICBjdXREZXB0aD0wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9VdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL1V0aWwuamF2YQppbmRleCAwYjhkNzdmLi45ZWU3MjRmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL1V0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL1V0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw5ICsyMiwxMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnV0aWw7CiAKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCiAKIC8qKgogICogT3RoZXIgbWlzY2VsbGFuZW91cyB1dGlsaXR5IG1ldGhvZHMuCkBAIC00MCw3ICs0MSw3IEBACiAgICAgICogdGhhdCBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbiBldmVuIGlmIGEgcHJvcGVydHkgY2Fubm90IGJlCiAgICAgICogcmVhZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eSggU3RyaW5nIG5hbWUgKSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3lzdGVtUHJvcGVydHkoIFN0cmluZyBuYW1lICkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShuYW1lKTsKICAgICAgICAgfSBjYXRjaCggU2VjdXJpdHlFeGNlcHRpb24gZSApIHsKQEAgLTQ5LDEwICs1MCwyNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbXBhcmVzIGlmIHR3byB7QGxpbmsgTG9jYXRvcn1zIHBvaW50IHRvIHRoZSBleGFjdCBzYW1lIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoTG9jYXRvciBsaHMsIExvY2F0b3IgcmhzKSB7CisgICAgICAgIHJldHVybiBsaHMuZ2V0TGluZU51bWJlcigpPT1yaHMuZ2V0TGluZU51bWJlcigpCisgICAgICAgICYmIGxocy5nZXRDb2x1bW5OdW1iZXIoKT09cmhzLmdldENvbHVtbk51bWJlcigpCisgICAgICAgICYmIGVxdWFscyhsaHMuZ2V0U3lzdGVtSWQoKSxyaHMuZ2V0U3lzdGVtSWQoKSkKKyAgICAgICAgJiYgZXF1YWxzKGxocy5nZXRQdWJsaWNJZCgpLHJocy5nZXRQdWJsaWNJZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgbGhzLCBTdHJpbmcgcmhzKSB7CisgICAgICAgIGlmKGxocz09bnVsbCAmJiByaHM9PW51bGwpICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYobGhzPT1udWxsIHx8IHJocz09bnVsbCkgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGxocy5lcXVhbHMocmhzKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDYWxscyB0aGUgb3RoZXIgZ2V0U3lzdGVtUHJvcGVydHkgbWV0aG9kIHdpdGgKICAgICAgKiAiW2NsYXp6XSYjeDJFO1tuYW1lXS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eSggQ2xhc3MgY2xhenosIFN0cmluZyBuYW1lICkgeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KCBDbGFzcyBjbGF6eiwgU3RyaW5nIG5hbWUgKSB7CiAgICAgICAgIHJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eSggY2xhenouZ2V0TmFtZSgpKycuJytuYW1lICk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvdXRpbC9YTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL1hNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiNDlmMC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy91dGlsL1hNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLnV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzaW1wbGUgdXRpbGl0eSBjbGFzcyB0aGF0IGFkYXB0cyBTdEFYIGV2ZW50cyBmcm9tIGFuCi0gKiB7QGxpbmsgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXJ9IHRvIFNBWCBldmVudHMgb24gYQotICoge0BsaW5rIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyfSwgYnJpZGdpbmcgYmV0d2VlbiB0aGUgdHdvCi0gKiBwYXJzZXIgdGVjaG5vbG9naWVzLgotICoKLSAqIEBhdXRob3IgUnlhbi5TaG9lbWFrZXJAU3VuLkNPTQotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RyZWFtUmVhZGVyVG9Db250ZW50SGFuZGxlciB7Ci0KLSAgICAvLyBTdEFYIGV2ZW50IHNvdXJjZQotICAgIHByaXZhdGUgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHN0YXhTdHJlYW1SZWFkZXI7Ci0KLSAgICAvLyBTQVggZXZlbnQgc2luawotICAgIHByaXZhdGUgZmluYWwgQ29udGVudEhhbmRsZXIgc2F4SGFuZGxlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBTdEFYIHRvIFNBWCBhZGFwdGVyIHRoYXQgd2lsbCBjb252ZXJ0IGEgU3RBWCBldmVudAotICAgICAqIHN0cmVhbSBpbnRvIGEgU0FYIGV2ZW50IHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGF4Q29yZQotICAgICAqICAgICAgICAgICAgICAgIFN0QVggZXZlbnQgc291cmNlCi0gICAgICogQHBhcmFtIHNheENvcmUKLSAgICAgKiAgICAgICAgICAgICAgICBTQVhldmVudCBzaW5rCi0gICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXIoWE1MU3RyZWFtUmVhZGVyIHN0YXhDb3JlLCBDb250ZW50SGFuZGxlciBzYXhDb3JlKSB7Ci0gICAgICAgIHN0YXhTdHJlYW1SZWFkZXIgPSBzdGF4Q29yZTsKLSAgICAgICAgc2F4SGFuZGxlciA9IHNheENvcmU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFN0QVhSZWFkZXJUb0NvbnRlbnRIYW5kbGVyI2JyaWRnZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnJpZGdlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHJlbWVtYmVycyB0aGUgbmVzdCBsZXZlbCBvZiBlbGVtZW50cyB0byBrbm93IHdoZW4gd2UgYXJlIGRvbmUuCi0gICAgICAgICAgICBpbnQgZGVwdGg9MDsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIHBhcnNlciBpcyBhdCB0aGUgc3RhcnQgdGFnLCBwcm9jZWVkIHRvIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICBpbnQgZXZlbnQgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgaWYoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gbmV4dFRhZyBkb2Vzbid0IGNvcnJlY3RseSBoYW5kbGUgRFREcwotICAgICAgICAgICAgICAgIHdoaWxlKCAhc3RheFN0cmVhbVJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICkKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBzdGF4U3RyZWFtUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBpZiggZXZlbnQhPVhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBjdXJyZW50IGV2ZW50IGlzIG5vdCBTVEFSVF9FTEVNRU5UXG4gYnV0ICIgKyBldmVudCk7Ci0KLSAgICAgICAgICAgIGhhbmRsZVN0YXJ0RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBhbGwgb2YgdGhlIGV2ZW50cyBsaXN0ZWQgaW4gdGhlIGphdmFkb2MgZm9yCi0gICAgICAgICAgICAgICAgLy8gWE1MRXZlbnQuCi0gICAgICAgICAgICAgICAgLy8gVGhlIHNwZWMgb25seSByZWFsbHkgZGVzY3JpYmVzIDExIG9mIHRoZW0uCi0gICAgICAgICAgICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdGFydEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMgOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hhcmFjdGVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkVOVElUWV9SRUZFUkVOQ0UgOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRW50aXR5UmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNPTU1FTlQgOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29tbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkRURCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEVEQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5BVFRSSUJVVEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuTkFNRVNQQUNFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNEQVRBIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNEQVRBKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5USVRZX0RFQ0xBUkFUSU9OIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVudGl0eURlY2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5OT1RBVElPTl9ERUNMQVJBVElPTiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RhdGlvbkRlY2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TUEFDRSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoInByb2Nlc3NpbmcgZXZlbnQ6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXZlbnQ9c3RheFN0cmVhbVJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICB9IHdoaWxlIChkZXB0aCE9MCk7Ci0KLSAgICAgICAgICAgIGhhbmRsZUVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNheEhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBzYXhIYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihuZXcgTG9jYXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF4U3RyZWFtUmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXhTdHJlYW1SZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF4U3RyZWFtUmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0UHVibGljSWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXhTdHJlYW1SZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRTeXN0ZW1JZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgc2F4SGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBJKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzYXhIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLSAgICAgICAgICAgICAgICBzdGF4U3RyZWFtUmVhZGVyLmdldFBJVGFyZ2V0KCksCi0gICAgICAgICAgICAgICAgc3RheFN0cmVhbVJlYWRlci5nZXRQSURhdGEoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYXJhY3RlcnMoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNheEhhbmRsZXIuY2hhcmFjdGVycygKLSAgICAgICAgICAgICAgICBzdGF4U3RyZWFtUmVhZGVyLmdldFRleHRDaGFyYWN0ZXJzKCksCi0gICAgICAgICAgICAgICAgc3RheFN0cmVhbVJlYWRlci5nZXRUZXh0U3RhcnQoKSwKLSAgICAgICAgICAgICAgICBzdGF4U3RyZWFtUmVhZGVyLmdldFRleHRMZW5ndGgoKSApOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFbmRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gc3RheFN0cmVhbVJlYWRlci5nZXROYW1lKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcmUgZW5kRWxlbWVudAotICAgICAgICAgICAgc2F4SGFuZGxlci5lbmRFbGVtZW50KAotICAgICAgICAgICAgICAgIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgIHFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgIHFOYW1lLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyBlbmQgbmFtZXNwYWNlIGJpbmRpbmdzCi0gICAgICAgICAgICBpbnQgbnNDb3VudCA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBuc0NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3RheFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7IC8vIHRydWUgZm9yIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYXhIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU3RhcnRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHN0YXJ0IG5hbWVzcGFjZSBiaW5kaW5ncwotICAgICAgICAgICAgaW50IG5zQ291bnQgPSBzdGF4U3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHNheEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKAotICAgICAgICAgICAgICAgICAgICBmaXhOdWxsKHN0YXhTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpKSwKLSAgICAgICAgICAgICAgICAgICAgZml4TnVsbChzdGF4U3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZVVSSShpKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaXJlIHN0YXJ0RWxlbWVudAotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzdGF4U3RyZWFtUmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBxTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgIFN0cmluZyByYXduYW1lOwotICAgICAgICAgICAgaWYocHJlZml4PT1udWxsIHx8IHByZWZpeC5sZW5ndGgoKT09MCkKLSAgICAgICAgICAgICAgICByYXduYW1lID0gcU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmF3bmFtZSA9IHByZWZpeCArICc6JyArIHFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IGdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIHNheEhhbmRsZXIuc3RhcnRFbGVtZW50KAotICAgICAgICAgICAgICAgIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgIHFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgIHJhd25hbWUsCi0gICAgICAgICAgICAgICAgYXR0cnMpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaXhOdWxsKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmKHM9PW51bGwpICAgICByZXR1cm4gIiI7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBTVEFSVF9FTEVNRU5UIG9yIEFUVFJJQlVURQotICAgICAqIFN0QVhldmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFN0QVggYXR0cmlidXRlcyBjb252ZXJ0ZWQgdG8gYW4gb3JnLnhtbC5zYXguQXR0cmlidXRlcwotICAgICAqLwotICAgIHByaXZhdGUgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICBBdHRyaWJ1dGVzSW1wbCBhdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotCi0gICAgICAgIGludCBldmVudFR5cGUgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICBpZiAoZXZlbnRUeXBlICE9IFhNTFN0cmVhbUNvbnN0YW50cy5BVFRSSUJVVEUKLSAgICAgICAgICAgICYmIGV2ZW50VHlwZSAhPSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoCi0gICAgICAgICAgICAgICAgImdldEF0dHJpYnV0ZXMoKSBhdHRlbXB0aW5nIHRvIHByb2Nlc3M6ICIgKyBldmVudFR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW4gU0FYLCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBhdHRyaWJ1dGVzIGJ5IGRlZmF1bHQuCi0gICAgICAgIC8vICh0aGVyZSdzIGEgcHJvcGVydHkgdG8gY29udHJvbCB0aGF0LCBidXQgYXMgZmFyIGFzIHdlIGFyZSBjb25jZXJuZWQKLSAgICAgICAgLy8gd2UgZG9uJ3QgdXNlIGl0LikgU28gZG9uJ3QgYWRkIHhtbG5zOiogdG8gYXR0cmlidXRlcy4KLQotICAgICAgICAvLyBnYXRoZXIgbm9uLW5hbWVzcGFjZSBhdHRycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXhTdHJlYW1SZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaSk7Ci0gICAgICAgICAgICBpZih1cmk9PW51bGwpICAgdXJpPSIiOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0QXR0cmlidXRlUHJlZml4KGkpOwotICAgICAgICAgICAgU3RyaW5nIHFOYW1lOwotICAgICAgICAgICAgaWYocHJlZml4PT1udWxsIHx8IHByZWZpeC5sZW5ndGgoKT09MCkKLSAgICAgICAgICAgICAgICBxTmFtZSA9IGxvY2FsTmFtZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBxTmFtZSA9IHByZWZpeCArICc6JyArIGxvY2FsTmFtZTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlID0gc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVUeXBlKGkpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLQotICAgICAgICAgICAgYXR0cnMuYWRkQXR0cmlidXRlKHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgdHlwZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF0dHJzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOYW1lc3BhY2UoKSB7Ci0gICAgICAgIC8vIG5vLW9wID8/PwotICAgICAgICAvLyBuYW1lc3BhY2UgZXZlbnRzIGRvbid0IG5vcm1hbGx5IG9jY3VyIG91dHNpZGUgb2YgYSBzdGFydEVsZW1lbnQKLSAgICAgICAgLy8gb3IgZW5kRWxlbWVudAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIC8vIG5vLW9wID8/PwotICAgICAgICAvLyBhdHRyaWJ1dGUgZXZlbnRzIGRvbid0IG5vcm1hbGx5IG9jY3VyIG91dHNpZGUgb2YgYSBzdGFydEVsZW1lbnQKLSAgICAgICAgLy8gb3IgZW5kRWxlbWVudAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEVEQoKSB7Ci0gICAgICAgIC8vIG5vLW9wID8/PwotICAgICAgICAvLyBpdCBzZWVtcyBsaWtlIHdlIG5lZWQgdG8gcGFzcyB0aGlzIGluZm8gYWxvbmcsIGJ1dCBob3c/Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbW1lbnQoKSB7Ci0gICAgICAgIC8vIG5vLW9wID8/PwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFbnRpdHlSZWZlcmVuY2UoKSB7Ci0gICAgICAgIC8vIG5vLW9wID8/PwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTcGFjZSgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgICAgIC8vIHRoaXMgZXZlbnQgaXMgbGlzdGVkIGluIHRoZSBqYXZhZG9jLCBidXQgbm90IGluIHRoZSBzcGVjLgotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOb3RhdGlvbkRlY2woKSB7Ci0gICAgICAgIC8vIG5vLW9wID8/PwotICAgICAgICAvLyB0aGlzIGV2ZW50IGlzIGxpc3RlZCBpbiB0aGUgamF2YWRvYywgYnV0IG5vdCBpbiB0aGUgc3BlYy4KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRW50aXR5RGVjbCgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgICAgIC8vIHRoaXMgZXZlbnQgaXMgbGlzdGVkIGluIHRoZSBqYXZhZG9jLCBidXQgbm90IGluIHRoZSBzcGVjLgotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDREFUQSgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgICAgIC8vIHRoaXMgZXZlbnQgaXMgbGlzdGVkIGluIHRoZSBqYXZhZG9jLCBidXQgbm90IGluIHRoZSBzcGVjLgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3dyaXRlci9TaWduYXR1cmVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3dyaXRlci9TaWduYXR1cmVXcml0ZXIuamF2YQppbmRleCBmY2Q1Zjg4Li5lMWU0NDFhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy93cml0ZXIvU2lnbmF0dXJlV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvd3JpdGVyL1NpZ25hdHVyZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy53cml0ZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9BY2Nlc3NvckZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvQWNjZXNzb3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2MDBhOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvQWNjZXNzb3JGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKKworLyoqCisgKiBBIG1lYW5zIHRvIGFsbG93IHRoZSB1c2VyIHRvIHByb3ZpZGUgY3VzdG9taXplZCBBY2Nlc3NvcgorICogdG8gYmUgdXNlZCBieSBKQVhCLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEFjY2Vzc29yRmFjdG9yeSB7CisgICAgLyoqCisgICAgICogQWNjZXNzIGEgZmllbGQgb2YgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGJlYW4gdGhlIGNsYXNzIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBAcGFyYW0gZiB0aGUgZmllbGQgd2l0aGluIHRoZSBjbGFzcyB0byBiZSBhY2Nlc3NlZC4KKyAgICAgKiBAcGFyYW0gcmVhZE9ubHkgIHRoZSBpc1N0YXRpYyB2YWx1ZSBvZiB0aGUgZmllbGQncyBtb2RpZmllci4KKyAgICAgKiBAcmV0dXJuIEFjY2Vzc29yIHRoZSBhY2Nlc3NvciBmb3IgdGhpcyBmaWVsZAorICAgICAqCisgICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uIHJlcG9ydHMgZmFpbHVyZXMgb2YgdGhlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBBY2Nlc3NvciBjcmVhdGVGaWVsZEFjY2Vzc29yKENsYXNzIGJlYW4sIEZpZWxkIGYsIGJvb2xlYW4gcmVhZE9ubHkpIHRocm93cyBKQVhCRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQWNjZXNzIGEgcHJvcGVydHkgb2YgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGJlYW4gdGhlIGNsYXNzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBnZXR0ZXIgdGhlIGdldHRlciBtZXRob2QgdG8gYmUgYWNjZXNzZWQuIFRoZSB2YWx1ZSBjYW4gYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gc2V0dGVyIHRoZSBzZXR0ZXIgbWV0aG9kIHRvIGJlIGFjY2Vzc2VkLiBUaGUgdmFsdWUgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiBBY2Nlc3NvciB0aGUgYWNjZXNzb3IgZm9yIHRoZXNlIG1ldGhvZHMKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbiByZXBvcnRzIGZhaWx1cmVzIG9mIHRoZSBtZXRob2QuCisgICAgICovCisgICAgQWNjZXNzb3IgY3JlYXRlUHJvcGVydHlBY2Nlc3NvcihDbGFzcyBiZWFuLCBNZXRob2QgZ2V0dGVyLCBNZXRob2Qgc2V0dGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvQWNjZXNzb3JGYWN0b3J5SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9BY2Nlc3NvckZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2OWUxNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvQWNjZXNzb3JGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0LkFjY2Vzc29yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkFjY2Vzc29yRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQWNjZXNzb3JGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEFjY2Vzc29yRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NvckZhY3RvcnlJbXBsIGluc3RhbmNlID0gbnVsbDsKKyAgICBwcml2YXRlIEFjY2Vzc29yRmFjdG9yeUltcGwoKXt9CisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQWNjZXNzb3JGYWN0b3J5SW1wbCBnZXRJbnN0YW5jZSgpeworICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKKyAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEFjY2Vzc29yRmFjdG9yeUltcGwoKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VzcyBhIGZpZWxkIG9mIHRoZSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWFuIHRoZSBjbGFzcyB0byBiZSBwcm9jZXNzZWQuCisgICAgICogQHBhcmFtIGYgdGhlIGZpZWxkIHdpdGhpbiB0aGUgY2xhc3MgdG8gYmUgYWNjZXNzZWQuCisgICAgICogQHBhcmFtIHJlYWRPbmx5ICB0aGUgaXNTdGF0aWMgdmFsdWUgb2YgdGhlIGZpZWxkJ3MgbW9kaWZpZXIuCisgICAgICogQHJldHVybiBBY2Nlc3NvciB0aGUgYWNjZXNzb3IgZm9yIHRoaXMgZmllbGQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbiByZXBvcnRzIGZhaWx1cmVzIG9mIHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIEFjY2Vzc29yIGNyZWF0ZUZpZWxkQWNjZXNzb3IoQ2xhc3MgYmVhbiwgRmllbGQgZmllbGQsIGJvb2xlYW4gcmVhZE9ubHkpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRPbmx5CisgICAgICAgICAgICAgICAgPyBuZXcgQWNjZXNzb3IuUmVhZE9ubHlGaWVsZFJlZmxlY3Rpb24oZmllbGQpCisgICAgICAgICAgICAgICAgOiBuZXcgQWNjZXNzb3IuRmllbGRSZWZsZWN0aW9uKGZpZWxkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3MgYSBwcm9wZXJ0eSBvZiB0aGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmVhbiB0aGUgY2xhc3MgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIGdldHRlciB0aGUgZ2V0dGVyIG1ldGhvZCB0byBiZSBhY2Nlc3NlZC4gVGhlIHZhbHVlIGNhbiBiZSBudWxsLgorICAgICAqIEBwYXJhbSBzZXR0ZXIgdGhlIHNldHRlciBtZXRob2QgdG8gYmUgYWNjZXNzZWQuIFRoZSB2YWx1ZSBjYW4gYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIEFjY2Vzc29yIHRoZSBhY2Nlc3NvciBmb3IgdGhlc2UgbWV0aG9kcworICAgICAqCisgICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uIHJlcG9ydHMgZmFpbHVyZXMgb2YgdGhlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzb3IgY3JlYXRlUHJvcGVydHlBY2Nlc3NvcihDbGFzcyBiZWFuLCBNZXRob2QgZ2V0dGVyLCBNZXRob2Qgc2V0dGVyKSB7CisgICAgICAgIGlmIChnZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3Nvci5TZXR0ZXJPbmx5UmVmbGVjdGlvbihzZXR0ZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3Nvci5HZXR0ZXJPbmx5UmVmbGVjdGlvbihnZXR0ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQWNjZXNzb3IuR2V0dGVyU2V0dGVyUmVmbGVjdGlvbihnZXR0ZXIsIHNldHRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9BbnlUeXBlQWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9BbnlUeXBlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NjU5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL0FueVR5cGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxBZGFwdGVyOworCisvKioKKyAqIHtAbGluayBYbWxBZGFwdGVyfSB1c2VmdWwgZm9yIG1hcHBpbmcgaW50ZXJmYWNlcy4KKyAqCisgKiBTZWUgPGEgaHJlZj0iaHR0cHM6Ly9qYXhiLmRldi5qYXZhLm5ldC9ndWlkZS9NYXBwaW5nX2ludGVyZmFjZXMuaHRtbCI+VGhlIEpBWEIgdXNlcidzIGd1aWRlPC9hPgorICogZm9yIG1vcmUgYWJvdXQgdGhpcyBhZGFwdGVyIGNsYXNzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzaW5jZSBKQVhCIDIuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW55VHlwZUFkYXB0ZXIgZXh0ZW5kcyBYbWxBZGFwdGVyPE9iamVjdCxPYmplY3Q+IHsKKyAgICAvKioKKyAgICAgKiBOb29wLiBKdXN0IHJldHVybnMgdGhlIG9iamVjdCBnaXZlbiBhcyB0aGUgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoT2JqZWN0IHYpIHsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9vcC4gSnVzdCByZXR1cm5zIHRoZSBvYmplY3QgZ2l2ZW4gYXMgdGhlIGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbWFyc2hhbChPYmplY3QgdikgeworICAgICAgICByZXR1cm4gdjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL0N5Y2xlUmVjb3ZlcmFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvQ3ljbGVSZWNvdmVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmVjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL0N5Y2xlUmVjb3ZlcmFibGUuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworCisvKioKKyAqIE9wdGlvbmFsIGludGVyZmFjZSB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBKQVhCLWJvdW5kIG9iamVjdHMKKyAqIHRvIGhhbmRsZSBjeWNsZXMgaW4gdGhlIG9iamVjdCBncmFwaC4KKyAqCisgKiA8cD4KKyAqIEFzIGRpc2N1c3NlZCBpbiA8YSBocmVmPSJodHRwczovL2pheGIuZGV2LmphdmEubmV0L2d1aWRlL01hcHBpbmdfY3ljbGljX3JlZmVyZW5jZXNfdG9fWE1MLmh0bWwiPgorICogdGhlIHVzZXJzJyBndWlkZTwvYT4sIG5vcm1hbGx5IGEgY3ljbGUgaW4gdGhlIG9iamVjdCBncmFwaCBjYXVzZXMgdGhlIG1hcnNoYWxsZXIgdG8gcmVwb3J0IGFuIGVycm9yLAorICogYW5kIHdoZW4gYW4gZXJyb3IgaXMgZm91bmQsIHRoZSBKQVhCIFJJIHJlY292ZXJzIGJ5IGN1dHRpbmcgdGhlIGN5Y2xlIGFyYml0cmFyaWx5LgorICogVGhpcyBpcyBub3QgYWx3YXlzIGEgZGVzaXJlZCBiZWhhdmlvci4KKyAqCisgKiA8cD4KKyAqIEltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBhbGxvd3MgdXNlciBhcHBsaWNhdGlvbiB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvci4KKyAqIEFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bXMuamF2YS5uZXQvaml2ZS90aHJlYWQuanNwYT90aHJlYWRJRD0xMzY3MCI+dGhpcyByZWxhdGVkIGRpc2N1c3Npb248L2E+LgorICoKKyAqIEBzaW5jZSBKQVhCIDIuMSBFQTIKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBDeWNsZVJlY292ZXJhYmxlIHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGN5Y2xlIGlzIGRldGVjdGVkIGJ5IHRoZSBKQVhCIFJJIG1hcnNoYWxsZXIKKyAgICAgKiB0byBub21pbmF0ZSBhIG5ldyBvYmplY3QgdG8gYmUgbWFyc2hhbGxlZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgIFRoaXMgb2JqZWN0IGlzIHByb3ZpZGVkIGJ5IHRoZSBKQVhCIFJJIHRvIGluZm9ybQorICAgICAqICAgICAgdGhlIG9iamVjdCBhYm91dCB0aGUgbWFyc2hhbGxpbmcgcHJvY2VzcyB0aGF0J3MgZ29pbmcgb24uCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBvYmplY3QgdG8gYmUgbWFyc2hhbGxlZCBpbnN0ZWFkIG9mIDx0dD50aGlzPC90dD4gb2JqZWN0LgorICAgICAqICAgICAgT3IgcmV0dXJuIG51bGwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgSkFYQiBSSSBzaG91bGQgYmVoYXZlCisgICAgICogICAgICBqdXN0IGxpa2Ugd2hlbiB5b3VyIG9iamVjdCBkb2VzIG5vdCBpbXBsZW1lbnQge0BsaW5rIEN5Y2xlUmVjb3ZlcmFibGV9CisgICAgICogICAgICAoSU9XLCBjdXQgdGhlIGN5Y2xlIGFyYml0cmFyaWx5IGFuZCB0cnkgdG8gZ28gb24uKQorICAgICAqLworICAgIE9iamVjdCBvbkN5Y2xlRGV0ZWN0ZWQoQ29udGV4dCBjb250ZXh0KTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBKQVhCIFJJIHRvIHByb3ZpZGUKKyAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb24tZ29pbmcgbWFyc2hhbGxpbmcgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdlIG1heSBhZGQgbW9yZSBtZXRob2RzIGluIHRoZSBmdXR1cmUsIHNvIHBsZWFzZSBkbyBub3QKKyAgICAgKiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4geW91ciBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgeworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbWFyc2hhbGxlciBvYmplY3QgdGhhdCdzIGRvaW5nIHRoZSBtYXJzaGFsbGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKiAgICAgIGFsd2F5cyBub24tbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIE1hcnNoYWxsZXIgZ2V0TWFyc2hhbGxlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvRGF0YXR5cGVDb252ZXJ0ZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL0RhdGF0eXBlQ29udmVydGVySW1wbC5qYXZhCmluZGV4IDZiYzU1ZjguLjgyNmQ5ODYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvRGF0YXR5cGVDb252ZXJ0ZXJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9EYXRhdHlwZUNvbnZlcnRlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZDsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwpAQCAtNTMsNiArNTIsNyBAQAogICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3Igd2hpdGVzcGFjZSBub3JtYWxpemF0aW9uLgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICAqIEBzaW5jZSBKQVhCMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhdHlwZUNvbnZlcnRlckltcGwgaW1wbGVtZW50cyBEYXRhdHlwZUNvbnZlcnRlckludGVyZmFjZSB7CkBAIC01MzUsMjggKzUzNSw0OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIGNvbXB1dGVzIHRoZSBsZW5ndGggb2YgYmluYXJ5IGRhdGEuCisgICAgICogY29tcHV0ZXMgdGhlIGxlbmd0aCBvZiBiaW5hcnkgZGF0YSBzcGVjdWxhdGl2ZWx5LgogICAgICAqCi0gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIHBlcmZvcm1zIGZvcm1hdCBjaGVjay4KLSAgICAgKiBAcmV0dXJuICAgIC0xICAgICAgICBpZiBmb3JtYXQgaXMgaWxsZWdhbC4KKyAgICAgKiA8cD4KKyAgICAgKiBPdXIgcmVxdWlyZW1lbnQgaXMgdG8gY3JlYXRlIGJ5dGVbXSBvZiB0aGUgZXhhY3QgbGVuZ3RoIHRvIHN0b3JlIHRoZSBiaW5hcnkgZGF0YS4KKyAgICAgKiBJZiB3ZSBkbyB0aGlzIGluIGEgc3RyYWlnaHQtZm9yd2FyZCB3YXksIGl0IHRha2VzIHR3byBwYXNzZXMgb3ZlciB0aGUgZGF0YS4KKyAgICAgKiBFeHBlcmltZW50cyBzaG93IHRoYXQgdGhpcyBpcyBhIG5vbi10cml2aWFsIG92ZXJoZWFkICgzNSUgb3Igc28gaXMgc3BlbnQgb24KKyAgICAgKiB0aGUgZmlyc3QgcGFzcyBpbiBjYWxjdWxhdGluZyB0aGUgbGVuZ3RoLikKICAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNvIHRoZSBhcHByb2FjaCBoZXJlIGlzIHRoYXQgd2UgY29tcHV0ZSB0aGUgbGVuZ3RoIHNwZWN1bGF0aXZlbHksIHdpdGhvdXQgbG9va2luZworICAgICAqIGF0IHRoZSB3aG9sZSBjb250ZW50cy4gVGhlIG9idGFpbmVkIHNwZWN1bGF0aXZlIHZhbHVlIGlzIG5ldmVyIGxlc3MgdGhhbiB0aGUKKyAgICAgKiBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBiaW5hcnkgZGF0YSwgYnV0IGl0IG1heSBiZSBiaWdnZXIuIFNvIGlmIHRoZSBzcGVjdWxhdGlvbgorICAgICAqIGdvZXMgd3JvbmcsIHdlJ2xsIHBheSB0aGUgY29zdCBvZiByZWFsbG9jYXRpb24gYW5kIGJ1ZmZlciBjb3B5aW5nLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGJhc2U2NCB0ZXh0IGlzIHRpZ2h0bHkgcGFja2VkIHdpdGggbm8gaW5kZW50YXRpb24gbm9yIGlsbGVnYWwgY2hhcgorICAgICAqIChsaWtlIHdoYXQgbW9zdCB3ZWIgc2VydmljZXMgcHJvZHVjZSksIHRoZW4gdGhlIHNwZWN1bGF0aW9uIG9mIHRoaXMgbWV0aG9kCisgICAgICogd2lsbCBiZSBjb3JyZWN0LCBzbyB3ZSBnZXQgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGNMZW5ndGgoIFN0cmluZyB0ZXh0ICkgeworICAgIHByaXZhdGUgc3RhdGljIGludCBndWVzc0xlbmd0aCggU3RyaW5nIHRleHQgKSB7CiAgICAgICAgIGZpbmFsIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICBpbnQgYmFzZTY0Y291bnQ9MDsKLSAgICAgICAgaW50IGk7CiAKLSAgICAgICAgZm9yKCBpPTA7IGk8bGVuOyBpKysgKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiggY2g9PSc9JyApICAgIC8vIGRlY29kZU1hcFsnPSddIT0tMSwgc28gd2UgaGF2ZSB0byBjaGVjayB0aGlzIGZpcnN0LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYoIGNoPj0xMjggKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAvLyBpbmNvcnJlY3QgY2hhcmFjdGVyCi0gICAgICAgICAgICBpZiggZGVjb2RlTWFwW2NoXSE9LTEgKQotICAgICAgICAgICAgICAgIGJhc2U2NGNvdW50Kys7CisgICAgICAgIC8vIGNvbXB1dGUgdGhlIHRhaWwgJz0nIGNoYXJzCisgICAgICAgIGludCBqPWxlbi0xOworICAgICAgICBmb3IoOyBqPj0wOyBqLS0gKSB7CisgICAgICAgICAgICBieXRlIGNvZGUgPSBkZWNvZGVNYXBbdGV4dC5jaGFyQXQoaildOworICAgICAgICAgICAgaWYoY29kZT09UEFERElORykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmKGNvZGU9PS0xKQorICAgICAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IHRoaXMgYmFzZTY0IHRleHQgaXMgaW5kZW50ZWQuIGdvIHdpdGggdGhlIHVwcGVyIGJvdW5kCisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoKCkvNCozOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gKGJhc2U2NGNvdW50LzQpKjMrTWF0aC5tYXgoMCwoYmFzZTY0Y291bnQlNCktMSk7CisgICAgICAgIGorKzsgICAgLy8gdGV4dC5jaGFyQXQoaikgaXMgbm93IGF0IHNvbWUgYmFzZTY0IGNoYXIsIHNvICsxIHRvIG1ha2UgaXQgdGhlIHNpemUKKyAgICAgICAgaW50IHBhZFNpemUgPSBsZW4tajsKKyAgICAgICAgaWYocGFkU2l6ZSA+MikgLy8gc29tZXRoaW5nIGlzIHdyb25nIHdpdGggYmFzZTY0LiBiZSBzYWZlIGFuZCBnbyB3aXRoIHRoZSB1cHBlciBib3VuZAorICAgICAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoKCkvNCozOworCisgICAgICAgIC8vIHNvIGZhciB0aGlzIGJhc2U2NCBsb29rcyBsaWtlIGl0J3MgdW5pbmRlbnRlZCB0aWdodGx5IHBhY2tlZCBiYXNlNjQuCisgICAgICAgIC8vIHRha2UgYSBjaGFuY2UgYW5kIGNyZWF0ZSBhbiBhcnJheSB3aXRoIHRoZSBleHBlY3RlZCBzaXplCisgICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCgpLzQqMy1wYWRTaXplOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTY5LDkgKzU4OSw4IEBACiAgICAgICogICAgICBiZWNhdXNlIEpJVCBjYW4gaW5saW5lIGEgbG90IG9mIHN0cmluZyBhY2Nlc3MgKHdpdGggZGF0YSBvZiAxSyBjaGFycywgaXQgd2FzIHR3aWNlIGFzIGZhc3QpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gX3BhcnNlQmFzZTY0QmluYXJ5KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGZpbmFsIGludCBvdXRsZW4gPSBjYWxjTGVuZ3RoKHRleHQpOwotICAgICAgICBpZiggb3V0bGVuPT0tMSApICAgIHJldHVybiBudWxsOwotICAgICAgICBmaW5hbCBieXRlW10gb3V0ID0gbmV3IGJ5dGVbb3V0bGVuXTsKKyAgICAgICAgZmluYWwgaW50IGJ1ZmxlbiA9IGd1ZXNzTGVuZ3RoKHRleHQpOworICAgICAgICBmaW5hbCBieXRlW10gb3V0ID0gbmV3IGJ5dGVbYnVmbGVuXTsKICAgICAgICAgaW50IG89MDsKIAogICAgICAgICBmaW5hbCBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKQEAgLTU4NCw2ICs2MDMsNyBAQAogICAgICAgICBmb3IoIGk9MDsgaTxsZW47IGkrKyApIHsKICAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKICAgICAgICAgICAgIGJ5dGUgdiA9IGRlY29kZU1hcFtjaF07CisKICAgICAgICAgICAgIGlmKCB2IT0tMSApCiAgICAgICAgICAgICAgICAgcXVhZHJ1cGxldFtxKytdID0gdjsKIApAQCAtNTk4LDcgKzYxOCwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgaWYoYnVmbGVuPT1vKSAvLyBzcGVjdWxhdGlvbiB3b3JrZWQgb3V0IHRvIGJlIE9LCisgICAgICAgICAgICByZXR1cm4gb3V0OworCisgICAgICAgIC8vIHdlIG92ZXJlc3RpbWF0ZWQsIHNvIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlcgorICAgICAgICBieXRlW10gbmIgPSBuZXcgYnl0ZVtvXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvdXQsMCxuYiwwLG8pOworICAgICAgICByZXR1cm4gbmI7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGVuY29kZU1hcCA9IGluaXRFbmNvZGVNYXAoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvSURSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9JRFJlc29sdmVyLmphdmEKaW5kZXggNWY5NTIwOC4uYzAxMjAyNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9JRFJlc29sdmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9JRFJlc29sdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZDsKIAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiAKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEUkVGOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKIGltcG9ydCBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSURSRUY7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvTG9jYXRhYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL0xvY2F0YWJsZS5qYXZhCmluZGV4IDdiYmIzNTEuLjExZjRkNzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvTG9jYXRhYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9Mb2NhdGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIykkSWQ6IExvY2F0YWJsZS5qYXZhLHYgMS4xIDIwMDUvMDQvMTUgMjA6MDM6NDEga29oc3VrZSBFeHAgJAorICovCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL1V0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvVXRpbC5qYXZhCmluZGV4IDdiZTVhODcuLjg3N2Y1ZDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvVXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kOwogCiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9WYWxpZGF0aW9uRXZlbnRMb2NhdG9yRXguamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvVmFsaWRhdGlvbkV2ZW50TG9jYXRvckV4LmphdmEKaW5kZXggNmNjMzg5Ny4uMjEzYjllZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9WYWxpZGF0aW9uRXZlbnRMb2NhdG9yRXguamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL1ZhbGlkYXRpb25FdmVudExvY2F0b3JFeC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDEwIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKSRJZDogVmFsaWRhdGlvbkV2ZW50TG9jYXRvckV4LmphdmEsdiAxLjEgMjAwNS8wNC8xNSAyMDowMzo0MiBrb2hzdWtlIEV4cCAkCisgKi8KKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQ7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvV2hpdGVTcGFjZVByb2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9XaGl0ZVNwYWNlUHJvY2Vzc29yLmphdmEKaW5kZXggOTBjNDU2NS4uNDg3MTY0ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9XaGl0ZVNwYWNlUHJvY2Vzc29yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9XaGl0ZVNwYWNlUHJvY2Vzc29yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQ7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9YbWxBY2Nlc3NvckZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvWG1sQWNjZXNzb3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0YWYwYwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvWG1sQWNjZXNzb3JGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFDS0FHRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIElkZW50aWZpZXMgYSB1c2VyIHByb3ZpZGVkIGN1c3RvbWl6ZWQgQWNjZXNzb3IKKyAqIHRvIGJlIHVzZWQuCisgKi8KKworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldCh7VFlQRSxQQUNLQUdFfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFhtbEFjY2Vzc29yRmFjdG9yeSB7CisgICAgQ2xhc3M8PyBleHRlbmRzIEFjY2Vzc29yRmFjdG9yeT4gdmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYW5ub3RhdGlvbi9YbWxJc1NldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hbm5vdGF0aW9uL1htbElzU2V0LmphdmEKaW5kZXggOTk2ZTZlYS4uNzI4MGZmZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hbm5vdGF0aW9uL1htbElzU2V0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hbm5vdGF0aW9uL1htbElzU2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYW5ub3RhdGlvbi9YbWxMb2NhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hbm5vdGF0aW9uL1htbExvY2F0aW9uLmphdmEKaW5kZXggYmMwYTc4ZC4uYzA5MWMzYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hbm5vdGF0aW9uL1htbExvY2F0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hbm5vdGF0aW9uL1htbExvY2F0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL0FjY2Vzc29yRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9BY2Nlc3NvckV4Y2VwdGlvbi5qYXZhCmluZGV4IGVmNjZiZmEuLmNkMWI4MGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL0FjY2Vzc29yRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvQWNjZXNzb3JFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGk7CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvQnJpZGdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9CcmlkZ2UuamF2YQppbmRleCAwNDliMDU0Li5hY2Q4OWMzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9CcmlkZ2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9CcmlkZ2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGk7CiAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtNzIsNiArNzEsMTUgQEAKICAgICBwcm90ZWN0ZWQgZmluYWwgSkFYQkNvbnRleHRJbXBsIGNvbnRleHQ7CiAKICAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgSkFYQlJJQ29udGV4dH0gdG8gd2hpY2ggdGhpcyBvYmplY3QgYmVsb25ncy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgSkFYQlJJQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKgogICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbgogICAgICAqICAgICAgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIG1hcnNoYWxsaW5nLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvQnJpZGdlQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvQnJpZGdlQ29udGV4dC5qYXZhCmluZGV4IDYwZmM0NzguLjExMmY4ZjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL0JyaWRnZUNvbnRleHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9CcmlkZ2VDb250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50SGFuZGxlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL0NsYXNzUmVzb2x2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL0NsYXNzUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTFlZjg5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvQ2xhc3NSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworLyoqCisgKiBEeW5hbWljYWxseSBsb2NhdGVzIGNsYXNzZXMgdG8gcmVwcmVzZW50IGVsZW1lbnRzIGRpc2NvdmVyZWQgZHVyaW5nIHRoZSB1bm1hcnNoYWxsaW5nLgorICoKKyAqIDxwPgorICogPGI+VEhJUyBJTlRFUkZBQ0UgSVMgU1VCSkVDVCBUTyBDSEFOR0UgV0lUSE9VVCBOT1RJQ0UuPC9iPgorICoKKyAqIDxoMj5CYWNrZ3JvdW5kPC9oMj4KKyAqIDxwPgorICoge0BsaW5rIEpBWEJDb250ZXh0I25ld0luc3RhbmNlKENsYXNzLi4uKX0gcmVxdWlyZXMgdGhhdCBhcHBsaWNhdGlvbiBpbmZvcm1zIEpBWEIKKyAqIGFib3V0IGFsbCB0aGUgY2xhc3NlcyB0aGF0IGl0IG1heSBzZWUgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LiBXaGlsZSB0aGlzIGFsbG93cworICogSkFYQiB0byB0YWtlIHRpbWUgdG8gb3B0aW1pemUgdGhlIHVubWFyc2hhbGxpbmcsIGl0IGlzIHNvbWV0aW1lcyBpbmNvbnZlbmllbnQKKyAqIGZvciBhcHBsaWNhdGlvbnMuCisgKgorICogPHA+CisgKiBUaGlzIGlzIHdoZXJlIHtAbGluayBDbGFzc1Jlc29sdmVyfSBjb21lcyB0byByZXN1Y3VlLgorICoKKyAqIDxwPgorICogQSB7QGxpbmsgQ2xhc3NSZXNvbHZlcn0gaW5zdGFuY2UgY2FuIGJlIHNwZWNpZmllZCBvbiB7QGxpbmsgVW5tYXJzaGFsbGVyfSB2aWEKKyAqIHtAbGluayBVbm1hcnNoYWxsZXIjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpfSBhcyBmb2xsb3dzOgorICoKKyAqIDxwcmU+CisgKiB1bm1hcnNoYWxsZXIuc2V0UHJvcGVydHkoIENsYXNzUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgTXlDbGFzc1Jlc29sdmVySW1wbCgpICk7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFdoZW4gYW4ge0BsaW5rIFVubWFyc2hhbGxlcn0gZW5jb3VudGVycyAoaSkgYW4gdW5rbm93biByb290IGVsZW1lbnQgb3IgKGlpKSB1bmtub3duCisgKiBlbGVtZW50cyB3aGVyZSB1bm1hcnNoYWxsZXIgaXMgdHJ5aW5nIHRvIHVubWFyc2hhbCBpbnRvIHtAbGluayBYbWxBbnlFbGVtZW50fSB3aXRoCisgKiA8dHQ+bGF4PXRydWU8L3R0PiwgdW5tYXJzaGFsbGVyIGNhbGxzIHtAbGluayAjcmVzb2x2ZUVsZW1lbnROYW1lKFN0cmluZywgU3RyaW5nKX0KKyAqIG1ldGhvZCB0byBzZWUgaWYgdGhlIGFwcGxpY2F0aW9uIG1heSBiZSBhYmxlIHRvIHN1cHBseSBhIGNsYXNzIHRoYXQgY29ycmVzcG9uZHMKKyAqIHRvIHRoYXQgY2xhc3MuCisgKgorICogPHA+CisgKiBXaGVuIGEge0BsaW5rIENsYXNzfSBpcyByZXR1cm5lZCwgYSBuZXcge0BsaW5rIEpBWEJDb250ZXh0fSBpcyBjcmVhdGVkIHdpdGgKKyAqIGFsbCB0aGUgY2xhc3NlcyBrbm93biB0byBpdCBzbyBmYXIsIHBsdXMgYSBuZXcgY2xhc3MgcmV0dXJuZWQuIFRoaXMgb3BlcmF0aW9uCisgKiBtYXkgZmFpbCAoZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBzb21lIGNvbmZsaWN0aW5nIGFubm90YXRpb25zLikgVGhpcyBmYWlsdXJlCisgKiBpcyBoYW5kbGVkIGp1c3QgbGlrZSB7QGxpbmsgRXhjZXB0aW9ufXMgdGhyb3duIGZyb20KKyAqIHtAbGluayBDbGFzc1Jlc29sdmVyI3Jlc29sdmVFbGVtZW50TmFtZShTdHJpbmcsIFN0cmluZyl9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzUmVzb2x2ZXIgeworICAgIC8qKgorICAgICAqIEpBWEIgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiBpdCBzZWVzIGFuIHVua25vd24gZWxlbWVudC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNlZSB0aGUgY2xhc3MgamF2YWRvYyBmb3IgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuc1VyaQorICAgICAqICAgICAgTmFtZXNwYWNlIFVSSSBvZiB0aGUgdW5rbm93biBlbGVtZW50LiBDYW4gYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICogQHBhcmFtIGxvY2FsTmFtZQorICAgICAqICAgICAgTG9jYWwgbmFtZSBvZiB0aGUgdW5rbm93biBlbGVtZW50LiBOZXZlciBiZSBlbXB0eSBub3IgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIElmIGEgbm9uLW51bGwgY2xhc3MgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgdXNlZCB0byB1bm1hcnNoYWwgdGhpcyBlbGVtZW50LgorICAgICAqICAgICAgSWYgbnVsbCBpcyByZXR1cm5lZCwgdGhlIHJlc29sdXRpb24gaXMgYXNzdW1lZCB0byBiZSBmYWlsZWQsIGFuZAorICAgICAqICAgICAgdGhlIHVubWFyc2hhbGxlciB3aWxsIGJlaGF2ZSBhcyBpZiB0aGVyZSB3YXMgbm8ge0BsaW5rIENsYXNzUmVzb2x2ZXJ9CisgICAgICogICAgICB0byBiZWdpbiB3aXRoICh0aGF0IGlzLCB0byByZXBvcnQgaXQgdG8ge0BsaW5rIFZhbGlkYXRpb25FdmVudEhhbmRsZXJ9LAorICAgICAqICAgICAgdGhlbiBtb3ZlIG9uLikKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogICAgICBUaHJvd2luZyBhbnkge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259IGNhdXNlcyB0aGUgdW5tYXJzaGFsbGVyIHRvIHN0b3AKKyAgICAgKiAgICAgIGltbWVkaWF0ZWx5LiBUaGUgZXhjZXB0aW9uIHdpbGwgYmUgcHJvcGFnYXRlZCB1cCB0aGUgY2FsbCBzdGFjay4KKyAgICAgKiAgICAgIFRocm93aW5nIGFueSBvdGhlciBjaGVja2VkIHtAbGluayBFeGNlcHRpb259IHJlc3VsdHMgaW4gdGhlIGVycm9yCisgICAgICogICAgICByZXByb3RlZCB0byB7QGxpbmsgVmFsaWRhdGlvbkV2ZW50SGFuZGxlcn0gKGp1c3QgbGlrZSBhbnkgb3RoZXIgZXJyb3IKKyAgICAgKiAgICAgIGR1cmluZyB0aGUgdW5tYXJzaGFsbGluZy4pCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOdWxsYWJsZSBDbGFzczw/PiByZXNvbHZlRWxlbWVudE5hbWUoQE5vdE51bGwgU3RyaW5nIG5zVXJpLCBATm90TnVsbCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvQ29tcG9zaXRlU3RydWN0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9Db21wb3NpdGVTdHJ1Y3R1cmUuamF2YQppbmRleCBlNDliNGFiLi5hY2IyYjg3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9Db21wb3NpdGVTdHJ1Y3R1cmUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9Db21wb3NpdGVTdHJ1Y3R1cmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGk7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvRXJyb3JMaXN0ZW5lci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvRXJyb3JMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NmY3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9FcnJvckxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaTsKKworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRlZCBieSB0aGUgZHJpdmVyIG9mIHRoZSBjb21waWxlciBlbmdpbmUgdG8gaGFuZGxlCisgKiBlcnJvcnMgZm91bmQgZHVyaW5nIHRoZSBjb21waWxpYXRpb24uCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMge0BsaW5rIEVycm9ySGFuZGxlcn0gc28gaXQgY2FuIGJlCisgKiBwYXNzZWQgdG8gYW55d2hlcmUgd2hlcmUge0BsaW5rIEVycm9ySGFuZGxlcn0gaXMgZXhwZWN0ZWQuCisgKgorICogPHA+CisgKiBIb3dldmVyLCB0byBtYWtlIHRoZSBlcnJvciBoYW5kbGluZyBlYXN5IChhbmQgbWFrZSBpdCB3b3JrCisgKiB3aXRoIHZpc2l0b3IgcGF0dGVybnMgbmljZWx5KSwgdGhpcyBpbnRlcmZhY2UgaXMgbm90IGFsbG93ZWQKKyAqIHRvIGFib3J0IHRoZSBwcm9jZXNzaW5nLiBJdCBtZXJlbHkgcmVjZWl2ZXMgZXJyb3JzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkgKGtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20pCisgKiBAc2luY2UgMi4xIEVBMgorICovCitwdWJsaWMgaW50ZXJmYWNlIEVycm9yTGlzdGVuZXIgZXh0ZW5kcyBFcnJvckhhbmRsZXIgeworICAgIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKTsKKyAgICB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKTsKKyAgICB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKTsKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHJlcG9ydCBwb3NzaWJseSB2ZXJib3NlIGluZm9ybWF0aW9uIHRoYXQKKyAgICAgKiBjYW4gYmUgc2FmZWx5IGlnbm9yZWQuCisgICAgICovCisgICAgdm9pZCBpbmZvKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbik7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9KQVhCUklDb250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9KQVhCUklDb250ZXh0LmphdmEKaW5kZXggNmQ2MDY0Yi4uYTc1OTk0MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvSkFYQlJJQ29udGV4dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL0pBWEJSSUNvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwyNSArMjIsMjggQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKIGltcG9ydCBqYXZheC54bWwuYmluZC5TY2hlbWFPdXRwdXRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dGFjaG1lbnRSZWY7CiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKIAogaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CiBpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuaW1wbC5OYW1lQ29udmVydGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uLlJ1bnRpbWVBbm5vdGF0aW9uUmVhZGVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwubmF2Lk5hdmlnYXRvcjsKIAogLyoqCkBAIC01NCw2ICs1Nyw3IEBACiAgKiAgICAgS29oc3VrZSBLYXdhZ3VjaGkgKGtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20pCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKQVhCUklDb250ZXh0IGV4dGVuZHMgSkFYQkNvbnRleHQgeworCiAgICAgcHJvdGVjdGVkIEpBWEJSSUNvbnRleHQoKSB7fQogCiAgICAgLyoqCkBAIC02OSwzNyArNzMsNDggQEAKICAgICAgKiBAcGFyYW0gdHlwZVJlZnMKICAgICAgKiAgICAgIFNlZSB7QGxpbmsgI1RZUEVfUkVGRVJFTkNFU30gZm9yIHRoZSBtZWFuaW5nIG9mIHRoaXMgcGFyYW1ldGVyLgogICAgICAqICAgICAgQ2FuIGJlIG51bGwuCisgICAgICogQHBhcmFtIHN1YmNsYXNzUmVwbGFjZW1lbnRzCisgICAgICogICAgICBTZWUge0BsaW5rICNTVUJDTEFTU19SRVBMQUNFTUVOVFN9IGZvciB0aGUgbWVhbmluZyBvZiB0aGlzIHBhcmFtZXRlci4KKyAgICAgKiAgICAgIENhbiBiZSBudWxsLgogICAgICAqIEBwYXJhbSBkZWZhdWx0TmFtZXNwYWNlUmVtYXAKICAgICAgKiAgICAgIFNlZSB7QGxpbmsgI0RFRkFVTFRfTkFNRVNQQUNFX1JFTUFQfSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhpcyBwYXJhbWV0ZXIuCiAgICAgICogICAgICBDYW4gYmUgbnVsbCAoYW5kIHNob3VsZCBiZSBudWxsIGZvciBvcmRpbmFyeSB1c2Ugb2YgSkFYQi4pCiAgICAgICogQHBhcmFtIGMxNG5TdXBwb3J0CiAgICAgICogICAgICBTZWUge0BsaW5rICNDQU5PTklDQUxJWkFUSU9OX1NVUFBPUlR9IGZvciB0aGUgbWVhbmluZyBvZiB0aGlzIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gYXIKKyAgICAgKiAgICAgIFNlZSB7QGxpbmsgI0FOTk9UQVRJT05fUkVBREVSfSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhpcyBwYXJhbWV0ZXIuCisgICAgICogICAgICBDYW4gYmUgbnVsbC4KKyAgICAgKiBAc2luY2UgSkFYQiAyLjEgRUEyCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKQVhCUklDb250ZXh0IG5ld0luc3RhbmNlKEBOb3ROdWxsIENsYXNzW10gY2xhc3NlcywgQE51bGxhYmxlIENvbGxlY3Rpb248VHlwZVJlZmVyZW5jZT4gdHlwZVJlZnMsIEBOdWxsYWJsZSBTdHJpbmcgZGVmYXVsdE5hbWVzcGFjZVJlbWFwLCBib29sZWFuIGMxNG5TdXBwb3J0ICkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuQ29udGV4dEZhY3RvcnkiKTsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjLmdldE1ldGhvZCgiY3JlYXRlQ29udGV4dCIsQ2xhc3NbXS5jbGFzcyxDb2xsZWN0aW9uLmNsYXNzLFN0cmluZy5jbGFzcyxib29sZWFuLmNsYXNzKTsKLSAgICAgICAgICAgIE9iamVjdCBvID0gbWV0aG9kLmludm9rZShudWxsLGNsYXNzZXMsdHlwZVJlZnMsZGVmYXVsdE5hbWVzcGFjZVJlbWFwLGMxNG5TdXBwb3J0KTsKLSAgICAgICAgICAgIHJldHVybiAoSkFYQlJJQ29udGV4dClvOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHRlID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmKHRlIGluc3RhbmNlb2YgSkFYQkV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyAoSkFYQkV4Y2VwdGlvbil0ZTsKLSAgICAgICAgICAgIGlmKHRlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbil0ZTsKLSAgICAgICAgICAgIGlmKHRlIGluc3RhbmNlb2YgRXJyb3IpCi0gICAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKXRlOwotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIEpBWEJSSUNvbnRleHQgbmV3SW5zdGFuY2UoQE5vdE51bGwgQ2xhc3NbXSBjbGFzc2VzLAorICAgICAgIEBOdWxsYWJsZSBDb2xsZWN0aW9uPFR5cGVSZWZlcmVuY2U+IHR5cGVSZWZzLAorICAgICAgIEBOdWxsYWJsZSBNYXA8Q2xhc3MsQ2xhc3M+IHN1YmNsYXNzUmVwbGFjZW1lbnRzLAorICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgZGVmYXVsdE5hbWVzcGFjZVJlbWFwLCBib29sZWFuIGMxNG5TdXBwb3J0LAorICAgICAgIEBOdWxsYWJsZSBSdW50aW1lQW5ub3RhdGlvblJlYWRlciBhcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29udGV4dChjbGFzc2VzLCB0eXBlUmVmcywgc3ViY2xhc3NSZXBsYWNlbWVudHMsCisgICAgICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZVJlbWFwLCBjMTRuU3VwcG9ydCwgYXIsIGZhbHNlLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIENvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEpBWEJSSUNvbnRleHQgbmV3SW5zdGFuY2UoQE5vdE51bGwgQ2xhc3NbXSBjbGFzc2VzLAorICAgICAgICBATnVsbGFibGUgQ29sbGVjdGlvbjxUeXBlUmVmZXJlbmNlPiB0eXBlUmVmcywKKyAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlUmVtYXAsIGJvb2xlYW4gYzE0blN1cHBvcnQgKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShjbGFzc2VzLHR5cGVSZWZzLCBDb2xsZWN0aW9ucy48Q2xhc3MsQ2xhc3M+ZW1wdHlNYXAoKSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0TmFtZXNwYWNlUmVtYXAsYzE0blN1cHBvcnQsbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29udGV4dCBpbmNsdWRlcyBhIGNsYXNzCisgICAgICogdGhhdCBoYXMge0BsaW5rIFhtbEF0dGFjaG1lbnRSZWZ9LgorICAgICAqCisgICAgICogQHNpbmNlIDIuMQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N3YVJlZigpOworCisgICAgLyoqCiAgICAgICogSWYgdGhlIGdpdmVuIG9iamVjdCBpcyBib3VuZCB0byBhbiBlbGVtZW50IGluIFhNTCBieSBKQVhCLAogICAgICAqIHJldHVybnMgdGhlIGVsZW1lbnQgbmFtZS4KICAgICAgKgpAQCAtMjM0LDYgKzI0OSwyMSBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBTdHJpbmcgZ2V0QnVpbGRJZCgpOwogCiAgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBlcGlzb2RlIGZpbGUgdGhhdCByZXByZXNlbnRzIHRoZSBiaW5kaW5nIGtub3duIHRvIHRoaXMge0BsaW5rIEpBWEJDb250ZXh0fSwKKyAgICAgKiBzbyB0aGF0IFhKQyBjYW4gbGF0ZXIgZG8gc2VwYXJhdGUgY29tcGlsYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBFcGlzb2RlIGZpbGUgaXMgcmVhbGx5IGp1c3QgYSBKQVhCIGN1c3RvbWl6YXRpb24gZmlsZSwgZXhjZXB0IHRoYXQgY3VycmVudGx5CisgICAgICogd2UgdXNlIHRoZSBSSS1zcGVjaWZpYyBTQ0QgdG8gcmVmZXIgdG8gc2NoZW1hIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICBUaGlzIHJlY2VpdmVzIHRoZSBnZW5lcmF0ZWQgZXBpc29kZSBmaWxlLgorICAgICAqCisgICAgICogQHNpbmNlIDIuMQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlRXBpc29kZShSZXN1bHQgb3V0cHV0KTsKKworICAgIC8qKgogICAgICAqIENvbXB1dGVzIGEgSmF2YSBpZGVudGlmaWVyIGZyb20gYSBsb2NhbCBuYW1lLgogICAgICAqCiAgICAgICogPHA+CkBAIC0yNDQsMTIgKzI3NCwxMCBAQAogICAgICAqIEFjY29yZGluZ2x5LCB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIGFuIGlkZW50aWZpZXIgdGhhdCBjb2xsaWRlcyB3aXRoIHJlc2VydmVkIHdvcmRzLgogICAgICAqCiAgICAgICogPHA+Ci0gICAgICogVXNlIHtAbGluayBKSmF2YU5hbWUjaXNKYXZhSWRlbnRpZmllcihTdHJpbmcpfSB0byBjaGVjayBmb3Igc3VjaCBjb2xsaXNpb24uCisgICAgICogVXNlIDx0dD5KSmF2YU5hbWUuaXNKYXZhSWRlbnRpZmllcihTdHJpbmcpPC90dD4gdG8gY2hlY2sgZm9yIHN1Y2ggY29sbGlzaW9uLgogICAgICAqCiAgICAgICogQHJldHVybgogICAgICAqICAgICAgVHlwaWNhbGx5LCB0aGlzIG1ldGhvZCByZXR1cm5zICJuYW1lTGlrZVRoaXMiLgotICAgICAqCi0gICAgICogQHNlZSBKSmF2YU5hbWUjaXNKYXZhSWRlbnRpZmllcihTdHJpbmcpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBTdHJpbmcgbWFuZ2xlTmFtZVRvVmFyaWFibGVOYW1lKEBOb3ROdWxsIFN0cmluZyBsb2NhbE5hbWUpIHsKICAgICAgICAgcmV0dXJuIE5hbWVDb252ZXJ0ZXIuc3RhbmRhcmQudG9WYXJpYWJsZU5hbWUobG9jYWxOYW1lKTsKQEAgLTI2OSw2ICsyOTcsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb21wdXRlcyBhIEphdmEgY2xhc3MgbmFtZSBmcm9tIGEgbG9jYWwgbmFtZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGZhaXRoZnVsbHkgaW1wbGVtZW50cyB0aGUgbmFtZSBtYW5nbGluZyBydWxlIGFzIHNwZWNpZmllZCBpbiB0aGUgSkFYQiBzcGVjLgorICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGxpa2Uge0BsaW5rICNtYW5nbGVOYW1lVG9DbGFzc05hbWUoU3RyaW5nKX0gZXhjZXB0IHRoYXQgaXQgbG9va3MKKyAgICAgKiBmb3IgImdldENsYXNzIiBhbmQgcmV0dXJucyBzb21ldGhpbmcgZWxzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFR5cGljYWxseSwgdGhpcyBtZXRob2QgcmV0dXJucyAiTmFtZUxpa2VUaGlzIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIFN0cmluZyBtYW5nbGVOYW1lVG9Qcm9wZXJ0eU5hbWUoQE5vdE51bGwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICByZXR1cm4gTmFtZUNvbnZlcnRlci5zdGFuZGFyZC50b1Byb3BlcnR5TmFtZShsb2NhbE5hbWUpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIHBhcmFtZXRlcml6YXRpb24gb2YgdGhlIGdpdmVuIGJhc2UgdHlwZS4KICAgICAgKgogICAgICAqIDxwPgpAQCAtMzM4LDkgKzM4MSw0NiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTk9OSUNBTElaQVRJT05fU1VQUE9SVCA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmMxNG4iOwogCiAgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IHRoYXQgeW91IGNhbiBzcGVjaWZ5IHRvIHtAbGluayBKQVhCQ29udGV4dCNuZXdJbnN0YW5jZX0KKyAgICAgKiB0byBhbGxvdyB1bm1hcnNoYWxsZXIgdG8gaG9ub3IgPHR0PnhzaTpuaWw8L3R0PiBhbnl3aGVyZSwgZXZlbiBpZiB0aGV5IGFyZQorICAgICAqIG5vdCBzcGVjaWZpY2FsbHkgYWxsb3dlZCBieSB0aGUgc2NoZW1hLgorICAgICAqCisgICAgICogQHNpbmNlIDIuMS4zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFQVRfRVZFUllUSElOR19OSUxMQUJMRSA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnRyZWF0RXZlcnl0aGluZ05pbGxhYmxlIjsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0byB7QGxpbmsgSkFYQkNvbnRleHQjbmV3SW5zdGFuY2V9CisgICAgICogdG8gdXNlIGFsdGVybmF0aXZlIHtAbGluayBSdW50aW1lQW5ub3RhdGlvblJlYWRlcn0gaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgMi4xIEVBMgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fUkVBREVSID0gUnVudGltZUFubm90YXRpb25SZWFkZXIuY2xhc3MuZ2V0TmFtZSgpOworCisgICAgLyoqCiAgICAgICogTWFyc2hhbGxlci9Vbm1hcnNoYWxsZXIgcHJvcGVydHkgdG8gZW5hYmxlIFhPUCBwcm9jZXNzaW5nLgogICAgICAqCiAgICAgICogQHNpbmNlIDIuMCBFQTIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfWE9QID0gImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuWE9QIjsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0byB7QGxpbmsgSkFYQkNvbnRleHQjbmV3SW5zdGFuY2V9CisgICAgICogdG8gc3BlY2lmeSBzcGVjaWZpYyBjbGFzc2VzIHRoYXQgcmVwbGFjZSB0aGUgcmVmZXJlbmNlIHRvIGdlbmVyaWMgY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoaXMgZmVhdHVyZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjEgRUEyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCQ0xBU1NfUkVQTEFDRU1FTlRTID0gImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuc3ViY2xhc3NSZXBsYWNlbWVudHMiOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IHRoYXQgeW91IGNhbiBzcGVjaWZ5IHRvIHtAbGluayBKQVhCQ29udGV4dCNuZXdJbnN0YW5jZX0KKyAgICAgKiBlbmFibGUgc3VwcG9ydCBvZiBYbWxBY2Nlc3NvckZhY3RvcnkgYW5ub3RhdGlvbiBpbiB0aGUge0BsaW5rIEpBWEJDb250ZXh0fS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjEgRUEyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MQUNDRVNTT1JGQUNUT1JZX1NVUFBPUlQgPSAiY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5YbWxBY2Nlc3NvckZhY3RvcnkiOworCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9SYXdBY2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvUmF3QWNjZXNzb3IuamF2YQppbmRleCBhZDZhZTVmLi5hNjYyMjcwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9SYXdBY2Nlc3Nvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL1Jhd0FjY2Vzc29yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL1R5cGVSZWZlcmVuY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL1R5cGVSZWZlcmVuY2UuamF2YQppbmRleCA0ODA2OTRjLi42YzQzOWVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9UeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaTsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9pbXBsL05hbWVDb252ZXJ0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL2ltcGwvTmFtZUNvbnZlcnRlci5qYXZhCmluZGV4IDNjY2U3ZTEuLjU5ZjZlNTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL2ltcGwvTmFtZUNvbnZlcnRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL2ltcGwvTmFtZUNvbnZlcnRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL2ltcGwvTmFtZVV0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL2ltcGwvTmFtZVV0aWwuamF2YQppbmRleCA2MTkyMDRhLi4zOTEwM2YyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL2FwaS9pbXBsL05hbWVVdGlsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvaW1wbC9OYW1lVXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvYXBpL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggMzk5MmUwZS4uNmFlZTRkNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvcGFja2FnZS1pbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9hcGkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKioKICAqIDxoMT5SdW50aW1lIEFQSSBmb3IgdGhlIEpBWC1XUyBSSTwvaDE+LgogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9DaGFyYWN0ZXJFc2NhcGVIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvQ2hhcmFjdGVyRXNjYXBlSGFuZGxlci5qYXZhCmluZGV4IGJhYjQ1MzQuLjNjMGJjMTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9DaGFyYWN0ZXJFc2NhcGVIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL0NoYXJhY3RlckVzY2FwZUhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9EYXRhV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvRGF0YVdyaXRlci5qYXZhCmluZGV4IGE3NGNkZTQuLjE3ZTc2MDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9EYXRhV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL0RhdGFXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8vQEAzUkQgUEFSVFkgQ09ERUBACiAKIC8vIERhdGFXcml0ZXIuamF2YSAtIFhNTCB3cml0ZXIgZm9yIGRhdGEtb3JpZW50ZWQgZmlsZXMuCkBAIC05Myw2ICs5Miw3IEBACiAgKgogICogQHNpbmNlIDEuMAogICogQGF1dGhvciBEYXZpZCBNZWdnaW5zb24sIGRhdmlkQG1lZ2dpbnNvbi5jb20KKyAqIEB2ZXJzaW9uIDAuMgogICogQHNlZSBYTUxXcml0ZXIKICAqLwogcHVibGljIGNsYXNzIERhdGFXcml0ZXIgZXh0ZW5kcyBYTUxXcml0ZXIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9EdW1iRXNjYXBlSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL0R1bWJFc2NhcGVIYW5kbGVyLmphdmEKaW5kZXggYTY5NmZmMy4uMDA0OGJkYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL0R1bWJFc2NhcGVIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL0R1bWJFc2NhcGVIYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9NZXNzYWdlcy5qYXZhCmluZGV4IDIxZGZlOGIuLmEwZmY4MmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggNGMxNWFhMC4uNzgzZDYxNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL01lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsNCArMSwyOSBAQAogIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKKyMKICMgZG9uJ3QgbW9kaWZ5IG5vciBkZWxldGUgYW55dGhpbmcgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICMKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL01pbmltdW1Fc2NhcGVIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvTWluaW11bUVzY2FwZUhhbmRsZXIuamF2YQppbmRleCBiMGJmMzdlLi5lZTM1MTdkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvTWluaW11bUVzY2FwZUhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvTWluaW11bUVzY2FwZUhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIykkSWQ6IE1pbmltdW1Fc2NhcGVIYW5kbGVyLmphdmEsdiAxLjEgMjAwNS8wNC8xNSAyMDowMzo0NyBrb2hzdWtlIEV4cCAkCisgKi8KKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQubWFyc2hhbGxlcjsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL05hbWVzcGFjZVByZWZpeE1hcHBlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL05hbWVzcGFjZVByZWZpeE1hcHBlci5qYXZhCmluZGV4IGQ3ZGM3NWUuLjA5NWZhZWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9OYW1lc3BhY2VQcmVmaXhNYXBwZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvTmFtZXNwYWNlUHJlZml4TWFwcGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL05pb0VzY2FwZUhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9OaW9Fc2NhcGVIYW5kbGVyLmphdmEKaW5kZXggZTlkNzg3YS4uMGE1ZDNjYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL05pb0VzY2FwZUhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvTmlvRXNjYXBlSGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLm1hcnNoYWxsZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL1NBWDJET01FeC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL1NBWDJET01FeC5qYXZhCmluZGV4IDI0ZGMyYmYuLjczZTAxOWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9TQVgyRE9NRXguamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvU0FYMkRPTUV4LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL1hNTFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC9tYXJzaGFsbGVyL1hNTFdyaXRlci5qYXZhCmluZGV4IGQwMDg5YTAuLjhiZjg5YWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvbWFyc2hhbGxlci9YTUxXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL21hcnNoYWxsZXIvWE1MV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvLyBAQDNSRCBQQVJUWSBDT0RFQEAKIAogLy8gWE1MV3JpdGVyLmphdmEgLSBzZXJpYWxpemUgYW4gWE1MIGRvY3VtZW50LgpAQCAtMjQ4LDYgKzI0Nyw3IEBACiAgKiBjaGFyYWN0ZXIgZGF0YS48L3A+CiAgKgogICogQGF1dGhvciBEYXZpZCBNZWdnaW5zb24sIGRhdmlkQG1lZ2dpbnNvbi5jb20KKyAqIEB2ZXJzaW9uIDAuMgogICogQHNpbmNlIEpBWEIxLjAKICAqIEBzZWUgb3JnLnhtbC5zYXguWE1MRmlsdGVyCiAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3VubWFyc2hhbGxlci9ET01TY2FubmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3VubWFyc2hhbGxlci9ET01TY2FubmVyLmphdmEKaW5kZXggNTFjNWJkNi4uODVhOTVkZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91bm1hcnNoYWxsZXIvRE9NU2Nhbm5lci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdW5tYXJzaGFsbGVyL0RPTVNjYW5uZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CkBAIC01NSw2ICs1NCw3IEBACiAgKiBjbGFzc2VzIGxpa2UgdGhpcy4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+S29oc3VrZSBLYXdhZ3VjaGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDA2LzA0LzI0IDE1OjI3OjUyICQKICAqIEBzaW5jZSBKQVhCMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBET01TY2FubmVyIGltcGxlbWVudHMgTG9jYXRvckV4LEluZm9zZXRTY2FubmVyLyo8Tm9kZT4gLS0tIGJ1dCBjYW4ndCBkbyB0aGlzIHRvIHByb3RlY3QgMS4wIGNsaWVudHMsIG9yIGNhbiBJPyAqLwpAQCAtOTcsOSArOTcsOSBAQAogCiAgICAgcHVibGljIHZvaWQgc2NhbiggRWxlbWVudCBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc2V0Q3VycmVudExvY2F0aW9uKCBlICk7Ci0gICAgICAgIHJlY2VpdmVyLnN0YXJ0RG9jdW1lbnQoKTsKIAogICAgICAgICByZWNlaXZlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7CisgICAgICAgIHJlY2VpdmVyLnN0YXJ0RG9jdW1lbnQoKTsKIAogICAgICAgICBOYW1lc3BhY2VTdXBwb3J0IG5zcyA9IG5ldyBOYW1lc3BhY2VTdXBwb3J0KCk7CiAgICAgICAgIGJ1aWxkTmFtZXNwYWNlU3VwcG9ydCggbnNzLCBlLmdldFBhcmVudE5vZGUoKSApOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91bm1hcnNoYWxsZXIvSW5mb3NldFNjYW5uZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdW5tYXJzaGFsbGVyL0luZm9zZXRTY2FubmVyLmphdmEKaW5kZXggODUyMzg5My4uYjMwNjlhZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91bm1hcnNoYWxsZXIvSW5mb3NldFNjYW5uZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3VubWFyc2hhbGxlci9JbmZvc2V0U2Nhbm5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkJpbmRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdW5tYXJzaGFsbGVyL01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3VubWFyc2hhbGxlci9NZXNzYWdlcy5qYXZhCmluZGV4IDhkZjhlMWEuLjk5MDA5YTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdW5tYXJzaGFsbGVyL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91bm1hcnNoYWxsZXIvTWVzc2FnZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3VubWFyc2hhbGxlci9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91bm1hcnNoYWxsZXIvTWVzc2FnZXMucHJvcGVydGllcwppbmRleCAzOWM3MDVhLi40MDQ0Nzk0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3VubWFyc2hhbGxlci9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdW5tYXJzaGFsbGVyL01lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsNCArMSwyOSBAQAogIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKKyMKICMgZG9uJ3QgbW9kaWZ5IG5vciBkZWxldGUgYW55dGhpbmcgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICMKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91bm1hcnNoYWxsZXIvUGF0Y2hlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91bm1hcnNoYWxsZXIvUGF0Y2hlci5qYXZhCmluZGV4IDk3ZWQxNzkuLmIxZjFmZTggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdW5tYXJzaGFsbGVyL1BhdGNoZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3VubWFyc2hhbGxlci9QYXRjaGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91dGlsL0F0dHJpYnV0ZXNJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3V0aWwvQXR0cmlidXRlc0ltcGwuamF2YQppbmRleCAyYjFhYjE5Li45MzkwNDJmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3V0aWwvQXR0cmlidXRlc0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3V0aWwvQXR0cmlidXRlc0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02Niw2ICs2Niw3IEBACiAgKiBAc2luY2UgSkFYQjEuMAogICogQHNpbmNlIFNBWCAyLjAKICAqIEBhdXRob3IgRGF2aWQgTWVnZ2luc29uCisgKiBAdmVyc2lvbiAyLjAuMSAoc2F4MnIyKQogICovCiBwdWJsaWMgY2xhc3MgQXR0cmlidXRlc0ltcGwgaW1wbGVtZW50cyBBdHRyaWJ1dGVzCiB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3V0aWwvVmFsaWRhdGlvbkV2ZW50TG9jYXRvckV4SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91dGlsL1ZhbGlkYXRpb25FdmVudExvY2F0b3JFeEltcGwuamF2YQppbmRleCBhMGFhMGI2Li5hYzNkMzY1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3V0aWwvVmFsaWRhdGlvbkV2ZW50TG9jYXRvckV4SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdXRpbC9WYWxpZGF0aW9uRXZlbnRMb2NhdG9yRXhJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTAgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpJElkOiBWYWxpZGF0aW9uRXZlbnRMb2NhdG9yRXhJbXBsLmphdmEsdiAxLjEgMjAwNS8wNC8xNSAyMDowMzo1MCBrb2hzdWtlIEV4cCAkCisgKi8KKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC91dGlsL1doaWNoLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3V0aWwvV2hpY2guamF2YQppbmRleCA3Njk5ZWRmLi44ZTIyMTdkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3V0aWwvV2hpY2guamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3V0aWwvV2hpY2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIykkSWQ6IFdoaWNoLmphdmEsdiAxLjEgMjAwNS8wNC8xNSAyMDowMzo1MSBrb2hzdWtlIEV4cCAkCisgKi8KKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9DbGFzc0ZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvQ2xhc3NGYWN0b3J5LmphdmEKaW5kZXggOThjNDQyNy4uMTMyMGRkNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9DbGFzc0ZhY3RvcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL0NsYXNzRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL0NvbnRleHRGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL0NvbnRleHRGYWN0b3J5LmphdmEKaW5kZXggNTk3NjcyYS4uMGVmOTJmNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9Db250ZXh0RmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52MjsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CkBAIC0zNSwxNCArMzQsMTggQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKIGltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwogCiBpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuRmluYWxBcnJheUxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5VdGlsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkpBWEJSSUNvbnRleHQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb24uUnVudGltZUFubm90YXRpb25SZWFkZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkpBWEJDb250ZXh0SW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnV0aWwuVHlwZUNhc3Q7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgcHJvZHVjaW5nIFJJIEpBWEJDb250ZXh0IG9iamVjdHMuICBJbgpAQCAtNzIsMTIgKzc1LDM1IEBACiAgICAgICAgIGlmKGMxNG5TdXBwb3J0PT1udWxsKQogICAgICAgICAgICAgYzE0blN1cHBvcnQgPSBmYWxzZTsKIAorICAgICAgICBCb29sZWFuIGFsbE5pbGxhYmxlID0gZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0aWVzLEpBWEJSSUNvbnRleHQuVFJFQVRfRVZFUllUSElOR19OSUxMQUJMRSxCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgaWYoYWxsTmlsbGFibGU9PW51bGwpCisgICAgICAgICAgICBhbGxOaWxsYWJsZSA9IGZhbHNlOworCisgICAgICAgIEJvb2xlYW4geG1sQWNjZXNzb3JGYWN0b3J5U3VwcG9ydCA9IGdldFByb3BlcnR5VmFsdWUocHJvcGVydGllcywKKyAgICAgICAgICAgSkFYQlJJQ29udGV4dC5YTUxBQ0NFU1NPUkZBQ1RPUllfU1VQUE9SVCxCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgaWYoeG1sQWNjZXNzb3JGYWN0b3J5U3VwcG9ydD09bnVsbCl7CisgICAgICAgICAgICB4bWxBY2Nlc3NvckZhY3RvcnlTdXBwb3J0ID0gZmFsc2U7CisgICAgICAgICAgICBVdGlsLmdldENsYXNzTG9nZ2VyKCkubG9nKExldmVsLkZJTkUsICJQcm9wZXJ0eSAiICsKKyAgICAgICAgICAgICAgICBKQVhCUklDb250ZXh0LlhNTEFDQ0VTU09SRkFDVE9SWV9TVVBQT1JUICsKKyAgICAgICAgICAgICAgICAiaXMgbm90IGFjdGl2ZS4gIFVzaW5nIEpBWEIncyBpbXBsZW1lbnRhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgUnVudGltZUFubm90YXRpb25SZWFkZXIgYXIgPSBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnRpZXMsSkFYQlJJQ29udGV4dC5BTk5PVEFUSU9OX1JFQURFUixSdW50aW1lQW5ub3RhdGlvblJlYWRlci5jbGFzcyk7CisKKyAgICAgICAgTWFwPENsYXNzLENsYXNzPiBzdWJjbGFzc1JlcGxhY2VtZW50czsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1YmNsYXNzUmVwbGFjZW1lbnRzID0gVHlwZUNhc3QuY2hlY2tlZENhc3QoCisgICAgICAgICAgICAgICAgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0aWVzLCBKQVhCUklDb250ZXh0LlNVQkNMQVNTX1JFUExBQ0VNRU5UUywgTWFwLmNsYXNzKSwgQ2xhc3MuY2xhc3MsIENsYXNzLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKE1lc3NhZ2VzLklOVkFMSURfVFlQRV9JTl9NQVAuZm9ybWF0KCksZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZighcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKE1lc3NhZ2VzLlVOU1VQUE9SVEVEX1BST1BFUlRZLmZvcm1hdChwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gY3JlYXRlQ29udGV4dChjbGFzc2VzLENvbGxlY3Rpb25zLjxUeXBlUmVmZXJlbmNlPmVtcHR5TGlzdCgpLGRlZmF1bHROc1VyaSxjMTRuU3VwcG9ydCk7CisgICAgICAgIHJldHVybiBjcmVhdGVDb250ZXh0KGNsYXNzZXMsQ29sbGVjdGlvbnMuPFR5cGVSZWZlcmVuY2U+ZW1wdHlMaXN0KCksCisgICAgICAgICAgICAgICAgc3ViY2xhc3NSZXBsYWNlbWVudHMsZGVmYXVsdE5zVXJpLGMxNG5TdXBwb3J0LGFyLHhtbEFjY2Vzc29yRmFjdG9yeVN1cHBvcnQsYWxsTmlsbGFibGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTQsMTEgKzEyMCwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIHR5cGUuY2FzdChvKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBVc2VkIGZyb20gdGhlIEpBWEIgUkkgcnVudGltZSBBUEksIGludm9rZWQgdmlhIHJlZmxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKQVhCQ29udGV4dCBjcmVhdGVDb250ZXh0KCBDbGFzc1tdIGNsYXNzZXMsIENvbGxlY3Rpb248VHlwZVJlZmVyZW5jZT4gdHlwZVJlZnMsIFN0cmluZyBkZWZhdWx0TnNVcmksIGJvb2xlYW4gYzE0blN1cHBvcnQgKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkNvbnRleHRJbXBsKGNsYXNzZXMsdHlwZVJlZnMsZGVmYXVsdE5zVXJpLGMxNG5TdXBwb3J0KTsKKyAgICBwdWJsaWMgc3RhdGljIEpBWEJSSUNvbnRleHQgY3JlYXRlQ29udGV4dCggQ2xhc3NbXSBjbGFzc2VzLAorICAgICAgICAgICAgQ29sbGVjdGlvbjxUeXBlUmVmZXJlbmNlPiB0eXBlUmVmcywgTWFwPENsYXNzLENsYXNzPiBzdWJjbGFzc1JlcGxhY2VtZW50cywKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0TnNVcmksIGJvb2xlYW4gYzE0blN1cHBvcnQsIFJ1bnRpbWVBbm5vdGF0aW9uUmVhZGVyIGFyLAorICAgICAgICAgICAgYm9vbGVhbiB4bWxBY2Nlc3NvckZhY3RvcnlTdXBwb3J0LCBib29sZWFuIGFsbE5pbGxhYmxlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgSkFYQkNvbnRleHRJbXBsKGNsYXNzZXMsdHlwZVJlZnMsc3ViY2xhc3NSZXBsYWNlbWVudHMsZGVmYXVsdE5zVXJpLAorICAgICAgICAgICAgICAgIGMxNG5TdXBwb3J0LGFyLCB4bWxBY2Nlc3NvckZhY3RvcnlTdXBwb3J0LGFsbE5pbGxhYmxlKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvTWVzc2FnZXMuamF2YQppbmRleCBhNTk4YTllLi4wZjllNmQxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBVTlNVUFBPUlRFRF9QUk9QRVJUWSwgICAvLyAxIGFyZwogICAgIEJST0tFTl9DT05URVhUUEFUSCwgICAgIC8vIDEgYXJnCiAgICAgTk9fREVGQVVMVF9DT05TVFJVQ1RPUl9JTl9JTk5FUl9DTEFTUywgLy8gMSBhcmcKKyAgICBJTlZBTElEX1RZUEVfSU5fTUFQLCAvLyAwYXJncwogICAgIDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKE1lc3NhZ2VzLmNsYXNzLmdldE5hbWUoKSk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggMTkwOTI0OC4uNWNiN2Q2MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI3IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKIAogSUxMRUdBTF9FTlRSWSA9IFwKICAgICBpbGxlZ2FsIGVudHJ5OiAiezB9IiwgZW50cmllcyBzaG91bGQgYmUgb2YgdGhlIGZvcm0gIkNsYXNzTmFtZSIgb3IgIk91dGVyQ2xhc3MuSW5uZXJDbGFzcyIsIG5vdCAiQ2xhc3NOYW1lLmNsYXNzIiBvciAiZnVsbHkucXVhbGlmaWVkLkNsYXNzTmFtZSIKQEAgLTE2LDQgKzQwLDcgQEAKIAogTk9fREVGQVVMVF9DT05TVFJVQ1RPUl9JTl9JTk5FUl9DTEFTUyA9IFwKICAgICAiezB9IiBpcyBhbiBpbm5lciBjbGFzcywgYW5kIHRoZXJlZm9yZSBpdCBjYW4gbmV2ZXIgaGF2ZSBhIGRlZmF1bHQgbm8tYXJndW1lbnQgY29uc3RydWN0b3IuIEFkZCAnc3RhdGljJy4KKworSU5WQUxJRF9UWVBFX0lOX01BUCA9IFwKKyAgICBNYXAgY29udGFpbnMgYSB3cm9uZyB0eXBlCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL1RPRE8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvVE9ETy5qYXZhCmluZGV4IDZiMzUzZDMuLjJkMjRlYzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvVE9ETy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvVE9ETy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvV2VsbEtub3duTmFtZXNwYWNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL1dlbGxLbm93bk5hbWVzcGFjZS5qYXZhCmluZGV4IDFjMDAwN2MuLjc4MWM4MjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvV2VsbEtub3duTmFtZXNwYWNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9XZWxsS25vd25OYW1lc3BhY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52MjsKIAogLyoqCkBAIC01NSw2ICs1NCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTUlNRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIjsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEIgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiI7CiAKIC8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNJX05JTCA9IG5ldyBRTmFtZShYTUxfU0NIRU1BX0lOU1RBTkNFLCJuaWwiKTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvYnl0ZWNvZGUvQ2xhc3NUYWlsb3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvYnl0ZWNvZGUvQ2xhc3NUYWlsb3IuamF2YQppbmRleCBhODAxNWY3Li5mMGQ3OTAyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL2J5dGVjb2RlL0NsYXNzVGFpbG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ieXRlY29kZS9DbGFzc1RhaWxvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLmJ5dGVjb2RlOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CkBAIC00OSw3ICs0OCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgSlZNIGZvcm1hdCAoc3VjaCBhcyAiamF2YS9sYW5nL1N0cmluZyIpCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9WTUNsYXNzTmFtZSggQ2xhc3MgYyApIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1ZNQ2xhc3NOYW1lKCBDbGFzcyBjICkgewogICAgICAgICBhc3NlcnQgIWMuaXNQcmltaXRpdmUoKTsKICAgICAgICAgaWYoYy5pc0FycmF5KCkpCiAgICAgICAgICAgICAvLyBJIGhhdmUgbm8gaWRlYSB3aHkgaXQgaXMgZGVzaWduZWQgbGlrZSB0aGlzLCBidXQgamF2YXAgc2F5cyBzby4KQEAgLTU3LDcgKzU2LDcgQEAKICAgICAgICAgcmV0dXJuIGMuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCcvJyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9WTVR5cGVOYW1lKCBDbGFzcyBjICkgeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvVk1UeXBlTmFtZSggQ2xhc3MgYyApIHsKICAgICAgICAgaWYoYy5pc0FycmF5KCkpIHsKICAgICAgICAgICAgIC8vIFRPRE86IHN0dWR5IGhvdyBhbiBhcnJheSB0eXBlIGlzIGVuY29kZWQuCiAgICAgICAgICAgICByZXR1cm4gJ1snK3RvVk1UeXBlTmFtZShjLmdldENvbXBvbmVudFR5cGUoKSk7CkBAIC03OSw3ICs3OCw3IEBACiAKIAogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gdGFpbG9yKCBDbGFzcyB0ZW1wbGF0ZUNsYXNzLCBTdHJpbmcgbmV3Q2xhc3NOYW1lLCBTdHJpbmcuLi4gcmVwbGFjZW1lbnRzICkgeworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRhaWxvciggQ2xhc3MgdGVtcGxhdGVDbGFzcywgU3RyaW5nIG5ld0NsYXNzTmFtZSwgU3RyaW5nLi4uIHJlcGxhY2VtZW50cyApIHsKICAgICAgICAgU3RyaW5nIHZtbmFtZSA9IHRvVk1DbGFzc05hbWUodGVtcGxhdGVDbGFzcyk7CiAgICAgICAgIHJldHVybiB0YWlsb3IoCiAgICAgICAgICAgICB0ZW1wbGF0ZUNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh2bW5hbWUrIi5jbGFzcyIpLApAQCAtOTksNyArOTgsNyBAQAogICAgICAqICAgICAgVGhlIHNlYXJjaCBzdHJpbmdzIGZvdW5kIGluIHRoZSBjb25zdGFudCBwb29sIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgKiAgICAgIHJlcGxhY2VtZW50IHN0cmluZy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSB0YWlsb3IoIElucHV0U3RyZWFtIGltYWdlLCBTdHJpbmcgdGVtcGxhdGVDbGFzc05hbWUsIFN0cmluZyBuZXdDbGFzc05hbWUsIFN0cmluZy4uLiByZXBsYWNlbWVudHMgKSB7CisgICAgcHVibGljIHN0YXRpYyBieXRlW10gdGFpbG9yKCBJbnB1dFN0cmVhbSBpbWFnZSwgU3RyaW5nIHRlbXBsYXRlQ2xhc3NOYW1lLCBTdHJpbmcgbmV3Q2xhc3NOYW1lLCBTdHJpbmcuLi4gcmVwbGFjZW1lbnRzICkgewogICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGltYWdlKTsKIAogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ieXRlY29kZS9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL2J5dGVjb2RlL3BhY2thZ2UuaHRtbAppbmRleCAzZjVmOTdkLi4yYjA2NmIwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL2J5dGVjb2RlL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL2J5dGVjb2RlL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgogICBDb2RlIHRoYXQgZGVhbHMgd2l0aCBsb3cgbGV2ZWwgYnl0ZSBjb2RlIG1hbmlwdWxhdGlvbi4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvZG9jLWZpbGVzL3BhY2thZ2VzLnBuZyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvZG9jLWZpbGVzL3BhY2thZ2VzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2ZmU1Yi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL2RvYy1maWxlcy9wYWNrYWdlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL2RvYy1maWxlcy9wYWNrYWdlcy52c2QgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL2RvYy1maWxlcy9wYWNrYWdlcy52c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiM2JlZjQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9kb2MtZmlsZXMvcGFja2FnZXMudnNkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9kb2MtZmlsZXMvcmVhZG1lLnR4dCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvZG9jLWZpbGVzL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NzIwYmEuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9kb2MtZmlsZXMvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoZSBzeGQvdnNkIGZpbGVzIGFyZSB0aGUgbWFzdGVyLCBhbmQgdGhlIGdpZiBmaWxlIHNob3VsZCBiZSBjcmVhdGVkIGZyb20gaXQuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vQWJzdHJhY3RJbmxpbmVBbm5vdGF0aW9uUmVhZGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL0Fic3RyYWN0SW5saW5lQW5ub3RhdGlvblJlYWRlckltcGwuamF2YQppbmRleCBlYzZiMjQ2Li4xYTRkOGI2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vQWJzdHJhY3RJbmxpbmVBbm5vdGF0aW9uUmVhZGVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9BYnN0cmFjdElubGluZUFubm90YXRpb25SZWFkZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvblJlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25SZWFkZXIuamF2YQppbmRleCA4NjI2ZTUwLi5kYTkzYWZlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvblJlYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uUmVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTMgKzIyLDE1IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiAKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5FcnJvckhhbmRsZXI7CiAKIC8qKgpAQCAtODMsNiArODUsMTEgQEAKICAgICBib29sZWFuIGhhc0ZpZWxkQW5ub3RhdGlvbihDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUsIEYgZmllbGQpOwogCiAgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgY2xhc3MgaGFzIHRoZSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzQ2xhc3NBbm5vdGF0aW9uKEMgY2xhenosIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSk7CisKKyAgICAvKioKICAgICAgKiBHZXRzIGFsbCB0aGUgYW5ub3RhdGlvbnMgb24gYSBmaWVsZC4KICAgICAgKi8KICAgICBBbm5vdGF0aW9uW10gZ2V0QWxsRmllbGRBbm5vdGF0aW9ucyhGIGZpZWxkLCBMb2NhdGFibGUgc3JjUG9zKTsKQEAgLTExOSwxNyArMTI2LDIwIEBACiAgICAgICogQHJldHVybiBudWxsCiAgICAgICogICAgICBpZiB0aGUgYW5ub3RhdGlvbiB3YXMgbm90IGZvdW5kLgogICAgICAqLworICAgIEBOdWxsYWJsZQogICAgIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gQSBnZXRNZXRob2RQYXJhbWV0ZXJBbm5vdGF0aW9uKAogICAgICAgICAgICAgQ2xhc3M8QT4gYW5ub3RhdGlvbiwgTSBtZXRob2QsIGludCBwYXJhbUluZGV4LCBMb2NhdGFibGUgc3JjUG9zICk7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyBhbiBhbm5vdGF0aW9uIG9uIGEgY2xhc3MuCiAgICAgICovCisgICAgQE51bGxhYmxlCiAgICAgPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBBIGdldENsYXNzQW5ub3RhdGlvbihDbGFzczxBPiBhbm5vdGF0aW9uLCBDIGNsYXp6LCBMb2NhdGFibGUgc3JjcG9zKSA7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyBhbiBhbm5vdGF0aW9uIG9uIHRoZSBwYWNrYWdlIHRoYXQgdGhlIGdpdmVuIGNsYXNzIGJlbG9uZ3MgdG8uCiAgICAgICovCisgICAgQE51bGxhYmxlCiAgICAgPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBBIGdldFBhY2thZ2VBbm5vdGF0aW9uKENsYXNzPEE+IGFubm90YXRpb24sIEMgY2xhenosIExvY2F0YWJsZSBzcmNwb3MpOwogCiAgICAgLyoqCkBAIC0xNDQsNCArMTU0LDEwIEBACiAgICAgICogICAgICBUaGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgdG8gYmUgcmVhZC4KICAgICAgKi8KICAgICBUIGdldENsYXNzVmFsdWUoIEFubm90YXRpb24gYSwgU3RyaW5nIG5hbWUgKTsKKworICAgIC8qKgorICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rICNnZXRDbGFzc1ZhbHVlKEFubm90YXRpb24sIFN0cmluZyl9IG1ldGhvZCBidXQKKyAgICAgKiBvYnRhaW5zIGFuIGFycmF5IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBUW10gZ2V0Q2xhc3NBcnJheVZhbHVlKCBBbm5vdGF0aW9uIGEsIFN0cmluZyBuYW1lICk7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvblNvdXJjZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25Tb3VyY2UuamF2YQppbmRleCBjNGM1ZTU5Li5mZmM3NWQyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvblNvdXJjZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uU291cmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vQ2xhc3NMb2NhdGFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9DbGFzc0xvY2F0YWJsZS5qYXZhCmluZGV4IDI0MDg3ZjYuLjBiM2Q0MjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9DbGFzc0xvY2F0YWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9DbGFzc0xvY2F0YWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLm5hdi5OYXZpZ2F0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vRmllbGRMb2NhdGFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9GaWVsZExvY2F0YWJsZS5qYXZhCmluZGV4IGNhMzBhYjIuLjg3Njk3ZDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9GaWVsZExvY2F0YWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9GaWVsZExvY2F0YWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLm5hdi5OYXZpZ2F0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vSW5pdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL0luaXQuamF2YQppbmRleCA0OGExYTc4Li5mYTAwMGNjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vSW5pdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9Jbml0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uOwogCiAKQEAgLTMxLDcgKzI5LDcgQEAKIAogCiAgICAgc3RhdGljIFF1aWNrW10gZ2V0QWxsKCkgewotICAgICAgICByZXR1cm4gbmV3IFF1aWNrW10ge25ldyBYbWxBdHRyaWJ1dGVRdWljayhudWxsLCBudWxsKSwgbmV3IFhtbEVsZW1lbnRSZWZRdWljayhudWxsLCBudWxsKSwgbmV3IFhtbEVsZW1lbnRRdWljayhudWxsLCBudWxsKSwgbmV3IFhtbEVsZW1lbnRSZWZzUXVpY2sobnVsbCwgbnVsbCksIG5ldyBYbWxFbGVtZW50RGVjbFF1aWNrKG51bGwsIG51bGwpLCBuZXcgWG1sUm9vdEVsZW1lbnRRdWljayhudWxsLCBudWxsKSwgbmV3IFhtbFRyYW5zaWVudFF1aWNrKG51bGwsIG51bGwpLCBuZXcgWG1sRW51bVF1aWNrKG51bGwsIG51bGwpLCBuZXcgWG1sU2NoZW1hUXVpY2sobnVsbCwgbnVsbCksIG5ldyBYbWxWYWx1ZVF1aWNrKG51bGwsIG51bGwpLCBuZXcgWG1sVHlwZVF1aWNrKG51bGwsIG51bGwpfTsKKyAgICAgICAgcmV0dXJuIG5ldyBRdWlja1tdIHtuZXcgWG1sVHlwZVF1aWNrKG51bGwsIG51bGwpLCBuZXcgWG1sU2NoZW1hUXVpY2sobnVsbCwgbnVsbCksIG5ldyBYbWxFbGVtZW50UmVmc1F1aWNrKG51bGwsIG51bGwpLCBuZXcgWG1sVmFsdWVRdWljayhudWxsLCBudWxsKSwgbmV3IFhtbEVsZW1lbnREZWNsUXVpY2sobnVsbCwgbnVsbCksIG5ldyBYbWxFbGVtZW50UmVmUXVpY2sobnVsbCwgbnVsbCksIG5ldyBYbWxUcmFuc2llbnRRdWljayhudWxsLCBudWxsKSwgbmV3IFhtbEVsZW1lbnRRdWljayhudWxsLCBudWxsKSwgbmV3IFhtbEF0dHJpYnV0ZVF1aWNrKG51bGwsIG51bGwpLCBuZXcgWG1sUm9vdEVsZW1lbnRRdWljayhudWxsLCBudWxsKSwgbmV3IFhtbEVudW1RdWljayhudWxsLCBudWxsKX07CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vTG9jYXRhYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vTG9jYXRhYmxlLmphdmEKaW5kZXggZDg5NWJmNC4uN2MwYzY2MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL0xvY2F0YWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9Mb2NhdGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkxvY2F0aW9uOwpAQCAtMzMsNyArMzIsNyBAQAogICogPHA+CiAgKiB7QGxpbmsgTG9jYXRhYmxlfSBmb3JtcyBhIHRyZWUgc3RydWN0dXJlLCB3aGVyZSBlYWNoIHtAbGluayBMb2NhdGFibGV9CiAgKiBwb2ludHMgYmFjayB0byB0aGUgdXBzdHJlYW0ge0BsaW5rIExvY2F0YWJsZX0uCi0gKiBGb3IgZXhhbXBsZSwgaW1hZ2Uge0BsaW5rIExvY2F0YWJsZX0gWCB0aGF0IHBvaW50cyB0byBhIHBhcnRpY3VsYXIgYW5ub3RhdGlvbiwKKyAqIEZvciBleGFtcGxlLCBpbWFnaW5lIHtAbGluayBMb2NhdGFibGV9IFggdGhhdCBwb2ludHMgdG8gYSBwYXJ0aWN1bGFyIGFubm90YXRpb24sCiAgKiB3aG9zZSB1cHN0cmVhbSBpcyB7QGxpbmsgTG9jYXRhYmxlfSBZLCB3aGljaCBwb2ludHMgdG8gYSBwYXJ0aWN1bGFyIG1ldGhvZAogICogKG9uIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIHB1dCksIHdob3NlIHVwc3RyZWFtIGlzIHtAbGluayBMb2NhdGFibGV9IFosCiAgKiB3aGljaCBwb2ludHMgdG8gYSBwYXJ0aWN1bGFyIGNsYXNzIChpbiB3aGljaCB0aGUgbWV0aG9kIGlzIGRlZmluZWQpLApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL0xvY2F0YWJsZUFubm90YXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9Mb2NhdGFibGVBbm5vdGF0aW9uLmphdmEKaW5kZXggNDA1ZTA5OC4uYWQxYTk4ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL0xvY2F0YWJsZUFubm90YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vTG9jYXRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpAQCAtNzIsNiArNzEsMTAgQEAKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBhbm5vdGF0aW9uIG5vdCBsb2FkYWJsZQogICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb247CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBQcm94eS5uZXdQcm94eUluc3RhbmNlIHRocm93cyB0aGlzIGlmIGl0IGNhbm5vdCByZXNvbHZlIHRoaXMgYW5ub3RhdGlvbgorICAgICAgICAgICAgLy8gaW4gdGhpcyBjbGFzc2xvYWRlcgorICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb247CiAgICAgICAgIH0KIAogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9NZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL01lc3NhZ2VzLmphdmEKaW5kZXggMDVmMWEyZC4uYzY2M2QzYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vTWVzc2FnZXMucHJvcGVydGllcwppbmRleCAzMTlhMzRmLi43N2E5OTk2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogRFVQTElDQVRFX0FOTk9UQVRJT05TID0gXAogICAgIEFubm90YXRpb24gInswfSIgaXMgcHJlc2VudCBvbiBib3RoICJ7MX0iIGFuZCAiezJ9IgogIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL01ldGhvZExvY2F0YWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL01ldGhvZExvY2F0YWJsZS5qYXZhCmluZGV4IDJjNDRjNDYuLmVmNmEyZTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9NZXRob2RMb2NhdGFibGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vTWV0aG9kTG9jYXRhYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwubmF2Lk5hdmlnYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9RdWljay5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1F1aWNrLmphdmEKaW5kZXggMmZkMGVhNC4uMTNhNGI0MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1F1aWNrLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1F1aWNrLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vUnVudGltZUFubm90YXRpb25SZWFkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9SdW50aW1lQW5ub3RhdGlvblJlYWRlci5qYXZhCmluZGV4IDk2MWZmMGIuLjRhN2U5ODMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9SdW50aW1lQW5ub3RhdGlvblJlYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9SdW50aW1lQW5ub3RhdGlvblJlYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9SdW50aW1lSW5saW5lQW5ub3RhdGlvblJlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1J1bnRpbWVJbmxpbmVBbm5vdGF0aW9uUmVhZGVyLmphdmEKaW5kZXggMTJiMzU2Yy4uMmZkZjBiZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1J1bnRpbWVJbmxpbmVBbm5vdGF0aW9uUmVhZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1J1bnRpbWVJbmxpbmVBbm5vdGF0aW9uUmVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CkBAIC01MCw2ICs0OSwxMCBAQAogICAgICAgICByZXR1cm4gZmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uVHlwZSk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NBbm5vdGF0aW9uKENsYXNzIGNsYXp6LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGNsYXp6LmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvblR5cGUpOworICAgIH0KKwogICAgIHB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0QWxsRmllbGRBbm5vdGF0aW9ucyhGaWVsZCBmaWVsZCwgTG9jYXRhYmxlIHNyY1BvcykgewogICAgICAgICBBbm5vdGF0aW9uW10gciA9IGZpZWxkLmdldEFubm90YXRpb25zKCk7CiAgICAgICAgIGZvciggaW50IGk9MDsgaTxyLmxlbmd0aDsgaSsrICkgewpAQCAtMTI3LDYgKzEzMCwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIENsYXNzW10gZ2V0Q2xhc3NBcnJheVZhbHVlKEFubm90YXRpb24gYSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3NbXSlhLmFubm90YXRpb25UeXBlKCkuZ2V0TWV0aG9kKG5hbWUpLmludm9rZShhKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpbXBvc3NpYmxlCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0Vycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpbXBvc3NpYmxlCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJvdGVjdGVkIFN0cmluZyBmdWxsTmFtZShNZXRob2QgbSkgewogICAgICAgICByZXR1cm4gbS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSsnIycrbS5nZXROYW1lKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEF0dHJpYnV0ZVF1aWNrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sQXR0cmlidXRlUXVpY2suamF2YQppbmRleCA0Mzc3NTBmLi5jMDI0Yzk4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sQXR0cmlidXRlUXVpY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sQXR0cmlidXRlUXVpY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEVsZW1lbnREZWNsUXVpY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxFbGVtZW50RGVjbFF1aWNrLmphdmEKaW5kZXggNTkxMzRjOS4uZjBlYjAxZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEVsZW1lbnREZWNsUXVpY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sRWxlbWVudERlY2xRdWljay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sRWxlbWVudFF1aWNrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sRWxlbWVudFF1aWNrLmphdmEKaW5kZXggYTJhYzk2MC4uMWRhYWYxMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEVsZW1lbnRRdWljay5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxFbGVtZW50UXVpY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEVsZW1lbnRSZWZRdWljay5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEVsZW1lbnRSZWZRdWljay5qYXZhCmluZGV4IDVmYWE3NWEuLmZlMDljYTEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxFbGVtZW50UmVmUXVpY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sRWxlbWVudFJlZlF1aWNrLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxFbGVtZW50UmVmc1F1aWNrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sRWxlbWVudFJlZnNRdWljay5qYXZhCmluZGV4IGZhM2RlNTguLjgxMDc3YmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxFbGVtZW50UmVmc1F1aWNrLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEVsZW1lbnRSZWZzUXVpY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEVudW1RdWljay5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbEVudW1RdWljay5qYXZhCmluZGV4IDFiYjc3MDYuLmZiMTdmMGIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxFbnVtUXVpY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sRW51bVF1aWNrLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxSb290RWxlbWVudFF1aWNrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sUm9vdEVsZW1lbnRRdWljay5qYXZhCmluZGV4IDBhYWE5OGYuLmI1ZGEwZTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxSb290RWxlbWVudFF1aWNrLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbFJvb3RFbGVtZW50UXVpY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbFNjaGVtYVF1aWNrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sU2NoZW1hUXVpY2suamF2YQppbmRleCBkYWMxMzRmLi42YjBiYmY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sU2NoZW1hUXVpY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sU2NoZW1hUXVpY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpAQCAtNTUsNiArNTMsMTAgQEAKICAgICAgICAgcmV0dXJuIFhtbFNjaGVtYS5jbGFzczsKICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nIGxvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gY29yZS5sb2NhdGlvbigpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgbmFtZXNwYWNlKCkgewogICAgICAgICByZXR1cm4gY29yZS5uYW1lc3BhY2UoKTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sVHJhbnNpZW50UXVpY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxUcmFuc2llbnRRdWljay5qYXZhCmluZGV4IGViY2E4ZTUuLjAyZWQxNDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxUcmFuc2llbnRRdWljay5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxUcmFuc2llbnRRdWljay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sVHlwZVF1aWNrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sVHlwZVF1aWNrLmphdmEKaW5kZXggZjI0NThkMy4uNjIzNGZiMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbFR5cGVRdWljay5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxUeXBlUXVpY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbFZhbHVlUXVpY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9YbWxWYWx1ZVF1aWNrLmphdmEKaW5kZXggMDM0YjljZS4uYzljMTExMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL1htbFZhbHVlUXVpY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vWG1sVmFsdWVRdWljay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9hbm5vdGF0aW9uL3BhY2thZ2UuaHRtbAppbmRleCAwZjk4MGNhLi4zOGNhNzNjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2Fubm90YXRpb24vcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvYW5ub3RhdGlvbi9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGh0bWw+PGJvZHk+CiAgIEFic3RyYWN0aW9uIGFyb3VuZCByZWFkaW5nIGFubm90YXRpb25zLCB0byBzdXBwb3J0IGludGVybmFsL2V4dGVybmFsIGFubm90YXRpb25zLgogPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9BZGFwdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvQWRhcHRlci5qYXZhCmluZGV4IDM1MTJjODEuLmE5MDhmNjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9BZGFwdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0FkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxBZGFwdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0FycmF5SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0FycmF5SW5mby5qYXZhCmluZGV4IDRjYjY0ZWQuLjI3OGUxZmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9BcnJheUluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvQXJyYXlJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvQXR0cmlidXRlUHJvcGVydHlJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvQXR0cmlidXRlUHJvcGVydHlJbmZvLmphdmEKaW5kZXggNWQ2ZTQ0Yi4uODE5MDA1ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0F0dHJpYnV0ZVByb3BlcnR5SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9BdHRyaWJ1dGVQcm9wZXJ0eUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9CdWlsdGluTGVhZkluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9CdWlsdGluTGVhZkluZm8uamF2YQppbmRleCBkMDM0NGZiLi44MWRlNTJhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvQnVpbHRpbkxlYWZJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0J1aWx0aW5MZWFmSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0NsYXNzSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0NsYXNzSW5mby5qYXZhCmluZGV4IDQxNTA2YTguLmM5N2EyZjggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9DbGFzc0luZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvQ2xhc3NJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTIgKzIyLDEyIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOwogCiAvKioKICAqIEluZm9ybWF0aW9uIGFib3V0IEpBWEItYm91bmQgY2xhc3MuCkBAIC0xMDAsNiArMTAwLDEyIEBACiAgICAgTGlzdDw/IGV4dGVuZHMgUHJvcGVydHlJbmZvPFQsQz4+IGdldFByb3BlcnRpZXMoKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsYXNzIG9yIGl0cyBhbmNlc3RvciBoYXMge0BsaW5rIFhtbFZhbHVlfQorICAgICAqIHByb3BlcnR5LgorICAgICAqLworICAgIGJvb2xlYW4gaGFzVmFsdWVQcm9wZXJ0eSgpOworCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcHJvcGVydHkgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqCiAgICAgICogPHA+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0VsZW1lbnQuamF2YQppbmRleCBhNTE0MjlmLi42MmQ0OTg0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvRWxlbWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvRWxlbWVudEluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbGVtZW50SW5mby5qYXZhCmluZGV4IDZkMmMwMjkuLjZhODkwNDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbGVtZW50SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbGVtZW50SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbGVtZW50UHJvcGVydHlJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvRWxlbWVudFByb3BlcnR5SW5mby5qYXZhCmluZGV4IDUwMDQ1N2YuLmQ4NjZkNTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbGVtZW50UHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0VsZW1lbnRQcm9wZXJ0eUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC04Myw2ICs4MiwxNCBAQAogICAgIFFOYW1lIGdldFhtbE5hbWUoKTsKIAogICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgd3JhcHBlciBlbGVtZW50IGlzIHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQWx3YXlzIGZhbHNlIGlmIHtAbGluayAjZ2V0WG1sTmFtZSgpfT09bnVsbC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzQ29sbGVjdGlvblJlcXVpcmVkKCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9wZXJ0eSBpcyBuaWxsYWJsZQogICAgICAqIChtZWFuaW5nIHRoZSBhYnNlbmNlIG9mIHRoZSB2YWx1ZSBpcyB0cmVhdGVkIGFzIG5pbD0ndHJ1ZScpCiAgICAgICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbnVtQ29uc3RhbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbnVtQ29uc3RhbnQuamF2YQppbmRleCBhMjViYWVhLi5kMmY3ZDEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvRW51bUNvbnN0YW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0VudW1Db25zdGFudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW1WYWx1ZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbnVtTGVhZkluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FbnVtTGVhZkluZm8uamF2YQppbmRleCA2YTA3NGNiLi42MGRmYTY4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvRW51bUxlYWZJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0VudW1MZWFmSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0Vycm9ySGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0Vycm9ySGFuZGxlci5qYXZhCmluZGV4IGI4N2EyYWEuLjQ3MTk4ZjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9FcnJvckhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvRXJyb3JIYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbC5Nb2RlbEJ1aWxkZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvSUQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9JRC5qYXZhCmluZGV4IDJmNDQ4YjEuLjZhMjQzNzEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9JRC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9JRC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL0xlYWZJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTGVhZkluZm8uamF2YQppbmRleCA0YzE2ZDkzLi4zM2NmMDBhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTGVhZkluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTGVhZkluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9NYXBQcm9wZXJ0eUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9NYXBQcm9wZXJ0eUluZm8uamF2YQppbmRleCAwM2RiYzA2Li4zMGQyY2QyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTWFwUHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL01hcFByb3BlcnR5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL01heWJlRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL01heWJlRWxlbWVudC5qYXZhCmluZGV4IDgxY2IzYzEuLjU2ZmZmMjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9NYXliZUVsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTWF5YmVFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTm9uRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL05vbkVsZW1lbnQuamF2YQppbmRleCAyNWFkZTRkLi5iZjM0MzEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTm9uRWxlbWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9Ob25FbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTm9uRWxlbWVudFJlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL05vbkVsZW1lbnRSZWYuamF2YQppbmRleCA5YzYyM2U5Li5lZDYzNTIwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvTm9uRWxlbWVudFJlZi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9Ob25FbGVtZW50UmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvUHJvcGVydHlJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvUHJvcGVydHlJbmZvLmphdmEKaW5kZXggM2NiY2EzNC4uOTM2N2UwYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1Byb3BlcnR5SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9Qcm9wZXJ0eUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC0zNSw2ICszNCw3IEBACiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uU291cmNlOwogCiAvKioKICAqIEluZm9ybWF0aW9uIGFib3V0IGEgSkFYQi1ib3VuZCBwcm9wZXJ0eS4KQEAgLTQ4LDcgKzQ4LDcgQEAKICAqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvPFQsQz4geworcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm88VCxDPiBleHRlbmRzIEFubm90YXRpb25Tb3VyY2UgewogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUge0BsaW5rIENsYXNzSW5mb30gb3Ige0BsaW5rIEVsZW1lbnRJbmZvfSB0byB3aGljaCB0aGlzIHByb3BlcnR5IGJlbG9uZ3MuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvUHJvcGVydHlLaW5kLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvUHJvcGVydHlLaW5kLmphdmEKaW5kZXggYjliODhkNS4uZmVmYmJmNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1Byb3BlcnR5S2luZC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9Qcm9wZXJ0eUtpbmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaW1lVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9SZWYuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9SZWYuamF2YQppbmRleCBhNjE1ODRkLi41MjhjODBlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvUmVmLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1JlZi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvUmVmZXJlbmNlUHJvcGVydHlJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvUmVmZXJlbmNlUHJvcGVydHlJbmZvLmphdmEKaW5kZXggNGFlOWZlNy4uMjVhZmU5NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1JlZmVyZW5jZVByb3BlcnR5SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9SZWZlcmVuY2VQcm9wZXJ0eUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC04Niw2ICs4NSwxNCBAQAogICAgIGJvb2xlYW4gaXNDb2xsZWN0aW9uTmlsbGFibGUoKTsKIAogICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgd3JhcHBlciBlbGVtZW50IGlzIHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQWx3YXlzIGZhbHNlIGlmIHtAbGluayAjZ2V0WG1sTmFtZSgpfT09bnVsbC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzQ29sbGVjdGlvblJlcXVpcmVkKCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9wZXJ0eSBjYW4gaG9sZCB7QGxpbmsgU3RyaW5nfXMgdG8gcmVwcmVzZW50CiAgICAgICogbWl4ZWQgY29udGVudCBtb2RlbC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9SZWdpc3RyeUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9SZWdpc3RyeUluZm8uamF2YQppbmRleCAwMzYzOGQ2Li4wOTFiZGFlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvUmVnaXN0cnlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1JlZ2lzdHJ5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1R5cGVJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvVHlwZUluZm8uamF2YQppbmRleCBhYWFmZmM3Li5mZjkxN2Q5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvVHlwZUluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvVHlwZUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRFJFRjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9UeXBlSW5mb1NldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1R5cGVJbmZvU2V0LmphdmEKaW5kZXggZTQ0MDYxNC4uMjcwYzM3MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1R5cGVJbmZvU2V0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1R5cGVJbmZvU2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xNDQsNiArMTQzLDIwIEBACiAgICAgTWFwPFN0cmluZyxTdHJpbmc+IGdldFhtbE5zKFN0cmluZyBuYW1lc3BhY2VVcmkpOwogCiAgICAgLyoqCisgICAgICogR2V0cyB7QGxpbmsgWG1sU2NoZW1hI2xvY2F0aW9uKCl9IGZvdW5kIGluIHRoaXMgY29udGV4dC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIG9ubHkgdXNlZCBpbiBzY2hlbWEgZ2VuZXJhdG9yLCBzbyBpdCBjYW4gYmUgc2xvdy4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIEEgbWFwIGZyb20gbmFtZXNwYWNlIFVSSSB0byB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uLgorICAgICAqICAgICAgSWYgdGhlIGVudHJ5IGlzIG1pc3NpbmcsIHRoYXQgbWVhbnMgYSBzY2hlbWEgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhhdCBuYW1lc3BhY2UuCisgICAgICogICAgICBJZiB0aGUgdmFsdWUgaXMgIiIsIHRoYXQgbWVhbnMgdGhlIHNjaGVtYSBsb2NhdGlvbiBpcyBpbXBsaWVkCisgICAgICogICAgICAoJmx0O3hzOnNjaGVtYSBuYW1lc3BhY2U9Ii4uLiIvPiB3L28gc2NoZW1hTG9jYXRpb24uKQorICAgICAqLworICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRTY2hlbWFMb2NhdGlvbnMoKTsKKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIHJlYXNvbmFibGUge0BsaW5rIFhtbE5zRm9ybX0gZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UgVVJJLgogICAgICAqCiAgICAgICogPHA+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvVHlwZVJlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1R5cGVSZWYuamF2YQppbmRleCAxNTg4MDFmLi5lYzFmNWFhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvVHlwZVJlZi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9UeXBlUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvVmFsdWVQcm9wZXJ0eUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9WYWx1ZVByb3BlcnR5SW5mby5qYXZhCmluZGV4IDZlN2E4OGYuLmExNjQwZjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9WYWx1ZVByb3BlcnR5SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9WYWx1ZVByb3BlcnR5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1dpbGRjYXJkTW9kZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1dpbGRjYXJkTW9kZS5qYXZhCmluZGV4IDMzMjBjMWQuLjk5NjY1MmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9XaWxkY2FyZE1vZGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvV2lsZGNhcmRNb2RlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvV2lsZGNhcmRUeXBlSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL1dpbGRjYXJkVHlwZUluZm8uamF2YQppbmRleCA0NWQwODhjLi44YzNmZjI4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvV2lsZGNhcmRUeXBlSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9XaWxkY2FyZFR5cGVJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2NvcmUvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggNDU5MTEzYS4uYzY0MjA4YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9jb3JlL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvY29yZS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qKgogICogVGhlIGluLW1lbW9yeSBtb2RlbCBvZiB0aGUgSkFYQi1ib3VuZCBiZWFucy4KICAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvQW55VHlwZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9BbnlUeXBlSW1wbC5qYXZhCmluZGV4IGUxZmU3ZGMuLmRjOTI1MGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9BbnlUeXBlSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9BbnlUeXBlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0FycmF5SW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9BcnJheUluZm9JbXBsLmphdmEKaW5kZXggMjllMTFmZS4uNjhmOGQwOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0FycmF5SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvQXJyYXlJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0F0dHJpYnV0ZVByb3BlcnR5SW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9BdHRyaWJ1dGVQcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggMzllYTE5MS4uYWU0NjZkZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0F0dHJpYnV0ZVByb3BlcnR5SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvQXR0cmlidXRlUHJvcGVydHlJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9CdWlsdGluTGVhZkluZm9JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvQnVpbHRpbkxlYWZJbmZvSW1wbC5qYXZhCmluZGV4IDE2YjdlY2QuLmEzZTRjNjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9CdWlsdGluTGVhZkluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0J1aWx0aW5MZWFmSW5mb0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvQ2xhc3NJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0NsYXNzSW5mb0ltcGwuamF2YQppbmRleCAzZWY5ZTExLi45YTEzNmUwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvQ2xhc3NJbmZvSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9DbGFzc0luZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTEgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CkBAIC02NywxNSArNjcsMTYgQEAKIAogaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLkZpbmFsQXJyYXlMaXN0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYW5ub3RhdGlvbi5YbWxMb2NhdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLlRPRE87CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uLkxvY2F0YWJsZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb24uTWV0aG9kTG9jYXRhYmxlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5DbGFzc0luZm87CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLkVsZW1lbnQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLklEOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5Ob25FbGVtZW50OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5Qcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLlByb3BlcnR5S2luZDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuVHlwZUluZm87CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLlZhbHVlUHJvcGVydHlJbmZvOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5JbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuTG9jYXRpb247CiAKQEAgLTg2LDggKzg3LDcgQEAKICAqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpIChra0Brb2hzdWtlLm9yZykKICAqLwotY2xhc3MgQ2xhc3NJbmZvSW1wbDxULEMsRixNPgotICAgIGV4dGVuZHMgVHlwZUluZm9JbXBsPFQsQyxGLE0+CitjbGFzcyBDbGFzc0luZm9JbXBsPFQsQyxGLE0+IGV4dGVuZHMgVHlwZUluZm9JbXBsPFQsQyxGLE0+CiAgICAgaW1wbGVtZW50cyBDbGFzc0luZm88VCxDPiwgRWxlbWVudDxULEM+IHsKIAogICAgIHByb3RlY3RlZCBmaW5hbCBDIGNsYXp6OwpAQCAtMTY5LDEyICsxNjksMTcgQEAKICAgICAgICAgICAgIHByb3BPcmRlciA9IERFRkFVTFRfT1JERVI7CiAgICAgICAgIH0KIAorICAgICAgICBpZihuYXYoKS5pc0ludGVyZmFjZShjbGF6eikpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucmVwb3J0RXJyb3IobmV3IElsbGVnYWxBbm5vdGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkNBTlRfSEFORExFX0lOVEVSRkFDRS5mb3JtYXQobmF2KCkuZ2V0Q2xhc3NOYW1lKGNsYXp6KSksIHRoaXMgKSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyB0aGUgY2xhc3MgbXVzdCBoYXZlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgIGlmICghaGFzRmFjdG9yeUNvbnN0cnVjdG9yKHQpKXsKICAgICAgICAgICAgIGlmKCFuYXYoKS5oYXNEZWZhdWx0Q29uc3RydWN0b3IoY2xhenopKXsKICAgICAgICAgICAgICAgICBNZXNzYWdlcyBtc2c7Ci0gICAgICAgICAgICAgICAgaWYobmF2KCkuaXNJbnRlcmZhY2UoY2xhenopKQotICAgICAgICAgICAgICAgICAgICBtc2cgPSBNZXNzYWdlcy5DQU5UX0hBTkRMRV9JTlRFUkZBQ0U7CisgICAgICAgICAgICAgICAgaWYobmF2KCkuaXNJbm5lckNsYXNzKGNsYXp6KSkKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gTWVzc2FnZXMuQ0FOVF9IQU5ETEVfSU5ORVJfQ0xBU1M7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBtc2cgPSBNZXNzYWdlcy5OT19ERUZBVUxUX0NPTlNUUlVDVE9SOwogCkBAIC0xOTIsOCArMTk3LDEzIEBACiAgICAgICAgICAgICBpZihzPT1udWxsIHx8IHM9PW5hdigpLmFzRGVjbChPYmplY3QuY2xhc3MpKQogICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IG51bGw7CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSAoQ2xhc3NJbmZvSW1wbDxULEMsRixNPikgYnVpbGRlci5nZXRDbGFzc0luZm8ocyx0aGlzKTsKLSAgICAgICAgICAgICAgICBiYXNlQ2xhc3MuaGFzU3ViQ2xhc3NlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgTm9uRWxlbWVudDxULEM+IGIgPSBidWlsZGVyLmdldENsYXNzSW5mbyhzLCB0cnVlLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBpZihiIGluc3RhbmNlb2YgQ2xhc3NJbmZvSW1wbCkgeworICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSAoQ2xhc3NJbmZvSW1wbDxULEMsRixNPikgYjsKKyAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzLmhhc1N1YkNsYXNzZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBiYXNlQ2xhc3M7CkBAIC0yMzksNyArMjQ5LDcgQEAKICAgICAgICAgICAgIGlmKHAuaWQoKT09IElELklEKQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIENsYXNzSW5mb0ltcGw8VCwgQywgRiwgTT4gYmFzZSA9IGdldEJhc2VDbGFzcygpOworICAgICAgICBDbGFzc0luZm9JbXBsPFQsQyxGLE0+IGJhc2UgPSBnZXRCYXNlQ2xhc3MoKTsKICAgICAgICAgaWYoYmFzZSE9bnVsbCkKICAgICAgICAgICAgIHJldHVybiBiYXNlLmNhbkJlUmVmZXJlbmNlZEJ5SURSRUYoKTsKICAgICAgICAgZWxzZQpAQCAtMjY5LDI4ICsyNzksNyBAQAogCiAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgRmluYWxBcnJheUxpc3Q8UHJvcGVydHlJbmZvSW1wbDxULEMsRixNPj4oKTsKIAotICAgICAgICAvLyBmaW5kIHByb3BlcnRpZXMgZnJvbSBmaWVsZHMKLSAgICAgICAgZm9yKCBGIGYgOiBuYXYoKS5nZXREZWNsYXJlZEZpZWxkcyhjbGF6eikgKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSByZWFkZXIoKS5nZXRBbGxGaWVsZEFubm90YXRpb25zKGYsdGhpcyk7Ci0gICAgICAgICAgICBpZiggbmF2KCkuaXNUcmFuc2llbnQoZikgKSB7Ci0gICAgICAgICAgICAgICAgLy8gaXQncyBhbiBlcnJvciBmb3IgdHJhbnNpZW50IGZpZWxkIHRvIGhhdmUgYW55IGJpbmRpbmcgYW5ub3RhdGlvbgotICAgICAgICAgICAgICAgIGlmKGhhc0pBWEJBbm5vdGF0aW9uKGFubm90YXRpb25zKSkKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5yZXBvcnRFcnJvcihuZXcgSWxsZWdhbEFubm90YXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5UUkFOU0lFTlRfRklFTERfTk9UX0JJTkRBQkxFLmZvcm1hdChuYXYoKS5nZXRGaWVsZE5hbWUoZikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNvbWVKQVhCQW5ub3RhdGlvbihhbm5vdGF0aW9ucykpKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYoIG5hdigpLmlzU3RhdGljRmllbGQoZikgKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RhdGljIGZpZWxkcyBhcmUgYm91bmQgb25seSB3aGVuIHRoZXJlJ3MgZXhwbGljaXQgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgICAgICBpZihoYXNKQVhCQW5ub3RhdGlvbihhbm5vdGF0aW9ucykpCi0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5KGNyZWF0ZUZpZWxkU2VlZChmKSxhbm5vdGF0aW9ucyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKGF0PT1YbWxBY2Nlc3NUeXBlLkZJRUxECi0gICAgICAgICAgICAgICAgfHwoYXQ9PVhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiAmJiBuYXYoKS5pc1B1YmxpY0ZpZWxkKGYpKQotICAgICAgICAgICAgICAgIHx8IGhhc0pBWEJBbm5vdGF0aW9uKGFubm90YXRpb25zKSkKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHkoY3JlYXRlRmllbGRTZWVkKGYpLGFubm90YXRpb25zKTsKLSAgICAgICAgICAgICAgICBjaGVja0ZpZWxkWG1sTG9jYXRpb24oZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZmluZEZpZWxkUHJvcGVydGllcyhjbGF6eixhdCk7CiAKICAgICAgICAgZmluZEdldHRlclNldHRlclByb3BlcnRpZXMoYXQpOwogCkBAIC0zNTAsNiArMzM5LDQ3IEBACiAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBmaW5kRmllbGRQcm9wZXJ0aWVzKEMgYywgWG1sQWNjZXNzVHlwZSBhdCkgeworICAgICAgICAvLyBhbHdheXMgZmluZCBwcm9wZXJ0aWVzIGZyb20gdGhlIHN1cGVyIGNsYXNzIGZpcnN0CisgICAgICAgIEMgc2MgPSBuYXYoKS5nZXRTdXBlckNsYXNzKGMpOworICAgICAgICBpZihzaG91bGRSZWN1cnNlU3VwZXJDbGFzcyhzYykpCisgICAgICAgICAgICBmaW5kRmllbGRQcm9wZXJ0aWVzKHNjLGF0KTsKKworICAgICAgICBmb3IoIEYgZiA6IG5hdigpLmdldERlY2xhcmVkRmllbGRzKGMpICkgeworICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gcmVhZGVyKCkuZ2V0QWxsRmllbGRBbm5vdGF0aW9ucyhmLHRoaXMpOworICAgICAgICAgICAgaWYoIG5hdigpLmlzVHJhbnNpZW50KGYpICkgeworICAgICAgICAgICAgICAgIC8vIGl0J3MgYW4gZXJyb3IgZm9yIHRyYW5zaWVudCBmaWVsZCB0byBoYXZlIGFueSBiaW5kaW5nIGFubm90YXRpb24KKyAgICAgICAgICAgICAgICBpZihoYXNKQVhCQW5ub3RhdGlvbihhbm5vdGF0aW9ucykpCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIucmVwb3J0RXJyb3IobmV3IElsbGVnYWxBbm5vdGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuVFJBTlNJRU5UX0ZJRUxEX05PVF9CSU5EQUJMRS5mb3JtYXQobmF2KCkuZ2V0RmllbGROYW1lKGYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTb21lSkFYQkFubm90YXRpb24oYW5ub3RhdGlvbnMpKSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmKCBuYXYoKS5pc1N0YXRpY0ZpZWxkKGYpICkgeworICAgICAgICAgICAgICAgIC8vIHN0YXRpYyBmaWVsZHMgYXJlIGJvdW5kIG9ubHkgd2hlbiB0aGVyZSdzIGV4cGxpY2l0IGFubm90YXRpb24uCisgICAgICAgICAgICAgICAgaWYoaGFzSkFYQkFubm90YXRpb24oYW5ub3RhdGlvbnMpKQorICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eShjcmVhdGVGaWVsZFNlZWQoZiksYW5ub3RhdGlvbnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihhdD09WG1sQWNjZXNzVHlwZS5GSUVMRAorICAgICAgICAgICAgICAgIHx8KGF0PT1YbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIgJiYgbmF2KCkuaXNQdWJsaWNGaWVsZChmKSkKKyAgICAgICAgICAgICAgICB8fCBoYXNKQVhCQW5ub3RhdGlvbihhbm5vdGF0aW9ucykpCisgICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5KGNyZWF0ZUZpZWxkU2VlZChmKSxhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICAgICAgY2hlY2tGaWVsZFhtbExvY2F0aW9uKGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzVmFsdWVQcm9wZXJ0eSgpIHsKKyAgICAgICAgQ2xhc3NJbmZvSW1wbDxULCBDLCBGLCBNPiBiYyA9IGdldEJhc2VDbGFzcygpOworICAgICAgICBpZihiYyE9bnVsbCAmJiBiYy5oYXNWYWx1ZVByb3BlcnR5KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBmb3IgKFByb3BlcnR5SW5mbyBwIDogZ2V0UHJvcGVydGllcygpKSB7CisgICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIFZhbHVlUHJvcGVydHlJbmZvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwdWJsaWMgUHJvcGVydHlJbmZvPFQsQz4gZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgZm9yKCBQcm9wZXJ0eUluZm88VCxDPiBwOiBnZXRQcm9wZXJ0aWVzKCkgKSB7CiAgICAgICAgICAgICBpZihwLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCkBAIC04MTcsMjMgKzg0NywyMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFJlZmVyZW5jZVByb3BlcnR5SW5mb0ltcGw8VCxDLEYsTT4gY3JlYXRlUmVmZXJlbmNlUHJvcGVydHkoUHJvcGVydHlTZWVkPFQsIEMsIEYsIE0+IHNlZWQpIHsKKyAgICBwcm90ZWN0ZWQgUmVmZXJlbmNlUHJvcGVydHlJbmZvSW1wbDxULEMsRixNPiBjcmVhdGVSZWZlcmVuY2VQcm9wZXJ0eShQcm9wZXJ0eVNlZWQ8VCxDLEYsTT4gc2VlZCkgewogICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVByb3BlcnR5SW5mb0ltcGw8VCxDLEYsTT4odGhpcyxzZWVkKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgQXR0cmlidXRlUHJvcGVydHlJbmZvSW1wbDxULCBDLCBGLCBNPiBjcmVhdGVBdHRyaWJ1dGVQcm9wZXJ0eShQcm9wZXJ0eVNlZWQ8VCwgQywgRiwgTT4gc2VlZCkgeworICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVQcm9wZXJ0eUluZm9JbXBsPFQsQyxGLE0+IGNyZWF0ZUF0dHJpYnV0ZVByb3BlcnR5KFByb3BlcnR5U2VlZDxULEMsRixNPiBzZWVkKSB7CiAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlUHJvcGVydHlJbmZvSW1wbDxULEMsRixNPih0aGlzLHNlZWQpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBWYWx1ZVByb3BlcnR5SW5mb0ltcGw8VCwgQywgRiwgTT4gY3JlYXRlVmFsdWVQcm9wZXJ0eShQcm9wZXJ0eVNlZWQ8VCwgQywgRiwgTT4gc2VlZCkgeworICAgIHByb3RlY3RlZCBWYWx1ZVByb3BlcnR5SW5mb0ltcGw8VCxDLEYsTT4gY3JlYXRlVmFsdWVQcm9wZXJ0eShQcm9wZXJ0eVNlZWQ8VCxDLEYsTT4gc2VlZCkgewogICAgICAgICByZXR1cm4gbmV3IFZhbHVlUHJvcGVydHlJbmZvSW1wbDxULEMsRixNPih0aGlzLHNlZWQpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBFbGVtZW50UHJvcGVydHlJbmZvSW1wbDxULCBDLCBGLCBNPiBjcmVhdGVFbGVtZW50UHJvcGVydHkoUHJvcGVydHlTZWVkPFQsIEMsIEYsIE0+IHNlZWQpIHsKKyAgICBwcm90ZWN0ZWQgRWxlbWVudFByb3BlcnR5SW5mb0ltcGw8VCxDLEYsTT4gY3JlYXRlRWxlbWVudFByb3BlcnR5KFByb3BlcnR5U2VlZDxULEMsRixNPiBzZWVkKSB7CiAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudFByb3BlcnR5SW5mb0ltcGw8VCxDLEYsTT4odGhpcyxzZWVkKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgTWFwUHJvcGVydHlJbmZvSW1wbDxULCBDLCBGLCBNPiBjcmVhdGVNYXBQcm9wZXJ0eShQcm9wZXJ0eVNlZWQ8VCwgQywgRiwgTT4gc2VlZCkgeworICAgIHByb3RlY3RlZCBNYXBQcm9wZXJ0eUluZm9JbXBsPFQsQyxGLE0+IGNyZWF0ZU1hcFByb3BlcnR5KFByb3BlcnR5U2VlZDxULEMsRixNPiBzZWVkKSB7CiAgICAgICAgIHJldHVybiBuZXcgTWFwUHJvcGVydHlJbmZvSW1wbDxULEMsRixNPih0aGlzLHNlZWQpOwogICAgIH0KIApAQCAtODQyLDU0ICs4NzIsMTkgQEAKICAgICAgKiBBZGRzIHByb3BlcnRpZXMgdGhhdCBjb25zaXN0cyBvZiBhY2Nlc3NvcnMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGZpbmRHZXR0ZXJTZXR0ZXJQcm9wZXJ0aWVzKFhtbEFjY2Vzc1R5cGUgYXQpIHsKLSAgICAgICAgVE9ETy5jaGVja1NwZWMoKTsgICAvLyBUT0RPOiBJIGRvbid0IHRoaW5rIHRoZSBzcGVjIGRlc2NyaWJlcyBob3cgcHJvcGVydGllcyBhcmUgZm91bmQKLQogICAgICAgICAvLyBpbiB0aGUgZmlyc3Qgc3RlcCB3ZSBhY2N1bXVsYXRlIGdldHRlcnMgYW5kIHNldHRlcnMKICAgICAgICAgLy8gaW50byB0aGlzIG1hcCBrZXllZCBieSB0aGUgcHJvcGVydHkgbmFtZS4KICAgICAgICAgTWFwPFN0cmluZyxNPiBnZXR0ZXJzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLE0+KCk7CiAgICAgICAgIE1hcDxTdHJpbmcsTT4gc2V0dGVycyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZyxNPigpOwogCi0gICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE0+IG1ldGhvZHMgPSBuYXYoKS5nZXREZWNsYXJlZE1ldGhvZHMoY2xhenopOwotICAgICAgICBmb3IoIE0gbWV0aG9kIDogbWV0aG9kcyApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gdXNlZCA9IGZhbHNlOyAgIC8vIGlmIHRoaXMgbWV0aG9kIGlzIGFkZGVkIHRvIGdldHRlcnMgb3Igc2V0dGVycworICAgICAgICBDIGMgPSBjbGF6ejsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY29sbGVjdEdldHRlclNldHRlcnMoY2xhenosIGdldHRlcnMsIHNldHRlcnMpOwogCi0gICAgICAgICAgICBpZihuYXYoKS5pc0JyaWRnZU1ldGhvZChtZXRob2QpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIGlnbm9yZQorICAgICAgICAgICAgLy8gdGFrZSBzdXBlciBjbGFzc2VzIGludG8gYWNjb3VudCBpZiB0aGV5IGhhdmUgQFhtbFRyYW5zaWVudAorICAgICAgICAgICAgYyA9IG5hdigpLmdldFN1cGVyQ2xhc3MoYyk7CisgICAgICAgIH0gd2hpbGUoc2hvdWxkUmVjdXJzZVN1cGVyQ2xhc3MoYykpOwogCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hdigpLmdldE1ldGhvZE5hbWUobWV0aG9kKTsKLSAgICAgICAgICAgIGludCBhcml0eSA9IG5hdigpLmdldE1ldGhvZFBhcmFtZXRlcnMobWV0aG9kKS5sZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmKG5hdigpLmlzU3RhdGljTWV0aG9kKG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICBlbnN1cmVOb0Fubm90YXRpb24obWV0aG9kKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZG9uJ3QgbG9vayBhdCBYbWxUcmFuc2llbnQuIFdlJ2xsIGRlYWwgd2l0aCB0aGF0IGxhdGVyLgotCi0gICAgICAgICAgICAvLyBpcyB0aGlzIGEgZ2V0IG1ldGhvZD8KLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IGdldFByb3BlcnR5TmFtZUZyb21HZXRNZXRob2QobmFtZSk7Ci0gICAgICAgICAgICBpZihwcm9wTmFtZSE9bnVsbCkgewotICAgICAgICAgICAgICAgIGlmKGFyaXR5PT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldHRlcnMucHV0KHByb3BOYW1lLG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgIHVzZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBkbyB3ZSBzdXBwb3J0IGluZGV4ZWQgcHJvcGVydHk/Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBzZXQgbWV0aG9kPwotICAgICAgICAgICAgcHJvcE5hbWUgPSBnZXRQcm9wZXJ0eU5hbWVGcm9tU2V0TWV0aG9kKG5hbWUpOwotICAgICAgICAgICAgaWYocHJvcE5hbWUhPW51bGwpIHsKLSAgICAgICAgICAgICAgICBpZihhcml0eT09MSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgY2hlY2sgY29sbGlzaW9ucyBsaWtlIHNldEZvbyhpbnQpIGFuZCBzZXRGb28oU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICBzZXR0ZXJzLnB1dChwcm9wTmFtZSxtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICB1c2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogZG8gd2Ugc3VwcG9ydCBpbmRleGVkIHByb3BlcnR5PwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZighdXNlZCkKLSAgICAgICAgICAgICAgICBlbnN1cmVOb0Fubm90YXRpb24obWV0aG9kKTsKLSAgICAgICAgfQogCiAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGludGVyc2VjdGlvbgogICAgICAgICBTZXQ8U3RyaW5nPiBjb21wbGV0ZSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oZ2V0dGVycy5rZXlTZXQoKSk7CkBAIC05MTEsOCArOTA2LDggQEAKICAgICAgICAgICAgIGlmKCFoYXNBbm5vdGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgLy8gY2hlY2tpbmcgaWYgdGhlIG1ldGhvZCBpcyBvdmVycmlkaW5nIG90aGVycyBpc24ndCBmcmVlLAogICAgICAgICAgICAgICAgIC8vIHNvIHdlIGRvbid0IGNvbXB1dGUgaXQgaWYgaXQncyBub3QgbmVjZXNzYXJ5LgotICAgICAgICAgICAgICAgIGlzT3ZlcnJpZGluZyA9IChnZXR0ZXIhPW51bGwgJiYgbmF2KCkuaXNPdmVycmlkaW5nKGdldHRlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNldHRlciE9bnVsbCAmJiBuYXYoKS5pc092ZXJyaWRpbmcoc2V0dGVyKSk7CisgICAgICAgICAgICAgICAgaXNPdmVycmlkaW5nID0gKGdldHRlciE9bnVsbCAmJiBuYXYoKS5pc092ZXJyaWRpbmcoZ2V0dGVyLGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzZXR0ZXIhPW51bGwgJiYgbmF2KCkuaXNPdmVycmlkaW5nKHNldHRlcixjKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmKChhdD09WG1sQWNjZXNzVHlwZS5QUk9QRVJUWSAmJiAhaXNPdmVycmlkaW5nKQpAQCAtOTYyLDYgKzk1Nyw5MCBAQAogICAgICAgICAvLyBhbmQgaG93IGl0IHdpbGwgYmUgWE1MLWl6ZWQuCiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNvbGxlY3RHZXR0ZXJTZXR0ZXJzKEMgYywgTWFwPFN0cmluZyxNPiBnZXR0ZXJzLCBNYXA8U3RyaW5nLE0+IHNldHRlcnMpIHsKKyAgICAgICAgLy8gdGFrZSBzdXBlciBjbGFzc2VzIGludG8gYWNjb3VudCBpZiB0aGV5IGhhdmUgQFhtbFRyYW5zaWVudC4KKyAgICAgICAgLy8gYWx3YXlzIHZpc2l0IHRoZW0gZmlyc3Qgc28gdGhhdAorICAgICAgICAvLyAgIDEpIG9yZGVyIGlzIHJpZ2h0CisgICAgICAgIC8vICAgMikgb3ZlcnJpZGVuIHByb3BlcnRpZXMgYXJlIGhhbmRsZWQgYWNjb3JkaW5nbHkKKyAgICAgICAgQyBzYyA9IG5hdigpLmdldFN1cGVyQ2xhc3MoYyk7CisgICAgICAgIGlmKHNob3VsZFJlY3Vyc2VTdXBlckNsYXNzKHNjKSkKKyAgICAgICAgICAgIGNvbGxlY3RHZXR0ZXJTZXR0ZXJzKHNjLGdldHRlcnMsc2V0dGVycyk7CisKKworICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNPiBtZXRob2RzID0gbmF2KCkuZ2V0RGVjbGFyZWRNZXRob2RzKGMpOworICAgICAgICBNYXA8U3RyaW5nLExpc3Q8TT4+IGFsbFNldHRlcnMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsTGlzdDxNPj4oKTsKKyAgICAgICAgZm9yKCBNIG1ldGhvZCA6IG1ldGhvZHMgKSB7CisgICAgICAgICAgICBib29sZWFuIHVzZWQgPSBmYWxzZTsgICAvLyBpZiB0aGlzIG1ldGhvZCBpcyBhZGRlZCB0byBnZXR0ZXJzIG9yIHNldHRlcnMKKworICAgICAgICAgICAgaWYobmF2KCkuaXNCcmlkZ2VNZXRob2QobWV0aG9kKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAvLyBpZ25vcmUKKworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYXYoKS5nZXRNZXRob2ROYW1lKG1ldGhvZCk7CisgICAgICAgICAgICBpbnQgYXJpdHkgPSBuYXYoKS5nZXRNZXRob2RQYXJhbWV0ZXJzKG1ldGhvZCkubGVuZ3RoOworCisgICAgICAgICAgICBpZihuYXYoKS5pc1N0YXRpY01ldGhvZChtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgZW5zdXJlTm9Bbm5vdGF0aW9uKG1ldGhvZCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvbid0IGxvb2sgYXQgWG1sVHJhbnNpZW50IG9uIHByb3BlcnRpZXMuIFdlJ2xsIGRlYWwgd2l0aCB0aGF0IGxhdGVyLgorCisgICAgICAgICAgICAvLyBpcyB0aGlzIGEgZ2V0IG1ldGhvZD8KKyAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IGdldFByb3BlcnR5TmFtZUZyb21HZXRNZXRob2QobmFtZSk7CisgICAgICAgICAgICBpZihwcm9wTmFtZSE9bnVsbCAmJiBhcml0eT09MCkgeworICAgICAgICAgICAgICAgIGdldHRlcnMucHV0KHByb3BOYW1lLG1ldGhvZCk7CisgICAgICAgICAgICAgICAgdXNlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBzZXQgbWV0aG9kPworICAgICAgICAgICAgcHJvcE5hbWUgPSBnZXRQcm9wZXJ0eU5hbWVGcm9tU2V0TWV0aG9kKG5hbWUpOworICAgICAgICAgICAgaWYocHJvcE5hbWUhPW51bGwgJiYgYXJpdHk9PTEpIHsKKyAgICAgICAgICAgICAgICBMaXN0PE0+IHByb3BTZXR0ZXJzID0gYWxsU2V0dGVycy5nZXQocHJvcE5hbWUpOworICAgICAgICAgICAgICAgIGlmKG51bGwgPT0gcHJvcFNldHRlcnMpeworICAgICAgICAgICAgICAgICAgICBwcm9wU2V0dGVycyA9IG5ldyBBcnJheUxpc3Q8TT4oKTsKKyAgICAgICAgICAgICAgICAgICAgYWxsU2V0dGVycy5wdXQocHJvcE5hbWUsIHByb3BTZXR0ZXJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvcFNldHRlcnMuYWRkKG1ldGhvZCk7CisgICAgICAgICAgICAgICAgdXNlZCA9IHRydWU7IC8vIHVzZWQgY2hlY2sgcGVyZm9ybWVkIGxhdGVyCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCF1c2VkKQorICAgICAgICAgICAgICAgIGVuc3VyZU5vQW5ub3RhdGlvbihtZXRob2QpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWF0Y2ggZ2V0dGVyIHdpdGggc2V0dGVycyBieSBjb21wYXJpbmcgZ2V0dGVyIHJldHVybiB0eXBlIHRvIHNldHRlciBwYXJhbQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsTT4gZW50cnkgOiBnZXR0ZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgTSBnZXR0ZXIgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgTGlzdDxNPiBwcm9wU2V0dGVycyA9IGFsbFNldHRlcnMucmVtb3ZlKHByb3BOYW1lKTsKKyAgICAgICAgICAgIGlmIChudWxsID09IHByb3BTZXR0ZXJzKSB7CisgICAgICAgICAgICAgICAgLy9ubyBtYXRjaGluZyBzZXR0ZXIKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFQgZ2V0dGVyVHlwZSA9IG5hdigpLmdldFJldHVyblR5cGUoZ2V0dGVyKTsKKyAgICAgICAgICAgIGZvciAoTSBzZXR0ZXIgOiBwcm9wU2V0dGVycykgeworICAgICAgICAgICAgICAgIFQgc2V0dGVyVHlwZSA9IG5hdigpLmdldE1ldGhvZFBhcmFtZXRlcnMoc2V0dGVyKVswXTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dGVyVHlwZS5lcXVhbHMoZ2V0dGVyVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGVycy5wdXQocHJvcE5hbWUsIHNldHRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsc28gYWxsb3cgc2V0LW9ubHkgcHJvcGVydGllcworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsTGlzdDxNPj4gZSA6IGFsbFNldHRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgc2V0dGVycy5wdXQoZS5nZXRLZXkoKSxlLmdldFZhbHVlKCkuZ2V0KDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgcHJvcGVydGllcyBpbiB0aGlzIGdpdmVuIHN1cGVyIGNsYXNzIHNob3VsZCBiZSBhZ2dyZWdhdGVkIGludG8gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkUmVjdXJzZVN1cGVyQ2xhc3MoQyBzYykgeworICAgICAgICByZXR1cm4gc2MhPW51bGwKKyAgICAgICAgICAgICYmIChidWlsZGVyLmlzUmVwbGFjZWQoc2MpIHx8IHJlYWRlcigpLmhhc0NsYXNzQW5ub3RhdGlvbihzYywgWG1sVHJhbnNpZW50LmNsYXNzKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2QgaXMgY29uc2lkZXJlZCAncHVibGljJy4KICAgICAgKi8KQEAgLTExODIsOSArMTI2MSwxMyBAQAogICAgICAgICByZXR1cm4gZmFjdG9yeU1ldGhvZCAhPSBudWxsOwogICAgIH0KIAotCiAgICAgcHVibGljIE1ldGhvZCBnZXRGYWN0b3J5TWV0aG9kKCl7CiAgICAgICAgIHJldHVybiAoTWV0aG9kKSBmYWN0b3J5TWV0aG9kOwogICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiQ2xhc3NJbmZvKCIrY2xhenorJyknOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfT1JERVIgPSBuZXcgU3RyaW5nWzBdOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VSUHJvcGVydHlJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VSUHJvcGVydHlJbmZvSW1wbC5qYXZhCmluZGV4IGU3OWQ1N2EuLjFmYWVkNzIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9FUlByb3BlcnR5SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRVJQcm9wZXJ0eUluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFdyYXBwZXI7CkBAIC00NCw2ICs0Myw3IEBACiAgICAgICAgIFhtbEVsZW1lbnRXcmFwcGVyIGUgPSBzZWVkLnJlYWRBbm5vdGF0aW9uKFhtbEVsZW1lbnRXcmFwcGVyLmNsYXNzKTsKIAogICAgICAgICBib29sZWFuIG5pbCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHJlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgIGlmKCFpc0NvbGxlY3Rpb24oKSkgewogICAgICAgICAgICAgeG1sTmFtZSA9IG51bGw7CiAgICAgICAgICAgICBpZihlIT1udWxsKQpAQCAtNTYsMTEgKzU2LDEzIEBACiAgICAgICAgICAgICBpZihlIT1udWxsKSB7CiAgICAgICAgICAgICAgICAgeG1sTmFtZSA9IGNhbGNYbWxOYW1lKGUpOwogICAgICAgICAgICAgICAgIG5pbCA9IGUubmlsbGFibGUoKTsKKyAgICAgICAgICAgICAgICByZXF1aXJlZCA9IGUucmVxdWlyZWQoKTsKICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIHhtbE5hbWUgPSBudWxsOwogICAgICAgICB9CiAKICAgICAgICAgd3JhcHBlck5pbGxhYmxlID0gbmlsOworICAgICAgICB3cmFwcGVyUmVxdWlyZWQgPSByZXF1aXJlZDsKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIFFOYW1lIHhtbE5hbWU7CkBAIC03MSw2ICs3MywxMSBAQAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB3cmFwcGVyTmlsbGFibGU7CiAKICAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSB3cmFwcGVyIHRhZyBpcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gd3JhcHBlclJlcXVpcmVkOworCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUgd3JhcHBlciBlbGVtZW50IG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFFOYW1lIGdldFhtbE5hbWUoKSB7CkBAIC04MCw0ICs4Nyw4IEBACiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb2xsZWN0aW9uTmlsbGFibGUoKSB7CiAgICAgICAgIHJldHVybiB3cmFwcGVyTmlsbGFibGU7CiAgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb2xsZWN0aW9uUmVxdWlyZWQoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVyUmVxdWlyZWQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VsZW1lbnRJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VsZW1lbnRJbmZvSW1wbC5qYXZhCmluZGV4IDFjN2Y2ZjMuLmRkY2FlOTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9FbGVtZW50SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRWxlbWVudEluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CkBAIC00MSw2ICs0MCw3IEBACiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7CiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAoraW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLkZpbmFsQXJyYXlMaXN0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuVE9ETzsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvblNvdXJjZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb24uTG9jYXRhYmxlOwpAQCAtNTcsNyArNTcsNiBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5JbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuTG9jYXRpb247CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLlN3YVJlZkFkYXB0ZXI7Ci1pbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuRmluYWxBcnJheUxpc3Q7CiAKIC8qKgogICoge0BsaW5rIEVsZW1lbnRJbmZvfSBpbXBsZW1lbnRhdGlvbi4KQEAgLTcwLDYgKzY5LDggQEAKIAogICAgIHByaXZhdGUgZmluYWwgTm9uRWxlbWVudDxULEM+IGNvbnRlbnRUeXBlOwogCisgICAgcHJpdmF0ZSBmaW5hbCBUIHRPZkpBWEJFbGVtZW50VDsKKwogICAgIHByaXZhdGUgZmluYWwgVCBlbGVtZW50VHlwZTsKIAogICAgIHByaXZhdGUgZmluYWwgQ2xhc3NJbmZvPFQsQz4gc2NvcGU7CkBAIC0xNDAsNiArMTQxLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gdGFnTmFtZTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGlvblJlcXVpcmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uTmlsbGFibGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjY0LDE1ICsyNjksMTYgQEAKICAgICAgICAgfQogICAgICAgICB0aGlzLmFkYXB0ZXIgPSBhOwogCisgICAgICAgIC8vIFQgb2YgSkFYQkVsZW1lbnQ8VD4KKyAgICAgICAgdE9mSkFYQkVsZW1lbnRUID0KKyAgICAgICAgICAgIG1ldGhvZFBhcmFtcy5sZW5ndGg+MCA/IG1ldGhvZFBhcmFtc1swXSAvLyB0aGlzIGlzIG1vcmUgcmVsaWFibGUsIGFzIGl0IHdvcmtzIGV2ZW4gZm9yIE9iamVjdEZhY3RvcnkgdGhhdCBzb21ldGltZXMgaGF2ZSB0byByZXR1cm4gcHVibGljIHR5cGVzCisgICAgICAgICAgICA6IG5hdigpLmdldFR5cGVBcmd1bWVudChiYXNlQ2xhc3MsMCk7IC8vIGZhbGwgYmFjayB0byBpbmZlciBmcm9tIHRoZSByZXR1cm4gdHlwZSBpZiBubyBwYXJhbWV0ZXIuCisKICAgICAgICAgaWYoYWRhcHRlcj09bnVsbCkgewotICAgICAgICAgICAgLy8gVCBvZiBKQVhCRWxlbWVudDxUPgotICAgICAgICAgICAgVCB0eXBlVHlwZSA9Ci0gICAgICAgICAgICAgICAgbWV0aG9kUGFyYW1zLmxlbmd0aD4wID8gbWV0aG9kUGFyYW1zWzBdIC8vIHRoaXMgaXMgbW9yZSByZWxpYWJsZSwgYXMgaXQgd29ya3MgZXZlbiBmb3IgT2JqZWN0RmFjdG9yeSB0aGF0IHNvbWV0aW1lcyBoYXZlIHRvIHJldHVybiBwdWJsaWMgdHlwZXMKLSAgICAgICAgICAgICAgICA6IG5hdigpLmdldFR5cGVBcmd1bWVudChiYXNlQ2xhc3MsMCk7IC8vIGZhbGwgYmFjayB0byBpbmZlciBmcm9tIHRoZSByZXR1cm4gdHlwZSBpZiBubyBwYXJhbWV0ZXIuCi0gICAgICAgICAgICBUIGxpc3QgPSBuYXYoKS5nZXRCYXNlQ2xhc3ModHlwZVR5cGUsbmF2KCkuYXNEZWNsKExpc3QuY2xhc3MpKTsKKyAgICAgICAgICAgIFQgbGlzdCA9IG5hdigpLmdldEJhc2VDbGFzcyh0T2ZKQVhCRWxlbWVudFQsbmF2KCkuYXNEZWNsKExpc3QuY2xhc3MpKTsKICAgICAgICAgICAgIGlmKGxpc3Q9PW51bGwpIHsKICAgICAgICAgICAgICAgICBpc0NvbGxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IGJ1aWxkZXIuZ2V0VHlwZUluZm8odHlwZVR5cGUsdGhpcyk7ICAvLyBzdWNrIHRoaXMgdHlwZSBpbnRvIHRoZSBjdXJyZW50IHNldC4KKyAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IGJ1aWxkZXIuZ2V0VHlwZUluZm8odE9mSkFYQkVsZW1lbnRULHRoaXMpOyAgLy8gc3VjayB0aGlzIHR5cGUgaW50byB0aGUgY3VycmVudCBzZXQuCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlzQ29sbGVjdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBidWlsZGVyLmdldFR5cGVJbmZvKG5hdigpLmdldFR5cGVBcmd1bWVudChsaXN0LDApLHRoaXMpOwpAQCAtMzM5LDcgKzM0NSw3IEBACiAKICAgICBwdWJsaWMgVCBnZXRDb250ZW50SW5NZW1vcnlUeXBlKCkgewogICAgICAgICBpZihhZGFwdGVyPT1udWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGVudFR5cGUuZ2V0VHlwZSgpOworICAgICAgICAgICAgcmV0dXJuIHRPZkpBWEJFbGVtZW50VDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBhZGFwdGVyLmN1c3RvbVR5cGU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9FbGVtZW50UHJvcGVydHlJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VsZW1lbnRQcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggZDBlNzM3ZS4uM2VkMzE2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VsZW1lbnRQcm9wZXJ0eUluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VsZW1lbnRQcm9wZXJ0eUluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRW51bUNvbnN0YW50SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VudW1Db25zdGFudEltcGwuamF2YQppbmRleCBkODUyMTIzLi5iMTM1MjFlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRW51bUNvbnN0YW50SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9FbnVtQ29uc3RhbnRJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5FbnVtQ29uc3RhbnQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRW51bUxlYWZJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0VudW1MZWFmSW5mb0ltcGwuamF2YQppbmRleCBhZTJhZTZhLi4zZTA5NjdlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRW51bUxlYWZJbmZvSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9FbnVtTGVhZkluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTEwOCw3ICsxMDcsOSBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGNhbGNDb25zdGFudHMoKSB7CiAgICAgICAgIEVudW1Db25zdGFudEltcGw8VCxDLEYsTT4gbGFzdCA9IG51bGw7Ci0gICAgICAgIGZvciggRiBjb25zdGFudCA6IG5hdigpLmdldEVudW1Db25zdGFudHMoY2xhenopICkgeworICAgICAgICBGW10gY29uc3RhbnRzID0gbmF2KCkuZ2V0RW51bUNvbnN0YW50cyhjbGF6eik7CisgICAgICAgIGZvciggaW50IGk9Y29uc3RhbnRzLmxlbmd0aC0xOyBpPj0wOyBpLS0gKSB7CisgICAgICAgICAgICBGIGNvbnN0YW50ID0gY29uc3RhbnRzW2ldOwogICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYXYoKS5nZXRGaWVsZE5hbWUoY29uc3RhbnQpOwogICAgICAgICAgICAgWG1sRW51bVZhbHVlIHhldiA9IGJ1aWxkZXIucmVhZGVyLmdldEZpZWxkQW5ub3RhdGlvbihYbWxFbnVtVmFsdWUuY2xhc3MsIGNvbnN0YW50LCB0aGlzKTsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0ZpZWxkUHJvcGVydHlTZWVkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRmllbGRQcm9wZXJ0eVNlZWQuamF2YQppbmRleCAzM2YzZGE5Li42YzdiZGQ4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRmllbGRQcm9wZXJ0eVNlZWQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvRmllbGRQcm9wZXJ0eVNlZWQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9HZXR0ZXJTZXR0ZXJQcm9wZXJ0eVNlZWQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9HZXR0ZXJTZXR0ZXJQcm9wZXJ0eVNlZWQuamF2YQppbmRleCBhMDhiYTlhLi4yYzhmYTM3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvR2V0dGVyU2V0dGVyUHJvcGVydHlTZWVkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0dldHRlclNldHRlclByb3BlcnR5U2VlZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0xlYWZJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL0xlYWZJbmZvSW1wbC5qYXZhCmluZGV4IDkyMjk3MDQuLmU4Yzk4NzQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9MZWFmSW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTGVhZkluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTWFwUHJvcGVydHlJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL01hcFByb3BlcnR5SW5mb0ltcGwuamF2YQppbmRleCA4ZTg1MzViLi5lYWVhOTRmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTWFwUHJvcGVydHlJbmZvSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9NYXBQcm9wZXJ0eUluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9NZXNzYWdlcy5qYXZhCmluZGV4IDhmOWU3OWEuLjdhNDliZjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9NZXNzYWdlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTM5LDYgKzM4LDcgQEAKICAgICBEVVBMSUNBVEVfQU5OT1RBVElPTlMsIC8vIDEgYXJnCiAgICAgTk9fREVGQVVMVF9DT05TVFJVQ1RPUiwgLy8gMSBhcmcKICAgICBDQU5UX0hBTkRMRV9JTlRFUkZBQ0UsIC8vIDEgYXJnCisgICAgQ0FOVF9IQU5ETEVfSU5ORVJfQ0xBU1MsIC8vIDEgYXJnCiAgICAgQU5OT1RBVElPTl9PTl9XUk9OR19NRVRIT0QsIC8vIDAgYXJncwogICAgIEdFVFRFUl9TRVRURVJfSU5DT01QQVRJQkxFX1RZUEUsIC8vIDIgYXJncwogICAgIERVUExJQ0FURV9FTlRSWV9JTl9QUk9QX09SREVSLCAvLyAxIGFyZwpAQCAtODIsOSArODIsMTggQEAKICAgICBOT19GQUNUT1JZX01FVEhPRCwgLy8gMiBhcmdzCiAgICAgRkFDVE9SWV9DTEFTU19ORUVEU19GQUNUT1JZX01FVEhPRCwgLy8gMSBhcmcKIAorICAgIElOQ09NUEFUSUJMRV9BUElfVkVSU0lPTiwgLy8gMiBhcmdzCisgICAgSU5DT01QQVRJQkxFX0FQSV9WRVJTSU9OX01VU1RBTkcsIC8vIDIgYXJncworCiAgICAgTUlTU0lOR19KQVhCX1BST1BFUlRJRVMsIC8vIDFhcmcKICAgICBUUkFOU0lFTlRfRklFTERfTk9UX0JJTkRBQkxFLCAvLyAxIGFyZwotICAgIFRIRVJFX01VU1RfQkVfVkFMVUVfSU5fWE1MVkFMVUUgLy8gMSBhcmcKKyAgICBUSEVSRV9NVVNUX0JFX1ZBTFVFX0lOX1hNTFZBTFVFLCAvLyAxIGFyZworICAgIFVOTUFUQ0hBQkxFX0FEQVBURVIsIC8vIDIgYXJncworCisgICAgQUNDRVNTT1JGQUNUT1JZX0lOU1RBTlRJQVRJT05fRVhDRVBUSU9OLCAvLyAyIGFyZworICAgIEFDQ0VTU09SRkFDVE9SWV9BQ0NFU1NfRVhDRVBUSU9OLCAvLyAyIGFyZworICAgIENVU1RPTV9BQ0NFU1NPUkZBQ1RPUllfUFJPUEVSVFlfRVJST1IsIC8vIDIgYXJnCisgICAgQ1VTVE9NX0FDQ0VTU09SRkFDVE9SWV9GSUVMRF9FUlJPUiwgLy8gMiBhcmcKICAgICA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShNZXNzYWdlcy5jbGFzcy5nZXROYW1lKCkpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTWVzc2FnZXMucHJvcGVydGllcwppbmRleCBhMzJlMGIwLi45MjliYTI5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogSURfTVVTVF9CRV9TVFJJTkcgPSBcCiAgICAgUHJvcGVydHkgInswfSIgaGFzIGFuIFhtbElEIGFubm90YXRpb24gYnV0IGl0cyB0eXBlIGlzIG5vdCBTdHJpbmcuCiAKQEAgLTEzLDYgKzM4LDkgQEAKIENBTlRfSEFORExFX0lOVEVSRkFDRSA9IFwKICAgICB7MH0gaXMgYW4gaW50ZXJmYWNlLCBhbmQgSkFYQiBjYW4nJ3QgaGFuZGxlIGludGVyZmFjZXMuCiAKK0NBTlRfSEFORExFX0lOTkVSX0NMQVNTID0gXAorICAgIHswfSBpcyBhIG5vbi1zdGF0aWMgaW5uZXIgY2xhc3MsIGFuZCBKQVhCIGNhbicndCBoYW5kbGUgdGhvc2UuCisKIEFOTk9UQVRJT05fT05fV1JPTkdfTUVUSE9EID0gXAogICAgIEpBWEIgYW5ub3RhdGlvbiBpcyBwbGFjZWQgb24gYSBtZXRob2QgdGhhdCBpcyBub3QgYSBKQVhCIHByb3BlcnR5CiAKQEAgLTEyNCw0ICsxNTIsMjcgQEAKIAogVEhFUkVfTVVTVF9CRV9WQUxVRV9JTl9YTUxWQUxVRSA9IFwKICAgICBPYmplY3QgbXVzdCBoYXZlIHNvbWUgdmFsdWUgaW4gaXRzIEBYbWxWYWx1ZSBmaWVsZDogezB9CisKK0lOQ09NUEFUSUJMRV9BUElfVkVSU0lPTiA9IFwKKyAgICBKQVhCIDIuMCBBUEkgamFyIGlzIGJlaW5nIGxvYWRlZCAoZnJvbSB7MH0pLCBidXQgdGhpcyBSSSAoZnJvbSB7MX0pIHJlcXVpcmVzIEpBWEIgMi4xIEFQSSBqYXIuCisKK0lOQ09NUEFUSUJMRV9BUElfVkVSU0lPTl9NVVNUQU5HID0gXAorICAgIEpBWEIgMi4wIEFQSSBpcyBiZWluZyBsb2FkZWQgZnJvbSB0aGUgYm9vdHN0cmFwIGNsYXNzbG9hZGVyLCBidXQgdGhpcyBSSSAoZnJvbSB7MX0pIG5lZWRzIDIuMSBBUEkuIFwKKyAgICBVc2UgdGhlIGVuZG9yc2VkIGRpcmVjdG9yeSBtZWNoYW5pc20gdG8gcGxhY2UgamF4Yi1hcGkuamFyIGluIHRoZSBib290c3RyYXAgY2xhc3Nsb2FkZXIuIFwKKyAgICAoU2VlIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL3N0YW5kYXJkcy8pCisKK1VOTUFUQ0hBQkxFX0FEQVBURVIgPSBcCisgICAgQWRhcHRlciB7MH0gaXMgbm90IGFwcGxpY2FibGUgdG8gdGhlIGZpZWxkIHR5cGUgezF9LiAKKworQUNDRVNTT1JGQUNUT1JZX0lOU1RBTlRJQVRJT05fRVhDRVBUSU9OID0gXAorICAgIFVuYWJsZSB0byBjcmVhdGUgaW5zdGFuY2Ugb2YgQWNjZXNzb3JGYWN0b3J5LCB7MH0gZm9yIGNsYXNzIHsxfS4KKworQUNDRVNTT1JGQUNUT1JZX0FDQ0VTU19FWENFUFRJT04gPSBcCisgICAgVW5hYmxlIHRvIGFjY2VzcyBpbnN0YW5jZSBvZiBBY2Nlc3NvckZhY3RvcnksIHswfSBmb3IgY2xhc3MgezF9LgorCitDVVNUT01fQUNDRVNTT1JGQUNUT1JZX1BST1BFUlRZX0VSUk9SID0gXAorICAgIEN1c3RvbSBBY2Nlc3NvckZhY3RvcnksIHswfSwgaXMgcmVwb3J0aW5nIGFuIGVycm9yIGFjY2Vzc2luZyBhIHByb3BlcnR5LiB7MX0KKworQ1VTVE9NX0FDQ0VTU09SRkFDVE9SWV9GSUVMRF9FUlJPUiA9IFwKKyAgICBDdXN0b20gQWNjZXNzb3JGYWN0b3J5LCB7MH0sIGlzIHJlcG9ydGluZyBhbiBlcnJvciBhY2Nlc3NpbmcgYSBmaWVsZC4gezF9CiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTW9kZWxCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvTW9kZWxCdWlsZGVyLmphdmEKaW5kZXggZTdmYzE5MC4uMWJhYTk2ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL01vZGVsQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9Nb2RlbEJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwxNiArMjIsMjEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRhY2htZW50UmVmOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWE7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnV0aWwuV2hpY2g7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25SZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uLkNsYXNzTG9jYXRhYmxlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbi5Mb2NhdGFibGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLkNsYXNzSW5mbzsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmNvcmUuRXJyb3JIYW5kbGVyOwpAQCAtOTAsMTAgKzk1LDE0IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkZWZhdWx0TnNVcmk7CiAKKwogICAgIC8qKgogICAgICAqIFBhY2thZ2VzIHdob3NlIHJlZ2lzdHJpZXMgYXJlIGFscmVhZHkgYWRkZWQuCiAgICAgICovCi0gICAgLypwYWNrYWdlKi8gZmluYWwgTWFwPFN0cmluZyxSZWdpc3RyeUluZm9JbXBsPiByZWdpc3RyaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFJlZ2lzdHJ5SW5mb0ltcGw+KCk7CisgICAgLypwYWNrYWdlKi8gZmluYWwgTWFwPFN0cmluZyxSZWdpc3RyeUluZm9JbXBsPFQsQyxGLE0+PiByZWdpc3RyaWVzCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZyxSZWdpc3RyeUluZm9JbXBsPFQsQyxGLE0+PigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8QyxDPiBzdWJjbGFzc1JlcGxhY2VtZW50czsKIAogICAgIC8qKgogICAgICAqIEBzZWUgI3NldEVycm9ySGFuZGxlcgpAQCAtMTAxLDIwICsxMTAsMjggQEAKICAgICBwcml2YXRlIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIGhhZEVycm9yOwogCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgaWYgdGhlIG1vZGVsIGluY2x1ZGVzIHtAbGluayBYbWxBdHRhY2htZW50UmVmfS4gSkFYLVdTCisgICAgICogbmVlZHMgdG8ga25vdyB0aGlzIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1N3YVJlZjsKKwogICAgIHByaXZhdGUgZmluYWwgRXJyb3JIYW5kbGVyIHByb3h5RXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpIHsKICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoSWxsZWdhbEFubm90YXRpb25FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmVwb3J0RXJyb3IoZSk7CiAgICAgICAgIH0KICAgICB9OwogCi0KICAgICBwdWJsaWMgTW9kZWxCdWlsZGVyKAotICAgICAgICBBbm5vdGF0aW9uUmVhZGVyPFQsQyxGLE0+IHJlYWRlciwKLSAgICAgICAgTmF2aWdhdG9yPFQsQyxGLE0+IG5hdmlnYXRvciwKLSAgICAgICAgU3RyaW5nIGRlZmF1bHROYW1lc3BhY2VSZW1hcCApIHsKKyAgICAgICAgICAgIEFubm90YXRpb25SZWFkZXI8VCwgQywgRiwgTT4gcmVhZGVyLAorICAgICAgICAgICAgTmF2aWdhdG9yPFQsIEMsIEYsIE0+IG5hdmlnYXRvciwKKyAgICAgICAgICAgIE1hcDxDLCBDPiBzdWJjbGFzc1JlcGxhY2VtZW50cywKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlUmVtYXAKKyAgICApIHsKIAogICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKICAgICAgICAgdGhpcy5uYXYgPSBuYXZpZ2F0b3I7CisgICAgICAgIHRoaXMuc3ViY2xhc3NSZXBsYWNlbWVudHMgPSBzdWJjbGFzc1JlcGxhY2VtZW50czsKICAgICAgICAgaWYoZGVmYXVsdE5hbWVzcGFjZVJlbWFwPT1udWxsKQogICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZVJlbWFwID0gIiI7CiAgICAgICAgIHRoaXMuZGVmYXVsdE5zVXJpID0gZGVmYXVsdE5hbWVzcGFjZVJlbWFwOwpAQCAtMTIyLDggKzEzOSwzMyBAQAogICAgICAgICB0eXBlSW5mb1NldCA9IGNyZWF0ZVR5cGVJbmZvU2V0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTWFrZXMgc3VyZSB0aGF0IHdlIGFyZSBydW5uaW5nIHdpdGggMi4xIEpBWEIgQVBJLAorICAgICAqIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgbm90LgorICAgICAqLworICAgIHN0YXRpYyB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYbWxTY2hlbWEgcyA9IG51bGw7CisgICAgICAgICAgICBzLmxvY2F0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGFzIGVweGVjdGVkCisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGEgMi4xIEFQSS4gV2hlcmUgaXMgaXQgYmVpbmcgbG9hZGVkIGZyb20/CisgICAgICAgICAgICBNZXNzYWdlcyByZXM7CisgICAgICAgICAgICBpZihYbWxTY2hlbWEuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKT09bnVsbCkKKyAgICAgICAgICAgICAgICByZXMgPSBNZXNzYWdlcy5JTkNPTVBBVElCTEVfQVBJX1ZFUlNJT05fTVVTVEFORzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXMgPSBNZXNzYWdlcy5JTkNPTVBBVElCTEVfQVBJX1ZFUlNJT047CisKKyAgICAgICAgICAgIHRocm93IG5ldyBMaW5rYWdlRXJyb3IoIHJlcy5mb3JtYXQoCisgICAgICAgICAgICAgICAgV2hpY2gud2hpY2goWG1sU2NoZW1hLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBXaGljaC53aGljaChNb2RlbEJ1aWxkZXIuY2xhc3MpCisgICAgICAgICAgICApKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCBUeXBlSW5mb1NldEltcGw8VCxDLEYsTT4gY3JlYXRlVHlwZUluZm9TZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVHlwZUluZm9TZXRJbXBsKG5hdixyZWFkZXIsQnVpbHRpbkxlYWZJbmZvSW1wbC5jcmVhdGVMZWF2ZXMobmF2KSk7CisgICAgICAgIHJldHVybiBuZXcgVHlwZUluZm9TZXRJbXBsPFQsQyxGLE0+KG5hdixyZWFkZXIsQnVpbHRpbkxlYWZJbmZvSW1wbC5jcmVhdGVMZWF2ZXMobmF2KSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzUsNiArMTc3LDE1IEBACiAgICAgICoge0BsaW5rIFN0cmluZ30gb3Ige0BsaW5rIEVudW19LWRlcml2ZWQgb25lcykKICAgICAgKi8KICAgICBwdWJsaWMgTm9uRWxlbWVudDxULEM+IGdldENsYXNzSW5mbyggQyBjbGF6eiwgTG9jYXRhYmxlIHVwc3RyZWFtICkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3NJbmZvKGNsYXp6LGZhbHNlLHVwc3RyZWFtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgbGltaXRlZCBjYXNlcyB3aGVyZSB0aGUgY2FsbGVyIG5lZWRzIHRvIHNlYXJjaCBmb3IgYSBzdXBlciBjbGFzcy4KKyAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGRvbid0IHdhbnQge0BsaW5rICNzdWJjbGFzc1JlcGxhY2VtZW50c30KKyAgICAgKiB0byBraWNrIGluIGZvciB0aGUgc3VwZXIgY2xhc3Mgc2VhcmNoLCB3aGljaCB3aWxsIGNhdXNlIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9uRWxlbWVudDxULEM+IGdldENsYXNzSW5mbyggQyBjbGF6eiwgYm9vbGVhbiBzZWFyY2hGb3JTdXBlckNsYXNzLCBMb2NhdGFibGUgdXBzdHJlYW0gKSB7CiAgICAgICAgIGFzc2VydCBjbGF6eiE9bnVsbDsKICAgICAgICAgTm9uRWxlbWVudDxULEM+IHIgPSB0eXBlSW5mb1NldC5nZXRDbGFzc0luZm8oY2xhenopOwogICAgICAgICBpZihyIT1udWxsKQpAQCAtMTQ0LDMyICsxOTUsNTMgQEAKICAgICAgICAgICAgIEVudW1MZWFmSW5mb0ltcGw8VCxDLEYsTT4gbGkgPSBjcmVhdGVFbnVtTGVhZkluZm8oY2xhenosdXBzdHJlYW0pOwogICAgICAgICAgICAgdHlwZUluZm9TZXQuYWRkKGxpKTsKICAgICAgICAgICAgIHIgPSBsaTsKKyAgICAgICAgICAgIGFkZFR5cGVOYW1lKHIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ2xhc3NJbmZvSW1wbDxULEMsRixNPiBjaSA9IGNyZWF0ZUNsYXNzSW5mbyhjbGF6eix1cHN0cmVhbSk7Ci0gICAgICAgICAgICB0eXBlSW5mb1NldC5hZGQoY2kpOworICAgICAgICAgICAgYm9vbGVhbiBpc1JlcGxhY2VkID0gc3ViY2xhc3NSZXBsYWNlbWVudHMuY29udGFpbnNLZXkoY2xhenopOworICAgICAgICAgICAgaWYoaXNSZXBsYWNlZCAmJiAhc2VhcmNoRm9yU3VwZXJDbGFzcykgeworICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBpdCBhcyBpZiB0aGUgcmVwbGFjZW1lbnQgd2FzIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIHIgPSBnZXRDbGFzc0luZm8oc3ViY2xhc3NSZXBsYWNlbWVudHMuZ2V0KGNsYXp6KSx1cHN0cmVhbSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmKHJlYWRlci5oYXNDbGFzc0Fubm90YXRpb24oY2xhenosWG1sVHJhbnNpZW50LmNsYXNzKSB8fCBpc1JlcGxhY2VkKSB7CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGl0IGFzIGlmIHRoZSBiYXNlIGNsYXNzIHdhcyBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICByID0gZ2V0Q2xhc3NJbmZvKCBuYXYuZ2V0U3VwZXJDbGFzcyhjbGF6eiksIHNlYXJjaEZvclN1cGVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NMb2NhdGFibGU8Qz4odXBzdHJlYW0sY2xhenosbmF2KSApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDbGFzc0luZm9JbXBsPFQsQyxGLE0+IGNpID0gY3JlYXRlQ2xhc3NJbmZvKGNsYXp6LHVwc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB0eXBlSW5mb1NldC5hZGQoY2kpOwogCi0gICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBjbG9zdXJlIGJ5IGVhZ2VybHkgZXhwYW5kaW5nIHJlZmVyZW5jZXMKLSAgICAgICAgICAgIGZvciggUHJvcGVydHlJbmZvPFQsQz4gcCA6IGNpLmdldFByb3BlcnRpZXMoKSApIHsKLSAgICAgICAgICAgICAgICBpZihwLmtpbmQoKT09IFByb3BlcnR5S2luZC5SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIHJlZ2lzdHJ5IGZvciB0aGlzIHBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IG5hdi5nZXRQYWNrYWdlTmFtZShjaS5nZXRDbGF6eigpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIXJlZ2lzdHJpZXMuY29udGFpbnNLZXkocGtnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBwYWNrYWdlJ3Mgb2JqZWN0IGZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIEMgYyA9IG5hdi5maW5kQ2xhc3MocGtnICsgIi5PYmplY3RGYWN0b3J5IixjaS5nZXRDbGF6eigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGMhPW51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVnaXN0cnkoYywoTG9jYXRhYmxlKXApOworICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGNsb3N1cmUgYnkgZWFnZXJseSBleHBhbmRpbmcgcmVmZXJlbmNlcworICAgICAgICAgICAgICAgIGZvciggUHJvcGVydHlJbmZvPFQsQz4gcCA6IGNpLmdldFByb3BlcnRpZXMoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocC5raW5kKCk9PSBQcm9wZXJ0eUtpbmQuUkVGRVJFTkNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgcmVnaXN0cnkgZm9yIHRoaXMgcGFja2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IG5hdi5nZXRQYWNrYWdlTmFtZShjaS5nZXRDbGF6eigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFyZWdpc3RyaWVzLmNvbnRhaW5zS2V5KHBrZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgdGhlIHBhY2thZ2UncyBvYmplY3QgZmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMgYyA9IG5hdi5maW5kQ2xhc3MocGtnICsgIi5PYmplY3RGYWN0b3J5IixjaS5nZXRDbGF6eigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjIT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZWdpc3RyeShjLChMb2NhdGFibGUpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IoIFR5cGVJbmZvPFQsQz4gdCA6IHAucmVmKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgOyAvLyBqdXN0IGNvbXB1dGUgYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHN1ZmZpY2UKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2kuZ2V0QmFzZUNsYXNzKCk7IC8vIHNhbWUgYXMgYWJvdmUuCiAKLSAgICAgICAgICAgICAgICBmb3IoIFR5cGVJbmZvPFQsQz4gdCA6IHAucmVmKCkgKQotICAgICAgICAgICAgICAgICAgICA7IC8vIGp1c3QgY29tcHV0ZSBhIHJlZmVyZW5jZSBzaG91bGQgYmUgc3VmZmljZQorICAgICAgICAgICAgICAgIHIgPSBjaTsKKyAgICAgICAgICAgICAgICBhZGRUeXBlTmFtZShyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNpLmdldEJhc2VDbGFzcygpOwotCi0gICAgICAgICAgICByID0gY2k7CiAgICAgICAgIH0KIAotICAgICAgICBhZGRUeXBlTmFtZShyKTsKKworICAgICAgICAvLyBtb3JlIHJlZmVyZW5jZSBjbG9zdXJlIGV4cGFuc2lvbi4gQFhtbFNlZUFsc28KKyAgICAgICAgWG1sU2VlQWxzbyBzYSA9IHJlYWRlci5nZXRDbGFzc0Fubm90YXRpb24oWG1sU2VlQWxzby5jbGFzcywgY2xhenosIHVwc3RyZWFtKTsKKyAgICAgICAgaWYoc2EhPW51bGwpIHsKKyAgICAgICAgICAgIGZvciggVCB0IDogcmVhZGVyLmdldENsYXNzQXJyYXlWYWx1ZShzYSwidmFsdWUiKSApIHsKKyAgICAgICAgICAgICAgICBnZXRUeXBlSW5mbyh0LChMb2NhdGFibGUpc2EpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKIAogICAgICAgICByZXR1cm4gcjsKICAgICB9CkBAIC0yMzQsOCArMzA2LDcgQEAKICAgICAgICAgcmV0dXJuIG5ldyBFbnVtTGVhZkluZm9JbXBsPFQsQyxGLE0+KHRoaXMsdXBzdHJlYW0sY2xhenosbmF2LnVzZShjbGF6eikpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBDbGFzc0luZm9JbXBsPFQsQyxGLE0+IGNyZWF0ZUNsYXNzSW5mbygKLSAgICAgICAgICAgIEMgY2xhenosIExvY2F0YWJsZSB1cHN0cmVhbSApIHsKKyAgICBwcm90ZWN0ZWQgQ2xhc3NJbmZvSW1wbDxULEMsRixNPiBjcmVhdGVDbGFzc0luZm8oQyBjbGF6eiwgTG9jYXRhYmxlIHVwc3RyZWFtICkgewogICAgICAgICByZXR1cm4gbmV3IENsYXNzSW5mb0ltcGw8VCxDLEYsTT4odGhpcyx1cHN0cmVhbSxjbGF6eik7CiAgICAgfQogCkBAIC0yNTQsOCArMzI1LDcgQEAKICAgICAgKiBpbiBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgUmVnaXN0cnlJbmZvPFQsQz4gYWRkUmVnaXN0cnkoQyByZWdpc3RyeUNsYXNzLCBMb2NhdGFibGUgdXBzdHJlYW0gKSB7Ci0gICAgICAgIFJlZ2lzdHJ5SW5mb0ltcGw8VCxDLEYsTT4gciA9IG5ldyBSZWdpc3RyeUluZm9JbXBsPFQsQyxGLE0+KHRoaXMsdXBzdHJlYW0scmVnaXN0cnlDbGFzcyk7Ci0gICAgICAgIHJldHVybiByOworICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5SW5mb0ltcGw8VCxDLEYsTT4odGhpcyx1cHN0cmVhbSxyZWdpc3RyeUNsYXNzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMyNCw0ICszOTQsOCBAQAogICAgICAgICBpZihlcnJvckhhbmRsZXIhPW51bGwpCiAgICAgICAgICAgICBlcnJvckhhbmRsZXIuZXJyb3IoZSk7CiAgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXBsYWNlZChDIHNjKSB7CisgICAgICAgIHJldHVybiBzdWJjbGFzc1JlcGxhY2VtZW50cy5jb250YWluc0tleShzYyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1Byb3BlcnR5SW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9Qcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggODY3NWJlYi4uOTNjMmMyNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1Byb3BlcnR5SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUHJvcGVydHlJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEwICsyMiwxMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CiAKIGltcG9ydCBqYXZheC5hY3RpdmF0aW9uLk1pbWVUeXBlOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0YWNobWVudFJlZjsKQEAgLTM4LDYgKzM4LDcgQEAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYTsKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcnM7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxBZGFwdGVyOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLlRPRE87CkBAIC04MSw3ICs4MiwxNiBAQAogICAgIHByb3RlY3RlZCBQcm9wZXJ0eUluZm9JbXBsKENsYXNzSW5mb0ltcGw8VCxDLEYsTT4gcGFyZW50LCBQcm9wZXJ0eVNlZWQ8VCxDLEYsTT4gc3BpKSB7CiAgICAgICAgIHRoaXMuc2VlZCA9IHNwaTsKICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuaWQgPSBjYWxjSWQoKTsKKworICAgICAgICBpZihwYXJlbnQ9PW51bGwpCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIFZhcmlvdXMgcGVvcGxlIHJlcG9ydGVkIGEgYnVnIHdoZXJlIHRoaXMgcGFyYW1ldGVyIGlzIHNvbWVob3cgbnVsbC4KKyAgICAgICAgICAgICAgICBJbiBhbiBhdHRlbXB0IHRvIGNhdGNoIHRoZSBlcnJvciBiZXR0ZXIsIGxldCdzIGRvIGFuIGV4cGxpY2l0IGNoZWNrIGhlcmUuCisKKyAgICAgICAgICAgICAgICBodHRwOi8vZm9ydW1zLmphdmEubmV0L2ppdmUvdGhyZWFkLmpzcGE/dGhyZWFkSUQ9MTg0NzkKKyAgICAgICAgICAgICAgICBodHRwOi8vZm9ydW1zLmphdmEubmV0L2ppdmUvdGhyZWFkLmpzcGE/bWVzc2FnZUlEPTE2NTk0NgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKIAogICAgICAgICBNaW1lVHlwZSBtdCA9IFV0aWwuY2FsY0V4cGVjdGVkTWVkaWFUeXBlKHNlZWQscGFyZW50LmJ1aWxkZXIpOwogICAgICAgICBpZihtdCE9bnVsbCAmJiAha2luZCgpLmNhbkhhdmVYbWxNaW1lVHlwZSkgewpAQCAtOTcsMjEgKzEwNyw0NiBAQAogICAgICAgICAgICAgICAgIGdldEluZGl2aWR1YWxUeXBlKCksdGhpcyk7CiAKICAgICAgICAgVCB0ID0gc2VlZC5nZXRSYXdUeXBlKCk7Ci0gICAgICAgIHRoaXMuaXNDb2xsZWN0aW9uID0gbmF2KCkuaXNTdWJDbGFzc09mKHQsIG5hdigpLnJlZihDb2xsZWN0aW9uLmNsYXNzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBuYXYoKS5pc0FycmF5QnV0Tm90Qnl0ZUFycmF5KHQpOwogCi0gICAgICAgIFhtbEphdmFUeXBlQWRhcHRlciB4anRhID0gZ2V0QXBwbGljYWJsZUFkYXB0ZXIoZ2V0SW5kaXZpZHVhbFR5cGUoKSk7Ci0gICAgICAgIGlmKHhqdGE9PW51bGwpIHsKLSAgICAgICAgICAgIC8vIHVnbHkgdWdseSBoYWNrLCBidXQgd2UgaW1wbGVtZW50IHN3YVJlZiBhcyBhZGFwdGVyCi0gICAgICAgICAgICBYbWxBdHRhY2htZW50UmVmIHhzYSA9IHNlZWQucmVhZEFubm90YXRpb24oWG1sQXR0YWNobWVudFJlZi5jbGFzcyk7Ci0gICAgICAgICAgICBpZih4c2EhPW51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGFwdGVyID0gbmV3IEFkYXB0ZXI8VCxDPihuYXYoKS5hc0RlY2woU3dhUmVmQWRhcHRlci5jbGFzcyksbmF2KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGFwdGVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUncyBhbiBhZGFwdGVyIGFwcGxpY2FibGUgdG8gdGhlIHdob2xlIHByb3BlcnR5CisgICAgICAgIFhtbEphdmFUeXBlQWRhcHRlciB4anRhID0gZ2V0QXBwbGljYWJsZUFkYXB0ZXIodCk7CisgICAgICAgIGlmKHhqdGEhPW51bGwpIHsKKyAgICAgICAgICAgIGlzQ29sbGVjdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgYWRhcHRlciA9IG5ldyBBZGFwdGVyPFQsQz4oeGp0YSxyZWFkZXIoKSxuYXYoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgYWRhcHRlciBpcyBhcHBsaWNhYmxlIHRvIHRoZSBpbmRpdmlkdWFsIGl0ZW0gaW4gdGhlIHByb3BlcnR5CisKKyAgICAgICAgICAgIHRoaXMuaXNDb2xsZWN0aW9uID0gbmF2KCkuaXNTdWJDbGFzc09mKHQsIG5hdigpLnJlZihDb2xsZWN0aW9uLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmF2KCkuaXNBcnJheUJ1dE5vdEJ5dGVBcnJheSh0KTsKKworICAgICAgICAgICAgeGp0YSA9IGdldEFwcGxpY2FibGVBZGFwdGVyKGdldEluZGl2aWR1YWxUeXBlKCkpOworICAgICAgICAgICAgaWYoeGp0YT09bnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHVnbHkgdWdseSBoYWNrLCBidXQgd2UgaW1wbGVtZW50IHN3YVJlZiBhcyBhZGFwdGVyCisgICAgICAgICAgICAgICAgWG1sQXR0YWNobWVudFJlZiB4c2EgPSBzZWVkLnJlYWRBbm5vdGF0aW9uKFhtbEF0dGFjaG1lbnRSZWYuY2xhc3MpOworICAgICAgICAgICAgICAgIGlmKHhzYSE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYnVpbGRlci5oYXNTd2FSZWYgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBhZGFwdGVyID0gbmV3IEFkYXB0ZXI8VCxDPihuYXYoKS5hc0RlY2woU3dhUmVmQWRhcHRlci5jbGFzcyksbmF2KCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQgaGFzIGFkYXB0ZXIgYW5ub3RhdGlvbiBidXQgbm90IGFwcGxpY2FibGUsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbXVzdCBiZSBhbiBlcnJvciBvZiB0aGUgdXNlcgorICAgICAgICAgICAgICAgICAgICB4anRhID0gc2VlZC5yZWFkQW5ub3RhdGlvbihYbWxKYXZhVHlwZUFkYXB0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpZih4anRhIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUIGFkYXB0ZXIgPSByZWFkZXIoKS5nZXRDbGFzc1ZhbHVlKHhqdGEsInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYnVpbGRlci5yZXBvcnRFcnJvcihuZXcgSWxsZWdhbEFubm90YXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuVU5NQVRDSEFCTEVfQURBUFRFUi5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXYoKS5nZXRUeXBlTmFtZShhZGFwdGVyKSwgbmF2KCkuZ2V0VHlwZU5hbWUodCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhqdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGFwdGVyID0gbmV3IEFkYXB0ZXI8VCxDPih4anRhLHJlYWRlcigpLG5hdigpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHRoaXMuaWQgPSBjYWxjSWQoKTsKICAgICB9CiAKIApAQCAtMTU5LDEzICsxOTQsMjEgQEAKICAgICAgICAgaWYoanRhPT1udWxsKSAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBUIHR5cGUgPSByZWFkZXIoKS5nZXRDbGFzc1ZhbHVlKGp0YSwidHlwZSIpOwotICAgICAgICByZXR1cm4gZGVjbGFyZWRUeXBlLmVxdWFscyh0eXBlKTsKKyAgICAgICAgaWYoZGVjbGFyZWRUeXBlLmVxdWFscyh0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAvLyBmb3IgdHlwZXMgZXhwbGljaXRseSBtYXJrZWQgaW4gWG1sSmF2YVR5cGVBZGFwdGVyLnR5cGUoKQogCisgICAgICAgIFQgYWRhcHRlciA9IHJlYWRlcigpLmdldENsYXNzVmFsdWUoanRhLCJ2YWx1ZSIpOworICAgICAgICBUIGJhID0gbmF2KCkuZ2V0QmFzZUNsYXNzKGFkYXB0ZXIsIG5hdigpLmFzRGVjbChYbWxBZGFwdGVyLmNsYXNzKSk7CisgICAgICAgIGlmKCFuYXYoKS5pc1BhcmFtZXRlcml6ZWRUeXBlKGJhKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgIC8vIGNhbid0IGNoZWNrIHR5cGUgYXBwbGljYWJpbGl0eS4gYXNzdW1lIE9iamVjdCwgd2hpY2ggbWVhbnMgYXBwbGljYWJsZSB0byBhbnkuCisgICAgICAgIFQgaW5NZW1UeXBlID0gbmF2KCkuZ2V0VHlwZUFyZ3VtZW50KGJhLCAxKTsKKworICAgICAgICByZXR1cm4gbmF2KCkuaXNTdWJDbGFzc09mKGRlY2xhcmVkVHlwZSxpbk1lbVR5cGUpOwogICAgIH0KIAogICAgIHByaXZhdGUgWG1sSmF2YVR5cGVBZGFwdGVyIGdldEFwcGxpY2FibGVBZGFwdGVyKFQgdHlwZSkgewogICAgICAgICBYbWxKYXZhVHlwZUFkYXB0ZXIganRhID0gc2VlZC5yZWFkQW5ub3RhdGlvbihYbWxKYXZhVHlwZUFkYXB0ZXIuY2xhc3MpOwotICAgICAgICBpZihqdGEhPW51bGwpCisgICAgICAgIGlmKGp0YSE9bnVsbCAmJiBpc0FwcGxpY2FibGUoanRhLHR5cGUpKQogICAgICAgICAgICAgcmV0dXJuIGp0YTsKIAogICAgICAgICAvLyBjaGVjayB0aGUgYXBwbGljYWJsZSBhZGFwdGVycyBvbiB0aGUgcGFja2FnZQpAQCAtMTgxLDEwICsyMjQsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBqdGE7CiAKICAgICAgICAgLy8gdGhlbiBvbiB0aGUgdGFyZ2V0IGNsYXNzCi0gICAgICAgIEMgcmVmVHlwZSA9IG5hdigpLmFzRGVjbChzZWVkLmdldFJhd1R5cGUoKSk7CisgICAgICAgIEMgcmVmVHlwZSA9IG5hdigpLmFzRGVjbCh0eXBlKTsKICAgICAgICAgaWYocmVmVHlwZSE9bnVsbCkgewogICAgICAgICAgICAganRhID0gcmVhZGVyKCkuZ2V0Q2xhc3NBbm5vdGF0aW9uKFhtbEphdmFUeXBlQWRhcHRlci5jbGFzcywgcmVmVHlwZSwgc2VlZCApOwotICAgICAgICAgICAgaWYoanRhIT1udWxsKSAvLyB0aGUgb25lIG9uIHRoZSB0eXBlIGFsd2F5cyBhcHBseS4KKyAgICAgICAgICAgIGlmKGp0YSE9bnVsbCAmJiBpc0FwcGxpY2FibGUoanRhLHR5cGUpKSAvLyB0aGUgb25lIG9uIHRoZSB0eXBlIGFsd2F5cyBhcHBseS4KICAgICAgICAgICAgICAgICByZXR1cm4ganRhOwogICAgICAgICB9CiAKQEAgLTIxMSw3ICsyNTQsNyBAQAogICAgIHByaXZhdGUgSUQgY2FsY0lkKCkgewogICAgICAgICBpZihzZWVkLmhhc0Fubm90YXRpb24oWG1sSUQuY2xhc3MpKSB7CiAgICAgICAgICAgICAvLyBjaGVjayB0aGUgdHlwZQotICAgICAgICAgICAgaWYoIXNlZWQuZ2V0UmF3VHlwZSgpLmVxdWFscyhuYXYoKS5yZWYoU3RyaW5nLmNsYXNzKSkpCisgICAgICAgICAgICBpZighZ2V0SW5kaXZpZHVhbFR5cGUoKS5lcXVhbHMobmF2KCkucmVmKFN0cmluZy5jbGFzcykpKQogICAgICAgICAgICAgICAgIHBhcmVudC5idWlsZGVyLnJlcG9ydEVycm9yKG5ldyBJbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuSURfTVVTVF9CRV9TVFJJTkcuZm9ybWF0KGdldE5hbWUoKSksIHNlZWQgKQogICAgICAgICAgICAgICAgICk7CkBAIC0zMzEsNCArMzc0LDEyIEBACiAgICAgcHVibGljIGludCBjb21wYXJlVG8oUHJvcGVydHlJbmZvSW1wbCB0aGF0KSB7CiAgICAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoKS5jb21wYXJlVG8odGhhdC5nZXROYW1lKCkpOwogICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCA8QSBleHRlbmRzIEFubm90YXRpb24+IEEgcmVhZEFubm90YXRpb24oQ2xhc3M8QT4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHNlZWQucmVhZEFubm90YXRpb24oYW5ub3RhdGlvblR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0Fubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKSB7CisgICAgICAgIHJldHVybiBzZWVkLmhhc0Fubm90YXRpb24oYW5ub3RhdGlvblR5cGUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9Qcm9wZXJ0eVNlZWQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9Qcm9wZXJ0eVNlZWQuamF2YQppbmRleCA5YzE5MGEzLi40MjJlN2U2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUHJvcGVydHlTZWVkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1Byb3BlcnR5U2VlZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb24uTG9jYXRhYmxlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1JlZmVyZW5jZVByb3BlcnR5SW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SZWZlcmVuY2VQcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggN2U5NWNlMS4uZDQ1Y2M1YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1JlZmVyZW5jZVByb3BlcnR5SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUmVmZXJlbmNlUHJvcGVydHlJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0zNCw2ICszMyw4IEBACiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZnM7CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaXhlZDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE5zRm9ybTsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25SZWFkZXI7CkBAIC0xODUsOCArMTg2LDE1IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBnZXRFZmZlY3RpdmVOYW1lc3BhY2VGb3IoWG1sRWxlbWVudFJlZiByKSB7CiAgICAgICAgIFN0cmluZyBuc1VyaSA9IHIubmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmKG5zVXJpLmxlbmd0aCgpPT0wKQotICAgICAgICAgICAgbnNVcmkgPSBwYXJlbnQuYnVpbGRlci5kZWZhdWx0TnNVcmk7CisKKyAgICAgICAgWG1sU2NoZW1hIHhzID0gcmVhZGVyKCkuZ2V0UGFja2FnZUFubm90YXRpb24oIFhtbFNjaGVtYS5jbGFzcywgcGFyZW50LmdldENsYXp6KCksIHRoaXMgKTsKKyAgICAgICAgaWYoeHMhPW51bGwgJiYgeHMuYXR0cmlidXRlRm9ybURlZmF1bHQoKT09IFhtbE5zRm9ybS5RVUFMSUZJRUQpIHsKKyAgICAgICAgICAgIC8vIEpBWC1SUEMgZG9lc24ndCB3YW50IHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBVUkkgc3dhcHBpbmcgdG8gdGFrZSBlZmZlY3QgdG8KKyAgICAgICAgICAgIC8vIGxvY2FsICJ1bnF1YWxpZmllZCIgZWxlbWVudHMuIFVHTFkuCisgICAgICAgICAgICBpZihuc1VyaS5sZW5ndGgoKT09MCkKKyAgICAgICAgICAgICAgICBuc1VyaSA9IHBhcmVudC5idWlsZGVyLmRlZmF1bHROc1VyaTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBuc1VyaTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SZWdpc3RyeUluZm9JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUmVnaXN0cnlJbmZvSW1wbC5qYXZhCmluZGV4IGVlYmM2NTQuLjE1MjhkMjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SZWdpc3RyeUluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1JlZ2lzdHJ5SW5mb0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUFueVR5cGVJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUFueVR5cGVJbXBsLmphdmEKaW5kZXggMDZlNTIxNC4uYzg0ZmM4ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVBbnlUeXBlSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lQW55VHlwZUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lQXJyYXlJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVBcnJheUluZm9JbXBsLmphdmEKaW5kZXggMjczMWFmYS4uMTMyMzJlYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVBcnJheUluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVBcnJheUluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVBdHRyaWJ1dGVQcm9wZXJ0eUluZm9JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUF0dHJpYnV0ZVByb3BlcnR5SW5mb0ltcGwuamF2YQppbmRleCBhNGUzYmQxLi4yNzI3NTlhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUF0dHJpYnV0ZVByb3BlcnR5SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUF0dHJpYnV0ZVByb3BlcnR5SW5mb0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUJ1aWx0aW5MZWFmSW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lQnVpbHRpbkxlYWZJbmZvSW1wbC5qYXZhCmluZGV4IDcxOWFlMTMuLjNiOGUxZGIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lQnVpbHRpbkxlYWZJbmZvSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lQnVpbHRpbkxlYWZJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmF3dC4qOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVDbGFzc0luZm9JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUNsYXNzSW5mb0ltcGwuamF2YQppbmRleCA5M2RhYzYzLi5mY2UzMjdhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUNsYXNzSW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUNsYXNzSW5mb0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTM0LDggKzMzLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CiAKIGltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYW5ub3RhdGlvbi5YbWxMb2NhdGlvbjsKQEAgLTUxLDkgKzUyLDE0IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLk5hbWU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLlRyYW5zZHVjZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLlhNTFNlcmlhbGl6ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkpBWEJDb250ZXh0SW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkFjY2Vzc29yRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkFjY2Vzc29yRmFjdG9yeUltcGw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuVHJhbnNkdWNlZEFjY2Vzc29yOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuVW5tYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5YbWxBY2Nlc3NvckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLklsbGVnYWxBbm5vdGF0aW9uRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC03MiwxMCArNzgsNTMgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEFjY2Vzc29yPD8sTG9jYXRvcj4geG1sTG9jYXRpb25BY2Nlc3NvcjsKIAorICAgIHByaXZhdGUgQWNjZXNzb3JGYWN0b3J5IGFjY2Vzc29yRmFjdG9yeTsKKwogICAgIHB1YmxpYyBSdW50aW1lQ2xhc3NJbmZvSW1wbChSdW50aW1lTW9kZWxCdWlsZGVyIG1vZGVsQnVpbGRlciwgTG9jYXRhYmxlIHVwc3RyZWFtLCBDbGFzcyBjbGF6eikgewogICAgICAgICBzdXBlcihtb2RlbEJ1aWxkZXIsIHVwc3RyZWFtLCBjbGF6eik7CisgICAgICAgIGFjY2Vzc29yRmFjdG9yeSA9IGNyZWF0ZUFjY2Vzc29yRmFjdG9yeShjbGF6eik7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIEFjY2Vzc29yRmFjdG9yeSBjcmVhdGVBY2Nlc3NvckZhY3RvcnkoQ2xhc3MgY2xhenopIHsKKyAgICAgICAgWG1sQWNjZXNzb3JGYWN0b3J5IGZhY3RvcnlBbm47CisgICAgICAgIEFjY2Vzc29yRmFjdG9yeSBhY2NGYWN0b3J5ID0gbnVsbDsKKworICAgICAgICAvLyB1c2VyIHByb3ZpZGluZyBjbGFzcyB0byBiZSB1c2VkLgorICAgICAgICBpZiAoKChSdW50aW1lTW9kZWxCdWlsZGVyKWJ1aWxkZXIpLmNvbnRleHQueG1sQWNjZXNzb3JGYWN0b3J5U3VwcG9ydCl7CisgICAgICAgICAgICBmYWN0b3J5QW5uID0gZmluZFhtbEFjY2Vzc29yRmFjdG9yeUFubm90YXRpb24oY2xhenopOworCisgICAgICAgICAgICBpZiAoZmFjdG9yeUFubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYWNjRmFjdG9yeSA9IGZhY3RvcnlBbm4udmFsdWUoKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnJlcG9ydEVycm9yKG5ldyBJbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5BQ0NFU1NPUkZBQ1RPUllfSU5TVEFOVElBVElPTl9FWENFUFRJT04uZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlBbm4uZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG5hdigpLmdldENsYXNzTmFtZShjbGF6eikpLCB0aGlzKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIucmVwb3J0RXJyb3IobmV3IElsbGVnYWxBbm5vdGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkFDQ0VTU09SRkFDVE9SWV9BQ0NFU1NfRVhDRVBUSU9OLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5QW5uLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBuYXYoKS5nZXRDbGFzc05hbWUoY2xhenopKSx0aGlzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGxvY2FsIEFjY2Vzc29yRmFjdG9yeSB3aGVuIG5vCisgICAgICAgIC8vIHVzZXIgbm90IHByb3ZpZGluZyBvbmUgb3IgYXMgZXJyb3IgcmVjb3ZlcnkuCisgICAgICAgIGlmIChhY2NGYWN0b3J5ID09IG51bGwpeworICAgICAgICAgICAgYWNjRmFjdG9yeSA9IEFjY2Vzc29yRmFjdG9yeUltcGwuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWNjRmFjdG9yeTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgWG1sQWNjZXNzb3JGYWN0b3J5IGZpbmRYbWxBY2Nlc3NvckZhY3RvcnlBbm5vdGF0aW9uKENsYXNzIGNsYXp6KSB7CisgICAgICAgIFhtbEFjY2Vzc29yRmFjdG9yeSBmYWN0b3J5QW5uID0gcmVhZGVyKCkuZ2V0Q2xhc3NBbm5vdGF0aW9uKFhtbEFjY2Vzc29yRmFjdG9yeS5jbGFzcyxjbGF6eix0aGlzKTsKKyAgICAgICAgaWYgKGZhY3RvcnlBbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgZmFjdG9yeUFubiA9IHJlYWRlcigpLmdldFBhY2thZ2VBbm5vdGF0aW9uKFhtbEFjY2Vzc29yRmFjdG9yeS5jbGFzcyxjbGF6eix0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFjdG9yeUFubjsKKyAgICB9CisKKwogICAgIHB1YmxpYyBNZXRob2QgZ2V0RmFjdG9yeU1ldGhvZCgpewogICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RmFjdG9yeU1ldGhvZCgpOwogICAgIH0KQEAgLTEyMiw4ICsxNzEsOCBAQAogCiAKICAgICBwdWJsaWMgdm9pZCBsaW5rKCkgewotICAgICAgICBzdXBlci5saW5rKCk7CiAgICAgICAgIGdldFRyYW5zZHVjZXIoKTsgICAgLy8gcG9wdWxhdGUgdGhlIHRyYW5zZHVjZXIKKyAgICAgICAgc3VwZXIubGluaygpOwogICAgIH0KIAogICAgIHByaXZhdGUgQWNjZXNzb3I8PyxNYXA8UU5hbWUsU3RyaW5nPj4gYXR0cmlidXRlV2lsZGNhcmRBY2Nlc3NvcjsKQEAgLTE3MSw3ICsyMjAsOCBAQAogICAgICAgICBpZiggIXZhbHVlcC5nZXRUYXJnZXQoKS5pc1NpbXBsZVR5cGUoKSApCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgLy8gaWYgdGhlcmUncyBhbiBlcnJvciwgcmVjb3ZlciBmcm9tIGl0IGJ5IHJldHVybmluZyBudWxsLgogCi0gICAgICAgIHJldHVybiBuZXcgVHJhbnNkdWNlckltcGwoZ2V0Q2xhenooKSxUcmFuc2R1Y2VkQWNjZXNzb3IuZ2V0KHZhbHVlcCkpOworICAgICAgICByZXR1cm4gbmV3IFRyYW5zZHVjZXJJbXBsKGdldENsYXp6KCksVHJhbnNkdWNlZEFjY2Vzc29yLmdldCgKKyAgICAgICAgICAgICAgICAoKFJ1bnRpbWVNb2RlbEJ1aWxkZXIpYnVpbGRlcikuY29udGV4dCx2YWx1ZXApKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4NCwyOSArMjM0LDMyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgUnVudGltZVByb3BlcnR5U2VlZCBjcmVhdGVGaWVsZFNlZWQoRmllbGQgZmllbGQpIHsKLSAgICAgICAgQWNjZXNzb3IuRmllbGRSZWZsZWN0aW9uIGFjYzsKLSAgICAgICAgaWYoTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKQotICAgICAgICAgICAgYWNjID0gbmV3IEFjY2Vzc29yLlJlYWRPbmx5RmllbGRSZWZsZWN0aW9uKGZpZWxkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWNjID0gbmV3IEFjY2Vzc29yLkZpZWxkUmVmbGVjdGlvbihmaWVsZCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBSdW50aW1lUHJvcGVydHlTZWVkKAotICAgICAgICAgICAgc3VwZXIuY3JlYXRlRmllbGRTZWVkKGZpZWxkKSwKLSAgICAgICAgICAgICAgICBhY2MgKTsKKyAgICAgICBmaW5hbCBib29sZWFuIHJlYWRPbmx5ID0gTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICBBY2Nlc3NvciBhY2M7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY2MgPSBhY2Nlc3NvckZhY3RvcnkuY3JlYXRlRmllbGRBY2Nlc3NvcihjbGF6eiwgZmllbGQsIHJlYWRPbmx5KTsKKyAgICAgICAgfSBjYXRjaChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucmVwb3J0RXJyb3IobmV3IElsbGVnYWxBbm5vdGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5DVVNUT01fQUNDRVNTT1JGQUNUT1JZX0ZJRUxEX0VSUk9SLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgbmF2KCkuZ2V0Q2xhc3NOYW1lKGNsYXp6KSwgZS50b1N0cmluZygpKSwgdGhpcyApKTsKKyAgICAgICAgICAgIGFjYyA9IEFjY2Vzc29yLmdldEVycm9ySW5zdGFuY2UoKTsgLy8gZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFJ1bnRpbWVQcm9wZXJ0eVNlZWQoc3VwZXIuY3JlYXRlRmllbGRTZWVkKGZpZWxkKSwgYWNjICk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJ1bnRpbWVQcm9wZXJ0eVNlZWQgY3JlYXRlQWNjZXNzb3JTZWVkKE1ldGhvZCBnZXR0ZXIsIE1ldGhvZCBzZXR0ZXIpIHsKICAgICAgICAgQWNjZXNzb3IgYWNjOwotICAgICAgICBpZihnZXR0ZXI9PW51bGwpCi0gICAgICAgICAgICBhY2MgPSBuZXcgQWNjZXNzb3IuU2V0dGVyT25seVJlZmxlY3Rpb24oc2V0dGVyKTsKLSAgICAgICAgZWxzZQotICAgICAgICBpZihzZXR0ZXI9PW51bGwpCi0gICAgICAgICAgICBhY2MgPSBuZXcgQWNjZXNzb3IuR2V0dGVyT25seVJlZmxlY3Rpb24oZ2V0dGVyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWNjID0gbmV3IEFjY2Vzc29yLkdldHRlclNldHRlclJlZmxlY3Rpb24oZ2V0dGVyLCBzZXR0ZXIpOwotCi0gICAgICAgIHJldHVybiBuZXcgUnVudGltZVByb3BlcnR5U2VlZCggc3VwZXIuY3JlYXRlQWNjZXNzb3JTZWVkKGdldHRlcixzZXR0ZXIpLCBhY2MgKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjYyA9IGFjY2Vzc29yRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKGNsYXp6LCBnZXR0ZXIsIHNldHRlcik7CisgICAgICAgIH0gY2F0Y2goSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBidWlsZGVyLnJlcG9ydEVycm9yKG5ldyBJbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBNZXNzYWdlcy5DVVNUT01fQUNDRVNTT1JGQUNUT1JZX1BST1BFUlRZX0VSUk9SLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBuYXYoKS5nZXRDbGFzc05hbWUoY2xhenopLCBlLnRvU3RyaW5nKCkpLCB0aGlzICkpOworICAgICAgICAgICAgYWNjID0gQWNjZXNzb3IuZ2V0RXJyb3JJbnN0YW5jZSgpOyAvLyBlcnJvciByZWNvdmVyeQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUnVudGltZVByb3BlcnR5U2VlZCggc3VwZXIuY3JlYXRlQWNjZXNzb3JTZWVkKGdldHRlcixzZXR0ZXIpLAorICAgICAgICAgIGFjYyApOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVFbGVtZW50SW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lRWxlbWVudEluZm9JbXBsLmphdmEKaW5kZXggN2JmNTM5Ny4uZjg4NDBiZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVFbGVtZW50SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUVsZW1lbnRJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKQEAgLTQyLDYgKzQxLDcgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLnJ1bnRpbWUuUnVudGltZU5vbkVsZW1lbnQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lLlJ1bnRpbWVQcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lLlJ1bnRpbWVUeXBlUmVmOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwubmF2Lk5hdmlnYXRvcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuSWxsZWdhbEFubm90YXRpb25FeGNlcHRpb247CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLlRyYW5zZHVjZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEpBWEJFbGVtZW50PiBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gSkFYQkVsZW1lbnQuY2xhc3M7CisgICAgICAgIHJldHVybiBOYXZpZ2F0b3IuUkVGTEVDVElPTi5lcmFzdXJlKHN1cGVyLmdldFR5cGUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIFJ1bnRpbWVDbGFzc0luZm8gZ2V0U2NvcGUoKSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUVsZW1lbnRQcm9wZXJ0eUluZm9JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUVsZW1lbnRQcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggMjRlZGMzMi4uOTliMDdlNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVFbGVtZW50UHJvcGVydHlJbmZvSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lRWxlbWVudFByb3BlcnR5SW5mb0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZUVudW1Db25zdGFudEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lRW51bUNvbnN0YW50SW1wbC5qYXZhCmluZGV4IGE0ZWI4MzEuLjllN2RkNjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lRW51bUNvbnN0YW50SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lRW51bUNvbnN0YW50SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lRW51bUxlYWZJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVFbnVtTGVhZkluZm9JbXBsLmphdmEKaW5kZXggOTJmYWQ1NS4uZWRmMWRmYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVFbnVtTGVhZkluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVFbnVtTGVhZkluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZU1hcFByb3BlcnR5SW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lTWFwUHJvcGVydHlJbmZvSW1wbC5qYXZhCmluZGV4IDI0NWU3M2QuLmYyNzJhMjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lTWFwUHJvcGVydHlJbmZvSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lTWFwUHJvcGVydHlJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lTW9kZWxCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZU1vZGVsQnVpbGRlci5qYXZhCmluZGV4IDg0NTU3NDguLjA2YjI1YTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lTW9kZWxCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVNb2RlbEJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwxMiArMjIsMTIgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5NaW1lVHlwZTsKIApAQCAtNDgsNiArNDgsNyBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5NaW1lVHlwZWRUcmFuc2R1Y2VyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5TY2hlbWFUeXBlVHJhbnNkdWNlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuVHJhbnNkdWNlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuSkFYQkNvbnRleHRJbXBsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuVW5tYXJzaGFsbGluZ0NvbnRleHQ7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC02Myw5ICs2NCwxNCBAQAogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaSAoa2tAa29oc3VrZS5vcmcpCiAgKi8KIHB1YmxpYyBjbGFzcyBSdW50aW1lTW9kZWxCdWlsZGVyIGV4dGVuZHMgTW9kZWxCdWlsZGVyPFR5cGUsQ2xhc3MsRmllbGQsTWV0aG9kPiB7CisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBKQVhCQ29udGV4dEltcGx9IGZvciB3aGljaCB0aGUgbW9kZWwgaXMgYnVpbHQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEpBWEJDb250ZXh0SW1wbCBjb250ZXh0OwogCi0gICAgcHVibGljIFJ1bnRpbWVNb2RlbEJ1aWxkZXIoUnVudGltZUFubm90YXRpb25SZWFkZXIgYW5ub3RhdGlvblJlYWRlciwgU3RyaW5nIGRlZmF1bHROYW1lc3BhY2VSZW1hcCkgewotICAgICAgICBzdXBlcihhbm5vdGF0aW9uUmVhZGVyLCBOYXZpZ2F0b3IuUkVGTEVDVElPTiwgZGVmYXVsdE5hbWVzcGFjZVJlbWFwKTsKKyAgICBwdWJsaWMgUnVudGltZU1vZGVsQnVpbGRlcihKQVhCQ29udGV4dEltcGwgY29udGV4dCwgUnVudGltZUFubm90YXRpb25SZWFkZXIgYW5ub3RhdGlvblJlYWRlciwgTWFwPENsYXNzLCBDbGFzcz4gc3ViY2xhc3NSZXBsYWNlbWVudHMsIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlUmVtYXApIHsKKyAgICAgICAgc3VwZXIoYW5ub3RhdGlvblJlYWRlciwgTmF2aWdhdG9yLlJFRkxFQ1RJT04sIHN1YmNsYXNzUmVwbGFjZW1lbnRzLCBkZWZhdWx0TmFtZXNwYWNlUmVtYXApOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNzQsNiArODAsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUnVudGltZU5vbkVsZW1lbnQgZ2V0Q2xhc3NJbmZvKCBDbGFzcyBjbGF6eiwgYm9vbGVhbiBzZWFyY2hGb3JTdXBlckNsYXNzLCBMb2NhdGFibGUgdXBzdHJlYW0gKSB7CisgICAgICAgIHJldHVybiAoUnVudGltZU5vbkVsZW1lbnQpc3VwZXIuZ2V0Q2xhc3NJbmZvKGNsYXp6LHNlYXJjaEZvclN1cGVyQ2xhc3MsdXBzdHJlYW0pOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBSdW50aW1lRW51bUxlYWZJbmZvSW1wbCBjcmVhdGVFbnVtTGVhZkluZm8oQ2xhc3MgY2xhenosIExvY2F0YWJsZSB1cHN0cmVhbSkgewogICAgICAgICByZXR1cm4gbmV3IFJ1bnRpbWVFbnVtTGVhZkluZm9JbXBsKHRoaXMsdXBzdHJlYW0sY2xhenopOwogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lUmVmZXJlbmNlUHJvcGVydHlJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVSZWZlcmVuY2VQcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggZmRkOTBmMi4uYjk2YzQ2ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVSZWZlcmVuY2VQcm9wZXJ0eUluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVSZWZlcmVuY2VQcm9wZXJ0eUluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVUeXBlSW5mb1NldEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lVHlwZUluZm9TZXRJbXBsLmphdmEKaW5kZXggMjNlMjljYS4uNzA5ZDA0NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVUeXBlSW5mb1NldEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZVR5cGVJbmZvU2V0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lVHlwZVJlZkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lVHlwZVJlZkltcGwuamF2YQppbmRleCA0MzMxNmIyLi4yZGQ3NmM2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZVR5cGVSZWZJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVUeXBlUmVmSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVWYWx1ZVByb3BlcnR5SW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9SdW50aW1lVmFsdWVQcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggODhkOGFkMC4uZjQyOGViZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1J1bnRpbWVWYWx1ZVByb3BlcnR5SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvUnVudGltZVZhbHVlUHJvcGVydHlJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmltcGw7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9TaW5nbGVUeXBlUHJvcGVydHlJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1NpbmdsZVR5cGVQcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggMThmNWZkOS4uMjY3NjY5NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1NpbmdsZVR5cGVQcm9wZXJ0eUluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1NpbmdsZVR5cGVQcm9wZXJ0eUluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTYzLDcgKzYyLDcgQEAKICAgICAgICAgICAgIGlmKGdldEFkYXB0ZXIoKSE9bnVsbCAmJiAhaXNDb2xsZWN0aW9uKCkpCiAgICAgICAgICAgICAgICAgLy8gYWRhcHRlciBmb3IgYSBzaW5nbGUtdmFsdWUgcHJvcGVydHkgaXMgaGFuZGxlZCBieSBhY2Nlc3Nvci4KICAgICAgICAgICAgICAgICAvLyBhZGFwdGVyIGZvciBhIGNvbGxlY3Rpb24gcHJvcGVydHkgaXMgaGFuZGxlZCBieSBsaXN0ZXIuCi0gICAgICAgICAgICAgICAgcmF3QWNjID0gcmF3QWNjLmFkYXB0KGdldEFkYXB0ZXIoKSk7CisgICAgICAgICAgICAgICAgcmF3QWNjID0gcmF3QWNjLmFkYXB0KCgoUnVudGltZVByb3BlcnR5SW5mbyl0aGlzKS5nZXRBZGFwdGVyKCkpOwogICAgICAgICAgICAgdGhpcy5hY2MgPSByYXdBY2M7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgdGhpcy5hY2MgPSBudWxsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1R5cGVJbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1R5cGVJbmZvSW1wbC5qYXZhCmluZGV4IGQ5ZThkNDEuLjE3NjY1MDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9UeXBlSW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvVHlwZUluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvVHlwZUluZm9TZXRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvVHlwZUluZm9TZXRJbXBsLmphdmEKaW5kZXggZWY1ZmEwMS4uOWM5NjZhNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1R5cGVJbmZvU2V0SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9UeXBlSW5mb1NldEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNjcsMjggKzY2LDI3IEBACiAgKgogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQogICovCi1jbGFzcyBUeXBlSW5mb1NldEltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4gaW1wbGVtZW50cwotICAgICAgICBUeXBlSW5mb1NldDxUeXBlVCxDbGFzc0RlY2xULEZpZWxkVCxNZXRob2RUPiB7CitjbGFzcyBUeXBlSW5mb1NldEltcGw8VCxDLEYsTT4gaW1wbGVtZW50cyBUeXBlSW5mb1NldDxULEMsRixNPiB7CiAKICAgICBAWG1sVHJhbnNpZW50Ci0gICAgcHVibGljIGZpbmFsIE5hdmlnYXRvcjxUeXBlVCxDbGFzc0RlY2xULEZpZWxkVCxNZXRob2RUPiBuYXY7CisgICAgcHVibGljIGZpbmFsIE5hdmlnYXRvcjxULEMsRixNPiBuYXY7CiAKICAgICBAWG1sVHJhbnNpZW50Ci0gICAgcHVibGljIGZpbmFsIEFubm90YXRpb25SZWFkZXI8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4gcmVhZGVyOworICAgIHB1YmxpYyBmaW5hbCBBbm5vdGF0aW9uUmVhZGVyPFQsQyxGLE0+IHJlYWRlcjsKIAogICAgIC8qKgogICAgICAqIEFsbCB0aGUgbGVhdmVzLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPFR5cGVULEJ1aWx0aW5MZWFmSW5mbzxUeXBlVCxDbGFzc0RlY2xUPj4gYnVpbHRpbnMgPQotICAgICAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8VHlwZVQsQnVpbHRpbkxlYWZJbmZvPFR5cGVULENsYXNzRGVjbFQ+PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFQsQnVpbHRpbkxlYWZJbmZvPFQsQz4+IGJ1aWx0aW5zID0KKyAgICAgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFQsQnVpbHRpbkxlYWZJbmZvPFQsQz4+KCk7CiAKICAgICAvKiogQWxsIHtAbGluayBFbnVtTGVhZkluZm9JbXBsfXMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3NEZWNsVCxFbnVtTGVhZkluZm9JbXBsPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+PiBlbnVtcyA9Ci0gICAgICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxDbGFzc0RlY2xULEVudW1MZWFmSW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8QyxFbnVtTGVhZkluZm9JbXBsPFQsQyxGLE0+PiBlbnVtcyA9CisgICAgICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxDLEVudW1MZWFmSW5mb0ltcGw8VCxDLEYsTT4+KCk7CiAKICAgICAvKiogQWxsIHtAbGluayBBcnJheUluZm9JbXBsfXMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8VHlwZVQsQXJyYXlJbmZvSW1wbDxUeXBlVCxDbGFzc0RlY2xULEZpZWxkVCxNZXRob2RUPj4gYXJyYXlzID0KLSAgICAgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFR5cGVULEFycmF5SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VCxBcnJheUluZm9JbXBsPFQsQyxGLE0+PiBhcnJheXMgPQorICAgICAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8VCxBcnJheUluZm9JbXBsPFQsQyxGLE0+PigpOwogCiAgICAgLyoqCiAgICAgICogQWxsIHRoZSB1c2VyLWRlZmluZWQgY2xhc3Nlcy4KQEAgLTk5LDIzICs5NywyMyBAQAogICAgICAqIGFuIGVycm9yIHRvIGJlIHJlcG9ydGVkIG9uIGEgY2xhc3MgY2xvc2VyIHRvIHRoZSB1c2VyJ3MgY29kZS4KICAgICAgKi8KICAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKFJ1bnRpbWVVdGlsLlRvU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzc0RlY2xULENsYXNzSW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+IGJlYW5zCi0gICAgICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwPENsYXNzRGVjbFQsQ2xhc3NJbmZvSW1wbDxUeXBlVCxDbGFzc0RlY2xULEZpZWxkVCxNZXRob2RUPj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxDLENsYXNzSW5mb0ltcGw8VCxDLEYsTT4+IGJlYW5zCisgICAgICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwPEMsQ2xhc3NJbmZvSW1wbDxULEMsRixNPj4oKTsKIAogICAgIEBYbWxUcmFuc2llbnQKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzc0RlY2xULENsYXNzSW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+IGJlYW5zVmlldyA9CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8QyxDbGFzc0luZm9JbXBsPFQsQyxGLE0+PiBiZWFuc1ZpZXcgPQogICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoYmVhbnMpOwogCiAgICAgLyoqCiAgICAgICogVGhlIGVsZW1lbnQgbWFwcGluZy4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzc0RlY2xULE1hcDxRTmFtZSxFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+PiBlbGVtZW50TWFwcGluZ3MgPQotICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxDbGFzc0RlY2xULE1hcDxRTmFtZSxFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPEMsTWFwPFFOYW1lLEVsZW1lbnRJbmZvSW1wbDxULEMsRixNPj4+IGVsZW1lbnRNYXBwaW5ncyA9CisgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPEMsTWFwPFFOYW1lLEVsZW1lbnRJbmZvSW1wbDxULEMsRixNPj4+KCk7CiAKLSAgICBwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+IGFsbEVsZW1lbnRzID0KLSAgICAgICAgbmV3IEl0ZXJhYmxlPEVsZW1lbnRJbmZvSW1wbDxUeXBlVCxDbGFzc0RlY2xULEZpZWxkVCxNZXRob2RUPj4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8RWxlbWVudEluZm9JbXBsPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+PiBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsYXR0ZW5JdGVyYXRvcjxFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+KGVsZW1lbnRNYXBwaW5ncy52YWx1ZXMoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRWxlbWVudEluZm9JbXBsPFQsQyxGLE0+PiBhbGxFbGVtZW50cyA9CisgICAgICAgIG5ldyBJdGVyYWJsZTxFbGVtZW50SW5mb0ltcGw8VCxDLEYsTT4+KCkgeworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPEVsZW1lbnRJbmZvSW1wbDxULEMsRixNPj4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbGF0dGVuSXRlcmF0b3I8RWxlbWVudEluZm9JbXBsPFQsQyxGLE0+PihlbGVtZW50TWFwcGluZ3MudmFsdWVzKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogCkBAIC0xMjUsNyArMTIzLDcgQEAKICAgICAgKiBhbnlUeXBlIGlzIHRoZSBvbmx5IHtAbGluayBUeXBlSW5mb30gdGhhdCB3b3JrcyB3aXRoIGFuIGludGVyZmFjZSwKICAgICAgKiBhbmQgYWNjb3JkaW5nbHkgaXQgcmVxdWlyZXMgYSBsb3Qgb2Ygc3BlY2lhbCBjYXNpbmcuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBOb25FbGVtZW50PFR5cGVULENsYXNzRGVjbFQ+IGFueVR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBOb25FbGVtZW50PFQsQz4gYW55VHlwZTsKIAogICAgIC8qKgogICAgICAqIExhemlseSBwYXJzZWQgc2V0IG9mIHtAbGluayBYbWxOc31zLgpAQCAtMTM0LDkgKzEzMiw5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLE1hcDxTdHJpbmcsU3RyaW5nPj4geG1sTnNDYWNoZTsKIAotICAgIHB1YmxpYyBUeXBlSW5mb1NldEltcGwoTmF2aWdhdG9yPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+IG5hdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25SZWFkZXI8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4gcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFR5cGVULD8gZXh0ZW5kcyBCdWlsdGluTGVhZkluZm9JbXBsPFR5cGVULENsYXNzRGVjbFQ+PiBsZWF2ZXMpIHsKKyAgICBwdWJsaWMgVHlwZUluZm9TZXRJbXBsKE5hdmlnYXRvcjxULEMsRixNPiBuYXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uUmVhZGVyPFQsQyxGLE0+IHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxULD8gZXh0ZW5kcyBCdWlsdGluTGVhZkluZm9JbXBsPFQsQz4+IGxlYXZlcykgewogICAgICAgICB0aGlzLm5hdiA9IG5hdjsKICAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7CiAgICAgICAgIHRoaXMuYnVpbHRpbnMucHV0QWxsKGxlYXZlcyk7CkBAIC0xNDksMzIgKzE0NywzMiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gbWFrZSBzdXJlIGF0IGxlYXNlIHdlIGdvdCBhIG1hcCBmb3IgZ2xvYmFsIG9uZXMuCi0gICAgICAgIGVsZW1lbnRNYXBwaW5ncy5wdXQobnVsbCxuZXcgTGlua2VkSGFzaE1hcDxRTmFtZSxFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+KCkpOworICAgICAgICBlbGVtZW50TWFwcGluZ3MucHV0KG51bGwsbmV3IExpbmtlZEhhc2hNYXA8UU5hbWUsRWxlbWVudEluZm9JbXBsPFQsQyxGLE0+PigpKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgTm9uRWxlbWVudDxUeXBlVCxDbGFzc0RlY2xUPiBjcmVhdGVBbnlUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEFueVR5cGVJbXBsPFR5cGVULENsYXNzRGVjbFQ+KG5hdik7CisgICAgcHJvdGVjdGVkIE5vbkVsZW1lbnQ8VCxDPiBjcmVhdGVBbnlUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFueVR5cGVJbXBsPFQsQz4obmF2KTsKICAgICB9CiAKLSAgICBwdWJsaWMgTmF2aWdhdG9yPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+IGdldE5hdmlnYXRvcigpIHsKKyAgICBwdWJsaWMgTmF2aWdhdG9yPFQsQyxGLE0+IGdldE5hdmlnYXRvcigpIHsKICAgICAgICAgcmV0dXJuIG5hdjsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBBZGRzIGEgbmV3IHtAbGluayBDbGFzc0luZm99IHRvIHRoZSBzZXQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKCBDbGFzc0luZm9JbXBsPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+IGNpICkgeworICAgIHB1YmxpYyB2b2lkIGFkZCggQ2xhc3NJbmZvSW1wbDxULEMsRixNPiBjaSApIHsKICAgICAgICAgYmVhbnMucHV0KCBjaS5nZXRDbGF6eigpLCBjaSApOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEFkZHMgYSBuZXcge0BsaW5rIExlYWZJbmZvfSB0byB0aGUgc2V0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZCggRW51bUxlYWZJbmZvSW1wbDxUeXBlVCxDbGFzc0RlY2xULEZpZWxkVCxNZXRob2RUPiBsaSApIHsKKyAgICBwdWJsaWMgdm9pZCBhZGQoIEVudW1MZWFmSW5mb0ltcGw8VCxDLEYsTT4gbGkgKSB7CiAgICAgICAgIGVudW1zLnB1dCggbGkuY2xhenosICBsaSApOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZChBcnJheUluZm9JbXBsPFR5cGVULCBDbGFzc0RlY2xULCBGaWVsZFQsIE1ldGhvZFQ+IGFpKSB7CisgICAgcHVibGljIHZvaWQgYWRkKEFycmF5SW5mb0ltcGw8VCwgQywgRiwgTT4gYWkpIHsKICAgICAgICAgYXJyYXlzLnB1dCggYWkuZ2V0VHlwZSgpLCBhaSApOwogICAgIH0KIApAQCAtMTg1LDMyICsxODMsMzIgQEAKICAgICAgKiAgICAgIG51bGwgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGNhbm5vdCBiZSBib3VuZCBieSBKQVhCLCBvcgogICAgICAqICAgICAgbm90IGtub3duIHRvIHRoaXMgc2V0LgogICAgICAqLwotICAgIHB1YmxpYyBOb25FbGVtZW50PFR5cGVULENsYXNzRGVjbFQ+IGdldFR5cGVJbmZvKCBUeXBlVCB0eXBlICkgeworICAgIHB1YmxpYyBOb25FbGVtZW50PFQsQz4gZ2V0VHlwZUluZm8oIFQgdHlwZSApIHsKICAgICAgICAgdHlwZSA9IG5hdi5lcmFzdXJlKHR5cGUpOyAgIC8vIHJlcGxhY2UgdHlwZSB2YXJpYWJsZXMgYnkgdGhlaXIgYm91bmRzCiAKLSAgICAgICAgTGVhZkluZm88VHlwZVQsQ2xhc3NEZWNsVD4gbCA9IGJ1aWx0aW5zLmdldCh0eXBlKTsKKyAgICAgICAgTGVhZkluZm88VCxDPiBsID0gYnVpbHRpbnMuZ2V0KHR5cGUpOwogICAgICAgICBpZihsIT1udWxsKSAgICAgcmV0dXJuIGw7CiAKICAgICAgICAgaWYoIG5hdi5pc0FycmF5KHR5cGUpICkgewogICAgICAgICAgICAgcmV0dXJuIGFycmF5cy5nZXQodHlwZSk7CiAgICAgICAgIH0KIAotICAgICAgICBDbGFzc0RlY2xUIGQgPSBuYXYuYXNEZWNsKHR5cGUpOworICAgICAgICBDIGQgPSBuYXYuYXNEZWNsKHR5cGUpOwogICAgICAgICBpZihkPT1udWxsKSAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIHJldHVybiBnZXRDbGFzc0luZm8oZCk7CiAgICAgfQogCi0gICAgcHVibGljIE5vbkVsZW1lbnQ8VHlwZVQsQ2xhc3NEZWNsVD4gZ2V0QW55VHlwZUluZm8oKSB7CisgICAgcHVibGljIE5vbkVsZW1lbnQ8VCxDPiBnZXRBbnlUeXBlSW5mbygpIHsKICAgICAgICAgcmV0dXJuIGFueVR5cGU7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhZGQgYSByb290IHJlZmVyZW5jZSB0byBhIG1vZGVsLgogICAgICAqLwotICAgIHB1YmxpYyBOb25FbGVtZW50PFR5cGVULENsYXNzRGVjbFQ+IGdldFR5cGVJbmZvKFJlZjxUeXBlVCxDbGFzc0RlY2xUPiByZWYpIHsKKyAgICBwdWJsaWMgTm9uRWxlbWVudDxULEM+IGdldFR5cGVJbmZvKFJlZjxULEM+IHJlZikgewogICAgICAgICAvLyBUT0RPOiBoYW5kbGUgWG1sVmFsdWVMaXN0CiAgICAgICAgIGFzc2VydCAhcmVmLnZhbHVlTGlzdDsKLSAgICAgICAgQ2xhc3NEZWNsVCBjID0gbmF2LmFzRGVjbChyZWYudHlwZSk7CisgICAgICAgIEMgYyA9IG5hdi5hc0RlY2wocmVmLnR5cGUpOwogICAgICAgICBpZihjIT1udWxsICYmIHJlYWRlci5nZXRDbGFzc0Fubm90YXRpb24oWG1sUmVnaXN0cnkuY2xhc3MsYyxudWxsLypUT0RPOiBpcyB0aGlzIHJpZ2h0PyovKSE9bnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIC8vIFRPRE86IGlzIHRoaXMgY29ycmVjdD8KICAgICAgICAgfSBlbHNlCkBAIC0yMjAsMTkgKzIxOCwxOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYWxsIHRoZSB7QGxpbmsgQ2xhc3NJbmZvfXMga25vd24gdG8gdGhpcyBzZXQuCiAgICAgICovCi0gICAgcHVibGljIE1hcDxDbGFzc0RlY2xULD8gZXh0ZW5kcyBDbGFzc0luZm9JbXBsPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+PiBiZWFucygpIHsKKyAgICBwdWJsaWMgTWFwPEMsPyBleHRlbmRzIENsYXNzSW5mb0ltcGw8VCxDLEYsTT4+IGJlYW5zKCkgewogICAgICAgICByZXR1cm4gYmVhbnNWaWV3OwogICAgIH0KIAotICAgIHB1YmxpYyBNYXA8VHlwZVQsID8gZXh0ZW5kcyBCdWlsdGluTGVhZkluZm88VHlwZVQsQ2xhc3NEZWNsVD4+IGJ1aWx0aW5zKCkgeworICAgIHB1YmxpYyBNYXA8VCwgPyBleHRlbmRzIEJ1aWx0aW5MZWFmSW5mbzxULEM+PiBidWlsdGlucygpIHsKICAgICAgICAgcmV0dXJuIGJ1aWx0aW5zOwogICAgIH0KIAotICAgIHB1YmxpYyBNYXA8Q2xhc3NEZWNsVCwgPyBleHRlbmRzIEVudW1MZWFmSW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+IGVudW1zKCkgeworICAgIHB1YmxpYyBNYXA8QywgPyBleHRlbmRzIEVudW1MZWFmSW5mb0ltcGw8VCxDLEYsTT4+IGVudW1zKCkgewogICAgICAgICByZXR1cm4gZW51bXM7CiAgICAgfQogCi0gICAgcHVibGljIE1hcDw/IGV4dGVuZHMgVHlwZVQsID8gZXh0ZW5kcyBBcnJheUluZm9JbXBsPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+PiBhcnJheXMoKSB7CisgICAgcHVibGljIE1hcDw/IGV4dGVuZHMgVCwgPyBleHRlbmRzIEFycmF5SW5mb0ltcGw8VCxDLEYsTT4+IGFycmF5cygpIHsKICAgICAgICAgcmV0dXJuIGFycmF5czsKICAgICB9CiAKQEAgLTI0Nyw4ICsyNDUsOCBAQAogICAgICAqICAgICAgbnVsbCBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgbm90IGJvdW5kIGJ5IEpBWEIgb3Igb3RoZXJ3aXNlCiAgICAgICogICAgICB1bmtub3duIHRvIHRoaXMgc2V0LgogICAgICAqLwotICAgIHB1YmxpYyBOb25FbGVtZW50PFR5cGVULENsYXNzRGVjbFQ+IGdldENsYXNzSW5mbyggQ2xhc3NEZWNsVCB0eXBlICkgewotICAgICAgICBMZWFmSW5mbzxUeXBlVCxDbGFzc0RlY2xUPiBsID0gYnVpbHRpbnMuZ2V0KG5hdi51c2UodHlwZSkpOworICAgIHB1YmxpYyBOb25FbGVtZW50PFQsQz4gZ2V0Q2xhc3NJbmZvKCBDIHR5cGUgKSB7CisgICAgICAgIExlYWZJbmZvPFQsQz4gbCA9IGJ1aWx0aW5zLmdldChuYXYudXNlKHR5cGUpKTsKICAgICAgICAgaWYobCE9bnVsbCkgICAgIHJldHVybiBsOwogCiAgICAgICAgIGwgPSBlbnVtcy5nZXQodHlwZSk7CkBAIC0yNjAsMTEgKzI1OCwxMSBAQAogICAgICAgICByZXR1cm4gYmVhbnMuZ2V0KHR5cGUpOwogICAgIH0KIAotICAgIHB1YmxpYyBFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4gZ2V0RWxlbWVudEluZm8oIENsYXNzRGVjbFQgc2NvcGUsIFFOYW1lIG5hbWUgKSB7CisgICAgcHVibGljIEVsZW1lbnRJbmZvSW1wbDxULEMsRixNPiBnZXRFbGVtZW50SW5mbyggQyBzY29wZSwgUU5hbWUgbmFtZSApIHsKICAgICAgICAgd2hpbGUoc2NvcGUhPW51bGwpIHsKLSAgICAgICAgICAgIE1hcDxRTmFtZSxFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+IG0gPSBlbGVtZW50TWFwcGluZ3MuZ2V0KHNjb3BlKTsKKyAgICAgICAgICAgIE1hcDxRTmFtZSxFbGVtZW50SW5mb0ltcGw8VCxDLEYsTT4+IG0gPSBlbGVtZW50TWFwcGluZ3MuZ2V0KHNjb3BlKTsKICAgICAgICAgICAgIGlmKG0hPW51bGwpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4gciA9IG0uZ2V0KG5hbWUpOworICAgICAgICAgICAgICAgIEVsZW1lbnRJbmZvSW1wbDxULEMsRixNPiByID0gbS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgICAgaWYociE9bnVsbCkgICAgIHJldHVybiByOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2NvcGUgPSBuYXYuZ2V0U3VwZXJDbGFzcyhzY29wZSk7CkBAIC0yNzYsMTYgKzI3NCwxNiBAQAogICAgICAqIEBwYXJhbSBidWlsZGVyCiAgICAgICogICAgICB1c2VkIGZvciByZXBvcnRpbmcgZXJyb3JzLgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZCggRWxlbWVudEluZm9JbXBsPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+IGVpLCBNb2RlbEJ1aWxkZXI8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4gYnVpbGRlciApIHsKLSAgICAgICAgQ2xhc3NEZWNsVCBzY29wZSA9IG51bGw7CisgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKCBFbGVtZW50SW5mb0ltcGw8VCxDLEYsTT4gZWksIE1vZGVsQnVpbGRlcjxULEMsRixNPiBidWlsZGVyICkgeworICAgICAgICBDIHNjb3BlID0gbnVsbDsKICAgICAgICAgaWYoZWkuZ2V0U2NvcGUoKSE9bnVsbCkKICAgICAgICAgICAgIHNjb3BlID0gZWkuZ2V0U2NvcGUoKS5nZXRDbGF6eigpOwogCi0gICAgICAgIE1hcDxRTmFtZSxFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+IG0gPSBlbGVtZW50TWFwcGluZ3MuZ2V0KHNjb3BlKTsKKyAgICAgICAgTWFwPFFOYW1lLEVsZW1lbnRJbmZvSW1wbDxULEMsRixNPj4gbSA9IGVsZW1lbnRNYXBwaW5ncy5nZXQoc2NvcGUpOwogICAgICAgICBpZihtPT1udWxsKQotICAgICAgICAgICAgZWxlbWVudE1hcHBpbmdzLnB1dChzY29wZSxtPW5ldyBMaW5rZWRIYXNoTWFwPFFOYW1lLEVsZW1lbnRJbmZvSW1wbDxUeXBlVCxDbGFzc0RlY2xULEZpZWxkVCxNZXRob2RUPj4oKSk7CisgICAgICAgICAgICBlbGVtZW50TWFwcGluZ3MucHV0KHNjb3BlLG09bmV3IExpbmtlZEhhc2hNYXA8UU5hbWUsRWxlbWVudEluZm9JbXBsPFQsQyxGLE0+PigpKTsKIAotICAgICAgICBFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4gZXhpc3RpbmcgPSBtLnB1dChlaS5nZXRFbGVtZW50TmFtZSgpLGVpKTsKKyAgICAgICAgRWxlbWVudEluZm9JbXBsPFQsQyxGLE0+IGV4aXN0aW5nID0gbS5wdXQoZWkuZ2V0RWxlbWVudE5hbWUoKSxlaSk7CiAKICAgICAgICAgaWYoZXhpc3RpbmchPW51bGwpIHsKICAgICAgICAgICAgIFFOYW1lIGVuID0gZWkuZ2V0RWxlbWVudE5hbWUoKTsKQEAgLTI5NiwxMSArMjk0LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgTWFwPFFOYW1lLD8gZXh0ZW5kcyBFbGVtZW50SW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4+IGdldEVsZW1lbnRNYXBwaW5ncyggQ2xhc3NEZWNsVCBzY29wZSApIHsKKyAgICBwdWJsaWMgTWFwPFFOYW1lLD8gZXh0ZW5kcyBFbGVtZW50SW5mb0ltcGw8VCxDLEYsTT4+IGdldEVsZW1lbnRNYXBwaW5ncyggQyBzY29wZSApIHsKICAgICAgICAgcmV0dXJuIGVsZW1lbnRNYXBwaW5ncy5nZXQoc2NvcGUpOwogICAgIH0KIAotICAgIHB1YmxpYyBJdGVyYWJsZTw/IGV4dGVuZHMgRWxlbWVudEluZm9JbXBsPFR5cGVULENsYXNzRGVjbFQsRmllbGRULE1ldGhvZFQ+PiBnZXRBbGxFbGVtZW50cygpIHsKKyAgICBwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIEVsZW1lbnRJbmZvSW1wbDxULEMsRixNPj4gZ2V0QWxsRWxlbWVudHMoKSB7CiAgICAgICAgIHJldHVybiBhbGxFbGVtZW50czsKICAgICB9CiAKQEAgLTMwOCw3ICszMDYsNyBAQAogICAgICAgICBpZih4bWxOc0NhY2hlPT1udWxsKSB7CiAgICAgICAgICAgICB4bWxOc0NhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsU3RyaW5nPj4oKTsKIAotICAgICAgICAgICAgZm9yIChDbGFzc0luZm9JbXBsPFR5cGVULCBDbGFzc0RlY2xULCBGaWVsZFQsIE1ldGhvZFQ+IGNpIDogYmVhbnMoKS52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChDbGFzc0luZm9JbXBsPFQsIEMsIEYsIE0+IGNpIDogYmVhbnMoKS52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgIFhtbFNjaGVtYSB4cyA9IHJlYWRlci5nZXRQYWNrYWdlQW5ub3RhdGlvbiggWG1sU2NoZW1hLmNsYXNzLCBjaS5nZXRDbGF6eigpLCBudWxsICk7CiAgICAgICAgICAgICAgICAgaWYoeHM9PW51bGwpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzI5LDggKzMyNywyNCBAQAogICAgICAgICBlbHNlICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CiAgICAgfQogCisgICAgcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRTY2hlbWFMb2NhdGlvbnMoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gciA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoQ2xhc3NJbmZvSW1wbDxULCBDLCBGLCBNPiBjaSA6IGJlYW5zKCkudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIFhtbFNjaGVtYSB4cyA9IHJlYWRlci5nZXRQYWNrYWdlQW5ub3RhdGlvbiggWG1sU2NoZW1hLmNsYXNzLCBjaS5nZXRDbGF6eigpLCBudWxsICk7CisgICAgICAgICAgICBpZih4cz09bnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgU3RyaW5nIGxvYyA9IHhzLmxvY2F0aW9uKCk7CisgICAgICAgICAgICBpZihsb2MuZXF1YWxzKFhtbFNjaGVtYS5OT19MT0NBVElPTikpCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgLy8gdW5zcGVjaWZpZWQKKworICAgICAgICAgICAgci5wdXQoeHMubmFtZXNwYWNlKCksbG9jKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKICAgICBwdWJsaWMgZmluYWwgWG1sTnNGb3JtIGdldEVsZW1lbnRGb3JtRGVmYXVsdChTdHJpbmcgbnNVcmkpIHsKLSAgICAgICAgZm9yIChDbGFzc0luZm9JbXBsPFR5cGVULCBDbGFzc0RlY2xULCBGaWVsZFQsIE1ldGhvZFQ+IGNpIDogYmVhbnMoKS52YWx1ZXMoKSkgeworICAgICAgICBmb3IgKENsYXNzSW5mb0ltcGw8VCwgQywgRiwgTT4gY2kgOiBiZWFucygpLnZhbHVlcygpKSB7CiAgICAgICAgICAgICBYbWxTY2hlbWEgeHMgPSByZWFkZXIuZ2V0UGFja2FnZUFubm90YXRpb24oIFhtbFNjaGVtYS5jbGFzcywgY2kuZ2V0Q2xhenooKSwgbnVsbCApOwogICAgICAgICAgICAgaWYoeHM9PW51bGwpCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0zNDYsNyArMzYwLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KFN0cmluZyBuc1VyaSkgewotICAgICAgICBmb3IgKENsYXNzSW5mb0ltcGw8VHlwZVQsQ2xhc3NEZWNsVCxGaWVsZFQsTWV0aG9kVD4gY2kgOiBiZWFucygpLnZhbHVlcygpKSB7CisgICAgICAgIGZvciAoQ2xhc3NJbmZvSW1wbDxULEMsRixNPiBjaSA6IGJlYW5zKCkudmFsdWVzKCkpIHsKICAgICAgICAgICAgIFhtbFNjaGVtYSB4cyA9IHJlYWRlci5nZXRQYWNrYWdlQW5ub3RhdGlvbiggWG1sU2NoZW1hLmNsYXNzLCBjaS5nZXRDbGF6eigpLCBudWxsICk7CiAgICAgICAgICAgICBpZih4cz09bnVsbCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9UeXBlUmVmSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1R5cGVSZWZJbXBsLmphdmEKaW5kZXggN2M2M2NmYy4uNGY0ZDQ2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1R5cGVSZWZJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1R5cGVSZWZJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1V0aWwuamF2YQppbmRleCAwM2Y3ZjM0Li5kMjA1ZTcyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuaW1wbDsKIAogaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uTWltZVR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvVmFsdWVQcm9wZXJ0eUluZm9JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvVmFsdWVQcm9wZXJ0eUluZm9JbXBsLmphdmEKaW5kZXggYWFjMDBiMS4uMzg0Nzg2NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL1ZhbHVlUHJvcGVydHlJbmZvSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9WYWx1ZVByb3BlcnR5SW5mb0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLlByb3BlcnR5S2luZDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCmluZGV4IDE2NDRmYjAuLjhkM2IwNjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgogSW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuajJzLm1vZGVsIHBhY2thZ2UuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9HZW5lcmljQXJyYXlUeXBlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvR2VuZXJpY0FycmF5VHlwZUltcGwuamF2YQppbmRleCAyY2M1NWNiLi40N2VmZmYzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9HZW5lcmljQXJyYXlUeXBlSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvbmF2L0dlbmVyaWNBcnJheVR5cGVJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwubmF2OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvbmF2L05hdmlnYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvTmF2aWdhdG9yLmphdmEKaW5kZXggMzhjODliZS4uNTk2YTAzMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvTmF2aWdhdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvTmF2aWdhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwubmF2OwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC0zNjgsOSArMzY3LDkgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGlzIG92ZXJyaWRpbmcgYW5vdGhlciBvbmUKLSAgICAgKiBkZWZpbmVkIGluIHRoZSBiYXNlIGNsYXNzLgorICAgICAqIGRlZmluZWQgaW4gdGhlIGJhc2UgY2xhc3MgJ2Jhc2UnIG9yIGl0cyBhbmNlc3RvcnMuCiAgICAgICovCi0gICAgYm9vbGVhbiBpc092ZXJyaWRpbmcoTSBtZXRob2QpOworICAgIGJvb2xlYW4gaXNPdmVycmlkaW5nKE0gbWV0aG9kLCBDIGJhc2UpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmICdjbGF6eicgaXMgYW4gaW50ZXJmYWNlLgpAQCAtMzgxLDQgKzM4MCwxMiBAQAogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgaXMgdHJhbnNpZW50LgogICAgICAqLwogICAgIGJvb2xlYW4gaXNUcmFuc2llbnQoRiBmKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2xhc3MgaXMgYW4gaW5uZXIgY2xhc3MuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIG9ubHkgdXNlZCB0byBpbXByb3ZlIHRoZSBlcnJvciBkaWFnbm9zdGljcywgc28KKyAgICAgKiBpdCdzIE9LIHRvIGZhaWwgdG8gZGV0ZWN0IHNvbWUgaW5uZXIgY2xhc3NlcyBhcyBzdWNoLgorICAgICAqLworICAgIGJvb2xlYW4gaXNJbm5lckNsYXNzKEMgY2xhenopOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvUGFyYW1ldGVyaXplZFR5cGVJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9QYXJhbWV0ZXJpemVkVHlwZUltcGwuamF2YQppbmRleCA5YWY1NmQ5Li44YjcxYzRhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9QYXJhbWV0ZXJpemVkVHlwZUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9QYXJhbWV0ZXJpemVkVHlwZUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5uYXY7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvbmF2L1JlZmxlY3Rpb25OYXZpZ2F0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvbmF2L1JlZmxlY3Rpb25OYXZpZ2F0b3IuamF2YQppbmRleCBlODI2YTA5Li42ZjU5ZjgyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9SZWZsZWN0aW9uTmF2aWdhdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvUmVmbGVjdGlvbk5hdmlnYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLm5hdjsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwpAQCAtNTMsNyArNTIsMTAgQEAKICAgICBSZWZsZWN0aW9uTmF2aWdhdG9yKCkge30KIAogICAgIHB1YmxpYyBDbGFzcyBnZXRTdXBlckNsYXNzKENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHJldHVybiBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIGlmKGNsYXp6PT1PYmplY3QuY2xhc3MpIHJldHVybiBudWxsOworICAgICAgICBDbGFzcyBzYyA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgaWYoc2M9PW51bGwpICAgIHNjPU9iamVjdC5jbGFzczsgICAgICAgIC8vIGVycm9yIHJlY292ZXJ5CisgICAgICAgIHJldHVybiBzYzsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlVmlzaXRvcjxUeXBlLENsYXNzPiBiYXNlQ2xhc3NGaW5kZXIgPSBuZXcgVHlwZVZpc2l0b3I8VHlwZSxDbGFzcz4oKSB7CkBAIC01MDksNyArNTExLDcgQEAKICAgICAgICAgcmV0dXJuIG1ldGhvZC5pc0JyaWRnZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGluZyhNZXRob2QgbWV0aG9kKSB7CisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVycmlkaW5nKE1ldGhvZCBtZXRob2QsIENsYXNzIGJhc2UpIHsKICAgICAgICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSBjb3JyZWN0LAogICAgICAgICAvLyBhcyB0aGUgSkxTIGNvbnNpZGVycwogICAgICAgICAvLyBjbGFzcyBEZXJpdmVkIGV4dGVuZHMgQmFzZTxJbnRlZ2VyPiB7CkBAIC01MjAsMTkgKzUyMiwxOCBAQAogICAgICAgICAvLyB9CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRlZC4gSGFuZGxpbmcgdGhpcyBjb3JyZWN0bHkgbmVlZHMgYSBjYXJlZnVsIGltcGxlbWVudGF0aW9uCiAKLSAgICAgICAgQ2xhc3M8Pz4gcyA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFN1cGVyY2xhc3MoKTsKICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwogICAgICAgICBDbGFzc1tdIHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwogCi0gICAgICAgIHdoaWxlKHMhPW51bGwpIHsKKyAgICAgICAgd2hpbGUoYmFzZSE9bnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZihzLmdldERlY2xhcmVkTWV0aG9kKG5hbWUscGFyYW1zKSE9bnVsbCkKKyAgICAgICAgICAgICAgICBpZihiYXNlLmdldERlY2xhcmVkTWV0aG9kKG5hbWUscGFyYW1zKSE9bnVsbCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIDsgLy8gcmVjdXJzaXZlbHkgZ28gaW50byB0aGUgYmFzZSBjbGFzcworICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGdvIGludG8gdGhlIGJhc2UgY2xhc3MKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcyA9IHMuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgYmFzZSA9IGJhc2UuZ2V0U3VwZXJjbGFzcygpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTQ2LDYgKzU0NywxMCBAQAogICAgICAgICByZXR1cm4gTW9kaWZpZXIuaXNUcmFuc2llbnQoZi5nZXRNb2RpZmllcnMoKSk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNJbm5lckNsYXNzKENsYXNzIGNsYXp6KSB7CisgICAgICAgIHJldHVybiBjbGF6ei5nZXRFbmNsb3NpbmdDbGFzcygpIT1udWxsOworICAgIH0KKwogCiAgICAgLyoqCiAgICAgICogSkRLIDUuMCBoYXMgYSBidWcgb2YgY3JlYXRlaW5nIHtAbGluayBHZW5lcmljQXJyYXlUeXBlfSB3aGVyZSBpdCBzaG91bGRuJ3QuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9UeXBlVmlzaXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvVHlwZVZpc2l0b3IuamF2YQppbmRleCA1MjhmN2M5Li5iMDIwNWU5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9UeXBlVmlzaXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvbmF2L1R5cGVWaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwubmF2OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvbmF2L1dpbGRjYXJkVHlwZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvbmF2L1dpbGRjYXJkVHlwZUltcGwuamF2YQppbmRleCAzZDNmZTRjLi44ZTAwMWQxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9XaWxkY2FyZFR5cGVJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvV2lsZGNhcmRUeXBlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLm5hdjsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL25hdi9wYWNrYWdlLmh0bWwKaW5kZXggZTFmZjZkZi4uZDc3Y2YyYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9uYXYvcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvbmF2L3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD48Ym9keT4KICAgQWJzdHJhY3Rpb24gYXJvdW5kIHRoZSByZWZsZWN0aW9uIGxpYnJhcnksIHRvIHN1cHBvcnQgdmFyaW91cyByZWZsZWN0aW9uIG1vZGVscyAoc3VjaCBhcyBqYXZhLmxhbmcucmVmbGVjdCBhbmQgQVBUKS4KIDwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUFycmF5SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVBcnJheUluZm8uamF2YQppbmRleCBmMWE1NjQ4Li42Mjk5NGExIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUFycmF5SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lQXJyYXlJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwucnVudGltZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUF0dHJpYnV0ZVByb3BlcnR5SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVBdHRyaWJ1dGVQcm9wZXJ0eUluZm8uamF2YQppbmRleCA4YjhkZTk2Li42NDFiMjdjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUF0dHJpYnV0ZVByb3BlcnR5SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lQXR0cmlidXRlUHJvcGVydHlJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwucnVudGltZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUJ1aWx0aW5MZWFmSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVCdWlsdGluTGVhZkluZm8uamF2YQppbmRleCAyMDRkNzYzLi44NDM4ZTljIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUJ1aWx0aW5MZWFmSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lQnVpbHRpbkxlYWZJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwucnVudGltZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUNsYXNzSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVDbGFzc0luZm8uamF2YQppbmRleCA0NGQ3YjJhLi43MzA5MzQzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUNsYXNzSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lQ2xhc3NJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwucnVudGltZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CkBAIC0zMyw3ICszMiw2IEBACiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5DbGFzc0luZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLlByb3BlcnR5SW5mbzsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFubm90YXRpb24uWG1sTG9jYXRpb247CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVFbGVtZW50LmphdmEKaW5kZXggZWNiMjA0Yy4uMTgzZmQ3OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVFbGVtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwucnVudGltZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUVsZW1lbnRJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUVsZW1lbnRJbmZvLmphdmEKaW5kZXggMGFlMjRjZi4uY2YxMTRkMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVFbGVtZW50SW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lRWxlbWVudEluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lRWxlbWVudFByb3BlcnR5SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVFbGVtZW50UHJvcGVydHlJbmZvLmphdmEKaW5kZXggYzAxOGMzNS4uMzNlYjA3YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVFbGVtZW50UHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVFbGVtZW50UHJvcGVydHlJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwucnVudGltZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUVudW1MZWFmSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVFbnVtTGVhZkluZm8uamF2YQppbmRleCBmYzFjZmQxLi43ZTc4YWEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUVudW1MZWFmSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lRW51bUxlYWZJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwucnVudGltZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUxlYWZJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZUxlYWZJbmZvLmphdmEKaW5kZXggOTFjYmNjZS4uYWQzNTFmOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVMZWFmSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lTGVhZkluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lTWFwUHJvcGVydHlJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZU1hcFByb3BlcnR5SW5mby5qYXZhCmluZGV4IGVlYjE2NjYuLjdhOTRjNWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lTWFwUHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVNYXBQcm9wZXJ0eUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lTm9uRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVOb25FbGVtZW50LmphdmEKaW5kZXggYmZmYWZkMS4uZWM1ZDU4YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVOb25FbGVtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVOb25FbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTMgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5Ob25FbGVtZW50OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5UcmFuc2R1Y2VyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5KQVhCQ29udGV4dEltcGw7CiAKIC8qKgogICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVOb25FbGVtZW50UmVmLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZU5vbkVsZW1lbnRSZWYuamF2YQppbmRleCA5NGNlOGVkLi42ZjIwMzI1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZU5vbkVsZW1lbnRSZWYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZU5vbkVsZW1lbnRSZWYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lUHJvcGVydHlJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZVByb3BlcnR5SW5mby5qYXZhCmluZGV4IGNhYzc3N2EuLjg3NjEwYjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lUHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVQcm9wZXJ0eUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lUmVmZXJlbmNlUHJvcGVydHlJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZVJlZmVyZW5jZVByb3BlcnR5SW5mby5qYXZhCmluZGV4IGYyZGNiY2UuLmRiMjRjN2YgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lUmVmZXJlbmNlUHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVSZWZlcmVuY2VQcm9wZXJ0eUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lVHlwZUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lVHlwZUluZm8uamF2YQppbmRleCBhYjg4ZDlmLi4xNWZjNjUxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZVR5cGVJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVUeXBlSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVUeXBlSW5mb1NldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVUeXBlSW5mb1NldC5qYXZhCmluZGV4IGRjNTljZDMuLjA3MjRiNzEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lVHlwZUluZm9TZXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZVR5cGVJbmZvU2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwucnVudGltZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVUeXBlUmVmLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZVR5cGVSZWYuamF2YQppbmRleCAyZjFhZWNiLi4zZjdlNTc5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZVR5cGVSZWYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZVR5cGVSZWYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lVmFsdWVQcm9wZXJ0eUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9SdW50aW1lVmFsdWVQcm9wZXJ0eUluZm8uamF2YQppbmRleCBiYzZlMzEwLi45NzQ4NTRjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvUnVudGltZVZhbHVlUHJvcGVydHlJbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL1J1bnRpbWVWYWx1ZVByb3BlcnR5SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9tb2RlbC9ydW50aW1lL3BhY2thZ2UtaW5mby5qYXZhCmluZGV4IGZlNTYwY2EuLjQ1Y2ZiMzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvbW9kZWwvcnVudGltZS9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL21vZGVsL3J1bnRpbWUvcGFja2FnZS1pbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKioKICAqIFRoZSBzcGVjaWFsaXphdGlvbiBvZiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlfSBmb3IgdGhlIHJ1bnRpbWUuCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggNjkxMzkwMi4uZTYyZjc2ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyoqCiAgKiA8aDE+VGhlIEpBWEIgMi4wIHJ1bnRpbWU8L2gxPi4KICAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQW55VHlwZUJlYW5JbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQW55VHlwZUJlYW5JbmZvLmphdmEKaW5kZXggNmNjODViNy4uMzc3N2E1NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0FueVR5cGVCZWFuSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9BbnlUeXBlQmVhbkluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTEzNywxMSArMTM2LDExIEBACiAgICAgICAgIGZvciggaW50IGk9MDsgaTxsZW47IGkrKyApIHsKICAgICAgICAgICAgIEF0dHIgYSA9IChBdHRyKWFsLml0ZW0oaSk7CiAgICAgICAgICAgICBpZiggInhtbG5zIi5lcXVhbHMoYS5nZXRQcmVmaXgoKSkgKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5kZWNsYXJlTmFtZXNwYWNlKCBhLmdldFZhbHVlKCksIGEuZ2V0TG9jYWxOYW1lKCksIHRydWUgKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmZvcmNlKGEuZ2V0VmFsdWUoKSwgYS5nZXRMb2NhbE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiggInhtbG5zIi5lcXVhbHMoYS5nZXROYW1lKCkpICkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuZGVjbGFyZU5hbWVzcGFjZSggYS5nZXRWYWx1ZSgpLCAiIiwgZmFsc2UgKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmZvcmNlKGEuZ2V0VmFsdWUoKSwgIiIpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIG5zVXJpID0gYS5nZXROYW1lc3BhY2VVUkkoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9BcnJheUJlYW5JbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0FycmF5QmVhbkluZm9JbXBsLmphdmEKaW5kZXggZWIzMGQyNC4uMmMzYjQwNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0FycmF5QmVhbkluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0FycmF5QmVhbkluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQXNzb2NpYXRpb25NYXAuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Bc3NvY2lhdGlvbk1hcC5qYXZhCmluZGV4IDVmNjAzNDYuLjdiOTkyMTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Bc3NvY2lhdGlvbk1hcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Bc3NvY2lhdGlvbk1hcC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEzICsyMiwxMiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogCiAvKioKICAqIEJpLWRpcmVjdGlvbmFsIG1hcCBiZXR3ZWVuIGVsZW1lbnRzLCBpbm5lciBwZWVycywKQEAgLTYyLDggKzYxLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgZmluYWwgTWFwPFhtbE5vZGUsRW50cnk8WG1sTm9kZT4+IGJ5RWxlbWVudCA9IG5ldyBIYXNoTWFwPFhtbE5vZGUsRW50cnk8WG1sTm9kZT4+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0LEVudHJ5PFhtbE5vZGU+PiBieVBlZXIgPSBuZXcgSGFzaE1hcDxPYmplY3QsRW50cnk8WG1sTm9kZT4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8WG1sTm9kZSxFbnRyeTxYbWxOb2RlPj4gYnlFbGVtZW50ID0gbmV3IElkZW50aXR5SGFzaE1hcDxYbWxOb2RlLEVudHJ5PFhtbE5vZGU+PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPE9iamVjdCxFbnRyeTxYbWxOb2RlPj4gYnlQZWVyID0gbmV3IElkZW50aXR5SGFzaE1hcDxPYmplY3QsRW50cnk8WG1sTm9kZT4+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8WG1sTm9kZT4gdXNlZE5vZGVzID0gbmV3IEhhc2hTZXQ8WG1sTm9kZT4oKTsKIAogICAgIC8qKiBSZWNvcmRzIHRoZSBuZXcgZWxlbWVudCZsdDstPmlubmVyIHBlZXIgYXNzb2NpYXRpb24uICovCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQmluZGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0JpbmRlckltcGwuamF2YQppbmRleCBmMWViNDUwLi5iYzEwM2FhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQmluZGVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9CaW5kZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkJpbmRlcjsKQEAgLTEyMyw2ICsxMjIsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYShTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgIGdldE1hcnNoYWxsZXIoKS5zZXRTY2hlbWEoc2NoZW1hKTsKICAgICAgICAgZ2V0VW5tYXJzaGFsbGVyKCkuc2V0U2NoZW1hKHNjaGVtYSk7CiAgICAgfQogCkBAIC0xNTcsNiArMTU3LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgT2JqZWN0IGdldEpBWEJOb2RlKFhtbE5vZGUgeG1sTm9kZSkgeworICAgICAgICBpZih4bWxOb2RlPT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgICBBc3NvY2lhdGlvbk1hcC5FbnRyeSBlID0gYXNzb2MuYnlFbGVtZW50KHhtbE5vZGUpOwogICAgICAgICBpZihlPT1udWxsKSAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIGlmKGUub3V0ZXIoKSE9bnVsbCkgICAgIHJldHVybiBlLm91dGVyKCk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQnJpZGdlQWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0JyaWRnZUFkYXB0ZXIuamF2YQppbmRleCA0YzMzOGQ0Li4zODBkMmJhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQnJpZGdlQWRhcHRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9CcmlkZ2VBZGFwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQnJpZGdlQ29udGV4dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9CcmlkZ2VDb250ZXh0SW1wbC5qYXZhCmluZGV4IGQxYjEwZDAuLmM5NWNhOGMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9CcmlkZ2VDb250ZXh0SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9CcmlkZ2VDb250ZXh0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0JyaWRnZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9CcmlkZ2VJbXBsLmphdmEKaW5kZXggNWNiNWQ3Ni4uMzY4ODc3MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0JyaWRnZUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQnJpZGdlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNzYsNyArNzUsNyBAQAogCiAgICAgcHVibGljIHZvaWQgbWFyc2hhbChNYXJzaGFsbGVyIF9tLCBUIHQsIFhNTFN0cmVhbVdyaXRlciBvdXRwdXQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKICAgICAgICAgTWFyc2hhbGxlckltcGwgbSA9IChNYXJzaGFsbGVySW1wbClfbTsKLSAgICAgICAgbS53cml0ZSh0YWdOYW1lLGJpLHQsWE1MU3RyZWFtV3JpdGVyT3V0cHV0LmNyZWF0ZShvdXRwdXQpLG5ldyBTdEFYUG9zdEluaXRBY3Rpb24ob3V0cHV0LG0uc2VyaWFsaXplcikpOworICAgICAgICBtLndyaXRlKHRhZ05hbWUsYmksdCxYTUxTdHJlYW1Xcml0ZXJPdXRwdXQuY3JlYXRlKG91dHB1dCxjb250ZXh0KSxuZXcgU3RBWFBvc3RJbml0QWN0aW9uKG91dHB1dCxtLnNlcmlhbGl6ZXIpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE1hcnNoYWxsZXIgX20sIFQgdCwgT3V0cHV0U3RyZWFtIG91dHB1dCwgTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9DbGFzc0JlYW5JbmZvSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0NsYXNzQmVhbkluZm9JbXBsLmphdmEKaW5kZXggYzY0YmY4My4uZDlhZTQ4OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0NsYXNzQmVhbkluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0NsYXNzQmVhbkluZm9JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQ29tcG9zaXRlU3RydWN0dXJlQmVhbkluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Db21wb3NpdGVTdHJ1Y3R1cmVCZWFuSW5mby5qYXZhCmluZGV4IDI4M2ZiMmUuLjNmYzI4MDYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Db21wb3NpdGVTdHJ1Y3R1cmVCZWFuSW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Db21wb3NpdGVTdHJ1Y3R1cmVCZWFuSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0NvbnRlbnRIYW5kbGVyQWRhcHRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0NvbnRlbnRIYW5kbGVyQWRhcHRvci5qYXZhCmluZGV4IGU2NDBmNjMuLmJkNzEyNTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Db250ZW50SGFuZGxlckFkYXB0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQ29udGVudEhhbmRsZXJBZGFwdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00Niw3ICs0NSw3IEBACiBmaW5hbCBjbGFzcyBDb250ZW50SGFuZGxlckFkYXB0b3IgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7CiAKICAgICAvKiogU3RvcmVzIG5ld2x5IGRlY2xhcmVkIHByZWZpeC1VUkkgbWFwcGluZy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEZpbmFsQXJyYXlMaXN0IHByZWZpeE1hcCA9IG5ldyBGaW5hbEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgZmluYWwgRmluYWxBcnJheUxpc3Q8U3RyaW5nPiBwcmVmaXhNYXAgPSBuZXcgRmluYWxBcnJheUxpc3Q8U3RyaW5nPigpOwogCiAgICAgLyoqIEV2ZW50cyB3aWxsIGJlIHNlbnQgdG8gdGhpcyBvYmplY3QuICovCiAgICAgcHJpdmF0ZSBmaW5hbCBYTUxTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CkBAIC02Nyw2ICs2NiwxNSBAQAogICAgICAgICBwcmVmaXhNYXAuYWRkKHVyaSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7CisgICAgICAgIGZvciggaW50IGk9MDsgaTxwcmVmaXhNYXAuc2l6ZSgpOyBpKz0yICkgeworICAgICAgICAgICAgaWYocHJlZml4TWFwLmdldChpKS5lcXVhbHMocHJlZml4KQorICAgICAgICAgICAgJiYgcHJlZml4TWFwLmdldChpKzEpLmVxdWFscyh1cmkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpCiAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICB0cnkgewpAQCAtNzQsOCArODIsMjQgQEAKIAogICAgICAgICAgICAgaW50IGxlbiA9IGF0dHMuZ2V0TGVuZ3RoKCk7CiAKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUsZ2V0UHJlZml4KHFOYW1lKSxudWxsKTsKKyAgICAgICAgICAgIFN0cmluZyBwID0gZ2V0UHJlZml4KHFOYW1lKTsKKworICAgICAgICAgICAgLy8gaXMgdGhpcyBwcmVmaXggZ29pbmcgdG8gYmUgZGVjbGFyZWQgb24gdGhpcyBlbGVtZW50PworICAgICAgICAgICAgaWYoY29udGFpbnNQcmVmaXhNYXBwaW5nKHAsbmFtZXNwYWNlVVJJKSkKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0RWxlbWVudEZvcmNlKG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUscCxudWxsKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksbG9jYWxOYW1lLCBwLG51bGwpOworCiAgICAgICAgICAgICAvLyBkZWNsYXJlIG5hbWVzcGFjZSBldmVudHMKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxwcmVmaXhNYXAuc2l6ZSgpOyBpKz0yICkgeworICAgICAgICAgICAgICAgIC8vIGZvcmNpYmx5IHNldCB0aGlzIGJpbmRpbmcsIGluc3RlYWQgb2YgdXNpbmcgZGVjbGFyZU5zVXJpLgorICAgICAgICAgICAgICAgIC8vIHRoaXMgZ3VhcmFudGVlcyB0aGF0IG5hbWVzcGFjZXMgdXNlZCBpbiBET00gd2lsbCBzaG93IHVwCisgICAgICAgICAgICAgICAgLy8gYXMtaXMgaW4gdGhlIG1hcnNoYWxsZWQgb3V0cHV0IChpbnN0ZWFkIG9mIHJlYXNzaWduZWQgdG8gc29tZXRoaW5nIGVsc2UsCisgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWF5IGhhcHBlbiBpZiB5b3UnZCB1c2UgZGVjbGFyZU5zVXJpLikKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5mb3JjZSgKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4TWFwLmdldChpKzEpLCBwcmVmaXhNYXAuZ2V0KGkpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgbmFtZXNwYWNlcyBuZWVkZWQgYnkgYXR0cmlidXRlcyBhcmUgYm91bmQKICAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxsZW47IGkrKyApIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWUgPSBhdHRzLmdldFFOYW1lKGkpOwogICAgICAgICAgICAgICAgIGlmKHFuYW1lLnN0YXJ0c1dpdGgoInhtbG5zIikpCkBAIC04NSwxMyArMTA5LDYgQEAKICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5kZWNsYXJlTmFtZXNwYWNlKAogICAgICAgICAgICAgICAgICAgICBhdHRzLmdldFVSSShpKSwgcHJlZml4LCB0cnVlICk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8cHJlZml4TWFwLnNpemUoKTsgaSs9MiApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZylwcmVmaXhNYXAuZ2V0KGkpOwotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmRlY2xhcmVOYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpcHJlZml4TWFwLmdldChpKzEpLAotICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeC5sZW5ndGgoKSE9MCApOwotICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZE5hbWVzcGFjZURlY2xzKG51bGwpOwogICAgICAgICAgICAgLy8gZmlyZSBhdHRyaWJ1dGUgZXZlbnRzCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvQ29vcmRpbmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Db29yZGluYXRvci5qYXZhCmluZGV4IGViZGM3NmIuLmEzODE1NjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Db29yZGluYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Db29yZGluYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTEyNiw3ICsxMjUsOCBAQAogICAgICAqIFNvaHVsZCBiZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZXBpc29kZSB0byBhdm9pZCBtZW1vcnkgbGVhay4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNldFRocmVhZEFmZmluaXR5KCkgewotICAgICAgICBndXlXaG9TZXRUaGVUYWJsZVRvTnVsbCA9IG5ldyBFeGNlcHRpb24oKTsgLy8gcmVtZW1iZXIgdGhhdCB3ZSBzZXQgaXQgdG8gbnVsbAorICAgICAgICBpZihkZWJ1Z1RhYmxlTlBFKQorICAgICAgICAgICAgZ3V5V2hvU2V0VGhlVGFibGVUb051bGwgPSBuZXcgRXhjZXB0aW9uKCk7IC8vIHJlbWVtYmVyIHRoYXQgd2Ugc2V0IGl0IHRvIG51bGwKICAgICAgICAgdGFibGUgPSBudWxsOwogICAgIH0KIApAQCAtMjA0LDUgKzIwNCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnVGFibGVOUEU7CiAKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVidWdUYWJsZU5QRSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDb29yZGluYXRvci5jbGFzcy5nZXROYW1lKCkrIi5kZWJ1Z1RhYmxlTlBFIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHQpIHsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Eb21Qb3N0SW5pdEFjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0RvbVBvc3RJbml0QWN0aW9uLmphdmEKaW5kZXggNTYwMmRhNS4uZTI5NzI1ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0RvbVBvc3RJbml0QWN0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0RvbVBvc3RJbml0QWN0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0VsZW1lbnRCZWFuSW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9FbGVtZW50QmVhbkluZm9JbXBsLmphdmEKaW5kZXggMDQ5NjdiZC4uNjYyMTc2MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0VsZW1lbnRCZWFuSW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvRWxlbWVudEJlYW5JbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEwICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CkBAIC02Niw2ICs2NywxMiBAQAogICAgIHB1YmxpYyBmaW5hbCBDbGFzcyBleHBlY3RlZFR5cGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBzY29wZTsKIAorICAgIC8qKgorICAgICAqIElmIG5vbi1udWxsLCB1c2UgdGhpcyB0byBjcmVhdGUgYW4gaW5zdGFuY2UuCisgICAgICogSXQgdGFrZXMgb25lIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ29uc3RydWN0b3I8PyBleHRlbmRzIEpBWEJFbGVtZW50PiBjb25zdHJ1Y3RvcjsKKwogICAgIEVsZW1lbnRCZWFuSW5mb0ltcGwoSkFYQkNvbnRleHRJbXBsIGdyYW1tYXIsIFJ1bnRpbWVFbGVtZW50SW5mbyByZWkpIHsKICAgICAgICAgc3VwZXIoZ3JhbW1hcixyZWksKENsYXNzPEpBWEJFbGVtZW50PilyZWkuZ2V0VHlwZSgpLHRydWUsZmFsc2UsdHJ1ZSk7CiAKQEAgLTc0LDYgKzgxLDE5IEBACiAgICAgICAgIHRhZ05hbWUgPSByZWkuZ2V0RWxlbWVudE5hbWUoKTsKICAgICAgICAgZXhwZWN0ZWRUeXBlID0gTmF2aWdhdG9yLlJFRkxFQ1RJT04uZXJhc3VyZShyZWkuZ2V0Q29udGVudEluTWVtb3J5VHlwZSgpKTsKICAgICAgICAgc2NvcGUgPSByZWkuZ2V0U2NvcGUoKT09bnVsbCA/IEpBWEJFbGVtZW50Lkdsb2JhbFNjb3BlLmNsYXNzIDogcmVpLmdldFNjb3BlKCkuZ2V0Q2xhenooKTsKKworICAgICAgICBDbGFzcyB0eXBlID0gTmF2aWdhdG9yLlJFRkxFQ1RJT04uZXJhc3VyZShyZWkuZ2V0VHlwZSgpKTsKKyAgICAgICAgaWYodHlwZT09SkFYQkVsZW1lbnQuY2xhc3MpCisgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IG51bGw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHR5cGUuZ2V0Q29uc3RydWN0b3IoZXhwZWN0ZWRUeXBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXJyb3IgeCA9IG5ldyBOb1N1Y2hNZXRob2RFcnJvcigiRmFpbGVkIHRvIGZpbmQgdGhlIGNvbnN0cnVjdG9yIGZvciAiICsgdHlwZSArICIgd2l0aCAiICsgZXhwZWN0ZWRUeXBlKTsKKyAgICAgICAgICAgICAgICB4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC04OSw2ICsxMDksNyBAQAogICAgICAgICB0YWdOYW1lID0gbnVsbDsKICAgICAgICAgZXhwZWN0ZWRUeXBlID0gbnVsbDsKICAgICAgICAgc2NvcGUgPSBudWxsOworICAgICAgICBjb25zdHJ1Y3RvciA9IG51bGw7CiAKICAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eTxKQVhCRWxlbWVudD4oKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldChKQVhCRWxlbWVudCBvKSB7CkBAIC0yMzgsMTIgKzI1OSwxNSBAQAogICAgICAgICByZXR1cm4gbG9hZGVyOwogICAgIH0KIAotICAgIHB1YmxpYyBmaW5hbCBKQVhCRWxlbWVudCBjcmVhdGVJbnN0YW5jZShVbm1hcnNoYWxsaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIGZpbmFsIEpBWEJFbGVtZW50IGNyZWF0ZUluc3RhbmNlKFVubWFyc2hhbGxpbmdDb250ZXh0IGNvbnRleHQpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlRnJvbVZhbHVlKG51bGwpOwogICAgIH0KIAotICAgIHB1YmxpYyBmaW5hbCBKQVhCRWxlbWVudCBjcmVhdGVJbnN0YW5jZUZyb21WYWx1ZShPYmplY3QgbykgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50KHRhZ05hbWUsZXhwZWN0ZWRUeXBlLHNjb3BlLG8pOworICAgIHB1YmxpYyBmaW5hbCBKQVhCRWxlbWVudCBjcmVhdGVJbnN0YW5jZUZyb21WYWx1ZShPYmplY3QgbykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICBpZihjb25zdHJ1Y3Rvcj09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQodGFnTmFtZSxleHBlY3RlZFR5cGUsc2NvcGUsbyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShvKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiByZXNldChKQVhCRWxlbWVudCBlLCBVbm1hcnNoYWxsaW5nQ29udGV4dCBjb250ZXh0KSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvRmlsdGVyVHJhbnNkdWNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0ZpbHRlclRyYW5zZHVjZXIuamF2YQppbmRleCBhODVmYmFmLi5mZWM1MDY0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvRmlsdGVyVHJhbnNkdWNlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9GaWx0ZXJUcmFuc2R1Y2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvSWxsZWdhbEFubm90YXRpb25FeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9JbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IDM0MDMwZDMuLmVmNzg3ODEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9JbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9JbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0lsbGVnYWxBbm5vdGF0aW9uc0V4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0lsbGVnYWxBbm5vdGF0aW9uc0V4Y2VwdGlvbi5qYXZhCmluZGV4IDBmNjM2NzEuLmUxYTA3ZmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9JbGxlZ2FsQW5ub3RhdGlvbnNFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvSWxsZWdhbEFubm90YXRpb25zRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvSW5saW5lQmluYXJ5VHJhbnNkdWNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0lubGluZUJpbmFyeVRyYW5zZHVjZXIuamF2YQppbmRleCAzNmU3YTBlLi5hYWI5NTJkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvSW5saW5lQmluYXJ5VHJhbnNkdWNlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9JbmxpbmVCaW5hcnlUcmFuc2R1Y2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvSW50ZXJuYWxCcmlkZ2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9JbnRlcm5hbEJyaWRnZS5qYXZhCmluZGV4IDQxNWVhNWUuLjkzMGI1MDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9JbnRlcm5hbEJyaWRnZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9JbnRlcm5hbEJyaWRnZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0pBWEJDb250ZXh0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0pBWEJDb250ZXh0SW1wbC5qYXZhCmluZGV4IDM1YjM0MGIuLjBmZDljYjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9KQVhCQ29udGV4dEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvSkFYQkNvbnRleHRJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMiw2ICszMSw3IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTQzLDYgKzQzLDcgQEAKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkJpbmRlcjsKIGltcG9ydCBqYXZheC54bWwuYmluZC5EYXRhdHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKIGltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKIGltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJJbnRyb3NwZWN0b3I7CkBAIC02NywxOCArNjgsMjEgQEAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UcmFuc2Zvcm1lckhhbmRsZXI7CiAKIGltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOwogaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLlBvb2w7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5EYXRhdHlwZUNvbnZlcnRlckltcGw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZUNvbnRleHQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQ29tcG9zaXRlU3RydWN0dXJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkVycm9yTGlzdGVuZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuSkFYQlJJQ29udGV4dDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5SYXdBY2Nlc3NvcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5UeXBlUmVmZXJlbmNlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyLkRPTVNjYW5uZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC51dGlsLldoaWNoOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuV2VsbEtub3duTmFtZXNwYWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuYW5ub3RhdGlvbi5SdW50aW1lQW5ub3RhdGlvblJlYWRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLmFubm90YXRpb24uUnVudGltZUlubGluZUFubm90YXRpb25SZWFkZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLkFkYXB0ZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLk5vbkVsZW1lbnQ7CkBAIC0xMDYsMTYgKzExMCwxOSBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLlhtbFNjaGVtYUdlbmVyYXRvcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnV0aWwuRWRpdERpc3RhbmNlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIudXRpbC5RTmFtZU1hcDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dC5SZXN1bHRGYWN0b3J5OwogCiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwogCiAvKioKICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIEpBWEJDb250ZXh0LgogICoKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEpBWEJDb250ZXh0SW1wbCBleHRlbmRzIEpBWEJSSUNvbnRleHQgewogCkBAIC0xOTgsMjQgKzIwNSw3MCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGMxNG5TdXBwb3J0OwogCisgICAgLyoqCisgICAgICogRmxhZyB0aGF0IHVzZXIgaGFzIHByb3ZpZGVkIGEgY3VzdG9tIEFjY2Vzc29yRmFjdG9yeSBmb3IgSkFYQiB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiB4bWxBY2Nlc3NvckZhY3RvcnlTdXBwb3J0OworCisgICAgLyoqCisgICAgICogQHNlZSBKQVhCUklDb250ZXh0I1RSRUFUX0VWRVJZVEhJTkdfTklMTEFCTEUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhbGxOaWxsYWJsZTsKKworCiAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFJ1bnRpbWVUeXBlSW5mb1NldD4gdHlwZUluZm9TZXRDYWNoZTsKIAorICAgIHByaXZhdGUgQE5vdE51bGwgUnVudGltZUFubm90YXRpb25SZWFkZXIgYW5ub3RhaXRvblJlYWRlcjsKKworICAgIHByaXZhdGUgLyphbG1vc3QgZmluYWwqLyBib29sZWFuIGhhc1N3YVJlZjsKKyAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIE1hcDxDbGFzcyxDbGFzcz4gc3ViY2xhc3NSZXBsYWNlbWVudHM7CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB3ZSBhaW0gZm9yIGZhc3RlciB7QGxpbmsgSkFYQkNvbnRleHR9IGluc3RhbmNpYXRpb24gcGVyZm9ybWFuY2UsCisgICAgICogaW5zdGVhZCBvZiBnb2luZyBhZnRlciBlZmZpY2llbnQgc3VzdGFpbmVkIHVubWFyc2hhbGxpbmcvbWFyc2hhbGxpbmcgcGVyZm9ybWFuY2UuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi4wLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBmYXN0Qm9vdDsKKwogICAgIC8qKgogICAgICAqCiAgICAgICogQHBhcmFtIHR5cGVSZWZzCiAgICAgICogICAgICB1c2VkIHRvIGJ1aWxkIHtAbGluayBCcmlkZ2V9cy4gQ2FuIGJlIGVtcHR5LgogICAgICAqIEBwYXJhbSBjMTRuU3VwcG9ydAogICAgICAqICAgICAge0BsaW5rICNjMTRuU3VwcG9ydH0uCisgICAgICogQHBhcmFtIHhtbEFjY2Vzc29yRmFjdG9yeVN1cHBvcnQKKyAgICAgKiAgICAgIFVzZSBjdXN0b20gY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3IgaW1wbGVtZW50YXRpb24uCiAgICAgICovCi0gICAgcHVibGljIEpBWEJDb250ZXh0SW1wbChDbGFzc1tdIGNsYXNzZXMsIENvbGxlY3Rpb248VHlwZVJlZmVyZW5jZT4gdHlwZVJlZnMsIFN0cmluZyBkZWZhdWx0TnNVcmksIGJvb2xlYW4gYzE0blN1cHBvcnQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLQorICAgIHB1YmxpYyBKQVhCQ29udGV4dEltcGwoQ2xhc3NbXSBjbGFzc2VzLCBDb2xsZWN0aW9uPFR5cGVSZWZlcmVuY2U+IHR5cGVSZWZzLAorICAgICAgICBNYXA8Q2xhc3MsQ2xhc3M+IHN1YmNsYXNzUmVwbGFjZW1lbnRzLCBTdHJpbmcgZGVmYXVsdE5zVXJpLCBib29sZWFuIGMxNG5TdXBwb3J0LAorICAgICAgICBATnVsbGFibGUgUnVudGltZUFubm90YXRpb25SZWFkZXIgYXIsIGJvb2xlYW4geG1sQWNjZXNzb3JGYWN0b3J5U3VwcG9ydCwgYm9vbGVhbiBhbGxOaWxsYWJsZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewogICAgICAgICAvLyBpbml0aWFsaXplIGRhdGF0eXBlIGNvbnZlcnRlciB3aXRoIG91cnMKICAgICAgICAgRGF0YXR5cGVDb252ZXJ0ZXIuc2V0RGF0YXR5cGVDb252ZXJ0ZXIoRGF0YXR5cGVDb252ZXJ0ZXJJbXBsLnRoZUluc3RhbmNlKTsKIAogICAgICAgICBpZihkZWZhdWx0TnNVcmk9PW51bGwpICAgICAgZGVmYXVsdE5zVXJpPSIiOyAgICAvLyBmb29sLXByb29mCiAKKyAgICAgICAgaWYoYXI9PW51bGwpCisgICAgICAgICAgICBhciA9IG5ldyBSdW50aW1lSW5saW5lQW5ub3RhdGlvblJlYWRlcigpOworCisgICAgICAgIGlmKHN1YmNsYXNzUmVwbGFjZW1lbnRzPT1udWxsKSAgc3ViY2xhc3NSZXBsYWNlbWVudHM9Q29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgaWYodHlwZVJlZnM9PW51bGwpICAgICAgICAgICAgICB0eXBlUmVmcz1Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKworICAgICAgICB0aGlzLmFubm90YWl0b25SZWFkZXIgPSBhcjsKKyAgICAgICAgdGhpcy5zdWJjbGFzc1JlcGxhY2VtZW50cyA9IHN1YmNsYXNzUmVwbGFjZW1lbnRzOworCisgICAgICAgIGJvb2xlYW4gZmFzdEJvb3Q7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmYXN0Qm9vdCA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihKQVhCQ29udGV4dEltcGwuY2xhc3MuZ2V0TmFtZSgpKyIuZmFzdEJvb3QiKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFzdEJvb3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZhc3RCb290ID0gZmFzdEJvb3Q7CisKICAgICAgICAgdGhpcy5kZWZhdWx0TnNVcmkgPSBkZWZhdWx0TnNVcmk7CiAgICAgICAgIHRoaXMuYzE0blN1cHBvcnQgPSBjMTRuU3VwcG9ydDsKKyAgICAgICAgdGhpcy54bWxBY2Nlc3NvckZhY3RvcnlTdXBwb3J0ID0geG1sQWNjZXNzb3JGYWN0b3J5U3VwcG9ydDsKKyAgICAgICAgdGhpcy5hbGxOaWxsYWJsZSA9IGFsbE5pbGxhYmxlOwogICAgICAgICB0aGlzLmNsYXNzZXMgPSBuZXcgQ2xhc3NbY2xhc3Nlcy5sZW5ndGhdOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNsYXNzZXMsMCx0aGlzLmNsYXNzZXMsMCxjbGFzc2VzLmxlbmd0aCk7CiAKQEAgLTMwNCw2ICszNTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYodHIuZ2V0KFhtbEF0dGFjaG1lbnRSZWYuY2xhc3MpIT1udWxsKSB7CiAgICAgICAgICAgICAgICAgYSA9IG5ldyBBZGFwdGVyPFR5cGUsQ2xhc3M+KFN3YVJlZkFkYXB0ZXIuY2xhc3MsbmF2KTsKKyAgICAgICAgICAgICAgICBoYXNTd2FSZWYgPSB0cnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZihhIT1udWxsKSB7CkBAIC0zMzYsNiArMzkwLDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIEpBWEJDb250ZXh0IGhhcyB7QGxpbmsgWG1sQXR0YWNobWVudFJlZn0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3dhUmVmKCkgeworICAgICAgICByZXR1cm4gaGFzU3dhUmVmOworICAgIH0KKworICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgUnVudGltZVR5cGVJbmZvU2V0fS4KICAgICAgKi8KICAgICBwcml2YXRlIFJ1bnRpbWVUeXBlSW5mb1NldCBnZXRUeXBlSW5mb1NldCgpIHRocm93cyBJbGxlZ2FsQW5ub3RhdGlvbnNFeGNlcHRpb24gewpAQCAtMzQ3LDkgKzQwOCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBSdW50aW1lTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUnVudGltZU1vZGVsQnVpbGRlcigKLSAgICAgICAgICAgICAgICBuZXcgUnVudGltZUlubGluZUFubm90YXRpb25SZWFkZXIoKSwKLSAgICAgICAgICAgICAgICBkZWZhdWx0TnNVcmkpOworICAgICAgICBmaW5hbCBSdW50aW1lTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUnVudGltZU1vZGVsQnVpbGRlcih0aGlzLGFubm90YWl0b25SZWFkZXIsc3ViY2xhc3NSZXBsYWNlbWVudHMsZGVmYXVsdE5zVXJpKTsKKwogICAgICAgICBJbGxlZ2FsQW5ub3RhdGlvbnNFeGNlcHRpb24uQnVpbGRlciBlcnJvckhhbmRsZXIgPSBuZXcgSWxsZWdhbEFubm90YXRpb25zRXhjZXB0aW9uLkJ1aWxkZXIoKTsKICAgICAgICAgYnVpbGRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKIApAQCAtMzYxLDYgKzQyMSw3IEBACiAgICAgICAgICAgICBidWlsZGVyLmdldFR5cGVJbmZvKG5ldyBSZWY8VHlwZSxDbGFzcz4oYykpOwogICAgICAgICB9CiAKKyAgICAgICAgdGhpcy5oYXNTd2FSZWYgfD0gYnVpbGRlci5oYXNTd2FSZWY7CiAgICAgICAgIFJ1bnRpbWVUeXBlSW5mb1NldCByID0gYnVpbGRlci5saW5rKCk7CiAKICAgICAgICAgZXJyb3JIYW5kbGVyLmNoZWNrKCk7CkBAIC00NzgsOCArNTM5LDExIEBACiAgICAgcHVibGljIGZpbmFsIEpheEJlYW5JbmZvIGdldEJlYW5JbmZvKE9iamVjdCBvLGJvb2xlYW4gZmF0YWwpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKICAgICAgICAgSmF4QmVhbkluZm8gYmkgPSBnZXRCZWFuSW5mbyhvKTsKICAgICAgICAgaWYoYmkhPW51bGwpICAgIHJldHVybiBiaTsKLSAgICAgICAgaWYoZmF0YWwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihvLmdldENsYXNzKCkuZ2V0TmFtZSgpKyIgbm9yIGFueSBvZiBpdHMgc3VwZXIgY2xhc3MgaXMga25vd24gdG8gdGhpcyBjb250ZXh0Iik7CisgICAgICAgIGlmKGZhdGFsKSB7CisgICAgICAgICAgICBpZihvIGluc3RhbmNlb2YgRG9jdW1lbnQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oTWVzc2FnZXMuRUxFTUVOVF9ORUVERURfQlVUX0ZPVU5EX0RPQ1VNRU5ULmZvcm1hdChvLmdldENsYXNzKCkpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKE1lc3NhZ2VzLlVOS05PV05fQ0xBU1MuZm9ybWF0KG8uZ2V0Q2xhc3MoKSkpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtNTIwLDEwICs1ODQsOSBAQAogICAgICAqIEByZXR1cm4KICAgICAgKiAgICAgIG51bGwgaWYgdGhlIGdpdmVuIG5hbWUgcGFpciBpcyBub3QgcmVjb2duaXplZC4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgTG9hZGVyIHNlbGVjdFJvb3RMb2FkZXIoIFVubWFyc2hhbGxpbmdDb250ZXh0LlN0YXRlIHN0YXRlLCBUYWdOYW1lIGVhICkgewotICAgICAgICBKYXhCZWFuSW5mbyBiZWFuSW5mbyA9IHJvb3RNYXAuZ2V0KGVhLnVyaSxlYS5sb2NhbCk7CisgICAgcHVibGljIGZpbmFsIExvYWRlciBzZWxlY3RSb290TG9hZGVyKCBVbm1hcnNoYWxsaW5nQ29udGV4dC5TdGF0ZSBzdGF0ZSwgVGFnTmFtZSB0YWcgKSB7CisgICAgICAgIEpheEJlYW5JbmZvIGJlYW5JbmZvID0gcm9vdE1hcC5nZXQodGFnLnVyaSx0YWcubG9jYWwpOwogICAgICAgICBpZihiZWFuSW5mbz09bnVsbCkKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgcHJvYmFibHkgdGhlIHJpZ2h0IHBsYWNlIHRvIGhhbmRsZSBAeHNpOnR5cGUKICAgICAgICAgICAgIHJldHVybiBudWxsOwogCiAgICAgICAgIHJldHVybiBiZWFuSW5mby5nZXRMb2FkZXIodGhpcyx0cnVlKTsKQEAgLTY5MiwxNyArNzU1LDQ2IEBACiAgICAgICAgIFhtbEphdmFUeXBlQWRhcHRlciB4anRhID0gdHIuZ2V0KFhtbEphdmFUeXBlQWRhcHRlci5jbGFzcyk7CiAgICAgICAgIFhtbExpc3QgeGwgPSB0ci5nZXQoWG1sTGlzdC5jbGFzcyk7CiAKLSAgICAgICAgUmVmPFR5cGUsQ2xhc3M+IHJlZiA9IG5ldyBSZWY8VHlwZSxDbGFzcz4oCi0gICAgICAgICAgICBuZXcgUnVudGltZUlubGluZUFubm90YXRpb25SZWFkZXIoKSwgdGlzLmdldE5hdmlnYXRvcigpLCB0ci50eXBlLCB4anRhLCB4bCApOworICAgICAgICBSZWY8VHlwZSxDbGFzcz4gcmVmID0gbmV3IFJlZjxUeXBlLENsYXNzPihhbm5vdGFpdG9uUmVhZGVyLCB0aXMuZ2V0TmF2aWdhdG9yKCksIHRyLnR5cGUsIHhqdGEsIHhsICk7CiAKICAgICAgICAgcmV0dXJuIHRpcy5nZXRUeXBlSW5mbyhyZWYpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hKFNjaGVtYU91dHB1dFJlc29sdmVyIG91dHB1dFJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZihvdXRwdXRSZXNvbHZlcj09bnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLk5VTExfT1VUUFVUX1JFU09MVkVSLmZvcm1hdCgpKTsKLSAgICAgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlRXBpc29kZShSZXN1bHQgb3V0cHV0KSB7CisgICAgICAgIGlmKG91dHB1dD09bnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgY3JlYXRlU2NoZW1hR2VuZXJhdG9yKCkud3JpdGVFcGlzb2RlRmlsZShSZXN1bHRGYWN0b3J5LmNyZWF0ZVNlcmlhbGl6ZXIob3V0cHV0KSk7CisgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoU2NoZW1hT3V0cHV0UmVzb2x2ZXIgb3V0cHV0UmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmKG91dHB1dFJlc29sdmVyPT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLk5VTExfT1VUUFVUX1JFU09MVkVSLmZvcm1hdCgpKTsKKworICAgICAgICBmaW5hbCBTQVhQYXJzZUV4Y2VwdGlvbltdIGUgPSBuZXcgU0FYUGFyc2VFeGNlcHRpb25bMV07CisKKyAgICAgICAgY3JlYXRlU2NoZW1hR2VuZXJhdG9yKCkud3JpdGUob3V0cHV0UmVzb2x2ZXIsIG5ldyBFcnJvckxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgZVswXSA9IGV4Y2VwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBlWzBdID0gZXhjZXB0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikge30KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7fQorICAgICAgICB9KTsKKworICAgICAgICBpZihlWzBdIT1udWxsKSB7CisgICAgICAgICAgICBJT0V4Y2VwdGlvbiB4ID0gbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLkZBSUxFRF9UT19HRU5FUkFURV9TQ0hFTUEuZm9ybWF0KCkpOworICAgICAgICAgICAgeC5pbml0Q2F1c2UoZVswXSk7CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBYbWxTY2hlbWFHZW5lcmF0b3I8VHlwZSxDbGFzcyxGaWVsZCxNZXRob2Q+IGNyZWF0ZVNjaGVtYUdlbmVyYXRvcigpIHsKICAgICAgICAgUnVudGltZVR5cGVJbmZvU2V0IHRpczsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHRpcyA9IGdldFR5cGVJbmZvU2V0KCk7CkBAIC03MTEsOCArODAzLDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKICAgICAgICAgfQogCi0gICAgICAgIFhtbFNjaGVtYUdlbmVyYXRvcjxUeXBlLENsYXNzLCBGaWVsZCwgTWV0aG9kPiB4c2RnZW4gPQotICAgICAgICAgICAgICAgIG5ldyBYbWxTY2hlbWFHZW5lcmF0b3I8VHlwZSxDbGFzcywgRmllbGQsIE1ldGhvZD4odGlzLmdldE5hdmlnYXRvcigpLHRpcyk7CisgICAgICAgIFhtbFNjaGVtYUdlbmVyYXRvcjxUeXBlLENsYXNzLEZpZWxkLE1ldGhvZD4geHNkZ2VuID0KKyAgICAgICAgICAgICAgICBuZXcgWG1sU2NoZW1hR2VuZXJhdG9yPFR5cGUsQ2xhc3MsRmllbGQsTWV0aG9kPih0aXMuZ2V0TmF2aWdhdG9yKCksdGlzKTsKIAogICAgICAgICAvLyBKQVgtUlBDIHVzZXMgQnJpZGdlIG9iamVjdHMgdGhhdCBjb2xsaWRlIHdpdGgKICAgICAgICAgLy8gQFhtbFJvb3RFbGVtZW50LgpAQCAtNzMyLDEzICs4MjQsMTUgQEAKIAogICAgICAgICAgICAgaWYodHIudHlwZT09dm9pZC5jbGFzcyB8fCB0ci50eXBlPT1Wb2lkLmNsYXNzKSB7CiAgICAgICAgICAgICAgICAgeHNkZ2VuLmFkZCh0ci50YWdOYW1lLGZhbHNlLG51bGwpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpZih0ci50eXBlPT1Db21wb3NpdGVTdHJ1Y3R1cmUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgc3BlY2lhbCBjbGFzcyB3ZSBpbnRyb2R1Y2VkIGZvciBKQVgtV1MgdGhhdCB3ZSAqZG9uJ3QqIHdhbnQgaW4gdGhlIHNjaGVtYQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBOb25FbGVtZW50PFR5cGUsQ2xhc3M+IHR5cGVJbmZvID0gZ2V0WG1sVHlwZSh0aXMsdHIpOwogICAgICAgICAgICAgICAgIHhzZGdlbi5hZGQodHIudGFnTmFtZSwgIU5hdmlnYXRvci5SRUZMRUNUSU9OLmlzUHJpbWl0aXZlKHRyLnR5cGUpLHR5cGVJbmZvKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHhzZGdlbi53cml0ZShvdXRwdXRSZXNvbHZlcik7CisgICAgICAgIHJldHVybiB4c2RnZW47CiAgICAgfQogCiAgICAgcHVibGljIFFOYW1lIGdldFR5cGVOYW1lKFR5cGVSZWZlcmVuY2UgdHIpIHsKQEAgLTg3NCw2ICs5NjgsMTggQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBKQVhCQ29udGV4dEltcGx9IHRoYXQgaW5jbHVkZXMgdGhlIHNwZWNpZmllZCBhZGRpdGlvbmFsIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIEpBWEJDb250ZXh0SW1wbCBjcmVhdGVBdWdtZW50ZWQoQ2xhc3M8Pz4gY2xhenopIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NbXSBuZXdMaXN0ID0gbmV3IENsYXNzW2NsYXNzZXMubGVuZ3RoKzFdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNsYXNzZXMsMCxuZXdMaXN0LDAsY2xhc3Nlcy5sZW5ndGgpOworICAgICAgICBuZXdMaXN0W2NsYXNzZXMubGVuZ3RoXSA9IGNsYXp6OworCisgICAgICAgIHJldHVybiBuZXcgSkFYQkNvbnRleHRJbXBsKG5ld0xpc3QsYnJpZGdlcy5rZXlTZXQoKSxzdWJjbGFzc1JlcGxhY2VtZW50cywKKyAgICAgICAgZGVmYXVsdE5zVXJpLGMxNG5TdXBwb3J0LGFubm90YWl0b25SZWFkZXIsIHhtbEFjY2Vzc29yRmFjdG9yeVN1cHBvcnQsIGFsbE5pbGxhYmxlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFFOYW1lPiBRTkFNRV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8UU5hbWU+KCkgewogICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoUU5hbWUgbGhzLCBRTmFtZSByaHMpIHsKICAgICAgICAgICAgIGludCByID0gbGhzLmdldExvY2FsUGFydCgpLmNvbXBhcmVUbyhyaHMuZ2V0TG9jYWxQYXJ0KCkpOwpAQCAtODgxLDUgKzk4Nyw1IEBACiAKICAgICAgICAgICAgIHJldHVybiBsaHMuZ2V0TmFtZXNwYWNlVVJJKCkuY29tcGFyZVRvKHJocy5nZXROYW1lc3BhY2VVUkkoKSk7CiAgICAgICAgIH0KLSAgICB9OyA7CisgICAgfTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9KYXhCZWFuSW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0pheEJlYW5JbmZvLmphdmEKaW5kZXggMDJmZGQ4Yy4uNWI4OWNiYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0pheEJlYW5JbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0pheEJlYW5JbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00MTUsNDcgKzQxNCw0MCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldExpZmVjeWNsZUZsYWdzKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0aG9kIG07Ci0KLSAgICAgICAgICAgIC8vIGJlZm9yZVVubWFyc2hhbAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtID0gamF4YlR5cGUuZ2V0RGVjbGFyZWRNZXRob2QoImJlZm9yZVVubWFyc2hhbCIsIHVubWFyc2hhbEV2ZW50UGFyYW1zKTsKLSAgICAgICAgICAgICAgICBjYWNoZUxpZmVjeWNsZU1ldGhvZChtLCBGTEFHX0hBU19CRUZPUkVfVU5NQVJTSEFMX01FVEhPRCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIG5vLW9wLCBsb29rIGZvciB0aGUgbmV4dCBtZXRob2QKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWZ0ZXJVbm1hcnNoYWwKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbSA9IGpheGJUeXBlLmdldERlY2xhcmVkTWV0aG9kKCJhZnRlclVubWFyc2hhbCIsIHVubWFyc2hhbEV2ZW50UGFyYW1zKTsKLSAgICAgICAgICAgICAgICBjYWNoZUxpZmVjeWNsZU1ldGhvZChtLCBGTEFHX0hBU19BRlRFUl9VTk1BUlNIQUxfTUVUSE9EKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm8tb3AsIGxvb2sgZm9yIHRoZSBuZXh0IG1ldGhvZAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBiZWZvcmVNYXJzaGFsCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG0gPSBqYXhiVHlwZS5nZXREZWNsYXJlZE1ldGhvZCgiYmVmb3JlTWFyc2hhbCIsIG1hcnNoYWxFdmVudFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgY2FjaGVMaWZlY3ljbGVNZXRob2QobSwgRkxBR19IQVNfQkVGT1JFX01BUlNIQUxfTUVUSE9EKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm8tb3AsIGxvb2sgZm9yIHRoZSBuZXh0IG1ldGhvZAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZnRlck1hcnNoYWwKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbSA9IGpheGJUeXBlLmdldERlY2xhcmVkTWV0aG9kKCJhZnRlck1hcnNoYWwiLCBtYXJzaGFsRXZlbnRQYXJhbXMpOwotICAgICAgICAgICAgICAgIGNhY2hlTGlmZWN5Y2xlTWV0aG9kKG0sIEZMQUdfSEFTX0FGVEVSX01BUlNIQUxfTUVUSE9EKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgICAgIGZvciggTWV0aG9kIG0gOiBqYXhiVHlwZS5nZXREZWNsYXJlZE1ldGhvZHMoKSApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmKG5hbWUuZXF1YWxzKCJiZWZvcmVVbm1hcnNoYWwiKSkgeworICAgICAgICAgICAgICAgICAgICBpZihtYXRjaChtLHVubWFyc2hhbEV2ZW50UGFyYW1zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVMaWZlY3ljbGVNZXRob2QobSwgRkxBR19IQVNfQkVGT1JFX1VOTUFSU0hBTF9NRVRIT0QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaWYobmFtZS5lcXVhbHMoImFmdGVyVW5tYXJzaGFsIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobWF0Y2gobSx1bm1hcnNoYWxFdmVudFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlTGlmZWN5Y2xlTWV0aG9kKG0sIEZMQUdfSEFTX0FGVEVSX1VOTUFSU0hBTF9NRVRIT0QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaWYobmFtZS5lcXVhbHMoImJlZm9yZU1hcnNoYWwiKSkgeworICAgICAgICAgICAgICAgICAgICBpZihtYXRjaChtLG1hcnNoYWxFdmVudFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlTGlmZWN5Y2xlTWV0aG9kKG0sIEZMQUdfSEFTX0JFRk9SRV9NQVJTSEFMX01FVEhPRCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBpZihuYW1lLmVxdWFscygiYWZ0ZXJNYXJzaGFsIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobWF0Y2gobSxtYXJzaGFsRXZlbnRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUxpZmVjeWNsZU1ldGhvZChtLCBGTEFHX0hBU19BRlRFUl9NQVJTSEFMX01FVEhPRCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggcGVybWlzc2lvbi4KICAgICAgICAgICAgIGxvZ2dlci5sb2coIExldmVsLldBUk5JTkcsIE1lc3NhZ2VzLlVOQUJMRV9UT19ESVNDT1ZFUl9FVkVOVEhBTkRMRVIuZm9ybWF0KAotICAgICAgICAgICAgICAgIGpheGJUeXBlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBlICkpOworICAgICAgICAgICAgICAgIGpheGJUeXBlLmdldE5hbWUoKSwgZSApKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaChNZXRob2QgbSwgQ2xhc3NbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMobS5nZXRQYXJhbWV0ZXJUeXBlcygpLHBhcmFtcyk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ2FjaGUgYSByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCBsaWZlY3ljbGUgbWV0aG9kIGZvciB0aGUgamF4YlR5cGUKICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBiZWFuSW5mby4KQEAgLTQ3NywxNiArNDY5LDE2IEBACiAKICAgICAgICAgc3dpdGNoIChsaWZlY3ljbGVGbGFnKSB7CiAgICAgICAgIGNhc2UgRkxBR19IQVNfQkVGT1JFX1VOTUFSU0hBTF9NRVRIT0Q6Ci0gICAgICAgICAgICBsY20uc2V0QmVmb3JlVW5tYXJzaGFsKG0pOworICAgICAgICAgICAgbGNtLmJlZm9yZVVubWFyc2hhbCA9IG07CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBGTEFHX0hBU19BRlRFUl9VTk1BUlNIQUxfTUVUSE9EOgotICAgICAgICAgICAgbGNtLnNldEFmdGVyVW5tYXJzaGFsKG0pOworICAgICAgICAgICAgbGNtLmFmdGVyVW5tYXJzaGFsID0gbTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZMQUdfSEFTX0JFRk9SRV9NQVJTSEFMX01FVEhPRDoKLSAgICAgICAgICAgIGxjbS5zZXRCZWZvcmVNYXJzaGFsKG0pOworICAgICAgICAgICAgbGNtLmJlZm9yZU1hcnNoYWwgPSBtOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRkxBR19IQVNfQUZURVJfTUFSU0hBTF9NRVRIT0Q6Ci0gICAgICAgICAgICBsY20uc2V0QWZ0ZXJNYXJzaGFsKG0pOworICAgICAgICAgICAgbGNtLmFmdGVyTWFyc2hhbCA9IG07CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTUwNCw3ICs0OTYsNyBAQAogICAgICAqIEludm9rZXMgdGhlIGJlZm9yZVVubWFyc2hhbCBtZXRob2QgaWYgYXBwbGljYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZva2VCZWZvcmVVbm1hcnNoYWxNZXRob2QoVW5tYXJzaGFsbGVySW1wbCB1bm0sIE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGhvZCBtID0gZ2V0TGlmZWN5Y2xlTWV0aG9kcygpLmdldEJlZm9yZVVubWFyc2hhbCgpOworICAgICAgICBNZXRob2QgbSA9IGdldExpZmVjeWNsZU1ldGhvZHMoKS5iZWZvcmVVbm1hcnNoYWw7CiAgICAgICAgIGludm9rZVVubWFyc2hhbGxDYWxsYmFjayhtLCBjaGlsZCwgdW5tLCBwYXJlbnQpOwogICAgIH0KIApAQCAtNTEyLDcgKzUwNCw3IEBACiAgICAgICogSW52b2tlcyB0aGUgYWZ0ZXJVbm1hcnNoYWwgbWV0aG9kIGlmIGFwcGxpY2FibGUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW52b2tlQWZ0ZXJVbm1hcnNoYWxNZXRob2QoVW5tYXJzaGFsbGVySW1wbCB1bm0sIE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGhvZCBtID0gZ2V0TGlmZWN5Y2xlTWV0aG9kcygpLmdldEFmdGVyVW5tYXJzaGFsKCk7CisgICAgICAgIE1ldGhvZCBtID0gZ2V0TGlmZWN5Y2xlTWV0aG9kcygpLmFmdGVyVW5tYXJzaGFsOwogICAgICAgICBpbnZva2VVbm1hcnNoYWxsQ2FsbGJhY2sobSwgY2hpbGQsIHVubSwgcGFyZW50KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9MZWFmQmVhbkluZm9JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTGVhZkJlYW5JbmZvSW1wbC5qYXZhCmluZGV4IDMyZjE5MjkuLjJmNDM0YTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9MZWFmQmVhbkluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0xlYWZCZWFuSW5mb0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9MaWZlY3ljbGVNZXRob2RzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTGlmZWN5Y2xlTWV0aG9kcy5qYXZhCmluZGV4IDRjNjBjZDkuLjIzMDA4Y2MgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9MaWZlY3ljbGVNZXRob2RzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL0xpZmVjeWNsZU1ldGhvZHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwxMyArMjIsMTIgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiAKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlVubWFyc2hhbGxpbmdDb250ZXh0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuTG9hZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuVW5tYXJzaGFsbGluZ0NvbnRleHQ7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSBjb250YWluZXIgZm9yIGNhY2hpbmcgbGlmZWN5Y2xlIG1ldGhvZHMgdGhhdCBhcmUKQEAgLTM5LDQxICszOCw5IEBACiAgKiBAc2VlIExvYWRlciNmaXJlQWZ0ZXJVbm1hcnNoYWwoSmF4QmVhbkluZm8sIE9iamVjdCwgVW5tYXJzaGFsbGluZ0NvbnRleHQuU3RhdGUpCiAgKiBAc2VlIFhNTFNlcmlhbGl6ZXIjZmlyZU1hcnNoYWxFdmVudChPYmplY3QsIE1ldGhvZCkKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpZmVjeWNsZU1ldGhvZHMgewotICAgIHByaXZhdGUgTWV0aG9kIGJlZm9yZVVubWFyc2hhbDsKLSAgICBwcml2YXRlIE1ldGhvZCBhZnRlclVubWFyc2hhbDsKLSAgICBwcml2YXRlIE1ldGhvZCBiZWZvcmVNYXJzaGFsOwotICAgIHByaXZhdGUgTWV0aG9kIGFmdGVyTWFyc2hhbDsKLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0QWZ0ZXJNYXJzaGFsKCkgewotICAgICAgICByZXR1cm4gYWZ0ZXJNYXJzaGFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyTWFyc2hhbChNZXRob2QgYWZ0ZXJNYXJzaGFsKSB7Ci0gICAgICAgIHRoaXMuYWZ0ZXJNYXJzaGFsID0gYWZ0ZXJNYXJzaGFsOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0QWZ0ZXJVbm1hcnNoYWwoKSB7Ci0gICAgICAgIHJldHVybiBhZnRlclVubWFyc2hhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBZnRlclVubWFyc2hhbChNZXRob2QgYWZ0ZXJVbm1hcnNoYWwpIHsKLSAgICAgICAgdGhpcy5hZnRlclVubWFyc2hhbCA9IGFmdGVyVW5tYXJzaGFsOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0QmVmb3JlTWFyc2hhbCgpIHsKLSAgICAgICAgcmV0dXJuIGJlZm9yZU1hcnNoYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVmb3JlTWFyc2hhbChNZXRob2QgYmVmb3JlTWFyc2hhbCkgewotICAgICAgICB0aGlzLmJlZm9yZU1hcnNoYWwgPSBiZWZvcmVNYXJzaGFsOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0QmVmb3JlVW5tYXJzaGFsKCkgewotICAgICAgICByZXR1cm4gYmVmb3JlVW5tYXJzaGFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlZm9yZVVubWFyc2hhbChNZXRob2QgYmVmb3JlVW5tYXJzaGFsKSB7Ci0gICAgICAgIHRoaXMuYmVmb3JlVW5tYXJzaGFsID0gYmVmb3JlVW5tYXJzaGFsOwotICAgIH0KK2ZpbmFsIGNsYXNzIExpZmVjeWNsZU1ldGhvZHMgeworICAgIE1ldGhvZCBiZWZvcmVVbm1hcnNoYWw7CisgICAgTWV0aG9kIGFmdGVyVW5tYXJzaGFsOworICAgIE1ldGhvZCBiZWZvcmVNYXJzaGFsOworICAgIE1ldGhvZCBhZnRlck1hcnNoYWw7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTG9jYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Mb2NhdGlvbi5qYXZhCmluZGV4IGIwYWNmNTkuLjQ2NzA5MjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Mb2NhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Mb2NhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL01hcnNoYWxsZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTWFyc2hhbGxlckltcGwuamF2YQppbmRleCAxZjVjNWZkLi44MjBjN2Y2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTWFyc2hhbGxlckltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTWFyc2hhbGxlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKQEAgLTE1MSw3ICsxNTAsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iaiwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICB3cml0ZShvYmosIFhNTFN0cmVhbVdyaXRlck91dHB1dC5jcmVhdGUod3JpdGVyKSwgbmV3IFN0QVhQb3N0SW5pdEFjdGlvbih3cml0ZXIsc2VyaWFsaXplcikpOworICAgICAgICB3cml0ZShvYmosIFhNTFN0cmVhbVdyaXRlck91dHB1dC5jcmVhdGUod3JpdGVyLGNvbnRleHQpLCBuZXcgU3RBWFBvc3RJbml0QWN0aW9uKHdyaXRlcixzZXJpYWxpemVyKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3Qgb2JqLCBYTUxFdmVudFdyaXRlciB3cml0ZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKQEAgLTE5NSw3ICsxOTQsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVVUkwgPSBmaWxlVVJMLnN1YnN0cmluZyg4KTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVVSTCA9IGZpbGVVUkwuc3Vic3RyaW5nKDcpOwotICAgICAgICAgICAgICAgIH0gLy8gb3RoZXJ3aXNlIGFzc3VtZSB0aGF0IGl0J3MgYSBmaWxlIG5hbWUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpbGVVUkwuc3RhcnRzV2l0aCgiZmlsZTovIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBwZW9wbGUgdXNlIGJyb2tlbiBVUkxzIGxpa2UgImZpbGU6L2M6L2FiYy9kZWYvZ2hpLnR4dCIKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gbGV0J3MgbWFrZSBpdCB3b3JrIHdpdGggdGhhdAorICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVSTC5zdWJzdHJpbmcoNikuaW5kZXhPZigiOiIpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVVUkwgPSBmaWxlVVJMLnN1YnN0cmluZyg2KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVVSTCA9IGZpbGVVUkwuc3Vic3RyaW5nKDUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgYXNzdW1lIHRoYXQgaXQncyBhIGZpbGUgbmFtZQogCiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlVVJMKTsKQEAgLTI0Nyw3ICsyNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5jaGlsZEFzWHNpVHlwZShvYmosInJvb3QiLGJpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgcG9zdHdyaXRlKG91dCk7CisgICAgICAgICAgICAgICAgcG9zdHdyaXRlKCk7CiAgICAgICAgICAgICB9IGNhdGNoKCBTQVhFeGNlcHRpb24gZSApIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTI5Niw3ICszMDQsNyBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBwcmV3cml0ZShvdXQsaXNGcmFnbWVudCgpLHBvc3RJbml0QWN0aW9uKTsKICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmNoaWxkQXNSb290KG9iaik7Ci0gICAgICAgICAgICAgICAgcG9zdHdyaXRlKG91dCk7CisgICAgICAgICAgICAgICAgcG9zdHdyaXRlKCk7CiAgICAgICAgICAgICB9IGNhdGNoKCBTQVhFeGNlcHRpb24gZSApIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTM0OCwxMCArMzU2LDkgQEAKICAgICAgICAgc2VyaWFsaXplci5zZXRQcmVmaXhNYXBwZXIocHJlZml4TWFwcGVyKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcG9zdHdyaXRlKFhtbE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBwb3N0d3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgc2VyaWFsaXplci5lbmREb2N1bWVudCgpOwogICAgICAgICBzZXJpYWxpemVyLnJlY29uY2lsZUlEKCk7ICAgLy8gZXh0cmEgY2hlY2sKLSAgICAgICAgb3V0LmZsdXNoKCk7CiAgICAgfQogCiAKQEAgLTQ0NCw3ICs0NTEsNyBAQAogICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmKCBJTkRFTlRfU1RSSU5HLmVxdWFscyhuYW1lKSApCiAgICAgICAgICAgICByZXR1cm4gaW5kZW50OwotICAgICAgICBpZiggRU5DT0RJTkdfSEFORExFUi5lcXVhbHMobmFtZSkgKQorICAgICAgICBpZiggRU5DT0RJTkdfSEFORExFUi5lcXVhbHMobmFtZSkgfHwgRU5DT0RJTkdfSEFORExFUjIuZXF1YWxzKG5hbWUpICkKICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIYW5kbGVyOwogICAgICAgICBpZiggUFJFRklYX01BUFBFUi5lcXVhbHMobmFtZSkgKQogICAgICAgICAgICAgcmV0dXJuIHByZWZpeE1hcHBlcjsKQEAgLTQ1NCw2ICs0NjEsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKICAgICAgICAgaWYoIEMxNE4uZXF1YWxzKG5hbWUpICkKICAgICAgICAgICAgIHJldHVybiBjMTRuU3VwcG9ydDsKKyAgICAgICAgaWYgKCBPQkpFQ1RfSURFTlRJVFlfQ1lDTEVfREVURUNUSU9OLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplci5nZXRPYmplY3RJZGVudGl0eUN5Y2xlRGV0ZWN0aW9uKCk7Cis7CiAKICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KG5hbWUpOwogICAgIH0KQEAgLTQ2NCw3ICs0NzQsNyBAQAogICAgICAgICAgICAgaW5kZW50ID0gKFN0cmluZyl2YWx1ZTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiggRU5DT0RJTkdfSEFORExFUi5lcXVhbHMobmFtZSkgKSB7CisgICAgICAgIGlmKCBFTkNPRElOR19IQU5ETEVSLmVxdWFscyhuYW1lKSB8fCBFTkNPRElOR19IQU5ETEVSMi5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJFc2NhcGVIYW5kbGVyKSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvcGVydHlFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLk1VU1RfQkVfWC5mb3JtYXQoCkBAIC01MDEsNiArNTExLDExIEBACiAgICAgICAgICAgICBjMTRuU3VwcG9ydCA9IChCb29sZWFuKXZhbHVlOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGlmIChPQkpFQ1RfSURFTlRJVFlfQ1lDTEVfREVURUNUSU9OLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIGNoZWNrQm9vbGVhbihuYW1lLHZhbHVlKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2V0T2JqZWN0SWRlbnRpdHlDeWNsZURldGVjdGlvbigoQm9vbGVhbil2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICBzdXBlci5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgfQpAQCAtNTg1LDcgKzYwMCw5IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UX1NUUklORyA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmluZGVudFN0cmluZyI7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX01BUFBFUiA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLm5hbWVzcGFjZVByZWZpeE1hcHBlciI7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfSEFORExFUiA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmNoYXJhY3RlckVzY2FwZUhhbmRsZXIiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0hBTkRMRVIyID0gImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQubWFyc2hhbGxlci5DaGFyYWN0ZXJFc2NhcGVIYW5kbGVyIjsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxERUNMQVJBVElPTiA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnhtbERlY2xhcmF0aW9uIjsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfSEVBREVSUyA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnhtbEhlYWRlcnMiOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEMxNE4gPSBKQVhCUklDb250ZXh0LkNBTk9OSUNBTElaQVRJT05fU1VQUE9SVDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfSURFTlRJVFlfQ1lDTEVfREVURUNUSU9OID0gImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQub2JqZWN0SWRlbnRpdGl0eUN5Y2xlRGV0ZWN0aW9uIjsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9NZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL01lc3NhZ2VzLmphdmEKaW5kZXggMGQ3NDIxMC4uMWY0YmU2MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtNTIsNiArNTEsOSBAQAogICAgIFNVQlNUSVRVVEVEX0JZX0FOT05ZTU9VU19UWVBFLCAvLyAzIGFyZwogICAgIENZQ0xFX0lOX01BUlNIQUxMRVIsIC8vIDEgYXJnCiAgICAgVU5BQkxFX1RPX0RJU0NPVkVSX0VWRU5USEFORExFUiwgLy8gMSBhcmcKKyAgICBFTEVNRU5UX05FRURFRF9CVVRfRk9VTkRfRE9DVU1FTlQsIC8vIDEgYXJnCisgICAgVU5LTk9XTl9DTEFTUywgLy8gMSBhcmcKKyAgICBGQUlMRURfVE9fR0VORVJBVEVfU0NIRU1BLCAvLyAwIGFyZ3MKICAgICA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShNZXNzYWdlcy5jbGFzcy5nZXROYW1lKCkpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTWVzc2FnZXMucHJvcGVydGllcwppbmRleCBkM2MyNWQ5Li43OWQzNGI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogTk9UX01BUlNIQUxMQUJMRSA9IFwKIAl0aGUgb2JqZWN0IHBhcmFtZXRlciB0byBtYXJzaGFsKCkgaXMgbm90IG1hcnNoYWxsYWJsZQogCkBAIC01OCw0ICs4MywxMyBAQAogCiBVTkFCTEVfVE9fRElTQ09WRVJfRVZFTlRIQU5ETEVSID0gXAogICAgIFVuYWJsZSB0byBsaXN0IG1ldGhvZHMgb2YgInswfSIuIElmIHRoZXJlIGlzIGFueSBldmVudCBjYWxsYmFjayBoYW5kbGVyIG9uIHRoaXMgY2xhc3MsIGl0IHdpbGwgYmUgaWdub3JlZC4KKworRUxFTUVOVF9ORUVERURfQlVUX0ZPVU5EX0RPQ1VNRU5UID0gXAorICAgIEEgRE9NIGRvY3VtZW50ICJ7MH0iIGlzIGZvdW5kIGJ1dCBhbiBlbGVtZW50IGlzIG5lZWRlZC4gVXNlIERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpIGFuZCBzZXQgdGhhdCBvYmplY3QgaW5zdGVhZC4KKworVU5LTk9XTl9DTEFTUyA9IFwKKyAgICB7MH0gbm9yIGFueSBvZiBpdHMgc3VwZXIgY2xhc3MgaXMga25vd24gdG8gdGhpcyBjb250ZXh0LgorCitGQUlMRURfVE9fR0VORVJBVEVfU0NIRU1BID0gXAorICAgIEZhaWxlZCB0byBnZW5lcmF0ZSBzY2hlbWEuCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTWltZVR5cGVkVHJhbnNkdWNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL01pbWVUeXBlZFRyYW5zZHVjZXIuamF2YQppbmRleCAyMGIwODhlLi44ZWVlODg0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTWltZVR5cGVkVHJhbnNkdWNlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9NaW1lVHlwZWRUcmFuc2R1Y2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmEuYXd0Lio7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTmFtZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL05hbWUuamF2YQppbmRleCA0ZGIwODEwLi5jMTY1MGMzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTmFtZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9OYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTmFtZUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9OYW1lQnVpbGRlci5qYXZhCmluZGV4IDgyYTQ5OTQuLjg2ODJmN2QgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9OYW1lQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9OYW1lQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9OYW1lTGlzdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL05hbWVMaXN0LmphdmEKaW5kZXggZTBmYzAwNi4uYTA3NjcxMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL05hbWVMaXN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL05hbWVMaXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvTmFtZXNwYWNlQ29udGV4dDIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9OYW1lc3BhY2VDb250ZXh0Mi5qYXZhCmluZGV4IDJlNjM3MzAuLjdjMTRmYjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9OYW1lc3BhY2VDb250ZXh0Mi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9OYW1lc3BhY2VDb250ZXh0Mi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDYgKzI3LDggQEAKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKIAoraW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CisKIC8qKgogICogTWFpbnRhaW5zIG5hbWVzcGFjZSZsdDstPnByZWZpeCBiaW5kaW5ncy4KICAqCkBAIC03NCw0ICs3NiwxMyBAQAogICAgICAqICAgICAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCBudWxsIGlzIHJldHVybmVkLgogICAgICAqLwogICAgIFN0cmluZyBkZWNsYXJlTmFtZXNwYWNlKCBTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgcHJlZmVyZWRQcmVmaXgsIGJvb2xlYW4gcmVxdWlyZVByZWZpeCApOworCisgICAgLyoqCisgICAgICogRm9yY2libHkgbWFrZSBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpbiBlZmZlY3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgKHByZWZpeCx1cmkpIGJpbmRpbmcgaXMgYWxyZWFkeSBpbi1zY29wZSwgdGhpcyBtZXRob2QKKyAgICAgKiBzaW1wbHkgcmV0dXJucyB0aGUgYXNzaWduZWQgcHJlZml4IGluZGV4LiBPdGhlcndpc2UgYSBuZXcKKyAgICAgKiBkZWNsYXJhdGlvbiB3aWxsIGJlIHB1dC4KKyAgICAgKi8KKyAgICBpbnQgZm9yY2UoQE5vdE51bGwgU3RyaW5nIHVyaSwgQE5vdE51bGwgU3RyaW5nIHByZWZpeCk7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvUnVudGltZVV0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9SdW50aW1lVXRpbC5qYXZhCmluZGV4IDY5MjFhOWMuLmQ2ZDc3ZjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9SdW50aW1lVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9SdW50aW1lVXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvU2NoZW1hVHlwZVRyYW5zZHVjZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9TY2hlbWFUeXBlVHJhbnNkdWNlci5qYXZhCmluZGV4IDFiMWRiM2IuLjI1ODJiM2EgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9TY2hlbWFUeXBlVHJhbnNkdWNlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9TY2hlbWFUeXBlVHJhbnNkdWNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL1N0QVhQb3N0SW5pdEFjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL1N0QVhQb3N0SW5pdEFjdGlvbi5qYXZhCmluZGV4IDAyM2UwZjkuLjU4ZDJkZDQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9TdEFYUG9zdEluaXRBY3Rpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvU3RBWFBvc3RJbml0QWN0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Td2FSZWZBZGFwdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvU3dhUmVmQWRhcHRlci5qYXZhCmluZGV4IDJlMmQyYWQuLmM4N2U0ZTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9Td2FSZWZBZGFwdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL1N3YVJlZkFkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9UcmFuc2R1Y2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvVHJhbnNkdWNlci5qYXZhCmluZGV4IGM0N2E3YmIuLjExNzNlY2QgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9UcmFuc2R1Y2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL1RyYW5zZHVjZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9WYWx1ZUxpc3RCZWFuSW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9WYWx1ZUxpc3RCZWFuSW5mb0ltcGwuamF2YQppbmRleCA4ZWQ5NTc0Li44M2QxNmZkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvVmFsdWVMaXN0QmVhbkluZm9JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL1ZhbHVlTGlzdEJlYW5JbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL1hNTFNlcmlhbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9YTUxTZXJpYWxpemVyLmphdmEKaW5kZXggZmI4NWMwOS4uYmZjNmQ1YzMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9YTUxTZXJpYWxpemVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL1hNTFNlcmlhbGl6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02NCw2ICs2NCw3IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5CYXNlNjREYXRhOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuSW50RGF0YTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnV0aWwuQ29sbGlzaW9uQ2hlY2tTdGFjazsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkN5Y2xlUmVjb3ZlcmFibGU7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKQEAgLTI1NCw2ICsyNTUsMTYgQEAKICAgICAgICAgbnNlLnNldFRhZ05hbWUoaWR4LGxvY2FsTmFtZSxvdXRlclBlZXIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFZhcmlhdGlvbiBvZiB7QGxpbmsgI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBPYmplY3QpfSB0aGF0IGZvcmNlcworICAgICAqIGEgc3BlY2lmaWMgcHJlZml4LiBOZWVkZWQgdG8gcHJlc2VydmUgdGhlIHByZWZpeCB3aGVuIG1hcnNoYWxsaW5nIERPTS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnRGb3JjZShTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBmb3JjZWRQcmVmaXgsIE9iamVjdCBvdXRlclBlZXIpIHsKKyAgICAgICAgc3RhcnRFbGVtZW50KCk7CisgICAgICAgIGludCBpZHggPSBuc0NvbnRleHQuZm9yY2UobnNVcmksIGZvcmNlZFByZWZpeCk7CisgICAgICAgIG5zZS5zZXRUYWdOYW1lKGlkeCxsb2NhbE5hbWUsb3V0ZXJQZWVyKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBlbmROYW1lc3BhY2VEZWNscyhPYmplY3QgaW5uZXJQZWVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIG5zQ29udGV4dC5jb2xsZWN0aW9uTW9kZSA9IGZhbHNlOwogICAgICAgICBuc2Uuc3RhcnRFbGVtZW50KG91dCxpbm5lclBlZXIpOwpAQCAtNDcyLDI1ICs0ODMsNDYgQEAKICAgICAgICAgY3ljbGVEZXRlY3Rpb25TdGFjay5wb3AoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHVzaE9iamVjdChPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYoY3ljbGVEZXRlY3Rpb25TdGFjay5wdXNoKG9iaikpIHsKLSAgICAgICAgICAgIC8vIGN5Y2xlIGRldGVjdGVkCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChvYmopOwotICAgICAgICAgICAgaW50IGk9Y3ljbGVEZXRlY3Rpb25TdGFjay5zaXplKCktMTsKLSAgICAgICAgICAgIE9iamVjdCB4OwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIC0+ICIpOwotICAgICAgICAgICAgICAgIHggPSBjeWNsZURldGVjdGlvblN0YWNrLmdldCgtLWkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh4KTsKLSAgICAgICAgICAgIH0gd2hpbGUob2JqIT14KTsKKyAgICAvKioKKyAgICAgKiBQdXNoZXMgdGhlIG9iamVjdCB0byB7QGxpbmsgI2N5Y2xlRGV0ZWN0aW9uU3RhY2t9IGFuZCBhbHNvCisgICAgICogZGV0ZWN0IGFueSBjeWNsZXMuCisgICAgICoKKyAgICAgKiBXaGVuIGEgY3ljbGUgaXMgZm91bmQsIHRoaXMgbWV0aG9kIHRyaWVzIHRvIHJlY292ZXIgZnJvbSBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgbWFyc2hhbGxlZCBpbnN0ZWFkIG9mIHRoZSBnaXZlbiA8dHQ+b2JqPC90dD4sCisgICAgICogICAgICBvciBudWxsIGlmIHRoZSBlcnJvciBpcyBmb3VuZCBhbmQgd2UgbmVlZCB0byBhdm9pZCBtYXJzaGFsbGluZyB0aGlzIG9iamVjdAorICAgICAqICAgICAgdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24uIFdoZW4gdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLCB0aGUgZXJyb3IKKyAgICAgKiAgICAgIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgcHVzaE9iamVjdChPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIWN5Y2xlRGV0ZWN0aW9uU3RhY2sucHVzaChvYmopKQorICAgICAgICAgICAgcmV0dXJuIG9iajsKIAotICAgICAgICAgICAgcmVwb3J0RXJyb3IobmV3IFZhbGlkYXRpb25FdmVudEltcGwoCi0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbkV2ZW50LkVSUk9SLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLkNZQ0xFX0lOX01BUlNIQUxMRVIuZm9ybWF0KHNiKSwKLSAgICAgICAgICAgICAgICBnZXRDdXJyZW50TG9jYXRpb24oZmllbGROYW1lKSwKLSAgICAgICAgICAgICAgICBudWxsKSk7CisgICAgICAgIC8vIGFsbG93IHRoZSBvYmplY3QgdG8gbm9taW5hdGUgaXRzIHJlcGxhY2VtZW50CisgICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIEN5Y2xlUmVjb3ZlcmFibGUpIHsKKyAgICAgICAgICAgIG9iaiA9ICgoQ3ljbGVSZWNvdmVyYWJsZSlvYmopLm9uQ3ljbGVEZXRlY3RlZChuZXcgQ3ljbGVSZWNvdmVyYWJsZS5Db250ZXh0KCl7CisgICAgICAgICAgICAgICAgcHVibGljIE1hcnNoYWxsZXIgZ2V0TWFyc2hhbGxlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcnNoYWxsZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZihvYmohPW51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBvYmplY3Qgbm9taW5hdGVkIGl0cyByZXBsYWNlbWVudC4KKyAgICAgICAgICAgICAgICAvLyB3ZSBzdGlsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBub21pbmF0ZWQuCisgICAgICAgICAgICAgICAgLy8gdGhpcyBtYXkgY2F1c2UgaW5pZmluaXRlIHJlY3Vyc2lvbiBvbiBpdHMgb3duLgorICAgICAgICAgICAgICAgIGN5Y2xlRGV0ZWN0aW9uU3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHB1c2hPYmplY3Qob2JqLGZpZWxkTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQorCisgICAgICAgIC8vIGN5Y2xlIGRldGVjdGVkIGFuZCBubyBvbmUgaXMgY2F0Y2hpbmcgdGhlIGVycm9yLgorICAgICAgICByZXBvcnRFcnJvcihuZXcgVmFsaWRhdGlvbkV2ZW50SW1wbCgKKyAgICAgICAgICAgIFZhbGlkYXRpb25FdmVudC5FUlJPUiwKKyAgICAgICAgICAgIE1lc3NhZ2VzLkNZQ0xFX0lOX01BUlNIQUxMRVIuZm9ybWF0KGN5Y2xlRGV0ZWN0aW9uU3RhY2suZ2V0Q3ljbGVTdHJpbmcoKSksCisgICAgICAgICAgICBnZXRDdXJyZW50TG9jYXRpb24oZmllbGROYW1lKSwKKyAgICAgICAgICAgIG51bGwpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTIsNiArNTQ0LDE0IEBACiAgICAgICAgIGlmKGNoaWxkPT1udWxsKSB7CiAgICAgICAgICAgICBoYW5kbGVNaXNzaW5nT2JqZWN0RXJyb3IoZmllbGROYW1lKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoaWxkID0gcHVzaE9iamVjdChjaGlsZCxmaWVsZE5hbWUpOworICAgICAgICAgICAgaWYoY2hpbGQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBlcnJvciByZWNvdmVyeQorICAgICAgICAgICAgICAgIGVuZE5hbWVzcGFjZURlY2xzKG51bGwpOworICAgICAgICAgICAgICAgIGVuZEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICBjeWNsZURldGVjdGlvblN0YWNrLnBvcCgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBKYXhCZWFuSW5mbyBiZWFuSW5mbzsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgYmVhbkluZm8gPSBncmFtbWFyLmdldEJlYW5JbmZvKGNoaWxkLHRydWUpOwpAQCAtNTIwLDExICs1NjAsMTAgQEAKICAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGJ5IGlnbm9yZQogICAgICAgICAgICAgICAgIGVuZE5hbWVzcGFjZURlY2xzKG51bGwpOwogICAgICAgICAgICAgICAgIGVuZEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICBjeWNsZURldGVjdGlvblN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcHVzaE9iamVjdChjaGlsZCxmaWVsZE5hbWUpOwotCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGxvb2tGb3JMaWZlY3ljbGVNZXRob2RzID0gYmVhbkluZm8ubG9va0ZvckxpZmVjeWNsZU1ldGhvZHMoKTsKICAgICAgICAgICAgIGlmIChsb29rRm9yTGlmZWN5Y2xlTWV0aG9kcykgewogICAgICAgICAgICAgICAgIGZpcmVCZWZvcmVNYXJzaGFsRXZlbnRzKGJlYW5JbmZvLCBjaGlsZCk7CkBAIC01NzIsMTIgKzYxMSwxNyBAQAogICAgICAgICBpZihjaGlsZD09bnVsbCkgewogICAgICAgICAgICAgaGFuZGxlTWlzc2luZ09iamVjdEVycm9yKGZpZWxkTmFtZSk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGlsZCA9IHB1c2hPYmplY3QoY2hpbGQsZmllbGROYW1lKTsKKyAgICAgICAgICAgIGlmKGNoaWxkPT1udWxsKSB7IC8vIGVycm9yIHJlY292ZXJ5CisgICAgICAgICAgICAgICAgZW5kTmFtZXNwYWNlRGVjbHMobnVsbCk7CisgICAgICAgICAgICAgICAgZW5kQXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYm9vbGVhbiBhc0V4cGVjdGVkID0gY2hpbGQuZ2V0Q2xhc3MoKT09ZXhwZWN0ZWQuamF4YlR5cGU7CiAgICAgICAgICAgICBKYXhCZWFuSW5mbyBhY3R1YWwgPSBleHBlY3RlZDsKICAgICAgICAgICAgIFFOYW1lIGFjdHVhbFR5cGVOYW1lID0gbnVsbDsKIAotICAgICAgICAgICAgcHVzaE9iamVjdChjaGlsZCxmaWVsZE5hbWUpOwotCiAgICAgICAgICAgICBpZigoYXNFeHBlY3RlZCkgJiYgKGFjdHVhbC5sb29rRm9yTGlmZWN5Y2xlTWV0aG9kcygpKSkgewogICAgICAgICAgICAgICAgIGZpcmVCZWZvcmVNYXJzaGFsRXZlbnRzKGFjdHVhbCwgY2hpbGQpOwogICAgICAgICAgICAgfQpAQCAtNjQzLDcgKzY4Nyw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGZpcmVBZnRlck1hcnNoYWxFdmVudHMoZmluYWwgSmF4QmVhbkluZm8gYmVhbkluZm8sIE9iamVjdCBjdXJyZW50VGFyZ2V0KSB7CiAgICAgICAgIC8vIGZpcnN0IGludm9rZSBiZWFuIGVtYmVkZGVkIGxpc3RlbmVyCiAgICAgICAgIGlmIChiZWFuSW5mby5oYXNBZnRlck1hcnNoYWxNZXRob2QoKSkgewotICAgICAgICAgICAgTWV0aG9kIG0gPSBiZWFuSW5mby5nZXRMaWZlY3ljbGVNZXRob2RzKCkuZ2V0QWZ0ZXJNYXJzaGFsKCk7CisgICAgICAgICAgICBNZXRob2QgbSA9IGJlYW5JbmZvLmdldExpZmVjeWNsZU1ldGhvZHMoKS5hZnRlck1hcnNoYWw7CiAgICAgICAgICAgICBmaXJlTWFyc2hhbEV2ZW50KGN1cnJlbnRUYXJnZXQsIG0pOwogICAgICAgICB9CiAKQEAgLTY2Nyw3ICs3MTEsNyBAQAogICAgIHByaXZhdGUgdm9pZCBmaXJlQmVmb3JlTWFyc2hhbEV2ZW50cyhmaW5hbCBKYXhCZWFuSW5mbyBiZWFuSW5mbywgT2JqZWN0IGN1cnJlbnRUYXJnZXQpIHsKICAgICAgICAgLy8gZmlyc3QgaW52b2tlIGJlYW4gZW1iZWRkZWQgbGlzdGVuZXIKICAgICAgICAgaWYgKGJlYW5JbmZvLmhhc0JlZm9yZU1hcnNoYWxNZXRob2QoKSkgewotICAgICAgICAgICAgTWV0aG9kIG0gPSBiZWFuSW5mby5nZXRMaWZlY3ljbGVNZXRob2RzKCkuZ2V0QmVmb3JlTWFyc2hhbCgpOworICAgICAgICAgICAgTWV0aG9kIG0gPSBiZWFuSW5mby5nZXRMaWZlY3ljbGVNZXRob2RzKCkuYmVmb3JlTWFyc2hhbDsKICAgICAgICAgICAgIGZpcmVNYXJzaGFsRXZlbnQoY3VycmVudFRhcmdldCwgbSk7CiAgICAgICAgIH0KIApAQCAtOTA4LDYgKzk1MiwxMyBAQAogICAgICAgICByZXR1cm4gc2NoZW1hVHlwZTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3RJZGVudGl0eUN5Y2xlRGV0ZWN0aW9uKGJvb2xlYW4gdmFsKSB7CisgICAgICAgIGN5Y2xlRGV0ZWN0aW9uU3RhY2suc2V0VXNlSWRlbnRpdHkodmFsKTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gZ2V0T2JqZWN0SWRlbnRpdHlDeWNsZURldGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGN5Y2xlRGV0ZWN0aW9uU3RhY2suZ2V0VXNlSWRlbnRpdHkoKTsKKyAgICB9CisKICAgICB2b2lkIHJlY29uY2lsZUlEKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGZpbmQgb2JqZWN0cyB0aGF0IHdlcmUgbm90IGEgcGFydCBvZiB0aGUgb2JqZWN0IGdyYXBoCiAgICAgICAgIGlkUmVmZXJlbmNlZE9iamVjdHMucmVtb3ZlQWxsKG9iamVjdHNXaXRoSWQpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9DMTRuWG1sT3V0cHV0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0MxNG5YbWxPdXRwdXQuamF2YQppbmRleCBkMDkzYWFkLi5kYzY3Y2RhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0MxNG5YbWxPdXRwdXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0MxNG5YbWxPdXRwdXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLm91dHB1dDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0RPTU91dHB1dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9ET01PdXRwdXQuamF2YQppbmRleCAxMzI0M2ExLi4zOTFiMWNiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0RPTU91dHB1dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRE9NT3V0cHV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5vdXRwdXQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuQXNzb2NpYXRpb25NYXA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0VuY29kZWQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRW5jb2RlZC5qYXZhCmluZGV4IGFlOTc1MjguLjAzMjc0Y2IgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRW5jb2RlZC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRW5jb2RlZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUub3V0cHV0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRmFzdEluZm9zZXRTdHJlYW1Xcml0ZXJPdXRwdXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRmFzdEluZm9zZXRTdHJlYW1Xcml0ZXJPdXRwdXQuamF2YQppbmRleCAwNDI0MDE2Li42MzUwYWZiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0Zhc3RJbmZvc2V0U3RyZWFtV3JpdGVyT3V0cHV0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9GYXN0SW5mb3NldFN0cmVhbVdyaXRlck91dHB1dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDQ2ICsyMiw0MjMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUub3V0cHV0OwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQoraW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5KQVhCQ29udGV4dEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLk5hbWU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLlhNTFNlcmlhbGl6ZXI7CiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLkJhc2U2NERhdGE7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuRW5jb2RpbmdDb25zdGFudHM7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5TdEFYRG9jdW1lbnRTZXJpYWxpemVyOwotCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuVm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKIC8qKgotICoge0BsaW5rIFhtbE91dHB1dH0gZm9yIHtAbGluayBTdEFYRG9jdW1lbnRTZXJpYWxpemVyfS4KKyAqIHtAbGluayBYbWxPdXRwdXR9IGZvciB7QGxpbmsgTG93TGV2ZWxTdEFYRG9jdW1lbnRTZXJpYWxpemVyfS4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIGluZGV4aW5nIG9mIGVsZW1lbnRzLCBhdHRyaWJ1dGVzCisgKiBhbmQgbG9jYWwgbmFtZXMgdGhhdCBhcmUga25vd24gdG8gSkFYQiBieSB3YXkgb2YgdGhlIEpBWEJDb250ZXh0IChnZW5lcmF0ZWQKKyAqIGZyb20gSkFYQiBiZWFucyBvciBzY2hlbWEpLiBUaGUgcHJlLWVuY29kZWQgVVRGLTggcmVwcmVzZW50YXRpb25zIG9mIGtub3duCisgKiBsb2NhbCBuYW1lcyBhcmUgYWxzbyB1dGlsaXplZC4KKyAqIDxwPgorICogVGhlIGxvb2t1cCBvZiAgZWxlbWVudHMsIGF0dHJpYnV0ZXMgYW5kIGxvY2FsIG5hbWVzIHdpdGggcmVzcGVjdCB0byBhIGNvbnRleHQKKyAqIGlzIHZlcnkgZWZmaWNpZW50LiBJdCByZWxpZXMgb24gYW4gaW5jcmVtZW50aW5nIGJhc2UgbGluZSBzbyB0aGF0IGxvb2sgdXAgaXMKKyAqIHBlcmZvcm1lZCBpbiBPKDEpIHRpbWUgYW5kIG9ubHkgdXNlcyBzdGF0aWMgbWVtb3J5LiBXaGVuIHRoZSBiYXNlIGxpbmUgcmVhY2hlcworICogYSBwb2ludCB3aGVyZSBpbnRlZ2VyIG92ZXJmbG93IHdpbGwgb2NjdXIgdGhlIGFycmF5cyBhbmQgYmFzZSBsaW5lIGFyZSByZXNldAorICogKHN1Y2ggYW4gZXZlbnQgaXMgcmFyZSBhbmQgd2lsbCBoYXZlIGxpdHRsZSBpbXBhY3Qgb24gcGVyZm9ybWFuY2UpLgorICogPHA+CisgKiBBIHdlYWsgbWFwIG9mIEpBWEIgY29udGV4dHMgdG8gb3B0aW1pemVkIHRhYmxlcyBmb3IgYXR0cmlidXRlcywgZWxlbWVudHMgYW5kCisgKiBsb2NhbCBuYW1lcyBpcyB1dGlsaXplZCBhbmQgc3RvcmVkIG9uIHRoZSBMb3dMZXZlbCBTdEFYIHNlcmlhbGl6ZXIuIFRodXMsCisgKiBvcHRpbWl6ZWQgc2VyaWFsaXppbmcgY2FuIHdvcmsgb3RoZXIgbXVsdGlwbGUgc2VyaWFsaXppbmcgb2YgSkFYQiBiZWFucyB1c2luZworICogdGhlIHNhbWUgTG93TGV2ZWwgU3RBWCBzZXJpYWxpemVyIGluc3RhbmNlLiBUaGlzIGFwcHJvYWNoIHdvcmtzIGJlc3Qgd2hlbiBKQVhCCisgKiBjb250ZXh0cyBhcmUgb25seSBjcmVhdGVkIG9uY2UgcGVyIHNjaGVtYSBvciBKQVhCIGJlYW5zICh3aGljaCBpcyB0aGUgcmVjb21tZW5kZWQKKyAqIHByYWN0aWNlIGFzIHRoZSBjcmVhdGlvbiBKQVhCIGNvbnRleHRzIGFyZSBleHBlbnNpdmUsIHRoZXkgYXJlIHRocmVhZCBzYWZlIGFuZAorICogY2FuIGJlIHJldXNlZCkuCiAgKgotICogQGF1dGhvciBQYXVsIFNhbmRvei4KKyAqIEBhdXRob3IgUGF1bC5TYW5kb3pAU3VuLkNvbQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRmFzdEluZm9zZXRTdHJlYW1Xcml0ZXJPdXRwdXQgZXh0ZW5kcyBYTUxTdHJlYW1Xcml0ZXJPdXRwdXQgewogICAgIHByaXZhdGUgZmluYWwgU3RBWERvY3VtZW50U2VyaWFsaXplciBmaW91dDsKKyAgICBwcml2YXRlIGZpbmFsIEVuY29kZWRbXSBsb2NhbE5hbWVzOworICAgIHByaXZhdGUgZmluYWwgVGFibGVzUGVySkFYQkNvbnRleHQgdGFibGVzOwogCi0gICAgcHVibGljIEZhc3RJbmZvc2V0U3RyZWFtV3JpdGVyT3V0cHV0KFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIgb3V0KSB7Ci0gICAgICAgIHN1cGVyKG91dCk7Ci0gICAgICAgIHRoaXMuZmlvdXQgPSBvdXQ7CisgICAgLyoqCisgICAgICogSG9sZGVyIGZvciB0aGUgb3B0aW16ZWQgZWxlbWVudCwgYXR0cmlidXRlIGFuZAorICAgICAqIGxvY2FsIG5hbWUgdGFibGVzLgorICAgICAqLworICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBUYWJsZXNQZXJKQVhCQ29udGV4dCB7CisgICAgICAgIGZpbmFsIGludFtdIGVsZW1lbnRJbmRleGVzOworICAgICAgICBmaW5hbCBpbnRbXSBhdHRyaWJ1dGVJbmRleGVzOworICAgICAgICBmaW5hbCBpbnRbXSBsb2NhbE5hbWVJbmRleGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoZSBpbmRleAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGluZGV4T2Zmc2V0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGhlIG1heGltdW0ga25vd24gdmFsdWUgb2YgYW4gaW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGludCBtYXhJbmRleDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVHJ1ZSBpZiB0aGUgdGFibGVzIHJlcXVpcmUgY2xlYXJpbmcKKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gcmVxdWlyZXNDbGVhcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IHNldCBvZiB0YWJsZXMgZm9yIGEgSkFYQiBjb250ZXh0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQHBhcmFtIGNvbnRlbnQgdGhlIEpBWEIgY29udGV4dC4KKyAgICAgICAgICogQHBhcmFtIGluaXRpYWxJbmRleE9mZnNldCB0aGUgaW5pdGlhbCBpbmRleCBvZmZzZXQgdG8gY2FsY3VsYXRlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1heGltdW0gcG9zc2libGUgaW5kZXgKKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIFRhYmxlc1BlckpBWEJDb250ZXh0KEpBWEJDb250ZXh0SW1wbCBjb250ZXh0LCBpbnQgaW5pdGlhbEluZGV4T2Zmc2V0KSB7CisgICAgICAgICAgICBlbGVtZW50SW5kZXhlcyA9IG5ldyBpbnRbY29udGV4dC5nZXROdW1iZXJPZkVsZW1lbnROYW1lcygpXTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUluZGV4ZXMgPSBuZXcgaW50W2NvbnRleHQuZ2V0TnVtYmVyT2ZBdHRyaWJ1dGVOYW1lcygpXTsKKyAgICAgICAgICAgIGxvY2FsTmFtZUluZGV4ZXMgPSBuZXcgaW50W2NvbnRleHQuZ2V0TnVtYmVyT2ZMb2NhbE5hbWVzKCldOworCisgICAgICAgICAgICBpbmRleE9mZnNldCA9IDE7CisgICAgICAgICAgICBtYXhJbmRleCA9IGluaXRpYWxJbmRleE9mZnNldCArIGVsZW1lbnRJbmRleGVzLmxlbmd0aCArIGF0dHJpYnV0ZUluZGV4ZXMubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVpcmUgdGhhdCB0YWJsZXMgYXJlIGNsZWFyZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCByZXF1aXJlQ2xlYXJUYWJsZXMoKSB7CisgICAgICAgICAgICByZXF1aXJlc0NsZWFyID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhciBvciByZXNldCB0aGUgdGFibGVzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQHBhcmFtIGluaXRpYWxJbmRleE9mZnNldCB0aGUgaW5pdGlhbCBpbmRleCBvZmZzZXQgdG8gY2FsY3VsYXRlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1heGltdW0gcG9zc2libGUgaW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyT3JSZXNldFRhYmxlcyhpbnQgaW50aWFsSW5kZXhPZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChyZXF1aXJlc0NsZWFyKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZXNDbGVhciA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IG9mZnNldCB0byBuZXcgcG9zaXRpb24KKyAgICAgICAgICAgICAgICBpbmRleE9mZnNldCArPSBtYXhJbmRleDsKKyAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgbWF4aW11bSBrbm93biB2YWx1ZSBvZiBhbiBpbmRleAorICAgICAgICAgICAgICAgIG1heEluZGV4ID0gaW50aWFsSW5kZXhPZmZzZXQgKyBlbGVtZW50SW5kZXhlcy5sZW5ndGggKyBhdHRyaWJ1dGVJbmRleGVzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggZnJlZSBzcGFjZQorICAgICAgICAgICAgICAgIC8vIElmIG92ZXJmbG93CisgICAgICAgICAgICAgICAgaWYgKChpbmRleE9mZnNldCArIG1heEluZGV4KSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJBbGwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBtYXhpbXVtIGtub3duIHZhbHVlIG9mIGFuIGluZGV4CisgICAgICAgICAgICAgICAgbWF4SW5kZXggPSBpbnRpYWxJbmRleE9mZnNldCArIGVsZW1lbnRJbmRleGVzLmxlbmd0aCArIGF0dHJpYnV0ZUluZGV4ZXMubGVuZ3RoOworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBmcmVlIHNwYWNlCisgICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICBpZiAoKGluZGV4T2Zmc2V0ICsgbWF4SW5kZXgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXNldEFsbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhckFsbCgpIHsKKyAgICAgICAgICAgIGNsZWFyKGVsZW1lbnRJbmRleGVzKTsKKyAgICAgICAgICAgIGNsZWFyKGF0dHJpYnV0ZUluZGV4ZXMpOworICAgICAgICAgICAgY2xlYXIobG9jYWxOYW1lSW5kZXhlcyk7CisgICAgICAgICAgICBpbmRleE9mZnNldCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXIoaW50W10gYXJyYXkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhcnJheVtpXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5jcmVtZW50IHRoZSBtYXhpbXVtIGtub3cgaW5kZXggdmFsdWUKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBpbmRleGVzIGFyZSBwcmVzZXJ2ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRNYXhJbmRleFZhbHVlKCkgeworICAgICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBtYXhpbXVtIHZhbHVlIG9mIGFuIGluZGV4CisgICAgICAgICAgICBtYXhJbmRleCsrOworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGZyZWUgc3BhY2UKKyAgICAgICAgICAgIC8vIElmIG92ZXJmbG93CisgICAgICAgICAgICBpZiAoKGluZGV4T2Zmc2V0ICsgbWF4SW5kZXgpIDwgMCkgeworICAgICAgICAgICAgICAgIHJlc2V0QWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7CisgICAgICAgICAgICBjbGVhcihlbGVtZW50SW5kZXhlcyk7CisgICAgICAgICAgICBjbGVhcihhdHRyaWJ1dGVJbmRleGVzKTsKKyAgICAgICAgICAgIGNsZWFyKGxvY2FsTmFtZUluZGV4ZXMpOworICAgICAgICAgICAgaW5kZXhPZmZzZXQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KGludFtdIGFycmF5KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID4gaW5kZXhPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtpXSAtIGluZGV4T2Zmc2V0ICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXh0KFBjZGF0YSB2YWx1ZSwgYm9vbGVhbiBuZWVkc1NlcGFyYXRpbmdXaGl0ZXNwYWNlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYobmVlZHNTZXBhcmF0aW5nV2hpdGVzcGFjZSkgewotICAgICAgICAgICAgZmlvdXQud3JpdGVDaGFyYWN0ZXJzKCIgIik7CisgICAgLyoqCisgICAgICogSG9sZGVyIG9mIEpBWEIgY29udGV4dHMgLT4gdGFibGVzLgorICAgICAqIDxwPgorICAgICAqIEFuIGluc3RhbmNlIHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZQorICAgICAqIHtAbGluayBMb3dMZXZlbFN0QVhEb2N1bWVudFNlcmlhbGl6ZXJ9LgorICAgICAqLworICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBBcHBEYXRhIGltcGxlbWVudHMgVm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YSB7CisgICAgICAgIGZpbmFsIE1hcDxKQVhCQ29udGV4dCwgVGFibGVzUGVySkFYQkNvbnRleHQ+IGNvbnRleHRzID0KKyAgICAgICAgICAgICAgICBuZXcgV2Vha0hhc2hNYXA8SkFYQkNvbnRleHQsIFRhYmxlc1BlckpBWEJDb250ZXh0PigpOworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFRhYmxlc1BlckpBWEJDb250ZXh0PiBjb2xsZWN0aW9uT2ZDb250ZXh0cyA9IGNvbnRleHRzLnZhbHVlcygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhciBhbGwgdGhlIHRhYmxlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgZm9yKFRhYmxlc1BlckpBWEJDb250ZXh0IGMgOiBjb2xsZWN0aW9uT2ZDb250ZXh0cykKKyAgICAgICAgICAgICAgICBjLnJlcXVpcmVDbGVhclRhYmxlcygpOwogICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZhc3RJbmZvc2V0U3RyZWFtV3JpdGVyT3V0cHV0KFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIgb3V0LAorICAgICAgICAgICAgSkFYQkNvbnRleHRJbXBsIGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIob3V0KTsKKworICAgICAgICB0aGlzLmZpb3V0ID0gb3V0OworICAgICAgICB0aGlzLmxvY2FsTmFtZXMgPSBjb250ZXh0LmdldFVURjhOYW1lVGFibGUoKTsKKworICAgICAgICBmaW5hbCBWb2NhYnVsYXJ5QXBwbGljYXRpb25EYXRhIHZvY2FiQXBwRGF0YSA9IGZpb3V0LmdldFZvY2FidWxhcnlBcHBsaWNhdGlvbkRhdGEoKTsKKyAgICAgICAgQXBwRGF0YSBhcHBEYXRhID0gbnVsbDsKKyAgICAgICAgaWYgKHZvY2FiQXBwRGF0YSA9PSBudWxsIHx8ICEodm9jYWJBcHBEYXRhIGluc3RhbmNlb2YgQXBwRGF0YSkpIHsKKyAgICAgICAgICAgIGFwcERhdGEgPSBuZXcgQXBwRGF0YSgpOworICAgICAgICAgICAgZmlvdXQuc2V0Vm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YShhcHBEYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFwcERhdGEgPSAoQXBwRGF0YSl2b2NhYkFwcERhdGE7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBUYWJsZXNQZXJKQVhCQ29udGV4dCB0YWJsZXNQZXJDb250ZXh0ID0gYXBwRGF0YS5jb250ZXh0cy5nZXQoY29udGV4dCk7CisgICAgICAgIGlmICh0YWJsZXNQZXJDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRhYmxlcyA9IHRhYmxlc1BlckNvbnRleHQ7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIE9idGFpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lIGluZGV4LiBUaHVzIHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgICAgICogY2FsY3VsYXRlIHRoZSBtYXhpbXVtIGluZGV4IHZhbHVlIHdoZW4gc2VyaWFsaXppbmcgZm9yIHRoaXMgY29udGV4dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0YWJsZXMuY2xlYXJPclJlc2V0VGFibGVzKG91dC5nZXRMb2NhbE5hbWVJbmRleCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhYmxlcyA9IG5ldyBUYWJsZXNQZXJKQVhCQ29udGV4dChjb250ZXh0LCBvdXQuZ2V0TG9jYWxOYW1lSW5kZXgoKSk7CisgICAgICAgICAgICBhcHBEYXRhLmNvbnRleHRzLnB1dChjb250ZXh0LCB0YWJsZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChYTUxTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIGJvb2xlYW4gZnJhZ21lbnQsCisgICAgICAgICAgICBpbnRbXSBuc1VyaUluZGV4MnByZWZpeEluZGV4LCBOYW1lc3BhY2VDb250ZXh0SW1wbCBuc0NvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnREb2N1bWVudChzZXJpYWxpemVyLCBmcmFnbWVudCwgbnNVcmlJbmRleDJwcmVmaXhJbmRleCwgbnNDb250ZXh0KTsKKworICAgICAgICBpZiAoZnJhZ21lbnQpCisgICAgICAgICAgICBmaW91dC5pbml0aWF0ZUxvd0xldmVsV3JpdGluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KGJvb2xlYW4gZnJhZ21lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdXBlci5lbmREb2N1bWVudChmcmFnbWVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVnaW5TdGFydFRhZyhOYW1lIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxUZXJtaW5hdGlvbkFuZE1hcmsoKTsKKworICAgICAgICBpZiAobnNDb250ZXh0LmdldEN1cnJlbnQoKS5jb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBxTmFtZUluZGV4ID0gdGFibGVzLmVsZW1lbnRJbmRleGVzW25hbWUucU5hbWVJbmRleF0gLSB0YWJsZXMuaW5kZXhPZmZzZXQ7CisgICAgICAgICAgICBpZiAocU5hbWVJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbFN0YXJ0RWxlbWVudEluZGV4ZWQoRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVCwgcU5hbWVJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRhYmxlcy5lbGVtZW50SW5kZXhlc1tuYW1lLnFOYW1lSW5kZXhdID0gZmlvdXQuZ2V0TmV4dEVsZW1lbnRJbmRleCgpICsgdGFibGVzLmluZGV4T2Zmc2V0OworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IHByZWZpeCA9IG5zVXJpSW5kZXgycHJlZml4SW5kZXhbbmFtZS5uc1VyaUluZGV4XTsKKyAgICAgICAgICAgICAgICB3cml0ZUxpdGVyYWwoRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVCB8IEVuY29kaW5nQ29uc3RhbnRzLkVMRU1FTlRfTElURVJBTF9RTkFNRV9GTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zQ29udGV4dC5nZXRQcmVmaXgocHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZWdpblN0YXJ0VGFnV2l0aE5hbWVzcGFjZXMobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpblN0YXJ0VGFnV2l0aE5hbWVzcGFjZXMoTmFtZSBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBOYW1lc3BhY2VDb250ZXh0SW1wbC5FbGVtZW50IG5zZSA9IG5zQ29udGV4dC5nZXRDdXJyZW50KCk7CisKKyAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbFN0YXJ0TmFtZXNwYWNlcygpOworICAgICAgICBmb3IgKGludCBpID0gbnNlLmNvdW50KCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IG5zZS5nZXROc1VyaShpKTsKKyAgICAgICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPT0gMCAmJiBuc2UuZ2V0QmFzZSgpID09IDEpCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgLy8gbm8gcG9pbnQgaW4gZGVmaW5pbnQgeG1sbnM9Jycgb24gdGhlIHJvb3QKKyAgICAgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxOYW1lc3BhY2UobnNlLmdldFByZWZpeChpKSwgdXJpKTsKKyAgICAgICAgfQorICAgICAgICBmaW91dC53cml0ZUxvd0xldmVsRW5kTmFtZXNwYWNlcygpOworCisgICAgICAgIGZpbmFsIGludCBxTmFtZUluZGV4ID0gdGFibGVzLmVsZW1lbnRJbmRleGVzW25hbWUucU5hbWVJbmRleF0gLSB0YWJsZXMuaW5kZXhPZmZzZXQ7CisgICAgICAgIGlmIChxTmFtZUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxTdGFydEVsZW1lbnRJbmRleGVkKDAsIHFOYW1lSW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFibGVzLmVsZW1lbnRJbmRleGVzW25hbWUucU5hbWVJbmRleF0gPSBmaW91dC5nZXROZXh0RWxlbWVudEluZGV4KCkgKyB0YWJsZXMuaW5kZXhPZmZzZXQ7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBwcmVmaXggPSBuc1VyaUluZGV4MnByZWZpeEluZGV4W25hbWUubnNVcmlJbmRleF07CisgICAgICAgICAgICB3cml0ZUxpdGVyYWwoRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVF9MSVRFUkFMX1FOQU1FX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5zQ29udGV4dC5nZXRQcmVmaXgocHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgbnNDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZShOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbFN0YXJ0QXR0cmlidXRlcygpOworCisgICAgICAgIGZpbmFsIGludCBxTmFtZUluZGV4ID0gdGFibGVzLmF0dHJpYnV0ZUluZGV4ZXNbbmFtZS5xTmFtZUluZGV4XSAtIHRhYmxlcy5pbmRleE9mZnNldDsKKyAgICAgICAgaWYgKHFOYW1lSW5kZXggPj0gMCkgeworICAgICAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbEF0dHJpYnV0ZUluZGV4ZWQocU5hbWVJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YWJsZXMuYXR0cmlidXRlSW5kZXhlc1tuYW1lLnFOYW1lSW5kZXhdID0gZmlvdXQuZ2V0TmV4dEF0dHJpYnV0ZUluZGV4KCkgKyB0YWJsZXMuaW5kZXhPZmZzZXQ7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBuYW1lc3BhY2VVUklJZCA9IG5hbWUubnNVcmlJbmRleDsKKyAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUklJZCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHdyaXRlTGl0ZXJhbChFbmNvZGluZ0NvbnN0YW50cy5BVFRSSUJVVEVfTElURVJBTF9RTkFNRV9GTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHJlZml4ID0gbnNVcmlJbmRleDJwcmVmaXhJbmRleFtuYW1lc3BhY2VVUklJZF07CisgICAgICAgICAgICAgICAgd3JpdGVMaXRlcmFsKEVuY29kaW5nQ29uc3RhbnRzLkFUVFJJQlVURV9MSVRFUkFMX1FOQU1FX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbnNDb250ZXh0LmdldFByZWZpeChwcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbnNDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTGl0ZXJhbChpbnQgdHlwZSwgTmFtZSBuYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgbG9jYWxOYW1lSW5kZXggPSB0YWJsZXMubG9jYWxOYW1lSW5kZXhlc1tuYW1lLmxvY2FsTmFtZUluZGV4XSAtIHRhYmxlcy5pbmRleE9mZnNldDsKKworICAgICAgICBpZiAobG9jYWxOYW1lSW5kZXggPCAwKSB7CisgICAgICAgICAgICB0YWJsZXMubG9jYWxOYW1lSW5kZXhlc1tuYW1lLmxvY2FsTmFtZUluZGV4XSA9IGZpb3V0LmdldE5leHRMb2NhbE5hbWVJbmRleCgpICsgdGFibGVzLmluZGV4T2Zmc2V0OworCisgICAgICAgICAgICBmaW91dC53cml0ZUxvd0xldmVsU3RhcnROYW1lTGl0ZXJhbCgKKyAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWVzW25hbWUubG9jYWxOYW1lSW5kZXhdLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxTdGFydE5hbWVMaXRlcmFsKAorICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kU3RhcnRUYWcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW91dC53cml0ZUxvd0xldmVsRW5kU3RhcnRFbGVtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kVGFnKE5hbWUgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbEVuZEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRUYWcoaW50IHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbEVuZEVsZW1lbnQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRleHQoUGNkYXRhIHZhbHVlLCBib29sZWFuIG5lZWRzU2VwYXJhdGluZ1doaXRlc3BhY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZWVkc1NlcGFyYXRpbmdXaGl0ZXNwYWNlKQorICAgICAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbFRleHQoIiAiKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBpZiB0aGUgQ2hhclNlcXVlbmNlIGlzIGZyb20gYSBiYXNlNjRCaW5hcnkgZGF0YSB0eXBlCiAgICAgICAgICAqLwogICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEJhc2U2NERhdGEpKSB7Ci0gICAgICAgICAgICAvLyBXcml0ZSBvdXQgY2hhcmFjdGVycwotICAgICAgICAgICAgZmlvdXQud3JpdGVDaGFyYWN0ZXJzKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgaWYobGVuIDxidWYubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdmFsdWUud3JpdGVUbyhidWYsIDApOworICAgICAgICAgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxUZXh0KGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbFRleHQodmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmaW5hbCBCYXNlNjREYXRhIGRhdGFWYWx1ZSA9IChCYXNlNjREYXRhKXZhbHVlOwogICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBvY3RldHMgdXNpbmcgdGhlIGJhc2U2NCBlbmNvZGluZyBhbGdvcml0aG0KLSAgICAgICAgICAgIGZpb3V0LndyaXRlT2N0ZXRzKGRhdGFWYWx1ZS5nZXQoKSwgMCwgZGF0YVZhbHVlLmdldERhdGFMZW4oKSk7CisgICAgICAgICAgICBmaW91dC53cml0ZUxvd0xldmVsT2N0ZXRzKGRhdGFWYWx1ZS5nZXQoKSwgZGF0YVZhbHVlLmdldERhdGFMZW4oKSk7CiAgICAgICAgIH0KICAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nIHZhbHVlLCBib29sZWFuIG5lZWRzU2VwYXJhdGluZ1doaXRlc3BhY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZWVkc1NlcGFyYXRpbmdXaGl0ZXNwYWNlKQorICAgICAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbFRleHQoIiAiKTsKKworICAgICAgICBmaW91dC53cml0ZUxvd0xldmVsVGV4dCh2YWx1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBiZWdpblN0YXJ0VGFnKGludCBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxUZXJtaW5hdGlvbkFuZE1hcmsoKTsKKworICAgICAgICBpbnQgdHlwZSA9IEVuY29kaW5nQ29uc3RhbnRzLkVMRU1FTlQ7CisgICAgICAgIGlmIChuc0NvbnRleHQuZ2V0Q3VycmVudCgpLmNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICBmaW5hbCBOYW1lc3BhY2VDb250ZXh0SW1wbC5FbGVtZW50IG5zZSA9IG5zQ29udGV4dC5nZXRDdXJyZW50KCk7CisKKyAgICAgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxTdGFydE5hbWVzcGFjZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBuc2UuY291bnQoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IG5zZS5nZXROc1VyaShpKTsKKyAgICAgICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDAgJiYgbnNlLmdldEJhc2UoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAvLyBubyBwb2ludCBpbiBkZWZpbmludCB4bWxucz0nJyBvbiB0aGUgcm9vdAorICAgICAgICAgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxOYW1lc3BhY2UobnNlLmdldFByZWZpeChpKSwgdXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxFbmROYW1lc3BhY2VzKCk7CisKKyAgICAgICAgICAgIHR5cGU9IDA7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBib29sZWFuIGlzSW5kZXhlZCA9IGZpb3V0LndyaXRlTG93TGV2ZWxTdGFydEVsZW1lbnQoCisgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICBuc0NvbnRleHQuZ2V0UHJlZml4KHByZWZpeCksCisgICAgICAgICAgICAgICAgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgIG5zQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KSk7CisKKyAgICAgICAgaWYgKCFpc0luZGV4ZWQpCisgICAgICAgICAgICB0YWJsZXMuaW5jcmVtZW50TWF4SW5kZXhWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZShpbnQgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpb3V0LndyaXRlTG93TGV2ZWxTdGFydEF0dHJpYnV0ZXMoKTsKKworICAgICAgICBib29sZWFuIGlzSW5kZXhlZDsKKyAgICAgICAgaWYgKHByZWZpeCA9PSAtMSkKKyAgICAgICAgICAgIGlzSW5kZXhlZCA9IGZpb3V0LndyaXRlTG93TGV2ZWxBdHRyaWJ1dGUoIiIsICIiLCBsb2NhbE5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpc0luZGV4ZWQgPSBmaW91dC53cml0ZUxvd0xldmVsQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBuc0NvbnRleHQuZ2V0UHJlZml4KHByZWZpeCksCisgICAgICAgICAgICAgICAgICAgIG5zQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKTsKKworICAgICAgICBpZiAoIWlzSW5kZXhlZCkKKyAgICAgICAgICAgIHRhYmxlcy5pbmNyZW1lbnRNYXhJbmRleFZhbHVlKCk7CisKKyAgICAgICAgZmlvdXQud3JpdGVMb3dMZXZlbEF0dHJpYnV0ZVZhbHVlKHZhbHVlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0ZvcmtYbWxPdXRwdXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRm9ya1htbE91dHB1dC5qYXZhCmluZGV4IGY1ZTJkZjAuLjQyYzIyOWIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRm9ya1htbE91dHB1dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvRm9ya1htbE91dHB1dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUub3V0cHV0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTc3LDEyICs3Niw2IEBACiAgICAgICAgIHJocy5lbmRUYWcobmFtZSk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGxocy5mbHVzaCgpOwotICAgICAgICByaHMuZmx1c2goKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBiZWdpblN0YXJ0VGFnKGludCBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgbGhzLmJlZ2luU3RhcnRUYWcocHJlZml4LGxvY2FsTmFtZSk7CiAgICAgICAgIHJocy5iZWdpblN0YXJ0VGFnKHByZWZpeCxsb2NhbE5hbWUpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9JblBsYWNlRE9NT3V0cHV0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0luUGxhY2VET01PdXRwdXQuamF2YQppbmRleCA2MTMwZDU2Li4xNzgzNWEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0luUGxhY2VET01PdXRwdXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L0luUGxhY2VET01PdXRwdXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLm91dHB1dDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5Bc3NvY2lhdGlvbk1hcDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvSW5kZW50aW5nVVRGOFhtbE91dHB1dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9JbmRlbnRpbmdVVEY4WG1sT3V0cHV0LmphdmEKaW5kZXggNTA3MDdmYy4uZDE4OTQzMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9JbmRlbnRpbmdVVEY4WG1sT3V0cHV0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9JbmRlbnRpbmdVVEY4WG1sT3V0cHV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5vdXRwdXQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9NVE9NWG1sT3V0cHV0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L01UT01YbWxPdXRwdXQuamF2YQppbmRleCA2ZjkxM2QyLi43ZTEyY2U4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L01UT01YbWxPdXRwdXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L01UT01YbWxPdXRwdXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLm91dHB1dDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xMjYsOCArMTI1LDQgQEAKICAgICAgICAgfQogICAgICAgICBuZXh0LnRleHQodmFsdWUsIG5lZWRzU2VwYXJhdGluZ1doaXRlc3BhY2UpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBuZXh0LmZsdXNoKCk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9OYW1lc3BhY2VDb250ZXh0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9OYW1lc3BhY2VDb250ZXh0SW1wbC5qYXZhCmluZGV4IGE0MDc2ZDkuLjJiYzgwYzIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvTmFtZXNwYWNlQ29udGV4dEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L05hbWVzcGFjZUNvbnRleHRJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5vdXRwdXQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjE2LDExICsyMTUsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZm9yY2UoQE5vdE51bGwgU3RyaW5nIHVyaSwgQE5vdE51bGwgU3RyaW5nIHByZWZpeCkgeworICAgICAgICAvLyBjaGVjayBmb3IgdGhlIGV4aXN0aW5nIGJpbmRpbmcKKyAgICAgICAgZm9yKCBpbnQgaT1zaXplLTE7IGk+PTA7IGktLSApIHsKKyAgICAgICAgICAgIGlmKHByZWZpeGVzW2ldLmVxdWFscyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgaWYobnNVcmlzW2ldLmVxdWFscyh1cmkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsgICAvLyBmb3VuZCBkdXBsaWNhdGUKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcmVmaXggaXMgdXNlZCBmb3IgYW5vdGhlciBuYW1lc3BhY2UuIHdlIG5lZWQgdG8gZGVjbGFyZSBpdAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwdXQodXJpLCBwcmVmaXgpOworICAgIH0KKwogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30uCisgICAgICogUHV0cyB0aGlzIG5ldyBiaW5kaW5nIGludG8gdGhlIGRlY2xhcmVkIHByZWZpeGVzIGxpc3QKKyAgICAgKiB3aXRob3V0IGRvaW5nIGFueSBkdXBsaWNhdGUgY2hlY2suCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICogICAgICBpZiBudWxsLCBhbiB1bmlxdWUgcHJlZml4IChpbmNsdWRpbmcgIiIpIGlzIGFsbG9jYXRlZC4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGZvcmNpYmx5IHNldCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLgorICAgICAqCisgICAgICogPHA+CisgICAgICogTW9zdCBvZiB0aGUgdGltZSB7QGxpbmsgI2RlY2xhcmVOYW1lc3BhY2UoU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pfSBzaGFsbCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgdGhlIGluZGV4IG9mIHRoaXMgbmV3IGJpbmRpbmcuCiAgICAgICovCiAgICAgcHVibGljIGludCBwdXQoQE5vdE51bGwgU3RyaW5nIHVyaSwgQE51bGxhYmxlIFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgaWYoc2l6ZT09bnNVcmlzLmxlbmd0aCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9QY2RhdGEuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvUGNkYXRhLmphdmEKaW5kZXggNzI1ODYzNC4uMjI0NTRiOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9QY2RhdGEuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L1BjZGF0YS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUub3V0cHV0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvU0FYT3V0cHV0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L1NBWE91dHB1dC5qYXZhCmluZGV4IDExMTUxOGEuLjA2MGQ0ZDEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvU0FYT3V0cHV0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9TQVhPdXRwdXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLm91dHB1dDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L1VURjhYbWxPdXRwdXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvVVRGOFhtbE91dHB1dC5qYXZhCmluZGV4IDBiYWNlODUuLmY3NjAzZTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvVVRGOFhtbE91dHB1dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvVVRGOFhtbE91dHB1dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUub3V0cHV0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTMzLDYgKzMyLDcgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkRhdGF0eXBlQ29udmVydGVySW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuTmFtZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuWE1MU2VyaWFsaXplcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuTWFyc2hhbGxlckltcGw7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKQEAgLTgyLDYgKzgyLDExIEBACiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VTdGFydFRhZ1BlbmRpbmcgPSBmYWxzZTsKIAogICAgIC8qKgorICAgICAqIEBzZWUgTWFyc2hhbGxlckltcGwjaGVhZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyOworCisgICAgLyoqCiAgICAgICoKICAgICAgKiBAcGFyYW0gbG9jYWxOYW1lcwogICAgICAqICAgICAgbG9jYWwgbmFtZXMgZW5jb2RlZCBpbiBVVEYtOC4KQEAgLTkzLDYgKzk4LDEwIEBACiAgICAgICAgICAgICBwcmVmaXhlc1tpXSA9IG5ldyBFbmNvZGVkKCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChYTUxTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIGJvb2xlYW4gZnJhZ21lbnQsIGludFtdIG5zVXJpSW5kZXgycHJlZml4SW5kZXgsIE5hbWVzcGFjZUNvbnRleHRJbXBsIG5zQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoc2VyaWFsaXplciwgZnJhZ21lbnQsbnNVcmlJbmRleDJwcmVmaXhJbmRleCxuc0NvbnRleHQpOwpAQCAtMTAxLDYgKzExMCwxMCBAQAogICAgICAgICBpZighZnJhZ21lbnQpIHsKICAgICAgICAgICAgIHdyaXRlKFhNTF9ERUNMKTsKICAgICAgICAgfQorICAgICAgICBpZihoZWFkZXIhPW51bGwpIHsKKyAgICAgICAgICAgIHRleHRCdWZmZXIuc2V0KGhlYWRlcik7CisgICAgICAgICAgICB0ZXh0QnVmZmVyLndyaXRlKHRoaXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoYm9vbGVhbiBmcmFnbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CkBAIC0zNzcsMTMgKzM5MCw2IEBACiAgICAgICAgIG9jdGV0QnVmZmVySW5kZXggPSAwOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmx1c2hCdWZmZXIoKTsKLSAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgfQotCi0KLQogICAgIHN0YXRpYyBieXRlW10gdG9CeXRlcyhTdHJpbmcgcykgewogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbcy5sZW5ndGgoKV07CiAgICAgICAgIGZvciggaW50IGk9cy5sZW5ndGgoKS0xOyBpPj0wOyBpLS0gKQpAQCAtMzkxLDExICszOTcsMjMgQEAKICAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gWE1MTlNfRVFVQUxTID0gdG9CeXRlcygiIHhtbG5zPVwiIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFhNTE5TX0NPTE9OID0gdG9CeXRlcygiIHhtbG5zOiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFUVVBTFMgPSB0b0J5dGVzKCI9XCIiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQ0xPU0VfVEFHID0gdG9CeXRlcygiPC8iKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfVEFHID0gdG9CeXRlcygiLz4iKTsKKyAgICAvLyBwZXIgaW5zdGFuY2UgY29weSB0byBwcmV2ZW50IGFuIGF0dGFjayB3aGVyZSBtYWxpY2lvdXMgT3V0cHV0U3RyZWFtCisgICAgLy8gcmV3cml0ZXMgdGhlIGJ5dGUgYXJyYXkuCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gWE1MTlNfRVFVQUxTID0gX1hNTE5TX0VRVUFMUy5jbG9uZSgpOworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIFhNTE5TX0NPTE9OID0gX1hNTE5TX0NPTE9OLmNsb25lKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gRVFVQUxTID0gX0VRVUFMUy5jbG9uZSgpOworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIENMT1NFX1RBRyA9IF9DTE9TRV9UQUcuY2xvbmUoKTsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBFTVBUWV9UQUcgPSBfRU1QVFlfVEFHLmNsb25lKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gWE1MX0RFQ0wgPSBfWE1MX0RFQ0wuY2xvbmUoKTsKKworICAgIC8vIG1hc3RlcnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gX1hNTE5TX0VRVUFMUyA9IHRvQnl0ZXMoIiB4bWxucz1cIiIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBfWE1MTlNfQ09MT04gPSB0b0J5dGVzKCIgeG1sbnM6Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIF9FUVVBTFMgPSB0b0J5dGVzKCI9XCIiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gX0NMT1NFX1RBRyA9IHRvQnl0ZXMoIjwvIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIF9FTVBUWV9UQUcgPSB0b0J5dGVzKCIvPiIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBfWE1MX0RFQ0wgPSB0b0J5dGVzKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+Iik7CisKKyAgICAvLyBubyBuZWVkIHRvIGNvcHkKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfQllURV9BUlJBWSA9IG5ldyBieXRlWzBdOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBYTUxfREVDTCA9IHRvQnl0ZXMoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz4iKTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvWE1MRXZlbnRXcml0ZXJPdXRwdXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvWE1MRXZlbnRXcml0ZXJPdXRwdXQuamF2YQppbmRleCBjOTVmOWM1Li42OGIxOGQ1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L1hNTEV2ZW50V3JpdGVyT3V0cHV0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9YTUxFdmVudFdyaXRlck91dHB1dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUub3V0cHV0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTEyMyw4ICsxMjIsNCBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoUGNkYXRhIHZhbHVlLCBib29sZWFuIG5lZWRzU2VwYXJhdGluZ1doaXRlc3BhY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewogICAgICAgICB0ZXh0KHZhbHVlLnRvU3RyaW5nKCksbmVlZHNTZXBhcmF0aW5nV2hpdGVzcGFjZSk7CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvWE1MU3RyZWFtV3JpdGVyT3V0cHV0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L1hNTFN0cmVhbVdyaXRlck91dHB1dC5qYXZhCmluZGV4IDcwMDQ5NDYuLmZhZDA4MzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvWE1MU3RyZWFtV3JpdGVyT3V0cHV0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9YTUxTdHJlYW1Xcml0ZXJPdXRwdXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLm91dHB1dDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMSw2ICszMCw3IEBACiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CiAKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuSkFYQkNvbnRleHRJbXBsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5NYXJzaGFsbGVySW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuWE1MU2VyaWFsaXplcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlVubWFyc2hhbGxlckltcGw7CkBAIC0zOSw2ICszOSwxMSBAQAogCiAvKioKICAqIHtAbGluayBYbWxPdXRwdXR9IHRoYXQgd3JpdGVzIHRvIFN0QVgge0BsaW5rIFhNTFN0cmVhbVdyaXRlcn0uCisgKiA8cD4KKyAqIFRPRE86CisgKiBGaW5kaW5nIHRoZSBvcHRpbWl6ZWQgRkkgaW1wbGVtZW50YXRpb25zIGlzIGEgYml0IGhhY2t5IGFuZCBub3QgdmVyeQorICogZXh0ZW5zaWJsZS4gQ2FuIHdlIHVzZSB0aGUgc2VydmljZSBwcm92aWRlciBtZWNobmlzbSBpbiBnZW5lcmFsIGZvcgorICogY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIFhtbE91dHB1dEFic3RyYWN0SW1wbC4KICAqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCiAgKi8KQEAgLTQ4LDE1ICs1MywxNiBAQAogICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFhtbE91dHB1dH0gZnJvbSBhIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9LgogICAgICAqIFRoaXMgbWV0aG9kIHJlY29nbml6ZXMgYW4gRkkgU3RBWCB3cml0ZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYbWxPdXRwdXQgY3JlYXRlKFhNTFN0cmVhbVdyaXRlciBvdXQpIHsKKyAgICBwdWJsaWMgc3RhdGljIFhtbE91dHB1dCBjcmVhdGUoWE1MU3RyZWFtV3JpdGVyIG91dCwgSkFYQkNvbnRleHRJbXBsIGNvbnRleHQpIHsKICAgICAgICAgLy8gdHJ5IG9wdGltaXplZCBwYXRoCi0gICAgICAgIGlmKG91dC5nZXRDbGFzcygpPT1GSV9TVEFYX1dSSVRFUl9DTEFTUykgeworICAgICAgICBmaW5hbCBDbGFzcyB3cml0ZXJDbGFzcyA9IG91dC5nZXRDbGFzcygpOworICAgICAgICBpZiAod3JpdGVyQ2xhc3M9PUZJX1NUQVhfV1JJVEVSX0NMQVNTKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBGSV9PVVRQVVRfQ1RPUi5uZXdJbnN0YW5jZShvdXQpOworICAgICAgICAgICAgICAgIHJldHVybiBGSV9PVVRQVVRfQ1RPUi5uZXdJbnN0YW5jZShvdXQsIGNvbnRleHQpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZihTVEFYRVhfV1JJVEVSX0NMQVNTIT1udWxsICYmIFNUQVhFWF9XUklURVJfQ0xBU1MuaXNBc3NpZ25hYmxlRnJvbShvdXQuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgaWYgKFNUQVhFWF9XUklURVJfQ0xBU1MhPW51bGwgJiYgU1RBWEVYX1dSSVRFUl9DTEFTUy5pc0Fzc2lnbmFibGVGcm9tKHdyaXRlckNsYXNzKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gU1RBWEVYX09VVFBVVF9DVE9SLm5ld0luc3RhbmNlKG91dCk7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtNzAsNyArNzYsNyBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgb3V0OwogCi0gICAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gYnVmID0gbmV3IGNoYXJbMjU2XTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzI1Nl07CiAKICAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtV3JpdGVyT3V0cHV0KFhNTFN0cmVhbVdyaXRlciBvdXQpIHsKICAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CkBAIC0xNTQsNyArMTYwLDE1IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBpbml0RklTdEFYV3JpdGVyQ2xhc3MoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gTWFyc2hhbGxlckltcGwuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoImNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50U2VyaWFsaXplciIpOworICAgICAgICAgICAgQ2xhc3MgbGxmaXN3ID0gTWFyc2hhbGxlckltcGwuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgbG9hZENsYXNzKCJjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuc3RheC5Mb3dMZXZlbEZhc3RJbmZvc2V0U3RyZWFtV3JpdGVyIik7CisgICAgICAgICAgICBDbGFzcyBzZHMgPSBNYXJzaGFsbGVySW1wbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLgorICAgICAgICAgICAgICAgICAgICBsb2FkQ2xhc3MoImNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50U2VyaWFsaXplciIpOworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgU3RBWERvY3VtZW50U2VyaWFsaXplciBpbXBsZW1lbnRzIExvd0xldmVsRmFzdEluZm9zZXRTdHJlYW1Xcml0ZXIKKyAgICAgICAgICAgIGlmIChsbGZpc3cuaXNBc3NpZ25hYmxlRnJvbShzZHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBzZHM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQpAQCAtMTYyLDggKzE3NiwxMSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3I8PyBleHRlbmRzIFhtbE91dHB1dD4gaW5pdEZhc3RJbmZvc2V0T3V0cHV0Q2xhc3MoKSB7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoRklfU1RBWF9XUklURVJfQ0xBU1MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKwogICAgICAgICAgICAgQ2xhc3MgYyA9IFVubWFyc2hhbGxlckltcGwuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5vdXRwdXQuRmFzdEluZm9zZXRTdHJlYW1Xcml0ZXJPdXRwdXQiKTsKLSAgICAgICAgICAgIHJldHVybiBjLmdldENvbnN0cnVjdG9yKEZJX1NUQVhfV1JJVEVSX0NMQVNTKTsKKyAgICAgICAgICAgIHJldHVybiBjLmdldENvbnN0cnVjdG9yKEZJX1NUQVhfV1JJVEVSX0NMQVNTLCBKQVhCQ29udGV4dEltcGwuY2xhc3MpOwogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KQEAgLTE3Nyw3ICsxOTQsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgaW5pdFN0QVhFeFdyaXRlckNsYXNzKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIE1hcnNoYWxsZXJJbXBsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKCJvcmcuanZuZXQuc3RheGV4LlhNTFN0cmVhbVdyaXRlckV4Iik7CisgICAgICAgICAgICByZXR1cm4gTWFyc2hhbGxlckltcGwuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoImNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguWE1MU3RyZWFtV3JpdGVyRXgiKTsKICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L1htbE91dHB1dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9YbWxPdXRwdXQuamF2YQppbmRleCA5MTMyZWIzLi4zN2JhMWVkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L1htbE91dHB1dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvWG1sT3V0cHV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTEgKzIyLDkgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUub3V0cHV0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwpAQCAtMTE2LDggKzExNCw5IEBACiAgICAgICogICAgICB0cnVlIGlmIHdlIGFyZSBtYXJzaGFsbGluZyBhIGZyYWdtZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoWE1MU2VyaWFsaXplciBzZXJpYWxpemVyLCBib29sZWFuIGZyYWdtZW50LCBpbnRbXSBuc1VyaUluZGV4MnByZWZpeEluZGV4LCBOYW1lc3BhY2VDb250ZXh0SW1wbCBuc0NvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb247CisKICAgICAvKioKLSAgICAgKiBDYWxsZWQgYXQgdGhlIHZlcnkgZW5kLgorICAgICAqIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQuIFRoaXMgaXMgdGhlIGxhc3QgbWV0aG9kIHRvIGJlIGludm9rZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZnJhZ21lbnQKICAgICAgKiAgICAgIGZhbHNlIGlmIHdlIGFyZSB3cml0aW5nIHRoZSB3aG9sZSBkb2N1bWVudC4KQEAgLTE3MiwxMSArMTcxLDQgQEAKICAgICAgKiBAcGFyYW0gbmVlZHNTZXBhcmF0aW5nV2hpdGVzcGFjZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRleHQoIFBjZGF0YSB2YWx1ZSwgYm9vbGVhbiBuZWVkc1NlcGFyYXRpbmdXaGl0ZXNwYWNlICkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEZsdXNoIHRoZSBvdXRwdXQuCi0gICAgICoKLSAgICAgKiBAc2VlIE91dHB1dFN0cmVhbSNmbHVzaCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvWG1sT3V0cHV0QWJzdHJhY3RJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L1htbE91dHB1dEFic3RyYWN0SW1wbC5qYXZhCmluZGV4IDkxOGU0YTUuLmFmMzYwN2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvWG1sT3V0cHV0QWJzdHJhY3RJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9YbWxPdXRwdXRBYnN0cmFjdEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLm91dHB1dDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xMTAsMTQgKzEwOSw2IEBACiAgICAgfQogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZFRhZyhpbnQgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uOwogCi0gICAgLyoqCi0gICAgICogRmx1c2ggdGhlIG91dHB1dC4KLSAgICAgKgotICAgICAqIEBzZWUgT3V0cHV0U3RyZWFtI2ZsdXNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICB9Ci0KIAogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvb3V0cHV0L3BhY2thZ2UtaW5mby5qYXZhCmluZGV4IDI2MjZmNDQuLmI3MTVlYTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9vdXRwdXQvcGFja2FnZS1pbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL291dHB1dC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qKgogICogQ29kZSB0aGF0IHdyaXRlcyB3ZWxsLWZvcm1lZCBYTUwgKHtAbGluayBYbWxPdXRwdXR9IGFuZCBpdHMgaW1wbGVtZW50YXRpb25zfS4KICAqLwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wYWNrYWdlLmh0bWwKaW5kZXggZDU5OWU5NC4uOThiYzQ4NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPgogPGJvZHk+CiBDb2RlIHRoYXQgaW1wbGVtZW50cyBKQVhCQ29udGV4dCwgVW5tYXJzaGFsbGVyLCBhbmQgTWFyc2hhbGxlci4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9BcnJheUVSUHJvcGVydHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9BcnJheUVSUHJvcGVydHkuamF2YQppbmRleCAzNjZmNzBiLi40NzZiYzA3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlFUlByb3BlcnR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5RVJQcm9wZXJ0eS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucHJvcGVydHk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzcsMTIgKzM2LDE1IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkpBWEJDb250ZXh0SW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuTmFtZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuWE1MU2VyaWFsaXplcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5MaXN0ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5DaGlsZExvYWRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlRhZ05hbWU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5Mb2FkZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5SZWNlaXZlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlNjb3BlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuVW5tYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5Yc2lOaWxMb2FkZXI7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKQEAgLTc1LDE4ICs3NywzMCBAQAogICAgICAgICB0aGlzLmlzV3JhcHBlck5pbGxhYmxlID0gaXNXcmFwcGVyTmlsbGFibGU7CiAgICAgfQogCi0KKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGhhbmRsZSB0aGUgY29sbGVjdGlvbiB3cmFwcGVyIGVsZW1lbnQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSXRlbXNMb2FkZXIgZXh0ZW5kcyBMb2FkZXIgewotICAgICAgICBwdWJsaWMgSXRlbXNMb2FkZXIoUU5hbWVNYXA8Q2hpbGRMb2FkZXI+IGNoaWxkcmVuKSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBY2Nlc3NvciBhY2M7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdGVyIGxpc3RlcjsKKworICAgICAgICBwdWJsaWMgSXRlbXNMb2FkZXIoQWNjZXNzb3IgYWNjLCBMaXN0ZXIgbGlzdGVyLCBRTmFtZU1hcDxDaGlsZExvYWRlcj4gY2hpbGRyZW4pIHsKICAgICAgICAgICAgIHN1cGVyKGZhbHNlKTsKKyAgICAgICAgICAgIHRoaXMuYWNjID0gYWNjOworICAgICAgICAgICAgdGhpcy5saXN0ZXIgPSBsaXN0ZXI7CiAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFVubWFyc2hhbGxpbmdDb250ZXh0LlN0YXRlIHN0YXRlLCBUYWdOYW1lIGVhKSB7Ci0gICAgICAgICAgICBzdGF0ZS5nZXRDb250ZXh0KCkuc3RhcnRTY29wZSgxKTsKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFVubWFyc2hhbGxpbmdDb250ZXh0LlN0YXRlIHN0YXRlLCBUYWdOYW1lIGVhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFVubWFyc2hhbGxpbmdDb250ZXh0IGNvbnRleHQgPSBzdGF0ZS5nZXRDb250ZXh0KCk7CisgICAgICAgICAgICBjb250ZXh0LnN0YXJ0U2NvcGUoMSk7CiAgICAgICAgICAgICAvLyBpbmhlcml0IHRoZSB0YXJnZXQgc28gdGhhdCBvdXIgY2hpbGRyZW4gY2FuIGFjY2VzcyBpdHMgdGFyZ2V0CiAgICAgICAgICAgICBzdGF0ZS50YXJnZXQgPSBzdGF0ZS5wcmV2LnRhcmdldDsKKworICAgICAgICAgICAgLy8gc3RhcnQgaXQgbm93LCBzbyB0aGF0IGV2ZW4gaWYgdGhlcmUncyBubyBjaGlsZHJlbiB3ZSBjYW4gc3RpbGwgcmV0dXJuIGVtcHR5IGNvbGxlY3Rpb24KKyAgICAgICAgICAgIGNvbnRleHQuZ2V0U2NvcGUoMCkuc3RhcnQoYWNjLGxpc3Rlcik7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIGZpbmFsIFFOYW1lTWFwPENoaWxkTG9hZGVyPiBjaGlsZHJlbjsKQEAgLTE1Nyw3ICsxNzEsMTAgQEAKICAgICAgICAgICAgIFVubWFyc2hhbGxlckNoYWluIGMgPSBuZXcgVW5tYXJzaGFsbGVyQ2hhaW4oY2hhaW4uY29udGV4dCk7CiAgICAgICAgICAgICBRTmFtZU1hcDxDaGlsZExvYWRlcj4gbSA9IG5ldyBRTmFtZU1hcDxDaGlsZExvYWRlcj4oKTsKICAgICAgICAgICAgIGNyZWF0ZUJvZHlVbm1hcnNoYWxsZXIoYyxtKTsKLSAgICAgICAgICAgIGxvYWRlcnMucHV0KHdyYXBwZXJUYWdOYW1lLG5ldyBDaGlsZExvYWRlcihuZXcgSXRlbXNMb2FkZXIobSksbnVsbCkpOworICAgICAgICAgICAgTG9hZGVyIGxvYWRlciA9IG5ldyBJdGVtc0xvYWRlcihhY2MsIGxpc3RlciwgbSk7CisgICAgICAgICAgICBpZihpc1dyYXBwZXJOaWxsYWJsZSB8fCBjaGFpbi5jb250ZXh0LmFsbE5pbGxhYmxlKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IG5ldyBYc2lOaWxMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgICAgIGxvYWRlcnMucHV0KHdyYXBwZXJUYWdOYW1lLG5ldyBDaGlsZExvYWRlcihsb2FkZXIsbnVsbCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY3JlYXRlQm9keVVubWFyc2hhbGxlcihjaGFpbixsb2FkZXJzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5RWxlbWVudExlYWZQcm9wZXJ0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5RWxlbWVudExlYWZQcm9wZXJ0eS5qYXZhCmluZGV4IDI3MWU5ZDIuLmFmNjk0NTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9BcnJheUVsZW1lbnRMZWFmUHJvcGVydHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlFbGVtZW50TGVhZlByb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5wcm9wZXJ0eTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlFbGVtZW50Tm9kZVByb3BlcnR5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlFbGVtZW50Tm9kZVByb3BlcnR5LmphdmEKaW5kZXggODU4MDMzZi4uOGQyZDk5MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5RWxlbWVudE5vZGVQcm9wZXJ0eS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9BcnJheUVsZW1lbnROb2RlUHJvcGVydHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnByb3BlcnR5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9BcnJheUVsZW1lbnRQcm9wZXJ0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5RWxlbWVudFByb3BlcnR5LmphdmEKaW5kZXggODNiYmIyMC4uZjVjMjdhZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5RWxlbWVudFByb3BlcnR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5RWxlbWVudFByb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5wcm9wZXJ0eTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xOTAsNyArMTg5LDcgQEAKICAgICAgICAgICAgIE5hbWUgdGFnTmFtZSA9IGNoYWluLmNvbnRleHQubmFtZUJ1aWxkZXIuY3JlYXRlRWxlbWVudE5hbWUodHlwZVJlZi5nZXRUYWdOYW1lKCkpOwogICAgICAgICAgICAgTG9hZGVyIGl0ZW0gPSBjcmVhdGVJdGVtVW5tYXJzaGFsbGVyKGNoYWluLHR5cGVSZWYpOwogCi0gICAgICAgICAgICBpZih0eXBlUmVmLmlzTmlsbGFibGUoKSkKKyAgICAgICAgICAgIGlmKHR5cGVSZWYuaXNOaWxsYWJsZSgpIHx8IGNoYWluLmNvbnRleHQuYWxsTmlsbGFibGUpCiAgICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBYc2lOaWxMb2FkZXIuQXJyYXkoaXRlbSk7CiAgICAgICAgICAgICBpZih0eXBlUmVmLmdldERlZmF1bHRWYWx1ZSgpIT1udWxsKQogICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgRGVmYXVsdFZhbHVlTG9hZGVyRGVjb3JhdG9yKGl0ZW0sdHlwZVJlZi5nZXREZWZhdWx0VmFsdWUoKSk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlQcm9wZXJ0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5UHJvcGVydHkuamF2YQppbmRleCAzMWRmNWQ1Li43YzEwYTdiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlQcm9wZXJ0eS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9BcnJheVByb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5wcm9wZXJ0eTsKIAogCkBAIC01MSw3ICs1MCw3IEBACiAgICAgICAgIGxpc3RlciA9IExpc3Rlci5jcmVhdGUoCiAgICAgICAgICAgICBOYXZpZ2F0b3IuUkVGTEVDVElPTi5lcmFzdXJlKHByb3AuZ2V0UmF3VHlwZSgpKSxwcm9wLmlkKCkscHJvcC5nZXRBZGFwdGVyKCkpOwogICAgICAgICBhc3NlcnQgbGlzdGVyIT1udWxsOwotICAgICAgICBhY2MgPSBwcm9wLmdldEFjY2Vzc29yKCkub3B0aW1pemUoKTsKKyAgICAgICAgYWNjID0gcHJvcC5nZXRBY2Nlc3NvcigpLm9wdGltaXplKGNvbnRleHQpOwogICAgICAgICBhc3NlcnQgYWNjIT1udWxsOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0FycmF5UmVmZXJlbmNlTm9kZVByb3BlcnR5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlSZWZlcmVuY2VOb2RlUHJvcGVydHkuamF2YQppbmRleCA4ZDVkZWE0Li4yNzBkYzEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlSZWZlcmVuY2VOb2RlUHJvcGVydHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvQXJyYXlSZWZlcmVuY2VOb2RlUHJvcGVydHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnByb3BlcnR5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9BdHRyaWJ1dGVQcm9wZXJ0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0F0dHJpYnV0ZVByb3BlcnR5LmphdmEKaW5kZXggNGU5ZTVhYy4uNWM4OTk5MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0F0dHJpYnV0ZVByb3BlcnR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0F0dHJpYnV0ZVByb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5wcm9wZXJ0eTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMSw3ICszMCw2IEBACiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5BY2Nlc3NvckV4Y2VwdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnV0aWwuUU5hbWVNYXA7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi51dGlsLlFOYW1lTWFwOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5BdHRyaWJ1dGVQcm9wZXJ0eUluZm87CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5jb3JlLlByb3BlcnR5S2luZDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLnJ1bnRpbWUuUnVudGltZUF0dHJpYnV0ZVByb3BlcnR5SW5mbzsKQEAgLTM5LDcgKzM3LDYgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuTmFtZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuWE1MU2VyaWFsaXplcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuSmF4QmVhbkluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5Mb2FkZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5DaGlsZExvYWRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5UcmFuc2R1Y2VkQWNjZXNzb3I7CkBAIC03MiwxMCArNjksMTAgQEAKIAogICAgIHByaXZhdGUgZmluYWwgQWNjZXNzb3IgYWNjOwogCi0gICAgcHVibGljIEF0dHJpYnV0ZVByb3BlcnR5KEpBWEJDb250ZXh0SW1wbCBwLCBSdW50aW1lQXR0cmlidXRlUHJvcGVydHlJbmZvIHByb3ApIHsKLSAgICAgICAgc3VwZXIocCxwcm9wKTsKLSAgICAgICAgdGhpcy5hdHROYW1lID0gcC5uYW1lQnVpbGRlci5jcmVhdGVBdHRyaWJ1dGVOYW1lKHByb3AuZ2V0WG1sTmFtZSgpKTsKLSAgICAgICAgdGhpcy54YWNjID0gVHJhbnNkdWNlZEFjY2Vzc29yLmdldChwcm9wKTsKKyAgICBwdWJsaWMgQXR0cmlidXRlUHJvcGVydHkoSkFYQkNvbnRleHRJbXBsIGNvbnRleHQsIFJ1bnRpbWVBdHRyaWJ1dGVQcm9wZXJ0eUluZm8gcHJvcCkgeworICAgICAgICBzdXBlcihjb250ZXh0LHByb3ApOworICAgICAgICB0aGlzLmF0dE5hbWUgPSBjb250ZXh0Lm5hbWVCdWlsZGVyLmNyZWF0ZUF0dHJpYnV0ZU5hbWUocHJvcC5nZXRYbWxOYW1lKCkpOworICAgICAgICB0aGlzLnhhY2MgPSBUcmFuc2R1Y2VkQWNjZXNzb3IuZ2V0KGNvbnRleHQscHJvcCk7CiAgICAgICAgIHRoaXMuYWNjID0gcHJvcC5nZXRBY2Nlc3NvcigpOyAgIC8vIHdlIG9ubHkgdXNlIHRoaXMgZm9yIGJpbmRlciwgc28gZG9uJ3Qgd2FzdGUgbWVtb3J5IGJ5IG9wdGltaXppbmcKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9MaXN0RWxlbWVudFByb3BlcnR5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvTGlzdEVsZW1lbnRQcm9wZXJ0eS5qYXZhCmluZGV4IGRmNTBmZTEuLjYxNDZkMjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9MaXN0RWxlbWVudFByb3BlcnR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L0xpc3RFbGVtZW50UHJvcGVydHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnByb3BlcnR5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9NZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L01lc3NhZ2VzLmphdmEKaW5kZXggZGUyMDA1OS4uNTQ1OGQwMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5wcm9wZXJ0eTsKIAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvTWVzc2FnZXMucHJvcGVydGllcwppbmRleCA1ZDA0NGQzLi5mYzMxY2U0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogVU5TVUJTVElUVVRBQkxFX1RZUEUgPSBcCiAgICAgdHlwZSB7MH0gaXMgbWFwcGVkIHRvIHsxfSBidXQgaXQgY2Fubm90IHN1YnN0aXR1dGUgezJ9IGhlcmUKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1Byb3BlcnR5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvUHJvcGVydHkuamF2YQppbmRleCA1MWUyN2I5Li42ZTIwZTZkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvUHJvcGVydHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvUHJvcGVydHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnByb3BlcnR5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9Qcm9wZXJ0eUZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9Qcm9wZXJ0eUZhY3RvcnkuamF2YQppbmRleCBjZGNlOGViLi5kYjM1YjEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvUHJvcGVydHlGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1Byb3BlcnR5RmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucHJvcGVydHk7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9Qcm9wZXJ0eUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9Qcm9wZXJ0eUltcGwuamF2YQppbmRleCBlMWZlMWE0Li42YmJkYjQ0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvUHJvcGVydHlJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1Byb3BlcnR5SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucHJvcGVydHk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1NpbmdsZUVsZW1lbnRMZWFmUHJvcGVydHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9TaW5nbGVFbGVtZW50TGVhZlByb3BlcnR5LmphdmEKaW5kZXggNWFmZTY5OC4uZDE3ZDI5YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1NpbmdsZUVsZW1lbnRMZWFmUHJvcGVydHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvU2luZ2xlRWxlbWVudExlYWZQcm9wZXJ0eS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucHJvcGVydHk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNjcsOSArNjYsOSBAQAogICAgICAgICBhc3NlcnQgdGFnTmFtZSE9bnVsbDsKICAgICAgICAgbmlsbGFibGUgPSByZWYuaXNOaWxsYWJsZSgpOwogICAgICAgICBkZWZhdWx0VmFsdWUgPSByZWYuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgIHRoaXMuYWNjID0gcHJvcC5nZXRBY2Nlc3NvcigpLm9wdGltaXplKCk7CisgICAgICAgIHRoaXMuYWNjID0gcHJvcC5nZXRBY2Nlc3NvcigpLm9wdGltaXplKGNvbnRleHQpOwogCi0gICAgICAgIHhhY2MgPSBUcmFuc2R1Y2VkQWNjZXNzb3IuZ2V0KHJlZik7CisgICAgICAgIHhhY2MgPSBUcmFuc2R1Y2VkQWNjZXNzb3IuZ2V0KGNvbnRleHQscmVmKTsKICAgICAgICAgYXNzZXJ0IHhhY2MhPW51bGw7CiAgICAgfQogCkBAIC05Nyw3ICs5Niw3IEBACiAgICAgICAgIExvYWRlciBsID0gbmV3IExlYWZQcm9wZXJ0eUxvYWRlcih4YWNjKTsKICAgICAgICAgaWYoZGVmYXVsdFZhbHVlIT1udWxsKQogICAgICAgICAgICAgbCA9IG5ldyBEZWZhdWx0VmFsdWVMb2FkZXJEZWNvcmF0b3IobCxkZWZhdWx0VmFsdWUpOwotICAgICAgICBpZihuaWxsYWJsZSkKKyAgICAgICAgaWYobmlsbGFibGUgfHwgY2hhaW4uY29udGV4dC5hbGxOaWxsYWJsZSkKICAgICAgICAgICAgIGwgPSBuZXcgWHNpTmlsTG9hZGVyLlNpbmdsZShsLGFjYyk7CiAgICAgICAgIGhhbmRsZXJzLnB1dCh0YWdOYW1lLG5ldyBDaGlsZExvYWRlcihsLG51bGwpKTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvU2luZ2xlRWxlbWVudE5vZGVQcm9wZXJ0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1NpbmdsZUVsZW1lbnROb2RlUHJvcGVydHkuamF2YQppbmRleCA1YTU4ZjVkLi5jZDY4MjZjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvU2luZ2xlRWxlbWVudE5vZGVQcm9wZXJ0eS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9TaW5nbGVFbGVtZW50Tm9kZVByb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5wcm9wZXJ0eTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00OCw3ICs0Nyw2IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5DaGlsZExvYWRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlhzaU5pbExvYWRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLkRlZmF1bHRWYWx1ZUxvYWRlckRlY29yYXRvcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlhzaVR5cGVMb2FkZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC03NSw3ICs3Myw3IEBACiAKICAgICBwdWJsaWMgU2luZ2xlRWxlbWVudE5vZGVQcm9wZXJ0eShKQVhCQ29udGV4dEltcGwgY29udGV4dCwgUnVudGltZUVsZW1lbnRQcm9wZXJ0eUluZm8gcHJvcCkgewogICAgICAgICBzdXBlcihjb250ZXh0LHByb3ApOwotICAgICAgICBhY2MgPSBwcm9wLmdldEFjY2Vzc29yKCkub3B0aW1pemUoKTsKKyAgICAgICAgYWNjID0gcHJvcC5nZXRBY2Nlc3NvcigpLm9wdGltaXplKGNvbnRleHQpOwogICAgICAgICB0aGlzLnByb3AgPSBwcm9wOwogCiAgICAgICAgIFFOYW1lIG50ID0gbnVsbDsKQEAgLTE1NSw3ICsxNTMsNyBAQAogICAgICAgICAgICAgTG9hZGVyIGwgPSBiaS5nZXRMb2FkZXIoY29udGV4dCx0cnVlKTsKICAgICAgICAgICAgIGlmKGUuZ2V0RGVmYXVsdFZhbHVlKCkhPW51bGwpCiAgICAgICAgICAgICAgICAgbCA9IG5ldyBEZWZhdWx0VmFsdWVMb2FkZXJEZWNvcmF0b3IobCxlLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGlmKG5pbGxhYmxlKQorICAgICAgICAgICAgaWYobmlsbGFibGUgfHwgY2hhaW4uY29udGV4dC5hbGxOaWxsYWJsZSkKICAgICAgICAgICAgICAgICBsID0gbmV3IFhzaU5pbExvYWRlci5TaW5nbGUobCxhY2MpOwogICAgICAgICAgICAgaGFuZGxlcnMucHV0KCBlLmdldFRhZ05hbWUoKSwgbmV3IENoaWxkTG9hZGVyKGwsYWNjKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9TaW5nbGVNYXBOb2RlUHJvcGVydHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9TaW5nbGVNYXBOb2RlUHJvcGVydHkuamF2YQppbmRleCBkOWI4NGQ3Li5kMDQ0ZTAwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvU2luZ2xlTWFwTm9kZVByb3BlcnR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1NpbmdsZU1hcE5vZGVQcm9wZXJ0eS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucHJvcGVydHk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNTQsNyArNTMsNiBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuTG9hZGVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuUmVjZWl2ZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5Vbm1hcnNoYWxsaW5nQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlhzaVR5cGVMb2FkZXI7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKQEAgLTg4LDcgKzg2LDcgQEAKIAogICAgIHB1YmxpYyBTaW5nbGVNYXBOb2RlUHJvcGVydHkoSkFYQkNvbnRleHRJbXBsIGNvbnRleHQsIFJ1bnRpbWVNYXBQcm9wZXJ0eUluZm8gcHJvcCkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBwcm9wKTsKLSAgICAgICAgYWNjID0gcHJvcC5nZXRBY2Nlc3NvcigpLm9wdGltaXplKCk7CisgICAgICAgIGFjYyA9IHByb3AuZ2V0QWNjZXNzb3IoKS5vcHRpbWl6ZShjb250ZXh0KTsKICAgICAgICAgdGhpcy50YWdOYW1lID0gY29udGV4dC5uYW1lQnVpbGRlci5jcmVhdGVFbGVtZW50TmFtZShwcm9wLmdldFhtbE5hbWUoKSk7CiAgICAgICAgIHRoaXMuZW50cnlUYWcgPSBjb250ZXh0Lm5hbWVCdWlsZGVyLmNyZWF0ZUVsZW1lbnROYW1lKCIiLCJlbnRyeSIpOwogICAgICAgICB0aGlzLmtleVRhZyA9IGNvbnRleHQubmFtZUJ1aWxkZXIuY3JlYXRlRWxlbWVudE5hbWUoIiIsImtleSIpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1NpbmdsZVJlZmVyZW5jZU5vZGVQcm9wZXJ0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1NpbmdsZVJlZmVyZW5jZU5vZGVQcm9wZXJ0eS5qYXZhCmluZGV4IDI1ODVlODAuLjg5ZDRhMzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9TaW5nbGVSZWZlcmVuY2VOb2RlUHJvcGVydHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvU2luZ2xlUmVmZXJlbmNlTm9kZVByb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTAgKzIyLDEwIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnByb3BlcnR5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKQEAgLTYxLDEyICs2MSwxMiBAQAogICAgIHByaXZhdGUgZmluYWwgRG9tSGFuZGxlciBkb21IYW5kbGVyOwogICAgIHByaXZhdGUgZmluYWwgV2lsZGNhcmRNb2RlIHdjTW9kZTsKIAotICAgIHB1YmxpYyBTaW5nbGVSZWZlcmVuY2VOb2RlUHJvcGVydHkoSkFYQkNvbnRleHRJbXBsIHAsIFJ1bnRpbWVSZWZlcmVuY2VQcm9wZXJ0eUluZm8gcHJvcCkgewotICAgICAgICBzdXBlcihwLHByb3ApOwotICAgICAgICBhY2MgPSBwcm9wLmdldEFjY2Vzc29yKCkub3B0aW1pemUoKTsKKyAgICBwdWJsaWMgU2luZ2xlUmVmZXJlbmNlTm9kZVByb3BlcnR5KEpBWEJDb250ZXh0SW1wbCBjb250ZXh0LCBSdW50aW1lUmVmZXJlbmNlUHJvcGVydHlJbmZvIHByb3ApIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCxwcm9wKTsKKyAgICAgICAgYWNjID0gcHJvcC5nZXRBY2Nlc3NvcigpLm9wdGltaXplKGNvbnRleHQpOwogCiAgICAgICAgIGZvciAoUnVudGltZUVsZW1lbnQgZSA6IHByb3AuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgZXhwZWN0ZWRFbGVtZW50cy5wdXQoIGUuZ2V0RWxlbWVudE5hbWUoKSwgcC5nZXRPckNyZWF0ZShlKSApOworICAgICAgICAgICAgZXhwZWN0ZWRFbGVtZW50cy5wdXQoIGUuZ2V0RWxlbWVudE5hbWUoKSwgY29udGV4dC5nZXRPckNyZWF0ZShlKSApOwogICAgICAgICB9CiAKICAgICAgICAgaWYocHJvcC5nZXRXaWxkY2FyZCgpIT1udWxsKSB7CkBAIC0xMzYsNyArMTM2LDE1IEBACiAKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KEJlYW5UIGJlYW4sIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEFjY2Vzc29yRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlYmkuY3JlYXRlSW5zdGFuY2VGcm9tVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWJpLmNyZWF0ZUluc3RhbmNlRnJvbVZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjY2Vzc29yRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWNjZXNzb3JFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY2Nlc3NvckV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBhY2Muc2V0KGJlYW4sKFZhbHVlVCl2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9TdHJ1Y3R1cmVMb2FkZXJCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvU3RydWN0dXJlTG9hZGVyQnVpbGRlci5qYXZhCmluZGV4IDkxNjk3MjUuLjJhNDE3MjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9TdHJ1Y3R1cmVMb2FkZXJCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1N0cnVjdHVyZUxvYWRlckJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnByb3BlcnR5OwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9UYWdBbmRUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvVGFnQW5kVHlwZS5qYXZhCmluZGV4IDU4OWFiZWEuLjlmM2I1ZmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9UYWdBbmRUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1RhZ0FuZFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnByb3BlcnR5OwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9Vbm1hcnNoYWxsZXJDaGFpbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1VubWFyc2hhbGxlckNoYWluLmphdmEKaW5kZXggZjBhZjYzNy4uYzBhMjc4YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1VubWFyc2hhbGxlckNoYWluLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1VubWFyc2hhbGxlckNoYWluLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNiArMjMsOSBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCiAKKy8qCisgKiBAKCMpJElkOgorICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5wcm9wZXJ0eTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5KQVhCQ29udGV4dEltcGw7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvVmFsdWVQcm9wZXJ0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3Byb3BlcnR5L1ZhbHVlUHJvcGVydHkuamF2YQppbmRleCBkZGRkZTRkLi40NGE0YjI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcHJvcGVydHkvVmFsdWVQcm9wZXJ0eS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9wcm9wZXJ0eS9WYWx1ZVByb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5wcm9wZXJ0eTsKIAogCkBAIC02MSw5ICs2MCw5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBBY2Nlc3NvcjxCZWFuVCw/PiBhY2M7CiAKIAotICAgIHB1YmxpYyBWYWx1ZVByb3BlcnR5KEpBWEJDb250ZXh0SW1wbCBncmFtbWFyLCBSdW50aW1lVmFsdWVQcm9wZXJ0eUluZm8gcHJvcCkgewotICAgICAgICBzdXBlcihncmFtbWFyLHByb3ApOwotICAgICAgICB4YWNjID0gVHJhbnNkdWNlZEFjY2Vzc29yLmdldChwcm9wKTsKKyAgICBwdWJsaWMgVmFsdWVQcm9wZXJ0eShKQVhCQ29udGV4dEltcGwgY29udGV4dCwgUnVudGltZVZhbHVlUHJvcGVydHlJbmZvIHByb3ApIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCxwcm9wKTsKKyAgICAgICAgeGFjYyA9IFRyYW5zZHVjZWRBY2Nlc3Nvci5nZXQoY29udGV4dCxwcm9wKTsKICAgICAgICAgYWNjID0gcHJvcC5nZXRBY2Nlc3NvcigpOyAgIC8vIHdlIG9ubHkgdXNlIHRoaXMgZm9yIGJpbmRlciwgc28gZG9uJ3Qgd2FzdGUgbWVtb3J5IGJ5IG9wdGltaXppbmcKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0FjY2Vzc29yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9BY2Nlc3Nvci5qYXZhCmluZGV4IGE1YzllNGMuLmUwNmFjMDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0FjY2Vzc29yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvQWNjZXNzb3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Q7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKQEAgLTQ3LDYgKzQ2LDcgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLkxvYWRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlJlY2VpdmVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuVW5tYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkpBWEJDb250ZXh0SW1wbDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIApAQCAtODIsMTAgKzgyLDEyIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIHNhbWUgYWNjZXNzb3IuCiAgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgVGhlIHtAbGluayBKQVhCQ29udGV4dEltcGx9IHRoYXQgb3ducyB0aGUgd2hvbGUgdGhpbmcuCiAgICAgICogQHJldHVybgogICAgICAqICAgICAgQXQgbGVhc3QgdGhlIGltcGxlbWVudGF0aW9uIGNhbiByZXR1cm4gPHR0PnRoaXM8L3R0Pi4KICAgICAgKi8KLSAgICBwdWJsaWMgQWNjZXNzb3I8QmVhblQsVmFsdWVUPiBvcHRpbWl6ZSgpIHsKKyAgICBwdWJsaWMgQWNjZXNzb3I8QmVhblQsVmFsdWVUPiBvcHRpbWl6ZShKQVhCQ29udGV4dEltcGwgY29udGV4dCkgewogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKQEAgLTEzMSw2ICsxMzMsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBhY2Nlc3NvciB3cmFwcyBhbiBhZGFwdGVyLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgdXNlZCB3aXRoIGNhcmUsIGJ1dCBpdCBoZWxwcyBzb21lIG9wdGltaXphdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSB3aXRob3V0IGFkYXB0aW5nIHRoZSB2YWx1ZS4KICAgICAgKgogICAgICAqIFRoaXMgdWdseSBlbnRyeSBwb2ludCBpcyBvbmx5IHVzZWQgYnkgSkFYLVdTLgpAQCAtMjE5LDcgKzIzMCwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NvcjxCZWFuVCxWYWx1ZVQ+IG9wdGltaXplKCkgeworICAgICAgICBwdWJsaWMgQWNjZXNzb3I8QmVhblQsVmFsdWVUPiBvcHRpbWl6ZShKQVhCQ29udGV4dEltcGwgY29udGV4dCkgeworICAgICAgICAgICAgaWYoY29udGV4dC5mYXN0Qm9vdCkKKyAgICAgICAgICAgICAgICAvLyBsZXQncyBub3Qgd2FzdGUgdGltZSBvbiBkb2luZyB0aGlzIGZvciB0aGUgc2FrZSBvZiBmYXN0ZXIgYm9vdC4KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgIEFjY2Vzc29yPEJlYW5ULFZhbHVlVD4gYWNjID0gT3B0aW1pemVkQWNjZXNzb3JGYWN0b3J5LmdldChmKTsKICAgICAgICAgICAgIGlmKGFjYyE9bnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gYWNjOwpAQCAtMjQxLDcgKzI1NSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc29yPEJlYW5ULFZhbHVlVD4gb3B0aW1pemUoKSB7CisgICAgICAgIHB1YmxpYyBBY2Nlc3NvcjxCZWFuVCxWYWx1ZVQ+IG9wdGltaXplKEpBWEJDb250ZXh0SW1wbCBjb250ZXh0KSB7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogICAgIH0KQEAgLTMyNSwxMCArMzM5LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc29yPEJlYW5ULFZhbHVlVD4gb3B0aW1pemUoKSB7CisgICAgICAgIHB1YmxpYyBBY2Nlc3NvcjxCZWFuVCxWYWx1ZVQ+IG9wdGltaXplKEpBWEJDb250ZXh0SW1wbCBjb250ZXh0KSB7CiAgICAgICAgICAgICBpZihnZXR0ZXI9PW51bGwgfHwgc2V0dGVyPT1udWxsKQogICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZW4ndCBjb21wbGV0ZSwgT3B0aW1pemVkQWNjZXNzb3Igd29uJ3QgYWx3YXlzIHdvcmsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIGlmKGNvbnRleHQuZmFzdEJvb3QpCisgICAgICAgICAgICAgICAgLy8gbGV0J3Mgbm90IHdhc3RlIHRpbWUgb24gZG9pbmcgdGhpcyBmb3IgdGhlIHNha2Ugb2YgZmFzdGVyIGJvb3QuCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAKICAgICAgICAgICAgIEFjY2Vzc29yPEJlYW5ULFZhbHVlVD4gYWNjID0gT3B0aW1pemVkQWNjZXNzb3JGYWN0b3J5LmdldChnZXR0ZXIsc2V0dGVyKTsKICAgICAgICAgICAgIGlmKGFjYyE9bnVsbCkKQEAgLTM3Myw5ICszOTAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTcGVjaWFsIHtAbGluayBBY2Nlc3Nvcn0gdXNlZCB0byByZWNvdmVyIGZyb20gZXJyb3JzLgorICAgICAqIEdldHMgdGhlIHNwZWNpYWwge0BsaW5rIEFjY2Vzc29yfSB1c2VkIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBY2Nlc3NvciBFUlJPUiA9IG5ldyBBY2Nlc3NvcihPYmplY3QuY2xhc3MpIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxBLEI+IEFjY2Vzc29yPEEsQj4gZ2V0RXJyb3JJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY2Vzc29yIEVSUk9SID0gbmV3IEFjY2Vzc29yPE9iamVjdCxPYmplY3Q+KE9iamVjdC5jbGFzcykgewogICAgICAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3QgbykgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0FkYXB0ZWRBY2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvQWRhcHRlZEFjY2Vzc29yLmphdmEKaW5kZXggODBkZjdjMy4uOTEzY2JmMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvQWRhcHRlZEFjY2Vzc29yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvQWRhcHRlZEFjY2Vzc29yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxBZGFwdGVyOwpAQCAtNDgsNiArNDcsMTEgQEAKICAgICAgICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIHB1YmxpYyBPbldpcmVWYWx1ZVQgZ2V0KEJlYW5UIGJlYW4pIHRocm93cyBBY2Nlc3NvckV4Y2VwdGlvbiB7CiAgICAgICAgIEluTWVtVmFsdWVUIHYgPSBjb3JlLmdldChiZWFuKTsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvQWRhcHRlZExpc3Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvQWRhcHRlZExpc3Rlci5qYXZhCmluZGV4IDUyMTEyMGQuLjQ5ZTZmNzcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0FkYXB0ZWRMaXN0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9BZGFwdGVkTGlzdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxBZGFwdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvRGVmYXVsdFRyYW5zZHVjZWRBY2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvRGVmYXVsdFRyYW5zZHVjZWRBY2Nlc3Nvci5qYXZhCmluZGV4IGFkNTVhYmUuLjJjNTg0ZjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0RlZmF1bHRUcmFuc2R1Y2VkQWNjZXNzb3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9EZWZhdWx0VHJhbnNkdWNlZEFjY2Vzc29yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0xpc3RJdGVyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTGlzdEl0ZXJhdG9yLmphdmEKaW5kZXggNGEwZmRlYS4uYzI2ZDI5NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTGlzdEl0ZXJhdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTGlzdEl0ZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTGlzdFRyYW5zZHVjZWRBY2Nlc3NvckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0xpc3RUcmFuc2R1Y2VkQWNjZXNzb3JJbXBsLmphdmEKaW5kZXggMTM5NTg1Yi4uNzFmNTMwNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTGlzdFRyYW5zZHVjZWRBY2Nlc3NvckltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9MaXN0VHJhbnNkdWNlZEFjY2Vzc29ySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdDsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9MaXN0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0xpc3Rlci5qYXZhCmluZGV4IDhiMTMzZjMuLmY0ZGYyZTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0xpc3Rlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L0xpc3Rlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKQEAgLTUxLDYgKzUwLDcgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuWE1MU2VyaWFsaXplcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLlBhdGNoZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5Vbm1hcnNoYWxsaW5nQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyLkxvY2F0b3JFeDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIApAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgIHJldHVybiBsOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGdldEltcGxDbGFzcyhDbGFzcyBmaWVsZFR5cGUpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRJbXBsQ2xhc3MoQ2xhc3M8Pz4gZmllbGRUeXBlKSB7CiAgICAgICAgIHJldHVybiBDbGFzc0ZhY3RvcnkuaW5mZXJJbXBsQ2xhc3MoZmllbGRUeXBlLENsYXNzRmFjdG9yeS5DT0xMRUNUSU9OX0lNUExfQ0xBU1NFUyk7CiAgICAgfQogCkBAIC0yNzQsNiArMjc0LDggQEAKICAgICAgICAgICAgIFQgY29sbGVjdGlvbiA9IGFjYy5nZXQoYmVhbik7CiAgICAgICAgICAgICBpZihjb2xsZWN0aW9uPT1udWxsKSB7CiAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiA9IENsYXNzRmFjdG9yeS5jcmVhdGUoaW1wbENsYXNzKTsKKyAgICAgICAgICAgICAgICBpZighYWNjLmlzQWRhcHRlZCgpKQorICAgICAgICAgICAgICAgICAgICBhY2Muc2V0KGJlYW4sY29sbGVjdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb2xsZWN0aW9uLmNsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKQEAgLTI4NiwxMiArMjg4LDIxIEBACiAgICAgICAgIHB1YmxpYyB2b2lkIGVuZFBhY2tpbmcoIFQgY29sbGVjdGlvbiwgQmVhblQgYmVhbiwgQWNjZXNzb3I8QmVhblQsVD4gYWNjICkgdGhyb3dzIEFjY2Vzc29yRXhjZXB0aW9uIHsKICAgICAgICAgICAgIC8vIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiB0aGUgZW5kUGFja2luZywgYmVjYXVzZQogICAgICAgICAgICAgLy8gc29tZXRpbWVzIHRoZSBhY2Nlc3NvciB1c2VzIGFuIGFkYXB0ZXIsIGFuZCB0aGUgYWRhcHRlciBuZWVkcyB0byBzZWUKLSAgICAgICAgICAgIC8vIHRoZSB3aG9sZSB0aGluZwotICAgICAgICAgICAgYWNjLnNldChiZWFuLGNvbGxlY3Rpb24pOworICAgICAgICAgICAgLy8gdGhlIHdob2xlIHRoaW5nLgorCisgICAgICAgICAgICAvLyBidXQgYWx3YXlzIGRvaW5nIHNvIGNhdXNlcyBhIHByb2JsZW0gd2hlbiB0aGlzIGNvbGxlY3Rpb24gcHJvcGVydHkKKyAgICAgICAgICAgIC8vIGlzIGdldHRlci1vbmx5CisKKyAgICAgICAgICAgIGlmKGFjYy5pc0FkYXB0ZWQoKSkKKyAgICAgICAgICAgICAgICBhY2Muc2V0KGJlYW4sY29sbGVjdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCByZXNldChCZWFuVCBiZWFuLCBBY2Nlc3NvcjxCZWFuVCwgVD4gYWNjKSB0aHJvd3MgQWNjZXNzb3JFeGNlcHRpb24gewotICAgICAgICAgICAgYWNjLmdldChiZWFuKS5jbGVhcigpOworICAgICAgICAgICAgVCBjb2xsZWN0aW9uID0gYWNjLmdldChiZWFuKTsKKyAgICAgICAgICAgIGlmKGNvbGxlY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzM5LDExICszNTAsMTMgQEAKICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IGlkcmVmcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBVbm1hcnNoYWxsaW5nQ29udGV4dCBjb250ZXh0OwogICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBY2Nlc3NvcjxCZWFuVCxQcm9wVD4gYWNjOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NhdG9yRXggbG9jYXRpb247CiAKICAgICAgICAgICAgIHB1YmxpYyBQYWNrKEJlYW5UIGJlYW4sIEFjY2Vzc29yPEJlYW5ULFByb3BUPiBhY2MpIHsKICAgICAgICAgICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwogICAgICAgICAgICAgICAgIHRoaXMuYWNjID0gYWNjOwogICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IFVubWFyc2hhbGxpbmdDb250ZXh0LmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IG5ldyBMb2NhdG9yRXguU25hcHNob3QoY29udGV4dC5nZXRMb2NhdG9yKCkpOwogICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkUGF0Y2hlcih0aGlzKTsKICAgICAgICAgICAgIH0KIApAQCAtMzcxLDcgKzM4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHQ9PW51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9yVW5yZXNvbHZlZElEUkVGKGJlYW4saWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZXJyb3JVbnJlc29sdmVkSURSRUYoYmVhbixpZCxsb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPRE8ucHJvdG90eXBlKCk7IC8vIFRPRE86IGNoZWNrIGlmIHRoZSB0eXBlIG9mIHQgaXMgcHJvcGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuYWRkVG9QYWNrKHBhY2ssdCk7CkBAIC00MjUsOCArNDM4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3BlY2lhbCB7QGxpbmsgTGlzdGVyfSB1c2VkIHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvci4KKyAgICAgKiBHZXRzIHRoZSBzcGVjaWFsIHtAbGluayBMaXN0ZXJ9IHVzZWQgdG8gcmVjb3ZlciBmcm9tIGFuIGVycm9yLgogICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPEEsQixDLEQ+IExpc3RlcjxBLEIsQyxEPiBnZXRFcnJvckluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gRVJST1I7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0ZXIgRVJST1IgPSBuZXcgTGlzdGVyKCkgewogICAgICAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKE9iamVjdCBvLCBYTUxTZXJpYWxpemVyIGNvbnRleHQpIHsKICAgICAgICAgICAgIHJldHVybiBFTVBUWV9JVEVSQVRPUjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9NZXNzYWdlcy5qYXZhCmluZGV4IGRhMWM4OWIuLmI3NGYwZjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTWVzc2FnZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Q7CiAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IGE0M2Y2MDMuLjU4ZGFmMWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogVU5BQkxFX1RPX0FDQ0VTU19OT05fUFVCTElDX0ZJRUxEID0gXAogICAgIFVuYWJsZSB0byBtYWtlIHswfS57MX0gYWNjZXNzaWJsZS4KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTnVsbFNhZmVBY2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvTnVsbFNhZmVBY2Nlc3Nvci5qYXZhCmluZGV4IDI1YWJlYzMuLjg2MDg1ODMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L051bGxTYWZlQWNjZXNzb3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9OdWxsU2FmZUFjY2Vzc29yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckJvb2xlYW4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyQm9vbGVhbi5qYXZhCmluZGV4IDEyYjA0NmMuLjU1MmQ3Y2MgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyQm9vbGVhbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyQm9vbGVhbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkFjY2Vzc29yRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJCeXRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckJ5dGUuamF2YQppbmRleCBkZWEwN2EwLi41YjJlOTY4MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJCeXRlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJCeXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckNoYXJhY3Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJDaGFyYWN0ZXIuamF2YQppbmRleCBlMmQyMTUzLi4yMWFmNDg2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckNoYXJhY3Rlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyQ2hhcmFjdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckRvdWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJEb3VibGUuamF2YQppbmRleCAzZjQyNTdkLi4wMDU4MGYzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckRvdWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyRG91YmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckZsb2F0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckZsb2F0LmphdmEKaW5kZXggNjM2YzI1My4uMGE3MmE3OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJGbG9hdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyRmxvYXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Q7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5BY2Nlc3NvckV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVySW50ZWdlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJJbnRlZ2VyLmphdmEKaW5kZXggOTljMzgwMS4uNTNiOWE4YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJJbnRlZ2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJJbnRlZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlckxvbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyTG9uZy5qYXZhCmluZGV4IGM2YWJhZjkuLjAyYzZhN2EgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyTG9uZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyTG9uZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkFjY2Vzc29yRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJTaG9ydC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvUHJpbWl0aXZlQXJyYXlMaXN0ZXJTaG9ydC5qYXZhCmluZGV4IGNjMGNhNDMuLjY3M2IwZWIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1ByaW1pdGl2ZUFycmF5TGlzdGVyU2hvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9QcmltaXRpdmVBcnJheUxpc3RlclNob3J0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9UcmFuc2R1Y2VkQWNjZXNzb3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1RyYW5zZHVjZWRBY2Nlc3Nvci5qYXZhCmluZGV4IGJkYWY3ODQuLjI2ZjRkODIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1RyYW5zZHVjZWRBY2Nlc3Nvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L1RyYW5zZHVjZWRBY2Nlc3Nvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00NSw5ICs0NCwxMSBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5OYW1lOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5UcmFuc2R1Y2VyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5YTUxTZXJpYWxpemVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5KQVhCQ29udGV4dEltcGw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0Lk9wdGltaXplZFRyYW5zZHVjZWRBY2Nlc3NvckZhY3Rvcnk7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5QYXRjaGVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuVW5tYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5Mb2NhdG9yRXg7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKQEAgLTEzNiw3ICsxMzcsNyBAQAogICAgICAqIDxwPgogICAgICAqIFRoaXMgYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgYW4gb3B0aW1pemVkIGNvZGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVHJhbnNkdWNlZEFjY2Vzc29yPFQ+IGdldChSdW50aW1lTm9uRWxlbWVudFJlZiByZWYpIHsKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUcmFuc2R1Y2VkQWNjZXNzb3I8VD4gZ2V0KEpBWEJDb250ZXh0SW1wbCBjb250ZXh0LCBSdW50aW1lTm9uRWxlbWVudFJlZiByZWYpIHsKICAgICAgICAgVHJhbnNkdWNlciB4ZHVjZXIgPSBSdW50aW1lTW9kZWxCdWlsZGVyLmNyZWF0ZVRyYW5zZHVjZXIocmVmKTsKICAgICAgICAgUnVudGltZVByb3BlcnR5SW5mbyBwcm9wID0gcmVmLmdldFNvdXJjZSgpOwogCkBAIC0xNDksMTUgKzE1MCwxNSBAQAogICAgICAgICBpZihwcm9wLmlkKCk9PUlELklEUkVGKQogICAgICAgICAgICAgcmV0dXJuIG5ldyBJRFJFRlRyYW5zZHVjZWRBY2Nlc3NvckltcGwocHJvcC5nZXRBY2Nlc3NvcigpKTsKIAotICAgICAgICBpZih4ZHVjZXIuaXNEZWZhdWx0KCkpIHsKKyAgICAgICAgaWYoeGR1Y2VyLmlzRGVmYXVsdCgpICYmICFjb250ZXh0LmZhc3RCb290KSB7CiAgICAgICAgICAgICBUcmFuc2R1Y2VkQWNjZXNzb3IgeGEgPSBPcHRpbWl6ZWRUcmFuc2R1Y2VkQWNjZXNzb3JGYWN0b3J5LmdldChwcm9wKTsKICAgICAgICAgICAgIGlmKHhhIT1udWxsKSAgICByZXR1cm4geGE7CiAgICAgICAgIH0KIAogICAgICAgICBpZih4ZHVjZXIudXNlTmFtZXNwYWNlKCkpCi0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUNvbnRleHREZXBlbmRlbnRUcmFuc2R1Y2VkQWNjZXNzb3JJbXBsKCB4ZHVjZXIsIHByb3AuZ2V0QWNjZXNzb3IoKSApOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVDb250ZXh0RGVwZW5kZW50VHJhbnNkdWNlZEFjY2Vzc29ySW1wbCggY29udGV4dCwgeGR1Y2VyLCBwcm9wLmdldEFjY2Vzc29yKCkgKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVUcmFuc2R1Y2VkQWNjZXNzb3JJbXBsKCB4ZHVjZXIsIHByb3AuZ2V0QWNjZXNzb3IoKSApOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVUcmFuc2R1Y2VkQWNjZXNzb3JJbXBsKCBjb250ZXh0LCB4ZHVjZXIsIHByb3AuZ2V0QWNjZXNzb3IoKSApOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc4LDggKzE3OSw4IEBACiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVUZXh0KFhNTFNlcmlhbGl6ZXIgdywgQmVhblQgbywgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIEFjY2Vzc29yRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb247CiAKICAgICBzdGF0aWMgY2xhc3MgQ29tcG9zaXRlQ29udGV4dERlcGVuZGVudFRyYW5zZHVjZWRBY2Nlc3NvckltcGw8QmVhblQsVmFsdWVUPiBleHRlbmRzIENvbXBvc2l0ZVRyYW5zZHVjZWRBY2Nlc3NvckltcGw8QmVhblQsVmFsdWVUPiB7Ci0gICAgICAgIHB1YmxpYyBDb21wb3NpdGVDb250ZXh0RGVwZW5kZW50VHJhbnNkdWNlZEFjY2Vzc29ySW1wbChUcmFuc2R1Y2VyPFZhbHVlVD4geGR1Y2VyLCBBY2Nlc3NvcjxCZWFuVCxWYWx1ZVQ+IGFjYykgewotICAgICAgICAgICAgc3VwZXIoeGR1Y2VyLCBhY2MpOworICAgICAgICBwdWJsaWMgQ29tcG9zaXRlQ29udGV4dERlcGVuZGVudFRyYW5zZHVjZWRBY2Nlc3NvckltcGwoSkFYQkNvbnRleHRJbXBsIGNvbnRleHQsVHJhbnNkdWNlcjxWYWx1ZVQ+IHhkdWNlciwgQWNjZXNzb3I8QmVhblQsVmFsdWVUPiBhY2MpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQseGR1Y2VyLGFjYyk7CiAgICAgICAgICAgICBhc3NlcnQgeGR1Y2VyLnVzZU5hbWVzcGFjZSgpOwogICAgICAgICB9CiAKQEAgLTIxMyw5ICsyMTQsOSBAQAogICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVHJhbnNkdWNlcjxWYWx1ZVQ+IHhkdWNlcjsKICAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFjY2Vzc29yPEJlYW5ULFZhbHVlVD4gYWNjOwogCi0gICAgICAgIHB1YmxpYyBDb21wb3NpdGVUcmFuc2R1Y2VkQWNjZXNzb3JJbXBsKFRyYW5zZHVjZXI8VmFsdWVUPiB4ZHVjZXIsIEFjY2Vzc29yPEJlYW5ULFZhbHVlVD4gYWNjKSB7CisgICAgICAgIHB1YmxpYyBDb21wb3NpdGVUcmFuc2R1Y2VkQWNjZXNzb3JJbXBsKEpBWEJDb250ZXh0SW1wbCBjb250ZXh0LCBUcmFuc2R1Y2VyPFZhbHVlVD4geGR1Y2VyLCBBY2Nlc3NvcjxCZWFuVCxWYWx1ZVQ+IGFjYykgewogICAgICAgICAgICAgdGhpcy54ZHVjZXIgPSB4ZHVjZXI7Ci0gICAgICAgICAgICB0aGlzLmFjYyA9IGFjYy5vcHRpbWl6ZSgpOworICAgICAgICAgICAgdGhpcy5hY2MgPSBhY2Mub3B0aW1pemUoY29udGV4dCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHByaW50KEJlYW5UIGJlYW4pIHRocm93cyBBY2Nlc3NvckV4Y2VwdGlvbiB7CkBAIC0yOTEsNyArMjkyLDggQEAKIAogICAgICAgICAgICAgZmluYWwgQ2FsbGFibGUgY2FsbGFibGUgPSBjb250ZXh0LmdldE9iamVjdEZyb21JZChpZHJlZixhY2MudmFsdWVUeXBlKTsKICAgICAgICAgICAgIGlmKGNhbGxhYmxlPT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5lcnJvclVucmVzb2x2ZWRJRFJFRihiZWFuLGlkcmVmKTsKKyAgICAgICAgICAgICAgICAvLyB0aGUgSURSZXNvbHZlciBkZWNpZGVkIHRvIGFib3J0IGl0IG5vdworICAgICAgICAgICAgICAgIGNvbnRleHQuZXJyb3JVbnJlc29sdmVkSURSRUYoYmVhbixpZHJlZixjb250ZXh0LmdldExvY2F0b3IoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC0zMDksMTIgKzMxMSwxMyBAQAogICAgICAgICAgICAgICAgIGFzc2lnbihiZWFuLHQsY29udGV4dCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBsYXRlcgorICAgICAgICAgICAgICAgIGZpbmFsIExvY2F0b3JFeCBsb2MgPSBuZXcgTG9jYXRvckV4LlNuYXBzaG90KGNvbnRleHQuZ2V0TG9jYXRvcigpKTsKICAgICAgICAgICAgICAgICBjb250ZXh0LmFkZFBhdGNoZXIobmV3IFBhdGNoZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRUIHQgPSAoVGFyZ2V0VCljYWxsYWJsZS5jYWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodD09bnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9yVW5yZXNvbHZlZElEUkVGKGJlYW4saWRyZWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9yVW5yZXNvbHZlZElEUkVGKGJlYW4saWRyZWYsbG9jKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24oYmVhbix0LGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9BY2Nlc3NvckluamVjdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvQWNjZXNzb3JJbmplY3Rvci5qYXZhCmluZGV4IDA2OTBkZmQuLmIyYTYxZDYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9BY2Nlc3NvckluamVjdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0FjY2Vzc29ySW5qZWN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTUzLDcgKzUyLDcgQEAKICAgICAgKiBAcmV0dXJuIG51bGwKICAgICAgKiAgICAgIGlmIGl0IGZhaWxzIGZvciBzb21lIHJlYXNvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPD8+IHByZXBhcmUoCisgICAgcHVibGljIHN0YXRpYyBDbGFzczw/PiBwcmVwYXJlKAogICAgICAgICBDbGFzcyBiZWFuQ2xhc3MsIFN0cmluZyB0ZW1wbGF0ZUNsYXNzTmFtZSwgU3RyaW5nIG5ld0NsYXNzTmFtZSwgU3RyaW5nLi4uIHJlcGxhY2VtZW50cyApIHsKIAogICAgICAgICBpZihub09wdGltaXplKQpAQCAtOTYsNyArOTUsNyBAQAogICAgICAqICAgICAgVGhlIHNlYXJjaCBzdHJpbmdzIGZvdW5kIGluIHRoZSBjb25zdGFudCBwb29sIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgKiAgICAgIHJlcGxhY2VtZW50IHN0cmluZy4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gdGFpbG9yKCBTdHJpbmcgdGVtcGxhdGVDbGFzc05hbWUsIFN0cmluZyBuZXdDbGFzc05hbWUsIFN0cmluZy4uLiByZXBsYWNlbWVudHMgKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHRhaWxvciggU3RyaW5nIHRlbXBsYXRlQ2xhc3NOYW1lLCBTdHJpbmcgbmV3Q2xhc3NOYW1lLCBTdHJpbmcuLi4gcmVwbGFjZW1lbnRzICkgewogICAgICAgICBJbnB1dFN0cmVhbSByZXNvdXJjZTsKICAgICAgICAgaWYoQ0xBU1NfTE9BREVSIT1udWxsKQogICAgICAgICAgICAgcmVzb3VyY2UgPSBDTEFTU19MT0FERVIuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0ZW1wbGF0ZUNsYXNzTmFtZSsiLmNsYXNzIik7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvQmVhbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0JlYW4uamF2YQppbmRleCA0YWVjNzU0Li45ZDMxZGY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvQmVhbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9CZWFuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0LlRyYW5zZHVjZWRBY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9Db25zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0NvbnN0LmphdmEKaW5kZXggZmVhYjEwNi4uMjA1NTcwZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0NvbnN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0NvbnN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9Cb29sZWFuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9Cb29sZWFuLmphdmEKaW5kZXggMDljMGYwNy4uZDM3ZmI0MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfQm9vbGVhbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0Jvb2xlYW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9CeXRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9CeXRlLmphdmEKaW5kZXggZmEyYTQxNS4uZTU2MzgxNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfQnl0ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0J5dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9DaGFyYWN0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0NoYXJhY3Rlci5qYXZhCmluZGV4IGQzYzAzYTguLmY0MDM4OTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0NoYXJhY3Rlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0NoYXJhY3Rlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0RvdWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfRG91YmxlLmphdmEKaW5kZXggMTU0MTdmNi4uOTkyMDIxYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfRG91YmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfRG91YmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0LkFjY2Vzc29yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfRmxvYXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0Zsb2F0LmphdmEKaW5kZXggODg1ZGJjYy4uMWJlNzRjMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfRmxvYXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9GbG9hdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0ludGVnZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0ludGVnZXIuamF2YQppbmRleCA3Njc2ZWE0Li4xZTZiYWY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9JbnRlZ2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfSW50ZWdlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0xvbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX0xvbmcuamF2YQppbmRleCA3Y2YwYTdhLi5lOTI5ODI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9Mb25nLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfTG9uZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX1JlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfUmVmLmphdmEKaW5kZXggZDFiZWIxMS4uZjBlNGVlNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfUmVmLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0LkFjY2Vzc29yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfU2hvcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9GaWVsZEFjY2Vzc29yX1Nob3J0LmphdmEKaW5kZXggNTRhOWUzMC4uOGY1ZjFiMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0ZpZWxkQWNjZXNzb3JfU2hvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvRmllbGRBY2Nlc3Nvcl9TaG9ydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9JbmplY3Rvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0luamVjdG9yLmphdmEKaW5kZXggOTFjYzdlOS4uZmM5N2M0OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0luamVjdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L0luamVjdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CkBAIC0xNTgsNiArMTU3LDkgQEAKICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkUsIlVuYWJsZSB0byBpbmplY3QgIitjbGFzc05hbWUsZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORSwiVW5hYmxlIHRvIGluamVjdCAiK2NsYXNzTmFtZSxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsYXNzZXMucHV0KGNsYXNzTmFtZSxjKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX0Jvb2xlYW4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9Cb29sZWFuLmphdmEKaW5kZXggM2RlOGQ3YS4uYTA1NDliNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX0Jvb2xlYW4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfQm9vbGVhbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9CeXRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfQnl0ZS5qYXZhCmluZGV4IDRhZDAwMjguLjBkMjE0MzAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9CeXRlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX0J5dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfQ2hhcmFjdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfQ2hhcmFjdGVyLmphdmEKaW5kZXggZmUxYWNmNS4uYmRjMGRlNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX0NoYXJhY3Rlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9DaGFyYWN0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfRG91YmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfRG91YmxlLmphdmEKaW5kZXggMzc4M2FiOS4uYzNiOWE5ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX0RvdWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9Eb3VibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfRmxvYXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9GbG9hdC5qYXZhCmluZGV4IDEwNTA5MzMuLjFjYjEzNTggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9GbG9hdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9GbG9hdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5BY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9JbnRlZ2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfSW50ZWdlci5qYXZhCmluZGV4IGYyMTc4ZGIuLjk1ZDYwMjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9JbnRlZ2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX0ludGVnZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfTG9uZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX0xvbmcuamF2YQppbmRleCA2MzQyMjE4Li5jMzg3MzdiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfTG9uZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9Mb25nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0LkFjY2Vzc29yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX1JlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX1JlZi5qYXZhCmluZGV4IDgxMzVkN2MuLjQ1MDA2MDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9NZXRob2RBY2Nlc3Nvcl9SZWYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0LkFjY2Vzc29yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L01ldGhvZEFjY2Vzc29yX1Nob3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfU2hvcnQuamF2YQppbmRleCA0ZTdkNzIwLi4wMGJlM2U5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfU2hvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvTWV0aG9kQWNjZXNzb3JfU2hvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuQWNjZXNzb3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvT3B0aW1pemVkQWNjZXNzb3JGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvT3B0aW1pemVkQWNjZXNzb3JGYWN0b3J5LmphdmEKaW5kZXggMmRkNzQzOC4uY2ZlMzY1OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L09wdGltaXplZEFjY2Vzc29yRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9PcHRpbWl6ZWRBY2Nlc3NvckZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvT3B0aW1pemVkVHJhbnNkdWNlZEFjY2Vzc29yRmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L09wdGltaXplZFRyYW5zZHVjZWRBY2Nlc3NvckZhY3RvcnkuamF2YQppbmRleCBjZmUyOGU1Li40ZTlmMzIwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvT3B0aW1pemVkVHJhbnNkdWNlZEFjY2Vzc29yRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9PcHRpbWl6ZWRUcmFuc2R1Y2VkQWNjZXNzb3JGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1JlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1JlZi5qYXZhCmluZGV4IDA3OTc3ODUuLjc4NzUwZGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9SZWYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0LlRyYW5zZHVjZWRBY2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfZmllbGRfQm9vbGVhbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9Cb29sZWFuLmphdmEKaW5kZXggYzMyOGRjOS4uOWFjNjZiNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9Cb29sZWFuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9Cb29sZWFuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXJJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9CeXRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX0J5dGUuamF2YQppbmRleCBmNWI4YWQwLi5jMjgzODQyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX0J5dGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX0J5dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3Qub3B0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5EYXRhdHlwZUNvbnZlcnRlckltcGw7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX0RvdWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9Eb3VibGUuamF2YQppbmRleCBlZDRlYWJmLi5mMjQ4NTgzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX0RvdWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfZmllbGRfRG91YmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXJJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9GbG9hdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9GbG9hdC5qYXZhCmluZGV4IDVhNzFhMzcuLmIyZWVkZmQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfZmllbGRfRmxvYXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX0Zsb2F0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXJJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9JbnRlZ2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX0ludGVnZXIuamF2YQppbmRleCBhOWMzMDM2Li5mMjAwMGQ4NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9JbnRlZ2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9JbnRlZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX0xvbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfZmllbGRfTG9uZy5qYXZhCmluZGV4IGYxMmU5YjMuLjNjNzI4NDQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfZmllbGRfTG9uZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfZmllbGRfTG9uZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkRhdGF0eXBlQ29udmVydGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfZmllbGRfU2hvcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfZmllbGRfU2hvcnQuamF2YQppbmRleCAwZWM5Y2QwLi4zMDE3OWFhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX2ZpZWxkX1Nob3J0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9maWVsZF9TaG9ydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkRhdGF0eXBlQ29udmVydGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0Jvb2xlYW4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0Jvb2xlYW4uamF2YQppbmRleCAyMDJjNzBlLi5hMzM0OTlmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX21ldGhvZF9Cb29sZWFuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfQm9vbGVhbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkRhdGF0eXBlQ29udmVydGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0J5dGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0J5dGUuamF2YQppbmRleCA3M2I2YWMxLi42YTQyMmI1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX21ldGhvZF9CeXRlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfQnl0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkRhdGF0eXBlQ29udmVydGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0RvdWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfRG91YmxlLmphdmEKaW5kZXggMjQzMzRkZi4uNjY0N2JhMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfRG91YmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfRG91YmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXJJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfRmxvYXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0Zsb2F0LmphdmEKaW5kZXggN2FhN2UwYi4uNWM5YmI3OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfRmxvYXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX21ldGhvZF9GbG9hdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkRhdGF0eXBlQ29udmVydGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0ludGVnZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0ludGVnZXIuamF2YQppbmRleCA0ZjMyYzA3Li4yYTFmMjkxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX21ldGhvZF9JbnRlZ2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfSW50ZWdlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfTG9uZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfTG9uZy5qYXZhCmluZGV4IDhiZDUwYmIuLmEwYjQyNDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX0xvbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX21ldGhvZF9Mb25nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0Lm9wdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXJJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfU2hvcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9UcmFuc2R1Y2VkQWNjZXNzb3JfbWV0aG9kX1Nob3J0LmphdmEKaW5kZXggZjZjNjBhMi4uM2UwODgzZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L1RyYW5zZHVjZWRBY2Nlc3Nvcl9tZXRob2RfU2hvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvVHJhbnNkdWNlZEFjY2Vzc29yX21ldGhvZF9TaG9ydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUucmVmbGVjdC5vcHQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLkRhdGF0eXBlQ29udmVydGVySW1wbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9vcHQvcGFja2FnZS5odG1sCmluZGV4IGY1NzE3NTUuLjMwMjdlNDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L29wdC9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3Qvb3B0L3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD48Ym9keT4KIEhvc3RzIG9wdGltaXplZAoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5yZWZsZWN0LkFjY2Vzc29yfSwKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS9yZWZsZWN0L3BhY2thZ2UuaHRtbAppbmRleCA5ODhhM2YyLi41YmUxMmIzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvcmVmbGVjdC9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3JlZmxlY3QvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPjxib2R5PgogICBBYnN0cmFjdGlvbiBhcm91bmQgYWNjZXNzaW5nIGRhdGEgb2YgYWN0dWFsIG9iamVjdHMuCiA8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9BdHRyaWJ1dGVzRXguamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvQXR0cmlidXRlc0V4LmphdmEKaW5kZXggMDQ4YTkzNC4uNTcxNDlhOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9BdHRyaWJ1dGVzRXguamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0F0dHJpYnV0ZXNFeC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvQXR0cmlidXRlc0V4SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9BdHRyaWJ1dGVzRXhJbXBsLmphdmEKaW5kZXggMzM1YTBjYi4uMWQyMzM3YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9BdHRyaWJ1dGVzRXhJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9BdHRyaWJ1dGVzRXhJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnV0aWwuQXR0cmlidXRlc0ltcGw7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0Jhc2U2NERhdGEuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvQmFzZTY0RGF0YS5qYXZhCmluZGV4IDA4NDQ1YmMuLjAyMTQ4NTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvQmFzZTY0RGF0YS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvQmFzZTY0RGF0YS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvQ2hpbGRMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvQ2hpbGRMb2FkZXIuamF2YQppbmRleCAzNjIyM2RmLi41YjAzNDljIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0NoaWxkTG9hZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9DaGlsZExvYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvRGVmYXVsdElEUmVzb2x2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvRGVmYXVsdElEUmVzb2x2ZXIuamF2YQppbmRleCAxZDUyZWRkLi41YmMzODdkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0RlZmF1bHRJRFJlc29sdmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9EZWZhdWx0SURSZXNvbHZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0RlZmF1bHRWYWx1ZUxvYWRlckRlY29yYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9EZWZhdWx0VmFsdWVMb2FkZXJEZWNvcmF0b3IuamF2YQppbmRleCAwZmViZmU5Li42ZmYwMmE2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0RlZmF1bHRWYWx1ZUxvYWRlckRlY29yYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvRGVmYXVsdFZhbHVlTG9hZGVyRGVjb3JhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0Rpc2NhcmRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9EaXNjYXJkZXIuamF2YQppbmRleCBkMjM1Njk5Li40MGVkOThhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0Rpc2NhcmRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvRGlzY2FyZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNiArMjMsOSBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCiAKKy8qCisgKiBAKCMpJElkOiBEaXNjYXJkZXIuamF2YSx2IDEuNCAyMDA1LzA5LzEwIDE5OjA3OjQzIGtvaHN1a2UgRXhwICQKKyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvRG9tTG9hZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0RvbUxvYWRlci5qYXZhCmluZGV4IDg0MWM3YmYuLjUyZjg0NmMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvRG9tTG9hZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9Eb21Mb2FkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uRG9tSGFuZGxlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvRmFzdEluZm9zZXRDb25uZWN0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvRmFzdEluZm9zZXRDb25uZWN0b3IuamF2YQppbmRleCBmMmNjNjNhLi45N2Y3NzM5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0Zhc3RJbmZvc2V0Q29ubmVjdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9GYXN0SW5mb3NldENvbm5lY3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKQEAgLTMxLDEyICszMCwxMyBAQAogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5XaGl0ZVNwYWNlUHJvY2Vzc29yOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50UGFyc2VyOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LkVuY29kaW5nQWxnb3JpdGhtSW5kZXhlczsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKIC8qKgogICogUmVhZHMgZnJvbSBGYXN0SW5mb3NldCBTdEFYIHBhcnNlciBhbmQgZmVlZHMgaW50byBKQVhCIFVubWFyc2hhbGxlci4KKyAqIDxwPgorICogVGhpcyBjbGFzcyB3aWxsIHBlZWsgYXQgZnV0dXJlIGV2ZW50cyB0byBhc2NlcnRhaW4gaWYgY2hhcmFjdGVycyBuZWVkIHRvIGJlCisgKiBidWZmZXJlZCBvciBub3QuCiAgKgogICogQGF1dGhvciBQYXVsIFNhbmRvei4KICAqLwpAQCAtNDUsMTYgKzQ1LDE0IEBACiAgICAgLy8gZXZlbnQgc291cmNlCiAgICAgcHJpdmF0ZSBmaW5hbCBTdEFYRG9jdW1lbnRQYXJzZXIgZmFzdEluZm9zZXRTdHJlYW1SZWFkZXI7CiAKLSAgICAvLyBGbGFnIHNldCB0byB0cnVlIGlmIHRoZXJlIGlzIG9jdGV0cyBpbnN0ZWFkIG9mIGNoYXJhY3RlcnMKLSAgICBib29sZWFuIGhhc0Jhc2U2NERhdGEgPSBmYWxzZTsKLSAgICAvLyBGbGFnIHNldCB0byB0cnVlIGlmIHRoZSBmaXJzdCBjaHVuayBvZiBDSUlzCi0gICAgYm9vbGVhbiBmaXJzdENJSUNodW5rID0gdHJ1ZTsKKyAgICAvLyBGbGFnIHNldCB0byB0cnVlIGlmIHRleHQgaGFzIGJlZW4gcmVwb3J0ZWQKKyAgICBwcml2YXRlIGJvb2xlYW4gdGV4dFJlcG9ydGVkOwogCiAgICAgLy8gQnVmZmVyIGZvciBvY3RldHMKLSAgICBwcml2YXRlIEJhc2U2NERhdGEgYmFzZTY0RGF0YSA9IG5ldyBCYXNlNjREYXRhKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBCYXNlNjREYXRhIGJhc2U2NERhdGEgPSBuZXcgQmFzZTY0RGF0YSgpOwogCiAgICAgLy8gQnVmZmVyIGZvciBjaGFyYWN0ZXJzCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKICAgICBwdWJsaWMgRmFzdEluZm9zZXRDb25uZWN0b3IoU3RBWERvY3VtZW50UGFyc2VyIGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLAogICAgICAgICAgICAgWG1sVmlzaXRvciB2aXNpdG9yKSB7CkBAIC0xMDIsNyArMTAwLDE3IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMgOgogICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DREFUQSA6CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNQQUNFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYXJhY3RlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkaWN0b3IuZXhwZWN0VGV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVlayBhdCB0aGUgbmV4dCBldmVudCB0byBzZWUgaWYgdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhZ21lbnRlZCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5wZWVrTmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOb25JZ25vcmFibGVUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJZ25vcmFibGVUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVGcmFnbWVudGVkQ2hhcmFjdGVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzaW1wbHkgaWdub3JlCiAgICAgICAgICAgICAgICAgfQpAQCAtMTI3LDc4ICsxMzUsMTQyIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVN0YXJ0RWxlbWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBwcm9jZXNzVGV4dCh0cnVlKTsKKyAgICAgICAgcHJvY2Vzc1VucmVwb3J0ZWRUZXh0KCk7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5hY2Nlc3NOYW1lc3BhY2VDb3VudCgpOyBpKyspIHsKICAgICAgICAgICAgIHZpc2l0b3Iuc3RhcnRQcmVmaXhNYXBwaW5nKGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpKSwKICAgICAgICAgICAgICAgICAgICAgZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGkpKTsKICAgICAgICAgfQogCi0gICAgICAgIHRhZ05hbWUudXJpID0gZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIHRhZ05hbWUubG9jYWwgPSBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgdGFnTmFtZS51cmkgPSBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5hY2Nlc3NOYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgdGFnTmFtZS5sb2NhbCA9IGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmFjY2Vzc0xvY2FsTmFtZSgpOwogICAgICAgICB0YWdOYW1lLmF0dHMgPSBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVzSG9sZGVyKCk7CiAKICAgICAgICAgdmlzaXRvci5zdGFydEVsZW1lbnQodGFnTmFtZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYXJhY3RlcnMoKSB7Ci0gICAgICAgIGlmIChwcmVkaWN0b3IuZXhwZWN0VGV4dCgpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZmlyc3QgY2h1bmsgb2YgQ0lJcyBhbmQgY2hhcmFjdGVyIGRhdGEgaXMgcHJlc2VudAotICAgICAgICAgICAgaWYgKGZpcnN0Q0lJQ2h1bmsgJiYKLSAgICAgICAgICAgICAgICAgICAgZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0VGV4dEFsZ29yaXRobUJ5dGVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmdldFRleHRTdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0VGV4dExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBmaXJzdENJSUNodW5rID0gZmFsc2U7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZmlyc3QgY2h1bmsgb2YgQ0lJcyBhbmQgb2N0ZXQgZGF0YSBpcyBwcmVzZW50Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0Q0lJQ2h1bmsgJiYKLSAgICAgICAgICAgICAgICAgICAgZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0VGV4dEFsZ29yaXRobUluZGV4KCkgPT0gRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLkJBU0U2NCkgewotICAgICAgICAgICAgICAgIGZpcnN0Q0lJQ2h1bmsgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBoYXNCYXNlNjREYXRhID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgb2N0ZXRzCi0gICAgICAgICAgICAgICAgYmFzZTY0RGF0YS5zZXQoZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0VGV4dEFsZ29yaXRobUJ5dGVzQ2xvbmUoKSxudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAvLyBJZiBhIHN1YnNlcXVlbnQgc2VxdWVudGlhbCBjaHVuayBvZiBDSUlzCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBjaHVuayBpcyBvY3RldCBkYXRhCi0gICAgICAgICAgICAgICAgaWYgKGhhc0Jhc2U2NERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGJhc2U2NCBlbmNvZGVkIG9jdGV0cyB0byB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGJhc2U2NERhdGEpOwotICAgICAgICAgICAgICAgICAgICBoYXNCYXNlNjREYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVGcmFnbWVudGVkQ2hhcmFjdGVycygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGJ1ZmZlci5zZXRMZW5ndGgoMCk7CiAKLSAgICAgICAgICAgICAgICAvLyBBcHBlbmQgdGhlIHNlY29uZCBvciBzdWJzZXF1ZW5jZSBjaHVuayBvZiBDSUlzIHRvIHRoZSBidWZmZXIKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmdldFRleHRDaGFyYWN0ZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5nZXRUZXh0U3RhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmdldFRleHRMZW5ndGgoKSk7CisgICAgICAgIC8vIEFwcGVuZCBjaGFyYWN0ZXJzIG9mIGZpcnN0IGNoYXJhY3RlciBldmVudAorICAgICAgICBidWZmZXIuYXBwZW5kKGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmFjY2Vzc1RleHRDaGFyYWN0ZXJzKCksCisgICAgICAgICAgICAgICAgZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuYWNjZXNzVGV4dFN0YXJ0KCksCisgICAgICAgICAgICAgICAgZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuYWNjZXNzVGV4dExlbmd0aCgpKTsKKworICAgICAgICAvLyBDb25zdW1lIGFsbCBjaGFyYWN0ZXIKKyAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgc3dpdGNoKGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLnBlZWtOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UIDoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0J1ZmZlcmVkVGV4dCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UIDoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0J1ZmZlcmVkVGV4dChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTIDoKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DREFUQSA6CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuU1BBQ0UgOgorICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgY2hhcmFjdGVycyBvZiBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgY2hhcmFjdGVyIGV2ZW50cworICAgICAgICAgICAgICAgICAgICBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuYWNjZXNzVGV4dENoYXJhY3RlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5hY2Nlc3NUZXh0U3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5hY2Nlc3NUZXh0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5uZXh0KCk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFbmRFbGVtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2Nlc3NUZXh0KGZhbHNlKTsKKyAgICAgICAgcHJvY2Vzc1VucmVwb3J0ZWRUZXh0KCk7CiAKLSAgICAgICAgdGFnTmFtZS51cmkgPSBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgdGFnTmFtZS5sb2NhbCA9IGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmdldExvY2FsTmFtZSgpOworICAgICAgICB0YWdOYW1lLnVyaSA9IGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmFjY2Vzc05hbWVzcGFjZVVSSSgpOworICAgICAgICB0YWdOYW1lLmxvY2FsID0gZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuYWNjZXNzTG9jYWxOYW1lKCk7CiAKICAgICAgICAgdmlzaXRvci5lbmRFbGVtZW50KHRhZ05hbWUpOwogCi0gICAgICAgIGZvciAoaW50IGkgPSBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmFjY2Vzc05hbWVzcGFjZUNvdW50KCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgdmlzaXRvci5lbmRQcmVmaXhNYXBwaW5nKGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RleHQoYm9vbGVhbiBpZ25vcmFibGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBmaXJzdENJSUNodW5rID0gdHJ1ZTsKLSAgICAgICAgaWYocHJlZGljdG9yLmV4cGVjdFRleHQoKSAmJiAoIWlnbm9yYWJsZSB8fCAhV2hpdGVTcGFjZVByb2Nlc3Nvci5pc1doaXRlU3BhY2UoYnVmZmVyKSkpIHsKLSAgICAgICAgICAgIGlmICghaGFzQmFzZTY0RGF0YSkgewotICAgICAgICAgICAgICAgIHZpc2l0b3IudGV4dChidWZmZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2aXNpdG9yLnRleHQoYmFzZTY0RGF0YSk7Ci0gICAgICAgICAgICAgICAgaGFzQmFzZTY0RGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgfQorICAgIGZpbmFsIHByaXZhdGUgY2xhc3MgQ2hhclNlcXVlbmNlSW1wbCBpbXBsZW1lbnRzIENoYXJTZXF1ZW5jZSB7CisgICAgICAgIGNoYXJbXSBjaDsKKyAgICAgICAgaW50IHN0YXJ0OworICAgICAgICBpbnQgbGVuZ3RoOworCisgICAgICAgIENoYXJTZXF1ZW5jZUltcGwoKSB7CiAgICAgICAgIH0KLSAgICAgICAgYnVmZmVyLnNldExlbmd0aCgwKTsKKworICAgICAgICBDaGFyU2VxdWVuY2VJbXBsKGZpbmFsIGNoYXJbXSBjaCwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICB0aGlzLmNoID0gY2g7CisgICAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldCgpIHsKKyAgICAgICAgICAgIGNoID0gZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuYWNjZXNzVGV4dENoYXJhY3RlcnMoKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuYWNjZXNzVGV4dFN0YXJ0KCk7CisgICAgICAgICAgICBsZW5ndGggPSBmYXN0SW5mb3NldFN0cmVhbVJlYWRlci5hY2Nlc3NUZXh0TGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGFyU2VxdWVuY2UgaW50ZXJmYWNlCisKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBsZW5ndGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGNoYXIgY2hhckF0KGZpbmFsIGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGNoW3N0YXJ0ICsgaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhclNlcXVlbmNlSW1wbChjaCwgdGhpcy5zdGFydCArIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgcHJpdmF0ZSBDaGFyU2VxdWVuY2VJbXBsIGNoYXJBcnJheSA9IG5ldyBDaGFyU2VxdWVuY2VJbXBsKCk7CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc05vbklnbm9yYWJsZVRleHQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGV4dFJlcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmdldFRleHRBbGdvcml0aG1CeXRlcygpID09IG51bGwpIHsKKyAgICAgICAgICAgIGNoYXJBcnJheS5zZXQoKTsKKyAgICAgICAgICAgIHZpc2l0b3IudGV4dChjaGFyQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzZTY0RGF0YS5zZXQoZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0VGV4dEFsZ29yaXRobUJ5dGVzQ2xvbmUoKSxudWxsKTsKKyAgICAgICAgICAgIHZpc2l0b3IudGV4dChiYXNlNjREYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSWdub3JhYmxlVGV4dCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoZmFzdEluZm9zZXRTdHJlYW1SZWFkZXIuZ2V0VGV4dEFsZ29yaXRobUJ5dGVzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hhckFycmF5LnNldCgpOworICAgICAgICAgICAgaWYgKCFXaGl0ZVNwYWNlUHJvY2Vzc29yLmlzV2hpdGVTcGFjZShjaGFyQXJyYXkpKSB7CisgICAgICAgICAgICAgICAgdmlzaXRvci50ZXh0KGNoYXJBcnJheSk7CisgICAgICAgICAgICAgICAgdGV4dFJlcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2U2NERhdGEuc2V0KGZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmdldFRleHRBbGdvcml0aG1CeXRlc0Nsb25lKCksbnVsbCk7CisgICAgICAgICAgICB2aXNpdG9yLnRleHQoYmFzZTY0RGF0YSk7CisgICAgICAgICAgICB0ZXh0UmVwb3J0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NCdWZmZXJlZFRleHQoYm9vbGVhbiBpZ25vcmFibGUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoIWlnbm9yYWJsZSB8fCAhV2hpdGVTcGFjZVByb2Nlc3Nvci5pc1doaXRlU3BhY2UoYnVmZmVyKSkgeworICAgICAgICAgICAgdmlzaXRvci50ZXh0KGJ1ZmZlcik7CisgICAgICAgICAgICB0ZXh0UmVwb3J0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NVbnJlcG9ydGVkVGV4dCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZighdGV4dFJlcG9ydGVkICYmIHByZWRpY3Rvci5leHBlY3RUZXh0KCkpIHsKKyAgICAgICAgICAgIHZpc2l0b3IudGV4dCgiIik7CisgICAgICAgIH0KKyAgICAgICAgdGV4dFJlcG9ydGVkID0gZmFsc2U7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9JbnRBcnJheURhdGEuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvSW50QXJyYXlEYXRhLmphdmEKaW5kZXggMDkxODU1ZC4uOTk0ZGQwMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9JbnRBcnJheURhdGEuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0ludEFycmF5RGF0YS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvSW50RGF0YS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9JbnREYXRhLmphdmEKaW5kZXggNTljNjdmOS4uM2Q5YWU1YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9JbnREYXRhLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9JbnREYXRhLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9JbnRlcmNlcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9JbnRlcmNlcHRlci5qYXZhCmluZGV4IDlmNDQ5ZTQuLmU4M2Q5YzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvSW50ZXJjZXB0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0ludGVyY2VwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0ludGVybmluZ1htbFZpc2l0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvSW50ZXJuaW5nWG1sVmlzaXRvci5qYXZhCmluZGV4IDViNjYxYzcuLjNhM2I0NGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvSW50ZXJuaW5nWG1sVmlzaXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvSW50ZXJuaW5nWG1sVmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9MZWFmUHJvcGVydHlMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTGVhZlByb3BlcnR5TG9hZGVyLmphdmEKaW5kZXggMDFhYzU0Yi4uM2M0Y2MzYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9MZWFmUHJvcGVydHlMb2FkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0xlYWZQcm9wZXJ0eUxvYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0xvYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9Mb2FkZXIuamF2YQppbmRleCAyNmU1ZTBhLi41OTllZmQxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0xvYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTG9hZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTG9jYXRvckV4LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0xvY2F0b3JFeC5qYXZhCmluZGV4IDE5OTVlNjkuLmJlNDc1MDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTG9jYXRvckV4LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9Mb2NhdG9yRXguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwxMiArMjIsMTQgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCitpbXBvcnQgamF2YS5uZXQuVVJMOworCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50TG9jYXRvcjsKIAogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogLyoqCiAgKiBPYmplY3QgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IGxvY2F0aW9uIHRoYXQgdGhlIHtAbGluayBYbWxWaXNpdG9yfSBpcyBwYXJzaW5nLgpAQCAtNDAsNCArNDIsNjMgQEAKICAgICAgKi8KICAgICBWYWxpZGF0aW9uRXZlbnRMb2NhdG9yIGdldExvY2F0aW9uKCk7CiAKKyAgICAvKioKKyAgICAgKiBJbW11dGFibGUgc25hcHNob3Qgb2YgYSB7QGxpbmsgTG9jYXRvckV4fQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU25hcHNob3QgaW1wbGVtZW50cyBMb2NhdG9yRXgsIFZhbGlkYXRpb25FdmVudExvY2F0b3IgeworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBjb2x1bW5OdW1iZXIsbGluZU51bWJlcixvZmZzZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN5c3RlbUlkLHB1YmxpY0lkOworICAgICAgICBwcml2YXRlIGZpbmFsIFVSTCB1cmw7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG9iamVjdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBOb2RlIG5vZGU7CisKKyAgICAgICAgcHVibGljIFNuYXBzaG90KExvY2F0b3JFeCBsb2MpIHsKKyAgICAgICAgICAgIGNvbHVtbk51bWJlciA9IGxvYy5nZXRDb2x1bW5OdW1iZXIoKTsKKyAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBsb2MuZ2V0TGluZU51bWJlcigpOworICAgICAgICAgICAgc3lzdGVtSWQgPSBsb2MuZ2V0U3lzdGVtSWQoKTsKKyAgICAgICAgICAgIHB1YmxpY0lkID0gbG9jLmdldFB1YmxpY0lkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRpb25FdmVudExvY2F0b3IgdmVsID0gbG9jLmdldExvY2F0aW9uKCk7CisgICAgICAgICAgICBvZmZzZXQgPSB2ZWwuZ2V0T2Zmc2V0KCk7CisgICAgICAgICAgICB1cmwgPSB2ZWwuZ2V0VVJMKCk7CisgICAgICAgICAgICBvYmplY3QgPSB2ZWwuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBub2RlID0gdmVsLmdldE5vZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb2RlIGdldE5vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVUkwgZ2V0VVJMKCkgeworICAgICAgICAgICAgcmV0dXJuIHVybDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW5lTnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzeXN0ZW1JZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gcHVibGljSWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmFsaWRhdGlvbkV2ZW50TG9jYXRvciBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9Mb2NhdG9yRXhXcmFwcGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0xvY2F0b3JFeFdyYXBwZXIuamF2YQppbmRleCBkM2ExYzYxLi43ZWJhODI2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0xvY2F0b3JFeFdyYXBwZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL0xvY2F0b3JFeFdyYXBwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudExvY2F0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL01UT01EZWNvcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTVRPTURlY29yYXRvci5qYXZhCmluZGV4IGFlMzg0MjEuLmZmOWIwY2QgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTVRPTURlY29yYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTVRPTURlY29yYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTWVzc2FnZXMuamF2YQppbmRleCBmNzZiMTY0Li42MjY3MjE0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL01lc3NhZ2VzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggMGE0ZGI3ZS4uMmY2MWY3YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogTk9UX0FfUU5BTUUgPSBcCiAgICAgezB9IGlzIG5vdCBhIHZhbGlkIFFOYW1lCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvUGF0Y2hlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9QYXRjaGVyLmphdmEKaW5kZXggNTE2N2RiOS4uMTFmZWFjYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9QYXRjaGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9QYXRjaGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1Byb3h5TG9hZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1Byb3h5TG9hZGVyLmphdmEKaW5kZXggMWZiMDEyNi4uNzM3NDFhMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9Qcm94eUxvYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvUHJveHlMb2FkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvUmVjZWl2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvUmVjZWl2ZXIuamF2YQppbmRleCA5OWMyZTcwLi5kMWY1ODg0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1JlY2VpdmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9SZWNlaXZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9TQVhDb25uZWN0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU0FYQ29ubmVjdG9yLmphdmEKaW5kZXggZDcyNDc5Mi4uNGE3YWQyOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9TQVhDb25uZWN0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1NBWENvbm5lY3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU2NvcGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU2NvcGUuamF2YQppbmRleCBiNTU5MTM2Li42YWUwMTgzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1Njb3BlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9TY29wZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CkBAIC0xMDcsOCArMTA2LDMwIEBACiAgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc29yRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvYWRlci5oYW5kbGVHZW5lcmljRXhjZXB0aW9uKGUsdHJ1ZSk7CiAgICAgICAgICAgICAvLyByZWNvdmVyIGZyb20gdGhpcyBlcnJvciBieSBpZ25vcmluZyBmdXR1cmUgaXRlbXMuCi0gICAgICAgICAgICB0aGlzLmxpc3RlciA9IExpc3Rlci5FUlJPUjsKLSAgICAgICAgICAgIHRoaXMuYWNjID0gQWNjZXNzb3IuRVJST1I7CisgICAgICAgICAgICB0aGlzLmxpc3RlciA9IExpc3Rlci5nZXRFcnJvckluc3RhbmNlKCk7CisgICAgICAgICAgICB0aGlzLmFjYyA9IEFjY2Vzc29yLmdldEVycm9ySW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgcGFja2luZyBzY29wZSwgd2l0aG91dCBhZGRpbmcgYW55IGl0ZW0uCisgICAgICoKKyAgICAgKiBUaGlzIGFsbG93cyB1cyB0byByZXR1cm4gYW4gZW1wdHkgcGFjaywgdGhlcmVieSBhbGxvd2luZyB0aGUgdXNlcgorICAgICAqIHRvIGRpc3Rpbmd1aXNoIGVtcHR5IGFycmF5IHZzIG51bGwgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoIEFjY2Vzc29yPEJlYW5ULFByb3BUPiBhY2MsIExpc3RlcjxCZWFuVCxQcm9wVCxJdGVtVCxQYWNrVD4gbGlzdGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9ueworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYoIWhhc1N0YXJ0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRoaXMuYmVhbiA9IChCZWFuVCljb250ZXh0LmdldEN1cnJlbnRTdGF0ZSgpLnRhcmdldDsKKyAgICAgICAgICAgICAgICB0aGlzLmFjYyA9IGFjYzsKKyAgICAgICAgICAgICAgICB0aGlzLmxpc3RlciA9IGxpc3RlcjsKKyAgICAgICAgICAgICAgICB0aGlzLnBhY2sgPSBsaXN0ZXIuc3RhcnRQYWNraW5nKGJlYW4sYWNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQWNjZXNzb3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9hZGVyLmhhbmRsZUdlbmVyaWNFeGNlcHRpb24oZSx0cnVlKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXIgZnJvbSB0aGlzIGVycm9yIGJ5IGlnbm9yaW5nIGZ1dHVyZSBpdGVtcy4KKyAgICAgICAgICAgIHRoaXMubGlzdGVyID0gTGlzdGVyLmdldEVycm9ySW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHRoaXMuYWNjID0gQWNjZXNzb3IuZ2V0RXJyb3JJbnN0YW5jZSgpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9TdEFYQ29ubmVjdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1N0QVhDb25uZWN0b3IuamF2YQppbmRleCA5Mzc4Y2JkLi43MmRkNDIzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1N0QVhDb25uZWN0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1N0QVhDb25uZWN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudExvY2F0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1N0QVhFdmVudENvbm5lY3Rvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9TdEFYRXZlbnRDb25uZWN0b3IuamF2YQppbmRleCBlNzdmMDUzLi44NDhlNTdiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1N0QVhFdmVudENvbm5lY3Rvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU3RBWEV2ZW50Q29ubmVjdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC01MCw2ICs0OSw3IEBACiAgKiBwYXJzZXIgdGVjaG5vbG9naWVzLgogICoKICAqIEBhdXRob3IgUnlhbi5TaG9lbWFrZXJAU3VuLkNPTQorICogQHZlcnNpb24gMS4wCiAgKi8KIGZpbmFsIGNsYXNzIFN0QVhFdmVudENvbm5lY3RvciBleHRlbmRzIFN0QVhDb25uZWN0b3IgewogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1N0QVhTdHJlYW1Db25uZWN0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU3RBWFN0cmVhbUNvbm5lY3Rvci5qYXZhCmluZGV4IDk1OWFkMmQuLjgxODcwYjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU3RBWFN0cmVhbUNvbm5lY3Rvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU3RBWFN0cmVhbUNvbm5lY3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CkBAIC00MCw5ICszOSwxNSBAQAogLyoqCiAgKiBSZWFkcyBYTUwgZnJvbSBTdEFYIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IGFuZAogICogZmVlZHMgZXZlbnRzIHRvIHtAbGluayBYbWxWaXNpdG9yfS4KKyAqIDxwPgorICogVE9ETzoKKyAqIEZpbmRpbmcgdGhlIG9wdGltaXplZCBGSSBpbXBsZW1lbnRhdGlvbnMgaXMgYSBiaXQgaGFja3kgYW5kIG5vdCB2ZXJ5CisgKiBleHRlbnNpYmxlLiBDYW4gd2UgdXNlIHRoZSBzZXJ2aWNlIHByb3ZpZGVyIG1lY2huaXNtIGluIGdlbmVyYWwgZm9yCisgKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgU3RBWENvbm5lY3Rvci4KICAqCiAgKiBAYXV0aG9yIFJ5YW4uU2hvZW1ha2VyQFN1bi5DT00KICAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEB2ZXJzaW9uIEpBWEIgMi4wCiAgKi8KIGNsYXNzIFN0QVhTdHJlYW1Db25uZWN0b3IgZXh0ZW5kcyBTdEFYQ29ubmVjdG9yIHsKIApAQCAtNTMsMjYgKzU4LDU5IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdEFYQ29ubmVjdG9yIGNyZWF0ZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBYbWxWaXNpdG9yIHZpc2l0b3IpIHsKICAgICAgICAgLy8gdHJ5IG9wdGltaXplZCBjb2RlcGF0aAotICAgICAgICBpZiAocmVhZGVyLmdldENsYXNzKCk9PUZJX1NUQVhfUkVBREVSX0NMQVNTICYmIEZJX0NPTk5FQ1RPUl9DVE9SIT1udWxsKSB7CisgICAgICAgIGZpbmFsIENsYXNzIHJlYWRlckNsYXNzID0gcmVhZGVyLmdldENsYXNzKCk7CisgICAgICAgIGlmIChGSV9TVEFYX1JFQURFUl9DTEFTUyAhPSBudWxsICYmIEZJX1NUQVhfUkVBREVSX0NMQVNTLmlzQXNzaWduYWJsZUZyb20ocmVhZGVyQ2xhc3MpICYmIEZJX0NPTk5FQ1RPUl9DVE9SIT1udWxsKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJldHVybiBGSV9DT05ORUNUT1JfQ1RPUi5uZXdJbnN0YW5jZShyZWFkZXIsdmlzaXRvcik7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gdCkgewogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChTVEFYX0VYX1JFQURFUiE9bnVsbCAmJiBTVEFYX0VYX1JFQURFUi5pc0Fzc2lnbmFibGVGcm9tKHJlYWRlci5nZXRDbGFzcygpKSkgeworCisgICAgICAgIC8vIFF1aWNrIGhhY2sgdW50aWwgU0pTWFAgZml4ZXMgNjI3MDExNgorICAgICAgICBib29sZWFuIGlzWmVwaHlyID0gcmVhZGVyQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscygiY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLlhNTFJlYWRlckltcGwiKTsKKyAgICAgICAgaWYoaXNaZXBoeXIpCisgICAgICAgICAgICA7IC8vIG5vIG5lZWQgZm9yIGludGVybmluZworICAgICAgICBlbHNlCisgICAgICAgIGlmKGNoZWNrSW1wbGVtZW50YWlvbk5hbWVPZlNqc3hwKHJlYWRlcikpCisgICAgICAgICAgICA7IC8vIG5vIG5lZWQgZm9yIGludGVybmluZworICAgICAgICBpZihnZXRCb29sUHJvcChyZWFkZXIsIm9yZy5jb2RlaGF1cy5zdGF4Mi5pbnRlcm5OYW1lcyIpCisgICAgICAgICYmIGdldEJvb2xQcm9wKHJlYWRlciwib3JnLmNvZGVoYXVzLnN0YXgyLmludGVybk5zVXJpcyIpKQorICAgICAgICAgICAgOyAvLyBubyBuZWVkIGZvciBpbnRlcm5pbmcuCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZpc2l0b3IgPSBuZXcgSW50ZXJuaW5nWG1sVmlzaXRvcih2aXNpdG9yKTsKKworICAgICAgICBpZiAoU1RBWF9FWF9SRUFERVJfQ0xBU1MhPW51bGwgJiYgU1RBWF9FWF9SRUFERVJfQ0xBU1MuaXNBc3NpZ25hYmxlRnJvbShyZWFkZXJDbGFzcykpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVhfRVhfQ09OTkVDVE9SX0NUT1IubmV3SW5zdGFuY2UocmVhZGVyLHZpc2l0b3IpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIFF1aWNrIGhhY2sgdW50aWwgU0pTWFAgZml4ZXMgNjI3MDExNgotICAgICAgICBib29sZWFuIGlzWmVwaHlyID0gcmVhZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLlhNTFJlYWRlckltcGwiKTsKLSAgICAgICAgaWYoIWlzWmVwaHlyKQotICAgICAgICAgICAgdmlzaXRvciA9IG5ldyBJbnRlcm5pbmdYbWxWaXNpdG9yKHZpc2l0b3IpOwogICAgICAgICByZXR1cm4gbmV3IFN0QVhTdHJlYW1Db25uZWN0b3IocmVhZGVyLHZpc2l0b3IpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tJbXBsZW1lbnRhaW9uTmFtZU9mU2pzeHAoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG5hbWUgPSByZWFkZXIuZ2V0UHJvcGVydHkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL3N0cmVhbS9wcm9wZXJ0aWVzL2ltcGxlbWVudGF0aW9uLW5hbWUiKTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lIT1udWxsICYmIG5hbWUuZXF1YWxzKCJzanN4cCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gYmUgZGVmZW5zaXZlIGFnYWluc3QgYnJva2VuIFN0QVggcGFyc2VycyBzaW5jZSBqYXZhZG9jIGlzIG5vdCBjbGVhcgorICAgICAgICAgICAgLy8gYWJvdXQgd2hlbiBhbiBlcnJvciBoYXBwZW5zCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGdldEJvb2xQcm9wKFhNTFN0cmVhbVJlYWRlciByLCBTdHJpbmcgbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG8gPSByLmdldFByb3BlcnR5KG4pOworICAgICAgICAgICAgaWYobyBpbnN0YW5jZW9mIEJvb2xlYW4pICAgIHJldHVybiAoQm9vbGVhbilvOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gYmUgZGVmZW5zaXZlIGFnYWluc3QgYnJva2VuIFN0QVggcGFyc2VycyBzaW5jZSBqYXZhZG9jIGlzIG5vdCBjbGVhcgorICAgICAgICAgICAgLy8gYWJvdXQgd2hlbiBhbiBlcnJvciBoYXBwZW5zCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CiAKIAogICAgIC8vIFN0QVggZXZlbnQgc291cmNlCkBAIC0yOTYsNyArMzM0LDE1IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBpbml0RklTdEFYUmVhZGVyQ2xhc3MoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gVW5tYXJzaGFsbGVySW1wbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygiY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5TdEFYRG9jdW1lbnRQYXJzZXIiKTsKKyAgICAgICAgICAgIENsYXNzIGZpc3IgPSBVbm1hcnNoYWxsZXJJbXBsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkuCisgICAgICAgICAgICAgICAgICAgIGxvYWRDbGFzcygiY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LnN0YXguRmFzdEluZm9zZXRTdHJlYW1SZWFkZXIiKTsKKyAgICAgICAgICAgIENsYXNzIHNkcCA9IFVubWFyc2hhbGxlckltcGwuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgbG9hZENsYXNzKCJjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFBhcnNlciIpOworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgU3RBWERvY3VtZW50UGFyc2VyIGltcGxlbWVudHMgRmFzdEluZm9zZXRTdHJlYW1SZWFkZXIKKyAgICAgICAgICAgIGlmIChmaXNyLmlzQXNzaWduYWJsZUZyb20oc2RwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KQEAgLTMwNCwyMyArMzUwLDI2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgU3RBWENvbm5lY3Rvcj4gaW5pdEZhc3RJbmZvc2V0Q29ubmVjdG9yQ2xhc3MoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjID0gVW5tYXJzaGFsbGVySW1wbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygiY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5GYXN0SW5mb3NldENvbm5lY3RvciIpOworICAgICAgICAgICAgaWYgKEZJX1NUQVhfUkVBREVSX0NMQVNTID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIENsYXNzIGMgPSBVbm1hcnNoYWxsZXJJbXBsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKAorICAgICAgICAgICAgICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlci5GYXN0SW5mb3NldENvbm5lY3RvciIpOwogICAgICAgICAgICAgcmV0dXJuIGMuZ2V0Q29uc3RydWN0b3IoRklfU1RBWF9SRUFERVJfQ0xBU1MsWG1sVmlzaXRvci5jbGFzcyk7CiAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLy8KICAgICAvLyByZWZlcmVuY2UgdG8gU3RBWEV4IGNsYXNzZXMKICAgICAvLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIFNUQVhfRVhfUkVBREVSID0gaW5pdFN0QVhFeFJlYWRlcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIFNUQVhfRVhfUkVBREVSX0NMQVNTID0gaW5pdFN0QVhFeFJlYWRlcigpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBTdEFYQ29ubmVjdG9yPiBTVEFYX0VYX0NPTk5FQ1RPUl9DVE9SID0gaW5pdFN0QVhFeENvbm5lY3RvcigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgaW5pdFN0QVhFeFJlYWRlcigpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBVbm1hcnNoYWxsZXJJbXBsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKCJvcmcuanZuZXQuc3RheGV4LlhNTFN0cmVhbVJlYWRlckV4Iik7CisgICAgICAgICAgICByZXR1cm4gVW5tYXJzaGFsbGVySW1wbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygiY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleC5YTUxTdHJlYW1SZWFkZXJFeCIpOwogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KQEAgLTMyOSw3ICszNzgsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBTdEFYQ29ubmVjdG9yPiBpbml0U3RBWEV4Q29ubmVjdG9yKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2xhc3MgYyA9IFVubWFyc2hhbGxlckltcGwuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXIuU3RBWEV4Q29ubmVjdG9yIik7Ci0gICAgICAgICAgICByZXR1cm4gYy5nZXRDb25zdHJ1Y3RvcihTVEFYX0VYX1JFQURFUixYbWxWaXNpdG9yLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiBjLmdldENvbnN0cnVjdG9yKFNUQVhfRVhfUkVBREVSX0NMQVNTLFhtbFZpc2l0b3IuY2xhc3MpOwogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU3RydWN0dXJlTG9hZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1N0cnVjdHVyZUxvYWRlci5qYXZhCmluZGV4IDFhZWExMmYuLmJkMjQ1MDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvU3RydWN0dXJlTG9hZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9TdHJ1Y3R1cmVMb2FkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9UYWdOYW1lLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1RhZ05hbWUuamF2YQppbmRleCBjNDY1YmUxLi41ZjY1NzZhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1RhZ05hbWUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1RhZ05hbWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1RleHRMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVGV4dExvYWRlci5qYXZhCmluZGV4IGY0OTllYzcuLjNiZjY5YjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVGV4dExvYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVGV4dExvYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1VubWFyc2hhbGxlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVW5tYXJzaGFsbGVySW1wbC5qYXZhCmluZGV4IDkyYWNiZWEuLjE4ZTIxZDUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVW5tYXJzaGFsbGVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVW5tYXJzaGFsbGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTUyLDYgKzUxLDcgQEAKIGltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLklEUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQ2xhc3NSZXNvbHZlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnVubWFyc2hhbGxlci5ET01TY2FubmVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyLkluZm9zZXRTY2FubmVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyLk1lc3NhZ2VzOwpAQCAtNDE4LDYgKzQxOCwxMCBAQAogICAgICAgICAgICAgaWRSZXNvbHZlciA9IChJRFJlc29sdmVyKXZhbHVlOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGlmKG5hbWUuZXF1YWxzKENsYXNzUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgY29vcmRpbmF0b3IuY2xhc3NSZXNvbHZlciA9IChDbGFzc1Jlc29sdmVyKXZhbHVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHN1cGVyLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVW5tYXJzaGFsbGluZ0NvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVW5tYXJzaGFsbGluZ0NvbnRleHQuamF2YQppbmRleCBjZWYxMjgzLi5iYzBjMGIzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1VubWFyc2hhbGxpbmdDb250ZXh0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9Vbm1hcnNoYWxsaW5nQ29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKQEAgLTQ0LDE0ICs0MywxNSBAQAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXI7CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50TG9jYXRvcjsKIGltcG9ydCBqYXZheC54bWwuYmluZC5oZWxwZXJzLlZhbGlkYXRpb25FdmVudEltcGw7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuaGVscGVycy5WYWxpZGF0aW9uRXZlbnRMb2NhdG9ySW1wbDsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiBpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuU0FYUGFyc2VFeGNlcHRpb24yOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuSURSZXNvbHZlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5BY2Nlc3NvckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5DbGFzc1Jlc29sdmVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyLkluZm9zZXRTY2FubmVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuQ2xhc3NGYWN0b3J5OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS5Bc3NvY2lhdGlvbk1hcDsKQEAgLTE1NCw2ICsxNTQsMTAgQEAKICAgICAgKi8KICAgICBwcml2YXRlIE5hbWVzcGFjZUNvbnRleHQgZW52aXJvbm1lbnROYW1lc3BhY2VDb250ZXh0OwogCisgICAgLyoqCisgICAgICogVXNlZCB0byBkaXNjb3ZlciBhZGRpdGlvbmFsIGNsYXNzZXMgd2hlbiB3ZSBoaXQgdW5rbm93biBlbGVtZW50cy90eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIENsYXNzUmVzb2x2ZXIgY2xhc3NSZXNvbHZlcjsKIAogICAgIC8qKgogICAgICAqIFN0YXRlIGluZm9ybWF0aW9uIGZvciBlYWNoIGVsZW1lbnQuCkBAIC0yOTMsNiArMjk3LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogT24gdG9wIG9mIHtAbGluayBKQVhCQ29udGV4dEltcGwjc2VsZWN0Um9vdExvYWRlcihTdGF0ZSwgVGFnTmFtZSl9LAorICAgICAqIHRoaXMgbWV0aG9kIGFsc28gY29uc3VsdHMge0BsaW5rIENsYXNzUmVzb2x2ZXJ9LgorICAgICAqCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHtAbGluayBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyfSByZXBvcnRlZCBhIGZhaWx1cmUuCisgICAgICovCisgICAgcHVibGljIExvYWRlciBzZWxlY3RSb290TG9hZGVyKFN0YXRlIHN0YXRlLCBUYWdOYW1lIHRhZykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMb2FkZXIgbCA9IGdldEpBWEJDb250ZXh0KCkuc2VsZWN0Um9vdExvYWRlcihzdGF0ZSwgdGFnKTsKKyAgICAgICAgICAgIGlmKGwhPW51bGwpICAgICByZXR1cm4gbDsKKworICAgICAgICAgICAgaWYoY2xhc3NSZXNvbHZlciE9bnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gY2xhc3NSZXNvbHZlci5yZXNvbHZlRWxlbWVudE5hbWUodGFnLnVyaSwgdGFnLmxvY2FsKTsKKyAgICAgICAgICAgICAgICBpZihjbGF6eiE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBKQVhCQ29udGV4dEltcGwgZW5oYW5jZWQgPSBnZXRKQVhCQ29udGV4dCgpLmNyZWF0ZUF1Z21lbnRlZChjbGF6eik7CisgICAgICAgICAgICAgICAgICAgIEpheEJlYW5JbmZvPD8+IGJpID0gZW5oYW5jZWQuZ2V0QmVhbkluZm8oY2xhenopOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmkuZ2V0TG9hZGVyKGVuaGFuY2VkLHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBbGxvY2F0ZXMgYSBmZXcgbW9yZSB7QGxpbmsgU3RhdGV9cy4KICAgICAgKgogICAgICAqIEFsbG9jYXRpbmcgbXVsdGlwbGUge0BsaW5rIFN0YXRlfXMgYXQgb25jZSBhbGxvd3MgdGhvc2Ugb2JqZWN0cwpAQCAtMzQzLDcgKzM3Niw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChMb2NhdG9yRXggbG9jYXRvciwgTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworICAgICAgICBpZihsb2NhdG9yIT1udWxsKQorICAgICAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKICAgICAgICAgdGhpcy5lbnZpcm9ubWVudE5hbWVzcGFjZUNvbnRleHQgPSBuc0NvbnRleHQ7CiAgICAgICAgIC8vIHJlc2V0IHRoZSBvYmplY3QKICAgICAgICAgcmVzdWx0ID0gbnVsbDsKQEAgLTM1NCw4ICszODgsNiBAQAogICAgICAgICBpc1VubWFyc2hhbEluUHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgICBuc0xlbj0wOwogCi0gICAgICAgIHN0YXJ0UHJlZml4TWFwcGluZygiIiwiIik7IC8vIGJ5IGRlZmF1bHQsIHRoZSBkZWZhdWx0IG5zIGlzIGJvdW5kIHRvICIiLgotCiAgICAgICAgIHNldFRocmVhZEFmZmluaXR5KCk7CiAKICAgICAgICAgaWYoZXhwZWN0ZWRUeXBlIT1udWxsKQpAQCAtNTk2LDExICs2MjgsMTEgQEAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiB0aGVyZSdzIG5vIGNvcnJlc3BvbmRpbmcgSUQgdmFsdWUuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgZXJyb3JVbnJlc29sdmVkSURSRUYoT2JqZWN0IGJlYW4sIFN0cmluZyBpZHJlZikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgZXJyb3JVbnJlc29sdmVkSURSRUYoT2JqZWN0IGJlYW4sIFN0cmluZyBpZHJlZiwgTG9jYXRvckV4IGxvYykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGhhbmRsZUV2ZW50KCBuZXcgVmFsaWRhdGlvbkV2ZW50SW1wbCgKICAgICAgICAgICAgIFZhbGlkYXRpb25FdmVudC5FUlJPUiwKICAgICAgICAgICAgIE1lc3NhZ2VzLlVOUkVTT0xWRURfSURSRUYuZm9ybWF0KGlkcmVmKSwKLSAgICAgICAgICAgIG5ldyBWYWxpZGF0aW9uRXZlbnRMb2NhdG9ySW1wbChiZWFuKSksIHRydWUgKTsKKyAgICAgICAgICAgIGxvYy5nZXRMb2NhdGlvbigpKSwgdHJ1ZSApOwogICAgIH0KIAogCkBAIC03MjgsNiArNzYwLDEyIEBACiAgICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB1bnRpbCBaZXBoeXIgZml4ZXMgNjMzNzE4MAogICAgICAgICAgICAgcmV0dXJuIGVudmlyb25tZW50TmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4LmludGVybigpKTsKIAorICAgICAgICAvLyBieSBkZWZhdWx0LCB0aGUgZGVmYXVsdCBucyBpcyBib3VuZCB0byAiIi4KKyAgICAgICAgLy8gYnV0IGFsbG93IGVudmlyb25tZW50TmFtZXNwYWNlQ29udGV4dCB0byB0YWtlIHByZWNlZGVuY2UKKyAgICAgICAgaWYocHJlZml4LmVxdWFscygiIikpCisgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgLy8gdW5yZXNvbHZlZC4gZXJyb3IuCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtNzUwLDcgKzc4OCw3IEBACiAgICAgICogICAgICBpcyByZXByZXNlbnRlZCBieSB0aGUgZW1wdHkgc3RyaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBbGxEZWNsYXJlZFByZWZpeGVzKCkgewotICAgICAgICByZXR1cm4gZ2V0UHJlZml4TGlzdCggMiApOyAgLy8gc2tpcCB0aGUgZGVmYXVsdCAiIi0+IiIgbWFwcGluZworICAgICAgICByZXR1cm4gZ2V0UHJlZml4TGlzdCgwKTsKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZ1tdIGdldFByZWZpeExpc3QoIGludCBzdGFydEluZGV4ICkgewpAQCAtODg1LDEwICs5MjMsMTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmRTY29wZShpbnQgZnJhbWVTaXplKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciggOyBmcmFtZVNpemU+MDsgZnJhbWVTaXplLS0gKQotICAgICAgICAgICAgICAgIHNjb3Blc1tzY29wZVRvcC0tXS5maW5pc2goKTsKKyAgICAgICAgICAgIGZvciggOyBmcmFtZVNpemU+MDsgZnJhbWVTaXplLS0sIHNjb3BlVG9wLS0gKQorICAgICAgICAgICAgICAgIHNjb3Blc1tzY29wZVRvcF0uZmluaXNoKCk7CiAgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc29yRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGhhbmRsZUVycm9yKGUpOworCisgICAgICAgICAgICAvLyB0aGUgZXJyb3IgbWlnaHQgaGF2ZSBsZWZ0IHNjb3BlcyBpbiBpbmNvbnNpc3RlbnQgc3RhdGUsCisgICAgICAgICAgICAvLyBzbyByZXBsYWNlIHRoZW0gYnkgZnJlc2ggb25lcworICAgICAgICAgICAgZm9yKCA7IGZyYW1lU2l6ZT4wOyBmcmFtZVNpemUtLSApCisgICAgICAgICAgICAgICAgc2NvcGVzW3Njb3BlVG9wLS1dID0gbmV3IFNjb3BlKHRoaXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MjgsOSArOTcxLDcgQEAKICAgICAgICAgICogdW5tYXJzaGFsbGluZy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIGNoaWxkRWxlbWVudChVbm1hcnNoYWxsaW5nQ29udGV4dC5TdGF0ZSBzdGF0ZSwgVGFnTmFtZSBlYSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBKQVhCQ29udGV4dEltcGwgamF4YkNvbnRleHQgPSBzdGF0ZS5nZXRDb250ZXh0KCkuZ2V0SkFYQkNvbnRleHQoKTsKLQotICAgICAgICAgICAgTG9hZGVyIGxvYWRlciA9IGpheGJDb250ZXh0LnNlbGVjdFJvb3RMb2FkZXIoc3RhdGUsZWEpOworICAgICAgICAgICAgTG9hZGVyIGxvYWRlciA9IHN0YXRlLmdldENvbnRleHQoKS5zZWxlY3RSb290TG9hZGVyKHN0YXRlLGVhKTsKICAgICAgICAgICAgIGlmKGxvYWRlciE9bnVsbCkgewogICAgICAgICAgICAgICAgIHN0YXRlLmxvYWRlciA9IGxvYWRlcjsKICAgICAgICAgICAgICAgICBzdGF0ZS5yZWNlaXZlciA9IHRoaXM7CkBAIC05MzksNyArOTgwLDcgQEAKIAogICAgICAgICAgICAgLy8gdGhlIHJlZ2lzdHJ5IGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIGVsZW1lbnQuCiAgICAgICAgICAgICAvLyB0cnkgaXRzIHhzaTp0eXBlCi0gICAgICAgICAgICBKYXhCZWFuSW5mbyBiZWFuSW5mbyA9IFhzaVR5cGVMb2FkZXIucGFyc2VYc2lUeXBlKHN0YXRlLCBlYSk7CisgICAgICAgICAgICBKYXhCZWFuSW5mbyBiZWFuSW5mbyA9IFhzaVR5cGVMb2FkZXIucGFyc2VYc2lUeXBlKHN0YXRlLCBlYSwgbnVsbCk7CiAgICAgICAgICAgICBpZihiZWFuSW5mbz09bnVsbCkgewogICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGV2ZW4ga25vdyBpdHMgeHNpOnR5cGUKICAgICAgICAgICAgICAgICByZXBvcnRVbmV4cGVjdGVkQ2hpbGRFbGVtZW50KGVhLGZhbHNlKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVmFsaWRhdGluZ1VubWFyc2hhbGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9WYWxpZGF0aW5nVW5tYXJzaGFsbGVyLmphdmEKaW5kZXggZGFjNmJkNC4uNTEwOWFmYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9WYWxpZGF0aW5nVW5tYXJzaGFsbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9WYWxpZGF0aW5nVW5tYXJzaGFsbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIucnVudGltZS51bm1hcnNoYWxsZXI7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1ZhbHVlUHJvcGVydHlMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVmFsdWVQcm9wZXJ0eUxvYWRlci5qYXZhCmluZGV4IGJhOGFkM2YuLmZkYzg3MWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVmFsdWVQcm9wZXJ0eUxvYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvVmFsdWVQcm9wZXJ0eUxvYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnJlZmxlY3QuVHJhbnNkdWNlZEFjY2Vzc29yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9XaWxkY2FyZExvYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9XaWxkY2FyZExvYWRlci5qYXZhCmluZGV4IDUzMzQwZmMuLjJiNDliODggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvV2lsZGNhcmRMb2FkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1dpbGRjYXJkTG9hZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNiArMjMsOSBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCiAKKy8qCisgKiBAKCMpJElkOiBXaWxkY2FyZExvYWRlci5qYXZhLHYgMS4zLjYuMSAyMDA2LzA4LzIzIDE3OjI0OjM5IGtvaHN1a2UgRXhwICQKKyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUudW5tYXJzaGFsbGVyOwogCiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5Eb21IYW5kbGVyOwpAQCAtNTMsMTEgKzU2LDExIEBACiAgICAgICAgIHRoaXMubW9kZSA9IG1vZGU7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIExvYWRlciBzZWxlY3RMb2FkZXIoVW5tYXJzaGFsbGluZ0NvbnRleHQuU3RhdGUgc3RhdGUsIFRhZ05hbWUgZWEpIHsKKyAgICBwcm90ZWN0ZWQgTG9hZGVyIHNlbGVjdExvYWRlcihVbm1hcnNoYWxsaW5nQ29udGV4dC5TdGF0ZSBzdGF0ZSwgVGFnTmFtZSB0YWcpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBVbm1hcnNoYWxsaW5nQ29udGV4dCBjb250ZXh0ID0gc3RhdGUuZ2V0Q29udGV4dCgpOwogCiAgICAgICAgIGlmKG1vZGUuYWxsb3dUeXBlZE9iamVjdCkgewotICAgICAgICAgICAgTG9hZGVyIGwgPSBjb250ZXh0LmdldEpBWEJDb250ZXh0KCkuc2VsZWN0Um9vdExvYWRlcihzdGF0ZSxlYSk7CisgICAgICAgICAgICBMb2FkZXIgbCA9IGNvbnRleHQuc2VsZWN0Um9vdExvYWRlcihzdGF0ZSx0YWcpOwogICAgICAgICAgICAgaWYobCE9bnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9YbWxWaXNpdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1htbFZpc2l0b3IuamF2YQppbmRleCA3M2I4YTZkLi43ZTQwNzhjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1htbFZpc2l0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1htbFZpc2l0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvWHNpTmlsTG9hZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1hzaU5pbExvYWRlci5qYXZhCmluZGV4IDkyODVlNTYuLjc0MGVhYTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvcnVudGltZS91bm1hcnNoYWxsZXIvWHNpTmlsTG9hZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9Yc2lOaWxMb2FkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXJJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9ydW50aW1lL3VubWFyc2hhbGxlci9Yc2lUeXBlTG9hZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1hzaVR5cGVMb2FkZXIuamF2YQppbmRleCAwYTNkZDM5Li5mM2Q4Y2RiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1hzaVR5cGVMb2FkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3J1bnRpbWUvdW5tYXJzaGFsbGVyL1hzaVR5cGVMb2FkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLnVubWFyc2hhbGxlcjsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CkBAIC0zMCw2ICsyOSw3IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5EYXRhdHlwZUNvbnZlcnRlckltcGw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5XZWxsS25vd25OYW1lc3BhY2U7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkpheEJlYW5JbmZvOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC01Miw3ICs1Miw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFVubWFyc2hhbGxpbmdDb250ZXh0LlN0YXRlIHN0YXRlLCBUYWdOYW1lIGVhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgSmF4QmVhbkluZm8gYmVhbkluZm8gPSBwYXJzZVhzaVR5cGUoc3RhdGUsIGVhKTsKKyAgICAgICAgSmF4QmVhbkluZm8gYmVhbkluZm8gPSBwYXJzZVhzaVR5cGUoc3RhdGUsZWEsZGVmYXVsdEJlYW5JbmZvKTsKICAgICAgICAgaWYoYmVhbkluZm89PW51bGwpCiAgICAgICAgICAgICBiZWFuSW5mbyA9IGRlZmF1bHRCZWFuSW5mbzsKIApAQCAtNjEsNyArNjEsNyBAQAogICAgICAgICBsb2FkZXIuc3RhcnRFbGVtZW50KHN0YXRlLGVhKTsKICAgICB9CiAKLSAgICAvKnBhY2FrZ2UqLyBzdGF0aWMgSmF4QmVhbkluZm8gcGFyc2VYc2lUeXBlKFVubWFyc2hhbGxpbmdDb250ZXh0LlN0YXRlIHN0YXRlLCBUYWdOYW1lIGVhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAvKnBhY2FrZ2UqLyBzdGF0aWMgSmF4QmVhbkluZm8gcGFyc2VYc2lUeXBlKFVubWFyc2hhbGxpbmdDb250ZXh0LlN0YXRlIHN0YXRlLCBUYWdOYW1lIGVhLCBATnVsbGFibGUgSmF4QmVhbkluZm8gZGVmYXVsdEJlYW5JbmZvKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgVW5tYXJzaGFsbGluZ0NvbnRleHQgY29udGV4dCA9IHN0YXRlLmdldENvbnRleHQoKTsKICAgICAgICAgSmF4QmVhbkluZm8gYmVhbkluZm8gPSBudWxsOwogCkBAIC03OCw2ICs3OCwxNSBAQAogICAgICAgICAgICAgaWYodHlwZT09bnVsbCkgewogICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKE1lc3NhZ2VzLk5PVF9BX1FOQU1FLmZvcm1hdCh2YWx1ZSksdHJ1ZSk7CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKGRlZmF1bHRCZWFuSW5mbyE9bnVsbCAmJiBkZWZhdWx0QmVhbkluZm8uZ2V0VHlwZU5hbWVzKCkuY29udGFpbnModHlwZSkpCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgeHNpOnR5cGUgaXMgc29tZXRoaW5nIHRoYXQgdGhlIGRlZmF1bHQgdHlwZSBjYW4gYWxyZWFkeSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpdCBkbyBzby4gVGhpcyBpcyBhZGRlZCBhcyBhIHdvcmsgYXJvdW5kIHRvIGJ1ZyBodHRwczovL2pheC13cy5kZXYuamF2YS5uZXQvaXNzdWVzL3Nob3dfYnVnLmNnaT9pZD0xOTUKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgYSByZWR1bmRhbnQgeHNpOnR5cGU9InhzOmRhdGVUaW1lIiBjYXVzZXMgSkFYQiB0byB1bm1hcnNoYWwgWE1MR3JlZ29yaWFuQ2FsZW5kYXIsCisgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIERhdGUgaXMgZXhwZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGEgY29tcGxldGUgZml4LCBhcyB3ZSBzdGlsbCB3b24ndCBiZSBhYmxlIHRvIGhhbmRsZSBzaW1wbGUgdHlwZSBzdWJzdGl0dXRpb24gaW4gZ2VuZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG5vbmUtdGhlLWxlc3MKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRCZWFuSW5mbzsKKwogICAgICAgICAgICAgICAgIGJlYW5JbmZvID0gY29udGV4dC5nZXRKQVhCQ29udGV4dCgpLmdldEdsb2JhbFR5cGUodHlwZSk7CiAgICAgICAgICAgICAgICAgaWYoYmVhbkluZm89PW51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5lYXJlc3QgPSBjb250ZXh0LmdldEpBWEJDb250ZXh0KCkuZ2V0TmVhcmVzdFR5cGVOYW1lKHR5cGUpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vRm9vbFByb29mUmVzb2x2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL0Zvb2xQcm9vZlJlc29sdmVyLmphdmEKaW5kZXggNzVjOWIyZC4uOGQ2YmEwMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vRm9vbFByb29mUmVzb2x2ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9Gb29sUHJvb2ZSZXNvbHZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9Gb3JtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9Gb3JtLmphdmEKaW5kZXggZGZiNDViNC4uMTQ3NzIxMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vRm9ybS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL0Zvcm0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW47CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE5zRm9ybTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL0dyb3VwS2luZC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vR3JvdXBLaW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyZGVlMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL0dyb3VwS2luZC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW47CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWEuUGFydGljbGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLkNvbnRlbnRNb2RlbENvbnRhaW5lcjsKKworLyoqCisgKiBFbnVtIGZvciBtb2RlbCBncm91cCB0eXBlLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZW51bSBHcm91cEtpbmQgeworICAgIEFMTCgiYWxsIiksIFNFUVVFTkNFKCJzZXF1ZW5jZSIpLCBDSE9JQ0UoImNob2ljZSIpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgIEdyb3VwS2luZChTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbW9kZWwgZ3JvdXAuCisgICAgICovCisgICAgUGFydGljbGUgd3JpdGUoQ29udGVudE1vZGVsQ29udGFpbmVyIHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50Ll9lbGVtZW50KG5hbWUsUGFydGljbGUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKKy8qKgorICogTWVzc2FnZSByZXNvdXJjZXMKKyAqLworZW51bSBNZXNzYWdlcyB7CisgICAgQU5PTllNT1VTX1RZUEVfQ1lDTEUgLy8gMSBhcmcKKyAgICA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShNZXNzYWdlcy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KCBPYmplY3QuLi4gYXJncyApIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCByYi5nZXRTdHJpbmcobmFtZSgpKSwgYXJncyApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9NZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDdkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCitBTk9OWU1PVVNfVFlQRV9DWUNMRT1Bbm9ueW1vdXMgdHlwZXMgZm9ybSBhbiBpbmZpbml0ZSBjeWNsZTogezB9CisgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9NdWx0aU1hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vTXVsdGlNYXAuamF2YQppbmRleCA5ZTQxNzM3Li42YzhjODQyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9NdWx0aU1hcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL011bHRpTWFwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuOwogCiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9UcmVlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9UcmVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiMDQxOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL1RyZWUuamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYS5Db250ZW50TW9kZWxDb250YWluZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLlBhcnRpY2xlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYS5UeXBlRGVmUGFydGljbGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLk9jY3VyczsKKworLyoqCisgKiBOb3JtYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50IG1vZGVsLgorICoKKyAqIDxwPgorICogVGhpcyBpcyBidWlsdCBmcm9tIGJvdHRvbSB1cCBzbyB0aGF0IHdlIGNhbiBlbGltaW5hdGUgcmVkdW5kYW50IGNvbnN0cnVjdHMsCisgKiBhbmQgcHJvZHVjZSB0aGUgbW9zdCBjb25jaXNlIGNvbnRlbnQgbW9kZWwgZGVmaW5pdGlvbiBpbiBYTUwuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCithYnN0cmFjdCBjbGFzcyBUcmVlIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgIlQ/IiBmcm9tICJUIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbHkKKyAgICAgKiAgICAgIGlmIGZhbHNlIHRoaXMgbWV0aG9kIGJlY29tZXMgbm8tb3AuIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gd3JpdGUKKyAgICAgKiAgICAgIHRoZSBjYWxsZXIgZmx1ZW50bHkuCisgICAgICovCisgICAgVHJlZSBtYWtlT3B0aW9uYWwoYm9vbGVhbiByZWFsbHkpIHsKKyAgICAgICAgcmV0dXJuIHJlYWxseT9uZXcgT3B0aW9uYWwodGhpcykgOnRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyAiVCsiIGZyb20gIlQiLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWxseQorICAgICAqICAgICAgaWYgZmFsc2UgdGhpcyBtZXRob2QgYmVjb21lcyBuby1vcC4gVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiB3cml0ZQorICAgICAqICAgICAgdGhlIGNhbGxlciBmbHVlbnRseS4KKyAgICAgKi8KKyAgICBUcmVlIG1ha2VSZXBlYXRlZChib29sZWFuIHJlYWxseSkgeworICAgICAgICByZXR1cm4gcmVhbGx5P25ldyBSZXBlYXRlZCh0aGlzKSA6dGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZ3JvdXAgdHJlZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgVHJlZSBtYWtlR3JvdXAoR3JvdXBLaW5kIGtpbmQsIExpc3Q8VHJlZT4gY2hpbGRyZW4gKSB7CisgICAgICAgIC8vIHBvaW50bGVzcyBiaW5hcnkgb3BlcmF0b3IuCisgICAgICAgIGlmKGNoaWxkcmVuLnNpemUoKT09MSkKKyAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbi5nZXQoMCk7CisKKyAgICAgICAgLy8gd2UgbmVpdGhlciBoYXZlIGVwc2lsb24gb3IgZW1wdHlTZXQsIHNvIGNhbid0IGhhbmRsZSBjaGlsZHJlbi5sZW5ndGg9PTAgbmljZWx5CisKKyAgICAgICAgLy8gZWxpbWluYXRlZCBuZXN0aW5nIGdyb3VwcyBvZiB0aGUgc2FtZSBraW5kLgorICAgICAgICAvLyB0aGlzIGlzIHdoZXJlIGJpbmFyeSB0cmVlIHdvdWxkIGhhdmUgc2hpbmVkLgorICAgICAgICBMaXN0PFRyZWU+IG5vcm1hbGl6ZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VHJlZT4oY2hpbGRyZW4uc2l6ZSgpKTsKKyAgICAgICAgZm9yIChUcmVlIHQgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBHcm91cCkgeworICAgICAgICAgICAgICAgIEdyb3VwIGcgPSAoR3JvdXApIHQ7CisgICAgICAgICAgICAgICAgaWYoZy5raW5kPT1raW5kKSB7CisgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRDaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChnLmNoaWxkcmVuKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vcm1hbGl6ZWRDaGlsZHJlbi5hZGQodCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEdyb3VwKGtpbmQsbm9ybWFsaXplZENoaWxkcmVuLnRvQXJyYXkobmV3IFRyZWVbbm9ybWFsaXplZENoaWxkcmVuLnNpemUoKV0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmVlIGFjY2VwdHMgZW1wdHkgc2VxdWVuY2UuCisgICAgICovCisgICAgYWJzdHJhY3QgYm9vbGVhbiBpc051bGxhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRvcCBub2RlIG9mIHRoaXMgdHJlZSBjYW4KKyAgICAgKiBhcHBlYXIgYXMgYSB2YWxpZCB0b3AtbGV2ZWwgY29udGVudCBtb2RlbCBpbiBYTUwgU2NoZW1hLgorICAgICAqCisgICAgICogPHA+CisgICAgICogTW9kZWwgZ3JvdXBzIGFuZCBvY2N1cnJlbmNlcyB0aGF0IGhhdmUgbW9kZWwgZ3JvdXAgaW4gaXQgY2FuLgorICAgICAqLworICAgIGJvb2xlYW4gY2FuQmVUb3BMZXZlbCgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgb3V0IHRoZSBjb250ZW50IG1vZGVsLgorICAgICAqCisgICAgICogTm9ybWFsbCB0aGlzIHJ1bnMgcmVjdXJzaXZlbHkgdW50aWwgd2Ugd3JpdGUgb3V0IHRoZSB3aG9sZSBjb250ZW50IG1vZGVsLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlKENvbnRlbnRNb2RlbENvbnRhaW5lciBwYXJlbnQsIGJvb2xlYW4gaXNPcHRpb25hbCwgYm9vbGVhbiByZXBlYXRlZCk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgaW5zaWRlIHRoZSBnaXZlbiBjb21wbGV4IHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoVHlwZURlZlBhcnRpY2xlIGN0KSB7CisgICAgICAgIGlmKGNhbkJlVG9wTGV2ZWwoKSkKKyAgICAgICAgICAgIHdyaXRlKGN0Ll9jYXN0KENvbnRlbnRNb2RlbENvbnRhaW5lci5jbGFzcyksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIG5lZWQgYSBkdW1teSB3cmFwcGVyCisgICAgICAgICAgICBuZXcgR3JvdXAoR3JvdXBLaW5kLlNFUVVFTkNFLHRoaXMpLndyaXRlKGN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gd3JpdGUgb2NjdXJyZW5jZSBjb25zdHJhaW50cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCB3cml0ZU9jY3VycyhPY2N1cnMgbywgYm9vbGVhbiBpc09wdGlvbmFsLCBib29sZWFuIHJlcGVhdGVkKSB7CisgICAgICAgIGlmKGlzT3B0aW9uYWwpCisgICAgICAgICAgICBvLm1pbk9jY3VycygwKTsKKyAgICAgICAgaWYocmVwZWF0ZWQpCisgICAgICAgICAgICBvLm1heE9jY3VycygidW5ib3VuZGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHRlcm1pbmFsIHRyZWUgbm9kZSwgc3VjaCBhcyBlbGVtZW50LCB3aWxkY2FyZCwgZXRjLgorICAgICAqLworICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBUZXJtIGV4dGVuZHMgVHJlZSB7CisgICAgICAgIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICJUPyIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPcHRpb25hbCBleHRlbmRzIFRyZWUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFRyZWUgYm9keTsKKworICAgICAgICBwcml2YXRlIE9wdGlvbmFsKFRyZWUgYm9keSkgeworICAgICAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGlzTnVsbGFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBUcmVlIG1ha2VPcHRpb25hbChib29sZWFuIHJlYWxseSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoQ29udGVudE1vZGVsQ29udGFpbmVyIHBhcmVudCwgYm9vbGVhbiBpc09wdGlvbmFsLCBib29sZWFuIHJlcGVhdGVkKSB7CisgICAgICAgICAgICBib2R5LndyaXRlKHBhcmVudCx0cnVlLHJlcGVhdGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICJUKyIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXBlYXRlZCBleHRlbmRzIFRyZWUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFRyZWUgYm9keTsKKworICAgICAgICBwcml2YXRlIFJlcGVhdGVkKFRyZWUgYm9keSkgeworICAgICAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGlzTnVsbGFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gYm9keS5pc051bGxhYmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgVHJlZSBtYWtlUmVwZWF0ZWQoYm9vbGVhbiByZWFsbHkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKENvbnRlbnRNb2RlbENvbnRhaW5lciBwYXJlbnQsIGJvb2xlYW4gaXNPcHRpb25hbCwgYm9vbGVhbiByZXBlYXRlZCkgeworICAgICAgICAgICAgYm9keS53cml0ZShwYXJlbnQsaXNPcHRpb25hbCx0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICJTfFQiLCAiUyxUIiwgYW5kICJTJmFtcDtUIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBHcm91cCBleHRlbmRzIFRyZWUgeworICAgICAgICBwcml2YXRlIGZpbmFsIEdyb3VwS2luZCBraW5kOworICAgICAgICBwcml2YXRlIGZpbmFsIFRyZWVbXSBjaGlsZHJlbjsKKworICAgICAgICBwcml2YXRlIEdyb3VwKEdyb3VwS2luZCBraW5kLCBUcmVlLi4uIGNoaWxkcmVuKSB7CisgICAgICAgICAgICB0aGlzLmtpbmQgPSBraW5kOworICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gY2FuQmVUb3BMZXZlbCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKKyAgICAgICAgICAgIGlmKGtpbmQ9PSBHcm91cEtpbmQuQ0hPSUNFKSB7CisgICAgICAgICAgICAgICAgZm9yIChUcmVlIHQgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgICAgICAgICBpZih0LmlzTnVsbGFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoVHJlZSB0IDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIXQuaXNOdWxsYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShDb250ZW50TW9kZWxDb250YWluZXIgcGFyZW50LCBib29sZWFuIGlzT3B0aW9uYWwsIGJvb2xlYW4gcmVwZWF0ZWQpIHsKKyAgICAgICAgICAgIFBhcnRpY2xlIGMgPSBraW5kLndyaXRlKHBhcmVudCk7CisgICAgICAgICAgICB3cml0ZU9jY3VycyhjLGlzT3B0aW9uYWwscmVwZWF0ZWQpOworCisgICAgICAgICAgICBmb3IgKFRyZWUgY2hpbGQgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgICAgIGNoaWxkLndyaXRlKGMsZmFsc2UsZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vVXRpbC5qYXZhCmluZGV4IDlhMTNlMzUuLmRkNGM2ODMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL1V0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL1htbFNjaGVtYUdlbmVyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vWG1sU2NoZW1hR2VuZXJhdG9yLmphdmEKaW5kZXggMWJhYTgzMy4uMjY3NmZjNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vWG1sU2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vWG1sU2NoZW1hR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTIgKzIyLDEyIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW47CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKIApAQCAtNDYsMTAgKzQ3LDEzIEBACiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwogCiBpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLlV0aWw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQ29tcG9zaXRlU3RydWN0dXJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkVycm9yTGlzdGVuZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5UT0RPOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuV2VsbEtub3duTmFtZXNwYWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIudXRpbC5Db2xsaXNpb25DaGVja1N0YWNrOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLldlbGxLbm93bk5hbWVzcGFjZS5YTUxfU0NIRU1BOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5BZGFwdGVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIubW9kZWwuY29yZS5BcnJheUluZm87CkBAIC04Myw3ICs4Nyw2IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLkxpc3Q7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLkxvY2FsQXR0cmlidXRlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYS5Mb2NhbEVsZW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLk9jY3VyczsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWEuU2NoZW1hOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYS5TaW1wbGVFeHRlbnNpb247CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLlNpbXBsZVJlc3RyaWN0aW9uTW9kZWw7CkBAIC05MiwxMCArOTUsMTcgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWEuVG9wTGV2ZWxBdHRyaWJ1dGU7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLlRvcExldmVsRWxlbWVudDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWEuVHlwZUhvc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hLkNvbnRlbnRNb2RlbENvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWEuVHlwZURlZlBhcnRpY2xlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYS5BdHRyaWJ1dGVUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLmVwaXNvZGUuQmluZGluZ3M7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UWFc7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeHdFeGNlcHRpb247CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dC5SZXN1bHRGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIub3V0cHV0LlhtbFNlcmlhbGl6ZXI7CisKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgVzNDIFhNTCBTY2hlbWEgZG9jdW1lbnRzIGZyb20gYSBzZXQgb2YgSmF2YSBjbGFzc2VzLgpAQCAtMTI3LDYgKzEzNywxMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxOYW1lc3BhY2U+IG5hbWVzcGFjZXMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsTmFtZXNwYWNlPihOQU1FU1BBQ0VfQ09NUEFSQVRPUik7CiAKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgRXJyb3JMaXN0ZW5lcn0gdG8gc2VuZCBlcnJvcnMgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBFcnJvckxpc3RlbmVyIGVycm9yTGlzdGVuZXI7CisKICAgICAvKiogbW9kZWwgbmF2aWdhdG9yICoqLwogICAgIHByaXZhdGUgTmF2aWdhdG9yPFQsQyxGLE0+IG5hdmlnYXRvcjsKIApAQCAtMTQyLDYgKzE1NywxMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgTm9uRWxlbWVudDxULEM+IGFueVR5cGU7CiAKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGRldGVjdCBjeWNsZXMgaW4gYW5vbnltb3VzIHR5cGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ29sbGlzaW9uQ2hlY2tTdGFjazxDbGFzc0luZm88VCxDPj4gY29sbGlzaW9uQ2hlY2tlciA9IG5ldyBDb2xsaXNpb25DaGVja1N0YWNrPENsYXNzSW5mbzxULEM+PigpOworCiAgICAgcHVibGljIFhtbFNjaGVtYUdlbmVyYXRvciggTmF2aWdhdG9yPFQsQyxGLE0+IG5hdmlnYXRvciwgVHlwZUluZm9TZXQ8VCxDLEYsTT4gdHlwZXMgKSB7CiAgICAgICAgIHRoaXMubmF2aWdhdG9yID0gbmF2aWdhdG9yOwogICAgICAgICB0aGlzLnR5cGVzID0gdHlwZXM7CkBAIC0yMjgsMTIgKzI0OCwxNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihnZW5lcmF0ZVN3YVJlZkFkYXB0ZXIocCkpCisgICAgICAgICAgICAgICAgbi51c2VTd2FSZWYgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gcmVjdXJzZSBvbiBiYXNlVHlwZXMgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY2FuIHJlZmVyIHRvIHRoZW0gaW4gdGhlIHNjaGVtYQogICAgICAgICBDbGFzc0luZm88VCxDPiBiYyA9IGNsYXp6LmdldEJhc2VDbGFzcygpOwotICAgICAgICBpZiAoYmMgIT0gbnVsbCkKKyAgICAgICAgaWYgKGJjICE9IG51bGwpIHsKICAgICAgICAgICAgIGFkZChiYyk7CisgICAgICAgICAgICBuLmFkZERlcGVuZGVuY3lUbyhiYy5nZXRUeXBlTmFtZSgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzE2LDE2ICszNDEsNzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBXcml0ZXMgb3V0IHRoZSBlcGlzb2RlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVFcGlzb2RlRmlsZShYbWxTZXJpYWxpemVyIG91dCkgeworICAgICAgICBCaW5kaW5ncyByb290ID0gVFhXLmNyZWF0ZShCaW5kaW5ncy5jbGFzcywgb3V0KTsKKworICAgICAgICBpZihuYW1lc3BhY2VzLmNvbnRhaW5zS2V5KCIiKSkgLy8gb3RoZXJ3aXNlIGpheGIgYmluZGluZyBOUyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgICAgICByb290Ll9uYW1lc3BhY2UoV2VsbEtub3duTmFtZXNwYWNlLkpBWEIsImpheGIiKTsKKyAgICAgICAgcm9vdC52ZXJzaW9uKCIyLjEiKTsKKyAgICAgICAgLy8gVE9ETzogZG9uJ3Qgd2Ugd2FudCB0byBiYWtlIGluIHZlcnNpb25zPworCisgICAgICAgIC8vIGdlbmVyYXRlIGxpc3RpbmcgcGVyIHNjaGVtYQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsTmFtZXNwYWNlPiBlIDogbmFtZXNwYWNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBCaW5kaW5ncyBncm91cCA9IHJvb3QuYmluZGluZ3MoKTsKKworICAgICAgICAgICAgU3RyaW5nIHByZWZpeDsKKyAgICAgICAgICAgIFN0cmluZyB0bnMgPSBlLmdldEtleSgpOworICAgICAgICAgICAgaWYoIXRucy5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgZ3JvdXAuX25hbWVzcGFjZSh0bnMsInRucyIpOworICAgICAgICAgICAgICAgIHByZWZpeCA9ICJ0bnM6IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdyb3VwLnNjZCgieC1zY2hlbWE6OiIrKHRucy5lcXVhbHMoIiIpPyIiOiJ0bnMiKSk7CisgICAgICAgICAgICBncm91cC5zY2hlbWFCaW5kaW5ncygpLm1hcChmYWxzZSk7CisKKyAgICAgICAgICAgIGZvciAoQ2xhc3NJbmZvPFQsQz4gY2kgOiBlLmdldFZhbHVlKCkuY2xhc3NlcykgeworICAgICAgICAgICAgICAgIGlmKGNpLmdldFR5cGVOYW1lKCk9PW51bGwpICBjb250aW51ZTsgICAvLyBsb2NhbCB0eXBlCisKKyAgICAgICAgICAgICAgICBpZihjaS5nZXRUeXBlTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh0bnMpKSB7CisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzIGNoaWxkID0gZ3JvdXAuYmluZGluZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2NkKCd+JytwcmVmaXgrY2kuZ2V0VHlwZU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmtsYXNzKCkucmVmKGNpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoY2kuaXNFbGVtZW50KCkgJiYgY2kuZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHModG5zKSkgeworICAgICAgICAgICAgICAgICAgICBCaW5kaW5ncyBjaGlsZCA9IGdyb3VwLmJpbmRpbmdzKCk7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnNjZChwcmVmaXgrY2kuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmtsYXNzKCkucmVmKGNpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKEVudW1MZWFmSW5mbzxULEM+IGVuIDogZS5nZXRWYWx1ZSgpLmVudW1zKSB7CisgICAgICAgICAgICAgICAgaWYoZW4uZ2V0VHlwZU5hbWUoKT09bnVsbCkgIGNvbnRpbnVlOyAgIC8vIGxvY2FsIHR5cGUKKworICAgICAgICAgICAgICAgIEJpbmRpbmdzIGNoaWxkID0gZ3JvdXAuYmluZGluZ3MoKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5zY2QoJ34nK3ByZWZpeCtlbi5nZXRUeXBlTmFtZSgpLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5rbGFzcygpLnJlZihuYXZpZ2F0b3IuZ2V0Q2xhc3NOYW1lKGVuLmdldENsYXp6KCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3JvdXAuY29tbWl0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcm9vdC5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBXcml0ZSBvdXQgdGhlIHNjaGVtYSBkb2N1bWVudHMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoU2NoZW1hT3V0cHV0UmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgd3JpdGUoU2NoZW1hT3V0cHV0UmVzb2x2ZXIgcmVzb2x2ZXIsIEVycm9yTGlzdGVuZXIgZXJyb3JMaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYocmVzb2x2ZXI9PW51bGwpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAKICAgICAgICAgLy8gbWFrZSBpdCBmb29sLXByb29mCiAgICAgICAgIHJlc29sdmVyID0gbmV3IEZvb2xQcm9vZlJlc29sdmVyKHJlc29sdmVyKTsKKyAgICAgICAgdGhpcy5lcnJvckxpc3RlbmVyID0gZXJyb3JMaXN0ZW5lcjsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNjaGVtYUxvY2F0aW9ucyA9IHR5cGVzLmdldFNjaGVtYUxvY2F0aW9ucygpOwogCiAgICAgICAgIE1hcDxOYW1lc3BhY2UsUmVzdWx0PiBvdXQgPSBuZXcgSGFzaE1hcDxOYW1lc3BhY2UsUmVzdWx0PigpOworICAgICAgICBNYXA8TmFtZXNwYWNlLFN0cmluZz4gc3lzdGVtSWRzID0gbmV3IEhhc2hNYXA8TmFtZXNwYWNlLFN0cmluZz4oKTsKIAogICAgICAgICAvLyB3ZSBjcmVhdGUgYSBOYW1lc3BhY2Ugb2JqZWN0IGZvciB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UKICAgICAgICAgLy8gYXMgYSBzaWRlLWVmZmVjdCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gZ2VuZXJhdGUgaXQuCkBAIC0zMzQsMjUgKzQyMCwyOSBAQAogICAgICAgICAvLyBmaXJzdCBjcmVhdGUgdGhlIG91dHB1dHMgZm9yIGFsbCBzbyB0aGF0IHdlIGNhbiByZXNvbHZlIHJlZmVyZW5jZXMgYW1vbmcKICAgICAgICAgLy8gc2NoZW1hIGZpbGVzIHdoZW4gd2Ugd3JpdGUKICAgICAgICAgZm9yKCBOYW1lc3BhY2UgbiA6IG5hbWVzcGFjZXMudmFsdWVzKCkgKSB7Ci0gICAgICAgICAgICBmaW5hbCBSZXN1bHQgb3V0cHV0ID0gcmVzb2x2ZXIuY3JlYXRlT3V0cHV0KG4udXJpLCJzY2hlbWEiKyhvdXQuc2l6ZSgpKzEpKyIueHNkIik7Ci0gICAgICAgICAgICBpZihvdXRwdXQhPW51bGwpIHsgIC8vIG51bGwgcmVzdWx0IG1lYW5zIG5vIHNjaGVtYSBmb3IgdGhhdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICBvdXQucHV0KG4sb3V0cHV0KTsKKyAgICAgICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYUxvY2F0aW9ucy5nZXQobi51cmkpOworICAgICAgICAgICAgaWYoc2NoZW1hTG9jYXRpb24hPW51bGwpIHsKKyAgICAgICAgICAgICAgICBzeXN0ZW1JZHMucHV0KG4sc2NoZW1hTG9jYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBSZXN1bHQgb3V0cHV0ID0gcmVzb2x2ZXIuY3JlYXRlT3V0cHV0KG4udXJpLCJzY2hlbWEiKyhvdXQuc2l6ZSgpKzEpKyIueHNkIik7CisgICAgICAgICAgICAgICAgaWYob3V0cHV0IT1udWxsKSB7ICAvLyBudWxsIHJlc3VsdCBtZWFucyBubyBzY2hlbWEgZm9yIHRoYXQgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIG91dC5wdXQobixvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZHMucHV0KG4sb3V0cHV0LmdldFN5c3RlbUlkKCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIHRoZW4gd3JpdGUnZW0gYWxsCi0gICAgICAgIGZvciggTmFtZXNwYWNlIG4gOiBuYW1lc3BhY2VzLnZhbHVlcygpICkgewotICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG91dC5nZXQobik7Ci0gICAgICAgICAgICBpZihyZXN1bHQhPW51bGwpIHsKLSAgICAgICAgICAgICAgICBuLndyaXRlVG8oIHJlc3VsdCwgb3V0ICk7Ci0gICAgICAgICAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgU3RyZWFtUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSAoKFN0cmVhbVJlc3VsdClyZXN1bHQpLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBpZihvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7IC8vIGZpeCBmb3IgYnVnaWQ6IDYyOTEzMDEKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdyaXRlciB3cml0ZXIgPSAoKFN0cmVhbVJlc3VsdClyZXN1bHQpLmdldFdyaXRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYod3JpdGVyICE9IG51bGwpIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGZvciggTWFwLkVudHJ5PE5hbWVzcGFjZSxSZXN1bHQ+IGUgOiBvdXQuZW50cnlTZXQoKSApIHsKKyAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICBlLmdldEtleSgpLndyaXRlVG8oIHJlc3VsdCwgc3lzdGVtSWRzICk7CisgICAgICAgICAgICBpZihyZXN1bHQgaW5zdGFuY2VvZiBTdHJlYW1SZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gKChTdHJlYW1SZXN1bHQpcmVzdWx0KS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBpZihvdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsgLy8gZml4IGZvciBidWdpZDogNjI5MTMwMQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdyaXRlciB3cml0ZXIgPSAoKFN0cmVhbVJlc3VsdClyZXN1bHQpLmdldFdyaXRlcigpOworICAgICAgICAgICAgICAgICAgICBpZih3cml0ZXIgIT0gbnVsbCkgd3JpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNjQsNyArNDU0LDcgQEAKICAgICAgKiBTY2hlbWEgY29tcG9uZW50cyBhcmUgb3JnYW5pemVkIHBlciBuYW1lc3BhY2UuCiAgICAgICovCiAgICAgcHJpdmF0ZSBjbGFzcyBOYW1lc3BhY2UgewotICAgICAgICBmaW5hbCBTdHJpbmcgdXJpOworICAgICAgICBmaW5hbCBATm90TnVsbCBTdHJpbmcgdXJpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBPdGhlciB7QGxpbmsgTmFtZXNwYWNlfXMgdGhhdCB0aGlzIG5hbWVzcGFjZSBkZXBlbmRzIG9uLgpAQCAtMzk0LDcgKzQ4NCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHbG9iYWwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBrZXllZCBieSB0aGVpciBsb2NhbCBuYW1lcy4KICAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGlNYXA8U3RyaW5nLE5vbkVsZW1lbnQ8VCxDPj4gYXR0cmlidXRlRGVjbHMgPSBuZXcgTXVsdGlNYXA8U3RyaW5nLE5vbkVsZW1lbnQ8VCxDPj4oc3RyaW5nVHlwZSk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGlNYXA8U3RyaW5nLEF0dHJpYnV0ZVByb3BlcnR5SW5mbzxULEM+PiBhdHRyaWJ1dGVEZWNscyA9IG5ldyBNdWx0aU1hcDxTdHJpbmcsQXR0cmlidXRlUHJvcGVydHlJbmZvPFQsQz4+KG51bGwpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbnMgdG8gYmUgd3JpdHRlbiwga2V5ZWQgYnkgdGhlaXIgbG9jYWwgbmFtZXMuCkBAIC00MDUsNiArNDk1LDEyIEBACiAgICAgICAgIHByaXZhdGUgRm9ybSBhdHRyaWJ1dGVGb3JtRGVmYXVsdDsKICAgICAgICAgcHJpdmF0ZSBGb3JtIGVsZW1lbnRGb3JtRGVmYXVsdDsKIAorICAgICAgICAvKioKKyAgICAgICAgICogRG9lcyBzY2hlbWEgaW4gdGhpcyBuYW1lc3BhY2UgdXNlcyBzd2FSZWY/IElmIHNvLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGltcG9ydAorICAgICAgICAgKiBzdGF0ZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXNlU3dhUmVmOworCiAgICAgICAgIHB1YmxpYyBOYW1lc3BhY2UoU3RyaW5nIHVyaSkgewogICAgICAgICAgICAgdGhpcy51cmkgPSB1cmk7CiAgICAgICAgICAgICBhc3NlcnQgIVhtbFNjaGVtYUdlbmVyYXRvci50aGlzLm5hbWVzcGFjZXMuY29udGFpbnNLZXkodXJpKTsKQEAgLTQ1NSw4ICs1NTEsMTEgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogV3JpdGVzIHRoZSBzY2hlbWEgZG9jdW1lbnQgdG8gdGhlIHNwZWNpZmllZCByZXN1bHQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzeXN0ZW1JZHMKKyAgICAgICAgICogICAgICBTeXN0ZW0gSURzIG9mIHRoZSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAiIiBpbmRpY2F0ZXMgJ2ltcGxpZWQnLgogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVG8oUmVzdWx0IHJlc3VsdCwgTWFwPE5hbWVzcGFjZSxSZXN1bHQ+IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVG8oUmVzdWx0IHJlc3VsdCwgTWFwPE5hbWVzcGFjZSxTdHJpbmc+IHN5c3RlbUlkcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2NoZW1hIHNjaGVtYSA9IFRYVy5jcmVhdGUoU2NoZW1hLmNsYXNzLFJlc3VsdEZhY3RvcnkuY3JlYXRlU2VyaWFsaXplcihyZXN1bHQpKTsKIApAQCAtNDY3LDYgKzU2Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5fbmFtZXNwYWNlKGUuZ2V0VmFsdWUoKSxlLmdldEtleSgpKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZih1c2VTd2FSZWYpCisgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5fbmFtZXNwYWNlKFdlbGxLbm93bk5hbWVzcGFjZS5TV0FfVVJJLCJzd2FSZWYiKTsKKwogICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gRm9ybS5nZXQodHlwZXMuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQodXJpKSk7CiAgICAgICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQuZGVjbGFyZSgiYXR0cmlidXRlRm9ybURlZmF1bHQiLHNjaGVtYSk7CiAKQEAgLTUwNCw5ICs2MDYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgSW1wb3J0IGltcCA9IHNjaGVtYS5faW1wb3J0KCk7CiAgICAgICAgICAgICAgICAgICAgIGlmKG4udXJpLmxlbmd0aCgpIT0wKQogICAgICAgICAgICAgICAgICAgICAgICAgaW1wLm5hbWVzcGFjZShuLnVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIGltcC5zY2hlbWFMb2NhdGlvbihyZWxhdGl2aXplKG91dC5nZXQobikuZ2V0U3lzdGVtSWQoKSxyZXN1bHQuZ2V0U3lzdGVtSWQoKSkpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVmU3lzdGVtSWQgPSBzeXN0ZW1JZHMuZ2V0KG4pOworICAgICAgICAgICAgICAgICAgICBpZihyZWZTeXN0ZW1JZCE9bnVsbCAmJiAhcmVmU3lzdGVtSWQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gIiIgbWVhbnMgaW1wbGllZC4gbnVsbCBpZiB0aGUgU2NoZW1hT3V0cHV0UmVzb2x2ZXIgc2FpZCAiZG9uJ3QgZ2VuZXJhdGUhIgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wLnNjaGVtYUxvY2F0aW9uKHJlbGF0aXZpemUocmVmU3lzdGVtSWQscmVzdWx0LmdldFN5c3RlbUlkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzY2hlbWEuX3BjZGF0YShuZXdsaW5lKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYodXNlU3dhUmVmKSB7CisgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5faW1wb3J0KCkubmFtZXNwYWNlKFdlbGxLbm93bk5hbWVzcGFjZS5TV0FfVVJJKS5zY2hlbWFMb2NhdGlvbigiaHR0cDovL3dzLWkub3JnL3Byb2ZpbGVzL2Jhc2ljLzEuMS9zd2FyZWYueHNkIik7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gdGhlbiB3cml0ZSBlYWNoIGNvbXBvbmVudAogICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZyxFbGVtZW50RGVjbGFyYXRpb24+IGUgOiBlbGVtZW50RGVjbHMuZW50cnlTZXQoKSkgewpAQCAtNTM1LDEwICs2NDQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgd3JpdGVBcnJheShhLHNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5fcGNkYXRhKG5ld2xpbmUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsTm9uRWxlbWVudDxULEM+PiBlIDogYXR0cmlidXRlRGVjbHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZyxBdHRyaWJ1dGVQcm9wZXJ0eUluZm88VCxDPj4gZSA6IGF0dHJpYnV0ZURlY2xzLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgVG9wTGV2ZWxBdHRyaWJ1dGUgYSA9IHNjaGVtYS5hdHRyaWJ1dGUoKTsKICAgICAgICAgICAgICAgICAgICAgYS5uYW1lKGUuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGVSZWYoYSxlLmdldFZhbHVlKCksInR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZS5nZXRWYWx1ZSgpPT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlUmVmKGEsc3RyaW5nVHlwZSwidHlwZSIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZVR5cGVSZWYoZS5nZXRWYWx1ZSgpLGEpOwogICAgICAgICAgICAgICAgICAgICBzY2hlbWEuX3BjZGF0YShuZXdsaW5lKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTYwMSwxOCArNzEzLDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBFeGFtaW5lIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZWYgYW5kIGRldGVybWluZSBpZiBhIHN3YVJlZiBhdHRyaWJ1dGUgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkCi0gICAgICAgICAqIEBwYXJhbSB0eXBlUmVmCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTd2FSZWZBZGFwdGVyKE5vbkVsZW1lbnRSZWY8VCxDPiB0eXBlUmVmKSB7Ci0gICAgICAgICAgICBmaW5hbCBBZGFwdGVyPFQsQz4gYWRhcHRlciA9IHR5cGVSZWYuZ2V0U291cmNlKCkuZ2V0QWRhcHRlcigpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBuYXZpZ2F0b3IuYXNEZWNsKFN3YVJlZkFkYXB0ZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIChvLmVxdWFscyhhZGFwdGVyLmFkYXB0ZXJUeXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKICAgICAgICAgICogV3JpdGVzIGEgdHlwZSBhdHRyaWJ1dGUgKGlmIHRoZSByZWZlcmVuY2VkIHR5cGUgaXMgYSBnbG9iYWwgdHlwZSkKICAgICAgICAgICogb3Igd3JpdGVzIG91dCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYW5vbnltb3VzIHR5cGUgaW4gcGxhY2UgKGlmIHRoZSByZWZlcmVuY2VkCiAgICAgICAgICAqIHR5cGUgaXMgbm90IGEgZ2xvYmFsIHR5cGUuKQpAQCAtNjI2LDggKzcyNiwxOCBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVHlwZVJlZihUeXBlSG9zdCB0aCwgTm9uRWxlbWVudDxULEM+IHR5cGUsIFN0cmluZyByZWZBdHROYW1lKSB7CiAgICAgICAgICAgICBpZih0eXBlLmdldFR5cGVOYW1lKCk9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMKKyAgICAgICAgICAgICAgICB0aC5ibG9jaygpOyAvLyBzbyB0aGF0IHRoZSBjYWxsZXIgbWF5IHdyaXRlIG90aGVyIGF0dHJpYnVldHMKICAgICAgICAgICAgICAgICBpZih0eXBlIGluc3RhbmNlb2YgQ2xhc3NJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlQ2xhc3MoIChDbGFzc0luZm88VCxDPil0eXBlLCB0aCApOworICAgICAgICAgICAgICAgICAgICBpZihjb2xsaXNpb25DaGVja2VyLnB1c2goKENsYXNzSW5mbzxULEM+KXR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3RlbmVyLmVycm9yKG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5BTk9OWU1PVVNfVFlQRV9DWUNMRS5mb3JtYXQoY29sbGlzaW9uQ2hlY2tlci5nZXRDeWNsZVN0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQ2xhc3MoIChDbGFzc0luZm88VCxDPil0eXBlLCB0aCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkNoZWNrZXIucG9wKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVFbnVtKCAoRW51bUxlYWZJbmZvPFQsQz4pdHlwZSwgKFNpbXBsZVR5cGVIb3N0KXRoKTsKICAgICAgICAgICAgICAgICB9CkBAIC03NDYsNjQgKzg1Niw1NyBAQAogICAgICAgICAgICAgaWYoYy5pc0Fic3RyYWN0KCkpCiAgICAgICAgICAgICAgICAgY3QuX2Fic3RyYWN0KHRydWUpOwogCi0gICAgICAgICAgICAvLyBob2xkIHRoZSBjdCBvcGVuIGluIGNhc2Ugd2UgbmVlZCB0byBnZW5lcmF0ZSBAbWl4ZWQgYmVsb3cuLi4KLSAgICAgICAgICAgIGN0LmJsb2NrKCk7Ci0KLSAgICAgICAgICAgIC8vIGVpdGhlciA8c2VxdWVuY2U+IG9yIDxhbGw+Ci0gICAgICAgICAgICBFeHBsaWNpdEdyb3VwIGNvbXBvc2l0b3IgPSBudWxsOwotCi0gICAgICAgICAgICAvLyBvbmx5IG5lY2Vzc2FyeSBpZiB0aGlzIHR5cGUgaGFzIGEgYmFzZSBjbGFzcyB3ZSBuZWVkIHRvIGV4dGVuZCBmcm9tCisgICAgICAgICAgICAvLyB0aGVzZSBhcmUgd2hlcmUgd2Ugd3JpdGUgY29udGVudCBtb2RlbCBhbmQgYXR0cmlidXRlcwogICAgICAgICAgICAgQXR0ckRlY2xzIGNvbnRlbnRNb2RlbCA9IGN0OworICAgICAgICAgICAgVHlwZURlZlBhcnRpY2xlIGNvbnRlbnRNb2RlbE93bmVyID0gY3Q7CiAKICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgYmFzZSBjbGFzcywgd2UgbmVlZCB0byBnZW5lcmF0ZSBhbiBleHRlbnNpb24gaW4gdGhlIHNjaGVtYQogICAgICAgICAgICAgZmluYWwgQ2xhc3NJbmZvPFQsQz4gYmMgPSBjLmdldEJhc2VDbGFzcygpOwogICAgICAgICAgICAgaWYgKGJjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDb21wbGV4RXh0ZW5zaW9uIGNlID0gY3QuY29tcGxleENvbnRlbnQoKS5leHRlbnNpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZW50TW9kZWwgPSBjZTsKLQotICAgICAgICAgICAgICAgIGNlLmJhc2UoYmMuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCBpZiB0aGUgYmFzZSB0eXBlIGlzIGFub255bW91cz8KLSAgICAgICAgICAgICAgICAvLyBvcmRlcmVkIHByb3BzIGdvIGluIGEgc2VxdWVuY2UsIHVub3JkZXJlZCBnbyBpbiBhbiBhbGwKLSAgICAgICAgICAgICAgICBpZiggYy5pc09yZGVyZWQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRvciA9IGNlLnNlcXVlbmNlKCk7CisgICAgICAgICAgICAgICAgaWYoYmMuaGFzVmFsdWVQcm9wZXJ0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuZGluZyBjb21wbGV4IHR5cGUgd2l0aCBzaW1wbGUgY29udGVudAorICAgICAgICAgICAgICAgICAgICBTaW1wbGVFeHRlbnNpb24gc2UgPSBjdC5zaW1wbGVDb250ZW50KCkuZXh0ZW5zaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRNb2RlbCA9IHNlOworICAgICAgICAgICAgICAgICAgICBjb250ZW50TW9kZWxPd25lciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHNlLmJhc2UoYmMuZ2V0VHlwZU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRvciA9IGNlLmFsbCgpOworICAgICAgICAgICAgICAgICAgICBDb21wbGV4RXh0ZW5zaW9uIGNlID0gY3QuY29tcGxleENvbnRlbnQoKS5leHRlbnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudE1vZGVsID0gY2U7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRNb2RlbE93bmVyID0gY2U7CisKKyAgICAgICAgICAgICAgICAgICAgY2UuYmFzZShiYy5nZXRUeXBlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCBpZiB0aGUgYmFzZSB0eXBlIGlzIGFub255bW91cz8KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgcHJvcGVydGllcwotICAgICAgICAgICAgaWYgKGMuaGFzUHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYoIGNvbXBvc2l0b3IgPT0gbnVsbCApIHsgLy8gaWYgdGhlcmUgaXMgbm8gZXh0ZW5zaW9uIGJhc2UsIGNyZWF0ZSBhIHRvcCBsZXZlbCBzZXEKLSAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXJlZCBwcm9wcyBnbyBpbiBhIHNlcXVlbmNlLCB1bm9yZGVyZWQgZ28gaW4gYW4gYWxsCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjLmlzT3JkZXJlZCgpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRvciA9IGN0LnNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdG9yID0gY3QuYWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBibG9jayB3cml0aW5nIHRoZSBjb21wb3NpdG9yIGJlY2F1c2Ugd2UgbWlnaHQgbmVlZCB0bwotICAgICAgICAgICAgICAgIC8vIHdyaXRlIHNvbWUgb3V0IG9mIG9yZGVyIGF0dHJpYnV0ZXMgdG8gaGFuZGxlIG1pbi9tYXhPY2N1cnMKLSAgICAgICAgICAgICAgICBjb21wb3NpdG9yLmJsb2NrKCk7Ci0KKyAgICAgICAgICAgIGlmKGNvbnRlbnRNb2RlbE93bmVyIT1udWxsKSB7CisgICAgICAgICAgICAgICAgLy8gYnVpbGQgdGhlIHRyZWUgdGhhdCByZXByZXNlbnRzIHRoZSBleHBsaWNpdCBjb250ZW50IG1vZGVsIGZyb20gaXRlcmF0ZSBvdmVyIHRoZSBwcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFRyZWU+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlPigpOwogICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlJbmZvPFQsQz4gcCA6IGMuZ2V0UHJvcGVydGllcygpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsaW5nIGZvciA8Y29tcGxleFR5cGUgQG1peGVkPSd0cnVlJyAuLi4+CiAgICAgICAgICAgICAgICAgICAgIGlmKHAgaW5zdGFuY2VvZiBSZWZlcmVuY2VQcm9wZXJ0eUluZm8gJiYgKChSZWZlcmVuY2VQcm9wZXJ0eUluZm8pcCkuaXNNaXhlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdC5taXhlZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5KHAsIGNvbnRlbnRNb2RlbCwgY29tcG9zaXRvcik7CisgICAgICAgICAgICAgICAgICAgIFRyZWUgdCA9IGJ1aWxkUHJvcGVydHlDb250ZW50TW9kZWwocCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHQhPW51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQodCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY29tcG9zaXRvci5jb21taXQoKTsKKyAgICAgICAgICAgICAgICBUcmVlIHRvcCA9IFRyZWUubWFrZUdyb3VwKCBjLmlzT3JkZXJlZCgpID8gR3JvdXBLaW5kLlNFUVVFTkNFIDogR3JvdXBLaW5kLkFMTCwgY2hpbGRyZW4pOworCisgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGNvbnRlbnQgbW9kZWwKKyAgICAgICAgICAgICAgICB0b3Aud3JpdGUoY29udGVudE1vZGVsT3duZXIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBsb29rIGZvciB3aWxkY2FyZCBhdHRyaWJ1dGVzCisgICAgICAgICAgICAvLyB0aGVuIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIGZvciAoUHJvcGVydHlJbmZvPFQsQz4gcCA6IGMuZ2V0UHJvcGVydGllcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBBdHRyaWJ1dGVQcm9wZXJ0eUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQXR0cmlidXRlUHJvcCgoQXR0cmlidXRlUHJvcGVydHlJbmZvPFQsQz4pcCwgY29udGVudE1vZGVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiggYy5oYXNBdHRyaWJ1dGVXaWxkY2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogbm90IHR5cGUgc2FmZQogICAgICAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5hbnlBdHRyaWJ1dGUoKS5uYW1lc3BhY2UoIiMjb3RoZXIiKS5wcm9jZXNzQ29udGVudHMoInNraXAiKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmluYWxseSBjb21taXQgdGhlIGN0CiAgICAgICAgICAgICBjdC5jb21taXQoKTsKICAgICAgICAgfQogCkBAIC04MjQsMjcgKzkyNywyMyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIHdyaXRlIHRoZSBzY2hlbWEgZGVmaW5pdGlvbihzKSBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQorICAgICAgICAgKiBCdWlsZHMgY29udGVudCBtb2RlbCB3cml0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCiAgICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVQcm9wZXJ0eShQcm9wZXJ0eUluZm88VCxDPiBwLCBBdHRyRGVjbHMgYXR0ciwgRXhwbGljaXRHcm91cCBjb21wb3NpdG9yKSB7CisgICAgICAgIHByaXZhdGUgVHJlZSBidWlsZFByb3BlcnR5Q29udGVudE1vZGVsKFByb3BlcnR5SW5mbzxULEM+IHApIHsKICAgICAgICAgICAgIHN3aXRjaChwLmtpbmQoKSkgewogICAgICAgICAgICAgY2FzZSBFTEVNRU5UOgotICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRQcm9wKChFbGVtZW50UHJvcGVydHlJbmZvPFQsQz4pcCwgY29tcG9zaXRvcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVsZW1lbnRQcm9wKChFbGVtZW50UHJvcGVydHlJbmZvPFQsQz4pcCk7CiAgICAgICAgICAgICBjYXNlIEFUVFJJQlVURToKLSAgICAgICAgICAgICAgICBoYW5kbGVBdHRyaWJ1dGVQcm9wKChBdHRyaWJ1dGVQcm9wZXJ0eUluZm88VCxDPilwLCBhdHRyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1ZXRzIGFyZSBoYW5kbGVkIGxhdGVyCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICBjYXNlIFJFRkVSRU5DRToKLSAgICAgICAgICAgICAgICBoYW5kbGVSZWZlcmVuY2VQcm9wKChSZWZlcmVuY2VQcm9wZXJ0eUluZm88VCxDPilwLCBjb21wb3NpdG9yKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlUmVmZXJlbmNlUHJvcCgoUmVmZXJlbmNlUHJvcGVydHlJbmZvPFQsQz4pcCk7CiAgICAgICAgICAgICBjYXNlIE1BUDoKLSAgICAgICAgICAgICAgICBoYW5kbGVNYXBQcm9wKChNYXBQcm9wZXJ0eUluZm88VCxDPilwLCBjb21wb3NpdG9yKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlTWFwUHJvcCgoTWFwUHJvcGVydHlJbmZvPFQsQz4pcCk7CiAgICAgICAgICAgICBjYXNlIFZBTFVFOgogICAgICAgICAgICAgICAgIC8vIHZhbHVlIHByb3BzIGhhbmRsZWQgYWJvdmUgaW4gd3JpdGVDbGFzcygpCiAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBicmVhaygpOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpAQCAtODU5LDkxICs5NTgsODMgQEAKICAgICAgICAgICogbm90IGJlIHdyYXBwZWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBlcCB0aGUgZWxlbWVudCBwcm9wZXJ0eQotICAgICAgICAgKiBAcGFyYW0gY29tcG9zaXRvciB0aGUgc2NoZW1hIGNvbXBvc2l0b3IgKHNlcXVlbmNlIG9yIGFsbCkKICAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFbGVtZW50UHJvcChFbGVtZW50UHJvcGVydHlJbmZvPFQsQz4gZXAsIEV4cGxpY2l0R3JvdXAgY29tcG9zaXRvcikgewotICAgICAgICAgICAgUU5hbWUgZW5hbWUgPSBlcC5nZXRYbWxOYW1lKCk7Ci0gICAgICAgICAgICBPY2N1cnMgb2NjdXJzID0gbnVsbDsKLQorICAgICAgICBwcml2YXRlIFRyZWUgaGFuZGxlRWxlbWVudFByb3AoZmluYWwgRWxlbWVudFByb3BlcnR5SW5mbzxULEM+IGVwKSB7CiAgICAgICAgICAgICBpZiAoZXAuaXNWYWx1ZUxpc3QoKSkgewotICAgICAgICAgICAgICAgIFR5cGVSZWY8VCxDPiB0ID0gZXAuZ2V0VHlwZXMoKS5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgTG9jYWxFbGVtZW50IGUgPSBjb21wb3NpdG9yLmVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIFFOYW1lIHRuID0gdC5nZXRUYWdOYW1lKCk7Ci0gICAgICAgICAgICAgICAgZS5uYW1lKHRuLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICBMaXN0IGxzdCA9IGUuc2ltcGxlVHlwZSgpLmxpc3QoKTsKLSAgICAgICAgICAgICAgICB3cml0ZVR5cGVSZWYobHN0LHQsICJpdGVtVHlwZSIpOwotICAgICAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdC53cml0ZUZvcm0oZSx0bik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZS5UZXJtKCkgeworICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShDb250ZW50TW9kZWxDb250YWluZXIgcGFyZW50LCBib29sZWFuIGlzT3B0aW9uYWwsIGJvb2xlYW4gcmVwZWF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVSZWY8VCxDPiB0ID0gZXAuZ2V0VHlwZXMoKS5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVsZW1lbnQgZSA9IHBhcmVudC5lbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlLmJsb2NrKCk7IC8vIHdlIHdpbGwgd3JpdGUgb2NjdXJzIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSB0biA9IHQuZ2V0VGFnTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZS5uYW1lKHRuLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgbHN0ID0gZS5zaW1wbGVUeXBlKCkubGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlUmVmKGxzdCx0LCAiaXRlbVR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdC53cml0ZUZvcm0oZSx0bik7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU9jY3VycyhlLGlzT3B0aW9uYWx8fCFlcC5pc1JlcXVpcmVkKCkscmVwZWF0ZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVwLmlzQ29sbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVuYW1lICE9IG51bGwpIHsgLy8gd3JhcHBlZCBjb2xsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIExvY2FsRWxlbWVudCBlID0gY29tcG9zaXRvci5lbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpPjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHRoaXMudXJpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIDgtMjU6IFByb3BlcnR5L2ZpZWxkIGVsZW1lbnQgd3JhcHBlciB3aXRoIHJlZiBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlZihuZXcgUU5hbWUoZW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIGVuYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgQXJyYXlMaXN0PFRyZWU+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlPigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBUeXBlUmVmPFQsQz4gdCA6IGVwLmdldFR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQobmV3IFRyZWUuVGVybSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoQ29udGVudE1vZGVsQ29udGFpbmVyIHBhcmVudCwgYm9vbGVhbiBpc09wdGlvbmFsLCBib29sZWFuIHJlcGVhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVsZW1lbnQgZSA9IHBhcmVudC5lbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHRuID0gdC5nZXRUYWdOYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhbkJlRGlyZWN0RWxlbWVudFJlZih0LHRuKSB8fCAoIXRuLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh1cmkpICYmIHRuLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZWYodG4pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5hbWUodG4uZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZVJlZihlLHQsICJ0eXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0LndyaXRlRm9ybShlLHRuKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQud3JpdGVGb3JtKGUsZW5hbWUpOwogCi0gICAgICAgICAgICAgICAgICAgIENvbXBsZXhUeXBlIHAgPSBlLm5hbWUoZW5hbWUuZ2V0TG9jYWxQYXJ0KCkpLmNvbXBsZXhUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVwLmlzQ29sbGVjdGlvbk5pbGxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUubmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLm1pbk9jY3VycygwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmlzTmlsbGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmlsbGFibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZih0LmdldERlZmF1bHRWYWx1ZSgpIT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX2RlZmF1bHQodC5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU9jY3VycyhlLGlzT3B0aW9uYWwscmVwZWF0ZWQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcC5nZXRUeXBlcygpLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdG9yID0gcC5zZXF1ZW5jZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRvciA9IHAuY2hvaWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnMgPSBjb21wb3NpdG9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdW53cmFwcGVkIGNvbGxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVwLmdldFR5cGVzKCkuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRvciA9IGNvbXBvc2l0b3IuY2hvaWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnMgPSBjb21wb3NpdG9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZXAuZ2V0VHlwZXMoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0b3IgPSBjb21wb3NpdG9yLmNob2ljZSgpOwotICAgICAgICAgICAgICAgICAgICBvY2N1cnMgPSBjb21wb3NpdG9yOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgZmluYWwgVHJlZSBjaG9pY2UgPSBUcmVlLm1ha2VHcm91cChHcm91cEtpbmQuQ0hPSUNFLCBjaGlsZHJlbikKKyAgICAgICAgICAgICAgICAgICAgLm1ha2VPcHRpb25hbCghZXAuaXNSZXF1aXJlZCgpKQorICAgICAgICAgICAgICAgICAgICAubWFrZVJlcGVhdGVkKGVwLmlzQ29sbGVjdGlvbigpKTsgLy8gc2VlIFNwZWMgdGFibGUgOC0xMwogCi0gICAgICAgICAgICAvLyBmaWxsIGluIHRoZSBjb250ZW50IG1vZGVsCi0gICAgICAgICAgICBmb3IgKFR5cGVSZWY8VCxDPiB0IDogZXAuZ2V0VHlwZXMoKSkgewotICAgICAgICAgICAgICAgIExvY2FsRWxlbWVudCBlID0gY29tcG9zaXRvci5lbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9jY3VycyA9PSBudWxsKSBvY2N1cnMgPSBlOwotICAgICAgICAgICAgICAgIFFOYW1lIHRuID0gdC5nZXRUYWdOYW1lKCk7CiAKLSAgICAgICAgICAgICAgICBpZihjYW5CZURpcmVjdEVsZW1lbnRSZWYodCx0bikgfHwgKCF0bi5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHModXJpKSAmJiB0bi5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKT4wKSkgewotICAgICAgICAgICAgICAgICAgICBlLnJlZih0bik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZS5uYW1lKHRuLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlUmVmKGUsdCwgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0LndyaXRlRm9ybShlLHRuKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBRTmFtZSBlbmFtZSA9IGVwLmdldFhtbE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChlbmFtZSAhPSBudWxsKSB7IC8vIHdyYXBwZWQgY29sbGVjdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZS5UZXJtKCkgeworICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShDb250ZW50TW9kZWxDb250YWluZXIgcGFyZW50LCBib29sZWFuIGlzT3B0aW9uYWwsIGJvb2xlYW4gcmVwZWF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRWxlbWVudCBlID0gcGFyZW50LmVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpPjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh1cmkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSA4LTI1OiBQcm9wZXJ0eS9maWVsZCBlbGVtZW50IHdyYXBwZXIgd2l0aCByZWYgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVmKG5ldyBRTmFtZShlbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgZW5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGUubmFtZShlbmFtZS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQud3JpdGVGb3JtKGUsZW5hbWUpOwogCi0gICAgICAgICAgICAgICAgaWYgKHQuaXNOaWxsYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUubmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHQuZ2V0RGVmYXVsdFZhbHVlKCkhPW51bGwpCi0gICAgICAgICAgICAgICAgICAgIGUuX2RlZmF1bHQodC5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihlcC5pc0NvbGxlY3Rpb25OaWxsYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uaWxsYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlT2NjdXJzKGUsdHJ1ZSxyZXBlYXRlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhUeXBlIHAgPSBlLmNvbXBsZXhUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2Uud3JpdGUocCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfSBlbHNlIHsvLyBub24td3JhcHBlZAorICAgICAgICAgICAgICAgIHJldHVybiBjaG9pY2U7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcC5pc0NvbGxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICBvY2N1cnMubWF4T2NjdXJzKCJ1bmJvdW5kZWQiKTsKLQotICAgICAgICAgICAgaWYgKCFlcC5pc1JlcXVpcmVkKCkpCi0gICAgICAgICAgICAgICAgLy8gc2VlIFNwZWMgdGFibGUgOC0xMwotICAgICAgICAgICAgICAgIG9jY3Vycy5taW5PY2N1cnMoMCk7Ci0gICAgICAgICAgICAvLyBlbHNlIG1pbk9jY3VycyBkZWZhdWx0cyB0byAxCiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTk5OSwxOCArMTA5MCwxMCBAQAogICAgICAgICAgICAgTG9jYWxBdHRyaWJ1dGUgbG9jYWxBdHRyaWJ1dGUgPSBhdHRyLmF0dHJpYnV0ZSgpOwogCiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0clVSSSA9IGFwLmdldFhtbE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChhdHRyVVJJLmVxdWFscygiIikgfHwgYXR0clVSSS5lcXVhbHModXJpKSkgeworICAgICAgICAgICAgaWYgKGF0dHJVUkkuZXF1YWxzKCIiKSAvKnx8IGF0dHJVUkkuZXF1YWxzKHVyaSkgLS0tIHRob3NlIGFyZSBnZW5lcmF0ZWQgYXMgZ2xvYmFsIGF0dHJpYnV0ZXMgYW55d2F5LCBzbyB1c2UgdGhlbS4qLykgewogICAgICAgICAgICAgICAgIGxvY2FsQXR0cmlidXRlLm5hbWUoYXAuZ2V0WG1sTmFtZSgpLmdldExvY2FsUGFydCgpKTsKIAotICAgICAgICAgICAgICAgIFR5cGVIb3N0IHRoOyBTdHJpbmcgcmVmQXR0OwotICAgICAgICAgICAgICAgIGlmKCBhcC5pc0NvbGxlY3Rpb24oKSApIHsKLSAgICAgICAgICAgICAgICAgICAgdGggPSBsb2NhbEF0dHJpYnV0ZS5zaW1wbGVUeXBlKCkubGlzdCgpOwotICAgICAgICAgICAgICAgICAgICByZWZBdHQgPSAiaXRlbVR5cGUiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoID0gbG9jYWxBdHRyaWJ1dGU7Ci0gICAgICAgICAgICAgICAgICAgIHJlZkF0dCA9ICJ0eXBlIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd3JpdGVUeXBlUmVmKHRoLCBhcCwgcmVmQXR0KTsKKyAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZVR5cGVSZWYoYXAsIGxvY2FsQXR0cmlidXRlKTsKIAogICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0LndyaXRlRm9ybShsb2NhbEF0dHJpYnV0ZSxhcC5nZXRYbWxOYW1lKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gZ2VuZXJhdGUgYW4gYXR0ciByZWYKQEAgLTEwMjMsOTAgKzExMDYsMTAzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGVUeXBlUmVmKEF0dHJpYnV0ZVByb3BlcnR5SW5mbzxULEM+IGFwLCBBdHRyaWJ1dGVUeXBlIGEpIHsKKyAgICAgICAgICAgIGlmKCBhcC5pc0NvbGxlY3Rpb24oKSApCisgICAgICAgICAgICAgICAgd3JpdGVUeXBlUmVmKGEuc2ltcGxlVHlwZSgpLmxpc3QoKSwgYXAsICJpdGVtVHlwZSIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdyaXRlVHlwZVJlZihhLCBhcCwgInR5cGUiKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZW5lcmF0ZSB0aGUgcHJvcGVyIHNjaGVtYSBmcmFnbWVudCBmb3IgdGhlIGdpdmVuIHJlZmVyZW5jZSBwcm9wZXJ0eSBpbnRvIHRoZQogICAgICAgICAgKiBzcGVjaWZpZWQgc2NoZW1hIGNvbXBvc2l0b3IuCiAgICAgICAgICAqCiAgICAgICAgICAqIFRoZSByZWZlcmVuY2UgcHJvcGVydHkgbWF5IG9yIG1heSBub3QgcmVmZXIgdG8gYSBjb2xsZWN0aW9uIGFuZCBpdCBtYXkgb3IgbWF5CiAgICAgICAgICAqIG5vdCBiZSB3cmFwcGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcnAKLSAgICAgICAgICogQHBhcmFtIGNvbXBvc2l0b3IKICAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZWZlcmVuY2VQcm9wKFJlZmVyZW5jZVByb3BlcnR5SW5mbzxULEM+IHJwLCBFeHBsaWNpdEdyb3VwIGNvbXBvc2l0b3IpIHsKLSAgICAgICAgICAgIFFOYW1lIGVuYW1lID0gcnAuZ2V0WG1sTmFtZSgpOwotICAgICAgICAgICAgT2NjdXJzIG9jY3VycyA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChycC5pc0NvbGxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgIGlmIChlbmFtZSAhPSBudWxsKSB7IC8vIHdyYXBwZWQgY29sbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBMb2NhbEVsZW1lbnQgZSA9IGNvbXBvc2l0b3IuZWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBDb21wbGV4VHlwZSBwID0gZS5uYW1lKGVuYW1lLmdldExvY2FsUGFydCgpKS5jb21wbGV4VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQud3JpdGVGb3JtKGUsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZihycC5pc0NvbGxlY3Rpb25OaWxsYWJsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgZS5uaWxsYWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJwLmdldEVsZW1lbnRzKCkuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0b3IgPSBwLnNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdG9yID0gcC5jaG9pY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycyA9IGNvbXBvc2l0b3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB1bndyYXBwZWQgY29sbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBpZiAocnAuZ2V0RWxlbWVudHMoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdG9yID0gY29tcG9zaXRvci5jaG9pY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycyA9IGNvbXBvc2l0b3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgcHJpdmF0ZSBUcmVlIGhhbmRsZVJlZmVyZW5jZVByb3AoZmluYWwgUmVmZXJlbmNlUHJvcGVydHlJbmZvPFQsIEM+IHJwKSB7CiAgICAgICAgICAgICAvLyBmaWxsIGluIGNvbnRlbnQgbW9kZWwKLSAgICAgICAgICAgIFRPRE8uY2hlY2tTcGVjKCJzaG91bGQgd2UgbG9vcCBpbiB0aGUgY2FzZSBvZiBhIG5vbi1jb2xsZWN0aW9uIGVwPyIpOwotICAgICAgICAgICAgZm9yIChFbGVtZW50PFQsQz4gZSA6IHJwLmdldEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBMb2NhbEVsZW1lbnQgZXJlZiA9IGNvbXBvc2l0b3IuZWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChvY2N1cnMgPT0gbnVsbCkgb2NjdXJzID0gZXJlZjsKKyAgICAgICAgICAgIEFycmF5TGlzdDxUcmVlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VHJlZT4oKTsKIAotICAgICAgICAgICAgICAgIFFOYW1lIGVuID0gZS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmKGUuZ2V0U2NvcGUoKSE9bnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzY29wZWQuIG5lZWRzIHRvIGJlIGlubGluZWQKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWFsaWZpZWQgPSBlbi5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHModXJpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bnF1YWxpZmllZCA9IGVuLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygiIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHF1YWxpZmllZCB8fCB1bnF1YWxpZmllZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGJlIGlubGluZWQgaW5kZWVkCisgICAgICAgICAgICBmb3IgKGZpbmFsIEVsZW1lbnQ8VCxDPiBlIDogcnAuZ2V0RWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgVHJlZS5UZXJtKCkgeworICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShDb250ZW50TW9kZWxDb250YWluZXIgcGFyZW50LCBib29sZWFuIGlzT3B0aW9uYWwsIGJvb2xlYW4gcmVwZWF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRWxlbWVudCBlcmVmID0gcGFyZW50LmVsZW1lbnQoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgZm9ybT0iLi4uIiBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVucXVhbGlmaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudEZvcm1EZWZhdWx0LmlzRWZmZWN0aXZlbHlRdWFsaWZpZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyZWYuZm9ybSgidW5xdWFsaWZpZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVsZW1lbnRGb3JtRGVmYXVsdC5pc0VmZmVjdGl2ZWx5UXVhbGlmaWVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmVmLmZvcm0oInF1YWxpZmllZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsb2NhbD1mYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgZW4gPSBlLmdldEVsZW1lbnROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihlLmdldFNjb3BlKCkhPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZWQuIG5lZWRzIHRvIGJlIGlubGluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHF1YWxpZmllZCA9IGVuLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5xdWFsaWZpZWQgPSBlbi5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHF1YWxpZmllZCB8fCB1bnF1YWxpZmllZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYmUgaW5saW5lZCBpbmRlZWQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBmb3JtPSIuLi4iIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1bnF1YWxpZmllZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudEZvcm1EZWZhdWx0LmlzRWZmZWN0aXZlbHlRdWFsaWZpZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJlZi5mb3JtKCJ1bnF1YWxpZmllZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVsZW1lbnRGb3JtRGVmYXVsdC5pc0VmZmVjdGl2ZWx5UXVhbGlmaWVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyZWYuZm9ybSgicXVhbGlmaWVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyZWYubmFtZShlbi5nZXRMb2NhbFBhcnQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgb3V0IHR5cGUgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUgaW5zdGFuY2VvZiBDbGFzc0luZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZVJlZihlcmVmLChDbGFzc0luZm88VCxDPillLCJ0eXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGVSZWYoZXJlZiwoKEVsZW1lbnRJbmZvPFQsQz4pZSkuZ2V0Q29udGVudFR5cGUoKSwidHlwZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcmVmLm5hbWUoZW4uZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBvdXQgdHlwZSByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUgaW5zdGFuY2VvZiBDbGFzc0luZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGVSZWYoZXJlZiwoQ2xhc3NJbmZvPFQsQz4pZSwidHlwZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGVSZWYoZXJlZiwoKEVsZW1lbnRJbmZvPFQsQz4pZSkuZ2V0Q29udGVudFR5cGUoKSwidHlwZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighbG9jYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJlZi5yZWYoZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVPY2N1cnMoZXJlZixpc09wdGlvbmFsLHJlcGVhdGVkKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcmVmLnJlZihlbik7CisgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFdpbGRjYXJkTW9kZSB3YyA9IHJwLmdldFdpbGRjYXJkKCk7CisgICAgICAgICAgICBmaW5hbCBXaWxkY2FyZE1vZGUgd2MgPSBycC5nZXRXaWxkY2FyZCgpOwogICAgICAgICAgICAgaWYoIHdjICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgQW55IGFueSA9IGNvbXBvc2l0b3IuYW55KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBjbW9kZSA9IGdldFByb2Nlc3NDb250ZW50c01vZGVOYW1lKHdjKTsKLSAgICAgICAgICAgICAgICBpZiggcGNtb2RlICE9IG51bGwgKSBhbnkucHJvY2Vzc0NvbnRlbnRzKHBjbW9kZSk7Ci0gICAgICAgICAgICAgICAgVE9ETy5zY2hlbWFHZW5lcmF0b3IoImdlbmVyYXRlIEBuYW1lc3BhY2UgPz8/Iik7Ci0gICAgICAgICAgICAgICAgaWYoIG9jY3VycyA9PSBudWxsICkgb2NjdXJzID0gYW55OworICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgVHJlZS5UZXJtKCkgeworICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShDb250ZW50TW9kZWxDb250YWluZXIgcGFyZW50LCBib29sZWFuIGlzT3B0aW9uYWwsIGJvb2xlYW4gcmVwZWF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFueSBhbnkgPSBwYXJlbnQuYW55KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGNtb2RlID0gZ2V0UHJvY2Vzc0NvbnRlbnRzTW9kZU5hbWUod2MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBjbW9kZSAhPSBudWxsICkgYW55LnByb2Nlc3NDb250ZW50cyhwY21vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYW55Lm5hbWVzcGFjZSgiIyNvdGhlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVPY2N1cnMoYW55LGlzT3B0aW9uYWwscmVwZWF0ZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKHJwLmlzQ29sbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIG9jY3Vycy5tYXhPY2N1cnMoInVuYm91bmRlZCIpOwogCisgICAgICAgICAgICBmaW5hbCBUcmVlIGNob2ljZSA9IFRyZWUubWFrZUdyb3VwKEdyb3VwS2luZC5DSE9JQ0UsIGNoaWxkcmVuKS5tYWtlUmVwZWF0ZWQocnAuaXNDb2xsZWN0aW9uKCkpLm1ha2VPcHRpb25hbChycC5pc0NvbGxlY3Rpb24oKSk7CisgICAgICAgICAgICAvLyBpdCdzIGEgY3VyaW91cyBvbWlzc2lvbiB0aGF0IFhtbEVsZW1lbnRSZWYgZG9lc24ndCBoYXZlIHJlcXVpcmVkKCkuCisgICAgICAgICAgICAvLyBpbnN0ZWFkIHJpZ2h0IG5vdyBhIGNvbGxlY3Rpb24gd2lsbCBtYWtlIGl0IFswLHVuYm91bmRlZF0KKworCisgICAgICAgICAgICBmaW5hbCBRTmFtZSBlbmFtZSA9IHJwLmdldFhtbE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKGVuYW1lICE9IG51bGwpIHsgLy8gd3JhcHBlZAorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZS5UZXJtKCkgeworICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShDb250ZW50TW9kZWxDb250YWluZXIgcGFyZW50LCBib29sZWFuIGlzT3B0aW9uYWwsIGJvb2xlYW4gcmVwZWF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRWxlbWVudCBlID0gcGFyZW50LmVsZW1lbnQoKS5uYW1lKGVuYW1lLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdC53cml0ZUZvcm0oZSxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihycC5pc0NvbGxlY3Rpb25OaWxsYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmlsbGFibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU9jY3VycyhlLHRydWUscmVwZWF0ZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV4VHlwZSBwID0gZS5jb21wbGV4VHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlLndyaXRlKHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHVud3JhcHBlZAorICAgICAgICAgICAgICAgIHJldHVybiBjaG9pY2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTExMTQsMjUgKzEyMTAsMzEgQEAKICAgICAgICAgICogc3BlY2lmaWVkIHNjaGVtYSBjb21wb3NpdG9yLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gbXAgdGhlIG1hcCBwcm9wZXJ0eQotICAgICAgICAgKiBAcGFyYW0gY29tcG9zaXRvciB0aGUgc2NoZW1hIGNvbXBvc2l0b3IgKHNlcXVlbmNlIG9yIGFsbCkKICAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNYXBQcm9wKE1hcFByb3BlcnR5SW5mbzxULEM+IG1wLCBFeHBsaWNpdEdyb3VwIGNvbXBvc2l0b3IpIHsKLSAgICAgICAgICAgIFFOYW1lIGVuYW1lID0gbXAuZ2V0WG1sTmFtZSgpOworICAgICAgICBwcml2YXRlIFRyZWUgaGFuZGxlTWFwUHJvcChmaW5hbCBNYXBQcm9wZXJ0eUluZm88VCxDPiBtcCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlLlRlcm0oKSB7CisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoQ29udGVudE1vZGVsQ29udGFpbmVyIHBhcmVudCwgYm9vbGVhbiBpc09wdGlvbmFsLCBib29sZWFuIHJlcGVhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFFOYW1lIGVuYW1lID0gbXAuZ2V0WG1sTmFtZSgpOwogCi0gICAgICAgICAgICBMb2NhbEVsZW1lbnQgZSA9IGNvbXBvc2l0b3IuZWxlbWVudCgpOwotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0LndyaXRlRm9ybShlLGVuYW1lKTsKLSAgICAgICAgICAgIGlmKG1wLmlzQ29sbGVjdGlvbk5pbGxhYmxlKCkpCi0gICAgICAgICAgICAgICAgZS5uaWxsYWJsZSh0cnVlKTsKLSAgICAgICAgICAgIENvbXBsZXhUeXBlIHAgPSBlLm5hbWUoZW5hbWUuZ2V0TG9jYWxQYXJ0KCkpLmNvbXBsZXhUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIExvY2FsRWxlbWVudCBlID0gcGFyZW50LmVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0LndyaXRlRm9ybShlLGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobXAuaXNDb2xsZWN0aW9uTmlsbGFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGUubmlsbGFibGUodHJ1ZSk7CiAKLSAgICAgICAgICAgIC8vIFRPRE86IGVudHJ5LCBrZXksIGFuZCB2YWx1ZSBhcmUgYWx3YXlzIHVucXVhbGlmaWVkLiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLCB0b28uCi0gICAgICAgICAgICAvLyBUT0RPOiB3ZSBuZWVkIHRvIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24sIGlmIHRoZXkgYXJlIHF1YWxpZmllZAotICAgICAgICAgICAgZSA9IHAuc2VxdWVuY2UoKS5lbGVtZW50KCk7Ci0gICAgICAgICAgICBlLm5hbWUoImVudHJ5IikubWluT2NjdXJzKDApLm1heE9jY3VycygidW5ib3VuZGVkIik7CisgICAgICAgICAgICAgICAgICAgIGUgPSBlLm5hbWUoZW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZU9jY3VycyhlLGlzT3B0aW9uYWwscmVwZWF0ZWQpOworICAgICAgICAgICAgICAgICAgICBDb21wbGV4VHlwZSBwID0gZS5jb21wbGV4VHlwZSgpOwogCi0gICAgICAgICAgICBFeHBsaWNpdEdyb3VwIHNlcSA9IGUuY29tcGxleFR5cGUoKS5zZXF1ZW5jZSgpOwotICAgICAgICAgICAgd3JpdGVLZXlPclZhbHVlKHNlcSwgImtleSIsIG1wLmdldEtleVR5cGUoKSk7Ci0gICAgICAgICAgICB3cml0ZUtleU9yVmFsdWUoc2VxLCAidmFsdWUiLCBtcC5nZXRWYWx1ZVR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVudHJ5LCBrZXksIGFuZCB2YWx1ZSBhcmUgYWx3YXlzIHVucXVhbGlmaWVkLiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLCB0b28uCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbiwgaWYgdGhleSBhcmUgcXVhbGlmaWVkCisgICAgICAgICAgICAgICAgICAgIGUgPSBwLnNlcXVlbmNlKCkuZWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBlLm5hbWUoImVudHJ5IikubWluT2NjdXJzKDApLm1heE9jY3VycygidW5ib3VuZGVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgRXhwbGljaXRHcm91cCBzZXEgPSBlLmNvbXBsZXhUeXBlKCkuc2VxdWVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVLZXlPclZhbHVlKHNlcSwgImtleSIsIG1wLmdldEtleVR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlS2V5T3JWYWx1ZShzZXEsICJ2YWx1ZSIsIG1wLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlS2V5T3JWYWx1ZShFeHBsaWNpdEdyb3VwIHNlcSwgU3RyaW5nIHRhZ05hbWUsIE5vbkVsZW1lbnQ8VCwgQz4gdHlwZVJlZikgewpAQCAtMTE0Miw3ICsxMjQ0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEdsb2JhbEF0dHJpYnV0ZShBdHRyaWJ1dGVQcm9wZXJ0eUluZm88VCxDPiBhcCkgewotICAgICAgICAgICAgYXR0cmlidXRlRGVjbHMucHV0KCBhcC5nZXRYbWxOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIGFwLmdldFRhcmdldCgpICk7CisgICAgICAgICAgICBhdHRyaWJ1dGVEZWNscy5wdXQoIGFwLmdldFhtbE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgYXAgKTsKICAgICAgICAgICAgIGFkZERlcGVuZGVuY3lUbyhhcC5nZXRUYXJnZXQoKS5nZXRUeXBlTmFtZSgpKTsKICAgICAgICAgfQogCkBAIC0xMjE3LDYgKzEzMTksMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEV4YW1pbmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlZiBhbmQgZGV0ZXJtaW5lIGlmIGEgc3dhUmVmIGF0dHJpYnV0ZSBuZWVkcyB0byBiZSBnZW5lcmF0ZWQKKyAgICAgKiBAcGFyYW0gdHlwZVJlZgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVN3YVJlZkFkYXB0ZXIoTm9uRWxlbWVudFJlZjxULEM+IHR5cGVSZWYpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlU3dhUmVmQWRhcHRlcih0eXBlUmVmLmdldFNvdXJjZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGFtaW5lIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZWYgYW5kIGRldGVybWluZSBpZiBhIHN3YVJlZiBhdHRyaWJ1dGUgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlU3dhUmVmQWRhcHRlcihQcm9wZXJ0eUluZm88VCxDPiBwcm9wKSB7CisgICAgICAgIGZpbmFsIEFkYXB0ZXI8VCxDPiBhZGFwdGVyID0gcHJvcC5nZXRBZGFwdGVyKCk7CisgICAgICAgIGlmIChhZGFwdGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBuYXZpZ2F0b3IuYXNEZWNsKFN3YVJlZkFkYXB0ZXIuY2xhc3MpOworICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiAoby5lcXVhbHMoYWRhcHRlci5hZGFwdGVyVHlwZSkpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9jZXNzQ29udGVudHMgbW9kZSBvZiB0aGUKQEAgLTEyODEsNyArMTQwMSw3IEBACiAgICAgICAgICAgICBpZiggdXJpUGF0aC5lcXVhbHMoYmFzZVBhdGgpKQogICAgICAgICAgICAgICAgIHJldHVybiAiLiI7CiAKLSAgICAgICAgICAgIFN0cmluZyByZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHVyaVBhdGgsIGJhc2VQYXRoKTsKKyAgICAgICAgICAgIFN0cmluZyByZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHVyaVBhdGgsIGJhc2VQYXRoLCBmaXhOdWxsKHRoZVVyaS5nZXRTY2hlbWUoKSkuZXF1YWxzKCJmaWxlIikpOwogCiAgICAgICAgICAgICBpZiAocmVsUGF0aCA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJldHVybiB1cmk7IC8vIHJlY3Vyc2lvbiBmb3VuZCBubyBjb21tb25hbGl0eSBpbiB0aGUgdHdvIHVyaXMgYXQgYWxsCkBAIC0xMjk4LDE3ICsxNDE4LDMwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlUmVsYXRpdmVQYXRoKFN0cmluZyB1cmksIFN0cmluZyBiYXNlKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYocz09bnVsbCkgICAgIHJldHVybiAiIjsKKyAgICAgICAgZWxzZSAgICAgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2UsIGJvb2xlYW4gZmlsZVVybCkgeworICAgICAgICAvLyBpZiB0aGlzIGlzIGEgZmlsZSBVUkwgKHZlcnkgbGlrZWx5KSwgYW5kIGlmIHRoaXMgaXMgb24gYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtLAorICAgICAgICAvLyB0aGVuIHRyZWF0IGl0IGFjY29yZGluZ2x5LgorICAgICAgICBib29sZWFuIG9uV2luZG93cyA9IEZpbGUucGF0aFNlcGFyYXRvckNoYXI9PSc7JzsKKwogICAgICAgICBpZiAoYmFzZSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoYmFzZSkpIHsKKyAgICAgICAgaWYgKChmaWxlVXJsICYmIG9uV2luZG93cyAmJiBzdGFydHNXaXRoSWdub3JlQ2FzZSh1cmksYmFzZSkpIHx8IHVyaS5zdGFydHNXaXRoKGJhc2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gdXJpLnN1YnN0cmluZyhiYXNlLmxlbmd0aCgpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiLi4vIiArIGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh1cmksIGdldFBhcmVudFVyaVBhdGgoYmFzZSkpOworICAgICAgICAgICAgcmV0dXJuICIuLi8iICsgY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHVyaSwgZ2V0UGFyZW50VXJpUGF0aChiYXNlKSwgZmlsZVVybCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGhJZ25vcmVDYXNlKFN0cmluZyBzLCBTdHJpbmcgdCkgeworICAgICAgICByZXR1cm4gcy50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgodC50b1VwcGVyQ2FzZSgpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBKQVgtUlBDIHdhbnRzIHRoZSBuYW1lc3BhY2VzIHRvIGJlIHNvcnRlZCBpbiB0aGUgcmV2ZXJzZSBvcmRlcgogICAgICAqIHNvIHRoYXQgdGhlIGVtcHR5IG5hbWVzcGFjZSAiIiBjb21lcyB0byB0aGUgdmVyeSBlbmQuIERvbid0IGFzayBtZSB3aHkuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9lcGlzb2RlL0JpbmRpbmdzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9lcGlzb2RlL0JpbmRpbmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4MzM5MQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL2VwaXNvZGUvQmluZGluZ3MuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLmVwaXNvZGU7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CisKKy8qKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitAWG1sRWxlbWVudCgiYmluZGluZ3MiKQorcHVibGljIGludGVyZmFjZSBCaW5kaW5ncyBleHRlbmRzIFR5cGVkWG1sV3JpdGVyIHsKKyAgICAvKioKKyAgICAgKiBOZXN0ZWQgYmluZGluZ3MuCisgICAgICovCisgICAgQFhtbEVsZW1lbnQKKyAgICBCaW5kaW5ncyBiaW5kaW5ncygpOworCisgICAgLyoqCisgICAgICogTmVzdGVkIGNsYXNzIGN1c3RvbWl6YXRpb24uCisgICAgICovCisgICAgQFhtbEVsZW1lbnQoImNsYXNzIikKKyAgICBLbGFzcyBrbGFzcygpOworCisgICAgQFhtbEVsZW1lbnQKKyAgICBTY2hlbWFCaW5kaW5ncyBzY2hlbWFCaW5kaW5ncygpOworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHZvaWQgc2NkKFN0cmluZyBzY2QpOworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHZvaWQgdmVyc2lvbihTdHJpbmcgdik7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9lcGlzb2RlL0tsYXNzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9lcGlzb2RlL0tsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkZjJmOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL2VwaXNvZGUvS2xhc3MuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLmVwaXNvZGU7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CisKKy8qKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgaW50ZXJmYWNlIEtsYXNzIGV4dGVuZHMgVHlwZWRYbWxXcml0ZXIgeworICAgIC8qKgorICAgICAqIEZRQ04uCisgICAgICovCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHZvaWQgcmVmKFN0cmluZyBjbGFzc05hbWUpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vZXBpc29kZS9TY2hlbWFCaW5kaW5ncy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vZXBpc29kZS9TY2hlbWFCaW5kaW5ncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNGZmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9lcGlzb2RlL1NjaGVtYUJpbmRpbmdzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi5lcGlzb2RlOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworCisvKioKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBTY2hlbWFCaW5kaW5ncyBleHRlbmRzIFR5cGVkWG1sV3JpdGVyIHsKKyAgICBAWG1sQXR0cmlidXRlCisgICAgdm9pZCBtYXAoYm9vbGVhbiB2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9lcGlzb2RlL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vZXBpc29kZS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYyMGNkCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4vZXBpc29kZS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisvKioKKyAqIFRYVyBpbnRlcmZhY2VzIGZvciB3cml0aW5nIGVwaXNvZGUgZmlsZSwgd2hpY2ggaXMgd2hhdCBYSkMgbmVlZHMgdG8KKyAqIGhhbmRsZSBzZXBhcmF0ZSBjb21waWxhdGlvbi4KKyAqLworQFhtbE5hbWVzcGFjZShXZWxsS25vd25OYW1lc3BhY2UuSkFYQikKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4uZXBpc29kZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxOYW1lc3BhY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5XZWxsS25vd25OYW1lc3BhY2U7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3BhY2thZ2UtaW5mby5qYXZhCmluZGV4IGZkMWVmODAuLjMzNjgwMmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyoqCiAgKiBTY2hlbWEgZ2VuZXJhdG9yLgogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Bbm5vdGF0ZWQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Bbm5vdGF0ZWQuamF2YQppbmRleCA1MzFmZDg5Li4zNmNlNjUyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQW5ub3RhdGVkLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0Fubm90YXRlZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQW5ub3RhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0Fubm90YXRpb24uamF2YQppbmRleCA4YTI1MTM0Li4zNDFmMmFkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Bbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9BbnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9BbnkuamF2YQppbmRleCBkYzdlNGEwLi43YmRkZDk3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQW55LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0FueS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQXBwaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0FwcGluZm8uamF2YQppbmRleCBmMjI1NjQ5Li4xOTkxMmYxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQXBwaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9BcHBpbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9BdHRyRGVjbHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9BdHRyRGVjbHMuamF2YQppbmRleCA1NTVlMGUxLi4yOGJmMjU2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQXR0ckRlY2xzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0F0dHJEZWNscy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQXR0cmlidXRlVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0F0dHJpYnV0ZVR5cGUuamF2YQppbmRleCAzYzBmM2JmLi5hYzRiYjY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQXR0cmlidXRlVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9BdHRyaWJ1dGVUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4Q29udGVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhDb250ZW50LmphdmEKaW5kZXggYTZhMWYyYy4uZmZiZDJmMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhDb250ZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhDb250ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4RXh0ZW5zaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQ29tcGxleEV4dGVuc2lvbi5qYXZhCmluZGV4IDgyN2I5YzguLmFkOWU1MTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4RXh0ZW5zaW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhFeHRlbnNpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhSZXN0cmljdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhSZXN0cmljdGlvbi5qYXZhCmluZGV4IGZkOTM2MzQuLjY5N2FiMmZkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQ29tcGxleFJlc3RyaWN0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhSZXN0cmljdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQ29tcGxleFR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4VHlwZS5qYXZhCmluZGV4IDEwNDVlYjguLmY2NDE3NzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4VHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4VHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CkBAIC0zNywxNyArMzUsMTcgQEAKIAogCiAgICAgQFhtbEF0dHJpYnV0ZSgiZmluYWwiKQotICAgIHB1YmxpYyBDb21wbGV4VHlwZSBfZmluYWwoU3RyaW5nW10gdmFsdWUpOwotCi0gICAgQFhtbEF0dHJpYnV0ZSgiZmluYWwiKQogICAgIHB1YmxpYyBDb21wbGV4VHlwZSBfZmluYWwoU3RyaW5nIHZhbHVlKTsKIAotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBwdWJsaWMgQ29tcGxleFR5cGUgYmxvY2soU3RyaW5nW10gdmFsdWUpOworICAgIEBYbWxBdHRyaWJ1dGUoImZpbmFsIikKKyAgICBwdWJsaWMgQ29tcGxleFR5cGUgX2ZpbmFsKFN0cmluZ1tdIHZhbHVlKTsKIAogICAgIEBYbWxBdHRyaWJ1dGUKICAgICBwdWJsaWMgQ29tcGxleFR5cGUgYmxvY2soU3RyaW5nIHZhbHVlKTsKIAorICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgQ29tcGxleFR5cGUgYmxvY2soU3RyaW5nW10gdmFsdWUpOworCiAgICAgQFhtbEF0dHJpYnV0ZSgiYWJzdHJhY3QiKQogICAgIHB1YmxpYyBDb21wbGV4VHlwZSBfYWJzdHJhY3QoYm9vbGVhbiB2YWx1ZSk7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4VHlwZUhvc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4VHlwZUhvc3QuamF2YQppbmRleCA4NmMzNjU2Li5hM2JjNTJkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQ29tcGxleFR5cGVIb3N0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhUeXBlSG9zdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQ29tcGxleFR5cGVNb2RlbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbXBsZXhUeXBlTW9kZWwuamF2YQppbmRleCA3Mzk4YTIwLi42ZjgyZDM5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvQ29tcGxleFR5cGVNb2RlbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db21wbGV4VHlwZU1vZGVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db250ZW50TW9kZWxDb250YWluZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Db250ZW50TW9kZWxDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTNmMGFhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0NvbnRlbnRNb2RlbENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb24uWG1sRWxlbWVudDsKKworLyoqCisgKiBVc2VkIHRvIHdyaXRlIGEgY29udGVudCBtb2RlbC4KKyAqCisgKiBUaGlzIG1peGVzIHRoZSBwYXJ0aWNsZSBhbmQgbW9kZWwgZ3JvdXAgYXMgdGhlIGNoaWxkIG9mIGNvbXBsZXggdHlwZS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29udGVudE1vZGVsQ29udGFpbmVyIGV4dGVuZHMgVHlwZWRYbWxXcml0ZXIgeworICAgIEBYbWxFbGVtZW50CisgICAgTG9jYWxFbGVtZW50IGVsZW1lbnQoKTsKKworICAgIEBYbWxFbGVtZW50CisgICAgQW55IGFueSgpOworCisgICAgQFhtbEVsZW1lbnQKKyAgICBFeHBsaWNpdEdyb3VwIGFsbCgpOworCisgICAgQFhtbEVsZW1lbnQKKyAgICBFeHBsaWNpdEdyb3VwIHNlcXVlbmNlKCk7CisKKyAgICBAWG1sRWxlbWVudAorICAgIEV4cGxpY2l0R3JvdXAgY2hvaWNlKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRG9jdW1lbnRhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0RvY3VtZW50YXRpb24uamF2YQppbmRleCBjMTUwZmExLi44NWU5OTc2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRG9jdW1lbnRhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Eb2N1bWVudGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9FbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRWxlbWVudC5qYXZhCmluZGV4IDY1MDNhZjcuLmQzYTBjNjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9FbGVtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0VsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpAQCAtMzksMTAgKzM3LDEwIEBACiAgICAgcHVibGljIEVsZW1lbnQgdHlwZShRTmFtZSB2YWx1ZSk7CiAKICAgICBAWG1sQXR0cmlidXRlCi0gICAgcHVibGljIEVsZW1lbnQgYmxvY2soU3RyaW5nW10gdmFsdWUpOworICAgIHB1YmxpYyBFbGVtZW50IGJsb2NrKFN0cmluZyB2YWx1ZSk7CiAKICAgICBAWG1sQXR0cmlidXRlCi0gICAgcHVibGljIEVsZW1lbnQgYmxvY2soU3RyaW5nIHZhbHVlKTsKKyAgICBwdWJsaWMgRWxlbWVudCBibG9jayhTdHJpbmdbXSB2YWx1ZSk7CiAKICAgICBAWG1sQXR0cmlidXRlCiAgICAgcHVibGljIEVsZW1lbnQgbmlsbGFibGUoYm9vbGVhbiB2YWx1ZSk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRXhwbGljaXRHcm91cC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0V4cGxpY2l0R3JvdXAuamF2YQppbmRleCAwYzhkZTQ0Li5kOTE1NTQ4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRXhwbGljaXRHcm91cC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9FeHBsaWNpdEdyb3VwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9FeHRlbnNpb25UeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRXh0ZW5zaW9uVHlwZS5qYXZhCmluZGV4IDI5MDE3MWYuLjkzMGEwNTEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9FeHRlbnNpb25UeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0V4dGVuc2lvblR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0ZpeGVkT3JEZWZhdWx0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRml4ZWRPckRlZmF1bHQuamF2YQppbmRleCBlOTE5OWQzLi43YmYxZDE3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRml4ZWRPckRlZmF1bHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvRml4ZWRPckRlZmF1bHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0ltcG9ydC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0ltcG9ydC5qYXZhCmluZGV4IDUzM2E5YzMuLmE0ZjgyYjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9JbXBvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvSW1wb3J0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9MaXN0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvTGlzdC5qYXZhCmluZGV4IDZkZDNkY2EuLmUzNDU0YjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9MaXN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0xpc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0xvY2FsQXR0cmlidXRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvTG9jYWxBdHRyaWJ1dGUuamF2YQppbmRleCA5ZWU1N2U4Li4xMWU5MDE2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvTG9jYWxBdHRyaWJ1dGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvTG9jYWxBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0xvY2FsRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL0xvY2FsRWxlbWVudC5qYXZhCmluZGV4IDVjOTE0MDQuLjViYWMwNmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Mb2NhbEVsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvTG9jYWxFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9OZXN0ZWRQYXJ0aWNsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL05lc3RlZFBhcnRpY2xlLmphdmEKaW5kZXggZWU4OGJlMC4uMTVmOGZmZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL05lc3RlZFBhcnRpY2xlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL05lc3RlZFBhcnRpY2xlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Ob0ZpeGVkRmFjZXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Ob0ZpeGVkRmFjZXQuamF2YQppbmRleCBjNzJlZmI3Li4xMDFiY2FkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvTm9GaXhlZEZhY2V0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL05vRml4ZWRGYWNldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvT2NjdXJzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvT2NjdXJzLmphdmEKaW5kZXggZDgxNjkyYy4uMmZiYjc2NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL09jY3Vycy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9PY2N1cnMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpAQCAtMzgsOSArMzYsOSBAQAogICAgIHB1YmxpYyBPY2N1cnMgbWluT2NjdXJzKGludCB2YWx1ZSk7CiAKICAgICBAWG1sQXR0cmlidXRlCi0gICAgcHVibGljIE9jY3VycyBtYXhPY2N1cnMoU3RyaW5nIHZhbHVlKTsKKyAgICBwdWJsaWMgT2NjdXJzIG1heE9jY3VycyhpbnQgdmFsdWUpOwogCiAgICAgQFhtbEF0dHJpYnV0ZQotICAgIHB1YmxpYyBPY2N1cnMgbWF4T2NjdXJzKGludCB2YWx1ZSk7CisgICAgcHVibGljIE9jY3VycyBtYXhPY2N1cnMoU3RyaW5nIHZhbHVlKTsKIAogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1BhcnRpY2xlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvUGFydGljbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjVmOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1BhcnRpY2xlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CisKKy8qKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgaW50ZXJmYWNlIFBhcnRpY2xlIGV4dGVuZHMgQ29udGVudE1vZGVsQ29udGFpbmVyLCBPY2N1cnMgeworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1JlZGVmaW5hYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvUmVkZWZpbmFibGUuamF2YQppbmRleCBhOTQ3MDc0Li42OThjNGZkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvUmVkZWZpbmFibGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvUmVkZWZpbmFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NjaGVtYS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NjaGVtYS5qYXZhCmluZGV4IGEzZTQ2ODUuLjZmNzcwMDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TY2hlbWEuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2NoZW1hLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKQEAgLTU4LDE4ICs1NiwxOCBAQAogICAgIHB1YmxpYyBTY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQoU3RyaW5nIHZhbHVlKTsKIAogICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBwdWJsaWMgU2NoZW1hIGJsb2NrRGVmYXVsdChTdHJpbmdbXSB2YWx1ZSk7Ci0KLSAgICBAWG1sQXR0cmlidXRlCiAgICAgcHVibGljIFNjaGVtYSBibG9ja0RlZmF1bHQoU3RyaW5nIHZhbHVlKTsKIAogICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBwdWJsaWMgU2NoZW1hIGZpbmFsRGVmYXVsdChTdHJpbmdbXSB2YWx1ZSk7CisgICAgcHVibGljIFNjaGVtYSBibG9ja0RlZmF1bHQoU3RyaW5nW10gdmFsdWUpOwogCiAgICAgQFhtbEF0dHJpYnV0ZQogICAgIHB1YmxpYyBTY2hlbWEgZmluYWxEZWZhdWx0KFN0cmluZyB2YWx1ZSk7CiAKICAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIFNjaGVtYSBmaW5hbERlZmF1bHQoU3RyaW5nW10gdmFsdWUpOworCisgICAgQFhtbEF0dHJpYnV0ZQogICAgIHB1YmxpYyBTY2hlbWEgdmVyc2lvbihTdHJpbmcgdmFsdWUpOwogCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2NoZW1hVG9wLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2NoZW1hVG9wLmphdmEKaW5kZXggNDJjMmI1My4uYTI5MWI0MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NjaGVtYVRvcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TY2hlbWFUb3AuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NpbXBsZUNvbnRlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVDb250ZW50LmphdmEKaW5kZXggMmVlYTViNC4uMjYwZmEwYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NpbXBsZUNvbnRlbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlQ29udGVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlRGVyaXZhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NpbXBsZURlcml2YXRpb24uamF2YQppbmRleCBmNTdlNjJhLi42MDdhOTMyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlRGVyaXZhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVEZXJpdmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVFeHRlbnNpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVFeHRlbnNpb24uamF2YQppbmRleCAzZWY0MGNhLi40MmM5MDZiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlRXh0ZW5zaW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NpbXBsZUV4dGVuc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlUmVzdHJpY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVSZXN0cmljdGlvbi5qYXZhCmluZGV4IGQ3NGM1OGIuLjU0N2UzNGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVSZXN0cmljdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVSZXN0cmljdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDggKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlUmVzdHJpY3Rpb25Nb2RlbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NpbXBsZVJlc3RyaWN0aW9uTW9kZWwuamF2YQppbmRleCA0NjI5MWY0Li5hYjcwZDE3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlUmVzdHJpY3Rpb25Nb2RlbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVSZXN0cmljdGlvbk1vZGVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlVHlwZS5qYXZhCmluZGV4IDE0ZmZiMDQuLmE0MTdmZGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9TaW1wbGVUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NpbXBsZVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1NpbXBsZVR5cGVIb3N0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlVHlwZUhvc3QuamF2YQppbmRleCBlZDhkNzgzLi45YzE5MjFhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlVHlwZUhvc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvU2ltcGxlVHlwZUhvc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1RvcExldmVsQXR0cmlidXRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVG9wTGV2ZWxBdHRyaWJ1dGUuamF2YQppbmRleCA4YmJhYmE4Li5jOTkyZmFkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVG9wTGV2ZWxBdHRyaWJ1dGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVG9wTGV2ZWxBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1RvcExldmVsRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1RvcExldmVsRWxlbWVudC5qYXZhCmluZGV4IDNmNDhiMWUuLjM3NjFkNmQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9Ub3BMZXZlbEVsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVG9wTGV2ZWxFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsOCArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4ueG1sc2NoZW1hOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKQEAgLTM4LDEwICszNiwxMCBAQAogCiAKICAgICBAWG1sQXR0cmlidXRlKCJmaW5hbCIpCi0gICAgcHVibGljIFRvcExldmVsRWxlbWVudCBfZmluYWwoU3RyaW5nW10gdmFsdWUpOworICAgIHB1YmxpYyBUb3BMZXZlbEVsZW1lbnQgX2ZpbmFsKFN0cmluZyB2YWx1ZSk7CiAKICAgICBAWG1sQXR0cmlidXRlKCJmaW5hbCIpCi0gICAgcHVibGljIFRvcExldmVsRWxlbWVudCBfZmluYWwoU3RyaW5nIHZhbHVlKTsKKyAgICBwdWJsaWMgVG9wTGV2ZWxFbGVtZW50IF9maW5hbChTdHJpbmdbXSB2YWx1ZSk7CiAKICAgICBAWG1sQXR0cmlidXRlKCJhYnN0cmFjdCIpCiAgICAgcHVibGljIFRvcExldmVsRWxlbWVudCBfYWJzdHJhY3QoYm9vbGVhbiB2YWx1ZSk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVHlwZURlZlBhcnRpY2xlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVHlwZURlZlBhcnRpY2xlLmphdmEKaW5kZXggZTAwNzNkMy4uOWU3MzI2NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1R5cGVEZWZQYXJ0aWNsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9UeXBlRGVmUGFydGljbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1R5cGVIb3N0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVHlwZUhvc3QuamF2YQppbmRleCAzZDg2YjM3Li44YzQ2ZjM3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVHlwZUhvc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVHlwZUhvc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1VuaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVW5pb24uamF2YQppbmRleCA0OTJkMzIyLi5iM2JiZDBiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVW5pb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvVW5pb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL1dpbGRjYXJkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvV2lsZGNhcmQuamF2YQppbmRleCAxNmY4NWZhLi4wN2QwMjMzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvV2lsZGNhcmQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvV2lsZGNhcmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnNjaGVtYWdlbi54bWxzY2hlbWE7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpAQCAtMzgsOSArMzYsOSBAQAogICAgIHB1YmxpYyBXaWxkY2FyZCBwcm9jZXNzQ29udGVudHMoU3RyaW5nIHZhbHVlKTsKIAogICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBwdWJsaWMgV2lsZGNhcmQgbmFtZXNwYWNlKFN0cmluZyB2YWx1ZSk7CisgICAgcHVibGljIFdpbGRjYXJkIG5hbWVzcGFjZShTdHJpbmdbXSB2YWx1ZSk7CiAKICAgICBAWG1sQXR0cmlidXRlCi0gICAgcHVibGljIFdpbGRjYXJkIG5hbWVzcGFjZShTdHJpbmdbXSB2YWx1ZSk7CisgICAgcHVibGljIFdpbGRjYXJkIG5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOwogCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggN2RiYWUwOC4uZTFmZjllMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw1IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIEBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb24uWG1sTmFtZXNwYWNlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIuc2NoZW1hZ2VuLnhtbHNjaGVtYTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3NjaGVtYWdlbi94bWxzY2hlbWEvcGFja2FnZS5odG1sCmluZGV4IGQ1ZWM3M2YuLjYxYzRkMDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgogWE1MIFNjaGVtYSB3cml0ZXIgZ2VuZXJhdGVkIGJ5IFRYVy4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvc2NoZW1hZ2VuL3htbHNjaGVtYS94bWxzY2hlbWEtZm9yLWpheGIucm5nIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL3htbHNjaGVtYS1mb3ItamF4Yi5ybmcKaW5kZXggZTZhZDFkZi4uMDkzODc0NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL3htbHNjaGVtYS1mb3ItamF4Yi5ybmcKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi9zY2hlbWFnZW4veG1sc2NoZW1hL3htbHNjaGVtYS1mb3ItamF4Yi5ybmcKQEAgLTEsNCArMSwyOCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8Z3JhbW1hciB4bWxucz0iaHR0cDovL3JlbGF4bmcub3JnL25zL3N0cnVjdHVyZS8xLjAiCiAgICAgICBkYXRhdHlwZUxpYnJhcnk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyIKICAgICAgIG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9CeXRlQXJyYXlPdXRwdXRTdHJlYW1FeC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0J5dGVBcnJheU91dHB1dFN0cmVhbUV4LmphdmEKaW5kZXggNjEwNzUyNC4uMDVjN2ZkYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0J5dGVBcnJheU91dHB1dFN0cmVhbUV4LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0J5dGVBcnJheU91dHB1dFN0cmVhbUV4LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0NvbGxpc2lvbkNoZWNrU3RhY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9Db2xsaXNpb25DaGVja1N0YWNrLmphdmEKaW5kZXggNjdmMTRiMy4uYzU2M2IwMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0NvbGxpc2lvbkNoZWNrU3RhY2suamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvQ29sbGlzaW9uQ2hlY2tTdGFjay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwpAQCAtNTMsNiArNTIsMTIgQEAKICAgICBwcml2YXRlIGludFtdIG5leHQ7CiAgICAgcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBjaGVjayBzaGFsbCBiZSBkb25lIGJ5IHVzaW5nIHRoZSBvYmplY3QgaWRlbnRpdHkuCisgICAgICogRmFsc2UgaWYgdGhlIGNoZWNrIHNoYWxsIGJlIGRvbmUgd2l0aCB0aGUgZXF1YWxzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlSWRlbnRpdHkgPSB0cnVlOworCiAgICAgLy8gZm9yIG91ciBwdXJwb3NlLCB0aGVyZSBpc24ndCBtdWNoIHBvaW50IGluIHJlc2l6aW5nIHRoaXMgYXMgd2UgZG9uJ3QgZXhwZWN0CiAgICAgLy8gdGhlIHN0YWNrIHRvIGdyb3cgdGhhdCBtdWNoLgogICAgIHByaXZhdGUgZmluYWwgaW50W10gaW5pdGlhbEhhc2g7CkBAIC02NCw2ICs2OSwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCB0byBmYWxzZSB0byB1c2Uge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gdG8gZGV0ZWN0IGN5Y2xlcy4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb25seSB1c2VkIHdoZW4gdGhlIHN0YWNrIGlzIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZUlkZW50aXR5KGJvb2xlYW4gdXNlSWRlbnRpdHkpIHsKKyAgICAgICAgdGhpcy51c2VJZGVudGl0eSA9IHVzZUlkZW50aXR5OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUlkZW50aXR5KCkgeworICAgICAgICByZXR1cm4gdXNlSWRlbnRpdHk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUHVzaGVzIGEgbmV3IG9iamVjdCB0byB0aGUgc3RhY2suCiAgICAgICoKICAgICAgKiBAcmV0dXJuCkBAIC0xMDUsNyArMTIyLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGludCBoYXNoKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKSAlIGluaXRpYWxIYXNoLmxlbmd0aDsKKyAgICAgICAgcmV0dXJuICgodXNlSWRlbnRpdHk/U3lzdGVtLmlkZW50aXR5SGFzaENvZGUobyk6by5oYXNoQ29kZSgpKSYweDdGRkZGRkZGKSAlIGluaXRpYWxIYXNoLmxlbmd0aDsKICAgICB9CiAKICAgICAvKioKQEAgLTEzOCw3ICsxNTUsMTEgQEAKICAgICAgICAgd2hpbGUocCE9MCkgewogICAgICAgICAgICAgcC0tOwogICAgICAgICAgICAgT2JqZWN0IGV4aXN0aW5nID0gZGF0YVtwXTsKLSAgICAgICAgICAgIGlmKGV4aXN0aW5nPT1vKSAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAodXNlSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBpZihleGlzdGluZz09bykgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoby5lcXVhbHMoZXhpc3RpbmcpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHAgPSBuZXh0W3BdOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE2Niw0ICsxODcsMjIgQEAKICAgICAgICAgICAgIEFycmF5cy5maWxsKGluaXRpYWxIYXNoLDApOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgY3ljbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDeWNsZVN0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBpPXNpemUoKS0xOworICAgICAgICBFIG9iaiA9IGdldChpKTsKKyAgICAgICAgc2IuYXBwZW5kKG9iaik7CisgICAgICAgIE9iamVjdCB4OworICAgICAgICBkbyB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAtPiAiKTsKKyAgICAgICAgICAgIHggPSBnZXQoLS1pKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh4KTsKKyAgICAgICAgfSB3aGlsZShvYmohPXgpOworCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9EYXRhU291cmNlU291cmNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvRGF0YVNvdXJjZVNvdXJjZS5qYXZhCmluZGV4IDVjOTgxYTUuLjZiMDE3ZWIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9EYXRhU291cmNlU291cmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0RhdGFTb3VyY2VTb3VyY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi51dGlsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9FZGl0RGlzdGFuY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9FZGl0RGlzdGFuY2UuamF2YQppbmRleCA2ZGEwNjY4Li42YzM1YzU5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvRWRpdERpc3RhbmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0VkaXREaXN0YW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDkgKzIyLDE2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKSRJZCQKKyAqLworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi51dGlsOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCiAgKiBDb21wdXRlcyB0aGUgc3RyaW5nIGVkaXQgZGlzdGFuY2UuCiAgKgpAQCAtNTQsMTQgKzYxLDI0IEBACiAgICAgICogQHJldHVybiBudWxsIGlmIGdyb3VwLmxlbmd0aD09MC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kTmVhcmVzdCggU3RyaW5nIGtleSwgU3RyaW5nW10gZ3JvdXAgKSB7CisgICAgICAgIHJldHVybiBmaW5kTmVhcmVzdChrZXksIEFycmF5cy5hc0xpc3QoZ3JvdXApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgc3RyaW5nIGluIHRoZSA8Y29kZT5ncm91cDwvY29kZT4gY2xvc2VzdCB0bworICAgICAqIDxjb2RlPmtleTwvY29kZT4gYW5kIHJldHVybnMgaXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgZ3JvdXAubGVuZ3RoPT0wLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmROZWFyZXN0KCBTdHJpbmcga2V5LCBDb2xsZWN0aW9uPFN0cmluZz4gZ3JvdXAgKSB7CiAgICAgICAgIGludCBjID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgIFN0cmluZyByID0gbnVsbDsKIAotICAgICAgICBmb3IoIGludCBpPTA7IGk8Z3JvdXAubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICBpbnQgZWQgPSBlZGl0RGlzdGFuY2Uoa2V5LGdyb3VwW2ldKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IGdyb3VwKSB7CisgICAgICAgICAgICBpbnQgZWQgPSBlZGl0RGlzdGFuY2Uoa2V5LHMpOwogICAgICAgICAgICAgaWYoIGM+ZWQgKSB7CiAgICAgICAgICAgICAgICAgYyA9IGVkOwotICAgICAgICAgICAgICAgIHIgPSBncm91cFtpXTsKKyAgICAgICAgICAgICAgICByID0gczsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9GYXRhbEFkYXB0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9GYXRhbEFkYXB0ZXIuamF2YQppbmRleCA1ZTdkNWMyLi41MmRkYzM2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvRmF0YWxBZGFwdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0ZhdGFsQWRhcHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnV0aWw7CiAKIGltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvRmxhdHRlbkl0ZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvRmxhdHRlbkl0ZXJhdG9yLmphdmEKaW5kZXggMDJhM2RiOS4uYjkzYjZlYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL0ZsYXR0ZW5JdGVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9GbGF0dGVuSXRlcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi51dGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvYmluZC92Mi91dGlsL1FOYW1lTWFwLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvUU5hbWVNYXAuamF2YQppbmRleCA5Mjg1NWIyLi4wMGZiYjVkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvUU5hbWVNYXAuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvUU5hbWVNYXAuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi51dGlsOwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvVHlwZUNhc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2JpbmQvdjIvdXRpbC9UeXBlQ2FzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGQ3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kL3YyL3V0aWwvVHlwZUNhc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudjIudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgVHlwZUNhc3QgeworICAgIC8qKgorICAgICAqIE1ha2VzIHN1cmUgdGhhdCBhIG1hcCBjb250YWlucyB0aGUgcmlnaHQgdHlwZSwgYW5kIHJldHVybnMgaXQgdG8gdGhlIGRlc2lyYWJsZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEssVj4gTWFwPEssVj4gY2hlY2tlZENhc3QoIE1hcDw/LD8+IG0sIENsYXNzPEs+IGtleVR5cGUsIENsYXNzPFY+IHZhbHVlVHlwZSApIHsKKyAgICAgICAgaWYobT09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBmb3IgKE1hcC5FbnRyeSBlIDogbS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBpZigha2V5VHlwZS5pc0luc3RhbmNlKGUuZ2V0S2V5KCkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oZS5nZXRLZXkoKS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYoIXZhbHVlVHlwZS5pc0luc3RhbmNlKGUuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihlLmdldFZhbHVlKCkuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKE1hcDxLLFY+KW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0RUREV2ZW50TGlzdGVuZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9EVERFdmVudExpc3RlbmVyLmphdmEKaW5kZXggOGNlNWI1NC4uZWY5NzgwZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0RUREV2ZW50TGlzdGVuZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvRFRERXZlbnRMaXN0ZW5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9EVERIYW5kbGVyQmFzZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0RUREhhbmRsZXJCYXNlLmphdmEKaW5kZXggZDE2OTA0MC4uZGJjZjU1OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0RUREhhbmRsZXJCYXNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0RUREhhbmRsZXJCYXNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0RURFBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0RURFBhcnNlci5qYXZhCmluZGV4IDUwNWNjYjQuLjdmZmM2ZWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9EVERQYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvRFREUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTgsNiArNTgsNyBAQAogICogQGF1dGhvciBEYXZpZCBCcm93bmVsbAogICogQGF1dGhvciBKYW5ldCBLb2VuaWcKICAqIEBhdXRob3IgS29oc3VrZSBLQVdBR1VDSEkKKyAqIEB2ZXJzaW9uICRJZDogRFREUGFyc2VyLmphdmEsdiAxLjEgMjAwNS8wNS8xNSAwNDoyNDoxOSBrb2hzdWtlIEV4cCAkCiAgKi8KIHB1YmxpYyBjbGFzcyBEVERQYXJzZXIgewogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfQ0RBVEEgPSAiQ0RBVEEiOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0VuZE9mSW5wdXRFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9FbmRPZklucHV0RXhjZXB0aW9uLmphdmEKaW5kZXggYjg4MjU2Yi4uOWQ2NTA3OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0VuZE9mSW5wdXRFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvRW5kT2ZJbnB1dEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9FbnRpdHlEZWNsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvRW50aXR5RGVjbC5qYXZhCmluZGV4IGNiMTk0NGUuLmY1MTAzN2MgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9FbnRpdHlEZWNsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0VudGl0eURlY2wuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMCw2ICszMCw3IEBACiAgKgogICogQGF1dGhvciBEYXZpZCBCcm93bmVsbAogICogQGF1dGhvciBKYW5ldCBLb2VuaWcKKyAqIEB2ZXJzaW9uIDEuMyAwMC8wMi8yNAogICovCiBjbGFzcyBFbnRpdHlEZWNsIHsKICAgICBTdHJpbmcgbmFtZTsgICAgICAgIC8vIDwhRU5USVRZIG5hbWUgLi4uID4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9FeHRlcm5hbEVudGl0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0V4dGVybmFsRW50aXR5LmphdmEKaW5kZXggNjRhOWNjMS4uZTdjODlhZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0V4dGVybmFsRW50aXR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0V4dGVybmFsRW50aXR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL0lucHV0RW50aXR5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvSW5wdXRFbnRpdHkuamF2YQppbmRleCBmMDA5OGQxLi43ZGIzNjAzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvSW5wdXRFbnRpdHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvSW5wdXRFbnRpdHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01Miw2ICs1Miw3IEBACiAgKgogICogQGF1dGhvciBEYXZpZCBCcm93bmVsbAogICogQGF1dGhvciBKYW5ldCBLb2VuaWcKKyAqIEB2ZXJzaW9uIDEuNCAwMC8wOC8wNQogICovCiBwdWJsaWMgY2xhc3MgSW5wdXRFbnRpdHkgewogICAgIHByaXZhdGUgaW50IHN0YXJ0LCBmaW5pc2g7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvSW50ZXJuYWxFbnRpdHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9JbnRlcm5hbEVudGl0eS5qYXZhCmluZGV4IDAxMTZiOTYuLjk1ZTk2ZDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9JbnRlcm5hbEVudGl0eS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9JbnRlcm5hbEVudGl0eS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9NZXNzYWdlQ2F0YWxvZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL01lc3NhZ2VDYXRhbG9nLmphdmEKaW5kZXggZjI5ZDBjNi4uMjIyOTk2MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL01lc3NhZ2VDYXRhbG9nLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL01lc3NhZ2VDYXRhbG9nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTMwLDYgKzEzMCw3IEBACiAgKiBhcyBkaXN0cmlidXRlZCBpbiBpdHMgSkFSIGZpbGUuCiAgKgogICogQGF1dGhvciBEYXZpZCBCcm93bmVsbAorICogQHZlcnNpb24gMS4xLCAwMC8wOC8wNQogICogQHNlZSBqYXZhLnV0aWwuTG9jYWxlCiAgKiBAc2VlIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUKICAqIEBzZWUgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9SZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1Jlc29sdmVyLmphdmEKaW5kZXggODQ4ZDVkNy4uYmI3M2M3ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1Jlc29sdmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1Jlc29sdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtOTEsNiArOTEsNyBAQAogICoKICAqIEBhdXRob3IgRGF2aWQgQnJvd25lbGwKICAqIEBhdXRob3IgSmFuZXQgS29lbmlnCisgKiBAdmVyc2lvbiAxLjMgMDAvMDIvMjQKICAqLwogcHVibGljIGNsYXNzIFJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewogICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmluZ01JTUU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvU2ltcGxlSGFzaHRhYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvU2ltcGxlSGFzaHRhYmxlLmphdmEKaW5kZXggZmE1ZTFlOC4uMGY1NDhiNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1NpbXBsZUhhc2h0YWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9TaW1wbGVIYXNodGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01OCw2ICs1OCw3IEBACiAgKiBpdCBtYWtlcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2Ugd2hlbiBub3JtYWxpemluZyBhdHRyaWJ1dGVzLAogICogd2hpY2ggaXMgZG9uZSBmb3IgZWFjaCBzdGFydC1lbGVtZW50IGNvbnN0cnVjdC4KICAqCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCiAgKi8KIGZpbmFsIGNsYXNzIFNpbXBsZUhhc2h0YWJsZSBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKICAgICAvLyBlbnRyaWVzIC4uLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1htbENoYXJzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvWG1sQ2hhcnMuamF2YQppbmRleCAyMjdjZWNkLi4wMjFkYWNhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvWG1sQ2hhcnMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvWG1sQ2hhcnMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMiw2ICszMiw3IEBACiAgKiBib3RoIHRvIHBhcnNlIGFuZCB0byBjcmVhdGUgc3VjaCBkb2N1bWVudHMuCiAgKgogICogQGF1dGhvciBEYXZpZCBCcm93bmVsbAorICogQHZlcnNpb24gMS4xLCAwMC8wOC8wNQogICovCiBwdWJsaWMgY2xhc3MgWG1sQ2hhcnMgewogICAgIC8vIGNhbid0IGNvbnN0cnVjdCBpbnN0YW5jZXMKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9YbWxOYW1lcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1htbE5hbWVzLmphdmEKaW5kZXggODIzZDUzMi4uMTNhZWE2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1htbE5hbWVzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1htbE5hbWVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzIsNiArMzIsNyBAQAogICogYm90aCB0byBwYXJzZSBhbmQgdG8gY3JlYXRlIHN1Y2ggZG9jdW1lbnRzLgogICoKICAqIEBhdXRob3IgRGF2aWQgQnJvd25lbGwKKyAqIEB2ZXJzaW9uIDEuMSwgMDAvMDgvMDUKICAqLwogcHVibGljIGNsYXNzIFhtbE5hbWVzIHsKICAgICBwcml2YXRlIFhtbE5hbWVzKCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1htbFJlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL1htbFJlYWRlci5qYXZhCmluZGV4IDhkMTE2OTMuLjA3MzJhODAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9YbWxSZWFkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvWG1sUmVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTksNiArNTksNyBAQAogICoKICAqIEBhdXRob3IgRGF2aWQgQnJvd25lbGwKICAqIEBhdXRob3IgSmFuZXQgS29lbmlnCisgKiBAdmVyc2lvbiAxLjMgMDAvMDIvMjQKICAqLwogLy8gcGFja2FnZSBwcml2YXRlCiBmaW5hbCBjbGFzcyBYbWxSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9wYWNrYWdlLmh0bWwKaW5kZXggYTFmMDkwOC4uYTEwZjQ0ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxIVE1MPjxCT0RZPgogPFA+ICAgc2NhbiBEVEQgc3RyZWFtIGFuZCBnZW5lcmF0ZXMgYXBwcm9wcmlhdGUgZXZlbnRzLjwvUD4KIDwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvcmVzb3VyY2VzL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9kdGRwYXJzZXIvcmVzb3VyY2VzL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggZjQxOTA2OC4uNTdmMzYyOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZHRkcGFyc2VyL3Jlc291cmNlcy9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2R0ZHBhcnNlci9yZXNvdXJjZXMvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw3ICsyMSw3IEBACiAjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIyBoYXZlIGFueSBxdWVzdGlvbnMuCi0jIAorIwogCiAjCiAjIEVuZ2xpc2ggZGlhZ25vc3RpYyBtZXNzYWdlcyAoYW5kIGZyYWdtZW50cykgZm9yIFN1bidzIFhNTCBwYXJzZXIuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9BYnN0cmFjdFJlc291cmNlQnVuZGxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9BYnN0cmFjdFJlc291cmNlQnVuZGxlLmphdmEKaW5kZXggMTdmYTQzMi4uMjdlODY0MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvQWJzdHJhY3RSZXNvdXJjZUJ1bmRsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0Fic3RyYWN0UmVzb3VyY2VCdW5kbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCw0NCArMjQsNiBAQAogICoKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIGZyZWVieG1sIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIC0gMjAwNSBmcmVlYnhtbC5vcmcuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICRIZWFkZXI6IC9jdnMvZmkvRmFzdEluZm9zZXQvc3JjL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0Fic3RyYWN0UmVzb3VyY2VCdW5kbGUuamF2YSx2IDEuMiAyMDA1LzA1LzE3IDIwOjUzOjE5IGpvZWh3IEV4cCAkCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0OwogCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC04Myw3ICs0NSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIF9idW5kbGVOYW1lOwogICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRCdW5kbGVOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJ1bmRsZU5hbWUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgX2J1bmRsZU5hbWUgPSBuYW1lOwogICAgIH0KICAgICAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0NvbW1vblJlc291cmNlQnVuZGxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9Db21tb25SZXNvdXJjZUJ1bmRsZS5qYXZhCmluZGV4IGQ5ZmUyMGQuLmU5ZDk5MmMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0NvbW1vblJlc291cmNlQnVuZGxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvQ29tbW9uUmVzb3VyY2VCdW5kbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwzNCArMjQsNiBAQAogICoKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldDsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CkBAIC03OSwxNCArNTEsMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIENvbW1vblJlc291cmNlQnVuZGxlIGdldEluc3RhbmNlKCkgewogICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChDb21tb25SZXNvdXJjZUJ1bmRsZS5jbGFzcykgewotICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IENvbW1vblJlc291cmNlQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vKipuZWVkIHRvIGtub3cgd2hlcmUgdG8gZ2V0IHRoZSBsb2NhbGUKLSAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmcgbG9jYWxlU3RyaW5nID0gQ29tbW9uUHJvcGVydGllcy5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvbWFyLmNvbW1vbi5sb2NhbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsZVN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IHBhcnNlTG9jYWxlKGxvY2FsZVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IENvbW1vblJlc291cmNlQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgLy8qKm5lZWQgdG8ga25vdyB3aGVyZSB0byBnZXQgdGhlIGxvY2FsZQorICAgICAgICAgICAgICAgIC8vU3RyaW5nIGxvY2FsZVN0cmluZyA9IENvbW1vblByb3BlcnRpZXMuZ2V0SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KCJvbWFyLmNvbW1vbi5sb2NhbGUiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxlU3RyaW5nID0gbnVsbDsKKyAgICAgICAgICAgICAgICBsb2NhbGUgPSBwYXJzZUxvY2FsZShsb2NhbGVTdHJpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTk2LDkgKzY2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIENvbW1vblJlc291cmNlQnVuZGxlIGdldEluc3RhbmNlKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29tbW9uUmVzb3VyY2VCdW5kbGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBDb21tb25SZXNvdXJjZUJ1bmRsZShsb2NhbGUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBDb21tb25SZXNvdXJjZUJ1bmRsZShsb2NhbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChDb21tb25SZXNvdXJjZUJ1bmRsZS5jbGFzcykgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvRGVjb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvRGVjb2Rlci5qYXZhCmluZGV4IGM0NzIyY2UuLjY4NjE5ZDYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0RlY29kZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9EZWNvZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMzQgKzI0LDYgQEAKICAqCiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5hbHBoYWJldC5CdWlsdEluUmVzdHJpY3RlZEFscGhhYmV0czsKQEAgLTEwMCwxNyArNzIsMjMgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERlY29kZXIgaW1wbGVtZW50cyBGYXN0SW5mb3NldFBhcnNlciB7CiAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXJbXSBYTUxfTkFNRVNQQUNFX05BTUVfQ0hBUlMgPSBFbmNvZGluZ0NvbnN0YW50cy5YTUxfTkFNRVNQQUNFX05BTUUudG9DaGFyQXJyYXkoKTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhcltdIFhNTE5TX05BTUVTUEFDRV9QUkVGSVhfQ0hBUlMgPSBFbmNvZGluZ0NvbnN0YW50cy5YTUxOU19OQU1FU1BBQ0VfUFJFRklYLnRvQ2hhckFycmF5KCk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXJbXSBYTUxOU19OQU1FU1BBQ0VfTkFNRV9DSEFSUyA9IEVuY29kaW5nQ29uc3RhbnRzLlhNTE5TX05BTUVTUEFDRV9OQU1FLnRvQ2hhckFycmF5KCk7CisKICAgICAvKioKICAgICAgKiBTdHJpbmcgaW50ZXJuaW5nIHN5c3RlbSBwcm9wZXJ0eS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfSU5URVJOSU5HX1NZU1RFTV9QUk9QRVJUWSA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5wYXJzZXIuc3RyaW5nLWludGVybmluZyI7CisgICAgICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQucGFyc2VyLnN0cmluZy1pbnRlcm5pbmciOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgYnVmZmVyIHNpemUgaW50ZXJuaW5nIHN5c3RlbSBwcm9wZXJ0eS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUZGRVJfU0laRV9TWVNURU1fUFJPUEVSVFkgPQotICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQucGFyc2VyLmJ1ZmZlci1zaXplIjsKKyAgICAgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5wYXJzZXIuYnVmZmVyLXNpemUiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBfc3RyaW5nSW50ZXJuaW5nU3lzdGVtRGVmYXVsdCA9IGZhbHNlOwogCkBAIC0xMTgsMTEgKzk2LDExIEBACiAKICAgICBzdGF0aWMgewogICAgICAgICBTdHJpbmcgcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTVFJJTkdfSU5URVJOSU5HX1NZU1RFTV9QUk9QRVJUWSwKLSAgICAgICAgICAgIEJvb2xlYW4udG9TdHJpbmcoX3N0cmluZ0ludGVybmluZ1N5c3RlbURlZmF1bHQpKTsKKyAgICAgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKF9zdHJpbmdJbnRlcm5pbmdTeXN0ZW1EZWZhdWx0KSk7CiAgICAgICAgIF9zdHJpbmdJbnRlcm5pbmdTeXN0ZW1EZWZhdWx0ID0gQm9vbGVhbi52YWx1ZU9mKHApLmJvb2xlYW5WYWx1ZSgpOwogCiAgICAgICAgIHAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQlVGRkVSX1NJWkVfU1lTVEVNX1BST1BFUlRZLAotICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhfYnVmZmVyU2l6ZVN5c3RlbURlZmF1bHQpKTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKF9idWZmZXJTaXplU3lzdGVtRGVmYXVsdCkpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IGkgPSBJbnRlZ2VyLnZhbHVlT2YocCkuaW50VmFsdWUoKTsKICAgICAgICAgICAgIGlmIChpID4gMCkgewpAQCAtMTQ4LDYgKzEyNiwxNiBAQAogICAgIHByaXZhdGUgTWFwIF9leHRlcm5hbFZvY2FidWxhcmllczsKIAogICAgIC8qKgorICAgICAqIFRydWUgaWYgY2FuIHBhcnNlIGZyYWdtZW50cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfcGFyc2VGcmFnbWVudHM7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIG5lZWRzIHRvIGNsb3NlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIF9uZWVkRm9yY2VTdHJlYW1DbG9zZTsKKworICAgIC8qKgogICAgICAqIFRydWUgaWYgdGhlIHZvY2FidWxhcnkgaXMgaW50ZXJuYWxseSBjcmVhdGVkIGJ5IGRlY29kZXIuCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIF92SXNJbnRlcm5hbDsKQEAgLTM1OSw4ICszNDcsMzUgQEAKICAgICAgICAgcmV0dXJuIF9leHRlcm5hbFZvY2FidWxhcmllczsKICAgICB9CiAKLSAgICAvLyBFbmQgRmFzdEluZm9zZXRQYXJzZXIgaW50ZXJmYWNlCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlRnJhZ21lbnRzKGJvb2xlYW4gcGFyc2VGcmFnbWVudHMpIHsKKyAgICAgICAgX3BhcnNlRnJhZ21lbnRzID0gcGFyc2VGcmFnbWVudHM7CisgICAgfQogCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFBhcnNlRnJhZ21lbnRzKCkgeworICAgICAgICByZXR1cm4gX3BhcnNlRnJhZ21lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZVN0cmVhbUNsb3NlKGJvb2xlYW4gbmVlZEZvcmNlU3RyZWFtQ2xvc2UpIHsKKyAgICAgICAgX25lZWRGb3JjZVN0cmVhbUNsb3NlID0gbmVlZEZvcmNlU3RyZWFtQ2xvc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmNlU3RyZWFtQ2xvc2UoKSB7CisgICAgICAgIHJldHVybiBfbmVlZEZvcmNlU3RyZWFtQ2xvc2U7CisgICAgfQorCisvLyBFbmQgRmFzdEluZm9zZXRQYXJzZXIgaW50ZXJmYWNlCiAKICAgICAvKioKICAgICAgKiBSZXNldCB0aGUgZGVjb2RlciBmb3IgcmV1c2UgZGVjb2RpbmcgYW5vdGhlciBYTUwgaW5mb3NldC4KQEAgLTQwNCw3ICs0MTksNyBAQAogICAgICAgICAgICAgZGVjb2RlSW5pdGlhbFZvY2FidWxhcnkoKTsKICAgICAgICAgfSBlbHNlIGlmIChiICE9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLgotICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5vcHRpbmFsVmFsdWVzIikpOworICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoIm1lc3NhZ2Uub3B0aW5hbFZhbHVlcyIpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjA0LDkgKzYxOSw5IEBACiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KF92Lm90aGVyTkNOYW1lKTsKIAogICAgICAgICAgICAgU3RyaW5nIHN5c3RlbV9pZGVudGlmaWVyID0gKChfYiAmIEVuY29kaW5nQ29uc3RhbnRzLk5PVEFUSU9OU19TWVNURU1fSURFTlRJRklFUl9GTEFHKSA+IDApCi0gICAgICAgICAgICAgICAgPyBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nT25GaXJzdEJpdChfdi5vdGhlclVSSSkgOiAiIjsKKyAgICAgICAgICAgID8gZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3Yub3RoZXJVUkkpIDogIiI7CiAgICAgICAgICAgICBTdHJpbmcgcHVibGljX2lkZW50aWZpZXIgPSAoKF9iICYgRW5jb2RpbmdDb25zdGFudHMuTk9UQVRJT05TX1BVQkxJQ19JREVOVElGSUVSX0ZMQUcpID4gMCkKLSAgICAgICAgICAgICAgICA/IGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KF92Lm90aGVyVVJJKSA6ICIiOworICAgICAgICAgICAgPyBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nT25GaXJzdEJpdChfdi5vdGhlclVSSSkgOiAiIjsKIAogICAgICAgICAgICAgTm90YXRpb24gbm90YXRpb24gPSBuZXcgTm90YXRpb24obmFtZSwgc3lzdGVtX2lkZW50aWZpZXIsIHB1YmxpY19pZGVudGlmaWVyKTsKICAgICAgICAgICAgIF9ub3RhdGlvbnMuYWRkKG5vdGF0aW9uKTsKQEAgLTYzMSw3ICs2NDYsNyBAQAogICAgICAgICAgICAgU3RyaW5nIHN5c3RlbV9pZGVudGlmaWVyID0gZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3Yub3RoZXJVUkkpOwogCiAgICAgICAgICAgICBTdHJpbmcgcHVibGljX2lkZW50aWZpZXIgPSAoKF9iICYgRW5jb2RpbmdDb25zdGFudHMuVU5QQVJTRURfRU5USVRJRVNfUFVCTElDX0lERU5USUZJRVJfRkxBRykgPiAwKQotICAgICAgICAgICAgICAgID8gZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3Yub3RoZXJVUkkpIDogIiI7CisgICAgICAgICAgICA/IGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KF92Lm90aGVyVVJJKSA6ICIiOwogCiAgICAgICAgICAgICBTdHJpbmcgbm90YXRpb25fbmFtZSA9IGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KF92Lm90aGVyTkNOYW1lKTsKIApAQCAtNjY5LDcgKzY4NCw3IEBACiAKICAgICBwcm90ZWN0ZWQgZmluYWwgUXVhbGlmaWVkTmFtZSBkZWNvZGVFSUlJbmRleE1lZGl1bSgpIHRocm93cyBGYXN0SW5mb3NldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgaSA9ICgoKF9iICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8zUkRfQklUX01FRElVTV9NQVNLKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8zUkRfQklUX1NNQUxMX0xJTUlUOworICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9TTUFMTF9MSU1JVDsKICAgICAgICAgcmV0dXJuIF92LmVsZW1lbnROYW1lLl9hcnJheVtpXTsKICAgICB9CiAKQEAgLTY3OCwyMCArNjkzLDIyIEBACiAgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzNSRF9CSVRfTEFSR0VfTEFSR0VfRkxBRykgPT0gMHgyMCkgewogICAgICAgICAgICAgLy8gRUlJIGxhcmdlIGluZGV4CiAgICAgICAgICAgICBpID0gKCgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzNSRF9CSVRfTEFSR0VfTUFTSykgPDwgMTYpIHwgKHJlYWQoKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9NRURJVU1fTElNSVQ7CisgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9NRURJVU1fTElNSVQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBFSUkgbGFyZ2UgbGFyZ2UgaW5kZXgKICAgICAgICAgICAgIGkgPSAoKChyZWFkKCkgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzNSRF9CSVRfTEFSR0VfTEFSR0VfTUFTSykgPDwgMTYpIHwgKHJlYWQoKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9MQVJHRV9MSU1JVDsKKyAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8zUkRfQklUX0xBUkdFX0xJTUlUOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBfdi5lbGVtZW50TmFtZS5fYXJyYXlbaV07CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGZpbmFsIFF1YWxpZmllZE5hbWUgZGVjb2RlTGl0ZXJhbFF1YWxpZmllZE5hbWUoaW50IHN0YXRlKSB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUXVhbGlmaWVkTmFtZSBkZWNvZGVMaXRlcmFsUXVhbGlmaWVkTmFtZShpbnQgc3RhdGUsIFF1YWxpZmllZE5hbWUgcSkKKyAgICB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHEgPT0gbnVsbCkgcSA9IG5ldyBRdWFsaWZpZWROYW1lKCk7CiAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICAgICAgIC8vIG5vIHByZWZpeCwgbm8gbmFtZXNwYWNlCiAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKAorICAgICAgICAgICAgICAgIHJldHVybiBxLnNldCgKICAgICAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nT25GaXJzdEJpdChfdi5sb2NhbE5hbWUpLApAQCAtNjk5LDkgKzcxNiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgIF9pZGVudGlmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAvLyBubyBwcmVmaXgsIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgIC8vIG5vIHByZWZpeCwgbmFtZXNwYWNlCiAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKAorICAgICAgICAgICAgICAgIHJldHVybiBxLnNldCgKICAgICAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ0luZGV4T25GaXJzdEJpdEFzTmFtZXNwYWNlTmFtZShmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nT25GaXJzdEJpdChfdi5sb2NhbE5hbWUpLApAQCAtNzA5LDEyICs3MjYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VOYW1lSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICBfaWRlbnRpZmllciwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgLy8gcHJlZml4LCBubyBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAvLyBwcmVmaXgsIG5vIG5hbWVzcGFjZQogICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5xTmFtZU1pc3NpbmdOYW1lc3BhY2VOYW1lIikpOwotICAgICAgICAgICAgLy8gcHJlZml4LCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAvLyBwcmVmaXgsIG5hbWVzcGFjZQogICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbGlmaWVkTmFtZSgKKyAgICAgICAgICAgICAgICByZXR1cm4gcS5zZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nSW5kZXhPbkZpcnN0Qml0QXNQcmVmaXgodHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nSW5kZXhPbkZpcnN0Qml0QXNOYW1lc3BhY2VOYW1lKHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3YubG9jYWxOYW1lKSwKQEAgLTc1Myw5ICs3NzAsOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIF9hZGRUb1RhYmxlID0gKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5OSVNUUklOR19BRERfVE9fVEFCTEVfRkxBRykgPiAwOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSAocmVhZCgpIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgKHJlYWQoKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpOwogICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9IGxlbmd0aCArIEVuY29kaW5nQ29uc3RhbnRzLk9DVEVUX1NUUklOR19MRU5HVEhfNVRIX0JJVF9NRURJVU1fTElNSVQ7CiAgICAgICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0FzQ2hhckJ1ZmZlcigpOwogICAgICAgICAgICAgICAgIHJldHVybiBOSVNUUklOR19TVFJJTkc7CkBAIC03NzQsOSArNzkxLDkgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBfYWRkVG9UYWJsZSA9IChiICYgRW5jb2RpbmdDb25zdGFudHMuTklTVFJJTkdfQUREX1RPX1RBQkxFX0ZMQUcpID4gMDsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gKHJlYWQoKSA8PCAyNCkgfAotICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICByZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSBsZW5ndGggKyBFbmNvZGluZ0NvbnN0YW50cy5PQ1RFVF9TVFJJTkdfTEVOR1RIXzVUSF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgICAgIGRlY29kZVV0ZjE2U3RyaW5nQXNDaGFyQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5JU1RSSU5HX1NUUklORzsKQEAgLTgxMCwxMSArODI3LDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5JU1RSSU5HX0lOREVYOwogICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuTklTVFJJTkdfSU5ERVhfTUVESVVNOgogICAgICAgICAgICAgICAgIF9pbnRlZ2VyID0gKCgoYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9NRURJVU1fTUFTSykgPDwgOCkgfCByZWFkKCkpCi0gICAgICAgICAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX1NNQUxMX0xJTUlUOworICAgICAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX1NNQUxMX0xJTUlUOwogICAgICAgICAgICAgICAgIHJldHVybiBOSVNUUklOR19JTkRFWDsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLk5JU1RSSU5HX0lOREVYX0xBUkdFOgogICAgICAgICAgICAgICAgIF9pbnRlZ2VyID0gKCgoYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9MQVJHRV9NQVNLKSA8PCAxNikgfCAocmVhZCgpIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9NRURJVU1fTElNSVQ7CisgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgICAgIHJldHVybiBOSVNUUklOR19JTkRFWDsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLk5JU1RSSU5HX0VNUFRZOgogICAgICAgICAgICAgICAgIHJldHVybiBOSVNUUklOR19FTVBUWV9TVFJJTkc7CkBAIC04MzYsOSArODUzLDkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLk5JU1RSSU5HX1VURjhfTEFSR0VfTEVOR1RIOgogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSAocmVhZCgpIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgKHJlYWQoKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpOwogICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9IGxlbmd0aCArIEVuY29kaW5nQ29uc3RhbnRzLk9DVEVUX1NUUklOR19MRU5HVEhfNVRIX0JJVF9NRURJVU1fTElNSVQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtODU2LDIwICs4NzMsMjAgQEAKICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gU21hbGwgbGVuZ3RoCisgICAgICAgICAgICAgICAgLy8gU21hbGwgbGVuZ3RoCiAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gMjsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8vIE1lZGl1bSBsZW5ndGgKKyAgICAgICAgICAgICAgICAvLyBNZWRpdW0gbGVuZ3RoCiAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gcmVhZCgpICsgRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX1NNQUxMX0xJTUlUOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gTGFyZ2UgbGVuZ3RoCisgICAgICAgICAgICAgICAgLy8gTGFyZ2UgbGVuZ3RoCiAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gKHJlYWQoKSA8PCAyNCkgfAotICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICByZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggKz0gRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX01FRElVTV9MSU1JVDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtOTAyLDkgKzkxOSw5IEBACiAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5JU1RSSU5HX0xBUkdFX0xFTkdUSDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gKHJlYWQoKSA8PCAyNCkgfAotICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICByZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSBsZW5ndGggKyBFbmNvZGluZ0NvbnN0YW50cy5PQ1RFVF9TVFJJTkdfTEVOR1RIXzJORF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzID0gKF9zdHJpbmdJbnRlcm5pbmcpID8gZGVjb2RlVXRmOFN0cmluZ0FzU3RyaW5nKCkuaW50ZXJuKCkgOiBkZWNvZGVVdGY4U3RyaW5nQXNTdHJpbmcoKTsKICAgICAgICAgICAgICAgICBfaWRlbnRpZmllciA9IHRhYmxlLmFkZChzKSAtIDE7CkBAIC05MTUsMTEgKzkzMiwxMSBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZS5fYXJyYXlbX2lkZW50aWZpZXJdOwogICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuSVNUUklOR19JTkRFWF9NRURJVU06CiAgICAgICAgICAgICAgICAgX2lkZW50aWZpZXIgPSAoKChiICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX01FRElVTV9NQVNLKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfU01BTExfTElNSVQ7CisgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfU01BTExfTElNSVQ7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLl9hcnJheVtfaWRlbnRpZmllcl07CiAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5JU1RSSU5HX0lOREVYX0xBUkdFOgogICAgICAgICAgICAgICAgIF9pZGVudGlmaWVyID0gKCgoYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9MQVJHRV9NQVNLKSA8PCAxNikgfCAocmVhZCgpIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9NRURJVU1fTElNSVQ7CisgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZS5fYXJyYXlbX2lkZW50aWZpZXJdOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UuZGVjb2RpbmdJZGVudGlmeWluZ1N0cmluZyIpKTsKQEAgLTk4Nyw5ICsxMDA0LDkgQEAKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfTEFSR0VfTEVOR1RIOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSAocmVhZCgpIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgKHJlYWQoKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpOwogICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9IGxlbmd0aCArIEVuY29kaW5nQ29uc3RhbnRzLk9DVEVUX1NUUklOR19MRU5HVEhfMk5EX0JJVF9NRURJVU1fTElNSVQ7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSAoX3N0cmluZ0ludGVybmluZykgPyBkZWNvZGVVdGY4U3RyaW5nQXNTdHJpbmcoKS5pbnRlcm4oKSA6IGRlY29kZVV0ZjhTdHJpbmdBc1N0cmluZygpOwogICAgICAgICAgICAgICAgIF9wcmVmaXhJbmRleCA9IF92LnByZWZpeC5hZGQocyk7CkBAIC05OTksNyArMTAxNiw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZU5hbWVQcmVzZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIF9wcmVmaXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIC8vIFBlYWsgYXQgbmV4dCBieXRlIGFuZCBjaGVjayB0aGUgaW5kZXggb2YgdGhlIFhNTCBuYW1lc3BhY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICBpZiAoRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfUFJFRklYX05BTUVTUEFDRVtwZWFrKCldCisgICAgICAgICAgICAgICAgICAgIGlmIChEZWNvZGVyU3RhdGVUYWJsZXMuSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFW3BlZWsoKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBEZWNvZGVyU3RhdGVUYWJsZXMuSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFX0lOREVYX1pFUk8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS53cm9uZ05hbWVzcGFjZU5hbWUiKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEwMTIsMTEgKzEwMjksMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gX3YucHJlZml4Ll9hcnJheVtfcHJlZml4SW5kZXggLSAxXTsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfSU5ERVhfTUVESVVNOgogICAgICAgICAgICAgICAgIF9wcmVmaXhJbmRleCA9ICgoKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX01BU0spIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9TTUFMTF9MSU1JVDsKKyAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9TTUFMTF9MSU1JVDsKICAgICAgICAgICAgICAgICByZXR1cm4gX3YucHJlZml4Ll9hcnJheVtfcHJlZml4SW5kZXggLSAxXTsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfSU5ERVhfTEFSR0U6CiAgICAgICAgICAgICAgICAgX3ByZWZpeEluZGV4ID0gKCgoYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9MQVJHRV9NQVNLKSA8PCAxNikgfCAocmVhZCgpIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9NRURJVU1fTElNSVQ7CisgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgICAgIHJldHVybiBfdi5wcmVmaXguX2FycmF5W19wcmVmaXhJbmRleCAtIDFdOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UuZGVjb2RpbmdJZGVudGlmeWluZ1N0cmluZ0ZvclByZWZpeCIpKTsKQEAgLTEwMzMsNyArMTA1MCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZU5hbWVQcmVzZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIF9wcmVmaXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIC8vIFBlYWsgYXQgbmV4dCBieXRlIGFuZCBjaGVjayB0aGUgaW5kZXggb2YgdGhlIFhNTCBuYW1lc3BhY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICBpZiAoRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfUFJFRklYX05BTUVTUEFDRVtwZWFrKCldCisgICAgICAgICAgICAgICAgICAgIGlmIChEZWNvZGVyU3RhdGVUYWJsZXMuSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFW3BlZWsoKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBEZWNvZGVyU3RhdGVUYWJsZXMuSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFX0lOREVYX1pFUk8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS53cm9uZ05hbWVzcGFjZU5hbWUiKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEwNDYsMTEgKzEwNjMsMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gX3YucHJlZml4Ll9hcnJheVtfcHJlZml4SW5kZXggLSAxXTsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfSU5ERVhfTUVESVVNOgogICAgICAgICAgICAgICAgIF9wcmVmaXhJbmRleCA9ICgoKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX01BU0spIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9TTUFMTF9MSU1JVDsKKyAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9TTUFMTF9MSU1JVDsKICAgICAgICAgICAgICAgICByZXR1cm4gX3YucHJlZml4Ll9hcnJheVtfcHJlZml4SW5kZXggLSAxXTsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfSU5ERVhfTEFSR0U6CiAgICAgICAgICAgICAgICAgX3ByZWZpeEluZGV4ID0gKCgoYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9MQVJHRV9NQVNLKSA8PCAxNikgfCAocmVhZCgpIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9NRURJVU1fTElNSVQ7CisgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgICAgIHJldHVybiBfdi5wcmVmaXguX2FycmF5W19wcmVmaXhJbmRleCAtIDFdOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UuZGVjb2RpbmdJZGVudGlmeWluZ1N0cmluZ0ZvclByZWZpeCIpKTsKQEAgLTEwNzksNyArMTA5Niw3IEBACiAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gRW5jb2RpbmdDb25zdGFudHMuWE1MTlNfTkFNRVNQQUNFX05BTUVfTEVOR1RIOwogICAgICAgICAgICAgICAgIGRlY29kZVV0ZjhTdHJpbmdBc0NoYXJCdWZmZXIoKTsKIAotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlQ2hhcnNXaXRoQ2hhckJ1ZmZlckZyb21FbmRUb1N0YXJ0KEVuY29kaW5nQ29uc3RhbnRzLlhNTE5TX05BTUVTUEFDRV9OQU1FX0NIQVJTKSkgeworICAgICAgICAgICAgICAgIGlmIChjb21wYXJlQ2hhcnNXaXRoQ2hhckJ1ZmZlckZyb21FbmRUb1N0YXJ0KFhNTE5TX05BTUVTUEFDRV9OQU1FX0NIQVJTKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UueG1sbnNDb25ub3RCZUJvdW5kVG9QcmVmaXgiKSk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xMDkzLDcgKzExMTAsNyBAQAogICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9IEVuY29kaW5nQ29uc3RhbnRzLlhNTF9OQU1FU1BBQ0VfTkFNRV9MRU5HVEg7CiAgICAgICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0FzQ2hhckJ1ZmZlcigpOwogCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVDaGFyc1dpdGhDaGFyQnVmZmVyRnJvbUVuZFRvU3RhcnQoRW5jb2RpbmdDb25zdGFudHMuWE1MX05BTUVTUEFDRV9OQU1FX0NIQVJTKSkgeworICAgICAgICAgICAgICAgIGlmIChjb21wYXJlQ2hhcnNXaXRoQ2hhckJ1ZmZlckZyb21FbmRUb1N0YXJ0KFhNTF9OQU1FU1BBQ0VfTkFNRV9DSEFSUykpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLmlsbGVnYWxOYW1lc3BhY2VOYW1lIikpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTExMiw5ICsxMTI5LDkgQEAKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfTEFSR0VfTEVOR1RIOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSAocmVhZCgpIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgKHJlYWQoKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpOwogICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9IGxlbmd0aCArIEVuY29kaW5nQ29uc3RhbnRzLk9DVEVUX1NUUklOR19MRU5HVEhfMk5EX0JJVF9NRURJVU1fTElNSVQ7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSAoX3N0cmluZ0ludGVybmluZykgPyBkZWNvZGVVdGY4U3RyaW5nQXNTdHJpbmcoKS5pbnRlcm4oKSA6IGRlY29kZVV0ZjhTdHJpbmdBc1N0cmluZygpOwogICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VOYW1lSW5kZXggPSBfdi5uYW1lc3BhY2VOYW1lLmFkZChzKTsKQEAgLTExMzIsMTEgKzExNDksMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gX3YubmFtZXNwYWNlTmFtZS5fYXJyYXlbX25hbWVzcGFjZU5hbWVJbmRleCAtIDFdOwogICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuSVNUUklOR19JTkRFWF9NRURJVU06CiAgICAgICAgICAgICAgICAgX25hbWVzcGFjZU5hbWVJbmRleCA9ICgoKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX01BU0spIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9TTUFMTF9MSU1JVDsKKyAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9TTUFMTF9MSU1JVDsKICAgICAgICAgICAgICAgICByZXR1cm4gX3YubmFtZXNwYWNlTmFtZS5fYXJyYXlbX25hbWVzcGFjZU5hbWVJbmRleCAtIDFdOwogICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuSVNUUklOR19JTkRFWF9MQVJHRToKICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlTmFtZUluZGV4ID0gKCgoYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9MQVJHRV9NQVNLKSA8PCAxNikgfCAocmVhZCgpIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9NRURJVU1fTElNSVQ7CisgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgICAgIHJldHVybiBfdi5uYW1lc3BhY2VOYW1lLl9hcnJheVtfbmFtZXNwYWNlTmFtZUluZGV4IC0gMV07CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5kZWNvZGluZ0Zvck5hbWVzcGFjZU5hbWUiKSk7CkBAIC0xMTYxLDExICsxMTc4LDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIF92Lm5hbWVzcGFjZU5hbWUuX2FycmF5W19uYW1lc3BhY2VOYW1lSW5kZXggLSAxXTsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfSU5ERVhfTUVESVVNOgogICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VOYW1lSW5kZXggPSAoKChiICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX01FRElVTV9NQVNLKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfU01BTExfTElNSVQ7CisgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfU01BTExfTElNSVQ7CiAgICAgICAgICAgICAgICAgcmV0dXJuIF92Lm5hbWVzcGFjZU5hbWUuX2FycmF5W19uYW1lc3BhY2VOYW1lSW5kZXggLSAxXTsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfSU5ERVhfTEFSR0U6CiAgICAgICAgICAgICAgICAgX25hbWVzcGFjZU5hbWVJbmRleCA9ICgoKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTEFSR0VfTUFTSykgPDwgMTYpIHwgKHJlYWQoKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX0xJTUlUOworICAgICAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX01FRElVTV9MSU1JVDsKICAgICAgICAgICAgICAgICByZXR1cm4gX3YubmFtZXNwYWNlTmFtZS5fYXJyYXlbX25hbWVzcGFjZU5hbWVJbmRleCAtIDFdOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UuZGVjb2RpbmdGb3JOYW1lc3BhY2VOYW1lIikpOwpAQCAtMTIxMyw5ICsxMjMwLDkgQEAKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfTEFSR0VfTEVOR1RIOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSAocmVhZCgpIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgKHJlYWQoKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpOwogICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9IGxlbmd0aCArIEVuY29kaW5nQ29uc3RhbnRzLk9DVEVUX1NUUklOR19MRU5HVEhfMk5EX0JJVF9NRURJVU1fTElNSVQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMjM3LDEwICsxMjU0LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGIgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfU01BTExfTUFTSzsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfSU5ERVhfTUVESVVNOgogICAgICAgICAgICAgICAgIHJldHVybiAoKChiICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX01FRElVTV9NQVNLKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfU01BTExfTElNSVQ7CisgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfU01BTExfTElNSVQ7CiAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5JU1RSSU5HX0lOREVYX0xBUkdFOgogICAgICAgICAgICAgICAgIHJldHVybiAoKChiICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX0xBUkdFX01BU0spIDw8IDE2KSB8IChyZWFkKCkgPDwgOCkgfCByZWFkKCkpCi0gICAgICAgICAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX01FRElVTV9MSU1JVDsKKyAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9NRURJVU1fTElNSVQ7CiAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5JU1RSSU5HX1NNQUxMX0xFTkdUSDoKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfTUVESVVNX0xFTkdUSDoKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLklTVFJJTkdfTEFSR0VfTEVOR1RIOgpAQCAtMTI2Miw3ICsxMjc5LDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChfaWRlbnRpZmllciA+PSBFbmNvZGluZ0NvbnN0YW50cy5SRVNUUklDVEVEX0FMUEhBQkVUX0FQUExJQ0FUSU9OX1NUQVJUKSB7CiAgICAgICAgICAgICBDaGFyQXJyYXkgY2EgPSBfdi5yZXN0cmljdGVkQWxwaGFiZXQuZ2V0KF9pZGVudGlmaWVyIC0gRW5jb2RpbmdDb25zdGFudHMuUkVTVFJJQ1RFRF9BTFBIQUJFVF9BUFBMSUNBVElPTl9TVEFSVCk7CiAgICAgICAgICAgICBpZiAoY2EgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5hbHBoYWJldE5vdFByZXNlbnQiLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoX2lkZW50aWZpZXIpfSkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5hbHBoYWJldE5vdFByZXNlbnQiLCBuZXcgT2JqZWN0W117SW50ZWdlci52YWx1ZU9mKF9pZGVudGlmaWVyKX0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlY29kZUFscGhhYmV0T2N0ZXRzQXNDaGFyQnVmZmVyKGNhLmNoKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEyNzksMTMgKzEyOTYsMTMgQEAKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGRlY29kZVJBT2N0ZXRzQXNTdHJpbmcoY2hhcltdIHJlc3RyaWN0ZWRBbHBoYWJldCkgdGhyb3dzIEZhc3RJbmZvc2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGRlY29kZUFscGhhYmV0T2N0ZXRzQXNDaGFyQnVmZmVyKG51bGwpOworICAgICAgICBkZWNvZGVBbHBoYWJldE9jdGV0c0FzQ2hhckJ1ZmZlcihyZXN0cmljdGVkQWxwaGFiZXQpOwogICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhfY2hhckJ1ZmZlciwgMCwgX2NoYXJCdWZmZXJMZW5ndGgpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRlY29kZUZvdXJCaXRBbHBoYWJldE9jdGV0c0FzQ2hhckJ1ZmZlcihjaGFyW10gcmVzdHJpY3RlZEFscGhhYmV0KSB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgX2NoYXJCdWZmZXJMZW5ndGggPSAwOwotICAgICAgICBmaW5hbCBpbnQgY2hhcmFjdGVycyA9IF9vY3RldEJ1ZmZlckxlbmd0aCAvIDI7CisgICAgICAgIGZpbmFsIGludCBjaGFyYWN0ZXJzID0gX29jdGV0QnVmZmVyTGVuZ3RoICogMjsKICAgICAgICAgaWYgKF9jaGFyQnVmZmVyLmxlbmd0aCA8IGNoYXJhY3RlcnMpIHsKICAgICAgICAgICAgIF9jaGFyQnVmZmVyID0gbmV3IGNoYXJbY2hhcmFjdGVyc107CiAgICAgICAgIH0KQEAgLTEzNjQsNiArMTM4MSwxMSBAQAogICAgICAgICBkZWNvZGVVdGY4U3RyaW5nSW50b0NoYXJCdWZmZXIoKTsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBkZWNvZGVVdGY4U3RyaW5nQXNDaGFyQnVmZmVyKGNoYXJbXSBjaCwgaW50IG9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW5zdXJlT2N0ZXRCdWZmZXJTaXplKCk7CisgICAgICAgIGRlY29kZVV0ZjhTdHJpbmdJbnRvQ2hhckJ1ZmZlcihjaCwgb2Zmc2V0KTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGRlY29kZVV0ZjhTdHJpbmdBc1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGRlY29kZVV0ZjhTdHJpbmdBc0NoYXJCdWZmZXIoKTsKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoX2NoYXJCdWZmZXIsIDAsIF9jaGFyQnVmZmVyTGVuZ3RoKTsKQEAgLTE0NDAsNiArMTQ2MiwyMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZGVjb2RlVXRmOFN0cmluZ0ludG9DaGFyQnVmZmVyKGNoYXJbXSBjaCwgaW50IG9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX2NoYXJCdWZmZXJMZW5ndGggPSBvZmZzZXQ7CisgICAgICAgIGZpbmFsIGludCBlbmQgPSBfb2N0ZXRCdWZmZXJMZW5ndGggKyBfb2N0ZXRCdWZmZXJPZmZzZXQ7CisgICAgICAgIGludCBiMTsKKyAgICAgICAgd2hpbGUgKGVuZCAhPSBfb2N0ZXRCdWZmZXJPZmZzZXQpIHsKKyAgICAgICAgICAgIGIxID0gX29jdGV0QnVmZmVyW19vY3RldEJ1ZmZlck9mZnNldCsrXSAmIDB4RkY7CisgICAgICAgICAgICBpZiAoRGVjb2RlclN0YXRlVGFibGVzLlVURjhbYjFdID09IERlY29kZXJTdGF0ZVRhYmxlcy5VVEY4X09ORV9CWVRFKSB7CisgICAgICAgICAgICAgICAgY2hbX2NoYXJCdWZmZXJMZW5ndGgrK10gPSAoY2hhcikgYjE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlY29kZVR3b1RvRm91ckJ5dGVVdGY4Q2hhcmFjdGVyKGNoLCBiMSwgZW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfY2hhckJ1ZmZlckxlbmd0aCAtPSBvZmZzZXQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGRlY29kZVR3b1RvRm91ckJ5dGVVdGY4Q2hhcmFjdGVyKGludCBiMSwgaW50IGVuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKERlY29kZXJTdGF0ZVRhYmxlcy5VVEY4W2IxXSkgewogICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuVVRGOF9UV09fQllURVM6CkBAIC0xNDU3LDE4ICsxNDk0LDE4IEBACiAgICAgICAgICAgICAgICAgLy8gc2luY2UgYSBjaGFyYWN0ZXIgZW5jb2RlZCBpbiB0d28gYnl0ZXMgd2lsbCBiZSBpbiB0aGUKICAgICAgICAgICAgICAgICAvLyByYW5nZSBbMHg4MCwgMHgxRkZGXQogICAgICAgICAgICAgICAgIF9jaGFyQnVmZmVyW19jaGFyQnVmZmVyTGVuZ3RoKytdID0gKGNoYXIpICgKLSAgICAgICAgICAgICAgICAgICAgKChiMSAmIDB4MUYpIDw8IDYpCi0gICAgICAgICAgICAgICAgICAgIHwgKGIyICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICAgICAgKChiMSAmIDB4MUYpIDw8IDYpCisgICAgICAgICAgICAgICAgICAgICAgICB8IChiMiAmIDB4M0YpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLlVURjhfVEhSRUVfQllURVM6CiAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBjID0gZGVjb2RlVXRmOFRocmVlQnl0ZUNoYXIoZW5kLCBiMSk7CiAgICAgICAgICAgICAgICAgaWYgKFhNTENoYXIuaXNDb250ZW50KGMpKSB7CiAgICAgICAgICAgICAgICAgICAgIF9jaGFyQnVmZmVyW19jaGFyQnVmZmVyTGVuZ3RoKytdID0gYzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0lsbGVnYWxTdGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLlVURjhfRk9VUl9CWVRFUzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3VwcGxlbWVudGFsID0gZGVjb2RlVXRmOEZvdXJCeXRlQ2hhcihlbmQsIGIxKTsKQEAgLTE0ODUsNiArMTUyMiw1MSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGRlY29kZVR3b1RvRm91ckJ5dGVVdGY4Q2hhcmFjdGVyKGNoYXIgY2hbXSwgaW50IGIxLCBpbnQgZW5kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzd2l0Y2goRGVjb2RlclN0YXRlVGFibGVzLlVURjhbYjFdKSB7CisgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5VVEY4X1RXT19CWVRFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgYnl0ZSAyCisgICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBfb2N0ZXRCdWZmZXJPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0xlbmd0aFRvb1NtYWxsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIGludCBiMiA9IF9vY3RldEJ1ZmZlcltfb2N0ZXRCdWZmZXJPZmZzZXQrK10gJiAweEZGOworICAgICAgICAgICAgICAgIGlmICgoYjIgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZVV0ZjhTdHJpbmdJbGxlZ2FsU3RhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDaGFyYWN0ZXIgZ3VhcmFudGVlZCB0byBiZSBpbiBbMHgyMCwgMHhEN0ZGXSByYW5nZQorICAgICAgICAgICAgICAgIC8vIHNpbmNlIGEgY2hhcmFjdGVyIGVuY29kZWQgaW4gdHdvIGJ5dGVzIHdpbGwgYmUgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gcmFuZ2UgWzB4ODAsIDB4MUZGRl0KKyAgICAgICAgICAgICAgICBjaFtfY2hhckJ1ZmZlckxlbmd0aCsrXSA9IChjaGFyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAoKGIxICYgMHgxRikgPDwgNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGIyICYgMHgzRikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuVVRGOF9USFJFRV9CWVRFUzoKKyAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSBkZWNvZGVVdGY4VGhyZWVCeXRlQ2hhcihlbmQsIGIxKTsKKyAgICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0NvbnRlbnQoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hbX2NoYXJCdWZmZXJMZW5ndGgrK10gPSBjOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZVV0ZjhTdHJpbmdJbGxlZ2FsU3RhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5VVEY4X0ZPVVJfQllURVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHN1cHBsZW1lbnRhbCA9IGRlY29kZVV0ZjhGb3VyQnl0ZUNoYXIoZW5kLCBiMSk7CisgICAgICAgICAgICAgICAgaWYgKFhNTENoYXIuaXNDb250ZW50KHN1cHBsZW1lbnRhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hbX2NoYXJCdWZmZXJMZW5ndGgrK10gPSBfdXRmOF9oaWdoU3Vycm9nYXRlOworICAgICAgICAgICAgICAgICAgICBjaFtfY2hhckJ1ZmZlckxlbmd0aCsrXSA9IF91dGY4X2xvd1N1cnJvZ2F0ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVVdGY4U3RyaW5nSWxsZWdhbFN0YXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBkZWNvZGVVdGY4U3RyaW5nSWxsZWdhbFN0YXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBkZWNvZGVVdGY4TkNOYW1lSW50b0NoYXJCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBfY2hhckJ1ZmZlckxlbmd0aCA9IDA7CiAgICAgICAgIGlmIChfY2hhckJ1ZmZlci5sZW5ndGggPCBfb2N0ZXRCdWZmZXJMZW5ndGgpIHsKQEAgLTE1MjQsMjAgKzE2MDYsMTkgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSAoY2hhcikgKAotICAgICAgICAgICAgICAgICAgICAoKGIxICYgMHgxRikgPDwgNikKLSAgICAgICAgICAgICAgICAgICAgfCAoYjIgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKGIxICYgMHgxRikgPDwgNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGIyICYgMHgzRikpOwogICAgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTkNOYW1lU3RhcnQoYykpIHsKICAgICAgICAgICAgICAgICAgICAgX2NoYXJCdWZmZXJbX2NoYXJCdWZmZXJMZW5ndGgrK10gPSBjOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBkZWNvZGVVdGY4TkNOYW1lSWxsZWdhbFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuVVRGOF9USFJFRV9CWVRFUzoKICAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSBkZWNvZGVVdGY4VGhyZWVCeXRlQ2hhcihlbmQsIGIxKTsKICAgICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc05DTmFtZVN0YXJ0KGMpKSB7CiAgICAgICAgICAgICAgICAgICAgIF9jaGFyQnVmZmVyW19jaGFyQnVmZmVyTGVuZ3RoKytdID0gYzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXRmOE5DTmFtZUlsbGVnYWxTdGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE1NzQsMjAgKzE2NTUsMTkgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSAoY2hhcikgKAotICAgICAgICAgICAgICAgICAgICAoKGIxICYgMHgxRikgPDwgNikKLSAgICAgICAgICAgICAgICAgICAgfCAoYjIgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKGIxICYgMHgxRikgPDwgNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGIyICYgMHgzRikpOwogICAgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTkNOYW1lKGMpKSB7CiAgICAgICAgICAgICAgICAgICAgIF9jaGFyQnVmZmVyW19jaGFyQnVmZmVyTGVuZ3RoKytdID0gYzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXRmOE5DTmFtZUlsbGVnYWxTdGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLlVURjhfVEhSRUVfQllURVM6CiAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBjID0gZGVjb2RlVXRmOFRocmVlQnl0ZUNoYXIoZW5kLCBiMSk7CiAgICAgICAgICAgICAgICAgaWYgKFhNTENoYXIuaXNOQ05hbWUoYykpIHsKICAgICAgICAgICAgICAgICAgICAgX2NoYXJCdWZmZXJbX2NoYXJCdWZmZXJMZW5ndGgrK10gPSBjOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBkZWNvZGVVdGY4TkNOYW1lSWxsZWdhbFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTYxNSw4ICsxNjk1LDggQEAKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgYjIgPSBfb2N0ZXRCdWZmZXJbX29jdGV0QnVmZmVyT2Zmc2V0KytdICYgMHhGRjsKICAgICAgICAgaWYgKChiMiAmIDB4QzApICE9IDB4ODAKLSAgICAgICAgICAgIHx8IChiMSA9PSAweEVEICYmIGIyID49IDB4QTApCi0gICAgICAgICAgICB8fCAoKGIxICYgMHgwRikgPT0gMCAmJiAoYjIgJiAweDIwKSA9PSAwKSkgeworICAgICAgICAgICAgICAgIHx8IChiMSA9PSAweEVEICYmIGIyID49IDB4QTApCisgICAgICAgICAgICAgICAgfHwgKChiMSAmIDB4MEYpID09IDAgJiYgKGIyICYgMHgyMCkgPT0gMCkpIHsKICAgICAgICAgICAgIGRlY29kZVV0ZjhTdHJpbmdJbGxlZ2FsU3RhdGUoKTsKICAgICAgICAgfQogCkBAIC0xNjMwLDkgKzE3MTAsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIChjaGFyKSAoCi0gICAgICAgICAgICAoYjEgJiAweDBGKSA8PCAxMgotICAgICAgICAgICAgfCAoYjIgJiAweDNGKSA8PCA2Ci0gICAgICAgICAgICB8IChiMyAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAoYjEgJiAweDBGKSA8PCAxMgorICAgICAgICAgICAgICAgIHwgKGIyICYgMHgzRikgPDwgNgorICAgICAgICAgICAgICAgIHwgKGIzICYgMHgzRikpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2hhciBfdXRmOF9oaWdoU3Vycm9nYXRlOwpAQCAtMTY0NSw3ICsxNzI1LDcgQEAKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgYjIgPSBfb2N0ZXRCdWZmZXJbX29jdGV0QnVmZmVyT2Zmc2V0KytdICYgMHhGRjsKICAgICAgICAgaWYgKChiMiAmIDB4QzApICE9IDB4ODAKLSAgICAgICAgICAgIHx8ICgoYjIgJiAweDMwKSA9PSAwICYmIChiMSAmIDB4MDcpID09IDApKSB7CisgICAgICAgICAgICAgICAgfHwgKChiMiAmIDB4MzApID09IDAgJiYgKGIxICYgMHgwNykgPT0gMCkpIHsKICAgICAgICAgICAgIGRlY29kZVV0ZjhTdHJpbmdJbGxlZ2FsU3RhdGUoKTsKICAgICAgICAgfQogCkBAIC0xNjc0LDggKzE3NTQsOCBAQAogICAgICAgICBmaW5hbCBpbnQgd3d3dyA9IHV1dXV1IC0gMTsKIAogICAgICAgICBfdXRmOF9oaWdoU3Vycm9nYXRlID0gKGNoYXIpICgweEQ4MDAgfAotICAgICAgICAgICAgICgod3d3dyA8PCA2KSAmIDB4MDNDMCkgfCAoKGIyIDw8IDIpICYgMHgwMDNDKSB8Ci0gICAgICAgICAgICAgKChiMyA+PiA0KSAmIDB4MDAwMykpOworICAgICAgICAgICAgICAgICgod3d3dyA8PCA2KSAmIDB4MDNDMCkgfCAoKGIyIDw8IDIpICYgMHgwMDNDKSB8CisgICAgICAgICAgICAgICAgKChiMyA+PiA0KSAmIDB4MDAwMykpOwogICAgICAgICBfdXRmOF9sb3dTdXJyb2dhdGUgPSAoY2hhcikgKDB4REMwMCB8ICgoYjMgPDwgNikgJiAweDAzQzApIHwgKGI0ICYgMHgwMDNGKSk7CiAKICAgICAgICAgcmV0dXJuIFhNTENoYXIuc3VwcGxlbWVudGFsKF91dGY4X2hpZ2hTdXJyb2dhdGUsIF91dGY4X2xvd1N1cnJvZ2F0ZSk7CkBAIC0xNzM4LDEwICsxODE4LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHBlYWsoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNsb3NlSWZSZXF1aXJlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfcyAhPSBudWxsICYmIF9uZWVkRm9yY2VTdHJlYW1DbG9zZSkgeworICAgICAgICAgICAgX3MuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcGVlaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwZWVrKG51bGwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcGVlayhPY3RldEJ1ZmZlckxpc3RlbmVyIG9jdGV0QnVmZmVyTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChfb2N0ZXRCdWZmZXJPZmZzZXQgPCBfb2N0ZXRCdWZmZXJFbmQpIHsKICAgICAgICAgICAgIHJldHVybiBfb2N0ZXRCdWZmZXJbX29jdGV0QnVmZmVyT2Zmc2V0XSAmIDB4RkY7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob2N0ZXRCdWZmZXJMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb2N0ZXRCdWZmZXJMaXN0ZW5lci5vbkJlZm9yZU9jdGV0QnVmZmVyT3ZlcndyaXRlKCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckVuZCA9IF9zLnJlYWQoX29jdGV0QnVmZmVyKTsKICAgICAgICAgICAgIGlmIChfb2N0ZXRCdWZmZXJFbmQgPCAwKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5FT0YiKSk7CkBAIC0xNzUyLDYgKzE4NDYsMzAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcGVlazIoT2N0ZXRCdWZmZXJMaXN0ZW5lciBvY3RldEJ1ZmZlckxpc3RlbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoX29jdGV0QnVmZmVyT2Zmc2V0ICsgMSA8IF9vY3RldEJ1ZmZlckVuZCkgeworICAgICAgICAgICAgcmV0dXJuIF9vY3RldEJ1ZmZlcltfb2N0ZXRCdWZmZXJPZmZzZXQgKyAxXSAmIDB4RkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob2N0ZXRCdWZmZXJMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb2N0ZXRCdWZmZXJMaXN0ZW5lci5vbkJlZm9yZU9jdGV0QnVmZmVyT3ZlcndyaXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgaWYgKF9vY3RldEJ1ZmZlck9mZnNldCA8IF9vY3RldEJ1ZmZlckVuZCkgeworICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlclswXSA9IF9vY3RldEJ1ZmZlcltfb2N0ZXRCdWZmZXJPZmZzZXRdOworICAgICAgICAgICAgICAgIG9mZnNldCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfb2N0ZXRCdWZmZXJFbmQgPSBfcy5yZWFkKF9vY3RldEJ1ZmZlciwgb2Zmc2V0LCBfb2N0ZXRCdWZmZXIubGVuZ3RoIC0gb2Zmc2V0KTsKKworICAgICAgICAgICAgaWYgKF9vY3RldEJ1ZmZlckVuZCA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLkVPRiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX29jdGV0QnVmZmVyT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBfb2N0ZXRCdWZmZXJbMV0gJiAweEZGOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJvdGVjdGVkIGNsYXNzIEVuY29kaW5nQWxnb3JpdGhtSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CiAKICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE3NzAsNyArMTg4OCw3IEBACiAgICAgICAgICAgICBpZiAoYiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gYi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKChvZmYgKyBsZW4pID4gYi5sZW5ndGgpIHx8ICgob2ZmICsgbGVuKSA8IDApKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTE3OTQsNyArMTkxMiw3IEBACiAKICAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBfaXNGYXN0SW5mb3NldERvY3VtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gRmlsbCB1cCB0aGUgb2N0ZXQgYnVmZmVyCi0gICAgICAgIHBlYWsoKTsKKyAgICAgICAgcGVlaygpOwogCiAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9IEVuY29kaW5nQ29uc3RhbnRzLkJJTkFSWV9IRUFERVIubGVuZ3RoOwogICAgICAgICBlbnN1cmVPY3RldEJ1ZmZlclNpemUoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0RlY29kZXJTdGF0ZVRhYmxlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvRGVjb2RlclN0YXRlVGFibGVzLmphdmEKaW5kZXggZjcyMGRmNi4uMzZhNWI3YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvRGVjb2RlclN0YXRlVGFibGVzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvRGVjb2RlclN0YXRlVGFibGVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQ7CkBAIC01NDEsMTQgKzUxNCwxNCBAQAogICAgIH07CiAKIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElTVFJJTkdfU01BTExfTEVOR1RIICAgICAgICA9IDA7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSVNUUklOR19NRURJVU1fTEVOR1RIICAgICAgID0gMTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJU1RSSU5HX0xBUkdFX0xFTkdUSCAgICAgICAgPSAyOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElTVFJJTkdfSU5ERVhfU01BTEwgICAgICAgICA9IDM7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSVNUUklOR19JTkRFWF9NRURJVU0gICAgICAgID0gNDsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJU1RSSU5HX0lOREVYX0xBUkdFICAgICAgICAgPSA1OworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBJU1RSSU5HX1NNQUxMX0xFTkdUSCAgICAgICAgPSAwOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBJU1RSSU5HX01FRElVTV9MRU5HVEggICAgICAgPSAxOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBJU1RSSU5HX0xBUkdFX0xFTkdUSCAgICAgICAgPSAyOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBJU1RSSU5HX0lOREVYX1NNQUxMICAgICAgICAgPSAzOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBJU1RSSU5HX0lOREVYX01FRElVTSAgICAgICAgPSA0OworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBJU1RSSU5HX0lOREVYX0xBUkdFICAgICAgICAgPSA1OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBJU1RSSU5HID0gbmV3IGludFsyNTZdOworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludFtdIElTVFJJTkcgPSBuZXcgaW50WzI1Nl07CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXVtdIElTVFJJTkdfUkFOR0VTID0gewogICAgICAgICAvLyAlMDAwMDAwMDAgdG8gJTAwMTExMTExIHNtYWxsIGxlbmd0aApAQCAtNTgwLDEzICs1NTMsMTMgQEAKICAgICB9OwogCiAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJU1RSSU5HX1BSRUZJWF9OQU1FU1BBQ0VfTEVOR1RIXzMgICA9IDY7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFX0xFTkdUSF81ICAgPSA3OwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElTVFJJTkdfUFJFRklYX05BTUVTUEFDRV9MRU5HVEhfMjkgID0gODsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJU1RSSU5HX1BSRUZJWF9OQU1FU1BBQ0VfTEVOR1RIXzM2ICA9IDk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFX0lOREVYX1pFUk8gPSAxMDsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIHN0YXRpYyBpbnQgSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFX0xFTkdUSF8zICAgPSA2OworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBJU1RSSU5HX1BSRUZJWF9OQU1FU1BBQ0VfTEVOR1RIXzUgICA9IDc7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBzdGF0aWMgaW50IElTVFJJTkdfUFJFRklYX05BTUVTUEFDRV9MRU5HVEhfMjkgID0gODsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIHN0YXRpYyBpbnQgSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFX0xFTkdUSF8zNiAgPSA5OworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBJU1RSSU5HX1BSRUZJWF9OQU1FU1BBQ0VfSU5ERVhfWkVSTyA9IDEwOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBJU1RSSU5HX1BSRUZJWF9OQU1FU1BBQ0UgPSBuZXcgaW50WzI1Nl07CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50W10gSVNUUklOR19QUkVGSVhfTkFNRVNQQUNFID0gbmV3IGludFsyNTZdOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W11bXSBJU1RSSU5HX1BSRUZJWF9OQU1FU1BBQ0VfUkFOR0VTID0gewogICAgICAgICAvLyAlMDAwMDAwMDAgdG8gJTAwMDAwMDAxIHNtYWxsIGxlbmd0aApAQCAtNjQ4LDEzICs2MjEsMTMgQEAKICAgICB9OwogCiAgICAgLy8gVVRGLTggc3RhdGVzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVVRGOF9OQ05BTUVfTkNOQU1FICAgICAgICAgPSAwOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVURjhfTkNOQU1FX05DTkFNRV9DSEFSICAgID0gMTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBVVEY4X1RXT19CWVRFUyAgICAgICAgICAgICA9IDI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVVRGOF9USFJFRV9CWVRFUyAgICAgICAgICAgPSAzOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVURjhfRk9VUl9CWVRFUyAgICAgICAgICAgID0gNDsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIHN0YXRpYyBpbnQgVVRGOF9OQ05BTUVfTkNOQU1FICAgICAgICAgPSAwOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBVVEY4X05DTkFNRV9OQ05BTUVfQ0hBUiAgICA9IDE7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBzdGF0aWMgaW50IFVURjhfVFdPX0JZVEVTICAgICAgICAgICAgID0gMjsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIHN0YXRpYyBpbnQgVVRGOF9USFJFRV9CWVRFUyAgICAgICAgICAgPSAzOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc3RhdGljIGludCBVVEY4X0ZPVVJfQllURVMgICAgICAgICAgICA9IDQ7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFVURjhfTkNOQU1FID0gbmV3IGludFsyNTZdOworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludFtdIFVURjhfTkNOQU1FID0gbmV3IGludFsyNTZdOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W11bXSBVVEY4X05DTkFNRV9SQU5HRVMgPSB7CiAKQEAgLTcyNCw5ICs2OTcsOSBAQAogICAgICAgICB7IDB4RkYsIFNUQVRFX0lMTEVHQUwgfQogICAgIH07CiAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBVVEY4X09ORV9CWVRFICAgICAgICAgICAgICA9IDE7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBzdGF0aWMgaW50IFVURjhfT05FX0JZVEUgPSAxOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBVVEY4ID0gbmV3IGludFsyNTZdOworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludFtdIFVURjggPSBuZXcgaW50WzI1Nl07CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXVtdIFVURjhfUkFOR0VTID0gewogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9FbmNvZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9FbmNvZGVyLmphdmEKaW5kZXggODAyN2VhMC4uYjk5ODNkZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvRW5jb2Rlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0VuY29kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwzNyArMjQsOCBAQAogICoKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldDsKIAotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LmFsZ29yaXRobS5CdWlsdEluRW5jb2RpbmdBbGdvcml0aG07CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuYWxnb3JpdGhtLkJ1aWx0SW5FbmNvZGluZ0FsZ29yaXRobUZhY3Rvcnk7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQub3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWwuQ2hhckFycmF5SW50TWFwOwpAQCAtNzIsNiArNDMsOCBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5FeHRlcm5hbFZvY2FidWxhcnk7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5GYXN0SW5mb3NldFNlcmlhbGl6ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LlJlc3RyaWN0ZWRBbHBoYWJldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuVm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YTsKIGltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwogCiAvKioKQEAgLTExMCwxOCArODMsNTcgQEAKICAgICAgKiBEZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzY2hlbWUgc3lzdGVtIHByb3BlcnR5IGZvciB0aGUgZW5jb2RpbmcKICAgICAgKiBvZiBjb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzLgogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIF9jaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZVN5c3RlbURlZmF1bHQgPSBVVEZfODsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBfY2hhcmFjdGVyRW5jb2RpbmdTY2hlbWVTeXN0ZW1EZWZhdWx0ID0gZ2V0RGVmYXVsdEVuY29kaW5nU2NoZW1lKCk7CiAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBJbml0aWF0ZSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2NoZW1hIGZyb20gdGhlIHN5c3RlbQotICAgICAgICAvLyBwcm9wZXJ0eQorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RW5jb2RpbmdTY2hlbWUoKSB7CiAgICAgICAgIFN0cmluZyBwID0gU3lzdGVtLmdldFByb3BlcnR5KENIQVJBQ1RFUl9FTkNPRElOR19TQ0hFTUVfU1lTVEVNX1BST1BFUlRZLAotICAgICAgICAgICAgX2NoYXJhY3RlckVuY29kaW5nU2NoZW1lU3lzdGVtRGVmYXVsdCk7CisgICAgICAgICAgICBVVEZfOCk7CiAgICAgICAgIGlmIChwLmVxdWFscyhVVEZfMTZCRSkpIHsKLSAgICAgICAgICAgIF9jaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZVN5c3RlbURlZmF1bHQgPSBVVEZfMTZCRTsKKyAgICAgICAgICAgIHJldHVybiBVVEZfMTZCRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBVVEZfODsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCBzdGF0aWMgaW50W10gTlVNRVJJQ19DSEFSQUNURVJTX1RBQkxFOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBpbnRbXSBEQVRFX1RJTUVfQ0hBUkFDVEVSU19UQUJMRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIE5VTUVSSUNfQ0hBUkFDVEVSU19UQUJMRSA9IG5ldyBpbnRbbWF4Q2hhcmFjdGVyKFJlc3RyaWN0ZWRBbHBoYWJldC5OVU1FUklDX0NIQVJBQ1RFUlMpICsgMV07CisgICAgICAgIERBVEVfVElNRV9DSEFSQUNURVJTX1RBQkxFID0gbmV3IGludFttYXhDaGFyYWN0ZXIoUmVzdHJpY3RlZEFscGhhYmV0LkRBVEVfVElNRV9DSEFSQUNURVJTKSArIDFdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNRVJJQ19DSEFSQUNURVJTX1RBQkxFLmxlbmd0aCA7IGkrKykgeworICAgICAgICAgICAgTlVNRVJJQ19DSEFSQUNURVJTX1RBQkxFW2ldID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBEQVRFX1RJTUVfQ0hBUkFDVEVSU19UQUJMRS5sZW5ndGggOyBpKyspIHsKKyAgICAgICAgICAgIERBVEVfVElNRV9DSEFSQUNURVJTX1RBQkxFW2ldID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJlc3RyaWN0ZWRBbHBoYWJldC5OVU1FUklDX0NIQVJBQ1RFUlMubGVuZ3RoKCkgOyBpKyspIHsKKyAgICAgICAgICAgIE5VTUVSSUNfQ0hBUkFDVEVSU19UQUJMRVtSZXN0cmljdGVkQWxwaGFiZXQuTlVNRVJJQ19DSEFSQUNURVJTLmNoYXJBdChpKV0gPSBpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUmVzdHJpY3RlZEFscGhhYmV0LkRBVEVfVElNRV9DSEFSQUNURVJTLmxlbmd0aCgpIDsgaSsrKSB7CisgICAgICAgICAgICBEQVRFX1RJTUVfQ0hBUkFDVEVSU19UQUJMRVtSZXN0cmljdGVkQWxwaGFiZXQuREFURV9USU1FX0NIQVJBQ1RFUlMuY2hhckF0KGkpXSA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF4Q2hhcmFjdGVyKFN0cmluZyBhbHBoYWJldCkgeworICAgICAgICBpbnQgYyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFiZXQubGVuZ3RoKCkgOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjIDwgYWxwaGFiZXQuY2hhckF0KGkpKSB7CisgICAgICAgICAgICAgICAgYyA9IGFscGhhYmV0LmNoYXJBdChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgRFREIGFuZCBpbnRlcm5hbCBzdWJzZXQgc2hhbGwgYmUgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gX2lnbm9yZURURDsKKwogICAgIC8qKgogICAgICAqIFRydWUgaWYgY29tbWVudHMgc2hhbGwgYmUgaWdub3JlZC4KICAgICAgKi8KQEAgLTE3Myw2ICsxODUsMTEgQEAKICAgICBwcm90ZWN0ZWQgU2VyaWFsaXplclZvY2FidWxhcnkgX3Y7CiAKICAgICAvKioKKyAgICAgKiBUaGUgdm9jYWJ1bGFyeSBhcHBsaWNhdGlvbiBkYXRhIHRoYXQgaXMgdXNlZCBieSB0aGUgZW5jb2RlcgorICAgICAqLworICAgIHByb3RlY3RlZCBWb2NhYnVsYXJ5QXBwbGljYXRpb25EYXRhIF92RGF0YTsKKworICAgIC8qKgogICAgICAqIFRydWUgaWYgdGhlIHZvY3VidWxhcnkgaXMgaW50ZXJuYWwgdG8gdGhlIGVuY29kZXIKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gX3ZJc0ludGVybmFsOwpAQCAtMjI0LDEyICsyNDEsMjMgQEAKICAgICBwcm90ZWN0ZWQgaW50IGF0dHJpYnV0ZVZhbHVlU2l6ZUNvbnN0cmFpbnQgPSBGYXN0SW5mb3NldFNlcmlhbGl6ZXIuQVRUUklCVVRFX1ZBTFVFX1NJWkVfQ09OU1RSQUlOVDsKIAogICAgIC8qKgorICAgICAqIFRoZSBsaW1pdCBvbiB0aGUgc2l6ZSBvZiBpbmRleGVkIE1hcCBmb3IgYXR0cmlidXRlIHZhbHVlcworICAgICAqIExpbWl0IGlzIG1lYXN1cmVkIGluIGNoYXJhY3RlcnMgbnVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBhdHRyaWJ1dGVWYWx1ZU1hcFRvdGFsQ2hhcmFjdGVyc0NvbnN0cmFpbnQgPSBGYXN0SW5mb3NldFNlcmlhbGl6ZXIuQVRUUklCVVRFX1ZBTFVFX01BUF9NRU1PUllfQ09OU1RSQUlOVCAvIDI7CisKKyAgICAvKioKICAgICAgKiBUaGUgbGltaXQgb24gdGhlIHNpemUgb2YgY2hhcmFjdGVyIGNvbnRlbnQgY2h1bmtzCiAgICAgICogb2YgQ2hhcmFjdGVyIEluZm9ybWF0aW9uIEl0ZW1zIG9yIENvbW1lbnQgSW5mb3JtYXRpb24gSXRlbXMgdGhhdAogICAgICAqIHdpbGwgYmUgaW5kZXhlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGNoYXJhY3RlckNvbnRlbnRDaHVua1NpemVDb250cmFpbnQgPSBGYXN0SW5mb3NldFNlcmlhbGl6ZXIuQ0hBUkFDVEVSX0NPTlRFTlRfQ0hVTktfU0laRV9DT05TVFJBSU5UOwogCisgICAgLyoqCisgICAgICogVGhlIGxpbWl0IG9uIHRoZSBzaXplIG9mIGluZGV4ZWQgTWFwIGZvciBjaGFyYWN0ZXIgY29udGVudCBjaHVua3MKKyAgICAgKiBMaW1pdCBpcyBtZWFzdXJlZCBpbiBjaGFyYWN0ZXJzIG51bWJlcgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2hhcmFjdGVyQ29udGVudENodW5rTWFwVG90YWxDaGFyYWN0ZXJzQ29uc3RyYWludCA9IEZhc3RJbmZvc2V0U2VyaWFsaXplci5DSEFSQUNURVJfQ09OVEVOVF9DSFVOS19NQVBfTUVNT1JZX0NPTlNUUkFJTlQgLyAyOwogCiAgICAgLyoqCiAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIEVuY29kZXIuCkBAIC0yNDksNiArMjc3LDIwIEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldElnbm9yZURURChib29sZWFuIGlnbm9yZURURCkgeworICAgICAgICBfaWdub3JlRFREID0gaWdub3JlRFREOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRJZ25vcmVEVEQoKSB7CisgICAgICAgIHJldHVybiBfaWdub3JlRFREOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJZ25vcmVDb21tZW50cyhib29sZWFuIGlnbm9yZUNvbW1lbnRzKSB7CiAgICAgICAgIF9pZ25vcmVDb21tZW50cyA9IGlnbm9yZUNvbW1lbnRzOwogICAgIH0KQEAgLTM0OSw2ICszOTEsMzggQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyQ29udGVudENodW5rTWFwTWVtb3J5TGltaXQoaW50IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPCAwICkgeworICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBjaGFyYWN0ZXJDb250ZW50Q2h1bmtNYXBUb3RhbENoYXJhY3RlcnNDb25zdHJhaW50ID0gc2l6ZSAvIDI7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcmFjdGVyQ29udGVudENodW5rTWFwTWVtb3J5TGltaXQoKSB7CisgICAgICAgIHJldHVybiBjaGFyYWN0ZXJDb250ZW50Q2h1bmtNYXBUb3RhbENoYXJhY3RlcnNDb25zdHJhaW50ICogMjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciBjaGFyYWN0ZXIgY29udGVudCBjaHVuayAoaXRzIGxlbmd0aCkgbWF0Y2hlcyBsaW1pdHM6CisgICAgICogbGVuZ3RoIGxpbWl0IGl0c2VsZiBhbmQgbGltaXQgZm9yIHRvdGFsIGNhcGFjaXR5IG9mIHNwZWNpZmllZCBDaGFyQXJyYXlJbnRNYXAKKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiBjaGFyYWN0ZXIgY29udGVudCBjaHVuayBpcyBjaGVja2luZyB0byBiZSBhZGRlZCB0byBNYXAuCisgICAgICogQHBhcmFtIG1hcCB0aGUgY3VzdG9tIENoYXJBcnJheUludE1hcCwgd2hpY2ggbWVtb3J5IGxpbWl0cyB3aWxsIGJlIGNoZWNrZWQuCisgICAgICogQHJldHVybiB3aGV0aGVyIGNoYXJhY3RlciBjb250ZW50IGNodW5rIGxlbmd0aCBtYXRjaGVzIGxpbWl0cworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVyQ29udGVudENodW5rTGVuZ3RoTWF0Y2hlc0xpbWl0KGludCBsZW5ndGgsIENoYXJBcnJheUludE1hcCBtYXApIHsKKyAgICAgICAgcmV0dXJuIChsZW5ndGggPCBjaGFyYWN0ZXJDb250ZW50Q2h1bmtTaXplQ29udHJhaW50KSAmJgorICAgICAgICAgICAgICAgIChtYXAuZ2V0VG90YWxDaGFyYWN0ZXJDb3VudCgpICsgbGVuZ3RoIDwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckNvbnRlbnRDaHVua01hcFRvdGFsQ2hhcmFjdGVyc0NvbnN0cmFpbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVWYWx1ZVNpemVMaW1pdChpbnQgc2l6ZSkgewogICAgICAgICBpZiAoc2l6ZSA8IDAgKSB7CiAgICAgICAgICAgICBzaXplID0gMDsKQEAgLTM2Nyw2ICs0NDEsMzcgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVmFsdWVNYXBNZW1vcnlMaW1pdChpbnQgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA8IDAgKSB7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGF0dHJpYnV0ZVZhbHVlTWFwVG90YWxDaGFyYWN0ZXJzQ29uc3RyYWludCA9IHNpemUgLyAyOworCisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlVmFsdWVNYXBNZW1vcnlMaW1pdCgpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlTWFwVG90YWxDaGFyYWN0ZXJzQ29uc3RyYWludCAqIDI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgYXR0cmlidXRlIHZhbHVlIChpdHMgbGVuZ3RoKSBtYXRjaGVzIGxpbWl0czoKKyAgICAgKiBsZW5ndGggbGltaXQgaXRzZWxmIGFuZCBsaW1pdCBmb3IgaW5kZXggTWFwIHRvdGFsIGNhcGFjaXR5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgYXR0cmlidXRlIHZhbHVlIG1hdGNoZXMgbGltaXRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVWYWx1ZUxlbmd0aE1hdGNoZXNMaW1pdChpbnQgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiAobGVuZ3RoIDwgYXR0cmlidXRlVmFsdWVTaXplQ29uc3RyYWludCkgJiYKKyAgICAgICAgICAgICAgICAoX3YuYXR0cmlidXRlVmFsdWUuZ2V0VG90YWxDaGFyYWN0ZXJDb3VudCgpICsgbGVuZ3RoIDwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlTWFwVG90YWxDaGFyYWN0ZXJzQ29uc3RyYWludCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEV4dGVybmFsVm9jYWJ1bGFyeShFeHRlcm5hbFZvY2FidWxhcnkgdikgewogICAgICAgICAvLyBDcmVhdGUgaW50ZXJuYWwgc2VyaWFsaXplciB2b2NhYnVsYXJ5CiAgICAgICAgIF92ID0gbmV3IFNlcmlhbGl6ZXJWb2NhYnVsYXJ5KCk7CkBAIC0zNzksNiArNDg0LDIwIEBACiAgICAgICAgIF92SXNJbnRlcm5hbCA9IHRydWU7CiAgICAgfQogCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZvY2FidWxhcnlBcHBsaWNhdGlvbkRhdGEoVm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YSBkYXRhKSB7CisgICAgICAgIF92RGF0YSA9IGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBWb2NhYnVsYXJ5QXBwbGljYXRpb25EYXRhIGdldFZvY2FidWxhcnlBcHBsaWNhdGlvbkRhdGEoKSB7CisgICAgICAgIHJldHVybiBfdkRhdGE7CisgICAgfQorCiAgICAgLy8gRW5kIG9mIEZhc3RJbmZvc2V0U2VyaWFsaXplciBpbnRlcmZhY2UKIAogICAgIC8qKgpAQCAtNDMyLDkgKzU1MSwxMyBAQAogICAgICAgICAgICAgX3ZJc0ludGVybmFsID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmIChfdklzSW50ZXJuYWwpIHsKICAgICAgICAgICAgIF92LmNsZWFyKCk7CisgICAgICAgICAgICBpZiAoX3ZEYXRhICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3ZEYXRhLmNsZWFyKCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoX3YuaGFzSW5pdGlhbFZvY2FidWxhcnkoKSkgeworICAgICAgICBpZiAoIV92Lmhhc0luaXRpYWxWb2NhYnVsYXJ5KCkgJiYgIV92Lmhhc0V4dGVybmFsVm9jYWJ1bGFyeSgpKSB7CisgICAgICAgICAgICB3cml0ZSgwKTsKKyAgICAgICAgfSBlbHNlIGlmIChfdi5oYXNJbml0aWFsVm9jYWJ1bGFyeSgpKSB7CiAgICAgICAgICAgICBfYiA9IEVuY29kaW5nQ29uc3RhbnRzLkRPQ1VNRU5UX0lOSVRJQUxfVk9DQUJVTEFSWV9GTEFHOwogICAgICAgICAgICAgd3JpdGUoX2IpOwogCkBAIC00NDgsNyArNTcxLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGluaXRpYWxWb2NhYnVsYXJ5Lmhhc0V4dGVybmFsVm9jYWJ1bGFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlTm9uRW1wdHlPY3RldFN0cmluZ09uU2Vjb25kQml0KF92LmdldEV4dGVybmFsVm9jYWJ1bGFyeVVSSSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGVuY29kZU5vbkVtcHR5T2N0ZXRTdHJpbmdPblNlY29uZEJpdChfdi5nZXRFeHRlcm5hbFZvY2FidWxhcnlVUkkoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgZm9yIGNvbnRlbnRzIG9mIHZvY2FidWxhcnkgdG8gZW5jb2RlIHZhbHVlcwpAQCAtNDYwLDkgKzU4Myw3IEBACiAgICAgICAgICAgICB3cml0ZShfYik7CiAgICAgICAgICAgICB3cml0ZSgwKTsKIAotICAgICAgICAgICAgZW5jb2RlTm9uRW1wdHlPY3RldFN0cmluZ09uU2Vjb25kQml0KF92LmdldEV4dGVybmFsVm9jYWJ1bGFyeVVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGUoMCk7CisgICAgICAgICAgICBlbmNvZGVOb25FbXB0eU9jdGV0U3RyaW5nT25TZWNvbmRCaXQoX3YuZ2V0RXh0ZXJuYWxWb2NhYnVsYXJ5VVJJKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MDEsNiArNjIyLDcgQEAKICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmNvZGVUZXJtaW5hdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChfdGVybWluYXRlKSB7CiAgICAgICAgICAgICB3cml0ZShfYik7CisgICAgICAgICAgICBfYiA9IDA7CiAgICAgICAgICAgICBfdGVybWluYXRlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC01MTUsMTAgKzYzNywxMCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGVuY29kZU5hbWVzcGFjZUF0dHJpYnV0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBfYiA9IEVuY29kaW5nQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEU7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gIiIpIHsKKyAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIF9iIHw9IEVuY29kaW5nQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEVfUFJFRklYX0ZMQUc7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHVyaSAhPSAiIikgeworICAgICAgICBpZiAodXJpLmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgX2IgfD0gRW5jb2RpbmdDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURV9OQU1FX0ZMQUc7CiAgICAgICAgIH0KIApAQCAtNTI5LDEwICs2NTEsMTAgQEAKIAogICAgICAgICB3cml0ZShfYik7CiAKLSAgICAgICAgaWYgKHByZWZpeCAhPSAiIikgeworICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgZW5jb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQocHJlZml4LCBfdi5wcmVmaXgpOwogICAgICAgICB9Ci0gICAgICAgIGlmICh1cmkgIT0gIiIpIHsKKyAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIGVuY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KHVyaSwgX3YubmFtZXNwYWNlTmFtZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC01NDYsNyArNjY4LDcgQEAKICAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmNvZGVDaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhZGRUb1RhYmxlID0gKGxlbmd0aCA8IGNoYXJhY3RlckNvbnRlbnRDaHVua1NpemVDb250cmFpbnQpID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIGFkZFRvVGFibGUgPSBpc0NoYXJhY3RlckNvbnRlbnRDaHVua0xlbmd0aE1hdGNoZXNMaW1pdChsZW5ndGgsIF92LmNoYXJhY3RlckNvbnRlbnRDaHVuayk7CiAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25UaGlyZEJpdChjaCwgb2Zmc2V0LCBsZW5ndGgsIF92LmNoYXJhY3RlckNvbnRlbnRDaHVuaywgYWRkVG9UYWJsZSwgdHJ1ZSk7CiAgICAgfQogCkBAIC01NjMsNyArNjg1LDcgQEAKICAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmNvZGVDaGFyYWN0ZXJzTm9DbG9uZShjaGFyW10gY2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gYWRkVG9UYWJsZSA9IChsZW5ndGggPCBjaGFyYWN0ZXJDb250ZW50Q2h1bmtTaXplQ29udHJhaW50KSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhZGRUb1RhYmxlID0gaXNDaGFyYWN0ZXJDb250ZW50Q2h1bmtMZW5ndGhNYXRjaGVzTGltaXQobGVuZ3RoLCBfdi5jaGFyYWN0ZXJDb250ZW50Q2h1bmspOwogICAgICAgICBlbmNvZGVOb25JZGVudGlmeWluZ1N0cmluZ09uVGhpcmRCaXQoY2gsIG9mZnNldCwgbGVuZ3RoLCBfdi5jaGFyYWN0ZXJDb250ZW50Q2h1bmssIGFkZFRvVGFibGUsIGZhbHNlKTsKICAgICB9CiAKQEAgLTU3NywxMSArNjk5LDIyIEBACiAgICAgICogQHBhcmFtIGNoIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzLgogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzLgogICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiBjaGFyYWN0ZXJzLgorICAgICAqIEBwYXJhbSBhZGRUb1RhYmxlIGlmIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGFkZGVkIHRvIHRhYmxlLgogICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLgogICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGVuY29kZUZvdXJCaXRDaGFyYWN0ZXJzKGludCBpZCwgaW50W10gdGFibGUsIGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEZhc3RJbmZvc2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5jb2RlRm91ckJpdENoYXJhY3RlcnMoaW50IGlkLCBpbnRbXSB0YWJsZSwgY2hhcltdIGNoLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgYm9vbGVhbiBhZGRUb1RhYmxlKSB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFkZFRvVGFibGUpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IF92LmNoYXJhY3RlckNvbnRlbnRDaHVuay5vYnRhaW5JbmRleChjaCwgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOworICAgICAgICAgICAgaWYgKGluZGV4ICE9IEtleUludE1hcC5OT1RfUFJFU0VOVCkgeworICAgICAgICAgICAgICAgIF9iID0gRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LIHwgMHgyMDsKKyAgICAgICAgICAgICAgICBlbmNvZGVOb25aZXJvSW50ZWdlck9uRm91cnRoQml0KGluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBUaGlzIHByb2NlZHVyZSBhc3N1bWVzIHRoYXQgaWQgPD0gNjQKLSAgICAgICAgX2IgPSAobGVuZ3RoIDwgY2hhcmFjdGVyQ29udGVudENodW5rU2l6ZUNvbnRyYWludCkgPworICAgICAgICBfYiA9IChhZGRUb1RhYmxlKSA/CiAgICAgICAgICAgICBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTksgfCBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTktfUkVTVFJJQ1RFRF9BTFBIQUJFVF9GTEFHIHwgRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LX0FERF9UT19UQUJMRV9GTEFHIDoKICAgICAgICAgICAgIEVuY29kaW5nQ29uc3RhbnRzLkNIQVJBQ1RFUl9DSFVOSyB8IEVuY29kaW5nQ29uc3RhbnRzLkNIQVJBQ1RFUl9DSFVOS19SRVNUUklDVEVEX0FMUEhBQkVUX0ZMQUc7CiAgICAgICAgIHdyaXRlIChfYik7CkBAIC02MDEsMjIgKzczNCwzMyBAQAogICAgICAqIEBwYXJhbSBjaCB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycy4KICAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgY2hhcmFjdGVycy4KKyAgICAgKiBAcGFyYW0gYWRkVG9UYWJsZSBpZiBjaGFyYWN0ZXJzIHNob3VsZCBiZSBhZGRlZCB0byB0YWJsZQogICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLgogICAgICAqIEB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24gaWYgdGhlIGFscGhhYmV0IGlzIG5vdCBwcmVzZW50IGluIHRoZQogICAgICAqICAgICAgICAgdm9jYWJ1bGFyeS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmNvZGVBbHBoYWJldENoYXJhY3RlcnMoU3RyaW5nIGFscGhhYmV0LCBjaGFyW10gY2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBGYXN0SW5mb3NldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGVuY29kZUFscGhhYmV0Q2hhcmFjdGVycyhTdHJpbmcgYWxwaGFiZXQsIGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIGJvb2xlYW4gYWRkVG9UYWJsZSkgdGhyb3dzIEZhc3RJbmZvc2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhZGRUb1RhYmxlKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBfdi5jaGFyYWN0ZXJDb250ZW50Q2h1bmsub2J0YWluSW5kZXgoY2gsIG9mZnNldCwgbGVuZ3RoLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCAhPSBLZXlJbnRNYXAuTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgICAgICAgICBfYiA9IEVuY29kaW5nQ29uc3RhbnRzLkNIQVJBQ1RFUl9DSFVOSyB8IDB4MjA7CisgICAgICAgICAgICAgICAgZW5jb2RlTm9uWmVyb0ludGVnZXJPbkZvdXJ0aEJpdChpbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaW50IGlkID0gX3YucmVzdHJpY3RlZEFscGhhYmV0LmdldChhbHBoYWJldCk7CiAgICAgICAgIGlmIChpZCA9PSBLZXlJbnRNYXAuTk9UX1BSRVNFTlQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5yZXN0cmljdGVkQWxwaGFiZXROb3RQcmVzZW50IikpOwogICAgICAgICB9CiAgICAgICAgIGlkICs9IEVuY29kaW5nQ29uc3RhbnRzLlJFU1RSSUNURURfQUxQSEFCRVRfQVBQTElDQVRJT05fU1RBUlQ7CiAKLSAgICAgICAgX2IgPSAobGVuZ3RoIDwgY2hhcmFjdGVyQ29udGVudENodW5rU2l6ZUNvbnRyYWludCkgPworICAgICAgICBfYiA9IChhZGRUb1RhYmxlKSA/CiAgICAgICAgICAgICBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTksgfCBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTktfUkVTVFJJQ1RFRF9BTFBIQUJFVF9GTEFHIHwgRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LX0FERF9UT19UQUJMRV9GTEFHIDoKICAgICAgICAgICAgIEVuY29kaW5nQ29uc3RhbnRzLkNIQVJBQ1RFUl9DSFVOSyB8IEVuY29kaW5nQ29uc3RhbnRzLkNIQVJBQ1RFUl9DSFVOS19SRVNUUklDVEVEX0FMUEhBQkVUX0ZMQUc7CiAgICAgICAgIF9iIHw9IChpZCAmIDB4QzApID4+IDY7Ci0gICAgICAgIHdyaXRlIChfYik7CisgICAgICAgIHdyaXRlKF9iKTsKIAogICAgICAgICAvLyBFbmNvZGUgYm90dG9tIDYgYml0cyBvZiBlbm9kaW5nIGFsZ29yaXRobSBpZAogICAgICAgICBfYiA9IChpZCAmIDB4M0YpIDw8IDI7CkBAIC02MzcsMTEgKzc4MSwzNSBAQAogICAgICAgICBlbmNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nT25GaXJzdEJpdCh0YXJnZXQsIF92Lm90aGVyTkNOYW1lKTsKIAogICAgICAgICAvLyBEYXRhCi0gICAgICAgIGJvb2xlYW4gYWRkVG9UYWJsZSA9IChkYXRhLmxlbmd0aCgpIDwgY2hhcmFjdGVyQ29udGVudENodW5rU2l6ZUNvbnRyYWludCkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIGJvb2xlYW4gYWRkVG9UYWJsZSA9IGlzQ2hhcmFjdGVyQ29udGVudENodW5rTGVuZ3RoTWF0Y2hlc0xpbWl0KGRhdGEubGVuZ3RoKCksIF92LmNoYXJhY3RlckNvbnRlbnRDaHVuayk7CiAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdChkYXRhLCBfdi5vdGhlclN0cmluZywgYWRkVG9UYWJsZSk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogRW5jb2RlIGEgRG9jdW1lbnQgVHlwZSBEZWNsYXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzeXN0ZW1JZCB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHN1YnNldC4KKyAgICAgKiBAcGFyYW0gcHVibGljSWQgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCBzdWJzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5jb2RlRG9jdW1lbnRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgcHVibGljSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF9iID0gRW5jb2RpbmdDb25zdGFudHMuRE9DVU1FTlRfVFlQRV9ERUNMQVJBVElPTjsKKyAgICAgICAgaWYgKHN5c3RlbUlkICE9IG51bGwgJiYgc3lzdGVtSWQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBfYiB8PSBFbmNvZGluZ0NvbnN0YW50cy5ET0NVTUVOVF9UWVBFX1NZU1RFTV9JREVOVElGSUVSX0ZMQUc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwgJiYgcHVibGljSWQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBfYiB8PSBFbmNvZGluZ0NvbnN0YW50cy5ET0NVTUVOVF9UWVBFX1BVQkxJQ19JREVOVElGSUVSX0ZMQUc7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGUoX2IpOworCisgICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsICYmIHN5c3RlbUlkLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgZW5jb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoc3lzdGVtSWQsIF92Lm90aGVyVVJJKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHVibGljSWQgIT0gbnVsbCAmJiBwdWJsaWNJZC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGVuY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KHB1YmxpY0lkLCBfdi5vdGhlclVSSSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBFbmNvZGUgYSBDb21tZW50IEluZm9ybWF0aW9uIEl0ZW0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2ggdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhhdCBpcyBhcyBjb21tZW50LgpAQCAtNjUyLDcgKzgyMCw3IEBACiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5jb2RlQ29tbWVudChjaGFyW10gY2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlKEVuY29kaW5nQ29uc3RhbnRzLkNPTU1FTlQpOwogCi0gICAgICAgIGJvb2xlYW4gYWRkVG9UYWJsZSA9IChsZW5ndGggPCBjaGFyYWN0ZXJDb250ZW50Q2h1bmtTaXplQ29udHJhaW50KSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBhZGRUb1RhYmxlID0gaXNDaGFyYWN0ZXJDb250ZW50Q2h1bmtMZW5ndGhNYXRjaGVzTGltaXQobGVuZ3RoLCBfdi5vdGhlclN0cmluZyk7CiAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdChjaCwgb2Zmc2V0LCBsZW5ndGgsIF92Lm90aGVyU3RyaW5nLCBhZGRUb1RhYmxlLCB0cnVlKTsKICAgICB9CiAKQEAgLTY3MSw3ICs4MzksNyBAQAogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGVuY29kZUNvbW1lbnROb0Nsb25lKGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGUoRW5jb2RpbmdDb25zdGFudHMuQ09NTUVOVCk7CiAKLSAgICAgICAgYm9vbGVhbiBhZGRUb1RhYmxlID0gKGxlbmd0aCA8IGNoYXJhY3RlckNvbnRlbnRDaHVua1NpemVDb250cmFpbnQpID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBib29sZWFuIGFkZFRvVGFibGUgPSBpc0NoYXJhY3RlckNvbnRlbnRDaHVua0xlbmd0aE1hdGNoZXNMaW1pdChsZW5ndGgsIF92Lm90aGVyU3RyaW5nKTsKICAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KGNoLCBvZmZzZXQsIGxlbmd0aCwgX3Yub3RoZXJTdHJpbmcsIGFkZFRvVGFibGUsIGZhbHNlKTsKICAgICB9CiAKQEAgLTcyMiwxMyArODkwLDEzIEBACiAKICAgICAgICAgaW50IG5hbWVzcGFjZVVSSUluZGV4ID0gS2V5SW50TWFwLk5PVF9QUkVTRU5UOwogICAgICAgICBpbnQgcHJlZml4SW5kZXggPSBLZXlJbnRNYXAuTk9UX1BSRVNFTlQ7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gIiIpIHsKKyAgICAgICAgaWYgKG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIG5hbWVzcGFjZVVSSUluZGV4ID0gX3YubmFtZXNwYWNlTmFtZS5nZXQobmFtZXNwYWNlVVJJKTsKICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUklJbmRleCA9PSBLZXlJbnRNYXAuTk9UX1BSRVNFTlQpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UubmFtZXNwYWNlVVJJTm90SW5kZXhlZCIsIG5ldyBPYmplY3RbXXtuYW1lc3BhY2VVUkl9KSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwcmVmaXggIT0gIiIpIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgcHJlZml4SW5kZXggPSBfdi5wcmVmaXguZ2V0KHByZWZpeCk7CiAgICAgICAgICAgICAgICAgaWYgKHByZWZpeEluZGV4ID09IEtleUludE1hcC5OT1RfUFJFU0VOVCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UucHJlZml4Tm90SW5kZXhlZCIsIG5ldyBPYmplY3RbXXtwcmVmaXh9KSk7CkBAIC04MDUsNyArOTczLDcgQEAKICAgICAgICAgICAgICAgICBMb2NhbE5hbWVRdWFsaWZpZWROYW1lc01hcC5FbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IG5hbWVzcGFjZVVSSUluZGV4ID0gS2V5SW50TWFwLk5PVF9QUkVTRU5UOwogICAgICAgICBpbnQgcHJlZml4SW5kZXggPSBLZXlJbnRNYXAuTk9UX1BSRVNFTlQ7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gIiIpIHsKKyAgICAgICAgaWYgKG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIG5hbWVzcGFjZVVSSUluZGV4ID0gX3YubmFtZXNwYWNlTmFtZS5nZXQobmFtZXNwYWNlVVJJKTsKICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUklJbmRleCA9PSBLZXlJbnRNYXAuTk9UX1BSRVNFTlQpIHsKICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJID09IEVuY29kaW5nQ29uc3RhbnRzLlhNTE5TX05BTUVTUEFDRV9OQU1FIHx8CkBAIC04MTYsNyArOTg0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwcmVmaXggIT0gIiIpIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgcHJlZml4SW5kZXggPSBfdi5wcmVmaXguZ2V0KHByZWZpeCk7CiAgICAgICAgICAgICAgICAgaWYgKHByZWZpeEluZGV4ID09IEtleUludE1hcC5OT1RfUFJFU0VOVCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UucHJlZml4Tm90SW5kZXhlZCIsIG5ldyBPYmplY3RbXXtwcmVmaXh9KSk7CkBAIC04MzAsOSArOTk4LDkgQEAKICAgICAgICAgZW50cnkuYWRkUXVhbGlmaWVkTmFtZShuYW1lKTsKIAogICAgICAgICBfYiA9IEVuY29kaW5nQ29uc3RhbnRzLkFUVFJJQlVURV9MSVRFUkFMX1FOQU1FX0ZMQUc7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gIiIpIHsKKyAgICAgICAgaWYgKG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIF9iIHw9IEVuY29kaW5nQ29uc3RhbnRzLkxJVEVSQUxfUU5BTUVfTkFNRVNQQUNFX05BTUVfRkxBRzsKLSAgICAgICAgICAgIGlmIChwcmVmaXggIT0gIiIpIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgX2IgfD0gRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfRkxBRzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTUzLDYgKzExMjEsMzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdChpbnQgaWQsIGludFtdIHRhYmxlLCBTdHJpbmcgcywgYm9vbGVhbiBhZGRUb1RhYmxlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBGYXN0SW5mb3NldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBDLjI2IGFuIGluZGV4IChmaXJzdCBiaXQgJzEnKSB3aXRoIHNldmVuICcxJyBiaXRzIGZvciBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgICAgIHdyaXRlKDB4RkYpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGFkZFRvVGFibGUpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IF92LmF0dHJpYnV0ZVZhbHVlLm9idGFpbkluZGV4KHMpOworICAgICAgICAgICAgaWYgKGluZGV4ICE9IEtleUludE1hcC5OT1RfUFJFU0VOVCkgeworICAgICAgICAgICAgICAgIGVuY29kZU5vblplcm9JbnRlZ2VyT25TZWNvbmRCaXRGaXJzdEJpdE9uZShpbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgX2IgPSAoYWRkVG9UYWJsZSkKKyAgICAgICAgICAgICAgICA/IEVuY29kaW5nQ29uc3RhbnRzLk5JU1RSSU5HX1JFU1RSSUNURURfQUxQSEFCRVRfRkxBRyB8IEVuY29kaW5nQ29uc3RhbnRzLk5JU1RSSU5HX0FERF9UT19UQUJMRV9GTEFHCisgICAgICAgICAgICAgICAgOiBFbmNvZGluZ0NvbnN0YW50cy5OSVNUUklOR19SRVNUUklDVEVEX0FMUEhBQkVUX0ZMQUc7CisgICAgICAgIC8vIEVuY29kZSBpZGVudGlmaWNhdGlvbiBhbmQgdG9wIGZvdXIgYml0cyBvZiBhbHBoYWJldCBpZAorICAgICAgICB3cml0ZSAoX2IgfCAoKGlkICYgMHhGMCkgPj4gNCkpOworICAgICAgICAvLyBFbmNvZGUgYm90dG9tIDQgYml0cyBvZiBhbHBoYWJldCBpZAorICAgICAgICBfYiA9IChpZCAmIDB4MEYpIDw8IDQ7CisKKyAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHMubGVuZ3RoKCk7CisgICAgICAgIGZpbmFsIGludCBvY3RldFBhaXJMZW5ndGggPSBsZW5ndGggLyAyOworICAgICAgICBmaW5hbCBpbnQgb2N0ZXRTaW5nbGVMZW5ndGggPSBsZW5ndGggJSAyOworICAgICAgICBlbmNvZGVOb25aZXJvT2N0ZXRTdHJpbmdMZW5ndGhPbkZpZnRoQml0KG9jdGV0UGFpckxlbmd0aCArIG9jdGV0U2luZ2xlTGVuZ3RoKTsKKyAgICAgICAgZW5jb2RlTm9uRW1wdHlGb3VyQml0Q2hhcmFjdGVyU3RyaW5nKHRhYmxlLCBzLnRvQ2hhckFycmF5KCksIDAsIG9jdGV0UGFpckxlbmd0aCwgb2N0ZXRTaW5nbGVMZW5ndGgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEVuY29kZSBhIG5vbiBpZGVudGlmeWluZyBzdHJpbmcgb24gdGhlIGZpcnN0IGJpdCBvZiBhbiBvY3RldCBhcyBiaW5hcnkKICAgICAgKiBkYXRhIHVzaW5nIGFuIGVuY29kaW5nIGFsZ29yaXRobS4KQEAgLTk4NiwxMiArMTE4Myw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGlkIDw9IEVuY29kaW5nQ29uc3RhbnRzLkVOQ09ESU5HX0FMR09SSVRITV9CVUlMVElOX0VORCkgewotICAgICAgICAgICAgQnVpbHRJbkVuY29kaW5nQWxnb3JpdGhtIGEgPSBCdWlsdEluRW5jb2RpbmdBbGdvcml0aG1GYWN0b3J5LnRhYmxlW2lkXTsKICAgICAgICAgICAgIGludCBsZW5ndGggPSAwOwogICAgICAgICAgICAgc3dpdGNoKGlkKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuSEVYQURFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9ICgoYnl0ZVtdKWRhdGEpLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuQkFTRTY0OgogICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAoKGJ5dGVbXSlkYXRhKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAwMiw2ICsxMTk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKChpbnRbXSlkYXRhKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLkxPTkc6CisgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuVVVJRDoKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKChsb25nW10pZGF0YSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEVuY29kaW5nQWxnb3JpdGhtSW5kZXhlcy5CT09MRUFOOgpAQCAtMTAxMywxMyArMTIwOCwxMCBAQAogICAgICAgICAgICAgICAgIGNhc2UgRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLkRPVUJMRToKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKChkb3VibGVbXSlkYXRhKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLlVVSUQ6Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9ICgobG9uZ1tdKWRhdGEpLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuQ0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5DREFUQSIpKTsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UuVW5zdXBwb3J0ZWRCdWlsdEluQWxnb3JpdGhtIiwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKGlkKX0pKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLlVuc3VwcG9ydGVkQnVpbHRJbkFsZ29yaXRobSIsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YoaWQpfSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZW5jb2RlQUlJQnVpbHRJbkFsZ29yaXRobURhdGEoaWQsIGRhdGEsIDAsIGxlbmd0aCk7CiAgICAgICAgIH0gZWxzZSBpZiAoaWQgPj0gRW5jb2RpbmdDb25zdGFudHMuRU5DT0RJTkdfQUxHT1JJVEhNX0FQUExJQ0FUSU9OX1NUQVJUKSB7CkBAIC0xMTgyLDggKzEzNzQsNiBAQAogICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CiAgICAgICAgICAgICBzd2l0Y2goaWQpIHsKICAgICAgICAgICAgICAgICBjYXNlIEVuY29kaW5nQWxnb3JpdGhtSW5kZXhlcy5IRVhBREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKChieXRlW10pZGF0YSkubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEVuY29kaW5nQWxnb3JpdGhtSW5kZXhlcy5CQVNFNjQ6CiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9ICgoYnl0ZVtdKWRhdGEpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTk0LDcgKzEzODQsOCBAQAogICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAoKGludFtdKWRhdGEpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuTE9ORzoKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKChpbnRbXSlkYXRhKS5sZW5ndGg7CisgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuVVVJRDoKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKChsb25nW10pZGF0YSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEVuY29kaW5nQWxnb3JpdGhtSW5kZXhlcy5CT09MRUFOOgogICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAoKGJvb2xlYW5bXSlkYXRhKS5sZW5ndGg7CkBAIC0xMjA1LDEzICsxMzk2LDEwIEBACiAgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuRE9VQkxFOgogICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAoKGRvdWJsZVtdKWRhdGEpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuVVVJRDoKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKChpbnRbXSlkYXRhKS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLkNEQVRBOgogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UuQ0RBVEEiKSk7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLlVuc3VwcG9ydGVkQnVpbHRJbkFsZ29yaXRobSIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihpZCl9KSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5VbnN1cHBvcnRlZEJ1aWx0SW5BbGdvcml0aG0iLCBuZXcgT2JqZWN0W117SW50ZWdlci52YWx1ZU9mKGlkKX0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVuY29kZUNJSUJ1aWx0SW5BbGdvcml0aG1EYXRhKGlkLCBkYXRhLCAwLCBsZW5ndGgpOwogICAgICAgICB9IGVsc2UgaWYgKGlkID49IEVuY29kaW5nQ29uc3RhbnRzLkVOQ09ESU5HX0FMR09SSVRITV9BUFBMSUNBVElPTl9TVEFSVCkgewpAQCAtMTQ5Niw3ICsxNjg0LDExIEBACiAKICAgICAgICAgLy8gRW5jb2RlIHRoZSBsZW5ndGgKICAgICAgICAgZW5jb2RlTm9uWmVyb09jdGV0U3RyaW5nTGVuZ3RoT25TZW52ZW50aEJpdChvY3RldFBhaXJMZW5ndGggKyBvY3RldFNpbmdsZUxlbmd0aCk7CisgICAgICAgIGVuY29kZU5vbkVtcHR5Rm91ckJpdENoYXJhY3RlclN0cmluZyh0YWJsZSwgY2gsIG9mZnNldCwgb2N0ZXRQYWlyTGVuZ3RoLCBvY3RldFNpbmdsZUxlbmd0aCk7CisgICAgfQogCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5jb2RlTm9uRW1wdHlGb3VyQml0Q2hhcmFjdGVyU3RyaW5nKGludFtdIHRhYmxlLCBjaGFyW10gY2gsIGludCBvZmZzZXQsCisgICAgICAgICAgICBpbnQgb2N0ZXRQYWlyTGVuZ3RoLCBpbnQgb2N0ZXRTaW5nbGVMZW5ndGgpIHRocm93cyBGYXN0SW5mb3NldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBlbnN1cmVTaXplKG9jdGV0UGFpckxlbmd0aCArIG9jdGV0U2luZ2xlTGVuZ3RoKTsKICAgICAgICAgLy8gRW5jb2RlIGFsbCBwYWlycwogICAgICAgICBpbnQgdiA9IDA7CkBAIC0xNTMzLDcgKzE3MjUsNiBAQAogICAgICAgICB3aGlsZSAoKDEgPDwgYml0c1BlckNoYXJhY3RlcikgPD0gYWxwaGFiZXQubGVuZ3RoKCkpIHsKICAgICAgICAgICAgIGJpdHNQZXJDaGFyYWN0ZXIrKzsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgdGVybWluYXRpbmdWYWx1ZSA9ICgxIDw8IGJpdHNQZXJDaGFyYWN0ZXIpIC0gMTsKIAogICAgICAgICBmaW5hbCBpbnQgYml0cyA9IGxlbmd0aCAqIGJpdHNQZXJDaGFyYWN0ZXI7CiAgICAgICAgIGZpbmFsIGludCBvY3RldHMgPSBiaXRzIC8gODsKQEAgLTE2MzUsNyArMTgyNiw3IEBACiAgICAgICAgICAgICAvLyBfYiA9IDB4QzAgfCAoaSA+PiA4KTsgLy8gMDEwIDAwMDAwCiAgICAgICAgICAgICB3cml0ZShfYik7CiAgICAgICAgICAgICB3cml0ZShpICYgMHhGRik7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0gZWxzZSBpZiAoaSA8IEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9MQVJHRV9MSU1JVCkgewogICAgICAgICAgICAgLy8gWzgyNTcsIDEwNDg1NzZdICggWzgyNTYsIDEwNDg1NzVdICkgMjAgYml0cwogICAgICAgICAgICAgaSAtPSBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgX2IgPSAoMHg4MCB8IEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9MQVJHRV9GTEFHKSB8IChpID4+IDE2KTsgLy8gMDExMCAwMDAwCkBAIC0xNjQzLDYgKzE4MzQsMTAgQEAKICAgICAgICAgICAgIHdyaXRlKF9iKTsKICAgICAgICAgICAgIHdyaXRlKChpID4+IDgpICYgMHhGRik7CiAgICAgICAgICAgICB3cml0ZShpICYgMHhGRik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLmludGVnZXJNYXhTaXplIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTEFSR0VfTElNSVQpfSkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xODMzLDI1ICsyMDI4LDMzIEBACiAgICAgICAgICAgICB3cml0ZSgoaSA+PiA4KSAmIDB4RkYpOwogICAgICAgICAgICAgd3JpdGUoaSAmIDB4RkYpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLmludGVnZXJNYXhTaXplIiwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfTUFYSU1VTV9TSVpFKX0pKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5pbnRlZ2VyTWF4U2l6ZSIsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YoRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl9NQVhJTVVNX1NJWkUpfSkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogTWFyayB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyZWQgc3RyZWFtLgogICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIG1hcmsoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIG1hcmsoKSB7CiAgICAgICAgIF9tYXJrSW5kZXggPSBfb2N0ZXRCdWZmZXJJbmRleDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXNldCB0aGUgbWFya2VkIHBvc2l0aW9uIGluIHRoZSBidWZmZXJlZCBzdHJlYW0uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVzZXRNYXJrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNldE1hcmsoKSB7CiAgICAgICAgIF9tYXJrSW5kZXggPSAtMTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcmsgaGFzIGJlZW4gc2V0LCBvdGhlcndpc2UgZmFsc2UgaWYgdGhlIG1hcmsKKyAgICAgKiAgICAgICAgIGhhcyBub3QgYmVlbiBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzTWFyaygpIHsKKyAgICAgICAgcmV0dXJuIF9tYXJrSW5kZXggIT0gLTE7CisgICAgfQorCisgICAgLyoqCiAgICAgICogV3JpdGUgYSBieXRlIHRvIHRoZSBidWZmZXJlZCBzdHJlYW0uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgd3JpdGUoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yMTMzLDggKzIzMzYsOCBAQAogICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZShjaFtzdGFydF0pKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgZmluYWwgaW50IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwotICAgICAgICBzdGFydCsrOwotICAgICAgICB3aGlsZShzdGFydCA8IGVuZCAmJiBYTUxDaGFyLmlzU3BhY2UoY2hbc3RhcnQrK10pKTsKKyAgICAgICAgd2hpbGUoKytzdGFydCA8IGVuZCAmJiBYTUxDaGFyLmlzU3BhY2UoY2hbc3RhcnRdKSk7CisKICAgICAgICAgcmV0dXJuIHN0YXJ0ID09IGVuZDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0VuY29kaW5nQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9FbmNvZGluZ0NvbnN0YW50cy5qYXZhCmluZGV4IGRiM2U0MjYuLmU0ZGNhMTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L0VuY29kaW5nQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvRW5jb2RpbmdDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldDsKQEAgLTYxLDcgKzM0LDYgQEAKIAogcHVibGljIGZpbmFsIGNsYXNzIEVuY29kaW5nQ29uc3RhbnRzIHsKICAgICBzdGF0aWMgewotICAgICAgICBpbml0aWF0ZUNoYXJhY3RlclRhYmxlcygpOwogICAgICAgICBpbml0aWF0ZVhNTERlY2xhcmF0aW9uVmFsdWVzKCk7CiAgICAgfQogCkBAIC02OSwxNCArNDEsMTEgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRVNQQUNFX1BSRUZJWF9MRU5HVEggPSBYTUxfTkFNRVNQQUNFX1BSRUZJWC5sZW5ndGgoKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkFNRVNQQUNFX05BTUUgPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRVNQQUNFX05BTUVfTEVOR1RIID0gWE1MX05BTUVTUEFDRV9OQU1FLmxlbmd0aCgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFhNTF9OQU1FU1BBQ0VfTkFNRV9DSEFSUyA9IFhNTF9OQU1FU1BBQ0VfTkFNRS50b0NoYXJBcnJheSgpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfTkFNRVNQQUNFX1BSRUZJWCA9ICJ4bWxucyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MTlNfTkFNRVNQQUNFX1BSRUZJWF9MRU5HVEggPSBYTUxOU19OQU1FU1BBQ0VfUFJFRklYLmxlbmd0aCgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFhNTE5TX05BTUVTUEFDRV9QUkVGSVhfQ0hBUlMgPSBYTUxOU19OQU1FU1BBQ0VfUFJFRklYLnRvQ2hhckFycmF5KCk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfTkFNRVNQQUNFX05BTUUgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTE5TX05BTUVTUEFDRV9OQU1FX0xFTkdUSCA9IFhNTE5TX05BTUVTUEFDRV9OQU1FLmxlbmd0aCgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFhNTE5TX05BTUVTUEFDRV9OQU1FX0NIQVJTID0gWE1MTlNfTkFNRVNQQUNFX05BTUUudG9DaGFyQXJyYXkoKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBERUZBVUxUX05BTUVTUEFDRV9ERUNMQVJBVElPTiA9IG5ldyBRdWFsaWZpZWROYW1lKAogICAgICAgICAgICAgIiIsCkBAIC0xOTQsNyArMTYzLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ1RFVF9TVFJJTkdfTEVOR1RIXzJORF9CSVRfTEFSR0VfRkxBRyA9IDB4NjA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NURVRfU1RSSU5HX0xFTkdUSF8yTkRfQklUX1NNQUxMX01BU0sgPSAweDFGOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBPQ1RFVF9TVFJJTkdfTEVOR1RIXzJORF9CSVRfVkFMVUVTID0geworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludFtdIE9DVEVUX1NUUklOR19MRU5HVEhfMk5EX0JJVF9WQUxVRVMgPSB7CiAgICAgICAgIE9DVEVUX1NUUklOR19MRU5HVEhfMk5EX0JJVF9TTUFMTF9MSU1JVCwKICAgICAgICAgT0NURVRfU1RSSU5HX0xFTkdUSF8yTkRfQklUX01FRElVTV9MSU1JVCwKICAgICAgICAgT0NURVRfU1RSSU5HX0xFTkdUSF8yTkRfQklUX01FRElVTV9GTEFHLApAQCAtMjEwLDcgKzE3OSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NURVRfU1RSSU5HX0xFTkdUSF81VEhfQklUX0xBUkdFX0ZMQUcgPSAweDBDOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DVEVUX1NUUklOR19MRU5HVEhfNVRIX0JJVF9TTUFMTF9NQVNLID0gMHgwNzsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gT0NURVRfU1RSSU5HX0xFTkdUSF81VEhfQklUX1ZBTFVFUyA9IHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnRbXSBPQ1RFVF9TVFJJTkdfTEVOR1RIXzVUSF9CSVRfVkFMVUVTID0gewogICAgICAgICBPQ1RFVF9TVFJJTkdfTEVOR1RIXzVUSF9CSVRfU01BTExfTElNSVQsCiAgICAgICAgIE9DVEVUX1NUUklOR19MRU5HVEhfNVRIX0JJVF9NRURJVU1fTElNSVQsCiAgICAgICAgIE9DVEVUX1NUUklOR19MRU5HVEhfNVRIX0JJVF9NRURJVU1fRkxBRywKQEAgLTIyNiw3ICsxOTUsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DVEVUX1NUUklOR19MRU5HVEhfN1RIX0JJVF9MQVJHRV9GTEFHID0gMHgwMzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfU01BTExfTUFTSyA9IDB4MDE7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIE9DVEVUX1NUUklOR19MRU5HVEhfN1RIX0JJVF9WQUxVRVMgPSB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50W10gT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX1ZBTFVFUyA9IHsKICAgICAgICAgT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX1NNQUxMX0xJTUlULAogICAgICAgICBPQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfTUVESVVNX0xJTUlULAogICAgICAgICBPQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfTUVESVVNX0ZMQUcsCkBAIC0yNTcsNyArMjI2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSXzJORF9CSVRfTUVESVVNX01BU0sgPSAweDFGOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVJfMk5EX0JJVF9MQVJHRV9NQVNLID0gMHgwRjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSU5URUdFUl8yTkRfQklUX1ZBTFVFUyA9IHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnRbXSBJTlRFR0VSXzJORF9CSVRfVkFMVUVTID0gewogICAgICAgICBJTlRFR0VSXzJORF9CSVRfU01BTExfTElNSVQsCiAgICAgICAgIElOVEVHRVJfMk5EX0JJVF9NRURJVU1fTElNSVQsCiAgICAgICAgIElOVEVHRVJfMk5EX0JJVF9MQVJHRV9MSU1JVCwKQEAgLTI4MCw3ICsyNDksNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVJfM1JEX0JJVF9MQVJHRV9NQVNLID0gMHgwNzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSXzNSRF9CSVRfTEFSR0VfTEFSR0VfTUFTSyA9IDB4MEY7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIElOVEVHRVJfM1JEX0JJVF9WQUxVRVMgPSB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50W10gSU5URUdFUl8zUkRfQklUX1ZBTFVFUyA9IHsKICAgICAgICAgSU5URUdFUl8zUkRfQklUX1NNQUxMX0xJTUlULAogICAgICAgICBJTlRFR0VSXzNSRF9CSVRfTUVESVVNX0xJTUlULAogICAgICAgICBJTlRFR0VSXzNSRF9CSVRfTEFSR0VfTElNSVQsCkBAIC0zMDIsNyArMjcxLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSXzRUSF9CSVRfTUVESVVNX01BU0sgPSAweDAzOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVJfNFRIX0JJVF9MQVJHRV9NQVNLID0gMHgwMzsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSU5URUdFUl80VEhfQklUX1ZBTFVFUyA9IHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnRbXSBJTlRFR0VSXzRUSF9CSVRfVkFMVUVTID0gewogICAgICAgICBJTlRFR0VSXzRUSF9CSVRfU01BTExfTElNSVQsCiAgICAgICAgIElOVEVHRVJfNFRIX0JJVF9NRURJVU1fTElNSVQsCiAgICAgICAgIElOVEVHRVJfNFRIX0JJVF9MQVJHRV9MSU1JVCwKQEAgLTMxMSw0NCArMjgwLDkgQEAKICAgICAgICAgSU5URUdFUl80VEhfQklUX0xBUkdFX0xBUkdFX0ZMQUcKICAgICB9OwogCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgYnl0ZVtdIEJJTkFSWV9IRUFERVIgPSB7KGJ5dGUpMHhFMCwgMCwgMCwgMX07CiAKLSAgICBwdWJsaWMgc3RhdGljIGludFtdIE5VTUVSSUNfQ0hBUkFDVEVSU19UQUJMRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50W10gREFURV9USU1FX0NIQVJBQ1RFUlNfVEFCTEU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYXRlQ2hhcmFjdGVyVGFibGVzKCkgewotICAgICAgICBOVU1FUklDX0NIQVJBQ1RFUlNfVEFCTEUgPSBuZXcgaW50W21heENoYXJhY3RlcihSZXN0cmljdGVkQWxwaGFiZXQuTlVNRVJJQ19DSEFSQUNURVJTKSArIDFdOwotICAgICAgICBEQVRFX1RJTUVfQ0hBUkFDVEVSU19UQUJMRSA9IG5ldyBpbnRbbWF4Q2hhcmFjdGVyKFJlc3RyaWN0ZWRBbHBoYWJldC5EQVRFX1RJTUVfQ0hBUkFDVEVSUykgKyAxXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTUVSSUNfQ0hBUkFDVEVSU19UQUJMRS5sZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIE5VTUVSSUNfQ0hBUkFDVEVSU19UQUJMRVtpXSA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREFURV9USU1FX0NIQVJBQ1RFUlNfVEFCTEUubGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICBEQVRFX1RJTUVfQ0hBUkFDVEVSU19UQUJMRVtpXSA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSZXN0cmljdGVkQWxwaGFiZXQuTlVNRVJJQ19DSEFSQUNURVJTLmxlbmd0aCgpIDsgaSsrKSB7Ci0gICAgICAgICAgICBOVU1FUklDX0NIQVJBQ1RFUlNfVEFCTEVbUmVzdHJpY3RlZEFscGhhYmV0Lk5VTUVSSUNfQ0hBUkFDVEVSUy5jaGFyQXQoaSldID0gaTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJlc3RyaWN0ZWRBbHBoYWJldC5EQVRFX1RJTUVfQ0hBUkFDVEVSUy5sZW5ndGgoKSA7IGkrKykgewotICAgICAgICAgICAgREFURV9USU1FX0NIQVJBQ1RFUlNfVEFCTEVbUmVzdHJpY3RlZEFscGhhYmV0LkRBVEVfVElNRV9DSEFSQUNURVJTLmNoYXJBdChpKV0gPSBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1heENoYXJhY3RlcihTdHJpbmcgYWxwaGFiZXQpIHsKLSAgICAgICAgaW50IGMgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aCgpIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYyA8IGFscGhhYmV0LmNoYXJBdChpKSkgewotICAgICAgICAgICAgICAgIGMgPSBhbHBoYWJldC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBCSU5BUllfSEVBREVSID0geyhieXRlKTB4RTAsIDAsIDAsIDF9OwotCi0gICAgcHVibGljIHN0YXRpYyBieXRlW11bXSBYTUxfREVDTEFSQVRJT05fVkFMVUVTOworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJ5dGVbXVtdIFhNTF9ERUNMQVJBVElPTl9WQUxVRVM7CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYXRlWE1MRGVjbGFyYXRpb25WYWx1ZXMoKSB7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L05vdGF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9Ob3RhdGlvbi5qYXZhCmluZGV4IDcxZGU3MmEuLjMzNTFjM2MgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L05vdGF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvTm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQ7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L09jdGV0QnVmZmVyTGlzdGVuZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L09jdGV0QnVmZmVyTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTExOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvT2N0ZXRCdWZmZXJMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKgorICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldDsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEFsZXhleSBTdGFzaG9rCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT2N0ZXRCdWZmZXJMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZQorICAgICAqIChAbGluayBEZWNvZGVyKSBvY3RldCBidWZmZXIgY29udGVudCBpcyBnb2luZyB0byBiZSBjaGFuZ2VkLgorICAgICAqIFNvIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gcHJlc2VydmUgYSByZWFkIGRhdGEgYnkKKyAgICAgKiBjbG9uaW5nLCBvciBwZXJmb3JtIG90aGVyIGFjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25CZWZvcmVPY3RldEJ1ZmZlck92ZXJ3cml0ZSgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvUXVhbGlmaWVkTmFtZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvUXVhbGlmaWVkTmFtZS5qYXZhCmluZGV4IDhmOGQyMmEuLjQ4OGNlMzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L1F1YWxpZmllZE5hbWUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9RdWFsaWZpZWROYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQ7CkBAIC01OSwxOCArMzIsMjAgQEAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiBwdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZSB7Ci0gICAgcHVibGljIGZpbmFsIFN0cmluZyBwcmVmaXg7Ci0gICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VOYW1lOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lOworICAgIHB1YmxpYyBTdHJpbmcgcHJlZml4OworICAgIHB1YmxpYyBTdHJpbmcgbmFtZXNwYWNlTmFtZTsKKyAgICBwdWJsaWMgU3RyaW5nIGxvY2FsTmFtZTsKICAgICBwdWJsaWMgU3RyaW5nIHFOYW1lOwotICAgIHB1YmxpYyBmaW5hbCBpbnQgaW5kZXg7Ci0gICAgcHVibGljIGZpbmFsIGludCBwcmVmaXhJbmRleDsKLSAgICBwdWJsaWMgZmluYWwgaW50IG5hbWVzcGFjZU5hbWVJbmRleDsKLSAgICBwdWJsaWMgZmluYWwgaW50IGxvY2FsTmFtZUluZGV4OworICAgIHB1YmxpYyBpbnQgaW5kZXg7CisgICAgcHVibGljIGludCBwcmVmaXhJbmRleDsKKyAgICBwdWJsaWMgaW50IG5hbWVzcGFjZU5hbWVJbmRleDsKKyAgICBwdWJsaWMgaW50IGxvY2FsTmFtZUluZGV4OwogICAgIHB1YmxpYyBpbnQgYXR0cmlidXRlSWQ7CiAgICAgcHVibGljIGludCBhdHRyaWJ1dGVIYXNoOwogICAgIHByaXZhdGUgUU5hbWUgcU5hbWVPYmplY3Q7CiAKKyAgICBwdWJsaWMgUXVhbGlmaWVkTmFtZSgpIHsgfQorCiAgICAgcHVibGljIFF1YWxpZmllZE5hbWUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgewogICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKICAgICAgICAgdGhpcy5uYW1lc3BhY2VOYW1lID0gbmFtZXNwYWNlTmFtZTsKQEAgLTgyLDYgKzU3LDE4IEBACiAgICAgICAgIHRoaXMubG9jYWxOYW1lSW5kZXggPSAtMTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgeworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VOYW1lID0gbmFtZXNwYWNlTmFtZTsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgIHRoaXMucU5hbWUgPSBxTmFtZTsKKyAgICAgICAgdGhpcy5pbmRleCA9IC0xOworICAgICAgICB0aGlzLnByZWZpeEluZGV4ID0gMDsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VOYW1lSW5kZXggPSAwOworICAgICAgICB0aGlzLmxvY2FsTmFtZUluZGV4ID0gLTE7CisgICAgICAgIHRoaXMucU5hbWVPYmplY3QgPSBudWxsOworICAgIH0KKwogICAgIHB1YmxpYyBRdWFsaWZpZWROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIGludCBpbmRleCkgewogICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKICAgICAgICAgdGhpcy5uYW1lc3BhY2VOYW1lID0gbmFtZXNwYWNlTmFtZTsKQEAgLTkzLDYgKzgwLDE5IEBACiAgICAgICAgIHRoaXMubG9jYWxOYW1lSW5kZXggPSAtMTsKICAgICB9CiAKKyAgICBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBzZXQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgaW50IGluZGV4KSB7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICB0aGlzLm5hbWVzcGFjZU5hbWUgPSBuYW1lc3BhY2VOYW1lOworICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHRoaXMucHJlZml4SW5kZXggPSAwOworICAgICAgICB0aGlzLm5hbWVzcGFjZU5hbWVJbmRleCA9IDA7CisgICAgICAgIHRoaXMubG9jYWxOYW1lSW5kZXggPSAtMTsKKyAgICAgICAgdGhpcy5xTmFtZU9iamVjdCA9IG51bGw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIHB1YmxpYyBRdWFsaWZpZWROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIGludCBpbmRleCwKICAgICAgICAgICAgIGludCBwcmVmaXhJbmRleCwgaW50IG5hbWVzcGFjZU5hbWVJbmRleCwgaW50IGxvY2FsTmFtZUluZGV4KSB7CiAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwpAQCAtMTA1LDYgKzEwNSwyMCBAQAogICAgICAgICB0aGlzLmxvY2FsTmFtZUluZGV4ID0gbG9jYWxOYW1lSW5kZXg7CiAgICAgfQogCisgICAgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgc2V0KFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIGludCBpbmRleCwKKyAgICAgICAgICAgIGludCBwcmVmaXhJbmRleCwgaW50IG5hbWVzcGFjZU5hbWVJbmRleCwgaW50IGxvY2FsTmFtZUluZGV4KSB7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICB0aGlzLm5hbWVzcGFjZU5hbWUgPSBuYW1lc3BhY2VOYW1lOworICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHRoaXMucHJlZml4SW5kZXggPSBwcmVmaXhJbmRleCArIDE7CisgICAgICAgIHRoaXMubmFtZXNwYWNlTmFtZUluZGV4ID0gbmFtZXNwYWNlTmFtZUluZGV4ICsgMTsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWVJbmRleCA9IGxvY2FsTmFtZUluZGV4OworICAgICAgICB0aGlzLnFOYW1lT2JqZWN0ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgcHVibGljIFF1YWxpZmllZE5hbWUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBsb2NhbE5hbWUpIHsKICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CiAgICAgICAgIHRoaXMubmFtZXNwYWNlTmFtZSA9IG5hbWVzcGFjZU5hbWU7CkBAIC0xMTYsNiArMTMwLDE5IEBACiAgICAgICAgIHRoaXMubG9jYWxOYW1lSW5kZXggPSAtMTsKICAgICB9CiAKKyAgICBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBzZXQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgIHRoaXMubmFtZXNwYWNlTmFtZSA9IG5hbWVzcGFjZU5hbWU7CisgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworICAgICAgICB0aGlzLnFOYW1lID0gY3JlYXRlUU5hbWVTdHJpbmcocHJlZml4LCBsb2NhbE5hbWUpOworICAgICAgICB0aGlzLmluZGV4ID0gLTE7CisgICAgICAgIHRoaXMucHJlZml4SW5kZXggPSAwOworICAgICAgICB0aGlzLm5hbWVzcGFjZU5hbWVJbmRleCA9IDA7CisgICAgICAgIHRoaXMubG9jYWxOYW1lSW5kZXggPSAtMTsKKyAgICAgICAgdGhpcy5xTmFtZU9iamVjdCA9IG51bGw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIHB1YmxpYyBRdWFsaWZpZWROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLAogICAgICAgICAgICAgaW50IHByZWZpeEluZGV4LCBpbnQgbmFtZXNwYWNlTmFtZUluZGV4LCBpbnQgbG9jYWxOYW1lSW5kZXgsCiAgICAgICAgICAgICBjaGFyW10gY2hhckJ1ZmZlcikgewpAQCAtMTQ1LDYgKzE3MiwzNyBAQAogICAgICAgICB0aGlzLmluZGV4ID0gLTE7CiAgICAgfQogCisgICAgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgc2V0KFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgaW50IHByZWZpeEluZGV4LCBpbnQgbmFtZXNwYWNlTmFtZUluZGV4LCBpbnQgbG9jYWxOYW1lSW5kZXgsCisgICAgICAgICAgICBjaGFyW10gY2hhckJ1ZmZlcikgeworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VOYW1lID0gbmFtZXNwYWNlTmFtZTsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisKKyAgICAgICAgaWYgKGNoYXJCdWZmZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgaW50IGwxID0gcHJlZml4Lmxlbmd0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IGwyID0gbG9jYWxOYW1lLmxlbmd0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IHRvdGFsID0gbDEgKyBsMiArIDE7CisgICAgICAgICAgICBpZiAodG90YWwgPCBjaGFyQnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHByZWZpeC5nZXRDaGFycygwLCBsMSwgY2hhckJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgY2hhckJ1ZmZlcltsMV0gPSAnOic7CisgICAgICAgICAgICAgICAgbG9jYWxOYW1lLmdldENoYXJzKDAsIGwyLCBjaGFyQnVmZmVyLCBsMSArIDEpOworICAgICAgICAgICAgICAgIHRoaXMucU5hbWUgPSBuZXcgU3RyaW5nKGNoYXJCdWZmZXIsIDAsIHRvdGFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5xTmFtZSA9IGNyZWF0ZVFOYW1lU3RyaW5nKHByZWZpeCwgbG9jYWxOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucU5hbWUgPSB0aGlzLmxvY2FsTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucHJlZml4SW5kZXggPSBwcmVmaXhJbmRleCArIDE7CisgICAgICAgIHRoaXMubmFtZXNwYWNlTmFtZUluZGV4ID0gbmFtZXNwYWNlTmFtZUluZGV4ICsgMTsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWVJbmRleCA9IGxvY2FsTmFtZUluZGV4OworICAgICAgICB0aGlzLmluZGV4ID0gLTE7CisgICAgICAgIHRoaXMucU5hbWVPYmplY3QgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKICAgICBwdWJsaWMgUXVhbGlmaWVkTmFtZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSwgaW50IGluZGV4KSB7CiAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwogICAgICAgICB0aGlzLm5hbWVzcGFjZU5hbWUgPSBuYW1lc3BhY2VOYW1lOwpAQCAtMTU2LDYgKzIxNCwxOSBAQAogICAgICAgICB0aGlzLmxvY2FsTmFtZUluZGV4ID0gLTE7CiAgICAgfQogCisgICAgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgc2V0KFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgIHRoaXMubmFtZXNwYWNlTmFtZSA9IG5hbWVzcGFjZU5hbWU7CisgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworICAgICAgICB0aGlzLnFOYW1lID0gY3JlYXRlUU5hbWVTdHJpbmcocHJlZml4LCBsb2NhbE5hbWUpOworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHRoaXMucHJlZml4SW5kZXggPSAwOworICAgICAgICB0aGlzLm5hbWVzcGFjZU5hbWVJbmRleCA9IDA7CisgICAgICAgIHRoaXMubG9jYWxOYW1lSW5kZXggPSAtMTsKKyAgICAgICAgdGhpcy5xTmFtZU9iamVjdCA9IG51bGw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIHB1YmxpYyBRdWFsaWZpZWROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLCBpbnQgaW5kZXgsCiAgICAgICAgICAgICBpbnQgcHJlZml4SW5kZXgsIGludCBuYW1lc3BhY2VOYW1lSW5kZXgsIGludCBsb2NhbE5hbWVJbmRleCkgewogICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKQEAgLTE2OCw2ICsyMzksMjAgQEAKICAgICAgICAgdGhpcy5sb2NhbE5hbWVJbmRleCA9IGxvY2FsTmFtZUluZGV4OwogICAgIH0KIAorICAgIHB1YmxpYyBmaW5hbCBRdWFsaWZpZWROYW1lIHNldChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSwgaW50IGluZGV4LAorICAgICAgICAgICAgaW50IHByZWZpeEluZGV4LCBpbnQgbmFtZXNwYWNlTmFtZUluZGV4LCBpbnQgbG9jYWxOYW1lSW5kZXgpIHsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgIHRoaXMubmFtZXNwYWNlTmFtZSA9IG5hbWVzcGFjZU5hbWU7CisgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworICAgICAgICB0aGlzLnFOYW1lID0gY3JlYXRlUU5hbWVTdHJpbmcocHJlZml4LCBsb2NhbE5hbWUpOworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHRoaXMucHJlZml4SW5kZXggPSBwcmVmaXhJbmRleCArIDE7CisgICAgICAgIHRoaXMubmFtZXNwYWNlTmFtZUluZGV4ID0gbmFtZXNwYWNlTmFtZUluZGV4ICsgMTsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWVJbmRleCA9IGxvY2FsTmFtZUluZGV4OworICAgICAgICB0aGlzLnFOYW1lT2JqZWN0ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgLy8gUXVhbGlmaWVkIE5hbWUgYXMgYSBOYW1lc3BhY2UgTmFtZQogICAgIHB1YmxpYyBRdWFsaWZpZWROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lKSB7CiAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwpAQCAtMTgwLDYgKzI2NSwxOSBAQAogICAgICAgICB0aGlzLmxvY2FsTmFtZUluZGV4ID0gLTE7CiAgICAgfQogCisgICAgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgc2V0KFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VOYW1lKSB7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICB0aGlzLm5hbWVzcGFjZU5hbWUgPSBuYW1lc3BhY2VOYW1lOworICAgICAgICB0aGlzLmxvY2FsTmFtZSA9ICIiOworICAgICAgICB0aGlzLnFOYW1lID0gIiI7CisgICAgICAgIHRoaXMuaW5kZXggPSAtMTsKKyAgICAgICAgdGhpcy5wcmVmaXhJbmRleCA9IDA7CisgICAgICAgIHRoaXMubmFtZXNwYWNlTmFtZUluZGV4ID0gMDsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWVJbmRleCA9IC0xOworICAgICAgICB0aGlzLnFOYW1lT2JqZWN0ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIFFOYW1lIGdldFFOYW1lKCkgewogICAgICAgICBpZiAocU5hbWVPYmplY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgcU5hbWVPYmplY3QgPSBuZXcgUU5hbWUobmFtZXNwYWNlTmFtZSwgbG9jYWxOYW1lLCBwcmVmaXgpOwpAQCAtMjAyLDcgKzMwMCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY3JlYXRlUU5hbWVTdHJpbmcoU3RyaW5nIHAsIFN0cmluZyBsKSB7Ci0gICAgICAgIGlmIChwICE9IG51bGwgJiYgcCAhPSAiIikgeworICAgICAgICBpZiAocCAhPSBudWxsICYmIHAubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIocCk7CiAgICAgICAgICAgICBiLmFwcGVuZCgnOicpOwogICAgICAgICAgICAgYi5hcHBlbmQobCk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9VbnBhcnNlZEVudGl0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvVW5wYXJzZWRFbnRpdHkuamF2YQppbmRleCBhZGFmNDI4Li42MjczOWIzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9VbnBhcnNlZEVudGl0eS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L1VucGFyc2VkRW50aXR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0OwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vQkFTRTY0RW5jb2RpbmdBbGdvcml0aG0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9CQVNFNjRFbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IDU3ZDVlYjMuLjNlYjcyYzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9CQVNFNjRFbmNvZGluZ0FsZ29yaXRobS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9CQVNFNjRFbmNvZGluZ0FsZ29yaXRobS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LmFsZ29yaXRobTsKIApAQCAtNjQsNyArMzYsNyBAQAogCiBwdWJsaWMgY2xhc3MgQkFTRTY0RW5jb2RpbmdBbGdvcml0aG0gZXh0ZW5kcyBCdWlsdEluRW5jb2RpbmdBbGdvcml0aG0gewogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIGVuY29kZUJhc2U2NFtdID0geworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGNoYXIgZW5jb2RlQmFzZTY0W10gPSB7CiAgICAgICAgICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywKICAgICAgICAgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLAogICAgICAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsCkBAIC03Miw3ICs0NCw3IEBACiAgICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJysnLCAnLycKICAgICB9OwogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgZGVjb2RlQmFzZTY0W10gPSB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IGRlY29kZUJhc2U2NFtdID0gewogICAgICAgICAvKicrJyovIDYyLAogICAgICAgICAtMSwgLTEsIC0xLAogICAgICAgICAvKicvJyovIDYzLApAQCAtMjEwLDIzICsxODIsNDYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBieXRlW10gdmFsdWUgPSAoYnl0ZVtdKSBkYXRhOwotICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDApIHsKKworICAgICAgICBjb252ZXJ0VG9DaGFyYWN0ZXJzKHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgsIHMpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UHJpbXRpdmVMZW5ndGhGcm9tT2N0ZXRMZW5ndGgoaW50IG9jdGV0TGVuZ3RoKSB0aHJvd3MgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gb2N0ZXRMZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPY3RldExlbmd0aEZyb21QcmltaXRpdmVMZW5ndGgoaW50IHByaW1pdGl2ZUxlbmd0aCkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlTGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZVRvQnl0ZXMoT2JqZWN0IGFycmF5LCBpbnQgYXN0YXJ0LCBpbnQgYWxlbmd0aCwgYnl0ZVtdIGIsIGludCBzdGFydCkgeworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KChieXRlW10pYXJyYXksIGFzdGFydCwgYiwgc3RhcnQsIGFsZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNvbnZlcnRUb0NoYXJhY3RlcnMoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzKSB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBieXRlW10gdmFsdWUgPSBkYXRhOworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIGludCBwYXJ0aWFsQmxvY2tMZW5ndGggPSB2YWx1ZS5sZW5ndGggJSAzOworICAgICAgICBmaW5hbCBpbnQgcGFydGlhbEJsb2NrTGVuZ3RoID0gbGVuZ3RoICUgMzsKICAgICAgICAgZmluYWwgaW50IGJsb2NrQ291bnQgPSAocGFydGlhbEJsb2NrTGVuZ3RoICE9IDApID8KLSAgICAgICAgICAgIHZhbHVlLmxlbmd0aCAvIDMgKyAxIDoKLSAgICAgICAgICAgIHZhbHVlLmxlbmd0aCAvIDM7CisgICAgICAgICAgICBsZW5ndGggLyAzICsgMSA6CisgICAgICAgICAgICBsZW5ndGggLyAzOwogCiAgICAgICAgIGZpbmFsIGludCBlbmNvZGVkTGVuZ3RoID0gYmxvY2tDb3VudCAqIDQ7Ci0gICAgICAgIHMuZW5zdXJlQ2FwYWNpdHkoZW5jb2RlZExlbmd0aCk7CisgICAgICAgIGZpbmFsIGludCBvcmlnaW5hbEJ1ZmZlclNpemUgPSBzLmxlbmd0aCgpOworICAgICAgICBzLmVuc3VyZUNhcGFjaXR5KGVuY29kZWRMZW5ndGggKyBvcmlnaW5hbEJ1ZmZlclNpemUpOwogCi0gICAgICAgIGludCBpZHggPSAwOworICAgICAgICBpbnQgaWR4ID0gb2Zmc2V0OworICAgICAgICBpbnQgbGFzdElkeCA9IG9mZnNldCArIGxlbmd0aDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja0NvdW50OyArK2kpIHsKICAgICAgICAgICAgIGludCBiMSA9IHZhbHVlW2lkeCsrXSAmIDB4RkY7Ci0gICAgICAgICAgICBpbnQgYjIgPSAoaWR4IDwgdmFsdWUubGVuZ3RoKSA/IHZhbHVlW2lkeCsrXSAmIDB4RkYgOiAwOwotICAgICAgICAgICAgaW50IGIzID0gKGlkeCA8IHZhbHVlLmxlbmd0aCkgPyB2YWx1ZVtpZHgrK10gJiAweEZGIDogMDsKKyAgICAgICAgICAgIGludCBiMiA9IChpZHggPCBsYXN0SWR4KSA/IHZhbHVlW2lkeCsrXSAmIDB4RkYgOiAwOworICAgICAgICAgICAgaW50IGIzID0gKGlkeCA8IGxhc3RJZHgpID8gdmFsdWVbaWR4KytdICYgMHhGRiA6IDA7CiAKICAgICAgICAgICAgIHMuYXBwZW5kKGVuY29kZUJhc2U2NFtiMSA+PiAyXSk7CiAKQEAgLTIzOSwyNiArMjM0LDEyIEBACiAKICAgICAgICAgc3dpdGNoIChwYXJ0aWFsQmxvY2tMZW5ndGgpIHsKICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgcy5zZXRDaGFyQXQoZW5jb2RlZExlbmd0aCAtIDEsICc9Jyk7Ci0gICAgICAgICAgICAgICAgcy5zZXRDaGFyQXQoZW5jb2RlZExlbmd0aCAtIDIsICc9Jyk7CisgICAgICAgICAgICAgICAgcy5zZXRDaGFyQXQob3JpZ2luYWxCdWZmZXJTaXplICsgZW5jb2RlZExlbmd0aCAtIDEsICc9Jyk7CisgICAgICAgICAgICAgICAgcy5zZXRDaGFyQXQob3JpZ2luYWxCdWZmZXJTaXplICsgZW5jb2RlZExlbmd0aCAtIDIsICc9Jyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgIHMuc2V0Q2hhckF0KGVuY29kZWRMZW5ndGggLSAxLCAnPScpOworICAgICAgICAgICAgICAgIHMuc2V0Q2hhckF0KG9yaWdpbmFsQnVmZmVyU2l6ZSArIGVuY29kZWRMZW5ndGggLSAxLCAnPScpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotCi0KLQotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UHJpbXRpdmVMZW5ndGhGcm9tT2N0ZXRMZW5ndGgoaW50IG9jdGV0TGVuZ3RoKSB0aHJvd3MgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gb2N0ZXRMZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRPY3RldExlbmd0aEZyb21QcmltaXRpdmVMZW5ndGgoaW50IHByaW1pdGl2ZUxlbmd0aCkgewotICAgICAgICByZXR1cm4gcHJpbWl0aXZlTGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZVRvQnl0ZXMoT2JqZWN0IGFycmF5LCBpbnQgYXN0YXJ0LCBpbnQgYWxlbmd0aCwgYnl0ZVtdIGIsIGludCBzdGFydCkgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KChieXRlW10pYXJyYXksIGFzdGFydCwgYiwgc3RhcnQsIGFsZW5ndGgpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9Cb29sZWFuRW5jb2RpbmdBbGdvcml0aG0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9Cb29sZWFuRW5jb2RpbmdBbGdvcml0aG0uamF2YQppbmRleCA3YjA1MGQzLi5mNjA0NjkxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vQm9vbGVhbkVuY29kaW5nQWxnb3JpdGhtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0Jvb2xlYW5FbmNvZGluZ0FsZ29yaXRobS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LmFsZ29yaXRobTsKIApAQCAtMTMyLDcgKzEwNCw3IEBACiAKICAgICAgICAgICAgIHdoaWxlKGJpdFBvc2l0aW9uIDwgYml0UG9zaXRpb25FbmQpIHsKICAgICAgICAgICAgICAgICBib29sZWFuTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbigodmFsdWUgJiBCSVRfVEFCTEVbYml0UG9zaXRpb24rK10pID4gMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi52YWx1ZU9mKCh2YWx1ZSAmIEJJVF9UQUJMRVtiaXRQb3NpdGlvbisrXSkgPiAwKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVOZXh0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0J1aWx0SW5FbmNvZGluZ0FsZ29yaXRobS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0J1aWx0SW5FbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IGUwOTE4ZmQuLjZlMTJkMTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9CdWlsdEluRW5jb2RpbmdBbGdvcml0aG0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vQnVpbHRJbkVuY29kaW5nQWxnb3JpdGhtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuYWxnb3JpdGhtOwogCkBAIC04Niw3ICs1OCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpID0gbS5lbmQoKTsKICAgICAgICAgfQotICAgICAgICB3bC53b3JkKGksIGNiLmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKGkgIT0gY2IubGVuZ3RoKCkpCisgICAgICAgICAgICB3bC53b3JkKGksIGNiLmxlbmd0aCgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIHJlbW92ZVdoaXRlc3BhY2UoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9CdWlsdEluRW5jb2RpbmdBbGdvcml0aG1GYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vQnVpbHRJbkVuY29kaW5nQWxnb3JpdGhtRmFjdG9yeS5qYXZhCmluZGV4IGYwNDgyZDIuLjc3Y2RiMWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9CdWlsdEluRW5jb2RpbmdBbGdvcml0aG1GYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0J1aWx0SW5FbmNvZGluZ0FsZ29yaXRobUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5hbGdvcml0aG07CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9CdWlsdEluRW5jb2RpbmdBbGdvcml0aG1TdGF0ZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0J1aWx0SW5FbmNvZGluZ0FsZ29yaXRobVN0YXRlLmphdmEKaW5kZXggZDg0Y2NjYS4uYjA2MWIxOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0J1aWx0SW5FbmNvZGluZ0FsZ29yaXRobVN0YXRlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0J1aWx0SW5FbmNvZGluZ0FsZ29yaXRobVN0YXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuYWxnb3JpdGhtOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vRG91YmxlRW5jb2RpbmdBbGdvcml0aG0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9Eb3VibGVFbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IGE1MDk3OTMuLjBmNmU0YmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9Eb3VibGVFbmNvZGluZ0FsZ29yaXRobS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9Eb3VibGVFbmNvZGluZ0FsZ29yaXRobS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LmFsZ29yaXRobTsKIApAQCAtNzMsNyArNDUsNyBAQAogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UHJpbXRpdmVMZW5ndGhGcm9tT2N0ZXRMZW5ndGgoaW50IG9jdGV0TGVuZ3RoKSB0aHJvd3MgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24gewogICAgICAgICBpZiAob2N0ZXRMZW5ndGggJSBET1VCTEVfU0laRSAhPSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLmxlbmd0aElzTm90TXVsdGlwbGVPZkRvdWJsZSIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihET1VCTEVfU0laRSl9KSk7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5sZW5ndGhJc05vdE11bHRpcGxlT2ZEb3VibGUiLCBuZXcgT2JqZWN0W117SW50ZWdlci52YWx1ZU9mKERPVUJMRV9TSVpFKX0pKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBvY3RldExlbmd0aCAvIERPVUJMRV9TSVpFOwpAQCAtMTEzLDcgKzg1LDcgQEAKICAgICAgICAgICAgICAgICBuZXcgV29yZExpc3RlbmVyKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgd29yZChpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgZlN0cmluZ1ZhbHVlID0gY2Iuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBkb3VibGVMaXN0LmFkZChGbG9hdC52YWx1ZU9mKGZTdHJpbmdWYWx1ZSkpOworICAgICAgICAgICAgICAgIGRvdWJsZUxpc3QuYWRkKERvdWJsZS52YWx1ZU9mKGZTdHJpbmdWYWx1ZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICk7CkBAIC0xNjgsMTcgKzE0MCwxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmluYWwgaW50IGJpdHMgPQotICAgICAgICAgICAgICAgICAgICAoKGJbMF0gJiAweEZGKSA8PCA1NikgfAotICAgICAgICAgICAgICAgICAgICAoKGJbMV0gJiAweEZGKSA8PCA0OCkgfAotICAgICAgICAgICAgICAgICAgICAoKGJbMl0gJiAweEZGKSA8PCA0MCkgfAotICAgICAgICAgICAgICAgICAgICAoKGJbM10gJiAweEZGKSA8PCAzMikgfAorICAgICAgICAgICAgZmluYWwgbG9uZyBiaXRzID0KKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShiWzBdICYgMHhGRikgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShiWzFdICYgMHhGRikgPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShiWzJdICYgMHhGRikgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShiWzNdICYgMHhGRikgPDwgMzIpIHwKICAgICAgICAgICAgICAgICAgICAgKChiWzRdICYgMHhGRikgPDwgMjQpIHwKICAgICAgICAgICAgICAgICAgICAgKChiWzVdICYgMHhGRikgPDwgMTYpIHwKICAgICAgICAgICAgICAgICAgICAgKChiWzZdICYgMHhGRikgPDwgOCkgfAogICAgICAgICAgICAgICAgICAgICAoYls3XSAmIDB4RkYpOwogCi0gICAgICAgICAgICBkb3VibGVMaXN0LmFkZChuZXcgRG91YmxlKERvdWJsZS5sb25nQml0c1RvRG91YmxlKGJpdHMpKSk7CisgICAgICAgICAgICBkb3VibGVMaXN0LmFkZChEb3VibGUudmFsdWVPZihEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShiaXRzKSkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQXJyYXlGcm9tTGlzdChkb3VibGVMaXN0KTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9GbG9hdEVuY29kaW5nQWxnb3JpdGhtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vRmxvYXRFbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IDdhNmVjMDUuLjMzMWFiYjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9GbG9hdEVuY29kaW5nQWxnb3JpdGhtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0Zsb2F0RW5jb2RpbmdBbGdvcml0aG0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5hbGdvcml0aG07CiAKQEAgLTczLDcgKzQ1LDcgQEAKICAgICBwdWJsaWMgZmluYWwgaW50IGdldFByaW10aXZlTGVuZ3RoRnJvbU9jdGV0TGVuZ3RoKGludCBvY3RldExlbmd0aCkgdGhyb3dzIEVuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG9jdGV0TGVuZ3RoICUgRkxPQVRfU0laRSAhPSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLmxlbmd0aE5vdE11bHRpcGxlT2ZGbG9hdCIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihGTE9BVF9TSVpFKX0pKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLmxlbmd0aE5vdE11bHRpcGxlT2ZGbG9hdCIsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YoRkxPQVRfU0laRSl9KSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gb2N0ZXRMZW5ndGggLyBGTE9BVF9TSVpFOwpAQCAtMTY3LDcgKzEzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICgoYlsxXSAmIDB4RkYpIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAgICgoYlsyXSAmIDB4RkYpIDw8IDgpIHwKICAgICAgICAgICAgICAgICAgICAgKGJbM10gJiAweEZGKTsKLSAgICAgICAgICAgIGZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KEZsb2F0LmludEJpdHNUb0Zsb2F0KGJpdHMpKSk7CisgICAgICAgICAgICBmbG9hdExpc3QuYWRkKEZsb2F0LnZhbHVlT2YoRmxvYXQuaW50Qml0c1RvRmxvYXQoYml0cykpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBnZW5lcmF0ZUFycmF5RnJvbUxpc3QoZmxvYXRMaXN0KTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9IZXhhZGVjaW1hbEVuY29kaW5nQWxnb3JpdGhtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vSGV4YWRlY2ltYWxFbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IDQ3NDhkMmUuLjVlY2ZlYmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9IZXhhZGVjaW1hbEVuY29kaW5nQWxnb3JpdGhtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0hleGFkZWNpbWFsRW5jb2RpbmdBbGdvcml0aG0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5hbGdvcml0aG07CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9JRUVFNzU0RmxvYXRpbmdQb2ludEVuY29kaW5nQWxnb3JpdGhtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vSUVFRTc1NEZsb2F0aW5nUG9pbnRFbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IDVkOThhNjEuLmNhNDA2ZWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9JRUVFNzU0RmxvYXRpbmdQb2ludEVuY29kaW5nQWxnb3JpdGhtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0lFRUU3NTRGbG9hdGluZ1BvaW50RW5jb2RpbmdBbGdvcml0aG0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5hbGdvcml0aG07CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9JbnRFbmNvZGluZ0FsZ29yaXRobS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0ludEVuY29kaW5nQWxnb3JpdGhtLmphdmEKaW5kZXggNWE2ZjQ5Yi4uMWE5MjFmNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0ludEVuY29kaW5nQWxnb3JpdGhtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0ludEVuY29kaW5nQWxnb3JpdGhtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuYWxnb3JpdGhtOwogCkBAIC03Myw3ICs0NSw3IEBACiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQcmltdGl2ZUxlbmd0aEZyb21PY3RldExlbmd0aChpbnQgb2N0ZXRMZW5ndGgpIHRocm93cyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChvY3RldExlbmd0aCAlIElOVF9TSVpFICE9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLgotICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoIm1lc3NhZ2UubGVuZ3RoTm90TXVsdGlwbGVPZkludCIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihJTlRfU0laRSl9KSk7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5sZW5ndGhOb3RNdWx0aXBsZU9mSW50IiwgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihJTlRfU0laRSl9KSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gb2N0ZXRMZW5ndGggLyBJTlRfU0laRTsKQEAgLTE2Nyw3ICsxMzksNyBAQAogICAgICAgICAgICAgICAgICAgICAoKGJbMV0gJiAweEZGKSA8PCAxNikgfAogICAgICAgICAgICAgICAgICAgICAoKGJbMl0gJiAweEZGKSA8PCA4KSB8CiAgICAgICAgICAgICAgICAgICAgIChiWzNdICYgMHhGRik7Ci0gICAgICAgICAgICBpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgaW50ZWdlckxpc3QuYWRkKEludGVnZXIudmFsdWVPZihpKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZ2VuZXJhdGVBcnJheUZyb21MaXN0KGludGVnZXJMaXN0KTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9JbnRlZ2VyRW5jb2RpbmdBbGdvcml0aG0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9JbnRlZ2VyRW5jb2RpbmdBbGdvcml0aG0uamF2YQppbmRleCAzOGIwNzk0Li42OWIyMDViIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vSW50ZWdlckVuY29kaW5nQWxnb3JpdGhtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0ludGVnZXJFbmNvZGluZ0FsZ29yaXRobS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LmFsZ29yaXRobTsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0xvbmdFbmNvZGluZ0FsZ29yaXRobS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL0xvbmdFbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IGNiM2Y5MzAuLjYxZjE4NjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9Mb25nRW5jb2RpbmdBbGdvcml0aG0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vTG9uZ0VuY29kaW5nQWxnb3JpdGhtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuYWxnb3JpdGhtOwogCkBAIC03Miw3ICs0NCw3IEBACiAgICAgcHVibGljIGludCBnZXRQcmltdGl2ZUxlbmd0aEZyb21PY3RldExlbmd0aChpbnQgb2N0ZXRMZW5ndGgpIHRocm93cyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChvY3RldExlbmd0aCAlIExPTkdfU0laRSAhPSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLmxlbmd0aE5vdE11bHRpcGxlT2ZMb25nIiwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKExPTkdfU0laRSl9KSk7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5sZW5ndGhOb3RNdWx0aXBsZU9mTG9uZyIsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YoTE9OR19TSVpFKX0pKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBvY3RldExlbmd0aCAvIExPTkdfU0laRTsKQEAgLTE2NywxNiArMTM5LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmaW5hbCBpbnQgbCA9Ci0gICAgICAgICAgICAgICAgICAgICgoYlswXSAmIDB4RkYpIDw8IDU2KSB8Ci0gICAgICAgICAgICAgICAgICAgICgoYlsxXSAmIDB4RkYpIDw8IDQ4KSB8Ci0gICAgICAgICAgICAgICAgICAgICgoYlsyXSAmIDB4RkYpIDw8IDQwKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoYlszXSAmIDB4RkYpIDw8IDMyKSB8CisgICAgICAgICAgICBmaW5hbCBsb25nIGwgPQorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGJbMF0gJiAweEZGKSA8PCA1NikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGJbMV0gJiAweEZGKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGJbMl0gJiAweEZGKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGJbM10gJiAweEZGKSA8PCAzMikgfAogICAgICAgICAgICAgICAgICAgICAoKGJbNF0gJiAweEZGKSA8PCAyNCkgfAogICAgICAgICAgICAgICAgICAgICAoKGJbNV0gJiAweEZGKSA8PCAxNikgfAogICAgICAgICAgICAgICAgICAgICAoKGJbNl0gJiAweEZGKSA8PCA4KSB8CiAgICAgICAgICAgICAgICAgICAgIChiWzddICYgMHhGRik7Ci0gICAgICAgICAgICBsb25nTGlzdC5hZGQobmV3IExvbmcobCkpOworICAgICAgICAgICAgbG9uZ0xpc3QuYWRkKExvbmcudmFsdWVPZihsKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZ2VuZXJhdGVBcnJheUZyb21MaXN0KGxvbmdMaXN0KTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9TaG9ydEVuY29kaW5nQWxnb3JpdGhtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vU2hvcnRFbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IGMzMjhmY2UuLjRmYjA1YmMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9TaG9ydEVuY29kaW5nQWxnb3JpdGhtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL1Nob3J0RW5jb2RpbmdBbGdvcml0aG0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5hbGdvcml0aG07CiAKQEAgLTc4LDcgKzUwLDcgQEAKICAgICBwdWJsaWMgZmluYWwgaW50IGdldFByaW10aXZlTGVuZ3RoRnJvbU9jdGV0TGVuZ3RoKGludCBvY3RldExlbmd0aCkgdGhyb3dzIEVuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG9jdGV0TGVuZ3RoICUgU0hPUlRfU0laRSAhPSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLmxlbmd0aE5vdE11bHRpcGxlT2ZTaG9ydCIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihTSE9SVF9TSVpFKX0pKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLmxlbmd0aE5vdE11bHRpcGxlT2ZTaG9ydCIsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YoU0hPUlRfU0laRSl9KSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gb2N0ZXRMZW5ndGggLyBTSE9SVF9TSVpFOwpAQCAtMTY4LDcgKzE0MCw3IEBACiAKICAgICAgICAgICAgIGZpbmFsIGludCBpID0gKChiWzBdICYgMHhGRikgPDwgOCkgfAogICAgICAgICAgICAgICAgICAgICAoYlsxXSAmIDB4RkYpOwotICAgICAgICAgICAgc2hvcnRMaXN0LmFkZChuZXcgU2hvcnQoKHNob3J0KWkpKTsKKyAgICAgICAgICAgIHNob3J0TGlzdC5hZGQoU2hvcnQudmFsdWVPZigoc2hvcnQpaSkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQXJyYXlGcm9tTGlzdChzaG9ydExpc3QpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL1VVSURFbmNvZGluZ0FsZ29yaXRobS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxnb3JpdGhtL1VVSURFbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IGE0ZTA3OTYuLjkzZjk2MTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FsZ29yaXRobS9VVUlERW5jb2RpbmdBbGdvcml0aG0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbGdvcml0aG0vVVVJREVuY29kaW5nQWxnb3JpdGhtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LmFsZ29yaXRobTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC02Niw3ICszOCw3IEBACiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQcmltdGl2ZUxlbmd0aEZyb21PY3RldExlbmd0aChpbnQgb2N0ZXRMZW5ndGgpIHRocm93cyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChvY3RldExlbmd0aCAlIChMT05HX1NJWkUgKiAyKSAhPSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLmxlbmd0aE5vdE11bHRpcGxlT2ZVVUlEIixuZXcgT2JqZWN0W117bmV3IEludGVnZXIoTE9OR19TSVpFICogMil9KSk7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5sZW5ndGhOb3RNdWx0aXBsZU9mVVVJRCIsbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihMT05HX1NJWkUgKiAyKX0pKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBvY3RldExlbmd0aCAvIExPTkdfU0laRTsKQEAgLTgxLDggKzUzLDggQEAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdvcmQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHV1aWRWYWx1ZSA9IGNiLnN1YlNlcXVlbmNlKHN0YXJ0LCBlbmQpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgZnJvbVVVSURTdHJpbmcodXVpZFZhbHVlKTsKLSAgICAgICAgICAgICAgICBsb25nTGlzdC5hZGQobmV3IExvbmcoX21zYikpOwotICAgICAgICAgICAgICAgIGxvbmdMaXN0LmFkZChuZXcgTG9uZyhfbHNiKSk7CisgICAgICAgICAgICAgICAgbG9uZ0xpc3QuYWRkKExvbmcudmFsdWVPZihfbXNiKSk7CisgICAgICAgICAgICAgICAgbG9uZ0xpc3QuYWRkKExvbmcudmFsdWVPZihfbHNiKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FscGhhYmV0L0J1aWx0SW5SZXN0cmljdGVkQWxwaGFiZXRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9hbHBoYWJldC9CdWlsdEluUmVzdHJpY3RlZEFscGhhYmV0cy5qYXZhCmluZGV4IDE4ZTE5ZTQuLjA5YTM2ZjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2FscGhhYmV0L0J1aWx0SW5SZXN0cmljdGVkQWxwaGFiZXRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvYWxwaGFiZXQvQnVpbHRJblJlc3RyaWN0ZWRBbHBoYWJldHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5hbHBoYWJldDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvZG9tL0RPTURvY3VtZW50UGFyc2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9kb20vRE9NRG9jdW1lbnRQYXJzZXIuamF2YQppbmRleCAzMDc2ZGNiLi5mYmZjMGYxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9kb20vRE9NRG9jdW1lbnRQYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9kb20vRE9NRG9jdW1lbnRQYXJzZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuZG9tOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuRGVjb2RlcjsKQEAgLTE3NSw3ICsxNDcsOCBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkVJSV9MSVRFUkFMOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgUXVhbGlmaWVkTmFtZSBxbiA9IHByb2Nlc3NMaXRlcmFsUXVhbGlmaWVkTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5MSVRFUkFMX1FOQU1FX1BSRUZJWF9OQU1FU1BBQ0VfTkFNRV9NQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5MSVRFUkFMX1FOQU1FX1BSRUZJWF9OQU1FU1BBQ0VfTkFNRV9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZWxlbWVudE5hbWVUYWJsZS5nZXROZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICBfZWxlbWVudE5hbWVUYWJsZS5hZGQocW4pOwogICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRUlJKHFuLCAoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURV9GTEFHKSA+IDApOwogICAgICAgICAgICAgICAgICAgICBmaXJzdEVsZW1lbnRIYXNPY2N1cmVkID0gdHJ1ZTsKQEAgLTIwMSw3ICsxNzQsNiBAQAogICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX2IgPT0gRW5jb2RpbmdDb25zdGFudHMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGRlY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOSVNUUklOR19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhID0gbmV3IFN0cmluZyhfY2hhckJ1ZmZlciwgMCwgX2NoYXJCdWZmZXJMZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2FkZFRvVGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92Lm90aGVyU3RyaW5nLmFkZChuZXcgQ2hhckFycmF5KF9jaGFyQnVmZmVyLCAwLCBfY2hhckJ1ZmZlckxlbmd0aCwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMTQsNyArMjg2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5ET0NVTUVOVF9WRVJTSU9OX0ZMQUcpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBkZWNvZGVWZXJzaW9uKCk7CisgICAgICAgICAgICBkZWNvZGVWZXJzaW9uKCk7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVE9ETwogICAgICAgICAgICAgICogaG93IHRvIHJlcG9ydCB0aGUgZG9jdW1lbnQgdmVyc2lvbj8KQEAgLTM2Myw3ICszMzUsOCBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkVJSV9MSVRFUkFMOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgUXVhbGlmaWVkTmFtZSBxbiA9IHByb2Nlc3NMaXRlcmFsUXVhbGlmaWVkTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5MSVRFUkFMX1FOQU1FX1BSRUZJWF9OQU1FU1BBQ0VfTkFNRV9NQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5MSVRFUkFMX1FOQU1FX1BSRUZJWF9OQU1FU1BBQ0VfTkFNRV9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZWxlbWVudE5hbWVUYWJsZS5nZXROZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICBfZWxlbWVudE5hbWVUYWJsZS5hZGQocW4pOwogICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRUlJKHFuLCAoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURV9GTEFHKSA+IDApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM3NSwyMyArMzQ4LDEzIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSAoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5PQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfU01BTExfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICsgMTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBkZWNvZGVVdGY4U3RyaW5nQXNTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChfYiAmIEVuY29kaW5nQ29uc3RhbnRzLkNIQVJBQ1RFUl9DSFVOS19BRERfVE9fVEFCTEVfRkxBRykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuYWRkKF9jaGFyQnVmZmVyLCBfY2hhckJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBfY3VycmVudE5vZGUuYXBwZW5kQ2hpbGQoX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKHYpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1V0ZjhDaGFyYWN0ZXJTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9VVEY4X01FRElVTV9MRU5HVEg6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSByZWFkKCkgKyBFbmNvZGluZ0NvbnN0YW50cy5PQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfU01BTExfTElNSVQ7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gZGVjb2RlVXRmOFN0cmluZ0FzU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTktfQUREX1RPX1RBQkxFX0ZMQUcpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLmFkZChfY2hhckJ1ZmZlciwgX2NoYXJCdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlLmFwcGVuZENoaWxkKF9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2KSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NVdGY4Q2hhcmFjdGVyU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfVVRGOF9MQVJHRV9MRU5HVEg6CkBAIC00MDEsMTIgKzM2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDgpIHwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoKTsKICAgICAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoICs9IEVuY29kaW5nQ29uc3RhbnRzLk9DVEVUX1NUUklOR19MRU5HVEhfN1RIX0JJVF9NRURJVU1fTElNSVQ7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gZGVjb2RlVXRmOFN0cmluZ0FzU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTktfQUREX1RPX1RBQkxFX0ZMQUcpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLmFkZChfY2hhckJ1ZmZlciwgX2NoYXJCdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlLmFwcGVuZENoaWxkKF9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2KSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NVdGY4Q2hhcmFjdGVyU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfVVRGMTZfU01BTExfTEVOR1RIOgpAQCAtNTU0LDYgKzUxMiwyMSBAQAogICAgICAgICBfY3VycmVudE5vZGUgPSBwYXJlbnRDdXJyZW50Tm9kZTsKICAgICB9CiAKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc1V0ZjhDaGFyYWN0ZXJTdHJpbmcoKSB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKChfYiAmIEVuY29kaW5nQ29uc3RhbnRzLkNIQVJBQ1RFUl9DSFVOS19BRERfVE9fVEFCTEVfRkxBRykgPiAwKSB7CisgICAgICAgICAgICBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuZW5zdXJlU2l6ZShfb2N0ZXRCdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgZmluYWwgaW50IGNoYXJhY3RlcnNPZmZzZXQgPSBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuX2FycmF5SW5kZXg7CisgICAgICAgICAgICBkZWNvZGVVdGY4U3RyaW5nQXNDaGFyQnVmZmVyKF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fYXJyYXksIGNoYXJhY3RlcnNPZmZzZXQpOworICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLmFkZChfY2hhckJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICBfY3VycmVudE5vZGUuYXBwZW5kQ2hpbGQoX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKAorICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuZ2V0U3RyaW5nKF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fY2FjaGVkSW5kZXgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWNvZGVVdGY4U3RyaW5nQXNDaGFyQnVmZmVyKCk7CisgICAgICAgICAgICBfY3VycmVudE5vZGUuYXBwZW5kQ2hpbGQoX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKF9jaGFyQnVmZmVyLCAwLCBfY2hhckJ1ZmZlckxlbmd0aCkpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NFSUlXaXRoTmFtZXNwYWNlcygpIHRocm93cyBGYXN0SW5mb3NldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBib29sZWFuIGhhc0F0dHJpYnV0ZXMgPSAoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURV9GTEFHKSA+IDA7CiAKQEAgLTYwOCw3ICs1ODEsNyBAQAogICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nT25GaXJzdEJpdEFzUHJlZml4KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgYSA9IGNyZWF0ZUF0dHJpYnV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ0NvbnN0YW50cy5YTUxOU19OQU1FU1BBQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVRdWFsaWZpZWROYW1lU3RyaW5nKEVuY29kaW5nQ29uc3RhbnRzLlhNTE5TX05BTUVTUEFDRV9QUkVGSVhfQ0hBUlMsIHByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUXVhbGlmaWVkTmFtZVN0cmluZyhYTUxOU19OQU1FU1BBQ0VfUFJFRklYX0NIQVJTLCBwcmVmaXgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCk7CiAgICAgICAgICAgICAgICAgICAgIGEuc2V0VmFsdWUgKCIiKTsKIApAQCAtNjIxLDcgKzU5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0QXNQcmVmaXgodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGEgPSBjcmVhdGVBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdDb25zdGFudHMuWE1MTlNfTkFNRVNQQUNFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUXVhbGlmaWVkTmFtZVN0cmluZyhFbmNvZGluZ0NvbnN0YW50cy5YTUxOU19OQU1FU1BBQ0VfUFJFRklYX0NIQVJTLCBwcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVF1YWxpZmllZE5hbWVTdHJpbmcoWE1MTlNfTkFNRVNQQUNFX1BSRUZJWF9DSEFSUywgcHJlZml4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgpOwogICAgICAgICAgICAgICAgICAgICBhLnNldFZhbHVlIChkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nT25GaXJzdEJpdEFzTmFtZXNwYWNlTmFtZSh0cnVlKSk7CiAKQEAgLTY1NCw3ICs2MjcsOCBAQAogICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuRUlJX0xJVEVSQUw6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZmluYWwgUXVhbGlmaWVkTmFtZSBxbiA9IHByb2Nlc3NMaXRlcmFsUXVhbGlmaWVkTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYiAmIEVuY29kaW5nQ29uc3RhbnRzLkxJVEVSQUxfUU5BTUVfUFJFRklYX05BTUVTUEFDRV9OQU1FX01BU0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZWxlbWVudE5hbWVUYWJsZS5nZXROZXh0KCkpOwogICAgICAgICAgICAgICAgIF9lbGVtZW50TmFtZVRhYmxlLmFkZChxbik7CiAgICAgICAgICAgICAgICAgcHJvY2Vzc0VJSShxbiwgaGFzQXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02NzAsNyArNjQ0LDUxIEBACiAKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgUXVhbGlmaWVkTmFtZSBwcm9jZXNzTGl0ZXJhbFF1YWxpZmllZE5hbWUoaW50IHN0YXRlKSB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUXVhbGlmaWVkTmFtZSBwcm9jZXNzTGl0ZXJhbFF1YWxpZmllZE5hbWUoaW50IHN0YXRlLCBRdWFsaWZpZWROYW1lIHEpCisgICAgdGhyb3dzIEZhc3RJbmZvc2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChxID09IG51bGwpIHEgPSBuZXcgUXVhbGlmaWVkTmFtZSgpOworCisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIC8vIG5vIHByZWZpeCwgbm8gbmFtZXNwYWNlCisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHEuc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nT25GaXJzdEJpdChfdi5sb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAvLyBubyBwcmVmaXgsIG5hbWVzcGFjZQorICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBxLnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVJZGVudGlmeWluZ05vbkVtcHR5U3RyaW5nSW5kZXhPbkZpcnN0Qml0QXNOYW1lc3BhY2VOYW1lKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KF92LmxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VOYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBfaWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgLy8gcHJlZml4LCBubyBuYW1lc3BhY2UKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UucU5hbWVNaXNzaW5nTmFtZXNwYWNlTmFtZSIpKTsKKyAgICAgICAgICAgIC8vIHByZWZpeCwgbmFtZXNwYWNlCisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHEuc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ0luZGV4T25GaXJzdEJpdEFzUHJlZml4KHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ0luZGV4T25GaXJzdEJpdEFzTmFtZXNwYWNlTmFtZSh0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KF92LmxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBfcHJlZml4SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlTmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgX2lkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBfY2hhckJ1ZmZlcik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5kZWNvZGluZ0VJSSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBRdWFsaWZpZWROYW1lIHByb2Nlc3NMaXRlcmFsUXVhbGlmaWVkTmFtZShpbnQgc3RhdGUpCisgICAgdGhyb3dzIEZhc3RJbmZvc2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICAgICAgIC8vIG5vIHByZWZpeCwgbm8gbmFtZXNwYWNlCiAgICAgICAgICAgICBjYXNlIDA6CkBAIC03NDIsNyArNzYwLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQUlJX0xJVEVSQUw6CiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwcm9jZXNzTGl0ZXJhbFF1YWxpZmllZE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAmIEVuY29kaW5nQ29uc3RhbnRzLkxJVEVSQUxfUU5BTUVfUFJFRklYX05BTUVTUEFDRV9OQU1FX01BU0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgJiBFbmNvZGluZ0NvbnN0YW50cy5MSVRFUkFMX1FOQU1FX1BSRUZJWF9OQU1FU1BBQ0VfTkFNRV9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVOYW1lVGFibGUuZ2V0TmV4dCgpKTsKICAgICAgICAgICAgICAgICAgICAgbmFtZS5jcmVhdGVBdHRyaWJ1dGVWYWx1ZXMoX2R1cGxpY2F0ZUF0dHJpYnV0ZVZlcmlmaWVyLk1BUF9TSVpFKTsKICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZU5hbWVUYWJsZS5hZGQobmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvZG9tL0RPTURvY3VtZW50U2VyaWFsaXplci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvZG9tL0RPTURvY3VtZW50U2VyaWFsaXplci5qYXZhCmluZGV4IDhiOGUzNWMuLjdiMjczMzIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L2RvbS9ET01Eb2N1bWVudFNlcmlhbGl6ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9kb20vRE9NRG9jdW1lbnRTZXJpYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNDIgKzI1LDE2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5kb207CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5FbmNvZGVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LkVuY29kaW5nQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LlF1YWxpZmllZE5hbWU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbC5OYW1lc3BhY2VDb250ZXh0SW1wbGVtZW50YXRpb247CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbC5Mb2NhbE5hbWVRdWFsaWZpZWROYW1lc01hcDsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5GYXN0SW5mb3NldEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwpAQCAtODQsNiArNTgsNyBAQAogICAgICAgICBzd2l0Y2ggKG4uZ2V0Tm9kZVR5cGUoKSkgewogICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6CiAgICAgICAgICAgICAgICAgc2VyaWFsaXplKChEb2N1bWVudCluKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6CiAgICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudEFzRG9jdW1lbnQobik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzQsMTUgKzEwOSwyMCBAQAogICAgICAgICBlbmNvZGVEb2N1bWVudFRlcm1pbmF0aW9uKCk7CiAgICAgfQogCisvLyAgICBwcm90ZWN0ZWQgTm9kZVtdIF9uYW1lc3BhY2VBdHRyaWJ1dGVzID0gbmV3IE5vZGVbNF07CiAKLSAgICBwcm90ZWN0ZWQgTm9kZVtdIF9uYW1lc3BhY2VBdHRyaWJ1dGVzID0gbmV3IE5vZGVbNF07CisgICAgLy8gbWFwIHdoaWNoIHdpbGwgaG9sZCBhbGwgY3VycmVudCBzY29wZSBwcmVmaXhlcyBhbmQgYXNzb2NpYXRlZCBhdHRyaWJ1dGVzCisgICAgLy8gQ29sbGVjdGlvbiBvZiBwb3B1bGF0ZWQgbmFtZXNwYWNlIGF2YWlsYWJsZSBmb3IgY3VycmVudCBzY29wZQorICAgIHByb3RlY3RlZCBOYW1lc3BhY2VDb250ZXh0SW1wbGVtZW50YXRpb24gX25hbWVzcGFjZVNjb3BlQ29udGV4dCA9IG5ldyBOYW1lc3BhY2VDb250ZXh0SW1wbGVtZW50YXRpb24oKTsKICAgICBwcm90ZWN0ZWQgTm9kZVtdIF9hdHRyaWJ1dGVzID0gbmV3IE5vZGVbMzJdOwogCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2VyaWFsaXplRWxlbWVudChOb2RlIGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uKCk7CiAKLSAgICAgICAgaW50IG5hbWVzcGFjZUF0dHJpYnV0ZXNTaXplID0gMDsKICAgICAgICAgaW50IGF0dHJpYnV0ZXNTaXplID0gMDsKKworICAgICAgICBfbmFtZXNwYWNlU2NvcGVDb250ZXh0LnB1c2hDb250ZXh0KCk7CisKICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlcygpKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogU3BsaXQgdGhlIGF0dHJpYnV0ZSBub2RlcyBpbnRvIG5hbWVzcGFjZSBhdHRyaWJ1dGVzCkBAIC0xNTMsMTIgKzEzMywxMiBAQAogICAgICAgICAgICAgICAgIGZpbmFsIE5vZGUgYSA9IG5ubS5pdGVtKGkpOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBhLmdldE5hbWVzcGFjZVVSSSgpOwogICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VBdHRyaWJ1dGVzU2l6ZSA9PSBfbmFtZXNwYWNlQXR0cmlidXRlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5vZGVbXSBhdHRyaWJ1dGVzID0gbmV3IE5vZGVbbmFtZXNwYWNlQXR0cmlidXRlc1NpemUgKiAzIC8gMiArIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShfbmFtZXNwYWNlQXR0cmlidXRlcywgMCwgYXR0cmlidXRlcywgMCwgbmFtZXNwYWNlQXR0cmlidXRlc1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clByZWZpeCA9IGEuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZXNwYWNlID0gYS5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJQcmVmaXggPT0gInhtbG5zIiB8fCBhdHRyUHJlZml4LmVxdWFscygieG1sbnMiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXR0clByZWZpeCA9ICIiOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VBdHRyaWJ1dGVzW25hbWVzcGFjZUF0dHJpYnV0ZXNTaXplKytdID0gYTsKKyAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZVNjb3BlQ29udGV4dC5kZWNsYXJlUHJlZml4KGF0dHJQcmVmaXgsIGF0dHJOYW1lc3BhY2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzU2l6ZSA9PSBfYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5vZGVbXSBhdHRyaWJ1dGVzID0gbmV3IE5vZGVbYXR0cmlidXRlc1NpemUgKiAzIC8gMiArIDFdOwpAQCAtMTY2LDExICsxNDYsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlc1thdHRyaWJ1dGVzU2l6ZSsrXSA9IGE7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lc3BhY2VVUkkgPSBhLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clByZWZpeCA9IGEuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyUHJlZml4ICE9IG51bGwgJiYgIV9uYW1lc3BhY2VTY29wZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKGF0dHJQcmVmaXgpLmVxdWFscyhhdHRyTmFtZXNwYWNlVVJJKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZVNjb3BlQ29udGV4dC5kZWNsYXJlUHJlZml4KGF0dHJQcmVmaXgsIGF0dHJOYW1lc3BhY2VVUkkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG5hbWVzcGFjZUF0dHJpYnV0ZXNTaXplID4gMCkgeworICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWVzcGFjZVVSSSA9IGUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIFN0cmluZyBlbGVtZW50UHJlZml4ID0gZS5nZXRQcmVmaXgoKTsKKyAgICAgICAgaWYgKGVsZW1lbnRQcmVmaXggPT0gbnVsbCkgIGVsZW1lbnRQcmVmaXggPSAiIjsKKyAgICAgICAgaWYgKGVsZW1lbnROYW1lc3BhY2VVUkkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICFfbmFtZXNwYWNlU2NvcGVDb250ZXh0LmdldE5hbWVzcGFjZVVSSShlbGVtZW50UHJlZml4KS5lcXVhbHMoZWxlbWVudE5hbWVzcGFjZVVSSSkpIHsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VTY29wZUNvbnRleHQuZGVjbGFyZVByZWZpeChlbGVtZW50UHJlZml4LCBlbGVtZW50TmFtZXNwYWNlVVJJKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghX25hbWVzcGFjZVNjb3BlQ29udGV4dC5pc0N1cnJlbnRDb250ZXh0RW1wdHkoKSkgewogICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXNTaXplID4gMCkgewogICAgICAgICAgICAgICAgIHdyaXRlKEVuY29kaW5nQ29uc3RhbnRzLkVMRU1FTlQgfCBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX05BTUVTUEFDRVNfRkxBRyB8CiAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURV9GTEFHKTsKQEAgLTE3OCwxOCArMTcyLDEzIEBACiAgICAgICAgICAgICAgICAgd3JpdGUoRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVCB8IEVuY29kaW5nQ29uc3RhbnRzLkVMRU1FTlRfTkFNRVNQQUNFU19GTEFHKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBuYW1lc3BhY2UgYXR0cmlidXRlcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VBdHRyaWJ1dGVzU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTm9kZSBhID0gX25hbWVzcGFjZUF0dHJpYnV0ZXNbaV07Ci0gICAgICAgICAgICAgICAgX25hbWVzcGFjZUF0dHJpYnV0ZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBhLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gInhtbG5zIiB8fCBwcmVmaXguZXF1YWxzKCJ4bWxucyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gYS5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBfbmFtZXNwYWNlU2NvcGVDb250ZXh0LmdldEN1cnJlbnRDb250ZXh0U3RhcnRJbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgaSA8IF9uYW1lc3BhY2VTY29wZUNvbnRleHQuZ2V0Q3VycmVudENvbnRleHRFbmRJbmRleCgpOyBpKyspIHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBfbmFtZXNwYWNlU2NvcGVDb250ZXh0LmdldFByZWZpeChpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gX25hbWVzcGFjZVNjb3BlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkoaSk7CiAgICAgICAgICAgICAgICAgZW5jb2RlTmFtZXNwYWNlQXR0cmlidXRlKHByZWZpeCwgdXJpKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgd3JpdGUoRW5jb2RpbmdDb25zdGFudHMuVEVSTUlOQVRPUik7CiAgICAgICAgICAgICBfYiA9IDA7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xOTcsNyArMTg2LDggQEAKICAgICAgICAgICAgICAgICBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBlbGVtZW50TmFtZXNwYWNlVVJJOworLy8gICAgICAgIG5hbWVzcGFjZVVSSSA9IChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgPyBfbmFtZXNwYWNlU2NvcGVDb250ZXh0LmdldE5hbWVzcGFjZVVSSSgiIikgOiBuYW1lc3BhY2VVUkk7CiAgICAgICAgIG5hbWVzcGFjZVVSSSA9IChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgPyAiIiA6IG5hbWVzcGFjZVVSSTsKICAgICAgICAgZW5jb2RlRWxlbWVudChuYW1lc3BhY2VVUkksIGUuZ2V0Tm9kZU5hbWUoKSwgZS5nZXRMb2NhbE5hbWUoKSk7CiAKQEAgLTIxMSw3ICsyMDEsNyBAQAogICAgICAgICAgICAgICAgIGVuY29kZUF0dHJpYnV0ZShuYW1lc3BhY2VVUkksIGEuZ2V0Tm9kZU5hbWUoKSwgYS5nZXRMb2NhbE5hbWUoKSk7CiAKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBhLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWRkVG9UYWJsZSA9ICh2YWx1ZS5sZW5ndGgoKSA8IGF0dHJpYnV0ZVZhbHVlU2l6ZUNvbnN0cmFpbnQpID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWRkVG9UYWJsZSA9IGlzQXR0cmlidXRlVmFsdWVMZW5ndGhNYXRjaGVzTGltaXQodmFsdWUubGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdCh2YWx1ZSwgX3YuYXR0cmlidXRlVmFsdWUsIGFkZFRvVGFibGUpOwogICAgICAgICAgICAgfQogCkBAIC0yNDQsOCArMjM0LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZW5jb2RlRWxlbWVudFRlcm1pbmF0aW9uKCk7CisgICAgICAgIF9uYW1lc3BhY2VTY29wZUNvbnRleHQucG9wQ29udGV4dCgpOwogICAgIH0KIAorCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2VyaWFsaXplVGV4dChOb2RlIHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gdC5nZXROb2RlVmFsdWUoKTsKIApAQCAtMzM0LDggKzMyNiw3IEBACiAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgZW5jb2RlTGl0ZXJhbEVsZW1lbnRRdWFsaWZpZWROYW1lT25UaGlyZEJpdChuYW1lc3BhY2VVUkksIGdldFByZWZpeEZyb21RdWFsaWZpZWROYW1lKHFOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLCBlbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlbmNvZGVMaXRlcmFsRWxlbWVudFF1YWxpZmllZE5hbWVPblRoaXJkQml0KG5hbWVzcGFjZVVSSSwgIiIsIHFOYW1lLCBlbnRyeSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNTYsOCArMzQ3LDcgQEAKICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBlbmNvZGVMaXRlcmFsQXR0cmlidXRlUXVhbGlmaWVkTmFtZU9uU2Vjb25kQml0KG5hbWVzcGFjZVVSSSwgZ2V0UHJlZml4RnJvbVF1YWxpZmllZE5hbWUocU5hbWUpLAogICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsIGVudHJ5KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVuY29kZUxpdGVyYWxBdHRyaWJ1dGVRdWFsaWZpZWROYW1lT25TZWNvbmRCaXQobmFtZXNwYWNlVVJJLCAiIiwgcU5hbWUsIGVudHJ5KTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L29yZy9hcGFjaGUveGVyY2VzL3V0aWwvWE1MQ2hhci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvb3JnL2FwYWNoZS94ZXJjZXMvdXRpbC9YTUxDaGFyLmphdmEKaW5kZXggMWNkMzlmYS4uOWJmODM3NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvb3JnL2FwYWNoZS94ZXJjZXMvdXRpbC9YTUxDaGFyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvb3JnL2FwYWNoZS94ZXJjZXMvdXRpbC9YTUxDaGFyLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKiBETyBOT1QgUkVNT1ZFIE9SIEFMVEVSIQogICovCiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsNyArMjcsNiBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICoKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKICAqLwogCiAvKgpAQCAtMTEzLDYgKzExMiw3IEBACiAgKiBAYXV0aG9yIE1pY2hhZWwgR2xhdmFzc2V2aWNoLCBJQk0KICAqIEBhdXRob3IgUmFodWwgU3JpdmFzdGF2YSwgU3VuIE1pY3Jvc3lzdGVtcyBJbmMuCiAgKgorICogQHZlcnNpb24gJElkOiBYTUxDaGFyLmphdmEsdiAxLjEgMjAwNS8wNC8xOCAxMjo1NDo0NyBzYW5kb3ogRXhwICQKICAqLwogcHVibGljIGNsYXNzIFhNTENoYXIgewogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9yZXNvdXJjZXMvUmVzb3VyY2VCdW5kbGUucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Jlc291cmNlcy9SZXNvdXJjZUJ1bmRsZS5wcm9wZXJ0aWVzCmluZGV4IGEyNTBmNTEuLmU3NmFhNmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Jlc291cmNlcy9SZXNvdXJjZUJ1bmRsZS5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Jlc291cmNlcy9SZXNvdXJjZUJ1bmRsZS5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiAjIFNhbXBsZSBSZXNvdXJjZUJ1bmRsZSBwcm9wZXJ0aWVzIGZpbGUKIG1lc3NhZ2Uub3B0aW5hbFZhbHVlcyA9IE9wdGlvbmFsIHZhbHVlcyAob3RoZXIgdGhhbiBpbml0aWFsIHZvY2FidWxhcnkpIG9mIERJSSBub3Qgc3VwcG9ydGVkCiBtZXNzYWdlLm5vRXh0ZXJuYWxWb2NhYnVsYXJpZXM9Tm8gZXh0ZXJuYWwgdm9jYWJ1bGFyaWVzIHJlZ2lzdGVyZWQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9BdHRyaWJ1dGVzSG9sZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zYXgvQXR0cmlidXRlc0hvbGRlci5qYXZhCmluZGV4IGVkOTlhZDYuLjdmNDViMTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9BdHRyaWJ1dGVzSG9sZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L0F0dHJpYnV0ZXNIb2xkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zYXg7CkBAIC0yMjksNiArMjAyLDEzIEBACiAgICAgICAgIHJldHVybiBfYWxnb3JpdGhtRGF0YVtpbmRleF07CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZyBnZXRBbHBhYmFiZXQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFRvSW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKICAgICAvLyAtLS0tLQogCkBAIC0zMTEsNCArMjkxLDUgQEAKICAgICAgICAgZWEuY29udmVydFRvQ2hhcmFjdGVycyhkYXRhLCBzYik7CiAgICAgICAgIHJldHVybiBzYjsKICAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9GZWF0dXJlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L0ZlYXR1cmVzLmphdmEKaW5kZXggMDE0ZGExYi4uZjYyZjg4MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L0ZlYXR1cmVzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L0ZlYXR1cmVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc2F4OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L1Byb3BlcnRpZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9Qcm9wZXJ0aWVzLmphdmEKaW5kZXggZjgxMDhiMi4uZmRmNDdhYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L1Byb3BlcnRpZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zYXgvUHJvcGVydGllcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnNheDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9TQVhEb2N1bWVudFBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L1NBWERvY3VtZW50UGFyc2VyLmphdmEKaW5kZXggZjgxOTJiMS4uZDY5NDYxYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L1NBWERvY3VtZW50UGFyc2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L1NBWERvY3VtZW50UGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnNheDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LkRlY29kZXI7CkBAIC00MjgsNyArNDAwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgZGVjb2RlSGVhZGVyKCk7Ci0gICAgICAgICAgICBwcm9jZXNzRElJKCk7CisgICAgICAgICAgICBpZiAoX3BhcnNlRnJhZ21lbnRzKQorICAgICAgICAgICAgICAgIHByb2Nlc3NESUlGcmFnbWVudCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByb2Nlc3NESUkoKTsKICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIF9lcnJvckhhbmRsZXIuZmF0YWxFcnJvcihuZXcgU0FYUGFyc2VFeGNlcHRpb24oZS5nZXRDbGFzcygpLmdldE5hbWUoKSwgbnVsbCwgZSkpOwpAQCAtNDkxLDcgKzQ2Niw4IEBACiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuRUlJX0xJVEVSQUw6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBRdWFsaWZpZWROYW1lIHFuID0gZGVjb2RlTGl0ZXJhbFF1YWxpZmllZE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuZ2V0TmV4dCgpKTsKICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuYWRkKHFuKTsKICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VJSShxbiwgKF9iICYgRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEVfRkxBRykgPiAwKTsKICAgICAgICAgICAgICAgICAgICAgZmlyc3RFbGVtZW50SGFzT2NjdXJlZCA9IHRydWU7CkBAIC01MTcsNyArNDkzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9iID09IEVuY29kaW5nQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChkZWNvZGVOb25JZGVudGlmeWluZ1N0cmluZ09uRmlyc3RCaXQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTklTVFJJTkdfU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9IG5ldyBTdHJpbmcoX2NoYXJCdWZmZXIsIDAsIF9jaGFyQnVmZmVyTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9hZGRUb1RhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdi5vdGhlclN0cmluZy5hZGQobmV3IENoYXJBcnJheShfY2hhckJ1ZmZlciwgMCwgX2NoYXJCdWZmZXJMZW5ndGgsIHRydWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTM4LDggKzUxMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBfdGVybWluYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIF9ub3RhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgX3VucGFyc2VkRW50aXRpZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9ub3RhdGlvbnMgIT0gbnVsbCkgX25vdGF0aW9ucy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoX3VucGFyc2VkRW50aXRpZXMgIT0gbnVsbCkgX3VucGFyc2VkRW50aXRpZXMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogVE9ETwogICAgICAgICAgICAgICAgICAgICAgKiBSZXBvcnQgQWxsIGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggRFRELCBQSXMsIG5vdGF0aW9ucyBldGMKQEAgLTU4OSw2ICs1NjQsMjQ5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzRElJRnJhZ21lbnQoKSB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oInByb2Nlc3NESUkiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIF9iID0gcmVhZCgpOworICAgICAgICBpZiAoX2IgPiAwKSB7CisgICAgICAgICAgICBwcm9jZXNzRElJT3B0aW9uYWxQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSghX3Rlcm1pbmF0ZSkgeworICAgICAgICAgICAgX2IgPSByZWFkKCk7CisgICAgICAgICAgICBzd2l0Y2goRGVjb2RlclN0YXRlVGFibGVzLkVJSVtfYl0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5FSUlfTk9fQUlJU19JTkRFWF9TTUFMTDoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VJSShfZWxlbWVudE5hbWVUYWJsZS5fYXJyYXlbX2JdLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkVJSV9BSUlTX0lOREVYX1NNQUxMOgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRUlJKF9lbGVtZW50TmFtZVRhYmxlLl9hcnJheVtfYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9TTUFMTF9NQVNLXSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkVJSV9JTkRFWF9NRURJVU06CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFSUkoZGVjb2RlRUlJSW5kZXhNZWRpdW0oKSwgKF9iICYgRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEVfRkxBRykgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuRUlJX0lOREVYX0xBUkdFOgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRUlJKGRlY29kZUVJSUluZGV4TGFyZ2UoKSwgKF9iICYgRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEVfRkxBRykgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuRUlJX0xJVEVSQUw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBRdWFsaWZpZWROYW1lIHFuID0gZGVjb2RlTGl0ZXJhbFF1YWxpZmllZE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuZ2V0TmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuYWRkKHFuKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VJSShxbiwgKF9iICYgRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEVfRkxBRykgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkVJSV9OQU1FU1BBQ0VTOgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRUlJV2l0aE5hbWVzcGFjZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjhfU01BTExfTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSAoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5PQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfU01BTExfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgKyAxOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVXRmOENoYXJhY3RlclN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfVVRGOF9NRURJVU1fTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSByZWFkKCkgKyBFbmNvZGluZ0NvbnN0YW50cy5PQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfU01BTExfTElNSVQ7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NVdGY4Q2hhcmFjdGVyU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9VVEY4X0xBUkdFX0xFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gKChyZWFkKCkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWQoKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX01FRElVTV9MSU1JVDsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1V0ZjhDaGFyYWN0ZXJTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjE2X1NNQUxMX0xFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gKF9iICYgRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX1NNQUxMX01BU0spCisgICAgICAgICAgICAgICAgICAgICsgMTsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXRmMTZTdHJpbmdBc0NoYXJCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChfYiAmIEVuY29kaW5nQ29uc3RhbnRzLkNIQVJBQ1RFUl9DSFVOS19BRERfVE9fVEFCTEVfRkxBRykgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuYWRkKF9jaGFyQnVmZmVyLCBfY2hhckJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnMoX2NoYXJCdWZmZXIsIDAsIF9jaGFyQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbigicHJvY2Vzc0NJSSIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9VVEYxNl9NRURJVU1fTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSByZWFkKCkgKyBFbmNvZGluZ0NvbnN0YW50cy5PQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfU01BTExfTElNSVQ7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZVV0ZjE2U3RyaW5nQXNDaGFyQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTktfQUREX1RPX1RBQkxFX0ZMQUcpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLmFkZChfY2hhckJ1ZmZlciwgX2NoYXJCdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKF9jaGFyQnVmZmVyLCAwLCBfY2hhckJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oInByb2Nlc3NDSUkiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfVVRGMTZfTEFSR0VfTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJMZW5ndGggPSAoKHJlYWQoKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZCgpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5PQ1RFVF9TVFJJTkdfTEVOR1RIXzdUSF9CSVRfTUVESVVNX0xJTUlUOworICAgICAgICAgICAgICAgICAgICBkZWNvZGVVdGYxNlN0cmluZ0FzQ2hhckJ1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoKF9iICYgRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LX0FERF9UT19UQUJMRV9GTEFHKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5hZGQoX2NoYXJCdWZmZXIsIF9jaGFyQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhfY2hhckJ1ZmZlciwgMCwgX2NoYXJCdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKCJwcm9jZXNzQ0lJIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1JBOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhZGRUb1RhYmxlID0gKF9iICYgRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LX0FERF9UT19UQUJMRV9GTEFHKSA+IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVjb2RlIHJlc2l0cmljdGVkIGFscGhhYmV0IGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgX2lkZW50aWZpZXIgPSAoX2IgJiAweDAyKSA8PCA2OworICAgICAgICAgICAgICAgICAgICBfYiA9IHJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgX2lkZW50aWZpZXIgfD0gKF9iICYgMHhGQykgPj4gMjsKKworICAgICAgICAgICAgICAgICAgICBkZWNvZGVPY3RldHNPblNldmVudGhCaXRPZk5vbklkZW50aWZ5aW5nU3RyaW5nT25UaGlyZEJpdChfYik7CisKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlUmVzdHJpY3RlZEFscGhhYmV0QXNDaGFyQnVmZmVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZFRvVGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5hZGQoX2NoYXJCdWZmZXIsIF9jaGFyQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhfY2hhckJ1ZmZlciwgMCwgX2NoYXJCdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKCJwcm9jZXNzQ0lJIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9FQToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5OSVNUUklOR19BRERfVE9fVEFCTEVfRkxBRykgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UuYWRkVG9UYWJsZU5vdFN1cHBvcnRlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIERlY29kZSBlbmNvZGluZyBhbGdvcml0aG0gaW50ZWdlcgorICAgICAgICAgICAgICAgICAgICBfaWRlbnRpZmllciA9IChfYiAmIDB4MDIpIDw8IDY7CisgICAgICAgICAgICAgICAgICAgIF9iID0gcmVhZCgpOworICAgICAgICAgICAgICAgICAgICBfaWRlbnRpZmllciB8PSAoX2IgJiAweEZDKSA+PiAyOworCisgICAgICAgICAgICAgICAgICAgIGRlY29kZU9jdGV0c09uU2V2ZW50aEJpdE9mTm9uSWRlbnRpZnlpbmdTdHJpbmdPblRoaXJkQml0KF9iKTsKKworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ0lJRW5jb2RpbmdBbGdvcml0aG0oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9JTkRFWF9TTUFMTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IF9iICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl80VEhfQklUX1NNQUxMX01BU0s7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuX29mZnNldFtpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fbGVuZ3RoW2luZGV4XSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oInByb2Nlc3NDSUkiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX0lOREVYX01FRElVTToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9ICgoKF9iICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl80VEhfQklUX01FRElVTV9NQVNLKSA8PCA4KSB8IHJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfNFRIX0JJVF9TTUFMTF9MSU1JVDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fb2Zmc2V0W2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLl9sZW5ndGhbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbigicHJvY2Vzc0NJSSIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfSU5ERVhfTEFSR0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSAoKChfYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfNFRIX0JJVF9MQVJHRV9NQVNLKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfNFRIX0JJVF9NRURJVU1fTElNSVQ7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fb2Zmc2V0W2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLl9sZW5ndGhbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbigicHJvY2Vzc0NJSSIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfSU5ERVhfTEFSR0VfTEFSR0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSAoKHJlYWQoKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkKCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfNFRIX0JJVF9MQVJHRV9MSU1JVDsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnMoX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLl9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLl9vZmZzZXRbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuX2xlbmd0aFtpbmRleF0pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKCJwcm9jZXNzQ0lJIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNPTU1FTlRfSUk6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tZW50SUkoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9JSToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2Nlc3NpbmdJSSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5VTkVYUEFOREVEX0VOVElUWV9SRUZFUkVOQ0VfSUk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5X3JlZmVyZW5jZV9uYW1lID0gZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3Yub3RoZXJOQ05hbWUpOworCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1faWRlbnRpZmllciA9ICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5VTkVYUEFOREVEX0VOVElUWV9TWVNURU1fSURFTlRJRklFUl9GTEFHKSA+IDApCisgICAgICAgICAgICAgICAgICAgID8gZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3Yub3RoZXJVUkkpIDogIiI7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNfaWRlbnRpZmllciA9ICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5VTkVYUEFOREVEX0VOVElUWV9QVUJMSUNfSURFTlRJRklFUl9GTEFHKSA+IDApCisgICAgICAgICAgICAgICAgICAgID8gZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3Yub3RoZXJVUkkpIDogIiI7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBUT0RPCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBOZWVkIHRvIHZlcmlmeSBpZiB0aGUgc2tpcHBlZEVudGl0eSBtZXRob2Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbCNza2lwcGVkRW50aXR5KGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gY2FsbC4gSXQgYXBwZWFycyBzbyBidXQgYSBtb3JlIGV4dGVuc2l2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogY2hlY2sgaXMgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuc2tpcHBlZEVudGl0eShlbnRpdHlfcmVmZXJlbmNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKCJwcm9jZXNzVW5leHBhbmRlZEVudGl0eVJlZmVyZW5jZUlJIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLlRFUk1JTkFUT1JfRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBfZG91YmxlVGVybWluYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5URVJNSU5BVE9SX1NJTkdMRToKKyAgICAgICAgICAgICAgICAgICAgX3Rlcm1pbmF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5JbGxlZ2FsU3RhdGVEZWNvZGluZ0VJSSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbigicHJvY2Vzc0RJSSIsIGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc0RJSU9wdGlvbmFsUHJvcGVydGllcygpIHRocm93cyBGYXN0SW5mb3NldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBPcHRpbWl6ZSBmb3IgdGhlIG1vc3QgY29tbW9uIGNhc2UKICAgICAgICAgaWYgKF9iID09IEVuY29kaW5nQ29uc3RhbnRzLkRPQ1VNRU5UX0lOSVRJQUxfVk9DQUJVTEFSWV9GTEFHKSB7CkBAIC02NDcsNyArODY1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5ET0NVTUVOVF9WRVJTSU9OX0ZMQUcpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBkZWNvZGVWZXJzaW9uKCk7CisgICAgICAgICAgICBkZWNvZGVWZXJzaW9uKCk7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVE9ETwogICAgICAgICAgICAgICogaG93IHRvIHJlcG9ydCB0aGUgc3RhbmRhbG9uZSBmbGFnPwpAQCAtNjk0LDcgKzkxMiw4IEBACiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuRUlJX0xJVEVSQUw6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBRdWFsaWZpZWROYW1lIHFuID0gZGVjb2RlTGl0ZXJhbFF1YWxpZmllZE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuZ2V0TmV4dCgpKTsKICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuYWRkKHFuKTsKICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VJSShxbiwgKF9iICYgRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEVfRkxBRykgPiAwKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03MDUsMjkgKzkyNCwxMSBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9VVEY4X1NNQUxMX0xFTkdUSDoKICAgICAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gKF9iICYgRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX1NNQUxMX01BU0spCiAgICAgICAgICAgICAgICAgICAgICsgMTsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0FzQ2hhckJ1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKF9iICYgRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LX0FERF9UT19UQUJMRV9GTEFHKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5hZGQoX2NoYXJCdWZmZXIsIF9jaGFyQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhfY2hhckJ1ZmZlciwgMCwgX2NoYXJCdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKCJwcm9jZXNzQ0lJIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1V0ZjhDaGFyYWN0ZXJTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjhfTUVESVVNX0xFTkdUSDoKICAgICAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gcmVhZCgpICsgRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX1NNQUxMX0xJTUlUOwotICAgICAgICAgICAgICAgICAgICBkZWNvZGVVdGY4U3RyaW5nQXNDaGFyQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTktfQUREX1RPX1RBQkxFX0ZMQUcpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLmFkZChfY2hhckJ1ZmZlciwgX2NoYXJCdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKF9jaGFyQnVmZmVyLCAwLCBfY2hhckJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oInByb2Nlc3NDSUkiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVXRmOENoYXJhY3RlclN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfVVRGOF9MQVJHRV9MRU5HVEg6CiAgICAgICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9ICgocmVhZCgpIDw8IDI0KSB8CkBAIC03MzUsMTYgKzkzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWQoKSA8PCA4KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX01FRElVTV9MSU1JVDsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0FzQ2hhckJ1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKF9iICYgRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LX0FERF9UT19UQUJMRV9GTEFHKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5hZGQoX2NoYXJCdWZmZXIsIF9jaGFyQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhfY2hhckJ1ZmZlciwgMCwgX2NoYXJCdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKCJwcm9jZXNzQ0lJIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1V0ZjhDaGFyYWN0ZXJTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjE2X1NNQUxMX0xFTkdUSDoKICAgICAgICAgICAgICAgICAgICAgX29jdGV0QnVmZmVyTGVuZ3RoID0gKF9iICYgRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX1NNQUxMX01BU0spCkBAIC05MzYsNiArMTEyOCwyNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NVdGY4Q2hhcmFjdGVyU3RyaW5nKCkgdGhyb3dzIEZhc3RJbmZvc2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTktfQUREX1RPX1RBQkxFX0ZMQUcpID4gMCkgeworICAgICAgICAgICAgX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLmVuc3VyZVNpemUoX29jdGV0QnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaGFyYWN0ZXJzT2Zmc2V0ID0gX2NoYXJhY3RlckNvbnRlbnRDaHVua1RhYmxlLl9hcnJheUluZGV4OworICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0FzQ2hhckJ1ZmZlcihfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuX2FycmF5LCBjaGFyYWN0ZXJzT2Zmc2V0KTsKKyAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5hZGQoX2NoYXJCdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuX2FycmF5LCBjaGFyYWN0ZXJzT2Zmc2V0LCBfY2hhckJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXN0SW5mb3NldEV4Y2VwdGlvbigicHJvY2Vzc0NJSSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0FzQ2hhckJ1ZmZlcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhfY2hhckJ1ZmZlciwgMCwgX2NoYXJCdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oInByb2Nlc3NDSUkiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NFSUlXaXRoTmFtZXNwYWNlcygpIHRocm93cyBGYXN0SW5mb3NldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBib29sZWFuIGhhc0F0dHJpYnV0ZXMgPSAoX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURV9GTEFHKSA+IDA7CiAKQEAgLTEwMzIsNyArMTI0NSw4IEBACiAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5FSUlfTElURVJBTDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmaW5hbCBRdWFsaWZpZWROYW1lIHFuID0gZGVjb2RlTGl0ZXJhbFF1YWxpZmllZE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgJiBFbmNvZGluZ0NvbnN0YW50cy5MSVRFUkFMX1FOQU1FX1BSRUZJWF9OQU1FU1BBQ0VfTkFNRV9NQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYiAmIEVuY29kaW5nQ29uc3RhbnRzLkxJVEVSQUxfUU5BTUVfUFJFRklYX05BTUVTUEFDRV9OQU1FX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuZ2V0TmV4dCgpKTsKICAgICAgICAgICAgICAgICBfZWxlbWVudE5hbWVUYWJsZS5hZGQocW4pOwogICAgICAgICAgICAgICAgIHByb2Nlc3NFSUkocW4sIGhhc0F0dHJpYnV0ZXMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA4OSw3ICsxMzAzLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQUlJX0xJVEVSQUw6CiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkZWNvZGVMaXRlcmFsUXVhbGlmaWVkTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAmIEVuY29kaW5nQ29uc3RhbnRzLkxJVEVSQUxfUU5BTUVfUFJFRklYX05BTUVTUEFDRV9OQU1FX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZU5hbWVUYWJsZS5nZXROZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICBuYW1lLmNyZWF0ZUF0dHJpYnV0ZVZhbHVlcyhfZHVwbGljYXRlQXR0cmlidXRlVmVyaWZpZXIuTUFQX1NJWkUpOwogICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlTmFtZVRhYmxlLmFkZChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzUyLDcgKzE1NjcsNyBAQAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIFVSSSA9IF92LmVuY29kaW5nQWxnb3JpdGhtLmdldChfaWRlbnRpZmllciAtIEVuY29kaW5nQ29uc3RhbnRzLkVOQ09ESU5HX0FMR09SSVRITV9BUFBMSUNBVElPTl9TVEFSVCk7CiAgICAgICAgICAgICBpZiAoVVJJID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5VUklOb3RQcmVzZW50IiwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKF9pZGVudGlmaWVyKX0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5VUklOb3RQcmVzZW50IiwgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihfaWRlbnRpZmllcil9KSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZpbmFsIEVuY29kaW5nQWxnb3JpdGhtIGVhID0gKEVuY29kaW5nQWxnb3JpdGhtKV9yZWdpc3RlcmVkRW5jb2RpbmdBbGdvcml0aG1zLmdldChVUkkpOwpAQCAtMTM4Nyw4ICsxNjAyLDYgQEAKICAgICAgICAgICAgIGludCBsZW5ndGg7CiAgICAgICAgICAgICBzd2l0Y2goX2lkZW50aWZpZXIpIHsKICAgICAgICAgICAgICAgICBjYXNlIEVuY29kaW5nQWxnb3JpdGhtSW5kZXhlcy5IRVhBREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgX3ByaW1pdGl2ZUhhbmRsZXIuYnl0ZXMoX29jdGV0QnVmZmVyLCBfb2N0ZXRCdWZmZXJTdGFydCwgX29jdGV0QnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuQkFTRTY0OgogICAgICAgICAgICAgICAgICAgICBfcHJpbWl0aXZlSGFuZGxlci5ieXRlcyhfb2N0ZXRCdWZmZXIsIF9vY3RldEJ1ZmZlclN0YXJ0LCBfb2N0ZXRCdWZmZXJMZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE1MDIsNyArMTcxNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ0RBVEEiKTsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoIm1lc3NhZ2UudW5zdXBwb3J0ZWRBbGdvcml0aG0iLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoX2lkZW50aWZpZXIpfSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS51bnN1cHBvcnRlZEFsZ29yaXRobSIsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YoX2lkZW50aWZpZXIpfSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKGUpOwpAQCAtMTUyNCw3ICsxNzM3LDcgQEAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBVUkkgPSBfdi5lbmNvZGluZ0FsZ29yaXRobS5nZXQoX2lkZW50aWZpZXIgLSBFbmNvZGluZ0NvbnN0YW50cy5FTkNPRElOR19BTEdPUklUSE1fQVBQTElDQVRJT05fU1RBUlQpOwogICAgICAgICAgICAgaWYgKFVSSSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoIm1lc3NhZ2UuVVJJTm90UHJlc2VudCIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihfaWRlbnRpZmllcil9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoIm1lc3NhZ2UuVVJJTm90UHJlc2VudCIsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YoX2lkZW50aWZpZXIpfSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmaW5hbCBFbmNvZGluZ0FsZ29yaXRobSBlYSA9IChFbmNvZGluZ0FsZ29yaXRobSlfcmVnaXN0ZXJlZEVuY29kaW5nQWxnb3JpdGhtcy5nZXQoVVJJKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9TQVhEb2N1bWVudFNlcmlhbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9TQVhEb2N1bWVudFNlcmlhbGl6ZXIuamF2YQppbmRleCBlZmZjZTUxLi45N2MxMzdhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zYXgvU0FYRG9jdW1lbnRTZXJpYWxpemVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L1NBWERvY3VtZW50U2VyaWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zYXg7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5FbmNvZGVyOwpAQCAtNjksNyArNDEsNiBAQAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5Db21tb25SZXNvdXJjZUJ1bmRsZTsKIAotCiAvKioKICAqIFRoZSBGYXN0IEluZm9zZXQgU0FYIHNlcmlhbGl6ZXIuCiAgKiA8cD4KQEAgLTkxLDYgKzYyLDEwIEBACiAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfY2hhcmFjdGVyc0FzQ0RBVEEgPSBmYWxzZTsKIAorICAgIHByb3RlY3RlZCBTQVhEb2N1bWVudFNlcmlhbGl6ZXIoYm9vbGVhbiB2KSB7CisgICAgICAgIHN1cGVyKHYpOworICAgIH0KKwogICAgIHB1YmxpYyBTQVhEb2N1bWVudFNlcmlhbGl6ZXIoKSB7CiAgICAgfQogCkBAIC0xMjIsNyArOTcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChfZWxlbWVudEhhc05hbWVzcGFjZXMgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICBlbmNvZGVUZXJtaW5hdGlvbigpOwpAQCAtMTcwLDM1ICsxNDUsNyBAQAogICAgICAgICAgICAgZW5jb2RlRWxlbWVudChuYW1lc3BhY2VVUkksIHFOYW1lLCBsb2NhbE5hbWUpOwogCiAgICAgICAgICAgICBpZiAoYXR0cmlidXRlQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRUb1RhYmxlOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cyBpbnN0YW5jZW9mIEVuY29kaW5nQWxnb3JpdGhtQXR0cmlidXRlcykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXMgZUF0dHMgPSAoRW5jb2RpbmdBbGdvcml0aG1BdHRyaWJ1dGVzKWF0dHM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZUF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZUF0dHJpYnV0ZShhdHRzLmdldFVSSShpKSwgYXR0cy5nZXRRTmFtZShpKSwgYXR0cy5nZXRMb2NhbE5hbWUoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGRhdGEgPSBlQXR0cy5nZXRBbGdvcml0aG1EYXRhKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGRhdGEgaXMgbnVsbCB0aGVuIHRoZXJlIGlzIG5vIGFsZ29yaXRobSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVBdHRzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUb1RhYmxlID0gKHZhbHVlLmxlbmd0aCgpIDwgYXR0cmlidXRlVmFsdWVTaXplQ29uc3RyYWludCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdCh2YWx1ZSwgX3YuYXR0cmlidXRlVmFsdWUsIGFkZFRvVGFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdChlQXR0cy5nZXRBbGdvcml0aG1VUkkoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUF0dHMuZ2V0QWxnb3JpdGhtSW5kZXgoaSksIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlQXR0cmlidXRlKGF0dHMuZ2V0VVJJKGkpLCBhdHRzLmdldFFOYW1lKGkpLCBhdHRzLmdldExvY2FsTmFtZShpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9UYWJsZSA9ICh2YWx1ZS5sZW5ndGgoKSA8IGF0dHJpYnV0ZVZhbHVlU2l6ZUNvbnN0cmFpbnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdCh2YWx1ZSwgX3YuYXR0cmlidXRlVmFsdWUsIGFkZFRvVGFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9iID0gRW5jb2RpbmdDb25zdGFudHMuVEVSTUlOQVRPUjsKLSAgICAgICAgICAgICAgICBfdGVybWluYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbmNvZGVBdHRyaWJ1dGVzKGF0dHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJzdGFydEVsZW1lbnQiLCBlKTsKQEAgLTIwNywyNSArMTU0LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgZmluYWwgaW50IGNvdW50QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHMpIHsKLSAgICAgICAgLy8gQ291bnQgYXR0cmlidXRlcyBpZ25vcmluZyBhbnkgaW4gdGhlIFhNTE5TIG5hbWVzcGFjZQotICAgICAgICAvLyBOb3RlLCBzdWNoIGF0dHJpYnV0ZXMgbWF5IGJlIHByb2R1Y2VkIHdoZW4gdHJhbnNmb3JtaW5nIGZyb20gYSBET00gbm9kZQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IGF0dHMuZ2V0VVJJKGkpOwotICAgICAgICAgICAgaWYgKHVyaSA9PSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iIHx8IHVyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGVuY29kZUVsZW1lbnRUZXJtaW5hdGlvbigpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJzdGFydEVsZW1lbnQiLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oImVuZEVsZW1lbnQiLCBlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjYyLDcgKzE5NSw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoZ2V0SWdub3JlUHJvY2VzaW5nSW5zdHJ1Y3Rpb25zKCkpIHJldHVybjsKIAotICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiIikgeworICAgICAgICAgICAgaWYgKHRhcmdldC5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLgogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLnByb2Nlc3NpbmdJbnN0cnVjdGlvblRhcmdldElzRW1wdHkiKSk7CiAgICAgICAgICAgICB9CkBAIC0zMDUsNiArMjM4LDE2IEBACiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldElnbm9yZURURCgpKSByZXR1cm47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uKCk7CisKKyAgICAgICAgICAgIGVuY29kZURvY3VtZW50VHlwZURlY2xhcmF0aW9uKHB1YmxpY0lkLCBzeXN0ZW1JZCk7CisgICAgICAgICAgICBlbmNvZGVFbGVtZW50VGVybWluYXRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigic3RhcnREVEQiLCBlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24gewpAQCAtNDg3LDcgKzQzMCw5IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBlbmNvZGVUZXJtaW5hdGlvbigpOwogCi0gICAgICAgICAgICBlbmNvZGVGb3VyQml0Q2hhcmFjdGVycyhSZXN0cmljdGVkQWxwaGFiZXQuTlVNRVJJQ19DSEFSQUNURVJTX0lOREVYLCBFbmNvZGluZ0NvbnN0YW50cy5OVU1FUklDX0NIQVJBQ1RFUlNfVEFCTEUsIGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWRkVG9UYWJsZSA9IGlzQ2hhcmFjdGVyQ29udGVudENodW5rTGVuZ3RoTWF0Y2hlc0xpbWl0KGxlbmd0aCwgX3YuY2hhcmFjdGVyQ29udGVudENodW5rKTsKKyAgICAgICAgICAgIGVuY29kZUZvdXJCaXRDaGFyYWN0ZXJzKFJlc3RyaWN0ZWRBbHBoYWJldC5OVU1FUklDX0NIQVJBQ1RFUlNfSU5ERVgsIE5VTUVSSUNfQ0hBUkFDVEVSU19UQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgY2gsIHN0YXJ0LCBsZW5ndGgsIGFkZFRvVGFibGUpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGUpOwogICAgICAgICB9IGNhdGNoIChGYXN0SW5mb3NldEV4Y2VwdGlvbiBlKSB7CkBAIC01MDMsNyArNDQ4LDkgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uKCk7CiAKLSAgICAgICAgICAgIGVuY29kZUZvdXJCaXRDaGFyYWN0ZXJzKFJlc3RyaWN0ZWRBbHBoYWJldC5EQVRFX1RJTUVfQ0hBUkFDVEVSU19JTkRFWCwgRW5jb2RpbmdDb25zdGFudHMuREFURV9USU1FX0NIQVJBQ1RFUlNfVEFCTEUsIGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWRkVG9UYWJsZSA9IGlzQ2hhcmFjdGVyQ29udGVudENodW5rTGVuZ3RoTWF0Y2hlc0xpbWl0KGxlbmd0aCwgX3YuY2hhcmFjdGVyQ29udGVudENodW5rKTsKKyAgICAgICAgICAgIGVuY29kZUZvdXJCaXRDaGFyYWN0ZXJzKFJlc3RyaWN0ZWRBbHBoYWJldC5EQVRFX1RJTUVfQ0hBUkFDVEVSU19JTkRFWCwgREFURV9USU1FX0NIQVJBQ1RFUlNfVEFCTEUsCisgICAgICAgICAgICAgICAgICAgIGNoLCBzdGFydCwgbGVuZ3RoLCBhZGRUb1RhYmxlKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKICAgICAgICAgfSBjYXRjaCAoRmFzdEluZm9zZXRFeGNlcHRpb24gZSkgewpAQCAtNTE5LDcgKzQ2NiwzMyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgZW5jb2RlVGVybWluYXRpb24oKTsKIAotICAgICAgICAgICAgZW5jb2RlQWxwaGFiZXRDaGFyYWN0ZXJzKGFscGhhYmV0LCBjaCwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFkZFRvVGFibGUgPSBpc0NoYXJhY3RlckNvbnRlbnRDaHVua0xlbmd0aE1hdGNoZXNMaW1pdChsZW5ndGgsIF92LmNoYXJhY3RlckNvbnRlbnRDaHVuayk7CisgICAgICAgICAgICBlbmNvZGVBbHBoYWJldENoYXJhY3RlcnMoYWxwaGFiZXQsIGNoLCBzdGFydCwgbGVuZ3RoLCBhZGRUb1RhYmxlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoRmFzdEluZm9zZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEV4dGVuZGVkQ29udGVudEhhbmRsZXIKKworICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIGJvb2xlYW4gaW5kZXgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRJZ25vcmVXaGl0ZVNwYWNlVGV4dENvbnRlbnQoKSAmJgorICAgICAgICAgICAgICAgIGlzV2hpdGVTcGFjZShjaCwgc3RhcnQsIGxlbmd0aCkpIHJldHVybjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW5jb2RlVGVybWluYXRpb24oKTsKKworICAgICAgICAgICAgaWYgKCFfY2hhcmFjdGVyc0FzQ0RBVEEpIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVOb25JZGVudGlmeWluZ1N0cmluZ09uVGhpcmRCaXQoY2gsIHN0YXJ0LCBsZW5ndGgsIF92LmNoYXJhY3RlckNvbnRlbnRDaHVuaywgaW5kZXgsIHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVDSUlCdWlsdEluQWxnb3JpdGhtRGF0YUFzQ0RBVEEoY2gsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGUpOwogICAgICAgICB9IGNhdGNoIChGYXN0SW5mb3NldEV4Y2VwdGlvbiBlKSB7CkBAIC01MjksMTIgKzUwMiw3NyBAQAogCiAKIAotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGVuY29kZUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHFOYW1lLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgY291bnRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cykgeworICAgICAgICAvLyBDb3VudCBhdHRyaWJ1dGVzIGlnbm9yaW5nIGFueSBpbiB0aGUgWE1MTlMgbmFtZXNwYWNlCisgICAgICAgIC8vIE5vdGUsIHN1Y2ggYXR0cmlidXRlcyBtYXkgYmUgcHJvZHVjZWQgd2hlbiB0cmFuc2Zvcm1pbmcgZnJvbSBhIERPTSBub2RlCisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gYXR0cy5nZXRVUkkoaSk7CisgICAgICAgICAgICBpZiAodXJpID09ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIgfHwgdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5jb2RlQXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmFzdEluZm9zZXRFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGFkZFRvVGFibGU7CisgICAgICAgIFN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKGF0dHMgaW5zdGFuY2VvZiBFbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIEVuY29kaW5nQWxnb3JpdGhtQXR0cmlidXRlcyBlQXR0cyA9IChFbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXMpYXR0czsKKyAgICAgICAgICAgIE9iamVjdCBkYXRhOworICAgICAgICAgICAgU3RyaW5nIGFscGhhYmV0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlQXR0cy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZUF0dHJpYnV0ZShhdHRzLmdldFVSSShpKSwgYXR0cy5nZXRRTmFtZShpKSwgYXR0cy5nZXRMb2NhbE5hbWUoaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlQXR0cy5nZXRBbGdvcml0aG1EYXRhKGkpOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBkYXRhIGlzIG51bGwgdGhlbiB0aGVyZSBpcyBubyBhbGdvcml0aG0gZGF0YQorICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVBdHRzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9UYWJsZSA9IGVBdHRzLmdldFRvSW5kZXgoaSkgfHwgaXNBdHRyaWJ1dGVWYWx1ZUxlbmd0aE1hdGNoZXNMaW1pdCh2YWx1ZS5sZW5ndGgoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhYmV0ID0gZUF0dHMuZ2V0QWxwYWJhYmV0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhYmV0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KHZhbHVlLCBfdi5hdHRyaWJ1dGVWYWx1ZSwgYWRkVG9UYWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhbHBoYWJldCA9PSBSZXN0cmljdGVkQWxwaGFiZXQuREFURV9USU1FX0NIQVJBQ1RFUlMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdHJpY3RlZEFscGhhYmV0LkRBVEVfVElNRV9DSEFSQUNURVJTX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9USU1FX0NIQVJBQ1RFUlNfVEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgYWRkVG9UYWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhbHBoYWJldCA9PSBSZXN0cmljdGVkQWxwaGFiZXQuREFURV9USU1FX0NIQVJBQ1RFUlMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdHJpY3RlZEFscGhhYmV0Lk5VTUVSSUNfQ0hBUkFDVEVSU19JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTUVSSUNfQ0hBUkFDVEVSU19UQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBhZGRUb1RhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVOb25JZGVudGlmeWluZ1N0cmluZ09uRmlyc3RCaXQodmFsdWUsIF92LmF0dHJpYnV0ZVZhbHVlLCBhZGRUb1RhYmxlKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KGVBdHRzLmdldEFsZ29yaXRobVVSSShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUF0dHMuZ2V0QWxnb3JpdGhtSW5kZXgoaSksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlQXR0cmlidXRlKGF0dHMuZ2V0VVJJKGkpLCBhdHRzLmdldFFOYW1lKGkpLCBhdHRzLmdldExvY2FsTmFtZShpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhdHRzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgICAgICBhZGRUb1RhYmxlID0gaXNBdHRyaWJ1dGVWYWx1ZUxlbmd0aE1hdGNoZXNMaW1pdCh2YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdCh2YWx1ZSwgX3YuYXR0cmlidXRlVmFsdWUsIGFkZFRvVGFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfYiA9IEVuY29kaW5nQ29uc3RhbnRzLlRFUk1JTkFUT1I7CisgICAgICAgIF90ZXJtaW5hdGUgPSB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuY29kZUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHFOYW1lLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBMb2NhbE5hbWVRdWFsaWZpZWROYW1lc01hcC5FbnRyeSBlbnRyeSA9IF92LmVsZW1lbnROYW1lLm9idGFpbkVudHJ5KHFOYW1lKTsKICAgICAgICAgaWYgKGVudHJ5Ll92YWx1ZUluZGV4ID4gMCkgewogICAgICAgICAgICAgUXVhbGlmaWVkTmFtZVtdIG5hbWVzID0gZW50cnkuX3ZhbHVlOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeS5fdmFsdWVJbmRleDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VVUkkgPT0gbmFtZXNbaV0ubmFtZXNwYWNlTmFtZSB8fCBuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzW2ldLm5hbWVzcGFjZU5hbWUpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFF1YWxpZmllZE5hbWUgbiA9IG5hbWVzW2ldOworICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlVVJJID09IG4ubmFtZXNwYWNlTmFtZSB8fCBuYW1lc3BhY2VVUkkuZXF1YWxzKG4ubmFtZXNwYWNlTmFtZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVuY29kZU5vblplcm9JbnRlZ2VyT25UaGlyZEJpdChuYW1lc1tpXS5pbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC01NDUsNyArNTgzLDcgQEAKICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsIGVudHJ5KTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBlbmNvZGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHFOYW1lLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByb3RlY3RlZCBib29sZWFuIGVuY29kZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcU5hbWUsIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIExvY2FsTmFtZVF1YWxpZmllZE5hbWVzTWFwLkVudHJ5IGVudHJ5ID0gX3YuYXR0cmlidXRlTmFtZS5vYnRhaW5FbnRyeShxTmFtZSk7CiAgICAgICAgIGlmIChlbnRyeS5fdmFsdWVJbmRleCA+IDApIHsKICAgICAgICAgICAgIFF1YWxpZmllZE5hbWVbXSBuYW1lcyA9IGVudHJ5Ll92YWx1ZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9TQVhEb2N1bWVudFNlcmlhbGl6ZXJXaXRoUHJlZml4TWFwcGluZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L1NBWERvY3VtZW50U2VyaWFsaXplcldpdGhQcmVmaXhNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0M2IzYQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9TQVhEb2N1bWVudFNlcmlhbGl6ZXJXaXRoUHJlZml4TWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICoKKyAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc2F4OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuRW5jb2RpbmdDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuUXVhbGlmaWVkTmFtZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC51dGlsLktleUludE1hcDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC51dGlsLkxvY2FsTmFtZVF1YWxpZmllZE5hbWVzTWFwOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWwuU3RyaW5nSW50TWFwOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5SZXN0cmljdGVkQWxwaGFiZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LnNheC5FbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworLyoqCisgKiBUaGUgRmFzdCBJbmZvc2V0IFNBWCBzZXJpYWxpemVyIHRoYXQgbWFwcyBwcmVmaXhlcyB0byB1c2VyIHNwZWNpZmllZCBwcmVmaXhlcworICogdGhhdCBhcmUgc3BlY2lmaWVkIGluIGEgbmFtZXNwYWNlIFVSSSB0byBwcmVmaXggbWFwLgorICogPHA+CisgKiBUaGlzIHNlcmlhbGl6ZXIgd2lsbCBub3QgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHByZWZpeGVzIGFuZCB0aGlzIHNlcmlhbGl6ZXIKKyAqIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIHByZWZpeGVzIG5lZWQgdG8gYmUgcHJlc2VydmVkLCBzdWNoIGFzIHRoZSBjYXNlCisgKiB3aGVuIHRoZXJlIGFyZSBxdWFsaWZpZWQgbmFtZXMgaW4gY29udGVudC4KKyAqIDxwPgorICogQSBuYW1lc3BhY2UgVVJJIHRvIHByZWZpeCBtYXAgaXMgdXRpbGl6ZWQgc3VjaCB0aGF0IHRoZSBwcmVmaXhlcworICogaW4gdGhlIG1hcCBhcmUgdXRpbGl6ZWQgcmF0aGVyIHRoYW4gdGhlIHByZWZpeGVzIHNwZWNpZmllZCBpbgorICogdGhlIHF1YWxpZmllZCBuYW1lIGZvciBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy4KKyAqIDxwPgorICogQW55IG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgd2l0aCBhIG5hbWVzcGFjZSBVUkkgdGhhdCBpcyBub3QgcHJlc2VudCBpbgorICogdGhlIG1hcCBhcmUgYWRkZWQuCisgKiA8cD4KKyAqLworcHVibGljIGNsYXNzIFNBWERvY3VtZW50U2VyaWFsaXplcldpdGhQcmVmaXhNYXBwaW5nIGV4dGVuZHMgU0FYRG9jdW1lbnRTZXJpYWxpemVyIHsKKyAgICBwcm90ZWN0ZWQgTWFwIF9uYW1lc3BhY2VUb1ByZWZpeE1hcHBpbmc7CisgICAgcHJvdGVjdGVkIE1hcCBfcHJlZml4VG9QcmVmaXhNYXBwaW5nOworICAgIHByb3RlY3RlZCBTdHJpbmcgX2xhc3RDaGVja2VkTmFtZXNwYWNlOworICAgIHByb3RlY3RlZCBTdHJpbmcgX2xhc3RDaGVja2VkUHJlZml4OworCisgICAgcHJvdGVjdGVkIFN0cmluZ0ludE1hcCBfZGVjbGFyZWROYW1lc3BhY2VzOworCisgICAgcHVibGljIFNBWERvY3VtZW50U2VyaWFsaXplcldpdGhQcmVmaXhNYXBwaW5nKE1hcCBuYW1lc3BhY2VUb1ByZWZpeE1hcHBpbmcpIHsKKyAgICAgICAgLy8gVXNlIHRoZSBsb2NhbCBuYW1lIHRvIGxvb2sgdXAgZWxlbWVudHMvYXR0cmlidXRlcworICAgICAgICBzdXBlcih0cnVlKTsKKyAgICAgICAgX25hbWVzcGFjZVRvUHJlZml4TWFwcGluZyA9IG5ldyBIYXNoTWFwKG5hbWVzcGFjZVRvUHJlZml4TWFwcGluZyk7CisgICAgICAgIF9wcmVmaXhUb1ByZWZpeE1hcHBpbmcgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIC8vIEVtcHR5IHByZWZpeAorICAgICAgICBfbmFtZXNwYWNlVG9QcmVmaXhNYXBwaW5nLnB1dCgiIiwgIiIpOworICAgICAgICAvLyAneG1sJyBwcmVmaXgKKyAgICAgICAgX25hbWVzcGFjZVRvUHJlZml4TWFwcGluZy5wdXQoRW5jb2RpbmdDb25zdGFudHMuWE1MX05BTUVTUEFDRV9OQU1FLCBFbmNvZGluZ0NvbnN0YW50cy5YTUxfTkFNRVNQQUNFX1BSRUZJWCk7CisKKyAgICAgICAgX2RlY2xhcmVkTmFtZXNwYWNlcyA9IG5ldyBTdHJpbmdJbnRNYXAoNCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9lbGVtZW50SGFzTmFtZXNwYWNlcyA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbiB0byBmbGFnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgbWFyaygpOworICAgICAgICAgICAgICAgIF9lbGVtZW50SGFzTmFtZXNwYWNlcyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSBvdXQgRWxlbWVudCBieXRlIHdpdGggbmFtZXNwYWNlcworICAgICAgICAgICAgICAgIHdyaXRlKEVuY29kaW5nQ29uc3RhbnRzLkVMRU1FTlQgfCBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX05BTUVTUEFDRVNfRkxBRyk7CisKKyAgICAgICAgICAgICAgICBfZGVjbGFyZWROYW1lc3BhY2VzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgX2RlY2xhcmVkTmFtZXNwYWNlcy5vYnRhaW5JbmRleCh1cmkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoX2RlY2xhcmVkTmFtZXNwYWNlcy5vYnRhaW5JbmRleCh1cmkpICE9IEtleUludE1hcC5OT1RfUFJFU0VOVCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcCA9IGdldFByZWZpeCh1cmkpOworICAgICAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfcHJlZml4VG9QcmVmaXhNYXBwaW5nLnB1dChwcmVmaXgsIHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwID0gZ2V0UHJlZml4KHVyaSk7CisgICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZW5jb2RlTmFtZXNwYWNlQXR0cmlidXRlKHAsIHVyaSk7CisgICAgICAgICAgICAgICAgX3ByZWZpeFRvUHJlZml4TWFwcGluZy5wdXQocHJlZml4LCBwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHV0UHJlZml4KHVyaSwgcHJlZml4KTsKKyAgICAgICAgICAgICAgICBlbmNvZGVOYW1lc3BhY2VBdHRyaWJ1dGUocHJlZml4LCB1cmkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oInN0YXJ0RWxlbWVudCIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5jb2RlRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcU5hbWUsIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExvY2FsTmFtZVF1YWxpZmllZE5hbWVzTWFwLkVudHJ5IGVudHJ5ID0gX3YuZWxlbWVudE5hbWUub2J0YWluRW50cnkobG9jYWxOYW1lKTsKKyAgICAgICAgaWYgKGVudHJ5Ll92YWx1ZUluZGV4ID4gMCkgeworICAgICAgICAgICAgaWYgKGVuY29kZUVsZW1lbnRNYXBFbnRyeShlbnRyeSwgbmFtZXNwYWNlVVJJKSkgcmV0dXJuOworICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGVudHJ5IGlzIGEgbWVtYmVyIG9mIHRoZSByZWFkIG9ubHkgbWFwCisgICAgICAgICAgICBpZiAoX3YuZWxlbWVudE5hbWUuaXNRTmFtZUZyb21SZWFkT25seU1hcChlbnRyeS5fdmFsdWVbMF0pKSB7CisgICAgICAgICAgICAgICAgZW50cnkgPSBfdi5lbGVtZW50TmFtZS5vYnRhaW5EeW5hbWljRW50cnkobG9jYWxOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuX3ZhbHVlSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVFbGVtZW50TWFwRW50cnkoZW50cnksIG5hbWVzcGFjZVVSSSkpIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbmNvZGVMaXRlcmFsRWxlbWVudFF1YWxpZmllZE5hbWVPblRoaXJkQml0KG5hbWVzcGFjZVVSSSwgZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSksCisgICAgICAgICAgICAgICAgbG9jYWxOYW1lLCBlbnRyeSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5jb2RlRWxlbWVudE1hcEVudHJ5KExvY2FsTmFtZVF1YWxpZmllZE5hbWVzTWFwLkVudHJ5IGVudHJ5LCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBRdWFsaWZpZWROYW1lW10gbmFtZXMgPSBlbnRyeS5fdmFsdWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cnkuX3ZhbHVlSW5kZXg7IGkrKykgeworICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VVUkkgPT0gbmFtZXNbaV0ubmFtZXNwYWNlTmFtZSB8fCBuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzW2ldLm5hbWVzcGFjZU5hbWUpKSkgeworICAgICAgICAgICAgICAgIGVuY29kZU5vblplcm9JbnRlZ2VyT25UaGlyZEJpdChuYW1lc1tpXS5pbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5jb2RlQXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmFzdEluZm9zZXRFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGFkZFRvVGFibGU7CisgICAgICAgIFN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKGF0dHMgaW5zdGFuY2VvZiBFbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIEVuY29kaW5nQWxnb3JpdGhtQXR0cmlidXRlcyBlQXR0cyA9IChFbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXMpYXR0czsKKyAgICAgICAgICAgIE9iamVjdCBkYXRhOworICAgICAgICAgICAgU3RyaW5nIGFscGhhYmV0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlQXR0cy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IGF0dHMuZ2V0VVJJKGkpOworICAgICAgICAgICAgICAgIGlmIChlbmNvZGVBdHRyaWJ1dGUodXJpLCBhdHRzLmdldFFOYW1lKGkpLCBhdHRzLmdldExvY2FsTmFtZShpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVBdHRzLmdldEFsZ29yaXRobURhdGEoaSk7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGRhdGEgaXMgbnVsbCB0aGVuIHRoZXJlIGlzIG5vIGFsZ29yaXRobSBkYXRhCisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZUF0dHMuZ2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRUb1RhYmxlID0gZUF0dHMuZ2V0VG9JbmRleChpKSB8fCBpc0F0dHJpYnV0ZVZhbHVlTGVuZ3RoTWF0Y2hlc0xpbWl0KHZhbHVlLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFiZXQgPSBlQXR0cy5nZXRBbHBhYmFiZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGFiZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRRTmFtZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZU5vbklkZW50aWZ5aW5nU3RyaW5nT25GaXJzdEJpdCh2YWx1ZSwgX3YuYXR0cmlidXRlVmFsdWUsIGFkZFRvVGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYWJldCA9PSBSZXN0cmljdGVkQWxwaGFiZXQuREFURV9USU1FX0NIQVJBQ1RFUlMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdHJpY3RlZEFscGhhYmV0LkRBVEVfVElNRV9DSEFSQUNURVJTX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9USU1FX0NIQVJBQ1RFUlNfVEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgYWRkVG9UYWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhbHBoYWJldCA9PSBSZXN0cmljdGVkQWxwaGFiZXQuREFURV9USU1FX0NIQVJBQ1RFUlMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdHJpY3RlZEFscGhhYmV0Lk5VTUVSSUNfQ0hBUkFDVEVSU19JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTUVSSUNfQ0hBUkFDVEVSU19UQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBhZGRUb1RhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVOb25JZGVudGlmeWluZ1N0cmluZ09uRmlyc3RCaXQodmFsdWUsIF92LmF0dHJpYnV0ZVZhbHVlLCBhZGRUb1RhYmxlKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KGVBdHRzLmdldEFsZ29yaXRobVVSSShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUF0dHMuZ2V0QWxnb3JpdGhtSW5kZXgoaSksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gYXR0cy5nZXRVUkkoaSk7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZUF0dHJpYnV0ZShhdHRzLmdldFVSSShpKSwgYXR0cy5nZXRRTmFtZShpKSwgYXR0cy5nZXRMb2NhbE5hbWUoaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0cy5nZXRWYWx1ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkVG9UYWJsZSA9IGlzQXR0cmlidXRlVmFsdWVMZW5ndGhNYXRjaGVzTGltaXQodmFsdWUubGVuZ3RoKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29udmVydFFOYW1lKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbmNvZGVOb25JZGVudGlmeWluZ1N0cmluZ09uRmlyc3RCaXQodmFsdWUsIF92LmF0dHJpYnV0ZVZhbHVlLCBhZGRUb1RhYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX2IgPSBFbmNvZGluZ0NvbnN0YW50cy5URVJNSU5BVE9SOworICAgICAgICBfdGVybWluYXRlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0UU5hbWUoU3RyaW5nIHFOYW1lKSB7CisgICAgICAgIGludCBpID0gcU5hbWUuaW5kZXhPZignOicpOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gIiI7CisgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBxTmFtZTsKKyAgICAgICAgaWYgKGkgIT0gLTEpIHsKKyAgICAgICAgICAgIHByZWZpeCA9IHFOYW1lLnN1YnN0cmluZygwLCBpKTsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IHFOYW1lLnN1YnN0cmluZyhpICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcCA9IChTdHJpbmcpX3ByZWZpeFRvUHJlZml4TWFwcGluZy5nZXQocHJlZml4KTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHAubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOYW1lOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBwICsgIjoiICsgbG9jYWxOYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHFOYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZW5jb2RlQXR0cmlidXRlKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTG9jYWxOYW1lUXVhbGlmaWVkTmFtZXNNYXAuRW50cnkgZW50cnkgPSBfdi5hdHRyaWJ1dGVOYW1lLm9idGFpbkVudHJ5KGxvY2FsTmFtZSk7CisgICAgICAgIGlmIChlbnRyeS5fdmFsdWVJbmRleCA+IDApIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVBdHRyaWJ1dGVNYXBFbnRyeShlbnRyeSwgbmFtZXNwYWNlVVJJKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAvLyBDaGVjayB0aGUgZW50cnkgaXMgYSBtZW1iZXIgb2YgdGhlIHJlYWQgb25seSBtYXAKKyAgICAgICAgICAgIGlmIChfdi5hdHRyaWJ1dGVOYW1lLmlzUU5hbWVGcm9tUmVhZE9ubHlNYXAoZW50cnkuX3ZhbHVlWzBdKSkgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gX3YuYXR0cmlidXRlTmFtZS5vYnRhaW5EeW5hbWljRW50cnkobG9jYWxOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuX3ZhbHVlSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVBdHRyaWJ1dGVNYXBFbnRyeShlbnRyeSwgbmFtZXNwYWNlVVJJKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVuY29kZUxpdGVyYWxBdHRyaWJ1dGVRdWFsaWZpZWROYW1lT25TZWNvbmRCaXQobmFtZXNwYWNlVVJJLCBnZXRQcmVmaXgobmFtZXNwYWNlVVJJKSwKKyAgICAgICAgICAgICAgICBsb2NhbE5hbWUsIGVudHJ5KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbmNvZGVBdHRyaWJ1dGVNYXBFbnRyeShMb2NhbE5hbWVRdWFsaWZpZWROYW1lc01hcC5FbnRyeSBlbnRyeSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUXVhbGlmaWVkTmFtZVtdIG5hbWVzID0gZW50cnkuX3ZhbHVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5Ll92YWx1ZUluZGV4OyBpKyspIHsKKyAgICAgICAgICAgIGlmICgobmFtZXNwYWNlVVJJID09IG5hbWVzW2ldLm5hbWVzcGFjZU5hbWUgfHwgbmFtZXNwYWNlVVJJLmVxdWFscyhuYW1lc1tpXS5uYW1lc3BhY2VOYW1lKSkpIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVOb25aZXJvSW50ZWdlck9uU2Vjb25kQml0Rmlyc3RCaXRaZXJvKG5hbWVzW2ldLmluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgICAgICBpZiAoX2xhc3RDaGVja2VkTmFtZXNwYWNlID09IG5hbWVzcGFjZVVSSSkgcmV0dXJuIF9sYXN0Q2hlY2tlZFByZWZpeDsKKworICAgICAgICBfbGFzdENoZWNrZWROYW1lc3BhY2UgPSBuYW1lc3BhY2VVUkk7CisgICAgICAgIHJldHVybiBfbGFzdENoZWNrZWRQcmVmaXggPSAoU3RyaW5nKV9uYW1lc3BhY2VUb1ByZWZpeE1hcHBpbmcuZ2V0KG5hbWVzcGFjZVVSSSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHV0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgX25hbWVzcGFjZVRvUHJlZml4TWFwcGluZy5wdXQobmFtZXNwYWNlVVJJLCBwcmVmaXgpOworCisgICAgICAgIF9sYXN0Q2hlY2tlZE5hbWVzcGFjZSA9IG5hbWVzcGFjZVVSSTsKKyAgICAgICAgX2xhc3RDaGVja2VkUHJlZml4ID0gcHJlZml4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9TeXN0ZW1JZFJlc29sdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zYXgvU3lzdGVtSWRSZXNvbHZlci5qYXZhCmluZGV4IGQyNDJkOTQuLmRiNGRmMjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3NheC9TeXN0ZW1JZFJlc29sdmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc2F4L1N5c3RlbUlkUmVzb2x2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zYXg7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L0V2ZW50TG9jYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvRXZlbnRMb2NhdGlvbi5qYXZhCmluZGV4IDM3MzFjNDEuLjYwMTY4MzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvRXZlbnRMb2NhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvRXZlbnRMb2NhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4OwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L1N0QVhEb2N1bWVudFBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9TdEFYRG9jdW1lbnRQYXJzZXIuamF2YQppbmRleCA5MTJiZTQ0Li5mZDEzZDJmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L1N0QVhEb2N1bWVudFBhcnNlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvU3RBWERvY3VtZW50UGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzkgKzI1LDEyIEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuRGVjb2RlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5EZWNvZGVyU3RhdGVUYWJsZXM7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuRW5jb2RpbmdDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuT2N0ZXRCdWZmZXJMaXN0ZW5lcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5RdWFsaWZpZWROYW1lOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LmFsZ29yaXRobS5CdWlsdEluRW5jb2RpbmdBbGdvcml0aG1GYWN0b3J5OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnNheC5BdHRyaWJ1dGVzSG9sZGVyOwpAQCAtNzgsNiArNTEsNyBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5GYXN0SW5mb3NldEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5Db21tb25SZXNvdXJjZUJ1bmRsZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5vcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LnN0YXguRmFzdEluZm9zZXRTdHJlYW1SZWFkZXI7CiAKIC8qKgogICogVGhlIEZhc3QgSW5mb3NldCBTdEFYIHBhcnNlci4KQEAgLTg5LDcgKzYzLDggQEAKICAqIE1vcmUgdGhhbiBvbmUgZmFzdCBpbmZvc2V0IGRvY3VtZW50IG1heSBiZSBkZWNvZGVkIGZyb20gdGhlCiAgKiB7QGxpbmsgamF2YS5pby5JbnB1dFN0cmVhbX0uCiAgKi8KLXB1YmxpYyBjbGFzcyBTdEFYRG9jdW1lbnRQYXJzZXIgZXh0ZW5kcyBEZWNvZGVyIGltcGxlbWVudHMgWE1MU3RyZWFtUmVhZGVyIHsKK3B1YmxpYyBjbGFzcyBTdEFYRG9jdW1lbnRQYXJzZXIgZXh0ZW5kcyBEZWNvZGVyCisgICAgICAgIGltcGxlbWVudHMgWE1MU3RyZWFtUmVhZGVyLCBGYXN0SW5mb3NldFN0cmVhbVJlYWRlciwgT2N0ZXRCdWZmZXJMaXN0ZW5lciB7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUxfU1RBVEVfU1RBUlRfRE9DVU1FTlQgPSAwOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX1NUQVRFX1NUQVJUX0VMRU1FTlRfVEVSTUlOQVRFID0gMTsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9TVEFURV9TSU5HTEVfVEVSTUlOQVRFX0VMRU1FTlRfV0lUSF9OQU1FU1BBQ0VTID0gMjsKQEAgLTE0Myw2ICsxMTgsNyBAQAogCiAgICAgcHJvdGVjdGVkIFN0cmluZyBfYWxnb3JpdGhtVVJJOwogICAgIHByb3RlY3RlZCBpbnQgX2FsZ29yaXRobUlkOworICAgIHByb3RlY3RlZCBib29sZWFuIF9pc0FsZ29yaXRobURhdGFDbG9uZWQ7CiAgICAgcHJvdGVjdGVkIGJ5dGVbXSBfYWxnb3JpdGhtRGF0YTsKICAgICBwcm90ZWN0ZWQgaW50IF9hbGdvcml0aG1EYXRhT2Zmc2V0OwogICAgIHByb3RlY3RlZCBpbnQgX2FsZ29yaXRobURhdGFMZW5ndGg7CkBAIC0xNjEsMTEgKzEzNywxMyBAQAogCiAgICAgcHVibGljIFN0QVhEb2N1bWVudFBhcnNlcigpIHsKICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgX21hbmFnZXIgPSBuZXcgU3RBWE1hbmFnZXIoU3RBWE1hbmFnZXIuQ09OVEVYVF9SRUFERVIpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdEFYRG9jdW1lbnRQYXJzZXIoSW5wdXRTdHJlYW0gcykgewogICAgICAgICB0aGlzKCk7CiAgICAgICAgIHNldElucHV0U3RyZWFtKHMpOworICAgICAgICBfbWFuYWdlciA9IG5ldyBTdEFYTWFuYWdlcihTdEFYTWFuYWdlci5DT05URVhUX1JFQURFUik7CiAgICAgfQogCiAgICAgcHVibGljIFN0QVhEb2N1bWVudFBhcnNlcihJbnB1dFN0cmVhbSBzLCBTdEFYTWFuYWdlciBtYW5hZ2VyKSB7CkBAIC0xODEsNyArMTU5LDcgQEAKICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgc3VwZXIucmVzZXQoKTsKICAgICAgICAgaWYgKF9pbnRlcm5hbFN0YXRlICE9IElOVEVSTkFMX1NUQVRFX1NUQVJUX0RPQ1VNRU5UICYmCi0gICAgICAgICAgICBfaW50ZXJuYWxTdGF0ZSAhPSBJTlRFUk5BTF9TVEFURV9FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBfaW50ZXJuYWxTdGF0ZSAhPSBJTlRFUk5BTF9TVEFURV9FTkRfRE9DVU1FTlQpIHsKIAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IF9uYW1lc3BhY2VBSUlzSW5kZXggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgIF9wcmVmaXhUYWJsZS5wb3BTY29wZVdpdGhQcmVmaXhFbnRyeShfbmFtZXNwYWNlQUlJc1ByZWZpeEluZGV4W2ldKTsKQEAgLTIyMCw3ICsxOTgsNyBAQAogICAgIC8vIC0tIFhNTFN0cmVhbVJlYWRlciBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICBpZiAoX21hbmFnZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIF9tYW5hZ2VyLmdldFByb3BlcnR5KG5hbWUpOwogICAgICAgICB9CkBAIC0yNzYsOCArMjU0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHBvcFN0YWNrKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnRlcm5hbFN0YXRlID0gKF9jdXJyZW50TmFtZXNwYWNlQUlJc0VuZCA+IDApID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJOQUxfU1RBVEVfU0lOR0xFX1RFUk1JTkFURV9FTEVNRU5UX1dJVEhfTkFNRVNQQUNFUyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSTkFMX1NUQVRFX1ZPSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJOQUxfU1RBVEVfU0lOR0xFX1RFUk1JTkFURV9FTEVNRU5UX1dJVEhfTkFNRVNQQUNFUyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJOQUxfU1RBVEVfVk9JRDsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXZlbnRUeXBlID0gRU5EX0VMRU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5URVJOQUxfU1RBVEVfRU5EX0RPQ1VNRU5UOgogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2Uubm9Nb3JlRXZlbnRzIikpOwpAQCAtMzA3LDcgKzI4NSw4IEBACiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuRUlJX0xJVEVSQUw6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBRdWFsaWZpZWROYW1lIHFuID0gcHJvY2Vzc0xpdGVyYWxRdWFsaWZpZWROYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAmIEVuY29kaW5nQ29uc3RhbnRzLkxJVEVSQUxfUU5BTUVfUFJFRklYX05BTUVTUEFDRV9OQU1FX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuZ2V0TmV4dCgpKTsKICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuYWRkKHFuKTsKICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VJSShxbiwgKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURV9GTEFHKSA+IDApOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZTsKQEAgLTMxNyw3ICsyOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZTsKICAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfVVRGOF9TTUFMTF9MRU5HVEg6CiAgICAgICAgICAgICAgICAgICAgIF9vY3RldEJ1ZmZlckxlbmd0aCA9IChiICYgRW5jb2RpbmdDb25zdGFudHMuT0NURVRfU1RSSU5HX0xFTkdUSF83VEhfQklUX1NNQUxMX01BU0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxOworICAgICAgICAgICAgICAgICAgICArIDE7CiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NVdGY4Q2hhcmFjdGVyU3RyaW5nKGIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZSA9IENIQVJBQ1RFUlM7CiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjhfTUVESVVNX0xFTkdUSDoKQEAgLTM1MSw3ICszMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZSA9IENIQVJBQ1RFUlM7CiAgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1JBOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhZGRUb1RhYmxlID0gKF9iICYgRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LX0FERF9UT19UQUJMRV9GTEFHKSA+IDA7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWRkVG9UYWJsZSA9IChiICYgRW5jb2RpbmdDb25zdGFudHMuQ0hBUkFDVEVSX0NIVU5LX0FERF9UT19UQUJMRV9GTEFHKSA+IDA7CiAKICAgICAgICAgICAgICAgICAgICAgX2lkZW50aWZpZXIgPSAoYiAmIDB4MDIpIDw8IDY7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBiMiA9IHJlYWQoKTsKQEAgLTM5OSw3ICszNzgsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9JTkRFWF9NRURJVU06CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSAoKChiICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl80VEhfQklUX01FRElVTV9NQVNLKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfNFRIX0JJVF9TTUFMTF9MSU1JVDsKKyAgICAgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzRUSF9CSVRfU01BTExfTElNSVQ7CiAgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fY2FjaGVkSW5kZXggPSBpbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVycyA9IF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fYXJyYXk7CkBAIC00ODgsMTEgKzQ2NywxNCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzVXRmOENoYXJhY3RlclN0cmluZyhmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0FzQ2hhckJ1ZmZlcigpOwogICAgICAgICBpZiAoKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5DSEFSQUNURVJfQ0hVTktfQUREX1RPX1RBQkxFX0ZMQUcpID4gMCkgewotICAgICAgICAgICAgX2NoYXJhY3RlcnNPZmZzZXQgPSBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuYWRkKF9jaGFyQnVmZmVyLCBfY2hhckJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuZW5zdXJlU2l6ZShfb2N0ZXRCdWZmZXJMZW5ndGgpOwogICAgICAgICAgICAgX2NoYXJhY3RlcnMgPSBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuX2FycmF5OworICAgICAgICAgICAgX2NoYXJhY3RlcnNPZmZzZXQgPSBfY2hhcmFjdGVyQ29udGVudENodW5rVGFibGUuX2FycmF5SW5kZXg7CisgICAgICAgICAgICBkZWNvZGVVdGY4U3RyaW5nQXNDaGFyQnVmZmVyKF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5fYXJyYXksIF9jaGFyYWN0ZXJzT2Zmc2V0KTsKKyAgICAgICAgICAgIF9jaGFyYWN0ZXJDb250ZW50Q2h1bmtUYWJsZS5hZGQoX2NoYXJCdWZmZXJMZW5ndGgpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjb2RlVXRmOFN0cmluZ0FzQ2hhckJ1ZmZlcigpOwogICAgICAgICAgICAgX2NoYXJhY3RlcnMgPSBfY2hhckJ1ZmZlcjsKICAgICAgICAgICAgIF9jaGFyYWN0ZXJzT2Zmc2V0ID0gMDsKICAgICAgICAgfQpAQCAtNTQ5LDcgKzUzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLm11c3RCZU9uU1RBUlRFTEVNRU5UIiksIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgICAgIC8vY3VycmVudCBpcyBTdGFydEVsZW1lbnQsIG1vdmUgdG8gdGhlIG5leHQKLSAgICAgICAgaW50IGV2ZW50VHlwZSA9IG5leHQoKTsKKyAgICAgICAgbmV4dCgpOwogICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFRleHQodHJ1ZSk7CiAgICAgfQogICAgIC8qKgpAQCAtNTk5LDcgKzU4MSw3IEBACiAgICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgZXZlbnQgaXMgbm90IHdoaXRlIHNwYWNlCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBldmVudFR5cGUgPSBuZXh0KCk7CisgICAgICAgIG5leHQoKTsKICAgICAgICAgcmV0dXJuIG5leHRUYWcodHJ1ZSk7CiAgICAgfQogICAgIC8qKiBpZiB0aGUgY3VycmVudCB0YWcgaGFzIGFscmVhZHkgcmVhZCwgc3VjaCBhcyBpbiB0aGUgY2FzZSBFdmVudFJlYWRlcidzCkBAIC02MjgsNiArNjEwLDEwIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlSWZSZXF1aXJlZCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewpAQCAtOTkzLDcgKzk3OSw4OCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gRmFzdEluZm9zZXRTdHJlYW1SZWFkZXIgaW1wbAogCisgICAgcHVibGljIGZpbmFsIGludCBwZWVrTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3dpdGNoKERlY29kZXJTdGF0ZVRhYmxlcy5FSUlbcGVlayh0aGlzKV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5FSUlfTk9fQUlJU19JTkRFWF9TTUFMTDoKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5FSUlfQUlJU19JTkRFWF9TTUFMTDoKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5FSUlfSU5ERVhfTUVESVVNOgorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkVJSV9JTkRFWF9MQVJHRToKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5FSUlfTElURVJBTDoKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5FSUlfTkFNRVNQQUNFUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0VMRU1FTlQ7CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjhfU01BTExfTEVOR1RIOgorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9VVEY4X01FRElVTV9MRU5HVEg6CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjhfTEFSR0VfTEVOR1RIOgorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9VVEYxNl9TTUFMTF9MRU5HVEg6CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjE2X01FRElVTV9MRU5HVEg6CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX1VURjE2X0xBUkdFX0xFTkdUSDoKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfUkE6CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuQ0lJX0VBOgorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9JTkRFWF9TTUFMTDoKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfSU5ERVhfTUVESVVNOgorICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNJSV9JTkRFWF9MQVJHRToKKyAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfSU5ERVhfTEFSR0VfTEFSR0U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJTOworICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkNPTU1FTlRfSUk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT01NRU5UOworICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fSUk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OOworICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLlVORVhQQU5ERURfRU5USVRZX1JFRkVSRU5DRV9JSToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOVElUWV9SRUZFUkVOQ0U7CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuVEVSTUlOQVRPUl9ET1VCTEU6CisgICAgICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuVEVSTUlOQVRPUl9TSU5HTEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX3N0YWNrQ291bnQgIT0gLTEpID8gRU5EX0VMRU1FTlQgOiBFTkRfRE9DVU1FTlQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhc3RJbmZvc2V0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLklsbGVnYWxTdGF0ZURlY29kaW5nRUlJIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChGYXN0SW5mb3NldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25CZWZvcmVPY3RldEJ1ZmZlck92ZXJ3cml0ZSgpIHsKKyAgICAgICAgaWYgKF9hbGdvcml0aG1EYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9hbGdvcml0aG1EYXRhID0gZ2V0VGV4dEFsZ29yaXRobUJ5dGVzQ2xvbmUoKTsKKyAgICAgICAgICAgIF9hbGdvcml0aG1EYXRhT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIF9pc0FsZ29yaXRobURhdGFDbG9uZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFzdGVyIGFjY2VzcyBtZXRob2RzIHdpdGhvdXQgY2hlY2tzCisKKyAgICBwdWJsaWMgZmluYWwgaW50IGFjY2Vzc05hbWVzcGFjZUNvdW50KCkgeworICAgICAgICByZXR1cm4gKF9jdXJyZW50TmFtZXNwYWNlQUlJc0VuZCA+IDApID8gKF9jdXJyZW50TmFtZXNwYWNlQUlJc0VuZCAtIF9jdXJyZW50TmFtZXNwYWNlQUlJc1N0YXJ0KSA6IDA7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBhY2Nlc3NMb2NhbE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfcXVhbGlmaWVkTmFtZS5sb2NhbE5hbWU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBhY2Nlc3NOYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBfcXVhbGlmaWVkTmFtZS5uYW1lc3BhY2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgYWNjZXNzUHJlZml4KCkgeworICAgICAgICByZXR1cm4gX3F1YWxpZmllZE5hbWUucHJlZml4OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBjaGFyW10gYWNjZXNzVGV4dENoYXJhY3RlcnMoKSB7CisgICAgICAgIHJldHVybiBfY2hhcmFjdGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGFjY2Vzc1RleHRTdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIF9jaGFyYWN0ZXJzT2Zmc2V0OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgYWNjZXNzVGV4dExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIF9jaGFyQnVmZmVyTGVuZ3RoOworICAgIH0KIAogICAgIC8vCiAKQEAgLTEwNTgsNyArMTEyNSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5ET0NVTUVOVF9WRVJTSU9OX0ZMQUcpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBkZWNvZGVWZXJzaW9uKCk7CisgICAgICAgICAgICBkZWNvZGVWZXJzaW9uKCk7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVE9ETwogICAgICAgICAgICAgICogaG93IHRvIHJlcG9ydCB0aGUgc3RhbmRhbG9uZSBmbGFnPwpAQCAtMTEwNCw4ICsxMTcxLDggQEAKIAogICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlTmFtZUluZGV4ID0gX3ByZWZpeEluZGV4ID0gX25hbWVzcGFjZUFJSXNQcmVmaXhJbmRleFtfbmFtZXNwYWNlQUlJc0luZGV4KytdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIC8vIG5vIHByZWZpeCwgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgLy8gRGVjbGFyYXRpb24gb2YgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJlZml4LCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVjbGFyYXRpb24gb2YgZGVmYXVsdCBuYW1lc3BhY2UKICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IF9uYW1lc3BhY2VBSUlzUHJlZml4W19uYW1lc3BhY2VBSUlzSW5kZXhdID0gIiI7CiAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU5hbWUgPSBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbX25hbWVzcGFjZUFJSXNJbmRleF0gPQpAQCAtMTExMyw4ICsxMTgwLDggQEAKIAogICAgICAgICAgICAgICAgICAgICBfcHJlZml4SW5kZXggPSBfbmFtZXNwYWNlQUlJc1ByZWZpeEluZGV4W19uYW1lc3BhY2VBSUlzSW5kZXgrK10gPSAtMTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLy8gcHJlZml4LCBubyBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAvLyBVbmRlY2xhcmF0aW9uIG9mIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICAvLyBwcmVmaXgsIG5vIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICAvLyBVbmRlY2xhcmF0aW9uIG9mIG5hbWVzcGFjZQogICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gX25hbWVzcGFjZUFJSXNQcmVmaXhbX25hbWVzcGFjZUFJSXNJbmRleF0gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0QXNQcmVmaXgoZmFsc2UpOwpAQCAtMTEyMyw4ICsxMTkwLDggQEAKICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZU5hbWVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlQUlJc1ByZWZpeEluZGV4W19uYW1lc3BhY2VBSUlzSW5kZXgrK10gPSBfcHJlZml4SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIC8vIHByZWZpeCwgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgLy8gRGVjbGFyYXRpb24gb2YgcHJlZml4ZWQgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIC8vIHByZWZpeCwgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIC8vIERlY2xhcmF0aW9uIG9mIHByZWZpeGVkIG5hbWVzcGFjZQogICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gX25hbWVzcGFjZUFJSXNQcmVmaXhbX25hbWVzcGFjZUFJSXNJbmRleF0gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0QXNQcmVmaXgodHJ1ZSk7CkBAIC0xMTU5LDcgKzEyMjYsOCBAQAogICAgICAgICAgICAgY2FzZSBEZWNvZGVyU3RhdGVUYWJsZXMuRUlJX0xJVEVSQUw6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZmluYWwgUXVhbGlmaWVkTmFtZSBxbiA9IHByb2Nlc3NMaXRlcmFsUXVhbGlmaWVkTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgIF9lbGVtZW50TmFtZVRhYmxlLmdldE5leHQoKSk7CiAgICAgICAgICAgICAgICAgX2VsZW1lbnROYW1lVGFibGUuYWRkKHFuKTsKICAgICAgICAgICAgICAgICBwcm9jZXNzRUlJKHFuLCBoYXNBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyMjcsMjAgKzEyOTUsMjEgQEAKICAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5BSUlfSU5ERVhfTUVESVVNOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGkgPSAoKChiICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX01FRElVTV9NQVNLKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9TTUFMTF9MSU1JVDsKKyAgICAgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfU01BTExfTElNSVQ7CiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfYXR0cmlidXRlTmFtZVRhYmxlLl9hcnJheVtpXTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgRGVjb2RlclN0YXRlVGFibGVzLkFJSV9JTkRFWF9MQVJHRToKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpID0gKCgoYiAmIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfMk5EX0JJVF9MQVJHRV9NQVNLKSA8PCAxNikgfCAocmVhZCgpIDw8IDgpIHwgcmVhZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8yTkRfQklUX01FRElVTV9MSU1JVDsKKyAgICAgICAgICAgICAgICAgICAgKyBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzJORF9CSVRfTUVESVVNX0xJTUlUOwogICAgICAgICAgICAgICAgICAgICBuYW1lID0gX2F0dHJpYnV0ZU5hbWVUYWJsZS5fYXJyYXlbaV07CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5BSUlfTElURVJBTDoKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHByb2Nlc3NMaXRlcmFsUXVhbGlmaWVkTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICYgRW5jb2RpbmdDb25zdGFudHMuTElURVJBTF9RTkFNRV9QUkVGSVhfTkFNRVNQQUNFX05BTUVfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAmIEVuY29kaW5nQ29uc3RhbnRzLkxJVEVSQUxfUU5BTUVfUFJFRklYX05BTUVTUEFDRV9OQU1FX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZU5hbWVUYWJsZS5nZXROZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICBuYW1lLmNyZWF0ZUF0dHJpYnV0ZVZhbHVlcyhfZHVwbGljYXRlQXR0cmlidXRlVmVyaWZpZXIuTUFQX1NJWkUpOwogICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlTmFtZVRhYmxlLmFkZChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzk2LDcgKzE0NjUsNyBAQAogCiAgICAgcHJvdGVjdGVkIGZpbmFsIFF1YWxpZmllZE5hbWUgcHJvY2Vzc0VJSUluZGV4TWVkaXVtKGludCBiKSB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IGkgPSAoKChiICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8zUkRfQklUX01FRElVTV9NQVNLKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8zUkRfQklUX1NNQUxMX0xJTUlUOworICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9TTUFMTF9MSU1JVDsKICAgICAgICAgcmV0dXJuIF9lbGVtZW50TmFtZVRhYmxlLl9hcnJheVtpXTsKICAgICB9CiAKQEAgLTE0MDUsMjAgKzE0NzQsMjMgQEAKICAgICAgICAgaWYgKChiICYgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8zUkRfQklUX0xBUkdFX0xBUkdFX0ZMQUcpID09IDB4MjApIHsKICAgICAgICAgICAgIC8vIEVJSSBsYXJnZSBpbmRleAogICAgICAgICAgICAgaSA9ICgoKGIgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzNSRF9CSVRfTEFSR0VfTUFTSykgPDwgMTYpIHwgKHJlYWQoKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9NRURJVU1fTElNSVQ7CisgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9NRURJVU1fTElNSVQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBFSUkgbGFyZ2UgbGFyZ2UgaW5kZXgKICAgICAgICAgICAgIGkgPSAoKChyZWFkKCkgJiBFbmNvZGluZ0NvbnN0YW50cy5JTlRFR0VSXzNSRF9CSVRfTEFSR0VfTEFSR0VfTUFTSykgPDwgMTYpIHwgKHJlYWQoKSA8PCA4KSB8IHJlYWQoKSkKLSAgICAgICAgICAgICAgICArIEVuY29kaW5nQ29uc3RhbnRzLklOVEVHRVJfM1JEX0JJVF9MQVJHRV9MSU1JVDsKKyAgICAgICAgICAgICsgRW5jb2RpbmdDb25zdGFudHMuSU5URUdFUl8zUkRfQklUX0xBUkdFX0xJTUlUOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBfZWxlbWVudE5hbWVUYWJsZS5fYXJyYXlbaV07CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGZpbmFsIFF1YWxpZmllZE5hbWUgcHJvY2Vzc0xpdGVyYWxRdWFsaWZpZWROYW1lKGludCBzdGF0ZSkgdGhyb3dzIEZhc3RJbmZvc2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHJvdGVjdGVkIGZpbmFsIFF1YWxpZmllZE5hbWUgcHJvY2Vzc0xpdGVyYWxRdWFsaWZpZWROYW1lKGludCBzdGF0ZSwgUXVhbGlmaWVkTmFtZSBxKQorICAgIHRocm93cyBGYXN0SW5mb3NldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocSA9PSBudWxsKSBxID0gbmV3IFF1YWxpZmllZE5hbWUoKTsKKwogICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CiAgICAgICAgICAgICAvLyBubyBwcmVmaXgsIG5vIG5hbWVzcGFjZQogICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbGlmaWVkTmFtZSgKKyAgICAgICAgICAgICAgICByZXR1cm4gcS5zZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3YubG9jYWxOYW1lKSwKQEAgLTE0MjcsOSArMTQ5OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgX2lkZW50aWZpZXIpOwotICAgICAgICAgICAgLy8gbm8gcHJlZml4LCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAvLyBubyBwcmVmaXgsIG5hbWVzcGFjZQogICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbGlmaWVkTmFtZSgKKyAgICAgICAgICAgICAgICByZXR1cm4gcS5zZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdJbmRleE9uRmlyc3RCaXRBc05hbWVzcGFjZU5hbWUoZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ09uRmlyc3RCaXQoX3YubG9jYWxOYW1lKSwKQEAgLTE0MzgsMTIgKzE1MTAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZU5hbWVJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9pZGVudGlmaWVyKTsKLSAgICAgICAgICAgIC8vIHByZWZpeCwgbm8gbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgLy8gcHJlZml4LCBubyBuYW1lc3BhY2UKICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFzdEluZm9zZXRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UucU5hbWVNaXNzaW5nTmFtZXNwYWNlTmFtZSIpKTsKLSAgICAgICAgICAgIC8vIHByZWZpeCwgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgLy8gcHJlZml4LCBuYW1lc3BhY2UKICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUoCisgICAgICAgICAgICAgICAgcmV0dXJuIHEuc2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ0luZGV4T25GaXJzdEJpdEFzUHJlZml4KHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWRlbnRpZnlpbmdOb25FbXB0eVN0cmluZ0luZGV4T25GaXJzdEJpdEFzTmFtZXNwYWNlTmFtZSh0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZUlkZW50aWZ5aW5nTm9uRW1wdHlTdHJpbmdPbkZpcnN0Qml0KF92LmxvY2FsTmFtZSksCkBAIC0xNTI4LDExICsxNjAwLDEyIEBACiAgICAgICAgIF9hbGdvcml0aG1EYXRhID0gX29jdGV0QnVmZmVyOwogICAgICAgICBfYWxnb3JpdGhtRGF0YU9mZnNldCA9IF9vY3RldEJ1ZmZlclN0YXJ0OwogICAgICAgICBfYWxnb3JpdGhtRGF0YUxlbmd0aCA9IF9vY3RldEJ1ZmZlckxlbmd0aDsKKyAgICAgICAgX2lzQWxnb3JpdGhtRGF0YUNsb25lZCA9IGZhbHNlOwogCiAgICAgICAgIGlmIChfYWxnb3JpdGhtSWQgPj0gRW5jb2RpbmdDb25zdGFudHMuRU5DT0RJTkdfQUxHT1JJVEhNX0FQUExJQ0FUSU9OX1NUQVJUKSB7CiAgICAgICAgICAgICBfYWxnb3JpdGhtVVJJID0gX3YuZW5jb2RpbmdBbGdvcml0aG0uZ2V0KF9hbGdvcml0aG1JZCAtIEVuY29kaW5nQ29uc3RhbnRzLkVOQ09ESU5HX0FMR09SSVRITV9BUFBMSUNBVElPTl9TVEFSVCk7CiAgICAgICAgICAgICBpZiAoX2FsZ29yaXRobVVSSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLlVSSU5vdFByZXNlbnQiLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoX2lkZW50aWZpZXIpfSkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5VUklOb3RQcmVzZW50IiwgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihfaWRlbnRpZmllcil9KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoX2FsZ29yaXRobUlkID4gRW5jb2RpbmdDb25zdGFudHMuRU5DT0RJTkdfQUxHT1JJVEhNX0JVSUxUSU5fRU5EKSB7CiAgICAgICAgICAgICAvLyBSZXNlcnZlZCBidWlsdC1pbiBhbGdvcml0aG1zIGZvciBmdXR1cmUgdXNlCkBAIC0xNTQ3LDcgKzE2MjAsNyBAQAogICAgICAgICBpZiAoX2lkZW50aWZpZXIgPj0gRW5jb2RpbmdDb25zdGFudHMuRU5DT0RJTkdfQUxHT1JJVEhNX0FQUExJQ0FUSU9OX1NUQVJUKSB7CiAgICAgICAgICAgICBVUkkgPSBfdi5lbmNvZGluZ0FsZ29yaXRobS5nZXQoX2lkZW50aWZpZXIgLSBFbmNvZGluZ0NvbnN0YW50cy5FTkNPRElOR19BTEdPUklUSE1fQVBQTElDQVRJT05fU1RBUlQpOwogICAgICAgICAgICAgaWYgKFVSSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLlVSSU5vdFByZXNlbnQiLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoX2lkZW50aWZpZXIpfSkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5VUklOb3RQcmVzZW50IiwgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihfaWRlbnRpZmllcil9KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoX2lkZW50aWZpZXIgPj0gRW5jb2RpbmdDb25zdGFudHMuRU5DT0RJTkdfQUxHT1JJVEhNX0JVSUxUSU5fRU5EKSB7CiAgICAgICAgICAgICBpZiAoX2lkZW50aWZpZXIgPT0gRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLkNEQVRBKSB7CkBAIC0xNTY3LDkgKzE2NDAsMTEgQEAKIAogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNvbnZlcnRFbmNvZGluZ0FsZ29yaXRobURhdGFUb0NoYXJhY3RlcnMoKSB0aHJvd3MgRmFzdEluZm9zZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYgKF9hbGdvcml0aG1JZCA8IEVuY29kaW5nQ29uc3RhbnRzLkVOQ09ESU5HX0FMR09SSVRITV9CVUlMVElOX0VORCkgeworICAgICAgICBpZiAoX2FsZ29yaXRobUlkID09IEVuY29kaW5nQWxnb3JpdGhtSW5kZXhlcy5CQVNFNjQpIHsKKyAgICAgICAgICAgIGNvbnZlcnRCYXNlNjRBbG9yaXRobURhdGFUb0NoYXJhY3RlcnMoYnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChfYWxnb3JpdGhtSWQgPCBFbmNvZGluZ0NvbnN0YW50cy5FTkNPRElOR19BTEdPUklUSE1fQlVJTFRJTl9FTkQpIHsKICAgICAgICAgICAgIE9iamVjdCBhcnJheSA9IEJ1aWx0SW5FbmNvZGluZ0FsZ29yaXRobUZhY3RvcnkudGFibGVbX2FsZ29yaXRobUlkXS4KLSAgICAgICAgICAgICAgICBkZWNvZGVGcm9tQnl0ZXMoX2FsZ29yaXRobURhdGEsIF9hbGdvcml0aG1EYXRhT2Zmc2V0LCBfYWxnb3JpdGhtRGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZUZyb21CeXRlcyhfYWxnb3JpdGhtRGF0YSwgX2FsZ29yaXRobURhdGFPZmZzZXQsIF9hbGdvcml0aG1EYXRhTGVuZ3RoKTsKICAgICAgICAgICAgIEJ1aWx0SW5FbmNvZGluZ0FsZ29yaXRobUZhY3RvcnkudGFibGVbX2FsZ29yaXRobUlkXS5jb252ZXJ0VG9DaGFyYWN0ZXJzKGFycmF5LCAgYnVmZmVyKTsKICAgICAgICAgfSBlbHNlIGlmIChfYWxnb3JpdGhtSWQgPT0gRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLkNEQVRBKSB7CiAgICAgICAgICAgICBfb2N0ZXRCdWZmZXJPZmZzZXQgLT0gX29jdGV0QnVmZmVyTGVuZ3RoOwpAQCAtMTU5NSw2ICsxNjcwLDkzIEBACiAgICAgICAgIF9jaGFyQnVmZmVyTGVuZ3RoID0gX2NoYXJhY3RlcnMubGVuZ3RoOwogICAgIH0KIAorICAgIC8qIElmIGJhc2U2NCBkYXRhIGNvbWVzIGlzIGNodW5rcywgYnl0ZXMsIHdoaWNoIHdlcmUgY3V0IHRvIGFsaWduIDMsCisgICAgICogZnJvbSBwcmV2LiBiYXNlNjQgY2h1bmsgYXJlIHN0b3JlZCBpbiB0aGlzIGJ1ZmZlciAqLworICAgIHByaXZhdGUgYnl0ZVtdIGJhc2U2NFRhbGVCeXRlcyA9IG5ldyBieXRlWzNdOworICAgIHByaXZhdGUgaW50IGJhc2U2NFRhbGVMZW5ndGg7CisgICAgLyoKKyAgICAgKiBNZXRob2QgY29udmVydHMgX2FsZ29yaXRobURhdGEgdG8gYmFzZTY0IGVuY29kZWQgU3RyaW5nCisgICAgICogQ291bnRzIHdpdGggYmFzZTY0IGRhdGEgY29taW5nIGluIGNodW5rcywgYWxpZ25pbmcgaW5wdXQgY2h1bmtzIGJ5IDMsCisgICAgICogYXZvaWRpbmcgZG91YmxlIGNsb25pbmcsIGhhcHBlbmluZyBhZnRlciBwb3NzaWJsZSBwZWVrLCBwZWVrMiBjbG9uaW5nIGJ5IEJhc2U2NCBhbGdvcml0aG0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0QmFzZTY0QWxvcml0aG1EYXRhVG9DaGFyYWN0ZXJzKFN0cmluZ0J1ZmZlciBidWZmZXIpIHRocm93cyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAvLyBIb3cgbXVjaCBuZXcgY2FtZSBkYXRhIHdhcyBzZXJpYWxpemVkIHdpdGggcHJldi4gdGFsZQorICAgICAgICBpbnQgYWZ0ZXJUYWxlT2Zmc2V0ID0gMDsKKworICAgICAgICBpZiAoYmFzZTY0VGFsZUxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0YWxlIGxlZnQgZnJvbSBwcmV2LiBjaHVuaworICAgICAgICAgICAgaW50IGJ5dGVzVG9Db3B5ID0gTWF0aC5taW4oMyAtIGJhc2U2NFRhbGVMZW5ndGgsIF9hbGdvcml0aG1EYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2FsZ29yaXRobURhdGEsIF9hbGdvcml0aG1EYXRhT2Zmc2V0LCBiYXNlNjRUYWxlQnl0ZXMsIGJhc2U2NFRhbGVMZW5ndGgsIGJ5dGVzVG9Db3B5KTsKKyAgICAgICAgICAgIGlmIChiYXNlNjRUYWxlTGVuZ3RoICsgYnl0ZXNUb0NvcHkgPT0gMykgeworICAgICAgICAgICAgICAgIGJhc2U2NERlY29kZVdpdGhDbG9uaW5nKGJ1ZmZlciwgYmFzZTY0VGFsZUJ5dGVzLCAwLCAzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQmFzZTY0Rm9sbG93cygpKSB7CisgICAgICAgICAgICAgICAgLy8gRW5kIG9mIHRleHQgd2FzIHJlYWQgdG8gdGVtcCBhcnJheQorICAgICAgICAgICAgICAgIGJhc2U2NERlY29kZVdpdGhDbG9uaW5nKGJ1ZmZlciwgYmFzZTY0VGFsZUJ5dGVzLCAwLCBiYXNlNjRUYWxlTGVuZ3RoICsgYnl0ZXNUb0NvcHkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVuZCBvZiBjaHVuayBmaXQgdG8gdG1wIGFycmF5LCBidXQgbmV4dCBjaHVuayBpcyBleHBlY3RlZAorICAgICAgICAgICAgICAgIGJhc2U2NFRhbGVMZW5ndGggKz0gYnl0ZXNUb0NvcHk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhZnRlclRhbGVPZmZzZXQgPSBieXRlc1RvQ29weTsKKyAgICAgICAgICAgIGJhc2U2NFRhbGVMZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IHRhbGVCeXRlc1JlbWFpbmluZyA9IGlzQmFzZTY0Rm9sbG93cygpID8gKF9hbGdvcml0aG1EYXRhTGVuZ3RoIC0gYWZ0ZXJUYWxlT2Zmc2V0KSAlIDMgOiAwOworCisgICAgICAgIGlmIChfaXNBbGdvcml0aG1EYXRhQ2xvbmVkKSB7CisgICAgICAgICAgICBiYXNlNjREZWNvZGVXaXRob3V0Q2xvbmluZyhidWZmZXIsIF9hbGdvcml0aG1EYXRhLCBfYWxnb3JpdGhtRGF0YU9mZnNldCArIGFmdGVyVGFsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgX2FsZ29yaXRobURhdGFMZW5ndGggLSBhZnRlclRhbGVPZmZzZXQgLSB0YWxlQnl0ZXNSZW1haW5pbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzZTY0RGVjb2RlV2l0aENsb25pbmcoYnVmZmVyLCBfYWxnb3JpdGhtRGF0YSwgX2FsZ29yaXRobURhdGFPZmZzZXQgKyBhZnRlclRhbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIF9hbGdvcml0aG1EYXRhTGVuZ3RoIC0gYWZ0ZXJUYWxlT2Zmc2V0IC0gdGFsZUJ5dGVzUmVtYWluaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YWxlQnl0ZXNSZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9hbGdvcml0aG1EYXRhLCBfYWxnb3JpdGhtRGF0YU9mZnNldCArIF9hbGdvcml0aG1EYXRhTGVuZ3RoIC0gdGFsZUJ5dGVzUmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICBiYXNlNjRUYWxlQnl0ZXMsIDAsIHRhbGVCeXRlc1JlbWFpbmluZyk7CisgICAgICAgICAgICBiYXNlNjRUYWxlTGVuZ3RoID0gdGFsZUJ5dGVzUmVtYWluaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBFbmNvZGVzIGluY29taW5nIGRhdGEgdG8gQmFzZTY0IHN0cmluZy4KKyAgICAgKiBNZXRob2QgcGVyZm9ybXMgYWRkaXRpb25hbCBpbnB1dCBkYXRhIGNsb25pbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYmFzZTY0RGVjb2RlV2l0aENsb25pbmcoU3RyaW5nQnVmZmVyIGRzdEJ1ZmZlciwgYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBFbmNvZGluZ0FsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBhcnJheSA9IEJ1aWx0SW5FbmNvZGluZ0FsZ29yaXRobUZhY3RvcnkuYmFzZTY0RW5jb2RpbmdBbGdvcml0aG0uCisgICAgICAgICAgICAgICAgZGVjb2RlRnJvbUJ5dGVzKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgQnVpbHRJbkVuY29kaW5nQWxnb3JpdGhtRmFjdG9yeS5iYXNlNjRFbmNvZGluZ0FsZ29yaXRobS5jb252ZXJ0VG9DaGFyYWN0ZXJzKGFycmF5LCBkc3RCdWZmZXIpOworICAgIH0KKworICAgIC8qCisgICAgICogRW5jb2RlcyBpbmNvbWluZyBkYXRhIHRvIEJhc2U2NCBzdHJpbmcuCisgICAgICogQXZvaWRzIGlucHV0IGRhdGEgY2xvbmluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiYXNlNjREZWNvZGVXaXRob3V0Q2xvbmluZyhTdHJpbmdCdWZmZXIgZHN0QnVmZmVyLCBieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEVuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgQnVpbHRJbkVuY29kaW5nQWxnb3JpdGhtRmFjdG9yeS5iYXNlNjRFbmNvZGluZ0FsZ29yaXRobS5jb252ZXJ0VG9DaGFyYWN0ZXJzKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCBkc3RCdWZmZXIpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBMb29rcyBhaGVhZCBpbiBJbnB1dFN0cmVhbSwgd2hldGhlciBuZXh0IGRhdGEgaXMgQmFzZTY0IGNodW5rCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNCYXNlNjRGb2xsb3dzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUHJvY2VzcyBpbmZvcm1hdGlvbiBpdGVtCisgICAgICAgIGludCBiID0gcGVlayh0aGlzKTsKKyAgICAgICAgc3dpdGNoIChEZWNvZGVyU3RhdGVUYWJsZXMuRUlJW2JdKSB7CisgICAgICAgICAgICBjYXNlIERlY29kZXJTdGF0ZVRhYmxlcy5DSUlfRUE6CisgICAgICAgICAgICAgICAgaW50IGFsZ29yaXRobUlkID0gKGIgJiAweDAyKSA8PCA2OworICAgICAgICAgICAgICAgIGludCBiMiA9IHBlZWsyKHRoaXMpOworICAgICAgICAgICAgICAgIGFsZ29yaXRobUlkIHw9IChiMiAmIDB4RkMpID4+IDI7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxnb3JpdGhtSWQgPT0gRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLkJBU0U2NDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUNvbnRleHRJbXBsIGltcGxlbWVudHMgTmFtZXNwYWNlQ29udGV4dCB7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgICAgIHJldHVybiBfcHJlZml4VGFibGUuZ2V0TmFtZXNwYWNlRnJvbVByZWZpeChwcmVmaXgpOwpAQCAtMTY1Niw1ICsxODE4LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gIlVOS05PV05fRVZFTlRfVFlQRSI7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L1N0QVhEb2N1bWVudFNlcmlhbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvU3RBWERvY3VtZW50U2VyaWFsaXplci5qYXZhCmluZGV4IDY5NjY3ZDcuLjViOWI3OTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvU3RBWERvY3VtZW50U2VyaWFsaXplci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvU3RBWERvY3VtZW50U2VyaWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDQ5ICsyNSwyMiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LkVuY29kZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuRW5jb2RpbmdDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbC5OYW1lc3BhY2VDb250ZXh0SW1wbGVtZW50YXRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKIGltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTmFtZXNwYWNlU3VwcG9ydDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5Db21tb25SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5RdWFsaWZpZWROYW1lOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWwuTG9jYWxOYW1lUXVhbGlmaWVkTmFtZXNNYXA7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LnN0YXguTG93TGV2ZWxGYXN0SW5mb3NldFN0cmVhbVdyaXRlcjsKIAogLyoqCiAgKiBUaGUgRmFzdCBJbmZvc2V0IFN0QVggc2VyaWFsaXplci4KQEAgLTc5LDcgKzUyLDggQEAKICAqIE1vcmUgdGhhbiBvbmUgZmFzdCBpbmZvc2V0IGRvY3VtZW50IG1heSBiZSBlbmNvZGVkIHRvIHRoZQogICoge0BsaW5rIGphdmEuaW8uT3V0cHV0U3RyZWFtfS4KICAqLwotcHVibGljIGNsYXNzIFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIgZXh0ZW5kcyBFbmNvZGVyIGltcGxlbWVudHMgWE1MU3RyZWFtV3JpdGVyIHsKK3B1YmxpYyBjbGFzcyBTdEFYRG9jdW1lbnRTZXJpYWxpemVyIGV4dGVuZHMgRW5jb2RlcgorICAgICAgICBpbXBsZW1lbnRzIFhNTFN0cmVhbVdyaXRlciwgTG93TGV2ZWxGYXN0SW5mb3NldFN0cmVhbVdyaXRlciB7CiAgICAgcHJvdGVjdGVkIFN0QVhNYW5hZ2VyIF9tYW5hZ2VyOwogCiAgICAgcHJvdGVjdGVkIFN0cmluZyBfZW5jb2Rpbmc7CkBAIC0xMTQsMTUgKzg4LDE0IEBACiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIF9hdHRyaWJ1dGVzQXJyYXkgPSBuZXcgU3RyaW5nWzQgKiAxNl07CiAgICAgcHJvdGVjdGVkIGludCBfYXR0cmlidXRlc0FycmF5SW5kZXggPSAwOwogCi0gICAgLyoqCi0gICAgICogTWFwcGluZyBiZXR3ZWVuIHVyaXMgYW5kIHByZWZpeGVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VTdXBwb3J0IF9uc1N1cHBvcnQgPSBuZXcgTmFtZXNwYWNlU3VwcG9ydCgpOwotCiAgICAgcHJvdGVjdGVkIGJvb2xlYW5bXSBfbnNTdXBwb3J0Q29udGV4dFN0YWNrID0gbmV3IGJvb2xlYW5bMzJdOwogICAgIHByb3RlY3RlZCBpbnQgX3N0YWNrQ291bnQgPSAtMTsKIAotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VDb250ZXh0IF9uc0NvbnRleHQgPSBuZXcgTmFtZXNwYWNlQ29udGV4dEltcGwoKTsKKyAgICAvKioKKyAgICAgKiBNYXBwaW5nIGJldHdlZW4gdXJpcyBhbmQgcHJlZml4ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE5hbWVzcGFjZUNvbnRleHRJbXBsZW1lbnRhdGlvbiBfbnNDb250ZXh0ID0KKyAgICAgICAgICAgIG5ldyBOYW1lc3BhY2VDb250ZXh0SW1wbGVtZW50YXRpb24oKTsKIAogICAgIC8qKgogICAgICAqIExpc3Qgb2YgbmFtZXNwYWNlcyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGVsZW1lbnQuCkBAIC0xMzIsMTEgKzEwNSwxMyBAQAogCiAgICAgcHVibGljIFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIoKSB7CiAgICAgICAgIHN1cGVyKHRydWUpOworICAgICAgICBfbWFuYWdlciA9IG5ldyBTdEFYTWFuYWdlcihTdEFYTWFuYWdlci5DT05URVhUX1dSSVRFUik7CiAgICAgfQogCiAgICAgcHVibGljIFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgewogICAgICAgICBzdXBlcih0cnVlKTsKICAgICAgICAgc2V0T3V0cHV0U3RyZWFtKG91dHB1dFN0cmVhbSk7CisgICAgICAgIF9tYW5hZ2VyID0gbmV3IFN0QVhNYW5hZ2VyKFN0QVhNYW5hZ2VyLkNPTlRFWFRfV1JJVEVSKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RBWERvY3VtZW50U2VyaWFsaXplcihPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBTdEFYTWFuYWdlciBtYW5hZ2VyKSB7CkBAIC0xNTAsNyArMTI1LDggQEAKIAogICAgICAgICBfYXR0cmlidXRlc0FycmF5SW5kZXggPSAwOwogICAgICAgICBfbmFtZXNwYWNlc0FycmF5SW5kZXggPSAwOwotICAgICAgICBfbnNTdXBwb3J0LnJlc2V0KCk7CisKKyAgICAgICAgX25zQ29udGV4dC5yZXNldCgpOwogICAgICAgICBfc3RhY2tDb3VudCA9IC0xOwogCiAgICAgICAgIF9jdXJyZW50VXJpID0gX2N1cnJlbnRQcmVmaXggPSBudWxsOwpAQCAtMTgzLDE2ICsxNTksMTMgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5lZWQgdG8gZmx1c2ggYSBwZW5kaW5nIGVtcHR5IGVsZW1lbnQ/Ci0gICAgICAgIGlmIChfaW5TdGFydEVsZW1lbnQpIHsKLS8vICAgICAgICAgICAgZW5jb2RlVGVybWluYXRpb25BbmRDdXJyZW50RWxlbWVudCgpOwotICAgICAgICB9Ci0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRPRE8KLSAgICAgICAgICAgIC8vIFVzZSBuc1N1cHBvcnQgdG8gdGVybWluYXRlIGFsbCBlbGVtZW50cyBub3QgdGVybWluYXRlZAotICAgICAgICAgICAgLy8gYnkgd3JpdGVFbmRFbGVtZW50CiAKKyAgICAgICAgICAgIC8vIHRlcm1pbmF0ZSBhbGwgZWxlbWVudHMgbm90IHRlcm1pbmF0ZWQKKyAgICAgICAgICAgIC8vIGJ5IHdyaXRlRW5kRWxlbWVudAorICAgICAgICAgICAgZm9yKDtfc3RhY2tDb3VudCA+PSAwOyBfc3RhY2tDb3VudC0tKSB7CisgICAgICAgICAgICAgICAgd3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGVuY29kZURvY3VtZW50VGVybWluYXRpb24oKTsKICAgICAgICAgfQpAQCAtMjQ3LDcgKzIyMCw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBfbnNTdXBwb3J0Q29udGV4dFN0YWNrW19zdGFja0NvdW50XSA9IGZhbHNlOwotICAgICAgICAvLyBfbnNTdXBwb3J0LnB1c2hDb250ZXh0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkKQEAgLTI4MSw3ICsyNTMsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgX25zU3VwcG9ydENvbnRleHRTdGFja1tfc3RhY2tDb3VudF0gPSBmYWxzZTsKLSAgICAgICAgLy9fbnNTdXBwb3J0LnB1c2hDb250ZXh0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd3JpdGVFbmRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CkBAIC0yOTIsNyArMjYzLDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGVuY29kZUVsZW1lbnRUZXJtaW5hdGlvbigpOwogICAgICAgICAgICAgaWYgKF9uc1N1cHBvcnRDb250ZXh0U3RhY2tbX3N0YWNrQ291bnQtLV0gPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIF9uc1N1cHBvcnQucG9wQ29udGV4dCgpOworICAgICAgICAgICAgICAgIF9uc0NvbnRleHQucG9wQ29udGV4dCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0zMTcsNyArMjg4LDcgQEAKIAogICAgICAgICAvLyBGaW5kIHByZWZpeCBmb3IgYXR0cmlidXRlLCBpZ25vcmluZyBkZWZhdWx0IG5hbWVzcGFjZQogICAgICAgICBpZiAobmFtZXNwYWNlVVJJLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcHJlZml4ID0gX25zU3VwcG9ydC5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKKyAgICAgICAgICAgIHByZWZpeCA9IF9uc0NvbnRleHQuZ2V0Tm9uRGVmYXVsdFByZWZpeChuYW1lc3BhY2VVUkkpOwogCiAgICAgICAgICAgICAvLyBVbmRlY2xhcmVkIHByZWZpeCBvciBpZ25vcmFibGUgZGVmYXVsdCBucz8KICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPT0gMCkgewpAQCAtMzg2LDYgKzM1Nyw3IEBACiAKICAgICAgICAgICAgIF9uYW1lc3BhY2VzQXJyYXlbX25hbWVzcGFjZXNBcnJheUluZGV4KytdID0gcHJlZml4OwogICAgICAgICAgICAgX25hbWVzcGFjZXNBcnJheVtfbmFtZXNwYWNlc0FycmF5SW5kZXgrK10gPSBuYW1lc3BhY2VVUkk7CisgICAgICAgICAgICBzZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MDQsNiArMzc2LDcgQEAKIAogICAgICAgICBfbmFtZXNwYWNlc0FycmF5W19uYW1lc3BhY2VzQXJyYXlJbmRleCsrXSA9ICIiOwogICAgICAgICBfbmFtZXNwYWNlc0FycmF5W19uYW1lc3BhY2VzQXJyYXlJbmRleCsrXSA9IG5hbWVzcGFjZVVSSTsKKyAgICAgICAgc2V0UHJlZml4KCIiLCBuYW1lc3BhY2VVUkkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29tbWVudChTdHJpbmcgZGF0YSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CkBAIC01MDYsNyArNDc5LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgdXJpKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIF9uc1N1cHBvcnQuZ2V0UHJlZml4KHVyaSk7CisgICAgICAgIHJldHVybiBfbnNDb250ZXh0LmdldFByZWZpeCh1cmkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQpAQCAtNTE0LDEwICs0ODcsMTAgQEAKICAgICB7CiAgICAgICAgIGlmIChfc3RhY2tDb3VudCA+IC0xICYmIF9uc1N1cHBvcnRDb250ZXh0U3RhY2tbX3N0YWNrQ291bnRdID09IGZhbHNlKSB7CiAgICAgICAgICAgICBfbnNTdXBwb3J0Q29udGV4dFN0YWNrW19zdGFja0NvdW50XSA9IHRydWU7Ci0gICAgICAgICAgICBfbnNTdXBwb3J0LnB1c2hDb250ZXh0KCk7CisgICAgICAgICAgICBfbnNDb250ZXh0LnB1c2hDb250ZXh0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBfbnNTdXBwb3J0LmRlY2xhcmVQcmVmaXgocHJlZml4LCB1cmkpOworICAgICAgICBfbnNDb250ZXh0LmRlY2xhcmVQcmVmaXgocHJlZml4LCB1cmkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2UoU3RyaW5nIHVyaSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CkBAIC01NjUsMzMgKzUzOCw2IEBACiAgICAgICAgIF9lbmNvZGluZyA9IGVuY29kaW5nOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBjbGFzcyBOYW1lc3BhY2VDb250ZXh0SW1wbCBpbXBsZW1lbnRzIE5hbWVzcGFjZUNvbnRleHQgewotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgICAgICByZXR1cm4gX25zU3VwcG9ydC5nZXRVUkkocHJlZml4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgICAgIHJldHVybiBfbnNTdXBwb3J0LmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIEl0ZXJhdG9yIGdldFByZWZpeGVzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uIGUgPSBfbnNTdXBwb3J0LmdldFByZWZpeGVzKG5hbWVzcGFjZVVSSSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZU9jdGV0cyhieXRlW10gYiwgaW50IHN0YXJ0LCBpbnQgbGVuKQogICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCkBAIC02MzQsNyArNTgwLDExIEBACiAgICAgICAgICAgICAgICAgICAgIF9iID0gMDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBFbmNvZGUgZWxlbWVudCBhbmQgaXRzIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAvLyBJZiBlbGVtZW50J3MgcHJlZml4IGlzIGVtcHR5IC0gYXBwbHkgZGVmYXVsdCBzY29wZSBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICBpZiAoX2N1cnJlbnRQcmVmaXgubGVuZ3RoKCkgPT0gMCAmJiBfY3VycmVudFVyaS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIF9jdXJyZW50VXJpID0gX25zQ29udGV4dC5nZXROYW1lc3BhY2VVUkkoIiIpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGVuY29kZUVsZW1lbnRRdWFsaWZpZWROYW1lT25UaGlyZEJpdChfY3VycmVudFVyaSwgX2N1cnJlbnRQcmVmaXgsIF9jdXJyZW50TG9jYWxOYW1lKTsKIAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2F0dHJpYnV0ZXNBcnJheUluZGV4OykgewpAQCAtNjQzLDcgKzU5Myw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gX2F0dHJpYnV0ZXNBcnJheVtpXTsKICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXNBcnJheVtpKytdID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhZGRUb1RhYmxlID0gKHZhbHVlLmxlbmd0aCgpIDwgYXR0cmlidXRlVmFsdWVTaXplQ29uc3RyYWludCkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWRkVG9UYWJsZSA9IGlzQXR0cmlidXRlVmFsdWVMZW5ndGhNYXRjaGVzTGltaXQodmFsdWUubGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgICAgICBlbmNvZGVOb25JZGVudGlmeWluZ1N0cmluZ09uRmlyc3RCaXQodmFsdWUsIF92LmF0dHJpYnV0ZVZhbHVlLCBhZGRUb1RhYmxlKTsKIAogICAgICAgICAgICAgICAgICAgICBfYiA9IEVuY29kaW5nQ29uc3RhbnRzLlRFUk1JTkFUT1I7CkBAIC02NTUsNyArNjA1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoX2lzRW1wdHlFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGVuY29kZUVsZW1lbnRUZXJtaW5hdGlvbigpOwogICAgICAgICAgICAgICAgICAgICBpZiAoX25zU3VwcG9ydENvbnRleHRTdGFja1tfc3RhY2tDb3VudC0tXSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfbnNTdXBwb3J0LnBvcENvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9uc0NvbnRleHQucG9wQ29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgX2lzRW1wdHlFbGVtZW50ID0gZmFsc2U7CkBAIC02NjksNCArNjE5LDIwNCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KKworCisgICAgLy8gTG93TGV2ZWxGYXN0SW5mb3NldFNlcmlhbGl6ZXIKKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXRpYXRlTG93TGV2ZWxXcml0aW5nKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uQW5kQ3VycmVudEVsZW1lbnQoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TmV4dEVsZW1lbnRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF92LmVsZW1lbnROYW1lLmdldE5leHRJbmRleCgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TmV4dEF0dHJpYnV0ZUluZGV4KCkgeworICAgICAgICByZXR1cm4gX3YuYXR0cmlidXRlTmFtZS5nZXROZXh0SW5kZXgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldExvY2FsTmFtZUluZGV4KCkgeworICAgICAgICByZXR1cm4gX3YubG9jYWxOYW1lLmdldEluZGV4KCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXROZXh0TG9jYWxOYW1lSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfdi5sb2NhbE5hbWUuZ2V0TmV4dEluZGV4KCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVMb3dMZXZlbFRlcm1pbmF0aW9uQW5kTWFyaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uKCk7CisgICAgICAgIG1hcmsoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUxvd0xldmVsU3RhcnRFbGVtZW50SW5kZXhlZChpbnQgdHlwZSwgaW50IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBfYiA9IHR5cGU7CisgICAgICAgIGVuY29kZU5vblplcm9JbnRlZ2VyT25UaGlyZEJpdChpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gd3JpdGVMb3dMZXZlbFN0YXJ0RWxlbWVudChpbnQgdHlwZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNJbmRleGVkID0gZW5jb2RlRWxlbWVudCh0eXBlLCBuYW1lc3BhY2VVUkksIHByZWZpeCwgbG9jYWxOYW1lKTsKKworICAgICAgICBpZiAoIWlzSW5kZXhlZCkKKyAgICAgICAgICAgIGVuY29kZUxpdGVyYWwodHlwZSB8IEVuY29kaW5nQ29uc3RhbnRzLkVMRU1FTlRfTElURVJBTF9RTkFNRV9GTEFHLAorICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkksIHByZWZpeCwgbG9jYWxOYW1lKTsKKworICAgICAgICByZXR1cm4gaXNJbmRleGVkOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTG93TGV2ZWxTdGFydE5hbWVzcGFjZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UIHwgRW5jb2RpbmdDb25zdGFudHMuRUxFTUVOVF9OQU1FU1BBQ0VTX0ZMQUcpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTG93TGV2ZWxOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuY29kZU5hbWVzcGFjZUF0dHJpYnV0ZShwcmVmaXgsIG5hbWVzcGFjZU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTG93TGV2ZWxFbmROYW1lc3BhY2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUoRW5jb2RpbmdDb25zdGFudHMuVEVSTUlOQVRPUik7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVMb3dMZXZlbFN0YXJ0QXR0cmlidXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYXNNYXJrKCkpIHsKKyAgICAgICAgICAgIF9vY3RldEJ1ZmZlcltfbWFya0luZGV4XSB8PSBFbmNvZGluZ0NvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURV9GTEFHOworICAgICAgICAgICAgcmVzZXRNYXJrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUxvd0xldmVsQXR0cmlidXRlSW5kZXhlZChpbnQgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuY29kZU5vblplcm9JbnRlZ2VyT25TZWNvbmRCaXRGaXJzdEJpdFplcm8oaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHdyaXRlTG93TGV2ZWxBdHRyaWJ1dGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0luZGV4ZWQgPSBlbmNvZGVBdHRyaWJ1dGUobmFtZXNwYWNlVVJJLCBwcmVmaXgsIGxvY2FsTmFtZSk7CisKKyAgICAgICAgaWYgKCFpc0luZGV4ZWQpCisgICAgICAgICAgICBlbmNvZGVMaXRlcmFsKEVuY29kaW5nQ29uc3RhbnRzLkFUVFJJQlVURV9MSVRFUkFMX1FOQU1FX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSwgcHJlZml4LCBsb2NhbE5hbWUpOworCisgICAgICAgIHJldHVybiBpc0luZGV4ZWQ7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVMb3dMZXZlbEF0dHJpYnV0ZVZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBmaW5hbCBib29sZWFuIGFkZFRvVGFibGUgPSBpc0F0dHJpYnV0ZVZhbHVlTGVuZ3RoTWF0Y2hlc0xpbWl0KHZhbHVlLmxlbmd0aCgpKTsKKyAgICAgICAgZW5jb2RlTm9uSWRlbnRpZnlpbmdTdHJpbmdPbkZpcnN0Qml0KHZhbHVlLCBfdi5hdHRyaWJ1dGVWYWx1ZSwgYWRkVG9UYWJsZSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVMb3dMZXZlbFN0YXJ0TmFtZUxpdGVyYWwoaW50IHR5cGUsIFN0cmluZyBwcmVmaXgsIGJ5dGVbXSB1dGY4TG9jYWxOYW1lLAorICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW5jb2RlTGl0ZXJhbEhlYWRlcih0eXBlLCBuYW1lc3BhY2VVUkksIHByZWZpeCk7CisgICAgICAgIGVuY29kZU5vblplcm9PY3RldFN0cmluZ0xlbmd0aE9uU2Vjb25kQml0KHV0ZjhMb2NhbE5hbWUubGVuZ3RoKTsKKyAgICAgICAgd3JpdGUodXRmOExvY2FsTmFtZSwgMCwgdXRmOExvY2FsTmFtZS5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTG93TGV2ZWxTdGFydE5hbWVMaXRlcmFsKGludCB0eXBlLCBTdHJpbmcgcHJlZml4LCBpbnQgbG9jYWxOYW1lSW5kZXgsCisgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBlbmNvZGVMaXRlcmFsSGVhZGVyKHR5cGUsIG5hbWVzcGFjZVVSSSwgcHJlZml4KTsKKyAgICAgICAgZW5jb2RlTm9uWmVyb0ludGVnZXJPblNlY29uZEJpdEZpcnN0Qml0T25lKGxvY2FsTmFtZUluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUxvd0xldmVsRW5kU3RhcnRFbGVtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGhhc01hcmsoKSkgeworICAgICAgICAgICAgcmVzZXRNYXJrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIF9iID0gRW5jb2RpbmdDb25zdGFudHMuVEVSTUlOQVRPUjsKKyAgICAgICAgICAgIF90ZXJtaW5hdGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVMb3dMZXZlbEVuZEVsZW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBlbmNvZGVFbGVtZW50VGVybWluYXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUxvd0xldmVsVGV4dChjaGFyW10gdGV4dCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uKCk7CisKKyAgICAgICAgZW5jb2RlQ2hhcmFjdGVycyh0ZXh0LCAwLCBsZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTG93TGV2ZWxUZXh0KFN0cmluZyB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uKCk7CisKKyAgICAgICAgaWYgKGxlbmd0aCA8IF9jaGFyQnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgdGV4dC5nZXRDaGFycygwLCBsZW5ndGgsIF9jaGFyQnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGVuY29kZUNoYXJhY3RlcnMoX2NoYXJCdWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBjaGFyIGNoW10gPSB0ZXh0LnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICBlbmNvZGVDaGFyYWN0ZXJzTm9DbG9uZShjaCwgMCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTG93TGV2ZWxPY3RldHMoYnl0ZVtdIG9jdGV0cywgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGVuY29kZVRlcm1pbmF0aW9uKCk7CisKKyAgICAgICAgZW5jb2RlQ0lJT2N0ZXRBbGdvcml0aG1EYXRhKEVuY29kaW5nQWxnb3JpdGhtSW5kZXhlcy5CQVNFNjQsIG9jdGV0cywgMCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlRWxlbWVudChpbnQgdHlwZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTG9jYWxOYW1lUXVhbGlmaWVkTmFtZXNNYXAuRW50cnkgZW50cnkgPSBfdi5lbGVtZW50TmFtZS5vYnRhaW5FbnRyeShsb2NhbE5hbWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5Ll92YWx1ZUluZGV4OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFF1YWxpZmllZE5hbWUgbmFtZSA9IGVudHJ5Ll92YWx1ZVtpXTsKKyAgICAgICAgICAgIGlmICgocHJlZml4ID09IG5hbWUucHJlZml4IHx8IHByZWZpeC5lcXVhbHMobmFtZS5wcmVmaXgpKQorICAgICAgICAgICAgICAgICAgICAmJiAobmFtZXNwYWNlVVJJID09IG5hbWUubmFtZXNwYWNlTmFtZSB8fCBuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWUubmFtZXNwYWNlTmFtZSkpKSB7CisgICAgICAgICAgICAgICAgX2IgPSB0eXBlOworICAgICAgICAgICAgICAgIGVuY29kZU5vblplcm9JbnRlZ2VyT25UaGlyZEJpdChuYW1lLmluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5LmFkZFF1YWxpZmllZE5hbWUobmV3IFF1YWxpZmllZE5hbWUocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgIiIsIF92LmVsZW1lbnROYW1lLmdldE5leHRJbmRleCgpKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQXR0cmlidXRlKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExvY2FsTmFtZVF1YWxpZmllZE5hbWVzTWFwLkVudHJ5IGVudHJ5ID0gX3YuYXR0cmlidXRlTmFtZS5vYnRhaW5FbnRyeShsb2NhbE5hbWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5Ll92YWx1ZUluZGV4OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFF1YWxpZmllZE5hbWUgbmFtZSA9IGVudHJ5Ll92YWx1ZVtpXTsKKyAgICAgICAgICAgIGlmICgocHJlZml4ID09IG5hbWUucHJlZml4IHx8IHByZWZpeC5lcXVhbHMobmFtZS5wcmVmaXgpKQorICAgICAgICAgICAgICAgICAgICAmJiAobmFtZXNwYWNlVVJJID09IG5hbWUubmFtZXNwYWNlTmFtZSB8fCBuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWUubmFtZXNwYWNlTmFtZSkpKSB7CisgICAgICAgICAgICAgICAgZW5jb2RlTm9uWmVyb0ludGVnZXJPblNlY29uZEJpdEZpcnN0Qml0WmVybyhuYW1lLmluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5LmFkZFF1YWxpZmllZE5hbWUobmV3IFF1YWxpZmllZE5hbWUocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgIiIsIF92LmF0dHJpYnV0ZU5hbWUuZ2V0TmV4dEluZGV4KCkpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmNvZGVMaXRlcmFsSGVhZGVyKGludCB0eXBlLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9ICIiKSB7CisgICAgICAgICAgICB0eXBlIHw9IEVuY29kaW5nQ29uc3RhbnRzLkxJVEVSQUxfUU5BTUVfTkFNRVNQQUNFX05BTUVfRkxBRzsKKyAgICAgICAgICAgIGlmIChwcmVmaXggIT0gIiIpCisgICAgICAgICAgICAgICAgdHlwZSB8PSBFbmNvZGluZ0NvbnN0YW50cy5MSVRFUkFMX1FOQU1FX1BSRUZJWF9GTEFHOworCisgICAgICAgICAgICB3cml0ZSh0eXBlKTsKKyAgICAgICAgICAgIGlmIChwcmVmaXggIT0gIiIpCisgICAgICAgICAgICAgICAgZW5jb2RlTm9uWmVyb0ludGVnZXJPblNlY29uZEJpdEZpcnN0Qml0T25lKF92LnByZWZpeC5nZXQocHJlZml4KSk7CisgICAgICAgICAgICBlbmNvZGVOb25aZXJvSW50ZWdlck9uU2Vjb25kQml0Rmlyc3RCaXRPbmUoX3YubmFtZXNwYWNlTmFtZS5nZXQobmFtZXNwYWNlVVJJKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgd3JpdGUodHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuY29kZUxpdGVyYWwoaW50IHR5cGUsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuY29kZUxpdGVyYWxIZWFkZXIodHlwZSwgbmFtZXNwYWNlVVJJLCBwcmVmaXgpOworCisgICAgICAgIGZpbmFsIGludCBsb2NhbE5hbWVJbmRleCA9IF92LmxvY2FsTmFtZS5vYnRhaW5JbmRleChsb2NhbE5hbWUpOworICAgICAgICBpZiAobG9jYWxOYW1lSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIGVuY29kZU5vbkVtcHR5T2N0ZXRTdHJpbmdPblNlY29uZEJpdChsb2NhbE5hbWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGVuY29kZU5vblplcm9JbnRlZ2VyT25TZWNvbmRCaXRGaXJzdEJpdE9uZShsb2NhbE5hbWVJbmRleCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9TdEFYTWFuYWdlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9TdEFYTWFuYWdlci5qYXZhCmluZGV4IGMzN2IzNzEuLmJjODhkZWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvU3RBWE1hbmFnZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L1N0QVhNYW5hZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXg7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0F0dHJpYnV0ZUJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0F0dHJpYnV0ZUJhc2UuamF2YQppbmRleCBiMmI2ZDQxLi4wNzFlM2I5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9BdHRyaWJ1dGVCYXNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvQXR0cmlidXRlQmFzZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50czsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvQ2hhcmFjdGVyc0V2ZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9DaGFyYWN0ZXJzRXZlbnQuamF2YQppbmRleCAxZjM5YjdhLi45NWMzMzE5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9DaGFyYWN0ZXJzRXZlbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9DaGFyYWN0ZXJzRXZlbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50cyA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9Db21tZW50RXZlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0NvbW1lbnRFdmVudC5qYXZhCmluZGV4IDQ3MzE0MjUuLjA1ZDk5ODggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0NvbW1lbnRFdmVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0NvbW1lbnRFdmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50cyA7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0RUREV2ZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9EVERFdmVudC5qYXZhCmluZGV4IGU5NWMyNGIuLjg5MTU0YTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0RUREV2ZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRFRERXZlbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5ldmVudHM7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0VtcHR5SXRlcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0VtcHR5SXRlcmF0b3IuamF2YQppbmRleCA0NDEzZDg4Li5mY2Y5Mzg5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FbXB0eUl0ZXJhdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRW1wdHlJdGVyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM3ICsyNSwxMSBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5ldmVudHM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LkNvbW1vblJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogCiAKIHB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewpAQCAtNjksOCArNDMsOCBAQAogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CiAgICAgfQogICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKICAgICAgICAgIHRocm93IG5ldyAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UuZW1wdHlJdGVyYXRvciIpKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0VuZERvY3VtZW50RXZlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0VuZERvY3VtZW50RXZlbnQuamF2YQppbmRleCBlYWQ4NGIxLi5hYzIyMDE1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FbmREb2N1bWVudEV2ZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRW5kRG9jdW1lbnRFdmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50cyA7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0VuZEVsZW1lbnRFdmVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRW5kRWxlbWVudEV2ZW50LmphdmEKaW5kZXggY2NiNzVjYy4uZDk3MjFmNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRW5kRWxlbWVudEV2ZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRW5kRWxlbWVudEV2ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguZXZlbnRzIDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRW50aXR5RGVjbGFyYXRpb25JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YQppbmRleCBiYjdkZjA2Li45ZjQ1Yjk3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5ldmVudHM7CiAKQEAgLTEyOCw2ICsxMDEsMTggQEAKICAgICAgICAgcmV0dXJuIF9iYXNlVVJJOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCkgeworICAgICAgICBfcHVibGljSWQgPSBwdWJsaWNJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpIHsKKyAgICAgICAgX3N5c3RlbUlkID0gc3lzdGVtSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFzZVVSSShTdHJpbmcgYmFzZVVSSSkgeworICAgICAgICBfYmFzZVVSSSA9IGJhc2VVUkk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgZW50aXR5TmFtZSl7CiAgICAgICAgIF9lbnRpdHlOYW1lID0gZW50aXR5TmFtZTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FbnRpdHlSZWZlcmVuY2VFdmVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRW50aXR5UmVmZXJlbmNlRXZlbnQuamF2YQppbmRleCBiNTJiOTUwLi4zNmM1ZTFiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FbnRpdHlSZWZlcmVuY2VFdmVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL0VudGl0eVJlZmVyZW5jZUV2ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguZXZlbnRzIDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvRXZlbnRCYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FdmVudEJhc2UuamF2YQppbmRleCA5ZThlNDQzLi5hMGJkYWJmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FdmVudEJhc2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9FdmVudEJhc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50cyA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9OYW1lc3BhY2VCYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9OYW1lc3BhY2VCYXNlLmphdmEKaW5kZXggNzZiOWYyYi4uMTg2MWNkYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvTmFtZXNwYWNlQmFzZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL05hbWVzcGFjZUJhc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5ldmVudHM7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkV2ZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25FdmVudC5qYXZhCmluZGV4IGY4Yjk1YTcuLjU0NmMwYzEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkV2ZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvUHJvY2Vzc2luZ0luc3RydWN0aW9uRXZlbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5ldmVudHMgOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9SZWFkSXRlcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1JlYWRJdGVyYXRvci5qYXZhCmluZGV4IGE5NDNiM2EuLmY0Y2VmYTggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1JlYWRJdGVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1JlYWRJdGVyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguZXZlbnRzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RBWEV2ZW50QWxsb2NhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRXZlbnRBbGxvY2F0b3IuamF2YQppbmRleCA1Y2E1MDY3Li41ODIyMDBlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRXZlbnRBbGxvY2F0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRXZlbnRBbGxvY2F0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50czsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1N0QVhFdmVudEFsbG9jYXRvckJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1N0QVhFdmVudEFsbG9jYXRvckJhc2UuamF2YQppbmRleCBkMTJjNDYwLi44MmQ1OGQxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRXZlbnRBbGxvY2F0b3JCYXNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RBWEV2ZW50QWxsb2NhdG9yQmFzZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50czsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RBWEV2ZW50UmVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRXZlbnRSZWFkZXIuamF2YQppbmRleCA0Y2YxYmUwLi4yYWVhYzY2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRXZlbnRSZWFkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRXZlbnRSZWFkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5ldmVudHM7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1N0QVhFdmVudFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RBWEV2ZW50V3JpdGVyLmphdmEKaW5kZXggNjI4ZDY0MS4uYjdjYmRmNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RBWEV2ZW50V3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RBWEV2ZW50V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguZXZlbnRzOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRmlsdGVyZWRFdmVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RBWEZpbHRlcmVkRXZlbnQuamF2YQppbmRleCBjZDIxZGRhLi44NTg3ZDVmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdEFYRmlsdGVyZWRFdmVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1N0QVhGaWx0ZXJlZEV2ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsOCArMjEsOSBAQAogICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICoKKyAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCi0KIC8qCiAgKiBTdEFYRmlsdGVyZWRFdmVudC5qYXZhCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RhcnREb2N1bWVudEV2ZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdGFydERvY3VtZW50RXZlbnQuamF2YQppbmRleCBjZDcwYzA2Li4zYmVlMDEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdGFydERvY3VtZW50RXZlbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdGFydERvY3VtZW50RXZlbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5ldmVudHMgOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdGFydEVsZW1lbnRFdmVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvU3RhcnRFbGVtZW50RXZlbnQuamF2YQppbmRleCBkN2I4ZjJmLi5kZmI0MGNlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9TdGFydEVsZW1lbnRFdmVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1N0YXJ0RWxlbWVudEV2ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguZXZlbnRzIDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvVXRpbC5qYXZhCmluZGV4IGU1M2U3ZTcuLjUyNmM0NjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZXZlbnRzL1V0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50czsKIAogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9ldmVudHMvWE1MQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9YTUxDb25zdGFudHMuamF2YQppbmRleCAzZDFlNGFmLi4wZmM0NmEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9YTUxDb25zdGFudHMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2V2ZW50cy9YTUxDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmV2ZW50czsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZmFjdG9yeS9TdEFYRXZlbnRGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2ZhY3RvcnkvU3RBWEV2ZW50RmFjdG9yeS5qYXZhCmluZGV4IDI4NzgzNjAuLjI2MjJhY2IgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZmFjdG9yeS9TdEFYRXZlbnRGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9mYWN0b3J5L1N0QVhFdmVudEZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LmZhY3Rvcnk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2ZhY3RvcnkvU3RBWElucHV0RmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9mYWN0b3J5L1N0QVhJbnB1dEZhY3RvcnkuamF2YQppbmRleCAzNzA5YmViLi4wZTdjNzU1MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9mYWN0b3J5L1N0QVhJbnB1dEZhY3RvcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L2ZhY3RvcnkvU3RBWElucHV0RmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguZmFjdG9yeTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvZmFjdG9yeS9TdEFYT3V0cHV0RmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9mYWN0b3J5L1N0QVhPdXRwdXRGYWN0b3J5LmphdmEKaW5kZXggMjA5ODY4OC4uMmZjOWRiNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9mYWN0b3J5L1N0QVhPdXRwdXRGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC9mYWN0b3J5L1N0QVhPdXRwdXRGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5mYWN0b3J5OwpAQCAtMTEzLDcgKzg2LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihyZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpeworICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICAgICAvL3h4eDogc2hvdWxkIHdlIGJlIHVzaW5nIEZpbGVPdXRwdXRTdHJlYW0gLSBuYi4KICAgICAgICAgICAgICAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG5ldyBGaWxlKHJlc3VsdC5nZXRTeXN0ZW1JZCgpKSk7CkBAIC0xNDQsNyArMTE3LDcgQEAKIAogICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgaWYobmFtZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UucHJvcGVydHlOb3RTdXBwb3J0ZWQiLCBuZXcgT2JqZWN0W117bmFtZX0pKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIm1lc3NhZ2UucHJvcGVydHlOb3RTdXBwb3J0ZWQiLCBuZXcgT2JqZWN0W117bnVsbH0pKTsKICAgICAgICAgfQogICAgICAgICBpZihfbWFuYWdlci5jb250YWluc1Byb3BlcnR5KG5hbWUpKQogICAgICAgICAgICAgcmV0dXJuIF9tYW5hZ2VyLmdldFByb3BlcnR5KG5hbWUpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC91dGlsL1N0QVhGaWx0ZXJlZFBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC91dGlsL1N0QVhGaWx0ZXJlZFBhcnNlci5qYXZhCmluZGV4IDU4OTI2MGEuLmI4Zjc3M2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3N0YXgvdXRpbC9TdEFYRmlsdGVyZWRQYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L3V0aWwvU3RBWEZpbHRlcmVkUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXgudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvc3RheC91dGlsL1N0QVhQYXJzZXJXcmFwcGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L3V0aWwvU3RBWFBhcnNlcldyYXBwZXIuamF2YQppbmRleCBjYThmZjFiLi5hMTMxN2YzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L3V0aWwvU3RBWFBhcnNlcldyYXBwZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9zdGF4L3V0aWwvU3RBWFBhcnNlcldyYXBwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC51dGlsOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9GSV9ET01fT3JfWE1MX0RPTV9TQVhfU0FYRXZlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX0RPTV9Pcl9YTUxfRE9NX1NBWF9TQVhFdmVudC5qYXZhCmluZGV4IDFjYzk1YjEuLjIwNzE1YjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX0RPTV9Pcl9YTUxfRE9NX1NBWF9TQVhFdmVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX0RPTV9Pcl9YTUxfRE9NX1NBWF9TQVhFdmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnRvb2xzOwogCkBAIC03MSw3ICs0Myw3IEBACiAKIHB1YmxpYyBjbGFzcyBGSV9ET01fT3JfWE1MX0RPTV9TQVhfU0FYRXZlbnQgZXh0ZW5kcyBUcmFuc2Zvcm1JbnB1dE91dHB1dCB7CiAKLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIGV2ZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBldmVudHMsIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFkb2N1bWVudC5tYXJrU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIGRvY3VtZW50ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZG9jdW1lbnQpOwogICAgICAgICB9CkBAIC05MCw2ICs2Miw5IEBACiAgICAgICAgICAgICBET01Eb2N1bWVudFBhcnNlciBkZHAgPSBuZXcgRE9NRG9jdW1lbnRQYXJzZXIoKTsKICAgICAgICAgICAgIGRkcC5wYXJzZShkLCBkb2N1bWVudCk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAod29ya2luZ0RpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGIuc2V0RW50aXR5UmVzb2x2ZXIoY3JlYXRlUmVsYXRpdmVQYXRoUmVzb2x2ZXIod29ya2luZ0RpcmVjdG9yeSkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZCA9IGRiLnBhcnNlKGRvY3VtZW50KTsKICAgICAgICAgfQogCkBAIC0xMDAsNiArNzUsMTAgQEAKICAgICAgICAgdC50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkKSwgbmV3IFNBWFJlc3VsdChzZXMpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIGV2ZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKGRvY3VtZW50LCBldmVudHMsIG51bGwpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGSV9ET01fT3JfWE1MX0RPTV9TQVhfU0FYRXZlbnQgcCA9IG5ldyBGSV9ET01fT3JfWE1MX0RPTV9TQVhfU0FYRXZlbnQoKTsKICAgICAgICAgcC5wYXJzZShhcmdzKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX1NBWF9Pcl9YTUxfU0FYX0RPTV9TQVhfU0FYRXZlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX1NBWF9Pcl9YTUxfU0FYX0RPTV9TQVhfU0FYRXZlbnQuamF2YQppbmRleCBlZDNhMDRhLi5jNzJiNGI4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9GSV9TQVhfT3JfWE1MX1NBWF9ET01fU0FYX1NBWEV2ZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvRklfU0FYX09yX1hNTF9TQVhfRE9NX1NBWF9TQVhFdmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM4ICsyNSwxMyBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC50b29sczsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LkRlY29kZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5GYXN0SW5mb3NldFNvdXJjZTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTY3LDEzICs0MiwxNSBAQAogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKIAogcHVibGljIGNsYXNzIEZJX1NBWF9Pcl9YTUxfU0FYX0RPTV9TQVhfU0FYRXZlbnQgZXh0ZW5kcyBUcmFuc2Zvcm1JbnB1dE91dHB1dCB7CiAKICAgICBwdWJsaWMgRklfU0FYX09yX1hNTF9TQVhfRE9NX1NBWF9TQVhFdmVudCgpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIGV2ZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBldmVudHMsIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFkb2N1bWVudC5tYXJrU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIGRvY3VtZW50ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZG9jdW1lbnQpOwogICAgICAgICB9CkBAIC04OCw2ICs2NSwxMyBAQAogCiAgICAgICAgIGlmIChpc0Zhc3RJbmZvc2V0RG9jdW1lbnQpIHsKICAgICAgICAgICAgIHQudHJhbnNmb3JtKG5ldyBGYXN0SW5mb3NldFNvdXJjZShkb2N1bWVudCksIGRyKTsKKyAgICAgICAgfSBlbHNlIGlmICh3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKKyAgICAgICAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7CisgICAgICAgICAgICByZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIoY3JlYXRlUmVsYXRpdmVQYXRoUmVzb2x2ZXIod29ya2luZ0RpcmVjdG9yeSkpOworICAgICAgICAgICAgU0FYU291cmNlIHNvdXJjZSA9IG5ldyBTQVhTb3VyY2UocmVhZGVyLCBuZXcgSW5wdXRTb3VyY2UoZG9jdW1lbnQpKTsKKworICAgICAgICAgICAgdC50cmFuc2Zvcm0oc291cmNlLCBkcik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0LnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKGRvY3VtZW50KSwgZHIpOwogICAgICAgICB9CkBAIC05Niw2ICs4MCwyMCBAQAogICAgICAgICB0LnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRyLmdldE5vZGUoKSksIG5ldyBTQVhSZXN1bHQoc2VzKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBldmVudHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwYXJzZShkb2N1bWVudCwgZXZlbnRzLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNBWFBhcnNlciBnZXRQYXJzZXIoKSB7CisgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4UGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgc2F4UGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRklfU0FYX09yX1hNTF9TQVhfRE9NX1NBWF9TQVhFdmVudCBwID0gbmV3IEZJX1NBWF9Pcl9YTUxfU0FYX0RPTV9TQVhfU0FYRXZlbnQoKTsKICAgICAgICAgcC5wYXJzZShhcmdzKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX1NBWF9Pcl9YTUxfU0FYX1NBWEV2ZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9GSV9TQVhfT3JfWE1MX1NBWF9TQVhFdmVudC5qYXZhCmluZGV4IDhjMTA0NzQuLjNjZDBkNzMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX1NBWF9Pcl9YTUxfU0FYX1NBWEV2ZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvRklfU0FYX09yX1hNTF9TQVhfU0FYRXZlbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC50b29sczsKIApAQCAtNjQsMTMgKzM2LDE1IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwogCiBwdWJsaWMgY2xhc3MgRklfU0FYX09yX1hNTF9TQVhfU0FYRXZlbnQgZXh0ZW5kcyBUcmFuc2Zvcm1JbnB1dE91dHB1dCB7CiAKICAgICBwdWJsaWMgRklfU0FYX09yX1hNTF9TQVhfU0FYRXZlbnQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBldmVudHMpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGRvY3VtZW50LCBPdXRwdXRTdHJlYW0gZXZlbnRzLCBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghZG9jdW1lbnQubWFya1N1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICBkb2N1bWVudCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGRvY3VtZW50KTsKICAgICAgICAgfQpAQCAtOTAsMTEgKzY0LDIxIEBACiAgICAgICAgICAgICBwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwogICAgICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CiAgICAgICAgICAgICBTQVhFdmVudFNlcmlhbGl6ZXIgc2VzID0gbmV3IFNBWEV2ZW50U2VyaWFsaXplcihldmVudHMpOwotICAgICAgICAgICAgcGFyc2VyLnNldFByb3BlcnR5KFByb3BlcnRpZXMuTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZLCBzZXMpOwotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGRvY3VtZW50LCBzZXMpOworCisgICAgICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOworICAgICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBzZXMpOworICAgICAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHNlcyk7CisgICAgICAgICAgICBpZiAod29ya2luZ0RpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKGNyZWF0ZVJlbGF0aXZlUGF0aFJlc29sdmVyKHdvcmtpbmdEaXJlY3RvcnkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoZG9jdW1lbnQpKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGRvY3VtZW50LCBPdXRwdXRTdHJlYW0gZXZlbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoZG9jdW1lbnQsIGV2ZW50cywgbnVsbCk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZJX1NBWF9Pcl9YTUxfU0FYX1NBWEV2ZW50IHAgPSBuZXcgRklfU0FYX09yX1hNTF9TQVhfU0FYRXZlbnQoKTsKICAgICAgICAgcC5wYXJzZShhcmdzKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX1NBWF9YTUwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX1NBWF9YTUwuamF2YQppbmRleCAyOTA0M2E2Li4zNmYxZTI4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9GSV9TQVhfWE1MLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvRklfU0FYX1hNTC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnRvb2xzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvRklfU3RBWF9TQVhfT3JfWE1MX1NBWF9TQVhFdmVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvRklfU3RBWF9TQVhfT3JfWE1MX1NBWF9TQVhFdmVudC5qYXZhCmluZGV4IDU3N2VhM2QuLmQ4N2M3ZTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL0ZJX1N0QVhfU0FYX09yX1hNTF9TQVhfU0FYRXZlbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9GSV9TdEFYX1NBWF9Pcl9YTUxfU0FYX1NBWEV2ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudG9vbHM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9QcmludFRhYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9QcmludFRhYmxlLmphdmEKaW5kZXggMjk5ZGJkNi4uNzBlN2QzMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvUHJpbnRUYWJsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1ByaW50VGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC50b29sczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1NBWDJTdEFYV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9TQVgyU3RBWFdyaXRlci5qYXZhCmluZGV4IGM2NTg0MDIuLjIwYTcxZTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1NBWDJTdEFYV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvU0FYMlN0QVhXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC50b29sczsKQEAgLTE1OCwxMyArMTMxLDE1IEBACiAgICAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCiAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBfd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIHVyaSk7CisgICAgLy8gQ29tbWVudGVkIGFzIGluIFN0QVggTlMgYXJlIGRlY2xhcmVkIGZvciBjdXJyZW50IGVsZW1lbnQ/CisgICAgLy8gbm93IF93cml0ZXIuc2V0UHJlZml4KCkgaXMgaW52b2tlZCBpbiBfd3JpdGVyLndyaXRlTmFtZXNwYWNlKCkKKy8vICAgICAgICB0cnkgeworLy8gICAgICAgICAgICBfd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIHVyaSk7CiAgICAgICAgICAgICBfbmFtZXNwYWNlcy5hZGQobmV3IFF1YWxpZmllZE5hbWUocHJlZml4LCB1cmkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KKy8vICAgICAgICB9CisvLyAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisvLyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7CisvLyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9TQVhFdmVudFNlcmlhbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1NBWEV2ZW50U2VyaWFsaXplci5qYXZhCmluZGV4IDRjNDE2YmUuLjIzODBjZmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1NBWEV2ZW50U2VyaWFsaXplci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1NBWEV2ZW50U2VyaWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnRvb2xzOwpAQCAtMTE4LDcgKzkxLDcgQEAKICAgICAgICAgICAgIF9uYW1lc3BhY2VBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIHFOYW1lID0gKHByZWZpeCA9PSAiIikgPyAieG1sbnMiIDogInhtbG5zIiArIHByZWZpeDsKKyAgICAgICAgU3RyaW5nIHFOYW1lID0gKHByZWZpeC5sZW5ndGgoKSA9PSAwKSA/ICJ4bWxucyIgOiAieG1sbnMiICsgcHJlZml4OwogICAgICAgICBBdHRyaWJ1dGVWYWx1ZUhvbGRlciBhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlVmFsdWVIb2xkZXIoCiAgICAgICAgICAgICAgICAgcU5hbWUsCiAgICAgICAgICAgICAgICAgcHJlZml4LApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvU3RBWDJTQVhSZWFkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1N0QVgyU0FYUmVhZGVyLmphdmEKaW5kZXggZTY0MWIzNi4uZjAxM2E1ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvU3RBWDJTQVhSZWFkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9TdEFYMlNBWFJlYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnRvb2xzOwpAQCAtMTg1LDcgKzE1OCw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UOgogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihDb21tb25SZXNvdXJjZUJ1bmRsZS5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygibWVzc2FnZS5TdEFYMlNBWFJlYWRlciIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihldmVudCl9KSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJtZXNzYWdlLlN0QVgyU0FYUmVhZGVyIiwgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihldmVudCl9KSk7CiAgICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2gKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvVHJhbnNmb3JtSW5wdXRPdXRwdXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1RyYW5zZm9ybUlucHV0T3V0cHV0LmphdmEKaW5kZXggZGVlMGRiMC4uMWZjMGYzOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvVHJhbnNmb3JtSW5wdXRPdXRwdXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9UcmFuc2Zvcm1JbnB1dE91dHB1dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDQ0ICsyNSwyMyBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC50b29sczsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LkNvbW1vblJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNmb3JtSW5wdXRPdXRwdXQgewogCkBAIC04OSw1ICs2OCw4NSBAQAogICAgICAgICBwYXJzZShpbiwgb3V0KTsKICAgICB9CiAKLSAgICBhYnN0cmFjdCB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgRXhjZXB0aW9uOworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLy8gcGFyc2UgYWx0ZXJuYXRpdmUgd2l0aCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHBhcmFtZXRlcgorICAgIC8vIGlzIHVzZWQgdG8gcHJvY2VzcyB4bWwgZG9jdW1lbnRzLCB3aGljaCBoYXZlIGV4dGVybmFsIGltcG9ydGVkIGVudGl0aWVzCisgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGN1cnJlbnRKYXZhV29ya2luZ0RpcmVjdG9yeTsKKyAgICBzdGF0aWMgeworICAgICAgICBjdXJyZW50SmF2YVdvcmtpbmdEaXJlY3RvcnkgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpLnRvVVJJKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBFbnRpdHlSZXNvbHZlciBjcmVhdGVSZWxhdGl2ZVBhdGhSZXNvbHZlcihmaW5hbCBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSkgeworICAgICAgICByZXR1cm4gbmV3IEVudGl0eVJlc29sdmVyKCkgeworICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCAmJiBzeXN0ZW1JZC5zdGFydHNXaXRoKCJmaWxlOi8iKSkgeworICAgICAgICAgICAgICAgICAgICBVUkkgd29ya2luZ0RpcmVjdG9yeVVSSSA9IG5ldyBGaWxlKHdvcmtpbmdEaXJlY3RvcnkpLnRvVVJJKCk7CisgICAgICAgICAgICAgICAgICAgIFVSSSB3b3JraW5nRmlsZTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdGlvbiBuZXcgRmlsZShuZXcgVVJJKFN0cmluZykpLnRvVVJJKCkgaXMgdXNlZCB0byBiZSBzdXJlIFVSSSBoYXMgY29ycmVjdCByZXByZXNlbnRhdGlvbiB3aXRob3V0IHJlZHVuZGFudCAnLycKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdGaWxlID0gY29udmVydFRvTmV3V29ya2luZ0RpcmVjdG9yeShjdXJyZW50SmF2YVdvcmtpbmdEaXJlY3RvcnksIHdvcmtpbmdEaXJlY3RvcnlVUkksIG5ldyBGaWxlKG5ldyBVUkkoc3lzdGVtSWQpKS50b1VSSSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2Uod29ya2luZ0ZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9TaG91bGQgbm90IGdldCBoZXJlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGNvbnZlcnRUb05ld1dvcmtpbmdEaXJlY3RvcnkoVVJJIG9sZHdkLCBVUkkgbmV3d2QsIFVSSSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBvbGR3ZFN0ciA9IG9sZHdkLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBuZXd3ZFN0ciA9IG5ld3dkLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBmaWxlU3RyID0gZmlsZS50b1N0cmluZygpOworCisgICAgICAgIFN0cmluZyBjbXBTdHIgPSBudWxsOworICAgICAgICAvLyBJbiBzaW1wbGllc3QgY2FzZSA8dXNlci5kaXI+L2ZpbGUueG1sIC0gZG8gaXQgZmFzdGVyCisgICAgICAgIGlmIChmaWxlU3RyLnN0YXJ0c1dpdGgob2xkd2RTdHIpICYmIChjbXBTdHIgPSBmaWxlU3RyLnN1YnN0cmluZyhvbGR3ZFN0ci5sZW5ndGgoKSkpLmluZGV4T2YoJy8nKSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkobmV3d2RTdHIgKyAnLycgKyBjbXBTdHIpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gb2xkd2RTcGxpdCA9IG9sZHdkU3RyLnNwbGl0KCIvIik7CisgICAgICAgIFN0cmluZ1tdIG5ld3dkU3BsaXQgPSBuZXd3ZFN0ci5zcGxpdCgiLyIpOworICAgICAgICBTdHJpbmdbXSBmaWxlU3BsaXQgPSBmaWxlU3RyLnNwbGl0KCIvIik7CisKKyAgICAgICAgaW50IGRpZmY7CisgICAgICAgIGZvcihkaWZmID0gMDsgZGlmZjxvbGR3ZFNwbGl0Lmxlbmd0aCAmIGRpZmY8ZmlsZVNwbGl0Lmxlbmd0aDsgZGlmZisrKSB7CisgICAgICAgICAgICBpZiAoIW9sZHdkU3BsaXRbZGlmZl0uZXF1YWxzKGZpbGVTcGxpdFtkaWZmXSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBkaWZmTmV3OworICAgICAgICBmb3IoZGlmZk5ldz0wOyBkaWZmTmV3PG5ld3dkU3BsaXQubGVuZ3RoICYmIGRpZmZOZXc8ZmlsZVNwbGl0Lmxlbmd0aDsgZGlmZk5ldysrKSB7CisgICAgICAgICAgICBpZiAoIW5ld3dkU3BsaXRbZGlmZk5ld10uZXF1YWxzKGZpbGVTcGxpdFtkaWZmTmV3XSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgY2FzZSwgd2hlbiBleHRybmFsIGltcG9ydGVkIGVudGl0eSBoYXMgaW1wb3J0cyBvdGhlciBlbnRpdHkKKyAgICAgICAgLy9pbiB0aGF0IGNhc2Ugc3lzdGVtSWQgaGFzIGNvcnJlY3QgcGF0aCwgbm90IGJhc2VkIG9uIHVzZXIuZGlyCisgICAgICAgIGlmIChkaWZmTmV3ID4gZGlmZikgeworICAgICAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZWxlbXNUb1N1YiA9IG9sZHdkU3BsaXQubGVuZ3RoIC0gZGlmZjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8bmV3d2RTcGxpdC5sZW5ndGggLSBlbGVtc1RvU3ViOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFN0ci5hcHBlbmQobmV3d2RTcGxpdFtpXSk7CisgICAgICAgICAgICByZXN1bHRTdHIuYXBwZW5kKCcvJyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IoaW50IGk9ZGlmZjsgaTxmaWxlU3BsaXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFN0ci5hcHBlbmQoZmlsZVNwbGl0W2ldKTsKKyAgICAgICAgICAgIGlmIChpIDwgZmlsZVNwbGl0Lmxlbmd0aCAtIDEpIHJlc3VsdFN0ci5hcHBlbmQoJy8nKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgVVJJKHJlc3VsdFN0ci50b1N0cmluZygpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9Wb2NhYnVsYXJ5R2VuZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9Wb2NhYnVsYXJ5R2VuZXJhdG9yLmphdmEKaW5kZXggMzZjNjJkZS4uZGVkOTdhNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvVm9jYWJ1bGFyeUdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1ZvY2FidWxhcnlHZW5lcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC50b29sczsKQEAgLTIyMyw3ICsxOTYsNyBAQAogCiAKICAgICBwdWJsaWMgdm9pZCBhZGRUb1RhYmxlKFN0cmluZyBzLCBTZXQgdiwgU3RyaW5nSW50TWFwIG0sIFN0cmluZ0FycmF5IGEpIHsKLSAgICAgICAgaWYgKHMgPT0gIiIpIHsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTIzNSw3ICsyMDgsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZFRvVGFibGUoU3RyaW5nIHMsIFNldCB2LCBTdHJpbmdJbnRNYXAgbSwgUHJlZml4QXJyYXkgYSkgewotICAgICAgICBpZiAocyA9PSAiIikgeworICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMjcyLDE4ICsyNDUsMTggQEAKICAgICAgICAgaW50IG5hbWVzcGFjZVVSSUluZGV4ID0gLTE7CiAgICAgICAgIGludCBwcmVmaXhJbmRleCA9IC0xOwogICAgICAgICBpbnQgbG9jYWxOYW1lSW5kZXggPSAtMTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSAiIikgeworICAgICAgICBpZiAobmFtZXNwYWNlVVJJLmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgbmFtZXNwYWNlVVJJSW5kZXggPSBfc2VyaWFsaXplclZvY2FidWxhcnkubmFtZXNwYWNlTmFtZS5nZXQobmFtZXNwYWNlVVJJKTsKICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUklJbmRleCA9PSBLZXlJbnRNYXAuTk9UX1BSRVNFTlQpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoIm1lc3NhZ2UubmFtZXNwYWNlVVJJTm90SW5kZXhlZCIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihuYW1lc3BhY2VVUklJbmRleCl9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoIm1lc3NhZ2UubmFtZXNwYWNlVVJJTm90SW5kZXhlZCIsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YobmFtZXNwYWNlVVJJSW5kZXgpfSkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocHJlZml4ICE9ICIiKSB7CisgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgIHByZWZpeEluZGV4ID0gX3NlcmlhbGl6ZXJWb2NhYnVsYXJ5LnByZWZpeC5nZXQocHJlZml4KTsKICAgICAgICAgICAgICAgICBpZiAocHJlZml4SW5kZXggPT0gS2V5SW50TWFwLk5PVF9QUkVTRU5UKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oQ29tbW9uUmVzb3VyY2VCdW5kbGUuZ2V0SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoIm1lc3NhZ2UucHJlZml4Tm90SW5kZXhlZCIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihwcmVmaXhJbmRleCl9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJtZXNzYWdlLnByZWZpeE5vdEluZGV4ZWQiLCBuZXcgT2JqZWN0W117SW50ZWdlci52YWx1ZU9mKHByZWZpeEluZGV4KX0pKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1hNTF9ET01fRkkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1hNTF9ET01fRkkuamF2YQppbmRleCBkMWI0YWIxLi42MjFkMWIwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9YTUxfRE9NX0ZJLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvWE1MX0RPTV9GSS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDkgKzIxLDkgQEAKICAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqCisgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudG9vbHM7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5kb20uRE9NRG9jdW1lbnRTZXJpYWxpemVyOwpAQCAtMzgsMTAgKzM4LDEzIEBACiAgICAgcHVibGljIFhNTF9ET01fRkkoKSB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBmaW5mKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIGZpbmYsIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBpZiAod29ya2luZ0RpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICBkYi5zZXRFbnRpdHlSZXNvbHZlcihjcmVhdGVSZWxhdGl2ZVBhdGhSZXNvbHZlcih3b3JraW5nRGlyZWN0b3J5KSk7CisgICAgICAgIH0KICAgICAgICAgRG9jdW1lbnQgZCA9IGRiLnBhcnNlKGRvY3VtZW50KTsKIAogICAgICAgICBET01Eb2N1bWVudFNlcmlhbGl6ZXIgcyA9IG5ldyBET01Eb2N1bWVudFNlcmlhbGl6ZXIoKTsKQEAgLTQ5LDYgKzUyLDEwIEBACiAgICAgICAgIHMuc2VyaWFsaXplKGQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGRvY3VtZW50LCBPdXRwdXRTdHJlYW0gZmluZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKGRvY3VtZW50LCBmaW5mLCBudWxsKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgWE1MX0RPTV9GSSBwID0gbmV3IFhNTF9ET01fRkkoKTsKICAgICAgICAgcC5wYXJzZShhcmdzKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1hNTF9ET01fU0FYX0ZJLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9YTUxfRE9NX1NBWF9GSS5qYXZhCmluZGV4IGQ1MDI3NmEuLjkwNTNlMjU5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9YTUxfRE9NX1NBWF9GSS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1hNTF9ET01fU0FYX0ZJLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudG9vbHM7CiAKQEAgLTczLDEwICs0NSwxMyBAQAogICAgIHB1YmxpYyBYTUxfRE9NX1NBWF9GSSgpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIGZpbmYpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGRvY3VtZW50LCBPdXRwdXRTdHJlYW0gZmluZiwgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwogICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIGlmICh3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRiLnNldEVudGl0eVJlc29sdmVyKGNyZWF0ZVJlbGF0aXZlUGF0aFJlc29sdmVyKHdvcmtpbmdEaXJlY3RvcnkpKTsKKyAgICAgICAgfQogICAgICAgICBEb2N1bWVudCBkID0gZGIucGFyc2UoZG9jdW1lbnQpOwogCiAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwpAQCAtODQsNiArNTksMTAgQEAKICAgICAgICAgdC50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkKSwgbmV3IEZhc3RJbmZvc2V0UmVzdWx0KGZpbmYpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIGZpbmYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwYXJzZShkb2N1bWVudCwgZmluZiwgbnVsbCk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFhNTF9ET01fU0FYX0ZJIHAgPSBuZXcgWE1MX0RPTV9TQVhfRkkoKTsKICAgICAgICAgcC5wYXJzZShhcmdzKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1hNTF9TQVhfRkkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3Rvb2xzL1hNTF9TQVhfRkkuamF2YQppbmRleCA0Mzc3YzE3Li45M2Q1MjgxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9YTUxfU0FYX0ZJLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvWE1MX1NBWF9GSS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnRvb2xzOwogCkBAIC02MywxOCArMzUsMjkgQEAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwogaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKIAogcHVibGljIGNsYXNzIFhNTF9TQVhfRkkgZXh0ZW5kcyBUcmFuc2Zvcm1JbnB1dE91dHB1dCB7CiAKICAgICBwdWJsaWMgWE1MX1NBWF9GSSgpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSB4bWwsIE91dHB1dFN0cmVhbSBmaW5mKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSB4bWwsIE91dHB1dFN0cmVhbSBmaW5mLCBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBnZXRQYXJzZXIoKTsKICAgICAgICAgU0FYRG9jdW1lbnRTZXJpYWxpemVyIGRvY3VtZW50U2VyaWFsaXplciA9IGdldFNlcmlhbGl6ZXIoZmluZik7CiAKLSAgICAgICAgc2F4UGFyc2VyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBkb2N1bWVudFNlcmlhbGl6ZXIpOwotICAgICAgICBzYXhQYXJzZXIucGFyc2UoeG1sLCBkb2N1bWVudFNlcmlhbGl6ZXIpOworICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOworICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGRvY3VtZW50U2VyaWFsaXplcik7CisgICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihkb2N1bWVudFNlcmlhbGl6ZXIpOworCisgICAgICAgIGlmICh3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihjcmVhdGVSZWxhdGl2ZVBhdGhSZXNvbHZlcih3b3JraW5nRGlyZWN0b3J5KSk7CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZSh4bWwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSB4bWwsIE91dHB1dFN0cmVhbSBmaW5mKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoeG1sLCBmaW5mLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjb252ZXJ0KFJlYWRlciByZWFkZXIsIE91dHB1dFN0cmVhbSBmaW5mKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTkyLDggKzc1LDcgQEAKICAgICAgICAgc2F4UGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDMsNiArODUsNyBAQAogICAgICAgICBkb2N1bWVudFNlcmlhbGl6ZXIuc2V0T3V0cHV0U3RyZWFtKGZpbmYpOwogICAgICAgICByZXR1cm4gZG9jdW1lbnRTZXJpYWxpemVyOwogICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBYTUxfU0FYX0ZJIHMgPSBuZXcgWE1MX1NBWF9GSSgpOwogICAgICAgICBzLnBhcnNlKGFyZ3MpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdG9vbHMvWE1MX1NBWF9TdEFYX0ZJLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9YTUxfU0FYX1N0QVhfRkkuamF2YQppbmRleCA4MWE2ZjJiLi41Y2Q4ZDU1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9YTUxfU0FYX1N0QVhfRkkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC90b29scy9YTUxfU0FYX1N0QVhfRkkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC50b29sczsKIApAQCAtNjEsMTQgKzMzLDE1IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudG9vbHMuU0FYMlN0QVhXcml0ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwogCiBwdWJsaWMgY2xhc3MgWE1MX1NBWF9TdEFYX0ZJIGV4dGVuZHMgVHJhbnNmb3JtSW5wdXRPdXRwdXQgewogCiAgICAgcHVibGljIFhNTF9TQVhfU3RBWF9GSSgpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSB4bWwsIE91dHB1dFN0cmVhbSBmaW5mKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSB4bWwsIE91dHB1dFN0cmVhbSBmaW5mLCBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIgZG9jdW1lbnRTZXJpYWxpemVyID0gbmV3IFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIoKTsKICAgICAgICAgZG9jdW1lbnRTZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbShmaW5mKTsKIApAQCAtNzgsMTIgKzUxLDIzIEBACiAgICAgICAgIHNheFBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CiAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwogCi0gICAgICAgIHNheFBhcnNlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgc2F4VG9zdGF4KTsKLSAgICAgICAgc2F4UGFyc2VyLnBhcnNlKHhtbCwgc2F4VG9zdGF4KTsKKyAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKKyAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBzYXhUb3N0YXgpOworICAgICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoc2F4VG9zdGF4KTsKKworICAgICAgICBpZiAod29ya2luZ0RpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICByZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIoY3JlYXRlUmVsYXRpdmVQYXRoUmVzb2x2ZXIod29ya2luZ0RpcmVjdG9yeSkpOworICAgICAgICB9CisgICAgICAgIHJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoeG1sKSk7CisKICAgICAgICAgeG1sLmNsb3NlKCk7CiAgICAgICAgIGZpbmYuY2xvc2UoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSB4bWwsIE91dHB1dFN0cmVhbSBmaW5mKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoeG1sLCBmaW5mLCBudWxsKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgWE1MX1NBWF9TdEFYX0ZJIHMgPSBuZXcgWE1MX1NBWF9TdEFYX0ZJKCk7CiAgICAgICAgIHMucGFyc2UoYXJncyk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0NoYXJBcnJheS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9DaGFyQXJyYXkuamF2YQppbmRleCAwZDE5OWQ3Li5hMTlkOTYxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0NoYXJBcnJheS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvQ2hhckFycmF5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbDsKIApAQCAtMTA3LDYgKzc5LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXNoQ29kZShjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgICAgICAvLyBTYW1lIGhhc2ggY29kZSBhbGdvcml0aG0gYXMgdXNlZCBmb3IgU3RyaW5nCisgICAgICAgIC8vIHNbMF0qMzFeKG4tMSkgKyBzWzFdKjMxXihuLTIpICsgLi4uICsgc1tuLTFdCiAgICAgICAgIGludCBoYXNoID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgaGFzaCA9IDMxKmhhc2ggKyBjaFtpXTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvQ2hhckFycmF5QXJyYXkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvQ2hhckFycmF5QXJyYXkuamF2YQppbmRleCBkMjIzYjA2Li5mMjcxNWQ5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0NoYXJBcnJheUFycmF5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9DaGFyQXJyYXlBcnJheS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWw7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0NoYXJBcnJheUludE1hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9DaGFyQXJyYXlJbnRNYXAuamF2YQppbmRleCBhMmFiYTZjLi41ZmE2NDIyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0NoYXJBcnJheUludE1hcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvQ2hhckFycmF5SW50TWFwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNDIgKzI1LDE4IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWw7CisKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5Db21tb25SZXNvdXJjZUJ1bmRsZTsKIAogcHVibGljIGNsYXNzIENoYXJBcnJheUludE1hcCBleHRlbmRzIEtleUludE1hcCB7CiAKICAgICBwcml2YXRlIENoYXJBcnJheUludE1hcCBfcmVhZE9ubHlNYXA7CiAKKyAgICAvLyBUb3RhbCBjaGFyYWN0ZXIgY291bnQgb2YgTWFwCisgICAgcHJvdGVjdGVkIGludCBfdG90YWxDaGFyYWN0ZXJDb3VudDsKKwogICAgIHN0YXRpYyBjbGFzcyBFbnRyeSBleHRlbmRzIEJhc2VFbnRyeSB7CiAgICAgICAgIGZpbmFsIGNoYXJbXSBfY2g7CiAgICAgICAgIGZpbmFsIGludCBfc3RhcnQ7CkBAIC0xMTMsNiArODksNyBAQAogICAgICAgICAgICAgX3RhYmxlW2ldID0gbnVsbDsKICAgICAgICAgfQogICAgICAgICBfc2l6ZSA9IDA7CisgICAgICAgIF90b3RhbENoYXJhY3RlckNvdW50ID0gMDsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSZWFkT25seU1hcChLZXlJbnRNYXAgcmVhZE9ubHlNYXAsIGJvb2xlYW4gY2xlYXIpIHsKQEAgLTE2Niw2ICsxNDMsMTAgQEAKICAgICAgICAgcmV0dXJuIE5PVF9QUkVTRU5UOwogICAgIH0KIAorICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VG90YWxDaGFyYWN0ZXJDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIF90b3RhbENoYXJhY3RlckNvdW50OworICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgaW50IGdldChjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCwgaW50IGhhc2gpIHsKICAgICAgICAgaWYgKF9yZWFkT25seU1hcCAhPSBudWxsKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgaSA9IF9yZWFkT25seU1hcC5nZXQoY2gsIHN0YXJ0LCBsZW5ndGgsIGhhc2gpOwpAQCAtMTg3LDcgKzE2OCw4IEBACiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZEVudHJ5KGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCwgaW50IHZhbHVlLCBpbnQgYnVja2V0SW5kZXgpIHsKICAgICAgICAgRW50cnkgZSA9IF90YWJsZVtidWNrZXRJbmRleF07CiAgICAgICAgIF90YWJsZVtidWNrZXRJbmRleF0gPSBuZXcgRW50cnkoY2gsIHN0YXJ0LCBsZW5ndGgsIGhhc2gsIHZhbHVlLCBlKTsKLSAgICAgICAgaWYgKF9zaXplKysgPj0gX3RocmVzaG9sZCkgeworICAgICAgICBfdG90YWxDaGFyYWN0ZXJDb3VudCArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKF9zaXplKysgPj0gX3RocmVzaG9sZCkgewogICAgICAgICAgICAgcmVzaXplKDIgKiBfdGFibGUubGVuZ3RoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvQ2hhckFycmF5U3RyaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0NoYXJBcnJheVN0cmluZy5qYXZhCmluZGV4IGZmODE5NmMuLjBlOWExZGIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvQ2hhckFycmF5U3RyaW5nLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9DaGFyQXJyYXlTdHJpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC51dGlsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9Db250aWd1b3VzQ2hhckFycmF5QXJyYXkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvQ29udGlndW91c0NoYXJBcnJheUFycmF5LmphdmEKaW5kZXggZTU3NTk2MC4uODAxNTRkNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9Db250aWd1b3VzQ2hhckFycmF5QXJyYXkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0NvbnRpZ3VvdXNDaGFyQXJyYXlBcnJheS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuQ29tbW9uUmVzb3VyY2VCdW5kbGU7CkBAIC0xNzgsNiArMTUwLDI0IEBACiAgICAgICAgIHJldHVybiBfY2FjaGVkU3RyaW5nc1tpXSA9IG5ldyBTdHJpbmcoX2FycmF5LCBfb2Zmc2V0W2ldLCBfbGVuZ3RoW2ldKTsKICAgICB9CiAKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnN1cmVTaXplKGludCBsKSB7CisgICAgICAgIGlmIChfYXJyYXlJbmRleCArIGwgPj0gX2FycmF5Lmxlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplQXJyYXkoX2FycmF5SW5kZXggKyBsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZChpbnQgbCkgeworICAgICAgICBpZiAoX3NpemUgPT0gX29mZnNldC5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgX2NhY2hlZEluZGV4ID0gX3NpemU7CisgICAgICAgIF9vZmZzZXRbX3NpemVdID0gX2FycmF5SW5kZXg7CisgICAgICAgIF9sZW5ndGhbX3NpemUrK10gPSBsOworCisgICAgICAgIF9hcnJheUluZGV4ICs9IGw7CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIGludCBhZGQoY2hhcltdIGMsIGludCBsKSB7CiAgICAgICAgIGlmIChfc2l6ZSA9PSBfb2Zmc2V0Lmxlbmd0aCkgewogICAgICAgICAgICAgcmVzaXplKCk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0R1cGxpY2F0ZUF0dHJpYnV0ZVZlcmlmaWVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0R1cGxpY2F0ZUF0dHJpYnV0ZVZlcmlmaWVyLmphdmEKaW5kZXggOTExMWVmMi4uN2EyY2I5MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9EdXBsaWNhdGVBdHRyaWJ1dGVWZXJpZmllci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvRHVwbGljYXRlQXR0cmlidXRlVmVyaWZpZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw5ICsyMSw5IEBACiAgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKgorICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KLQotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWw7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuRmFzdEluZm9zZXRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0ZpeGVkRW50cnlTdHJpbmdJbnRNYXAuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvRml4ZWRFbnRyeVN0cmluZ0ludE1hcC5qYXZhCmluZGV4IGE4ZWY4NjYuLmMxZTcwYWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvRml4ZWRFbnRyeVN0cmluZ0ludE1hcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvRml4ZWRFbnRyeVN0cmluZ0ludE1hcC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWw7CkBAIC02OCw3ICs0MSw3IEBACiAgICAgICAgIC8vIEFkZCB0aGUgZml4ZWQgZW50cnkKICAgICAgICAgZmluYWwgaW50IGhhc2ggPSBoYXNoSGFzaChmaXhlZEVudHJ5Lmhhc2hDb2RlKCkpOwogICAgICAgICBmaW5hbCBpbnQgdGFibGVJbmRleCA9IGluZGV4Rm9yKGhhc2gsIF90YWJsZS5sZW5ndGgpOwotICAgICAgICBfdGFibGVbdGFibGVJbmRleF0gPSBfZml4ZWRFbnRyeSA9IG5ldyBFbnRyeShmaXhlZEVudHJ5LCBoYXNoLCAwLCBudWxsKTsKKyAgICAgICAgX3RhYmxlW3RhYmxlSW5kZXhdID0gX2ZpeGVkRW50cnkgPSBuZXcgRW50cnkoZml4ZWRFbnRyeSwgaGFzaCwgX2luZGV4KyssIG51bGwpOwogICAgICAgICBpZiAoX3NpemUrKyA+PSBfdGhyZXNob2xkKSB7CiAgICAgICAgICAgICByZXNpemUoMiAqIF90YWJsZS5sZW5ndGgpOwogICAgICAgICB9CkBAIC04NiwxMSArNTksMTcgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdGFibGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIF90YWJsZVtpXSA9IG51bGw7CiAgICAgICAgIH0KKyAgICAgICAgX2xhc3RFbnRyeSA9IE5VTExfRU5UUlk7CisKICAgICAgICAgaWYgKF9maXhlZEVudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIGludCB0YWJsZUluZGV4ID0gaW5kZXhGb3IoX2ZpeGVkRW50cnkuX2hhc2gsIF90YWJsZS5sZW5ndGgpOwogICAgICAgICAgICAgX3RhYmxlW3RhYmxlSW5kZXhdID0gX2ZpeGVkRW50cnk7CiAgICAgICAgICAgICBfZml4ZWRFbnRyeS5fbmV4dCA9IG51bGw7CiAgICAgICAgICAgICBfc2l6ZSA9IDE7CisgICAgICAgICAgICBfaW5kZXggPSBfcmVhZE9ubHlNYXBTaXplICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9zaXplID0gMDsKKyAgICAgICAgICAgIF9pbmRleCA9IF9yZWFkT25seU1hcFNpemU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwOCw2ICs4Nyw3IEBACiAgICAgICAgIGlmIChfcmVhZE9ubHlNYXAgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVhZE9ubHlNYXAucmVtb3ZlRml4ZWRFbnRyeSgpOwogICAgICAgICAgICAgX3JlYWRPbmx5TWFwU2l6ZSA9IHJlYWRPbmx5TWFwLnNpemUoKTsKKyAgICAgICAgICAgIF9pbmRleCA9IF9yZWFkT25seU1hcFNpemUgKyBfc2l6ZTsKICAgICAgICAgICAgIGlmIChjbGVhcikgewogICAgICAgICAgICAgICAgIGNsZWFyKCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0tleUludE1hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9LZXlJbnRNYXAuamF2YQppbmRleCBmODFmZDAwLi5kYTdhYWI0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0tleUludE1hcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvS2V5SW50TWFwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbDsKQEAgLTEwOSwxMiArODIsMTIgQEAKICAgICBwdWJsaWMgS2V5SW50TWFwKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKICAgICAgICAgaWYgKGluaXRpYWxDYXBhY2l0eSA8IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuCi0gICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5pbGxlZ2FsSW5pdGlhbENhcGFjaXR5IiwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKGluaXRpYWxDYXBhY2l0eSl9KSk7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5pbGxlZ2FsSW5pdGlhbENhcGFjaXR5IiwgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihpbml0aWFsQ2FwYWNpdHkpfSkpOwogICAgICAgICBpZiAoaW5pdGlhbENhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkKICAgICAgICAgICAgIGluaXRpYWxDYXBhY2l0eSA9IE1BWElNVU1fQ0FQQUNJVFk7CiAgICAgICAgIGlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbW1vblJlc291cmNlQnVuZGxlLmdldEluc3RhbmNlKCkuCi0gICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5pbGxlZ2FsTG9hZEZhY3RvciIsIG5ldyBPYmplY3RbXXtuZXcgRmxvYXQobG9hZEZhY3Rvcil9KSk7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZygibWVzc2FnZS5pbGxlZ2FsTG9hZEZhY3RvciIsIG5ldyBPYmplY3RbXXtGbG9hdC52YWx1ZU9mKGxvYWRGYWN0b3IpfSkpOwogCiAgICAgICAgIC8vIEZpbmQgYSBwb3dlciBvZiAyID49IGluaXRpYWxDYXBhY2l0eQogICAgICAgICBpZiAoaW5pdGlhbENhcGFjaXR5ICE9IERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9Mb2NhbE5hbWVRdWFsaWZpZWROYW1lc01hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9Mb2NhbE5hbWVRdWFsaWZpZWROYW1lc01hcC5qYXZhCmluZGV4IGI5MWZkNGEuLmVmYmNlZjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvTG9jYWxOYW1lUXVhbGlmaWVkTmFtZXNNYXAuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL0xvY2FsTmFtZVF1YWxpZmllZE5hbWVzTWFwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbDsKQEAgLTE0MywxMyArMTE2LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1FOYW1lRnJvbVJlYWRPbmx5TWFwKFF1YWxpZmllZE5hbWUgbmFtZSkgeworICAgICAgICByZXR1cm4gKF9yZWFkT25seU1hcCAhPSBudWxsICYmIG5hbWUuaW5kZXggPD0gX3JlYWRPbmx5TWFwLmdldEluZGV4KCkpOworICAgIH0KKwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TmV4dEluZGV4KCkgewogICAgICAgICByZXR1cm4gX2luZGV4Kys7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRJbmRleCgpIHsKICAgICAgICAgcmV0dXJuIF9pbmRleDsKLQogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBFbnRyeSBvYnRhaW5FbnRyeShTdHJpbmcga2V5KSB7CkBAIC0xNzIsNiArMTQ4LDE5IEBACiAgICAgICAgIHJldHVybiBhZGRFbnRyeShrZXksIGhhc2gsIHRhYmxlSW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBmaW5hbCBFbnRyeSBvYnRhaW5EeW5hbWljRW50cnkoU3RyaW5nIGtleSkgeworICAgICAgICBmaW5hbCBpbnQgaGFzaCA9IGhhc2hIYXNoKGtleS5oYXNoQ29kZSgpKTsKKworICAgICAgICBmaW5hbCBpbnQgdGFibGVJbmRleCA9IGluZGV4Rm9yKGhhc2gsIF90YWJsZS5sZW5ndGgpOworICAgICAgICBmb3IgKEVudHJ5IGUgPSBfdGFibGVbdGFibGVJbmRleF07IGUgIT0gbnVsbDsgZSA9IGUuX25leHQpIHsKKyAgICAgICAgICAgIGlmIChlLl9oYXNoID09IGhhc2ggJiYgZXEoa2V5LCBlLl9rZXkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRkRW50cnkoa2V5LCBoYXNoLCB0YWJsZUluZGV4KTsKKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIEVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXksIGludCBoYXNoKSB7CiAgICAgICAgIGlmIChfcmVhZE9ubHlNYXAgIT0gbnVsbCkgewogICAgICAgICAgICAgZmluYWwgRW50cnkgZW50cnkgPSBfcmVhZE9ubHlNYXAuZ2V0RW50cnkoa2V5LCBoYXNoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvTmFtZXNwYWNlQ29udGV4dEltcGxlbWVudGF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL05hbWVzcGFjZUNvbnRleHRJbXBsZW1lbnRhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjEzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL05hbWVzcGFjZUNvbnRleHRJbXBsZW1lbnRhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICoKKyAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsLlNhbmRvekBTdW4uQ29tCisgKi8KK2ZpbmFsIHB1YmxpYyBjbGFzcyBOYW1lc3BhY2VDb250ZXh0SW1wbGVtZW50YXRpb24gaW1wbGVtZW50cyBOYW1lc3BhY2VDb250ZXh0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgREVGQVVMVF9TSVpFID0gODsKKworICAgIHByaXZhdGUgU3RyaW5nW10gcHJlZml4ZXMgPSBuZXcgU3RyaW5nW0RFRkFVTFRfU0laRV07CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBuYW1lc3BhY2VVUklzID0gbmV3IFN0cmluZ1tERUZBVUxUX1NJWkVdOworICAgIHByaXZhdGUgaW50IG5hbWVzcGFjZVBvc2l0aW9uOworCisgICAgcHJpdmF0ZSBpbnRbXSBjb250ZXh0cyA9IG5ldyBpbnRbREVGQVVMVF9TSVpFXTsKKyAgICBwcml2YXRlIGludCBjb250ZXh0UG9zaXRpb247CisKKyAgICBwcml2YXRlIGludCBjdXJyZW50Q29udGV4dDsKKworICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0SW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIHByZWZpeGVzWzBdID0gInhtbCI7CisgICAgICAgIG5hbWVzcGFjZVVSSXNbMF0gPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKKyAgICAgICAgcHJlZml4ZXNbMV0gPSAieG1sbnMiOworICAgICAgICBuYW1lc3BhY2VVUklzWzFdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsKKworICAgICAgICBjdXJyZW50Q29udGV4dCA9IG5hbWVzcGFjZVBvc2l0aW9uID0gMjsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgcHJlZml4ID0gcHJlZml4LmludGVybigpOworCisgICAgICAgIGZvciAoaW50IGkgPSBuYW1lc3BhY2VQb3NpdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVjbGFyZWRQcmVmaXggPSBwcmVmaXhlc1tpXTsKKyAgICAgICAgICAgIGlmIChkZWNsYXJlZFByZWZpeCA9PSBwcmVmaXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CisgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIC8vIG5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSS5pbnRlcm4oKTsKKworICAgICAgICBmb3IgKGludCBpID0gbmFtZXNwYWNlUG9zaXRpb24gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlY2xhcmVkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJc1tpXTsKKyAgICAgICAgICAgIGlmIChkZWNsYXJlZE5hbWVzcGFjZVVSSSA9PSBuYW1lc3BhY2VVUkkgfHwgZGVjbGFyZWROYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZVVSSSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVjbGFyZWRQcmVmaXggPSBwcmVmaXhlc1tpXTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHByZWZpeCBpcyBvdXQgb2Ygc2NvcGUKKyAgICAgICAgICAgICAgICBmb3IgKCsraTsgaSA8IG5hbWVzcGFjZVBvc2l0aW9uOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJlZFByZWZpeCA9PSBwcmVmaXhlc1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2xhcmVkUHJlZml4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROb25EZWZhdWx0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKKyAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgLy8gbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJLmludGVybigpOworCisgICAgICAgIGZvciAoaW50IGkgPSBuYW1lc3BhY2VQb3NpdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVjbGFyZWROYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUklzW2ldOworICAgICAgICAgICAgaWYgKChkZWNsYXJlZE5hbWVzcGFjZVVSSSA9PSBuYW1lc3BhY2VVUkkgfHwgZGVjbGFyZWROYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZVVSSSkpICYmCisgICAgICAgICAgICAgICAgcHJlZml4ZXNbaV0ubGVuZ3RoKCkgPiAwKXsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVjbGFyZWRQcmVmaXggPSBwcmVmaXhlc1tpXTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHByZWZpeCBpcyBvdXQgb2Ygc2NvcGUKKyAgICAgICAgICAgICAgICBmb3IgKCsraTsgaSA8IG5hbWVzcGFjZVBvc2l0aW9uOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJlZFByZWZpeCA9PSBwcmVmaXhlc1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2xhcmVkUHJlZml4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFByZWZpeGVzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKKyAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgLy8gbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJLmludGVybigpOworCisgICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBOQU1FU1BBQ0VfTE9PUDogZm9yIChpbnQgaSA9IG5hbWVzcGFjZVBvc2l0aW9uIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZWNsYXJlZE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSXNbaV07CisgICAgICAgICAgICBpZiAoZGVjbGFyZWROYW1lc3BhY2VVUkkgPT0gbmFtZXNwYWNlVVJJIHx8IGRlY2xhcmVkTmFtZXNwYWNlVVJJLmVxdWFscyhuYW1lc3BhY2VVUkkpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlY2xhcmVkUHJlZml4ID0gcHJlZml4ZXNbaV07CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBwcmVmaXggaXMgb3V0IG9mIHNjb3BlCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbmFtZXNwYWNlUG9zaXRpb247IGorKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmVkUHJlZml4ID09IHByZWZpeGVzW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgTkFNRVNQQUNFX0xPT1A7CisKKyAgICAgICAgICAgICAgICBsLmFkZChkZWNsYXJlZFByZWZpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbC5pdGVyYXRvcigpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBwcmVmaXhlc1tpbmRleF07CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBuYW1lc3BhY2VVUklzW2luZGV4XTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRDb250ZXh0U3RhcnRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudENvbnRleHRFbmRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVBvc2l0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ3VycmVudENvbnRleHRFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0ID09IG5hbWVzcGFjZVBvc2l0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVQcmVmaXgoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgICAgICBwcmVmaXggPSBwcmVmaXguaW50ZXJuKCk7CisgICAgICAgIG5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSS5pbnRlcm4oKTsKKworICAgICAgICAvLyBJZ25vcmUgdGhlICJ4bWwiIG9yICJ4bWxucyIgZGVjbGFyYXRpb25zCisgICAgICAgIGlmIChwcmVmaXggPT0gInhtbCIgfHwgcHJlZml4ID09ICJ4bWxucyIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gUmVwbGFjZSBhbnkgcHJldmlvdXMgZGVjbGFyYXRpb24KKyAgICAgICAgZm9yIChpbnQgaSA9IGN1cnJlbnRDb250ZXh0OyBpIDwgbmFtZXNwYWNlUG9zaXRpb247IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlY2xhcmVkUHJlZml4ID0gcHJlZml4ZXNbaV07CisgICAgICAgICAgICBpZiAoZGVjbGFyZWRQcmVmaXggPT0gcHJlZml4KSB7CisgICAgICAgICAgICAgICAgcHJlZml4ZXNbaV0gPSBwcmVmaXg7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJc1tpXSA9IG5hbWVzcGFjZVVSSTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobmFtZXNwYWNlUG9zaXRpb24gPT0gbmFtZXNwYWNlVVJJcy5sZW5ndGgpCisgICAgICAgICAgICByZXNpemVOYW1lc3BhY2VzKCk7CisKKyAgICAgICAgLy8gQWRkIG5ldyBkZWNsYXJhdGlvbgorICAgICAgICBwcmVmaXhlc1tuYW1lc3BhY2VQb3NpdGlvbl0gPSBwcmVmaXg7CisgICAgICAgIG5hbWVzcGFjZVVSSXNbbmFtZXNwYWNlUG9zaXRpb24rK10gPSBuYW1lc3BhY2VVUkk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2l6ZU5hbWVzcGFjZXMoKSB7CisgICAgICAgIGZpbmFsIGludCBuZXdMZW5ndGggPSBuYW1lc3BhY2VVUklzLmxlbmd0aCAqIDMgLyAyICsgMTsKKworICAgICAgICBTdHJpbmdbXSBuZXdQcmVmaXhlcyA9IG5ldyBTdHJpbmdbbmV3TGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShwcmVmaXhlcywgMCwgbmV3UHJlZml4ZXMsIDAsIHByZWZpeGVzLmxlbmd0aCk7CisgICAgICAgIHByZWZpeGVzID0gbmV3UHJlZml4ZXM7CisKKyAgICAgICAgU3RyaW5nW10gbmV3TmFtZXNwYWNlVVJJcyA9IG5ldyBTdHJpbmdbbmV3TGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lc3BhY2VVUklzLCAwLCBuZXdOYW1lc3BhY2VVUklzLCAwLCBuYW1lc3BhY2VVUklzLmxlbmd0aCk7CisgICAgICAgIG5hbWVzcGFjZVVSSXMgPSBuZXdOYW1lc3BhY2VVUklzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2hDb250ZXh0KCkgeworICAgICAgICBpZiAoY29udGV4dFBvc2l0aW9uID09IGNvbnRleHRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJlc2l6ZUNvbnRleHRzKCk7CisKKyAgICAgICAgY29udGV4dHNbY29udGV4dFBvc2l0aW9uKytdID0gY3VycmVudENvbnRleHQgPSBuYW1lc3BhY2VQb3NpdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzaXplQ29udGV4dHMoKSB7CisgICAgICAgIGludFtdIG5ld0NvbnRleHRzID0gbmV3IGludFtjb250ZXh0cy5sZW5ndGggKiAzIC8gMiArIDFdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbnRleHRzLCAwLCBuZXdDb250ZXh0cywgMCwgY29udGV4dHMubGVuZ3RoKTsKKyAgICAgICAgY29udGV4dHMgPSBuZXdDb250ZXh0czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3BDb250ZXh0KCkgeworICAgICAgICBpZiAoY29udGV4dFBvc2l0aW9uID4gMCkgeworICAgICAgICAgICAgbmFtZXNwYWNlUG9zaXRpb24gPSBjdXJyZW50Q29udGV4dCA9IGNvbnRleHRzWy0tY29udGV4dFBvc2l0aW9uXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBjdXJyZW50Q29udGV4dCA9IG5hbWVzcGFjZVBvc2l0aW9uID0gMjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1ByZWZpeEFycmF5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1ByZWZpeEFycmF5LmphdmEKaW5kZXggYmVhYzc4OGIuLjg4NjBiYzkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvUHJlZml4QXJyYXkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1ByZWZpeEFycmF5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzUgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LkVuY29kaW5nQ29uc3RhbnRzOwpAQCAtMzAyLDEzICsyNzMsMTMgQEAKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShfYXJyYXksIDAsIG5ld0FycmF5LCAwLCBfc2l6ZSk7CiAgICAgICAgIF9hcnJheSA9IG5ld0FycmF5OwogCi0gICAgICAgIG5ld1NpemUgKz0gX3JlYWRPbmx5QXJyYXlTaXplOwotICAgICAgICBmaW5hbCBOYW1lc3BhY2VFbnRyeVtdIG5ld0luU2NvcGVOYW1lc3BhY2VzID0gbmV3IE5hbWVzcGFjZUVudHJ5W25ld1NpemUgKyAyXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShfaW5TY29wZU5hbWVzcGFjZXMsIDAsIG5ld0luU2NvcGVOYW1lc3BhY2VzLCAwLCBfcmVhZE9ubHlBcnJheVNpemUgKyBfc2l6ZSArIDIpOworICAgICAgICBuZXdTaXplICs9IDI7CisgICAgICAgIGZpbmFsIE5hbWVzcGFjZUVudHJ5W10gbmV3SW5TY29wZU5hbWVzcGFjZXMgPSBuZXcgTmFtZXNwYWNlRW50cnlbbmV3U2l6ZV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2luU2NvcGVOYW1lc3BhY2VzLCAwLCBuZXdJblNjb3BlTmFtZXNwYWNlcywgMCwgX2luU2NvcGVOYW1lc3BhY2VzLmxlbmd0aCk7CiAgICAgICAgIF9pblNjb3BlTmFtZXNwYWNlcyA9IG5ld0luU2NvcGVOYW1lc3BhY2VzOwogCi0gICAgICAgIGZpbmFsIGludFtdIG5ld0N1cnJlbnRJblNjb3BlID0gbmV3IGludFtuZXdTaXplICsgMl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2N1cnJlbnRJblNjb3BlLCAwLCBuZXdDdXJyZW50SW5TY29wZSwgMCwgX3JlYWRPbmx5QXJyYXlTaXplICsgX3NpemUgKyAyKTsKKyAgICAgICAgZmluYWwgaW50W10gbmV3Q3VycmVudEluU2NvcGUgPSBuZXcgaW50W25ld1NpemVdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9jdXJyZW50SW5TY29wZSwgMCwgbmV3Q3VycmVudEluU2NvcGUsIDAsIF9jdXJyZW50SW5TY29wZS5sZW5ndGgpOwogICAgICAgICBfY3VycmVudEluU2NvcGUgPSBuZXdDdXJyZW50SW5TY29wZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvUXVhbGlmaWVkTmFtZUFycmF5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1F1YWxpZmllZE5hbWVBcnJheS5qYXZhCmluZGV4IDhmNzc4MTAuLmRhOTJmOWQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvUXVhbGlmaWVkTmFtZUFycmF5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9RdWFsaWZpZWROYW1lQXJyYXkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC51dGlsOwpAQCAtNzUsOSArNDgsNiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKCkgewotICAgICAgICBmb3IgKGludCBpID0gX3JlYWRPbmx5QXJyYXlTaXplOyBpIDwgX3NpemU7IGkrKykgewotICAgICAgICAgICAgX2FycmF5W2ldID0gbnVsbDsKLSAgICAgICAgfQogICAgICAgICBfc2l6ZSA9IF9yZWFkT25seUFycmF5U2l6ZTsKICAgICB9CiAKQEAgLTExOSw4ICs4OSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBnZXQoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIF9hcnJheVtpXTsKKyAgICBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBnZXROZXh0KCkgeworICAgICAgICByZXR1cm4gKF9zaXplID09IF9hcnJheS5sZW5ndGgpID8gbnVsbCA6IF9hcnJheVtfc2l6ZV07CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKFF1YWxpZmllZE5hbWUgcykgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9TdHJpbmdBcnJheS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9TdHJpbmdBcnJheS5qYXZhCmluZGV4IDk5YzJhOTEuLmNkYzM5ZmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvU3RyaW5nQXJyYXkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1N0cmluZ0FycmF5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbDsKQEAgLTYzLDE3ICszNiwyMCBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmdBcnJheSBfcmVhZE9ubHlBcnJheTsKIAotICAgIHB1YmxpYyBTdHJpbmdBcnJheShpbnQgaW5pdGlhbENhcGFjaXR5LCBpbnQgbWF4aW11bUNhcGFjaXR5KSB7CisgICAgcHJpdmF0ZSBib29sZWFuIF9jbGVhcjsKKworICAgIHB1YmxpYyBTdHJpbmdBcnJheShpbnQgaW5pdGlhbENhcGFjaXR5LCBpbnQgbWF4aW11bUNhcGFjaXR5LCBib29sZWFuIGNsZWFyKSB7CiAgICAgICAgIF9hcnJheSA9IG5ldyBTdHJpbmdbaW5pdGlhbENhcGFjaXR5XTsKICAgICAgICAgX21heGltdW1DYXBhY2l0eSA9IG1heGltdW1DYXBhY2l0eTsKKyAgICAgICAgX2NsZWFyID0gY2xlYXI7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZ0FycmF5KCkgewotICAgICAgICB0aGlzKERFRkFVTFRfQ0FQQUNJVFksIE1BWElNVU1fQ0FQQUNJVFkpOworICAgICAgICB0aGlzKERFRkFVTFRfQ0FQQUNJVFksIE1BWElNVU1fQ0FQQUNJVFksIGZhbHNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IF9yZWFkT25seUFycmF5U2l6ZTsgaSA8IF9zaXplOyBpKyspIHsKKyAgICAgICAgaWYgKF9jbGVhcikgZm9yIChpbnQgaSA9IF9yZWFkT25seUFycmF5U2l6ZTsgaSA8IF9zaXplOyBpKyspIHsKICAgICAgICAgICAgIF9hcnJheVtpXSA9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgX3NpemUgPSBfcmVhZE9ubHlBcnJheVNpemU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1N0cmluZ0ludE1hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9TdHJpbmdJbnRNYXAuamF2YQppbmRleCBiODFlYTEwLi4zOGE3NTgyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1N0cmluZ0ludE1hcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvU3RyaW5nSW50TWFwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudXRpbDsKQEAgLTU5LDYgKzMyLDcgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5Db21tb25SZXNvdXJjZUJ1bmRsZTsKIAogcHVibGljIGNsYXNzIFN0cmluZ0ludE1hcCBleHRlbmRzIEtleUludE1hcCB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnRyeSBOVUxMX0VOVFJZID0gbmV3IEVudHJ5KG51bGwsIDAsIC0xLCBudWxsKTsKIAogICAgIHByb3RlY3RlZCBTdHJpbmdJbnRNYXAgX3JlYWRPbmx5TWFwOwogCkBAIC03Myw4ICs0NywxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIEVudHJ5IF9sYXN0RW50cnkgPSBOVUxMX0VOVFJZOworCiAgICAgcHJvdGVjdGVkIEVudHJ5W10gX3RhYmxlOwogCisgICAgcHJvdGVjdGVkIGludCBfaW5kZXg7CisKKyAgICAvLyBUb3RhbCBjaGFyYWN0ZXIgY291bnQgb2YgTWFwCisgICAgcHJvdGVjdGVkIGludCBfdG90YWxDaGFyYWN0ZXJDb3VudDsKKwogICAgIHB1YmxpYyBTdHJpbmdJbnRNYXAoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewogICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IpOwogCkBAIC05Myw3ICs3NCwxMCBAQAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF90YWJsZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgX3RhYmxlW2ldID0gbnVsbDsKICAgICAgICAgfQorICAgICAgICBfbGFzdEVudHJ5ID0gTlVMTF9FTlRSWTsKICAgICAgICAgX3NpemUgPSAwOworICAgICAgICBfaW5kZXggPSBfcmVhZE9ubHlNYXBTaXplOworICAgICAgICBfdG90YWxDaGFyYWN0ZXJDb3VudCA9IDA7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0UmVhZE9ubHlNYXAoS2V5SW50TWFwIHJlYWRPbmx5TWFwLCBib29sZWFuIGNsZWFyKSB7CkBAIC0xMDksMTUgKzkzLDI1IEBACiAgICAgICAgIF9yZWFkT25seU1hcCA9IHJlYWRPbmx5TWFwOwogICAgICAgICBpZiAoX3JlYWRPbmx5TWFwICE9IG51bGwpIHsKICAgICAgICAgICAgIF9yZWFkT25seU1hcFNpemUgPSBfcmVhZE9ubHlNYXAuc2l6ZSgpOworICAgICAgICAgICAgX2luZGV4ID0gX3NpemUgKyBfcmVhZE9ubHlNYXBTaXplOwogCiAgICAgICAgICAgICBpZiAoY2xlYXIpIHsKICAgICAgICAgICAgICAgICBjbGVhcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9ICBlbHNlIHsKICAgICAgICAgICAgIF9yZWFkT25seU1hcFNpemUgPSAwOworICAgICAgICAgICAgX2luZGV4ID0gX3NpemU7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE5leHRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIF9pbmRleCsrOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBfaW5kZXg7CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIGludCBvYnRhaW5JbmRleChTdHJpbmcga2V5KSB7CiAgICAgICAgIGZpbmFsIGludCBoYXNoID0gaGFzaEhhc2goa2V5Lmhhc2hDb2RlKCkpOwogCkBAIC0xMzUsMjAgKzEyOSwyNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgYWRkRW50cnkoa2V5LCBoYXNoLCBfc2l6ZSArIF9yZWFkT25seU1hcFNpemUsIHRhYmxlSW5kZXgpOworICAgICAgICBhZGRFbnRyeShrZXksIGhhc2gsIHRhYmxlSW5kZXgpOwogICAgICAgICByZXR1cm4gTk9UX1BSRVNFTlQ7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKFN0cmluZyBrZXkpIHsKICAgICAgICAgZmluYWwgaW50IGhhc2ggPSBoYXNoSGFzaChrZXkuaGFzaENvZGUoKSk7CiAgICAgICAgIGZpbmFsIGludCB0YWJsZUluZGV4ID0gaW5kZXhGb3IoaGFzaCwgX3RhYmxlLmxlbmd0aCk7Ci0gICAgICAgIGFkZEVudHJ5KGtleSwgaGFzaCwgX3NpemUgKyBfcmVhZE9ubHlNYXBTaXplLCB0YWJsZUluZGV4KTsKKyAgICAgICAgYWRkRW50cnkoa2V5LCBoYXNoLCB0YWJsZUluZGV4KTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgaW50IGdldChTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gX2xhc3RFbnRyeS5fa2V5KQorICAgICAgICAgICAgcmV0dXJuIF9sYXN0RW50cnkuX3ZhbHVlOworCiAgICAgICAgIHJldHVybiBnZXQoa2V5LCBoYXNoSGFzaChrZXkuaGFzaENvZGUoKSkpOwogICAgIH0KIAorICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VG90YWxDaGFyYWN0ZXJDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIF90b3RhbENoYXJhY3RlckNvdW50OworICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgaW50IGdldChTdHJpbmcga2V5LCBpbnQgaGFzaCkgewogICAgICAgICBpZiAoX3JlYWRPbmx5TWFwICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBpID0gX3JlYWRPbmx5TWFwLmdldChrZXksIGhhc2gpOwpAQCAtMTYwLDYgKzE2MSw3IEBACiAgICAgICAgIGZpbmFsIGludCB0YWJsZUluZGV4ID0gaW5kZXhGb3IoaGFzaCwgX3RhYmxlLmxlbmd0aCk7CiAgICAgICAgIGZvciAoRW50cnkgZSA9IF90YWJsZVt0YWJsZUluZGV4XTsgZSAhPSBudWxsOyBlID0gZS5fbmV4dCkgewogICAgICAgICAgICAgaWYgKGUuX2hhc2ggPT0gaGFzaCAmJiBlcShrZXksIGUuX2tleSkpIHsKKyAgICAgICAgICAgICAgICBfbGFzdEVudHJ5ID0gZTsKICAgICAgICAgICAgICAgICByZXR1cm4gZS5fdmFsdWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE2OCw5ICsxNzAsMTAgQEAKICAgICB9CiAKIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGRFbnRyeShTdHJpbmcga2V5LCBpbnQgaGFzaCwgaW50IHZhbHVlLCBpbnQgYnVja2V0SW5kZXgpIHsKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkRW50cnkoU3RyaW5nIGtleSwgaW50IGhhc2gsIGludCBidWNrZXRJbmRleCkgewogICAgICAgICBFbnRyeSBlID0gX3RhYmxlW2J1Y2tldEluZGV4XTsKLSAgICAgICAgX3RhYmxlW2J1Y2tldEluZGV4XSA9IG5ldyBFbnRyeShrZXksIGhhc2gsIHZhbHVlLCBlKTsKKyAgICAgICAgX3RhYmxlW2J1Y2tldEluZGV4XSA9IG5ldyBFbnRyeShrZXksIGhhc2gsIF9pbmRleCsrLCBlKTsKKyAgICAgICAgX3RvdGFsQ2hhcmFjdGVyQ291bnQgKz0ga2V5Lmxlbmd0aCgpOwogICAgICAgICBpZiAoX3NpemUrKyA+PSBfdGhyZXNob2xkKSB7CiAgICAgICAgICAgICByZXNpemUoMiAqIF90YWJsZS5sZW5ndGgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1ZhbHVlQXJyYXkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvVmFsdWVBcnJheS5qYXZhCmluZGV4IDcyOGE5YjguLjExNzA0ZmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvVmFsdWVBcnJheS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvVmFsdWVBcnJheS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWw7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1ZhbHVlQXJyYXlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdXRpbC9WYWx1ZUFycmF5UmVzb3VyY2VFeGNlcHRpb24uamF2YQppbmRleCA0MWM3NTcxLi4wNzZlNjU4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC91dGlsL1ZhbHVlQXJyYXlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3V0aWwvVmFsdWVBcnJheVJlc291cmNlRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnV0aWw7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3ZvY2FiL1BhcnNlclZvY2FidWxhcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3ZvY2FiL1BhcnNlclZvY2FidWxhcnkuamF2YQppbmRleCBhYjZmOTBjLi40ODQ5YzJmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC92b2NhYi9QYXJzZXJWb2NhYnVsYXJ5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdm9jYWIvUGFyc2VyVm9jYWJ1bGFyeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnZvY2FiOwpAQCAtODAsMTggKzUzLDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0lERU5USUZZSU5HX1NUUklOR19UQUJMRV9NQVhJTVVNX0NIQVJBQ1RFUlNfUEVPUEVSVFkgPQogICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudm9jYWIuUGFyc2VyVm9jYWJ1bGFyeS5Ob25JZGVudGlmeWluZ1N0cmluZ1RhYmxlLm1heGltdW1DaGFyYWN0ZXJzIjsKIAotICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IElERU5USUZZSU5HX1NUUklOR19UQUJMRV9NQVhJTVVNX0lURU1TOwotICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IE5PTl9JREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9JVEVNUzsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBOT05fSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fQ0hBUkFDVEVSUzsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIElERU5USUZZSU5HX1NUUklOR19UQUJMRV9NQVhJTVVNX0lURU1TID0KLSAgICAgICAgICAgICAgICBnZXRJbnRlZ2VyVmFsdWVGcm9tUHJvcGVydHkoSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fSVRFTVNfUEVPUEVSVFkpOwotICAgICAgICBOT05fSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fSVRFTVMgPQotICAgICAgICAgICAgICAgIGdldEludGVnZXJWYWx1ZUZyb21Qcm9wZXJ0eShOT05fSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fSVRFTVNfUEVPUEVSVFkpOwotICAgICAgICBOT05fSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fQ0hBUkFDVEVSUyA9Ci0gICAgICAgICAgICAgICAgZ2V0SW50ZWdlclZhbHVlRnJvbVByb3BlcnR5KE5PTl9JREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9DSEFSQUNURVJTX1BFT1BFUlRZKTsKLSAgICB9CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fSVRFTVMgPQorICAgICAgICAgICAgZ2V0SW50ZWdlclZhbHVlRnJvbVByb3BlcnR5KElERU5USUZZSU5HX1NUUklOR19UQUJMRV9NQVhJTVVNX0lURU1TX1BFT1BFUlRZKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT05fSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fSVRFTVMgPQorICAgICAgICAgICAgZ2V0SW50ZWdlclZhbHVlRnJvbVByb3BlcnR5KE5PTl9JREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9JVEVNU19QRU9QRVJUWSk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9OX0lERU5USUZZSU5HX1NUUklOR19UQUJMRV9NQVhJTVVNX0NIQVJBQ1RFUlMgPQorICAgICAgICAgICAgZ2V0SW50ZWdlclZhbHVlRnJvbVByb3BlcnR5KE5PTl9JREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9DSEFSQUNURVJTX1BFT1BFUlRZKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRJbnRlZ2VyVmFsdWVGcm9tUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CkBAIC0xMDcsNyArNzQsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBDaGFyQXJyYXlBcnJheSByZXN0cmljdGVkQWxwaGFiZXQgPSBuZXcgQ2hhckFycmF5QXJyYXkoVmFsdWVBcnJheS5ERUZBVUxUX0NBUEFDSVRZLCAyNTYpOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmdBcnJheSBlbmNvZGluZ0FsZ29yaXRobSA9IG5ldyBTdHJpbmdBcnJheShWYWx1ZUFycmF5LkRFRkFVTFRfQ0FQQUNJVFksIDI1Nik7CisgICAgcHVibGljIGZpbmFsIFN0cmluZ0FycmF5IGVuY29kaW5nQWxnb3JpdGhtID0gbmV3IFN0cmluZ0FycmF5KFZhbHVlQXJyYXkuREVGQVVMVF9DQVBBQ0lUWSwgMjU2LCB0cnVlKTsKIAogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmdBcnJheSBuYW1lc3BhY2VOYW1lOwogICAgIHB1YmxpYyBmaW5hbCBQcmVmaXhBcnJheSBwcmVmaXg7CkBAIC0xMjgsMTIgKzk1LDEyIEBACiAKICAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBQYXJzZXJWb2NhYnVsYXJ5ICovCiAgICAgcHVibGljIFBhcnNlclZvY2FidWxhcnkoKSB7Ci0gICAgICAgIG5hbWVzcGFjZU5hbWUgPSBuZXcgU3RyaW5nQXJyYXkoVmFsdWVBcnJheS5ERUZBVUxUX0NBUEFDSVRZLCBJREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9JVEVNUyk7CisgICAgICAgIG5hbWVzcGFjZU5hbWUgPSBuZXcgU3RyaW5nQXJyYXkoVmFsdWVBcnJheS5ERUZBVUxUX0NBUEFDSVRZLCBJREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9JVEVNUywgZmFsc2UpOwogICAgICAgICBwcmVmaXggPSBuZXcgUHJlZml4QXJyYXkoVmFsdWVBcnJheS5ERUZBVUxUX0NBUEFDSVRZLCBJREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9JVEVNUyk7Ci0gICAgICAgIGxvY2FsTmFtZSA9IG5ldyBTdHJpbmdBcnJheShWYWx1ZUFycmF5LkRFRkFVTFRfQ0FQQUNJVFksIElERU5USUZZSU5HX1NUUklOR19UQUJMRV9NQVhJTVVNX0lURU1TKTsKLSAgICAgICAgb3RoZXJOQ05hbWUgPSBuZXcgU3RyaW5nQXJyYXkoVmFsdWVBcnJheS5ERUZBVUxUX0NBUEFDSVRZLCBJREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9JVEVNUyk7Ci0gICAgICAgIG90aGVyVVJJID0gbmV3IFN0cmluZ0FycmF5KFZhbHVlQXJyYXkuREVGQVVMVF9DQVBBQ0lUWSwgSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fSVRFTVMpOwotICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IG5ldyBTdHJpbmdBcnJheShWYWx1ZUFycmF5LkRFRkFVTFRfQ0FQQUNJVFksIE5PTl9JREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9JVEVNUyk7CisgICAgICAgIGxvY2FsTmFtZSA9IG5ldyBTdHJpbmdBcnJheShWYWx1ZUFycmF5LkRFRkFVTFRfQ0FQQUNJVFksIElERU5USUZZSU5HX1NUUklOR19UQUJMRV9NQVhJTVVNX0lURU1TLCBmYWxzZSk7CisgICAgICAgIG90aGVyTkNOYW1lID0gbmV3IFN0cmluZ0FycmF5KFZhbHVlQXJyYXkuREVGQVVMVF9DQVBBQ0lUWSwgSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fSVRFTVMsIGZhbHNlKTsKKyAgICAgICAgb3RoZXJVUkkgPSBuZXcgU3RyaW5nQXJyYXkoVmFsdWVBcnJheS5ERUZBVUxUX0NBUEFDSVRZLCBJREVOVElGWUlOR19TVFJJTkdfVEFCTEVfTUFYSU1VTV9JVEVNUywgdHJ1ZSk7CisgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gbmV3IFN0cmluZ0FycmF5KFZhbHVlQXJyYXkuREVGQVVMVF9DQVBBQ0lUWSwgTk9OX0lERU5USUZZSU5HX1NUUklOR19UQUJMRV9NQVhJTVVNX0lURU1TLCB0cnVlKTsKICAgICAgICAgb3RoZXJTdHJpbmcgPSBuZXcgQ2hhckFycmF5QXJyYXkoVmFsdWVBcnJheS5ERUZBVUxUX0NBUEFDSVRZLCBOT05fSURFTlRJRllJTkdfU1RSSU5HX1RBQkxFX01BWElNVU1fSVRFTVMpOwogCiAgICAgICAgIGNoYXJhY3RlckNvbnRlbnRDaHVuayA9IG5ldyBDb250aWd1b3VzQ2hhckFycmF5QXJyYXkoVmFsdWVBcnJheS5ERUZBVUxUX0NBUEFDSVRZLApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdm9jYWIvU2VyaWFsaXplclZvY2FidWxhcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3ZvY2FiL1NlcmlhbGl6ZXJWb2NhYnVsYXJ5LmphdmEKaW5kZXggOTQzMzc0Yi4uMzljZmRhYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdm9jYWIvU2VyaWFsaXplclZvY2FidWxhcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC92b2NhYi9TZXJpYWxpemVyVm9jYWJ1bGFyeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC52b2NhYjsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdm9jYWIvVm9jYWJ1bGFyeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQvdm9jYWIvVm9jYWJ1bGFyeS5qYXZhCmluZGV4IDllNDNhM2YuLmI2YjRjN2YgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL2Zhc3RpbmZvc2V0L3ZvY2FiL1ZvY2FidWxhcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC92b2NhYi9Wb2NhYnVsYXJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudm9jYWI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9TT0FQRXhjZXB0aW9uSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovU09BUEV4Y2VwdGlvbkltcGwuamF2YQppbmRleCBiNDAzYmY0Li5lOTg2ZjAzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9TT0FQRXhjZXB0aW9uSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL1NPQVBFeGNlcHRpb25JbXBsLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogU09BUEV4Y2VwdGlvbkltcGwuamF2YSx2IDEuMyAyMDA2LzAxLzI3IDEyOjQ5OjE3IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMyAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToxNyAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQRXhjZXB0aW9uSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDEvMjcgMTI6NDk6MTcgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjE3ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWo7CiAKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovY2xpZW50L3AycC9IdHRwU09BUENvbm5lY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL2NsaWVudC9wMnAvSHR0cFNPQVBDb25uZWN0aW9uLmphdmEKaW5kZXggYTlmMDUzNS4uNjQzZjJkNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovY2xpZW50L3AycC9IdHRwU09BUENvbm5lY3Rpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9jbGllbnQvcDJwL0h0dHBTT0FQQ29ubmVjdGlvbi5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEh0dHBTT0FQQ29ubmVjdGlvbi5qYXZhLHYgMS40MSAyMDA2LzAxLzI3IDEyOjQ5OjE3IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNDEgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MTcgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogSHR0cFNPQVBDb25uZWN0aW9uLmphdmEsdiAxLjQxIDIwMDYvMDEvMjcgMTI6NDk6MTcgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS40MSAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToxNyAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLmNsaWVudC5wMnA7CiAKIGltcG9ydCBqYXZhLmlvLio7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9jbGllbnQvcDJwL0h0dHBTT0FQQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL2NsaWVudC9wMnAvSHR0cFNPQVBDb25uZWN0aW9uRmFjdG9yeS5qYXZhCmluZGV4IDg4YjE4MGEuLjM0MGNlYWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL2NsaWVudC9wMnAvSHR0cFNPQVBDb25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL2NsaWVudC9wMnAvSHR0cFNPQVBDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEh0dHBTT0FQQ29ubmVjdGlvbkZhY3RvcnkuamF2YSx2IDEuNiAyMDA2LzAxLzI3IDEyOjQ5OjE4IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNiAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToxOCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBIdHRwU09BUENvbm5lY3Rpb25GYWN0b3J5LmphdmEsdiAxLjYgMjAwNi8wMS8yNyAxMjo0OToxOCB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjYgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MTggJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5jbGllbnQucDJwOwogCiBpbXBvcnQgamF2YXgueG1sLnNvYXAuKjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL2NsaWVudC9wMnAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9jbGllbnQvcDJwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCmluZGV4IDAwZTI0NjguLjNhNGVhZWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL2NsaWVudC9wMnAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovY2xpZW50L3AycC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogIyBTQUFKIFJlc291cmNlQnVuZGxlIHByb3BlcnRpZXMgZmlsZQogIyBDb250YWlucyBMb2cgbWVzc2FnZXMKICMgRXJyb3IgbWVzc2FnZXMKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL0hlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvSGVhZGVyLmphdmEKaW5kZXggZTAwNjViMi4uNzc4ZjQ0NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvSGVhZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvSGVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpSGVhZGVyLmphdmEgICAgMS4zIDAyLzAzLzI3CisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWU7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL01lc3NhZ2luZ0V4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvTWVzc2FnaW5nRXhjZXB0aW9uLmphdmEKaW5kZXggZDgzY2VhOC4uMGQyZjFhZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvTWVzc2FnaW5nRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvTWVzc2FnaW5nRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpTWVzc2FnaW5nRXhjZXB0aW9uLmphdmEgICAgICAgIDEuMTAgMDIvMDYvMTMKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZTsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvTXVsdGlwYXJ0RGF0YVNvdXJjZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvTXVsdGlwYXJ0RGF0YVNvdXJjZS5qYXZhCmluZGV4IGVkODZlNTkuLmViMTVhZDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL011bHRpcGFydERhdGFTb3VyY2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9NdWx0aXBhcnREYXRhU291cmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpTXVsdGlwYXJ0RGF0YVNvdXJjZS5qYXZhICAgICAgIDEuNiAwMi8wMy8yNworICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lOwogCkBAIC00Miw2ICs0Nyw3IEBACiAgKiBUaGlzIGludGVyZmFjZSB3aWxsIHR5cGljYWxseSBiZSBpbXBsZW1lbnRlZCBieSBwcm92aWRlcnMgdGhhdAogICogcHJlcGFyc2UgbXVsdGlwYXJ0IGJvZGllcywgZm9yIGV4YW1wbGUgYW4gSU1BUCBwcm92aWRlci4KICAqCisgKiBAdmVyc2lvbiAgICAgMS42LCAwMi8wMy8yNwogICogQGF1dGhvciAgICAgIEpvaG4gTWFuaQogICogQHNlZSAgICAgICAgIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZQogICovCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9CTU1pbWVNdWx0aXBhcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L0JNTWltZU11bHRpcGFydC5qYXZhCmluZGV4IGI3NDY2ZGYuLjc3NjliZGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L0JNTWltZU11bHRpcGFydC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L0JNTWltZU11bHRpcGFydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKU1pbWVNdWx0aXBhcnQuamF2YSAgICAgMS4zMSAwMy8wMS8yOQorICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLmludGVybmV0OwogCkBAIC0yMTAsNyArMjE1LDYgQEAKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiSU8gRXJyb3IiLCBpb2V4KTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIkVycm9yIiwgZXgpOwogICAgICAgICB9CiAKQEAgLTQ5NiwxNiArNTAwLDM0IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGlmIHMgPT0gMSA6IGl0IG11c3QgYmUgYW4gTEYKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcyA9PSAyIDogaXQgbXVzdCBiZSBhIENSIExGCiAgICAgICAgICAgICAgICAgICAgIGlmIChzIDw9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmxmID0gbmV3IFN0cmluZyhwcmV2QnVmZmVyLCAwLCBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIlxuIi5lcXVhbHMoY3JsZikgJiYgISJcclxuIi5lcXVhbHMoY3JsZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm91bmRhcnkgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiBwYXJ0IEJvZHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRob3V0IGEgcHJlY2VlZGluZyBDUkxGIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NWZWN0b3JbMF0gPSBlbmRQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2l0IGNvdWxkIGJlICJzb21lLWNoYXJcbiIgc28gd3JpdGUgc29tZS1jaGFyCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZCdWZmZXJbMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkJ1ZmZlclswXSAhPSAnXHInICYmIHByZXZCdWZmZXJbMF0gIT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHByZXZCdWZmZXIsMCwxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2luICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc1ZlY3RvclswXSA9IGVuZFBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm91bmRhcnkgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiBwYXJ0IEJvZHkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgYSBwcmVjZWVkaW5nIENSTEYiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocz09MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2QnVmZmVyWzBdICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm91bmRhcnkgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiBwYXJ0IEJvZHkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgYSBwcmVjZWVkaW5nIENSTEYiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zVmVjdG9yWzBdID0gZW5kUG9zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocyA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJldkJ1ZmZlcltzLTJdID09ICdccicpICYmIChwcmV2QnVmZmVyW3MtMV0gPT0gJ1xuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2luICE9IG51bGwpIHsKQEAgLTUzMCw3ICs1NTIsNyBAQAogICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoZSBib3VuZGFyeSwgc2tpcCAqTFdTUC1jaGFyIGFuZCBDUkxGCiAgICAgICAgICAgICAgICAgaWYgKCFza2lwTFdTUEFuZENSTEYoaXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIC8vICAgIkJvdW5kYXJ5IGRvZXMgbm90IHRlcm1pbmF0ZSB3aXRoIENSTEYiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAiQm91bmRhcnkgZG9lcyBub3QgdGVybWluYXRlIHdpdGggQ1JMRiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L0NvbnRlbnREaXNwb3NpdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvQ29udGVudERpc3Bvc2l0aW9uLmphdmEKaW5kZXggMDc3NDA1MS4uNjI3MjRmNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvQ29udGVudERpc3Bvc2l0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvQ29udGVudERpc3Bvc2l0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpQ29udGVudERpc3Bvc2l0aW9uLmphdmEgICAgICAgIDEuNiAwMi8wMy8yNworICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLmludGVybmV0OwogCkBAIC0zMSw2ICszNiw3IEBACiAgKiBtZXRob2RzIHRvIHBhcnNlIGEgQ29udGVudERpc3Bvc2l0aW9uIHN0cmluZyBpbnRvIGluZGl2aWR1YWwgY29tcG9uZW50cwogICogYW5kIHRvIGdlbmVyYXRlIGEgTUlNRSBzdHlsZSBDb250ZW50RGlzcG9zaXRpb24gc3RyaW5nLgogICoKKyAqIEB2ZXJzaW9uIDEuNiwgMDIvMDMvMjcKICAqIEBhdXRob3IgIEpvaG4gTWFuaQogICovCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L0NvbnRlbnRUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9Db250ZW50VHlwZS5qYXZhCmluZGV4IDA4MmNjNTEuLjhlMThiOWQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L0NvbnRlbnRUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvQ29udGVudFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIylDb250ZW50VHlwZS5qYXZhICAgICAgIDEuNyAwMi8wMy8yNworICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLmludGVybmV0OwogCkBAIC0zMSw2ICszNiw3IEBACiAgKiBtZXRob2RzIHRvIHBhcnNlIGEgQ29udGVudFR5cGUgc3RyaW5nIGludG8gaW5kaXZpZHVhbCBjb21wb25lbnRzCiAgKiBhbmQgdG8gZ2VuZXJhdGUgYSBNSU1FIHN0eWxlIENvbnRlbnRUeXBlIHN0cmluZy4KICAqCisgKiBAdmVyc2lvbiAxLjcsIDAyLzAzLzI3CiAgKiBAYXV0aG9yICBKb2huIE1hbmkKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRUeXBlIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L0hlYWRlclRva2VuaXplci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvSGVhZGVyVG9rZW5pemVyLmphdmEKaW5kZXggNzQ4NmRlNi4uYWNmODI3YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvSGVhZGVyVG9rZW5pemVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvSGVhZGVyVG9rZW5pemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpSGVhZGVyVG9rZW5pemVyLmphdmEgICAxLjkgMDIvMDMvMjcKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldDsKIApAQCAtMzQsNiArMzksNyBAQAogICogQ1JMRiBTUEFDRSBzZXF1ZW5jZXMpLiBUaGUgZm9sZHMgYXJlIHJlbW92ZWQgaW4gdGhlIHJldHVybmVkCiAgKiB0b2tlbnMuCiAgKgorICogQHZlcnNpb24gMS45LCAwMi8wMy8yNwogICogQGF1dGhvciAgSm9obiBNYW5pCiAgKi8KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvSW50ZXJuZXRIZWFkZXJzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9JbnRlcm5ldEhlYWRlcnMuamF2YQppbmRleCAxNWMxMDZjLi41ZThmNzM0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9JbnRlcm5ldEhlYWRlcnMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9JbnRlcm5ldEhlYWRlcnMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIylJbnRlcm5ldEhlYWRlcnMuamF2YSAgIDEuMTYgMDIvMDgvMDgKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvTWltZUJvZHlQYXJ0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9NaW1lQm9keVBhcnQuamF2YQppbmRleCAxMmM5MzY0Li5hM2U4MTBmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9NaW1lQm9keVBhcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9NaW1lQm9keVBhcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIylNaW1lQm9keVBhcnQuamF2YSAgICAgIDEuNTIgMDMvMDIvMTIKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvTWltZU11bHRpcGFydC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvTWltZU11bHRpcGFydC5qYXZhCmluZGV4IDQzOTRhZWQuLjY5M2I0MGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L01pbWVNdWx0aXBhcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9NaW1lTXVsdGlwYXJ0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpTWltZU11bHRpcGFydC5qYXZhICAgICAxLjMxIDAzLzAxLzI5CisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUuaW50ZXJuZXQ7CiAKQEAgLTYxLDYgKzY2LDcgQEAKICAqIGNvbnN0cnVjdG9yLiAgRm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhICJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiIG9iamVjdCwKICAqIHVzZSA8Y29kZT5uZXcgTWltZU11bHRpcGFydCgiYWx0ZXJuYXRpdmUiKTwvY29kZT4uCiAgKgorICogQHZlcnNpb24gMS4zMSwgMDMvMDEvMjkKICAqIEBhdXRob3IgIEpvaG4gTWFuaQogICogQGF1dGhvciAgQmlsbCBTaGFubm9uCiAgKiBAYXV0aG9yICBNYXggU3BpdmFrCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9NaW1lUGFydERhdGFTb3VyY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L01pbWVQYXJ0RGF0YVNvdXJjZS5qYXZhCmluZGV4IGU4ZDMyOTguLjhkNzcwMDQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L01pbWVQYXJ0RGF0YVNvdXJjZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L01pbWVQYXJ0RGF0YVNvdXJjZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKU1pbWVQYXJ0RGF0YVNvdXJjZS5qYXZhICAgICAgICAxLjkgMDIvMDMvMjcKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvTWltZVV0aWxpdHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L01pbWVVdGlsaXR5LmphdmEKaW5kZXggOTVjOGYxOS4uYTUwNDJjMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvTWltZVV0aWxpdHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9NaW1lVXRpbGl0eS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKU1pbWVVdGlsaXR5LmphdmEgICAgICAgMS40NSAwMy8wMy8xMAorICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLmludGVybmV0OwogCkBAIC0xMDgsNiArMTEzLDcgQEAKICAqIG1haWwgbWVzc2FnZXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGNoYXJzZXQgdXNlZCBmb3IgZmlsZXMgc3RvcmVkIG9uCiAgKiB0aGUgc3lzdGVtLCB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSBzZXQuCiAgKgorICogQHZlcnNpb24gMS40NSwgMDMvMDMvMTAKICAqIEBhdXRob3IgIEpvaG4gTWFuaQogICogQGF1dGhvciAgQmlsbCBTaGFubm9uCiAgKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L1BhcmFtZXRlckxpc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L1BhcmFtZXRlckxpc3QuamF2YQppbmRleCA0ZmE5OGViLi4xYmFlYmRiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9QYXJhbWV0ZXJMaXN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvUGFyYW1ldGVyTGlzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKVBhcmFtZXRlckxpc3QuamF2YSAgICAgMS4xMCAwMy8wMi8xMgorICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLmludGVybmV0OwogCkBAIC0zMiw2ICszNyw3IEBACiAvKioKICAqIFRoaXMgY2xhc3MgaG9sZHMgTUlNRSBwYXJhbWV0ZXJzIChhdHRyaWJ1dGUtdmFsdWUgcGFpcnMpLgogICoKKyAqIEB2ZXJzaW9uIDEuMTAsIDAzLzAyLzEyCiAgKiBAYXV0aG9yICBKb2huIE1hbmkKICAqLwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvUGFyc2VFeGNlcHRpb24uamF2YQppbmRleCA3MjRmYTY3Li4xYTdmMWQwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpUGFyc2VFeGNlcHRpb24uamF2YSAgICAxLjMgMDIvMDMvMjcKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvU2hhcmVkSW5wdXRTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L1NoYXJlZElucHV0U3RyZWFtLmphdmEKaW5kZXggNGI5OTNhZC4uYzFhZTRiMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvU2hhcmVkSW5wdXRTdHJlYW0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9TaGFyZWRJbnB1dFN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKVNoYXJlZElucHV0U3RyZWFtLmphdmEgMS4yIDAyLzAzLzI3CisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUuaW50ZXJuZXQ7CiAKQEAgLTM3LDYgKzQyLDcgQEAKICAqIG9yaWdpbmFsIElucHV0U3RyZWFtLiAgVGhlIG5ldyBJbnB1dFN0cmVhbSB3aWxsIGFjY2VzcyB0aGUgc2FtZQogICogdW5kZXJseWluZyBkYXRhIGFzIHRoZSBvcmlnaW5hbCwgd2l0aG91dCBjb3B5aW5nIHRoZSBkYXRhLgogICoKKyAqIEB2ZXJzaW9uIDEuMiwgMDIvMDMvMjcKICAqIEBhdXRob3IgIEJpbGwgU2hhbm5vbgogICogQHNpbmNlIEphdmFNYWlsIDEuMgogICovCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9VbmlxdWVWYWx1ZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvaW50ZXJuZXQvVW5pcXVlVmFsdWUuamF2YQppbmRleCA2MWQ0ODZhLi41Y2NkNzBhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS9pbnRlcm5ldC9VbmlxdWVWYWx1ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL2ludGVybmV0L1VuaXF1ZVZhbHVlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpVW5pcXVlVmFsdWUuamF2YSAgICAgICAxLjYgMDIvMDMvMjcKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9BU0NJSVV0aWxpdHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvQVNDSUlVdGlsaXR5LmphdmEKaW5kZXggOWYzMzY4NS4uNWIyMjQzMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9BU0NJSVV0aWxpdHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL0FTQ0lJVXRpbGl0eS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKUFTQ0lJVXRpbGl0eS5qYXZhICAgICAgMS45IDAyLzAzLzI3CisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLnV0aWw7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai51dGlsLkJ5dGVPdXRwdXRTdHJlYW07CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL0JBU0U2NERlY29kZXJTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvQkFTRTY0RGVjb2RlclN0cmVhbS5qYXZhCmluZGV4IDQ3MGZmZGUuLmM1OGNjN2QgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvQkFTRTY0RGVjb2RlclN0cmVhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvQkFTRTY0RGVjb2RlclN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKUJBU0U2NERlY29kZXJTdHJlYW0uamF2YSAgICAgICAxLjggMDIvMDMvMjcKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS51dGlsOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL0JBU0U2NEVuY29kZXJTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvQkFTRTY0RW5jb2RlclN0cmVhbS5qYXZhCmluZGV4IDA1ZDljYmMuLjA5ZTU5MmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvQkFTRTY0RW5jb2RlclN0cmVhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvQkFTRTY0RW5jb2RlclN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKUJBU0U2NEVuY29kZXJTdHJlYW0uamF2YSAgICAgICAxLjYgMDIvMDMvMjcKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS51dGlsOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL0JFbmNvZGVyU3RyZWFtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL0JFbmNvZGVyU3RyZWFtLmphdmEKaW5kZXggMTE3MGE5My4uNTUwMWE3OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9CRW5jb2RlclN0cmVhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvQkVuY29kZXJTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIylCRW5jb2RlclN0cmVhbS5qYXZhICAgIDEuMyAwMi8wMy8yNworICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLnV0aWw7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvTGluZUlucHV0U3RyZWFtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL0xpbmVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDkzYjg3NzUuLjkyN2U0MmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvTGluZUlucHV0U3RyZWFtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9MaW5lSW5wdXRTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIylMaW5lSW5wdXRTdHJlYW0uamF2YSAgIDEuNyAwMy8wMS8wNworICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLnV0aWw7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvT3V0cHV0VXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9PdXRwdXRVdGlsLmphdmEKaW5kZXggZDBhNmE5MC4uN2RjMjNmZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9PdXRwdXRVdGlsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9PdXRwdXRVdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiBAKCMpT3V0cHV0VXRpbC5qYXZhICAxLjYgMDIvMDMvMjcKKyAqLworCisKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS51dGlsOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL1FEZWNvZGVyU3RyZWFtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL1FEZWNvZGVyU3RyZWFtLmphdmEKaW5kZXggMzU4YjdjZS4uMzc2MmRhZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9RRGVjb2RlclN0cmVhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvUURlY29kZXJTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqIEAoIylRRGVjb2RlclN0cmVhbS5qYXZhICAgIDEuNSAwMi8wMy8yNworICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLnV0aWw7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvUUVuY29kZXJTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvUUVuY29kZXJTdHJlYW0uamF2YQppbmRleCAyYjYzNWQyLi43YWQ5MjcxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL1FFbmNvZGVyU3RyZWFtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9RRW5jb2RlclN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKVFFbmNvZGVyU3RyZWFtLmphdmEgICAgMS40IDAyLzAzLzI3CisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9RUERlY29kZXJTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvUVBEZWNvZGVyU3RyZWFtLmphdmEKaW5kZXggM2RjYzBhMS4uNTM1ZGYwZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9RUERlY29kZXJTdHJlYW0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL1FQRGVjb2RlclN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKVFQRGVjb2RlclN0cmVhbS5qYXZhICAgMS45IDAyLzA0LzAyCisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9RUEVuY29kZXJTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvUVBFbmNvZGVyU3RyZWFtLmphdmEKaW5kZXggYWIzMjNkYi4uNWE1YTQ5MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9RUEVuY29kZXJTdHJlYW0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL1FQRW5jb2RlclN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKVFQRW5jb2RlclN0cmVhbS5qYXZhICAgMS42IDAyLzAzLzI3CisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9VVURlY29kZXJTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvVVVEZWNvZGVyU3RyZWFtLmphdmEKaW5kZXggNjI1NjM0Yy4uYjYyNWQ3YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9VVURlY29kZXJTdHJlYW0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL1VVRGVjb2RlclN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKVVVRGVjb2RlclN0cmVhbS5qYXZhICAgMS44IDAyLzA3LzA4CisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9VVUVuY29kZXJTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3BhY2thZ2luZy9taW1lL3V0aWwvVVVFbmNvZGVyU3RyZWFtLmphdmEKaW5kZXggNjI4NzIyOC4uYmQ1MmI1MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovcGFja2FnaW5nL21pbWUvdXRpbC9VVUVuY29kZXJTdHJlYW0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9wYWNrYWdpbmcvbWltZS91dGlsL1VVRW5jb2RlclN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogQCgjKVVVRW5jb2RlclN0cmVhbS5qYXZhICAgMS4zIDAyLzAzLzI3CisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9BdHRhY2htZW50UGFydEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvQXR0YWNobWVudFBhcnRJbXBsLmphdmEKaW5kZXggNjJlZTRjNC4uOWRlZDk4OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9BdHRhY2htZW50UGFydEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0F0dGFjaG1lbnRQYXJ0SW1wbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEF0dGFjaG1lbnRQYXJ0SW1wbC5qYXZhLHYgMS40NSAyMDA2LzAxLzI3IDEyOjQ5OjI2IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNDUgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MjYgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogQXR0YWNobWVudFBhcnRJbXBsLmphdmEsdiAxLjEuMS4xLjIuMSAyMDA3LzExLzI3IDA3OjE5OjI5IGt1bWFyamF5YW50aSBFeHAgJAorICogJFJldmlzaW9uOiAxLjEuMS4xLjIuMSAkCisgKiAkRGF0ZTogMjAwNy8xMS8yNyAwNzoxOToyOSAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXA7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5TT0FQRXhjZXB0aW9uSW1wbDsKQEAgLTkxLDYgKzkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IgogICAgICAgICAgICAgICAgICAgICAgICAgKyBobmRsclN0cgogICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcC5GYXN0SW5mb3NldERhdGFDb250ZW50SGFuZGxlciIpOworICAgICAgICAgICAgICAgIC8qIEltYWdlIERhdGFDb250ZW50SGFuZGxlciBoYW5kbGVzIGFsbCBpbWFnZSB0eXBlcwogICAgICAgICAgICAgICAgIG1haWxNYXAuYWRkTWFpbGNhcCgKICAgICAgICAgICAgICAgICAgICAgImltYWdlL2pwZWciCiAgICAgICAgICAgICAgICAgICAgICAgICArIGhuZGxyU3RyCkBAIC05OCw3ICsxMDAsNyBAQAogICAgICAgICAgICAgICAgIG1haWxNYXAuYWRkTWFpbGNhcCgKICAgICAgICAgICAgICAgICAgICAgImltYWdlL2dpZiIKICAgICAgICAgICAgICAgICAgICAgICAgICsgaG5kbHJTdHIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuR2lmRGF0YUNvbnRlbnRIYW5kbGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICArICJjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLkdpZkRhdGFDb250ZW50SGFuZGxlciIpOyovCiAgICAgICAgICAgICAgICAgLyptYWlsTWFwLmFkZE1haWxjYXAoCiAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBhcnQvKiIKICAgICAgICAgICAgICAgICAgICAgICAgICsgaG5kbHJTdHIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvRW52ZWxvcGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvRW52ZWxvcGUuamF2YQppbmRleCAyYzMzMDFkLi5mMTM2YTQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0VudmVsb3BlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9FbnZlbG9wZS5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEVudmVsb3BlLmphdmEsdiAxLjggMjAwNi8wMS8yNyAxMjo0OToyNiB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjggJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MjYgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogRW52ZWxvcGUuamF2YSx2IDEuOCAyMDA2LzAxLzI3IDEyOjQ5OjI2IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuOCAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyNiAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXA7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9FbnZlbG9wZUZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvRW52ZWxvcGVGYWN0b3J5LmphdmEKaW5kZXggMWFlMmFhMS4uODFhZGNhMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9FbnZlbG9wZUZhY3RvcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0VudmVsb3BlRmFjdG9yeS5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEVudmVsb3BlRmFjdG9yeS5qYXZhLHYgMS4yNCAyMDA2LzAxLzI3IDEyOjQ5OjI2IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMjQgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MjYgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogRW52ZWxvcGVGYWN0b3J5LmphdmEsdiAxLjI0IDIwMDYvMDEvMjcgMTI6NDk6MjYgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS4yNCAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyNiAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXA7CiAKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0Zhc3RJbmZvc2V0RGF0YUNvbnRlbnRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0Zhc3RJbmZvc2V0RGF0YUNvbnRlbnRIYW5kbGVyLmphdmEKaW5kZXggODA1NmIwZS4uYzRlMmMyMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9GYXN0SW5mb3NldERhdGFDb250ZW50SGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvRmFzdEluZm9zZXREYXRhQ29udGVudEhhbmRsZXIuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBGYXN0SW5mb3NldERhdGFDb250ZW50SGFuZGxlci5qYXZhLHYgMS4xLjEuMSAyMDA2LzAxLzI3IDEzOjEwOjU2IGt1bWFyamF5YW50aSBFeHAgJAotICogJFJldmlzaW9uOiAxLjEuMS4xICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEzOjEwOjU2ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEZhc3RJbmZvc2V0RGF0YUNvbnRlbnRIYW5kbGVyLmphdmEsdiAxLjEuMS4xIDIwMDYvMDEvMjcgMTM6MTA6NTYga3VtYXJqYXlhbnRpIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMS4xLjEgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTM6MTA6NTYgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwOwogCiBpbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLkRhdGFGbGF2b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0dpZkRhdGFDb250ZW50SGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9HaWZEYXRhQ29udGVudEhhbmRsZXIuamF2YQppbmRleCAzMGU1MTU0Li41ODdiMDlhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0dpZkRhdGFDb250ZW50SGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvR2lmRGF0YUNvbnRlbnRIYW5kbGVyLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogR2lmRGF0YUNvbnRlbnRIYW5kbGVyLmphdmEsdiAxLjE1IDIwMDYvMDEvMjcgMTI6NDk6MjYgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4xNSAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyNiAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsMTQgKzIyLDE4IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBHaWZEYXRhQ29udGVudEhhbmRsZXIuamF2YSx2IDEuMi4yLjEgMjAwNy8xMS8yNyAwNzoxOToyOSBrdW1hcmpheWFudGkgRXhwICQKKyAqICRSZXZpc2lvbjogMS4yLjIuMSAkCisgKiAkRGF0ZTogMjAwNy8xMS8yNyAwNzoxOToyOSAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXA7CiAKIGltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuRGF0YUZsYXZvcjsKIGltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwogaW1wb3J0IGphdmEuYXd0Lio7Ci0KIGltcG9ydCBqYXZheC5hY3RpdmF0aW9uLio7CiAKIC8qKgpAQCAtMTA4LDcgKzEwNiw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3Qgb2JqLCBTdHJpbmcgdHlwZSwgT3V0cHV0U3RyZWFtIG9zKQogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgSW1hZ2UpKQorICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgIShvYmogaW5zdGFuY2VvZiBJbWFnZSkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlwiIiArIGdldERGKCkuZ2V0TWltZVR5cGUoKSArCiAgICAgICAgICAgICAgICAgIlwiIERhdGFDb250ZW50SGFuZGxlciByZXF1aXJlcyBJbWFnZSBvYmplY3QsICIgKwogICAgICAgICAgICAgICAgICJ3YXMgZ2l2ZW4gb2JqZWN0IG9mIHR5cGUgIiArIG9iai5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9JbWFnZURhdGFDb250ZW50SGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9JbWFnZURhdGFDb250ZW50SGFuZGxlci5qYXZhCmluZGV4IDIzZTk1N2UuLmE4ZWVkMmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvSW1hZ2VEYXRhQ29udGVudEhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0ltYWdlRGF0YUNvbnRlbnRIYW5kbGVyLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogSW1hZ2VEYXRhQ29udGVudEhhbmRsZXIuamF2YSx2IDEuNSAyMDA2LzAxLzI3IDEyOjQ5OjI2IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNSAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyNiAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBJbWFnZURhdGFDb250ZW50SGFuZGxlci5qYXZhLHYgMS4xLjEuMS4yLjEgMjAwNy8xMS8yNyAwNzoxOToyOCBrdW1hcmpheWFudGkgRXhwICQKKyAqICRSZXZpc2lvbjogMS4xLjEuMS4yLjEgJAorICogJERhdGU6IDIwMDcvMTEvMjcgMDc6MTk6MjggJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwOwogCiBpbXBvcnQgamF2YS5hd3QuKjsKQEAgLTE0NCw2ICsxNDUsNyBAQAogICAgICAgICAgICAgICAgIHN0cmVhbSA9IEltYWdlSU8uY3JlYXRlSW1hZ2VPdXRwdXRTdHJlYW0ob3MpOwogICAgICAgICAgICAgICAgIHdyaXRlci5zZXRPdXRwdXQoc3RyZWFtKTsKICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmSW1hZ2UpOworICAgICAgICAgICAgICAgIHdyaXRlci5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuU0VWRVJFLCAiU0FBSjA1MjYuc29hcC51bnN1cHBvcnRlZC5taW1lLnR5cGUiLApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9KcGVnRGF0YUNvbnRlbnRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0pwZWdEYXRhQ29udGVudEhhbmRsZXIuamF2YQppbmRleCBlMWNhZTZjLi40MTM5MWI2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0pwZWdEYXRhQ29udGVudEhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0pwZWdEYXRhQ29udGVudEhhbmRsZXIuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBKcGVnRGF0YUNvbnRlbnRIYW5kbGVyLmphdmEsdiAxLjE1IDIwMDYvMDEvMjcgMTI6NDk6MjYgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4xNSAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyNiAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEpwZWdEYXRhQ29udGVudEhhbmRsZXIuamF2YSx2IDEuMS4xLjEuMi4xIDIwMDcvMTEvMjcgMDc6MTk6Mjkga3VtYXJqYXlhbnRpIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMS4xLjEuMi4xICQKKyAqICREYXRlOiAyMDA3LzExLzI3IDA3OjE5OjI5ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcDsKIAogaW1wb3J0IGphdmEuYXd0Lio7CkBAIC0zNyw2ICszOCw3IEBACiAKIGltcG9ydCBqYXZheC5hY3RpdmF0aW9uLio7CiAKKy8vaW1wb3J0IGNvbS5zdW4uaW1hZ2UuY29kZWMuanBlZy4qOwogaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKIAogLyoqCkBAIC0xNTUsNyArMTU3LDkgQEAKICAgICAgICAgICAgICAgICBHcmFwaGljcyBnID0gYnVmSW1hZ2UuY3JlYXRlR3JhcGhpY3MoKTsKICAgICAgICAgICAgICAgICBnLmRyYXdJbWFnZShpbWcsIDAsIDAsIG51bGwpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBJbWFnZUlPLndyaXRlKGJ1ZkltYWdlLCAianBlZyIsIG9zKTsKKwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJ1biB0aGUgSlBFRyBFbmNvZGVyIG9uIGEgc3RyZWFtICIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCmluZGV4IGJiYjBkMGYuLmE2MGM2MTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogIyBTQUFKIFJlc291cmNlQnVuZGxlIHByb3BlcnRpZXMgZmlsZQogIyBDb250YWlucyBMb2cgbWVzc2FnZXMgZm9yIHNvYXAgcGtnCiAjIEVycm9yIG1lc3NhZ2VzCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL01lc3NhZ2VGYWN0b3J5SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9NZXNzYWdlRmFjdG9yeUltcGwuamF2YQppbmRleCA4YTg5MjBkLi45N2NmZjVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL01lc3NhZ2VGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvTWVzc2FnZUZhY3RvcnlJbXBsLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogTWVzc2FnZUZhY3RvcnlJbXBsLmphdmEsdiAxLjIzIDIwMDYvMDEvMjcgMTI6NDk6MjcgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4yMyAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyNyAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBNZXNzYWdlRmFjdG9yeUltcGwuamF2YSx2IDEuMjMgMjAwNi8wMS8yNyAxMjo0OToyNyB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjIzICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjI3ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcDsKIAogaW1wb3J0IGphdmEuaW8uKjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvTWVzc2FnZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvTWVzc2FnZUltcGwuamF2YQppbmRleCA2ZjQ5YTFjLi4wMmJlMjdhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL01lc3NhZ2VJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9NZXNzYWdlSW1wbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IE1lc3NhZ2VJbXBsLmphdmEsdiAxLjMgMjAwNi8wOC8wNCAwOToyNDoyNCBhc2h1dG9zaHNoYWhpIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMyAkCi0gKiAkRGF0ZTogMjAwNi8wOC8wNCAwOToyNDoyNCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBNZXNzYWdlSW1wbC5qYXZhLHYgMS41IDIwMDYvMTIvMTIgMTA6MTY6MzMga3VtYXJqYXlhbnRpIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNSAkCisgKiAkRGF0ZTogMjAwNi8xMi8xMiAxMDoxNjozMyAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXA7CiAKIGltcG9ydCBqYXZhLmlvLio7CkBAIC0xMjUzLDExICsxMjU0LDE5IEBACiAgICAgfQogCiAgICAgcHVibGljIFNPQVBCb2R5IGdldFNPQVBCb2R5KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKTsKKyAgICAgICAgU09BUEJvZHkgYm9keSA9IGdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCk7CisgICAgICAgIC8qaWYgKGJvZHkgPT0gbnVsbCkgeworICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJObyBTT0FQIEJvZHkgd2FzIGZvdW5kIGluIHRoZSBTT0FQIE1lc3NhZ2UiKTsKKyAgICAgICAgfSovCisgICAgICAgIHJldHVybiBib2R5OwogICAgIH0KIAogICAgIHB1YmxpYyBTT0FQSGVhZGVyIGdldFNPQVBIZWFkZXIoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCk7CisgICAgICAgIFNPQVBIZWFkZXIgaGRyID0gZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpLmdldEhlYWRlcigpOworICAgICAgICAvKmlmIChoZHIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIk5vIFNPQVAgSGVhZGVyIHdhcyBmb3VuZCBpbiB0aGUgU09BUCBNZXNzYWdlIik7CisgICAgICAgIH0qLworICAgICAgICByZXR1cm4gaGRyOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplQWxsQXR0YWNobWVudHMgKCkKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvTXVsdGlwYXJ0RGF0YUNvbnRlbnRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL011bHRpcGFydERhdGFDb250ZW50SGFuZGxlci5qYXZhCmluZGV4IDZiNWRlZmUuLjRlMGQ5MDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvTXVsdGlwYXJ0RGF0YUNvbnRlbnRIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9NdWx0aXBhcnREYXRhQ29udGVudEhhbmRsZXIuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBNdWx0aXBhcnREYXRhQ29udGVudEhhbmRsZXIuamF2YSx2IDEuMyAyMDA2LzAxLzI3IDEyOjQ5OjI4IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMyAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyOCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBNdWx0aXBhcnREYXRhQ29udGVudEhhbmRsZXIuamF2YSx2IDEuMyAyMDA2LzAxLzI3IDEyOjQ5OjI4IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMyAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyOCAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXA7CiAKIGltcG9ydCBqYXZhLmlvLio7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1NBQUpNZXRhRmFjdG9yeUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU0FBSk1ldGFGYWN0b3J5SW1wbC5qYXZhCmluZGV4IGVhOTlkNDAuLmYwNmI1OTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU0FBSk1ldGFGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU0FBSk1ldGFGYWN0b3J5SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwOwogCiBpbXBvcnQgamF2YXgueG1sLnNvYXAuU0FBSk1ldGFGYWN0b3J5OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQRG9jdW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUERvY3VtZW50LmphdmEKaW5kZXggOTJjZTJjMS4uNTYwZjg0MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQRG9jdW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1NPQVBEb2N1bWVudC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogU09BUERvY3VtZW50LmphdmEsdiAxLjUgMjAwNi8wMS8yNyAxMjo0OToyOCB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUERvY3VtZW50LmphdmEsdiAxLjUgMjAwNi8wMS8yNyAxMjo0OToyOCB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUERvY3VtZW50RnJhZ21lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUERvY3VtZW50RnJhZ21lbnQuamF2YQppbmRleCA3MWMwYjI4Li40MWU4OTgxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1NPQVBEb2N1bWVudEZyYWdtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQRG9jdW1lbnRGcmFnbWVudC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogU09BUERvY3VtZW50RnJhZ21lbnQuamF2YSx2IDEuNiAyMDA2LzAxLzI3IDEyOjQ5OjI4IHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQRG9jdW1lbnRGcmFnbWVudC5qYXZhLHYgMS42IDIwMDYvMDEvMjcgMTI6NDk6MjggdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1NPQVBEb2N1bWVudEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUERvY3VtZW50SW1wbC5qYXZhCmluZGV4IDViOGQ3OTcuLmEyZTdhZTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUERvY3VtZW50SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUERvY3VtZW50SW1wbC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogU09BUERvY3VtZW50SW1wbC5qYXZhLHYgMS4xNSAyMDA2LzAxLzI3IDEyOjQ5OjI5IHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQRG9jdW1lbnRJbXBsLmphdmEsdiAxLjE1IDIwMDYvMDEvMjcgMTI6NDk6MjkgdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1NPQVBGYWN0b3J5SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQRmFjdG9yeUltcGwuamF2YQppbmRleCA4OTdhNjA3Li4yYzFmNzEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1NPQVBGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUEZhY3RvcnlJbXBsLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogU09BUEZhY3RvcnlJbXBsLmphdmEsdiAxLjIxIDIwMDYvMDEvMjcgMTI6NDk6MjkgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4yMSAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyOSAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQRmFjdG9yeUltcGwuamF2YSx2IDEuMjEgMjAwNi8wMS8yNyAxMjo0OToyOSB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjIxICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjI5ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcDsKIAogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUElPRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1NPQVBJT0V4Y2VwdGlvbi5qYXZhCmluZGV4IGQ5ZTZlYTkuLjRlY2VkNDcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUElPRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQSU9FeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMyw2ICsyMyw3IEBACiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KIAorCiAvKioKICAqIENyZWF0ZWQgb24gTm92IDE5LCAyMDAyCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQUGFydEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUFBhcnRJbXBsLmphdmEKaW5kZXggNjBkNGMxYy4uMTEyNWJkYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQUGFydEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1NPQVBQYXJ0SW1wbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFNPQVBQYXJ0SW1wbC5qYXZhLHYgMS4xLjEuMSAyMDA2LzAxLzI3IDEzOjEwOjU1IGt1bWFyamF5YW50aSBFeHAgJAotICogJFJldmlzaW9uOiAxLjEuMS4xICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEzOjEwOjU1ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFNPQVBQYXJ0SW1wbC5qYXZhLHYgMS4xLjEuMSAyMDA2LzAxLzI3IDEzOjEwOjU1IGt1bWFyamF5YW50aSBFeHAgJAorICogJFJldmlzaW9uOiAxLjEuMS4xICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEzOjEwOjU1ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcDsKIAogaW1wb3J0IGphdmEuaW8uKjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU09BUFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEKaW5kZXggZGI1MzQ5Mi4uZTVjNjA3OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TT0FQVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogU09BUFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhLHYgMS42IDIwMDYvMDEvMjcgMTI6NDk6MjkgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS42ICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjI5ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFNPQVBWZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uamF2YSx2IDEuNiAyMDA2LzAxLzI3IDEyOjQ5OjI5IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNiAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OToyOSAkCisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TdHJpbmdEYXRhQ29udGVudEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvU3RyaW5nRGF0YUNvbnRlbnRIYW5kbGVyLmphdmEKaW5kZXggY2FkNzI1Yy4uZDgxMDkxOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9TdHJpbmdEYXRhQ29udGVudEhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1N0cmluZ0RhdGFDb250ZW50SGFuZGxlci5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFN0cmluZ0RhdGFDb250ZW50SGFuZGxlci5qYXZhLHYgMS42IDIwMDYvMDEvMjcgMTI6NDk6MjkgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS42ICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjI5ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFN0cmluZ0RhdGFDb250ZW50SGFuZGxlci5qYXZhLHYgMS42IDIwMDYvMDEvMjcgMTI6NDk6MjkgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS42ICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjI5ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcDsKIAogaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5EYXRhRmxhdm9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9YbWxEYXRhQ29udGVudEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvWG1sRGF0YUNvbnRlbnRIYW5kbGVyLmphdmEKaW5kZXggZTE4OGNmNC4uNDZmODljNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9YbWxEYXRhQ29udGVudEhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL1htbERhdGFDb250ZW50SGFuZGxlci5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFhtbERhdGFDb250ZW50SGFuZGxlci5qYXZhLHYgMS4xMiAyMDA2LzAxLzI3IDEyOjQ5OjMwIHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMTIgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogWG1sRGF0YUNvbnRlbnRIYW5kbGVyLmphdmEsdiAxLjEyIDIwMDYvMDEvMjcgMTI6NDk6MzAgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS4xMiAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozMCAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXA7CiAKIGltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuRGF0YUZsYXZvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvZHluYW1pYy9TT0FQRmFjdG9yeUR5bmFtaWNJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2R5bmFtaWMvU09BUEZhY3RvcnlEeW5hbWljSW1wbC5qYXZhCmluZGV4IDQzMzFlOTguLjJkYjg4OWQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvZHluYW1pYy9TT0FQRmFjdG9yeUR5bmFtaWNJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9keW5hbWljL1NPQVBGYWN0b3J5RHluYW1pY0ltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFNPQVBGYWN0b3J5RHluYW1pY0ltcGwuamF2YSx2IDEuMiAyMDA2LzAxLzI3IDEyOjQ5OjMyIHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQRmFjdG9yeUR5bmFtaWNJbXBsLmphdmEsdiAxLjIgMjAwNi8wMS8yNyAxMjo0OTozMiB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvZHluYW1pYy9TT0FQTWVzc2FnZUZhY3RvcnlEeW5hbWljSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9keW5hbWljL1NPQVBNZXNzYWdlRmFjdG9yeUR5bmFtaWNJbXBsLmphdmEKaW5kZXggNTFhZmE3Yi4uNmJiYTljOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9keW5hbWljL1NPQVBNZXNzYWdlRmFjdG9yeUR5bmFtaWNJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9keW5hbWljL1NPQVBNZXNzYWdlRmFjdG9yeUR5bmFtaWNJbXBsLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBTT0FQTWVzc2FnZUZhY3RvcnlEeW5hbWljSW1wbC5qYXZhLHYgMS40IDIwMDYvMDEvMjcgMTI6NDk6MzIgdmoxMzUwNjIgRXhwICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFNPQVBNZXNzYWdlRmFjdG9yeUR5bmFtaWNJbXBsLmphdmEsdiAxLjQgMjAwNi8wMS8yNyAxMjo0OTozMiB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Cb2R5RWxlbWVudEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Cb2R5RWxlbWVudEltcGwuamF2YQppbmRleCBhMTRlNTg2Li44M2Y0YWMyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvQm9keUVsZW1lbnRJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0JvZHlFbGVtZW50SW1wbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEJvZHlFbGVtZW50SW1wbC5qYXZhLHYgMS4xNCAyMDA2LzAxLzI3IDEyOjQ5OjMzIHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMTQgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzMgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogQm9keUVsZW1lbnRJbXBsLmphdmEsdiAxLjE0IDIwMDYvMDEvMjcgMTI6NDk6MzMgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS4xNCAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozMyAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuaW1wbDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvQm9keUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Cb2R5SW1wbC5qYXZhCmluZGV4IGViZjUxYzUuLjJlYzA4NTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Cb2R5SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Cb2R5SW1wbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEJvZHlJbXBsLmphdmEsdiAxLjQxIDIwMDYvMDEvMjcgMTI6NDk6MzQgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS40MSAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBCb2R5SW1wbC5qYXZhLHYgMS40MSAyMDA2LzAxLzI3IDEyOjQ5OjM0IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNDEgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzQgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvQ0RBVEFJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvQ0RBVEFJbXBsLmphdmEKaW5kZXggOTk0MzFkMi4uNjQxMTA2MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0NEQVRBSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9DREFUQUltcGwuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBDREFUQUltcGwuamF2YSx2IDEuMTkgMjAwNi8wMS8yNyAxMjo0OTozNCB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjE5ICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjM0ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IENEQVRBSW1wbC5qYXZhLHYgMS4xOSAyMDA2LzAxLzI3IDEyOjQ5OjM0IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTkgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzQgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvQ29tbWVudEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Db21tZW50SW1wbC5qYXZhCmluZGV4IGZlNzc1YjEuLjY5MzFkNTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Db21tZW50SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Db21tZW50SW1wbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IENvbW1lbnRJbXBsLmphdmEsdiAxLjE3IDIwMDYvMDEvMjcgMTI6NDk6MzQgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4xNyAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBDb21tZW50SW1wbC5qYXZhLHYgMS4xNyAyMDA2LzAxLzI3IDEyOjQ5OjM0IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTcgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzQgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRGV0YWlsRW50cnlJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRGV0YWlsRW50cnlJbXBsLmphdmEKaW5kZXggMjRhOGQzMi4uZDgyODZmMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0RldGFpbEVudHJ5SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9EZXRhaWxFbnRyeUltcGwuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBEZXRhaWxFbnRyeUltcGwuamF2YSx2IDEuOCAyMDA2LzAxLzI3IDEyOjQ5OjM0IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuOCAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBEZXRhaWxFbnRyeUltcGwuamF2YSx2IDEuOCAyMDA2LzAxLzI3IDEyOjQ5OjM0IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuOCAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNCAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuaW1wbDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRGV0YWlsSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0RldGFpbEltcGwuamF2YQppbmRleCA4YzY3Y2EwLi5jYWVjYzcyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRGV0YWlsSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9EZXRhaWxJbXBsLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogRGV0YWlsSW1wbC5qYXZhLHYgMS4xNiAyMDA2LzAxLzI3IDEyOjQ5OjM0IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMTYgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzQgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogRGV0YWlsSW1wbC5qYXZhLHYgMS4xNiAyMDA2LzAxLzI3IDEyOjQ5OjM0IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTYgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzQgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRWxlbWVudEZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9FbGVtZW50RmFjdG9yeS5qYXZhCmluZGV4IGVmYWU0ODguLmU1ZTEyNGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9FbGVtZW50RmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9FbGVtZW50RmFjdG9yeS5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEVsZW1lbnRGYWN0b3J5LmphdmEsdiAxLjE2IDIwMDYvMDEvMjcgMTI6NDk6MzUgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4xNiAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNSAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBFbGVtZW50RmFjdG9yeS5qYXZhLHYgMS4xNiAyMDA2LzAxLzI3IDEyOjQ5OjM1IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTYgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzUgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLmltcGw7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0VsZW1lbnRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRWxlbWVudEltcGwuamF2YQppbmRleCBmOWNmYTJhLi4yYWZjZjkwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRWxlbWVudEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRWxlbWVudEltcGwuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBFbGVtZW50SW1wbC5qYXZhLHYgMS4xLjEuMSAyMDA2LzAxLzI3IDEzOjEwOjU3IGt1bWFyamF5YW50aSBFeHAgJAotICogJFJldmlzaW9uOiAxLjEuMS4xICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEzOjEwOjU3ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEVsZW1lbnRJbXBsLmphdmEsdiAxLjYgMjAwNi8xMS8xNiAxNjowMToxNCBrdW1hcmpheWFudGkgRXhwICQKKyAqICRSZXZpc2lvbjogMS42ICQKKyAqICREYXRlOiAyMDA2LzExLzE2IDE2OjAxOjE0ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcC5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLio7CkBAIC0xODQsMTYgKzE4NSwyNCBAQAogICAgICAgICB9IGVsc2UgaWYgKHByZWZpeCAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBGaW5kIGlmIHRoZXJlJ3MgYW4gYW5jZXN0ZXIgd2hvc2UgbmFtZSBjb250YWlucyB0aGlzIHByZWZpeAogICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBjdXJyZW50QW5jZXN0b3IgPSB0aGlzOworCisvLyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBjdXJyZW50QW5jZXN0b3IubG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7CisvLyAgICAgICAgICAgIHJldHVybiB1cmk7CiAgICAgICAgICAgICB3aGlsZSAoY3VycmVudEFuY2VzdG9yICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICAgICAhKGN1cnJlbnRBbmNlc3RvciBpbnN0YW5jZW9mIERvY3VtZW50KSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoY3VycmVudEFuY2VzdG9yLmdldFByZWZpeCgpKSkgeworCisgICAgICAgICAgICAgICAvKiBpZiAocHJlZml4LmVxdWFscyhjdXJyZW50QW5jZXN0b3IuZ2V0UHJlZml4KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBjdXJyZW50QW5jZXN0b3IuZ2V0TmFtZXNwYWNlVVJJKCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYmVjYXVzZSB0aGUgamF2YWRvYyBzYXlzIGdldE5hbWVzcGFjZVVSSSgpIGlzIG5vdCBhIGNvbXB1dGVkIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBVUkkgZm9yIGEgbm9uLWVtcHR5IHByZWZpeCBjYW5ub3QgYmUgbnVsbAogICAgICAgICAgICAgICAgICAgICBpZiAodXJpICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJpOwogICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgIC8vU3RyaW5nIHVyaSA9IGN1cnJlbnRBbmNlc3Rvci5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKKyAgICAgICAgICAgICAgICAvL2lmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vICAgIHJldHVybiB1cmk7CisgICAgICAgICAgICAgICAgLy99CisKICAgICAgICAgICAgICAgICBpZiAoKChFbGVtZW50KSBjdXJyZW50QW5jZXN0b3IpLmhhc0F0dHJpYnV0ZU5TKAogICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5YTUxOU19VUkksIHByZWZpeCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoRWxlbWVudCkgY3VycmVudEFuY2VzdG9yKS5nZXRBdHRyaWJ1dGVOUygKQEAgLTUwMCw3ICs1MDksOCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0QXR0cmlidXRlTlMoTmFtZXNwYWNlQ29udGV4dC5YTUxOU19VUkksICJ4bWxucyIsIHVyaSk7CiAgICAgICAgIH0KLSAgICAgICAgdHJ5VG9GaW5kRW5jb2RpbmdTdHlsZUF0dHJpYnV0ZU5hbWUoKTsKKyAgICAgICAgLy9GaXggZm9yIENSOjY0NzQ2NDEKKyAgICAgICAgLy90cnlUb0ZpbmRFbmNvZGluZ1N0eWxlQXR0cmlidXRlTmFtZSgpOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKQEAgLTkzMiw4ICs5NDIsOSBAQAogICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgICAgICAgfQotICAgICAgICBlbmNvZGluZ1N0eWxlQXR0cmlidXRlLmNsZWFyTmFtZSgpOwotICAgICAgICB0cnlUb0ZpbmRFbmNvZGluZ1N0eWxlQXR0cmlidXRlTmFtZSgpOworICAgICAgICBlbmNvZGluZ1N0eWxlQXR0cmlidXRlLmNsZWFyTmFtZUFuZFZhbHVlKCk7CisgICAgICAgIC8vIEZpeCBmb3IgQ1I6IDY0NzQ2NDEKKyAgICAgICAgLy90cnlUb0ZpbmRFbmNvZGluZ1N0eWxlQXR0cmlidXRlTmFtZSgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRyeVRvRmluZEVuY29kaW5nU3R5bGVBdHRyaWJ1dGVOYW1lKCkgewpAQCAtOTczLDYgKzk4NCwxMyBAQAogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewogICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOwogICAgICAgICB9CisKKyAgICAgICAgLyoqIE5vdGU6IHRvIGJlIHVzZWQgb25seSBpbiBkZXRhY2hOb2RlIG1ldGhvZCAqLworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhck5hbWVBbmRWYWx1ZSgpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBudWxsOworICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBudWxsOworICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZSgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CkBAIC0xMjExLDcgKzEyMjksMTggQEAKICAgICAgICAgICAgIHByZWZpeCA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKICAgICAgICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7CiAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkkscXVhbGlmaWVkTmFtZSx2YWx1ZSk7CisKKyAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgYnVnIDY0Njc4MDggLSBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIGluIEpBWFAKKworICAgICAgICAvLyBSb2xsaW5nIGJhY2sgdGhpcyBmaXgsIHRoaXMgaXMgYSB3cm9uZyBmaXgsIGluZmFjdCBpdHMgY2F1c2luZyBvdGhlciByZWdyZXNzaW9ucyBpbiBKQVhXUyB0Y2sgYW5kCisgICAgICAgIC8vIG90aGVyIHRlc3RzLCBiZWNhdXNlIG9mIHRoaXMgY2hhbmdlIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIG9uIHNvYXBlbnY6RmF1bHQgZWxlbWVudCBhcmUgbmV2ZXIKKyAgICAgICAgLy8gcGlja2VkIHVwLiBUaGUgZml4IGZvciBidWcgNjQ2NzgwOCBzaG91bGQgYmUgaW4gSkFYUC4KKy8vICAgICAgICBpZihlbGVtZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCJGYXVsdCIpICYmCisvLyAgICAgICAgICAgICAgICAoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUuZXF1YWxzKHZhbHVlKSB8fAorLy8gICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzJfRU5WRUxPUEUuZXF1YWxzKHZhbHVlKSkpCisvLyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkkscXVhbGlmaWVkTmFtZSx2YWx1ZSk7CiAgICAgICAgIC8vU3RyaW5nIHRtcExvY2FsTmFtZSA9IHRoaXMuZ2V0TG9jYWxOYW1lKCk7CiAgICAgICAgIFN0cmluZyB0bXBVUkkgPSB0aGlzLmdldE5hbWVzcGFjZVVSSSgpOwogICAgICAgICBib29sZWFuIGlzSUROUyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0VudmVsb3BlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0VudmVsb3BlSW1wbC5qYXZhCmluZGV4IDc2YWY3NDYuLjFjNGNmMmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9FbnZlbG9wZUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRW52ZWxvcGVJbXBsLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogRW52ZWxvcGVJbXBsLmphdmEsdiAxLjEuMS4xIDIwMDYvMDEvMjcgMTM6MTA6NTYga3VtYXJqYXlhbnRpIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMS4xLjEgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTM6MTA6NTYgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogRW52ZWxvcGVJbXBsLmphdmEsdiAxLjEuMS4xIDIwMDYvMDEvMjcgMTM6MTA6NTYga3VtYXJqYXlhbnRpIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMS4xLjEgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTM6MTA6NTYgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLmltcGw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0ZhdWx0RWxlbWVudEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9GYXVsdEVsZW1lbnRJbXBsLmphdmEKaW5kZXggODIwNmM1YS4uNDdhYzFkMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0ZhdWx0RWxlbWVudEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRmF1bHRFbGVtZW50SW1wbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEZhdWx0RWxlbWVudEltcGwuamF2YSx2IDEuMTAgMjAwNi8wMS8yNyAxMjo0OTozNSB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjEwICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjM1ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEZhdWx0RWxlbWVudEltcGwuamF2YSx2IDEuMTAgMjAwNi8wMS8yNyAxMjo0OTozNSB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjEwICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjM1ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcC5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRmF1bHRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvRmF1bHRJbXBsLmphdmEKaW5kZXggMjFjODdmYy4uZjljNDQ3NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0ZhdWx0SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9GYXVsdEltcGwuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBGYXVsdEltcGwuamF2YSx2IDEuNTUgMjAwNi8wMS8yNyAxMjo0OTozNSB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjU1ICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjM1ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEZhdWx0SW1wbC5qYXZhLHYgMS4yIDIwMDYvMTEvMTYgMTc6Mzk6MTAga3VtYXJqYXlhbnRpIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMjAwNi8xMS8xNiAxNzozOToxMCAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CkBAIC02NSw2ICs2Niw4IEBACiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IE5hbWVJbXBsIGdldEZhdWx0QWN0b3JOYW1lKCk7CiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IERldGFpbEltcGwgY3JlYXRlRGV0YWlsKCk7CiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEZhdWx0RWxlbWVudEltcGwgY3JlYXRlU09BUEZhdWx0RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmF1bHRFbGVtZW50SW1wbCBjcmVhdGVTT0FQRmF1bHRFbGVtZW50KFFOYW1lIHFuYW1lKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmF1bHRFbGVtZW50SW1wbCBjcmVhdGVTT0FQRmF1bHRFbGVtZW50KE5hbWUgcW5hbWUpOwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNoZWNrSWZTdGFuZGFyZEZhdWx0Q29kZShTdHJpbmcgZmF1bHRDb2RlLCBTdHJpbmcgdXJpKSB0aHJvd3MgU09BUEV4Y2VwdGlvbjsKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaW5hbGx5U2V0RmF1bHRDb2RlKFN0cmluZyBmYXVsdGNvZGUpIHRocm93cyBTT0FQRXhjZXB0aW9uOwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzU3RhbmRhcmRGYXVsdEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSk7CkBAIC0xNTIsOCArMTU1LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIFN0cmluZyBwcmVmaXggPSBjb2RlLnN1YnN0cmluZygwLCBwcmVmaXhJbmRleCk7Ci0gICAgICAgIFN0cmluZyBuc05hbWUgPQotICAgICAgICAgICAgKChFbGVtZW50SW1wbCkgY29kZUNvbnRhaW5pbmdFbGVtZW50KS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKKyAgICAgICAgU3RyaW5nIG5zTmFtZSA9KChFbGVtZW50SW1wbCkgY29kZUNvbnRhaW5pbmdFbGVtZW50KS5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKKyAgICAgICAgICAgIC8vKChFbGVtZW50SW1wbCkgY29kZUNvbnRhaW5pbmdFbGVtZW50KS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuc05hbWUsIGdldExvY2FsUGFydChjb2RlKSwgcHJlZml4KTsKICAgICB9CiAKQEAgLTIzMyw3ICsyMzYsNyBAQAogICAgICAgICAgICAgICAgIGlmIChpc1N0YW5kYXJkRmF1bHRFbGVtZW50KGxvY2FsTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlRWxlbWVudFdpdGhTT0FQRWxlbWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNPQVBGYXVsdEVsZW1lbnQobG9jYWxOYW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU09BUEZhdWx0RWxlbWVudChzb2FwRWxlbWVudC5nZXRFbGVtZW50UU5hbWUoKSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBzb2FwRWxlbWVudDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTI0NSw3ICsyNDgsNyBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50TmFtZS5nZXRMb2NhbE5hbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoaXNTdGFuZGFyZEZhdWx0RWxlbWVudChsb2NhbE5hbWUpKQogICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50SW1wbCkgY3JlYXRlU09BUEZhdWx0RWxlbWVudChsb2NhbE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnRJbXBsKSBjcmVhdGVTT0FQRmF1bHRFbGVtZW50KGVsZW1lbnROYW1lKTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0hlYWRlckVsZW1lbnRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvSGVhZGVyRWxlbWVudEltcGwuamF2YQppbmRleCAwZDZlYzgyLi5lYWI3NjZkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvSGVhZGVyRWxlbWVudEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvSGVhZGVyRWxlbWVudEltcGwuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBIZWFkZXJFbGVtZW50SW1wbC5qYXZhLHYgMS4yNiAyMDA2LzAxLzI3IDEyOjQ5OjM1IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMjYgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzUgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogSGVhZGVyRWxlbWVudEltcGwuamF2YSx2IDEuMjYgMjAwNi8wMS8yNyAxMjo0OTozNSB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjI2ICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjM1ICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcC5pbXBsOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9IZWFkZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvSGVhZGVySW1wbC5qYXZhCmluZGV4IDJlYTZkMDcuLmZhODdjZWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9IZWFkZXJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0hlYWRlckltcGwuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBIZWFkZXJJbXBsLmphdmEsdiAxLjMzIDIwMDYvMDEvMjcgMTI6NDk6MzUgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4zMyAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNSAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBIZWFkZXJJbXBsLmphdmEsdiAxLjMzIDIwMDYvMDEvMjcgMTI6NDk6MzUgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS4zMyAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNSAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC4qOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCmluZGV4IDEwYmVjMDEuLjJkZWYxZjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTEsMyArMSwyOCBAQAorIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKICMgU0FBSiBSZXNvdXJjZUJ1bmRsZSBwcm9wZXJ0aWVzIGZpbGUKICMgQ29udGFpbnMgTG9nIG1lc3NhZ2VzIGZvciBpbXBsCiAjIEVycm9yIG1lc3NhZ2VzCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvVGV4dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9UZXh0SW1wbC5qYXZhCmluZGV4IGExYjU0MmEuLjliNmRjNjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9UZXh0SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9UZXh0SW1wbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFRleHRJbXBsLmphdmEsdiAxLjE5IDIwMDYvMDEvMjcgMTI6NDk6MzYgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4xOSAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNiAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBUZXh0SW1wbC5qYXZhLHYgMS4xOSAyMDA2LzAxLzI3IDEyOjQ5OjM2IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTkgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6MzYgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvVHJlZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9pbXBsL1RyZWVFeGNlcHRpb24uamF2YQppbmRleCBhMjFmZWU4Li41MTQ1Mzc1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL2ltcGwvVHJlZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvaW1wbC9UcmVlRXhjZXB0aW9uLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogVHJlZUV4Y2VwdGlvbi5qYXZhLHYgMS41IDIwMDYvMDEvMjcgMTI6NDk6MzYgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS41ICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjM2ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFRyZWVFeGNlcHRpb24uamF2YSx2IDEuNSAyMDA2LzAxLzI3IDEyOjQ5OjM2IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNSAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozNiAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuaW1wbDsKIAogcHVibGljIGNsYXNzIFRyZWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvbmFtZS9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvbmFtZS9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwppbmRleCA2MTY4NzBkLi4xMmI5NTNhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL25hbWUvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9uYW1lL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiAjIFNBQUogUmVzb3VyY2VCdW5kbGUgcHJvcGVydGllcyBmaWxlCiAjIENvbnRhaW5zIExvZyBtZXNzYWdlcyBmb3IgbmFtZSBwa2cKICMgRXJyb3IgbWVzc2FnZXMKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvbmFtZS9OYW1lSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9uYW1lL05hbWVJbXBsLmphdmEKaW5kZXggZjU4MGVmMy4uMmI2ODJjYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9uYW1lL05hbWVJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC9uYW1lL05hbWVJbXBsLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogTmFtZUltcGwuamF2YSx2IDEuNDggMjAwNi8wMS8yNyAxMjo0OTozOCB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjQ4ICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjM4ICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IE5hbWVJbXBsLmphdmEsdiAxLjQ4IDIwMDYvMDEvMjcgMTI6NDk6MzggdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS40OCAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTozOCAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAubmFtZTsKIAogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvQm9keTFfMUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0JvZHkxXzFJbXBsLmphdmEKaW5kZXggNjAwYjRhMS4uMTBhYjE2NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvQm9keTFfMUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9Cb2R5MV8xSW1wbC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogQm9keTFfMUltcGwuamF2YSx2IDEuMTQgMjAwNi8wMS8yNyAxMjo0OTozOCB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogQm9keTFfMUltcGwuamF2YSx2IDEuMTQgMjAwNi8wMS8yNyAxMjo0OTozOCB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0JvZHlFbGVtZW50MV8xSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvQm9keUVsZW1lbnQxXzFJbXBsLmphdmEKaW5kZXggNWNiODQ1Zi4uMTQ2MDdmYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvQm9keUVsZW1lbnQxXzFJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvQm9keUVsZW1lbnQxXzFJbXBsLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBCb2R5RWxlbWVudDFfMUltcGwuamF2YSx2IDEuMTMgMjAwNi8wMS8yNyAxMjo0OTozOSB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogQm9keUVsZW1lbnQxXzFJbXBsLmphdmEsdiAxLjEzIDIwMDYvMDEvMjcgMTI6NDk6MzkgdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9EZXRhaWwxXzFJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9EZXRhaWwxXzFJbXBsLmphdmEKaW5kZXggMjliN2VlNC4uOGQzMDBiYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvRGV0YWlsMV8xSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0RldGFpbDFfMUltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IERldGFpbDFfMUltcGwuamF2YSx2IDEuMTIgMjAwNi8wMS8yNyAxMjo0OTo0MCB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogRGV0YWlsMV8xSW1wbC5qYXZhLHYgMS4xMiAyMDA2LzAxLzI3IDEyOjQ5OjQwIHZqMTM1MDYyIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvRGV0YWlsRW50cnkxXzFJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9EZXRhaWxFbnRyeTFfMUltcGwuamF2YQppbmRleCBhYjhiZTM0Li45YjYxYWUxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9EZXRhaWxFbnRyeTFfMUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9EZXRhaWxFbnRyeTFfMUltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IERldGFpbEVudHJ5MV8xSW1wbC5qYXZhLHYgMS4xMyAyMDA2LzAxLzI3IDEyOjQ5OjQwIHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBEZXRhaWxFbnRyeTFfMUltcGwuamF2YSx2IDEuMTMgMjAwNi8wMS8yNyAxMjo0OTo0MCB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0VudmVsb3BlMV8xSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvRW52ZWxvcGUxXzFJbXBsLmphdmEKaW5kZXggNWVjMjdhNC4uMjM2OWEyMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvRW52ZWxvcGUxXzFJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvRW52ZWxvcGUxXzFJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjYsOCBAQAogICogJElkOiBFbnZlbG9wZTFfMUltcGwuamF2YSx2IDEuOCAyMDA2LzAxLzI3IDEyOjQ5OjQxIHZqMTM1MDYyIEV4cCAkCiAgKi8KIAorCisKIC8qKgogKgogKiBAYXV0aG9yIFNBQUogUkkgRGV2ZWxvcG1lbnQgVGVhbQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvRmF1bHQxXzFJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9GYXVsdDFfMUltcGwuamF2YQppbmRleCAyMDE1NTE1Li4wZWI1ZmUzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9GYXVsdDFfMUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9GYXVsdDFfMUltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEZhdWx0MV8xSW1wbC5qYXZhLHYgMS4yMCAyMDA2LzAxLzI3IDEyOjQ5OjQxIHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBGYXVsdDFfMUltcGwuamF2YSx2IDEuMS4xLjEgMjAwNi8wMS8yNyAxMzoxMDo1NyBrdW1hcmpheWFudGkgRXhwICQKKyAqLworCisKIAogLyoqCiAqCkBAIC0zMDEsNCArMzAyLDE3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN1cGVyLmFkZENoaWxkRWxlbWVudChlbGVtZW50KTsKICAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmF1bHRFbGVtZW50SW1wbCBjcmVhdGVTT0FQRmF1bHRFbGVtZW50KFFOYW1lIHFuYW1lKSB7CisgICAgICAgICByZXR1cm4gbmV3IEZhdWx0RWxlbWVudDFfMUltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICgoU09BUERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpLmdldERvY3VtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmF1bHRFbGVtZW50SW1wbCBjcmVhdGVTT0FQRmF1bHRFbGVtZW50KE5hbWUgcW5hbWUpIHsKKyAgICAgICAgIHJldHVybiBuZXcgRmF1bHRFbGVtZW50MV8xSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgKChTT0FQRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKSkuZ2V0RG9jdW1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKE5hbWVJbXBsKXFuYW1lKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0ZhdWx0RWxlbWVudDFfMUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0ZhdWx0RWxlbWVudDFfMUltcGwuamF2YQppbmRleCA1MzQ4N2QxLi40NTIyNWJmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9GYXVsdEVsZW1lbnQxXzFJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvRmF1bHRFbGVtZW50MV8xSW1wbC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogRmF1bHRFbGVtZW50MV8xSW1wbC5qYXZhLHYgMS4xMiAyMDA2LzAxLzI3IDEyOjQ5OjQxIHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBGYXVsdEVsZW1lbnQxXzFJbXBsLmphdmEsdiAxLjEyIDIwMDYvMDEvMjcgMTI6NDk6NDEgdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9IZWFkZXIxXzFJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9IZWFkZXIxXzFJbXBsLmphdmEKaW5kZXggNzNhMjJiMi4uOTllZWRmYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvSGVhZGVyMV8xSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0hlYWRlcjFfMUltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEhlYWRlcjFfMUltcGwuamF2YSx2IDEuMjkgMjAwNi8wMS8yNyAxMjo0OTo0MSB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogSGVhZGVyMV8xSW1wbC5qYXZhLHYgMS4yOSAyMDA2LzAxLzI3IDEyOjQ5OjQxIHZqMTM1MDYyIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvSGVhZGVyRWxlbWVudDFfMUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0hlYWRlckVsZW1lbnQxXzFJbXBsLmphdmEKaW5kZXggOWMyNDM1My4uZmJjNTRiZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvSGVhZGVyRWxlbWVudDFfMUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9IZWFkZXJFbGVtZW50MV8xSW1wbC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogSGVhZGVyRWxlbWVudDFfMUltcGwuamF2YSx2IDEuMjkgMjAwNi8wMS8yNyAxMjo0OTo0MSB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogSGVhZGVyRWxlbWVudDFfMUltcGwuamF2YSx2IDEuMjkgMjAwNi8wMS8yNyAxMjo0OTo0MSB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKaW5kZXggNWE5ZjdmNi4uNjk1YTIzMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTEsMyArMSwyOCBAQAorIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKICMgU0FBSiBSZXNvdXJjZUJ1bmRsZSBwcm9wZXJ0aWVzIGZpbGUKICMgQ29udGFpbnMgTG9nIG1lc3NhZ2VzIGZvciB2ZXIxXzEgcGtnCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL01lc3NhZ2UxXzFJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9NZXNzYWdlMV8xSW1wbC5qYXZhCmluZGV4IDJhZjViZjAuLmMxZDYwYzAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL01lc3NhZ2UxXzFJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvTWVzc2FnZTFfMUltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IE1lc3NhZ2UxXzFJbXBsLmphdmEsdiAxLjI0IDIwMDYvMDEvMjcgMTI6NDk6NDEgdmoxMzUwNjIgRXhwICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IE1lc3NhZ2UxXzFJbXBsLmphdmEsdiAxLjI0IDIwMDYvMDEvMjcgMTI6NDk6NDEgdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9TT0FQRmFjdG9yeTFfMUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL1NPQVBGYWN0b3J5MV8xSW1wbC5qYXZhCmluZGV4IDhmMDlhNjUuLjY0MWMxMjMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL1NPQVBGYWN0b3J5MV8xSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL1NPQVBGYWN0b3J5MV8xSW1wbC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogU09BUEZhY3RvcnkxXzFJbXBsLmphdmEsdiAxLjQgMjAwNi8wMS8yNyAxMjo0OTo0MiB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUEZhY3RvcnkxXzFJbXBsLmphdmEsdiAxLjEuMS4xIDIwMDYvMDEvMjcgMTM6MTA6NTcga3VtYXJqYXlhbnRpIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpAQCAtNTMsOSArNTQsMTcgQEAKIAogICAgIHB1YmxpYyBTT0FQRmF1bHQgY3JlYXRlRmF1bHQoU3RyaW5nIHJlYXNvblRleHQsIFFOYW1lIGZhdWx0Q29kZSkKICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZhdWx0Q29kZSBhcmd1bWVudCBmb3IgY3JlYXRlRmF1bHQgd2FzIHBhc3NlZCBOVUxMIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYXNvblRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVhc29uVGV4dCBhcmd1bWVudCBmb3IgY3JlYXRlRmF1bHQgd2FzIHBhc3NlZCBOVUxMIik7CisgICAgICAgIH0KICAgICAgICAgRmF1bHQxXzFJbXBsIGZhdWx0ID0gbmV3IEZhdWx0MV8xSW1wbChjcmVhdGVEb2N1bWVudCgpLCBudWxsKTsKICAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcocmVhc29uVGV4dCk7CisKICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7CisKICAgICAgICAgcmV0dXJuIGZhdWx0OwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvU09BUE1lc3NhZ2VGYWN0b3J5MV8xSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzEvU09BUE1lc3NhZ2VGYWN0b3J5MV8xSW1wbC5qYXZhCmluZGV4IDg0NWQyYmYuLjM2NTMyNmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL1NPQVBNZXNzYWdlRmFjdG9yeTFfMUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9TT0FQTWVzc2FnZUZhY3RvcnkxXzFJbXBsLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBTT0FQTWVzc2FnZUZhY3RvcnkxXzFJbXBsLmphdmEsdiAxLjcgMjAwNi8wMS8yNyAxMjo0OTo0MiB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUE1lc3NhZ2VGYWN0b3J5MV8xSW1wbC5qYXZhLHYgMS43IDIwMDYvMDEvMjcgMTI6NDk6NDIgdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMS9TT0FQUGFydDFfMUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL1NPQVBQYXJ0MV8xSW1wbC5qYXZhCmluZGV4IDY5ZDUzNGEuLjgwNWIyMGMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL1NPQVBQYXJ0MV8xSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8xL1NPQVBQYXJ0MV8xSW1wbC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogU09BUFBhcnQxXzFJbXBsLmphdmEsdiAxLjEuMS4xIDIwMDYvMDEvMjcgMTM6MTA6NTcga3VtYXJqYXlhbnRpIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQUGFydDFfMUltcGwuamF2YSx2IDEuMS4xLjEgMjAwNi8wMS8yNyAxMzoxMDo1NyBrdW1hcmpheWFudGkgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9Cb2R5MV8ySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvQm9keTFfMkltcGwuamF2YQppbmRleCAzNTdiZDBhLi5iNWRkODIxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9Cb2R5MV8ySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0JvZHkxXzJJbXBsLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBCb2R5MV8ySW1wbC5qYXZhLHYgMS4zMiAyMDA2LzAxLzI3IDEyOjQ5OjQ0IHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBCb2R5MV8ySW1wbC5qYXZhLHYgMS4zMiAyMDA2LzAxLzI3IDEyOjQ5OjQ0IHZqMTM1MDYyIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvQm9keUVsZW1lbnQxXzJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9Cb2R5RWxlbWVudDFfMkltcGwuamF2YQppbmRleCAzYTEzNDBkLi5kZGM3NTNkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9Cb2R5RWxlbWVudDFfMkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9Cb2R5RWxlbWVudDFfMkltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEJvZHlFbGVtZW50MV8ySW1wbC5qYXZhLHYgMS4xMyAyMDA2LzAxLzI3IDEyOjQ5OjQ0IHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBCb2R5RWxlbWVudDFfMkltcGwuamF2YSx2IDEuMTMgMjAwNi8wMS8yNyAxMjo0OTo0NCB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0RldGFpbDFfMkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0RldGFpbDFfMkltcGwuamF2YQppbmRleCA0NWM2NzBiLi5iZjdjYmNiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9EZXRhaWwxXzJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvRGV0YWlsMV8ySW1wbC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogRGV0YWlsMV8ySW1wbC5qYXZhLHYgMS4yNCAyMDA2LzAxLzI3IDEyOjQ5OjQ1IHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBEZXRhaWwxXzJJbXBsLmphdmEsdiAxLjI0IDIwMDYvMDEvMjcgMTI6NDk6NDUgdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9EZXRhaWxFbnRyeTFfMkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0RldGFpbEVudHJ5MV8ySW1wbC5qYXZhCmluZGV4IDY0YWYxYTMuLjA2YTRmZWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0RldGFpbEVudHJ5MV8ySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0RldGFpbEVudHJ5MV8ySW1wbC5qYXZhCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqICRJZDogRGV0YWlsRW50cnkxXzJJbXBsLmphdmEsdiAxLjEzIDIwMDYvMDEvMjcgMTI6NDk6NDUgdmoxMzUwNjIgRXhwICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IERldGFpbEVudHJ5MV8ySW1wbC5qYXZhLHYgMS4xMyAyMDA2LzAxLzI3IDEyOjQ5OjQ1IHZqMTM1MDYyIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvRW52ZWxvcGUxXzJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9FbnZlbG9wZTFfMkltcGwuamF2YQppbmRleCA5YzBiNTY4Li40NjhlZTYyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9FbnZlbG9wZTFfMkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9FbnZlbG9wZTFfMkltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEVudmVsb3BlMV8ySW1wbC5qYXZhLHYgMS4yNiAyMDA2LzAxLzI3IDEyOjQ5OjQ3IHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBFbnZlbG9wZTFfMkltcGwuamF2YSx2IDEuMjYgMjAwNi8wMS8yNyAxMjo0OTo0NyB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0ZhdWx0MV8ySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvRmF1bHQxXzJJbXBsLmphdmEKaW5kZXggNzNkMzIzNi4uNDMxYzk0YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvRmF1bHQxXzJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvRmF1bHQxXzJJbXBsLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBGYXVsdDFfMkltcGwuamF2YSx2IDEuNDUgMjAwNi8wMS8yNyAxMjo0OTo0NyB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogRmF1bHQxXzJJbXBsLmphdmEsdiAxLjEuMS4xIDIwMDYvMDEvMjcgMTM6MTA6NTcga3VtYXJqYXlhbnRpIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpAQCAtMzAwLDcgKzMwMSw3IEBACiAgICAgICAgIGlmIChmYXVsdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgZmF1bHROb2RlLmRldGFjaE5vZGUoKTsKICAgICAgICAgfQotICAgICAgICBmYXVsdE5vZGUgPSBjcmVhdGVTT0FQRmF1bHRFbGVtZW50KGdldEZhdWx0Tm9kZU5hbWUoKS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgIGZhdWx0Tm9kZSA9IGNyZWF0ZVNPQVBGYXVsdEVsZW1lbnQoZ2V0RmF1bHROb2RlTmFtZSgpKTsKICAgICAgICAgZmF1bHROb2RlID0gZmF1bHROb2RlLmFkZFRleHROb2RlKHVyaSk7CiAgICAgICAgIGlmIChnZXRGYXVsdFJvbGUoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpbnNlcnRCZWZvcmUoZmF1bHROb2RlLCB0aGlzLmZhdWx0QWN0b3JFbGVtZW50KTsKQEAgLTMyMyw3ICszMjQsNyBAQAogICAgICAgICBpZiAodGhpcy5mYXVsdEFjdG9yRWxlbWVudCAhPSBudWxsKQogICAgICAgICAgICAgdGhpcy5mYXVsdEFjdG9yRWxlbWVudC5kZXRhY2hOb2RlKCk7CiAgICAgICAgIHRoaXMuZmF1bHRBY3RvckVsZW1lbnQgPQotICAgICAgICAgICAgY3JlYXRlU09BUEZhdWx0RWxlbWVudChnZXRGYXVsdEFjdG9yTmFtZSgpLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgIGNyZWF0ZVNPQVBGYXVsdEVsZW1lbnQoZ2V0RmF1bHRBY3Rvck5hbWUoKSk7CiAgICAgICAgIHRoaXMuZmF1bHRBY3RvckVsZW1lbnQuYWRkVGV4dE5vZGUodXJpKTsKICAgICAgICAgaWYgKGhhc0RldGFpbCgpKSB7CiAgICAgICAgICAgICBpbnNlcnRCZWZvcmUodGhpcy5mYXVsdEFjdG9yRWxlbWVudCwgdGhpcy5kZXRhaWwpOwpAQCAtNTQ3LDQgKzU0OCwxNiBAQAogICAgICAgICByZXR1cm4gU09BUENvbnN0YW50cy5TT0FQX1NFTkRFUl9GQVVMVDsKICAgICB9CiAKKyAgICAgcHJvdGVjdGVkIEZhdWx0RWxlbWVudEltcGwgY3JlYXRlU09BUEZhdWx0RWxlbWVudChRTmFtZSBxbmFtZSkgeworICAgICAgICAgcmV0dXJuIG5ldyBGYXVsdEVsZW1lbnQxXzJJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAoKFNPQVBEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpKS5nZXREb2N1bWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZhdWx0RWxlbWVudEltcGwgY3JlYXRlU09BUEZhdWx0RWxlbWVudChOYW1lIHFuYW1lKSB7CisgICAgICAgICByZXR1cm4gbmV3IEZhdWx0RWxlbWVudDFfMkltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICgoU09BUERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpLmdldERvY3VtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgIChOYW1lSW1wbClxbmFtZSk7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9GYXVsdEVsZW1lbnQxXzJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9GYXVsdEVsZW1lbnQxXzJJbXBsLmphdmEKaW5kZXggZDgyMDU4YS4uM2JjZDcxYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvRmF1bHRFbGVtZW50MV8ySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0ZhdWx0RWxlbWVudDFfMkltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEZhdWx0RWxlbWVudDFfMkltcGwuamF2YSx2IDEuMTMgMjAwNi8wMS8yNyAxMjo0OTo0OCB2ajEzNTA2MiBFeHAgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw2ICsyMiwxMSBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogRmF1bHRFbGVtZW50MV8ySW1wbC5qYXZhLHYgMS4xMyAyMDA2LzAxLzI3IDEyOjQ5OjQ4IHZqMTM1MDYyIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvSGVhZGVyMV8ySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvSGVhZGVyMV8ySW1wbC5qYXZhCmluZGV4IDdmOTkwNjMuLjIwZDY0YTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0hlYWRlcjFfMkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9IZWFkZXIxXzJJbXBsLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBIZWFkZXIxXzJJbXBsLmphdmEsdiAxLjM2IDIwMDYvMDEvMjcgMTI6NDk6NDggdmoxMzUwNjIgRXhwICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEhlYWRlcjFfMkltcGwuamF2YSx2IDEuMzYgMjAwNi8wMS8yNyAxMjo0OTo0OCB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0hlYWRlckVsZW1lbnQxXzJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9IZWFkZXJFbGVtZW50MV8ySW1wbC5qYXZhCmluZGV4IDQxZjk3YjYuLmFmZGY1YzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0hlYWRlckVsZW1lbnQxXzJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvSGVhZGVyRWxlbWVudDFfMkltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEhlYWRlckVsZW1lbnQxXzJJbXBsLmphdmEsdiAxLjI5IDIwMDYvMDEvMjcgMTI6NDk6NDggdmoxMzUwNjIgRXhwICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEhlYWRlckVsZW1lbnQxXzJJbXBsLmphdmEsdiAxLjI5IDIwMDYvMDEvMjcgMTI6NDk6NDggdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCmluZGV4IDc5ZDFmM2IuLmQyZjc3NjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiAjIFNBQUogUmVzb3VyY2VCdW5kbGUgcHJvcGVydGllcyBmaWxlCiAjIENvbnRhaW5zIExvZyBtZXNzYWdlcyBmb3IgdmVyMV8yIHBrZwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9NZXNzYWdlMV8ySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvTWVzc2FnZTFfMkltcGwuamF2YQppbmRleCBmYmUzNTI3Li41YmFlOWExIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9NZXNzYWdlMV8ySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL01lc3NhZ2UxXzJJbXBsLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBNZXNzYWdlMV8ySW1wbC5qYXZhLHYgMS4xOCAyMDA2LzAxLzI3IDEyOjQ5OjQ4IHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBNZXNzYWdlMV8ySW1wbC5qYXZhLHYgMS4xOCAyMDA2LzAxLzI3IDEyOjQ5OjQ4IHZqMTM1MDYyIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvU09BUEZhY3RvcnkxXzJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9TT0FQRmFjdG9yeTFfMkltcGwuamF2YQppbmRleCAwZmE4YTUzLi5lMWZmYTYzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9TT0FQRmFjdG9yeTFfMkltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9TT0FQRmFjdG9yeTFfMkltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFNPQVBGYWN0b3J5MV8ySW1wbC5qYXZhLHYgMS40IDIwMDYvMDEvMjcgMTI6NDk6NDggdmoxMzUwNjIgRXhwICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFNPQVBGYWN0b3J5MV8ySW1wbC5qYXZhLHYgMS4xLjEuMSAyMDA2LzAxLzI3IDEzOjEwOjU3IGt1bWFyamF5YW50aSBFeHAgJAorICovCisKKwogCiAvKioKICoKQEAgLTUzLDYgKzU0LDEyIEBACiAKICAgICBwdWJsaWMgU09BUEZhdWx0IGNyZWF0ZUZhdWx0KFN0cmluZyByZWFzb25UZXh0LCBRTmFtZSBmYXVsdENvZGUpCiAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKKyAgICAgICAgIGlmIChmYXVsdENvZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmF1bHRDb2RlIGFyZ3VtZW50IGZvciBjcmVhdGVGYXVsdCB3YXMgcGFzc2VkIE5VTEwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVhc29uVGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZWFzb25UZXh0IGFyZ3VtZW50IGZvciBjcmVhdGVGYXVsdCB3YXMgcGFzc2VkIE5VTEwiKTsKKyAgICAgICAgfQogICAgICAgICBGYXVsdDFfMkltcGwgZmF1bHQgPSBuZXcgRmF1bHQxXzJJbXBsKGNyZWF0ZURvY3VtZW50KCksIG51bGwpOwogICAgICAgICBmYXVsdC5zZXRGYXVsdFN0cmluZyhyZWFzb25UZXh0KTsKICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9TT0FQTWVzc2FnZUZhY3RvcnkxXzJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai9zb2FwL3ZlcjFfMi9TT0FQTWVzc2FnZUZhY3RvcnkxXzJJbXBsLmphdmEKaW5kZXggMGJkMjBlMS4uNDMzY2I2OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvU09BUE1lc3NhZ2VGYWN0b3J5MV8ySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL1NPQVBNZXNzYWdlRmFjdG9yeTFfMkltcGwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFNPQVBNZXNzYWdlRmFjdG9yeTFfMkltcGwuamF2YSx2IDEuNyAyMDA2LzAxLzI3IDEyOjQ5OjQ4IHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQTWVzc2FnZUZhY3RvcnkxXzJJbXBsLmphdmEsdiAxLjcgMjAwNi8wMS8yNyAxMjo0OTo0OCB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3NvYXAvdmVyMV8yL1NPQVBQYXJ0MV8ySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvU09BUFBhcnQxXzJJbXBsLmphdmEKaW5kZXggOTFjZWIzOS4uMjVhZmQ5MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvU09BUFBhcnQxXzJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovc29hcC92ZXIxXzIvU09BUFBhcnQxXzJJbXBsLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBTT0FQUGFydDFfMkltcGwuamF2YSx2IDEuMS4xLjEgMjAwNi8wMS8yNyAxMzoxMDo1NyBrdW1hcmpheWFudGkgRXhwICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFNPQVBQYXJ0MV8ySW1wbC5qYXZhLHYgMS4xLjEuMSAyMDA2LzAxLzI3IDEzOjEwOjU3IGt1bWFyamF5YW50aSBFeHAgJAorICovCisKKwogCiAvKioKICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQmFzZTY0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0Jhc2U2NC5qYXZhCmluZGV4IGU4ZDNiMGMuLjQ0MzE5ZDMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQmFzZTY0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9CYXNlNjQuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBCYXNlNjQuamF2YSx2IDEuNCAyMDA2LzAxLzI3IDEyOjQ5OjUwIHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNCAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBCYXNlNjQuamF2YSx2IDEuNCAyMDA2LzAxLzI3IDEyOjQ5OjUwIHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MCAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnV0aWw7CiAKIApAQCAtNDIsNiArNDMsNyBAQAogICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IFhNTCBTY2hlbWEgYmluYXJ5IGZvcm1hdCB2YWxpZGF0aW9uCiAgKgogICogQGF1dGhvciBKZWZmcmV5IFJvZHJpZ3VlegorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MCAkCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBCYXNlNjQgewogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0J5dGVJbnB1dFN0cmVhbS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9CeXRlSW5wdXRTdHJlYW0uamF2YQppbmRleCA4YjA2ZDQ1Li4yNTQwNTA3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0J5dGVJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQnl0ZUlucHV0U3RyZWFtLmphdmEKQEAgLTEsMTAgKzEsNSBAQAogLyoKLSAqICRJZDogQnl0ZUlucHV0U3RyZWFtLmphdmEsdiAxLjYgMjAwNi8wMS8yNyAxMjo0OTo1MSB2ajEzNTA2MiBFeHAgJCAkUmV2aXNpb246Ci0gKiAxLjMgJCAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MSAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDYgKzIyLDEyIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBCeXRlSW5wdXRTdHJlYW0uamF2YSx2IDEuNiAyMDA2LzAxLzI3IDEyOjQ5OjUxIHZqMTM1MDYyIEV4cCAkICRSZXZpc2lvbjoKKyAqIDEuMyAkICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjUxICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0J5dGVPdXRwdXRTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQnl0ZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDU2OWEwNWIuLjk2Yjk1YTggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQnl0ZU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQnl0ZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0xLDEwICsxLDUgQEAKIC8qCi0gKiAkSWQ6IEJ5dGVPdXRwdXRTdHJlYW0uamF2YSx2IDEuNyAyMDA2LzAxLzI3IDEyOjQ5OjUxIHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjUxICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsNiArMjIsMTIgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEJ5dGVPdXRwdXRTdHJlYW0uamF2YSx2IDEuNyAyMDA2LzAxLzI3IDEyOjQ5OjUxIHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjUxICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0NoYXJSZWFkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQ2hhclJlYWRlci5qYXZhCmluZGV4IGMxYWYzMWYuLmUyYmUxNzEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQ2hhclJlYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQ2hhclJlYWRlci5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IENoYXJSZWFkZXIuamF2YSx2IDEuNiAyMDA2LzAxLzI3IDEyOjQ5OjUxIHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNiAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MSAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBDaGFyUmVhZGVyLmphdmEsdiAxLjYgMjAwNi8wMS8yNyAxMjo0OTo1MSB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjYgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6NTEgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai51dGlsOwogCiBpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0NoYXJXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQ2hhcldyaXRlci5qYXZhCmluZGV4IDliM2JlODEuLjY3NTUyMzIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQ2hhcldyaXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvQ2hhcldyaXRlci5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IENoYXJXcml0ZXIuamF2YSx2IDEuNiAyMDA2LzAxLzI3IDEyOjQ5OjUxIHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNiAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MSAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBDaGFyV3JpdGVyLmphdmEsdiAxLjYgMjAwNi8wMS8yNyAxMjo0OTo1MSB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjYgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6NTEgJAorICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai51dGlsOwogCiBpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0Zhc3RJbmZvc2V0UmVmbGVjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9GYXN0SW5mb3NldFJlZmxlY3Rpb24uamF2YQppbmRleCA1MjZjMGNlLi41MmQyOTQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0Zhc3RJbmZvc2V0UmVmbGVjdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvRmFzdEluZm9zZXRSZWZsZWN0aW9uLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogRmFzdEluZm9zZXRSZWZsZWN0aW9uLmphdmEsdiAxLjIgMjAwNi8wNi8wNiAxODo0NjowMSBzYW5kb3ogRXhwICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAyMDA2LzA2LzA2IDE4OjQ2OjAxICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5qYXZhLHYgMS4yIDIwMDYvMDYvMDYgMTg6NDY6MDEgc2FuZG96IEV4cCAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMjAwNi8wNi8wNiAxODo0NjowMSAkCisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9GaW5hbEFycmF5TGlzdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9GaW5hbEFycmF5TGlzdC5qYXZhCmluZGV4IDIyNzY4ZTYuLjY2OTkxYTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvRmluYWxBcnJheUxpc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0ZpbmFsQXJyYXlMaXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9KQVhNU3RyZWFtU291cmNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0pBWE1TdHJlYW1Tb3VyY2UuamF2YQppbmRleCA4MWRjNDg1Li5lYTg5N2JjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0pBWE1TdHJlYW1Tb3VyY2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0pBWE1TdHJlYW1Tb3VyY2UuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBKQVhNU3RyZWFtU291cmNlLmphdmEsdiAxLjkgMjAwNi8wMS8yNyAxMjo0OTo1MSB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjkgJAotICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6NTEgJAotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogSkFYTVN0cmVhbVNvdXJjZS5qYXZhLHYgMS45IDIwMDYvMDEvMjcgMTI6NDk6NTEgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS45ICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjUxICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvSmF4bVVSSS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9KYXhtVVJJLmphdmEKaW5kZXggZTgwNWU3ZS4uMWJmYzFlZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9KYXhtVVJJLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9KYXhtVVJJLmphdmEKQEAgLTEsMTEgKzEsNSBAQAogLyoKLSAqICRJZDogSmF4bVVSSS5qYXZhLHYgMS40IDIwMDYvMDEvMjcgMTI6NDk6NTEgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS40ICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjUxICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IEpheG1VUkkuamF2YSx2IDEuNCAyMDA2LzAxLzI3IDEyOjQ5OjUxIHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MSAkCisgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnV0aWw7CiAKIC8vIEltcG9ydGVkIGZyb206IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwKQEAgLTY2LDYgKzY3LDcgQEAKICogZGVmYXVsdCBwb3J0IGZvciBhIHNwZWNpZmljIHNjaGVtZSkuIFJhdGhlciwgaXQgb25seSBrbm93cyB0aGUKICogZ3JhbW1hciBhbmQgYmFzaWMgc2V0IG9mIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIFVSSS4KICoKKyogQHZlcnNpb24gICRJZDogSmF4bVVSSS5qYXZhLHYgMS40IDIwMDYvMDEvMjcgMTI6NDk6NTEgdmoxMzUwNjIgRXhwICQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgcHVibGljIGNsYXNzIEpheG1VUkkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKaW5kZXggZWNmYmI0My4uYzZlYzM3NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiAjIFNBQUogUmVzb3VyY2VCdW5kbGUgcHJvcGVydGllcyBmaWxlCiAjIENvbnRhaW5zIExvZyBtZXNzYWdlcyBmb3IgdXRpbCBwa2cKICMgRXJyb3IgbWVzc2FnZXMKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvTG9nRG9tYWluQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL0xvZ0RvbWFpbkNvbnN0YW50cy5qYXZhCmluZGV4IDI4OTY4NjQuLjA0OTNiNDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvTG9nRG9tYWluQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9Mb2dEb21haW5Db25zdGFudHMuamF2YQpAQCAtMSwxMSArMSw1IEBACiAvKgotICogJElkOiBMb2dEb21haW5Db25zdGFudHMuamF2YSx2IDEuNSAyMDA2LzAxLzI3IDEyOjQ5OjUyIHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNSAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MiAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBMb2dEb21haW5Db25zdGFudHMuamF2YSx2IDEuNSAyMDA2LzAxLzI3IDEyOjQ5OjUyIHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNSAkCisgKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MiAkCisgKi8KKworCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9NaW1lSGVhZGVyc1V0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvTWltZUhlYWRlcnNVdGlsLmphdmEKaW5kZXggNTg0N2U1NC4uNzllMGI2ODkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvTWltZUhlYWRlcnNVdGlsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9NaW1lSGVhZGVyc1V0aWwuamF2YQpAQCAtMSw5ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IE1pbWVIZWFkZXJzVXRpbC5qYXZhLHYgMS41IDIwMDYvMDEvMjcgMTI6NDk6NTIgdmoxMzUwNjIgRXhwICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNiArMjIsMTEgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IE1pbWVIZWFkZXJzVXRpbC5qYXZhLHYgMS41IDIwMDYvMDEvMjcgMTI6NDk6NTIgdmoxMzUwNjIgRXhwICQKKyAqLworCisKIAogLyoqCiAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL05hbWVzcGFjZUNvbnRleHRJdGVyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9OYW1lc3BhY2VDb250ZXh0SXRlcmF0b3IuamF2YQppbmRleCBhNzhkMWVmLi5lMWUzZjJmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL05hbWVzcGFjZUNvbnRleHRJdGVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvTmFtZXNwYWNlQ29udGV4dEl0ZXJhdG9yLmphdmEKQEAgLTEsOSArMSw1IEBACiAvKgotICogJElkOiBOYW1lc3BhY2VDb250ZXh0SXRlcmF0b3IuamF2YSx2IDEuOCAyMDA2LzAxLzI3IDEyOjQ5OjUyIHZqMTM1MDYyIEV4cCAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBOYW1lc3BhY2VDb250ZXh0SXRlcmF0b3IuamF2YSx2IDEuOCAyMDA2LzAxLzI3IDEyOjQ5OjUyIHZqMTM1MDYyIEV4cCAkCisgKi8KKworCiAKIC8qKgogKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9QYXJzZVV0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvUGFyc2VVdGlsLmphdmEKaW5kZXggZmVmOTBkMy4uNmI3MzZjZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9QYXJzZVV0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL1BhcnNlVXRpbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFBhcnNlVXRpbC5qYXZhLHYgMS41IDIwMDYvMDEvMjcgMTI6NDk6NTIgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS41ICQKLSAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjUyICQKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFBhcnNlVXRpbC5qYXZhLHYgMS41IDIwMDYvMDEvMjcgMTI6NDk6NTIgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS41ICQKKyAqICREYXRlOiAyMDA2LzAxLzI3IDEyOjQ5OjUyICQKKyAqLworCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL1BhcnNlclBvb2wuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvUGFyc2VyUG9vbC5qYXZhCmluZGV4IDc1ZmIyOGMuLjAwYzExMzAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvUGFyc2VyUG9vbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvUGFyc2VyUG9vbC5qYXZhCkBAIC0xLDExICsxLDUgQEAKIC8qCi0gKiAkSWQ6IFBhcnNlclBvb2wuamF2YSx2IDEuNSAyMDA2LzAxLzI3IDEyOjQ5OjUyIHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNSAkCi0gKiAkRGF0ZTogMjAwNi8wMS8yNyAxMjo0OTo1MiAkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBQYXJzZXJQb29sLmphdmEsdiAxLjUgMjAwNi8wMS8yNyAxMjo0OTo1MiB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjUgJAorICogJERhdGU6IDIwMDYvMDEvMjcgMTI6NDk6NTIgJAorICovCisKKwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnV0aWw7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvUmVqZWN0RG9jdHlwZVNheEZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9SZWplY3REb2N0eXBlU2F4RmlsdGVyLmphdmEKaW5kZXggNGVhMWM5MC4uOWE4MzM0NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9SZWplY3REb2N0eXBlU2F4RmlsdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9SZWplY3REb2N0eXBlU2F4RmlsdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNiArMjMsNyBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCiAKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai51dGlsOwogCiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9UZWVJbnB1dFN0cmVhbS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9UZWVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDc5YWFjZTguLjU4NGZkODAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvVGVlSW5wdXRTdHJlYW0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL1RlZUlucHV0U3RyZWFtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNiArMjMsNyBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCiAKKwogLyoKICAqIENyZWF0ZWQgb24gRmViIDI4LCAyMDAzCiAgKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9YTUxEZWNsYXJhdGlvblBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC9YTUxEZWNsYXJhdGlvblBhcnNlci5qYXZhCmluZGV4IDcyMGEyOGQuLmM0MDQ4NjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvWE1MRGVjbGFyYXRpb25QYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL1hNTERlY2xhcmF0aW9uUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLio7CkBAIC0zNSw2ICszNiw3IEBACiAgKiAgPD94bWwgLi4uID8+CiAgKgogICogQGF1dGhvciBQYW5vcyBLb3VnaW91cmlzIChwYW5vc0BhY20ub3JnKQorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEuMS4xICQgJERhdGU6IDIwMDYvMDEvMjcgMTM6MTA6NTggJAogICovCiAKIHB1YmxpYyBjbGFzcyBYTUxEZWNsYXJhdGlvblBhcnNlciB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL3RyYW5zZm9ybS9FZmZpY2llbnRTdHJlYW1pbmdUcmFuc2Zvcm1lci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvbWVzc2FnaW5nL3NhYWovdXRpbC90cmFuc2Zvcm0vRWZmaWNpZW50U3RyZWFtaW5nVHJhbnNmb3JtZXIuamF2YQppbmRleCA1NDBmNjA2Li42MjBmOWM1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcvc2Fhai91dGlsL3RyYW5zZm9ybS9FZmZpY2llbnRTdHJlYW1pbmdUcmFuc2Zvcm1lci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL21lc3NhZ2luZy9zYWFqL3V0aWwvdHJhbnNmb3JtL0VmZmljaWVudFN0cmVhbWluZ1RyYW5zZm9ybWVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNiArMjMsNyBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCiAKKwogLyoKICAqIEVmZmljaWVudFN0cmVhbWluZ1RyYW5zZm9ybWVyLmphdmEKICAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRW5jb2RpbmdBbGdvcml0aG0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9FbmNvZGluZ0FsZ29yaXRobS5qYXZhCmluZGV4IDIwYjY0MjkuLjc3OWQ5ODIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9FbmNvZGluZ0FsZ29yaXRobS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9FbmNvZGluZ0FsZ29yaXRobS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0VuY29kaW5nQWxnb3JpdGhtRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24uamF2YQppbmRleCA1NzlhYjk1Li43MTdiNzc0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRW5jb2RpbmdBbGdvcml0aG1FeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQ7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9FbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9FbmNvZGluZ0FsZ29yaXRobUluZGV4ZXMuamF2YQppbmRleCAxNWIzMjFhLi5lZDY5MjAxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRW5jb2RpbmdBbGdvcml0aG1JbmRleGVzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0VuY29kaW5nQWxnb3JpdGhtSW5kZXhlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQ7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9FeHRlcm5hbFZvY2FidWxhcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9FeHRlcm5hbFZvY2FidWxhcnkuamF2YQppbmRleCA5MTdlYzMyLi43ZDhlMGEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRXh0ZXJuYWxWb2NhYnVsYXJ5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0V4dGVybmFsVm9jYWJ1bGFyeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQ7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9GYXN0SW5mb3NldEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0RXhjZXB0aW9uLmphdmEKaW5kZXggNjMyZGM4OS4uOWEyZmE5MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0RXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0OwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRQYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFBhcnNlci5qYXZhCmluZGV4IGM2NjhmNTguLjRkZDgzYWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFBhcnNlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDM0ICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtOTgsNiArNzAsMTMgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9WT0NBQlVMQVJJRVNfUFJPUEVSVFkgPQogICAgICAgICAiaHR0cDovL2p2bmV0Lm9yZy9mYXN0aW5mb3NldC9wYXJzZXIvcHJvcGVydGllcy9leHRlcm5hbC12b2NhYnVsYXJpZXMiOwogCisgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgbmFtZSB0byBiZSB1c2VkIGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZQorICAgICAqIGZsYWcsIHdoaWNoIHdpbGwgaW5kaWNhdGUgd2hldGhlciB1bmRlcmx5aW5nIFBhcnNlcidzCisgICAgICogaW5wdXQgc3RyZWFtIHNob3VsZCBiZSByZWFsbHkgY2xvc2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SQ0VfU1RSRUFNX0NMT1NFX1BST1BFUlRZID0KKyAgICAgICAgImh0dHA6Ly9qdm5ldC5vcmcvZmFzdGluZm9zZXQvcGFyc2VyL3Byb3BlcnRpZXMvZm9yY2Utc3RyZWFtLWNsb3NlIjsKIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgc3RyaW5nIGludGVybmluZyBwcm9wZXJ0eS4KQEAgLTE3Miw0ICsxNTEsMzggQEAKICAgICAgKi8KICAgICBwdWJsaWMgTWFwIGdldEV4dGVybmFsVm9jYWJ1bGFyaWVzKCk7CiAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcnNlIGZyYWdtZW50cyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBwYXJzZSBmcmFnbWVudHMgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUgdGhlbgorICAgICAqIGZyYWdtZW50cyBvZiBhbiBYTUwgaW5mb3NldCBtYXkgYmUgcGFyc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcnNlRnJhZ21lbnRzIFRoZSBwYXJzZSBmcmFnbWVudHMgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyc2VGcmFnbWVudHMoYm9vbGVhbiBwYXJzZUZyYWdtZW50cyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhcnNlIGZyYWdtZW50cyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBhcnNlIGZyYWdtZW50cyBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQYXJzZUZyYWdtZW50cygpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmb3JjZSBzdHJlYW0gY2xvc2UgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgZm9yY2Ugc3RyZWFtIHByb3BlcnR5IGlzIHNldCB0byB0cnVlIHRoZW4KKyAgICAgKiBQYXJzZXIncyB1bmRlcmx5aW5nIElucHV0U3RyZWFtIHdpbGwgYmUgY2xvc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIG5lZWRGb3JjZVN0cmVhbUNsb3NlIFRoZSBmb3JjZSBzdHJlYW0gY2xvc2UgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yY2VTdHJlYW1DbG9zZShib29sZWFuIG5lZWRGb3JjZVN0cmVhbUNsb3NlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZm9yY2Ugc3RyZWFtIGNsb3NlIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZm9yY2Ugc3RyZWFtIGNsb3NlIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmNlU3RyZWFtQ2xvc2UoKTsKKwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0UmVzdWx0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRSZXN1bHQuamF2YQppbmRleCA1M2Y2NmM3Li4zN2UwZWYwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRSZXN1bHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRSZXN1bHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzMyArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCiAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRTZXJpYWxpemVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRTZXJpYWxpemVyLmphdmEKaW5kZXggMzU3MDQzMy4uMTI4Yzc3MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U2VyaWFsaXplci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFNlcmlhbGl6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwzNCArMjQsNiBAQAogICoKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQ7CiAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTY5LDYgKzQxLDE2IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRmFzdEluZm9zZXRTZXJpYWxpemVyIHsKICAgICAvKioKKyAgICAgKiBUaGUgZmVhdHVyZSB0byBpZ25vcmUgdGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gYW5kIHRoZQorICAgICAqIGludGVybmFsIHN1YnNldC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gSWYgdHJ1ZSBhIHNlcmlhbGl6ZXIgc2hhbGwgaWdub3JlIGRvY3VtZW50CisgICAgICogdHlwZSBkZWNsYXJhdGlvbiBhbmQgdGhlIGludGVybmFsIHN1YnNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfRFREX0ZFQVRVUkUgPQorICAgICAgICAiaHR0cDovL2p2bmV0Lm9yZy9mYXN0aW5mb3NldC9zZXJpYWxpemVyL2ZlYXR1cmUvaWdub3JlL0RURCI7CisKKyAgICAvKioKICAgICAgKiBUaGUgZmVhdHVyZSB0byBpZ25vcmUgY29tbWVudHMuCiAgICAgICogPHA+CiAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIElmIHRydWUgYSBzZXJpYWxpemVyIHNoYWxsIGlnbm9yZSBjb21tZW50cwpAQCAtMTIzLDEzICsxMDUsMjUgQEAKICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxpbWl0IG9uIHRoZSBzaXplIG9mIGNoYXJhY3RlciBjb250ZW50IGNodW5rcwogICAgICAqIHRoYXQgd2lsbCBiZSBpbmRleGVkLgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENIQVJBQ1RFUl9DT05URU5UX0NIVU5LX1NJWkVfQ09OU1RSQUlOVCA9IDc7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBUkFDVEVSX0NPTlRFTlRfQ0hVTktfU0laRV9DT05TVFJBSU5UID0gMzI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbGltaXQgb24gdGhlIHNpemUgb2YgaW5kZXhlZCBNYXAgZm9yIGF0dHJpYnV0ZSB2YWx1ZXMKKyAgICAgKiBMaW1pdCBpcyBtZWFzdXJlZCBpbiBieXRlcyBub3QgaW4gbnVtYmVyIG9mIGVudHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSQUNURVJfQ09OVEVOVF9DSFVOS19NQVBfTUVNT1JZX0NPTlNUUkFJTlQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKIAogICAgIC8qKgogICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbGltaXQgb24gdGhlIHNpemUgb2YgYXR0cmlidXRlIHZhbHVlcwogICAgICAqIHRoYXQgd2lsbCBiZSBpbmRleGVkLgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURV9WQUxVRV9TSVpFX0NPTlNUUkFJTlQgPSA3OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURV9WQUxVRV9TSVpFX0NPTlNUUkFJTlQgPSAzMjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBsaW1pdCBvbiB0aGUgc2l6ZSBvZiBpbmRleGVkIE1hcCBmb3IgY2hhcmFjdGVyIGNvbnRlbnQgY2h1bmtzCisgICAgICogTGltaXQgaXMgbWVhc3VyZWQgaW4gYnl0ZXMgbm90IGluIG51bWJlciBvZiBlbnRyaWVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX1ZBTFVFX01BUF9NRU1PUllfQ09OU1RSQUlOVCA9IEludGVnZXIuTUFYX1ZBTFVFOwogCiAgICAgLyoqCiAgICAgICogVGhlIGNoYXJhY3RlciBlbmNvZGluZyBzY2hlbWUgc3RyaW5nIGZvciBVVEYtOC4KQEAgLTE0Miw2ICsxMzYsMTggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTZCRSA9ICJVVEYtMTZCRSI7CiAKICAgICAvKioKKyAgICAgKiBTZXQgdGhlIHtAbGluayAjSUdOT1JFX0RURF9GRUFUVVJFfS4KKyAgICAgKiBAcGFyYW0gaWdub3JlRFREIHRydWUgaWYgdGhlIGZlYXR1cmUgc2hhbGwgYmUgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVEVEQoYm9vbGVhbiBpZ25vcmVEVEQpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgI0lHTk9SRV9EVERfRkVBVFVSRX0uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIGlnbm9yZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVEVEQoKTsKKworICAgIC8qKgogICAgICAqIFNldCB0aGUge0BsaW5rICNJR05PUkVfQ09NTUVOVFNfRkVBVFVSRX0uCiAgICAgICogQHBhcmFtIGlnbm9yZUNvbW1lbnRzIHRydWUgaWYgdGhlIGZlYXR1cmUgc2hhbGwgYmUgaWdub3JlZC4KICAgICAgKi8KQEAgLTIyOCw2ICsyMzQsMjMgQEAKICAgICBwdWJsaWMgaW50IGdldENoYXJhY3RlckNvbnRlbnRDaHVua1NpemVMaW1pdCgpOwogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGltaXQgb24gdGhlIG1lbW9yeSBzaXplIG9mIE1hcCBvZiBhdHRyaWJ1dGUgdmFsdWVzCisgICAgICogdGhhdCB3aWxsIGJlIGluZGV4ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgYXR0cmlidXRlIHZhbHVlIHNpemUgbGltaXQuIEFueSB2YWx1ZSBsZXNzCisgICAgICogdGhhdCBhIGxlbmd0aCBvZiBzaXplIGxpbWl0IHdpbGwgYmUgaW5kZXhlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJDb250ZW50Q2h1bmtNYXBNZW1vcnlMaW1pdChpbnQgc2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaW1pdCBvbiB0aGUgbWVtb3J5IHNpemUgb2YgTWFwIG9mIGF0dHJpYnV0ZSB2YWx1ZXMKKyAgICAgKiB0aGF0IHdpbGwgYmUgaW5kZXhlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSBzaXplIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcmFjdGVyQ29udGVudENodW5rTWFwTWVtb3J5TGltaXQoKTsKKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxpbWl0IG9uIHRoZSBzaXplIG9mIGF0dHJpYnV0ZSB2YWx1ZXMKICAgICAgKiB0aGF0IHdpbGwgYmUgaW5kZXhlZC4KICAgICAgKgpAQCAtMjQ1LDYgKzI2OCwyMyBAQAogICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlVmFsdWVTaXplTGltaXQoKTsKIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpbWl0IG9uIHRoZSBtZW1vcnkgc2l6ZSBvZiBNYXAgb2YgYXR0cmlidXRlIHZhbHVlcworICAgICAqIHRoYXQgd2lsbCBiZSBpbmRleGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgVGhlIGF0dHJpYnV0ZSB2YWx1ZSBzaXplIGxpbWl0LiBBbnkgdmFsdWUgbGVzcworICAgICAqIHRoYXQgYSBsZW5ndGggb2Ygc2l6ZSBsaW1pdCB3aWxsIGJlIGluZGV4ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVmFsdWVNYXBNZW1vcnlMaW1pdChpbnQgc2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaW1pdCBvbiB0aGUgbWVtb3J5IHNpemUgb2YgTWFwIG9mIGF0dHJpYnV0ZSB2YWx1ZXMKKyAgICAgKiB0aGF0IHdpbGwgYmUgaW5kZXhlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSBzaXplIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlVmFsdWVNYXBNZW1vcnlMaW1pdCgpOworCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBleHRlcm5hbCB2b2NhYnVsYXJ5IHRoYXQgc2hhbGwgYmUgdXNlZCB3aGVuIHNlcmlhbGl6aW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHYgdGhlIHZvY2FidWxhcnkuCkBAIC0yNTIsNiArMjkyLDIwIEBACiAgICAgcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxWb2NhYnVsYXJ5KEV4dGVybmFsVm9jYWJ1bGFyeSB2KTsKIAogICAgIC8qKgorICAgICAqIFNldCB0aGUgYXBwbGljYXRpb24gZGF0YSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcmlhbGl6ZXIgdm9jYWJ1bGFyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBhcHBsaWNhdGlvbiBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZvY2FidWxhcnlBcHBsaWNhdGlvbkRhdGEoVm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YSBkYXRhKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXBwbGljYXRpb24gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcmlhbGl6ZXIgdm9jYWJ1bGFyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIGRhdGEuCisgICAgICovCisgICAgcHVibGljIFZvY2FidWxhcnlBcHBsaWNhdGlvbkRhdGEgZ2V0Vm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YSgpOworCisgICAgLyoqCiAgICAgICogUmVzZXQgdGhlIHNlcmlhbGl6ZXIgZm9yIHJldXNlIHNlcmlhbGl6aW5nIGFub3RoZXIgWE1MIGluZm9zZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFNvdXJjZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U291cmNlLmphdmEKaW5kZXggZDY4ZGM1ZS4uZDY4MmE1MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U291cmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U291cmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L1Jlc3RyaWN0ZWRBbHBoYWJldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L1Jlc3RyaWN0ZWRBbHBoYWJldC5qYXZhCmluZGV4IDAzY2VkMzIuLmNhYjhkMWQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9SZXN0cmljdGVkQWxwaGFiZXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvUmVzdHJpY3RlZEFscGhhYmV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzMgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L1ZvY2FidWxhcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9Wb2NhYnVsYXJ5LmphdmEKaW5kZXggMTVjZmNlZC4uZmM4YzRiYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L1ZvY2FidWxhcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvVm9jYWJ1bGFyeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQ7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9Wb2NhYnVsYXJ5QXBwbGljYXRpb25EYXRhLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvVm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNzFjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvVm9jYWJ1bGFyeUFwcGxpY2F0aW9uRGF0YS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKgorICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCisgKi8KKworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldDsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBkYXRhIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHZvY2FidWxhcnkuCisgKiA8cD4KKyAqIFRoZSBhcHBsaWNhdGlvbiB3aWxsIGltcGxlbWVudCB0aGlzIGludGVmYWNlIGFuZCBwcm92aWRlCisgKiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHJlbGF0ZWQgdG8gYSB2b2NhYnVsYXJ5LgorICoKKyAqIEBhdXRob3IgUGF1bC5TYW5kb3pAU3VuLkNvbQorICovCitwdWJsaWMgaW50ZXJmYWNlIFZvY2FidWxhcnlBcHBsaWNhdGlvbkRhdGEgeworICAgIC8qKgorICAgICAqICBDbGVhciB0aGUgdm9jYWJ1bGFyeSAgYXBwbGljYXRpb24gZGF0YS4KKyAgICAgKiAgPHA+CisgICAgICogIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB3aGVuIGEgcGFyc2VyIG9yIHNlcmlhbGl6ZXIgY2xlYXJzCisgICAgICogIHRoZSB2b2NhYnVsYXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L0VuY29kaW5nQWxnb3JpdGhtQXR0cmlidXRlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9FbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXMuamF2YQppbmRleCA3ZDJkMWQ1Li4yYTliM2RkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L0VuY29kaW5nQWxnb3JpdGhtQXR0cmlidXRlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvRW5jb2RpbmdBbGdvcml0aG1BdHRyaWJ1dGVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5zYXg7CiAKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwpAQCAtMTIyLDQgKzk0LDIyIEBACiAgICAgICogQHJldHVybiBUaGUgZGF0YS4gSWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRBbGdvcml0aG1EYXRhKGludCBpbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFscGhhYmV0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IFRoZSBhdHRyaWJ1dGUgaW5kZXggKHplcm8tYmFzZWQpLgorICAgICAqIEByZXR1cm4gVGhlIGFscGhhYmV0LgorICAgICAqICAgICAgICAgSWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICogICAgICAgICBJZiB0aGVyZSBpcyBpcyBubyBhbHBoYWJldCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbHBhYmFiZXQoaW50IGluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd2hldGhlciB0aGUgYXR0cmlidXRlIHZhbHVlIHNob3VsZCBiZSBpbmRleGVkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCBUaGUgYXR0cmlidXRlIGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgYXR0cmlidXRlIHZhbHVlIHNob3VsZCBiZSBpbmRleGVkLCBvdGhlcndpc2UgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VG9JbmRleChpbnQgaW5kZXgpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9FbmNvZGluZ0FsZ29yaXRobUNvbnRlbnRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L0VuY29kaW5nQWxnb3JpdGhtQ29udGVudEhhbmRsZXIuamF2YQppbmRleCA4OTc1ZWI1Li4xZjA0ZTUzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L0VuY29kaW5nQWxnb3JpdGhtQ29udGVudEhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L0VuY29kaW5nQWxnb3JpdGhtQ29udGVudEhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LnNheDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvRXh0ZW5kZWRDb250ZW50SGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9FeHRlbmRlZENvbnRlbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4ZmFlNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvRXh0ZW5kZWRDb250ZW50SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKgorICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuc2F4OworCitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBDb250ZW50SGFuZGxlciB7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBjaGFyYWN0ZXIgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaCB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBYTUwgZG9jdW1lbnQKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBhcnJheQorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gaW5kZXggdHJ1ZSBpZiB0aGUgY2hhcmFjdGVycyBhcmUgaW5kZXhlZCwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIGFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQorICAgICAqICAgICAgICAgICAgd3JhcHBpbmcgYW5vdGhlciBleGNlcHRpb24KKyAgICAgKiBAc2VlIENvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGluZGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9GYXN0SW5mb3NldFJlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9GYXN0SW5mb3NldFJlYWRlci5qYXZhCmluZGV4IDBiMTg3MWEuLmZkZmI3N2MgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvRmFzdEluZm9zZXRSZWFkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L0Zhc3RJbmZvc2V0UmVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMzQgKzI1LDYgQEAKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5zYXg7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9GYXN0SW5mb3NldFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9GYXN0SW5mb3NldFdyaXRlci5qYXZhCmluZGV4IDVmZjJjODkuLmEzZWI3ZDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvRmFzdEluZm9zZXRXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L0Zhc3RJbmZvc2V0V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsOCArMjEsOSBAQAogICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICoKKyAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LnNheDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5GYXN0SW5mb3NldFNlcmlhbGl6ZXI7CkBAIC0zMSw1ICszMiw2IEBACiAKIHB1YmxpYyBpbnRlcmZhY2UgRmFzdEluZm9zZXRXcml0ZXIgZXh0ZW5kcyBDb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIsCiAgICAgICAgIEVuY29kaW5nQWxnb3JpdGhtQ29udGVudEhhbmRsZXIsIFByaW1pdGl2ZVR5cGVDb250ZW50SGFuZGxlciwKLSAgICAgICAgUmVzdHJpY3RlZEFscGhhYmV0Q29udGVudEhhbmRsZXIsIEZhc3RJbmZvc2V0U2VyaWFsaXplciB7CisgICAgICAgIFJlc3RyaWN0ZWRBbHBoYWJldENvbnRlbnRIYW5kbGVyLCBFeHRlbmRlZENvbnRlbnRIYW5kbGVyLAorICAgICAgICBGYXN0SW5mb3NldFNlcmlhbGl6ZXIgewogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9QcmltaXRpdmVUeXBlQ29udGVudEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvUHJpbWl0aXZlVHlwZUNvbnRlbnRIYW5kbGVyLmphdmEKaW5kZXggMTcwMjFhNi4uMTkwZTdkYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9QcmltaXRpdmVUeXBlQ29udGVudEhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L1ByaW1pdGl2ZVR5cGVDb250ZW50SGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDMzICsyNSw2IEBACiAgKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KICAqLwogCi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIE1PRElGSUVEIEJZIFNVTiBNSUNST1NZU1RFTVMsIElOQy4KLSAqCi0gKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuc2F4OwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L1Jlc3RyaWN0ZWRBbHBoYWJldENvbnRlbnRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L1Jlc3RyaWN0ZWRBbHBoYWJldENvbnRlbnRIYW5kbGVyLmphdmEKaW5kZXggZjYwYmM2YS4uZDQ2NTNhMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9SZXN0cmljdGVkQWxwaGFiZXRDb250ZW50SGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvUmVzdHJpY3RlZEFscGhhYmV0Q29udGVudEhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LnNheDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvaGVscGVycy9FbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXNJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L2hlbHBlcnMvRW5jb2RpbmdBbGdvcml0aG1BdHRyaWJ1dGVzSW1wbC5qYXZhCmluZGV4IDI0ZTFiZGEuLjhhZGU3OGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvaGVscGVycy9FbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXNJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9oZWxwZXJzL0VuY29kaW5nQWxnb3JpdGhtQXR0cmlidXRlc0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwzNCArMjQsNiBAQAogICoKICAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgogICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgotICoKLSAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuc2F4LmhlbHBlcnM7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5Db21tb25SZXNvdXJjZUJ1bmRsZTsKQEAgLTEwNSw2ICs3NywxMCBAQAogCiAgICAgcHJpdmF0ZSBPYmplY3RbXSBfYWxnb3JpdGhtRGF0YTsKIAorICAgIHByaXZhdGUgU3RyaW5nW10gX2FscGhhYmV0czsKKworICAgIHByaXZhdGUgYm9vbGVhbltdIF90b0luZGV4OworCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBFbmNvZGluZ0FsZ29yaXRobUF0dHJpYnV0ZXNJbXBsIG9iamVjdC4KICAgICAgKi8KQEAgLTEzOSw2ICsxMTUsOCBAQAogICAgICAgICBfZGF0YSA9IG5ldyBTdHJpbmdbREVGQVVMVF9DQVBBQ0lUWSAqIFNJWkVdOwogICAgICAgICBfYWxnb3JpdGhtSWRzID0gbmV3IGludFtERUZBVUxUX0NBUEFDSVRZXTsKICAgICAgICAgX2FsZ29yaXRobURhdGEgPSBuZXcgT2JqZWN0W0RFRkFVTFRfQ0FQQUNJVFldOworICAgICAgICBfYWxwaGFiZXRzID0gbmV3IFN0cmluZ1tERUZBVUxUX0NBUEFDSVRZXTsKKyAgICAgICAgX3RvSW5kZXggPSBuZXcgYm9vbGVhbltERUZBVUxUX0NBUEFDSVRZXTsKIAogICAgICAgICBfcmVnaXN0ZXJlZEVuY29kaW5nQWxnb3JpdGhtcyA9IHJlZ2lzdGVyZWRFbmNvZGluZ0FsZ29yaXRobXM7CiAKQEAgLTE5Miw2ICsxNzAsNDYgQEAKICAgICAgICAgX2RhdGFbaSsrXSA9IHJlcGxhY2VOdWxsKHFOYW1lKTsKICAgICAgICAgX2RhdGFbaSsrXSA9IHJlcGxhY2VOdWxsKHR5cGUpOwogICAgICAgICBfZGF0YVtpKytdID0gcmVwbGFjZU51bGwodmFsdWUpOworICAgICAgICBfdG9JbmRleFtfbGVuZ3RoXSA9IGZhbHNlOworICAgICAgICBfYWxwaGFiZXRzW19sZW5ndGhdID0gbnVsbDsKKworICAgICAgICBfbGVuZ3RoKys7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAqCisgICAgICogPHA+Rm9yIHRoZSBzYWtlIG9mIHNwZWVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vIGNoZWNraW5nCisgICAgICogdG8gc2VlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdDogdGhhdCBpcworICAgICAqIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgYXBwbGljYXRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgTmFtZXNwYWNlIFVSSSwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZgorICAgICAqICAgICAgICBub25lIGlzIGF2YWlsYWJsZSBvciBOYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBub3QKKyAgICAgKiAgICAgICAgYmVpbmcgcGVyZm9ybWVkLgorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGxvY2FsIG5hbWUsIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYKKyAgICAgKiAgICAgICAgTmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgbm90IGJlaW5nIHBlcmZvcm1lZC4KKyAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIHF1YWxpZmllZCAocHJlZml4ZWQpIG5hbWUsIG9yIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgKiAgICAgICAgaWYgcXVhbGlmaWVkIG5hbWVzIGFyZSBub3QgYXZhaWxhYmxlLgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBhdHRyaWJ1dGUgdHlwZSBhcyBhIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gaW5kZXggVHJ1ZSBpZiBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluZGV4ZWQuCisgICAgICogQHBhcmFtIGluZGV4IFRoZSBhbHBoYWJldCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSB2YWx1ZSwKKyAgICAgKiAgICAgICAgICAgICAgbWF5IGJlIG51bGwgaWYgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBhbHBoYWJldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIFVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpbmRleCwgU3RyaW5nIGFscGhhYmV0KSB7CisgICAgICAgIGlmIChfbGVuZ3RoID49IF9hbGdvcml0aG1EYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaSA9IF9sZW5ndGggKiBTSVpFOworICAgICAgICBfZGF0YVtpKytdID0gcmVwbGFjZU51bGwoVVJJKTsKKyAgICAgICAgX2RhdGFbaSsrXSA9IHJlcGxhY2VOdWxsKGxvY2FsTmFtZSk7CisgICAgICAgIF9kYXRhW2krK10gPSByZXBsYWNlTnVsbChxTmFtZSk7CisgICAgICAgIF9kYXRhW2krK10gPSByZXBsYWNlTnVsbCh0eXBlKTsKKyAgICAgICAgX2RhdGFbaSsrXSA9IHJlcGxhY2VOdWxsKHZhbHVlKTsKKyAgICAgICAgX3RvSW5kZXhbX2xlbmd0aF0gPSBpbmRleDsKKyAgICAgICAgX2FscGhhYmV0c1tfbGVuZ3RoXSA9IGFscGhhYmV0OwogCiAgICAgICAgIF9sZW5ndGgrKzsKICAgICB9CkBAIC0yMjgsNiArMjQ2LDggQEAKICAgICAgICAgX2RhdGFbaSsrXSA9IG51bGw7CiAgICAgICAgIF9hbGdvcml0aG1JZHNbX2xlbmd0aF0gPSBidWlsdEluQWxnb3JpdGhtSUQ7CiAgICAgICAgIF9hbGdvcml0aG1EYXRhW19sZW5ndGhdID0gYWxnb3JpdGhtRGF0YTsKKyAgICAgICAgX3RvSW5kZXhbX2xlbmd0aF0gPSBmYWxzZTsKKyAgICAgICAgX2FscGhhYmV0c1tfbGVuZ3RoXSA9IG51bGw7CiAKICAgICAgICAgX2xlbmd0aCsrOwogICAgIH0KQEAgLTI2NSw2ICsyODUsOCBAQAogICAgICAgICBfZGF0YVtpKytdID0gYWxnb3JpdGhtVVJJOwogICAgICAgICBfYWxnb3JpdGhtSWRzW19sZW5ndGhdID0gYWxnb3JpdGhtSUQ7CiAgICAgICAgIF9hbGdvcml0aG1EYXRhW19sZW5ndGhdID0gYWxnb3JpdGhtRGF0YTsKKyAgICAgICAgX3RvSW5kZXhbX2xlbmd0aF0gPSBmYWxzZTsKKyAgICAgICAgX2FscGhhYmV0c1tfbGVuZ3RoXSA9IG51bGw7CiAKICAgICAgICAgX2xlbmd0aCsrOwogICAgIH0KQEAgLTI5MCw2ICszMTIsOCBAQAogICAgICAgICBfZGF0YVtpICsgQUxHT1JJVEhNVVJJX09GRlNFVF0gPSBhbGdvcml0aG1VUkk7CiAgICAgICAgIF9hbGdvcml0aG1JZHNbaW5kZXhdID0gYWxnb3JpdGhtSUQ7CiAgICAgICAgIF9hbGdvcml0aG1EYXRhW2luZGV4XSA9IGFsZ29yaXRobURhdGE7CisgICAgICAgIF90b0luZGV4W2luZGV4XSA9IGZhbHNlOworICAgICAgICBfYWxwaGFiZXRzW2luZGV4XSA9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTMsNiArMzM3LDggQEAKICAgICAgICAgICAgICAgICBfZGF0YVtpbmRleCsrXSA9IGF0dHMuZ2V0VHlwZShpKTsKICAgICAgICAgICAgICAgICBfZGF0YVtpbmRleCsrXSA9IGF0dHMuZ2V0VmFsdWUoaSk7CiAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICBfdG9JbmRleFtpXSA9IGZhbHNlOworICAgICAgICAgICAgICAgIF9hbHBoYWJldHNbaV0gPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzQwLDYgKzM2Niw4IEBACiAgICAgICAgICAgICAgICAgX2RhdGFbaW5kZXgrK10gPSBhdHRzLmdldEFsZ29yaXRobVVSSShpKTsKICAgICAgICAgICAgICAgICBfYWxnb3JpdGhtSWRzW2ldID0gYXR0cy5nZXRBbGdvcml0aG1JbmRleChpKTsKICAgICAgICAgICAgICAgICBfYWxnb3JpdGhtRGF0YVtpXSA9IGF0dHMuZ2V0QWxnb3JpdGhtRGF0YShpKTsKKyAgICAgICAgICAgICAgICBfdG9JbmRleFtpXSA9IGZhbHNlOworICAgICAgICAgICAgICAgIF9hbHBoYWJldHNbaV0gPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDg3LDYgKzUxNSwyMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gRXh0ZW5kZWRBdHRyaWJ1dGVzCisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFscGFiYWJldChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBfbGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gX2FscGhhYmV0c1tpbmRleF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFRvSW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgX2xlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIF90b0luZGV4W2luZGV4XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8vIC0tLS0tCiAKQEAgLTUwOCwxNCArNTUzLDIwIEBACiAgICAgICAgIFN0cmluZ1tdIGRhdGEgPSBuZXcgU3RyaW5nW25ld0xlbmd0aCAqIFNJWkVdOwogICAgICAgICBpbnRbXSBhbGdvcml0aG1JZHMgPSBuZXcgaW50W25ld0xlbmd0aF07CiAgICAgICAgIE9iamVjdFtdIGFsZ29yaXRobURhdGEgPSBuZXcgT2JqZWN0W25ld0xlbmd0aF07CisgICAgICAgIFN0cmluZ1tdIGFscGhhYmV0cyA9IG5ldyBTdHJpbmdbbmV3TGVuZ3RoXTsKKyAgICAgICAgYm9vbGVhbltdIHRvSW5kZXggPSBuZXcgYm9vbGVhbltuZXdMZW5ndGhdOwogCiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2RhdGEsIDAsIGRhdGEsIDAsIF9sZW5ndGggKiBTSVpFKTsKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShfYWxnb3JpdGhtSWRzLCAwLCBhbGdvcml0aG1JZHMsIDAsIF9sZW5ndGgpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9hbGdvcml0aG1EYXRhLCAwLCBhbGdvcml0aG1EYXRhLCAwLCBfbGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShfYWxwaGFiZXRzLCAwLCBhbHBoYWJldHMsIDAsIF9sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF90b0luZGV4LCAwLCB0b0luZGV4LCAwLCBfbGVuZ3RoKTsKIAogICAgICAgICBfZGF0YSA9IGRhdGE7CiAgICAgICAgIF9hbGdvcml0aG1JZHMgPSBhbGdvcml0aG1JZHM7CiAgICAgICAgIF9hbGdvcml0aG1EYXRhID0gYWxnb3JpdGhtRGF0YTsKKyAgICAgICAgX2FscGhhYmV0cyA9IGFscGhhYmV0czsKKyAgICAgICAgX3RvSW5kZXggPSB0b0luZGV4OwogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIGNvbnZlcnRFbmNvZGluZ0FsZ29yaXRobURhdGFUb1N0cmluZygKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvaGVscGVycy9GYXN0SW5mb3NldERlZmF1bHRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc2F4L2hlbHBlcnMvRmFzdEluZm9zZXREZWZhdWx0SGFuZGxlci5qYXZhCmluZGV4IDUwYjg3MjMuLjE0ODlmODIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zYXgvaGVscGVycy9GYXN0SW5mb3NldERlZmF1bHRIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3NheC9oZWxwZXJzL0Zhc3RJbmZvc2V0RGVmYXVsdEhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNCArMjUsNiBAQAogICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCi0gKgotICovCi0KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuc2F4LmhlbHBlcnM7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zdGF4L0Zhc3RJbmZvc2V0U3RyZWFtUmVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc3RheC9GYXN0SW5mb3NldFN0cmVhbVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjdlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvZmFzdGluZm9zZXQvc3RheC9GYXN0SW5mb3NldFN0cmVhbVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKgorICogVEhJUyBGSUxFIFdBUyBNT0RJRklFRCBCWSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuc3RheDsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworCisvKioKKyAqIEZhc3QgSW5mb3NldCBTdHJlYW0gUmVhZGVyLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhZGRpdGlvbmFsIG9wdGltaXplZCBtZXRob2RzIHRvIHRoYXQgb2YKKyAqIHtAbGluayBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcn0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmFzdEluZm9zZXRTdHJlYW1SZWFkZXIgeworICAgIC8qKgorICAgICAqIFBlZWsgYXQgdGhlIG5leHQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBldmVudCwgd2hpY2ggd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGF0IHJldHVybmVkIGZyb20KKyAgICAgKiAgICAgICAgIHtAbGluayAjbmV4dH0uCisgICAgICovCisgICAgcHVibGljIGludCBwZWVrTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisKKyAgICAvLyBGYXN0ZXIgYWNjZXNzIG1ldGhvZHMgd2l0aG91dCBjaGVja3MKKworICAgIHB1YmxpYyBpbnQgYWNjZXNzTmFtZXNwYWNlQ291bnQoKTsKKworICAgIHB1YmxpYyBTdHJpbmcgYWNjZXNzTG9jYWxOYW1lKCk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGFjY2Vzc05hbWVzcGFjZVVSSSgpOworCisgICAgcHVibGljIFN0cmluZyBhY2Nlc3NQcmVmaXgoKTsKKworICAgIHB1YmxpYyBjaGFyW10gYWNjZXNzVGV4dENoYXJhY3RlcnMoKTsKKworICAgIHB1YmxpYyBpbnQgYWNjZXNzVGV4dFN0YXJ0KCk7CisKKyAgICBwdWJsaWMgaW50IGFjY2Vzc1RleHRMZW5ndGgoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zdGF4L0xvd0xldmVsRmFzdEluZm9zZXRTdHJlYW1Xcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9mYXN0aW5mb3NldC9zdGF4L0xvd0xldmVsRmFzdEluZm9zZXRTdHJlYW1Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjY4YWMzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L2Zhc3RpbmZvc2V0L3N0YXgvTG93TGV2ZWxGYXN0SW5mb3NldFN0cmVhbVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICoKKyAqIFRISVMgRklMRSBXQVMgTU9ESUZJRUQgQlkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LnN0YXg7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5FbmNvZGluZ0NvbnN0YW50czsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5FbmNvZGluZ0FsZ29yaXRobUluZGV4ZXM7CisKKy8qKgorICogTG93IGxldmVsIEZhc3QgSW5mb3NldCBzdHJlYW0gd3JpdGVyLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhZGRpdGlvbmFsIHN0cmVhbS1iYXNlZCBzZXJpYWxpemF0aW9uIG1ldGhvZHMgZm9yIHRoZQorICogY2FzZSB3aGVyZSBhbiBhcHBsaWNhdGlvbiBpcyBpbiBzcGVjaWZpYyBjb250cm9sIG9mIHRoZSBzZXJpYWxpemF0aW9uCisgKiBwcm9jZXNzIGFuZCBoYXMgdGhlIGtub3dsZWRnZSB0byBjYWxsIHRoZSBMb3dMZXZlbCBtZXRob2RzIGluIHRoZSByZXF1aXJlZAorICogb3JkZXIuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24gbWF5IGJlIGFibGUgdG8gcGVyZm9ybSBlZmZpY2llbnQgaW5mb3JtYXRpb24KKyAqIHRvIGluZGV4aW5nIG1hcHBpbmcgYW5kIHRvIHByb3ZpZGUgY2VydGFpbiBpbmZvcm1hdGlvbiBpbiBVVEYtOCBlbmNvZGVkIGZvcm0uCisgKiA8cD4KKyAqIFRoZXNlIG1ldGhvZHMgbWF5IGJlIHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIHtAbGluayBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcn0KKyAqIGFzIGxvbmcgYXMgYW4gZWxlbWVudCBmcmFnbWVudCB3cml0dGVuIHVzaW5nIHRoZSBlZmZpY2llbnQgc3RyZWFtaW5nIG1ldGhvZHMKKyAqIGFyZSBzZWxmLWNvbnRhaW5lZCBhbmQgbm8gc3ViLWZyYWdtZW50IGlzIHdyaXR0ZW4gdXNpbmcgbWV0aG9kcyBmcm9tCisgKiB7QGxpbmsgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXJ9LgorICogPHA+CisgKiBUaGUgcmVxdWlyZWQgY2FsbCBzZXF1ZW5jZSBpcyBhcyBmb2xsb3dzOgorICogPHByZT4KKyAqIENBTExTRVFVRU5DRSAgICA6PSB7QGxpbmsgI3N0YXJ0RG9jdW1lbnQgc3RhcnREb2N1bWVudH0KKyAqICAgICAgICAgICAgICAgICAgICBpbml0aWF0ZUxvd0xldmVsV3JpdGluZyBFTEVNRU5UCisgKiAgICAgICAgICAgICAgICAgICAge0BsaW5rICNlbmREb2N1bWVudCBlbmREb2N1bWVudH0KKyAqICAgICAgICAgICAgICAgICB8ICBpbml0aWF0ZUxvd0xldmVsV3JpdGluZyBFTEVNRU5UICAgLy8gZm9yIGZyYWdtZW50CisgKgorICogRUxFTUVOVCAgICAgICAgIDo9IHdyaXRlTG93TGV2ZWxUZXJtaW5hdGlvbkFuZE1hcmsKKyAqICAgICAgICAgICAgICAgICAgICBOQU1FU1BBQ0VTPworICogICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfTkFNRQorICogICAgICAgICAgICAgICAgICAgIEFUVFJJQlVURVM/CisgKiAgICAgICAgICAgICAgICAgICAgd3JpdGVMb3dMZXZlbEVuZFN0YXJ0RWxlbWVudAorICogICAgICAgICAgICAgICAgICAgIENPTlRFTlRTCisgKiAgICAgICAgICAgICAgICAgICAgd3JpdGVMb3dMZXZlbEVuZEVsZW1lbnQKKyAqCisgKiBOQU1FU1BBQ0VTICAgICAgOj0gd3JpdGVMb3dMZXZlbFN0YXJ0TmFtZXNwYWNlcworICogICAgICAgICAgICAgICAgICAgIHdyaXRlTG93TGV2ZWxOYW1lc3BhY2UqCisgKiAgICAgICAgICAgICAgICAgICAgd3JpdGVMb3dMZXZlbEVuZE5hbWVzcGFjZXMKKyAqCisgKiBFTEVNRU5UX05BTUUgICAgOj0gd3JpdGVMb3dMZXZlbFN0YXJ0RWxlbWVudEluZGV4ZWQKKyAqICAgICAgICAgICAgICAgICB8ICB3cml0ZUxvd0xldmVsU3RhcnROYW1lTGl0ZXJhbAorICogICAgICAgICAgICAgICAgIHwgIHdyaXRlTG93TGV2ZWxTdGFydEVsZW1lbnQKKyAqCisgKiBBVFRSVUJVVEVTICAgICAgOj0gd3JpdGVMb3dMZXZlbFN0YXJ0QXR0cmlidXRlcworICogICAgICAgICAgICAgICAgICAgKEFUVFJJQlVURV9OQU1FIHdyaXRlTG93TGV2ZWxBdHRyaWJ1dGVWYWx1ZSkqCisgKgorICogQVRUUklCVVRFX05BTUUgIDo9IHdyaXRlTG93TGV2ZWxBdHRyaWJ1dGVJbmRleGVkCisgKiAgICAgICAgICAgICAgICAgfCAgd3JpdGVMb3dMZXZlbFN0YXJ0TmFtZUxpdGVyYWwKKyAqICAgICAgICAgICAgICAgICB8ICB3cml0ZUxvd0xldmVsQXR0cmlidXRlCisgKgorICoKKyAqIENPTlRFTlRTICAgICAgOj0gKEVMRU1FTlQgfCB3cml0ZUxvd0xldmVsVGV4dCB3cml0ZUxvd0xldmVsT2N0ZXRzKSoKKyAqIDwvcHJlPgorICogPHA+CisgKiBTb21lIG1ldGhvZHMgZGVmZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGZvciB0aGUgbWFwcGluZyBvZiBpbmZvcm1hdGlvbgorICogdG8gaW5kZXhlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBMb3dMZXZlbEZhc3RJbmZvc2V0U3RyZWFtV3JpdGVyIHsKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBsb3cgbGV2ZWwgd3JpdGluZyBvZiBhbiBlbGVtZW50IGZyYWdtZW50LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBiZWZvcmUgb3RoZXIgbG93IGxldmVsIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWF0ZUxvd0xldmVsV3JpdGluZygpCisgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmV4dCBpbmRleCB0byBhcHBseSB0byBhbiBFbGVtZW50IEluZm9ybWF0aW9uIEl0ZW0uCisgICAgICogPHA+CisgICAgICogVGhpcyB3aWxsIGluY3JlbWVudCB0aGUgbmV4dCBvYnRhaW5lZCBpbmRleCBzdWNoIHRoYXQ6CisgICAgICogPHByZT4KKyAgICAgKiBpID0gdy5nZXROZXh0RWxlbWVudEluZGV4KCk7CisgICAgICogaiA9IHcuZ2V0TmV4dEVsZW1lbnRJbmRleCgpOworICAgICAqIGkgPT0gaiArIDE7CisgICAgICogPC9wcmU+CisgICAgICogQHJldHVybiB0aGUgaW5kZXguCisgICAgICovCisgICAgcHVibGljIGludCBnZXROZXh0RWxlbWVudEluZGV4KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5leHQgaW5kZXggdG8gYXBwbHkgdG8gYW4gQXR0cmlidXRlIEluZm9ybWF0aW9uIEl0ZW0uCisgICAgICogVGhpcyB3aWxsIGluY3JlbWVudCB0aGUgbmV4dCBvYnRhaW5lZCBpbmRleCBzdWNoIHRoYXQ6CisgICAgICogPHByZT4KKyAgICAgKiBpID0gdy5nZXROZXh0QXR0cmlidXRlSW5kZXgoKTsKKyAgICAgKiBqID0gdy5nZXROZXh0QXR0cmlidXRlSW5kZXgoKTsKKyAgICAgKiBpID09IGogKyAxOworICAgICAqIDwvcHJlPgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TmV4dEF0dHJpYnV0ZUluZGV4KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgaW5kZXggdGhhdCB3YXMgYXBwbGllZCB0byBhbiBbbG9jYWwgbmFtZV0gb2YgYW4KKyAgICAgKiBFbGVtZW50IG9yIEF0dHJpYnV0ZSBJbmZvcm1hdGlvbiBJdGVtLgorICAgICAqIDwvcHJlPgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TG9jYWxOYW1lSW5kZXgoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmV4dCBpbmRleCB0byBhcHBseSB0byBhbiBbbG9jYWwgbmFtZV0gb2YgYW4gRWxlbWVudCBvciBBdHRyaWJ1dGUKKyAgICAgKiBJbmZvcm1hdGlvbiBJdGVtLgorICAgICAqIFRoaXMgd2lsbCBpbmNyZW1lbnQgdGhlIG5leHQgb2J0YWluZWQgaW5kZXggc3VjaCB0aGF0OgorICAgICAqIDxwcmU+CisgICAgICogaSA9IHcuZ2V0TmV4dExvY2FsTmFtZUluZGV4KCk7CisgICAgICogaiA9IHcuZ2V0TmV4dExvY2FsTmFtZUluZGV4KCk7CisgICAgICogaSA9PSBqICsgMTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE5leHRMb2NhbE5hbWVJbmRleCgpOworCisgICAgcHVibGljIHZvaWQgd3JpdGVMb3dMZXZlbFRlcm1pbmF0aW9uQW5kTWFyaygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgd3JpdGVMb3dMZXZlbFN0YXJ0RWxlbWVudEluZGV4ZWQoaW50IHR5cGUsIGludCBpbmRleCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IGlzIGluZGV4ZWQsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZUxvd0xldmVsU3RhcnRFbGVtZW50KGludCB0eXBlLAorICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTG93TGV2ZWxTdGFydE5hbWVzcGFjZXMoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTG93TGV2ZWxOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTG93TGV2ZWxFbmROYW1lc3BhY2VzKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvd0xldmVsU3RhcnRBdHRyaWJ1dGVzKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvd0xldmVsQXR0cmlidXRlSW5kZXhlZChpbnQgaW5kZXgpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGF0dHJpYnV0ZSBpcyBpbmRleGVkLCBvdGhlcndpc2UgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gd3JpdGVMb3dMZXZlbEF0dHJpYnV0ZSgKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvd0xldmVsQXR0cmlidXRlVmFsdWUoU3RyaW5nIHZhbHVlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTG93TGV2ZWxTdGFydE5hbWVMaXRlcmFsKGludCB0eXBlLAorICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwgYnl0ZVtdIHV0ZjhMb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvd0xldmVsU3RhcnROYW1lTGl0ZXJhbChpbnQgdHlwZSwKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIGludCBsb2NhbE5hbWVJbmRleCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTG93TGV2ZWxFbmRTdGFydEVsZW1lbnQoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTG93TGV2ZWxFbmRFbGVtZW50KCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvd0xldmVsVGV4dChjaGFyW10gdGV4dCwgaW50IGxlbmd0aCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvd0xldmVsVGV4dChTdHJpbmcgdGV4dCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxvd0xldmVsT2N0ZXRzKGJ5dGVbXSBvY3RldHMsIGludCBsZW5ndGgpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L3N0YXhleC9CYXNlNjREYXRhLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvc3RheGV4L0Jhc2U2NERhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjQ5Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L3N0YXhleC9CYXNlNjREYXRhLmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleDsKKworaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIEJpbmFyeSBkYXRhIHJlcHJlc2VudGVkIGFzIGJhc2U2NC1lbmNvZGVkIHN0cmluZworICogaW4gWE1MLgorICoKKyAqIDxwPgorICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayBYTUxTdHJlYW1SZWFkZXJFeH0KKyAqIGFuZCB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyRXh9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGNsYXNzIEJhc2U2NERhdGEgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UsIENsb25lYWJsZSB7CisKKyAgICAvLyBlaXRoZXIgZGF0YUhhbmRsZXIgb3IgKGRhdGEsZGF0YUxlbixtaW1lVHlwZT8pIG11c3QgYmUgcHJlc2VudAorCisgICAgcHJpdmF0ZSBEYXRhSGFuZGxlciBkYXRhSGFuZGxlcjsKKworICAgIHByaXZhdGUgYnl0ZVtdIGRhdGE7CisgICAgLyoqCisgICAgICogTGVuZ3RoIG9mIHRoZSB2YWxpZCBkYXRhIGluIHtAbGluayAjZGF0YX0uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGF0YUxlbjsKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHtAbGluayAjZGF0YX0gY2FuIGJlIGNsb25lZCBieSByZWZlcmVuY2UKKyAgICAgKiBpZiBCYXNlNjREYXRhIGluc3RhbmNlIGlzIGNsb25lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGF0YUNsb25lQnlSZWY7CisgICAgLyoqCisgICAgICogT3B0aW9uYWwgTUlNRSB0eXBlIG9mIHtAbGluayAjZGF0YX0uCisgICAgICoKKyAgICAgKiBVbnVzZWQgd2hlbiB7QGxpbmsgI2RhdGFIYW5kbGVyfSBpcyBzZXQuCisgICAgICogVXNlIHtAbGluayBEYXRhSGFuZGxlciNnZXRDb250ZW50VHlwZSgpfSBpbiB0aGF0IGNhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWltZVR5cGU7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIEJhc2U2NERhdGEoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvbmUgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzZTY0RGF0YShCYXNlNjREYXRhIHRoYXQpIHsKKyAgICAgICAgdGhhdC5nZXQoKTsKKyAgICAgICAgaWYgKHRoYXQuZGF0YUNsb25lQnlSZWYpIHsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoYXQuZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBieXRlW3RoYXQuZGF0YUxlbl07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoYXQuZGF0YSwgMCwgdGhpcy5kYXRhLCAwLCB0aGF0LmRhdGFMZW4pOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5kYXRhQ2xvbmVCeVJlZiA9IHRydWU7CisgICAgICAgIHRoaXMuZGF0YUxlbiA9IHRoYXQuZGF0YUxlbjsKKyAgICAgICAgdGhpcy5kYXRhSGFuZGxlciA9IG51bGw7CisgICAgICAgIHRoaXMubWltZVR5cGUgPSB0aGF0Lm1pbWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGxzIGluIHRoZSBkYXRhIG9iamVjdCBieSBhIHBvcnRpb24gb2YgdGhlIGJ5dGVbXS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgIGRhdGFbMF0gdG8gZGF0YVtsZW4tMV0gYXJlIHRyZWF0ZWQgYXMgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGNsb25lQnlSZWYKKyAgICAgKiAgICAgIHRydWUgaWYgZGF0YVtdIGNhbiBiZSBjbG9uZWQgYnkgcmVmZXJlbmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0KGJ5dGVbXSBkYXRhLCBpbnQgbGVuLCBTdHJpbmcgbWltZVR5cGUsIGJvb2xlYW4gY2xvbmVCeVJlZikgeworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICB0aGlzLmRhdGFMZW4gPSBsZW47CisgICAgICAgIHRoaXMuZGF0YUNsb25lQnlSZWYgPSBjbG9uZUJ5UmVmOworICAgICAgICB0aGlzLmRhdGFIYW5kbGVyID0gbnVsbDsKKyAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGxzIGluIHRoZSBkYXRhIG9iamVjdCBieSBhIHBvcnRpb24gb2YgdGhlIGJ5dGVbXS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgIGRhdGFbMF0gdG8gZGF0YVtsZW4tMV0gYXJlIHRyZWF0ZWQgYXMgdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0KGJ5dGVbXSBkYXRhLCBpbnQgbGVuLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgc2V0KGRhdGEsbGVuLG1pbWVUeXBlLGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxscyBpbiB0aGUgZGF0YSBvYmplY3QgYnkgdGhlIGJ5dGVbXSBvZiB0aGUgZXhhY3QgbGVuZ3RoLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgIHRoaXMgYnVmZmVyIG1heSBiZSBvd25lZCBkaXJlY3RseSBieSB0aGUgdW5tYXJzaGFsZWxkIEpBWEIgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldChieXRlW10gZGF0YSxTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgc2V0KGRhdGEsZGF0YS5sZW5ndGgsbWltZVR5cGUsZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGxzIGluIHRoZSBkYXRhIG9iamVjdCBieSBhIHtAbGluayBEYXRhSGFuZGxlcn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0KERhdGFIYW5kbGVyIGRhdGEpIHsKKyAgICAgICAgYXNzZXJ0IGRhdGEhPW51bGw7CisgICAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBkYXRhOworICAgICAgICB0aGlzLmRhdGEgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJhdyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcigpIHsKKyAgICAgICAgaWYoZGF0YUhhbmRsZXI9PW51bGwpeworICAgICAgICAgICAgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIobmV3IERhdGFTb3VyY2UoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE1pbWVUeXBlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEsMCxkYXRhTGVuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YUhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnl0ZVtdIG9mIHRoZSBleGFjdCBsZW5ndGguCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRFeGFjdCgpIHsKKyAgICAgICAgZ2V0KCk7CisgICAgICAgIGlmKGRhdGFMZW4hPWRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbZGF0YUxlbl07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsMCxidWYsMCxkYXRhTGVuKTsKKyAgICAgICAgICAgIGRhdGEgPSBidWY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGF0YSBhcyBhbiB7QGxpbmsgSW5wdXRTdHJlYW19LgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmKGRhdGFIYW5kbGVyIT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIGRhdGFIYW5kbGVyLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSwwLGRhdGFMZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhpcyBvYmplY3Qgb25seSBoYXMge0BsaW5rIERhdGFIYW5kbGVyfSBhbmQgdGhlcmVmb3JlCisgICAgICoge0BsaW5rICNnZXQoKX0gb3BlcmF0aW9uIGlzIGxpa2VseSBnb2luZyB0byBiZSBleHBlbnNpdmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGEhPW51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcmF3IGRhdGEuIFRoZSBzaXplIG9mIHRoZSBieXRlIGFycmF5IG1heWJlIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgbGVuZ3RoLgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0KCkgeworICAgICAgICBpZihkYXRhPT1udWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbUV4IGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtRXgoMTAyNCk7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBkYXRhSGFuZGxlci5nZXREYXRhU291cmNlKCkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBiYW9zLnJlYWRGcm9tKGlzKTsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIGRhdGEgPSBiYW9zLmdldEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGRhdGFMZW4gPSBiYW9zLnNpemUoKTsKKyAgICAgICAgICAgICAgICBkYXRhQ2xvbmVCeVJlZiA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVwb3J0IHRoZSBlcnJvciB0byB0aGUgdW5tYXJzaGFsbGVyCisgICAgICAgICAgICAgICAgZGF0YUxlbiA9IDA7ICAgIC8vIHJlY292ZXIgYnkgYXNzdW1pbmcgbGVuZ3RoLTAgZGF0YQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGF0YUxlbigpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFMZW47CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgaWYobWltZVR5cGU9PW51bGwpCisgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgICAgIHJldHVybiBtaW1lVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBuZWVkZWQgdG8gcmVwcmVzZW50CisgICAgICogdGhpcyBiaW5hcnkgZGF0YSBpbiB0aGUgYmFzZTY0IGVuY29kaW5nLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgeworICAgICAgICAvLyBmb3IgZWFjaCAzIGJ5dGVzIHlvdSB1c2UgNCBjaGFycworICAgICAgICAvLyBpZiB0aGUgcmVtYWluZGVyIGlzIDEgb3IgMiB0aGVyZSB3aWxsIGJlIDQgbW9yZQorICAgICAgICBnZXQoKTsgIC8vIGZpbGwgaW4gdGhlIGJ1ZmZlciBpZiBuZWNlc3NhcnkKKyAgICAgICAgcmV0dXJuICgoZGF0YUxlbisyKS8zKSo0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZSB0aGlzIGJpbmFyeSBkYXRhIGluIHRoZSBiYXNlNjQgZW5jb2RpbmcKKyAgICAgKiBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgICAgICovCisgICAgcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgeworICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCB0aGUgbGVuZ3RoKCkgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QKKyAgICAgICAgLy8gKG90aGVyd2lzZSBob3cgd291bGQgdGhlIGNhbGxlciBrbm93IHRoYXQgdGhlIGluZGV4IGlzIHZhbGlkPykKKyAgICAgICAgLy8gc28gd2UgYXNzdW1lIHRoYXQgdGhlIGJ5dGVbXSBpcyBhbHJlYWR5IHBvcHVsYXRlZAorCisgICAgICAgIGludCBvZmZzZXQgPSBpbmRleCU0OworICAgICAgICBpbnQgYmFzZSA9IChpbmRleC80KSozOworCisgICAgICAgIGJ5dGUgYjEsYjI7CisKKyAgICAgICAgc3dpdGNoKG9mZnNldCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICByZXR1cm4gQmFzZTY0RW5jb2Rlci5lbmNvZGUoZGF0YVtiYXNlXT4+Mik7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmKGJhc2UrMTxkYXRhTGVuKQorICAgICAgICAgICAgICAgIGIxID0gZGF0YVtiYXNlKzFdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGIxID0gMDsKKyAgICAgICAgICAgIHJldHVybiBCYXNlNjRFbmNvZGVyLmVuY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZGF0YVtiYXNlXSYweDMpPDw0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKGIxPj40KSYweEYpKTsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYoYmFzZSsxPGRhdGFMZW4pIHsKKyAgICAgICAgICAgICAgICBiMSA9IGRhdGFbYmFzZSsxXTsKKyAgICAgICAgICAgICAgICBpZihiYXNlKzI8ZGF0YUxlbikKKyAgICAgICAgICAgICAgICAgICAgYjIgPSBkYXRhW2Jhc2UrMl07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBiMiA9IDA7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0RW5jb2Rlci5lbmNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiMSYweEYpPDwyKXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGIyPj42KSYweDMpKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAnPSc7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmKGJhc2UrMjxkYXRhTGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjRFbmNvZGVyLmVuY29kZShkYXRhW2Jhc2UrMl0mMHgzRik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuICc9JzsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbGx5IHRoaXMgaXMgb25seSB1c2VkIHRvIHNwbGl0IGEgdGV4dCB0byBhIGxpc3QsCisgICAgICogd2hpY2ggZG9lc24ndCBoYXBwZW4gdGhhdCBtdWNoIGZvciBiYXNlNjQuCisgICAgICogU28gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBmYXN0ZXIuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBnZXQoKTsgIC8vIGZpbGwgaW4gdGhlIGJ1ZmZlciBpZiB3ZSBoYXZlbid0IGRvbmUgc28KKyAgICAgICAgZm9yKCBpbnQgaT1zdGFydDsgaTxlbmQ7IGkrKyApCisgICAgICAgICAgICBidWYuYXBwZW5kKGNoYXJBdChpKSk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmFzZTY0IGVuY29kZWQgc3RyaW5nIG9mIHRoaXMgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBnZXQoKTsgIC8vIGZpbGwgaW4gdGhlIGJ1ZmZlcgorICAgICAgICByZXR1cm4gQmFzZTY0RW5jb2Rlci5wcmludChkYXRhLCAwLCBkYXRhTGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNoYXJbXSBidWYsIGludCBzdGFydCkgeworICAgICAgICBnZXQoKTsKKyAgICAgICAgQmFzZTY0RW5jb2Rlci5wcmludChkYXRhLCAwLCBkYXRhTGVuLCBidWYsIHN0YXJ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFzZTY0RGF0YSBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCYXNlNjREYXRhKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9zdGF4ZXgvQmFzZTY0RW5jb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L3N0YXhleC9CYXNlNjRFbmNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjOTBlNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9zdGF4ZXgvQmFzZTY0RW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXg7CisKKy8qKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitjbGFzcyBCYXNlNjRFbmNvZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gZW5jb2RlTWFwID0gaW5pdEVuY29kZU1hcCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGluaXRFbmNvZGVNYXAoKSB7CisgICAgICAgIGNoYXJbXSBtYXAgPSBuZXcgY2hhcls2NF07CisgICAgICAgIGludCBpOworICAgICAgICBmb3IoIGk9IDA7IGk8MjY7IGkrKyApICAgICAgICBtYXBbaV0gPSAoY2hhcikoJ0EnK2kpOworICAgICAgICBmb3IoIGk9MjY7IGk8NTI7IGkrKyApICAgICAgICBtYXBbaV0gPSAoY2hhcikoJ2EnKyhpLTI2KSk7CisgICAgICAgIGZvciggaT01MjsgaTw2MjsgaSsrICkgICAgICAgIG1hcFtpXSA9IChjaGFyKSgnMCcrKGktNTIpKTsKKyAgICAgICAgbWFwWzYyXSA9ICcrJzsKKyAgICAgICAgbWFwWzYzXSA9ICcvJzsKKworICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2hhciBlbmNvZGUoIGludCBpICkgeworICAgICAgICByZXR1cm4gZW5jb2RlTWFwW2kmMHgzRl07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBieXRlIGVuY29kZUJ5dGUoIGludCBpICkgeworICAgICAgICByZXR1cm4gKGJ5dGUpZW5jb2RlTWFwW2kmMHgzRl07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnQoYnl0ZVtdIGlucHV0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CisgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclsoKGxlbisyKS8zKSo0XTsKKyAgICAgICAgaW50IHB0ciA9IHByaW50KGlucHV0LG9mZnNldCxsZW4sYnVmLDApOworICAgICAgICBhc3NlcnQgcHRyPT1idWYubGVuZ3RoOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYSBieXRlIGFycmF5IGludG8gYSBjaGFyIGFycmF5IGJ5IGRvaW5nIGJhc2U2NCBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIFRoZSBjYWxsZXIgbXVzdCBzdXBwbHkgYSBiaWcgZW5vdWdoIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSB2YWx1ZSBvZiB7QGNvZGUgcHRyKygobGVuKzIpLzMpKjR9LCB3aGljaCBpcyB0aGUgbmV3IG9mZnNldAorICAgICAqICAgICAgaW4gdGhlIG91dHB1dCBidWZmZXIgd2hlcmUgdGhlIGZ1cnRoZXIgYnl0ZXMgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBwcmludChieXRlW10gaW5wdXQsIGludCBvZmZzZXQsIGludCBsZW4sIGNoYXJbXSBidWYsIGludCBwdHIpIHsKKyAgICAgICAgZm9yKCBpbnQgaT1vZmZzZXQ7IGk8bGVuOyBpKz0zICkgeworICAgICAgICAgICAgc3dpdGNoKCBsZW4taSApIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKGlucHV0W2ldPj4yKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKCgoaW5wdXRbaV0pJjB4Myk8PDQpOworICAgICAgICAgICAgICAgIGJ1ZltwdHIrK10gPSAnPSc7CisgICAgICAgICAgICAgICAgYnVmW3B0cisrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKGlucHV0W2ldPj4yKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaV0mMHgzKTw8NCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaSsxXT4+NCkmMHhGKSk7CisgICAgICAgICAgICAgICAgYnVmW3B0cisrXSA9IGVuY29kZSgoaW5wdXRbaSsxXSYweEYpPDwyKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gJz0nOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKGlucHV0W2ldPj4yKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaV0mMHgzKTw8NCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaSsxXT4+NCkmMHhGKSk7CisgICAgICAgICAgICAgICAgYnVmW3B0cisrXSA9IGVuY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlucHV0W2krMV0mMHhGKTw8Mil8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnB1dFtpKzJdPj42KSYweDMpKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKGlucHV0W2krMl0mMHgzRik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHB0cjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvc3RheGV4L0J5dGVBcnJheU91dHB1dFN0cmVhbUV4LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvc3RheGV4L0J5dGVBcnJheU91dHB1dFN0cmVhbUV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzNTg4NQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9zdGF4ZXgvQnl0ZUFycmF5T3V0cHV0U3RyZWFtRXguamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXg7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICoge0BsaW5rIEJ5dGVBcnJheU91dHB1dFN0cmVhbX0gd2l0aCBhY2Nlc3MgdG8gaXRzIHJhdyBidWZmZXIuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitmaW5hbCBjbGFzcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW1FeCBleHRlbmRzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB7CisgICAgcHVibGljIEJ5dGVBcnJheU91dHB1dFN0cmVhbUV4KCkgeworICAgIH0KKworICAgIHB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW1FeChpbnQgc2l6ZSkgeworICAgICAgICBzdXBlcihzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoQmFzZTY0RGF0YSBkdCxTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgZHQuc2V0KGJ1Zixjb3VudCxtaW1lVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRCdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGdpdmVuIHtAbGluayBJbnB1dFN0cmVhbX0gY29tcGxldGVseSBpbnRvIHRoZSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZEZyb20oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgICAgIGlmKGNvdW50PT1idWYubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgLy8gcmVhbGxsb2NhdGUKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW2J1Zi5sZW5ndGgqMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsMCxkYXRhLDAsYnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnVmID0gZGF0YTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHN6ID0gaXMucmVhZChidWYsY291bnQsYnVmLmxlbmd0aC1jb3VudCk7CisgICAgICAgICAgICBpZihzejwwKSAgICAgcmV0dXJuOworICAgICAgICAgICAgY291bnQgKz0gc3o7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvc3RheGV4L05hbWVzcGFjZUNvbnRleHRFeC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L3N0YXhleC9OYW1lc3BhY2VDb250ZXh0RXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGJjMjdiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L3N0YXhleC9OYW1lc3BhY2VDb250ZXh0RXguamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXg7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEV4dGVuZGVkIHtAbGluayBOYW1lc3BhY2VDb250ZXh0fS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTmFtZXNwYWNlQ29udGV4dEV4IGV4dGVuZHMgTmFtZXNwYWNlQ29udGV4dCwgSXRlcmFibGU8TmFtZXNwYWNlQ29udGV4dEV4LkJpbmRpbmc+IHsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIGFsbCB0aGUgaW4tc2NvcGUgbmFtZXNwYWNlIGJpbmRpbmdzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgZW51bWVyYXRlcyBhbGwgdGhlIGFjdGl2ZSBpbi1zY29wZSBuYW1lc3BhY2UgYmluZGluZ3MuCisgICAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGltcGxpY2l0IGJpbmRpbmdzLCBzdWNoIGFzCisgICAgICogPHR0PiJ4bWwiLT4iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjwvdHQ+CisgICAgICogb3IgPHR0PiIiLT4iIjwvdHQ+ICh0aGUgaW1wbGljaXQgZGVmYXVsdCBuYW1lc3BhY2UgVVJJLikKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCBpdGVyYXRvciBtYXkgbm90IGluY2x1ZGUgdGhlIHNhbWUgcHJlZml4IG1vcmUgdGhhbiBvbmNlLgorICAgICAqIEZvciBleGFtcGxlLCB0aGUgcmV0dXJuZWQgaXRlcmF0b3IgbWF5IG9ubHkgY29udGFpbiA8dHQ+Zj1uczI8L3R0PgorICAgICAqIGlmIHRoZSBkb2N1bWVudCBpcyBhcyBmb2xsb3dzIGFuZCB0aGlzIG1ldGhvZCBpcyB1c2VkIGF0IHRoZSBiYXIgZWxlbWVudC4KKyAgICAgKgorICAgICAqIDxwcmU+PHhtcD4KKyAgICAgKiA8Zm9vIHhtbG5zOmY9J25zMSc+CisgICAgICogICA8YmFyIHhtbG5zOmY9J25zMic+CisgICAgICogICAgIC4uLgorICAgICAqIDwveG1wPjwvcHJlPgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIGl0ZXJhdGlvbiBtYXkgYmUgZG9uZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbWF5IHJldHVybiBhbiBlbXB0eSBpdGVyYXRvciwgYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgSXRlcmF0b3I8QmluZGluZz4gaXRlcmF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFByZWZpeCB0byBuYW1lc3BhY2UgVVJJIGJpbmRpbmcuCisgICAgICovCisgICAgaW50ZXJmYWNlIEJpbmRpbmcgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgcHJlZml4LgorICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGRlZmF1bHQgbmFtZXNwYWNlIFVSSSBpcyByZXByZXNlbnRlZCBieSB1c2luZyBhbgorICAgICAgICAgKiBlbXB0eSBzdHJpbmcgIiIsIG5vdCBudWxsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqICAgICAgbmV2ZXIgbnVsbC4gU3RyaW5nIGxpa2UgImZvbyIsICJuczEyIiwgb3IgIiIuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgZ2V0UHJlZml4KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIG5hbWVzcGFjZSBVUkkuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgZW1wdHkgbmFtZXNwYWNlIFVSSSBpcyByZXByZXNlbnRlZCBieSB1c2luZworICAgICAgICAgKiBhbiBlbXB0eSBzdHJpbmcgIiIsIG5vdCBudWxsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqICAgICAgbmV2ZXIgbnVsbC4gU3RyaW5nIGxpa2UgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCisgICAgICAgICAqICAgICAgInVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOmRvY2Jvb2s6ZHRkOnhtbDo0LjEuMiIsIG9yICIiLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9zdGF4ZXgvWE1MU3RyZWFtUmVhZGVyRXguamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL29yZy9qdm5ldC9zdGF4ZXgvWE1MU3RyZWFtUmVhZGVyRXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmYwZjFjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L3N0YXhleC9YTUxTdHJlYW1SZWFkZXJFeC5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXg7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKKworLyoqCisgKiB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSBleHRlbmRlZCBmb3IgcmVhZGluZyBiaW5hcnkgZGF0YS4KKyAqCisgKiA8cD4KKyAqIFNvbWUgcHJvZHVjZXIgb2YgaW5mb3NldCAoaW4gcGFydGljdWxhciwgc3VjaCBhcyBGYXN0SW5mb3NldCwKKyAqIFhPUCBkZWVjb2RlciksIHVzZWVzIGEgbmF0aXZlIGZvcm1hdCB0aGF0IGVuYWJsZXMgZWZmaWNpZW50CisgKiB0cmVhdG1lbnQgb2YgYmluYXJ5IGRhdGEuIEZvciBvcmRpbmFyeSBpbmZvc2V0IGNvbnN1bWVyCisgKiAodGhhdCBqdXN0IHVzZXMge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0sIHRob3NlIGJpbmFyeSBkYXRhCisgKiB3aWxsIGp1c3QgbG9vayBsaWtlIGJhc2U2NC1lbmNvZGVkIHN0cmluZywgYnV0IHRoaXMgaW50ZXJmYWNlCisgKiBhbGxvd3MgY29uc3VtZXJzIG9mIHN1Y2ggaW5mb3NldCB0byBhY2Nlc3MgdGhpcyByYXcgYmluYXJ5IGRhdGEuCisgKiBTdWNoIGluZm9zZXQgcHJvZHVjZXIgbWF5IGNob29zZSB0byBpbXBsZW1lbnQgdGhpcyBhZGRpdG9pbmFsCisgKiBpbnRlcmZhY2UsIHRvIGV4cG9zZSB0aGlzIGZ1bmN0aW9uYWxpdHkuCisgKgorICogPHA+CisgKiBDb25zdW1lcnMgdGhhdCBhcmUgY2FwYWJsZSBvZiB1c2luZyB0aGlzIGludGVyZmFjZSBjYW4gcXVlcnkKKyAqIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IGlmIGl0IHN1cHBvcnRzIHRoaXMgYnkgc2ltcGx5IGRvd25jYXN0aW5nCisgKiBpdCB0byB0aGlzIGludGVyZmFjZSBsaWtlIHRoaXM6CisgKgorICogPHByZT4KKyAqIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSAuLi47CisgKiBpZiggcmVhZGVyIGluc3RhbmNlb2YgWE1MU3RyZWFtUmVhZGVyRXggKSB7CisgKiAgIC8vIHRoaXMgcmVhZGVyIHN1cHBvcnRzIGJpbmFyeSBkYXRhIGV4Y2hhbmdlCisgKiAgIC4uLgorICogfSBlbHNlIHsKKyAqICAgLy8gbm9vcAorICogICAuLi4KKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogQWxzbyBub3RlIHRoYXQgaXQgaXMgYWxzbyBhbGxvd2VkIGZvciB0aGUgaW5mb3NldCBwcm9kdWNlcgorICogdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGluIHN1Y2ggYSB3YXkgdGhhdCB7QGxpbmsgI2dldFBDREFUQSgpfQorICogYWx3YXlzIGRlbGVnYXRlIHRvIHtAbGluayAjZ2V0VGV4dCgpfSwgYWx0aG91Z2ggaXQncyBub3QgZGVzaXJhYmxlLgorICoKKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgYSBwcml2YXRlIGNvbnRyYWN0IGJldHdlZW4gc3VjaCBwcm9kdWNlcnMKKyAqIGFuZCBjb25zdW1lcnMgdG8gYWxsb3cgdGhlbSB0byBleGNoYW5nZSBiaW5hcnkgZGF0YSB3aXRob3V0CisgKiBjb252ZXJ0aW5nIGl0IHRvIGJhc2U2NC4KKyAqCisgKiBAc2VlIFhNTFN0cmVhbVdyaXRlckV4CisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWE1MU3RyZWFtUmVhZGVyRXggZXh0ZW5kcyBYTUxTdHJlYW1SZWFkZXIgeworICAgIC8vLyoqCisgICAgLy8gKiBXb3JrcyBsaWtlIHtAbGluayBYTUxTdHJlYW1SZWFkZXIjZ2V0VGV4dCgpfQorICAgIC8vICogYnV0IHJldHVybnMgdGV4dCBhcyB7QGxpbmsgRGF0YVNvdXJjZX0uCisgICAgLy8gKgorICAgIC8vICogPHA+CisgICAgLy8gKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCB3aGVuZXZlciB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyI2dldFRleHQoKX0KKyAgICAvLyAqIGNhbiBiZSBpbnZva2VkLiBJbnZva2luZyB0aGlzIG1ldGhvZCBtZWFucyB0aGUgY2FsbGVyIGlzIGFzc3VtaW5nCisgICAgLy8gKiB0aGF0IHRoZSB0ZXh0IGlzIChjb25jZXB0dWFsbHkpIGJhc2U2NC1lbmNvZGVkIGJpbmFyeSBkYXRhLgorICAgIC8vICoKKyAgICAvLyAqIDxwPgorICAgIC8vICogVGhpcyBhYnN0cmFjdGlvbiBpcyBuZWNlc3NhcnkgdG8gdHJlYXQgWE9QIGFzIGluZm9zZXQgZW5jb2RpbmcuCisgICAgLy8gKiBUaGF0IGlzLCB5b3UgY2FuIGVpdGhlciBhY2Nlc3MgdGhlIFhPUC1hdHRhY2hlZCBiaW5hcnkgdGhyb3VnaAorICAgIC8vICoge0BsaW5rIFhNTFN0cmVhbVJlYWRlciNnZXRUZXh0KCl9IChpbiB3aGljaCBjYXNlIHlvdSdsbCBzZWUgdGhlCisgICAgLy8gKiBiYXNlNjQgZW5jb2RlZCBzdHJpbmcpLCBvciB5b3UgY2FuIGFjY2VzcyBpdCBhcyBhIGJpbmFyeSBkYXRhCisgICAgLy8gKiBkaXJlY3RseSBieSB1c2luZyB0aGlzIG1ldGhvZC4KKyAgICAvLyAqCisgICAgLy8gKiA8cD4KKyAgICAvLyAqIE5vdGUgdGhhdCBldmVuIGlmIHlvdSBhcmUgcmVhZGluZyBmcm9tIG5vbiBYT1AtYXdhcmUge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0sCisgICAgLy8gKiB0aGlzIG1ldGhvZCBtdXN0IGJlIHN0aWxsIHN1cHBvcnRlZDsgaWYgdGhlIHJlYWRlciBpcyBwb2ludGluZworICAgIC8vICogdG8gYSB0ZXh0LCB0aGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgZGVjb2RpbmcgYmFzZTY0IGFuZAorICAgIC8vICogcHJvZHVjaW5nIGEge0BsaW5rIERhdGFIYW5kbGVyfSB3aXRoICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iCisgICAgLy8gKiBhcyB0aGUgY29udGVudCB0eXBlLgorICAgIC8vICoKKyAgICAvLyAqIEByZXR1cm4KKyAgICAvLyAqICAgICAgYWx3YXlzIG5vbi1udWxsIHZhbGlkIG9iamVjdC4KKyAgICAvLyAqICAgICAgSW52b2NhdGlvbnMgb2YgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgc2FtZSBvYmplY3QgYXMgbG9uZworICAgIC8vICogICAgICBhcyB0aGUge0BsaW5rIFhNTFN0cmVhbVJlYWRlciNuZXh0KCl9IG1ldGhvZCBpcyBub3QgdXNlZCwKKyAgICAvLyAqICAgICAgYnV0IG90aGVyd2lzZSB7QGxpbmsgRGF0YVNvdXJjZX0gb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKKyAgICAvLyAqICAgICAgaXMgY29uc2lkZXJlZCB0byBiZSBvd25lZCBieSB0aGUgY2xpZW50LCBhbmQgdGhlcmVmb3JlIGl0IHNob3VsZG4ndAorICAgIC8vICogICAgICBiZSByZXVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgIC8vICoKKyAgICAvLyAqICAgICAgPHA+CisgICAgLy8gKiAgICAgIFRoZSByZXR1cm5lZCB7QGxpbmsgRGF0YVNvdXJjZX0gaXMgcmVhZC1vbmx5LCBhbmQgdGhlIGNhbGxlcgorICAgIC8vICogICAgICBtdXN0IG5vdCBpbnZva2Uge0BsaW5rIERhdGFTb3VyY2UjZ2V0T3V0cHV0U3RyZWFtKCl9LgorICAgIC8vICoKKyAgICAvLyAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgLy8gKiAgICAgIGlmIHRoZSBwYXJzZXIgaXMgbm90IHBvaW50aW5nIGF0IGNoYXJhY3RlcnMgaW5mb3NldCBpdGVtLgorICAgIC8vICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICAvLyAqICAgICAgaWYgdGhlIHBhcnNlciBwb2ludHMgdG8gdGV4dCBidXQgdGV4dCBpcyBub3QgYmFzZTY0LWVuY29kZWQgdGV4dCwKKyAgICAvLyAqICAgICAgb3IgaWYgc29tZSBvdGhlciBwYXJzaW5nIGVycm9yIG9jY3VycyAoc3VjaCBhcyBpZiB0aGUgJmx0O3hvcDpJbmNsdWRlPgorICAgIC8vICogICAgICBwb2ludHMgdG8gYSBub24tZXhpc3RpbmcgYXR0YWNobWVudC4pCisgICAgLy8gKgorICAgIC8vICogICAgICA8cD4KKyAgICAvLyAqICAgICAgSXQgaXMgYWxzbyBPSyBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHN1Y2Nlc3NmdWxseSwgb25seSB0byBmYWlsCisgICAgLy8gKiAgICAgIGR1cmluZyBhbiB7QGxpbmsgSW5wdXRTdHJlYW19IGlzIHJlYWQgZnJvbSB7QGxpbmsgRGF0YVNvdXJjZX0uCisgICAgLy8gKi8KKyAgICAvL0RhdGFTb3VyY2UgZ2V0VGV4dEFzRGF0YUhhbmRsZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworCisgICAgLy8vKioKKyAgICAvLyAqIFdvcmtzIGxpa2Uge0BsaW5rIFhNTFN0cmVhbVJlYWRlciNnZXRUZXh0KCl9CisgICAgLy8gKiBidXQgcmV0dXJucyB0ZXh0IGFzIHtAbGluayBieXRlW119LgorICAgIC8vICoKKyAgICAvLyAqIDxwPgorICAgIC8vICogVGhlIGNvbnRyYWN0IG9mIHRoaXMgbWV0aG9kIGlzIG1vc3RseSB0aGUgc2FtZSBhcworICAgIC8vICoge0BsaW5rICNnZXRUZXh0QXNEYXRhSGFuZGxlcigpfSwgZXhjZXB0IHRoYXQgdGhpcworICAgIC8vICogbWV0aG9kIHJldHVybnMgdGhlIGJpbmFyeSBkYXRhcyBhcyBhbiBleGFjdC1zaXplIGJ5dGVbXS4KKyAgICAvLyAqCisgICAgLy8gKiA8cD4KKyAgICAvLyAqIFRoaXMgbWV0aG9kIGlzIGFsc28gbm90IGNhcGFibGUgb2YgcmVwb3J0aW5nIHRoZSBjb250ZW50IHR5cGUKKyAgICAvLyAqIG9mIHRoaXMgYmluYXJ5IGRhdGEsIGV2ZW4gaWYgaXQgaXMgYXZhaWxhYmxlIHRvIHRoZSBwYXJzZXIuCisgICAgLy8gKgorICAgIC8vICogQHNlZSAjZ2V0VGV4dEFzRGF0YUhhbmRsZXIoKQorICAgIC8vICovCisgICAgLy9ieXRlW10gZ2V0VGV4dEFzQnl0ZUFycmF5KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFdvcmtzIGxpa2Uge0BsaW5rICNnZXRUZXh0KCl9CisgICAgICogYnV0IGhpZGVzIHRoZSBhY3R1YWwgZGF0YSByZXByZXNlbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSB7QGxpbmsgQ2hhclNlcXVlbmNlfSB0aGF0IHJlcHJlc2VudHMgdGhlCisgICAgICogICAgICBjaGFyYWN0ZXIgaW5mb3NldCBpdGVtcyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqICAgICAgPHA+CisgICAgICogICAgICBUaGUge0BsaW5rIENoYXJTZXF1ZW5jZX0gaXMgbm9ybWFsbHkgYSB7QGxpbmsgU3RyaW5nfSwKKyAgICAgKiAgICAgIGJ1dCBjYW4gYmUgYW55IG90aGVyIHtAbGluayBDaGFyU2VxdWVuY2V9IGltcGxlbWVudGF0aW9uLgorICAgICAqICAgICAgRm9yIGJpbmFyeSBkYXRhLCBob3dldmVyLCB1c2Ugb2Yge0BsaW5rIEJhc2U2NERhdGF9IGlzCisgICAgICogICAgICByZWNvbW1lbmRlZCAoc28gdGhhdCB0aGUgY29uc3VtZXIgaW50ZXJlc3RlZCBpbiBzZWVpbmcgaXQKKyAgICAgKiAgICAgIGFzIGJpbmFyeSBkYXRhIG1heSB0YWtlIGFkdmFudGFnZSBvZiBtb3IgZWZmaWNpZW50CisgICAgICogICAgICBkYXRhIHJlcHJlc2VudGF0aW9uLikKKyAgICAgKgorICAgICAqICAgICAgPHA+CisgICAgICogICAgICBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QgYmVsb25ncyB0byB0aGUgcGFyc2VyLAorICAgICAqICAgICAgYW5kIGl0cyBjb250ZW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgb25seSB1bnRpbAorICAgICAqICAgICAgdGhlIHtAbGluayAjbmV4dCgpfSBtZXRob2QgaXMgaW52b2tlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGUgcGFyc2VyIGlzIG5vdCBwb2ludGluZyBhdCBjaGFyYWN0ZXJzIGluZm9zZXQgaXRlbS4KKyAgICAgKgorICAgICAqIFRPRE86CisgICAgICogICAgICBmaXggdGhlIGRlcGVuZGVuY3kgdG8gSkFYQiBpbnRlcm5hbCBjbGFzcy4KKyAgICAgKi8KKyAgICBDaGFyU2VxdWVuY2UgZ2V0UENEQVRBKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBOYW1lc3BhY2VDb250ZXh0RXggZ2V0TmFtZXNwYWNlQ29udGV4dCgpOworCisgICAgLyoqCisgICAgICogV29ya3MgbGlrZSB7QGxpbmsgI2dldEVsZW1lbnRUZXh0KCl9IGJ1dCB0cmltcyB0aGUgbGVhZGluZworICAgICAqIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIHBhcnNlciBjYW4gb2Z0ZW4gZG8gdGhpcyBtb3JlIGVmZmljaWVudGx5IHRoYW4KKyAgICAgKiB7QGNvZGUgZ2V0RWxlbWVudFRleHQoKS50cmltKCl9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0RWxlbWVudFRleHQoKQorICAgICAqLworICAgIFN0cmluZyBnZXRFbGVtZW50VGV4dFRyaW0oKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L3N0YXhleC9YTUxTdHJlYW1Xcml0ZXJFeC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvb3JnL2p2bmV0L3N0YXhleC9YTUxTdHJlYW1Xcml0ZXJFeC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NWIzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9vcmcvanZuZXQvc3RheGV4L1hNTFN0cmVhbVdyaXRlckV4LmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguWE1MU3RyZWFtUmVhZGVyRXg7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9IGV4dGVuZGVkIHRvIHN1cHBvcnQgWE9QLgorICoKKyAqIDxwPgorICogU29tZSBpbmZvc2V0IHNlcmlhbGl6ZXIgKHN1Y2ggYXMgWE9QIGVuY29kZXIsIEZhc3RJbmZvc2V0KSB1c2VzIGEgZm9ybWF0CisgKiB0aGF0IGNhbiByZXByZXNlbnQgYmluYXJ5IGRhdGEgbW9yZSBlZmZpY2llbnRseSB0aGFuIGJhc2U2NCBlbmNvZGluZy4KKyAqIFN1Y2ggaW5mb3NldCBzZXJpYWxpemVyIG1heSBjaG9vc2UgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCB0byBhbGxvdworICogdGhlIGNhbGxlciB0byBwYXNzIGluIGJpbmFyeSBkYXRhIG1vcmUgZWZmaWNpZW50bHkgd2l0aG91dCBmaXJzdCBjb252ZXJ0aW5nCisgKiBpdCB0byBiaW5hcnkgZGF0YS4KKyAqCisgKiA8cD4KKyAqIENhbGxlcnMgY2FwYWJsZSBvZiB1c2luZyB0aGlzIGludGVyZmFjZSBjYW4gc2VlIGlmIHRoZSBzZXJpYWxpemVyIHN1cHBvcnRzCisgKiBpdCBieSBzaW1wbHkgZG93bmNhc3Rpbmcge0BsaW5rIFhNTFN0cmVhbVdyaXRlcn0gdG8ge0BsaW5rIFhNTFN0cmVhbVdyaXRlckV4fS4KKyAqCisgKiA8aDI+VE9ETzwvaDI+CisgKiA8b2w+CisgKiA8bGk+CisgKiAgIEFkZCBtZXRob2RzIHRvIHdyaXRlIG90aGVyIHByaW1pdGl2ZSB0eXBlcywgc3VjaCBhcyBoZXggYW5kIGludGVnZXJzCisgKiAgIChhbmQgYXJyYXlzIG9mKS4KKyAqICAgQSB0ZXh0dWFsIGltcGxlbWVudGF0aW9uIHdvdWxkIHdyaXRlIGNoYXJhY3RlcnMgaW4gYWNjb3JkYW5jZQorICogICB0byB0aGUgY2Fub25pY2FsIGxleGljYWwgZGVmaW5pdGlvbnMgc3BlY2lmaWVkIGluIFczQyBYTUwgU2NoZW1hOiBkYXRhdHlwZXMuCisgKiAgIEEgTVRPTSBpbXBsZW1lbnRhdGlvbiB3b3VsZCB3cml0ZSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGNhc2Ugd2hlcmUgb2N0ZXRzCisgKiAgIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGJhc2U2NCBlbmNvZGVkIHdoZW4gdXNpbmcgdGhlIHRleHR1YWwgaW1wbGVtZW50YXRpb24uCisgKiAgIEEgRmFzdCBJbmZvc2V0IGltcGxlbWVudGF0aW9uIHdvdWxkIGVuY29kZWQgYmluYXJ5IGRhdGEgdGhlIHByaW1pdGl2ZSB0eXBlcyBpbgorICogICBiaW5hcnkgZm9ybS4KKyAqIDxsaT4KKyAqICAgQ29uc2lkZXIgcmVuYW1pbmcgd3JpdGVCaW5hcnkgdG8gd3JpdGVCeXRlc0FzQmFzZTY0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aAorICogICBpbmZvc2V0IGFic3RyYWN0aW9uLgorICogPGxpPgorICogICBBZGQgdGhlIGFiaWxpdHkgdG8gd3JpdGVTdGFydCBhbmQgd3JpdGVFbmQgb24gYXR0cmlidXRlcyBzbyB0aGF0IHRoZSBzYW1lCisgKiAgIG1ldGhvZHMgZm9yIHdyaXRpbmcgcHJpbWl0aXZlIHR5cGVzIChhbmQgY2hhcmFjdGVycywgd2hpY2ggd2lsbCByZXF1aXJlIG5ldyBtZXRob2RzKQorICogICBjYW4gYmUgdXNlZCBmb3Igd3JpdGluZyBhdHRyaWJ1dGUgdmFsdWVzIGFzIHdlbGwgYXMgZWxlbWVudCBjb250ZW50LgorICogPC9vbD4KKyAqCisgKiBAc2VlIFhNTFN0cmVhbVJlYWRlckV4CisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWE1MU3RyZWFtV3JpdGVyRXggZXh0ZW5kcyBYTUxTdHJlYW1Xcml0ZXIgeworCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGJpbmFyeSBkYXRhLgorICAgICAqCisgICAgICogPHA+CisgICAgICogQ29uY2VwdHVhbGx5IChpbmZvc2V0LXdpc2UpLCB0aGlzIHByb2R1Y2VzIHRoZSBiYXNlNjQtZW5jb2RlZCBiaW5hcnkgZGF0YSBvbiB0aGUKKyAgICAgKiBvdXRwdXQuIEJ1dCB0aGlzIGFsbG93cyBpbXBsZW1lbnRhdGlvbnMgbGlrZSBGYXN0SW5mb3NldCBvciBYT1AgdG8gZG8gdGhlIHNtYXJ0CisgICAgICogdGhpbmcuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdXNlIG9mIHRoaXMgbWV0aG9kIGhhcyBzb21lIHJlc3RyaWN0aW9uIHRvIHN1cHBvcnQgWE9QLiBOYW1lbHksIHRoaXMgbWV0aG9kCisgICAgICogbXVzdCBiZSBpbnZva2VkIGFzIGEgc29sZSBjb250ZW50IG9mIGFuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiAoZGF0YSxzdGFydCxsZW4pIHRyaXBsZXQgaWRlbnRpZmllcyB0aGUgYmluYXJ5IGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQorICAgICAqICAgICAgdGhpcyBtYW5kYXRvcnkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgYmluYXJ5IGRhdGEuCisgICAgICogICAgICBJZiB0aGUgTUlNRSB0eXBlIGlzbid0IGtub3duIGJ5IHRoZSBjYWxsZXIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iIGNhbgorICAgICAqICAgICAgYmUgYWx3YXlzIHVzZWQgdG8gaW5kaWNhdGUgIkkgZG9uJ3Qga25vdy4iIE5ldmVyIG51bGwuCisgICAgICovCisgICAgdm9pZCB3cml0ZUJpbmFyeShieXRlW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuLCBTdHJpbmcgY29udGVudFR5cGUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGJpbmFyeSBkYXRhLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd29ya3MgbGlrZSB0aGUge0BsaW5rICN3cml0ZUJpbmFyeShieXRlW10sIGludCwgaW50LCBTdHJpbmcpfSBtZXRob2QsCisgICAgICogZXhjZXB0IHRoYXQgaXQgdGFrZXMgdGhlIGJpbmFyeSBkYXRhIGluIHRoZSBmb3JtIG9mIHtAbGluayBEYXRhSGFuZGxlcn0sIHdoaWNoCisgICAgICogY29udGFpbnMgYSBNSU1FIHR5cGUgKHtAbGluayBEYXRhSGFuZGxlciNnZXRDb250ZW50VHlwZSgpfSBhcyB3ZWxsIGFzIHRoZSBwYXlsb2FkCisgICAgICoge0BsaW5rIERhdGFIYW5kbGVyI2dldElucHV0U3RyZWFtKCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgIGFsd2F5cyBub24tbnVsbC4KKyAgICAgKi8KKyAgICB2b2lkIHdyaXRlQmluYXJ5KERhdGFIYW5kbGVyIGRhdGEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGJpbmFyeSBkYXRhLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyB2ZXJzaW9uIG9mIHRoZSB3cml0ZUJpbmFyeSBtZXRob2QgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcHJvZHVjZQorICAgICAqIHRoZSBiaW5hcnkgZGF0YSBieSB3cml0aW5nIGl0IHRvIHtAbGluayBPdXRwdXRTdHJlYW19LgorICAgICAqCisgICAgICogPHA+CisgICAgICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIHdyaXRlIGFuZCBjbG9zZQorICAgICAqIGEgc3RyZWFtIGJlZm9yZSBpdCBpbnZva2VzIGFueSBvdGhlciBtZXRob2RzIG9uIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9LgorICAgICAqCisgICAgICogVE9ETzogZXhwZXJpbWVudGFsLiBhcHByZWNpYXRlIGZlZWRiYWNrCisgICAgICogQHBhcmFtIGNvbnRlbnRUeXBlCisgICAgICogICAgICBTZWUgdGhlIGNvbnRlbnQtdHlwZSBwYXJhbWV0ZXIgb2YKKyAgICAgKiAgICAgIHtAbGluayAjd3JpdGVCaW5hcnkoYnl0ZVtdLCBpbnQsIGludCwgU3RyaW5nKX0uIE11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgcmV0dXJuIGEgbm9uLW51bGwge0BsaW5rIE91dHB1dFN0cmVhbX0uCisgICAgICovCisgICAgT3V0cHV0U3RyZWFtIHdyaXRlQmluYXJ5KFN0cmluZyBjb250ZW50VHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBsaWtlIHtAbGluayAjd3JpdGVDaGFyYWN0ZXJzKFN0cmluZyl9IGJ1dCBoaWRlcworICAgICAqIGFjdHVhbCBkYXRhIGZvcm1hdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSB7QGxpbmsgQ2hhclNlcXVlbmNlfSB0aGF0IHJlcHJlc2VudHMgdGhlCisgICAgICogICAgICBjaGFyYWN0ZXIgaW5mb3NldCBpdGVtcyB0byBiZSB3cml0dGVuLgorICAgICAqCisgICAgICogICAgICA8cD4KKyAgICAgKiAgICAgIFRoZSB7QGxpbmsgQ2hhclNlcXVlbmNlfSBpcyBub3JtYWxseSBhIHtAbGluayBTdHJpbmd9LAorICAgICAqICAgICAgYnV0IGNhbiBiZSBhbnkgb3RoZXIge0BsaW5rIENoYXJTZXF1ZW5jZX0gaW1wbGVtZW50YXRpb24uCisgICAgICogICAgICBGb3IgYmluYXJ5IGRhdGEsIGhvd2V2ZXIsIHVzZSBvZiB7QGxpbmsgQmFzZTY0RGF0YX0gaXMKKyAgICAgKiAgICAgIHJlY29tbWVuZGVkIChzbyB0aGF0IHRoZSBjb25zdW1lciBpbnRlcmVzdGVkIGluIHNlZWluZyBpdAorICAgICAqICAgICAgYXMgYmluYXJ5IGRhdGEgbWF5IHRha2UgYWR2YW50YWdlIG9mIG1vciBlZmZpY2llbnQKKyAgICAgKiAgICAgIGRhdGEgcmVwcmVzZW50YXRpb24uKQorICAgICAqCisgICAgICogICAgICA8cD4KKyAgICAgKiAgICAgIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBiZWxvbmdzIHRvIHRoZSBwYXJzZXIsCisgICAgICogICAgICBhbmQgaXRzIGNvbnRlbnQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSBvbmx5IHVudGlsCisgICAgICogICAgICB0aGUge0BsaW5rICNuZXh0KCl9IG1ldGhvZCBpcyBpbnZva2VkLgorICAgICAqLworICAgIHZvaWQgd3JpdGVQQ0RBVEEoQ2hhclNlcXVlbmNlIGRhdGEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgTmFtZXNwYWNlQ29udGV4dEV4IGdldE5hbWVzcGFjZUNvbnRleHQoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0Fubm90YXRpb25zLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9Bbm5vdGF0aW9ucy5qYXZhCmluZGV4IDNlNmY0YjQuLmU2ZDE2NzAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0Fubm90YXRpb25zLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvQW5ub3RhdGlvbnMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uTG9jYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9CdWlsZEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvQnVpbGRFeGNlcHRpb24uamF2YQppbmRleCAzYjYyNDAwLi5lZThjYTNlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9CdWlsZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0J1aWxkRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0NvbW1lbnRMaXN0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9Db21tZW50TGlzdC5qYXZhCmluZGV4IDM5YzI4NzkuLmU3MTE2NzAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0NvbW1lbnRMaXN0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvQ29tbWVudExpc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uTG9jYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9EYXRhUGF0dGVybkJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0RhdGFQYXR0ZXJuQnVpbGRlci5qYXZhCmluZGV4IDY4MjZjMzIuLjUzYTczYzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0RhdGFQYXR0ZXJuQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0RhdGFQYXR0ZXJuQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5vbS5Mb2NhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0Rpdi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvRGl2LmphdmEKaW5kZXggNzU5YzMyNC4uM2YzMTI3ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvRGl2LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvRGl2LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tLkxvY2F0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvRWxlbWVudEFubm90YXRpb25CdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9FbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXIuamF2YQppbmRleCA5ZTUyZDQ4Li5lMGQzM2JkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9FbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9FbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uTG9jYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9HcmFtbWFyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9HcmFtbWFyLmphdmEKaW5kZXggYzY2NThkMC4uOWE0NWI3NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvR3JhbW1hci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0dyYW1tYXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uTG9jYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9HcmFtbWFyU2VjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvR3JhbW1hclNlY3Rpb24uamF2YQppbmRleCBjYWY3OGUwLi5lZjBhNDYxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9HcmFtbWFyU2VjdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0dyYW1tYXJTZWN0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tLkxvY2F0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvSW5jbHVkZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvSW5jbHVkZS5qYXZhCmluZGV4IDdhY2JjZTcuLmI2NDkwZGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL0luY2x1ZGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9JbmNsdWRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tLkxvY2F0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvSW5jbHVkZWRHcmFtbWFyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9JbmNsdWRlZEdyYW1tYXIuamF2YQppbmRleCBmN2ZmODc4Li5jNThkYmMxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9JbmNsdWRlZEdyYW1tYXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9JbmNsdWRlZEdyYW1tYXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uTG9jYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9OYW1lQ2xhc3NCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9OYW1lQ2xhc3NCdWlsZGVyLmphdmEKaW5kZXggOGEzNDJhMy4uZTAxOGI1YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvTmFtZUNsYXNzQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL05hbWVDbGFzc0J1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uTG9jYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9TY2hlbWFCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9TY2hlbWFCdWlsZGVyLmphdmEKaW5kZXggY2QyMGYwMy4uNzhkOWY2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvU2NoZW1hQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL1NjaGVtYUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uTG9jYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9TY29wZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L2J1aWxkZXIvU2NvcGUuamF2YQppbmRleCA1ZjIwOGJjLi5jOWNlMmM2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvYnVpbGRlci9TY29wZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9idWlsZGVyL1Njb3BlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tLkxvY2F0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L29tL0xvY2F0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vTG9jYXRpb24uamF2YQppbmRleCBhMDc4ZmJhLi4xNGEzYWM1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vTG9jYXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vTG9jYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tOwogCiBwdWJsaWMgaW50ZXJmYWNlIExvY2F0aW9uIHsgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L29tL1BhcnNlZEVsZW1lbnRBbm5vdGF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vUGFyc2VkRWxlbWVudEFubm90YXRpb24uamF2YQppbmRleCBjZWIyMmQ4Li5jOWNmNGZiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vUGFyc2VkRWxlbWVudEFubm90YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vUGFyc2VkRWxlbWVudEFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tOwogCiBwdWJsaWMgaW50ZXJmYWNlIFBhcnNlZEVsZW1lbnRBbm5vdGF0aW9uIHsgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L29tL1BhcnNlZE5hbWVDbGFzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L29tL1BhcnNlZE5hbWVDbGFzcy5qYXZhCmluZGV4IGU5ZGE5YzQuLjU3ZjVmM2MgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC9vbS9QYXJzZWROYW1lQ2xhc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vUGFyc2VkTmFtZUNsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5vbTsKIAogcHVibGljIGludGVyZmFjZSBQYXJzZWROYW1lQ2xhc3MgeyB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vUGFyc2VkUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L29tL1BhcnNlZFBhdHRlcm4uamF2YQppbmRleCBkM2ExZmY5Li4xNWZkOWQ1ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L29tL1BhcnNlZFBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3Qvb20vUGFyc2VkUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub207CiAKIHB1YmxpYyBpbnRlcmZhY2UgUGFyc2VkUGF0dGVybiB7IH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC91dGlsL0NoZWNraW5nU2NoZW1hQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L3V0aWwvQ2hlY2tpbmdTY2hlbWFCdWlsZGVyLmphdmEKaW5kZXggZmYyYTk3Ny4uOWRmY2Q0OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L3V0aWwvQ2hlY2tpbmdTY2hlbWFCdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L3V0aWwvQ2hlY2tpbmdTY2hlbWFCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC51dGlsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQnVpbGRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvdXRpbC9Mb2NhdG9ySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L3V0aWwvTG9jYXRvckltcGwuamF2YQppbmRleCBlODVlOTZjLi43OWVlMjVkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvdXRpbC9Mb2NhdG9ySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC91dGlsL0xvY2F0b3JJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC51dGlsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tLkxvY2F0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L3V0aWwvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYXN0L3V0aWwvcGFja2FnZS5odG1sCmluZGV4IDJlOTE2NjQuLjMwYTM2MzMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2FzdC91dGlsL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9hc3QvdXRpbC9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGFzdC5idWlsZGVyL2FzdC5vbSBwYWNrYWdlcy4KIAogVGhvc2UgY2xhc3NlcyBhcmUgc29sZWx5IGludGVuZGVkIHRvIG1ha2UgdGhlIEFTVCBpbXBsZW1lbnRhdGlvbiBlYXNpZXIuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQWZ0ZXJQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQWZ0ZXJQYXR0ZXJuLmphdmEKaW5kZXggMDM0ZWJlZi4uMGVkYTY0YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0FmdGVyUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9BZnRlclBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LnZpc2l0b3IuUGF0dGVybkZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0FscGhhYmV0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQWxwaGFiZXQuamF2YQppbmRleCBlOTNiZDg1Li5kMDcxY2MwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQWxwaGFiZXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQWxwaGFiZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ubmMuQ2hvaWNlTmFtZUNsYXNzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0F0dHJpYnV0ZVBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9BdHRyaWJ1dGVQYXR0ZXJuLmphdmEKaW5kZXggYmNlMmFhZC4uNDhmOTY1NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0F0dHJpYnV0ZVBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQXR0cmlidXRlUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnk7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnkudmlzaXRvci5QYXR0ZXJuRnVuY3Rpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQmluYXJ5UGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0JpbmFyeVBhdHRlcm4uamF2YQppbmRleCBiMWNhOGM5Li45OTg4OGY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQmluYXJ5UGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9CaW5hcnlQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeTsKIAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9DaG9pY2VQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvQ2hvaWNlUGF0dGVybi5qYXZhCmluZGV4IDE0Y2JlYTcuLmYyNjA2NDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9DaG9pY2VQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0Nob2ljZVBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LnZpc2l0b3IuUGF0dGVybkZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0RhdGFFeGNlcHRQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRGF0YUV4Y2VwdFBhdHRlcm4uamF2YQppbmRleCA3ZTNjZGQ0Li5mOTUxNzIwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRGF0YUV4Y2VwdFBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRGF0YUV4Y2VwdFBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LnZpc2l0b3IuUGF0dGVybkZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0RhdGFQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRGF0YVBhdHRlcm4uamF2YQppbmRleCAyYzQ1NzNjLi4zMDkxZjRjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRGF0YVBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRGF0YVBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LnZpc2l0b3IuUGF0dGVybkZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0R1cGxpY2F0ZUF0dHJpYnV0ZURldGVjdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRHVwbGljYXRlQXR0cmlidXRlRGV0ZWN0b3IuamF2YQppbmRleCBhYTlkOGI1Li42MWIxMjkzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRHVwbGljYXRlQXR0cmlidXRlRGV0ZWN0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRHVwbGljYXRlQXR0cmlidXRlRGV0ZWN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9FbGVtZW50UGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0VsZW1lbnRQYXR0ZXJuLmphdmEKaW5kZXggNTliZjBiYS4uZWU1Njk0ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0VsZW1lbnRQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0VsZW1lbnRQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeS52aXNpdG9yLlBhdHRlcm5GdW5jdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9FbXB0eVBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9FbXB0eVBhdHRlcm4uamF2YQppbmRleCAzYTZkYjdlLi5kMDk4MzRkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRW1wdHlQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0VtcHR5UGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnk7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnkudmlzaXRvci5QYXR0ZXJuRnVuY3Rpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRXJyb3JQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvRXJyb3JQYXR0ZXJuLmphdmEKaW5kZXggMmZhZDk0My4uMGZiOTUzMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0Vycm9yUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9FcnJvclBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LnZpc2l0b3IuUGF0dGVybkZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0dyb3VwUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L0dyb3VwUGF0dGVybi5qYXZhCmluZGV4IDg2YmQ5NWIuLjIzMDYwMDggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9Hcm91cFBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvR3JvdXBQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeS52aXNpdG9yLio7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvSW50ZXJsZWF2ZVBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9JbnRlcmxlYXZlUGF0dGVybi5qYXZhCmluZGV4IDA2OGNhMjMuLmM1MmY0ZjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9JbnRlcmxlYXZlUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9JbnRlcmxlYXZlUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnk7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnkudmlzaXRvci5QYXR0ZXJuRnVuY3Rpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvTGlzdFBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9MaXN0UGF0dGVybi5qYXZhCmluZGV4IGM4OThkZDEuLjhkYTJjMDMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9MaXN0UGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9MaXN0UGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnk7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnkudmlzaXRvci5QYXR0ZXJuRnVuY3Rpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvTWVzc2FnZXMucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9NZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IDBiNzFlNjQuLjVjYzViMDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiAjIFByb3BlcnRpZXMgZmlsZSBzcGVjaWZ5aW5nIG1lc3NhZ2VzCiBpbGxlZ2FsX2hyZWZfYXR0cmlidXRlPWlsbGVnYWwgXCJocmVmXCIgYXR0cmlidXRlCiBuc19hdHRyaWJ1dGVfaWdub3JlZD1cIm5zXCIgYXR0cmlidXRlIGlnbm9yZWQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9Ob3RBbGxvd2VkUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L05vdEFsbG93ZWRQYXR0ZXJuLmphdmEKaW5kZXggY2NiOTdjMC4uZTc4MDliMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L05vdEFsbG93ZWRQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L05vdEFsbG93ZWRQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeS52aXNpdG9yLlBhdHRlcm5GdW5jdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9PbmVPck1vcmVQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvT25lT3JNb3JlUGF0dGVybi5qYXZhCmluZGV4IDhjOWYxYmQuLmQyZTkzM2YgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9PbmVPck1vcmVQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L09uZU9yTW9yZVBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LnZpc2l0b3IuUGF0dGVybkZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1BhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9QYXR0ZXJuLmphdmEKaW5kZXggNmYwNGY0My4uNDg5ZTkyYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1BhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnk7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uUGFyc2VkUGF0dGVybjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9QYXR0ZXJuQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1BhdHRlcm5CdWlsZGVyLmphdmEKaW5kZXggNDA4NmQ3Mi4uYWU1YjliMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1BhdHRlcm5CdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1BhdHRlcm5CdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeTsKIAogcHVibGljIGNsYXNzIFBhdHRlcm5CdWlsZGVyIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9QYXR0ZXJuSW50ZXJuZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9QYXR0ZXJuSW50ZXJuZXIuamF2YQppbmRleCA1YWU4ZDFlLi4wYjdiYzI1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvUGF0dGVybkludGVybmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1BhdHRlcm5JbnRlcm5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnk7CiAKIGZpbmFsIGNsYXNzIFBhdHRlcm5JbnRlcm5lciB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvUmVmUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1JlZlBhdHRlcm4uamF2YQppbmRleCA0ZTAyMjA4Li45MmE3OGRlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvUmVmUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9SZWZQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeS52aXNpdG9yLlBhdHRlcm5GdW5jdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9SZXN0cmljdGlvblZpb2xhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1Jlc3RyaWN0aW9uVmlvbGF0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggYTlkZTYyMS4uZDAzOTM2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1Jlc3RyaWN0aW9uVmlvbGF0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1Jlc3RyaWN0aW9uVmlvbGF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeTsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvU2NoZW1hQnVpbGRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9TY2hlbWFCdWlsZGVySW1wbC5qYXZhCmluZGV4IDc1NTQ2YjguLmNkNzg5ZmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9TY2hlbWFCdWlsZGVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9TY2hlbWFCdWlsZGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnk7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CkBAIC00OCw2ICs0Nyw3IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tLlBhcnNlZFBhdHRlcm47CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LnV0aWwuTG9jYXRvckltcGw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZHQuYnVpbHRpbi5CdWlsdGluRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kdC5DYXNjYWRpbmdEYXRhdHlwZUxpYnJhcnlGYWN0b3J5OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLm5jLk5hbWVDbGFzczsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5uYy5OYW1lQ2xhc3NCdWlsZGVySW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS5Db250ZXh0OwpAQCAtMTE3LDcgKzExNywxMCBAQAogICAgKiAgICAgICAgRXJyb3IgaGFuZGxlciB0byByZWNlaXZlIGVycm9ycyB3aGlsZSBidWlsZGluZyB0aGUgc2NoZW1hLgogICAgKi8KICAgcHVibGljIFNjaGVtYUJ1aWxkZXJJbXBsKEVycm9ySGFuZGxlciBlaCkgewotICAgICAgdGhpcyhlaCxuZXcgQnVpbHRpbkRhdGF0eXBlTGlicmFyeUZhY3RvcnkobmV3IERhdGF0eXBlTGlicmFyeUxvYWRlcigpKSxuZXcgU2NoZW1hUGF0dGVybkJ1aWxkZXIoKSk7CisgICAgICB0aGlzKGVoLAorICAgICAgICAgIG5ldyBDYXNjYWRpbmdEYXRhdHlwZUxpYnJhcnlGYWN0b3J5KG5ldyBEYXRhdHlwZUxpYnJhcnlMb2FkZXIoKSwKKyAgICAgICAgICAgIG5ldyBCdWlsdGluRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeShuZXcgRGF0YXR5cGVMaWJyYXJ5TG9hZGVyKCkpKSwKKyAgICAgICAgICBuZXcgU2NoZW1hUGF0dGVybkJ1aWxkZXIoKSk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9TY2hlbWFQYXR0ZXJuQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1NjaGVtYVBhdHRlcm5CdWlsZGVyLmphdmEKaW5kZXggOTE5ZmEyNy4uYjg0OTYzMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1NjaGVtYVBhdHRlcm5CdWlsZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1NjaGVtYVBhdHRlcm5CdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLm5jLk5hbWVDbGFzczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9TdHJpbmdQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvU3RyaW5nUGF0dGVybi5qYXZhCmluZGV4IDA5ZDhkYTEuLjJkMzhlNWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9TdHJpbmdQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1N0cmluZ1BhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBhYnN0cmFjdCBjbGFzcyBTdHJpbmdQYXR0ZXJuIGV4dGVuZHMgUGF0dGVybiB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvVGV4dFBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9UZXh0UGF0dGVybi5qYXZhCmluZGV4IDZiMTU0NjMuLjAzZTllZGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9UZXh0UGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9UZXh0UGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnk7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnkudmlzaXRvci5QYXR0ZXJuRnVuY3Rpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvVmFsdWVQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvVmFsdWVQYXR0ZXJuLmphdmEKaW5kZXggMThlNGM1OS4uZTNlODI5OCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L1ZhbHVlUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9WYWx1ZVBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LnZpc2l0b3IuUGF0dGVybkZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS9wYWNrYWdlLmh0bWwKaW5kZXggYjkyNDkyNi4uZWI2ZTIwNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPgogICA8Ym9keT4KICAgICBNaW5pbWFsIGJpbmFyaXplZCBwYXR0ZXJuIG9iamVjdCBtb2RlbCAob25lIGV4YW1wbGUgb2YgPHR0PmFzdC5vbTwvdHQ+IGltcGxlbWVudGF0aW9uKS4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS92aXNpdG9yL0NoaWxkRWxlbWVudEZpbmRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L3Zpc2l0b3IvQ2hpbGRFbGVtZW50RmluZGVyLmphdmEKaW5kZXggNGE0MDc0MC4uZWM2NWRhMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L3Zpc2l0b3IvQ2hpbGRFbGVtZW50RmluZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L3Zpc2l0b3IvQ2hpbGRFbGVtZW50RmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeS52aXNpdG9yOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LlBhdHRlcm47CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvdmlzaXRvci9QYXR0ZXJuRnVuY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS92aXNpdG9yL1BhdHRlcm5GdW5jdGlvbi5qYXZhCmluZGV4IGVmN2JlZjkuLmNkNWQ2ODggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS92aXNpdG9yL1BhdHRlcm5GdW5jdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS92aXNpdG9yL1BhdHRlcm5GdW5jdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnkudmlzaXRvcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeS5BZnRlclBhdHRlcm47CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvdmlzaXRvci9QYXR0ZXJuVmlzaXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L3Zpc2l0b3IvUGF0dGVyblZpc2l0b3IuamF2YQppbmRleCBhZGFhYjYwLi43OGI1Y2Y5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvdmlzaXRvci9QYXR0ZXJuVmlzaXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS92aXNpdG9yL1BhdHRlcm5WaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmJpbmFyeS52aXNpdG9yOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LlBhdHRlcm47CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvdmlzaXRvci9QYXR0ZXJuV2Fsa2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9iaW5hcnkvdmlzaXRvci9QYXR0ZXJuV2Fsa2VyLmphdmEKaW5kZXggZmE1MjIwOS4uZTJiOTllZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vYmluYXJ5L3Zpc2l0b3IvUGF0dGVybldhbGtlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2JpbmFyeS92aXNpdG9yL1BhdHRlcm5XYWxrZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYmluYXJ5LnZpc2l0b3I7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5iaW5hcnkuUGF0dGVybjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0Fubm90YXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0Fubm90YXRpb24uamF2YQppbmRleCAzODFlNmIwLi5mOTZjYWY2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9Bbm5vdGF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyLkFubm90YXRpb25zOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvQ29tbWVudExpc3RJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9Db21tZW50TGlzdEltcGwuamF2YQppbmRleCA4NDNhNTkyLi45NTJhZTYxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9Db21tZW50TGlzdEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9Db21tZW50TGlzdEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5Db21tZW50TGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RBbm5vdGF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EQW5ub3RhdGlvbi5qYXZhCmluZGV4IGI0ZDQ2MDkuLmQ1NjVkZmUwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RBdHRyaWJ1dGVQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EQXR0cmlidXRlUGF0dGVybi5qYXZhCmluZGV4IGViMDhhZWQuLjJkMjVkNGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RBdHRyaWJ1dGVQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvREF0dHJpYnV0ZVBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5uYy5OYW1lQ2xhc3M7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EQ2hvaWNlUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRENob2ljZVBhdHRlcm4uamF2YQppbmRleCA4NjNmZWQwLi44MjI1YzRkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EQ2hvaWNlUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RDaG9pY2VQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RDb250YWluZXJQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EQ29udGFpbmVyUGF0dGVybi5qYXZhCmluZGV4IDVlMjlhNWYuLjZhN2NhZDMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RDb250YWluZXJQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRENvbnRhaW5lclBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ERGF0YVBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0REYXRhUGF0dGVybi5qYXZhCmluZGV4IDM4YWE4NjguLmM0NzYzNDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0REYXRhUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0REYXRhUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5vbS5Mb2NhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0REZWZpbmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0REZWZpbmUuamF2YQppbmRleCA4NDAxZjE4Li40OTI5YTEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ERGVmaW5lLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRERlZmluZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ERWxlbWVudFBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RFbGVtZW50UGF0dGVybi5qYXZhCmluZGV4IGMwYjBiN2QuLjI2ZThhZDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RFbGVtZW50UGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RFbGVtZW50UGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLm5jLk5hbWVDbGFzczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RFbXB0eVBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RFbXB0eVBhdHRlcm4uamF2YQppbmRleCAzNjIyNmEwLi5hZDY4OTA2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ERW1wdHlQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvREVtcHR5UGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ER3JhbW1hclBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RHcmFtbWFyUGF0dGVybi5qYXZhCmluZGV4IDc2OTBhNzcuLmU0NTkxNmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RHcmFtbWFyUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RHcmFtbWFyUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvREdyb3VwUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvREdyb3VwUGF0dGVybi5qYXZhCmluZGV4IDQwM2I2Y2YuLmIxY2Y0ODYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RHcm91cFBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ER3JvdXBQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RJbnRlcmxlYXZlUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvREludGVybGVhdmVQYXR0ZXJuLmphdmEKaW5kZXggZDBiMjIwMS4uNjU1OWMyOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvREludGVybGVhdmVQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvREludGVybGVhdmVQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RMaXN0UGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRExpc3RQYXR0ZXJuLmphdmEKaW5kZXggNzY1NWQ2Ni4uMGE5YWQ0ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRExpc3RQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRExpc3RQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RNaXhlZFBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RNaXhlZFBhdHRlcm4uamF2YQppbmRleCA4YjRkZTg4Li43MjJkZTY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ETWl4ZWRQYXR0ZXJuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRE1peGVkUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ETm90QWxsb3dlZFBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0ROb3RBbGxvd2VkUGF0dGVybi5qYXZhCmluZGV4IGZhM2FhNjkuLjk2YTYyYzAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0ROb3RBbGxvd2VkUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0ROb3RBbGxvd2VkUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ET01QcmludGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ET01QcmludGVyLmphdmEKaW5kZXggZDY1ZDZmZS4uZDZhMzAzMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRE9NUHJpbnRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RPTVByaW50ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIGltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRE9uZU9yTW9yZVBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RPbmVPck1vcmVQYXR0ZXJuLmphdmEKaW5kZXggYzhhNzdjOC4uMWE1NmRjMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRE9uZU9yTW9yZVBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ET25lT3JNb3JlUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ET3B0aW9uYWxQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9ET3B0aW9uYWxQYXR0ZXJuLmphdmEKaW5kZXggMzk1NmYxOS4uYTI3ZDE5ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRE9wdGlvbmFsUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RPcHRpb25hbFBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RQYXR0ZXJuLmphdmEKaW5kZXggMTE4ZDE0OC4uMmExMjBiMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5vbS5QYXJzZWRQYXR0ZXJuOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFBhdHRlcm5WaXNpdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EUGF0dGVyblZpc2l0b3IuamF2YQppbmRleCBkODc5Mjk4Li4xNTg3MGY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EUGF0dGVyblZpc2l0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EUGF0dGVyblZpc2l0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFBhdHRlcm5XYWxrZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RQYXR0ZXJuV2Fsa2VyLmphdmEKaW5kZXggM2NhN2ZiNi4uYmIxZDlkMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFBhdHRlcm5XYWxrZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EUGF0dGVybldhbGtlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EUmVmUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFJlZlBhdHRlcm4uamF2YQppbmRleCA3ZWIwOWNmLi44YWVhMGRiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EUmVmUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RSZWZQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RTY2hlbWFCdWlsZGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFNjaGVtYUJ1aWxkZXJJbXBsLmphdmEKaW5kZXggZmY5ZmI5MC4uM2NjN2JlOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFNjaGVtYUJ1aWxkZXJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFNjaGVtYUJ1aWxkZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQnVpbGRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EVGV4dFBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RUZXh0UGF0dGVybi5qYXZhCmluZGV4IGRjZGM5YjYuLjYzMzBjYmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RUZXh0UGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RUZXh0UGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EVW5hcnlQYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EVW5hcnlQYXR0ZXJuLmphdmEKaW5kZXggZjgzZGViNy4uZTY0MWM0NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFVuYXJ5UGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RVbmFyeVBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFZhbHVlUGF0dGVybi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFZhbHVlUGF0dGVybi5qYXZhCmluZGV4IGVkN2JmZGYuLjMwNDQ0YWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RWYWx1ZVBhdHRlcm4uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EVmFsdWVQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuQ29udGV4dDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RYTUxQcmludGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EWE1MUHJpbnRlci5qYXZhCmluZGV4IGZiMTdjMjQuLjFkMGMxOWIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RYTUxQcmludGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFhNTFByaW50ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EWG1sVG9rZW5QYXR0ZXJuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EWG1sVG9rZW5QYXR0ZXJuLmphdmEKaW5kZXggNDFhNzU4NC4uMWUyZGVlNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRFhtbFRva2VuUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RYbWxUb2tlblBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5uYy5OYW1lQ2xhc3M7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EWmVyb09yTW9yZVBhdHRlcm4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RaZXJvT3JNb3JlUGF0dGVybi5qYXZhCmluZGV4IDc3ZmJmOGEuLjQwY2U3MGYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RaZXJvT3JNb3JlUGF0dGVybi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RaZXJvT3JNb3JlUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EYXRhUGF0dGVybkJ1aWxkZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9EYXRhUGF0dGVybkJ1aWxkZXJJbXBsLmphdmEKaW5kZXggODk2NTI5Zi4uZGE1MDMxYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRGF0YVBhdHRlcm5CdWlsZGVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0RhdGFQYXR0ZXJuQnVpbGRlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5Bbm5vdGF0aW9uczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0VsZW1lbnRBbm5vdGF0aW9uQnVpbGRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0VsZW1lbnRBbm5vdGF0aW9uQnVpbGRlckltcGwuamF2YQppbmRleCAyMjA0NmQzLi44ODRhYWU0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9FbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRWxlbWVudEFubm90YXRpb25CdWlsZGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyLkJ1aWxkRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRWxlbWVudFdyYXBwZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0VsZW1lbnRXcmFwcGVyLmphdmEKaW5kZXggZGMzY2YzMS4uNmZkODJiYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvRWxlbWVudFdyYXBwZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9FbGVtZW50V3JhcHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5vbS5QYXJzZWRFbGVtZW50QW5ub3RhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0dyYW1tYXJCdWlsZGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvR3JhbW1hckJ1aWxkZXJJbXBsLmphdmEKaW5kZXggMzFkOGE0Ny4uYzQxMjcwNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvR3JhbW1hckJ1aWxkZXJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvR3JhbW1hckJ1aWxkZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQW5ub3RhdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9JbmNsdWRlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvSW5jbHVkZUltcGwuamF2YQppbmRleCAzNGY0ZDFhLi5mM2QxMDAxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9JbmNsdWRlSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL0luY2x1ZGVJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmRpZ2VzdGVkOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQW5ub3RhdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9NYWluLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9NYWluLmphdmEKaW5kZXggZDVkYjk0Zi4uZGU5NTMxZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvTWFpbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL01haW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZGlnZXN0ZWQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5CdWlsZEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL1BhdHRlcm5QYXJzZWFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL1BhdHRlcm5QYXJzZWFibGUuamF2YQppbmRleCA2YmE0MWUzLi4yNzM1ZTdiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9QYXR0ZXJuUGFyc2VhYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvUGF0dGVyblBhcnNlYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kaWdlc3RlZDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyLkFubm90YXRpb25zOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZGlnZXN0ZWQvcGFja2FnZS5odG1sCmluZGV4IGU2Zjc1YjkuLmI2NjU3YjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2RpZ2VzdGVkL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kaWdlc3RlZC9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGh0bWw+PGJvZHk+CiBBbm90aGVyIFJFTEFYIE5HIEFTVCBpbXBsZW1lbnRhdGlvbiB0aGF0IG9wdGltaXplcyBhd2F5CiBpbmNsdXNpb25zIGFuZCBzb21lIG90aGVyIHN5bnRheCBzdWdhcnMsIHdoaWxlIHN0aWxsIHJldGFpbmluZwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvQ2FjaGVkRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvQ2FjaGVkRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeS5qYXZhCmluZGV4IDQxNWVmZmYuLmNjMThkNGYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L0NhY2hlZERhdGF0eXBlTGlicmFyeUZhY3RvcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9DYWNoZWREYXRhdHlwZUxpYnJhcnlGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmR0OwogCiBpbXBvcnQgb3JnLnJlbGF4bmcuZGF0YXR5cGUuRGF0YXR5cGVMaWJyYXJ5OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvQ2FzY2FkaW5nRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvQ2FzY2FkaW5nRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeS5qYXZhCmluZGV4IDZmNzlmYjMuLjZiMTU4ZTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L0Nhc2NhZGluZ0RhdGF0eXBlTGlicmFyeUZhY3RvcnkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9DYXNjYWRpbmdEYXRhdHlwZUxpYnJhcnlGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmR0OwogCiBpbXBvcnQgb3JnLnJlbGF4bmcuZGF0YXR5cGUuRGF0YXR5cGVMaWJyYXJ5OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvRG9Ob3RoaW5nRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L0RvTm90aGluZ0RhdGF0eXBlTGlicmFyeUZhY3RvcnlJbXBsLmphdmEKaW5kZXggYWY2MmI3My4uZjNmODliNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvRG9Ob3RoaW5nRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9Eb05vdGhpbmdEYXRhdHlwZUxpYnJhcnlGYWN0b3J5SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kdDsKIAogaW1wb3J0IG9yZy5yZWxheG5nLmRhdGF0eXBlLkRhdGF0eXBlTGlicmFyeUZhY3Rvcnk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9idWlsdGluL0J1aWx0aW5EYXRhdHlwZUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vQnVpbHRpbkRhdGF0eXBlQnVpbGRlci5qYXZhCmluZGV4IGFjNWQ4MjUuLmM1YzVjMmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vQnVpbHRpbkRhdGF0eXBlQnVpbGRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vQnVpbHRpbkRhdGF0eXBlQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kdC5idWlsdGluOwogCiBpbXBvcnQgb3JnLnJlbGF4bmcuZGF0YXR5cGUuRGF0YXR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9idWlsdGluL0J1aWx0aW5EYXRhdHlwZUxpYnJhcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vQnVpbHRpbkRhdGF0eXBlTGlicmFyeS5qYXZhCmluZGV4IDRjMmMyZmYuLjYyMmI3OTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vQnVpbHRpbkRhdGF0eXBlTGlicmFyeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vQnVpbHRpbkRhdGF0eXBlTGlicmFyeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5kdC5idWlsdGluOwogCiBpbXBvcnQgb3JnLnJlbGF4bmcuZGF0YXR5cGUuRGF0YXR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9idWlsdGluL0J1aWx0aW5EYXRhdHlwZUxpYnJhcnlGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9idWlsdGluL0J1aWx0aW5EYXRhdHlwZUxpYnJhcnlGYWN0b3J5LmphdmEKaW5kZXggYjdiMmY1Zi4uZTVlNDkxNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvYnVpbHRpbi9CdWlsdGluRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vQnVpbHRpbkRhdGF0eXBlTGlicmFyeUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uZHQuYnVpbHRpbjsKIAogaW1wb3J0IG9yZy5yZWxheG5nLmRhdGF0eXBlLkRhdGF0eXBlTGlicmFyeTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vQ29tcGF0aWJpbGl0eURhdGF0eXBlTGlicmFyeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvYnVpbHRpbi9Db21wYXRpYmlsaXR5RGF0YXR5cGVMaWJyYXJ5LmphdmEKaW5kZXggYWI2MjY4MS4uZWMwMzJmZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvYnVpbHRpbi9Db21wYXRpYmlsaXR5RGF0YXR5cGVMaWJyYXJ5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvYnVpbHRpbi9Db21wYXRpYmlsaXR5RGF0YXR5cGVMaWJyYXJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmR0LmJ1aWx0aW47CiAKIGltcG9ydCBvcmcucmVsYXhuZy5kYXRhdHlwZS5EYXRhdHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vTWVzc2FnZXMucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vTWVzc2FnZXMucHJvcGVydGllcwppbmRleCA0MmU3NGY0Li5iZThlMmU1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9idWlsdGluL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vZHQvYnVpbHRpbi9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiAjIFByb3BlcnRpZXMgZmlsZSBzcGVjaWZ5aW5nIG1lc3NhZ2VzCiBidWlsdGluX3BhcmFtPWJ1aWx0aW4gZGF0YXR5cGVzIGRvIG5vdCBoYXZlIGFueSBwYXJhbWV0ZXJzCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9kdC9idWlsdGluL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vcGFja2FnZS5odG1sCmluZGV4IGMxMmUyN2QuLjNlOGYyM2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL2R0L2J1aWx0aW4vcGFja2FnZS5odG1sCkBAIC0xICsxLDI1IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiBSRUxBWCBORyBidWlsdC1pbiBkYXRhdHlwZSBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL0FueU5hbWVDbGFzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvQW55TmFtZUNsYXNzLmphdmEKaW5kZXggZWI1NzUxYy4uM2E5NTcwMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvQW55TmFtZUNsYXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvQW55TmFtZUNsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLm5jOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL0FueU5hbWVFeGNlcHROYW1lQ2xhc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL0FueU5hbWVFeGNlcHROYW1lQ2xhc3MuamF2YQppbmRleCA2ZDc1YTI5Li5hYjcyN2VjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9BbnlOYW1lRXhjZXB0TmFtZUNsYXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvQW55TmFtZUV4Y2VwdE5hbWVDbGFzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5uYzsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9DaG9pY2VOYW1lQ2xhc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL0Nob2ljZU5hbWVDbGFzcy5qYXZhCmluZGV4IGNjYzBmNzMuLjY4Nzg4ZGYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL0Nob2ljZU5hbWVDbGFzcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL0Nob2ljZU5hbWVDbGFzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5uYzsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OYW1lQ2xhc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05hbWVDbGFzcy5qYXZhCmluZGV4IGYxNWQ0YTQuLjJmMzMxMTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05hbWVDbGFzcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05hbWVDbGFzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5uYzsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5vbS5QYXJzZWROYW1lQ2xhc3M7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OYW1lQ2xhc3NCdWlsZGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvTmFtZUNsYXNzQnVpbGRlckltcGwuamF2YQppbmRleCAyNzhjZjFhLi5kYWJjNDY5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OYW1lQ2xhc3NCdWlsZGVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05hbWVDbGFzc0J1aWxkZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLm5jOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQW5ub3RhdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OYW1lQ2xhc3NWaXNpdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OYW1lQ2xhc3NWaXNpdG9yLmphdmEKaW5kZXggYjUyN2ZlOS4uZTZhN2MzZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvTmFtZUNsYXNzVmlzaXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05hbWVDbGFzc1Zpc2l0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ubmM7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvTmFtZUNsYXNzV2Fsa2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OYW1lQ2xhc3NXYWxrZXIuamF2YQppbmRleCAyZmNhN2QyLi4yMWU1ZjEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OYW1lQ2xhc3NXYWxrZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OYW1lQ2xhc3NXYWxrZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ubmM7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvTnNOYW1lQ2xhc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05zTmFtZUNsYXNzLmphdmEKaW5kZXggOWE0NWMwZC4uNmNiYzZhMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvTnNOYW1lQ2xhc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9Oc05hbWVDbGFzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5uYzsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9Oc05hbWVFeGNlcHROYW1lQ2xhc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05zTmFtZUV4Y2VwdE5hbWVDbGFzcy5qYXZhCmluZGV4IGVhZDMwZGQuLmZlY2IwYzQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05zTmFtZUV4Y2VwdE5hbWVDbGFzcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL05zTmFtZUV4Y2VwdE5hbWVDbGFzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5uYzsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OdWxsTmFtZUNsYXNzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9OdWxsTmFtZUNsYXNzLmphdmEKaW5kZXggMTYxMjFkYi4uM2RkOTQ2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvTnVsbE5hbWVDbGFzcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL051bGxOYW1lQ2xhc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ubmM7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvT3ZlcmxhcERldGVjdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9PdmVybGFwRGV0ZWN0b3IuamF2YQppbmRleCBhYjQ1M2I5Li41ZmNkOGE5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9PdmVybGFwRGV0ZWN0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9PdmVybGFwRGV0ZWN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ubmM7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvU2ltcGxlTmFtZUNsYXNzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9TaW1wbGVOYW1lQ2xhc3MuamF2YQppbmRleCA4YjQ0MjliLi42ODgxZmViIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9TaW1wbGVOYW1lQ2xhc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9TaW1wbGVOYW1lQ2xhc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ubmM7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vbmMvcGFja2FnZS5odG1sCmluZGV4IDkwYTc5MmEuLmJkYTc1YTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL25jL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9uYy9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGh0bWw+CiAgIDxib2R5PgogICAgIERlZmF1bHQgTmFtZSBDbGFzcyBPYmplY3QgTW9kZWwgKG9uZSBleGFtcGxlIG9mIDx0dD5hc3Qub208L3R0PiBpbXBsZW1lbnRhdGlvbikuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9Db250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9Db250ZXh0LmphdmEKaW5kZXggMmU3NGU0My4uN2M4Njk3MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvQ29udGV4dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL0NvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9JbGxlZ2FsU2NoZW1hRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9JbGxlZ2FsU2NoZW1hRXhjZXB0aW9uLmphdmEKaW5kZXggYjgzMjIzYi4uY2U5N2RiZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvSWxsZWdhbFNjaGVtYUV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL0lsbGVnYWxTY2hlbWFFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2U7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvTWVzc2FnZXMucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggMDExYzJhNi4uMTQxODkzZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiAjIGNvbW1vbiBtZXNzYWdlcyBiZXR3ZWVuIFhNTCBhbmQgY29tcGFjdCBzeW50YXggcGFyc2VyCiBwYXJlbnRfcmVmX291dHNpZGVfZ3JhbW1hcj1wYXJlbnRSZWYgaXMgdXNlZCBvdXRzaWRlIGEgZ3JhbW1hcgogcmVmX291dHNpZGVfZ3JhbW1hcj1yZWYgaXMgdXNlZCBvdXRzaWRlIGEgZ3JhbW1hcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvUGFyc2VhYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9QYXJzZWFibGUuamF2YQppbmRleCBlZWY1ZWZiLi5lNjUwM2Q4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9QYXJzZWFibGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9QYXJzZWFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2U7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci4qOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Db21wYWN0UGFyc2VhYmxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0NvbXBhY3RQYXJzZWFibGUuamF2YQppbmRleCBiNjBkOWMwLi4zNWU2NjQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0NvbXBhY3RQYXJzZWFibGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0NvbXBhY3RQYXJzZWFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuY29tcGFjdDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0NvbXBhY3RTeW50YXguamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvQ29tcGFjdFN5bnRheC5qYXZhCmluZGV4IGNmMGQwNzcuLjU0MGExMTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvQ29tcGFjdFN5bnRheC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvQ29tcGFjdFN5bnRheC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBDb21wYWN0U3ludGF4LmphdmEgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuY29tcGFjdDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Db21wYWN0U3ludGF4Q29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0NvbXBhY3RTeW50YXhDb25zdGFudHMuamF2YQppbmRleCAwODcyYzEzLi45Zjc1YTJhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0NvbXBhY3RTeW50YXhDb25zdGFudHMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0NvbXBhY3RTeW50YXhDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQ29tcGFjdFN5bnRheENvbnN0YW50cy5qYXZhICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmNvbXBhY3Q7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvQ29tcGFjdFN5bnRheFRva2VuTWFuYWdlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Db21wYWN0U3ludGF4VG9rZW5NYW5hZ2VyLmphdmEKaW5kZXggOTYzYjBjZC4uMzJkM2Q5NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Db21wYWN0U3ludGF4VG9rZW5NYW5hZ2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Db21wYWN0U3ludGF4VG9rZW5NYW5hZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIENvbXBhY3RTeW50YXhUb2tlbk1hbmFnZXIuamF2YSAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS5jb21wYWN0OwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9FT0ZFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvRU9GRXhjZXB0aW9uLmphdmEKaW5kZXggYjdjY2EwYS4uNTM3ZjU2NGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvRU9GRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9FT0ZFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuY29tcGFjdDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0VzY2FwZVN5bnRheEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Fc2NhcGVTeW50YXhFeGNlcHRpb24uamF2YQppbmRleCA1N2Q1MWJlLi42YmRmM2NkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0VzY2FwZVN5bnRheEV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvRXNjYXBlU3ludGF4RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmNvbXBhY3Q7CiAKIGNsYXNzIEVzY2FwZVN5bnRheEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9KYXZhQ2hhclN0cmVhbS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9KYXZhQ2hhclN0cmVhbS5qYXZhCmluZGV4IGJiMGEwODUuLjE1NDg0YTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvSmF2YUNoYXJTdHJlYW0uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L0phdmFDaGFyU3RyZWFtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEphdmFDaGFyU3RyZWFtLmphdmEgVmVyc2lvbiAzLjAgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuY29tcGFjdDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IDQ1Yzg5NDAuLjlmNTNkYTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L01lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsMyArMSwyOCBAQAorIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKIHN5bnRheF9lcnJvcj1zeW50YXggZXJyb3I6IHswfQogdW5kZWNsYXJlZF9wcmVmaXg9dW5kZWNsYXJlZCBwcmVmaXggXCJ7MH1cIgogeG1sbnNfcHJlZml4PXByZWZpeCBtdXN0IG5vdCBiZSBcInhtbG5zXCIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvUGFyc2VFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvUGFyc2VFeGNlcHRpb24uamF2YQppbmRleCA1ZTE5OGU4Li5hNDhmMGVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L1BhcnNlRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9QYXJzZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gMy4wICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmNvbXBhY3Q7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvVG9rZW4uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvVG9rZW4uamF2YQppbmRleCAzZTU2ZGFhLi5kM2QyM2Y4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L1Rva2VuLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Ub2tlbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbi5qYXZhIFZlcnNpb24gMy4wICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmNvbXBhY3Q7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvVG9rZW5NZ3JFcnJvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Ub2tlbk1nckVycm9yLmphdmEKaW5kZXggNmNiYTBkMi4uMWZmZTUzZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Ub2tlbk1nckVycm9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Ub2tlbk1nckVycm9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuTWdyRXJyb3IuamF2YSBWZXJzaW9uIDMuMCAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS5jb21wYWN0OwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9jb21wYWN0L1VDb2RlX1VDb2RlRVNDX0NoYXJTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvVUNvZGVfVUNvZGVFU0NfQ2hhclN0cmVhbS5qYXZhCmluZGV4IDg2YWMzZTkuLjIxMjlhMTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvVUNvZGVfVUNvZGVFU0NfQ2hhclN0cmVhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2NvbXBhY3QvVUNvZGVfVUNvZGVFU0NfQ2hhclN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBVQ29kZV9VQ29kZUVTQ19DaGFyU3RyZWFtLmphdmEgVmVyc2lvbiAwLjdwcmU2ICovCiAvKiBUaGUgcHJldmlvdXMgbGluZSBrZWVwcyBKYXZhQ0MgcXVpZXQuIEluIGZhY3QsIHRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGZpbGUKICAgIGhhcyBiZWVuIGVkaXRlZCB0byBmaXggc29tZSBidWdzLiAqLwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9Bbm5vdGF0aW9uc0hvc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvQW5ub3RhdGlvbnNIb3N0LmphdmEKaW5kZXggMGUyZTY0Ni4uNTRlNTY0NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9Bbm5vdGF0aW9uc0hvc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0Fubm90YXRpb25zSG9zdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS5ob3N0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQW5ub3RhdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0Jhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvQmFzZS5qYXZhCmluZGV4IGY0OGNkMmIuLjNmOGQ3ZTggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvQmFzZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvQmFzZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS5ob3N0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQW5ub3RhdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0NvbW1lbnRMaXN0SG9zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9Db21tZW50TGlzdEhvc3QuamF2YQppbmRleCA0YjQyNDQxLi4xMTQ5ZWVlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0NvbW1lbnRMaXN0SG9zdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvQ29tbWVudExpc3RIb3N0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmhvc3Q7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5CdWlsZEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvRGF0YVBhdHRlcm5CdWlsZGVySG9zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9EYXRhUGF0dGVybkJ1aWxkZXJIb3N0LmphdmEKaW5kZXggYzgwYjdiYS4uZmM1NTRlOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9EYXRhUGF0dGVybkJ1aWxkZXJIb3N0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9EYXRhUGF0dGVybkJ1aWxkZXJIb3N0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmhvc3Q7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5Bbm5vdGF0aW9uczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvRGl2SG9zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9EaXZIb3N0LmphdmEKaW5kZXggMTQ5M2JmYS4uNWI2NjllOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9EaXZIb3N0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9EaXZIb3N0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmhvc3Q7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5Bbm5vdGF0aW9uczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvRWxlbWVudEFubm90YXRpb25CdWlsZGVySG9zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9FbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXJIb3N0LmphdmEKaW5kZXggYmY4MWQ1Ny4uNjA4YjU3NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9FbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXJIb3N0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9FbGVtZW50QW5ub3RhdGlvbkJ1aWxkZXJIb3N0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmhvc3Q7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5CdWlsZEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvR3JhbW1hckhvc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvR3JhbW1hckhvc3QuamF2YQppbmRleCBhMzVhYjFkLi4yYTk5NmI5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0dyYW1tYXJIb3N0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9HcmFtbWFySG9zdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS5ob3N0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQW5ub3RhdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0dyYW1tYXJTZWN0aW9uSG9zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9HcmFtbWFyU2VjdGlvbkhvc3QuamF2YQppbmRleCA0OGVmN2RhLi40YWVmNTFkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0dyYW1tYXJTZWN0aW9uSG9zdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvR3JhbW1hclNlY3Rpb25Ib3N0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmhvc3Q7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5Bbm5vdGF0aW9uczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvSW5jbHVkZUhvc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvSW5jbHVkZUhvc3QuamF2YQppbmRleCAwMzg1ZWM3Li42OTU5YTE0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0luY2x1ZGVIb3N0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9JbmNsdWRlSG9zdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS5ob3N0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0LmJ1aWxkZXIuQW5ub3RhdGlvbnM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0xvY2F0aW9uSG9zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9Mb2NhdGlvbkhvc3QuamF2YQppbmRleCAzNjNlYzUwLi42YWExNjY0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L0xvY2F0aW9uSG9zdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvTG9jYXRpb25Ib3N0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmhvc3Q7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3Qub20uTG9jYXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L05hbWVDbGFzc0J1aWxkZXJIb3N0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L05hbWVDbGFzc0J1aWxkZXJIb3N0LmphdmEKaW5kZXggMDM5NTIwYy4uOGQxNWM4ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9OYW1lQ2xhc3NCdWlsZGVySG9zdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvTmFtZUNsYXNzQnVpbGRlckhvc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuaG9zdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyLkFubm90YXRpb25zOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9QYXJzZWRFbGVtZW50QW5ub3RhdGlvbkhvc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvUGFyc2VkRWxlbWVudEFubm90YXRpb25Ib3N0LmphdmEKaW5kZXggZDZmYzUzZS4uYWNjY2I2NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9QYXJzZWRFbGVtZW50QW5ub3RhdGlvbkhvc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L1BhcnNlZEVsZW1lbnRBbm5vdGF0aW9uSG9zdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS5ob3N0OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20uYXN0Lm9tLlBhcnNlZEVsZW1lbnRBbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9QYXJzZWROYW1lQ2xhc3NIb3N0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L1BhcnNlZE5hbWVDbGFzc0hvc3QuamF2YQppbmRleCBhNmExMWY4Li5kYzBjYWM5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L1BhcnNlZE5hbWVDbGFzc0hvc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L1BhcnNlZE5hbWVDbGFzc0hvc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuaG9zdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5vbS5QYXJzZWROYW1lQ2xhc3M7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L1BhcnNlZFBhdHRlcm5Ib3N0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L1BhcnNlZFBhdHRlcm5Ib3N0LmphdmEKaW5kZXggYzZjYzc4NS4uOGE5ZjdmOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9QYXJzZWRQYXR0ZXJuSG9zdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvUGFyc2VkUGF0dGVybkhvc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuaG9zdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5vbS5QYXJzZWRQYXR0ZXJuOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9TY2hlbWFCdWlsZGVySG9zdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9TY2hlbWFCdWlsZGVySG9zdC5qYXZhCmluZGV4IDEyNjBiNmMuLjY2MWJmYWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvU2NoZW1hQnVpbGRlckhvc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L1NjaGVtYUJ1aWxkZXJIb3N0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLmhvc3Q7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5hc3QuYnVpbGRlci5Bbm5vdGF0aW9uczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvU2NvcGVIb3N0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L1Njb3BlSG9zdC5qYXZhCmluZGV4IGM1YjEyZGEuLmFlYzIwYWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL2hvc3QvU2NvcGVIb3N0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9TY29wZUhvc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ucGFyc2UuaG9zdDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLmFzdC5idWlsZGVyLkFubm90YXRpb25zOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvaG9zdC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L3BhY2thZ2UuaHRtbAppbmRleCBjMzYzNWJlLi5kNjUxNzBmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS9ob3N0L3BhY2thZ2UuaHRtbApAQCAtMSwyICsxLDI2IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPHR0PmFzbS5idWlsZGVyPC90dD4gcGFja2FnZSB0aGF0IHVzZXMgdHdvCiBvdGhlciBidWlsZHMgc2ltdWx0YW5lb3VzbHkuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS94bWwvRHRkQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UveG1sL0R0ZENvbnRleHQuamF2YQppbmRleCBjYTE1Njc3Li4zMDBiMjI1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS94bWwvRHRkQ29udGV4dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL3htbC9EdGRDb250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLnhtbDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LkRUREhhbmRsZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS94bWwvTWVzc2FnZXMucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL3htbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IDVhYTRiMDIuLjlmYzA4ZjMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL3htbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL3htbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBub19jb21tZW50X3N1cHBvcnQ9U0FYIHBhcnNlciBcInswfVwiIGNhbm5vdCByZXBvcnQgY29tbWVudHMKIGFueV9uYW1lX2V4Y2VwdF9jb250YWluc19hbnlfbmFtZT1cImV4Y2VwdFwiIGluIFwiYW55TmFtZVwiIGNvbnRhaW5zIFwiYW55TmFtZVwiCiBhdHRyaWJ1dGVfbXVsdGlfcGF0dGVybj1cImF0dHJpYnV0ZVwiIHBhdHRlcm4gbXVzdCBjb250YWluIGF0IG1vc3Qgb25lIHBhdHRlcm4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL3htbC9TQVhQYXJzZWFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL3htbC9TQVhQYXJzZWFibGUuamF2YQppbmRleCBlMWMwZGM4Li41NmU5MjFlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS94bWwvU0FYUGFyc2VhYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UveG1sL1NBWFBhcnNlYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS5wYXJzZS54bWw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UveG1sL1NjaGVtYVBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UveG1sL1NjaGVtYVBhcnNlci5qYXZhCmluZGV4IGY3NTVhNWUuLjRkMDNmMjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3BhcnNlL3htbC9TY2hlbWFQYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS9wYXJzZS94bWwvU2NoZW1hUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnBhcnNlLnhtbDsKIAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3V0aWwvTG9jYWxpemVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS91dGlsL0xvY2FsaXplci5qYXZhCmluZGV4IDIyZWVhMGMuLmFmYzYwNmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3V0aWwvTG9jYWxpemVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vdXRpbC9Mb2NhbGl6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20udXRpbDsKIAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vdXRpbC9VcmkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3V0aWwvVXJpLmphdmEKaW5kZXggNzcyNGIzOC4uZmRkNWRiNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vdXRpbC9VcmkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS91dGlsL1VyaS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS51dGlsOwogCiBpbXBvcnQgamF2YS5uZXQuVVJMOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vdXRpbC9VdGYxNi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vdXRpbC9VdGYxNi5qYXZhCmluZGV4IGNhZWJiNzMuLjg1YzY2YWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3V0aWwvVXRmMTYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS91dGlsL1V0ZjE2LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnV0aWw7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVdGYxNiB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvc2F4L0Fic3RyYWN0TGV4aWNhbEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3htbC9zYXgvQWJzdHJhY3RMZXhpY2FsSGFuZGxlci5qYXZhCmluZGV4IDYwNWMxNDYuLjM2OWQxMDMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3htbC9zYXgvQWJzdHJhY3RMZXhpY2FsSGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3htbC9zYXgvQWJzdHJhY3RMZXhpY2FsSGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS54bWwuc2F4OwogCiBpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20veG1sL3NheC9KQVhQWE1MUmVhZGVyQ3JlYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20veG1sL3NheC9KQVhQWE1MUmVhZGVyQ3JlYXRvci5qYXZhCmluZGV4IDU4OTk4YTguLjY0YjVjZmMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3htbC9zYXgvSkFYUFhNTFJlYWRlckNyZWF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvc2F4L0pBWFBYTUxSZWFkZXJDcmVhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnhtbC5zYXg7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20veG1sL3NheC9YTUxSZWFkZXJDcmVhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvc2F4L1hNTFJlYWRlckNyZWF0b3IuamF2YQppbmRleCBkNzY0MWEwLi45OWE3OWZkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvc2F4L1hNTFJlYWRlckNyZWF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvc2F4L1hNTFJlYWRlckNyZWF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ueG1sLnNheDsKIAogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3htbC9zYXgvWG1sQmFzZUhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3htbC9zYXgvWG1sQmFzZUhhbmRsZXIuamF2YQppbmRleCBkMTEwNDRkLi5kODkyYzBkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvc2F4L1htbEJhc2VIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20veG1sL3NheC9YbWxCYXNlSGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5ybmdvbS54bWwuc2F4OwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20udXRpbC5Vcmk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvdXRpbC9FbmNvZGluZ01hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20veG1sL3V0aWwvRW5jb2RpbmdNYXAuamF2YQppbmRleCA0YTI1ZjAyLi44ODBhMjJkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvdXRpbC9FbmNvZGluZ01hcC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3htbC91dGlsL0VuY29kaW5nTWFwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnhtbC51dGlsOwogCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20veG1sL3V0aWwvTmFtaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvdXRpbC9OYW1pbmcuamF2YQppbmRleCBlMzMzMzYwLi5hYWRlOWMzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvdXRpbC9OYW1pbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvdXRpbC9OYW1pbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwucm5nb20ueG1sLnV0aWw7CiAKIHB1YmxpYyBjbGFzcyBOYW1pbmcgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20veG1sL3V0aWwvV2VsbEtub3duTmFtZXNwYWNlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20veG1sL3V0aWwvV2VsbEtub3duTmFtZXNwYWNlcy5qYXZhCmluZGV4IDJjNzAyMWMuLjUxMzMzOTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3JuZ29tL3htbC91dGlsL1dlbGxLbm93bk5hbWVzcGFjZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9ybmdvbS94bWwvdXRpbC9XZWxsS25vd25OYW1lc3BhY2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnJuZ29tLnhtbC51dGlsOwogCiBwdWJsaWMgY2xhc3MgV2VsbEtub3duTmFtZXNwYWNlcyB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL0Fic3RyYWN0Q3JlYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9BYnN0cmFjdENyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2NkNDRiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9BYnN0cmFjdENyZWF0b3IuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGNsYXNzZXMgdGhhdCBjcmVhdGVzIHtAbGluayBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyfQorICogYW5kIGZyb20gaW5mb3NldCBpbiBBUEktc3BlY2lmaWMgZm9ybS4KKyAqLworcHVibGljIGNsYXNzIEFic3RyYWN0Q3JlYXRvciBleHRlbmRzIEFic3RyYWN0Q3JlYXRvclByb2Nlc3NvciB7CisKKyAgICBwcm90ZWN0ZWQgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBfYnVmZmVyOworCisgICAgcHVibGljIHZvaWQgc2V0WE1MU3RyZWFtQnVmZmVyKE11dGFibGVYTUxTdHJlYW1CdWZmZXIgYnVmZmVyKSB7CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJidWZmZXIgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBzZXRCdWZmZXIoYnVmZmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBnZXRYTUxTdHJlYW1CdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBfYnVmZmVyOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlQnVmZmVyKCkgeworICAgICAgICBzZXRCdWZmZXIobmV3IE11dGFibGVYTUxTdHJlYW1CdWZmZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhIG5ldyB0cmVlIGlzIHN0b3JlZCBvbiB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluY3JlYXNlVHJlZUNvdW50KCkgeworICAgICAgICBfYnVmZmVyLnRyZWVDb3VudCsrOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEJ1ZmZlcihNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICBfYnVmZmVyID0gYnVmZmVyOworCisgICAgICAgIF9jdXJyZW50U3RydWN0dXJlRnJhZ21lbnQgPSBfYnVmZmVyLmdldFN0cnVjdHVyZSgpOworICAgICAgICBfc3RydWN0dXJlID0gX2N1cnJlbnRTdHJ1Y3R1cmVGcmFnbWVudC5nZXRBcnJheSgpOworICAgICAgICBfc3RydWN0dXJlUHRyID0gMDsKKworICAgICAgICBfY3VycmVudFN0cnVjdHVyZVN0cmluZ0ZyYWdtZW50ID0gX2J1ZmZlci5nZXRTdHJ1Y3R1cmVTdHJpbmdzKCk7CisgICAgICAgIF9zdHJ1Y3R1cmVTdHJpbmdzID0gX2N1cnJlbnRTdHJ1Y3R1cmVTdHJpbmdGcmFnbWVudC5nZXRBcnJheSgpOworICAgICAgICBfc3RydWN0dXJlU3RyaW5nc1B0ciA9IDA7CisKKyAgICAgICAgX2N1cnJlbnRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlckZyYWdtZW50ID0gX2J1ZmZlci5nZXRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcigpOworICAgICAgICBfY29udGVudENoYXJhY3RlcnNCdWZmZXIgPSBfY3VycmVudENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyRnJhZ21lbnQuZ2V0QXJyYXkoKTsKKyAgICAgICAgX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyUHRyID0gMDsKKworICAgICAgICBfY3VycmVudENvbnRlbnRPYmplY3RGcmFnbWVudCA9IF9idWZmZXIuZ2V0Q29udGVudE9iamVjdHMoKTsKKyAgICAgICAgX2NvbnRlbnRPYmplY3RzID0gX2N1cnJlbnRDb250ZW50T2JqZWN0RnJhZ21lbnQuZ2V0QXJyYXkoKTsKKyAgICAgICAgX2NvbnRlbnRPYmplY3RzUHRyID0gMDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRIYXNJbnRlcm5lZFN0cmluZ3MoYm9vbGVhbiBoYXNJbnRlcm5lZFN0cmluZ3MpIHsKKyAgICAgICAgX2J1ZmZlci5zZXRIYXNJbnRlcm5lZFN0cmluZ3MoaGFzSW50ZXJuZWRTdHJpbmdzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdG9yZVN0cnVjdHVyZShpbnQgYikgeworICAgICAgICBfc3RydWN0dXJlW19zdHJ1Y3R1cmVQdHIrK10gPSAoYnl0ZSliOworICAgICAgICBpZiAoX3N0cnVjdHVyZVB0ciA9PSBfc3RydWN0dXJlLmxlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplU3RydWN0dXJlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNpemVTdHJ1Y3R1cmUoKSB7CisgICAgICAgIF9zdHJ1Y3R1cmVQdHIgPSAwOworICAgICAgICBpZiAoX2N1cnJlbnRTdHJ1Y3R1cmVGcmFnbWVudC5nZXROZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgX2N1cnJlbnRTdHJ1Y3R1cmVGcmFnbWVudCA9IF9jdXJyZW50U3RydWN0dXJlRnJhZ21lbnQuZ2V0TmV4dCgpOworICAgICAgICAgICAgX3N0cnVjdHVyZSA9IF9jdXJyZW50U3RydWN0dXJlRnJhZ21lbnQuZ2V0QXJyYXkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9zdHJ1Y3R1cmUgPSBuZXcgYnl0ZVtfc3RydWN0dXJlLmxlbmd0aF07CisgICAgICAgICAgICBfY3VycmVudFN0cnVjdHVyZUZyYWdtZW50ID0gbmV3IEZyYWdtZW50ZWRBcnJheShfc3RydWN0dXJlLCBfY3VycmVudFN0cnVjdHVyZUZyYWdtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHN0b3JlU3RydWN0dXJlU3RyaW5nKFN0cmluZyBzKSB7CisgICAgICAgIF9zdHJ1Y3R1cmVTdHJpbmdzW19zdHJ1Y3R1cmVTdHJpbmdzUHRyKytdID0gczsKKyAgICAgICAgaWYgKF9zdHJ1Y3R1cmVTdHJpbmdzUHRyID09IF9zdHJ1Y3R1cmVTdHJpbmdzLmxlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplU3RydWN0dXJlU3RyaW5ncygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVzaXplU3RydWN0dXJlU3RyaW5ncygpIHsKKyAgICAgICAgX3N0cnVjdHVyZVN0cmluZ3NQdHIgPSAwOworICAgICAgICBpZiAoX2N1cnJlbnRTdHJ1Y3R1cmVTdHJpbmdGcmFnbWVudC5nZXROZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgX2N1cnJlbnRTdHJ1Y3R1cmVTdHJpbmdGcmFnbWVudCA9IF9jdXJyZW50U3RydWN0dXJlU3RyaW5nRnJhZ21lbnQuZ2V0TmV4dCgpOworICAgICAgICAgICAgX3N0cnVjdHVyZVN0cmluZ3MgPSBfY3VycmVudFN0cnVjdHVyZVN0cmluZ0ZyYWdtZW50LmdldEFycmF5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfc3RydWN0dXJlU3RyaW5ncyA9IG5ldyBTdHJpbmdbX3N0cnVjdHVyZVN0cmluZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgIF9jdXJyZW50U3RydWN0dXJlU3RyaW5nRnJhZ21lbnQgPSBuZXcgRnJhZ21lbnRlZEFycmF5KF9zdHJ1Y3R1cmVTdHJpbmdzLCBfY3VycmVudFN0cnVjdHVyZVN0cmluZ0ZyYWdtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHN0b3JlQ29udGVudFN0cmluZyhTdHJpbmcgcykgeworICAgICAgICBzdG9yZUNvbnRlbnRPYmplY3Qocyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3RvcmVDb250ZW50Q2hhcmFjdGVycyhpbnQgdHlwZSwgY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlclB0ciArIGxlbmd0aCA+PSBfY29udGVudENoYXJhY3RlcnNCdWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDUxMikgeworICAgICAgICAgICAgICAgIHN0b3JlU3RydWN0dXJlKHR5cGUgfCBDT05URU5UX1RZUEVfQ0hBUl9BUlJBWV9DT1BZKTsKKyAgICAgICAgICAgICAgICBzdG9yZUNvbnRlbnRDaGFyYWN0ZXJzQ29weShjaCwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzaXplQ29udGVudENoYXJhY3RlcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW5ndGggPCBDSEFSX0FSUkFZX0xFTkdUSF9TTUFMTF9TSVpFKSB7CisgICAgICAgICAgICBzdG9yZVN0cnVjdHVyZSh0eXBlIHwgQ0hBUl9BUlJBWV9MRU5HVEhfU01BTEwpOworICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmUobGVuZ3RoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2gsIHN0YXJ0LCBfY29udGVudENoYXJhY3RlcnNCdWZmZXIsIF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlclB0ciwgbGVuZ3RoKTsKKyAgICAgICAgICAgIF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlclB0ciArPSBsZW5ndGg7CisgICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoIDwgQ0hBUl9BUlJBWV9MRU5HVEhfTUVESVVNX1NJWkUpIHsKKyAgICAgICAgICAgIHN0b3JlU3RydWN0dXJlKHR5cGUgfCBDSEFSX0FSUkFZX0xFTkdUSF9NRURJVU0pOworICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmUobGVuZ3RoID4+IDgpOworICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmUobGVuZ3RoICYgMjU1KTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2gsIHN0YXJ0LCBfY29udGVudENoYXJhY3RlcnNCdWZmZXIsIF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlclB0ciwgbGVuZ3RoKTsKKyAgICAgICAgICAgIF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlclB0ciArPSBsZW5ndGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdG9yZVN0cnVjdHVyZSh0eXBlIHwgQ09OVEVOVF9UWVBFX0NIQVJfQVJSQVlfQ09QWSk7CisgICAgICAgICAgICBzdG9yZUNvbnRlbnRDaGFyYWN0ZXJzQ29weShjaCwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNpemVDb250ZW50Q2hhcmFjdGVycygpIHsKKyAgICAgICAgX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyUHRyID0gMDsKKyAgICAgICAgaWYgKF9jdXJyZW50Q29udGVudENoYXJhY3RlcnNCdWZmZXJGcmFnbWVudC5nZXROZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgX2N1cnJlbnRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlckZyYWdtZW50ID0gX2N1cnJlbnRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlckZyYWdtZW50LmdldE5leHQoKTsKKyAgICAgICAgICAgIF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciA9IF9jdXJyZW50Q29udGVudENoYXJhY3RlcnNCdWZmZXJGcmFnbWVudC5nZXRBcnJheSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyID0gbmV3IGNoYXJbX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyLmxlbmd0aF07CisgICAgICAgICAgICBfY3VycmVudENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyRnJhZ21lbnQgPSBuZXcgRnJhZ21lbnRlZEFycmF5KF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlckZyYWdtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHN0b3JlQ29udGVudENoYXJhY3RlcnNDb3B5KGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGNoYXJbXSBjb3B5T2ZDaCA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2gsIHN0YXJ0LCBjb3B5T2ZDaCwgMCwgbGVuZ3RoKTsKKyAgICAgICAgc3RvcmVDb250ZW50T2JqZWN0KGNvcHlPZkNoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHBlZWtBdENvbnRlbnRPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBfY29udGVudE9iamVjdHNbX2NvbnRlbnRPYmplY3RzUHRyXTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdG9yZUNvbnRlbnRPYmplY3QoT2JqZWN0IHMpIHsKKyAgICAgICAgX2NvbnRlbnRPYmplY3RzW19jb250ZW50T2JqZWN0c1B0cisrXSA9IHM7CisgICAgICAgIGlmIChfY29udGVudE9iamVjdHNQdHIgPT0gX2NvbnRlbnRPYmplY3RzLmxlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplQ29udGVudE9iamVjdHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlc2l6ZUNvbnRlbnRPYmplY3RzKCkgeworICAgICAgICBfY29udGVudE9iamVjdHNQdHIgPSAwOworICAgICAgICBpZiAoX2N1cnJlbnRDb250ZW50T2JqZWN0RnJhZ21lbnQuZ2V0TmV4dCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9jdXJyZW50Q29udGVudE9iamVjdEZyYWdtZW50ID0gX2N1cnJlbnRDb250ZW50T2JqZWN0RnJhZ21lbnQuZ2V0TmV4dCgpOworICAgICAgICAgICAgX2NvbnRlbnRPYmplY3RzID0gX2N1cnJlbnRDb250ZW50T2JqZWN0RnJhZ21lbnQuZ2V0QXJyYXkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9jb250ZW50T2JqZWN0cyA9IG5ldyBPYmplY3RbX2NvbnRlbnRPYmplY3RzLmxlbmd0aF07CisgICAgICAgICAgICBfY3VycmVudENvbnRlbnRPYmplY3RGcmFnbWVudCA9IG5ldyBGcmFnbWVudGVkQXJyYXkoX2NvbnRlbnRPYmplY3RzLCBfY3VycmVudENvbnRlbnRPYmplY3RGcmFnbWVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL0Fic3RyYWN0Q3JlYXRvclByb2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9BYnN0cmFjdENyZWF0b3JQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODI3NjY5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9BYnN0cmFjdENyZWF0b3JQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcmVhdG9yUHJvY2Vzc29yIHsKKyAgICAvKioKKyAgICAgKiBGbGFnIG9uIGEgVF9ET0NVTUVOVCB0byBpbmRpY2F0ZSBpZiBhIGZyYWdtZW50CisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NVTUVOVF9GUkFHTUVOVCAgICAgID0gMSA8PCAwOworCisgICAgLyoKKyAgICAgKiBGbGFncyBvbiBUX0VMRU1FTlQsIFRfQVRUUklCVVRFLCBUX05BTUVTUEFDRV9BVFRSSUJVVEUKKyAgICAgKiB0byBpbmRpY2F0ZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgcmVwcmVzZW50CisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUkVGSVggICAgICAgICAgICAgICAgID0gMSA8PCAwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZMQUdfVVJJICAgICAgICAgICAgICAgICAgICA9IDEgPDwgMTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGTEFHX1FVQUxJRklFRF9OQU1FICAgICAgICAgPSAxIDw8IDI7CisKKyAgICAvKgorICAgICAqIFR5cGVzIG9mIGNvbnRlbnQgZm9yIFRfVEVYVCBhbmQgVF9DT01NRU5UCisgICAgICogPHA+CisgICAgICogSGlnaGVzdCAyIGJpdHMgb2YgbG93ZXIgbmliYmxlIGFyZSB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9DSEFSX0FSUkFZICAgICAgICA9IDAgPDwgMjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfQ0hBUl9BUlJBWV9DT1BZICAgPSAxIDw8IDI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX1NUUklORyAgICAgICAgICAgID0gMiA8PCAyOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9PQkpFQ1QgICAgICAgICAgICA9IDMgPDwgMjsKKworICAgIC8qCisgICAgICogU2l6ZSBvZiB0aGUgbGVuZ3RoIG9mIGNoYXJhY3RlciBjb250ZW50IGZvciBDT05URU5UX1RZUEVfQ0hBUl9BUlJBWQorICAgICAqIDxwPgorICAgICAqIExhc3QgYml0IG9mIGxvd2VyIG5pYmJsZSBpcyB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENIQVJfQVJSQVlfTEVOR1RIX1NNQUxMICAgICAgICA9IDA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9BUlJBWV9MRU5HVEhfTUVESVVNICAgICAgID0gMTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDSEFSX0FSUkFZX0xFTkdUSF9TTUFMTF9TSVpFICAgPSAxIDw8IDg7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9BUlJBWV9MRU5HVEhfTUVESVVNX1NJWkUgID0gMSA8PCAxNjsKKworICAgIC8qCisgICAgICogVHlwZXMgb2YgdmFsdWUgZm9yIFRfQVRUUklCVVRFCisgICAgICogPHA+CisgICAgICogSGlnaGVzdCBiaXQgb2YgbG93ZXIgbmliYmxlIGlzIHVzZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9TVFJJTkcgICAgICAgICAgICAgID0gMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX09CSkVDVCAgICAgICAgICAgICAgPSAxIDw8IDM7CisKKyAgICAvKgorICAgICAqIE1hc2sgZm9yIHR5cGVzLgorICAgICAqIDxwPgorICAgICAqIEhpZ2hlc3QgbmliYmxlIGlzIHVzZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgICAgPSAweEYwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfRU5EICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICA9IDB4MTA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9FTEVNRU5UICAgICAgICAgICAgICAgICAgICAgPSAweDIwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgID0gMHgzMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX05BTUVTUEFDRV9BVFRSSUJVVEUgICAgICAgICA9IDB4NDA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9URVhUICAgICAgICAgICAgICAgICAgICAgICAgPSAweDUwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgID0gMHg2MDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04gICAgICA9IDB4NzA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9VTkVYUEFOREVEX0VOVElUWV9SRUZFUkVOQ0UgPSAweDgwOworCisgICAgLyoKKyAgICAgKiBDb21wb3NlZCB0eXBlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBPbmUgb2N0ZXQgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX0RPQ1VNRU5UX0ZSQUdNRU5UICAgICAgICAgICA9IFRfRE9DVU1FTlQgfCBGTEFHX0RPQ1VNRU5UX0ZSQUdNRU5UOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9FTEVNRU5UX1VfTE5fUU4gICAgICAgICAgICAgPSBUX0VMRU1FTlQgfCBGTEFHX1VSSSB8IEZMQUdfUVVBTElGSUVEX05BTUU7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9FTEVNRU5UX1BfVV9MTiAgICAgICAgICAgICAgPSBUX0VMRU1FTlQgfCBGTEFHX1BSRUZJWCB8IEZMQUdfVVJJOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfRUxFTUVOVF9VX0xOICAgICAgICAgICAgICAgID0gVF9FTEVNRU5UIHwgRkxBR19VUkk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9FTEVNRU5UX0xOICAgICAgICAgICAgICAgICAgPSBUX0VMRU1FTlQ7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX05BTUVTUEFDRV9BVFRSSUJVVEVfUCAgICAgICA9IFRfTkFNRVNQQUNFX0FUVFJJQlVURSB8IEZMQUdfUFJFRklYOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfTkFNRVNQQUNFX0FUVFJJQlVURV9QX1UgICAgID0gVF9OQU1FU1BBQ0VfQVRUUklCVVRFIHwgRkxBR19QUkVGSVggfCBGTEFHX1VSSTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX05BTUVTUEFDRV9BVFRSSUJVVEVfVSAgICAgICA9IFRfTkFNRVNQQUNFX0FUVFJJQlVURSB8IEZMQUdfVVJJOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9BVFRSSUJVVEVfVV9MTl9RTiAgICAgICAgICAgPSBUX0FUVFJJQlVURSB8IEZMQUdfVVJJIHwgRkxBR19RVUFMSUZJRURfTkFNRTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX0FUVFJJQlVURV9QX1VfTE4gICAgICAgICAgICA9IFRfQVRUUklCVVRFIHwgRkxBR19QUkVGSVggfCBGTEFHX1VSSTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX0FUVFJJQlVURV9VX0xOICAgICAgICAgICAgICA9IFRfQVRUUklCVVRFIHwgRkxBR19VUkk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9BVFRSSUJVVEVfTE4gICAgICAgICAgICAgICAgPSBUX0FUVFJJQlVURTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX0FUVFJJQlVURV9VX0xOX1FOX09CSkVDVCAgICA9IFRfQVRUUklCVVRFX1VfTE5fUU4gfCBWQUxVRV9UWVBFX09CSkVDVDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX0FUVFJJQlVURV9QX1VfTE5fT0JKRUNUICAgICA9IFRfQVRUUklCVVRFX1BfVV9MTiB8IFZBTFVFX1RZUEVfT0JKRUNUOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfQVRUUklCVVRFX1VfTE5fT0JKRUNUICAgICAgID0gVF9BVFRSSUJVVEVfVV9MTiB8IFZBTFVFX1RZUEVfT0JKRUNUOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfQVRUUklCVVRFX0xOX09CSkVDVCAgICAgICAgID0gVF9BVFRSSUJVVEVfTE4gfCBWQUxVRV9UWVBFX09CSkVDVDsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfVEVYVF9BU19DSEFSX0FSUkFZICAgICAgICAgID0gVF9URVhUOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfVEVYVF9BU19DSEFSX0FSUkFZX1NNQUxMICAgID0gVF9URVhUIHwgQ0hBUl9BUlJBWV9MRU5HVEhfU01BTEw7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9URVhUX0FTX0NIQVJfQVJSQVlfTUVESVVNICAgPSBUX1RFWFQgfCBDSEFSX0FSUkFZX0xFTkdUSF9NRURJVU07CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9URVhUX0FTX0NIQVJfQVJSQVlfQ09QWSAgICAgPSBUX1RFWFQgfCBDT05URU5UX1RZUEVfQ0hBUl9BUlJBWV9DT1BZOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfVEVYVF9BU19TVFJJTkcgICAgICAgICAgICAgID0gVF9URVhUIHwgQ09OVEVOVF9UWVBFX1NUUklORzsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX1RFWFRfQVNfT0JKRUNUICAgICAgICAgICAgICA9IFRfVEVYVCB8IENPTlRFTlRfVFlQRV9PQkpFQ1Q7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWSAgICAgICAgPSBUX0NPTU1FTlQ7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9DT01NRU5UX0FTX0NIQVJfQVJSQVlfU01BTEwgID0gVF9DT01NRU5UIHwgQ0hBUl9BUlJBWV9MRU5HVEhfU01BTEw7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9DT01NRU5UX0FTX0NIQVJfQVJSQVlfTUVESVVNID0gVF9DT01NRU5UIHwgQ0hBUl9BUlJBWV9MRU5HVEhfTUVESVVNOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfQ09NTUVOVF9BU19DSEFSX0FSUkFZX0NPUFkgICA9IFRfQ09NTUVOVCB8IENPTlRFTlRfVFlQRV9DSEFSX0FSUkFZX0NPUFk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVF9DT01NRU5UX0FTX1NUUklORyAgICAgICAgICAgID0gVF9DT01NRU5UIHwgQ09OVEVOVF9UWVBFX1NUUklORzsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRfRU5EX09GX0JVRkZFUiAgICAgICAgICAgICAgID0gLTE7CisKKyAgICBwcm90ZWN0ZWQgRnJhZ21lbnRlZEFycmF5PGJ5dGVbXT4gX2N1cnJlbnRTdHJ1Y3R1cmVGcmFnbWVudDsKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIF9zdHJ1Y3R1cmU7CisgICAgcHJvdGVjdGVkIGludCBfc3RydWN0dXJlUHRyOworCisgICAgcHJvdGVjdGVkIEZyYWdtZW50ZWRBcnJheTxTdHJpbmdbXT4gX2N1cnJlbnRTdHJ1Y3R1cmVTdHJpbmdGcmFnbWVudDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gX3N0cnVjdHVyZVN0cmluZ3M7CisgICAgcHJvdGVjdGVkIGludCBfc3RydWN0dXJlU3RyaW5nc1B0cjsKKworICAgIHByb3RlY3RlZCBGcmFnbWVudGVkQXJyYXk8Y2hhcltdPiBfY3VycmVudENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyRnJhZ21lbnQ7CisgICAgcHJvdGVjdGVkIGNoYXJbXSBfY29udGVudENoYXJhY3RlcnNCdWZmZXI7CisgICAgcHJvdGVjdGVkIGludCBfY29udGVudENoYXJhY3RlcnNCdWZmZXJQdHI7CisKKyAgICBwcm90ZWN0ZWQgRnJhZ21lbnRlZEFycmF5PE9iamVjdFtdPiBfY3VycmVudENvbnRlbnRPYmplY3RGcmFnbWVudDsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0W10gX2NvbnRlbnRPYmplY3RzOworICAgIHByb3RlY3RlZCBpbnQgX2NvbnRlbnRPYmplY3RzUHRyOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9BYnN0cmFjdFByb2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9BYnN0cmFjdFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjE1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL0Fic3RyYWN0UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlcjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBjbGFzc2VzIHRoYXQgcHJvY2Vzc2VzIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9CisgKiBhbmQgcHJvZHVjZXMgaW5mb3NldCBpbiBBUEktc3BlY2lmaWMgZm9ybS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDcmVhdG9yUHJvY2Vzc29yIHsKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSUxMRUdBTCAgICAgICAgICAgICAgICAgICAgICAgPSAwOworCisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRE9DVU1FTlRfRlJBR01FTlQgICAgICAgICAgICAgPSAyOworICAgIHByb3RlY3RlZCAgc3RhdGljIGZpbmFsIGludCBTVEFURV9FTEVNRU5UX1VfTE5fUU4gICAgICAgICAgICAgICA9IDM7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VMRU1FTlRfUF9VX0xOICAgICAgICAgICAgICAgID0gNDsKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRUxFTUVOVF9VX0xOICAgICAgICAgICAgICAgICAgPSA1OworICAgIHByb3RlY3RlZCAgc3RhdGljIGZpbmFsIGludCBTVEFURV9FTEVNRU5UX0xOICAgICAgICAgICAgICAgICAgICA9IDY7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RFWFRfQVNfQ0hBUl9BUlJBWV9TTUFMTCAgICAgID0gNzsKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVEVYVF9BU19DSEFSX0FSUkFZX01FRElVTSAgICAgPSA4OworICAgIHByb3RlY3RlZCAgc3RhdGljIGZpbmFsIGludCBTVEFURV9URVhUX0FTX0NIQVJfQVJSQVlfQ09QWSAgICAgICA9IDk7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RFWFRfQVNfU1RSSU5HICAgICAgICAgICAgICAgID0gMTA7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RFWFRfQVNfT0JKRUNUICAgICAgICAgICAgICAgID0gMTE7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9TTUFMTCAgID0gMTI7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9NRURJVU0gID0gMTM7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9DT1BZICAgID0gMTQ7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTU1FTlRfQVNfU1RSSU5HICAgICAgICAgICAgID0gMTU7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04gICAgICAgID0gMTY7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50W10gX2VpaVN0YXRlVGFibGUgPSBuZXcgaW50WzI1Nl07CisKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTkFNRVNQQUNFX0FUVFJJQlVURSAgICAgICAgICAgPSAxOworICAgIHByb3RlY3RlZCAgc3RhdGljIGZpbmFsIGludCBTVEFURV9OQU1FU1BBQ0VfQVRUUklCVVRFX1AgICAgICAgICA9IDI7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX05BTUVTUEFDRV9BVFRSSUJVVEVfUF9VICAgICAgID0gMzsKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTkFNRVNQQUNFX0FUVFJJQlVURV9VICAgICAgICAgPSA0OworICAgIHByb3RlY3RlZCAgc3RhdGljIGZpbmFsIGludFtdIF9uaWlTdGF0ZVRhYmxlID0gbmV3IGludFsyNTZdOworCisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FUVFJJQlVURV9VX0xOX1FOICAgICAgICAgICAgID0gMTsKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQVRUUklCVVRFX1BfVV9MTiAgICAgICAgICAgICAgPSAyOworICAgIHByb3RlY3RlZCAgc3RhdGljIGZpbmFsIGludCBTVEFURV9BVFRSSUJVVEVfVV9MTiAgICAgICAgICAgICAgICA9IDM7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FUVFJJQlVURV9MTiAgICAgICAgICAgICAgICAgID0gNDsKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQVRUUklCVVRFX1VfTE5fUU5fT0JKRUNUICAgICAgPSA1OworICAgIHByb3RlY3RlZCAgc3RhdGljIGZpbmFsIGludCBTVEFURV9BVFRSSUJVVEVfUF9VX0xOX09CSkVDVCAgICAgICA9IDY7CisgICAgcHJvdGVjdGVkICBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FUVFJJQlVURV9VX0xOX09CSkVDVCAgICAgICAgID0gNzsKKyAgICBwcm90ZWN0ZWQgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQVRUUklCVVRFX0xOX09CSkVDVCAgICAgICAgICAgPSA4OworICAgIHByb3RlY3RlZCAgc3RhdGljIGZpbmFsIGludFtdIF9haWlTdGF0ZVRhYmxlID0gbmV3IGludFsyNTZdOworCisgICAgc3RhdGljIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlIGEgc3RhdGUgdGFibGUgZnJvbSBpbmZvcm1hdGlvbiBpdGVtcyBhbmQgb3B0aW9ucy4KKyAgICAgICAgICogVGhlIHN3dGljaCBzdGF0ZW1lbnQgdXNpbmcgc3VjaCBzdGF0ZXMgd2lsbCBvZnRlbiBnZW5lcmF0ZSBhIG1vcmUKKyAgICAgICAgICogZWZmaWNpZW50IGJ5dGUgY29kZSByZXByZXNlbnRhdGlvbiB0aGF0IGNhbiBiZSBob3RzcG90dGVkIHVzaW5nCisgICAgICAgICAqIGp1bXAgdGFibGVzLgorICAgICAgICAgKi8KKyAgICAgICAgX2VpaVN0YXRlVGFibGVbVF9ET0NVTUVOVF0gPSBTVEFURV9ET0NVTUVOVDsKKyAgICAgICAgX2VpaVN0YXRlVGFibGVbVF9ET0NVTUVOVF9GUkFHTUVOVF0gPSBTVEFURV9ET0NVTUVOVF9GUkFHTUVOVDsKKyAgICAgICAgX2VpaVN0YXRlVGFibGVbVF9FTEVNRU5UX1VfTE5fUU5dID0gU1RBVEVfRUxFTUVOVF9VX0xOX1FOOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX0VMRU1FTlRfUF9VX0xOXSA9IFNUQVRFX0VMRU1FTlRfUF9VX0xOOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX0VMRU1FTlRfVV9MTl0gPSBTVEFURV9FTEVNRU5UX1VfTE47CisgICAgICAgIF9laWlTdGF0ZVRhYmxlW1RfRUxFTUVOVF9MTl0gPSBTVEFURV9FTEVNRU5UX0xOOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX1RFWFRfQVNfQ0hBUl9BUlJBWV9TTUFMTF0gPSBTVEFURV9URVhUX0FTX0NIQVJfQVJSQVlfU01BTEw7CisgICAgICAgIF9laWlTdGF0ZVRhYmxlW1RfVEVYVF9BU19DSEFSX0FSUkFZX01FRElVTV0gPSBTVEFURV9URVhUX0FTX0NIQVJfQVJSQVlfTUVESVVNOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX1RFWFRfQVNfQ0hBUl9BUlJBWV9DT1BZXSA9IFNUQVRFX1RFWFRfQVNfQ0hBUl9BUlJBWV9DT1BZOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX1RFWFRfQVNfU1RSSU5HXSA9IFNUQVRFX1RFWFRfQVNfU1RSSU5HOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX1RFWFRfQVNfT0JKRUNUXSA9IFNUQVRFX1RFWFRfQVNfT0JKRUNUOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9TTUFMTF0gPSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfU01BTEw7CisgICAgICAgIF9laWlTdGF0ZVRhYmxlW1RfQ09NTUVOVF9BU19DSEFSX0FSUkFZX01FRElVTV0gPSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfTUVESVVNOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9DT1BZXSA9IFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9DT1BZOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX0NPTU1FTlRfQVNfU1RSSU5HXSA9IFNUQVRFX0NPTU1FTlRfQVNfU1RSSU5HOworICAgICAgICBfZWlpU3RhdGVUYWJsZVtUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT05dID0gU1RBVEVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKKyAgICAgICAgX2VpaVN0YXRlVGFibGVbVF9FTkRdID0gU1RBVEVfRU5EOworCisgICAgICAgIF9uaWlTdGF0ZVRhYmxlW1RfTkFNRVNQQUNFX0FUVFJJQlVURV0gPSBTVEFURV9OQU1FU1BBQ0VfQVRUUklCVVRFOworICAgICAgICBfbmlpU3RhdGVUYWJsZVtUX05BTUVTUEFDRV9BVFRSSUJVVEVfUF0gPSBTVEFURV9OQU1FU1BBQ0VfQVRUUklCVVRFX1A7CisgICAgICAgIF9uaWlTdGF0ZVRhYmxlW1RfTkFNRVNQQUNFX0FUVFJJQlVURV9QX1VdID0gU1RBVEVfTkFNRVNQQUNFX0FUVFJJQlVURV9QX1U7CisgICAgICAgIF9uaWlTdGF0ZVRhYmxlW1RfTkFNRVNQQUNFX0FUVFJJQlVURV9VXSA9IFNUQVRFX05BTUVTUEFDRV9BVFRSSUJVVEVfVTsKKworICAgICAgICBfYWlpU3RhdGVUYWJsZVtUX0FUVFJJQlVURV9VX0xOX1FOXSA9IFNUQVRFX0FUVFJJQlVURV9VX0xOX1FOOworICAgICAgICBfYWlpU3RhdGVUYWJsZVtUX0FUVFJJQlVURV9QX1VfTE5dID0gU1RBVEVfQVRUUklCVVRFX1BfVV9MTjsKKyAgICAgICAgX2FpaVN0YXRlVGFibGVbVF9BVFRSSUJVVEVfVV9MTl0gPSBTVEFURV9BVFRSSUJVVEVfVV9MTjsKKyAgICAgICAgX2FpaVN0YXRlVGFibGVbVF9BVFRSSUJVVEVfTE5dID0gU1RBVEVfQVRUUklCVVRFX0xOOworICAgICAgICBfYWlpU3RhdGVUYWJsZVtUX0FUVFJJQlVURV9VX0xOX1FOX09CSkVDVF0gPSBTVEFURV9BVFRSSUJVVEVfVV9MTl9RTl9PQkpFQ1Q7CisgICAgICAgIF9haWlTdGF0ZVRhYmxlW1RfQVRUUklCVVRFX1BfVV9MTl9PQkpFQ1RdID0gU1RBVEVfQVRUUklCVVRFX1BfVV9MTl9PQkpFQ1Q7CisgICAgICAgIF9haWlTdGF0ZVRhYmxlW1RfQVRUUklCVVRFX1VfTE5fT0JKRUNUXSA9IFNUQVRFX0FUVFJJQlVURV9VX0xOX09CSkVDVDsKKyAgICAgICAgX2FpaVN0YXRlVGFibGVbVF9BVFRSSUJVVEVfTE5fT0JKRUNUXSA9IFNUQVRFX0FUVFJJQlVURV9MTl9PQkpFQ1Q7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFhNTFN0cmVhbUJ1ZmZlciBfYnVmZmVyOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIHByb2Nlc3NvciBzaG91bGQgY3JlYXRlIGEgZnJhZ21lbnQgb2YgWE1MLCB3aXRob3V0IHRoZSBzdGFydC9lbmQgZG9jdW1lbnQgbWFya2Vycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfZnJhZ21lbnRNb2RlOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gX3N0cmluZ0ludGVybmluZ0ZlYXR1cmUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiByZW1haW5pbmcgWE1MIGVsZW1lbnQgdHJlZXMgdGhhdCBzaG91bGQgYmUgdmlzaWJsZQorICAgICAqIHRocm91Z2ggdGhpcyB7QGxpbmsgQWJzdHJhY3RQcm9jZXNzb3J9LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgX3RyZWVDb3VudDsKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNzZXRCdWZmZXIoWE1MU3RyZWFtQnVmZmVyLCBib29sZWFuKX0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRCdWZmZXIoWE1MU3RyZWFtQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICBzZXRCdWZmZXIoYnVmZmVyLGJ1ZmZlci5pc0ZyYWdtZW50KCkpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRCdWZmZXIoWE1MU3RyZWFtQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBmcmFnbWVudE1vZGUpIHsKKyAgICAgICAgX2J1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgX2ZyYWdtZW50TW9kZSA9IGZyYWdtZW50TW9kZTsKKworICAgICAgICBfY3VycmVudFN0cnVjdHVyZUZyYWdtZW50ID0gX2J1ZmZlci5nZXRTdHJ1Y3R1cmUoKTsKKyAgICAgICAgX3N0cnVjdHVyZSA9IF9jdXJyZW50U3RydWN0dXJlRnJhZ21lbnQuZ2V0QXJyYXkoKTsKKyAgICAgICAgX3N0cnVjdHVyZVB0ciA9IF9idWZmZXIuZ2V0U3RydWN0dXJlUHRyKCk7CisKKyAgICAgICAgX2N1cnJlbnRTdHJ1Y3R1cmVTdHJpbmdGcmFnbWVudCA9IF9idWZmZXIuZ2V0U3RydWN0dXJlU3RyaW5ncygpOworICAgICAgICBfc3RydWN0dXJlU3RyaW5ncyA9IF9jdXJyZW50U3RydWN0dXJlU3RyaW5nRnJhZ21lbnQuZ2V0QXJyYXkoKTsKKyAgICAgICAgX3N0cnVjdHVyZVN0cmluZ3NQdHIgPSBfYnVmZmVyLmdldFN0cnVjdHVyZVN0cmluZ3NQdHIoKTsKKworICAgICAgICBfY3VycmVudENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyRnJhZ21lbnQgPSBfYnVmZmVyLmdldENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyKCk7CisgICAgICAgIF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciA9IF9jdXJyZW50Q29udGVudENoYXJhY3RlcnNCdWZmZXJGcmFnbWVudC5nZXRBcnJheSgpOworICAgICAgICBfY29udGVudENoYXJhY3RlcnNCdWZmZXJQdHIgPSBfYnVmZmVyLmdldENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyUHRyKCk7CisKKyAgICAgICAgX2N1cnJlbnRDb250ZW50T2JqZWN0RnJhZ21lbnQgPSBfYnVmZmVyLmdldENvbnRlbnRPYmplY3RzKCk7CisgICAgICAgIF9jb250ZW50T2JqZWN0cyA9IF9jdXJyZW50Q29udGVudE9iamVjdEZyYWdtZW50LmdldEFycmF5KCk7CisgICAgICAgIF9jb250ZW50T2JqZWN0c1B0ciA9IF9idWZmZXIuZ2V0Q29udGVudE9iamVjdHNQdHIoKTsKKworICAgICAgICBfc3RyaW5nSW50ZXJuaW5nRmVhdHVyZSA9IF9idWZmZXIuaGFzSW50ZXJuZWRTdHJpbmdzKCk7CisgICAgICAgIF90cmVlQ291bnQgPSBfYnVmZmVyLnRyZWVDb3VudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHBlZWtTdHJ1Y3R1cmUoKSB7CisgICAgICAgIGlmIChfc3RydWN0dXJlUHRyIDwgX3N0cnVjdHVyZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBfc3RydWN0dXJlW19zdHJ1Y3R1cmVQdHJdICYgMjU1OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlYWRGcm9tTmV4dFN0cnVjdHVyZSgwKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHJlYWRTdHJ1Y3R1cmUoKSB7CisgICAgICAgIGlmIChfc3RydWN0dXJlUHRyIDwgX3N0cnVjdHVyZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBfc3RydWN0dXJlW19zdHJ1Y3R1cmVQdHIrK10gJiAyNTU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVhZEZyb21OZXh0U3RydWN0dXJlKDEpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcmVhZEVpaVN0YXRlKCkgeworICAgICAgICByZXR1cm4gX2VpaVN0YXRlVGFibGVbcmVhZFN0cnVjdHVyZSgpXTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHJlYWRTdHJ1Y3R1cmUxNigpIHsKKyAgICAgICAgcmV0dXJuIChyZWFkU3RydWN0dXJlKCkgPDwgOCkgfCByZWFkU3RydWN0dXJlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmVhZEZyb21OZXh0U3RydWN0dXJlKGludCB2KSB7CisgICAgICAgIF9zdHJ1Y3R1cmVQdHIgPSB2OworICAgICAgICBfY3VycmVudFN0cnVjdHVyZUZyYWdtZW50ID0gX2N1cnJlbnRTdHJ1Y3R1cmVGcmFnbWVudC5nZXROZXh0KCk7CisgICAgICAgIF9zdHJ1Y3R1cmUgPSBfY3VycmVudFN0cnVjdHVyZUZyYWdtZW50LmdldEFycmF5KCk7CisgICAgICAgIHJldHVybiBfc3RydWN0dXJlWzBdICYgMjU1OworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcmVhZFN0cnVjdHVyZVN0cmluZygpIHsKKyAgICAgICAgaWYgKF9zdHJ1Y3R1cmVTdHJpbmdzUHRyIDwgX3N0cnVjdHVyZVN0cmluZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gX3N0cnVjdHVyZVN0cmluZ3NbX3N0cnVjdHVyZVN0cmluZ3NQdHIrK107CisgICAgICAgIH0KKworICAgICAgICBfc3RydWN0dXJlU3RyaW5nc1B0ciA9IDE7CisgICAgICAgIF9jdXJyZW50U3RydWN0dXJlU3RyaW5nRnJhZ21lbnQgPSBfY3VycmVudFN0cnVjdHVyZVN0cmluZ0ZyYWdtZW50LmdldE5leHQoKTsKKyAgICAgICAgX3N0cnVjdHVyZVN0cmluZ3MgPSBfY3VycmVudFN0cnVjdHVyZVN0cmluZ0ZyYWdtZW50LmdldEFycmF5KCk7CisgICAgICAgIHJldHVybiBfc3RydWN0dXJlU3RyaW5nc1swXTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHJlYWRDb250ZW50U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKFN0cmluZylyZWFkQ29udGVudE9iamVjdCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBjaGFyW10gcmVhZENvbnRlbnRDaGFyYWN0ZXJzQ29weSgpIHsKKyAgICAgICAgcmV0dXJuIChjaGFyW10pcmVhZENvbnRlbnRPYmplY3QoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHJlYWRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcihpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChfY29udGVudENoYXJhY3RlcnNCdWZmZXJQdHIgKyBsZW5ndGggPCBfY29udGVudENoYXJhY3RlcnNCdWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBfY29udGVudENoYXJhY3RlcnNCdWZmZXJQdHI7CisgICAgICAgICAgICBfY29udGVudENoYXJhY3RlcnNCdWZmZXJQdHIgKz0gbGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyUHRyID0gbGVuZ3RoOworICAgICAgICBfY3VycmVudENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyRnJhZ21lbnQgPSBfY3VycmVudENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyRnJhZ21lbnQuZ2V0TmV4dCgpOworICAgICAgICBfY29udGVudENoYXJhY3RlcnNCdWZmZXIgPSBfY3VycmVudENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyRnJhZ21lbnQuZ2V0QXJyYXkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCByZWFkQ29udGVudE9iamVjdCgpIHsKKyAgICAgICAgaWYgKF9jb250ZW50T2JqZWN0c1B0ciA8IF9jb250ZW50T2JqZWN0cy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBfY29udGVudE9iamVjdHNbX2NvbnRlbnRPYmplY3RzUHRyKytdOworICAgICAgICB9CisKKyAgICAgICAgX2NvbnRlbnRPYmplY3RzUHRyID0gMTsKKyAgICAgICAgX2N1cnJlbnRDb250ZW50T2JqZWN0RnJhZ21lbnQgPSBfY3VycmVudENvbnRlbnRPYmplY3RGcmFnbWVudC5nZXROZXh0KCk7CisgICAgICAgIF9jb250ZW50T2JqZWN0cyA9IF9jdXJyZW50Q29udGVudE9iamVjdEZyYWdtZW50LmdldEFycmF5KCk7CisgICAgICAgIHJldHVybiBfY29udGVudE9iamVjdHNbMF07CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1aWxkZXIgX3FOYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0UU5hbWUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBfcU5hbWVCdWZmZXIuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCc6JykuYXBwZW5kKGxvY2FsTmFtZSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBxTmFtZSA9IF9xTmFtZUJ1ZmZlci50b1N0cmluZygpOworICAgICAgICBfcU5hbWVCdWZmZXIuc2V0TGVuZ3RoKDApOworICAgICAgICByZXR1cm4gKF9zdHJpbmdJbnRlcm5pbmdGZWF0dXJlKSA/IHFOYW1lLmludGVybigpIDogcU5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRQcmVmaXhGcm9tUU5hbWUoU3RyaW5nIHFOYW1lKSB7CisgICAgICAgIGludCBwSW5kZXggPSBxTmFtZS5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChfc3RyaW5nSW50ZXJuaW5nRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuIChwSW5kZXggIT0gLTEpID8gcU5hbWUuc3Vic3RyaW5nKDAscEluZGV4KS5pbnRlcm4oKSA6ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChwSW5kZXggIT0gLTEpID8gcU5hbWUuc3Vic3RyaW5nKDAscEluZGV4KSA6ICIiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9BdHRyaWJ1dGVzSG9sZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL0F0dHJpYnV0ZXNIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGFhMmNlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9BdHRyaWJ1dGVzSG9sZGVyLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlcjsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKy8qKgorICogQ2xhc3MgZm9yIGhvbGRpbmcgYXR0cmlidXRlcy4KKyAqCisgKiBTaW5jZSBpdCBpbXBsZW1lbnRzIHtAbGluayBBdHRyaWJ1dGVzfSwgdGhpcyBjbGFzcyBmb2xsb3dzIHRoZSBTQVggY29udmVudGlvbgorICogb2YgdXNpbmcgIiIgaW5zdGVhZCBvZiBudWxsLgorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlBvaW50bGVzc0FyaXRobWV0aWNFeHByZXNzaW9uIn0pCitwdWJsaWMgZmluYWwgY2xhc3MgQXR0cmlidXRlc0hvbGRlciBpbXBsZW1lbnRzIEF0dHJpYnV0ZXMgeworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFkgPSA4OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElURU1fU0laRSA9IDEgPDwgMzsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRUZJWCAgICAgPSAwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVSSSAgICAgICAgPSAxOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExPQ0FMX05BTUUgPSAyOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFFOQU1FICAgICAgPSAzOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRZUEUgICAgICAgPSA0OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZBTFVFICAgICAgPSA1OworCisgICAgcHJvdGVjdGVkIGludCBfYXR0cmlidXRlQ291bnQ7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gX3N0cmluZ3M7CisKKyAgICBwdWJsaWMgQXR0cmlidXRlc0hvbGRlcigpIHsKKyAgICAgICAgX3N0cmluZ3MgPSBuZXcgU3RyaW5nW0RFRkFVTFRfQ0FQQUNJVFkgKiBJVEVNX1NJWkVdOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gX2F0dHJpYnV0ZUNvdW50OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJlZml4KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKGluZGV4ID49IDAgJiYgaW5kZXggPCBfYXR0cmlidXRlQ291bnQpID8KKyAgICAgICAgICAgIF9zdHJpbmdzWyhpbmRleCA8PCAzKSArIFBSRUZJWF0gOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TG9jYWxOYW1lKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKGluZGV4ID49IDAgJiYgaW5kZXggPCBfYXR0cmlidXRlQ291bnQpID8KKyAgICAgICAgICAgIF9zdHJpbmdzWyhpbmRleCA8PCAzKSArIExPQ0FMX05BTUVdIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFFOYW1lKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKGluZGV4ID49IDAgJiYgaW5kZXggPCBfYXR0cmlidXRlQ291bnQpID8KKyAgICAgICAgICAgIF9zdHJpbmdzWyhpbmRleCA8PCAzKSArIFFOQU1FXSA6IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUeXBlKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKGluZGV4ID49IDAgJiYgaW5kZXggPCBfYXR0cmlidXRlQ291bnQpID8KKyAgICAgICAgICAgIF9zdHJpbmdzWyhpbmRleCA8PCAzKSArIFRZUEVdIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFVSSShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIChpbmRleCA+PSAwICYmIGluZGV4IDwgX2F0dHJpYnV0ZUNvdW50KSA/CisgICAgICAgICAgICBfc3RyaW5nc1soaW5kZXggPDwgMykgKyBVUkldIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKGluZGV4ID49IDAgJiYgaW5kZXggPCBfYXR0cmlidXRlQ291bnQpID8KKyAgICAgICAgICAgIF9zdHJpbmdzWyhpbmRleCA8PCAzKSArIFZBTFVFXSA6IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXRJbmRleChTdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXR0cmlidXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHFOYW1lLmVxdWFscyhfc3RyaW5nc1soaSA8PCAzKSArIFFOQU1FXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUeXBlKFN0cmluZyBxTmFtZSkgeworICAgICAgICBmaW5hbCBpbnQgaSA9IChnZXRJbmRleChxTmFtZSkgPDwgMykgKyBUWVBFOworICAgICAgICByZXR1cm4gKGkgPj0gMCkgPyBfc3RyaW5nc1tpXSA6IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZShTdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgZmluYWwgaW50IGkgPSAoZ2V0SW5kZXgocU5hbWUpIDw8IDMpICsgVkFMVUU7CisgICAgICAgIHJldHVybiAoaSA+PSAwKSA/IF9zdHJpbmdzW2ldIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEluZGV4KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXR0cmlidXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoX3N0cmluZ3NbKGkgPDwgMykgKyBMT0NBTF9OQU1FXSkgJiYKKyAgICAgICAgICAgICAgICB1cmkuZXF1YWxzKF9zdHJpbmdzWyhpIDw8IDMpICsgVVJJXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUeXBlKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgZmluYWwgaW50IGkgPSAoZ2V0SW5kZXgodXJpLCBsb2NhbE5hbWUpIDw8IDMpICsgVFlQRTsKKyAgICAgICAgcmV0dXJuIChpID49IDApID8gX3N0cmluZ3NbaV0gOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBmaW5hbCBpbnQgaSA9IChnZXRJbmRleCh1cmksIGxvY2FsTmFtZSkgPDwgMykgKyBWQUxVRTsKKyAgICAgICAgcmV0dXJuIChpID49IDApID8gX3N0cmluZ3NbaV0gOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKCkgeworICAgICAgICBpZiAoX2F0dHJpYnV0ZUNvdW50ID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXR0cmlidXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIF9zdHJpbmdzWyhpIDw8IDMpICsgVkFMVUVdID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9hdHRyaWJ1dGVDb3VudCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgdXNpbmcgYSBxdWFsaWZpZWQgbmFtZSB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAqIHByZWZpeCBhbmQgbG9jYWwgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkKKyAgICAgKiAgICAgIFRoaXMgY2FuIGJlIGVtcHR5IGJ1dCBub3QgbnVsbCwganVzdCBsaWtlIGV2ZXJ5d2hlcmUgZWxzZSBpbiBTQVguCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkQXR0cmlidXRlV2l0aFFOYW1lKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBmaW5hbCBpbnQgaSA9IF9hdHRyaWJ1dGVDb3VudCA8PCAzOworICAgICAgICBpZiAoaSA9PSBfc3RyaW5ncy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc2l6ZShpKTsKKyAgICAgICAgfQorCisgICAgICAgIF9zdHJpbmdzW2kgKyBQUkVGSVhdID0gbnVsbDsKKyAgICAgICAgX3N0cmluZ3NbaSArIFVSSV0gPSB1cmk7CisgICAgICAgIF9zdHJpbmdzW2kgKyBMT0NBTF9OQU1FXSA9IGxvY2FsTmFtZTsKKyAgICAgICAgX3N0cmluZ3NbaSArIFFOQU1FXSA9IHFOYW1lOworICAgICAgICBfc3RyaW5nc1tpICsgVFlQRV0gPSB0eXBlOworICAgICAgICBfc3RyaW5nc1tpICsgVkFMVUVdID0gdmFsdWU7CisKKyAgICAgICAgX2F0dHJpYnV0ZUNvdW50Kys7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGF0dHJpYnV0ZSB1c2luZyBhIHByZWZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXgKKyAgICAgKiAgICAgIFRoaXMgY2FuIGJlIGVtcHR5IGJ1dCBub3QgbnVsbCwganVzdCBsaWtlIGV2ZXJ5d2hlcmUgZWxzZSBpbiBTQVguCisgICAgICogQHBhcmFtIHVyaQorICAgICAqICAgICAgVGhpcyBjYW4gYmUgZW1wdHkgYnV0IG5vdCBudWxsLCBqdXN0IGxpa2UgZXZlcnl3aGVyZSBlbHNlIGluIFNBWC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRBdHRyaWJ1dGVXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgZmluYWwgaW50IGkgPSBfYXR0cmlidXRlQ291bnQgPDwgMzsKKyAgICAgICAgaWYgKGkgPT0gX3N0cmluZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICByZXNpemUoaSk7CisgICAgICAgIH0KKworICAgICAgICBfc3RyaW5nc1tpICsgUFJFRklYXSA9IHByZWZpeDsKKyAgICAgICAgX3N0cmluZ3NbaSArIFVSSV0gPSB1cmk7CisgICAgICAgIF9zdHJpbmdzW2kgKyBMT0NBTF9OQU1FXSA9IGxvY2FsTmFtZTsKKyAgICAgICAgX3N0cmluZ3NbaSArIFFOQU1FXSA9IG51bGw7CisgICAgICAgIF9zdHJpbmdzW2kgKyBUWVBFXSA9IHR5cGU7CisgICAgICAgIF9zdHJpbmdzW2kgKyBWQUxVRV0gPSB2YWx1ZTsKKworICAgICAgICBfYXR0cmlidXRlQ291bnQrKzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzaXplKGludCBsZW5ndGgpIHsKKyAgICAgICAgZmluYWwgaW50IG5ld0xlbmd0aCA9IGxlbmd0aCAqIDI7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW25ld0xlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3N0cmluZ3MsIDAsIHN0cmluZ3MsIDAsIGxlbmd0aCk7CisgICAgICAgIF9zdHJpbmdzID0gc3RyaW5nczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvRnJhZ21lbnRlZEFycmF5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL0ZyYWdtZW50ZWRBcnJheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzUxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL0ZyYWdtZW50ZWRBcnJheS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlcjsKKworY2xhc3MgRnJhZ21lbnRlZEFycmF5PFQ+IHsKKyAgICBwcm90ZWN0ZWQgVCBfaXRlbTsKKyAgICBwcm90ZWN0ZWQgRnJhZ21lbnRlZEFycmF5PFQ+IF9uZXh0OworICAgIHByb3RlY3RlZCBGcmFnbWVudGVkQXJyYXk8VD4gX3ByZXZpb3VzOworCisgICAgRnJhZ21lbnRlZEFycmF5KFQgaXRlbSkgeworICAgICAgICB0aGlzKGl0ZW0sIG51bGwpOworICAgIH0KKworICAgIEZyYWdtZW50ZWRBcnJheShUIGl0ZW0sIEZyYWdtZW50ZWRBcnJheTxUPiBwcmV2aW91cykgeworICAgICAgICBzZXRBcnJheShpdGVtKTsKKyAgICAgICAgaWYgKHByZXZpb3VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByZXZpb3VzLl9uZXh0ID0gdGhpczsKKyAgICAgICAgICAgIF9wcmV2aW91cyA9IHByZXZpb3VzOworICAgICAgICB9CisgICAgfQorCisgICAgVCBnZXRBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIF9pdGVtOworICAgIH0KKworICAgIHZvaWQgc2V0QXJyYXkoVCBpdGVtKSB7CisgICAgICAgIGFzc2VydChpdGVtLmdldENsYXNzKCkuaXNBcnJheSgpKTsKKworICAgICAgICBfaXRlbSA9IGl0ZW07CisgICAgfQorCisgICAgRnJhZ21lbnRlZEFycmF5PFQ+IGdldE5leHQoKSB7CisgICAgICAgIHJldHVybiBfbmV4dDsKKyAgICB9CisKKyAgICB2b2lkIHNldE5leHQoRnJhZ21lbnRlZEFycmF5PFQ+IG5leHQpIHsKKyAgICAgICAgX25leHQgPSBuZXh0OworICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXh0Ll9wcmV2aW91cyA9IHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGcmFnbWVudGVkQXJyYXk8VD4gZ2V0UHJldmlvdXMoKSB7CisgICAgICAgIHJldHVybiBfcHJldmlvdXM7CisgICAgfQorCisgICAgdm9pZCBzZXRQcmV2aW91cyhGcmFnbWVudGVkQXJyYXk8VD4gcHJldmlvdXMpIHsKKyAgICAgICAgX3ByZXZpb3VzID0gcHJldmlvdXM7CisgICAgICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmV2aW91cy5fbmV4dCA9IHRoaXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL011dGFibGVYTUxTdHJlYW1CdWZmZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjk5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL011dGFibGVYTUxTdHJlYW1CdWZmZXIuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zYXguUHJvcGVydGllczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLnNheC5TQVhCdWZmZXJDcmVhdG9yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuc3RheC5TdHJlYW1SZWFkZXJCdWZmZXJDcmVhdG9yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuc3RheC5TdHJlYW1Xcml0ZXJCdWZmZXJDcmVhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICoKKyAqIEEgbXV0YWJsZSBzdHJlYW0tYmFzZWQgYnVmZmVyIG9mIGFuIFhNTCBpbmZvc2V0LgorICoKKyAqIDxwPgorICogQSBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIGlzIGNyZWF0ZWQgdXNpbmcgc3BlY2lmaWMgU0FYIGFuZCBTdEFYLWJhc2VkCisgKiBjcmVhdG9ycy4gVXRpbGl0eSBtZXRob2RzIG9uIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgYXJlIHByb3ZpZGVkIGZvcgorICogc3VjaCBmdW5jdGlvbmFsaXR5IHRoYXQgdXRpbGl6ZSBTQVggYW5kIFN0QVgtYmFzZWQgY3JlYXRvcnMuCisgKgorICogPHA+CisgKiBPbmNlIGluc3RhbnRpYXRlZCB0aGUgc2FtZSBpbnN0YW5jZSBvZiBhIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgbWF5IGJlIHJldXNlZCBmb3IKKyAqIGNyZWF0aW9uIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIE9iamVjdHMgaW5zdGFudGlhdGVkIGFuZCBnYXJiYWdlCisgKiBjb2xsZWN0ZWQgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIGludGVybmFsbHkgcmVwcmVzZW50aW5nIGFuIFhNTCBpbmZvc2V0LgorICoKKyAqIDxwPgorICogQSBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIGlzIG5vdCBkZXNpZ25lZCB0byBiZSBjcmVhdGVkIGFuZCBwcm9jZXNzZWQKKyAqIGNvbmN1cnJlbnRseS4gSWYgZG9uZSBzbyB1bnNwZWNpZmllZCBiZWhhdmlvdXIgbWF5IG9jY3VyLgorICovCitwdWJsaWMgY2xhc3MgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBleHRlbmRzIFhNTFN0cmVhbUJ1ZmZlciB7CisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYXJyYXkgc2l6ZSBmb3IgdGhlIGFycmF5cyB1c2VkIGluIGludGVybmFsIHJlcHJlc2VudGF0aW9uCisgICAgICogb2YgdGhlIFhNTCBpbmZvc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IERFRkFVTFRfQVJSQVlfU0laRSA9IDUxMjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIHVzaW5nIHRoZQorICAgICAqIHtAbGluayBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyI0RFRkFVTFRfQVJSQVlfU0laRX0uCisgICAgICovCisgICAgcHVibGljIE11dGFibGVYTUxTdHJlYW1CdWZmZXIoKSB7CisgICAgICAgIHRoaXMoREVGQVVMVF9BUlJBWV9TSVpFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN5c3RlbSBpZGVudGlmaWVyIGZvciB0aGlzIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZGVudGlmaWVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgeworICAgICAgICB0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE11dGFibGVYTUxTdHJlYW1CdWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqIFRoZSBzaXplIG9mIHRoZSBhcnJheXMgdXNlZCBpbiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KKyAgICAgKiBvZiB0aGUgWE1MIGluZm9zZXQuCisgICAgICogQHRocm93cyBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbgorICAgICAqIElmIHRoZSA8Y29kZT5zaXplPC9jb2RlPiBhcmd1bWVudCBpcyBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE11dGFibGVYTUxTdHJlYW1CdWZmZXIoaW50IHNpemUpIHsKKyAgICAgICAgX3N0cnVjdHVyZSA9IG5ldyBGcmFnbWVudGVkQXJyYXk8Ynl0ZVtdPihuZXcgYnl0ZVtzaXplXSk7CisgICAgICAgIF9zdHJ1Y3R1cmVTdHJpbmdzID0gbmV3IEZyYWdtZW50ZWRBcnJheTxTdHJpbmdbXT4obmV3IFN0cmluZ1tzaXplXSk7CisgICAgICAgIF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciA9IG5ldyBGcmFnbWVudGVkQXJyYXk8Y2hhcltdPihuZXcgY2hhcls0MDk2XSk7CisgICAgICAgIF9jb250ZW50T2JqZWN0cyA9IG5ldyBGcmFnbWVudGVkQXJyYXk8T2JqZWN0W10+KG5ldyBPYmplY3Rbc2l6ZV0pOworCisgICAgICAgIC8vIFNldCB0aGUgZmlyc3QgZWxlbWVudCBvZiBzdHJ1Y3R1cmUgYXJyYXkgdG8gaW5kaWNhdGUgYW4gZW1wdHkgYnVmZmVyCisgICAgICAgIC8vIHRoYXQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQKKyAgICAgICAgX3N0cnVjdHVyZS5nZXRBcnJheSgpWzBdID0gQWJzdHJhY3RDcmVhdG9yUHJvY2Vzc29yLlRfRU5EOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBjb250ZW50cyBvZiBhIGJ1ZmZlciBmcm9tIGEgWE1MU3RyZWFtUmVhZGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgaXMgcmVzZXQgKHNlZSB7QGxpbmsgI3Jlc2V0fSkgYmVmb3JlIGNyZWF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgaXMgY3JlYXRlZCBieSBjb25zdW1pbmcgdGhlIGV2ZW50cyBvbiB0aGUgWE1MU3RyZWFtUmVhZGVyIHVzaW5nCisgICAgICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmVhbVJlYWRlckJ1ZmZlckNyZWF0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlcgorICAgICAqIEEgWE1MU3RyZWFtUmVhZGVyIHRvIHJlYWQgZnJvbSB0byBjcmVhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlRnJvbVhNTFN0cmVhbVJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgU3RyZWFtUmVhZGVyQnVmZmVyQ3JlYXRvciBjID0gbmV3IFN0cmVhbVJlYWRlckJ1ZmZlckNyZWF0b3IodGhpcyk7CisgICAgICAgIGMuY3JlYXRlKHJlYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGNvbnRlbnRzIG9mIGEgYnVmZmVyIGZyb20gYSBYTUxTdHJlYW1Xcml0ZXIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBpcyByZXNldCAoc2VlIHtAbGluayAjcmVzZXR9KSBiZWZvcmUgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBpcyBjcmVhdGVkIGJ5IGNvbnN1bWluZyBldmVudHMgb24gYSBYTUxTdHJlYW1Xcml0ZXIgdXNpbmcKKyAgICAgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyZWFtV3JpdGVyQnVmZmVyQ3JlYXRvcn0uCisgICAgICovCisgICAgcHVibGljIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVGcm9tWE1MU3RyZWFtV3JpdGVyKCkgeworICAgICAgICByZXNldCgpOworICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVdyaXRlckJ1ZmZlckNyZWF0b3IodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGNvbnRlbnRzIG9mIGEgYnVmZmVyIGZyb20gYSB7QGxpbmsgU0FYQnVmZmVyQ3JlYXRvcn0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBpcyByZXNldCAoc2VlIHtAbGluayAjcmVzZXR9KSBiZWZvcmUgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBpcyBjcmVhdGVkIGJ5IGNvbnN1bWluZyBldmVudHMgZnJvbSBhIHtAbGluayBDb250ZW50SGFuZGxlcn0gdXNpbmcKKyAgICAgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU0FYQnVmZmVyQ3JlYXRvcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgU0FYQnVmZmVyQ3JlYXRvcn0gdG8gY3JlYXRlIGZyb20uCisgICAgICovCisgICAgcHVibGljIFNBWEJ1ZmZlckNyZWF0b3IgY3JlYXRlRnJvbVNBWEJ1ZmZlckNyZWF0b3IoKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgICAgIFNBWEJ1ZmZlckNyZWF0b3IgYyA9IG5ldyBTQVhCdWZmZXJDcmVhdG9yKCk7CisgICAgICAgIGMuc2V0QnVmZmVyKHRoaXMpOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgY29udGVudHMgb2YgYSBidWZmZXIgZnJvbSBhIHtAbGluayBYTUxSZWFkZXJ9IGFuZCB7QGxpbmsgSW5wdXRTdHJlYW19LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgaXMgcmVzZXQgKHNlZSB7QGxpbmsgI3Jlc2V0fSkgYmVmb3JlIGNyZWF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgaXMgY3JlYXRlZCBieSB1c2luZyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU0FYQnVmZmVyQ3JlYXRvcn0KKyAgICAgKiBhbmQgcmVnaXN0ZXJpbmcgYXNzb2NpYXRlZCBoYW5kbGVycyBvbiB0aGUge0BsaW5rIFhNTFJlYWRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICogVGhlIHtAbGluayBYTUxSZWFkZXJ9IHRvIHVzZSBmb3IgcGFyc2luZy4KKyAgICAgKiBAcGFyYW0gaW4KKyAgICAgKiBUaGUge0BsaW5rIElucHV0U3RyZWFtfSB0byBiZSBwYXJzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlRnJvbVhNTFJlYWRlcihYTUxSZWFkZXIgcmVhZGVyLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBjcmVhdGVGcm9tWE1MUmVhZGVyKHJlYWRlciwgaW4sIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBjb250ZW50cyBvZiBhIGJ1ZmZlciBmcm9tIGEge0BsaW5rIFhNTFJlYWRlcn0gYW5kIHtAbGluayBJbnB1dFN0cmVhbX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBpcyByZXNldCAoc2VlIHtAbGluayAjcmVzZXR9KSBiZWZvcmUgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBpcyBjcmVhdGVkIGJ5IHVzaW5nIGFuIGluc3RhbmNlIG9mIHtAbGluayBTQVhCdWZmZXJDcmVhdG9yfQorICAgICAqIGFuZCByZWdpc3RlcmluZyBhc3NvY2lhdGVkIGhhbmRsZXJzIG9uIHRoZSB7QGxpbmsgWE1MUmVhZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiBUaGUge0BsaW5rIFhNTFJlYWRlcn0gdG8gdXNlIGZvciBwYXJzaW5nLgorICAgICAqIEBwYXJhbSBpbgorICAgICAqIFRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IHRvIGJlIHBhcnNlZC4KKyAgICAgKiBAcGFyYW0gc3lzdGVtSWQKKyAgICAgKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlRnJvbVhNTFJlYWRlcihYTUxSZWFkZXIgcmVhZGVyLCBJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0KCk7CisgICAgICAgIFNBWEJ1ZmZlckNyZWF0b3IgYyA9IG5ldyBTQVhCdWZmZXJDcmVhdG9yKHRoaXMpOworCisgICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihjKTsKKyAgICAgICAgcmVhZGVyLnNldERUREhhbmRsZXIoYyk7CisgICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eShQcm9wZXJ0aWVzLkxFWElDQUxfSEFORExFUl9QUk9QRVJUWSwgYyk7CisKKyAgICAgICAgYy5jcmVhdGUocmVhZGVyLCBpbiwgc3lzdGVtSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXNldCB0aGUgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciB0byBhIHN0YXRlIG9mIGJlaW5nICJ1bmNyZWF0ZWQiCisgICAgICogc2ltaWxhciB0byB0aGUgc3RhdGUgb2YgYSBuZXdseSBpbnN0YW50aWF0ZWQgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEFzIG1hbnkgT2JqZWN0cyBhcyBwb3NzaWJsZSB3aWxsIGJlIHJldGFpbmVkIGZvciByZXVzZSBpbiBmdXR1cmUgY3JlYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIC8vIFJlc2V0IHRoZSBwdHJzIGluIGFycmF5cyB0byAwCisgICAgICAgIF9zdHJ1Y3R1cmVQdHIgPQorICAgICAgICAgICAgICAgIF9zdHJ1Y3R1cmVTdHJpbmdzUHRyID0KKyAgICAgICAgICAgICAgICBfY29udGVudENoYXJhY3RlcnNCdWZmZXJQdHIgPQorICAgICAgICAgICAgICAgIF9jb250ZW50T2JqZWN0c1B0ciA9IDA7CisKKyAgICAgICAgLy8gU2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHN0cnVjdHVyZSBhcnJheSB0byBpbmRpY2F0ZSBhbiBlbXB0eSBidWZmZXIKKyAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gY3JlYXRlZAorICAgICAgICBfc3RydWN0dXJlLmdldEFycmF5KClbMF0gPSBBYnN0cmFjdENyZWF0b3JQcm9jZXNzb3IuVF9FTkQ7CisKKyAgICAgICAgLy8gQ2xlYW4gdXAgY29udGVudCBvYmplY3RzCisgICAgICAgIF9jb250ZW50T2JqZWN0cy5zZXROZXh0KG51bGwpOworICAgICAgICBmaW5hbCBPYmplY3RbXSBvID0gX2NvbnRlbnRPYmplY3RzLmdldEFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgby5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG9baV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9baV0gPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyZWVDb3VudCA9IDA7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVE9ETyBjb25zaWRlciB0cnVuY2F0aW5nIHRoZSBzaXplIG9mIF9zdHJ1Y3R1cmVTdHJpbmdzIGFuZAorICAgICAgICAgKiBfY29udGVudENoYXJhY3RlcnNCdWZmZXIgdG8gbGltaXQgdGhlIG1lbW9yeSB1c2VkIGJ5IHRoZSBidWZmZXIKKyAgICAgICAgICovCisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRIYXNJbnRlcm5lZFN0cmluZ3MoYm9vbGVhbiBoYXNJbnRlcm5lZFN0cmluZ3MpIHsKKyAgICAgICAgX2hhc0ludGVybmVkU3RyaW5ncyA9IGhhc0ludGVybmVkU3RyaW5nczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL1hNTFN0cmVhbUJ1ZmZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9YTUxTdHJlYW1CdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM5NGUzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9YTUxTdHJlYW1CdWZmZXIuamF2YQpAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zYXguU0FYQnVmZmVyUHJvY2Vzc29yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuc3RheC5TdHJlYW1SZWFkZXJCdWZmZXJQcm9jZXNzb3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zdGF4LlN0cmVhbVdyaXRlckJ1ZmZlclByb2Nlc3NvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKKworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkRUREhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKKy8qKgorICogQW4gaW1tdXRhYmxlIHN0cmVhbS1iYXNlZCBidWZmZXIgb2YgYW4gWE1MIGluZm9zZXQuCisgKgorICogPHA+CisgKiBBIFhNTFN0cmVhbUJ1ZmZlciBpcyBhbiBhYnN0cmFjdCBjbGFzcy4gSXQgaXMgaW1tdXRhYmxlIHdpdGgKKyAqIHJlc3BlY3QgdG8gdGhlIG1ldGhvZHMgb24gdGhlIGNsYXNzLCB3aGljaCBhcmUgbm9uLW1vZGlmeWluZyBpbiB0ZXJtcworICogb2Ygc3RhdGUuCisgKgorICogPHA+CisgKiBBIFhNTFN0cmVhbUJ1ZmZlciBjYW4gYmUgcHJvY2Vzc2VkIHVzaW5nIHNwZWNpZmljIFNBWCBhbmQgU3RBWC1iYXNlZAorICogcHJvY2Vzc29ycy4gVXRpbGl0eSBtZXRob2RzIG9uIFhNTFN0cmVhbUJ1ZmZlciBhcmUgcHJvdmlkZWQgZm9yCisgKiBzdWNoIGZ1bmN0aW9uYWxpdHkgdGhhdCB1dGlsaXplIFNBWCBhbmQgU3RBWC1iYXNlZCBwcm9jZXNzb3JzLgorICogVGhlIHNhbWUgaW5zdGFuY2Ugb2YgYSBYTUxTdHJlYW1CdWZmZXIgbWF5IGJlIHByb2Nlc3NlZAorICogbXVsdGlwbGUgdGltZXMgYW5kIGNvbmN1cnJlbnRseSBieSBtb3JlIHRoYW4gb25lIHByb2Nlc3Nvci4KKyAqCisgKiA8cD4KKyAqIFRoZXJlIGFyZSB0d28gY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIFhNTFN0cmVhbUJ1ZmZlci4KKyAqIFRoZSBmaXJzdCwge0BsaW5rIE11dGFibGVYTUxTdHJlYW1CdWZmZXJ9LCBjYW4gYmUgaW5zdGFudGlhdGVkIGZvciB0aGUgY3JlYXRpb24KKyAqIG9mIGEgYnVmZmVyIHVzaW5nIFNBWCBhbmQgU3RBWC1iYXNlZCBjcmVhdG9ycywgYW5kIGZyb20gd2hpY2ggbWF5IGJlCisgKiBwcm9jZXNzZWQgYXMgYW4gWE1MU3RyZWFtQnVmZmVyLiBUaGUgc2Vjb25kLAorICoge0BsaW5rIFhNTFN0cmVhbUJ1ZmZlck1hcmt9LCBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIG1hcmsgaW50byBhbiBleGlzdGluZworICogYnVmZmVyIHRoYXQgaXMgYmVpbmcgY3JlYXRlZCBvciBwcm9jZXNzZWQuIFRoaXMgYWxsb3dzIGEgc3VidHJlZSBvZgorICoge0BsaW5rIFhNTFN0cmVhbUJ1ZmZlcn0gdG8gYmUgdHJlYXRlZCBhcyBpdHMgb3duIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9LgorICoKKyAqIDxwPgorICogQSBYTUxTdHJlYW1CdWZmZXIgY2FuIHJlcHJlc2VudCBhIGNvbXBsZXRlIFhNTCBpbmZvc2V0IG9yIGEgc3VidHJlZQorICogb2YgYW4gWE1MIGluZm9zZXQuIEl0IGlzIGFsc28gY2FwYWJsZSBvZiByZXByZXNlbnRpbmcgYSAiZm9yZXN0IiwKKyAqIHdoZXJlIHRoZSBidWZmZXIgcmVwcmVzZW50cyBtdWx0aXBsZSBhZGphY2VudCBYTUwgZWxlbWVudHMsIGFsdGhvdWdoCisgKiBpbiB0aGlzIG1vZGUgdGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBhYm91dCBob3cgeW91IGNhbiBjb25zdW1lIHN1Y2gKKyAqIGZvcmVzdCwgYmVjYXVzZSBub3QgYWxsIFhNTCBBUElzIGhhbmRsZSBmb3Jlc3RzIHZlcnkgd2VsbC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFN0cmVhbUJ1ZmZlciB7CisKKyAgICAvKioKKyAgICAgKiBJbiBzY29wZSBuYW1lc3BhY2VzIG9uIGEgZnJhZ21lbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZyxTdHJpbmc+IF9pbnNjb3BlTmFtZXNwYWNlcyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBidWZmZXIgd2FzIGNyZWF0ZWQgZnJvbSBhIHBhcnNlciB0aGF0IGludGVybnMgU3RyaW5ncworICAgICAqIGFzIHNwZWNpZmllZCBieSB0aGUgU0FYIGludGVybmluZyBmZWF0dXJlcworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIF9oYXNJbnRlcm5lZFN0cmluZ3M7CisKKyAgICAvKioKKyAgICAgKiBGcmFnbWVudGVkIGFycmF5IHRvIGhvbGQgc3RydWN0dXJhbCBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBGcmFnbWVudGVkQXJyYXk8Ynl0ZVtdPiBfc3RydWN0dXJlOworICAgIHByb3RlY3RlZCBpbnQgX3N0cnVjdHVyZVB0cjsKKworICAgIC8qKgorICAgICAqIEZyYWdtZW50ZWQgYXJyYXkgdG8gaG9sZCBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFzIHN0cmluZ3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRnJhZ21lbnRlZEFycmF5PFN0cmluZ1tdPiBfc3RydWN0dXJlU3RyaW5nczsKKyAgICBwcm90ZWN0ZWQgaW50IF9zdHJ1Y3R1cmVTdHJpbmdzUHRyOworCisgICAgLyoqCisgICAgICogRnJhZ21lbnRlZCBhcnJheSB0byBob2xkIGNvbnRlbnQgaW5mb3JtYXRpb24gaW4gYSBzaGFyZWQgY2hhcltdCisgICAgICovCisgICAgcHJvdGVjdGVkIEZyYWdtZW50ZWRBcnJheTxjaGFyW10+IF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlcjsKKyAgICBwcm90ZWN0ZWQgaW50IF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlclB0cjsKKworICAgIC8qKgorICAgICAqIEZyYWdtZW50ZWQgYXJyYXkgdG8gaG9sZCBjb250ZW50IGluZm9ybWF0aW9uIGFzIG9iamVjdHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRnJhZ21lbnRlZEFycmF5PE9iamVjdFtdPiBfY29udGVudE9iamVjdHM7CisgICAgcHJvdGVjdGVkIGludCBfY29udGVudE9iamVjdHNQdHI7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgdHJlZXMgaW4gdGhpcyBzdHJlYW0gYnVmZmVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogMSBpZiB0aGVyZSdzIG9ubHkgb25lLCB3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UuIFdoZW4gdGhlIGJ1ZmZlcgorICAgICAqIGhvbGRzIGEgZm9yZXN0LCB0aGlzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAxLiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5LCB0aGVuIDAuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBOb3RpY2UgdGhhdCB3ZSBjYW5ub3QgaW5mZXIgdGhpcyB2YWx1ZSBieSBsb29raW5nIGF0IHRoZSB7QGxpbmsgRnJhZ21lbnRlZEFycmF5fXMsCisgICAgICogYmVjYXVzZSB0aGlzIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9IG1heWJlIGEgdmlldyBvZiBhIHBvcnRpb24gb2YgYW5vdGhlciBiaWdnZXIKKyAgICAgKiB7QGxpbmsgWE1MU3RyZWFtQnVmZmVyfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHRyZWVDb3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgYnVmZmVyIGNyZWF0ZWQgYnkgY3JlYXRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnVmZmVyIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDcmVhdGVkKCkgeworICAgICAgICByZXR1cm4gX3N0cnVjdHVyZS5nZXRBcnJheSgpWzBdICE9IEFic3RyYWN0Q3JlYXRvclByb2Nlc3Nvci5UX0VORDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgYnVmZmVyIGEgcmVwcmVzZW50YXRpb24gb2YgYSBmcmFnbWVudCBvZiBhbiBYTUwgaW5mb3NldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnVmZmVyIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBmcmFnbWVudAorICAgICAqIG9mIGFuIFhNTCBpbmZvc2V0LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiAoaXNDcmVhdGVkKCkgJiYgKF9zdHJ1Y3R1cmUuZ2V0QXJyYXkoKVtfc3RydWN0dXJlUHRyXSAmIEFic3RyYWN0Q3JlYXRvclByb2Nlc3Nvci5UWVBFX01BU0spCisgICAgICAgICAgICAgICAgIT0gQWJzdHJhY3RDcmVhdG9yUHJvY2Vzc29yLlRfRE9DVU1FTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZSBidWZmZXIgYSByZXByZXNlbnRhdGlvbiBvZiBhIGZyYWdtZW50IG9mIGFuIFhNTCBpbmZvc2V0CisgICAgICogdGhhdCBpcyBhbiBlbGVtZW50IChhbmQgaXRzIGNvbnRlbnRzKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnVmZmVyIGEgcmVwcmVzZW50YXRpb24KKyAgICAgKiBvZiBhIGZyYWdtZW50IG9mIGFuIFhNTCBpbmZvc2V0IHRoYXQgaXMgYW4gZWxlbWVudCAoYW5kIGl0cyBjb250ZW50cykuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFbGVtZW50RnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiAoaXNDcmVhdGVkKCkgJiYgKF9zdHJ1Y3R1cmUuZ2V0QXJyYXkoKVtfc3RydWN0dXJlUHRyXSAmIEFic3RyYWN0Q3JlYXRvclByb2Nlc3Nvci5UWVBFX01BU0spCisgICAgICAgICAgICAgICAgPT0gQWJzdHJhY3RDcmVhdG9yUHJvY2Vzc29yLlRfRUxFTUVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0dXJlIGlmIHRoaXMgYnVmZmVyIHJlcHJlc2VudHMgYSBmb3Jlc3QsIHdoaWNoIGlzCisgICAgICogYXJlIG1vcmUgdGhhbiBvbmUgYWRqYWNlbnQgWE1MIGVsZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRm9yZXN0KCkgeworICAgICAgICByZXR1cm4gaXNDcmVhdGVkKCkgJiYgdHJlZUNvdW50PjE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzeXN0ZW0gaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN5c3RlbUlkKCkgeworICAgICAgICByZXR1cm4gc3lzdGVtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbi1zY29wZSBuYW1lc3BhY2VzLgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBUaGUgaW4tc2NvcGUgbmFtZXNwYWNlcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBidWZmZXIgaXMgbm90IGEKKyAgICAgKiBmcmFnbWVudCAoe0BsaW5rICNpc0ZyYWdtZW50fSByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPikuCisgICAgICoKKyAgICAgKiBUaGUgaW4tc2NvcGUgbmFtZXNwYWNlIHdpbGwgY29ycmVzcG9uZCB0byB0aGUgaW4tc2NvcGUgbmFtZXNwYWNlcyBvZiB0aGUKKyAgICAgKiBmcmFnbWVudCBpZiB0aGUgYnVmZmVyIGlzIGEgZnJhZ21lbnQgKHtAbGluayAjaXNGcmFnbWVudH0KKyAgICAgKiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPikuIFRoZSBpbi1zY29wZSBuYW1lc3BhY2VzIHdpbGwgaW5jbHVkZSBhbnkKKyAgICAgKiBuYW1lc3BhY2UgZGVsY2FyYXRpb25zIG9uIGFuIGVsZW1lbnQgaWYgdGhlIGZyYWdtZW50IGNvcnJlc3BvbmQgdG8gdGhhdAorICAgICAqIG9mIGFuIGVsZW1lbnQgKHtAbGluayAjaXNFbGVtZW50RnJhZ21lbnR9IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+KS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSBpbi1zY29wZSBuYW1lc3BhY2VzIG9mIHRoZSBYTUxTdHJlYW1CdWZmZXIuCisgICAgICogICAgICBQcmVmaXggdG8gbmFtZXNwYWNlIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IGdldEluc2NvcGVOYW1lc3BhY2VzKCkgeworICAgICAgICByZXR1cm4gX2luc2NvcGVOYW1lc3BhY2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgYnVmZmVyIGJlZW4gY3JlYXRlZCB1c2luZyBTdHJpbmdzIHRoYXQgaGF2ZSBiZWVuIGludGVybmVkCisgICAgICogZm9yIGNlcnRhaW4gcHJvcGVydGllcyBvZiBpbmZvcm1hdGlvbiBpdGVtcy4gVGhlIFN0cmluZ3MgdGhhdCBhcmUgaW50ZXJuZWQKKyAgICAgKiBhcmUgdGhvc2UgdGhhdCBjb3JyZXNwb25kIHRvIFN0cmluZ3MgdGhhdCBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBTQVggQVBJCisgICAgICogInN0cmluZy1pbnRlcm5pbmciIHByb3BlcnR5CisgICAgICogKHNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9hcGkvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiI+aGVyZTwvYT4pLgorICAgICAqCisgICAgICogPHA+CisgICAgICogQW4gYnVmZmVyIG1heSBoYXZlIGJlZW4gY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGZyb20gYW4gWE1MIGRvY3VtZW50IHBhcnNlZAorICAgICAqIHVzaW5nIHRoZSBYZXJjZXMgU0FYIHBhcnNlci4gVGhlIFhlcmNlcyBTQVggcGFyc2VyIHdpbGwgaGF2ZSBpbnRlcm5lZCBjZXJ0YWluIFN0cmluZ3MKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIFNBWCBzdHJpbmcgaW50ZXJuaW5nIHByb3BlcnR5LgorICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgcHJvY2Vzc29ycyB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24gb2YKKyAgICAgKiBTdHJpbmcgaW50ZXJuaW5nIGlmIHN1Y2ggYSBmZWF0dXJlIGlzIHJlcXVpcmVkIGJ5IGEgcHJvY2VzaW5nIGFwcGxpY2F0aW9uIGFuZCB0aGUKKyAgICAgKiBidWZmZXIgYmVpbmcgcHJvY2Vzc2VkIHdhcyBjcmVhdGVkIHVzaW5nIFN0cmluZ3MgdGhhdCBoYXZlIGJlZW4gaW50ZXJuZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBjcmVhdGVkIHVzaW5nIFN0cmluZ3MgdGhhdAorICAgICAqIGhhdmUgYmVlbiBpbnRlcm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNJbnRlcm5lZFN0cmluZ3MoKSB7CisgICAgICAgIHJldHVybiBfaGFzSW50ZXJuZWRTdHJpbmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgYXMgYSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiBBIGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIFN0cmVhbVJlYWRlckJ1ZmZlclByb2Nlc3Nvcn0uIEFsd2F5cyBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyZWFtUmVhZGVyQnVmZmVyUHJvY2Vzc29yIHJlYWRBc1hNTFN0cmVhbVJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVJlYWRlckJ1ZmZlclByb2Nlc3Nvcih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciB0byBhbiBYTUxTdHJlYW1Xcml0ZXIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgWE1MU3RyZWFtQnVmZmVyIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gdGhlIFhNTFN0cmVhbVdyaXRlciB1c2luZworICAgICAqIGFuIGluc3RhbmNlIG9mIHtAbGluayBTdHJlYW1Xcml0ZXJCdWZmZXJQcm9jZXNzb3J9LgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqICAgICAgQSBYTUxTdHJlYW1Xcml0ZXIgdG8gd3JpdGUgdG8uCisgICAgICogQHBhcmFtIHdyaXRlQXNGcmFnbWVudAorICAgICAqICAgICAgSWYgdHJ1ZSwge0BsaW5rIFhNTFN0cmVhbVdyaXRlcn0gd2lsbCBub3QgcmVjZWl2ZSB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyI3dyaXRlU3RhcnREb2N1bWVudCgpfQorICAgICAqICAgICAgbm9yIHtAbGluayBYTUxTdHJlYW1Xcml0ZXIjd3JpdGVFbmREb2N1bWVudCgpfS4gVGhpcyBpcyBkZXNpcmFibGUgYmVoYXZpb3Igd2hlbgorICAgICAqICAgICAgeW91IGFyZSB3cml0aW5nIHRoZSBjb250ZW50cyBvZiBhIGJ1ZmZlciBpbnRvIGEgYmlnZ2VyIGRvY3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9YTUxTdHJlYW1Xcml0ZXIoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgYm9vbGVhbiB3cml0ZUFzRnJhZ21lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBTdHJlYW1Xcml0ZXJCdWZmZXJQcm9jZXNzb3IgcCA9IG5ldyBTdHJlYW1Xcml0ZXJCdWZmZXJQcm9jZXNzb3IodGhpcyx3cml0ZUFzRnJhZ21lbnQpOworICAgICAgICBwLnByb2Nlc3Mod3JpdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVXNlIHtAbGluayAjd3JpdGVUb1hNTFN0cmVhbVdyaXRlcihYTUxTdHJlYW1Xcml0ZXIsIGJvb2xlYW4pfQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9YTUxTdHJlYW1Xcml0ZXIoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlVG9YTUxTdHJlYW1Xcml0ZXIod3JpdGVyLCB0aGlzLmlzRnJhZ21lbnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgZnJvbSBhIHtAbGluayBYTUxSZWFkZXJ9LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqIEEgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgU0FYQnVmZmVyUHJvY2Vzc29yfS4KKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVXNlIHtAbGluayAjcmVhZEFzWE1MUmVhZGVyKGJvb2xlYW4pfQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTQVhCdWZmZXJQcm9jZXNzb3IgcmVhZEFzWE1MUmVhZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IFNBWEJ1ZmZlclByb2Nlc3Nvcih0aGlzLGlzRnJhZ21lbnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgZnJvbSBhIHtAbGluayBYTUxSZWFkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIHByb2R1Y2VGcmFnbWVudEV2ZW50CisgICAgICogICAgICBUcnVlIHRvIGdlbmVyYXRlIGZyYWdtZW50IFNBWCBldmVudHMgd2l0aG91dCBzdGFydC9lbmREb2N1bWVudC4KKyAgICAgKiAgICAgIEZhbHNlIHRvIGdlbmVyYXRlIGEgZnVsbCBkb2N1bWVudCBTQVggZXZlbnRzLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIEEgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgU0FYQnVmZmVyUHJvY2Vzc29yfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU0FYQnVmZmVyUHJvY2Vzc29yIHJlYWRBc1hNTFJlYWRlcihib29sZWFuIHByb2R1Y2VGcmFnbWVudEV2ZW50KSB7CisgICAgICAgIHJldHVybiBuZXcgU0FYQnVmZmVyUHJvY2Vzc29yKHRoaXMscHJvZHVjZUZyYWdtZW50RXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHRvIGEge0BsaW5rIENvbnRlbnRIYW5kbGVyfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSA8Y29kZT5oYW5kbGVyPC9jb2RlPiBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIG90aGVyIFNBWC1iYXNlZAorICAgICAqIGhhbmRsZXJzLCBzdWNoIGFzIHtAbGluayBMZXhpY2FsSGFuZGxlcn0sIHRoYW4gY29ycmVzcG9uZGluZyBTQVggZXZlbnRzCisgICAgICogd2lsbCBiZSByZXBvcnRlZCB0byB0aG9zZSBoYW5kbGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyCisgICAgICogICAgICBUaGUgQ29udGVudEhhbmRsZXIgdG8gcmVjZWl2ZSBTQVggZXZlbnRzLgorICAgICAqIEBwYXJhbSBwcm9kdWNlRnJhZ21lbnRFdmVudAorICAgICAqICAgICAgVHJ1ZSB0byBnZW5lcmF0ZSBmcmFnbWVudCBTQVggZXZlbnRzIHdpdGhvdXQgc3RhcnQvZW5kRG9jdW1lbnQuCisgICAgICogICAgICBGYWxzZSB0byBnZW5lcmF0ZSBhIGZ1bGwgZG9jdW1lbnQgU0FYIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICogICAgICBpZiBhIHBhcnNpbmcgZmFpbHMsIG9yIGlmIHtAbGluayBDb250ZW50SGFuZGxlcn0gdGhyb3dzIGEge0BsaW5rIFNBWEV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUbyhDb250ZW50SGFuZGxlciBoYW5kbGVyLCBib29sZWFuIHByb2R1Y2VGcmFnbWVudEV2ZW50KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgU0FYQnVmZmVyUHJvY2Vzc29yIHAgPSByZWFkQXNYTUxSZWFkZXIocHJvZHVjZUZyYWdtZW50RXZlbnQpOworICAgICAgICBwLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOworICAgICAgICBpZiAocCBpbnN0YW5jZW9mIExleGljYWxIYW5kbGVyKSB7CisgICAgICAgICAgICBwLnNldExleGljYWxIYW5kbGVyKChMZXhpY2FsSGFuZGxlciloYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocCBpbnN0YW5jZW9mIERUREhhbmRsZXIpIHsKKyAgICAgICAgICAgIHAuc2V0RFRESGFuZGxlcigoRFRESGFuZGxlciloYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocCBpbnN0YW5jZW9mIEVycm9ySGFuZGxlcikgeworICAgICAgICAgICAgcC5zZXRFcnJvckhhbmRsZXIoKEVycm9ySGFuZGxlciloYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgICBwLnByb2Nlc3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVXNlIHtAbGluayAjd3JpdGVUbyhDb250ZW50SGFuZGxlcixib29sZWFuKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB3cml0ZVRvKGhhbmRsZXIsaXNGcmFnbWVudCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciB0byBhIHtAbGluayBDb250ZW50SGFuZGxlcn0gd2l0aCBlcnJvcnMKKyAgICAgKiByZXBvcnQgdG8gYSB7QGxpbmsgRXJyb3JIYW5kbGVyfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSA8Y29kZT5oYW5kbGVyPC9jb2RlPiBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIG90aGVyIFNBWC1iYXNlZAorICAgICAqIGhhbmRsZXJzLCBzdWNoIGFzIHtAbGluayBMZXhpY2FsSGFuZGxlcn0sIHRoYW4gY29ycmVzcG9uZGluZyBTQVggZXZlbnRzCisgICAgICogd2lsbCBiZSByZXBvcnRlZCB0byB0aG9zZSBoYW5kbGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyCisgICAgICogVGhlIENvbnRlbnRIYW5kbGVyIHRvIHJlY2VpdmUgU0FYIGV2ZW50cy4KKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyCisgICAgICogVGhlIEVycm9ySGFuZGxlciB0byByZWNlaXZlIGVycm9yIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICogICAgICBpZiBhIHBhcnNpbmcgZmFpbHMgYW5kIHtAbGluayBFcnJvckhhbmRsZXJ9IHRocm93cyBhIHtAbGluayBTQVhFeGNlcHRpb259LAorICAgICAqICAgICAgb3IgaWYge0BsaW5rIENvbnRlbnRIYW5kbGVyfSB0aHJvd3MgYSB7QGxpbmsgU0FYRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIGJvb2xlYW4gcHJvZHVjZUZyYWdtZW50RXZlbnQpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTQVhCdWZmZXJQcm9jZXNzb3IgcCA9IHJlYWRBc1hNTFJlYWRlcihwcm9kdWNlRnJhZ21lbnRFdmVudCk7CisgICAgICAgIHAuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7CisgICAgICAgIGlmIChwIGluc3RhbmNlb2YgTGV4aWNhbEhhbmRsZXIpIHsKKyAgICAgICAgICAgIHAuc2V0TGV4aWNhbEhhbmRsZXIoKExleGljYWxIYW5kbGVyKWhhbmRsZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChwIGluc3RhbmNlb2YgRFRESGFuZGxlcikgeworICAgICAgICAgICAgcC5zZXREVERIYW5kbGVyKChEVERIYW5kbGVyKWhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgcC5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKKworICAgICAgICBwLnByb2Nlc3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB3cml0ZVRvKGhhbmRsZXIsIGVycm9ySGFuZGxlciwgaXNGcmFnbWVudCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lckZhY3RvcnkgdHJuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFzIERPTSBub2RlIGFuZCBhcHBlbmQgdGhhdCB0byB0aGUgZ2l2ZW4gbm9kZS4KKyAgICAgKgorICAgICAqIEZhc3RlciBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZSBkZXNpcmFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBUaGUgbmV3bHkgYWRkZWQgY2hpbGQgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTm9kZSB3cml0ZVRvKE5vZGUgbikgdGhyb3dzIFhNTFN0cmVhbUJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0ID0gdHJuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgICAgICAgIHQudHJhbnNmb3JtKG5ldyBYTUxTdHJlYW1CdWZmZXJTb3VyY2UodGhpcyksIG5ldyBET01SZXN1bHQobikpOworICAgICAgICAgICAgcmV0dXJuIG4uZ2V0TGFzdENoaWxkKCk7CisgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1CdWZmZXJFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYnVmZmVyIGZyb20gYSBYTUxTdHJlYW1SZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICogQSBYTUxTdHJlYW1SZWFkZXIgdG8gcmVhZCBmcm9tIHRvIGNyZWF0ZS4KKyAgICAgKiBAcmV0dXJuIFhNTFN0cmVhbUJ1ZmZlciB0aGUgY3JlYXRlZCBidWZmZXIKKyAgICAgKiBAc2VlIE11dGFibGVYTUxTdHJlYW1CdWZmZXIjY3JlYXRlRnJvbVhNTFN0cmVhbVJlYWRlcihYTUxTdHJlYW1SZWFkZXIpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1CdWZmZXIgY3JlYXRlTmV3QnVmZmVyRnJvbVhNTFN0cmVhbVJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKQorICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgYiA9IG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCk7CisgICAgICAgIGIuY3JlYXRlRnJvbVhNTFN0cmVhbVJlYWRlcihyZWFkZXIpOworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYnVmZmVyIGZyb20gYSB7QGxpbmsgWE1MUmVhZGVyfSBhbmQge0BsaW5rIElucHV0U3RyZWFtfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiBUaGUge0BsaW5rIFhNTFJlYWRlcn0gdG8gdXNlIGZvciBwYXJzaW5nLgorICAgICAqIEBwYXJhbSBpbgorICAgICAqIFRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IHRvIGJlIHBhcnNlZC4KKyAgICAgKiBAcmV0dXJuIFhNTFN0cmVhbUJ1ZmZlciB0aGUgY3JlYXRlZCBidWZmZXIKKyAgICAgKiBAc2VlIE11dGFibGVYTUxTdHJlYW1CdWZmZXIjY3JlYXRlRnJvbVhNTFJlYWRlcihYTUxSZWFkZXIsIElucHV0U3RyZWFtKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtQnVmZmVyIGNyZWF0ZU5ld0J1ZmZlckZyb21YTUxSZWFkZXIoWE1MUmVhZGVyIHJlYWRlciwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBiID0gbmV3IE11dGFibGVYTUxTdHJlYW1CdWZmZXIoKTsKKyAgICAgICAgYi5jcmVhdGVGcm9tWE1MUmVhZGVyKHJlYWRlciwgaW4pOworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYnVmZmVyIGZyb20gYSB7QGxpbmsgWE1MUmVhZGVyfSBhbmQge0BsaW5rIElucHV0U3RyZWFtfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiBUaGUge0BsaW5rIFhNTFJlYWRlcn0gdG8gdXNlIGZvciBwYXJzaW5nLgorICAgICAqIEBwYXJhbSBpbgorICAgICAqIFRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IHRvIGJlIHBhcnNlZC4KKyAgICAgKiBAcGFyYW0gc3lzdGVtSWQKKyAgICAgKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHJldHVybiBYTUxTdHJlYW1CdWZmZXIgdGhlIGNyZWF0ZWQgYnVmZmVyCisgICAgICogQHNlZSBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyI2NyZWF0ZUZyb21YTUxSZWFkZXIoWE1MUmVhZGVyLCBJbnB1dFN0cmVhbSwgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtQnVmZmVyIGNyZWF0ZU5ld0J1ZmZlckZyb21YTUxSZWFkZXIoWE1MUmVhZGVyIHJlYWRlciwgSW5wdXRTdHJlYW0gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBiID0gbmV3IE11dGFibGVYTUxTdHJlYW1CdWZmZXIoKTsKKyAgICAgICAgYi5jcmVhdGVGcm9tWE1MUmVhZGVyKHJlYWRlciwgaW4sIHN5c3RlbUlkKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIEZyYWdtZW50ZWRBcnJheTxieXRlW10+IGdldFN0cnVjdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIF9zdHJ1Y3R1cmU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBnZXRTdHJ1Y3R1cmVQdHIoKSB7CisgICAgICAgIHJldHVybiBfc3RydWN0dXJlUHRyOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBGcmFnbWVudGVkQXJyYXk8U3RyaW5nW10+IGdldFN0cnVjdHVyZVN0cmluZ3MoKSB7CisgICAgICAgIHJldHVybiBfc3RydWN0dXJlU3RyaW5nczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGdldFN0cnVjdHVyZVN0cmluZ3NQdHIoKSB7CisgICAgICAgIHJldHVybiBfc3RydWN0dXJlU3RyaW5nc1B0cjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgRnJhZ21lbnRlZEFycmF5PGNoYXJbXT4gZ2V0Q29udGVudENoYXJhY3RlcnNCdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBfY29udGVudENoYXJhY3RlcnNCdWZmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBnZXRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlclB0cigpIHsKKyAgICAgICAgcmV0dXJuIF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlclB0cjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgRnJhZ21lbnRlZEFycmF5PE9iamVjdFtdPiBnZXRDb250ZW50T2JqZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIF9jb250ZW50T2JqZWN0czsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGdldENvbnRlbnRPYmplY3RzUHRyKCkgeworICAgICAgICByZXR1cm4gX2NvbnRlbnRPYmplY3RzUHRyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvWE1MU3RyZWFtQnVmZmVyRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL1hNTFN0cmVhbUJ1ZmZlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzFlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL1hNTFN0cmVhbUJ1ZmZlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlcjsKKworcHVibGljIGNsYXNzIFhNTFN0cmVhbUJ1ZmZlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgWE1MU3RyZWFtQnVmZmVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1CdWZmZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGUpOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1CdWZmZXJFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgc3VwZXIoZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9YTUxTdHJlYW1CdWZmZXJNYXJrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL1hNTFN0cmVhbUJ1ZmZlck1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmZjNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9YTUxTdHJlYW1CdWZmZXJNYXJrLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBIG1hcmsgaW50byBhIGJ1ZmZlci4KKyAqCisgKiA8cD4KKyAqIEEgbWFyayBjYW4gYmUgcHJvY2Vzc2VkIGluIHRoZSBzYW1lIG1hbm5lciBhcyBhIFhNTFN0cmVhbUJ1ZmZlci4KKyAqCisgKiA8cD4KKyAqIEEgbWFyayB3aWxsIHNoYXJlIGEgc3ViIHNldCBvZiBpbmZvcm1hdGlvbiBvZiB0aGUgYnVmZmVyIHRoYXQgaXMKKyAqIG1hcmtlZC4gSWYgdGhlIGJ1ZmZlciBpcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCBhCisgKiAobXV0YWJsZSkge0BsaW5rIFhNTFN0cmVhbUJ1ZmZlcn0gd2hpY2ggaXMgcmVzZXQgYW5kL29yIHJlLWNyZWF0ZWQKKyAqIHRoZW4gdGhpcyB3aWxsIGludmFsaWRhdGUgdGhlIG1hcmsgYW5kIHByb2Nlc3NpbmcgYmVodmFpb3VyIG9mIHRoZSBtYXJrCisgKiBpcyB1bmRlZmluZWQuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgYXBwbGljYXRpb24gdG8gbWFuYWdlIHRoZQorICogcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG1hcmtlZCBYTUxTdHJlYW1CdWZmZXIgYW5kIG9uZSBvciBtb3JlIG1hcmtzLgorICovCitwdWJsaWMgY2xhc3MgWE1MU3RyZWFtQnVmZmVyTWFyayBleHRlbmRzIFhNTFN0cmVhbUJ1ZmZlciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBtYXJrIGZyb20gdGhlIGJ1ZmZlciB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIG1hcmsgd2lsbCBiZSBjcmVhdGVkIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgY3JlYXRpb24gb2YgdGhlCisgICAgICoge0BsaW5rIFhNTFN0cmVhbUJ1ZmZlcn0gdGhhdCBpcyBiZWluZyBjcmVhdGVkIGJ5IGEge0BsaW5rIEFic3RyYWN0Q3JlYXRvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zY29wZU5hbWVzcGFjZXMKKyAgICAgKiBUaGUgaW4tc2NvcGUgbmFtZXNwYWNlcyBvbiB0aGUgZnJhZ21lbnQgb2YgWE1MIGluZm9zZXQgdGhhdCBpcworICAgICAqIHRvIGJlIG1hcmtlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiBUaGUge0BsaW5rIEFic3RyYWN0Q3JlYXRvcn0gb3Ige0BsaW5rIEFic3RyYWN0UHJvY2Vzc29yfSBmcm9tIHdoaWNoIHRoZSBjdXJyZW50CisgICAgICogcG9zaXRpb24gb2YgY3JlYXRpb24gb2YgdGhlIFhNTFN0cmVhbUJ1ZmZlciB3aWxsIGJlIHRha2VuIGFzIHRoZSBtYXJrLgorICAgICAqLworICAgIHB1YmxpYyBYTUxTdHJlYW1CdWZmZXJNYXJrKE1hcDxTdHJpbmcsU3RyaW5nPiBpbnNjb3BlTmFtZXNwYWNlcywgQWJzdHJhY3RDcmVhdG9yUHJvY2Vzc29yIHNyYykgeworICAgICAgICBfaW5zY29wZU5hbWVzcGFjZXMgPSBpbnNjb3BlTmFtZXNwYWNlczsKKworICAgICAgICBfc3RydWN0dXJlID0gc3JjLl9jdXJyZW50U3RydWN0dXJlRnJhZ21lbnQ7CisgICAgICAgIF9zdHJ1Y3R1cmVQdHIgPSBzcmMuX3N0cnVjdHVyZVB0cjsKKworICAgICAgICBfc3RydWN0dXJlU3RyaW5ncyA9IHNyYy5fY3VycmVudFN0cnVjdHVyZVN0cmluZ0ZyYWdtZW50OworICAgICAgICBfc3RydWN0dXJlU3RyaW5nc1B0ciA9IHNyYy5fc3RydWN0dXJlU3RyaW5nc1B0cjsKKworICAgICAgICBfY29udGVudENoYXJhY3RlcnNCdWZmZXIgPSBzcmMuX2N1cnJlbnRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlckZyYWdtZW50OworICAgICAgICBfY29udGVudENoYXJhY3RlcnNCdWZmZXJQdHIgPSBzcmMuX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyUHRyOworCisgICAgICAgIF9jb250ZW50T2JqZWN0cyA9IHNyYy5fY3VycmVudENvbnRlbnRPYmplY3RGcmFnbWVudDsKKyAgICAgICAgX2NvbnRlbnRPYmplY3RzUHRyID0gc3JjLl9jb250ZW50T2JqZWN0c1B0cjsKKyAgICAgICAgdHJlZUNvdW50ID0gMTsgLy8gVE9ETzogZGVmaW5lIGEgd2F5IHRvIGNyZWF0ZSBhIG1hcmsgb3ZlciBhIGZvcmVzdAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvWE1MU3RyZWFtQnVmZmVyUmVzdWx0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL1hNTFN0cmVhbUJ1ZmZlclJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDkwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL1hNTFN0cmVhbUJ1ZmZlclJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLnNheC5TQVhCdWZmZXJDcmVhdG9yOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFJlc3VsdDsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7CisKKy8qKgorICogQSBKQVhQIFJlc3VsdCBpbXBsZW1lbnRhdGlvbiB0aGF0IHN1cHBvcnRzIHRoZSBzZXJpYWxpemF0aW9uIHRvIGFuCisgKiB7QGxpbmsgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcn0gZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgdGhhdCBleHBlY3QgYSBSZXN1bHQuCisgKgorICogPHA+CisgKiBSZXVzZSBvZiBhIFhNTFN0cmVhbUJ1ZmZlclJlc3VsdCBtb3JlIHRoYW4gb25jZSB3aWxsIHJlcXVpcmUgdGhhdCB0aGUKKyAqIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgaXMgcmVzZXQgYnkgY2FsbGVkCisgKiB7QGxpbmsgIy5nZXRYTUxTdHJlYW1CdWZmZXIoKX0ucmVzZXQoKSwgb3IgYnkgY2FsbGluZworICoge0BsaW5rICMuc2V0WE1MU3RyZWFtQnVmZmVyKCl9IHdpdGggYSBuZXcgaW5zdGFuY2Ugb2YKKyAqIHtAbGluayBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyfS4KKyAqCisgKiA8cD4KKyAqIFRoZSBkZXJpdmF0aW9uIG9mIFhNTFN0cmVhbUJ1ZmZlclJlc3VsdCBmcm9tIFNBWFJlc3VsdCBpcyBhbiBpbXBsZW1lbnRhdGlvbgorICogZGV0YWlsLgorICoKKyAqIDxwPkdlbmVyYWwgYXBwbGljYXRpb25zIHNoYWxsIG5vdCBjYWxsIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAqIDx1bD4KKyAqIDxsaT5zZXRIYW5kbGVyPC9saT4KKyAqIDxsaT5zZXRMZXhpY2FsSGFuZGxlcjwvbGk+CisgKiA8bGk+c2V0U3lzdGVtSWQ8L2xpPgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIFhNTFN0cmVhbUJ1ZmZlclJlc3VsdCBleHRlbmRzIFNBWFJlc3VsdCB7CisgICAgcHJvdGVjdGVkIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgX2J1ZmZlcjsKKyAgICBwcm90ZWN0ZWQgU0FYQnVmZmVyQ3JlYXRvciBfYnVmZmVyQ3JlYXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IFhNTFN0cmVhbUJ1ZmZlclJlc3VsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEEge0BsaW5rIE11dGFibGVYTUxTdHJlYW1CdWZmZXJ9IGlzIGluc3RhbnRpYXRlZCBhbmQgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyZWFtQnVmZmVyUmVzdWx0KCkgeworICAgICAgICBzZXRYTUxTdHJlYW1CdWZmZXIobmV3IE11dGFibGVYTUxTdHJlYW1CdWZmZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWE1MU3RyZWFtQnVmZmVyUmVzdWx0IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciB0aGUge0BsaW5rIE11dGFibGVYTUxTdHJlYW1CdWZmZXJ9IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyZWFtQnVmZmVyUmVzdWx0KE11dGFibGVYTUxTdHJlYW1CdWZmZXIgYnVmZmVyKSB7CisgICAgICAgIHNldFhNTFN0cmVhbUJ1ZmZlcihidWZmZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIE11dGFibGVYTUxTdHJlYW1CdWZmZXJ9IHRoYXQgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBnZXRYTUxTdHJlYW1CdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBfYnVmZmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUge0BsaW5rIE11dGFibGVYTUxTdHJlYW1CdWZmZXJ9IHRvIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIHtAbGluayBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYTUxTdHJlYW1CdWZmZXIoTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImJ1ZmZlciBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIF9idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHNldFN5c3RlbUlkKF9idWZmZXIuZ2V0U3lzdGVtSWQoKSk7CisKKyAgICAgICAgaWYgKF9idWZmZXJDcmVhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9idWZmZXJDcmVhdG9yLnNldFhNTFN0cmVhbUJ1ZmZlcihfYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRIYW5kbGVyKCkgeworICAgICAgICBpZiAoX2J1ZmZlckNyZWF0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgX2J1ZmZlckNyZWF0b3IgPSBuZXcgU0FYQnVmZmVyQ3JlYXRvcihfYnVmZmVyKTsKKyAgICAgICAgICAgIHNldEhhbmRsZXIoX2J1ZmZlckNyZWF0b3IpOworICAgICAgICB9IGVsc2UgaWYgKHN1cGVyLmdldEhhbmRsZXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRIYW5kbGVyKF9idWZmZXJDcmVhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfYnVmZmVyQ3JlYXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgTGV4aWNhbEhhbmRsZXIgZ2V0TGV4aWNhbEhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiAoTGV4aWNhbEhhbmRsZXIpIGdldEhhbmRsZXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL1hNTFN0cmVhbUJ1ZmZlclNvdXJjZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9YTUxTdHJlYW1CdWZmZXJTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjgzMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9YTUxTdHJlYW1CdWZmZXJTb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zYXguU0FYQnVmZmVyUHJvY2Vzc29yOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKKworLyoqCisgKiBBIEpBWFAgU291cmNlIGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydHMgdGhlIHBhcnNpbmcKKyAqIG9mIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9IGZvciB1c2UgYnkgYXBwbGljYXRpb25zIHRoYXQgZXhwZWN0IGEgU291cmNlLgorICoKKyAqIDxwPgorICogVGhlIGRlcml2YXRpb24gb2YgWE1MU3RyZWFtQnVmZmVyU291cmNlIGZyb20gU0FYU291cmNlIGlzIGFuIGltcGxlbWVudGF0aW9uCisgKiBkZXRhaWwuCisgKgorICogPHA+QXBwbGljYXRpb25zIHNoYWxsIG9iZXkgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKiA8dWw+CisgKiA8bGk+VGhlIHNldFhNTFJlYWRlciBhbmQgc2V0SW5wdXRTb3VyY2Ugc2hhbGwgbm90IGJlIGNhbGxlZC48L2xpPgorICogPGxpPlRoZSBYTUxSZWFkZXIgb2JqZWN0IG9idGFpbmVkIGJ5IHRoZSBnZXRYTUxSZWFkZXIgbWV0aG9kIHNoYWxsCisgKiAgICAgYmUgdXNlZCBvbmx5IGZvciBwYXJzaW5nIHRoZSBJbnB1dFNvdXJjZSBvYmplY3QgcmV0dXJuZWQgYnkKKyAqICAgICB0aGUgZ2V0SW5wdXRTb3VyY2UgbWV0aG9kLjwvbGk+CisgKiA8bGk+VGhlIElucHV0U291cmNlIG9iamVjdCBvYnRhaW5lZCBieSB0aGUgZ2V0SW5wdXRTb3VyY2UgbWV0aG9kIHNoYWxsCisgKiAgICAgYmUgdXNlZCBvbmx5IGZvciBiZWluZyBwYXJzZWQgYnkgdGhlIFhNTFJlYWRlciBvYmplY3QgcmV0dXJuZWQgYnkKKyAqICAgICB0aGUgZ2V0WE1MUmVhZGVyIG1ldGhvZC48L2xpPgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIFhNTFN0cmVhbUJ1ZmZlclNvdXJjZSBleHRlbmRzIFNBWFNvdXJjZSB7CisgICAgcHJvdGVjdGVkIFhNTFN0cmVhbUJ1ZmZlciBfYnVmZmVyOworICAgIHByb3RlY3RlZCBTQVhCdWZmZXJQcm9jZXNzb3IgX2J1ZmZlclByb2Nlc3NvcjsKKworICAgIC8qKgorICAgICAqIFhNTFN0cmVhbUJ1ZmZlclNvdXJjZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyZWFtQnVmZmVyU291cmNlKFhNTFN0cmVhbUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgc3VwZXIobmV3IElucHV0U291cmNlKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpKTsKKyAgICAgICAgc2V0WE1MU3RyZWFtQnVmZmVyKGJ1ZmZlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgWE1MU3RyZWFtQnVmZmVyfSB0aGF0IGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgWE1MU3RyZWFtQnVmZmVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyZWFtQnVmZmVyIGdldFhNTFN0cmVhbUJ1ZmZlcigpIHsKKyAgICAgICAgcmV0dXJuIF9idWZmZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB7QGxpbmsgWE1MU3RyZWFtQnVmZmVyfSB0byB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIHRoZSB7QGxpbmsgWE1MU3RyZWFtQnVmZmVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYTUxTdHJlYW1CdWZmZXIoWE1MU3RyZWFtQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYnVmZmVyIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgX2J1ZmZlciA9IGJ1ZmZlcjsKKworICAgICAgICBpZiAoX2J1ZmZlclByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICBfYnVmZmVyUHJvY2Vzc29yLnNldEJ1ZmZlcihfYnVmZmVyLGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBYTUxSZWFkZXIgZ2V0WE1MUmVhZGVyKCkgeworICAgICAgICBpZiAoX2J1ZmZlclByb2Nlc3NvciA9PSBudWxsKSB7CisgICAgICAgICAgICBfYnVmZmVyUHJvY2Vzc29yID0gbmV3IFNBWEJ1ZmZlclByb2Nlc3NvcihfYnVmZmVyLGZhbHNlKTsKKyAgICAgICAgICAgIHNldFhNTFJlYWRlcihfYnVmZmVyUHJvY2Vzc29yKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdXBlci5nZXRYTUxSZWFkZXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRYTUxSZWFkZXIoX2J1ZmZlclByb2Nlc3Nvcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX2J1ZmZlclByb2Nlc3NvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3NheC9EZWZhdWx0V2l0aExleGljYWxIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3NheC9EZWZhdWx0V2l0aExleGljYWxIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5YjAzNgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc2F4L0RlZmF1bHRXaXRoTGV4aWNhbEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuc2F4OworCitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdFdpdGhMZXhpY2FsSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgTGV4aWNhbEhhbmRsZXIgeworCisgICAgcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RFREKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KKworICAgIHB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24geyB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KKworICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3NheC9GZWF0dXJlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zYXgvRmVhdHVyZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA1ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zYXgvRmVhdHVyZXMuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuc2F4OworCitwdWJsaWMgY2xhc3MgRmVhdHVyZXMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRSA9CisgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1BSRUZJWEVTX0ZFQVRVUkUgPQorICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfR0VORVJBTF9FTlRJVElFUyA9CisgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtZ2VuZXJhbC1lbnRpdGllcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUSUVTID0KKyAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1wYXJhbWV0ZXItZW50aXRpZXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19JTlRFUk5JTkdfRkVBVFVSRSA9CisgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvc3RyaW5nLWludGVybmluZyI7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3NheC9Qcm9wZXJ0aWVzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3NheC9Qcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5NmIzNgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc2F4L1Byb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuc2F4OworCitwdWJsaWMgY2xhc3MgUHJvcGVydGllcyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZID0KKyAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zYXgvU0FYQnVmZmVyQ3JlYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zYXgvU0FYQnVmZmVyQ3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZmU3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3NheC9TQVhCdWZmZXJDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zYXg7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLkFic3RyYWN0Q3JlYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLk11dGFibGVYTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkRUREhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKKworLyoqCisgKiBXcml0ZXMgaW50byB7QGxpbmsgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcn0gZnJvbSBTQVguCisgKgorICogVE9ETworICogSW1wbGVtZW50IHRoZSBtYXJraW5nIHRoZSBzdHJlYW0gb24gdGhlIGVsZW1lbnQgd2hlbiBhbiBJRAorICogYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGlzIGRlZmluZWQKKyAqLworcHVibGljIGNsYXNzIFNBWEJ1ZmZlckNyZWF0b3IgZXh0ZW5kcyBBYnN0cmFjdENyZWF0b3IKKyAgICAgICAgaW1wbGVtZW50cyBFbnRpdHlSZXNvbHZlciwgRFRESGFuZGxlciwgQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciwgTGV4aWNhbEhhbmRsZXIgeworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBfbmFtZXNwYWNlQXR0cmlidXRlczsKKworICAgIHByb3RlY3RlZCBpbnQgX25hbWVzcGFjZUF0dHJpYnV0ZXNQdHI7CisKKyAgICBwcml2YXRlIGludCBkZXB0aCA9IDA7CisKKyAgICBwdWJsaWMgU0FYQnVmZmVyQ3JlYXRvcigpIHsKKyAgICAgICAgX25hbWVzcGFjZUF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nWzE2ICogMl07CisgICAgfQorCisgICAgcHVibGljIFNBWEJ1ZmZlckNyZWF0b3IoTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgdGhpcygpOworICAgICAgICBzZXRCdWZmZXIoYnVmZmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBjcmVhdGUoWE1MUmVhZGVyIHJlYWRlciwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShyZWFkZXIsIGluLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBjcmVhdGUoWE1MUmVhZGVyIHJlYWRlciwgSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoX2J1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBjcmVhdGVCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICBfYnVmZmVyLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKKyAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOworICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkoUHJvcGVydGllcy5MRVhJQ0FMX0hBTkRMRVJfUFJPUEVSVFksIHRoaXMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRIYXNJbnRlcm5lZFN0cmluZ3MocmVhZGVyLmdldEZlYXR1cmUoRmVhdHVyZXMuU1RSSU5HX0lOVEVSTklOR19GRUFUVVJFKSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnB1dFNvdXJjZSBzID0gbmV3IElucHV0U291cmNlKHN5c3RlbUlkKTsKKyAgICAgICAgICAgIHMuc2V0Qnl0ZVN0cmVhbShpbik7CisgICAgICAgICAgICByZWFkZXIucGFyc2Uocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ2V0WE1MU3RyZWFtQnVmZmVyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIF9idWZmZXIgPSBudWxsOworICAgICAgICBfbmFtZXNwYWNlQXR0cmlidXRlc1B0ciA9IDA7CisgICAgICAgIGRlcHRoPTA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX0RPQ1VNRU5UKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX0VORCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBjYWNoZU5hbWVzcGFjZUF0dHJpYnV0ZShwcmVmaXgsIHVyaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc3RvcmVRdWFsaWZpZWROYW1lKFRfRUxFTUVOVF9MTiwKKyAgICAgICAgICAgICAgICB1cmksIGxvY2FsTmFtZSwgcU5hbWUpOworCisgICAgICAgIC8vIEhhcyBuYW1lc3BhY2VzIGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKF9uYW1lc3BhY2VBdHRyaWJ1dGVzUHRyID4gMCkgeworICAgICAgICAgICAgc3RvcmVOYW1lc3BhY2VBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYXMgYXR0cmlidXRlcworICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgICAgICBkZXB0aCsrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc3RvcmVTdHJ1Y3R1cmUoVF9FTkQpOworICAgICAgICBpZigtLWRlcHRoPT0wKQorICAgICAgICAgICAgaW5jcmVhc2VUcmVlQ291bnQoKTsgICAgLy8gb25lIHRyZWUgcHJvY2Vzc2VkCisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHN0b3JlQ29udGVudENoYXJhY3RlcnMoVF9URVhUX0FTX0NIQVJfQVJSQVksIGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhcmFjdGVycyhjaCwgc3RhcnQsIGxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc3RvcmVTdHJ1Y3R1cmUoVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OKTsKKyAgICAgICAgc3RvcmVTdHJ1Y3R1cmVTdHJpbmcodGFyZ2V0KTsKKyAgICAgICAgc3RvcmVTdHJ1Y3R1cmVTdHJpbmcoZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHN0b3JlQ29udGVudENoYXJhY3RlcnMoVF9DT01NRU5UX0FTX0NIQVJfQVJSQVksIGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLworCisgICAgcHJpdmF0ZSB2b2lkIGNhY2hlTmFtZXNwYWNlQXR0cmlidXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKKyAgICAgICAgX25hbWVzcGFjZUF0dHJpYnV0ZXNbX25hbWVzcGFjZUF0dHJpYnV0ZXNQdHIrK10gPSBwcmVmaXg7CisgICAgICAgIF9uYW1lc3BhY2VBdHRyaWJ1dGVzW19uYW1lc3BhY2VBdHRyaWJ1dGVzUHRyKytdID0gdXJpOworCisgICAgICAgIGlmIChfbmFtZXNwYWNlQXR0cmlidXRlc1B0ciA9PSBfbmFtZXNwYWNlQXR0cmlidXRlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVzcGFjZUF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nW19uYW1lc3BhY2VBdHRyaWJ1dGVzUHRyICogMyAvIDIgKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX25hbWVzcGFjZUF0dHJpYnV0ZXMsIDAsIG5hbWVzcGFjZUF0dHJpYnV0ZXMsIDAsIF9uYW1lc3BhY2VBdHRyaWJ1dGVzUHRyKTsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VBdHRyaWJ1dGVzID0gbmFtZXNwYWNlQXR0cmlidXRlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9yZU5hbWVzcGFjZUF0dHJpYnV0ZXMoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX25hbWVzcGFjZUF0dHJpYnV0ZXNQdHI7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IGl0ZW0gPSBUX05BTUVTUEFDRV9BVFRSSUJVVEU7CisgICAgICAgICAgICBpZiAoX25hbWVzcGFjZUF0dHJpYnV0ZXNbaV0ubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaXRlbSB8PSBGTEFHX1BSRUZJWDsKKyAgICAgICAgICAgICAgICBzdG9yZVN0cnVjdHVyZVN0cmluZyhfbmFtZXNwYWNlQXR0cmlidXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX25hbWVzcGFjZUF0dHJpYnV0ZXNbaSArIDFdLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGl0ZW0gfD0gRkxBR19VUkk7CisgICAgICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmVTdHJpbmcoX25hbWVzcGFjZUF0dHJpYnV0ZXNbaSArIDFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3JlU3RydWN0dXJlKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIF9uYW1lc3BhY2VBdHRyaWJ1dGVzUHRyID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmVBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgc3RvcmVRdWFsaWZpZWROYW1lKFRfQVRUUklCVVRFX0xOLAorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmdldFVSSShpKSwKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkpOworCisgICAgICAgICAgICBzdG9yZVN0cnVjdHVyZVN0cmluZyhhdHRyaWJ1dGVzLmdldFR5cGUoaSkpOworICAgICAgICAgICAgc3RvcmVDb250ZW50U3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlUXVhbGlmaWVkTmFtZShpbnQgaXRlbSwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB7CisgICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpdGVtIHw9IEZMQUdfVVJJOworICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmVTdHJpbmcodXJpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3JlU3RydWN0dXJlU3RyaW5nKGxvY2FsTmFtZSk7CisKKyAgICAgICAgaWYgKHFOYW1lLmluZGV4T2YoJzonKSA+PSAwKSB7CisgICAgICAgICAgICBpdGVtIHw9IEZMQUdfUVVBTElGSUVEX05BTUU7CisgICAgICAgICAgICBzdG9yZVN0cnVjdHVyZVN0cmluZyhxTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBzdG9yZVN0cnVjdHVyZShpdGVtKTsKKyAgICB9CisKKworICAgIC8vIEVtcHR5IG1ldGhvZHMgZm9yIFNBWCBoYW5kbGVycworCisgICAgLy8gRW50aXR5IHJlc29sdmVyIGhhbmRsZXIKKworICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5IChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8vIERURCBoYW5kbGVyCisKKyAgICBwdWJsaWMgdm9pZCBub3RhdGlvbkRlY2wgKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgIHsgfQorCisgICAgcHVibGljIHZvaWQgdW5wYXJzZWRFbnRpdHlEZWNsIChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgbm90YXRpb25OYW1lKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgeyB9CisKKyAgICAvLyBDb250ZW50IGhhbmRsZXIKKworICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvciAoTG9jYXRvciBsb2NhdG9yKSB7IH0KKworICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcgKFN0cmluZyBwcmVmaXgpIHRocm93cyBTQVhFeGNlcHRpb24geyB9CisKKyAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5IChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KKworICAgIC8vIExleGljYWwgaGFuZGxlcgorCisgICAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQorCisgICAgcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQorCisgICAgcHVibGljIHZvaWQgZW5kRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24geyB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24geyB9CisKKyAgICAvLyBFcnJvciBoYW5kbGVyCisKKyAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24geyB9CisKKyAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQorCisgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgeworICAgICAgICB0aHJvdyBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc2F4L1NBWEJ1ZmZlclByb2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zYXgvU0FYQnVmZmVyUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1ZDU5NgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc2F4L1NBWEJ1ZmZlclByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNjcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuc2F4OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5BYnN0cmFjdFByb2Nlc3NvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLkF0dHJpYnV0ZXNIb2xkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRFRESGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5Mb2NhdG9ySW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC5YTUxDb25zdGFudHM7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIHByb2Nlc3NvciBvZiBhIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9IHRoYXQgdGhhdCByZWFkcyB0aGUgWE1MIGluZm9zZXQgYXMKKyAqIHtAbGluayBYTUxSZWFkZXJ9LgorICovCitwdWJsaWMgY2xhc3MgU0FYQnVmZmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzb3IgaW1wbGVtZW50cyBYTUxSZWFkZXIgeworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZSB0byBlbnRpdHkgcmVzb2x2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEVudGl0eVJlc29sdmVyIF9lbnRpdHlSZXNvbHZlciA9IERFRkFVTFRfTEVYSUNBTF9IQU5ETEVSOworCisgICAgLyoqCisgICAgICogUmVmZXJlbmNlIHRvIGR0ZCBoYW5kbGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBEVERIYW5kbGVyIF9kdGRIYW5kbGVyID0gREVGQVVMVF9MRVhJQ0FMX0hBTkRMRVI7CisKKyAgICAvKioKKyAgICAgKiBSZWZlcmVuY2UgdG8gY29udGVudCBoYW5kbGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250ZW50SGFuZGxlciBfY29udGVudEhhbmRsZXIgPSBERUZBVUxUX0xFWElDQUxfSEFORExFUjsKKworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZSB0byBlcnJvciBoYW5kbGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBFcnJvckhhbmRsZXIgX2Vycm9ySGFuZGxlciA9IERFRkFVTFRfTEVYSUNBTF9IQU5ETEVSOworCisgICAgLyoqCisgICAgICogUmVmZXJlbmNlIHRvIGxleGljYWwgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGV4aWNhbEhhbmRsZXIgX2xleGljYWxIYW5kbGVyID0gREVGQVVMVF9MRVhJQ0FMX0hBTkRMRVI7CisKKyAgICAvKioKKyAgICAgKiBTQVggTmFtZXNwYWNlIGF0dHJpYnV0ZXMgZmVhdHVyZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfbmFtZXNwYWNlUHJlZml4ZXNGZWF0dXJlID0gZmFsc2U7CisKKyAgICBwcm90ZWN0ZWQgQXR0cmlidXRlc0hvbGRlciBfYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSG9sZGVyKCk7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gX25hbWVzcGFjZVByZWZpeGVzID0gbmV3IFN0cmluZ1sxNl07CisgICAgcHJvdGVjdGVkIGludCBfbmFtZXNwYWNlUHJlZml4ZXNJbmRleDsKKworICAgIHByb3RlY3RlZCBpbnRbXSBfbmFtZXNwYWNlQXR0cmlidXRlc1N0YWNrID0gbmV3IGludFsxNl07CisgICAgcHJvdGVjdGVkIGludCBfbmFtZXNwYWNlQXR0cmlidXRlc1N0YWNrSW5kZXg7CisKKyAgICBwdWJsaWMgU0FYQnVmZmVyUHJvY2Vzc29yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNTQVhCdWZmZXJQcm9jZXNzb3IoWE1MU3RyZWFtQnVmZmVyLCBib29sZWFuKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgU0FYQnVmZmVyUHJvY2Vzc29yKFhNTFN0cmVhbUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgc2V0WE1MU3RyZWFtQnVmZmVyKGJ1ZmZlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByb2R1Y2VGcmFnbWVudEV2ZW50CisgICAgICogICAgICBUcnVlIHRvIGdlbmVyYXRlIGZyYWdtZW50IFNBWCBldmVudHMgd2l0aG91dCBzdGFydC9lbmREb2N1bWVudC4KKyAgICAgKiAgICAgIEZhbHNlIHRvIGdlbmVyYXRlIGEgZnVsbCBkb2N1bWVudCBTQVggZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyBTQVhCdWZmZXJQcm9jZXNzb3IoWE1MU3RyZWFtQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBwcm9kdWNlRnJhZ21lbnRFdmVudCkgeworICAgICAgICBzZXRYTUxTdHJlYW1CdWZmZXIoYnVmZmVyLHByb2R1Y2VGcmFnbWVudEV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBuYW1lKQorICAgICAgICAgICAgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lLmVxdWFscyhGZWF0dXJlcy5OQU1FU1BBQ0VTX0ZFQVRVUkUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhGZWF0dXJlcy5OQU1FU1BBQ0VfUFJFRklYRVNfRkVBVFVSRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBfbmFtZXNwYWNlUHJlZml4ZXNGZWF0dXJlOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEZlYXR1cmVzLkVYVEVSTkFMX0dFTkVSQUxfRU5USVRJRVMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhGZWF0dXJlcy5FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRJRVMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhGZWF0dXJlcy5TVFJJTkdfSU5URVJOSU5HX0ZFQVRVUkUpKSB7CisgICAgICAgICAgICByZXR1cm4gX3N0cmluZ0ludGVybmluZ0ZlYXR1cmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkZlYXR1cmUgbm90IHN1cHBvcnRlZDogIiArIG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAobmFtZS5lcXVhbHMoRmVhdHVyZXMuTkFNRVNQQUNFU19GRUFUVVJFKSkgeworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24obmFtZSArICI6IiArIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhGZWF0dXJlcy5OQU1FU1BBQ0VfUFJFRklYRVNfRkVBVFVSRSkpIHsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VQcmVmaXhlc0ZlYXR1cmUgPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhGZWF0dXJlcy5FWFRFUk5BTF9HRU5FUkFMX0VOVElUSUVTKSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoRmVhdHVyZXMuRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUSUVTKSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoRmVhdHVyZXMuU1RSSU5HX0lOVEVSTklOR19GRUFUVVJFKSkgeworICAgICAgICAgICAgaWYgKHZhbHVlICE9IF9zdHJpbmdJbnRlcm5pbmdGZWF0dXJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihuYW1lICsgIjoiICsgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGZWF0dXJlIG5vdCBzdXBwb3J0ZWQ6ICIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFByb3BlcnRpZXMuTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldExleGljYWxIYW5kbGVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigiUHJvcGVydHkgbm90IHJlY29nbml6ZWQ6ICIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFByb3BlcnRpZXMuTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZKSkgeworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGV4aWNhbEhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICBzZXRMZXhpY2FsSGFuZGxlcigoTGV4aWNhbEhhbmRsZXIpdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKFByb3BlcnRpZXMuTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKCJQcm9wZXJ0eSBub3QgcmVjb2duaXplZDogIiArIG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgX2VudGl0eVJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgfQorCisgICAgcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgeworICAgICAgICByZXR1cm4gX2VudGl0eVJlc29sdmVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERUREhhbmRsZXIoRFRESGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIF9kdGRIYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRFRESGFuZGxlciBnZXREVERIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gX2R0ZEhhbmRsZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoQ29udGVudEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBfY29udGVudEhhbmRsZXIgPSBoYW5kbGVyOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIF9jb250ZW50SGFuZGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgX2Vycm9ySGFuZGxlciA9IGhhbmRsZXI7CisgICAgfQorCisgICAgcHVibGljIEVycm9ySGFuZGxlciBnZXRFcnJvckhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBfZXJyb3JIYW5kbGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExleGljYWxIYW5kbGVyKExleGljYWxIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgX2xleGljYWxIYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgTGV4aWNhbEhhbmRsZXIgZ2V0TGV4aWNhbEhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBfbGV4aWNhbEhhbmRsZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTb3VyY2UgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSW5wdXRTb3VyY2UgaXMgaWdub3JlZAorICAgICAgICBwcm9jZXNzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHN5c3RlbUlkIGlzIGlnbm9yZWQKKyAgICAgICAgcHJvY2VzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3J0LWhhbmQgZm9yIHtAbGluayAjc2V0WE1MU3RyZWFtQnVmZmVyKFhNTFN0cmVhbUJ1ZmZlcil9IHRoZW4ge0BsaW5rICNwcm9jZXNzKCl9LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFVzZSB7QGxpbmsgI3Byb2Nlc3MoWE1MU3RyZWFtQnVmZmVyLCBib29sZWFuKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBwcm9jZXNzKFhNTFN0cmVhbUJ1ZmZlciBidWZmZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzZXRYTUxTdHJlYW1CdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgcHJvY2VzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3J0LWhhbmQgZm9yIHtAbGluayAjc2V0WE1MU3RyZWFtQnVmZmVyKFhNTFN0cmVhbUJ1ZmZlcixib29sZWFuKX0gdGhlbiB7QGxpbmsgI3Byb2Nlc3MoKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvZHVjZUZyYWdtZW50RXZlbnQKKyAgICAgKiAgICAgIFRydWUgdG8gZ2VuZXJhdGUgZnJhZ21lbnQgU0FYIGV2ZW50cyB3aXRob3V0IHN0YXJ0L2VuZERvY3VtZW50LgorICAgICAqICAgICAgRmFsc2UgdG8gZ2VuZXJhdGUgYSBmdWxsIGRvY3VtZW50IFNBWCBldmVudHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2VzcyhYTUxTdHJlYW1CdWZmZXIgYnVmZmVyLCBib29sZWFuIHByb2R1Y2VGcmFnbWVudEV2ZW50KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0WE1MU3RyZWFtQnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIHByb2Nlc3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIHBhcnNlciB0byByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2l2ZW4ge0BsaW5rIFhNTFN0cmVhbUJ1ZmZlcn0uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVXNlIHtAbGluayAjc2V0WE1MU3RyZWFtQnVmZmVyKFhNTFN0cmVhbUJ1ZmZlciwgYm9vbGVhbil9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhNTFN0cmVhbUJ1ZmZlcihYTUxTdHJlYW1CdWZmZXIgYnVmZmVyKSB7CisgICAgICAgIHNldEJ1ZmZlcihidWZmZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgcGFyc2VyIHRvIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnaXZlbiB7QGxpbmsgWE1MU3RyZWFtQnVmZmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9kdWNlRnJhZ21lbnRFdmVudAorICAgICAqICAgICAgVHJ1ZSB0byBnZW5lcmF0ZSBmcmFnbWVudCBTQVggZXZlbnRzIHdpdGhvdXQgc3RhcnQvZW5kRG9jdW1lbnQuCisgICAgICogICAgICBGYWxzZSB0byBnZW5lcmF0ZSBhIGZ1bGwgZG9jdW1lbnQgU0FYIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYTUxTdHJlYW1CdWZmZXIoWE1MU3RyZWFtQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBwcm9kdWNlRnJhZ21lbnRFdmVudCkgeworICAgICAgICBpZighcHJvZHVjZUZyYWdtZW50RXZlbnQgJiYgX3RyZWVDb3VudD4xKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3Qgd3JpdGUgYSBmb3Jlc3QgdG8gYSBmdWxsIFhNTCBpbmZvc2V0Iik7CisgICAgICAgIHNldEJ1ZmZlcihidWZmZXIscHJvZHVjZUZyYWdtZW50RXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzdWItdHJlZSAob3IgYSB3aG9sZSBkb2N1bWVudCkgdGhhdCB7QGxpbmsgWE1MU3RyZWFtQnVmZmVyfQorICAgICAqIHBvaW50cyB0bywgYW5kIHNlbmRzIGV2ZW50cyB0byBoYW5kbGVycy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRPRE86CisgICAgICogV2UgcHJvYmFibHkgbmVlZCB0d28gbW9kZXMgZm9yIGEgc3ViLXRyZWUgZXZlbnQgZ2VuZXJhdGlvbi4gT25lIGZvcgorICAgICAqIGZpcmluZyBhIHN1Yi10cmVlIGFzIGlmIGl0J3MgYSB3aG9sZSBkb2N1bWVudCAoaW4gd2hpY2ggY2FzZSBzdGFydC9lbmREb2N1bWVudAorICAgICAqIGFuZCBhcHByb3ByaWF0ZSBhZGRpdGlvbmFsIG5hbWVzcGFjZSBiaW5kaW5ncyBhcmUgbmVjZXNzYXJ5KSwgYW5kIHRoZSBvdGhlcgorICAgICAqIG1vZGUgZm9yIGZpcmluZyBhIHN1YnRyZWUgYXMgYSBzdWJ0cmVlLCBsaWtlIGl0IGRvZXMgdG9kYXkuCisgICAgICogQSBzdHJlYW0gYnVmZmVyIFNBWCBmZWF0dXJlIGNvdWxkIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGlzLgorICAgICAqCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgKiAgICAgIEZvbGxvdyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMge0BsaW5rIFhNTFJlYWRlciNwYXJzZShJbnB1dFNvdXJjZSl9LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3MoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIV9mcmFnbWVudE1vZGUpIHsKKyAgICAgICAgICAgIExvY2F0b3JJbXBsIG51bGxMb2NhdG9yID0gbmV3IExvY2F0b3JJbXBsKCk7CisgICAgICAgICAgICBudWxsTG9jYXRvci5zZXRTeXN0ZW1JZChfYnVmZmVyLmdldFN5c3RlbUlkKCkpOworICAgICAgICAgICAgbnVsbExvY2F0b3Iuc2V0TGluZU51bWJlcigtMSk7CisgICAgICAgICAgICBudWxsTG9jYXRvci5zZXRDb2x1bW5OdW1iZXIoLTEpOworICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihudWxsTG9jYXRvcik7CisKKyAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICAvLyBUT0RPOiBpZiB3ZSBhcmUgd3JpdGluZyBhIGZyYWdtZW50IHN0cmVhbSBidWZmZXIgYXMgYSBmdWxsIFhNTCBkb2N1bWVudCwKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZGVjbGFyZSBpbi1zY29wZSBuYW1lc3BhY2VzIGFzIGlmIHRoZXkgYXJlIG9uIHRoZSByb290IGVsZW1lbnQuCisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoX3RyZWVDb3VudD4wKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaXRlbSA9IHJlYWRFaWlTdGF0ZSgpOworICAgICAgICAgICAgc3dpdGNoKGl0ZW0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0RPQ1VNRU5UOgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyZWVDb3VudC0tOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VORDoKKyAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfVV9MTl9RTjoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQocmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIF90cmVlQ291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1BfVV9MTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmkgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBnZXRRTmFtZShwcmVmaXgsIGxvY2FsTmFtZSkpOworICAgICAgICAgICAgICAgICAgICBfdHJlZUNvdW50LS07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfVV9MTjogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRWxlbWVudCh1cmksIGxvY2FsTmFtZSwgbG9jYWxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyZWVDb3VudC0tOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX0xOOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQoIiIsIGxvY2FsTmFtZSwgbG9jYWxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyZWVDb3VudC0tOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfU01BTEw6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tZW50QXNDaGFyQXJyYXlTbWFsbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9NRURJVU06CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tZW50QXNDaGFyQXJyYXlNZWRpdW0oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfQ09QWToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1lbnRBc0NoYXJBcnJheUNvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1lbnQocmVhZENvbnRlbnRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2Nlc3NpbmdJbnN0cnVjdGlvbihyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHJlcG9ydEZhdGFsRXJyb3IoIklsbGVnYWwgc3RhdGUgZm9yIERJSXM6ICIraXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZighX2ZyYWdtZW50TW9kZSkKKyAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWVudEFzQ2hhckFycmF5U21hbGwoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHJlYWRTdHJ1Y3R1cmUoKTsKKyAgICAgICAgZmluYWwgaW50IHN0YXJ0ID0gcmVhZENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyKGxlbmd0aCk7CisgICAgICAgIHByb2Nlc3NDb21tZW50KF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciwgc3RhcnQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0IGEgZmF0YWwgZXJyb3IgYW5kIGFib3J0LgorICAgICAqCisgICAgICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZm9sbG93IHRoZSBTQVggc2VtYW50aWNzIG9mIGVycm9yIGhhbmRsaW5nLgorICAgICAqLworICAgIHByaXZhdGUgU0FYUGFyc2VFeGNlcHRpb24gcmVwb3J0RmF0YWxFcnJvcihTdHJpbmcgbXNnKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgU0FYUGFyc2VFeGNlcHRpb24gc3BlID0gbmV3IFNBWFBhcnNlRXhjZXB0aW9uKG1zZywgbnVsbCk7CisgICAgICAgIGlmKF9lcnJvckhhbmRsZXIhPW51bGwpCisgICAgICAgICAgICBfZXJyb3JIYW5kbGVyLmZhdGFsRXJyb3Ioc3BlKTsKKyAgICAgICAgcmV0dXJuIHNwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0RvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpdGVtID0gcmVhZEVpaVN0YXRlKCk7CisgICAgICAgICAgICBzd2l0Y2goaXRlbSkgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRUxFTUVOVF9VX0xOX1FOOgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRWxlbWVudChyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZFN0cnVjdHVyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1BfVV9MTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmkgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBnZXRRTmFtZShwcmVmaXgsIGxvY2FsTmFtZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1VfTE46IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQodXJpLCBsb2NhbE5hbWUsIGxvY2FsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfTE46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRWxlbWVudCgiIiwgbG9jYWxOYW1lLCBsb2NhbE5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfU01BTEw6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tZW50QXNDaGFyQXJyYXlTbWFsbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9NRURJVU06CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tZW50QXNDaGFyQXJyYXlNZWRpdW0oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfQ09QWToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1lbnRBc0NoYXJBcnJheUNvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1lbnQocmVhZENvbnRlbnRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2Nlc3NpbmdJbnN0cnVjdGlvbihyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRU5EOgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVwb3J0RmF0YWxFcnJvcigiSWxsZWdhbCBzdGF0ZSBmb3IgY2hpbGQgb2YgRElJOiAiK2l0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gaGFzTmFtZXNwYWNlQXR0cmlidXRlcyA9IGZhbHNlOworICAgICAgICBpbnQgaXRlbSA9IHBlZWtTdHJ1Y3R1cmUoKTsKKyAgICAgICAgaWYgKChpdGVtICYgVFlQRV9NQVNLKSA9PSBUX05BTUVTUEFDRV9BVFRSSUJVVEUpIHsKKyAgICAgICAgICAgIGhhc05hbWVzcGFjZUF0dHJpYnV0ZXMgPSB0cnVlOworICAgICAgICAgICAgaXRlbSA9IHByb2Nlc3NOYW1lc3BhY2VBdHRyaWJ1dGVzKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGlmICgoaXRlbSAmIFRZUEVfTUFTSykgPT0gVF9BVFRSSUJVVEUpIHsKKyAgICAgICAgICAgIGhhc0F0dHJpYnV0ZXMgPSB0cnVlOworICAgICAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZXMoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBfY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgX2F0dHJpYnV0ZXMpOworCisgICAgICAgIGlmIChoYXNBdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICBfYXR0cmlidXRlcy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaXRlbSA9IHJlYWRFaWlTdGF0ZSgpOworICAgICAgICAgICAgc3dpdGNoKGl0ZW0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfVV9MTl9RTjoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQocmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRUxFTUVOVF9QX1VfTE46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcCA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHUgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsbiA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQodSwgbG4sIGdldFFOYW1lKHAsIGxuKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfVV9MTjogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdSA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxuID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRWxlbWVudCh1LCBsbiwgbG4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX0xOOiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsbiA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQoIiIsIGxuLCBsbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RFWFRfQVNfQ0hBUl9BUlJBWV9TTUFMTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkU3RydWN0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcihsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhfY29udGVudENoYXJhY3RlcnNCdWZmZXIsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUX0FTX0NIQVJfQVJSQVlfTUVESVVNOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHJlYWRTdHJ1Y3R1cmUxNigpOworICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnMoX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfVEVYVF9BU19DSEFSX0FSUkFZX0NPUFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBjaGFyW10gY2ggPSByZWFkQ29udGVudENoYXJhY3RlcnNDb3B5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnMoY2gsIDAsIGNoLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RFWFRfQVNfU1RSSU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSByZWFkQ29udGVudFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhzLnRvQ2hhckFycmF5KCksIDAsIHMubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUX0FTX09CSkVDVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBjID0gKENoYXJTZXF1ZW5jZSlyZWFkQ29udGVudE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IGMudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnMocy50b0NoYXJBcnJheSgpLCAwLCBzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09NTUVOVF9BU19DSEFSX0FSUkFZX1NNQUxMOgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWVudEFzQ2hhckFycmF5U21hbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfTUVESVVNOgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWVudEFzQ2hhckFycmF5TWVkaXVtKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09NTUVOVF9BU19DSEFSX0FSUkFZX0NPUFk6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tZW50QXNDaGFyQXJyYXlDb3B5KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVF9DT01NRU5UX0FTX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1lbnQocmVhZENvbnRlbnRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb2Nlc3NpbmdJbnN0cnVjdGlvbihyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRU5EOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXBvcnRGYXRhbEVycm9yKCJJbGxlZ2FsIHN0YXRlIGZvciBjaGlsZCBvZiBFSUk6ICIraXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUoaXRlbSAhPSBTVEFURV9FTkQpOworCisgICAgICAgIF9jb250ZW50SGFuZGxlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7CisKKyAgICAgICAgaWYgKGhhc05hbWVzcGFjZUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHByb2Nlc3NFbmRQcmVmaXhNYXBwaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbW1lbnRBc0NoYXJBcnJheUNvcHkoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgY2hhcltdIGNoID0gcmVhZENvbnRlbnRDaGFyYWN0ZXJzQ29weSgpOworICAgICAgICBwcm9jZXNzQ29tbWVudChjaCwgMCwgY2gubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbW1lbnRBc0NoYXJBcnJheU1lZGl1bSgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZTE2KCk7CisgICAgICAgIGZpbmFsIGludCBzdGFydCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcihsZW5ndGgpOworICAgICAgICBwcm9jZXNzQ29tbWVudChfY29udGVudENoYXJhY3RlcnNCdWZmZXIsIHN0YXJ0LCBsZW5ndGgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRW5kUHJlZml4TWFwcGluZygpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgZW5kID0gX25hbWVzcGFjZUF0dHJpYnV0ZXNTdGFja1stLV9uYW1lc3BhY2VBdHRyaWJ1dGVzU3RhY2tJbmRleF07CisgICAgICAgIGZpbmFsIGludCBzdGFydCA9IChfbmFtZXNwYWNlQXR0cmlidXRlc1N0YWNrSW5kZXggPiAwKSA/IF9uYW1lc3BhY2VBdHRyaWJ1dGVzU3RhY2tbX25hbWVzcGFjZUF0dHJpYnV0ZXNTdGFja0luZGV4XSA6IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IGVuZCAtIDE7IGkgPj0gc3RhcnQ7IGktLSkgeworICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoX25hbWVzcGFjZVByZWZpeGVzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBfbmFtZXNwYWNlUHJlZml4ZXNJbmRleCA9IHN0YXJ0OworICAgIH0KKworICAgIHByaXZhdGUgaW50IHByb2Nlc3NOYW1lc3BhY2VBdHRyaWJ1dGVzKGludCBpdGVtKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3dpdGNoKF9uaWlTdGF0ZVRhYmxlW2l0ZW1dKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9OQU1FU1BBQ0VfQVRUUklCVVRFOgorICAgICAgICAgICAgICAgICAgICAvLyBVbmRlY2xhcmF0aW9uIG9mIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lc3BhY2VBdHRyaWJ1dGUoIiIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9OQU1FU1BBQ0VfQVRUUklCVVRFX1A6CisgICAgICAgICAgICAgICAgICAgIC8vIFVuZGVjbGFyYXRpb24gb2YgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lc3BhY2VBdHRyaWJ1dGUocmVhZFN0cnVjdHVyZVN0cmluZygpLCAiIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfTkFNRVNQQUNFX0FUVFJJQlVURV9QX1U6CisgICAgICAgICAgICAgICAgICAgIC8vIERlY2xhcmF0aW9uIHdpdGggcHJlZml4CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lc3BhY2VBdHRyaWJ1dGUocmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX05BTUVTUEFDRV9BVFRSSUJVVEVfVToKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZXNwYWNlQXR0cmlidXRlKCIiLCByZWFkU3RydWN0dXJlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXBvcnRGYXRhbEVycm9yKCJJbGxlZ2FsIHN0YXRlOiAiK2l0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOworCisgICAgICAgICAgICBpdGVtID0gcGVla1N0cnVjdHVyZSgpOworICAgICAgICB9IHdoaWxlKChpdGVtICYgVFlQRV9NQVNLKSA9PSBUX05BTUVTUEFDRV9BVFRSSUJVVEUpOworCisKKyAgICAgICAgY2FjaGVOYW1lc3BhY2VQcmVmaXhJbmRleCgpOworCisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQXR0cmlidXRlcyhpbnQgaXRlbSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN3aXRjaChfYWlpU3RhdGVUYWJsZVtpdGVtXSkgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQVRUUklCVVRFX1VfTE5fUU46CisgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZVdpdGhRTmFtZShyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRDb250ZW50U3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0FUVFJJQlVURV9QX1VfTE46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcCA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHUgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsbiA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMuYWRkQXR0cmlidXRlV2l0aFFOYW1lKHUsIGxuLCBnZXRRTmFtZShwLCBsbiksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZENvbnRlbnRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0FUVFJJQlVURV9VX0xOOiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1ID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG4gPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZVdpdGhRTmFtZSh1LCBsbiwgbG4sIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZENvbnRlbnRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0FUVFJJQlVURV9MTjogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG4gPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZVdpdGhRTmFtZSgiIiwgbG4sIGxuLCByZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRDb250ZW50U3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVwb3J0RmF0YWxFcnJvcigiSWxsZWdhbCBzdGF0ZTogIitpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRTdHJ1Y3R1cmUoKTsKKworICAgICAgICAgICAgaXRlbSA9IHBlZWtTdHJ1Y3R1cmUoKTsKKyAgICAgICAgfSB3aGlsZSgoaXRlbSAmIFRZUEVfTUFTSykgPT0gVF9BVFRSSUJVVEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTmFtZXNwYWNlQXR0cmlidXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBfY29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKTsKKworICAgICAgICBpZiAoX25hbWVzcGFjZVByZWZpeGVzRmVhdHVyZSkgeworICAgICAgICAgICAgLy8gQWRkIHRoZSBuYW1lc3BhY2UgZGVsY2FyYXRpb24gYXMgYW4gYXR0cmlidXRlCisgICAgICAgICAgICBpZiAocHJlZml4ICE9ICIiKSB7CisgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMuYWRkQXR0cmlidXRlV2l0aFFOYW1lKFhNTENvbnN0YW50cy5YTUxOU19BVFRSSUJVVEVfTlNfVVJJLCBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRRTmFtZShYTUxDb25zdGFudHMuWE1MTlNfQVRUUklCVVRFLCBwcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNEQVRBIiwgdXJpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMuYWRkQXR0cmlidXRlV2l0aFFOYW1lKFhNTENvbnN0YW50cy5YTUxOU19BVFRSSUJVVEVfTlNfVVJJLCBYTUxDb25zdGFudHMuWE1MTlNfQVRUUklCVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgWE1MQ29uc3RhbnRzLlhNTE5TX0FUVFJJQlVURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDREFUQSIsIHVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjYWNoZU5hbWVzcGFjZVByZWZpeChwcmVmaXgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYWNoZU5hbWVzcGFjZVByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIGlmIChfbmFtZXNwYWNlUHJlZml4ZXNJbmRleCA9PSBfbmFtZXNwYWNlUHJlZml4ZXMubGVuZ3RoKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lc3BhY2VBdHRyaWJ1dGVzID0gbmV3IFN0cmluZ1tfbmFtZXNwYWNlUHJlZml4ZXNJbmRleCAqIDMgLyAyICsgMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9uYW1lc3BhY2VQcmVmaXhlcywgMCwgbmFtZXNwYWNlQXR0cmlidXRlcywgMCwgX25hbWVzcGFjZVByZWZpeGVzSW5kZXgpOworICAgICAgICAgICAgX25hbWVzcGFjZVByZWZpeGVzID0gbmFtZXNwYWNlQXR0cmlidXRlczsKKyAgICAgICAgfQorCisgICAgICAgIF9uYW1lc3BhY2VQcmVmaXhlc1tfbmFtZXNwYWNlUHJlZml4ZXNJbmRleCsrXSA9IHByZWZpeDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2FjaGVOYW1lc3BhY2VQcmVmaXhJbmRleCgpIHsKKyAgICAgICAgaWYgKF9uYW1lc3BhY2VBdHRyaWJ1dGVzU3RhY2tJbmRleCA9PSBfbmFtZXNwYWNlQXR0cmlidXRlc1N0YWNrLmxlbmd0aCkgeworICAgICAgICAgICAgZmluYWwgaW50W10gbmFtZXNwYWNlQXR0cmlidXRlc1N0YWNrID0gbmV3IGludFtfbmFtZXNwYWNlQXR0cmlidXRlc1N0YWNrSW5kZXggKiAzIC8yICsgMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9uYW1lc3BhY2VBdHRyaWJ1dGVzU3RhY2ssIDAsIG5hbWVzcGFjZUF0dHJpYnV0ZXNTdGFjaywgMCwgX25hbWVzcGFjZUF0dHJpYnV0ZXNTdGFja0luZGV4KTsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VBdHRyaWJ1dGVzU3RhY2sgPSBuYW1lc3BhY2VBdHRyaWJ1dGVzU3RhY2s7CisgICAgICAgIH0KKworICAgICAgICBfbmFtZXNwYWNlQXR0cmlidXRlc1N0YWNrW19uYW1lc3BhY2VBdHRyaWJ1dGVzU3RhY2tJbmRleCsrXSA9IF9uYW1lc3BhY2VQcmVmaXhlc0luZGV4OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWVudChTdHJpbmcgcykgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBwcm9jZXNzQ29tbWVudChzLnRvQ2hhckFycmF5KCksIDAsIHMubGVuZ3RoKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWVudChjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIF9sZXhpY2FsSGFuZGxlci5jb21tZW50KGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Byb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIF9jb250ZW50SGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0V2l0aExleGljYWxIYW5kbGVyIERFRkFVTFRfTEVYSUNBTF9IQU5ETEVSID0gbmV3IERlZmF1bHRXaXRoTGV4aWNhbEhhbmRsZXIoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc3RheC9OYW1lc3BhY2VDb250ZXhIZWxwZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc3RheC9OYW1lc3BhY2VDb250ZXhIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTAzNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zdGF4L05hbWVzcGFjZUNvbnRleEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zdGF4OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguTmFtZXNwYWNlQ29udGV4dEV4OworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgZGVjbGFyYXRpb24gb2YgbmFtZXNwYWNlcy4KKyAqIDxwPgorICogQSBuYW1lc3BhY2UgaXMgZGVjbGFyZWQgb24gYSBuYW1lc3BhY2UgY29udGV4dC4KKyAqIE5hbWVzcGFjZSBjb250ZXh0cyBhcmUgcHVzaGVkIG9uIGFuZCBwb3BwZWQgb2ZmIHRoZSBuYW1lc3BhY2UgY29udGV4dCBzdGFjay4KKyAqIDxwPgorICogQSBkZWNsYXJlZCBuYW1lc3BhY2Ugd2lsbCBiZSBpbiBzY29wZSBpZmYgdGhlIGNvbnRleHQgdGhhdCBpdCB3YXMgZGVjbGFyZWQgb24KKyAqIGhhcyBub3QgYmVlbiBwb3BwZWQgb2ZmIHRoZSBzdGFjay4KKyAqIDxwPgorICogV2hlbiBpbnN0YW50aWF0ZWQgdGhlIG5hbWVzcGFjZSBzdGFjayBjb25zaXN0cyBvZiB0aGUgcm9vdCBuYW1lc3BhY2UgY29udGV4dCwKKyAqIHdoaWNoIGNvbnRhaW5zLCBieSBkZWZhdWx0LCB0aGUgInhtbCIgYW5kICJ4bWxucyIgZGVjbGFyYXRpb25zLgorICogTmFtZXNwYWNlcyBtYXkgYmUgZGVjbGFyYXRpb25zIG1heSBiZSBkZWNsYXJlZCBvbiB0aGUgcm9vdCBjb250ZXh0LgorICogVGhlIHJvb3QgY29udGV4dCBjYW5ub3QgYmUgcG9wcGVkIGJ1dCBjYW4gYmUgcmVzZXQgdG8gY29udGFpbiBqdXN0IHRoZQorICogInhtbCIgYW5kICJ4bWxucyIgZGVjbGFyYXRpb25zLgorICogPHA+CisgKiBJbXBsZW1lbnRhdGlvbiBub3RlOiBkZXRlcm1pbmluZyB0aGUgcHJlZml4IGZyb20gYSBuYW1lc3BhY2UgVVJJCisgKiAob3IgdmljZSB2ZXJzYSkgaXMgZWZmaWNpZW50IHdoZW4gdGhlcmUgYXJlIGZldyBuYW1lc3BhY2UKKyAqIGRlY2xhcmF0aW9ucyBpLmUuIHdoYXQgaXMgY29uc2lkZXJlZCB0byBiZSB0aGUgY2FzZSBmb3IgbmFtZXNwYWNlCisgKiBkZWNsYXJhdGlvbnMgaW4gJ2F2ZXJhZ2UnIFhNTCBkb2N1bWVudHMuIFRoZSBsb29rIHVwIG9mIGEgbmFtZXNwYWNlIFVSSQorICogZ2l2ZW4gYSBwcmVmaXggaXMgcGVyZm9ybWVkIGluIE8obikgdGltZS4gVGhlIGxvb2sgdXAgb2YgYSBwcmVmaXggZ2l2ZW4KKyAqIGEgbmFtZXNwYWNlIFVSSSBpcyBwZXJmb3JtZWQgaW4gTygybikgdGltZS4KKyAqIDxwPgorICogVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNjYWxlIHdoZW4gdGhlcmUgYXJlIG1hbnkgbmFtZXNwYWNlCisgKiBkZWNsYXJhdGlvbnMuIFRPRE86IFVzZSBhIGhhc2ggbWFwIHdoZW4gdGhlcmUgYXJlIG1hbnkgbmFtZXNwYWNlCisgKiBkZWNsYXJhdGlvbnMuCisgKgorICogQGF1dGhvciBQYXVsLlNhbmRvekBTdW4uQ29tCisgKi8KK2ZpbmFsIHB1YmxpYyBjbGFzcyBOYW1lc3BhY2VDb250ZXhIZWxwZXIgaW1wbGVtZW50cyBOYW1lc3BhY2VDb250ZXh0RXggeworICAgIHByaXZhdGUgc3RhdGljIGludCBERUZBVUxUX1NJWkUgPSA4OworCisgICAgLy8gVGhlIHByZWZpeGVzIG9mIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBwcmVmaXhlcyA9IG5ldyBTdHJpbmdbREVGQVVMVF9TSVpFXTsKKyAgICAvLyBUaGUgVVJJcyBvZiB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucworICAgIHByaXZhdGUgU3RyaW5nW10gbmFtZXNwYWNlVVJJcyA9IG5ldyBTdHJpbmdbREVGQVVMVF9TSVpFXTsKKyAgICAvLyBDdXJyZW50IHBvc2l0aW9uIHRvIHN0b3JlIHRoZSBuZXh0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbgorICAgIHByaXZhdGUgaW50IG5hbWVzcGFjZVBvc2l0aW9uOworCisgICAgLy8gVGhlIG5hbWVzcGFjZSBjb250ZXh0cworICAgIHByaXZhdGUgaW50W10gY29udGV4dHMgPSBuZXcgaW50W0RFRkFVTFRfU0laRV07CisgICAgLy8gQ3VycmVudCBwb3NpdGlvbiB0byBzdG9yZSB0aGUgbmV4dCBuYW1lc3BhY2UgY29udGV4dAorICAgIHByaXZhdGUgaW50IGNvbnRleHRQb3NpdGlvbjsKKworICAgIC8vIFRoZSBjdXJyZW50IG5hbWVzcGFjZSBjb250ZXh0CisgICAgcHJpdmF0ZSBpbnQgY3VycmVudENvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgTmFtZXNwYWNlQ29udGV4SGVscGVyLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIE5hbWVzcGFjZUNvbnRleEhlbHBlcigpIHsKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBhbHdheXMgaW4gc2NvcGUKKyAgICAgICAgcHJlZml4ZXNbMF0gPSAieG1sIjsKKyAgICAgICAgbmFtZXNwYWNlVVJJc1swXSA9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiOworICAgICAgICBwcmVmaXhlc1sxXSA9ICJ4bWxucyI7CisgICAgICAgIG5hbWVzcGFjZVVSSXNbMV0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iOworCisgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmFtZXNwYWNlUG9zaXRpb24gPSAyOworICAgIH0KKworCisgICAgLy8gTmFtZXNwYWNlQ29udGV4dCBpbnRlcmZhY2UKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgcHJlZml4ID0gcHJlZml4LmludGVybigpOworCisgICAgICAgIGZvciAoaW50IGkgPSBuYW1lc3BhY2VQb3NpdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVjbGFyZWRQcmVmaXggPSBwcmVmaXhlc1tpXTsKKyAgICAgICAgICAgIGlmIChkZWNsYXJlZFByZWZpeCA9PSBwcmVmaXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CisgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIGZvciAoaW50IGkgPSBuYW1lc3BhY2VQb3NpdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVjbGFyZWROYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUklzW2ldOworICAgICAgICAgICAgaWYgKGRlY2xhcmVkTmFtZXNwYWNlVVJJID09IG5hbWVzcGFjZVVSSSB8fCBkZWNsYXJlZE5hbWVzcGFjZVVSSS5lcXVhbHMobmFtZXNwYWNlVVJJKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZWNsYXJlZFByZWZpeCA9IHByZWZpeGVzW2ldOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcHJlZml4IGlzIG91dCBvZiBzY29wZQorICAgICAgICAgICAgICAgIGZvciAoKytpOyBpIDwgbmFtZXNwYWNlUG9zaXRpb247IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmVkUHJlZml4ID09IHByZWZpeGVzW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVjbGFyZWRQcmVmaXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJlZml4ZXMoU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgICAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICBMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgICAgIE5BTUVTUEFDRV9MT09QOiBmb3IgKGludCBpID0gbmFtZXNwYWNlUG9zaXRpb24gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlY2xhcmVkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJc1tpXTsKKyAgICAgICAgICAgIGlmIChkZWNsYXJlZE5hbWVzcGFjZVVSSSA9PSBuYW1lc3BhY2VVUkkgfHwgZGVjbGFyZWROYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZVVSSSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVjbGFyZWRQcmVmaXggPSBwcmVmaXhlc1tpXTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHByZWZpeCBpcyBvdXQgb2Ygc2NvcGUKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBuYW1lc3BhY2VQb3NpdGlvbjsgaisrKQorICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbGFyZWRQcmVmaXggPT0gcHJlZml4ZXNbal0pCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBOQU1FU1BBQ0VfTE9PUDsKKworICAgICAgICAgICAgICAgIGwuYWRkKGRlY2xhcmVkUHJlZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLy8gTmFtZXNwYWNlQ29udGV4dEV4IGludGVyZmFjZQorCisgICAgcHVibGljIEl0ZXJhdG9yPE5hbWVzcGFjZUNvbnRleHRFeC5CaW5kaW5nPiBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKG5hbWVzcGFjZVBvc2l0aW9uID09IDIpCisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOworCisgICAgICAgIGZpbmFsIExpc3Q8TmFtZXNwYWNlQ29udGV4dEV4LkJpbmRpbmc+IG5hbWVzcGFjZXMgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TmFtZXNwYWNlQ29udGV4dEV4LkJpbmRpbmc+KG5hbWVzcGFjZVBvc2l0aW9uKTsKKworICAgICAgICBOQU1FU1BBQ0VfTE9PUDogZm9yIChpbnQgaSA9IG5hbWVzcGFjZVBvc2l0aW9uIC0gMTsgaSA+PSAyOyBpLS0pIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZWNsYXJlZFByZWZpeCA9IHByZWZpeGVzW2ldOworCisgICAgICAgICAgICAvLyBDaGVjayBpZiBwcmVmaXggaXMgb3V0IG9mIHNjb3BlCisgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBuYW1lc3BhY2VQb3NpdGlvbjsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmVkUHJlZml4ID09IHByZWZpeGVzW2pdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBOQU1FU1BBQ0VfTE9PUDsKKworICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuYWRkKG5ldyBOYW1lc3BhY2VCaW5kaW5nSW1wbChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmFtZXNwYWNlcy5pdGVyYXRvcigpOworICAgIH0KKworICAgIGZpbmFsIHByaXZhdGUgY2xhc3MgTmFtZXNwYWNlQmluZGluZ0ltcGwgaW1wbGVtZW50cyBOYW1lc3BhY2VDb250ZXh0RXguQmluZGluZyB7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICBOYW1lc3BhY2VCaW5kaW5nSW1wbChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICAgICAgcmV0dXJuIHByZWZpeGVzW2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSXNbaW5kZXhdOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjbGFyZSBhIGRlZmF1bHQgbmFtZXNwYWNlLgorICAgICAqIDxwPgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgdGhlIG5hbWVzcGFjZSBVUkkgdG8gZGVjbGFyZSwgbWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVjbGFyZURlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgICAgICBkZWNsYXJlTmFtZXNwYWNlKCIiLCBuYW1lc3BhY2VVUkkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY2xhcmUgYSBuYW1lc3BhY2UuCisgICAgICogPHA+CisgICAgICogVGhlIG5hbWVzcGFjZSB3aWxsIGJlIGRlY2xhcmVkIG9uIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBjb250ZXh0LgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lc3BhY2UgY2FuIGJlIHJlbW92ZWQgYnkgcG9wcGluZyB0aGUgY3VycmVudCBuYW1lc3BhY2UKKyAgICAgKiBjb250ZXh0LCBvciwgaWYgdGhlIGRlY2xhcmF0aW9uIG9jY3VyZWQgaW4gdGhlIHJvb3QgY29udGV4dCwgYnkKKyAgICAgKiByZXNldGluZyB0aGUgbmFtZXNwYWNlIGNvbnRleHQuCisgICAgICogPHA+CisgICAgICogQSBkZWZhdWx0IG5hbWVzcGFjZSBjYW4gYmUgZGVjbGFyZWQgYnkgcGFzc2luZyA8Y29kZT4iIjwvY29kZT4gYXMKKyAgICAgKiB0aGUgdmFsdWUgb2YgdGhlIHByZWZpeCBwYXJhbWV0ZXIuCisgICAgICogQSBuYW1lc3BhY2UgbWF5IGJlIHVuZGVjbGFyZWQgYnkgcGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBhcyB0aGUKKyAgICAgKiB2YWx1ZSBvZiB0aGUgbmFtZXNwYWNlVVJJIHBhcmFtZXRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBuYW1lc3BhY2UgcHJlZml4IHRvIGRlY2xhcmUsIG1heSBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIHRoZSBuYW1lc3BhY2UgVVJJIHRvIGRlY2xhcmUsIG1heSBiZSBudWxsLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBpZiB0aGUgcHJlZml4IGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVjbGFyZU5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIHByZWZpeCA9IHByZWZpeC5pbnRlcm4oKTsKKyAgICAgICAgLy8gSWdub3JlIHRoZSAieG1sIiBvciAieG1sbnMiIGRlY2xhcmF0aW9ucworICAgICAgICBpZiAocHJlZml4ID09ICJ4bWwiIHx8IHByZWZpeCA9PSAieG1sbnMiKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIENoZWNrIGZvciB1bmRlY2xhcmF0aW9uCisgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKKyAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSS5pbnRlcm4oKTsKKworICAgICAgICBpZiAobmFtZXNwYWNlUG9zaXRpb24gPT0gbmFtZXNwYWNlVVJJcy5sZW5ndGgpCisgICAgICAgICAgICByZXNpemVOYW1lc3BhY2VzKCk7CisKKyAgICAgICAgLy8gQWRkIG5ldyBkZWNsYXJhdGlvbgorICAgICAgICBwcmVmaXhlc1tuYW1lc3BhY2VQb3NpdGlvbl0gPSBwcmVmaXg7CisgICAgICAgIG5hbWVzcGFjZVVSSXNbbmFtZXNwYWNlUG9zaXRpb24rK10gPSBuYW1lc3BhY2VVUkk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2l6ZU5hbWVzcGFjZXMoKSB7CisgICAgICAgIGZpbmFsIGludCBuZXdMZW5ndGggPSBuYW1lc3BhY2VVUklzLmxlbmd0aCAqIDMgLyAyICsgMTsKKworICAgICAgICBTdHJpbmdbXSBuZXdQcmVmaXhlcyA9IG5ldyBTdHJpbmdbbmV3TGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShwcmVmaXhlcywgMCwgbmV3UHJlZml4ZXMsIDAsIHByZWZpeGVzLmxlbmd0aCk7CisgICAgICAgIHByZWZpeGVzID0gbmV3UHJlZml4ZXM7CisKKyAgICAgICAgU3RyaW5nW10gbmV3TmFtZXNwYWNlVVJJcyA9IG5ldyBTdHJpbmdbbmV3TGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lc3BhY2VVUklzLCAwLCBuZXdOYW1lc3BhY2VVUklzLCAwLCBuYW1lc3BhY2VVUklzLmxlbmd0aCk7CisgICAgICAgIG5hbWVzcGFjZVVSSXMgPSBuZXdOYW1lc3BhY2VVUklzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1c2ggYSBuYW1lc3BhY2UgY29udGV4dCBvbiB0aGUgc3RhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHVzaENvbnRleHQoKSB7CisgICAgICAgIGlmIChjb250ZXh0UG9zaXRpb24gPT0gY29udGV4dHMubGVuZ3RoKQorICAgICAgICAgICAgcmVzaXplQ29udGV4dHMoKTsKKworICAgICAgICBjb250ZXh0c1tjb250ZXh0UG9zaXRpb24rK10gPSBjdXJyZW50Q29udGV4dCA9IG5hbWVzcGFjZVBvc2l0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNpemVDb250ZXh0cygpIHsKKyAgICAgICAgaW50W10gbmV3Q29udGV4dHMgPSBuZXcgaW50W2NvbnRleHRzLmxlbmd0aCAqIDMgLyAyICsgMV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29udGV4dHMsIDAsIG5ld0NvbnRleHRzLCAwLCBjb250ZXh0cy5sZW5ndGgpOworICAgICAgICBjb250ZXh0cyA9IG5ld0NvbnRleHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbmFtZXNwYWNlIGNvbnRleHQgb2ZmIHRoZSBzdGFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBOYW1lc3BhY2VzIGRlY2xhcmVkIHdpdGhpbiB0aGUgY29udGV4dCAodG8gYmUgcG9wcGVkKQorICAgICAqIHdpbGwgYmUgcmVtb3ZlZCBhbmQgbm8gbG9uZ2VyIGJlIGluIHNjb3BlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvcENvbnRleHQoKSB7CisgICAgICAgIGlmIChjb250ZXh0UG9zaXRpb24gPiAwKSB7CisgICAgICAgICAgICBuYW1lc3BhY2VQb3NpdGlvbiA9IGN1cnJlbnRDb250ZXh0ID0gY29udGV4dHNbLS1jb250ZXh0UG9zaXRpb25dOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgbmFtZXNwYWNlIGNvbnRleHRzLgorICAgICAqIDxwPgorICAgICAqIFBvcCBhbGwgbmFtZXNwYWNlIGNvbnRleHRzIGFuZCByZXNldCB0aGUgcm9vdCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0Q29udGV4dHMoKSB7CisgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmFtZXNwYWNlUG9zaXRpb24gPSAyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc3RheC9TdHJlYW1CdWZmZXJDcmVhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3N0YXgvU3RyZWFtQnVmZmVyQ3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzhmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3N0YXgvU3RyZWFtQnVmZmVyQ3JlYXRvci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zdGF4OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5BYnN0cmFjdENyZWF0b3I7CisKKy8qKgorICoge0BsaW5rIEFic3RyYWN0Q3JlYXRvcn0gd2l0aCBhZGRpdGlvbmFsIGNvbnZlbmllbmNlIGNvZGUuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBWZW51CisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2Fic3RyYWN0IGNsYXNzIFN0cmVhbUJ1ZmZlckNyZWF0b3IgZXh0ZW5kcyBBYnN0cmFjdENyZWF0b3IgeworICAgIHByb3RlY3RlZCB2b2lkIHN0b3JlUXVhbGlmaWVkTmFtZShpbnQgaXRlbSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpdGVtIHw9IEZMQUdfUFJFRklYOworICAgICAgICAgICAgICAgIHN0b3JlU3RydWN0dXJlU3RyaW5nKHByZWZpeCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZW0gfD0gRkxBR19VUkk7CisgICAgICAgICAgICBzdG9yZVN0cnVjdHVyZVN0cmluZyh1cmkpOworICAgICAgICB9CisKKyAgICAgICAgc3RvcmVTdHJ1Y3R1cmVTdHJpbmcobG9jYWxOYW1lKTsKKworICAgICAgICBzdG9yZVN0cnVjdHVyZShpdGVtKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdG9yZU5hbWVzcGFjZUF0dHJpYnV0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7CisgICAgICAgIGludCBpdGVtID0gVF9OQU1FU1BBQ0VfQVRUUklCVVRFOworCisgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpdGVtIHw9IEZMQUdfUFJFRklYOworICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmVTdHJpbmcocHJlZml4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpdGVtIHw9IEZMQUdfVVJJOworICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmVTdHJpbmcodXJpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3JlU3RydWN0dXJlKGl0ZW0pOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHN0b3JlQXR0cmlidXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3RvcmVRdWFsaWZpZWROYW1lKFRfQVRUUklCVVRFX0xOLCBwcmVmaXgsIHVyaSwgbG9jYWxOYW1lKTsKKworICAgICAgICBzdG9yZVN0cnVjdHVyZVN0cmluZyh0eXBlKTsKKyAgICAgICAgc3RvcmVDb250ZW50U3RyaW5nKHZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdG9yZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgeworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04pOworICAgICAgICBzdG9yZVN0cnVjdHVyZVN0cmluZyh0YXJnZXQpOworICAgICAgICBzdG9yZVN0cnVjdHVyZVN0cmluZyhkYXRhKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3N0YXgvU3RyZWFtUmVhZGVyQnVmZmVyQ3JlYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zdGF4L1N0cmVhbVJlYWRlckJ1ZmZlckNyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjA3ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zdGF4L1N0cmVhbVJlYWRlckJ1ZmZlckNyZWF0b3IuamF2YQpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLnN0YXg7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLk11dGFibGVYTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleC5CYXNlNjREYXRhOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguWE1MU3RyZWFtUmVhZGVyRXg7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIENyZWF0ZSBhIGJ1ZmZlciB1c2luZyBhbiB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAqIDxwPgorICogVE9ETzogSW1wbGVtZW50IHRoZSBtYXJraW5nIHRoZSBzdHJlYW0gb24gdGhlIGVsZW1lbnQgd2hlbiBhbiBJRAorICogYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGlzIGRlZmluZWQKKyAqLworcHVibGljIGNsYXNzIFN0cmVhbVJlYWRlckJ1ZmZlckNyZWF0b3IgZXh0ZW5kcyBTdHJlYW1CdWZmZXJDcmVhdG9yIHsKKyAgICBwcml2YXRlIGludCBfZXZlbnRUeXBlOworICAgIHByaXZhdGUgYm9vbGVhbiBfc3RvcmVJblNjb3BlTmFtZXNwYWNlc09uRWxlbWVudEZyYWdtZW50OworICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gX2luU2NvcGVQcmVmaXhlczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN0cmVhbSByZWFkZXIgYnVmZmVyIGNyZWF0b3IuCisgICAgICogPHA+CisgICAgICogQSBzdHJlYW0gYnVmZmVyIHdpbGwgYmUgY3JlYXRlZCBmb3Igc3RvcmluZyB0aGUgaW5mb3NldAorICAgICAqIGZyb20gYSBzdHJlYW0gcmVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJlYW1SZWFkZXJCdWZmZXJDcmVhdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN0cmVhbSByZWFkZXIgYnVmZmVyIGNyZWF0b3IgdXNpbmcgYSBtdXRhYmxlIHN0cmVhbSBidWZmZXIuCisgICAgICogPHA+CisgICAgICogQHBhcmFtIGJ1ZmZlciB0aGUgbXV0YWJsZSBzdHJlYW0gYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJlYW1SZWFkZXJCdWZmZXJDcmVhdG9yKE11dGFibGVYTUxTdHJlYW1CdWZmZXIgYnVmZmVyKSB7CisgICAgICAgIHNldEJ1ZmZlcihidWZmZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgYnVmZmVyIGZyb20gYSBzdHJlYW0gcmVhZGVyLgorICAgICAqIDxwPgorICAgICAqIFRoZSBzdHJlYW0gcmVhZGVyIG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50CisgICAgICogb3IgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHN0cmVhbSBpcyBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgdGhlbiB0aGUKKyAgICAgKiB3aG9sZSBkb2N1bWVudCBpcyBzdG9yZWQgYW5kIGFmdGVyIHN0b3JpbmcgdGhlIHN0cmVhbSB3aWxsIGJlIHBvc2l0aW9uZWQKKyAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc3RyZWFtIGlzIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQgdGhlbiB0aGUKKyAgICAgKiBlbGVtZW50IGFuZCBhbGwgaXRzIGNoaWxkcmVuIHdpbGwgYmUgc3RvcmVkIGFuZCBhZnRlciBzdG9yaW5nIHRoZSBzdHJlYW0KKyAgICAgKiB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIG5leHQgZXZlbnQgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZWxlbWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBAcmV0dXJuIHRoZSBtdXRhYmxlIHN0cmVhbSBidWZmZXIuCisgICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gaWYgdGhlIHN0cmVhbSByZWFkZXIgaXMgbm90IHBvc2l0aW9uZWQgYXQKKyAgICAgKiAgICAgICAgIHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgb3IgYXQgYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBjcmVhdGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNyZWF0ZUJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIHN0b3JlKHJlYWRlcik7CisKKyAgICAgICAgcmV0dXJuIGdldFhNTFN0cmVhbUJ1ZmZlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGJ1ZmZlciBmcm9tIGEgc3RyZWFtIHJlYWRlciB0aGF0IGlzIGFuIGVsZW1lbnQgZnJhZ21lbnQuCisgICAgICogPHA+CisgICAgICogVGhlIHN0cmVhbSByZWFkZXIgd2lsbCBiZSBtb3ZlZCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIG5leHQgc3RhcnQgb2YKKyAgICAgKiBhbiBlbGVtZW50IGlmIHRoZSBzdHJlYW0gcmVhZGVyIGlzIG5vdCBhbHJlYWR5IHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0CisgICAgICogb2YgYW4gZWxlbWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZWxlbWVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbiB3aWxsIGJlIHN0b3JlZCBhbmQgYWZ0ZXIgc3RvcmluZyB0aGUgc3RyZWFtCisgICAgICogd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBuZXh0IGV2ZW50IGFmdGVyIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCisgICAgICogPHA+CisgICAgICogQHBhcmFtIHN0b3JlSW5TY29wZU5hbWVzcGFjZXMgdHJ1ZSBpZiBpbi1zY29wZSBuYW1lc3BhY2VzIG9mIHRoZSBlbGVtZW50CisgICAgICogICAgICAgIGZyYWdtZW50IHNob3VsZCBiZSBzdG9yZWQuCisgICAgICogQHJldHVybiB0aGUgbXV0YWJsZSBzdHJlYW0gYnVmZmVyLgorICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIGlmIHRoZSBzdHJlYW0gcmVhZGVyIGNhbm5vdCBiZSBwb3NpdGlvbmVkIGF0CisgICAgICogICAgICAgICB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBjcmVhdGVFbGVtZW50RnJhZ21lbnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKKyAgICAgICAgICAgIGJvb2xlYW4gc3RvcmVJblNjb3BlTmFtZXNwYWNlcykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNyZWF0ZUJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gX2J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIF9zdG9yZUluU2NvcGVOYW1lc3BhY2VzT25FbGVtZW50RnJhZ21lbnQgPSBzdG9yZUluU2NvcGVOYW1lc3BhY2VzOworCisgICAgICAgIF9ldmVudFR5cGUgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIGlmIChfZXZlbnRUeXBlICE9IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgX2V2ZW50VHlwZSA9IHJlYWRlci5uZXh0KCk7CisgICAgICAgICAgICB9IHdoaWxlKF9ldmVudFR5cGUgIT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQgJiYgX2V2ZW50VHlwZSAhPSBYTUxTdHJlYW1SZWFkZXIuRU5EX0RPQ1VNRU5UKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdG9yZUluU2NvcGVOYW1lc3BhY2VzKSB7CisgICAgICAgICAgICBfaW5TY29wZVByZWZpeGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLEludGVnZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICBzdG9yZUVsZW1lbnRBbmRDaGlsZHJlbihyZWFkZXIpOworCisgICAgICAgIHJldHVybiBnZXRYTUxTdHJlYW1CdWZmZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghcmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgX2V2ZW50VHlwZSA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgc3dpdGNoIChfZXZlbnRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5TVEFSVF9ET0NVTUVOVDoKKyAgICAgICAgICAgICAgICBzdG9yZURvY3VtZW50QW5kQ2hpbGRyZW4ocmVhZGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQ6CisgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50QW5kQ2hpbGRyZW4ocmVhZGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiWE1MU3RyZWFtUmVhZGVyIG5vdCBwb3NpdGlvbmVkIGF0IGEgZG9jdW1lbnQgb3IgZWxlbWVudCIpOworICAgICAgICB9CisKKyAgICAgICAgaW5jcmVhc2VUcmVlQ291bnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmVEb2N1bWVudEFuZENoaWxkcmVuKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX0RPQ1VNRU5UKTsKKworICAgICAgICBfZXZlbnRUeXBlID0gcmVhZGVyLm5leHQoKTsKKyAgICAgICAgd2hpbGUgKF9ldmVudFR5cGUgIT0gWE1MU3RyZWFtUmVhZGVyLkVORF9ET0NVTUVOVCkgeworICAgICAgICAgICAgc3dpdGNoIChfZXZlbnRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVFbGVtZW50QW5kQ2hpbGRyZW4ocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQ09NTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVDb21tZW50KHJlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlBST0NFU1NJTkdfSU5TVFJVQ1RJT046CisgICAgICAgICAgICAgICAgICAgIHN0b3JlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHJlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2V2ZW50VHlwZSA9IHJlYWRlci5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX0VORCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlRWxlbWVudEFuZENoaWxkcmVuKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZiAocmVhZGVyIGluc3RhbmNlb2YgWE1MU3RyZWFtUmVhZGVyRXgpIHsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudEFuZENoaWxkcmVuRXgoKFhNTFN0cmVhbVJlYWRlckV4KXJlYWRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRBbmRDaGlsZHJlbk5vRXgocmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9yZUVsZW1lbnRBbmRDaGlsZHJlbkV4KFhNTFN0cmVhbVJlYWRlckV4IHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGludCBkZXB0aCA9IDE7CisgICAgICAgIGlmIChfc3RvcmVJblNjb3BlTmFtZXNwYWNlc09uRWxlbWVudEZyYWdtZW50KSB7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnRXaXRoSW5TY29wZU5hbWVzcGFjZXMocmVhZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0b3JlRWxlbWVudChyZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUoZGVwdGggPiAwKSB7CisgICAgICAgICAgICBfZXZlbnRUeXBlID0gcmVhZGVyLm5leHQoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoX2V2ZW50VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlRWxlbWVudChyZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmUoVF9FTkQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5OQU1FU1BBQ0U6CisgICAgICAgICAgICAgICAgICAgIHN0b3JlTmFtZXNwYWNlQXR0cmlidXRlcyhyZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5BVFRSSUJVVEU6CisgICAgICAgICAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlcyhyZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5TUEFDRToKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5DSEFSQUNURVJTOgorICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkNEQVRBOiB7CisgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBjID0gcmVhZGVyLmdldFBDREFUQSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIEJhc2U2NERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlU3RydWN0dXJlKFRfVEVYVF9BU19PQkpFQ1QpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVDb250ZW50T2JqZWN0KCgoQmFzZTY0RGF0YSljKS5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlQ29udGVudENoYXJhY3RlcnMoVF9URVhUX0FTX0NIQVJfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycygpLCByZWFkZXIuZ2V0VGV4dFN0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRUZXh0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5DT01NRU5UOgorICAgICAgICAgICAgICAgICAgICBzdG9yZUNvbW1lbnQocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBNb3ZlIHRvIG5leHQgaXRlbSBhZnRlciB0aGUgZW5kIG9mIHRoZSBlbGVtZW50CisgICAgICAgICAqIHRoYXQgaGFzIGJlZW4gc3RvcmVkCisgICAgICAgICAqLworICAgICAgICBfZXZlbnRUeXBlID0gcmVhZGVyLm5leHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmVFbGVtZW50QW5kQ2hpbGRyZW5Ob0V4KFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpbnQgZGVwdGggPSAxOworICAgICAgICBpZiAoX3N0b3JlSW5TY29wZU5hbWVzcGFjZXNPbkVsZW1lbnRGcmFnbWVudCkgeworICAgICAgICAgICAgc3RvcmVFbGVtZW50V2l0aEluU2NvcGVOYW1lc3BhY2VzKHJlYWRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdG9yZUVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlKGRlcHRoID4gMCkgeworICAgICAgICAgICAgX2V2ZW50VHlwZSA9IHJlYWRlci5uZXh0KCk7CisgICAgICAgICAgICBzd2l0Y2ggKF9ldmVudFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICAgICAgICAgICAgICBzdG9yZUVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIGRlcHRoLS07CisgICAgICAgICAgICAgICAgICAgIHN0b3JlU3RydWN0dXJlKFRfRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuTkFNRVNQQUNFOgorICAgICAgICAgICAgICAgICAgICBzdG9yZU5hbWVzcGFjZUF0dHJpYnV0ZXMocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQVRUUklCVVRFOgorICAgICAgICAgICAgICAgICAgICBzdG9yZUF0dHJpYnV0ZXMocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuU1BBQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUzoKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5DREFUQTogeworICAgICAgICAgICAgICAgICAgICBzdG9yZUNvbnRlbnRDaGFyYWN0ZXJzKFRfVEVYVF9BU19DSEFSX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycygpLCByZWFkZXIuZ2V0VGV4dFN0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldFRleHRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5DT01NRU5UOgorICAgICAgICAgICAgICAgICAgICBzdG9yZUNvbW1lbnQocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBNb3ZlIHRvIG5leHQgaXRlbSBhZnRlciB0aGUgZW5kIG9mIHRoZSBlbGVtZW50CisgICAgICAgICAqIHRoYXQgaGFzIGJlZW4gc3RvcmVkCisgICAgICAgICAqLworICAgICAgICBfZXZlbnRUeXBlID0gcmVhZGVyLm5leHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmVFbGVtZW50V2l0aEluU2NvcGVOYW1lc3BhY2VzKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgc3RvcmVRdWFsaWZpZWROYW1lKFRfRUxFTUVOVF9MTiwKKyAgICAgICAgICAgICAgICByZWFkZXIuZ2V0UHJlZml4KCksIHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKSwgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKKworICAgICAgICBpZiAocmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICBzdG9yZU5hbWVzcGFjZUF0dHJpYnV0ZXMocmVhZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKSA+IDApIHsKKyAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlcyhyZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlRWxlbWVudChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHN0b3JlUXVhbGlmaWVkTmFtZShUX0VMRU1FTlRfTE4sCisgICAgICAgICAgICAgICAgcmVhZGVyLmdldFByZWZpeCgpLCByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCksIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7CisKKyAgICAgICAgaWYgKHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpID4gMCkgeworICAgICAgICAgICAgc3RvcmVOYW1lc3BhY2VBdHRyaWJ1dGVzKHJlYWRlcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICBzdG9yZUF0dHJpYnV0ZXMocmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9yZU5hbWVzcGFjZUF0dHJpYnV0ZXMoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBpbnQgY291bnQgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBzdG9yZU5hbWVzcGFjZUF0dHJpYnV0ZShyZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpLCByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9yZUF0dHJpYnV0ZXMoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBpbnQgY291bnQgPSByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBzdG9yZUF0dHJpYnV0ZShyZWFkZXIuZ2V0QXR0cmlidXRlUHJlZml4KGkpLCByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpLCByZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlVHlwZShpKSwgcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9yZUNvbW1lbnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBzdG9yZUNvbnRlbnRDaGFyYWN0ZXJzKFRfQ09NTUVOVF9BU19DSEFSX0FSUkFZLAorICAgICAgICAgICAgICAgIHJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycygpLCByZWFkZXIuZ2V0VGV4dFN0YXJ0KCksIHJlYWRlci5nZXRUZXh0TGVuZ3RoKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9yZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHN0b3JlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHJlYWRlci5nZXRQSVRhcmdldCgpLCByZWFkZXIuZ2V0UElEYXRhKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc3RheC9TdHJlYW1SZWFkZXJCdWZmZXJQcm9jZXNzb3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc3RheC9TdHJlYW1SZWFkZXJCdWZmZXJQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU1YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zdGF4L1N0cmVhbVJlYWRlckJ1ZmZlclByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTA4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLnN0YXg7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLkFic3RyYWN0UHJvY2Vzc29yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuQXR0cmlidXRlc0hvbGRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlck1hcms7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleC5OYW1lc3BhY2VDb250ZXh0RXg7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleC5YTUxTdHJlYW1SZWFkZXJFeDsKKworaW1wb3J0IGphdmF4LnhtbC5YTUxDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHByb2Nlc3NvciBvZiBhIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9IHRoYXQgcmVhZHMgdGhlIFhNTCBpbmZvc2V0IGFzCisgKiB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAqCisgKiA8cD4KKyAqIEJlY2F1c2Ugb2Yge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gZGVzaWduLCB0aGlzIHByb2Nlc3NvciBhbHdheXMgcHJvZHVjZQorICogYSBmdWxsIGRvY3VtZW50IGluZm9zZXQsIGV2ZW4gaWYgdGhlIGJ1ZmZlciBqdXN0IGNvbnRhaW5zIGEgZnJhZ21lbnQuCisgKgorICogPHA+CisgKiBXaGVuIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9IGNvbnRhaW5zIGEgbXVsdGlwbGUgdHJlZSAoQUtBICJmb3Jlc3QiKSwKKyAqIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IHdpbGwgYmVoYXZlIGFzIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSByb290IGVsZW1lbnRzCisgKiAoc28geW91J2xsIHNlZSB7QGxpbmsgI1NUQVJUX0VMRU1FTlR9IGV2ZW50IHdoZXJlIHlvdSdkIG5vcm1hbGx5IGV4cGVjdAorICoge0BsaW5rICNFTkRfRE9DVU1FTlR9LikKKyAqCisgKiBAYXV0aG9yIFBhdWwuU2FuZG96QFN1bi5Db20KKyAqIEBhdXRob3IgSy5WZW51Z29wYWxAc3VuLmNvbQorICovCitwdWJsaWMgY2xhc3MgU3RyZWFtUmVhZGVyQnVmZmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzb3IgaW1wbGVtZW50cyBYTUxTdHJlYW1SZWFkZXJFeCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBQ0hFX1NJWkUgPSAxNjsKKworICAgIC8vIFN0YWNrIHRvIGhvbGQgZWxlbWVudCBhbmQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGluZm9ybWF0aW9uCisgICAgcHJvdGVjdGVkIEVsZW1lbnRTdGFja0VudHJ5W10gX3N0YWNrID0gbmV3IEVsZW1lbnRTdGFja0VudHJ5W0NBQ0hFX1NJWkVdOworICAgIC8qKiBUaGUgdG9wLW1vc3QgYWN0aXZlIGVudHJ5IG9mIHRoZSB7QGxpbmsgI19zdGFja30uICovCisgICAgcHJvdGVjdGVkIEVsZW1lbnRTdGFja0VudHJ5IF9zdGFja1RvcDsKKyAgICAvKiogVGhlIGVsZW1lbnQgZGVwdGggdGhhdCB3ZSBhcmUgaW4uIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCBhIHRyZWUuICovCisgICAgcHJvdGVjdGVkIGludCBfZGVwdGg7CisKKyAgICAvLyBBcnJheXMgdG8gaG9sZCBhbGwgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucworICAgIC8qKgorICAgICAqIE5hbWVzcGFjZSBwcmVmaXhlcy4gQ2FuIGJlIGVtcHR5IGJ1dCBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gX25hbWVzcGFjZUFJSXNQcmVmaXggPSBuZXcgU3RyaW5nW0NBQ0hFX1NJWkVdOworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWUgPSBuZXcgU3RyaW5nW0NBQ0hFX1NJWkVdOworICAgIHByb3RlY3RlZCBpbnQgX25hbWVzcGFjZUFJSXNFbmQ7CisKKyAgICAvLyBJbnRlcm5hbCBuYW1lc3BhY2UgY29udGV4dCBpbXBsZW1lbnRhdGlvbgorICAgIHByb3RlY3RlZCBJbnRlcm5hbE5hbWVzcGFjZUNvbnRleHQgX25zQ3R4ID0gbmV3IEludGVybmFsTmFtZXNwYWNlQ29udGV4dCgpOworCisgICAgLy8gVGhlIGN1cnJlbnQgZXZlbnQgdHlwZQorICAgIHByb3RlY3RlZCBpbnQgX2V2ZW50VHlwZTsKKworICAgIC8qKgorICAgICAqIEhvbGRlciBvZiB0aGUgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEJlIGNhcmVmdWwgdGhhdCB0aGlzIGZvbGxvd3MgdGhlIFNBWCBjb252ZW50aW9uIG9mIHVzaW5nICIiIGluc3RlYWQgb2YgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXR0cmlidXRlc0hvbGRlciBfYXR0cmlidXRlQ2FjaGU7CisKKyAgICAvLyBDaGFyYWN0ZXJzIGFzIGEgQ2hhclNlcXVlbmNlCisgICAgcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSBfY2hhclNlcXVlbmNlOworCisgICAgLy8gQ2hhcmFjdGVycyBhcyBhIGNoYXIgYXJyYXkgd2l0aCBvZmZzZXQgYW5kIGxlbmd0aAorICAgIHByb3RlY3RlZCBjaGFyW10gX2NoYXJhY3RlcnM7CisgICAgcHJvdGVjdGVkIGludCBfdGV4dE9mZnNldDsKKyAgICBwcm90ZWN0ZWQgaW50IF90ZXh0TGVuOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBfcGlUYXJnZXQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBfcGlEYXRhOworCisgICAgLy8KKyAgICAvLyBSZXByZXNlbnRzIHRoZSBwYXJzZXIgc3RhdGUgd3J0IHRoZSBlbmQgb2YgcGFyc2luZy4KKyAgICAvLworICAgIC8qKgorICAgICAqIFRoZSBwYXJzZXIgaXMgaW4gdGhlIG1pZGRsZSBvZiBwYXJzaW5nIGEgZG9jdW1lbnQsCisgICAgICogd2l0aCBubyBlbmQgaW4gc2lnaHQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlNJTkcgPSAxOworICAgIC8qKgorICAgICAqIFRoZSBwYXJzZXIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgdGhlIHtAbGluayAjRU5EX0VMRU1FTlR9LAorICAgICAqIGFuZCB3ZSBhcmUgcGFyc2luZyBhIGZyYWdtZW50LiBXZSdsbCByZXBvcnQge0BsaW5rICNFTkRfRE9DVU1FTlR9CisgICAgICogbmV4dCBhbmQgYmUgZG9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEVORElOR19FTkRfRE9DVU1FTlQgPSAyOworICAgIC8qKgorICAgICAqIFRoZSBwYXJzZXIgaGFzIHJlcG9ydGVkIHRoZSB7QGxpbmsgI0VORF9ET0NVTUVOVH0gZXZlbnQsCisgICAgICogc28gd2UgYXJlIHJlYWxseSBkb25lIHBhcnNpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFRCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgX2NvbXBsZXRpb25TdGF0ZTsKKworICAgIHB1YmxpYyBTdHJlYW1SZWFkZXJCdWZmZXJQcm9jZXNzb3IoKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IF9zdGFjay5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICBfc3RhY2tbaV0gPSBuZXcgRWxlbWVudFN0YWNrRW50cnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIF9hdHRyaWJ1dGVDYWNoZSA9IG5ldyBBdHRyaWJ1dGVzSG9sZGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmVhbVJlYWRlckJ1ZmZlclByb2Nlc3NvcihYTUxTdHJlYW1CdWZmZXIgYnVmZmVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcygpOworICAgICAgICBzZXRYTUxTdHJlYW1CdWZmZXIoYnVmZmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYTUxTdHJlYW1CdWZmZXIoWE1MU3RyZWFtQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHNldEJ1ZmZlcihidWZmZXIsYnVmZmVyLmlzRnJhZ21lbnQoKSk7CisKKyAgICAgICAgX2NvbXBsZXRpb25TdGF0ZSA9IFBBUlNJTkc7CisgICAgICAgIF9uYW1lc3BhY2VBSUlzRW5kID0gMDsKKyAgICAgICAgX2NoYXJhY3RlcnMgPSBudWxsOworICAgICAgICBfY2hhclNlcXVlbmNlID0gbnVsbDsKKyAgICAgICAgX2V2ZW50VHlwZSA9IFNUQVJUX0RPQ1VNRU5UOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMge0BsaW5rICNuZXh0VGFnKCl9IGFuZCBpZiB0aGUgcGFyc2VyIG1vdmVkIHRvIGEgbmV3IHN0YXJ0IHRhZywKKyAgICAgKiByZXR1cm5zIGEge0BsaW5rIFhNTFN0cmVhbUJ1ZmZlck1hcmt9IHRoYXQgY2FwdHVyZXMgdGhlIGluZm9zZXQgc3RhcnRpbmcKKyAgICAgKiBmcm9tIHRoZSBuZXdseSBkaXNjb3ZlcmVkIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiAoSWRlYWxseSB3ZSBzaG91bGQgaGF2ZSBhIG1ldGhvZCB0aGF0IHdvcmtzIGFnYWluc3QgdGhlIGN1cnJlbnQgcG9zaXRpb24sCisgICAgICogYnV0IHRoZSB3YXkgdGhlIGRhdGEgc3RydWN0dXJlIGlzIHJlYWQgbWFrZXMgdGhpcyBzb21ld2hhdCBkaWZmaWN1bHQuKQorICAgICAqCisgICAgICogVGhpcyBjcmVhdGVzIGEgbmV3IHtAbGluayBYTUxTdHJlYW1CdWZmZXJNYXJrfSB0aGF0IHNoYXJlcyB0aGUgdW5kZXJseWluZworICAgICAqIGRhdGEgc3RvcmFnZSwgdGh1cyBpdCdzIGZhaXJseSBlZmZpY2llbnQuCisgICAgICovCisgICAgcHVibGljIFhNTFN0cmVhbUJ1ZmZlciBuZXh0VGFnQW5kTWFyaygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IHMgPSBwZWVrU3RydWN0dXJlKCk7CisgICAgICAgICAgICBpZigocyAmVFlQRV9NQVNLKT09VF9FTEVNRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gbmV4dCBpcyBzdGFydCBlbGVtZW50LgorICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBpbnNjb3BlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KF9uYW1lc3BhY2VBSUlzRW5kKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCA7IGk8X25hbWVzcGFjZUFJSXNFbmQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaW5zY29wZS5wdXQoX25hbWVzcGFjZUFJSXNQcmVmaXhbaV0sX25hbWVzcGFjZUFJSXNOYW1lc3BhY2VOYW1lW2ldKTsKKworICAgICAgICAgICAgICAgIFhNTFN0cmVhbUJ1ZmZlck1hcmsgbWFyayA9IG5ldyBYTUxTdHJlYW1CdWZmZXJNYXJrKGluc2NvcGUsIHRoaXMpOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFyazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYobmV4dCgpPT1FTkRfRUxFTUVOVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaChfY29tcGxldGlvblN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIENPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJJbnZhbGlkIFN0YXRlIik7CisgICAgICAgICAgICBjYXNlIFBFTkRJTkdfRU5EX0RPQ1VNRU5UOgorICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VBSUlzRW5kID0gMDsKKyAgICAgICAgICAgICAgICBfY29tcGxldGlvblN0YXRlID0gQ09NUExFVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBfZXZlbnRUeXBlID0gRU5EX0RPQ1VNRU5UOworICAgICAgICB9CisKKyAgICAgICAgLy8gUG9wIHRoZSBzdGFjayBvZiBlbGVtZW50cworICAgICAgICAvLyBUaGlzIGlzIGEgcG9zdC1wcm9jZXNzaW5nIG9wZXJhdGlvbgorICAgICAgICAvLyBUaGUgc3RhY2sgb2YgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHBvcHBvZWQgYWZ0ZXIKKyAgICAgICAgLy8gdGhlIEVORF9FTEVNRU5UIGV2ZW50IGlzIHJldHVybmVkIHNvIHRoYXQgdGhlIGNvcnJlY3QgZWxlbWVudCBuYW1lCisgICAgICAgIC8vIGFuZCBuYW1lc3BhY2Ugc2NvcGUgaXMgcmV0dXJuZWQKKyAgICAgICAgc3dpdGNoKF9ldmVudFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlQ6CisgICAgICAgICAgICAgICAgaWYgKF9kZXB0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgX2RlcHRoLS07CisgICAgICAgICAgICAgICAgICAgIC8vIF9kZXB0aCBpbmRleCBpcyBhbHdheXMgc2V0IHRvIHRoZSBuZXh0IGZyZWUgc3RhY2sgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gcHVzaAorICAgICAgICAgICAgICAgICAgICBwb3BFbGVtZW50U3RhY2soX2RlcHRoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9kZXB0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIF9kZXB0aC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIF9jaGFyYWN0ZXJzID0gbnVsbDsKKyAgICAgICAgX2NoYXJTZXF1ZW5jZSA9IG51bGw7CisgICAgICAgIHdoaWxlKHRydWUpIHsvLyBsb29wIG9ubHkgaWYgd2UgcmVhZCBTVEFURV9ET0NVTUVOVAorICAgICAgICAgICAgc3dpdGNoKHJlYWRFaWlTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9ET0NVTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgYWx3YXlzIHByb2R1Y2UgYSBmdWxsIGRvY3VtZW50LCBhbmQgd2UndmUgYWxyZWFkeSByZXBvcnQgU1RBUlRfRE9DVU1FTlQgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHNpbXBseSBza2lsIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1VfTE5fUU46IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSA9IHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeEZyb21RTmFtZShyZWFkU3RydWN0dXJlU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbGVtZW50KHByZWZpeCwgdXJpLCBsb2NhbE5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZSA9IFNUQVJUX0VMRU1FTlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRUxFTUVOVF9QX1VfTE46CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbGVtZW50KHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZSA9IFNUQVJUX0VMRU1FTlQ7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1VfTE46CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbGVtZW50KG51bGwsIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZFN0cnVjdHVyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ldmVudFR5cGUgPSBTVEFSVF9FTEVNRU5UOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRUxFTUVOVF9MTjoKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQobnVsbCwgbnVsbCwgcmVhZFN0cnVjdHVyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ldmVudFR5cGUgPSBTVEFSVF9FTEVNRU5UOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfVEVYVF9BU19DSEFSX0FSUkFZX1NNQUxMOgorICAgICAgICAgICAgICAgICAgICBfdGV4dExlbiA9IHJlYWRTdHJ1Y3R1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RleHRPZmZzZXQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIoX3RleHRMZW4pOworICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVycyA9IF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlcjsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZSA9IENIQVJBQ1RFUlM7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUX0FTX0NIQVJfQVJSQVlfTUVESVVNOgorICAgICAgICAgICAgICAgICAgICBfdGV4dExlbiA9IHJlYWRTdHJ1Y3R1cmUxNigpOworICAgICAgICAgICAgICAgICAgICBfdGV4dE9mZnNldCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcihfdGV4dExlbik7CisgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJzID0gX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXZlbnRUeXBlID0gQ0hBUkFDVEVSUzsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RFWFRfQVNfQ0hBUl9BUlJBWV9DT1BZOgorICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVycyA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0NvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RleHRMZW4gPSBfY2hhcmFjdGVycy5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIF90ZXh0T2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZSA9IENIQVJBQ1RFUlM7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUX0FTX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgX2V2ZW50VHlwZSA9IENIQVJBQ1RFUlM7CisgICAgICAgICAgICAgICAgICAgIF9jaGFyU2VxdWVuY2UgPSByZWFkQ29udGVudFN0cmluZygpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXZlbnRUeXBlID0gQ0hBUkFDVEVSUzsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RFWFRfQVNfT0JKRUNUOgorICAgICAgICAgICAgICAgICAgICBfZXZlbnRUeXBlID0gQ0hBUkFDVEVSUzsKKyAgICAgICAgICAgICAgICAgICAgX2NoYXJTZXF1ZW5jZSA9IChDaGFyU2VxdWVuY2UpcmVhZENvbnRlbnRPYmplY3QoKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZSA9IENIQVJBQ1RFUlM7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfU01BTEw6CisgICAgICAgICAgICAgICAgICAgIF90ZXh0TGVuID0gcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBfdGV4dE9mZnNldCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcihfdGV4dExlbik7CisgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJzID0gX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXZlbnRUeXBlID0gQ09NTUVOVDsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9NRURJVU06CisgICAgICAgICAgICAgICAgICAgIF90ZXh0TGVuID0gcmVhZFN0cnVjdHVyZTE2KCk7CisgICAgICAgICAgICAgICAgICAgIF90ZXh0T2Zmc2V0ID0gcmVhZENvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyKF90ZXh0TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgX2NoYXJhY3RlcnMgPSBfY29udGVudENoYXJhY3RlcnNCdWZmZXI7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ldmVudFR5cGUgPSBDT01NRU5UOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09NTUVOVF9BU19DSEFSX0FSUkFZX0NPUFk6CisgICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJzID0gcmVhZENvbnRlbnRDaGFyYWN0ZXJzQ29weSgpOworICAgICAgICAgICAgICAgICAgICBfdGV4dExlbiA9IF9jaGFyYWN0ZXJzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgX3RleHRPZmZzZXQgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXZlbnRUeXBlID0gQ09NTUVOVDsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBfY2hhclNlcXVlbmNlID0gcmVhZENvbnRlbnRTdHJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW50VHlwZSA9IENPTU1FTlQ7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBfcGlUYXJnZXQgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIF9waURhdGEgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ldmVudFR5cGUgPSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRU5EOgorICAgICAgICAgICAgICAgICAgICBpZiAoX2RlcHRoID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXZlbnRUeXBlID0gRU5EX0VMRU1FTlQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2RlcHRoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGxhc3QgZW5kIGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IHRyZWUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2ZyYWdtZW50TW9kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKC0tX3RyZWVDb3VudD09MCkgLy8gaXMgdGhpcyB0aGUgbGFzdCB0cmVlIGluIHRoZSBmb3Jlc3Q/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wbGV0aW9uU3RhdGUgPSBQRU5ESU5HX0VORF9ET0NVTUVOVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXZlbnRUeXBlID0gRU5EX0VMRU1FTlQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG9ubHkgaGFwcGVucyB3aGVuIHdlIGFyZSBwcm9jZXNzaW5nIGEgZnVsbCBkb2N1bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIGhpdCB0aGUgImVuZCBvZiBkb2N1bWVudCIgbWFya2VyCisgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlQUlJc0VuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29tcGxldGlvblN0YXRlID0gQ09NUExFVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ldmVudFR5cGUgPSBFTkRfRE9DVU1FTlQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJJbnZhbGlkIFN0YXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBiZSB1bnJlYWNoYWJsZQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVxdWlyZShpbnQgdHlwZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCB0eXBlICE9IF9ldmVudFR5cGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIiIpOworICAgICAgICB9CisgICAgICAgIGlmKCBuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiAhbmFtZXNwYWNlVVJJLmVxdWFscyhnZXROYW1lc3BhY2VVUkkoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIiIpOworICAgICAgICB9CisgICAgICAgIGlmKGxvY2FsTmFtZSAhPSBudWxsICYmICFsb2NhbE5hbWUuZXF1YWxzKGdldExvY2FsTmFtZSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVsZW1lbnRUZXh0VHJpbSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAvLyBUT0RPIGdldEVsZW1lbnRUZXh0KiBtZXRob2RzIG1vcmUgZWZmaWNpZW50bHkKKyAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUZXh0KCkudHJpbSgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoX2V2ZW50VHlwZSAhPSBTVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIG5leHQoKTsKKyAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUZXh0KHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RWxlbWVudFRleHQoYm9vbGVhbiBzdGFydEVsZW1lbnRSZWFkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzdGFydEVsZW1lbnRSZWFkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBldmVudFR5cGUgPSBnZXRFdmVudFR5cGUoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlKGV2ZW50VHlwZSAhPSBFTkRfRUxFTUVOVCApIHsKKyAgICAgICAgICAgIGlmKGV2ZW50VHlwZSA9PSBDSEFSQUNURVJTCisgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50VHlwZSA9PSBDREFUQQorICAgICAgICAgICAgICAgICAgICB8fCBldmVudFR5cGUgPT0gU1BBQ0UKKyAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRUeXBlID09IEVOVElUWV9SRUZFUkVOQ0UpIHsKKyAgICAgICAgICAgICAgICBjb250ZW50LmFwcGVuZChnZXRUZXh0KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmKGV2ZW50VHlwZSA9PSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OCisgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50VHlwZSA9PSBDT01NRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcHBpbmcKKyAgICAgICAgICAgIH0gZWxzZSBpZihldmVudFR5cGUgPT0gRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiIik7CisgICAgICAgICAgICB9IGVsc2UgaWYoZXZlbnRUeXBlID09IFNUQVJUX0VMRU1FTlQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudFR5cGUgPSBuZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgbmV4dCgpOworICAgICAgICByZXR1cm4gbmV4dFRhZyh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IG5leHRUYWcoYm9vbGVhbiBjdXJyZW50VGFnUmVhZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGludCBldmVudFR5cGUgPSBnZXRFdmVudFR5cGUoKTsKKyAgICAgICAgaWYgKCFjdXJyZW50VGFnUmVhZCkgeworICAgICAgICAgICAgZXZlbnRUeXBlID0gbmV4dCgpOworICAgICAgICB9CisgICAgICAgIHdoaWxlKChldmVudFR5cGUgPT0gQ0hBUkFDVEVSUyAmJiBpc1doaXRlU3BhY2UoKSkgLy8gc2tpcCB3aGl0ZXNwYWNlCisgICAgICAgIHx8IChldmVudFR5cGUgPT0gQ0RBVEEgJiYgaXNXaGl0ZVNwYWNlKCkpCisgICAgICAgIHx8IGV2ZW50VHlwZSA9PSBTUEFDRQorICAgICAgICB8fCBldmVudFR5cGUgPT0gUFJPQ0VTU0lOR19JTlNUUlVDVElPTgorICAgICAgICB8fCBldmVudFR5cGUgPT0gQ09NTUVOVCkgeworICAgICAgICAgICAgZXZlbnRUeXBlID0gbmV4dCgpOworICAgICAgICB9CisgICAgICAgIGlmIChldmVudFR5cGUgIT0gU1RBUlRfRUxFTUVOVCAmJiBldmVudFR5cGUgIT0gRU5EX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBldmVudFR5cGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIChfZXZlbnRUeXBlICE9IEVORF9ET0NVTUVOVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIChfZXZlbnRUeXBlID09IFNUQVJUX0VMRU1FTlQpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIChfZXZlbnRUeXBlID09IEVORF9FTEVNRU5UKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7CisgICAgICAgIHJldHVybiAoX2V2ZW50VHlwZSA9PSBDSEFSQUNURVJTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7CisgICAgICAgIGlmKGlzQ2hhcmFjdGVycygpIHx8IChfZXZlbnRUeXBlID09IENEQVRBKSl7CisgICAgICAgICAgICBjaGFyIFtdIGNoID0gdGhpcy5nZXRUZXh0Q2hhcmFjdGVycygpOworICAgICAgICAgICAgaW50IHN0YXJ0ID0gdGhpcy5nZXRUZXh0U3RhcnQoKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSB0aGlzLmdldFRleHRMZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSBjaFtpXTsKKyAgICAgICAgICAgICAgICBpZiAoIShjID09IDB4MjAgfHwgYyA9PSAweDkgfHwgYyA9PSAweEQgfHwgYyA9PSAweEEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIGlmIChfZXZlbnRUeXBlICE9IFNUQVJUX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBTZXQgdG8gdGhlIGVtcHR5IHN0cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlCisgICAgICAgICAgICAvLyBvcmcueG1sLnNheC5BdHRyaWJ1dGVzIGludGVyZmFjZQorICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gIiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX2F0dHJpYnV0ZUNhY2hlLmdldFZhbHVlKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgeworICAgICAgICBpZiAoX2V2ZW50VHlwZSAhPSBTVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfYXR0cmlidXRlQ2FjaGUuZ2V0TGVuZ3RoKCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKF9ldmVudFR5cGUgIT0gU1RBUlRfRUxFTUVOVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gX2F0dHJpYnV0ZUNhY2hlLmdldFByZWZpeChpbmRleCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSBfYXR0cmlidXRlQ2FjaGUuZ2V0TG9jYWxOYW1lKGluZGV4KTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IF9hdHRyaWJ1dGVDYWNoZS5nZXRVUkkoaW5kZXgpOworICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSxsb2NhbE5hbWUscHJlZml4KTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGludCBpbmRleCkgeworICAgICAgICBpZiAoX2V2ZW50VHlwZSAhPSBTVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZml4RW1wdHlTdHJpbmcoX2F0dHJpYnV0ZUNhY2hlLmdldFVSSShpbmRleCkpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpbmRleCkgeworICAgICAgICBpZiAoX2V2ZW50VHlwZSAhPSBTVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2F0dHJpYnV0ZUNhY2hlLmdldExvY2FsTmFtZShpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChfZXZlbnRUeXBlICE9IFNUQVJUX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaXhFbXB0eVN0cmluZyhfYXR0cmlidXRlQ2FjaGUuZ2V0UHJlZml4KGluZGV4KSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpbmRleCkgeworICAgICAgICBpZiAoX2V2ZW50VHlwZSAhPSBTVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2F0dHJpYnV0ZUNhY2hlLmdldFR5cGUoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChfZXZlbnRUeXBlICE9IFNUQVJUX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVDYWNoZS5nZXRWYWx1ZShpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgeworICAgICAgICBpZiAoX2V2ZW50VHlwZSA9PSBTVEFSVF9FTEVNRU5UIHx8IF9ldmVudFR5cGUgPT0gRU5EX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIHJldHVybiBfc3RhY2tUb3AubmFtZXNwYWNlQUlJc0VuZCAtIF9zdGFja1RvcC5uYW1lc3BhY2VBSUlzU3RhcnQ7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKF9ldmVudFR5cGUgPT0gU1RBUlRfRUxFTUVOVCB8fCBfZXZlbnRUeXBlID09IEVORF9FTEVNRU5UKSB7CisgICAgICAgICAgICByZXR1cm4gX25hbWVzcGFjZUFJSXNQcmVmaXhbX3N0YWNrVG9wLm5hbWVzcGFjZUFJSXNTdGFydCArIGluZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIiIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpbmRleCkgeworICAgICAgICBpZiAoX2V2ZW50VHlwZSA9PSBTVEFSVF9FTEVNRU5UIHx8IF9ldmVudFR5cGUgPT0gRU5EX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIHJldHVybiBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbX3N0YWNrVG9wLm5hbWVzcGFjZUFJSXNTdGFydCArIGluZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIiIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIF9uc0N0eC5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgTmFtZXNwYWNlQ29udGV4dEV4IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBfbnNDdHg7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXRFdmVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBfZXZlbnRUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgaWYgKF9jaGFyYWN0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhfY2hhcmFjdGVycywgX3RleHRPZmZzZXQsIF90ZXh0TGVuKTsKKyAgICAgICAgICAgIF9jaGFyU2VxdWVuY2UgPSBzOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0gZWxzZSBpZiAoX2NoYXJTZXF1ZW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gX2NoYXJTZXF1ZW5jZS50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKKyAgICAgICAgaWYgKF9jaGFyYWN0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBfY2hhcmFjdGVyczsKKyAgICAgICAgfSBlbHNlIGlmIChfY2hhclNlcXVlbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gdHJ5IHRvIGF2b2lkIGNyZWF0aW9uIG9mIGEgdGVtcG9yYXJ5IFN0cmluZyBmb3Igc29tZQorICAgICAgICAgICAgLy8gQ2hhclNlcXVlbmNlIGltcGxlbWVudGF0aW9ucworICAgICAgICAgICAgX2NoYXJhY3RlcnMgPSBfY2hhclNlcXVlbmNlLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIF90ZXh0TGVuID0gX2NoYXJhY3RlcnMubGVuZ3RoOworICAgICAgICAgICAgX3RleHRPZmZzZXQgPSAwOworICAgICAgICAgICAgcmV0dXJuIF9jaGFyYWN0ZXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXRUZXh0U3RhcnQoKSB7CisgICAgICAgIGlmIChfY2hhcmFjdGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gX3RleHRPZmZzZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoX2NoYXJTZXF1ZW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKKyAgICAgICAgaWYgKF9jaGFyYWN0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBfdGV4dExlbjsKKyAgICAgICAgfSBlbHNlIGlmIChfY2hhclNlcXVlbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBfY2hhclNlcXVlbmNlLmxlbmd0aCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXRUZXh0Q2hhcmFjdGVycyhpbnQgc291cmNlU3RhcnQsIGNoYXJbXSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0U3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZiAoX2NoYXJhY3RlcnMgIT0gbnVsbCkgeworICAgICAgICB9IGVsc2UgaWYgKF9jaGFyU2VxdWVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgX2NoYXJhY3RlcnMgPSBfY2hhclNlcXVlbmNlLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIF90ZXh0TGVuID0gX2NoYXJhY3RlcnMubGVuZ3RoOworICAgICAgICAgICAgX3RleHRPZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShfY2hhcmFjdGVycywgc291cmNlU3RhcnQsIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENoYXJTZXF1ZW5jZUltcGwgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UgeworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBfb2Zmc2V0OworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBfbGVuZ3RoOworCisgICAgICAgIENoYXJTZXF1ZW5jZUltcGwoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICAgICAgX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgIF9sZW5ndGggPSBsZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgeworICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBfdGV4dExlbikgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcmFjdGVyc1tfdGV4dE9mZnNldCArIGluZGV4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpZiAoZW5kIDwgMCB8fCBzdGFydCA8IDAgfHwgZW5kID4gbGVuZ3RoIHx8IHN0YXJ0ID4gZW5kKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFyU2VxdWVuY2VJbXBsKF9vZmZzZXQgKyBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhfY2hhcmFjdGVycywgX29mZnNldCwgX2xlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgQ2hhclNlcXVlbmNlIGdldFBDREFUQSgpIHsKKyAgICAgICAgaWYgKF9jaGFyYWN0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhclNlcXVlbmNlSW1wbChfdGV4dE9mZnNldCwgX3RleHRMZW4pOworICAgICAgICB9IGVsc2UgaWYgKF9jaGFyU2VxdWVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIF9jaGFyU2VxdWVuY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gIlVURi04IjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUZXh0KCkgeworICAgICAgICByZXR1cm4gKF9jaGFyYWN0ZXJzICE9IG51bGwgfHwgX2NoYXJTZXF1ZW5jZSAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgRHVtbXlMb2NhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc05hbWUoKSB7CisgICAgICAgIHJldHVybiAoX2V2ZW50VHlwZSA9PSBTVEFSVF9FTEVNRU5UIHx8IF9ldmVudFR5cGUgPT0gRU5EX0VMRU1FTlQpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBRTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX3N0YWNrVG9wLmdldFFOYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfc3RhY2tUb3AubG9jYWxOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gX3N0YWNrVG9wLnVyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdGFja1RvcC5wcmVmaXg7CisKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiAiMS4wIjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuICJVVEYtOCI7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQSVRhcmdldCgpIHsKKyAgICAgICAgaWYgKF9ldmVudFR5cGUgPT0gUFJPQ0VTU0lOR19JTlNUUlVDVElPTikgeworICAgICAgICAgICAgcmV0dXJuIF9waVRhcmdldDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBJRGF0YSgpIHsKKyAgICAgICAgaWYgKF9ldmVudFR5cGUgPT0gUFJPQ0VTU0lOR19JTlNUUlVDVElPTikgeworICAgICAgICAgICAgcmV0dXJuIF9waURhdGE7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBwdXNoRWxlbWVudFN0YWNrKCk7CisgICAgICAgIF9zdGFja1RvcC5zZXQocHJlZml4LCB1cmksIGxvY2FsTmFtZSk7CisKKyAgICAgICAgX2F0dHJpYnV0ZUNhY2hlLmNsZWFyKCk7CisKKyAgICAgICAgaW50IGl0ZW0gPSBwZWVrU3RydWN0dXJlKCk7CisgICAgICAgIGlmICgoaXRlbSAmIFRZUEVfTUFTSykgPT0gVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIG9uIHRoZSBlbGVtZW50CisgICAgICAgICAgICAvLyB0aGV5IHdpbGwgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkKKyAgICAgICAgICAgIGl0ZW0gPSBwcm9jZXNzTmFtZXNwYWNlQXR0cmlidXRlcyhpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGl0ZW0gJiBUWVBFX01BU0spID09IFRfQVRUUklCVVRFKSB7CisgICAgICAgICAgICBwcm9jZXNzQXR0cmlidXRlcyhpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNpemVOYW1lc3BhY2VBdHRyaWJ1dGVzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lc3BhY2VBSUlzUHJlZml4ID0gbmV3IFN0cmluZ1tfbmFtZXNwYWNlQUlJc0VuZCAqIDJdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9uYW1lc3BhY2VBSUlzUHJlZml4LCAwLCBuYW1lc3BhY2VBSUlzUHJlZml4LCAwLCBfbmFtZXNwYWNlQUlJc0VuZCk7CisgICAgICAgIF9uYW1lc3BhY2VBSUlzUHJlZml4ID0gbmFtZXNwYWNlQUlJc1ByZWZpeDsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lc3BhY2VBSUlzTmFtZXNwYWNlTmFtZSA9IG5ldyBTdHJpbmdbX25hbWVzcGFjZUFJSXNFbmQgKiAyXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWUsIDAsIG5hbWVzcGFjZUFJSXNOYW1lc3BhY2VOYW1lLCAwLCBfbmFtZXNwYWNlQUlJc0VuZCk7CisgICAgICAgIF9uYW1lc3BhY2VBSUlzTmFtZXNwYWNlTmFtZSA9IG5hbWVzcGFjZUFJSXNOYW1lc3BhY2VOYW1lOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHByb2Nlc3NOYW1lc3BhY2VBdHRyaWJ1dGVzKGludCBpdGVtKXsKKyAgICAgICAgX3N0YWNrVG9wLm5hbWVzcGFjZUFJSXNTdGFydCA9IF9uYW1lc3BhY2VBSUlzRW5kOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlQUlJc0VuZCA9PSBfbmFtZXNwYWNlQUlJc1ByZWZpeC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXNpemVOYW1lc3BhY2VBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaChfbmlpU3RhdGVUYWJsZVtpdGVtXSl7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9OQU1FU1BBQ0VfQVRUUklCVVRFOgorICAgICAgICAgICAgICAgICAgICAvLyBVbmRlY2xhcmF0aW9uIG9mIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VBSUlzUHJlZml4W19uYW1lc3BhY2VBSUlzRW5kXSA9CisgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VBSUlzTmFtZXNwYWNlTmFtZVtfbmFtZXNwYWNlQUlJc0VuZCsrXSA9ICIiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX05BTUVTUEFDRV9BVFRSSUJVVEVfUDoKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5kZWNsYXJhdGlvbiBvZiBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZUFJSXNQcmVmaXhbX25hbWVzcGFjZUFJSXNFbmRdID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbX25hbWVzcGFjZUFJSXNFbmQrK10gPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9OQU1FU1BBQ0VfQVRUUklCVVRFX1BfVToKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVjbGFyYXRpb24gd2l0aCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZUFJSXNQcmVmaXhbX25hbWVzcGFjZUFJSXNFbmRdID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbX25hbWVzcGFjZUFJSXNFbmQrK10gPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfTkFNRVNQQUNFX0FUVFJJQlVURV9VOgorICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGRlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VBSUlzUHJlZml4W19uYW1lc3BhY2VBSUlzRW5kXSA9ICIiOworICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbX25hbWVzcGFjZUFJSXNFbmQrK10gPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOworCisgICAgICAgICAgICBpdGVtID0gcGVla1N0cnVjdHVyZSgpOworICAgICAgICB9IHdoaWxlKChpdGVtICYgVFlQRV9NQVNLKSA9PSBUX05BTUVTUEFDRV9BVFRSSUJVVEUpOworCisgICAgICAgIF9zdGFja1RvcC5uYW1lc3BhY2VBSUlzRW5kID0gX25hbWVzcGFjZUFJSXNFbmQ7CisKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBdHRyaWJ1dGVzKGludCBpdGVtKXsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3dpdGNoKF9haWlTdGF0ZVRhYmxlW2l0ZW1dKXsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0FUVFJJQlVURV9VX0xOX1FOOiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmkgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXhGcm9tUU5hbWUocmVhZFN0cnVjdHVyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZUNhY2hlLmFkZEF0dHJpYnV0ZVdpdGhQcmVmaXgocHJlZml4LCB1cmksIGxvY2FsTmFtZSwgcmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkQ29udGVudFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQVRUUklCVVRFX1BfVV9MTjoKKyAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZUNhY2hlLmFkZEF0dHJpYnV0ZVdpdGhQcmVmaXgocmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkQ29udGVudFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9BVFRSSUJVVEVfVV9MTjoKKyAgICAgICAgICAgICAgICAgICAgLy8gX2F0dHJpYnV0ZUNhY2hlIGZvbGxvd3MgU0FYIGNvbnZlbnRpb24KKyAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZUNhY2hlLmFkZEF0dHJpYnV0ZVdpdGhQcmVmaXgoIiIsIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRDb250ZW50U3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0FUVFJJQlVURV9MTjogeworICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlQ2FjaGUuYWRkQXR0cmlidXRlV2l0aFByZWZpeCgiIiwgIiIsIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkQ29udGVudFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOworCisgICAgICAgICAgICBpdGVtID0gcGVla1N0cnVjdHVyZSgpOworICAgICAgICB9IHdoaWxlKChpdGVtICYgVFlQRV9NQVNLKSA9PSBUX0FUVFJJQlVURSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1c2hFbGVtZW50U3RhY2soKSB7CisgICAgICAgIGlmIChfZGVwdGggPT0gX3N0YWNrLmxlbmd0aCkgeworICAgICAgICAgICAgLy8gcmVzaXplIHN0YWNrCisgICAgICAgICAgICBFbGVtZW50U3RhY2tFbnRyeSBbXSB0bXAgPSBfc3RhY2s7CisgICAgICAgICAgICBfc3RhY2sgPSBuZXcgRWxlbWVudFN0YWNrRW50cnlbX3N0YWNrLmxlbmd0aCAqIDMgLzIgKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCBfc3RhY2ssIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRtcC5sZW5ndGg7IGkgPCBfc3RhY2subGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgIF9zdGFja1tpXSA9IG5ldyBFbGVtZW50U3RhY2tFbnRyeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgX3N0YWNrVG9wID0gX3N0YWNrW19kZXB0aCsrXTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9wRWxlbWVudFN0YWNrKGludCBkZXB0aCkgeworICAgICAgICAvLyBfZGVwdGggaXMgY2hlY2tlZCBvdXRzaWRlIHRoaXMgbWV0aG9kCisgICAgICAgIF9zdGFja1RvcCA9IF9zdGFja1tkZXB0aCAtIDFdOworICAgICAgICAvLyBNb3ZlIGJhY2sgdGhlIHBvc2l0aW9uIG9mIHRoZSBuYW1lc3BhY2UgaW5kZXgKKyAgICAgICAgX25hbWVzcGFjZUFJSXNFbmQgPSBfc3RhY2tbZGVwdGhdLm5hbWVzcGFjZUFJSXNTdGFydDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEVsZW1lbnRTdGFja0VudHJ5IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByZWZpeC4KKyAgICAgICAgICogSnVzdCBsaWtlIGV2ZXJ5d2hlcmUgZWxzZSBpbiBTdEFYLCB0aGlzIGNhbiBiZSBudWxsIGJ1dCBjYW4ndCBiZSBlbXB0eS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBwcmVmaXg7CisgICAgICAgIC8qKgorICAgICAgICAgKiBOYW1lc3BhY2UgVVJJLgorICAgICAgICAgKiBKdXN0IGxpa2UgZXZlcnl3aGVyZSBlbHNlIGluIFN0QVgsIHRoaXMgY2FuIGJlIG51bGwgYnV0IGNhbid0IGJlIGVtcHR5LgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHVyaTsKKyAgICAgICAgU3RyaW5nIGxvY2FsTmFtZTsKKyAgICAgICAgUU5hbWUgcW5hbWU7CisKKyAgICAgICAgLy8gU3RhcnQgYW5kIGVuZCBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zCisgICAgICAgIC8vIGluIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhcnJheXMKKyAgICAgICAgaW50IG5hbWVzcGFjZUFJSXNTdGFydDsKKyAgICAgICAgaW50IG5hbWVzcGFjZUFJSXNFbmQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgICAgIHRoaXMucW5hbWUgPSBudWxsOworCisgICAgICAgICAgICB0aGlzLm5hbWVzcGFjZUFJSXNTdGFydCA9IHRoaXMubmFtZXNwYWNlQUlJc0VuZCA9IFN0cmVhbVJlYWRlckJ1ZmZlclByb2Nlc3Nvci50aGlzLl9uYW1lc3BhY2VBSUlzRW5kOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgeworICAgICAgICAgICAgaWYgKHFuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBxbmFtZSA9IG5ldyBRTmFtZShmaXhOdWxsKHVyaSksIGxvY2FsTmFtZSwgZml4TnVsbChwcmVmaXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBxbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiAocyA9PSBudWxsKSA/ICIiIDogczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgSW50ZXJuYWxOYW1lc3BhY2VDb250ZXh0IGltcGxlbWVudHMgTmFtZXNwYWNlQ29udGV4dEV4IHsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSJ9KQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcmVmaXggY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIHRoZSBidWZmZXIgd2FzIGNyZWF0ZWQgdXNpbmcgc3RyaW5nIGludGVybmluZworICAgICAgICAgICAgICogaW50ZXJuIHRoZSBwcmVmaXggYW5kIGNoZWNrIGZvciByZWZlcmVuY2UgZXF1YWxpdHkKKyAgICAgICAgICAgICAqIHJhdGhlciB0aGFuIHVzaW5nIFN0cmluZy5lcXVhbHMoKTsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKF9zdHJpbmdJbnRlcm5pbmdGZWF0dXJlKSB7CisgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LmludGVybigpOworCisgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgbW9zdCByZWNlbnRseSBkZWNsYXJlZCBwcmVmaXgKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gX25hbWVzcGFjZUFJSXNFbmQgLSAxOyBpID49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gX25hbWVzcGFjZUFJSXNQcmVmaXhbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1vc3QgcmVjZW50bHkgZGVjbGFyZWQgcHJlZml4CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IF9uYW1lc3BhY2VBSUlzRW5kIC0gMTsgaSA+PTA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyhfbmFtZXNwYWNlQUlJc1ByZWZpeFtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBYTUwtYmFzZWQgcHJlZml4ZXMKKyAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKFhNTENvbnN0YW50cy5YTUxfTlNfUFJFRklYKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBYTUxDb25zdGFudHMuWE1MX05TX1VSSTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlZml4LmVxdWFscyhYTUxDb25zdGFudHMuWE1MTlNfQVRUUklCVVRFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBYTUxDb25zdGFudHMuWE1MTlNfQVRUUklCVVRFX05TX1VSSTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBpID0gZ2V0UHJlZml4ZXMobmFtZXNwYWNlVVJJKTsKKyAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKWkubmV4dCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVmaXhlcyhmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CisgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwpeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5hbWVzcGFjZVVSSSBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhYTUxDb25zdGFudHMuWE1MX05TX1VSSSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChYTUxDb25zdGFudHMuWE1MX05TX1BSRUZJWCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhYTUxDb25zdGFudHMuWE1MTlNfQVRUUklCVVRFX05TX1VSSSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChYTUxDb25zdGFudHMuWE1MTlNfQVRUUklCVVRFKS5pdGVyYXRvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IGkgPSBfbmFtZXNwYWNlQUlJc0VuZCAtIDE7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVGaW5kTmV4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcDsKKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIGZpbmROZXh0KCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZShpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1vc3QgcmVjZW50bHkgZGVjbGFyZWQgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgbW9zdCByZWNlbnRseSBkZWNsYXJlZCBwcmVmaXggb2YgdGhlIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjaGVjayBpZiB0aGUgcHJlZml4IGlzIGluIHNjb3BlIHdpdGggdGhhdCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TmFtZXNwYWNlVVJJKF9uYW1lc3BhY2VBSUlzUHJlZml4W2ldKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwID0gX25hbWVzcGFjZUFJSXNQcmVmaXhbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZUZpbmROZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kTmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZUZpbmROZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwICE9IG51bGwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVGaW5kTmV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluZE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXF1aXJlRmluZE5leHQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIEJpbmRpbmdJbXBsIGltcGxlbWVudHMgTmFtZXNwYWNlQ29udGV4dEV4LkJpbmRpbmcgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIF9wcmVmaXg7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgX25hbWVzcGFjZVVSSTsKKworICAgICAgICAgICAgQmluZGluZ0ltcGwoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgICAgICAgICAgICAgIF9wcmVmaXggPSBwcmVmaXg7CisgICAgICAgICAgICAgICAgX25hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmVmaXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZXNwYWNlVVJJOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPE5hbWVzcGFjZUNvbnRleHRFeC5CaW5kaW5nPiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8TmFtZXNwYWNlQ29udGV4dEV4LkJpbmRpbmc+KCkgeworICAgICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGVuZCA9IF9uYW1lc3BhY2VBSUlzRW5kIC0gMTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBjdXJyZW50ID0gZW5kOworICAgICAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlRmluZE5leHQgPSB0cnVlOworICAgICAgICAgICAgICAgIHByaXZhdGUgTmFtZXNwYWNlQ29udGV4dEV4LkJpbmRpbmcgbmFtZXNwYWNlOworCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBOYW1lc3BhY2VDb250ZXh0RXguQmluZGluZyBmaW5kTmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoY3VycmVudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gX25hbWVzcGFjZUFJSXNQcmVmaXhbY3VycmVudF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgaWYgdGhlIGN1cnJlbnQgcHJlZml4IG9jY3VycyBtb3JlIHJlY2VudGx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbyB0aGVuIGl0IGlzIG5vdCBpbiBzY29wZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBlbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDtpID4gY3VycmVudDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoX25hbWVzcGFjZUFJSXNQcmVmaXhbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IGN1cnJlbnQtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IHByZWZpeCBpcyBpbi1zY29wZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2UgPSBuZXcgQmluZGluZ0ltcGwocHJlZml4LCBfbmFtZXNwYWNlQUlJc05hbWVzcGFjZU5hbWVbY3VycmVudF0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2UgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlRmluZE5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmROZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlRmluZE5leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWVzcGFjZSAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dEV4LkJpbmRpbmcgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVGaW5kTmV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluZE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXF1aXJlRmluZE5leHQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBEdW1teUxvY2F0aW9uICBpbXBsZW1lbnRzIExvY2F0aW9uIHsKKyAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldENoYXJhY3Rlck9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2J1ZmZlci5nZXRTeXN0ZW1JZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeEVtcHR5U3RyaW5nKFN0cmluZyBzKSB7CisgICAgICAgIC8vIHMgbXVzdCBub3QgYmUgbnVsbCwgc28gbm8gbmVlZCB0byBjaGVjayBmb3IgdGhhdC4gdGhhdCB3b3VsZCBiZSBidWcuCisgICAgICAgIGlmKHMubGVuZ3RoKCk9PTApICAgcmV0dXJuIG51bGw7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC9zdHJlYW0vYnVmZmVyL3N0YXgvU3RyZWFtV3JpdGVyQnVmZmVyQ3JlYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zdGF4L1N0cmVhbVdyaXRlckJ1ZmZlckNyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE2NWVmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zdGF4L1N0cmVhbVdyaXRlckJ1ZmZlckNyZWF0b3IuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLnN0YXg7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLk11dGFibGVYTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleC5CYXNlNjREYXRhOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguTmFtZXNwYWNlQ29udGV4dEV4OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguWE1MU3RyZWFtV3JpdGVyRXg7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfSB0aGF0IGZpbGxzIHtAbGluayBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyfS4KKyAqIDxwPgorICogVE9ETzogbmVlZCB0byByZXRhaW4gYWxsIGF0dHJpYnV0ZXMvbmFtZXNwYWNlcyBhbmQgdGhlbiBzdG9yZSBhbGwgbmFtZXNwYWNlcworICogYmVmb3JlIHRoZSBhdHRyaWJ1dGVzLiBDdXJyZW50bHkgaXQgaXMgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGVuc3VyZQorICogYWxsIG5hbWVzcGFjZXMgYXJlIHdyaXR0ZW4gYmVmb3JlIGF0dHJpYnV0ZXMgYW5kIHRoZSBjYWxsZXIgbXVzdCBub3QgaW50ZXJtaXgKKyAqIGNhbGxzIHRvIHRoZSB3cml0ZU5hbWVzcGFjZSBhbmQgd3JpdGVBdHRyaWJ1dGUgbWV0aG9kcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJlYW1Xcml0ZXJCdWZmZXJDcmVhdG9yIGV4dGVuZHMgU3RyZWFtQnVmZmVyQ3JlYXRvciBpbXBsZW1lbnRzIFhNTFN0cmVhbVdyaXRlckV4IHsKKyAgICBwcml2YXRlIGZpbmFsIE5hbWVzcGFjZUNvbnRleEhlbHBlciBuYW1lc3BhY2VDb250ZXh0ID0gbmV3IE5hbWVzcGFjZUNvbnRleEhlbHBlcigpOworCisgICAgLyoqCisgICAgICogTmVzdGluZyBkZXB0aCBvZiB0aGUgZWxlbWVudC4KKyAgICAgKiBUaGlzIGZpZWxkIGlzIHVsdGltYXRlbHkgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSAjIG9mIHRyZWVzIHdlIGNyZWF0ZWQgaW4KKyAgICAgKiB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlcHRoPTA7CisKKyAgICBwdWJsaWMgU3RyZWFtV3JpdGVyQnVmZmVyQ3JlYXRvcigpIHsKKyAgICAgICAgc2V0WE1MU3RyZWFtQnVmZmVyKG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJlYW1Xcml0ZXJCdWZmZXJDcmVhdG9yKE11dGFibGVYTUxTdHJlYW1CdWZmZXIgYnVmZmVyKSB7CisgICAgICAgIHNldFhNTFN0cmVhbUJ1ZmZlcihidWZmZXIpOworICAgIH0KKworICAgIC8vIFhNTFN0cmVhbVdyaXRlcgorCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgc3RyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vcmV0dXJuICBudWxsIGZvciBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy90aHJvd2luZyB1bnN1cHBvcnRlZCBvcGVyYXRpb24gZXhjZXB0aW9uLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dEV4IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBuYW1lc3BhY2VDb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUNvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBuYW1lc3BhY2VDb250ZXh0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSXQgaXMgcmVhbGx5IHVuY2xlYXIgZnJvbSB0aGUgSmF2YURvYyBob3cgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0UHJlZml4KCIiLCBuYW1lc3BhY2VVUkkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgbmFtZXNwYWNlQ29udGV4dC5kZWNsYXJlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbnRleHQuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTdGFydERvY3VtZW50KCIiLCAiIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyB2ZXJzaW9uKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTdGFydERvY3VtZW50KCIiLCAiIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBlbmNvZGluZywgU3RyaW5nIHZlcnNpb24pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBuYW1lc3BhY2VDb250ZXh0LnJlc2V0Q29udGV4dHMoKTsKKworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX0RPQ1VNRU5UKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHN0b3JlU3RydWN0dXJlKFRfRU5EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgbmFtZXNwYWNlQ29udGV4dC5wdXNoQ29udGV4dCgpOworICAgICAgICBkZXB0aCsrOworCisgICAgICAgIGZpbmFsIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkoIiIpOworCisgICAgICAgIGlmIChkZWZhdWx0TmFtZXNwYWNlVVJJID09IG51bGwpCisgICAgICAgICAgICBzdG9yZVF1YWxpZmllZE5hbWUoVF9FTEVNRU5UX0xOLCBudWxsLCBudWxsLCBsb2NhbE5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdG9yZVF1YWxpZmllZE5hbWUoVF9FTEVNRU5UX0xOLCBudWxsLCBkZWZhdWx0TmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBuYW1lc3BhY2VDb250ZXh0LnB1c2hDb250ZXh0KCk7CisgICAgICAgIGRlcHRoKys7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IG5hbWVzcGFjZUNvbnRleHQuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7CisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgbmFtZXNwYWNlQ29udGV4dC5wdXNoQ29udGV4dCgpOworICAgICAgICBzdG9yZVF1YWxpZmllZE5hbWUoVF9FTEVNRU5UX0xOLCBwcmVmaXgsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgbmFtZXNwYWNlQ29udGV4dC5wdXNoQ29udGV4dCgpOworICAgICAgICBkZXB0aCsrOworCisgICAgICAgIHN0b3JlUXVhbGlmaWVkTmFtZShUX0VMRU1FTlRfTE4sIHByZWZpeCwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudChsb2NhbE5hbWUpOworICAgICAgICB3cml0ZUVuZEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOworICAgICAgICB3cml0ZUVuZEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSk7CisgICAgICAgIHdyaXRlRW5kRWxlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBuYW1lc3BhY2VDb250ZXh0LnBvcENvbnRleHQoKTsKKworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX0VORCk7CisgICAgICAgIGlmKC0tZGVwdGg9PTApCisgICAgICAgICAgICBpbmNyZWFzZVRyZWVDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc3RvcmVOYW1lc3BhY2VBdHRyaWJ1dGUobnVsbCwgbmFtZXNwYWNlVVJJKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCJ4bWxucyIuZXF1YWxzKHByZWZpeCkpCisgICAgICAgICAgICBwcmVmaXggPSBudWxsOworICAgICAgICBzdG9yZU5hbWVzcGFjZUF0dHJpYnV0ZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdG9yZUF0dHJpYnV0ZShudWxsLCBudWxsLCBsb2NhbE5hbWUsICJDREFUQSIsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gbmFtZXNwYWNlQ29udGV4dC5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKKyAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZUF0dHJpYnV0ZShwcmVmaXgsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc3RvcmVBdHRyaWJ1dGUocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgIkNEQVRBIiwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ0RhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX1RFWFRfQVNfU1RSSU5HKTsKKyAgICAgICAgc3RvcmVDb250ZW50U3RyaW5nKGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhTdHJpbmcgY2hhckRhdGEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX1RFWFRfQVNfU1RSSU5HKTsKKyAgICAgICAgc3RvcmVDb250ZW50U3RyaW5nKGNoYXJEYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJhY3RlcnMoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgbGVuKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc3RvcmVDb250ZW50Q2hhcmFjdGVycyhUX1RFWFRfQVNfQ0hBUl9BUlJBWSwgYnVmLCBzdGFydCwgbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbW1lbnQoU3RyaW5nIHN0cikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHN0b3JlU3RydWN0dXJlKFRfQ09NTUVOVF9BU19TVFJJTkcpOworICAgICAgICBzdG9yZUNvbnRlbnRTdHJpbmcoc3RyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZURURChTdHJpbmcgc3RyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbm90IHN1cHBvcnQuIGp1c3QgaWdub3JlLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRW50aXR5UmVmKFN0cmluZyBzdHIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdG9yZVN0cnVjdHVyZShUX1VORVhQQU5ERURfRU5USVRZX1JFRkVSRU5DRSk7CisgICAgICAgIHN0b3JlQ29udGVudFN0cmluZyhzdHIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsICIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHN0b3JlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7CisgICAgfQorCisgICAgLy8gWE1MU3RyZWFtV3JpdGVyRXgKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlUENEQVRBKENoYXJTZXF1ZW5jZSBjaGFyU2VxdWVuY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZiAoY2hhclNlcXVlbmNlIGluc3RhbmNlb2YgQmFzZTY0RGF0YSkgeworICAgICAgICAgICAgc3RvcmVTdHJ1Y3R1cmUoVF9URVhUX0FTX09CSkVDVCk7CisgICAgICAgICAgICBzdG9yZUNvbnRlbnRPYmplY3QoKChCYXNlNjREYXRhKWNoYXJTZXF1ZW5jZSkuY2xvbmUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZUNoYXJhY3RlcnMoY2hhclNlcXVlbmNlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgZW5kcG9pbnRVUkwpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBCYXNlNjREYXRhIGQgPSBuZXcgQmFzZTY0RGF0YSgpOworICAgICAgICBieXRlIGJbXSA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIG9mZnNldCwgYiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgZC5zZXQoYiwgbGVuZ3RoLCBudWxsLCB0cnVlKTsKKyAgICAgICAgc3RvcmVTdHJ1Y3R1cmUoVF9URVhUX0FTX09CSkVDVCk7CisgICAgICAgIHN0b3JlQ29udGVudE9iamVjdChkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShEYXRhSGFuZGxlciBkYXRhSGFuZGxlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE91dHB1dFN0cmVhbSB3cml0ZUJpbmFyeShTdHJpbmcgZW5kcG9pbnRVUkwpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAvLyBUT0RPCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc3RheC9TdHJlYW1Xcml0ZXJCdWZmZXJQcm9jZXNzb3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3N0cmVhbS9idWZmZXIvc3RheC9TdHJlYW1Xcml0ZXJCdWZmZXJQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY3NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvc3RyZWFtL2J1ZmZlci9zdGF4L1N0cmVhbVdyaXRlckJ1ZmZlclByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zdGF4OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5BYnN0cmFjdFByb2Nlc3NvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuc3RheGV4LlhNTFN0cmVhbVdyaXRlckV4OworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CisKKworLyoqCisgKiBBIHByb2Nlc3NvciBvZiBhIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9IHRoYXQgd3JpdGVzIHRoZSBYTUwgaW5mb3NldCB0byBhCisgKiB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwuU2FuZG96QFN1bi5Db20KKyAqIEBhdXRob3IgSy5WZW51Z29wYWxAc3VuLmNvbQorICovCitwdWJsaWMgY2xhc3MgU3RyZWFtV3JpdGVyQnVmZmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzb3IgeworCisKKyAgICBwdWJsaWMgU3RyZWFtV3JpdGVyQnVmZmVyUHJvY2Vzc29yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNTdHJlYW1Xcml0ZXJCdWZmZXJQcm9jZXNzb3IoWE1MU3RyZWFtQnVmZmVyLCBib29sZWFuKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZWFtV3JpdGVyQnVmZmVyUHJvY2Vzc29yKFhNTFN0cmVhbUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgc2V0WE1MU3RyZWFtQnVmZmVyKGJ1ZmZlcixidWZmZXIuaXNGcmFnbWVudCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJvZHVjZUZyYWdtZW50RXZlbnQKKyAgICAgKiAgICAgIFRydWUgdG8gZ2VuZXJhdGUgZnJhZ21lbnQgU0FYIGV2ZW50cyB3aXRob3V0IHN0YXJ0L2VuZERvY3VtZW50LgorICAgICAqICAgICAgRmFsc2UgdG8gZ2VuZXJhdGUgYSBmdWxsIGRvY3VtZW50IFNBWCBldmVudHMuCisgICAgICovCisgICAgcHVibGljIFN0cmVhbVdyaXRlckJ1ZmZlclByb2Nlc3NvcihYTUxTdHJlYW1CdWZmZXIgYnVmZmVyLGJvb2xlYW4gcHJvZHVjZUZyYWdtZW50RXZlbnQpIHsKKyAgICAgICAgc2V0WE1MU3RyZWFtQnVmZmVyKGJ1ZmZlcixwcm9kdWNlRnJhZ21lbnRFdmVudCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2VzcyhYTUxTdHJlYW1CdWZmZXIgYnVmZmVyLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0WE1MU3RyZWFtQnVmZmVyKGJ1ZmZlcixidWZmZXIuaXNGcmFnbWVudCgpKTsKKyAgICAgICAgcHJvY2Vzcyh3cml0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmKF9mcmFnbWVudE1vZGUpeworICAgICAgICAgICAgd3JpdGVGcmFnbWVudCh3cml0ZXIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHdyaXRlKHdyaXRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVXNlIHtAbGluayAjc2V0WE1MU3RyZWFtQnVmZmVyKFhNTFN0cmVhbUJ1ZmZlciwgYm9vbGVhbil9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WE1MU3RyZWFtQnVmZmVyKFhNTFN0cmVhbUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgc2V0QnVmZmVyKGJ1ZmZlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByb2R1Y2VGcmFnbWVudEV2ZW50CisgICAgICogICAgICBUcnVlIHRvIGdlbmVyYXRlIGZyYWdtZW50IFNBWCBldmVudHMgd2l0aG91dCBzdGFydC9lbmREb2N1bWVudC4KKyAgICAgKiAgICAgIEZhbHNlIHRvIGdlbmVyYXRlIGEgZnVsbCBkb2N1bWVudCBTQVggZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhNTFN0cmVhbUJ1ZmZlcihYTUxTdHJlYW1CdWZmZXIgYnVmZmVyLCBib29sZWFuIHByb2R1Y2VGcmFnbWVudEV2ZW50KSB7CisgICAgICAgIHNldEJ1ZmZlcihidWZmZXIscHJvZHVjZUZyYWdtZW50RXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIGZ1bGwgWE1MIGluZm9zZXQgZXZlbnQgdG8gdGhlIGdpdmVuIHdyaXRlciwKKyAgICAgKiBpbmNsdWRpbmcgc3RhcnQvZW5kIGRvY3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb257CisKKyAgICAgICAgaWYoIV9mcmFnbWVudE1vZGUpIHsKKyAgICAgICAgICAgIGlmKF90cmVlQ291bnQ+MSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb3Jlc3QgY2Fubm90IGJlIHdyaXR0ZW4gYXMgYSBmdWxsIGluZm9zZXQiKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGlmIHdlIGFyZSB3cml0aW5nIGEgZnJhZ21lbnQgWE1MU3RyZWFtQnVmZmVyIGFzIGEgZnVsbCBkb2N1bWVudCwKKyAgICAgICAgLy8gd2UgbmVlZCB0byBwdXQgaW4tc2NvcGUgbmFtZXNwYWNlcyBhcyB0b3AtbGV2ZWwgbnMgZGVjbHMuCisKKyAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgaW50IGl0ZW0gPSBfZWlpU3RhdGVUYWJsZVtwZWVrU3RydWN0dXJlKCldOworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisKKyAgICAgICAgICAgIHN3aXRjaChpdGVtKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9ET0NVTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOyAvL3NraXAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1VfTE5fUU46CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1BfVV9MTjoKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfVV9MTjoKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfTE46CisgICAgICAgICAgICAgICAgICAgIHdyaXRlRnJhZ21lbnQod3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DT01NRU5UX0FTX0NIQVJfQVJSQVlfU01BTEw6IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1lbnQgPSBuZXcgU3RyaW5nKF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9NRURJVU06IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZTE2KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdGFydCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcihsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWVudCA9IG5ldyBTdHJpbmcoX2NvbnRlbnRDaGFyYWN0ZXJzQnVmZmVyLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ29tbWVudChjb21tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09NTUVOVF9BU19DSEFSX0FSUkFZX0NPUFk6IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBjaGFyW10gY2ggPSByZWFkQ29udGVudENoYXJhY3RlcnNDb3B5KCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQobmV3IFN0cmluZyhjaCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOgorICAgICAgICAgICAgICAgICAgICByZWFkU3RydWN0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRU5EOiAvLyBkb25lCisgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJ1Y3R1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIkludmFsaWQgU3RhdGUgIitpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBidWZmZXIgYXMgYSBmcmFnbWVudCwgbWVhbmluZworICAgICAqIHRoZSB3cml0ZXIgd2lsbCBub3QgcmVjZWl2ZSBzdGFydC9lbmREb2N1bWVudCBldmVudHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB7QGxpbmsgWE1MU3RyZWFtQnVmZmVyfSBoYXMgYSBmb3Jlc3QsIHRoaXMgbWV0aG9kIHdpbGwgd3JpdGUgYWxsIHRoZSBmb3Jlc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlRnJhZ21lbnQoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgaW5zdGFuY2VvZiBYTUxTdHJlYW1Xcml0ZXJFeCkgeworICAgICAgICAgICAgd3JpdGVGcmFnbWVudEV4KChYTUxTdHJlYW1Xcml0ZXJFeCl3cml0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVGcmFnbWVudE5vRXgod3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRnJhZ21lbnRFeChYTUxTdHJlYW1Xcml0ZXJFeCB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpbnQgZGVwdGggPSAwOyAgLy8gdXNlZCB0byBkZXRlcm1pbmUgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGEgdHJlZS4KKworICAgICAgICBpbnQgaXRlbSA9IF9laWlTdGF0ZVRhYmxlW3BlZWtTdHJ1Y3R1cmUoKV07CisgICAgICAgIGlmKGl0ZW09PVNUQVRFX0RPQ1VNRU5UKQorICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOyAgICAvLyBza2lwIFNUQVRFX0RPQ1VNRU5UCisKKyAgICAgICAgZG8geworCisgICAgICAgICAgICBpdGVtID0gcmVhZEVpaVN0YXRlKCk7CisKKyAgICAgICAgICAgIHN3aXRjaChpdGVtKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9ET0NVTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1VfTE5fUU46IHsKKyAgICAgICAgICAgICAgICAgICAgZGVwdGggKys7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmkgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXhGcm9tUU5hbWUocmVhZFN0cnVjdHVyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCxsb2NhbE5hbWUsdXJpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGVzKHdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfUF9VX0xOOiB7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoICsrOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LGxvY2FsTmFtZSx1cmkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZXMod3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRUxFTUVOVF9VX0xOOiB7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoICsrOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIiIsbG9jYWxOYW1lLHVyaSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlcyh3cml0ZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX0xOOiB7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoICsrOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGVzKHdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RFWFRfQVNfQ0hBUl9BUlJBWV9TTUFMTDogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhfY29udGVudENoYXJhY3RlcnNCdWZmZXIsc3RhcnQsbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfVEVYVF9BU19DSEFSX0FSUkFZX01FRElVTTogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZTE2KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdGFydCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcihsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlcixzdGFydCxsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUX0FTX0NIQVJfQVJSQVlfQ09QWTogeworICAgICAgICAgICAgICAgICAgICBjaGFyW10gYyA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0NvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhjLDAsYy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUX0FTX1NUUklORzogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHJlYWRDb250ZW50U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMocyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RFWFRfQVNfT0JKRUNUOiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBjID0gKENoYXJTZXF1ZW5jZSlyZWFkQ29udGVudE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVQQ0RBVEEoYyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9TTUFMTDogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1lbnQgPSBuZXcgU3RyaW5nKF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9NRURJVU06IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHJlYWRTdHJ1Y3R1cmUxNigpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1lbnQgPSBuZXcgU3RyaW5nKF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9DT1BZOiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBjaCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0NvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ29tbWVudChuZXcgU3RyaW5nKGNoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BST0NFU1NJTkdfSU5TVFJVQ1RJT046CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRU5EOgorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoIC0tOworICAgICAgICAgICAgICAgICAgICBpZihkZXB0aD09MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF90cmVlQ291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiSW52YWxpZCBTdGF0ZSAiK2l0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlKGRlcHRoPjAgfHwgX3RyZWVDb3VudD4wKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRnJhZ21lbnROb0V4KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpbnQgZGVwdGggPSAwOworCisgICAgICAgIGludCBpdGVtID0gX2VpaVN0YXRlVGFibGVbcGVla1N0cnVjdHVyZSgpXTsKKyAgICAgICAgaWYoaXRlbT09U1RBVEVfRE9DVU1FTlQpCisgICAgICAgICAgICByZWFkU3RydWN0dXJlKCk7ICAgIC8vIHNraXAgU1RBVEVfRE9DVU1FTlQKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpdGVtID0gcmVhZEVpaVN0YXRlKCk7CisKKyAgICAgICAgICAgIHN3aXRjaChpdGVtKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9ET0NVTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX1VfTE5fUU46IHsKKyAgICAgICAgICAgICAgICAgICAgZGVwdGggKys7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmkgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXhGcm9tUU5hbWUocmVhZFN0cnVjdHVyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCxsb2NhbE5hbWUsdXJpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGVzKHdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VMRU1FTlRfUF9VX0xOOiB7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoICsrOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LGxvY2FsTmFtZSx1cmkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZXMod3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRUxFTUVOVF9VX0xOOiB7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoICsrOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIiIsbG9jYWxOYW1lLHVyaSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlcyh3cml0ZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTEVNRU5UX0xOOiB7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoICsrOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZFN0cnVjdHVyZVN0cmluZygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGVzKHdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RFWFRfQVNfQ0hBUl9BUlJBWV9TTUFMTDogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhfY29udGVudENoYXJhY3RlcnNCdWZmZXIsc3RhcnQsbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfVEVYVF9BU19DSEFSX0FSUkFZX01FRElVTTogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZTE2KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdGFydCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0J1ZmZlcihsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlcixzdGFydCxsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUX0FTX0NIQVJfQVJSQVlfQ09QWTogeworICAgICAgICAgICAgICAgICAgICBjaGFyW10gYyA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0NvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhjLDAsYy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUX0FTX1NUUklORzogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHJlYWRDb250ZW50U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMocyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RFWFRfQVNfT0JKRUNUOiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBjID0gKENoYXJTZXF1ZW5jZSlyZWFkQ29udGVudE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKGMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9TTUFMTDogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFN0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1lbnQgPSBuZXcgU3RyaW5nKF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9NRURJVU06IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHJlYWRTdHJ1Y3R1cmUxNigpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSByZWFkQ29udGVudENoYXJhY3RlcnNCdWZmZXIobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1lbnQgPSBuZXcgU3RyaW5nKF9jb250ZW50Q2hhcmFjdGVyc0J1ZmZlciwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NPTU1FTlRfQVNfQ0hBUl9BUlJBWV9DT1BZOiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBjaCA9IHJlYWRDb250ZW50Q2hhcmFjdGVyc0NvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ29tbWVudChuZXcgU3RyaW5nKGNoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BST0NFU1NJTkdfSU5TVFJVQ1RJT046CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRU5EOgorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoIC0tOworICAgICAgICAgICAgICAgICAgICBpZihkZXB0aD09MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF90cmVlQ291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiSW52YWxpZCBTdGF0ZSAiK2l0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlKGRlcHRoID4gMCAmJiBfdHJlZUNvdW50PjApOworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlcyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGl0ZW0gPSBwZWVrU3RydWN0dXJlKCk7CisgICAgICAgIGlmICgoaXRlbSAmIFRZUEVfTUFTSykgPT0gVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIG9uIHRoZSBlbGVtZW50CisgICAgICAgICAgICAvLyB0aGV5IHdpbGwgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkKKyAgICAgICAgICAgIGl0ZW0gPSB3cml0ZU5hbWVzcGFjZUF0dHJpYnV0ZXMoaXRlbSwgd3JpdGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGl0ZW0gJiBUWVBFX01BU0spID09IFRfQVRUUklCVVRFKSB7CisgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZXMoaXRlbSwgd3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHdyaXRlTmFtZXNwYWNlQXR0cmlidXRlcyhpbnQgaXRlbSwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN3aXRjaChfbmlpU3RhdGVUYWJsZVtpdGVtXSl7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9OQU1FU1BBQ0VfQVRUUklCVVRFOgorICAgICAgICAgICAgICAgICAgICAvLyBVbmRlY2xhcmF0aW9uIG9mIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZURlZmF1bHROYW1lc3BhY2UoIiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX05BTUVTUEFDRV9BVFRSSUJVVEVfUDoKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5kZWNsYXJhdGlvbiBvZiBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVjbGFyYXRpb24gd2l0aCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgIiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX05BTUVTUEFDRV9BVFRSSUJVVEVfUF9VOgorICAgICAgICAgICAgICAgICAgICAvLyBEZWNsYXJhdGlvbiB3aXRoIHByZWZpeAorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX05BTUVTUEFDRV9BVFRSSUJVVEVfVToKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVEZWZhdWx0TmFtZXNwYWNlKHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOworCisgICAgICAgICAgICBpdGVtID0gcGVla1N0cnVjdHVyZSgpOworICAgICAgICB9IHdoaWxlKChpdGVtICYgVFlQRV9NQVNLKSA9PSBUX05BTUVTUEFDRV9BVFRSSUJVVEUpOworCisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZXMoaW50IGl0ZW0sIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBkbyB7CisgICAgICAgICAgICBzd2l0Y2goX2FpaVN0YXRlVGFibGVbaXRlbV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0FUVFJJQlVURV9VX0xOX1FOOiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmkgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSByZWFkU3RydWN0dXJlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXhGcm9tUU5hbWUocmVhZFN0cnVjdHVyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKHByZWZpeCx1cmksbG9jYWxOYW1lLHJlYWRDb250ZW50U3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9BVFRSSUJVVEVfUF9VX0xOOgorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUocmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkU3RydWN0dXJlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkQ29udGVudFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9BVFRSSUJVVEVfVV9MTjoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKSwgcmVhZFN0cnVjdHVyZVN0cmluZygpLCByZWFkQ29udGVudFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9BVFRSSUJVVEVfTE46CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShyZWFkU3RydWN0dXJlU3RyaW5nKCksIHJlYWRDb250ZW50U3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgYXR0cmlidXRlIHR5cGUKKyAgICAgICAgICAgIHJlYWRTdHJ1Y3R1cmVTdHJpbmcoKTsKKworICAgICAgICAgICAgcmVhZFN0cnVjdHVyZSgpOworCisgICAgICAgICAgICBpdGVtID0gcGVla1N0cnVjdHVyZSgpOworICAgICAgICB9IHdoaWxlKChpdGVtICYgVFlQRV9NQVNLKSA9PSBUX0FUVFJJQlVURSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9BdHRyaWJ1dGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQXR0cmlidXRlLmphdmEKaW5kZXggNDBmMDVkYi4uMjNjNjdmMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9BdHRyaWJ1dGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0F0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQ2RhdGEuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQ2RhdGEuamF2YQppbmRleCBlMjhmYTc2Li5kYWI2ODQ5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0NkYXRhLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9DZGF0YS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQ29tbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9Db21tZW50LmphdmEKaW5kZXggOTVhZTYwOC4uMjljZWIyZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9Db21tZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9Db21tZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzI7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9Db250YWluZXJFbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0NvbnRhaW5lckVsZW1lbnQuamF2YQppbmRleCBkMDdkM2NlLi5iYzI5NzMwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0NvbnRhaW5lckVsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0NvbnRhaW5lckVsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3MjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0NvbnRlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQ29udGVudC5qYXZhCmluZGV4IDBiZThjMzIuLjcyOTRmYmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQ29udGVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQ29udGVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQ29udGVudFZpc2l0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvQ29udGVudFZpc2l0b3IuamF2YQppbmRleCBmYzkzZDYwLi42MDg1OWQ3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0NvbnRlbnRWaXNpdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9Db250ZW50VmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvRGF0YXR5cGVXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvRGF0YXR5cGVXcml0ZXIuamF2YQppbmRleCAzYjZjMzUwLi5jOWU0YjE3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0RhdGF0eXBlV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9EYXRhdHlwZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvRG9jdW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvRG9jdW1lbnQuamF2YQppbmRleCBlN2JkYTIzLi5hNjlhM2Q4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0RvY3VtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9Eb2N1bWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5vdXRwdXQuWG1sU2VyaWFsaXplcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvRW5kRG9jdW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvRW5kRG9jdW1lbnQuamF2YQppbmRleCAwNDAyYzU2Li4zY2QyZTc5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0VuZERvY3VtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9FbmREb2N1bWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvRW5kVGFnLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0VuZFRhZy5qYXZhCmluZGV4IDM0YjM5NjQuLmM2MGE5MjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvRW5kVGFnLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9FbmRUYWcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3MjsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0lsbGVnYWxBbm5vdGF0aW9uRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0lsbGVnYWxBbm5vdGF0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggNWEwMjU3My4uODlmMTNlYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9JbGxlZ2FsQW5ub3RhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvSWxsZWdhbEFubm90YXRpb25FeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3MjsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL0lsbGVnYWxTaWduYXR1cmVFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvSWxsZWdhbFNpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGI3MTQ3NzkuLmQzMTVlN2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvSWxsZWdhbFNpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvSWxsZWdhbFNpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvTmFtZXNwYWNlRGVjbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9OYW1lc3BhY2VEZWNsLmphdmEKaW5kZXggNDgwMDNhOS4uNTU5NWNlNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9OYW1lc3BhY2VEZWNsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9OYW1lc3BhY2VEZWNsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzI7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9OYW1lc3BhY2VSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9OYW1lc3BhY2VSZXNvbHZlci5qYXZhCmluZGV4IGMxODJkMmMuLjJhMDVhNDUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvTmFtZXNwYWNlUmVzb2x2ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL05hbWVzcGFjZVJlc29sdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzI7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9OYW1lc3BhY2VTdXBwb3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL05hbWVzcGFjZVN1cHBvcnQuamF2YQppbmRleCA4ZGQ0YzIxLi4xNTY0YjJiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL05hbWVzcGFjZVN1cHBvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL05hbWVzcGFjZVN1cHBvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIC8vIE5hbWVzcGFjZVN1cHBvcnQuamF2YSAtIGdlbmVyaWMgTmFtZXNwYWNlIHN1cHBvcnQgZm9yIFNBWC4KIC8vIGh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcKIC8vIFdyaXR0ZW4gYnkgRGF2aWQgTWVnZ2luc29uCkBAIC05MSw2ICs5Miw3IEBACiAgKgogICogQHNpbmNlIFNBWCAyLjAKICAqIEBhdXRob3IgRGF2aWQgTWVnZ2luc29uCisgKiBAdmVyc2lvbiAyLjAuMSAoc2F4MnIyKQogICovCiBmaW5hbCBjbGFzcyBOYW1lc3BhY2VTdXBwb3J0CiB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1BjZGF0YS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9QY2RhdGEuamF2YQppbmRleCBjMzJlYWExLi40MzIxZmRjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1BjZGF0YS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvUGNkYXRhLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzI7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9TdGFydERvY3VtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1N0YXJ0RG9jdW1lbnQuamF2YQppbmRleCA1NmU2NTlhLi40MmE0NjAyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1N0YXJ0RG9jdW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1N0YXJ0RG9jdW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3MjsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1N0YXJ0VGFnLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1N0YXJ0VGFnLmphdmEKaW5kZXggZjE2NDJjYS4uNmI5NWQ2MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9TdGFydFRhZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvU3RhcnRUYWcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3MjsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1RYVy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9UWFcuamF2YQppbmRleCBhZTY3NjQxLi5jNjVhY2NjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1RYVy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvVFhXLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dC5YbWxTZXJpYWxpemVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9UZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1RleHQuamF2YQppbmRleCAyMjU1OGMxLi40OWE1ZjA3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1RleHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1RleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3MjsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1R4d0V4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9UeHdFeGNlcHRpb24uamF2YQppbmRleCA3MTc5ZDk5Li4wMTdmODYyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1R4d0V4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvVHh3RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzI7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9UeXBlZFhtbFdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9UeXBlZFhtbFdyaXRlci5qYXZhCmluZGV4IGYyYzk4NGMuLjkwYWE5NTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvVHlwZWRYbWxXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL1R5cGVkWG1sV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzI7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb24uWG1sRWxlbWVudDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvYW5ub3RhdGlvbi9YbWxBdHRyaWJ1dGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvYW5ub3RhdGlvbi9YbWxBdHRyaWJ1dGUuamF2YQppbmRleCAwYTU4YTIxLi5lMjhmMWQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL2Fubm90YXRpb24vWG1sQXR0cmlidXRlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbEF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb247CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbENEQVRBLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL2Fubm90YXRpb24vWG1sQ0RBVEEuamF2YQppbmRleCA5ODI4MDk1Li4yMWRmZGY0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL2Fubm90YXRpb24vWG1sQ0RBVEEuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL2Fubm90YXRpb24vWG1sQ0RBVEEuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5hbm5vdGF0aW9uOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbEVsZW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvYW5ub3RhdGlvbi9YbWxFbGVtZW50LmphdmEKaW5kZXggZTdkYzcyNS4uZmVhOTZjZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbEVsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL2Fubm90YXRpb24vWG1sRWxlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb247CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR5cGVkWG1sV3JpdGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbE5hbWVzcGFjZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbE5hbWVzcGFjZS5qYXZhCmluZGV4IDM2MDJmM2MuLmIzM2FmNDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvYW5ub3RhdGlvbi9YbWxOYW1lc3BhY2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL2Fubm90YXRpb24vWG1sTmFtZXNwYWNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvYW5ub3RhdGlvbi9YbWxWYWx1ZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbFZhbHVlLmphdmEKaW5kZXggMDcxYzQ0MS4uOTE1YjZiYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbFZhbHVlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL1htbFZhbHVlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvYW5ub3RhdGlvbi9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL2Fubm90YXRpb24vcGFja2FnZS5odG1sCmluZGV4IGRlOGI4MzIuLmMxMzZjMjkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvYW5ub3RhdGlvbi9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9hbm5vdGF0aW9uL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgogICA8cD4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0NoYXJhY3RlckVzY2FwZUhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0NoYXJhY3RlckVzY2FwZUhhbmRsZXIuamF2YQppbmRleCBlNDQxY2FkLi5mNzFhNDRkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9DaGFyYWN0ZXJFc2NhcGVIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvQ2hhcmFjdGVyRXNjYXBlSGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDggQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIub3V0cHV0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0RhdGFXcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0RhdGFXcml0ZXIuamF2YQppbmRleCAyN2UwZWViLi5kYmU4MGZlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9EYXRhV3JpdGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvRGF0YVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogLy9AQDNSRCBQQVJUWSBDT0RFQEAKIAogLy8gRGF0YVdyaXRlci5qYXZhIC0gWE1MIHdyaXRlciBmb3IgZGF0YS1vcmllbnRlZCBmaWxlcy4KQEAgLTkxLDYgKzkyLDcgQEAKICAqCiAgKiBAc2luY2UgMS4wCiAgKiBAYXV0aG9yIERhdmlkIE1lZ2dpbnNvbiwgZGF2aWRAbWVnZ2luc29uLmNvbQorICogQHZlcnNpb24gMC4yCiAgKiBAc2VlIFhNTFdyaXRlcgogICovCiBwdWJsaWMgY2xhc3MgRGF0YVdyaXRlciBleHRlbmRzIFhNTFdyaXRlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvRGVsZWdhdGluZ1hNTFN0cmVhbVdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvRGVsZWdhdGluZ1hNTFN0cmVhbVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNGJhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9EZWxlZ2F0aW5nWE1MU3RyZWFtV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5vdXRwdXQ7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CisKKy8qKgorICogRGVsZWdhdGluZyB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2Fic3RyYWN0IGNsYXNzIERlbGVnYXRpbmdYTUxTdHJlYW1Xcml0ZXIgaW1wbGVtZW50cyBYTUxTdHJlYW1Xcml0ZXIgeworICAgIHByaXZhdGUgZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcjsKKworICAgIHB1YmxpYyBEZWxlZ2F0aW5nWE1MU3RyZWFtV3JpdGVyKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUVtcHR5RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUVtcHR5RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlRW1wdHlFbGVtZW50KGxvY2FsTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVFbmRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGxvY2FsTmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShwcmVmaXgsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVDb21tZW50KFN0cmluZyBkYXRhKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlQ29tbWVudChkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUNEYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlQ0RhdGEoZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVEVEQoU3RyaW5nIGR0ZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZURURChkdGQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRW50aXR5UmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlRW50aXR5UmVmKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyB2ZXJzaW9uKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlU3RhcnREb2N1bWVudCh2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgdmVyc2lvbikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoZW5jb2RpbmcsIHZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhTdHJpbmcgdGV4dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnModGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKGNoYXJbXSB0ZXh0LCBpbnQgc3RhcnQsIGludCBsZW4pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHRleHQsIHN0YXJ0LCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyB1cmkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gd3JpdGVyLmdldFByZWZpeCh1cmkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIHVyaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgdXJpKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLnNldERlZmF1bHROYW1lc3BhY2UodXJpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci5zZXROYW1lc3BhY2VDb250ZXh0KGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiB3cml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gd3JpdGVyLmdldFByb3BlcnR5KG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0RvbVNlcmlhbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0RvbVNlcmlhbGl6ZXIuamF2YQppbmRleCA4ZGU5MzJmLi4zNGUzYzQwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9Eb21TZXJpYWxpemVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvRG9tU2VyaWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dDsKIAogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwpAQCAtNTUsNyArNTYsNyBAQAogCiAgICAgcHVibGljIERvbVNlcmlhbGl6ZXIoTm9kZSBub2RlKSB7CiAgICAgICAgIERvbTJTYXhBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRG9tMlNheEFkYXB0ZXIobm9kZSk7Ci0gICAgICAgIHNlcmlhbGl6ZXIgPSBuZXcgU2F4U2VyaWFsaXplcihhZGFwdGVyLGFkYXB0ZXIpOworICAgICAgICBzZXJpYWxpemVyID0gbmV3IFNheFNlcmlhbGl6ZXIoYWRhcHRlcixhZGFwdGVyLGZhbHNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRG9tU2VyaWFsaXplcihET01SZXN1bHQgZG9tUmVzdWx0KSB7CkBAIC02OCwxMiArNjksMTIgQEAKICAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CiAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIubmV3RG9jdW1lbnQoKTsKICAgICAgICAgICAgICAgICBkb21SZXN1bHQuc2V0Tm9kZShkb2MpOwotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIgPSBuZXcgU2F4U2VyaWFsaXplcihuZXcgRG9tMlNheEFkYXB0ZXIoZG9jKSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplciA9IG5ldyBTYXhTZXJpYWxpemVyKG5ldyBEb20yU2F4QWRhcHRlcihkb2MpLG51bGwsZmFsc2UpOwogICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHh3RXhjZXB0aW9uKHBjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVyID0gbmV3IFNheFNlcmlhbGl6ZXIobmV3IERvbTJTYXhBZGFwdGVyKG5vZGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIgPSBuZXcgU2F4U2VyaWFsaXplcihuZXcgRG9tMlNheEFkYXB0ZXIobm9kZSksbnVsbCxmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0R1bWJFc2NhcGVIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9EdW1iRXNjYXBlSGFuZGxlci5qYXZhCmluZGV4IGI4ODdmN2UuLjBlZTUyNmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0R1bWJFc2NhcGVIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvRHVtYkVzY2FwZUhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw4IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9EdW1wU2VyaWFsaXplci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvRHVtcFNlcmlhbGl6ZXIuamF2YQppbmRleCA2N2JjZTA3Li4xNDYwNjEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9EdW1wU2VyaWFsaXplci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0R1bXBTZXJpYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNiArMjIsNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIub3V0cHV0OwogCiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0luZGVudGluZ1hNTEZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvSW5kZW50aW5nWE1MRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlMjY0MAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0luZGVudGluZ1hNTEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIub3V0cHV0OworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLyoqCisgKiB7QGxpbmsgWE1MRmlsdGVySW1wbH0gdGhhdCBkb2VzIGluZGVudGF0aW9uIHRvIFNBWCBldmVudHMuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgSW5kZW50aW5nWE1MRmlsdGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbCBpbXBsZW1lbnRzIExleGljYWxIYW5kbGVyIHsKKyAgICBwcml2YXRlIExleGljYWxIYW5kbGVyIGxleGljYWw7CisKKyAgICBwdWJsaWMgSW5kZW50aW5nWE1MRmlsdGVyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBJbmRlbnRpbmdYTUxGaWx0ZXIoQ29udGVudEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBzZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZW50aW5nWE1MRmlsdGVyKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsIExleGljYWxIYW5kbGVyIGxleGljYWwpIHsKKyAgICAgICAgc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7CisgICAgICAgIHNldExleGljYWxIYW5kbGVyKGxleGljYWwpOworICAgIH0KKworICAgIHB1YmxpYyBMZXhpY2FsSGFuZGxlciBnZXRMZXhpY2FsSGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIGxleGljYWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGV4aWNhbEhhbmRsZXIoTGV4aWNhbEhhbmRsZXIgbGV4aWNhbCkgeworICAgICAgICB0aGlzLmxleGljYWwgPSBsZXhpY2FsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IGluZGVudCBzdGVwLgorICAgICAqCisgICAgICogPHA+UmV0dXJuIHRoZSBjdXJyZW50IGluZGVudCBzdGVwOiBlYWNoIHN0YXJ0IHRhZyB3aWxsIGJlCisgICAgICogaW5kZW50ZWQgYnkgdGhpcyBudW1iZXIgb2Ygc3BhY2VzIHRpbWVzIHRoZSBudW1iZXIgb2YKKyAgICAgKiBhbmNlc3RvcnMgdGhhdCB0aGUgZWxlbWVudCBoYXMuPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBlYWNoIGluZGVudGF0aW9uIHN0ZXAsCisgICAgICogICAgICAgICBvciAwIG9yIGxlc3MgZm9yIG5vIGluZGVudGF0aW9uLgorICAgICAqIEBzZWUgI3NldEluZGVudFN0ZXAoaW50KQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIE9ubHkgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluZGVudCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRlbnRTdGVwICgpCisgICAgeworICAgICAgICByZXR1cm4gaW5kZW50U3RlcC5sZW5ndGgoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCBpbmRlbnQgc3RlcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRlbnRTdGVwIFRoZSBuZXcgaW5kZW50IHN0ZXAgKDAgb3IgbGVzcyBmb3Igbm8KKyAgICAgKiAgICAgICAgaW5kZW50YXRpb24pLgorICAgICAqIEBzZWUgI2dldEluZGVudFN0ZXAoKQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFNob3VsZCB1c2UgdGhlIHZlcnNpb24gdGhhdCB0YWtlcyBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5kZW50U3RlcCAoaW50IGluZGVudFN0ZXApCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IoIDsgaW5kZW50U3RlcD4wOyBpbmRlbnRTdGVwLS0gKSAgIHMuYXBwZW5kKCcgJyk7CisgICAgICAgIHNldEluZGVudFN0ZXAocy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRlbnRTdGVwKFN0cmluZyBzKSB7CisgICAgICAgIHRoaXMuaW5kZW50U3RlcCA9IHM7CisgICAgfQorCisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gT3ZlcnJpZGUgbWV0aG9kcyBmcm9tIFhNTFdyaXRlci4KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzdGFydCB0YWcuCisgICAgICoKKyAgICAgKiA8cD5FYWNoIHRhZyB3aWxsIGJlZ2luIG9uIGEgbmV3IGxpbmUsIGFuZCB3aWxsIGJlCisgICAgICogaW5kZW50ZWQgYnkgdGhlIGN1cnJlbnQgaW5kZW50IHN0ZXAgdGltZXMgdGhlIG51bWJlcgorICAgICAqIG9mIGFuY2VzdG9ycyB0aGF0IHRoZSBlbGVtZW50IGhhcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgbmV3bGluZSBhbmQgaW5kZW50YXRpb24gd2lsbCBiZSBwYXNzZWQgb24gZG93bgorICAgICAqIHRoZSBmaWx0ZXIgY2hhaW4gdGhyb3VnaCByZWd1bGFyIGNoYXJhY3RlcnMgZXZlbnRzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGVsZW1lbnQncyBOYW1lc3BhY2UgVVJJLgorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGVsZW1lbnQncyBsb2NhbCBuYW1lLgorICAgICAqIEBwYXJhbSBxTmFtZSBUaGUgZWxlbWVudCdzIHF1YWxpZmllZCAocHJlZml4ZWQpIG5hbWUuCisgICAgICogQHBhcmFtIGF0dHMgVGhlIGVsZW1lbnQncyBhdHRyaWJ1dGUgbGlzdC4KKyAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgICAqICAgICAgICAgICAgd3JpdGluZyB0aGUgc3RhcnQgdGFnLCBvciBpZiBhIGZpbHRlciBmdXJ0aGVyCisgICAgICogICAgICAgICAgICBkb3duIHRoZSBjaGFpbiByYWlzZXMgYW4gZXhjZXB0aW9uLgorICAgICAqIEBzZWUgWE1MV3JpdGVyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLEF0dHJpYnV0ZXMpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50IChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdGF0ZVN0YWNrLnB1c2goU0VFTl9FTEVNRU5UKTsKKyAgICAgICAgc3RhdGUgPSBTRUVOX05PVEhJTkc7CisgICAgICAgIGlmIChkZXB0aCA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlTmV3TGluZSgpOworICAgICAgICB9CisgICAgICAgIGRvSW5kZW50KCk7CisgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHMpOworICAgICAgICBkZXB0aCsrOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU5ld0xpbmUoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuY2hhcmFjdGVycyhORVdMSU5FLDAsTkVXTElORS5sZW5ndGgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBORVdMSU5FID0geydcbid9OworCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBlbmQgdGFnLgorICAgICAqCisgICAgICogPHA+SWYgdGhlIGVsZW1lbnQgaGFzIGNvbnRhaW5lZCBvdGhlciBlbGVtZW50cywgdGhlIHRhZworICAgICAqIHdpbGwgYXBwZWFyIGluZGVudGVkIG9uIGEgbmV3IGxpbmU7IG90aGVyd2lzZSwgaXQgd2lsbAorICAgICAqIGFwcGVhciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgd2hhdGV2ZXIgY2FtZSBiZWZvcmUuPC9wPgorICAgICAqCisgICAgICogPHA+VGhlIG5ld2xpbmUgYW5kIGluZGVudGF0aW9uIHdpbGwgYmUgcGFzc2VkIG9uIGRvd24KKyAgICAgKiB0aGUgZmlsdGVyIGNoYWluIHRocm91Z2ggcmVndWxhciBjaGFyYWN0ZXJzIGV2ZW50cy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBlbGVtZW50J3MgTmFtZXNwYWNlIFVSSS4KKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBlbGVtZW50J3MgbG9jYWwgbmFtZS4KKyAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIGVsZW1lbnQncyBxdWFsaWZpZWQgKHByZWZpeGVkKSBuYW1lLgorICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICogICAgICAgICAgICB3cml0aW5nIHRoZSBlbmQgdGFnLCBvciBpZiBhIGZpbHRlciBmdXJ0aGVyCisgICAgICogICAgICAgICAgICBkb3duIHRoZSBjaGFpbiByYWlzZXMgYW4gZXhjZXB0aW9uLgorICAgICAqIEBzZWUgWE1MV3JpdGVyI2VuZEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50IChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlcHRoLS07CisgICAgICAgIGlmIChzdGF0ZSA9PSBTRUVOX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIHdyaXRlTmV3TGluZSgpOworICAgICAgICAgICAgZG9JbmRlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7CisgICAgICAgIHN0YXRlID0gc3RhdGVTdGFjay5wb3AoKTsKKyAgICB9CisKKworLy8gICAgLyoqCisvLyAgICAgKiBXcml0ZSBhIGVtcHR5IGVsZW1lbnQgdGFnLgorLy8gICAgICoKKy8vICAgICAqIDxwPkVhY2ggdGFnIHdpbGwgYXBwZWFyIG9uIGEgbmV3IGxpbmUsIGFuZCB3aWxsIGJlCisvLyAgICAgKiBpbmRlbnRlZCBieSB0aGUgY3VycmVudCBpbmRlbnQgc3RlcCB0aW1lcyB0aGUgbnVtYmVyCisvLyAgICAgKiBvZiBhbmNlc3RvcnMgdGhhdCB0aGUgZWxlbWVudCBoYXMuPC9wPgorLy8gICAgICoKKy8vICAgICAqIDxwPlRoZSBuZXdsaW5lIGFuZCBpbmRlbnRhdGlvbiB3aWxsIGJlIHBhc3NlZCBvbiBkb3duCisvLyAgICAgKiB0aGUgZmlsdGVyIGNoYWluIHRocm91Z2ggcmVndWxhciBjaGFyYWN0ZXJzIGV2ZW50cy48L3A+CisvLyAgICAgKgorLy8gICAgICogQHBhcmFtIHVyaSBUaGUgZWxlbWVudCdzIE5hbWVzcGFjZSBVUkkuCisvLyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBlbGVtZW50J3MgbG9jYWwgbmFtZS4KKy8vICAgICAqIEBwYXJhbSBxTmFtZSBUaGUgZWxlbWVudCdzIHF1YWxpZmllZCAocHJlZml4ZWQpIG5hbWUuCisvLyAgICAgKiBAcGFyYW0gYXR0cyBUaGUgZWxlbWVudCdzIGF0dHJpYnV0ZSBsaXN0LgorLy8gICAgICogQGV4Y2VwdGlvbiBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gSWYgdGhlcmUgaXMgYW4gZXJyb3IKKy8vICAgICAqICAgICAgICAgICAgd3JpdGluZyB0aGUgZW1wdHkgdGFnLCBvciBpZiBhIGZpbHRlciBmdXJ0aGVyCisvLyAgICAgKiAgICAgICAgICAgIGRvd24gdGhlIGNoYWluIHJhaXNlcyBhbiBleGNlcHRpb24uCisvLyAgICAgKiBAc2VlIFhNTFdyaXRlciNlbXB0eUVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQXR0cmlidXRlcykKKy8vICAgICAqLworLy8gICAgcHVibGljIHZvaWQgZW1wdHlFbGVtZW50IChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykKKy8vICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisvLyAgICB7CisvLyAgICAgICAgc3RhdGUgPSBTRUVOX0VMRU1FTlQ7CisvLyAgICAgICAgaWYgKGRlcHRoID4gMCkgeworLy8gICAgICAgICAgICBzdXBlci5jaGFyYWN0ZXJzKCJcbiIpOworLy8gICAgICAgIH0KKy8vICAgICAgICBkb0luZGVudCgpOworLy8gICAgICAgIHN1cGVyLmVtcHR5RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHMpOworLy8gICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ggVGhlIGNoYXJhY3RlcnMgdG8gd3JpdGUuCisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlLgorICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICogICAgICAgICAgICB3cml0aW5nIHRoZSBjaGFyYWN0ZXJzLCBvciBpZiBhIGZpbHRlciBmdXJ0aGVyCisgICAgICogICAgICAgICAgICBkb3duIHRoZSBjaGFpbiByYWlzZXMgYW4gZXhjZXB0aW9uLgorICAgICAqIEBzZWUgWE1MV3JpdGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzIChjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3RhdGUgPSBTRUVOX0RBVEE7CisgICAgICAgIHN1cGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZiAoZGVwdGggPiAwKSB7CisgICAgICAgICAgICB3cml0ZU5ld0xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBkb0luZGVudCgpOworICAgICAgICBpZihsZXhpY2FsIT1udWxsKQorICAgICAgICAgICAgbGV4aWNhbC5jb21tZW50KGNoLHN0YXJ0LGxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYobGV4aWNhbCE9bnVsbCkKKyAgICAgICAgICAgIGxleGljYWwuc3RhcnREVEQobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYobGV4aWNhbCE9bnVsbCkKKyAgICAgICAgICAgIGxleGljYWwuZW5kRFREKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZihsZXhpY2FsIT1udWxsKQorICAgICAgICAgICAgbGV4aWNhbC5zdGFydEVudGl0eShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZihsZXhpY2FsIT1udWxsKQorICAgICAgICAgICAgbGV4aWNhbC5lbmRFbnRpdHkobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpZihsZXhpY2FsIT1udWxsKQorICAgICAgICAgICAgbGV4aWNhbC5zdGFydENEQVRBKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYobGV4aWNhbCE9bnVsbCkKKyAgICAgICAgICAgIGxleGljYWwuZW5kQ0RBVEEoKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEludGVybmFsIG1ldGhvZHMuCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisgICAgLyoqCisgICAgICogUHJpbnQgaW5kZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IGxldmVsLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gSWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAgKiAgICAgICAgICAgIHdyaXRpbmcgdGhlIGluZGVudGF0aW9uIGNoYXJhY3RlcnMsIG9yIGlmIGEgZmlsdGVyCisgICAgICogICAgICAgICAgICBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHJhaXNlcyBhbiBleGNlcHRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvSW5kZW50ICgpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChkZXB0aCA+IDApIHsKKyAgICAgICAgICAgIGNoYXJbXSBjaCA9IGluZGVudFN0ZXAudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxkZXB0aDsgaSsrICkKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzKGNoLCAwLCBjaC5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbnN0YW50cy4KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IFNFRU5fTk9USElORyA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgU0VFTl9FTEVNRU5UID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBTRUVOX0RBVEEgPSBuZXcgT2JqZWN0KCk7CisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW50ZXJuYWwgc3RhdGUuCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHByaXZhdGUgT2JqZWN0IHN0YXRlID0gU0VFTl9OT1RISU5HOworICAgIHByaXZhdGUgU3RhY2s8T2JqZWN0PiBzdGF0ZVN0YWNrID0gbmV3IFN0YWNrPE9iamVjdD4oKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGluZGVudFN0ZXAgPSAiIjsKKyAgICBwcml2YXRlIGludCBkZXB0aCA9IDA7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9JbmRlbnRpbmdYTUxTdHJlYW1Xcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L0luZGVudGluZ1hNTFN0cmVhbVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTQ0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9JbmRlbnRpbmdYTUxTdHJlYW1Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dDsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLyoqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBjbGFzcyBJbmRlbnRpbmdYTUxTdHJlYW1Xcml0ZXIgZXh0ZW5kcyBEZWxlZ2F0aW5nWE1MU3RyZWFtV3JpdGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgU0VFTl9OT1RISU5HID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBTRUVOX0VMRU1FTlQgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IFNFRU5fREFUQSA9IG5ldyBPYmplY3QoKTsKKworICAgIHByaXZhdGUgT2JqZWN0IHN0YXRlID0gU0VFTl9OT1RISU5HOworICAgIHByaXZhdGUgU3RhY2s8T2JqZWN0PiBzdGF0ZVN0YWNrID0gbmV3IFN0YWNrPE9iamVjdD4oKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGluZGVudFN0ZXAgPSAiICAiOworICAgIHByaXZhdGUgaW50IGRlcHRoID0gMDsKKworICAgIHB1YmxpYyBJbmRlbnRpbmdYTUxTdHJlYW1Xcml0ZXIoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgeworICAgICAgICBzdXBlcih3cml0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBpbmRlbnQgc3RlcC4KKyAgICAgKgorICAgICAqIDxwPlJldHVybiB0aGUgY3VycmVudCBpbmRlbnQgc3RlcDogZWFjaCBzdGFydCB0YWcgd2lsbCBiZQorICAgICAqIGluZGVudGVkIGJ5IHRoaXMgbnVtYmVyIG9mIHNwYWNlcyB0aW1lcyB0aGUgbnVtYmVyIG9mCisgICAgICogYW5jZXN0b3JzIHRoYXQgdGhlIGVsZW1lbnQgaGFzLjwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBzcGFjZXMgaW4gZWFjaCBpbmRlbnRhdGlvbiBzdGVwLAorICAgICAqICAgICAgICAgb3IgMCBvciBsZXNzIGZvciBubyBpbmRlbnRhdGlvbi4KKyAgICAgKiBAc2VlICNzZXRJbmRlbnRTdGVwKGludCkKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBPbmx5IHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRlbnQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZW50U3RlcCgpIHsKKyAgICAgICAgcmV0dXJuIGluZGVudFN0ZXAubGVuZ3RoKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgaW5kZW50IHN0ZXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZW50U3RlcCBUaGUgbmV3IGluZGVudCBzdGVwICgwIG9yIGxlc3MgZm9yIG5vCisgICAgICogICAgICAgIGluZGVudGF0aW9uKS4KKyAgICAgKiBAc2VlICNnZXRJbmRlbnRTdGVwKCkKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBTaG91bGQgdXNlIHRoZSB2ZXJzaW9uIHRoYXQgdGFrZXMgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZGVudFN0ZXAoaW50IGluZGVudFN0ZXApIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yICg7IGluZGVudFN0ZXAgPiAwOyBpbmRlbnRTdGVwLS0pIHMuYXBwZW5kKCcgJyk7CisgICAgICAgIHNldEluZGVudFN0ZXAocy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRlbnRTdGVwKFN0cmluZyBzKSB7CisgICAgICAgIHRoaXMuaW5kZW50U3RlcCA9IHM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uU3RhcnRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXRlU3RhY2sucHVzaChTRUVOX0VMRU1FTlQpOworICAgICAgICBzdGF0ZSA9IFNFRU5fTk9USElORzsKKyAgICAgICAgaWYgKGRlcHRoID4gMCkgeworICAgICAgICAgICAgc3VwZXIud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOworICAgICAgICB9CisgICAgICAgIGRvSW5kZW50KCk7CisgICAgICAgIGRlcHRoKys7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uRW5kRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBkZXB0aC0tOworICAgICAgICBpZiAoc3RhdGUgPT0gU0VFTl9FTEVNRU5UKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZUNoYXJhY3RlcnMoIlxuIik7CisgICAgICAgICAgICBkb0luZGVudCgpOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gc3RhdGVTdGFjay5wb3AoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25FbXB0eUVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhdGUgPSBTRUVOX0VMRU1FTlQ7CisgICAgICAgIGlmIChkZXB0aCA+IDApIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBkb0luZGVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGluZGVudGF0aW9uIGZvciB0aGUgY3VycmVudCBsZXZlbC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICogICAgICAgICAgICB3cml0aW5nIHRoZSBpbmRlbnRhdGlvbiBjaGFyYWN0ZXJzLCBvciBpZiBhIGZpbHRlcgorICAgICAqICAgICAgICAgICAgZnVydGhlciBkb3duIHRoZSBjaGFpbiByYWlzZXMgYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkb0luZGVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZiAoZGVwdGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspCisgICAgICAgICAgICAgICAgc3VwZXIud3JpdGVDaGFyYWN0ZXJzKGluZGVudFN0ZXApOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIud3JpdGVTdGFydERvY3VtZW50KCk7CisgICAgICAgIHN1cGVyLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIHZlcnNpb24pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdXBlci53cml0ZVN0YXJ0RG9jdW1lbnQodmVyc2lvbik7CisgICAgICAgIHN1cGVyLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgdmVyc2lvbikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLndyaXRlU3RhcnREb2N1bWVudChlbmNvZGluZywgdmVyc2lvbik7CisgICAgICAgIHN1cGVyLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgb25TdGFydEVsZW1lbnQoKTsKKyAgICAgICAgc3VwZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgb25TdGFydEVsZW1lbnQoKTsKKyAgICAgICAgc3VwZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBvblN0YXJ0RWxlbWVudCgpOworICAgICAgICBzdXBlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgb25FbXB0eUVsZW1lbnQoKTsKKyAgICAgICAgc3VwZXIud3JpdGVFbXB0eUVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBvbkVtcHR5RWxlbWVudCgpOworICAgICAgICBzdXBlci53cml0ZUVtcHR5RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgb25FbXB0eUVsZW1lbnQoKTsKKyAgICAgICAgc3VwZXIud3JpdGVFbXB0eUVsZW1lbnQobG9jYWxOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgb25FbmRFbGVtZW50KCk7CisgICAgICAgIHN1cGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhTdHJpbmcgdGV4dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXRlID0gU0VFTl9EQVRBOworICAgICAgICBzdXBlci53cml0ZUNoYXJhY3RlcnModGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKGNoYXJbXSB0ZXh0LCBpbnQgc3RhcnQsIGludCBsZW4pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdGF0ZSA9IFNFRU5fREFUQTsKKyAgICAgICAgc3VwZXIud3JpdGVDaGFyYWN0ZXJzKHRleHQsIHN0YXJ0LCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ0RhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzdGF0ZSA9IFNFRU5fREFUQTsKKyAgICAgICAgc3VwZXIud3JpdGVDRGF0YShkYXRhKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9SZXN1bHRGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9SZXN1bHRGYWN0b3J5LmphdmEKaW5kZXggOWIyYmI0OC4uMGRkNzg4OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvUmVzdWx0RmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L1Jlc3VsdEZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5vdXRwdXQ7CiAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L1NheFNlcmlhbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L1NheFNlcmlhbGl6ZXIuamF2YQppbmRleCA1NzBjZDBkLi4xMDZkMWMzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9TYXhTZXJpYWxpemVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvU2F4U2VyaWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDYgKzIyLDcgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHh3RXhjZXB0aW9uOwpAQCAtNDQsNyArNDUsNyBAQAogICAgIHByaXZhdGUgZmluYWwgTGV4aWNhbEhhbmRsZXIgbGV4aWNhbDsKIAogICAgIHB1YmxpYyBTYXhTZXJpYWxpemVyKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgdGhpcyhoYW5kbGVyLG51bGwpOworICAgICAgICB0aGlzKGhhbmRsZXIsbnVsbCx0cnVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU1LDggKzU2LDE4IEBACiAgICAgICogdG8gd3JpdGUgY29tbWVudHMgYW5kIENEQVRBIHNlY3Rpb25zLgogICAgICAqLwogICAgIHB1YmxpYyBTYXhTZXJpYWxpemVyKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsTGV4aWNhbEhhbmRsZXIgbGV4KSB7Ci0gICAgICAgIHdyaXRlciA9IGhhbmRsZXI7Ci0gICAgICAgIGxleGljYWwgPSBsZXg7CisgICAgICAgIHRoaXMoaGFuZGxlciwgbGV4LCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2F4U2VyaWFsaXplcihDb250ZW50SGFuZGxlciBoYW5kbGVyLExleGljYWxIYW5kbGVyIGxleCwgYm9vbGVhbiBpbmRlbnRpbmcpIHsKKyAgICAgICAgaWYoIWluZGVudGluZykgeworICAgICAgICAgICAgd3JpdGVyID0gaGFuZGxlcjsKKyAgICAgICAgICAgIGxleGljYWwgPSBsZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJbmRlbnRpbmdYTUxGaWx0ZXIgaW5kZW50ZXIgPSBuZXcgSW5kZW50aW5nWE1MRmlsdGVyKGhhbmRsZXIsIGxleCk7CisgICAgICAgICAgICB3cml0ZXIgPSBpbmRlbnRlcjsKKyAgICAgICAgICAgIGxleGljYWwgPSBpbmRlbnRlcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBTYXhTZXJpYWxpemVyKFNBWFJlc3VsdCByZXN1bHQpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L1N0YXhTZXJpYWxpemVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9TdGF4U2VyaWFsaXplci5qYXZhCmluZGV4IDRiNmM4MjEuLmQ4ZDM0YTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L1N0YXhTZXJpYWxpemVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvU3RheFNlcmlhbGl6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5vdXRwdXQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR4d0V4Y2VwdGlvbjsKQEAgLTQxLDYgKzQyLDEyIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgb3V0OwogCiAgICAgcHVibGljIFN0YXhTZXJpYWxpemVyKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgdGhpcyh3cml0ZXIsdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFN0YXhTZXJpYWxpemVyKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIGJvb2xlYW4gaW5kZW50aW5nKSB7CisgICAgICAgIGlmKGluZGVudGluZykKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBJbmRlbnRpbmdYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKTsKICAgICAgICAgdGhpcy5vdXQgPSB3cml0ZXI7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9TdHJlYW1TZXJpYWxpemVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9TdHJlYW1TZXJpYWxpemVyLmphdmEKaW5kZXggNjAxZmFmYi4uMDM3MDg3MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvU3RyZWFtU2VyaWFsaXplci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L1N0cmVhbVNlcmlhbGl6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5vdXRwdXQ7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLlR4d0V4Y2VwdGlvbjsKQEAgLTgzLDcgKzg0LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAogICAgICAgICAvLyBub3cgZGVsZWdhdGUgdG8gdGhlIFNheFNlcmlhbGl6ZXIKLSAgICAgICAgc2VyaWFsaXplciA9IG5ldyBTYXhTZXJpYWxpemVyKHdyaXRlcix3cml0ZXIpIHsKKyAgICAgICAgc2VyaWFsaXplciA9IG5ldyBTYXhTZXJpYWxpemVyKHdyaXRlcix3cml0ZXIsZmFsc2UpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewogICAgICAgICAgICAgICAgIHN1cGVyLmVuZERvY3VtZW50KCk7CiAgICAgICAgICAgICAgICAgaWYoYXV0b0Nsb3NlWzBdIT1udWxsKSB7CkBAIC0xMDEsNyArMTAyLDcgQEAKICAgICBwcml2YXRlIFN0cmVhbVNlcmlhbGl6ZXIoWE1MV3JpdGVyIHdyaXRlcikgewogICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsKICAgICAgICAgLy8gbm93IGRlbGVnYXRlIHRvIHRoZSBTYXhTZXJpYWxpemVyCi0gICAgICAgIHNlcmlhbGl6ZXIgPSBuZXcgU2F4U2VyaWFsaXplcih3cml0ZXIsd3JpdGVyKTsKKyAgICAgICAgc2VyaWFsaXplciA9IG5ldyBTYXhTZXJpYWxpemVyKHdyaXRlcix3cml0ZXIsZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRVUkwoU3RyaW5nIHVybCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvWE1MV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9YTUxXcml0ZXIuamF2YQppbmRleCBiZGJmMGVjLi5mMTMxNTEyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9YTUxXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9YTUxXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw2ICsyMiw3IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisKIC8vIEBAM1JEIFBBUlRZIENPREVAQAogCiAvLyBYTUxXcml0ZXIuamF2YSAtIHNlcmlhbGl6ZSBhbiBYTUwgZG9jdW1lbnQuCkBAIC0yNjAsNiArMjYxLDcgQEAKICAqIGNoYXJhY3RlciBkYXRhLjwvcD4KICAqCiAgKiBAYXV0aG9yIERhdmlkIE1lZ2dpbnNvbiwgZGF2aWRAbWVnZ2luc29uLmNvbQorICogQHZlcnNpb24gMC4yCiAgKiBAc2luY2UgSkFYQjEuMAogICogQHNlZSBvcmcueG1sLnNheC5YTUxGaWx0ZXIKICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L1htbFNlcmlhbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L1htbFNlcmlhbGl6ZXIuamF2YQppbmRleCA2NDRkNDQzLi5mMWRlNmFiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9YbWxTZXJpYWxpemVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvWG1sU2VyaWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3R4dzIvb3V0cHV0L3BhY2thZ2UuaHRtbAppbmRleCBmNmMzYjZjLi43MDA4Y2VmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL291dHB1dC9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9vdXRwdXQvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPgogPGJvZHk+CiAgIDxwPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvdHh3Mi9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL3BhY2thZ2UuaHRtbAppbmRleCA5MzQwMDc4Li4yYzU1ODcxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC90eHcyL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgogICA8cD4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL0Nsb3NlYWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvQ2xvc2VhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwMDNjNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL0Nsb3NlYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53czsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIENsb3NlYWJsZSBKQVgtV1MgcHJveHkgb2JqZWN0LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzaW5jZSBKQVgtV1MgMi4wLjIKKyAqLworLy8gdGhpcyBpbnRlcmZhY2UgaXMgZXhwb3NlZCB0byBhcHBsaWNhdGlvbnMuCitwdWJsaWMgaW50ZXJmYWNlIENsb3NlYWJsZSBleHRlbmRzIGphdmEuaW8uQ2xvc2VhYmxlIHsKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBvYmplY3QgYW5kIGNsZWFucyB1cCBhbnkgcmVzb3VyY2VzCisgICAgICogaXQgaG9sZHMsIHN1Y2ggYXMgbmV0d29yayBjb25uZWN0aW9ucy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGEgcG9ydCBwcm94eQorICAgICAqIG9yIHtAbGluayBEaXNwYXRjaH0uIEluIHBhcnRpY3VsYXIsIHRoaXMgc2lnbmFscworICAgICAqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjZXJ0YWluIHNwZWNzIChsaWtlIFdTLVJlbGlhYmxlTWVzc2FnaW5nCisgICAgICogYW5kIFdTLVNlY3VyZUNvbnZlcnNhdGlvbikgdG8gdGVybWluYXRlIHNlc3Npb25zIHRoYXQgdGhleQorICAgICAqIGNyZWF0ZSBkdXJpbmcgdGhlIGxpZmUgdGltZSBvZiBhIHByb3h5IG9iamVjdC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgbm90IGEgbWFuZGF0b3J5IG9wZXJhdGlvbiwgc28gdGhlIGFwcGxpY2F0aW9uCisgICAgICogZG9lcyBub3QgaGF2ZSB0byBjYWxsIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIGNsZWFuIHVwIGZhaWxzIHVuZXhwZWN0ZWRseSwgdGhpcyBleGNlcHRpb24KKyAgICAgKiAgICAgIHdpbGwgYmUgdGhyb3duIChpbnN0ZWFkIG9mIHtAbGluayBJT0V4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvRW5kcG9pbnRSZWZlcmVuY2VVdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDQyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlVXRpbC5qYXZhCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlclNvdXJjZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLnN0YXguU3RyZWFtV3JpdGVyQnVmZmVyQ3JlYXRvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuRE9NVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLldTRExDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy52MjAwNDA4Lk1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzOworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQGF1dGhvciBSYW1hIFB1bGF2YXJ0aGkKKyAqLworCitwdWJsaWMgY2xhc3MgRW5kcG9pbnRSZWZlcmVuY2VVdGlsIHsKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgRVBSIGJhc2VkIG9uIHRoZSBjbGF6ei4gSXQgbWF5IG5lZWQgdG8gcGVyZm9ybSB0cmFuZm9ybWF0aW9uIGZyb20KKyAgICAgKiBXM0MgRVBSIHRvIE1TIEVQUiBvciB2aXNlLXZlcnNhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gVCB0cmFuc2Zvcm0oQ2xhc3M8VD4gY2xhenosIEBOb3ROdWxsIEVuZHBvaW50UmVmZXJlbmNlIGVwcikgeworICAgICAgICBhc3NlcnQgZXByICE9IG51bGw7CisgICAgICAgIGlmIChjbGF6ei5pc0Fzc2lnbmFibGVGcm9tKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzKSkgeworICAgICAgICAgICAgaWYgKGVwciBpbnN0YW5jZW9mIFczQ0VuZHBvaW50UmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBlcHI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVwciBpbnN0YW5jZW9mIE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoVCkgdG9XM0NFcHIoKE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSkgZXByKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjbGF6ei5pc0Fzc2lnbmFibGVGcm9tKE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5jbGFzcykpIHsKKyAgICAgICAgICAgIGlmIChlcHIgaW5zdGFuY2VvZiBXM0NFbmRwb2ludFJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoVCkgdG9NU0VwcigoVzNDRW5kcG9pbnRSZWZlcmVuY2UpIGVwcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVwciBpbnN0YW5jZW9mIE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoVCkgZXByOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9UaGlzIG11c3QgYmUgYW4gRVBSIHRoYXQgd2UgZG9udCBrbm93CisgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbmtud29uIEVuZHBvaW50UmVmZXJlbmNlOiAiICsgZXByLmdldENsYXNzKCkpOworICAgIH0KKworICAgIC8vVE9ETzogYml0IG9mIHJlZHVuZGVuY3kgb24gd3JpdGVzIG9mIHczYyBlcHIsIHNob3VsZCBtb2R1bGFyaXplIGl0CisgICAgcHJpdmF0ZSBzdGF0aWMgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdG9XM0NFcHIoTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIG1zRXByKSB7CisgICAgICAgIFN0cmVhbVdyaXRlckJ1ZmZlckNyZWF0b3Igd3JpdGVyID0gbmV3IFN0cmVhbVdyaXRlckJ1ZmZlckNyZWF0b3IoKTsKKyAgICAgICAgdzNjTWV0YWRhdGFXcml0dGVuID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoQWRkcmVzc2luZ1ZlcnNpb24uVzNDLmdldFByZWZpeCgpLAorICAgICAgICAgICAgICAgICAgICAiRW5kcG9pbnRSZWZlcmVuY2UiLCBBZGRyZXNzaW5nVmVyc2lvbi5XM0MubnNVcmkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRQcmVmaXgoKSwKKyAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLm5zVXJpKTsKKyAgICAgICAgICAgIC8vd3JpdGUgd3NhOkFkZHJlc3MKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChBZGRyZXNzaW5nVmVyc2lvbi5XM0MuZ2V0UHJlZml4KCksCisgICAgICAgICAgICAgICAgICAgIFczQ0FkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FERFJFU1NfTkFNRSwgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLm5zVXJpKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMobXNFcHIuYWRkci51cmkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgLy9UT0RPOiB3cml0ZSBleHRlbnNpb24gYXR0cmlidXRlcyBvbiB3c2E6QWRkcmVzcworICAgICAgICAgICAgaWYgKChtc0Vwci5yZWZlcmVuY2VQcm9wZXJ0aWVzICE9IG51bGwgJiYgbXNFcHIucmVmZXJlbmNlUHJvcGVydGllcy5lbGVtZW50cy5zaXplKCkgPiAwKSB8fAorICAgICAgICAgICAgICAgICAgICAobXNFcHIucmVmZXJlbmNlUGFyYW1ldGVycyAhPSBudWxsICYmIG1zRXByLnJlZmVyZW5jZVBhcmFtZXRlcnMuZWxlbWVudHMuc2l6ZSgpID4gMCkpIHsKKworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChBZGRyZXNzaW5nVmVyc2lvbi5XM0MuZ2V0UHJlZml4KCksICJSZWZlcmVuY2VQYXJhbWV0ZXJzIiwgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLm5zVXJpKTsKKworICAgICAgICAgICAgICAgIC8vd3JpdGUgUmVmZXJlbmNlUHJvcGVydGllcworICAgICAgICAgICAgICAgIGlmIChtc0Vwci5yZWZlcmVuY2VQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChFbGVtZW50IGUgOiBtc0Vwci5yZWZlcmVuY2VQcm9wZXJ0aWVzLmVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBET01VdGlsLnNlcmlhbGl6ZU5vZGUoZSwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL3dyaXRlIHJlZmVyZW5jZVBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBpZiAobXNFcHIucmVmZXJlbmNlUGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoRWxlbWVudCBlIDogbXNFcHIucmVmZXJlbmNlUGFyYW1ldGVycy5lbGVtZW50cykgeworICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbC5zZXJpYWxpemVOb2RlKGUsIHdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU3VwcmVzcyB3cml0aW5nIFNlcnZpY2VOYW1lIGFuZCBFbmRwb2ludE5hbWUgaW4gVzNDRVBSLAorICAgICAgICAgICAgLy8gVW50aWwgdGhlIG5zIGZvciB0aG9zZSBtZXRhZGF0YSBlbGVtZW50cyBpcyByZXNvbHZlZC4KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAvL1dyaXRlIEludGVyZmFjZSBpbmZvCisgICAgICAgICAgICBpZiAobXNFcHIucG9ydFR5cGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVczQ01ldGFkYXRhKHdyaXRlcik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRXc2RsUHJlZml4KCksCisgICAgICAgICAgICAgICAgICAgICAgICBXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQVdfSU5URVJGQUNFTkFNRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLndzZGxOc1VyaSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRXc2RsUHJlZml4KCksCisgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbi5XM0Mud3NkbE5zVXJpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVQcmVmaXggPSBmaXhOdWxsKG1zRXByLnBvcnRUeXBlTmFtZS5uYW1lLmdldFByZWZpeCgpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocG9ydFR5cGVQcmVmaXgsIG1zRXByLnBvcnRUeXBlTmFtZS5uYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocG9ydFR5cGVQcmVmaXguZXF1YWxzKCIiKSkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhtc0Vwci5wb3J0VHlwZU5hbWUubmFtZS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHBvcnRUeXBlUHJlZml4ICsgIjoiICsgbXNFcHIucG9ydFR5cGVOYW1lLm5hbWUuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtc0Vwci5zZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVXM0NNZXRhZGF0YSh3cml0ZXIpOworICAgICAgICAgICAgICAgIC8vV3JpdGUgc2VydmljZSBhbmQgUG9ydCBpbmZvCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRXc2RsUHJlZml4KCksCisgICAgICAgICAgICAgICAgICAgICAgICBXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQVdfU0VSVklDRU5BTUVfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLlczQy53c2RsTnNVcmkpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShBZGRyZXNzaW5nVmVyc2lvbi5XM0MuZ2V0V3NkbFByZWZpeCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLndzZGxOc1VyaSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZVByZWZpeCA9IGZpeE51bGwobXNFcHIuc2VydmljZU5hbWUubmFtZS5nZXRQcmVmaXgoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1zRXByLnNlcnZpY2VOYW1lLnBvcnROYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQVdfRU5EUE9JTlROQU1FX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIuc2VydmljZU5hbWUucG9ydE5hbWUpOworCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHNlcnZpY2VQcmVmaXgsIG1zRXByLnNlcnZpY2VOYW1lLm5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlUHJlZml4Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzZXJ2aWNlUHJlZml4ICsgIjoiICsgbXNFcHIuc2VydmljZU5hbWUubmFtZS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKG1zRXByLnNlcnZpY2VOYW1lLm5hbWUuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICovCisgICAgICAgICAgICAvL1RPRE86IHJldmlzaXQgdGhpcworICAgICAgICAgICAgRWxlbWVudCB3c2RsRWxlbWVudCA9IG51bGw7CisgICAgICAgICAgICAvL0NoZWNrIGZvciB3c2RsIGluIGV4dGVuc2lvbiBlbGVtZW50cworICAgICAgICAgICAgaWYgKChtc0Vwci5lbGVtZW50cyAhPSBudWxsKSAmJiAobXNFcHIuZWxlbWVudHMuc2l6ZSgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEVsZW1lbnQgZSA6IG1zRXByLmVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLk1FWF9NRVRBREFUQS5nZXROYW1lc3BhY2VVUkkoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2FsTmFtZSgpLmVxdWFscyhNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEEuZ2V0TG9jYWxQYXJ0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBubCA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0RMQ29uc3RhbnRzLk5TX1dTREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuUU5BTUVfREVGSU5JVElPTlMuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYobmwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsRWxlbWVudCA9IChFbGVtZW50KSBubC5pdGVtKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy93cml0ZSBXU0RMCisgICAgICAgICAgICBpZiAod3NkbEVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIERPTVV0aWwuc2VyaWFsaXplTm9kZSh3c2RsRWxlbWVudCwgd3JpdGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHczY01ldGFkYXRhV3JpdHRlbikKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgICAgICAvL1RPRE8gcmV2aXNpdCB0aGlzCisgICAgICAgICAgICAvL3dyaXRlIGV4dGVuc2lvbiBlbGVtZW50cworICAgICAgICAgICAgaWYgKChtc0Vwci5lbGVtZW50cyAhPSBudWxsKSAmJiAobXNFcHIuZWxlbWVudHMuc2l6ZSgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEVsZW1lbnQgZSA6IG1zRXByLmVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLk5TX1dTREwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9ERUZJTklUSU9OUy5nZXRMb2NhbFBhcnQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHdyaXRlIGl0IGFzIHRoaXMgaXMgd3JpdHRlbiBhbHJlYWR5IGluIE1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRE9NVXRpbC5zZXJpYWxpemVOb2RlKGUsIHdyaXRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL1RPRE86d3JpdGUgZXh0ZW5zaW9uIGF0dHJpYnV0ZXMKKworICAgICAgICAgICAgLy88L0VuZHBvaW50UmVmZXJlbmNlPgorICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBXM0NFbmRwb2ludFJlZmVyZW5jZShuZXcgWE1MU3RyZWFtQnVmZmVyU291cmNlKHdyaXRlci5nZXRYTUxTdHJlYW1CdWZmZXIoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdzNjTWV0YWRhdGFXcml0dGVuID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlVzNDTWV0YWRhdGEoU3RyZWFtV3JpdGVyQnVmZmVyQ3JlYXRvciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZiAoIXczY01ldGFkYXRhV3JpdHRlbikgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRQcmVmaXgoKSwgVzNDQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfTUVUQURBVEFfTkFNRSwgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLm5zVXJpKTsKKyAgICAgICAgICAgIHczY01ldGFkYXRhV3JpdHRlbiA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgdG9NU0VwcihXM0NFbmRwb2ludFJlZmVyZW5jZSB3M2NFcHIpIHsKKyAgICAgICAgRE9NUmVzdWx0IHJlc3VsdCA9IG5ldyBET01SZXN1bHQoKTsKKyAgICAgICAgdzNjRXByLndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAgTm9kZSBlcHJOb2RlID0gcmVzdWx0LmdldE5vZGUoKTsKKyAgICAgICAgRWxlbWVudCBlID0gRE9NVXRpbC5nZXRGaXJzdEVsZW1lbnRDaGlsZChlcHJOb2RlKTsKKyAgICAgICAgaWYgKGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSBtc0VwciA9IG5ldyBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UoKTsKKworICAgICAgICBOb2RlTGlzdCBub2RlcyA9IGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChub2Rlcy5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhBZGRyZXNzaW5nVmVyc2lvbi5XM0MubnNVcmkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoVzNDQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfQUREUkVTU19OQU1FKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXNFcHIuYWRkciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIuYWRkciA9IG5ldyBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuQWRkcmVzcygpOworICAgICAgICAgICAgICAgICAgICBtc0Vwci5hZGRyLnVyaSA9IFhtbFV0aWwuZ2V0VGV4dEZvck5vZGUoY2hpbGQpOworCisgICAgICAgICAgICAgICAgICAgIC8vbm93IGFkZCB0aGUgYXR0cmlidXRlIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgbXNFcHIuYWRkci5hdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcyhjaGlsZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoQWRkcmVzc2luZ1ZlcnNpb24uVzNDLm5zVXJpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJSZWZlcmVuY2VQYXJhbWV0ZXJzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgcmVmUGFyYW1zID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlZlBhcmFtcy5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmUGFyYW1zLml0ZW0oaikuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc0Vwci5yZWZlcmVuY2VQYXJhbWV0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIucmVmZXJlbmNlUGFyYW1ldGVycyA9IG5ldyBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuRWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIucmVmZXJlbmNlUGFyYW1ldGVycy5lbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIucmVmZXJlbmNlUGFyYW1ldGVycy5lbGVtZW50cy5hZGQoKEVsZW1lbnQpIHJlZlBhcmFtcy5pdGVtKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKEFkZHJlc3NpbmdWZXJzaW9uLlczQy5uc1VyaSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscyhXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9NRVRBREFUQV9OQU1FKSkgeworICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBtZXRhZGF0YSA9IGNoaWxkLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtZXRhZGF0YS5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBtZXRhZGF0YS5pdGVtKGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbG0gPSAoRWxlbWVudCkgbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbG0uZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKEFkZHJlc3NpbmdWZXJzaW9uLlczQy53c2RsTnNVcmkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoVzNDQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FXX1NFUlZJQ0VOQU1FX05BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIuc2VydmljZU5hbWUgPSBuZXcgTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLlNlcnZpY2VOYW1lVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zRXByLnNlcnZpY2VOYW1lLnBvcnROYW1lID0gZWxtLmdldEF0dHJpYnV0ZShXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQVdfRU5EUE9JTlROQU1FX05BTUUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2UgPSBlbG0uZ2V0VGV4dENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gWG1sVXRpbC5nZXRQcmVmaXgoc2VydmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBYbWxVdGlsLmdldExvY2FsUGFydChzZXJ2aWNlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgbm8gc2VydmljZSBuYW1lIHRoZW4gaXRzIG5vdCBhIHZhbGlkIEVQUiBidXQgbGV0cyBjb250aW51ZSBhcyBpdHMgb3B0aW9uYWwgYW55d2F5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zID0gZWxtLmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zRXByLnNlcnZpY2VOYW1lLm5hbWUgPSBuZXcgUU5hbWUobnMsIG5hbWUsIHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIuc2VydmljZU5hbWUubmFtZSA9IG5ldyBRTmFtZShudWxsLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIuc2VydmljZU5hbWUuYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXMoZWxtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxtLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhBZGRyZXNzaW5nVmVyc2lvbi5XM0Mud3NkbE5zVXJpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbG0uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFczQ0FkZHJlc3NpbmdDb25zdGFudHMuV1NBV19JTlRFUkZBQ0VOQU1FX05BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIucG9ydFR5cGVOYW1lID0gbmV3IE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5BdHRyaWJ1dGVkUU5hbWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZSA9IGVsbS5nZXRUZXh0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBYbWxVdGlsLmdldFByZWZpeChwb3J0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBYbWxVdGlsLmdldExvY2FsUGFydChwb3J0VHlwZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIG5vIHBvcnRUeXBlIG5hbWUgdGhlbiBpdHMgbm90IGEgdmFsaWQgRVBSIGJ1dCBsZXRzIGNvbnRpbnVlIGFzIGl0cyBvcHRpb25hbCBhbnl3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnMgPSBlbG0ubG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChucyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIucG9ydFR5cGVOYW1lLm5hbWUgPSBuZXcgUU5hbWUobnMsIG5hbWUsIHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIucG9ydFR5cGVOYW1lLm5hbWUgPSBuZXcgUU5hbWUobnVsbCwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zRXByLnBvcnRUeXBlTmFtZS5hdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcyhlbG0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGVsbS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NETENvbnN0YW50cy5OU19XU0RMKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbG0uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfREVGSU5JVElPTlMuZ2V0TG9jYWxQYXJ0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gRE9NVXRpbC5jcmVhdGVEb20oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IG1leEVsID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEEuZ2V0TmFtZXNwYWNlVVJJKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEEuZ2V0UHJlZml4KCkrIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEEuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbWV0YWRhdGFFbCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMuTUVYX01FVEFEQVRBX1NFQ1RJT04uZ2V0TmFtZXNwYWNlVVJJKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEFfU0VDVElPTi5nZXRQcmVmaXgoKSsiOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK01lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLk1FWF9NRVRBREFUQV9TRUNUSU9OLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUVsLnNldEF0dHJpYnV0ZShNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEFfRElBTEVDVF9BVFRSSUJVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEFfRElBTEVDVF9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFFbC5hcHBlbmRDaGlsZChlbG0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1leEVsLmFwcGVuZENoaWxkKG1ldGFkYXRhRWwpOworCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IFJldmlzaXQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaXRzIGV4dGVuc2lvbnMgaW4gTUVUQS1EQVRBIGFuZCBzaG91bGQgYmUgY29waWVkIHRvIGV4dGVuc2lvbnMgaW4gTVMgRVBSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zRXByLmVsZW1lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIuZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zRXByLmVsZW1lbnRzLmFkZChlbG0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pdHMgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICBpZiAobXNFcHIuZWxlbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXNFcHIuZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbXNFcHIuZWxlbWVudHMuYWRkKChFbGVtZW50KSBjaGlsZCk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVzLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7CisgICAgICAgICAgICAgICAgTm9kZSBuID0gbm9kZXMuaXRlbShpKTsKKyAgICAgICAgICAgICAgICBpZiAobXNFcHIuYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1zRXByLmF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZml4TnVsbChuLmdldFByZWZpeCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zID0gZml4TnVsbChuLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG4uZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIG1zRXByLmF0dHJpYnV0ZXMucHV0KG5ldyBRTmFtZShucywgbG9jYWxOYW1lLCBwcmVmaXgpLCBuLmdldE5vZGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbXNFcHI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFFOYW1lLCBTdHJpbmc+IGdldEF0dHJpYnV0ZXMoTm9kZSBub2RlKSB7CisgICAgICAgIE1hcDxRTmFtZSwgU3RyaW5nPiBhdHRyaWJzID0gbnVsbDsKKworICAgICAgICBOYW1lZE5vZGVNYXAgbm0gPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubS5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXR0cmlicyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGF0dHJpYnMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOworICAgICAgICAgICAgTm9kZSBuID0gbm0uaXRlbShpKTsKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBmaXhOdWxsKG4uZ2V0UHJlZml4KCkpOworICAgICAgICAgICAgU3RyaW5nIG5zID0gZml4TnVsbChuLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBuLmdldExvY2FsTmFtZSgpOworICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoInhtbG5zIikgfHwgcHJlZml4Lmxlbmd0aCgpID09IDAgJiYgbG9jYWxOYW1lLmVxdWFscygieG1sbnMiKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy9leGNsdWRlIHNvbWUgYXR0cmlidXRlcworICAgICAgICAgICAgaWYgKCFsb2NhbE5hbWUuZXF1YWxzKFczQ0FkZHJlc3NpbmdDb25zdGFudHMuV1NBV19FTkRQT0lOVE5BTUVfTkFNRSkpCisgICAgICAgICAgICAgICAgYXR0cmlicy5wdXQobmV3IFFOYW1lKG5zLCBsb2NhbE5hbWUsIHByZWZpeCksIG4uZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdHRyaWJzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljCisgICAgQE5vdE51bGwKKyAgICBTdHJpbmcgZml4TnVsbChATnVsbGFibGUgU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuICIiOworICAgICAgICBlbHNlIHJldHVybiBzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9Qcm9ibGVtQWN0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1Byb2JsZW1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzE1NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9Qcm9ibGVtQWN0aW9uLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3Npbmc7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcuVzNDQWRkcmVzc2luZ0NvbnN0YW50czsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworQFhtbFJvb3RFbGVtZW50KG5hbWU9IlByb2JsZW1BY3Rpb24iLCBuYW1lc3BhY2U9IFczQ0FkZHJlc3NpbmdDb25zdGFudHMuV1NBX05BTUVTUEFDRV9OQU1FKQorcHVibGljIGNsYXNzIFByb2JsZW1BY3Rpb24geworCisgICAgQFhtbEVsZW1lbnQobmFtZT0iQWN0aW9uIiwgbmFtZXNwYWNlPVczQ0FkZHJlc3NpbmdDb25zdGFudHMuV1NBX05BTUVTUEFDRV9OQU1FKQorICAgIHByaXZhdGUgU3RyaW5nIGFjdGlvbjsKKworICAgIEBYbWxFbGVtZW50KG5hbWU9IlNvYXBBY3Rpb24iLCBuYW1lc3BhY2U9VzNDQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfTkFNRVNQQUNFX05BTUUpCisgICAgcHJpdmF0ZSBTdHJpbmcgc29hcEFjdGlvbjsKKworICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFByb2JsZW1BY3Rpb24gKi8KKyAgICBwdWJsaWMgUHJvYmxlbUFjdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvYmxlbUFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBQcm9ibGVtQWN0aW9uKFN0cmluZyBhY3Rpb24sIFN0cmluZyBzb2FwQWN0aW9uKSB7CisgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICAgICAgICB0aGlzLnNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gYWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29hcEFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9Qcm9ibGVtSGVhZGVyUU5hbWUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvUHJvYmxlbUhlYWRlclFOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhODEyOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvUHJvYmxlbUhlYWRlclFOYW1lLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3Npbmc7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLlczQ0FkZHJlc3NpbmdDb25zdGFudHMuV1NBX05BTUVTUEFDRV9OQU1FOworCisvKioKKyAqIEBhdXRob3IgQXJ1biBHdXB0YQorICovCitAWG1sUm9vdEVsZW1lbnQobmFtZT0iUHJvYmxlbUhlYWRlclFOYW1lIiwgbmFtZXNwYWNlPSBXU0FfTkFNRVNQQUNFX05BTUUpCitwdWJsaWMgY2xhc3MgUHJvYmxlbUhlYWRlclFOYW1lIHsKKyAgICBAWG1sVmFsdWUKKyAgICBwcml2YXRlIFFOYW1lIHZhbHVlOworCisgICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUHJvYmxlbUhlYWRlclFOYW1lICovCisgICAgcHVibGljIFByb2JsZW1IZWFkZXJRTmFtZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvYmxlbUhlYWRlclFOYW1lKFFOYW1lIG5hbWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9XM0NBZGRyZXNzaW5nQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1czQ0FkZHJlc3NpbmdDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGIwOTgxCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9XM0NBZGRyZXNzaW5nQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworCisvKioKKyAqIENvbnN0YW50cyBmb3IgVzNDIFdTLUFkZHJlc3NpbmcgdmVyc2lvbgorICoKKyAqIEBhdXRob3IgQXJ1biBHdXB0YQorICovCitwdWJsaWMgaW50ZXJmYWNlIFczQ0FkZHJlc3NpbmdDb25zdGFudHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9OQU1FU1BBQ0VfTkFNRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9OQU1FU1BBQ0VfV1NETF9OQU1FID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQVdfU0VSVklDRU5BTUVfTkFNRSA9ICJTZXJ2aWNlTmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBV19JTlRFUkZBQ0VOQU1FX05BTUUgPSAiSW50ZXJmYWNlTmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBV19FTkRQT0lOVE5BTUVfTkFNRSA9ICJFbmRwb2ludE5hbWUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1JFRkVSRU5DRVBST1BFUlRJRVNfTkFNRSA9ICJSZWZlcmVuY2VQYXJhbWV0ZXJzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTQV9SRUZFUkVOQ0VQUk9QRVJUSUVTX1FOQU1FID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0VfTkFNRSwgV1NBX1JFRkVSRU5DRVBST1BFUlRJRVNfTkFNRSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfUkVGRVJFTkNFUEFSQU1FVEVSU19OQU1FID0gIlJlZmVyZW5jZVBhcmFtZXRlcnMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NBX1JFRkVSRU5DRVBBUkFNRVRFUlNfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCBXU0FfUkVGRVJFTkNFUEFSQU1FVEVSU19OQU1FKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9NRVRBREFUQV9OQU1FID0gIk1ldGFkYXRhIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTQV9NRVRBREFUQV9RTkFNRSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsIFdTQV9NRVRBREFUQV9OQU1FKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9BRERSRVNTX05BTUUgPSAiQWRkcmVzcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0FfQUREUkVTU19RTkFNRSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsIFdTQV9BRERSRVNTX05BTUUpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0FOT05ZTU9VU19BRERSRVNTID0gV1NBX05BTUVTUEFDRV9OQU1FICsgIi9hbm9ueW1vdXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9OT05FX0FERFJFU1MgPSBXU0FfTkFNRVNQQUNFX05BTUUgKyAiL25vbmUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0RFRkFVTFRfRkFVTFRfQUNUSU9OID0gV1NBX05BTUVTUEFDRV9OQU1FICsgIi9mYXVsdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FXX1VTSU5HX0FERFJFU1NJTkdfTkFNRSA9ICJVc2luZ0FkZHJlc3NpbmciOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NBV19VU0lOR19BRERSRVNTSU5HX1FOQU1FID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0VfV1NETF9OQU1FLCBXU0FXX1VTSU5HX0FERFJFU1NJTkdfTkFNRSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIElOVkFMSURfTUFQX1FOQU1FID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0VfTkFNRSwgIkludmFsaWRBZGRyZXNzaW5nSGVhZGVyIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBNQVBfUkVRVUlSRURfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiTWVzc2FnZUFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZCIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgREVTVElOQVRJT05fVU5SRUFDSEFCTEVfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiRGVzdGluYXRpb25VbnJlYWNoYWJsZSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgQUNUSU9OX05PVF9TVVBQT1JURURfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiQWN0aW9uTm90U3VwcG9ydGVkIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBFTkRQT0lOVF9VTkFWQUlMQUJMRV9RTkFNRSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsICJFbmRwb2ludFVuYXZhaWxhYmxlIik7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTk9UX1NVUFBPUlRFRF9URVhUID0gIlRoZSBcIiVzXCIgY2Fubm90IGJlIHByb2Nlc3NlZCBhdCB0aGUgcmVjZWl2ZXIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFX1RFWFQgPSAiTm8gcm91dGUgY2FuIGJlIGRldGVybWluZWQgdG8gcmVhY2ggJXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX1VOQVZBSUxBQkxFX1RFWFQgPSAiVGhlIGVuZHBvaW50IGlzIHVuYWJsZSB0byBwcm9jZXNzIHRoZSBtZXNzYWdlIGF0IHRoaXMgdGltZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9NQVBfVEVYVCA9ICJBIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHZhbGlkIGFuZCB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfUkVRVUlSRURfVEVYVCA9ICJBIHJlcXVpcmVkIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHByZXNlbnQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBQUk9CTEVNX0FDVElPTl9RTkFNRSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsICJQcm9ibGVtQWN0aW9uIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBQUk9CTEVNX0hFQURFUl9RTkFNRV9RTkFNRSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsICJQcm9ibGVtSGVhZGVyUU5hbWUiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEZBVUxUX0RFVEFJTF9RTkFNRSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsICJGYXVsdERldGFpbCIpOworCisgICAgLy8gRmF1bHQgc3Vic3ViY29kZSB3aGVuIGFuIGludmFsaWQgYWRkcmVzcyBpcyBzcGVjaWZpZWQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBJTlZBTElEX0FERFJFU1NfU1VCQ09ERSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsICJJbnZhbGlkQWRkcmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbi5XM0MuZ2V0UHJlZml4KCkpOworCisgICAgLy8gRmF1bHQgc3Vic3ViY29kZSB3aGVuIGFuIGludmFsaWQgaGVhZGVyIHdhcyBleHBlY3RlZCB0byBiZSBFbmRwb2ludFJlZmVyZW5jZSBidXQgd2FzIG5vdCB2YWxpZC4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIElOVkFMSURfRVBSID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0VfTkFNRSwgIkludmFsaWRFUFIiLCBBZGRyZXNzaW5nVmVyc2lvbi5XM0MuZ2V0UHJlZml4KCkpOworCisgICAgLy8gRmF1bHQgc3Vic3ViY29kZSB3aGVuIGdyZWF0ZXIgdGhhbiBleHBlY3RlZCBudW1iZXIgb2YgdGhlIHNwZWNpZmllZCBoZWFkZXIgaXMgcmVjZWl2ZWQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBJTlZBTElEX0NBUkRJTkFMSVRZID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0VfTkFNRSwgIkludmFsaWRDYXJkaW5hbGl0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRQcmVmaXgoKSk7CisKKyAgICAvLyBGYXVsdCBzdWJzdWJjb2RlIHdoZW4gYW4gaW52YWxpZCBoZWFkZXIgd2FzIGV4cGVjdGVkIHRvIGJlIEVuZHBvaW50UmVmZXJlbmNlIGJ1dCBkaWQgbm90IGNvbnRhaW4gYWRkcmVzcy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIE1JU1NJTkdfQUREUkVTU19JTl9FUFIgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiTWlzc2luZ0FkZHJlc3NJbkVQUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRQcmVmaXgoKSk7CisKKyAgICAvLyBGYXVsdCBzdWJzdWJjb2RlIHdoZW4gYSBoZWFkZXIgY29udGFpbnMgYSBtZXNzYWdlIGlkIHRoYXQgd2FzIGEgZHVwbGljYXRlIG9mIG9uZSBhbHJlYWR5IHJlY2VpdmVkLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRFVQTElDQVRFX01FU1NBR0VJRCA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsICJEdXBsaWNhdGVNZXNzYWdlSUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbi5XM0MuZ2V0UHJlZml4KCkpOworCisgICAgLy8gRmF1bHQgc3Vic3ViY29kZSB3aGVuIDxjb2RlPkFjdGlvbjwvY29kZT4gYW5kIDxjb2RlPlNPQVBBY3Rpb248L2NvZGU+IGZvciB0aGUgbWVzYWdlIGRpZCBub3QgbWF0Y2guCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBBQ1RJT05fTUlTTUFUQ0ggPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiQWN0aW9uTWlzbWF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRQcmVmaXgoKSk7CisKKyAgICAvLyBGYXVsdCBzdWJzdWJjb2RlIHdoZW4gdGhlIG9ubHkgYWRkcmVzcyBzdXBwb3J0ZWQgaXMgdGhlIGFub255bW91cyBhZGRyZXNzLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgT05MWV9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiT25seUFub255bW91c0FkZHJlc3NTdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLmdldFByZWZpeCgpKTsKKworICAgIC8vRmF1bHQgc3Vic3ViY29kZSB3aGVuIGFub255bW91cyBhZGRyZXNzIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBPTkxZX05PTl9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiT25seU5vbkFub255bW91c0FkZHJlc3NTdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRQcmVmaXgoKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk9OWU1PVVNfRVBSID0gIjxFbmRwb2ludFJlZmVyZW5jZSB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ1wiPlxuIiArCisgICAgICAgICAgICAiICAgIDxBZGRyZXNzPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L0FkZHJlc3M+XG4iICsKKyAgICAgICAgICAgICI8L0VuZHBvaW50UmVmZXJlbmNlPiI7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1dzYUNsaWVudFR1YmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvV3NhQ2xpZW50VHViZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzE0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1dzYUNsaWVudFR1YmUuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3Npbmc7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcubW9kZWwuQWN0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcubW9kZWwuTWFwUmVxdWlyZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMQm91bmRPcGVyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVDbG9uZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkFkZHJlc3NpbmdNZXNzYWdlczsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworCisvKioKKyAqIFdzYUNsaWVudFR1YmUgYXBwZWFycyBpbiB0aGUgVHViZWxpbmUgb25seSBpZiBhZGRyZXNzaW5nIGlzIGVuYWJsZWQuCisgKiBUaGlzIHR1YmUgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiBhZGRyZXNzaW5nIGhlYWRlcnMgaW4gdGhlIGluY29taW5nIG1lc3NhZ2VzCisgKiBiYXNlZCBvbiB0aGUgV1NETCBtb2RlbC4KKyAqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdzYUNsaWVudFR1YmUgZXh0ZW5kcyBXc2FUdWJlIHsKKyAgICBwdWJsaWMgV3NhQ2xpZW50VHViZShXU0RMUG9ydCB3c2RsUG9ydCwgV1NCaW5kaW5nIGJpbmRpbmcsIFR1YmUgbmV4dCkgeworICAgICAgICBzdXBlcih3c2RsUG9ydCwgYmluZGluZywgbmV4dCk7CisgICAgfQorCisgICAgcHVibGljIFdzYUNsaWVudFR1YmUoV3NhQ2xpZW50VHViZSB0aGF0LCBUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICBzdXBlcih0aGF0LCBjbG9uZXIpOworICAgIH0KKworICAgIHB1YmxpYyBXc2FDbGllbnRUdWJlIGNvcHkoVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXc2FDbGllbnRUdWJlKHRoaXMsIGNsb25lcik7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIGRvSW52b2tlKG5leHQscmVxdWVzdCk7CisgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgTmV4dEFjdGlvbiBwcm9jZXNzUmVzcG9uc2UoUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgIC8vIGlmIG9uZS13YXkgdGhlbiwgbm8gdmFsaWRhdGlvbgorICAgICAgICBpZiAocmVzcG9uc2UuZ2V0TWVzc2FnZSgpICE9IG51bGwpCisgICAgICAgICAgICByZXNwb25zZSA9IHZhbGlkYXRlSW5ib3VuZEhlYWRlcnMocmVzcG9uc2UpOworCisgICAgICAgIHJldHVybiBkb1JldHVybldpdGgocmVzcG9uc2UpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVBY3Rpb24oUGFja2V0IHBhY2tldCkgeworICAgICAgICAvL1RoZXJlIG1heSBub3QgYmUgYSBXU0RMIG9wZXJhdGlvbi4gIFRoZXJlIG1heSBub3QgZXZlbiBiZSBhIFdTREwuCisgICAgICAgIC8vRm9yIGluc3RhbmNlIHRoaXMgbWF5IGJlIGEgUk0gQ3JlYXRlU2VxdWVuY2UgbWVzc2FnZS4KKyAgICAgICAgV1NETEJvdW5kT3BlcmF0aW9uIHdibyA9IGdldFdTRExCb3VuZE9wZXJhdGlvbihwYWNrZXQpOworCisgICAgICAgIGlmICh3Ym8gPT0gbnVsbCkgICAgcmV0dXJuOworCisgICAgICAgIFN0cmluZyBnb3RBID0gcGFja2V0LmdldE1lc3NhZ2UoKS5nZXRIZWFkZXJzKCkuZ2V0QWN0aW9uKGFkZHJlc3NpbmdWZXJzaW9uLCBzb2FwVmVyc2lvbik7CisgICAgICAgIGlmIChnb3RBID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuVkFMSURBVElPTl9DTElFTlRfTlVMTF9BQ1RJT04oKSk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gaGVscGVyLmdldE91dHB1dEFjdGlvbihwYWNrZXQpOworCisgICAgICAgIGlmIChleHBlY3RlZCAhPSBudWxsICYmICFnb3RBLmVxdWFscyhleHBlY3RlZCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKGdvdEEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWFuZGF0b3J5SGVhZGVycyhQYWNrZXQgcGFja2V0LCBib29sZWFuIGZvdW5kQWN0aW9uLCBib29sZWFuIGZvdW5kVG8sIGJvb2xlYW4gZm91bmRNZXNzYWdlSUQsIGJvb2xlYW4gZm91bmRSZWxhdGVzVG8pIHsKKyAgICAgICAgc3VwZXIuY2hlY2tNYW5kYXRvcnlIZWFkZXJzKHBhY2tldCwgZm91bmRBY3Rpb24sIGZvdW5kVG8sIGZvdW5kTWVzc2FnZUlELCBmb3VuZFJlbGF0ZXNUbyk7CisKKy8vICAgICAgICBpZighZm91bmRSZWxhdGVzVG8pCisvLyAgICAgICAgICAgIC8vIFJlbGF0ZXNUbyByZXF1aXJlZCBhcyBwZXIKKy8vICAgICAgICAgICAgLy8gVGFibGUgNS0zIG9mIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvV0Qtd3MtYWRkci13c2RsLTIwMDYwMjE2LyN3c2RsMTFyZXF1ZXN0cmVzcG9uc2UKKy8vICAgICAgICAgICAgdGhyb3cgbmV3IE1hcFJlcXVpcmVkRXhjZXB0aW9uKGFkZHJlc3NpbmdWZXJzaW9uLnJlbGF0ZXNUb1RhZyk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1dzYVNlcnZlclR1YmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvV3NhU2VydmVyVHViZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWNlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1dzYVNlcnZlclR1YmUuamF2YQpAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3Npbmc7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLlczQ0FkZHJlc3NpbmdDb25zdGFudHMuT05MWV9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQ7CitpbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcuVzNDQWRkcmVzc2luZ0NvbnN0YW50cy5PTkxZX05PTl9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5tb2RlbC5BY3Rpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5tb2RlbC5JbnZhbGlkTWFwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcubW9kZWwuTWFwUmVxdWlyZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkVuZHBvaW50QWRkcmVzczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5XU0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlckxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkZpYmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLk5leHRBY3Rpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHJhbnNwb3J0VHViZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlQ2xvbmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuRmF1bHREZXRhaWxIZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkFkZHJlc3NpbmdNZXNzYWdlczsKKworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEhhbmRsZXMgV1MtQWRkcmVzc2luZyBmb3IgdGhlIHNlcnZlci4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdzYVNlcnZlclR1YmUgZXh0ZW5kcyBXc2FUdWJlIHsKKworICAgIC8vIHN0b3JlIHRoZSByZXBseVRvL2ZhdWx0VG8gb2YgdGhlIG1lc3NhZ2UgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4KKyAgICAvLyBib3RoIHdpbGwgYmUgc2V0IHRvIG5vbi1udWxsIGluIHByb2Nlc3NSZXF1ZXN0CisgICAgcHJpdmF0ZSBXU0VuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG87CisgICAgcHJpdmF0ZSBXU0VuZHBvaW50UmVmZXJlbmNlIGZhdWx0VG87CisgICAgcHJpdmF0ZSBib29sZWFuIGlzQW5vbnltb3VzUmVxdWlyZWQgPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBXU0RMQm91bmRPcGVyYXRpb24gY2FsY3VsYXRlZCBvbiB0aGUgUmVxdWVzdCBwYXlsb2FkLgorICAgICAqIFVzZWQgZm9yIGRldGVybWluaW5nIFJlcGx5VG8gb3IgRmF1bHQgQWN0aW9uIGZvciBub24tYW5vbnltb3VzIHJlc3BvbnNlcyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgV1NETEJvdW5kT3BlcmF0aW9uIHdibzsKKyAgICBwdWJsaWMgV3NhU2VydmVyVHViZShATm90TnVsbCBXU0RMUG9ydCB3c2RsUG9ydCwgV1NCaW5kaW5nIGJpbmRpbmcsIFR1YmUgbmV4dCkgeworICAgICAgICBzdXBlcih3c2RsUG9ydCwgYmluZGluZywgbmV4dCk7CisgICAgfQorCisgICAgcHVibGljIFdzYVNlcnZlclR1YmUoV3NhU2VydmVyVHViZSB0aGF0LCBUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICBzdXBlcih0aGF0LCBjbG9uZXIpOworICAgIH0KKworICAgIHB1YmxpYyBXc2FTZXJ2ZXJUdWJlIGNvcHkoVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXc2FTZXJ2ZXJUdWJlKHRoaXMsIGNsb25lcik7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSByZXF1ZXN0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYobXNnPT1udWxsKSAgIHJldHVybiBkb0ludm9rZShuZXh0LHJlcXVlc3QpOyAvLyBobW0/CisKKworICAgICAgICAvLyBTdG9yZSByZXF1ZXN0IFJlcGx5VG8gYW5kIEZhdWx0VG8gaW4gcmVxdWVzdFBhY2tldC5pbnZvY2F0aW9uUHJvcGVydGllcworICAgICAgICAvLyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYWZ0ZXIgcmVzcG9uc2VQYWNrZXQgaXMgcmVjZWl2ZWQuCisgICAgICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIHVzZWQgaWYgYSBmYXVsdCBpcyB0aHJvd24gZnJvbSB0aGUgc3Vic2VxdWVudCBQaXBlL1R1YmVzLgorCisgICAgICAgIEhlYWRlckxpc3QgaGwgPSByZXF1ZXN0LmdldE1lc3NhZ2UoKS5nZXRIZWFkZXJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgIHJlcGx5VG8gPSBobC5nZXRSZXBseVRvKGFkZHJlc3NpbmdWZXJzaW9uLCBzb2FwVmVyc2lvbik7CisgICAgICAgIGZhdWx0VG8gPSBobC5nZXRGYXVsdFRvKGFkZHJlc3NpbmdWZXJzaW9uLCBzb2FwVmVyc2lvbik7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRNYXBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IGhlbHBlci5uZXdJbnZhbGlkTWFwRmF1bHQoZSwgYWRkcmVzc2luZ1ZlcnNpb24pOworICAgICAgICAgICAgLy8gV1MtQSBmYXVsdCBwcm9jZXNzaW5nIGZvciBvbmUtd2F5IG1ldGhvZHMKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc09uZVdheSh3c2RsUG9ydCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmNyZWF0ZVNlcnZlclJlc3BvbnNlKG51bGwsIHdzZGxQb3J0LCBudWxsLCBiaW5kaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG9JbnZva2UobmV4dCwgcmVxdWVzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IE1lc3NhZ2VzLmNyZWF0ZShzb2FwRmF1bHQpOworICAgICAgICAgICAgaWYgKHNvYXBWZXJzaW9uID09IFNPQVBWZXJzaW9uLlNPQVBfMTEpIHsKKyAgICAgICAgICAgICAgICBGYXVsdERldGFpbEhlYWRlciBzMTFGYXVsdERldGFpbEhlYWRlciA9IG5ldyBGYXVsdERldGFpbEhlYWRlcihhZGRyZXNzaW5nVmVyc2lvbiwgYWRkcmVzc2luZ1ZlcnNpb24ucHJvYmxlbUhlYWRlclFOYW1lVGFnLmdldExvY2FsUGFydCgpLCBlLmdldE1hcFFOYW1lKCkpOworICAgICAgICAgICAgICAgIG0uZ2V0SGVhZGVycygpLmFkZChzMTFGYXVsdERldGFpbEhlYWRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBhY2tldCByZXNwb25zZSA9IHJlcXVlc3QuY3JlYXRlU2VydmVyUmVzcG9uc2UobSwgd3NkbFBvcnQsIG51bGwsIGJpbmRpbmcpOworICAgICAgICAgICAgcmV0dXJuIGRvUmV0dXJuV2l0aChyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG1lc3NhZ2VJZCA9IGhsLmdldE1lc3NhZ2VJRChhZGRyZXNzaW5nVmVyc2lvbiwgc29hcFZlcnNpb24pOworCisgICAgICAgIC8vIFRPRE86IFRoaXMgaXMgcHJvYmFibHkgbm90IGEgdmVyeSBnb29kIGlkZWEuCisgICAgICAgIC8vIGlmIHNvbWVvbmUgd2FudHMgdG8gZ2V0IHRoaXMgZGF0YSwgbGV0IHRoZW0gZ2V0IGZyb20gSGVhZGVyTGlzdC4KKyAgICAgICAgLy8gd2UgY2FuIGV2ZW4gcHJvdmlkZSBhIGNvbnZlbmllbmNlIG1ldGhvZAorICAgICAgICAvLyAgLS0gS0suCisgICAgICAgIHJlcXVlc3QuaW52b2NhdGlvblByb3BlcnRpZXMucHV0KFJFUVVFU1RfTUVTU0FHRV9JRCwgbWVzc2FnZUlkKTsKKworCisgICAgICAgIC8vIGRlZmF1bHRpbmcKKyAgICAgICAgaWYgKHJlcGx5VG8gPT0gbnVsbCkgICAgcmVwbHlUbyA9IGFkZHJlc3NpbmdWZXJzaW9uLmFub255bW91c0VwcjsKKyAgICAgICAgaWYgKGZhdWx0VG8gPT0gbnVsbCkgICAgZmF1bHRUbyA9IHJlcGx5VG87CisKKyAgICAgICAgd2JvID0gZ2V0V1NETEJvdW5kT3BlcmF0aW9uKHJlcXVlc3QpOworICAgICAgICBpZih3Ym8gIT0gbnVsbCAmJiB3Ym8uZ2V0QW5vbnltb3VzKCk9PSBXU0RMQm91bmRPcGVyYXRpb24uQU5PTllNT1VTLnJlcXVpcmVkKQorICAgICAgICAgICAgaXNBbm9ueW1vdXNSZXF1aXJlZCA9IHRydWU7CisgICAgICAgIFBhY2tldCBwID0gdmFsaWRhdGVJbmJvdW5kSGVhZGVycyhyZXF1ZXN0KTsKKyAgICAgICAgLy8gaWYgb25lLXdheSBtZXNzYWdlIGFuZCBXUy1BIGhlYWRlciBwcm9jZXNzaW5nIGZhdWx0IGhhcyBvY2N1cnJlZCwKKyAgICAgICAgLy8gdGhlbiBkbyBubyBmdXJ0aGVyIHByb2Nlc3NpbmcKKyAgICAgICAgaWYgKHAuZ2V0TWVzc2FnZSgpID09IG51bGwpCisgICAgICAgICAgICAvLyBUT0RPOiByZWNvcmQgdGhlIHByb2JsZW0gdGhhdCB3ZSBhcmUgZHJvcHBpbmcgdGhpcyBwcm9ibGVtIG9uIHRoZSBmbG9vci4KKyAgICAgICAgICAgIHJldHVybiBkb1JldHVybldpdGgocCk7CisKKyAgICAgICAgLy8gaWYgd2UgZmluZCBhbiBlcnJvciBpbiBhZGRyZXNzaW5nIGhlYWRlciwganVzdCB0dXJuIGFyb3VuZCB0aGUgZGlyZWN0aW9uIGhlcmUKKyAgICAgICAgaWYgKHAuZ2V0TWVzc2FnZSgpLmlzRmF1bHQoKSkgeworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHRyYW5zcG9ydEJhY2tDaGFubmVsIGlmIHdlIGtub3cgdGhhdAorICAgICAgICAgICAgLy8gd2UnbGwgbmV2ZXIgdXNlIHRoZW0KKyAgICAgICAgICAgIGlmICghKGlzQW5vbnltb3VzUmVxdWlyZWQpICYmCisgICAgICAgICAgICAgICAgICAgICFmYXVsdFRvLmlzQW5vbnltb3VzKCkgJiYgcmVxdWVzdC50cmFuc3BvcnRCYWNrQ2hhbm5lbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3QudHJhbnNwb3J0QmFja0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzUmVzcG9uc2UocCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2xvc2UgdGhlIHRyYW5zcG9ydEJhY2tDaGFubmVsIGlmIHdlIGtub3cgdGhhdAorICAgICAgICAvLyB3ZSdsbCBuZXZlciB1c2UgdGhlbQorICAgICAgICBpZiAoIShpc0Fub255bW91c1JlcXVpcmVkKSAmJgorICAgICAgICAgICAgICAgICFyZXBseVRvLmlzQW5vbnltb3VzKCkgJiYgIWZhdWx0VG8uaXNBbm9ueW1vdXMoKSAmJgorICAgICAgICAgICAgICAgIHJlcXVlc3QudHJhbnNwb3J0QmFja0NoYW5uZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlcXVlc3QudHJhbnNwb3J0QmFja0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIGRvSW52b2tlKG5leHQscCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc1Jlc3BvbnNlKFBhY2tldCByZXNwb25zZSkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IHJlc3BvbnNlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKG1zZyA9PW51bGwpCisgICAgICAgICAgICByZXR1cm4gZG9SZXR1cm5XaXRoKHJlc3BvbnNlKTsgIC8vIG9uZSB3YXkgbWVzc2FnZS4gTm90aGluZyB0byBzZWUgaGVyZS4gTW92ZSBvbi4KKworICAgICAgICBXU0VuZHBvaW50UmVmZXJlbmNlIHRhcmdldCA9IG1zZy5pc0ZhdWx0KCk/ZmF1bHRUbzpyZXBseVRvOworCisgICAgICAgIGlmKHRhcmdldC5pc0Fub255bW91cygpIHx8IGlzQW5vbnltb3VzUmVxdWlyZWQgKQorICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHdpbGwgZ28gYmFjayB0aGUgYmFjayBjaGFubmVsLiBtb3N0IGNvbW1vbiBjYXNlCisgICAgICAgICAgICByZXR1cm4gZG9SZXR1cm5XaXRoKHJlc3BvbnNlKTsKKworICAgICAgICBpZih0YXJnZXQuaXNOb25lKCkpIHsKKyAgICAgICAgICAgIC8vIHRoZSBjYWxsZXIgZG9lc24ndCB3YW50IHRvIGhlYXIgYWJvdXQgaXQsIHNvIHByb2NlZWQgbGlrZSBvbmUtd2F5CisgICAgICAgICAgICByZXNwb25zZS5zZXRNZXNzYWdlKG51bGwpOworICAgICAgICAgICAgcmV0dXJuIGRvUmV0dXJuV2l0aChyZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZW5kIHRoZSByZXNwb25zZSB0byB0aGlzIEVQUi4KKyAgICAgICAgcHJvY2Vzc05vbkFub255bW91c1JlcGx5KHJlc3BvbnNlLHRhcmdldCk7CisKKyAgICAgICAgLy8gdGhlbiB3ZSdsbCBwcm9jZWVkIHRoZSByZXN0IGxpa2Ugb25lLXdheS4KKyAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZShudWxsKTsKKyAgICAgICAgcmV0dXJuIGRvUmV0dXJuV2l0aChyZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhIHJlc3BvbnNlIHRvIGEgbm9uLWFub255bW91cyBhZGRyZXNzLiBBbHNvIGNsb3NlcyB0aGUgdHJhbnNwb3J0IGJhY2sgY2hhbm5lbAorICAgICAqIG9mIHtAbGluayBQYWNrZXR9IGlmIGl0J3Mgbm90IGNsb3NlZCBhbHJlYWR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVE9ETzogaWRlYWxseSB3ZSBzaG91bGQgYmUgZG9pbmcgdGhpcyBieSBjcmVhdGluZyBhIG5ldyBmaWJlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrZXQKKyAgICAgKiAgICAgIFRoZSByZXNwb25zZSBmcm9tIG91ciBzZXJ2ZXIsIHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICogICAgICBXaGVyZSBkbyB3ZSBzZW5kIHRoZSBwYWNrZXQgdG8/CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOb25Bbm9ueW1vdXNSZXBseShmaW5hbCBQYWNrZXQgcGFja2V0LCBXU0VuZHBvaW50UmVmZXJlbmNlIHRhcmdldCkgeworICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgd2Ugd29uJ3QgYmUgc2VuZGluZyBhbnl0aGluZyBiYWNrIHRocm91Z2ggdGhlIGJhY2sgY2hhbm5lbCwKKyAgICAgICAgLy8gc28gY2xvc2UgaXQgZmlyc3QgdG8gbGV0IHRoZSBjbGllbnQgZ28uCisgICAgICAgIGlmIChwYWNrZXQudHJhbnNwb3J0QmFja0NoYW5uZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhY2tldC50cmFuc3BvcnRCYWNrQ2hhbm5lbC5jbG9zZSgpOworCisgICAgICAgIGlmIChwYWNrZXQuZ2V0TWVzc2FnZSgpLmlzT25lV2F5KHdzZGxQb3J0KSkgeworICAgICAgICAgICAgLy8gb25lIHdheSBtZXNzYWdlIGJ1dCB3aXRoIHJlcGx5VG8uIEkgYmVsaWV2ZSB0aGlzIGlzIGEgaGFjayBmb3IgV1MtVFggLSBLSy4KKyAgICAgICAgICAgIExPR0dFUi5maW5lKEFkZHJlc3NpbmdNZXNzYWdlcy5OT05fQU5PTllNT1VTX1JFU1BPTlNFX09ORVdBWSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEVuZHBvaW50QWRkcmVzcyBhZHJzOworICAgICAgICB0cnkgeworICAgICAgICAgICAgIGFkcnMgPSBuZXcgRW5kcG9pbnRBZGRyZXNzKFVSSS5jcmVhdGUodGFyZ2V0LmdldEFkZHJlc3MoKSkpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2UgbmVlZCB0byBhc3NlbWJsZSBhIHBpcGVsaW5lIHRvIHRhbGsgdG8gdGhpcyBlbmRwb2ludC4KKyAgICAgICAgLy8gVE9ETzogd2hhdCB0byBwYXNzIGFzIFdTU2VydmljZT8KKyAgICAgICAgVHViZSB0cmFuc3BvcnQgPSBUcmFuc3BvcnRUdWJlRmFjdG9yeS5jcmVhdGUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgIG5ldyBDbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dChhZHJzLCB3c2RsUG9ydCwgbnVsbCwgYmluZGluZykpOworCisgICAgICAgIHBhY2tldC5lbmRwb2ludEFkZHJlc3MgPSBhZHJzOworICAgICAgICBTdHJpbmcgYWN0aW9uID0gcGFja2V0LmdldE1lc3NhZ2UoKS5pc0ZhdWx0KCkgPworICAgICAgICAgICAgICAgIGhlbHBlci5nZXRGYXVsdEFjdGlvbih3Ym8sIHBhY2tldCkgOgorICAgICAgICAgICAgICAgIGhlbHBlci5nZXRPdXRwdXRBY3Rpb24od2JvKTsKKyAgICAgICAgLy9zZXQgdGhlIFNPQVBBY3Rpb24sIGFzIGl0cyBnb3QgdG8gYmUgc2FtZSBhcyB3c2E6QWN0aW9uCisgICAgICAgIHBhY2tldC5zb2FwQWN0aW9uID0gYWN0aW9uOworICAgICAgICBGaWJlci5jdXJyZW50KCkucnVuU3luYyh0cmFuc3BvcnQsIHBhY2tldCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVBY3Rpb24oUGFja2V0IHBhY2tldCkgeworICAgICAgICAvL1RoZXJlIG1heSBub3QgYmUgYSBXU0RMIG9wZXJhdGlvbi4gIFRoZXJlIG1heSBub3QgZXZlbiBiZSBhIFdTREwuCisgICAgICAgIC8vRm9yIGluc3RhbmNlIHRoaXMgbWF5IGJlIGEgUk0gQ3JlYXRlU2VxdWVuY2UgbWVzc2FnZS4KKyAgICAgICAgV1NETEJvdW5kT3BlcmF0aW9uIHdibyA9IGdldFdTRExCb3VuZE9wZXJhdGlvbihwYWNrZXQpOworCisgICAgICAgIGlmICh3Ym8gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmcgZ290QSA9IHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0SGVhZGVycygpLmdldEFjdGlvbihhZGRyZXNzaW5nVmVyc2lvbiwgc29hcFZlcnNpb24pOworCisgICAgICAgIGlmIChnb3RBID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuVkFMSURBVElPTl9TRVJWRVJfTlVMTF9BQ1RJT04oKSk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gaGVscGVyLmdldElucHV0QWN0aW9uKHBhY2tldCk7CisgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gaGVscGVyLmdldFNPQVBBY3Rpb24ocGFja2V0KTsKKyAgICAgICAgaWYgKGhlbHBlci5pc0lucHV0QWN0aW9uRGVmYXVsdChwYWNrZXQpICYmIChzb2FwQWN0aW9uICE9IG51bGwgJiYgIXNvYXBBY3Rpb24uZXF1YWxzKCIiKSkpCisgICAgICAgICAgICBleHBlY3RlZCA9IHNvYXBBY3Rpb247CisKKyAgICAgICAgaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgIWdvdEEuZXF1YWxzKGV4cGVjdGVkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbihnb3RBKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNoZWNrQ2FyZGluYWxpdHkoUGFja2V0IHBhY2tldCkgeworICAgICAgICBzdXBlci5jaGVja0NhcmRpbmFsaXR5KHBhY2tldCk7CisKKyAgICAgICAgLy8gd3NhdzpBbm9ueW1vdXMgdmFsaWRhdGlvbgorICAgICAgICBXU0RMQm91bmRPcGVyYXRpb24gd2JvID0gZ2V0V1NETEJvdW5kT3BlcmF0aW9uKHBhY2tldCk7CisgICAgICAgIGNoZWNrQW5vbnltb3VzU2VtYW50aWNzKHdibywgcmVwbHlUbywgZmF1bHRUbyk7CisgICAgICAgICAvLyBjaGVjayBpZiBhZGRyZXNzZXMgYXJlIHZhbGlkCisgICAgICAgIGNoZWNrTm9uQW5vbnltb3VzQWRkcmVzc2VzKHJlcGx5VG8sZmF1bHRUbyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTm9uQW5vbnltb3VzQWRkcmVzc2VzKFdTRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbywgV1NFbmRwb2ludFJlZmVyZW5jZSBmYXVsdFRvKSB7CisgICAgICAgIGlmICghcmVwbHlUby5pc0Fub255bW91cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludEFkZHJlc3MoVVJJLmNyZWF0ZShyZXBseVRvLmdldEFkZHJlc3MoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE1hcEV4Y2VwdGlvbihhZGRyZXNzaW5nVmVyc2lvbi5yZXBseVRvVGFnLCBhZGRyZXNzaW5nVmVyc2lvbi5pbnZhbGlkQWRkcmVzc1RhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9mb3Igbm93IG9ubHkgdmFsaWRhdGUgUmVwbHlUbworICAgICAgICAvKgorICAgICAgICBpZiAoIWZhdWx0VG8uaXNBbm9ueW1vdXMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnRBZGRyZXNzKFVSSS5jcmVhdGUoZmF1bHRUby5nZXRBZGRyZXNzKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNYXBFeGNlcHRpb24oYWRkcmVzc2luZ1ZlcnNpb24uZmF1bHRUb1RhZywgYWRkcmVzc2luZ1ZlcnNpb24uaW52YWxpZEFkZHJlc3NUYWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01hbmRhdG9yeUhlYWRlcnMoCisgICAgICAgIFBhY2tldCBwYWNrZXQsIGJvb2xlYW4gZm91bmRBY3Rpb24sIGJvb2xlYW4gZm91bmRUbywgYm9vbGVhbiBmb3VuZE1lc3NhZ2VJZCwgYm9vbGVhbiBmb3VuZFJlbGF0ZXNUbykgeworICAgICAgICBzdXBlci5jaGVja01hbmRhdG9yeUhlYWRlcnMocGFja2V0LCBmb3VuZEFjdGlvbiwgZm91bmRUbywgZm91bmRNZXNzYWdlSWQsIGZvdW5kUmVsYXRlc1RvKTsKKyAgICAgICAgV1NETEJvdW5kT3BlcmF0aW9uIHdibyA9IGdldFdTRExCb3VuZE9wZXJhdGlvbihwYWNrZXQpOworICAgICAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciBmb3Igbm9uLWFwcGxpY2F0aW9uIG1lc3NhZ2VzCisgICAgICAgIGlmICh3Ym8gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBpZiBubyB3c2E6VG8gaGVhZGVyIGlzIGZvdW5kCisgICAgICAgIGlmICghZm91bmRUbykKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXBSZXF1aXJlZEV4Y2VwdGlvbihhZGRyZXNzaW5nVmVyc2lvbi50b1RhZyk7CisKKyAgICAgICAgLy8gaWYgdHdvLXdheSBhbmQgbm8gd3NhOk1lc3NhZ2VJRCBpcyBmb3VuZAorICAgICAgICBpZiAoIXdiby5nZXRPcGVyYXRpb24oKS5pc09uZVdheSgpICYmICFmb3VuZE1lc3NhZ2VJZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXBSZXF1aXJlZEV4Y2VwdGlvbihhZGRyZXNzaW5nVmVyc2lvbi5tZXNzYWdlSURUYWcpOworICAgIH0KKworCisgICAgZmluYWwgdm9pZCBjaGVja0Fub255bW91c1NlbWFudGljcyhXU0RMQm91bmRPcGVyYXRpb24gd2JvLCBXU0VuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8sIFdTRW5kcG9pbnRSZWZlcmVuY2UgZmF1bHRUbykgeworICAgICAgICAvLyBubyBjaGVjayBpZiBBZGRyZXNzaW5nIGlzIG5vdCBlbmFibGVkIG9yIGlzIE1lbWJlciBTdWJtaXNzaW9uCisgICAgICAgIGlmIChhZGRyZXNzaW5nVmVyc2lvbiA9PSBudWxsIHx8IGFkZHJlc3NpbmdWZXJzaW9uID09IEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAod2JvID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgV1NETEJvdW5kT3BlcmF0aW9uLkFOT05ZTU9VUyBhbm9uID0gd2JvLmdldEFub255bW91cygpOworCisgICAgICAgIFN0cmluZyByZXBseVRvVmFsdWUgPSBudWxsOworICAgICAgICBTdHJpbmcgZmF1bHRUb1ZhbHVlID0gbnVsbDsKKworICAgICAgICBpZiAocmVwbHlUbyAhPSBudWxsKQorICAgICAgICAgICAgcmVwbHlUb1ZhbHVlID0gcmVwbHlUby5nZXRBZGRyZXNzKCk7CisKKyAgICAgICAgaWYgKGZhdWx0VG8gIT0gbnVsbCkKKyAgICAgICAgICAgIGZhdWx0VG9WYWx1ZSA9IGZhdWx0VG8uZ2V0QWRkcmVzcygpOworCisgICAgICAgIHN3aXRjaCAoYW5vbikgeworICAgICAgICBjYXNlIG9wdGlvbmFsOgorICAgICAgICAgICAgLy8gbm8gY2hlY2sgaXMgcmVxdWlyZWQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHByb2hpYml0ZWQ6CisgICAgICAgICAgICBpZiAocmVwbHlUb1ZhbHVlICE9IG51bGwgJiYgcmVwbHlUb1ZhbHVlLmVxdWFscyhhZGRyZXNzaW5nVmVyc2lvbi5hbm9ueW1vdXNVcmkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkTWFwRXhjZXB0aW9uKGFkZHJlc3NpbmdWZXJzaW9uLnJlcGx5VG9UYWcsIE9OTFlfTk9OX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRCk7CisKKyAgICAgICAgICAgIGlmIChmYXVsdFRvVmFsdWUgIT0gbnVsbCAmJiBmYXVsdFRvVmFsdWUuZXF1YWxzKGFkZHJlc3NpbmdWZXJzaW9uLmFub255bW91c1VyaSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNYXBFeGNlcHRpb24oYWRkcmVzc2luZ1ZlcnNpb24uZmF1bHRUb1RhZywgT05MWV9OT05fQU5PTllNT1VTX0FERFJFU1NfU1VQUE9SVEVEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHJlcXVpcmVkOgorICAgICAgICAgICAgaWYgKHJlcGx5VG9WYWx1ZSAhPSBudWxsICYmICFyZXBseVRvVmFsdWUuZXF1YWxzKGFkZHJlc3NpbmdWZXJzaW9uLmFub255bW91c1VyaSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNYXBFeGNlcHRpb24oYWRkcmVzc2luZ1ZlcnNpb24ucmVwbHlUb1RhZywgT05MWV9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQpOworCisgICAgICAgICAgICBpZiAoZmF1bHRUb1ZhbHVlICE9IG51bGwgJiYgIWZhdWx0VG9WYWx1ZS5lcXVhbHMoYWRkcmVzc2luZ1ZlcnNpb24uYW5vbnltb3VzVXJpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE1hcEV4Y2VwdGlvbihhZGRyZXNzaW5nVmVyc2lvbi5mYXVsdFRvVGFnLCBPTkxZX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIGNhbm5vdCByZWFjaCBoZXJlCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuSU5WQUxJRF9XU0FXX0FOT05ZTU9VUyhhbm9uLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfTUVTU0FHRV9JRCA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLnJlcXVlc3QubWVzc2FnZUlEIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFdzYVNlcnZlclR1YmUuY2xhc3MuZ2V0TmFtZSgpKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvV3NhVHViZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9Xc2FUdWJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhYTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvV3NhVHViZS5qYXZhCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZzsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5tb2RlbC5JbnZhbGlkTWFwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcubW9kZWwuTWFwUmVxdWlyZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExCb3VuZE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5OZXh0QWN0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZUNsb25lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuRmF1bHREZXRhaWxIZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkFkZHJlc3NpbmdNZXNzYWdlczsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBXUy1BZGRyZXNzaW5nIHByb2Nlc3NpbmcgY29kZSBzaGFyZWQgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlci4KKyAqCisgKiA8cD4KKyAqIFRoaXMgdHViZSBpcyB1c2VkIG9ubHkgd2hlbiBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQuCisgKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK2Fic3RyYWN0IGNsYXNzIFdzYVR1YmUgZXh0ZW5kcyBBYnN0cmFjdEZpbHRlclR1YmVJbXBsIHsKKyAgICAvKioKKyAgICAgKiBQb3J0IHRoYXQgd2UgYXJlIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIEBOb3ROdWxsIFdTRExQb3J0IHdzZGxQb3J0OworICAgIHByb3RlY3RlZCBmaW5hbCBXU0JpbmRpbmcgYmluZGluZzsKKyAgICBmaW5hbCBXc2FUdWJlSGVscGVyIGhlbHBlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQE5vdE51bGwgQWRkcmVzc2luZ1ZlcnNpb24gYWRkcmVzc2luZ1ZlcnNpb247CisgICAgcHJvdGVjdGVkIGZpbmFsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgYWRkcmVzc2luZyBoZWFkZXJzIGFyZSBtYW5kYXRvcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFkZHJlc3NpbmdSZXF1aXJlZDsKKworICAgIHB1YmxpYyBXc2FUdWJlKFdTRExQb3J0IHdzZGxQb3J0LCBXU0JpbmRpbmcgYmluZGluZywgVHViZSBuZXh0KSB7CisgICAgICAgIHN1cGVyKG5leHQpOworICAgICAgICB0aGlzLndzZGxQb3J0ID0gd3NkbFBvcnQ7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgIGFkZHJlc3NpbmdWZXJzaW9uID0gYmluZGluZy5nZXRBZGRyZXNzaW5nVmVyc2lvbigpOworICAgICAgICBzb2FwVmVyc2lvbiA9IGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKTsKKyAgICAgICAgaGVscGVyID0gZ2V0VHViZUhlbHBlcigpOworICAgICAgICBhZGRyZXNzaW5nUmVxdWlyZWQgPSBBZGRyZXNzaW5nVmVyc2lvbi5pc1JlcXVpcmVkKGJpbmRpbmcpOworICAgIH0KKworICAgIHB1YmxpYyBXc2FUdWJlKFdzYVR1YmUgdGhhdCwgVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgc3VwZXIodGhhdCwgY2xvbmVyKTsKKyAgICAgICAgdGhpcy53c2RsUG9ydCA9IHRoYXQud3NkbFBvcnQ7CisgICAgICAgIHRoaXMuYmluZGluZyA9IHRoYXQuYmluZGluZzsKKyAgICAgICAgdGhpcy5oZWxwZXIgPSB0aGF0LmhlbHBlcjsKKyAgICAgICAgYWRkcmVzc2luZ1ZlcnNpb24gPSB0aGF0LmFkZHJlc3NpbmdWZXJzaW9uOworICAgICAgICBzb2FwVmVyc2lvbiA9IHRoYXQuc29hcFZlcnNpb247CisgICAgICAgIGFkZHJlc3NpbmdSZXF1aXJlZCA9IHRoYXQuYWRkcmVzc2luZ1JlcXVpcmVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYworICAgIEBOb3ROdWxsCisgICAgTmV4dEFjdGlvbiBwcm9jZXNzRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7CisgICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzRXhjZXB0aW9uKHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBXc2FUdWJlSGVscGVyIGdldFR1YmVIZWxwZXIoKSB7CisgICAgICAgIGlmKGJpbmRpbmcuaXNGZWF0dXJlRW5hYmxlZChBZGRyZXNzaW5nRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3NhVHViZUhlbHBlckltcGwod3NkbFBvcnQsIG51bGwsIGJpbmRpbmcpOworICAgICAgICB9IGVsc2UgaWYoYmluZGluZy5pc0ZlYXR1cmVFbmFibGVkKE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgIC8vc2VpTW9kZWwgaXMgbnVsbCBhcyBpdCBpcyBub3QgbmVlZGVkLgorICAgICAgICAgICAgcmV0dXJuIG5ldyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLnYyMDA0MDguV3NhVHViZUhlbHBlckltcGwod3NkbFBvcnQsIG51bGwsIGJpbmRpbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQWRkcmVzc2luZyBpcyBub3QgZW5hYmxlZCwgV3NhVHViZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBwaXBlbGluZQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQWRkcmVzc2luZ01lc3NhZ2VzLkFERFJFU1NJTkdfTk9UX0VOQUJMRUQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHRoZSBpbmJvdW5kIG1lc3NhZ2UuIElmIGFuIGVycm9yIGlzIGZvdW5kLCBjcmVhdGUKKyAgICAgKiBhIGZhdWx0IG1lc3NhZ2UgYW5kIHJldHVybnMgdGhhdC4gT3RoZXJ3aXNlCisgICAgICogaXQgd2lsbCBwYXNzIHRocm91Z2ggdGhlIHBhcmFtZXRlciAncGFja2V0JyBvYmplY3QgdG8gdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgUGFja2V0IHZhbGlkYXRlSW5ib3VuZEhlYWRlcnMoUGFja2V0IHBhY2tldCkgeworICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0OworICAgICAgICBGYXVsdERldGFpbEhlYWRlciBzMTFGYXVsdERldGFpbEhlYWRlcjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tDYXJkaW5hbGl0eShwYWNrZXQpOworCisgICAgICAgICAgICByZXR1cm4gcGFja2V0OworICAgICAgICB9IGNhdGNoIChJbnZhbGlkTWFwRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNvYXBGYXVsdCA9IGhlbHBlci5uZXdJbnZhbGlkTWFwRmF1bHQoZSwgYWRkcmVzc2luZ1ZlcnNpb24pOworICAgICAgICAgICAgczExRmF1bHREZXRhaWxIZWFkZXIgPSBuZXcgRmF1bHREZXRhaWxIZWFkZXIoYWRkcmVzc2luZ1ZlcnNpb24sIGFkZHJlc3NpbmdWZXJzaW9uLnByb2JsZW1IZWFkZXJRTmFtZVRhZy5nZXRMb2NhbFBhcnQoKSwgZS5nZXRNYXBRTmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFwUmVxdWlyZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc29hcEZhdWx0ID0gaGVscGVyLm5ld01hcFJlcXVpcmVkRmF1bHQoZSwgYWRkcmVzc2luZ1ZlcnNpb24pOworICAgICAgICAgICAgczExRmF1bHREZXRhaWxIZWFkZXIgPSBuZXcgRmF1bHREZXRhaWxIZWFkZXIoYWRkcmVzc2luZ1ZlcnNpb24sIGFkZHJlc3NpbmdWZXJzaW9uLnByb2JsZW1IZWFkZXJRTmFtZVRhZy5nZXRMb2NhbFBhcnQoKSwgZS5nZXRNYXBRTmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzb2FwRmF1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gV1MtQSBmYXVsdCBwcm9jZXNzaW5nIGZvciBvbmUtd2F5IG1ldGhvZHMKKyAgICAgICAgICAgIGlmIChwYWNrZXQuZ2V0TWVzc2FnZSgpLmlzT25lV2F5KHdzZGxQb3J0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQuY3JlYXRlU2VydmVyUmVzcG9uc2UobnVsbCwgd3NkbFBvcnQsIG51bGwsIGJpbmRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZXNzYWdlIG0gPSBNZXNzYWdlcy5jcmVhdGUoc29hcEZhdWx0KTsKKyAgICAgICAgICAgIGlmIChzb2FwVmVyc2lvbiA9PSBTT0FQVmVyc2lvbi5TT0FQXzExKSB7CisgICAgICAgICAgICAgICAgbS5nZXRIZWFkZXJzKCkuYWRkKHMxMUZhdWx0RGV0YWlsSGVhZGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGFja2V0IHJlc3BvbnNlID0gcGFja2V0LmNyZWF0ZVNlcnZlclJlc3BvbnNlKG0sIHdzZGxQb3J0LCBudWxsLCAgYmluZGluZyk7CisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFja2V0OworICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gaXNBZGRyZXNzaW5nRW5nYWdlZE9yUmVxdWlyZWQoUGFja2V0IHBhY2tldCwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgaWYgKEFkZHJlc3NpbmdWZXJzaW9uLmlzUmVxdWlyZWQoYmluZGluZykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpZiAocGFja2V0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKHBhY2tldC5nZXRNZXNzYWdlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAocGFja2V0LmdldE1lc3NhZ2UoKS5nZXRIZWFkZXJzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTdHJpbmcgYWN0aW9uID0gcGFja2V0LmdldE1lc3NhZ2UoKS5nZXRIZWFkZXJzKCkuZ2V0QWN0aW9uKGFkZHJlc3NpbmdWZXJzaW9uLCBzb2FwVmVyc2lvbik7CisgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgY2FyZGluYWxpdHkgb2YgV1MtQWRkcmVzc2luZyBoZWFkZXJzIG9uIGFuIGluYm91bmQge0BsaW5rIFBhY2tldH0uIFRoaXMgbWV0aG9kCisgICAgICogY2hlY2tzIGZvciB0aGUgY2FyZGluYWxpdHkgaWYgV1MtQWRkcmVzc2luZyBpcyBlbmdhZ2VkIChkZXRlY3RlZCBieSB0aGUgcHJlc2VuY2Ugb2Ygd3NhOkFjdGlvbgorICAgICAqIGhlYWRlcikgb3Igd3NkbDpyZXF1aXJlZD10cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2tldCBUaGUgaW5ib3VuZCBwYWNrZXQuCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIGlmOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+dGhlcmUgaXMgYW4gZXJyb3IgcmVhZGluZyBSZXBseVRvIG9yIEZhdWx0VG88L2xpPgorICAgICAqIDxsaT5XUy1BZGRyZXNzaW5nIGlzIHJlcXVpcmVkIGFuZCB7QGxpbmsgTWVzc2FnZX0gd2l0aGluIDxjb2RlPnBhY2tldDwvY29kZT4gaXMgbnVsbDwvbGk+CisgICAgICogPGxpPldTLUFkZHJlc3NpbmcgaXMgcmVxdWlyZWQgYW5kIG5vIGhlYWRlcnMgYXJlIGZvdW5kIGluIHRoZSB7QGxpbmsgTWVzc2FnZX08L2xpPgorICAgICAqIDxsaT5hbiB1a25vd24gV1MtQWRkcmVzc2luZyBoZWFkZXIgaXMgcHJlc2VudDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVja0NhcmRpbmFsaXR5KFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gcGFja2V0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGFkZHJlc3NpbmdSZXF1aXJlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuTlVMTF9NRVNTQUdFKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yPEhlYWRlcj4gaEl0ZXIgPSBtZXNzYWdlLmdldEhlYWRlcnMoKS5nZXRIZWFkZXJzKGFkZHJlc3NpbmdWZXJzaW9uLm5zVXJpLCB0cnVlKTsKKworICAgICAgICBpZiAoIWhJdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgLy8gbm8gV1MtQSBoZWFkZXJzIGFyZSBmb3VuZAorICAgICAgICAgICAgaWYgKGFkZHJlc3NpbmdSZXF1aXJlZCkKKyAgICAgICAgICAgICAgICAvLyBpZiBXUy1BIGlzIHJlcXVpcmVkLCB0aGVuIHRocm93IGFuIGV4Y2VwdGlvbiBsb29raW5nIGZvciB3c2E6QWN0aW9uIGhlYWRlcgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXBSZXF1aXJlZEV4Y2VwdGlvbihhZGRyZXNzaW5nVmVyc2lvbi5hY3Rpb25UYWcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vIGVsc2Ugbm8gbmVlZCB0byBwcm9jZXNzCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBmb3VuZEZyb20gPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZFRvID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZm91bmRSZXBseVRvID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZm91bmRGYXVsdFRvID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZm91bmRBY3Rpb24gPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZE1lc3NhZ2VJZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGZvdW5kUmVsYXRlc1RvID0gZmFsc2U7CisgICAgICAgIFFOYW1lIGR1cGxpY2F0ZUhlYWRlciA9IG51bGw7CisKKyAgICAgICAgd2hpbGUgKGhJdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgSGVhZGVyIGggPSBoSXRlci5uZXh0KCk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBIZWFkZXIgaXMgaW4gY3VycmVudCByb2xlCisgICAgICAgICAgICBpZiAoIWlzSW5DdXJyZW50Um9sZShoLCBiaW5kaW5nKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBoLmdldExvY2FsUGFydCgpOworICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyhhZGRyZXNzaW5nVmVyc2lvbi5mcm9tVGFnLmdldExvY2FsUGFydCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChmb3VuZEZyb20pIHsKKyAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlSGVhZGVyID0gYWRkcmVzc2luZ1ZlcnNpb24uZnJvbVRhZzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kRnJvbSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsLmVxdWFscyhhZGRyZXNzaW5nVmVyc2lvbi50b1RhZy5nZXRMb2NhbFBhcnQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmRUbykgeworICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVIZWFkZXIgPSBhZGRyZXNzaW5nVmVyc2lvbi50b1RhZzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kVG8gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbC5lcXVhbHMoYWRkcmVzc2luZ1ZlcnNpb24ucmVwbHlUb1RhZy5nZXRMb2NhbFBhcnQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmRSZXBseVRvKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlciA9IGFkZHJlc3NpbmdWZXJzaW9uLnJlcGx5VG9UYWc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3VuZFJlcGx5VG8gPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7IC8vIHZlcmlmeSB0aGF0IHRoZSBoZWFkZXIgaXMgaW4gYSBnb29kIHNoYXBlCisgICAgICAgICAgICAgICAgICAgIGgucmVhZEFzRVBSKGFkZHJlc3NpbmdWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuUkVQTFlfVE9fQ0FOTk9UX1BBUlNFKCksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWwuZXF1YWxzKGFkZHJlc3NpbmdWZXJzaW9uLmZhdWx0VG9UYWcuZ2V0TG9jYWxQYXJ0KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kRmF1bHRUbykgeworICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVIZWFkZXIgPSBhZGRyZXNzaW5nVmVyc2lvbi5mYXVsdFRvVGFnOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm91bmRGYXVsdFRvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0cnkgeyAvLyB2ZXJpZnkgdGhhdCB0aGUgaGVhZGVyIGlzIGluIGEgZ29vZCBzaGFwZQorICAgICAgICAgICAgICAgICAgICBoLnJlYWRBc0VQUihhZGRyZXNzaW5nVmVyc2lvbik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQWRkcmVzc2luZ01lc3NhZ2VzLkZBVUxUX1RPX0NBTk5PVF9QQVJTRSgpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsLmVxdWFscyhhZGRyZXNzaW5nVmVyc2lvbi5hY3Rpb25UYWcuZ2V0TG9jYWxQYXJ0KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlciA9IGFkZHJlc3NpbmdWZXJzaW9uLmFjdGlvblRhZzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kQWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWwuZXF1YWxzKGFkZHJlc3NpbmdWZXJzaW9uLm1lc3NhZ2VJRFRhZy5nZXRMb2NhbFBhcnQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmRNZXNzYWdlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlSGVhZGVyID0gYWRkcmVzc2luZ1ZlcnNpb24ubWVzc2FnZUlEVGFnOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm91bmRNZXNzYWdlSWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbC5lcXVhbHMoYWRkcmVzc2luZ1ZlcnNpb24ucmVsYXRlc1RvVGFnLmdldExvY2FsUGFydCgpKSkgeworICAgICAgICAgICAgICAgIGZvdW5kUmVsYXRlc1RvID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWwuZXF1YWxzKGFkZHJlc3NpbmdWZXJzaW9uLmZhdWx0RGV0YWlsVGFnLmdldExvY2FsUGFydCgpKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBhbnl0aGluZyBiZSBkb25lIGhlcmUgPworICAgICAgICAgICAgICAgIC8vIFRPRE86IGZhdWx0IGRldGFpbCBlbGVtZW50IC0gb25seSBmb3IgU09BUCAxLjEKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKEFkZHJlc3NpbmdNZXNzYWdlcy5VTktOT1dOX1dTQV9IRUFERVIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBmb3IgaW52YWxpZCBjYXJkaW5hbGl0eSBmaXJzdCBiZWZvcmUgY2hlY2tpbmcgZm9yIG1hbmRhdG9yeSBoZWFkZXJzCisgICAgICAgIGlmIChkdXBsaWNhdGVIZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNYXBFeGNlcHRpb24oZHVwbGljYXRlSGVhZGVyLCBhZGRyZXNzaW5nVmVyc2lvbi5pbnZhbGlkQ2FyZGluYWxpdHlUYWcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV1MtQSBpcyBlbmdhZ2VkIGlmIHdzYTpBY3Rpb24gaGVhZGVyIGlzIGZvdW5kCisgICAgICAgIGJvb2xlYW4gZW5nYWdlZCA9IGZvdW5kQWN0aW9uOworCisgICAgICAgIC8vIGNoZWNrIGZvciBtYW5kYXRvcnkgc2V0IG9mIGhlYWRlcnMgb25seSBpZjoKKyAgICAgICAgLy8gMS4gV1MtQSBpcyBlbmdhZ2VkIG9yCisgICAgICAgIC8vIDIuIHdzZGw6cmVxdWlyZWQ9dHJ1ZQorICAgICAgICAvLyBCb3RoIHdzYTpBY3Rpb24gYW5kIHdzYTpUbyBNVVNUIGJlIHByZXNlbnQgb24gcmVxdWVzdCAoZm9yIG9uZXdheSBNRVApIGFuZAorICAgICAgICAvLyByZXNwb25zZSBtZXNzYWdlcyAoZm9yIG9uZXdheSBhbmQgcmVxdWVzdC9yZXNwb25zZSBNRVAgb25seSkKKyAgICAgICAgaWYgKGVuZ2FnZWQgfHwgYWRkcmVzc2luZ1JlcXVpcmVkKSB7CisgICAgICAgICAgICBjaGVja01hbmRhdG9yeUhlYWRlcnMocGFja2V0LCBmb3VuZEFjdGlvbiwgZm91bmRUbywgZm91bmRNZXNzYWdlSWQsIGZvdW5kUmVsYXRlc1RvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gaXNJbkN1cnJlbnRSb2xlKEhlYWRlciBoZWFkZXIsIFdTQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIC8vIFRPRE86IGJpbmRpbmcgd2lsbCBiZSBudWxsIGZvciBwcm90b2NvbCBtZXNzYWdlcworICAgICAgICAvLyBUT0RPOiByZXR1cm5pbmcgdHJ1ZSBhc3N1bWVzIHRoYXQgcHJvdG9jb2wgbWVzc2FnZXMgYXJlCisgICAgICAgIC8vIFRPRE86IGFsd2F5cyBpbiBjdXJyZW50IHJvbGUsIHRoaXMgbWF5IG5vdCB0byBiZSBmaXhlZC4KKyAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisKKyAgICAgICAgaWYgKHNvYXBWZXJzaW9uID09IFNPQVBWZXJzaW9uLlNPQVBfMTEpIHsKKyAgICAgICAgICAgIC8vIFJhbWE6IFdoeSBub3QgY2hlY2tpbmcgZm9yIFNPQVAgMS4xPworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgcm9sZSA9IGhlYWRlci5nZXRSb2xlKHNvYXBWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiAocm9sZS5lcXVhbHMoU09BUFZlcnNpb24uU09BUF8xMi5pbXBsaWNpdFJvbGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBXU0RMQm91bmRPcGVyYXRpb24gZ2V0V1NETEJvdW5kT3BlcmF0aW9uKFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgcmV0dXJuIHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0T3BlcmF0aW9uKHdzZGxQb3J0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNPQVBBY3Rpb24oUGFja2V0IHBhY2tldCkgeworICAgICAgICBTdHJpbmcgZ290QSA9IHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0SGVhZGVycygpLmdldEFjdGlvbihhZGRyZXNzaW5nVmVyc2lvbiwgc29hcFZlcnNpb24pOworICAgICAgICBpZiAoZ290QSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQWRkcmVzc2luZ01lc3NhZ2VzLlZBTElEQVRJT05fU0VSVkVSX05VTExfQUNUSU9OKCkpOworICAgICAgICBpZihwYWNrZXQuc29hcEFjdGlvbiAhPSBudWxsICYmICFwYWNrZXQuc29hcEFjdGlvbi5lcXVhbHMoIlwiXCIiKSAmJiAhcGFja2V0LnNvYXBBY3Rpb24uZXF1YWxzKCJcIiIrZ290QSsiXCIiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNYXBFeGNlcHRpb24oYWRkcmVzc2luZ1ZlcnNpb24uYWN0aW9uVGFnLCBhZGRyZXNzaW5nVmVyc2lvbi5hY3Rpb25NaXNtYXRjaFRhZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZUFjdGlvbihQYWNrZXQgcGFja2V0KTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01hbmRhdG9yeUhlYWRlcnMoCisgICAgICAgIFBhY2tldCBwYWNrZXQsIGJvb2xlYW4gZm91bmRBY3Rpb24sIGJvb2xlYW4gZm91bmRUbywgYm9vbGVhbiBmb3VuZE1lc3NhZ2VJZCwgYm9vbGVhbiBmb3VuZFJlbGF0ZXNUbykgeworICAgICAgICBXU0RMQm91bmRPcGVyYXRpb24gd2JvID0gZ2V0V1NETEJvdW5kT3BlcmF0aW9uKHBhY2tldCk7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGZvciBub24tYXBwbGljYXRpb24gbWVzc2FnZXMKKyAgICAgICAgaWYgKHdibyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIGlmIG5vIHdzYTpBY3Rpb24gaGVhZGVyIGlzIGZvdW5kCisgICAgICAgIGlmICghZm91bmRBY3Rpb24pCisgICAgICAgICAgICB0aHJvdyBuZXcgTWFwUmVxdWlyZWRFeGNlcHRpb24oYWRkcmVzc2luZ1ZlcnNpb24uYWN0aW9uVGFnKTsKKyAgICAgICAgdmFsaWRhdGVTT0FQQWN0aW9uKHBhY2tldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9Xc2FUdWJlSGVscGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1dzYVR1YmVIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ2ZDdjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9Xc2FUdWJlSGVscGVyLmphdmEKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5tb2RlbC5JbnZhbGlkTWFwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcubW9kZWwuTWFwUmVxdWlyZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExCb3VuZE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMRmF1bHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMT3V0cHV0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsLldTRExPcGVyYXRpb25JbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkphdmFNZXRob2RJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkNoZWNrZWRFeGNlcHRpb25JbXBsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFdzYVR1YmVIZWxwZXIgeworCisgICAgcHVibGljIFdzYVR1YmVIZWxwZXIoV1NCaW5kaW5nIGJpbmRpbmcsIFNFSU1vZGVsIHNlaU1vZGVsLCBXU0RMUG9ydCB3c2RsUG9ydCkgeworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgICAgICB0aGlzLndzZGxQb3J0ID0gd3NkbFBvcnQ7CisgICAgICAgIHRoaXMuc2VpTW9kZWwgPSBzZWlNb2RlbDsKKyAgICAgICAgdGhpcy5zb2FwVmVyID0gYmluZGluZy5nZXRTT0FQVmVyc2lvbigpOworICAgICAgICB0aGlzLmFkZFZlciA9IGJpbmRpbmcuZ2V0QWRkcmVzc2luZ1ZlcnNpb24oKTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRBY3Rpb24oUGFja2V0IHJlcXVlc3RQYWNrZXQsIFBhY2tldCByZXNwb25zZVBhY2tldCkgeworICAgICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKKyAgICAgICAgaWYoc2VpTW9kZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgYWN0aW9uID0gZ2V0RmF1bHRBY3Rpb25Gcm9tU0VJTW9kZWwocmVxdWVzdFBhY2tldCxyZXNwb25zZVBhY2tldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhY3Rpb24gPSBhZGRWZXIuZ2V0RGVmYXVsdEZhdWx0QWN0aW9uKCk7CisgICAgICAgIGlmICh3c2RsUG9ydCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICAgICAgV1NETEJvdW5kT3BlcmF0aW9uIHdibyA9IHJlcXVlc3RQYWNrZXQuZ2V0TWVzc2FnZSgpLmdldE9wZXJhdGlvbih3c2RsUG9ydCk7CisgICAgICAgIHJldHVybiBnZXRGYXVsdEFjdGlvbih3Ym8scmVzcG9uc2VQYWNrZXQpOworICAgIH0KKworICAgIFN0cmluZyBnZXRGYXVsdEFjdGlvbkZyb21TRUlNb2RlbChQYWNrZXQgcmVxdWVzdFBhY2tldCwgUGFja2V0IHJlc3BvbnNlUGFja2V0KSB7CisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOworICAgICAgICBpZiAoc2VpTW9kZWwgPT0gbnVsbCB8fCB3c2RsUG9ydCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc20gPSByZXNwb25zZVBhY2tldC5nZXRNZXNzYWdlKCkuY29weSgpLnJlYWRBc1NPQVBNZXNzYWdlKCk7CisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworCisgICAgICAgICAgICBpZiAoc20uZ2V0U09BUEJvZHkoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247CisKKyAgICAgICAgICAgIGlmIChzbS5nZXRTT0FQQm9keSgpLmdldEZhdWx0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworCisgICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gc20uZ2V0U09BUEJvZHkoKS5nZXRGYXVsdCgpLmdldERldGFpbCgpOworICAgICAgICAgICAgaWYgKGRldGFpbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247CisKKyAgICAgICAgICAgIFN0cmluZyBucyA9IGRldGFpbC5nZXRGaXJzdENoaWxkKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRldGFpbC5nZXRGaXJzdENoaWxkKCkuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICBKYXZhTWV0aG9kSW1wbCBqbSA9IChKYXZhTWV0aG9kSW1wbCkgcmVxdWVzdFBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0TWV0aG9kKHNlaU1vZGVsKTsKKyAgICAgICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbkltcGwgY2UgOiBqbS5nZXRDaGVja2VkRXhjZXB0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNlLmdldERldGFpbFR5cGUoKS50YWdOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhuYW1lKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2UuZ2V0RGV0YWlsVHlwZSgpLnRhZ05hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5zKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2UuZ2V0RmF1bHRBY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIGdldEZhdWx0QWN0aW9uKEBOdWxsYWJsZSBXU0RMQm91bmRPcGVyYXRpb24gd2JvLCBQYWNrZXQgcmVzcG9uc2VQYWNrZXQpIHsKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGFkZFZlci5nZXREZWZhdWx0RmF1bHRBY3Rpb24oKTsKKyAgICAgICAgaWYgKHdibyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc20gPSByZXNwb25zZVBhY2tldC5nZXRNZXNzYWdlKCkuY29weSgpLnJlYWRBc1NPQVBNZXNzYWdlKCk7CisgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworCisgICAgICAgICAgICBpZiAoc20uZ2V0U09BUEJvZHkoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247CisKKyAgICAgICAgICAgIGlmIChzbS5nZXRTT0FQQm9keSgpLmdldEZhdWx0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworCisgICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gc20uZ2V0U09BUEJvZHkoKS5nZXRGYXVsdCgpLmdldERldGFpbCgpOworICAgICAgICAgICAgaWYgKGRldGFpbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247CisKKyAgICAgICAgICAgIFN0cmluZyBucyA9IGRldGFpbC5nZXRGaXJzdENoaWxkKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRldGFpbC5nZXRGaXJzdENoaWxkKCkuZ2V0TG9jYWxOYW1lKCk7CisKKyAgICAgICAgICAgIFdTRExPcGVyYXRpb24gbyA9IHdiby5nZXRPcGVyYXRpb24oKTsKKworICAgICAgICAgICAgV1NETEZhdWx0IGZhdWx0ID0gby5nZXRGYXVsdChuZXcgUU5hbWUobnMsIG5hbWUpKTsKKyAgICAgICAgICAgIGlmIChmYXVsdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247CisKKyAgICAgICAgICAgIFdTRExPcGVyYXRpb25JbXBsIGltcGwgPSAoV1NETE9wZXJhdGlvbkltcGwpbzsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBtYXAgPSBpbXBsLmdldEZhdWx0QWN0aW9uTWFwKCk7CisgICAgICAgICAgICBpZiAobWFwID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKKworICAgICAgICAgICAgYWN0aW9uID0gbWFwLmdldChmYXVsdC5nZXROYW1lKCkpOworCisgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbnB1dEFjdGlvbihQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOworCisgICAgICAgIGlmICh3c2RsUG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICBXU0RMQm91bmRPcGVyYXRpb24gd2JvID0gd3NkbFBvcnQuZ2V0QmluZGluZygpLmdldE9wZXJhdGlvbihwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldFBheWxvYWROYW1lc3BhY2VVUkkoKSwgcGFja2V0LmdldE1lc3NhZ2UoKS5nZXRQYXlsb2FkTG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgaWYgKHdibyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgV1NETE9wZXJhdGlvbiBvcCA9IHdiby5nZXRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBvcC5nZXRJbnB1dCgpLmdldEFjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgSW5wdXQgYWRkcmVzc2luZyBBY3Rpb24gZm9yIGEgbWVzc2FnZS4KKyAgICAgKiBJdCBnaXZlcyB0aGUgQWN0aW9uIHNldCBpbiB0aGUgd3NkbCBvcGVyYXRpb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nIHBheWxvYWQuCisgICAgICogSWYgaXQgaXMgbm90IGV4cGxpY2l0bHkgc2V0LCBpdCBnaXZlcyB0aGUgc29hcEFjdGlvbgorICAgICAqIEBwYXJhbSBwYWNrZXQKKyAgICAgKiBAcmV0dXJuIGlucHV0IEFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWZmZWN0aXZlSW5wdXRBY3Rpb24oUGFja2V0IHBhY2tldCkgeworICAgICAgICAvL25vbi1kZWZhdWx0IFNPQVBBY3Rpb24gYmVvbWVzIHdzYTphY3Rpb24KKyAgICAgICAgaWYocGFja2V0LnNvYXBBY3Rpb24gIT0gbnVsbCAmJiAhcGFja2V0LnNvYXBBY3Rpb24uZXF1YWxzKCIiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja2V0LnNvYXBBY3Rpb247CisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOworCisgICAgICAgIGlmICh3c2RsUG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICBXU0RMQm91bmRPcGVyYXRpb24gd2JvID0gd3NkbFBvcnQuZ2V0QmluZGluZygpLmdldE9wZXJhdGlvbihwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldFBheWxvYWROYW1lc3BhY2VVUkkoKSwgcGFja2V0LmdldE1lc3NhZ2UoKS5nZXRQYXlsb2FkTG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgaWYgKHdibyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgV1NETE9wZXJhdGlvbiBvcCA9IHdiby5nZXRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBvcC5nZXRJbnB1dCgpLmdldEFjdGlvbigpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYWN0aW9uID0gcGFja2V0LnNvYXBBY3Rpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhY3Rpb24gPSBwYWNrZXQuc29hcEFjdGlvbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRBY3Rpb25EZWZhdWx0KFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgaWYgKHdzZGxQb3J0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgV1NETEJvdW5kT3BlcmF0aW9uIHdibyA9IHdzZGxQb3J0LmdldEJpbmRpbmcoKS5nZXRPcGVyYXRpb24ocGFja2V0LmdldE1lc3NhZ2UoKS5nZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCksIHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0UGF5bG9hZExvY2FsUGFydCgpKTsKKyAgICAgICAgaWYgKHdibyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFdTRExPcGVyYXRpb24gb3AgPSB3Ym8uZ2V0T3BlcmF0aW9uKCk7CisgICAgICAgIHJldHVybiAoKFdTRExPcGVyYXRpb25JbXBsKSBvcCkuZ2V0SW5wdXQoKS5pc0RlZmF1bHRBY3Rpb24oKTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUEFjdGlvbihQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIFN0cmluZyBhY3Rpb24gPSAiIjsKKworICAgICAgICBpZiAocGFja2V0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworCisgICAgICAgIGlmIChwYWNrZXQuZ2V0TWVzc2FnZSgpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworCisgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbiBvcCA9IHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0T3BlcmF0aW9uKHdzZGxQb3J0KTsKKyAgICAgICAgaWYgKG9wID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworCisgICAgICAgIGFjdGlvbiA9IG9wLmdldFNPQVBBY3Rpb24oKTsKKworICAgICAgICByZXR1cm4gYWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0QWN0aW9uKFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IEFkZHJlc3NpbmdWZXJzaW9uLlVOU0VUX09VVFBVVF9BQ1RJT047CisgICAgICAgIGlmKHNlaU1vZGVsIT0gbnVsbCkgeworICAgICAgICAgICAgSmF2YU1ldGhvZEltcGwgam0gPSAoSmF2YU1ldGhvZEltcGwpIHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0TWV0aG9kKHNlaU1vZGVsKTsKKyAgICAgICAgICAgIGlmKGptLmdldE91dHB1dEFjdGlvbigpICE9IG51bGwgJiYgIWptLmdldE91dHB1dEFjdGlvbigpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gam0uZ2V0T3V0cHV0QWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdzZGxQb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbiB3Ym8gPSB3c2RsUG9ydC5nZXRCaW5kaW5nKCkuZ2V0T3BlcmF0aW9uKHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0UGF5bG9hZE5hbWVzcGFjZVVSSSgpLCBwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldFBheWxvYWRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0QWN0aW9uKHdibyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0T3V0cHV0QWN0aW9uKEBOdWxsYWJsZSBXU0RMQm91bmRPcGVyYXRpb24gd2JvKSB7CisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBBZGRyZXNzaW5nVmVyc2lvbi5VTlNFVF9PVVRQVVRfQUNUSU9OOworICAgICAgICBpZiAod2JvICE9IG51bGwpIHsKKyAgICAgICAgICAgIFdTRExPdXRwdXQgb3AgPSB3Ym8uZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCk7CisgICAgICAgICAgICBpZiAob3AgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBvcC5nZXRBY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWN0aW9uOworICAgIH0KKyAgICBwdWJsaWMgU09BUEZhdWx0IG5ld0ludmFsaWRNYXBGYXVsdChJbnZhbGlkTWFwRXhjZXB0aW9uIGUsIEFkZHJlc3NpbmdWZXJzaW9uIGF2KSB7CisgICAgICAgIFFOYW1lIG5hbWUgPSBlLmdldE1hcFFOYW1lKCk7CisgICAgICAgIFFOYW1lIHN1YnN1YmNvZGUgPSBlLmdldFN1YnN1YmNvZGUoKTsKKyAgICAgICAgUU5hbWUgc3ViY29kZSA9IGF2LmludmFsaWRNYXBUYWc7CisgICAgICAgIFN0cmluZyBmYXVsdHN0cmluZyA9IFN0cmluZy5mb3JtYXQoYXYuZ2V0SW52YWxpZE1hcFRleHQoKSwgbmFtZSwgc3Vic3ViY29kZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhY3Rvcnk7CisgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQ7CisgICAgICAgICAgICBpZiAoc29hcFZlciA9PSBTT0FQVmVyc2lvbi5TT0FQXzEyKSB7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IFNPQVBWZXJzaW9uLlNPQVBfMTIuc2FhalNvYXBGYWN0b3J5OworICAgICAgICAgICAgICAgIGZhdWx0ID0gZmFjdG9yeS5jcmVhdGVGYXVsdCgpOworICAgICAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0Q29kZShTT0FQQ29uc3RhbnRzLlNPQVBfU0VOREVSX0ZBVUxUKTsKKyAgICAgICAgICAgICAgICBmYXVsdC5hcHBlbmRGYXVsdFN1YmNvZGUoc3ViY29kZSk7CisgICAgICAgICAgICAgICAgZmF1bHQuYXBwZW5kRmF1bHRTdWJjb2RlKHN1YnN1YmNvZGUpOworICAgICAgICAgICAgICAgIGdldEludmFsaWRNYXBEZXRhaWwobmFtZSwgZmF1bHQuYWRkRGV0YWlsKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWN0b3J5ID0gU09BUFZlcnNpb24uU09BUF8xMS5zYWFqU29hcEZhY3Rvcnk7CisgICAgICAgICAgICAgICAgZmF1bHQgPSBmYWN0b3J5LmNyZWF0ZUZhdWx0KCk7CisgICAgICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKHN1YnN1YmNvZGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmYXVsdC5zZXRGYXVsdFN0cmluZyhmYXVsdHN0cmluZyk7CisKKyAgICAgICAgICAgIHJldHVybiBmYXVsdDsKKyAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNPQVBGYXVsdCBuZXdNYXBSZXF1aXJlZEZhdWx0KE1hcFJlcXVpcmVkRXhjZXB0aW9uIGUsIEFkZHJlc3NpbmdWZXJzaW9uIGF2KSB7CisgICAgICAgIFFOYW1lIHN1YmNvZGUgPSBhdi5tYXBSZXF1aXJlZFRhZzsKKyAgICAgICAgUU5hbWUgc3Vic3ViY29kZSA9IGF2Lm1hcFJlcXVpcmVkVGFnOworICAgICAgICBTdHJpbmcgZmF1bHRzdHJpbmcgPSBhdi5nZXRNYXBSZXF1aXJlZFRleHQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeTsKKyAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdDsKKyAgICAgICAgICAgIGlmIChzb2FwVmVyID09IFNPQVBWZXJzaW9uLlNPQVBfMTIpIHsKKyAgICAgICAgICAgICAgICBmYWN0b3J5ID0gU09BUFZlcnNpb24uU09BUF8xMi5zYWFqU29hcEZhY3Rvcnk7CisgICAgICAgICAgICAgICAgZmF1bHQgPSBmYWN0b3J5LmNyZWF0ZUZhdWx0KCk7CisgICAgICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKFNPQVBDb25zdGFudHMuU09BUF9TRU5ERVJfRkFVTFQpOworICAgICAgICAgICAgICAgIGZhdWx0LmFwcGVuZEZhdWx0U3ViY29kZShzdWJjb2RlKTsKKyAgICAgICAgICAgICAgICBmYXVsdC5hcHBlbmRGYXVsdFN1YmNvZGUoc3Vic3ViY29kZSk7CisgICAgICAgICAgICAgICAgZ2V0TWFwUmVxdWlyZWREZXRhaWwoZS5nZXRNYXBRTmFtZSgpLCBmYXVsdC5hZGREZXRhaWwoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBTT0FQVmVyc2lvbi5TT0FQXzExLnNhYWpTb2FwRmFjdG9yeTsKKyAgICAgICAgICAgICAgICBmYXVsdCA9IGZhY3RvcnkuY3JlYXRlRmF1bHQoKTsKKyAgICAgICAgICAgICAgICBmYXVsdC5zZXRGYXVsdENvZGUoc3Vic3ViY29kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0U3RyaW5nKGZhdWx0c3RyaW5nKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhdWx0OworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRQcm9ibGVtQWN0aW9uRGV0YWlsKFN0cmluZyBhY3Rpb24sIEVsZW1lbnQgZWxlbWVudCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0SW52YWxpZE1hcERldGFpbChRTmFtZSBuYW1lLCBFbGVtZW50IGVsZW1lbnQpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldE1hcFJlcXVpcmVkRGV0YWlsKFFOYW1lIG5hbWUsIEVsZW1lbnQgZWxlbWVudCk7CisKKyAgICBwcm90ZWN0ZWQgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcjsKKyAgICBwcm90ZWN0ZWQgTWFyc2hhbGxlciBtYXJzaGFsbGVyOworICAgIHByb3RlY3RlZCBTRUlNb2RlbCBzZWlNb2RlbDsKKyAgICBwcm90ZWN0ZWQgV1NETFBvcnQgd3NkbFBvcnQ7CisgICAgcHJvdGVjdGVkIFdTQmluZGluZyBiaW5kaW5nOworICAgIHByb3RlY3RlZCBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyOworICAgIHByb3RlY3RlZCBmaW5hbCBBZGRyZXNzaW5nVmVyc2lvbiBhZGRWZXI7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1dzYVR1YmVIZWxwZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL1dzYVR1YmVIZWxwZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyNDI5MgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvV3NhVHViZUhlbHBlckltcGwuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZzsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuU0VJTW9kZWw7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGNsYXNzIFdzYVR1YmVIZWxwZXJJbXBsIGV4dGVuZHMgV3NhVHViZUhlbHBlciB7CisgICAgc3RhdGljIGZpbmFsIEpBWEJDb250ZXh0IGpjOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoUHJvYmxlbUFjdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYmxlbUhlYWRlclFOYW1lLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBXc2FUdWJlSGVscGVySW1wbChXU0RMUG9ydCB3c2RsUG9ydCwgU0VJTW9kZWwgc2VpTW9kZWwsIFdTQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIHN1cGVyKGJpbmRpbmcsc2VpTW9kZWwsd3NkbFBvcnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdW5tYXJzaGFsbGVyID0gamMuY3JlYXRlVW5tYXJzaGFsbGVyKCk7CisgICAgICAgICAgICBtYXJzaGFsbGVyID0gamMuY3JlYXRlTWFyc2hhbGxlcigpOworICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBnZXRQcm9ibGVtQWN0aW9uRGV0YWlsKFN0cmluZyBhY3Rpb24sIEVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICBQcm9ibGVtQWN0aW9uIHBhID0gbmV3IFByb2JsZW1BY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChwYSwgZWxlbWVudCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBnZXRJbnZhbGlkTWFwRGV0YWlsKFFOYW1lIG5hbWUsIEVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICBQcm9ibGVtSGVhZGVyUU5hbWUgcGhxID0gbmV3IFByb2JsZW1IZWFkZXJRTmFtZShuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChwaHEsIGVsZW1lbnQpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgZ2V0TWFwUmVxdWlyZWREZXRhaWwoUU5hbWUgbmFtZSwgRWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgIGdldEludmFsaWRNYXBEZXRhaWwobmFtZSwgZWxlbWVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9tb2RlbC9BY3Rpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvbW9kZWwvQWN0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxODU0NAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvbW9kZWwvQWN0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcubW9kZWw7CisKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIFdlYlNlcnZpY2VFeGNlcHRpb24geworICAgIFN0cmluZyBhY3Rpb247CisKKyAgICBwcm90ZWN0ZWQgQWN0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIGFjdGlvbikgeworICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL21vZGVsL0ludmFsaWRNYXBFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvbW9kZWwvSW52YWxpZE1hcEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODRiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL21vZGVsL0ludmFsaWRNYXBFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5tb2RlbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK3B1YmxpYyBjbGFzcyBJbnZhbGlkTWFwRXhjZXB0aW9uIGV4dGVuZHMgV2ViU2VydmljZUV4Y2VwdGlvbiB7CisgICAgUU5hbWUgbmFtZTsKKyAgICBRTmFtZSBzdWJzdWJjb2RlOworCisgICAgcHVibGljIEludmFsaWRNYXBFeGNlcHRpb24oUU5hbWUgbmFtZSwgUU5hbWUgc3Vic3ViY29kZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnN1YnN1YmNvZGUgPSBzdWJzdWJjb2RlOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRNYXBRTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFN1YnN1YmNvZGUoKSB7CisgICAgICAgIHJldHVybiBzdWJzdWJjb2RlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvbW9kZWwvTWFwUmVxdWlyZWRFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvbW9kZWwvTWFwUmVxdWlyZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTE2MWVlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy9tb2RlbC9NYXBSZXF1aXJlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLm1vZGVsOworCitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGNsYXNzIE1hcFJlcXVpcmVkRXhjZXB0aW9uIGV4dGVuZHMgV2ViU2VydmljZUV4Y2VwdGlvbiB7CisgICAgUU5hbWUgbmFtZTsKKworICAgIHB1YmxpYyBNYXBSZXF1aXJlZEV4Y2VwdGlvbihRTmFtZSBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldE1hcFFOYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL3YyMDA0MDgvTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvdjIwMDQwOC9NZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGQ2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL3YyMDA0MDgvTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy52MjAwNDA4OworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBDb25zdGFudHMgZm9yIE1lbWJlciBTdWJtaXNzaW9uIFdTLUFkZHJlc3NpbmcgdmVyc2lvbgorICoKKyAqIEBhdXRob3IgQXJ1biBHdXB0YQorICovCitwdWJsaWMgaW50ZXJmYWNlIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfTkFNRVNQQUNFX05BTUUgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfTkFNRVNQQUNFX1dTRExfTkFNRSA9IFdTQV9OQU1FU1BBQ0VfTkFNRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfTkFNRVNQQUNFX1BPTElDWV9OQU1FID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9wb2xpY3kiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1NFUlZJQ0VOQU1FX05BTUUgPSAiU2VydmljZU5hbWUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9QT1JUVFlQRV9OQU1FID0gIlBvcnRUeXBlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfUE9SVE5BTUVfTkFNRSA9ICJQb3J0TmFtZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfQUREUkVTU19OQU1FID0gIkFkZHJlc3MiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NBX0FERFJFU1NfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCBXU0FfQUREUkVTU19OQU1FKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9BTk9OWU1PVVNfQUREUkVTUyA9IFdTQV9OQU1FU1BBQ0VfTkFNRSArICIvcm9sZS9hbm9ueW1vdXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9OT05FX0FERFJFU1MgPSAiIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9ERUZBVUxUX0ZBVUxUX0FDVElPTiA9IFdTQV9OQU1FU1BBQ0VfTkFNRSArICIvZmF1bHQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBJTlZBTElEX01BUF9RTkFNRSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFX05BTUUsICJJbnZhbGlkTWVzc2FnZUluZm9ybWF0aW9uSGVhZGVyIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBNQVBfUkVRVUlSRURfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiTWVzc2FnZUluZm9ybWF0aW9uSGVhZGVyUmVxdWlyZWQiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIERFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFX1FOQU1FID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0VfTkFNRSwgIkRlc3RpbmF0aW9uVW5yZWFjaGFibGUiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEFDVElPTl9OT1RfU1VQUE9SVEVEX1FOQU1FID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0VfTkFNRSwgIkFjdGlvbk5vdFN1cHBvcnRlZCIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRU5EUE9JTlRfVU5BVkFJTEFCTEVfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiRW5kcG9pbnRVbmF2YWlsYWJsZSIpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX05PVF9TVVBQT1JURURfVEVYVCA9ICJUaGUgXCIlc1wiIGNhbm5vdCBiZSBwcm9jZXNzZWQgYXQgdGhlIHJlY2VpdmVyLiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTVElOQVRJT05fVU5SRUFDSEFCTEVfVEVYVCA9ICJObyByb3V0ZSBjYW4gYmUgZGV0ZXJtaW5lZCB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gcm9sZSBkZWZpbmVkIGJ5IHRoZSBXUy1BZGRyZXNzaW5nIFRvLiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfVU5BVkFJTEFCTEVfVEVYVCA9ICJUaGUgZW5kcG9pbnQgaXMgdW5hYmxlIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UgYXQgdGhpcyB0aW1lLiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9NQVBfVEVYVCA9ICJBIG1lc3NhZ2UgaW5mb3JtYXRpb24gaGVhZGVyIGlzIG5vdCB2YWxpZCBhbmQgdGhlIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZC4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9SRVFVSVJFRF9URVhUID0gIkEgcmVxdWlyZWQgbWVzc2FnZSBpbmZvcm1hdGlvbiBoZWFkZXIsIFRvLCBNZXNzYWdlSUQsIG9yIEFjdGlvbiwgaXMgbm90IHByZXNlbnQuIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUFJPQkxFTV9BQ1RJT05fUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiUHJvYmxlbUFjdGlvbiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUFJPQkxFTV9IRUFERVJfUU5BTUVfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiUHJvYmxlbUhlYWRlclFOYW1lIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBGQVVMVF9ERVRBSUxfUU5BTUUgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRV9OQU1FLCAiRmF1bHREZXRhaWwiKTsKKworICAgIHB1YmxpYworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5PTllNT1VTX0VQUiA9ICI8RW5kcG9pbnRSZWZlcmVuY2UgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmdcIj5cbiIrCisgICAgICAgICIgICAgPEFkZHJlc3M+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC9BZGRyZXNzPlxuIisKKyAgICAgICAgIjwvRW5kcG9pbnRSZWZlcmVuY2U+IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgTUVYX01FVEFEQVRBID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leCIsICJNZXRhZGF0YSIsIm1leCIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgTUVYX01FVEFEQVRBX1NFQ1RJT04gPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvbWV4IiwgIk1ldGFkYXRhU2VjdGlvbiIsIm1leCIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWF9NRVRBREFUQV9ESUFMRUNUX0FUVFJJQlVURSA9ICJEaWFsZWN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhfTUVUQURBVEFfRElBTEVDVF9WQUxVRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL3YyMDA0MDgvUHJvYmxlbUFjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy92MjAwNDA4L1Byb2JsZW1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzllYmEwCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy92MjAwNDA4L1Byb2JsZW1BY3Rpb24uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy52MjAwNDA4OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy52MjAwNDA4Lk1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9OQU1FU1BBQ0VfTkFNRTsKKy8qKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK0BYbWxSb290RWxlbWVudChuYW1lPSJQcm9ibGVtQWN0aW9uIiwgbmFtZXNwYWNlPSBXU0FfTkFNRVNQQUNFX05BTUUpCitwdWJsaWMgY2xhc3MgUHJvYmxlbUFjdGlvbiB7CisKKyAgICBAWG1sRWxlbWVudChuYW1lPSJBY3Rpb24iLCBuYW1lc3BhY2U9IFdTQV9OQU1FU1BBQ0VfTkFNRSkKKyAgICBwcml2YXRlIFN0cmluZyBhY3Rpb247CisKKyAgICBAWG1sRWxlbWVudChuYW1lPSJTb2FwQWN0aW9uIiwgbmFtZXNwYWNlPVdTQV9OQU1FU1BBQ0VfTkFNRSkKKyAgICBwcml2YXRlIFN0cmluZyBzb2FwQWN0aW9uOworCisgICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUHJvYmxlbUFjdGlvbiAqLworICAgIHB1YmxpYyBQcm9ibGVtQWN0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBQcm9ibGVtQWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFByb2JsZW1BY3Rpb24oU3RyaW5nIGFjdGlvbiwgU3RyaW5nIHNvYXBBY3Rpb24pIHsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgICAgIHRoaXMuc29hcEFjdGlvbiA9IHNvYXBBY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBhY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTb2FwQWN0aW9uKCkgeworICAgICAgICByZXR1cm4gc29hcEFjdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL3YyMDA0MDgvUHJvYmxlbUhlYWRlclFOYW1lLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hZGRyZXNzaW5nL3YyMDA0MDgvUHJvYmxlbUhlYWRlclFOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmZGE0OQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvdjIwMDQwOC9Qcm9ibGVtSGVhZGVyUU5hbWUuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy52MjAwNDA4OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBzdGF0aWMgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy52MjAwNDA4Lk1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9OQU1FU1BBQ0VfTkFNRTsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworQFhtbFJvb3RFbGVtZW50KG5hbWU9IlByb2JsZW1IZWFkZXJRTmFtZSIsIG5hbWVzcGFjZT0gV1NBX05BTUVTUEFDRV9OQU1FKQorcHVibGljIGNsYXNzIFByb2JsZW1IZWFkZXJRTmFtZSB7CisgICAgQFhtbFZhbHVlCisgICAgcHJpdmF0ZSBRTmFtZSB2YWx1ZTsKKworICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFByb2JsZW1IZWFkZXJRTmFtZSAqLworICAgIHB1YmxpYyBQcm9ibGVtSGVhZGVyUU5hbWUoKSB7CisgICAgfQorCisgICAgcHVibGljIFByb2JsZW1IZWFkZXJRTmFtZShRTmFtZSBuYW1lKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvdjIwMDQwOC9Xc2FUdWJlSGVscGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYWRkcmVzc2luZy92MjAwNDA4L1dzYVR1YmVIZWxwZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmZjcyZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FkZHJlc3NpbmcvdjIwMDQwOC9Xc2FUdWJlSGVscGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLnYyMDA0MDg7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcuV3NhVHViZUhlbHBlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgQXJ1biBHdXB0YQorICovCitwdWJsaWMgY2xhc3MgV3NhVHViZUhlbHBlckltcGwgZXh0ZW5kcyBXc2FUdWJlSGVscGVyIHsKKyAgICBzdGF0aWMgZmluYWwgSkFYQkNvbnRleHQgamM7CisKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgamMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShQcm9ibGVtQWN0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ibGVtSGVhZGVyUU5hbWUuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFdzYVR1YmVIZWxwZXJJbXBsKFdTRExQb3J0IHdzZGxQb3J0LCBTRUlNb2RlbCBzZWlNb2RlbCwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgc3VwZXIoYmluZGluZyxzZWlNb2RlbCx3c2RsUG9ydCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1bm1hcnNoYWxsZXIgPSBqYy5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKKyAgICAgICAgICAgIG1hcnNoYWxsZXIgPSBqYy5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgICAgICAgICBtYXJzaGFsbGVyLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIGdldFByb2JsZW1BY3Rpb25EZXRhaWwoU3RyaW5nIGFjdGlvbiwgRWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgIFByb2JsZW1BY3Rpb24gcGEgPSBuZXcgUHJvYmxlbUFjdGlvbihhY3Rpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKHBhLCBlbGVtZW50KTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIGdldEludmFsaWRNYXBEZXRhaWwoUU5hbWUgbmFtZSwgRWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgIFByb2JsZW1IZWFkZXJRTmFtZSBwaHEgPSBuZXcgUHJvYmxlbUhlYWRlclFOYW1lKG5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKHBocSwgZWxlbWVudCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBnZXRNYXBSZXF1aXJlZERldGFpbChRTmFtZSBuYW1lLCBFbGVtZW50IGVsZW1lbnQpIHsKKyAgICAgICAgZ2V0SW52YWxpZE1hcERldGFpbChuYW1lLCBlbGVtZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvQmluZGluZ0lELmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvQmluZGluZ0lELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2NmYyNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9CaW5kaW5nSUQuamF2YQpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5TT0FQQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5XZWJTZXJ2aWNlRmVhdHVyZUxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuU09BUEJpbmRpbmdDb2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5YTUxIVFRQQmluZGluZ0NvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUZpbmRlcjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NRmVhdHVyZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBQYXJzZWQgYmluZGluZyBJRCBzdHJpbmcuCisgKgorICogPHA+CisgKiB7QGxpbmsgQmluZGluZ0lEfSBpcyBhbiBpbW11dGFibGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIGJpbmRpbmcgSUQsCisgKiBtdWNoIGxpa2UgaG93IHtAbGluayBVUkx9IGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gVVJMLgorICogTGlrZSB7QGxpbmsgVVJMfSwgdGhpcyBjbGFzcyBvZmZlcnMgYSBidW5jaCBvZiBtZXRob2RzIHRoYXQgbGV0IHlvdQorICogcXVlcnkgdmFyaW91cyB0cmFpdHMvcHJvcGVydGllcyBvZiBhIGJpbmRpbmcgSUQuCisgKgorICogPHA+CisgKiB7QGxpbmsgQmluZGluZ0lEfSBpcyBleHRlbnNpYmxlOyBvbmUgY2FuIHBsdWcgaW4gYSBwYXJzZXIgZnJvbQorICoge0BsaW5rIFN0cmluZ30gdG8ge0BsaW5rIEJpbmRpbmdJRH0gdG8gaW50ZXJwcmV0IGJpbmRpbmcgSURzIHRoYXQKKyAqIHRoZSBKQVgtV1MgUkkgZG9lcyBubyBhLXByaW9yaSBrbm93bGVkZ2Ugb2YuCisgKiBUZWNobm9sb2dpZXMgc3VjaCBhcyBUYW5nbyB1c2VzIHRoaXMgdG8gbWFrZSB0aGUgSkFYLVdTIFJJIHVuZGVyc3RhbmQKKyAqIGJpbmRpbmcgSURzIGRlZmluZWQgaW4gdGhlaXIgd29ybGQuCisgKgorICogU3VjaCB0ZWNobm9sb2dpZXMgYXJlIGZyZWUgdG8gZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIGV4cG9zZSBtb3JlIGNoYXJhY3RlcnN0aWNzLgorICoKKyAqIDxwPgorICogRXZlbiB0aG91Z2ggdGhpcyBjbGFzcyBkZWZpbmVzIGEgZmV3IHdlbGwga25vd24gY29uc3RhbnRzLCB7QGxpbmsgQmluZGluZ0lEfQorICogaW5zdGFuY2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHNpbmdsZXRvbiBzZW1hbnRpY3MuIFVzZSB7QGxpbmsgI2VxdWFscyhPYmplY3QpfQorICogZm9yIHRoZSBjb21wYXJpc29uLgorICoKKyAqIDxoMz57QGxpbmsgQmluZGluZ0lEfSBhbmQge0BsaW5rIFdTQmluZGluZ308L2gzPgorICogPHA+CisgKiB7QGxpbmsgV1NCaW5kaW5nfSBpcyBtdXRhYmxlIGFuZCByZXByZXNlbnRzIGEgcGFydGljdWxhciAidXNlIiBvZiBhIHtAbGluayBCaW5kaW5nSUR9LgorICogQXMgc3VjaCwgaXQgaGFzIHN0YXRlIGxpa2UgYSBsaXN0IG9mIHtAbGluayBIYW5kbGVyfXMsIHdoaWNoIGFyZSBpbmhlcmVudGx5IGxvY2FsCisgKiB0byBhIHBhcnRpY3VsYXIgdXNhZ2UuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gcHJveGllcywgeW91IG5lZWQgdHdvIGluc3RhbmNlcy4KKyAqCisgKiB7QGxpbmsgQmluZGluZ0lEfSwgT1RPSCwgaXMgaW1tdXRhYmxlIGFuZCB0aHVzIHRoZSBzaW5nbGUgaW5zdGFuY2UKKyAqIHRoYXQgcmVwcmVzZW50cyAiU09BUDEuMi9IVFRQIiBjYW4gYmUgc2hhcmVkIGFuZCByZXVzZWQgYnkgYWxsIHByb3hpZXMgaW4gdGhlIHNhbWUgVk0uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluZGluZ0lEIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFdTQmluZGluZ30gKHdoaWNoIGlzIGNvbmNlcHR1YWxseSBhbiAidXNlIgorICAgICAqIG9mIHtAbGluayBCaW5kaW5nSUR9KSBmcm9tIGEge0BsaW5rIEJpbmRpbmdJRH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBBbHdheXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEBOb3ROdWxsIFdTQmluZGluZyBjcmVhdGVCaW5kaW5nKCkgeworICAgICAgICByZXR1cm4gQmluZGluZ0ltcGwuY3JlYXRlKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBATm90TnVsbCBXU0JpbmRpbmcgY3JlYXRlQmluZGluZyhXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgeworICAgICAgICByZXR1cm4gQmluZGluZ0ltcGwuY3JlYXRlKHRoaXMsIGZlYXR1cmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgQE5vdE51bGwgV1NCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoV1NGZWF0dXJlTGlzdCBmZWF0dXJlcykgeworICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZyhmZWF0dXJlcy50b0FycmF5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFNPQVAgdmVyc2lvbiBvZiB0aGlzIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBUT0RPOiBjbGFyaWZ5IHdoYXQgdG8gZG8gd2l0aCBYTUwvSFRUUCBiaW5kaW5nCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBJZiB0aGUgYmluZGluZyBpcyB1c2luZyBTT0FQLCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogICAgICBhIHtAbGluayBTT0FQVmVyc2lvbn0gY29uc3RhbnQuCisgICAgICoKKyAgICAgKiAgICAgIElmIHRoZSBiaW5kaW5nIGlzIG5vdCBiYXNlZCBvbiBTT0FQLCB0aGlzIG1ldGhvZAorICAgICAqICAgICAgcmV0dXJucyBudWxsLiBTZWUge0BsaW5rIE1lc3NhZ2V9IGZvciBob3cgYSBub24tU09BUAorICAgICAqICAgICAgYmluZGluZyBzaGFsbCBiZSBoYW5kbGVkIGJ5IHtAbGluayBUdWJlfXMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNPQVBWZXJzaW9uIGdldFNPQVBWZXJzaW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb2RlY30gZm9yIHRoaXMgYmluZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nCisgICAgICogICAgICBPY2Fzc2lvbmFsbHkgc29tZSBhc3BlY3RzIG9mIGJpbmRpbmcgY2FuIGJlIG92ZXJyaWRkZW4gYnkKKyAgICAgKiAgICAgIHtAbGluayBXU0JpbmRpbmd9IGF0IHJ1bnRpbWUgYnkgdXNlcnMsIHNvIHNvbWUge0BsaW5rIENvZGVjfXMKKyAgICAgKiAgICAgIG5lZWQgdG8gaGF2ZSBhY2Nlc3MgdG8ge0BsaW5rIFdTQmluZGluZ30gdGhhdCBpdCdzIHdvcmtpbmcgZm9yLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBDb2RlYyBjcmVhdGVFbmNvZGVyKEBOb3ROdWxsIFdTQmluZGluZyBiaW5kaW5nKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJpbmRpbmcgSUQsIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVsZXZhbnQgc3BlY3MgZGVmaW5lIHRoZSBiaW5kaW5nIElEcyBhbmQgd2hhdCB0aGV5IG1lYW4uCisgICAgICogVGhlIElEIGlzIHVzZWQgaW4gbWFueSBwbGFjZXMgdG8gaWRlbnRpZnkgdGhlIGtpbmQgb2YgYmluZGluZworICAgICAqIChzdWNoIGFzIFNPQVAxLjEsIFNPQVAxLjIsIFJFU1QsIC4uLikKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIEFsd2F5cyBub24tbnVsbCBzYW1lIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmcoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybmEgYSBuZXcge0BsaW5rIFdlYlNlcnZpY2VGZWF0dXJlTGlzdH0gaW5zdGFuY2UKKyAgICAgKiB0aGF0IHJlcHJlc2VudHMgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGJ1aWx0IGludG8gdGhpcyBiaW5kaW5nIElELgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHtAbGluayBCaW5kaW5nSUR9IGZvcgorICAgICAqIDx0dD4ie0B2YWx1ZSBTT0FQQmluZGluZyNTT0FQMTFIVFRQX01UT01fQklORElOR30iPC90dD4KKyAgICAgKiB3b3VsZCBhbHdheXMgcmV0dXJuIGEgbGlzdCB0aGF0IGhhcyB7QGxpbmsgTVRPTUZlYXR1cmV9IGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIFdlYlNlcnZpY2VGZWF0dXJlTGlzdCBjcmVhdGVCdWlsdGluRmVhdHVyZUxpc3QoKSB7CisgICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZUZlYXR1cmVMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYmluZGluZyBjYW4gZ2VuZXJhdGUgV1NETC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBlLmcuOiBTT0FQIDEuMSBhbmQgIlhTT0FQIDEuMiIgaXMgc3VwcG9zZWQgdG8gcmV0dXJuIHRydWUKKyAgICAgKiBmcm9tIHRoaXMgbWV0aG9kLiBGb3IgU09BUDEuMiwgdGhlcmUgaXMgbm8gc3RhbmRhcmQgV1NETCwgc28gdGhlCisgICAgICogcnVudGltZSBpcyBub3QgZ2VuZXJhdGluZyBvbmUgYW5kIGl0IGV4cGVjdHMgdGhlIFdTREwgaXMgcGFja2FnZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5HZW5lcmF0ZVdTREwoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGFyYW1ldGVyIG9mIHRoaXMgYmluZGluZyBJRC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNvbWUgYmluZGluZyBJRCwgc3VjaCBhcyB0aG9zZSBmb3IgU09BUC9IVFRQLCB1c2VzIHRoZSBVUkwKKyAgICAgKiBxdWVyeSBzeW50YXggKGxpa2UgPHR0Pj9tdG9tPXRydWU8L3R0PikgdG8gY29udHJvbAorICAgICAqIHRoZSBvcHRpb25hbCBwYXJ0IG9mIHRoZSBiaW5kaW5nLiBUaGlzIG1ldGhvZCBvYnRhaW5zCisgICAgICogdGhlIHZhbHVlIGZvciBzdWNoIG9wdGlvbmFsIHBhcnRzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGltcGxlbWVudG9ycyBvZiB0aGUgZGVyaXZlZCBjbGFzc2VzLCBpZiB5b3VyIGJpbmRpbmcgSUQKKyAgICAgKiBkb2VzIG5vdCBkZWZpbmUgc3VjaCBvcHRpb25hbCBwYXJ0cyAoc3VjaCBhcyB0aGUgWE1ML0hUVFAgYmluZGluZyBJRCksCisgICAgICogdGhlbiB5b3Ugc2hvdWxkIHNpbXBseSByZXR1cm4gdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlCisgICAgICogKHdoaWNoIGlzIHdoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzLikKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lCisgICAgICogICAgICBUaGUgcGFyYW1ldGVyIG5hbWUsIHN1Y2ggYXMgIm10b20iIGluIHRoZSBhYm92ZSBleGFtcGxlLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgIElmIHRoaXMgYmluZGluZyBJRCBkb2Vzbid0IGhhdmUgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgZXhwbGljaXRseSwKKyAgICAgKiAgICAgIHRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLCBpZiBpdCdzIHByZXNlbnQgKHN1Y2ggYXMgInRydWUiCisgICAgICogICAgICBpbiB0aGUgYWJvdmUgZXhhbXBsZS4pIElmIG5vdCBwcmVzZW50LCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogICAgICB0aGUge0Bjb2RlIGRlZmF1bHRWYWx1ZX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtZXRlck5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgZXF1YWxpdHkgYmFzZWQgb24ge0BsaW5rICN0b1N0cmluZygpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZighKG9iaiBpbnN0YW5jZW9mIEJpbmRpbmdJRCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0b1N0cmluZygpLmVxdWFscyhvYmoudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBiaW5kaW5nIElEIHN0cmluZyBpbnRvIGEge0BsaW5rIEJpbmRpbmdJRH0gb2JqZWN0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgZmlyc3QgY2hlY2tzIGZvciBhIGZldyBrbm93biB2YWx1ZXMgYW5kIHRoZW4gZGVsZWdhdGUKKyAgICAgKiB0aGUgcGFyc2luZyB0byB7QGxpbmsgQmluZGluZ0lERmFjdG9yeX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiBwYXJzaW5nIHN1Y2NlZWRzIHRoaXMgbWV0aG9kIHJldHVybnMgYSB2YWx1ZS4gT3RoZXJ3aXNlCisgICAgICogdGhyb3dzIHtAbGluayBXZWJTZXJ2aWNlRXhjZXB0aW9ufS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgSWYgdGhlIGJpbmRpbmcgSUQgaXMgbm90IHVuZGVyc3Rvb2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBCaW5kaW5nSUQgcGFyc2UoU3RyaW5nIGxleGljYWwpIHsKKyAgICAgICAgaWYobGV4aWNhbC5lcXVhbHMoWE1MX0hUVFAudG9TdHJpbmcoKSkpCisgICAgICAgICAgICByZXR1cm4gWE1MX0hUVFA7CisgICAgICAgIGlmKGJlbG9uZ3NUbyhsZXhpY2FsLFNPQVAxMV9IVFRQLnRvU3RyaW5nKCkpKQorICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZShsZXhpY2FsLFNPQVAxMV9IVFRQKTsKKyAgICAgICAgaWYoYmVsb25nc1RvKGxleGljYWwsU09BUDEyX0hUVFAudG9TdHJpbmcoKSkpCisgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplKGxleGljYWwsU09BUDEyX0hUVFApOworICAgICAgICBpZihiZWxvbmdzVG8obGV4aWNhbCxTT0FQQmluZGluZ0ltcGwuWF9TT0FQMTJIVFRQX0JJTkRJTkcpKQorICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZShsZXhpY2FsLFhfU09BUDEyX0hUVFApOworCisgICAgICAgIC8vIE9LLCBpdCdzIG5vbmUgb2YgdGhlIHZhbHVlcyBKQVgtV1MgdW5kZXJzdGFuZHMuCisgICAgICAgIGZvciggQmluZGluZ0lERmFjdG9yeSBmIDogU2VydmljZUZpbmRlci5maW5kKEJpbmRpbmdJREZhY3RvcnkuY2xhc3MpICkgeworICAgICAgICAgICAgQmluZGluZ0lEIHIgPSBmLnBhcnNlKGxleGljYWwpOworICAgICAgICAgICAgaWYociE9bnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vYm9keSB1bmRlcnN0b29kIHRoaXMgdmFsdWUKKyAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIldyb25nIGJpbmRpbmcgSUQ6ICIrbGV4aWNhbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIGxleGljYWwsIFN0cmluZyBpZCkgeworICAgICAgICByZXR1cm4gbGV4aWNhbC5lcXVhbHMoaWQpIHx8IGxleGljYWwuc3RhcnRzV2l0aChpZCsnPycpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBwYXJhbWV0ZXIgcG9ydGlvbiBhbmQgcmV0dXJucyBhcHByb3ByaWF0ZWx5IHBvcHVsYXRlZCB7QGxpbmsgU09BUEhUVFBJbXBsfQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNPQVBIVFRQSW1wbCBjdXN0b21pemUoU3RyaW5nIGxleGljYWwsIFNPQVBIVFRQSW1wbCBiYXNlKSB7CisgICAgICAgIGlmKGxleGljYWwuZXF1YWxzKGJhc2UudG9TdHJpbmcoKSkpCisgICAgICAgICAgICByZXR1cm4gYmFzZTsKKworICAgICAgICAvLyBvdGhlcndpc2Ugd2UgbXVzdCBoYXZlIHF1ZXJ5IHBhcmFtZXRlcgorICAgICAgICAvLyB3ZSBhc3N1bWUgdGhlIHNwZWMgd29uJ3QgZGVmaW5lIGFueSB0cmlja3kgcGFyYW1ldGVycyB0aGF0IHJlcXVpcmUKKyAgICAgICAgLy8gY29tcGxpY2F0ZWQgaGFuZGxpbmcgKHN1Y2ggYXMgJUhIIG9yIG5vbi1BU0NJSSBjaGFyKSwgc28gdGhpcyBwYXJzZXIKKyAgICAgICAgLy8gaXMgcXVpdGUgc2ltcGxlLW1pbmRlZC4KKyAgICAgICAgU09BUEhUVFBJbXBsIHIgPSBuZXcgU09BUEhUVFBJbXBsKGJhc2UuZ2V0U09BUFZlcnNpb24oKSwgbGV4aWNhbCwgYmFzZS5jYW5HZW5lcmF0ZVdTREwoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBXaXRoIFhfU09BUDEyX0hUVFAsIGJhc2UgIT0gbGV4aWNhbCBhbmQgbGV4aWNhbCBkb2VzIG4ndCBoYXZlIGFueSBxdWVyeSBzdHJpbmcKKyAgICAgICAgICAgIGlmKGxleGljYWwuaW5kZXhPZignPycpID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgcXVlcnkgPSBVUkxEZWNvZGVyLmRlY29kZShsZXhpY2FsLnN1YnN0cmluZyhsZXhpY2FsLmluZGV4T2YoJz8nKSsxKSwiVVRGLTgiKTsKKyAgICAgICAgICAgIGZvciggU3RyaW5nIHRva2VuIDogcXVlcnkuc3BsaXQoIiYiKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdG9rZW4uaW5kZXhPZignPScpOworICAgICAgICAgICAgICAgIGlmKGlkeDwwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTWFsZm9ybWVkIGJpbmRpbmcgSUQgKG5vICc9JyBpbiAiK3Rva2VuKyIpIik7CisgICAgICAgICAgICAgICAgci5wYXJhbWV0ZXJzLnB1dCh0b2tlbi5zdWJzdHJpbmcoMCxpZHgpLHRva2VuLnN1YnN0cmluZyhpZHgrMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsgICAgLy8gVVRGLTggaXMgc3VwcG9ydGVkIGV2ZXJ5d2hlcmUKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmlndXJlcyBvdXQgdGhlIGJpbmRpbmcgZnJvbSB7QGxpbmsgQmluZGluZ1R5cGV9IGFubm90YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBkZWZhdWx0IHRvIHtAbGluayBCaW5kaW5nSUQjU09BUDExX0hUVFB9LCBpZiBubyBzdWNoIGFubm90YXRpb24gaXMgcHJlc2VudC4KKyAgICAgKiBAc2VlICNwYXJzZShTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBCaW5kaW5nSUQgcGFyc2UoQ2xhc3M8Pz4gaW1wbENsYXNzKSB7CisgICAgICAgIEJpbmRpbmdUeXBlIGJpbmRpbmdUeXBlID0gaW1wbENsYXNzLmdldEFubm90YXRpb24oQmluZGluZ1R5cGUuY2xhc3MpOworICAgICAgICBpZiAoYmluZGluZ1R5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9IGJpbmRpbmdUeXBlLnZhbHVlKCk7CisgICAgICAgICAgICBpZiAoYmluZGluZ0lkLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCaW5kaW5nSUQucGFyc2UoYmluZGluZ0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU09BUDExX0hUVFA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdGhhdCByZXByZXNlbnRzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIFNPQVAxLjIvSFRUUCB3aGljaCBpcworICAgICAqIHVzZWQgdG8gZ2VuZXJhdGUgbm9uLXN0YW5kYXJkIFdTRExzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTT0FQSFRUUEltcGwgWF9TT0FQMTJfSFRUUCA9IG5ldyBTT0FQSFRUUEltcGwoCisgICAgICAgIFNPQVBWZXJzaW9uLlNPQVBfMTIsIFNPQVBCaW5kaW5nSW1wbC5YX1NPQVAxMkhUVFBfQklORElORywgdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB0aGF0IHJlcHJlc2VudHMgU09BUDEuMi9IVFRQLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU09BUEhUVFBJbXBsIFNPQVAxMl9IVFRQID0gbmV3IFNPQVBIVFRQSW1wbCgKKyAgICAgICAgU09BUFZlcnNpb24uU09BUF8xMiwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCBmYWxzZSk7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdGhhdCByZXByZXNlbnRzIFNPQVAxLjEvSFRUUC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNPQVBIVFRQSW1wbCBTT0FQMTFfSFRUUCA9IG5ldyBTT0FQSFRUUEltcGwoCisgICAgICAgIFNPQVBWZXJzaW9uLlNPQVBfMTEsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB0aGF0IHJlcHJlc2VudHMgU09BUDEuMi9IVFRQLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU09BUEhUVFBJbXBsIFNPQVAxMl9IVFRQX01UT00gPSBuZXcgU09BUEhUVFBJbXBsKAorICAgICAgICBTT0FQVmVyc2lvbi5TT0FQXzEyLCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORywgZmFsc2UsIHRydWUpOworICAgIC8qKgorICAgICAqIENvbnN0YW50IHRoYXQgcmVwcmVzZW50cyBTT0FQMS4xL0hUVFAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTT0FQSFRUUEltcGwgU09BUDExX0hUVFBfTVRPTSA9IG5ldyBTT0FQSFRUUEltcGwoCisgICAgICAgIFNPQVBWZXJzaW9uLlNPQVBfMTEsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HLCB0cnVlLCB0cnVlKTsKKworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdGhhdCByZXByZXNlbnRzIFJFU1QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaW5kaW5nSUQgWE1MX0hUVFAgPSBuZXcgSW1wbChTT0FQVmVyc2lvbi5TT0FQXzExLCBIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcsZmFsc2UpIHsKKyAgICAgICAgcHVibGljIENvZGVjIGNyZWF0ZUVuY29kZXIoV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWE1MSFRUUEJpbmRpbmdDb2RlYygpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEltcGwgZXh0ZW5kcyBCaW5kaW5nSUQgeworICAgICAgICBmaW5hbCBTT0FQVmVyc2lvbiB2ZXJzaW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsZXhpY2FsOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2FuR2VuZXJhdGVXU0RMOworCisgICAgICAgIHB1YmxpYyBJbXBsKFNPQVBWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBsZXhpY2FsLCBib29sZWFuIGNhbkdlbmVyYXRlV1NETCkgeworICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgICAgIHRoaXMubGV4aWNhbCA9IGxleGljYWw7CisgICAgICAgICAgICB0aGlzLmNhbkdlbmVyYXRlV1NETCA9IGNhbkdlbmVyYXRlV1NETDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTT0FQVmVyc2lvbiBnZXRTT0FQVmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBsZXhpY2FsOworICAgICAgICB9CisKKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuR2VuZXJhdGVXU0RMKCkgeworICAgICAgICAgICAgcmV0dXJuIGNhbkdlbmVyYXRlV1NETDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZvciBTT0FQL0hUVFAuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU09BUEhUVFBJbXBsIGV4dGVuZHMgSW1wbCBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgICAgIC8qZmluYWwqLyBNYXA8U3RyaW5nLFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNVE9NX1BBUkFNID0gIm10b20iOworICAgICAgICBCb29sZWFuIG10b21TZXR0aW5nID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgU09BUEhUVFBJbXBsKFNPQVBWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBsZXhpY2FsLCBib29sZWFuIGNhbkdlbmVyYXRlV1NETCkgeworICAgICAgICAgICAgc3VwZXIodmVyc2lvbiwgbGV4aWNhbCwgY2FuR2VuZXJhdGVXU0RMKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTT0FQSFRUUEltcGwoU09BUFZlcnNpb24gdmVyc2lvbiwgU3RyaW5nIGxleGljYWwsIGJvb2xlYW4gY2FuR2VuZXJhdGVXU0RMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtdG9tRW5hYmxlZCkgeworICAgICAgICAgICAgdGhpcyh2ZXJzaW9uLCBsZXhpY2FsLCBjYW5HZW5lcmF0ZVdTREwpOworICAgICAgICAgICAgU3RyaW5nIG10b21TdHIgPSBtdG9tRW5hYmxlZCA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChNVE9NX1BBUkFNLCBtdG9tU3RyKTsKKyAgICAgICAgICAgIG10b21TZXR0aW5nID0gbXRvbUVuYWJsZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQE5vdE51bGwgQ29kZWMgY3JlYXRlRW5jb2RlcihXU0JpbmRpbmcgYmluZGluZykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQQmluZGluZ0NvZGVjKGJpbmRpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBCb29sZWFuIGlzTVRPTUVuYWJsZWQoKSB7CisgICAgICAgICAgICBTdHJpbmcgbXRvbSA9IHBhcmFtZXRlcnMuZ2V0KE1UT01fUEFSQU0pOworICAgICAgICAgICAgcmV0dXJuIG10b209PW51bGw/bnVsbDpCb29sZWFuLnZhbHVlT2YobXRvbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV2ViU2VydmljZUZlYXR1cmVMaXN0IGNyZWF0ZUJ1aWx0aW5GZWF0dXJlTGlzdCgpIHsKKyAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlTGlzdCByPXN1cGVyLmNyZWF0ZUJ1aWx0aW5GZWF0dXJlTGlzdCgpOworICAgICAgICAgICAgQm9vbGVhbiBtdG9tID0gaXNNVE9NRW5hYmxlZCgpOworICAgICAgICAgICAgaWYobXRvbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHIuYWRkKG5ldyBNVE9NRmVhdHVyZShtdG9tKSk7CisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5nZXQocGFyYW1ldGVyTmFtZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQocGFyYW1ldGVyTmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvQmluZGluZ0lERmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL0JpbmRpbmdJREZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjJjMDJlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL0JpbmRpbmdJREZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworCisvKioKKyAqIEV4dGVuc2lvbiBwb2ludCB0byBwbHVnIGluIGFkZGl0aW9uYWwge0BsaW5rIEJpbmRpbmdJRH0gcGFyc2luZyBsb2dpYy4KKyAqCisgKiA8cD4KKyAqIFdoZW4gdGhlIEpBWC1XUyBSSSBpcyBhc2tlZCB0byBwYXJzZSBhIGJpbmRpbmcgSUQgc3RyaW5nIGludG8gYSB7QGxpbmsgQmluZGluZ0lEfQorICogb2JqZWN0LCBpdCB1c2VzIHNlcnZpY2UgaWRpb20gdG8gbG9vayBmb3IgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzCisgKiBpbiB0aGUgPHR0Pk1FVEEtSU5GL3NlcnZpY2VzLy4uLjwvdHQ+LgorICoKKyAqIEBzaW5jZSBKQVgtV1MgMi4wLm5leHQKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzZWUgQmluZGluZ0lEI3BhcnNlKFN0cmluZykKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmRpbmdJREZhY3RvcnkgeworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIGJpbmRpbmcgSUQgc3RyaW5nIGludG8ge0BsaW5rIEJpbmRpbmdJRH0gaWYgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhIG5vbi1udWxsIHJldHVybiB2YWx1ZSB3b3VsZCBjYXVzZSB0aGUgSkFYLVdTIFJJIHRvIGNvbnNpZGVyCisgICAgICogICAgICB0aGUgcGFyc2luZyB0byBiZSBzdWNjZXNzZnVsLiBObyBmdXJodGVyIHtAbGluayBCaW5kaW5nSURGYWN0b3J5fQorICAgICAqICAgICAgd2lsbCBiZSBjb25zdWx0ZWQuCisgICAgICoKKyAgICAgKiAgICAgIDxwPgorICAgICAqICAgICAgUmV0cnVuaW5nIGEgbnVsbCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZhY3RvcnkgZG9lc24ndCB1bmRlcnN0YW5kCisgICAgICogICAgICB0aGlzIHN0cmluZywgaW4gd2hpY2ggY2FzZSB0aGUgSkFYLVdTIFJJIHdpbGwga2VlcCBhc2tpbmcgbmV4dAorICAgICAqICAgICAge0BsaW5rIEJpbmRpbmdJREZhY3Rvcnl9LgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGUgaW1wbGVtZW50YXRpb24gdW5kZXJzdG9vZCB0aGUgbGV4aWNhbCB2YWx1ZSBidXQgaXQgaXMgbm90IGNvcnJlY3QsCisgICAgICogICAgICB0aGlzIGV4Y2VwdGlvbiBjYW4gYmUgdGhyb3duIHRvIGFib3J0IHRoZSBwYXJzaW5nIHdpdGggZXJyb3IuCisgICAgICogICAgICBObyBmdXJ0aGVyIHtAbGluayBCaW5kaW5nSURGYWN0b3J5fSB3aWxsIGJlIGNvbnN1bHRlZCwgYW5kCisgICAgICogICAgICB7QGxpbmsgQmluZGluZ0lEI3BhcnNlKFN0cmluZyl9IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE51bGxhYmxlIEJpbmRpbmdJRCBwYXJzZShATm90TnVsbCBTdHJpbmcgbGV4aWNhbCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvRGlzdHJpYnV0ZWRQcm9wZXJ0eVNldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL0Rpc3RyaWJ1dGVkUHJvcGVydHlTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWEzOTRiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL0Rpc3RyaWJ1dGVkUHJvcGVydHlTZXQuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLkZpbmFsQXJyYXlMaXN0OworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuUmVzcG9uc2VDb250ZXh0OworCitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiB7QGxpbmsgUHJvcGVydHlTZXR9IHRoYXQgY29tYmluZXMgcHJvcGVydGllcyBleHBvc2VkIGZyb20gbXVsdGlwbGUKKyAqIHtAbGluayBQcm9wZXJ0eVNldH1zIGludG8gb25lLgorICoKKyAqIDxwPgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3Mgb25lIHtAbGluayBQcm9wZXJ0eVNldH0gdG8gYXNzZW1ibGUKKyAqIGFsbCBwcm9wZXJ0aWVzIGV4cG9zZWQgZnJvbSBvdGhlciAic2F0ZWxsaXRlIiB7QGxpbmsgUHJvcGVydHlTZXR9cy4KKyAqIChBIHNhdGVsbGl0ZSBtYXkgaXRzZWxmIGJlIGEge0BsaW5rIERpc3RyaWJ1dGVkUHJvcGVydHlTZXR9LCBzbworICogaW4gZ2VuZXJhbCB0aGlzIGNhbiBmb3JtIGEgdHJlZS4pCisgKgorICogPHA+CisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgSkFYLVdTIGJlY2F1c2UgdGhlIHByb3BlcnRpZXMgd2UgZXhwb3NlIHRvIHRoZSBhcHBsaWNhdGlvbgorICogYXJlIGNvbnRyaWJ1dGVkIGJ5IGRpZmZlcmVudCBwaWVjZXMsIGFuZCB0aGVyZWZvcmUgd2UnZCBsaWtlIGVhY2ggb2YgdGhlbQorICogdG8gaGF2ZSBhIHNlcGFyYXRlIHtAbGluayBQcm9wZXJ0eVNldH0gaW1wbGVtZW50YXRpb24gdGhhdCBiYWNrcyB1cAorICogdGhlIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCB0aGlzIGFsbG93cyBGYXN0SW5mb3NldCB0byBleHBvc2UgaXRzCisgKiBzZXQgb2YgcHJvcGVydGllcyB0byB7QGxpbmsgUmVxdWVzdENvbnRleHR9IGJ5IHVzaW5nIGEgc3Ryb25nbHktdHlwZWQgZmllbGRzLgorICoKKyAqIDxwPgorICogVGhpcyBpcyBhbHNvIHVzZWZ1bCBmb3IgYSBjbGllbnQtc2lkZSB0cmFuc3BvcnQgdG8gZXhwb3NlIGEgYnVuY2ggb2YgcHJvcGVydGllcworICogaW50byB7QGxpbmsgUmVzcG9uc2VDb250ZXh0fS4gSXQgc2ltcGx5IG5lZWRzIHRvIGNyZWF0ZSBhIHtAbGluayBQcm9wZXJ0eVNldH0KKyAqIG9iamVjdCB3aXRoIG1ldGhvZHMgZm9yIGVhY2ggcHJvcGVydHkgaXQgd2FudHMgdG8gZXhwb3NlLCBhbmQgdGhlbiBhZGQgdGhhdAorICoge0BsaW5rIFByb3BlcnR5U2V0fSB0byB7QGxpbmsgUGFja2V0fS4gVGhpcyBhbGxvd3MgcHJvcGVydHkgdmFsdWVzIHRvIGJlCisgKiBsYXppbHkgY29tcHV0ZWQgKHdoZW4gYWN0dWFsbHkgYXNrZWQgYnkgdXNlcnMpLCB0aHVzIGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2UKKyAqIG9mIHRoZSB0eXBpY2FsIGNhc2Ugd2hlcmUgcHJvcGVydHkgdmFsdWVzIGFyZSBub3QgYXNrZWQuCisgKgorICogPHA+CisgKiBBIHNpbWlsYXIgYmVuZWZpdCBhcHBsaWVzIG9uIHRoZSBzZXJ2ZXItc2lkZSwgZm9yIGEgdHJhbnNwb3J0IHRvIGV4cG9zZQorICogYSBidW5jaCBvZiBwcm9wZXJ0aWVzIHRvIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0uCisgKgorICogPHA+CisgKiBUbyBhY2hpZXZlIHRoZXNlIGJlbmVmaXRzLCBhY2Nlc3MgdG8ge0BsaW5rIERpc3RyaWJ1dGVkUHJvcGVydHlTZXR9IGlzIHNsb3dlcgorICogY29tcGFyZWQgdG8ge0BsaW5rIFByb3BlcnR5U2V0fSAoc3VjaCBhcyBnZXQvc2V0KSwgd2hpbGUgYWRkaW5nIGEgc2F0ZWxsaXRlCisgKiBvYmplY3QgaXMgcmVsYXRpdmVseSBmYXN0LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERpc3RyaWJ1dGVkUHJvcGVydHlTZXQgZXh0ZW5kcyBQcm9wZXJ0eVNldCB7CisgICAgLyoqCisgICAgICogQWxsIHtAbGluayBQcm9wZXJ0eVNldH1zIHRoYXQgYXJlIGJ1bmRsZWQgaW50byB0aGlzIHtAbGluayBQcm9wZXJ0eVNldH0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBGaW5hbEFycmF5TGlzdDxQcm9wZXJ0eVNldD4gc2F0ZWxsaXRlcyA9IG5ldyBGaW5hbEFycmF5TGlzdDxQcm9wZXJ0eVNldD4oKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZFNhdGVsbGl0ZShATm90TnVsbCBQcm9wZXJ0eVNldCBzYXRlbGxpdGUpIHsKKyAgICAgICAgc2F0ZWxsaXRlcy5hZGQoc2F0ZWxsaXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTYXRlbGxpdGUoQE5vdE51bGwgUHJvcGVydHlTZXQgc2F0ZWxsaXRlKSB7CisgICAgICAgIHNhdGVsbGl0ZXMucmVtb3ZlKHNhdGVsbGl0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weVNhdGVsbGl0ZUludG8oQE5vdE51bGwgRGlzdHJpYnV0ZWRQcm9wZXJ0eVNldCByKSB7CisgICAgICAgIHIuc2F0ZWxsaXRlcy5hZGRBbGwodGhpcy5zYXRlbGxpdGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIC8vIGNoZWNrIHNhdGVsbGl0ZXMKKyAgICAgICAgZm9yIChQcm9wZXJ0eVNldCBjaGlsZCA6IHNhdGVsbGl0ZXMpIHsKKyAgICAgICAgICAgIGlmKGNoaWxkLnN1cHBvcnRzKGtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmdldChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IG11c3QgYmUgdGhlIG1hc3RlcgorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIC8vIGNoZWNrIHNhdGVsbGl0ZXMKKyAgICAgICAgZm9yIChQcm9wZXJ0eVNldCBjaGlsZCA6IHNhdGVsbGl0ZXMpIHsKKyAgICAgICAgICAgIGlmKGNoaWxkLnN1cHBvcnRzKGtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnB1dChrZXksdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IG11c3QgYmUgdGhlIG1hc3RlcgorICAgICAgICByZXR1cm4gc3VwZXIucHV0KGtleSx2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoT2JqZWN0IGtleSkgeworICAgICAgICAvLyBjaGVjayBzYXRlbGxpdGVzCisgICAgICAgIGZvciAoUHJvcGVydHlTZXQgY2hpbGQgOiBzYXRlbGxpdGVzKSB7CisgICAgICAgICAgICBpZihjaGlsZC5zdXBwb3J0cyhrZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1cGVyLnN1cHBvcnRzKGtleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgeworICAgICAgICAvLyBjaGVjayBzYXRlbGxpdGVzCisgICAgICAgIGZvciAoUHJvcGVydHlTZXQgY2hpbGQgOiBzYXRlbGxpdGVzKSB7CisgICAgICAgICAgICBpZihjaGlsZC5zdXBwb3J0cyhrZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5yZW1vdmUoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUoa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICAvKnBhY2thZ2UqLyB2b2lkIGNyZWF0ZUVudHJ5U2V0KFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGNvcmUpIHsKKyAgICAgICAgc3VwZXIuY3JlYXRlRW50cnlTZXQoY29yZSk7CisgICAgICAgIGZvciAoUHJvcGVydHlTZXQgY2hpbGQgOiBzYXRlbGxpdGVzKSB7CisgICAgICAgICAgICBjaGlsZC5jcmVhdGVFbnRyeVNldChjb3JlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9FbmRwb2ludEFkZHJlc3MuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9FbmRwb2ludEFkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJkZjQwCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL0VuZHBvaW50QWRkcmVzcy5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpOworCisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlByb3h5OworaW1wb3J0IGphdmEubmV0LlByb3h5U2VsZWN0b3I7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBlbmRwb2ludCBhZGRyZXNzIFVSSS4KKyAqCisgKiA8cD4KKyAqIENvbmNlcHR1YWxseSB0aGlzIGNhbiBiZSByZWFsbHkgdGhvdWdodCBvZiBhcyBhbiB7QGxpbmsgVVJJfSwKKyAqIGJ1dCBpdCBoaWRlcyBzb21lIG9mIHRoZSBkZXRhaWxzIHRoYXQgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UuCisgKgorICogPHA+CisgKiBCZWluZyBhbiB7QGxpbmsgVVJJfSBhbGxvd3MgdGhpcyBjbGFzcyB0byByZXByZXNlbnQgY3VzdG9tIG1hZGUtdXAgVVJJcworICogKGxpa2UgImptcyIgZm9yIGV4YW1wbGUuKSBXaGVuZXZlciBwb3NzaWJsZSwgdGhpcyBvYmplY3QKKyAqIGFsc28gY3JlYXRlcyBhbiB7QGxpbmsgVVJMfSAodGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gdGhlIGFkZHJlc3MKKyAqIGhhcyBhIHJlZ2lzdGVyZWQge0BsaW5rIFVSTFN0cmVhbUhhbmRsZXJ9KSwgc28gdGhhdCBpZiB0aGUgY2xpZW50cworICogb2YgdGhpcyBjb2RlIHdhbnRzIHRvIHVzZSBpdCwgaXQgY2FuIGRvIHNvLgorICoKKyAqCisgKiA8aDM+SG93IGl0IGltcHJvdmVzIHRoZSBwZXJmb3JtYW5jZTwvaDM+CisgKiA8b2w+CisgKiAgPGxpPgorICogIEVuZHBvaW50IGFkZHJlc3MgaXMgb2Z0ZW4gZXZlbnR1YWxseSB0dXJuZWQgaW50byBhbiB7QGxpbmsgVVJMQ29ubmVjdGlvbn0sCisgKiAgYW5kIGdpdmVuIHRoYXQgZ2VuZXJhbGx5IHRoaXMgdmFsdWUgaXMgcmVhZCBtb3JlIG9mdGVuIHRoYW4gYmVpbmcgc2V0LAorICogIGl0IG1ha2VzIHNlbnNlIHRvIGVhZ2VybHkgdHVybiBpdCBpbnRvIGFuIHtAbGluayBVUkx9LAorICogIHRoZXJlYnkgYXZvaWRpbmcgYSByZXBlYXRlZCBjb252ZXJzaW9uLgorICoKKyAqICA8bGk+CisgKiAgSkRLIHNwZW5kcyBhIGxvdCBvZiB0aW1lIGNob29zaW5nIGEgbGlzdCBvZiB7QGxpbmsgUHJveHl9CisgKiAgdG8gY29ubmVjdCB0byBhbiB7QGxpbmsgVVJMfS4gU2luY2UgdGhlIGRlZmF1bHQgcHJveHkgc2VsZWN0b3IKKyAqICBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHByb3h5IGZvciB0aGUgc2FtZSBVUkwsCisgKiAgd2UgY2FuIGRldGVybWluZSB0aGUgcHJveHkgYnkgb3Vyc2VsdmVzIHRvIGxldCBKREsgc2tpcCBpdHMKKyAqICBwcm94eS1kaXNjb3Zlcnkgc3RlcC4KKyAqCisgKiAgKFRoYXQgc2FpZCwgdXNlci1kZWZpbmVkIHByb3h5IHNlbGVjdG9yIGNhbiBkbyBhIGxvdCBvZiBpbnRlcmVzdGluZyB0aGluZ3MKKyAqICAtLS0gbGlrZSBkb2luZyBhIHJvdW5kLXJvYmluLCBvciBwaWNrIG9uZSBmcm9tIGEgcHJveHkgZmFybSByYW5kb21seSwKKyAqICBhbmQgc28gaXQncyBkYW5nZXJvdXMgdG8gc3RpY2sgdG8gb25lIHByb3h5LiBGb3IgdGhpcyBjYXNlLAorICogIHdlIHN0aWxsIGxldCBKREsgZGVjaWRlIHRoZSBwcm94eS4gVGhpcyBzaG91bGRuJ3QgYmUgdGhhdCBtdWNoIG9mIGFuCisgKiAgZGlzYXBwb2ludG1lbnQsIHNpbmNlIG1vc3QgcGVvcGxlIG9ubHkgbWVzcyB3aXRoIHN5c3RlbSBwcm9wZXJ0aWVzLAorICogIGFuZCBuZXZlciB3aXRoIHtAbGluayBQcm94eVNlbGVjdG9yfS4gQWxzbywgYXZvaWRpbmcgb3B0aW1pemF0aW9uCisgKiAgd2l0aCBub24tc3RhbmRhcmQgcHJveHkgc2VsZWN0b3IgYWxsb3dzIHBlb3BsZSB0byBlZmZlY3RpdmVseSBkaXNhYmxlCisgKiAgdGhpcyBvcHRpbWl6YXRpb24sIHdoaWNoIG1heSBjb21lIGluIGhhbmR5IGZvciBhIHRyb3VibGUtc2hvb3RpbmcuKQorICogPC9vbD4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbmRwb2ludEFkZHJlc3MgeworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgVVJMIHVybDsKKyAgICBwcml2YXRlIGZpbmFsIFVSSSB1cmk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RyaW5nRm9ybTsKKyAgICAvKioKKyAgICAgKiBQcmUtc2VsZWN0ZWQgcHJveHkuCisgICAgICoKKyAgICAgKiBJZiB7QGxpbmsgI3VybH0gaXMgbnVsbCwgdGhpcyBmaWVsZCBpcyBudWxsLgorICAgICAqIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBjb3VsZCBzdGlsbCBiZSBudWxsIGlmIHRoZSBwcm94eSBjb3VsZG4ndCBiZSBjaG9zZW4KKyAgICAgKiB1cGZyb250LgorICAgICAqLworICAgIHByaXZhdGUgUHJveHkgcHJveHk7CisKKyAgICBwdWJsaWMgRW5kcG9pbnRBZGRyZXNzKFVSSSB1cmkpIHsKKyAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgICAgIHRoaXMuc3RyaW5nRm9ybSA9IHVyaS50b1N0cmluZygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy51cmwgPSB1cmkudG9VUkwoKTsKKyAgICAgICAgICAgIHByb3h5ID0gY2hvb3NlUHJveHkoKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAc2VlICNjcmVhdGUoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBFbmRwb2ludEFkZHJlc3MoU3RyaW5nIHVybCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMudXJpID0gbmV3IFVSSSh1cmwpOworICAgICAgICB0aGlzLnN0cmluZ0Zvcm0gPSB1cmw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnVybCA9IG5ldyBVUkwodXJsKTsKKyAgICAgICAgICAgIHByb3h5ID0gY2hvb3NlUHJveHkoKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRW5kcG9pbnRBZGRyZXNzfSB3aXRoIGEgcmVhc29uYWJseQorICAgICAqIGdlbmVyaWMgZXJyb3IgaGFuZGxpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbmRwb2ludEFkZHJlc3MgY3JlYXRlKFN0cmluZyB1cmwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRBZGRyZXNzKHVybCk7CisgICAgICAgIH0gY2F0Y2goVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJJbGxlZ2FsIGVuZHBvaW50IGFkZHJlc3M6ICIrdXJsLGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBQcm94eSBjaG9vc2VQcm94eSgpIHsKKyAgICAgICAgUHJveHlTZWxlY3RvciBzZWwgPQorICAgICAgICAgICAgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICBuZXcgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uPFByb3h5U2VsZWN0b3I+KCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUHJveHlTZWxlY3RvciBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZihzZWw9PW51bGwpCisgICAgICAgICAgICByZXR1cm4gUHJveHkuTk9fUFJPWFk7CisKKworICAgICAgICBpZighc2VsLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygic3VuLm5ldC5zcGkuRGVmYXVsdFByb3h5U2VsZWN0b3IiKSkKKyAgICAgICAgICAgIC8vIHVzZXItZGVmaW5lZCBwcm94eS4gbWF5IHJldHVybiBhIGRpZmZlcmVudCBwcm94eSBmb3IgZWFjaCBpbnZvY2F0aW9uCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBJdGVyYXRvcjxQcm94eT4gaXQgPSBzZWwuc2VsZWN0KHVyaSkuaXRlcmF0b3IoKTsKKyAgICAgICAgaWYoaXQuaGFzTmV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIGl0Lm5leHQoKTsKKworICAgICAgICByZXR1cm4gUHJveHkuTk9fUFJPWFk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBVUkwgb2YgdGhpcyBlbmRwb2ludCBhZHJlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIGlmIHRoaXMgZW5kcG9pbnQgYWRkcmVzcyBkb2Vzbid0IGhhdmUgYSByZWdpc3RlcmVkIHtAbGluayBVUkxTdHJlYW1IYW5kbGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFVSTCgpIHsKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIFVSSSBvZiB0aGUgZW5kcG9pbnQgYWRkcmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGFsd2F5cyBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJJIGdldFVSSSgpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byBvcGVuIHtAbGluayBVUkxDb25uZWN0aW9ufSBmb3IgdGhpcyBlbmRwb2ludC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgcG9zc2libGUgb25seSB3aGVuIGFuIGVuZHBvaW50IGFkZHJlc3MgaGFzCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFVSTFN0cmVhbUhhbmRsZXJ9LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgaWYge0BsaW5rIFVSTCNvcGVuQ29ubmVjdGlvbigpfSByZXBvcnRzIGFuIGVycm9yLgorICAgICAqIEB0aHJvd3MgQXNzZXJ0aW9uRXJyb3IKKyAgICAgKiAgICAgIGlmIHRoaXMgZW5kcG9pbnQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgVVJMLgorICAgICAqICAgICAgaWYgdGhlIGNvZGUgaXMgd3JpdHRlbiBjb3JyZWN0bHkgdGhpcyBzaGFsbCBuZXZlciBoYXBwZW4uCisgICAgICovCisgICAgcHVibGljIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnQgdXJsIT1udWxsIDogdXJpKyIgZG9lc24ndCBoYXZlIHRoZSBjb3JyZXNwb25kaW5nIFVSTCI7CisgICAgICAgIGlmKHByb3h5IT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIHVybC5vcGVuQ29ubmVjdGlvbihwcm94eSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3RyaW5nRm9ybTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvRmVhdHVyZUNvbnN0cnVjdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvRmVhdHVyZUNvbnN0cnVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiYTc0YgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9GZWF0dXJlQ29uc3RydWN0b3IuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLk1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5NZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLlN0YXRlZnVsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5TdGF0ZWZ1bEZlYXR1cmU7CisKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogPHA+CisgKiBUaGlzIGFubm90YXRpb24gc2hvdWxkIGJlIHVzZWQgb24gYSBjb25zdHJ1Y3RvciBvZiBjbGFzc2VzIGV4dGVuZGluZyB7QGxpbmsgV2ViU2VydmljZUZlYXR1cmV9IG90aGVyIHRoYW4KKyAqIFNwZWMgZGVmaW5lZCBmZWF0dXJlcywgdG8gaGVscCBKQVgtV1MgcnVudGltZSByZWNvZ25pemUgZmVhdHVyZSBleHRlbnNpb25zLgorICogPC9wPgorICogPHA+CisgKiBGb3IgV2ViU2VydmljZUZlYXR1cmUgYW5ub3RhdGlvbnMgdG8gYmUgcmVjb2duaXphYmxlIGJ5IEpBWC1XUyBydW50aW1lLCB0aGUgZmVhdHVyZSBhbm5vdGF0aW9uIHNob3VsZCBwb2ludAorICogdG8gYSBjb3JyZXNwb25kaW5nIGJlYW4gKGNsYXNzIGV4dGVuZGluZyBXZWJTZXJ2aWNlRmVhdHVyZSkuIE9ubHkgb25lIG9mIHRoZSBjb25zdHJ1Y3RvcnMgaW4gdGhlIGJlYW4gTVVTVCBiZSBtYXJrZWQKKyAqIHdpdGggQEZlYXR1cmVDb25zdHJ1Y3RvciB3aG9zZSB2YWx1ZSBjYXB0dXJlcyB0aGUgYW5ub3RhaW9uIGF0dHJpYnV0ZSBuYW1lcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycy4KKyAqIDwvcD4KKyAqIEZvciBleGFtcGxlLAorICogQHNlZSBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUKKyAqIEBzZWUgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmcKKyAqCisgKiBAc2VlIFN0YXRlZnVsCisgKiBAc2VlIFN0YXRlZnVsRmVhdHVyZQorICoKKyAqIEBhdXRob3IgUmFtYSBQdWxhdmFydGhpCisgKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoRWxlbWVudFR5cGUuQ09OU1RSVUNUT1IpCisKK3B1YmxpYyBAaW50ZXJmYWNlIEZlYXR1cmVDb25zdHJ1Y3RvciB7CisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBTdHJpbmdbXSB2YWx1ZSgpIGRlZmF1bHQge307Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvUHJvcGVydHlTZXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9Qcm9wZXJ0eVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGFlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvUHJvcGVydHlTZXQuamF2YQpAQCAtMCwwICsxLDQyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuUmVhZE9ubHlQcm9wZXJ0eUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkluaGVyaXRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHNldCBvZiAicHJvcGVydGllcyIgdGhhdCBjYW4gYmUgYWNjZXNzZWQgdmlhIHN0cm9uZ2x5LXR5cGVkIGZpZWxkcworICogYXMgd2VsbCBhcyByZWZsZXhpYmx5IHRocm91Z2ggdGhlIHByb3BlcnR5IG5hbWUuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiU3VzcGljaW91c01ldGhvZENhbGxzIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wZXJ0eVNldCB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFR5cGVkTWFwLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eVNldCgpIHt9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyBhIGZpZWxkIG9uIHtAbGluayBQcm9wZXJ0eVNldH0gYXMgYQorICAgICAqIHByb3BlcnR5IG9mIHtAbGluayBNZXNzYWdlQ29udGV4dH0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUbyBtYWtlIHRoZSBydW50aW1lIHByb2Nlc3NpbmcgZWFzeSwgdGhpcyBhbm5vdGF0aW9uCisgICAgICogbXVzdCBiZSBvbiBhIHB1YmxpYyBmaWVsZCAoc2luY2UgdGhlIHByb3BlcnR5IG5hbWUKKyAgICAgKiBjYW4gYmUgc2V0IHRocm91Z2gge0BsaW5rIE1hcH0gYW55d2F5LCB5b3Ugd29uJ3QgYmUKKyAgICAgKiBsb3NpbmcgYWJzdHJhY3Rpb24gYnkgZG9pbmcgc28uKQorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIHNpbWlsYXIgcmVhc29uLCB0aGlzIGFubm90YXRpb24gY2FuIGJlIG9ubHkgcGxhY2VkCisgICAgICogb24gYSByZWZlcmVuY2UgdHlwZSwgbm90IHByaW1pdGl2ZSB0eXBlLgorICAgICAqCisgICAgICogQHNlZSBQYWNrZXQKKyAgICAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgICAgICovCisgICAgQEluaGVyaXRlZAorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuRklFTEQsRWxlbWVudFR5cGUuTUVUSE9EfSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZ1tdIHZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgbGlzdCBvZiBzdHJvbmdseS10eXBlZCBrbm93biBwcm9wZXJ0eWllcworICAgICAqIChrZXllZCBieSBwcm9wZXJ0eSBuYW1lcy4pCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBKdXN0IGdpdmluZyBpdCBhbiBhbGlhcyB0byBtYWtlIHRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBtb3JlIGZvb2wtcHJvb2YuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0eU1hcCBleHRlbmRzIEhhc2hNYXA8U3RyaW5nLEFjY2Vzc29yPiB7fQorCisgICAgLyoqCisgICAgICogTWFwIHJlcHJlc2VudGluZyB0aGUgRmllbGRzIGFuZCBNZXRob2RzIGFubm90YXRlZCB3aXRoIHtAbGluayBQcm9wZXJ0eX0uCisgICAgICogTW9kZWwgb2Yge0BsaW5rIFByb3BlcnR5U2V0fSBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEF0IHRoZSBlbmQgb2YgdGhlIGRlcml2YXRpb24gY2hhaW4gdGhpcyBtZXRob2QganVzdCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAorICAgICAqIGFzOgorICAgICAqCisgICAgICogPHByZT4KKyAgICAgKiBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eU1hcCBtb2RlbDsKKyAgICAgKiBzdGF0aWMgeworICAgICAqICAgbW9kZWwgPSBwYXJzZShNeURlcml2ZWRDbGFzcy5jbGFzcyk7CisgICAgICogfQorICAgICAqIHByb3RlY3RlZCBQcm9wZXJ0eU1hcCBnZXRQcm9wZXJ0eU1hcCgpIHsKKyAgICAgKiAgIHJldHVybiBtb2RlbDsKKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFByb3BlcnR5TWFwIGdldFByb3BlcnR5TWFwKCk7CisKKyAgICAvLyBtYXliZSB3ZSBjYW4gdXNlIHRoaXMgc29tZSB0aW1lCisgICAgLy8vKioKKyAgICAvLyAqIElmIGFsbCB0aGUgcHJvcGVydGllcyBkZWZpbmVkIG9uIHRoaXMge0BsaW5rIFByb3BlcnR5U2V0fSBoYXMgYSBjZXJ0YWluIHByZWZpeAorICAgIC8vICogKHN1Y2ggYXMsIHNheSwgImphdmF4LnhtbC53cy5odHRwLiIpLCB0aGVuIHJldHVybiBpdC4KKyAgICAvLyAqCisgICAgLy8gKiA8cD4KKyAgICAvLyAqIFJldHVybmluZyBhIG5vbi1udWxsIG5hbWUgZnJvbSB0aGlzIG1ldGhvZCBhbGxvd3MgbWV0aG9kcyBsaWtlCisgICAgLy8gKiB7QGxpbmsgI2dldChPYmplY3QpfSBhbmQge0BsaW5rICNwdXQoU3RyaW5nLCBPYmplY3QpfSB0byB3b3JrIGZhc3Rlci4KKyAgICAvLyAqIFRoaXMgaXMgZXNwZWNpYWxseSBzbyB3aXRoIHtAbGluayBEaXN0cmlidXRlZFByb3BlcnR5U2V0fSwgc28gaW1wbGVtZW50YXRpb25zCisgICAgLy8gKiBhcmUgZW5jb3VyYWdlZCB0byBzZXQgYSBjb21tb24gcHJlZml4LCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgIC8vICoKKyAgICAvLyAqIDxwPgorICAgIC8vICogQ3VycmVudGx5LCB0aGlzIGlzIHVzZWQgb25seSBieSB7QGxpbmsgRGlzdHJpYnV0ZWRQcm9wZXJ0eVNldH0uCisgICAgLy8gKgorICAgIC8vICogQHJldHVybgorICAgIC8vICogICAgICBOdWxsIGlmIG5vIHN1Y2ggY29tbW9uIHByZWZpeCBleGlzdHMuIE90aGVyd2lzZSBzdHJpbmcgbGlrZQorICAgIC8vICogICAgICAiamF2YXgueG1sLndzLmh0dHAuIiAodGhlIGRvdCBhdCB0aGUgbGFzdCBpcyB1c3VhbGx5IHByZWZlcnJhYmxlLAorICAgIC8vICogICAgICBzbyB0aGF0IHByb3BlcnRpZXMgbGlrZSAiamF2YXgueG1sLndzLmh0dHBzLnNvbWV0aGluZyIgd29uJ3QgbWF0Y2guCisgICAgLy8gKi8KKyAgICAvL3Byb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHlQcmVmaXgoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHBhcnNlcyBhIGNsYXNzIGZvciBmaWVsZHMgYW5kIG1ldGhvZHMgd2l0aCB7QGxpbmsgUHJvcGVydHl9LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgUHJvcGVydHlNYXAgcGFyc2UoZmluYWwgQ2xhc3MgY2xhenopIHsKKyAgICAgICAgLy8gbWFrZSBhbGwgcmVsZXZhbnQgZmllbGRzIGFuZCBtZXRob2RzIGFjY2Vzc2libGUuCisgICAgICAgIC8vIHRoaXMgYWxsb3dzIHJ1bnRpbWUgdG8gc2tpcCB0aGUgc2VjdXJpdHkgY2hlY2ssIHNvIHRoZXkgcnVucyBmYXN0ZXIuCisgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxQcm9wZXJ0eU1hcD4oKSB7CisgICAgICAgICAgICBwdWJsaWMgUHJvcGVydHlNYXAgcnVuKCkgeworICAgICAgICAgICAgICAgIFByb3BlcnR5TWFwIHByb3BzID0gbmV3IFByb3BlcnR5TWFwKCk7CisgICAgICAgICAgICAgICAgZm9yKCBDbGFzcyBjPWNsYXp6OyBjIT1udWxsOyBjPWMuZ2V0U3VwZXJjbGFzcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgY3AgPSBmLmdldEFubm90YXRpb24oUHJvcGVydHkuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3AhPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoU3RyaW5nIHZhbHVlIDogY3AudmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXQodmFsdWUsIG5ldyBGaWVsZEFjY2Vzc29yKGYsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG0gOiBjLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eSBjcCA9IG0uZ2V0QW5ub3RhdGlvbihQcm9wZXJ0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjcCE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUuc3RhcnRzV2l0aCgiZ2V0Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2V0TmFtZSA9ICdzJytuYW1lLnN1YnN0cmluZygxKTsgICAvLyBnZXRGb28gLT4gc2V0Rm9vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHNldHRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXIgPSBjbGF6ei5nZXRNZXRob2Qoc2V0TmFtZSxtLmdldFJldHVyblR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGVyID0gbnVsbDsgLy8gbm8gc2V0dGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihTdHJpbmcgdmFsdWUgOiBjcC52YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnB1dCh2YWx1ZSwgbmV3IE1ldGhvZEFjY2Vzc29yKG0sIHNldHRlciwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSB0eXBlZCBwcm9wZXJ0eSBkZWZpbmVkIG9uIGEge0BsaW5rIFByb3BlcnR5U2V0fS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIEFjY2Vzc29yIHsKKyAgICAgICAgU3RyaW5nIGdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBoYXNWYWx1ZShQcm9wZXJ0eVNldCBwcm9wcyk7CisgICAgICAgIE9iamVjdCBnZXQoUHJvcGVydHlTZXQgcHJvcHMpOworICAgICAgICB2b2lkIHNldChQcm9wZXJ0eVNldCBwcm9wcywgT2JqZWN0IHZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgRmllbGRBY2Nlc3NvciBpbXBsZW1lbnRzIEFjY2Vzc29yIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpZWxkIHdpdGggdGhlIGFubm90YXRpb24uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEZpZWxkIGY7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9uZSBvZiB0aGUgdmFsdWVzIGluIHtAbGluayBQcm9wZXJ0eX0gYW5ub3RhdGlvbiBvbiB7QGxpbmsgI2Z9LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwcm90ZWN0ZWQgRmllbGRBY2Nlc3NvcihGaWVsZCBmLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5mID0gZjsKKyAgICAgICAgICAgIGYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ZhbHVlKFByb3BlcnR5U2V0IHByb3BzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0KHByb3BzKSE9bnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KFByb3BlcnR5U2V0IHByb3BzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBmLmdldChwcm9wcyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9wZXJ0eVNldCBwcm9wcywgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGYuc2V0KHByb3BzLHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE1ldGhvZEFjY2Vzc29yIGltcGxlbWVudHMgQWNjZXNzb3IgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0dGVyIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgQE5vdE51bGwgTWV0aG9kIGdldHRlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHRlciBtZXRob2QuCisgICAgICAgICAqIFNvbWUgcHJvcGVydHkgaXMgcmVhZC1vbmx5LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBATnVsbGFibGUgTWV0aG9kIHNldHRlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHRoZSB2YWx1ZXMgaW4ge0BsaW5rIFByb3BlcnR5fSBhbm5vdGF0aW9uIG9uIHtAbGluayAjZ2V0dGVyfS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHJvdGVjdGVkIE1ldGhvZEFjY2Vzc29yKE1ldGhvZCBnZXR0ZXIsIE1ldGhvZCBzZXR0ZXIsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7CisgICAgICAgICAgICB0aGlzLnNldHRlciA9IHNldHRlcjsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IHZhbHVlOworICAgICAgICAgICAgZ2V0dGVyLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICBpZihzZXR0ZXIhPW51bGwpCisgICAgICAgICAgICAgICAgc2V0dGVyLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ZhbHVlKFByb3BlcnR5U2V0IHByb3BzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0KHByb3BzKSE9bnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KFByb3BlcnR5U2V0IHByb3BzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXIuaW52b2tlKHByb3BzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlKGUpOworICAgICAgICAgICAgICAgIHJldHVybiAwOyAgIC8vIG5ldmVyIHJlYWNoIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9wZXJ0eVNldCBwcm9wcywgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBpZihzZXR0ZXI9PW51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24oZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2V0dGVyLmludm9rZShwcm9wcyx2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGhhbmRsZShlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaW5jZSB3ZSBkb24ndCBleHBlY3QgdGhlIGdldHRlci9zZXR0ZXIgdG8gdGhyb3cgYSBjaGVja2VkIGV4Y2VwdGlvbiwKKyAgICAgICAgICogaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGlvbiB0cmFuc3BhcmVudC4KKyAgICAgICAgICogVGhhdCdzIHdoYXQgd2UgYXJlIHRyeWluZyB0byBkbyBoZXJlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBFeGNlcHRpb24gaGFuZGxlKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYodCBpbnN0YW5jZW9mIEVycm9yKQorICAgICAgICAgICAgICAgIHRocm93IChFcnJvcil0OworICAgICAgICAgICAgaWYodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pdDsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gZ2V0KGtleSkhPW51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICBUaGlzIGZpZWxkIGlzIHR5cGVkIGFzIHtAbGluayBPYmplY3R9IHRvIGZvbGxvdyB0aGUge0BsaW5rIE1hcCNnZXQoT2JqZWN0KX0KKyAgICAgKiAgICAgIGNvbnZlbnRpb24sIGJ1dCBpZiBhbnl0aGluZyBidXQge0BsaW5rIFN0cmluZ30gaXMgcGFzc2VkLCB0aGlzIG1ldGhvZAorICAgICAqICAgICAganVzdCByZXR1cm5zIG51bGwuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworICAgICAgICBBY2Nlc3NvciBzcCA9IGdldFByb3BlcnR5TWFwKCkuZ2V0KGtleSk7CisgICAgICAgIGlmKHNwIT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIHNwLmdldCh0aGlzKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5kZWZpbmVkIHByb3BlcnR5ICIra2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8aDM+SW1wbGVtZW50YXRpb24gTm90ZTwvaDM+CisgICAgICogVGhpcyBtZXRob2QgaXMgc2xvdy4gQ29kZSBpbnNpZGUgSkFYLVdTIHNob3VsZCBkZWZpbmUgc3Ryb25nbHktdHlwZWQKKyAgICAgKiBmaWVsZHMgaW4gdGhpcyBjbGFzcyBhbmQgYWNjZXNzIHRoZW0gZGlyZWN0bHksIGluc3RlYWQgb2YgdXNpbmcgdGhpcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgUmVhZE9ubHlQcm9wZXJ0eUV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhlIGdpdmVuIGtleSBpcyBhbiBhbGlhcyBvZiBhIHN0cm9uZ2x5LXR5cGVkIGZpZWxkLAorICAgICAqICAgICAgYW5kIGlmIHRoZSBuYW1lIG9iamVjdCBnaXZlbiBpcyBub3QgYXNzaWduYWJsZSB0byB0aGUgZmllbGQuCisgICAgICoKKyAgICAgKiBAc2VlIFByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIEFjY2Vzc29yIHNwID0gZ2V0UHJvcGVydHlNYXAoKS5nZXQoa2V5KTsKKyAgICAgICAgaWYoc3AhPW51bGwpIHsKKyAgICAgICAgICAgIE9iamVjdCBvbGQgPSBzcC5nZXQodGhpcyk7CisgICAgICAgICAgICBzcC5zZXQodGhpcyx2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gb2xkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5kZWZpbmVkIHByb3BlcnR5ICIra2V5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGlzIHtAbGluayBQcm9wZXJ0eVNldH0gc3VwcG9ydHMgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU1hcCgpLmNvbnRhaW5zS2V5KGtleSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgeworICAgICAgICBBY2Nlc3NvciBzcCA9IGdldFByb3BlcnR5TWFwKCkuZ2V0KGtleSk7CisgICAgICAgIGlmKHNwIT1udWxsKSB7CisgICAgICAgICAgICBPYmplY3Qgb2xkID0gc3AuZ2V0KHRoaXMpOworICAgICAgICAgICAgc3Auc2V0KHRoaXMsbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gb2xkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5kZWZpbmVkIHByb3BlcnR5ICIra2V5KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogTGF6aWx5IGNyZWF0ZWQgdmlldyBvZiB7QGxpbmsgUHJvcGVydHl9cyB0aGF0CisgICAgICogZm9ybXMgdGhlIGNvcmUgb2Yge0BsaW5rICNjcmVhdGVNYXBWaWV3KCl9LgorICAgICAqLworICAgIC8qcGFja2FnZSovIFNldDxFbnRyeTxTdHJpbmcsT2JqZWN0Pj4gbWFwVmlld0NvcmU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIE1hcH0gdmlldyBvZiB0aGlzIHtAbGluayBQcm9wZXJ0eVNldH0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1hcCBpcyBwYXJ0aWFsbHkgbGl2ZSwgaW4gdGhlIHNlbnNlIHRoYXQgdmFsdWVzIHlvdSBzZXQgdG8gaXQKKyAgICAgKiB3aWxsIGJlIHJlZmxlY3RlZCB0byB7QGxpbmsgUHJvcGVydHlTZXR9LgorICAgICAqCisgICAgICogPHA+CisgICAgICogSG93ZXZlciwgdGhpcyBtYXAgbWF5IG5vdCBwaWNrIHVwIGNoYW5nZXMgbWFkZQorICAgICAqIHRvIHtAbGluayBQcm9wZXJ0eVNldH0gYWZ0ZXIgdGhlIHZpZXcgaXMgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGFsd2F5cyBub24tbnVsbCB2YWxpZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IGNyZWF0ZU1hcFZpZXcoKSB7CisgICAgICAgIGZpbmFsIFNldDxFbnRyeTxTdHJpbmcsT2JqZWN0Pj4gY29yZSA9IG5ldyBIYXNoU2V0PEVudHJ5PFN0cmluZyxPYmplY3Q+PigpOworICAgICAgICBjcmVhdGVFbnRyeVNldChjb3JlKTsKKworICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWFwPFN0cmluZywgT2JqZWN0PigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8RW50cnk8U3RyaW5nLE9iamVjdD4+IGVudHJ5U2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb3JlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qcGFja2FnZSovIHZvaWQgY3JlYXRlRW50cnlTZXQoU2V0PEVudHJ5PFN0cmluZyxPYmplY3Q+PiBjb3JlKSB7CisgICAgICAgIGZvciAoZmluYWwgRW50cnk8U3RyaW5nLCBBY2Nlc3Nvcj4gZSA6IGdldFByb3BlcnR5TWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgY29yZS5hZGQobmV3IEVudHJ5PFN0cmluZywgT2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0VmFsdWUoKS5nZXQoUHJvcGVydHlTZXQudGhpcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzb3IgYWNjID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gYWNjLmdldChQcm9wZXJ0eVNldC50aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjLnNldChQcm9wZXJ0eVNldC50aGlzLHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9TT0FQVmVyc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL1NPQVBWZXJzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0MmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9TT0FQVmVyc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQMTJDb25zdGFudHM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisKKy8qKgorICogVmVyc2lvbiBvZiBTT0FQICgxLjEgYW5kIDEuMikuCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIGRlZmluZXMgdmFyaW91cyBjb25zdGFudHMgZm9yIFNPQVAgMS4xIGFuZCBTT0FQIDEuMiwKKyAqIGFuZCBhbHNvIGRlZmluZXMgY29udmVuaWVuY2UgbWV0aG9kcyB0byBzaW1wbGlmeSB0aGUgcHJvY2Vzc2luZworICogb2YgbXVsdGlwbGUgU09BUCB2ZXJzaW9ucy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY29uc3RhbnQgYWxvd3MgeW91IHRvIGRvOgorICoKKyAqIDxwcmU+CisgKiBTT0FQVmVyc2lvbiB2ZXJzaW9uID0gLi4uOworICogdmVyc2lvbi5zb21lT3AoLi4uKTsKKyAqIDwvcHJlPgorICoKKyAqIEFzIG9wcG9zZWQgdG86CisgKgorICogPHByZT4KKyAqIGlmKGJpbmRpbmcgaXMgU09BUDExKSB7CisgKiAgIGRvU29tZU9wMTEoLi4uKTsKKyAqIH0gZWxzZSB7CisgKiAgIGRvU29tZU9wMTIoLi4uKTsKKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGVudW0gU09BUFZlcnNpb24geworICAgIFNPQVBfMTEoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLAorICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQQ29uc3RhbnRzLlVSSV9FTlZFTE9QRSwKKyAgICAgICAgICAgICJ0ZXh0L3htbCIsCisgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlVSSV9TT0FQX0FDVE9SX05FWFQsICJhY3RvciIsCisgICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzLlNPQVBfMV8xX1BST1RPQ09MLAorICAgICAgICAgICAgbmV3IFFOYW1lKGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUENvbnN0YW50cy5VUklfRU5WRUxPUEUsICJNdXN0VW5kZXJzdGFuZCIpLAorICAgICAgICAgICAgIkNsaWVudCIsCisgICAgICAgICAgICAiU2VydmVyIiwKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihTT0FQQ29uc3RhbnRzLlVSSV9TT0FQX0FDVE9SX05FWFQpKSwKKworICAgIFNPQVBfMTIoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLAorICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlVSSV9FTlZFTE9QRSwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9zb2FwK3htbCIsCisgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlVSSV9TT0FQXzFfMl9ST0xFX1VMVElNQVRFX1JFQ0VJVkVSLCAicm9sZSIsCisgICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MLAorICAgICAgICAgICAgbmV3IFFOYW1lKGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUDEyQ29uc3RhbnRzLlVSSV9FTlZFTE9QRSwgIk11c3RVbmRlcnN0YW5kIiksCisgICAgICAgICAgICAiU2VuZGVyIiwKKyAgICAgICAgICAgICJSZWNlaXZlciIsCisgICAgICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoU09BUENvbnN0YW50cy5VUklfU09BUF8xXzJfUk9MRV9ORVhULFNPQVBDb25zdGFudHMuVVJJX1NPQVBfMV8yX1JPTEVfVUxUSU1BVEVfUkVDRUlWRVIpKSk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kaW5nIElEIGZvciBTT0FQL0hUVFAgYmluZGluZyBvZiB0aGlzIFNPQVAgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEVpdGhlciB7QGxpbmsgU09BUEJpbmRpbmcjU09BUDExSFRUUF9CSU5ESU5HfSBvcgorICAgICAqICB7QGxpbmsgU09BUEJpbmRpbmcjU09BUDEySFRUUF9CSU5ESU5HfQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaHR0cEJpbmRpbmdJZDsKKworICAgIC8qKgorICAgICAqIFNPQVAgZW52ZWxvcGUgbmFtZXNwYWNlIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5zVXJpOworCisgICAgLyoqCisgICAgICogQ29udGVudC10eXBlLiBFaXRoZXIgInRleHQveG1sIiBvciAiYXBwbGljYXRpb24vc29hcCt4bWwiLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29udGVudFR5cGU7CisKKyAgICAvKioKKyAgICAgKiBTT0FQIE11c3RVbmRlcnN0YW5kIEZhdWx0Q29kZSBmb3IgdGhpcyBTT0FQIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgZmF1bHRDb2RlTXVzdFVuZGVyc3RhbmQ7CisKKyAgICAvKioKKyAgICAgKiBTQUFKIHtAbGluayBNZXNzYWdlRmFjdG9yeX0gZm9yIHRoaXMgU09BUCB2ZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNZXNzYWdlRmFjdG9yeSBzYWFqTWVzc2FnZUZhY3Rvcnk7CisKKyAgICAvKioKKyAgICAgKiBTQUFKIHtAbGluayBTT0FQRmFjdG9yeX0gZm9yIHRoaXMgU09BUCB2ZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTT0FQRmFjdG9yeSBzYWFqU29hcEZhY3Rvcnk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgYWN0b3Ivcm9sZSBhdHRyaWJ1dGUgaXMgYWJzZW50LCB0aGlzIFNPQVAgdmVyc2lvbiBhc3N1bWVzIHRoaXMgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBpbXBsaWNpdFJvbGU7CisKKyAgICAvKioKKyAgICAgKiBTaW5nbGV0b24gc2V0IHRoYXQgY29udGFpbnMge0BsaW5rICNpbXBsaWNpdFJvbGV9LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTZXQ8U3RyaW5nPiBpbXBsaWNpdFJvbGVTZXQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHJlcHJlc2VudHMgdGhlIHJvbGVzIHJlcXVpcmVkIHRvIGJlIGFzc3VtZWQgYnkgU09BUCBiaW5kaW5nIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTZXQ8U3RyaW5nPiByZXF1aXJlZFJvbGVzOworCisgICAgLyoqCisgICAgICogInJvbGUiIChTT0FQIDEuMikgb3IgImFjdG9yIiAoU09BUCAxLjEpCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyByb2xlQXR0cmlidXRlTmFtZTsKKworICAgIC8qKgorICAgICAqICJ7bnNVcml9Q2xpZW50IiBvciAie25zVXJpfVNlbmRlciIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgZmF1bHRDb2RlQ2xpZW50OworCisgICAgLyoqCisgICAgICogIntuc1VyaX1TZXJ2ZXIiIG9yICJ7bnNVcml9UmVjZWl2ZXIiCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFFOYW1lIGZhdWx0Q29kZVNlcnZlcjsKKworCisgICAgcHJpdmF0ZSBTT0FQVmVyc2lvbihTdHJpbmcgaHR0cEJpbmRpbmdJZCwgU3RyaW5nIG5zVXJpLCBTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBpbXBsaWNpdFJvbGUsIFN0cmluZyByb2xlQXR0cmlidXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzYWFqRmFjdG9yeVN0cmluZywgUU5hbWUgZmF1bHRDb2RlTXVzdFVuZGVyc3RhbmQsIFN0cmluZyBmYXVsdENvZGVDbGllbnRMb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmF1bHRDb2RlU2VydmVyTG9jYWxOYW1lLFNldDxTdHJpbmc+IHJlcXVpcmVkUm9sZXMpIHsKKyAgICAgICAgdGhpcy5odHRwQmluZGluZ0lkID0gaHR0cEJpbmRpbmdJZDsKKyAgICAgICAgdGhpcy5uc1VyaSA9IG5zVXJpOworICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgIHRoaXMuaW1wbGljaXRSb2xlID0gaW1wbGljaXRSb2xlOworICAgICAgICB0aGlzLmltcGxpY2l0Um9sZVNldCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihpbXBsaWNpdFJvbGUpOworICAgICAgICB0aGlzLnJvbGVBdHRyaWJ1dGVOYW1lID0gcm9sZUF0dHJpYnV0ZU5hbWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYWFqTWVzc2FnZUZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShzYWFqRmFjdG9yeVN0cmluZyk7CisgICAgICAgICAgICBzYWFqU29hcEZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShzYWFqRmFjdG9yeVN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZmF1bHRDb2RlTXVzdFVuZGVyc3RhbmQgPSBmYXVsdENvZGVNdXN0VW5kZXJzdGFuZDsKKyAgICAgICAgdGhpcy5yZXF1aXJlZFJvbGVzID0gcmVxdWlyZWRSb2xlczsKKyAgICAgICAgdGhpcy5mYXVsdENvZGVDbGllbnQgPSBuZXcgUU5hbWUobnNVcmksZmF1bHRDb2RlQ2xpZW50TG9jYWxOYW1lKTsKKyAgICAgICAgdGhpcy5mYXVsdENvZGVTZXJ2ZXIgPSBuZXcgUU5hbWUobnNVcmksZmF1bHRDb2RlU2VydmVyTG9jYWxOYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBodHRwQmluZGluZ0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0BsaW5rIFNPQVBWZXJzaW9ufSB3aG9zZSB7QGxpbmsgI2h0dHBCaW5kaW5nSWR9IGVxdWFscyB0bworICAgICAqIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIGlucHV0IHN0cmluZyB2YWxpZGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmcKKyAgICAgKiAgICAgIGZvciBoaXN0b3JpY2FsIHJlYXNvbiwgd2UgdHJlYXQgbnVsbCBhcyB7QGxpbmsgI1NPQVBfMTF9LAorICAgICAqICAgICAgYnV0IHlvdSByZWFsbHkgc2hvdWxkbid0IGJlIHBhc3NpbmcgbnVsbC4KKyAgICAgKiBAcmV0dXJuIGFsd2F5cyBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNPQVBWZXJzaW9uIGZyb21IdHRwQmluZGluZyhTdHJpbmcgYmluZGluZykgeworICAgICAgICBpZihiaW5kaW5nPT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIFNPQVBfMTE7CisKKyAgICAgICAgaWYoYmluZGluZy5lcXVhbHMoU09BUF8xMi5odHRwQmluZGluZ0lkKSkKKyAgICAgICAgICAgIHJldHVybiBTT0FQXzEyOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gU09BUF8xMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayBTT0FQVmVyc2lvbn0gd2hvc2Uge0BsaW5rICNuc1VyaX0gZXF1YWxzIHRvCisgICAgICogdGhlIGdpdmVuIHN0cmluZy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gaW5wdXQgc3RyaW5nIHZhbGlkYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbnNVcmkKKyAgICAgKiAgICAgIG11c3Qgbm90IGJlIG51bGwuCisgICAgICogQHJldHVybiBhbHdheXMgbm9uLW51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTT0FQVmVyc2lvbiBmcm9tTnNVcmkoU3RyaW5nIG5zVXJpKSB7CisgICAgICAgIGlmKG5zVXJpLmVxdWFscyhTT0FQXzEyLm5zVXJpKSkKKyAgICAgICAgICAgIHJldHVybiBTT0FQXzEyOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gU09BUF8xMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvV1NCaW5kaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvV1NCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhNDM4MQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9XU0JpbmRpbmcuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworCitpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogSkFYLVdTIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBCaW5kaW5nfS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgb2JqZWN0IGNhbiBiZSBjcmVhdGVkIGJ5IHtAbGluayBCaW5kaW5nSUQjY3JlYXRlQmluZGluZygpfS4KKyAqCisgKiA8cD4KKyAqIEJpbmRpbmcgY29uY2VwdHVhbGx5IGluY2x1ZGVzIHRoZSBvbi10aGUtd2lyZSBmb3JtYXQgb2YgdGhlIG1lc3NhZ2UsCisgKiB0aGlzIHRoaXMgb2JqZWN0IG93bnMge0BsaW5rIENvZGVjfS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV1NCaW5kaW5nIGV4dGVuZHMgQmluZGluZyB7CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgU09BUCB2ZXJzaW9uIG9mIHRoaXMgYmluZGluZy4KKyAgICAgKgorICAgICAqIFRPRE86IGNsYXJpZnkgd2hhdCB0byBkbyB3aXRoIFhNTC9IVFRQIGJpbmRpbmcKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMganVzdCBhIHNob3ItY3V0IGZvciAge0Bjb2RlIGdldEJpbmRpbmdJRCgpLmdldFNPQVBWZXJzaW9uKCl9CisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBJZiB0aGUgYmluZGluZyBpcyB1c2luZyBTT0FQLCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogICAgICBhIHtAbGluayBTT0FQVmVyc2lvbn0gY29uc3RhbnQuCisgICAgICoKKyAgICAgKiAgICAgIElmIHRoZSBiaW5kaW5nIGlzIG5vdCBiYXNlZCBvbiBTT0FQLCB0aGlzIG1ldGhvZAorICAgICAqICAgICAgcmV0dXJucyBudWxsLiBTZWUge0BsaW5rIE1lc3NhZ2V9IGZvciBob3cgYSBub24tU09BUAorICAgICAqICAgICAgYmluZGluZyBzaGFsbCBiZSBoYW5kbGVkIGJ5IHtAbGluayBUdWJlfXMuCisgICAgICovCisgICAgU09BUFZlcnNpb24gZ2V0U09BUFZlcnNpb24oKTsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBXUy1BZGRyZXNzaW5nIHZlcnNpb24gb2YgdGhpcyBiaW5kaW5nLgorICAgICAqIDxwLz4KKyAgICAgKiBUT0RPOiBjbGFyaWZ5IHdoYXQgdG8gZG8gd2l0aCBYTUwvSFRUUCBiaW5kaW5nCisgICAgICoKKyAgICAgKiBAcmV0dXJuIElmIHRoZSBiaW5kaW5nIGlzIHVzaW5nIFNPQVAgYW5kIFdTLUFkZHJlc3NpbmcgaXMgZW5hYmxlZCwKKyAgICAgKiAgICAgICAgIHRoaXMgbWV0aG9kIHJldHVybnMgYSB7QGxpbmsgQWRkcmVzc2luZ1ZlcnNpb259IGNvbnN0YW50LgorICAgICAqICAgICAgICAgSWYgYmluZGluZyBpcyBub3QgdXNpbmcgU09BUCBvciBXUy1BZGRyZXNzaW5nIGlzIG5vdCBlbmFibGVkLAorICAgICAqICAgICAgICAgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLgorICAgICAqCisgICAgICogICAgICAgICAgVGhpcyBtaWdodCBiZSBsaXR0bGUgc2xvdyBhcyBpdCBoYXMgdG8gZ28gb3ZlciBhbGwgdGhlIGZlYXR1cmVzIG9uIGJpbmRpbmcuCisgICAgICogICAgICAgICAgSXRzIGFkdmlzYWJsZSB0byBjYWNoZSB0aGUgYWRkcmVzc2luZ1ZlcnNpb24gd2hlcmV2ZXIgcG9zc2libGUgYW5kIHJldXNlIGl0LgorICAgICAqLworICAgIEFkZHJlc3NpbmdWZXJzaW9uIGdldEFkZHJlc3NpbmdWZXJzaW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBiaW5kaW5nIElELCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBiaW5kaW5nLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIHJlbGV2YW50IHNwZWNzIGRlZmluZSB0aGUgYmluZGluZyBJRHMgYW5kIHdoYXQgdGhleSBtZWFuLgorICAgICAqIFRoZSBJRCBpcyB1c2VkIGluIG1hbnkgcGxhY2VzIHRvIGlkZW50aWZ5IHRoZSBraW5kIG9mIGJpbmRpbmcKKyAgICAgKiAoc3VjaCBhcyBTT0FQMS4xLCBTT0FQMS4yLCBSRVNULCAuLi4pCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBBbHdheXMgbm9uLW51bGwgc2FtZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBATm90TnVsbCBCaW5kaW5nSUQgZ2V0QmluZGluZ0lkKCk7CisKKyAgICBATm90TnVsbCBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbigpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgcGFydGljdWxhciB7QGxpbmsgV2ViU2VydmljZUZlYXR1cmV9IGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0cnVlIGlmIGVuYWJsZWQuCisgICAgICovCisgICAgYm9vbGVhbiBpc0ZlYXR1cmVFbmFibGVkKEBOb3ROdWxsIENsYXNzPD8gZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZT4gZmVhdHVyZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEge0BsaW5rIFdlYlNlcnZpY2VGZWF0dXJlfSBvZiB0aGUgc3BlY2lmaWMgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZWF0dXJlVHlwZQorICAgICAqICAgICAgVGhlIHR5cGUgb2YgdGhlIGZlYXR1cmUgdG8gcmV0cmlldmUuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgSWYgdGhlIGZlYXR1cmUgaXMgcHJlc2VudCBhbmQgZW5hYmxlZCwgcmV0dXJuIGEgbm9uLW51bGwgaW5zdGFuY2UuCisgICAgICogICAgICBPdGhlcndpc2UgbnVsbC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUgPEYgZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZT4gRiBnZXRGZWF0dXJlKEBOb3ROdWxsIENsYXNzPEY+IGZlYXR1cmVUeXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCB7QGxpbmsgV1NCaW5kaW5nfS4KKyAgICAgKi8KKyAgICBATm90TnVsbCBXU0ZlYXR1cmVMaXN0IGdldEZlYXR1cmVzKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvV1NGZWF0dXJlTGlzdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL1dTRmVhdHVyZUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmUxM2RmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL1dTRmVhdHVyZUxpc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpO2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworCitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworCisvKioKKyAqIFJlYWQtb25seSBsaXN0IG9mIHtAbGluayBXZWJTZXJ2aWNlRmVhdHVyZX1zLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBXU0ZlYXR1cmVMaXN0IGV4dGVuZHMgSXRlcmFibGU8V2ViU2VydmljZUZlYXR1cmU+IHsKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYSBwYXJ0aWN1bGFyIHtAbGluayBXZWJTZXJ2aWNlRmVhdHVyZX0gaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRydWUgaWYgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRW5hYmxlZChATm90TnVsbCBDbGFzczw/IGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmU+IGZlYXR1cmUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIHtAbGluayBXZWJTZXJ2aWNlRmVhdHVyZX0gb2YgdGhlIHNwZWNpZmljIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmVhdHVyZVR5cGUKKyAgICAgKiAgICAgIFRoZSB0eXBlIG9mIHRoZSBmZWF0dXJlIHRvIHJldHJpZXZlLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIElmIHRoZSBmZWF0dXJlIGlzIHByZXNlbnQgYW5kIGVuYWJsZWQsIHJldHVybiBhIG5vbi1udWxsIGluc3RhbmNlLgorICAgICAqICAgICAgT3RoZXJ3aXNlIG51bGwuCisgICAgICovCisgICAgQE51bGxhYmxlIDxGIGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmU+IEYgZ2V0KEBOb3ROdWxsIENsYXNzPEY+IGZlYXR1cmVUeXBlKTsKKworICAgIC8qKgorICAgICAqIE9idGFpbnMgYWxsIHRoZSBmZWF0dXJlcyBpbiB0aGUgYXJyYXkuCisgICAgICAqLworICAgIEBOb3ROdWxsIFdlYlNlcnZpY2VGZWF0dXJlW10gdG9BcnJheSgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL1dTU2VydmljZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL1dTU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyY2RkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvV1NTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGk7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5XU0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOworaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKKworLyoqCisgKiBKQVgtV1MgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFNlcnZpY2VEZWxlZ2F0ZX0uCisgKgorICogPHA+CisgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgb25seSB0byBpbXByb3ZlIHRoZSBzdGF0aWMgdHlwZSBzYWZldHkKKyAqIG9mIHRoZSBKQVgtV1MgaW50ZXJuYWwgQVBJLgorICoKKyAqIDxwPgorICogVGhlIGNsYXNzIG5hbWUgaW50ZW50aW9uYWxseSBkb2Vzbid0IGluY2x1ZGUgIkRlbGVnYXRlIiwKKyAqIGJlY2F1c2UgdGhlIGZhY3QgdGhhdCBpdCdzIGEgZGVsZWdhdGUgaXMgYSBkZXRhaWwgb2YKKyAqIHRoZSBKU1ItMjI0IEFQSSwgYW5kIGZvciB0aGUgbGF5ZXJzIGFib3ZlIHVzIHRoaXMgb2JqZWN0CisgKiBuZXZlcnRoZWxlc3MgcmVwcmVzZW50cyB7QGxpbmsgU2VydmljZX0uIFdlIHdhbnQgdGhlbQorICogdG8gdGhpbmsgb2YgdGhpcyBhcyBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIHNlcnZpY2UuCisgKgorICogPHA+CisgKiBPbmx5IEpBWC1XUyBpbnRlcm5hbCBjb2RlIG1heSBkb3duY2FzdCB0aGlzIHRvIHtAbGluayBXU1NlcnZpY2VEZWxlZ2F0ZX0uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NTZXJ2aWNlIGV4dGVuZHMgU2VydmljZURlbGVnYXRlIHsKKyAgICBwcm90ZWN0ZWQgV1NTZXJ2aWNlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFdvcmtzIGxpa2Uge0BsaW5rICNnZXRQb3J0KEVuZHBvaW50UmVmZXJlbmNlLCBDbGFzcywgV2ViU2VydmljZUZlYXR1cmUuLi4pfQorICAgICAqIGJ1dCB0YWtlcyB7QGxpbmsgV1NFbmRwb2ludFJlZmVyZW5jZX0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IDxUPiBUIGdldFBvcnQoV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIsIENsYXNzPFQ+IHBvcnRJbnRlcmZhY2UsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKTsKKworICAgIC8qKgorICAgICAqIFdvcmtzIGxpa2Uge0BsaW5rICNjcmVhdGVEaXNwYXRjaChFbmRwb2ludFJlZmVyZW5jZSwgQ2xhc3MsIE1vZGUsIFdlYlNlcnZpY2VGZWF0dXJlW10pfQorICAgICAqIGJ1dCBpdCB0YWtlcyB0aGUgcG9ydCBuYW1lIHNlcGFyYXRlbHksIHNvIHRoYXQgRVBSIHdpdGhvdXQgZW1iZWRkZWQgbWV0YWRhdGEgY2FuIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IDxUPiBEaXNwYXRjaDxUPiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgV1NFbmRwb2ludFJlZmVyZW5jZSB3c2VwciwgQ2xhc3M8VD4gYUNsYXNzLCBTZXJ2aWNlLk1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpOworCisgICAgLyoqCisgICAgICogV29ya3MgbGlrZSB7QGxpbmsgI2NyZWF0ZURpc3BhdGNoKEVuZHBvaW50UmVmZXJlbmNlLCBKQVhCQ29udGV4dCwgTW9kZSwgV2ViU2VydmljZUZlYXR1cmVbXSl9CisgICAgICogYnV0IGl0IHRha2VzIHRoZSBwb3J0IG5hbWUgc2VwYXJhdGVseSwgc28gdGhhdCBFUFIgd2l0aG91dCBlbWJlZGRlZCBtZXRhZGF0YSBjYW4gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRGlzcGF0Y2g8T2JqZWN0PiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgV1NFbmRwb2ludFJlZmVyZW5jZSB3c2VwciwgSkFYQkNvbnRleHQgamF4YkNvbnRleHQsIFNlcnZpY2UuTW9kZSBtb2RlLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcyk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIFRoZSBzcGVjaWZpZWQgV1NETCBkb2N1bWVudCBsb2NhdGlvbiBhbmQgc2VydmljZSBxdWFsaWZpZWQgbmFtZSBNVVNUCisgICAgICogdW5pcXVlbHkgaWRlbnRpZnkgYSA8Y29kZT53c2RsOnNlcnZpY2U8L2NvZGU+IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3NkbERvY3VtZW50TG9jYXRpb24gVVJMIGZvciB0aGUgV1NETCBkb2N1bWVudCBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHNlcnZpY2UKKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIGFueSBlcnJvciBpbiBjcmVhdGlvbiBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHNlcnZpY2UuCisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgV1NTZXJ2aWNlIGNyZWF0ZSggVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IFdTU2VydmljZURlbGVnYXRlKHdzZGxEb2N1bWVudExvY2F0aW9uLHNlcnZpY2VOYW1lLFNlcnZpY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFFOYW1lIGZvciB0aGUgc2VydmljZQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gY3JlYXRpb24gb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXU1NlcnZpY2UgY3JlYXRlKFFOYW1lIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIHJldHVybiBjcmVhdGUobnVsbCxzZXJ2aWNlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHNlcnZpY2Ugd2l0aCBhIGR1bW15IHNlcnZpY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdTU2VydmljZSBjcmVhdGUoKSB7CisgICAgICAgIHJldHVybiBjcmVhdGUobnVsbCxuZXcgUU5hbWUoV1NTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwiZHVtbXkiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyB0aGUge0BsaW5rIFdTU2VydmljZX0gdGhhdCdzIGVuY2Fwc3VsYXRlZCBpbnNpZGUgYSB7QGxpbmsgU2VydmljZX0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhlIGdpdmVuIHNlcnZpY2Ugb2JqZWN0IGlzIG5vdCBmcm9tIHRoZSBKQVgtV1MgUkkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXU1NlcnZpY2UgdW53cmFwKGZpbmFsIFNlcnZpY2Ugc3ZjKSB7CisgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxXU1NlcnZpY2U+KCkgeworICAgICAgICAgICAgcHVibGljIFdTU2VydmljZSBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmllbGQgZiA9IHN2Yy5nZXRDbGFzcygpLmdldEZpZWxkKCJkZWxlZ2F0ZSIpOworICAgICAgICAgICAgICAgICAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBkZWxlZ2F0ZSA9IGYuZ2V0KHN2Yyk7CisgICAgICAgICAgICAgICAgICAgIGlmKCEoZGVsZWdhdGUgaW5zdGFuY2VvZiBXU1NlcnZpY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFdTU2VydmljZSkgZGVsZWdhdGU7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25FcnJvciB4ID0gbmV3IEFzc2VydGlvbkVycm9yKCJVbmV4cGVjdGVkIHNlcnZpY2UgQVBJIGltcGxlbWVudGF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIHguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXJyb3IgeCA9IG5ldyBJbGxlZ2FsQWNjZXNzRXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9hZGRyZXNzaW5nL0FkZHJlc3NpbmdWZXJzaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9BZGRyZXNzaW5nVmVyc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjhmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9BZGRyZXNzaW5nVmVyc2lvbi5qYXZhCkBAIC0wLDAgKzEsNzQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3Npbmc7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuWE1MU3RyZWFtQnVmZmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcuVzNDQWRkcmVzc2luZ0NvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLldzYVR1YmVIZWxwZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy52MjAwNDA4Lk1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5NZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW0uT3V0Ym91bmRTdHJlYW1IZWFkZXI7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7CitpbXBvcnQgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmU7CitpbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCisvKioKKyAqICdUcmFpdHMnIG9iamVjdCB0aGF0IGFic29yYnMgZGlmZmVyZW5jZXMgb2YgV1MtQWRkcmVzc2luZyB2ZXJzaW9ucy4KKyAqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGVudW0gQWRkcmVzc2luZ1ZlcnNpb24geworCisgICAgVzNDKCJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciLAorICAgICAgICBXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLkFOT05ZTU9VU19FUFIsCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIsCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIsCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzIiwKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9ub25lIiwKKyAgICAgICAgbmV3IEVQUihXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgIkFkZHJlc3MiLAorICAgICAgICAgICAgICAgICAgICAiU2VydmljZU5hbWUiLAorICAgICAgICAgICAgICAgICAgICAiRW5kcG9pbnROYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIkludGVyZmFjZU5hbWUiLAorICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyIsIk1ldGFkYXRhIiksCisgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2VQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCApKSB7CisKKyAgICAgICAgLyogcGFja2FnZSAqLyAgU3RyaW5nIGdldEFjdGlvbk1pc21hdGNoTG9jYWxOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJBY3Rpb25NaXNtYXRjaCI7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlUGFyYW1ldGVyKFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBsb2NhbE5hbWUuZXF1YWxzKCJSZWZlcmVuY2VQYXJhbWV0ZXJzIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFdzYVR1YmVIZWxwZXIgZ2V0V3NhSGVscGVyKFdTRExQb3J0IHdzZGxQb3J0LCBTRUlNb2RlbCBzZWlNb2RlbCwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5Xc2FUdWJlSGVscGVySW1wbCh3c2RsUG9ydCwgc2VpTW9kZWwsIGJpbmRpbmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIGdldE1hcFJlcXVpcmVkTG9jYWxOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJNZXNzYWdlQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1hcFJlcXVpcmVkVGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiQSByZXF1aXJlZCBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCBwcmVzZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIGdldEludmFsaWRBZGRyZXNzTG9jYWxOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkQWRkcmVzcyI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0SW52YWxpZE1hcExvY2FsTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW52YWxpZE1hcFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkEgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIGdldEludmFsaWRDYXJkaW5hbGl0eUxvY2FsTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW52YWxpZENhcmRpbmFsaXR5IjsKKyAgICAgICAgfQorCisgICAgICAgIC8qcGFja2FnZSovIEhlYWRlciBjcmVhdGVSZWZlcmVuY2VQYXJhbWV0ZXJIZWFkZXIoWE1MU3RyZWFtQnVmZmVyIG1hcmssIFN0cmluZyBuc1VyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRib3VuZFJlZmVyZW5jZVBhcmFtZXRlckhlYWRlcihtYXJrLG5zVXJpLGxvY2FsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKnBhY2thZ2UqLyBTdHJpbmcgZ2V0SXNSZWZlcmVuY2VQYXJhbWV0ZXJMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIklzUmVmZXJlbmNlUGFyYW1ldGVyIjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIGdldFdzZGxBbm9ueW1vdXNMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIkFub255bW91cyI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgICAgIHJldHVybiAid3NhIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFByZWZpeCgpIHsKKyAgICAgICAgICAgIHJldHVybiAid3NhdyI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIFdlYlNlcnZpY2VGZWF0dXJlPiBnZXRGZWF0dXJlQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gQWRkcmVzc2luZ0ZlYXR1cmUuY2xhc3M7CisgICAgICAgIH0KKyAgICB9LAorICAgIE1FTUJFUigiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiwKKyAgICAgICAgICAgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMuQU5PTllNT1VTX0VQUiwKKyAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIsCisgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcvcG9saWN5IiwKKyAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91cyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgbmV3IEVQUihNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICJBZGRyZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2VOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIlBvcnROYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIlBvcnRUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMuTUVYX01FVEFEQVRBLAorICAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlUGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2VQcm9wZXJ0aWVzIikpIHsKKyAgICAgICAgLyogcGFja2FnZSAqLyAgU3RyaW5nIGdldEFjdGlvbk1pc21hdGNoTG9jYWxOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkTWVzc2FnZUluZm9ybWF0aW9uSGVhZGVyIjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VQYXJhbWV0ZXIoU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZS5lcXVhbHMoIlJlZmVyZW5jZVBhcmFtZXRlcnMiKSB8fCBsb2NhbE5hbWUuZXF1YWxzKCJSZWZlcmVuY2VQcm9wZXJ0aWVzIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFdzYVR1YmVIZWxwZXIgZ2V0V3NhSGVscGVyKFdTRExQb3J0IHdzZGxQb3J0LCBTRUlNb2RlbCBzZWlNb2RlbCwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy52MjAwNDA4LldzYVR1YmVIZWxwZXJJbXBsKHdzZGxQb3J0LCBzZWlNb2RlbCwgYmluZGluZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0TWFwUmVxdWlyZWRMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIk1lc3NhZ2VJbmZvcm1hdGlvbkhlYWRlclJlcXVpcmVkIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1hcFJlcXVpcmVkVGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiQSByZXF1aXJlZCBtZXNzYWdlIGluZm9ybWF0aW9uIGhlYWRlciwgVG8sIE1lc3NhZ2VJRCwgb3IgQWN0aW9uLCBpcyBub3QgcHJlc2VudC4iOworICAgICAgICB9CisKKyAgICAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0SW52YWxpZEFkZHJlc3NMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW52YWxpZE1hcExvY2FsTmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIGdldEludmFsaWRNYXBMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIkludmFsaWRNZXNzYWdlSW5mb3JtYXRpb25IZWFkZXIiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW52YWxpZE1hcFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkEgbWVzc2FnZSBpbmZvcm1hdGlvbiBoZWFkZXIgaXMgbm90IHZhbGlkIGFuZCB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkLiI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0SW52YWxpZENhcmRpbmFsaXR5TG9jYWxOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEludmFsaWRNYXBMb2NhbE5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qcGFja2FnZSovIEhlYWRlciBjcmVhdGVSZWZlcmVuY2VQYXJhbWV0ZXJIZWFkZXIoWE1MU3RyZWFtQnVmZmVyIG1hcmssIFN0cmluZyBuc1VyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRib3VuZFN0cmVhbUhlYWRlcihtYXJrLG5zVXJpLGxvY2FsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKnBhY2thZ2UqLyBTdHJpbmcgZ2V0SXNSZWZlcmVuY2VQYXJhbWV0ZXJMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICAvKiBwYWNrYWdlICovIFN0cmluZyBnZXRXc2RsQW5vbnltb3VzTG9jYWxOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7CisgICAgICAgICAgICByZXR1cm4gIndzYSI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxQcmVmaXgoKSB7CisgICAgICAgICAgICByZXR1cm4gIndzYXciOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZT4gZ2V0RmVhdHVyZUNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5jbGFzczsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2UgVVJJCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBuc1VyaTsKKworICAgIC8qKgorICAgICAqIE5hbWVzcGFjZSBVUkkgZm9yIHRoZSBXU0RMIEJpbmRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHdzZGxOc1VyaTsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudGluZyBlaXRoZXIge0BsaW5rIFczQ0VuZHBvaW50UmVmZXJlbmNlfSBvcgorICAgICAqIHtAbGluayBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2V9LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBFUFIgZXByVHlwZTsKKworICAgIC8qKgorICAgICAqIE5hbWVzcGFjZSBVUkkgZm9yIHRoZSBXU0RMIEJpbmRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvbGljeU5zVXJpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYW5vbnltb3VzIFVSSSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBXUy1BZGRyZXNzaW5nIHZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEBOb3ROdWxsIFN0cmluZyBhbm9ueW1vdXNVcmk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBub25lIFVSSSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBXUy1BZGRyZXNzaW5nIHZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEBOb3ROdWxsIFN0cmluZyBub25lVXJpOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgYW5vbnltb3VzIEVQUi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgV1NFbmRwb2ludFJlZmVyZW5jZSBhbm9ueW1vdXNFcHI7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBUbyBRTmFtZSBpbiB0aGUgU09BUCBtZXNzYWdlIGZvciBhIHNwZWNpZmljIFdTLUFkZHJlc3NpbmcgVmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgdG9UYWc7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBGcm9tIFFOYW1lIGluIHRoZSBTT0FQIG1lc3NhZ2UgZm9yIGEgc3BlY2lmaWMgV1MtQWRkcmVzc2luZyBWZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBRTmFtZSBmcm9tVGFnOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgUmVwbHlUbyBRTmFtZSBpbiB0aGUgU09BUCBtZXNzYWdlIGZvciBhIHNwZWNpZmljIFdTLUFkZHJlc3NpbmcgVmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgcmVwbHlUb1RhZzsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIEZhdWx0VG8gUU5hbWUgZm9yIGEgc3BlY2lmaWMgV1MtQWRkcmVzc2luZyBWZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBRTmFtZSBmYXVsdFRvVGFnOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgQWN0aW9uIFFOYW1lIGluIHRoZSBTT0FQIG1lc3NhZ2UgZm9yIGEgc3BlY2lmaWMgV1MtQWRkcmVzc2luZyBWZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBRTmFtZSBhY3Rpb25UYWc7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBNZXNzYWdlSUQgUU5hbWUgaW4gdGhlIFNPQVAgbWVzc2FnZSBmb3IgYSBzcGVjaWZpYyBXUy1BZGRyZXNzaW5nIFZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFFOYW1lIG1lc3NhZ2VJRFRhZzsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIFJlbGF0ZXNUbyBRTmFtZSBpbiB0aGUgU09BUCBtZXNzYWdlIGZvciBhIHNwZWNpZmljIFdTLUFkZHJlc3NpbmcgVmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgcmVsYXRlc1RvVGFnOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgUU5hbWUgb2YgdGhlIGZhdWx0IGNvZGUgd2hlbiBhIHJlcXVpcmVkIGhlYWRlciByZXByZXNlbnRpbmcgYQorICAgICAqIFdTLUFkZHJlc3NpbmcgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBRTmFtZSBtYXBSZXF1aXJlZFRhZzsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIFFOYW1lIG9mIHRoZSBmYXVsdCBjb2RlIHdoZW4gQWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyBlbmRwb2ludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgYWN0aW9uTWlzbWF0Y2hUYWc7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBRTmFtZSBvZiB0aGUgZmF1bHQgY29kZSB3aGVuIEFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgZW5kcG9pbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFFOYW1lIGFjdGlvbk5vdFN1cHBvcnRlZFRhZzsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIHRleHQgb2YgdGhlIGZhdWx0IHdoZW4gQWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyBlbmRwb2ludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGFjdGlvbk5vdFN1cHBvcnRlZFRleHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBRTmFtZSBvZiB0aGUgZmF1bHQgY29kZSB3aGVuIGEgaGVhZGVyIHJlcHJlc2VudGluZyBhCisgICAgICogV1MtQWRkcmVzc2luZyBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgaW52YWxpZE1hcFRhZzsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIFFOYW1lIG9mIHRoZSBmYXVsdCBjb2RlIHdoZW4gYSBoZWFkZXIgcmVwcmVzZW50aW5nIGEKKyAgICAgKiBXUy1BZGRyZXNzaW5nIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBvY2N1cnMgZ3JlYXRlciB0aGFuIGV4cGVjdGVkIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgaW52YWxpZENhcmRpbmFsaXR5VGFnOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgUU5hbWUgb2YgdGhlIGZhdWx0IGNvZGUgd2hlbiBhIGhlYWRlciByZXByZXNlbnRpbmcgYW4KKyAgICAgKiBhZGRyZXNzIGlzIG5vdCB2YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgaW52YWxpZEFkZHJlc3NUYWc7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBRTmFtZSBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbnZleXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgICAqIG9uIHRoZSBwcmUtZGVmaW5lZCBXUy1BZGRyZXNzaW5nIGZhdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgcHJvYmxlbUhlYWRlclFOYW1lVGFnOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgUU5hbWUgb2YgdGhlIGVsZW1lbnQgdGhhdCBjb252ZXlzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICAgKiBpZiBBY3Rpb24gaXMgbm90IG1hdGNoaW5nIHdpdGggdGhhdCBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgcHJvYmxlbUFjdGlvblRhZzsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIFFOYW1lIG9mIHRoZSBoZWFkZXIgZWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gY2FwdHVyZSB0aGUgZmF1bHQgZGV0YWlsCisgICAgICogaWYgdGhlcmUgaXMgYSBmYXVsdCBwcm9jZXNzaW5nIFdTLUFkZHJlc3NpbmcgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5LiBUaGlzIGlzCisgICAgICogb25seSB1c2VkIGZvciBTT0FQIDEuMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgZmF1bHREZXRhaWxUYWc7CisKKyAgICAvKioKKyAgICAgKiBGYXVsdCBzdWItc3ViLWNvZGUgdGhhdCByZXByZXNlbnRzCisgICAgICogIlNwZWNpZmllcyB0aGF0IHRoZSBpbnZhbGlkIGhlYWRlciB3YXMgZXhwZWN0ZWQgdG8gYmUgYW4gRVBSIGJ1dCBkaWQgbm90IGNvbnRhaW4gYW4gW2FkZHJlc3NdLiIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUU5hbWUgZmF1bHRfbWlzc2luZ0FkZHJlc3NJbkVwcjsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIEFjdGlvbiBRTmFtZSBpbiB0aGUgV1NETCBmb3IgYSBzcGVjaWZpYyBXUy1BZGRyZXNzaW5nIFZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFFOYW1lIHdzZGxBY3Rpb25UYWc7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBXU0RMIGV4dGVuc2lvbiBRTmFtZSBmb3IgYSBzcGVjaWZpYyBXUy1BZGRyZXNzaW5nIFZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFFOYW1lIHdzZGxFeHRlbnNpb25UYWc7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBXU0RMIGFub255bW91cyBRTmFtZSBmb3IgYSBzcGVjaWZpYyBXUy1BZGRyZXNzaW5nIFZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFFOYW1lIHdzZGxBbm9ueW1vdXNUYWc7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBRTmFtZSBvZiB0aGUgcmVmZXJlbmNlIHBhcmFtZXRlciBpbiBhIFNPQVAgbWVzc2FnZS4gVGhpcyBpcworICAgICAqIG9ubHkgdmFsaWQgZm9yIFczQyBXUy1BZGRyZXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBRTmFtZSBpc1JlZmVyZW5jZVBhcmFtZXRlclRhZzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRFRF9GQVVMVF9OQU1FU1BBQ0UgPSAiaHR0cDovL2pheC13cy5kZXYuamF2YS5uZXQvYWRkcmVzc2luZy9mYXVsdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TRVRfT1VUUFVUX0FDVElPTiA9ICJodHRwOi8vamF4LXdzLmRldi5qYXZhLm5ldC9hZGRyZXNzaW5nL291dHB1dC1hY3Rpb24tbm90LXNldCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TRVRfSU5QVVRfQUNUSU9OID0gImh0dHA6Ly9qYXgtd3MuZGV2LmphdmEubmV0L2FkZHJlc3NpbmcvaW5wdXQtYWN0aW9uLW5vdC1zZXQiOworCisgICAgLyoqCisgICAgICogRmF1bHQgc3ViLXN1Yi1jb2RlIHRoYXQgcmVwcmVzZW50cyBkdXBsaWNhdGUgJmx0O0FkZHJlc3M+IGVsZW1lbnQgaW4gRVBSLgorICAgICAqIFRoaXMgaXMgYSBmYXVsdCBjb2RlIG5vdCBkZWZpbmVkIGluIHRoZSBzcGVjLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgZmF1bHRfZHVwbGljYXRlQWRkcmVzc0luRXByID0gbmV3IFFOYW1lKAorICAgICAgICBFWFRFTkRFRF9GQVVMVF9OQU1FU1BBQ0UsICJEdXBsaWNhdGVBZGRyZXNzSW5FcHIiCisgICAgKTsKKworICAgIHByaXZhdGUgQWRkcmVzc2luZ1ZlcnNpb24oU3RyaW5nIG5zVXJpLCBTdHJpbmcgYW5vbnltb3VzRXByU3RyaW5nLCBTdHJpbmcgd3NkbE5zVXJpLCBTdHJpbmcgcG9saWN5TnNVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW5vbnltb3VzVXJpLCBTdHJpbmcgbm9uZVVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUiBlcHJUeXBlICkgeworICAgICAgICB0aGlzLm5zVXJpID0gbnNVcmk7CisgICAgICAgIHRoaXMud3NkbE5zVXJpID0gd3NkbE5zVXJpOworICAgICAgICB0aGlzLnBvbGljeU5zVXJpID0gcG9saWN5TnNVcmk7CisgICAgICAgIHRoaXMuYW5vbnltb3VzVXJpID0gYW5vbnltb3VzVXJpOworICAgICAgICB0aGlzLm5vbmVVcmkgPSBub25lVXJpOworICAgICAgICB0b1RhZyA9IG5ldyBRTmFtZShuc1VyaSwiVG8iKTsKKyAgICAgICAgZnJvbVRhZyA9IG5ldyBRTmFtZShuc1VyaSwiRnJvbSIpOworICAgICAgICByZXBseVRvVGFnID0gbmV3IFFOYW1lKG5zVXJpLCJSZXBseVRvIik7CisgICAgICAgIGZhdWx0VG9UYWcgPSBuZXcgUU5hbWUobnNVcmksIkZhdWx0VG8iKTsKKyAgICAgICAgYWN0aW9uVGFnID0gbmV3IFFOYW1lKG5zVXJpLCJBY3Rpb24iKTsKKyAgICAgICAgbWVzc2FnZUlEVGFnID0gbmV3IFFOYW1lKG5zVXJpLCJNZXNzYWdlSUQiKTsKKyAgICAgICAgcmVsYXRlc1RvVGFnID0gbmV3IFFOYW1lKG5zVXJpLCJSZWxhdGVzVG8iKTsKKworICAgICAgICBtYXBSZXF1aXJlZFRhZyA9IG5ldyBRTmFtZShuc1VyaSxnZXRNYXBSZXF1aXJlZExvY2FsTmFtZSgpKTsKKyAgICAgICAgYWN0aW9uTWlzbWF0Y2hUYWcgPSBuZXcgUU5hbWUobnNVcmksZ2V0QWN0aW9uTWlzbWF0Y2hMb2NhbE5hbWUoKSk7CisgICAgICAgIGFjdGlvbk5vdFN1cHBvcnRlZFRhZyA9IG5ldyBRTmFtZShuc1VyaSwiQWN0aW9uTm90U3VwcG9ydGVkIik7CisgICAgICAgIGFjdGlvbk5vdFN1cHBvcnRlZFRleHQgPSAiVGhlIFwiJXNcIiBjYW5ub3QgYmUgcHJvY2Vzc2VkIGF0IHRoZSByZWNlaXZlciI7CisgICAgICAgIGludmFsaWRNYXBUYWcgPSBuZXcgUU5hbWUobnNVcmksZ2V0SW52YWxpZE1hcExvY2FsTmFtZSgpKTsKKyAgICAgICAgaW52YWxpZEFkZHJlc3NUYWcgPSBuZXcgUU5hbWUobnNVcmksZ2V0SW52YWxpZEFkZHJlc3NMb2NhbE5hbWUoKSk7CisgICAgICAgIGludmFsaWRDYXJkaW5hbGl0eVRhZyA9IG5ldyBRTmFtZShuc1VyaSxnZXRJbnZhbGlkQ2FyZGluYWxpdHlMb2NhbE5hbWUoKSk7CisgICAgICAgIGZhdWx0RGV0YWlsVGFnID0gbmV3IFFOYW1lKG5zVXJpLCJGYXVsdERldGFpbCIpOworCisgICAgICAgIHByb2JsZW1IZWFkZXJRTmFtZVRhZyA9IG5ldyBRTmFtZShuc1VyaSwiUHJvYmxlbUhlYWRlclFOYW1lIik7CisgICAgICAgIHByb2JsZW1BY3Rpb25UYWcgPSBuZXcgUU5hbWUobnNVcmksICJQcm9ibGVtQWN0aW9uIik7CisKKyAgICAgICAgZmF1bHRfbWlzc2luZ0FkZHJlc3NJbkVwciA9IG5ldyBRTmFtZShuc1VyaSwiTWlzc2luZ0FkZHJlc3NJbkVQUiIsIndzYSIpOworICAgICAgICBpc1JlZmVyZW5jZVBhcmFtZXRlclRhZyA9IG5ldyBRTmFtZShuc1VyaSxnZXRJc1JlZmVyZW5jZVBhcmFtZXRlckxvY2FsTmFtZSgpKTsKKworICAgICAgICB3c2RsQWN0aW9uVGFnID0gbmV3IFFOYW1lKHdzZGxOc1VyaSwiQWN0aW9uIik7CisgICAgICAgIHdzZGxFeHRlbnNpb25UYWcgPSBuZXcgUU5hbWUod3NkbE5zVXJpLCAiVXNpbmdBZGRyZXNzaW5nIik7CisgICAgICAgIHdzZGxBbm9ueW1vdXNUYWcgPSBuZXcgUU5hbWUod3NkbE5zVXJpLCBnZXRXc2RsQW5vbnltb3VzTG9jYWxOYW1lKCkpOworCisgICAgICAgIC8vIGNyZWF0ZSBzdG9jayBhbm9ueW1vdXMgRVBSCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLmFub255bW91c0VwciA9IG5ldyBXU0VuZHBvaW50UmVmZXJlbmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShhbm9ueW1vdXNFcHJTdHJpbmcuZ2V0Qnl0ZXMoKSksdGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7IC8vIGJ1ZyBpbiBvdXIgY29kZSBhcyBFUFIgc2hvdWxkIHBhcnNlLgorICAgICAgICB9CisgICAgICAgIHRoaXMuZXByVHlwZSA9IGVwclR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG9jYWwgbmFtZSBvZiB0aGUgZmF1bHQgd2hlbiBhIGhlYWRlciByZXByZXNlbnRpbmcgYSBXUy1BZGRyZXNzaW5nIEFjdGlvbiBpcyBub3Qgc2FtZSBhcyBTT0FQQWN0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxvY2FsIG5hbWUKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGFic3RyYWN0IFN0cmluZyBnZXRBY3Rpb25NaXNtYXRjaExvY2FsTmFtZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGxpbmsgQWRkcmVzc2luZ1ZlcnNpb259IHdob3NlIHtAbGluayAjbnNVcml9IGVxdWFscyB0bworICAgICAqIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIGlucHV0IHN0cmluZyB2YWxpZGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5zVXJpCisgICAgICogICAgICBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqIEByZXR1cm4gYWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2luZ1ZlcnNpb24gZnJvbU5zVXJpKFN0cmluZyBuc1VyaSkgeworICAgICAgICBpZiAobnNVcmkuZXF1YWxzKFczQy5uc1VyaSkpCisgICAgICAgICAgICByZXR1cm4gVzNDOworCisgICAgICAgIGlmIChuc1VyaS5lcXVhbHMoTUVNQkVSLm5zVXJpKSkKKyAgICAgICAgICAgIHJldHVybiBNRU1CRVI7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIEFkZHJlc3NpbmdWZXJzaW9ufSBmcm9tIGEge0BsaW5rIFdTQmluZGluZ30KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nIFdTREwgYmluZGluZworICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgYWRkcmVzaW5nIHZlcnNpb24gZW5hYmxlZCwgb3IgbnVsbCBpZiBub25lIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATnVsbGFibGUKKyAgICBBZGRyZXNzaW5nVmVyc2lvbiBmcm9tQmluZGluZyhXU0JpbmRpbmcgYmluZGluZykgeworICAgICAgICAvLyBUT0RPOiB3aG8gaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyBhbiBlcnJvciBpZiBib3RoIHZlcnNpb25zCisgICAgICAgIC8vIGFyZSBvbj8KKyAgICAgICAgaWYgKGJpbmRpbmcuaXNGZWF0dXJlRW5hYmxlZChBZGRyZXNzaW5nRmVhdHVyZS5jbGFzcykpCisgICAgICAgICAgICByZXR1cm4gVzNDOworCisgICAgICAgIGlmIChiaW5kaW5nLmlzRmVhdHVyZUVuYWJsZWQoTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmNsYXNzKSkKKyAgICAgICAgICAgIHJldHVybiBNRU1CRVI7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIEFkZHJlc3NpbmdWZXJzaW9ufSBmcm9tIGEge0BsaW5rIFdTRExQb3J0fQorICAgICAqCisgICAgICogQHBhcmFtIHBvcnQgV1NETCBwb3J0CisgICAgICogQHJldHVybiBhZGRyZXNpbmcgdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2luZ1ZlcnNpb24gZnJvbVBvcnQoV1NETFBvcnQgcG9ydCkgeworICAgICAgICBpZiAocG9ydCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgV2ViU2VydmljZUZlYXR1cmUgd3NmID0gcG9ydC5nZXRGZWF0dXJlKEFkZHJlc3NpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgaWYgKHdzZiA9PSBudWxsKSB7CisgICAgICAgICAgICB3c2YgPSBwb3J0LmdldEZlYXR1cmUoTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3NmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gZnJvbUZlYXR1cmUod3NmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayAjbnNVcml9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAbGluayBBZGRyZXNzaW5nVmVyc2lvbn0KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmFtZXNwYWNlIFVSSQorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNuc1VyaX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROc1VyaSgpIHsKKyAgICAgICAgcmV0dXJuIG5zVXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbG9jYWwgbmFtZSBpcyBjb25zaWRlcmVkIGFzCisgICAgICogYSByZWZlcmVuY2UgcGFyYW1ldGVyIGluIEVQUi4KKyAgICAgKgorICAgICAqIEZvciBXM0MsIHRoaXMgbWVhbnMgIlJlZmVyZW5jZVBhcmFtZXRlcnMiLAorICAgICAqIGFuZCBmb3IgdGhlIG1lbWJlciBzdWJtaXNzaW9uIHZlcnNpb24sIHRoaXMgbWVhbnMKKyAgICAgKiBlaXRoZXIgIlJlZmVyZW5jZVBhcmFtZXRlcnMiIG9yICJSZWZlcmVuY2VQcm9wZXJ0aWVzIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlZmVyZW5jZVBhcmFtZXRlcihTdHJpbmcgbG9jYWxOYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgV3NhVHViZUhlbHBlciBmb3IgdGhlIFdTLUFkZHJlc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVkIGJ5IDxjb2RlPmJpbmRpbmc8L2NvZGU+CisgICAgICoge0BsaW5rIFdTQmluZGluZ30gYW5kIGZvciB0aGUge0BsaW5rIFdTRExQb3J0fSBwb3J0LgorICAgICAqCisgICAgICogQHJldHVybiBXUy1BIHZlcnNpb24gc3BlY2lmaWMgaGVscGVyCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFdzYVR1YmVIZWxwZXIgZ2V0V3NhSGVscGVyKFdTRExQb3J0IHdzZGxQb3J0LCBTRUlNb2RlbCBzZWlNb2RlbCwgV1NCaW5kaW5nIGJpbmRpbmcpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbm9uZSBVUkkgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgV1MtQWRkcmVzc2luZyB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHJldHVybiBub25lIFVSSSB2YWx1ZQorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNub25lVXJpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5vbmVVcmkoKSB7CisgICAgICAgIHJldHVybiBub25lVXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFub255bW91cyBVUkkgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgV1MtQWRkcmVzc2luZyB2ZXJzaW9uLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFVzZSB7QGxpbmsgI2Fub255bW91c1VyaX0KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFub255bW91c1VyaSgpIHsKKyAgICAgICAgcmV0dXJuIGFub255bW91c1VyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGZhdWx0IEFjdGlvbiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBXUy1BZGRyZXNzaW5nIHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRlZmF1bHQgZmF1bHQgQWN0aW9uIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0RmF1bHRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBuc1VyaSArICIvZmF1bHQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGZhdWx0IHdoZW4gYSBoZWFkZXIgcmVwcmVzZW50aW5nIGEgV1MtQWRkcmVzc2luZyBNZXNzYWdlCisgICAgICogQWRkcmVzaW5nIFByb3BlcnR5IGlzIGFic2VudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbG9jYWwgbmFtZQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYWJzdHJhY3QgU3RyaW5nIGdldE1hcFJlcXVpcmVkTG9jYWxOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IHdoZW4gYSByZXF1aXJlZCBXUy1BZGRyZXNzaW5nIGhlYWRlciByZXByZXNlbnRpbmcgYQorICAgICAqIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBhYnNlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE1hcFJlcXVpcmVkVGV4dCgpOworCisgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGZhdWx0IHdoZW4gYSBoZWFkZXIgcmVwcmVzZW50aW5nIGFuYWRkcmVzcyBpcyBpbnZhbGlkLgorICAgICAgICAgKiBAcmV0dXJuIGxvY2FsIG5hbWUKKyAgICAgICAgICovCisgICAgLyogcGFja2FnZSAqLyBhYnN0cmFjdCBTdHJpbmcgZ2V0SW52YWxpZEFkZHJlc3NMb2NhbE5hbWUoKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG9jYWwgbmFtZSBvZiB0aGUgZmF1bHQgd2hlbiBhIGhlYWRlciByZXByZXNlbnRpbmcgYSBXUy1BZGRyZXNzaW5nIE1lc3NhZ2UKKyAgICAgKiBBZGRyZXNpbmcgUHJvcGVydHkgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbG9jYWwgbmFtZQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYWJzdHJhY3QgU3RyaW5nIGdldEludmFsaWRNYXBMb2NhbE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlc2NyaXB0aW9uIHRleHQgd2hlbiBhIGhlYWRlciByZXByZXNlbnRpbmcgYSBXUy1BZGRyZXNzaW5nCisgICAgICogTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEludmFsaWRNYXBUZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBmYXVsdCB3aGVuIGEgaGVhZGVyIHJlcHJlc2VudGluZyBhIFdTLUFkZHJlc3NpbmcgTWVzc2FnZQorICAgICAqIEFkZHJlc2luZyBQcm9wZXJ0eSBvY2N1cnMgZ3JlYXRlciB0aGFuIGV4cGVjdGVkIG51bWJlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbG9jYWwgbmFtZQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYWJzdHJhY3QgU3RyaW5nIGdldEludmFsaWRDYXJkaW5hbGl0eUxvY2FsTmFtZSgpOworCisgICAgLyogcGFja2FnZSAqLyBhYnN0cmFjdCBTdHJpbmcgZ2V0V3NkbEFub255bW91c0xvY2FsTmFtZSgpOworCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmaXgoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0V3NkbFByZWZpeCgpOworCisgICAgcHVibGljIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZT4gZ2V0RmVhdHVyZUNsYXNzKCk7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBvdXRib3VuZCB7QGxpbmsgSGVhZGVyfSBmcm9tIGEgcmVmZXJlbmNlIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBhYnN0cmFjdCBIZWFkZXIgY3JlYXRlUmVmZXJlbmNlUGFyYW1ldGVySGVhZGVyKFhNTFN0cmVhbUJ1ZmZlciBtYXJrLCBTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG9jYWwgbmFtZSBmb3Igd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHZhbGlkCisgICAgICogdmFsdWUgb25seSB2YWxpZCBmb3IgVzNDIFdTLUFkZHJlc3NpbmcuIEZvciBNZW1iZXIgU3VibWlzc2lvbiBXUy1BZGRyZXNzaW5nLCB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgbnVsbC4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBhYnN0cmFjdCBTdHJpbmcgZ2V0SXNSZWZlcmVuY2VQYXJhbWV0ZXJMb2NhbE5hbWUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc2luZ1ZlcnNpb24gZnJvbUZlYXR1cmUoV2ViU2VydmljZUZlYXR1cmUgYWYpIHsKKyAgICAgICAgaWYgKGFmLmdldElEKCkuZXF1YWxzKEFkZHJlc3NpbmdGZWF0dXJlLklEKSkKKyAgICAgICAgICAgIHJldHVybiBXM0M7CisgICAgICAgIGVsc2UgaWYgKGFmLmdldElEKCkuZXF1YWxzKE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5JRCkpCisgICAgICAgICAgICByZXR1cm4gTUVNQkVSOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgV2ViU2VydmljZUZlYXR1cmV9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hbWVzcGFjZSBVUkkgb2YKKyAgICAgKiBXUy1BZGRyZXNzaW5nIHBvbGljeSBhc3NlcnRpb24gaW4gdGhlIFdTREwuIDxjb2RlPmVuYWJsZWQ8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSB2YWx1ZSBvZiB0aGUgZmVhdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuc1VyaSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBXUy1BZGRyZXNzaW5nIHBvbGljeSBhc3NlcnRpb24gaW4gdGhlIFdTREwKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIGlmIGZlYXR1cmUgaXMgdG8gYmUgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIHJlcXVpcmVkIHRydWUgaWYgZmVhdHVyZSBpcyByZXF1aXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLiBDb3JyZXNwb25kcworICAgICAqICAgICAgICAgIHRvIHdzZGw6cmVxdWlyZWQgb24gdGhlIGV4dGVuc2lvbi9hc3NlcnRpb24uCisgICAgICogQHJldHVybiBXZWJTZXJ2aWNlRmVhdHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBhc3NlcnRpb24gbmFtZXNwYWNlIFVSSQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBpZiBhbiB1bnN1cHBvcnRlZCBuYW1lc3BhY2UgVVJJIGlzIHBhc3NlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQE5vdE51bGwgV2ViU2VydmljZUZlYXR1cmUgZ2V0RmVhdHVyZShTdHJpbmcgbnNVcmksIGJvb2xlYW4gZW5hYmxlZCwgYm9vbGVhbiByZXF1aXJlZCkgeworICAgICAgICBpZiAobnNVcmkuZXF1YWxzKFczQy5wb2xpY3lOc1VyaSkpCisgICAgICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3NpbmdGZWF0dXJlKGVuYWJsZWQsIHJlcXVpcmVkKTsKKyAgICAgICAgZWxzZSBpZiAobnNVcmkuZXF1YWxzKE1FTUJFUi5wb2xpY3lOc1VyaSkpCisgICAgICAgICAgICByZXR1cm4gbmV3IE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZShlbmFibGVkLCByZXF1aXJlZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBuYW1lc3BhY2UgVVJJOiAiICsgbnNVcmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFkZHJlc3NpbmdWZXJzaW9ufSBpbnN0YW5jZSBmcm9tIHRoZQorICAgICAqIEVQUiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIEFkZHJlc3NpbmdWZXJzaW9uIGZyb21TcGVjQ2xhc3MoQ2xhc3M8PyBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBlcHJDbGFzcykgeworICAgICAgICBpZihlcHJDbGFzcz09VzNDRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gVzNDOworICAgICAgICBpZihlcHJDbGFzcz09TWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIE1FTUJFUjsKKyAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlVuc3VwcG9ydGVkIEVQUiB0eXBlOiAiK2VwckNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFdlYlNlcnZpY2VGZWF0dXJlIGlzIGVpdGhlciBhIHtAbGluayBBZGRyZXNzaW5nRmVhdHVyZX0gb3IKKyAgICAgKiB7QGxpbmsgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlfSBhbmQgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3NmIFRoZSBXZWJTZXJ2aWNlRmVhdHVyZSBlbmNhcHMKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gaWYgPGNvZGU+d3NmPC9jb2RlPiBkb2VzIG5vdCBjb250YWluIGVpdGhlciB7QGxpbmsgQWRkcmVzc2luZ0ZlYXR1cmV9IG9yCisgICAgICoge0BsaW5rIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZX0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+d3NmPC9jb2RlPiByZXF1aXJlcyBXUy1BZGRyZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVxdWlyZWQoV2ViU2VydmljZUZlYXR1cmUgd3NmKSB7CisgICAgICAgIGlmICh3c2YuZ2V0SUQoKS5lcXVhbHMoQWRkcmVzc2luZ0ZlYXR1cmUuSUQpKSB7CisgICAgICAgICAgICByZXR1cm4gKChBZGRyZXNzaW5nRmVhdHVyZSl3c2YpLmlzUmVxdWlyZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmICh3c2YuZ2V0SUQoKS5lcXVhbHMoTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLklEKSkgeworICAgICAgICAgICAgcmV0dXJuICgoTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKXdzZikuaXNSZXF1aXJlZCgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJXZWJTZXJ2aWNlRmVhdHVyZSBub3QgYW4gQWRkcmVzc2luZyBmZWF0dXJlOiAiKyB3c2YuZ2V0SUQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPmJpbmRpbmc8L2NvZGU+IGNvbnRhaW5zIGVpdGhlciBhIHtAbGluayBBZGRyZXNzaW5nRmVhdHVyZX0gb3IKKyAgICAgKiB7QGxpbmsgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlfSBhbmQgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyBUaGUgYmluZGluZworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5iaW5kaW5nPC9jb2RlPiByZXF1aXJlcyBXUy1BZGRyZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVxdWlyZWQoV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgYWYgPSBiaW5kaW5nLmdldEZlYXR1cmUoQWRkcmVzc2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBpZiAoYWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhZi5pc1JlcXVpcmVkKCk7CisgICAgICAgIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSBtc2FmID0gYmluZGluZy5nZXRGZWF0dXJlKE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGlmKG1zYWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBtc2FmLmlzUmVxdWlyZWQoKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPmJpbmRpbmc8L2NvZGU+IGNvbnRhaW5zIGVpdGhlciBhIHtAbGluayBBZGRyZXNzaW5nRmVhdHVyZX0gb3IKKyAgICAgKiB7QGxpbmsgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlfSBhbmQgaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nIFRoZSBiaW5kaW5nCisgICAgICogQHJldHVybiB0cnVlIGlmIFdTLUFkZHJlc3NpbmcgaXMgZW5hYmxlZCBmb3IgPGNvZGU+YmluZGluZzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZChXU0JpbmRpbmcgYmluZGluZykgeworICAgICAgICByZXR1cm4gYmluZGluZy5pc0ZlYXR1cmVFbmFibGVkKE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5jbGFzcykgfHwKKyAgICAgICAgICAgICAgICBiaW5kaW5nLmlzRmVhdHVyZUVuYWJsZWQoQWRkcmVzc2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgRVBSIHsKKyAgICAgICAgcHVibGljIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gZXByQ2xhc3M7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgYWRkcmVzczsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZTsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwb3J0TmFtZTsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwb3J0VHlwZU5hbWU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVmZXJlbmNlUGFyYW1ldGVyczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVsZW1lbnQgdW5kZXIgd2hpY2ggbWV0YWRhdGEgaXMgc3BlY2lmaWVkLgorICAgICAgICAgKiBJbiBXM0MsIGl0IGlzIHdzYTpNZXRhZGF0YQorICAgICAgICAgKiBJbiBNZW1iZXIsIGl0IGlzIGRpcmVjdGx5IHVuZGVyIG1leDpNZXRhZGF0YVNlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBRTmFtZSB3c2RsTWV0YWRhdGE7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVmZXJlbmNlUHJvcGVydGllczsKKworICAgICAgICBwdWJsaWMgRVBSKENsYXNzPD8gZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gZXByQ2xhc3MsIFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBwb3J0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSwgUU5hbWUgd3NkbE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlUGFyYW1ldGVycywgU3RyaW5nIHJlZmVyZW5jZVByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIHRoaXMuZXByQ2xhc3MgPSBlcHJDbGFzczsKKyAgICAgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7CisgICAgICAgICAgICB0aGlzLnBvcnRUeXBlTmFtZSA9IHBvcnRUeXBlTmFtZTsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9IHJlZmVyZW5jZVBhcmFtZXRlcnM7CisgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVByb3BlcnRpZXMgPSByZWZlcmVuY2VQcm9wZXJ0aWVzOworICAgICAgICAgICAgdGhpcy53c2RsTWV0YWRhdGEgPSB3c2RsTWV0YWRhdGE7CisKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2FkZHJlc3NpbmcvRVBSSGVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9FUFJIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzdiYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2FkZHJlc3NpbmcvRVBSSGVhZGVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZzsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5BYnN0cmFjdEhlYWRlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OworCisvKioKKyAqIFVzZWQgdG8gcmVwcmVzZW50IG91dGJvdW5kIGVuZHBvaW50IHJlZmVyZW5jZSBoZWFkZXIsCisgKiBzdWNoIGFzICZsdDtSZXBseVRvPiBhbmQgJmx0O0ZhdWx0VG8+LgorICogVXNlZCBmcm9tIHtAbGluayBXU0VuZHBvaW50UmVmZXJlbmNlfS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAc2VlIFdTRW5kcG9pbnRSZWZlcmVuY2UKKyAqLworZmluYWwgY2xhc3MgRVBSSGVhZGVyIGV4dGVuZHMgQWJzdHJhY3RIZWFkZXJJbXBsIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5zVXJpLGxvY2FsTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFdTRW5kcG9pbnRSZWZlcmVuY2UgZXByOworCisgICAgRVBSSGVhZGVyKFFOYW1lIHRhZ05hbWUsIFdTRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7CisgICAgICAgIHRoaXMubnNVcmkgPSB0YWdOYW1lLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IHRhZ05hbWUuZ2V0TG9jYWxQYXJ0KCk7CisgICAgICAgIHRoaXMuZXByID0gZXByOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gbnNVcmk7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbE5hbWU7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoQE5vdE51bGwgU3RyaW5nIG5zVXJpLCBATm90TnVsbCBTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgc3IgPSBlcHIucmVhZCgiRW5kcG9pbnRSZWZlcmVuY2UiLypkb2Vzbid0IG1hdHRlciovKTsKKyAgICAgICAgICAgIHdoaWxlKHNyLmdldEV2ZW50VHlwZSgpIT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpCisgICAgICAgICAgICAgICAgc3IubmV4dCgpOworCisgICAgICAgICAgICByZXR1cm4gc3IuZ2V0QXR0cmlidXRlVmFsdWUobnNVcmksbG9jYWxOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSByZWFkaW5nIGZyb20gYnVmZmVyLCB0aGlzIGNhbid0IGhhcHBlbi4KKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZEhlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXByLnJlYWQobG9jYWxOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFhNTFN0cmVhbVdyaXRlciB3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgZXByLndyaXRlVG8obG9jYWxOYW1lLCB3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFNPQVBNZXNzYWdlIHNhYWopIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRPRE8gd2hhdCBhYm91dCBpbi1zY29wZSBuYW1lc3BhY2VzCisgICAgICAgICAgICAvLyBOb3QgdmVyeSBlZmZpY2llbnQgY29uc2lkZXIgaW1wbGVtZW50aW5nIGEgc3RyZWFtIGJ1ZmZlcgorICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRoYXQgcHJvZHVjZXMgYSBET00gbm9kZSBmcm9tIHRoZSBidWZmZXIuCisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0ID0gWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICAgICAgdC50cmFuc2Zvcm0oZXByLmFzU291cmNlKGxvY2FsTmFtZSksIG5ldyBET01SZXN1bHQoc2Fhai5nZXRTT0FQSGVhZGVyKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGVwci53cml0ZVRvKGxvY2FsTmFtZSxjb250ZW50SGFuZGxlcixlcnJvckhhbmRsZXIsdHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2FkZHJlc3NpbmcvT25lV2F5RmVhdHVyZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2FkZHJlc3NpbmcvT25lV2F5RmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiY2VjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9PbmVXYXlGZWF0dXJlLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZzsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5GZWF0dXJlQ29uc3RydWN0b3I7CisKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7CisKKy8qKgorICogVW5zdXBwb3J0ZWQgUkkgZXh0ZW5zaW9uIHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIGluIFdTSVQuCisgKgorICogPHA+CisgKiA8Yj5UaGlzIGZlYXR1cmUgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgYSBjb21tb24gV2ViIHNlcnZpY2UgZGV2ZWxvcGVyPC9iPiBhcyB0aGVyZQorICogaXMgbm8gbmVlZCB0byBzZW5kIHRoZSBhYm92ZSBtZW50aW9uZWQgaGVhZGVyIGZvciBhIG9uZS13YXkgb3BlcmF0aW9uLiBCdXQgdGhlc2UKKyAqIHByb3BlcnRpZXMgbWF5IG5lZWQgdG8gYmUgc2VudCBpbiBjZXJ0YWluIG1pZGRsZXdhcmUgV2ViIHNlcnZpY2VzLgorICoKKyAqIDxwPgorICogVGhpcyBmZWF0dXJlIGFsbG93cyBSZXBseVRvLCBGcm9tIGFuZCBSZWxhdGVzVG8gTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnRpZXMKKyAqIHRvIGJlIGFkZGVkIGZvciBhbGwgbWVzc2FnZXMgdGhhdCBhcmUgc2VudCBmcm9tIHRoZSBwb3J0IGNvbmZpZ3VyZWQgd2l0aAorICogdGhpcyBhbm5vdGF0aW9uLiBBbGwgb3BlcmF0aW9ucyBhcmUgYXNzdW1lZCB0byBiZSBvbmUtd2F5LCBhbmQKKyAqIHRoaXMgZmVhdHVyZSBzaG91bGQgYmUgdXNlZCBmb3Igb25lLXdheQorICogb3BlcmF0aW9ucyBvbmx5LgorICoKKyAqIElmIGEgbm9uLW51bGwgUmVwbHlUbyBpcyBzcGVjaWZpZWQsIHRoZW4gTWVzc2FnZUlEIHByb3BlcnR5IGlzIGFsc28gYWRkZWQuCisgKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK3B1YmxpYyBjbGFzcyBPbmVXYXlGZWF0dXJlIGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmUgeworICAgIC8qKgorICAgICAqIENvbnN0YW50IHZhbHVlIGlkZW50aWZ5aW5nIHRoZSB7QGxpbmsgT25lV2F5RmVhdHVyZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXh3cy9hZGRyZXNzaW5nL29uZXdheSI7CisKKyAgICBwcml2YXRlIFdTRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbzsKKyAgICBwcml2YXRlIFdTRW5kcG9pbnRSZWZlcmVuY2UgZnJvbTsKKyAgICBwcml2YXRlIFN0cmluZyByZWxhdGVzVG9JRDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiB7QGxpbmsgT25lV2F5RmVhdHVyZX0uIFRoZSBpbnN0YW5jZSBjcmVhdGVkIHdpbGwgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT25lV2F5RmVhdHVyZSgpIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4ge0BsaW5rIE9uZVdheUZlYXR1cmV9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIGZlYXR1cmUgc2hvdWxkCisgICAgICogICAgICAgICAgICAgICAgYmUgZW5hYmxlZCBvciBub3QuCisgICAgICovCisgICAgcHVibGljIE9uZVdheUZlYXR1cmUoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIHtAbGluayBPbmVXYXlGZWF0dXJlfQorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBmZWF0dXJlIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gcmVwbHlUbyBzcGVjaWZpZXMgdGhlIHtAbGluayBXU0VuZHBvaW50UmVmZXJlbmNlfSBvZiB3c2E6UmVwbHlUbyBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIE9uZVdheUZlYXR1cmUoYm9vbGVhbiBlbmFibGVkLCBXU0VuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8pIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKyAgICAgICAgdGhpcy5yZXBseVRvID0gcmVwbHlUbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4ge0BsaW5rIE9uZVdheUZlYXR1cmV9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIGZlYXR1cmUgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LgorICAgICAqIEBwYXJhbSByZXBseVRvIHNwZWNpZmllcyB0aGUge0BsaW5rIFdTRW5kcG9pbnRSZWZlcmVuY2V9IG9mIHdzYTpSZXBseVRvIGhlYWRlci4KKyAgICAgKiBAcGFyYW0gZnJvbSBzcGVjaWZpZXMgdGhlIHtAbGluayBXU0VuZHBvaW50UmVmZXJlbmNlfSBvZiB3c2E6RnJvbSBoZWFkZXIuCisgICAgICogQHBhcmFtIHJlbGF0ZXNUbyBzcGVjaWZpZXMgdGhlIE1lc3NhZ2VJRCB0byBiZSB1c2VkIGZvciB3c2E6UmVsYXRlc1RvIGhlYWRlci4KKyAgICAgKi8KKyAgICBARmVhdHVyZUNvbnN0cnVjdG9yKHsiZW5hYmxlZCIsInJlcGx5VG8iLCJmcm9tIiwicmVsYXRlc1RvIn0pCisgICAgcHVibGljIE9uZVdheUZlYXR1cmUoYm9vbGVhbiBlbmFibGVkLCBXU0VuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8sIFdTRW5kcG9pbnRSZWZlcmVuY2UgZnJvbSwgU3RyaW5nIHJlbGF0ZXNUbykgeworICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICB0aGlzLnJlcGx5VG8gPSByZXBseVRvOworICAgICAgICB0aGlzLmZyb20gPSBmcm9tOworICAgICAgICB0aGlzLnJlbGF0ZXNUb0lEID0gcmVsYXRlc1RvOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0dGVyIGZvciB3c2E6UmVwbHlUbyBoZWFkZXIge0BsaW5rIFdTRW5kcG9pbnRSZWZlcmVuY2V9IC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGUgd3NhOlJlcGx5VG8gaGVhZGVyCisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UgZ2V0UmVwbHlUbygpIHsKKyAgICAgICAgcmV0dXJuIHJlcGx5VG87CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciB3c2E6UmVwbHlUbyBoZWFkZXIge0BsaW5rIFdTRW5kcG9pbnRSZWZlcmVuY2V9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBseVRvKFdTRW5kcG9pbnRSZWZlcmVuY2UgYWRkcmVzcykgeworICAgICAgICB0aGlzLnJlcGx5VG8gPSBhZGRyZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHRlciBmb3Igd3NhOkZyb20gaGVhZGVyIHtAbGluayBXU0VuZHBvaW50UmVmZXJlbmNlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGUgd3NhOkZyb20gaGVhZGVyCisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RnJvbSgpIHsKKyAgICAgICAgcmV0dXJuIGZyb207CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciB3c2E6RnJvbSBoZWFkZXIge0BsaW5rIFdTRW5kcG9pbnRSZWZlcmVuY2V9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3Mgb2YgdGhlIHdzYTpGcm9tIGhlYWRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oV1NFbmRwb2ludFJlZmVyZW5jZSBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMuZnJvbSA9IGFkZHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0dGVyIGZvciBNZXNzYWdlSUQgZm9yIHdzYTpSZWxhdGVzVG8gaGVhZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBhZGRyZXNzIG9mIHRoZSB3c2E6RmF1bHRUbyBoZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0ZXNUb0lEKCkgeworICAgICAgICByZXR1cm4gcmVsYXRlc1RvSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciBNZXNzYWdlSUQgZm9yIHdzYTpSZWxhdGVzVG8gaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRlc1RvSUQoU3RyaW5nIGlkKSB7CisgICAgICAgIHRoaXMucmVsYXRlc1RvSUQgPSBpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9PdXRib3VuZFJlZmVyZW5jZVBhcmFtZXRlckhlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2FkZHJlc3NpbmcvT3V0Ym91bmRSZWZlcmVuY2VQYXJhbWV0ZXJIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2FkZHJlc3NpbmcvT3V0Ym91bmRSZWZlcmVuY2VQYXJhbWV0ZXJIZWFkZXIuamF2YQpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuRmluYWxBcnJheUxpc3Q7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5BYnN0cmFjdEhlYWRlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWE1MU3RyZWFtV3JpdGVyRmlsdGVyOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxGaWx0ZXJJbXBsOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0udXRpbC5TdHJlYW1SZWFkZXJEZWxlZ2F0ZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKiBVc2VkIHRvIHJlcHJlc2VudCBvdXRib3VuZCBoZWFkZXIgY3JlYXRlZCBmcm9tIHtAbGluayBXU0VuZHBvaW50UmVmZXJlbmNlfSdzCisgKiByZWZlcmVuZWMgcGFyYW1ldGVycy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaXMgb3B0aW1pemVkIGZvciBvdXRib3VuZCB1c2UsIHNvIGl0IGltcGxlbWVudHMgc29tZSBvZiB0aGUgbWV0aG9kcyBsYXppbHksCisgKiBpbiBhIHNsb3cgd2F5LgorICoKKyAqIDxwPgorICogVGhpcyBoZWFkZXIgYWRkcyAid3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyIiBhbmQgdGh1cyBvbmx5IHVzZWQgZm9yIHRoZSBXM0MgdmVyc2lvbi4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2ZpbmFsIGNsYXNzIE91dGJvdW5kUmVmZXJlbmNlUGFyYW1ldGVySGVhZGVyIGV4dGVuZHMgQWJzdHJhY3RIZWFkZXJJbXBsIHsKKyAgICBwcml2YXRlIGZpbmFsIFhNTFN0cmVhbUJ1ZmZlciBpbmZvc2V0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5zVXJpLGxvY2FsTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRyaWJ1dGVzIG9uIHRoZSBoZWFkZXIgZWxlbWVudC4KKyAgICAgKiBMYXppbHkgcGFyc2VkLgorICAgICAqIE51bGwgaWYgbm90IHBhcnNlZCB5ZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaW5hbEFycmF5TGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXM7CisKKyAgICBPdXRib3VuZFJlZmVyZW5jZVBhcmFtZXRlckhlYWRlcihYTUxTdHJlYW1CdWZmZXIgaW5mb3NldCwgU3RyaW5nIG5zVXJpLCBTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIHRoaXMuaW5mb3NldCA9IGluZm9zZXQ7CisgICAgICAgIHRoaXMubnNVcmkgPSBuc1VyaTsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBuc1VyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgU3RyaW5nIGdldExvY2FsUGFydCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgaWYoYXR0cmlidXRlcz09bnVsbCkKKyAgICAgICAgICAgIHBhcnNlQXR0cmlidXRlcygpOworICAgICAgICBmb3IoaW50IGk9YXR0cmlidXRlcy5zaXplKCktMTsgaT49MDsgaS0tICkgeworICAgICAgICAgICAgQXR0cmlidXRlIGEgPSBhdHRyaWJ1dGVzLmdldChpKTsKKyAgICAgICAgICAgIGlmKGEubG9jYWxOYW1lLmVxdWFscyhsb2NhbE5hbWUpICYmIGEubnNVcmkuZXF1YWxzKG5zVXJpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYS52YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZSBkb24ndCByZWFsbHkgZXhwZWN0IHRoaXMgdG8gYmUgdXNlZCwgYnV0IGp1c3QgdG8gc2F0aXNmeQorICAgICAqIHRoZSB7QGxpbmsgSGVhZGVyfSBjb250cmFjdC4KKyAgICAgKgorICAgICAqIFNvIHRoaXMgaXMgcmF0aGVyIHNsb3cuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQXR0cmlidXRlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSByZWFkSGVhZGVyKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dFRhZygpOyAgIC8vIG1vdmUgdG8gdGhlIGZpcnN0IGVsZW1lbnQsIHdoaWNoIGlzIHRoZSBoZWFkZXIgZWxlbWVudAorCisgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEZpbmFsQXJyYXlMaXN0PEF0dHJpYnV0ZT4oKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaSk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGkpOworCisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IEF0dHJpYnV0ZShuYW1lc3BhY2VVUkksbG9jYWxOYW1lLHZhbHVlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdlIGFyZSBhZGRpbmcgb25lIG1vcmUgYXR0cmlidXRlICJ3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXIiCisgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgQXR0cmlidXRlKEFkZHJlc3NpbmdWZXJzaW9uLlczQy5uc1VyaSxJU19SRUZFUkVOQ0VfUEFSQU1FVEVSLFRSVUVfVkFMVUUpKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCB0aGUgYXR0cmlidXRlcyBmb3IgeyIrbnNVcmkrIn0iK2xvY2FsTmFtZSsiIGhlYWRlciIsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIHJlYWRIZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1SZWFkZXJEZWxlZ2F0ZShpbmZvc2V0LnJlYWRBc1hNTFN0cmVhbVJlYWRlcigpKSB7CisgICAgICAgICAgICBpbnQgc3RhdGU9MDsgLyogMDpleHBlY3Rpbmcgcm9vdCwgMTppbiByb290LCAyOnBhc3Qgcm9vdCAqLworICAgICAgICAgICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrKHN1cGVyLm5leHQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBjaGVjayhzdXBlci5uZXh0VGFnKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGludCBjaGVjayhpbnQgdHlwZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgaWYodHlwZT09U1RBUlRfRUxFTUVOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgc3RhdGU9MjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKKyAgICAgICAgICAgICAgICBpZihzdGF0ZT09MSkgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZUNvdW50KCkrMTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZUNvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpbmRleCkgeworICAgICAgICAgICAgICAgIGlmKHN0YXRlPT0xICYmIGluZGV4PT1zdXBlci5nZXRBdHRyaWJ1dGVDb3VudCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSVNfUkVGRVJFTkNFX1BBUkFNRVRFUjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZihzdGF0ZT09MSAmJiBpbmRleD09c3VwZXIuZ2V0QXR0cmlidXRlQ291bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NpbmdWZXJzaW9uLlczQy5uc1VyaTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZihzdGF0ZT09MSAmJiBpbmRleD09c3VwZXIuZ2V0QXR0cmlidXRlQ291bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ3c2EiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZVByZWZpeChpbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZShpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZihzdGF0ZT09MSAmJiBpbmRleD09c3VwZXIuZ2V0QXR0cmlidXRlQ291bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDREFUQSI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlVHlwZShpbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYoc3RhdGU9PTEgJiYgaW5kZXg9PXN1cGVyLmdldEF0dHJpYnV0ZUNvdW50KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFX1ZBTFVFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZVZhbHVlKGluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZU5hbWUoaW50IGluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYoc3RhdGU9PTEgJiYgaW5kZXg9PXN1cGVyLmdldEF0dHJpYnV0ZUNvdW50KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoQWRkcmVzc2luZ1ZlcnNpb24uVzNDLm5zVXJpLCBJU19SRUZFUkVOQ0VfUEFSQU1FVEVSLCAid3NhIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlTmFtZShpbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWVzcGFjZVVyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICAgICAgICAgIGlmKHN0YXRlPT0xICYmIGxvY2FsTmFtZS5lcXVhbHMoSVNfUkVGRVJFTkNFX1BBUkFNRVRFUikgJiYgbmFtZXNwYWNlVXJpLmVxdWFscyhBZGRyZXNzaW5nVmVyc2lvbi5XM0MubnNVcmkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRV9WQUxVRTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lc3BhY2VVcmksIGxvY2FsTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhYTUxTdHJlYW1Xcml0ZXIgdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGluZm9zZXQud3JpdGVUb1hNTFN0cmVhbVdyaXRlcihuZXcgWE1MU3RyZWFtV3JpdGVyRmlsdGVyKHcpIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiByb290PXRydWU7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7CisgICAgICAgICAgICAgICAgd3JpdGVBZGRlZEF0dHJpYnV0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBZGRlZEF0dHJpYnV0ZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmKCFyb290KSAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByb290PWZhbHNlOworICAgICAgICAgICAgICAgIHdyaXRlTmFtZXNwYWNlKCJ3c2EiLEFkZHJlc3NpbmdWZXJzaW9uLlczQy5uc1VyaSk7CisgICAgICAgICAgICAgICAgc3VwZXIud3JpdGVBdHRyaWJ1dGUoIndzYSIsQWRkcmVzc2luZ1ZlcnNpb24uVzNDLm5zVXJpLElTX1JFRkVSRU5DRV9QQVJBTUVURVIsVFJVRV9WQUxVRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKKyAgICAgICAgICAgICAgICB3cml0ZUFkZGVkQXR0cmlidXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIC8vVE9ETzogVmVyaWZ5IHdpdGggS0sgbGF0ZXIKKyAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHByZWZpeCBpcyBkZWNsYXJlZCBiZWZvcmUgd3JpdGluZyBzdGFydCBlbGVtZW50LgorICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJlZml4RGVjbGFyZWQgPSBpc1ByZWZpeERlY2xhcmVkKHByZWZpeCxuYW1lc3BhY2VVUkkpOworICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOworICAgICAgICAgICAgICAgIGlmKCFwcmVmaXhEZWNsYXJlZCAmJiAhcHJlZml4LmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCxuYW1lc3BhY2VVUkkpOworICAgICAgICAgICAgICAgIHdyaXRlQWRkZWRBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb257CisgICAgICAgICAgICAgICAgLy9UT0RPOiBWZXJpZnkgd2l0aCBLSyBsYXRlcgorICAgICAgICAgICAgICAgIGlmKGlzUHJlZml4RGVjbGFyZWQocHJlZml4LCBuYW1lc3BhY2VVUkkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vRG9udCB3cml0ZSBpdCBhZ2FpbiAsIGFzIGl0cyBhbHJlYWR5IGluIE5hbWVzcGFjZUNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBzdXBlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsbmFtZXNwYWNlVVJJKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUHJlZml4RGVjbGFyZWQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJLmVxdWFscyhnZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkpOworICAgICAgICAgICAgfQorICAgICAgICB9LHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU09BUE1lc3NhZ2Ugc2FhaikgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICAvL1RPRE86IFNBQUogcmV0dXJucyBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgU09BUEV4Y2VwdGlvbiwKKyAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBubyBTT0FQSGVhZGVyIGluIHRoZSBtZXNzYWdlLAorICAgICAgICAvLyB3aGljaCBsZWFkcyB0byBOUEUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFbGVtZW50IG5vZGUgPSAoRWxlbWVudClpbmZvc2V0LndyaXRlVG8oc2Fhai5nZXRTT0FQSGVhZGVyKCkpOworICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhBZGRyZXNzaW5nVmVyc2lvbi5XM0MubnNVcmksQWRkcmVzc2luZ1ZlcnNpb24uVzNDLmdldFByZWZpeCgpKyI6IitJU19SRUZFUkVOQ0VfUEFSQU1FVEVSLFRSVUVfVkFMVUUpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1CdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgY2xhc3MgRmlsdGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbCB7CisgICAgICAgICAgICBGaWx0ZXIoQ29udGVudEhhbmRsZXIgY2gpIHsgc2V0Q29udGVudEhhbmRsZXIoY2gpOyB9CisgICAgICAgICAgICBwcml2YXRlIGludCBkZXB0aD0wOworICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZihkZXB0aCsrPT0wKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBvbmUgbW9yZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRQcmVmaXhNYXBwaW5nKCJ3c2EiLEFkZHJlc3NpbmdWZXJzaW9uLlczQy5uc1VyaSk7CisgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHMyID0gbmV3IEF0dHJpYnV0ZXNJbXBsKGF0dHMpOworICAgICAgICAgICAgICAgICAgICBhdHRzMi5hZGRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbi5XM0MubnNVcmksCisgICAgICAgICAgICAgICAgICAgICAgICBJU19SRUZFUkVOQ0VfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgIndzYTpJc1JlZmVyZW5jZVBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ0RBVEEiLAorICAgICAgICAgICAgICAgICAgICAgICAgVFJVRV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIGF0dHMgPSBhdHRzMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lKTsKKyAgICAgICAgICAgICAgICBpZigtLWRlcHRoPT0wKQorICAgICAgICAgICAgICAgICAgICBzdXBlci5lbmRQcmVmaXhNYXBwaW5nKCJ3c2EiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZm9zZXQud3JpdGVUbyhuZXcgRmlsdGVyKGNvbnRlbnRIYW5kbGVyKSxlcnJvckhhbmRsZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogS2VlcCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYW4gYXR0cmlidXRlIG9uIHRoZSBoZWFkZXIgZWxlbWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbiBiZSBlbXB0eSBidXQgbmV2ZXIgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFN0cmluZyBuc1VyaTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUoU3RyaW5nIG5zVXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMubnNVcmkgPSBmaXhOdWxsKG5zVXJpKTsKKyAgICAgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnQgbnVsbCB0byAiIi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaXhOdWxsKFN0cmluZyBzKSB7CisgICAgICAgICAgICBpZihzPT1udWxsKSByZXR1cm4gIiI7CisgICAgICAgICAgICBlbHNlICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdlIHRoZSBwZXJmb3JtYW5jZSBwYXJhbm9pZCBwZW9wbGUgaW4gdGhlIEpBWC1XUyBSSSB0aGlua3MKKyAgICAgKiBzYXZpbmcgdGhyZWUgYnl0ZXMgaXMgd29ydGggd2hpbGUuLi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRV9WQUxVRSA9ICIxIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfUkVGRVJFTkNFX1BBUkFNRVRFUiA9ICJJc1JlZmVyZW5jZVBhcmFtZXRlciI7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9XU0VuZHBvaW50UmVmZXJlbmNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9XU0VuZHBvaW50UmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxNDY3MgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9hZGRyZXNzaW5nL1dTRW5kcG9pbnRSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDk1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLk11dGFibGVYTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXJSZXN1bHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXJTb3VyY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zYXguU0FYQnVmZmVyUHJvY2Vzc29yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuc3RheC5TdHJlYW1SZWFkZXJCdWZmZXJQcm9jZXNzb3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zdGF4LlN0cmVhbVdyaXRlckJ1ZmZlckNyZWF0b3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZVV0aWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5XM0NBZGRyZXNzaW5nQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcubW9kZWwuSW52YWxpZE1hcEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLnYyMDA0MDguTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlckxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkFkZHJlc3NpbmdNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuQ2xpZW50TWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLlByb3ZpZGVySW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkRPTVV0aWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWE1MU3RyZWFtV3JpdGVyRmlsdGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuV1NETENvbnN0YW50czsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7CitpbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgRVBSLgorICoKKyAqIDxwPgorICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIGltbXV0YWJsZSBhbmQgdGhyZWFkLXNhZmUuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQHNlZSBBZGRyZXNzaW5nVmVyc2lvbiNhbm9ueW1vdXNFcHIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdTRW5kcG9pbnRSZWZlcmVuY2UgeworICAgIHByaXZhdGUgZmluYWwgWE1MU3RyZWFtQnVmZmVyIGluZm9zZXQ7CisgICAgLyoqCisgICAgICogVmVyc2lvbiBvZiB0aGUgYWRkcmVzc2luZyBzcGVjLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQWRkcmVzc2luZ1ZlcnNpb24gdmVyc2lvbjsKKworICAgIC8qKgorICAgICAqIE1hcmtlZCBSZWZlcmVuY2UgcGFyYW1ldGVycyBpbnNpZGUgdGhpcyBFUFIuCisgICAgICoKKyAgICAgKiBQYXJzZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQuIGNhbiBiZSBlbXB0eSBidXQgbmV2ZXIgbnVsbC4KKyAgICAgKiBAc2VlICNwYXJzZSgpCisgICAgICovCisgICAgcHJpdmF0ZSBATm90TnVsbCBIZWFkZXJbXSByZWZlcmVuY2VQYXJhbWV0ZXJzOworICAgIHByaXZhdGUgQE5vdE51bGwgU3RyaW5nIGFkZHJlc3M7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGZyb20gdGhlIHNwZWMgdmVyc2lvbiBvZiB7QGxpbmsgRW5kcG9pbnRSZWZlcmVuY2V9LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIGRhdGEgY29udmVyc2lvbiwgc28gaXQncyBzbG93LgorICAgICAqIERvIG5vdCB1c2UgdGhpcyBtZXRob2QgaW4gYSBwZXJmb3JtYW5jZSBjcml0aWNhbCBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBXU0VuZHBvaW50UmVmZXJlbmNlKEVuZHBvaW50UmVmZXJlbmNlIGVwciwgQWRkcmVzc2luZ1ZlcnNpb24gdmVyc2lvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciB4c2IgPSBuZXcgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcigpOworICAgICAgICAgICAgZXByLndyaXRlVG8obmV3IFhNTFN0cmVhbUJ1ZmZlclJlc3VsdCh4c2IpKTsKKyAgICAgICAgICAgIHRoaXMuaW5mb3NldCA9IHhzYjsKKyAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgICAgICBwYXJzZSgpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQ2xpZW50TWVzc2FnZXMuRkFJTEVEX1RPX1BBUlNFX0VQUihlcHIpLGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBmcm9tIHRoZSBzcGVjIHZlcnNpb24gb2Yge0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBkYXRhIGNvbnZlcnNpb24sIHNvIGl0J3Mgc2xvdy4KKyAgICAgKiBEbyBub3QgdXNlIHRoaXMgbWV0aG9kIGluIGEgcGVyZm9ybWFuY2UgY3JpdGljYWwgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV1NFbmRwb2ludFJlZmVyZW5jZShFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgdGhpcyhlcHIsQWRkcmVzc2luZ1ZlcnNpb24uZnJvbVNwZWNDbGFzcyhlcHIuZ2V0Q2xhc3MoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgV1NFbmRwb2ludFJlZmVyZW5jZX0gdGhhdCB3cmFwcyBhIGdpdmVuIGluZm9zZXQuCisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UoWE1MU3RyZWFtQnVmZmVyIGluZm9zZXQsIEFkZHJlc3NpbmdWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuaW5mb3NldCA9IGluZm9zZXQ7CisgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICAgICAgcGFyc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FuIG5ldmVyIGhhcHBlbiBiZWNhdXNlIFhNTFN0cmVhbUJ1ZmZlciBuZXZlciBoYXMgdW5kZXJseWluZyBJL08gZXJyb3IuCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFdTRW5kcG9pbnRSZWZlcmVuY2V9IGJ5IHBhcnNpbmcgYW4gaW5mb3NldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV1NFbmRwb2ludFJlZmVyZW5jZShJbnB1dFN0cmVhbSBpbmZvc2V0LCBBZGRyZXNzaW5nVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZShudWxsLGluZm9zZXQsZmFsc2UpLHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgV1NFbmRwb2ludFJlZmVyZW5jZX0gZnJvbSB0aGUgZ2l2ZW4gaW5mb3NldC4KKyAgICAgKiBUaGUge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gbXVzdCBwb2ludCB0byBlaXRoZXIgYSBkb2N1bWVudCBvciBhbiBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBXU0VuZHBvaW50UmVmZXJlbmNlKFhNTFN0cmVhbVJlYWRlciBpbiwgQWRkcmVzc2luZ1ZlcnNpb24gdmVyc2lvbikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoWE1MU3RyZWFtQnVmZmVyLmNyZWF0ZU5ld0J1ZmZlckZyb21YTUxTdHJlYW1SZWFkZXIoaW4pLCB2ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNXU0VuZHBvaW50UmVmZXJlbmNlKFN0cmluZywgQWRkcmVzc2luZ1ZlcnNpb24pCisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UoVVJMIGFkZHJlc3MsIEFkZHJlc3NpbmdWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcyhhZGRyZXNzLnRvRXh0ZXJuYWxGb3JtKCksIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI1dTRW5kcG9pbnRSZWZlcmVuY2UoU3RyaW5nLCBBZGRyZXNzaW5nVmVyc2lvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgV1NFbmRwb2ludFJlZmVyZW5jZShVUkkgYWRkcmVzcywgQWRkcmVzc2luZ1ZlcnNpb24gdmVyc2lvbikgeworICAgICAgICB0aGlzKGFkZHJlc3MudG9TdHJpbmcoKSwgdmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBXU0VuZHBvaW50UmVmZXJlbmNlfSB0aGF0IG9ubHkgaGFzIGFuIGFkZHJlc3MuCisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UoU3RyaW5nIGFkZHJlc3MsIEFkZHJlc3NpbmdWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcy5pbmZvc2V0ID0gY3JlYXRlQnVmZmVyRnJvbUFkZHJlc3MoYWRkcmVzcyx2ZXJzaW9uKTsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgdGhpcy5yZWZlcmVuY2VQYXJhbWV0ZXJzID0gRU1QVFlfQVJSQVk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgWE1MU3RyZWFtQnVmZmVyIGNyZWF0ZUJ1ZmZlckZyb21BZGRyZXNzKFN0cmluZyBhZGRyZXNzLCBBZGRyZXNzaW5nVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIHhzYiA9IG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJlYW1Xcml0ZXJCdWZmZXJDcmVhdG9yIHcgPSBuZXcgU3RyZWFtV3JpdGVyQnVmZmVyQ3JlYXRvcih4c2IpOworICAgICAgICAgICAgdy53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQodmVyc2lvbi5nZXRQcmVmaXgoKSwKKyAgICAgICAgICAgICAgICAiRW5kcG9pbnRSZWZlcmVuY2UiLCB2ZXJzaW9uLm5zVXJpKTsKKyAgICAgICAgICAgIHcud3JpdGVOYW1lc3BhY2UodmVyc2lvbi5nZXRQcmVmaXgoKSwKKyAgICAgICAgICAgICAgICB2ZXJzaW9uLm5zVXJpKTsKKyAgICAgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQodmVyc2lvbi5nZXRQcmVmaXgoKSwKKyAgICAgICAgICAgICAgICBXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BRERSRVNTX05BTUUsIHZlcnNpb24ubnNVcmkpOworICAgICAgICAgICAgdy53cml0ZUNoYXJhY3RlcnMoYWRkcmVzcyk7CisgICAgICAgICAgICB3LndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgdy53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHcud3JpdGVFbmREb2N1bWVudCgpOworICAgICAgICAgICAgdy5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIHhzYjsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGNhbiBuZXZlciBoYXBwZW4gYmVjYXVzZSB3ZSBhcmUgd3JpdGluZyB0byBYU0IKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gRVBSIGZyb20gaW5kaXZpZHVhbCBjb21wb25lbnRzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyB2ZXJzaW9uIHRha2VzIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgbWV0YWRhdGEsIGFuZCBjcmVhdGVzIGFuIEVQUiB0aGF0IGhhcworICAgICAqIHRoZSBuZWNlc3NhcnkgZW1iZWRkZWQgV1NETC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV1NFbmRwb2ludFJlZmVyZW5jZShATm90TnVsbCBBZGRyZXNzaW5nVmVyc2lvbiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb3ROdWxsIFN0cmluZyBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBRTmFtZSBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBRTmFtZSBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBRTmFtZSBwb3J0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgTGlzdDxFbGVtZW50PiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIHdzZGxBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBMaXN0PEVsZW1lbnQ+IHJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKKyAgICAgICB0aGlzKAorICAgICAgICAgICAgY3JlYXRlQnVmZmVyRnJvbURhdGEodmVyc2lvbiwgYWRkcmVzcywgcmVmZXJlbmNlUGFyYW1ldGVycywgc2VydmljZSwgcG9ydCwgcG9ydFR5cGUsIG1ldGFkYXRhLCB3c2RsQWRkcmVzcyksCisgICAgICAgICAgICB2ZXJzaW9uICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgWE1MU3RyZWFtQnVmZmVyIGNyZWF0ZUJ1ZmZlckZyb21EYXRhKEFkZHJlc3NpbmdWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBhZGRyZXNzLCBMaXN0PEVsZW1lbnQ+IHJlZmVyZW5jZVBhcmFtZXRlcnMsIFFOYW1lIHNlcnZpY2UsIFFOYW1lIHBvcnQsIFFOYW1lIHBvcnRUeXBlLCBMaXN0PEVsZW1lbnQ+IG1ldGFkYXRhLCBTdHJpbmcgd3NkbEFkZHJlc3MpIHsKKworICAgICAgICBTdHJlYW1Xcml0ZXJCdWZmZXJDcmVhdG9yIHdyaXRlciA9IG5ldyBTdHJlYW1Xcml0ZXJCdWZmZXJDcmVhdG9yKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCh2ZXJzaW9uLmdldFByZWZpeCgpLCJFbmRwb2ludFJlZmVyZW5jZSIsIHZlcnNpb24ubnNVcmkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHZlcnNpb24uZ2V0UHJlZml4KCksdmVyc2lvbi5uc1VyaSk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQodmVyc2lvbi5nZXRQcmVmaXgoKSwiQWRkcmVzcyIsIHZlcnNpb24ubnNVcmkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhhZGRyZXNzKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmKHJlZmVyZW5jZVBhcmFtZXRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCh2ZXJzaW9uLmdldFByZWZpeCgpLCJSZWZlcmVuY2VQYXJhbWV0ZXJzIiwgdmVyc2lvbi5uc1VyaSk7CisgICAgICAgICAgICAgICAgZm9yIChFbGVtZW50IGUgOiByZWZlcmVuY2VQYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgICAgICBET01VdGlsLnNlcmlhbGl6ZU5vZGUoZSwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCh2ZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIFczQzoKKyAgICAgICAgICAgICAgICB3cml0ZVczQ01ldGFEYXRhKHdyaXRlciwgc2VydmljZSwgcG9ydCwgcG9ydFR5cGUsIG1ldGFkYXRhLCB3c2RsQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTUVNQkVSOgorICAgICAgICAgICAgICAgIHdyaXRlTVNNZXRhRGF0YSh3cml0ZXIsIHNlcnZpY2UsIHBvcnQsIHBvcnRUeXBlLCBtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKHdzZGxBZGRyZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9JbmxpbmUgdGhlIHdzZGwgYXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC8vV3JpdGUgbWV4Ok1ldGFkYXRhIHdyYXBwZXIKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLk1FWF9NRVRBREFUQS5nZXRQcmVmaXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEEuZ2V0TG9jYWxQYXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMuTUVYX01FVEFEQVRBLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLk1FWF9NRVRBREFUQV9TRUNUSU9OLmdldFByZWZpeCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLk1FWF9NRVRBREFUQV9TRUNUSU9OLmdldExvY2FsUGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLk1FWF9NRVRBREFUQV9TRUNUSU9OLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLk1FWF9NRVRBREFUQV9ESUFMRUNUX0FUVFJJQlVURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0NvbnN0YW50cy5NRVhfTUVUQURBVEFfRElBTEVDVF9WQUxVRSk7CisKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVXc2RsKHdyaXRlciwgc2VydmljZSwgd3NkbEFkZHJlc3MpOworCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworCisgICAgICAgICAgICByZXR1cm4gd3JpdGVyLmdldFhNTFN0cmVhbUJ1ZmZlcigpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlVzNDTWV0YURhdGEoU3RyZWFtV3JpdGVyQnVmZmVyQ3JlYXRvciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRUeXBlLCBMaXN0PEVsZW1lbnQ+IG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbEFkZHJlc3MpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworCisgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChBZGRyZXNzaW5nVmVyc2lvbi5XM0MuZ2V0UHJlZml4KCksCisgICAgICAgICAgICAgICAgVzNDQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfTUVUQURBVEFfTkFNRSwgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLm5zVXJpKTsKKyAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRXc2RsUHJlZml4KCksCisgICAgICAgICAgICAgICAgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLndzZGxOc1VyaSk7CisKKyAgICAgICAgLy9Xcml0ZSBJbnRlcmZhY2UgaW5mbworICAgICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEFkZHJlc3NpbmdWZXJzaW9uLlczQy5nZXRXc2RsUHJlZml4KCksCisgICAgICAgICAgICAgICAgICAgIFczQ0FkZHJlc3NpbmdDb25zdGFudHMuV1NBV19JTlRFUkZBQ0VOQU1FX05BTUUsCisgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLlczQy53c2RsTnNVcmkpOworICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlUHJlZml4ID0gcG9ydFR5cGUuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICBpZiAocG9ydFR5cGVQcmVmaXggPT0gbnVsbCB8fCBwb3J0VHlwZVByZWZpeC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIHByZWZpeCBhZ2FpbgorICAgICAgICAgICAgICAgIHBvcnRUeXBlUHJlZml4ID0gIndzbnMiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHBvcnRUeXBlUHJlZml4LCBwb3J0VHlwZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHBvcnRUeXBlUHJlZml4ICsgIjoiICsgcG9ydFR5cGUuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vV3JpdGUgc2VydmljZSBhbmQgUG9ydCBpbmZvCisgICAgICAgICAgICBpZiAoIShzZXJ2aWNlLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygiIikgfHwgc2VydmljZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChBZGRyZXNzaW5nVmVyc2lvbi5XM0MuZ2V0V3NkbFByZWZpeCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVzNDQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FXX1NFUlZJQ0VOQU1FX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbi5XM0Mud3NkbE5zVXJpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZVByZWZpeCA9IHNlcnZpY2UuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VQcmVmaXggPT0gbnVsbCB8fCBzZXJ2aWNlUHJlZml4LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIHByZWZpeCBhZ2FpbgorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUHJlZml4ID0gIndzbnMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2Uoc2VydmljZVByZWZpeCwgc2VydmljZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoVzNDQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FXX0VORFBPSU5UTkFNRV9OQU1FLCBwb3J0LmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzZXJ2aWNlUHJlZml4ICsgIjoiICsgc2VydmljZS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vSW5saW5lIHRoZSB3c2RsCisgICAgICAgIGlmICh3c2RsQWRkcmVzcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZVdzZGwod3JpdGVyLCBzZXJ2aWNlLCB3c2RsQWRkcmVzcyk7CisgICAgICAgIH0KKyAgICAgICAgLy9BZGQgdGhlIGV4dHJhIG1ldGFkYXRhIEVsZW1lbnRzCisgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKQorICAgICAgICAgICAgZm9yIChFbGVtZW50IGUgOiBtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIERPTVV0aWwuc2VyaWFsaXplTm9kZShlLCB3cml0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTVNNZXRhRGF0YShTdHJlYW1Xcml0ZXJCdWZmZXJDcmVhdG9yIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcG9ydFR5cGUsIExpc3Q8RWxlbWVudD4gbWV0YWRhdGEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAvLyBUT0RPOiB3cml0ZSBSZWZlcmVuY2VQcm9wZXJ0aWVzCisgICAgICAgIC8vVE9ETzogd3JpdGUgUmVmZXJlbmNlUGFyYW1ldGVycworICAgICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy9Xcml0ZSBJbnRlcmZhY2UgaW5mbworICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUi5nZXRQcmVmaXgoKSwKKyAgICAgICAgICAgICAgICAgICAgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1BPUlRUWVBFX05BTUUsCisgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUi5uc1VyaSk7CisKKworICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlUHJlZml4ID0gcG9ydFR5cGUuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICBpZiAocG9ydFR5cGVQcmVmaXggPT0gbnVsbCB8fCBwb3J0VHlwZVByZWZpeC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIHByZWZpeCBhZ2FpbgorICAgICAgICAgICAgICAgIHBvcnRUeXBlUHJlZml4ID0gIndzbnMiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHBvcnRUeXBlUHJlZml4LCBwb3J0VHlwZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHBvcnRUeXBlUHJlZml4ICsgIjoiICsgcG9ydFR5cGUuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB9CisgICAgICAgIC8vV3JpdGUgc2VydmljZSBhbmQgUG9ydCBpbmZvCisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghKHNlcnZpY2UuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCIiKSB8fCBzZXJ2aWNlLmdldExvY2FsUGFydCgpLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUi5nZXRQcmVmaXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9TRVJWSUNFTkFNRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ1ZlcnNpb24uTUVNQkVSLm5zVXJpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZVByZWZpeCA9IHNlcnZpY2UuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VQcmVmaXggPT0gbnVsbCB8fCBzZXJ2aWNlUHJlZml4LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIHByZWZpeCBhZ2FpbgorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUHJlZml4ID0gIndzbnMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2Uoc2VydmljZVByZWZpeCwgc2VydmljZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1BPUlROQU1FX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoc2VydmljZVByZWZpeCArICI6IiArIHNlcnZpY2UuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVXc2RsKFN0cmVhbVdyaXRlckJ1ZmZlckNyZWF0b3Igd3JpdGVyLCBRTmFtZSBzZXJ2aWNlLCBTdHJpbmcgd3NkbEFkZHJlc3MpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgIC8vIElubGluZS13c2RsCisgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFdTRExDb25zdGFudHMuUFJFRklYX05TX1dTREwsCisgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLlFOQU1FX0RFRklOSVRJT05TLmdldExvY2FsUGFydCgpLAorICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5OU19XU0RMKTsKKyAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoV1NETENvbnN0YW50cy5QUkVGSVhfTlNfV1NETCwgV1NETENvbnN0YW50cy5OU19XU0RMKTsKKyAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoV1NETENvbnN0YW50cy5QUkVGSVhfTlNfV1NETCwKKyAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuUU5BTUVfSU1QT1JULmdldExvY2FsUGFydCgpLAorICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5OU19XU0RMKTsKKyAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsIHNlcnZpY2UuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZSgibG9jYXRpb24iLCB3c2RsQWRkcmVzcyk7CisgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBmcm9tIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0uCisgICAgICoKKyAgICAgKiBUaGlzIGhhbmRsZXMgbnVsbCB7QGxpbmsgRW5kcG9pbnRSZWZlcmVuY2V9IGNvcnJlY3RseS4KKyAgICAgKiBDYWxsIHtAbGluayAjV1NFbmRwb2ludFJlZmVyZW5jZShFbmRwb2ludFJlZmVyZW5jZSl9IGRpcmVjdGx5CisgICAgICogaWYgeW91IGtub3cgaXQncyBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZQorICAgIFdTRW5kcG9pbnRSZWZlcmVuY2UgY3JlYXRlKEBOdWxsYWJsZSBFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgaWYgKGVwciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0VuZHBvaW50UmVmZXJlbmNlKGVwcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI2NyZWF0ZVdpdGhBZGRyZXNzKFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgV1NFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVXaXRoQWRkcmVzcyhATm90TnVsbCBVUkkgbmV3QWRkcmVzcykgeworICAgICAgICByZXR1cm4gY3JlYXRlV2l0aEFkZHJlc3MobmV3QWRkcmVzcy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNjcmVhdGVXaXRoQWRkcmVzcyhTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIFdTRW5kcG9pbnRSZWZlcmVuY2UgY3JlYXRlV2l0aEFkZHJlc3MoQE5vdE51bGwgVVJMIG5ld0FkZHJlc3MpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVdpdGhBZGRyZXNzKG5ld0FkZHJlc3MudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgV1NFbmRwb2ludFJlZmVyZW5jZX0gYnkgcmVwbGFjaW5nIHRoZSBhZGRyZXNzIG9mIHRoaXMgRVBSCisgICAgICogdG8gdGhlIG5ldyBvbmUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHlvdSBjYW4gdXNlIHRoaXMgdG8gZm9yY2UgYW4gSFRUUFMgRVBSLAorICAgICAqIHdoZW4gdGhlIGVuZHBvaW50IGNhbiBzZXJ2ZSBib3RoIEhUVFAgYW5kIEhUVFBTIHJlcXVlc3RzLgorICAgICAqIDxwcmU+CisgICAgICogaWYoZXByLmdldEFkZHJlc3MoKS5zdGFydHNXaXRoKCJodHRwOiIpKQorICAgICAqICAgZXByID0gZXByLmNyZWF0ZVdpdGhBZGRyZXNzKCJodHRwczoiK2Vwci5nZXRBZGRyZXNzKCkuc3Vic3RyaW5nKDUpKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdBZGRyZXNzCisgICAgICogICAgICBUaGlzIGlzIGEgY29tcGxldGUgVVJMIHRvIGJlIHdyaXR0ZW4gaW5zaWRlICZsdDtBZHJlc3M+IGVsZW1lbnQgb2YgdGhlIEVQUiwKKyAgICAgKiAgICAgIHN1Y2ggYXMgImh0dHA6Ly9mb28uYmFyL2FiYy9kZWYiCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIFdTRW5kcG9pbnRSZWZlcmVuY2UgY3JlYXRlV2l0aEFkZHJlc3MoQE5vdE51bGwgZmluYWwgU3RyaW5nIG5ld0FkZHJlc3MpIHsKKyAgICAgICAgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciB4c2IgPSBuZXcgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcigpOworICAgICAgICBYTUxGaWx0ZXJJbXBsIGZpbHRlciA9IG5ldyBYTUxGaWx0ZXJJbXBsKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGluQWRkcmVzcyA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZihsb2NhbE5hbWUuZXF1YWxzKCJBZGRyZXNzIikgJiYgdXJpLmVxdWFscyh2ZXJzaW9uLm5zVXJpKSkKKyAgICAgICAgICAgICAgICAgICAgaW5BZGRyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLGxvY2FsTmFtZSxxTmFtZSxhdHRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYoIWluQWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2hhcmFjdGVycyhjaCwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmKGluQWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2hhcmFjdGVycyhuZXdBZGRyZXNzLnRvQ2hhckFycmF5KCksMCxuZXdBZGRyZXNzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBpbkFkZHJlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdXBlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbHRlci5zZXRDb250ZW50SGFuZGxlcih4c2IuY3JlYXRlRnJvbVNBWEJ1ZmZlckNyZWF0b3IoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmZvc2V0LndyaXRlVG8oZmlsdGVyLGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsgLy8gaW1wb3NzaWJsZSBzaW5jZSB3ZSBhcmUgd3JpdGluZyBmcm9tIFhTQiB0byBYU0IuCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFdTRW5kcG9pbnRSZWZlcmVuY2UoeHNiLHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIEVQUiB0byB0aGUgc3BlYyB2ZXJzaW9uLiBUaGUgYWN0dWFsIHR5cGUgb2YKKyAgICAgKiB7QGxpbmsgRW5kcG9pbnRSZWZlcmVuY2V9IHRvIGJlIHJldHVybmVkIGRlcGVuZHMgb24gd2hpY2ggdmVyc2lvbgorICAgICAqIG9mIHRoZSBhZGRyZXNzaW5nIHNwZWMgdGhpcyBFUFIgY29uZm9ybXMgdG8uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHRoZSBjb252ZXJzaW9uIGZhaWxzLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBFUFIgY29udGFpbnMKKyAgICAgKiAgICAgIGludmFsaWQgaW5mb3NldCAod3JvbmcgbmFtZXNwYWNlIFVSSSwgZXRjLikKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgRW5kcG9pbnRSZWZlcmVuY2UgdG9TcGVjKCkgeworICAgICAgICByZXR1cm4gUHJvdmlkZXJJbXBsLklOU1RBTkNFLnJlYWRFbmRwb2ludFJlZmVyZW5jZShhc1NvdXJjZSgiRW5kcG9pbnRSZWZlcmVuY2UiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIEVQUiB0byB0aGUgc3BlY2lmaWVkIHNwZWMgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSB7QGxpbmsgI2dldFZlcnNpb24oKSB0aGUgYWRkcmVzc2luZyB2ZXJzaW9uIGluIHVzZX0gYW5kCisgICAgICogdGhlIGdpdmVuIGNsYXNzIGlzIGRpZmZlcmVudCwgdGhlbiB0aGlzIG1heSBpbnZvbHZlIHZlcnNpb24gY29udmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gVCB0b1NwZWMoQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIEVuZHBvaW50UmVmZXJlbmNlVXRpbC50cmFuc2Zvcm0oY2xhenosdG9TcGVjKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBwcm94eSB0aGF0IGNhbiBiZSB1c2VkIHRvIHRhbGsgdG8gdGhpcyBFUFIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBbGwgdGhlIG5vcm1hbCBXUy1BZGRyZXNzaW5nIHByb2Nlc3NpbmcgaGFwcGVucyBhdXRvbWF0aWNhbGx5LAorICAgICAqIHN1Y2ggYXMgc2V0dGluZyB0aGUgZW5kcG9pbnQgYWRkcmVzcyB0byB7QGxpbmsgI2dldEFkZHJlc3MoKSB0aGUgYWRkcmVzc30sCisgICAgICogYW5kIHNlbmRpbmcgdGhlIHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVQUiBhcworICAgICAqIGhlYWRlcnMsIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgPFQ+IFQgZ2V0UG9ydChATm90TnVsbCBTZXJ2aWNlIGpheHdzU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgIEBOb3ROdWxsIENsYXNzPFQ+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSAgICAgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgaXQgaW4gYSBiZXR0ZXIgd2F5CisgICAgICAgIHJldHVybiBqYXh3c1NlcnZpY2UuZ2V0UG9ydCh0b1NwZWMoKSxzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsZmVhdHVyZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgRGlzcGF0Y2h9IHRoYXQgY2FuIGJlIHVzZWQgdG8gdGFsayB0byB0aGlzIEVQUi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEFsbCB0aGUgbm9ybWFsIFdTLUFkZHJlc3NpbmcgcHJvY2Vzc2luZyBoYXBwZW5zIGF1dG9tYXRpY2FsbHksCisgICAgICogc3VjaCBhcyBzZXR0aW5nIHRoZSBlbmRwb2ludCBhZGRyZXNzIHRvIHtAbGluayAjZ2V0QWRkcmVzcygpIHRoZSBhZGRyZXNzfSwKKyAgICAgKiBhbmQgc2VuZGluZyB0aGUgcmVmZXJlbmNlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRVBSIGFzCisgICAgICogaGVhZGVycywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goCisgICAgICAgIEBOb3ROdWxsIFNlcnZpY2UgamF4d3NTZXJ2aWNlLAorICAgICAgICBATm90TnVsbCBDbGFzczxUPiB0eXBlLAorICAgICAgICBATm90TnVsbCBTZXJ2aWNlLk1vZGUgbW9kZSwKKyAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgaXQgaW4gYSBiZXR0ZXIgd2F5CisgICAgICAgIHJldHVybiBqYXh3c1NlcnZpY2UuY3JlYXRlRGlzcGF0Y2godG9TcGVjKCksdHlwZSxtb2RlLGZlYXR1cmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIERpc3BhdGNofSB0aGF0IGNhbiBiZSB1c2VkIHRvIHRhbGsgdG8gdGhpcyBFUFIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBbGwgdGhlIG5vcm1hbCBXUy1BZGRyZXNzaW5nIHByb2Nlc3NpbmcgaGFwcGVucyBhdXRvbWF0aWNhbGx5LAorICAgICAqIHN1Y2ggYXMgc2V0dGluZyB0aGUgZW5kcG9pbnQgYWRkcmVzcyB0byB7QGxpbmsgI2dldEFkZHJlc3MoKSB0aGUgYWRkcmVzc30sCisgICAgICogYW5kIHNlbmRpbmcgdGhlIHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVQUiBhcworICAgICAqIGhlYWRlcnMsIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgRGlzcGF0Y2g8T2JqZWN0PiBjcmVhdGVEaXNwYXRjaCgKKyAgICAgICAgQE5vdE51bGwgU2VydmljZSBqYXh3c1NlcnZpY2UsCisgICAgICAgIEBOb3ROdWxsIEpBWEJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIEBOb3ROdWxsIFNlcnZpY2UuTW9kZSBtb2RlLAorICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgeworCisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBpdCBpbiBhIGJldHRlciB3YXkKKyAgICAgICAgcmV0dXJuIGpheHdzU2VydmljZS5jcmVhdGVEaXNwYXRjaCh0b1NwZWMoKSxjb250ZXh0LG1vZGUsZmVhdHVyZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFkZHJlc3NpbmcgdmVyc2lvbiBvZiB0aGlzIEVQUi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgQWRkcmVzc2luZ1ZlcnNpb24gZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSAmbHQ7d3NhOmFkZHJlc3M+IGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgU3RyaW5nIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGhhcyBhbm9ueW1vdXMgVVJJIGFzIHRoZSB7QGxpbmsgI2dldEFkZHJlc3MoKSBhZGRyZXNzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3MuZXF1YWxzKHZlcnNpb24uYW5vbnltb3VzVXJpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBoYXMge0BsaW5rIEFkZHJlc3NpbmdWZXJzaW9uI25vbmVVcmkgbm9uZSBVUkl9CisgICAgICogYXMgdGhlIHtAbGluayAjZ2V0QWRkcmVzcygpIGFkZHJlc3N9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3MuZXF1YWxzKHZlcnNpb24ubm9uZVVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGluc2lkZSBFUFIgYW5kIG1hcmsgYWxsIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGUgRVBSIHN0cnVjdHVyZS4KKyAgICAgICAgLy8gY2hlY2sgZm9yIG5vbi1leGlzdGVudCBBZGRyZXNzLCB0aGF0IHNvcnQgb2YgdGhpbmdzLgorCisgICAgICAgIFN0cmVhbVJlYWRlckJ1ZmZlclByb2Nlc3NvciB4c3IgPSBpbmZvc2V0LnJlYWRBc1hNTFN0cmVhbVJlYWRlcigpOworCisgICAgICAgIC8vIHBhcnNlciBzaG91bGQgYmUgZWl0aGVyIGF0IHRoZSBzdGFydCBlbGVtZW50IG9yIHRoZSBzdGFydCBkb2N1bWVudAorICAgICAgICBpZih4c3IuZ2V0RXZlbnRUeXBlKCk9PVhNTFN0cmVhbVJlYWRlci5TVEFSVF9ET0NVTUVOVCkKKyAgICAgICAgICAgIHhzci5uZXh0VGFnKCk7CisgICAgICAgIGFzc2VydCB4c3IuZ2V0RXZlbnRUeXBlKCk9PVhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UOworCisgICAgICAgIFN0cmluZyByb290TG9jYWxOYW1lID0geHNyLmdldExvY2FsTmFtZSgpOworICAgICAgICBpZigheHNyLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh2ZXJzaW9uLm5zVXJpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKEFkZHJlc3NpbmdNZXNzYWdlcy5XUk9OR19BRERSRVNTSU5HX1ZFUlNJT04oCisgICAgICAgICAgICAgICAgdmVyc2lvbi5uc1VyaSwgeHNyLmdldE5hbWVzcGFjZVVSSSgpKSk7CisKKyAgICAgICAgLy8gc2luY2Ugb2Z0ZW4gRVBSIGRvZXNuJ3QgaGF2ZSBhIHJlZmVyZW5jZSBwYXJhbWV0ZXIsIGNyZWF0ZSBhcnJheSBsYXppbHkKKyAgICAgICAgTGlzdDxIZWFkZXI+IG1hcmtzPW51bGw7CisKKyAgICAgICAgd2hpbGUoeHNyLm5leHRUYWcoKT09WE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB4c3IuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICBpZih2ZXJzaW9uLmlzUmVmZXJlbmNlUGFyYW1ldGVyKGxvY2FsTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBYTUxTdHJlYW1CdWZmZXIgbWFyazsKKyAgICAgICAgICAgICAgICB3aGlsZSgobWFyayA9IHhzci5uZXh0VGFnQW5kTWFyaygpKSE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZihtYXJrcz09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gbmV3IEFycmF5TGlzdDxIZWFkZXI+KCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZCBhIGRpZmZlcmVudCBoZWFkZXIgZm9yIG1lbWJlciBzdWJtaXNzaW9uIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgbWFya3MuYWRkKHZlcnNpb24uY3JlYXRlUmVmZXJlbmNlUGFyYW1ldGVySGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWFyaywgeHNyLmdldE5hbWVzcGFjZVVSSSgpLCB4c3IuZ2V0TG9jYWxOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudCh4c3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaWYobG9jYWxOYW1lLmVxdWFscygiQWRkcmVzcyIpKSB7CisgICAgICAgICAgICAgICAgaWYoYWRkcmVzcyE9bnVsbCkgLy8gZG91YmxlIDxBZGRyZXNzPi4gVGhhdCdzIGFuIGVycm9yLgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE1hcEV4Y2VwdGlvbihuZXcgUU5hbWUodmVyc2lvbi5uc1VyaSxyb290TG9jYWxOYW1lKSxBZGRyZXNzaW5nVmVyc2lvbi5mYXVsdF9kdXBsaWNhdGVBZGRyZXNzSW5FcHIpOworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSB4c3IuZ2V0RWxlbWVudFRleHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudCh4c3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaGl0IHRvIDwvRW5kcG9pbnRSZWZlcmVuY2U+IGJ5IG5vdworCisgICAgICAgIGlmKG1hcmtzPT1udWxsKSB7CisgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVBhcmFtZXRlcnMgPSBFTVBUWV9BUlJBWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9IG1hcmtzLnRvQXJyYXkobmV3IEhlYWRlclttYXJrcy5zaXplKCldKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGFkZHJlc3M9PW51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE1hcEV4Y2VwdGlvbihuZXcgUU5hbWUodmVyc2lvbi5uc1VyaSxyb290TG9jYWxOYW1lKSx2ZXJzaW9uLmZhdWx0X21pc3NpbmdBZGRyZXNzSW5FcHIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhpcyBFUFIgYXMge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lCisgICAgICogICAgICBFUFIgdXNlcyBhIGRpZmZlcmVudCByb290IHRhZyBuYW1lIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4KKyAgICAgKiAgICAgIFRoZSByZXR1cm5lZCB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSB3aWxsIHVzZSB0aGUgZ2l2ZW4gbG9jYWwgbmFtZQorICAgICAqICAgICAgZm9yIHRoZSByb290IGVsZW1lbnQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIHJlYWQoZmluYWwgQE5vdE51bGwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgU3RyZWFtUmVhZGVyQnVmZmVyUHJvY2Vzc29yKGluZm9zZXQpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIFN0cmluZyBfbG9jYWxOYW1lKSB7CisgICAgICAgICAgICAgICAgaWYoX2RlcHRoPT0wKQorICAgICAgICAgICAgICAgICAgICAgICAgX2xvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgICAgICAgICBzdXBlci5wcm9jZXNzRWxlbWVudChwcmVmaXgsIHVyaSwgX2xvY2FsTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBTb3VyY2V9IHRoYXQgcmVwcmVzZW50cyB0aGlzIEVQUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUKKyAgICAgKiAgICAgIEVQUiB1c2VzIGEgZGlmZmVyZW50IHJvb3QgdGFnIG5hbWUgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LgorICAgICAqICAgICAgVGhlIHJldHVybmVkIHtAbGluayBTb3VyY2V9IHdpbGwgdXNlIHRoZSBnaXZlbiBsb2NhbCBuYW1lCisgICAgICogICAgICBmb3IgdGhlIHJvb3QgZWxlbWVudCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2UgYXNTb3VyY2UoQE5vdE51bGwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IFNBWFNvdXJjZShuZXcgU0FYQnVmZmVyUHJvY2Vzc29ySW1wbChsb2NhbE5hbWUpLG5ldyBJbnB1dFNvdXJjZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhpcyBFUFIgdG8gdGhlIGdpdmVuIHtAbGluayBDb250ZW50SGFuZGxlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lCisgICAgICogICAgICBFUFIgdXNlcyBhIGRpZmZlcmVudCByb290IHRhZyBuYW1lIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4KKyAgICAgKiAgICAgIFRoZSByZXR1cm5lZCB7QGxpbmsgU291cmNlfSB3aWxsIHVzZSB0aGUgZ2l2ZW4gbG9jYWwgbmFtZQorICAgICAqICAgICAgZm9yIHRoZSByb290IGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQKKyAgICAgKiAgICAgIElmIHRydWUsIGdlbmVyYXRlIGEgZnJhZ21lbnQgU0FYIGV2ZW50cyB3aXRob3V0IHN0YXJ0L2VuZERvY3VtZW50IGNhbGxiYWNrcy4KKyAgICAgKiAgICAgIElmIGZhbHNlLCBnZW5lcmF0ZSBhIGZ1bGwgWE1MIGRvY3VtZW50IGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oQE5vdE51bGwgU3RyaW5nIGxvY2FsTmFtZSwgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIGJvb2xlYW4gZnJhZ21lbnQpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTQVhCdWZmZXJQcm9jZXNzb3JJbXBsIHAgPSBuZXcgU0FYQnVmZmVyUHJvY2Vzc29ySW1wbChsb2NhbE5hbWUpOworICAgICAgICBwLnNldENvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKTsKKyAgICAgICAgcC5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgcC5wcm9jZXNzKGluZm9zZXQsZnJhZ21lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGlzIEVQUiBpbnRvIHRoZSBnaXZlbiB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lCisgICAgICogICAgICBFUFIgdXNlcyBhIGRpZmZlcmVudCByb290IHRhZyBuYW1lIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4KKyAgICAgKiAgICAgIFRoZSByZXR1cm5lZCB7QGxpbmsgU291cmNlfSB3aWxsIHVzZSB0aGUgZ2l2ZW4gbG9jYWwgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQE5vdE51bGwgU3RyaW5nIGxvY2FsTmFtZSwgQE5vdE51bGwgWE1MU3RyZWFtV3JpdGVyIHcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpbmZvc2V0LndyaXRlVG9YTUxTdHJlYW1Xcml0ZXIobmV3IFhNTFN0cmVhbVdyaXRlckZpbHRlcih3KSB7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gcm9vdD10cnVlOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudChTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyB2ZXJzaW9uKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIHZlcnNpb24pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgb3ZlcnJpZGUoU3RyaW5nIGxuKSB7CisgICAgICAgICAgICAgICAgaWYocm9vdCkgeworICAgICAgICAgICAgICAgICAgICByb290ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBsbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc3VwZXIud3JpdGVTdGFydEVsZW1lbnQob3ZlcnJpZGUobG9jYWxOYW1lKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgb3ZlcnJpZGUobG9jYWxOYW1lKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgb3ZlcnJpZGUobG9jYWxOYW1lKSwgbmFtZXNwYWNlVVJJKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSx0cnVlLyp3cml0ZSBhcyBmcmFnbWVudCovKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEhlYWRlcn0gdGhhdCB3cmFwcyB0aGlzIHtAbGluayBXU0VuZHBvaW50UmVmZXJlbmNlfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCBoZWFkZXIgaXMgaW1tdXRhYmxlIHRvbywgYW5kIGNhbiBiZSByZXVzZWQgd2l0aAorICAgICAqIG1hbnkge0BsaW5rIE1lc3NhZ2V9cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290VGFnTmFtZQorICAgICAqICAgICAgVGhlIGhlYWRlciB0YWcgbmFtZSB0byBiZSB1c2VkLCBzdWNoIGFzICZsdDtSZXBseVRvPiBvciAmbHQ7RmF1bHRUbz4uCisgICAgICogICAgICAoSXQncyBiaXQgdWdseSB0aGF0IHRoaXMgbWV0aG9kIHRha2VzIHtAbGluayBRTmFtZX0gYW5kIG5vdCBqdXN0IGxvY2FsIG5hbWUsCisgICAgICogICAgICB1bmxpa2Ugb3RoZXIgbWV0aG9kcy4gSWYgaXQncyBtYWtpbmcgdGhlIGNhbGxlcidzIGxpZmUgbWlzZXJhYmxlLCB0aGVuCisgICAgICogICAgICB3ZSBjYW4gdGFsay4pCisgICAgICovCisgICAgcHVibGljIEhlYWRlciBjcmVhdGVIZWFkZXIoUU5hbWUgcm9vdFRhZ05hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFUFJIZWFkZXIocm9vdFRhZ05hbWUsdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIGFsbCB0aGUgcmVmZXJlbmNlIHBhcmFtZXRlcnMgaW4gdGhpcyBFUFIgYXMgaGVhZGVycworICAgICAqIHRvIHRoZSBnaXZlbiB7QGxpbmsgSGVhZGVyTGlzdH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhIZWFkZXJMaXN0IG91dGJvdW5kKSB7CisgICAgICAgIGZvciAoSGVhZGVyIGhlYWRlciA6IHJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIG91dGJvdW5kLmFkZChoZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcHMgdGhlIEVQUiBpbmZvc2V0IGluIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBkZWJ1ZyBjb252ZW5pZW5jZQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShhc1NvdXJjZSgiRW5kcG9pbnRSZWZlcmVuY2UiKSxuZXcgU3RyZWFtUmVzdWx0KHN3KSk7CisgICAgICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGUudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlcmluZyB7QGxpbmsgU0FYQnVmZmVyUHJvY2Vzc29yfSB0aGF0IHJlcGxhY2VzIHRoZSByb290IHRhZyBuYW1lLgorICAgICAqLworICAgIGNsYXNzIFNBWEJ1ZmZlclByb2Nlc3NvckltcGwgZXh0ZW5kcyBTQVhCdWZmZXJQcm9jZXNzb3IgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByb290TG9jYWxOYW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcm9vdD10cnVlOworCisgICAgICAgIHB1YmxpYyBTQVhCdWZmZXJQcm9jZXNzb3JJbXBsKFN0cmluZyByb290TG9jYWxOYW1lKSB7CisgICAgICAgICAgICBzdXBlcihpbmZvc2V0LGZhbHNlKTsKKyAgICAgICAgICAgIHRoaXMucm9vdExvY2FsTmFtZSA9IHJvb3RMb2NhbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgaWYocm9vdCkgeworICAgICAgICAgICAgICAgIHJvb3QgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmKHFOYW1lLmVxdWFscyhsb2NhbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHFOYW1lID0gbG9jYWxOYW1lID0gcm9vdExvY2FsTmFtZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSByb290TG9jYWxOYW1lOworICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcU5hbWUuaW5kZXhPZignOicpOworICAgICAgICAgICAgICAgICAgICBxTmFtZSA9IHFOYW1lLnN1YnN0cmluZygwLGlkeCsxKStyb290TG9jYWxOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLnByb2Nlc3NFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPdXRib3VuZFJlZmVyZW5jZVBhcmFtZXRlckhlYWRlcltdIEVNUFRZX0FSUkFZID0gbmV3IE91dGJvdW5kUmVmZXJlbmNlUGFyYW1ldGVySGVhZGVyWzBdOworCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBtZXRhZGF0YSBpbnNpZGUgdGhpcyBFUFIgYW5kIG9idGFpbnMgaXQgaW4gYSBlYXN5LXRvLXByb2Nlc3MgZm9ybS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNlZSB7QGxpbmsgTWV0YWRhdGF9IGNsYXNzIGZvciB3aGF0J3MgYXZhbGlhYmxlIGFzICJtZXRhZGF0YSIuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIE1ldGFkYXRhIGdldE1ldGFEYXRhKCkgeworICAgICAgICByZXR1cm4gbmV3IE1ldGFkYXRhKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBNZXRhZGF0YSBpbiBhbiBFUFIgYW5kIHByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gYWNjZXNzCisgICAgICogdGhlIG1ldGFkYXRhLgorICAgICAqCisgICAgICovCisgICBwdWJsaWMgY2xhc3MgTWV0YWRhdGEgeworICAgICAgICBwcml2YXRlIEBOdWxsYWJsZSBRTmFtZSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBATnVsbGFibGUgUU5hbWUgcG9ydE5hbWU7CisgICAgICAgIHByaXZhdGUgQE51bGxhYmxlIFFOYW1lIHBvcnRUeXBlTmFtZTsgLy9pbnRlcmZhY2VOYW1lCisgICAgICAgIHByaXZhdGUgQE51bGxhYmxlIFNvdXJjZSB3c2RsU291cmNlOworICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFFOYW1lIGdldFNlcnZpY2VOYW1lKCl7CisgICAgICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEBOdWxsYWJsZSBRTmFtZSBnZXRQb3J0TmFtZSgpeworICAgICAgICAgICAgcmV0dXJuIHBvcnROYW1lOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBATnVsbGFibGUgUU5hbWUgZ2V0UG9ydFR5cGVOYW1lKCl7CisgICAgICAgICAgICByZXR1cm4gcG9ydFR5cGVOYW1lOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBATnVsbGFibGUgU291cmNlIGdldFdzZGxTb3VyY2UoKXsKKyAgICAgICAgICAgIHJldHVybiB3c2RsU291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBNZXRhZGF0YSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGFyc2VNZXRhRGF0YSgpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgLyoqCisgICAgICAgICAqIFBhcnNlcyB0aGUgTWV0YWRhdGEgc2VjdGlvbiBvZiB0aGUgRVBSLgorICAgICAgICAgKi8KKyAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VNZXRhRGF0YSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICBTdHJlYW1SZWFkZXJCdWZmZXJQcm9jZXNzb3IgeHNyID0gaW5mb3NldC5yZWFkQXNYTUxTdHJlYW1SZWFkZXIoKTsKKworICAgICAgICAgICAgLy8gcGFyc2VyIHNob3VsZCBiZSBlaXRoZXIgYXQgdGhlIHN0YXJ0IGVsZW1lbnQgb3IgdGhlIHN0YXJ0IGRvY3VtZW50CisgICAgICAgICAgICBpZiAoeHNyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9ET0NVTUVOVCkKKyAgICAgICAgICAgICAgICB4c3IubmV4dFRhZygpOworICAgICAgICAgICAgYXNzZXJ0IHhzci5nZXRFdmVudFR5cGUoKSA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVDsKKyAgICAgICAgICAgIFN0cmluZyByb290RWxlbWVudCA9IHhzci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgIGlmICgheHNyLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh2ZXJzaW9uLm5zVXJpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuV1JPTkdfQUREUkVTU0lOR19WRVJTSU9OKAorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5uc1VyaSwgeHNyLmdldE5hbWVzcGFjZVVSSSgpKSk7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lOworICAgICAgICAgICAgU3RyaW5nIG5zOworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gQWRkcmVzc2luZ1ZlcnNpb24uVzNDKSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgbWV0YWRhdGEgZW5jbG9zdXJlLCBsb29rIGluc2lkZQorICAgICAgICAgICAgICAgICAgICBpZiAoeHNyLmdldExvY2FsTmFtZSgpLmVxdWFscyh2ZXJzaW9uLmVwclR5cGUud3NkbE1ldGFkYXRhLmdldExvY2FsUGFydCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtQnVmZmVyIG1hcms7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG1hcmsgPSB4c3IubmV4dFRhZ0FuZE1hcmsoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IHhzci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBucyA9IHhzci5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyh2ZXJzaW9uLmVwclR5cGUuc2VydmljZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0U3RyID0geHNyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIHZlcnNpb24uZXByVHlwZS5wb3J0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gZ2V0RWxlbWVudFRleHRBc1FOYW1lKHhzcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUgPSBuZXcgUU5hbWUoc2VydmljZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHBvcnRTdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyh2ZXJzaW9uLmVwclR5cGUucG9ydFR5cGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU5hbWUgPSBnZXRFbGVtZW50VGV4dEFzUU5hbWUoeHNyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zLmVxdWFscyhXU0RMQ29uc3RhbnRzLk5TX1dTREwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsb2NhbE5hbWUuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfREVGSU5JVElPTlMuZ2V0TG9jYWxQYXJ0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTb3VyY2UgPSBuZXcgWE1MU3RyZWFtQnVmZmVyU291cmNlKG1hcmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQoeHNyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1NraXAgaXMgaXQgaXMgbm90IHJvb3QgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF4c3IuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKHJvb3RFbGVtZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHhzcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudCh4c3IpID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSBBZGRyZXNzaW5nVmVyc2lvbi5NRU1CRVIpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IHhzci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgbnMgPSB4c3IuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICAgICAgICAgIC8vSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBtZXRhZGF0YSBlbmNsb3N1cmUsIGxvb2sgaW5zaWRlCisgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKHZlcnNpb24uZXByVHlwZS53c2RsTWV0YWRhdGEuZ2V0TG9jYWxQYXJ0KCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMuZXF1YWxzKHZlcnNpb24uZXByVHlwZS53c2RsTWV0YWRhdGEuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeHNyLm5leHRUYWcoKSA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbUJ1ZmZlciBtYXJrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobWFyayA9IHhzci5uZXh0VGFnQW5kTWFyaygpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IHhzci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMgPSB4c3IuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChucy5lcXVhbHMoV1NETENvbnN0YW50cy5OU19XU0RMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxvY2FsTmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9ERUZJTklUSU9OUy5nZXRMb2NhbFBhcnQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTb3VyY2UgPSBuZXcgWE1MU3RyZWFtQnVmZmVyU291cmNlKG1hcmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudCh4c3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHModmVyc2lvbi5lcHJUeXBlLnNlcnZpY2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnRTdHIgPSB4c3IuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgdmVyc2lvbi5lcHJUeXBlLnBvcnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gZ2V0RWxlbWVudFRleHRBc1FOYW1lKHhzcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TmFtZSA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcG9ydFN0cik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyh2ZXJzaW9uLmVwclR5cGUucG9ydFR5cGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGVOYW1lID0gZ2V0RWxlbWVudFRleHRBc1FOYW1lKHhzcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1NraXAgaXMgaXQgaXMgbm90IHJvb3QgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF4c3IuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKHJvb3RFbGVtZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHhzcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudCh4c3IpID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUU5hbWUgZ2V0RWxlbWVudFRleHRBc1FOYW1lKFN0cmVhbVJlYWRlckJ1ZmZlclByb2Nlc3NvciB4c3IpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB4c3IuZ2V0RWxlbWVudFRleHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBYbWxVdGlsLmdldFByZWZpeCh0ZXh0KTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gWG1sVXRpbC5nZXRMb2NhbFBhcnQodGV4dCk7CisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBucyA9IHhzci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5zICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKG5zLCBuYW1lLCBwcmVmaXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobnVsbCwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9hZGRyZXNzaW5nL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjllZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvYWRkcmVzc2luZy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK0BqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIsCisgICAgICAgIGxvY2F0aW9uID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIpCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2NsaWVudC9DbGllbnRQaXBlbGluZUhvb2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9jbGllbnQvQ2xpZW50UGlwZWxpbmVIb29rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1NWUzNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9jbGllbnQvQ2xpZW50UGlwZWxpbmVIb29rLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5jbGllbnQ7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ2xpZW50UGlwZUFzc2VtYmxlckNvbnRleHQ7CisKKy8qKgorICogQWxsb3cgdGhlIGNvbnRhaW5lciAocHJpbWFyaWx5IEdsYXNzZmlzaCkgdG8gaW5qZWN0CisgKiB0aGVpciBvd24gcGlwZXMgaW50byB0aGUgY2xpZW50IHBpcGVsaW5lLgorICoKKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaGFzIGEgcmF0aGVyIGFkLWhvYyBzZXQgb2YgbWV0aG9kcywgYmVjYXVzZQorICogd2UgZGlkbid0IHdhbnQgdG8gZGVmaW5lIGFuIGF1dG9ub21vdXMgcGlwZS1hc3NlbWJseSBwcm9jZXNzLgorICogKFdlIHRob3VnaHQgdGhpcyBpcyBhIHNtYWxsZXIgZXZpbCBjb21wYXJlZCB0byB0aGF0LikKKyAqCisgKiA8cD4KKyAqIEpBWC1XUyBvYnRhaW5zIHRoaXMgdGhyb3VnaCB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Db250YWluZXIjZ2V0U1BJKENsYXNzKX0uCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENsaWVudFBpcGVsaW5lSG9vayB7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZHVyaW5nIHRoZSBwaXBlbGluZSBjb25zdHJ1Y3Rpb24gcHJvY2VzcyBvbmNlIHRvIGFsbG93IGEgY29udGFpbmVyCisgICAgICogdG8gcmVnaXN0ZXIgYSBwaXBlIGZvciBzZWN1cml0eS4KKyAgICAgKgorICAgICAqIFRoaXMgcGlwZSB3aWxsIGJlIGluamVjdGVkIHRvIGEgcG9pbnQgdmVyeSBjbG9zZSB0byB0aGUgdHJhbnNwb3J0LCBhbGxvd2luZworICAgICAqIGl0IHRvIGRvIHNvbWUgc2VjdXJpdHkgb3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdHh0CisgICAgICogICAgICBSZXByZXNlbnRzIGFic3RyYWN0aW9uIG9mIFNFSSwgV1NETCBhYnN0cmFjdGlvbiBldGMuIENvbnRleHQgY2FuIGJlIHVzZWQKKyAgICAgKiAgICAgIHdoZXRoZXIgYWRkIGEgbmV3IHBpcGUgdG8gdGhlIGhlYWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIHRhaWwKKyAgICAgKiAgICAgIEhlYWQgb2YgdGhlIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBwaXBlbGluZS4gSWYgdGhlIGltcGxlbWVudGF0aW9uCisgICAgICogICAgICB3aXNoZXMgdG8gYWRkIG5ldyBwaXBlcywgaXQgc2hvdWxkIGRvIHNvIGJ5IGV4dGVuZGluZworICAgICAqICAgICAge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5BYnN0cmFjdEZpbHRlclBpcGVJbXBsfSBhbmQgbWFraW5nIHN1cmUgdGhhdCB0aGlzIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlfQorICAgICAqICAgICAgZXZlbnR1YWxseSBwcm9jZXNzZXMgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgPHR0PnRhaWw8L3R0Piwgd2hpY2ggbWVhbnMKKyAgICAgKiAgICAgIG5vIGFkZGl0aW9uYWwgcGlwZSBpcyBpbnNlcnRlZC4gSWYgdGhlIGltcGxlbWVudGF0aW9uIGFkZHMKKyAgICAgKiAgICAgIG5ldyBwaXBlcywgcmV0dXJuIHRoZSBuZXcgaGVhZCBwaXBlLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBQaXBlIGNyZWF0ZVNlY3VyaXR5UGlwZShDbGllbnRQaXBlQXNzZW1ibGVyQ29udGV4dCBjdHh0LCBATm90TnVsbCBQaXBlIHRhaWwpIHsKKyAgICAgICAgcmV0dXJuIHRhaWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2NsaWVudC9TZWxlY3RPcHRpbWFsRW5jb2RpbmdGZWF0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvY2xpZW50L1NlbGVjdE9wdGltYWxFbmNvZGluZ0ZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA1YjNlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2NsaWVudC9TZWxlY3RPcHRpbWFsRW5jb2RpbmdGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5jbGllbnQ7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuRmVhdHVyZUNvbnN0cnVjdG9yOworCitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworCisvKioKKyAqIENsaWVudCBzaWRlIGZlYXR1cmUgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3B0aW1hbAorICogZW5jb2RpbmcgYnkgdGhlIGNsaWVudCB3aGVuIHNlbmRpbmcgb3V0Ym91bmQgbWVzc2FnZXMuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBhZmZlY3RzIG9mIHRoaXMgZmVhdHVyZSB3aXRoIHJlc3BlY3QKKyAqIHRvIGJlaW5nIGVuYWJsZWQgb3IgZGlzYWJsZWQ6CisgKiA8dWw+CisgKiAgPGxpPiBFTkFCTEVEOiBJbiB0aGlzIE1vZGUsIHRoZSBtb3N0IG9wdGltYWwgZW5jb2Rpbmcgd2lsbCBiZSBzZWxlY3RlZAorICogICAgICAgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uIGFuZCBjYXBhYmlsaXRpZXMgb2YgdGhlIGNsaWVudAorICogICAgICAgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgV2ViIHNlcnZpY2UuCisgKiAgPGxpPiBESVNBQkxFRDogSW4gdGhpcyBNb2RlLCB0aGUgZGVmYXVsdCBlbmNvZGluZyB3aWxsIGJlIHNlbGVjdGVkLgorICogPC91bD4KKyAqIDxwPgorICogSWYgdGhpcyBmZWF0dXJlIGlzIG5vdCBwcmVzZW50IG9uIGEgV2ViIHNlcnZpY2UgdGhlbiB0aGUgZGVmYXVsdCBiZWhhdmlvdXIKKyAqIGlzIGVxdWl2YWxlbnQgdG8gdGhpcyBmZWF0dXJlIGJlaW5nIHByZXNlbnQgYW5kIGRpc2FibGVkLgorICogPHA+CisgKiBJZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBieSB0aGUgY2xpZW50IGFuZCB0aGUgU2VydmljZSBzdXBwb3J0cyB0aGUKKyAqIEZhc3QgSW5mb3NldCBlbmNvZGluZywgYXMgc3BlY2lmaWVkIGJ5IHRoZSB7QGxpbmsgRmFzdEluZm9zZXRGZWF0dXJlfSwKKyAqIGFuZCBGYXN0IEluZm9zZXQgaXMgZGV0ZXJtaW5lZCB0byBiZSB0aGUgbW9zdCBvcHRpbWFsIGVuY29kaW5nLCB0aGVuIHRoZQorICogRmFzdCBJbmZvc2V0IGVuY29kaW5nIHdpbGwgYmUgYXV0b21hdGljYWxseSBzZWxlY3RlZCBieSB0aGUgY2xpZW50LgorICogPHA+CisgKiBUT0RPOiBTdGlsbCBub3Qgc3VyZSBpZiBhIGZlYXR1cmUgaXMgYSBzZXJ2ZXIgc2lkZSBvbmx5IHRoaW5nIG9yIGNhbgorICogYWxzbyBiZSBhIGNsaWVudCBzaWRlIHRoaW5nLiBJZiB0aGUgZm9ybWVyIHRoZW4gdGhpcyBjbGFzcyBzaG91bGQgYmUKKyAqIHJlbW92ZWQuCisgKiBAYXV0aG9yIFBhdWwuU2FuZG96QFN1bi5Db20KKyAqLworcHVibGljIGNsYXNzIFNlbGVjdE9wdGltYWxFbmNvZGluZ0ZlYXR1cmUgZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZSB7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdmFsdWUgaWRlbnRpZnlpbmcgdGhlIHtAbGluayBTZWxlY3RPcHRpbWFsRW5jb2RpbmdGZWF0dXJlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheHdzL2NsaWVudC9zZWxlY3RPcHRpbWFsRW5jb2RpbmciOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIFNlbGVjdE9wdGltYWxFbmNvZGluZ0ZlYXR1cmV9LgorICAgICAqIFRoZSBpbnN0YW5jZSBjcmVhdGVkIHdpbGwgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0T3B0aW1hbEVuY29kaW5nRmVhdHVyZSgpIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU2VsZWN0T3B0aW1hbEVuY29kaW5nRmVhdHVyZX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgZmVhdHVyZSBzaG91bGQKKyAgICAgKiAgICAgICAgICAgICAgICBiZSBlbmFibGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBARmVhdHVyZUNvbnN0cnVjdG9yKHsiZW5hYmxlZCJ9KQorICAgIHB1YmxpYyBTZWxlY3RPcHRpbWFsRW5jb2RpbmdGZWF0dXJlKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gSUQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2NsaWVudC9TZXJ2aWNlSW50ZXJjZXB0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9jbGllbnQvU2VydmljZUludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1NTY4NAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9jbGllbnQvU2VydmljZUludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuY2xpZW50OworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuQmluZGluZ0lEOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTRmVhdHVyZUxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTU2VydmljZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuV1NCaW5kaW5nUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogSW50ZXJjZXB0aW9uIHBvaW50IGZvciBpbm5lciB3b3JraW5nIG9mIHtAbGluayBXU1NlcnZpY2V9LgorICoKKyAqIDxwPgorICogU3lzdGVtLWxldmVsIGNvZGUgY291bGQgaG9vayBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHRvCisgKiB7QGxpbmsgV1NTZXJ2aWNlfSB0byBhdWd1bWVudCBpdHMgYmVoYXZpb3IuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQHNpbmNlIDIuMSBFQTMKKyAqIEBzZWUgU2VydmljZUludGVyY2VwdG9yRmFjdG9yeQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmljZUludGVyY2VwdG9yIHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIHtAbGluayBXU0JpbmRpbmd9IGlzIGNyZWF0ZWQsIHRvIGFsbG93IGludGVyY2VwdG9ycworICAgICAqIHRvIGFkZCB7QGxpbmsgV2ViU2VydmljZUZlYXR1cmV9cyB0byB0aGUgY3JlYXRlZCB7QGxpbmsgV1NCaW5kaW5nfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9ydCBmb3Igd2hpY2ggZGlzcGF0Y2gvcHJveHkgd2lsbCBiZSBjcmVhdGVkLgorICAgICAqIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UKKyAgICAgKiAgICAgIE51bGwgaWYgdGhlIGNyZWF0ZWQgYmluZGluZyBpcyBmb3Ige0BsaW5rIERpc3BhdGNofS4gT3RoZXJpd3NlCisgICAgICogICAgICBpdCByZXByZXNlbnRzIHRoZSBwb3J0IGludGVyZmFjZSBvZiB0aGUgcHJveHkgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdEZlYXR1cmVzCisgICAgICogICAgICBUaGUgbGlzdCBvZiBmZWF0dXJlcyB0aGF0IGFyZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRvIGJlIHNldCBmb3IKKyAgICAgKiAgICAgIHRoZSBuZXdseSBjcmVhdGVkIHtAbGluayBXU0JpbmRpbmd9LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQSBzZXQgb2YgZmVhdHVyZXMgdG8gYmUgYWRkZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQge0BsaW5rIFdTQmluZGluZ30uCisgICAgICogICAgICBDYW4gYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICogICAgICA8dHQ+ZGVmYXVsdEZlYXR1cmVzPC90dD4gd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB3aGF0IHRoaXMgbWV0aG9kCisgICAgICogICAgICB3b3VsZCByZXR1cm4gKGJlY2F1c2UgaXQgaW5jbHVkZXMgdXNlci1zcGVjaWZpZWQgb25lcyB3aGljaCB3aWxsCisgICAgICogICAgICB0YWtlIHRoZSBhdC1tb3N0IHByaW9yaXR5KSwgYnV0IGZlYXR1cmVzIHlvdSByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgQmluZGluZ0lEfSdzCisgICAgICogICAgICB7QGxpbmsgQmluZGluZ0lEI2NyZWF0ZUJ1aWx0aW5GZWF0dXJlTGlzdCgpIGltcGxpY2l0IGZlYXR1cmVzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxXZWJTZXJ2aWNlRmVhdHVyZT4gcHJlQ3JlYXRlQmluZGluZyhATm90TnVsbCBXU1BvcnRJbmZvIHBvcnQsIEBOdWxsYWJsZSBDbGFzczw/PiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIEBOb3ROdWxsIFdTRmVhdHVyZUxpc3QgZGVmYXVsdEZlYXR1cmVzKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgdG8gbm90aWZ5IHRoZSBldmVudCBvZiBjcmVhdGlvbiBvZiBwcm94eSBvYmplY3QgZm9yIFNFSSBlbmRwb2ludC4gVGhlCisgICAgICogY2FsbGJhY2sgY291bGQgc2V0IHNvbWUgcHJvcGVydGllcyBvbiB0aGUge0BsaW5rIEJpbmRpbmdQcm92aWRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnAgY3JlYXRlZCBwcm94eSBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgU0VJIG9mIHRoZSBlbmRwb2ludAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvc3RDcmVhdGVQcm94eShATm90TnVsbCBXU0JpbmRpbmdQcm92aWRlciBicCxATm90TnVsbCBDbGFzczw/PiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgdG8gbm90aWZ5IHRoYXQgYSB7QGxpbmsgRGlzcGF0Y2h9IG9iamVjdCBpcyBjcmVhdGVkLiBUaGUgY2FsbGJhY2sKKyAgICAgKiBjb3VsZCBzZXQgc29tZSBwcm9wZXJ0aWVzIG9uIHRoZSB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBicCBCaW5kaW5nUHJvdmlkZXIgb2YgZGlzcGF0Y2ggb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9zdENyZWF0ZURpc3BhdGNoKEBOb3ROdWxsIFdTQmluZGluZ1Byb3ZpZGVyIGJwKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWdncmVnYXRlcyBtdWx0aXBsZSBpbnRlcmNlcHRvcnMgaW50byBvbmUgZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZUludGVyY2VwdG9yIGFnZ3JlZ2F0ZShmaW5hbCBTZXJ2aWNlSW50ZXJjZXB0b3IuLi4gaW50ZXJjZXB0b3JzKSB7CisgICAgICAgIGlmKGludGVyY2VwdG9ycy5sZW5ndGg9PTEpCisgICAgICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JzWzBdOworICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFdlYlNlcnZpY2VGZWF0dXJlPiBwcmVDcmVhdGVCaW5kaW5nKEBOb3ROdWxsIFdTUG9ydEluZm8gcG9ydCwgQE51bGxhYmxlIENsYXNzPD8+IHBvcnRJbnRlcmZhY2UsIEBOb3ROdWxsIFdTRmVhdHVyZUxpc3QgZGVmYXVsdEZlYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgTGlzdDxXZWJTZXJ2aWNlRmVhdHVyZT4gciA9IG5ldyBBcnJheUxpc3Q8V2ViU2VydmljZUZlYXR1cmU+KCk7CisgICAgICAgICAgICAgICAgZm9yIChTZXJ2aWNlSW50ZXJjZXB0b3Igc2kgOiBpbnRlcmNlcHRvcnMpCisgICAgICAgICAgICAgICAgICAgIHIuYWRkQWxsKHNpLnByZUNyZWF0ZUJpbmRpbmcocG9ydCxwb3J0SW50ZXJmYWNlLGRlZmF1bHRGZWF0dXJlcykpOworICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0Q3JlYXRlUHJveHkoQE5vdE51bGwgV1NCaW5kaW5nUHJvdmlkZXIgYnAsIEBOb3ROdWxsIENsYXNzPD8+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgeworICAgICAgICAgICAgICAgIGZvciAoU2VydmljZUludGVyY2VwdG9yIHNpIDogaW50ZXJjZXB0b3JzKQorICAgICAgICAgICAgICAgICAgICBzaS5wb3N0Q3JlYXRlUHJveHkoYnAsc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdENyZWF0ZURpc3BhdGNoKEBOb3ROdWxsIFdTQmluZGluZ1Byb3ZpZGVyIGJwKSB7CisgICAgICAgICAgICAgICAgZm9yIChTZXJ2aWNlSW50ZXJjZXB0b3Igc2kgOiBpbnRlcmNlcHRvcnMpCisgICAgICAgICAgICAgICAgICAgIHNpLnBvc3RDcmVhdGVEaXNwYXRjaChicCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2NsaWVudC9TZXJ2aWNlSW50ZXJjZXB0b3JGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvY2xpZW50L1NlcnZpY2VJbnRlcmNlcHRvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmViMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2NsaWVudC9TZXJ2aWNlSW50ZXJjZXB0b3JGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuY2xpZW50OworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NTZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUZpbmRlcjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBDcmVhdGVzIHtAbGluayBTZXJ2aWNlSW50ZXJjZXB0b3J9LgorICoKKyAqIDxwPgorICogQ29kZSB0aGF0IHdpc2hlcyB0byBpbmplY3Qge0BsaW5rIFNlcnZpY2VJbnRlcmNlcHRvcn0gaW50byB7QGxpbmsgV1NTZXJ2aWNlfQorICogbXVzdCBpbXBsZW1lbnQgdGhpcyBjbGFzcy4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIGhhdmUgdGhlIEpBWC1XUyBSSQorICogcmVjb2duaXplIHlvdXIge0BsaW5rIFNlcnZpY2VJbnRlcmNlcHRvcn1zLgorICoKKyAqIDxoMz5Vc2Uge0BsaW5rIFNlcnZpY2VGaW5kZXJ9PC9oMz4KKyAqIDxwPgorICoge0BsaW5rIFNlcnZpY2VJbnRlcmNlcHRvckZhY3Rvcnl9cyBkaXNjb3ZlcmVkIHZpYSB7QGxpbmsgU2VydmljZUZpbmRlcn0KKyAqIHdpbGwgYmUgaW5jb3Jwb3JhdGVkIHRvIGFsbCB7QGxpbmsgV1NTZXJ2aWNlfSBpbnN0YW5jZXMuCisgKgorICogPGgzPlJlZ2lzdGVyIHBlci10aHJlYWQ8L2gzPgorICoKKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAc2VlIFNlcnZpY2VJbnRlcmNlcHRvcgorICogQHNlZSAyLjEgRUEzCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2aWNlSW50ZXJjZXB0b3JGYWN0b3J5IHsKKyAgICBwdWJsaWMgYWJzdHJhY3QgU2VydmljZUludGVyY2VwdG9yIGNyZWF0ZShATm90TnVsbCBXU1NlcnZpY2Ugc2VydmljZSk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbGwge0BsaW5rIFNlcnZpY2VJbnRlcmNlcHRvcn1zIGFuZCByZXR1cm4gYWdncmVnYXRlZCBvbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBTZXJ2aWNlSW50ZXJjZXB0b3IgbG9hZChATm90TnVsbCBXU1NlcnZpY2Ugc2VydmljZSwgQE51bGxhYmxlIENsYXNzTG9hZGVyIGNsKSB7CisgICAgICAgIExpc3Q8U2VydmljZUludGVyY2VwdG9yPiBsID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlSW50ZXJjZXB0b3I+KCk7CisKKyAgICAgICAgLy8gZmlyc3Qgc2VydmljZSBsb29rLXVwCisgICAgICAgIGZvciggU2VydmljZUludGVyY2VwdG9yRmFjdG9yeSBmIDogU2VydmljZUZpbmRlci5maW5kKFNlcnZpY2VJbnRlcmNlcHRvckZhY3RvcnkuY2xhc3MpKQorICAgICAgICAgICAgbC5hZGQoZi5jcmVhdGUoc2VydmljZSkpOworCisgICAgICAgIC8vIHRoZW4gdGhyZWFkLWxvY2FsCisgICAgICAgIGZvciggU2VydmljZUludGVyY2VwdG9yRmFjdG9yeSBmIDogdGhyZWFkTG9jYWxGYWN0b3JpZXMuZ2V0KCkpCisgICAgICAgICAgICBsLmFkZChmLmNyZWF0ZShzZXJ2aWNlKSk7CisKKyAgICAgICAgcmV0dXJuIFNlcnZpY2VJbnRlcmNlcHRvci5hZ2dyZWdhdGUobC50b0FycmF5KG5ldyBTZXJ2aWNlSW50ZXJjZXB0b3JbbC5zaXplKCldKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWw8U2V0PFNlcnZpY2VJbnRlcmNlcHRvckZhY3Rvcnk+PiB0aHJlYWRMb2NhbEZhY3RvcmllcyA9IG5ldyBUaHJlYWRMb2NhbDxTZXQ8U2VydmljZUludGVyY2VwdG9yRmFjdG9yeT4+KCkgeworICAgICAgICBwcm90ZWN0ZWQgU2V0PFNlcnZpY2VJbnRlcmNlcHRvckZhY3Rvcnk+IGluaXRpYWxWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxTZXJ2aWNlSW50ZXJjZXB0b3JGYWN0b3J5PigpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyB7QGxpbmsgU2VydmljZUludGVyY2VwdG9yRmFjdG9yeX0gZm9yIHRoaXMgdGhyZWFkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogT25jZSByZWdpc3RlcmVkLCB7QGxpbmsgU2VydmljZUludGVyY2VwdG9yRmFjdG9yeX1zIGFyZSBjb25zdWx0ZWQgZm9yIGV2ZXJ5CisgICAgICoge0BsaW5rIFNlcnZpY2V9IGNyZWF0ZWQgaW4gdGhpcyB0aHJlYWQsIHVudGlsIGl0IGdldHMgdW5yZWdpc3RlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWdpc3RlckZvclRocmVhZChTZXJ2aWNlSW50ZXJjZXB0b3JGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZExvY2FsRmFjdG9yaWVzLmdldCgpLmFkZChmYWN0b3J5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB7QGxpbmsgU2VydmljZUludGVyY2VwdG9yRmFjdG9yeX0gZm9yIHRoaXMgdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1bnJlZ2lzdGVyRm9yVGhyZWFkKFNlcnZpY2VJbnRlcmNlcHRvckZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICByZXR1cm4gdGhyZWFkTG9jYWxGYWN0b3JpZXMuZ2V0KCkucmVtb3ZlKGZhY3RvcnkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9jbGllbnQvV1NQb3J0SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL2NsaWVudC9XU1BvcnRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1YmRkMwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9jbGllbnQvV1NQb3J0SW5mby5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuY2xpZW50OworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuQmluZGluZ0lEOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTU2VydmljZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOworCisvKioKKyAqIEpBWC1XUyBSSSdzIGV4dGVuc2lvbiB0byB7QGxpbmsgUG9ydEluZm99LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBXU1BvcnRJbmZvIGV4dGVuZHMgUG9ydEluZm8geworICAgIC8qKgorICAgICAqIFJldHVybnMge0BsaW5rIFdTU2VydmljZX0gb2JqZWN0IHRoYXQgb3ducyB0aGlzIHBvcnQuCisgICAgICovCisgICAgQE5vdE51bGwgV1NTZXJ2aWNlIGdldE93bmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHtAbGluayAjZ2V0QmluZGluZ0lEKCl9CisgICAgICogYnV0IGluIGEgc3Ryb25nbHktdHlwZWQgZmFzaGlvbgorICAgICAqLworICAgIEBOb3ROdWxsIEJpbmRpbmdJRCBnZXRCaW5kaW5nSWQoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGVuZHBvaW50IGFkZHJlc3Mgb2YgdGhpcyBwb3J0LgorICAgICAqLworICAgIEBOb3ROdWxsIEVuZHBvaW50QWRkcmVzcyBnZXRFbmRwb2ludEFkZHJlc3MoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBXU0RMUG9ydH0gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGlzIHBvcnQsCisgICAgICogaWYge0BsaW5rIFdTU2VydmljZX0gaXMgY29uZmlndXJlZCB3aXRoIFdTREwuIE90aGVyd2lzZSBudWxsLgorICAgICAqLworICAgIEBOdWxsYWJsZSBXU0RMUG9ydCBnZXRQb3J0KCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRGZWF0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3NWJhYgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9mYXN0aW5mb3NldC9GYXN0SW5mb3NldEZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmZhc3RpbmZvc2V0OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkZlYXR1cmVDb25zdHJ1Y3RvcjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKKworLyoqCisgKiBFbmFibGUgb3IgZGlzYWJsZSBGYXN0IEluZm9zZXQgb24gYSBXZWIgc2VydmljZS4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgdGhlIGFmZmVjdHMgb2YgdGhpcyBmZWF0dXJlIHdpdGggcmVzcGVjdAorICogdG8gYmVpbmcgZW5hYmxlZCBvciBkaXNhYmxlZDoKKyAqIDx1bD4KKyAqICA8bGk+IEVOQUJMRUQ6IEluIHRoaXMgTW9kZSwgRmFzdCBJbmZvc2V0IHdpbGwgYmUgZW5hYmxlZC4KKyAqICA8bGk+IERJU0FCTEVEOiBJbiB0aGlzIE1vZGUsIEZhc3QgSW5mb3NldCB3aWxsIGJlIGRpc2FibGVkIGFuZCB0aGUKKyAqICAgICAgIFdlYiBzZXJ2aWNlIHdpbGwgbm90IHByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMgb3IgcHJvZHVjZSBvdXRnb2luZworICogICAgICAgbWVzc2FnZXMgZW5jb2RlZCB1c2luZyBGYXN0IEluZm9zZXQuCisgKiA8L3VsPgorICogPHA+CisgKiBJZiB0aGlzIGZlYXR1cmUgaXMgbm90IHByZXNlbnQgb24gYSBXZWIgc2VydmljZSB0aGVuIHRoZSBkZWZhdWx0IGJlaGF2aW91cgorICogaXMgZXF1aXZhbGVudCB0byB0aGlzIGZlYXR1cmUgYmVpbmcgcHJlc2VudCBhbmQgZW5hYmxlZC4KKyAqIEBhdXRob3IgUGF1bC5TYW5kb3pAU3VuLkNvbQorICovCitwdWJsaWMgY2xhc3MgRmFzdEluZm9zZXRGZWF0dXJlIGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmUgeworICAgIC8qKgorICAgICAqIENvbnN0YW50IHZhbHVlIGlkZW50aWZ5aW5nIHRoZSB7QGxpbmsgRmFzdEluZm9zZXRGZWF0dXJlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheHdzL2Zhc3RpbmZvc2V0IjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBGYXN0SW5mb3NldEZlYXR1cmV9LiBUaGUgaW5zdGFuY2UgY3JlYXRlZCB3aWxsIGJlIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIEZhc3RJbmZvc2V0RmVhdHVyZSgpIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgRmFzdEluZm9zZXRGZWF0dXJlfQorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBmZWF0dXJlIHNob3VsZAorICAgICAqICAgICAgICAgICAgICAgIGJlIGVuYWJsZWQgb3Igbm90LgorICAgICAqLworICAgIEBGZWF0dXJlQ29uc3RydWN0b3IoeyJlbmFibGVkIn0pCisgICAgcHVibGljIEZhc3RJbmZvc2V0RmVhdHVyZShib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKyAgICAgICAgcmV0dXJuIElEOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL0F0dGFjaG1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL0F0dGFjaG1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZkOTViCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2UvQXR0YWNobWVudC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2U7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworCitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBBdHRhY2htZW50LgorICovCitwdWJsaWMgaW50ZXJmYWNlIEF0dGFjaG1lbnQgeworCisgICAgLyoqCisgICAgICogQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudC4gVW5pcXVlbHkgaWRlbnRpZmllcyBhbiBhdHRhY2htZW50LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgVGhlIGNvbnRlbnQgSUQgbGlrZSAiZm9vLWJhci16b3RAYWJjLmNvbSIsIHdpdGhvdXQKKyAgICAgKiAgICAgIHN1cnJvdW5kaW5nICcmbHQ7JyBhbmQgJz4nIHVzZWQgYXMgdGhlIHRyYW5zZmVyIHN5bnRheC4KKyAgICAgKi8KKyAgICBATm90TnVsbCBTdHJpbmcgZ2V0Q29udGVudElkKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBNSU1FIGNvbnRlbnQtdHlwZSBvZiB0aGlzIGF0dGFjaG1lbnQuCisgICAgICovCisgICAgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhdHRhY2htZW50IGFzIGFuIGV4YWN0LWxlbmd0aCBieXRlIGFycmF5LgorICAgICAqLworICAgIGJ5dGVbXSBhc0J5dGVBcnJheSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXR0YWNobWVudCBhcyBhIHtAbGluayBEYXRhSGFuZGxlcn0uCisgICAgICovCisgICAgRGF0YUhhbmRsZXIgYXNEYXRhSGFuZGxlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXR0YWNobWVudCBhcyBhIHtAbGluayBTb3VyY2V9LgorICAgICAqIE5vdGUgdGhhdCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIGFjdHVhbGx5IGFuIFhNTC4KKyAgICAgKi8KKyAgICBTb3VyY2UgYXNTb3VyY2UoKTsKKworICAgIC8qKgorICAgICAqIE9idGFpbnMgdGhpcyBhdHRhY2htZW50IGFzIGFuIHtAbGluayBJbnB1dFN0cmVhbX0uCisgICAgICovCisgICAgSW5wdXRTdHJlYW0gYXNJbnB1dFN0cmVhbSgpOworCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgYXR0YWNobWVudCBpbnRvIHRoZSBnaXZlbiBzdHJlYW0uCisgICAgICovCisgICAgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoaXMgYXR0YWNobWVudCB0byB0aGUgZ2l2ZW4ge0BsaW5rIFNPQVBNZXNzYWdlfS4KKyAgICAgKi8KKyAgICB2b2lkIHdyaXRlVG8oU09BUE1lc3NhZ2Ugc2FhaikgdGhyb3dzIFNPQVBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9BdHRhY2htZW50U2V0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9BdHRhY2htZW50U2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxYWJmNgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL0F0dGFjaG1lbnRTZXQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CisKKy8qKgorICogQSBzZXQgb2Yge0BsaW5rIEF0dGFjaG1lbnR9IG9uIGEge0BsaW5rIE1lc3NhZ2V9LgorICoKKyAqIDxwPgorICogQSBwYXJ0aWN1bGFyIGF0dGVudGlvbiBpcyBtYWRlIHRvIGVuc3VyZSB0aGF0IGF0dGFjaG1lbnRzCisgKiBjYW4gYmUgcmVhZCBhbmQgcGFyc2VkIGxhemlseSBhcyByZXF1ZXN0ZWQuCisgKgorICogQHNlZSBNZXNzYWdlI2dldEF0dGFjaG1lbnRzKCkKKyAqLworcHVibGljIGludGVyZmFjZSBBdHRhY2htZW50U2V0IGV4dGVuZHMgSXRlcmFibGU8QXR0YWNobWVudD4geworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGF0dGFjaG1lbnQgYnkgdGhlIGNvbnRlbnQgSUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGVudElkCisgICAgICogICAgICBUaGUgY29udGVudCBJRCBsaWtlICJmb28tYmFyLXpvdEBhYmMuY29tIiwgd2l0aG91dAorICAgICAqICAgICAgc3Vycm91bmRpbmcgJyZsdDsnIGFuZCAnPicgdXNlZCBhcyB0aGUgdHJhbnNmZXIgc3ludGF4LgorICAgICAqCisgICAgICogQHJldHVybiBudWxsCisgICAgICogICAgICBpZiBubyBzdWNoIGF0dGFjaG1lbnQgZXhpc3QuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgQXR0YWNobWVudCBnZXQoU3RyaW5nIGNvbnRlbnRJZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBubyBhdHRhY2htZW50LgorICAgICAqLworICAgIGJvb2xlYW4gaXNFbXB0eSgpOworCisgICAgLyoqCisgICAgICogQWRkcyBhbiBhdHRhY2htZW50IHRvIHRoaXMgc2V0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGl0J3MgT0sgZm9yIGFuIHtAbGluayBBdHRhY2htZW50fSB0byBiZWxvbmcgdG8KKyAgICAgKiBtb3JlIHRoYW4gb25lIHtAbGluayBBdHRhY2htZW50U2V0fSAod2hpY2ggaXMgaW4gZmFjdAorICAgICAqIG5lY2Vzc2FyeSB3aGVuIHlvdSB3cmFwIGEge0BsaW5rIE1lc3NhZ2V9IGludG8gYW5vdGhlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHQKKyAgICAgKiAgICAgIG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKEF0dGFjaG1lbnQgYXR0KTsKKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2UvRXhjZXB0aW9uSGFzTWVzc2FnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2UvRXhjZXB0aW9uSGFzTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTQ1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9FeGNlcHRpb25IYXNNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5leGNlcHRpb24uSkFYV1NFeGNlcHRpb25CYXNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBFeGNlcHRpb24gdGhhdCBuZWVkcyB0byBiZSBtYXJzaGFsbGVkCisgKiB3aXRoIGEgc3BlY2lmaWMgcHJvdG9jb2wgd2lyZSBmb3JtYXQuIEZvciBleGFtcGxlLCB0aGUgU09BUCdzCisgKiBWZXJzaW9uTWlzbWF0Y2hGYXVsdCBuZWVkcyB0byBiZSB3cml0dGVuIHdpdGggYSBjb3JyZWN0IGZhdWx0IGNvZGUuCisgKiBJbiB0aGF0IGNhc2UsIGRlY29kZXIgY291bGQgdGhyb3cge0BsaW5rIFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbn0sCisgKiBhbmQgdGhlIGNvcnJlc3BvaW5kaW5nIGZhdWx0IHtAbGluayBNZXNzYWdlfSBmcm9tIHtAbGluayBFeGNlcHRpb25IYXNNZXNzYWdlOjpnZXRGYXVsdE1lc3NhZ2V9CisgKiBpcyBzZW50IG9uIHRoZSB3aXJlLgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGNlcHRpb25IYXNNZXNzYWdlIGV4dGVuZHMgSkFYV1NFeGNlcHRpb25CYXNlIHsKKworICAgIHB1YmxpYyBFeGNlcHRpb25IYXNNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIHN1cGVyKGtleSwgYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIGludG8gYSBmYXVsdCBNZXNzYWdlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1lc3NhZ2UgZ2V0RmF1bHRNZXNzYWdlKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9IZWFkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL0hlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZWYyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9IZWFkZXIuamF2YQpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5XU0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworCisvKioKKyAqIEEgU09BUCBoZWFkZXIuCisgKgorICogPHA+CisgKiBBIGhlYWRlciBpcyBpbW11dGFibGUsIGJ1dCB1bmxpa2UgYm9keSBpdCBjYW4gYmUgcmVhZAorICogbXVsdGlwbGUgdGltZXMuCisgKiBUaGUge0BsaW5rIEhlYWRlcn0gYWJzdHJhY3Rpb24gaGlkZXMgaG93IHRoZSBoZWFkZXIKKyAqIGRhdGEgaXMgcmVwcmVzZW50ZWQgaW4gbWVtb3J5OyBpbnN0ZWFkLCBpdCBjb21taXRzIHRvCisgKiB0aGUgYWJpbGl0eSB0byB3cml0ZSBpdHNlbGYgdG8gWE1MIGluZm9zZXQuCisgKgorICogPHA+CisgKiBXaGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSB0cmFuc3BvcnQgYW5kCisgKiBiZWluZyBwcm9jZXNzZWQsIHRoZSBwcm9jZXNzb3IgbmVlZHMgdG8gInBlZWsiCisgKiBzb21lIGluZm9ybWF0aW9uIG9mIGEgaGVhZGVyLCBzdWNoIGFzIHRoZSB0YWcgbmFtZSwKKyAqIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUsIGFuZCBzbyBvbi4gVGhlcmVmb3JlLAorICogdGhlIHtAbGluayBIZWFkZXJ9IGludGVyZmFjZSBleHBvc2VzIHRob3NlIGluZm9ybWF0aW9uCisgKiBhcyBwcm9wZXJ0aWVzLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNoZWNrZWQgd2l0aG91dAorICogcmVwbGF5aW5nIHRoZSBpbmZvc2V0LCB3aGljaCBpcyBlZmZpY2llbnRseSBidXQgc3RpbGwKKyAqIGNvc3RseS4KKyAqCisgKiA8cD4KKyAqIEEge0BsaW5rIEhlYWRlcn0gbWF5IGJlbG9uZyB0byBtb3JlIHRoYW4gb25lIHtAbGluayBIZWFkZXJMaXN0fQorICogZHVlIHRvIHdyYXBwaW5nIG9mIHtAbGluayBNZXNzYWdlfS4KKyAqCisgKiBAc2VlIEhlYWRlckxpc3QKKyAqIEBzZWUgSGVhZGVycworICovCitwdWJsaWMgaW50ZXJmYWNlIEhlYWRlciB7CisgICAgLy8gVE9ETzogVml2ZWsgcG9pbnRlZCBvdXQgdGhhdCB0aGUgb25seSB0aW1lIHdlIGFyZSBsb29raW5nIGF0CisgICAgLy8gbXVzdFVuZGVyc3RhbmQgYW5kIHJvbGUgYXJlIHdoZW4gd2UgZG8gdGhlIG11c3RVbmRlcnN0YW5kIGVycm9yIGNoZWNrCisgICAgLy8gKHRoYXQgaXMsIHRvIGZpbmQgb3V0IGlmIHRoZXJlJ3MgYW55IGhlYWRlciB3aXRoIEBtdXN0VW5kZXJzdGFuZCB0aGF0CisgICAgLy8gaGFzIGFwcHJvcHJpYXRlIHJvbGUgZm9yIHVzLikKKyAgICAvLyBpZiB0aGF0J3MgdGhlIGNhc2UsIGl0IG1pZ2h0IGJlIGJldHRlciBpZiB3ZSBkZWZpbmUgdGhpcyB3aG9sZSBvcGVyYXRpb24KKyAgICAvLyBhcyBvbmUgbWV0aG9kLCBpbnN0ZWFkIG9mIGV4cG9zaW5nIHR3byBwcm9wZXJ0aWVzLgorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoaXMgaGVhZGVyIGlzIGlnbm9yYWJsZSBmb3IgdXMgKElPVywgbWFrZSBzdXJlCisgICAgICogdGhhdCB0aGlzIGhlYWRlciBoYXMgYSBwcm9ibGVtYXRpYyAibXVzdFVuZGVyc3RhbmQiIGhlYWRlciB2YWx1ZQorICAgICAqIHRoYXQgd2UgaGF2ZSB0byByZWplY3QuKQorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBhcyBhIHBhcnQgb2YgdGhlCisgICAgICogPGEgaHJlZj0iSGVhZGVyTGlzdC5odG1sI01VIj5tdXN0VW5kZXJzdGFueCBwcm9jZXNzaW5nPC9hPi4KKyAgICAgKiBBdCB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzaW5nLCB0aGUgSkFYLVdTIGlkZW50aWZpZXMgYSBsaXN0IG9mIHtAbGluayBIZWFkZXJ9cworICAgICAqIHRoYXQgd2VyZSBub3QgdW5kZXJzdG9vZC4gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbiB0aG9zZSB7QGxpbmsgSGVhZGVyfXMsCisgICAgICogdG8gdmVyaWZ5IHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZXBvcnQgYW4gZXJyb3IgZm9yIGl0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogc3BlY2lmaWNhbGx5LCB0aGlzIG1ldGhvZCBoYXMgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOgorICAgICAqCisgICAgICogPHVsPgorICAgICAqICA8bGk+SWYgdGhpcyBoZWFkZXIgZG9lcyBub3QgaGF2ZSA8dHQ+bXVzdFVuZGVyc3RhbmQ8L3R0PiBhcyAiMSIgbm9yICJ0cnVlIiwKKyAgICAgKiAgICAgIHRoZW4gdGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdHJ1ZS4KKyAgICAgKiAgPGxpPk90aGVyd2lzZSwgY2hlY2sgdGhlIHJvbGUgYXR0cmlidXRlIChmb3IgU09BUCAxLjIpIG9yIHRoZSBhY3RvciBhdHRyaWJ1dGUgKGZvciBTT0FQIDEuMSkuCisgICAgICogICAgICBXaGVuIHRob3NlIGF0dHJpYnV0ZXMgYXJlIGFic2VudCwgdGhlIGRlZmF1bHQgdmFsdWVzIGhhdmUgdG8gYmUgYXNzdW1lZC4KKyAgICAgKiAgICAgIFNlZSB7QGxpbmsgI2dldFJvbGUoU09BUFZlcnNpb24pfSBmb3IgaG93IHRoZSB2YWx1ZXMgYXJlIGRlZmF1bHRlZC4KKyAgICAgKiAgICAgIE5vdywgc2VlIGlmIHRoZSB7QGNvZGUgcm9sZXN9IHNldCBjb250YWlucyB0aGUgdmFsdWUuCisgICAgICogICAgICBJZiBzbywgdGhpcyBtZXRob2QgbXVzdCByZXR1cm4gZmFsc2UgKGluZGljYXRpbmcgdGhhdCBhbiBlcnJvciBpcyBpbiBvcmRlci4pCisgICAgICogIDxsaT5PdGhlcndpc2UgcmV0dXJuIHRydWUgKHNpbmNlIHdlIGRvbid0IHBsYXkgdGhlIHJvbGUgdGhpcyBoZWFkZXIgaXMgaW50ZW5kZWQgZm9yLikKKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIHNvYXBWZXJzaW9uCisgICAgICogICAgICBUaGUgY2FsbGVyIHNwZWNpZmllcyB0aGUgU09BUCB2ZXJzaW9uIHRoYXQgdGhlIHBpcGVsaW5lIGlzIHdvcmtpbmcgYWdhaW5zdC4KKyAgICAgKiAgICAgIE9mdGVuIGVhY2gge0BsaW5rIEhlYWRlcn0gaW1wbGVtZW50YXRpb24gYWxyZWFkeSBrbm93cyB0aGUgU09BUCB2ZXJzaW9uCisgICAgICogICAgICBhbnl3YXksIGJ1dCB0aGlzIGFsbG93cyBzb21lIHtAbGluayBIZWFkZXJ9cyB0byBhdm9pZCBrZWVwaW5nIGl0LgorICAgICAqICAgICAgVGhhdCdzIHdoeSB0aGlzIHJlZHVuZGFudCBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluLgorICAgICAqIEBwYXJhbSByb2xlcworICAgICAqICAgICAgVGhlIHNldCBvZiByb2xlIHZhbHVlcyB0aGF0IHRoZSBjdXJyZW50IEpBWC1XUyBwaXBlbGluZSBpcyBhc3N1bWluZy4KKyAgICAgKiAgICAgIE5vdGUgdGhhdCBTT0FQIDEuMSBhbmQgU09BUCAxLjIgdXNlIGRpZmZlcmVudCBzdHJpbmdzIGZvciB0aGUgc2FtZSByb2xlLAorICAgICAqICAgICAgYW5kIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHN1cHBseWluZyBhIHByb3BlciB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlCisgICAgICogICAgICBhY3RpdmUgU09BUCB2ZXJzaW9uIGluIHVzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRydWUgaWYgbm8gZXJyb3IgbmVlZHMgdG8gYmUgcmVwb3J0ZWQuIEZhbHNlIGlmIGFuIGVycm9yIG5lZWRzIHRvIGJlIHJhaXNlZC4KKyAgICAgKiAgICAgIFNlZSB0aGUgbWV0aG9kIGphdmFkb2MgZm9yIG1vcmUgZGlzY3Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZShATm90TnVsbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgQE5vdE51bGwgU2V0PFN0cmluZz4gcm9sZXMpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNvYXA6cm9sZSBhdHRyaWJ1dGUgKG9yIHNvYXA6YWN0b3IgZm9yIFNPQVAgMS4xKS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBhdHRyaWJ1dGUgaXMgb21pdHRlZCwgdGhlIHZhbHVlIGRlZmF1bHRzIHRvIHtAbGluayBTT0FQVmVyc2lvbiNpbXBsaWNpdFJvbGV9LgorICAgICAqCisgICAgICogQHBhcmFtIHNvYXBWZXJzaW9uCisgICAgICogICAgICBUaGUgY2FsbGVyIHNwZWNpZmllcyB0aGUgU09BUCB2ZXJzaW9uIHRoYXQgdGhlIHBpcGVsaW5lIGlzIHdvcmtpbmcgYWdhaW5zdC4KKyAgICAgKiAgICAgIE9mdGVuIGVhY2gge0BsaW5rIEhlYWRlcn0gaW1wbGVtZW50YXRpb24gYWxyZWFkeSBrbm93cyB0aGUgU09BUCB2ZXJzaW9uCisgICAgICogICAgICBhbnl3YXksIGJ1dCB0aGlzIGFsbG93cyBzb21lIHtAbGluayBIZWFkZXJ9cyB0byBhdm9pZCBrZWVwaW5nIGl0LgorICAgICAqICAgICAgVGhhdCdzIHdoeSB0aGlzIHJlZHVuZGFudCBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG5ldmVyIG51bGwuIFRoaXMgc3RyaW5nIG5lZWQgbm90IGJlIGludGVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0Um9sZShATm90TnVsbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbik7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgaGVhZGVyIGlzIHRvIGJlIHJlbGF5ZWQgaWYgbm90IHByb2Nlc3NlZC4KKyAgICAgKiBGb3IgU09BUCAxLjEgbWVzc2FnZXMsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm4gZmFsc2UuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJT1csIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSdzIEBzb2FwOnJlbGF5PSd0cnVlJworICAgICAqIGlzIHByZXNlbnQuCisgICAgICoKKyAgICAgKiA8aDM+SW1wbGVtZW50YXRpb24gTm90ZTwvaDM+CisgICAgICogPHA+CisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvIGNoZWNrIGZvciBib3RoICJ0cnVlIiBhbmQgIjEiLAorICAgICAqIGJ1dCBiZWNhdXNlIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIG5vcm1hbGl6ZWQsIGl0IGRvZXNuJ3QgaGF2ZQorICAgICAqIHRvIGNvbnNpZGVyICIgdHJ1ZSIsICIgMSAiLCBhbmQgc28gb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbGF5KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoaXMgaGVhZGVyIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGlzIHN0cmluZyBtdXN0IGJlIGludGVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsb2NhbCBuYW1lIG9mIHRoaXMgaGVhZGVyIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGlzIHN0cmluZyBtdXN0IGJlIGludGVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIGhlYWRlciBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG5zVXJpCisgICAgICogICAgICBUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlLiBDYW4gYmUgZW1wdHkuCisgICAgICogQHBhcmFtIGxvY2FsTmFtZQorICAgICAqICAgICAgVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQsIHJldHVybiB0aGUgd2hpdGVzcGFjZSBub3JtYWxpemVkIHZhbHVlLgorICAgICAqICAgICAgKG1lYW5pbmcgbm8gbGVhZGluZy90cmFpbGluZyBzcGFjZSwgbm8gY29uc2VxdXRpdmUgd2hpdGVzcGFjZXMgaW4tYmV0d2Vlbi4pCisgICAgICogICAgICBPdGhlcndpc2UgbnVsbC4gTm90ZSB0aGF0IHRoZSBYTUwgcGFyc2VycyBhcmUgcmVzcG9uc2libGUgZm9yCisgICAgICogICAgICB3aGl0ZXNwYWNlLW5vcm1hbGl6aW5nIGF0dHJpYnV0ZXMsIHNvIHtAbGluayBIZWFkZXJ9IGltcGxlbWVudGF0aW9uCisgICAgICogICAgICBkb2Vzbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuCisgICAgICovCisgICAgQE51bGxhYmxlIFN0cmluZyBnZXRBdHRyaWJ1dGUoQE5vdE51bGwgU3RyaW5nIG5zVXJpLCBATm90TnVsbCBTdHJpbmcgbG9jYWxOYW1lKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvbiB0aGUgaGVhZGVyIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY2FsbHMgaW50byB7QGxpbmsgI2dldEF0dHJpYnV0ZShTdHJpbmcsIFN0cmluZyl9CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgTmV2ZXIgbnVsbC4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIFN0cmluZykKKyAgICAgKi8KKyAgICBATnVsbGFibGUgU3RyaW5nIGdldEF0dHJpYnV0ZShATm90TnVsbCBRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBoZWFkZXIgYXMgYSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCBwYXJzZXIgcG9pbnRzIGF0IHRoZSBzdGFydCBlbGVtZW50IG9mIHRoaXMgaGVhZGVyLgorICAgICAqIChJT1csIHtAbGluayBYTUxTdHJlYW1SZWFkZXIjZ2V0RXZlbnRUeXBlKCl9IHdvdWxkIHJldHVybgorICAgICAqIHtAbGluayBYTUxTdHJlYW1SZWFkZXIjU1RBUlRfRUxFTUVOVH0uCisgICAgICoKKyAgICAgKiA8aDM+UGVyZm9ybWFuY2UgRXhwZWN0YXRpb248L2gzPgorICAgICAqIDxwPgorICAgICAqIEZvciBzb21lIHtAbGluayBIZWFkZXJ9IGltcGxlbWVudGF0aW9ucywgdGhpcyBvcGVyYXRpb24KKyAgICAgKiBpcyBhIG5vbi10cml2aWFsIG9wZXJhdGlvbi4gVGhlcmVmb3JlLCB1c2Ugb2YgdGhpcyBtZXRob2QKKyAgICAgKiBpcyBkaXNjb3VyYWdlZCB1bmxlc3MgdGhlIGNhbGxlciBpcyBpbnRlcmVzdGVkIGluIHJlYWRpbmcKKyAgICAgKiB0aGUgd2hvbGUgaGVhZGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogU2ltaWxhcmx5LCBpZiB0aGUgY2FsbGVyIHdhbnRzIHRvIHVzZSB0aGlzIG1ldGhvZCBvbmx5IHRvIGRvCisgICAgICogdGhlIEFQSSBjb252ZXJzaW9uIChzdWNoIGFzIHNpbXBseSBmaXJpbmcgU0FYIGV2ZW50cyBmcm9tCisgICAgICoge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0pLCB0aGVuIHRoZSBKQVgtV1MgdGVhbSByZXF1ZXN0cworICAgICAqIHRoYXQgeW91IHRhbGsgdG8gdXMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgTWVzc2FnZX1zIHRoYXQgY29tZSBmcm9tIHRyYW5wb3J0IHVzdWFsbHkgcHJvdmlkZXMKKyAgICAgKiBhIHJlYXNvbmFibHkgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbXVzdCBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIHJlYWRIZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGhlYWRlciBhcyBhIEpBWEIgb2JqZWN0IGJ5IHVzaW5nIHRoZSBnaXZlbiB1bm1hcnNoYWxsZXIuCisgICAgICovCisgICAgcHVibGljIDxUPiBUIHJlYWRBc0pBWEIoVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgdGhyb3dzIEpBWEJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgaGVhZGVyIGFzIGEgSkFYQiBvYmplY3QgYnkgdXNpbmcgdGhlIGdpdmVuIHVubWFyc2hhbGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEFzSkFYQihCcmlkZ2U8VD4gYnJpZGdlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoaXMgaGVhZGVyIGFzIGFuIHtAbGluayBXU0VuZHBvaW50UmVmZXJlbmNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHBlY3RlZAorICAgICAqICAgICAgVGhlIHZlcnNpb24gb2YgdGhlIGFkZHJlc3NpbmcgdXNlZCB0byBwYXJzZSB0aGUgRVBSLgorICAgICAqICAgICAgSWYgdGhlIGFjdHVhbCBpbmZvc2V0IGFuZCB0aGlzIGRvZXNuJ3QgYWdyZWUsIHRoZW4KKyAgICAgKiAgICAgIHlvdSdsbCBnZXQgYW4ge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259IHN0YXRpbmcgdGhhdCBmYWN0LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgT24gYSBzdWNjZXNzZnVsIHJldHVybiwgdGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBXU0VuZHBvaW50UmVmZXJlbmNlIHJlYWRBc0VQUihBZGRyZXNzaW5nVmVyc2lvbiBleHBlY3RlZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBvdXQgdGhlIGhlYWRlciBhcyBhIGZyYWdtZW50LgorICAgICAqCisgICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMgZm9yIHNvbWUgcmVhc29uLiBUaGlzIGxlYXZlcyB0aGUKKyAgICAgKiAgICAgIHdyaXRlciB0byBhbiB1bmRlZmluZWQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhYTUxTdHJlYW1Xcml0ZXIgdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBvdXQgdGhlIGhlYWRlciB0byB0aGUgZ2l2ZW4gU09BUE1lc3NhZ2UuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTb21ldGltZXMgYSB7QGxpbmsgTWVzc2FnZX0gbmVlZHMgdG8gcHJvZHVjZSBpdHNlbGYKKyAgICAgKiBhcyB7QGxpbmsgU09BUE1lc3NhZ2V9LCBpbiB3aGljaCBjYXNlIGVhY2ggaGVhZGVyIG5lZWRzCisgICAgICogdG8gdHVybiBpdHNlbGYgaW50byBhIGhlYWRlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhlIG9wZXJhdGlvbiBmYWlscyBmb3Igc29tZSByZWFzb24uIFRoaXMgbGVhdmVzIHRoZQorICAgICAqICAgICAgd3JpdGVyIHRvIGFuIHVuZGVmaW5lZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFNPQVBNZXNzYWdlIHNhYWopIHRocm93cyBTT0FQRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogV3JpdGVzIG91dCB0aGUgaGVhZGVyIGFzIFNBWCBldmVudHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTb21ldGltZXMgYSB7QGxpbmsgTWVzc2FnZX0gbmVlZHMgdG8gcHJvZHVjZSBTQVggZXZlbnRzLAorICAgICAqIGFuZCB0aGlzIG1ldGhvZCBpcyBuZWNlc3NhcnkgZm9yIGhlYWRlcnMgdG8gcGFydGljaXBhdGUgdG8gaXQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIGhlYWRlciBpcyByZXNwb25zaWJsZSBmb3IgcHJvZHVjaW5nIHRoZSBTQVggZXZlbnRzIGZvciBpdHMgcGFydCwKKyAgICAgKiBpbmNsdWRpbmcgPHR0PnN0YXJ0UHJlZml4TWFwcGluZzwvdHQ+IGFuZCA8dHQ+ZW5kUHJlZml4TWFwcGluZzwvdHQ+LAorICAgICAqIGJ1dCBub3Qgc3RhcnREb2N1bWVudC9lbmREb2N1bWVudC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCBTQVggY29udHJhY3QgcmVxdWlyZXMgdGhhdCBhbnkgZXJyb3IgdGhhdCBkb2VzIE5PVCBvcmlnaW5hdGUKKyAgICAgKiBmcm9tIHtAbGluayBDb250ZW50SGFuZGxlcn0gKG1lYW5pbmcgYW55IHBhcnNpbmcgZXJyb3IgYW5kIGV0YykgbXVzdAorICAgICAqIGJlIGZpcnN0IHJlcG9ydGVkIHRvIHtAbGluayBFcnJvckhhbmRsZXJ9LiBJZiB0aGUgU0FYIGV2ZW50IHByb2R1Y3Rpb24KKyAgICAgKiBjYW5ub3QgYmUgY29udGludWVkIGFuZCB0aGUgcHJvY2Vzc2luZyBuZWVkcyB0byBhYm9ydCwgdGhlIGNvZGUgbWF5CisgICAgICogdGhlbiB0aHJvdyB0aGUgc2FtZSB7QGxpbmsgU0FYUGFyc2VFeGNlcHRpb259IHJlcG9ydGVkIHRvIHtAbGluayBFcnJvckhhbmRsZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRlbnRIYW5kbGVyCisgICAgICogICAgICBUaGUge0BsaW5rIENvbnRlbnRIYW5kbGVyfSB0aGF0IHJlY2VpdmVzIFNBWCBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyCisgICAgICogICAgICBUaGUge0BsaW5rIEVycm9ySGFuZGxlcn0gdGhhdCByZWNlaXZlcyBwYXJzaW5nIGVycm9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBvYnRhaW4gdmFsdWUgWFlaIGZyb20gYSBoZWFkZXIgdGhhdCBsb29rcyBsaWtlCisgICAgICogIiZsdDtoZWFkZXImZ3Q7WFlaJmx0Oy9oZWFkZXImZ3Q7Ii4gVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgaGVhZGVyCisgICAgICogZm9yIG5vdyBpcyB0byBhY2Nlc3MgY2VydGFpbiBBZGRyZXNzaW5nIGhlYWRlcnMgcXVpY2tseS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgSWYgdGhlIHN0cnVjdHVyZSBvZiB0aGUgaGVhZGVyIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbgorICAgICAqICAgICAgYSBzaW1wbGUgc3RyaW5nIGhlYWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIENhbiBiZSBlbXB0eSBidXQgYWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0U3RyaW5nQ29udGVudCgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2UvSGVhZGVyTGlzdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2UvSGVhZGVyTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTJjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9IZWFkZXJMaXN0LmphdmEKQEAgLTAsMCArMSw3OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2U7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcuV3NhVHViZUhlbHBlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5PbmVXYXlGZWF0dXJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29kZWM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5SZWxhdGVzVG9IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5TdHJpbmdIZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcC5DbGllbnRNVVR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcC5TZXJ2ZXJNVVR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkFkZHJlc3NpbmdNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuQ2xpZW50TWVzc2FnZXM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIGxpc3Qgb2Yge0BsaW5rIEhlYWRlcn1zIG9uIGEge0BsaW5rIE1lc3NhZ2V9LgorICoKKyAqIDxwPgorICogVGhpcyBsaXN0IGNhbiBiZSBtb2RpZmllZCB0byBhZGQgaGVhZGVycworICogZnJvbSBvdXRzaWRlIGEge0BsaW5rIE1lc3NhZ2V9LCB0aGlzIGlzIG5lY2Vzc2FyeQorICogc2luY2UgaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgbGF5ZXJzIG9mdGVuIG5lZWQgdG8KKyAqIHB1dCBhZGRpdGlvbmFsIGhlYWRlcnMuCisgKgorICogPHA+CisgKiBGb2xsb3dpbmcgdGhlIFNPQVAgY29udmVudGlvbiwgdGhlIG9yZGVyIGFtb25nIGhlYWRlcnMKKyAqIGFyZSBub3Qgc2lnbmlmaWNhbnQuIEhvd2V2ZXIsIHtAbGluayBDb2RlY31zIGFyZQorICogZXhwZWN0ZWQgdG8gcHJlc2VydmUgdGhlIG9yZGVyIG9mIGhlYWRlcnMgaW4gdGhlIGlucHV0CisgKiBtZXNzYWdlIGFzIG11Y2ggYXMgcG9zc2libGUuCisgKgorICoKKyAqIDxhIG5hbWU9Ik1VIj48L2E+CisgKiA8aDM+TXVzdFVuZGVyc3RhbmQgUHJvY2Vzc2luZzwvaDM+CisgKiA8cD4KKyAqIFRvIHBlcmZvcm0gU09BUCBtdXN0VW5kZXJzdGFuZyBwcm9jZXNzaW5nIGNvcnJlY3RseSwgd2UgbmVlZCB0byBrZWVwCisgKiB0cmFjayBvZiBoZWFkZXJzIHRoYXQgYXJlIHVuZGVyc3Rvb2QgYW5kIGhlYWRlcnMgdGhhdCBhcmUgbm90LgorICogVGhpcyBpcyBhIGNvbGxhYm9yYXRpdmUgcHJvY2VzcyBhbW9uZyB7QGxpbmsgUGlwZX1zLCB0aHVzIGl0J3Mgc29tZXRoaW5nCisgKiBhIHtAbGluayBQaXBlfSBhdXRob3IgbmVlZHMgdG8ga2VlcCBpbiBtaW5kLgorICoKKyAqIDxwPgorICogU3BlY2lmaWNhbGx5LCB3aGVuIGEge0BsaW5rIFBpcGV9IHNlZXMgYSBoZWFkZXIgYW5kIHByb2Nlc3NlcyBpdAorICogKHRoYXQgaXMsIGlmIGl0IGRpZCBlbm91Z2ggY29tcHV0aW5nIHdpdGggdGhlIGhlYWRlciB0byBjbGFpbSB0aGF0CisgKiB0aGUgaGVhZGVyIGlzIHVuZGVyc3Rvb2QpLCB0aGVuIGl0IHNob3VsZCBtYXJrIHRoZSBjb3JyZXNwb25kaW5nCisgKiBoZWFkZXIgYXMgInVuZGVyc3Rvb2QiLiBGb3IgZXhhbXBsZSwgd2hlbiBhIHBpcGUgdGhhdCBoYW5kbGVzIEpBWC1XU0EKKyAqIGV4YW1pbnMgdGhlICZsdDt3c2E6VG8+IGhlYWRlciwgaXQgY2FuIGNsYWltIHRoYXQgaXQgdW5kZXJzdG9vZCB0aGUgaGVhZGVyLgorICogQnV0IGZvciBleGFtcGxlLCBpZiBhIHBpcGUgdGhhdCBkb2VzIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGNoZWNrcworICogJmx0O3dzYTpUbz4gZm9yIGEgc2lnbmF0dXJlLCB0aGF0IHdvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzICJ1bmRlcnN0b29kIi4KKyAqCisgKiA8cD4KKyAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byBtYXJrIGEgaGVhZGVyIGFzIHVuZGVyc3Rvb2Q6CisgKgorICogPG9sPgorICogIDxsaT5Vc2Ugb25lIG9mIHRoZSA8dHQ+Z2V0WFhYPC90dD4gbWV0aG9kcyB0aGF0IHRha2UgYQorICogICAgICBib29sZWFuIDx0dD5tYXJrQXNVbmRlcnN0b29kPC90dD4gcGFyYW1ldGVyLgorICogICAgICBNb3N0IG9mdGVuLCBhIHtAbGluayBQaXBlfSBrbm93cyBpdCdzIGdvaW5nIHRvIHVuZGVyc3RhbmQgYSBoZWFkZXIKKyAqICAgICAgYXMgbG9uZyBhcyBpdCdzIHByZXNlbnQsIHNvIHRoaXMgaXMgdGhlIGVhc2llc3QgYW5kIHRodXMgdGhlIHByZWZlcnJlZCB3YXkuCisgKgorICogICAgICBGb3IgZXhhbXBsZSwgaWYgSkFYLVdTQSBsb29rcyBmb3IgJmx0O3dzYTpUbz4sIHRoZW4gaXQgY2FuIHNldAorICogICAgICA8dHQ+bWFya0FzVW5kZXJzdGFuZDwvdHQ+IHRvIHRydWUsIHRvIGRvIHRoZSBvYnRhaW5pbmcgb2YgYSBoZWFkZXIKKyAqICAgICAgYW5kIG1hcmtpbmcgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKiAgPGxpPkNhbGwge0BsaW5rICN1bmRlcnN0b29kKGludCl9LgorICogICAgICBJZiB1bmRlciBhIHJhcmUgY2lyY3Vtc3RhbmNlLCBhIHBpcGUgY2Fubm90IGRldGVybWluZSB3aGV0aGVyCisgKiAgICAgIGl0IGNhbiB1bmRlcnN0YW5kIGl0IG9yIG5vdCB3aGVuIHlvdSBhcmUgZmV0Y2hpbmcgYSBoZWFkZXIsIHRoZW4KKyAqICAgICAgeW91IGNhbiB1c2UgdGhpcyBtZXRob2QgYWZ0ZXJ3YXJkIHRvIG1hcmsgaXQgYXMgdW5kZXJzdG9vZC4KKyAqIDwvb2w+CisgKgorICogPHA+CisgKiBJbnR1aXRpdmVseSBzcGVha2luZywgYXQgdGhlIGVuZCBvZiB0aGUgZGF5LCBpZiBhIGhlYWRlciBpcyBub3QKKyAqIHVuZGVyc3Rvb2QgYnV0IHtAbGluayBIZWFkZXIjaXNJZ25vcmFibGUoU09BUFZlcnNpb24sIFNldCl9IGlzIGZhbHNlLCBhIGJhZCB0aGluZworICogd2lsbCBoYXBwZW4uIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNoZWNraW5nIGlzIG1vcmUgY29tcGxpY2F0ZWQsCisgKiBmb3IgdGhhdCBzZWUge0BsaW5rIENsaWVudE1VVHViZX0ve0BsaW5rIFNlcnZlck1VVHViZX0uCisgKgorICogQHNlZSBNZXNzYWdlI2dldEhlYWRlcnMoKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSGVhZGVyTGlzdCBleHRlbmRzIEFycmF5TGlzdDxIZWFkZXI+IHsKKworICAgIC8qKgorICAgICAqIEJpdCBzZXQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBoZWFkZXJzIGFyZSB1bmRlcnN0b29kLgorICAgICAqIDxwPgorICAgICAqIFRoZSBmaXJzdCAzMiBoZWFkZXJzIHVzZSB0aGlzIGZpZWxkLCBhbmQgdGhlIHJlc3Qgd2lsbCB1c2UKKyAgICAgKiB7QGxpbmsgI21vcmVVbmRlcnN0b29kQml0c30uIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0CisgICAgICogbW9zdCBvZiB0aGUgdGltZSBhIFNPQVAgbWVzc2FnZSB3aWxsIG9ubHkgaGF2ZSB1cCB0byAzMiBoZWFkZXJzLAorICAgICAqIHNvIHdlIGNhbiBhdm9pZCBhbGxvY2F0aW5nIHNlcGFyYXRlIG9iamVjdHMgZm9yIHtAbGluayBCaXRTZXR9LgorICAgICAqLworICAgIHByaXZhdGUgaW50IHVuZGVyc3Rvb2RCaXRzOworICAgIC8qKgorICAgICAqIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzIgaGVhZGVycywgd2UgdXNlIHRoaXMge0BsaW5rIEJpdFNldH0KKyAgICAgKiB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhvc2UgaGVhZGVycyBhcmUgdW5kZXJzdG9vZC4KKyAgICAgKiBMYXppbHkgYWxsb2NhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgQml0U2V0IG1vcmVVbmRlcnN0b29kQml0cyA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyB0byA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uID0gbnVsbDsKKyAgICBwcml2YXRlIFdTRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbyA9IG51bGw7CisgICAgcHJpdmF0ZSBXU0VuZHBvaW50UmVmZXJlbmNlIGZhdWx0VG8gPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VJZDsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbXB0eSB7QGxpbmsgSGVhZGVyTGlzdH0uCisgICAgICovCisgICAgcHVibGljIEhlYWRlckxpc3QoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGVhZGVyTGlzdChIZWFkZXJMaXN0IHRoYXQpIHsKKyAgICAgICAgc3VwZXIodGhhdCk7CisgICAgICAgIHRoaXMudW5kZXJzdG9vZEJpdHMgPSB0aGF0LnVuZGVyc3Rvb2RCaXRzOworICAgICAgICBpZih0aGF0Lm1vcmVVbmRlcnN0b29kQml0cyE9bnVsbCkKKyAgICAgICAgICAgIHRoaXMubW9yZVVuZGVyc3Rvb2RCaXRzID0gKEJpdFNldCl0aGF0Lm1vcmVVbmRlcnN0b29kQml0cy5jbG9uZSgpOworICAgICAgICB0aGlzLnRvID0gdGhhdC50bzsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSB0aGF0LmFjdGlvbjsKKyAgICAgICAgdGhpcy5yZXBseVRvID0gdGhhdC5yZXBseVRvOworICAgICAgICB0aGlzLmZhdWx0VG8gPSB0aGF0LmZhdWx0VG87CisgICAgICAgIHRoaXMubWVzc2FnZUlkID0gdGhhdC5tZXNzYWdlSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB0b3RhbCBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFsbCB0aGUgaGVhZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBbGwoSGVhZGVyLi4uIGhlYWRlcnMpIHsKKyAgICAgICAgZm9yIChIZWFkZXIgaGVhZGVyIDogaGVhZGVycykKKyAgICAgICAgICAgIGFkZChoZWFkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBIZWFkZXJ9IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBtYXJrIHRoZSByZXR1cm5lZCB7QGxpbmsgSGVhZGVyfSBhcyB1bmRlcnN0b29kLgorICAgICAqCisgICAgICogQHNlZSAjdW5kZXJzdG9vZChpbnQpCisgICAgICovCisgICAgcHVibGljIEhlYWRlciBnZXQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXQoaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoZSB7QGxpbmsgSGVhZGVyfSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFzCisgICAgICogPGEgaHJlZj0iI01VIj4idW5kZXJzdG9vZCI8L2E+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuZGVyc3Rvb2QoaW50IGluZGV4KSB7CisgICAgICAgIGFzc2VydCBpbmRleDxzaXplKCk7ICAgIC8vIGNoZWNrIHRoYXQgaW5kZXggaXMgaW4gcmFuZ2UKKyAgICAgICAgaWYoaW5kZXg8MzIpCisgICAgICAgICAgICB1bmRlcnN0b29kQml0cyB8PSAxPDxpbmRleDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZihtb3JlVW5kZXJzdG9vZEJpdHM9PW51bGwpCisgICAgICAgICAgICAgICAgbW9yZVVuZGVyc3Rvb2RCaXRzID0gbmV3IEJpdFNldCgpOworICAgICAgICAgICAgbW9yZVVuZGVyc3Rvb2RCaXRzLnNldChpbmRleC0zMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSB7QGxpbmsgSGVhZGVyfSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKyAgICAgKiB3YXMgPGEgaHJlZj0iI01VIj4idW5kZXJzdG9vZCI8L2E+LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVW5kZXJzdG9vZChpbnQgaW5kZXgpIHsKKyAgICAgICAgYXNzZXJ0IGluZGV4PHNpemUoKTsgICAgLy8gY2hlY2sgdGhhdCBpbmRleCBpcyBpbiByYW5nZQorICAgICAgICBpZihpbmRleDwzMikKKyAgICAgICAgICAgIHJldHVybiB1bmRlcnN0b29kQml0cyA9PSAodW5kZXJzdG9vZEJpdHN8KDE8PGluZGV4KSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYobW9yZVVuZGVyc3Rvb2RCaXRzPT1udWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBtb3JlVW5kZXJzdG9vZEJpdHMuZ2V0KGluZGV4LTMyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoZSBzcGVjaWZpZWQge0BsaW5rIEhlYWRlcn0gYXMgPGEgaHJlZj0iI01VIj4idW5kZXJzdG9vZCI8L2E+LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiBCeSB0aGUgZGVpZm5pdGlvbiBvZiB7QGxpbmsgQXJyYXlMaXN0fSwgdGhpcyBvcGVyYXRpb24gcmVxdWlyZXMKKyAgICAgKiBPKG4pIHNlYXJjaCBvZiB0aGUgYXJyYXksIGFuZCB0aHVzIGluaGVyZW50bHkgaW5lZmZpY2llbnQuCisgICAgICoKKyAgICAgKiBCZWNhdXNlIG9mIHRoaXMsIGlmIHlvdSBhcmUgZGV2ZWxvcGluZyBhIHtAbGluayBQaXBlfSBmb3IKKyAgICAgKiBhIHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSBlbnZpcm9ubWVudCwgZG8gbm90IHVzZSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGUgZ2l2ZW4gaGVhZGVyIGlzIG5vdCB7QGxpbmsgI2NvbnRhaW5zKE9iamVjdCkgY29udGFpbmVkfQorICAgICAqICAgICAgaW4gdGhpcyBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5kZXJzdG9vZChATm90TnVsbCBIZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIGludCBzeiA9IHNpemUoKTsKKyAgICAgICAgZm9yKCBpbnQgaT0wOyBpPHN6OyBpKysgKSB7CisgICAgICAgICAgICBpZihnZXQoaSk9PWhlYWRlcikgeworICAgICAgICAgICAgICAgIHVuZGVyc3Rvb2QoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaXJzdCB7QGxpbmsgSGVhZGVyfSBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFya0FzVW5kZXJzdG9vZAorICAgICAqICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIHJldHVybmVkIGhlYWRlciB3aWxsCisgICAgICogICAgICBiZSBtYXJrZWQgYXMgPGEgaHJlZj0iI01VIj4idW5kZXJzdG9vZCI8L2E+LgorICAgICAqIEByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBIZWFkZXIgZ2V0KEBOb3ROdWxsIFN0cmluZyBuc1VyaSwgQE5vdE51bGwgU3RyaW5nIGxvY2FsTmFtZSwgYm9vbGVhbiBtYXJrQXNVbmRlcnN0b29kKSB7CisgICAgICAgIGludCBsZW4gPSBzaXplKCk7CisgICAgICAgIGZvciggaW50IGk9MDsgaTxsZW47IGkrKyApIHsKKyAgICAgICAgICAgIEhlYWRlciBoID0gZ2V0KGkpOworICAgICAgICAgICAgaWYoaC5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWxOYW1lKSAmJiBoLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhuc1VyaSkpIHsKKyAgICAgICAgICAgICAgICBpZihtYXJrQXNVbmRlcnN0b29kKQorICAgICAgICAgICAgICAgICAgICB1bmRlcnN0b29kKGkpOworICAgICAgICAgICAgICAgIHJldHVybiBoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNnZXQoU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pfQorICAgICAqLworICAgIHB1YmxpYyBIZWFkZXIgZ2V0KFN0cmluZyBuc1VyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0KG5zVXJpLGxvY2FsTmFtZSx0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaXJzdCB7QGxpbmsgSGVhZGVyfSBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFya0FzVW5kZXJzdG9vZAorICAgICAqICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIHJldHVybmVkIGhlYWRlciB3aWxsCisgICAgICogICAgICBiZSBtYXJrZWQgYXMgPGEgaHJlZj0iI01VIj4idW5kZXJzdG9vZCI8L2E+LgorICAgICAqIEByZXR1cm4gbnVsbAorICAgICAqICAgICAgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgSGVhZGVyIGdldChATm90TnVsbCBRTmFtZSBuYW1lLCBib29sZWFuIG1hcmtBc1VuZGVyc3Rvb2QpIHsKKyAgICAgICAgcmV0dXJuIGdldChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLG5hbWUuZ2V0TG9jYWxQYXJ0KCksbWFya0FzVW5kZXJzdG9vZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFVzZSB7QGxpbmsgI2dldChRTmFtZSl9CisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBIZWFkZXIgZ2V0KEBOb3ROdWxsIFFOYW1lIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldChuYW1lLHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNnZXRIZWFkZXJzKFN0cmluZywgU3RyaW5nLCBib29sZWFuKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8SGVhZGVyPiBnZXRIZWFkZXJzKGZpbmFsIFN0cmluZyBuc1VyaSwgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0SGVhZGVycyhuc1VyaSxsb2NhbE5hbWUsdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgdGhlIHtAbGluayBIZWFkZXJ9cyBvZiB0aGUgc3BlY2lmaWVkIG5hbWUsCisgICAgICogaW5jbHVkaW5nIGR1cGxpY2F0ZXMgKGlmIGFueS4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFya0FzVW5kZXJzdG9vZAorICAgICAqICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIHJldHVybmVkIGhlYWRlcnMgd2lsbAorICAgICAqICAgICAgYmUgbWFya2VkIGFzIDxhIGhyZWY9IiNNVSI+InVuZGVyc3Rvb2QiPC9hPiB3aGVuIHRoZXkgYXJlIHJldHVybmVkCisgICAgICogICAgICBmcm9tIHtAbGluayBJdGVyYXRvciNuZXh0KCl9LgorICAgICAqIEByZXR1cm4gZW1wdHkgaXRlcmF0b3IgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBJdGVyYXRvcjxIZWFkZXI+IGdldEhlYWRlcnMoQE5vdE51bGwgZmluYWwgU3RyaW5nIG5zVXJpLCBATm90TnVsbCBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lLCBmaW5hbCBib29sZWFuIG1hcmtBc1VuZGVyc3Rvb2QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxIZWFkZXI+KCkgeworICAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgICBIZWFkZXIgbmV4dDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgaWYobmV4dD09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2goKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCE9bnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEhlYWRlciBuZXh0KCkgeworICAgICAgICAgICAgICAgIGlmKG5leHQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobmV4dD09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYobWFya0FzVW5kZXJzdG9vZCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZ2V0KGlkeC0xKT09bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJzdG9vZChpZHgtMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSGVhZGVyIHIgPSBuZXh0OworICAgICAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgZmV0Y2goKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoaWR4PHNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaCA9IGdldChpZHgrKyk7CisgICAgICAgICAgICAgICAgICAgIGlmKGguZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKGxvY2FsTmFtZSkgJiYgaC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMobnNVcmkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSAjZ2V0SGVhZGVycyhTdHJpbmcsIFN0cmluZywgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgSXRlcmF0b3I8SGVhZGVyPiBnZXRIZWFkZXJzKEBOb3ROdWxsIFFOYW1lIGhlYWRlck5hbWUsIGZpbmFsIGJvb2xlYW4gbWFya0FzVW5kZXJzdG9vZCkgeworICAgICAgICByZXR1cm4gZ2V0SGVhZGVycyhoZWFkZXJOYW1lLmdldE5hbWVzcGFjZVVSSSgpLGhlYWRlck5hbWUuZ2V0TG9jYWxQYXJ0KCksbWFya0FzVW5kZXJzdG9vZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIHVzZSB7QGxpbmsgI2dldEhlYWRlcnMoU3RyaW5nLCBib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIEl0ZXJhdG9yPEhlYWRlcj4gZ2V0SGVhZGVycyhATm90TnVsbCBmaW5hbCBTdHJpbmcgbnNVcmkpIHsKKyAgICAgICAgcmV0dXJuIGdldEhlYWRlcnMobnNVcmksdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbiBpdGVyYXRpb24gb2YgaGVhZGVycyB7QGxpbmsgSGVhZGVyfSBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZSwKKyAgICAgKiBpbmNsdWRpbmcgZHVwbGljYXRlcyAoaWYgYW55LikKKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXJrQXNVbmRlcnN0b29kCisgICAgICogICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgcmV0dXJuZWQgaGVhZGVycyB3aWxsCisgICAgICogICAgICBiZSBtYXJrZWQgYXMgPGEgaHJlZj0iI01VIj4idW5kZXJzdG9vZCI8L2E+IHdoZW4gdGhleSBhcmUgcmV0dXJuZWQKKyAgICAgKiAgICAgIGZyb20ge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0uCisgICAgICogQHJldHVybgorICAgICAqICAgICAgZW1wdHkgaXRlcmF0b3IgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBJdGVyYXRvcjxIZWFkZXI+IGdldEhlYWRlcnMoQE5vdE51bGwgZmluYWwgU3RyaW5nIG5zVXJpLCBmaW5hbCBib29sZWFuIG1hcmtBc1VuZGVyc3Rvb2QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxIZWFkZXI+KCkgeworICAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgICBIZWFkZXIgbmV4dDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgaWYobmV4dD09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2goKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCE9bnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEhlYWRlciBuZXh0KCkgeworICAgICAgICAgICAgICAgIGlmKG5leHQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobmV4dD09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYobWFya0FzVW5kZXJzdG9vZCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZ2V0KGlkeC0xKT09bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJzdG9vZChpZHgtMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSGVhZGVyIHIgPSBuZXh0OworICAgICAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgZmV0Y2goKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoaWR4PHNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaCA9IGdldChpZHgrKyk7CisgICAgICAgICAgICAgICAgICAgIGlmKGguZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5zVXJpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGg7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZpcnN0IHtAbGluayBIZWFkZXJ9IG9mIHRoZSBzcGVjaWZpZWQgbmFtZSB0YXJnZXRlZCBhdCB0aGUKKyAgICAgKiBjdXJyZW50IGltcGxpY2l0IHJvbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBoZWFkZXIKKyAgICAgKiBAcGFyYW0gbWFya1VuZGVyc3Rvb2QKKyAgICAgKiAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZSByZXR1cm5lZCBoZWFkZXJzIHdpbGwKKyAgICAgKiAgICAgIGJlIG1hcmtlZCBhcyA8YSBocmVmPSIjTVUiPiJ1bmRlcnN0b29kIjwvYT4gd2hlbiB0aGV5IGFyZSByZXR1cm5lZAorICAgICAqICAgICAgZnJvbSB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfS4KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgaGVhZGVyIG5vdCBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgSGVhZGVyIGdldEZpcnN0SGVhZGVyKFFOYW1lIG5hbWUsIGJvb2xlYW4gbWFya1VuZGVyc3Rvb2QsIFNPQVBWZXJzaW9uIHN2KSB7CisgICAgICAgIGlmIChzdiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuTlVMTF9TT0FQX1ZFUlNJT04oKSk7CisKKyAgICAgICAgSXRlcmF0b3I8SGVhZGVyPiBpdGVyID0gZ2V0SGVhZGVycyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lLmdldExvY2FsUGFydCgpLCBtYXJrVW5kZXJzdG9vZCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgSGVhZGVyIGggPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChoLmdldFJvbGUoc3YpLmVxdWFscyhzdi5pbXBsaWNpdFJvbGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBoOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgV1MtQWRkcmVzc2luZyA8Y29kZT5UbzwvY29kZT4gaGVhZGVyLiBUaGUgPGNvZGU+dmVyc2lvbjwvY29kZT4KKyAgICAgKiBpZGVudGlmaWVzIHRoZSBXUy1BZGRyZXNzaW5nIHZlcnNpb24gYW5kIHRoZSBoZWFkZXIgcmV0dXJuZWQgaXMgdGFyZ2V0ZWQgYXQKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsaWNpdCByb2xlLiBDYWNoZXMgdGhlIHZhbHVlIGZvciBzdWJzZXF1ZW50IGludm9jYXRpb24uCisgICAgICogRHVwbGljYXRlIDxjb2RlPlRvPC9jb2RlPiBoZWFkZXJzIGFyZSBkZXRlY3RlZCBlYXJsaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIGF2IFdTLUFkZHJlc3NpbmcgdmVyc2lvbgorICAgICAqIEBwYXJhbSBzdiBTT0FQIHZlcnNpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgPGNvZGU+YXY8L2NvZGU+IG9yIDxjb2RlPnN2PC9jb2RlPiBpcyBudWxsLgorICAgICAqIEByZXR1cm4gVmFsdWUgb2YgV1MtQWRkcmVzc2luZyBUbyBoZWFkZXIsIGFub255bW91cyBVUkkgaWYgbm8gaGVhZGVyIGlzIHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRvKEFkZHJlc3NpbmdWZXJzaW9uIGF2LCBTT0FQVmVyc2lvbiBzdikgeworICAgICAgICBpZiAodG8gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgaWYgKGF2ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEFkZHJlc3NpbmdNZXNzYWdlcy5OVUxMX0FERFJFU1NJTkdfVkVSU0lPTigpKTsKKworICAgICAgICBIZWFkZXIgaCA9IGdldEZpcnN0SGVhZGVyKGF2LnRvVGFnLCB0cnVlLCBzdik7CisgICAgICAgIGlmIChoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvID0gaC5nZXRTdHJpbmdDb250ZW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0byA9IGF2LmFub255bW91c1VyaTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0bzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBXUy1BZGRyZXNzaW5nIDxjb2RlPkFjdGlvbjwvY29kZT4gaGVhZGVyLiBUaGUgPGNvZGU+dmVyc2lvbjwvY29kZT4KKyAgICAgKiBpZGVudGlmaWVzIHRoZSBXUy1BZGRyZXNzaW5nIHZlcnNpb24gYW5kIHRoZSBoZWFkZXIgcmV0dXJuZWQgaXMgdGFyZ2V0ZWQgYXQKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsaWNpdCByb2xlLiBDYWNoZXMgdGhlIHZhbHVlIGZvciBzdWJzZXF1ZW50IGludm9jYXRpb24uCisgICAgICogRHVwbGljYXRlIDxjb2RlPkFjdGlvbjwvY29kZT4gaGVhZGVycyBhcmUgZGV0ZWN0ZWQgZWFybGllci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdiBXUy1BZGRyZXNzaW5nIHZlcnNpb24KKyAgICAgKiBAcGFyYW0gc3YgU09BUCB2ZXJzaW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyIDxjb2RlPmF2PC9jb2RlPiBvciA8Y29kZT5zdjwvY29kZT4gaXMgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIFdTLUFkZHJlc3NpbmcgQWN0aW9uIGhlYWRlciwgbnVsbCBpZiBubyBoZWFkZXIgaXMgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKEBOb3ROdWxsIEFkZHJlc3NpbmdWZXJzaW9uIGF2LCBATm90TnVsbCBTT0FQVmVyc2lvbiBzdikgeworICAgICAgICBpZiAoYWN0aW9uIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY3Rpb247CisgICAgICAgIGlmIChhdiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuTlVMTF9BRERSRVNTSU5HX1ZFUlNJT04oKSk7CisKKyAgICAgICAgSGVhZGVyIGggPSBnZXRGaXJzdEhlYWRlcihhdi5hY3Rpb25UYWcsIHRydWUsIHN2KTsKKyAgICAgICAgaWYgKGggIT0gbnVsbCkgeworICAgICAgICAgICAgYWN0aW9uID0gaC5nZXRTdHJpbmdDb250ZW50KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIFdTLUFkZHJlc3NpbmcgPGNvZGU+UmVwbHlUbzwvY29kZT4gaGVhZGVyLiBUaGUgPGNvZGU+dmVyc2lvbjwvY29kZT4KKyAgICAgKiBpZGVudGlmaWVzIHRoZSBXUy1BZGRyZXNzaW5nIHZlcnNpb24gYW5kIHRoZSBoZWFkZXIgcmV0dXJuZWQgaXMgdGFyZ2V0ZWQgYXQKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsaWNpdCByb2xlLiBDYWNoZXMgdGhlIHZhbHVlIGZvciBzdWJzZXF1ZW50IGludm9jYXRpb24uCisgICAgICogRHVwbGljYXRlIDxjb2RlPlJlcGx5VG88L2NvZGU+IGhlYWRlcnMgYXJlIGRldGVjdGVkIGVhcmxpZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXYgV1MtQWRkcmVzc2luZyB2ZXJzaW9uCisgICAgICogQHBhcmFtIHN2IFNPQVAgdmVyc2lvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVpdGhlciA8Y29kZT5hdjwvY29kZT4gb3IgPGNvZGU+c3Y8L2NvZGU+IGlzIG51bGwuCisgICAgICogQHJldHVybiBWYWx1ZSBvZiBXUy1BZGRyZXNzaW5nIFJlcGx5VG8gaGVhZGVyLCBudWxsIGlmIG5vIGhlYWRlciBpcyBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UgZ2V0UmVwbHlUbyhATm90TnVsbCBBZGRyZXNzaW5nVmVyc2lvbiBhdiwgQE5vdE51bGwgU09BUFZlcnNpb24gc3YpIHsKKyAgICAgICAgaWYgKHJlcGx5VG8hPW51bGwpCisgICAgICAgICAgICByZXR1cm4gcmVwbHlUbzsKKyAgICAgICAgaWYgKGF2ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEFkZHJlc3NpbmdNZXNzYWdlcy5OVUxMX0FERFJFU1NJTkdfVkVSU0lPTigpKTsKKworICAgICAgICBIZWFkZXIgaCA9IGdldEZpcnN0SGVhZGVyKGF2LnJlcGx5VG9UYWcsIHRydWUsIHN2KTsKKyAgICAgICAgaWYgKGggIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXBseVRvID0gaC5yZWFkQXNFUFIoYXYpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuUkVQTFlfVE9fQ0FOTk9UX1BBUlNFKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVwbHlUbyA9IGF2LmFub255bW91c0VwcjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseVRvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIFdTLUFkZHJlc3NpbmcgPGNvZGU+RmF1bHRUbzwvY29kZT4gaGVhZGVyLiBUaGUgPGNvZGU+dmVyc2lvbjwvY29kZT4KKyAgICAgKiBpZGVudGlmaWVzIHRoZSBXUy1BZGRyZXNzaW5nIHZlcnNpb24gYW5kIHRoZSBoZWFkZXIgcmV0dXJuZWQgaXMgdGFyZ2V0ZWQgYXQKKyAgICAgKiB0aGUgY3VycmVudCBpbXBsaWNpdCByb2xlLiBDYWNoZXMgdGhlIHZhbHVlIGZvciBzdWJzZXF1ZW50IGludm9jYXRpb24uCisgICAgICogRHVwbGljYXRlIDxjb2RlPkZhdWx0VG88L2NvZGU+IGhlYWRlcnMgYXJlIGRldGVjdGVkIGVhcmxpZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXYgV1MtQWRkcmVzc2luZyB2ZXJzaW9uCisgICAgICogQHBhcmFtIHN2IFNPQVAgdmVyc2lvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVpdGhlciA8Y29kZT5hdjwvY29kZT4gb3IgPGNvZGU+c3Y8L2NvZGU+IGlzIG51bGwuCisgICAgICogQHJldHVybiBWYWx1ZSBvZiBXUy1BZGRyZXNzaW5nIEZhdWx0VG8gaGVhZGVyLCBudWxsIGlmIG5vIGhlYWRlciBpcyBwcmVzZW50CisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RmF1bHRUbyhATm90TnVsbCBBZGRyZXNzaW5nVmVyc2lvbiBhdiwgQE5vdE51bGwgU09BUFZlcnNpb24gc3YpIHsKKyAgICAgICAgaWYgKGZhdWx0VG8gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYXVsdFRvOworCisgICAgICAgIGlmIChhdiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuTlVMTF9BRERSRVNTSU5HX1ZFUlNJT04oKSk7CisKKyAgICAgICAgSGVhZGVyIGggPSBnZXRGaXJzdEhlYWRlcihhdi5mYXVsdFRvVGFnLCB0cnVlLCBzdik7CisgICAgICAgIGlmIChoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmF1bHRUbyA9IGgucmVhZEFzRVBSKGF2KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQWRkcmVzc2luZ01lc3NhZ2VzLkZBVUxUX1RPX0NBTk5PVF9QQVJTRSgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYXVsdFRvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIFdTLUFkZHJlc3NpbmcgPGNvZGU+TWVzc2FnZUlEPC9jb2RlPiBoZWFkZXIuIFRoZSA8Y29kZT52ZXJzaW9uPC9jb2RlPgorICAgICAqIGlkZW50aWZpZXMgdGhlIFdTLUFkZHJlc3NpbmcgdmVyc2lvbiBhbmQgdGhlIGhlYWRlciByZXR1cm5lZCBpcyB0YXJnZXRlZCBhdAorICAgICAqIHRoZSBjdXJyZW50IGltcGxpY2l0IHJvbGUuIENhY2hlcyB0aGUgdmFsdWUgZm9yIHN1YnNlcXVlbnQgaW52b2NhdGlvbi4KKyAgICAgKiBEdXBsaWNhdGUgPGNvZGU+TWVzc2FnZUlEPC9jb2RlPiBoZWFkZXJzIGFyZSBkZXRlY3RlZCBlYXJsaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIGF2IFdTLUFkZHJlc3NpbmcgdmVyc2lvbgorICAgICAqIEBwYXJhbSBzdiBTT0FQIHZlcnNpb24KKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gaWYgZWl0aGVyIDxjb2RlPmF2PC9jb2RlPiBvciA8Y29kZT5zdjwvY29kZT4gaXMgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIFdTLUFkZHJlc3NpbmcgTWVzc2FnZUlEIGhlYWRlciwgbnVsbCBpZiBubyBoZWFkZXIgaXMgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlEKEBOb3ROdWxsIEFkZHJlc3NpbmdWZXJzaW9uIGF2LCBATm90TnVsbCBTT0FQVmVyc2lvbiBzdikgeworICAgICAgICBpZiAobWVzc2FnZUlkICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZUlkOworCisgICAgICAgIGlmIChhdiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuTlVMTF9BRERSRVNTSU5HX1ZFUlNJT04oKSk7CisKKyAgICAgICAgSGVhZGVyIGggPSBnZXRGaXJzdEhlYWRlcihhdi5tZXNzYWdlSURUYWcsIHRydWUsIHN2KTsKKyAgICAgICAgaWYgKGggIT0gbnVsbCkgeworICAgICAgICAgICAgbWVzc2FnZUlkID0gaC5nZXRTdHJpbmdDb250ZW50KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWVzc2FnZUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzZXQgb2Ygb3V0Ym91bmQgV1MtQWRkcmVzc2luZyBoZWFkZXJzIG9uIHRoZSBjbGllbnQgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgQWN0aW9uIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiA8cD48cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBpbnZva2VkIHJpZ2h0IGFmdGVyIHN1Y2ggYSBNZXNzYWdlIGlzCisgICAgICogY3JlYXRlZCB3aGljaCBpcyBlcnJvciBwcm9uZSBidXQgc28gZmFyIG9ubHkgTUVYLCBSTSBhbmQgSkFYLVdTCisgICAgICogY3JlYXRlcyBhIHJlcXVlc3Qgc28gdGhpcyB1Z2xpbmVzcyBpcyBhY2NlcHRhYmxlLiBUaGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQKKyAgICAgKiB0byBjcmVhdGUgcHJvdG9jb2wgbWVzc2FnZXMgdGhhdCBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkge0BsaW5rIFdTQmluZGluZ30KKyAgICAgKiBhbmQge0BsaW5rIFdTRExQb3J0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrZXQgcmVxdWVzdCBwYWNrZXQKKyAgICAgKiBAcGFyYW0gYXYgV1MtQWRkcmVzc2luZyB2ZXJzaW9uCisgICAgICogQHBhcmFtIHN2IFNPQVAgdmVyc2lvbgorICAgICAqIEBwYXJhbSBvbmV3YXkgSW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gaXMgb25ld2F5CisgICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlsbFJlcXVlc3RBZGRyZXNzaW5nSGVhZGVycyhQYWNrZXQgcGFja2V0LCBBZGRyZXNzaW5nVmVyc2lvbiBhdiwgU09BUFZlcnNpb24gc3YsIGJvb2xlYW4gb25ld2F5LCBTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIGZpbGxDb21tb25BZGRyZXNzaW5nSGVhZGVycyhwYWNrZXQsIGF2LCBzdiwgYWN0aW9uKTsKKworICAgICAgICAvLyB3c2E6UmVwbHlUbworICAgICAgICAvLyBudWxsIG9yICJ0cnVlIiBpcyBlcXVpdmFsZW50IHRvIHJlcXVlc3QvcmVzcG9uc2UgTUVQCisgICAgICAgIGlmICghb25ld2F5KSB7CisgICAgICAgICAgICBXU0VuZHBvaW50UmVmZXJlbmNlIGVwciA9IGF2LmFub255bW91c0VwcjsKKyAgICAgICAgICAgIGFkZChlcHIuY3JlYXRlSGVhZGVyKGF2LnJlcGx5VG9UYWcpKTsKKworICAgICAgICAgICAgLy8gd3NhOk1lc3NhZ2VJRAorICAgICAgICAgICAgSGVhZGVyIGggPSBuZXcgU3RyaW5nSGVhZGVyKGF2Lm1lc3NhZ2VJRFRhZywgcGFja2V0LmdldE1lc3NhZ2UoKS5nZXRJRChhdiwgc3YpKTsKKyAgICAgICAgICAgIGFkZChoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzZXQgb2Ygb3V0Ym91bmQgV1MtQWRkcmVzc2luZyBoZWFkZXJzIG9uIHRoZSBjbGllbnQgd2l0aCB0aGUKKyAgICAgKiBkZWZhdWx0IEFjdGlvbiBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgdmFsdWUuCisgICAgICogPHA+PHA+CisgICAgICogVGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW52b2tlZCByaWdodCBhZnRlciBzdWNoIGEgTWVzc2FnZSBpcworICAgICAqIGNyZWF0ZWQgd2hpY2ggaXMgZXJyb3IgcHJvbmUgYnV0IHNvIGZhciBvbmx5IE1FWCwgUk0gYW5kIEpBWC1XUworICAgICAqIGNyZWF0ZXMgYSByZXF1ZXN0IHNvIHRoaXMgdWdsaW5lc3MgaXMgYWNjZXB0YWJsZS4gSWYgbW9yZSBjb21wb25lbnRzCisgICAgICogYXJlIGlkZW50aWZpZWQgdXNpbmcgdGhpcywgdGhlbiB3ZSBtYXkgcmV2aXNpdCB0aGlzLgorICAgICAqIDxwPjxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaWYgZGVmYXVsdCBBY3Rpb24gTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIHRvCisgICAgICogYmUgdXNlZC4gU2VlCisgICAgICoge0BsaW5rICNmaWxsUmVxdWVzdEFkZHJlc3NpbmdIZWFkZXJzKFBhY2tldCwgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb24sIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbiwgYm9vbGVhbiwgU3RyaW5nKX0KKyAgICAgKiBpZiBub24tZGVmYXVsdCBBY3Rpb24gaXMgdG8gYmUgdXNlZCwgZm9yIGV4YW1wbGUgd2hlbiBjcmVhdGluZyBhIHByb3RvY29sIG1lc3NhZ2Ugbm90CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHtAbGluayBXU0JpbmRpbmd9IGFuZCB7QGxpbmsgV1NETFBvcnR9LgorICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgU09BUEFjdGlvbiBhcyB0aGUgQWN0aW9uIHVubGVzcyBzZXQgZXhwcGxpY2l0bHkgaW4gdGhlIHdzZGwuCisgICAgICogQHBhcmFtIHdzZGxQb3J0IHJlcXVlc3QgV1NETCBwb3J0CisgICAgICogQHBhcmFtIGJpbmRpbmcgcmVxdWVzdCBXU0JpbmRpbmcKKyAgICAgKiBAcGFyYW0gcGFja2V0IHJlcXVlc3QgcGFja2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlsbFJlcXVlc3RBZGRyZXNzaW5nSGVhZGVycyhXU0RMUG9ydCB3c2RsUG9ydCwgQE5vdE51bGwgV1NCaW5kaW5nIGJpbmRpbmcsIFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQWRkcmVzc2luZ01lc3NhZ2VzLk5VTExfQklORElORygpKTsKKworICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbiBhZGRyZXNzaW5nVmVyc2lvbiA9IGJpbmRpbmcuZ2V0QWRkcmVzc2luZ1ZlcnNpb24oKTsKKyAgICAgICAgLy9zZWlNb2RlbCBpcyBwYXNzZWQgYXMgbnVsbCBhcyBpdCBpcyBub3QgbmVlZGVkLgorICAgICAgICBXc2FUdWJlSGVscGVyIHdzYUhlbHBlciA9IGFkZHJlc3NpbmdWZXJzaW9uLmdldFdzYUhlbHBlcih3c2RsUG9ydCwgbnVsbCwgYmluZGluZyk7CisKKyAgICAgICAgLy8gd3NhOkFjdGlvbgorICAgICAgICBTdHJpbmcgYWN0aW9uID0gd3NhSGVscGVyLmdldEVmZmVjdGl2ZUlucHV0QWN0aW9uKHBhY2tldCk7CisgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCB8fCBhY3Rpb24uZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQ2xpZW50TWVzc2FnZXMuSU5WQUxJRF9TT0FQX0FDVElPTigpKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIG9uZXdheSA9ICFwYWNrZXQuZXhwZWN0UmVwbHk7CisgICAgICAgIGlmICh3c2RsUG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBpZiBXU0RMIGhhcyA8d3NhdzpBbm9ueW1vdXM+cHJvaGliaXRlZDwvd3NhdzpBbm9ueW1vdXM+LCB0aGVuIHRocm93IGFuIGVycm9yCisgICAgICAgICAgICAvLyBhcyBhbm9ueW1vdXMgUmVwbHlUbyBNVVNUIE5PVCBiZSBhZGRlZCBpbiB0aGF0IGNhc2UuIEJpbmRpbmdQcm92aWRlciBuZWVkIHRvCisgICAgICAgICAgICAvLyBkaXNhYmxlIEFkZHJlc3NpbmdGZWF0dXJlIGFuZCBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgYW5kIGhhbmQtY3JhZnQKKyAgICAgICAgICAgIC8vIHRoZSBTT0FQIG1lc3NhZ2Ugd2l0aCBub24tYW5vbnltb3VzIFJlcGx5VG8vRmF1bHRUby4KKyAgICAgICAgICAgIGlmICghb25ld2F5ICYmIHBhY2tldC5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldE9wZXJhdGlvbih3c2RsUG9ydCkgIT0gbnVsbCAmJiBwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldE9wZXJhdGlvbih3c2RsUG9ydCkuZ2V0QW5vbnltb3VzKCkgPT0gV1NETEJvdW5kT3BlcmF0aW9uLkFOT05ZTU9VUy5wcm9oaWJpdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKEFkZHJlc3NpbmdNZXNzYWdlcy5XU0FXX0FOT05ZTU9VU19QUk9ISUJJVEVEKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghYmluZGluZy5pc0ZlYXR1cmVFbmFibGVkKE9uZVdheUZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICAvLyBzdGFuZGFyZCBvbmV3YXkKKyAgICAgICAgICAgIGZpbGxSZXF1ZXN0QWRkcmVzc2luZ0hlYWRlcnMocGFja2V0LCBhZGRyZXNzaW5nVmVyc2lvbiwgYmluZGluZy5nZXRTT0FQVmVyc2lvbigpLCBvbmV3YXksIGFjdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjdXN0b20gb25ld2F5CisgICAgICAgICAgICBmaWxsUmVxdWVzdEFkZHJlc3NpbmdIZWFkZXJzKHBhY2tldCwgYWRkcmVzc2luZ1ZlcnNpb24sIGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSwgYmluZGluZy5nZXRGZWF0dXJlKE9uZVdheUZlYXR1cmUuY2xhc3MpLCBhY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbGxSZXF1ZXN0QWRkcmVzc2luZ0hlYWRlcnMoQE5vdE51bGwgUGFja2V0IHBhY2tldCwgQE5vdE51bGwgQWRkcmVzc2luZ1ZlcnNpb24gYXYsIEBOb3ROdWxsIFNPQVBWZXJzaW9uIHN2LCBATm90TnVsbCBPbmVXYXlGZWF0dXJlIG9mLCBATm90TnVsbCBTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIGZpbGxDb21tb25BZGRyZXNzaW5nSGVhZGVycyhwYWNrZXQsIGF2LCBzdiwgYWN0aW9uKTsKKworICAgICAgICAvLyB3c2E6UmVwbHlUbworICAgICAgICBpZiAob2YuZ2V0UmVwbHlUbygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZChvZi5nZXRSZXBseVRvKCkuY3JlYXRlSGVhZGVyKGF2LnJlcGx5VG9UYWcpKTsKKworICAgICAgICAgICAgLy8gYWRkIHdzYTpNZXNzYWdlSUQgb25seSBmb3Igbm9uLW51bGwgUmVwbHlUbworICAgICAgICAgICAgSGVhZGVyIGggPSBuZXcgU3RyaW5nSGVhZGVyKGF2Lm1lc3NhZ2VJRFRhZywgcGFja2V0LmdldE1lc3NhZ2UoKS5nZXRJRChhdiwgc3YpKTsKKyAgICAgICAgICAgIGFkZChoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdzYTpGcm9tCisgICAgICAgIGlmIChvZi5nZXRGcm9tKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkKG9mLmdldEZyb20oKS5jcmVhdGVIZWFkZXIoYXYuZnJvbVRhZykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd3NhOlJlbGF0ZXNUbworICAgICAgICBpZiAob2YuZ2V0UmVsYXRlc1RvSUQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGQobmV3IFJlbGF0ZXNUb0hlYWRlcihhdi5yZWxhdGVzVG9UYWcsIG9mLmdldFJlbGF0ZXNUb0lEKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgd3NhOlRvLCB3c2E6QWN0aW9uIGFuZCB3c2E6TWVzc2FnZUlEIGhlYWRlciBvbiB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2V0IHJlcXVlc3QgcGFja2V0CisgICAgICogQHBhcmFtIGF2IFdTLUFkZHJlc3NpbmcgdmVyc2lvbgorICAgICAqIEBwYXJhbSBzdiBTT0FQIHZlcnNpb24KKyAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgdmFsdWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmlsbENvbW1vbkFkZHJlc3NpbmdIZWFkZXJzKFBhY2tldCBwYWNrZXQsIEBOb3ROdWxsIEFkZHJlc3NpbmdWZXJzaW9uIGF2LCBATm90TnVsbCBTT0FQVmVyc2lvbiBzdiwgQE5vdE51bGwgU3RyaW5nIGFjdGlvbikgeworICAgICAgICBpZiAocGFja2V0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEFkZHJlc3NpbmdNZXNzYWdlcy5OVUxMX1BBQ0tFVCgpKTsKKworICAgICAgICBpZiAoYXYgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQWRkcmVzc2luZ01lc3NhZ2VzLk5VTExfQUREUkVTU0lOR19WRVJTSU9OKCkpOworCisgICAgICAgIGlmIChzdiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuTlVMTF9TT0FQX1ZFUlNJT04oKSk7CisKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihBZGRyZXNzaW5nTWVzc2FnZXMuTlVMTF9BQ1RJT04oKSk7CisKKyAgICAgICAgLy8gd3NhOlRvCisgICAgICAgIFN0cmluZ0hlYWRlciBoID0gbmV3IFN0cmluZ0hlYWRlcihhdi50b1RhZywgcGFja2V0LmVuZHBvaW50QWRkcmVzcy50b1N0cmluZygpKTsKKyAgICAgICAgYWRkKGgpOworCisgICAgICAgIC8vIHdzYTpBY3Rpb24KKyAgICAgICAgcGFja2V0LnNvYXBBY3Rpb24gPSBhY3Rpb247CisgICAgICAgIGggPSBuZXcgU3RyaW5nSGVhZGVyKGF2LmFjdGlvblRhZywgYWN0aW9uKTsKKyAgICAgICAgYWRkKGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcge0BsaW5rIEhlYWRlcn0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPcmRlciBkb2Vzbid0IG1hdHRlciBpbiBoZWFkZXJzLCBzbyB0aGlzIG1ldGhvZAorICAgICAqIGRvZXMgbm90IG1ha2UgYW55IGd1YXJhbnRlZSBhcyB0byB3aGVyZSB0aGUgbmV3IGhlYWRlcgorICAgICAqIGlzIGluc2VydGVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYWx3YXlzIHRydWUuIERvbid0IHVzZSB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZChIZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIHJldHVybiBzdXBlci5hZGQoaGVhZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAge0BsaW5rIEhlYWRlckxpc3R9IGlzIG1vbm90b25pYyBhbmQgeW91IGNhbid0IHJlbW92ZSBhbnl0aGluZy4KKyAgICAgKi8KKyAgICAvLyB0byBhbGxvdyB0aGlzLCB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGUgcmVzaXppbmcgb2YgdW5kZXJzdG9vZEJpdHMKKyAgICBwdWJsaWMgSGVhZGVyIHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIHtAbGluayBIZWFkZXJMaXN0fSBpcyBtb25vdG9uaWMgYW5kIHlvdSBjYW4ndCByZW1vdmUgYW55dGhpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICB7QGxpbmsgSGVhZGVyTGlzdH0gaXMgbW9ub3RvbmljIGFuZCB5b3UgY2FuJ3QgcmVtb3ZlIGFueXRoaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIHtAbGluayBIZWFkZXJMaXN0fSBpcyBtb25vdG9uaWMgYW5kIHlvdSBjYW4ndCByZW1vdmUgYW55dGhpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29weS4KKyAgICAgKgorICAgICAqIFRoaXMgaGFuZGxlcyBudWxsIHtAbGluayBIZWFkZXJMaXN0fSBjb3JyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JpZ2luYWwKKyAgICAgKiAgICAgIENhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhlYWRlckxpc3QgY29weShIZWFkZXJMaXN0IG9yaWdpbmFsKSB7CisgICAgICAgIGlmKG9yaWdpbmFsPT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGVhZGVyTGlzdChvcmlnaW5hbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZFJlc3BvbnNlQWRkcmVzc2luZ0hlYWRlcnMoV1NETFBvcnQgd3NkbFBvcnQsIFdTQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIC8vIHJlYWQgQWN0aW9uCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBnZXRBY3Rpb24oYmluZGluZy5nZXRBZGRyZXNzaW5nVmVyc2lvbigpLCBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkpOworICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBjbGllbnQtaW5ib3VuZCBBY3Rpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9IZWFkZXJzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9IZWFkZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2OTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL0hlYWRlcnMuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkpBWEJSSUNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLk1hcnNoYWxsZXJJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuRE9NSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuU3RyaW5nSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuamF4Yi5KQVhCSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc2Fhai5TQUFKSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtLlN0cmVhbUhlYWRlcjExOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtLlN0cmVhbUhlYWRlcjEyOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICogRmFjdG9yeSBtZXRob2RzIGZvciB2YXJpb3VzIHtAbGluayBIZWFkZXJ9IGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdmFyaW91cyBtZXRob2RzIHRvIGNyZWF0ZSBkaWZmZXJlbnQKKyAqIGZsYXZvcnMgb2Yge0BsaW5rIEhlYWRlcn0gY2xhc3NlcyB0aGF0IHN0b3JlIGRhdGEKKyAqIGluIGRpZmZlcmVudCBmb3JtYXRzLgorICoKKyAqIDxwPgorICogVGhpcyBpcyBhIHBhcnQgb2YgdGhlIEpBWC1XUyBSSSBpbnRlcm5hbCBBUEkgc28gdGhhdAorICoge0BsaW5rIFBpcGV9IGltcGxlbWVudGF0aW9ucyBjYW4gcmV1c2UgdGhlIGltcGxlbWVudGF0aW9ucworICogZG9uZSBpbnNpZGUgdGhlIEpBWC1XUyB3aXRob3V0IGhhdmluZyBhIHN0cm9uZyBkZXBlbmRlbmN5CisgKiB0byB0aGUgYWN0dWFsIGNsYXNzLgorICoKKyAqIDxwPgorICogSWYgeW91IGZpbmQgc29tZSBvZiB0aGUgdXNlZnVsIGNvbnZlbmllbmNlIG1ldGhvZHMgbWlzc2luZworICogZnJvbSB0aGlzIGNsYXNzLCBwbGVhc2UgdGFsayB0byB1cy4KKyAqCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSGVhZGVycyB7CisgICAgcHJpdmF0ZSBIZWFkZXJzKCkge30KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNjcmVhdGUoSkFYQlJJQ29udGV4dCwgT2JqZWN0KX0gaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBjcmVhdGUoU09BUFZlcnNpb24gc29hcFZlcnNpb24sIE1hcnNoYWxsZXIgbSwgT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKQVhCSGVhZGVyKCgoTWFyc2hhbGxlckltcGwpbSkuZ2V0Q29udGV4dCgpLG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgSGVhZGVyfSBiYWNrZWQgYSBieSBhIEpBWEIgYmVhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBjcmVhdGUoSkFYQlJJQ29udGV4dCBjb250ZXh0LCBPYmplY3QgbykgeworICAgICAgICByZXR1cm4gbmV3IEpBWEJIZWFkZXIoY29udGV4dCxvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEhlYWRlcn0gYmFja2VkIGEgYnkgYSBKQVhCIGJlYW4sIHdpdGggdGhlIGdpdmVuIHRhZyBuYW1lLgorICAgICAqCisgICAgICogU2VlIHtAbGluayAjY3JlYXRlKFNPQVBWZXJzaW9uLCBNYXJzaGFsbGVyLCBPYmplY3QpfSBmb3IgdGhlIG1lYW5pbmcKKyAgICAgKiBvZiBvdGhlciBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZ05hbWUKKyAgICAgKiAgICAgIFRoZSBuYW1lIG9mIHRoZSBuZXdseSBjcmVhdGVkIGhlYWRlci4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgVGhlIEpBWEIgYmVhbiB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBoZWFkZXIuIE11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIZWFkZXIgY3JlYXRlKFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uLCBNYXJzaGFsbGVyIG0sIFFOYW1lIHRhZ05hbWUsIE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBjcmVhdGUoc29hcFZlcnNpb24sbSxuZXcgSkFYQkVsZW1lbnQodGFnTmFtZSxvLmdldENsYXNzKCksbykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgSGVhZGVyfSBiYWNrZWQgYSBieSBhIEpBWEIgYmVhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBjcmVhdGUoQnJpZGdlIGJyaWRnZSwgT2JqZWN0IGpheGJPYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKQVhCSGVhZGVyKGJyaWRnZSwgamF4Yk9iamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSGVhZGVyfSBiYWNrZWQgYnkgYSBTQUFKIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBjcmVhdGUoU09BUEhlYWRlckVsZW1lbnQgaGVhZGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgU0FBSkhlYWRlcihoZWFkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEhlYWRlcn0gYmFja2VkIGJ5IGFuIHtAbGluayBFbGVtZW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBjcmVhdGUoIEVsZW1lbnQgbm9kZSApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBET01IZWFkZXI8RWxlbWVudD4obm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFVzZSB7QGxpbmsgI2NyZWF0ZShFbGVtZW50KX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBjcmVhdGUoIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uLCBFbGVtZW50IG5vZGUgKSB7CisgICAgICAgIHJldHVybiBjcmVhdGUobm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSGVhZGVyfSB0aGF0IHJlYWRzIGZyb20ge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIGhlYWRlciBpbXBsZW1lbnRhdGlvbiB3aWxsIHJlYWQgdGhlIGVudGlyZSBkYXRhCisgICAgICogaW50byBtZW1vcnkgYW55d2F5LCBzbyB0aGlzIG1pZ2h0IG5vdCBiZSBhcyBlZmZpY2llbnQgYXMgeW91IG1pZ2h0IGhvcGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIZWFkZXIgY3JlYXRlKCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBzd2l0Y2goc29hcFZlcnNpb24pIHsKKyAgICAgICAgY2FzZSBTT0FQXzExOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWFkZXIxMShyZWFkZXIpOworICAgICAgICBjYXNlIFNPQVBfMTI6CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbUhlYWRlcjEyKHJlYWRlcik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEhlYWRlcn0gdGhhdCB0aGF0IGhhcyBhIHNpbmdsZSB0ZXh0IHZhbHVlIGluIGl0CisgICAgICogKElPVywgb2YgdGhlIGZvcm0gJmx0O2Zvbz50ZXh0Jmx0Oy9mb28+LikKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFFOYW1lIG9mIHRoZSBoZWFkZXIgZWxlbWVudAorICAgICAqIEBwYXJhbSB2YWx1ZSB0ZXh0IHZhbHVlIG9mIHRoZSBoZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBjcmVhdGUoUU5hbWUgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nSGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9NZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzMTNkNgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDY3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLkphdmFNZXRob2Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlNFSU1vZGVsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExCb3VuZE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMQm91bmRQb3J0VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guRGlzcGF0Y2hJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQXR0YWNobWVudFNldEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5qYXhiLkpBWEJNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguWE1MU3RyZWFtUmVhZGVyRXg7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleC5YTUxTdHJlYW1Xcml0ZXJFeDsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgU09BUCBtZXNzYWdlLgorICoKKyAqCisgKiA8aDI+V2hhdCBpcyBhIG1lc3NhZ2U/PC9oMj4KKyAqIDxwPgorICogQSB7QGxpbmsgTWVzc2FnZX0gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZzoKKyAqCisgKiA8b2w+CisgKiA8bGk+CisgKiAgICBSYW5kb20tYWNjZXNzaWJsZSBsaXN0IG9mIGhlYWRlcnMuCisgKiAgICBhIGhlYWRlciBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVsZW1lbnQgaW5zaWRlCisgKiAgICAmbHQ7c29hcDpIZWFkZXI+LgorICogICAgSXQgY2FuIGJlIHJlYWQgbXVsdGlwbGUgdGltZXMsCisgKiAgICBjYW4gYmUgYWRkZWQgb3IgcmVtb3ZlZCwgYnV0IGl0IGlzIG5vdCBtb2RpZmlhYmxlLgorICogICAgU2VlIHtAbGluayBIZWFkZXJMaXN0fSBmb3IgbW9yZSBhYm91dCBoZWFkZXJzLgorICoKKyAqIDxsaT4KKyAqICAgIFRoZSBwYXlsb2FkIG9mIHRoZSBtZXNzYWdlLCB3aGljaCBpcyBhIHJlcHJlc2VudGF0aW9uCisgKiAgICBvZiBhbiBlbGVtZW50IGluc2lkZSAmbHQ7c29hcDpCb2R5Pi4KKyAqICAgIHRoZSBwYXlsb2FkIGlzIHN0cmVhbWVkLCBhbmQgdGhlcmVmb3JlIGl0IGNhbiBiZQorICogICAgb25seSByZWFkIG9uY2UgKG9yIGNhbiBiZSBvbmx5IHdyaXR0ZW4gdG8gc29tZXRoaW5nIG9uY2UuKQorICogICAgb25jZSBhIHBheWxvYWQgaXMgdXNlZCwgYSBtZXNzYWdlIGlzIHNhaWQgdG8gYmUgPGI+Y29uc3VtZWQ8L2I+LgorICogICAgQSBtZXNzYWdlIHtAbGluayAjaGFzUGF5bG9hZCgpIG1heSBub3QgaGF2ZSBhbnkgcGF5bG9hZC59CisgKgorICogPGxpPgorICogICAgQXR0YWNobWVudHMuCisgKiAgICBUT0RPOiBjYW4gYXR0YWNobWVudHMgYmUgc3RyZWFtZWQ/IEkgc3VzcGVjdCBzby4KKyAqICAgIGRvZXMgYW55b25lIG5lZWQgdG8gcmVhZCBhdHRhY2htZW50IHR3aWNlPworICoKKyAqIDwvb2w+CisgKgorICoKKyAqIDxoMj5Ib3cgZG9lcyB0aGlzIGFic3RyYWN0aW9uIHdvcms/PC9oMj4KKyAqIDxwPgorICogVGhlIGJhc2ljIGlkZWEgYmVoaW5kIHRoZSB7QGxpbmsgTWVzc2FnZX0gaXMgdG8gaGlkZSB0aGUgYWN0dWFsCisgKiBkYXRhIHJlcHJlc2VudGF0aW9uLiBGb3IgZXhhbXBsZSwgYSB7QGxpbmsgTWVzc2FnZX0gbWlnaHQgYmUKKyAqIGNvbnN0cnVjdGVkIG9uIHRvcCBvZiBhbiB7QGxpbmsgSW5wdXRTdHJlYW19IGZyb20gdGhlIGFjY2VwdGVkIEhUVFAgY29ubmVjdGlvbiwKKyAqIG9yIGl0IG1pZ2h0IGJlIGNvbnN0cnVjdGVkIG9uIHRvcCBvZiBhIEpBWEIgb2JqZWN0IGFzIGEgcmVzdWx0CisgKiBvZiB0aGUgbWV0aG9kIGludm9jYXRpb24gdGhyb3VnaCB7QGxpbmsgUHJveHl9LiBUaGVyZSB3aWxsIGJlCisgKiBhIHtAbGluayBNZXNzYWdlfSBpbXBsZW1lbnRhdGlvbiBmb3IgZWFjaCBvZiB0aG9zZSBjYXNlcy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbG90IG9mIG1ldGhvZHMgdGhhdCBhY2Nlc3MgdGhlIHBheWxvYWQKKyAqIGluIG1hbnkgZGlmZmVyZW50IGZvcm1zLCBhbmQgaW1wbGVtZW50YXRpb25zIGNhbiBpbXBsZW1lbnQgdGhvc2UKKyAqIG1ldGhvZHMgaW4gdGhlIGJlc3QgcG9zc2libGUgd2F5LgorICoKKyAqIDxwPgorICogQSBwYXJ0aWN1bGFyIGF0dGVudGlvbiBpcyBwYWlkIHRvIG1ha2Ugc3VyZSB0aGF0IGEge0BsaW5rIE1lc3NhZ2V9CisgKiBvYmplY3QgY2FuIGJlIGNvbnN0cnVjdGVkIG9uIGEgc3RyZWFtIHRoYXQgaXMgbm90IGZ1bGx5IHJlYWQgeWV0LgorICogV2UgYmVsaWV2ZSB0aGlzIGltcHJvdmVzIHRoZSB0dXJuLWFyb3VuZCB0aW1lIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KKyAqCisgKiA8cD4KKyAqIEl0IGlzIG9mdGVuIHVzZWZ1bCB0byB3cmFwIGEge0BsaW5rIE1lc3NhZ2V9IGludG8gYW5vdGhlciB7QGxpbmsgTWVzc2FnZX0sCisgKiBmb3IgZXhhbXBsZSB0byBlbmNyeXB0IHRoZSBib2R5LCBvciB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBhcyB0aGUgYm9keQorICogaXMgcmVhZC4KKyAqCisgKiA8cD4KKyAqIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgYWxzbyB1c2VkIGZvciBhIFJFU1QtZnVsIFhNTCBtZXNzYWdlLgorICogSW4gc3VjaCBjYXNlIHdlJ2xsIGNvbnN0cnVjdCBhIHtAbGluayBNZXNzYWdlfSB3aXRoIGVtcHR5CisgKiBhdHRhY2htZW50cyBhbmQgaGVhZGVycywgYW5kIHdoZW4gc2VyaWFsaXppbmcgYWxsIGhlYWRlcnMKKyAqIGFuZCBhdHRhY2htZW50cyB3aWxsIGJlIGlnbm9yZWQuCisgKgorICoKKyAqCisgKiA8aDI+TWVzc2FnZSBhbmQgWE9QPC9oMj4KKyAqIDxwPgorICogWE9QIGlzIGNvbnNpZGVyZWQgYXMgYW4ge0BsaW5rIENvZGVjfSwgYW5kIHRoZXJlZm9yZSB3aGVuIHlvdSBhcmUgbG9va2luZyBhdAorICoge0BsaW5rIE1lc3NhZ2V9LCB5b3UnbGwgbmV2ZXIgc2VlICZsdDt4b3A6SW5jbHVkZT4gb3IgYW55IHN1Y2ggZWxlbWVudHMKKyAqIChpbnN0ZWFkIHlvdSdsbCBzZWUgdGhlIGJhc2U2NCBkYXRhIGlubGluZWQuKSBJZiBhIGNvbnN1bWVyIG9mIGluZm9zZXQgaXNuJ3QKKyAqIGludGVyZXN0ZWQgaW4gaGFuZGxpbmcgWE9QIGJ5IGhpbXNlbGYsIHRoaXMgYWxsb3dzIGhpbSB0byB3b3JrIHdpdGggWE9QCisgKiBjb3JyZWN0bHkgZXZlbiB3aXRob3V0IG5vdGljaW5nIGl0LgorICoKKyAqIDxwPgorICogRm9yIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gYWNjZXNzaW5nIHRoZSBiaW5hcnkgZGF0YQorICogbW9yZSBlZmZpY2llbnRseSwgdGhleSBjYW4gdXNlIHtAbGluayBYTUxTdHJlYW1SZWFkZXJFeH0gYW5kCisgKiB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyRXh9LgorICoKKyAqCisgKgorICogPGgyPk1lc3NhZ2UgbGlmZXNwYW48L2gyPgorICogPHA+CisgKiBPZnRlbiB7QGxpbmsgUGFja2V0fSBpbmNsdWRlIGluZm9ybWF0aW9uIGxvY2FsIHRvIGEgcGFydGljdWxhcgorICogaW52b2NhaW9uIChzdWNoIGFzIHtAY29kZSBIdHRwU2VydmxldFJlcXVlc3R9LCBmcm9tIHRoaXMgYW5nbGUsIGl0IG1ha2VzIHNlbnNlCisgKiB0byB0aWUgYSBsaWZlc3BhbiBvZiBhIG1lc3NhZ2UgdG8gb25lIHBpcGVsaW5lIGludm9jYXRpb24uCisgKiA8cD4KKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UgdGhpbmsgYWJvdXQgV1MtUk0sIGl0IG9mdGVuIG5lZWRzIHRvIGhvbGQgb24gdG8KKyAqIGEgbWVzc2FnZSBsb25nZXIgdGhhbiBhIHBpcGVsaW5lIGludm9jYXRpb24gKHlvdSBtaWdodCBnZXQgYW4gSFRUUCByZXF1ZXN0LAorICogZ2V0IGEgbWVzc2FnZSBYLCBnZXQgYSBzZWNvbmQgSFRUUCByZXF1ZXN0LCBnZXQgYW5vdGhlciBtZXNzYWdlIFksIGFuZAorICogb25seSB0aGVuIHlvdSBtaWdodCB3YW50IHRvIHByb2Nlc3MgWC4pCisgKiA8cD4KKyAqIFRPRE86IHdoYXQgZG8gd2UgZG8gYWJvdXQgdGhpcz8KKyAqCisgKgorICogPHByZT4KKyAqIFRPRE86IGNhbiBib2R5IGVsZW1lbnQgaGF2ZSBmb3JlaWduIGF0dHJpYnV0ZXM/IG1heWJlIElEIGZvciBzZWN1cml0eT8KKyAqICAgICAgIFllcywgd2hlbiB0aGUgU09BUCBib2R5IGlzIHNpZ25lZCB0aGVyZSB3aWxsIGJlIGFuIElEIGF0dHJpYnV0ZSBwcmVzZW50CisgKiAgICAgICBCdXQgaW4gdGhpcyBjYXNlIGFueSBzZWN1cml0eSBiYXNlZCBpbXBsIG1heSBuZWVkIGFjY2VzcworICogICAgICAgdG8gdGhlIGNvbmNyZXRlIHJlcHJlc2VudGF0aW9uLgorICogVE9ETzogSFRUUCBoZWFkZXJzPworICogICAgICAgWWVzLiBBYnN0cmFjdGVkIGFzIHRyYW5zcG9ydC1iYXNlZCBwcm9wZXJ0aWVzLgorICogVE9ETzogd2hvIGhhbmRsZXMgU09BUCAxLjEgYW5kIFNPQVAgMS4yIGRpZmZlcmVuY2U/CisgKiAgICAgICBBcyBzZXBhcmF0ZSBjaGFubmVsIGltcGxlbWVudGF0aW9ucyByZXNwb25zaWJsZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZQorICogICAgICAgbWVzc2FnZT8KKyAqIFRPRE86IHNlc3Npb24/CisgKiBUT0RPOiBEbyB3ZSBuZWVkIHRvIGV4cG9zZSBTT0FQTWVzc2FnZSBleHBsaWNpdGx5PworICogICAgICAgU09BUE1lc3NhZ2UgY291bGQgYmUgdGhlIGNvbmNyZXRlIHJlcHJlc2VudGF0aW9uIGJ1dCBpcyBpdCBuZWNlc3NhcnkgdG8KKyAqICAgICAgIHRyYW5zZm9ybSBiZXR3ZWVuIGRpZmZlcmVudCBjb25jcmV0ZSByZXByZXNlbnRhdGlvbnM/CisgKiAgICAgICBQZXJoYXBzIHRoaXMgY29tZXMgZG93biB0byBob3cgdXNlIGNoYW5uZWxzIGZvciBjcmVhdGlvbiBhbmQgcHJvY2Vzc2luZy4KKyAqIFRPRE86IERvIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0dGVyIGJldHdlZW4gY3JlYXRpb24gYW5kIHByb2Nlc3Npbmc/CisgKiAgICAgICBEbyB3ZSByZWFsbHkgbmVlZCB0aGUgcmVxdWlyZW1lbnQgdGhhdCBhIGNyZWF0ZWQgbWVzc2FnZSBjYW4gYmUgcmVzdXNlZAorICogICAgICAgZm9yIHByb2Nlc3NpbmcuIFNoYWxsIHdlIGJpZnVyY2F0ZT8KKyAqCisgKiBUT0RPOiBTT0FQIHZlcnNpb24gaXNzdWUKKyAqICAgICAgIFNPQVAgdmVyc2lvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0LCBzbyBtZXNzYWdlIGl0c2VsZiBkb2Vzbid0IGNhcnJ5IGl0IGFyb3VuZCAoPykKKyAqCisgKiBUT0RPOiB3cmFwcGluZyBtZXNzYWdlIG5lZWRzIGVhc2llci4gaW4gcGFydGljdWxhciBwcm9wZXJ0aWVzIGFuZCBhdHRhY2htZW50cy4KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2UgeworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGhlYWRlcnMgYXJlIHByZXNlbnQgaW4gdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0cnVlIGlmIGhlYWRlcnMgYXJlIHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzSGVhZGVycygpOworCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgdGhlIGhlYWRlcnMgb2YgdGhpcyBtZXNzYWdlLgorICAgICAqCisgICAgICogPGgzPkltcGxlbWVudGF0aW9uIE5vdGU8L2gzPgorICAgICAqIDxwPgorICAgICAqIHtAbGluayBNZXNzYWdlfSBpbXBsZW1lbnRhdGlvbiBpcyBhbGxvd2VkIHRvIGRlZmVyCisgICAgICogdGhlIGNvbnN0cnVjdGlvbiBvZiB7QGxpbmsgSGVhZGVyTGlzdH0gb2JqZWN0LiBTbworICAgICAqIGlmIHlvdSBvbmx5IHdhbnQgdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW55IGhlYWRlcgorICAgICAqIGVsZW1lbnQsIHVzZSB7QGxpbmsgI2hhc0hlYWRlcnMoKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG5vbi1udWxsIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE5vdE51bGwgSGVhZGVyTGlzdCBnZXRIZWFkZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhdHRhY2htZW50cyBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKiAoYXR0YWNobWVudHMgbGl2ZSBvdXRzaWRlIGEgbWVzc2FnZS4pCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIEF0dGFjaG1lbnRTZXQgZ2V0QXR0YWNobWVudHMoKSB7CisgICAgICAgIGlmIChhdHRhY2htZW50U2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGF0dGFjaG1lbnRTZXQgPSBuZXcgQXR0YWNobWVudFNldEltcGwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXR0YWNobWVudFNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcHRpbWl6YXRpb24gaGludCBmb3IgdGhlIGRlcml2ZWQgY2xhc3MgdG8gY2hlY2sKKyAgICAgKiBpZiB3ZSBtYXkgaGF2ZSBzb21lIGF0dGFjaG1lbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0F0dGFjaG1lbnRzKCkgeworICAgICAgICByZXR1cm4gYXR0YWNobWVudFNldCE9bnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQXR0YWNobWVudFNldCBhdHRhY2htZW50U2V0OworCisgICAgcHJpdmF0ZSBXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbiBvZiB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgYW4gaW5zdGFuY2Ugb2YuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZWxpZXMgb24ge0BsaW5rIFdTRExCb3VuZFBvcnRUeXBlI2dldE9wZXJhdGlvbihTdHJpbmcsIFN0cmluZyl9IGJ1dAorICAgICAqIGl0IGRvZXMgc28gaW4gYW4gZWZmaWNpZW50IHdheS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIG9ubHkgZm9yIGEgcmVxdWVzdC4gQSBwaXBlIGNhbiBkZXRlcm1pbmUgYW4gb3BlcmF0aW9uIGZvciBhIHJlcXVlc3QsCisgICAgICogYW5kIHRoZW4ga2VlcCBpdCBpbiBhIGxvY2FsIHZhcmlhYmxlIHRvIHVzZSBpdCB3aXRoIGEgcmVzcG9uc2UsIHNvIHRoZXJlIHNob3VsZCBiZQorICAgICAqIG5vIG5lZWQgdG8gZmluZCBvdXQgb3BlcmF0aW9uIGZyb20gYSByZXNwb25zZSAoYmVzaWRlcywgdGhlcmUgbWlnaHQgbm90IGJlIGFueSByZXNwb25zZSEpLgorICAgICAqCisgICAgICogQHBhcmFtIGJvdW5kUG9ydFR5cGUKKyAgICAgKiAgICAgIFRoaXMgcmVwcmVzZW50cyB0aGUgcG9ydCBmb3Igd2hpY2ggdGhpcyBtZXNzYWdlIGlzIHVzZWQuCisgICAgICogICAgICBNb3N0IHtAbGluayBQaXBlfXMgc2hvdWxkIGdldCB0aGlzIGluZm9ybWF0aW9uIHdoZW4gdGhleSBhcmUgY3JlYXRlZCwKKyAgICAgKiAgICAgIHNpbmNlIGEgcGlwcGVsaW5lIGFsd2F5cyB3b3JrIGFnYWluc3QgYSBwYXJ0aWN1bGFyIHR5cGUgb2Yge0BsaW5rIFdTRExQb3J0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIE51bGwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgbm90IGZvdW5kLiBUaGlzIGlzIHBvc3NpYmxlLCBmb3IgZXhhbXBsZSB3aGVuIGEgcHJvdG9jb2wKKyAgICAgKiAgICAgIG1lc3NhZ2UgaXMgc2VudCB0aHJvdWdoIGEgcGlwZWxpbmUsIG9yIHdoZW4gd2UgcmVjZWl2ZSBhbiBpbnZhbGlkIHJlcXVlc3Qgb24gdGhlIHNlcnZlciwKKyAgICAgKiAgICAgIG9yIHdoZW4gd2UgYXJlIG9uIHRoZSBjbGllbnQgYW5kIHRoZSB1c2VyIGFwcGxpYXRpb24gc2VuZHMgYSByYW5kb20gRE9NIHRocm91Z2gKKyAgICAgKiAgICAgIHtAbGluayBEaXNwYXRjaH0sIHNvIHRoaXMgZXJyb3IgbmVlZHMgdG8gYmUgaGFuZGxlZCBncmFjZWZ1bGx5LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBATnVsbGFibGUgV1NETEJvdW5kT3BlcmF0aW9uIGdldE9wZXJhdGlvbihATm90TnVsbCBXU0RMQm91bmRQb3J0VHlwZSBib3VuZFBvcnRUeXBlKSB7CisgICAgICAgIGlmKG9wZXJhdGlvbj09bnVsbCkKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9IGJvdW5kUG9ydFR5cGUuZ2V0T3BlcmF0aW9uKGdldFBheWxvYWROYW1lc3BhY2VVUkkoKSxnZXRQYXlsb2FkTG9jYWxQYXJ0KCkpOworICAgICAgICByZXR1cm4gb3BlcmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayAjZ2V0T3BlcmF0aW9uKFdTRExCb3VuZFBvcnRUeXBlKX0gYnV0CisgICAgICogdGFrZXMge0BsaW5rIFdTRExQb3J0fSBmb3IgY29udmVuaWVuY2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEBOdWxsYWJsZSBXU0RMQm91bmRPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKEBOb3ROdWxsIFdTRExQb3J0IHBvcnQpIHsKKyAgICAgICAgcmV0dXJuIGdldE9wZXJhdGlvbihwb3J0LmdldEJpbmRpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgamF2YSBNZXRob2Qgb2Ygd2hpY2ggdGhpcyBtZXNzYWdlIGlzIGFuIGluc3RhbmNlIG9mLgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCB3b3JrcyBvbmx5IGZvciBhIHJlcXVlc3QuIEEgcGlwZSBjYW4gZGV0ZXJtaW5lIGEge0BsaW5rIE1ldGhvZH0KKyAgICAgKiBmb3IgYSByZXF1ZXN0LCBhbmQgdGhlbiBrZWVwIGl0IGluIGEgbG9jYWwgdmFyaWFibGUgdG8gdXNlIGl0IHdpdGggYSByZXNwb25zZSwKKyAgICAgKiBzbyB0aGVyZSBzaG91bGQgYmUgbm8gbmVlZCB0byBmaW5kIG91dCBvcGVyYXRpb24gZnJvbSBhIHJlc3BvbnNlIChiZXNpZGVzLAorICAgICAqIHRoZXJlIG1pZ2h0IG5vdCBiZSBhbnkgcmVzcG9uc2UhKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWlNb2RlbAorICAgICAqICAgICAgVGhpcyByZXByZXNlbnRzIHRoZSBqYXZhIG1vZGVsIGZvciB0aGUgZW5kcG9pbnQKKyAgICAgKiAgICAgIFNvbWUgc2VydmVyIHtAbGluayBQaXBlfXMgd291bGQgZ2V0IHRoaXMgaW5mb3JtYXRpb24gd2hlbiB0aGV5IGFyZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgTnVsbCBpZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIE1ldGhvZCBmb3IgdGhpcyBtZXNzYWdlLiBUaGlzIGlzCisgICAgICogICAgICBwb3NzaWJsZSwgZm9yIGV4YW1wbGUgd2hlbiBhIHByb3RvY29sIG1lc3NhZ2UgaXMgc2VudCB0aHJvdWdoIGEKKyAgICAgKiAgICAgIHBpcGVsaW5lLCBvciB3aGVuIHdlIHJlY2VpdmUgYW4gaW52YWxpZCByZXF1ZXN0IG9uIHRoZSBzZXJ2ZXIsCisgICAgICogICAgICBvciB3aGVuIHdlIGFyZSBvbiB0aGUgY2xpZW50IGFuZCB0aGUgdXNlciBhcHBsaWF0aW9uIHNlbmRzIGEgcmFuZG9tCisgICAgICogICAgICBET00gdGhyb3VnaCB7QGxpbmsgRGlzcGF0Y2h9LCBzbyB0aGlzIGVycm9yIG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiAgICAgIGdyYWNlZnVsbHkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEBOdWxsYWJsZSBKYXZhTWV0aG9kIGdldE1ldGhvZChATm90TnVsbCBTRUlNb2RlbCBzZWlNb2RlbCkgeworICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gZ2V0UGF5bG9hZExvY2FsUGFydCgpOworICAgICAgICBTdHJpbmcgbnNVcmk7CisgICAgICAgIGlmIChsb2NhbFBhcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9jYWxQYXJ0ID0gIiI7CisgICAgICAgICAgICBuc1VyaSA9ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnNVcmkgPSBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCk7CisgICAgICAgIH0KKyAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZShuc1VyaSwgbG9jYWxQYXJ0KTsKKyAgICAgICAgcmV0dXJuIHNlaU1vZGVsLmdldEphdmFNZXRob2QobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBCb29sZWFuIGlzT25lV2F5OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWVzc2FnZSBpcyBhIHJlcXVlc3QgbWVzc2FnZSBmb3IgYQorICAgICAqIG9uZSB3YXkgb3BlcmF0aW9uIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gV1NETC4gRmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgYXMgZG9pbmcKKyAgICAgKiB7QGNvZGUgZ2V0T3BlcmF0aW9uKHBvcnQpLmdldE9wZXJhdGlvbigpLmlzT25lV2F5KCl9CisgICAgICogKHdpdGggcHJvcGVyIG51bGwgY2hlY2sgYW5kIGFsbC4pIEJ1dCB0aGlzIG1ldGhvZAorICAgICAqIGNhbiBzb21ldGltZXMgd29yayBmYXN0ZXIgdGhhbiB0aGF0IChmb3IgZXhhbXBsZSwKKyAgICAgKiBvbiB0aGUgY2xpZW50IHNpZGUgd2hlbiB1c2VkIHdpdGggU0VJLikKKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0CisgICAgICogICAgICB7QGxpbmsgTWVzc2FnZX1zIGFyZSBhbHdheXMgY3JlYXRlZCB1bmRlciB0aGUgY29udGV4dCBvZgorICAgICAqICAgICAgb25lIHtAbGluayBXU0RMUG9ydH0gYW5kIHRoZXkgbmV2ZXIgZ28gb3V0c2lkZSB0aGF0IGNvbnRleHQuCisgICAgICogICAgICBQYXNzIGluIHRoYXQgImdvdmVybmluZyIge0BsaW5rIFdTRExQb3J0fSBvYmplY3QgaGVyZS4KKyAgICAgKiAgICAgIFdlIGNob3NlIHRvIHJlY2VpdmUgdGhpcyBhcyBhIHBhcmFtZXRlciBpbnN0ZWFkIG9mCisgICAgICogICAgICBrZWVwaW5nIHtAbGluayBXU0RMUG9ydH0gaW4gYSBtZXNzYWdlLCBqdXN0IHRvIHNhdmUgdGhlIHN0b3JhZ2UuCisgICAgICoKKyAgICAgKiAgICAgIDxwPgorICAgICAqICAgICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGludm9sdmVzIGNhY2hpbmcgdGhlIHJldHVybgorICAgICAqICAgICAgdmFsdWUsIHNvIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgbXVsdGlwbGUgY2FsbGVycyBwcm92aWRlCisgICAgICogICAgICBkaWZmZXJlbnQge0BsaW5rIFdTRExQb3J0fSBvYmplY3RzLCB3aGljaCBpcyBhIGJ1ZyBvZiB0aGUgY2FsbGVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzT25lV2F5KEBOb3ROdWxsIFdTRExQb3J0IHBvcnQpIHsKKyAgICAgICAgaWYoaXNPbmVXYXk9PW51bGwpIHsKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IGtub3csIHNvIGNvbXB1dGUuCisgICAgICAgICAgICBXU0RMQm91bmRPcGVyYXRpb24gb3AgPSBnZXRPcGVyYXRpb24ocG9ydCk7CisgICAgICAgICAgICBpZihvcCE9bnVsbCkKKyAgICAgICAgICAgICAgICBpc09uZVdheSA9IG9wLmdldE9wZXJhdGlvbigpLmlzT25lV2F5KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLy8gdGhlIGNvbnRyYWN0IGlzIHRvIHJldHVybiB0cnVlIG9ubHkgd2hlbiBpdCdzIGtub3duIHRvIGJlIG9uZSB3YXkuCisgICAgICAgICAgICAgICAgaXNPbmVXYXkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNPbmVXYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgYW4gYXNzZXJ0aW9uIHRoYXQgdGhpcyB7QGxpbmsgTWVzc2FnZX0gaXMKKyAgICAgKiBhIHJlcXVlc3QgbWVzc2FnZSBmb3IgYW4gb25lLXdheSBvcGVyYXRpb24gYWNjb3JkaW5nCisgICAgICogdG8gdGhlIGNvbnRleHQgV1NETC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHJlYWxseSBvbmx5IGludGVuZGVkIHRvIGJlIGludm9rZWQgZnJvbSB3aXRoaW4KKyAgICAgKiB0aGUgSkFYLVdTIHJ1bnRpbWUsIGFuZCBub3QgYnkgYW55IGNvZGUgYnVpbGRpbmcgb24gdG9wIG9mIGl0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGludm9rZWQgb25seSB3aGVuIHRoZSBjYWxsZXIgImtub3dzIiB3aGF0CisgICAgICogV1NETCBzYXlzLiBBbHNvLCB0aGVyZSdzIG5vIHBvaW50IGluIGludm9raW5nIHRoaXMgbWV0aG9kIGlmIHRoZSBjYWxsZXIKKyAgICAgKiBpcyBkb2luZyAge0Bjb2RlIGdldE9wZXJhdGlvbihwb3J0KS5nZXRPcGVyYXRpb24oKS5pc09uZVdheSgpfSwKKyAgICAgKiBvciBzbmlmZmluZyB0aGUgcGF5bG9hZCB0YWcgbmFtZS4KKyAgICAgKiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGluY2x1ZGVzIHtAbGluayBEaXNwYXRjaEltcGx9LgorICAgICAqCisgICAgICogPHA+CisgICAgICogT25jZSBjYWxsZWQsIHRoaXMgYWxsb3dzIHtAbGluayAjaXNPbmVXYXkoV1NETFBvcnQpfSBtZXRob2QKKyAgICAgKiB0byByZXR1cm4gYSB2YWx1ZSBxdWlja2x5LgorICAgICAqCisgICAgICogQHNlZSAjaXNPbmVXYXkoV1NETFBvcnQpCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgYXNzZXJ0T25lV2F5KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgLy8gaWYgdHdvIGNhbGxlcnMgbWFrZSBkaWZmZXJlbnQgYXNzZXJ0aW9ucywgdGhhdCdzIGEgYnVnLgorICAgICAgICAvLyB0aGlzIGlzIGFuIGFzc2VydGlvbiwgbm90IGEgcnVudGltZSBjaGVjayBiZWNhdXNlCisgICAgICAgIC8vIG5vYm9keSBvdXRzaWRlIEpBWC1XUyBzaG91bGQgYmUgdXNpbmcgdGhpcy4KKyAgICAgICAgYXNzZXJ0IGlzT25lV2F5PT1udWxsIHx8IGlzT25lV2F5PT12YWx1ZTsKKworICAgICAgICBpc09uZVdheSA9IHZhbHVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG9jYWwgbmFtZSBvZiB0aGUgcGF5bG9hZCBlbGVtZW50LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiBhIHtAbGluayBNZXNzYWdlfSBkb2Vzbid0IGhhdmUgYW55IHBheWxvYWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOdWxsYWJsZSBTdHJpbmcgZ2V0UGF5bG9hZExvY2FsUGFydCgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgcGF5bG9hZCBlbGVtZW50LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiBhIHtAbGluayBNZXNzYWdlfSBkb2Vzbid0IGhhdmUgYW55IHBheWxvYWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCk7CisgICAgLy8gSSdtIG5vdCBwdXR0aW5nIEBOdWxsYWJsZSBvbiBpdCBiZWNhdXNlIGRvaW5nIG51bGwgY2hlY2sgb24gZ2V0UGF5bG9hZExvY2FsUGFydCgpIHNob3VsZCBiZSBzdWZmaWNlCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSB7QGxpbmsgTWVzc2FnZX0gaGFzIGEgcGF5bG9hZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEEgbWVzc2FnZSB3aXRob3V0IGEgcGF5bG9hZCBpcyBhIFNPQVAgbWVzc2FnZSB0aGF0IGxvb2tzIGxpa2U6CisgICAgICogPHByZT48eG1wPgorICAgICAqIDxTOkVudmVsb3BlPgorICAgICAqICAgPFM6SGVhZGVyPgorICAgICAqICAgICAuLi4KKyAgICAgKiAgIDwvUzpIZWFkZXI+CisgICAgICogICA8UzpCb2R5IC8+CisgICAgICogPC9TOkVudmVsb3BlPgorICAgICAqIDwveG1wPjwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1BheWxvYWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1lc3NhZ2UgaXMgYSBmYXVsdC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QgYnVpbHQgb24ge0BsaW5rICNnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCl9CisgICAgICogYW5kIHtAbGluayAjZ2V0UGF5bG9hZExvY2FsUGFydCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdWx0KCkgeworICAgICAgICAvLyBUT0RPOiBpcyBTT0FQIHZlcnNpb24gYSBwcm9wZXJ0eSBvZiBhIE1lc3NhZ2U/CisgICAgICAgIC8vIG9yIGlzIGl0IGRlZmluZWQgYnkgZXh0ZXJuYWwgZmFjdG9ycz8KKyAgICAgICAgLy8gaG93IGRvIEkgY29tcGFyZT8KKyAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IGdldFBheWxvYWRMb2NhbFBhcnQoKTsKKyAgICAgICAgaWYobG9jYWxQYXJ0PT1udWxsIHx8ICFsb2NhbFBhcnQuZXF1YWxzKCJGYXVsdCIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFN0cmluZyBuc1VyaSA9IGdldFBheWxvYWROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgcmV0dXJuIG5zVXJpLmVxdWFscyhTT0FQVmVyc2lvbi5TT0FQXzExLm5zVXJpKSB8fCBuc1VyaS5lcXVhbHMoU09BUFZlcnNpb24uU09BUF8xMi5uc1VyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhpcyBtZXNzYWdlIGluY2x1ZGluZyB0aGUgZW52ZWxvcGUuCisgICAgICogcmV0dXJucyBpdCBhcyBhIHtAbGluayBTb3VyY2V9IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU291cmNlIHJlYWRFbnZlbG9wZUFzU291cmNlKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBheWxvYWQgYXMgYSB7QGxpbmsgU291cmNlfSBvYmplY3QuCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN1bWVzIHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgaWYgdGhlcmUncyBubyBwYXlsb2FkLCB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNvdXJjZSByZWFkUGF5bG9hZEFzU291cmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBlcXVpdmFsZW50IHtAbGluayBTT0FQTWVzc2FnZX0gZnJvbSB0aGlzIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN1bWVzIHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGVyZSdzIGFueSBlcnJvciB3aGlsZSBjcmVhdGluZyBhIHtAbGluayBTT0FQTWVzc2FnZX0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNPQVBNZXNzYWdlIHJlYWRBc1NPQVBNZXNzYWdlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgZXF1aXZhbGVudCB7QGxpbmsgU09BUE1lc3NhZ2V9IGZyb20gdGhpcyBtZXNzYWdlLiBJdCBhbHNvIHVzZXMKKyAgICAgKiB0cmFuc3BvcnQgc3BlY2lmaWMgaGVhZGVycyBmcm9tIFBhY2tldCBkdXJpbmcgdGhlIFNPQVBNZXNzYWdlIGNvbnN0cnVjdGlvbgorICAgICAqIHNvIHRoYXQge0BsaW5rIFNPQVBNZXNzYWdlI2dldE1pbWVIZWFkZXJzKCl9IGdpdmVzIG1lYW5pbmdmdWwgdHJhbnNwb3J0CisgICAgICogaGVhZGVycy4KKyAgICAgKgorICAgICAqIFRoaXMgY29uc3VtZXMgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHRoZXJlJ3MgYW55IGVycm9yIHdoaWxlIGNyZWF0aW5nIGEge0BsaW5rIFNPQVBNZXNzYWdlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU09BUE1lc3NhZ2UgcmVhZEFzU09BUE1lc3NhZ2UoUGFja2V0IHBhY2tldCwgYm9vbGVhbiBpbmJvdW5kKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkQXNTT0FQTWVzc2FnZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBwYXlsb2FkIGFzIGEgSkFYQiBvYmplY3QgYnkgdXNpbmcgdGhlIGdpdmVuIHVubWFyc2hhbGxlci4KKyAgICAgKgorICAgICAqIFRoaXMgY29uc3VtZXMgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIEpBWEIgcmVwb3J0cyBhbiBlcnJvciBkdXJpbmcgdGhlIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IDxUPiBUIHJlYWRQYXlsb2FkQXNKQVhCKFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIHBheWxvYWQgYXMgYSBKQVhCIG9iamVjdCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBCcmlkZ2V9LgorICAgICAqCisgICAgICogVGhpcyBjb25zdW1lcyB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbgorICAgICAqICAgICAgSWYgSkFYQiByZXBvcnRzIGFuIGVycm9yIGR1cmluZyB0aGUgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgPFQ+IFQgcmVhZFBheWxvYWRBc0pBWEIoQnJpZGdlPFQ+IGJyaWRnZSkgdGhyb3dzIEpBWEJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgcGF5bG9hZCBhcyBhIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9CisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN1bWVzIHRoZSBtZXNzYWdlLiBUaGUgY2FsbGVyIGlzIGVuY291cmFnZWQgdG8gY2FsbAorICAgICAqIHtAbGluayBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5I3JlY3ljbGUoWE1MU3RyZWFtUmVhZGVyKX0gd2hlbiBmaW5pc2hlZCB1c2luZworICAgICAqIHRoZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIElmIHRoZXJlJ3Mgbm8gcGF5bG9hZCwgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLgorICAgICAqICAgICAgT3RoZXJ3aXNlIGFsd2F5cyBub24tbnVsbCB2YWxpZCB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSB0aGF0IHBvaW50cyB0bworICAgICAqICAgICAgdGhlIHBheWxvYWQgdGFnIG5hbWUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFhNTFN0cmVhbVJlYWRlciByZWFkUGF5bG9hZCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgbWVzc2FnZSBhcyBjb25zdW1lZCwgd2l0aG91dCBhY3R1YWxseSByZWFkaW5nIHRoZSBjb250ZW50cy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IGZvciBpbXBsZW1lbnRhdGlvbnMgdG8gcmV1c2UKKyAgICAgKiBhbnkgcmV1c2FibGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHRoZSBwYXlsb2FkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnN1bWUoKSB7fQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBwYXlsb2FkIHRvIFN0QVguCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3cml0ZXMganVzdCB0aGUgcGF5bG9hZCBvZiB0aGUgbWVzc2FnZSB0byB0aGUgd3JpdGVyLgorICAgICAqIFRoaXMgY29uc3VtZXMgdGhlIG1lc3NhZ2UuCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgbm90IHdyaXRlCisgICAgICoge0BsaW5rIFhNTFN0cmVhbVdyaXRlciN3cml0ZVN0YXJ0RG9jdW1lbnQoKX0KKyAgICAgKiBub3IKKyAgICAgKiB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyI3dyaXRlRW5kRG9jdW1lbnQoKX0KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHRoZXJlJ3Mgbm8gcGF5bG9hZCwgdGhpcyBtZXRob2QgaXMgbm8tb3AuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgICAqICAgICAgSWYgdGhlIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9IHJlcG9ydHMgYW4gZXJyb3IsCisgICAgICogICAgICBvciBzb21lIG90aGVyIGVycm9ycyBoYXBwZW4gZHVyaW5nIHRoZSBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlUGF5bG9hZFRvKFhNTFN0cmVhbVdyaXRlciBzdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgd2hvbGUgU09BUCBtZXNzYWdlIChidXQgbm90IGF0dGFjaG1lbnRzKQorICAgICAqIHRvIHRoZSBnaXZlbiB3cml0ZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN1bWVzIHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICAgKiAgICAgIElmIHRoZSB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfSByZXBvcnRzIGFuIGVycm9yLAorICAgICAqICAgICAgb3Igc29tZSBvdGhlciBlcnJvcnMgaGFwcGVuIGR1cmluZyB0aGUgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVRvKFhNTFN0cmVhbVdyaXRlciBzdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgd2hvbGUgU09BUCBlbnZlbG9wZSBhcyBTQVggZXZlbnRzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBjb25zdW1lcyB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50SGFuZGxlcgorICAgICAqICAgICAgbXVzdCBub3QgYmUgbnVsbGwuCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlcgorICAgICAqICAgICAgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiAgICAgIGFueSBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIFNBWCBldmVudCBwcm9kdWN0aW9uIG11c3QgYmUKKyAgICAgKiAgICAgIGZpcnN0IHJlcG9ydGVkIHRvIHRoaXMgZXJyb3IgaGFuZGxlci4gRmF0YWwgZXJyb3JzIGNhbiBiZSB0aGVuCisgICAgICogICAgICB0aHJvd24gYXMge0BsaW5rIFNBWFBhcnNlRXhjZXB0aW9ufS4ge0BsaW5rIFNBWEV4Y2VwdGlvbn1zIHRocm93bgorICAgICAqICAgICAgZnJvbSB7QGxpbmsgRXJyb3JIYW5kbGVyfSBzaG91bGQgcHJvcGFnYXRlIGRpcmVjdGx5IHRocm91Z2ggdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVUbyggQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgKSB0aHJvd3MgU0FYRXhjZXB0aW9uOworCisgICAgLy8gVE9ETzogZG8gd2UgbmVlZCBhIG1ldGhvZCB0aGF0IHJlYWRzIHBheWxvYWQgYXMgYSBmYXVsdD8KKyAgICAvLyBkbyB3ZSB3YW50IGEgc2VwYXJ0ZSBzdHJlYW1pbmcgcmVwcmVzZW50YXRpb24gb2YgZmF1bHQ/CisgICAgLy8gb3Igd291bGQgU09BUEZhdWx0IGluIFNBQUogZG8/CisKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYSB7QGxpbmsgTWVzc2FnZX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IHtAbGluayBNZXNzYWdlfSB3aG9zZSBoZWFkZXIvcGF5bG9hZC9hdHRhY2htZW50cy9wcm9wZXJ0aWVzCisgICAgICogYXJlIGlkZW50aWNhbCB0byB0aGlzIHtAbGluayBNZXNzYWdlfS4gT25jZSBjcmVhdGVkLCB0aGUgY3JlYXRlZCB7QGxpbmsgTWVzc2FnZX0KKyAgICAgKiBhbmQgdGhlIG9yaWdpbmFsIHtAbGluayBNZXNzYWdlfSBiZWhhdmVzIGluZGVwZW5kZW50bHkgLS0tIGFkZGluZyBoZWFkZXIvCisgICAgICogYXR0YWNobWVudCB0byBvbmUge0BsaW5rIE1lc3NhZ2V9IGRvZXNuJ3QgYWZmZWN0IGFub3RoZXIge0BsaW5rIE1lc3NhZ2V9CisgICAgICogYXQgYWxsLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgZG9lcyA8Yj5OT1Q8L2I+IGNvbnN1bWUgYSBtZXNzYWdlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVG8gZW5hYmxlIGVmZmljaWVudCBjb3B5IG9wZXJhdGlvbnMsIHRoZXJlJ3MgYSBmZXcgcmVzdHJpY3Rpb25zIG9uCisgICAgICogaG93IGNvcGllZCBtZXNzYWdlIGNhbiBiZSB1c2VkLgorICAgICAqCisgICAgICogPG9sPgorICAgICAqICA8bGk+VGhlIG9yaWdpbmFsIGFuZCB0aGUgY29weSBtYXkgbm90IGJlCisgICAgICogICAgICB1c2VkIGNvbmN1cnJlbnRseSBieSB0d28gdGhyZWFkcyAodGhpcyBhbGxvd3MgdHdvIHtAbGluayBNZXNzYWdlfXMKKyAgICAgKiAgICAgIHRvIHNoYXJlIHNvbWUgaW50ZXJuYWwgcmVzb3VyY2VzLCBzdWNoIGFzIEpBWEIgbWFyc2hhbGxlcnMuKQorICAgICAqICAgICAgTm90ZSB0aGF0IGl0J3MgT0sgZm9yIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGNvcHkgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogICAgICBieSB0d28gdGhyZWFkcywgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3QgY29uY3VycmVudC4KKyAgICAgKgorICAgICAqICA8bGk+VGhlIGNvcHkgaGFzIHRoZSBzYW1lICdsaWZlIHNjb3BlJworICAgICAqICAgICAgYXMgdGhlIG9yaWdpbmFsICh0aGlzIGFsbG93cyBzaGFsbG93ZXIgY29weSwgc3VjaCBhcworICAgICAqICAgICAgSkFYQiBiZWFucyB3cmFwcGVkIGluIHtAbGluayBKQVhCTWVzc2FnZX0uKQorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBICdsaWZlIHNjb3BlJyBvZiBhIG1lc3NhZ2UgY3JlYXRlZCBkdXJpbmcgYSBtZXNzYWdlIHByb2Nlc3NpbmcKKyAgICAgKiBpbiBhIHBpcGVsaW5lIGlzIHVudGlsIGEgcGlwZWxpbmUgcHJvY2Vzc2VzIHRoZSBuZXh0IG1lc3NhZ2UuCisgICAgICogQSBtZXNzYWdlIGNhbm5vdCBiZSBrZXB0IGJleW9uZCBpdHMgbGlmZSBzY29wZS4KKyAgICAgKgorICAgICAqIChUaGlzIGV4cGVyaW1lbnRhbCBkZXNpZ24gaXMgdG8gYWxsb3cgbWVzc2FnZSBvYmplY3RzIHRvIGJlIHJldXNlZAorICAgICAqIC0tLSBmZWVkYmFjayBhcHByZWNpYXRlZC4pCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICogPGgzPkRlc2lnbiBSYXRpb25hbGU8L2gzPgorICAgICAqIDxwPgorICAgICAqIFNpbmNlIGEge0BsaW5rIE1lc3NhZ2V9IGJvZHkgaXMgcmVhZC1vbmNlLCBzb21ldGltZXMKKyAgICAgKiAoc3VjaCBhcyB3aGVuIHlvdSBkbyBmYWlsLW92ZXIsIG9yIFdTLVJNKSB5b3UgbmVlZCB0bworICAgICAqIGNyZWF0ZSBhbiBpZGVudGlhbCBjb3B5IG9mIGEge0BsaW5rIE1lc3NhZ2V9LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIGFjdHVhbCBjb3B5IG9wZXJhdGlvbiBkZXBlbmRzIG9uIHRoZSBsYXlvdXQKKyAgICAgKiBvZiB0aGUgZGF0YSBpbiBtZW1vcnksIGhlbmNlIGl0J3MgYmVzdCB0byBiZSBkb25lIGJ5CisgICAgICogdGhlIHtAbGluayBNZXNzYWdlfSBpbXBsZW1lbnRhdGlvbiBpdHNlbGYuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVzdHJpY3Rpb25zIHBsYWNlZCBvbiB0aGUgdXNlIG9mIGNvcGllZCB7QGxpbmsgTWVzc2FnZX0gY2FuIGJlCisgICAgICogcmVsYXhlZCBpZiBuZWNlc3NhcnksIGJ1dCBpdCB3aWxsIG1ha2UgdGhlIGNvcHkgbWV0aG9kIG1vcmUgZXhwZW5zaXZlLgorICAgICAqLworICAgIC8vIFRPRE86IHVwZGF0ZSB0aGUgY2xhc3MgamF2YWRvYyB3aXRoICdsaWZlc2NvcGUnCisgICAgLy8gYW5kIG1vdmUgdGhlIGRpc2N1c3Npb24gYWJvdXQgbGlmZSBzY29wZSB0aGVyZS4KKyAgICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZSBjb3B5KCk7CisKKyAgICBwcml2YXRlIFN0cmluZyB1dWlkOworCisgICAgLyoqCisgICAgICogUmV0dW5zIGEgdW5pcXVlIGlkIGZvciB0aGUgbWVzc2FnZS4gVGhlIGlkIGNhbiBiZSB1c2VkIGZvciB2YXJpb3VzIHRoaW5ncywKKyAgICAgKiBsaWtlIGRlYnVnIGFzc2lzdGFuY2UsIGxvZ2dpbmcsIGFuZCBNSU1FIGVuY29kaW5nKHNheSBmb3IgYm91bmRhcnkpLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBhZGRyZXNzaW5nIDxNZXNzYWdlSUQ+IGhlYWRlciwKKyAgICAgKiBhbmQgaWYgcHJlc2VudCB1c2VzIHRoYXQgdmFsdWUuIE90aGVyd2lzZSBpdCBnZW5lcmF0ZXMgb25lIGZyb20gVVVJRC5yYW5kb20oKSwKKyAgICAgKiBhbmQgcmV0dXJuIGl0IHdpdGhvdXQgYWRkaW5nIGEgbmV3IGhlYWRlci4gQnV0IGl0IGRvZXNuJ3QgYWRkIGEgPE1lc3NhZ2VJRD4KKyAgICAgKiB0byB0aGUgaGVhZGVyIGxpc3Qgc2luY2Ugd2UgZXhwZWN0IHRoZW0gdG8gYmUgYWRkZWQgYmVmb3JlIGNhbGxpbmcgdGhpcworICAgICAqIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEFkZHJlc3NpbmcgdHViZSB3aWxsIGdvIGRvIGEgc2VwYXJhdGUgdmVyaWZpY2F0aW9uIG9uIGluYm91bmQKKyAgICAgKiBoZWFkZXJzIHRvIG1ha2Ugc3VyZSB0aGF0IDxNZXNzYWdlSUQ+IGhlYWRlciBpcyBwcmVzZW50IHdoZW4gaXQncworICAgICAqIHN1cHBvc2VkIHRvIGJlLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmcgb2JqZWN0IGNyZWF0ZWQgYnkge0BsaW5rIEJpbmRpbmdJRCNjcmVhdGVCaW5kaW5nKCl9CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHVuaXF1ZSBpZCBmb3IgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgU3RyaW5nIGdldElEKEBOb3ROdWxsIFdTQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIHJldHVybiBnZXRJRChiaW5kaW5nLmdldEFkZHJlc3NpbmdWZXJzaW9uKCksIGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dW5zIGEgdW5pcXVlIGlkIGZvciB0aGUgbWVzc2FnZS4KKyAgICAgKiA8cD48cD4KKyAgICAgKiBAc2VlIHtAbGluayAjZ2V0SUQoY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZyl9IGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbi4KKyAgICAgKiBAcGFyYW0gYXYgV1MtQWRkcmVzc2luZyB2ZXJzaW9uCisgICAgICogQHBhcmFtIHN2IFNPQVAgdmVyc2lvbgorICAgICAqIEByZXR1cm4gdW5pcXVlIGlkIGZvciB0aGUgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0SUQoQWRkcmVzc2luZ1ZlcnNpb24gYXYsIFNPQVBWZXJzaW9uIHN2KSB7CisgICAgICAgIGlmICh1dWlkID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChhdiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdXVpZCA9IGdldEhlYWRlcnMoKS5nZXRNZXNzYWdlSUQoYXYsIHN2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1dWlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1dWlkID0gInV1aWQ6IiArIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHV1aWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2UvTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzNjdkNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuSkFYQlJJQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuTWFyc2hhbGxlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29kZWNzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLlN0cmVhbVNPQVBDb2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5mYXVsdC5TT0FQRmF1bHRCdWlsZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQXR0YWNobWVudFNldEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5ET01NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuRW1wdHlNZXNzYWdlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLlByb2JsZW1BY3Rpb25IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW0uUGF5bG9hZFN0cmVhbVJlYWRlck1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5qYXhiLkpBWEJNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc2Fhai5TQUFKTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnNvdXJjZS5QYXlsb2FkU291cmNlTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnNvdXJjZS5Qcm90b2NvbFNvdXJjZU1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkRPTVV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuKjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CisKKy8qKgorICogRmFjdG9yeSBtZXRob2RzIGZvciB2YXJpb3VzIHtAbGluayBNZXNzYWdlfSBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHZhcmlvdXMgbWV0aG9kcyB0byBjcmVhdGUgZGlmZmVyZW50CisgKiBmbGF2b3JzIG9mIHtAbGluayBNZXNzYWdlfSBjbGFzc2VzIHRoYXQgc3RvcmUgZGF0YQorICogaW4gZGlmZmVyZW50IGZvcm1hdHMuCisgKgorICogPHA+CisgKiBUaGlzIGlzIGEgcGFydCBvZiB0aGUgSkFYLVdTIFJJIGludGVybmFsIEFQSSBzbyB0aGF0CisgKiB7QGxpbmsgVHViZX0gaW1wbGVtZW50YXRpb25zIGNhbiByZXVzZSB0aGUgaW1wbGVtZW50YXRpb25zCisgKiBkb25lIGluc2lkZSB0aGUgSkFYLVdTLgorICoKKyAqIDxwPgorICogSWYgeW91IGZpbmQgc29tZSBvZiB0aGUgdXNlZnVsIGNvbnZlbmllbmNlIG1ldGhvZHMgbWlzc2luZworICogZnJvbSB0aGlzIGNsYXNzLCBwbGVhc2UgdGFsayB0byB1cy4KKyAqCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVzc2FnZXMgeworICAgIHByaXZhdGUgTWVzc2FnZXMoKSB7fQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBNZXNzYWdlfSBiYWNrZWQgYnkgYSBKQVhCIGJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCB0byBwcm9kdWNlIGluZm9zZXQgZnJvbSB0aGUgb2JqZWN0LiBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBqYXhiT2JqZWN0CisgICAgICogICAgICBUaGUgSkFYQiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwYXlsb2FkLiBtdXN0IG5vdCBiZSBudWxsLiBUaGlzIG9iamVjdAorICAgICAqICAgICAgbXVzdCBiZSBib3VuZCB0byBhbiBlbGVtZW50ICh3aGljaCBtZWFucyBpdCBlaXRoZXIgaXMgYSB7QGxpbmsgSkFYQkVsZW1lbnR9IG9yCisgICAgICogICAgICBhbiBpbnN0YW5jZW9mIGEgY2xhc3Mgd2l0aCB7QGxpbmsgWG1sUm9vdEVsZW1lbnR9KS4KKyAgICAgKiBAcGFyYW0gc29hcFZlcnNpb24KKyAgICAgKiAgICAgIFRoZSBTT0FQIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuIE11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZShKQVhCUklDb250ZXh0IGNvbnRleHQsIE9iamVjdCBqYXhiT2JqZWN0LCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICByZXR1cm4gSkFYQk1lc3NhZ2UuY3JlYXRlKGNvbnRleHQsamF4Yk9iamVjdCxzb2FwVmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFVzZSB7QGxpbmsgI2NyZWF0ZShKQVhCUklDb250ZXh0LCBPYmplY3QsIFNPQVBWZXJzaW9uKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlKE1hcnNoYWxsZXIgbWFyc2hhbGxlciwgT2JqZWN0IGpheGJPYmplY3QsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBjcmVhdGUoKChNYXJzaGFsbGVySW1wbCltYXJzaGFsbGVyKS5nZXRDb250ZXh0KCksamF4Yk9iamVjdCxzb2FwVmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBNZXNzYWdlfSBiYWNrZWQgYnkgYSBTQUFKIHtAbGluayBTT0FQTWVzc2FnZX0gb2JqZWN0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHtAbGluayBTT0FQTWVzc2FnZX0gY29udGFpbnMgaGVhZGVycyBhbmQgYXR0YWNobWVudHMsIHRoaXMgbWV0aG9kCisgICAgICogZG9lcyB0aGUgcmlnaHQgdGhpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2FhagorICAgICAqICAgICAgVGhlIFNPQVAgbWVzc2FnZSB0byBiZSByZXByZXNlbnRlZCBhcyBhIHtAbGluayBNZXNzYWdlfS4KKyAgICAgKiAgICAgIE11c3Qgbm90IGJlIG51bGwuIE9uY2UgdGhpcyBtZXRob2QgaXMgaW52b2tlZCwgdGhlIGNyZWF0ZWQKKyAgICAgKiAgICAgIHtAbGluayBNZXNzYWdlfSB3aWxsIG93biB0aGUge0BsaW5rIFNPQVBNZXNzYWdlfSwgc28gaXQgc2hhbGwKKyAgICAgKiAgICAgIG5ldmVyIGJlIHRvdWNoZWQgZGlyZWN0bHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZShTT0FQTWVzc2FnZSBzYWFqKSB7CisgICAgICAgIHJldHVybiBuZXcgU0FBSk1lc3NhZ2Uoc2Fhaik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBNZXNzYWdlfSB1c2luZyB7QGxpbmsgU291cmNlfSBhcyBwYXlsb2FkLgorICAgICAqCisgICAgICogQHBhcmFtIHBheWxvYWQKKyAgICAgKiAgICAgIFNvdXJjZSBwYXlsb2FkIGlzIHtAbGluayBNZXNzYWdlfSdzIHBheWxvYWQKKyAgICAgKiAgICAgIE11c3Qgbm90IGJlIG51bGwuIE9uY2UgdGhpcyBtZXRob2QgaXMgaW52b2tlZCwgdGhlIGNyZWF0ZWQKKyAgICAgKiAgICAgIHtAbGluayBNZXNzYWdlfSB3aWxsIG93biB0aGUge0BsaW5rIFNvdXJjZX0sIHNvIGl0IHNoYWxsCisgICAgICogICAgICBuZXZlciBiZSB0b3VjaGVkIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIHZlcgorICAgICAqICAgICAgVGhlIFNPQVAgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZS4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlVXNpbmdQYXlsb2FkKFNvdXJjZSBwYXlsb2FkLCBTT0FQVmVyc2lvbiB2ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXlsb2FkU291cmNlTWVzc2FnZShwYXlsb2FkLCB2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgTWVzc2FnZX0gdXNpbmcge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gYXMgcGF5bG9hZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXlsb2FkCisgICAgICogICAgICBYTUxTdHJlYW1SZWFkZXIgcGF5bG9hZCBpcyB7QGxpbmsgTWVzc2FnZX0ncyBwYXlsb2FkCisgICAgICogICAgICBNdXN0IG5vdCBiZSBudWxsLiBPbmNlIHRoaXMgbWV0aG9kIGlzIGludm9rZWQsIHRoZSBjcmVhdGVkCisgICAgICogICAgICB7QGxpbmsgTWVzc2FnZX0gd2lsbCBvd24gdGhlIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9LCBzbyBpdCBzaGFsbAorICAgICAqICAgICAgbmV2ZXIgYmUgdG91Y2hlZCBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXIKKyAgICAgKiAgICAgIFRoZSBTT0FQIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuIE11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZVVzaW5nUGF5bG9hZChYTUxTdHJlYW1SZWFkZXIgcGF5bG9hZCwgU09BUFZlcnNpb24gdmVyKSB7CisgICAgICAgIHJldHVybiBuZXcgUGF5bG9hZFN0cmVhbVJlYWRlck1lc3NhZ2UocGF5bG9hZCwgdmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIE1lc3NhZ2V9IGZyb20gYW4ge0BsaW5rIEVsZW1lbnR9IHRoYXQgcmVwcmVzZW50cworICAgICAqIGEgcGF5bG9hZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXlsb2FkCisgICAgICogICAgICBUaGUgZWxlbWVudCB0aGF0IGJlY29tZXMgdGhlIGNoaWxkIGVsZW1lbnQgb2YgdGhlIFNPQVAgYm9keS4KKyAgICAgKiAgICAgIE11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyCisgICAgICogICAgICBUaGUgU09BUCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLiBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZSBjcmVhdGVVc2luZ1BheWxvYWQoRWxlbWVudCBwYXlsb2FkLCBTT0FQVmVyc2lvbiB2ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBET01NZXNzYWdlKHZlcixwYXlsb2FkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIE1lc3NhZ2V9IGZyb20gYW4ge0BsaW5rIEVsZW1lbnR9IHRoYXQgcmVwcmVzZW50cworICAgICAqIHRoZSB3aG9sZSBTT0FQIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc29hcEVudmVsb3BlCisgICAgICogICAgICBUaGUgU09BUCBlbnZlbG9wZSBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZSBjcmVhdGUoRWxlbWVudCBzb2FwRW52ZWxvcGUpIHsKKyAgICAgICAgU09BUFZlcnNpb24gdmVyID0gU09BUFZlcnNpb24uZnJvbU5zVXJpKHNvYXBFbnZlbG9wZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIC8vIGZpbmQgdGhlIGhlYWRlcnMKKyAgICAgICAgRWxlbWVudCBoZWFkZXIgPSBET01VdGlsLmdldEZpcnN0Q2hpbGQoc29hcEVudmVsb3BlLCB2ZXIubnNVcmksICJIZWFkZXIiKTsKKyAgICAgICAgSGVhZGVyTGlzdCBoZWFkZXJzID0gbnVsbDsKKyAgICAgICAgaWYoaGVhZGVyIT1udWxsKSB7CisgICAgICAgICAgICBmb3IoIE5vZGUgbj1oZWFkZXIuZ2V0Rmlyc3RDaGlsZCgpOyBuIT1udWxsOyBuPW4uZ2V0TmV4dFNpYmxpbmcoKSApIHsKKyAgICAgICAgICAgICAgICBpZihuLmdldE5vZGVUeXBlKCk9PU5vZGUuRUxFTUVOVF9OT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGhlYWRlcnM9PW51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gbmV3IEhlYWRlckxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoSGVhZGVycy5jcmVhdGUoKEVsZW1lbnQpbikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbmQgdGhlIHBheWxvYWQKKyAgICAgICAgRWxlbWVudCBib2R5ID0gRE9NVXRpbC5nZXRGaXJzdENoaWxkKHNvYXBFbnZlbG9wZSwgdmVyLm5zVXJpLCAiQm9keSIpOworICAgICAgICBpZihib2R5PT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIk1lc3NhZ2UgZG9lc24ndCBoYXZlIDxTOkJvZHk+ICIrc29hcEVudmVsb3BlKTsKKyAgICAgICAgRWxlbWVudCBwYXlsb2FkID0gRE9NVXRpbC5nZXRGaXJzdENoaWxkKHNvYXBFbnZlbG9wZSwgdmVyLm5zVXJpLCAiQm9keSIpOworCisgICAgICAgIGlmKHBheWxvYWQ9PW51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlNZXNzYWdlSW1wbChoZWFkZXJzLCBuZXcgQXR0YWNobWVudFNldEltcGwoKSwgdmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRE9NTWVzc2FnZSh2ZXIsaGVhZGVycyxwYXlsb2FkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgTWVzc2FnZX0gdXNpbmcgU291cmNlIGFzIGVudGlyZSBlbnZlbG9wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnZlbG9wZQorICAgICAqICAgICAgU291cmNlIGVudmVsb3BlIGlzIHVzZWQgdG8gY3JlYXRlIHtAbGluayBNZXNzYWdlfQorICAgICAqICAgICAgTXVzdCBub3QgYmUgbnVsbC4gT25jZSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCB0aGUgY3JlYXRlZAorICAgICAqICAgICAge0BsaW5rIE1lc3NhZ2V9IHdpbGwgb3duIHRoZSB7QGxpbmsgU291cmNlfSwgc28gaXQgc2hhbGwKKyAgICAgKiAgICAgIG5ldmVyIGJlIHRvdWNoZWQgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlKFNvdXJjZSBlbnZlbG9wZSwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcm90b2NvbFNvdXJjZU1lc3NhZ2UoZW52ZWxvcGUsIHNvYXBWZXJzaW9uKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgTWVzc2FnZX0gdGhhdCBkb2Vzbid0IGhhdmUgYW55IHBheWxvYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZUVtcHR5KFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgRW1wdHlNZXNzYWdlSW1wbChzb2FwVmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBNZXNzYWdlfSBmcm9tIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IHRoYXQgcG9pbnRzIHRvCisgICAgICogdGhlIHN0YXJ0IG9mIHRoZSBlbnZlbG9wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiAgICAgIGNhbiBwb2ludCB0byB0aGUgc3RhcnQgZG9jdW1lbnQgb3IgdGhlIHN0YXJ0IGVsZW1lbnQgKG9mICZsdDtzOkVudmVsb3BlPikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIE1lc3NhZ2UgY3JlYXRlKEBOb3ROdWxsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgLy8gc2tpcCB1bnRpbCB0aGUgcm9vdCBlbGVtZW50CisgICAgICAgIGlmKHJlYWRlci5nZXRFdmVudFR5cGUoKSE9WE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpCisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOworICAgICAgICBhc3NlcnQgcmVhZGVyLmdldEV2ZW50VHlwZSgpPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgOnJlYWRlci5nZXRFdmVudFR5cGUoKTsKKworICAgICAgICBTT0FQVmVyc2lvbiB2ZXIgPSBTT0FQVmVyc2lvbi5mcm9tTnNVcmkocmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKKworICAgICAgICByZXR1cm4gQ29kZWNzLmNyZWF0ZVNPQVBFbnZlbG9wZVhtbENvZGVjKHZlcikuZGVjb2RlKHJlYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBNZXNzYWdlfSBmcm9tIHtAbGluayBYTUxTdHJlYW1CdWZmZXJ9IHRoYXQgcmV0YWlucyB0aGUKKyAgICAgKiB3aG9sZSBlbnZlbG9wZSBpbmZvc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHhzYgorICAgICAqICAgICAgVGhpcyBidWZmZXIgbXVzdCBjb250YWluIHRoZSBpbmZvc2V0IG9mIHRoZSB3aG9sZSBlbnZlbG9wZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIE1lc3NhZ2UgY3JlYXRlKEBOb3ROdWxsIFhNTFN0cmVhbUJ1ZmZlciB4c2IpIHsKKyAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGJlIGFibGUgdG8gbGV0IE1lc3NhZSBrbm93IHRoYXQgaXQncyB3b3JraW5nIG9mZiBmcm9tIGEgYnVmZmVyLAorICAgICAgICAvLyB0byBtYWtlIHNvbWUgb2YgdGhlIG9wZXJhdGlvbnMgbW9yZSBlZmZpY2llbnQuCisgICAgICAgIC8vIG1lYW53aGlsZSwgYWRkaW5nIHRoaXMgYXMgYW4gQVBJIHNvIHRoYXQgb3VyIHVzZXJzIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBpdAorICAgICAgICAvLyB3aGVuIHdlIGdldCBhcm91bmQgdG8gc3VjaCBhbiBpbXBsZW1lbnRhdGlvbiBsYXRlci4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGUoeHNiLnJlYWRBc1hNTFN0cmVhbVJlYWRlcigpKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1SZWFkZXJFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIE1lc3NhZ2V9IHRoYXQgcmVwcmVzZW50cyBhbiBleGNlcHRpb24gYXMgYSBmYXVsdC4gVGhlCisgICAgICogY3JlYXRlZCBtZXNzYWdlIHJlZmxlY3RzIGlmIHQgb3IgdC5nZXRDYXVzZSgpIGlzIFNPQVBGYXVsdEV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIGNyZWF0ZXMgYSBmYXVsdCBtZXNzYWdlIHdpdGggZGVmYXVsdCBmYXVsdENvZGUgZW52OlNlcnZlciBpZiB0IG9yIHQuZ2V0Q2F1c2UoKQorICAgICAqIGlzIG5vdCBTT0FQRmF1bHRFeGNlcHRpb24uIE90aGVyd2lzZSwgaXQgdXNlIFNPQVBGYXVsdEV4Y2VwdGlvbidzIGZhdWx0Q29kZQorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQWx3YXlzIG5vbi1udWxsLiBBIG1lc3NhZ2UgdGhhdCB3cmFwcyB0aGlzIHtAbGluayBUaHJvd2FibGV9LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZShUaHJvd2FibGUgdCwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIFNPQVBGYXVsdEJ1aWxkZXIuY3JlYXRlU09BUEZhdWx0TWVzc2FnZShzb2FwVmVyc2lvbiwgbnVsbCwgdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZhdWx0IHtAbGluayBNZXNzYWdlfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBkZXNpZ25lZCBmb3IgZWZmaWNpZW5jeSwgYW5kIHdlIGRvbid0IGV4cGVjdAorICAgICAqIHRvIGJlIHVzZWQgZm9yIHRoZSBwZXJmb3JtYW5jZSBjcml0aWNhbCBjb2RlcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYXVsdAorICAgICAqICAgICAgVGhlIHBvcHVsYXRlZCBTQUFKIGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIGZhdWx0CisgICAgICogICAgICBpbiBkZXRhaWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBBbHdheXMgbm9uLW51bGwuIEEgbWVzc2FnZSB0aGF0IHdyYXBzIHRoaXMge0BsaW5rIFNPQVBGYXVsdH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZShTT0FQRmF1bHQgZmF1bHQpIHsKKyAgICAgICAgU09BUFZlcnNpb24gdmVyID0gU09BUFZlcnNpb24uZnJvbU5zVXJpKGZhdWx0LmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBET01NZXNzYWdlKHZlcixmYXVsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZhdWx0IHtAbGluayBNZXNzYWdlfSB0aGF0IGNhcHR1cmVzIHRoZSBjb2RlL3N1YmNvZGUvc3Vic3ViY29kZQorICAgICAqIGRlZmluZWQgYnkgV1MtQWRkcmVzc2luZyBpZiB3c2E6QWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRBY3Rpb24gVGhlIHVuc3VwcG9ydGVkIEFjdGlvbi4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gYXYgVGhlIFdTLUFkZHJlc3NpbmcgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZS4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gc3YgVGhlIFNPQVAgVmVyc2lvbiBvZiB0aGUgbWVzc2FnZS4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgU09BUEZhdWx0IHRoYXQgY29udGFpbnMgdGhlIFdTLUFkZHJlc3NpbmcgY29kZS9zdWJjb2RlL3N1YnN1YmNvZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZShATm90TnVsbCBTdHJpbmcgdW5zdXBwb3J0ZWRBY3Rpb24sIEBOb3ROdWxsIEFkZHJlc3NpbmdWZXJzaW9uIGF2LCBATm90TnVsbCBTT0FQVmVyc2lvbiBzdikgeworICAgICAgICBRTmFtZSBzdWJjb2RlID0gYXYuYWN0aW9uTm90U3VwcG9ydGVkVGFnOworICAgICAgICBTdHJpbmcgZmF1bHRzdHJpbmcgPSBTdHJpbmcuZm9ybWF0KGF2LmFjdGlvbk5vdFN1cHBvcnRlZFRleHQsIHVuc3VwcG9ydGVkQWN0aW9uKTsKKworICAgICAgICBNZXNzYWdlIGZhdWx0TWVzc2FnZTsKKyAgICAgICAgU09BUEZhdWx0IGZhdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHN2ID09IFNPQVBWZXJzaW9uLlNPQVBfMTIpIHsKKyAgICAgICAgICAgICAgICBmYXVsdCA9IFNPQVBWZXJzaW9uLlNPQVBfMTIuc2FhalNvYXBGYWN0b3J5LmNyZWF0ZUZhdWx0KCk7CisgICAgICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKFNPQVBDb25zdGFudHMuU09BUF9TRU5ERVJfRkFVTFQpOworICAgICAgICAgICAgICAgIGZhdWx0LmFwcGVuZEZhdWx0U3ViY29kZShzdWJjb2RlKTsKKyAgICAgICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gZmF1bHQuYWRkRGV0YWlsKCk7CisgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBkZXRhaWwuYWRkQ2hpbGRFbGVtZW50KGF2LnByb2JsZW1BY3Rpb25UYWcpOworICAgICAgICAgICAgICAgIHNlID0gc2UuYWRkQ2hpbGRFbGVtZW50KGF2LmFjdGlvblRhZyk7CisgICAgICAgICAgICAgICAgc2UuYWRkVGV4dE5vZGUodW5zdXBwb3J0ZWRBY3Rpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYXVsdCA9IFNPQVBWZXJzaW9uLlNPQVBfMTEuc2FhalNvYXBGYWN0b3J5LmNyZWF0ZUZhdWx0KCk7CisgICAgICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKHN1YmNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcoZmF1bHRzdHJpbmcpOworCisgICAgICAgICAgICBmYXVsdE1lc3NhZ2UgPSBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2Uoc3YsIGZhdWx0KTsKKyAgICAgICAgICAgIGlmIChzdiA9PSBTT0FQVmVyc2lvbi5TT0FQXzExKSB7CisgICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLmdldEhlYWRlcnMoKS5hZGQobmV3IFByb2JsZW1BY3Rpb25IZWFkZXIodW5zdXBwb3J0ZWRBY3Rpb24sIGF2KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmF1bHRNZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIGNhbGxlZCB0byBjb252ZXJ0IGEgIHtAbGluayBQcm90b2NvbEV4Y2VwdGlvbn0gYW5kIGZhdWx0Y29kZSBmb3IgYSBnaXZlbiB7QGxpbmsgU09BUFZlcnNpb259IGluIHRvIGEge0BsaW5rIE1lc3NhZ2V9LgorICAgICAqCisgICAgICogQHBhcmFtIHNvYXBWZXJzaW9uIHtAbGluayBTT0FQVmVyc2lvbiNTT0FQXzExfSBvciB7QGxpbmsgU09BUFZlcnNpb24jU09BUF8xMn0KKyAgICAgKiBAcGFyYW0gcGV4IGEgUHJvdG9jb2xFeGNlcHRpb24KKyAgICAgKiBAcGFyYW0gZmF1bHRjb2RlIHNvYXAgZmF1bHRjb2RlLiBJdHMgaWdub3JlZCBpZiB0aGUge0BsaW5rIFByb3RvY29sRXhjZXB0aW9ufSBpbnN0YW5jZSBpcyB7QGxpbmsgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9ufSBhbmQgaXQgaGFzIGEKKyAgICAgKiBmYXVsdGNvZGUgcHJlc2VudCBpbiB0aGUgdW5kZXJseWluZyB7QGxpbmsgU09BUEZhdWx0fS4KKyAgICAgKiBAcmV0dXJuIHtAbGluayBNZXNzYWdlfSByZXByZXNlbnRpbmcgU09BUCBmYXVsdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQE5vdE51bGwgTWVzc2FnZSBjcmVhdGUoQE5vdE51bGwgU09BUFZlcnNpb24gc29hcFZlcnNpb24sIEBOb3ROdWxsIFByb3RvY29sRXhjZXB0aW9uIHBleCwgQE51bGxhYmxlIFFOYW1lIGZhdWx0Y29kZSl7CisgICAgICAgIHJldHVybiBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2Uoc29hcFZlcnNpb24sIHBleCwgZmF1bHRjb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9QYWNrZXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL1BhY2tldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOWRkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9QYWNrZXQuamF2YQpAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5tYXJzaGFsbGVyLlNBWDJET01FeDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLldzYVR1YmVIZWxwZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5tb2RlbC5JbnZhbGlkTWFwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5EaXN0cmlidXRlZFByb3BlcnR5U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlByb3BlcnR5U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuU0VJTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlRyYW5zcG9ydEJhY2tDaGFubmVsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuV1NFbmRwb2ludDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkNvbnRlbnROZWdvdGlhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuSGFuZGxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuSkFYV1NQcm9wZXJ0aWVzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuUmVsYXRlc1RvSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuU3RyaW5nSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuRE9NVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkphdmFNZXRob2RJbXBsOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGNvbnRhaW5lciBvZiBhIHtAbGluayBNZXNzYWdlfS4KKyAqCisgKiA8aDI+V2hhdCBpcyBhIHtAbGluayBQYWNrZXR9PzwvaDI+CisgKiA8cD4KKyAqIEEgcGFja2V0IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgZnJhbWUvZW52ZWxvcGUvcGFja2FnZSB0aGF0IHdyYXBzCisgKiBhIHtAbGluayBNZXNzYWdlfS4gQSBwYWNrZXQga2VlcHMgdHJhY2sgb2Ygb3B0aW9uYWwgbWV0YWRhdGEgKHByb3BlcnRpZXMpCisgKiBhYm91dCBhIHtAbGluayBNZXNzYWdlfSB0aGF0IGRvZXNuJ3QgZ28gYWNyb3NzIHRoZSB3aXJlLgorICogVGhpcyByb3VnaGx5IGNvcnJlc3BvbmRzIHRvIHtAbGluayBNZXNzYWdlQ29udGV4dH0gaW4gdGhlIEpBWC1XUyBBUEkuCisgKgorICogPHA+CisgKiBVc3VhbGx5IGEgcGFja2V0IGNvbnRhaW5zIGEge0BsaW5rIE1lc3NhZ2V9IGluIGl0LCBidXQgc29tZXRpbWVzCisgKiAoc3VjaCBhcyBmb3IgYSByZXBseSBvZiBhbiBvbmUtd2F5IG9wZXJhdGlvbiksIGEgcGFja2V0IG1heQorICogZmxvYXQgYXJvdW5kIHdpdGhvdXQgYSB7QGxpbmsgTWVzc2FnZX0gaW4gaXQuCisgKgorICoKKyAqIDxhIG5hbWU9InByb3BlcnRpZXMiPjwvYT4KKyAqIDxoMj5Qcm9wZXJ0aWVzPC9oMj4KKyAqIDxwPgorICogSW5mb3JtYXRpb24gZnJlcXVlbnRseSB1c2VkIGluc2lkZSB0aGUgSkFYLVdTIFJJCisgKiBpcyBzdG9yZWQgaW4gdGhlIHN0cm9uZ2x5LXR5cGVkIGZpZWxkcy4gT3RoZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkCisgKiBpbiB0ZXJtcyBvZiBhIGdlbmVyaWMge0BsaW5rIE1hcH0gKHNlZQorICoge0BsaW5rICNpbnZvY2F0aW9uUHJvcGVydGllc30uKQorICoKKyAqIDxwPgorICogU29tZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgcmV0YWluZWQgYmV0d2VlbiByZXF1ZXN0IGFuZCByZXNwb25zZSwKKyAqIHNvbWUgZG9uJ3QuIEZvciBzdHJvbmdseSB0eXBlZCBmaWVsZHMsIHRoaXMgY2hhcmFjdGVyaXN0aWMgaXMKKyAqIHN0YXRpY2FsbHkga25vd24gZm9yIGVhY2ggb2YgdGhlbSwgYW5kIHByb3BhZ2F0aW9uIGhhcHBlbnMgYWNjb3JkaW5nbHkuCisgKiBGb3IgZ2VuZXJpYyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4ge0BsaW5rIE1hcH0sIHtAbGluayAjaW52b2NhdGlvblByb3BlcnRpZXN9CisgKiBzdG9yZXMgcGVyLWludm9jYXRpb24gc2NvcGUgaW5mb3JtYXRpb24gKHdoaWNoIGNhcnJpZXMgb3ZlciB0bworICogdGhlIHJlc3BvbnNlLikKKyAqCisgKiA8cD4KKyAqIFRoaXMgb2JqZWN0IGlzIHVzZWQgYXMgdGhlIGJhY2tpbmcgc3RvcmUgb2Yge0BsaW5rIE1lc3NhZ2VDb250ZXh0fSwgYW5kCisgKiB7QGxpbmsgTG9naWNhbE1lc3NhZ2VDb250ZXh0fSBhbmQge0BsaW5rIFNPQVBNZXNzYWdlQ29udGV4dH0gd2lsbAorICogYmUgZGVsZWdhdGluZyB0byB0aGlzIG9iamVjdCBmb3Igc3RvcmluZy9yZXRyaWV2aW5nIHZhbHVlcy4KKyAqCisgKgorICogPGgzPlJlbGF0aW9uc2hpcCB0byByZXF1ZXN0L3Jlc3BvbnNlIGNvbnRleHQ8L2gzPgorICogPHA+CisgKiB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyI2dldFJlcXVlc3RDb250ZXh0KCkgUmVxdWVzdCBjb250ZXh0fSBpcyB1c2VkIHRvCisgKiBzZWVkIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB7QGxpbmsgUGFja2V0fS4KKyAqIFNvbWUgb2YgdGhvc2UgdmFsdWVzIGdvIHRvIHN0cm9uZ2x5LXR5cGVkIGZpZWxkcywgYW5kIG90aGVycyBnbyB0bworICoge0BsaW5rICNpbnZvY2F0aW9uUHJvcGVydGllc30sIGFzIHRoZXkgbmVlZCB0byBiZSByZXRhaW5lZCBpbiB0aGUgcmVwbHkgbWVzc2FnZS4KKyAqCisgKiA8cD4KKyAqIFNpbWlsYXJseSwge0BsaW5rIEJpbmRpbmdQcm92aWRlciNnZXRSZXNwb25zZUNvbnRleHQoKSByZXNwb25zZSBjb250ZXh0fQorICogaXMgY29uc3RydWN0ZWQgZnJvbSB7QGxpbmsgUGFja2V0fSAob3IgcmF0aGVyIGl0J3MganVzdCBhIHZpZXcgb2Yge0BsaW5rIFBhY2tldH0uKQorICogYnkgdXNpbmcgcHJvcGVydGllcyBmcm9tIHtAbGluayAjaW52b2NhdGlvblByb3BlcnRpZXN9LAorICogbW9kdWxvIHByb3BlcnRpZXMgbmFtZWQgZXhwbGljaXRseSBpbiB7QGxpbmsgI2dldEhhbmRsZXJTY29wZVByb3BlcnR5TmFtZXMoYm9vbGVhbil9LgorICogSU9XLCBwcm9wZXJ0aWVzIGFkZGVkIHRvIHtAbGluayAjaW52b2NhdGlvblByb3BlcnRpZXN9CisgKiBhcmUgZXhwb3NlZCB0byB0aGUgcmVzcG9uc2UgY29udGV4dCBieSBkZWZhdWx0LgorICoKKyAqCisgKgorICogPGgzPlRPRE88L2gzPgorICogPG9sPgorICogIDxsaT50aGlzIGNsYXNzIG5lZWRzIHRvIGJlIGNsb25lYWJsZSBzaW5jZSBNZXNzYWdlIGlzIGNvcGlhYmxlLgorICogIDxsaT5UaGUgdGhyZWUgbGl2ZSB2aWV3cyBhcmVuJ3QgaW1wbGVtZW50ZWQgY29ycmVjdGx5LiBJdCB3aWxsIGJlCisgKiAgICAgIG1vcmUgd29yayB0byBkbyBzbywgYWx0aG91Z2ggSSdtIHN1cmUgaXQncyBwb3NzaWJsZS4KKyAqICA8bGk+e0BsaW5rIFByb3BlcnR5fSBhbm5vdGF0aW9uIGlzIHRvIG1ha2UgaXQgZWFzeQorICogICAgICBmb3Ige0BsaW5rIE1lc3NhZ2VDb250ZXh0fSB0byBleHBvcnQgcHJvcGVydGllcyBvbiB0aGlzIG9iamVjdCwKKyAqICAgICAgYnV0IGl0IHByb2JhYmx5IG5lZWRzIHNvbWUgY2xlYW4gdXAuCisgKiA8L29sPgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhY2tldCBleHRlbmRzIERpc3RyaWJ1dGVkUHJvcGVydHlTZXQgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBQYWNrZXR9IHRoYXQgd3JhcHMgYSBnaXZlbiB7QGxpbmsgTWVzc2FnZX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb25seSB1c2VkIHRvIGNyZWF0ZSBhIGZyZXNoIHtAbGluayBQYWNrZXR9LgorICAgICAqIFRvIGNyZWF0ZSBhIHtAbGluayBQYWNrZXR9IGZvciBhIHJlcGx5LCB1c2Uge0BsaW5rICNjcmVhdGVSZXNwb25zZShNZXNzYWdlKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqICAgICAgVGhlIHJlcXVlc3Qge0BsaW5rIE1lc3NhZ2V9LiBDYW4gYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFja2V0KE1lc3NhZ2UgcmVxdWVzdCkgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IHJlcXVlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbXB0eSB7QGxpbmsgUGFja2V0fSB0aGF0IGRvZXNuJ3QgaGF2ZSBhbnkge0BsaW5rIE1lc3NhZ2V9LgorICAgICAqLworICAgIHB1YmxpYyBQYWNrZXQoKSB7CisgICAgICAgIHRoaXMuaW52b2NhdGlvblByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkge0BsaW5rICNjcmVhdGVSZXNwb25zZShNZXNzYWdlKX0uCisgICAgICovCisgICAgcHJpdmF0ZSBQYWNrZXQoUGFja2V0IHRoYXQpIHsKKyAgICAgICAgdGhhdC5jb3B5U2F0ZWxsaXRlSW50byh0aGlzKTsKKyAgICAgICAgdGhpcy5oYW5kbGVyQ29uZmlnID0gdGhhdC5oYW5kbGVyQ29uZmlnOworICAgICAgICB0aGlzLmludm9jYXRpb25Qcm9wZXJ0aWVzID0gdGhhdC5pbnZvY2F0aW9uUHJvcGVydGllczsKKyAgICAgICAgdGhpcy5oYW5kbGVyU2NvcGVQcm9wZXJ0eU5hbWVzID0gdGhhdC5oYW5kbGVyU2NvcGVQcm9wZXJ0eU5hbWVzOworICAgICAgICB0aGlzLmNvbnRlbnROZWdvdGlhdGlvbiA9IHRoYXQuY29udGVudE5lZ290aWF0aW9uOworICAgICAgICB0aGlzLndhc1RyYW5zcG9ydFNlY3VyZSA9IHRoYXQud2FzVHJhbnNwb3J0U2VjdXJlOworICAgICAgICAvLyBjb3B5IG90aGVyIHByb3BlcnRpZXMgdGhhdCBuZWVkIHRvIGJlIGNvcGllZC4gaXMgdGhlcmUgYW55PworICAgIH0KKworICAgIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGFzdCB7QGxpbmsgTWVzc2FnZX0gc2V0IHRocm91Z2gge0BsaW5rICNzZXRNZXNzYWdlKE1lc3NhZ2UpfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG1heSBudWxsLiBTZWUgdGhlIGNsYXNzIGphdmFkb2MgZm9yIHdoZW4gaXQncyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSB7QGxpbmsgTWVzc2FnZX0gdG8gdGhpcyBwYWNrZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgbWVzc2FnZSBjYW1lIGZyb20gYSB0cmFuc3BvcnQgKElPVyBpbmJvdW5kKSwKKyAgICAgKiBhbmQgaW4gcGFyaWN1bGFyIGZyb20gYSAic2VjdXJlIiB0cmFuc3BvcnQuIEEgdHJhbnNwb3J0CisgICAgICogbmVlZHMgdG8gc2V0IHRoaXMgZmxhZyBhcHByb3ByaWF0ZWx5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBhIHJlcXVpcmVtZW50IGZyb20gdGhlIHNlY3VyaXR5IHRlYW0uCisgICAgICovCisgICAgLy8gVE9ETzogZXhwb3NlIHRoaXMgYXMgYSBwcm9wZXJ0eQorICAgIHB1YmxpYyBib29sZWFuIHdhc1RyYW5zcG9ydFNlY3VyZTsKKworICAgIC8qKgorICAgICAqIEluYm91bmQgdHJhbnNwb3J0IGhlYWRlcnMgYXJlIGNhcHR1cmVkIGluIGEgdHJhbnNwb3J0IG5ldXRyYWwgd2F5LgorICAgICAqIFRyYW5zcG9ydHMgYXJlIGV4cGVjdGVkIHRvIGZpbGwgdGhpcyBkYXRhIGFmdGVyIGNyZWF0aW5nIGEgUGFja2V0LgorICAgICAqIDxwPgorICAgICAqIHtAbGluayBTT0FQTWVzc2FnZSNnZXRNaW1lSGVhZGVycygpfSB3b3VsZCByZXR1cm4gdGhlc2UgaGVhZGVycy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQk9VTkRfVFJBTlNQT1JUX0hFQURFUlMgPSAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UucGFja2V0LmluYm91bmQudHJhbnNwb3J0LmhlYWRlcnMiOworCisgICAgLyoqCisgICAgICogT3V0Ym91bmQgdHJhbnNwb3J0IGhlYWRlcnMgYXJlIGNhcHR1cmVkIGluIGEgdHJhbnNwb3J0IG5ldXRyYWwgd2F5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVHJhbnNwb3J0cyBtYXkgY2hvb3NlIHRvIGlnbm9yZSBjZXJ0YWluIGhlYWRlcnMgdGhhdCBpbnRlcmZlcmUgd2l0aAorICAgICAqIGl0cyBjb3JyZWN0IG9wZXJhdGlvbiwgc3VjaCBhcworICAgICAqIDx0dD5Db250ZW50LVR5cGU8L3R0PiBhbmQgPHR0PkNvbnRlbnQtTGVuZ3RoPC90dD4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUQk9VTkRfVFJBTlNQT1JUX0hFQURFUlMgPSAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UucGFja2V0Lm91dGJvdW5kLnRyYW5zcG9ydC5oZWFkZXJzIjsKKworCisgICAgLyoqCisgICAgICogVGhpcyBwcm9wZXJ0eSBob2xkcyB0aGUgc25hcHNob3Qgb2YgSGFuZGxlckNvbmZpZ3VyYXRpb24KKyAgICAgKiBhdCB0aGUgdGltZSBvZiBpbnZvY2F0aW9uLgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBNVVBpcGUgYW5kIEhhbmRsZXJQaXBlIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKi8KKyAgICBAUHJvcGVydHkoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19IQU5ETEVSX0NPTkZJRykKKyAgICBwdWJsaWMgSGFuZGxlckNvbmZpZ3VyYXRpb24gaGFuZGxlckNvbmZpZzsKKworICAgIC8qKgorICAgICAqIElmIGEgbWVzc2FnZSBvcmlnaW5hdGVzIGZyb20gYSBwcm94eSBzdHViIHRoYXQgaW1wbGVtZW50cworICAgICAqIGEgcG9ydCBpbnRlcmZhY2UsIHRoaXMgZmllbGQgaXMgc2V0IHRvIHBvaW50IHRvIHRoYXQgb2JqZWN0LgorICAgICAqCisgICAgICogVE9ETzogd2hvJ3MgdXNpbmcgdGhpcyBwcm9wZXJ0eT8KKyAgICAgKi8KKyAgICBAUHJvcGVydHkoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DTElFTlRfSEFORExFX1BST1BFUlRZKQorICAgIHB1YmxpYyBCaW5kaW5nUHJvdmlkZXIgcHJveHk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5kcG9pbnQgYWRkcmVzcyB0byB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgc2VudCB0by4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBKQVgtV1Mgc3BlYyBhbGxvd3MgdGhpcyB0byBiZSBjaGFuZ2VkIGZvciBlYWNoIG1lc3NhZ2UsCisgICAgICogc28gaXQncyBkZXNpZ25lZCB0byBiZSBhIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogTXVzdCBub3QgYmUgbnVsbCBmb3IgYSByZXF1ZXN0IG1lc3NhZ2Ugb24gdGhlIGNsaWVudC4gT3RoZXJ3aXNlCisgICAgICogaXQncyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBFbmRwb2ludEFkZHJlc3MgZW5kcG9pbnRBZGRyZXNzOworCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFRoZSBwcm9ncmFtYXRpYyBhY2NjZXNzIHNob3VsZCBiZSBkb25lIHZpYQorICAgICAqICAgICAge0BsaW5rICNlbmRwb2ludEFkZHJlc3N9LiBUaGlzIGlzIGZvciBKQVgtV1MgY2xpZW50IGFwcGxpY2F0aW9ucworICAgICAqICAgICAgdGhhdCBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSB2aWEge0BsaW5rIEJpbmRpbmdQcm92aWRlciNFTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZfS4KKyAgICAgKi8KKyAgICBAUHJvcGVydHkoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpCisgICAgcHVibGljIFN0cmluZyBnZXRFbmRQb2ludEFkZHJlc3NTdHJpbmcoKSB7CisgICAgICAgIGlmKGVuZHBvaW50QWRkcmVzcz09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZW5kcG9pbnRBZGRyZXNzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW5kUG9pbnRBZGRyZXNzU3RyaW5nKFN0cmluZyBzKSB7CisgICAgICAgIGlmKHM9PW51bGwpCisgICAgICAgICAgICB0aGlzLmVuZHBvaW50QWRkcmVzcyA9IG51bGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuZW5kcG9pbnRBZGRyZXNzID0gRW5kcG9pbnRBZGRyZXNzLmNyZWF0ZShzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2Yge0BsaW5rIENvbnRlbnROZWdvdGlhdGlvbiNQUk9QRVJUWX0KKyAgICAgKiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBvbmx5IG9uIHRoZSBjbGllbnQgc2lkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGVudE5lZ290aWF0aW9uIGNvbnRlbnROZWdvdGlhdGlvbjsKKworICAgIEBQcm9wZXJ0eShDb250ZW50TmVnb3RpYXRpb24uUFJPUEVSVFkpCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50TmVnb3RpYXRpb25TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAoY29udGVudE5lZ290aWF0aW9uICE9IG51bGwpID8gY29udGVudE5lZ290aWF0aW9uLnRvU3RyaW5nKCkgOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnROZWdvdGlhdGlvblN0cmluZyhTdHJpbmcgcykgeworICAgICAgICBpZihzPT1udWxsKQorICAgICAgICAgICAgY29udGVudE5lZ290aWF0aW9uID0gbnVsbDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnRlbnROZWdvdGlhdGlvbiA9IENvbnRlbnROZWdvdGlhdGlvbi52YWx1ZU9mKHMpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IHJlY29nbml6ZWQgZGVmYXVsdCB0byBub25lCisgICAgICAgICAgICAgICAgY29udGVudE5lZ290aWF0aW9uID0gQ29udGVudE5lZ290aWF0aW9uLm5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyBhIGxpc3Qgb2YgUmVmZXJlbmNlIFBhcmFtZXRlcnMgaW4gdGhlIE1lc3NhZ2UKKyAgICAgKiA8cD4KKyAgICAgKiBIZWFkZXJzIHdoaWNoIGhhdmUgYXR0cmlidXRlIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0idHJ1ZSIKKyAgICAgKiBUaGlzIGlzIG5vdCBjYWNoZWQgYXMgb25lIG1heSByZXNldCB0aGUgTWVzc2FnZS4KKyAgICAgKjxwPgorICAgICAqLworICAgIEBQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5SRUZFUkVOQ0VfUEFSQU1FVEVSUykKKyAgICBwdWJsaWMgQE5vdE51bGwgTGlzdDxFbGVtZW50PiBnZXRSZWZlcmVuY2VQYXJhbWV0ZXJzKCkgeworICAgICAgICBMaXN0PEVsZW1lbnQ+IHJlZlBhcmFtcyA9ICBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KCk7CisgICAgICAgIEhlYWRlckxpc3QgaGwgPSBtZXNzYWdlLmdldEhlYWRlcnMoKTsKKyAgICAgICAgZm9yKEhlYWRlciBoIDpobCkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSBoLmdldEF0dHJpYnV0ZShBZGRyZXNzaW5nVmVyc2lvbi5XM0MubnNVcmksIklzUmVmZXJlbmNlUGFyYW1ldGVyIik7CisgICAgICAgICAgICBpZihhdHRyIT1udWxsICYmIChhdHRyLmVxdWFscygidHJ1ZSIpIHx8IGF0dHIuZXF1YWxzKCIxIikpKSB7CisgICAgICAgICAgICAgICAgRG9jdW1lbnQgZCA9IERPTVV0aWwuY3JlYXRlRG9tKCk7CisgICAgICAgICAgICAgICAgU0FYMkRPTUV4IHMyZCA9IG5ldyBTQVgyRE9NRXgoZCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaC53cml0ZVRvKHMyZCwgWG1sVXRpbC5EUkFDT05JQU5fRVJST1JfSEFORExFUik7CisgICAgICAgICAgICAgICAgICAgIHJlZlBhcmFtcy5hZGQoKEVsZW1lbnQpIGQuZ2V0TGFzdENoaWxkKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIERPTVJlc3VsdCByZXN1bHQgPSBuZXcgRE9NUmVzdWx0KGQpOworICAgICAgICAgICAgICAgIFhNTERPTVdyaXRlckltcGwgZG9td3JpdGVyID0gbmV3IFhNTERPTVdyaXRlckltcGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBoLndyaXRlVG8oZG9td3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmUGFyYW1zLmFkZCgoRWxlbWVudCkgcmVzdWx0LmdldE5vZGUoKS5nZXRMYXN0Q2hpbGQoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlZlBhcmFtczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVGhpcyBtZXRob2QgaXMgZm9yIGV4cG9zaW5nIGhlYWRlciBsaXN0IHRocm91Z2gge0BsaW5rIFByb3BlcnR5U2V0I2dldChPYmplY3QpfSwKKyAgICAgKiAgICAgIGZvciB1c2VyIGFwcGxpY2F0aW9ucywgYW5kIHNob3VsZCBuZXZlciBiZSBpbnZva2VkIGRpcmVjdGx5IGZyb20gd2l0aGluIHRoZSBKQVgtV1MgUkkuCisgICAgICovCisgICAgQFByb3BlcnR5KEpBWFdTUHJvcGVydGllcy5JTkJPVU5EX0hFQURFUl9MSVNUX1BST1BFUlRZKQorICAgIC8qcGFja2FnZSovIEhlYWRlckxpc3QgZ2V0SGVhZGVyTGlzdCgpIHsKKyAgICAgICAgaWYobWVzc2FnZT09bnVsbCkgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0SGVhZGVycygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIE1JTUUgdHlwZXMgdGhhdCBhcmUgYWNjZXB0YWJsZSB0byBhIHJlY2VpdmVyCisgICAgICogb2YgYW4gb3V0Ym91bmQgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBvbmx5IG9uIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICAgKgorICAgICAqIDxwPlRoZSByZXByZXNlbnRhdGlvbiBzaGFsbCBiZSB0aGF0IHNwZWNpZmllZCBieSB0aGUgSFRUUCBBY2NlcHQKKyAgICAgKiByZXF1ZXN0LWhlYWRlciBmaWVsZC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBsaXN0IG9mIGNvbnRlbnQgdHlwZXMgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRoZSB0cmFuc3BvcnQKKyAgICAgKiBtZXRhLWRhdGEgb2YgYSBpbmJvdW5kIG1lc3NhZ2UgaW4gYSByZXF1ZXN0L3Jlc3BvbnNlIG1lc3NhZ2UgZXhjaGFuZ2UuCisgICAgICogSGVuY2UgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHNldCBieSB0aGUgc2VydmljZS1zaWRlIHRyYW5zcG9ydCBwaXBlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhY2NlcHRhYmxlTWltZVR5cGVzOworCisgICAgLyoqCisgICAgICogV2hlbiBub24tbnVsbCwgdGhpcyBvYmplY3QgaXMgY29uc3VsdGVkIHRvCisgICAgICogaW1wbGVtZW50IHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0gbWV0aG9kcworICAgICAqIGV4cG9zZWQgdG8gdGhlIHVzZXIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBVc2VkIG9ubHkgb24gdGhlIHNlcnZlciBzaWRlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBwcm9wZXJ0eSBpcyBzZXQgZnJvbSB0aGUgcGFyYW1ldGVyCisgICAgICogb2Yge0BsaW5rIFdTRW5kcG9pbnQuUGlwZUhlYWQjcHJvY2Vzc30uCisgICAgICovCisgICAgcHVibGljIFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUgd2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgb25seSBvbiB0aGUgc2VydmVyIHNpZGUgc28gdGhhdCB0aGUgdHJhbnNwb3J0CisgICAgICogY2FuIGNsb3NlIHRoZSBjb25uZWN0aW9uIGVhcmx5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBmaWVsZCBjYW4gYmUgbnVsbC4gV2hpbGUgYSBtZXNzYWdlIGlzIGJlaW5nIHByb2Nlc3NlZCwKKyAgICAgKiB0aGlzIGZpZWxkIGNhbiBiZSBzZXQgZXhwbGljaXRseSB0byBudWxsLCB0byBwcmV2ZW50CisgICAgICogZnV0dXJlIHBpcGVzIGZyb20gY2xvc2luZyBhIHRyYW5zcG9ydC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgc2V0IGZyb20gdGhlIHBhcmFtZXRlcgorICAgICAqIG9mIHtAbGluayBXU0VuZHBvaW50LlBpcGVIZWFkI3Byb2Nlc3N9LgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgVHJhbnNwb3J0QmFja0NoYW5uZWwgdHJhbnNwb3J0QmFja0NoYW5uZWw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ292ZXJuaW5nIHtAbGluayBXU0VuZHBvaW50fSBpbiB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgZmxvYXRpbmcuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHNldCBpZiBhbmQgb25seSBpZiB0aGlzIGlzIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgV1NFbmRwb2ludCBlbmRwb2ludDsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgU09BUEFjdGlvbiBoZWFkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIG91dGdvaW5nIG1lc3NhZ2VzLCB0aGUgdHJhbnNwb3J0IG1heSBzZW5kcyBvdXQgdGhpcyB2YWx1ZS4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIG51bGwsIHRoZSB0cmFuc3BvcnQgbWF5IGNob29zZSB0byBzZW5kIDx0dD4iIjwvdHQ+CisgICAgICogKHF1b3RlZCBlbXB0eSBzdHJpbmcuKQorICAgICAqCisgICAgICogRm9yIGluY29taW5nIG1lc3NhZ2VzLCB0aGUgdHJhbnNwb3J0IHdpbGwgc2V0IHRoaXMgZmllbGQuCisgICAgICogSWYgdGhlIGluY29taW5nIG1lc3NhZ2UgZGlkIG5vdCBjb250YWluIHRoZSBTT0FQQWN0aW9uIGhlYWRlciwKKyAgICAgKiB0aGUgdHJhbnNwb3J0IHNldHMgdGhpcyBmaWVsZCB0byBudWxsLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHZhbHVlIGlzIG5vbi1udWxsLCBpdCBtdXN0IGJlIGFsd2F5cyBpbiB0aGUgcXVvdGVkIGZvcm0uCisgICAgICogVGhlIHZhbHVlIGNhbiBiZSBudWxsLgorICAgICAqCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoZSB3YXkgdGhlIHRyYW5zcG9ydCBzZW5kcyB0aGlzIHZhbHVlIG91dCBkZXBlbmRzIG9uCisgICAgICogdHJhbnNwb3J0IGFuZCBTT0FQIHZlcnNpb24uCisgICAgICoKKyAgICAgKiBGb3IgSFRUUCB0cmFuc3BvcnQgYW5kIFNPQVAgMS4xLCBCUCByZXF1aXJlcyB0aGF0IFNPQVBBY3Rpb24KKyAgICAgKiBoZWFkZXIgaXMgcHJlc2VudCAoU2VlIHtAQlAgUjI3NDR9IGFuZCB7QEJQIFIyNzQ1fS4pIEZvciBTT0FQIDEuMiwKKyAgICAgKiB0aGlzIGlzIG1vdmVkIHRvIHRoZSBwYXJhbWV0ZXIgb2YgdGhlICJhcHBsaWNhdGlvbi9zb2FwK3htbCIuCisgICAgICovCisgICAgQFByb3BlcnR5KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSkKKyAgICBwdWJsaWMgU3RyaW5nIHNvYXBBY3Rpb247CisKKyAgICAvKioKKyAgICAgKiBBIGhpbnQgaW5kaWNhdGluZyB0aGF0IHdoZXRoZXIgYSB0cmFuc3BvcnQgc2hvdWxkIGV4cGVjdAorICAgICAqIGEgcmVwbHkgYmFjayBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgb24gdGhlIGNsaWVudC1zaWRlIGZvcgorICAgICAqIG91dGJvdW5kIG1lc3NhZ2VzLCBzbyB0aGF0IGEgcGlwZWxpbmUKKyAgICAgKiBjYW4gY29tbXVuaWNhdGUgdG8gdGhlIHRlcm1pbmFsIChvciBpbnRlcm1lZGlhdGUpIHtAbGluayBUdWJlfXMKKyAgICAgKiBhYm91dCB0aGlzIGtub3dsZWRnZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgPGI+TVVTVCBOT1Q8L2I+IGJlIHVzZWQgYnkgMi13YXkgdHJhbnNwb3J0cworICAgICAqIHRoYXQgaGF2ZSB0aGUgdHJhbnNwb3J0IGJhY2sgY2hhbm5lbC4gVGhvc2UgdHJhbnNwb3J0cworICAgICAqIG11c3QgYWx3YXlzIGNoZWNrIGEgcmVwbHkgY29taW5nIHRocm91Z2ggdGhlIHRyYW5zcG9ydCBiYWNrCisgICAgICogY2hhbm5lbCByZWdhcmRsZXNzIG9mIHRoaXMgdmFsdWUsIGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgICogKFRoaXMgaXMgYmVjYXVzZSB0aGUgZXhwZWN0YXRpb24gb2YgdGhlIGNsaWVudCBhbmQKKyAgICAgKiB0aGF0IG9mIHRoZSBzZXJ2ZXIgY2FuIGJlIGRpZmZlcmVudCwgZm9yIGV4YW1wbGUgYmVjYXVzZQorICAgICAqIG9mIGEgYnVnIGluIHVzZXIncyBjb25maWd1cmF0aW9uLikKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgZm9yIG9uZS13YXkgdHJhbnNwb3J0cywgYW5kIG1vcmUKKyAgICAgKiBzcGVjaWZpY2FsbHkgZm9yIHRoZSBjb29yZGluYXRvciB0aGF0IGNvcnJlbGF0ZXMgc2VudCByZXF1ZXN0cworICAgICAqIGFuZCBpbmNvbWluZyByZXBsaWVzLCB0byBkZWNpZGUgd2hldGhlciB0byBibG9jaworICAgICAqIHVudGlsIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBbHNvIG5vdGUgdGhhdCB0aGlzIHByb3BlcnR5IGlzIHJlbGF0ZWQgdG8KKyAgICAgKiB7QGxpbmsgV1NETE9wZXJhdGlvbiNpc09uZVdheSgpfSBidXQgbm90IHRoZSBzYW1lIHRoaW5nLgorICAgICAqIEluIGZhY3QgaW4gZ2VuZXJhbCwgdGhleSBhcmUgY29tcGxldGVseSBvcnRob2dvbmFsLgorICAgICAqCisgICAgICogRm9yIGV4YW1wbGUsIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIGNhbiBjaG9vc2UgdG8gaW52b2tlCisgICAgICoge0BsaW5rIERpc3BhdGNoI2ludm9rZShPYmplY3QpfSBvciB7QGxpbmsgRGlzcGF0Y2gjaW52b2tlT25lV2F5KE9iamVjdCl9CisgICAgICogd2l0aCBhbiBvcGVyYXRpb24gKHdoaWNoIGRldGVybWluZXMgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkpLAorICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBXU0RMIGFjdHVhbGx5IHNheXMgaXQncyBvbmUgd2F5IG9yIG5vdC4KKyAgICAgKiBTbyB0aGVzZSB0d28gYm9vbGVhbnMgY2FuIHRha2UgYW55IGNvbWJpbmF0aW9ucy4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHtAbGluayBCb29sZWFuI1RSVUV9LCBpdCBtZWFucyB0aGF0CisgICAgICogdGhlIHBpcGVsaW5lIGRvZXMgbm90IGV4cGVjdCBhIHJlcGx5IGZyb20gYSBzZXJ2ZXIgKGFuZCB0aGVyZWZvcmUKKyAgICAgKiB0aGUgY29ycmVsYXRvciBzaG91bGQgbm90IGJsb2NrIGZvciBhIHJlcGx5IG1lc3NhZ2UKKyAgICAgKiAtLSBpZiBzdWNoIGEgcmVwbHkgZG9lcyBhcnJpdmUsIGl0IGNhbiBiZSBqdXN0IGlnbm9yZWQuKQorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHtAbGluayBCb29sZWFuI0ZBTFNFfSwgaXQgbWVhbnMgdGhhdAorICAgICAqIHRoZSBwaXBlbGluZSBleHBlY3RzIGEgcmVwbHkgZnJvbSBhIHNlcnZlciAoYW5kIHRoZXJlZm9yZQorICAgICAqIHRoZSBjb3JyZWxhdG9yIHNob3VsZCBibG9jayB0byBzZWUgaWYgYSByZXBseSBtZXNzYWdlIGlzIHJlY2VpdmVkLAorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHdheXMgc2V0IHRvIHtAbGluayBCb29sZWFuI1RSVUV9IG9yCisgICAgICoge0BsaW5rIEJvb2xlYW4jRkFMU0V9IHdoZW4gdXNlZCBvbiB0aGUgcmVxdWVzdCBtZXNzYWdlCisgICAgICogb24gdGhlIGNsaWVudCBzaWRlLgorICAgICAqIE5vIG90aGVyIHtAbGluayBCb29sZWFufSBpbnN0YW5jZXMgYXJlIGFsbG93ZWQuCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBJbiBhbGwgb3RoZXIgc2l0dWF0aW9ucywgdGhpcyBwcm9wZXJ0eSBpcyBudWxsLgorICAgICAqCisgICAgICovCisgICAgQFByb3BlcnR5KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuT05FX1dBWV9PUEVSQVRJT04pCisgICAgcHVibGljIEJvb2xlYW4gZXhwZWN0UmVwbHk7CisKKworICAgIC8qKgorICAgICAqIFRoaXMgcHJvcGVydHkgd2lsbCBiZSByZW1vdmVkIGluIGEgbmVhciBmdXR1cmUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIHBhcnQgb2Ygd2hhdCB0aGlzIGZsYWcgcmVwcmVzZW50ZWQgbW92ZWQgdG8KKyAgICAgKiB7QGxpbmsgI2V4cGVjdFJlcGx5fSBhbmQgdGhlIG90aGVyIHBhcnQgd2FzIG1vdmVkCisgICAgICogdG8ge0BsaW5rIE1lc3NhZ2UjaXNPbmVXYXkoV1NETFBvcnQpfS4gUGxlYXNlIHVwZGF0ZQorICAgICAqIHlvdXIgY29kZSBzb29uLCBvciByaXNrIGJyZWFraW5nIHlvdXIgYnVpbGQhIQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEJvb2xlYW4gaXNPbmVXYXk7CisKKyAgICAvKioKKyAgICAgKiBMYXppbHkgY3JlYXRlZCBzZXQgb2YgaGFuZGxlci1zY29wZSBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdlIGV4cGVjdCB0aGF0IHRoaXMgaXMgb25seSB1c2VkIHdoZW4gaGFuZGxlcnMgYXJlIHByZXNlbnQKKyAgICAgKiBhbmQgdGhleSBleHBsaWNpdGx5IHNldCBzb21lIGhhbmRsZXItc2NvcGUgdmFsdWVzLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0SGFuZGxlclNjb3BlUHJvcGVydHlOYW1lcyhib29sZWFuKQorICAgICAqLworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gaGFuZGxlclNjb3BlUHJvcGVydHlOYW1lczsKKworICAgIC8qKgorICAgICAqIEJhZyB0byBjYXB0dXJlIHByb3BlcnRpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGUgd2hvbGUKKyAgICAgKiBtZXNzYWdlIGludm9jYXRpb24gKG5hbWVseSBvbiBib3RoIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuKQorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgY29waWVkIGZyb20gYSByZXF1ZXN0IHRvIGEgcmVzcG9uc2UuCisgICAgICogVGhpcyBpcyB3aGVyZSB3ZSBrZWVwIHByb3BlcnRpZXMgdGhhdCBhcmUgc2V0IGJ5IGhhbmRsZXJzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogU2VlIDxhIGhyZWY9IiNwcm9wZXJ0aWVzIj5jbGFzcyBqYXZhZG9jPC9hPiBmb3IgbW9yZSBkaXNjdXNzaW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0SGFuZGxlclNjb3BlUHJvcGVydHlOYW1lcyhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gaW52b2NhdGlvblByb3BlcnRpZXM7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEge0BsaW5rIFNldH0gdGhhdCBzdG9yZXMgaGFuZGxlci1zY29wZSBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlc2UgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBleHBvc2VkIHRvIHRoZSByZXNwb25zZSBjb250ZXh0LgorICAgICAqIENvbnNlcXVlbnRseSwgaWYgYSB7QGxpbmsgVHViZX0gd2lzaGVzIHRvIGhpZGUgYSBwcm9wZXJ0eQorICAgICAqIHRvIHtAbGluayBSZXNwb25zZUNvbnRleHR9LCBpdCBuZWVkcyB0byBhZGQgdGhlIHByb3BlcnR5IG5hbWUKKyAgICAgKiB0byB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkT25seQorICAgICAqICAgICAgUmV0dXJuIHRydWUgaWYgdGhlIGNhbGxlciBvbmx5IGludGVuZHMgdG8gcmVhZCB0aGUgdmFsdWUgb2YgdGhpcyBzZXQuCisgICAgICogICAgICBJbnRlcm5hbGx5LCB0aGUge0BsaW5rIFNldH0gaXMgYWxsb2NhdGVkIGxhemlseSwgYW5kIHRoaXMgZmxhZyBoZWxwcworICAgICAqICAgICAgb3B0aW1pemluZyB0aGUgc3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgbm9uLW51bGwsIHBvc3NpYmx5IGVtcHR5IHNldCB0aGF0IHN0b3JlcyBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU2V0PFN0cmluZz4gZ2V0SGFuZGxlclNjb3BlUHJvcGVydHlOYW1lcyggYm9vbGVhbiByZWFkT25seSApIHsKKyAgICAgICAgU2V0PFN0cmluZz4gbyA9IHRoaXMuaGFuZGxlclNjb3BlUHJvcGVydHlOYW1lczsKKyAgICAgICAgaWYobz09bnVsbCkgeworICAgICAgICAgICAgaWYocmVhZE9ubHkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgICAgICBvID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgdGhpcy5oYW5kbGVyU2NvcGVQcm9wZXJ0eU5hbWVzID0gbzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBubyBsb25nZXIgd29ya3MuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVXNlIHtAbGluayAjZ2V0SGFuZGxlclNjb3BlUHJvcGVydHlOYW1lcyhib29sZWFuKX0uCisgICAgICogICAgICBUbyBiZSByZW1vdmVkIG9uY2UgVGFuZ28gY29tcG9uZW50cyBhcmUgdXBkYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU2V0PFN0cmluZz4gZ2V0QXBwbGljYXRpb25TY29wZVByb3BlcnR5TmFtZXMoIGJvb2xlYW4gcmVhZE9ubHkgKSB7CisgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVzcG9uc2Uge0BsaW5rIFBhY2tldH0gZnJvbSBhIHJlcXVlc3QgcGFja2V0ICh7QGNvZGUgdGhpc30pLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiBhIHtAbGluayBQYWNrZXR9IGZvciBhIHJlcGx5IGlzIGNyZWF0ZWQsIHNvbWUgcHJvcGVydGllcyBuZWVkIHRvIGJlCisgICAgICogY29waWVkIG92ZXIgZnJvbSBhIHJlcXVlc3QgdG8gYSByZXNwb25zZSwgYW5kIHRoaXMgbWV0aG9kIGhhbmRsZXMgaXQgY29ycmVjdGx5LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFVzZSBjcmVhdGVDbGllbnRSZXNwb25zZShNZXNzYWdlKSBmb3IgY2xpZW50IHNpZGUgYW5kCisgICAgICogICAgICBjcmVhdGVTZXJ2ZXJSZXNwb25zZShNZXNzYWdlLCBTdHJpbmcpIGZvciBzZXJ2ZXIgc2lkZSByZXNwb25zZQorICAgICAqICAgICAgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICBUaGUge0BsaW5rIE1lc3NhZ2V9IHRoYXQgcmVwcmVzZW50cyBhIHJlcGx5LiBDYW4gYmUgbnVsbC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBQYWNrZXQgY3JlYXRlUmVzcG9uc2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgUGFja2V0IHJlc3BvbnNlID0gbmV3IFBhY2tldCh0aGlzKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZShtc2cpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlc3BvbnNlIHtAbGluayBQYWNrZXR9IGZyb20gYSByZXF1ZXN0IHBhY2tldCAoe0Bjb2RlIHRoaXN9KS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoZW4gYSB7QGxpbmsgUGFja2V0fSBmb3IgYSByZXBseSBpcyBjcmVhdGVkLCBzb21lIHByb3BlcnRpZXMgbmVlZCB0byBiZQorICAgICAqIGNvcGllZCBvdmVyIGZyb20gYSByZXF1ZXN0IHRvIGEgcmVzcG9uc2UsIGFuZCB0aGlzIG1ldGhvZCBoYW5kbGVzIGl0IGNvcnJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgIFRoZSB7QGxpbmsgTWVzc2FnZX0gdGhhdCByZXByZXNlbnRzIGEgcmVwbHkuIENhbiBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBQYWNrZXQgY3JlYXRlQ2xpZW50UmVzcG9uc2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgUGFja2V0IHJlc3BvbnNlID0gbmV3IFBhY2tldCh0aGlzKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZShtc2cpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHNlcnZlci1zaWRlIHJlc3BvbnNlIHtAbGluayBQYWNrZXR9IGZyb20gYSByZXF1ZXN0CisgICAgICogcGFja2V0ICh7QGNvZGUgdGhpc30pLiBJZiBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQsIGEgZGVmYXVsdCBBY3Rpb24KKyAgICAgKiBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgb2J0YWluZWQgdXNpbmcgPGNvZGU+d3NkbFBvcnQ8L2NvZGU+IHtAbGluayBXU0RMUG9ydH0KKyAgICAgKiBhbmQgPGNvZGU+YmluZGluZzwvY29kZT4ge0BsaW5rIFdTQmluZGluZ30uCisgICAgICogPHA+PHA+CisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB0byBjcmVhdGUgYXBwbGljYXRpb24gcmVzcG9uc2UgbWVzc2FnZXMKKyAgICAgKiBzaW5jZSB0aGV5IGFyZSBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgV1NCaW5kaW5nfSBhbmQge0BsaW5rIFdTRExQb3J0fS4KKyAgICAgKiBGb3IgY3JlYXRpbmcgcHJvdG9jb2wgbWVzc2FnZXMgdGhhdCByZXF1aXJlIGEgbm9uLWRlZmF1bHQgQWN0aW9uLCB1c2UKKyAgICAgKiB7QGxpbmsgI2NyZWF0ZVNlcnZlclJlc3BvbnNlKE1lc3NhZ2UsIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uLCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb24sIFN0cmluZyl9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlTWVzc2FnZSBUaGUge0BsaW5rIE1lc3NhZ2V9IHRoYXQgcmVwcmVzZW50cyBhIHJlcGx5LiBDYW4gYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gd3NkbFBvcnQgVGhlIHJlc3BvbnNlIFdTREwgcG9ydC4KKyAgICAgKiBAcGFyYW0gYmluZGluZyBUaGUgcmVzcG9uc2UgQmluZGluZy4gQ2Fubm90IGJlIG51bGwuCisgICAgICogQHJldHVybiByZXNwb25zZSBwYWNrZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFja2V0IGNyZWF0ZVNlcnZlclJlc3BvbnNlKEBOdWxsYWJsZSBNZXNzYWdlIHJlc3BvbnNlTWVzc2FnZSwgQE51bGxhYmxlIFdTRExQb3J0IHdzZGxQb3J0LCBATnVsbGFibGUgU0VJTW9kZWwgc2VpTW9kZWwsIEBOb3ROdWxsIFdTQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIFBhY2tldCByID0gY3JlYXRlQ2xpZW50UmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKTsKKworICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbiBhdiA9IGJpbmRpbmcuZ2V0QWRkcmVzc2luZ1ZlcnNpb24oKTsKKyAgICAgICAgLy8gcG9wdWxhdGUgV1MtQSBoZWFkZXJzIG9ubHkgaWYgV1MtQSBpcyBlbmFibGVkCisgICAgICAgIGlmIChhdiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIC8vcG9wdWxhdGUgV1MtQSBoZWFkZXJzIG9ubHkgaWYgdGhlIHJlcXVlc3QgaGFzIGFkZHJlc3NpbmcgaGVhZGVycworICAgICAgICBTdHJpbmcgaW5wdXRBY3Rpb24gPSB0aGlzLmdldE1lc3NhZ2UoKS5nZXRIZWFkZXJzKCkuZ2V0QWN0aW9uKGF2LCBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkpOworICAgICAgICBpZiAoaW5wdXRBY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgb25lLXdheSwgdGhlbiBkb250IHBvcHVsYXRlIGFueSBXUy1BIGhlYWRlcnMKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCAod3NkbFBvcnQgIT0gbnVsbCAmJiBtZXNzYWdlLmlzT25lV2F5KHdzZGxQb3J0KSkpCisgICAgICAgICAgICByZXR1cm4gcjsKKworICAgICAgICAvLyBvdGhlcndpc2UgcG9wdWxhdGUgV1MtQWRkcmVzc2luZyBoZWFkZXJzCisgICAgICAgIHJldHVybiBwb3B1bGF0ZUFkZHJlc3NpbmdIZWFkZXJzKGJpbmRpbmcsIHIsIHdzZGxQb3J0LHNlaU1vZGVsKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzZXJ2ZXItc2lkZSByZXNwb25zZSB7QGxpbmsgUGFja2V0fSBmcm9tIGEgcmVxdWVzdAorICAgICAqIHBhY2tldCAoe0Bjb2RlIHRoaXN9KS4gSWYgV1MtQWRkcmVzc2luZyBpcyBlbmFibGVkLCA8Y29kZT5hY3Rpb248L2NvZGU+CisgICAgICogaXMgdXNlZCBhcyBBY3Rpb24gTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5LgorICAgICAqIDxwPjxwPgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3IgY3JlYXRpbmcgcHJvdG9jb2wgcmVzcG9uc2UgbWVzc2FnZXMKKyAgICAgKiB0aGF0IHJlcXVpcmUgYSBwYXJ0aWN1bGFyIHZhbHVlIG9mIEFjdGlvbiBzaW5jZSB0aGV5IGFyZSBub3QgYXNzb2NpYXRlZAorICAgICAqIHdpdGggYSB7QGxpbmsgV1NCaW5kaW5nfSBhbmQge0BsaW5rIFdTRExQb3J0fSBidXQgZG8ga25vdyB0aGUge0BsaW5rIEFkZHJlc3NpbmdWZXJzaW9ufQorICAgICAqIGFuZCB7QGxpbmsgU09BUFZlcnNpb259LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlTWVzc2FnZSBUaGUge0BsaW5rIE1lc3NhZ2V9IHRoYXQgcmVwcmVzZW50cyBhIHJlcGx5LiBDYW4gYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ1ZlcnNpb24gVGhlIFdTLUFkZHJlc3NpbmcgdmVyc2lvbiBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gc29hcFZlcnNpb24gVGhlIFNPQVAgdmVyc2lvbiBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSByZXNwb25zZSBBY3Rpb24gTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IHZhbHVlLgorICAgICAqIEByZXR1cm4gcmVzcG9uc2UgcGFja2V0CisgICAgICovCisgICAgcHVibGljIFBhY2tldCBjcmVhdGVTZXJ2ZXJSZXNwb25zZShATnVsbGFibGUgTWVzc2FnZSByZXNwb25zZU1lc3NhZ2UsIEBOb3ROdWxsIEFkZHJlc3NpbmdWZXJzaW9uIGFkZHJlc3NpbmdWZXJzaW9uLCBATm90TnVsbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgQE5vdE51bGwgU3RyaW5nIGFjdGlvbikgeworICAgICAgICBQYWNrZXQgcmVzcG9uc2VQYWNrZXQgPSBjcmVhdGVDbGllbnRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UpOworCisgICAgICAgIC8vIHBvcHVsYXRlIFdTLUEgaGVhZGVycyBvbmx5IGlmIFdTLUEgaXMgZW5hYmxlZAorICAgICAgICBpZiAoYWRkcmVzc2luZ1ZlcnNpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZVBhY2tldDsKKyAgICAgICAgLy9wb3B1bGF0ZSBXUy1BIGhlYWRlcnMgb25seSBpZiB0aGUgcmVxdWVzdCBoYXMgYWRkcmVzc2luZyBoZWFkZXJzCisgICAgICAgIFN0cmluZyBpbnB1dEFjdGlvbiA9IHRoaXMuZ2V0TWVzc2FnZSgpLmdldEhlYWRlcnMoKS5nZXRBY3Rpb24oYWRkcmVzc2luZ1ZlcnNpb24sIHNvYXBWZXJzaW9uKTsKKyAgICAgICAgaWYgKGlucHV0QWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZVBhY2tldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwb3B1bGF0ZUFkZHJlc3NpbmdIZWFkZXJzKHJlc3BvbnNlUGFja2V0LAorICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdWZXJzaW9uLAorICAgICAgICAgICAgICAgIHNvYXBWZXJzaW9uLAorICAgICAgICAgICAgICAgIGFjdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWNrZXQgcG9wdWxhdGVBZGRyZXNzaW5nSGVhZGVycyhQYWNrZXQgcmVzcG9uc2VQYWNrZXQsIEFkZHJlc3NpbmdWZXJzaW9uIGF2LCBTT0FQVmVyc2lvbiBzdiwgU3RyaW5nIGFjdGlvbikgeworICAgICAgICAvLyBwb3B1bGF0ZSBXUy1BIGhlYWRlcnMgb25seSBpZiBXUy1BIGlzIGVuYWJsZWQKKyAgICAgICAgaWYgKGF2ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VQYWNrZXQ7CisKKyAgICAgICAgLy8gaWYgb25lLXdheSwgdGhlbiBkb250IHBvcHVsYXRlIGFueSBXUy1BIGhlYWRlcnMKKyAgICAgICAgaWYgKHJlc3BvbnNlUGFja2V0LmdldE1lc3NhZ2UoKSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlUGFja2V0OworCisgICAgICAgIEhlYWRlckxpc3QgaGwgPSByZXNwb25zZVBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0SGVhZGVycygpOworCisgICAgICAgIC8vIHdzYTpUbworICAgICAgICBXU0VuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG87CisgICAgICAgIHRyeSB7CisgICAgICAgIHJlcGx5VG8gPSBtZXNzYWdlLmdldEhlYWRlcnMoKS5nZXRSZXBseVRvKGF2LCBzdik7CisgICAgICAgIGlmIChyZXBseVRvICE9IG51bGwpCisgICAgICAgICAgICBobC5hZGQobmV3IFN0cmluZ0hlYWRlcihhdi50b1RhZywgcmVwbHlUby5nZXRBZGRyZXNzKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZE1hcEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXBseVRvID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdzYTpBY3Rpb24KKyAgICAgICAgaGwuYWRkKG5ldyBTdHJpbmdIZWFkZXIoYXYuYWN0aW9uVGFnLCBhY3Rpb24pKTsKKworICAgICAgICAvLyB3c2E6TWVzc2FnZUlECisgICAgICAgIGhsLmFkZChuZXcgU3RyaW5nSGVhZGVyKGF2Lm1lc3NhZ2VJRFRhZywgcmVzcG9uc2VQYWNrZXQuZ2V0TWVzc2FnZSgpLmdldElEKGF2LCBzdikpKTsKKworICAgICAgICAvLyB3c2E6UmVsYXRlc1RvCisgICAgICAgIC8vIFRPRE86IHRoaXMgcHJvcGVydHkgaXMgZGVmaW5lZCBpbiBXc2FTZXJ2ZXJUdWJlLlJFUVVFU1RfTUVTU0FHRV9JRAorICAgICAgICBTdHJpbmcgbWlkID0gKFN0cmluZylyZXNwb25zZVBhY2tldC5pbnZvY2F0aW9uUHJvcGVydGllcy5nZXQoImNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcucmVxdWVzdC5tZXNzYWdlSUQiKTsKKyAgICAgICAgaWYgKG1pZCAhPSBudWxsKQorICAgICAgICAgICAgaGwuYWRkKG5ldyBSZWxhdGVzVG9IZWFkZXIoYXYucmVsYXRlc1RvVGFnLCBtaWQpKTsKKworICAgICAgICAvLyBwb3B1bGF0ZSByZWZlcmVuY2UgcGFyYW1ldGVycworICAgICAgICBXU0VuZHBvaW50UmVmZXJlbmNlIHJlZnBFUFI7CisgICAgICAgIGlmIChyZXNwb25zZVBhY2tldC5nZXRNZXNzYWdlKCkuaXNGYXVsdCgpKSB7CisgICAgICAgICAgICAvLyBjaG9vc2UgRmF1bHRUbworICAgICAgICAgICAgcmVmcEVQUiA9IG1lc3NhZ2UuZ2V0SGVhZGVycygpLmdldEZhdWx0VG8oYXYsIHN2KTsKKworICAgICAgICAgICAgLy8gaWYgRmF1bHRUbyBpcyBudWxsLCB0aGVuIHVzZSBSZXBseVRvCisgICAgICAgICAgICBpZiAocmVmcEVQUiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJlZnBFUFIgPSByZXBseVRvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY2hvb3NlIFJlcGx5VG8KKyAgICAgICAgICAgIHJlZnBFUFIgPSByZXBseVRvOworICAgICAgICB9CisgICAgICAgIGlmIChyZWZwRVBSICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZnBFUFIuYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhobCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzcG9uc2VQYWNrZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWNrZXQgcG9wdWxhdGVBZGRyZXNzaW5nSGVhZGVycyhXU0JpbmRpbmcgYmluZGluZywgUGFja2V0IHJlc3BvbnNlUGFja2V0LCBXU0RMUG9ydCB3c2RsUG9ydCwgU0VJTW9kZWwgc2VpTW9kZWwpIHsKKyAgICAgICAgQWRkcmVzc2luZ1ZlcnNpb24gYWRkcmVzc2luZ1ZlcnNpb24gPSBiaW5kaW5nLmdldEFkZHJlc3NpbmdWZXJzaW9uKCk7CisKKyAgICAgICAgaWYgKGFkZHJlc3NpbmdWZXJzaW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VQYWNrZXQ7CisKKyAgICAgICAgV3NhVHViZUhlbHBlciB3c2FIZWxwZXIgPSBhZGRyZXNzaW5nVmVyc2lvbi5nZXRXc2FIZWxwZXIod3NkbFBvcnQsc2VpTW9kZWwsIGJpbmRpbmcpOworICAgICAgICBTdHJpbmcgYWN0aW9uID0gcmVzcG9uc2VQYWNrZXQubWVzc2FnZS5pc0ZhdWx0KCkgPworICAgICAgICAgICAgICAgIHdzYUhlbHBlci5nZXRGYXVsdEFjdGlvbih0aGlzLCByZXNwb25zZVBhY2tldCkgOgorICAgICAgICAgICAgICAgIHdzYUhlbHBlci5nZXRPdXRwdXRBY3Rpb24odGhpcyk7CisKKyAgICAgICAgcmV0dXJuIHBvcHVsYXRlQWRkcmVzc2luZ0hlYWRlcnMocmVzcG9uc2VQYWNrZXQsIGFkZHJlc3NpbmdWZXJzaW9uLCBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCksIGFjdGlvbik7CisgICAgfQorCisgICAgLy8gY29tcGxldGVzIFR5cGVkTWFwCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlNYXAgbW9kZWw7CisKKyAgICBzdGF0aWMgeworICAgICAgICBtb2RlbCA9IHBhcnNlKFBhY2tldC5jbGFzcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFByb3BlcnR5TWFwIGdldFByb3BlcnR5TWFwKCkgeworICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2UvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOThkMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2UvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKioKKyAqIHtAbGluayBNZXNzYWdlfSBhbmQgcmVsYXRlZCBhYnN0cmFjdGlvbnMgdGhhdCByZXByZXNlbnQgYSBTT0FQIG1lc3NhZ2UuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2U7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9zdHJlYW0vSW5wdXRTdHJlYW1NZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9zdHJlYW0vSW5wdXRTdHJlYW1NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2YWEyZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL3N0cmVhbS9JbnB1dFN0cmVhbU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLnN0cmVhbTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnRTZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogTG93IGxldmVsIHJlcHJlc2VudGF0aW9uIG9mIGFuIFhNTCBvciBTT0FQIG1lc3NhZ2UgYXMgYW4ge0BsaW5rIElucHV0U3RyZWFtfS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJbnB1dFN0cmVhbU1lc3NhZ2UgZXh0ZW5kcyBTdHJlYW1CYXNlZE1lc3NhZ2UgeworICAgIC8qKgorICAgICAqIFRoZSBNSU1FIGNvbnRlbnQtdHlwZSBvZiB0aGUgZW5jb2RpbmcuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZTsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXNzYWdlIHJlcHJlc2VudGVkIGFzIGFuIHtAbGluayBJbnB1dFN0cmVhbX0uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIElucHV0U3RyZWFtIG1zZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMKKyAgICAgKiAgICAgIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRlbnRUeXBlCisgICAgICogICAgICB0aGUgTUlNRSBjb250ZW50LXR5cGUgb2YgdGhlIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgYWx3YXlzIGEgbm9uLW51bGwgdW5jb25zdW1lZCB7QGxpbmsgSW5wdXRTdHJlYW19IHRoYXQKKyAgICAgKiAgICAgIHJlcHJlc2VudHMgYSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbU1lc3NhZ2UoUGFja2V0IHByb3BlcnRpZXMsIFN0cmluZyBjb250ZW50VHlwZSwgSW5wdXRTdHJlYW0gbXNnKSB7CisgICAgICAgIHN1cGVyKHByb3BlcnRpZXMpOworCisgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcworICAgICAqICAgICAgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0YWNobWVudHMKKyAgICAgKiAgICAgIHRoZSBhdHRhY2htZW50cyBvZiB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQorICAgICAqICAgICAgdGhlIE1JTUUgY29udGVudC10eXBlIG9mIHRoZSBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgIGFsd2F5cyBhIG5vbi1udWxsIHVuY29uc3VtZWQge0BsaW5rIElucHV0U3RyZWFtfSB0aGF0CisgICAgICogICAgICByZXByZXNlbnRzIGEgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW1NZXNzYWdlKFBhY2tldCBwcm9wZXJ0aWVzLCBBdHRhY2htZW50U2V0IGF0dGFjaG1lbnRzLAorICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlLCBJbnB1dFN0cmVhbSBtc2cpIHsKKyAgICAgICAgc3VwZXIocHJvcGVydGllcywgYXR0YWNobWVudHMpOworCisgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2Uvc3RyZWFtL1N0cmVhbUJhc2VkTWVzc2FnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2Uvc3RyZWFtL1N0cmVhbUJhc2VkTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMzE3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbWVzc2FnZS9zdHJlYW0vU3RyZWFtQmFzZWRNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5zdHJlYW07CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkF0dGFjaG1lbnRTZXRJbXBsOworCisvKioKKyAqIEJhc2UgcmVwcmVzZW50YXRpb24gYW4gWE1MIG9yIFNPQVAgbWVzc2FnZSBhcyBzdHJlYW0uCisgKgorICovCithYnN0cmFjdCBjbGFzcyBTdHJlYW1CYXNlZE1lc3NhZ2UgeworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBQYWNrZXQgcHJvcGVydGllczsKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRhY2htZW50cyBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKiAoYXR0YWNobWVudHMgbGl2ZSBvdXRzaWRlIGEgbWVzc2FnZS4pCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEF0dGFjaG1lbnRTZXQgYXR0YWNobWVudHM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCisgICAgICogICAgICB0aGUgcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJlYW1CYXNlZE1lc3NhZ2UoUGFja2V0IHByb3BlcnRpZXMpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKyAgICAgICAgdGhpcy5hdHRhY2htZW50cyA9IG5ldyBBdHRhY2htZW50U2V0SW1wbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMKKyAgICAgKiAgICAgIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dGFjaG1lbnRzCisgICAgICogICAgICB0aGUgYXR0YWNobWVudHMgb2YgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmVhbUJhc2VkTWVzc2FnZShQYWNrZXQgcHJvcGVydGllcywgQXR0YWNobWVudFNldCBhdHRhY2htZW50cykgeworICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICAgICAgICB0aGlzLmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21lc3NhZ2Uvc3RyZWFtL1hNTFN0cmVhbVJlYWRlck1lc3NhZ2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL3N0cmVhbS9YTUxTdHJlYW1SZWFkZXJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiZDA0NwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tZXNzYWdlL3N0cmVhbS9YTUxTdHJlYW1SZWFkZXJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5zdHJlYW07CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKKworLyoqCisgKiBMb3cgbGV2ZWwgcmVwcmVzZW50YXRpb24gb2YgYW4gWE1MIG9yIFNPQVAgbWVzc2FnZSBhcyBhbiB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxTdHJlYW1SZWFkZXJNZXNzYWdlIGV4dGVuZHMgU3RyZWFtQmFzZWRNZXNzYWdlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVzc2FnZSByZXByZXNlbnRlZCBhcyBhbiB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgWE1MU3RyZWFtUmVhZGVyIG1zZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMKKyAgICAgKiAgICAgIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZworICAgICAqICAgICAgYWx3YXlzIGEgbm9uLW51bGwgdW5jb25zdW1lZCB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSB0aGF0CisgICAgICogICAgICByZXByZXNlbnRzIGEgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyTWVzc2FnZShQYWNrZXQgcHJvcGVydGllcywgWE1MU3RyZWFtUmVhZGVyIG1zZykgeworICAgICAgICBzdXBlcihwcm9wZXJ0aWVzKTsKKyAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcworICAgICAqICAgICAgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0YWNobWVudHMKKyAgICAgKiAgICAgIHRoZSBhdHRhY2htZW50cyBvZiB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgIGFsd2F5cyBhIG5vbi1udWxsIHVuY29uc3VtZWQge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gdGhhdAorICAgICAqICAgICAgcmVwcmVzZW50cyBhIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlck1lc3NhZ2UoUGFja2V0IHByb3BlcnRpZXMsIEF0dGFjaG1lbnRTZXQgYXR0YWNobWVudHMsIFhNTFN0cmVhbVJlYWRlciBtc2cpIHsKKyAgICAgICAgc3VwZXIocHJvcGVydGllcywgYXR0YWNobWVudHMpOworICAgICAgICB0aGlzLm1zZyA9IG1zZzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvQ2hlY2tlZEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL0NoZWNrZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWEyNThlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL0NoZWNrZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFic3RyYWN0aW8gdG8gdGhlICB0aGUgZXhjZXB0aW9uIGNsYXNzCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSB3c2RsOmZhdWx0LCBzdWNoIGFzIGNsYXNzIE1VU1QgaGF2ZQorICoge0BsaW5rIFdlYkZhdWx0fSBhbm5vdGF0aW9uIGRlZmluZWQgb24gaXQuCisgKgorICogQWxzbyB0aGUgZXhjZXB0aW9uIGNsYXNzIG11c3QgaGF2ZQorICoKKyAqIDxjb2RlPnB1YmxpYyBXcmFwcGVyRXhjZXB0aW9uKClTdHJpbmcgbWVzc2FnZSwgRmF1bHRCZWFuKXt9PC9jb2RlPgorICoKKyAqIGFuZCBtZXRob2QKKyAqCisgKiA8Y29kZT5wdWJsaWMgRmF1bHRCZWFuIGdldEZhdWx0SW5mbygpOzwvY29kZT4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIENoZWNrZWRFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvb3Qge0BsaW5rIFNFSU1vZGVsfSB0aGF0IG93bnMgdGhpcyBtb2RlbC4KKyAgICAgKi8KKyAgICBTRUlNb2RlbCBnZXRPd25lcigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcGFyZW50IHtAbGluayBKYXZhTWV0aG9kfSB0byB3aGljaCB0aGlzIGNoZWNrZWQgZXhjZXB0aW9uIGJlbG9uZ3MuCisgICAgICovCisgICAgSmF2YU1ldGhvZCBnZXRQYXJlbnQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSByZXR1cm5lZCBleGNlcHRpb24gY2xhc3Mgd291bGQgYmUgdXNlcmRlZmluZWQgb3IgV1NETCBleGNlcHRpb24gY2xhc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgbm9uLW51bGwgc2FtZSBvYmplY3QuCisgICAgICovCisgICAgQ2xhc3MgZ2V0RXhjZXB0aW9uQ2xhc3MoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXRhaWwgYmVhbiBpcyBzZXJpYWxpemVkIGluc2lkZSB0aGUgZGV0YWlsIGVudHJ5IGluIHRoZSBTT0FQIG1lc3NhZ2UuCisgICAgICogVGhpcyBtdXN0IGJlIGtub3duIHRvIHRoZSB7QGxpbmsgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHR9IGlub3JkZXIgdG8gZ2V0CisgICAgICogbWFyc2hhbGxlZC91bm1hcnNoYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXRhaWwgYmVhbgorICAgICAqLworICAgIENsYXNzIGdldERldGFpbEJlYW4oKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlfSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldGFpbAorICAgICAqLworICAgIEJyaWRnZSBnZXRCcmlkZ2UoKTsKKworICAgIC8qKgorICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGV4Y2VwdGlvbiBjbGFzcyBpcyBhIHVzZXJkZWZpbmVkIG9yIGEgV1NETCBleGNlcHRpb24uCisgICAgICogQSBXU0RMIGV4Y2VwdGlvbiBjbGFzcyBmb2xsb3dzIHRoZSBwYXR0ZXJuIGRlZmluZWQgaW4gSlNSIDIyNC4gQWNjb3JkaW5nIHRvIHRoYXQKKyAgICAgKiBhIFdTREwgZXhjZXB0aW9uIGNsYXNzIG11c3QgaGF2ZToKKyAgICAgKgorICAgICAqIDxjb2RlPnB1YmxpYyBXcmFwcGVyRXhjZXB0aW9uKClTdHJpbmcgbWVzc2FnZSwgRmF1bHRCZWFuKXt9PC9jb2RlPgorICAgICAqCisgICAgICogYW5kIGFjY2Vzc29yIG1ldGhvZAorICAgICAqCisgICAgICogPGNvZGU+cHVibGljIEZhdWx0QmVhbiBnZXRGYXVsdEluZm8oKTs8L2NvZGU+CisgICAgICovCisgICAgRXhjZXB0aW9uVHlwZSBnZXRFeGNlcHRpb25UeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbi93c2RsOmZhdWx0QG1lc3NhZ2UgdmFsdWUgLSB0aGF0IGlzIHRoZSB3c2RsOm1lc3NhZ2UKKyAgICAgKiByZWZlcmVuY2VkIGJ5IHdzZGw6ZmF1bHQKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TWVzc2FnZU5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC9FeGNlcHRpb25UeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvRXhjZXB0aW9uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWQwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvRXhjZXB0aW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsOworLyoqCisgKiBUeXBlIG9mIGphdmEgZXhjZXB0aW9uIGFzIGRlZmluZWQgYnkgSkFYV1MgMi4wIEpTUiAyMjQuCisgKgorICogVGVsbHMgd2hldGhlciB0aGUgZXhjZXB0aW9uIGNsYXNzIGlzIGEgdXNlcmRlZmluZWQgb3IgYSBXU0RMIGV4Y2VwdGlvbi4KKyAqIEEgV1NETCBleGNlcHRpb24gY2xhc3MgZm9sbG93cyB0aGUgcGF0dGVybiBkZWZpbmVkIGluIEpTUiAyMjQuIEFjY29yZGluZyB0byB0aGF0CisgKiBhIFdTREwgZXhjZXB0aW9uIGNsYXNzIG11c3QgaGF2ZToKKyAqCisgKiA8Y29kZT5wdWJsaWMgV3JhcHBlckV4Y2VwdGlvbigpU3RyaW5nIG1lc3NhZ2UsIEZhdWx0QmVhbil7fTwvY29kZT4KKyAqCisgKiBhbmQgYWNjZXNzb3IgbWV0aG9kCisgKgorICogPGNvZGU+cHVibGljIEZhdWx0QmVhbiBnZXRGYXVsdEluZm8oKTs8L2NvZGU+CisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZSB7CisgICAgV1NETEV4Y2VwdGlvbigwKSwgVXNlckRlZmluZWQoMSk7CisKKyAgICBFeGNlcHRpb25UeXBlKGludCBleGNlcHRpb25UeXBlKXsKKyAgICAgICAgdGhpcy5leGNlcHRpb25UeXBlID0gZXhjZXB0aW9uVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHZhbHVlKCkgeworICAgICAgICByZXR1cm4gZXhjZXB0aW9uVHlwZTsKKyAgICB9CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXhjZXB0aW9uVHlwZTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC9KYXZhTWV0aG9kLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvSmF2YU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTM4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvSmF2YU1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuc29hcC5TT0FQQmluZGluZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBBYnN0cmFjdHMgdGhlIGFubm90YXRlZCB7QGxpbmsgTWV0aG9kfSBvZiBhIFNFSS4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFNZXRob2QgeworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCB7QGxpbmsgU0VJTW9kZWx9IHRoYXQgb3ducyB0aGlzIG1vZGVsLgorICAgICAqLworICAgIFNFSU1vZGVsIGdldE93bmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBPbiB0aGUgc2VydmVyIHNpZGUsIGl0IHVzZXMgdGhpcyBmb3IgaW52b2NhdGlvbiBvZiB0aGUgd2ViIHNlcnZpY2UKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHtAbGluayBAV2ViU2VydmljZX0oZW5kcG9pbnRJbnRlcmZhY2U9IkkiKQorICAgICAqIGNsYXNzIEEgeyB9CisgICAgICoKKyAgICAgKiBJbiB0aGlzIGNhc2UsIGl0IHJldHVucyBBJ3MgbWV0aG9kCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgQFdlYlNlcnZpY2V9KGVuZHBvaW50SW50ZXJmYWNlPSJJIikKKyAgICAgKiBjbGFzcyBBIGltcGxlbWVudHMgSSB7IH0KKyAgICAgKiBJbiB0aGlzIGNhc2UsIGl0IHJldHVybnMgQSdzIG1ldGhvZAorICAgICAqCisgICAgICogPHA+CisgICAgICoge0BsaW5rIEBXZWJTZXJ2aWNlfQorICAgICAqIGNsYXNzIEEgeyB9CisgICAgICogSW4gdGhpcyBjYXNlLCBpdCByZXR1cm5zIEEncyBtZXRob2QKKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YSB7QGxpbmsgTWV0aG9kfQorICAgICAqLworICAgIEBOb3ROdWxsIE1ldGhvZCBnZXRNZXRob2QoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gYWNjZXNzIGFubm90YXRpb25zIG9uIFdlYk1ldGhvZAorICAgICAqIFJldHVybnMgdGhlIFNFSSBtZXRob2QgaWYgdGhlcmUgaXMgb25lLgorICAgICAqCisgICAgICogPHA+CisgICAgICoge0BsaW5rIEBXZWJTZXJ2aWNlfShlbmRwb2ludEludGVyZmFjZT0iSSIpCisgICAgICogY2xhc3MgQSB7IH0KKyAgICAgKiBJbiB0aGlzIGNhc2UsIGl0IHJldHVucyBJJ3MgbWV0aG9kCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgQFdlYlNlcnZpY2V9KGVuZHBvaW50SW50ZXJmYWNlPSJJIikKKyAgICAgKiBjbGFzcyBBIGltcGxlbWVudHMgSSB7IH0KKyAgICAgKiBJbiB0aGlzIGNhc2UsIGl0IHJldHVybnMgSSdzIG1ldGhvZAorICAgICAqCisgICAgICogPHA+CisgICAgICoge0BsaW5rIEBXZWJTZXJ2aWNlfQorICAgICAqIGNsYXNzIEEgeyB9CisgICAgICogSW4gdGhpcyBjYXNlLCBpdCByZXR1cm5zIEEncyBtZXRob2QKKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YSB7QGxpbmsgTWV0aG9kfQorICAgICAqLworICAgIEBOb3ROdWxsIE1ldGhvZCBnZXRTRUlNZXRob2QoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUge0BsaW5rIE1FUH0uCisgICAgICovCisgICAgTUVQIGdldE1FUCgpOworCisgICAgLyoqCisgICAgICogQmluZGluZyBvYmplY3QgLSBhIHtAbGluayBTT0FQQmluZGluZ30gaXNudGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBCaW5kaW5nIG9iamVjdAorICAgICAqLworICAgIFNPQVBCaW5kaW5nIGdldEJpbmRpbmcoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSB3c2RsOm9wZXJhdGlvbkBuYW1lIHZhbHVlCisgICAgICovCisgICAgQE5vdE51bGwgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoKTsKKworCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIHJlcXVlc3Qgd3NkbDptZXNzYWdlQG5hbWUgdmFsdWUKKyAgICAgKi8KKyAgICBATm90TnVsbCBTdHJpbmcgZ2V0UmVxdWVzdE1lc3NhZ2VOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgcmVzcG9uc2Ugd3NkbDptZXNzYWdlTmFtZSB2YWx1ZQorICAgICAqIEByZXR1cm4gbnVsbCBpZiBpdHMgYSBvbmV3YXkgb3BlcmF0aW9uIHRoYXQgaXMgZ2V0TUVQKCkuaXNPbmVXYXkoKT09dHJ1ZS4KKyAgICAgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5NRVAjaXNPbmVXYXkoKQorICAgICAqLworICAgIEBOdWxsYWJsZSBTdHJpbmcgZ2V0UmVzcG9uc2VNZXNzYWdlTmFtZSgpOworCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvTUVQLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvTUVQLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwZDk4ZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC9NRVAuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsOworCisvKioKKyAqIENvbnN0YW50cyB0aGF0IHJlcHJlc2VudHMgZm91ciBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm5zLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGVudW0gTUVQIHsKKyAgICBSRVFVRVNUX1JFU1BPTlNFKGZhbHNlKSwKKyAgICBPTkVfV0FZKGZhbHNlKSwKKyAgICBBU1lOQ19QT0xMKHRydWUpLAorICAgIEFTWU5DX0NBTExCQUNLKHRydWUpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBmb3Ige0BsaW5rICNBU1lOQ19DQUxMQkFDS30gYW5kIHtAbGluayAjQVNZTkNfUE9MTH0uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBc3luYzsKKworICAgIE1FUChib29sZWFuIGFzeW5jKSB7CisgICAgICAgIGlzQXN5bmMgPSBhc3luYzsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc09uZVdheSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM9PU9ORV9XQVk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL1BhcmFtZXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL1BhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjVlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWw7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2U7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CitpbXBvcnQgamF2YXguandzLldlYlBhcmFtOworaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOworCisvKioKKyAqIFJ1bnRpbWUgUGFyYW1ldGVyIHRoYXQgYWJzdHJhY3RzIHRoZSBhbm5vdGF0ZWQgamF2YSBwYXJhbWV0ZXIKKyAqIDxwLz4KKyAqIDxwLz4KKyAqIEEgcGFyYW1ldGVyIG1heSBiZSBib3VuZCB0byBhIGhlYWRlciwgYSBib2R5LCBvciBhbiBhdHRhY2htZW50LgorICogTm90ZSB0aGF0IHdoZW4gaXQncyBib3VuZCB0byBhIGJvZHksIGl0J3MgYm91bmQgdG8gYSBib2R5LAorICogaXQgYmluZHMgdG8gdGhlIHdob2xlIHBheWxvYWQuCisgKiA8cC8+CisgKiA8cC8+CisgKiBTb21ldGltZXMgbXVsdGlwbGUgSmF2YSBwYXJhbWV0ZXJzIGFyZSBwYWNrZWQgaW50byB0aGUgcGF5bG9hZCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHN1YmNsYXNzIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyfSBpcyB1c2VkLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGFyYW1ldGVyIHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb290IHtAbGluayBTRUlNb2RlbH0gdGhhdCBvd25zIHRoaXMgbW9kZWwuCisgICAgICovCisgICAgU0VJTW9kZWwgZ2V0T3duZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBhcmVudCB7QGxpbmsgSmF2YU1ldGhvZH0gdG8gd2hpY2ggdGhpcyBwYXJhbWV0ZXIgYmVsb25ncy4KKyAgICAgKi8KKyAgICBKYXZhTWV0aG9kIGdldFBhcmVudCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB7QGxpbmsgUU5hbWV9IG9mIHRoZSBwYXlsb2FkL2luZm9zZXQgb2YgYSBTT0FQIGJvZHkgb3IgaGVhZGVyLgorICAgICAqLworICAgIFFOYW1lIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSB7QGxpbmsgQnJpZGdlfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBCcmlkZ2UgZ2V0QnJpZGdlKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGUsIHN1Y2ggYXMgSU4sIE9VVCBvciBJTk9VVC4KKyAgICAgKi8KKyAgICBNb2RlIGdldE1vZGUoKTsKKworICAgIC8qKgorICAgICAqIFBvc2l0aW9uIG9mIGEgcGFyYW1ldGVyIGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlLiBJdCB3b3VsZCBiZSAtMSBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgcmV0dXJuLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpbmRleC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0SW5kZXgoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8dHQ+dGhpcyBpbnN0YW5jZW9mIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyfTwvdHQ+LgorICAgICAqLworICAgIGJvb2xlYW4gaXNXcmFwcGVyU3R5bGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHBhcmFtZXRlciBpcyBib3VuZCB0byB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHtAbGluayBKYXZhTWV0aG9kfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEp1c3QgdGhlIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgPHR0PmdldEluZGV4KCk9PS0xPC90dD4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzUmV0dXJuVmFsdWUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJpbmRpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIuIEZvciBJTiBwYXJhbWV0ZXIgdGhlIGJpbmRpbmcgd2lsbCBiZQorICAgICAqIHNhbWUgYXMge0BsaW5rICNnZXRJbkJpbmRpbmcoKX0sIGZvciBPVVQgcGFyYW1ldGVyIHRoZSBiaW5kaW5nIHdpbGwgYmUgc2FtZSBhcworICAgICAqIHtAbGluayAjZ2V0T3V0QmluZGluZygpfSBhbmQgZm9yIElOT1VUIHBhcmFtZXRlciB0aGUgYmluZGluZyB3aWxsIGJlIHNhbWUgYXMgY2FsbGluZworICAgICAqIHtAbGluayAjZ2V0SW5CaW5kaW5nKCl9CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBCaW5kaW5nIGZvciB0aGlzIFBhcmFtZXRlci4gUmV0dXJucyB7QGxpbmsgUGFyYW1ldGVyQmluZGluZyNCT0RZfSBieSBkZWZhdWx0LgorICAgICAqLworICAgIFBhcmFtZXRlckJpbmRpbmcgZ2V0QmluZGluZygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFBhcmFtZXRlckJpbmRpbmd9IGFzc29jaWF0ZWQgd2l0aCB0aGUgSU4gbW9kZQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYmluZGluZworICAgICAqLworICAgIFBhcmFtZXRlckJpbmRpbmcgZ2V0SW5CaW5kaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUGFyYW1ldGVyQmluZGluZ30gYXNzb2NpYXRlZCB3aXRoIHRoZSBPVVQgbW9kZQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYmluZGluZworICAgICAqLworICAgIFBhcmFtZXRlckJpbmRpbmcgZ2V0T3V0QmluZGluZygpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB7QGxpbmsgTW9kZX0gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIgaXMge0BsaW5rIE1vZGUjSU59IGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0lOKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHtAbGluayBNb2RlfSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlciBpcyB7QGxpbmsgTW9kZSNPVVR9IGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc09VVCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB7QGxpbmsgTW9kZX0gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIgaXMge0BsaW5rIE1vZGUjSU5PVVR9IGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0lOT1VUKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB0aGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHtAbGluayBKYXZhTWV0aG9kI2dldFJlc3BvbnNlUGFyYW1ldGVycygpfSBpcyBndWFyYW50ZWVkIHRvIGhhdmUKKyAgICAgKiBhdCBtb3N0IG9uZSBzdWNoIHtAbGluayBQYXJhbWV0ZXJ9LiBOb3RlIHRoYXQgdGhlcmUgY291bGUgYmUgbm9uZSwKKyAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSBtZXRob2QgcmV0dXJucyA8dHQ+dm9pZDwvdHQ+LgorICAgICAqCisgICAgICogPHA+CisgICAgICogT3RoZXIgcmVzcG9uc2UgcGFyYW1ldGVycyBhcmUgYm91bmQgdG8ge0BsaW5rIEhvbGRlcn0uCisgICAgICovCisgICAgYm9vbGVhbiBpc1Jlc3BvbnNlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBob2xkZXIgdmFsdWUgaWYgYXBwbGljYWJsZS4gVG8gYmUgY2FsbGVkIGZvciBpbmJvdW5kIGNsaWVudCBzaWRlCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiBAcmV0dXJuIHRoZSBob2xkZXIgdmFsdWUgaWYgYXBwbGljYWJsZS4KKyAgICAgKi8KKyAgICBPYmplY3QgZ2V0SG9sZGVyVmFsdWUoT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgd3NkbDpwYXJ0QG5hbWUgdmFsdWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVmFsdWUgb2Yge0BsaW5rIFdlYlBhcmFtI3BhcnROYW1lKCl9IGFubm90YXRpb24gaWYgcHJlc2VudCwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBpdHMgdGhlIGxvY2FsbmFtZSBvZiB0aGUgaW5mb3NldCBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlcgorICAgICAqLworICAgIFN0cmluZyBnZXRQYXJ0TmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL1BhcmFtZXRlckJpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC9QYXJhbWV0ZXJCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhOWI2YQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC9QYXJhbWV0ZXJCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsOworCisvKioKKyAqIERlbm90ZXMgdGhlIGJpbmRpbmcgb2YgYSBwYXJhbWV0ZXIuCisgKgorICogPHA+CisgKiBUaGlzIGlzIHNvbWV3aGF0IGxpa2UgYW4gZW51bWVyYXRpb24gKGJ1dCBpdCBpcyA8Yj5OT1Q8L2I+IGFuIGVudW1lcmF0aW9uLikKKyAqCisgKiA8cD4KKyAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlCisgKiBCT0RZLCBIRUFERVIsIFVOQk9VTkQsIGFuZCBBVFRBQ0hNRU5ULiBCT0RZLCBIRUFERVIsIGFuZCBVTkJPVU5ECisgKiBoYXMgYSBzaW5nbGV0b24gc2VtYW50aWNzLCBidXQgdGhlcmUgYXJlIG11bHRpcGxlIEFUVEFDSE1FTlQgaW5zdGFuY2VzCisgKiBhcyBpdCBjYXJyaWVzIGFkZGl0aW9uYWwgTUlNRSB0eXBlIHBhcmFtZXRlci4KKyAqCisgKiA8cD4KKyAqIFNvIGRvbid0IHVzZSAnPT0nIGZvciB0ZXN0aW5nIHRoZSBlcXVhbGl0eS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhcmFtZXRlckJpbmRpbmcgeworICAgIC8qKgorICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZSB0aGF0IHJlcHJlc2VudHMgJ0JPRFknCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJhbWV0ZXJCaW5kaW5nIEJPRFkgPSBuZXcgUGFyYW1ldGVyQmluZGluZyhLaW5kLkJPRFksbnVsbCk7CisgICAgLyoqCisgICAgICogU2luZ2xldG9uIGluc3RhbmNlIHRoYXQgcmVwcmVzZW50cyAnSEVBREVSJworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyYW1ldGVyQmluZGluZyBIRUFERVIgPSBuZXcgUGFyYW1ldGVyQmluZGluZyhLaW5kLkhFQURFUixudWxsKTsKKyAgICAvKioKKyAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2UgdGhhdCByZXByZXNlbnRzICdVTkJPVU5EJywKKyAgICAgKiBtZWFuaW5nIHRoZSBwYXJhbWV0ZXIgZG9lc24ndCBoYXZlIGEgcmVwcmVzZW50YXRpb24gaW4gYSBTT0FQIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJhbWV0ZXJCaW5kaW5nIFVOQk9VTkQgPSBuZXcgUGFyYW1ldGVyQmluZGluZyhLaW5kLlVOQk9VTkQsbnVsbCk7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB0aGF0IHJlcHJlc2VudHMgdGhlIGF0dGFjaG1lbnQKKyAgICAgKiB3aXRoIGEgZ2l2ZW4gTUlNRSB0eXBlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVE9ETzogc2hhbGwgd2UgY29uc2lkZXIgZ2l2aW50IHRoZSBzaW5nbGV0b24gc2VtYW50aWNzIGJ5IHVzaW5nCisgICAgICogYSBjYWNoZT8gSXQncyBtb3JlIGVsZWdhbnQgdG8gZG8gc28sIGJ1dAorICAgICAqIG5vIHdoZXJlIGluIEpBWC1XUyBSSSB0d28ge0BsaW5rIFBhcmFtZXRlckJpbmRpbmd9cyBhcmUgY29tcGFyZWQgdG9kYXksCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJhbWV0ZXJCaW5kaW5nIGNyZWF0ZUF0dGFjaG1lbnQoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyQmluZGluZyhLaW5kLkFUVEFDSE1FTlQsbWltZVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgNCBraW5kcyBvZiBiaW5kaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBLaW5kIHsKKyAgICAgICAgQk9EWSwgSEVBREVSLCBVTkJPVU5ELCBBVFRBQ0hNRU5UOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUga2luZCBvZiB7QGxpbmsgUGFyYW1ldGVyQmluZGluZ30uCisgICAgICogQWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBLaW5kIGtpbmQ7CisKKyAgICAvKioKKyAgICAgKiBPbmx5IHVzZWQgd2l0aCBhdHRhY2htZW50IGJpbmRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWltZVR5cGU7CisKKyAgICBwcml2YXRlIFBhcmFtZXRlckJpbmRpbmcoS2luZCBraW5kLFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICB0aGlzLmtpbmQgPSBraW5kOworICAgICAgICB0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7CisgICAgfQorCisKKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBraW5kLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhpcyBiaW5kaW5nIGRvZXNuJ3QgcmVwcmVzZW50IGFuIGF0dGFjaG1lbnQuCisgICAgICogICAgICBJT1csIGlmIHtAbGluayAjaXNBdHRhY2htZW50KCl9IHJldHVybnMgZmFsc2UuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQ2FuIGJlIG51bGwsIGlmIHRoZSBNSU1FIHR5cGUgaXMgbm90IGtub3duLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7CisgICAgICAgIGlmKCFpc0F0dGFjaG1lbnQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIG1pbWVUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQm9keSgpeworICAgICAgICByZXR1cm4gdGhpcz09Qk9EWTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRlcigpeworICAgICAgICByZXR1cm4gdGhpcz09SEVBREVSOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVW5ib3VuZCgpeworICAgICAgICByZXR1cm4gdGhpcz09VU5CT1VORDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dGFjaG1lbnQoKXsKKyAgICAgICAgcmV0dXJuIGtpbmQ9PUtpbmQuQVRUQUNITUVOVDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvU0VJTW9kZWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC9TRUlNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMGE3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvU0VJTW9kZWwuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkpBWEJSSUNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlBvb2w7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKK2ltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYWJzdHJhY3Rpb24gb2YgU0VJLgorICoKKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2Ugd291bGQgYmUgdXNlZCB0byBhY2Nlc3Mgd2hpY2ggSmF2YSBjb25jZXB0cyBjb3JyZXNwb25kIHRvCisgKiB3aGljaCBXU0RMIGNvbmNlcHRzLCBzdWNoIGFzIHdoaWNoIDxjb2RlPndzZGw6cG9ydDwvY29kZT4gY29ycmVzcG9uZHMgdG8KKyAqIGEgU0VJLCBvciB3aGljaCA8Y29kZT53c2RsOm9wZXJhdGlvbjwvY29kZT4gY29ycmVzcG9uZHMgdG8ge0BsaW5rIEphdmFNZXRob2R9LgorICoKKyAqIDxQPgorICogSXQgYWxzbyByZXRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhYmluZGluZyBkb25lIGZvciBhIFNFSTsKKyAqIHN1Y2ggYXMge0BsaW5rIEpBWEJSSUNvbnRleHR9IGFuZCB7QGxpbmsgQnJpZGdlfS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgbW9kZWwgaXMgY29uc3RydWN0ZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgSmF2YSBTRUkuIFRoZXJlZm9yZSBpdCdzCisgKiBub3QgYXZhaWxhYmxlIHdpdGgge0BsaW5rIERpc3BhdGNofSBvciB7QGxpbmsgUHJvdmlkZXJ9LiBUZWNobm9sb2dpZXMgdGhhdAorICogbmVlZCB0byB3b3JrIHJlZ2FyZGxlc3Mgb2Ygc3VjaCBzdXJmYWNlIEFQSSBkaWZmZXJlbmNlIHNoYWxsIG5vdCBiZSB1c2luZworICogdGhpcyBtb2RlbC4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNFSU1vZGVsIHsKKyAgICBQb29sLk1hcnNoYWxsZXIgZ2V0TWFyc2hhbGxlclBvb2woKTsKKworICAgIC8qKgorICAgICAqIEpBWEJDb250ZXh0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1hcnNoYWxsL3VubWFyc2hhbGwgdGhlIGphdmEgY2xhc3NlcyBmb3VuZCBpbiB0aGUgU0VJLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+e0BsaW5rIEpBWEJSSUNvbnRleHR9PC9jb2RlPgorICAgICAqLworICAgIEpBWEJSSUNvbnRleHQgZ2V0SkFYQkNvbnRleHQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgQnJpZGdlIGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rIFR5cGVSZWZlcmVuY2V9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPntAbGluayBCcmlkZ2V9PC9jb2RlPiBmb3IgdGhlIDxjb2RlPnR5cGU8L2NvZGU+CisgICAgICovCisvLyAgICBCcmlkZ2UgZ2V0QnJpZGdlKFR5cGVSZWZlcmVuY2UgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBJdHMgYSBrbm93biBmYXVsdCBpZiB0aGUgZXhjZXB0aW9uIHRocm93biBieSB7QGxpbmsgTWV0aG9kfSBpcyBhbm5vdGF0ZWQgd2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgamF2YXgueG1sLndzLldlYkZhdWx0I25hbWUoKX0gdGhhcyBlcXVhbCB0byB0aGUgbmFtZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgICBpcyB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgZmF1bHQgZGV0YWlsIGVsZW1lbnQgYXMgc3BlY2lmaWVkIGJ5IHdzZGw6ZmF1bHRAZWxlbWVudCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIGlzIHRoZSBKYXZhIHtAbGluayBNZXRob2R9CisgICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPm5hbWU8L2NvZGU+IGlzIHRoZSBuYW1lCisgICAgICogICAgICAgICBvZiBhIGtub3duIGZhdWx0IG5hbWUgZm9yIHRoZSA8Y29kZT5tZXRob2Q8L2NvZGU+CisgICAgICovCisvLyAgICBib29sZWFuIGlzS25vd25GYXVsdChRTmFtZSBuYW1lLCBNZXRob2QgbWV0aG9kKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUge0BsaW5rIEphdmFNZXRob2R9IGZvciB0aGUge0BsaW5rIE1ldGhvZH0ga25vd25zIHRoZSBleGNlcHRpb24gY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbSAge0BsaW5rIE1ldGhvZH0gdG8gcGlja3VwIHRoZSByaWdodCB7QGxpbmsgSmF2YU1ldGhvZH0gbW9kZWwKKyAgICAgKiBAcGFyYW0gZXggZXhjZXB0aW9uIGNsYXNzCisgICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPmV4PC9jb2RlPiBpcyBhIENoZWNrZWQgRXhjZXB0aW9uCisgICAgICogICAgICAgICBmb3IgPGNvZGU+bTwvY29kZT4KKyAgICAgKi8KKy8vICAgIGJvb2xlYW4gaXNDaGVja2VkRXhjZXB0aW9uKE1ldGhvZCBtLCBDbGFzcyBleCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWZ1bCB0byBnZXQgdGhlIHtAbGluayBKYXZhTWV0aG9kfSBjb3JycmVzcG9uZGlvbmcgdG8KKyAgICAgKiBhIHtAbGluayBNZXRob2R9IC0gc3VjaCBhcyBvbiB0aGUgY2xpZW50IHNpZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kIGZvciB3aGljaCB7QGxpbmsgSmF2YU1ldGhvZH0gaXMgYXNrZWQgZm9yCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEphdmFNZXRob2R9IHJlcHJlc2VudGluZyB0aGUgPGNvZGU+bWV0aG9kPC9jb2RlPgorICAgICAqLworICAgIEphdmFNZXRob2QgZ2V0SmF2YU1ldGhvZChNZXRob2QgbWV0aG9kKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIGEge0BsaW5rIEphdmFNZXRob2R9IGZvciBhIGdpdmVuIHtAbGluayBRTmFtZX0uIFRoZSB7QGxpbmsgUU5hbWV9IHdpbGwKKyAgICAgKiBiZSBlcXVpdmFsZW50IHRvIHRoZSBTT0FQIEJvZHkgb3IgSGVhZGVyIGJsb2NrIG9yIGNhbiBzaW1wbHkgYmUgdGhlIG5hbWUgb2YgYW4KKyAgICAgKiBpbmZvc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHBheWxvYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIG9wZXJhdGlvbiBuYW1lZCBuYW1lCisgICAgICovCisgICAgcHVibGljIEphdmFNZXRob2QgZ2V0SmF2YU1ldGhvZChRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIGFsbCB0aGUge0BsaW5rIEphdmFNZXRob2R9IGZvciBhIHdzZGw6cG9ydCBmb3Igd2hpY2ggdGhpcyB7QGxpbmsgU0VJTW9kZWx9IGlzCisgICAgICogY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgQ29sbGVjdGlvbn0gb2Yge0BsaW5rIEphdmFNZXRob2R9CisgICAgICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBTRUlNb2RlbH0KKyAgICAgKi8KKyAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBKYXZhTWV0aG9kPiBnZXRKYXZhTWV0aG9kcygpOworCisgICAgLyoqCisgICAgICogTG9jYXRpb24gb2YgdGhlIFdTREwgdGhhdCBkZWZpbmVzIHRoZSBwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rIFNFSU1vZGVsfQorICAgICAqCisgICAgICogQHJldHVybiB3c2RsIGxvY2F0aW9uIHVyaSAtIGFsd2F5cyBub24tbnVsbAorICAgICAqLworICAgIEBOb3ROdWxsIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIHdzZGw6c2VydmljZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgU0VJTW9kZWwpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdzZGw6c2VydmljZUBuYW1lIHZhbHVlIC0gYWx3YXlzIG5vbi1udWxsCisgICAgICovCisgICAgQE5vdE51bGwgUU5hbWUgZ2V0U2VydmljZVFOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgV1NETFBvcnR9IHRoYXQgcmVwcmVzZW50cyB0aGUgcG9ydCB0aGF0IHRoaXMgU0VJIGJpbmRzIHRvLgorICAgICAqLworICAgIEBOb3ROdWxsIFdTRExQb3J0IGdldFBvcnQoKTsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSB3c2RsOnBvcnQgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBTRUlNb2RlbCkKKyAgICAgKgorICAgICAqIEByZXR1cm4gd3NkbDpzZXJ2aWNlL3dzZGw6cG9ydEBuYW1lIHZhbHVlLCBhbHdheXMgbm9uLW51bGwKKyAgICAgKi8KKyAgICBATm90TnVsbCBRTmFtZSBnZXRQb3J0TmFtZSgpOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Ygd3NkbDpwb3J0VHlwZSBib3VuZCB0byB0aGUgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBTRUlNb2RlbCkKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBATm90TnVsbCBRTmFtZSBnZXRQb3J0VHlwZU5hbWUoKTsKKworICAgIC8qKgorICAgICAqICBHaXZlcyB0aGUgd3NkbDpiaW5kaW5nQG5hbWUgdmFsdWUKKyAgICAgKi8KKyAgICBATm90TnVsbCBRTmFtZSBnZXRCb3VuZFBvcnRUeXBlTmFtZSgpOworCisgICAgLyoqCisgICAgICogTmFtZXNwYWNlIG9mIHRoZSB3c2Q7OnBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgU0VJTW9kZWwpCisgICAgICovCisgICAgQE5vdE51bGwgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3NvYXAvU09BUEJpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC9zb2FwL1NPQVBCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMTczMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC9zb2FwL1NPQVBCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuc29hcDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuSmF2YU1ldGhvZDsKKworaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOworaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKK2ltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOworCisvKioKKyAqIE1vZGVscyBzb2FwOmJpbmRpbmcgaW4gYSBXU0RMIGRvY3VtZW50IG9yIGEge0BsaW5rIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nfSBhbm5vdGF0aW9uLiBUaGlzCisgKiBjYW4gYmUgdGhlIHJldHVybiBvZiB7QGxpbmsgSmF2YU1ldGhvZCNnZXRCaW5kaW5nKCl9LgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBTT0FQQmluZGluZyB7CisgICAgcHJvdGVjdGVkIFVzZSB1c2UgPSBVc2UuTElURVJBTDsKKyAgICBwcm90ZWN0ZWQgU3R5bGUgc3R5bGUgPSBTdHlsZS5ET0NVTUVOVDsKKyAgICBwcm90ZWN0ZWQgU09BUFZlcnNpb24gc29hcFZlcnNpb24gPSBTT0FQVmVyc2lvbi5TT0FQXzExOworICAgIHByb3RlY3RlZCBTdHJpbmcgc29hcEFjdGlvbiA9ICIiOworCisgICAgLyoqCisgICAgICogR2V0IHtAbGluayBVc2V9IHN1Y2ggYXMgPGNvZGU+bGl0ZXJhbDwvY29kZT4gb3IgPGNvZGU+ZW5jb2RlZDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFVzZSBnZXRVc2UoKSB7CisgICAgICAgIHJldHVybiB1c2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHtAbGluayBTdHlsZX0gLSBzdWNoIGFzIDxjb2RlPmRvY3VtZW50PC9jb2RlPiBvciA8Y29kZT5ycGM8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHlsZSBnZXRTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0eWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIFNPQVBWZXJzaW9ufQorICAgICAqLworICAgIHB1YmxpYyBTT0FQVmVyc2lvbiBnZXRTT0FQVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHNvYXBWZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpdHMgZG9jdW1lbnQvbGl0ZXJhbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRG9jTGl0KCkgeworICAgICAgICByZXR1cm4gc3R5bGUgPT0gU3R5bGUuRE9DVU1FTlQgJiYgdXNlID09IFVzZS5MSVRFUkFMOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgcnBjL2xpdGVyYWwgYmluZGluZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUnBjTGl0KCkgeworICAgICAgICByZXR1cm4gc3R5bGUgPT0gU3R5bGUuUlBDICYmIHVzZSA9PSBVc2UuTElURVJBTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiA8Y29kZT53c2RsOmJpbmRpbmcvd3NkbDpvcGVyYXRpb24vc29hcDpvcGVyYXRpb25Ac29hcEFjdGlvbjwvY29kZT4gYXR0cmlidXRlIG9yCisgICAgICoge0BsaW5rIFdlYk1ldGhvZCNhY3Rpb24oKX0gYW5ub3RhdGlvbi4KKyAgICAgKiA8cHJlPgorICAgICAqIEZvciBleGFtcGxlOgorICAgICAqICZsdDt3c2RsOmJpbmRpbmcgbmFtZT0iSGVsbG9CaW5kaW5nIiB0eXBlPSJ0bnM6SGVsbG8iPgorICAgICAqICAgJmx0O3NvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+CisgICAgICogICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob0RhdGEiPgorICAgICAqICAgICAgICZsdDtzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgorICAgICAqIC4uLgorICAgICAqIDwvcHJlPgorICAgICAqIEl0J3MgYWx3YXlzIG5vbi1udWxsLiBzb2FwIG1lc3NhZ2Ugc2VyaWFsaXplciBuZWVkcyB0byBnZW5lcmF0ZWQgU09BUEFjdGlvbiBIVFRQIGhlYWRlciB3aXRoCisgICAgICogdGhlIHJldHVybiBvZiB0aGlzIG1ldGhvZCBlbmNsb3NlZCBpbiBxdW90ZXMoIiIpLgorICAgICAqCisgICAgICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQjc29hcEFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUEFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETEJvdW5kT3BlcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMQm91bmRPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjZlOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETEJvdW5kT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQWJzdHJhY3RzIHdzZGw6YmluZGluZy93c2RsOm9wZXJhdGlvbi4gSXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwYXJ0cyBhbmQgdGhlaXIgYmluZGluZy4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExCb3VuZE9wZXJhdGlvbiBleHRlbmRzIFdTRExPYmplY3QsIFdTRExFeHRlbnNpYmxlIHsKKyAgICAvKioKKyAgICAgKiBTaG9ydC1jdXQgZm9yIHtAY29kZSBnZXRPcGVyYXRpb24oKS5nZXROYW1lKCl9CisgICAgICovCisgICAgQE5vdE51bGwgUU5hbWUgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgc29hcGJpbmRpbmc6b3BlcmF0aW9uQHNvYXBBY3Rpb24gdmFsdWUuIHNvYXBiaW5kaW5nOm9wZXJhdGlvbkBzb2FwQWN0aW9uIGlzIG9wdGlvbmFsIGF0dHJpYnV0ZS4KKyAgICAgKiBJZiBub3QgcHJlc2VudCBhbiBlbXB0eSBTdHJpbmcgaXMgcmV0dXJuZWQgYXMgcGVyIEJQIDEuMSBSMjc0NS4KKyAgICAgKi8KKyAgICBATm90TnVsbCBTdHJpbmcgZ2V0U09BUEFjdGlvbigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbiBtb2RlbCAtIHtAbGluayBXU0RMT3BlcmF0aW9ufSwKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kaW5nIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWx3YXlzIHNhbWUge0BsaW5rIFdTRExPcGVyYXRpb259CisgICAgICovCisgICAgQE5vdE51bGwgV1NETE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNvYXBiaW5kaW5nOmJpbmRpbmcvb3BlcmF0aW9uL3dzYXc6QW5vbnltb3VzLiBBIGRlZmF1bHQgdmFsdWUgb2YgT1BUSU9OQUwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFub255bW91cyB2YWx1ZSBvZiB0aGUgb3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIEFOT05ZTU9VUyBnZXRBbm9ueW1vdXMoKTsKKworICAgIGVudW0gQU5PTllNT1VTIHsgb3B0aW9uYWwsIHJlcXVpcmVkLCBwcm9oaWJpdGVkIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExCb3VuZFBvcnRUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMQm91bmRQb3J0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOThkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMQm91bmRQb3J0VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGw7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICoge0BsaW5rIFdTRExQb3J0VHlwZX0gYm91bmQgd2l0aCBhIHNwZWNpZmljIGJpbmRpbmcuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGludGVyZmFjZSBXU0RMQm91bmRQb3J0VHlwZSBleHRlbmRzIFdTRExGZWF0dXJlZE9iamVjdCwgV1NETEV4dGVuc2libGUgeworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHdzZGw6YmluZGluZ0BuYW1lIGF0dHJpYnV0ZSB2YWx1ZSBhcyBsb2NhbCBuYW1lIGFuZCB3c2RsOmRlZmluaXRpb25zQHRhcmdldE5hbWVzcGFjZQorICAgICAqIGFzIHRoZSBuYW1lc3BhY2UgdXJpLgorICAgICAqLworICAgIFFOYW1lIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBXU0RMTW9kZWx9IHRoYXQgb3ducyB0aGlzIHBvcnQgdHlwZS4KKyAgICAgKi8KKyAgICBATm90TnVsbCBXU0RMTW9kZWwgZ2V0T3duZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBXU0RMQm91bmRPcGVyYXRpb259IGZvciBhIGdpdmVuIG9wZXJhdGlvbiBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZSBub24tbnVsbCBvcGVyYXRpb25OYW1lCisgICAgICogQHJldHVybiBudWxsIGlmIGEge0BsaW5rIFdTRExCb3VuZE9wZXJhdGlvbn0gaXMgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIFdTRExCb3VuZE9wZXJhdGlvbiBnZXQoUU5hbWUgb3BlcmF0aW9uTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB3c2RsOmJpbmRpbmdAdHlwZSB2YWx1ZSwgc2FtZSBhcyB7QGxpbmsgV1NETFBvcnRUeXBlI2dldE5hbWUoKX0KKyAgICAgKi8KKyAgICBRTmFtZSBnZXRQb3J0VHlwZU5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBXU0RMUG9ydFR5cGV9IGFzc29jaWF0ZWQgd2l0aCB0aGUgd3NkbDpiaW5kaW5nCisgICAgICovCisgICAgV1NETFBvcnRUeXBlIGdldFBvcnRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgV1NETEJvdW5kT3BlcmF0aW9ufXMKKyAgICAgKi8KKyAgICBJdGVyYWJsZTw/IGV4dGVuZHMgV1NETEJvdW5kT3BlcmF0aW9uPiBnZXRCaW5kaW5nT3BlcmF0aW9ucygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmluZGluZyBJRC4KKyAgICAgKiBUaGlzIHdvdWxkIHR5cGljYWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBiaW5kaW5nIGV4dGVuc2lvbiBlbGVtZW50cyBpbiB3c2RsOmJpbmRpbmcuCisgICAgICovCisgICAgQmluZGluZ0lEIGdldEJpbmRpbmdJZCgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYm91bmQgb3BlcmF0aW9uIGluIHRoaXMgcG9ydCBmb3IgYSB0YWcgbmFtZS4gSGVyZSB0aGUgb3BlcmF0aW9uIHdvdWxkIGJlIHRoZSBvbmUgd2hvc2UKKyAgICAgKiBpbnB1dCBwYXJ0IGRlc2NyaXB0b3IgYm91bmQgdG8gc29hcDpib2R5IGlzIHNhbWUgYXMgdGhlIHRhZyBuYW1lIGV4Y2VwdCBmb3IgcnBjbGl0IHdoZXJlIHRoZSB0YWcKKyAgICAgKiBuYW1lIHdvdWxkIGJlIHtAbGluayBXU0RMQm91bmRPcGVyYXRpb24jZ2V0TmFtZSgpfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHlvdSBoYXZlIGEge0BsaW5rIE1lc3NhZ2V9IGFuZCB0cnlpbmcgdG8gZmlndXJlIG91dCB3aGljaCBvcGVyYXRpb24gaXQgYmVsb25ncyB0bywKKyAgICAgKiBhbHdheXMgdXNlIHtAbGluayBNZXNzYWdlI2dldE9wZXJhdGlvbn0sIGFzIHRoYXQgcGVyZm9ybXMgYmV0dGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUgdGhpcyBjYW4gYmUgdXNlZCBpbiB0aGUgY2FzZSB3aGVuIGEgbWVzc2FnZSByZWNlaXBpZW50IGNhbiBnZXQgdGhlCisgICAgICoge0BsaW5rIFdTRExCb3VuZE9wZXJhdGlvbn0gZnJvbSB0aGUgcGF5bG9hZCB0YWcgbmFtZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIG5hbWVzcGFjZVVyaSBhbmQgdGhlIGxvY2FsIG5hbWUgYm90aCBjYW4gYmUgbnVsbCB0byBnZXQgdGhlIFdTRExCb3VuZE9wZXJhdGlvbiB0aGF0IGhhcyBlbXB0eSBib2R5IC0KKyAgICAgKiB0aGVyZSBpcyBubyBwYXlsb2FkLiBBY2NvcmRpbmcgdG8gQlAgMS4xIGluIGEgcG9ydCB0aGVyZSBjYW4gYmUgYXQgTU9TVCBvbmUgb3BlcmF0aW9uIHdpdGggZW1wdHkgYm9keS4KKyAgICAgKiBJdHMgYW4gZXJyb3IgdG8gaGF2ZSBuYW1lc3BhY2UgVVJJIG5vbi1udWxsIGJ1dCBsb2NhbCBuYW1lIGFzIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIG5hbWVzcGFjZSBvZiB0aGUgcGF5bG9hZCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgbG9jYWwgbmFtZSBvZiB0aGUgcGF5bG9hZAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbG9jYWxOYW1lIGlzIG51bGwgYW5kIG5hbWVzcGFjZVVyaSBpcyBub3QuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiBubyBvcGVyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gdGFnIG5hbWUgaXMgZm91bmQuCisgICAgICovCisgICAgQE51bGxhYmxlIFdTRExCb3VuZE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oU3RyaW5nIG5hbWVzcGFjZVVyaSwgU3RyaW5nIGxvY2FsTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMRGVzY3JpcHRvcktpbmQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExEZXNjcmlwdG9yS2luZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjAxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMRGVzY3JpcHRvcktpbmQuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGw7CisKKy8qKgorICogRW51bWVyYXRpb24gdGhhdCB0ZWxscyBhIHdzZGw6cGFydCB0aGF0IGNhbiBiZSBkZWZpbmVkIGVpdGhlciB1c2luZyBhIHR5cGUKKyAqIGF0dHJpYnV0ZSBvciBhbiBlbGVtZW50IGF0dHJpYnV0ZS4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgZW51bSBXU0RMRGVzY3JpcHRvcktpbmQgeworICAgIC8qKgorICAgICAqIHdzZGw6cGFydCBpcyBkZWZpbmVkIHVzaW5nIGVsZW1lbnQgYXR0cmlidXRlLgorICAgICAqCisgICAgICogPHByZT4KKyAgICAgKiBmb3IgZXhtYXBsZSwKKyAgICAgKiAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImZvbyIgZWxlbWVudD0ibnMxOkZvb0VsZW1lbnQiPgorICAgICAqIDwvcHJlPgorICAgICAqLworICAgIEVMRU1FTlQoMCksCisKKyAgICAvKioKKyAgICAgKiB3c2RsOnBhcnQgaXMgZGVmaW5lZCB1c2luZyB0eXBlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogZm9yIGV4bWFwbGUsCisgICAgICogJmx0O3dzZGw6cGFydCBuYW1lPSJmb28iIGVsZW1lbnQ9Im5zMTpGb29UeXBlIj4KKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBUWVBFKDEpOworCisgICAgV1NETERlc2NyaXB0b3JLaW5kKGludCB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMRXh0ZW5zaWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETEV4dGVuc2libGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjNiODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETEV4dGVuc2libGUuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGw7CisKKy8qKgorICogSW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBXU0RMIGNvbmNlcHRzIHRoYXQKKyAqIGNhbiBoYXZlIGV4dGVuc2lvbnMuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBXU0RMRXh0ZW5zaWJsZSBleHRlbmRzIFdTRExPYmplY3QgeworICAgIC8qKgorICAgICAqIEdldHMgYWxsIHRoZSB7QGxpbmsgV1NETEV4dGVuc2lvbn1zCisgICAgICogYWRkZWQgdGhyb3VnaCB7QGxpbmsgI2FkZEV4dGVuc2lvbihXU0RMRXh0ZW5zaW9uKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBuZXZlciBudWxsLgorICAgICAqLworICAgIEl0ZXJhYmxlPFdTRExFeHRlbnNpb24+IGdldEV4dGVuc2lvbnMoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYWxsIHRoZSBleHRlbnNpb25zIHRoYXQgaXMgYXNzaWduYWJsZSB0byB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gZmluZCBzcGVjaWZpYyBleHRlbnNpb25zIGluIGEgdHlwZS1zYWZlCisgICAgICogYW5kIGNvbnZlbmllbnQgd2F5LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgIFRoZSB0eXBlIG9mIHRoZSBleHRlbnNpb24gdG8gb2J0YWluLiBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQ2FuIGJlIGFuIGVtcHR5IGNvbGxlY3Rpb24gYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgPFQgZXh0ZW5kcyBXU0RMRXh0ZW5zaW9uPiBJdGVyYWJsZTxUPiBnZXRFeHRlbnNpb25zKENsYXNzPFQ+IHR5cGUpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYXNzaWduYWJsZSB0byB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbnQgdmVyc2lvbiB0aGF0IGRvZXMKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogSXRlcmF0b3IgaXRyID0gZ2V0RXh0ZW5zaW9ucyh0eXBlKTsKKyAgICAgKiBpZihpdHIuaGFzTmV4dCgpKSAgcmV0dXJuIGl0ci5uZXh0KCk7CisgICAgICogZWxzZSAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiB0aGUgZXh0ZW5zaW9uIHdhcyBub3QgZm91bmQuCisgICAgICovCisgICAgPFQgZXh0ZW5kcyBXU0RMRXh0ZW5zaW9uPiBUIGdldEV4dGVuc2lvbihDbGFzczxUPiB0eXBlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcge0BsaW5rIFdTRExFeHRlbnNpb259CisgICAgICogdG8gdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uCisgICAgICogICAgICBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHZvaWQgYWRkRXh0ZW5zaW9uKFdTRExFeHRlbnNpb24gZXh0ZW5zaW9uKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExFeHRlbnNpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExFeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTg3OTNjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETEV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogUmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcHJvZ3JhbXMgdGhhdCBidWlsZAorICogb24gdG9wIG9mIHRoZSBKQVgtV1MgUkksIHRvIGhvb2sgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbnRvCisgKiB7QGxpbmsgV1NETE1vZGVsfS4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExFeHRlbnNpb24geworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudCBvciBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMRmF1bHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExGYXVsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzVhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMRmF1bHQuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGw7CisKKy8qKgorICogQWJzdHJhY3RzIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24vd3NkbDpmYXVsdAorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV1NETEZhdWx0IGV4dGVuZHMgV1NETE9iamVjdCwgV1NETEV4dGVuc2libGUgeworICAgIC8qKgorICAgICAqIEdpdmVzIHdzZGw6ZmF1bHRAbmFtZSB2YWx1ZQorICAgICAqLworICAgIFN0cmluZyBnZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgV1NETE1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB3c2RsOmZhdWx0QG1lc3NhZ2UKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGVudGlyZSBXU0RMTW9kZWwgaXMgYnVpbHQuIEJhc2ljYWxseSBhZnRlciB0aGUgV1NETE1vZGVsIGlzIGJ1aWx0CisgICAgICogYWxsIHRoZSByZWZlcmVuY2VzIGFyZSByZXNvbHZlIGluIGEgcG9zdCBwcm9jZXNzaW5nIHBoYXNlLiBJT1csIHRoZSBXU0RMIGV4dGVuc2lvbnMgc2hvdWxkCisgICAgICogbm90IGNhbGwgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFsd2F5cyByZXR1cm5zIG51bGwgd2hlbiBjYWxsZWQgZnJvbSBpbnNpZGUgV1NETCBleHRlbnNpb25zLgorICAgICAqLworICAgIFdTRExNZXNzYWdlIGdldE1lc3NhZ2UoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExGZWF0dXJlZE9iamVjdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETEZlYXR1cmVkT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxMWVjOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExGZWF0dXJlZE9iamVjdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTRmVhdHVyZUxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb247CisKK2ltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworCisvKioKKyAqIHtAbGluayBXU0RMT2JqZWN0fSB0aGF0IGNhbiBoYXZlIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqCisgKiA8cD4KKyAqIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufXMgY2FuIGFkZCBmZWF0dXJlcyB0byB0aGlzIG9iamVjdCwKKyAqIHdoaWNoIHdpbGwgdGhlbiBiZSBpbmNvcnBvcmF0ZWQgd2hlbiB7QGxpbmsgRGlzcGF0Y2h9cyBhbmQKKyAqIHByb3hpZXMgYXJlIGNyZWF0ZWQgZm9yIHRoZSBwb3J0LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBXU0RMRmVhdHVyZWRPYmplY3QgZXh0ZW5kcyBXU0RMT2JqZWN0IHsKKworICAgIEBOdWxsYWJsZQorICAgIDxGIGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmU+IEYgZ2V0RmVhdHVyZShATm90TnVsbCBDbGFzczxGPiBmZWF0dXJlVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmZWF0dXJlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIEBOb3ROdWxsIFdTRmVhdHVyZUxpc3QgZ2V0RmVhdHVyZXMoKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgYSB7QGxpbmsgV2ViU2VydmljZUZlYXR1cmV9IGJhc2VkIHVwb24gcG9saWN5IGFzc2VydGlvbnMgb24gdGhpcyBwb3J0LgorICAgICAqIFRoaXMgbWV0aG9kIHdvdWxkIGJlIGNhbGxlZCBkdXJpbmcgV1NETCBwYXJzaW5nIGJ5IFdTLVBvbGljeSBjb2RlLgorICAgICAqLworICAgIHZvaWQgYWRkRmVhdHVyZShATm90TnVsbCBXZWJTZXJ2aWNlRmVhdHVyZSBmZWF0dXJlKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExJbnB1dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETElucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlMGFmOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExJbnB1dC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbDsKKworLyoqCisgKiBBYnN0cmFjdGlvbiBvZiB3c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uL3dzZGw6aW5wdXQKKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExJbnB1dCBleHRlbmRzIFdTRExPYmplY3QsIFdTRExFeHRlbnNpYmxlIHsKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbi93c2RsOmlucHV0QG5hbWUKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIFdTRExNZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gd3NkbDppbnB1dEBtZXNzYWdlCisgICAgICogPHAvPgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZW50aXJlIFdTRExNb2RlbCBpcyBidWlsdC4gQmFzaWNhbGx5IGFmdGVyIHRoZSBXU0RMTW9kZWwgaXMgYnVpbHQKKyAgICAgKiBhbGwgdGhlIHJlZmVyZW5jZXMgYXJlIHJlc29sdmUgaW4gYSBwb3N0IHByb2Nlc3NpbmcgcGhhc2UuIElPVywgdGhlIFdTREwgZXh0ZW5zaW9ucyBzaG91bGQKKyAgICAgKiBub3QgY2FsbCB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQWx3YXlzIHJldHVybnMgbnVsbCB3aGVuIGNhbGxlZCBmcm9tIGluc2lkZSBXU0RMIGV4dGVuc2lvbnMuCisgICAgICovCisgICAgV1NETE1lc3NhZ2UgZ2V0TWVzc2FnZSgpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIEFjdGlvbiBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgdmFsdWUgZm9yCisgICAgICoge0BsaW5rIHRoaXN9IG1lc3NhZ2UuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHRoZSBjb3JyZWN0IHZhbHVlIGlycmVzcGVjdGl2ZSBvZgorICAgICAqIHdoZXRoZXIgdGhlIEFjdGlvbiBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGUgV1NETCBvcgorICAgICAqIGltcGxpY2l0bHkgZGVyaXZlZCB1c2luZyB0aGUgcnVsZXMgZGVmaW5lZCBpbiBXUy1BZGRyZXNzaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBBY3Rpb24KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0QWN0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMTWVzc2FnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETE1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2JhMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGw7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIEFic3RyYWN0aW9uIG9mIHdzZGw6bWVzc2FnZS4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExNZXNzYWdlIGV4dGVuZHMgV1NETE9iamVjdCwgV1NETEV4dGVuc2libGUgeworICAgIC8qKgorICAgICAqIEdpdmVzIHdzZGw6bWVzc2FnZUBuYW1lIHZhbHVlLgorICAgICAqLworICAgIFFOYW1lIGdldE5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExNb2RlbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETE1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5NDhhMQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGw7CisKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLlJ1bnRpbWVXU0RMUGFyc2VyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFByb3ZpZGVzIGFic3RyYWN0aW9uIG9mIHdzZGw6ZGVmaW5pdGlvbnMuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGludGVyZmFjZSBXU0RMTW9kZWwgZXh0ZW5kcyBXU0RMRXh0ZW5zaWJsZSB7CisgICAgLyoqCisgICAgICogR2V0cyB7QGxpbmsgV1NETFBvcnRUeXBlfSB0aGF0IG1vZGVscyA8Y29kZT53c2RsOnBvcnRUeXBlPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgbm9uLW51bGwgcXVhaWZpZWQgbmFtZSBvZiB3c2RsOm1lc3NhZ2UsIHdoZXJlIHRoZSBsb2NhbE5hbWUgaXMgdGhlIHZhbHVlIG9mIDxjb2RlPndzZGw6cG9ydFR5cGVAbmFtZTwvY29kZT4gYW5kCisgICAgICogICAgICAgICAgICAgdGhlIG5hbWVzcGFjZVVSSSBpcyB0aGUgdmFsdWUgb2Ygd3NkbDpkZWZpbml0aW9uc0B0YXJnZXROYW1lc3BhY2UKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0VHlwZX0gb3IgbnVsbCBpZiBubyB3c2RsOnBvcnRUeXBlIGZvdW5kLgorICAgICAqLworICAgIFdTRExQb3J0VHlwZSBnZXRQb3J0VHlwZShATm90TnVsbCBRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEdldHMge0BsaW5rIFdTRExCb3VuZFBvcnRUeXBlfSB0aGF0IG1vZGVscyA8Y29kZT53c2RsOmJpbmRpbmc8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBub24tbnVsbCBxdWFpZmllZCBuYW1lIG9mIHdzZGw6YmluZGluZywgd2hlcmUgdGhlIGxvY2FsTmFtZSBpcyB0aGUgdmFsdWUgb2YgPGNvZGU+d3NkbDpiaW5kaW5nQG5hbWU8L2NvZGU+IGFuZAorICAgICAqICAgICAgICAgICAgIHRoZSBuYW1lc3BhY2VVUkkgaXMgdGhlIHZhbHVlIG9mIHdzZGw6ZGVmaW5pdGlvbnNAdGFyZ2V0TmFtZXNwYWNlCisgICAgICogQHJldHVybiBBIHtAbGluayBXU0RMQm91bmRQb3J0VHlwZX0gb3IgbnVsbCBpZiBubyB3c2RsOmJpbmRpbmcgZm91bmQKKyAgICAgKi8KKyAgICBXU0RMQm91bmRQb3J0VHlwZSBnZXRCaW5kaW5nKEBOb3ROdWxsIFFOYW1lIG5hbWUpOworCisgICAgLyoqCisgICAgICogR2l2ZSBhIHtAbGluayBXU0RMQm91bmRQb3J0VHlwZX0gZm9yIHRoZSBnaXZlbiB3c2RsOnNlcnZpY2UgYW5kIHdzZGw6cG9ydCBuYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBzZXJ2aWNlIFFOYW1lCisgICAgICogQHBhcmFtIHBvcnROYW1lICAgIHBvcnQgUU5hbWUKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIFdTRExCb3VuZFBvcnRUeXBlfS4gbnVsbCBpZiB0aGUgQmluZGluZyBmb3IgdGhlIGdpdmVuIHdzZDpzZXJ2aWNlIGFuZCB3c2RsOnBvcnQgbmFtZSBhcmUgbm90CisgICAgICogICAgICAgICBmb3VuZC4KKyAgICAgKi8KKyAgICBXU0RMQm91bmRQb3J0VHlwZSBnZXRCaW5kaW5nKEBOb3ROdWxsIFFOYW1lIHNlcnZpY2VOYW1lLCBATm90TnVsbCBRTmFtZSBwb3J0TmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHtAbGluayBXU0RMU2VydmljZX0gdGhhdCBtb2RlbHMgPGNvZGU+d3NkbDpzZXJ2aWNlPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgbm9uLW51bGwgcXVhaWZpZWQgbmFtZSBvZiB3c2RsOnNlcnZpY2UsIHdoZXJlIHRoZSBsb2NhbE5hbWUgaXMgdGhlIHZhbHVlIG9mIDxjb2RlPndzZGw6c2VydmljZUBuYW1lPC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgICAgICB0aGUgbmFtZXNwYWNlVVJJIGlzIHRoZSB2YWx1ZSBvZiB3c2RsOmRlZmluaXRpb25zQHRhcmdldE5hbWVzcGFjZQorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgV1NETFNlcnZpY2V9IG9yIG51bGwgaWYgbm8gd3NkbDpzZXJ2aWNlIGZvdW5kCisgICAgICovCisgICAgV1NETFNlcnZpY2UgZ2V0U2VydmljZShATm90TnVsbCBRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIGEge0BsaW5rIE1hcH0gb2Ygd3NkbDpwb3J0VHlwZSB7QGxpbmsgUU5hbWV9IGFuZCB7QGxpbmsgV1NETFBvcnRUeXBlfQorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbXB0eSBNYXAgaWYgdGhlIHdzZGwgZG9jdW1lbnQgaGFzIG5vIHdzZGw6cG9ydFR5cGUKKyAgICAgKi8KKyAgICBATm90TnVsbCBNYXA8UU5hbWUsID8gZXh0ZW5kcyBXU0RMUG9ydFR5cGU+IGdldFBvcnRUeXBlcygpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgYSB7QGxpbmsgTWFwfSBvZiB3c2RsOmJpbmRpbmcge0BsaW5rIFFOYW1lfSBhbmQge0BsaW5rIFdTRExCb3VuZFBvcnRUeXBlfQorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbXB0eSBNYXAgaWYgdGhlIHdzZGwgZG9jdW1lbnQgaGFzIG5vIHdzZGw6YmluZGluZworICAgICAqLworICAgIEBOb3ROdWxsIE1hcDxRTmFtZSwgV1NETEJvdW5kUG9ydFR5cGU+IGdldEJpbmRpbmdzKCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyBhIHtAbGluayBNYXB9IG9mIHdzZGw6c2VydmljZSBxdWFsaWZpZWQgbmFtZSBhbmQge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExTZXJ2aWNlfQorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbXB0eSBNYXAgaWYgdGhlIHdzZGwgZG9jdW1lbnQgaGFzIG5vIHdzZGw6c2VydmljZQorICAgICAqLworICAgIEBOb3ROdWxsIE1hcDxRTmFtZSwgPyBleHRlbmRzIFdTRExTZXJ2aWNlPiBnZXRTZXJ2aWNlcygpOworCisgICAgLyoqCisgICAgICogTWFpbiBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gIHBhcnNpbmcgb2YgYSBXU0RMIGFuZCBnZXQgdGhlIHtAbGluayBXU0RMTW9kZWx9IGZyb20gaXQuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFdTRExQYXJzZXJ7CisgICAgICAgLyoqCisgICAgICAgICAqIFBhcnNlcyBXU0RMIGZyb20gdGhlIGdpdmVuIHdzZGxMb2MgYW5kIGdpdmVzIGEge0BsaW5rIFdTRExNb2RlbH0gYnVpbHQgZnJvbSBpdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHdzZGxFbnRpdHlQYXJzZXIgIFdvcmtzIGxpa2UgYW4gZW50aXR5UmVzb2x2ZXIgdG8gcmVzb2x2ZSBXU0RMcworICAgICAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgIHtAbGluayBYTUxFbnRpdHlSZXNvbHZlcn0sIHdvcmtzIGF0IFhNTCBpbmZvc2V0IGxldmVsCisgICAgICAgICAqIEBwYXJhbSBpc0NsaWVudFNpZGUgIHRydWUgLSBpdHMgaW52b2tlZCBvbiB0aGUgY2xpZW50LCBmYWxzZSBtZWFucyBpdHMgaW52b2tlZCBvbiB0aGUgc2VydmVyCisgICAgICAgICAqIEBwYXJhbSBleHRlbnNpb25zIHZhciBhcmdzIG9mIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuV1NETFBhcnNlckV4dGVuc2lvbn1zCisgICAgICAgICAqIEByZXR1cm4gQSB7QGxpbmsgV1NETE1vZGVsfSBidWlsdCBmcm9tIHRoZSBnaXZlbiB3c2RsTG9jYXRpb259CisgICAgICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgICAgICAqIEB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIFdTRExNb2RlbCBwYXJzZShYTUxFbnRpdHlSZXNvbHZlci5QYXJzZXIgd3NkbEVudGl0eVBhcnNlciwgWE1MRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIsIGJvb2xlYW4gaXNDbGllbnRTaWRlLCBXU0RMUGFyc2VyRXh0ZW5zaW9uLi4uIGV4dGVuc2lvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFJ1bnRpbWVXU0RMUGFyc2VyLnBhcnNlKHdzZGxFbnRpdHlQYXJzZXIsIHJlc29sdmVyLCBpc0NsaWVudFNpZGUsIGV4dGVuc2lvbnMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETE9iamVjdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETE9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNmE3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMT2JqZWN0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCisvKioKKyAqIE1hcmtlciBpbnRlcmZhY2Ugc2VydmVzIGFzIGJhc2UgaW50ZXJmYWNlIGZvciB0aGUgd3NkbCBtb2RlbAorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGludGVyZmFjZSBXU0RMT2JqZWN0IHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gdGhlIHBhcnNlZCBXU0RMLgorICAgICAqCisgICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBwcm9kdWNpbmcgZXJyb3IgbWVzc2FnZXMuCisgICAgICovCisgICAgQE5vdE51bGwKKyAgICBMb2NhdG9yIGdldExvY2F0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMT3BlcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhOGJhMwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogUHJvdmlkZXMgYWJzdHJhY3Rpb24gb2Ygd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExPcGVyYXRpb24gZXh0ZW5kcyBXU0RMT2JqZWN0LCBXU0RMRXh0ZW5zaWJsZSB7CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbkBuYW1lIGF0dHJpYnV0ZSB2YWx1ZSBhcyBsb2NhbCBuYW1lIGFuZCB3c2RsOmRlZmluaXRpb25zQHRhcmdldE5hbWVzcGFjZQorICAgICAqIGFzIHRoZSBuYW1lc3BhY2UgdXJpLgorICAgICAqLworICAgIEBOb3ROdWxsIFFOYW1lIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHdzZGw6aW5wdXQgb2YgdGhpcyBvcGVyYXRpb24KKyAgICAgKi8KKyAgICBATm90TnVsbCBXU0RMSW5wdXQgZ2V0SW5wdXQoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHdzZGw6b3V0cHV0IG9mIHRoaXMgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiB0aGlzIGlzIGFuIG9uZS13YXkgb3BlcmF0aW9uLgorICAgICAqLworICAgIEBOdWxsYWJsZSBXU0RMT3V0cHV0IGdldE91dHB1dCgpOworCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9wZXJhdGlvbiBpcyBhbiBvbmUtd2F5IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzT25lV2F5KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7bGluayBXU0RMRmF1bHR9IGNvcnJlc3BvbmRpbmcgdG8gd3NkbDpmYXVsdCBvZiB0aGlzIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBJdGVyYWJsZTw/IGV4dGVuZHMgV1NETEZhdWx0PiBnZXRGYXVsdHMoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHtAbGluayBXU0RMRmF1bHR9IGZvciB0aGUgZ2l2ZW4gc29hcCBmYXVsdCBkZXRhaWwgdmFsdWUuCisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqCisgICAgICogR2l2ZW4gYSB3c2RsIGZhdWx0OgorICAgICAqCisgICAgICogJmx0O3dzZGw6bWVzc2FnZSBuYWU9ImZhdWx0TWVzc2FnZSI+CisgICAgICogICZsdDt3c2RsOnBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9IjxiPm5zOm15RXhjZXB0aW9uPC9iPi8+CisgICAgICogJmx0Oy93c2RsOm1lc3NhZ2U+CisgICAgICoKKyAgICAgKiAmbHQ7d3NkbDpwb3J0VHlwZT4KKyAgICAgKiAgJmx0O3dzZGw6b3BlcmF0aW9uIC4uLj4KKyAgICAgKiAgICAgICZsdDt3c2RsOmZhdWx0IG5hbWU9ImFGYXVsdCIgbWVzc2FnZT0iZmF1bHRNZXNzYWdlIi8+CisgICAgICogICZsdDsvd3NkbDpvcGVyYXRpb24+CisgICAgICogJmx0O3dzZGw6cG9ydFR5cGU+CisgICAgICoKKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlIGdpdmVuIGEgc29hcCAxMSBzb2FwIG1lc3NhZ2U6CisgICAgICoKKyAgICAgKiAmbHQ7c29hcGVudjpGYXVsdD4KKyAgICAgKiAgICAgIC4uLgorICAgICAqICAgICAgJmx0O3NvYXBlbnY6ZGV0YWlsPgorICAgICAqICAgICAgICAgICZsdDs8Yj5uczpteUV4Y2VwdGlvbjwvYj4+CisgICAgICogICAgICAgICAgICAgIC4uLgorICAgICAqICAgICAgICAgICZsdDsvbnM6bXlFeGNlcHRpb24+CisgICAgICogICAgICAmbHQ7L3NvYXBlbnY6ZGV0YWlsPgorICAgICAqCisgICAgICogUU5hbWUgZmF1bHRRTmFtZSA9IG5ldyBRTmFtZShucywgIm15RXhjZXB0aW9uIik7CisgICAgICogV1NETEZhdWx0IHdzZGxGYXVsdCAgPSBnZXRGYXVsdChmYXVsdFFOYW1lKTsKKyAgICAgKgorICAgICAqIFRoZSBhYm92ZSBjYWxsIHdpbGwgcmV0dXJuIGEgV1NETEZhdWx0IHRoYXQgYWJzdHJhY3RzIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24vd3NkbDpmYXVsdC4KKyAgICAgKgorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIGZhdWx0RGV0YWlsTmFtZSB0YWcgbmFtZSBvZiB0aGUgZWxlbWVudCBpbnNpZGUgc29hZW52OkZhdWx0L2RldGFpbC8sIG11c3QgYmUgbm9uLW51bGwuCisgICAgICogQHJldHVybiByZXR1cm5zIG51bGwgaWYgYSB3c2RsIGZhdWx0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRldGFpbCBlbnRyeSBuYW1lIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUgV1NETEZhdWx0IGdldEZhdWx0KFFOYW1lIGZhdWx0RGV0YWlsTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgZW5jbG9zaW5nIHdzZGw6cG9ydFR5cGVAbmFtZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICovCisgICAgQE5vdE51bGwgUU5hbWUgZ2V0UG9ydFR5cGVOYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMT3V0cHV0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMT3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5Y2IyYwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExPdXRwdXQuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGw7CisKKy8qKgorICogQWJzdHJhY3Rpb24gb2Ygd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbi93c2RsOm91dHB1dAorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV1NETE91dHB1dCBleHRlbmRzIFdTRExPYmplY3QsIFdTRExFeHRlbnNpYmxlIHsKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbi93c2RsOm91dHB1dEBuYW1lCisgICAgICovCisgICAgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBXU0RMTWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIHdzZGw6b3V0cHV0QG1lc3NhZ2UKKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBlbnRpcmUgV1NETE1vZGVsIGlzIGJ1aWx0LiBCYXNpY2FsbHkgYWZ0ZXIgdGhlIFdTRExNb2RlbCBpcyBidWlsdAorICAgICAqIGFsbCB0aGUgcmVmZXJlbmNlcyBhcmUgcmVzb2x2ZSBpbiBhIHBvc3QgcHJvY2Vzc2luZyBwaGFzZS4gSU9XLCB0aGUgV1NETCBleHRlbnNpb25zIHNob3VsZAorICAgICAqIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBBbHdheXMgcmV0dXJucyBudWxsIHdoZW4gY2FsbGVkIGZyb20gaW5zaWRlIFdTREwgZXh0ZW5zaW9ucy4KKyAgICAgKi8KKyAgICBXU0RMTWVzc2FnZSBnZXRNZXNzYWdlKCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyB0aGUgQWN0aW9uIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSB2YWx1ZSBmb3IKKyAgICAgKiB7QGxpbmsgdGhpc30gbWVzc2FnZS4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgdGhlIGNvcnJlY3QgdmFsdWUgaXJyZXNwZWN0aXZlIG9mCisgICAgICogd2hldGhlciB0aGUgQWN0aW9uIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHRoZSBXU0RMIG9yCisgICAgICogaW1wbGljaXRseSBkZXJpdmVkIHVzaW5nIHRoZSBydWxlcyBkZWZpbmVkIGluIFdTLUFkZHJlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFjdGlvbgorICAgICAqLworICAgIFN0cmluZyBnZXRBY3Rpb24oKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExQYXJ0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMUGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YWI5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMUGFydC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOworCisvKioKKyAqIEFic3RyYWN0cyB3c2RsOnBhcnQgYWZ0ZXIgYXBwbHlpbmcgYmluZGluZyBpbmZvcm1hdGlvbiBmcm9tIHdzZGw6YmluZGluZy4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExQYXJ0IGV4dGVuZHMgV1NETE9iamVjdCB7CisgICAgLyoqCisgICAgICogR2V0cyB3c2RsOnBhcnRAbmFtZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICovCisgICAgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHdzZGw6cGFydCBiaW5kaW5nIGFzIHNlZW4gdGhydSB3c2RsOmJpbmRpbmcKKyAgICAgKi8KKyAgICBQYXJhbWV0ZXJCaW5kaW5nIGdldEJpbmRpbmcoKTsKKworICAgIC8qKgorICAgICAqIEluZGV4IHZhbHVlIGlzIGFzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgd3NkbDpwYXJ0IGFwcGVhcnMgaW5zaWRlIHRoZSBpbnB1dCBvciBvdXRwdXQgd3NkbDptZXNzYWdlLgorICAgICAqIEByZXR1cm4gbiB3aGVyZSBuID49IDAKKyAgICAgKi8KKyAgICBpbnQgZ2V0SW5kZXgoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBYTUwgU2NoZW1hIGRlc2NyaXB0b3IgcmVmZXJlbmNlZCB1c2luZyBlaXRoZXIgd3NkbDpwYXJ0QGVsZW1lbnQgb3Igd3NkbDpwYXJ0QHR5cGUuCisgICAgICovCisgICAgcHVibGljIFdTRExQYXJ0RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMUGFydERlc2NyaXB0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExQYXJ0RGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODNiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMUGFydERlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGw7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIEFic3RyYWN0cyB3c2RsOnBhcnQgZGVzY3JpcHRvciB0aGF0IGlzIGRlZmluZWQgdXNpbmcgZWxlbWVudCBvciB0eXBlIGF0dHJpYnV0ZS4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExQYXJ0RGVzY3JpcHRvciBleHRlbmRzIFdTRExPYmplY3QgeworICAgIC8qKgorICAgICAqIEdpdmVzIFF1YWxpZmllZCBuYW1lIG9mIHRoZSBYTUwgU2NoZW1hIGVsZW1lbnQgb3IgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBRTmFtZSBuYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyB3aGV0aGVyIHdzZGw6cGFydCByZWZlcmVuY2VzIGEgc2NoZW1hIHR5cGUgb3IgYSBnbG9iYWwgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV1NETERlc2NyaXB0b3JLaW5kIHR5cGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETFBvcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExQb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyMjQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExQb3J0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuRW5kcG9pbnRBZGRyZXNzOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBBYnN0cmFjdHMgd3NkbDpzZXJ2aWNlL3dzZGw6cG9ydAorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV1NETFBvcnQgZXh0ZW5kcyBXU0RMRmVhdHVyZWRPYmplY3QsIFdTRExFeHRlbnNpYmxlIHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHdzZGw6cG9ydEBuYW1lIGF0dHJpYnV0ZSB2YWx1ZSBhcyBsb2NhbCBuYW1lIGFuZCB3c2RsOmRlZmluaXRpb25zQHRhcmdldE5hbWVzcGFjZQorICAgICAqIGFzIHRoZSBuYW1lc3BhY2UgdXJpLgorICAgICAqLworICAgIFFOYW1lIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMge0BsaW5rIFdTRExCb3VuZFBvcnRUeXBlfSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBXU0RMUG9ydH0uCisgICAgICovCisgICAgQE5vdE51bGwKKyAgICBXU0RMQm91bmRQb3J0VHlwZSBnZXRCaW5kaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGVuZHBvaW50IGFkZHJlc3Mgb2YgdGhpcyBwb3J0LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIEVuZHBvaW50QWRkcmVzcyBnZXRBZGRyZXNzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgV1NETFNlcnZpY2V9IHRoYXQgb3ducyB0aGlzIHBvcnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgbm9uLW51bGwuCisgICAgICovCisgICAgQE5vdE51bGwKKyAgICBXU0RMU2VydmljZSBnZXRPd25lcigpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETFBvcnRUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvbW9kZWwvd3NkbC9XU0RMUG9ydFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA3YmMyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETFBvcnRUeXBlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE9wZXJhdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogQWJzdHJhY3Rpb24gb2Ygd3NkbDpwb3J0VHlwZS4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExQb3J0VHlwZSBleHRlbmRzIFdTRExPYmplY3QsIFdTRExFeHRlbnNpYmxlIHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSB3c2RsOnBvcnRUeXBlQG5hbWUgYXR0cmlidXRlIHZhbHVlIGFzIGxvY2FsIG5hbWUgYW5kIHdzZGw6ZGVmaW5pdGlvbnNAdGFyZ2V0TmFtZXNwYWNlCisgICAgICogYXMgdGhlIG5hbWVzcGFjZSB1cmkuCisgICAgICovCisgICAgcHVibGljIFFOYW1lIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBXU0RMT3BlcmF0aW9ufSBmb3IgYSBnaXZlbiBvcGVyYXRpb24gbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIG9wZXJhdGlvbk5hbWUgbm9uLW51bGwgb3BlcmF0aW9uTmFtZQorICAgICAqIEByZXR1cm4gbnVsbCBpZiBhIHtAbGluayBXU0RMT3BlcmF0aW9ufSBpcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgV1NETE9wZXJhdGlvbiBnZXQoU3RyaW5nIG9wZXJhdGlvbk5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHtAbGluayBJdGVyYWJsZX08eyRsaW5rIFdTRExPcGVyYXRpb259PgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYWJsZTw/IGV4dGVuZHMgV1NETE9wZXJhdGlvbj4gZ2V0T3BlcmF0aW9ucygpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL21vZGVsL3dzZGwvV1NETFNlcnZpY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmYTIyYwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9tb2RlbC93c2RsL1dTRExTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogQWJzdHJhY3RzIHdzZGw6c2VydmljZS4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTRExTZXJ2aWNlIGV4dGVuZHMgV1NETE9iamVjdCwgV1NETEV4dGVuc2libGUgeworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBXU0RMTW9kZWx9IHRoYXQgb3ducyB0aGlzIHNlcnZpY2UuCisgICAgICovCisgICAgQE5vdE51bGwKKyAgICBXU0RMTW9kZWwgZ2V0UGFyZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSB3c2RsOnNlcnZpY2VAbmFtZSBhdHRyaWJ1dGUgdmFsdWUgYXMgbG9jYWwgbmFtZSBhbmQgd3NkbDpkZWZpbml0aW9uc0B0YXJnZXROYW1lc3BhY2UKKyAgICAgKiBhcyB0aGUgbmFtZXNwYWNlIHVyaS4KKyAgICAgKi8KKyAgICBATm90TnVsbAorICAgIFFOYW1lIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBXU0RMUG9ydH0gZm9yIGEgZ2l2ZW4gcG9ydCBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydE5hbWUgbm9uLW51bGwgb3BlcmF0aW9uTmFtZQorICAgICAqIEByZXR1cm4gbnVsbCBpZiBhIHtAbGluayBXU0RMUG9ydH0gaXMgbm90IGZvdW5kCisgICAgICovCisgICAgV1NETFBvcnQgZ2V0KFFOYW1lIHBvcnROYW1lKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZpcnN0IHtAbGluayBXU0RMUG9ydH0gaWYgYW55LCBvciBvdGhlcndpc2UgbnVsbC4KKyAgICAgKi8KKyAgICBXU0RMUG9ydCBnZXRGaXJzdFBvcnQoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIGFsbCB0aGUge0BsaW5rIFdTRExQb3J0fSBpbiBhIHdzZGw6c2VydmljZSB7QGxpbmsgV1NETFNlcnZpY2V9CisgICAgICovCisgICAgSXRlcmFibGU8PyBleHRlbmRzIFdTRExQb3J0PiBnZXRQb3J0cygpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzRlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKioKKyAqIEpBWC1XUyBSSSBleHRlbnNpb24gb2YgSkFYLVdTIEFQSS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgcGFja2FnZSBob3N0cyBjbGFzc2VzL2ludGVyZmFjZXMgdGhhdCBkaXJlY3RseSBleHRlbmQKKyAqIHRoZSBKQVgtV1MgQVBJLiBTb21ldGltZXMgb2JqZWN0cyBvZiB0aGVzZSB0eXBlcyBhcmUgcGFzc2VkCisgKiB0byBleHRlcm5hbCBjb21wb25lbnRzIGZyb20gaGlnaGVyIGxheWVycywgb25seSB0byBiZSBwYXNzZWQKKyAqIGJhY2sgaW50byBvdGhlciBwYXJ0cyBvZiB0aGUgSkFYLVdTIFJJLgorICogQnkgZGVmaW5pbmcgdGhlc2UgdHlwZXMsIHdlIGltcHJvdmUgdGhlIHR5cGUtc2FmZXR5IGluCisgKiB0aGlzIHNjZW5hcmlvLCB3aGlsZSBpc29sYXRpbmcgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLgorICoKKyAqIDxwPgorICogU29tZXRpbWVzIHRoZXNlIHR5cGVzIGFsc28gZGVmaW5lIGFkZGl0aW9uYWwgbWV0aG9kcy4KKyAqCisgKiA8cD4KKyAqIFR5cGVzIGRlZmluZWQgaW4gcGFja2FnZSBjYW4gb25seSBiZSBpbXBsZW1lbnRlZCBieSB0aGUgSkFYLVdTIFJJLgorICogVGhlIGNvZGUgaW50ZXJuYWwgdG8gdGhlIEpBWC1XUyBSSSBtYXkgc2FmZWx5IGNhc2UgaW5zdGFuY2VzCisgKiBvZiB0aGVzZSB0eXBlcyB0byB0aGVpciBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiBUaGlzIHdhcm5pbmcgZG9lc24ndAorICogYXBwbHkgdG8gc3VicGFja2FnZXMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvQ2xpZW50UGlwZUFzc2VtYmxlckNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NsaWVudFBpcGVBc3NlbWJsZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2ZWQwMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NsaWVudFBpcGVBc3NlbWJsZXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkVuZHBvaW50QWRkcmVzczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU1NlcnZpY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuaGVscGVyLlBpcGVBZGFwdGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQ29udGFpbmVyOworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworLyoqCisgKiBGYWN0b3J5IGZvciB3ZWxsLWtub3duIHtAbGluayBQaXBlfSBpbXBsZW1lbnRhdGlvbnMKKyAqIHRoYXQgdGhlIHtAbGluayBQaXBlbGluZUFzc2VtYmxlcn0gbmVlZHMgdG8gdXNlCisgKiB0byBzYXRpc2Z5IEpBWC1XUyByZXF1aXJlbWVudHMuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dH0uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDbGllbnRQaXBlQXNzZW1ibGVyQ29udGV4dCBleHRlbmRzIENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0IHsKKworICAgIHB1YmxpYyBDbGllbnRQaXBlQXNzZW1ibGVyQ29udGV4dChATm90TnVsbCBFbmRwb2ludEFkZHJlc3MgYWRkcmVzcywgQE5vdE51bGwgV1NETFBvcnQgd3NkbE1vZGVsLCBATm90TnVsbCBXU1NlcnZpY2Ugcm9vdE93bmVyLCBATm90TnVsbCBXU0JpbmRpbmcgYmluZGluZykgeworICAgICAgICB0aGlzKGFkZHJlc3MsIHdzZGxNb2RlbCwgcm9vdE93bmVyLCBiaW5kaW5nLCBDb250YWluZXIuTk9ORSk7CisgICAgfQorCisgICAgcHVibGljIENsaWVudFBpcGVBc3NlbWJsZXJDb250ZXh0KEBOb3ROdWxsIEVuZHBvaW50QWRkcmVzcyBhZGRyZXNzLCBATm90TnVsbCBXU0RMUG9ydCB3c2RsTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb3ROdWxsIFdTU2VydmljZSByb290T3duZXIsIEBOb3ROdWxsIFdTQmluZGluZyBiaW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm90TnVsbCBDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIHN1cGVyKGFkZHJlc3MsIHdzZGxNb2RlbCwgcm9vdE93bmVyLCBiaW5kaW5nLCBjb250YWluZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZXMgYSB7QGxpbmsgUGlwZX0gdGhhdCBkdW1wcyBtZXNzYWdlcyB0aGF0IHBhc3MgdGhyb3VnaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGlwZSBjcmVhdGVEdW1wUGlwZShTdHJpbmcgbmFtZSwgUHJpbnRTdHJlYW0gb3V0LCBQaXBlIG5leHQpIHsKKyAgICAgICAgcmV0dXJuIFBpcGVBZGFwdGVyLmFkYXB0KHN1cGVyLmNyZWF0ZUR1bXBUdWJlKG5hbWUsIG91dCwgUGlwZUFkYXB0ZXIuYWRhcHQobmV4dCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFBpcGV9IHRoYXQgcGVyZm9ybXMgV1MtQWRkcmVzc2lnIHByb2Nlc3NpbmcuCisgICAgICogVGhpcyBwaXBlIHNob3VsZCBiZSBiZWZvcmUge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuQ2xpZW50TVVUdWJlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGlwZSBjcmVhdGVXc2FQaXBlKFBpcGUgbmV4dCkgeworICAgICAgICByZXR1cm4gUGlwZUFkYXB0ZXIuYWRhcHQoc3VwZXIuY3JlYXRlV3NhVHViZShQaXBlQWRhcHRlci5hZGFwdChuZXh0KSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgUGlwZX0gdGhhdCBwZXJmb3JtcyBTT0FQIG11c3RVbmRlcnN0YW5kIHByb2Nlc3NpbmcuCisgICAgICogVGhpcyBwaXBlIHNob3VsZCBiZSBiZWZvcmUgSGFuZGxlclBpcGVzLgorICAgICAqLworICAgIHB1YmxpYyBQaXBlIGNyZWF0ZUNsaWVudE1VUGlwZShQaXBlIG5leHQpIHsKKyAgICAgICAgcmV0dXJuIFBpcGVBZGFwdGVyLmFkYXB0KHN1cGVyLmNyZWF0ZUNsaWVudE1VVHViZShQaXBlQWRhcHRlci5hZGFwdChuZXh0KSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgUGlwZX0gdGhhdCBpbnZva2VzIHByb3RvY29sIGFuZCBsb2dpY2FsIGhhbmRsZXJzLgorICAgICAqLworICAgIHB1YmxpYyBQaXBlIGNyZWF0ZUhhbmRsZXJQaXBlKFBpcGUgbmV4dCkgeworICAgICAgICByZXR1cm4gUGlwZUFkYXB0ZXIuYWRhcHQoc3VwZXIuY3JlYXRlSGFuZGxlclR1YmUoUGlwZUFkYXB0ZXIuYWRhcHQobmV4dCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFR1YmV9IHRoYXQgYWRkcyBjb250YWluZXIgc3BlY2lmaWMgc2VjdXJpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgUGlwZSBjcmVhdGVTZWN1cml0eVBpcGUoQE5vdE51bGwgUGlwZSBuZXh0KSB7CisgICAgICAgIHJldHVybiBQaXBlQWRhcHRlci5hZGFwdChzdXBlci5jcmVhdGVTZWN1cml0eVR1YmUoUGlwZUFkYXB0ZXIuYWRhcHQobmV4dCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgdHJhbnNwb3J0IHBpcGUgKGZvciBjbGllbnQpLCB3aGljaCBiZWNvbWVzIHRoZSB0ZXJtaW5hbCBwaXBlLgorICAgICAqLworICAgIHB1YmxpYyBQaXBlIGNyZWF0ZVRyYW5zcG9ydFBpcGUoKSB7CisgICAgICAgIHJldHVybiBQaXBlQWRhcHRlci5hZGFwdChzdXBlci5jcmVhdGVUcmFuc3BvcnRUdWJlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvQ2xpZW50VHViZUFzc2VtYmxlckNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3Y2Q0OAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5Xc2FDbGllbnRUdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NTZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5jbGllbnQuQ2xpZW50UGlwZWxpbmVIb29rOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5QaXBlQWRhcHRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuQ2xpZW50TG9naWNhbEhhbmRsZXJUdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuQ2xpZW50U09BUEhhbmRsZXJUdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlclR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcC5DbGllbnRNVVR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0LkRlZmVycmVkVHJhbnNwb3J0UGlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnBpcGUuRHVtcFR1YmU7CisKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHdlbGwta25vd24ge0BsaW5rIFR1YmV9IGltcGxlbWVudGF0aW9ucworICogdGhhdCB0aGUge0BsaW5rIFR1YmVsaW5lQXNzZW1ibGVyfSBuZWVkcyB0byB1c2UKKyAqIHRvIHNhdGlzZnkgSkFYLVdTIHJlcXVpcmVtZW50cy4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50VHViZUFzc2VtYmxlckNvbnRleHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBATm90TnVsbCBFbmRwb2ludEFkZHJlc3MgYWRkcmVzczsKKyAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIFdTRExQb3J0IHdzZGxNb2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIFdTU2VydmljZSByb290T3duZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBATm90TnVsbCBXU0JpbmRpbmcgYmluZGluZzsKKyAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIENvbnRhaW5lciBjb250YWluZXI7CisgICAgcHJpdmF0ZSBATm90TnVsbCBDb2RlYyBjb2RlYzsKKworICAgIHB1YmxpYyBDbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dChATm90TnVsbCBFbmRwb2ludEFkZHJlc3MgYWRkcmVzcywgQE5vdE51bGwgV1NETFBvcnQgd3NkbE1vZGVsLCBATm90TnVsbCBXU1NlcnZpY2Ugcm9vdE93bmVyLCBATm90TnVsbCBXU0JpbmRpbmcgYmluZGluZykgeworICAgICAgICB0aGlzKGFkZHJlc3MsIHdzZGxNb2RlbCwgcm9vdE93bmVyLCBiaW5kaW5nLCBDb250YWluZXIuTk9ORSk7CisgICAgfQorCisgICAgcHVibGljIENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0KEBOb3ROdWxsIEVuZHBvaW50QWRkcmVzcyBhZGRyZXNzLCBATm90TnVsbCBXU0RMUG9ydCB3c2RsTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb3ROdWxsIFdTU2VydmljZSByb290T3duZXIsIEBOb3ROdWxsIFdTQmluZGluZyBiaW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm90TnVsbCBDb250YWluZXIgY29udGFpbmVyLCBDb2RlYyBjb2RlYykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICB0aGlzLndzZGxNb2RlbCA9IHdzZGxNb2RlbDsKKyAgICAgICAgdGhpcy5yb290T3duZXIgPSByb290T3duZXI7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICB0aGlzLmNvZGVjID0gY29kZWM7CisgICAgfQorCisgICAgcHVibGljIENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0KEBOb3ROdWxsIEVuZHBvaW50QWRkcmVzcyBhZGRyZXNzLCBATm90TnVsbCBXU0RMUG9ydCB3c2RsTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb3ROdWxsIFdTU2VydmljZSByb290T3duZXIsIEBOb3ROdWxsIFdTQmluZGluZyBiaW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm90TnVsbCBDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIC8vIFdTQmluZGluZyBpcyBhY3R1YWxseSBCaW5kaW5nSW1wbAorICAgICAgICB0aGlzKGFkZHJlc3MsIHdzZGxNb2RlbCwgcm9vdE93bmVyLCBiaW5kaW5nLCBjb250YWluZXIsICgoQmluZGluZ0ltcGwpYmluZGluZykuY3JlYXRlQ29kZWMoKSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlbmRwb2ludCBhZGRyZXNzLiBBbHdheXMgbm9uLW51bGwuIFRoaXMgcGFyYW1ldGVyIGlzIHRha2VuIHNlcGFyYXRlbHkKKyAgICAgKiBmcm9tIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydH0gKGV2ZW4gdGhvdWdoIHRoZXJlJ3Mge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0I2dldEFkZHJlc3MoKX0pCisgICAgICogYmVjYXVzZSBzb21ldGltZXMgV1NETCBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBFbmRwb2ludEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNyZWF0ZWQgcGlwZWxpbmUgd2lsbCBiZSB1c2VkIHRvIHNlcnZlIHRoaXMgcG9ydC4KKyAgICAgKiBOdWxsIGlmIHRoZSBzZXJ2aWNlIGlzbid0IGFzc29jaWF0ZWQgd2l0aCBhbnkgcG9ydCBkZWZpbml0aW9uIGluIFdTREwsCisgICAgICogYW5kIG90aGVyd2lzZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFdTRExQb3J0IGdldFdzZGxNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHdzZGxNb2RlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGlwZWxpbmUgaXMgY3JlYXRlZCBmb3IgdGhpcyB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTU2VydmljZX0uCisgICAgICogQWx3YXlzIG5vbi1udWxsLiAoVG8gYmUgcHJlY2lzZSwgdGhlIG5ld2x5IGNyZWF0ZWQgcGlwZWxpbmUKKyAgICAgKiBpcyBvd25lZCBieSBhIHByb3h5IG9yIGEgZGlzcGF0Y2ggY3JlYXRlZCBmcm9tIHRoc2kge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU1NlcnZpY2V9LikKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgV1NTZXJ2aWNlIGdldFNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiByb290T3duZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJpbmRpbmcgb2YgdGhlIG5ldyBwaXBlbGluZSB0byBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBXU0JpbmRpbmcgZ2V0QmluZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQ29udGFpbmVyIGluIHdoaWNoIHRoZSBjbGllbnQgaXMgcnVubmluZworICAgICAqCisgICAgICogQHJldHVybiBDb250YWluZXIgaW4gd2hpY2ggY2xpZW50IGlzIHJ1bm5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIGEge0BsaW5rIFR1YmV9IHRoYXQgZHVtcHMgbWVzc2FnZXMgdGhhdCBwYXNzIHRocm91Z2guCisgICAgICovCisgICAgcHVibGljIFR1YmUgY3JlYXRlRHVtcFR1YmUoU3RyaW5nIG5hbWUsIFByaW50U3RyZWFtIG91dCwgVHViZSBuZXh0KSB7CisgICAgICAgIHJldHVybiBuZXcgRHVtcFR1YmUobmFtZSwgb3V0LCBuZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFR1YmV9IHRoYXQgYWRkcyBjb250YWluZXIgc3BlY2lmaWMgc2VjdXJpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgVHViZSBjcmVhdGVTZWN1cml0eVR1YmUoQE5vdE51bGwgVHViZSBuZXh0KSB7CisgICAgICAgIENsaWVudFBpcGVsaW5lSG9vayBob29rID0gY29udGFpbmVyLmdldFNQSShDbGllbnRQaXBlbGluZUhvb2suY2xhc3MpOworICAgICAgICBpZiAoaG9vayAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGllbnRQaXBlQXNzZW1ibGVyQ29udGV4dCBjdHh0ID0gbmV3IENsaWVudFBpcGVBc3NlbWJsZXJDb250ZXh0KGFkZHJlc3MsIHdzZGxNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE93bmVyLCBiaW5kaW5nLCBjb250YWluZXIpOworICAgICAgICAgICAgcmV0dXJuIFBpcGVBZGFwdGVyLmFkYXB0KGhvb2suY3JlYXRlU2VjdXJpdHlQaXBlKGN0eHQsIFBpcGVBZGFwdGVyLmFkYXB0KG5leHQpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBUdWJlfSB0aGF0IGludm9rZXMgcHJvdG9jb2wgYW5kIGxvZ2ljYWwgaGFuZGxlcnMuCisgICAgICovCisgICAgcHVibGljIFR1YmUgY3JlYXRlV3NhVHViZShUdWJlIG5leHQpIHsKKyAgICAgICAgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZyAmJiBBZGRyZXNzaW5nVmVyc2lvbi5pc0VuYWJsZWQoYmluZGluZykgJiYgd3NkbE1vZGVsIT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXc2FDbGllbnRUdWJlKHdzZGxNb2RlbCwgYmluZGluZywgbmV4dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVHViZX0gdGhhdCBpbnZva2VzIHByb3RvY29sIGFuZCBsb2dpY2FsIGhhbmRsZXJzLgorICAgICAqLworICAgIHB1YmxpYyBUdWJlIGNyZWF0ZUhhbmRsZXJUdWJlKFR1YmUgbmV4dCkgeworICAgICAgICBIYW5kbGVyVHViZSBzb2FwSGFuZGxlclR1YmUgPSBudWxsOworICAgICAgICAvL1hNTC9IVFRQIEJpbmRpbmcgY2FuIGhhdmUgb25seSBMb2dpY2FsSGFuZGxlclBpcGUKKyAgICAgICAgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgeworICAgICAgICAgICAgc29hcEhhbmRsZXJUdWJlID0gbmV3IENsaWVudFNPQVBIYW5kbGVyVHViZShiaW5kaW5nLCB3c2RsTW9kZWwsIG5leHQpOworICAgICAgICAgICAgbmV4dCA9IHNvYXBIYW5kbGVyVHViZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENsaWVudExvZ2ljYWxIYW5kbGVyVHViZShiaW5kaW5nLCBuZXh0LCBzb2FwSGFuZGxlclR1YmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVHViZX0gdGhhdCBwZXJmb3JtcyBTT0FQIG11c3RVbmRlcnN0YW5kIHByb2Nlc3NpbmcuCisgICAgICogVGhpcyBwaXBlIHNob3VsZCBiZSBiZWZvcmUgSGFuZGxlclBpcGVzLgorICAgICAqLworICAgIHB1YmxpYyBUdWJlIGNyZWF0ZUNsaWVudE1VVHViZShUdWJlIG5leHQpIHsKKyAgICAgICAgaWYoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRNVVR1YmUoYmluZGluZyxuZXh0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHRyYW5zcG9ydCBwaXBlIChmb3IgY2xpZW50KSwgd2hpY2ggYmVjb21lcyB0aGUgdGVybWluYWwgcGlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHViZSBjcmVhdGVUcmFuc3BvcnRUdWJlKCkgeworICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgLy8gd3NnZW4gZ2VuZXJhdGVzIGEgV1NETCB3aXRoIHRoZSBhZGRyZXNzIGF0dHJpYnV0ZSB0aGF0IHNheXMgIlJFUExBQ0VfV0lUSF9BQ1RVQUxfVVJMIi4KKyAgICAgICAgLy8gd2hpbGUgaXQncyB0ZWNobmljYWxseSBjb3JyZWN0IHRvIHJlamVjdCBzdWNoIGFkZHJlc3MgKHNpbmNlIHRoZXJlJ3Mgbm8gdHJhbnNwb3J0IHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBpdCksIGl0J3MgZGVzaXJhYmxlIHRvIGFsbG93IHRoZSB1c2VyIGEgYmVuZWZpdCBvZiBkb3VidCwgYW5kIHdhaXQgdW50aWwgdGhlIHJ1bnRpbWUKKyAgICAgICAgLy8gdG8gc2VlIGlmIHRoZSB1c2VyIGNvbmZpZ3VyZXMgdGhlIGVuZHBvaW50IGFkZHJlc3MgdGhyb3VnaCByZXF1ZXN0IGNvbnRleHQuCisgICAgICAgIC8vIERlZmVycmVkVHJhbnNwb3J0UGlwZSBpcyB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCisgICAgICAgIC8vCisgICAgICAgIC8vIElkZWFsbHksIHdlIHNob3VsZG4ndCBoYXZlIEBhZGRyZXNzIGF0IGFsbCBmb3Igc3VjaCBjYXNlcywgYnV0IGR1ZSB0byB0aGUgYmFja3dhcmQKKyAgICAgICAgLy8gY29tcGF0aWJpbGl0eSBhbmQgdGhlIGZhY3QgdGhhdCB0aGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnksIHdlIGhhdmUgbm8gb3B0aW9uIGJ1dAorICAgICAgICAvLyB0byBjaGVjayBmb3IgUkVQTEFDRV9XSVRIX0FDVFVBTF9VUkwuCisgICAgICAgIGlmKGFkZHJlc3MudG9TdHJpbmcoKS5lcXVhbHMoIiIpIHx8IGFkZHJlc3MudG9TdHJpbmcoKS5lcXVhbHMoIlJFUExBQ0VfV0lUSF9BQ1RVQUxfVVJMIikpCisgICAgICAgICAgICByZXR1cm4gbmV3IERlZmVycmVkVHJhbnNwb3J0UGlwZShjbCx0aGlzKTsKKworICAgICAgICByZXR1cm4gVHJhbnNwb3J0VHViZUZhY3RvcnkuY3JlYXRlKGNsLCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgQ29kZWN9IHRoYXQgaXMgc2V0IGJ5IHtAbGluayAjc2V0Q29kZWN9IG9yIHRoZSBkZWZhdWx0IGNvZGVjCisgICAgICogYmFzZWQgb24gdGhlIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvZGVjIHRvIGJlIHVzZWQgZm9yIHdlYiBzZXJ2aWNlIHJlcXVlc3RzCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIENvZGVjIGdldENvZGVjKCkgeworICAgICAgICByZXR1cm4gY29kZWM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJjZXB0aW9uIHBvaW50IHRvIGNoYW5nZSB7QGxpbmsgQ29kZWN9IGR1cmluZyB7QGxpbmsgVHViZX1saW5lIGFzc2VtYmx5LiBUaGUKKyAgICAgKiBuZXcgY29kZWMgd2lsbCBiZSB1c2VkIGJ5IGpheC13cyBjbGllbnQgcnVudGltZSBmb3IgZW5jb2RpbmcvZGVjb2Rpbmcgd2ViIHNlcnZpY2UKKyAgICAgKiByZXF1ZXN0L3Jlc3BvbnNlIG1lc3NhZ2VzLiBUaGUgbmV3IGNvZGVjIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSB0cmFuc3BvcnQgdHViZXMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB0aGUgY29kZWMgc2hvdWxkIGNvcnJlY3RseSBpbXBsZW1lbnQge0BsaW5rIENvZGVjI2NvcHl9IHNpbmNlIGl0IGlzIHVzZWQgd2hpbGUKKyAgICAgKiBzZXJ2aW5nIHJlcXVlc3RzIGNvbmN1cnJlbnRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlYyBjb2RlYyB0byBiZSB1c2VkIGZvciB3ZWIgc2VydmljZSByZXF1ZXN0cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvZGVjKEBOb3ROdWxsIENvZGVjIGNvZGVjKSB7CisgICAgICAgIHRoaXMuY29kZWMgPSBjb2RlYzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NvZGVjLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9Db2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmQ3M2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9Db2RlYy5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuRW5kcG9pbnRBd2FyZUNvZGVjOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsOworCisvKioKKyAqIEVuY29kZXMgYSB7QGxpbmsgTWVzc2FnZX0gKGl0cyBYTUwgaW5mb3NldCBhbmQgYXR0YWNobWVudHMpIHRvIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuCisgKgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBwbHVnZ2FiaWxpdHkgZm9yIGRpZmZlcmVudCB3YXlzIG9mIGVuY29kaW5nIFhNTCBpbmZvc2V0LAorICogc3VjaCBhcyBwbGFpbiBYTUwgKHBsdXMgTUlNRSBhdHRhY2htZW50cyksIFhPUCwgYW5kIEZhc3RJbmZvc2V0LgorICoKKyAqIDxwPgorICogVHJhbnNwb3J0IHVzdWFsbHkgbmVlZHMgYSBNSU1FIGNvbnRlbnQgdHlwZSBvZiB0aGUgZW5jb2RpbmcsIHNvIHRoZSB7QGxpbmsgQ29kZWN9CisgKiBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gcmV0dXJuIHRoaXMgaW5mb3JtYXRpb24uIEhvd2V2ZXIsIGZvciBzb21lIGVuY29kaW5nCisgKiAoc3VjaCBhcyBYT1ApLCB0aGUgZW5jb2RpbmcgbWF5IGFjdHVhbGx5IGNoYW5nZSBiYXNlZCBvbiB0aGUgYWN0dWFsIGNvbnRlbnQgb2YKKyAqIHtAbGluayBNZXNzYWdlfSwgdGhlcmVmb3JlIHRoZSBjb2RlYyByZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgYXMgYSByZXN1bHQgb2YgZW5jb2RpbmcuCisgKgorICogPHA+CisgKiB7QGxpbmsgQ29kZWN9IGRvZXMgbm90IHByb2R1Y2UgdHJhbnNwb3J0LXNwZWNpZmljIGluZm9ybWF0aW9uLCBzdWNoIGFzIEhUVFAgaGVhZGVycy4KKyAqCisgKiA8cD4KKyAqIHtAbGluayBDb2RlY30gaXMgYSBub24tcmVlbnRyYW50IG9iamVjdCwgbWVhbmluZyBubyB0d28gdGhyZWFkcworICogY2FuIGNvbmN1cnJlbnRseSBpbnZva2UgdGhlIGRlY29kZSBtZXRob2QuIFRoaXMgYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbgorICogdG8gZWFzaWx5IHJldXNlIHBhcnNlciBvYmplY3RzIChhcyBpbnN0YW5jZSB2YXJpYWJsZXMpLCB3aGljaCBhcmUgY29zdGx5IG90aGVyd2lzZS4KKyAqCisgKgorICogPHA+CisgKiB7QGxpbmsgQmluZGluZ0lEfSBkZXRlcm1pbmVzIHRoZSB7QGxpbmsgQ29kZWN9LiBTZWUge0BsaW5rIEJpbmRpbmdJRCNjcmVhdGVFbmNvZGVyKFdTQmluZGluZyl9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzZWUgRW5kcG9pbnRBd2FyZUNvZGVjCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29kZWMgeworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBNSU1FIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29kZWMuCisgICAgICogPHA+CisgICAgICogSWYgYXZhaWxhYmxlIHRoZSBNSU1FIHR5cGUgd2lsbCByZXByZXNlbnQgdGhlIG1lZGlhIHRoYXQgdGhlIGNvZGVjCisgICAgICogZW5jb2RlcyBhbmQgZGVjb2Rlcy4KKyAgICAgKgorICAgICAqIFRoZSBNSU1FIHR5cGUgcmV0dXJuZWQgd2lsbCBiZSB0aGUgbW9zdCBnZW5lcmFsIHJlcHJlc2VudGF0aW9uIGluZGVwZW5kZW50CisgICAgICogb2YgYW4gaW5zdGFuY2Ugb2YgdGhpcyBNSU1FIHR5cGUgdXRpbGl6ZWQgYXMgYSBNSU1FIGNvbnRlbnQtdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG51bGwgaWYgdGhlIE1JTUUgdHlwZSBjYW4ndCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSA8Y29kZT5Db2RlYzwvY29kZT4KKyAgICAgKiAgICAgIGltcGxlbWVudGF0aW9uLiBPdGhlcndpc2UgdGhlIE1JTUUgdHlwZSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgTUlNRSBjb250ZW50LXR5cGUgb2YgdGhlIGVuY29kaW5nIGlzIGtub3duIHN0YXRpY2FsbHkKKyAgICAgKiB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgaXQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc3BvcnRzIG9mdGVuIG5lZWQgdG8gd3JpdGUgdGhlIGNvbnRlbnQgdHlwZSBiZWZvcmUgaXQgd3JpdGVzCisgICAgICogdGhlIG1lc3NhZ2UgYm9keSwgYW5kIHNpbmNlIHRoZSBlbmNvZGUgbWV0aG9kIHJldHVybnMgdGhlIGNvbnRlbnQgdHlwZQorICAgICAqIGFmdGVyIHRoZSBib2R5IGlzIHdyaXR0ZW4sIGl0IHJlcXVpcmVzIGEgYnVmZmVyaW5nLgorICAgICAqCisgICAgICogRm9yIHRob3NlIHtAbGluayBDb2RlY31zIHRoYXQgYWx3YXlzIHVzZSBhIGNvbnN0YW50IGNvbnRlbnQgdHlwZSwKKyAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgYSB0cmFuc3BvcnQgdG8gc3RyZWFtbGluZSB0aGUgd3JpdGUgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiB0aGUgY29udGVudC10eXBlIGNhbid0IGJlIGRldGVybWluZWQgaW4gc2hvcnQgb2YKKyAgICAgKiAgICAgIGVuY29kaW4gdGhlIHBhY2tldC4gT3RoZXJ3aXNlIGNvbnRlbnQgdHlwZSBmb3IgdGhpcyB7QGxpbmsgUGFja2V0fSwKKyAgICAgKiAgICAgIHN1Y2ggYXMgImFwcGxpY2F0aW9uL3htbCIuCisgICAgICovCisgICAgQ29udGVudFR5cGUgZ2V0U3RhdGljQ29udGVudFR5cGUoUGFja2V0IHBhY2tldCk7CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIGFuIFhNTCBpbmZvc2V0IHBvcnRpb24gb2YgdGhlIHtAbGluayBNZXNzYWdlfQorICAgICAqIChmcm9tICZsdDtzb2FwOkVudmVsb3BlPiB0byAmbHQ7L3NvYXA6RW52ZWxvcGU+KS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEludGVybmFsbHksIHRoaXMgbWV0aG9kIGlzIG1vc3QgbGlrZWx5IGludm9rZSB7QGxpbmsgTWVzc2FnZSN3cml0ZVRvKFhNTFN0cmVhbVdyaXRlcil9CisgICAgICogdG8gdHVybiB0aGUgbWVzc2FnZSBpbnRvIGluZm9zZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2V0CisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgTXVzdCBub3QgYmUgbnVsbC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgc3RyZWFtLAorICAgICAqICAgICAgbm90IHRoZSBjYWxsZWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBUaGUgTUlNRSBjb250ZW50IHR5cGUgb2YgdGhlIGVuY29kZWQgbWVzc2FnZSAoc3VjaCBhcyAiYXBwbGljYXRpb24veG1sIikuCisgICAgICogICAgICBUaGlzIGluZm9ybWF0aW9uIGlzIG9mdGVuIG5jZXNzYXJ5IGJ5IHRyYW5zcG9ydC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIGEge0BsaW5rIE91dHB1dFN0cmVhbX0gdGhyb3dzIHtAbGluayBJT0V4Y2VwdGlvbn0uCisgICAgICovCisgICAgQ29udGVudFR5cGUgZW5jb2RlKCBQYWNrZXQgcGFja2V0LCBPdXRwdXRTdHJlYW0gb3V0ICkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogVGhlIHZlcnNpb24gb2Yge0BsaW5rICNlbmNvZGUoUGFja2V0LE91dHB1dFN0cmVhbSl9CisgICAgICogdGhhdCB3cml0ZXMgdG8gTklPIHtAbGluayBCeXRlQnVmZmVyfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRPRE86IGZvciB0aGUgY29udmVuaWVuY2Ugb2YgaW1wbGVtZW50YXRpb24sIHdyaXRlCisgICAgICogYW4gYWRhcHRlciB0aGF0IHdyYXBzIHtAbGluayBXcml0YWJsZUJ5dGVDaGFubmVsfSB0byB7QGxpbmsgT3V0cHV0U3RyZWFtfS4KKyAgICAgKi8KKyAgICBDb250ZW50VHlwZSBlbmNvZGUoIFBhY2tldCBwYWNrZXQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgYnVmZmVyICk7CisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBuZWVkIHRvIGJlIGRvY3VtZW50ZWQgYW5kIGltcGxlbWVudGVkLgorICAgICAqCisgICAgICogU3VjaCBtZXRob2RzIHdpbGwgYmUgdXNlZCBieSBhIGNsaWVudCBzaWRlCisgICAgICogdHJhbnNwb3J0IHBpcGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBDbGllbnRFZGdlUGlwZS4KKyAgICAgKgorICAgIFN0cmluZyBlbmNvZGUoIElucHV0U3RyZWFtTWVzc2FnZSBtZXNzYWdlLCBPdXRwdXRTdHJlYW0gb3V0ICkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIFN0cmluZyBlbmNvZGUoIElucHV0U3RyZWFtTWVzc2FnZSBtZXNzYWdlLCBXcml0YWJsZUJ5dGVDaGFubmVsIGJ1ZmZlciApOworICAgICovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIHtAbGluayBDb2RlY30uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTaW5jZSB7QGxpbmsgQ29kZWN9IGluc3RhbmNlIGlzIG5vdCByZS1lbnRyYW50LCB0aGUgY2FsbGVyCisgICAgICogd2hvIG5lZWRzIHRvIGVuY29kZSB0d28ge0BsaW5rIE1lc3NhZ2V9cyBzaW11bHRhbmVvdXNseSB3aWxsCisgICAgICogd2FudCB0byBoYXZlIHR3byB7QGxpbmsgQ29kZWN9IGluc3RhbmNlcy4gVGhhdCdzIHdoYXQgdGhpcworICAgICAqIG1ldGhvZCBwcm9kdWNlcy4KKyAgICAgKgorICAgICAqIDxoMz5JbXBsZW50YXRpb24gTm90ZTwvaDM+CisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1pZ2h0IGJlIGludm9rZWQgYnkgb25lIHRocmVhZCB3aGlsZQorICAgICAqIGFub3RoZXIgdGhyZWFkIGlzIGV4ZWN1dGluZyBvbmUgb2YgdGhlIHtAbGluayAjZW5jb2RlfSBtZXRob2RzLgorICAgICAqIDwhLS0gb3Igb3RoZXJ3aXNlIHlvdSdkIGFsd2F5cyBoYXZlIHRvIG1haW50YWluIG9uZSBpZGxlIGNvcHkgLS0+CisgICAgICogPCEtLSBqdXN0IHNvIHRoYXQgeW91IGNhbiBtYWtlIGNvcGllcyBmcm9tIC0tPgorICAgICAqIFRoaXMgc2hvdWxkIGJlIE9LIGJlY2F1c2UgeW91J2xsIGJlIG9ubHkgY29weWluZyB0aGluZ3MgdGhhdAorICAgICAqIGFyZSB0aHJlYWQtc2FmZSwgYW5kIGNyZWF0aW5nIG5ldyBvbmVzIGZvciB0aHJlYWQtdW5zYWZlIHJlc291cmNlcywKKyAgICAgKiBidXQgcGxlYXNlIGxldCB1cyBrbm93IGlmIHRoaXMgY29udHJhY3QgaXMgZGlmZmljdWx0LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYWx3YXlzIG5vbi1udWxsIHZhbGlkIHtAbGluayBDb2RlY30gdGhhdCBwZXJmb3JtcworICAgICAqICAgICAgdGhlIGVuY29kaW5nIHdvcmsgaW4gdGhlIHNhbWUgd2F5IC0tLSB0aGF0IGlzLCBpZiB5b3UKKyAgICAgKiAgICAgIGNvcHkgYW4gRkkgY29kZWMsIHlvdSdsbCBnZXQgYW5vdGhlciBGSSBjb2RlYy4KKyAgICAgKgorICAgICAqICAgICAgPHA+CisgICAgICogICAgICBPbmNlIGNvcGllZCwgdHdvIHtAbGluayBDb2RlY31zIG1heSBiZSBpbnZva2VkIGZyb20KKyAgICAgKiAgICAgIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseTsgdGhlcmVmb3JlLCB0aGV5IG11c3Qgbm90IHNoYXJlCisgICAgICogICAgICBhbnkgc3RhdGUgdGhhdCByZXF1aXJlcyBpc29sYXRpb24gKHN1Y2ggYXMgdGVtcG9yYXJ5IGJ1ZmZlci4pCisgICAgICoKKyAgICAgKiAgICAgIDxwPgorICAgICAqICAgICAgSWYgdGhlIHtAbGluayBDb2RlY30gaW1wbGVtZW50YXRpb24gaXMgYWxyZWFkeQorICAgICAqICAgICAgcmUtZW50cmFudCBhbmQgbXVsdGktdGhyZWFkIHNhZmUgdG8gYmVnaW4gd2l0aCwKKyAgICAgKiAgICAgIHRoZW4gdGhpcyBtZXRob2QgbWF5IHNpbXBseSByZXR1cm4gPHR0PnRoaXM8L3R0Pi4KKyAgICAgKi8KKyAgICBDb2RlYyBjb3B5KCk7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHtAbGluayBJbnB1dFN0cmVhbX0gYW5kIGNvbnN0cnVjdHMgYSB7QGxpbmsgTWVzc2FnZX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVzaWduIGVuY291cmFnZXMgbGF6eSBkZWNvZGluZyBvZiBhIHtAbGluayBNZXNzYWdlfSwgd2hlcmUKKyAgICAgKiBhIHtAbGluayBNZXNzYWdlfSBpcyByZXR1cm5lZCBldmVuIGJlZm9yZSB0aGUgd2hvbGUgbWVzc2FnZSBpcyBwYXJzZWQsCisgICAgICogYW5kIGFkZGl0aW9uYWwgcGFyc2luZyBpcyBkb25lIGFzIHRoZSB7QGxpbmsgTWVzc2FnZX0gYm9keSBpcyByZWFkIGFsb25nLgorICAgICAqIEEge0BsaW5rIENvZGVjfSBpcyBtb3N0IGxpa2VseSBoYXZlIGl0cyBvd24gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1lc3NhZ2V9CisgICAgICogZm9yIHRoaXMgcHVycG9zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbgorICAgICAqICAgICAgdGhlIGRhdGEgdG8gYmUgcmVhZCBpbnRvIGEge0BsaW5rIE1lc3NhZ2V9LiBUaGUgdHJhbnNwb3J0IHdvdWxkIGhhdmUKKyAgICAgKiAgICAgIHJlYWQgYW55IHRyYW5zcG9ydC1zcGVjaWZpYyBoZWFkZXIgYmVmb3JlIGl0IHBhc3NlcyBhbiB7QGxpbmsgSW5wdXRTdHJlYW19LAorICAgICAqICAgICAgYW5kIHtAbGluayBJbnB1dFN0cmVhbX0gaXMgZXhwZWN0ZWQgdG8gYmUgcmVhZCB1bnRpbCBFT1MuIE5ldmVyIG51bGwuCisgICAgICoKKyAgICAgKiAgICAgIDxwPgorICAgICAqICAgICAgU29tZSB0cmFuc3BvcnRzLCBzdWNoIGFzIFNNVFAsIG1heSAnZW5jb2RlJyBkYXRhIGludG8gYW5vdGhlciBmb3JtYXQKKyAgICAgKiAgICAgIChzdWNoIGFzIHV1ZW5jb2RlLCBiYXNlNjQsIGV0Yy4pIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0bworICAgICAqICAgICAgJ2RlY29kZScgdGhlc2UgdHJhbnNwb3J0LWxldmVsIGVuY29kaW5nIGJlZm9yZSBpdCBwYXNzZXMgZGF0YSBpbnRvCisgICAgICogICAgICB7QGxpbmsgQ29kZWN9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRlbnRUeXBlCisgICAgICogICAgICBUaGUgTUlNRSBjb250ZW50IHR5cGUgKGxpa2UgImFwcGxpY2F0aW9uL3htbCIpIG9mIHRoaXMgYnl0ZSBzdHJlYW0uCisgICAgICogICAgICBUaGllIHRleHQgaW5jbHVkZXMgYWxsIHRoZSBzdWItaGVhZGVycyBvZiB0aGUgY29udGVudC10eXBlIGhlYWRlci4gVGhlcmVmb3JlLAorICAgICAqICAgICAgaW4gbW9yZSBjb21wbGV4IGNhc2UsIHRoaXMgY291bGQgYmUgc29tZXRoaW5nIGxpa2UKKyAgICAgKiAgICAgIDx0dD5tdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9Ii0tPV9vdXRlcl9ib3VuZGFyeSI7IHR5cGU9Im11bHRpcGFydC9hbHRlcm5hdGl2ZSI8L3R0Pi4KKyAgICAgKiAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UKKyAgICAgKiAgICAgIFRoZSBwYXJzZWQge0BsaW5rIE1lc3NhZ2V9IHdpbGwgYmUgc2V0IHRvIHRoaXMge0BsaW5rIFBhY2tldH0uCisgICAgICogICAgICB7QGxpbmsgQ29kZWN9IG1heSBhZGQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHRoaXMge0BsaW5rIFBhY2tldH0uCisgICAgICogICAgICBPbiBhIHN1Y2Nlc3NmdWwgbWV0aG9kIGNvbXBsZXRpb24sIGEge0BsaW5rIFBhY2tldH0gbXVzdCBjb250YWluIGEKKyAgICAgKiAgICAgIHtAbGluayBNZXNzYWdlfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHtAbGluayBJbnB1dFN0cmVhbX0gdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGRlY29kZSggSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBjb250ZW50VHlwZSwgUGFja2V0IHJlc3BvbnNlICkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAc2VlICNkZWNvZGUoSW5wdXRTdHJlYW0sIFN0cmluZywgUGFja2V0KQorICAgICAqLworICAgIHZvaWQgZGVjb2RlKCBSZWFkYWJsZUJ5dGVDaGFubmVsIGluLCBTdHJpbmcgY29udGVudFR5cGUsIFBhY2tldCByZXNwb25zZSApOworCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgbmVlZCB0byBiZSBkb2N1bWVudGVkIGFuZCBpbXBsZW1lbnRlZC4KKyAgICAgKgorICAgICAqIFN1Y2ggbWV0aG9kcyB3aWxsIGJlIHVzZWQgYnkgYSBzZXJ2ZXIgc2lkZQorICAgICAqIHRyYW5zcG9ydCBwaXBlIHRoYXQgY2FuIHN1cHBvcnQgdGhlIGludm9jYXRpb24gb2YgbWV0aG9kcyBvbiBhCisgICAgICogU2VydmVyRWRnZVBpcGUuCisgICAgICoKKyAgICBYTUxTdHJlYW1SZWFkZXJNZXNzYWdlIGRlY29kZSggSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBjb250ZW50VHlwZSApIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBYTUxTdHJlYW1SZWFkZXJNZXNzYWdlIGRlY29kZSggUmVhZGFibGVCeXRlQ2hhbm5lbCBpbiwgU3RyaW5nIGNvbnRlbnRUeXBlICk7CisgICAgKi8KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NvZGVjcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvQ29kZWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NvZGVjcy5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CisKKy8qKgorICogRmFjdG9yeSBtZXRob2RzIGZvciBzb21lIG9mIHRoZSB7QGxpbmsgQ29kZWN9IGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBjcmVhdGUgY29kZWNzIGZvciBTT0FQL0hUVFAgYmluZGluZy4KKyAqIEl0IGFsbG93cyB0byByZXBsYWNlIGRlZmF1bHQgU09BUCBlbnZlbG9wZShwcmltYXJ5IHBhcnQgaW4gTUlNRSBtZXNzYWdlKQorICogY29kZWMgaW4gdGhlIHdob2xlIENvZGVjLgorICoKKyAqIDxwPgorICogVGhpcyBpcyBhIHBhcnQgb2YgdGhlIEpBWC1XUyBSSSBpbnRlcm5hbCBBUEkgc28gdGhhdAorICoge0BsaW5rIFR1YmV9IGFuZCB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGNhbiByZXVzZSB0aGUgaW1wbGVtZW50YXRpb25zCisgKiBkb25lIGluc2lkZSB0aGUgSkFYLVdTLgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2RlY3MgeworCisgICAgLyoqCisgICAgICogVGhpcyBjcmVhdGVzIGEgZnVsbCB7QGxpbmsgQ29kZWN9IGZvciBTT0FQIGJpbmRpbmcgdXNpbmcgdGhlIHByaW1hcnkKKyAgICAgKiBYTUwgY29kZWMgYXJndW1lbnQuIFRoZSBjb2RlYyBhcmd1bWVudCBpcyB1c2VkIHRvIGVuY29kZS9kZWNvZGUgU09BUCBlbnZlbG9wZXMKKyAgICAgKiB3aGlsZSB0aGUgcmV0dXJuZWQgY29kZWMgaXMgcmVzcG9uc2libGUgZm9yIGVuY29kaW5nL2RlY29kaW5nIHRoZSB3aG9sZQorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBDcmVhdGVzIGNvZGVjcyBjYW4gYmUgc2V0IGR1cmluZyB0aGUge0BsaW5rIFR1YmV9bGluZSBhc3NlbWJseSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHNlZSBTZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dCNzZXRDb2RlYyhDb2RlYykKKyAgICAgKiBAc2VlIENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0I3NldENvZGVjKENvZGVjKQorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmcgYmluZGluZyBvZiB0aGUgd2Vic2VydmljZQorICAgICAqIEBwYXJhbSB4bWxFbnZlbG9wZUNvZGVjIFNPQVAgZW52ZWxvcGUgY29kZWMKKyAgICAgKiBAcmV0dXJuIG5vbiBudWxsIGNvZGVjIHRvIHBhcnNlIGVudGlyZSBTT0FQIG1lc3NhZ2UoaW5jbHVkaW5nIE1JTUUgcGFydHMpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBTT0FQQmluZGluZ0NvZGVjIGNyZWF0ZVNPQVBCaW5kaW5nQ29kZWMoV1NCaW5kaW5nIGJpbmRpbmcsIFN0cmVhbVNPQVBDb2RlYyB4bWxFbnZlbG9wZUNvZGVjKSB7CisgICAgICAgIHJldHVybiBuZXcgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuU09BUEJpbmRpbmdDb2RlYyhiaW5kaW5nLCB4bWxFbnZlbG9wZUNvZGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCB7QGxpbmsgQ29kZWN9IHRoYXQgY2FuIGJlIHVzZWQgdG8gdXNlZCB0bworICAgICAqIGRlY29kZSBYTUwgaW5mb3NldCBpbiBTT0FQIGVudmVsb3BlKHByaW1hcnkgcGFydCBpbiBNSU1FIG1lc3NhZ2UpLiBOZXcgY29kZWNzCisgICAgICogY2FuIGJlIHdyaXR0ZW4gdXNpbmcgdGhpcyBjb2RlYyBhcyBkZWxlZ2F0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIFNPQVAgdmVyc2lvbiBvZiB0aGUgYmluZGluZworICAgICAqIEByZXR1cm4gbm9uIG51bGwgZGVmYXVsdCB4bWwgY29kZWMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsCisgICAgU3RyZWFtU09BUENvZGVjIGNyZWF0ZVNPQVBFbnZlbG9wZVhtbENvZGVjKEBOb3ROdWxsIFNPQVBWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLlN0cmVhbVNPQVBDb2RlYy5jcmVhdGUodmVyc2lvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvQ29udGVudFR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NvbnRlbnRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExYmNmZAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0NvbnRlbnRUeXBlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCisvKioKKyAqIEEgQ29udGVudC1UeXBlIHRyYW5zcG9ydCBoZWFkZXIgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHtAbGluayBDb2RlYyNlbmNvZGUoY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0LCBqYXZhLmlvLk91dHB1dFN0cmVhbSl9LgorICogSXQgd2lsbCBwcm92aWRlIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGFuZCBhbHNvIHRha2UgY2FyZSBvZiBTT0FQIDEuMSBTT0FQQWN0aW9uIGhlYWRlci4KKyAqCisgKiBUT0RPOiByZW5hbWUgdG8gQ29udGVudE1ldGFkYXRhPworICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29udGVudFR5cGUgeworICAgIC8qKgorICAgICAqIEdpdmVzIG5vbi1udWxsIENvbnRlbnQtVHlwZSBoZWFkZXIgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOworCisgICAgLyoqCisgICAgICogR2l2ZXMgU09BUEFjdGlvbiB0cmFuc3BvcnQgaGVhZGVyIHZhbHVlLiBJdCB3aWxsIGJlIG5vbi1udWxsIG9ubHkgZm9yIFNPQVAgMS4xIG1lc3NhZ2VzLiBJbiBvdGhlciBjYXNlcworICAgICAqIGl0IE1VU1QgYmUgbnVsbC4gVGhlIFNPQVBBY3Rpb24gdHJhbnNwb3J0IGhlYWRlciBzaG91bGQgYmUgd3JpdHRlbiBvdXQgb25seSB3aGVuIGl0cyBub24tbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSXQgY2FuIGJlIG51bGwsIGluIHRoYXQgY2FzZSBTT0FQQWN0aW9uIGhlYWRlciBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNPQVBBY3Rpb25IZWFkZXIoKTsKKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHRoZSBBY2NlcHQgdHJhbnNwb3J0IGhlYWRlciwgaWYgdGhlIHRyYW5zcG9ydCBzdXBwb3J0cyBpdC4KKyAgICAgKiBSZXR1cm5pbmcgbnVsbCBtZWFucyB0aGUgdHJhbnNwb3J0IG5lZWQgbm90IGFkZCBhbnkgbmV3IGhlYWRlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdlIHJlYWxpemUgdGhhdCB0aGlzIGlzIG5vdCBhbiBlbGVnYW50IGFic3RyYWN0aW9uLCBidXQKKyAgICAgKiB0aGlzIHdvdWxkIGRvIGZvciBub3cuIElmIGFub3RoZXIgcGVyc29uIGNvbWVzIGFuZCBhc2tzIGZvcgorICAgICAqIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LCB3ZSdsbCBkZWZpbmUgYSByZWFsIGFic3RyYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXB0SGVhZGVyKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9FbmdpbmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0VuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzAyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9FbmdpbmUuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKKworLyoqCisgKiBDb2xsZWN0aW9uIG9mIHtAbGluayBGaWJlcn1zLgorICogT3ducyBhbiB7QGxpbmsgRXhlY3V0b3J9IHRvIHJ1biB0aGVtLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBjbGFzcyBFbmdpbmUgeworICAgIHByaXZhdGUgdm9sYXRpbGUgRXhlY3V0b3IgdGhyZWFkUG9vbDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGlkOworCisgICAgcHVibGljIEVuZ2luZShTdHJpbmcgaWQsIEV4ZWN1dG9yIHRocmVhZFBvb2wpIHsKKyAgICAgICAgdGhpcyhpZCk7CisgICAgICAgIHRoaXMudGhyZWFkUG9vbCA9IHRocmVhZFBvb2w7CisgICAgfQorCisgICAgcHVibGljIEVuZ2luZShTdHJpbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEV4ZWN1dG9yIHRocmVhZFBvb2wpIHsKKyAgICAgICAgdGhpcy50aHJlYWRQb29sID0gdGhyZWFkUG9vbDsKKyAgICB9CisKKyAgICB2b2lkIGFkZFJ1bm5hYmxlKEZpYmVyIGZpYmVyKSB7CisgICAgICAgIGlmKHRocmVhZFBvb2w9PW51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkUG9vbCA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woNSwgbmV3IERhZW1vblRocmVhZEZhY3RvcnkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyZWFkUG9vbC5leGVjdXRlKGZpYmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpYmVyIGluIGEgc3VzcGVuZGVkIHN0YXRlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVG8gc3RhcnQgdGhlIHJldHVybmVkIGZpYmVyLCBjYWxsIHtAbGluayBGaWJlciNzdGFydChUdWJlLFBhY2tldCxGaWJlci5Db21wbGV0aW9uQ2FsbGJhY2spfS4KKyAgICAgKiBJdCB3aWxsIHN0YXJ0IGV4ZWN1dGluZyB0aGUgZ2l2ZW4ge0BsaW5rIFR1YmV9IHdpdGggdGhlIGdpdmVuIHtAbGluayBQYWNrZXR9LgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgRmliZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgRmliZXIgY3JlYXRlRmliZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgRmliZXIodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGFlbW9uVGhyZWFkRmFjdG9yeSBpbXBsZW1lbnRzIFRocmVhZEZhY3RvcnkgeworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgdGhyZWFkTnVtYmVyID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CisKKyAgICAgICAgcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgeworICAgICAgICAgICAgVGhyZWFkIGRhZW1vblRocmVhZCA9IG5ldyBUaHJlYWQociwgIkpBWFdTLUVuZ2luZS0iK3RocmVhZE51bWJlci5nZXRBbmRJbmNyZW1lbnQoKSk7CisgICAgICAgICAgICBkYWVtb25UaHJlYWQuc2V0RGFlbW9uKEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICByZXR1cm4gZGFlbW9uVGhyZWFkOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvRmliZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0ZpYmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllNDYxMQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL0ZpYmVyLmphdmEKQEAgLTAsMCArMSw3NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5BYnN0cmFjdEZpbHRlclR1YmVJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogVXNlci1sZXZlbCB0aHJlYWQmI3gyRTsgUmVwcmVzZW50cyB0aGUgZXhlY3V0aW9uIG9mIG9uZSByZXF1ZXN0L3Jlc3BvbnNlIHByb2Nlc3NpbmcuCisgKgorICogPHA+CisgKiBKQVgtV1MgUkkgaXMgY2FwYWJsZSBvZiBydW5uaW5nIGEgbGFyZ2UgbnVtYmVyIG9mIHJlcXVlc3QvcmVzcG9uc2UgY29uY3VycmVudGx5IGJ5CisgKiB1c2luZyBhIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVyIG9mIHRocmVhZHMuIFRoaXMgaXMgbWFkZSBwb3NzaWJsZSBieSB1dGlsaXppbmcKKyAqIGEge0BsaW5rIEZpYmVyfSAmbWRhc2g7IGEgdXNlci1sZXZlbCB0aHJlYWQgdGhhdCBnZXRzIGNyZWF0ZWQgZm9yIGVhY2ggcmVxdWVzdC9yZXNwb25zZQorICogcHJvY2Vzc2luZy4KKyAqCisgKiA8cD4KKyAqIEEgZmliZXIgcmVtZW1iZXJzIHdoZXJlIGluIHRoZSBwaXBlbGluZSB0aGUgcHJvY2Vzc2luZyBpcyBhdCwgd2hhdCBuZWVkcyB0byBiZQorICogZXhlY3V0ZWQgb24gdGhlIHdheSBvdXQgKHdoZW4gcHJvY2Vzc2luZyByZXNwb25zZSksIGFuZCBvdGhlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiBzcGVjaWZpYyB0byB0aGUgZXhlY3V0aW9uIG9mIGEgcGFydGljdWxhciByZXF1ZXN0L3Jlc3BvbnNlLgorICoKKyAqIDxoMj5TdXNwZW5kL1Jlc3VtZTwvaDI+CisgKiA8cD4KKyAqIEZpYmVyIGNhbiBiZSB7QGxpbmsgTmV4dEFjdGlvbiNzdXNwZW5kKCkgc3VzcGVuZGVkfSBieSBhIHtAbGluayBUdWJlfS4KKyAqIFdoZW4gYSBmaWJlciBpcyBzdXNwZW5kZWQsIGl0IHdpbGwgYmUga2VwdCBvbiB0aGUgc2lkZSB1bnRpbCBpdCBpcworICoge0BsaW5rICNyZXN1bWUoUGFja2V0KSByZXN1bWVkfS4gVGhpcyBhbGxvd3MgdGhyZWFkcyB0byBnbyBleGVjdXRlCisgKiBvdGhlciBydW5uYWJsZSBmaWJlcnMsIGFsbG93aW5nIGVmZmljaWVudCB1dGlsaXphdGlvbiBvZiBzbWFsbGVyIG51bWJlciBvZgorICogdGhyZWFkcy4KKyAqCisgKiA8aDI+Q29udGV4dC1zd2l0Y2ggSW50ZXJjZXB0aW9uPC9oMj4KKyAqIDxwPgorICoge0BsaW5rIEZpYmVyQ29udGV4dFN3aXRjaEludGVyY2VwdG9yfSBhbGxvd3Mge0BsaW5rIFR1YmV9cyBhbmQge0BsaW5rIEFkYXB0ZXJ9cworICogdG8gcGVyZm9ybSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgZXZlcnkgdGltZSBhIHRocmVhZCBzdGFydHMgcnVubmluZyBhIGZpYmVyCisgKiBhbmQgc3RvcHMgcnVubmluZyBpdC4KKyAqCisgKiA8aDI+Q29udGV4dCBDbGFzc0xvYWRlcjwvaDI+CisgKiA8cD4KKyAqIEp1c3QgbGlrZSB0aHJlYWQsIGEgZmliZXIgaGFzIGEgY29udGV4dCBjbGFzcyBsb2FkZXIgKENDTC4pIEEgZmliZXIncyBDQ0wKKyAqIGJlY29tZXMgdGhlIHRocmVhZCdzIENDTCB3aGVuIGl0J3MgZXhlY3V0aW5nIHRoZSBmaWJlci4gVGhlIG9yaWdpbmFsIENDTAorICogb2YgdGhlIHRocmVhZCB3aWxsIGJlIHJlc3RvcmVkIHdoZW4gdGhlIHRocmVhZCBsZWF2ZXMgdGhlIGZpYmVyIGV4ZWN1dGlvbi4KKyAqCisgKgorICogPGgyPkRlYnVnZ2luZyBBaWQ8L2gyPgorICogPHA+CisgKiBCZWNhdXNlIHtAbGluayBGaWJlcn0gZG9lc24ndCBrZWVwIG11Y2ggaW4gdGhlIGNhbGwgc3RhY2ssIGFuZCBpbnN0ZWFkIHVzZQorICoge0BsaW5rICNjb250c30gdG8gc3RvcmUgdGhlIGNvbnRpbnVhdGlvbiwgZGVidWdnaW5nIGZpYmVyIHJlbGF0ZWQgYWN0aXZpdGllcworICogY291bGQgYmUgaGFyZGVyLgorICoKKyAqIDxwPgorICogU2V0dGluZyB0aGUge0BsaW5rICNMT0dHRVJ9IGZvciBGSU5FIHdvdWxkIGdpdmUgeW91IGJhc2ljIHN0YXJ0L3N0b3AvcmVzdW1lL3N1c3BlbmQKKyAqIGxldmVsIGxvZ2dpbmcuIFVzaW5nIEZJTkVSIHdvdWxkIGNhdXNlIG1vcmUgZGV0YWlsZWQgbG9nZ2luZywgd2hpY2ggaW5jbHVkZXMKKyAqIHdoYXQgdHViZXMgYXJlIGV4ZWN1dGVkIGluIHdoYXQgb3JkZXIgYW5kIGhvdyB0aGV5IGJlaGF2ZWQuCisgKgorICogPHA+CisgKiBXaGVuIHlvdSBkZWJ1ZyB0aGUgc2VydmVyIHNpZGUsIGNvbnNpZGVyIHNldHRpbmcge0BsaW5rIEZpYmVyI3NlcmlhbGl6ZUV4ZWN1dGlvbn0KKyAqIHRvIHRydWUsIHNvIHRoYXQgZXhlY3V0aW9uIG9mIGZpYmVycyBhcmUgc2VyaWFsaXplZC4gRGVidWdnaW5nIGEgc2VydmVyCisgKiB3aXRoIG1vcmUgdGhhbiBvbmUgcnVubmluZyB0aHJlYWRzIGlzIHZlcnkgdHJpY2t5LCBhbmQgdGhpcyBzd2l0Y2ggd2lsbAorICogcHJldmVudCB0aGF0LiBUaGlzIGNhbiBiZSBhbHNvIGVuYWJsZWQgYnkgc2V0dGluZyB0aGUgc3lzdGVtIHByb3BlcnR5IG9uLgorICogU2VlIHRoZSBzb3VyY2UgY29kZS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmliZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgLyoqCisgICAgICoge0BsaW5rIFR1YmV9cyB3aG9zZSB7QGxpbmsgVHViZSNwcm9jZXNzUmVzcG9uc2UoUGFja2V0KX0gbWV0aG9kIG5lZWRzCisgICAgICogdG8gYmUgaW52b2tlZCBvbiB0aGUgd2F5IGJhY2suCisgICAgICovCisgICAgcHJpdmF0ZSBUdWJlW10gY29udHMgPSBuZXcgVHViZVsxNl07CisgICAgcHJpdmF0ZSBpbnQgY29udHNTaXplOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBmaWVsZCBpcyBub24tbnVsbCwgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZSBpcworICAgICAqIHRvIGNhbGwgaXRzIHtAbGluayBUdWJlI3Byb2Nlc3NSZXF1ZXN0KFBhY2tldCl9LiBPdGhlcndpc2UKKyAgICAgKiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdG8gY2FsbCB7QGxpbmsgI2NvbnRzfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFR1YmUgbmV4dDsKKworICAgIHByaXZhdGUgUGFja2V0IHBhY2tldDsKKworICAgIHByaXZhdGUgVGhyb3dhYmxlLypidXQgcmVhbGx5IGl0J3MgZWl0aGVyIFJ1bnRpbWVFeGNlcHRpb24gb3IgRXJyb3IqLyB0aHJvd2FibGU7CisKKyAgICBwdWJsaWMgZmluYWwgRW5naW5lIG93bmVyOworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB0aHJlYWQgc3VzcGVuZGVkPyAwPW5vdCBzdXNwZW5kZWQsIDE9c3VzcGVuZGVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogTG9naWNhbGx5IHRoaXMgaXMganVzdCBhIGJvb2xlYW4sIGJ1dCB3ZSBuZWVkIHRvIHByZXBhcmUgZm9yIHRoZSBjYXNlCisgICAgICogd2hlcmUgdGhlIHRocmVhZCBpcyB7QGxpbmsgI3Jlc3VtZShQYWNrZXQpIHJlc3VtZWR9IGJlZm9yZSB3ZSBnZXQgdG8gdGhlIHtAbGluayAjc3VzcGVuZCgpfS4KKyAgICAgKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGluZ3MgaGFwcGVuIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgICoKKyAgICAgKiA8b2w+CisgICAgICogIDxsaT5UdWJlIGRlY2lkZXMgdGhhdCB0aGUgZmliZXIgbmVlZHMgdG8gYmUgc3VzcGVuZGVkIHRvIHdhaXQgZm9yIHRoZSBleHRlcm5hbCBldmVudC4KKyAgICAgKiAgPGxpPlR1YmUgaG9va3MgdXAgZmliZXIgd2l0aCBzb21lIGV4dGVybmFsIG1lY2hhbmlzbSAobGlrZSBOSU8gY2hhbm5lbCBzZWxlY3RvcikKKyAgICAgKiAgPGxpPlR1YmUgcmV0dXJucyB3aXRoIHtAbGluayBOZXh0QWN0aW9uI3N1c3BlbmQoKX0uCisgICAgICogIDxsaT4iRXh0ZXJuYWwgbWVjaGFuaXNtIiBiZWNvbWVzIHNpZ25hbCBzdGF0ZSBhbmQgaW52b2tlcyB7QGxpbmsgRmliZXIjcmVzdW1lKFBhY2tldCl9CisgICAgICogICAgICB0byB3YWtlIHVwIGZpYmVyCisgICAgICogIDxsaT57QGxpbmsgRmliZXIjZG9SdW59IGludm9rZXMge0BsaW5rIEZpYmVyI3N1c3BlbmQoKX0uCisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFVzaW5nIGludCwgdGhpcyB3aWxsIHdvcmsgT0sgYmVjYXVzZSB7QGxpbmsgI3N1c3BlbmRlZENvdW50fSBiZWNvbWVzIC0xIHdoZW4KKyAgICAgKiB7QGxpbmsgI3Jlc3VtZShQYWNrZXQpfSBvY2N1cnMgYmVmb3JlIHtAbGluayAjc3VzcGVuZCgpfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEluY3JlbWVudCBhbmQgZGVjcmVtZW50IGlzIGd1YXJkZWQgYnkgJ3RoaXMnIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBzdXNwZW5kZWRDb3VudCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGZpYmVyIGNvbXBsZXRlZD8KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gY29tcGxldGVkOworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB7QGxpbmsgRmliZXJ9IGN1cnJlbnRseSBydW5uaW5nIGluIHRoZSBzeW5jaHJvbm91cyBtb2RlPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzeW5jaHJvbm91czsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbnRlcnJ1cHRlZDsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGlkOworCisgICAgLyoqCisgICAgICogQWN0aXZlIHtAbGluayBGaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvcn1zIGZvciB0aGlzIGZpYmVyLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdDxGaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvcj4gaW50ZXJjZXB0b3JzOworCisgICAgLyoqCisgICAgICogTm90IG51bGwgd2hlbiB7QGxpbmsgI2ludGVyY2VwdG9yc30gaXMgbm90IG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlcmNlcHRvckhhbmRsZXIgaW50ZXJjZXB0b3JIYW5kbGVyOworCisgICAgLyoqCisgICAgICogVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIHdoZW4gYSBuZXcgaW50ZXJjZXB0b3IgaXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBXaGVuIHRoYXQgaGFwcGVucywgd2UgbmVlZCB0byBmaXJzdCBleGl0IHRoZSBjdXJyZW50IGludGVyY2VwdG9ycworICAgICAqIGFuZCB0aGVuIHJlZW50ZXIgdGhlbSwgc28gdGhhdCB0aGUgbmV3bHkgYWRkZWQgaW50ZXJjZXB0b3JzIHN0YXJ0CisgICAgICogdGFraW5nIGVmZmVjdC4gVGhpcyBmbGFnIGlzIHVzZWQgdG8gY29udHJvbCB0aGF0IGZsb3cuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRzVG9SZWVudGVyOworCisgICAgLyoqCisgICAgICogRmliZXIncyBjb250ZXh0IHtAbGluayBDbGFzc0xvYWRlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBATnVsbGFibGUgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyOworCisgICAgcHJpdmF0ZSBATnVsbGFibGUgQ29tcGxldGlvbkNhbGxiYWNrIGNvbXBsZXRpb25DYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIFNldCB0byB0cnVlIGlmIHRoaXMgZmliZXIgaXMgc3RhcnRlZCBhc3luY2hyb25vdXNseSwgdG8gYXZvaWQKKyAgICAgKiBkb3VibHktaW52b2tpbmcgY29tcGxldGlvbiBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGVkOworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEge0BsaW5rIEZpYmVyfSBmaW5pc2hzIGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENvbXBsZXRpb25DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZmliZXIgaGFzIGZpbmlzaGVkIGl0cyBleGVjdXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBTaW5jZSB0aGUgSkFYLVdTIFJJIHJ1bnMgYXN5bmNocm9ub3VzbHksCisgICAgICAgICAqIHRoaXMgbWV0aG9kIG1heWJlIGludm9rZWQgYnkgYSBkaWZmZXJlbnQgdGhyZWFkCisgICAgICAgICAqIHRoYW4gYW55IG9mIHRoZSB0aHJlYWRzIHRoYXQgc3RhcnRlZCBpdCBvciBydW4gYSBwYXJ0IG9mIHR1YmVsaW5lLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkNvbXBsZXRpb24oQE5vdE51bGwgUGFja2V0IHJlc3BvbnNlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGZpYmVyIGhhcyBmaW5pc2hlZCBhYm5vcm1hbGx5LCBieSB0aHJvd2luZyBhIGdpdmVuIHtAbGluayBUaHJvd2FibGV9LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkNvbXBsZXRpb24oQE5vdE51bGwgVGhyb3dhYmxlIGVycm9yKTsKKyAgICB9CisKKyAgICBGaWJlcihFbmdpbmUgZW5naW5lKSB7CisgICAgICAgIHRoaXMub3duZXIgPSBlbmdpbmU7CisgICAgICAgIGlmKGlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlkID0gaW90YUdlbi5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIExPR0dFUi5maW5lKGdldE5hbWUoKSsiIGNyZWF0ZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlkID0gLTE7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGlzIGlzIHJ1biBmcm9tIGFub3RoZXIgZmliZXIsIHRoZW4gd2UgbmF0dXJhbGx5IGluaGVyaXQgaXRzIGNvbnRleHQgY2xhc3Nsb2FkZXIsCisgICAgICAgIC8vIHNvIHRoaXMgY29kZSB3b3JrcyBmb3IgZmliZXItPmZpYmVyIGluaGVyaXRhbmNlIGp1c3QgZmluZS4KKyAgICAgICAgY29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGZpYmVyIGFzeW5jaHJvbm91c2x5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd29ya3MgbGlrZSB7QGxpbmsgVGhyZWFkI3N0YXJ0KCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHR1YmVsaW5lCisgICAgICogICAgICBUaGUgZmlyc3QgdHViZSBvZiB0aGUgdHViZWxpbmUgdGhhdCB3aWxsIGFjdCBvbiB0aGUgcGFja2V0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogICAgICBUaGUgcmVxdWVzdCBwYWNrZXQgdG8gYmUgcGFzc2VkIHRvIDx0dD5zdGFydFBvaW50LnByb2Nlc3NSZXF1ZXN0KCk8L3R0Pi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGlvbkNhbGxiYWNrCisgICAgICogICAgICBUaGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkIGFuZCB0aGUKKyAgICAgKiAgICAgIGZpbmFsIHJlc3BvbnNlIHBhY2tldCBpcyBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAc2VlICNydW5TeW5jKFR1YmUsUGFja2V0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEBOb3ROdWxsIFR1YmUgdHViZWxpbmUsIEBOb3ROdWxsIFBhY2tldCByZXF1ZXN0LCBATnVsbGFibGUgQ29tcGxldGlvbkNhbGxiYWNrIGNvbXBsZXRpb25DYWxsYmFjaykgeworICAgICAgICBuZXh0ID0gdHViZWxpbmU7CisgICAgICAgIHRoaXMucGFja2V0ID0gcmVxdWVzdDsKKyAgICAgICAgdGhpcy5jb21wbGV0aW9uQ2FsbGJhY2sgPSBjb21wbGV0aW9uQ2FsbGJhY2s7CisgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7CisgICAgICAgIG93bmVyLmFkZFJ1bm5hYmxlKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdha2VzIHVwIGEgc3VzcGVuZGVkIGZpYmVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgYSBmaWJlciB3YXMgc3VzcGVuZGVkIGZyb20gdGhlIHtAbGluayBUdWJlI3Byb2Nlc3NSZXF1ZXN0KFBhY2tldCl9IG1ldGhvZCwKKyAgICAgKiB0aGVuIHRoZSBleGVjdXRpb24gd2lsbCBiZSByZXN1bWVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiB7QGxpbmsgVHViZSNwcm9jZXNzUmVzcG9uc2UoUGFja2V0KX0gbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCByZXNwb25zZSBwYWNrZXQKKyAgICAgKiBhcyB0aGUgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgYSBmaWJlciB3YXMgc3VzcGVuZGVkIGZyb20gdGhlIHtAbGluayBUdWJlI3Byb2Nlc3NSZXNwb25zZShQYWNrZXQpfSBtZXRob2QsCisgICAgICogdGhlbiB0aGUgZXhlY3V0aW9uIHdpbGwgYmUgcmVzdW1lZCBmcm9tIHRoZSBuZXh0IHR1YmUncworICAgICAqIHtAbGluayBUdWJlI3Byb2Nlc3NSZXNwb25zZShQYWNrZXQpfSBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHJlc3BvbnNlIHBhY2tldAorICAgICAqIGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBhIHJhY2UtZnJlZSB3YXkuIEFub3RoZXIgdGhyZWFkIGNhbiBpbnZva2UKKyAgICAgKiB0aGlzIG1ldGhvZCBldmVuIGJlZm9yZSB0aGlzIGZpYmVyIGdvZXMgaW50byB0aGUgc3VzcGVuc2lvbiBtb2RlLiBTbyB0aGUgY2FsbGVyCisgICAgICogbmVlZCBub3Qgd29ycnkgYWJvdXQgc3luY2hyb25pemluZyB7QGxpbmsgTmV4dEFjdGlvbiNzdXNwZW5kKCl9IGFuZCB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdW1lKEBOb3ROdWxsIFBhY2tldCByZXNwb25zZSkgeworICAgICAgICBpZihpc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgTE9HR0VSLmZpbmUoZ2V0TmFtZSgpKyIgcmVzdW1lZCIpOworICAgICAgICBwYWNrZXQgPSByZXNwb25zZTsKKyAgICAgICAgaWYoIC0tc3VzcGVuZGVkQ291bnQgPT0gMCApIHsKKyAgICAgICAgICAgIGlmKHN5bmNocm9ub3VzKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG93bmVyLmFkZFJ1bm5hYmxlKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdXNwZW5kcyB0aGlzIGZpYmVyJ3MgZXhlY3V0aW9uIHVudGlsIHRoZSByZXN1bWUgbWV0aG9kIGlzIGludm9rZWQuCisgICAgICoKKyAgICAgKiBUaGUgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5LCBhbmQgd2hlbiB0aGUgZmliZXIgaXMgcmVzdW1lZAorICAgICAqIHRoZSBleGVjdXRpb24gcGlja3MgdXAgZnJvbSB0aGUgbGFzdCBzY2hlZHVsZWQgY29udGludWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc3VzcGVuZCgpIHsKKyAgICAgICAgaWYoaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIExPR0dFUi5maW5lKGdldE5hbWUoKSsiIHN1c3BlbmRlZCIpOworICAgICAgICBzdXNwZW5kZWRDb3VudCsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcge0BsaW5rIEZpYmVyQ29udGV4dFN3aXRjaEludGVyY2VwdG9yfSB0byB0aGlzIGZpYmVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIG5ld2x5IGluc3RhbGxlZCBmaWJlciB3aWxsIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50CisgICAgICogdHViZSByZXR1cm5zIGZyb20gaXRzIHtAbGluayBUdWJlI3Byb2Nlc3NSZXF1ZXN0KFBhY2tldCl9IG9yCisgICAgICoge0BsaW5rIFR1YmUjcHJvY2Vzc1Jlc3BvbnNlKFBhY2tldCl9LCBiZWZvcmUgdGhlIG5leHQgdHViZSBiZWdpbnMgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNvIHdoZW4gdGhlIHR1YmVsaW5lIGNvbnNpc3RzIG9mIFggYW5kIFksIGFuZCB3aGVuIFggaW5zdGFsbHMgYW4gaW50ZXJjZXB0b3IsCisgICAgICogdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiB3aWxsIGJlIGFzIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiA8b2w+CisgICAgICogIDxsaT5YLnByb2Nlc3NSZXF1ZXN0KCkKKyAgICAgKiAgPGxpPmludGVyY2VwdG9yIGdldHMgaW5zdGFsbGVkCisgICAgICogIDxsaT5pbnRlcmNlcHRvci5leGVjdXRlKCkgaXMgaW52b2tlZAorICAgICAqICA8bGk+WS5wcm9jZXNzUmVxdWVzdCgpCisgICAgICogPC9vbD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnRlcmNlcHRvcihATm90TnVsbCBGaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvciBpbnRlcmNlcHRvcikgeworICAgICAgICBpZihpbnRlcmNlcHRvcnMgPT1udWxsKSB7CisgICAgICAgICAgICBpbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PEZpYmVyQ29udGV4dFN3aXRjaEludGVyY2VwdG9yPigpOworICAgICAgICAgICAgaW50ZXJjZXB0b3JIYW5kbGVyID0gbmV3IEludGVyY2VwdG9ySGFuZGxlcigpOworICAgICAgICB9CisgICAgICAgIGludGVyY2VwdG9ycy5hZGQoaW50ZXJjZXB0b3IpOworICAgICAgICBuZWVkc1RvUmVlbnRlciA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIHtAbGluayBGaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvcn0gZnJvbSB0aGlzIGZpYmVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIHJlbW92YWwgb2YgdGhlIGludGVyY2VwdG9yIHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudAorICAgICAqIHR1YmUgcmV0dXJucyBmcm9tIGl0cyB7QGxpbmsgVHViZSNwcm9jZXNzUmVxdWVzdChQYWNrZXQpfSBvcgorICAgICAqIHtAbGluayBUdWJlI3Byb2Nlc3NSZXNwb25zZShQYWNrZXQpfSwgYmVmb3JlIHRoZSBuZXh0IHR1YmUgYmVnaW5zIHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNvIHdoZW4gdGhlIHR1YmVsaW5lIGNvbnNpc3RzIG9mIFggYW5kIFksIGFuZCB3aGVuIFkgdW5pbnN0YWxscyBhbiBpbnRlcmNlcHRvcgorICAgICAqIG9uIHRoZSB3YXkgb3V0LCB0aGVuIHRoZSBvcmRlciBvZiBleGVjdXRpb24gd2lsbCBiZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogPG9sPgorICAgICAqICA8bGk+WS5wcm9jZXNzUmVzcG9uc2UoKSAobm90aWNlIHRoYXQgdGhpcyBoYXBwZW5zIHdpdGggaW50ZXJjZXB0b3IuZXhlY3V0ZSgpIGluIHRoZSBjYWxsc3RhY2spCisgICAgICogIDxsaT5pbnRlcmNlcHRvciBnZXRzIHVuaW5zdGFsbGVkCisgICAgICogIDxsaT5pbnRlcmNlcHRvci5leGVjdXRlKCkgcmV0dXJucworICAgICAqICA8bGk+WC5wcm9jZXNzUmVzcG9uc2UoKQorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW50ZXJjZXB0b3Igd2FzIHJlbW92ZWQuIEZhbHNlIGlmCisgICAgICogICAgICB0aGUgc3BlY2lmaWVkIGludGVyY2VwdG9yIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZmliZXIgdG8gYmVnaW4gd2l0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVJbnRlcmNlcHRvcihATm90TnVsbCBGaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvciBpbnRlcmNlcHRvcikgeworICAgICAgICBpZihpbnRlcmNlcHRvcnMgIT1udWxsICYmIGludGVyY2VwdG9ycy5yZW1vdmUoaW50ZXJjZXB0b3IpKSB7CisgICAgICAgICAgICBuZWVkc1RvUmVlbnRlciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29udGV4dCB7QGxpbmsgQ2xhc3NMb2FkZXJ9IG9mIHRoaXMgZmliZXIuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0Q2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29udGV4dCB7QGxpbmsgQ2xhc3NMb2FkZXJ9IG9mIHRoaXMgZmliZXIuCisgICAgICovCisgICAgcHVibGljIENsYXNzTG9hZGVyIHNldENvbnRleHRDbGFzc0xvYWRlcihATnVsbGFibGUgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyKSB7CisgICAgICAgIENsYXNzTG9hZGVyIHIgPSB0aGlzLmNvbnRleHRDbGFzc0xvYWRlcjsKKyAgICAgICAgdGhpcy5jb250ZXh0Q2xhc3NMb2FkZXIgPSBjb250ZXh0Q2xhc3NMb2FkZXI7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIC8qKgorICAgICAqIERPIE5PVCBDQUxMIFRISVMgTUVUSE9ELiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbAorICAgICAqIG9mIHtAbGluayBGaWJlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIGFzc2VydCAhc3luY2hyb25vdXM7CisgICAgICAgIG5leHQgPSBkb1J1bihuZXh0KTsKKyAgICAgICAgY29tcGxldGlvbkNoZWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBhIGdpdmVuIHtAbGluayBUdWJlfSAoYW5kIGV2ZXJ5dGhpbmcgdGhlcmVhZnRlcikgc3luY2hyb25vdXNseS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyBhbmQgcmV0dXJucyBvbmx5IHdoZW4gYWxsIHRoZSBzdWNjZXNzaXZlIHtAbGluayBUdWJlfXMKKyAgICAgKiBjb21wbGV0ZSB0aGVpciByZXF1ZXN0L3Jlc3BvbnNlIHByb2Nlc3NpbmcuIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkCisgICAgICogaWYgYSB7QGxpbmsgVHViZX0gbmVlZHMgdG8gZmFsbGJhY2sgdG8gc3luY2hyb25vdXMgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIDxoMz5FeGFtcGxlOjwvaDM+CisgICAgICogPHByZT4KKyAgICAgKiBjbGFzcyBGb29UdWJlIGV4dGVuZHMge0BsaW5rIEFic3RyYWN0RmlsdGVyVHViZUltcGx9IHsKKyAgICAgKiAgIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgKiAgICAgLy8gcnVuIGV2ZXJ5dGhpbmcgc3luY2hyb25vdXNseSBhbmQgcmV0dXJuIHdpdGggdGhlIHJlc3BvbnNlIHBhY2tldAorICAgICAqICAgICByZXR1cm4gZG9SZXR1cm5XaXRoKEZpYmVyLmN1cnJlbnQoKS5ydW5TeW5jKG5leHQscmVxdWVzdCkpOworICAgICAqICAgfQorICAgICAqICAgTmV4dEFjdGlvbiBwcm9jZXNzUmVzcG9uc2UoUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICogICAgIC8vIG5ldmVyIGJlIGludm9rZWQKKyAgICAgKiAgIH0KKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdHViZWxpbmUKKyAgICAgKiAgICAgIFRoZSBmaXJzdCB0dWJlIG9mIHRoZSB0dWJlbGluZSB0aGF0IHdpbGwgYWN0IG9uIHRoZSBwYWNrZXQuCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiAgICAgIFRoZSByZXF1ZXN0IHBhY2tldCB0byBiZSBwYXNzZWQgdG8gPHR0PnN0YXJ0UG9pbnQucHJvY2Vzc1JlcXVlc3QoKTwvdHQ+LgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSByZXNwb25zZSBwYWNrZXQgdG8gdGhlIDx0dD5yZXF1ZXN0PC90dD4uCisgICAgICoKKyAgICAgKiBAc2VlICNzdGFydChUdWJlLCBQYWNrZXQsIENvbXBsZXRpb25DYWxsYmFjaykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEBOb3ROdWxsIFBhY2tldCBydW5TeW5jKEBOb3ROdWxsIFR1YmUgdHViZWxpbmUsIEBOb3ROdWxsIFBhY2tldCByZXF1ZXN0KSB7CisgICAgICAgIC8vIHNhdmUgdGhlIGN1cnJlbnQgY29udGludWF0aW9uLCBzbyB0aGF0IHdlIHJldHVybiBydW5TeW5jKCkgd2l0aG91dCBleGVjdXRpbmcgdGhlbS4KKyAgICAgICAgZmluYWwgVHViZVtdIG9sZENvbnQgPSBjb250czsKKyAgICAgICAgZmluYWwgaW50IG9sZENvbnRTaXplID0gY29udHNTaXplOworICAgICAgICBmaW5hbCBib29sZWFuIG9sZFN5bmNocm9ub3VzID0gc3luY2hyb25vdXM7CisKKyAgICAgICAgaWYob2xkQ29udFNpemU+MCkgeworICAgICAgICAgICAgY29udHMgPSBuZXcgVHViZVsxNl07CisgICAgICAgICAgICBjb250c1NpemU9MDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbm91cyA9IHRydWU7CisgICAgICAgICAgICB0aGlzLnBhY2tldCA9IHJlcXVlc3Q7CisgICAgICAgICAgICBkb1J1bih0dWJlbGluZSk7CisgICAgICAgICAgICBpZih0aHJvd2FibGUhPW51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgdGhyb3dhYmxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKSB0aHJvd2FibGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIG91ciBzeXN0ZW0gaXMgc3VwcG9zZWQgdG8gb25seSBhY2NlcHQgRXJyb3Igb3IgUnVudGltZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih0aHJvd2FibGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY29udHMgPSBvbGRDb250OworICAgICAgICAgICAgY29udHNTaXplID0gb2xkQ29udFNpemU7CisgICAgICAgICAgICBzeW5jaHJvbm91cyA9IG9sZFN5bmNocm9ub3VzOworICAgICAgICAgICAgaWYoaW50ZXJydXB0ZWQpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIGludGVycnVwdGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighc3RhcnRlZCkKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uQ2hlY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY29tcGxldGlvbkNoZWNrKCkgeworICAgICAgICBpZihjb250c1NpemU9PTApIHsKKyAgICAgICAgICAgIGlmKGlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgTE9HR0VSLmZpbmUoZ2V0TmFtZSgpKyIgY29tcGxldGVkIik7CisgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgICAgICAgICBpZihjb21wbGV0aW9uQ2FsbGJhY2shPW51bGwpIHsKKyAgICAgICAgICAgICAgICBpZih0aHJvd2FibGUhPW51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25DYWxsYmFjay5vbkNvbXBsZXRpb24odGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25DYWxsYmFjay5vbkNvbXBsZXRpb24ocGFja2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyoqCisgICAgLy8gKiBCbG9ja3MgdW50aWwgdGhlIGZpYmVyIGNvbXBsZXRlcy4KKyAgICAvLyAqLworICAgIC8vcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGpvaW4oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIC8vICAgIHdoaWxlKCFjb21wbGV0ZWQpCisgICAgLy8gICAgICAgIHdhaXQoKTsKKyAgICAvL30KKworICAgIC8qKgorICAgICAqIEludm9rZXMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIEludGVyY2VwdG9ySGFuZGxlcn1zIGFuZCB0aGVuIGNhbGwgaW50bworICAgICAqIHtAbGluayBGaWJlciNfX2RvUnVuKFR1YmUpfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEludGVyY2VwdG9ySGFuZGxlciBpbXBsZW1lbnRzIEZpYmVyQ29udGV4dFN3aXRjaEludGVyY2VwdG9yLldvcms8VHViZSxUdWJlPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRleCBpbiB7QGxpbmsgRmliZXIjaW50ZXJjZXB0b3JzfSB0byBpbnZva2UgbmV4dC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IGlkeDsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhdGUgdGhlIGludGVyY2VwdGlvbiwgYW5kIGV2ZW50dWFsbHkgaW52b2tlcyB7QGxpbmsgRmliZXIjX19kb1J1bihUdWJlKX0uCisgICAgICAgICAqLworICAgICAgICBUdWJlIGludm9rZShUdWJlIG5leHQpIHsKKyAgICAgICAgICAgIGlkeD0wOworICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGUobmV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVHViZSBleGVjdXRlKFR1YmUgbmV4dCkgeworICAgICAgICAgICAgaWYoaWR4PT1pbnRlcmNlcHRvcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9fZG9SdW4obmV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEZpYmVyQ29udGV4dFN3aXRjaEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gaW50ZXJjZXB0b3JzLmdldChpZHgrKyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludGVyY2VwdG9yLmV4ZWN1dGUoRmliZXIudGhpcyxuZXh0LHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGZpYmVyIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV4dAorICAgICAqICAgICAgVGhlIG5leHQgdHViZSB3aG9zZSB7QGxpbmsgVHViZSNwcm9jZXNzUmVxdWVzdChQYWNrZXQpfSBpcyB0byBiZSBpbnZva2VkLiBJZiBudWxsLAorICAgICAqICAgICAgdGhhdCBtZWFucyB3ZSdsbCBqdXN0IGNhbGwge0BsaW5rIFR1YmUjcHJvY2Vzc1Jlc3BvbnNlKFBhY2tldCl9IG9uIHRoZSBjb250aW51YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBJZiBub24tbnVsbCwgdGhlIG5leHQgdGltZSBleGVjdXRpb24gcmVzdW1lcywgaXQgc2hvdWxkIHJlc3VtZSBmcm9tIGNhbGxpbmcKKyAgICAgKiAgICAgIHRoZSB7QGxpbmsgVHViZSNwcm9jZXNzUmVxdWVzdChQYWNrZXQpfS4gT3RoZXJ3aXNlIGl0IG1lYW5zIGp1c3QgZmluaXNoaW5nIHVwCisgICAgICogICAgICB0aGUgY29udGludWF0aW9uLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiTG9vcFN0YXRlbWVudFRoYXREb2VzbnRMb29wIn0pIC8vIEludGVsbGlKIHJlcG9ydHMgdGhpcyBib2d1cyBlcnJvcgorICAgIHByaXZhdGUgVHViZSBkb1J1bihUdWJlIG5leHQpIHsKKyAgICAgICAgVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworCisgICAgICAgIGlmKGlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBMT0dHRVIuZmluZShnZXROYW1lKCkrIiBydW5uaW5nIGJ5ICIrY3VycmVudFRocmVhZC5nZXROYW1lKCkpOworCisgICAgICAgIGlmKHNlcmlhbGl6ZUV4ZWN1dGlvbikgeworICAgICAgICAgICAgc2VyaWFsaXplZEV4ZWN1dGlvbkxvY2subG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RvUnVuKG5leHQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkRXhlY3V0aW9uTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBfZG9SdW4obmV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFR1YmUgX2RvUnVuKFR1YmUgbmV4dCkgeworICAgICAgICBUaHJlYWQgY3VycmVudFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisKKyAgICAgICAgQ2xhc3NMb2FkZXIgb2xkID0gY3VycmVudFRocmVhZC5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgY3VycmVudFRocmVhZC5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY29udGV4dENsYXNzTG9hZGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBuZWVkc1RvUmVlbnRlciA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gaWYgaW50ZXJjZXB0b3JzIGFyZSBzZXQsIGdvIHRocm91Z2ggdGhlIGludGVyY2VwdG9ycy4KKyAgICAgICAgICAgICAgICBpZihpbnRlcmNlcHRvckhhbmRsZXIgPT1udWxsKQorICAgICAgICAgICAgICAgICAgICBuZXh0ID0gX19kb1J1bihuZXh0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBpbnRlcmNlcHRvckhhbmRsZXIuaW52b2tlKG5leHQpOworICAgICAgICAgICAgfSB3aGlsZShuZWVkc1RvUmVlbnRlcik7CisKKyAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY3VycmVudFRocmVhZC5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob2xkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIGludm9rZWQgZnJvbSB7QGxpbmsgI2RvUnVuKFR1YmUpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI2RvUnVuKFR1YmUpCisgICAgICovCisgICAgcHJpdmF0ZSBUdWJlIF9fZG9SdW4oVHViZSBuZXh0KSB7CisgICAgICAgIGZpbmFsIEZpYmVyIG9sZCA9IENVUlJFTlRfRklCRVIuZ2V0KCk7CisgICAgICAgIENVUlJFTlRfRklCRVIuc2V0KHRoaXMpOworCisgICAgICAgIC8vIGlmIHRydWUsIGxvdHMgb2YgZGVidWcgbWVzc2FnZXMgdG8gc2hvdyB3aGF0J3MgYmVpbmcgZXhlY3V0ZWQKKyAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFjZUVuYWJsZWQgPSBMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FUik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlKCFpc0Jsb2NraW5nKCkgJiYgIW5lZWRzVG9SZWVudGVyKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgTmV4dEFjdGlvbiBuYTsKKyAgICAgICAgICAgICAgICAgICAgVHViZSBsYXN0OworICAgICAgICAgICAgICAgICAgICBpZih0aHJvd2FibGUhPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbnRzU2l6ZT09MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgZWxzZSB0byBleGVjdXRlLiB3ZSBhcmUgZG9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBwb3BDb250KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZih0cmFjZUVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmZpbmVyKGdldE5hbWUoKSsnICcrbGFzdCsiLnByb2Nlc3NFeGNlcHRpb24oIit0aHJvd2FibGUrJyknKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hID0gbGFzdC5wcm9jZXNzRXhjZXB0aW9uKHRocm93YWJsZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXh0IT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHJhY2VFbmFibGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZmluZXIoZ2V0TmFtZSgpKycgJytuZXh0KyIucHJvY2Vzc1JlcXVlc3QoIitwYWNrZXQrJyknKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYSA9IG5leHQucHJvY2Vzc1JlcXVlc3QocGFja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29udHNTaXplPT0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgZWxzZSB0byBleGVjdXRlLiB3ZSBhcmUgZG9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBwb3BDb250KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHJhY2VFbmFibGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZmluZXIoZ2V0TmFtZSgpKycgJytsYXN0KyIucHJvY2Vzc1Jlc3BvbnNlKCIrcGFja2V0KycpJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEgPSBsYXN0LnByb2Nlc3NSZXNwb25zZShwYWNrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYodHJhY2VFbmFibGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmZpbmVyKGdldE5hbWUoKSsnICcrbGFzdCsiIHJldHVybmVkIHdpdGggIituYSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgcmVzdW1lIGlzIGNhbGxlZCBiZWZvcmUgc3VzcGVuZCwgdGhlbiBtYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUoUGFja2V0KSBpcyBub3QgbG9zdAorICAgICAgICAgICAgICAgICAgICBpZiAobmEua2luZCAhPSBOZXh0QWN0aW9uLlNVU1BFTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCA9IG5hLnBhY2tldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IG5hLnRocm93YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChuYS5raW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTmV4dEFjdGlvbi5JTlZPS0U6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ29udChsYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBuZXh0CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTmV4dEFjdGlvbi5JTlZPS0VfQU5EX0ZPUkdFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBuYS5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTmV4dEFjdGlvbi5SRVRVUk46CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTmV4dEFjdGlvbi5USFJPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTmV4dEFjdGlvbi5TVVNQRU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaENvbnQobGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYodHJhY2VFbmFibGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FUixnZXROYW1lKCkrIiBDYXVnaHQgIit0KyIuIFN0YXJ0IHN0YWNrIHVud2luZGluZyIsdCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IHQ7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IgdCkgeworICAgICAgICAgICAgICAgICAgICBpZih0cmFjZUVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkVSLGdldE5hbWUoKSsiIENhdWdodCAiK3QrIi4gU3RhcnQgc3RhY2sgdW53aW5kaW5nIix0KTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0aGVyZSdzIG5vdGhpbmcgd2UgY2FuIGV4ZWN1dGUgcmlnaHQgYXdheS4KKyAgICAgICAgICAgIC8vIHdlJ2xsIGJlIGJhY2sgd2hlbiB0aGlzIGZpYmVyIGlzIHJlc3VtZWQuCisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIENVUlJFTlRfRklCRVIuc2V0KG9sZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHVzaENvbnQoVHViZSB0dWJlKSB7CisgICAgICAgIGNvbnRzW2NvbnRzU2l6ZSsrXSA9IHR1YmU7CisKKyAgICAgICAgLy8gZXhwYW5kIGlmIG5lZWRlZAorICAgICAgICBpbnQgbGVuID0gY29udHMubGVuZ3RoOworICAgICAgICBpZihjb250c1NpemU9PWxlbikgeworICAgICAgICAgICAgVHViZVtdIG5ld0J1ZiA9IG5ldyBUdWJlW2xlbioyXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29udHMsMCxuZXdCdWYsMCxsZW4pOworICAgICAgICAgICAgY29udHMgPSBuZXdCdWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFR1YmUgcG9wQ29udCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRzWy0tY29udHNTaXplXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpYmVyIG5lZWRzIHRvIGJsb2NrIGl0cyBleGVjdXRpb24uCisgICAgICovCisgICAgLy8gVE9ETzogc3luY2hyb25pemF0aW9uIG9uIHN5bmNocm9ub3VzIGNhc2UgaXMgd3JvbmcuCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQmxvY2tpbmcoKSB7CisgICAgICAgIGlmKHN5bmNocm9ub3VzKSB7CisgICAgICAgICAgICB3aGlsZShzdXNwZW5kZWRDb3VudD09MSkKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmZpbmUoZ2V0TmFtZSgpKyIgaXMgYmxvY2tpbmcgdGhyZWFkICIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsgLy8gdGhlIHN5bmNocm9uaXplZCBibG9jayBpcyB0aGUgd2hvbGUgcnVuU3luYyBtZXRob2QuCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyByZW1lbWJlciB0aGF0IHdlIGFyZSBpbnRlcnJ1cHRlZCwgYnV0IGRvbid0IHJlc3BvbmQgdG8gaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHQgYXdheS4gVGhpcyBiZWhhdmlvciBpcyBpbiBsaW5lIHdpdGggd2hhdCBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4geW91IGFyZSBhY3R1YWxseSBydW5uaW5nIHRoZSB3aG9sZSB0aGluZyBzeW5jaHJvbm91c2x5LgorICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBzdXNwZW5kZWRDb3VudD09MTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gImVuZ2luZS0iK293bmVyLmlkKyJmaWJlci0iK2lkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCB7QGxpbmsgUGFja2V0fSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWJlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiBubyBwYWNrZXQgaGFzIGJlZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWJlciB5ZXQuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBQYWNrZXQgZ2V0UGFja2V0KCkgeworICAgICAgICByZXR1cm4gcGFja2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpYmVyIGlzIHN0aWxsIHJ1bm5pbmcgb3Igc3VzcGVuZGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWxpdmUoKSB7CisgICAgICAgIHJldHVybiAhY29tcGxldGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIChBRFZBTkNFRCkgUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGZpYmVyIGlzIGJlaW5nIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGaWJlciBtYXkgcnVuIHN5bmNocm9ub3VzbHkgZm9yIHZhcmlvdXMgcmVhc29ucy4gUGVyaGFwcyB0aGlzIGlzCisgICAgICogb24gY2xpZW50IHNpZGUgYW5kIGFwcGxpY2F0aW9uIGhhcyBpbnZva2VkIGEgc3luY2hyb25vdXMgbWV0aG9kIGNhbGwuCisgICAgICogUGVyaGFwcyB0aGlzIGlzIG9uIHNlcnZlciBzaWRlIGFuZCB3ZSBoYXZlIGRlcGxveWVkIG9uIGEgc3luY2hyb25vdXMKKyAgICAgKiB0cmFuc3BvcnQgKGxpa2Ugc2VydmxldC4pCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIGEgZmliZXIgaXMgcnVuIHN5bmNocm9ub3VzbHkgKElPVyBieSB7QGxpbmsgI3J1blN5bmMoVHViZSwgUGFja2V0KX0pLAorICAgICAqIGZ1cnRoZXIgaW52b2NhdGlvbnMgdG8ge0BsaW5rICNydW5TeW5jKFR1YmUsIFBhY2tldCl9IGNhbiBiZSBkb25lCisgICAgICogd2l0aG91dCBkZWdyYWRpbmcgdGhlIHBlcmZvcm1hbmNlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogU28gdGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCBhcyBhIGZ1cnRoZXIgb3B0aW1pemF0aW9uIGhpbnQgZm9yCisgICAgICogYWR2YW5jZWQge0BsaW5rIFR1YmV9cyB0byBjaG9vc2UgdGhlIGJlc3Qgc3RyYXRlZ3kgdG8gaW52b2tlCisgICAgICogdGhlIG5leHQge0BsaW5rIFR1YmV9LiBGb3IgZXhhbXBsZSwgYSB0dWJlIG1heSB3YW50IHRvIGluc3RhbGwKKyAgICAgKiBhIHtAbGluayBGaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvcn0gaWYgcnVubmluZyBhc3luYywgeWV0CisgICAgICogaXQgbWlnaHQgZmluZCBpdCBmYXN0ZXIgdG8gZG8ge0BsaW5rICNydW5TeW5jKFR1YmUsIFBhY2tldCl9CisgICAgICogaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcgc3luY2hyb25vdXNseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jaHJvbm91cygpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnQoKS5zeW5jaHJvbm91czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGZpYmVyIHRoYXQncyBydW5uaW5nLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyB3b3JrcyBsaWtlIHtAbGluayBUaHJlYWQjY3VycmVudFRocmVhZCgpfS4KKyAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIHdoZW4gaW52b2tlZCBmcm9tIHtAbGluayBUdWJlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIEZpYmVyIGN1cnJlbnQoKSB7CisgICAgICAgIEZpYmVyIGZpYmVyID0gQ1VSUkVOVF9GSUJFUi5nZXQoKTsKKyAgICAgICAgaWYoZmliZXI9PW51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4gYmUgb25seSB1c2VkIGZyb20gZmliZXJzIik7CisgICAgICAgIHJldHVybiBmaWJlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxGaWJlcj4gQ1VSUkVOVF9GSUJFUiA9IG5ldyBUaHJlYWRMb2NhbDxGaWJlcj4oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gYWxsb2NhdGUgdW5pcXVlIG51bWJlciBmb3IgZWFjaCBmaWJlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIGlvdGFHZW4gPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RyYWNlRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZpYmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlZW50cmFudExvY2sgc2VyaWFsaXplZEV4ZWN1dGlvbkxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworCisgICAgLyoqCisgICAgICogU2V0IHRoaXMgYm9vbGVhbiB0byB0cnVlIHRvIGV4ZWN1dGUgZmliZXJzIHNlcXVlbnRpYWxseSBvbmUgYnkgb25lLgorICAgICAqIFNlZSBjbGFzcyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBzZXJpYWxpemVFeGVjdXRpb24gPSBCb29sZWFuLmdldEJvb2xlYW4oRmliZXIuY2xhc3MuZ2V0TmFtZSgpKyIuc2VyaWFsaXplIik7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9GaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvRmliZXJDb250ZXh0U3dpdGNoSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2Q1ZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvRmliZXJDb250ZXh0U3dpdGNoSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKKworLyoqCisgKiBJbnRlcmNlcHRpb24gZm9yIHtAbGluayBGaWJlcn0gY29udGV4dCBzd2l0Y2guCisgKgorICogPHA+CisgKiBFdmVuIHRob3VnaCBwaXBlbGluZSBydW5zIGFzeW5jaHJvbm91c2x5LCBzb21ldGltZXMgaXQncyBkZXNpcmFibGUKKyAqIHRvIGJpbmQgc29tZSBzdGF0ZSB0byB0aGUgY3VycmVudCB0aHJlYWQgcnVubmluZyBhIGZpYmVyLiBTdWNoIHN0YXRlCisgKiBtYXkgaW5jbHVkZSBzZWN1cml0eSBzdWJqZWN0IChpbiB0ZXJtcyBvZiB7QGxpbmsgQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWR9KSwKKyAqIG9yIGEgdHJhbnNhY3Rpb24uCisgKgorICogPHA+CisgKiBUaGlzIG1lY2hhbmlzbSBtYWtlcyBpdCBwb3NzaWJsZSB0byBkbyBzdWNoIHRoaW5ncywgYnkgYWxsb3dpbmcKKyAqIHNvbWUgY29kZSB0byBiZSBleGVjdXRlZCBiZWZvcmUgYW5kIGFmdGVyIGEgdGhyZWFkIGV4ZWN1dGVzIGEgZmliZXIuCisgKgorICogPHA+CisgKiBUaGUgZGVzaWduIGFsc28gZW5jYXBzdWxhdGVzIHRoZSBlbnRpcmUgZmliZXIgZXhlY3V0aW9uIGluIGEgc2luZ2xlCisgKiBvcGFxdWUgbWV0aG9kIGludm9jYXRpb24ge0BsaW5rIFdvcmsjZXhlY3V0ZX0sIGFsbG93aW5nIHRoZSB1c2Ugb2YKKyAqIDx0dD5maW5hbGx5PC90dD4gYmxvY2suCisgKgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBGaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvciB7CisgICAgLyoqCisgICAgICogQWxsb3dzIHRoZSBpbnRlcmNlcHRpb24gb2YgdGhlIGZpYmVyIGV4ZWN1dGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGxpa2UgdGhpczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogJmx0O1IsUD4gUiBleGVjdXRlKCBGaWJlciBmLCBQIHAsIFdvcmsmbHQ7UixQPiB3b3JrICkgeworICAgICAqICAgLy8gZG8gc29tZSBwcmVwYXJhdGlvbiB3b3JrCisgICAgICogICAuLi4KKyAgICAgKiAgIHRyeSB7CisgICAgICogICAgIC8vIGludm9rZQorICAgICAqICAgICByZXR1cm4gd29yay5leGVjdXRlKHApOworICAgICAqICAgfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgLy8gZG8gc29tZSBjbGVhbiB1cCB3b3JrCisgICAgICogICAgIC4uLgorICAgICAqICAgfQorICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoaWxlIHNvbWV3aGF0IHVuaW50dWl0aXZlLAorICAgICAqIHRoaXMgaW50ZXJjZXB0aW9uIG1lY2hhbmlzbSBlbmFibGVzIHRoZSBpbnRlcmNlcHRvciB0byB3cmFwCisgICAgICogdGhlIHdob2xlIGZpYmVyIGV4ZWN1dGlvbiBpbnRvIGEge0BsaW5rIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24pfSwKKyAgICAgKiBmb3IgZXhhbXBsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICB7QGxpbmsgRmliZXJ9IHRvIGJlIGV4ZWN1dGVkLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICBUaGUgb3BhcXVlIHBhcmFtZXRlciB2YWx1ZSBmb3Ige0BsaW5rIFdvcmt9LiBTaW1wbHkgcGFzcyB0aGlzIHZhbHVlIHRvCisgICAgICogICAgICB7QGxpbmsgV29yayNleGVjdXRlKE9iamVjdCl9LgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSBvcGFxdWUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHRoZSB7QGxpbmsgV29ya30uIFNpbXBseSByZXR1cm4KKyAgICAgKiAgICAgIHRoZSB2YWx1ZSBmcm9tIHtAbGluayBXb3JrI2V4ZWN1dGUoT2JqZWN0KX0uCisgICAgICovCisgICAgPFIsUD4gUiBleGVjdXRlKCBGaWJlciBmLCBQIHAsIFdvcms8UixQPiB3b3JrICk7CisKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdGlvbiBvZiB0aGUgZXhlY3V0aW9uIHRoYXQgaGFwcGVucyBpbnNpZGUgdGhlIGludGVyY2VwdG9yLgorICAgICAqLworICAgIGludGVyZmFjZSBXb3JrPFIsUD4geworICAgICAgICAvKioKKyAgICAgICAgICogSGF2ZSB0aGUgY3VycmVudCB0aHJlYWQgZXhlY3V0ZXMgdGhlIGN1cnJlbnQgZmliZXIsCisgICAgICAgICAqIGFuZCByZXR1cm5zIHdoZW4gaXQgc3RvcHMgZG9pbmcgc28uCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGFyYW1ldGVyIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGNvbnRyb2xsZWQgYnkgdGhlCisgICAgICAgICAqIEpBWC1XUyBydW50aW1lLCBhbmQgaW50ZXJjZXB0b3JzIHNob3VsZCBzaW1wbHkgdHJlYXQKKyAgICAgICAgICogdGhlbSBhcyBvcGFxdWUgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgUiBleGVjdXRlKFAgcGFyYW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL05leHRBY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL05leHRBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQzNWQzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvTmV4dEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGU7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CisKKy8qKgorICogSW5kaWNhdGVzIHdoYXQgc2hhbGwgaGFwcGVuIGFmdGVyIHtAbGluayBUdWJlI3Byb2Nlc3NSZXF1ZXN0KFBhY2tldCl9IG9yCisgKiB7QGxpbmsgVHViZSNwcm9jZXNzUmVzcG9uc2UoUGFja2V0KX0gcmV0dXJucy4KKyAqCisgKiA8cD4KKyAqIFRvIGFsbG93IHJldXNlIG9mIHRoaXMgb2JqZWN0LCB0aGlzIGNsYXNzIGlzIG11dGFibGUuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTmV4dEFjdGlvbiB7CisgICAgaW50IGtpbmQ7CisgICAgVHViZSBuZXh0OworICAgIFBhY2tldCBwYWNrZXQ7CisgICAgLyoqCisgICAgICogUmVhbGx5IGVpdGhlciB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0gb3Ige0BsaW5rIEVycm9yfS4KKyAgICAgKi8KKyAgICBUaHJvd2FibGUgdGhyb3dhYmxlOworCisgICAgLy8gcHVibGljIGVudW0gS2luZCB7IElOVk9LRSwgSU5WT0tFX0FORF9GT1JHRVQsIFJFVFVSTiwgU1VTUEVORCB9CisKKyAgICBzdGF0aWMgZmluYWwgaW50IElOVk9LRSA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBJTlZPS0VfQU5EX0ZPUkdFVCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBSRVRVUk4gPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVEhST1cgPSAzOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU1VTUEVORCA9IDQ7CisKKyAgICBwcml2YXRlIHZvaWQgc2V0KGludCBrLCBUdWJlIHYsIFBhY2tldCBwLCBUaHJvd2FibGUgdCkgeworICAgICAgICB0aGlzLmtpbmQgPSBrOworICAgICAgICB0aGlzLm5leHQgPSB2OworICAgICAgICB0aGlzLnBhY2tldCA9IHA7CisgICAgICAgIHRoaXMudGhyb3dhYmxlID0gdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbmV4dCBhY3Rpb24gc2hvdWxkIGJlIHRvCisgICAgICogaW52b2tlIHRoZSBuZXh0IHR1YmUncyB7QGxpbmsgVHViZSNwcm9jZXNzUmVxdWVzdChQYWNrZXQpfSwKKyAgICAgKiB0aGVuIGxhdGVyIGludm9rZSB0aGUgY3VycmVudCB0dWJlJ3Mge0BsaW5rIFR1YmUjcHJvY2Vzc1Jlc3BvbnNlKFBhY2tldCl9CisgICAgICogd2l0aCB0aGUgcmVzcG9uc2UgcGFja2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShUdWJlIG5leHQsIFBhY2tldCBwKSB7CisgICAgICAgIHNldChJTlZPS0UsIG5leHQsIHAsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBuZXh0IGFjdGlvbiBzaG91bGQgYmUgdG8KKyAgICAgKiBpbnZva2UgdGhlIG5leHQgdHViZSdzIHtAbGluayBUdWJlI3Byb2Nlc3NSZXF1ZXN0KFBhY2tldCl9LAorICAgICAqIGJ1dCB0aGUgY3VycmVudCB0dWJlIGRvZXNuJ3Qgd2FudCB0byByZWNlaXZlIHRoZSByZXNwb25zZSBwYWNrZXQgdG8KKyAgICAgKiBpdHMge0BsaW5rIFR1YmUjcHJvY2Vzc1Jlc3BvbnNlKFBhY2tldCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZUFuZEZvcmdldChUdWJlIG5leHQsIFBhY2tldCBwKSB7CisgICAgICAgIHNldChJTlZPS0VfQU5EX0ZPUkdFVCwgbmV4dCwgcCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgYWN0aW9uIGlzIHRvIGZsaXAgdGhlIHByb2Nlc3NpbmcgZGlyZWN0aW9uCisgICAgICogYW5kIHN0YXJ0cyByZXNwb25zZSBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJldHVybldpdGgoIFBhY2tldCByZXNwb25zZSApIHsKKyAgICAgICAgc2V0KFJFVFVSTiwgbnVsbCwgcmVzcG9uc2UsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBuZXh0IGFjdGlvbiBpcyB0byBmbGlwIHRoZSBwcm9jZXNzaW5nIGRpcmVjdGlvbgorICAgICAqIGFuZCBzdGFydHMgZXhjZXB0aW9uIHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgRWl0aGVyIHtAbGluayBSdW50aW1lRXhjZXB0aW9ufSBvciB7QGxpbmsgRXJyb3J9LCBidXQgZGVmaW5lZCB0bworICAgICAqICAgICAgdGFrZSB7QGxpbmsgVGhyb3dhYmxlfSBiZWNhdXNlIHtAbGluayBUdWJlI3Byb2Nlc3NFeGNlcHRpb24oVGhyb3dhYmxlKX0KKyAgICAgKiAgICAgIHRha2VzIHtAbGluayBUaHJvd2FibGV9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRocm93RXhjZXB0aW9uKFRocm93YWJsZSB0KSB7CisgICAgICAgIGFzc2VydCB0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbiB8fCB0IGluc3RhbmNlb2YgRXJyb3I7CisgICAgICAgIHNldChUSFJPVyxudWxsLG51bGwsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGZpYmVyIHNob3VsZCBiZSBzdXNwZW5kZWQuCisgICAgICogT25jZSB7QGxpbmsgRmliZXIjcmVzdW1lKFBhY2tldCkgcmVzdW1lZH0sIHJldHVybiB0aGUgcmVzcG9uc2UgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdXNwZW5kKCkgeworICAgICAgICBzZXQoU1VTUEVORCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcHMgdGhlIGNvbnRlbnRzIHRvIGFzc2lzdCBkZWJ1Z2dpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWYuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpLmFwcGVuZCgiIFsiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgia2luZD0iKS5hcHBlbmQoZ2V0S2luZFN0cmluZygpKS5hcHBlbmQoJywnKTsKKyAgICAgICAgYnVmLmFwcGVuZCgibmV4dD0iKS5hcHBlbmQobmV4dCkuYXBwZW5kKCcsJyk7CisgICAgICAgIGJ1Zi5hcHBlbmQoInBhY2tldD0iKS5hcHBlbmQocGFja2V0KS5hcHBlbmQoJywnKTsKKyAgICAgICAgYnVmLmFwcGVuZCgidGhyb3dhYmxlPSIpLmFwcGVuZCh0aHJvd2FibGUpLmFwcGVuZCgnXScpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGxpbmsgI2tpbmR9IGluIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nLCB0byBhc3Npc3QgZGVidWdnaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2luZFN0cmluZygpIHsKKyAgICAgICAgc3dpdGNoKGtpbmQpIHsKKyAgICAgICAgY2FzZSBJTlZPS0U6ICAgICAgICAgICAgcmV0dXJuICJJTlZPS0UiOworICAgICAgICBjYXNlIElOVk9LRV9BTkRfRk9SR0VUOiByZXR1cm4gIklOVk9LRV9BTkRfRk9SR0VUIjsKKyAgICAgICAgY2FzZSBSRVRVUk46ICAgICAgICAgICAgcmV0dXJuICJSRVRVUk4iOworICAgICAgICBjYXNlIFRIUk9XOiAgICAgICAgICAgICByZXR1cm4gIlRIUk9XIjsKKyAgICAgICAgY2FzZSBTVVNQRU5EOiAgICAgICAgICAgcmV0dXJuICJTVVNQRU5EIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGtpbmQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvUGlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvUGlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODZlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9QaXBlLmphdmEKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGU7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RGaWx0ZXJQaXBlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RQaXBlSW1wbDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7CitpbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQSGFuZGxlcjsKKworLyoqCisgKiBBYnN0cmFjdGlvbiBvZiB0aGUgaW50ZXJtZWRpYXRlIGxheWVycyBpbiB0aGUgcHJvY2Vzc2luZyBjaGFpbgorICogYW5kIHRyYW5zcG9ydC4KKyAqCisgKiA8aDI+V2hhdCBpcyBhIHtAbGluayBQaXBlfT88L2gyPgorICogPHA+CisgKiBUcmFuc3BvcnQgaXMgYSBraW5kIG9mIHBpcGUuIEl0IHNlbmRzIHRoZSB7QGxpbmsgUGFja2V0fQorICogdGhyb3VnaCwgc2F5LCBIVFRQIGNvbm5lY3Rpb24sIGFuZCByZWNlaXZlcyB0aGUgZGF0YSBiYWNrIGludG8gYW5vdGhlciB7QGxpbmsgUGFja2V0fS4KKyAqCisgKiA8cD4KKyAqIE1vcmUgb2Z0ZW4sIGEgcGlwZSBpcyBhIGZpbHRlci4gSXQgYWN0cyBvbiBhIHBhY2tldCwKKyAqIGFuZCB0aGVuIGl0IHBhc3NlcyB0aGUgcGFja2V0IGludG8gYW5vdGhlciBwaXBlLiBJdCBjYW4KKyAqIGRvIHRoZSBzYW1lIG9uIHRoZSB3YXkgYmFjay4KKyAqCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCBYV1NTIHdpbGwgYmUgYSB7QGxpbmsgUGlwZX0KKyAqIHRoYXQgZGVsZWdhdGVzIHRvIGFub3RoZXIge0BsaW5rIFBpcGV9LCBhbmQgaXQgY2FuIHdyYXAgYSB7QGxpbmsgUGFja2V0fSBpbnRvCisgKiBhbm90aGVyIHtAbGluayBQYWNrZXR9IHRvIGVuY3J5cHQgdGhlIGJvZHkgYW5kIGFkZCBhIGhlYWRlciwgZm9yIGV4YW1wbGUuCisgKgorICogPHA+CisgKiBZZXQgYW5vdGhlciBraW5kIG9mIGZpbHRlciBwaXBlIGlzIHRob3NlIHRoYXQgd3JhcHMge0BsaW5rIExvZ2ljYWxIYW5kbGVyfQorICogYW5kIHtAbGluayBTT0FQSGFuZGxlcn0uIFRoZXNlIHBpcGVzIGFyZSBoZWF2eS13ZWlnaHQ7IHRoZXkgb2Z0ZW4gY29uc3VtZQorICogYSBtZXNzYWdlIGluIGEgcGFja2V0IGFuZCBjcmVhdGUgYSBuZXcgb25lLCBhbmQgdGhlbiBwYXNzIGl0IHRvIHRoZSBuZXh0IHBpcGUuCisgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29uIGl0IHByb2JhYmx5IG1ha2VzIHNlbnNlIHRvIGhhdmUgb25lIHtAbGluayBQaXBlfQorICogaW5zdGFuY2UgdGhhdCBpbnZva2VzIGEgc2VyaWVzIG9mIHtAbGluayBMb2dpY2FsSGFuZGxlcn1zLCBhbm90aGVyIG9uZQorICogZm9yIHtAbGluayBTT0FQSGFuZGxlcn0uCisgKgorICogPHA+CisgKiBUaGVyZSB3b3VsZCBiZSBhIHtAbGluayBQaXBlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGludm9rZXMge0BsaW5rIFByb3ZpZGVyfS4KKyAqIFRoZXJlIHdvdWxkIGJlIGEge0BsaW5rIFBpcGV9IGltcGxlbWVudGF0aW9uIHRoYXQgaW52b2tlcyBhIHNlcnZpY2UgbWV0aG9kCisgKiBvbiB0aGUgdXNlcidzIGNvZGUuCisgKiBUaGVyZSB3b3VsZCBiZSBhIHtAbGluayBEaXNwYXRjaH0gaW1wbGVtZW50YXRpb24gdGhhdCBpbnZva2VzIGEge0BsaW5rIFBpcGV9LgorICoKKyAqIDxwPgorICogV1MtTUVYIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBhIHtAbGluayBQaXBlfSB0aGF0IGxvb2tzIGZvcgorICoge0BsaW5rIE1lc3NhZ2UjZ2V0UGF5bG9hZE5hbWVzcGFjZVVSSSgpfSBhbmQgc2VydmVzIHRoZSByZXF1ZXN0LgorICoKKyAqCisgKiA8aDI+UGlwZSBMaWZlY3ljbGU8L2gyPgorICoge0BsaW5rIFBpcGV9bGluZSBpcyBleHBlbnNpdmUgdG8gc2V0IHVwLCBzbyBvbmNlIGl0J3MgY3JlYXRlZCBpdCB3aWxsIGJlIHJldXNlZC4KKyAqIEEge0BsaW5rIFBpcGV9bGluZSBpcyBub3QgcmVlbnRyYW50OyBvbmUgcGlwZWxpbmUgaXMgdXNlZCB0byBwcm9jZXNzIG9uZSByZXF1ZXN0L3Jlc3BvbnNlCisgKiBhdCBhdCB0aW1lLiBUaGUgc2FtZSBwaXBlbGluZSBpbnN0YW5jZSBtYXkgc2VydmUgcmVxdWVzdC9yZXNwb25zZSBmb3IgZGlmZmVyZW50IHRocmVhZHMsCisgKiBpZiBvbmUgY29tZXMgYWZ0ZXIgYW5vdGhlciBhbmQgdGhleSBkb24ndCBvdmVybGFwLgorICogPHA+CisgKiBXaGVyZSBhIG5lZWQgYXJpc2VzIHRvIHByb2Nlc3MgbXVsdGlwbGUgcmVxdWVzdHMgY29uY3VycmVudGx5LCBhIHBpcGVsaW5lCisgKiBnZXRzIGNsb25lZCB0aHJvdWdoIHtAbGluayBQaXBlQ2xvbmVyfS4gTm90ZSB0aGF0IHRoaXMgbmVlZCBtYXkgaGFwcGVuIG9uCisgKiBib3RoIHNlcnZlciAoYmVjYXVzZSBpdCBxdWl0ZSBvZnRlbiBzZXJ2ZXMgbXVsdGlwbGUgcmVxdWVzdHMgY29uY3VycmVudGx5KQorICogYW5kIGNsaWVudCAoYmVjYXVzZSBpdCBuZWVkcyB0byBzdXBwb3J0IGFzeW5jaHJvbm91cyBtZXRob2QgaW52b2NhdGlvbnMuKQorICogPHA+CisgKiBDcmVhdGVkIHBpcGVsaW5lcyAoaW5jbHVkaW5nIGNsb25lZCBvbmVzIGFuZCB0aGUgb3JpZ2luYWwpIG1heSBiZSBkaXNjYXJkZWQgYW5kIEdDZWQKKyAqIGF0IGFueSB0aW1lIGF0IHRoZSBkaXNjcmV0aW9uIG9mIHdob2V2ZXIgb3ducyBwaXBlbGluZXMuIFBpcGVzIGNhbiwgaG93ZXZlciwgZXhwZWN0CisgKiBhdCBsZWFzdCBvbmUgY29weSAob3Igb3JpZ2luYWwpIG9mIHBpcGVsaW5lIHRvIGxpdmUgYXQgYW55IGdpdmVuIHRpbWUgd2hpbGUgYSBwaXBlbGluZQorICogb3duZXIgaXMgaW50ZXJlc3RlZCBpbiB0aGUgZ2l2ZW4gcGlwZWxpbmUgY29uZmlndXJhdGlvbiAoaW4gbW9yZSBjb25jZXJldGUgdGVybXMsCisgKiBmb3IgZXhhbXBsZSwgYXMgbG9uZyBhcyBhIGRpc3BhdGNoIG9iamVjdCBsaXZlcywgaXQncyBnb2luZyB0byBrZWVwIGF0IGxlYXN0IG9uZQorICogY29weSBvZiBhIHBpcGVsaW5lIGFsaXZlLikKKyAqIDxwPgorICogQmVmb3JlIGEgcGlwZWxpbmUgb3duZXIgZGllcywgaXQgbWF5IGludm9rZSB7QGxpbmsgI3ByZURlc3Ryb3koKX0gb24gdGhlIGxhc3QKKyAqIHJlbWFpbmluZyBwaXBlbGluZS4gSXQgaXMgIm1heSIgZm9yIHBpcGVsaW5lIG93bmVycyB0aGF0IGxpdmUgaW4gdGhlIGNsaWVudC1zaWRlCisgKiBvZiBKQVgtV1MgKHN1Y2ggYXMgZGlzcGF0Y2hlcyBhbmQgcHJveGllcyksIGJ1dCBpdCBpcyBhICJtdXN0IiBmb3IgcGlwZWxpbmUgb3duZXJzCisgKiB0aGF0IGxpdmUgaW4gdGhlIHNlcnZlci1zaWRlIG9mIEpBWC1XUy4KKyAqIDxwPgorICogVGhpcyBsYXN0IGludm9jYXRpb24gZ2l2ZXMgYSBjaGFuY2UgZm9yIHNvbWUgcGlwZXMgdG8gY2xlYW4gdXAgYW55IHN0YXRlL3Jlc291cmNlCisgKiBhY3F1aXJlZCAoc3VjaCBhcyBXUy1STSdzIHNlcXVlbmNlLCBXUy1UcnVzdCdzIFNlY3VyaXR5VG9rZW4pLCBhbHRob3VnaCBhcyBzdGF0ZWQgYWJvdmUsCisgKiB0aGlzIGlzIG5vdCByZXF1aXJlZCBmb3IgY2xpZW50cy4KKyAqCisgKgorICoKKyAqIDxoMj5QaXBlIGFuZCBTdGF0ZTwvaDI+CisgKiA8cD4KKyAqIFRoZSBsaWZlY3ljbGUgb2YgcGlwZWxpbmVzIGlzIGRlc2lnbmVkIHRvIGFsbG93IGEge0BsaW5rIFBpcGV9IHRvIHN0b3JlIHZhcmlvdXMKKyAqIHN0YXRlIGluIGVhc2lseSBhY2Nlc3NpYmxlIGZhc2hpb24uCisgKgorICoKKyAqIDxoMz5QZXItcGFja2V0IHN0YXRlPC9oMz4KKyAqIDxwPgorICogQW55IGluZm9ybWF0aW9uIHRoYXQgY2hhbmdlcyBmcm9tIGEgcGFja2V0IHRvIHBhY2tldCBzaG91bGQgYmUKKyAqIHN0b3JlZCBpbiB7QGxpbmsgUGFja2V0fS4gVGhpcyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBsaWtlCisgKiB0cmFuc3BvcnQtc3BlY2lmaWMgaGVhZGVycy4KKyAqCisgKiA8aDM+UGVyLXRocmVhZCBzdGF0ZTwvaDM+CisgKiA8cD4KKyAqIEFueSBleHBlbnNpdmUgb2JqZWN0cyB0aGF0IGFyZSBub24tcmVlbnRyYW50IGNhbiBiZSBzdG9yZWQgaW4KKyAqIGluc3RhbmNlIHZhcmlhYmxlcyBvZiBhIHtAbGluayBQaXBlfSwgc2luY2Uge0BsaW5rICNwcm9jZXNzKFBhY2tldCl9IGlzCisgKiBub24gcmVlbnRyYW50LiBXaGVuIGEgcGlwZSBpcyBjb3BpZWQsIG5ldyBpbnN0YW5jZXMgc2hvdWxkIGJlIGFsbG9jYXRlZAorICogc28gdGhhdCB0d28ge0BsaW5rIFBpcGV9IGluc3RhbmNlcyBkb24ndCBzaGFyZSB0aHJlYWQtdW5zYWZlIHJlc291cmNlcy4KKyAqIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpa2UgY2Fub25pY2FsaXplcnMsIEpBWEIgdW5tYXJzaGFsbGVycywgYnVmZmVycywKKyAqIGFuZCBzbyBvbi4KKyAqCisgKiA8aDM+UGVyLXByb3h5L3Blci1lbmRwb2ludCBzdGF0ZTwvaDM+CisgKiA8cD4KKyAqIEluZm9ybWF0aW9uIHRoYXQgaXMgdGllZCB0byBhIHBhcnRpY3VsYXIgcHJveHkvZGlzcGF0Y2ggY2FuIGJlIHN0b3JlZAorICogaW4gYSBzZXBhcmF0ZSBvYmplY3QgdGhhdCBpcyByZWZlcmVuY2VkIGZyb20gYSBwaXBlLiBXaGVuCisgKiBhIG5ldyBwaXBlIGlzIGNvcGllZCwgeW91IGNhbiBzaW1wbHkgaGFuZCBvdXQgYSByZWZlcmVuY2UgdG8gdGhlIG5ld2x5CisgKiBjcmVhdGVkIG9uZSwgc28gdGhhdCBhbGwgY29waWVkIHBpcGVzIHJlZmVyIHRvIHRoZSBzYW1lIGluc3RhbmNlLgorICogU2VlIHRoZSBmb2xsb3dpbmcgY29kZSBhcyBhbiBleGFtcGxlOgorICoKKyAqIDxwcmU+CisgKiBjbGFzcyBQaXBlSW1wbCB7CisgKiAgIC8vIHRoaXMgb2JqZWN0IHN0b3JlcyBwZXItcHJveHkgc3RhdGUKKyAqICAgY2xhc3MgRGF0YVN0b3JlIHsKKyAqICAgICBpbnQgY291bnRlcjsKKyAqICAgfQorICoKKyAqICAgcHJpdmF0ZSBEYXRhU3RvcmUgZHM7CisgKgorICogICAvLyBjcmVhdGUgYSBmcmVzaCBuZXcgcGlwZQorICogICBwdWJsaWMgUGlwZUltcGwoLi4uKSB7CisgKiAgICAgLi4uLgorICogICAgIGRzID0gbmV3IERhdGFTdG9yZSgpOworICogICB9CisgKgorICogICAvLyBjb3B5IGNvbnN0cnVjdG9yCisgKiAgIHByaXZhdGUgUGlwZUltcGwoUGlwZUltcGwgdGhhdCwgUGlwZUNsb25lciBjbG9uZXIpIHsKKyAqICAgICBjbG9uZXIuYWRkKHRoYXQsdGhpcyk7CisgKiAgICAgLi4uCisgKiAgICAgdGhpcy5kcyA9IHRoYXQuZHM7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyBQaXBlSW1wbCBjb3B5KFBpcGVDbG9uZXIgcGMpIHsKKyAqICAgICByZXR1cm4gbmV3IFBpcGVJbXBsKHRoaXMscGMpOworICogICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIE5vdGUgdGhhdCBhY2Nlc3MgdG8gc3VjaCByZXNvdXJjZSBvZnRlbiBuZWVkcyB0byBiZSBzeW5jaHJvbml6ZWQsCisgKiBzaW5jZSBtdWx0aXBsZSBjb3BpZXMgb2YgcGlwZWxpbmVzIG1heSBleGVjdXRlIGNvbmN1cnJlbnRseS4KKyAqCisgKiA8cD4KKyAqIElmIHN1Y2ggaW5mb3JtYXRpb24gaXMgcmVhZC1vbmx5LAorICogaXQgY2FuIGJlIHN0b3JlZCBhcyBpbnN0YW5jZSB2YXJpYWJsZXMgb2YgYSBwaXBlLAorICogYW5kIGl0cyByZWZlcmVuY2UgY29waWVkIGFzIHBpcGVzIGdldCBjb3BpZWQuIChUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4KKyAqIHRoaXMgYW5kIHBlci10aHJlYWQgc3RhdGUgaXMgdGhhdCB5b3UganVzdCB3b24ndCBhbGxvY2F0ZSBuZXcgdGhpbmdzIHdoZW4KKyAqIHBpcGVzIGdldCBjb3BpZWQgaGVyZS4pCisgKgorICoKKyAqIDxoMz5WTS13aWRlIHN0YXRlPC9oMz4KKyAqIDxwPgorICogPHR0PnN0YXRpYzwvdHQ+IGlzIGFsd2F5cyB0aGVyZSBmb3IgeW91IHRvIHVzZS4KKyAqCisgKgorICoKKyAqIDxoMj5QaXBlcyBhbmQgSGFuZGxlcnM8L2gyPgorICogPHA+CisgKiBKQVgtV1MgaGFzIGEgbm90aW9uIG9mIHtAbGluayBMb2dpY2FsSGFuZGxlcn0gYW5kIHtAbGluayBTT0FQSGFuZGxlcn0sIGFuZAorICogd2UgaW50ZW5kIHRvIGhhdmUgb25lIHtAbGluayBQaXBlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGludm9rZXMgYWxsIHRoZQorICoge0BsaW5rIExvZ2ljYWxIYW5kbGVyfXMgYW5kIGFub3RoZXIge0BsaW5rIFBpcGV9IGltcGxlbWVudGF0aW9uIHRoYXQgaW52b2tlcworICogYWxsIHRoZSB7QGxpbmsgU09BUEhhbmRsZXJ9cy4gVGhvc2UgaW1wbGVtZW50YXRpb25zIG5lZWQgdG8gY29udmVydCBhIHtAbGluayBNZXNzYWdlfQorICogaW50byBhbiBhcHByb3ByaWF0ZSBmb3JtYXQsIGJ1dCBncm91cGluZyBhbGwgdGhlIGhhbmRsZXJzIHRvZ2V0aGVyIGVsaW1pbmF0ZXMKKyAqIHRoZSBpbnRlcm1lZGlhdGUge0BsaW5rIE1lc3NhZ2V9IGluc3RhbmNpYXRpb24gYmV0d2VlbiBzdWNoIGhhbmRsZXJzLgorICogPHA+CisgKiBUaGlzIGdyb3VwaW5nIGFsc28gYWxsb3dzIHN1Y2ggaW1wbGVtZW50YXRpb25zIHRvIGZvbGxvdyB0aGUgZXZlbnQgbm90aWZpY2F0aW9ucworICogdG8gaGFuZGxlcnMgKGkuZS4ge0BsaW5rIEhhbmRsZXIjY2xvc2UoTWVzc2FnZUNvbnRleHQpfSBtZXRob2QuCisgKgorICoKKyAqIDxwcmU+CisgKiBUT0RPOiBQb3NzaWJsZSB0eXBlcyBvZiBwaXBlOgorICogICAgICBjcmVhdG9yOiBjcmVhdGUgbWVzc2FnZSBmcm9tIHdpcmUKKyAqICAgICAgICAgIHRvIFNBQUogU09BUCBtZXNzYWdlCisgKiAgICAgICAgICB0byBjYWNoZWQgcmVwcmVzZW50YXRpb24KKyAqICAgICAgICAgIGRpcmVjdGx5IHRvIEpBWEIgYmVhbnMKKyAqICAgICAgdHJhbnNmb3JtZXI6IHRyYW5zZm9ybSBtZXNzYWdlIGZyb20gb25lIHJlcHJlc2VudGF0aW9uIHRvIGFub3RoZXIKKyAqICAgICAgICAgIEpBWEIgYmVhbnMgdG8gZW5jb2RlZCBTT0FQIG1lc3NhZ2UKKyAqICAgICAgICAgIFN0QVggd3JpdGluZyArIEpBWEIgYmVhbiB0byBlbmNvZGVkIFNPQVAgbWVzc2FnZQorICogICAgICBtb2RpZmllcjogbW9kaWZ5IG1lc3NhZ2UKKyAqICAgICAgICAgIGFkZCBTT0FQIGhlYWRlciBibG9ja3MKKyAqICAgICAgICAgIHNlY3VyaXR5IHByb2Nlc3NpbmcKKyAqICAgICAgaGVhZGVyIGJsb2NrIHByb2Nlc3NvcjoKKyAqICAgICAgICAgIHByb2Nlc3MgY2VydGFpbiBTT0FQIGhlYWRlciBibG9ja3MKKyAqICAgICAgb3V0Ym91bmQgaW5pdGlhdG9yOiBpbnB1dCBmcm9tIHRoZSBjbGllbnQKKyAqICAgICAgICAgIE1hbmFnZSBpbnB1dCBlLmcuIEpBWEIgYmVhbnMgYW5kIGFzc29jaWF0ZWQgd2l0aCBwYXJ0cyBvZiB0aGUgU09BUCBtZXNzYWdlCisgKiAgICAgIGluYm91bmQgaW52b2tlcjogaW52b2tlIHRoZSBzZXJ2aWNlCisgKiAgICAgICAgIElua29rZSBTRUksIGUuZy4gRUpCIG9yIFNFSSBpbiBzZXJ2bGV0LgorICogPC9wcmU+CisgKgorICogQHNlZSBBYnN0cmFjdFBpcGVJbXBsCisgKiBAc2VlIEFic3RyYWN0RmlsdGVyUGlwZUltcGwKKyAqIEBkZXByZWNhdGVkCisgKiAgICAgIFVzZSB7QGxpbmsgVHViZX0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGlwZSB7CisgICAgLyoqCisgICAgICogU2VuZHMgYSB7QGxpbmsgUGFja2V0fSBhbmQgcmV0dXJucyBhIHJlc3BvbnNlIHtAbGluayBQYWNrZXR9IHRvIGl0LgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICBPbiB0aGUgc2VydmVyIHNpZGUsIHRoaXMgc2lnbmFscyBhbiBlcnJvciBjb25kaXRpb24gd2hlcmUKKyAgICAgKiAgICAgIGEgZmF1bHQgcmVwbHkgaXMgaW4gb3JkZXIgKG9yIHRoZSBleGNlcHRpb24gZ2V0cyBlYXRlbiBieQorICAgICAqICAgICAgdGhlIHRvcC1tb3N0IHRyYW5zcG9ydCB7QGxpbmsgUGlwZX0gaWYgaXQncyBvbmUtd2F5LikKKyAgICAgKiAgICAgIFRoaXMgZnJlZXMgZWFjaCB7QGxpbmsgUGlwZX0gZnJvbSB0cnkvY2F0Y2hpbmcgYQorICAgICAqICAgICAge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259IGluIGV2ZXJ5IGxheWVyLgorICAgICAqCisgICAgICogICAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgYWxzbyBhbGxvd2VkIHRvIHJldHVybiBhIHtAbGluayBQYWNrZXR9CisgICAgICogICAgICB0aGF0IGhhcyBhIGZhdWx0IGFzIHRoZSBwYXlsb2FkLgorICAgICAqCisgICAgICogICAgICA8cD4KKyAgICAgKiAgICAgIE9uIHRoZSBjbGllbnQgc2lkZSwgdGhlIHtAbGluayBXZWJTZXJ2aWNlRXhjZXB0aW9ufSB0aHJvd24KKyAgICAgKiAgICAgIHdpbGwgYmUgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBjYWxsaW5nIGNsaWVudAorICAgICAqICAgICAgYXBwbGljYXRpb25zLiAoVGhlIGNvbnNlcXVlbmNlIG9mIHRoYXQgaXMgdGhhdCBpZiB5b3UgYXJlCisgICAgICogICAgICBhIGZpbHRlcmluZyB7QGxpbmsgUGlwZX0sIHlvdSBtdXN0IG5vdCBjYXRjaCB0aGUgZXhjZXB0aW9uCisgICAgICogICAgICB0aGF0IHlvdXIgbmV4dCB7QGxpbmsgUGlwZX0gdGhyZXcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKiAgICAgIE90aGVyIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93biBieSB0aGlzIG1ldGhvZCBtdXN0CisgICAgICogICAgICBiZSB0cmVhdGVkIGFzIGEgYnVnIGluIHRoZSBwaXBlIGltcGxlbWVudGF0aW9uLAorICAgICAqICAgICAgYW5kIHRoZXJlZm9yZSBzaG91bGQgbm90IGJlIGNvbnZlcnRlZCBpbnRvIGEgZmF1bHQuCisgICAgICogICAgICAoT3RoZXJ3aXNlIGl0IGJlY29tZXMgdmVyeSBkaWZmaWN1bHQgdG8gZGVidWcgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgIHByb2JsZW1zLikKKyAgICAgKgorICAgICAqICAgICAgPHA+CisgICAgICogICAgICBPbiB0aGUgc2VydmVyIHNpZGUsIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBiZSBtb3N0IGxpa2VseQorICAgICAqICAgICAganVzdCBsb2dnZWQuIE9uIHRoZSBjbGllbnQtc2lkZSBpdCBnZXRzIHByb3BhZ2F0ZWQgdG8gdGhlCisgICAgICogICAgICBjbGllbnQgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiAgICAgIDxwPgorICAgICAqICAgICAgVGhlIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCBpZiBhIHBpcGUgY2FsbHMKKyAgICAgKiAgICAgIGludG8gYW4gdXNlciBhcHBsaWNhdGlvbiAoc3VjaCBhcyB7QGxpbmsgU09BUEhhbmRsZXJ9CisgICAgICogICAgICBvciB7QGxpbmsgTG9naWNhbEhhbmRsZXJ9KSwgd2hlcmUgYSB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0KKyAgICAgKiAgICAgIGlzICpub3QqIGEgYnVnIGluIHRoZSBKQVgtV1MgaW1wbGVtZW50YXRpb24sIGl0IG11c3QgYmUgY2F0Y2hlZAorICAgICAqICAgICAgYW5kIHdyYXBwZWQgaW50byBhIHtAbGluayBXZWJTZXJ2aWNlRXhjZXB0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogICAgICBUaGUgcGFja2V0IHRoYXQgcmVwcmVzZW50cyBhIHJlcXVlc3QgbWVzc2FnZS4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiAgICAgIElmIHRoZSBwYWNrZXQgaGFzIGEgbm9uLW51bGwgbWVzc2FnZSwgaXQgbXVzdCBiZSBhIHZhbGlkCisgICAgICogICAgICB1bmNvbnN1bWVkIHtAbGluayBNZXNzYWdlfS4gVGhpcyBtZXNzYWdlIHJlcHJlc2VudHMgdGhlCisgICAgICogICAgICBTT0FQIG1lc3NhZ2UgdG8gYmUgc2VudCBhcyBhIHJlcXVlc3QuCisgICAgICogICAgICA8cD4KKyAgICAgKiAgICAgIFRoZSBwYWNrZXQgaXMgYWxzbyBhbGxvd2VkIHRvIGNhcnJ5IG5vIG1lc3NhZ2UsIHdoaWNoIGluZGljYXRlcworICAgICAqICAgICAgdGhhdCB0aGlzIGlzIGFuIG91dHB1dC1vbmx5IHJlcXVlc3QuCisgICAgICogICAgICAodGhhdCdzIGNhbGxlZCAic29saWNpdCIsIHJpZ2h0PyAtIEtLKQorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgVGhlIHBhY2tldCB0aGF0IHJlcHJlc2VudHMgYSByZXNwb25zZSBtZXNzYWdlLiBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqICAgICAgSWYgdGhlIHBhY2tldCBoYXMgYSBub24tbnVsbCBtZXNzYWdlLCBpdCBtdXN0IGJlCisgICAgICogICAgICBhIHZhbGlkIHVuY29uc3VtZWQge0BsaW5rIE1lc3NhZ2V9LiBUaGlzIG1lc3NhZ2UgcmVwcmVzZW50cworICAgICAqICAgICAgYSByZXNwb25zZSB0byB0aGUgcmVxdWVzdCBtZXNzYWdlIHBhc3NlZCBhcyBhIHBhcmFtZXRlci4KKyAgICAgKiAgICAgIDxwPgorICAgICAqICAgICAgVGhlIHBhY2tldCBpcyBhbHNvIGFsbG93ZWQgdG8gY2Fycnkgbm8gbWVzc2FnZSwgd2hpY2ggaW5kaWNhdGVzCisgICAgICogICAgICB0aGF0IHRoZXJlIHdhcyBubyByZXNwb25zZS4gVGhpcyBpcyB1c2VkIGZvciB0aGluZ3MgbGlrZQorICAgICAqICAgICAgb25lLXdheSBtZXNzYWdlIGFuZC9vciBvbmUtd2F5IHRyYW5zcG9ydHMuCisgICAgICovCisgICAgUGFja2V0IHByb2Nlc3MoIFBhY2tldCByZXF1ZXN0KTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYmVmb3JlIHRoZSBsYXN0IGNvcHkgb2YgdGhlIHBpcGVsaW5lIGlzIGFib3V0IHRvIGJlIGRpc2NhcmRlZCwKKyAgICAgKiB0byBnaXZlIHtAbGluayBQaXBlfXMgYSBjaGFuY2UgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW52b2tlIHtAbGluayBQcmVEZXN0cm95fSBsaWZlY3ljbGUgbWV0aG9kcworICAgICAqIG9uIHVzZXIgaGFuZGxlci4gVGhlIGludm9jYXRpb24gb2YgaXQgaXMgb3B0aW9uYWwgb24gdGhlIGNsaWVudCBzaWRlLAorICAgICAqIGJ1dCBtYW5kYXRvcnkgb24gdGhlIHNlcnZlciBzaWRlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiBtdWx0aXBsZSBjb3BpZXMgb2YgcGlwZWxpbmVzIGFyZSBjcmVhdGVkLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKKyAgICAgKiBvbmx5IG9uIG9uZSBvZiB0aGVtLgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICBJZiB0aGUgY2xlYW4gdXAgZmFpbHMsIHtAbGluayBXZWJTZXJ2aWNlRXhjZXB0aW9ufSBjYW4gYmUgdGhyb3duLgorICAgICAqICAgICAgVGhpcyBleGNlcHRpb24gd2lsbCBiZSBwcm9wYWdhdGVkIHRvIHVzZXJzIChpZiB0aGlzIGlzIGNsaWVudCksCisgICAgICogICAgICBvciByZWNvcmRlZCAoaWYgdGhpcyBpcyBzZXJ2ZXIuKQorICAgICAqLworICAgIHZvaWQgcHJlRGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpZGVudGljYWwgY2xvbmUgb2YgdGhpcyB7QGxpbmsgUGlwZX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGFuIGlkZW50aWNhbCBwaXBlbGluZSB0aGF0IGNhbiBiZSB1c2VkCisgICAgICogY29uY3VycmVudGx5IHdpdGggdGhpcyBwaXBlbGluZS4gV2hlbiB0aGUgY2FsbGVyIG9mIGEgcGlwZWxpbmUKKyAgICAgKiBpcyBtdWx0aS10aHJlYWRlZCBhbmQgbmVlZCBjb25jdXJyZW50IHVzZSBvZiB0aGUgc2FtZSBwaXBlbGluZSwKKyAgICAgKiBpdCBjYW4gZG8gc28gYnkgY3JlYXRpbmcgY29waWVzIHRocm91Z2ggdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiA8aDM+SW1wbGVtZW50YXRpb24gTm90ZTwvaDM+CisgICAgICogPHA+CisgICAgICogSXQgaXMgdGhlIGltcGxlbWVudGF0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2FsbAorICAgICAqIHtAbGluayBQaXBlQ2xvbmVyI2FkZChQaXBlLFBpcGUpfSB0byByZWdpc3RlciB0aGUgY29waWVkIHBpcGUKKyAgICAgKiB3aXRoIHRoZSBvcmlnaW5hbC4gVGhpcyBpcyByZXF1aXJlZCBiZWZvcmUgeW91IHN0YXJ0IGNvcHlpbmcKKyAgICAgKiB0aGUgb3RoZXIge0BsaW5rIFBpcGV9IHJlZmVyZW5jZXMgeW91IGhhdmUsIG9yIGVsc2UgdGhlcmUncyBhCisgICAgICogcmlzayBvZiBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgICogPHA+CisgICAgICogRm9yIG1vc3Qge0BsaW5rIFBpcGV9IGltcGxlbWVudGF0aW9ucyB0aGF0IGRlbGVnYXRlIHRvIGFub3RoZXIKKyAgICAgKiB7QGxpbmsgUGlwZX0sIHRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoYXQgeW91IGFsc28gY29weSB0aGUge0BsaW5rIFBpcGV9CisgICAgICogdGhhdCB5b3UgZGVsZWdhdGUgdG8uCisgICAgICogPHA+CisgICAgICogRm9yIGxpbWl0ZWQgbnVtYmVyIG9mIHtAbGluayBQaXBlfXMgdGhhdCBkbyBub3QgbWFpbnRhaW4gYW55CisgICAgICogdGhyZWFkIHVuc2FmZSByZXNvdXJjZSwgaXQgaXMgYWxsb3dlZCB0byBzaW1wbHkgcmV0dXJuIDx0dD50aGlzPC90dD4KKyAgICAgKiBmcm9tIHRoaXMgbWV0aG9kIChub3RpY2UgdGhhdCBldmVuIGlmIHlvdSBhcmUgc3RhdGVsZXNzLCBpZiB5b3UKKyAgICAgKiBnb3QgYSBkZWxlZ2F0aW5nIHtAbGluayBQaXBlfSBhbmQgdGhhdCBvbmUgaXNuJ3Qgc3RhdGVsZXNzLCB5b3UKKyAgICAgKiBzdGlsbCBoYXZlIHRvIGNvcHkgeW91cnNlbGYuKQorICAgICAqCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1pZ2h0IGJlIGludm9rZWQgYnkgb25lIHRocmVhZCB3aGlsZSBhbm90aGVyCisgICAgICogdGhyZWFkIGlzIGV4ZWN1dGluZyB0aGUge0BsaW5rICNwcm9jZXNzKFBhY2tldCl9IG1ldGhvZC4gU2VlCisgICAgICogdGhlIHtAbGluayBDb2RlYyNjb3B5KCl9IGZvciBtb3JlIGRpc2N1c3Npb24gYWJvdXQgdGhpcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbG9uZXIKKyAgICAgKiAgICAgIFVzZSB0aGlzIG9iamVjdCAoaW4gcGFydGljdWxhciBpdHMge0BsaW5rIFBpcGVDbG9uZXIjY29weShQaXBlKX0gbWV0aG9kCisgICAgICogICAgICB0byBjbG9uZSBvdGhlciBwaXBlIHJlZmVyZW5jZXMgeW91IGhhdmUKKyAgICAgKiAgICAgIGluIHlvdXIgcGlwZS4gU2VlIHtAbGluayBQaXBlQ2xvbmVyfSBmb3IgbW9yZSBkaXNjdXNzaW9uCisgICAgICogICAgICBhYm91dCB3aHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgbm9uLW51bGwge0BsaW5rIFBpcGV9LgorICAgICAqIEBwYXJhbSBjbG9uZXIKKyAgICAgKi8KKyAgICBQaXBlIGNvcHkoUGlwZUNsb25lciBjbG9uZXIpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvUGlwZUNsb25lci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvUGlwZUNsb25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzEyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9QaXBlQ2xvbmVyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5BYnN0cmFjdFR1YmVJbXBsOworCisvKioKKyAqIENsb25lcyB0aGUgd2hvbGUgcGlwZWxpbmUuCisgKgorICogPHA+CisgKiBTaW5jZSB7QGxpbmsgUGlwZX1zIG1heSBmb3JtIGFuIGFyYml0cmFyeSBkaXJlY3RlZCBncmFwaCwgc29tZW9uZSBuZWVkcworICogdG8ga2VlcCB0cmFjayBvZiBpc29tb3JwaGlzbSBmb3IgYSBjbG9uZSB0byBoYXBwZW4gY29ycmVjdGx5LiBUaGlzIGNsYXNzCisgKiBzZXJ2ZXMgdGhhdCByb2xlLgorICoKKyAqIEBkZXByZWNhdGVkCisgKiAgICAgIFVzZSB7QGxpbmsgVHViZUNsb25lcn0uCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQaXBlQ2xvbmVyIGV4dGVuZHMgVHViZUNsb25lciB7CisgICAgLyoqCisgICAgICoge0BsaW5rIFBpcGV9IHZlcnNpb24gb2Yge0BsaW5rICNjbG9uZShUdWJlKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBpcGUgY2xvbmUoUGlwZSBwKSB7CisgICAgICAgIHJldHVybiBuZXcgUGlwZUNsb25lcigpLmNvcHkocCk7CisgICAgfQorCisgICAgLy8gbm8gbmVlZCB0byBiZSBjb25zdHJ1Y3RlZCBwdWJsaWNseS4gYWx3YXlzIHVzZSB0aGUgc3RhdGljIGNsb25lIG1ldGhvZC4KKyAgICAvKnBhY2thZ2UqLyBQaXBlQ2xvbmVyKCkge30KKworICAgIC8qKgorICAgICAqIHtAbGluayBQaXBlfSB2ZXJzaW9uIG9mIHtAbGluayAjY29weShUdWJlKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBQaXBlPiBUIGNvcHkoVCBwKSB7CisgICAgICAgIFBpcGUgciA9IChQaXBlKW1hc3RlcjJjb3B5LmdldChwKTsKKyAgICAgICAgaWYocj09bnVsbCkgeworICAgICAgICAgICAgciA9IHAuY29weSh0aGlzKTsKKyAgICAgICAgICAgIC8vIHRoZSBwaXBlIG11c3QgcHV0cyBpdHMgY29weSB0byB0aGUgbWFwIGJ5IGl0c2VsZgorICAgICAgICAgICAgYXNzZXJ0IG1hc3RlcjJjb3B5LmdldChwKT09ciA6ICJ0aGUgcGlwZSBtdXN0IGNhbGwgdGhlIGFkZCguLi4pIG1ldGhvZCB0byByZWdpc3RlciBpdHNlbGYgYmVmb3JlIHN0YXJ0IGNvcHlpbmcgb3RoZXIgcGlwZXMsIGJ1dCAiK3ArIiBoYXNuJ3QgZG9uZSBzbyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChUKXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFBpcGV9IHZlcnNpb24gb2Yge0BsaW5rICNhZGQoVHViZSwgVHViZSl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChQaXBlIG9yaWdpbmFsLCBQaXBlIGNvcHkpIHsKKyAgICAgICAgYXNzZXJ0ICFtYXN0ZXIyY29weS5jb250YWluc0tleShvcmlnaW5hbCk7CisgICAgICAgIGFzc2VydCBvcmlnaW5hbCE9bnVsbCAmJiBjb3B5IT1udWxsOworICAgICAgICBtYXN0ZXIyY29weS5wdXQob3JpZ2luYWwsY29weSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYW1iaWd1YXRpb24gdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoQWJzdHJhY3RUdWJlSW1wbCBvcmlnaW5hbCwgQWJzdHJhY3RUdWJlSW1wbCBjb3B5KSB7CisgICAgICAgIGFkZCgoVHViZSlvcmlnaW5hbCxjb3B5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9QaXBlbGluZUFzc2VtYmxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvUGlwZWxpbmVBc3NlbWJsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmMzN2QzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvUGlwZWxpbmVBc3NlbWJsZXIuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTU2VydmljZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuRW5kcG9pbnRBZGRyZXNzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworCitpbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOworaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKiBDcmVhdGVzIGEgcGlwZWxpbmUuCisgKgorICogPHA+CisgKiBUaGlzIHBsdWdnYWJpbGl0eSBsYXllciBlbmFibGVzIHRoZSB1cHBlciBsYXllciB0bworICogY29udHJvbCBleGFjdGx5IGhvdyB0aGUgcGlwZWxpbmUgaXMgY29tcG9zZWQuCisgKgorICogPHA+CisgKiBKQVgtV1MgaXMgZ29pbmcgdG8gaGF2ZSBpdHMgb3duIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAqIHdoZW4gdXNlZCBhbGwgYnkgaXRzZWxmLCBidXQgaXQgY2FuIGJlIHN1YnN0aXR1dGVkIGJ5CisgKiBvdGhlciBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogPHA+CisgKiBTZWUge0BsaW5rIFBpcGVsaW5lQXNzZW1ibGVyRmFjdG9yeX0gZm9yIGhvdyB7QGxpbmsgUGlwZWxpbmVBc3NlbWJsZXJ9cworICogYXJlIGxvY2F0ZWQuCisgKgorICogPHA+CisgKiBUT0RPOiB0aGUgSkFYLVdTIHRlYW0gZmVsdCB0aGF0IG5vIHtAbGluayBQaXBlfSBzaG91bGQgYmUgcmVseWluZworICogb24gdGhlIHtAbGluayBTRUlNb2RlbH0sIHNvIGl0IGlzIG5vIGxvbmdlciBnaXZlbiB0byB0aGUgYXNzZW1ibGVyLgorICogVGFsayB0byB1cyBpZiB5b3UgbmVlZCBpdC4KKyAqCisgKiBAc2VlIENsaWVudFBpcGVBc3NlbWJsZXJDb250ZXh0CisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgaW50ZXJmYWNlIFBpcGVsaW5lQXNzZW1ibGVyIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHBpcGVsaW5lIGZvciBjbGllbnRzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiBhIEpBWC1XUyBjbGllbnQgY3JlYXRlcyBhIHByb3h5IG9yIGEge0BsaW5rIERpc3BhdGNofSBmcm9tCisgICAgICogYSB7QGxpbmsgU2VydmljZX0sIEpBWC1XUyBydW50aW1lIGludGVybmFsbHkgdXNlcyB0aGlzIG1ldGhvZAorICAgICAqIHRvIGNyZWF0ZSBhIG5ldyBwaXBlbGluZSBhcyBhIHBhcnQgb2YgdGhlIGluaXRpbGl6YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgT2JqZWN0IHRoYXQgY2FwdHVyZXMgdmFyaW91cyBjb250ZXh0dWFsIGluZm9ybWF0aW9uCisgICAgICogICAgICB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcGlwZWxpbmUgdG8gYmUgYXNzZW1ibGVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbm9uLW51bGwgZnJlc2hseSBjcmVhdGVkIHBpcGVsaW5lLgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGVyZSdzIGFueSBjb25maWd1cmF0aW9uIGVycm9yIHRoYXQgcHJldmVudHMgdGhlCisgICAgICogICAgICBwaXBlbGluZSBmcm9tIGJlaW5nIGNvbnN0cnVjdGVkLiBUaGlzIGV4Y2VwdGlvbiB3aWxsIGJlCisgICAgICogICAgICBwcm9wYWdhdGVkIGludG8gdGhlIGFwcGxpY2F0aW9uLCBzbyBpdCBtdXN0IGhhdmUKKyAgICAgKiAgICAgIGEgZGVzY3JpcHRpdmUgZXJyb3IuCisgICAgICovCisgICAgQE5vdE51bGwgUGlwZSBjcmVhdGVDbGllbnQoQE5vdE51bGwgQ2xpZW50UGlwZUFzc2VtYmxlckNvbnRleHQgY29udGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHBpcGVsaW5lIGZvciBzZXJ2ZXJzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiBhIEpBWC1XUyBzZXJ2ZXIgZGVwbG95cyBhIG5ldyBlbmRwb2ludCwgaXQgaW50ZXJuYWxseQorICAgICAqIHVzZXMgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IHBpcGVsaW5lIGFzIGEgcGFydCBvZiB0aGUKKyAgICAgKiBpbml0aWFsaXphdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBvbmNlIHRvIHNldCB1cCBhCisgICAgICogJ21hc3RlciBwaXBlbGluZScsIGFuZCBpdCBnZXRzIHtAbGluayBQaXBlI2NvcHkoUGlwZUNsb25lcikgY29waWVkfQorICAgICAqIGZyb20gaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgT2JqZWN0IHRoYXQgY2FwdHVyZXMgdmFyaW91cyBjb250ZXh0dWFsIGluZm9ybWF0aW9uCisgICAgICogICAgICB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcGlwZWxpbmUgdG8gYmUgYXNzZW1ibGVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbm9uLW51bGwgZnJlc2hseSBjcmVhdGVkIHBpcGVsaW5lLgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGVyZSdzIGFueSBjb25maWd1cmF0aW9uIGVycm9yIHRoYXQgcHJldmVudHMgdGhlCisgICAgICogICAgICBwaXBlbGluZSBmcm9tIGJlaW5nIGNvbnN0cnVjdGVkLiBUaGlzIGV4Y2VwdGlvbiB3aWxsIGJlCisgICAgICogICAgICBwcm9wYWdhdGVkIGludG8gdGhlIGNvbnRhaW5lciwgc28gaXQgbXVzdCBoYXZlCisgICAgICogICAgICBhIGRlc2NyaXB0aXZlIGVycm9yLgorICAgICAqCisgICAgICovCisgICAgQE5vdE51bGwgUGlwZSBjcmVhdGVTZXJ2ZXIoQE5vdE51bGwgU2VydmVyUGlwZUFzc2VtYmxlckNvbnRleHQgY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9QaXBlbGluZUFzc2VtYmxlckZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1BpcGVsaW5lQXNzZW1ibGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMGU3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9QaXBlbGluZUFzc2VtYmxlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGU7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuQmluZGluZ0lEOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUZpbmRlcjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBDcmVhdGVzIHtAbGluayBQaXBlbGluZUFzc2VtYmxlcn0uCisgKgorICogPHA+CisgKiBUbyBjcmVhdGUgYSBwaXBlbGluZSwKKyAqIHRoZSBKQVgtV1MgcnVudGltZSBsb2NhdGVzIHtAbGluayBQaXBlbGluZUFzc2VtYmxlckZhY3Rvcnl9cyB0aHJvdWdoCisgKiB0aGUgPHR0Pk1FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGVsaW5lQXNzZW1ibGVyRmFjdG9yeTwvdHQ+IGZpbGVzLgorICogRmFjdG9yaWVzIGZvdW5kIGFyZSBjaGVja2VkIHRvIHNlZSBpZiBpdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gYmluZGluZyBJRCBvbmUgYnkgb25lLAorICogYW5kIHRoZSBmaXJzdCB2YWxpZCB7QGxpbmsgUGlwZWxpbmVBc3NlbWJsZXJ9IHJldHVybmVkIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUKKyAqIGEgcGlwZWxpbmUuCisgKgorICogPHA+CisgKiBUT0RPOiBpcyBiaW5kaW5nSWQgcmVhbGx5IGV4dGVuc2libGU/IGZvciB0aGlzIHRvIGJlIGV4dGVuc2libGUsCisgKiBzb21lb25lIHNlZW1zIHRvIG5lZWQgdG8gaG9vayBpbnRvIFdTREwgcGFyc2luZy4KKyAqCisgKiA8cD4KKyAqIFRPRE86IEpBWC1XU0EgbWlnaHQgbm90IGRlZmluZSBpdHMgb3duIGJpbmRpbmcgSUQgLS0gaXQgbWF5IGp1c3QgZ28gdG8gYW4gZXh0ZW5zaW9uIGVsZW1lbnQKKyAqIG9mIFdTREwuIFNvIHRoaXMgYWJzdHJhY3Rpb24gbWlnaHQgbmVlZCB0byBiZSB3b3JrZWQgb24uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGRlcHJlY2F0ZWQKKyAqICAgICAgVXNlIHtAbGluayBUdWJlbGluZUFzc2VtYmxlckZhY3Rvcnl9IGluc3RlYWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQaXBlbGluZUFzc2VtYmxlckZhY3RvcnkgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgUGlwZWxpbmVBc3NlbWJsZXJ9IGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiBiaW5kaW5nIElELgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmdJZAorICAgICAqICAgICAgVGhlIGJpbmRpbmcgSUQgZm9yIHdoaWNoIGEgcGlwZWxpbmUgd2lsbCBiZSBjcmVhdGVkLAorICAgICAqICAgICAgc3VjaCBhcyB7QGxpbmsgU09BUEJpbmRpbmcjU09BUDExSFRUUF9CSU5ESU5HfS4KKyAgICAgKiAgICAgIE11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIGlmIHRoaXMgZmFjdG9yeSBkb2Vzbid0IHJlY29nbml6ZSB0aGUgZ2l2ZW4gYmluZGluZyBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgUGlwZWxpbmVBc3NlbWJsZXIgZG9DcmVhdGUoQmluZGluZ0lEIGJpbmRpbmdJZCk7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIHtAbGluayBQaXBlbGluZUFzc2VtYmxlckZhY3Rvcnl9cyBhbmQgY3JlYXRlCisgICAgICogYSBzdWl0YWJsZSB7QGxpbmsgUGlwZWxpbmVBc3NlbWJsZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmdJZAorICAgICAqICAgICAgVGhlIGJpbmRpbmcgSUQgc3RyaW5nIGZvciB3aGljaCB0aGUgbmV3IHtAbGluayBQaXBlbGluZUFzc2VtYmxlcn0KKyAgICAgKiAgICAgIGlzIGNyZWF0ZWQuIE11c3Qgbm90IGJlIG51bGwuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQWx3YXlzIG5vbi1udWxsLCBzaW5jZSB3ZSBmYWxsIGJhY2sgdG8gb3VyIGRlZmF1bHQge0BsaW5rIFBpcGVsaW5lQXNzZW1ibGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBpcGVsaW5lQXNzZW1ibGVyIGNyZWF0ZShDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgQmluZGluZ0lEIGJpbmRpbmdJZCkgeworICAgICAgICBmb3IgKFBpcGVsaW5lQXNzZW1ibGVyRmFjdG9yeSBmYWN0b3J5IDogU2VydmljZUZpbmRlci5maW5kKFBpcGVsaW5lQXNzZW1ibGVyRmFjdG9yeS5jbGFzcyxjbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgIFBpcGVsaW5lQXNzZW1ibGVyIGFzc2VtYmxlciA9IGZhY3RvcnkuZG9DcmVhdGUoYmluZGluZ0lkKTsKKyAgICAgICAgICAgIGlmKGFzc2VtYmxlciE9bnVsbCkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKGZhY3RvcnkuZ2V0Q2xhc3MoKSsiIHN1Y2Nlc3NmdWxseSBjcmVhdGVkICIrYXNzZW1ibGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNzZW1ibGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZGVmYXVsdCBiaW5kaW5nIElEcyB0aGF0IGFyZSBrbm93bgorICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHRoaXMgd2l0aCBwcm9wZXIgb25lcworICAgICAgICByZXR1cm4gbmV3IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwucGlwZS5TdGFuZGFsb25lUGlwZUFzc2VtYmxlcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBpcGVsaW5lQXNzZW1ibGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvU09BUEJpbmRpbmdDb2RlYy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvU09BUEJpbmRpbmdDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjc0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9TT0FQQmluZGluZ0NvZGVjLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICoKKyAqCisgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjcworICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGludGVyZmFjZSBTT0FQQmluZGluZ0NvZGVjIGV4dGVuZHMgQ29kZWMgeworICAgIFN0cmVhbVNPQVBDb2RlYyBnZXRYTUxDb2RlYygpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvU2VydmVyUGlwZUFzc2VtYmxlckNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1NlcnZlclBpcGVBc3NlbWJsZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhZjAzNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1NlcnZlclBpcGVBc3NlbWJsZXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlNFSU1vZGVsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5QaXBlQWRhcHRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHdlbGwta25vd24gc2VydmVyIHtAbGluayBQaXBlfSBpbXBsZW1lbnRhdGlvbnMKKyAqIHRoYXQgdGhlIHtAbGluayBQaXBlbGluZUFzc2VtYmxlcn0gbmVlZHMgdG8gdXNlCisgKiB0byBzYXRpc2Z5IEpBWC1XUyByZXF1aXJlbWVudHMuCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU2VydmVyVHViZUFzc2VtYmxlckNvbnRleHR9LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyUGlwZUFzc2VtYmxlckNvbnRleHQgZXh0ZW5kcyBTZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dCB7CisKKyAgICBwdWJsaWMgU2VydmVyUGlwZUFzc2VtYmxlckNvbnRleHQoQE51bGxhYmxlIFNFSU1vZGVsIHNlaU1vZGVsLCBATnVsbGFibGUgV1NETFBvcnQgd3NkbE1vZGVsLCBATm90TnVsbCBXU0VuZHBvaW50IGVuZHBvaW50LCBATm90TnVsbCBUdWJlIHRlcm1pbmFsLCBib29sZWFuIGlzU3luY2hyb25vdXMpIHsKKyAgICAgICAgc3VwZXIoc2VpTW9kZWwsIHdzZGxNb2RlbCwgZW5kcG9pbnQsIHRlcm1pbmFsLCBpc1N5bmNocm9ub3VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFBpcGV9IHRoYXQgcGVyZm9ybXMgU09BUCBtdXN0VW5kZXJzdGFuZCBwcm9jZXNzaW5nLgorICAgICAqIFRoaXMgcGlwZSBzaG91bGQgYmUgYmVmb3JlIEhhbmRsZXJQaXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgUGlwZSBjcmVhdGVTZXJ2ZXJNVVBpcGUoQE5vdE51bGwgUGlwZSBuZXh0KSB7CisgICAgICAgIHJldHVybiBQaXBlQWRhcHRlci5hZGFwdChzdXBlci5jcmVhdGVTZXJ2ZXJNVVR1YmUoUGlwZUFkYXB0ZXIuYWRhcHQobmV4dCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIGEge0BsaW5rIFBpcGV9IHRoYXQgZHVtcHMgbWVzc2FnZXMgdGhhdCBwYXNzIHRocm91Z2guCisgICAgICovCisgICAgcHVibGljIFBpcGUgY3JlYXRlRHVtcFBpcGUoU3RyaW5nIG5hbWUsIFByaW50U3RyZWFtIG91dCwgUGlwZSBuZXh0KSB7CisgICAgICAgIHJldHVybiBQaXBlQWRhcHRlci5hZGFwdChzdXBlci5jcmVhdGVEdW1wVHViZShuYW1lLCBvdXQsIFBpcGVBZGFwdGVyLmFkYXB0KG5leHQpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBQaXBlfSB0aGF0IGRvZXMgdGhlIG1vbml0b3Jpbmcgb2YgdGhlIGludm9jYXRpb24gZm9yIGEKKyAgICAgKiBjb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgUGlwZSBjcmVhdGVNb25pdG9yaW5nUGlwZShATm90TnVsbCBQaXBlIG5leHQpIHsKKyAgICAgICAgcmV0dXJuIFBpcGVBZGFwdGVyLmFkYXB0KHN1cGVyLmNyZWF0ZU1vbml0b3JpbmdUdWJlKFBpcGVBZGFwdGVyLmFkYXB0KG5leHQpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBQaXBlfSB0aGF0IGFkZHMgY29udGFpbmVyIHNwZWNpZmljIHNlY3VyaXR5CisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIFBpcGUgY3JlYXRlU2VjdXJpdHlQaXBlKEBOb3ROdWxsIFBpcGUgbmV4dCkgeworICAgICAgICByZXR1cm4gUGlwZUFkYXB0ZXIuYWRhcHQoc3VwZXIuY3JlYXRlU2VjdXJpdHlUdWJlKFBpcGVBZGFwdGVyLmFkYXB0KG5leHQpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBQaXBlfSB0aGF0IGludm9rZXMgcHJvdG9jb2wgYW5kIGxvZ2ljYWwgaGFuZGxlcnMuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIFBpcGUgY3JlYXRlSGFuZGxlclBpcGUoQE5vdE51bGwgUGlwZSBuZXh0KSB7CisgICAgICAgIHJldHVybiBQaXBlQWRhcHRlci5hZGFwdChzdXBlci5jcmVhdGVIYW5kbGVyVHViZShQaXBlQWRhcHRlci5hZGFwdChuZXh0KSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IHtAbGluayBQaXBlfSBpbiB0aGUgcGlwZWxpbmUuIFRoZSBhc3NlbWJsZXIgaXMgZXhwZWN0ZWQgdG8gcHV0CisgICAgICogYWRkaXRpb25hbCB7QGxpbmsgUGlwZX1zIGluIGZyb250IG9mIGl0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogKEp1c3QgdG8gZ2l2ZSB5b3UgdGhlIGlkZWEgaG93IHRoaXMgaXMgdXNlZCwgbm9ybWFsbHkgdGhlIHRlcm1pbmFsIHBpcGUKKyAgICAgKiBpcyB0aGUgb25lIHRoYXQgaW52b2tlcyB0aGUgdXNlciBhcHBsaWNhdGlvbiBvciB7QGxpbmsgamF2YXgueG1sLndzLlByb3ZpZGVyfS4pCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsd2F5cyBub24tbnVsbCB0ZXJtaW5hbCBwaXBlCisgICAgICovCisgICAgIHB1YmxpYyBATm90TnVsbCBQaXBlIGdldFRlcm1pbmFsUGlwZSgpIHsKKyAgICAgICAgIHJldHVybiBQaXBlQWRhcHRlci5hZGFwdChzdXBlci5nZXRUZXJtaW5hbFR1YmUoKSk7CisgICAgfQorCisgICAgIC8qKgorICAgICAqIENyZWF0ZXMgV1MtQWRkcmVzc2luZyBwaXBlCisgICAgICovCisgICAgcHVibGljIFBpcGUgY3JlYXRlV3NhUGlwZShQaXBlIG5leHQpIHsKKyAgICAgICAgcmV0dXJuIFBpcGVBZGFwdGVyLmFkYXB0KHN1cGVyLmNyZWF0ZVdzYVR1YmUoUGlwZUFkYXB0ZXIuYWRhcHQobmV4dCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9TZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvU2VydmVyVHViZUFzc2VtYmxlckNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTBhMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvU2VydmVyVHViZUFzc2VtYmxlckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLldzYVNlcnZlclR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlNFSU1vZGVsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5QaXBlQWRhcHRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlNlcnZlclBpcGVsaW5lSG9vazsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLkhhbmRsZXJUdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuU2VydmVyTG9naWNhbEhhbmRsZXJUdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuU2VydmVyU09BUEhhbmRsZXJUdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuU2VydmVyTVVUdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwucGlwZS5EdW1wVHViZTsKKworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CisKKy8qKgorICogRmFjdG9yeSBmb3Igd2VsbC1rbm93biBzZXJ2ZXIge0BsaW5rIFR1YmV9IGltcGxlbWVudGF0aW9ucworICogdGhhdCB0aGUge0BsaW5rIFR1YmVsaW5lQXNzZW1ibGVyfSBuZWVkcyB0byB1c2UKKyAqIHRvIHNhdGlzZnkgSkFYLVdTIHJlcXVpcmVtZW50cy4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgY2xhc3MgU2VydmVyVHViZUFzc2VtYmxlckNvbnRleHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTRUlNb2RlbCBzZWlNb2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIFdTRExQb3J0IHdzZGxNb2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIFdTRW5kcG9pbnQgZW5kcG9pbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nSW1wbCBiaW5kaW5nOworICAgIHByaXZhdGUgZmluYWwgVHViZSB0ZXJtaW5hbDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNTeW5jaHJvbm91czsKKyAgICBwcml2YXRlIEBOb3ROdWxsIENvZGVjIGNvZGVjOworCisgICAgcHVibGljIFNlcnZlclR1YmVBc3NlbWJsZXJDb250ZXh0KEBOdWxsYWJsZSBTRUlNb2RlbCBzZWlNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFdTRExQb3J0IHdzZGxNb2RlbCwgQE5vdE51bGwgV1NFbmRwb2ludCBlbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vdE51bGwgVHViZSB0ZXJtaW5hbCwgYm9vbGVhbiBpc1N5bmNocm9ub3VzKSB7CisgICAgICAgIHRoaXMuc2VpTW9kZWwgPSBzZWlNb2RlbDsKKyAgICAgICAgdGhpcy53c2RsTW9kZWwgPSB3c2RsTW9kZWw7CisgICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKKyAgICAgICAgdGhpcy50ZXJtaW5hbCA9IHRlcm1pbmFsOworICAgICAgICAvLyBXU0JpbmRpbmcgaXMgYWN0dWFsbHkgQmluZGluZ0ltcGwKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gKEJpbmRpbmdJbXBsKWVuZHBvaW50LmdldEJpbmRpbmcoKTsKKyAgICAgICAgdGhpcy5pc1N5bmNocm9ub3VzID0gaXNTeW5jaHJvbm91czsKKyAgICAgICAgdGhpcy5jb2RlYyA9IHRoaXMuYmluZGluZy5jcmVhdGVDb2RlYygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjcmVhdGVkIHBpcGVsaW5lIHdpbGwgdXNlIHNlaU1vZGVsIHRvIGdldCBqYXZhIGNvbmNlcHRzIGZvciB0aGUgZW5kcG9pbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVsbCBpZiB0aGUgc2VydmljZSBkb2Vzbid0IGhhdmUgU0VJIG1vZGVsIGUuZy4gUHJvdmlkZXIgZW5kcG9pbnRzLAorICAgICAqICAgICAgICAgYW5kIG90aGVyd2lzZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFNFSU1vZGVsIGdldFNFSU1vZGVsKCkgeworICAgICAgICByZXR1cm4gc2VpTW9kZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNyZWF0ZWQgcGlwZWxpbmUgd2lsbCBiZSB1c2VkIHRvIHNlcnZlIHRoaXMgcG9ydC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVsbCBpZiB0aGUgc2VydmljZSBpc24ndCBhc3NvY2lhdGVkIHdpdGggYW55IHBvcnQgZGVmaW5pdGlvbiBpbiBXU0RMLAorICAgICAqICAgICAgICAgYW5kIG90aGVyd2lzZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFdTRExQb3J0IGdldFdzZGxNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHdzZGxNb2RlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFRoZSBjcmVhdGVkIHBpcGVsaW5lIGlzIHVzZWQgdG8gc2VydmUgdGhpcyB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU0VuZHBvaW50fS4KKyAgICAgKiBTcGVjaWZpY2FsbHksIGl0cyB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZ30gc2hvdWxkIGJlIG9mIGludGVyZXN0IHRvICBtYW55CisgICAgICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGV9cy4KKyAgICAgKiAgQHJldHVybiBBbHdheXMgbm9uLW51bGwuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIFdTRW5kcG9pbnQgZ2V0RW5kcG9pbnQoKSB7CisgICAgICAgIHJldHVybiBlbmRwb2ludDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFzdCB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuUGlwZX0gaW4gdGhlIHBpcGVsaW5lLiBUaGUgYXNzZW1ibGVyIGlzIGV4cGVjdGVkIHRvIHB1dAorICAgICAqIGFkZGl0aW9uYWwge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGV9cyBpbiBmcm9udCBvZiBpdC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIChKdXN0IHRvIGdpdmUgeW91IHRoZSBpZGVhIGhvdyB0aGlzIGlzIHVzZWQsIG5vcm1hbGx5IHRoZSB0ZXJtaW5hbCBwaXBlCisgICAgICogaXMgdGhlIG9uZSB0aGF0IGludm9rZXMgdGhlIHVzZXIgYXBwbGljYXRpb24gb3Ige0BsaW5rIGphdmF4LnhtbC53cy5Qcm92aWRlcn0uKQorICAgICAqCisgICAgICogQHJldHVybiBhbHdheXMgbm9uLW51bGwgdGVybWluYWwgcGlwZQorICAgICAqLworICAgICBwdWJsaWMgQE5vdE51bGwgVHViZSBnZXRUZXJtaW5hbFR1YmUoKSB7CisgICAgICAgICByZXR1cm4gdGVybWluYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhpcyBzZXJ2ZXIgcGlwZWxpbmUgaXMga25vd24gdG8gYmUgdXNlZCBmb3Igc2VydmluZyBzeW5jaHJvbm91cyB0cmFuc3BvcnQsCisgICAgICogdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUuIFRoaXMgY2FuIGJlIHBvdGVudGlhbGx5IHVzZSBhcyBhbiBvcHRpbWl6YXRpb24KKyAgICAgKiBoaW50LCBzaW5jZSBvZnRlbiBzeW5jaHJvbm91cyB2ZXJzaW9ucyBhcmUgY2hlYXBlciB0byBleGVjdXRlIHRoYW4gYXN5Y25ocm9ub3VzCisgICAgICogdmVyc2lvbnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbm91cygpIHsKKyAgICAgICAgcmV0dXJuIGlzU3luY2hyb25vdXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBUdWJlfSB0aGF0IHBlcmZvcm1zIFNPQVAgbXVzdFVuZGVyc3RhbmQgcHJvY2Vzc2luZy4KKyAgICAgKiBUaGlzIHBpcGUgc2hvdWxkIGJlIGJlZm9yZSBIYW5kbGVyUGlwZXMuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIFR1YmUgY3JlYXRlU2VydmVyTVVUdWJlKEBOb3ROdWxsIFR1YmUgbmV4dCkgeworICAgICAgICBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJNVVR1YmUoYmluZGluZyxuZXh0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBUdWJlfSB0aGF0IGludm9rZXMgcHJvdG9jb2wgYW5kIGxvZ2ljYWwgaGFuZGxlcnMuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIFR1YmUgY3JlYXRlSGFuZGxlclR1YmUoQE5vdE51bGwgVHViZSBuZXh0KSB7CisgICAgICAgIGlmICghYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEhhbmRsZXJUdWJlIGNvdXNpbiA9IG5ldyBTZXJ2ZXJMb2dpY2FsSGFuZGxlclR1YmUoYmluZGluZywgd3NkbE1vZGVsLCBuZXh0KTsKKyAgICAgICAgICAgIG5leHQgPSBjb3VzaW47CisgICAgICAgICAgICBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJTT0FQSGFuZGxlclR1YmUoYmluZGluZywgbmV4dCwgY291c2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFR1YmV9IHRoYXQgZG9lcyB0aGUgbW9uaXRvcmluZyBvZiB0aGUgaW52b2NhdGlvbiBmb3IgYQorICAgICAqIGNvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBUdWJlIGNyZWF0ZU1vbml0b3JpbmdUdWJlKEBOb3ROdWxsIFR1YmUgbmV4dCkgeworICAgICAgICBTZXJ2ZXJQaXBlbGluZUhvb2sgaG9vayA9IGVuZHBvaW50LmdldENvbnRhaW5lcigpLmdldFNQSShTZXJ2ZXJQaXBlbGluZUhvb2suY2xhc3MpOworICAgICAgICBpZiAoaG9vayAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXJ2ZXJQaXBlQXNzZW1ibGVyQ29udGV4dCBjdHh0ID0gbmV3IFNlcnZlclBpcGVBc3NlbWJsZXJDb250ZXh0KHNlaU1vZGVsLCB3c2RsTW9kZWwsIGVuZHBvaW50LCB0ZXJtaW5hbCwgaXNTeW5jaHJvbm91cyk7CisgICAgICAgICAgICByZXR1cm4gUGlwZUFkYXB0ZXIuYWRhcHQoaG9vay5jcmVhdGVNb25pdG9yaW5nUGlwZShjdHh0LCBQaXBlQWRhcHRlci5hZGFwdChuZXh0KSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVHViZX0gdGhhdCBhZGRzIGNvbnRhaW5lciBzcGVjaWZpYyBzZWN1cml0eQorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBUdWJlIGNyZWF0ZVNlY3VyaXR5VHViZShATm90TnVsbCBUdWJlIG5leHQpIHsKKyAgICAgICAgU2VydmVyUGlwZWxpbmVIb29rIGhvb2sgPSBlbmRwb2ludC5nZXRDb250YWluZXIoKS5nZXRTUEkoU2VydmVyUGlwZWxpbmVIb29rLmNsYXNzKTsKKyAgICAgICAgaWYgKGhvb2sgIT0gbnVsbCkgeworICAgICAgICAgICAgU2VydmVyUGlwZUFzc2VtYmxlckNvbnRleHQgY3R4dCA9IG5ldyBTZXJ2ZXJQaXBlQXNzZW1ibGVyQ29udGV4dChzZWlNb2RlbCwgd3NkbE1vZGVsLCBlbmRwb2ludCwgdGVybWluYWwsIGlzU3luY2hyb25vdXMpOworICAgICAgICAgICAgcmV0dXJuIFBpcGVBZGFwdGVyLmFkYXB0KGhvb2suY3JlYXRlU2VjdXJpdHlQaXBlKGN0eHQsIFBpcGVBZGFwdGVyLmFkYXB0KG5leHQpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIHtAbGluayBUdWJlfSB0aGF0IGR1bXBzIG1lc3NhZ2VzIHRoYXQgcGFzcyB0aHJvdWdoLgorICAgICAqLworICAgIHB1YmxpYyBUdWJlIGNyZWF0ZUR1bXBUdWJlKFN0cmluZyBuYW1lLCBQcmludFN0cmVhbSBvdXQsIFR1YmUgbmV4dCkgeworICAgICAgICByZXR1cm4gbmV3IER1bXBUdWJlKG5hbWUsIG91dCwgbmV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBXUy1BZGRyZXNzaW5nIHBpcGUKKyAgICAgKi8KKyAgICBwdWJsaWMgVHViZSBjcmVhdGVXc2FUdWJlKFR1YmUgbmV4dCkgeworICAgICAgICBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nICYmIEFkZHJlc3NpbmdWZXJzaW9uLmlzRW5hYmxlZChiaW5kaW5nKSAmJiB3c2RsTW9kZWwhPW51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFdzYVNlcnZlclR1YmUod3NkbE1vZGVsLCBiaW5kaW5nLCBuZXh0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIENvZGVjfSB0aGF0IGlzIHNldCBieSB7QGxpbmsgI3NldENvZGVjfSBvciB0aGUgZGVmYXVsdCBjb2RlYworICAgICAqIGJhc2VkIG9uIHRoZSBiaW5kaW5nLiBUaGUgY29kZWMgaXMgYSBmdWxsIGNvZGVjIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogZW5jb2RpbmcvZGVjb2RpbmcgZW50aXJlIHByb3RvY29sIG1lc3NhZ2UoZm9yIGUuZzogaXQgaXMgcmVzcG9uc2libGUgdG8KKyAgICAgKiBlbmNvZGUvZGVjb2RlIGVudGlyZSBNSU1FIG1lc3NhZ2VzIGluIFNPQVAgYmluZGluZykKKyAgICAgKgorICAgICAqIEByZXR1cm4gY29kZWMgdG8gYmUgdXNlZCBmb3Igd2ViIHNlcnZpY2UgcmVxdWVzdHMKKyAgICAgKiBAc2VlIHtAbGluayBDb2RlY3N9CisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIENvZGVjIGdldENvZGVjKCkgeworICAgICAgICByZXR1cm4gY29kZWM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJjZXB0aW9uIHBvaW50IHRvIGNoYW5nZSB7QGxpbmsgQ29kZWN9IGR1cmluZyB7QGxpbmsgVHViZX1saW5lIGFzc2VtYmx5LiBUaGUKKyAgICAgKiBuZXcgY29kZWMgd2lsbCBiZSB1c2VkIGJ5IGpheC13cyBzZXJ2ZXIgcnVudGltZSBmb3IgZW5jb2RpbmcvZGVjb2Rpbmcgd2ViIHNlcnZpY2UKKyAgICAgKiByZXF1ZXN0L3Jlc3BvbnNlIG1lc3NhZ2VzLiB7QGxpbmsgV1NFbmRwb2ludCNjcmVhdGVDb2RlYygpfSB3aWxsIHJldHVybiBhIGNvcHkKKyAgICAgKiBvZiB0aGlzIG5ldyBjb2RlYyBhbmQgd2lsbCBiZSB1c2VkIGluIHRoZSBzZXJ2ZXIgcnVudGltZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBjb2RlYyBpcyBhIGZ1bGwgY29kZWMgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBlbmNvZGluZy9kZWNvZGluZyBlbnRpcmUgcHJvdG9jb2wgbWVzc2FnZShmb3IgZS5nOiBpdCBpcyByZXNwb25zaWJsZSB0bworICAgICAqIGVuY29kZS9kZWNvZGUgZW50aXJlIE1JTUUgbWVzc2FnZXMgaW4gU09BUCBiaW5kaW5nKQorICAgICAqCisgICAgICogPHA+CisgICAgICogdGhlIGNvZGVjIHNob3VsZCBjb3JyZWN0bHkgaW1wbGVtZW50IHtAbGluayBDb2RlYyNjb3B5fSBzaW5jZSBpdCBpcyB1c2VkIHdoaWxlCisgICAgICogc2VydmluZyByZXF1ZXN0cyBjb25jdXJyZW50bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZWMgY29kZWMgdG8gYmUgdXNlZCBmb3Igd2ViIHNlcnZpY2UgcmVxdWVzdHMKKyAgICAgKiBAc2VlIHtAbGluayBDb2RlY3N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29kZWMoQE5vdE51bGwgQ29kZWMgY29kZWMpIHsKKyAgICAgICAgdGhpcy5jb2RlYyA9IGNvZGVjOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvU3RyZWFtU09BUENvZGVjLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9TdHJlYW1TT0FQQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmYzYjQxCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvU3RyZWFtU09BUENvZGVjLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICogUmVhZHMgZXZlbnRzIGZyb20ge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gYW5kIGNvbnN0cnVjdHMgYQorICoge0BsaW5rIE1lc3NhZ2V9IGZvciBTT0FQIGVudmVsb3BlLiB7QGxpbmsgQ29kZWNzfSBhbGxvd3MgYQorICogd2F5IHRvIGNvbnN0cnVjdCBhIHdob2xlIGNvZGVjIHRoYXQgY2FuIGhhbmRsZSBNVE9NLCBNSU1FCisgKiBlbmNvZGVkIHBhY2thZ2VzIHVzaW5nIHRoaXMgY29kZWMuCisgKgorICoKKyAqIEBzZWUgQ29kZWNzCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0cmVhbVNPQVBDb2RlYyBleHRlbmRzIENvZGVjIHsKKyAgICAvKioKKyAgICAgKiBSZWFkcyBldmVudHMgZnJvbSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSBhbmQgY29uc3RydWN0cyBhCisgICAgICoge0BsaW5rIE1lc3NhZ2V9IGZvciBTT0FQIGVudmVsb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciB0aGF0IHJlcHJlc2VudHMgU09BUCBlbnZlbG9wZSBpbmZvc2V0CisgICAgICogQHJldHVybiBhIHtAbGluayBNZXNzYWdlfSBmb3IgU09BUCBlbnZlbG9wZQorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBNZXNzYWdlIGRlY29kZShATm90TnVsbCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1N0dWJzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9TdHVicy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDlkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9TdHVicy5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGU7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU1NlcnZpY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuV1NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guRGF0YVNvdXJjZURpc3BhdGNoOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5EaXNwYXRjaEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoLkpBWEJEaXNwYXRjaDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guTWVzc2FnZURpc3BhdGNoOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5zZWkuU0VJU3R1YjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuV1NCaW5kaW5nUHJvdmlkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuU09BUFNFSU1vZGVsOworCitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7CitpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7CitpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKKworLyoqCisgKiBGYWN0b3J5IG1ldGhvZHMgb2YgdmFyaW91cyBzdHVicy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdmFyaW91cyBtZXRob2RzIHRvIGNyZWF0ZSAic3R1YiJzLAorICogd2hpY2ggYXJlIHRoZSBjb21wb25lbnQgdGhhdCB0dXJucyBhIG1ldGhvZCBpbnZvY2F0aW9uCisgKiBpbnRvIGEge0BsaW5rIE1lc3NhZ2V9IGFuZCBiYWNrIGludG8gYSByZXR1cm4gdmFsdWUuCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIHNlcnZlIGFzIHRoZSBBUEkgZnJvbSBKQVgtV1MgdG8KKyAqIFRhbmdvLCBzbyB0aGF0IHRoZXkgZG9uJ3QgaGF2ZSBoYXJkLWNvZGUgZGVwZW5kZW5jeSBvbgorICogb3VyIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuCisgKgorICogPGEgbmFtZT0icGFyYW0iPjwvYT4KKyAqIDxoMj5Db21tb24gUGFyYW1ldGVycyBhbmQgVGhlaXIgTWVhbmluZ3M8L2gyPgorICoKKyAqIDxoMz5QaXBlIG5leHQ8L2gzPgorICogPHA+CisgKiBTdHVicyB0dXJuIGEgbWV0aG9kIGludm9jYXRpb24gaW50byBhIHtAbGluayBQaXBlI3Byb2Nlc3MoY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0KX0gaW52b2NhdGlvbiwKKyAqIGFuZCB0aGlzIHBpcGUgcGFzc2VkIGluIGFzIHRoZSA8dHQ+bmV4dDwvdHQ+IHBhcmFtZXRlciB3aWxsIHJlY2VpdmUgYSB7QGxpbmsgTWVzc2FnZX0KKyAqIGZyb20gbmV3bHkgY3JlYXRlZCBzdHViLgorICoKKyAqIDxoMz5CaW5kaW5nSW1wbCBiaW5kaW5nPC9oMz4KKyAqIDxwPgorICogU3R1YnMgaW1wbGVtZW50IHtAbGluayBCaW5kaW5nUHJvdmlkZXJ9LCBhbmQgaXRzIHtAbGluayBCaW5kaW5nUHJvdmlkZXIjZ2V0QmluZGluZygpfQorICogd2lsbCByZXR1cm4gdGhpcyA8dHQ+YmluZGluZzwvdHQ+IG9iamVjdC4gU3R1YnMgb2Z0ZW4gYWxzbyB1c2UgdGhpcyBpbmZvcm1hdGlvbgorICogdG8gZGVjaWRlIHdoaWNoIFNPQVAgdmVyc2lvbiBhIHtAbGluayBNZXNzYWdlfSBzaG91bGQgYmUgY3JlYXRlZCBpbi4KKyAqCisgKiA8aDM+e0BsaW5rIFdTU2VydmljZX0gc2VydmljZTwvaDM+CisgKiA8cD4KKyAqIFRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYSB7QGxpbmsgU2VydmljZX0gdGhhdCBvd25zIHRoZSBuZXdseSBjcmVhdGVkIHN0dWIuCisgKiBGb3IgZXhhbXBsZSwgYXN5bmNocm9ub3VzIG1ldGhvZCBpbnZvY2F0aW9uIHdpbGwgdXNlIHtAbGluayBTZXJ2aWNlI2dldEV4ZWN1dG9yKCl9LgorICoKKyAqIDxoMz57QGxpbmsgV1NFbmRwb2ludFJlZmVyZW5jZX0gZXByPC9oMz4KKyAqIDxwPgorICogSWYgeW91IHdhbnQgdGhlIGNyZWF0ZWQge0BsaW5rIERpc3BhdGNofSB0byB0YWxrIHRvIHRoZSBnaXZlbiBFUFIsIHNwZWNpZnkgdGhlIHBhcmFtZXRlci4KKyAqIE90aGVyd2lzZSBsZWF2ZSBpdCA8dHQ+bnVsbDwvdHQ+LiBOb3RlIHRoYXQgdGhlIGFkZHJlc3NpbmcgbmVlZHMgdG8gYmUgZW5hYmxlZCBzZXBhcmF0ZWx5CisgKiBmb3IgdGhpcyB0byB0YWtlIGVmZmVjdC4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIEthdGh5IFdhbHNoCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHVicyB7CisgICAgcHJpdmF0ZSBTdHVicygpIHt9ICAgLy8gbm8gaW5zdGFuY2lhdGlvbiBwbGVhc2UKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERpc3BhdGNofSBzdHViIGZvciB7QGxpbmsgU09BUE1lc3NhZ2V9LgorICAgICAqCisgICAgICogVGhpcyBpcyBzaG9ydC1jdXQgb2YgY2FsbGluZworICAgICAqIDxwcmU+CisgICAgICogY3JlYXRlRGlzcGF0Y2gocG9ydCxvd25lcixiaW5kaW5nLFNPQVBNZXNzYWdlLmNsYXNzLG1vZGUsbmV4dCk7CisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gY3JlYXRlU0FBSkRpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBXU1NlcnZpY2Ugb3duZXIsIFdTQmluZGluZyBiaW5kaW5nLCBTZXJ2aWNlLk1vZGUgbW9kZSwgVHViZSBuZXh0LCBATnVsbGFibGUgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgRGlzcGF0Y2hJbXBsLmNoZWNrVmFsaWRTT0FQTWVzc2FnZURpc3BhdGNoKGJpbmRpbmcsIG1vZGUpOworICAgICAgICByZXR1cm4gbmV3IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5TT0FQTWVzc2FnZURpc3BhdGNoKHBvcnROYW1lLCBtb2RlLCAoV1NTZXJ2aWNlRGVsZWdhdGUpb3duZXIsIG5leHQsIChCaW5kaW5nSW1wbCliaW5kaW5nLCBlcHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERpc3BhdGNofSBzdHViIGZvciB7QGxpbmsgRGF0YVNvdXJjZX0uCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHNob3J0LWN1dCBvZiBjYWxsaW5nCisgICAgICogPHByZT4KKyAgICAgKiBjcmVhdGVEaXNwYXRjaChwb3J0LG93bmVyLGJpbmRpbmcsRGF0YVNvdXJjZS5jbGFzcyxtb2RlLG5leHQpOworICAgICAqIDwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGlzcGF0Y2g8RGF0YVNvdXJjZT4gY3JlYXRlRGF0YVNvdXJjZURpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBXU1NlcnZpY2Ugb3duZXIsIFdTQmluZGluZyBiaW5kaW5nLCBTZXJ2aWNlLk1vZGUgbW9kZSwgVHViZSBuZXh0LCBATnVsbGFibGUgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgRGlzcGF0Y2hJbXBsLmNoZWNrVmFsaWREYXRhU291cmNlRGlzcGF0Y2goYmluZGluZywgbW9kZSk7CisgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZURpc3BhdGNoKHBvcnROYW1lLCBtb2RlLCAoV1NTZXJ2aWNlRGVsZWdhdGUpb3duZXIsIG5leHQsIChCaW5kaW5nSW1wbCliaW5kaW5nLCBlcHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERpc3BhdGNofSBzdHViIGZvciB7QGxpbmsgU291cmNlfS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgc2hvcnQtY3V0IG9mIGNhbGxpbmcKKyAgICAgKiA8cHJlPgorICAgICAqIGNyZWF0ZURpc3BhdGNoKHBvcnQsb3duZXIsYmluZGluZyxTb3VyY2UuY2xhc3MsbW9kZSxuZXh0KTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpc3BhdGNoPFNvdXJjZT4gY3JlYXRlU291cmNlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIFdTU2VydmljZSBvd25lciwgV1NCaW5kaW5nIGJpbmRpbmcsIFNlcnZpY2UuTW9kZSBtb2RlLCBUdWJlIG5leHQsIEBOdWxsYWJsZSBXU0VuZHBvaW50UmVmZXJlbmNlIGVwcikgeworICAgICAgICByZXR1cm4gRGlzcGF0Y2hJbXBsLmNyZWF0ZVNvdXJjZURpc3BhdGNoKHBvcnROYW1lLCBtb2RlLCAoV1NTZXJ2aWNlRGVsZWdhdGUpb3duZXIsIG5leHQsIChCaW5kaW5nSW1wbCliaW5kaW5nLCBlcHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERpc3BhdGNofSBzdHViIHRoYXQgY29ubmVjdHMgdG8gdGhlIGdpdmVuIHBpcGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydE5hbWUKKyAgICAgKiAgICAgIHNlZSB7QGxpbmsgU2VydmljZSNjcmVhdGVEaXNwYXRjaChRTmFtZSwgQ2xhc3MsIFNlcnZpY2UuTW9kZSl9LgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgc2VlIDxhIGhyZWY9IiNwYXJhbSI+Y29tbW9uIHBhcmFtZXRlcnM8L2E+CisgICAgICogQHBhcmFtIGJpbmRpbmcKKyAgICAgKiAgICAgIHNlZSA8YSBocmVmPSIjcGFyYW0iPmNvbW1vbiBwYXJhbWV0ZXJzPC9hPgorICAgICAqIEBwYXJhbSBjbGF6egorICAgICAqICAgICAgVHlwZSBvZiB0aGUge0BsaW5rIERpc3BhdGNofSB0byBiZSBjcmVhdGVkLgorICAgICAqICAgICAgU2VlIHtAbGluayBTZXJ2aWNlI2NyZWF0ZURpc3BhdGNoKFFOYW1lLCBDbGFzcywgU2VydmljZS5Nb2RlKX0uCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgIFRoZSBtb2RlIG9mIHRoZSBkaXNwYXRjaC4KKyAgICAgKiAgICAgIFNlZSB7QGxpbmsgU2VydmljZSNjcmVhdGVEaXNwYXRjaChRTmFtZSwgQ2xhc3MsIFNlcnZpY2UuTW9kZSl9LgorICAgICAqIEBwYXJhbSBuZXh0CisgICAgICogICAgICBzZWUgPGEgaHJlZj0iI3BhcmFtIj5jb21tb24gcGFyYW1ldGVyczwvYT4KKyAgICAgKiBAcGFyYW0gZXByCisgICAgICogICAgICBzZWUgPGEgaHJlZj0iI3BhcmFtIj5jb21tb24gcGFyYW1ldGVyczwvYT4KKyAgICAgKiBUT0RPOiBhcmUgdGhlc2UgcGFyYW1ldGVycyBtYWtpbmcgc2Vuc2U/CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NTZXJ2aWNlIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTQmluZGluZyBiaW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPFQ+IGNsYXp6LCBTZXJ2aWNlLk1vZGUgbW9kZSwgVHViZSBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBXU0VuZHBvaW50UmVmZXJlbmNlIGVwcikgeworICAgICAgICBpZiAoY2xhenogPT0gU09BUE1lc3NhZ2UuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoRGlzcGF0Y2g8VD4pIGNyZWF0ZVNBQUpEaXNwYXRjaChwb3J0TmFtZSwgb3duZXIsIGJpbmRpbmcsIG1vZGUsIG5leHQsIGVwcik7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gU291cmNlLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gKERpc3BhdGNoPFQ+KSBjcmVhdGVTb3VyY2VEaXNwYXRjaChwb3J0TmFtZSwgb3duZXIsIGJpbmRpbmcsIG1vZGUsIG5leHQsIGVwcik7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gRGF0YVNvdXJjZS5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIChEaXNwYXRjaDxUPikgY3JlYXRlRGF0YVNvdXJjZURpc3BhdGNoKHBvcnROYW1lLCBvd25lciwgYmluZGluZywgbW9kZSwgbmV4dCwgZXByKTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGF6eiA9PSBNZXNzYWdlLmNsYXNzKSB7CisgICAgICAgICAgICBpZihtb2RlPT1Nb2RlLk1FU1NBR0UpCisgICAgICAgICAgICAgICAgcmV0dXJuIChEaXNwYXRjaDxUPikgY3JlYXRlTWVzc2FnZURpc3BhdGNoKHBvcnROYW1lLCBvd25lciwgYmluZGluZywgbmV4dCwgZXByKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihtb2RlKyIgbm90IHN1cHBvcnRlZCB3aXRoIERpc3BhdGNoPE1lc3NhZ2U+Iik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlVua25vd24gY2xhc3MgdHlwZSAiICsgY2xhenouZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEpBWEItYmFzZWQge0BsaW5rIERpc3BhdGNofSBzdHViIHRoYXQgY29ubmVjdHMgdG8gdGhlIGdpdmVuIHBpcGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydE5hbWUKKyAgICAgKiAgICAgIHNlZSB7QGxpbmsgU2VydmljZSNjcmVhdGVEaXNwYXRjaChRTmFtZSwgQ2xhc3MsIFNlcnZpY2UuTW9kZSl9LgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgc2VlIDxhIGhyZWY9IiNwYXJhbSI+Y29tbW9uIHBhcmFtZXRlcnM8L2E+CisgICAgICogQHBhcmFtIGJpbmRpbmcKKyAgICAgKiAgICAgIHNlZSA8YSBocmVmPSIjcGFyYW0iPmNvbW1vbiBwYXJhbWV0ZXJzPC9hPgorICAgICAqIEBwYXJhbSBqYXhiQ29udGV4dAorICAgICAqICAgICAge0BsaW5rIEpBWEJDb250ZXh0fSB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiBvYmplY3RzIGFuZCBYTUwuCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgIFRoZSBtb2RlIG9mIHRoZSBkaXNwYXRjaC4KKyAgICAgKiAgICAgIFNlZSB7QGxpbmsgU2VydmljZSNjcmVhdGVEaXNwYXRjaChRTmFtZSwgQ2xhc3MsIFNlcnZpY2UuTW9kZSl9LgorICAgICAqIEBwYXJhbSBuZXh0CisgICAgICogICAgICBzZWUgPGEgaHJlZj0iI3BhcmFtIj5jb21tb24gcGFyYW1ldGVyczwvYT4KKyAgICAgKiBAcGFyYW0gZXByCisgICAgICogICAgICBzZWUgPGEgaHJlZj0iI3BhcmFtIj5jb21tb24gcGFyYW1ldGVyczwvYT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpc3BhdGNoPE9iamVjdD4gY3JlYXRlSkFYQkRpc3BhdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnROYW1lLCBXU1NlcnZpY2Ugb3duZXIsIFdTQmluZGluZyBiaW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0LCBTZXJ2aWNlLk1vZGUgbW9kZSwgVHViZSBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBXU0VuZHBvaW50UmVmZXJlbmNlIGVwcikgeworICAgICAgICByZXR1cm4gbmV3IEpBWEJEaXNwYXRjaChwb3J0TmFtZSwgamF4YkNvbnRleHQsIG1vZGUsIChXU1NlcnZpY2VEZWxlZ2F0ZSlvd25lciwgbmV4dCwgKEJpbmRpbmdJbXBsKWJpbmRpbmcsIGVwcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVzc2FnZX0tYmFzZWQge0BsaW5rIERpc3BhdGNofSBzdHViIHRoYXQgY29ubmVjdHMgdG8gdGhlIGdpdmVuIHBpcGUuCisgICAgICogVGhlIHJldHVybmVkIGRpc3BhdGNoIGlzIGFsd2F5cyB7QGxpbmsgU2VydmljZS5Nb2RlI01FU1NBR0V9LgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lCisgICAgICogICAgICBzZWUge0BsaW5rIFNlcnZpY2UjY3JlYXRlRGlzcGF0Y2goUU5hbWUsIENsYXNzLCBTZXJ2aWNlLk1vZGUpfS4KKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgIHNlZSA8YSBocmVmPSIjcGFyYW0iPmNvbW1vbiBwYXJhbWV0ZXJzPC9hPgorICAgICAqIEBwYXJhbSBiaW5kaW5nCisgICAgICogICAgICBzZWUgPGEgaHJlZj0iI3BhcmFtIj5jb21tb24gcGFyYW1ldGVyczwvYT4KKyAgICAgKiBAcGFyYW0gbmV4dAorICAgICAqICAgICAgc2VlIDxhIGhyZWY9IiNwYXJhbSI+Y29tbW9uIHBhcmFtZXRlcnM8L2E+CisgICAgICogQHBhcmFtIGVwcgorICAgICAqICAgICAgc2VlIDxhIGhyZWY9IiNwYXJhbSI+Y29tbW9uIHBhcmFtZXRlcnM8L2E+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaXNwYXRjaDxNZXNzYWdlPiBjcmVhdGVNZXNzYWdlRGlzcGF0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcG9ydE5hbWUsIFdTU2VydmljZSBvd25lciwgV1NCaW5kaW5nIGJpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHViZSBuZXh0LCBATnVsbGFibGUgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRGlzcGF0Y2gocG9ydE5hbWUsIChXU1NlcnZpY2VEZWxlZ2F0ZSlvd25lciwgbmV4dCwgKEJpbmRpbmdJbXBsKWJpbmRpbmcsIGVwcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzdHJvbmdseS10eXBlZCBwcm94eSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgZ2l2ZW4gcG9ydCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZQorICAgICAqICAgICAgc2VlIDxhIGhyZWY9IiNwYXJhbSI+Y29tbW9uIHBhcmFtZXRlcnM8L2E+CisgICAgICogQHBhcmFtIGJpbmRpbmcKKyAgICAgKiAgICAgIHNlZSA8YSBocmVmPSIjcGFyYW0iPmNvbW1vbiBwYXJhbWV0ZXJzPC9hPgorICAgICAqIEBwYXJhbSBtb2RlbAorICAgICAqICAgICAgVGhpcyBtb2RlbCBzaGFsbCByZXByZXNlbnQgYSBwb3J0IGludGVyZmFjZS4KKyAgICAgKiAgICAgIFRPRE86IGNhbiBtb2RlbCBiZSBjb25zdHJ1Y3RlZCBmcm9tIHBvcnRJbnRlcmZhY2UgYW5kIGJpbmRpbmc/CisgICAgICogICAgICBGaW5kIG91dCBhbmQgdXBkYXRlLgorICAgICAqIEBwYXJhbSBwb3J0SW50ZXJmYWNlCisgICAgICogICAgICBUaGUgcG9ydCBpbnRlcmZhY2UgdGhhdCBoYXMgb3BlcmF0aW9ucyBhcyBKYXZhIG1ldGhvZHMuCisgICAgICogQHBhcmFtIG5leHQKKyAgICAgKiAgICAgIHNlZSA8YSBocmVmPSIjcGFyYW0iPmNvbW1vbiBwYXJhbWV0ZXJzPC9hPgorICAgICAqIEBwYXJhbSBlcHIKKyAgICAgKiAgICAgIHNlZSA8YSBocmVmPSIjcGFyYW0iPmNvbW1vbiBwYXJhbWV0ZXJzPC9hPgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCBjcmVhdGVQb3J0UHJveHkoIFdTU2VydmljZSBzZXJ2aWNlLCBXU0JpbmRpbmcgYmluZGluZywgU0VJTW9kZWwgbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8VD4gcG9ydEludGVyZmFjZSwgVHViZSBuZXh0LCBATnVsbGFibGUgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIgKSB7CisKKyAgICAgICAgU0VJU3R1YiBwcyA9IG5ldyBTRUlTdHViKChXU1NlcnZpY2VEZWxlZ2F0ZSlzZXJ2aWNlLChCaW5kaW5nSW1wbCliaW5kaW5nLCAoU09BUFNFSU1vZGVsKW1vZGVsLG5leHQsIGVwcik7CisgICAgICAgIHJldHVybiBwb3J0SW50ZXJmYWNlLmNhc3QoCisgICAgICAgICAgICBQcm94eS5uZXdQcm94eUluc3RhbmNlKCBwb3J0SW50ZXJmYWNlLmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW117cG9ydEludGVyZmFjZSwgV1NCaW5kaW5nUHJvdmlkZXIuY2xhc3N9LCBwcyApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9UcmFuc3BvcnRQaXBlRmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvVHJhbnNwb3J0UGlwZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NhYzYyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvVHJhbnNwb3J0UGlwZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuRW5kcG9pbnRBZGRyZXNzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5QaXBlQWRhcHRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnBpcGUuU3RhbmRhbG9uZVBpcGVBc3NlbWJsZXI7CisKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKiBGYWN0b3J5IGZvciB0cmFuc3BvcnQgcGlwZXMgdGhhdCBlbmFibGVzIHRyYW5zcG9ydCBwbHVnZ2FiaWxpdHkuCisgKgorICogPHA+CisgKiBBdCBydW50aW1lLCBvbiB0aGUgY2xpZW50IHNpZGUsIEpBWC1XUyAobW9yZSBzcGVjaWZpY2FsbHkgdGhlIGRlZmF1bHQge0BsaW5rIFBpcGVsaW5lQXNzZW1ibGVyfQorICogb2YgSkFYLVdTIGNsaWVudCBydW50aW1lKSByZWxpZXMgb24gdGhpcyBmYWN0b3J5IHRvIGNyZWF0ZSBhIHN1aXRhYmxlIHRyYW5zcG9ydCB7QGxpbmsgUGlwZX0KKyAqIHRoYXQgY2FuIGhhbmRsZSB0aGUgZ2l2ZW4ge0BsaW5rIEVuZHBvaW50QWRkcmVzcyBlbmRwb2ludCBhZGRyZXNzfS4KKyAqCisgKiA8cD4KKyAqIEpBWC1XUyBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBhZGRpdGlvbmFsIHRyYW5zcG9ydCBzdXBwb3J0IGNhbgorICogZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIGltcGxlbWVudCB0aGUge0BsaW5rICNkb0NyZWF0ZX0gbWV0aG9kLgorICogVGhleSBhcmUgZXhwZWN0ZWQgdG8gY2hlY2sgdGhlIHNjaGVtZSBvZiB0aGUgZW5kcG9pbnQgYWRkcmVzcworICogKGFuZCBwb3NzaWJseSBzb21lIG90aGVyIHNldHRpbmdzIGZyb20gYmluZGluZ3MpLCBhbmQgY3JlYXRlCisgKiB0aGVpciB0cmFuc3BvcnQgcGlwZSBpbXBsZW1lbnRhdGlvbnMgYWNjb3JkaW5nbHkuCisgKiBGb3IgZXhhbXBsZSwKKyAqCisgKiA8cHJlPgorICogY2xhc3MgTXlUcmFuc3BvcnRQaXBlRmFjdG9yeUltcGwgeworICogICBQaXBlIGRvQ3JlYXRlKC4uLikgeworICogICAgIFN0cmluZyBzY2hlbWUgPSBhZGRyZXNzLmdldFVSSSgpLmdldFNjaGVtZSgpOworICogICAgIGlmKHNjaGVtZS5lcXVhbHMoImZvbyIpKQorICogICAgICAgcmV0dXJuIG5ldyBNeVRyYW5zcG9ydCguLi4pOworICogICAgIGVsc2UKKyAqICAgICAgIHJldHVybiBudWxsOworICogICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIHtAbGluayBUcmFuc3BvcnRQaXBlRmFjdG9yeX0gbG9vay11cCBmb2xsb3dzIHRoZSBzdGFuZGFyZCBzZXJ2aWNlCisgKiBkaXNjb3ZlcnkgbWVjaGFuaXNtLCBzbyB5b3UgbmVlZAorICoge0Bjb2RlIE1FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlRyYW5zcG9ydFBpcGVGYWN0b3J5fS4KKyAqCisgKgorICoKKyAqIDxoMj5UT0RPPC9oMj4KKyAqIDxwPgorICogT25lIG9mIHRoZSBKQVgtV1Mgb3BlcmF0aW9uIG1vZGUgaXMgc3VwcG9zZWRseSB3aGVyZSBpdCBkb2Vzbid0IGhhdmUgbm8gV1NETCB3aGF0c29ldmVyLgorICogSG93IGRvIHdlIGlkZW50aWZ5IHRoZSBlbmRwb2ludCBpbiBzdWNoIGNhc2U/CisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQHNlZSBTdGFuZGFsb25lUGlwZUFzc2VtYmxlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNwb3J0UGlwZUZhY3RvcnkgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB0cmFuc3BvcnQge0BsaW5rIFBpcGV9IGZvciB0aGUgZ2l2ZW4gcG9ydCwgaWYgdGhpcyBmYWN0b3J5IGNhbiBkbyBzbywKKyAgICAgKiBvciByZXR1cm4gbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICBPYmplY3QgdGhhdCBjYXB0dXJlcyB2YXJpb3VzIGNvbnRleHR1YWwgaW5mb3JtYXRpb24KKyAgICAgKiAgICAgIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwaXBlbGluZSB0byBiZSBhc3NlbWJsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIHRvIGluZGljYXRlIHRoYXQgdGhpcyBmYWN0b3J5IGlzbid0IGNhcGFibGUgb2YgY3JlYXRpbmcgYSB0cmFuc3BvcnQKKyAgICAgKiAgICAgIGZvciB0aGlzIHBvcnQgKHdoaWNoIGNhdXNlcyB0aGUgY2FsbGVyIHRvIHNlYXJjaCBmb3Igb3RoZXIge0BsaW5rIFRyYW5zcG9ydFBpcGVGYWN0b3J5fXMKKyAgICAgKiAgICAgIHRoYXQgY2FuLiBPciBub24tbnVsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhpcyBmYWN0b3J5IGlzIGNhcGFibGUgb2YgY3JlYXRpbmcgYSB0cmFuc3BvcnQgcGlwZSBidXQgc29tZSBmYXRhbAorICAgICAqICAgICAgZXJyb3IgcHJldmVudGVkIGl0IGZyb20gZG9pbmcgc28uIFRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgcHJvcGFnYXRlZAorICAgICAqICAgICAgYmFjayB0byB0aGUgdXNlciBhcHBsaWNhdGlvbiwgYW5kIG5vIGZ1cnRoZXIge0BsaW5rIFRyYW5zcG9ydFBpcGVGYWN0b3J5fXMKKyAgICAgKiAgICAgIGFyZSBjb25zdWx0ZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFBpcGUgZG9DcmVhdGUoQE5vdE51bGwgQ2xpZW50UGlwZUFzc2VtYmxlckNvbnRleHQgY29udGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIHtAbGluayBQaXBlbGluZUFzc2VtYmxlckZhY3Rvcnl9cyBhbmQgY3JlYXRlCisgICAgICogYSBzdWl0YWJsZSB7QGxpbmsgUGlwZWxpbmVBc3NlbWJsZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyCisgICAgICogICAgICB1c2VkIHRvIGxvY2F0ZSB7QGNvZGUgTUVUQS1JTkYvc2VydmNlc30gZmlsZXMuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQWx3YXlzIG5vbi1udWxsLCBzaW5jZSB3ZSBmYWxsIGJhY2sgdG8gb3VyIGRlZmF1bHQge0BsaW5rIFBpcGVsaW5lQXNzZW1ibGVyfS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rIFRyYW5zcG9ydFR1YmVGYWN0b3J5I2NyZWF0ZShDbGFzc0xvYWRlciwgQ2xpZW50VHViZUFzc2VtYmxlckNvbnRleHQpfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGlwZSBjcmVhdGUoQE51bGxhYmxlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBATm90TnVsbCBDbGllbnRQaXBlQXNzZW1ibGVyQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBQaXBlQWRhcHRlci5hZGFwdChUcmFuc3BvcnRUdWJlRmFjdG9yeS5jcmVhdGUoY2xhc3NMb2FkZXIsY29udGV4dCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1RyYW5zcG9ydFR1YmVGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9UcmFuc3BvcnRUdWJlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjU5NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvVHJhbnNwb3J0VHViZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuRW5kcG9pbnRBZGRyZXNzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5QaXBlQWRhcHRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5jbGllbnQuSHR0cFRyYW5zcG9ydFBpcGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5TZXJ2aWNlRmluZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwucGlwZS5TdGFuZGFsb25lVHViZUFzc2VtYmxlcjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBGYWN0b3J5IGZvciB0cmFuc3BvcnQgdHViZXMgdGhhdCBlbmFibGVzIHRyYW5zcG9ydCBwbHVnZ2FiaWxpdHkuCisgKgorICogPHA+CisgKiBBdCBydW50aW1lLCBvbiB0aGUgY2xpZW50IHNpZGUsIEpBWC1XUyAobW9yZSBzcGVjaWZpY2FsbHkgdGhlIGRlZmF1bHQge0BsaW5rIFR1YmVsaW5lQXNzZW1ibGVyfQorICogb2YgSkFYLVdTIGNsaWVudCBydW50aW1lKSByZWxpZXMgb24gdGhpcyBmYWN0b3J5IHRvIGNyZWF0ZSBhIHN1aXRhYmxlIHRyYW5zcG9ydCB7QGxpbmsgVHViZX0KKyAqIHRoYXQgY2FuIGhhbmRsZSB0aGUgZ2l2ZW4ge0BsaW5rIEVuZHBvaW50QWRkcmVzcyBlbmRwb2ludCBhZGRyZXNzfS4KKyAqCisgKiA8cD4KKyAqIEpBWC1XUyBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBhZGRpdGlvbmFsIHRyYW5zcG9ydCBzdXBwb3J0IGNhbgorICogZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIGltcGxlbWVudCB0aGUge0BsaW5rICNkb0NyZWF0ZX0gbWV0aG9kLgorICogVGhleSBhcmUgZXhwZWN0ZWQgdG8gY2hlY2sgdGhlIHNjaGVtZSBvZiB0aGUgZW5kcG9pbnQgYWRkcmVzcworICogKGFuZCBwb3NzaWJseSBzb21lIG90aGVyIHNldHRpbmdzIGZyb20gYmluZGluZ3MpLCBhbmQgY3JlYXRlCisgKiB0aGVpciB0cmFuc3BvcnQgdHViZSBpbXBsZW1lbnRhdGlvbnMgYWNjb3JkaW5nbHkuCisgKiBGb3IgZXhhbXBsZSwKKyAqCisgKiA8cHJlPgorICogY2xhc3MgTXlUcmFuc3BvcnRUdWJlRmFjdG9yeUltcGwgeworICogICBUdWJlIGRvQ3JlYXRlKC4uLikgeworICogICAgIFN0cmluZyBzY2hlbWUgPSBhZGRyZXNzLmdldFVSSSgpLmdldFNjaGVtZSgpOworICogICAgIGlmKHNjaGVtZS5lcXVhbHMoImZvbyIpKQorICogICAgICAgcmV0dXJuIG5ldyBNeVRyYW5zcG9ydCguLi4pOworICogICAgIGVsc2UKKyAqICAgICAgIHJldHVybiBudWxsOworICogICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIHtAbGluayBUcmFuc3BvcnRUdWJlRmFjdG9yeX0gbG9vay11cCBmb2xsb3dzIHRoZSBzdGFuZGFyZCBzZXJ2aWNlCisgKiBkaXNjb3ZlcnkgbWVjaGFuaXNtLCBzbyB5b3UgbmVlZAorICoge0Bjb2RlIE1FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlRyYW5zcG9ydFR1YmVGYWN0b3J5fS4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICogQHNlZSBTdGFuZGFsb25lVHViZUFzc2VtYmxlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNwb3J0VHViZUZhY3RvcnkgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB0cmFuc3BvcnQge0BsaW5rIFR1YmV9IGZvciB0aGUgZ2l2ZW4gcG9ydCwgaWYgdGhpcyBmYWN0b3J5IGNhbiBkbyBzbywKKyAgICAgKiBvciByZXR1cm4gbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICBPYmplY3QgdGhhdCBjYXB0dXJlcyB2YXJpb3VzIGNvbnRleHR1YWwgaW5mb3JtYXRpb24KKyAgICAgKiAgICAgIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0dWJlbGluZSB0byBiZSBhc3NlbWJsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIHRvIGluZGljYXRlIHRoYXQgdGhpcyBmYWN0b3J5IGlzbid0IGNhcGFibGUgb2YgY3JlYXRpbmcgYSB0cmFuc3BvcnQKKyAgICAgKiAgICAgIGZvciB0aGlzIHBvcnQgKHdoaWNoIGNhdXNlcyB0aGUgY2FsbGVyIHRvIHNlYXJjaCBmb3Igb3RoZXIge0BsaW5rIFRyYW5zcG9ydFR1YmVGYWN0b3J5fXMKKyAgICAgKiAgICAgIHRoYXQgY2FuLiBPciBub24tbnVsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhpcyBmYWN0b3J5IGlzIGNhcGFibGUgb2YgY3JlYXRpbmcgYSB0cmFuc3BvcnQgdHViZSBidXQgc29tZSBmYXRhbAorICAgICAqICAgICAgZXJyb3IgcHJldmVudGVkIGl0IGZyb20gZG9pbmcgc28uIFRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgcHJvcGFnYXRlZAorICAgICAqICAgICAgYmFjayB0byB0aGUgdXNlciBhcHBsaWNhdGlvbiwgYW5kIG5vIGZ1cnRoZXIge0BsaW5rIFRyYW5zcG9ydFR1YmVGYWN0b3J5fXMKKyAgICAgKiAgICAgIGFyZSBjb25zdWx0ZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFR1YmUgZG9DcmVhdGUoQE5vdE51bGwgQ2xpZW50VHViZUFzc2VtYmxlckNvbnRleHQgY29udGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIHtAbGluayBUcmFuc3BvcnRUdWJlRmFjdG9yeX1zIGFuZCBjcmVhdGUgYSBzdWl0YWJsZSB0cmFuc3BvcnQge0BsaW5rIFR1YmV9LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyCisgICAgICogICAgICB1c2VkIHRvIGxvY2F0ZSB7QGNvZGUgTUVUQS1JTkYvc2VydmNlc30gZmlsZXMuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQWx3YXlzIG5vbi1udWxsLCBzaW5jZSB3ZSBmYWxsIGJhY2sgdG8gb3VyIGRlZmF1bHQge0BsaW5rIFR1YmV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHViZSBjcmVhdGUoQE51bGxhYmxlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBATm90TnVsbCBDbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZvciAoVHJhbnNwb3J0VHViZUZhY3RvcnkgZmFjdG9yeSA6IFNlcnZpY2VGaW5kZXIuZmluZChUcmFuc3BvcnRUdWJlRmFjdG9yeS5jbGFzcyxjbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgIFR1YmUgdHViZSA9IGZhY3RvcnkuZG9DcmVhdGUoY29udGV4dCk7CisgICAgICAgICAgICBpZih0dWJlICE9bnVsbCkgeworICAgICAgICAgICAgICAgIFRyYW5zcG9ydFR1YmVGYWN0b3J5LmxvZ2dlci5maW5lKGZhY3RvcnkuZ2V0Q2xhc3MoKSsiIHN1Y2Nlc3NmdWxseSBjcmVhdGVkICIrdHViZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR1YmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSB7QGxpbmsgVHJhbnNwb3J0UGlwZUZhY3Rvcnl9IG91dCB0aGVyZSBhbmQgdXNlIGl0IGZvciBjb21wYXRpYmlsaXR5LgorICAgICAgICBDbGllbnRQaXBlQXNzZW1ibGVyQ29udGV4dCBjdHh0ID0gbmV3IENsaWVudFBpcGVBc3NlbWJsZXJDb250ZXh0KAorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0QWRkcmVzcygpLCBjb250ZXh0LmdldFdzZGxNb2RlbCgpLCBjb250ZXh0LmdldFNlcnZpY2UoKSwKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEJpbmRpbmcoKSwgY29udGV4dC5nZXRDb250YWluZXIoKSk7CisgICAgICAgIGZvciAoVHJhbnNwb3J0UGlwZUZhY3RvcnkgZmFjdG9yeSA6IFNlcnZpY2VGaW5kZXIuZmluZChUcmFuc3BvcnRQaXBlRmFjdG9yeS5jbGFzcyxjbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgIFBpcGUgcGlwZSA9IGZhY3RvcnkuZG9DcmVhdGUoY3R4dCk7CisgICAgICAgICAgICBpZiAocGlwZSE9bnVsbCkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKGZhY3RvcnkuZ2V0Q2xhc3MoKSsiIHN1Y2Nlc3NmdWxseSBjcmVhdGVkICIrcGlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBpcGVBZGFwdGVyLmFkYXB0KHBpcGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZGVmYXVsdCBidWlsdC1pbiB0cmFuc3BvcnRzCisgICAgICAgIFN0cmluZyBzY2hlbWUgPSBjb250ZXh0LmdldEFkZHJlc3MoKS5nZXRVUkkoKS5nZXRTY2hlbWUoKTsKKyAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZihzY2hlbWUuZXF1YWxzSWdub3JlQ2FzZSgiaHR0cCIpIHx8IHNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwcyIpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cFRyYW5zcG9ydFBpcGUoY29udGV4dC5nZXRDb2RlYygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmRwb2ludCBhZGRyZXNzOiAiK2NvbnRleHQuZ2V0QWRkcmVzcygpKTsgICAgLy8gVE9ETzogaTE4bgorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRyYW5zcG9ydFR1YmVGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9UdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9UdWJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhMTgyMwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1R1YmUuamF2YQpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RUdWJlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkFkYXB0ZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOworaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworCisvKioKKyAqIEFic3RyYWN0aW9uIG9mIHRoZSBpbnRlcm1lZGlhdGUgbGF5ZXJzIGluIHRoZSBwcm9jZXNzaW5nIGNoYWluCisgKiBhbmQgdHJhbnNwb3J0LgorICoKKyAqIDxoMj5XaGF0IGlzIGEge0BsaW5rIFR1YmV9PzwvaDI+CisgKiA8cD4KKyAqIHtAbGluayBUdWJlfSBpcyBhIGJhc2ljIHByb2Nlc3NpbmcgdW5pdCB0aGF0IHJlcHJlc2VudHMgU09BUC1sZXZlbAorICogcHJvdG9jb2wgaGFuZGxpbmcgY29kZS4gTXV0bGlwbGUgdHViZXMgYXJlIG9mdGVuIHB1dCB0b2dldGhlciBpbgorICogYSBsaW5lIChpdCBuZWVkcyBub3Qgb25lIGRpbWVuc2lvbmFsICZtZGFzaDsgbW9yZSBsYXRlciksIGFuZCBhY3Qgb24KKyAqIHtAbGluayBQYWNrZXR9cyBpbiBhIHNlcXVlbnRpYWwgZmFzaGlvbi4KKyAqCisgKiA8cD4KKyAqIHtAbGluayBUdWJlfXMgcnVuIGFzeW5jaHJvbm91c2x5LiBUaGF0IGlzLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorICoge0BsaW5rICNwcm9jZXNzUmVxdWVzdChQYWNrZXQpfSBhbmQge0BsaW5rICNwcm9jZXNzUmVzcG9uc2UoUGFja2V0KX0gcnVucworICogaW4gdGhlIHNhbWUgdGhyZWFkLCBub3IgaXMgdGhlcmUgYW55IGd1YXJhbnRlZSB0aGF0IHRoaXMgdHViZSBhbmQgbmV4dAorICogdHViZSBydW5zIGluIHRoZSBzYW1lIHRocmVhZC4gRnVydGhlcm1vcmUsIG9uZSB0aHJlYWQgbWF5IGJlIHVzZWQgdG8KKyAqIHJ1biBtdWx0aXBsZSBwaXBlbGluZSBpbiB0dXJuIChqdXN0IGxpa2UgYSByZWFsIENQVSBydW5zIG11bHRpcGxlCisgKiB0aHJlYWRzIGluIHR1cm4uKQorICoKKyAqCisgKiA8aDI+VHViZSBleGFtcGxlczwvaDI+CisgKiA8cD4KKyAqIFRyYW5zcG9ydCBpcyBhIGtpbmQgb2YgdHViZS4gSXQgc2VuZHMgdGhlIHtAbGluayBQYWNrZXR9CisgKiB0aHJvdWdoLCBzYXksIEhUVFAgY29ubmVjdGlvbiwgYW5kIHJlY2VpdmVzIHRoZSBkYXRhIGJhY2sgaW50byBhbm90aGVyIHtAbGluayBQYWNrZXR9LgorICoKKyAqIDxwPgorICogTW9yZSBvZnRlbiwgYSB0dWJlIHdvcmtzIGxpa2UgYSBmaWx0ZXIuIEl0IGFjdHMgb24gYSBwYWNrZXQsCisgKiBhbmQgdGhlbiBpdCB0ZWxscyB0aGUgSkFYLVdTIHRoYXQgdGhlIHBhY2tldCBzaG91bGQgYmUgcGFzc2VkIGludG8gYW5vdGhlcgorICogdHViZS4gSXQgY2FuIGRvIHRoZSBzYW1lIG9uIHRoZSB3YXkgYmFjay4KKyAqCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCBYV1NTIHdpbGwgYmUgYSB7QGxpbmsgVHViZX0uIEl0IHdpbGwgYWN0IG9uIGEgcmVxdWVzdAorICoge0BsaW5rIFBhY2tldH0sIHRoZW4gcGVyaGFwcyB3cmFwIGl0IGludG8KKyAqIGFub3RoZXIge0BsaW5rIFBhY2tldH0gdG8gZW5jcnlwdCB0aGUgYm9keSBhbmQgYWRkIGEgaGVhZGVyLCB0aGVuCisgKiB0aGUgcHJvY2Vzc2luZyB3aWxsIGdvIG9uIHRvIHRoZSBuZXh0IHR1YmUuCisgKgorICogPHA+CisgKiBZZXQgYW5vdGhlciBraW5kIG9mIGZpbHRlciB0dWJlIGlzIHRob3NlIHRoYXQgd3JhcHMge0BsaW5rIExvZ2ljYWxIYW5kbGVyfQorICogYW5kIHtAbGluayBTT0FQSGFuZGxlcn0uIFRoZXNlIHR1YmVzIGFyZSBoZWF2eS13ZWlnaHQ7IHRoZXkgb2Z0ZW4gY29uc3VtZQorICogYSBtZXNzYWdlIGluIGEgcGFja2V0IGFuZCBjcmVhdGUgYSBuZXcgb25lLCBhbmQgdGhlbiBwYXNzIGl0IHRvIHRoZSBuZXh0IHR1YmUuCisgKgorICogPHA+CisgKiBUaGVyZSB3b3VsZCBiZSBhIHtAbGluayBUdWJlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGludm9rZXMge0BsaW5rIFByb3ZpZGVyfS4KKyAqIFRoZXJlIHdvdWxkIGJlIGEge0BsaW5rIFR1YmV9IGltcGxlbWVudGF0aW9uIHRoYXQgaW52b2tlcyBhIHNlcnZpY2UgbWV0aG9kCisgKiBvbiB0aGUgdXNlcidzIGNvZGUuCisgKiBUaGVyZSB3b3VsZCBiZSBhIHtAbGluayBEaXNwYXRjaH0gaW1wbGVtZW50YXRpb24gdGhhdCBpbnZva2VzIGEge0BsaW5rIFR1YmV9LgorICoKKyAqIDxwPgorICogV1MtTUVYIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBhIHtAbGluayBUdWJlfSB0aGF0IGxvb2tzIGZvcgorICoge0BsaW5rIE1lc3NhZ2UjZ2V0UGF5bG9hZE5hbWVzcGFjZVVSSSgpfSBhbmQgc2VydmVzIHRoZSByZXF1ZXN0LgorICoKKyAqCisgKgorICoKKyAqIDxoMj5UdWJlIExpZmVjeWNsZTwvaDI+CisgKiBQaXBlbGluZSBpcyBleHBlbnNpdmUgdG8gc2V0IHVwLCBzbyBvbmNlIGl0J3MgY3JlYXRlZCBpdCB3aWxsIGJlIHJldXNlZC4KKyAqIEEgcGlwZWxpbmUgaXMgbm90IHJlZW50cmFudDsgb25lIHBpcGVsaW5lIGlzIHVzZWQgdG8gcHJvY2VzcyBvbmUgcmVxdWVzdC9yZXNwb25zZQorICogYXQgYXQgdGltZS4gVGhlIHNhbWUgcGlwZWxpbmUgaW5zdGFuY2UgbWF5IHNlcnZlIG11bHRpcGxlIHJlcXVlc3QvcmVzcG9uc2UsCisgKiBpZiBvbmUgY29tZXMgYWZ0ZXIgYW5vdGhlciBhbmQgdGhleSBkb24ndCBvdmVybGFwLgorICogPHA+CisgKiBXaGVyZSBhIG5lZWQgYXJpc2VzIHRvIHByb2Nlc3MgbXVsdGlwbGUgcmVxdWVzdHMgY29uY3VycmVudGx5LCBhIHBpcGVsaW5lCisgKiBnZXRzIGNsb25lZCB0aHJvdWdoIHtAbGluayBUdWJlQ2xvbmVyfS4gTm90ZSB0aGF0IHRoaXMgbmVlZCBtYXkgaGFwcGVuIG9uCisgKiBib3RoIHNlcnZlciAoYmVjYXVzZSBpdCBxdWl0ZSBvZnRlbiBzZXJ2ZXMgbXVsdGlwbGUgcmVxdWVzdHMgY29uY3VycmVudGx5KQorICogYW5kIGNsaWVudCAoYmVjYXVzZSBpdCBuZWVkcyB0byBzdXBwb3J0IGFzeW5jaHJvbm91cyBtZXRob2QgaW52b2NhdGlvbnMuKQorICogPHA+CisgKiBDcmVhdGVkIHBpcGVsaW5lcyAoaW5jbHVkaW5nIGNsb25lZCBvbmVzIGFuZCB0aGUgb3JpZ2luYWwpIG1heSBiZSBkaXNjYXJkZWQgYW5kIEdDLWVkCisgKiBhdCBhbnkgdGltZSBhdCB0aGUgZGlzY3JldGlvbiBvZiB3aG9ldmVyIG93bnMgcGlwZWxpbmVzLiBUdWJlcyBjYW4sIGhvd2V2ZXIsIGV4cGVjdAorICogYXQgbGVhc3Qgb25lIGNvcHkgKG9yIG9yaWdpbmFsKSBvZiBwaXBlbGluZSB0byBsaXZlIGF0IGFueSBnaXZlbiB0aW1lIHdoaWxlIGEgcGlwZWxpbmUKKyAqIG93bmVyIGlzIGludGVyZXN0ZWQgaW4gdGhlIGdpdmVuIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24gKGluIG1vcmUgY29uY2VyZXRlIHRlcm1zLAorICogZm9yIGV4YW1wbGUsIGFzIGxvbmcgYXMgYSBkaXNwYXRjaCBvYmplY3QgbGl2ZXMsIGl0J3MgZ29pbmcgdG8ga2VlcCBhdCBsZWFzdCBvbmUKKyAqIGNvcHkgb2YgYSBwaXBlbGluZSBhbGl2ZS4pCisgKiA8cD4KKyAqIEJlZm9yZSBhIHBpcGVsaW5lIG93bmVyIGRpZXMsIGl0IG1heSBpbnZva2Uge0BsaW5rICNwcmVEZXN0cm95KCl9IG9uIHRoZSBsYXN0CisgKiByZW1haW5pbmcgcGlwZWxpbmUuIEl0IGlzICJtYXkiIGZvciBwaXBlbGluZSBvd25lcnMgdGhhdCBsaXZlIGluIHRoZSBjbGllbnQtc2lkZQorICogb2YgSkFYLVdTIChzdWNoIGFzIGRpc3BhdGNoZXMgYW5kIHByb3hpZXMpLCBidXQgaXQgaXMgYSAibXVzdCIgZm9yIHBpcGVsaW5lIG93bmVycworICogdGhhdCBsaXZlIGluIHRoZSBzZXJ2ZXItc2lkZSBvZiBKQVgtV1MuCisgKiA8cD4KKyAqIFRoaXMgbGFzdCBpbnZvY2F0aW9uIGdpdmVzIGEgY2hhbmNlIGZvciBzb21lIHBpcGVzIHRvIGNsZWFuIHVwIGFueSBzdGF0ZS9yZXNvdXJjZQorICogYWNxdWlyZWQgKHN1Y2ggYXMgV1MtUk0ncyBzZXF1ZW5jZSwgV1MtVHJ1c3QncyBTZWN1cml0eVRva2VuKSwgYWx0aG91Z2ggYXMgc3RhdGVkIGFib3ZlLAorICogdGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGNsaWVudHMuCisgKgorICoKKyAqCisgKiA8aDI+VHViZSBhbmQgc3RhdGU8L2gyPgorICogPHA+CisgKiBUaGUgbGlmZWN5Y2xlIG9mIHBpcGVsaW5lcyBpcyBkZXNpZ25lZCB0byBhbGxvdyBhIHtAbGluayBUdWJlfSB0byBzdG9yZSB2YXJpb3VzCisgKiBzdGF0ZSBpbiBlYXNpbHkgYWNjZXNzaWJsZSBmYXNoaW9uLgorICoKKyAqCisgKiA8aDM+UGVyLXBhY2tldCBzdGF0ZTwvaDM+CisgKiA8cD4KKyAqIEFueSBpbmZvcm1hdGlvbiB0aGF0IGNoYW5nZXMgZnJvbSBhIHBhY2tldCB0byBwYWNrZXQgc2hvdWxkIGJlCisgKiBzdG9yZWQgaW4ge0BsaW5rIFBhY2tldH0gKGlmIHN1Y2ggaW5mb3JtYXRvbiBpcyBzcGVjaWZpYyB0byB5b3VyIHByb2JsZW0gZG9tYWluLAorICogdGhlbiBtb3N0IGxpa2VseSB7QGxpbmsgUGFja2V0I2ludm9jYXRpb25Qcm9wZXJ0aWVzfS4pCisgKiBUaGlzIGluY2x1ZGVzIGluZm9ybWF0aW9uIGxpa2UgdHJhbnNwb3J0LXNwZWNpZmljIGhlYWRlcnMuCisgKgorICogPGgzPlBlci10aHJlYWQgc3RhdGU8L2gzPgorICogPHA+CisgKiBBbnkgZXhwZW5zaXZlLXRvLWNyZWF0ZSBvYmplY3RzIHRoYXQgYXJlIG5vbi1yZWVudHJhbnQgY2FuIGJlIHN0b3JlZAorICogZWl0aGVyIGluIGluc3RhbmNlIHZhcmlhYmxlcyBvZiBhIHtAbGluayBUdWJlfSwgb3IgYSBzdGF0aWMge0BsaW5rIFRocmVhZExvY2FsfS4KKyAqCisgKiA8cD4KKyAqIFRoZSBmaXJzdCBhcHByb2FjaCB3b3JrcywgYmVjYXVzZSB7QGxpbmsgVHViZX0gaXMKKyAqIG5vbiByZWVudHJhbnQuIFdoZW4gYSB0dWJlIGlzIGNvcGllZCwgbmV3IGluc3RhbmNlcyBzaG91bGQgYmUgYWxsb2NhdGVkCisgKiBzbyB0aGF0IHR3byB7QGxpbmsgVHViZX0gaW5zdGFuY2VzIGRvbid0IHNoYXJlIHRocmVhZC11bnNhZmUgcmVzb3VyY2VzLgorICoKKyAqIFNpbWlsYXJseSB0aGUgc2Vjb25kIGFwcHJvYWNoIHdvcmtzLCBzaW5jZSB7QGxpbmsgVGhyZWFkTG9jYWx9IGd1YXJhbnRlZXMKKyAqIHRoYXQgZWFjaCB0aHJlYWQgZ2V0cyBpdHMgb3duIHByaXZhdGUgY29weS4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb3JtZXIgaXMgZmFzdGVyIHRvIGFjY2VzcywgYW5kIHlvdSBuZWVkIG5vdCB3b3JyeSBhYm91dCBjbGVhbiB1cC4KKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBiZWNhdXNlIHRoZXJlIGNhbiBiZSBtYW55IG1vcmUgY29uY3VycmVudCByZXF1ZXN0cworICogdGhhbiAjIG9mIHRocmVhZHMsIHlvdSBtYXkgZW5kIHVwIGhvbGRpbmcgb250byBtb3JlIHJlc291cmNlcyB0aGFuIG5lY2Vzc2FyeS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW5jbHVkZXMgc3RhdGUgbGlrZSBjYW5vbmljYWxpemVycywgSkFYQiB1bm1hcnNoYWxsZXJzLAorICoge0BsaW5rIFNpbXBsZURhdGVGb3JtYXR9LCBldGMuCisgKgorICoKKyAqIDxoMz5QZXItcHJveHkvcGVyLWVuZHBvaW50IHN0YXRlPC9oMz4KKyAqIDxwPgorICogSW5mb3JtYXRpb24gdGhhdCBpcyB0aWVkIHRvIGEgcGFydGljdWxhciBwcm94eS9kaXNwYXRjaCBjYW4gYmUgc3RvcmVkCisgKiBpbiBhIHNlcGFyYXRlIG9iamVjdCB0aGF0IGlzIHJlZmVyZW5jZWQgZnJvbSBhIHR1YmUuIFdoZW4KKyAqIGEgbmV3IHR1YmUgaXMgY29waWVkLCB5b3UgY2FuIHNpbXBseSBoYW5kIG91dCBhIHJlZmVyZW5jZSB0byB0aGUgbmV3bHkKKyAqIGNyZWF0ZWQgb25lLCBzbyB0aGF0IGFsbCBjb3BpZWQgdHViZXMgcmVmZXIgdG8gdGhlIHNhbWUgaW5zdGFuY2UuCisgKiBTZWUgdGhlIGZvbGxvd2luZyBjb2RlIGFzIGFuIGV4YW1wbGU6CisgKgorICogPHByZT4KKyAqIGNsYXNzIFR1YmVJbXBsIHsKKyAqICAgLy8gdGhpcyBvYmplY3Qgc3RvcmVzIHBlci1wcm94eSBzdGF0ZQorICogICBjbGFzcyBEYXRhU3RvcmUgeworICogICAgIGludCBjb3VudGVyOworICogICB9CisgKgorICogICBwcml2YXRlIERhdGFTdG9yZSBkczsKKyAqCisgKiAgIC8vIGNyZWF0ZSBhIGZyZXNoIG5ldyBwaXBlCisgKiAgIHB1YmxpYyBUdWJlSW1wbCguLi4pIHsKKyAqICAgICAuLi4uCisgKiAgICAgZHMgPSBuZXcgRGF0YVN0b3JlKCk7CisgKiAgIH0KKyAqCisgKiAgIC8vIGNvcHkgY29uc3RydWN0b3IKKyAqICAgcHJpdmF0ZSBUdWJlSW1wbChUdWJlSW1wbCB0aGF0LCBQaXBlQ2xvbmVyIGNsb25lcikgeworICogICAgIGNsb25lci5hZGQodGhhdCx0aGlzKTsKKyAqICAgICAuLi4KKyAqICAgICB0aGlzLmRzID0gdGhhdC5kczsKKyAqICAgfQorICoKKyAqICAgcHVibGljIFR1YmVJbXBsIGNvcHkoUGlwZUNsb25lciBwYykgeworICogICAgIHJldHVybiBuZXcgVHViZUltcGwodGhpcyxwYyk7CisgKiAgIH0KKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogTm90ZSB0aGF0IGFjY2VzcyB0byBzdWNoIHJlc291cmNlIG1heSBuZWVkIHRvIGJlIHN5bmNocm9uaXplZCwKKyAqIHNpbmNlIG11bHRpcGxlIGNvcGllcyBvZiBwaXBlbGluZXMgbWF5IGV4ZWN1dGUgY29uY3VycmVudGx5LgorICoKKyAqCisgKgorICogPGgzPlZNLXdpZGUgc3RhdGU8L2gzPgorICogPHA+CisgKiA8dHQ+c3RhdGljPC90dD4gaXMgYWx3YXlzIHRoZXJlIGZvciB5b3UgdG8gdXNlLgorICoKKyAqCisgKgorICogQHNlZSBBYnN0cmFjdFR1YmVJbXBsCisgKiBAc2VlIEFic3RyYWN0RmlsdGVyVHViZUltcGwKKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgaW50ZXJmYWNlIFR1YmUgeworICAgIC8qKgorICAgICAqIEFjdHMgb24gYSByZXF1ZXN0IGFuZCBwZXJmb3JtIHNvbWUgcHJvdG9jb2wgc3BlY2lmaWMgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogVE9ETzogZXhjZXB0aW9uIGhhbmRsaW5nIHNlbWFudGljcyBuZWVkIG1vcmUgZGlzY3Vzc2lvbgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICBPbiB0aGUgc2VydmVyIHNpZGUsIHRoaXMgc2lnbmFscyBhbiBlcnJvciBjb25kaXRpb24gd2hlcmUKKyAgICAgKiAgICAgIGEgZmF1bHQgcmVwbHkgaXMgaW4gb3JkZXIgKG9yIHRoZSBleGNlcHRpb24gZ2V0cyBlYXRlbiBieQorICAgICAqICAgICAgdGhlIHRvcC1tb3N0IHRyYW5zcG9ydCB7QGxpbmsgQWRhcHRlcn0gaWYgaXQncyBvbmUtd2F5LikKKyAgICAgKiAgICAgIFRoaXMgZnJlZXMgZWFjaCB7QGxpbmsgVHViZX0gZnJvbSB0cnkvY2F0Y2hpbmcgYQorICAgICAqICAgICAge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259IGluIGV2ZXJ5IGxheWVyLgorICAgICAqCisgICAgICogICAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgYWxzbyBhbGxvd2VkIHRvIHJldHVybgorICAgICAqICAgICAge0BsaW5rIE5leHRBY3Rpb24jcmV0dXJuV2l0aChQYWNrZXQpfSB3aXRoCisgICAgICogICAgICBhIHtAbGluayBQYWNrZXR9IHRoYXQgaGFzIGEgZmF1bHQgYXMgdGhlIHBheWxvYWQuCisgICAgICoKKyAgICAgKiAgICAgIDxwPgorICAgICAqICAgICAgT24gdGhlIGNsaWVudCBzaWRlLCB0aGUge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259IHRocm93bgorICAgICAqICAgICAgd2lsbCBiZSBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGNhbGxpbmcgY2xpZW50CisgICAgICogICAgICBhcHBsaWNhdGlvbnMuIChUaGUgY29uc2VxdWVuY2Ugb2YgdGhhdCBpcyB0aGF0IGlmIHlvdSBhcmUKKyAgICAgKiAgICAgIGEgZmlsdGVyaW5nIHtAbGluayBUdWJlfSwgeW91IG11c3Qgbm90IGVhdCB0aGUgZXhjZXB0aW9uCisgICAgICogICAgICB0aGF0IHdhcyBnaXZlbiB0byB7QGxpbmsgI3Byb2Nlc3NFeGNlcHRpb24oVGhyb3dhYmxlKX0gLgorICAgICAqCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICogICAgICBPdGhlciBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhpcyBtZXRob2QgbXVzdAorICAgICAqICAgICAgYmUgdHJlYXRlZCBhcyBhIGJ1ZyBpbiB0aGUgdHViZSBpbXBsZW1lbnRhdGlvbiwKKyAgICAgKiAgICAgIGFuZCB0aGVyZWZvcmUgc2hvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgaW50byBhIGZhdWx0LgorICAgICAqICAgICAgKE90aGVyd2lzZSBpdCBiZWNvbWVzIHZlcnkgZGlmZmljdWx0IHRvIGRlYnVnIGltcGxlbWVudGF0aW9uCisgICAgICogICAgICBwcm9ibGVtcy4pCisgICAgICoKKyAgICAgKiAgICAgIDxwPgorICAgICAqICAgICAgT24gdGhlIHNlcnZlciBzaWRlLCB0aGlzIGV4Y2VwdGlvbiBzaG91bGQgYmUgbW9zdCBsaWtlbHkKKyAgICAgKiAgICAgIGp1c3QgbG9nZ2VkLiBPbiB0aGUgY2xpZW50LXNpZGUgaXQgZ2V0cyBwcm9wYWdhdGVkIHRvIHRoZQorICAgICAqICAgICAgY2xpZW50IGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogICAgICA8cD4KKyAgICAgKiAgICAgIFRoZSBjb25zZXF1ZW5jZSBvZiB0aGlzIGlzIHRoYXQgaWYgYSBwaXBlIGNhbGxzCisgICAgICogICAgICBpbnRvIGFuIHVzZXIgYXBwbGljYXRpb24gKHN1Y2ggYXMge0BsaW5rIFNPQVBIYW5kbGVyfQorICAgICAqICAgICAgb3Ige0BsaW5rIExvZ2ljYWxIYW5kbGVyfSksIHdoZXJlIGEge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259CisgICAgICogICAgICBpcyAqbm90KiBhIGJ1ZyBpbiB0aGUgSkFYLVdTIGltcGxlbWVudGF0aW9uLCBpdCBtdXN0IGJlIGNhdGNoZWQKKyAgICAgKiAgICAgIGFuZCB3cmFwcGVkIGludG8gYSB7QGxpbmsgV2ViU2VydmljZUV4Y2VwdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqICAgICAgVGhlIHBhY2tldCB0aGF0IHJlcHJlc2VudHMgYSByZXF1ZXN0IG1lc3NhZ2UuCisgICAgICogICAgICBJZiB0aGUgcGFja2V0IGhhcyBhIG5vbi1udWxsIG1lc3NhZ2UsIGl0IG11c3QgYmUgYSB2YWxpZAorICAgICAqICAgICAgdW5jb25zdW1lZCB7QGxpbmsgTWVzc2FnZX0uIFRoaXMgbWVzc2FnZSByZXByZXNlbnRzIHRoZQorICAgICAqICAgICAgU09BUCBtZXNzYWdlIHRvIGJlIHNlbnQgYXMgYSByZXF1ZXN0LgorICAgICAqICAgICAgPHA+CisgICAgICogICAgICBUaGUgcGFja2V0IGlzIGFsc28gYWxsb3dlZCB0byBjYXJyeSBubyBtZXNzYWdlLCB3aGljaCBpbmRpY2F0ZXMKKyAgICAgKiAgICAgIHRoYXQgdGhpcyBpcyBhbiBvdXRwdXQtb25seSByZXF1ZXN0LgorICAgICAqICAgICAgKHRoYXQncyBjYWxsZWQgInNvbGljaXQiLCByaWdodD8gLSBLSykKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIEEge0BsaW5rIE5leHRBY3Rpb259IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG5leHQgYWN0aW9uCisgICAgICogICAgICB0byBiZSB0YWtlbiBieSB0aGUgSkFYLVdTIHJ1bnRpbWUuCisgICAgICovCisgICAgQE5vdE51bGwgTmV4dEFjdGlvbiBwcm9jZXNzUmVxdWVzdChATm90TnVsbCBQYWNrZXQgcmVxdWVzdCk7CisKKyAgICAvKioKKyAgICAgKiBBY3RzIG9uIGEgcmVzcG9uc2UgYW5kIHBlcmZvcm1zIHNvbWUgcHJvdG9jb2wgc3BlY2lmaWMgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogT25jZSBhIHtAbGluayAjcHJvY2Vzc1JlcXVlc3QoUGFja2V0KX0gaXMgaW52b2tlZCwgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIGJlIGFsd2F5cyBpbnZva2VkIHdpdGggdGhlIHJlc3BvbnNlLCBiZWZvcmUgdGhpcyB7QGxpbmsgVHViZX0KKyAgICAgKiBwcm9jZXNzZXMgYW5vdGhlciByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlCisgICAgICogICAgICBJZiB0aGUgcGFja2V0IGhhcyBhIG5vbi1udWxsIG1lc3NhZ2UsIGl0IG11c3QgYmUKKyAgICAgKiAgICAgIGEgdmFsaWQgdW5jb25zdW1lZCB7QGxpbmsgTWVzc2FnZX0uIFRoaXMgbWVzc2FnZSByZXByZXNlbnRzCisgICAgICogICAgICBhIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0IG1lc3NhZ2UgcGFzc2VkIHRvCisgICAgICogICAgICB7QGxpbmsgI3Byb2Nlc3NSZXF1ZXN0KFBhY2tldCl9IGVhcmxpZXIuCisgICAgICogICAgICA8cD4KKyAgICAgKiAgICAgIFRoZSBwYWNrZXQgaXMgYWxzbyBhbGxvd2VkIHRvIGNhcnJ5IG5vIG1lc3NhZ2UsIHdoaWNoIGluZGljYXRlcworICAgICAqICAgICAgdGhhdCB0aGVyZSB3YXMgbm8gcmVzcG9uc2UuIFRoaXMgaXMgdXNlZCBmb3IgdGhpbmdzIGxpa2UKKyAgICAgKiAgICAgIG9uZS13YXkgbWVzc2FnZSBhbmQvb3Igb25lLXdheSB0cmFuc3BvcnRzLgorICAgICAqCisgICAgICogVE9ETzogZXhjZXB0aW9uIGhhbmRsaW5nIHNlbWFudGljcyBuZWVkIG1vcmUgZGlzY3Vzc2lvbgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQSB7QGxpbmsgTmV4dEFjdGlvbn0gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV4dCBhY3Rpb24KKyAgICAgKiAgICAgIHRvIGJlIHRha2VuIGJ5IHRoZSBKQVgtV1MgcnVudGltZS4KKyAgICAgKi8KKyAgICBATm90TnVsbCBOZXh0QWN0aW9uIHByb2Nlc3NSZXNwb25zZShATm90TnVsbCBQYWNrZXQgcmVzcG9uc2UpOworCisKKyAgICAvKioKKyAgICAgKiBBY3RzIG9uIGEgZXhjZXB0aW9uIGFuZCBwZXJmb3JtcyBzb21lIGNsZWFuIHVwIG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHtAbGluayAjcHJvY2Vzc1JlcXVlc3QoUGFja2V0KX0sIHtAbGluayAjcHJvY2Vzc1Jlc3BvbnNlKFBhY2tldCl9LAorICAgICAqIHtAbGluayAjcHJvY2Vzc0V4Y2VwdGlvbihUaHJvd2FibGUpfSB0aHJvd3MgYW4gZXhjZXB0aW9uLCB0aGlzIG1ldGhvZAorICAgICAqIHdpbGwgYmUgYWx3YXlzIGludm9rZWQgb24gYWxsIHRoZSB7QGxpbmsgVHViZX1zIGluIHRoZSByZW1haW5pbmcKKyAgICAgKiB7QGxpbmsgTmV4dEFjdGlvbn1zLgorICAgICAqCisgICAgICogPHA+CisgICAgICogT24gdGhlIHNlcnZlciBzaWRlLCB0aGUge0BsaW5rIFRocm93YWJsZX0gdGhyb3duIHdpbGwgYmUgcHJvcGFnYXRlZCB0byB0aGUKKyAgICAgKiB0b3AtbW9zdCB0cmFuc3BvcnQuIFRoZSB0cmFuc3BvcnQgY29udmVydHMgdGhlIGV4Y2VwdGlvbiB0byBmYXVsdCByZXBseSBvcgorICAgICAqIHNpbXBseSBsb2dzIGluIGNhc2Ugb2Ygb25lLXdheSBNRVAuIElmIHlvdSBhcmUgYSBmaWx0ZXJpbmcge0BsaW5rIFR1YmV9IGxpa2UKKyAgICAgKiB7QGxpbmsgQWJzdHJhY3RUdWJlSW1wbH0sIHlvdSBkb24ndCBoYXZlIHRvIG92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbikuIE9uCisgICAgICogdGhlIG90aGVyIGhhbmQsIGFueSBpbnRlcm1lZGlhdGUge0BsaW5rIFR1YmV9IG1heSB3YW50IHRvIGNvbnZlcnQgdGhlIGV4Y2VwdGlvbgorICAgICAqIHRvIGEgZmF1bHQgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9uIHRoZSBjbGllbnQgc2lkZSwgdGhlIHtAbGluayBUaHJvd2FibGV9IHRocm93bgorICAgICAqIHdpbGwgYmUgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBjYWxsaW5nIGNsaWVudAorICAgICAqIGFwcGxpY2F0aW9ucy4gKFRoZSBjb25zZXF1ZW5jZSBvZiB0aGF0IGlzIHRoYXQgaWYgeW91IGFyZQorICAgICAqIGEgZmlsdGVyaW5nIHtAbGluayBUdWJlfSBsaWtlIHtAbGluayBBYnN0cmFjdFR1YmVJbXBsfSwgeW91IGRvbid0IGhhdmUgdG8KKyAgICAgKiBvdmVycmlkZSB0aGUgaW1wbGVtZW50YXRpb24pCisgICAgICoKKyAgICAgKiBAcGFyYW0gdAorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgQSB7QGxpbmsgTmV4dEFjdGlvbn0gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV4dCBhY3Rpb24KKyAgICAgKiAgICAgIHRvIGJlIHRha2VuIGJ5IHRoZSBKQVgtV1MgcnVudGltZS4KKyAgICAgKi8KKyAgICBATm90TnVsbCBOZXh0QWN0aW9uIHByb2Nlc3NFeGNlcHRpb24oQE5vdE51bGwgVGhyb3dhYmxlIHQpOworCisgICAgLyoqCisgICAgICogSW52b2tlZCBiZWZvcmUgdGhlIGxhc3QgY29weSBvZiB0aGUgcGlwZWxpbmUgaXMgYWJvdXQgdG8gYmUgZGlzY2FyZGVkLAorICAgICAqIHRvIGdpdmUge0BsaW5rIFR1YmV9cyBhIGNoYW5jZSB0byBjbGVhbiB1cCBhbnkgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBpbnZva2Uge0BsaW5rIFByZURlc3Ryb3l9IGxpZmVjeWNsZSBtZXRob2RzCisgICAgICogb24gdXNlciBoYW5kbGVyLiBUaGUgaW52b2NhdGlvbiBvZiBpdCBpcyBvcHRpb25hbCBvbiB0aGUgY2xpZW50IHNpZGUsCisgICAgICogYnV0IG1hbmRhdG9yeSBvbiB0aGUgc2VydmVyIHNpZGUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIG11bHRpcGxlIGNvcGllcyBvZiBwaXBlbGluZXMgYXJlIGNyZWF0ZWQsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqIG9ubHkgb24gb25lIG9mIHRoZW0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIHRoZSBjbGVhbiB1cCBmYWlscywge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259IGNhbiBiZSB0aHJvd24uCisgICAgICogICAgICBUaGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8gdXNlcnMgKGlmIHRoaXMgaXMgY2xpZW50KSwKKyAgICAgKiAgICAgIG9yIHJlY29yZGVkIChpZiB0aGlzIGlzIHNlcnZlci4pCisgICAgICovCisgICAgdm9pZCBwcmVEZXN0cm95KCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGlkZW50aWNhbCBjbG9uZSBvZiB0aGlzIHtAbGluayBUdWJlfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gaWRlbnRpY2FsIHBpcGVsaW5lIHRoYXQgY2FuIGJlIHVzZWQKKyAgICAgKiBjb25jdXJyZW50bHkgd2l0aCB0aGlzIHBpcGVsaW5lLiBXaGVuIHRoZSBjYWxsZXIgb2YgYSBwaXBlbGluZQorICAgICAqIGlzIG11bHRpLXRocmVhZGVkIGFuZCBuZWVkIGNvbmN1cnJlbnQgdXNlIG9mIHRoZSBzYW1lIHBpcGVsaW5lLAorICAgICAqIGl0IGNhbiBkbyBzbyBieSBjcmVhdGluZyBjb3BpZXMgdGhyb3VnaCB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxoMz5JbXBsZW1lbnRhdGlvbiBOb3RlPC9oMz4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyB0aGUgaW1wbGVtZW50YXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBjYWxsCisgICAgICoge0BsaW5rIFR1YmVDbG9uZXIjYWRkKFR1YmUsVHViZSl9IHRvIHJlZ2lzdGVyIHRoZSBjb3BpZWQgcGlwZQorICAgICAqIHdpdGggdGhlIG9yaWdpbmFsLiBUaGlzIGlzIHJlcXVpcmVkIGJlZm9yZSB5b3Ugc3RhcnQgY29weWluZworICAgICAqIHRoZSBvdGhlciB7QGxpbmsgVHViZX0gcmVmZXJlbmNlcyB5b3UgaGF2ZSwgb3IgZWxzZSB0aGVyZSdzIGEKKyAgICAgKiByaXNrIG9mIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgbW9zdCB7QGxpbmsgVHViZX0gaW1wbGVtZW50YXRpb25zIHRoYXQgZGVsZWdhdGUgdG8gYW5vdGhlcgorICAgICAqIHtAbGluayBUdWJlfSwgdGhpcyBtZXRob2QgcmVxdWlyZXMgdGhhdCB5b3UgYWxzbyBjb3B5IHRoZSB7QGxpbmsgVHViZX0KKyAgICAgKiB0aGF0IHlvdSBkZWxlZ2F0ZSB0by4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgbGltaXRlZCBudW1iZXIgb2Yge0BsaW5rIFR1YmV9cyB0aGF0IGRvIG5vdCBtYWludGFpbiBhbnkKKyAgICAgKiB0aHJlYWQgdW5zYWZlIHJlc291cmNlLCBpdCBpcyBhbGxvd2VkIHRvIHNpbXBseSByZXR1cm4gPHR0PnRoaXM8L3R0PgorICAgICAqIGZyb20gdGhpcyBtZXRob2QgKG5vdGljZSB0aGF0IGV2ZW4gaWYgeW91IGFyZSBzdGF0ZWxlc3MsIGlmIHlvdQorICAgICAqIGdvdCBhIGRlbGVnYXRpbmcge0BsaW5rIFR1YmV9IGFuZCB0aGF0IG9uZSBpc24ndCBzdGF0ZWxlc3MsIHlvdQorICAgICAqIHN0aWxsIGhhdmUgdG8gY29weSB5b3Vyc2VsZi4pCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWlnaHQgYmUgaW52b2tlZCBieSBvbmUgdGhyZWFkIHdoaWxlIGFub3RoZXIKKyAgICAgKiB0aHJlYWQgaXMgZXhlY3V0aW5nIHRoZSBvdGhlciBwcm9jZXNzIG1ldGhvZC4gU2VlCisgICAgICogdGhlIHtAbGluayBDb2RlYyNjb3B5KCl9IGZvciBtb3JlIGRpc2N1c3Npb24gYWJvdXQgdGhpcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbG9uZXIKKyAgICAgKiAgICAgIFVzZSB0aGlzIG9iamVjdCAoaW4gcGFydGljdWxhciBpdHMge0BsaW5rIFR1YmVDbG9uZXIjY29weShUdWJlKX0gbWV0aG9kCisgICAgICogICAgICB0byBjbG9uZSBvdGhlciBwaXBlIHJlZmVyZW5jZXMgeW91IGhhdmUKKyAgICAgKiAgICAgIGluIHlvdXIgcGlwZS4gU2VlIHtAbGluayBUdWJlQ2xvbmVyfSBmb3IgbW9yZSBkaXNjdXNzaW9uCisgICAgICogICAgICBhYm91dCB3aHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgbm9uLW51bGwge0BsaW5rIFR1YmV9LgorICAgICAqIEBwYXJhbSBjbG9uZXIKKyAgICAgKi8KKyAgICBUdWJlIGNvcHkoVHViZUNsb25lciBjbG9uZXIpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvVHViZUNsb25lci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvVHViZUNsb25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNGQyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9UdWJlQ2xvbmVyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQ2xvbmVzIHRoZSB3aG9sZSBwaXBlbGluZS4KKyAqCisgKiA8cD4KKyAqIFNpbmNlIHtAbGluayBUdWJlfXMgbWF5IGZvcm0gYW4gYXJiaXRyYXJ5IGRpcmVjdGVkIGdyYXBoLCBzb21lb25lIG5lZWRzCisgKiB0byBrZWVwIHRyYWNrIG9mIGlzb21vcnBoaXNtIGZvciBhIGNsb25lIHRvIGhhcHBlbiBjb3JyZWN0bHkuIFRoaXMgY2xhc3MKKyAqIHNlcnZlcyB0aGF0IHJvbGUuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgVHViZUNsb25lciB7CisgICAgLy8gUGlwZSB0byBwaXBlLCBvciB0dWJlIHRvIHR1YmUKKyAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPE9iamVjdCxPYmplY3Q+IG1hc3RlcjJjb3B5ID0gbmV3IEhhc2hNYXA8T2JqZWN0LE9iamVjdD4oKTsKKworICAgIC8qcGFja2FnZSovIFR1YmVDbG9uZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlZCBieSBhIGNsaWVudCBvZiBhIHR1YmUgdG8gY2xvbmUgdGhlIHdob2xlIHBpcGVsaW5lLgorICAgICAqCisgICAgICogPHA+CisgICAgICoge0BsaW5rIFR1YmV9cyBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBUdWJlI2NvcHkoVHViZUNsb25lcil9IG1ldGhvZAorICAgICAqIHNoYWxsIHVzZSB7QGxpbmsgI2NvcHkoVHViZSl9IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICBUaGUgZW50cnkgcG9pbnQgb2YgYSBwaXBlbGluZSB0byBiZSBjb3BpZWQuIG11c3Qgbm90IGJlIG51bGwuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgVGhlIGNsb25lZCBwaXBlbGluZS4gQWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHViZSBjbG9uZShUdWJlIHApIHsKKyAgICAgICAgLy8gd2Ugb2Z0ZW4gd2FudCB0byBkb3duY2FzdCBUdWJlQ2xvbmVyIHRvIFBpcGVDbG9uZXIsCisgICAgICAgIC8vIHNvIGxldCdzIGNyZWF0ZSBQaXBlQ2xvbmVyIHRvIG1ha2UgdGhhdCBwb3NzaWJsZQorICAgICAgICByZXR1cm4gbmV3IFBpcGVDbG9uZXIoKS5jb3B5KHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZWQgYnkgYSB7QGxpbmsgVHViZSNjb3B5KFR1YmVDbG9uZXIpfSBpbXBsZW1lbnRhdGlvbgorICAgICAqIHRvIGNvcHkgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBwaXBlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgZm9yIHtAbGluayBUdWJlfSBpbXBsZW1lbnRhdGlvbnMsIG5vdCBmb3IgdXNlcnMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZ2l2ZW4gdHViZSBpcyBhbHJlYWR5IGNvcGllZCBmb3IgdGhpcyBjbG9uaW5nIGVwaXNvZGUsCisgICAgICogdGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhhdCByZWZlcmVuY2UuIE90aGVyd2lzZSBpdCBjb3BpZXMKKyAgICAgKiBhIHR1YmUsIG1ha2UgYSBub3RlLCBhbmQgcmV0dXJucyBhIGNvcGllZCB0dWJlLiBUaGlzIGFkZGl0aW9uYWwKKyAgICAgKiBzdGVwIGVuc3VyZXMgdGhhdCBhIGdyYXBoIGlzIGNsb25lZCBpc29tb3JwaGljYWxseSBjb3JyZWN0bHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiAoVGhpbmsgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gYSBncmFwaCBpcyBBLT5CLCBBLT5DLCBCLT5ELCBhbmQgQy0+RAorICAgICAqIGlmIHlvdSBkb24ndCBoYXZlIHRoaXMgc3RlcC4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgVGhlIHR1YmUgdG8gYmUgY29waWVkLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSBjbG9uZWQgdHViZS4gQWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIFR1YmU+IFQgY29weShUIHQpIHsKKyAgICAgICAgVHViZSByID0gKFR1YmUpbWFzdGVyMmNvcHkuZ2V0KHQpOworICAgICAgICBpZihyPT1udWxsKSB7CisgICAgICAgICAgICByID0gdC5jb3B5KHRoaXMpOworICAgICAgICAgICAgLy8gdGhlIHBpcGUgbXVzdCBwdXRzIGl0cyBjb3B5IHRvIHRoZSBtYXAgYnkgaXRzZWxmCisgICAgICAgICAgICBhc3NlcnQgbWFzdGVyMmNvcHkuZ2V0KHQpPT1yIDogInRoZSB0dWJlIG11c3QgY2FsbCB0aGUgYWRkKC4uLikgbWV0aG9kIHRvIHJlZ2lzdGVyIGl0c2VsZiBiZWZvcmUgc3RhcnQgY29weWluZyBvdGhlciBwaXBlcywgYnV0ICIrdCArIiBoYXNuJ3QgZG9uZSBzbyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChUKXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGNvcHkgY29uc3RydWN0b3IKKyAgICAgKiB0byBub3RpZnkgdGhhdCB0aGUgY29weSB3YXMgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoZW4geW91ciBwaXBlIGhhcyByZWZlcmVuY2VzIHRvIG90aGVyIHBpcGVzLAorICAgICAqIGl0J3MgcGFydGljdWxhcmx5IGltcG9ydGFudCB0byBjYWxsIHRoaXMgbWV0aG9kCisgICAgICogYmVmb3JlIHlvdSBzdGFydCBjb3B5aW5nIHRoZSBwaXBlcyB5b3UgcmVmZXIgdG8sCisgICAgICogb3IgZWxzZSB0aGVyZSdzIGEgY2hhbmNlIG9mIGluaWZpbml0ZSBsb29wLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChUdWJlIG9yaWdpbmFsLCBUdWJlIGNvcHkpIHsKKyAgICAgICAgYXNzZXJ0ICFtYXN0ZXIyY29weS5jb250YWluc0tleShvcmlnaW5hbCk7CisgICAgICAgIGFzc2VydCBvcmlnaW5hbCE9bnVsbCAmJiBjb3B5IT1udWxsOworICAgICAgICBtYXN0ZXIyY29weS5wdXQob3JpZ2luYWwsY29weSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvVHViZWxpbmVBc3NlbWJsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1R1YmVsaW5lQXNzZW1ibGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1YzI0NQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1R1YmVsaW5lQXNzZW1ibGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CisKKy8qKgorICogQ3JlYXRlcyBhIHR1YmVsaW5lLgorICoKKyAqIDxwPgorICogVGhpcyBwbHVnZ2FiaWxpdHkgbGF5ZXIgZW5hYmxlcyB0aGUgdXBwZXIgbGF5ZXIgdG8KKyAqIGNvbnRyb2wgZXhhY3RseSBob3cgdGhlIHR1YmVsaW5lIGlzIGNvbXBvc2VkLgorICoKKyAqIDxwPgorICogSkFYLVdTIGlzIGdvaW5nIHRvIGhhdmUgaXRzIG93biBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgKiB3aGVuIHVzZWQgYWxsIGJ5IGl0c2VsZiwgYnV0IGl0IGNhbiBiZSBzdWJzdGl0dXRlZCBieQorICogb3RoZXIgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIDxwPgorICogU2VlIHtAbGluayBUdWJlbGluZUFzc2VtYmxlckZhY3Rvcnl9IGZvciBob3cge0BsaW5rIFR1YmVsaW5lQXNzZW1ibGVyfXMKKyAqIGFyZSBsb2NhdGVkLgorICoKKyAqCisgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0CisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGludGVyZmFjZSBUdWJlbGluZUFzc2VtYmxlciB7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB0dWJlbGluZSBmb3IgY2xpZW50cy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoZW4gYSBKQVgtV1MgY2xpZW50IGNyZWF0ZXMgYSBwcm94eSBvciBhIHtAbGluayBqYXZheC54bWwud3MuRGlzcGF0Y2h9IGZyb20KKyAgICAgKiBhIHtAbGluayBqYXZheC54bWwud3MuU2VydmljZX0sIEpBWC1XUyBydW50aW1lIGludGVybmFsbHkgdXNlcyB0aGlzIG1ldGhvZAorICAgICAqIHRvIGNyZWF0ZSBhIG5ldyB0dWJlbGluZSBhcyBhIHBhcnQgb2YgdGhlIGluaXRpbGl6YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgT2JqZWN0IHRoYXQgY2FwdHVyZXMgdmFyaW91cyBjb250ZXh0dWFsIGluZm9ybWF0aW9uCisgICAgICogICAgICB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdHViZWxpbmUgdG8gYmUgYXNzZW1ibGVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbm9uLW51bGwgZnJlc2hseSBjcmVhdGVkIHR1YmVsaW5lLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhlcmUncyBhbnkgY29uZmlndXJhdGlvbiBlcnJvciB0aGF0IHByZXZlbnRzIHRoZQorICAgICAqICAgICAgdHViZWxpbmUgZnJvbSBiZWluZyBjb25zdHJ1Y3RlZC4gVGhpcyBleGNlcHRpb24gd2lsbCBiZQorICAgICAqICAgICAgcHJvcGFnYXRlZCBpbnRvIHRoZSBhcHBsaWNhdGlvbiwgc28gaXQgbXVzdCBoYXZlCisgICAgICogICAgICBhIGRlc2NyaXB0aXZlIGVycm9yLgorICAgICAqLworICAgIEBOb3ROdWxsIFR1YmUgY3JlYXRlQ2xpZW50KEBOb3ROdWxsIENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0IGNvbnRleHQpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB0dWJlbGluZSBmb3Igc2VydmVycy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoZW4gYSBKQVgtV1Mgc2VydmVyIGRlcGxveXMgYSBuZXcgZW5kcG9pbnQsIGl0IGludGVybmFsbHkKKyAgICAgKiB1c2VzIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyB0dWJlbGluZSBhcyBhIHBhcnQgb2YgdGhlCisgICAgICogaW5pdGlhbGl6YXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9ubHkgb25jZSB0byBzZXQgdXAgYQorICAgICAqICdtYXN0ZXIgdHViZWxpbmUnLCBhbmQgaXQgZ2V0cyB7QGxpbmsgVHViZSNjb3B5KFR1YmVDbG9uZXIpIGNvcGllZH0KKyAgICAgKiBmcm9tIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgIE9iamVjdCB0aGF0IGNhcHR1cmVzIHZhcmlvdXMgY29udGV4dHVhbCBpbmZvcm1hdGlvbgorICAgICAqICAgICAgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHR1YmVsaW5lIHRvIGJlIGFzc2VtYmxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG5vbi1udWxsIGZyZXNobHkgY3JlYXRlZCB0dWJlbGluZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHRoZXJlJ3MgYW55IGNvbmZpZ3VyYXRpb24gZXJyb3IgdGhhdCBwcmV2ZW50cyB0aGUKKyAgICAgKiAgICAgIHR1YmVsaW5lIGZyb20gYmVpbmcgY29uc3RydWN0ZWQuIFRoaXMgZXhjZXB0aW9uIHdpbGwgYmUKKyAgICAgKiAgICAgIHByb3BhZ2F0ZWQgaW50byB0aGUgY29udGFpbmVyLCBzbyBpdCBtdXN0IGhhdmUKKyAgICAgKiAgICAgIGEgZGVzY3JpcHRpdmUgZXJyb3IuCisgICAgICoKKyAgICAgKi8KKyAgICBATm90TnVsbCBUdWJlIGNyZWF0ZVNlcnZlcihATm90TnVsbCBTZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dCBjb250ZXh0KTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1R1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmMjY3OAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL1R1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGU7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuaGVscGVyLlBpcGVBZGFwdGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQ29udGFpbmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUZpbmRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnBpcGUuU3RhbmRhbG9uZVR1YmVBc3NlbWJsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQ3JlYXRlcyB7QGxpbmsgVHViZWxpbmVBc3NlbWJsZXJ9LgorICogPHAvPgorICogPHAvPgorICogVG8gY3JlYXRlIGEgdHViZWxpbmUsCisgKiB0aGUgSkFYLVdTIHJ1bnRpbWUgbG9jYXRlcyB7QGxpbmsgVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5fXMgdGhyb3VnaAorICogdGhlIDx0dD5NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlckZhY3Rvcnk8L3R0PiBmaWxlcy4KKyAqIEZhY3RvcmllcyBmb3VuZCBhcmUgY2hlY2tlZCB0byBzZWUgaWYgaXQgc3VwcG9ydHMgdGhlIGdpdmVuIGJpbmRpbmcgSUQgb25lIGJ5IG9uZSwKKyAqIGFuZCB0aGUgZmlyc3QgdmFsaWQge0BsaW5rIFR1YmVsaW5lQXNzZW1ibGVyfSByZXR1cm5lZCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlCisgKiBhIHR1YmVsaW5lLgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVHViZWxpbmVBc3NlbWJsZXJ9IGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiBiaW5kaW5nIElELgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmdJZCBUaGUgYmluZGluZyBJRCBmb3Igd2hpY2ggYSB0dWJlbGluZSB3aWxsIGJlIGNyZWF0ZWQsCisgICAgICogICAgICAgICAgICAgICAgICBzdWNoIGFzIHtAbGluayBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZyNTT0FQMTFIVFRQX0JJTkRJTkd9LgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBmYWN0b3J5IGRvZXNuJ3QgcmVjb2duaXplIHRoZSBnaXZlbiBiaW5kaW5nIElELgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBUdWJlbGluZUFzc2VtYmxlciBkb0NyZWF0ZShCaW5kaW5nSUQgYmluZGluZ0lkKTsKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNjcmVhdGUoQ2xhc3NMb2FkZXIsIEJpbmRpbmdJRCwgQ29udGFpbmVyKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFR1YmVsaW5lQXNzZW1ibGVyIGNyZWF0ZShDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgQmluZGluZ0lEIGJpbmRpbmdJZCkgeworICAgICAgICByZXR1cm4gY3JlYXRlKGNsYXNzTG9hZGVyLGJpbmRpbmdJZCxudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIHtAbGluayBUdWJlbGluZUFzc2VtYmxlckZhY3Rvcnl9cyBhbmQgY3JlYXRlCisgICAgICogYSBzdWl0YWJsZSB7QGxpbmsgVHViZWxpbmVBc3NlbWJsZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmdJZCBUaGUgYmluZGluZyBJRCBzdHJpbmcgZm9yIHdoaWNoIHRoZSBuZXcge0BsaW5rIFR1YmVsaW5lQXNzZW1ibGVyfQorICAgICAqICAgICAgICAgICAgICAgICAgaXMgY3JlYXRlZC4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gY29udGFpbmVyCisgICAgICogICAgICBpZiBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gc3BlY2lmeSBhIHtAbGluayBUdWJlbGluZUFzc2VtYmxlcn0KKyAgICAgKiAgICAgIGluc3RhbmNlLiBUaGlzIHBhcmFtZXRlciBzaG91bGQgYmUgYWx3YXlzIGdpdmVuIG9uIHRoZSBzZXJ2ZXIsIGJ1dCBjYW4gYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIEFsd2F5cyBub24tbnVsbCwgc2luY2Ugd2UgZmFsbCBiYWNrIHRvIG91ciBkZWZhdWx0IHtAbGluayBUdWJlbGluZUFzc2VtYmxlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUdWJlbGluZUFzc2VtYmxlciBjcmVhdGUoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIEJpbmRpbmdJRCBiaW5kaW5nSWQsIEBOdWxsYWJsZSBDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgaWYoY29udGFpbmVyIT1udWxsKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBhbGxvdyB0aGUgY29udGFpbmVyIHRvIGNvbnRyb2wgcGlwZWxpbmUgZm9yIGluZGl2aWR1YWwgZW5kcG9pbnQuCisgICAgICAgICAgICBUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkgdGFmID0gY29udGFpbmVyLmdldFNQSShUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkuY2xhc3MpOworICAgICAgICAgICAgaWYodGFmIT1udWxsKSB7CisgICAgICAgICAgICAgICAgVHViZWxpbmVBc3NlbWJsZXIgYSA9IHRhZi5kb0NyZWF0ZShiaW5kaW5nSWQpOworICAgICAgICAgICAgICAgIGlmKGEhPW51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkgZmFjdG9yeSA6IFNlcnZpY2VGaW5kZXIuZmluZChUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkuY2xhc3MsIGNsYXNzTG9hZGVyKSkgeworICAgICAgICAgICAgVHViZWxpbmVBc3NlbWJsZXIgYXNzZW1ibGVyID0gZmFjdG9yeS5kb0NyZWF0ZShiaW5kaW5nSWQpOworICAgICAgICAgICAgaWYgKGFzc2VtYmxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5LmxvZ2dlci5maW5lKGZhY3RvcnkuZ2V0Q2xhc3MoKSArICIgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgIiArIGFzc2VtYmxlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzc2VtYmxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIFBpcGVsaW5lQXNzZW1ibGVyIG91dCB0aGVyZSBhbmQgdXNlIGl0IGZvciBjb21wYXRpYmlsaXR5LgorICAgICAgICBmb3IgKFBpcGVsaW5lQXNzZW1ibGVyRmFjdG9yeSBmYWN0b3J5IDogU2VydmljZUZpbmRlci5maW5kKFBpcGVsaW5lQXNzZW1ibGVyRmFjdG9yeS5jbGFzcyxjbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgIFBpcGVsaW5lQXNzZW1ibGVyIGFzc2VtYmxlciA9IGZhY3RvcnkuZG9DcmVhdGUoYmluZGluZ0lkKTsKKyAgICAgICAgICAgIGlmKGFzc2VtYmxlciE9bnVsbCkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKGZhY3RvcnkuZ2V0Q2xhc3MoKSsiIHN1Y2Nlc3NmdWxseSBjcmVhdGVkICIrYXNzZW1ibGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1YmVsaW5lQXNzZW1ibGVyQWRhcHRlcihhc3NlbWJsZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZGVmYXVsdCBiaW5kaW5nIElEcyB0aGF0IGFyZSBrbm93bgorICAgICAgICByZXR1cm4gbmV3IFN0YW5kYWxvbmVUdWJlQXNzZW1ibGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHViZWxpbmVBc3NlbWJsZXJBZGFwdGVyIGltcGxlbWVudHMgVHViZWxpbmVBc3NlbWJsZXIgeworICAgICAgICBwcml2YXRlIFBpcGVsaW5lQXNzZW1ibGVyIGFzc2VtYmxlcjsKKworICAgICAgICBUdWJlbGluZUFzc2VtYmxlckFkYXB0ZXIoUGlwZWxpbmVBc3NlbWJsZXIgYXNzZW1ibGVyKSB7CisgICAgICAgICAgICB0aGlzLmFzc2VtYmxlciA9IGFzc2VtYmxlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBATm90TnVsbCBUdWJlIGNyZWF0ZUNsaWVudChATm90TnVsbCBDbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBDbGllbnRQaXBlQXNzZW1ibGVyQ29udGV4dCBjdHh0ID0gbmV3IENsaWVudFBpcGVBc3NlbWJsZXJDb250ZXh0KAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEFkZHJlc3MoKSwgY29udGV4dC5nZXRXc2RsTW9kZWwoKSwgY29udGV4dC5nZXRTZXJ2aWNlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0QmluZGluZygpLCBjb250ZXh0LmdldENvbnRhaW5lcigpKTsKKyAgICAgICAgICAgIHJldHVybiBQaXBlQWRhcHRlci5hZGFwdChhc3NlbWJsZXIuY3JlYXRlQ2xpZW50KGN0eHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBATm90TnVsbCBUdWJlIGNyZWF0ZVNlcnZlcihATm90TnVsbCBTZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gUGlwZUFkYXB0ZXIuYWRhcHQoYXNzZW1ibGVyLmNyZWF0ZVNlcnZlcigoU2VydmVyUGlwZUFzc2VtYmxlckNvbnRleHQpIGNvbnRleHQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFR1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvaGVscGVyL0Fic3RyYWN0RmlsdGVyUGlwZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL2hlbHBlci9BYnN0cmFjdEZpbHRlclBpcGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhOWY3YQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL2hlbHBlci9BYnN0cmFjdEZpbHRlclBpcGVJbXBsLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGVDbG9uZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBpcGV9IHRoYXQgaXMgdXNlZCBhcyBhIGZpbHRlci4KKyAqCisgKiA8cD4KKyAqIEEgZmlsdGVyIHBpcGUgd29ya3Mgb24gYSB7QGxpbmsgUGFja2V0fSwgdGhlbiBwYXNzIGl0IG9udG8gdGhlIG5leHQgcGlwZS4KKyAqCisgKgorICogPGgyPkhvdyBkbyBJIGltcGxlbWVudCBhIGZpbHRlcj88L2gyPgorICogPHA+CisgKiBGaWx0ZXIge0BsaW5rIFBpcGV9cyBhcmUgaWRlYWwgZm9yIHRob3NlIGNvbXBvbmVudHMgdGhhdCB3aXNoIHRvCisgKiBkbyBzb21lIG9mIHRoZSBmb2xsb3dpbmdzOgorICoKKyAqIDxkbD4KKyAqIDxkdD48Yj4KKyAqIFRvIHJlYWQgYW4gaW5jb21pbmcgbWVzc2FnZSBhbmQgcGVyZm9ybSBzb21lIHdvcmsgYmVmb3JlIHRoZQorICogYXBwbGljYXRpb24gKG9yIG1vcmUgcHJlY2lzZWx5IHRoZSBuZXh0IHBpcGUgc2VlcyBpdCkKKyAqIDwvYj4KKyAqIDxkZD4KKyAqIEltcGxlbWVudCB0aGUge0BsaW5rICNwcm9jZXNzfSBtZXRob2QgYW5kIGRvIHNvbWUgcHJvY2Vzc2luZyBiZWZvcmUKKyAqIHlvdSBwYXNzIHRoZSBwYWNrZXQgdG8gdGhlIG5leHQgcGlwZToKKyAqIDxwcmU+CisgKiBwcm9jZXNzKHJlcXVlc3QpIHsKKyAqICAgZG9Tb21ldGhpbmdXaXRoKHJlcXVlc3QpOworICogICByZXR1cm4gbmV4dC5wcm9jZXNzKHJlcXVlc3QpOworICogfQorICogPC9wcmU+CisgKgorICoKKyAqIDxkdD48Yj4KKyAqIFRvIGludGVyY2VwdCBhbiBpbmNvbWluZyBtZXNzYWdlIGFuZCBwcmV2ZW50IHRoZSBuZXh0IHBpcGUgZnJvbSBzZWVpbmcgaXQuCisgKiA8L2I+CisgKiA8ZGQ+CisgKiBJbXBsZW1lbnQgdGhlIHtAbGluayAjcHJvY2Vzc30gbWV0aG9kIGFuZCBkbyBzb21lIHByb2Nlc3NpbmcsCisgKiB0aGVuIGRvIE5PVCBwYXNzIHRoZSByZXF1ZXN0IG9udG8gdGhlIG5leHQgcGlwZS4KKyAqIDxwcmU+CisgKiBwcm9jZXNzKHJlcXVlc3QpIHsKKyAqICAgaWYoaXNTb21ldGhpbmdXcm9uZ1dpdGgocmVxdWVzdCkpCisgKiAgICAgcmV0dXJuIGNyZWF0ZUVycm9yTWVzc2FnZSgpOworICogICBlbHNlCisgKiAgICAgcmV0dXJuIG5leHQucHJvY2VzKHJlcXVlc3QpOworICogfQorICogPC9wcmU+CisgKgorICogPGR0PjxiPgorICogVG8gcG9zdCBwcm9jZXNzIGEgcmVwbHkgYW5kIHBvc3NpYmx5IG1vZGlmeSBhIG1lc3NhZ2U6CisgKiA8L2I+CisgKiA8ZGQ+CisgKiBJbXBsZW1lbnQgdGhlIHtAbGluayAjcHJvY2Vzc30gbWV0aG9kIGFuZCBkbyBzb21lIHByb2Nlc3NpbmcsCisgKiB0aGVuIGRvIE5PVCBwYXNzIHRoZSByZXF1ZXN0IG9udG8gdGhlIG5leHQgcGlwZS4KKyAqIDxwcmU+CisgKiBwcm9jZXNzKHJlcXVlc3QpIHsKKyAqICAgb3AgPSByZXF1ZXN0LmdldE1lc3NhZ2UoKS5nZXRPcGVyYXRpb24oKTsKKyAqICAgcmVwbHkgPSBuZXh0LnByb2NlcyhyZXF1ZXN0KTsKKyAqICAgaWYob3AgaXMgc29tZXRoaW5nIEkgY2FyZSkgeworICogICAgIHJlcGx5ID0gcGxheVdpdGgocmVwbHkpOworICogICB9CisgKiAgIHJldHVybiByZXBseTsKKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIDwvZGw+CisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGaWx0ZXJQaXBlSW1wbCBleHRlbmRzIEFic3RyYWN0UGlwZUltcGwgeworICAgIC8qKgorICAgICAqIE5leHQgcGlwZSB0byBjYWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBQaXBlIG5leHQ7CisKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWx0ZXJQaXBlSW1wbChQaXBlIG5leHQpIHsKKyAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgYXNzZXJ0IG5leHQhPW51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsdGVyUGlwZUltcGwoQWJzdHJhY3RGaWx0ZXJQaXBlSW1wbCB0aGF0LCBQaXBlQ2xvbmVyIGNsb25lcikgeworICAgICAgICBzdXBlcih0aGF0LCBjbG9uZXIpOworICAgICAgICB0aGlzLm5leHQgPSBjbG9uZXIuY29weSh0aGF0Lm5leHQpOworICAgICAgICBhc3NlcnQgbmV4dCE9bnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFja2V0IHByb2Nlc3MoUGFja2V0IHBhY2tldCkgeworICAgICAgICByZXR1cm4gbmV4dC5wcm9jZXNzKHBhY2tldCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgbmV4dC5wcmVEZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvaGVscGVyL0Fic3RyYWN0RmlsdGVyVHViZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL2hlbHBlci9BYnN0cmFjdEZpbHRlclR1YmVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4ZWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL2hlbHBlci9BYnN0cmFjdEZpbHRlclR1YmVJbXBsLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLk5leHRBY3Rpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlQ2xvbmVyOworCisvKioKKyAqIENvbnZlbmllbnQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgZmlsdGVyaW5nIHtAbGluayBUdWJlfS4KKyAqCisgKiA8cD4KKyAqIEluIHRoaXMgcHJvdG90eXBlLCB0aGlzIGlzIG5vdCB0aGF0IGNvbnZlbmllbnQsIGJ1dCBpbiB0aGUgcmVhbCBwcm9kdWN0aW9uCisgKiBjb2RlIHdoZXJlIHdlIGhhdmUge0Bjb2RlIHByZURlc3Ryb3koKX0gYW5kIHtAY29kZSBjbG9uZSgpfSwgdGhpcworICogaXMgZmFpcmx5IGhhbmR5LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RmlsdGVyVHViZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFR1YmVJbXBsIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVHViZSBuZXh0OworCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsdGVyVHViZUltcGwoVHViZSBuZXh0KSB7CisgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsdGVyVHViZUltcGwoQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbCB0aGF0LCBUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICBzdXBlcih0aGF0LCBjbG9uZXIpOworICAgICAgICB0aGlzLm5leHQgPSBjbG9uZXIuY29weSh0aGF0Lm5leHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgbm8tb3AgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIGRvSW52b2tlKG5leHQscmVxdWVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBuby1vcCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgTmV4dEFjdGlvbiBwcm9jZXNzUmVzcG9uc2UoUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybiBkb1JldHVybldpdGgocmVzcG9uc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgbm8tb3AgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc0V4Y2VwdGlvbihUaHJvd2FibGUgdCkgeworICAgICAgICByZXR1cm4gZG9UaHJvdyh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBuZXh0LnByZURlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9oZWxwZXIvQWJzdHJhY3RQaXBlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvaGVscGVyL0Fic3RyYWN0UGlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWJiYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvaGVscGVyL0Fic3RyYWN0UGlwZUltcGwuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuaGVscGVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuUGlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlQ2xvbmVyOworCisvKioKKyAqIFBhcnRpYWwgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGlwZX0uCisgKgorICogPHA+CisgKiBUbyBiZSBzaGllbGRlZCBmcm9tIHBvdGVudGFpbCBjaGFuZ2VzIGluIEpBWC1XUywKKyAqIHBsZWFzZSBjb25zaWRlciBleHRlbmRpbmcgZnJvbSB0aGlzIGNsYXNzLCBpbnN0ZWFkCisgKiBvZiBpbXBsZW1lbnRpbmcge0BsaW5rIFBpcGV9IGRpcmVjdGx5LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGlwZUltcGwgaW1wbGVtZW50cyBQaXBlIHsKKworICAgIC8qKgorICAgICAqIERvLW5vdGhpbmcgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0UGlwZUltcGwoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzaXMgZm9yIHRoZSBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyByZWdpc3RlcnMgdGhlIG5ld2x5IGNyZWF0ZWQge0BsaW5rIFBpcGV9IHdpdGggdGhlIHtAbGluayBQaXBlQ2xvbmVyfQorICAgICAqIHRocm91Z2gge0BsaW5rIFBpcGVDbG9uZXIjYWRkKFBpcGUsIFBpcGUpfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RQaXBlSW1wbChQaXBlIHRoYXQsIFBpcGVDbG9uZXIgY2xvbmVyKSB7CisgICAgICAgIGNsb25lci5hZGQodGhhdCx0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAvLyBub29wCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3BpcGUvaGVscGVyL0Fic3RyYWN0VHViZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL2hlbHBlci9BYnN0cmFjdFR1YmVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhNGNjNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL2hlbHBlci9BYnN0cmFjdFR1YmVJbXBsLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuRmliZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGVDbG9uZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlQ2xvbmVyOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHtAbGluayBUdWJlfSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2FuIGJlIGFsc28gdXNlZCBhcyBhIHtAbGluayBQaXBlfSwgYW5kIHRodXMgZWZmZWN0aXZlbHkKKyAqIG1ha2luZyBldmVyeSB7QGxpbmsgVHViZX0gdXNhYmxlIGFzIGEge0BsaW5rIFBpcGV9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHViZUltcGwgaW1wbGVtZW50cyBUdWJlLCBQaXBlIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0VHViZUltcGwoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RUdWJlSW1wbChBYnN0cmFjdFR1YmVJbXBsIHRoYXQsIFR1YmVDbG9uZXIgY2xvbmVyKSB7CisgICAgICAgIGNsb25lci5hZGQodGhhdCx0aGlzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgTmV4dEFjdGlvbiBkb0ludm9rZShUdWJlIG5leHQsIFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgTmV4dEFjdGlvbiBuYSA9IG5ldyBOZXh0QWN0aW9uKCk7CisgICAgICAgIG5hLmludm9rZShuZXh0LHBhY2tldCk7CisgICAgICAgIHJldHVybiBuYTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgTmV4dEFjdGlvbiBkb0ludm9rZUFuZEZvcmdldChUdWJlIG5leHQsIFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgTmV4dEFjdGlvbiBuYSA9IG5ldyBOZXh0QWN0aW9uKCk7CisgICAgICAgIG5hLmludm9rZUFuZEZvcmdldChuZXh0LHBhY2tldCk7CisgICAgICAgIHJldHVybiBuYTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgTmV4dEFjdGlvbiBkb1JldHVybldpdGgoUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgIE5leHRBY3Rpb24gbmEgPSBuZXcgTmV4dEFjdGlvbigpOworICAgICAgICBuYS5yZXR1cm5XaXRoKHJlc3BvbnNlKTsKKyAgICAgICAgcmV0dXJuIG5hOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBOZXh0QWN0aW9uIGRvU3VzcGVuZCgpIHsKKyAgICAgICAgTmV4dEFjdGlvbiBuYSA9IG5ldyBOZXh0QWN0aW9uKCk7CisgICAgICAgIG5hLnN1c3BlbmQoKTsKKyAgICAgICAgcmV0dXJuIG5hOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBOZXh0QWN0aW9uIGRvVGhyb3coVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgTmV4dEFjdGlvbiBuYSA9IG5ldyBOZXh0QWN0aW9uKCk7CisgICAgICAgIG5hLnRocm93RXhjZXB0aW9uKHQpOworICAgICAgICByZXR1cm4gbmE7CisgICAgfQorCisgICAgLyoqCisgICAgICogIkR1YWwgc3RhY2siIGNvbXBhdGliaWxpdHkgbWVjaGFuaXNtLgorICAgICAqIEFsbG93cyB7QGxpbmsgVHViZX0gdG8gYmUgaW52b2tlZCBmcm9tIGEge0BsaW5rIFBpcGV9LgorICAgICAqLworICAgIHB1YmxpYyBQYWNrZXQgcHJvY2VzcyhQYWNrZXQgcCkgeworICAgICAgICByZXR1cm4gRmliZXIuY3VycmVudCgpLnJ1blN5bmModGhpcyxwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVyaXZlZCBjbGFzcywgYnV0IHdlIGNhbid0IG1ha2UgaXQgYWJzdHJhY3QKKyAgICAgKiB3aXRob3V0IHVwc2V0dGluZyBqYXZhYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQWJzdHJhY3RUdWJlSW1wbCBjb3B5KFBpcGVDbG9uZXIgY2xvbmVyKSB7CisgICAgICAgIHJldHVybiBjb3B5KChUdWJlQ2xvbmVyKWNsb25lcik7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IEFic3RyYWN0VHViZUltcGwgY29weShUdWJlQ2xvbmVyIGNsb25lcik7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9oZWxwZXIvUGlwZUFkYXB0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL2hlbHBlci9QaXBlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjNlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9oZWxwZXIvUGlwZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkZpYmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLk5leHRBY3Rpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuUGlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlQ2xvbmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZUNsb25lcjsKKworLyoqCisgKiB7QGxpbmsgVHViZX0gdGhhdCBpbnZva2VzIHtAbGluayBQaXBlfS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHtAbGluayBQaXBlfSBsb29rIGxpa2UgYSB7QGxpbmsgVHViZX0uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGNsYXNzIFBpcGVBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RUdWJlSW1wbCB7CisgICAgcHJpdmF0ZSBmaW5hbCBQaXBlIG5leHQ7CisKKyAgICBwdWJsaWMgc3RhdGljIFR1YmUgYWRhcHQoUGlwZSBwKSB7CisgICAgICAgIGlmIChwIGluc3RhbmNlb2YgVHViZSkgeworICAgICAgICAgICAgcmV0dXJuIChUdWJlKSBwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQaXBlQWRhcHRlcihwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUGlwZSBhZGFwdChUdWJlIHApIHsKKyAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBQaXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKFBpcGUpIHA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGFzcyBUdWJlQWRhcHRlciBleHRlbmRzIEFic3RyYWN0UGlwZUltcGwgeworICAgICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgVHViZSB0OworCisgICAgICAgICAgICAgICAgcHVibGljIFR1YmVBZGFwdGVyKFR1YmUgdCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnQgPSB0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgVHViZUFkYXB0ZXIoVHViZUFkYXB0ZXIgdGhhdCwgUGlwZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIodGhhdCwgY2xvbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50ID0gY2xvbmVyLmNvcHkodGhhdC50KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgUGFja2V0IHByb2Nlc3MoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpYmVyLmN1cnJlbnQoKS5ydW5TeW5jKHQscmVxdWVzdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIFBpcGUgY29weShQaXBlQ2xvbmVyIGNsb25lcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1YmVBZGFwdGVyKHRoaXMsY2xvbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHViZUFkYXB0ZXIocCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgUGlwZUFkYXB0ZXIoUGlwZSBuZXh0KSB7CisgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHByaXZhdGUgUGlwZUFkYXB0ZXIoUGlwZUFkYXB0ZXIgdGhhdCwgVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgc3VwZXIodGhhdCxjbG9uZXIpOworICAgICAgICB0aGlzLm5leHQgPSAoKFBpcGVDbG9uZXIpY2xvbmVyKS5jb3B5KHRoYXQubmV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgY3VycmVudCBmaWJlciBhbmQgcnVucyB0aGUgd2hvbGUgcGlwZSB0byB0aGUgY29tcGxldGlvbgorICAgICAqIChtZWFuaW5nIGV2ZXJ5dGhpbmcgZnJvbSBub3cgb24gd2lsbCBydW4gc3luY2hyb25vdXNseS4pCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoQE5vdE51bGwgUGFja2V0IHApIHsKKyAgICAgICAgcmV0dXJuIGRvUmV0dXJuV2l0aChuZXh0LnByb2Nlc3MocCkpOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBOZXh0QWN0aW9uIHByb2Nlc3NSZXNwb25zZShATm90TnVsbCBQYWNrZXQgcCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzRXhjZXB0aW9uKEBOb3ROdWxsIFRocm93YWJsZSB0KSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBuZXh0LnByZURlc3Ryb3koKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGlwZUFkYXB0ZXIgY29weShUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICByZXR1cm4gbmV3IFBpcGVBZGFwdGVyKHRoaXMsY2xvbmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiWyIrbmV4dC50b1N0cmluZygpKyJdIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9oZWxwZXIvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9oZWxwZXIvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5NTUwYgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL2hlbHBlci9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qKgorICogRGVmYXVsdCBwYXJ0aWFsIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgUGlwZX0uCisgKgorICogPHA+CisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWZ1bCBmb3IgcHJvamVjdHMgYnVpbGRpbmcgb24KKyAqIHRvcCBvZiB0aGUgSkFYLVdTIFJJLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9waXBlL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDExNjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvcGlwZS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qKgorICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGV9IGFuZCByZWxhdGVkIGFic3RyYWN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvQWJzdHJhY3RTZXJ2ZXJBc3luY1RyYW5zcG9ydC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9BYnN0cmFjdFNlcnZlckFzeW5jVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5MzZmOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvQWJzdHJhY3RTZXJ2ZXJBc3luY1RyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlByb3BlcnR5U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkZpYmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuUG9vbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogUGFydGlhbCBzZXJ2ZXIgc2lkZSBhc3luYyB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24uIEl0IG1hbmFnZXMgcG9vbGluZyBvZgorICoge0BsaW5rIENvZGVjfSBhbmQgb3RoZXIgZGV0YWlscy4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJBc3luY1RyYW5zcG9ydDxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFdTRW5kcG9pbnQgZW5kcG9pbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2RlY1Bvb2wgY29kZWNQb29sOworCisgICAgLyoqCisgICAgICoge0BsaW5rIFdTRW5kcG9pbnQjc2V0RXhlY3V0b3J9IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGNyZWF0aW5nIHRoZQorICAgICAqIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHBhcmFtIGVuZHBvaW50IHdlYnNlcnZpY2VzIHJlcXVlc3RzIGFyZSBkaXJlY3RlZCB0b3dhcmRzIHRoaXMgZW5kcG9pbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RTZXJ2ZXJBc3luY1RyYW5zcG9ydChXU0VuZHBvaW50IGVuZHBvaW50KSB7CisgICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKKyAgICAgICAgY29kZWNQb29sID0gbmV3IENvZGVjUG9vbChlbmRwb2ludCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZGVjb2RlcyB0aGUgdHJhbnNwb3J0IGRhdGEgdG8gUGFja2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGF0IGNhcnJpZXMgdGhlIHdlYiBzZXJ2aWNlIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gY29kZWMgZm9yIGVuY29kaW5nL2RlY29kaW5nIHtAbGluayBNZXNzYWdlfQorICAgICAqIEByZXR1cm4gZGVjb2RlZCB7QGxpbmsgUGFja2V0fQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gaS9vIGVycm9yIGhhcHBlbnMgd2hpbGUgZW5jb2RpbmcvZGVjb2RpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGFja2V0IGRlY29kZVBhY2tldChUIGNvbm5lY3Rpb24sIEBOb3ROdWxsIENvZGVjIGNvZGVjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQYWNrZXQgcGFja2V0ID0gbmV3IFBhY2tldCgpOworICAgICAgICBwYWNrZXQuYWNjZXB0YWJsZU1pbWVUeXBlcyA9IGdldEFjY2VwdGFibGVNaW1lVHlwZXMoY29ubmVjdGlvbik7CisgICAgICAgIHBhY2tldC5hZGRTYXRlbGxpdGUoZ2V0UHJvcGVydHlTZXQoY29ubmVjdGlvbikpOworICAgICAgICBwYWNrZXQudHJhbnNwb3J0QmFja0NoYW5uZWwgPSBnZXRUcmFuc3BvcnRCYWNrQ2hhbm5lbChjb25uZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSB7QGxpbmsgUGFja2V0fSB0byBpbmZvc2V0IGFuZCB3cml0ZXMgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGF0IGNhcnJpZXMgdGhlIHdlYiBzZXJ2aWNlIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcGFja2V0IHRoYXQgbmVlZHMgdG8gZW5jb2RlZCB0byBpbmZvc2V0CisgICAgICogQHBhcmFtIGNvZGVjIHRoYXQgZG9lcyB0aGUgZW5jb2Rpbmcgb2YgUGFja2V0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBpL28gZXJyb3IgaGFwcGVucyB3aGlsZSBlbmNvZGluZy9kZWNvZGluZworICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuY29kZVBhY2tldChUIGNvbm5lY3Rpb24sIEBOb3ROdWxsIFBhY2tldCBwYWNrZXQsIEBOb3ROdWxsIENvZGVjIGNvZGVjKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgcmVxdWVzdCBoYXMgQWNjZXB0IGhlYWRlciwgcmV0dXJuIHRoYXQgdmFsdWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIHRoYXQgY2FycmllcyB0aGUgd2ViIHNlcnZpY2UgcmVxdWVzdAorICAgICAqIEByZXR1cm4gQWNjZXB0IE1JTUUgdHlwZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQE51bGxhYmxlIFN0cmluZyBnZXRBY2NlcHRhYmxlTWltZVR5cGVzKFQgY29ubmVjdGlvbik7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgVHJhbnNwb3J0QmFja0NoYW5uZWx9IHVzZWQgYnkgamF4LXdzIHJ1bnRpbWUgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiB3aGlsZSB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdCBpcyBzdGlsbCBjb250aW51aW5nLiBJbiBvbmV3YXkgSFRUUCBjYXNlLCBhCisgICAgICogcmVzcG9uc2UgY29kZSBuZWVkcyB0byBiZSBzZW50IGJlZm9yZSBpbnZva2luZyB0aGUgZW5kcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGF0IGNhcnJpZXMgdGhlIHdlYiBzZXJ2aWNlIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIFRyYW5zcG9ydEJhY2tDaGFubmVsIGluc3RhbmNlIHVzaW5nIHRoZSBjb25uZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEBOdWxsYWJsZSBUcmFuc3BvcnRCYWNrQ2hhbm5lbCBnZXRUcmFuc3BvcnRCYWNrQ2hhbm5lbChUIGNvbm5lY3Rpb24pOworCisgICAgLyoqCisgICAgICogSWYgdGhlcmUgYXJlIGFueSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ubmVjdGlvbiwgdGhvc2Ugd2lsbAorICAgICAqIGJlIGFkZGVkIHRvIHtAbGluayBQYWNrZXR9CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGF0IGNhcnJpZXMgdGhlIHdlYiBzZXJ2aWNlIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIHtAbGluayBQcm9wZXJ0eVNldH0gZm9yIHRoZSBjb25uZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEBOb3ROdWxsIFByb3BlcnR5U2V0IGdldFByb3BlcnR5U2V0KFQgY29ubmVjdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB7QGxpbmsgV2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZX0gdXNpbmcgdGhlIHVuZGVybHlpbmcgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIHRoYXQgY2FycmllcyB0aGUgd2ViIHNlcnZpY2UgcmVxdWVzdAorICAgICAqIEByZXR1cm4gbm9uLW51bGwgV2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZSBpbnN0YW5jZQorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBATm90TnVsbCBXZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlIGdldFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUoVCBjb25uZWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIGFuZCBkZWNvZGVzIGluZm9zZXQgZnJvbSB0aGUgY29ubmVjdGlvbiBhbmQgaW52b2tlcyB0aGUgZW5kcG9pbnRzLiBUaGUKKyAgICAgKiByZXNwb25zZSBpcyBlbmNvZGVkIGFuZCB3cml0dGVuIHRvIHRoZSBjb25uZWN0aW9uLiBUaGUgcmVzcG9uc2UgY291bGQgYmUKKyAgICAgKiB3cml0dGVuIHVzaW5nIGEgZGlmZmVyZW50IHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIHRoYXQgY2FycmllcyB0aGUgd2ViIHNlcnZpY2UgcmVxdWVzdAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gaS9vIGVycm9yIGhhcHBlbnMgd2hpbGUgZW5jb2RpbmcvZGVjb2RpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGUoZmluYWwgVCBjb25uZWN0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb2RlYyBjb2RlYyA9IGNvZGVjUG9vbC50YWtlKCk7CisgICAgICAgIFBhY2tldCByZXF1ZXN0ID0gZGVjb2RlUGFja2V0KGNvbm5lY3Rpb24sIGNvZGVjKTsKKyAgICAgICAgaWYgKCFyZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc0ZhdWx0KCkpIHsKKyAgICAgICAgICAgIGVuZHBvaW50LnNjaGVkdWxlKHJlcXVlc3QsIG5ldyBXU0VuZHBvaW50LkNvbXBsZXRpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRpb24oQE5vdE51bGwgUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVQYWNrZXQoY29ubmVjdGlvbiwgcmVzcG9uc2UsIGNvZGVjKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RlY1Bvb2wucmVjeWNsZShjb2RlYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDb2RlY1Bvb2wgZXh0ZW5kcyBQb29sPENvZGVjPiB7CisgICAgICAgIFdTRW5kcG9pbnQgZW5kcG9pbnQ7CisKKyAgICAgICAgQ29kZWNQb29sKFdTRW5kcG9pbnQgZW5kcG9pbnQpIHsKKyAgICAgICAgICAgIHRoaXMuIGVuZHBvaW50ID0gZW5kcG9pbnQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgQ29kZWMgY3JlYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50LmNyZWF0ZUNvZGVjKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvQWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9BZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1MDE1NgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuV1NFbmRwb2ludC5QaXBlSGVhZDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlBvb2w7CisKKy8qKgorICogUmVjZWl2ZXMgaW5jb21pbmcgbWVzc2FnZXMgZnJvbSBhIHRyYW5zcG9ydCAoc3VjaCBhcyBIVFRQLCBKTVMsIGV0YykKKyAqIGluIGEgdHJhbnNwb3J0IHNwZWNpZmljIHdheSwgYW5kIGRlbGl2ZXJzIGl0IHRvIHtAbGluayBXU0VuZHBvaW50LlBpcGVIZWFkI3Byb2Nlc3N9LgorICoKKyAqIDxwPgorICogU2luY2UgdGhpcyBjbGFzcyBtb3N0bHkgY29uY2VybnMgaXRzZWxmIHdpdGggY29udmVydGluZyBhCisgKiB0cmFuc3BvcnQtc3BlY2lmaWMgbWVzc2FnZSByZXByZXNlbnRhdGlvbiB0byBhIHtAbGluayBQYWNrZXR9LAorICogdGhlIG5hbWUgaXMgdGhlICJhZGFwdGVyIi4KKyAqCisgKiA8cD4KKyAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdHdvZm9sZHM6CisgKgorICogPG9sPgorICogPGxpPgorICogVG8gaGlkZSB0aGUgbG9naWMgb2YgY29udmVydGluZyBhIHRyYW5zcG9ydC1zcGVjaWZpYyBjb25uZWN0aW9uCisgKiB0byBhIHtAbGluayBQYWNrZXR9IGFuZCBkbyB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAqCisgKiA8bGk+CisgKiBUbyBtYW5hZ2UgdGhyZWFkLXVuc2FmZSByZXNvdXJjZXMsIHN1Y2ggYXMge0BsaW5rIFdTRW5kcG9pbnQuUGlwZUhlYWR9LAorICogYW5kIHtAbGluayBDb2RlY30uCisgKiA8L29sPgorICoKKyAqIDxwPgorICoge0BsaW5rIEFkYXB0ZXJ9cyBhcmUgZXh0ZW5kZWQgdG8gd29yayB3aXRoIGVhY2gga2luZCBvZiB0cmFuc3BvcnQsCisgKiBhbmQgdGhlcmVmb3JlIHtAbGluayBBZGFwdGVyfSBjbGFzcyBpdHNlbGYgaXMgbm90IGFsbCB0aGF0CisgKiB1c2VmdWwgYnkgaXRzZWxmIC0tLSBpdCBtZXJlbHkgcHJvdmlkZXMgYSBkZXNpZ24gdGVtcGxhdGUKKyAqIHRoYXQgY2FuIGJlIGZvbGxvd2VkLgorICoKKyAqIDxwPgorICogRm9yIG1hbmFnaW5nIHJlc291cmNlcywgYW4gYWRhcHRlciB1c2VzIGFuIG9iamVjdCBjYWxsZWQge0BsaW5rIFRvb2xraXR9CisgKiAodGhpbmsgb2YgaXQgYXMgYSB0cmF5IGZ1bGwgb2YgdG9vbHMgdGhhdCBhIGRlbnRpc3QgdXNlcyAtLS0KKyAqIHRyYXlzIGFyZSBpZGVudGljYWwsIGJ1dCBlYWNoIHBhdGllbnQgaGFzIHRvIGdldCBvbmUuIFlvdSBoYXZlCisgKiBhIHBvb2wgb2YgdGhlbSBhbmQgeW91IGFzc2lnbiBpdCB0byBhIHBhdGllbnQuKQorICoKKyAqIHtAbGluayBBZGFwdGVyLlRvb2xraXR9IGNhbiBiZSBleHRlbmRlZCBieSBkZXJpdmVkIGNsYXNzZXMuCisgKiBUaGF0IGFjdHVhbCB0eXBlIGlzIHRoZSB7QGNvZGUgVEt9IHR5cGUgcGFyYW1ldGVyIHRoaXMgY2xhc3MgdGFrZXMuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRhcHRlcjxUSyBleHRlbmRzIEFkYXB0ZXIuVG9vbGtpdD4geworCisgICAgcHJvdGVjdGVkIGZpbmFsIFdTRW5kcG9pbnQ8Pz4gZW5kcG9pbnQ7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QgdGhhdCBncm91cHMgYWxsIHRocmVhZC11bnNhZmUgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUb29sa2l0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciBlbmNvZGluZy9kZWNvZGluZyBpbmZvc2V0IHRvL2Zyb20gdGhlIGJ5dGUgc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIENvZGVjIGNvZGVjOworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBvYmplY3QgZnJvbSB7QGxpbmsgV1NFbmRwb2ludH0gc2VydmVzIHRoZSByZXF1ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFBpcGVIZWFkIGhlYWQ7CisKKyAgICAgICAgcHVibGljIFRvb2xraXQoKSB7CisgICAgICAgICAgICB0aGlzLmNvZGVjID0gZW5kcG9pbnQuY3JlYXRlQ29kZWMoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZCA9IGVuZHBvaW50LmNyZWF0ZVBpcGVIZWFkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb29sIG9mIHtAbGluayBUb29sa2l0fXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFBvb2w8VEs+IHBvb2wgPSBuZXcgUG9vbDxUSz4oKSB7CisgICAgICAgIHByb3RlY3RlZCBUSyBjcmVhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlVG9vbGtpdCgpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFkYXB0ZXJ9IHRoYXQgZGVsaXZlcnMKKyAgICAgKiBtZXNzYWdlcyB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFkYXB0ZXIoV1NFbmRwb2ludCBlbmRwb2ludCkgeworICAgICAgICBhc3NlcnQgZW5kcG9pbnQhPW51bGw7CisgICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBlbmRwb2ludCB0aGF0IHRoaXMge0BsaW5rIEFkYXB0ZXJ9IGlzIHNlcnZpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgbm9uLW51bGwuCisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnQ8Pz4gZ2V0RW5kcG9pbnQoKSB7CisgICAgICAgIHJldHVybiBlbmRwb2ludDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRvb2xraXR9IGluc3RhbmNlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGRlcml2ZWQgY2xhc3MgZG9lc24ndCBoYXZlIHRvIGFkZCBhbnkgcGVyLXRocmVhZCBzdGF0ZQorICAgICAqIHRvIHtAbGluayBUb29sa2l0fSwgc2ltcGx5IGltcGxlbWVudCB0aGlzIGFzIHtAY29kZSBuZXcgVG9vbGtpdCgpfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVEsgY3JlYXRlVG9vbGtpdCgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9Bc3luY1Byb3ZpZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL0FzeW5jUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODgwNzZiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9Bc3luY1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CisKKy8qKgorICogQXN5bmNocm9ub3VzIHZlcnNpb24gb2Yge0BsaW5rIFByb3ZpZGVyfS4KKyAqCisgKiA8cD4KKyAqIEFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgSkFYLVdTIFJJIGNhbiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW5zdGVhZCBvZgorICoge0BsaW5rIFByb3ZpZGVyfSB0byBpbXBsZW1lbnQgYXN5bmNocm9ub3VzIHdlYiBzZXJ2aWNlcyAoQVdTLikgQVdTIGVuYWJsZXMKKyAqIGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIG9wZXJhdGlvbnMgd2l0aCBsb25nIGxhdGVuY3kgd2l0aG91dCBibG9ja2luZyBhIHRocmVhZCwKKyAqIGFuZCB0aHVzIHBhcnRpY3VsYXJseSBzdWl0YWJsZSBmb3IgaGlnaGx5IHNjYWxhYmxlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24sCisgKiBhdCB0aGUgZXhwZXNuY2Ugb2YgaW1wbGVtZW50YXRpb24gY29tcGxleGl0eS4KKyAqCisgKiA8aDI+UHJvZ3JhbW1pbmcgTW9kZWw8L2gyPgorICogPHA+CisgKiBXaGVuZXZlciBhIG5ldyByZXVxZXN0IGFycml2ZXMsIHRoZSBKQVgtV1MgUkkgaW52b2tlcyB0aGUge0BsaW5rICNpbnZva2V9IG1ldGhvZAorICogdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbi4gTm9ybWFsbHksIHRoZSBhcHBsaWNhdGlvbiB0aGVuIHNjaGVkdWxlcyBhbiBleGVjdXRpb24KKyAqIG9mIHRoaXMgcmVxdWVzdCwgYW5kIGV4aXQgZnJvbSB0aGlzIG1ldGhvZCBpbW1lZGlhdGVseSAodGhlIHBvaW50IG9mIEFXUyBpcyBub3QKKyAqIHRvIHVzZSB0aGlzIGNhbGxpbmcgdGhyZWFkIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcuKQorICoKKyAqIDxwPgorICogVW5saWtlIHRoZSBzeW5jaHJvbm91cyB2ZXJzaW9uLCB3aGljaCByZXF1aXJlcyB0aGUgcmVzcG9uc2UgdG8gYmUgZ2l2ZW4gYXMgdGhlIHJldHVybiB2YWx1ZSwKKyAqIHdpdGggQVdTIHRoZSBKQVgtV1MgUkkgd2lsbCBrZWVwIHRoZSBjb25uZWN0aW9uIHdpdGggY2xpZW50IG9wZW4sIHVudGlsIHRoZSBhcHBsaWNhdGlvbgorICogZXZlbnR1YWxseSBub3RpZmllcyB0aGUgSkFYLVdTIFJJIHZpYSB7QGxpbmsgQXN5bmNQcm92aWRlckNhbGxiYWNrfS4gV2hlbiB0aGF0CisgKiBoYXBwZW5zIHRoYXQgY2F1c2VzIHRoZSBKQVgtV1MgUkkgdG8gc2VuZCBiYWNrIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhIHZlcnkgc2ltcGxlIEFXUyBleGFtcGxlOgorICoKKyAqIDxwcmU+CisgKiAmIzY0O1dlYlNlcnZpY2UKKyAqIGNsYXNzIE15QXN5bmNFY2hvU2VydmljZSBpbXBsZW1lbnRzIEFzeW5jUHJvdmlkZXImbHQ7U291cmNlPiB7CisgKiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwge0BsaW5rIEV4ZWN1dG9yfSBleGVjID0gLi4uOworICoKKyAqICAgICBwdWJsaWMgdm9pZCBpbnZva2UoIGZpbmFsIFNvdXJjZSByZXF1ZXN0LCBmaW5hbCBBc3luY1Byb3ZpZGVyQ2FsbGJhY2smbHQ7U291cmNlPiBjYWxsYmFjaywgZmluYWwgV2ViU2VydmljZUNvbnRleHQgY29udGV4dCkgeworICogICAgICAgICBleGVjLmV4ZWN1dGUobmV3IHtAbGluayBSdW5uYWJsZX0oKSB7CisgKiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgKiAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOyAgICAgLy8ga2lsbCB0aW1lLgorICogICAgICAgICAgICAgICAgIGNhbGxiYWNrLnNlbmQocmVxdWVzdCk7IC8vIGp1c3QgZWNobyBiYWNrCisgKiAgICAgICAgICAgICB9CisgKiAgICAgICAgIH0pOworICogICAgIH0KKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogUGxlYXNlIGFsc28gY2hlY2sgdGhlIHtAbGluayBQcm92aWRlcn0gYW5kIGl0cyBwcm9ncmFtbWluZyBtb2RlbCBmb3IgZ2VuZXJhbAorICogcHJvdmlkZXIgcHJvZ3JhbW1pbmcgbW9kZWwuCisgKgorICoKKyAqIDxoMj5XZWJTZXJ2aWNlQ29udGV4dDwvaDI+CisgKiA8cD4KKyAqIEluIHN5bmNocm9ub3VzIHdlYiBzZXJ2aWNlcywgdGhlIGluamVjdGVkIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0gaW5zdGFuY2UgdXNlcworICogdGhlIGNhbGxpbmcge0BsaW5rIFRocmVhZH0gdG8gZGV0ZXJtaW5lIHdoaWNoIHJlcXVlc3QgaXQgc2hvdWxkIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dC4KKyAqIFRoaXMgbm8gbG9uZ2VyIHdvcmtzIHdpdGggQVdTLCBhcyB5b3UgbWF5IG5lZWQgdG8gY2FsbCB7QGxpbmsgV2ViU2VydmljZUNvbnRleHR9CisgKiBtdWNoIGxhdGVyLCBwb3NzaWJseSBmcm9tIGVudGlyZWx5IGRpZmZlcmVudCB0aHJlYWQuCisgKgorICogPHA+CisgKiBGb3IgdGhpcyByZWFzb24sIHtAbGluayBBc3luY1Byb3ZpZGVyfSBwYXNzZXMgaW4ge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0fSBhcworICogYSBwYXJhbWV0ZXIuIFRoaXMgb2JqZWN0IHJlbWFpbnMgdXNhYmxlIHVudGlsIHlvdSBpbnZva2Uge0BsaW5rIEFzeW5jUHJvdmlkZXJDYWxsYmFja30sCisgKiBhbmQgaXQgY2FuIGJlIGludm9rZWQgZnJvbSBhbnkgdGhyZWFkLCBldmVuIGNvbmN1cnJlbnRseS4gQVdTIG11c3Qgbm90IHVzZSB0aGUgaW5qZWN0ZWQKKyAqIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0sIGFzIGl0cyBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisgKgorICogQHNlZSBQcm92aWRlcgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBBc3luY1Byb3ZpZGVyPFQ+IHsKKyAgICAvKioKKyAgICAgKiBTY2hlZHVsZXMgYW4gZXhlY3V0aW9uIG9mIGEgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogICAgICBSZXByZXNlbnRzIHRoZSByZXF1ZXN0IG1lc3NhZ2Ugb3IgcGF5bG9hZC4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sKKyAgICAgKiAgICAgIEFwcGxpY2F0aW9uIG11c3Qgbm90aWZ5IHRoaXMgY2FsbGJhY2sgaW50ZXJmYWNlIHdoZW4gdGhlIHByb2Nlc3NpbmcKKyAgICAgKiAgICAgIG9mIGEgcmVxdWVzdCBpcyBjb21wbGV0ZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgVGhlIHdlYiBzZXJ2aWNlIGNvbnRleHQgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZQorICAgICAqICAgICAgY29udGV4dCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoCisgICAgICAgIEBOb3ROdWxsIFQgcmVxdWVzdCwKKyAgICAgICAgQE5vdE51bGwgQXN5bmNQcm92aWRlckNhbGxiYWNrPFQ+IGNhbGxiYWNrLAorICAgICAgICBATm90TnVsbCBXZWJTZXJ2aWNlQ29udGV4dCBjb250ZXh0KTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvQXN5bmNQcm92aWRlckNhbGxiYWNrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL0FzeW5jUHJvdmlkZXJDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzUyODMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL0FzeW5jUHJvdmlkZXJDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworLyoqCisgKiBDYWxsYmFjayBpbnRlcmZhY2UgdG8gc2lnbmFsIEpBWC1XUyBSSSB0aGF0IHRoZSBwcm9jZXNzaW5nIG9mIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IGlzIGNvbXBsZXRlLgorICoKKyAqIDxwPgorICogVGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBpbnZva2luZyBvbmUgb2YgdGhlIHR3byBkZWZpbmVkIG1ldGhvZHMgdG8KKyAqIGluZGljYXRlIHRoZSByZXN1bHQgb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZy4KKyAqCisgKiA8cD4KKyAqIEJvdGggbWV0aG9kcyB3aWxsIHJldHVybiBpbW1lZGlhdGVseSwgYW5kIHRoZSBKQVgtV1MgUkkgd2lsbAorICogc2VuZCBvdXQgYW4gYWN0dWFsIHJlc3BvbnNlIGF0IHNvbWUgbGF0ZXIgcG9pbnQuCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzaW5jZSAyLjEKKyAqIEBzZWUgQXN5bmNQcm92aWRlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIEFzeW5jUHJvdmlkZXJDYWxsYmFjazxUPiB7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgYSByZXF1ZXN0IHdhcyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlCisgICAgICogICAgICBSZXByZXNlbnRzIGFuIG9iamVjdCB0byBiZSBzZW50IGJhY2sgdG8gdGhlIGNsaWVudAorICAgICAqICAgICAgYXMgYSByZXNwb25zZS4gVG8gaW5kaWNhdGUgb25lLXdheSwgcmVzcG9uc2UgbmVlZHMgdG8gYmUgbnVsbAorICAgICAqLworICAgIHZvaWQgc2VuZChATnVsbGFibGUgVCByZXNwb25zZSk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhbiBlcnJvciBoYWQgb2NjdXJlZCB3aGlsZSBwcm9jZXNzaW5nIGEgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0CisgICAgICogICAgICBUaGUgZXJyb3IgaXMgcHJvcGFnYXRlZCB0byB0aGUgY2xpZW50LiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBpcworICAgICAqICAgICAgYSBTT0FQLWJhc2VkIHdlYiBzZXJ2aWNlLCB0aGUgc2VydmVyIHdpbGwgc2VuZCBiYWNrIGEgU09BUCBmYXVsdC4KKyAgICAgKi8KKyAgICB2b2lkIHNlbmRFcnJvcihATm90TnVsbCBUaHJvd2FibGUgdCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL0JvdW5kRW5kcG9pbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvQm91bmRFbmRwb2ludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjljZDcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL0JvdW5kRW5kcG9pbnQuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUge0BsaW5rIFdTRW5kcG9pbnR9IGJvdW5kIHRvIGEgcGFydGljdWxhciB0cmFuc3BvcnQuCisgKgorICogQHNlZSBNb2R1bGUjZ2V0Qm91bmRFbmRwb2ludHMoKQorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgaW50ZXJmYWNlIEJvdW5kRW5kcG9pbnQgeworICAgIC8qKgorICAgICAqIFRoZSBlbmRwb2ludCB0aGF0IHdhcyBib3VuZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE11bHRpcGxlIHtAbGluayBCb3VuZEVuZHBvaW50fXMgbWF5IHBvaW50IHRvIHRoZSBzYW1lIHtAbGluayBXU0VuZHBvaW50fSwKKyAgICAgKiBpZiBpdCdzIGJvdW5kIHRvIG11bHRpcGxlIHRyYW5zcG9ydHMuCisgICAgICovCisgICAgQE5vdE51bGwgV1NFbmRwb2ludCBnZXRFbmRwb2ludCgpOworCisgICAgLyoqCisgICAgICogVGhlIGFkZHJlc3Mgb2YgdGhlIGJvdW5kIGVuZHBvaW50LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgZW5kcG9pbnQgaXMgYm91bmQgdG8gYSBzZXJ2bGV0IGVuZHBvaW50CisgICAgICogImh0dHA6Ly9mb29iYXIvbXlhcHAvbXlzZXJ2aWNlIiwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQKKyAgICAgKiByZXR1cm4gdGhhdCBhZGRyZXNzLgorICAgICAqLworICAgIEBOb3ROdWxsIFVSSSBnZXRBZGRyZXNzKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL0NvbnRhaW5lci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9Db250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JhZjhiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9Db250YWluZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworLyoqCisgKiBSb290IG9mIHRoZSBTUEkgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbnRhaW5lcgorICogKHN1Y2ggYXMgYXBwbGljYXRpb24gc2VydmVyLikKKyAqCisgKiA8cD4KKyAqIE9mdGVuIHRlY2hub2xvZ2llcyB0aGF0IGFyZSBidWlsdCBvbiB0b3Agb2YgSkFYLVdTCisgKiAoc3VjaCBhcyBUYW5nbykgbmVlZHMgdG8gbmVnb3RpYXRlIHByaXZhdGUgY29udHJhY3RzIGJldHdlZW4KKyAqIHRoZW0gYW5kIHRoZSBjb250YWluZXIuIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBzdWNoIHRlY2hub2xvZ2llcworICogdG8gcXVlcnkgdGhlIG5lZ290aWF0ZWQgU1BJIGJ5IHVzaW5nIHRoZSB7QGxpbmsgI2dldFNQSShDbGFzcyl9LgorICoKKyAqIDxwPgorICogRm9yIGV4YW1wbGUsIGlmIGEgc2VjdXJpdHkgcGlwZSBuZWVkcyB0byBnZXQgc29tZSBpbmZvcm1hdGlvbgorICogZnJvbSBhIGNvbnRhaW5lciwgdGhleSBjYW4gZG8gdGhlIGZvbGxvd2luZzoKKyAqIDxvbD4KKyAqICA8bGk+TmVnb3RpYXRlIGFuIGludGVyZmFjZSB3aXRoIHRoZSBjb250YWluZXIgYW5kIGRlZmluZSBpdC4KKyAqICAgICAgKGxldCdzIGNhbGwgaXQgPHR0PkNvbnRhaW5lclNlY3VyaXR5U1BJPC90dD4uKQorICogIDxsaT5UaGUgY29udGFpbmVyIHdpbGwgaW1wbGVtZW50IDx0dD5Db250YWluZXJTZWN1cml0eVNQSTwvdHQ+LgorICogIDxsaT5BdCB0aGUgcnVudGltZSwgYSBzZWN1cml0eSBwaXBlIGdldHMKKyAqICAgICAge0BsaW5rIFdTRW5kcG9pbnR9IGFuZCB0aGVuIHRvIHtAbGluayBDb250YWluZXJ9LgorICogIDxsaT5JdCBjYWxscyA8dHQ+Y29udGFpbmVyLmdldFNQSShDb250YWluZXJTZWN1cml0eVNQSS5jbGFzcyk8L3R0PgorICogIDxsaT5UaGUgY29udGFpbmVyIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgPHR0PkNvbnRhaW5lclNlY3VyaXR5U1BJPC90dD4uCisgKiAgPGxpPlRoZSBzZWN1cml0eSBwaXBlIHRhbGtzIHRvIHRoZSBjb250YWluZXIgdGhyb3VnaCB0aGlzIFNQSS4KKyAqIDwvb2w+CisgKgorICogPHA+CisgKiBUaGlzIHByb3RlY3RzIEpBWC1XUyBmcm9tIHdvcnJ5aW5nIGFib3V0IHRoZSBkZXRhaWxzIG9mIHN1Y2ggY29udHJhY3RzLAorICogd2hpbGUgc3RpbGwgcHJvdmlkaW5nIHRoZSBuZWNlc3Nhcnkgc2VydmljZSBvZiBob29raW5nIHVwIHRob3NlIHBhcnRpZXMuCisgKgorICogPHA+CisgKiBUZWNobm9sb2dpZXMgdGhhdCBydW4gaW5zaWRlIEpBWC1XUyBzZXJ2ZXIgcnVudGltZSBjYW4gYWNjZXNzIHRoaXMgb2JqZWN0IHRocm91Z2gKKyAqIHtAbGluayBXU0VuZHBvaW50I2dldENvbnRhaW5lcigpfS4gSW4gdGhlIGNsaWVudCBydW50aW1lLCBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbQorICoge0BsaW5rIENvbnRhaW5lclJlc29sdmVyI2dldENvbnRhaW5lcigpfQorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzZWUgV1NFbmRwb2ludAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGFpbmVyIHsKKyAgICAvKioKKyAgICAgKiBGb3IgZGVyaXZlZCBjbGFzc2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250YWluZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIFNQSS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGFzIGEga2luZCBvZiBkaXJlY3Rvcnkgc2VydmljZQorICAgICAqIGZvciBTUElzIGJldHdlZW4gdGVjaG5vbG9naWVzIG9uIHRvcCBvZiBKQVgtV1MKKyAgICAgKiBhbmQgdGhlIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGlUeXBlCisgICAgICogICAgICBBbHdheXMgbm9uLW51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIGlmIHN1Y2ggYW4gU1BJIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgPFQ+IFQgZ2V0U1BJKENsYXNzPFQ+IHNwaVR5cGUpOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB0aGF0IHJlcHJlc2VudHMgYSAibm8ge0BsaW5rIENvbnRhaW5lcn0iLAorICAgICAqIHdoaWNoIGFsd2F5cyByZXR1cm5zIG51bGwgZnJvbSB7QGxpbmsgI2dldFNQSShDbGFzcyl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29udGFpbmVyIE5PTkUgPSBuZXcgQ29udGFpbmVyKCkgeworICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0U1BJKENsYXNzPFQ+IHNwaVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvQ29udGFpbmVyUmVzb2x2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvQ29udGFpbmVyUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDBhYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9Db250YWluZXJSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRldGVybWluZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENvbnRhaW5lcn0gZm9yIHRoZSBydW50aW1lLgorICogSXQgYXBwbGllcyBmb3IgYm90aCBzZXJ2ZXIgYW5kIGNsaWVudCBydW50aW1lcyhmb3IgZS5nIGluIFNlcnZsZXQgY291bGQKKyAqIGJlIGFjY2Vzc2luZyBhIFdlYiBTZXJ2aWNlKS4gQWx3YXlzIGNhbGwge0BsaW5rICNzZXRJbnN0YW5jZX0gd2hlbiB0aGUKKyAqIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgaXMgaW5pdGFpbGl6ZWQgYW5kIGEgQ29udGFpbmVyIGluc3RhbmNlIHNob3VsZAorICogYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGFwcGxpY2F0aW9uLgorICoKKyAqIEEgY2xpZW50IHRoYXQgaXMgaW52b2tpbmcgYSB3ZWIgc2VydmljZSBtYXkgYmUgcnVubmluZyBpbiBhCisgKiBjb250YWluZXIoZm9yIGUuZyBzZXJ2bGV0KS4gVAorICoKKyAqIDxwPgorICogQ29udGFpbmVyUmVzb2x2ZXIgdXNlcyBhIHN0YXRpYyBmaWVsZCB0byBrZWVwIHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVzb2x2ZXIgb2JqZWN0LgorICogVHlwaWNhbGx5IGFwcHNlcnZlciBtYXkgc2V0IGl0cyBjdXN0b20gY29udGFpbmVyIHJlc29sdmVyIHVzaW5nIHRoZSBzdGF0aWMgbWV0aG9kCisgKiB7QGxpbmsgI3NldEluc3RhbmNlKENvbnRhaW5lclJlc29sdmVyKX0KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGFpbmVyUmVzb2x2ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29udGFpbmVyUmVzb2x2ZXIgTk9ORSA9IG5ldyBDb250YWluZXJSZXNvbHZlcigpIHsKKyAgICAgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGFpbmVyLk5PTkU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQ29udGFpbmVyUmVzb2x2ZXIgdGhlUmVzb2x2ZXIgPSBOT05FOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VzdG9tIGNvbnRhaW5lciByZXNvbHZlciB3aGljaCBjYW4gYmUgdXNlZCB0byBnZXQgY2xpZW50J3MKKyAgICAgKiB7QGxpbmsgQ29udGFpbmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvbHZlciBjb250YWluZXIgcmVzb2x2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5zdGFuY2UoQ29udGFpbmVyUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgaWYocmVzb2x2ZXI9PW51bGwpCisgICAgICAgICAgICByZXNvbHZlciA9IE5PTkU7CisgICAgICAgIHRoZVJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGFpbmVyIHJlc29sdmVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGdldCBjbGllbnQncyB7QGxpbmsgQ29udGFpbmVyfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29udGFpbmVyIHJlc29sdmVyIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBDb250YWluZXJSZXNvbHZlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoZVJlc29sdmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgY29udGFpbmVyIHJlc29sdmVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGdldCB7QGxpbmsgQ29udGFpbmVyfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZGVmYXVsdCBjb250YWluZXIgcmVzb2x2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRhaW5lclJlc29sdmVyIGdldERlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBOT05FOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBDb250YWluZXJ9IGNvbnRleHQgaW4gd2hpY2ggY2xpZW50IGlzIHJ1bm5pbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIGNsaWVudAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvRG9jdW1lbnRBZGRyZXNzUmVzb2x2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvRG9jdW1lbnRBZGRyZXNzUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDM4N2VhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9Eb2N1bWVudEFkZHJlc3NSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworLyoqCisgKiBSZXNvbHZlcyByZWxhdGl2ZSByZWZlcmVuY2VzIGFtb25nIHtAbGluayBTRERvY3VtZW50fXMuCisgKgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgY2FsbGVyIG9mCisgKiB7QGxpbmsgU0REb2N1bWVudCN3cml0ZVRvfSBtZXRob2Qgc28KKyAqIHRoYXQgdGhlIHtAbGluayBTRERvY3VtZW50fSBjYW4gY29ycmVjdGx5IHByb2R1Y2UgcmVmZXJlbmNlcworICogdG8gb3RoZXIgZG9jdW1lbnRzLgorICoKKyAqIDxwPgorICogVGhpcyBtZWNoYW5pc20gYWxsb3dzIHRoZSB1c2VyIG9mIHtAbGluayBXU0VuZHBvaW50fSB0bworICogYXNzaWduIGxvZ2ljYWwgVVJMcyB0byBlYWNoIHtAbGluayBTRERvY3VtZW50fSAod2hpY2ggaXMgb2Z0ZW4KKyAqIG5lY2Vzc2FyaWx5IGRvbmUgaW4gYSB0cmFuc3BvcnQtZGVwZW5kZW50IHdheSksIGFuZCB0aGVuCisgKiBzZXJ2ZSBkZXNjcmlwdGlvbiBkb2N1bWVudHMuCisgKgorICoKKyAqCisgKiA8aDI+VXNhZ2UgRXhhbXBsZSAxPC9oMj4KKyAqIDxwPgorICogSFRUUCBzZXJ2bGV0IHRyYW5zcG9ydCBjaG9zZSB0byBleHBvc2UgdGhvc2UgbWV0YWRhdGEgZG9jdW1lbnRzCisgKiB0byBIVFRQIEdFVCByZXF1ZXN0cyB3aGVyZSBlYWNoIHtAbGluayBTRERvY3VtZW50fSBpcyBpZGVudGlmaWVkCisgKiBieSBhIHNpbXBsZSBxdWVyeSBzdHJpbmcgIj88aT5JRDwvaT4iLiAoSFRUUCBzZXJ2bGV0IHRyYW5zcG9ydAorICogYXNzaWducyBzdWNoIElEcyBieSBpdHNlbGYuKQorICoKKyAqIDxwPgorICogSW4gdGhpcyBuYW1laW5nIHNjaGVtZSwgd2hlbiB7QGxpbmsgU0REb2N1bWVudH0gWCByZWZlcnMgdG8KKyAqIHtAbGluayBTRERvY3VtZW50fSBZLCBpdCBjYW4gcHV0IGEgcmVmZXJlbmNlIGFzICI/PGk+SURvZlk8L2k+Ii4KKyAqIEJ5IGltcGxlbWVudGluZyB7QGxpbmsgRG9jdW1lbnRBZGRyZXNzUmVzb2x2ZXJ9IGl0IGNhbiBkbyBzby4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRBZGRyZXNzUmVzb2x2ZXIgeworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgcmVsYXRpdmUgcmVmZXJlbmNlIGZyb20gb25lIGRvY3VtZW50IHRvIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudAorICAgICAqICAgICAgVGhlIGRvY3VtZW50IHRoYXQgaXMgYmVpbmcgZ2VuZXJhdGVkLgorICAgICAqIEBwYXJhbSByZWZlcmVuY2VkCisgICAgICogICAgICBUaGUgZG9jdW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSByZWZlcmVuY2UgdG8gYmUgcHV0IGluc2lkZSB7QGNvZGUgY3VycmVudH0gdG8gcmVmZXIgdG8KKyAgICAgKiAgICAgIHtAY29kZSByZWZlcmVuY2VkfS4gVGhpcyBjYW4gYmUgYSByZWxhdGl2ZSBVUkwgYXMgd2VsbCBhcworICAgICAqICAgICAgYW4gYWJzb2x1dGUuIElmIG51bGwgaXMgcmV0dXJuZWQsIHRoZW4gdGhlIHtAbGluayBTRERvY3VtZW50fQorICAgICAqICAgICAgd2lsbCBwcm9kdWNlIGEgImltcGxpY2l0IHJlZmVyZW5jZSIgKGZvciBleGFtcGxlLCAmbHQ7eHM6aW1wb3J0PgorICAgICAqICAgICAgd2l0aG91dCB0aGUgQHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSwgZXRjKS4KKyAgICAgKi8KKyAgICBATnVsbGFibGUgU3RyaW5nIGdldFJlbGF0aXZlQWRkcmVzc0ZvcihATm90TnVsbCBTRERvY3VtZW50IGN1cnJlbnQsIEBOb3ROdWxsIFNERG9jdW1lbnQgcmVmZXJlbmNlZCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL0VuZHBvaW50QXdhcmVDb2RlYy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9FbmRwb2ludEF3YXJlQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTBhZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9FbmRwb2ludEF3YXJlQ29kZWMuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29kZWM7CisKKy8qKgorICogSW1wbGVtZW50ZWQgYnkge0BsaW5rIENvZGVjfXMgdGhhdCB3YW50IHRvIGhhdmUgYWNjZXNzIHRvCisgKiB7QGxpbmsgV1NFbmRwb2ludH0gb2JqZWN0LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzaW5jZSAyLjEuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50QXdhcmVDb2RlYyBleHRlbmRzIENvZGVjIHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHtAbGluSyBXU0VuZHBvaW50fSBpbXBsZW1lbnRhdGlvbgorICAgICAqIHdoZW4gdGhlIGNvZGVjIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbmRwb2ludC4KKyAgICAgKi8KKyAgICB2b2lkIHNldEVuZHBvaW50KEBOb3ROdWxsIFdTRW5kcG9pbnQgZW5kcG9pbnQpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9JbnN0YW5jZVJlc29sdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL0luc3RhbmNlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE1NTFlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9JbnN0YW5jZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuU2VydmVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzc2VydmxldE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TZXJ2ZXJSdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuU2luZ2xldG9uUmVzb2x2ZXI7CisKK2ltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIERldGVybWluZXMgdGhlIGluc3RhbmNlIHRoYXQgc2VydmVzCisgKiB0aGUgZ2l2ZW4gcmVxdWVzdCBwYWNrZXQuCisgKgorICogPHA+CisgKiBUaGUgSkFYLVdTIHNwZWMgYWx3YXlzIHVzZSBhIHNpbmdsZXRvbiBpbnN0YW5jZQorICogdG8gc2VydmUgYWxsIHRoZSByZXF1ZXN0cywgYnV0IHRoaXMgaG9vayBwcm92aWRlcworICogYSBjb252ZW5pZW50IHdheSB0byByb3V0ZSBtZXNzYWdlcyB0byBhIHByb3BlciByZWNlaXZlci4KKyAqCisgKiA8cD4KKyAqIEV4dGVybmFsbHksIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbnN0YW5jZVJlc29sdmVyfSBpcworICogYXNzb2NpYXRlZCB3aXRoIHtAbGluayBXU0VuZHBvaW50fS4KKyAqCisgKiA8aDI+UG9zc2libGUgVXNlczwvaDI+CisgKiA8cD4KKyAqIE9uZSBjYW4gdXNlIFdTLUFkZHJlc3NpbmcgbWVzc2FnZSBwcm9wZXJ0aWVzIHRvCisgKiBkZWNpZGUgd2hpY2ggaW5zdGFuY2UgdG8gZGVsaXZlciBhIG1lc3NhZ2UuIFRoaXMKKyAqIHdvdWxkIGJlIGFuIGltcG9ydGFudCBidWlsZGluZyBibG9jayBmb3IgYSBzdGF0ZWZ1bAorICogd2ViIHNlcnZpY2VzLgorICoKKyAqIDxwPgorICogT25lIGNhbiBhc3NvY2lhdGUgYW4gaW5zdGFuY2Ugb2YgYSBzZXJ2aWNlCisgKiB3aXRoIGEgc3BlY2lmaWMgV1MtUk0gc2Vzc2lvbi4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnN0YW5jZVJlc29sdmVyPFQ+IHsKKyAgICAvKioKKyAgICAgKiBEZWNpZGVzIHdoaWNoIGluc3RhbmNlIG9mICdUJyBzZXJ2ZXMgdGhlIGdpdmVuIHJlcXVlc3QgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBjb25jdXJyZW50bHkgYnkgbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgKiBJdCBpcyBhbHNvIG9uIGEgY3JpdGljYWlsIHBhdGggdGhhdCBhZmZlY3RzIHRoZSBwZXJmb3JtYW5jZS4KKyAgICAgKiBBIGdvb2QgaW1wbGVtZW50YXRpb24gc2hvdWxkIHRyeSB0byBhdm9pZCBhbnkgc3luY2hyb25pemF0aW9uLAorICAgICAqIGFuZCBzaG91bGQgbWluaW1pemUgdGhlIGFtb3VudCBvZiB3b3JrIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqICAgICAgQWx3YXlzIG5vbi1udWxsLiBSZXByZXNlbnRzIHRoZSByZXF1ZXN0IG1lc3NhZ2UgdG8gYmUgc2VydmVkLgorICAgICAqICAgICAgVGhlIGNhbGxlciBtYXkgbm90IGNvbnN1bWUgdGhlIHtAbGluayBNZXNzYWdlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE5vdE51bGwgVCByZXNvbHZlKFBhY2tldCByZXF1ZXN0KTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB7QGxpbmsgV1NFbmRwb2ludH0gd2hlbiBpdCdzIHNldCB1cC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgYW4gb3Bwb3J0dW5pdHkgZm9yIHtAbGluayBJbnN0YW5jZVJlc29sdmVyfQorICAgICAqIHRvIGRvIGEgZW5kcG9pbnQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3c2MKKyAgICAgKiAgICAgIFRoZSB7QGxpbmsgV2ViU2VydmljZUNvbnRleHR9IGluc3RhbmNlIHRvIGJlIGluamVjdGVkCisgICAgICogICAgICB0byB0aGUgdXNlciBpbnN0YW5jZXMgKGFzc3VtaW5nIHtAbGluayBJbnN0YW5jZVJlc29sdmVyfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEBOb3ROdWxsIFdTV2ViU2VydmljZUNvbnRleHQgd3NjLCBATm90TnVsbCBXU0VuZHBvaW50IGVuZHBvaW50KSB7CisgICAgICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICAgICAgc3RhcnQod3NjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVXNlIHtAbGluayAjc3RhcnQoV1NXZWJTZXJ2aWNlQ29udGV4dCxXU0VuZHBvaW50KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoQE5vdE51bGwgV2ViU2VydmljZUNvbnRleHQgd3NjKSB7fQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHtAbGluayBXU0VuZHBvaW50fQorICAgICAqIHdoZW4ge0BsaW5rIFdTRW5kcG9pbnQjZGlzcG9zZSgpfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGFsbG93cyB7QGxpbmsgSW5zdGFuY2VSZXNvbHZlcn0gdG8gZG8gZmluYWwgY2xlYW4gdXAuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgY2FsbGVkIG9uY2UgYnkge0BsaW5rIFdTRW5kcG9pbnR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEluc3RhbmNlUmVzb2x2ZXJ9IGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzCisgICAgICogcmV0dXJucyB0aGUgc3BlY2lmaWVkIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBJbnN0YW5jZVJlc29sdmVyPFQ+IGNyZWF0ZVNpbmdsZXRvbihUIHNpbmdsZXRvbikgeworICAgICAgICBhc3NlcnQgc2luZ2xldG9uIT1udWxsOworICAgICAgICBJbnN0YW5jZVJlc29sdmVyIGlyID0gY3JlYXRlRnJvbUluc3RhbmNlUmVzb2x2ZXJBbm5vdGF0aW9uKHNpbmdsZXRvbi5nZXRDbGFzcygpKTsKKyAgICAgICAgaWYoaXI9PW51bGwpCisgICAgICAgICAgICBpciA9IG5ldyBTaW5nbGV0b25SZXNvbHZlcjxUPihzaW5nbGV0b24pOworICAgICAgICByZXR1cm4gaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFRoaXMgaXMgYWRkZWQgaGVyZSBiZWNhdXNlIGEgR2xhc3NmaXNoIGludGVncmF0aW9uIGhhcHBlbmVkCisgICAgICogICAgICB3aXRoIHRoaXMgc2lnbmF0dXJlLiBQbGVhc2UgZG8gbm90IHVzZSB0aGlzLiBXaWxsIGJlIHJlbW92ZWQKKyAgICAgKiAgICAgIGFmdGVyIHRoZSBuZXh0IEdGIGludGVncmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEluc3RhbmNlUmVzb2x2ZXI8VD4gY3JlYXRlRGVmYXVsdChATm90TnVsbCBDbGFzczxUPiBjbGF6eiwgYm9vbGVhbiBib29sKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVEZWZhdWx0KGNsYXp6KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCB7QGxpbmsgSW5zdGFuY2VSZXNvbHZlcn0gdGhhdCBzZXJ2ZXMgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEluc3RhbmNlUmVzb2x2ZXI8VD4gY3JlYXRlRGVmYXVsdChATm90TnVsbCBDbGFzczxUPiBjbGF6eikgeworICAgICAgICBJbnN0YW5jZVJlc29sdmVyPFQ+IGlyID0gY3JlYXRlRnJvbUluc3RhbmNlUmVzb2x2ZXJBbm5vdGF0aW9uKGNsYXp6KTsKKyAgICAgICAgaWYoaXI9PW51bGwpCisgICAgICAgICAgICBpciA9IG5ldyBTaW5nbGV0b25SZXNvbHZlcjxUPihjcmVhdGVOZXdJbnN0YW5jZShjbGF6eikpOworICAgICAgICByZXR1cm4gaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGZvciB7QGxpbmsgSW5zdGFuY2VSZXNvbHZlckFubm90YXRpb259IGFuZCBjcmVhdGVzIGFuIGluc3RhbmNlIHJlc29sdmVyIGZyb20gaXQgaWYgYW55LgorICAgICAqIE90aGVyd2lzZSBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBJbnN0YW5jZVJlc29sdmVyPFQ+IGNyZWF0ZUZyb21JbnN0YW5jZVJlc29sdmVyQW5ub3RhdGlvbihATm90TnVsbCBDbGFzczxUPiBjbGF6eikgeworICAgICAgICBmb3IoIEFubm90YXRpb24gYSA6IGNsYXp6LmdldEFubm90YXRpb25zKCkgKSB7CisgICAgICAgICAgICBJbnN0YW5jZVJlc29sdmVyQW5ub3RhdGlvbiBpcmEgPSBhLmFubm90YXRpb25UeXBlKCkuZ2V0QW5ub3RhdGlvbihJbnN0YW5jZVJlc29sdmVyQW5ub3RhdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBpZihpcmE9PW51bGwpICAgY29udGludWU7CisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgSW5zdGFuY2VSZXNvbHZlcj4gaXIgPSBpcmEudmFsdWUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlyLmdldENvbnN0cnVjdG9yKENsYXNzLmNsYXNzKS5uZXdJbnN0YW5jZShjbGF6eik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5GQUlMRURfVE9fSU5TVEFOVElBVEVfSU5TVEFOQ0VfUkVTT0xWRVIoCisgICAgICAgICAgICAgICAgICAgIGlyLmdldE5hbWUoKSxhLmFubm90YXRpb25UeXBlKCksY2xhenouZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5GQUlMRURfVE9fSU5TVEFOVElBVEVfSU5TVEFOQ0VfUkVTT0xWRVIoCisgICAgICAgICAgICAgICAgICAgIGlyLmdldE5hbWUoKSxhLmFubm90YXRpb25UeXBlKCksY2xhenouZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5GQUlMRURfVE9fSU5TVEFOVElBVEVfSU5TVEFOQ0VfUkVTT0xWRVIoCisgICAgICAgICAgICAgICAgICAgIGlyLmdldE5hbWUoKSxhLmFubm90YXRpb25UeXBlKCksY2xhenouZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKFNlcnZlck1lc3NhZ2VzLkZBSUxFRF9UT19JTlNUQU5USUFURV9JTlNUQU5DRV9SRVNPTFZFUigKKyAgICAgICAgICAgICAgICAgICAgaXIuZ2V0TmFtZSgpLGEuYW5ub3RhdGlvblR5cGUoKSxjbGF6ei5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgPFQ+IFQgY3JlYXRlTmV3SW5zdGFuY2UoQ2xhc3M8VD4gY2wpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjbC5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgV3NzZXJ2bGV0TWVzc2FnZXMuRVJST1JfSU1QTEVNRU5UT1JfRkFDVE9SWV9ORVdfSU5TVEFOQ0VfRkFJTEVEKGNsKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBXc3NlcnZsZXRNZXNzYWdlcy5FUlJPUl9JTVBMRU1FTlRPUl9GQUNUT1JZX05FV19JTlNUQU5DRV9GQUlMRUQoY2wpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXBzIHRoaXMge0BsaW5rIEluc3RhbmNlUmVzb2x2ZXJ9IGludG8gYW4ge0BsaW5rIEludm9rZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBJbnZva2VyIGNyZWF0ZUludm9rZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW52b2tlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoQE5vdE51bGwgV1NXZWJTZXJ2aWNlQ29udGV4dCB3c2MsIEBOb3ROdWxsIFdTRW5kcG9pbnQgZW5kcG9pbnQpIHsKKyAgICAgICAgICAgICAgICBJbnN0YW5jZVJlc29sdmVyLnRoaXMuc3RhcnQod3NjLGVuZHBvaW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICAgICAgICAgIEluc3RhbmNlUmVzb2x2ZXIudGhpcy5kaXNwb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2UoUGFja2V0IHAsIE1ldGhvZCBtLCBPYmplY3QuLi4gYXJncykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBtLmludm9rZSggcmVzb2x2ZShwKSwgYXJncyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8VD4gVCBpbnZva2VQcm92aWRlcihATm90TnVsbCBQYWNrZXQgcCwgVCBhcmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChQcm92aWRlcjxUPilyZXNvbHZlKHApKS5pbnZva2UoYXJnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkRlZmF1bHQgSW52b2tlciBvdmVyICIrSW5zdGFuY2VSZXNvbHZlci50aGlzLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoCisgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5zZXJ2ZXIiKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvSW5zdGFuY2VSZXNvbHZlckFubm90YXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvSW5zdGFuY2VSZXNvbHZlckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjRmYTBiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9JbnN0YW5jZVJlc29sdmVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLlN0YXRlZnVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIE1ldGEgYW5ub3RhdGlvbiBmb3Igc2VsZWN0aW5nIGluc3RhbmNlIHJlc29sdmVyLgorICoKKyAqIDxwPgorICogV2hlbiBzZXJ2aWNlIGNsYXNzIGlzIGFubm90YXRlZCB3aXRoIGFuIGFubm90YXRpb24gdGhhdCBoYXMKKyAqIHtAbGluayBJbnN0YW5jZVJlc29sdmVyQW5ub3RhdGlvbn0gYXMgbWV0YSBhbm5vdGF0aW9uLCB0aGUgSkFYLVdTIFJJCisgKiBydW50aW1lIHdpbGwgdXNlIHRoZSBpbnN0YW5jZSByZXNvbHZlciBjbGFzcyBzcGVjaWZpZWQgb24ge0BsaW5rICN2YWx1ZSgpfS4KKyAqCisgKiA8cD4KKyAqIFRoZSB7QGxpbmsgSW5zdGFuY2VSZXNvbHZlcn0gY2xhc3MgbXVzdCBoYXZlIHRoZSBwdWJsaWMgY29uc3RydWN0b3IgdGhhdAorICogdGFrZXMge0BsaW5rIENsYXNzfSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0aGUgc2VydmljZS4KKyAqCisgKiA8cD4KKyAqIFNlZSB7QGxpbmsgU3RhdGVmdWx9IGZvciBhIHJlYWwgZXhhbXBsZS4gVGhpcyBhbm5vdGF0aW9uIGlzIG9ubHkgZm9yCisgKiBhZHZhbmNlZCB1c2VycyBvZiB0aGUgSkFYLVdTIFJJLgorICoKKyAqIEBzaW5jZSBKQVgtV1MgMi4xCisgKiBAc2VlIFN0YXRlZnVsCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK0BUYXJnZXQoQU5OT1RBVElPTl9UWVBFKQorQFJldGVudGlvbihSVU5USU1FKQorQERvY3VtZW50ZWQKK3B1YmxpYyBAaW50ZXJmYWNlIEluc3RhbmNlUmVzb2x2ZXJBbm5vdGF0aW9uIHsKKyAgICBDbGFzczw/IGV4dGVuZHMgSW5zdGFuY2VSZXNvbHZlcj4gdmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvSW52b2tlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9JbnZva2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExMTE1NAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvSW52b2tlci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworCitpbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBIaWRlcyB0aGUgZGV0YWlsIG9mIGNhbGxpbmcgaW50byBhcHBsaWNhdGlvbiBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiA8cD4KKyAqIFR5cGljYWwgaG9zdCBvZiB0aGUgSkFYLVdTIFJJIHdvdWxkIHdhbnQgdG8gdXNlCisgKiB7QGxpbmsgSW5zdGFuY2VSZXNvbHZlciNjcmVhdGVEZWZhdWx0KENsYXNzKX0gYW5kIHRoZW4KKyAqIHVzZSA8dHQ+e0BsaW5rIEluc3RhbmNlUmVzb2x2ZXIjY3JlYXRlSW52b2tlcigpfSB0byBvYnRhaW4KKyAqIHRoZSBkZWZhdWx0IGludm9rZXIgaW1wbGVtZW50YXRpb24uCisgKgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnZva2VyIHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rIFdTRW5kcG9pbnR9IHdoZW4gaXQncyBzZXQgdXAuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIGFuIG9wcG9ydHVuaXR5IGZvciB7QGxpbmsgSW52b2tlcn0KKyAgICAgKiB0byBkbyBhIGVuZHBvaW50LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3NjCisgICAgICogICAgICBUaGUge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0fSBpbnN0YW5jZSB0aGF0IGNhbiBiZSBpbmplY3RlZAorICAgICAqICAgICAgdG8gdGhlIHVzZXIgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSBlbmRwb2ludAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEBOb3ROdWxsIFdTV2ViU2VydmljZUNvbnRleHQgd3NjLCBATm90TnVsbCBXU0VuZHBvaW50IGVuZHBvaW50KSB7CisgICAgICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICAgICAgc3RhcnQod3NjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVXNlIHtAbGluayAjc3RhcnQoV1NXZWJTZXJ2aWNlQ29udGV4dCxXU0VuZHBvaW50KX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydChATm90TnVsbCBXZWJTZXJ2aWNlQ29udGV4dCB3c2MpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGVwcmVjYXRlZCB2ZXJzaW9uIGNhbGxlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB7QGxpbmsgV1NFbmRwb2ludH0KKyAgICAgKiB3aGVuIHtAbGluayBXU0VuZHBvaW50I2Rpc3Bvc2UoKX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogVGhpcyBhbGxvd3Mge0BsaW5rIEluc3RhbmNlUmVzb2x2ZXJ9IHRvIGRvIGZpbmFsIGNsZWFuIHVwLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmx5IGNhbGxlZCBvbmNlIGJ5IHtAbGluayBXU0VuZHBvaW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBpbnZva2UoIEBOb3ROdWxsIFBhY2tldCBwLCBATm90TnVsbCBNZXRob2QgbSwgQE5vdE51bGwgT2JqZWN0Li4uIGFyZ3MgKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEludm9rZXMge0BsaW5rIFByb3ZpZGVyI2ludm9rZShPYmplY3QpfQorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCBpbnZva2VQcm92aWRlciggQE5vdE51bGwgUGFja2V0IHAsIFQgYXJnICkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgICAgICAvLyBkZWZhdWx0IHNsb3cgaW1wbGVtZW50YXRpb24gdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIG90aGVyIGludm9rZSBtZXRob2QuCisgICAgICAgIHJldHVybiAoVClpbnZva2UocCxpbnZva2VNZXRob2QsYXJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHtAbGluayBBc3luY1Byb3ZpZGVyI2ludm9rZShPYmplY3QsIEFzeW5jUHJvdmlkZXJDYWxsYmFjaywgV2ViU2VydmljZUNvbnRleHQpfQorICAgICAqLworICAgIHB1YmxpYyA8VD4gdm9pZCBpbnZva2VBc3luY1Byb3ZpZGVyKCBATm90TnVsbCBQYWNrZXQgcCwgVCBhcmcsIEFzeW5jUHJvdmlkZXJDYWxsYmFjayBjYmFrLCBXZWJTZXJ2aWNlQ29udGV4dCBjdHh0ICkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgICAgICAvLyBkZWZhdWx0IHNsb3cgaW1wbGVtZW50YXRpb24gdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIG90aGVyIGludm9rZSBtZXRob2QuCisgICAgICAgIGludm9rZShwLCBhc3luY0ludm9rZU1ldGhvZCwgYXJnLCBjYmFrLCBjdHh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgaW52b2tlTWV0aG9kOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludm9rZU1ldGhvZCA9IFByb3ZpZGVyLmNsYXNzLmdldE1ldGhvZCgiaW52b2tlIixPYmplY3QuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIGFzeW5jSW52b2tlTWV0aG9kOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzeW5jSW52b2tlTWV0aG9kID0gQXN5bmNQcm92aWRlci5jbGFzcy5nZXRNZXRob2QoImludm9rZSIsT2JqZWN0LmNsYXNzLCBBc3luY1Byb3ZpZGVyQ2FsbGJhY2suY2xhc3MsIFdlYlNlcnZpY2VDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvTW9kdWxlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OWQ3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL01vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5IdHRwQWRhcHRlckxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIG9iamVjdCBzY29wZWQgdG8gdGhlIGN1cnJlbnQgIm1vZHVsZSIgKGxpa2UgYSBKYXZhRUUgd2ViIGFwcGxpYXRpb24pLgorICoKKyAqIDxwPgorICogVGhpcyBvYmplY3QgY2FuIGJlIG9idGFpbmVkIGZyb20ge0BsaW5rIENvbnRhaW5lciNnZXRTUEkoQ2xhc3MpfS4KKyAqCisgKiA8cD4KKyAqIFRoZSBzY29wZSBvZiB0aGUgbW9kdWxlIGlzIGRyaXZlbiBieSB7QGxpbmsgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyI2J1aWxkKCl9J3MKKyAqIHJlcXVpcmVtZW50IHRoYXQgd2UgbmVlZCB0byBpZGVudGlmeSBhIHtAbGluayBXU0VuZHBvaW50fSB0aGF0IGhhcyBhIHNwZWNpZmljCisgKiBzZXJ2aWNlL3BvcnQgbmFtZS4KKyAqCisgKiA8cD4KKyAqIEZvciBKYXZhRUUgY29udGFpbmVycyB0aGlzIHNob3VsZCBiZSBzY29wZWQgdG8gYSBKYXZhRUUgYXBwbGljYXRpb24uIEZvcgorICogb3RoZXIgZW52aXJvbm1lbnQsIHRoaXMgY291bGQgYmUgc2NvcGVkIHRvIGFueSBzaW1pbGFyIG5vdGlvbi4gSWYgbm8gc3VjaAorICogbm90aW9uIGlzIGF2YWlsYWJsZSwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb250YWluZXJ9IGNhbiByZXR1cm4KKyAqIGEgbmV3IHtAbGluayBNb2R1bGV9IG9iamVjdCBlYWNoIHRpbWUge0BsaW5rIENvbnRhaW5lciNnZXRTUEkoQ2xhc3MpfSBpcyBpbnZva2VkLgorICoKKyAqIDxwPgorICogVGhlcmUncyBhIGNvbnNpZGVyYWJsZSBvdmVybGFwIGJldHdlZW4gdGhpcyBhbmQge0BsaW5rIEh0dHBBZGFwdGVyTGlzdH0uCisgKiBUaGUgU1BJIHJlYWxseSBuZWVkcyB0byBiZSByZWNvbnNpZGVyZWQKKyAqCisgKgorICogQHNlZSBDb250YWluZXIKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzaW5jZSAyLjEgRUEzCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGUgeworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2Yge0BsaW5rIEJvdW5kRW5kcG9pbnR9IGRlcGxveWVkIGluIHRoaXMgbW9kdWxlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogRnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUge0BsaW5rIE1vZHVsZX0gaW1wbGVtZW50YXRpb24sCisgICAgICogaXQgcmVhbGx5IG9ubHkgbmVlZHMgdG8gcHJvdmlkZSBhIHtAbGluayBMaXN0fSBvYmplY3QgYXMgYSBkYXRhIHN0b3JlLgorICAgICAqIEpBWC1XUyB3aWxsIHVwZGF0ZSB0aGlzIGxpc3QgYWNjb3JkaW5nbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG5vbi1udWxsIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBMaXN0PEJvdW5kRW5kcG9pbnQ+IGdldEJvdW5kRW5kcG9pbnRzKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1BvcnRBZGRyZXNzUmVzb2x2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvUG9ydEFkZHJlc3NSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZTg2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1BvcnRBZGRyZXNzUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIFJlc29sdmVzIHBvcnQgYWRkcmVzcyBmb3IgYW4gZW5kcG9pbnQuIEEgV1NETCBtYXkgY29udGFpbiBtdWx0aXBsZQorICogZW5kcG9pbnRzLCBhbmQgc29tZSBvZiB0aGUgZW5kcG9pbnRzIG1heSBiZSBwYWNrYWdlZCBpbiBhIHNpbmdsZSBXQVIgZmlsZS4KKyAqIElmIGFuIGVuZHBvaW50IGlzIHNlcnZpbmcgdGhlIFdTREwsIGl0IHdvdWxkIGJlIG5pY2UgdG8gZmlsbCB0aGUgcG9ydCBhZGRyZXNzZXMKKyAqIG9mIG90aGVyIGVuZHBvaW50cyBpbiB0aGUgV0FSLgorICoKKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGNhbGxlciBvZgorICoge0BsaW5rIFNERG9jdW1lbnQjd3JpdGVUb30gbWV0aG9kIHNvCisgKiB0aGF0IHRoZSB7QGxpbmsgU0REb2N1bWVudH0gY2FuIGNvcnJlY3RseSBmaWxscyB0aGUgYWRkcmVzc2VzIG9mIGtub3duCisgKiBlbmRwb2ludHMuCisgKgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQb3J0QWRkcmVzc1Jlc29sdmVyIHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBlbmRwb2ludCBhZGRyZXNzIGZvciBhIFdTREwgcG9ydAorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lCisgICAgICogICAgICAgV1NETCBzZXJ2aWNlIG5hbWUod3NkOnNlcnZpY2UgaW4gV1NETCkgZm9yIHdoaWNoIGFkZHJlc3MgaXMgbmVlZGVkLiBBbHdheXMgbm9uLW51bGwuCisgICAgICogQHBhcmFtIHBvcnROYW1lCisgICAgICogICAgICAgV1NETCBwb3J0IG5hbWUod3NkbDpwb3J0IGluIFdTREwpIGZvciB3aGljaCBhZGRyZXNzIGlzIG5lZWRlZC4gQWx3YXlzIG5vbi1udWxsLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSBhZGRyZXNzIG5lZWRzIHRvIGJlIHB1dCBpbiBXU0RMIGZvciBwb3J0IGVsZW1lbnQncyBsb2NhdGlvbgorICAgICAqICAgICAgYXR0cmlidXRlLiBDYW4gYmUgbnVsbC4gSWYgaXQgaXMgbnVsbCwgZXhpc3RpbmcgcG9ydCBhZGRyZXNzCisgICAgICogICAgICBpcyB3cml0dGVuIGFzIGl0IGlzICh3aXRob3V0IGFueSBwYXRjaGluZykuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOdWxsYWJsZSBTdHJpbmcgZ2V0QWRkcmVzc0ZvcihATm90TnVsbCBRTmFtZSBzZXJ2aWNlTmFtZSwgQE5vdE51bGwgU3RyaW5nIHBvcnROYW1lKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvUmVzb3VyY2VJbmplY3Rvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9SZXNvdXJjZUluamVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0ZDU5OQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvUmVzb3VyY2VJbmplY3Rvci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuRGVmYXVsdFJlc291cmNlSW5qZWN0b3I7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBjb250YWluZXIgdG8gaW5qZWN0IHJlc291cmNlcworICogdG8gYXBwbGljYXRpb24gc2VydmljZSBlbmRwb2ludCBvYmplY3QgKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSBhcyBwZXIgSmF2YUVFIHNwZWMuKQorICoKKyAqIDxwPgorICogSWYge0BsaW5rIENvbnRhaW5lciNnZXRTUEkoQ2xhc3MpfSByZXR1cm5zIGEgdmFsaWQgaW5zdGFuY2Ugb2Yge0BsaW5rIFJlc291cmNlSW5qZWN0b3J9LAorICogVGhlIEpBWC1XUyBSSSB3aWxsIGNhbGwgdGhlIHtAbGluayAjaW5qZWN0fSBtZXRob2QgZm9yIGVhY2ggc2VydmljZSBlbmRwb2ludAorICogaW5zdGFuY2UgdGhhdCBpdCBtYW5hZ2VzLgorICoKKyAqIDxwPgorICogVGhlIEpBWC1XUyBSSSB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHtAbGluayBQb3N0Q29uc3RydWN0fSBjYWxsYmFjaywKKyAqIHNvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIG5lZWQgbm90IGRvIHNvLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzZWUgQ29udGFpbmVyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZUluamVjdG9yIHsKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyByZXNvdXJjZSBpbmplY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0fSBpbXBsZW1lbnRhdGlvbiB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gaW5zdGFuY2UKKyAgICAgKiAgICAgIEluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGNsYXNzIHRvIHdoaWNoIHJlc291cmNlcyB3aWxsIGJlIGluamVjdGVkLgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICBJZiB0aGUgcmVzb3VyY2UgaW5qZWN0aW9uIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluamVjdChATm90TnVsbCBXU1dlYlNlcnZpY2VDb250ZXh0IGNvbnRleHQsIEBOb3ROdWxsIE9iamVjdCBpbnN0YW5jZSk7CisKKyAgICAvKioKKyAgICAgKiBGYWxsYmFjayB7QGxpbmsgUmVzb3VyY2VJbmplY3Rvcn0gaW1wbGVtZW50YXRpb24gdXNlZCB3aGVuIHRoZSB7QGxpbmsgQ29udGFpbmVyfQorICAgICAqIGRvZXNuJ3QgcHJvdmlkZSBvbmUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBKdXN0IGluamVjdCB7QGxpbmsgV1NXZWJTZXJ2aWNlQ29udGV4dH0gYW5kIGRvbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUluamVjdG9yIFNUQU5EQUxPTkUgPSBuZXcgRGVmYXVsdFJlc291cmNlSW5qZWN0b3IoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvU0REb2N1bWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9TRERvY3VtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1MGM0YwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvU0REb2N1bWVudC5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIGRvY3VtZW50IHRoYXQgZm9ybXMgYSB7QGxpbmsgU2VydmljZURlZmluaXRpb259LgorICoKKyAqIDxwcmU+CisgKiBUT0RPOgorICogICAgICBob3cgZG9lcyB0aG9zZSBkb2N1bWVudHMgcmVmZXIgdG8gZWFjaCBvdGhlcj8KKyAqCisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNERG9jdW1lbnQgeworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCB0YWcgbmFtZSBvZiB0aGlzIGRvY3VtZW50LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBhIGtpbmQgb2YgZG9jdW1lbnQgcXVpY2tseQorICAgICAqIChzdWNoIGFzIHNjaGVtYSwgV1NETCwgLi4uKQorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIFFOYW1lIGdldFJvb3ROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkb2N1bWVudCBpcyBXU0RMLgorICAgICAqLworICAgIGJvb2xlYW4gaXNXU0RMKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkb2N1bWVudCBpcyBzY2hlbWEuCisgICAgICovCisgICAgYm9vbGVhbiBpc1NjaGVtYSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3lzdGVtIElEIG9mIHRoZSBkb2N1bWVudCB3aGVyZSBpdCdzIHRha2VuIGZyb20uIEdlbmVyYXRlZCBkb2N1bWVudHMKKyAgICAgKiB1c2UgYSBmYWtlIFVSTCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgVVJMcy4gU28gZG9ub3QgdXNlIHRoaXMgVVJMCisgICAgICogZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KKyAgICAgKi8KKyAgICBVUkwgZ2V0VVJMKCk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGRvY3VtZW50IHRvIHRoZSBnaXZlbiB7QGxpbmsgT3V0cHV0U3RyZWFtfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNpbmNlIHtAbGluayBTZXJ2aWNlRGVmaW5pdGlvbn0gZG9lc24ndCBrbm93IHdoaWNoIGVuZHBvaW50IGFkZHJlc3MKKyAgICAgKiB7QGxpbmsgQWRhcHRlcn0gaXMgc2VydmluZyB0bywgKGFuZCBvZnRlbiBpdCBzZXJ2ZXMgbXVsdGlwbGUgVVJMcworICAgICAqIHNpbXVsdGFuZW91c2x5KSwgdGhpcyBtZXRob2QgdGFrZXMgdGhlIFBvcnRBZGRyZXNzUmVzb2x2ZXIgYXMgYSBwYXJhbWV0ZXIsCisgICAgICogc28gdGhhdCBpdCBjYW4gcHJvZHVjZSB0aGUgY29ycmV0IGFkZHJlc3MgaW5mb3JtYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBXU0RMLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnRBZGRyZXNzUmVzb2x2ZXIKKyAgICAgKiAgICAgIEFuIGVuZHBvaW50IGFkZHJlc3MgcmVzb2x2ZXIgdGhhdCBnaXZlcyBlbmRwb2ludCBhZGRyZXNzIGZvciBhIFdTREwKKyAgICAgKiAgICAgIHBvcnQuIENhbiBiZSBudWxsLgorICAgICAqIEBwYXJhbSByZXNvbHZlcgorICAgICAqICAgICAgVXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIHJlZmVyZW5jZXMgYW1vbmcgZG9jdW1lbnRzLgorICAgICAqIEBwYXJhbSBvcworICAgICAqICAgICAgVGhlIHtAbGluayBPdXRwdXRTdHJlYW19IHRoYXQgcmVjZWl2ZXMgdGhlIGdlbmVyYXRlZCBkb2N1bWVudC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgcmVwb3J0ZWQgZnJvbSB0aGUge0BsaW5rIE91dHB1dFN0cmVhbX0uCisgICAgICovCisgICAgdm9pZCB3cml0ZVRvKEBOdWxsYWJsZSBQb3J0QWRkcmVzc1Jlc29sdmVyIHBvcnRBZGRyZXNzUmVzb2x2ZXIsCisgICAgICAgICAgICBEb2N1bWVudEFkZHJlc3NSZXNvbHZlciByZXNvbHZlciwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGRvY3VtZW50IHRvIHRoZSBnaXZlbiB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayAjd3JpdGVUbyhQb3J0QWRkcmVzc1Jlc29sdmVyLERvY3VtZW50QWRkcmVzc1Jlc29sdmVyLE91dHB1dFN0cmVhbSl9IGV4Y2VwdAorICAgICAqIGl0IHdyaXRlcyB0byBhbiB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCBjYWxsIHtAbGluayBYTUxTdHJlYW1Xcml0ZXIjd3JpdGVTdGFydERvY3VtZW50KCl9CisgICAgICogbm9yIHtAbGluayBYTUxTdHJlYW1Xcml0ZXIjd3JpdGVFbmREb2N1bWVudCgpfS4gVGhvc2UgYXJlIHRoZSBjYWxsZXIncworICAgICAqIHJlc3BvbnNpYmlsaXR5LgorICAgICAqCisgICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHRoZSB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfSByZXBvcnRzIGFuIGVycm9yLgorICAgICAqLworICAgIHZvaWQgd3JpdGVUbyhQb3J0QWRkcmVzc1Jlc29sdmVyIHBvcnRBZGRyZXNzUmVzb2x2ZXIsCisgICAgICAgICAgICBEb2N1bWVudEFkZHJlc3NSZXNvbHZlciByZXNvbHZlciwgWE1MU3RyZWFtV3JpdGVyIG91dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgU0REb2N1bWVudH0gdGhhdCByZXByZXNlbnRzIGFuIFhNTCBTY2hlbWEuCisgICAgICovCisgICAgaW50ZXJmYWNlIFNjaGVtYSBleHRlbmRzIFNERG9jdW1lbnQgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdGFyZ2V0IG5hbWVwc2FjZSBvZiB0aGlzIHNjaGVtYS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgU0REb2N1bWVudH0gdGhhdCByZXByZXNlbnRzIGEgV1NETC4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgV1NETCBleHRlbmRzIFNERG9jdW1lbnQgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdGFyZ2V0IG5hbWVwc2FjZSBvZiB0aGlzIHNjaGVtYS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBXU0RMIGhhcyBhIHBvcnRUeXBlIGRlZmluaXRpb24KKyAgICAgICAgICogdGhhdCBtYXRjaGVzIHdoYXQge0BsaW5rIFdTRW5kcG9pbnR9IGlzIHNlcnZpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IGRvZXMgdGhpcyBpbmZvIG5lZWRzIHRvIGJlIGV4cG9zZWQ/CisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGhhc1BvcnRUeXBlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgV1NETCBoYXMgYSBzZXJ2aWNlIGRlZmluaXRpb24KKyAgICAgICAgICogdGhhdCBtYXRjaGVzIHRoZSB7QGxpbmsgV1NFbmRwb2ludH0uCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IGRvZXMgdGhpcyBpbmZvIG5lZWQgdG8gYmUgZXhwb3NlZD8KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaGFzU2VydmljZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvU0REb2N1bWVudEZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9TRERvY3VtZW50RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljM2Q5NAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvU0REb2N1bWVudEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBQcm92aWRlcyBhIHdheSB0byBmaWx0ZXIge0BsaW5rIFNERG9jdW1lbnR9IGluZm9zZXQgd2hpbGUgd3JpdGluZyBpdC4gVGhlc2UKKyAqIGZpbHRlciBvYmplY3RzIGNhbiBiZSBhZGRlZCB0byB7QGxpbmsgU2VydmljZURlZmluaXRpb259IHVzaW5nCisgKiB7QGxpbmsgU2VydmljZURlZmluaXRpb24jYWRkRmlsdGVyKFNERG9jdW1lbnRGaWx0ZXIpfQorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU0REb2N1bWVudEZpbHRlciB7CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHdyYXBwZWQgWE1MU3RyZWFtV3JpdGVyIG9uIHRvcCBvZiBwYXNzZWQtaW4gWE1MU3RyZWFtV3JpdGVyLgorICAgICAqIEl0IHdvcmtzIGxpa2UgYW55IGZpbHRlcmluZyBBUEkgZm9yIGUuZy4ge0BsaW5rIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtfS4KKyAgICAgKiBUaGUgbWV0aG9kIHJldHVybnMgYSBYTUxTdHJlYW1Xcml0ZXIgdGhhdCBjYWxscyB0aGUgc2FtZSBtZXRob2RzIG9uIG9yaWdpbmFsCisgICAgICogWE1MU3RyZWFtV3JpdGVyIHdpdGggc29tZSBtb2RpZmllZCBldmVudHMuIFRoZSBlbmQgcmVzdWx0IGlzIHNvbWUgaW5mb3NldAorICAgICAqIGlzIGZpbHRlcmVkIGJlZm9yZSBpdCByZWFjaGVzIHRoZSBvcmlnaW5hbCB3cml0ZXIgYW5kIHRoZSBpbmZvc2V0IHdyaXRlcgorICAgICAqIGRvZXNuJ3QgaGF2ZSB0byBjaGFuZ2UgYW55IGNvZGUgdG8gaW5jb3Jwb3JhdGUgdGhpcyBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9jIGdpdmVzIGNvbnRleHQgZm9yIHRoZSBmaWx0ZXIuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBxdWVyeQorICAgICAqICByZWFkLW9ubHkgaW5mb3JtYXRpb24uIENhbGxpbmcgZG9jLndyaXRlVG8oKSBtYXkgcmVzdWx0IGluIGluZmluaXRlIGxvb3AuCisgICAgICogQHBhcmFtIHcgT3JpZ2luYWwgWE1MU3RyZWFtV3JpdGVyCisgICAgICogQHJldHVybiBGaWx0ZXJpbmcge0BsaW5rIFhNTFN0cmVhbVdyaXRlcn0KKyAgICAgKi8KKyAgICBYTUxTdHJlYW1Xcml0ZXIgZmlsdGVyKFNERG9jdW1lbnQgZG9jLCBYTUxTdHJlYW1Xcml0ZXIgdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1NERG9jdW1lbnRTb3VyY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvU0REb2N1bWVudFNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmQxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1NERG9jdW1lbnRTb3VyY2UuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuVGlkeVhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIFNQSSB0aGF0IHByb3ZpZGVzIHRoZSBzb3VyY2Ugb2Yge0BsaW5rIFNERG9jdW1lbnR9LgorICoKKyAqIDxwPgorICogVGhpcyBhYnN0cmFjdCBjbGFzcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhcHBsaWF0aW9ucywgb3Igb25lIG9mIHRoZQorICoge0BsaW5rICNjcmVhdGV9IG1ldGhvZHMgY2FuIGJlIHVzZWQuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0REb2N1bWVudFNvdXJjZSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gdGhhdCByZWFkcyB0aGUgZG9jdW1lbnQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBtYXliZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzIGNvbmN1cnJlbnRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4aWYKKyAgICAgKiAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIHVzZSB0aGlzIG9iamVjdCB3aGVuIGl0IHdhbnRzIHRvCisgICAgICogICAgICBjcmVhdGUgYSBuZXcgcGFyc2VyIChvciBpdCBjYW4ganVzdCBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIgY29tcGxldGVseS4pCisgICAgICogQHJldHVybgorICAgICAqICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgcmVhZGVyIHRvIGF2b2lkIHJlc291cmNlIGxlYWsuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2hpbGUgY3JlYXRpbmcgYSBwYXJzZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgdHJ5aW5nIHRvIHJlYWQgdGhlIGRvY3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBYTUxTdHJlYW1SZWFkZXIgcmVhZChYTUxJbnB1dEZhY3RvcnkgeGlmKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IHRoYXQgcmVhZHMgdGhlIGRvY3VtZW50LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgbWF5YmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lcyBjb25jdXJyZW50bHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSByZWFkZXIgdG8gYXZvaWQgcmVzb3VyY2UgbGVhay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgICogICAgICBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aGlsZSBjcmVhdGluZyBhIHBhcnNlci4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB0cnlpbmcgdG8gcmVhZCB0aGUgZG9jdW1lbnQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFhNTFN0cmVhbVJlYWRlciByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTeXN0ZW0gSUQgb2YgdGhpcyBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVVJMIGdldFN5c3RlbUlkKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHtAbGluayBTRERvY3VtZW50U291cmNlfSBmcm9tIGFuIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNERG9jdW1lbnRTb3VyY2UgY3JlYXRlKGZpbmFsIFVSTCB1cmwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTRERvY3VtZW50U291cmNlKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBVUkwgc3lzdGVtSWQgPSB1cmw7CisKKyAgICAgICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZChYTUxJbnB1dEZhY3RvcnkgeGlmKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlblN0cmVhbSgpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGlkeVhNTFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgeGlmLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzeXN0ZW1JZC50b0V4dGVybmFsRm9ybSgpLGlzKSwgaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlblN0cmVhbSgpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGlkeVhNTFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZShzeXN0ZW1JZC50b0V4dGVybmFsRm9ybSgpLGlzLGZhbHNlKSwgaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVVJMIGdldFN5c3RlbUlkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzeXN0ZW1JZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFNERG9jdW1lbnRTb3VyY2V9IGZyb20ge0BsaW5rIFhNTFN0cmVhbUJ1ZmZlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTRERvY3VtZW50U291cmNlIGNyZWF0ZShmaW5hbCBVUkwgc3lzdGVtSWQsIGZpbmFsIFhNTFN0cmVhbUJ1ZmZlciB4c2IpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTRERvY3VtZW50U291cmNlKCkgeworICAgICAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkKFhNTElucHV0RmFjdG9yeSB4aWYpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiB4c2IucmVhZEFzWE1MU3RyZWFtUmVhZGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiB4c2IucmVhZEFzWE1MU3RyZWFtUmVhZGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBVUkwgZ2V0U3lzdGVtSWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5c3RlbUlkOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvU2VydmVyUGlwZWxpbmVIb29rLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1NlcnZlclBpcGVsaW5lSG9vay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTk1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1NlcnZlclBpcGVsaW5lSG9vay5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlNlcnZlclBpcGVBc3NlbWJsZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5BYnN0cmFjdEZpbHRlclBpcGVJbXBsOworCisvKioKKyAqIEFsbG93IHRoZSBjb250YWluZXIgKHByaW1hcmlseSBHbGFzc2Zpc2gpIHRvIGluamVjdAorICogdGhlaXIgb3duIHBpcGVzIGludG8gdGhlIHBpcGVsaW5lLgorICoKKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaGFzIGEgcmF0aGVyIGFkLWhvYyBzZXQgb2YgbWV0aG9kcywgYmVjYXVzZQorICogd2UgZGlkbid0IHdhbnQgdG8gZGVmaW5lIGFuIGF1dG9ub21vdXMgcGlwZS1hc3NlbWJseSBwcm9jZXNzLgorICogKFdlIHRob3VnaHQgdGhpcyBpcyBhIHNtYWxsZXIgZXZpbCBjb21wYXJlZCB0byB0aGF0LikKKyAqCisgKiA8cD4KKyAqIEpBWC1XUyBvYnRhaW5zIHRoaXMgdGhyb3VnaCB7QGxpbmsgQ29udGFpbmVyI2dldFNQSShDbGFzcyl9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlclBpcGVsaW5lSG9vayB7CisgICAgLyoqCisgICAgICogQ2FsbGVkIGR1cmluZyB0aGUgcGlwZWxpbmUgY29uc3RydWN0aW9uIHByb2Nlc3Mgb25jZSB0byBhbGxvdyBhIGNvbnRhaW5lcgorICAgICAqIHRvIHJlZ2lzdGVyIGEgcGlwZSBmb3IgbW9uaXRvcmluZy4KKyAgICAgKgorICAgICAqIFRoaXMgcGlwZSB3aWxsIGJlIGluamVjdGVkIHRvIGEgcG9pbnQgdmVyeSBjbG9zZSB0byB0aGUgdHJhbnNwb3J0LCBhbGxvd2luZworICAgICAqIGl0IHRvIG1lYXN1cmUgdGhlIHRpbWUgaXQgdGFrZXMgZm9yIHByb2Nlc3NpbmcgYXMgd2VsbCBhcyBkZXRlY3RpbmcgZXJyb3JzLgorICAgICAqCisgICAgICogQHBhcmFtIGN0eHQKKyAgICAgKiAgICAgIFJlcHJlc2VudHMgYWJzdHJhY3Rpb24gb2YgU0VJLCBXU0RMIGFic3RyYWN0aW9uIGV0Yy4gQ29udGV4dCBjYW4gYmUgdXNlZAorICAgICAqICAgICAgd2hldGhlciBhZGQgYSBuZXcgcGlwZSB0byB0aGUgaGVhZCBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFpbAorICAgICAqICAgICAgSGVhZCBvZiB0aGUgcGFydGlhbGx5IGNvbnN0cnVjdGVkIHBpcGVsaW5lLiBJZiB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgIHdpc2hlcyB0byBhZGQgbmV3IHBpcGVzLCBpdCBzaG91bGQgZG8gc28gYnkgZXh0ZW5kaW5nCisgICAgICogICAgICB7QGxpbmsgQWJzdHJhY3RGaWx0ZXJQaXBlSW1wbH0gYW5kIG1ha2luZyBzdXJlIHRoYXQgdGhpcyB7QGxpbmsgUGlwZX0KKyAgICAgKiAgICAgIGV2ZW50dWFsbHkgcHJvY2Vzc2VzIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIDx0dD50YWlsPC90dD4sIHdoaWNoIG1lYW5zCisgICAgICogICAgICBubyBhZGRpdGlvbmFsIHBpcGUgaXMgaW5zZXJ0ZWQuIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBhZGRzCisgICAgICogICAgICBuZXcgcGlwZXMsIHJldHVybiB0aGUgbmV3IGhlYWQgcGlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgUGlwZSBjcmVhdGVNb25pdG9yaW5nUGlwZShTZXJ2ZXJQaXBlQXNzZW1ibGVyQ29udGV4dCBjdHh0LCBATm90TnVsbCBQaXBlIHRhaWwpIHsKKyAgICAgICAgcmV0dXJuIHRhaWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGR1cmluZyB0aGUgcGlwZWxpbmUgY29uc3RydWN0aW9uIHByb2Nlc3Mgb25jZSB0byBhbGxvdyBhIGNvbnRhaW5lcgorICAgICAqIHRvIHJlZ2lzdGVyIGEgcGlwZSBmb3Igc2VjdXJpdHkuCisgICAgICoKKyAgICAgKiBUaGlzIHBpcGUgd2lsbCBiZSBpbmplY3RlZCB0byBhIHBvaW50IHZlcnkgY2xvc2UgdG8gdGhlIHRyYW5zcG9ydCwgYWxsb3dpbmcKKyAgICAgKiBpdCB0byBkbyBzb21lIHNlY3VyaXR5IG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4dAorICAgICAqICAgICAgUmVwcmVzZW50cyBhYnN0cmFjdGlvbiBvZiBTRUksIFdTREwgYWJzdHJhY3Rpb24gZXRjLiBDb250ZXh0IGNhbiBiZSB1c2VkCisgICAgICogICAgICB3aGV0aGVyIGFkZCBhIG5ldyBwaXBlIHRvIHRoZSBoZWFkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWlsCisgICAgICogICAgICBIZWFkIG9mIHRoZSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQgcGlwZWxpbmUuIElmIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqICAgICAgd2lzaGVzIHRvIGFkZCBuZXcgcGlwZXMsIGl0IHNob3VsZCBkbyBzbyBieSBleHRlbmRpbmcKKyAgICAgKiAgICAgIHtAbGluayBBYnN0cmFjdEZpbHRlclBpcGVJbXBsfSBhbmQgbWFraW5nIHN1cmUgdGhhdCB0aGlzIHtAbGluayBQaXBlfQorICAgICAqICAgICAgZXZlbnR1YWxseSBwcm9jZXNzZXMgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgPHR0PnRhaWw8L3R0Piwgd2hpY2ggbWVhbnMKKyAgICAgKiAgICAgIG5vIGFkZGl0aW9uYWwgcGlwZSBpcyBpbnNlcnRlZC4gSWYgdGhlIGltcGxlbWVudGF0aW9uIGFkZHMKKyAgICAgKiAgICAgIG5ldyBwaXBlcywgcmV0dXJuIHRoZSBuZXcgaGVhZCBwaXBlLgorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBQaXBlIGNyZWF0ZVNlY3VyaXR5UGlwZShTZXJ2ZXJQaXBlQXNzZW1ibGVyQ29udGV4dCBjdHh0LCBATm90TnVsbCBQaXBlIHRhaWwpIHsKKyAgICAgICAgcmV0dXJuIHRhaWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9TZXJ2aWNlRGVmaW5pdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9TZXJ2aWNlRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTEzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1NlcnZpY2VEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNb2RlbDsKKworLyoqCisgKiBSb290IG9mIHRoZSB1bnBhcnNlZCBXU0RMIGFuZCBvdGhlciByZXNvdXJjZXMgcmVmZXJlbmNlZCBmcm9tIGl0LgorICogVGhpcyBvYmplY3QgcmVwcmVzZW50cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlcnZpY2UKKyAqIHRoYXQgYSB7QGxpbmsgV1NFbmRwb2ludH0gb2ZmZXJzLgorICoKKyAqIDxwPgorICogQSBkZXNjcmlwdGlvbiBjb25zaXN0cyBvZiBhIHNldCBvZiB7QGxpbmsgU0REb2N1bWVudH0sIHdoaWNoCisgKiBlYWNoIHJlcHJlc2VudHMgYSBzaW5nbGUgWE1MIGRvY3VtZW50IHRoYXQgZm9ybXMgYSBwYXJ0IG9mIHRoZQorICogZGVzY3JpcHRvciAoZm9yIGV4YW1wbGUsIFdTREwgbWlnaHQgcmVmZXIgdG8gc2VwYXJhdGUgc2NoZW1hIGRvY3VtZW50cywKKyAqIG9yIGEgV1NETCBtaWdodCByZWZlciB0byBhbm90aGVyIFdTREwuKQorICoKKyAqIDxwPgorICoge0BsaW5rIFNlcnZpY2VEZWZpbml0aW9ufSBhbmQgaXRzIGRlc2NlbmRhbnRzIGFyZSBpbW11dGFibGUKKyAqIHJlYWQtb25seSBvYmplY3RzLiBPbmNlIHRoZXkgYXJlIGNyZWF0ZWQsIHRoZXkgYWx3YXlzIHJldHVybgorICogdGhlIHNhbWUgdmFsdWUuCisgKgorICogPGgyPkV4cGVjdGVkIFVzYWdlPC9oMj4KKyAqIDxwPgorICogVGhpcyBvYmplY3QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igc2VydmluZyB0aGUgZGVzY3JpcHRvcnMKKyAqIHRvIHJlbW90ZSBjbGllbnRzIChzdWNoIGFzIGJ5IE1FWCwgb3Igb3RoZXIgcHJvdG9jb2wtc3BlY2lmaWMKKyAqIG1ldGFkYXRhIHF1ZXJ5LCBzdWNoIGFzIEhUVFAgR0VUIHdpdGggIj93c2RsIiBxdWVyeSBzdHJpbmcuKQorICoKKyAqIDxwPgorICogVGhpcyBvYmplY3QgaXMgPGI+Tk9UPC9iPiBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyCisgKiBpbnRlcm5hbCBjb21wb25lbnRzIHRvIHBhcnNlIHRoZW0uIEZvciB0aGF0IHB1cnBvc2UsIHVzZQorICoge0BsaW5rIFdTRExNb2RlbH0gaW5zdGVhZC4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VydmljZURlZmluaXRpb24gZXh0ZW5kcyBJdGVyYWJsZTxTRERvY3VtZW50PiB7CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgInByaW1hcnkiIHtAbGluayBTRERvY3VtZW50fSB0aGF0IHJlcHJlc2VudHMgYSBXU0RMLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBXU0RMIGV2ZW50dWFsbHkgcmVmZXJzIHRvIGFsbCB0aGUgb3RoZXIge0BsaW5rIFNERG9jdW1lbnR9cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGFsd2F5cyBub24tbnVsbC4KKyAgICAgKi8KKyAgICBATm90TnVsbCBTRERvY3VtZW50IGdldFByaW1hcnkoKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmaWx0ZXIgdGhhdCBpcyBjYWxsZWQgd2hpbGUgd3JpdGluZyB7QGxpbmsgU0REb2N1bWVudH0ncyBpbmZvc2V0LiBUaGlzCisgICAgICogZmlsdGVyIGlzIGFwcGxpZWQgdG8gdGhlIGFsbCB0aGUgb3RoZXIgcmVhY2hhYmxlIHtAbGluayBTRERvY3VtZW50fXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyIHRoYXQgaXMgY2FsbGVkIHdoaWxlIHdyaXRpbmcgdGhlIGRvY3VtZW50CisgICAgICovCisgICAgdm9pZCBhZGRGaWx0ZXIoQE5vdE51bGwgU0REb2N1bWVudEZpbHRlciBmaWx0ZXIpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9UcmFuc3BvcnRCYWNrQ2hhbm5lbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9UcmFuc3BvcnRCYWNrQ2hhbm5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODY3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1RyYW5zcG9ydEJhY2tDaGFubmVsLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU0VuZHBvaW50LlBpcGVIZWFkOworCisvKioKKyAqIFJlcHJlc2VudHMgYSB0cmFuc3BvcnQgYmFjay1jaGFubmVsLgorICoKKyAqIDxwPgorICogV2hlbiB0aGUgSkFYLVdTIHJ1bnRpbWUgZmluZHMgb3V0IHRoYXQgdGhlIHJlcXVlc3QKKyAqIHtAbGluayBQYWNrZXR9IGJlaW5nIHByb2Nlc3NlZCBpcyBrbm93biBub3QgdG8gcHJvZHVjZQorICogYSByZXNwb25zZSwgaXQgaW52b2tlcyB0aGUge0BsaW5rICNjbG9zZSgpfSBtZXRob2QKKyAqIHRvIGluZGljYXRlIHRoYXQgdGhlIHRyYW5zcG9ydCBkb2VzIG5vdCBuZWVkIHRvIGtlZXAKKyAqIHRoZSBjaGFubmVsIGZvciB0aGUgcmVzcG9uc2UgbWVzc2FnZSBvcGVuLgorICoKKyAqIDxwPgorICogVGhpcyBhbGxvd3MgdGhlIHRyYW5zcG9ydCB0byBjbG9zZSBkb3duIHRoZSBjb21tdW5pY2F0aW9uCisgKiBjaGFubmVsIHNvb25lciB0aGFuIHdhaW50aW5nIGZvcgorICoge0BsaW5rIFBpcGVIZWFkI3Byb2Nlc3N9CisgKiBtZXRob2QgdG8gcmV0dXJuLCB0aGVyZWJ5IGltcHJvdmluZyB0aGUgb3ZlcmFsbCB0aHJvdWdocHV0CisgKiBvZiB0aGUgc3lzdGVtLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgSml0dQorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zcG9ydEJhY2tDaGFubmVsIHsKKyAgICAvKioKKyAgICAgKiBTZWUgdGhlIGNsYXNzIGphdmFkb2MgZm9yIHRoZSBkaXNjdXNzaW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSkFYLVdTIGlzIG5vdCBndWFyYW50ZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZm9yIGFsbAorICAgICAqIG9wZXJhdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBhIHJlc3BvbnNlLiBUaGlzIGlzIG1lcmVseQorICAgICAqIGEgaGludC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGZhaWxzIHRvIGNsb3NlCisgICAgICogdGhlIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bHksIGl0IHNob3VsZCByZWNvcmQgdGhlIGVycm9yLAorICAgICAqIGFuZCByZXR1cm4gbm9ybWFsbHkuIERvIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9uLgorICAgICAqLworICAgIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvV1NFbmRwb2ludC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9XU0VuZHBvaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5ZTAzMwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvV1NFbmRwb2ludC5qYXZhCkBAIC0wLDAgKzEsNDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkVuZ2luZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5GaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5TZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5FbmRwb2ludEZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKKworLyoqCisgKiBSb290IG9iamVjdCB0aGF0IGhvc3RzIHRoZSB7QGxpbmsgUGFja2V0fSBwcm9jZXNzaW5nIGNvZGUKKyAqIGF0IHRoZSBzZXJ2ZXIuCisgKgorICogPHA+CisgKiBPbmUgaW5zdGFuY2Ugb2Yge0BsaW5rIFdTRW5kcG9pbnR9IGlzIGNyZWF0ZWQgZm9yIGVhY2ggZGVwbG95ZWQgc2VydmljZQorICogZW5kcG9pbnQuIEEgaG9zdGVkIHNlcnZpY2UgdXN1YWxseSBoYW5kbGVzIG11bHRpcGxlIGNvbmN1cnJlbnQKKyAqIHJlcXVlc3RzLiBUbyBkbyB0aGlzIGVmZmljaWVudGx5LCBhbiBlbmRwb2ludCBoYW5kbGVzIGluY29taW5nCisgKiB7QGxpbmsgUGFja2V0fSB0aHJvdWdoIHtAbGluayBQaXBlSGVhZH1zLCB3aGVyZSBtYW55IGNvcGllcyBjYW4gYmUgY3JlYXRlZAorICogZm9yIGVhY2ggZW5kcG9pbnQuCisgKgorICogPHA+CisgKiBFYWNoIHtAbGluayBQaXBlSGVhZH0gaXMgdGhyZWFkLXVuc2FmZSwgYW5kIHJlcXVlc3QgbmVlZHMgdG8gYmUKKyAqIHNlcmlhbGl6ZWQuIEEge0BsaW5rIFBpcGVIZWFkfSByZXByZXNlbnRzIGEgc2l6YWJsZSByZXNvdXJjZQorICogKGluIHBhcnRpY3VsYXIgYSB3aG9sZSBwaXBlbGluZSksIHNvIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8KKyAqIHJldXNlIHRoZW0gYW5kIGF2b2lkIGV4Y2Vzc2l2ZSBhbGxvY2F0aW9ucyBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICogTWFraW5nIHtAbGluayBQaXBlSGVhZH1zIHRocmVhZC11bnNhZmUgYWxsb3cgdGhlIEpBWC1XUyBSSSBpbnRlcm5hbCB0bworICogdGllIHRocmVhZC1sb2NhbCByZXNvdXJjZXMgdG8ge0BsaW5rIFBpcGVIZWFkfSwgYW5kIHJlZHVjZSB0aGUgdG90YWwKKyAqIHJlc291cmNlIG1hbmFnZW1lbnQgb3ZlcmhlYWQuCisgKgorICogPHA+CisgKiBUbyBhYmJyZXZpYXRlIHRoaXMgcmVzb3VyY2UgbWFuYWdlbWVudCAoYW5kIGZvciBhIGZldyBvdGhlciByZWFzb25zKSwKKyAqIEpBWC1XUyBSSSBwcm92aWRlcyB7QGxpbmsgQWRhcHRlcn0gY2xhc3MuIElmIHlvdSBhcmUgaG9zdGluZyBhIEpBWC1XUworICogc2VydmljZSwgeW91J2xsIG1vc3QgbGlrZWx5IHdhbnQgdG8gc2VuZCByZXF1ZXN0cyB0byB7QGxpbmsgV1NFbmRwb2ludH0KKyAqIHRocm91Z2gge0BsaW5rIEFkYXB0ZXJ9LgorICoKKyAqIDxwPgorICoge0BsaW5rIFdTRW5kcG9pbnR9IGlzIHJlYWR5IHRvIGhhbmRsZSB7QGxpbmsgUGFja2V0fXMgYXMgc29vbiBhcworICogaXQncyBjcmVhdGVkLiBObyBzZXBhcmF0ZSBwb3N0LWluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbmVjZXNzYXJ5LgorICogSG93ZXZlciwgdG8gY29tcGx5IHdpdGggdGhlIEpBWC1XUyBzcGVjIHJlcXVpcmVtZW50LCB0aGUgY2FsbGVyCisgKiBpcyBleHBlY3RlZCB0byBjYWxsIHRoZSB7QGxpbmsgI2Rpc3Bvc2UoKX0gbWV0aG9kIHRvIGFsbG93IGFuCisgKiBvcmRlcmx5IHNodXQtZG93biBvZiBhIGhvc3RlZCBzZXJ2aWNlLgorICoKKyAqCisgKgorICogPGgzPk9iamVjdHMgRXhwb3NlZCBGcm9tIEVuZHBvaW50PC9oMz4KKyAqIDxwPgorICoge0BsaW5rIFdTRW5kcG9pbnR9IGV4cG9zZXMgYSBzZXJpZXMgb2YgaW5mb3JtYXRpb24gdGhhdCByZXByZXNlbnRzCisgKiBob3cgYW4gZW5kcG9pbnQgaXMgY29uZmlndXJlZCB0byBob3N0IGEgc2VydmljZS4gU2VlIHRoZSBnZXRYWFggbWV0aG9kcworICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICoKKyAqIDxoMz5JbXBsZW1lbnRhdGlvbiBOb3RlczwvaDM+CisgKiA8cD4KKyAqIHtAbGluayBXU0VuZHBvaW50fSBvd25zIGEge0BsaW5rIFdTV2ViU2VydmljZUNvbnRleHR9IGltcGxlbWVudGF0aW9uLgorICogQnV0IGEgYnVsayBvZiB0aGUgd29yayBpcyBkZWxlZ2F0ZWQgdG8ge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGV9LAorICogd2hpY2ggaXMgcGFzc2VkIGluIGFzIGEgcGFyYW1ldGVyIHRvIHtAbGluayBQaXBlSGVhZCNwcm9jZXNzKFBhY2tldCwgV2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZSwgVHJhbnNwb3J0QmFja0NoYW5uZWwpfS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0VuZHBvaW50PFQ+IHsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIEVuZHBvaW50J3MgY29kZWMgdGhhdCBpcyB1c2VkIHRvIGVuY29kZS9kZWNvZGUge0BsaW5rIE1lc3NhZ2V9cy4gVGhpcyBpcyBhCisgICAgICogY29weSBvZiB0aGUgbWFzdGVyIGNvZGVjIGFuZCBpdCBzaG91bGRuJ3QgYmUgc2hhcmVkIGFjcm9zcyB0d28gcmVxdWVzdHMgcnVubmluZworICAgICAqIGNvbmN1cnJlbnRseSh1bmxlc3MgaXQgaXMgc3RhdGVsZXNzKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29kZWMgdG8gZW5jb2RlL2RlY29kZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBDb2RlYyBjcmVhdGVDb2RlYygpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXBwbGljYXRpb24gZW5kcG9pbnQncyBzZXJ2aWNlTmFtZS4gSXQgY291bGQgYmUgZ290IGZyb20gREQgb3IgYW5ub3RhdGlvbnMKKyAgICAgKgorICAgICAqIEByZXR1cm4gc2FtZSBhcyB3c2RsOnNlcnZpY2UgUU5hbWUgaWYgV1NETCBleGlzdHMgb3IgZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOb3ROdWxsIFFOYW1lIGdldFNlcnZpY2VOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhcHBsaWNhdGlvbiBlbmRwb2ludCdzIHBvcnROYW1lLiBJdCBjb3VsZCBiZSBnb3QgZnJvbSBERCBvciBhbm5vdGF0aW9ucworICAgICAqCisgICAgICogQHJldHVybiBzYW1lIGFzIHdzZGw6cG9ydCBRTmFtZSBpZiBXU0RMIGV4aXN0cyBvciBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE5vdE51bGwgUU5hbWUgZ2V0UG9ydE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFwcGxpY2F0aW9uIGVuZHBvaW50IHtAbGluayBDbGFzc30gdGhhdCBldmVudHVhbGx5IHNlcnZlcyB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgZ2l2ZW4gdG8gdGhlIHtAbGluayAjY3JlYXRlfSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOb3ROdWxsIENsYXNzPFQ+IGdldEltcGxlbWVudGF0aW9uQ2xhc3MoKTsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIGJpbmRpbmcgZm9yIHdoaWNoIHRoaXMge0BsaW5rIFdTRW5kcG9pbnR9CisgICAgICogaXMgY3JlYXRlZCBmb3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgc2FtZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOb3ROdWxsIFdTQmluZGluZyBnZXRCaW5kaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgQ29udGFpbmVyfSBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29tcG9uZW50cyBpbnNpZGUge0BsaW5rIFdTRW5kcG9pbnR9IHVzZXMgdGhpcyByZWZlcmVuY2UKKyAgICAgKiB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBob3N0aW5nIGVudmlyb25tZW50LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYWx3YXlzIHNhbWUgb2JqZWN0LiBJZiBubyAicmVhbCIge0BsaW5rIENvbnRhaW5lcn0gaW5zdGFuY2UKKyAgICAgKiAgICAgIGlzIGdpdmVuLCB7QGxpbmsgQ29udGFpbmVyI05PTkV9IHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOb3ROdWxsIENvbnRhaW5lciBnZXRDb250YWluZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBvcnQgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHNlcnZpbmcuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIHNlcnZpY2UgaXMgbm90IHJlcXVpcmVkIHRvIGhhdmUgYSBXU0RMLCBhbmQgd2hlbiBpdCBkb2Vzbid0LAorICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgYW4gb2JqZWN0IHRoYXQKKyAgICAgKiBkZXNjcmliZXMgdGhlIHBvcnQgdGhhdCB0aGlzIHtAbGluayBXU0VuZHBvaW50fSBpcyBzZXJ2aW5nLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgUG9zc2libHkgbnVsbCwgYnV0IGFsd2F5cyB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE51bGxhYmxlIFdTRExQb3J0IGdldFBvcnQoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIHtAbGluayBFeGVjdXRvcn0gdG8gcnVuIGFzeW5jaHJvbm91cyByZXF1ZXN0cyB1c2luZyB0aGlzIGV4ZWN1dG9yLgorICAgICAqIFRoaXMgZXhlY3V0b3IgaXMgc2V0IG9uIHtAbGluayBFbmdpbmV9IGFuZCBtdXN0IGJlIHNldCBiZWZvcmUKKyAgICAgKiBjYWxsaW5nIHtAbGluayAjc2NoZWR1bGUoUGFja2V0LENvbXBsZXRpb25DYWxsYmFjaykgfSBhbmQKKyAgICAgKiB7QGxpbmsgI3NjaGVkdWxlKFBhY2tldCxDb21wbGV0aW9uQ2FsbGJhY2ssRmliZXJDb250ZXh0U3dpdGNoSW50ZXJjZXB0b3IpfSBtZXRob2RzLgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZWMgRXhlY3V0b3IgdG8gcnVuIGFzeW5jIHJlcXVlc3RzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhlY3V0b3IoQE5vdE51bGwgRXhlY3V0b3IgZXhlYyk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIHtAbGluayBQYWNrZXR9IHRoYXQgcmVwcmVzZW50cworICAgICAqIGEgcmVxdWVzdCwgcnVuIGl0IHRocm91Z2ggYSB7QGxpbmsgVHViZX1saW5lLCBldmVudHVhbGx5CisgICAgICogcGFzcyBpdCB0byB0aGUgdXNlciBpbXBsZW1lbnRhdGlvbiBjb2RlLCB3aGljaCBwcm9kdWNlcworICAgICAqIGEgcmVwbHksIHRoZW4gcnVuIHRoYXQgdGhyb3VnaCB0aGUgdHViZWxpbmUgYWdhaW4sCisgICAgICogYW5kIGV2ZW50dWFsbHkgcmV0dXJuIGl0IGFzIGEgcmV0dXJuIHZhbHVlIHRocm91Z2gge0BsaW5rIENvbXBsZXRpb25DYWxsYmFja30uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHRha2VzIGNhcmUgb2YgcG9vbGluZyBvZiB7QGxpbmsgVHViZX1saW5lcyBhbmQgcmV1c2VzCisgICAgICogdHViZWxpbmUgZm9yIHJlcXVlc3RzLiBTYW1lIGluc3RhbmNlIG9mIHR1YmVsaW5lIGlzIG5vdCB1c2VkIGNvbmN1cnJlbnRseQorICAgICAqIGZvciB0d28gcmVxdWVzdHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgdHJhbnNwb3J0IGlzIGNhcGFibGUgb2YgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbiwgdXNlIHRoaXMKKyAgICAgKiBpbnN0ZWFkIG9mIHVzaW5nIHtAbGluayBQaXBlSGVhZCNwcm9jZXNzfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBzZXQgdGhlIGV4ZWN1dG9yIHVzaW5nIHtAbGluayAjc2V0RXhlY3V0b3J9LiBUaGUKKyAgICAgKiBleGVjdXRvciBtYXkgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBydW4gdGhpcyByZXF1ZXN0IGluIGEgYXN5bmNocm9ub3VzIGZhc2hpb24uCisgICAgICogVGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHksIGFuZCB0aGUgY2FsbGJhY2sgd2lsbCBiZQorICAgICAqIGNhbGxlZCBpbiBhIGRpZmZlcmVudCBhIHRocmVhZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHtAbGluayBQYWNrZXQjdHJhbnNwb3J0QmFja0NoYW5uZWx9IHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlLCBzbyB0aGF0CisgICAgICogb25lLXdheSBtZXNzYWdlIHByb2Nlc3NpbmcgaGFwcGVucyBjb3JyZWN0bHkuIHtAbGluayBQYWNrZXQjd2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZX0KKyAgICAgKiBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSwgc28gdGhhdCBzb21lIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0gbWV0aG9kcyBjb3JyZWN0bHkuCisgICAgICoKKyAgICAgKiBAc2VlIHtAbGluayBQYWNrZXQjdHJhbnNwb3J0QmFja0NoYW5uZWx9CisgICAgICogQHNlZSB7QGxpbmsgUGFja2V0I3dlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGV9CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB3ZWIgc2VydmljZSByZXF1ZXN0CisgICAgICogQHBhcmFtIGNhbGxiYWNrIGNhbGxiYWNrIHRvIGdldCByZXNwb25zZSBwYWNrZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZShATm90TnVsbCBQYWNrZXQgcmVxdWVzdCwgQE5vdE51bGwgQ29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrICkgeworICAgICAgICBzY2hlZHVsZShyZXF1ZXN0LGNhbGxiYWNrLG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjaGVkdWxlIGludm9jYXRpb24gb2Ygd2ViIHNlcnZpY2UgYXN5bmNocm9ub3VzbHkuCisgICAgICoKKyAgICAgKiBAc2VlIHtAbGluayAjc2NoZWR1bGUoUGFja2V0LCBDb21wbGV0aW9uQ2FsbGJhY2spfQorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3Qgd2ViIHNlcnZpY2UgcmVxdWVzdAorICAgICAqIEBwYXJhbSBjYWxsYmFjayBjYWxsYmFjayB0byBnZXQgcmVzcG9uc2UgcGFja2V0KGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBvbmUpCisgICAgICogQHBhcmFtIGludGVyY2VwdG9yIGNhbGxlcidzIGludGVyY2VwdG9yIHRvIGltcG9zZSBhIGNvbnRleHQgb2YgZXhlY3V0aW9uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGUoQE5vdE51bGwgUGFja2V0IHJlcXVlc3QsIEBOb3ROdWxsIENvbXBsZXRpb25DYWxsYmFjayBjYWxsYmFjaywgQE51bGxhYmxlIEZpYmVyQ29udGV4dFN3aXRjaEludGVyY2VwdG9yIGludGVyY2VwdG9yICk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB0byBub3RpZnkgdGhhdCBqYXgtd3MgcnVudGltZSBoYXMgZmluaXNoZWQgZXhlY3V0aW9uIG9mIGEgcmVxdWVzdAorICAgICAqIHN1Ym1pdHRlZCB2aWEgc2NoZWR1bGUoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENvbXBsZXRpb25DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgamF4LXdzIHJ1bnRpbWUgaGFzIGZpbmlzaGVkIGV4ZWN1dGlvbiBvZiBhIHJlcXVlc3QKKyAgICAgICAgICogc3VibWl0dGVkIHZpYSBzY2hlZHVsZSgpLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogU2luY2UgdGhlIEpBWC1XUyBSSSBydW5zIGFzeW5jaHJvbm91c2x5LAorICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXliZSBpbnZva2VkIGJ5IGEgZGlmZmVyZW50IHRocmVhZAorICAgICAgICAgKiB0aGFuIGFueSBvZiB0aGUgdGhyZWFkcyB0aGF0IHN0YXJ0ZWQgaXQgb3IgcnVuIGEgcGFydCBvZiB0dWJlbGluZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlc3BvbnNlIHtAbGluayBQYWNrZXR9CisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQ29tcGxldGlvbihATm90TnVsbCBQYWNrZXQgcmVzcG9uc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFBpcGVIZWFkfSB0byBwcm9jZXNzCisgICAgICogaW5jb21pbmcgcmVxdWVzdHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIG5vdCBhIGNoZWFwIG9wZXJhdGlvbi4gVGhlIGNhbGxlciBpcyBleHBlY3RlZAorICAgICAqIHRvIHJldXNlIHRoZSByZXR1cm5lZCB7QGxpbmsgUGlwZUhlYWR9LiBTZWUKKyAgICAgKiB7QGxpbmsgV1NFbmRwb2ludCBjbGFzcyBqYXZhZG9jfSBmb3IgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIEEgbmV3bHkgY3JlYXRlZCB7QGxpbmsgUGlwZUhlYWR9IHRoYXQncyByZWFkeSB0byBzZXJ2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE5vdE51bGwgUGlwZUhlYWQgY3JlYXRlUGlwZUhlYWQoKTsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSByZXNvdXJjZSBsb2NhbCB0byBhIHRocmVhZC4KKyAgICAgKgorICAgICAqIFNlZSB7QGxpbmsgV1NFbmRwb2ludH0gY2xhc3MgamF2YWRvYyBmb3IgbW9yZSBkaXNjdXNzaW9uIGFib3V0CisgICAgICogdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFBpcGVIZWFkIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhIHJlcXVlc3QgYW5kIHByb2R1Y2VzIGEgcmVwbHkuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIHtAbGluayBQYWNrZXR9IHRoYXQgcmVwcmVzZW50cworICAgICAgICAgKiBhIHJlcXVlc3QsIHJ1biBpdCB0aHJvdWdoIGEge0BsaW5rIFR1YmV9bGluZSwgZXZlbnR1YWxseQorICAgICAgICAgKiBwYXNzIGl0IHRvIHRoZSB1c2VyIGltcGxlbWVudGF0aW9uIGNvZGUsIHdoaWNoIHByb2R1Y2VzCisgICAgICAgICAqIGEgcmVwbHksIHRoZW4gcnVuIHRoYXQgdGhyb3VnaCB0aGUgcGlwZWxpbmUgYWdhaW4sCisgICAgICAgICAqIGFuZCBldmVudHVhbGx5IHJldHVybiBpdCBhcyBhIHJldHVybiB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgICAgICogICAgICBVbmNvbnN1bWVkIHtAbGluayBQYWNrZXR9IHRoYXQgcmVwcmVzZW50cworICAgICAgICAgKiAgICAgIGEgcmVxdWVzdC4KKyAgICAgICAgICogQHBhcmFtIHdzY2QKKyAgICAgICAgICogICAgICB7QGxpbmsgV2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZX0gdG8gYmUgc2V0IHRvIHtAbGluayBQYWNrZXR9LgorICAgICAgICAgKiAgICAgICh3ZSBkaWRuJ3QgaGF2ZSB0byB0YWtlIHRoaXMgYW5kIGluc3RlYWQganVzdCBhc2sgdGhlIGNhbGxlciB0bworICAgICAgICAgKiAgICAgIHNldCB0byB7QGxpbmsgUGFja2V0I3dlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGV9LCBidXQgdGhhdCBmZWx0CisgICAgICAgICAqICAgICAgdG9vIGVycm9yIHByb25lLikKKyAgICAgICAgICogQHBhcmFtIHRiYworICAgICAgICAgKiAgICAgIHtAbGluayBUcmFuc3BvcnRCYWNrQ2hhbm5lbH0gdG8gYmUgc2V0IHRvIHtAbGluayBQYWNrZXR9LgorICAgICAgICAgKiAgICAgIFNlZSB0aGUge0Bjb2RlIHdzY2R9IHBhcmFtZXRlciBqYXZhZG9jIGZvciB3aHkgdGhpcyBpcyBhIHBhcmFtZXRlci4KKyAgICAgICAgICogICAgICBDYW4gYmUgbnVsbC4KKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKiAgICAgIFVuY29uc3VtZWQge0BsaW5rIFBhY2tldH0gdGhhdCByZXByZXNlbnRzCisgICAgICAgICAqICAgICAgYSByZXBseSB0byB0aGUgcmVxdWVzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgVGhpcyBtZXRob2QgPGI+ZG9lcyBub3Q8L2I+IHRocm93IGEge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259LgorICAgICAgICAgKiAgICAgIFRoZSB7QGxpbmsgV1NFbmRwb2ludH0gbXVzdCBhbHdheXMgcHJvZHVjZSBhIGZhdWx0IHtAbGluayBNZXNzYWdlfQorICAgICAgICAgKiAgICAgIGZvciBpdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgQSB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0gdGhyb3duIGZyb20gdGhpcyBtZXRob2QsIGluY2x1ZGluZworICAgICAgICAgKiAgICAgIHtAbGluayBXZWJTZXJ2aWNlRXhjZXB0aW9ufSwgbXVzdCBiZSB0cmVhdGVkIGFzIGEgYnVnIGluIHRoZQorICAgICAgICAgKiAgICAgIGNvZGUgKGluY2x1ZGluZyBKQVgtV1MgYW5kIGFsbCB0aGUgcGlwZSBpbXBsZW1lbnRhdGlvbnMpLCBub3QKKyAgICAgICAgICogICAgICBhbiBvcGVyYXRvciBlcnJvciBieSB0aGUgdXNlci4KKyAgICAgICAgICoKKyAgICAgICAgICogICAgICA8cD4KKyAgICAgICAgICogICAgICBUaGVyZWZvcmUsIGl0IHNob3VsZCBiZSByZWNvcmRlZCBieSB0aGUgY2FsbGVyIGluIGEgd2F5IHRoYXQKKyAgICAgICAgICogICAgICBhbGxvd3MgZGV2ZWxvcGVycyB0byBmaXggYSBidWcuCisgICAgICAgICAqLworICAgICAgICBATm90TnVsbCBQYWNrZXQgcHJvY2VzcygKKyAgICAgICAgICAgIEBOb3ROdWxsIFBhY2tldCByZXF1ZXN0LCBATnVsbGFibGUgV2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZSB3c2NkLCBATnVsbGFibGUgVHJhbnNwb3J0QmFja0NoYW5uZWwgdGJjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUge0BsaW5rIFdTRW5kcG9pbnR9IGlzIGFib3V0IHRvIGJlIHR1cm5lZCBvZmYsCisgICAgICogYW5kIHdpbGwgbm8gbG9uZ2VyIHNlcnZlIGFueSBwYWNrZXQgYW55bW9yZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGludm9rZWQgZm9yIHRoZSBKQVgtV1MgUkkgdG8gY29ycmVjdGx5CisgICAgICogaW1wbGVtZW50IHNvbWUgb2YgdGhlIHNwZWMgc2VtYW50aWNzIChUT0RPOiBwb2ludGVyLikKKyAgICAgKiBJdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY29kZSB0aGF0IGhvc3RzIGEge0BsaW5rIFdTRW5kcG9pbnR9CisgICAgICogdG8gaW52b2tlIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogPHA+CisgICAgICogT25jZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmVkIGZvcgorICAgICAqIGFsbCBpbi1wcm9ncmVzcyB7QGxpbmsgUGlwZUhlYWQjcHJvY2Vzc30gbWV0aG9kcyAoYnkgb3RoZXIgdGhyZWFkcykKKyAgICAgKiBhbmQgZnV0dXJlIHtAbGluayBQaXBlSGVhZCNwcm9jZXNzfSBtZXRob2QgaW52b2NhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcG9zZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlc2NyaXB0aW9uIGlzIGEgc2V0IG9mIFdTREwvc2NoZW1hIGFuZCBvdGhlciBkb2N1bWVudHMgdGhhdCB0b2dldGhlcgorICAgICAqIGRlc2NyaWJlcyBhIHNlcnZpY2UuCisgICAgICogQSBzZXJ2aWNlIGlzIG5vdCByZXF1aXJlZCB0byBoYXZlIGEgZGVzY3JpcHRpb24sIGFuZCB3aGVuIGl0IGRvZXNuJ3QsCisgICAgICogdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgUG9zc2libHkgbnVsbCwgYnV0IGFsd2F5cyB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE51bGxhYmxlIFNlcnZpY2VEZWZpbml0aW9uIGdldFNlcnZpY2VEZWZpbml0aW9uKCk7CisKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbmRwb2ludCBmcm9tIGRlcGxveW1lbnQgb3IgcHJvZ3JhbW1hdGljIGNvbmZpZ3VyYXRpb24KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8b2w+CisgICAgICogPGxpPntAbGluayBTZXJ2aWNlRGVmaW5pdGlvbn0gaXMgbW9kZWxlZWQgZnJvbSB0aGUgZ2l2ZW4gU0VJIHR5cGUuCisgICAgICogPGxpPntAbGluayBJbnZva2VyfSB0aGF0IGFsd2F5cyBzZXJ2ZXMgPHR0PmltcGxlbWVudGF0aW9uT2JqZWN0PC90dD4gd2lsbCBiZSB1c2VkLgorICAgICAqIDwvb2w+CisgICAgICogQHBhcmFtIGltcGxUeXBlCisgICAgICogICAgICBFbmRwb2ludCBjbGFzcyhub3QgU0VJKS4gRW5wb2ludCBjbGFzcyBtdXN0IGhhdmUgQFdlYlNlcnZpY2Ugb3IgQFdlYlNlcnZpY2VQcm92aWRlcgorICAgICAqICAgICAgYW5ub3RhdGlvbi4KKyAgICAgKiBAcGFyYW0gcHJvY2Vzc0hhbmRsZXJBbm5vdGF0aW9uCisgICAgICogICAgICBGbGFnIHRvIGNvbnRyb2wgcHJvY2Vzc2luZyBvZiBASGFuZGxlckNoYWluIG9uIEltcGwgY2xhc3MKKyAgICAgKiAgICAgIGlmIHRydWUsIHByb2Nlc3NlcyBASGFuZGxlckNoYWluIG9uIEltcGwKKyAgICAgKiAgICAgIGlmIGZhbHNlLCBERCBtaWdodCBoYXZlIHNldCBIYW5kbGVyQ2hhaW4gbm8gbmVlZCB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0gaW52b2tlcgorICAgICAqICAgICAgUGFzcyBhbiBvYmplY3QgdG8gaW52b2tlIHRoZSBhY3R1YWwgZW5kcG9pbnQgb2JqZWN0LiBJZiBpdCBpcyBudWxsLCBhIGRlZmF1bHQKKyAgICAgKiAgICAgIGludm9rZXIgaXMgY3JlYXRlZCB1c2luZyB7QGxpbmsgSW5zdGFuY2VSZXNvbHZlciNjcmVhdGVEZWZhdWx0fS4gQXBwc2VydmVycworICAgICAqICAgICAgY291bGQgY3JlYXRlIGl0cyBvd24gaW52b2tlciB0byBkbyBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBsaWtlIHRyYW5zYWN0aW9ucywKKyAgICAgKiAgICAgIGludm9raW5nIHRoZSBlbmRwb2ludCB0aHJvdWdoIHByb3h5IGV0Yy4KKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUKKyAgICAgKiAgICAgIE9wdGlvbmFsIHNlcnZpY2UgbmFtZShtYXkgYmUgZnJvbSBERCkgdG8gb3ZlcnJpZGUgdGhlIG9uZSBnaXZlbiBieSB0aGUKKyAgICAgKiAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLiBJZiBpdCBpcyBudWxsLCBpdCB3aWxsIGJlIGRlcml2ZWQgZnJvbSBhbm5vdGF0aW9ucy4KKyAgICAgKiBAcGFyYW0gcG9ydE5hbWUKKyAgICAgKiAgICAgIE9wdGlvbmFsIHBvcnQgbmFtZShtYXkgYmUgZnJvbSBERCkgdG8gb3ZlcnJpZGUgdGhlIG9uZSBnaXZlbiBieSB0aGUKKyAgICAgKiAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLiBJZiBpdCBpcyBudWxsLCBpdCB3aWxsIGJlIGRlcml2ZWQgZnJvbSBhbm5vdGF0aW9ucy4KKyAgICAgKiBAcGFyYW0gY29udGFpbmVyCisgICAgICogICAgICBBbGxvd3MgdGVjaG5vbG9naWVzIHRoYXQgYXJlIGJ1aWx0IG9uIHRvcCBvZiBKQVgtV1Moc3VjaCBhcyBXU0lUKSBuZWVkcyB0bworICAgICAqICAgICAgbmVnb3RpYXRlIHByaXZhdGUgY29udHJhY3RzIGJldHdlZW4gdGhlbSBhbmQgdGhlIGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSBiaW5kaW5nCisgICAgICogICAgICBKQVgtV1MgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEJpbmRpbmd9LiBUaGlzIG9iamVjdCBjYW4gYmUgY3JlYXRlZCBieQorICAgICAqICAgICAge0BsaW5rIEJpbmRpbmdJRCNjcmVhdGVCaW5kaW5nKCl9LiBVc3VhbGx5IHRoZSBiaW5kaW5nIGNhbiBiZSBnb3QgZnJvbQorICAgICAqICAgICAgREQsIHtAbGluayBqYXZheC54bWwud3MuQmluZGluZ1R5cGV9LgorICAgICAqCisgICAgICoKKyAgICAgKiBUT0RPOiBERCBoYXMgYSBjb25maWd1cmF0aW9uIGZvciBNVE9NIHRocmVzaG9sZC4KKyAgICAgKiBNYXliZSB3ZSBuZWVkIHNvbWV0aGluZyBtb3JlIGdlbmVyaWMgc28gdGhhdCBvdGhlciB0ZWNobm9sb2dpZXMKKyAgICAgKiBsaWtlIFRhbmdvIGNhbiBnZXQgaW5mb3JtYXRpb24gZnJvbSBERC4KKyAgICAgKgorICAgICAqIFRPRE86IGRvZXMgaXQgcmVhbGx5IG1ha2Ugc2Vuc2UgZm9yIHRoaXMgdG8gdGFrZSBFbnRpdHlSZXNvbHZlcj8KKyAgICAgKiBHaXZlbiB0aGF0IGFsbCBtZXRhZGF0YSBoYXMgdG8gYmUgZ2l2ZW4gYXMgYSBsaXN0IGFueXdheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmltYXJ5V3NkbAorICAgICAqICAgICAgVGhlIHtAbGluayBTZXJ2aWNlRGVmaW5pdGlvbiNnZXRQcmltYXJ5KCkgcHJpbWFyeX0gV1NETC4KKyAgICAgKiAgICAgIElmIG51bGwsIGl0J2xsIGJlIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgU0VJIChpZiB0aGlzIGlzIGFuIFNFSSkKKyAgICAgKiAgICAgIG9yIG5vIFdTREwgaXMgYXNzb2NpYXRlZCAoaWYgaXQncyBhIHByb3ZpZGVyLikKKyAgICAgKiAgICAgIFRPRE86IHNob3VsZG4ndCB0aGUgaW1wbGVtZW50YXRpb24gZmluZCB0aGlzIGZyb20gdGhlIG1ldGFkYXRhIGxpc3Q/CisgICAgICogQHBhcmFtIG1ldGFkYXRhCisgICAgICogICAgICBPdGhlciBkb2N1bWVudHMgdGhhdCBiZWNvbWUge0BsaW5rIFNERG9jdW1lbnR9cy4gQ2FuIGJlIG51bGwuCisgICAgICogQHBhcmFtIHJlc29sdmVyCisgICAgICogICAgICBPcHRpb25hbCByZXNvbHZlciB1c2VkIHRvIGRlLXJlZmVyZW5jZSByZXNvdXJjZXMgcmVmZXJlbmNlZCBmcm9tCisgICAgICogICAgICBXU0RMLiBNdXN0IGJlIG51bGwgaWYgdGhlIHtAY29kZSB1cmx9IGlzIG51bGwuCisgICAgICogQHBhcmFtIGlzVHJhbnNwb3J0U3luY2hyb25vdXMKKyAgICAgKiAgICAgIElmIHRoZSBjYWxsZXIga25vd3MgdGhhdCB0aGUgcmV0dXJuZWQge0BsaW5rIFdTRW5kcG9pbnR9IGlzIGdvaW5nIHRvIGJlCisgICAgICogICAgICB1c2VkIGJ5IGEgc3luY2hyb25vdXMtb25seSB0cmFuc3BvcnQsIHRoZW4gaXQgbWF5IHBhc3MgaW4gPHR0PnRydWU8L3R0PgorICAgICAqICAgICAgdG8gYWxsb3cgdGhlIGNhbGxlZSB0byBwZXJmb3JtIGFuIG9wdGltaXphdGlvbiBiYXNlZCBvbiB0aGF0IGtub3dsZWRnZQorICAgICAqICAgICAgKHNpbmNlIG9mdGVuIHN5bmNocm9ub3VzIHZlcnNpb24gaXMgY2hlYXBlciB0aGFuIGFuIGFzeW5jaHJvbm91cyB2ZXJzaW9uLikKKyAgICAgKiAgICAgIFRoaXMgdmFsdWUgaXMgdmlzaWJsZSBmcm9tIHtAbGluayBTZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dCNpc1N5bmNocm9ub3VzKCl9LgorICAgICAqCisgICAgICogQHJldHVybiBuZXdseSBjb25zdHJ1Y3RlZCB7QGxpbmsgV1NFbmRwb2ludH0uCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGUgZW5kcG9pbnQgc2V0IHVwIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFdTRW5kcG9pbnQ8VD4gY3JlYXRlKAorICAgICAgICBATm90TnVsbCBDbGFzczxUPiBpbXBsVHlwZSwKKyAgICAgICAgYm9vbGVhbiBwcm9jZXNzSGFuZGxlckFubm90YXRpb24sCisgICAgICAgIEBOdWxsYWJsZSBJbnZva2VyIGludm9rZXIsCisgICAgICAgIEBOdWxsYWJsZSBRTmFtZSBzZXJ2aWNlTmFtZSwKKyAgICAgICAgQE51bGxhYmxlIFFOYW1lIHBvcnROYW1lLAorICAgICAgICBATnVsbGFibGUgQ29udGFpbmVyIGNvbnRhaW5lciwKKyAgICAgICAgQE51bGxhYmxlIFdTQmluZGluZyBiaW5kaW5nLAorICAgICAgICBATnVsbGFibGUgU0REb2N1bWVudFNvdXJjZSBwcmltYXJ5V3NkbCwKKyAgICAgICAgQE51bGxhYmxlIENvbGxlY3Rpb248PyBleHRlbmRzIFNERG9jdW1lbnRTb3VyY2U+IG1ldGFkYXRhLAorICAgICAgICBATnVsbGFibGUgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIsCisgICAgICAgIGJvb2xlYW4gaXNUcmFuc3BvcnRTeW5jaHJvbm91cykgeworICAgICAgICByZXR1cm4gRW5kcG9pbnRGYWN0b3J5LmNyZWF0ZUVuZHBvaW50KAorICAgICAgICAgICAgaW1wbFR5cGUscHJvY2Vzc0hhbmRsZXJBbm5vdGF0aW9uLCBpbnZva2VyLHNlcnZpY2VOYW1lLHBvcnROYW1lLGNvbnRhaW5lcixiaW5kaW5nLHByaW1hcnlXc2RsLG1ldGFkYXRhLHJlc29sdmVyLGlzVHJhbnNwb3J0U3luY2hyb25vdXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlcHJlY2F0ZWQgdmVyc2lvbiB0aGF0IGFzc3VtZXMgPHR0PmlzVHJhbnNwb3J0U3luY2hyb25vdXM9PWZhbHNlPC90dD4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFdTRW5kcG9pbnQ8VD4gY3JlYXRlKAorICAgICAgICBATm90TnVsbCBDbGFzczxUPiBpbXBsVHlwZSwKKyAgICAgICAgYm9vbGVhbiBwcm9jZXNzSGFuZGxlckFubm90YXRpb24sCisgICAgICAgIEBOdWxsYWJsZSBJbnZva2VyIGludm9rZXIsCisgICAgICAgIEBOdWxsYWJsZSBRTmFtZSBzZXJ2aWNlTmFtZSwKKyAgICAgICAgQE51bGxhYmxlIFFOYW1lIHBvcnROYW1lLAorICAgICAgICBATnVsbGFibGUgQ29udGFpbmVyIGNvbnRhaW5lciwKKyAgICAgICAgQE51bGxhYmxlIFdTQmluZGluZyBiaW5kaW5nLAorICAgICAgICBATnVsbGFibGUgU0REb2N1bWVudFNvdXJjZSBwcmltYXJ5V3NkbCwKKyAgICAgICAgQE51bGxhYmxlIENvbGxlY3Rpb248PyBleHRlbmRzIFNERG9jdW1lbnRTb3VyY2U+IG1ldGFkYXRhLAorICAgICAgICBATnVsbGFibGUgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShpbXBsVHlwZSxwcm9jZXNzSGFuZGxlckFubm90YXRpb24saW52b2tlcixzZXJ2aWNlTmFtZSxwb3J0TmFtZSxjb250YWluZXIsYmluZGluZyxwcmltYXJ5V3NkbCxtZXRhZGF0YSxyZXNvbHZlcixmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2FtZSBhcworICAgICAqIHtAbGluayAjY3JlYXRlKENsYXNzLCBib29sZWFuLCBJbnZva2VyLCBRTmFtZSwgUU5hbWUsIENvbnRhaW5lciwgV1NCaW5kaW5nLCBTRERvY3VtZW50U291cmNlLCBDb2xsZWN0aW9uLCBFbnRpdHlSZXNvbHZlcil9CisgICAgICogZXhjZXB0IHRoYXQgdGhpcyB2ZXJzaW9uIHRha2VzIGFuIHVybCBvZiB0aGUgPHR0PmpheC13cy1jYXRhbG9nLnhtbDwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIGNhdGFsb2dVcmwKKyAgICAgKiAgICAgIGlmIG5vdCBudWxsLCBhbiB7QGxpbmsgRW50aXR5UmVzb2x2ZXJ9IGlzIGNyZWF0ZWQgZnJvbSBpdCBhbmQgdXNlZC4KKyAgICAgKiAgICAgIG90aGVyd2lzZSBubyByZXNvbHV0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFdTRW5kcG9pbnQ8VD4gY3JlYXRlKAorICAgICAgICBATm90TnVsbCBDbGFzczxUPiBpbXBsVHlwZSwKKyAgICAgICAgYm9vbGVhbiBwcm9jZXNzSGFuZGxlckFubm90YXRpb24sCisgICAgICAgIEBOdWxsYWJsZSBJbnZva2VyIGludm9rZXIsCisgICAgICAgIEBOdWxsYWJsZSBRTmFtZSBzZXJ2aWNlTmFtZSwKKyAgICAgICAgQE51bGxhYmxlIFFOYW1lIHBvcnROYW1lLAorICAgICAgICBATnVsbGFibGUgQ29udGFpbmVyIGNvbnRhaW5lciwKKyAgICAgICAgQE51bGxhYmxlIFdTQmluZGluZyBiaW5kaW5nLAorICAgICAgICBATnVsbGFibGUgU0REb2N1bWVudFNvdXJjZSBwcmltYXJ5V3NkbCwKKyAgICAgICAgQE51bGxhYmxlIENvbGxlY3Rpb248PyBleHRlbmRzIFNERG9jdW1lbnRTb3VyY2U+IG1ldGFkYXRhLAorICAgICAgICBATnVsbGFibGUgVVJMIGNhdGFsb2dVcmwpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZSgKKyAgICAgICAgICAgIGltcGxUeXBlLHByb2Nlc3NIYW5kbGVyQW5ub3RhdGlvbixpbnZva2VyLHNlcnZpY2VOYW1lLHBvcnROYW1lLGNvbnRhaW5lcixiaW5kaW5nLHByaW1hcnlXc2RsLG1ldGFkYXRhLAorICAgICAgICAgICAgWG1sVXRpbC5jcmVhdGVFbnRpdHlSZXNvbHZlcihjYXRhbG9nVXJsKSxmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIHdzZGw6c2VydmljZSBkZWZhdWx0IG5hbWUgY29tcHV0ZWQgZnJvbSB0aGUgZW5kcG9pbnQgaW1wbGVtZW50YWl0b24gY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIFFOYW1lIGdldERlZmF1bHRTZXJ2aWNlTmFtZShDbGFzcyBlbmRwb2ludENsYXNzKXsKKyAgICAgICAgcmV0dXJuIEVuZHBvaW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZU5hbWUoZW5kcG9pbnRDbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIHdzZGw6c2VydmljZS93c2RsOnBvcnQgZGVmYXVsdCBuYW1lIGNvbXB1dGVkIGZyb20gdGhlIGVuZHBvaW50IGltcGxlbWVudGFpdG9uIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBRTmFtZSBnZXREZWZhdWx0UG9ydE5hbWUoQE5vdE51bGwgUU5hbWUgc2VydmljZU5hbWUsIENsYXNzIGVuZHBvaW50Q2xhc3MpeworICAgICAgICByZXR1cm4gRW5kcG9pbnRGYWN0b3J5LmdldERlZmF1bHRQb3J0TmFtZShzZXJ2aWNlTmFtZSwgZW5kcG9pbnRDbGFzcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1dTV2ViU2VydmljZUNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvV1NXZWJTZXJ2aWNlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Y2I2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1dTV2ViU2VydmljZUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKKworLyoqCisgKiB7QGxpbmsgV2ViU2VydmljZUNvbnRleHR9IHRoYXQgZXhwb3NlcyBKQVgtV1MgUkkgc3BlY2lmaWMgYWRkaXRpb25zLgorICoKKyAqIDxwPgorICoge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0fSBpbnN0YW5jZXMgdGhhdCBKQVgtV1MgaW5qZWN0cyBhbHdheXMKKyAqIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBKQVgtV1MgUkkgbWF5IGFkZCBtZXRob2RzIG9uIHRoaXMgaW50ZXJmYWNlLCBzbyBkbyBub3QgaW1wbGVtZW50CisgKiB0aGlzIGludGVyZmFjZSBpbiB5b3VyIGNvZGUsIG9yIHJpc2sge0BsaW5rIExpbmthZ2VFcnJvcn0uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdTV2ViU2VydmljZUNvbnRleHQgZXh0ZW5kcyBXZWJTZXJ2aWNlQ29udGV4dCB7CisgICAgLyoqCisgICAgICogT2J0YWlucyB0aGUgcmVxdWVzdCBwYWNrZXQgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQuCisgICAgICogQHJldHVybiBQYWNrZXQgZm9yIHRoZSByZXF1ZXN0CisgICAgICovCisgICAgQE51bGxhYmxlIFBhY2tldCBnZXRSZXF1ZXN0UGFja2V0KCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1dlYk1vZHVsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9XZWJNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWY1NjAzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9XZWJNb2R1bGUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CisKKy8qKgorICoge0BsaW5rIE1vZHVsZX0gdGhhdCBpcyBhbiBIVFRQIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAc2luY2UgMi4xIEVBMworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2ViTW9kdWxlIGV4dGVuZHMgTW9kdWxlIHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBob3N0LCBwb3J0LCBhbmQgY29udGV4dCBwYXRoIHBvcnRpb24gb2YgdGhpcyBtb2R1bGUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBpcyBhbiB3ZWIgYXBwbGlhdGlvbiBydW5uaW5nIGluIGEgc2VydmxldAorICAgICAqIGNvbnRhaW5lciAiaHR0cDovL215aG9zdC9teWFwcCIsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgorICAgICAqIHRoaXMgVVJJLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgZm9sbG93cyB0aGUgY29udmVudGlvbiBvZiB0aGUgPHR0Pkh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpPC90dD4sCisgICAgICogYW5kIGFjY2VwdHMgc3RyaW5ncyBsaWtlICJodHRwOi8vbXlob3N0IiAoZm9yIHdlYiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgZGVwbG95ZWQKKyAgICAgKiB0byB0aGUgcm9vdCBjb250ZXh0IHBhdGgpLCBvciAiaHR0cDovL215aG9zdC9mb29iYXIiIChmb3Igd2ViIGFwcGxpY2F0aW9ucworICAgICAqIHRoYXQgYXJlIGRlcGxveWVkIHRvIGNvbnRleHQgcGF0aCAiL2Zvb2JhciIpCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBOb3RpY2UgdGhhdCB0aGlzIG1ldGhvZCBpbnZvbHZlcyBpbiBkZXRlcm1pbmluZyB0aGUgbWFjaGluZSBuYW1lCisgICAgICogd2l0aG91dCByZWx5aW5nIG9uIEhUVFAgIkhvc3QiIGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE5vdE51bGwgU3RyaW5nIGdldENvbnRleHRQYXRoKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1dlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zZXJ2ZXIvV2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODY1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL1dlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworCitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCisvKioKKyAqIFRoaXMgb2JqZWN0IGlzIHNldCB0byB7QGxpbmsgUGFja2V0I3dlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGV9CisgKiB0byBzZXJ2ZSB7QGxpbmsgV2ViU2VydmljZUNvbnRleHR9IG1ldGhvZHMgZm9yIGEge0BsaW5rIFBhY2tldH0uCisgKgorICogPHA+CisgKiBXaGVuIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGNhbGxzIGEgbWV0aG9kIG9uIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0sCisgKiB0aGUgSkFYLVdTIFJJIGdvZXMgdG8gdGhlIHtAbGluayBQYWNrZXR9IHRoYXQgcmVwcmVzZW50cyB0aGUgcmVxdWVzdCwKKyAqIHRoZW4gY2hlY2sge0BsaW5rIFBhY2tldCN3ZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlfSwgYW5kIGZvcndhcmRzCisgKiB0aGUgbWV0aG9kIGNhbGxzIHRvIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlfS4KKyAqCisgKiA8cD4KKyAqIEFsbCB0aGUgbWV0aG9kcyBkZWZpbmVkIG9uIHRoaXMgaW50ZXJmYWNlIHRha2VzIHtAbGluayBQYWNrZXR9CisgKiAod2hvc2Uge0BsaW5rIFBhY2tldCN3ZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlfSBwb2ludHMgdG8KKyAqIHRoaXMgb2JqZWN0KSwgc28gdGhhdCBhIHNpbmdsZSBzdGF0ZWxlc3Mge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGV9CisgKiBjYW4gYmUgdXNlZCB0byBzZXJ2ZSBtdWx0aXBsZSBjb25jdXJyZW50IHtAbGluayBQYWNrZXR9cywKKyAqIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiB3aXNoZXMgdG8gZG8gc28uCisgKgorICogPHA+CisgKiAoSXQgaXMgYWxzbyBhbGxvd2VkIHRvIGNyZWF0ZSBvbmUgaW5zdGFuY2Ugb2YKKyAqIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlfSBmb3IgZWFjaCBwYWNrZXQsCisgKiBhbmQgdGh1cyBlZmZlY3RpdmVseSBpZ25vcmUgdGhlIHBhY2tldCBwYXJhbWV0ZXIuKQorICoKKyAqIDxwPgorICogQXR0YWNoaW5nIHRoaXMgb24gYSB7QGxpbmsgUGFja2V0fSBhbGxvd3Mge0BsaW5rIFBpcGV9cyB0bworICogaW50ZXJjZXB0IGFuZCByZXBsYWNlIHRoZW0sIGlmIHRoZXkgd2lzaC4KKyAqCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUgeworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0I2dldFVzZXJQcmluY2lwYWwoKX0KKyAgICAgKiBmb3IgdGhlIGdpdmVuIHBhY2tldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogICAgICBBbHdheXMgbm9uLW51bGwuIFNlZSBjbGFzcyBqYXZhZG9jLgorICAgICAqIEBzZWUgV2ViU2VydmljZUNvbnRleHQjZ2V0VXNlclByaW5jaXBhbCgpCisgICAgICovCisgICAgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoQE5vdE51bGwgUGFja2V0IHJlcXVlc3QpOworCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyB7QGxpbmsgV2ViU2VydmljZUNvbnRleHQjaXNVc2VySW5Sb2xlKFN0cmluZyl9CisgICAgICogZm9yIHRoZSBnaXZlbiBwYWNrZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqICAgICAgQWx3YXlzIG5vbi1udWxsLiBTZWUgY2xhc3MgamF2YWRvYy4KKyAgICAgKiBAc2VlIFdlYlNlcnZpY2VDb250ZXh0I2lzVXNlckluUm9sZShTdHJpbmcpCisgICAgICovCisgICAgYm9vbGVhbiBpc1VzZXJJblJvbGUoQE5vdE51bGwgUGFja2V0IHJlcXVlc3QsU3RyaW5nIHJvbGUpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kcG9pbnQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgImFkZHJlc3MiIG9mIGVuZHBvaW50cyBpcyBhbHdheXMgYWZmZWN0ZWQgYnkgYSBwYXJ0aWN1bGFyCisgICAgICogY2xpZW50IGJlaW5nIHNlcnZlZCwgaGVuY2UgaXQncyB1cCB0byB0cmFuc3BvcnQgdG8gcHJvdmlkZSB0aGlzCisgICAgICogaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqICAgICAgQWx3YXlzIG5vbi1udWxsLiBTZWUgY2xhc3MgamF2YWRvYy4KKyAgICAgKiBAcGFyYW0gZW5kcG9pbnQKKyAgICAgKiAgICAgIFRoZSBlbmRwb2ludCB3aG9zZSBhZGRyZXNzIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHRoaXMgbWV0aG9kIGNvdWxkIG5vdCBjb21wdXRlIHRoZSBhZGRyZXNzIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBBYnNvbHV0ZSBVUkwgb2YgdGhlIGVuZHBvaW50LiBUaGlzIHNob2xkIGJlIGFuIGFkZHJlc3MgdGhhdCB0aGUgY2xpZW50CisgICAgICogICAgICBjYW4gdXNlIHRvIHRhbGsgYmFjayB0byB0aGlzIHNhbWUgc2VydmljZSBsYXRlci4KKyAgICAgKgorICAgICAqIEBzZWUgV2ViU2VydmljZUNvbnRleHQjZ2V0RW5kcG9pbnRSZWZlcmVuY2UKKyAgICAgKi8KKyAgICBATm90TnVsbCBTdHJpbmcgZ2V0RVBSQWRkcmVzcyhATm90TnVsbCBQYWNrZXQgcmVxdWVzdCwgQE5vdE51bGwgV1NFbmRwb2ludCBlbmRwb2ludCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBwcmltYXJ5IFdTREwuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHRyYW5zcG9ydCBzdXBwb3J0cyBwdWJsaXNoaW5nIG9mIFdTREwgYnkgaXRzZWxmIChpbnN0ZWFkL2luIGFkZGl0aW9uIHRvIE1FWCksCisgICAgICogdGhlbiBpdCBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIEpBWC1XUyBSSSBjYW4KKyAgICAgKiB1c2UgdGhhdCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlLCBIVFRQIHRyYW5zcG9ydHMgb2Z0ZW4gdXNlIHRoZSBjb252ZW50aW9uIHtAY29kZSBnZXRFUFJBZGRyZXNzKCkrIj93c2RsIn0KKyAgICAgKiBmb3IgcHVibGlzaGluZyBXU0RMIG9uIEhUVFAuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTb21lIHRyYW5zcG9ydHMgbWF5IG5vdCBoYXZlIHN1Y2ggV1NETCBwdWJsaXNoaW5nIG1lY2hhbmlzbSBvbiBpdHMgb3duLgorICAgICAqIFRob3NlIHRyYW5zcG9ydHMgbWF5IGNob29zZSB0byByZXR1cm4gbnVsbCwgaW5kaWNhdGluZyB0aGF0IFdTREwKKyAgICAgKiBpcyBub3QgcHVibGlzaGVkLiBJZiBzdWNoIHRyYW5zcG9ydHMgYXJlIGFsd2F5cyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKKyAgICAgKiBvdGhlciB0cmFuc3BvcnRzIHRoYXQgc3VwcG9ydCBXU0RMIHB1Ymxpc2hpbmcgKHN1Y2ggYXMgU09BUC9UQ1AgdXNlZAorICAgICAqIHdpdGggU2VydmxldCB0cmFuc3BvcnQpLCB0aGVuIHN1Y2ggdHJhbnNwb3J0IG1heQorICAgICAqIGNob29zZSB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZsZXQgZW5kcG9pbnQgYnkge0BsaW5rIE1vZHVsZSNnZXRCb3VuZEVuZHBvaW50cygpfQorICAgICAqIGFuZCB0cnkgdG8gb2J0YWluIHRoZSBhZGRyZXNzIGZyb20gdGhlcmUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHV0IGEgbWV0YWRhdGEgcmVmZXJlbmNlIGluc2lkZSBhbiBFUFIsCisgICAgICogYW1vbmcgb3RoZXIgdGhpbmdzLiBDbGllbnRzIHRoYXQgZG8gbm90IHN1cHBvcnQgTUVYIHJlbHkgb24gdGhpcworICAgICAqIFdTREwgVVJMIHRvIHJldHJpZXZlIG1ldGFkYXRhLCBpdCBpcyBkZXNpcmFibGUgZm9yIHRyYW5zcG9ydHMgdG8gc3VwcG9ydAorICAgICAqIHRoaXMsIGJ1dCBub3QgbWFuZGF0b3J5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBuZXZlciBpbnZva2VkIGlmIHRoZSB7QGxpbmsgV1NFbmRwb2ludH0KKyAgICAgKiBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBXU0RMIHRvIGJlZ2luIHdpdGgKKyAgICAgKiAoSU9XIHtAbGluayBXU0VuZHBvaW50I2dldFNlcnZpY2VEZWZpbml0aW9uKCkgcmV0dXJuaW5nIG51bGx9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiAgICAgIEFsd2F5cyBub24tbnVsbC4gU2VlIGNsYXNzIGphdmFkb2MuCisgICAgICogQHBhcmFtIGVuZHBvaW50CisgICAgICogICAgICBUaGUgZW5kcG9pbnQgd2hvc2UgYWRkcmVzcyB3aWxsIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiB0aGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgbm90aW9uIG9mCisgICAgICogICAgICBXU0RMIHB1Ymxpc2hpbmcuCisgICAgICovCisgICAgQE51bGxhYmxlIFN0cmluZyBnZXRXU0RMQWRkcmVzcyhATm90TnVsbCBQYWNrZXQgcmVxdWVzdCwgQE5vdE51bGwgV1NFbmRwb2ludCBlbmRwb2ludCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc2VydmVyL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU2YjQzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3NlcnZlci9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qKgorICogQVBJcyBmb3IgaG9zdGluZyBKQVgtV1Mgc2VydmljZXMuCisgKgorICogSWYgeW91IGFyZSBuZXcgdG8gdGhlIGNvZGUsIHN0YXJ0IHdpdGgge0BsaW5rIFdTRW5kcG9pbnR9LgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc3RyZWFtaW5nL1hNTFN0cmVhbVJlYWRlckZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zdHJlYW1pbmcvWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGMzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc3RyZWFtaW5nL1hNTFN0cmVhbVJlYWRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmc7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxSZWFkZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9LgorICoKKyAqIDxwPgorICogVGhpcyB3cmFwcyB7QGxpbmsgWE1MSW5wdXRGYWN0b3J5fSBhbmQgYWxsb3dzIHVzIHRvIHJldXNlIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IGluc3RhbmNlcworICogd2hlbiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBATm90TnVsbCBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5IHRoZUluc3RhbmNlOworCisgICAgc3RhdGljIHsKKyAgICAgICAgWE1MSW5wdXRGYWN0b3J5IHhpZiA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICB4aWYuc2V0UHJvcGVydHkoWE1MSW5wdXRGYWN0b3J5LklTX05BTUVTUEFDRV9BV0FSRSwgdHJ1ZSk7CisgICAgICAgIHhpZi5zZXRQcm9wZXJ0eShYTUxJbnB1dEZhY3RvcnkuU1VQUE9SVF9EVEQsIGZhbHNlKTsKKworICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5IGY9bnVsbDsKKworICAgICAgICAvLyB0aGlzIHN5c3RlbSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoZSBwb29saW5nIGFsdG9nZXRoZXIsCisgICAgICAgIC8vIGluIGNhc2Ugc29tZW9uZSBoaXRzIGFuIGlzc3VlIHdpdGggcG9vbGluZyBpbiB0aGUgcHJvZHVjdGlvbiBzeXN0ZW0uCisgICAgICAgIGlmKCFCb29sZWFuLmdldEJvb2xlYW4oWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkrIi5ub1Bvb2wiKSkKKyAgICAgICAgICAgIGYgPSBaZXBoeXIubmV3SW5zdGFuY2UoeGlmKTsKKworICAgICAgICBpZihmPT1udWxsKSB7CisgICAgICAgICAgICAvLyBpcyB0aGlzIFdvb2RzdG94PworICAgICAgICAgICAgaWYoeGlmLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiY29tLmN0Yy53c3R4LnN0YXguV3N0eElucHV0RmFjdG9yeSIpKQorICAgICAgICAgICAgICAgIGYgPSBuZXcgV29vZHN0b3goeGlmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGY9PW51bGwpCisgICAgICAgICAgICBmID0gbmV3IERlZmF1bHQoeGlmKTsKKworICAgICAgICB0aGVJbnN0YW5jZSA9IGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSBzaW5nbGV0b24ge0BsaW5rIFhNTFN0cmVhbVJlYWRlckZhY3Rvcnl9IGluc3RhbmNlIHRoYXQKKyAgICAgKiB0aGUgSkFYLVdTIFJJIHVzZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChYTUxTdHJlYW1SZWFkZXJGYWN0b3J5IGYpIHsKKyAgICAgICAgaWYoZj09bnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB0aGVJbnN0YW5jZSA9IGY7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5IGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHRoZUluc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIGNyZWF0ZShJbnB1dFNvdXJjZSBzb3VyY2UsIGJvb2xlYW4gcmVqZWN0RFREcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ2hhciBzdHJlYW0gYXZhaWxhYmxlPworICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXRDaGFyYWN0ZXJTdHJlYW0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldCgpLmRvQ3JlYXRlKHNvdXJjZS5nZXRTeXN0ZW1JZCgpLCBzb3VyY2UuZ2V0Q2hhcmFjdGVyU3RyZWFtKCksIHJlamVjdERURHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCeXRlIHN0cmVhbSBhdmFpbGFibGU/CisgICAgICAgICAgICBpZiAoc291cmNlLmdldEJ5dGVTdHJlYW0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldCgpLmRvQ3JlYXRlKHNvdXJjZS5nZXRTeXN0ZW1JZCgpLCBzb3VyY2UuZ2V0Qnl0ZVN0cmVhbSgpLCByZWplY3REVERzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBvcGVuIFVSSQorICAgICAgICAgICAgcmV0dXJuIGdldCgpLmRvQ3JlYXRlKHNvdXJjZS5nZXRTeXN0ZW1JZCgpLCBuZXcgVVJMKHNvdXJjZS5nZXRTeXN0ZW1JZCgpKS5vcGVuU3RyZWFtKCkscmVqZWN0RFREcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInN0YXguY2FudENyZWF0ZSIsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBjcmVhdGUoQE51bGxhYmxlIFN0cmluZyBzeXN0ZW1JZCwgSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gcmVqZWN0RFREcykgeworICAgICAgICByZXR1cm4gZ2V0KCkuZG9DcmVhdGUoc3lzdGVtSWQsaW4scmVqZWN0RFREcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlKEBOdWxsYWJsZSBTdHJpbmcgc3lzdGVtSWQsIFJlYWRlciByZWFkZXIsIGJvb2xlYW4gcmVqZWN0RFREcykgeworICAgICAgICByZXR1cm4gZ2V0KCkuZG9DcmVhdGUoc3lzdGVtSWQscmVhZGVyLHJlamVjdERURHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3VsZCBiZSBpbnZva2VkIHdoZW4gdGhlIGNvZGUgZmluaXNoZWQgdXNpbmcgYW4ge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcmVjeWNsZWQgaW5zdGFuY2UgaW1wbGVtZW50cyB7QGxpbmsgUmVjeWNsZUF3YXJlfSwKKyAgICAgKiB7QGxpbmsgUmVjeWNsZUF3YXJlI29uUmVjeWNsZWQoKX0gd2lsbCBiZSBpbnZva2VkIHRvIGxldCB0aGUgaW5zdGFuY2UKKyAgICAgKiBrbm93IHRoYXQgaXQncyBiZWluZyByZWN5Y2xlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG5vdCBhIGhhcmQgcmVxdWlyZW1lbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbiBldmVyeSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfQorICAgICAqIGluc3RhbmNlLiBOb3QgZG9pbmcgc28ganVzdCByZWR1Y2VzIHRoZSBwZXJmb3JtYW5jZSBieSB0aHJvd2luZyBhd2F5CisgICAgICogcG9zc2libHkgcmV1c2FibGUgaW5zdGFuY2VzLiBTbyB0aGUgY2FsbGVyIHNob3VsZCBhbHdheXMgY29uc2lkZXIgdGhlIGVmZm9ydAorICAgICAqIGl0IHRha2VzIHRvIHJlY3ljbGUgdnMgdGhlIHBvc3NpYmxlIHBlcmZvcm1hbmNlIGdhaW4gYnkgZG9pbmcgc28uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgaW52a2VkIGJ5IG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LgorICAgICAqCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgIFRoZSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSBpbnN0YW5jZSB0aGF0IHRoZSBjYWxsZXIgZmluaXNoZWQgdXNpbmcuCisgICAgICogICAgICBUaGlzIGNvdWxkIGJlIGFueSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSBpbXBsZW1lbnRhdGlvbiwgbm90IGp1c3QKKyAgICAgKiAgICAgIHRoZSBvbmVzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gdGhpcyBmYWN0b3J5LiBTbyB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgIG9mIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgYXdhcmUgb2YgdGhhdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjeWNsZShYTUxTdHJlYW1SZWFkZXIgcikgeworICAgICAgICBnZXQoKS5kb1JlY3ljbGUocik7CisgICAgfQorCisgICAgLy8gaW1wbGVtZW50YXRpb25zCisKKyAgICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyZWFtUmVhZGVyIGRvQ3JlYXRlKFN0cmluZyBzeXN0ZW1JZCwgSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gcmVqZWN0RFREcyk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgWE1MU3RyZWFtUmVhZGVyIGRvQ3JlYXRlKFN0cmluZyBzeXN0ZW1JZCwgUmVhZGVyIHJlYWRlciwgYm9vbGVhbiByZWplY3REVERzKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRvUmVjeWNsZShYTUxTdHJlYW1SZWFkZXIgcik7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gdG8KKyAgICAgKiBiZSBub3RpZmllZCB3aGVuIGl0J3MgcmVjeWNsZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGEgZmlsdGVyaW5nIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IGFuIG9wcG9ydHVuaXR5IHRvCisgICAgICogcmVjeWNsZSBpdHMgaW5uZXIge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZWN5Y2xlQXdhcmUgeworICAgICAgICB2b2lkIG9uUmVjeWNsZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeX0gaW1wbGVtZW50YXRpb24gZm9yIFNKU1hQL0pBWFAgUkkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBaZXBoeXIgZXh0ZW5kcyBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBYTUxJbnB1dEZhY3RvcnkgeGlmOworCisgICAgICAgIHByaXZhdGUgZmluYWwgVGhyZWFkTG9jYWw8WE1MU3RyZWFtUmVhZGVyPiBwb29sID0gbmV3IFRocmVhZExvY2FsPFhNTFN0cmVhbVJlYWRlcj4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3VuIFN0QVggaW1wbCA8Y29kZT5YTUxSZWFkZXJJbXBsLnNldElucHV0U291cmNlKCk8L2NvZGU+IG1ldGhvZCB2aWEgcmVmbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIHNldElucHV0U291cmNlTWV0aG9kOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdW4gU3RBWCBpbXBsIDxjb2RlPlhNTFJlYWRlckltcGwucmVzZXQoKTwvY29kZT4gbWV0aG9kIHZpYSByZWZsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgcmVzZXRNZXRob2Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBTdW4gU3RBWCBpbXBsJ3Mge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gaW1wbGVtZW50YXRpb24gY2xhcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgemVwaHlyQ2xhc3M7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMge0BsaW5rIFplcGh5cn0gaW5zdGFuY2UgaWYgdGhlIGdpdmVuIHtAbGluayBYTUxJbnB1dEZhY3Rvcnl9IGlzIHRoZSBvbmUKKyAgICAgICAgICogZnJvbSBaZXBoeXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZQorICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5IG5ld0luc3RhbmNlKFhNTElucHV0RmFjdG9yeSB4aWYpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgZnJvbSBaZXBoeXIKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSB4aWYuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIjxmb28vPiIpKS5nZXRDbGFzcygpOworCisgICAgICAgICAgICAgICAgaWYoIWNsYXp6LmdldE5hbWUoKS5zdGFydHNXaXRoKCJjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uIikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAvLyBub3BlCisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFplcGh5cih4aWYsY2xhenopOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgLy8gdGhpcyBmYWN0b3J5IGlzIG5vdCBmb3IgemVwaHlyCisgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAvLyBpbXBvc3NpYmxlIHRvIGZhaWwgdG8gcGFyc2UgPGZvby8+LCBidXQgYW55d2F5CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWmVwaHlyKFhNTElucHV0RmFjdG9yeSB4aWYsIENsYXNzIGNsYXp6KSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHplcGh5ckNsYXNzID0gY2xheno7CisgICAgICAgICAgICBzZXRJbnB1dFNvdXJjZU1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgic2V0SW5wdXRTb3VyY2UiLCBJbnB1dFNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByZXNldE1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgicmVzZXQiKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUdXJuIE9GRiBpbnRlcm5hbCBmYWN0b3J5IGNhY2hpbmcgaW4gWmVwaHlyLgorICAgICAgICAgICAgICAgIC8vIFNhbnRpYWdvIHRvbGQgbWUgdGhhdCB0aGlzIG1ha2VzIGl0IHRocmVhZC1zYWZlLgorICAgICAgICAgICAgICAgIHhpZi5zZXRQcm9wZXJ0eSgicmV1c2UtaW5zdGFuY2UiLCBmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGZhbGxzIHRocm91Z2gKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMueGlmID0geGlmOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZldGNocyBhbiBpbnN0YW5jZSBmcm9tIHRoZSBwb29sIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEBOdWxsYWJsZSBYTUxTdHJlYW1SZWFkZXIgZmV0Y2goKSB7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgc3IgPSBwb29sLmdldCgpOworICAgICAgICAgICAgaWYoc3I9PW51bGwpICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcG9vbC5zZXQobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gc3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkb1JlY3ljbGUoWE1MU3RyZWFtUmVhZGVyIHIpIHsKKyAgICAgICAgICAgIGlmKHplcGh5ckNsYXNzLmlzSW5zdGFuY2UocikpCisgICAgICAgICAgICAgICAgcG9vbC5zZXQocik7CisgICAgICAgICAgICBpZihyIGluc3RhbmNlb2YgUmVjeWNsZUF3YXJlKQorICAgICAgICAgICAgICAgICgoUmVjeWNsZUF3YXJlKXIpLm9uUmVjeWNsZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZG9DcmVhdGUoU3RyaW5nIHN5c3RlbUlkLCBJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiByZWplY3REVERzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4c3IgPSBmZXRjaCgpOworICAgICAgICAgICAgICAgIGlmKHhzcj09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhpZi5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3lzdGVtSWQsaW4pOworCisgICAgICAgICAgICAgICAgLy8gdHJ5IHJlLXVzaW5nIHRoaXMgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOworICAgICAgICAgICAgICAgIGlzLnNldEJ5dGVTdHJlYW0oaW4pOworICAgICAgICAgICAgICAgIHJldXNlKHhzcixpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHhzcjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInN0YXguY2FudENyZWF0ZSIsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MUmVhZGVyRXhjZXB0aW9uKCJzdGF4LmNhbnRDcmVhdGUiLGUpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MUmVhZGVyRXhjZXB0aW9uKCJzdGF4LmNhbnRDcmVhdGUiLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBkb0NyZWF0ZShTdHJpbmcgc3lzdGVtSWQsIFJlYWRlciBpbiwgYm9vbGVhbiByZWplY3REVERzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4c3IgPSBmZXRjaCgpOworICAgICAgICAgICAgICAgIGlmKHhzcj09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhpZi5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3lzdGVtSWQsaW4pOworCisgICAgICAgICAgICAgICAgLy8gdHJ5IHJlLXVzaW5nIHRoaXMgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOworICAgICAgICAgICAgICAgIGlzLnNldENoYXJhY3RlclN0cmVhbShpbik7CisgICAgICAgICAgICAgICAgcmV1c2UoeHNyLGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4geHNyOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFJlYWRlckV4Y2VwdGlvbigic3RheC5jYW50Q3JlYXRlIixlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInN0YXguY2FudENyZWF0ZSIsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInN0YXguY2FudENyZWF0ZSIsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmV1c2UoWE1MU3RyZWFtUmVhZGVyIHhzciwgSW5wdXRTb3VyY2UgaW4pIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc2V0TWV0aG9kLmludm9rZSh4c3IpOworICAgICAgICAgICAgc2V0SW5wdXRTb3VyY2VNZXRob2QuaW52b2tlKHhzcixpbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHtAbGluayBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5fSBpbXBsZW1lbnRhdGlvbgorICAgICAqIHRoYXQgY2FuIHdvcmsgd2l0aCBhbnkge0BsaW5rIFhNTElucHV0RmFjdG9yeX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgWE1MSW5wdXRGYWN0b3J5fSBpcyBub3QgcmVxdWlyZWQgdG8gYmUgdGhyZWFkLXNhZmUsIHNvIHRoZQorICAgICAqIGNyZWF0ZSBtZXRob2Qgb24gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzeW5jaHJvbml6ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWZhdWx0IGV4dGVuZHMgTm9Mb2NrIHsKKyAgICAgICAgcHVibGljIERlZmF1bHQoWE1MSW5wdXRGYWN0b3J5IHhpZikgeworICAgICAgICAgICAgc3VwZXIoeGlmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgWE1MU3RyZWFtUmVhZGVyIGRvQ3JlYXRlKFN0cmluZyBzeXN0ZW1JZCwgSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gcmVqZWN0RFREcykgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRvQ3JlYXRlKHN5c3RlbUlkLCBpbiwgcmVqZWN0RFREcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIFhNTFN0cmVhbVJlYWRlciBkb0NyZWF0ZShTdHJpbmcgc3lzdGVtSWQsIFJlYWRlciBpbiwgYm9vbGVhbiByZWplY3REVERzKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZG9DcmVhdGUoc3lzdGVtSWQsIGluLCByZWplY3REVERzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIERlZmF1bHR9IGJ1dCBkb2Vzbid0IGRvIGFueSBzeW5jaHJvbml6YXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBrbm93IHlvdXIge0BsaW5rIFhNTElucHV0RmFjdG9yeX0gaXMgdGhyZWFkLXNhZmUgYnkgaXRzZWxmLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9Mb2NrIGV4dGVuZHMgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgWE1MSW5wdXRGYWN0b3J5IHhpZjsKKworICAgICAgICBwdWJsaWMgTm9Mb2NrKFhNTElucHV0RmFjdG9yeSB4aWYpIHsKKyAgICAgICAgICAgIHRoaXMueGlmID0geGlmOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBkb0NyZWF0ZShTdHJpbmcgc3lzdGVtSWQsIElucHV0U3RyZWFtIGluLCBib29sZWFuIHJlamVjdERURHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHhpZi5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3lzdGVtSWQsaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MUmVhZGVyRXhjZXB0aW9uKCJzdGF4LmNhbnRDcmVhdGUiLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBkb0NyZWF0ZShTdHJpbmcgc3lzdGVtSWQsIFJlYWRlciBpbiwgYm9vbGVhbiByZWplY3REVERzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB4aWYuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHN5c3RlbUlkLGluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFJlYWRlckV4Y2VwdGlvbigic3RheC5jYW50Q3JlYXRlIixlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRvUmVjeWNsZShYTUxTdHJlYW1SZWFkZXIgcikgeworICAgICAgICAgICAgLy8gdGhlcmUncyBubyB3YXkgdG8gcmVjeWNsZSB3aXRoIHRoZSBkZWZhdWx0IFN0QVggQVBJLgorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBXb29kc3RveCdzIFhJRiBidXQgc2V0IHByb3BlcnRpZXMgdG8gZG8gdGhlIHN0cmluZyBpbnRlcm5pbmcuCisgICAgICogV29vZHN0b3gge0BsaW5rIFhNTElucHV0RmFjdG9yeX0gaXMgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXb29kc3RveCBleHRlbmRzIE5vTG9jayB7CisgICAgICAgIHB1YmxpYyBXb29kc3RveChYTUxJbnB1dEZhY3RvcnkgeGlmKSB7CisgICAgICAgICAgICBzdXBlcih4aWYpOworICAgICAgICAgICAgeGlmLnNldFByb3BlcnR5KCJvcmcuY29kZWhhdXMuc3RheDIuaW50ZXJuTnNVcmlzIix0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZG9DcmVhdGUoU3RyaW5nIHN5c3RlbUlkLCBJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiByZWplY3REVERzKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZG9DcmVhdGUoc3lzdGVtSWQsIGluLCByZWplY3REVERzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZG9DcmVhdGUoU3RyaW5nIHN5c3RlbUlkLCBSZWFkZXIgaW4sIGJvb2xlYW4gcmVqZWN0RFREcykgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRvQ3JlYXRlKHN5c3RlbUlkLCBpbiwgcmVqZWN0RFREcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc3RyZWFtaW5nL1hNTFN0cmVhbVdyaXRlckZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS9zdHJlYW1pbmcvWE1MU3RyZWFtV3JpdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjYwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvc3RyZWFtaW5nL1hNTFN0cmVhbVdyaXRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmc7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxSZWFkZXJFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9LgorICoKKyAqIDxwPgorICogVGhpcyB3cmFwcyB7QGxpbmsgWE1MT3V0cHV0RmFjdG9yeX0gYW5kIGFsbG93cyB1cyB0byByZXVzZSB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfSBpbnN0YW5jZXMKKyAqIHdoZW4gYXBwcm9wcmlhdGUuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeSB7CisKKyAgICAvKioKKyAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQE5vdE51bGwgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeSB0aGVJbnN0YW5jZTsKKworCisgICAgc3RhdGljIHsKKyAgICAgICAgWE1MT3V0cHV0RmFjdG9yeSB4b2YgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeSBmPW51bGw7CisKKyAgICAgICAgLy8gdGhpcyBzeXN0ZW0gcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGUgcG9vbGluZyBhbHRvZ2V0aGVyLAorICAgICAgICAvLyBpbiBjYXNlIHNvbWVvbmUgaGl0cyBhbiBpc3N1ZSB3aXRoIHBvb2xpbmcgaW4gdGhlIHByb2R1Y3Rpb24gc3lzdGVtLgorICAgICAgICBpZighQm9vbGVhbi5nZXRCb29sZWFuKFhNTFN0cmVhbVdyaXRlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKyIubm9Qb29sIikpCisgICAgICAgICAgICBmID0gWmVwaHlyLm5ld0luc3RhbmNlKHhvZik7CisgICAgICAgIGlmKGY9PW51bGwpCisgICAgICAgICAgICBmID0gbmV3IERlZmF1bHQoeG9mKTsKKworICAgICAgICB0aGVJbnN0YW5jZSA9IGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayAjY3JlYXRlKE91dHB1dFN0cmVhbSl9IGZvciB0aGUgY29udHJhY3QuCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGludm9rZWQgY29uY3VycmVudGx5LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBYTUxTdHJlYW1Xcml0ZXIgZG9DcmVhdGUoT3V0cHV0U3RyZWFtIG91dCk7CisKKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rICNjcmVhdGUoT3V0cHV0U3RyZWFtLFN0cmluZyl9IGZvciB0aGUgY29udHJhY3QuCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGludm9rZWQgY29uY3VycmVudGx5LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBYTUxTdHJlYW1Xcml0ZXIgZG9DcmVhdGUoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGVuY29kaW5nKTsKKworICAgIC8qKgorICAgICAqIFNlZSB7QGxpbmsgI3JlY3ljbGUoWE1MU3RyZWFtV3JpdGVyKX0gZm9yIHRoZSBjb250cmFjdC4KKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgaW52b2tlZCBjb25jdXJyZW50bHkuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZG9SZWN5Y2xlKFhNTFN0cmVhbVdyaXRlciByKTsKKworICAgIC8qKgorICAgICAqIFNob3VsZCBiZSBpbnZva2VkIHdoZW4gdGhlIGNvZGUgZmluaXNoZWQgdXNpbmcgYW4ge0BsaW5rIFhNTFN0cmVhbVdyaXRlcn0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcmVjeWNsZWQgaW5zdGFuY2UgaW1wbGVtZW50cyB7QGxpbmsgUmVjeWNsZUF3YXJlfSwKKyAgICAgKiB7QGxpbmsgUmVjeWNsZUF3YXJlI29uUmVjeWNsZWQoKX0gd2lsbCBiZSBpbnZva2VkIHRvIGxldCB0aGUgaW5zdGFuY2UKKyAgICAgKiBrbm93IHRoYXQgaXQncyBiZWluZyByZWN5Y2xlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG5vdCBhIGhhcmQgcmVxdWlyZW1lbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbiBldmVyeSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfQorICAgICAqIGluc3RhbmNlLiBOb3QgZG9pbmcgc28ganVzdCByZWR1Y2VzIHRoZSBwZXJmb3JtYW5jZSBieSB0aHJvd2luZyBhd2F5CisgICAgICogcG9zc2libHkgcmV1c2FibGUgaW5zdGFuY2VzLiBTbyB0aGUgY2FsbGVyIHNob3VsZCBhbHdheXMgY29uc2lkZXIgdGhlIGVmZm9ydAorICAgICAqIGl0IHRha2VzIHRvIHJlY3ljbGUgdnMgdGhlIHBvc3NpYmxlIHBlcmZvcm1hbmNlIGdhaW4gYnkgZG9pbmcgc28uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgaW52a2VkIGJ5IG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LgorICAgICAqCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgIFRoZSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSBpbnN0YW5jZSB0aGF0IHRoZSBjYWxsZXIgZmluaXNoZWQgdXNpbmcuCisgICAgICogICAgICBUaGlzIGNvdWxkIGJlIGFueSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSBpbXBsZW1lbnRhdGlvbiwgbm90IGp1c3QKKyAgICAgKiAgICAgIHRoZSBvbmVzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gdGhpcyBmYWN0b3J5LiBTbyB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgIG9mIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgYXdhcmUgb2YgdGhhdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjeWNsZShYTUxTdHJlYW1Xcml0ZXIgcikgeworICAgICAgICBnZXQoKS5kb1JlY3ljbGUocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRoYXQgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9IHRvCisgICAgICogYmUgbm90aWZpZWQgd2hlbiBpdCdzIHJlY3ljbGVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBwcm92aWRlcyBhIGZpbHRlcmluZyB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfSBhbiBvcHBvcnR1bml0eSB0bworICAgICAqIHJlY3ljbGUgaXRzIGlubmVyIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgUmVjeWNsZUF3YXJlIHsKKyAgICAgICAgdm9pZCBvblJlY3ljbGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQE5vdE51bGwgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeSBnZXQoKSB7CisgICAgICAgIHJldHVybiB0aGVJbnN0YW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIHNpbmdsZXRvbiB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeX0gaW5zdGFuY2UgdGhhdAorICAgICAqIHRoZSBKQVgtV1MgUkkgdXNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoQE5vdE51bGwgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeSBmKSB7CisgICAgICAgIGlmKGY9PW51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgdGhlSW5zdGFuY2UgPSBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3J0LWN1dCBmb3Ige0BsaW5rICNjcmVhdGUoT3V0cHV0U3RyZWFtLCBTdHJpbmcpfSB3aXRoIFVURi04LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtV3JpdGVyIGNyZWF0ZShPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHJldHVybiBnZXQoKS5kb0NyZWF0ZShvdXQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtV3JpdGVyIGNyZWF0ZShPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgcmV0dXJuIGdldCgpLmRvQ3JlYXRlKG91dCwgZW5jb2RpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNjcmVhdGUoT3V0cHV0U3RyZWFtKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVYTUxTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICByZXR1cm4gY3JlYXRlKG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIFVzZSB7QGxpbmsgI2NyZWF0ZShPdXRwdXRTdHJlYW0sIFN0cmluZyl9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1Xcml0ZXIgY3JlYXRlWE1MU3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICByZXR1cm4gY3JlYXRlKG91dCwgZW5jb2RpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBVc2Uge0BsaW5rICNjcmVhdGUoT3V0cHV0U3RyZWFtLCBTdHJpbmcpfS4gVGhlIGJvb2xlYW4gZmxhZyB3YXMgdW51c2VkIGFueXdheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVYTUxTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGVuY29kaW5nLCBib29sZWFuIGRlY2xhcmUpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShvdXQsZW5jb2RpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQge0BsaW5rIFhNTFN0cmVhbVdyaXRlckZhY3Rvcnl9IGltcGxlbWVudGF0aW9uCisgICAgICogdGhhdCBjYW4gd29yayB3aXRoIGFueSB7QGxpbmsgWE1MT3V0cHV0RmFjdG9yeX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgWE1MT3V0cHV0RmFjdG9yeX0gaXMgbm90IHJlcXVpcmVkIHRvIGJlIHRocmVhZC1zYWZlLCBzbyB0aGUKKyAgICAgKiBjcmVhdGUgbWV0aG9kIG9uIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgc3luY2hyb25pemVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGVmYXVsdCBleHRlbmRzIFhNTFN0cmVhbVdyaXRlckZhY3RvcnkgeworICAgICAgICBwcml2YXRlIGZpbmFsIFhNTE91dHB1dEZhY3RvcnkgeG9mOworCisgICAgICAgIHB1YmxpYyBEZWZhdWx0KFhNTE91dHB1dEZhY3RvcnkgeG9mKSB7CisgICAgICAgICAgICB0aGlzLnhvZiA9IHhvZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYTUxTdHJlYW1Xcml0ZXIgZG9DcmVhdGUoT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICAgICAgcmV0dXJuIGRvQ3JlYXRlKG91dCwiVVRGLTgiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgWE1MU3RyZWFtV3JpdGVyIGRvQ3JlYXRlKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4geG9mLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQsZW5jb2RpbmcpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MUmVhZGVyRXhjZXB0aW9uKCJzdGF4LmNhbnRDcmVhdGUiLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZG9SZWN5Y2xlKFhNTFN0cmVhbVdyaXRlciByKSB7CisgICAgICAgICAgICAvLyBubyByZWN5Y2xpbmcKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJGYWN0b3J5fSBpbXBsZW1lbnRhdGlvbiBmb3IgU3VuJ3MgU3RhWCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgaW5zdGFuY2UgcmV1c2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBaZXBoeXIgZXh0ZW5kcyBYTUxTdHJlYW1Xcml0ZXJGYWN0b3J5IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBYTUxPdXRwdXRGYWN0b3J5IHhvZjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxYTUxTdHJlYW1Xcml0ZXI+IHBvb2wgPSBuZXcgVGhyZWFkTG9jYWw8WE1MU3RyZWFtV3JpdGVyPigpOworICAgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCByZXNldE1ldGhvZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2Qgc2V0T3V0cHV0TWV0aG9kOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzIHplcGh5ckNsYXNzOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeSBuZXdJbnN0YW5jZShYTUxPdXRwdXRGYWN0b3J5IHhvZikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IHhvZi5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpKS5nZXRDbGFzcygpOworCisgICAgICAgICAgICAgICAgaWYoIWNsYXp6LmdldE5hbWUoKS5zdGFydHNXaXRoKCJjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIC8vIG5vcGUKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWmVwaHlyKHhvZixjbGF6eik7CisgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAvLyBpbXBvc3NpYmxlCisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAvLyB0aGlzIHhvZiB3YXNuJ3QgWmVwaHlyCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFplcGh5cihYTUxPdXRwdXRGYWN0b3J5IHhvZiwgQ2xhc3MgY2xhenopIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy54b2YgPSB4b2Y7CisKKyAgICAgICAgICAgIHplcGh5ckNsYXNzID0gY2xheno7CisgICAgICAgICAgICBzZXRPdXRwdXRNZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoInNldE91dHB1dCIsIFN0cmVhbVJlc3VsdC5jbGFzcywgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIHJlc2V0TWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJyZXNldCIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZldGNocyBhbiBpbnN0YW5jZSBmcm9tIHRoZSBwb29sIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEBOdWxsYWJsZSBYTUxTdHJlYW1Xcml0ZXIgZmV0Y2goKSB7CisgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgc3IgPSBwb29sLmdldCgpOworICAgICAgICAgICAgaWYoc3I9PW51bGwpICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcG9vbC5zZXQobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gc3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWE1MU3RyZWFtV3JpdGVyIGRvQ3JlYXRlKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBkb0NyZWF0ZShvdXQsIlVURi04Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWE1MU3RyZWFtV3JpdGVyIGRvQ3JlYXRlKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhzdyA9IGZldGNoKCk7CisgICAgICAgICAgICBpZih4c3chPW51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmV1c2UKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXNldE1ldGhvZC5pbnZva2UoeHN3KTsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0TWV0aG9kLmludm9rZSh4c3csbmV3IFN0cmVhbVJlc3VsdChvdXQpLGVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhzdzsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFJlYWRlckV4Y2VwdGlvbigic3RheC5jYW50Q3JlYXRlIixlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFJlYWRlckV4Y2VwdGlvbigic3RheC5jYW50Q3JlYXRlIixlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4geG9mLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQsZW5jb2RpbmcpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MUmVhZGVyRXhjZXB0aW9uKCJzdGF4LmNhbnRDcmVhdGUiLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZG9SZWN5Y2xlKFhNTFN0cmVhbVdyaXRlciByKSB7CisgICAgICAgICAgICBpZih6ZXBoeXJDbGFzcy5pc0luc3RhbmNlKHIpKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBmbHVzaGVzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgc28gaXQgbWlnaHQgY2F1c2UgY2h1bmtpbmcgaXNzdWUKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvb2wuc2V0KHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYociBpbnN0YW5jZW9mIFJlY3ljbGVBd2FyZSkKKyAgICAgICAgICAgICAgICAoKFJlY3ljbGVBd2FyZSlyKS5vblJlY3ljbGVkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC9wYXJzZXIvTWV0YURhdGFSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL01ldGFEYXRhUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjVkNjMyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL01ldGFEYXRhUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworLyoqCisgKiBSZXNvbHZlcyBtZXRhZGF0YSBzdWNoIGFzIFdTREwvc2NoZW1hLiBUaGlzIHNlcnZlcyBhcyBleHRlbnNpYmlsZSBwbHVnaW4gcG9pbnQgd2hpY2ggYSB3c2RsIHBhcnNlciBjYW4gdXNlIHRvCisgKiBnZXQgdGhlIG1ldGFkYXRhIGZyb20gYW4gZW5kcG9pbnQuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGFEYXRhUmVzb2x2ZXIgeworICAgIC8qKgorICAgICAqIEdpdmVzIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuU2VydmljZURlc2NyaXB0b3J9IHJlc29sdmVkIGZyb20gdGhlIGdpdmVuIGxvY2F0aW9uLgorICAgICAqCisgICAgICogVE9ETzogRG9lcyB0aGlzIG1ldGhvZCBuZWVkIHRvIHByb3BvZ2F0ZSBlcnJvcnM/CisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gbWV0YWRhdGEgbG9jYXRpb24KKyAgICAgKiBAcmV0dXJuIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuU2VydmljZURlc2NyaXB0b3J9IHJlc29sdmVkIGZyb20gdGhlIGxvY2F0aW9uLiBJdCBtYXkgYmUgbnVsbCBpbiB0aGUgY2FzZXMgd2hlbiBNZXRhZGF0YVJlc29sdmVyCisgICAgICogICAgICAgICBjYW4gZ2V0IHRoZSBtZXRhZGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRhZGF0YSBsb2N0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATnVsbGFibGUgU2VydmljZURlc2NyaXB0b3IgcmVzb2x2ZShATm90TnVsbCBVUkkgbG9jYXRpb24pOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL01ldGFkYXRhUmVzb2x2ZXJGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC9wYXJzZXIvTWV0YWRhdGFSZXNvbHZlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWRkM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL01ldGFkYXRhUmVzb2x2ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CisKKy8qKgorICogRXh0ZW5zaW9uIHBvaW50IGZvciByZXNvbHZpbmcgbWV0YWRhdGEgdXNpbmcgd3NpbXBvcnQuCisgKiA8cC8+CisgKiB3c2ltcG9ydCB3b3VsZCBnZXQgYSB7QGxpbmsgTWV0YURhdGFSZXNvbHZlcn0gdXNpbmcgdGhpcyBmYWN0b3J5IGFuZCBmcm9tIGl0IHdpbGwgcmVzb2x2ZSBhbGwgdGhlIHdzZGwvc2NoZW1hCisgKiBtZXRhZGF0YS4KKyAqCisgKiBJbXBsZW1lbnRvciBvZiB0aGlzIGNsYXNzIG11c3QgcHJvdmlkZSBhIHplcm8gYXJndW1lbnQgY29uc3RydWN0b3Igc28gdGhhdAorICogaXQgY2FuIGJlIGxvYWRlZCBkdXJpbmcgc2VydmljZSBsb29rdXAgbWVjaGFuaXNtLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlci5NZXRhRGF0YVJlc29sdmVyI3Jlc29sdmUoamF2YS5uZXQuVVJJKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0YWRhdGFSZXNvbHZlckZhY3RvcnkgeworICAgIC8qKgorICAgICAqIEdldHMgYSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLk1ldGFEYXRhUmVzb2x2ZXJ9CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QKKyAgICBATm90TnVsbAorICAgIE1ldGFEYXRhUmVzb2x2ZXIgbWV0YWRhdGFSZXNvbHZlcihATnVsbGFibGUgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL1NlcnZpY2VEZXNjcmlwdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC9wYXJzZXIvU2VydmljZURlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODc1NWJjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL1NlcnZpY2VEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBYnN0cmFjdGlvbiBvdmVyIFdTREwgYW5kIFNjaGVtYSBtZXRhZGF0YQorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvciB7CisgICAgLyoqCisgICAgICogR2l2ZXMgbGlzdCBvZiB3c2RscworICAgICAqIEByZXR1cm4gTGlzdCBvZiBXU0RMIGRvY3VtZW50cyBhcyB7QGxpbmsgU291cmNlfS4KKyAgICAgKiB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UjZ2V0U3lzdGVtSWQoKX0gbXVzdCBiZSBOb24tbnVsbAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBMaXN0PD8gZXh0ZW5kcyBTb3VyY2U+IGdldFdTRExzKCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyBsaXN0IG9mIHNjaGVtYXMuCisgICAgICogQHJldHVybiBMaXN0IG9mIFhNTCBzY2hlbWEgZG9jdW1lbnRzIGFzIHtAbGluayBTb3VyY2V9LiB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UjZ2V0U3lzdGVtSWQoKX0gbXVzdCBiZSBOb24tbnVsbC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBMaXN0PD8gZXh0ZW5kcyBTb3VyY2U+IGdldFNjaGVtYXMoKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS93c2RsL3BhcnNlci9XU0RMUGFyc2VyRXh0ZW5zaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC9wYXJzZXIvV1NETFBhcnNlckV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjY1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC9wYXJzZXIvV1NETFBhcnNlckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTU2VydmljZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMQm91bmRPcGVyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kUG9ydFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEV4dGVuc2libGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMRmF1bHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETElucHV0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExPdXRwdXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExTZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuUnVudGltZVdTRExQYXJzZXI7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKiBFeHRlbmRzIHRoZSBXU0RMIHBhcnNpbmcgcHJvY2Vzcy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNvbXBvbmVudHMgdGhhdCBidWlsZCBvbiB0b3Agb2YgdGhlIEpBWC1XUyBSSSwKKyAqIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBXU0RMIHBhcnNpbmcgcHJvY2VzcyB0aGF0IGhhcHBlbnMgaW4gdGhlIHJ1bnRpbWUuCisgKiBUaGlzIGFsbG93cyBzdWNoIGNvbXBvbmVudHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSBXU0RMIGV4dGVuc2lvbiBlbGVtZW50cywKKyAqIGFuZCB1c2UgdGhhdCBsYXRlciB0bywgZm9yIGV4YW1wbGUsIGNvbmZpZ3VyZSB7QGxpbmsgVHViZX1zLgorICoKKyAqCisgKgorICogPGgyPkhvdyBpdCB3b3Jrcz88L2gyPgorICogPHA+CisgKiBFYWNoIG1ldGhvZCBvbiB0aGlzIGludGVyZmFjZSBkZW5vdGVzIG9uZSBleHRlbnNpb24gcG9pbnQgaW4gV1NETAorICogKHRoZSBwbGFjZSB3aGVyZSBmb3JlaWduIGVsZW1lbnRzL2F0dHJpYnV0ZXMgY2FuIGJlIGFkZGVkLikgQSB7QGxpbmsgUnVudGltZVdTRExQYXJzZXJ9CisgKiBzdGFydHMgcGFyc2luZyBXU0RMIHdpdGggYSBmaXhlZCBzZXQgb2Yge0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb259cywgYW5kCisgKiBhcyBpdCBmaW5kcyBleHRlbnNpb24gZWxlbWVudHMvYXR0cmlidXRlcywgaXQgY2FsbHMgYXBwcm9wcmlhdGUgY2FsbGJhY2sgbWV0aG9kcworICogdG8gcHJvdmlkZSBhIGNoYW5jZSBmb3Ige0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb259IHRvIHBhcnNlIHN1Y2gKKyAqIGFuIGV4dGVuc2lvbiBlbGVtZW50LgorICoKKyAqIDxwPgorICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBjYWxsYmFja3MuCisgKgorICogPGgzPkF0dHJpYnV0ZSBjYWxsYmFja3M8L2gzPgorICogPHA+CisgKiBPbmUgaXMgZm9yIGF0dHJpYnV0ZXMsIHdoaWNoIGVuZHMgd2l0aCB0aGUgbmFtZSB7QGNvZGUgQXR0cmlidXRlc30uCisgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSB0aGF0IHBvaW50cworICogdG8gdGhlIHN0YXJ0IHRhZyBvZiB0aGUgV1NETCBlbGVtZW50LgorICoKKyAqIDxwPgorICogVGhlIGNhbGxiYWNrIG1ldGhvZCBjYW4gcmVhZCBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzIG9uIGl0LgorICogVGhlIG1ldGhvZCBtdXN0IHJldHVybiB3aXRob3V0IGFkdmFuY2luZyB0aGUgcGFyc2VyIHRvIHRoZSBuZXh0IHRva2VuLgorICoKKyAqIDxoMz5FbGVtZW50IGNhbGxiYWNrczwvaDM+CisgKiA8cD4KKyAqIFRoZSBvdGhlciBjYWxsYmFjayBpcyBmb3IgZXh0ZW5zaW9uIGVsZW1lbnRzLCB3aGljaCBlbmRzIHdpdGggdGhlIG5hbWUKKyAqIHtAY29kZSBFbGVtZW50c30uCisgKiBXaGVuIGEgY2FsbGJhY2sgaXMgaW52b2tlZCwge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gcG9pbnRzIHRvIHRoZQorICogc3RhcnQgdGFnIG9mIHRoZSBleHRlbnNpb24gZWxlbWVudC4gVGhlIGNhbGxiYWNrIG1ldGhvZCBjYW4gZG8KKyAqIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqIDxvbD4KKyAqICA8bGk+UmV0dXJuIHtAY29kZSBmYWxzZX0gd2l0aG91dCBtb3Zpbmcge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0sCisgKiAgICAgIHRvIGluZGljYXRlIHRoYXQgdGhlIGV4dGVuc2lvbiBlbGVtZW50IGlzbid0IHJlY29nbml6ZWQuCisgKiAgICAgIFRoaXMgYWxsb3dzIHRoZSBuZXh0IHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufSB0byBzZWUgdGhpcworICogICAgICBleHRlbnNpb24gZWxlbWVudC4KKyAqICA8bGk+UGFyc2UgdGhlIHdob2xlIHN1YnRyZWUgcm9vdGVkIGF0IHRoZSBlbGVtZW50LAorICogICAgICBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHtAbGluayBYTUxTdHJlYW1Db25zdGFudHMjRU5EX0VMRU1FTlR9IHN0YXRlLAorICogICAgICBhbmQgcmV0dXJuIHtAY29kZSB0cnVlfSwgaW5kaWNhdGluZyB0aGF0IHRoZSBleHRlbnNpb24KKyAqICAgICAgZWxlbWVudCBpcyBjb25zdW1lZC4KKyAqICAgICAgTm8gb3RoZXIge0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb259cyBhcmUgbm90aWZpZWQgb2YgdGhpcyBleHRlbnNpb24uCisgKiA8L29sPgorICoKKyAqIDxoMz5QYXJzaW5nIGluIGNhbGxiYWNrPC9oMz4KKyAqIDxwPgorICogRm9yIGVhY2ggY2FsbGJhY2ssIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgbW9kZWwgb2JqZWN0IGlzIHBhc3NlZCBpbiwKKyAqIHNvIHRoYXQge0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb259IGNhbiByZWxhdGUgd2hhdCBpdCdzIHBhcnNpbmcKKyAqIHRvIHRoZSB7QGxpbmsgV1NETE1vZGVsfS4gTW9zdCBsaWtlbHksIGV4dGVuc2lvbnMgY2FuIHBhcnNlCisgKiB0aGVpciBkYXRhIGludG8gYW4ge0BsaW5rIFdTRExFeHRlbnNpb259LWRlcml2ZWQgY2xhc3NlcywgdGhlbgorICogdXNlIHtAbGluayBXU0RMRXh0ZW5zaWJsZX0gaW50ZXJmYWNlIHRvIGhvb2sgdGhlbSBpbnRvIHtAbGluayBXU0RMTW9kZWx9LgorICoKKyAqIDxwPgorICogTm90ZSB0aGF0IHNpbmNlIHRoZSB7QGxpbmsgV1NETE1vZGVsfSBpdHNlbGYKKyAqIGlzIGJlaW5nIGJ1aWx0LCB7QGxpbmsgV1NETFBhcnNlckV4dGVuc2lvbn0gbWF5IG5vdCBpbnZva2UgYW55IG9mCisgKiB0aGUgcXVlcnkgbWV0aG9kcyBvbiB0aGUgV1NETCBtb2RlbC4gVGhvc2UgcmVmZXJlbmNlcyBhcmUgcGFzc2VkIGp1c3Qgc28gdGhhdAorICoge0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb259IGNhbiBob2xkIG9uIHRvIHRob3NlIHJlZmVyZW5jZXMsIG9yIHB1dAorICoge0BsaW5rIFdTRExFeHRlbnNpYmxlfSBvYmplY3RzIGludG8gdGhlIG1vZGVsLCBub3QgdG8gcXVlcnkgaXQuCisgKgorICogPHA+CisgKiBJZiB7QGxpbmsgV1NETFBhcnNlckV4dGVuc2lvbn0gbmVlZHMgdG8gcXVlcnkge0BsaW5rIFdTRExNb2RlbH0sCisgKiBkZWZlciB0aGF0IHByb2Nlc3NpbmcgdW50aWwge0BsaW5rICNmaW5pc2hlZChXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dCl9LCB3aGVuIGl0J3MKKyAqIHNhZmUgdG8gdXNlIHtAbGluayBXU0RMTW9kZWx9IGNhbiBiZSB1c2VkIHNhZmVseS4KKyAqCisgKiA8cD4KKyAqIEFsc28gbm90ZSB0aGF0IHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufXMgYXJlIGNhbGxlZCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGRlc2lnbmVkIGZvciBoYXZpbmcgbXVsdGlwbGUge0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb259cworICogcGFyc2UgdGhlIHNhbWUgZXh0ZW5zaW9uIGVsZW1lbnQuCisgKgorICoKKyAqIDxoMj5FcnJvciBIYW5kbGluZzwvaDI+CisgKiA8cD4KKyAqIEZvciB1c2FiaWxpdHksIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufXMgYXJlIGV4cGVjdGVkIHRvIGNoZWNrIHBvc3NpYmxlCisgKiBlcnJvcnMgaW4gdGhlIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IGl0IHBhcnNlcy4gV2hlbiBhbiBlcnJvciBpcyBmb3VuZCwKKyAqIGl0IG1heSB0aHJvdyBhIHtAbGluayBXZWJTZXJ2aWNlRXhjZXB0aW9ufSB0byBhYm9ydCB0aGUgcGFyc2luZyBvZiB0aGUgV1NETC4KKyAqIFRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgcHJvcGFnYXRlZCB0byB0aGUgdXNlciwgc28gaXQgc2hvdWxkIGhhdmUKKyAqIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzIHBvaW50aW5nIGF0IHRoZSBwcm9ibGVtLgorICoKKyAqIDxoMj5EaXNjb3Zlcnk8L2gyPgorICogPHA+CisgKiBUaGUgSkFYLVdTIFJJIGxvY2F0ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufXMKKyAqIGJ5IHVzaW5nIHRoZSBzdGFuZGFyZCBzZXJ2aWNlIGxvb2sgdXAgbWVjaGFuaXNtLCBpbiBwYXJ0aWN1bGFyIGxvb2tpbmcgZm9yCisgKiA8dHQ+TUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb248L3R0PgorICoKKyAqCisgKiA8aDI+VE9ETzwvaDI+CisgKiA8cD4KKyAqIEFzIGl0J3MgZGVzaWduZWQgdG9kYXksIGV4dGVuc2lvbnMgY2Fubm90IGFjY2VzcyB0byBhbnkgb2YgdGhlIGVudmlyb25tZW50YWwKKyAqIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgcGFyc2luZyBiZWdpbnMgKHN1Y2ggYXMgd2hhdCB7QGxpbmsgV1NTZXJ2aWNlfSB0aGlzCisgKiBXU0RMIGlzIGJlaW5nIHBhcnNlZCBmb3IsIGV0Yy4pIFdlIG1pZ2h0IG5lZWQgdG8gcmVjb25zaWRlciB0aGlzIGFzcGVjdC4KKyAqIFRoZSBKQVgtV1MgdGVhbSB3YWl0cyBmb3IgZmVlZGJhY2sgb24gdGhpcyB0b3BpYy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMUGFyc2VyRXh0ZW5zaW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzdGFydChXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dCBjb250ZXh0KXsKKyAgICAgICAgLy8gbm9vcAorICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlQXR0cmlidXRlcyhXU0RMU2VydmljZSBzZXJ2aWNlLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIC8vIG5vb3AKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXJ2aWNlRWxlbWVudHMoV1NETFNlcnZpY2Ugc2VydmljZSwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9ydEF0dHJpYnV0ZXMoV1NETFBvcnQgcG9ydCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICAvLyBub29wCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydEVsZW1lbnRzKFdTRExQb3J0IHBvcnQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uSW5wdXQoV1NETE9wZXJhdGlvbiBvcCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25PdXRwdXQoV1NETE9wZXJhdGlvbiBvcCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25GYXVsdChXU0RMT3BlcmF0aW9uIG9wLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkZWZpbml0aW9uc0VsZW1lbnRzKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdFbGVtZW50cyhXU0RMQm91bmRQb3J0VHlwZSBiaW5kaW5nLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiaW5kaW5nQXR0cmlidXRlcyhXU0RMQm91bmRQb3J0VHlwZSBiaW5kaW5nLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVFbGVtZW50cyhXU0RMUG9ydFR5cGUgcG9ydFR5cGUsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcnRUeXBlQXR0cmlidXRlcyhXU0RMUG9ydFR5cGUgcG9ydFR5cGUsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3J0VHlwZU9wZXJhdGlvbkVsZW1lbnRzKFdTRExPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3J0VHlwZU9wZXJhdGlvbkF0dHJpYnV0ZXMoV1NETE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudHMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmluZGluZ09wZXJhdGlvbkF0dHJpYnV0ZXMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG1lc3NhZ2VFbGVtZW50cyhXU0RMTWVzc2FnZSBtc2csIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VBdHRyaWJ1dGVzKFdTRExNZXNzYWdlIG1zZywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uSW5wdXRFbGVtZW50cyhXU0RMSW5wdXQgaW5wdXQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcnRUeXBlT3BlcmF0aW9uSW5wdXRBdHRyaWJ1dGVzKFdTRExJbnB1dCBpbnB1dCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uT3V0cHV0RWxlbWVudHMoV1NETE91dHB1dCBvdXRwdXQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcnRUeXBlT3BlcmF0aW9uT3V0cHV0QXR0cmlidXRlcyhXU0RMT3V0cHV0IG91dHB1dCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uRmF1bHRFbGVtZW50cyhXU0RMRmF1bHQgZmF1bHQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcnRUeXBlT3BlcmF0aW9uRmF1bHRBdHRyaWJ1dGVzKFdTRExGYXVsdCBmYXVsdCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdPcGVyYXRpb25JbnB1dEVsZW1lbnRzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJpbmRpbmdPcGVyYXRpb25JbnB1dEF0dHJpYnV0ZXMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdPcGVyYXRpb25PdXRwdXRFbGVtZW50cyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiaW5kaW5nT3BlcmF0aW9uT3V0cHV0QXR0cmlidXRlcyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmluZGluZ09wZXJhdGlvbkZhdWx0RWxlbWVudHMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmluZGluZ09wZXJhdGlvbkZhdWx0QXR0cmlidXRlcyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgfQorCisgICAgLy8gVE9ETzogY29tcGxldGUgdGhlIHJlc3Qgb2YgdGhlIGNhbGxiYWNrCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBvZiBhIHNldCBvZiBXU0RMIGRvY3VtZW50cyBhcmUgYWxsIGRvbmUuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG8gYW55IHBvc3QtcHJvY2Vzc2luZyBvZiB0aGUgcGFyc2luZworICAgICAqIHlvdSd2ZSBkb25lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dH0gZ2l2ZXMgZnVsbHkgcGFyc2VkIHtAbGluayBXU0RMTW9kZWx9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpbmlzaGVkKFdTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gbm9vcAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RGaW5pc2hlZChXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIG5vb3AKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC9wYXJzZXIvV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS93c2RsL3BhcnNlci9XU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwY2UxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC9wYXJzZXIvV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNb2RlbDsKKworLyoqCisgKiBQcm92aWRlcyBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZvciB7QGxpbmsgV1NETFBhcnNlckV4dGVuc2lvbn1zLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHQgeworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV1NETCBwYXJzaW5nIGlzIGhhcHBlbmluZyBvbiB0aGUgY2xpZW50IHNpZGUuIFJldHVybnMgZmFsc2UgbWVhbnMKKyAgICAgKiBpdHMgc3RhcnRlZCBvbiB0aGUgc2VydmVyIHNpZGUuCisgICAgICovCisgICAgYm9vbGVhbiBpc0NsaWVudFNpZGUoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSB7QGxpbmsgV1NETE1vZGVsfS4gVGhlIFdTRExNb2RlbCBtYXkgbm90IGJlIGNvbXBsZXRlIHVudGlsCisgICAgICoge0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb24jZmluaXNoZWQoV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHQpfSBpcyBjYWxsZWQuCisgICAgICovCisgICAgV1NETE1vZGVsIGdldFdTRExNb2RlbCgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL1hNTEVudGl0eVJlc29sdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC9wYXJzZXIvWE1MRW50aXR5UmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGVhNzBhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL1hNTEVudGl0eVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuU0REb2N1bWVudFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBSZXNvbHZlcyBhIHJlZmVyZW5jZSB0byB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAqCisgKiBUaGlzIGlzIGtpbmRhIGxpa2Uge0BsaW5rIEVudGl0eVJlc29sdmVyfSBidXQgd29ya3MKKyAqIGF0IHRoZSBYTUwgaW5mb3NldCBsZXZlbC4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWE1MRW50aXR5UmVzb2x2ZXIgeworICAgIC8qKgorICAgICAqIFNlZSB7QGxpbmsgRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShTdHJpbmcsIFN0cmluZyl9IGZvciB0aGUgY29udHJhY3QuCisgICAgICovCisgICAgUGFyc2VyIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGFyc2VyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN5c3RlbSBJRCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgcGFyc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFVSTCBzeXN0ZW1JZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwYXJzZXIgaW5zdGFuY2UgcGFyc2luZyB0aGUgaW5mb3NldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyOworCisgICAgICAgIHB1YmxpYyBQYXJzZXIoVVJMIHN5c3RlbUlkLCBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB7CisgICAgICAgICAgICBhc3NlcnQgcGFyc2VyIT1udWxsOworICAgICAgICAgICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOworICAgICAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBQYXJzZXJ9IHRoYXQgcmVhZHMgZnJvbSB7QGxpbmsgU0REb2N1bWVudFNvdXJjZX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUGFyc2VyKFNERG9jdW1lbnRTb3VyY2UgZG9jKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLnN5c3RlbUlkID0gZG9jLmdldFN5c3RlbUlkKCk7CisgICAgICAgICAgICB0aGlzLnBhcnNlciA9IGRvYy5yZWFkKCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS93c2RsL3BhcnNlci9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS93c2RsL3BhcnNlci9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjYzNzhlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYXBpL3dzZGwvcGFyc2VyL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoqCisgKiBFeHRlbnNpb24gcG9pbnQgZm9yIFdTREwgcGFyc2luZy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC93cml0ZXIvV1NETEdlbkV4dG5Db250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC93cml0ZXIvV1NETEdlbkV4dG5Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiZDc3NQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS93c2RsL3dyaXRlci9XU0RMR2VuRXh0bkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwud3JpdGVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuU0VJTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworCisvKioKKyAqIFdTRExHZW5lYXRvckNvbnRleHQgcHJvdmlkZXMgYSBjb250ZXh0IGZvciB0aGUgV1NETEdlbmVyYXRvckV4dGVuc2lvbiBhbmQgaXMgdXNlZCBpbgorICoge0BsaW5rIFdTRExHZW5lcmF0b3JFeHRlbnNpb24jc3RhcnQoV1NETEdlbkV4dG5Db250ZXh0KX0uIFRoaXMgY29udGV4dCBjb25zaXN0cyBvZiBUWFcsIHtAbGluayBTRUlNb2RlbH0sCisgKiB7QGxpbmsgV1NCaW5kaW5nfSwge0BsaW5rIENvbnRhaW5lcn0sIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gV1NETCBleHRlbnNpb25zIGFyZSB1c2VkIHRvCisgKiBleHRlbmQgdGhlIGdlbmVyYXRlZCBXU0RMIGJ5IGFkZGluZyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBleHRlbnNpb25zLgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBjbGFzcyBXU0RMR2VuRXh0bkNvbnRleHQgeworICAgIHByaXZhdGUgZmluYWwgVHlwZWRYbWxXcml0ZXIgcm9vdDsKKyAgICBwcml2YXRlIGZpbmFsIFNFSU1vZGVsIG1vZGVsOworICAgIHByaXZhdGUgZmluYWwgV1NCaW5kaW5nIGJpbmRpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250YWluZXIgY29udGFpbmVyOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgZW5kcG9pbnRDbGFzczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgV1NETCBHZW5lcmF0aW9uIGNvbnRleHQgZm9yIHRoZSBleHRlbnNpb25zCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCAgICAgIFRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZ2VuZXJhdGVkIFdTREwuCisgICAgICogQHBhcmFtIG1vZGVsICAgICBXU0RMIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoaXMge0BsaW5rIFNFSU1vZGVsfS4KKyAgICAgKiBAcGFyYW0gYmluZGluZyAgIFRoZSBiaW5kaW5nIGZvciB3aGljaCB3ZSBnZW5lcmF0ZSBXU0RMLiB0aGUgYmluZGluZyB7QGxpbmsgV1NCaW5kaW5nfSByZXByZXNlbnRzIGEgcGFydGljdWxhcgorICAgICAqICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBKQVhXUy4gVGhpcyBjYW4gYmUgdHlwaWNhbGx5IGJlIG92ZXJyaWRlbiBieQorICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIGVudHJ5IHBvaW50IHRvIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIElmIHRoaXMgZXh0ZW5zaW9uIGlzIHVzZWQgYXQgdGhlIHJ1bnRpbWUgdG8gZ2VuZXJhdGUgV1NETCwgeW91IGdldCBhIHtAbGluayBDb250YWluZXJ9CisgICAgICogICAgICAgICAgICAgICAgICB0aGF0IHdhcyBnaXZlbiB0byB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU0VuZHBvaW50I2NyZWF0ZX0uCisgICAgICovCisgICAgcHVibGljIFdTRExHZW5FeHRuQ29udGV4dChATm90TnVsbCBUeXBlZFhtbFdyaXRlciByb290LCBATm90TnVsbCBTRUlNb2RlbCBtb2RlbCwgQE5vdE51bGwgV1NCaW5kaW5nIGJpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgQ29udGFpbmVyIGNvbnRhaW5lciwgQE5vdE51bGwgQ2xhc3MgZW5kcG9pbnRDbGFzcykgeworICAgICAgICB0aGlzLnJvb3QgPSByb290OworICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICB0aGlzLmVuZHBvaW50Q2xhc3MgPSBlbmRwb2ludENsYXNzOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlZFhtbFdyaXRlciBnZXRSb290KCkgeworICAgICAgICByZXR1cm4gcm9vdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU0VJTW9kZWwgZ2V0TW9kZWwoKSB7CisgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NCaW5kaW5nIGdldEJpbmRpbmcoKSB7CisgICAgICAgIHJldHVybiBiaW5kaW5nOworICAgIH0KKworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICByZXR1cm4gY29udGFpbmVyOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRFbmRwb2ludENsYXNzKCkgeworICAgICAgICByZXR1cm4gZW5kcG9pbnRDbGFzczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2FwaS93c2RsL3dyaXRlci9XU0RMR2VuZXJhdG9yRXh0ZW5zaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC93cml0ZXIvV1NETEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGI0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9hcGkvd3NkbC93cml0ZXIvV1NETEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLndyaXRlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5DaGVja2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5KYXZhTWV0aG9kOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CisKKy8qKgorICogVGhpcyBpcyBhIGNhbGxiYWNrIGludGVyZmFjZSB1c2VkIHRvIGV4dGVuZCB0aGUgV1NETEdlbmVyYXRvci4gIEltcGxlbWVudG9ycworICogb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGFkZCB0aGVpciBvd24gV1NETCBleHRlbnNpb25zIHRvIHRoZSBnZW5lcmF0ZWQgV1NETC4KKyAqIFRoZXJlIGFyZSBhIG51bWJlciBvZiBtZXRob2RzIHRoYXQgd2lsbCBiZSBpbnZva2VkIGFsbG93aW5nIHRoZSBleHRlbnNpb25zCisgKiB0byBiZSBnZW5lcmF0ZWQgb24gdmFyaW91cyBXU0RMIGVsZW1lbnRzLgorICogPHAvPgorICogVGhlIEpBWC1XUyBXU0RMR2VuZXJhdG9yIHVzZXMgVFhXIHRvIHNlcmlhbGl6ZSB0aGUgV1NETCBvdXQgdG8gWE1MLgorICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBUWFcgY2FuIGJlIGxvY2F0ZWQgYXQKKyAqIDxhIGhyZWY9Imh0dHA6Ly90eHcuZGV2LmphdmEubmV0Ij5odHRwOi8vdHh3LmRldi5qYXZhLm5ldDwvYT4uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uIHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgdGhlIHJvb3QgZWxlbWVudCBjYW4gYmUgbWFuaXB1bGF0ZWQgYmVmb3JlCisgICAgICogYW55IHRhZ3MgaGF2ZSBiZWVuIHdyaXR0ZW4uIFRoaXMgYWxsb3dzIHRvIHNldCBlLmcuIG5hbWVzcGFjZSBwcmVmaXhlcy4KKyAgICAgKiA8cC8+CisgICAgICogQW5vdGhlciBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGxldCBleHRlbnNpb25zIGtub3cgd2hhdCBtb2RlbAorICAgICAqIHdlIGFyZSBnZW5lcmF0aW5nIGEgV1NETCBmb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCAgICAgIFRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZ2VuZXJhdGVkIFdTREwuCisgICAgICogQHBhcmFtIG1vZGVsICAgICBXU0RMIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoaXMge0BsaW5rIFNFSU1vZGVsfS4KKyAgICAgKiBAcGFyYW0gYmluZGluZyAgIFRoZSBiaW5kaW5nIGZvciB3aGljaCB3ZSBnZW5lcmF0ZSBXU0RMLiB0aGUgYmluZGluZyB7QGxpbmsgV1NCaW5kaW5nfSByZXByZXNlbnRzIGEgcGFydGljdWxhcgorICAgICAqICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBKQVhXUy4gVGhpcyBjYW4gYmUgdHlwaWNhbGx5IGJlIG92ZXJyaWRlbiBieQorICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIGVudHJ5IHBvaW50IHRvIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIElmIHRoaXMgZXh0ZW5zaW9uIGlzIHVzZWQgYXQgdGhlIHJ1bnRpbWUgdG8gZ2VuZXJhdGUgV1NETCwgeW91IGdldCBhIHtAbGluayBDb250YWluZXJ9CisgICAgICogICAgICAgICAgICAgICAgICB0aGF0IHdhcyBnaXZlbiB0byB7QGxpbmsgV1NFbmRwb2ludCNjcmVhdGV9LgorICAgICAqICAgICAgICAgICAgICAgICAgVE9ETzogdGhpbmsgYWJvdXQgdG9vbCBzaWRlCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydChATm90TnVsbCBUeXBlZFhtbFdyaXRlciByb290LCBATm90TnVsbCBTRUlNb2RlbCBtb2RlbCwgQE5vdE51bGwgV1NCaW5kaW5nIGJpbmRpbmcsIEBOb3ROdWxsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIHdyaXRpbmcgPC93c2RsOmRlZmludGlvbnM+LgorICAgICAqCisgICAgICogQHBhcmFtIGN0eHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmQoQE5vdE51bGwgV1NETEdlbkV4dG5Db250ZXh0IGN0eHQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgdGhlIHJvb3QgZWxlbWVudCBjYW4gYmUgbWFuaXB1bGF0ZWQgYmVmb3JlCisgICAgICogYW55IHRhZ3MgaGF2ZSBiZWVuIHdyaXR0ZW4uIFRoaXMgYWxsb3dzIHRvIHNldCBlLmcuIG5hbWVzcGFjZSBwcmVmaXhlcy4KKyAgICAgKiA8cC8+CisgICAgICogQW5vdGhlciBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGxldCBleHRlbnNpb25zIGtub3cgd2hhdCBtb2RlbAorICAgICAqIHdlIGFyZSBnZW5lcmF0aW5nIGEgV1NETCBmb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4dCBQcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGdlbmVyYXRvciBleHRlbnNpb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoV1NETEdlbkV4dG5Db250ZXh0IGN0eHQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgZXh0ZW5zaW9ucyB0byBhIDxjb2RlPndzZGw6ZGVmaW5pdGlvbnM8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRlZmluaXRpb25zIFRoaXMgaXMgdGhlIDxjb2RlPndzZGw6ZGVmaW50aW9uczwvY29kZT4gZWxlbWVudCB0aGF0IHRoZSBleHRlbnNpb24gY2FuIGJlIGFkZGVkIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERlZmluaXRpb25zRXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIGRlZmluaXRpb25zKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBzbyB0aGF0IGV4dGVuc2lvbnMgdG8gYSA8Y29kZT53c2RsOnNlcnZpY2U8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhpcyBpcyB0aGUgPGNvZGU+d3NkbDpzZXJ2aWNlPC9jb2RlPiBlbGVtZW50IHRoYXQgdGhlIGV4dGVuc2lvbiBjYW4gYmUgYWRkZWQgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VydmljZUV4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBzZXJ2aWNlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBzbyB0aGF0IGV4dGVuc2lvbnMgdG8gYSA8Y29kZT53c2RsOnBvcnQ8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnQgVGhpcyBpcyB0aGUgd3NkbDpwb3J0IGVsZW1lbnQgdGhhdCB0aGUgZXh0ZW5zaW9uIGNhbiBiZSBhZGRlZCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3J0RXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIHBvcnQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgZXh0ZW5zaW9ucyB0byBhIDxjb2RlPndzZGw6cG9ydFR5cGU8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqIDxwLz4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0VHlwZSBUaGlzIGlzIHRoZSB3c2RsOnBvcnRUeXBlIGVsZW1lbnQgdGhhdCB0aGUgZXh0ZW5zaW9uIGNhbiBiZSBhZGRlZCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3J0VHlwZUV4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBwb3J0VHlwZSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgc28gdGhhdCBleHRlbnNpb25zIHRvIGEgPGNvZGU+d3NkbDpiaW5kaW5nPC9jb2RlPgorICAgICAqIGVsZW1lbnQgY2FuIGJlIGdlbmVyYXRlZC4KKyAgICAgKiA8cC8+CisgICAgICogPHAvPgorICAgICAqIFRPRE86ICBTb21lIG90aGVyIGluZm9ybWF0aW9uIG1heSBuZWVkIHRvIGJlIHBhc3NlZAorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmcgVGhpcyBpcyB0aGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQgdGhhdCB0aGUgZXh0ZW5zaW9uIGNhbiBiZSBhZGRlZCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nRXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIGJpbmRpbmcpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgZXh0ZW5zaW9ucyB0byBhIDxjb2RlPndzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb248L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG9wZXJhdGlvbiBUaGlzIGlzIHRoZSB3c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uICBlbGVtZW50IHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgICAgICBleHRlbnNpb24gY2FuIGJlIGFkZGVkIHRvLgorICAgICAqIEBwYXJhbSBtZXRob2QgICAge0BsaW5rIEphdmFNZXRob2R9IHdoaWNoIGNhcHR1cmVzIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbkV4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBvcGVyYXRpb24sIEphdmFNZXRob2QgbWV0aG9kKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgZXh0ZW5zaW9ucyB0byBhIDxjb2RlPndzZGw6YmluZGluZy93c2RsOm9wZXJhdGlvbjwvY29kZT4KKyAgICAgKiBlbGVtZW50IGNhbiBiZSBnZW5lcmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoaXMgaXMgdGhlIHdzZGw6YmluZGluZy93c2RsOm9wZXJhdGlvbiAgZWxlbWVudCB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIGNhbiBiZSBhZGRlZCB0by4KKyAgICAgKiBAcGFyYW0gbWV0aG9kICAgIHtAbGluayBKYXZhTWV0aG9kfSB3aGljaCBjYXB0dXJlcyBhbGwgdGhlIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIG9wZXJhdGlvbiwgSmF2YU1ldGhvZCBtZXRob2QpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgZXh0ZW5zaW9ucyB0byBhbiBpbnB1dCA8Y29kZT53c2RsOm1lc3NhZ2U8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhpcyBpcyB0aGUgaW5wdXQgd3NkbDptZXNzYWdlIGVsZW1lbnQgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBleHRlbnNpb24gY2FuIGJlIGFkZGVkIHRvLgorICAgICAqIEBwYXJhbSBtZXRob2QgIHtAbGluayBKYXZhTWV0aG9kfSB3aGljaCBjYXB0dXJlcyBhbGwgdGhlIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dE1lc3NhZ2VFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgbWVzc2FnZSwgSmF2YU1ldGhvZCBtZXRob2QpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgZXh0ZW5zaW9ucyB0byBhbiBvdXRwdXQgPGNvZGU+d3NkbDptZXNzYWdlPC9jb2RlPgorICAgICAqIGVsZW1lbnQgY2FuIGJlIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoaXMgaXMgdGhlIG91dHB1dCB3c2RsOm1lc3NhZ2UgZWxlbWVudCB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBjYW4gYmUgYWRkZWQgdG8uCisgICAgICogQHBhcmFtIG1ldGhvZCAge0BsaW5rIEphdmFNZXRob2R9IHdoaWNoIGNhcHR1cmVzIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE91dHB1dE1lc3NhZ2VFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgbWVzc2FnZSwgSmF2YU1ldGhvZCBtZXRob2QpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgc28gdGhhdCBleHRlbnNpb25zIHRvIGEKKyAgICAgKiA8Y29kZT53c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uL3dzZGw6aW5wdXQ8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0ICBUaGlzIGlzIHRoZSB3c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uL3dzZGw6aW5wdXQgIGVsZW1lbnQgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgIGV4dGVuc2lvbiBjYW4gYmUgYWRkZWQgdG8uCisgICAgICogQHBhcmFtIG1ldGhvZCB7QGxpbmsgSmF2YU1ldGhvZH0gd2hpY2ggY2FwdHVyZXMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSB3c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uSW5wdXRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgaW5wdXQsIEphdmFNZXRob2QgbWV0aG9kKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHNvIHRoYXQgZXh0ZW5zaW9ucyB0byBhIDxjb2RlPndzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24vd3NkbDpvdXRwdXQ8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGlzIGlzIHRoZSB3c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uL3dzZGw6b3V0cHV0ICBlbGVtZW50IHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgICBleHRlbnNpb24gY2FuIGJlIGFkZGVkIHRvLgorICAgICAqIEBwYXJhbSBtZXRob2Qge0BsaW5rIEphdmFNZXRob2R9IHdoaWNoIGNhcHR1cmVzIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbk91dHB1dEV4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBvdXRwdXQsIEphdmFNZXRob2QgbWV0aG9kKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBzbyB0aGF0IGV4dGVuc2lvbnMgdG8gYQorICAgICAqIDxjb2RlPndzZGw6YmluZGluZy93c2RsOm9wZXJhdGlvbi93c2RsOmlucHV0PC9jb2RlPgorICAgICAqIGVsZW1lbnQgY2FuIGJlIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCAgVGhpcyBpcyB0aGUgd3NkbDpiaW5kaW5nL3dzZGw6b3BlcmF0aW9uL3dzZGw6aW5wdXQgIGVsZW1lbnQgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgIGV4dGVuc2lvbiBjYW4gYmUgYWRkZWQgdG8uCisgICAgICogQHBhcmFtIG1ldGhvZCB7QGxpbmsgSmF2YU1ldGhvZH0gd2hpY2ggY2FwdHVyZXMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSB3c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQmluZGluZ09wZXJhdGlvbklucHV0RXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIGlucHV0LCBKYXZhTWV0aG9kIG1ldGhvZCkgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBzbyB0aGF0IGV4dGVuc2lvbnMgdG8gYSAgPGNvZGU+d3NkbDpiaW5kaW5nL3dzZGw6b3BlcmF0aW9uL3dzZGw6b3V0cHV0PC9jb2RlPgorICAgICAqIGVsZW1lbnQgY2FuIGJlIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgVGhpcyBpcyB0aGUgd3NkbDpiaW5kaW5nL3dzZGw6b3BlcmF0aW9uL3dzZGw6b3V0cHV0ICBlbGVtZW50IHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgICBleHRlbnNpb24gY2FuIGJlIGFkZGVkIHRvLgorICAgICAqIEBwYXJhbSBtZXRob2Qge0BsaW5rIEphdmFNZXRob2R9IHdoaWNoIGNhcHR1cmVzIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgd3NkbDpwb3J0VHlwZS93c2RsOm9wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmdPcGVyYXRpb25PdXRwdXRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgb3V0cHV0LCBKYXZhTWV0aG9kIG1ldGhvZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgc28gdGhhdCBleHRlbnNpb25zIHRvIGEgPGNvZGU+d3NkbDpiaW5kaW5nL3dzZGw6b3BlcmF0aW9uL3dzZGw6ZmF1bHQ8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGZhdWx0ICBUaGlzIGlzIHRoZSB3c2RsOmJpbmRpbmcvd3NkbDpvcGVyYXRpb24vd3NkbDpmYXVsdCBvciB3c2RsOnBvcnRUeXBlL3dzZGw6b3V0cHV0L3dzZGw6b3BlcmF0aW9uL3dzZGw6ZmF1bHQKKyAgICAgKiAgICAgICAgICAgICAgIGVsZW1lbnQgdGhhdCB0aGUgZXh0ZW5zaW9uIGNhbiBiZSBhZGRlZCB0by4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHtAbGluayBKYXZhTWV0aG9kfSB3aGljaCBjYXB0dXJlcyBhbGwgdGhlIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nT3BlcmF0aW9uRmF1bHRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgZmF1bHQsIEphdmFNZXRob2QgbWV0aG9kLCBDaGVja2VkRXhjZXB0aW9uIGNlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBzbyB0aGF0IGV4dGVuc2lvbnMgdG8gYSA8Y29kZT53c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uL3dzZGw6ZmF1bHQ8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhpcyBpcyB0aGUgZmF1bHQgd3NkbDptZXNzYWdlIGVsZW1lbnQgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBleHRlbnNpb24gY2FuIGJlIGFkZGVkIHRvLgorICAgICAqIEBwYXJhbSBtZXRob2QgIHtAbGluayBKYXZhTWV0aG9kfSB3aGljaCBjYXB0dXJlcyBhbGwgdGhlIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIHdzZGw6cG9ydFR5cGUvd3NkbDpvcGVyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBjZSAgICAgIHtAbGluayBDaGVja2VkRXhjZXB0aW9ufSB0aGF0IGFic3RyYWN0cyB3c2RsOmZhdWx0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmF1bHRNZXNzYWdlRXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIG1lc3NhZ2UsIEphdmFNZXRob2QgbWV0aG9kLCBDaGVja2VkRXhjZXB0aW9uIGNlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBzbyB0aGF0IGV4dGVuc2lvbnMgdG8gYSA8Y29kZT53c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uL3dzZGw6ZmF1bHQ8L2NvZGU+CisgICAgICogZWxlbWVudCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGZhdWx0ICBUaGlzIGlzIHRoZSB3c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uL3dzZGw6ZmF1bHQgIGVsZW1lbnQgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgIGV4dGVuc2lvbiBjYW4gYmUgYWRkZWQgdG8uCisgICAgICogQHBhcmFtIG1ldGhvZCB7QGxpbmsgSmF2YU1ldGhvZH0gd2hpY2ggY2FwdHVyZXMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSB3c2RsOnBvcnRUeXBlL3dzZGw6b3BlcmF0aW9uCisgICAgICogQHBhcmFtIGNlICAgICB7QGxpbmsgQ2hlY2tlZEV4Y2VwdGlvbn0gdGhhdCBhYnN0cmFjdHMgd3NkbDpmYXVsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbkZhdWx0RXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIGZhdWx0LCBKYXZhTWV0aG9kIG1ldGhvZCwgQ2hlY2tlZEV4Y2VwdGlvbiBjZSkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYmluZGluZy9CaW5kaW5nSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYmluZGluZy9CaW5kaW5nSW1wbC5qYXZhCmluZGV4IGEwMTA0YzEuLjIzOWI2YmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvQmluZGluZ0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9iaW5kaW5nL0JpbmRpbmdJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTgxICsyNSwxNTIgQEAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nOwogCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNoYWluQ2FsbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsZXIuUnVudGltZU1vZGVsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuU3lzdGVtSGFuZGxlckRlbGVnYXRlOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuSGFuZGxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLk1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZTsKIAotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKIGltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIC8qKgogICogSW5zdGFuY2VzIGFyZSBjcmVhdGVkIGJ5IHRoZSBzZXJ2aWNlLCB3aGljaCB0aGVuCi0gKiBzZXRzIHRoZSBoYW5kbGVyIGNoYWluIG9uIHRoZSBiaW5kaW5nIGltcGwuIFRoZSBoYW5kbGVyCi0gKiBjYWxsZXIgY2xhc3MgYWN0dWFsbHkgY3JlYXRlcyBhbmQgbWFuYWdlcyB0aGUgaGFuZGxlcnMuCisgKiBzZXRzIHRoZSBoYW5kbGVyIGNoYWluIG9uIHRoZSBiaW5kaW5nIGltcGwuCiAgKgotICogPHA+QWxzbyB1c2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZSwgd2hlcmUgbm9uLWFwaSBjYWxscyBzdWNoIGFzCi0gKiBnZXRIYW5kbGVyQ2hhaW5DYWxsZXIgY2Fubm90IGJlIHVzZWQuIFNvIHRoZSBiaW5kaW5nIGltcGwKLSAqIG5vdyBzdG9yZXMgdGhlIGhhbmRsZXIgbGlzdCByYXRoZXIgdGhhbiBkZWZlcnJpbmcgdG8gdGhlCi0gKiBoYW5kbGVyIGNoYWluIGNhbGxlci4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBpcyBtYWRlIGFic3RyYWN0IGFzIHdlIGRvbid0IHNlZSBhIHNpdHVhdGlvbiB3aGVuCisgKiBhIEJpbmRpbmdJbXBsIGhhcyBtdWNoIG1lYW5pbmcgd2l0aG91dCBiaW5kaW5nIGlkLgorICogSU9XLCBmb3IgYSBzcGVjaWZpYyBiaW5kaW5nIHRoZXJlIHdpbGwgYmUgYSBjbGFzcworICogZXh0ZW5kaW5nIEJpbmRpbmdJbXBsLCBmb3IgZXhhbXBsZSBTT0FQQmluZGluZ0ltcGwuCiAgKgotICogPHA+VGhpcyBjbGFzcyBpcyBtYWRlIGFic3RyYWN0IGFzIHdlIGRvbnQgc2VlIGEgc2l0dWF0aW9uIHdoZW4gYSBCaW5kaW5nSW1wbCBoYXMgbXVjaCBtZWFuaW5nIHdpdGhvdXQgYmluZGluZyBpZC4KLSAqIElPdywgZm9yIGEgc3BlY2lmaWMgYmluZGluZyB0aGVyZSB3aWxsIGJlIGEgY2xhc3MgZXh0ZW5kaW5nIEJpbmRpbmdJbXBsLCBmb3IgZXhhbXBsZSBTT0FQQmluZGluZ0ltcGwuCi0gKgotICogPHA+VGhlIHNwaSBCaW5kaW5nIGludGVyZmFjZSBleHRlbmRzIEJpbmRpbmcuCisgKiA8cD4KKyAqIFRoZSBzcGkgQmluZGluZyBpbnRlcmZhY2UgZXh0ZW5kcyBCaW5kaW5nLgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluZGluZ0ltcGwgaW1wbGVtZW50cwotICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLkJpbmRpbmcgeworcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmRpbmdJbXBsIGltcGxlbWVudHMgV1NCaW5kaW5nIHsKKyAgICBwcml2YXRlIEhhbmRsZXJDb25maWd1cmF0aW9uIGhhbmRsZXJDb25maWc7CisgICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nSUQgYmluZGluZ0lkOworICAgIC8vIEZlYXR1cmVzIHRoYXQgYXJlIHNldChlbmFibGVkL2Rpc2FibGVkKSBvbiB0aGUgYmluZGluZworICAgIHByb3RlY3RlZCBmaW5hbCBXZWJTZXJ2aWNlRmVhdHVyZUxpc3QgZmVhdHVyZXMgPSBuZXcgV2ViU2VydmljZUZlYXR1cmVMaXN0KCk7CiAKLSAgICAvLyBjYWxsZXIgaWdub3JlZCBvbiBzZXJ2ZXIgc2lkZQotICAgIHByb3RlY3RlZCBIYW5kbGVyQ2hhaW5DYWxsZXIgY2hhaW5DYWxsZXI7Ci0KLSAgICBwcml2YXRlIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBzeXN0ZW1IYW5kbGVyRGVsZWdhdGU7Ci0gICAgcHJpdmF0ZSBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzOwotICAgIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdJZDsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgc2VydmljZU5hbWU7Ci0KLSAgIC8vIGNhbGxlZCBieSBEaXNwYXRjaEltcGwKLSAgICBwdWJsaWMgQmluZGluZ0ltcGwoU3RyaW5nIGJpbmRpbmdJZCwgUU5hbWUgc2VydmljZU5hbWUpIHsKKyAgICBwcm90ZWN0ZWQgQmluZGluZ0ltcGwoQmluZGluZ0lEIGJpbmRpbmdJZCkgewogICAgICAgICB0aGlzLmJpbmRpbmdJZCA9IGJpbmRpbmdJZDsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICBzZXRIYW5kbGVyQ29uZmlnKGNyZWF0ZUhhbmRsZXJDb25maWcoQ29sbGVjdGlvbnMuPEhhbmRsZXI+ZW1wdHlMaXN0KCkpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQmluZGluZ0ltcGwoTGlzdDxIYW5kbGVyPiBoYW5kbGVyQ2hhaW4sIFN0cmluZyBiaW5kaW5nSWQsIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIGhhbmRsZXJzID0gaGFuZGxlckNoYWluOwotICAgICAgICB0aGlzLmJpbmRpbmdJZCA9IGJpbmRpbmdJZDsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgIHB1YmxpYworICAgIEBOb3ROdWxsCisgICAgTGlzdDxIYW5kbGVyPiBnZXRIYW5kbGVyQ2hhaW4oKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVyQ29uZmlnLmdldEhhbmRsZXJDaGFpbigpOworICAgIH0KKworICAgIHB1YmxpYyBIYW5kbGVyQ29uZmlndXJhdGlvbiBnZXRIYW5kbGVyQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gaGFuZGxlckNvbmZpZzsKICAgICB9CiAKIAogICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGxpc3QuIElmIHRoZXJlIGlzIGEgaGFuZGxlciBjaGFpbiBjYWxsZXIsCi0gICAgICogdGhpcyBpcyB0aGUgcHJvcGVyIGxpc3QuIE90aGVyd2lzZSwgcmV0dXJuIGEgY29weSBvZiAnaGFuZGxlcnMnCi0gICAgICogb3IgbnVsbCBpZiBsaXN0IGlzIG51bGwuIFRoZSBSdW50aW1lRW5kcG9pbnRJbmZvLmluaXQoKSBtZXRob2QKLSAgICAgKiByZWxpZXMgb24gdGhpcyBsaXN0IGJlaW5nIG51bGwgaWYgdGhlcmUgd2VyZSBubyBoYW5kbGVycwotICAgICAqIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgaGFuZGxlcnMuIFRoaXMgY2FuIGJlIG51bGwgaWYgdGhlcmUgYXJlCi0gICAgICogbm8gaGFuZGxlcnMuIFRoZSBsaXN0IG1heSBoYXZlIGEgZGlmZmVyZW50IG9yZGVyIGRlcGVuZGluZyBvbgotICAgICAqIHdoZXRoZXIgb3Igbm90IHRoZSBoYW5kbGVycyBoYXZlIGJlZW4gY2FsbGVkIHlldCwgc2luY2UgdGhlCi0gICAgICogbG9naWNhbCBhbmQgcHJvdG9jb2wgaGFuZGxlcnMgd2lsbCBiZSBzb3J0ZWQgYmVmb3JlIGNhbGxpbmcgdGhlbS4KLSAgICAgKgotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVFbmRwb2ludEluZm8jaW5pdAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbigpIHsKLSAgICAgICAgaWYgKGNoYWluQ2FsbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KGNoYWluQ2FsbGVyLmdldEhhbmRsZXJDaGFpbigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoaGFuZGxlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0hhbmRsZXJzKCkgewotICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCB8fCBoYW5kbGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhhbmRsZXJzIG9uIHRoZSBiaW5kaW5nLiBJZiB0aGUgaGFuZGxlciBjaGFpbgotICAgICAqIGNhbGxlciBhbHJlYWR5IGV4aXN0cywgdGhlbiB0aGUgaGFuZGxlcnMgd2lsbCBiZSBzZXQgb24KLSAgICAgKiB0aGUgY2FsbGVyIGFuZCB0aGUgaGFuZGxlciBjaGFpbiBoZWxkIGJ5IHRoZSBiaW5kaW5nIHdpbGwKLSAgICAgKiBiZSB0aGUgc29ydGVkIGxpc3QuCisgICAgICogU2V0cyB0aGUgaGFuZGxlcnMgb24gdGhlIGJpbmRpbmcgYW5kIHRoZW4KKyAgICAgKiBzb3J0cyB0aGUgaGFuZGxlcnMgaW4gdG8gbG9naWNhbCBhbmQgcHJvdG9jb2wgaGFuZGxlcnMuCisgICAgICogQ3JlYXRlcyBhIG5ldyBIYW5kbGVyQ29uZmlndXJhdGlvbiBvYmplY3QgYW5kIHNldHMgaXQgb24gdGhlIEJpbmRpbmdJbXBsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbihMaXN0PEhhbmRsZXI+IGNoYWluKSB7Ci0gICAgICAgIGlmIChjaGFpbkNhbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjaGFpbkNhbGxlciA9IG5ldyBIYW5kbGVyQ2hhaW5DYWxsZXIoY2hhaW4pOwotICAgICAgICAgICAgaGFuZGxlcnMgPSBjaGFpbkNhbGxlci5nZXRIYW5kbGVyQ2hhaW4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZXJzID0gY2hhaW47Ci0gICAgICAgIH0KKyAgICAgICAgc2V0SGFuZGxlckNvbmZpZyhjcmVhdGVIYW5kbGVyQ29uZmlnKGNoYWluKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgaGFuZGxlciBjaGFpbiBjYWxsZXIgaWYgbmVlZGVkIGFuZCByZXR1cm5zCi0gICAgICogaXQuIE9uY2UgdGhlIGhhbmRsZXIgY2hhaW4gY2FsbGVyIGV4aXN0cywgdGhpcyBjbGFzcwotICAgICAqIGRlZmVycyBnZXRIYW5kbGVycygpIGNhbGxzIHRvIGl0IHRvIGdldCB0aGUgbmV3IHNvcnRlZAotICAgICAqIGxpc3Qgb2YgaGFuZGxlcnMuCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBldmVyIEJpbmRpbmcuc2V0SGFuZGxlckNoYWluKCkgb3IgU09BUEJpbmRpbmcuc2V0Um9sZXMoKQorICAgICAqIGlzIGNhbGxlZC4KKyAgICAgKiBUaGlzIHNvcnRzIG91dCB0aGUgSGFuZGxlcnMgaW50byBMb2dpY2FsIGFuZCBTT0FQIEhhbmRsZXJzIGFuZAorICAgICAqIHNldHMgdGhlIEhhbmRsZXJDb25maWd1cmF0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5DYWxsZXIgZ2V0SGFuZGxlckNoYWluQ2FsbGVyKCkgewotICAgICAgICBpZiAoY2hhaW5DYWxsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhaW5DYWxsZXIgPSBuZXcgSGFuZGxlckNoYWluQ2FsbGVyKGhhbmRsZXJzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhaW5DYWxsZXI7CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SGFuZGxlckNvbmZpZyhIYW5kbGVyQ29uZmlndXJhdGlvbiBoYW5kbGVyQ29uZmlnKSB7CisgICAgICAgIHRoaXMuaGFuZGxlckNvbmZpZyA9IGhhbmRsZXJDb25maWc7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSWQoKXsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSGFuZGxlckNvbmZpZ3VyYXRpb24gY3JlYXRlSGFuZGxlckNvbmZpZyhMaXN0PEhhbmRsZXI+IGhhbmRsZXJDaGFpbik7CisKKyAgICBwdWJsaWMKKyAgICBATm90TnVsbAorICAgIEJpbmRpbmdJRCBnZXRCaW5kaW5nSWQoKSB7CiAgICAgICAgIHJldHVybiBiaW5kaW5nSWQ7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3R1YWxCaW5kaW5nSWQoKSB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nSWQ7CisgICAgcHVibGljIGZpbmFsIFNPQVBWZXJzaW9uIGdldFNPQVBWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gYmluZGluZ0lkLmdldFNPQVBWZXJzaW9uKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoUU5hbWUgc2VydmljZU5hbWUpewotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgcHVibGljIEFkZHJlc3NpbmdWZXJzaW9uIGdldEFkZHJlc3NpbmdWZXJzaW9uKCkgeworICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbiBhZGRyZXNzaW5nVmVyc2lvbjsKKyAgICAgICAgaWYgKGZlYXR1cmVzLmlzRW5hYmxlZChBZGRyZXNzaW5nRmVhdHVyZS5jbGFzcykpCisgICAgICAgICAgICBhZGRyZXNzaW5nVmVyc2lvbiA9IEFkZHJlc3NpbmdWZXJzaW9uLlczQzsKKyAgICAgICAgZWxzZSBpZiAoZmVhdHVyZXMuaXNFbmFibGVkKE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5jbGFzcykpCisgICAgICAgICAgICBhZGRyZXNzaW5nVmVyc2lvbiA9IEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkcmVzc2luZ1ZlcnNpb24gPSBudWxsOworICAgICAgICByZXR1cm4gYWRkcmVzc2luZ1ZlcnNpb247CiAgICAgfQogCi0gICAgcHVibGljIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBnZXRTeXN0ZW1IYW5kbGVyRGVsZWdhdGUoKSB7Ci0gICAgICAgIHJldHVybiBzeXN0ZW1IYW5kbGVyRGVsZWdhdGU7CisgICAgcHVibGljIGZpbmFsCisgICAgQE5vdE51bGwKKyAgICBDb2RlYyBjcmVhdGVDb2RlYygpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmdJZC5jcmVhdGVFbmNvZGVyKHRoaXMpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZShTeXN0ZW1IYW5kbGVyRGVsZWdhdGUgZGVsZWdhdGUpIHsKLSAgICAgICAgc3lzdGVtSGFuZGxlckRlbGVnYXRlID0gZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5CaW5kaW5nIGdldEJpbmRpbmcoU3RyaW5nIGJpbmRpbmdJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBpbXBsZW1lbnRvckNsYXNzLCBRTmFtZSBzZXJ2aWNlTmFtZSwgYm9vbGVhbiB0b2tlbnNPSykgewotCi0gICAgICAgIGlmIChiaW5kaW5nSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0cyBiaW5kaW5nSWQgZnJvbSBAQmluZGluZ1R5cGUgYW5ub3RhdGlvbgotICAgICAgICAgICAgYmluZGluZ0lkID0gUnVudGltZU1vZGVsZXIuZ2V0QmluZGluZ0lkKGltcGxlbWVudG9yQ2xhc3MpOwotICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCA9PSBudWxsKSB7ICAgICAgICAgICAgLy8gRGVmYXVsdCBvbmUKLSAgICAgICAgICAgICAgICBiaW5kaW5nSWQgPSBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRva2Vuc09LKSB7Ci0gICAgICAgICAgICBpZiAoYmluZGluZ0lkLmVxdWFscygiIyNTT0FQMTFfSFRUUCIpKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkID0gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nSWQuZXF1YWxzKCIjI1NPQVAxMV9IVFRQX01UT00iKSkgewotICAgICAgICAgICAgICAgIGJpbmRpbmdJZCA9IFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nSWQuZXF1YWxzKCIjI1NPQVAxMl9IVFRQIikpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nSWQgPSBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmdJZC5lcXVhbHMoIiMjU09BUDEyX0hUVFBfTVRPTSIpKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkID0gU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmdJZC5lcXVhbHMoIiMjWE1MX0hUVFAiKSkgewotICAgICAgICAgICAgICAgIGJpbmRpbmdJZCA9IEhUVFBCaW5kaW5nLkhUVFBfQklORElORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpCi0gICAgICAgICAgICB8fCBiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKQotICAgICAgICAgICAgfHwgYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpCi0gICAgICAgICAgICB8fCBiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKQotICAgICAgICAgICAgfHwgYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZ0ltcGwuWF9TT0FQMTJIVFRQX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBCaW5kaW5nSW1wbChiaW5kaW5nSWQsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nSWQuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpIHsKKyAgICBwdWJsaWMgc3RhdGljIEJpbmRpbmdJbXBsIGNyZWF0ZShATm90TnVsbCBCaW5kaW5nSUQgYmluZGluZ0lkKSB7CisgICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKEJpbmRpbmdJRC5YTUxfSFRUUCkpCiAgICAgICAgICAgICByZXR1cm4gbmV3IEhUVFBCaW5kaW5nSW1wbCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgYmluZGluZ0lkICIrYmluZGluZ0lkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQQmluZGluZ0ltcGwoYmluZGluZ0lkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJpbmRpbmdJbXBsIGNyZWF0ZShATm90TnVsbCBCaW5kaW5nSUQgYmluZGluZ0lkLCBXZWJTZXJ2aWNlRmVhdHVyZVtdIGZlYXR1cmVzKSB7CisgICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKEJpbmRpbmdJRC5YTUxfSFRUUCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IEhUVFBCaW5kaW5nSW1wbCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBCaW5kaW5nSW1wbChiaW5kaW5nSWQsIGZlYXR1cmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFdTQmluZGluZyBnZXREZWZhdWx0QmluZGluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTT0FQQmluZGluZ0ltcGwoQmluZGluZ0lELlNPQVAxMV9IVFRQKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdJRCgpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmdJZC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBATnVsbGFibGUgPEYgZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZT4gRiBnZXRGZWF0dXJlKEBOb3ROdWxsIENsYXNzPEY+IGZlYXR1cmVUeXBlKXsKKyAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmdldChmZWF0dXJlVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGZWF0dXJlRW5hYmxlZChATm90TnVsbCBDbGFzczw/IGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmU+IGZlYXR1cmUpeworICAgICAgICByZXR1cm4gZmVhdHVyZXMuaXNFbmFibGVkKGZlYXR1cmUpOworICAgIH0KKworICAgIEBOb3ROdWxsCisgICAgcHVibGljIFdlYlNlcnZpY2VGZWF0dXJlTGlzdCBnZXRGZWF0dXJlcygpIHsKKyAgICAgICAgcmV0dXJuIGZlYXR1cmVzOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoV2ViU2VydmljZUZlYXR1cmUuLi4gbmV3RmVhdHVyZXMpIHsKKyAgICAgICAgaWYgKG5ld0ZlYXR1cmVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoV2ViU2VydmljZUZlYXR1cmUgZiA6IG5ld0ZlYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgZmVhdHVyZXMuYWRkKGYpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBCaW5kaW5nIGdldERlZmF1bHRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFNPQVBCaW5kaW5nSW1wbChTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmluZGluZyBnZXREZWZhdWx0QmluZGluZyhRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IFNPQVBCaW5kaW5nSW1wbChTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIHNlcnZpY2VOYW1lKTsKKyAgICBwdWJsaWMgdm9pZCBhZGRGZWF0dXJlKEBOb3ROdWxsIFdlYlNlcnZpY2VGZWF0dXJlIG5ld0ZlYXR1cmUpIHsKKyAgICAgICAgZmVhdHVyZXMuYWRkKG5ld0ZlYXR1cmUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvSFRUUEJpbmRpbmdJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9iaW5kaW5nL0hUVFBCaW5kaW5nSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWY0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9iaW5kaW5nL0hUVFBCaW5kaW5nSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZzsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkhhbmRsZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5DbGllbnRNZXNzYWdlczsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworcHVibGljIGNsYXNzIEhUVFBCaW5kaW5nSW1wbCBleHRlbmRzIEJpbmRpbmdJbXBsIGltcGxlbWVudHMgSFRUUEJpbmRpbmcgeworCisgICAgLyoqCisgICAgICogVXNlIHtAbGluayBCaW5kaW5nSW1wbCNjcmVhdGUoQmluZGluZ0lEKX0gdG8gY3JlYXRlIHRoaXMuCisgICAgICovCisgICAgSFRUUEJpbmRpbmdJbXBsKCkgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYSByZWFsIENvZGVjIGZvciB0aGVzZQorICAgICAgICBzdXBlcihCaW5kaW5nSUQuWE1MX0hUVFApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHNlcGFyYXRlcyB0aGUgbG9naWNhbCBhbmQgcHJvdG9jb2wgaGFuZGxlcnMgYW5kCisgICAgICogc2V0cyB0aGUgSGFuZGxlckNvbmZpZ3VyYXRpb24uCisgICAgICogT25seSBsb2dpY2FsIGhhbmRsZXJzIGFyZSBhbGxvd2VkIHdpdGggSFRUUEJpbmRpbmcuCisgICAgICogU2V0dGluZyBTT0FQSGFuZGxlcnMgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFuZGxlckNvbmZpZ3VyYXRpb24gY3JlYXRlSGFuZGxlckNvbmZpZyhMaXN0PEhhbmRsZXI+IGhhbmRsZXJDaGFpbikgeworICAgICAgICBMaXN0PExvZ2ljYWxIYW5kbGVyPiBsb2dpY2FsSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PExvZ2ljYWxIYW5kbGVyPigpOworICAgICAgICBmb3IgKEhhbmRsZXIgaGFuZGxlciA6IGhhbmRsZXJDaGFpbikgeworICAgICAgICAgICAgaWYgKCEoaGFuZGxlciBpbnN0YW5jZW9mIExvZ2ljYWxIYW5kbGVyKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKENsaWVudE1lc3NhZ2VzLk5PTl9MT0dJQ0FMX0hBTkRMRVJfU0VUKGhhbmRsZXIuZ2V0Q2xhc3MoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2dpY2FsSGFuZGxlcnMuYWRkKChMb2dpY2FsSGFuZGxlcikgaGFuZGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5U2V0KCksCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPFFOYW1lPmVtcHR5U2V0KCksCisgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluLGxvZ2ljYWxIYW5kbGVycyxudWxsLG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvU09BUEJpbmRpbmdJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9iaW5kaW5nL1NPQVBCaW5kaW5nSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmU3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9iaW5kaW5nL1NPQVBCaW5kaW5nSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZzsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkhhbmRsZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLkhhbmRsZXJFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkNsaWVudE1lc3NhZ2VzOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKworLyoqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNPQVBCaW5kaW5nSW1wbCBleHRlbmRzIEJpbmRpbmdJbXBsIGltcGxlbWVudHMgU09BUEJpbmRpbmcgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9TT0FQMTJIVFRQX0JJTkRJTkcgPQorICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4d3MvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX05PTkUgPSBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuUk9MRV9OT05FOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gcm9sZXM7CisgICAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVNdG9tOworICAgIHByb3RlY3RlZCBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKworICAgIHByaXZhdGUgU2V0PFFOYW1lPiBwb3J0S25vd25IZWFkZXJzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKworICAgIC8qKgorICAgICAqIFVzZSB7QGxpbmsgQmluZGluZ0ltcGwjY3JlYXRlKEJpbmRpbmdJRCl9IHRvIGNyZWF0ZSB0aGlzLgorICAgICAqLworICAgIFNPQVBCaW5kaW5nSW1wbChCaW5kaW5nSUQgYmluZGluZ0lkKSB7CisgICAgICAgIHRoaXMoYmluZGluZ0lkLEVNUFRZX0ZFQVRVUkVTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2Uge0BsaW5rIEJpbmRpbmdJbXBsI2NyZWF0ZShCaW5kaW5nSUQpfSB0byBjcmVhdGUgdGhpcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZWF0dXJlcworICAgICAqICAgICAgVGhlc2UgZmVhdHVyZXMgaGF2ZSBhIHByZWNlZGVuY2Ugb3ZlcgorICAgICAqICAgICAge0BsaW5rIEJpbmRpbmdJRCNjcmVhdGVCdWlsdGluRmVhdHVyZUxpc3QoKSB0aGUgaW1wbGljaXQgZmVhdHVyZXN9CisgICAgICogICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBCaW5kaW5nSUR9LgorICAgICAqLworICAgIFNPQVBCaW5kaW5nSW1wbChCaW5kaW5nSUQgYmluZGluZ0lkLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgeworICAgICAgICBzdXBlcihiaW5kaW5nSWQpOworICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gYmluZGluZ0lkLmdldFNPQVBWZXJzaW9uKCk7CisgICAgICAgIHJvbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBhZGRSZXF1aXJlZFJvbGVzKCk7CisgICAgICAgIC8vSXMgdGhpcyBzdGlsbCByZXF1aXJlZD8gY29tbWVudCBvdXQgZm9yIG5vdworICAgICAgICAvL3NldHVwU3lzdGVtSGFuZGxlckRlbGVnYXRlKHNlcnZpY2VOYW1lKTsKKworICAgICAgICBzZXRGZWF0dXJlcyhmZWF0dXJlcyk7CisgICAgICAgIHRoaXMuZmVhdHVyZXMuYWRkQWxsKGJpbmRpbmdJZC5jcmVhdGVCdWlsdGluRmVhdHVyZUxpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaWYgdGhlIGJpbmRpbmcgaGFzIFNPQVBTRUlNb2RlbAorICAgICAqICBUaGUgSGVhZGVycyB1bmRlcnN0b29kIGJ5IHRoZSBQb3J0IGFyZSBzZXQsIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBmb3IgTVUKKyAgICAgKiAgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydEtub3duSGVhZGVycyhATm90TnVsbCBTZXQ8UU5hbWU+IGhlYWRlcnMpIHsKKyAgICAgICAgdGhpcy5wb3J0S25vd25IZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgLy8gYXBwbHkgdGhpcyBjaGFuZ2UgdG8gSGFuZGxlckNvbmZpZ3VyYXRpb24KKyAgICAgICAgc2V0SGFuZGxlckNvbmZpZyhjcmVhdGVIYW5kbGVyQ29uZmlnKGdldEhhbmRsZXJDaGFpbigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2VwYXJhdGVzIHRoZSBsb2dpY2FsIGFuZCBwcm90b2NvbCBoYW5kbGVycy4KKyAgICAgKiBBbHNvIHBhcnNlcyBIZWFkZXJzIHVuZGVyc3Rvb2QgYnkgU09BUEhhbmRsZXJzIGFuZAorICAgICAqIHNldHMgdGhlIEhhbmRsZXJDb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYW5kbGVyQ29uZmlndXJhdGlvbiBjcmVhdGVIYW5kbGVyQ29uZmlnKExpc3Q8SGFuZGxlcj4gaGFuZGxlckNoYWluKSB7CisgICAgICAgIExpc3Q8TG9naWNhbEhhbmRsZXI+IGxvZ2ljYWxIYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8TG9naWNhbEhhbmRsZXI+KCk7CisgICAgICAgIExpc3Q8U09BUEhhbmRsZXI+IHNvYXBIYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8U09BUEhhbmRsZXI+KCk7CisgICAgICAgIFNldDxRTmFtZT4gaGFuZGxlcktub3duSGVhZGVycyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOworCisgICAgICAgIGZvciAoSGFuZGxlciBoYW5kbGVyIDogaGFuZGxlckNoYWluKSB7CisgICAgICAgICAgICBpZiAoaGFuZGxlciBpbnN0YW5jZW9mIExvZ2ljYWxIYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgbG9naWNhbEhhbmRsZXJzLmFkZCgoTG9naWNhbEhhbmRsZXIpIGhhbmRsZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgU09BUEhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICBzb2FwSGFuZGxlcnMuYWRkKChTT0FQSGFuZGxlcikgaGFuZGxlcik7CisgICAgICAgICAgICAgICAgU2V0PFFOYW1lPiBoZWFkZXJzID0gKChTT0FQSGFuZGxlcjw/PikgaGFuZGxlcikuZ2V0SGVhZGVycygpOworICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlcktub3duSGVhZGVycy5hZGRBbGwoaGVhZGVycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSGFuZGxlckV4Y2VwdGlvbigiaGFuZGxlci5ub3QudmFsaWQudHlwZSIsCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyQ29uZmlndXJhdGlvbihyb2xlcyxwb3J0S25vd25IZWFkZXJzLGhhbmRsZXJDaGFpbiwKKyAgICAgICAgICAgICAgICBsb2dpY2FsSGFuZGxlcnMsc29hcEhhbmRsZXJzLGhhbmRsZXJLbm93bkhlYWRlcnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZFJlcXVpcmVkUm9sZXMoKSB7CisgICAgICAgIHJvbGVzLmFkZEFsbChzb2FwVmVyc2lvbi5yZXF1aXJlZFJvbGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Um9sZXMoKSB7CisgICAgICAgIHJldHVybiByb2xlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBuZXh0IGFuZCBvdGhlciByb2xlcyBpbiBjYXNlIHRoaXMgaGFzCisgICAgICogYmVlbiBjYWxsZWQgYnkgYSB1c2VyIHdpdGhvdXQgdGhlbS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IEhhbmRsZXJDb25maWd1cmF0aW9uIG9iamVjdCBhbmQgc2V0cyBpdCBvbiB0aGUgQmluZGluZ0ltcGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZXMoU2V0PFN0cmluZz4gcm9sZXMpIHsKKyAgICAgICAgaWYgKHJvbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJvbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICB9CisgICAgICAgIGlmIChyb2xlcy5jb250YWlucyhST0xFX05PTkUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihDbGllbnRNZXNzYWdlcy5JTlZBTElEX1NPQVBfUk9MRV9OT05FKCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMucm9sZXMgPSByb2xlczsKKyAgICAgICAgYWRkUmVxdWlyZWRSb2xlcygpOworICAgICAgICBIYW5kbGVyQ29uZmlndXJhdGlvbiBvbGRDb25maWcgPSBnZXRIYW5kbGVyQ29uZmlnKCk7CisgICAgICAgIHNldEhhbmRsZXJDb25maWcobmV3IEhhbmRsZXJDb25maWd1cmF0aW9uKHRoaXMucm9sZXMsIHBvcnRLbm93bkhlYWRlcnMsIG9sZENvbmZpZy5nZXRIYW5kbGVyQ2hhaW4oKSwKKyAgICAgICAgICAgICAgICBvbGRDb25maWcuZ2V0TG9naWNhbEhhbmRsZXJzKCksb2xkQ29uZmlnLmdldFNvYXBIYW5kbGVycygpLAorICAgICAgICAgICAgICAgIG9sZENvbmZpZy5nZXRIYW5kbGVyS25vd25IZWFkZXJzKCkpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVzZWQgdHlwaWNhbGx5IGJ5IHRoZSBydW50aW1lIHRvIGVuYWJsZS9kaXNhYmxlIE10b20gb3B0aW1pemF0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGlzRmVhdHVyZUVuYWJsZWQoTVRPTUZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsaWVudCBhcHBsaWNhdGlvbiBjYW4gb3ZlcnJpZGUgaWYgdGhlIE1UT00gb3B0aW1pemF0aW9uIHNob3VsZCBiZSBlbmFibGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TVRPTUVuYWJsZWQoYm9vbGVhbiBiKSB7CisgICAgICAgIHNldEZlYXR1cmVzKG5ldyBNVE9NRmVhdHVyZShiKSk7CisgICAgfQorCisgICAgcHVibGljIFNPQVBGYWN0b3J5IGdldFNPQVBGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc29hcFZlcnNpb24uc2FhalNvYXBGYWN0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlRmFjdG9yeSBnZXRNZXNzYWdlRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHNvYXBWZXJzaW9uLnNhYWpNZXNzYWdlRmFjdG9yeTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlRmVhdHVyZVtdIEVNUFRZX0ZFQVRVUkVTID0gbmV3IFdlYlNlcnZpY2VGZWF0dXJlWzBdOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvYmluZGluZy9XZWJTZXJ2aWNlRmVhdHVyZUxpc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvV2ViU2VydmljZUZlYXR1cmVMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkNDBhNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvV2ViU2VydmljZUZlYXR1cmVMaXN0LmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmc7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTRmVhdHVyZUxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkZlYXR1cmVDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMRmVhdHVyZWRPYmplY3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUnVudGltZU1vZGVsZXJFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMUG9ydEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLk1vZGVsZXJNZXNzYWdlczsKKworaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZzsKK2ltcG9ydCBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT007CitpbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTUZlYXR1cmU7CitpbXBvcnQgamF2YXgueG1sLndzLnNwaS5XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpc3Qgb2Yge0BsaW5rIFdlYlNlcnZpY2VGZWF0dXJlfXMgdGhhdCBoYXMgYnVuY2ggb2YgdXRpbGl0eSBtZXRob2RzCisgKiBwZXJ0YWluaW5nIHRvIHdlYiBzZXJ2aWNlIGZlYXR1cmVzLgorICoKKyAqIEBhdXRob3IgUmFtYSBQdWxhdmFydGhpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlRmVhdHVyZUxpc3QgaW1wbGVtZW50cyBXU0ZlYXR1cmVMaXN0IHsKKyAgICBwcml2YXRlIE1hcDxDbGFzczw/IGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmU+LCBXZWJTZXJ2aWNlRmVhdHVyZT4gd3NmZWF0dXJlcyA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmU+LCBXZWJTZXJ2aWNlRmVhdHVyZT4oKTsKKyAgICBwdWJsaWMgV2ViU2VydmljZUZlYXR1cmVMaXN0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlIHRvIHRoaXMgcGFyZW50IGlmIG5vbi1udWxsLgorICAgICAqLworICAgIHByaXZhdGUKKyAgICBATnVsbGFibGUKKyAgICBXU0RMRmVhdHVyZWRPYmplY3QgcGFyZW50OworCisgICAgcHVibGljIFdlYlNlcnZpY2VGZWF0dXJlTGlzdChATm90TnVsbCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgeworICAgICAgICBpZiAoZmVhdHVyZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIGZvciAoV2ViU2VydmljZUZlYXR1cmUgZiA6IGZlYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgd3NmZWF0dXJlcy5wdXQoZi5nZXRDbGFzcygpLCBmKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbGlzdCBieSByZWFkaW5nIGZlYXR1ZXJzIGZyb20gdGhlIGFubm90YXRpb24gb24gYSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2ViU2VydmljZUZlYXR1cmVMaXN0KEBOb3ROdWxsIENsYXNzPD8+IGVuZHBvaW50Q2xhc3MpIHsKKyAgICAgICAgcGFyc2VBbm5vdGF0aW9ucyhlbmRwb2ludENsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB7QGxpbmsgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIGZlYXR1cmUgYW5ub3RhdGlvbnN9IG9uIGEgY2xhc3MKKyAgICAgKiBhbmQgYWRkcyB0aGVtIHRvIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlQW5ub3RhdGlvbnMoQ2xhc3M8Pz4gZW5kcG9pbnRDbGFzcykgeworICAgICAgICBmb3IgKEFubm90YXRpb24gYSA6IGVuZHBvaW50Q2xhc3MuZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgLy8gVE9ETzogdGhpcyByZWFsbHkgbmVlZHMgZ2VuZXJhbGl6YXRpb24KKyAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlIGZ0cjsKKyAgICAgICAgICAgIGlmICghKGEuYW5ub3RhdGlvblR5cGUoKS5pc0Fubm90YXRpb25QcmVzZW50KFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbi5jbGFzcykpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBBZGRyZXNzaW5nKSB7CisgICAgICAgICAgICAgICAgQWRkcmVzc2luZyBhZGRBbm4gPSAoQWRkcmVzc2luZykgYTsKKyAgICAgICAgICAgICAgICBmdHIgPSBuZXcgQWRkcmVzc2luZ0ZlYXR1cmUoYWRkQW5uLmVuYWJsZWQoKSwgYWRkQW5uLnJlcXVpcmVkKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgTVRPTSkgeworICAgICAgICAgICAgICAgIE1UT00gbXRvbUFubiA9IChNVE9NKSBhOworICAgICAgICAgICAgICAgIGZ0ciA9IG5ldyBNVE9NRmVhdHVyZShtdG9tQW5uLmVuYWJsZWQoKSwgbXRvbUFubi50aHJlc2hvbGQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBjb25mbGljdCB3aXRoIEBCaW5kaW5nVHlwZQorICAgICAgICAgICAgICAgIEJpbmRpbmdJRCBiaW5kaW5nSUQgPSBCaW5kaW5nSUQucGFyc2UoZW5kcG9pbnRDbGFzcyk7CisgICAgICAgICAgICAgICAgTVRPTUZlYXR1cmUgYmluZGluZ010b21TZXR0aW5nID0gYmluZGluZ0lELmNyZWF0ZUJ1aWx0aW5GZWF0dXJlTGlzdCgpLmdldChNVE9NRmVhdHVyZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdNdG9tU2V0dGluZyAhPSBudWxsICYmIGJpbmRpbmdNdG9tU2V0dGluZy5pc0VuYWJsZWQoKSBeIGZ0ci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxlck1lc3NhZ2VzLlJVTlRJTUVfTU9ERUxFUl9NVE9NX0NPTkZMSUNUKGJpbmRpbmdJRCwgZnRyLmlzRW5hYmxlZCgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBSZXNwZWN0QmluZGluZykgeworICAgICAgICAgICAgICAgIFJlc3BlY3RCaW5kaW5nIHJiQW5uID0gKFJlc3BlY3RCaW5kaW5nKSBhOworICAgICAgICAgICAgICAgIGZ0ciA9IG5ldyBSZXNwZWN0QmluZGluZ0ZlYXR1cmUocmJBbm4uZW5hYmxlZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnRyID0gZ2V0V2ViU2VydmljZUZlYXR1cmVCZWFuKGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkKGZ0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlRmVhdHVyZSBnZXRXZWJTZXJ2aWNlRmVhdHVyZUJlYW4oQW5ub3RhdGlvbiBhKSB7CisgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbiB3c2ZhID0gYS5hbm5vdGF0aW9uVHlwZSgpLmdldEFubm90YXRpb24oV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFdlYlNlcnZpY2VGZWF0dXJlPiBiZWFuQ2xhc3MgPSB3c2ZhLmJlYW4oKTsKKyAgICAgICAgV2ViU2VydmljZUZlYXR1cmUgYmVhbjsKKworICAgICAgICBDb25zdHJ1Y3RvciBmdHJDdHIgPSBudWxsOworICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzID0gbnVsbDsKKyAgICAgICAgZm9yIChDb25zdHJ1Y3RvciBjb24gOiBiZWFuQ2xhc3MuZ2V0Q29uc3RydWN0b3JzKCkpIHsKKyAgICAgICAgICAgIEZlYXR1cmVDb25zdHJ1Y3RvciBmdHJDdHJBbm4gPSAoRmVhdHVyZUNvbnN0cnVjdG9yKSBjb24uZ2V0QW5ub3RhdGlvbihGZWF0dXJlQ29uc3RydWN0b3IuY2xhc3MpOworICAgICAgICAgICAgaWYgKGZ0ckN0ckFubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGZ0ckN0ciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZ0ckN0ciA9IGNvbjsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9IGZ0ckN0ckFubi52YWx1ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKE1vZGVsZXJNZXNzYWdlcy5SVU5USU1FX01PREVMRVJfV1NGRUFUVVJFX01PUkVUSEFOT05FX0ZUUkNPTlNUUlVDVE9SKGEsIGJlYW5DbGFzcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZnRyQ3RyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKE1vZGVsZXJNZXNzYWdlcy5SVU5USU1FX01PREVMRVJfV1NGRUFUVVJFX05PX0ZUUkNPTlNUUlVDVE9SKGEsIGJlYW5DbGFzcykpOworICAgICAgICB9CisgICAgICAgIGlmIChmdHJDdHIuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggIT0gcGFyYW1OYW1lcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKE1vZGVsZXJNZXNzYWdlcy5SVU5USU1FX01PREVMRVJfV1NGRUFUVVJFX0lMTEVHQUxfRlRSQ09OU1RSVUNUT1IoYSwgYmVhbkNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1zID0gbmV3IE9iamVjdFtwYXJhbU5hbWVzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNZXRob2QgbSA9IGEuYW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJlZE1ldGhvZChwYXJhbU5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBtLmludm9rZShhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJlYW4gPSAoV2ViU2VydmljZUZlYXR1cmUpIGZ0ckN0ci5uZXdJbnN0YW5jZShwYXJhbXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFdlYlNlcnZpY2VGZWF0dXJlPiBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXJnZWRGZWF0dXJlcyhwYXJlbnQuZ2V0RmVhdHVyZXMoKSk7CisgICAgICAgIHJldHVybiB3c2ZlYXR1cmVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljCisgICAgQE5vdE51bGwKKyAgICBXZWJTZXJ2aWNlRmVhdHVyZVtdIHRvQXJyYXkoKSB7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVyZ2VkRmVhdHVyZXMocGFyZW50LmdldEZlYXR1cmVzKCkpLnRvQXJyYXkoKTsKKyAgICAgICAgcmV0dXJuIHdzZmVhdHVyZXMudmFsdWVzKCkudG9BcnJheShuZXcgV2ViU2VydmljZUZlYXR1cmVbXXt9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoQE5vdE51bGwgQ2xhc3M8PyBleHRlbmRzIFdlYlNlcnZpY2VGZWF0dXJlPiBmZWF0dXJlKSB7CisgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlIGZ0ciA9IGdldChmZWF0dXJlKTsKKyAgICAgICAgcmV0dXJuIGZ0ciAhPSBudWxsICYmIGZ0ci5pc0VuYWJsZWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYworICAgIEBOdWxsYWJsZQorICAgICAgICAgICAgPEYgZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZT4gRiBnZXQoQE5vdE51bGwgQ2xhc3M8Rj4gZmVhdHVyZVR5cGUpIHsKKyAgICAgICAgV2ViU2VydmljZUZlYXR1cmUgZiA9IGZlYXR1cmVUeXBlLmNhc3Qod3NmZWF0dXJlcy5nZXQoZmVhdHVyZVR5cGUpKTsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRGZWF0dXJlcygpLmdldChmZWF0dXJlVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChGKSBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmZWF0dXJlIHRvIHRoZSBsaXN0IGlmIGl0J3Mgbm90IGFscmVhZHkgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKEBOb3ROdWxsIFdlYlNlcnZpY2VGZWF0dXJlIGYpIHsKKyAgICAgICAgaWYgKCF3c2ZlYXR1cmVzLmNvbnRhaW5zS2V5KGYuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgIHdzZmVhdHVyZXMucHV0KGYuZ2V0Q2xhc3MoKSwgZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZlYXR1cmVzIHRvIHRoZSBsaXN0IGlmIGl0J3Mgbm90IGFscmVhZHkgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQWxsKEBOb3ROdWxsIFdTRmVhdHVyZUxpc3QgbGlzdCkgeworICAgICAgICBmb3IgKFdlYlNlcnZpY2VGZWF0dXJlIGYgOiBsaXN0KQorICAgICAgICAgICAgYWRkKGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIGZlYXR1cmVzIGZyb20ge0BsaW5rIFdTRExQb3J0SW1wbCNnZXRGZWF0dXJlcygpfS4KKyAgICAgKiBFeHRyYSBmZWF0dXJlcyB0aGF0IGFyZSBub3QgYWxyZWFkeSBzZXQgb24gYmluZGluZy4KKyAgICAgKiBpLmUsIGlmIGEgZmVhdHVyZSBpcyBzZXQgYWxyZWFkeSBvbiBiaW5kaW5nIHRocm91Z2ggc29tZW90aGVyIEFQSQorICAgICAqIHRoZSBjb3Jlc3BvbmRpbmcgd3NkbEZlYXR1cmUgaXMgbm90IHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3c2RsUG9ydCAgICAgICAgICBXU0RMUG9ydCBtb2RlbAorICAgICAqIEBwYXJhbSBob25vcldzZGxSZXF1aXJlZCBJZiB0aGlzIGlzIHRydWUgYWRkIFdTREwgRmVhdHVyZSBvbmx5IGlmIHdzZDpSZXF1aXJlZD10cnVlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEluIFNFSSBjYXNlLCBpdCBzaG91bGQgYmUgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gUHJvdmlkZXIgY2FzZSwgaXQgc2hvdWxkIGJlIHRydWUKKyAgICAgKiBAcGFyYW0gcmVwb3J0Q29uZmxpY3RzICAgSWYgdHJ1ZSwgY2hlY2tzIGlmIHRoZSBmZWF0dXJlIHNldHRpbmcgaW4gV1NETCAod3NkbCBleHRlbnNpb24gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5IGNvbmZpZ3VyYXRpb24pIGNvbGZsaWN0cyB3aXRoIGZlYXR1cmUgc2V0dGluZyBpbiBEZXBsb3llZCBTZXJ2aWNlIGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dzIHdhcm5pbmcgaWYgdGhlcmUgYXJlIGFueSBjb25mbGljdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVyZ2VGZWF0dXJlcyhATm90TnVsbCBXU0RMUG9ydCB3c2RsUG9ydCwgYm9vbGVhbiBob25vcldzZGxSZXF1aXJlZCwgYm9vbGVhbiByZXBvcnRDb25mbGljdHMpIHsKKyAgICAgICAgaWYgKGhvbm9yV3NkbFJlcXVpcmVkICYmICFpc0VuYWJsZWQoUmVzcGVjdEJpbmRpbmdGZWF0dXJlLmNsYXNzKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKCFob25vcldzZGxSZXF1aXJlZCkgeworICAgICAgICAgICAgYWRkQWxsKHdzZGxQb3J0LmdldEZlYXR1cmVzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCBvbmx5IGlmIGlzUmVxdWlyZWQgcmV0dXJucyB0cnVlLCB3aGVuIGhvbm9yV3NkbFJlcXVpcmVkIGlzIHRydWUKKyAgICAgICAgZm9yIChXZWJTZXJ2aWNlRmVhdHVyZSB3c2RsRnRyIDogd3NkbFBvcnQuZ2V0RmVhdHVyZXMoKSkgeworICAgICAgICAgICAgaWYgKGdldCh3c2RsRnRyLmdldENsYXNzKCkpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBhIFdTREwgRXh0ZW5zaW9uICwgaXQgd2lsbCBoYXZlIHJlcXVpcmVkIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICBNZXRob2QgbSA9ICh3c2RsRnRyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJpc1JlcXVpcmVkIikpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCA9IChCb29sZWFuKSBtLmludm9rZSh3c2RsRnRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQod3NkbEZ0cik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdzZGxGdHIgaXMgbm90IGFuIFdTREwgZXh0ZW5zaW9uLCBqdXN0IGFkZCBpdAorICAgICAgICAgICAgICAgICAgICBhZGQod3NkbEZ0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBvcnRDb25mbGljdHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKHdzZGxGdHIuZ2V0Q2xhc3MoKSkgIT0gd3NkbEZ0ci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZyhNb2RlbGVyTWVzc2FnZXMuUlVOVElNRV9NT0RFTEVSX0ZFQVRVUkVfQ09ORkxJQ1QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KHdzZGxGdHIuZ2V0Q2xhc3MoKSksIHdzZGxGdHIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFyZW50IGZlYXR1cmVzLiBCYXNpY2FsbHkgdGhlIHBhcmVudCBmZWF0dXJlIGxpc3Qgd2lsbCBiZSBvdmVycmlkZW4KKyAgICAgKiBieSB0aGlzIGZlYXR1cmUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRGZWF0dXJlZE9iamVjdChATm90TnVsbCBXU0RMRmVhdHVyZWRPYmplY3QgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgVW5pb24gb2YgdGhpcyBXZWJTZXJ2aWNlRmVhdHVyZUxpc3QgYW5kIHRoZSBwYXJlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZXJnZWRGZWF0dXJlcyBpbXBsZW1lbnRzIEl0ZXJhdG9yPFdlYlNlcnZpY2VGZWF0dXJlPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RhY2s8V2ViU2VydmljZUZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IFN0YWNrPFdlYlNlcnZpY2VGZWF0dXJlPigpOworCisgICAgICAgIHB1YmxpYyBNZXJnZWRGZWF0dXJlcyhATm90TnVsbCBXU0ZlYXR1cmVMaXN0IHBhcmVudCkgeworCisgICAgICAgICAgICBmb3IgKFdlYlNlcnZpY2VGZWF0dXJlIGYgOiB3c2ZlYXR1cmVzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgZmVhdHVyZXMucHVzaChmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChXZWJTZXJ2aWNlRmVhdHVyZSBmIDogcGFyZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKCF3c2ZlYXR1cmVzLmNvbnRhaW5zS2V5KGYuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMucHVzaChmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuICFmZWF0dXJlcy5lbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFdlYlNlcnZpY2VGZWF0dXJlIG5leHQoKSB7CisgICAgICAgICAgICBpZiAoIWZlYXR1cmVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXMucG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgaWYgKCFmZWF0dXJlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZmVhdHVyZXMucG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV2ViU2VydmljZUZlYXR1cmVbXSB0b0FycmF5KCkgeworICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVzLnRvQXJyYXkobmV3IFdlYlNlcnZpY2VGZWF0dXJlW117fSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihXZWJTZXJ2aWNlRmVhdHVyZUxpc3QuY2xhc3MuZ2V0TmFtZSgpKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvaHR0cC9IVFRQQmluZGluZ0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvaHR0cC9IVFRQQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhMTg3MC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9iaW5kaW5nL2h0dHAvSFRUUEJpbmRpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgSFRUUEJpbmRpbmdJbXBsIGV4dGVuZHMgQmluZGluZ0ltcGwgaW1wbGVtZW50cyBIVFRQQmluZGluZyB7Ci0KLSAgICBwdWJsaWMgSFRUUEJpbmRpbmdJbXBsKCkgewotICAgICAgICBzdXBlcihIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBIVFRQQmluZGluZ0ltcGwoTGlzdDxIYW5kbGVyPiBoYW5kbGVyQ2hhaW4pIHsKLSAgICAgICAgc3VwZXIoaGFuZGxlckNoYWluLCBIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcsIG51bGwpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU2V0cyB0aGUgaGFuZGxlciBjaGFpbi4gT25seSBsb2dpY2FsIGhhbmRsZXJzIGFyZQotICAgICAqIGFsbG93ZWQgd2l0aCBIVFRQQmluZGluZy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW4oTGlzdDxIYW5kbGVyPiBjaGFpbikgewotICAgICAgICBmb3IgKEhhbmRsZXIgaGFuZGxlciA6IGNoYWluKSB7Ci0gICAgICAgICAgICBpZiAoIShoYW5kbGVyIGluc3RhbmNlb2YgTG9naWNhbEhhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgICAgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLmNsaWVudCIpOwotICAgICAgICAgICAgICAgIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7Ci0gICAgICAgICAgICAgICAgTG9jYWxpemFibGUgbG9jTWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vbi5sb2dpY2FsLmhhbmRsZXIuc2V0IiwKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGxvY2FsaXplci5sb2NhbGl6ZShsb2NNZXNzYWdlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0SGFuZGxlckNoYWluKGNoYWluKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvc29hcC9TT0FQQmluZGluZ0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2JpbmRpbmcvc29hcC9TT0FQQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjYWQ2OS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9iaW5kaW5nL3NvYXAvU09BUEJpbmRpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLkhhbmRsZXJDaGFpbkNhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5TeXN0ZW1IYW5kbGVyRGVsZWdhdGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuU3lzdGVtSGFuZGxlckRlbGVnYXRlRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNPQVBVdGlsOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0ltcGwgZXh0ZW5kcyBCaW5kaW5nSW1wbCBpbXBsZW1lbnRzIFNPQVBCaW5kaW5nIHsKLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9TT0FQMTJIVFRQX0JJTkRJTkcgPQotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4d3MvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIFJPTEVfTk9ORTsKLQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiByZXF1aXJlZFJvbGVzOwotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiByb2xlczsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVNdG9tID0gZmFsc2U7Ci0KLQotICAgICAvLyBjYWxsZWQgYnkgRGlzcGF0Y2hJbXBsCi0gICAgcHVibGljIFNPQVBCaW5kaW5nSW1wbChTdHJpbmcgYmluZGluZ0lkLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcihiaW5kaW5nSWQsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgc2V0dXAoZ2V0QmluZGluZ0lkKCksIGdldEFjdHVhbEJpbmRpbmdJZCgpKTsKLSAgICAgICAgc2V0dXBTeXN0ZW1IYW5kbGVyRGVsZWdhdGUoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgICBwdWJsaWMgU09BUEJpbmRpbmdJbXBsKFN0cmluZyBiaW5kaW5nSWQpIHsKLSAgICAgICAgc3VwZXIoYmluZGluZ0lkLCBudWxsKTsKLSAgICAgICAgc2V0dXAoZ2V0QmluZGluZ0lkKCksIGdldEFjdHVhbEJpbmRpbmdJZCgpKTsKLSAgICAgICAgc2V0dXBTeXN0ZW1IYW5kbGVyRGVsZWdhdGUobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBCaW5kaW5nSW1wbChMaXN0PEhhbmRsZXI+IGhhbmRsZXJDaGFpbiwgU3RyaW5nIGJpbmRpbmdJZCwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgc3VwZXIoaGFuZGxlckNoYWluLCBiaW5kaW5nSWQsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgc2V0dXAoZ2V0QmluZGluZ0lkKCksIGdldEFjdHVhbEJpbmRpbmdJZCgpKTsKLSAgICAgICAgc2V0dXBTeXN0ZW1IYW5kbGVyRGVsZWdhdGUoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIC8vIGlmIHRoZSBiaW5kaW5nIGlkIGlzIHVua25vd24sIG5vIHJvbGVzIGFyZSBhZGRlZAotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwKFN0cmluZyBiaW5kaW5nSWQsIFN0cmluZyBhY3R1YWxCaW5kaW5nSWQpIHsKLSAgICAgICAgcmVxdWlyZWRSb2xlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKSkgewotICAgICAgICAgICAgcmVxdWlyZWRSb2xlcy5hZGQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5BQ1RPUl9ORVhUKTsKLSAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykpIHsKLSAgICAgICAgICAgIHJlcXVpcmVkUm9sZXMuYWRkKFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5ST0xFX05FWFQpOwotICAgICAgICAgICAgcmVxdWlyZWRSb2xlcy5hZGQoU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLlJPTEVfVUxUSU1BVEVfUkVDRUlWRVIpOwotICAgICAgICB9Ci0gICAgICAgIFJPTEVfTk9ORSA9IFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5ST0xFX05PTkU7Ci0gICAgICAgIHJvbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBhZGRSZXF1aXJlZFJvbGVzKCk7Ci0gICAgICAgIHNldFJvbGVzT25IYW5kbGVyQ2hhaW4oKTsKLSAgICAgICAgaWYgKGFjdHVhbEJpbmRpbmdJZC5lcXVhbHMoU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpCi0gICAgICAgICAgICB8fCBhY3R1YWxCaW5kaW5nSWQuZXF1YWxzKFNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSkgewotICAgICAgICAgICAgc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgYSBub24gc3RhbmRhcmQgU09BUDEuMiBiaW5kaW5nLCByZXR1cm4gYWN0dWFsIFNPQVAxLjIgYmluZGluZwotICAgICAqIEZvciBTT0FQIDEuMSBNVE9NIGJpbmRpbmcsIHJldHVybiBTT0FQMS4xIGJpbmRpbmcKLSAgICAgKiBGb3IgU09BUCAxLjIgTVRPTSBiaW5kaW5nLCByZXR1cm4gU09BUCAxLjIgYmluZGluZwotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lkKCkgewotICAgICAgICBTdHJpbmcgYmluZGluZ0lkID0gc3VwZXIuZ2V0QmluZGluZ0lkKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nSW1wbC5YX1NPQVAxMkhUVFBfQklORElORykpIHsKLSAgICAgICAgICAgIHJldHVybiBTT0FQMTJIVFRQX0JJTkRJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU09BUDExSFRUUF9CSU5ESU5HOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSkgewotICAgICAgICAgICAgcmV0dXJuIFNPQVAxMkhUVFBfQklORElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGluZ0lkOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBVc2UgdGhpcyB0byBkaXN0aW5ndWlzaCBTT0FQMTJIVFRQX0JJTkRJTkcgb3IgWF9TT0FQMTJIVFRQX0JJTkRJTkcKLSAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0dWFsQmluZGluZ0lkKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QmluZGluZ0lkKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXaGVuIGNsaWVudCBzZXRzIGEgbmV3IGhhbmRsZXIgY2hhaW4sIG11c3QgYWxzbyBzZXQgcm9sZXMgb24KLSAgICAgKiB0aGUgbmV3IGhhbmRsZXIgY2hhaW4gY2FsbGVyIHRoYXQgZ2V0cyBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbihMaXN0PEhhbmRsZXI+IGNoYWluKSB7Ci0gICAgICAgIHN1cGVyLnNldEhhbmRsZXJDaGFpbihjaGFpbik7Ci0gICAgICAgIHNldFJvbGVzT25IYW5kbGVyQ2hhaW4oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSZXF1aXJlZFJvbGVzKCkgewotICAgICAgICByb2xlcy5hZGRBbGwocmVxdWlyZWRSb2xlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEudXRpbC5TZXQ8U3RyaW5nPiBnZXRSb2xlcygpIHsKLSAgICAgICAgcmV0dXJuIHJvbGVzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQWRkcyB0aGUgbmV4dCBhbmQgb3RoZXIgcm9sZXMgaW4gY2FzZSB0aGlzIGhhcwotICAgICAqIGJlZW4gY2FsbGVkIGJ5IGEgdXNlciB3aXRob3V0IHRoZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZXMoU2V0PFN0cmluZz4gcm9sZXMpIHsKLSAgICAgICAgaWYgKHJvbGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJvbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb2xlcy5jb250YWlucyhST0xFX05PTkUpKSB7Ci0gICAgICAgICAgICBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLmNsaWVudCIpOwotICAgICAgICAgICAgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKLSAgICAgICAgICAgIExvY2FsaXphYmxlIGxvY01lc3NhZ2UgPQotICAgICAgICAgICAgICAgIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQuc29hcC5yb2xlLm5vbmUiKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGxvY2FsaXplci5sb2NhbGl6ZShsb2NNZXNzYWdlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5yb2xlcyA9IHJvbGVzOwotICAgICAgICBhZGRSZXF1aXJlZFJvbGVzKCk7Ci0gICAgICAgIHNldFJvbGVzT25IYW5kbGVyQ2hhaW4oKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdHlwaWNhbGx5IGJ5IHRoZSBydW50aW1lIHRvIGVuYWJsZS9kaXNhYmxlIE10b20gb3B0aW1pemF0aW9uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgb3IgZmFsc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZW5hYmxlTXRvbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGllbnQgYXBwbGljYXRpb24gY2FuIHNldCBpZiB0aGUgTXRvbSBvcHRpbWl6YXRpb24gc2hvdWxkIGJlIGVuYWJsZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TVRPTUVuYWJsZWQoYm9vbGVhbiBiKSB7Ci0gICAgICAgIHRoaXMuZW5hYmxlTXRvbSA9IGI7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBGYWN0b3J5IGdldFNPQVBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gU09BUFV0aWwuZ2V0U09BUEZhY3RvcnkoZ2V0QmluZGluZ0lkKCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIE1lc3NhZ2VGYWN0b3J5IGdldE1lc3NhZ2VGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gU09BUFV0aWwuZ2V0TWVzc2FnZUZhY3RvcnkoZ2V0QmluZGluZ0lkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2FsbCBkZWZlcnMgdG8gdGhlIHN1cGVyIGNsYXNzIHRvIGdldCB0aGUKLSAgICAgKiBoYW5kbGVyIGNoYWluIGNhbGxlci4gSXQgdGhlbiBzZXRzIHRoZSByb2xlcyBvbiB0aGUKLSAgICAgKiBjYWxsZXIgYmVmb3JlIHJldHVybmluZyBpdC4KLSAgICAgKgotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbCNnZXRIYW5kbGVyQ2hhaW5DYWxsZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluQ2FsbGVyIGdldEhhbmRsZXJDaGFpbkNhbGxlcigpIHsKLSAgICAgICAgSGFuZGxlckNoYWluQ2FsbGVyIGNhbGxlciA9IHN1cGVyLmdldEhhbmRsZXJDaGFpbkNhbGxlcigpOwotICAgICAgICBjYWxsZXIuc2V0Um9sZXMocm9sZXMpOwotICAgICAgICByZXR1cm4gY2hhaW5DYWxsZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Um9sZXNPbkhhbmRsZXJDaGFpbigpIHsKLSAgICAgICAgaWYgKGNoYWluQ2FsbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoYWluQ2FsbGVyLnNldFJvbGVzKHJvbGVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwU3lzdGVtSGFuZGxlckRlbGVnYXRlKFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZUZhY3Rvcnkgc2hkRmFjdG9yeSA9Ci0gICAgICAgICAgICBTeXN0ZW1IYW5kbGVyRGVsZWdhdGVGYWN0b3J5LmdldEZhY3RvcnkoKTsKLSAgICAgICAgaWYgKHNoZEZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U3lzdGVtSGFuZGxlckRlbGVnYXRlKChTeXN0ZW1IYW5kbGVyRGVsZWdhdGUpCi0gICAgICAgICAgICAgICAgc2hkRmFjdG9yeS5nZXREZWxlZ2F0ZShzZXJ2aWNlTmFtZSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0FzeW5jSGFuZGxlclNlcnZpY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Bc3luY0hhbmRsZXJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjY2MwYWIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0FzeW5jSGFuZGxlclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmEucm1pLnNlcnZlci5VSUQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBc3luY0hhbmRsZXJTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgQXN5bmNIYW5kbGVyIF9oYW5kbGVyOwotICAgIHByaXZhdGUgVUlEIF91aWQ7Ci0gICAgcHJpdmF0ZSBFeGVjdXRvciBfZXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBXU0Z1dHVyZSB3c2Z1dHVyZTsKLSAgICBwcml2YXRlIFJlc3BvbnNlIHJlc3BvbnNlOwotCi0gICAgcHVibGljIEFzeW5jSGFuZGxlclNlcnZpY2UoQXN5bmNIYW5kbGVyIGhhbmRsZXIsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIF91aWQgPSBuZXcgVUlEKCk7Ci0gICAgICAgIF9oYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgX2V4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBVSUQgZ2V0VUlEKCkgewotICAgICAgICByZXR1cm4gX3VpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlV1NGdXR1cmUoKSB7Ci0KLSAgICAgICAgX2V4ZWN1dG9yLmV4ZWN1dGUoKFJ1bm5hYmxlKSB3c2Z1dHVyZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFdTRnV0dXJlPE9iamVjdD4gc2V0dXBBc3luY0NhbGxiYWNrKGZpbmFsIFJlc3BvbnNlPE9iamVjdD4gcmVzdWx0KSB7Ci0gICAgICAgIHJlc3BvbnNlID0gcmVzdWx0OwotCi0gICAgICAgIHdzZnV0dXJlID0gbmV3IFdTRnV0dXJlPE9iamVjdD4obmV3IENhbGxhYmxlPE9iamVjdD4oKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIF9oYW5kbGVyLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiB3c2Z1dHVyZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQXN5bmNJbnZva2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQXN5bmNJbnZva2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1YmY3MwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Bc3luY0ludm9rZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkZpYmVyLkNvbXBsZXRpb25DYWxsYmFjazsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworCisvKioKKyAqIEludm9rZXMge0BsaW5rIFR1YmV9bGluZSBhc3luY2hyb25vdXNseSBmb3IgdGhlIGNsaWVudCdzIGFzeW5jIEFQSShmb3IgZS5nLjogRGlzcGF0Y2gjaW52b2tlQXN5bmN9CisgKiBUaGUgY29uY3JldGUgY2xhc3NlcyBuZWVkIHRvIGNhbGwge0BsaW5rIFN0dWIjcHJvY2Vzc0FzeW5jKFBhY2tldCwgUmVxdWVzdENvbnRleHQsIENvbXBsZXRpb25DYWxsYmFjayl9IGluCisgKiBydW4oKSBtZXRob2QuCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFzeW5jSW52b2tlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAvKioKKyAgICAgKiBCZWNhdXNlIG9mIHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBvcmRlciwKKyAgICAgKiB3ZSBjYW4ndCB0YWtlIHRoaXMgYXMgYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFzeW5jUmVzcG9uc2VJbXBsIHJlc3BvbnNlSW1wbDsKKworICAgIHB1YmxpYyB2b2lkIHNldFJlY2VpdmVyKEFzeW5jUmVzcG9uc2VJbXBsIHJlc3BvbnNlSW1wbCkgeworICAgICAgICB0aGlzLnJlc3BvbnNlSW1wbCA9IHJlc3BvbnNlSW1wbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Bc3luY1Jlc3BvbnNlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0FzeW5jUmVzcG9uc2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlY2VjMgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Bc3luY1Jlc3BvbnNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db21wbGV0ZWRGdXR1cmU7CisKK2ltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CisKKy8qKgorICoge0BsaW5rIFJlc3BvbnNlfSBpbXBsZW1lbnRhdGlvbi4gV2hlbiBSdW5uYmFsZSBpcyBleGVjdXRlZCwgaXQganVzdCBoYW5kcyB0aGUKKyAqIHJlcXVlc3QgdG8gRmliZXIgYW5kIHJldHVybnMuIFdoZW4gdGhlIEZpYmVyIGZpbmlzaGVzIHRoZSBleGVjdXRpb24sIGl0IHNldHMKKyAqIHJlc3BvbnNlIGluIHRoZSB7QGxpbmsgRnV0dXJlVGFza30KKyAqCisgKiA8cD4KKyAqIHtAbGluayBSZXNwb25zZUltcGx9IGV4ZWN1dGVzIHRoaW5ncyBzeW5jaHJvbm91c2x5IGFuZCB3YWl0cyBmb3IgdGhlIHJldHVybgorICogcGFyYW1ldGVyLgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBc3luY1Jlc3BvbnNlSW1wbDxUPiBleHRlbmRzIEZ1dHVyZVRhc2s8VD4gaW1wbGVtZW50cyBSZXNwb25zZTxUPiwgUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXIgeworCisgICAgLyoqCisgICAgICogT3B0aW9uYWwge0BsaW5rIEFzeW5jSGFuZGxlcn0gdGhhdCBnZXRzIGludm9rZWQKKyAgICAgKiBhdCB0aGUgY29tcGxldGlvbiBvZiB0aGUgdGFzay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFzeW5jSGFuZGxlcjxUPiBoYW5kbGVyOworICAgIHByaXZhdGUgUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIGNhbGxhYmxlOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVubmFibGUKKyAgICAgKiAgICAgIFRoaXMge0BsaW5rIFJ1bm5hYmxlfSBpcyBleGVjdXRlZCBhc3luY2hyb25vdXNseS4KKyAgICAgKiBAcGFyYW0gaGFuZGxlcgorICAgICAqICAgICAgT3B0aW9uYWwge0BsaW5rIEFzeW5jSGFuZGxlcn0gdG8gaW52b2tlIGF0IHRoZSBlbmQKKyAgICAgKiAgICAgIG9mIHRoZSBwcm9jZXNzaW5nLiBDYW4gYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXN5bmNSZXNwb25zZUltcGwoUnVubmFibGUgcnVubmFibGUsIEBOdWxsYWJsZSBBc3luY0hhbmRsZXI8VD4gaGFuZGxlcikgeworICAgICAgICBzdXBlcihydW5uYWJsZSwgbnVsbCk7CisgICAgICAgIHRoaXMuY2FsbGFibGUgPSBydW5uYWJsZTsKKyAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIC8vIG92ZXJyaWRlIHNvIHRoYXQgQXN5bmNJbnZva2VyIGNhbGxzIHNldCgpCisgICAgICAgIC8vIHdoZW4gRmliZXIgY2FsbHMgdGhlIGNhbGxiYWNrCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWxsYWJsZS5ydW4oKTsKKyAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2l0IGNvdWxkIGJlIGEgV2ViU2VydmljZUV4Y2VwdGlvbiBvciBhIFByb3RvY29sRXhjZXB0aW9uIG9yIGFueSBSdW50aW1lRXhjZXB0aW9uCisgICAgICAgICAgICAvLyByZXN1bHRpbmcgZHVlIHRvIHNvbWUgaW50ZXJuYWwgYnVnLgorICAgICAgICAgICAgc2V0KG51bGwsIGUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgLy9pdHMgc29tZSBvdGhlciBleGNlcHRpb24gcmVzdWx0aW5nIGZyb20gdXNlciBlcnJvciwgd3JhcCBpdCBpbgorICAgICAgICAgICAgLy8gV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAgICAgICAgc2V0KG51bGwsIG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFJlc3BvbnNlQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3BvbnNlQ29udGV4dChSZXNwb25zZUNvbnRleHQgcmMpIHsKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gcmM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0KGZpbmFsIFQgdiwgZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgLy8gY2FsbCB0aGUgaGFuZGxlciBiZWZvcmUgd2UgbWFyayB0aGUgZnV0dXJlIGFzICdkb25lJworICAgICAgICBpZiAoaGFuZGxlciE9bnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiB7QGxpbmsgUmVzcG9uc2V9IG9iamVjdCBwYXNzZWQgaW50byB0aGUgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgICogV2UgbmVlZCBhIHNlcGFyYXRlIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmV9IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB7QGxpbmsgUmVzcG9uc2VJbXBsfQorICAgICAgICAgICAgICAgICAqIHRvIGJlIG1hcmtlZCBhcyAnZG9uZScgYmVmb3JlIHRoZSBjYWxsYmFjayBmaW5pc2hlcyBleGVjdXRpb24uCisgICAgICAgICAgICAgICAgICogKFRoYXQgd291bGQgcHJvdmlkZSBpbXBsaWNpdCBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gY29kZQorICAgICAgICAgICAgICAgICAqIGluIHRoZSBtYWluIHRocmVhZCBhbmQgdGhlIGNhbGxiYWNrIGNvZGUsIGFuZCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEpBWC1SSSAyLjAgRkNTLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNsYXNzIENhbGxiYWNrRnV0dXJlPFQ+IGV4dGVuZHMgQ29tcGxldGVkRnV0dXJlPFQ+IGltcGxlbWVudHMgUmVzcG9uc2U8VD4geworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ2FsbGJhY2tGdXR1cmUoVCB2LCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodiwgdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDb250ZXh0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFzeW5jUmVzcG9uc2VJbXBsLnRoaXMuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhbmRsZXIuaGFuZGxlUmVzcG9uc2UobmV3IENhbGxiYWNrRnV0dXJlPFQ+KHYsIHQpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0RXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBlci5zZXRFeGNlcHRpb24odCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5zZXQodik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0JpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuamF2YQppbmRleCAwZWEyNTc0Li40MjdmZTY1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzAsMjIgKzMwLDE0IEBACiBwdWJsaWMgaW50ZXJmYWNlIEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMgZXh0ZW5kcyBKQVhXU1Byb3BlcnRpZXN7CiAKICAgICAvL2xlZ2FjeSBwcm9wZXJ0aWVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRUlNUExfTkFNRSA9ICJzZXJ2aWNlSW1wbGVtZW50YXRpb25OYW1lIjsKKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1ROQU1FX1ZFUklGSUNBVElPTl9QUk9QRVJUWSA9CiAgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuaHR0cC5Ib3N0bmFtZVZlcmlmaWNhdGlvblByb3BlcnR5IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0NPT0tJRV9KQVIgPQogICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50Lmh0dHAuQ29va2llSmFyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNVUklUWV9DT05URVhUID0KLSAgICAgICAgImNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlY3VyaXR5LmNvbnRleHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfU1RBVFVTX0NPREUgPQotICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50Lmh0dHAuSFRUUFN0YXR1c0NvZGUiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVESVJFQ1RfUkVRVUVTVF9QUk9QRVJUWSA9CiAgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuaHR0cC5SZWRpcmVjdFJlcXVlc3RQcm9wZXJ0eSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0FUVEFDSE1FTlRfUFJPUEVSVFkgPQotICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXR0YWNobWVudC5TZXRBdHRhY2htZW50Q29udGV4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0FUVEFDSE1FTlRfUFJPUEVSVFkgPQotICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXR0YWNobWVudC5HZXRBdHRhY2htZW50Q29udGV4dCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1dBWV9PUEVSQVRJT04gPQogICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLk9uZVdheU9wZXJhdGlvbiI7CiAKQEAgLTU1LDc4ICs0Nyw5IEBACiAgICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXF1ZXN0LnRpbWVvdXQiOwogCiAgICAgLy9KQVhXUyAyLjAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19SVU5USU1FX0NPTlRFWFQgPQotICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucnVudGltZS5jb250ZXh0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19DT05URVhUX1BST1BFUlRZID0KLSAgICAgICAgImNvbS5zdW4ueG1sLmludGVybmFsLndzLmNvbnRleHQucmVxdWVzdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05URVhUX1BST1BFUlRZID0KLSAgICAgICAgImNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuY29udGV4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfUkVTUE9OU0VfQ09OVEVYVF9QUk9QRVJUWSA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jb250ZXh0LnJlc3BvbnNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19DTElFTlRfQVNZTkNfSEFORExFUiA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guYXN5bmNoYW5kbGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19DTElFTlRfQVNZTkNfUkVTUE9OU0VfQ09OVEVYVCA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guYXN5bmMucmVzcG9uc2UuY29udGV4dCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUcgPQorICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5jb25maWciOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX0NMSUVOVF9IQU5ETEVfUFJPUEVSVFkgPQogICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmhhbmRsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9DT05URVhUX1BST1BFUlRZID0KLSAgICAgICAgImNvbS5zdW4ueG1sLmludGVybmFsLndzLmpheGJjb250ZXh0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9UUkFOU1BPUlRfRkFDVE9SWSA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX09VVFBVVFNUUkVBTSA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2Uub3V0cHV0U3RyZWFtIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTkNPRElOR19WQUxVRSA9ICJ4bWwuZW5jb2RpbmciOyAgICAgICAgICAgICAgICAgLy8gZGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9FTkNPRElOR19QUk9QRVJUWSA9ICJhY2NlcHQuZW5jb2RpbmciOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX1BST1BFUlRZID0gIkNvbnRlbnQtVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9BQ1RJT05fUFJPUEVSVFkgPSAiU09BUEFjdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVBUX1BST1BFUlRZID0gIkFjY2VwdCI7Ci0KLSAgICAvLyBGSSArIFNPQVAgMS4xCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFTVF9JTkZPU0VUX1RZUEVfU09BUDExID0KLSAgICAgICAgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IjsKLQotICAgIC8vIEZJICsgU09BUCAxLjIKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVNUX0lORk9TRVRfVFlQRV9TT0FQMTIgPQotICAgICAgICAiYXBwbGljYXRpb24vc29hcCtmYXN0aW5mb3NldCI7Ci0KLSAgICAvLyBYTUwgKyBYT1AgKyBTT0FQIDEuMQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhPUF9TT0FQMTFfWE1MX1RZUEVfVkFMVUUgPQotICAgICAgICAiYXBwbGljYXRpb24veG9wK3htbDt0eXBlPVwidGV4dC94bWxcIiI7Ci0KLSAgICAvLyBYTUwgKyBYT1AgKyBTT0FQIDEuMgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhPUF9TT0FQMTJfWE1MX1RZUEVfVkFMVUUgPQotICAgICAgICAiYXBwbGljYXRpb24veG9wK3htbDt0eXBlPVwiYXBwbGljYXRpb24vc29hcCt4bWxcIiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09OVEVOVF9UWVBFX1ZBTFVFID0gInRleHQveG1sIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9YTUxfQ09OVEVOVF9UWVBFX1ZBTFVFID0gImFwcGxpY2F0aW9uL3NvYXAreG1sIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0FDQ0VQVF9WQUxVRSA9Ci0gICAgICAgICJhcHBsaWNhdGlvbi94b3AreG1sLCB0ZXh0L2h0bWwsIGltYWdlL2dpZiwgaW1hZ2UvanBlZywgKjsgcT0uMiwgKi8qOyBxPS4yIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9YTUxfQUNDRVBUX1ZBTFVFID0KLSAgICAgICAgImFwcGxpY2F0aW9uL3NvYXAreG1sIiArICIsICIgKyBTVEFOREFSRF9BQ0NFUFRfVkFMVUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQUNDRVBUX1ZBTFVFID0KLSAgICAgICAgWE1MX0NPTlRFTlRfVFlQRV9WQUxVRSArICIsICIgKyBTVEFOREFSRF9BQ0NFUFRfVkFMVUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRklfQUNDRVBUX1ZBTFVFID0KLSAgICAgICAgRkFTVF9JTkZPU0VUX1RZUEVfU09BUDExICsgIiwgIiArIFhNTF9BQ0NFUFRfVkFMVUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfWE1MX0ZJX0FDQ0VQVF9WQUxVRSA9Ci0gICAgICAgIEZBU1RfSU5GT1NFVF9UWVBFX1NPQVAxMiArICIsICIgKyBTT0FQMTJfWE1MX0FDQ0VQVF9WQUxVRTsKLQotICAgIHB1YmxpYyBTdHJpbmcgRElTUEFUQ0hfQ09OVEVYVCA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guY29udGV4dCI7Ci0gICAgcHVibGljIFN0cmluZyBESVNQQVRDSF9NQVJTSEFMTEVSID0gImNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5tYXJzaGFsbGVyIjsKLSAgICBwdWJsaWMgU3RyaW5nIERJU1BBVENIX1VOTUFSU0hBTExFUiA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2gudW5tYXJzaGFsbGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0lEX1BST1BFUlRZID0gImNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmciOwotCi0vLyAgICAvLyBDb250ZW50IG5lZ290aWF0aW9uIHByb3BlcnR5OiB2YWx1ZXMgIm5vbmUiLCAicGVzc2ltaXN0aWMiIGFuZCAib3B0aW1pc3RpYyIKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFkgPQotLy8gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQ29udGVudE5lZ290aWF0aW9uIjsKIAogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0NsaWVudENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9DbGllbnRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYjBhMzkuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0NsaWVudENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5leGNlcHRpb24uSkFYV1NFeGNlcHRpb25CYXNlOwotCi0vKioKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgSkFYV1NFeGNlcHRpb25CYXNlIHsKLSAgICBwdWJsaWMgQ2xpZW50Q29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcga2V5LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICBzdXBlcihrZXksIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGllbnRDb25maWd1cmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuY2xpZW50IjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKaW5kZXggNTZlOGI1Ny4uNGM1MGZlMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0NsaWVudFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9DbGllbnRUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMiwxNSArMzIsMTkgQEAKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCiBwdWJsaWMgY2xhc3MgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgSkFYV1NFeGNlcHRpb25CYXNlIHsKLSAgICBwdWJsaWMgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBrZXksIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIHN1cGVyKGtleSwgYXJncyk7CisgICAgcHVibGljIENsaWVudFRyYW5zcG9ydEV4Y2VwdGlvbihMb2NhbGl6YWJsZSBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKExvY2FsaXphYmxlIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgewogICAgICAgICBzdXBlcih0aHJvd2FibGUpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlc291cmNlQnVuZGxlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuY2xpZW50IjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ29udGFjdEluZm9CYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ29udGFjdEluZm9CYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OGQzNTAuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0NvbnRhY3RJbmZvQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZW5jb2RpbmcuRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuQ29udGFjdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uVGFyZ2V0RmluZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJvdG9jb2wuSW50ZXJjZXB0b3JzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJvdG9jb2wuTWVzc2FnZURpc3BhdGNoZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuaW50ZXJuYWwuSW50ZXJuYWxFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuQ2xpZW50RW5jb2RlckRlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFUFRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIENvbnRhY3RJbmZvQmFzZSBpbXBsZW1lbnRzIENvbnRhY3RJbmZvLCBTT0FQRVBURmFjdG9yeSB7Ci0gICAgcHJvdGVjdGVkIFdTQ29ubmVjdGlvbiBfY29ubmVjdGlvbjsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZURpc3BhdGNoZXIgX21lc3NhZ2VEaXNwYXRjaGVyOwotICAgIHByb3RlY3RlZCBFbmNvZGVyIF9lbmNvZGVyOwotICAgIHByb3RlY3RlZCBEZWNvZGVyIF9kZWNvZGVyOwotICAgIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdJZDsKLSAgICBwcml2YXRlIEludGVybmFsRW5jb2RlciBpbnRlcm5hbEVuY29kZXI7Ci0KLSAgICBwdWJsaWMgQ29udGFjdEluZm9CYXNlKFdTQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpc3BhdGNoZXIgbWVzc2FnZURpc3BhdGNoZXIsIEVuY29kZXIgZW5jb2RlciwgRGVjb2RlciBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCkgewotICAgICAgICBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0gICAgICAgIF9tZXNzYWdlRGlzcGF0Y2hlciA9IG1lc3NhZ2VEaXNwYXRjaGVyOwotICAgICAgICBfZW5jb2RlciA9IGVuY29kZXI7Ci0gICAgICAgIF9kZWNvZGVyID0gZGVjb2RlcjsKLSAgICAgICAgaW50ZXJuYWxFbmNvZGVyID0gbmV3IENsaWVudEVuY29kZXJEZWNvZGVyKCk7Ci0gICAgICAgIHRoaXMuYmluZGluZ0lkID0gYmluZGluZ0lkOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SW5mb0Jhc2UoKSB7Ci0gICAgICAgIF9jb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgX21lc3NhZ2VEaXNwYXRjaGVyID0gbnVsbDsKLSAgICAgICAgX2VuY29kZXIgPSBudWxsOwotICAgICAgICBfZGVjb2RlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi5wZXB0LmVwdC5Db250YWN0SW5mbyNnZXRDb25uZWN0aW9uKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIFdTQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKE1lc3NhZ2VJbmZvIGFyZzApIHsKLSAgICAgICAgcmV0dXJuIF9jb25uZWN0aW9uOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5zdW4ucGVwdC5lcHQuRVBURmFjdG9yeSNnZXRNZXNzYWdlRGlzcGF0Y2hlcihjb20uc3VuLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvKQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGlzcGF0Y2hlciBnZXRNZXNzYWdlRGlzcGF0Y2hlcihNZXNzYWdlSW5mbyBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBfbWVzc2FnZURpc3BhdGNoZXI7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi5wZXB0LmVwdC5FUFRGYWN0b3J5I2dldEVuY29kZXIoY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5jb2RlciBnZXRFbmNvZGVyKE1lc3NhZ2VJbmZvIGFyZzApIHsKLSAgICAgICAgcmV0dXJuIF9lbmNvZGVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5zdW4ucGVwdC5lcHQuRVBURmFjdG9yeSNnZXREZWNvZGVyKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIERlY29kZXIgZ2V0RGVjb2RlcihNZXNzYWdlSW5mbyBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBfZGVjb2RlcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnBlcHQuZXB0LkVQVEZhY3RvcnkjZ2V0SW50ZXJjZXB0b3JzKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIEludGVyY2VwdG9ycyBnZXRJbnRlcmNlcHRvcnMoTWVzc2FnZUluZm8gYXJnMCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5zdW4ucGVwdC5lcHQuRVBURmFjdG9yeSNnZXRUYXJnZXRGaW5kZXIoY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgVGFyZ2V0RmluZGVyIGdldFRhcmdldEZpbmRlcihNZXNzYWdlSW5mbyBhcmcwKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbmNvZGVyIGdldFNPQVBFbmNvZGVyKCkgewotICAgICAgICByZXR1cm4gKFNPQVBFbmNvZGVyKSBfZW5jb2RlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUERlY29kZXIgZ2V0U09BUERlY29kZXIoKSB7Ci0gICAgICAgIHJldHVybiAoU09BUERlY29kZXIpIF9kZWNvZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlcm5hbEVuY29kZXIgZ2V0SW50ZXJuYWxFbmNvZGVyKCkgewotICAgICAgICByZXR1cm4gaW50ZXJuYWxFbmNvZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lkKCkgewotICAgICAgICBpZiAoYmluZGluZ0lkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYmluZGluZ0lkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Db250YWN0SW5mb0xpc3RJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ29udGFjdEluZm9MaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjJlNWIyLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Db250YWN0SW5mb0xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5Db250YWN0SW5mb0xpc3Q7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuQ29udGFjdEluZm9MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5jbGllbnQuU09BUDEyWE1MRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmNsaWVudC5TT0FQMTJYTUxFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuY2xpZW50LlNPQVBYTUxEZWNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuY2xpZW50LlNPQVBYTUxFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuY2xpZW50LlNPQVBNZXNzYWdlRGlzcGF0Y2hlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC54bWwuY2xpZW50LlhNTE1lc3NhZ2VEaXNwYXRjaGVyOwotCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqIExpc3Qgb2Yge0BsaW5rIGNvbS5zdW4ucGVwdC5lcHQuQ29udGFjdEluZm99cwotICovCi1wdWJsaWMgY2xhc3MgQ29udGFjdEluZm9MaXN0SW1wbCBpbXBsZW1lbnRzIENvbnRhY3RJbmZvTGlzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBzdGF0aWMgewotICAgICAgICBhcnJheUxpc3QuYWRkKG5ldyBDb250YWN0SW5mb0Jhc2UobnVsbCwKLSAgICAgICAgICAgIG5ldyBTT0FQTWVzc2FnZURpc3BhdGNoZXIoKSwKLSAgICAgICAgICAgIG5ldyBTT0FQWE1MRW5jb2RlcigpLAotICAgICAgICAgICAgbmV3IFNPQVBYTUxEZWNvZGVyKCksIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykpOwotICAgICAgICBhcnJheUxpc3QuYWRkKG5ldyBDb250YWN0SW5mb0Jhc2UobnVsbCwKLSAgICAgICAgICAgIG5ldyBTT0FQTWVzc2FnZURpc3BhdGNoZXIoKSwKLSAgICAgICAgICAgIG5ldyBTT0FQMTJYTUxFbmNvZGVyKCksCi0gICAgICAgICAgICBuZXcgU09BUDEyWE1MRGVjb2RlcigpLCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJdGVyYXRvciBvdmVyIHRoZSBsaXN0IG9mIHtAbGluayBjb20uc3VuLnBlcHQuZXB0LkNvbnRhY3RJbmZvfXMKLSAgICAgKiBAc2VlIGNvbS5zdW4ucGVwdC5lcHQuQ29udGFjdEluZm9MaXN0I2l0ZXJhdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFjdEluZm9MaXN0SXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGFjdEluZm9MaXN0SXRlcmF0b3JCYXNlKGFycmF5TGlzdCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ29udGFjdEluZm9MaXN0SXRlcmF0b3JCYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ29udGFjdEluZm9MaXN0SXRlcmF0b3JCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMWY1NjMuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0NvbnRhY3RJbmZvTGlzdEl0ZXJhdG9yQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuQ29udGFjdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuQ29udGFjdEluZm9MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgQ29udGFjdEluZm9MaXN0SXRlcmF0b3JCYXNlIGltcGxlbWVudHMgQ29udGFjdEluZm9MaXN0SXRlcmF0b3IgewotICAgIHByaXZhdGUgSXRlcmF0b3IgaXRlcmF0b3I7Ci0KLSAgICBwdWJsaWMgQ29udGFjdEluZm9MaXN0SXRlcmF0b3JCYXNlKEFycmF5TGlzdCBsaXN0KSB7Ci0gICAgICAgIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SW5mbyBuZXh0KCkgewotICAgICAgICByZXR1cm4gKENvbnRhY3RJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi5wZXB0LmVwdC5Db250YWN0SW5mb0xpc3RJdGVyYXRvciNoYXNOZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Db250ZW50TmVnb3RpYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Db250ZW50TmVnb3RpYXRpb24uamF2YQppbmRleCBkYTk2YTc3Li5hOTI3NjZjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ29udGVudE5lZ290aWF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0NvbnRlbnROZWdvdGlhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDQ5ICsyMiw1NiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKIAotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uLk1lc3NhZ2VTdHJ1Y3Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkNPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE5lZ290aWF0aW9uIHsKKy8qKgorICogQ29udGVudCBuZWdvdGlhdGlvbiBlbnVtLgorICogPHA+CisgKiBBIHZhbHVlIG9mIHtAbGluayAjbm9uZX0gbWVhbnMgbm8gY29udGVudCBuZWdvdGF0aW9uIGF0IGxldmVsIG9mIHRoZQorICogY2xpZW50IHRyYW5zcG9ydCB3aWxsIGJlIHBlcmZvcm1lZCB0byBuZWdvdGlhdGUgdGhlIGVuY29kaW5nIG9mIFhNTCBpbmZvc2V0LgorICogVGhlIGRlZmF1bHQgZW5jb2Rpbmcgd2lsbCBhbHdheXMgYmUgdXNlZC4KKyAqIDxwPgorICogQSB2YWx1ZSBvZiB7QGxpbmsgI3Blc3NpbWlzdGljfSBtZWFucyB0aGUgY2xpZW50IHRyYW5zcG9ydCB3aWxsIGFzc3VtZQorICogdGhlIGRlZmF1bHQgZW5jb2Rpbmcgb2YgWE1MIGluZm9zZXQgZm9yIGFuIG91dGJvdW5kIG1lc3NhZ2UgdW5sZXNzIGluZm9ybWVkCisgKiBvdGhlcndpc2UgYnkgYSBwcmV2aW91c2x5IHJlY2VpdmVkIGluYm91bmQgbWVzc2FnZS4KKyAqIChUaGUgY2xpZW50IHRyYW5zcG9ydCBpbml0aWFsbHkgYW5kIHBlc3NpbWlzdGljYWxseSBhc3N1bWVzIHRoYXQgYSBzZXJ2aWNlCisgKiBkb2VzIG5vdCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgZW5jb2Rpbmcgb2YgWE1MIGluZm9zZXQuKQorICogPHA+CisgKiBBIHZhbHVlIG9mIHtAbGluayAjb3B0aW1pc3RpY30gbWVhbnMgdGhlIGNsaWVudCB0cmFuc3BvcnQgd2lsbCBhc3N1bWUKKyAqIGEgbm9uLWRlZmF1bHQgZW5jb2Rpbmcgb2YgWE1MIGluZm9zZXQgZm9yIGFuIG91dGJvdW5kIG1lc3NhZ2UuCisgKiAoVGhlIGNsaWVudCB0cmFuc3BvcnQgb3B0aW1pc3RpY2FsbHkgYXNzdW1lcyB0aGF0IGEgc2VydmljZQorICogc3VwcG9ydHMgdGhlIG5vbi1kZWZhdWx0IGVuY29kaW5nIG9mIFhNTCBpbmZvc2V0LikKKyAqCisgKiBAYXV0aG9yIFBhdWwuU2FuZG96QFN1bi5Db20KKyAqLworcHVibGljIGVudW0gQ29udGVudE5lZ290aWF0aW9uIHsKKyAgICBub25lLAorICAgIHBlc3NpbWlzdGljLAorICAgIG9wdGltaXN0aWM7CiAKICAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBjb250ZW50IG5lZ290aWF0aW9uIHByb3BlcnR5IGluIDxjb2RlPk1lc3NhZ2VTdHJ1Y3Q8L2NvZGU+Ci0gICAgICogYmFzZWQgb24gcmVxdWVzdCBjb250ZXh0IGFuZCBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciBjb250ZW50IG5lZ290aWF0aW9uIG9uIHtAbGluayBSZXF1ZXN0Q29udGV4dH0uCiAgICAgICovCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWFwIGNvbnRleHQsIE1lc3NhZ2VTdHJ1Y3QgbWVzc2FnZVN0cnVjdCkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBjb250ZXh0LmdldChDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoIm5vbmUiKSB8fCB2YWx1ZS5lcXVhbHMoInBlc3NpbWlzdGljIikgfHwgdmFsdWUuZXF1YWxzKCJvcHRpbWlzdGljIikpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlU3RydWN0LnNldE1ldGFEYXRhKENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFksIHZhbHVlLmludGVybigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlbmRlckV4Y2VwdGlvbigic2VuZGVyLnJlcXVlc3QuaWxsZWdhbFZhbHVlRm9yQ29udGVudE5lZ290aWF0aW9uIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5pdEZyb21TeXN0ZW1Qcm9wZXJ0aWVzKGNvbnRleHQsIG1lc3NhZ2VTdHJ1Y3QpOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZID0gImNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5Db250ZW50TmVnb3RpYXRpb24iOwogCiAgICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgY29udGVudCBuZWdvdGlhdGlvbiBwcm9wZXJ0eSBpbiA8Y29kZT5NZXNzYWdlU3RydWN0PC9jb2RlPgotICAgICAqIGJhc2VkIG9uIHN5c3RlbSBwcm9wZXJ0eSBvZiB0aGUgc2FtZSBuYW1lLgorICAgICAqIE9idGFpbiB0aGUgY29udGVudCBuZWdvdGlhdGlvbiB2YWx1ZSBmcm9tIGEgc3lzdGVtIHByb3BlcnR5LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgdGhyb3cgYSBydW50aW1lIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgbmVnb3RpYXRpb24gdmFsdWUuCiAgICAgICovCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIGluaXRGcm9tU3lzdGVtUHJvcGVydGllcyhNYXAgY29udGV4dCwgTWVzc2FnZVN0cnVjdCBtZXNzYWdlU3RydWN0KQotICAgICAgICB0aHJvd3MgU2VuZGVyRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFkpOworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudE5lZ290aWF0aW9uIG9idGFpbkZyb21TeXN0ZW1Qcm9wZXJ0eSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QRVJUWSk7CiAKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TWV0YURhdGEoCi0gICAgICAgICAgICAgICAgQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSwgIm5vbmUiKTsgICAgICAvLyBGSSBpcyBvZmYgYnkgZGVmYXVsdAotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmVxdWFscygibm9uZSIpIHx8IHZhbHVlLmVxdWFscygicGVzc2ltaXN0aWMiKSB8fCB2YWx1ZS5lcXVhbHMoIm9wdGltaXN0aWMiKSkgewotICAgICAgICAgICAgbWVzc2FnZVN0cnVjdC5zZXRNZXRhRGF0YShDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZLCB2YWx1ZS5pbnRlcm4oKSk7Ci0gICAgICAgICAgICBjb250ZXh0LnB1dChDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZLCB2YWx1ZS5pbnRlcm4oKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VuZGVyRXhjZXB0aW9uKCJzZW5kZXIucmVxdWVzdC5pbGxlZ2FsVmFsdWVGb3JDb250ZW50TmVnb3RpYXRpb24iLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG5vbmU7CisKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZU9mKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gbm9uZSBmb3IgYW55IHVucmVjb2duaXplZCB2YWx1ZSBvciBhbnkgb3RoZXIKKyAgICAgICAgICAgIC8vIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgorICAgICAgICAgICAgcmV0dXJuIG5vbmU7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ29udGV4dE1hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0NvbnRleHRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA3ZTUwNy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvQ29udGV4dE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgc3RhdGljIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIuKjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRleHRNYXAgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+Ci0gICAgaW1wbGVtZW50cyBCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzIHsKLQotICAgIC8qKgotICAgICAqIFJlYWQtb25seSBsaXN0IG9mIGtub3duIHByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gS05PV05fUFJPUEVSVElFUzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLENsYXNzPiBfYWxsb3dlZENsYXNzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotICAgIHByb3RlY3RlZCBCaW5kaW5nUHJvdmlkZXIgX293bmVyOwotICAgIHByb3RlY3RlZCBQb3J0SW5mb0Jhc2UgcG9ydEluZm87Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ29udGV4dE1hcCBjb3B5KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvL0pBWFdTIDIuMCBkZWZpbmVkCi0gICAgICAgIF9hbGxvd2VkQ2xhc3MucHV0KFVTRVJOQU1FX1BST1BFUlRZLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgX2FsbG93ZWRDbGFzcy5wdXQoUEFTU1dPUkRfUFJPUEVSVFksIGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotICAgICAgICBfYWxsb3dlZENsYXNzLnB1dChFTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgX2FsbG93ZWRDbGFzcy5wdXQoU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSwgamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpOwotICAgICAgICBfYWxsb3dlZENsYXNzLnB1dChTT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpOwotICAgICAgICBfYWxsb3dlZENsYXNzLnB1dChTT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0KLSAgICAgICAgLy9ub3cgZGVmaW5lZCBpbiBqYXh3c2NvbnRleHQKLSAgICAgICAgX2FsbG93ZWRDbGFzcy5wdXQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhCX0NPTlRFWFRfUFJPUEVSVFksIEpBWEJDb250ZXh0LmNsYXNzKTsKLQotICAgICAgICBTZXQ8U3RyaW5nPiB0ZW1wID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAvL0pBWFdTIDIuMCBkZWZpbmVkCi0gICAgICAgIHRlbXAuYWRkKFVTRVJOQU1FX1BST1BFUlRZKTsKLSAgICAgICAgdGVtcC5hZGQoUEFTU1dPUkRfUFJPUEVSVFkpOwotICAgICAgICB0ZW1wLmFkZChFTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgdGVtcC5hZGQoU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSk7Ci0gICAgICAgIHRlbXAuYWRkKFNPQVBBQ1RJT05fVVNFX1BST1BFUlRZKTsKLSAgICAgICAgdGVtcC5hZGQoU09BUEFDVElPTl9VUklfUFJPUEVSVFkpOwotCi0gICAgICAgIHRlbXAuYWRkKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYQl9DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgLy9pbXBsZW1lbnRhdGlvbiBzcGVjaWZpYwotICAgICAgICB0ZW1wLmFkZChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkFDQ0VQVF9FTkNPRElOR19QUk9QRVJUWSk7Ci0gICAgICAgIHRlbXAuYWRkKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQ0xJRU5UX1RSQU5TUE9SVF9GQUNUT1JZKTsKLSAgICAgICAgLy91c2VkIHRvIGdldCBzdHViIGluIHJ1bnRpbWUgZm9yIGhhbmRsZXIgY2hhaW4KLSAgICAgICAgdGVtcC5hZGQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DTElFTlRfSEFORExFX1BST1BFUlRZKTsKLSAgICAgICAgdGVtcC5hZGQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DTElFTlRfSEFORExFX1BST1BFUlRZKTsKLQotICAgICAgICAvL0pBWFJQQyAxLjAgLSAxLjEgREVGSU5FRCAtIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCi0gICAgICAgIHRlbXAuYWRkKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSFRUUF9DT09LSUVfSkFSKTsKLSAgICAgICAgdGVtcC5hZGQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5PTkVfV0FZX09QRVJBVElPTik7Ci0gICAgICAgIHRlbXAuYWRkKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSFRUUF9TVEFUVVNfQ09ERSk7Ci0gICAgICAgIHRlbXAuYWRkKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSE9TVE5BTUVfVkVSSUZJQ0FUSU9OX1BST1BFUlRZKTsKLSAgICAgICAgdGVtcC5hZGQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5SRURJUkVDVF9SRVFVRVNUX1BST1BFUlRZKTsKLSAgICAgICAgdGVtcC5hZGQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5TRUNVUklUWV9DT05URVhUKTsKLSAgICAgICAgdGVtcC5hZGQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5TRVRfQVRUQUNITUVOVF9QUk9QRVJUWSk7Ci0gICAgICAgIHRlbXAuYWRkKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuR0VUX0FUVEFDSE1FTlRfUFJPUEVSVFkpOwotICAgICAgICAvL1RvZDpjaGVjayB3aXRoIG1hcmsgcmVnYXJkaW5nIHByb3BlcnR5IG1vZGlmaWNhdGlvbgotICAgICAgICAvL0tOT1dOX1BST1BFUlRJRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQodGVtcCk7Ci0KLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuSU5CT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKTsKLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyk7Ci0gICAgICAgIHRlbXAuYWRkKE1lc3NhZ2VDb250ZXh0LldTRExfREVTQ1JJUFRJT04pOwotICAgICAgICB0ZW1wLmFkZChNZXNzYWdlQ29udGV4dC5XU0RMX0lOVEVSRkFDRSk7Ci0gICAgICAgIHRlbXAuYWRkKE1lc3NhZ2VDb250ZXh0LldTRExfT1BFUkFUSU9OKTsKLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuV1NETF9QT1JUKTsKLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuV1NETF9TRVJWSUNFKTsKLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX01FVEhPRCk7Ci0gICAgICAgIHRlbXAuYWRkKE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9IRUFERVJTKTsKLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9DT0RFKTsKLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTKTsKLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuUEFUSF9JTkZPKTsKLSAgICAgICAgdGVtcC5hZGQoTWVzc2FnZUNvbnRleHQuUVVFUllfU1RSSU5HKTsKLSAgICAgICAgLy8gQ29udGVudCBuZWdvdGlhdGlvbiBwcm9wZXJ0eSBmb3IgRkkgLS0gIm5vbmUiLCAicGVzc2ltaXN0aWMiLCAib3B0aW1pc3RpYyIKLSAgICAgICAgdGVtcC5hZGQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5DT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZKTsKLSAgICAgICAgdGVtcC5hZGQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5NVE9NX1RIUkVTSE9MT0RfVkFMVUUpOwotICAgICAgICBLTk9XTl9QUk9QRVJUSUVTID0gdGVtcDsKLSAgICB9Ci0KLSAgICAvL3VzZWQgZm9yIGRpc3BhdGNoCi0gICAgcHVibGljIENvbnRleHRNYXAoUG9ydEluZm9CYXNlIGluZm8sIEJpbmRpbmdQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBfb3duZXIgPSBwcm92aWRlcjsKLSAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wb3J0SW5mbyA9IGluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDb250ZXh0TWFwKENvbnRleHRNYXAgb3JpZ2luYWwpIHsKLSAgICAgICAgc3VwZXIob3JpZ2luYWwpOwotICAgICAgICB0aGlzLl9vd25lciA9IG9yaWdpbmFsLl9vd25lcjsKLSAgICB9Ci0KLSAgICAvL21heSBub3QgbmVlZCB0aGlzCi0gICAgcHVibGljIENvbnRleHRNYXAoQmluZGluZ1Byb3ZpZGVyIG93bmVyKSB7Ci0gICAgICAgIHRoaXMobnVsbCwgb3duZXIpOwotICAgIH0KLQotICAgIGJvb2xlYW4gZG9WYWxpZGF0aW9uKCkgewotICAgICAgICByZXR1cm4gX293bmVyICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoZG9WYWxpZGF0aW9uKCkpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydHkobmFtZSwgdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGRvVmFsaWRhdGlvbigpKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZVByb3BlcnR5KG5hbWUsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXQobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoZG9WYWxpZGF0aW9uKCkpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydHkobmFtZSwgbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBbGxvd2VkVmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoIG5hbWUuZXF1YWxzKE1lc3NhZ2VDb250ZXh0LlBBVEhfSU5GTykgfHwKLSAgICAgICAgICAgIG5hbWUuZXF1YWxzKE1lc3NhZ2VDb250ZXh0LlFVRVJZX1NUUklORykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotLy8gbm8gdmFsdWUgY2hlY2sgbmVlZGVkIHRvZGF5Ci0vLyAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gX2FsbG93ZWRWYWx1ZXMuZ2V0KG5hbWUpOwotLy8gICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewotLy8gICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBmYWxzZTsKLS8vICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHZhbHVlcykgewotLy8gICAgICAgICAgICAgICAgaWYgKFNUUklOR19DTEFTUy5pc0luc3RhbmNlKG8pICYmIChTVFJJTkdfQ0xBU1MuaXNJbnN0YW5jZSh2YWx1ZSkpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKCgoamF2YS5sYW5nLlN0cmluZykgbykuZXF1YWxzSWdub3JlQ2FzZSgoamF2YS5sYW5nLlN0cmluZykgdmFsdWUpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgPSB0cnVlOwotLy8gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJPT0xFQU5fQ0xBU1MuaXNJbnN0YW5jZShvKSAmJiAoQk9PTEVBTl9DTEFTUy5pc0luc3RhbmNlKHZhbHVlKSkpIHsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5GQUxTRS5lcXVhbHMobykgfHwgQm9vbGVhbi5UUlVFLmVxdWFscyhvKSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgICAgICAvL2xvZyB0aGlzCi0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWQ7Ci0vLyAgICAgICAgfQotCi0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FsbG93ZWRDbGFzcyhTdHJpbmcgcHJvcE5hbWUsIE9iamVjdCB2YWx1ZSkgewotCi0gICAgICAgIENsYXNzIGFsbG93ZWRDbGFzcyA9IF9hbGxvd2VkQ2xhc3MuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgaWYgKGFsbG93ZWRDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWxsb3dlZENsYXNzLmlzSW5zdGFuY2UodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gaXNTZXR0ZXIpIHsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKG5hbWUgKyAiIGlzIGEgVXNlci1kZWZpbmVkIHByb3BlcnR5IC0gcHJvcGVydHkgbmFtZSBjYW4gbm90IGJlIG51bGwuICIsCi0gICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSBvZiBwcm9wZXJ0eSBpcyBudWxsLiAgVGhpcyBpcyBhbiBpbnZhbGlkIHByb3BlcnR5IG5hbWUuICIpKTsKLQotICAgICAgICAvKiBTcGVjIGNsYXJpZmllcyB0aGF0IHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZC4KLSAgICAgICAgaWYgKCFLTk9XTl9QUk9QRVJUSUVTLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICAvL2RvIHZhbGlkYXRpb24gY2hlY2sgb24gbm90ICJqYXZheC54bWwud3MuIgotICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiamF2YXgueG1sLndzIikpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24obmFtZSArICIgaXMgYSBVc2VyLWRlZmluZWQgcHJvcGVydHkgLSBjYW4gbm90IHN0YXJ0IHdpdGggamF2YXgueG1sLndzLiBwYWNrYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBzdGFydCB3aXRoIGphdmF4LnhtbC53cy4gcGFja2FnZSIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0J3MgY2hlY2sgdGhlIHByb3BlcnR5Q29udGV4dAotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIC8vaXMgaXQgYWxyZWFkeVNldAotICAgICAgICAvL09iamVjdCBjdXJyZW50UHJvcFZhbHVlID0gZ2V0KG5hbWUpOwotICAgICAgICAvL2lmIChjdXJyZW50UHJvcFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgLy8gIGlmICghaXNEeW5hbWljKG5hbWUpKQotICAgICAgICAvLyAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJQcm9wZXJ0eSBib3VuZCB0byBCaW5kaW5nIEluc3RhbmNlIiwKLSAgICAgICAgLy8gICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IG92ZXJ3cml0ZSB0aGUgU3RhdGljIFByb3BlcnR5IikpOwotICAgICAgICAvL30KLQotICAgICAgICBpZiAoaXNTZXR0ZXIpIHsKLSAgICAgICAgICAgIGlmICghaXNBbGxvd2VkQ2xhc3MobmFtZSwgdmFsdWUpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKHZhbHVlICsgIiBpcyBOb3QgQWxsb3dlZCBDbGFzcyBmb3IgcHJvcGVydHkgIiArIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBBbGxvd2VkIENsYXNzIGZvciBwcm9wZXJ0eSIpKTsKLQotICAgICAgICAgICAgaWYgKCFpc0FsbG93ZWRWYWx1ZShuYW1lLCB2YWx1ZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24odmFsdWUgKyAiIGlzIE5vdCBBbGxvd2VkIFZhbHVlIGZvciBwcm9wZXJ0eSAiICsgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IEFsbG93ZWQgdmFsdWUiKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotIC8vY3VycmVudGx5IG5vdCB1c2VkCi0gLyogICBwdWJsaWMgc3RhdGljIGVudW0gU3R5bGVBbmRVc2UgewotICAgICAgICBSUENfTElURVJBTCwKLSAgICAgICAgRE9DTElUX1dSQVBQRVJfU1RZTEUsIERPQ0xJVF9OT05XUkFQUEVSX1NUWUxFCi0gICAgfQotKi8KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9FbmRwb2ludElGQmFzZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0VuZHBvaW50SUZCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTM5MTcuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0VuZHBvaW50SUZCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5EZWxlZ2F0ZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLkNsaWVudFRyYW5zcG9ydEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuY2xpZW50Lkh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludElGQmFzZSBpbXBsZW1lbnRzIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uLlN0dWIsCi0gICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuU3R1YkJhc2UsIEJpbmRpbmdQcm92aWRlciwgSW50ZXJuYWxCaW5kaW5nUHJvdmlkZXIgewotCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gX3JlcXVlc3RDb250ZXh0OwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IF9yZXNwb25zZUNvbnRleHQ7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIF9iaW5kaW5nSWQgPSBudWxsOwotICAgIHByb3RlY3RlZCBEZWxlZ2F0ZSBfZGVsZWdhdGUgPSBudWxsOwotICAgIHByb3RlY3RlZCBCaW5kaW5nSW1wbCBiaW5kaW5nOwotCi0gICAgcHJpdmF0ZSBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IF90cmFuc3BvcnRGYWN0b3J5OwotCi0gICAgdm9pZCBzZXRSZXNwb25zZUNvbnRleHQoUmVzcG9uc2VDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgX3Jlc3BvbnNlQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3NldERlbGVnYXRlKERlbGVnYXRlIGRlbGVnYXRlKSB7Ci0gICAgICAgIF9kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWxlZ2F0ZSBfZ2V0RGVsZWdhdGUoKSB7Ci0gICAgICAgIHJldHVybiBfZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIENsaWVudFRyYW5zcG9ydEZhY3RvcnkgX2dldFRyYW5zcG9ydEZhY3RvcnkoKSB7Ci0gICAgICAgIF90cmFuc3BvcnRGYWN0b3J5ID0KLSAgICAgICAgICAgIChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5DbGllbnRUcmFuc3BvcnRGYWN0b3J5KWdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQ0xJRU5UX1RSQU5TUE9SVF9GQUNUT1JZKTsKLQotICAgICAgICBpZiAoX3RyYW5zcG9ydEZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgX3RyYW5zcG9ydEZhY3RvcnkgPSBuZXcgSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3RyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3NldFRyYW5zcG9ydEZhY3RvcnkoQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBmKSB7Ci0gICAgICAgIGdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQ0xJRU5UX1RSQU5TUE9SVF9GQUNUT1JZLCBmKTsKLSAgICAgICAgX3RyYW5zcG9ydEZhY3RvcnkgPSBmOwotICAgIH0KLQotICAgIC8vdG9EbzogaGF2ZSB0byB1cGRhdGUgZ2VuZXJhdG9yIG9uIFBlcHRTdHViIHRvIGdldENvbnRleHQKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVSZXNwb25zZUNvbnRleHQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCA9IChSZXNwb25zZUNvbnRleHQpCi0gICAgICAgICAgICBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX1JFU1BPTlNFX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBpZiAocmVzcG9uc2VDb250ZXh0ICE9IG51bGwpIHsgLy8gbnVsbCBpbiBhc3luYyBjYXNlCi0gICAgICAgICAgICBzZXRSZXNwb25zZUNvbnRleHQocmVzcG9uc2VDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgSkFYV1NDb250ZXh0IHRoYXQgaXMgdXNlZCBpbiBwcm9jZXNzaW5nIHJlcXVlc3QgbWVzc2FnZXMuCi0gICAgICogPHAvPgotICAgICAqIE1vZGlmaWNhdGlvbnMgdG8gdGhlIHJlcXVlc3QgY29udGV4dCBkbyBub3QgYWZmZWN0IGFzeW5jaHJvbm91cwotICAgICAqIG9wZXJhdGlvbnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzdGFydGVkLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgSkFYV1NDb250ZXh0IHRoYXQgaXMgdXNlZCBpbiBwcm9jZXNzaW5nIHJlcXVlc3QgbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UmVxdWVzdENvbnRleHQoKSB7Ci0gICAgICAgIGlmIChfcmVxdWVzdENvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIF9yZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCh0aGlzKTsKLQotICAgICAgICByZXR1cm4gX3JlcXVlc3RDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgSkFYV1NDb250ZXh0IHRoYXQgcmVzdWx0ZWQgZnJvbSBwcm9jZXNzaW5nIGEgcmVzcG9uc2UgbWVzc2FnZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHJldHVybmVkIGNvbnRleHQgaXMgZm9yIHRoZSBtb3N0IHJlY2VudGx5IGNvbXBsZXRlZCBzeW5jaHJvbm91cwotICAgICAqIG9wZXJhdGlvbi4gU3Vic2VxdWVudCBzeW5jaHJvbm91cyBvcGVyYXRpb24gaW52b2NhdGlvbnMgb3ZlcndyaXRlIHRoZQotICAgICAqIHJlc3BvbnNlIGNvbnRleHQuIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHJldHVybiB0aGVpciByZXNwb25zZSBjb250ZXh0Ci0gICAgICogdmlhIHRoZSBSZXNwb25zZSBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBKQVhXU0NvbnRleHQgdGhhdCBpcyB1c2VkIGluIHByb2Nlc3NpbmcgcmVxdWVzdCBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRSZXNwb25zZUNvbnRleHQoKSB7Ci0gICAgICAgIGlmIChfcmVzcG9uc2VDb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICBfcmVzcG9uc2VDb250ZXh0ID0gbmV3IFJlc3BvbnNlQ29udGV4dCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIF9yZXNwb25zZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0QmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3NldEJpbmRpbmcoQmluZGluZ0ltcGwgYmluZGluZykgewotICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgYmluZGluZyBpZCBmcm9tIEJpbmRpbmdJbXBsCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBCaW5kaW5nSUQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIF9nZXRCaW5kaW5nSWQoKSB7Ci0gICAgICAgIHJldHVybiBfYmluZGluZ0lkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0VuZHBvaW50SUZDb250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvRW5kcG9pbnRJRkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiN2NjOC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvRW5kcG9pbnRJRkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogJGF1dGhvcjogV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRJRkNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBSdW50aW1lQ29udGV4dCBydW50aW1lQ29udGV4dDsgLy9mcm9tIGFubm90YXRpb25Qcm8gZXNzCi0gICAgcHJpdmF0ZSBDbGFzcyBzZXJ2aWNlSW50ZXJmYWNlOyAgICAvL3Byb3AgY2FuIHRha2Ugb3V0Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIENsYXNzIHNlaTsKLSAgICBwcml2YXRlIFFOYW1lIHBvcnROYW1lOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEhhbmRsZXI+IGhhbmRsZXJzOwotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50QWRkcmVzczsKLSAgICBwcml2YXRlIFN0cmluZyBiaW5kaW5nSWQ7Ci0KLQotICAgIHB1YmxpYyBFbmRwb2ludElGQ29udGV4dChDbGFzcyBzZWkpIHsKLSAgICAgICAgdGhpcy5zZWkgPSBzZWk7Ci0gICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSdW50aW1lQ29udGV4dCBnZXRSdW50aW1lQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJ1bnRpbWVDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVDb250ZXh0KFJ1bnRpbWVDb250ZXh0IHJ1bnRpbWVDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMucnVudGltZUNvbnRleHQgPSBydW50aW1lQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0U2VydmljZUludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUludGVyZmFjZShDbGFzcyBzZXJ2aWNlSW50ZXJmYWNlKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUludGVyZmFjZSA9IHNlcnZpY2VJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldFNlaSgpIHsKLSAgICAgICAgcmV0dXJuIHNlaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWkoQ2xhc3Mgc2VpKSB7Ci0gICAgICAgIHRoaXMuc2VpID0gc2VpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpewotICAgICAgICBpZiAoKHJ1bnRpbWVDb250ZXh0ICE9IG51bGwpICYmIChydW50aW1lQ29udGV4dC5nZXRNb2RlbCgpICE9IG51bGwpKQotICAgICAgICAgICAgcG9ydE5hbWUgPSBydW50aW1lQ29udGV4dC5nZXRNb2RlbCgpLmdldFBvcnROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnRBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gZW5kcG9pbnRBZGRyZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvcnRJbmZvKFFOYW1lIHBvcnRRTmFtZSwgU3RyaW5nIGVuZHBvaW50LCBTdHJpbmcgYmluZGluZ0lEKSB7Ci0gICAgICAgIHBvcnROYW1lID0gcG9ydFFOYW1lOwotICAgICAgICBlbmRwb2ludEFkZHJlc3MgPSBlbmRwb2ludDsKLSAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBiaW5kaW5nSUQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSUQoKSB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmVxdWFscyh0aGlzLnNlcnZpY2VOYW1lKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFFOYW1lIHBvcnROYW1lKSB7Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nSUQoU3RyaW5nIGJpbmRpbmdJZCkgewotICAgICAgICB0aGlzLmJpbmRpbmdJZCA9IGJpbmRpbmdJZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvRW5kcG9pbnRJRkludm9jYXRpb25IYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvRW5kcG9pbnRJRkludm9jYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDgwYmMuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0VuZHBvaW50SUZJbnZvY2F0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uLk1lc3NhZ2VTdHJ1Y3Q7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5EZWxlZ2F0ZUJhc2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuSmF2YU1ldGhvZDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5XU0RMQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5Qb3J0VHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIEVuZHBvaW50SUZJbnZvY2F0aW9uSGFuZGxlcgotICAgIGV4dGVuZHMgRW5kcG9pbnRJRkJhc2UKLSAgICBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyLCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcyB7Ci0KLSAgICBPYmplY3QgX3Byb3h5OwotICAgIERlbGVnYXRlQmFzZSBfZGVsZWdhdGU7Ci0KLSAgICBFbmRwb2ludElGQ29udGV4dCBfZW5kcG9pbnRDb250ZXh0OwotCi0gICAgQ2xhc3MgX3BvcnRJbnRlcmZhY2U7Ci0gICAgUU5hbWUgX3NlcnZpY2VRTmFtZTsKLQotICAgIFJ1bnRpbWVDb250ZXh0IF9ydGNvbnRleHQ7Ci0gICAgV1NETENvbnRleHQgX3dzZGxDb250ZXh0OwotICAgIGJvb2xlYW4gZmFpbHVyZTsKLSAgICBVUkwgd3NkbERvY3VtZW50TG9jYXRpb247Ci0gICAgV1NTZXJ2aWNlRGVsZWdhdGUgX3NlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBwdWJsaWMgY29uc3RydWN0b3IKLSAgICAgKi8KLQotICAgIHB1YmxpYyBFbmRwb2ludElGSW52b2NhdGlvbkhhbmRsZXIoQ2xhc3MgcG9ydEludGVyZmFjZSwgRW5kcG9pbnRJRkNvbnRleHQgZWlmLCBXU1NlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotCi0gICAgICAgIGlmICgoZWlmLmdldEJpbmRpbmdJRCgpID09IG51bGwpIHx8IChlaWYuZ2V0UnVudGltZUNvbnRleHQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgZmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgX2VuZHBvaW50Q29udGV4dCA9IGVpZjsKLSAgICAgICAgX3BvcnRJbnRlcmZhY2UgPSBwb3J0SW50ZXJmYWNlOwotICAgICAgICBfcnRjb250ZXh0ID0gZWlmLmdldFJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICAgIF9iaW5kaW5nSWQgPSBlaWYuZ2V0QmluZGluZ0lEKCk7Ci0gICAgICAgIF9zZXJ2aWNlID0gc2VydmljZTsKLQotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVpZi5jb250YWlucyhzZXJ2aWNlTmFtZSkpCi0gICAgICAgICAgICAgICAgX3NlcnZpY2VRTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJTdXBwbGllZCBzZXJ2aWNlIFFOYW1lICIgKwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSArICIgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyB3c2RsLiIpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIF9zZXJ2aWNlUU5hbWUgPQotICAgICAgICAgICAgICAgIGVpZi5nZXRTZXJ2aWNlTmFtZSgpOwotCi0gICAgICAgIGlmIChlaWYuZ2V0RW5kcG9pbnRBZGRyZXNzKCkgIT0gbnVsbCkgICAvL3RlbXAgd29ya2Fyb3VuZCBmb3IgbG9jYWwgdHJhbnNwb3J0IGt3Ci0gICAgICAgICAgICBnZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBlaWYuZ2V0RW5kcG9pbnRBZGRyZXNzKCkpOwotCi0gICAgICAgIENvbnRhY3RJbmZvTGlzdEltcGwgY2lsID0gbmV3IENvbnRhY3RJbmZvTGlzdEltcGwoKTsKLSAgICAgICAgLy9ub3Qgc3VyZSBJIG5lZWQgdGhpcyBzZXJ2aWNlIGFyZ3VtZW50Ci0gICAgICAgIF9kZWxlZ2F0ZSA9IG5ldyBEZWxlZ2F0ZUJhc2UoY2lsLCBzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RlbChSdW50aW1lQ29udGV4dCBydGNvbnRleHQpIHsKLSAgICAgICAgX3J0Y29udGV4dCA9IHJ0Y29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm94eShPYmplY3QgcCkgewotICAgICAgICBfcHJveHkgPSBwOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFRocm93YWJsZSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc1NFSU1ldGhvZChtZXRob2QsIF9wb3J0SW50ZXJmYWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsZW1lbnRTRUlNZXRob2QobWV0aG9kLCBhcmdzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UodGhpcywgYXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG5ldyB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdH0gZnJvbSB0aGUgRGVsZWdhdGUsIGNvcGllcwotICAgICAqIHRoZSBkYXRhIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBuZXdseSBjcmVhdGVkIE1lc3NhZ2VTdHJ1Y3QsIGludm9rZXMgRGVsZWdhdGUuc2VuZCwgYW5kCi0gICAgICogcmV0dXJucyB0aGUgcmVzcG9uc2UuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBpbXBsZW1lbnRTRUlNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIFRocm93YWJsZSB7Ci0KLSAgICAgICAgTWVzc2FnZVN0cnVjdCBtZXNzYWdlU3RydWN0ID0gX2RlbGVnYXRlLmdldE1lc3NhZ2VTdHJ1Y3QoKTsKLSAgICAgICAgaW50IG1tZXAgPSAwOwotICAgICAgICBpZiAoX3J0Y29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKYXZhTWV0aG9kIGptZXRob2QgPSBfcnRjb250ZXh0LmdldE1vZGVsKCkuZ2V0SmF2YU1ldGhvZChtZXRob2QpOwotICAgICAgICAgICAgaWYgKGptZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBtZXAgPSBqbWV0aG9kLmdldE1FUCgpOwotICAgICAgICAgICAgICAgIG1tZXAgPSAobWVwID09IE1lc3NhZ2VTdHJ1Y3QuUkVRVUVTVF9SRVNQT05TRV9NRVApID8KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVN0cnVjdC5SRVFVRVNUX1JFU1BPTlNFX01FUCA6IChtZXAgPT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCkgPwotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU3RydWN0Lk9ORV9XQVlfTUVQIDogKChtZXAgPT0gTWVzc2FnZVN0cnVjdC5BU1lOQ19QT0xMX01FUCkgPwotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU3RydWN0LkFTWU5DX1BPTExfTUVQIDogTWVzc2FnZVN0cnVjdC5BU1lOQ19DQUxMQkFDS19NRVApOwotICAgICAgICAgICAgfSBlbHNlIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJydW50aW1lIG1vZGVsIGluZm9ybWF0aW9uIGZvciBqYXZhIE1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgaXMgbm90IGtub3duIC4iKTsKLSAgICAgICAgfSAvL25lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBkaXNwYXRjaCBpbnZvY2F0aW9uCi0KLSAgICAgICAgaWYgKG1tZXAgPT0gTWVzc2FnZVN0cnVjdC5BU1lOQ19DQUxMQkFDS19NRVApIHsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHBhcmFtIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsICYmIEFzeW5jSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcmFtLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vbWVzc2FnZVN0cnVjdC5zZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NMSUVOVF9BU1lOQ19IQU5ETEVSLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DTElFTlRfQVNZTkNfSEFORExFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY0hhbmRsZXJTZXJ2aWNlKChBc3luY0hhbmRsZXIpcGFyYW0sIGdldEN1cnJlbnRFeGVjdXRvcigpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWVzc2FnZVN0cnVjdC5zZXRNZXRob2QobWV0aG9kKTsKLSAgICAgICAgbWVzc2FnZVN0cnVjdC5zZXREYXRhKHBhcmFtZXRlcnMpOwotICAgICAgICBSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCA9IChSZXF1ZXN0Q29udGV4dCkoamF2YS51dGlsLk1hcCkKLSAgICAgICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHkpLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0gICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChKQVhXU19DTElFTlRfSEFORExFX1BST1BFUlRZLCBfcHJveHkpOwotICAgICAgICBtZXNzYWdlU3RydWN0LnNldE1ldGFEYXRhKEpBWFdTX1JVTlRJTUVfQ09OVEVYVCwgX3J0Y29udGV4dCk7Ci0gICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TWV0YURhdGEoSkFYV1NfQ09OVEVYVF9QUk9QRVJUWSwgcmVxdWVzdENvbnRleHQpOwotCi0gICAgICAgIC8vc2V0IG10b20gdGhyZXNob2xkIHZhbHVlIHRvCi0gICAgICAgIE9iamVjdCBtdG9tVGhyZXNob2xkID0gcmVxdWVzdENvbnRleHQuZ2V0KE1UT01fVEhSRVNIT0xPRF9WQUxVRSk7Ci0gICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TWV0YURhdGEoTVRPTV9USFJFU0hPTE9EX1ZBTFVFLCBtdG9tVGhyZXNob2xkKTsKLQotICAgICAgICBtZXNzYWdlU3RydWN0LnNldE1FUChtbWVwKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGNvbnRlbnQgbmVnb3RpYXRpb24gcHJvcGVydHkKLSAgICAgICAgQ29udGVudE5lZ290aWF0aW9uLmluaXRpYWxpemUocmVxdWVzdENvbnRleHQsIG1lc3NhZ2VTdHJ1Y3QpOwotCi0gICAgICAgIC8vIFNldCBNVE9NIHByb2Nlc3NpbmcgZm9yIFhNTCByZXF1ZXN0cyBvbmx5Ci0gICAgICAgIGlmIChfcnRjb250ZXh0ICE9IG51bGwgJiYgX3J0Y29udGV4dC5nZXRNb2RlbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nIHNiID0KLSAgICAgICAgICAgICAgICAoYmluZGluZyBpbnN0YW5jZW9mIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nKSA/Ci0gICAgICAgICAgICAgICAgICAgIChqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZykgYmluZGluZyA6IG51bGw7Ci0gICAgICAgICAgICBpZiAoc2IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9ydGNvbnRleHQuZ2V0TW9kZWwoKS5lbmFibGVNdG9tKHNiLmlzTVRPTUVuYWJsZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBfZGVsZWdhdGUuc2VuZChtZXNzYWdlU3RydWN0KTsKLSAgICAgICAgdXBkYXRlUmVzcG9uc2VDb250ZXh0KChNZXNzYWdlSW5mbykgbWVzc2FnZVN0cnVjdCk7Ci0gICAgICAgIHN3aXRjaCAobWVzc2FnZVN0cnVjdC5nZXRSZXNwb25zZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBNZXNzYWdlU3RydWN0Lk5PUk1BTF9SRVNQT05TRToKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRToKLSAgICAgICAgICAgICAgICBpZiAoX3J0Y29udGV4dC5nZXRNb2RlbCgpLmlzQ2hlY2tlZEV4Y2VwdGlvbihtZXRob2QsIG1lc3NhZ2VTdHJ1Y3QuZ2V0UmVzcG9uc2UoKS5nZXRDbGFzcygpKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFRocm93YWJsZSkgbWVzc2FnZVN0cnVjdC5nZXRSZXNwb25zZSgpOwotICAgICAgICAgICAgICAgIHRocm93IChFeGNlcHRpb24pIG1lc3NhZ2VTdHJ1Y3QuZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBtZXNzYWdlU3RydWN0LmdldFJlc3BvbnNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VTdHJ1Y3QuZ2V0UmVzcG9uc2UoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzU0VJTWV0aG9kKE1ldGhvZCBtZXRob2QsIENsYXNzIHNlaSkgewotICAgICAgICByZXR1cm4gKHNlaS5lcXVhbHMobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRJRkNvbnRleHQgZ2V0RW5kcG9pbnRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gX2VuZHBvaW50Q29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZVFOYW1lKCkgewotICAgICAgICByZXR1cm4gX3NlcnZpY2VRTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UG9ydEludGVyZmFjZSgpewotICAgICAgICByZXR1cm4gX3BvcnRJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgIEV4ZWN1dG9yIGdldEN1cnJlbnRFeGVjdXRvcigpewotICAgICAgICByZXR1cm4gX3NlcnZpY2UuZ2V0RXhlY3V0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0V1NETFBvcnRUeXBlUU5hbWUoKXsKLSAgICAgICAgcmV0dXJuIF9zZXJ2aWNlLmdldFdTRExCaW5kaW5nKF9lbmRwb2ludENvbnRleHQuZ2V0UG9ydE5hbWUoKSkuZ2V0UG9ydFR5cGVOYW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0hhbmRsZXJDb25maWd1cmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvSGFuZGxlckNvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDg2MzQyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0hhbmRsZXJDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBoYW5kbGVyIGluZm9ybWF0aW9uIG9uIHRoZSBCaW5kaW5nUHJvdmlkZXIuCisgKiBIYW5kbGVyQ29uZmlndXJhdGlvbiBpcyBpbW11dGFibGUsIGFuZCBhIG5ldyBvYmplY3QgaXMgY3JlYXRlZAorICogd2hlbiB0aGUgQmluZGluZ0ltcGwgaXMgY3JlYXRlZCBvciBVc2VyIGNhbGxzIEJpbmRpbmcuc2V0SGFuZGxlckNoYWluKCkgb3IKKyAqIFNPQVBCaW5kaW5nLnNldFJvbGVzKCkKKyAqIER1cmluZyBpbm92Y2F0aW9uIGluIFN0dWIucHJvY2VzcygpLCBzbmFwc2hvdCBvZiB0aGUgaGFuZGxlciBjb25maWd1cmF0aW9uIGlzIHNldCBpbgorICogUGFja2V0LmhhbmRsZXJDb25maWcKKyAqIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgSGFuZGxlckNvbmZpZ3VyYXRpb24gaXMgdXNlZCBieSBNVVBpcGUgYW5kIEhhbmRsZXJUdWJlCisgKiBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogQGF1dGhvciBSYW1hIFB1bGF2YXJ0aGkKKyAqLworcHVibGljIGNsYXNzIEhhbmRsZXJDb25maWd1cmF0aW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHJvbGVzOworICAgIC8qKgorICAgICAqIFRoaXMgY2hhaW4gbWF5IGNvbnRhaW4gYm90aCBzb2FwIGFuZCBsb2dpY2FsIGhhbmRsZXJzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxIYW5kbGVyPiBoYW5kbGVyQ2hhaW47CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PExvZ2ljYWxIYW5kbGVyPiBsb2dpY2FsSGFuZGxlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNPQVBIYW5kbGVyPiBzb2FwSGFuZGxlcnM7CisgICAgcHJpdmF0ZSBTZXQ8UU5hbWU+IGtub3duSGVhZGVyczsKKyAgICBwcml2YXRlIFNldDxRTmFtZT4gaGFuZGxlcktub3duSGVhZGVyczsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcm9sZXMgICAgICAgICAgICAgICAgICAgIFRoaXMgY29udGFpbnMgdGhlIHJvbGVzIGFzc3VtZWQgYnkgdGhlIEJpbmRpbmcgaW1wbGVtZW50YXRpb24uCisgICAgICogQHBhcmFtIHBvcnRLbm93bkhlYWRlcnMgICAgVGhpcyBjb250YWlucyB0aGUgaGVhZGVycyB0aGF0IGFyZSBib3VuZCB0byB0aGUgY3VycmVudCBXU0RMIFBvcnQKKyAgICAgKiBAcGFyYW0gaGFuZGxlckNoYWluICAgICAgICAgICAgIFRoaXMgY29udGFpbnMgdGhlIGhhbmRsZXIgY2hhaW4gc2V0IG9uIHRoZSBCaW5kaW5nCisgICAgICogQHBhcmFtIGxvZ2ljYWxIYW5kbGVycworICAgICAqIEBwYXJhbSBzb2FwSGFuZGxlcnMKKyAgICAgKiBAcGFyYW0gaGFuZGxlcktub3duSGVhZGVycyBUaGUgc2V0IGlzIGNvbXByaXNlZCBvZiBoZWFkZXJzIHJldHVybmVkIGZyb20gU09BUEhhbmRsZXIuZ2V0SGVhZGVycygpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgY2FsbHMuCisgICAgICovCisgICAgcHVibGljIEhhbmRsZXJDb25maWd1cmF0aW9uKFNldDxTdHJpbmc+IHJvbGVzLCBTZXQ8UU5hbWU+IHBvcnRLbm93bkhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SGFuZGxlcj4gaGFuZGxlckNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PExvZ2ljYWxIYW5kbGVyPiBsb2dpY2FsSGFuZGxlcnMsIExpc3Q8U09BUEhhbmRsZXI+IHNvYXBIYW5kbGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PFFOYW1lPiBoYW5kbGVyS25vd25IZWFkZXJzKSB7CisgICAgICAgIHRoaXMucm9sZXMgPSByb2xlczsKKyAgICAgICAgdGhpcy5oYW5kbGVyQ2hhaW4gPSBoYW5kbGVyQ2hhaW47CisgICAgICAgIHRoaXMubG9naWNhbEhhbmRsZXJzID0gbG9naWNhbEhhbmRsZXJzOworICAgICAgICB0aGlzLnNvYXBIYW5kbGVycyA9IHNvYXBIYW5kbGVyczsKKyAgICAgICAgdGhpcy5oYW5kbGVyS25vd25IZWFkZXJzID0gaGFuZGxlcktub3duSGVhZGVyczsKKyAgICAgICAgdGhpcy5rbm93bkhlYWRlcnMgPSBuZXcgSGFzaFNldDxRTmFtZT4oKTsKKyAgICAgICAgaWYocG9ydEtub3duSGVhZGVycyAhPSBudWxsKQorICAgICAgICAgICAga25vd25IZWFkZXJzLmFkZEFsbChwb3J0S25vd25IZWFkZXJzKTsKKyAgICAgICAgaWYoaGFuZGxlcktub3duSGVhZGVycyAhPSBudWxsKQorICAgICAgICAgICAga25vd25IZWFkZXJzLmFkZEFsbChoYW5kbGVyS25vd25IZWFkZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Um9sZXMoKSB7CisgICAgICAgIHJldHVybiByb2xlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gcmV0dXJuIGEgY29weSBvZiBoYW5kbGVyIGNoYWluCisgICAgICovCisgICAgcHVibGljIExpc3Q8SGFuZGxlcj4gZ2V0SGFuZGxlckNoYWluKCkgeworICAgICAgICBpZihoYW5kbGVyQ2hhaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oaGFuZGxlckNoYWluKTsKKworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PExvZ2ljYWxIYW5kbGVyPiBnZXRMb2dpY2FsSGFuZGxlcnMoKSB7CisgICAgICAgIHJldHVybiBsb2dpY2FsSGFuZGxlcnM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U09BUEhhbmRsZXI+IGdldFNvYXBIYW5kbGVycygpIHsKKyAgICAgICAgcmV0dXJuIHNvYXBIYW5kbGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRLbm93bkhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBrbm93bkhlYWRlcnM7CisgICAgfQorCisgICAgcHVibGljIFNldDxRTmFtZT4gZ2V0SGFuZGxlcktub3duSGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXJLbm93bkhlYWRlcnM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvSGFuZGxlckNvbmZpZ3VyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0hhbmRsZXJDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODNiODhlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L0hhbmRsZXJDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmNsaWVudC5XU1BvcnRJbmZvOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5zTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5IYW5kbGVyQW5ub3RhdGlvbkluZm87CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5IYW5kbGVyQW5ub3RhdGlvblByb2Nlc3NvcjsKKworaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47CitpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm87CitpbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBVc2VkIGJ5IHtAbGluayBXU1NlcnZpY2VEZWxlZ2F0ZX0gdG8gY29uZmlndXJlIHtAbGluayBCaW5kaW5nSW1wbH0KKyAqIHdpdGggaGFuZGxlcnMuIFRoZSB0d28gbWVjaGFuaXNtcyBlbmNhcHN1bGF0ZWQgYnkgdGhpcyBhYnN0cmFjdGlvbgorICogaXMge0BsaW5rIEhhbmRsZXJDaGFpbn0gYW5ub3RhaW9uIGFuZCB7QGxpbmsgSGFuZGxlclJlc29sdmVyfQorICogaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworYWJzdHJhY3QgY2xhc3MgSGFuZGxlckNvbmZpZ3VyYXRvciB7CisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgZ2l2ZW4ge0BsaW5rIEJpbmRpbmdJbXBsfSBvYmplY3QgYnkgYWRkaW5nIGhhbmRsZXJzIHRvIGl0LgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgY29uZmlndXJlSGFuZGxlcnMoQE5vdE51bGwgV1NQb3J0SW5mbyBwb3J0LCBATm90TnVsbCBCaW5kaW5nSW1wbCBiaW5kaW5nKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgSGFuZGxlclJlc29sdmVyfSwgaWYgdGhpcyBvYmplY3QgZW5jYXBzdWxhdGVzIGFueSB7QGxpbmsgSGFuZGxlclJlc29sdmVyfS4KKyAgICAgKiBPdGhlcndpc2UgbnVsbC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBIYW5kbGVyUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKTsKKworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBoYW5kbGVycyBieSBjYWxsaW5nIHtAbGluayBIYW5kbGVyUmVzb2x2ZXJ9LgorICAgICAqIDxwPgorICAgICAqIFdoZW4gYSBudWxsIHtAbGluayBIYW5kbGVyUmVzb2x2ZXJ9IGlzIHNldCBieSB0aGUgdXNlciB0bworICAgICAqIHtAbGluayBTZXJ2aWNlI3NldEhhbmRsZXJSZXNvbHZlcihIYW5kbGVyUmVzb2x2ZXIpfSwgd2UnbGwgdXNlIHRoaXMgb2JqZWN0CisgICAgICogd2l0aCBudWxsIHtAbGluayAjcmVzb2x2ZXJ9LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBIYW5kbGVyUmVzb2x2ZXJJbXBsIGV4dGVuZHMgSGFuZGxlckNvbmZpZ3VyYXRvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQE51bGxhYmxlIEhhbmRsZXJSZXNvbHZlciByZXNvbHZlcjsKKworICAgICAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVySW1wbChIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY29uZmlndXJlSGFuZGxlcnMoQE5vdE51bGwgV1NQb3J0SW5mbyBwb3J0LCBATm90TnVsbCBCaW5kaW5nSW1wbCBiaW5kaW5nKSB7CisgICAgICAgICAgICBpZihyZXNvbHZlciE9bnVsbCkKKyAgICAgICAgICAgICAgICBiaW5kaW5nLnNldEhhbmRsZXJDaGFpbihyZXNvbHZlci5nZXRIYW5kbGVyQ2hhaW4ocG9ydCkpOworICAgICAgICB9CisKKworICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGhhbmRsZXJzIGZyb20ge0BsaW5rIEhhbmRsZXJDaGFpbn0gYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgY2xhc3MgaXMgYSBzaW1wbGUKKyAgICAgKiBtYXAgb2YgUG9ydEluZm8gb2JqZWN0cyB0byBoYW5kbGVyIGNoYWlucy4gSXQgaXMgdXNlZCBieSBhCisgICAgICoge0BsaW5rIFdTU2VydmljZURlbGVnYXRlfSBvYmplY3QsIGFuZCBjYW4KKyAgICAgKiBiZSByZXBsYWNlZCBieSB1c2VyIGNvZGUgd2l0aCBhIGRpZmZlcmVudCBjbGFzcyBpbXBsZW1lbnRpbmcKKyAgICAgKiBIYW5kbGVyUmVzb2x2ZXIuIFRoaXMgY2xhc3MgaXMgb25seSB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZSwgYW5kCisgICAgICogaXQgaW5jbHVkZXMgYSBsb3Qgb2YgbG9nZ2luZyB0byBoZWxwIHdoZW4gdGhlcmUgYXJlIGlzc3VlcyBzaW5jZQorICAgICAqIGl0IGRlYWxzIHdpdGggcG9ydCBuYW1lcywgc2VydmljZSBuYW1lcywgYW5kIGJpbmRpbmdzLiBBbGwgdGhyZWUKKyAgICAgKiBtdXN0IG1hdGNoIHdoZW4gZ2V0dGluZyBhIGhhbmRsZXIgY2hhaW4gZnJvbSB0aGUgbWFwLgorICAgICAqCisgICAgICogPHA+SXQgaXMgY3JlYXRlZCBieSB0aGUge0BsaW5rIFdTU2VydmljZURlbGVnYXRlfQorICAgICAqIGNsYXNzICwgd2hpY2ggdXNlcyB7QGxpbmsgSGFuZGxlckFubm90YXRpb25Qcm9jZXNzb3J9IHRvIGNyZWF0ZQorICAgICAqIGEgaGFuZGxlciBjaGFpbiBhbmQgdGhlbiBpdCBzZXRzIHRoZSBjaGFpbnMgb24gdGhpcyBjbGFzcyBhbmQgdGhleQorICAgICAqIGFyZSBwdXQgaW50byB0aGUgbWFwLiBUaGUgU2VydmljZUNvbnRleHQgdXNlcyB0aGUgbWFwIHRvIHNldCBoYW5kbGVyCisgICAgICogY2hhaW5zIG9uIGJpbmRpbmdzIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbkNvbmZpZ3VyYXRvciBleHRlbmRzIEhhbmRsZXJDb25maWd1cmF0b3IgeworICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXJDaGFpbnNNb2RlbCBoYW5kbGVyTW9kZWw7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFdTUG9ydEluZm8sSGFuZGxlckFubm90YXRpb25JbmZvPiBjaGFpbk1hcCA9IG5ldyBIYXNoTWFwPFdTUG9ydEluZm8sSGFuZGxlckFubm90YXRpb25JbmZvPigpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigKKyAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4gKyAiLmhhbmRsZXIiKTsKKworICAgICAgICBBbm5vdGF0aW9uQ29uZmlndXJhdG9yKFdTU2VydmljZURlbGVnYXRlIGRlbGVnYXRlKSB7CisgICAgICAgICAgICBoYW5kbGVyTW9kZWwgPSBIYW5kbGVyQW5ub3RhdGlvblByb2Nlc3Nvci5idWlsZEhhbmRsZXJDaGFpbnNNb2RlbChkZWxlZ2F0ZS5nZXRTZXJ2aWNlQ2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnQgaGFuZGxlck1vZGVsIT1udWxsOyAvLyB0aGlzIGNsYXNzIGlzIHN1cHBlb2QgdG8gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSdzIEBIYW5kbGVyQ0hhaW4KKyAgICAgICAgfQorCisKKyAgICAgICAgdm9pZCBjb25maWd1cmVIYW5kbGVycyhXU1BvcnRJbmZvIHBvcnQsIEJpbmRpbmdJbXBsIGJpbmRpbmcpIHsKKyAgICAgICAgICAgIC8vQ2hlY2sgaW4gY2FjaGUgZmlyc3QKKyAgICAgICAgICAgIEhhbmRsZXJBbm5vdGF0aW9uSW5mbyBjaGFpbiA9IGNoYWluTWFwLmdldChwb3J0KTsKKworICAgICAgICAgICAgaWYoY2hhaW49PW51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2dHZXRDaGFpbihwb3J0KTsKKyAgICAgICAgICAgICAgICAvLyBQdXQgaXQgaW4gY2FjaGUKKyAgICAgICAgICAgICAgICBjaGFpbiA9IGhhbmRsZXJNb2RlbC5nZXRIYW5kbGVyc0ZvclBvcnRJbmZvKHBvcnQpOworICAgICAgICAgICAgICAgIGNoYWluTWFwLnB1dChwb3J0LGNoYWluKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgeworICAgICAgICAgICAgICAgICgoU09BUEJpbmRpbmcpIGJpbmRpbmcpLnNldFJvbGVzKGNoYWluLmdldFJvbGVzKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2dTZXRDaGFpbihwb3J0LGNoYWluKTsKKyAgICAgICAgICAgIGJpbmRpbmcuc2V0SGFuZGxlckNoYWluKGNoYWluLmdldEhhbmRsZXJzKCkpOworICAgICAgICB9CisKKyAgICAgICAgSGFuZGxlclJlc29sdmVyIGdldFJlc29sdmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyUmVzb2x2ZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIExpc3Q8SGFuZGxlcj4gZ2V0SGFuZGxlckNoYWluKFBvcnRJbmZvIHBvcnRJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlck1vZGVsLmdldEhhbmRsZXJzRm9yUG9ydEluZm8ocG9ydEluZm8pLmdldEhhbmRsZXJzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgLy8gbG9nZ2VkIGF0IGZpbmVyIGxldmVsCisgICAgICAgIHByaXZhdGUgdm9pZCBsb2dTZXRDaGFpbihXU1BvcnRJbmZvIGluZm8sIEhhbmRsZXJBbm5vdGF0aW9uSW5mbyBjaGFpbikgeworICAgICAgICAgICAgbG9nZ2VyLmZpbmVyKCJTZXR0aW5nIGNoYWluIG9mIGxlbmd0aCAiICsgY2hhaW4uZ2V0SGFuZGxlcnMoKS5zaXplKCkgKworICAgICAgICAgICAgICAgICIgZm9yIHBvcnQgaW5mbyIpOworICAgICAgICAgICAgbG9nUG9ydEluZm8oaW5mbywgTGV2ZWwuRklORVIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbG9nZ2VkIGF0IGZpbmUgbGV2ZWwKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxvZ0dldENoYWluKFdTUG9ydEluZm8gaW5mbykgeworICAgICAgICAgICAgbG9nZ2VyLmZpbmUoIk5vIGhhbmRsZXIgY2hhaW4gZm91bmQgZm9yIHBvcnQgaW5mbzoiKTsKKyAgICAgICAgICAgIGxvZ1BvcnRJbmZvKGluZm8sIExldmVsLkZJTkUpOworICAgICAgICAgICAgbG9nZ2VyLmZpbmUoIkV4aXN0aW5nIGhhbmRsZXIgY2hhaW5zOiIpOworICAgICAgICAgICAgaWYgKGNoYWluTWFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKCJub25lIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoV1NQb3J0SW5mbyBrZXkgOiBjaGFpbk1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZShjaGFpbk1hcC5nZXQoa2V5KS5nZXRIYW5kbGVycygpLnNpemUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGhhbmRsZXJzIGZvciBwb3J0IGluZm8gIik7CisgICAgICAgICAgICAgICAgICAgIGxvZ1BvcnRJbmZvKGtleSwgTGV2ZWwuRklORSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxvZ1BvcnRJbmZvKFdTUG9ydEluZm8gaW5mbywgTGV2ZWwgbGV2ZWwpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsICJiaW5kaW5nOiAiICsgaW5mby5nZXRCaW5kaW5nSUQoKSArCisgICAgICAgICAgICAgICAgIlxuc2VydmljZTogIiArIGluZm8uZ2V0U2VydmljZU5hbWUoKSArCisgICAgICAgICAgICAgICAgIlxucG9ydDogIiArIGluZm8uZ2V0UG9ydE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvSW50ZXJuYWxCaW5kaW5nUHJvdmlkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9JbnRlcm5hbEJpbmRpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWI4ZmY5Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9JbnRlcm5hbEJpbmRpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKLQotCi0vKioKLSAqIEEgdXRpbGl0eSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgY2xhc3NlcwotICogdGhhdCBpbXBsZW1lbnQgQmluZGluZ1Byb3ZpZGVyLgotICoKLSAqIEBzZWUgV2ViU2VydmljZSNzZXRCaW5kaW5nT25Qcm92aWRlcihJbnRlcm5hbEJpbmRpbmdQcm92aWRlciwKLSAqICAgICAgUU5hbWUsIFN0cmluZykKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcm5hbEJpbmRpbmdQcm92aWRlciB7Ci0gICAgcHVibGljIHZvaWQgX3NldEJpbmRpbmcoQmluZGluZ0ltcGwgYmluZGluZyk7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvUG9ydEluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Qb3J0SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODQxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvUG9ydEluZm8uamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQ7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkVuZHBvaW50QWRkcmVzczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NTZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5jbGllbnQuV1NQb3J0SW5mbzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuV2ViU2VydmljZUZlYXR1cmVMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETFBvcnRJbXBsOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgYSBwb3J0LgorICogPHAvPgorICogVGhpcyBvYmplY3QgaXMgb3duZWQgYnkge0BsaW5rIFdTU2VydmljZURlbGVnYXRlfSB0byBrZWVwIHRyYWNrIG9mIGEgcG9ydCwKKyAqIHNpbmNlIGEgcG9ydCBtYXliZSBhZGRlZCBkeW5hbWljYWxseS4KKyAqCisgKiBAYXV0aG9yIEpBWFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworcHVibGljIGNsYXNzIFBvcnRJbmZvIGltcGxlbWVudHMgV1NQb3J0SW5mbyB7CisgICAgcHJpdmF0ZSBmaW5hbCBATm90TnVsbCBXU1NlcnZpY2VEZWxlZ2F0ZSBvd25lcjsKKworICAgIHB1YmxpYyBmaW5hbCBATm90TnVsbCBRTmFtZSBwb3J0TmFtZTsKKyAgICBwdWJsaWMgZmluYWwgQE5vdE51bGwgRW5kcG9pbnRBZGRyZXNzIHRhcmdldEVuZHBvaW50OworICAgIHB1YmxpYyBmaW5hbCBATm90TnVsbCBCaW5kaW5nSUQgYmluZGluZ0lkOworCisgICAgLyoqCisgICAgICogSWYgYSBwb3J0IGlzIGtub3duIHN0YXRpY2FsbHkgdG8gYSBXU0RMLCB7QGxpbmsgUG9ydEluZm99IG1heQorICAgICAqIGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBtb2RlbC4gVGhpcyB3b3VsZCBvY2N1ciB3aGVuIHRoZQorICAgICAqIHNlcnZpY2Ugd2FzIGNyZWF0ZWQgd2l0aCB0aGUgV1NETCBsb2NhdGlvbiBhbmQgdGhlIHBvcnQgaXMgZGVmaW5lZAorICAgICAqIGluIHRoZSBXU0RMLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiB0aGlzIGlzIGEge0BsaW5rIFNFSVBvcnRJbmZvfSwgdGhlbiB0aGlzIGlzIGFsd2F5cyBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQE51bGxhYmxlIFdTRExQb3J0IHBvcnRNb2RlbDsKKworICAgIHB1YmxpYyBQb3J0SW5mbyhXU1NlcnZpY2VEZWxlZ2F0ZSBvd25lciwgRW5kcG9pbnRBZGRyZXNzIHRhcmdldEVuZHBvaW50LCBRTmFtZSBuYW1lLCBCaW5kaW5nSUQgYmluZGluZ0lkKSB7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICAgICAgdGhpcy50YXJnZXRFbmRwb2ludCA9IHRhcmdldEVuZHBvaW50OworICAgICAgICB0aGlzLnBvcnROYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBiaW5kaW5nSWQ7CisgICAgICAgIHRoaXMucG9ydE1vZGVsID0gZ2V0UG9ydE1vZGVsKG93bmVyLCBuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9ydEluZm8oQE5vdE51bGwgV1NTZXJ2aWNlRGVsZWdhdGUgb3duZXIsIEBOb3ROdWxsIFdTRExQb3J0IHBvcnQpIHsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICB0aGlzLnRhcmdldEVuZHBvaW50ID0gcG9ydC5nZXRBZGRyZXNzKCk7CisgICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0LmdldE5hbWUoKTsKKyAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBwb3J0LmdldEJpbmRpbmcoKS5nZXRCaW5kaW5nSWQoKTsKKyAgICAgICAgdGhpcy5wb3J0TW9kZWwgPSBwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMge0BsaW5rIEJpbmRpbmdJbXBsfSBmb3IgdGhpcyB7QGxpbmsgUG9ydEluZm99LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYlNlcnZpY2VGZWF0dXJlcworICAgICAqICAgICAgVXNlci1zcGVjaWZpZWQgZmVhdHVyZXMuCisgICAgICogQHBhcmFtIHBvcnRJbnRlcmZhY2UKKyAgICAgKiAgICAgIE51bGwgaWYgdGhpcyBpcyBmb3IgZGlzcGF0Y2guIE90aGVyd2lzZSB0aGUgaW50ZXJmYWNlIHRoZSBwcm94eSBpcyBnb2luZyB0byBpbXBsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgQmluZGluZ0ltcGwgY3JlYXRlQmluZGluZyhXZWJTZXJ2aWNlRmVhdHVyZVtdIHdlYlNlcnZpY2VGZWF0dXJlcywgQ2xhc3M8Pz4gcG9ydEludGVyZmFjZSkgeworICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZUxpc3QgciA9IG5ldyBXZWJTZXJ2aWNlRmVhdHVyZUxpc3Qod2ViU2VydmljZUZlYXR1cmVzKTsKKyAgICAgICAgaWYgKHBvcnRNb2RlbCAhPSBudWxsKQorICAgICAgICAgICAgLy8gbWVyZ2UgZmVhdHVyZXMgZnJvbSBXU0RMCisgICAgICAgICAgICByLm1lcmdlRmVhdHVyZXMocG9ydE1vZGVsLCBwb3J0SW50ZXJmYWNlPT1udWxsLyppZiBkaXNwYXRjaCwgdHJ1ZSovLCBmYWxzZSk7CisKKyAgICAgICAgLy8gbWVyZ2UgZmVhdHVyZXMgZnJvbSBpbnRlcmNlcHRvcgorICAgICAgICBmb3IoIFdlYlNlcnZpY2VGZWF0dXJlIHdzZiA6IG93bmVyLnNlcnZpY2VJbnRlcmNlcHRvci5wcmVDcmVhdGVCaW5kaW5nKHRoaXMscG9ydEludGVyZmFjZSxyKSApCisgICAgICAgICAgICByLmFkZCh3c2YpOworCisgICAgICAgIEJpbmRpbmdJbXBsIGJpbmRpbmdJbXBsID0gQmluZGluZ0ltcGwuY3JlYXRlKGJpbmRpbmdJZCwgci50b0FycmF5KCkpOworICAgICAgICBvd25lci5nZXRIYW5kbGVyQ29uZmlndXJhdG9yKCkuY29uZmlndXJlSGFuZGxlcnModGhpcyxiaW5kaW5nSW1wbCk7CisKKyAgICAgICAgcmV0dXJuIGJpbmRpbmdJbXBsOworICAgIH0KKworICAgIC8vVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgRGlzcGF0Y2ggY2xpZW50IG9ubHkKKyAgICBwcml2YXRlIFdTRExQb3J0IGdldFBvcnRNb2RlbChXU1NlcnZpY2VEZWxlZ2F0ZSBvd25lciwgUU5hbWUgcG9ydE5hbWUpIHsKKworICAgICAgICBpZiAob3duZXIuZ2V0V3NkbFNlcnZpY2UoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIEl0ZXJhYmxlPFdTRExQb3J0SW1wbD4gcG9ydHMgPSBvd25lci5nZXRXc2RsU2VydmljZSgpLmdldFBvcnRzKCk7CisgICAgICAgICAgICBmb3IgKFdTRExQb3J0SW1wbCBwb3J0IDogcG9ydHMpeworICAgICAgICAgICAgICAgIGlmIChwb3J0LmdldE5hbWUoKS5lcXVhbHMocG9ydE5hbWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKy8vCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBBUEkgUG9ydEluZm8gaW50ZXJmYWNlCisvLworCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFdTRExQb3J0IGdldFBvcnQoKSB7CisgICAgICAgIHJldHVybiBwb3J0TW9kZWw7CisgICAgfQorCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgV1NTZXJ2aWNlIGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gb3duZXI7CisgICAgfQorCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgQmluZGluZ0lEIGdldEJpbmRpbmdJZCgpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmdJZDsKKyAgICB9CisKKyAgICBATm90TnVsbAorICAgIHB1YmxpYyBFbmRwb2ludEFkZHJlc3MgZ2V0RW5kcG9pbnRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0RW5kcG9pbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIE9ubHkgbWVhbnQgdG8gYmUgdXNlZCB2aWEge0BsaW5rIGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvfS4KKyAgICAgKiAgICAgIFVzZSB7QGxpbmsgV1NTZXJ2aWNlRGVsZWdhdGUjZ2V0U2VydmljZU5hbWUoKX0uCisgICAgICovCisgICAgcHVibGljIFFOYW1lIGdldFNlcnZpY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gb3duZXIuZ2V0U2VydmljZU5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgT25seSBtZWFudCB0byBiZSB1c2VkIHZpYSB7QGxpbmsgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm99LgorICAgICAqICAgICAgVXNlIHtAbGluayAjcG9ydE5hbWV9LgorICAgICAqLworICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBPbmx5IG1lYW50IHRvIGJlIHVzZWQgdmlhIHtAbGluayBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mb30uCisgICAgICogICAgICBVc2Uge0BsaW5rICNiaW5kaW5nSWR9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lEKCkgeworICAgICAgICByZXR1cm4gYmluZGluZ0lkLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1BvcnRJbmZvQmFzZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1BvcnRJbmZvQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDU0OTdhLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9Qb3J0SW5mb0Jhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogSkFYV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgUG9ydEluZm9CYXNlIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0RW5kcG9pbnQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlOwotICAgIHByb3RlY3RlZCBRTmFtZSBuYW1lOwotICAgIHByb3RlY3RlZCBRTmFtZSBwb3J0VHlwZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBiaW5kaW5nSWQ7Ci0KLSAgICBwdWJsaWMgUG9ydEluZm9CYXNlKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGFyZ2V0RW5kcG9pbnQgPSAiIjsKLSAgICAgICAgZGVmYXVsdE5hbWVzcGFjZSA9ICIiOwotICAgIH0KLQotICAgIHB1YmxpYyBQb3J0SW5mb0Jhc2UoU3RyaW5nIHRhcmdldEVuZHBvaW50LCBRTmFtZSBuYW1lLCBTdHJpbmcgYmluZGluZ0lkKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0RW5kcG9pbnQgPSB0YXJnZXRFbmRwb2ludDsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBiaW5kaW5nSWQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXROYW1lKFFOYW1lIG5tKSB7Ci0gICAgICAgIG5hbWUgPSBubTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRUYXJnZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnQpIHsKLSAgICAgICAgdGFyZ2V0RW5kcG9pbnQgPSBlbmRwb2ludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVuZHBvaW50KCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0RW5kcG9pbnQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRCaW5kaW5nSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGJpbmRpbmdJZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lkKCkgewotICAgICAgICByZXR1cm4gYmluZGluZ0lkOwotICAgIH0KLQotICAgIHZvaWQgc2V0UG9ydFR5cGVOYW1lKFFOYW1lIHR5cGVOYW1lKSB7Ci0gICAgICAgIHBvcnRUeXBlTmFtZSA9IHR5cGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0VHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZU5hbWU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXREZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgZGVmYXVsdE5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvUmVxdWVzdENvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9SZXF1ZXN0Q29udGV4dC5qYXZhCmluZGV4IDk0YWYzYTIuLmRkZjYzODcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9SZXF1ZXN0Q29udGV4dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9SZXF1ZXN0Q29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDI3ICsyNCwzNzAgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQ7CiAKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlByb3BlcnR5U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKKwogaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKKy8qKgorICogUmVxdWVzdCBjb250ZXh0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIDxoMj5XaHkgYSBjdXN0b20gbWFwPzwvaDI+CisgKiA8cD4KKyAqIFRoZSBKQVgtV1Mgc3BlYyBleHBvc2VzIHByb3BlcnRpZXMgYXMgYSB7QGxpbmsgTWFwfSwgYnV0IGlmIHdlIGp1c3QgdXNlCisgKiBhbiBvcmRpbmFyeSB7QGxpbmsgSGFzaE1hcH0gZm9yIHRoaXMsIGl0IGRvZXNuJ3Qgd29yayBhcyBmYXN0IGFzIHdlJ2QgbGlrZQorICogaXQgdG8gYmUuIEhlbmNlIHdlIGhhdmUgdGhpcyBjbGFzcy4KKyAqCisgKiA8cD4KKyAqIFdlIGV4cGVjdCB0aGUgdXNlciB0byBzZXQgYSBmZXcgcHJvcGVydGllcyBhbmQgdGhlbiB1c2UgdGhhdCBzYW1lCisgKiBzZXR0aW5nIHRvIG1ha2UgYSBidW5jaCBvZiBpbnZvY2F0aW9ucy4gU28gd2UnZCBsaWtlIHRvIHRha2Ugc29tZSBoaXQKKyAqIHdoZW4gdGhlIHVzZXIgYWN0dWFsbHkgc2V0cyBhIHByb3BlcnR5IHRvIGRvIHNvbWUgY29tcHV0YXRpb24sCisgKiB0aGVuIHVzZSB0aGF0IGNvbXB1dGVkIHZhbHVlIGR1cmluZyBhIG1ldGhvZCBpbnZvY2F0aW9uIGFnYWluIGFuZCBhZ2Fpbi4KKyAqCisgKiA8cD4KKyAqIEZvciB0aGlzIGdvYWwsIHdlIHVzZSB7QGxpbmsgUHJvcGVydHlTZXR9IGFuZCBpbXBsZW1lbnQgc29tZSBwcm9wZXJ0aWVzCisgKiBhcyB2aXJ0dWFsIHByb3BlcnRpZXMgYmFja2VkIGJ5IG1ldGhvZHMuIFRoaXMgYWxsb3dzIHVzIHRvIGRvIHRoZSBjb21wdXRhdGlvbgorICogaW4gdGhlIHNldHRlciwgYW5kIHN0b3JlIGl0IGluIGEgZmllbGQuCisgKgorICogPHA+CisgKiBUaGVzZSBmaWVsZHMgYXJlIHVzZWQgYnkge0BsaW5rIFN0dWIjcHJvY2Vzc30gdG8gcG9wdWxhdGUgYSB7QGxpbmsgUGFja2V0fS4KKyAqCisgKgorICoKKyAqIDxoMj5Ib3cgaXQgd29ya3M/PC9oMj4KKyAqIDxwPgorICogV2UgbWFrZSBhbiBhc3N1bXB0aW9uIHRoYXQgYSByZXF1ZXN0IGNvbnRleHQgaXMgbW9zdGx5IHVzZWQgdG8ganVzdAorICogZ2V0IGFuZCBwdXQgdmFsdWVzLCBub3QgcmVhbGx5IGZvciB0aGluZ3MgbGlrZSBlbnVtZXJhdGluZyBvciBzaXplLgorICoKKyAqIDxwPgorICogU28gd2Ugc3RhcnQgYnkgbWFpbnRhaW5pbmcgc3RhdGUgYXMgYSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgI290aGVyc30KKyAqIGJhZyBhbmQgc3Ryb25nbHktdHlwZWQgZmllbGRzLiBBcyBsb25nIGFzIHRoZSBhcHBsaWNhdGlvbiB1c2VzCisgKiBqdXN0IHtAbGluayBNYXAjcHV0fSwge0BsaW5rIE1hcCNnZXR9LCBhbmQge0BsaW5rIE1hcCNwdXRBbGx9LCB3ZSBjYW4KKyAqIGRvIHRoaW5ncyBpbiB0aGlzIHdheS4gSW4gdGhpcyBtb2RlIGEge0BsaW5rIE1hcH0gd2UgcmV0dXJuIHdvcmtzIGFzCisgKiBhIHZpZXcgaW50byB7QGxpbmsgUmVxdWVzdENvbnRleHR9LCBhbmQgYnkgaXRzZWxmIGl0IG1haW50YWlucyBubyBzdGF0ZS4KKyAqCisgKiA8cD4KKyAqIElmIHtAbGluayBSZXF1ZXN0Q29udGV4dH0gaXMgaW4gdGhpcyBtb2RlLCBpdHMgc3RhdGUgY2FuIGJlIGNvcGllZAorICogZWZmaWNpZW50bHkgaW50byB7QGxpbmsgUGFja2V0fS4KKyAqCisgKiA8cD4KKyAqIE9uY2UgdGhlIGFwcGxpY2F0aW9uIHVzZXMgYW55IG90aGVyIHtAbGluayBNYXB9IG1ldGhvZCwgd2UgbW92ZSB0bworICogdGhlICJmYWxsYmFjayIgbW9kZSwgd2hlcmUgdGhlIGRhdGEgaXMgYWN0dWFsbHkgc3RvcmVkIGluIGEge0BsaW5rIEhhc2hNYXB9LAorICogdGhpcyBpcyBuZWNlc3NhcnkgZm9yIGltcGxlbWVudGluZyB0aGUgbWFwIGludGVyZmFjZSBjb250cmFjdCBjb3JyZWN0bHkuCisgKgorICogPHA+CisgKiBUbyBiZSBzYWZlLCBvbmNlIHdlIGZhbGxiYWNrLCB3ZSdsbCBuZXZlciBjb21lIGJhY2sgdG8gdGhlIGVmZmljaWVudCBzdGF0ZS4KKyAqCisgKgorICoKKyAqIDxoMj5DYXV0aW9uPC9oMj4KKyAqIDxwPgorICogT25jZSB3ZSBhcmUgaW4gdGhlIGZhbGxiYWNrIG1vZGUsIG5vbmUgb2YgdGhlIHN0cm9uZ2x5IHR5cGVkIGZpZWxkIHdpbGwKKyAqIGJlIHVzZWQsIGFuZCB0aGV5IG1heSBjb250YWluIHN0YWxlIHZhbHVlcy4gU28gdGhlIG9ubHkgbWV0aG9kCisgKiB0aGUgY29kZSBvdXRzaWRlIHRoaXMgY2xhc3MgY2FuIHNhZmVseSB1c2UgaXMge0BsaW5rICNjb3B5KCl9LAorICoge0BsaW5rICNmaWxsKFBhY2tldCl9LCBhbmQgY29uc3RydWN0b3JzLiBEbyBub3QgYWNjZXNzIHRoZSBzdHJvbmdseQorICogdHlwZWQgZmllbGRzIG5vciB7QGxpbmsgI290aGVyc30gZGlyZWN0bHkuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlN1c3BpY2lvdXNNZXRob2RDYWxscyJ9KQorcHVibGljIGZpbmFsIGNsYXNzIFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUHJvcGVydHlTZXQgeworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIHVzZSBmb3Ige0BsaW5rICNjb250ZW50TmVnb3RpYXRpb259IG9idGFpbmVkCisgICAgICogZnJvbSBhIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGVuYWJsZXMgY29udGVudCBuZWdvdGlhdGlvbiB0byBiZSBlYXNpbHkgc3dpdGNoZWQgb24gYnkgc2V0dGluZworICAgICAqIGEgc3lzdGVtIHByb3BlcnR5IG9uIHRoZSBjb21tYW5kIGxpbmUgZm9yIHRlc3RpbmcgcHVycG9zZXMgdGVzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGVudE5lZ290aWF0aW9uIGRlZmF1bHRDb250ZW50TmVnb3RpYXRpb24gPQorICAgICAgICAgICAgQ29udGVudE5lZ290aWF0aW9uLm9idGFpbkZyb21TeXN0ZW1Qcm9wZXJ0eSgpOwogCi1wdWJsaWMgY2xhc3MgUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0TWFwIHsKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgcHJvcGVydGllcyB0aGF0IGRvbid0IGZpdCB0aGUgc3Ryb25nbHktdHlwZWQgZmllbGRzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IG90aGVyczsKIAotICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dChCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIocHJvdmlkZXIpOworICAgIC8qKgorICAgICAqIFRoZSBlbmRwb2ludCBhZGRyZXNzIHRvIHdoaWNoIHRoaXMgbWVzc2FnZSBpcyBzZW50IHRvLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyB0aGUgYWN0dWFsIGRhdGEgc3RvcmUgZm9yIHtAbGluayBCaW5kaW5nUHJvdmlkZXIjRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWX0uCisgICAgICovCisgICAgcHJpdmF0ZSBATm90TnVsbCBFbmRwb2ludEFkZHJlc3MgZW5kcG9pbnRBZGRyZXNzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyI0VORFBPSU5UX0FERFJFU1NfUFJPUEVSVFl9IHZpZXcKKyAgICAgKiBvbiB0b3Agb2Yge0BsaW5rICNlbmRwb2ludEFkZHJlc3N9LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiAgICAgIGFsd2F5cyBhY2Nlc3Mge0BsaW5rICNlbmRwb2ludEFkZHJlc3N9LgorICAgICAqLworICAgIEBQcm9wZXJ0eShCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSkKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZFBvaW50QWRkcmVzc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGVuZHBvaW50QWRkcmVzcy50b1N0cmluZygpOwogICAgIH0KIAotICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dChQb3J0SW5mb0Jhc2UgcG9ydCwgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKHBvcnQsIHByb3ZpZGVyKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmRQb2ludEFkZHJlc3NTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYocz09bnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5lbmRwb2ludEFkZHJlc3MgPSBFbmRwb2ludEFkZHJlc3MuY3JlYXRlKHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50QWRkcmVzcyhATm90TnVsbCBFbmRwb2ludEFkZHJlc3MgZXBhKSB7CisgICAgICAgIHRoaXMuZW5kcG9pbnRBZGRyZXNzID0gZXBhOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBFbmRwb2ludEFkZHJlc3MgZ2V0RW5kcG9pbnRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gZW5kcG9pbnRBZGRyZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB7QGxpbmsgQ29udGVudE5lZ290aWF0aW9uI1BST1BFUlRZfQorICAgICAqIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBDb250ZW50TmVnb3RpYXRpb24gY29udGVudE5lZ290aWF0aW9uID0gZGVmYXVsdENvbnRlbnROZWdvdGlhdGlvbjsKKworICAgIEBQcm9wZXJ0eShDb250ZW50TmVnb3RpYXRpb24uUFJPUEVSVFkpCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50TmVnb3RpYXRpb25TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50TmVnb3RpYXRpb24udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TmVnb3RpYXRpb25TdHJpbmcoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYocz09bnVsbCkKKyAgICAgICAgICAgIGNvbnRlbnROZWdvdGlhdGlvbiA9IENvbnRlbnROZWdvdGlhdGlvbi5ub25lOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udGVudE5lZ290aWF0aW9uID0gQ29udGVudE5lZ290aWF0aW9uLnZhbHVlT2Yocyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBub3QgcmVjb2duaXplZCBkZWZhdWx0IHRvIG5vbmUKKyAgICAgICAgICAgICAgICBjb250ZW50TmVnb3RpYXRpb24gPSBDb250ZW50TmVnb3RpYXRpb24ubm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIFNPQVBBY3Rpb24gaGVhZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBvdXRnb2luZyBtZXNzYWdlcywgdGhlIHRyYW5zcG9ydCBtYXkgc2VuZHMgb3V0IHRoaXMgdmFsdWUuCisgICAgICogSWYgdGhpcyBmaWVsZCBpcyBudWxsLCB0aGUgdHJhbnNwb3J0IG1heSBjaG9vc2UgdG8gc2VuZCA8dHQ+IiI8L3R0PgorICAgICAqIChxdW90ZWQgZW1wdHkgc3RyaW5nLikKKyAgICAgKgorICAgICAqIEZvciBpbmNvbWluZyBtZXNzYWdlcywgdGhlIHRyYW5zcG9ydCB3aWxsIHNldCB0aGlzIGZpZWxkLgorICAgICAqIElmIHRoZSBpbmNvbWluZyBtZXNzYWdlIGRpZCBub3QgY29udGFpbiB0aGUgU09BUEFjdGlvbiBoZWFkZXIsCisgICAgICogdGhlIHRyYW5zcG9ydCBzZXRzIHRoaXMgZmllbGQgdG8gbnVsbC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSB2YWx1ZSBpcyBub24tbnVsbCwgaXQgbXVzdCBiZSBhbHdheXMgaW4gdGhlIHF1b3RlZCBmb3JtLgorICAgICAqIFRoZSB2YWx1ZSBjYW4gYmUgbnVsbC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgd2F5IHRoZSB0cmFuc3BvcnQgc2VuZHMgdGhpcyB2YWx1ZSBvdXQgZGVwZW5kcyBvbgorICAgICAqIHRyYW5zcG9ydCBhbmQgU09BUCB2ZXJzaW9uLgorICAgICAqCisgICAgICogRm9yIEhUVFAgdHJhbnNwb3J0IGFuZCBTT0FQIDEuMSwgQlAgcmVxdWlyZXMgdGhhdCBTT0FQQWN0aW9uCisgICAgICogaGVhZGVyIGlzIHByZXNlbnQgKFNlZSB7QEJQIFIyNzQ0fSBhbmQge0BCUCBSMjc0NX0uKSBGb3IgU09BUCAxLjIsCisgICAgICogdGhpcyBpcyBtb3ZlZCB0byB0aGUgcGFyYW1ldGVyIG9mIHRoZSAiYXBwbGljYXRpb24vc29hcCt4bWwiLgorICAgICAqLworCisgICAgcHJpdmF0ZSBTdHJpbmcgc29hcEFjdGlvbjsKKworICAgIEBQcm9wZXJ0eShCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFkpCisgICAgcHVibGljIFN0cmluZyBnZXRTb2FwQWN0aW9uKCl7CisgICAgICAgIHJldHVybiBzb2FwQWN0aW9uOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRTb2FwQWN0aW9uKFN0cmluZyBzQWN0aW9uKXsKKyAgICAgICAgaWYoc0FjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTT0FQQWN0aW9uIHZhbHVlIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc29hcEFjdGlvbiA9IHNBY3Rpb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgTWFwfSBleHBvc2VkIHRvIHRoZSB1c2VyIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwVmlldyBtYXBWaWV3ID0gbmV3IE1hcFZpZXcoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gZW1wdHkge0BsaW5rIFJlcXVlc3RDb250ZXh0fS4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBSZXF1ZXN0Q29udGV4dCgpIHsKKyAgICAgICAgb3RoZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgKi8KLSAgICBwcml2YXRlIFJlcXVlc3RDb250ZXh0KFJlcXVlc3RDb250ZXh0IG9yaWdpbmFsKSB7Ci0gICAgICAgIHN1cGVyKG9yaWdpbmFsKTsKKyAgICBwcml2YXRlIFJlcXVlc3RDb250ZXh0KFJlcXVlc3RDb250ZXh0IHRoYXQpIHsKKyAgICAgICAgb3RoZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4odGhhdC5vdGhlcnMpOworICAgICAgICBlbmRwb2ludEFkZHJlc3MgPSB0aGF0LmVuZHBvaW50QWRkcmVzczsKKyAgICAgICAgc29hcEFjdGlvbiA9IHRoYXQuc29hcEFjdGlvbjsKKyAgICAgICAgY29udGVudE5lZ290aWF0aW9uID0gdGhhdC5jb250ZW50TmVnb3RpYXRpb247CisgICAgICAgIC8vIHRoaXMgaXMgZnJhZ2lsZSwgYnV0IGl0IHdvcmtzIGZhc3RlcgorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlZmZpY2llbnQgZ2V0IG1ldGhvZCB0aGF0IHJlYWRzIGZyb20ge0BsaW5rIFJlcXVlc3RDb250ZXh0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIGlmKHN1cGVyLnN1cHBvcnRzKGtleSkpCisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBvdGhlcnMuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVmZmljaWVudCBwdXQgbWV0aG9kIHRoYXQgdXBkYXRlcyB7QGxpbmsgUmVxdWVzdENvbnRleHR9LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZihzdXBlci5zdXBwb3J0cyhrZXkpKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnB1dChrZXksdmFsdWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gb3RoZXJzLnB1dChrZXksdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBNYXB9IHZpZXcgb2YgdGhpcyByZXF1ZXN0IGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBBbHdheXMgc2FtZSBvYmplY3QuIFJldHVybmVkIG1hcCBpcyBsaXZlLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0TWFwVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1hcFZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsbCBhIHtAbGluayBQYWNrZXR9IHdpdGggdmFsdWVzIG9mIHRoaXMge0BsaW5rIFJlcXVlc3RDb250ZXh0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaWxsKFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgaWYobWFwVmlldy5mYWxsYmFja01hcD09bnVsbCkgeworICAgICAgICAgICAgaWYgKGVuZHBvaW50QWRkcmVzcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHBhY2tldC5lbmRwb2ludEFkZHJlc3MgPSBlbmRwb2ludEFkZHJlc3M7CisgICAgICAgICAgICBwYWNrZXQuY29udGVudE5lZ290aWF0aW9uID0gY29udGVudE5lZ290aWF0aW9uOworICAgICAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhY2tldC5zb2FwQWN0aW9uID0gc29hcEFjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFvdGhlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcGFja2V0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLnB1dEFsbChvdGhlcnMpOworICAgICAgICAgICAgICAgIC8vaWYgaXQgaXMgbm90IHN0YW5kYXJkIHByb3BlcnR5IGl0IGRlYWZ1bHRzIHRvIFNjb3BlLkhBTkRMRVIKKyAgICAgICAgICAgICAgICBwYWNrZXQuZ2V0SGFuZGxlclNjb3BlUHJvcGVydHlOYW1lcyhmYWxzZSkuYWRkQWxsKG90aGVycy5rZXlTZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBoYW5kbGVyU2NvcGVQcm9wZXJ0eU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgLy8gZmFsbGJhY2sgbW9kZSwgc2ltcGx5IGNvcHkgbWFwIGluIGEgc2xvdyB3YXkKKyAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLE9iamVjdD4gZW50cnkgOiBtYXBWaWV3LmZhbGxiYWNrTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgaWYocGFja2V0LnN1cHBvcnRzKGtleSkpCisgICAgICAgICAgICAgICAgICAgIHBhY2tldC5wdXQoa2V5LGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLnB1dChrZXksZW50cnkuZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAgICAgICAvL2lmIGl0IGlzIG5vdCBzdGFuZGFyZCBwcm9wZXJ0eSBpdCBkZWFmdWx0cyB0byBTY29wZS5IQU5ETEVSCisgICAgICAgICAgICAgICAgaWYoIXN1cGVyLnN1cHBvcnRzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlclNjb3BlUHJvcGVydHlOYW1lcy5hZGQoa2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCFoYW5kbGVyU2NvcGVQcm9wZXJ0eU5hbWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBwYWNrZXQuZ2V0SGFuZGxlclNjb3BlUHJvcGVydHlOYW1lcyhmYWxzZSkuYWRkQWxsKGhhbmRsZXJTY29wZVByb3BlcnR5TmFtZXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIFJlcXVlc3RDb250ZXh0IGNvcHkoKSB7CiAgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdENvbnRleHQodGhpcyk7CiAgICAgfQorCisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1hcFZpZXcgaW1wbGVtZW50cyBNYXA8U3RyaW5nLE9iamVjdD4geworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsT2JqZWN0PiBmYWxsYmFja01hcDsKKworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsT2JqZWN0PiBmYWxsYmFjaygpIHsKKyAgICAgICAgICAgIGlmKGZhbGxiYWNrTWFwPT1udWxsKSB7CisgICAgICAgICAgICAgICAgLy8gaGFzIHRvIGZhbGwgYmFjay4gZmlsbCBpbiBmYWxsYmFja01hcAorICAgICAgICAgICAgICAgIGZhbGxiYWNrTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4ob3RoZXJzKTsKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHB1dCBhbGwga25vd24gcHJvcGVydGllcworICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZyxBY2Nlc3Nvcj4gcHJvcCA6IHByb3BNYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBmYWxsYmFja01hcC5wdXQocHJvcC5nZXRLZXkoKSxwcm9wLmdldFZhbHVlKCkuZ2V0KFJlcXVlc3RDb250ZXh0LnRoaXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2tNYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2soKS5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkuY29udGFpbnNLZXkoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2soKS5jb250YWluc1ZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIGlmIChmYWxsYmFja01hcCA9PW51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVxdWVzdENvbnRleHQudGhpcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkuZ2V0KGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmKGZhbGxiYWNrTWFwID09bnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVxdWVzdENvbnRleHQudGhpcy5wdXQoa2V5LHZhbHVlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2soKS5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBpZiAoZmFsbGJhY2tNYXAgPT1udWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RDb250ZXh0LnRoaXMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpLnJlbW92ZShrZXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgT2JqZWN0PiB0KSB7CisgICAgICAgICAgICBmb3IgKEVudHJ5PD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+IGUgOiB0LmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBwdXQoZS5nZXRLZXkoKSxlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBmYWxsYmFjaygpLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkua2V5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IHZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpLnZhbHVlcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkuZW50cnlTZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBQcm9wZXJ0eU1hcCBnZXRQcm9wZXJ0eU1hcCgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BNYXA7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlNYXAgcHJvcE1hcCA9IHBhcnNlKFJlcXVlc3RDb250ZXh0LmNsYXNzKTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9SZXNwb25zZUNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9SZXNwb25zZUNvbnRleHQuamF2YQppbmRleCBkY2I2OTgwLi5kMzU2MDYxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvUmVzcG9uc2VDb250ZXh0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1Jlc3BvbnNlQ29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDIyICsyNCwxMzkgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQ7CiAKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CiAKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi1wdWJsaWMgY2xhc3MgUmVzcG9uc2VDb250ZXh0IGV4dGVuZHMgQ29udGV4dE1hcCB7Ci0gICAgcHVibGljIFJlc3BvbnNlQ29udGV4dChCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIocHJvdmlkZXIpOwotICAgIH0KKy8qKgorICogSW1wbGVtZW50cyAicmVzcG9uc2UgY29udGV4dCIgb24gdG9wIG9mIHtAbGluayBQYWNrZXR9LgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgcmVhZC1vbmx5IHtAbGluayBNYXB9IHZpZXcgdGhhdAorICogZ2V0cyBleHBvc2VkIHRvIGNsaWVudCBhcHBsaWNhdGlvbnMgYWZ0ZXIgYW4gaW52b2NhdGlvbgorICogaXMgY29tcGxldGUuCisgKgorICogPHA+CisgKiBUaGUgZGVzaWduIGdvYWwgb2YgdGhpcyBjbGFzcyBpcyB0byBtYWtlIGl0IGVmZmljaWVudAorICogdG8gY3JlYXRlIGEgbmV3IHtAbGluayBSZXNwb25zZUNvbnRleHR9LCBhdCB0aGUgZXhwZW5zZQorICogb2YgbWFraW5nIHNvbWUge0BsaW5rIE1hcH0gb3BlcmF0aW9ucyBzbG93ZXIuIFRoaXMgaXMKKyAqIGp1c3RpZmllZCBiZWNhdXNlIHRoZSByZXNwb25zZSBjb250ZXh0IGlzIG1vc3RseSBqdXN0CisgKiB1c2VkIHRvIHF1ZXJ5IGEgZmV3IGtub3duIHZhbHVlcywgYW5kIG9wZXJhdGlvbnMgbGlrZQorICogZW51bWVyYXRpb24gaXNuJ3QgbGlrZWx5LgorICoKKyAqIDxwPgorICogU29tZSBvZiB0aGUge0BsaW5rIE1hcH0gbWV0aG9kcyByZXF1cmUgdGhpcyBjbGFzcyB0bworICogYnVpbGQgdGhlIGNvbXBsZXRlIHtAbGluayBTZXR9IG9mIHByb3BlcnRpZXMsIGJ1dCB3ZQorICogdHJ5IHRvIGF2b2lkIHRoYXQgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKyAqCisgKgorICogPHByZT4KKyAqIFRPRE86IGFyZSB3ZSBleHBvc2luZyBhbGwgc3Ryb25nbHktdHlwZWQgZmllbGRzLCBvcgorICogZG8gdGhleSBoYXZlIGFwcGxpYXRpb24vaGFuZGxlciBzY29wZSBub3Rpb24/CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiU3VzcGljaW91c01ldGhvZENhbGxzIn0pICAgIC8vIElERSBkb2Vzbid0IGxpa2UgbWUgY2FsbGluZyBNYXAgbWV0aG9kcyB3aXRoIGtleSB0eXBlZCBhcyBPYmplY3QKK3B1YmxpYyBjbGFzcyBSZXNwb25zZUNvbnRleHQgZXh0ZW5kcyBBYnN0cmFjdE1hcDxTdHJpbmcsT2JqZWN0PiB7CisgICAgcHJpdmF0ZSBmaW5hbCBQYWNrZXQgcGFja2V0OwogCiAgICAgLyoqCi0gICAgICogQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKiBMYXppbHkgY29tcHV0ZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBSZXNwb25zZUNvbnRleHQoUmVzcG9uc2VDb250ZXh0IG9yaWdpbmFsKSB7Ci0gICAgICAgIHN1cGVyKG9yaWdpbmFsKTsKKyAgICBwcml2YXRlIFNldDxNYXAuRW50cnk8U3RyaW5nLE9iamVjdD4+IGVudHJ5U2V0OworCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhY2tldAorICAgICAqICAgICAgVGhlIHtAbGluayBQYWNrZXR9IHRvIHdyYXAuCisgICAgICovCisgICAgcHVibGljIFJlc3BvbnNlQ29udGV4dChQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIHRoaXMucGFja2V0ID0gcGFja2V0OwogICAgIH0KIAotICAgIHB1YmxpYyBSZXNwb25zZUNvbnRleHQgY29weSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZUNvbnRleHQodGhpcyk7CisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICBpZihwYWNrZXQuc3VwcG9ydHMoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiBwYWNrZXQuY29udGFpbnNLZXkoa2V5KTsgICAgLy8gc3Ryb25nbHkgdHlwZWQKKworICAgICAgICBpZihwYWNrZXQuaW52b2NhdGlvblByb3BlcnRpZXMuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgIC8vIGlmIGhhbmRsZXItc2NvcGUsIGhpZGUgaXQKKyAgICAgICAgICAgIHJldHVybiAhcGFja2V0LmdldEhhbmRsZXJTY29wZVByb3BlcnR5TmFtZXModHJ1ZSkuY29udGFpbnMoa2V5KTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworICAgICAgICBpZihwYWNrZXQuc3VwcG9ydHMoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiBwYWNrZXQuZ2V0KGtleSk7ICAgIC8vIHN0cm9uZ2x5IHR5cGVkCisKKyAgICAgICAgaWYocGFja2V0LmdldEhhbmRsZXJTY29wZVByb3BlcnR5TmFtZXModHJ1ZSkuY29udGFpbnMoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAgICAgICAgIC8vIG5vIHN1Y2ggYXBwbGljYXRpb24tc2NvcGUgcHJvcGVydHkKKworICAgICAgICBPYmplY3QgdmFsdWUgPSAgcGFja2V0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLmdldChrZXkpOworCisgICAgICAgIC8vYWRkIHRoZSBhdHRhY2htZW50cyBmcm9tIHRoZSBNZXNzYWdlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgcHJvcGVydHkKKyAgICAgICAgaWYoa2V5LmVxdWFscyhNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpKXsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRzID0gKE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPikgdmFsdWU7CisgICAgICAgICAgICBpZihhdHRzID09IG51bGwpCisgICAgICAgICAgICAgICAgYXR0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KCk7CisgICAgICAgICAgICBBdHRhY2htZW50U2V0IGF0dFNldCA9IHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0QXR0YWNobWVudHMoKTsKKyAgICAgICAgICAgIGZvcihBdHRhY2htZW50IGF0dCA6IGF0dFNldCl7CisgICAgICAgICAgICAgICAgYXR0cy5wdXQoYXR0LmdldENvbnRlbnRJZCgpLCBhdHQuYXNEYXRhSGFuZGxlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhdHRzOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgLy8gcmVzcG9uc2UgY29udGV4dCBpcyByZWFkLW9ubHkKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgeworICAgICAgICAvLyByZXNwb25zZSBjb250ZXh0IGlzIHJlYWQtb25seQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+IHQpIHsKKyAgICAgICAgLy8gcmVzcG9uc2UgY29udGV4dCBpcyByZWFkLW9ubHkKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIC8vIHJlc3BvbnNlIGNvbnRleHQgaXMgcmVhZC1vbmx5CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCgpIHsKKyAgICAgICAgaWYoZW50cnlTZXQ9PW51bGwpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgd2hlcmUgdGhlIHdvcnN0IGNhc2UgaGFwcGVucy4gd2UgaGF2ZSB0byBjbG9uZSB0aGUgd2hvbGUgcHJvcGVydGllcworICAgICAgICAgICAgLy8gdG8gZ2V0IHRoaXMgdmlldy4KKworICAgICAgICAgICAgLy8gdXNlIFRyZWVTZXQgc28gdGhhdCB0b1N0cmluZygpIHNvcnQgdGhlbSBuaWNlbHkuIEl0J3MgZWFzaWVyIGZvciBhcHBzLgorICAgICAgICAgICAgTWFwPFN0cmluZyxPYmplY3Q+IHIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PigpOworCisgICAgICAgICAgICAvLyBleHBvcnQgYXBwbGljYXRpb24tc2NvcGUgcHJvcGVydGllcworICAgICAgICAgICAgci5wdXRBbGwocGFja2V0Lmludm9jYXRpb25Qcm9wZXJ0aWVzKTsKKworICAgICAgICAgICAgLy8gaGlkZSBoYW5kbGVyLXNjb3BlIHByb3BlcnRpZXMKKyAgICAgICAgICAgIHIua2V5U2V0KCkucmVtb3ZlQWxsKHBhY2tldC5nZXRIYW5kbGVyU2NvcGVQcm9wZXJ0eU5hbWVzKHRydWUpKTsKKworICAgICAgICAgICAgLy8gYW5kIGFsbCBzdHJvbmdseSB0eXBlZCBvbmVzCisgICAgICAgICAgICByLnB1dEFsbChwYWNrZXQuY3JlYXRlTWFwVmlldygpKTsKKworICAgICAgICAgICAgZW50cnlTZXQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoci5lbnRyeVNldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbnRyeVNldDsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9SZXNwb25zZUNvbnRleHRSZWNlaXZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1Jlc3BvbnNlQ29udGV4dFJlY2VpdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwODZkZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9SZXNwb25zZUNvbnRleHRSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQ7CisKKy8qKgorICogUmVjZWl2ZXMge0BsaW5rIFJlc3BvbnNlQ29udGV4dH0gYXQgdGhlIGVuZCBvZgorICogdGhlIG1lc3NhZ2UgaW52b2NhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXIgeworICAgIC8qKgorICAgICAqIENhbGxlZCB1cG9uIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBpbnZvY2F0aW9uCisgICAgICogdG8gc2V0IGEge0BsaW5rIFJlc3BvbnNlQ29udGV4dH0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGV2ZW4gd2hlbiB0aGUgaW52b2NhdGlvbiBmYWlscy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFJlc3BvbnNlQ29udGV4dChSZXNwb25zZUNvbnRleHQgcmMpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1Jlc3BvbnNlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1Jlc3BvbnNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OGQ4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvUmVzcG9uc2VJbXBsLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQ7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbXBsZXRlZEZ1dHVyZTsKKworaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CisKKy8qKgorICoge0BsaW5rIFJlc3BvbnNlfSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIEthdGh5IFdhbHNoCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNwb25zZUltcGw8VD4gZXh0ZW5kcyBGdXR1cmVUYXNrPFQ+IGltcGxlbWVudHMgUmVzcG9uc2U8VD4sIFJlc3BvbnNlQ29udGV4dFJlY2VpdmVyIHsKKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsIHtAbGluayBBc3luY0hhbmRsZXJ9IHRoYXQgZ2V0cyBpbnZva2VkCisgICAgICogYXQgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHRhc2suCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBc3luY0hhbmRsZXI8VD4gaGFuZGxlcjsKKyAgICBwcml2YXRlIFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIENhbGxhYmxlPFQ+IGNhbGxhYmxlOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGFibGUKKyAgICAgKiAgICAgIFRoaXMge0BsaW5rIENhbGxhYmxlfSBpcyBleGVjdXRlZCBhc3luY2hyb25vdXNseS4KKyAgICAgKiBAcGFyYW0gaGFuZGxlcgorICAgICAqICAgICAgT3B0aW9uYWwge0BsaW5rIEFzeW5jSGFuZGxlcn0gdG8gaW52b2tlIGF0IHRoZSBlbmQKKyAgICAgKiAgICAgIG9mIHRoZSBwcm9jZXNzaW5nLiBDYW4gYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzcG9uc2VJbXBsKENhbGxhYmxlPFQ+IGNhbGxhYmxlLCBBc3luY0hhbmRsZXI8VD4gaGFuZGxlcikgeworICAgICAgICBzdXBlcihjYWxsYWJsZSk7CisgICAgICAgIHRoaXMuY2FsbGFibGUgPSBjYWxsYWJsZTsKKyAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIC8vIG92ZXJyaWRlIHNvIHRoYXQgd2UgY2FsbCBzZXQoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0KGNhbGxhYmxlLmNhbGwoKSwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBzZXQobnVsbCwgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXQoZmluYWwgVCB2LCBmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAvLyBjYWxsIHRoZSBoYW5kbGVyIGJlZm9yZSB3ZSBtYXJrIHRoZSBmdXR1cmUgYXMgJ2RvbmUnCisgICAgICAgIGlmIChoYW5kbGVyIT1udWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIHtAbGluayBSZXNwb25zZX0gb2JqZWN0IHBhc3NlZCBpbnRvIHRoZSBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICAgKiBXZSBuZWVkIGEgc2VwYXJhdGUge0BsaW5rIEZ1dHVyZX0gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHtAbGluayBSZXNwb25zZUltcGx9CisgICAgICAgICAgICAgICAgICogdG8gYmUgbWFya2VkIGFzICdkb25lJyBiZWZvcmUgdGhlIGNhbGxiYWNrIGZpbmlzaGVzIGV4ZWN1dGlvbi4KKyAgICAgICAgICAgICAgICAgKiAoVGhhdCB3b3VsZCBwcm92aWRlIGltcGxpY2l0IHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBjb2RlCisgICAgICAgICAgICAgICAgICogaW4gdGhlIG1haW4gdGhyZWFkIGFuZCB0aGUgY2FsbGJhY2sgY29kZSwgYW5kIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgSkFYLVJJIDIuMCBGQ1MuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgY2xhc3MgQ2FsbGJhY2tGdXR1cmU8VD4gZXh0ZW5kcyBDb21wbGV0ZWRGdXR1cmU8VD4gaW1wbGVtZW50cyBSZXNwb25zZTxUPiB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDYWxsYmFja0Z1dHVyZShUIHYsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih2LCB0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENvbnRleHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2VJbXBsLnRoaXMuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhbmRsZXIuaGFuZGxlUmVzcG9uc2UobmV3IENhbGxiYWNrRnV0dXJlPFQ+KHYsIHQpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0RXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBlci5zZXRFeGNlcHRpb24odCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5zZXQodik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUmVzcG9uc2VDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VDb250ZXh0KFJlc3BvbnNlQ29udGV4dCByYykgeworICAgICAgICByZXNwb25zZUNvbnRleHQgPSByYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvU0NBbm5vdGF0aW9ucy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1NDQW5ub3RhdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZiZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1NDQW5ub3RhdGlvbnMuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5KQVhXU1V0aWxzOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRzIHBhcnNlZCB7QGxpbmsgV2ViU2VydmljZUNsaWVudH0gYW5kIHtAbGluayBXZWJFbmRwb2ludH0KKyAqIGFubm90YXRpb25zIG9uIGEge0BsaW5rIFNlcnZpY2V9LWRlcml2ZWQgY2xhc3MuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitmaW5hbCBjbGFzcyBTQ0Fubm90YXRpb25zIHsKKyAgICBTQ0Fubm90YXRpb25zKGZpbmFsIENsYXNzPD8+IHNjKSB7CisgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFZvaWQ+KCkgeworICAgICAgICAgICAgcHVibGljIFZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NjID1zYy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VDbGllbnQuY2xhc3MpOworICAgICAgICAgICAgICAgIGlmKHdzYz09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlNlcnZpY2UgSW50ZXJmYWNlIEFubm90YXRpb25zIHJlcXVpcmVkLCBleGl0aW5nLi4uIik7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHdzYy5uYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRucyA9IHdzYy50YXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUodG5zLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBKQVhXU1V0aWxzLmdldEZpbGVPclVSTCh3c2Mud3NkbExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVwb3J0IGEgcmVhc29uYWJsZSBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IHNjLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgICAgIFdlYkVuZHBvaW50IHdlYkVuZHBvaW50ID0gbWV0aG9kLmdldEFubm90YXRpb24oV2ViRW5kcG9pbnQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAod2ViRW5kcG9pbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50TmFtZSA9IHdlYkVuZHBvaW50Lm5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZSh0bnMsIGVuZHBvaW50TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0UU5hbWVzLmFkZChwb3J0UU5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHNlaUNsYXp6ID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlaUNsYXp6IT12b2lkLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChzZWlDbGF6eik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgUU5hbWUgc2VydmljZVFOYW1lOworICAgIGZpbmFsIEFycmF5TGlzdDxRTmFtZT4gcG9ydFFOYW1lcyA9IG5ldyBBcnJheUxpc3Q8UU5hbWU+KCk7CisgICAgZmluYWwgQXJyYXlMaXN0PENsYXNzPiBjbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKKyAgICBVUkwgd3NkbExvY2F0aW9uOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1NFSVBvcnRJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvU0VJUG9ydEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg0ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1NFSVBvcnRJbmZvLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQ7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuU09BUEJpbmRpbmdJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlNPQVBTRUlNb2RlbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKKworCisvKioKKyAqIHtAbGluayBQb3J0SW5mb30gdGhhdCBoYXMge0BsaW5rIFNFSU1vZGVsfS4KKyAqCisgKiBUaGlzIG9iamVjdCBpcyBjcmVhdGVkIHN0YXRpY2FsbHkgd2hlbiB7QGxpbmsgV1NTZXJ2aWNlRGVsZWdhdGV9IGlzIGNyZWF0ZWQKKyAqIHdpdGggYW4gc2VydmljZSBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitmaW5hbCBjbGFzcyBTRUlQb3J0SW5mbyBleHRlbmRzIFBvcnRJbmZvIHsKKyAgICBwdWJsaWMgZmluYWwgQ2xhc3Mgc2VpOworICAgIC8qKgorICAgICAqIE1vZGVsIG9mIHtAbGluayAjc2VpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU09BUFNFSU1vZGVsIG1vZGVsOworCisgICAgcHVibGljIFNFSVBvcnRJbmZvKFdTU2VydmljZURlbGVnYXRlIG93bmVyLCBDbGFzcyBzZWksIFNPQVBTRUlNb2RlbCBtb2RlbCwgQE5vdE51bGwgV1NETFBvcnQgcG9ydE1vZGVsKSB7CisgICAgICAgIHN1cGVyKG93bmVyLHBvcnRNb2RlbCk7CisgICAgICAgIHRoaXMuc2VpID0gc2VpOworICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7CisgICAgICAgIGFzc2VydCBzZWkhPW51bGwgJiYgbW9kZWwhPW51bGw7CisgICAgfQorCisgICAgcHVibGljIEJpbmRpbmdJbXBsIGNyZWF0ZUJpbmRpbmcoV2ViU2VydmljZUZlYXR1cmVbXSB3ZWJTZXJ2aWNlRmVhdHVyZXMsIENsYXNzPD8+IHBvcnRJbnRlcmZhY2UpIHsKKyAgICAgICAgIEJpbmRpbmdJbXBsIGJpbmRpbmdJbXBsID0gc3VwZXIuY3JlYXRlQmluZGluZyh3ZWJTZXJ2aWNlRmVhdHVyZXMscG9ydEludGVyZmFjZSk7CisgICAgICAgICBpZihiaW5kaW5nSW1wbCBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nSW1wbCkgeworICAgICAgICAgICAgKChTT0FQQmluZGluZ0ltcGwpYmluZGluZ0ltcGwpLnNldFBvcnRLbm93bkhlYWRlcnMobW9kZWwuZ2V0S25vd25IZWFkZXJzKCkpOworICAgICAgICAgfQorICAgICAgICAgLy9Ob3QgbmVlZGVkIGFzIHNldCBhYm92ZSBpbiBzdXBlci5jcmVhdGVCaW5kaW5nKCkgY2FsbAorICAgICAgICAgLy9iaW5kaW5nSW1wbC5zZXRGZWF0dXJlcyh3ZWJTZXJ2aWNlRmVhdHVyZXMpOworICAgICAgICAgcmV0dXJuIGJpbmRpbmdJbXBsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9TZW5kZXJFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9TZW5kZXJFeGNlcHRpb24uamF2YQppbmRleCBmNzEyMzQ0Li5iN2ZiZGI5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvU2VuZGVyRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1NlbmRlckV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICAgICAgc3VwZXIoInNlbmRlci5uZXN0ZWRFcnJvciIsIGFyZyk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICByZXR1cm4gImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5zZW5kZXIiOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9TZXJ2aWNlQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1NlcnZpY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YzZkZGIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1NlcnZpY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXJJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwuV1NETENvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLQotLyoqCi0gKiAkYXV0aG9yOiBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBXU0RMQ29udGV4dCB3c2RsQ29udGV4dDsgLy9mcm9tIHdzZGxQYXJzaW5nCi0KLSAgICBwcml2YXRlIENsYXNzIHNlcnZpY2VDbGFzczsKLSAgICBwcml2YXRlIEhhbmRsZXJSZXNvbHZlckltcGwgaGFuZGxlclJlc29sdmVyOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWU7IC8vc3VwcGxpZWQgb24gY3JlYXRpb24gb2Ygc2VydmljZQotICAgIHByaXZhdGUgZmluYWwgSGFzaFNldDxFbmRwb2ludElGQ29udGV4dD4gc2VpQ29udGV4dCA9IG5ldyBIYXNoU2V0PEVuZHBvaW50SUZDb250ZXh0PigpOwotICAgIC8qKgotICAgICAqIFRvIGJlIHVzZWQgdG8gcmVzb2x2ZSBXU0RMIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyOwotICAgIHByaXZhdGUgSGFzaE1hcDxRTmFtZSxTZXQ8U3RyaW5nPj4gcm9sZXNNYXAgPSBuZXcgSGFzaE1hcDxRTmFtZSxTZXQ8U3RyaW5nPj4oKTsKLSAgICBwdWJsaWMgU2VydmljZUNvbnRleHQoRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHsKLSAgICAgICAgdGhpcy5lbnRpdHlSZXNvbHZlciA9IGVudGl0eVJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlQ29udGV4dChDbGFzcyBzZXJ2aWNlQ2xhc3MsIFFOYW1lIHNlcnZpY2VOYW1lLCBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikgewotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzczsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLmVudGl0eVJlc29sdmVyID0gZW50aXR5UmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFdTRExDb250ZXh0IGdldFdzZGxDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gd3NkbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbENvbnRleHQoV1NETENvbnRleHQgd3NkbENvbnRleHQpIHsKLSAgICAgICAgdGhpcy53c2RsQ29udGV4dCA9IHdzZGxDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBIYW5kbGVyUmVzb2x2ZXJJbXBsIGdldEhhbmRsZXJSZXNvbHZlcigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyUmVzb2x2ZXIoSGFuZGxlclJlc29sdmVySW1wbCByZXNvbHZlcikgewotICAgICAgICB0aGlzLmhhbmRsZXJSZXNvbHZlciA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRSb2xlcyhRTmFtZSBwb3J0TmFtZSkgewotICAgICAgICByZXR1cm4gcm9sZXNNYXAuZ2V0KHBvcnROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlcyhRTmFtZSBwb3J0TmFtZSxTZXQ8U3RyaW5nPiByb2xlcykgewotICAgICAgICByb2xlc01hcC5wdXQocG9ydE5hbWUscm9sZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludElGQ29udGV4dCBnZXRFbmRwb2ludElGQ29udGV4dChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGZvciAoRW5kcG9pbnRJRkNvbnRleHQgZWlmOiBzZWlDb250ZXh0KXsKLSAgICAgICAgICAgIGlmIChlaWYuZ2V0U2VpKCkuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKXsKLSAgICAgICAgICAgICAgICAvL3RoaXMgaXMgdGhlIG9uZQotICAgICAgICAgICAgICAgIHJldHVybiBlaWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2hTZXQ8RW5kcG9pbnRJRkNvbnRleHQ+IGdldEVuZHBvaW50SUZDb250ZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIHNlaUNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVuZHBvaW50SUZDb250ZXh0KEVuZHBvaW50SUZDb250ZXh0IGVpZkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5zZWlDb250ZXh0LmFkZChlaWZDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgYWRkRW5kcG9pbnRJRkNvbnRleHQoTGlzdDxFbmRwb2ludElGQ29udGV4dD4gZWlmQ29udGV4dHMpIHsKLSAgICAgICAgdGhpcy5zZWlDb250ZXh0LmFkZEFsbChlaWZDb250ZXh0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldFNlcnZpY2VDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2xhc3MoQ2xhc3Mgc2VydmljZUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh3c2RsQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VydmljZU5hbWUod3NkbENvbnRleHQuZ2V0Rmlyc3RTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgYXNzZXJ0KHNlcnZpY2VOYW1lICE9IG51bGwpOwotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgewotICAgICAgICByZXR1cm4gZW50aXR5UmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJTZXJ2aWNlQ29udGV4dHsiICsKLSAgICAgICAgICAgICJ3c2RsQ29udGV4dD0iICsgd3NkbENvbnRleHQgKwotICAgICAgICAgICAgIiwgaGFuZGxlUmVzb2x2ZXI9IiArIGhhbmRsZXJSZXNvbHZlciArCi0gICAgICAgICAgICAiLCBzZXJ2aWNlQ2xhc3M9IiArIHNlcnZpY2VDbGFzcyArCi0gICAgICAgICAgICAiLCBzZXJ2aWNlTmFtZT0iICsgc2VydmljZU5hbWUgKwotICAgICAgICAgICAgIiwgc2VpQ29udGV4dD0iICsgc2VpQ29udGV4dCArCi0gICAgICAgICAgICAiLCBlbnRpdHlSZXNvbHZlcj0iICsgZW50aXR5UmVzb2x2ZXIgKwotICAgICAgICAgICAgIn0iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9TZXJ2aWNlQ29udGV4dEJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9TZXJ2aWNlQ29udGV4dEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwNTBkYy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvU2VydmljZUNvbnRleHRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXJJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuUG9ydEluZm9JbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlJ1bnRpbWVNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbGVyLlJ1bnRpbWVNb2RlbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkhhbmRsZXJBbm5vdGF0aW9uSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkhhbmRsZXJBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSkFYV1NVdGlsczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLldTRExDb250ZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqICRhdXRob3I6IFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZpY2VDb250ZXh0QnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dEJ1aWxkZXIoKSB7Ci0gICAgfSAgLy8gbm8gaW5zdGFudGljYXRpb24gcGxlYXNlCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTZXJ2aWNlQ29udGV4dH0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlQ29udGV4dCBidWlsZChVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSwgZmluYWwgQ2xhc3Mgc2VydmljZSwgRW50aXR5UmVzb2x2ZXIgZXIpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBuZXcgU2VydmljZUNvbnRleHQoc2VydmljZSwgc2VydmljZU5hbWUsIGVyKTsKLQotICAgICAgICBpZiAod3NkbExvY2F0aW9uICE9IG51bGwpewotICAgICAgICAgICAgV1NETENvbnRleHQgd3NDdHggPSBuZXcgV1NETENvbnRleHQod3NkbExvY2F0aW9uLCBlcik7Ci0KLSAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIHNlcnZpY2VOYW1lIGlzIGEgdmFsaWQgb25lLCBpZiBpdHMgbm90IGluIHRoZSBnaXZlbiBXU0RMIGZhaWwKLSAgICAgICAgICAgIGlmKCF3c0N0eC5jb250YWlucyhzZXJ2aWNlTmFtZSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudENvbmZpZ3VyYXRpb25FeGNlcHRpb24oInNlcnZpY2UuaW52YWxpZFNlcnZpY2VOYW1lIiwgc2VydmljZU5hbWUsIHdzZGxMb2NhdGlvbik7Ci0KLSAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0LnNldFdzZGxDb250ZXh0KHdzQ3R4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaWYgQEhhbmRsZXJDaGFpbiBwcmVzZW50LCBzZXQgSGFuZGxlclJlc29sdmVyIG9uIHNlcnZpY2UgY29udGV4dAotICAgICAgICBIYW5kbGVyQ2hhaW4gaGFuZGxlckNoYWluID0gKEhhbmRsZXJDaGFpbikKLSAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXRBbm5vdGF0aW9uKEhhbmRsZXJDaGFpbi5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpZihoYW5kbGVyQ2hhaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgSGFuZGxlclJlc29sdmVySW1wbCBocmVzb2x2ZXIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRIYW5kbGVyUmVzb2x2ZXIoaHJlc29sdmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbXBsZXRlU2VydmljZUNvbnRleHQoUU5hbWUgcG9ydE5hbWUsIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0LCBDbGFzcyBwb3J0SW50ZXJmYWNlKSB7Ci0gICAgICAgIGlmIChwb3J0SW50ZXJmYWNlICE9IG51bGwpCi0gICAgICAgICAgICBwcm9jZXNzQW5ub3RhdGlvbnMocG9ydE5hbWUsIHNlcnZpY2VDb250ZXh0LCBwb3J0SW50ZXJmYWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NBbm5vdGF0aW9ucyhRTmFtZSBwb3J0TmFtZSwgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQsIENsYXNzIHBvcnRJbnRlcmZhY2UpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgV1NETENvbnRleHQgd3NkbENvbnRleHQgPSBzZXJ2aWNlQ29udGV4dC5nZXRXc2RsQ29udGV4dCgpOwotICAgICAgICBFbmRwb2ludElGQ29udGV4dCBlaWZjID0gc2VydmljZUNvbnRleHQuZ2V0RW5kcG9pbnRJRkNvbnRleHQocG9ydEludGVyZmFjZS5nZXROYW1lKCkpOwotICAgICAgICBpZiAoKGVpZmMgIT0gbnVsbCkgJiYgKGVpZmMuZ2V0UnVudGltZUNvbnRleHQoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlaWZjID09IG51bGwpIHsKLSAgICAgICAgICAgIGVpZmMgPSBuZXcgRW5kcG9pbnRJRkNvbnRleHQocG9ydEludGVyZmFjZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5hZGRFbmRwb2ludElGQ29udGV4dChlaWZjKTsKLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIHNlcnZpY2VOYW1lID0gc2VydmljZUNvbnRleHQuZ2V0U2VydmljZU5hbWUoKTsKLQotICAgICAgICAvL2lmIHBvcnROYW1lIGlzIG51bGwgZ2V0IGl0IGZyb20gdGhlIFdTREwKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vZ2V0IHRoZSBmaXJzdCBwb3J0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNFSQotICAgICAgICAgICAgUU5hbWUgcG9ydFR5cGVOYW1lID0gUnVudGltZU1vZGVsZXIuZ2V0UG9ydFR5cGVOYW1lKHBvcnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgcG9ydE5hbWUgPSB3c2RsQ29udGV4dC5nZXRXc2RsRG9jdW1lbnQoKS5nZXRQb3J0TmFtZShzZXJ2aWNlQ29udGV4dC5nZXRTZXJ2aWNlTmFtZSgpLCBwb3J0VHlwZU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zdGlsbCBubyBwb3J0TmFtZSwgZmFpbAotICAgICAgICBpZihwb3J0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudENvbmZpZ3VyYXRpb25FeGNlcHRpb24oInNlcnZpY2Uubm9Qb3J0TmFtZSIsIHBvcnRJbnRlcmZhY2UuZ2V0TmFtZSgpLCB3c2RsQ29udGV4dC5nZXRXc2RsTG9jYXRpb24oKS50b1N0cmluZygpKTsKLQotICAgICAgICBlaWZjLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLSAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9IHdzZGxDb250ZXh0LmdldEJpbmRpbmdJRChzZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOwotICAgICAgICBSdW50aW1lTW9kZWxlciBtb2RlbGVyID0gbmV3IFJ1bnRpbWVNb2RlbGVyKHBvcnRJbnRlcmZhY2UsCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSwgYmluZGluZ0lkKTsKLSAgICAgICAgbW9kZWxlci5zZXRQb3J0TmFtZShwb3J0TmFtZSk7Ci0gICAgICAgIFJ1bnRpbWVNb2RlbCBtb2RlbCA9IG1vZGVsZXIuYnVpbGRSdW50aW1lTW9kZWwoKTsKLQotICAgICAgICBlaWZjLnNldFJ1bnRpbWVDb250ZXh0KG5ldyBSdW50aW1lQ29udGV4dChtb2RlbCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PENsYXNzPD8+PiBnZXRTRUkoZmluYWwgQ2xhc3Mgc2MpIHsKLQotICAgICAgICBpZiAoc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYSBzZXJ2aWNlCi0gICAgICAgIGlmICghU2VydmljZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNjKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oInNlcnZpY2UuaW50ZXJmYWNlLnJlcXVpcmVkIiArCi0gICAgICAgICAgICAgICAgc2MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M8Pz4+KCk7Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IHNjLmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHNlaUNsYXp6ID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzZWlDbGF6eiAhPSBudWxsKSAmJiAoIXNlaUNsYXp6LmVxdWFscygidm9pZCIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKHNlaUNsYXp6KTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIGNsYXNzZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvU3R1Yi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1N0dWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWM1MTYwCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1N0dWIuamF2YQpAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuQ2xvc2VhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETFByb3BlcnRpZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkVuZHBvaW50QWRkcmVzczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlckxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkVuZ2luZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5GaWJlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLkpBWFdTUHJvcGVydGllczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuV1NCaW5kaW5nUHJvdmlkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkNsaWVudE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuUG9vbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlBvb2wuVHViZVBvb2w7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5SdW50aW1lVmVyc2lvbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7CitpbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBzdHVicywgd2hpY2ggYWNjZXB0IG1ldGhvZCBpbnZvY2F0aW9ucyBmcm9tCisgKiBjbGllbnQgYXBwbGljYXRpb25zIGFuZCBwYXNzIHRoZSBtZXNzYWdlIHRvIGEge0BsaW5rIFR1YmV9CisgKiBmb3IgcHJvY2Vzc2luZy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbWFuYWdlbWVudCBvZiBwaXBlIGluc3RhbmNlcywKKyAqIGFuZCBtb3N0IG9mIHRoZSB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyfSBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0dWIgaW1wbGVtZW50cyBXU0JpbmRpbmdQcm92aWRlciwgUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXIsIENsb3NlYWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXVzZSBwaXBlbGluZXMgYXMgaXQncyBleHBlbnNpdmUgdG8gY3JlYXRlLgorICAgICAqIDxwPgorICAgICAqIFNldCB0byBudWxsIHdoZW4ge0BsaW5rICNjbG9zZSgpIGNsb3NlZH0uCisgICAgICovCisgICAgcHJpdmF0ZSBQb29sPFR1YmU+IHR1YmVzOworCisgICAgcHJpdmF0ZSBmaW5hbCBFbmdpbmUgZW5naW5lOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBXU1NlcnZpY2VEZWxlZ2F0ZX0gb2JqZWN0IHRoYXQgb3ducyB1cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgV1NTZXJ2aWNlRGVsZWdhdGUgb3duZXI7CisKKyAgICAvKioKKyAgICAgKiBOb24tbnVsbCBpZiB0aGlzIHN0dWIgaXMgY29uZmlndXJlZCB0byB0YWxrIHRvIGFuIEVQUi4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHRoaXMgZmllbGQgaXMgbm9uLW51bGwsIGl0cyByZWZlcmVuY2UgcGFyYW1ldGVycyBhcmUgc2VudCBhcyBvdXQtYm91bmQgaGVhZGVycy4KKyAgICAgKiBUaGlzIGZpZWxkIGNhbiBiZSBudWxsIGV2ZW4gd2hlbiBhZGRyZXNzaW5nIGlzIGVuYWJsZWQsIGJ1dCBpZiB0aGUgYWRkcmVzc2luZyBpcworICAgICAqIG5vdCBlbmFibGVkLCB0aGlzIGZpZWxkIG11c3QgYmUgbnVsbC4KKyAgICAgKiA8cD4KKyAgICAgKiBVbmxpa2UgZW5kcG9pbnQgYWRkcmVzcywgd2UgYXJlIG5vdCBsZXR0aW5nIHVzZXJzIHRvIGNoYW5nZSB0aGUgRVBSLAorICAgICAqIGFzIGl0IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gc2VydmljZXMgYW5kIHNvIG9uIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIEBOdWxsYWJsZSBXU0VuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50UmVmZXJlbmNlOworCisgICAgcHJvdGVjdGVkIGZpbmFsIEJpbmRpbmdJbXBsIGJpbmRpbmc7CisKKyAgICAvKioKKyAgICAgKiByZXByZXNlbnRzIEFkZHJlc3NpbmdWZXJzaW9uIG9uIGJpbmRpbmcgaWYgZW5hYmxlZCwgb3RoZXJ3aXNlIG51bGw7CisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3NpbmdWZXJzaW9uIGFkZHJWZXJzaW9uOworCisgICAgcHVibGljIGZpbmFsIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0ID0gbmV3IFJlcXVlc3RDb250ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgUmVzcG9uc2VDb250ZXh0fSBmcm9tIHRoZSBsYXN0IHN5bmNocm9ub3VzIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQ7CisgICAgQE51bGxhYmxlIHByb3RlY3RlZCBmaW5hbCBXU0RMUG9ydCB3c2RsUG9ydDsKKworICAgIC8qKgorICAgICAqIHtAbGluayBIZWFkZXJ9cyB0byBiZSBhZGRlZCB0byBvdXRib3VuZCB7QGxpbmsgUGFja2V0fS4KKyAgICAgKiBUaGUgY29udGVudHMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBATnVsbGFibGUgcHJpdmF0ZSB2b2xhdGlsZSBIZWFkZXJbXSB1c2VyT3V0Ym91bmRIZWFkZXJzOworCisgICAgcHJpdmF0ZSBmaW5hbCBATnVsbGFibGUgV1NETFByb3BlcnRpZXMgd3NkbFByb3BlcnRpZXM7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWFzdGVyICAgICAgICAgICAgICAgICBUaGUgY3JlYXRlZCBzdHViIHdpbGwgc2VuZCBtZXNzYWdlcyB0byB0aGlzIHBpcGUuCisgICAgICogQHBhcmFtIGJpbmRpbmcgICAgICAgICAgICAgICAgQXMgYSB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyfSwgdGhpcyBvYmplY3Qgd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzIGJpbmRpbmcgZnJvbSB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyI2dldEJpbmRpbmcoKX0uCisgICAgICogQHBhcmFtIGRlZmF1bHRFbmRQb2ludEFkZHJlc3MgVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBtZXNzYWdlLiBUaGUgYWN0dWFsIGRlc3RpbmF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bGQgYmUgb3ZlcnJpZGRlbiBieSB7QGxpbmsgUmVxdWVzdENvbnRleHR9LgorICAgICAqIEBwYXJhbSBlcHIgICAgICAgICAgICAgICAgICAgIFRvIGNyZWF0ZSBhIHN0dWIgdGhhdCBzZW5kcyBvdXQgcmVmZXJlbmNlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhIHNwZWNpZmljIEVQUiwgZ2l2ZSB0aGF0IGluc3RhbmNlLiBPdGhlcndpc2UgbnVsbC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdHMgYWRkcmVzcyBmaWVsZCB3aWxsIG5vdCBiZSB1c2VkLCBhbmQgdGhhdCBzaG91bGQgYmUgZ2l2ZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZWx5IGFzIHRoZSA8dHQ+ZGVmYXVsdEVuZFBvaW50QWRkcmVzczwvdHQ+LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHViKFdTU2VydmljZURlbGVnYXRlIG93bmVyLCBUdWJlIG1hc3RlciwgQmluZGluZ0ltcGwgYmluZGluZywgV1NETFBvcnQgd3NkbFBvcnQsIEVuZHBvaW50QWRkcmVzcyBkZWZhdWx0RW5kUG9pbnRBZGRyZXNzLCBATnVsbGFibGUgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICB0aGlzLnR1YmVzID0gbmV3IFR1YmVQb29sKG1hc3Rlcik7CisgICAgICAgIHRoaXMud3NkbFBvcnQgPSB3c2RsUG9ydDsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKKyAgICAgICAgYWRkclZlcnNpb24gPSBiaW5kaW5nLmdldEFkZHJlc3NpbmdWZXJzaW9uKCk7CisgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIEVQUiwgRVBSJ3MgYWRkcmVzcyBzaG91bGQgYmUgdXNlZCBmb3IgaW52b2NhdGlvbiBpbnN0ZWFkIG9mIGRlZmF1bHQgYWRkcmVzcworICAgICAgICBpZihlcHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdENvbnRleHQuc2V0RW5kUG9pbnRBZGRyZXNzU3RyaW5nKGVwci5nZXRBZGRyZXNzKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0LnNldEVuZHBvaW50QWRkcmVzcyhkZWZhdWx0RW5kUG9pbnRBZGRyZXNzKTsKKyAgICAgICAgdGhpcy5lbmdpbmUgPSBuZXcgRW5naW5lKHRvU3RyaW5nKCkpOworICAgICAgICB0aGlzLmVuZHBvaW50UmVmZXJlbmNlID0gZXByOworICAgICAgICB3c2RsUHJvcGVydGllcyA9ICh3c2RsUG9ydD09bnVsbCkgPyBudWxsIDogbmV3IFdTRExQcm9wZXJ0aWVzKHdzZGxQb3J0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwb3J0IG5hbWUgdGhhdCB0aGlzIHN0dWIgaXMgY29uZmlndXJlZCB0byB0YWxrIHRvLgorICAgICAqIDxwPgorICAgICAqIFdoZW4ge0BsaW5rICN3c2RsUG9ydH0gaXMgbm9uLW51bGwsIHRoZSBwb3J0IG5hbWUgaXMgYWx3YXlzCisgICAgICogdGhlIHNhbWUgYXMge0BsaW5rIFdTRExQb3J0I2dldE5hbWUoKX0sIGJ1dCB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgYSBwb3J0IG5hbWUgZXZlbiBpZiBubyBXU0RMIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyBzdHViLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBATm90TnVsbCBRTmFtZSBnZXRQb3J0TmFtZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2VydmljZSBuYW1lIHRoYXQgdGhpcyBzdHViIGlzIGNvbmZpZ3VyZWQgdG8gdGFsayB0by4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHtAbGluayAjd3NkbFBvcnR9IGlzIG5vbi1udWxsLCB0aGUgc2VydmljZSBuYW1lIGlzIGFsd2F5cworICAgICAqIHRoZSBzYW1lIGFzIHRoZSBvbmUgdGhhdCdzIGluZmVycmVkIGZyb20ge0BsaW5rIFdTRExQb3J0I2dldE93bmVyKCl9LAorICAgICAqIGJ1dCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgcG9ydCBuYW1lIGV2ZW4gaWYgbm8gV1NETCBpcyBhdmFpbGFibGUgZm9yCisgICAgICogdGhpcyBzdHViLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBATm90TnVsbCBRTmFtZSBnZXRTZXJ2aWNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG93bmVyLmdldFNlcnZpY2VOYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIEV4ZWN1dG9yfSB0byBiZSB1c2VkIGZvciBhc3luY2hyb25vdXMgbWV0aG9kIGludm9jYXRpb25zLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgdmFsdWUgdGhpcyBtZXRob2QgcmV0dXJucyBtYXkgZGlmZmVyZW50IGZyb20gaW52b2NhdGlvbnMKKyAgICAgKiB0byBpbnZvY2F0aW9ucy4gVGhlIGNhbGxlciBtdXN0IG5vdCBjYWNoZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBFeGVjdXRvciBnZXRFeGVjdXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG93bmVyLmdldEV4ZWN1dG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzc2VzIGEgbWVzc2FnZSB0byBhIHBpcGUgZm9yIHByb2Nlc3NpbmcuCisgICAgICogPHA+CisgICAgICogVW5saWtlIHtAbGluayBUdWJlfSBpbnN0YW5jZXMsCisgICAgICogdGhpcyBtZXRob2QgaXMgdGhyZWFkLXNhZmUgYW5kIGNhbiBiZSBpbnZva2VkIGZyb20KKyAgICAgKiBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrZXQgICAgICAgICBUaGUgbWVzc2FnZSB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQgVGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dH0gd2hlbiB0aGlzIGludm9jYXRpb24gaXMgb3JpZ2luYWxseSBzY2hlZHVsZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBiZSB0aGUgc2FtZSBvYmplY3QgYXMge0BsaW5rICNyZXF1ZXN0Q29udGV4dH0gZm9yIHN5bmNocm9ub3VzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25zLCBidXQgZm9yIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucywgaXQgbmVlZHMgdG8gYmUgYSBzbmFwc2hvdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlZCBhdCB0aGUgcG9pbnQgb2YgaW52b2NhdGlvbiwgdG8gY29ycmVjdGx5IHNhdGlzZnkgdGhlIHNwZWMgcmVxdWlyZW1lbnQuCisgICAgICogQHBhcmFtIHJlY2VpdmVyICAgICAgIFJlY2VpdmVzIHRoZSB7QGxpbmsgUmVzcG9uc2VDb250ZXh0fS4gU2luY2UgdGhlIHNwZWMgcmVxdWlyZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgYXN5bmNocm9ub3VzIGludm9jYXRpb25zIG11c3Qgbm90IHVwZGF0ZSByZXNwb25zZSBjb250ZXh0LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIG1vZGUgb2YgaW52b2NhdGlvbiB0aGV5IGhhdmUgdG8gZ28gdG8gZGlmZmVyZW50IHBsYWNlcy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgU28gd2UgdGFrZSBhIHNldHRlciB0aGF0IGFic3RyYWN0cyB0aGF0IGF3YXkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFBhY2tldCBwcm9jZXNzKFBhY2tldCBwYWNrZXQsIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBSZXNwb25zZUNvbnRleHRSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICB7Ly8gZmlsbCBpbiBQYWNrZXQKKyAgICAgICAgICAgIHBhY2tldC5wcm94eSA9IHRoaXM7CisgICAgICAgICAgICBwYWNrZXQuaGFuZGxlckNvbmZpZyA9IGJpbmRpbmcuZ2V0SGFuZGxlckNvbmZpZygpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZmlsbChwYWNrZXQpOworICAgICAgICAgICAgaWYgKHdzZGxQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYWNrZXQuYWRkU2F0ZWxsaXRlKHdzZGxQcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRyVmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gcG9wdWxhdGUgcmVxdWVzdCBXUy1BZGRyZXNzaW5nIGhlYWRlcnMKKyAgICAgICAgICAgICAgICBIZWFkZXJMaXN0IGhlYWRlckxpc3QgPSBwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldEhlYWRlcnMoKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJMaXN0LmZpbGxSZXF1ZXN0QWRkcmVzc2luZ0hlYWRlcnMod3NkbFBvcnQsIGJpbmRpbmcsIHBhY2tldCk7CisKKworICAgICAgICAgICAgICAgIC8vIFNwZWMgaXMgbm90IGNsZWFyIG9uIGlmIFJlZmVyZW5jZVBhcmFtZXRlcnMgYXJlIHRvIGJlIGFkZGVkIHdoZW4gYWRkcmVzc2luZyBpcyBub3QgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAvLyBidXQgdGhlIEVQUiBoYXMgUmVmZXJlbmNlUGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGFwcHJvYWNoOiBBZGQgUmVmZXJlbmNlUGFyYW1ldGVycyBvbmx5IGlmIGFkZHJlc3NpbmcgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRSZWZlcmVuY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRSZWZlcmVuY2UuYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldEhlYWRlcnMoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRvIG1ha2UgaXQgbXVsdGktdGhyZWFkIHNhZmUgd2UgbmVlZCB0byBmaXJzdCBnZXQgYSBzdGFibGUgc25hcHNob3QKKyAgICAgICAgICAgIEhlYWRlcltdIGhsID0gdXNlck91dGJvdW5kSGVhZGVyczsKKyAgICAgICAgICAgIGlmKGhsIT1udWxsKQorICAgICAgICAgICAgICAgIHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0SGVhZGVycygpLmFkZEFsbChobCk7CisgICAgICAgIH0KKworCisgICAgICAgIFBvb2w8VHViZT4gcG9vbCA9IHR1YmVzOworICAgICAgICBpZiAocG9vbCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oImNsb3NlIG1ldGhvZCBoYXMgYWxyZWFkeSBiZWVuIGludm9rZWQiKTsgLy8gVE9ETzogaTE4bgorCisgICAgICAgIEZpYmVyIGZpYmVyID0gZW5naW5lLmNyZWF0ZUZpYmVyKCk7CisgICAgICAgIC8vIHRoZW4gc2VuZCBpdCBhd2F5IQorICAgICAgICBUdWJlIHR1YmUgPSBwb29sLnRha2UoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZpYmVyLnJ1blN5bmModHViZSwgcGFja2V0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHVzIHRvIGNhcHR1cmUgdGhlIHBhY2tldCBldmVuIHdoZW4gdGhlIGNhbGwgZmFpbGVkIHdpdGggYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgLy8gd2hlbiB0aGUgY2FsbCBmYWlscyB3aXRoIGFuIGV4Y2VwdGlvbiBpdCdzIG5vIGxvbmdlciBhICdyZXBseScgYnV0IGl0IG1heSBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIC8vIGFib3V0IHdoYXQgd2VudCB3cm9uZy4KKworICAgICAgICAgICAgLy8gbm90ZSB0aGF0IFBhY2tldCBjYW4gc3RpbGwgYmUgdXBkYXRlZCBhZnRlcgorICAgICAgICAgICAgLy8gUmVzcG9uc2VDb250ZXh0IGlzIGNyZWF0ZWQuCisgICAgICAgICAgICBQYWNrZXQgcmVwbHkgPSAoZmliZXIuZ2V0UGFja2V0KCkgPT0gbnVsbCkgPyBwYWNrZXQgOiBmaWJlci5nZXRQYWNrZXQoKTsKKyAgICAgICAgICAgIHJlY2VpdmVyLnNldFJlc3BvbnNlQ29udGV4dChuZXcgUmVzcG9uc2VDb250ZXh0KHJlcGx5KSk7CisKKyAgICAgICAgICAgIHBvb2wucmVjeWNsZSh0dWJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3NlcyBhIG1lc3NhZ2UgdGhyb3VnaCBhIHtAbGluayBUdWJlfWxpbmUgZm9yIHByb2Nlc3NpbmcuIFRoZSBwcm9jZXNzaW5nIGhhcHBlbnMKKyAgICAgKiBhc3luY2hyb25vdXNseSBhbmQgd2hlbiB0aGUgcmVzcG9uc2UgaXMgYXZhaWxhYmxlLCBGaWJlci5Db21wbGV0aW9uQ2FsbGJhY2sgaXMKKyAgICAgKiBjYWxsZWQuIFRoZSBwcm9jZXNzaW5nIGNvdWxkIGhhcHBlbiBvbiBtdWx0aXBsZSB0aHJlYWRzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVW5saWtlIHtAbGluayBUdWJlfSBpbnN0YW5jZXMsCisgICAgICogdGhpcyBtZXRob2QgaXMgdGhyZWFkLXNhZmUgYW5kIGNhbiBiZSBpbnZva2VkIGZyb20KKyAgICAgKiBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0ICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyCisgICAgICogQHBhcmFtIHJlcXVlc3RDb250ZXh0IFRoZSB7QGxpbmsgUmVxdWVzdENvbnRleHR9IHdoZW4gdGhpcyBpbnZvY2F0aW9uIGlzIG9yaWdpbmFsbHkgc2NoZWR1bGVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgdGhlIHNhbWUgb2JqZWN0IGFzIHtAbGluayAjcmVxdWVzdENvbnRleHR9IGZvciBzeW5jaHJvbm91cworICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9ucywgYnV0IGZvciBhc3luY2hyb25vdXMgaW52b2NhdGlvbnMsIGl0IG5lZWRzIHRvIGJlIGEgc25hcHNob3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZWQgYXQgdGhlIHBvaW50IG9mIGludm9jYXRpb24sIHRvIGNvcnJlY3RseSBzYXRpc2Z5IHRoZSBzcGVjIHJlcXVpcmVtZW50LgorICAgICAqIEBwYXJhbSBjb21wbGV0aW9uQ2FsbGJhY2sgT25jZSB0aGUgcHJvY2Vzc2luZyBpcyBkb25lLCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzQXN5bmMoUGFja2V0IHJlcXVlc3QsIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBGaWJlci5Db21wbGV0aW9uQ2FsbGJhY2sgY29tcGxldGlvbkNhbGxiYWNrKSB7CisgICAgICAgIC8vIGZpbGwgaW4gUGFja2V0CisgICAgICAgIHJlcXVlc3QucHJveHkgPSB0aGlzOworICAgICAgICByZXF1ZXN0LmhhbmRsZXJDb25maWcgPSBiaW5kaW5nLmdldEhhbmRsZXJDb25maWcoKTsKKyAgICAgICAgcmVxdWVzdENvbnRleHQuZmlsbChyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHdzZGxQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYWRkU2F0ZWxsaXRlKHdzZGxQcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQWRkcmVzc2luZ1ZlcnNpb24uaXNFbmFibGVkKGJpbmRpbmcpKSB7CisgICAgICAgICAgICBpZihlbmRwb2ludFJlZmVyZW5jZSE9bnVsbCkKKyAgICAgICAgICAgICAgICBlbmRwb2ludFJlZmVyZW5jZS5hZGRSZWZlcmVuY2VQYXJhbWV0ZXJzKHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmdldEhlYWRlcnMoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBQb29sPFR1YmU+IHBvb2wgPSB0dWJlczsKKyAgICAgICAgaWYgKHBvb2wgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJjbG9zZSBtZXRob2QgaGFzIGFscmVhZHkgYmVlbiBpbnZva2VkIik7IC8vIFRPRE86IGkxOG4KKworICAgICAgICBGaWJlciBmaWJlciA9IGVuZ2luZS5jcmVhdGVGaWJlcigpOworICAgICAgICAvLyB0aGVuIHNlbmQgaXQgYXdheSEKKyAgICAgICAgZmluYWwgVHViZSB0dWJlID0gcG9vbC50YWtlKCk7CisgICAgICAgIGZpYmVyLnN0YXJ0KHR1YmUsIHJlcXVlc3QsIG5ldyBGaWJlci5Db21wbGV0aW9uQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRpb24oQE5vdE51bGwgUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgcG9vbC5yZWN5Y2xlKHR1YmUpOworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25DYWxsYmFjay5vbkNvbXBsZXRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0aW9uKEBOb3ROdWxsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgICAgIC8vIGxldCdzIG5vdCByZXVzZSB0dWJlcyBhcyB0aGV5IG1pZ2h0IGJlIGluIGEgd3Jvbmcgc3RhdGUsIHNvIG5vdAorICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgcG9vbC5yZWN5Y2xlKCkKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uQ2FsbGJhY2sub25Db21wbGV0aW9uKGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmICh0dWJlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBtdWx0aS10aHJlYWQgc2FmZXR5IG9mICdjbG9zZScgbmVlZHMgdG8gYmUgY29uc2lkZXJlZCBtb3JlIGNhcmVmdWxseS4KKyAgICAgICAgICAgIC8vIHNvbWUgY2FsbHMgbWlnaHQgYmUgcGVuZGluZyB3aGlsZSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLiBTaG91bGQgd2UKKyAgICAgICAgICAgIC8vIGJsb2NrIHVudGlsIHRoZXkgYXJlIGNvbXBsZXRlLCBvciBzaG91bGQgd2UgYWJvcnQgdGhlbSAoYnV0IGhvdz8pCisgICAgICAgICAgICBUdWJlIHAgPSB0dWJlcy50YWtlKCk7CisgICAgICAgICAgICB0dWJlcyA9IG51bGw7CisgICAgICAgICAgICBwLnByZURlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBXU0JpbmRpbmcgZ2V0QmluZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmc7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UmVxdWVzdENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dC5nZXRNYXBWaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFJlc3BvbnNlQ29udGV4dCBnZXRSZXNwb25zZUNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VDb250ZXh0KFJlc3BvbnNlQ29udGV4dCByYykgeworICAgICAgICB0aGlzLnJlc3BvbnNlQ29udGV4dCA9IHJjOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBSdW50aW1lVmVyc2lvbi5WRVJTSU9OICsgIjogU3R1YiBmb3IgIiArIGdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgVzNDRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoKSB7CisgICAgICAgIGlmIChiaW5kaW5nLmdldEJpbmRpbmdJRCgpLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpKQorICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihDbGllbnRNZXNzYWdlcy5VTlNVUFBPUlRFRF9PUEVSQVRJT04oIkJpbmRpbmdQcm92aWRlci5nZXRFbmRwb2ludFJlZmVyZW5jZSgpIiwgIlhNTC9IVFRQIEJpbmRpbmciLCAiU09BUDExIG9yIFNPQVAxMiBCaW5kaW5nIikpOworICAgICAgICByZXR1cm4gZ2V0RW5kcG9pbnRSZWZlcmVuY2UoVzNDRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCA8VCBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPgorICAgIFQgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoQ2xhc3M8VD4gY2xhenopIHsKKworICAgICAgICBpZiAoYmluZGluZy5nZXRCaW5kaW5nSUQoKS5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oQ2xpZW50TWVzc2FnZXMuVU5TVVBQT1JURURfT1BFUkFUSU9OKCJCaW5kaW5nUHJvdmlkZXIuZ2V0RW5kcG9pbnRSZWZlcmVuY2UoQ2xhc3M8VD4gY2xhc3MpIiwgIlhNTC9IVFRQIEJpbmRpbmciLCAiU09BUDExIG9yIFNPQVAxMiBCaW5kaW5nIikpOworCisgICAgICAgIC8vIHdlIG5lZWQgdG8gZXhwYW5kIFdTRW5kcG9pbnRBZGRyZXNzIGNsYXNzIHRvIGJlIGFibGUgdG8gcmV0dXJuIEVQUiB3aXRoIGFyYml0cmFyeSBhZGRyZXNzLgorICAgICAgICBpZiAoZW5kcG9pbnRSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50UmVmZXJlbmNlLnRvU3BlYyhjbGF6eik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGVwckFkZHJlc3MgPSByZXF1ZXN0Q29udGV4dC5nZXRFbmRwb2ludEFkZHJlc3MoKS50b1N0cmluZygpOworICAgICAgICBRTmFtZSBwb3J0VHlwZU5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgd3NkbEFkZHJlc3MgPSBudWxsOworICAgICAgICBpZih3c2RsUG9ydCE9bnVsbCkgeworICAgICAgICAgICAgcG9ydFR5cGVOYW1lID0gd3NkbFBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlTmFtZSgpOworICAgICAgICAgICAgd3NkbEFkZHJlc3MgPSBlcHJBZGRyZXNzICsiP3dzZGwiOworICAgICAgICB9CisgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uIGF2ID0gQWRkcmVzc2luZ1ZlcnNpb24uZnJvbVNwZWNDbGFzcyhjbGF6eik7CisgICAgICAgIGlmIChhdiA9PSBBZGRyZXNzaW5nVmVyc2lvbi5XM0MpIHsKKyAgICAgICAgICAgIC8vIFN1cHJlc3Mgd3JpdGluZyBTZXJ2aWNlTmFtZSBhbmQgRW5kcG9pbnROYW1lIGluIFczQyBFUFIsCisgICAgICAgICAgICAvLyBVbnRpbCB0aGUgbnMgZm9yIHRob3NlIG1ldGFkYXRhIGVsZW1lbnRzIGlzIHJlc29sdmVkLgorICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0VuZHBvaW50UmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbi5XM0MsCisgICAgICAgICAgICAgICAgICAgIGVwckFkZHJlc3MsIG51bGwgLypnZXRTZXJ2aWNlTmFtZSgpKi8sIG51bGwvKmdldFBvcnROYW1lKCkqLywgbnVsbCAvKiBwb3J0VHlwZU5hbWUqLywgbnVsbCwgbnVsbCAvKndzZGxBZGRyZXNzKi8sIG51bGwpLnRvU3BlYyhjbGF6eik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFdTRW5kcG9pbnRSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgZXByQWRkcmVzcywgZ2V0U2VydmljZU5hbWUoKSwgZ2V0UG9ydE5hbWUoKSwgcG9ydFR5cGVOYW1lLCBudWxsLCB3c2RsQWRkcmVzcywgbnVsbCkudG9TcGVjKGNsYXp6KTsKKyAgICAgICAgfQorICAgIH0KKworLy8KKy8vCisvLyBXU0JpbmRpbmdQcm92aWRlciBtZXRob2RzCisvLworLy8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRPdXRib3VuZEhlYWRlcnMoTGlzdDxIZWFkZXI+IGhlYWRlcnMpIHsKKyAgICAgICAgaWYoaGVhZGVycz09bnVsbCkgeworICAgICAgICAgICAgdGhpcy51c2VyT3V0Ym91bmRIZWFkZXJzID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoSGVhZGVyIGggOiBoZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgaWYoaD09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNlck91dGJvdW5kSGVhZGVycyA9IGhlYWRlcnMudG9BcnJheShuZXcgSGVhZGVyW2hlYWRlcnMuc2l6ZSgpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRPdXRib3VuZEhlYWRlcnMoSGVhZGVyLi4uIGhlYWRlcnMpIHsKKyAgICAgICAgaWYoaGVhZGVycz09bnVsbCkgeworICAgICAgICAgICAgdGhpcy51c2VyT3V0Ym91bmRIZWFkZXJzID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoSGVhZGVyIGggOiBoZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgaWYoaD09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSGVhZGVyW10gaGwgPSBuZXcgSGVhZGVyW2hlYWRlcnMubGVuZ3RoXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaGVhZGVycywwLGhsLDAsaGVhZGVycy5sZW5ndGgpOworICAgICAgICAgICAgdXNlck91dGJvdW5kSGVhZGVycyA9IGhsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIExpc3Q8SGVhZGVyPiBnZXRJbmJvdW5kSGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKEhlYWRlckxpc3QpCisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0KEpBWFdTUHJvcGVydGllcy5JTkJPVU5EX0hFQURFUl9MSVNUX1BST1BFUlRZKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1dTRnV0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvV1NGdXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyZDMyMC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvV1NGdXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKLQotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlJlc3BvbnNlQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZhLnJtaS5zZXJ2ZXIuVUlEOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIFRoZSA8Y29kZT5SZXNwb25zZTwvY29kZT4gaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgdXNlZCB0byBvYnRhaW4gdGhlCi0gKiBwYXlsb2FkIGFuZCBjb250ZXh0IGEgbWVzc2FnZSBzZW50IGluIHJlc3BvbnNlIHRvIGFuIG9wZXJhdGlvbiBpbnZvY2F0aW9uLgotICogRm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaW52b2NhdGlvbnMgaXQgcHJvdmlkZXMgYWRkaXRpb25hbCBtZXRob2RzIHRvCi0gKiBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0LgotICoKLSAqIEBhdXRob3IgSkFYV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi0KLQotcHVibGljIGNsYXNzIFdTRnV0dXJlPFQ+IGV4dGVuZHMgRnV0dXJlVGFzazxUPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9Ci0gICAgICAgIExvZ2dlci5nZXRMb2dnZXIobmV3IFN0cmluZ0J1ZmZlcigpLmFwcGVuZChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluKS5hcHBlbmQoIi5jbGllbnQuZGlzcGF0Y2giKS50b1N0cmluZygpKTsKLQotICAgIHByaXZhdGUgTG9jayBfbG9jazsKLQotICAgIHB1YmxpYyBXU0Z1dHVyZShDYWxsYWJsZTxUPiBjYWxsYWJsZSkgewotICAgICAgICBzdXBlcihjYWxsYWJsZSk7Ci0gICAgICAgIF9sb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NGdXR1cmUoUnVubmFibGUgcnVuYWJsZSwgVCByZXN1bHQpIHsKLSAgICAgICAgc3VwZXIocnVuYWJsZSwgcmVzdWx0KTsKLSAgICAgICAgX2xvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9XU1NlcnZpY2VEZWxlZ2F0ZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1dTU2VydmljZURlbGVnYXRlLmphdmEKaW5kZXggNzcyYzYwNS4uZjlmMDM5MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1dTU2VydmljZURlbGVnYXRlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L1dTU2VydmljZURlbGVnYXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsMzYgKzIzLDU5IEBACiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KIAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSBZb3VyIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudDsKIAotaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54bWwuaW50ZXJuYWwucmVzb2x2ZXIudG9vbHMuQ2F0YWxvZ1Jlc29sdmVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guRGlzcGF0Y2hCYXNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuUG9ydEluZm9JbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlJ1bnRpbWVNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwuV1NETENvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuQmluZGluZzsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLkNsb3NlYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuQmluZGluZ0lEOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NTZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmNsaWVudC5TZXJ2aWNlSW50ZXJjZXB0b3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmNsaWVudC5TZXJ2aWNlSW50ZXJjZXB0b3JGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS4qOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQ29udGFpbmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQ29udGFpbmVyUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLldlYlNlcnZpY2VGZWF0dXJlTGlzdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuSGFuZGxlckNvbmZpZ3VyYXRvci5Bbm5vdGF0aW9uQ29uZmlndXJhdG9yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5IYW5kbGVyQ29uZmlndXJhdG9yLkhhbmRsZXJSZXNvbHZlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LnNlaS5TRUlTdHViOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5XU0JpbmRpbmdQcm92aWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5BYnN0cmFjdFNFSU1vZGVsSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5SdW50aW1lTW9kZWxlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5TT0FQU0VJTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMTW9kZWxJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETFBvcnRJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETFNlcnZpY2VJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5DbGllbnRNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuRGlzcGF0Y2hNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuUHJvdmlkZXJBcGlNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5TZXJ2aWNlRmluZGVyOworaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsLmNyZWF0ZURlZmF1bHRDYXRhbG9nUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuUnVudGltZVdTRExQYXJzZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwogCitpbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsKIGltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworaW1wb3J0IGphdmF4LnhtbC53cy4qOwogaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsKLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CkBAIC02MCw2ICs4Myw3IEBACiAKIC8qKgogICogPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0cyBwcm92aWRlIHRoZSBjbGllbnQgdmlldyBvZiBhIFdlYiBzZXJ2aWNlLgorICoKICAqIDxwPjxjb2RlPlNlcnZpY2U8L2NvZGU+IGFjdHMgYXMgYSBmYWN0b3J5IG9mIHRoZSBmb2xsb3dpbmc6CiAgKiA8dWw+CiAgKiA8bGk+UHJveGllcyBmb3IgYSB0YXJnZXQgc2VydmljZSBlbmRwb2ludC4KQEAgLTY3LDE1ICs5MSwxNSBAQAogICogZHluYW1pYyBtZXNzYWdlLW9yaWVudGVkIGludm9jYXRpb24gb2YgYSByZW1vdGUKICAqIG9wZXJhdGlvbi4KICAqIDwvbGk+Ci0gKiA8cC8+CisgKgogICogPHA+VGhlIHBvcnRzIGF2YWlsYWJsZSBvbiBhIHNlcnZpY2UgY2FuIGJlIGVudW1lcmF0ZWQgdXNpbmcgdGhlCiAgKiA8Y29kZT5nZXRQb3J0czwvY29kZT4gbWV0aG9kLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHBhc3MgYQogICogc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdG8gdGhlIHVuYXJ5IDxjb2RlPmdldFBvcnQ8L2NvZGU+IG1ldGhvZAogICogYW5kIGxldCB0aGUgcnVudGltZSBzZWxlY3QgYSBjb21wYXRpYmxlIHBvcnQuCi0gKiA8cC8+CisgKgogICogPHA+SGFuZGxlciBjaGFpbnMgZm9yIGFsbCB0aGUgb2JqZWN0cyBjcmVhdGVkIGJ5IGEgPGNvZGU+U2VydmljZTwvY29kZT4KICAqIGNhbiBiZSBzZXQgYnkgbWVhbnMgb2YgdGhlIHByb3ZpZGVkIDxjb2RlPkhhbmRsZXJSZWdpc3RyeTwvY29kZT4uCi0gKiA8cC8+CisgKgogICogPHA+QW4gPGNvZGU+RXhlY3V0b3I8L2NvZGU+IG1heSBiZSBzZXQgb24gdGhlIHNlcnZpY2UgaW4gb3JkZXIKICAqIHRvIGdhaW4gYmV0dGVyIGNvbnRyb2wgb3ZlciB0aGUgdGhyZWFkcyB1c2VkIHRvIGRpc3BhdGNoIGFzeW5jaHJvbm91cwogICogY2FsbGJhY2tzLiBGb3IgaW5zdGFuY2UsIHRocmVhZCBwb29saW5nIHdpdGggY2VydGFpbiBwYXJhbWV0ZXJzCkBAIC04Myw3OSArMTA3LDE0NiBAQAogICogcmVnaXN0ZXJpbmcgaXQgd2l0aCB0aGUgc2VydmljZS4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKKyAqIEBzZWUgRXhlY3V0b3IKICAqIEBzaW5jZSBKQVgtV1MgMi4wCiAgKi8KLXB1YmxpYyBjbGFzcyBXU1NlcnZpY2VEZWxlZ2F0ZSBleHRlbmRzIFNlcnZpY2VEZWxlZ2F0ZSB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHRVQgPSAiZ2V0IjsKLQotICAgIHByb3RlY3RlZCBIYXNoU2V0PFFOYW1lPiBwb3J0czsKLQotICAgIHByb3RlY3RlZCBIYXNoTWFwPFFOYW1lLCBQb3J0SW5mb0Jhc2U+IGRpc3BhdGNoUG9ydHM7Ci0gICAgcHJvdGVjdGVkIEhhbmRsZXJSZXNvbHZlciBoYW5kbGVyUmVzb2x2ZXI7Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHNlcnZpY2VQcm94eTsKLSAgICBwcm90ZWN0ZWQgVVJMIHdzZGxMb2NhdGlvbjsKLSAgICBwcm90ZWN0ZWQgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIEV4ZWN1dG9yIGV4ZWN1dG9yOwotICAgIHByaXZhdGUgSGFzaFNldDxPYmplY3Q+IHNlaVByb3hpZXM7CitwdWJsaWMgY2xhc3MgV1NTZXJ2aWNlRGVsZWdhdGUgZXh0ZW5kcyBXU1NlcnZpY2UgeworICAgIC8qKgorICAgICAqIEFsbCBwb3J0cy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGluY2x1ZGVzIHBvcnRzIHN0YXRpY2FsbHkga25vd24gdG8gV1NETCwgYXMgd2VsbCBhcworICAgICAqIG9uZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgYWRkZWQKKyAgICAgKiB0aHJvdWdoIHtAbGluayAjYWRkUG9ydChRTmFtZSwgU3RyaW5nLCBTdHJpbmcpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3Igc3RhdGljYWxseSBrbm93biBwb3J0cyB3ZSdsbCBoYXZlIHtAbGluayBTRUlQb3J0SW5mb30uCisgICAgICogRm9yIGR5bmFtaWNhbGx5IGFkZGVkIG9uZXMgd2UnbGwgaGF2ZSB7QGxpbmsgUG9ydEluZm99LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPFFOYW1lLCBQb3J0SW5mbz4gcG9ydHMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgUG9ydEluZm8+KCk7CiAKICAgICAvKioKLSAgICAgKiB7QGxpbmsgQ2F0YWxvZ1Jlc29sdmVyfSB0byBjaGVjayBNRVRBLUlORi9qYXgtd3MtY2F0YWxvZy54bWwuCi0gICAgICogTGF6aWx5IGNyZWF0ZWQuCisgICAgICogV2hlbmV2ZXIgd2UgY3JlYXRlIHtAbGluayBCaW5kaW5nUHJvdmlkZXJ9LCB3ZSB1c2UgdGhpcyB0byBjb25maWd1cmUgaGFuZGxlcnMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcjsKKyAgICBwcml2YXRlIEBOb3ROdWxsIEhhbmRsZXJDb25maWd1cmF0b3IgaGFuZGxlckNvbmZpZ3VyYXRvciA9IG5ldyBIYW5kbGVyUmVzb2x2ZXJJbXBsKG51bGwpOworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgU2VydmljZT4gc2VydmljZUNsYXNzOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgc2VydmljZSBmb3Igd2hpY2ggdGhpcyB7QGxpbmsgV1NTZXJ2aWNlRGVsZWdhdGV9IGlzIGNyZWF0ZWQgZm9yLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQE5vdE51bGwgUU5hbWUgc2VydmljZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBTRUksIGtleWVkIGJ5IHRoZWlyIGludGVyZmFjZSB0eXBlLgorICAgICAqLworICAgLy8gcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3MsU0VJUG9ydEluZm8+IHNlaUNvbnRleHQgPSBuZXcgSGFzaE1hcDxDbGFzcyxTRUlQb3J0SW5mbz4oKTsKKyAgIHByaXZhdGUgZmluYWwgTWFwPFFOYW1lLFNFSVBvcnRJbmZvPiBzZWlDb250ZXh0ID0gbmV3IEhhc2hNYXA8UU5hbWUsU0VJUG9ydEluZm8+KCk7CisgICAgcHJpdmF0ZSBFeGVjdXRvciBleGVjdXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBXU0RMIHNlcnZpY2UgdGhhdCB0aGlzIHtAbGluayBTZXJ2aWNlfSBvYmplY3QgcmVwcmVzZW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGZpZWxkIGlzIG51bGwgaWZmIG5vIFdTREwgaXMgZ2l2ZW4gdG8ge0BsaW5rIFNlcnZpY2V9LgorICAgICAqIFRoaXMgZmllbHMgY2FuIGJlIGJlIG51bGwgaWYgdGhlIHNlcnZpY2UgaXMgY3JlYXRlZCB3aXRob3V0IHdzZGwgYnV0IGxhdGVyCisgICAgICogdGhlIGVwciBzdXBwbGllcyBhIHdzZGwgdGhhdCBjYW4gYmUgcGFyc2VkLgorICAgICAqLworICAgIHByaXZhdGUgIEBOdWxsYWJsZSBXU0RMU2VydmljZUltcGwgd3NkbFNlcnZpY2U7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRhaW5lciBjb250YWluZXI7CisgICAgLyoqCisgICAgICogTXVsdGlwbGUge0BsaW5rIFNlcnZpY2VJbnRlcmNlcHRvcn1zIGFyZSBhZ2dyZWdhdGVkIGludG8gb25lLgorICAgICAqLworICAgIC8qcGFja2FnZSovIGZpbmFsIEBOb3ROdWxsIFNlcnZpY2VJbnRlcmNlcHRvciBzZXJ2aWNlSW50ZXJjZXB0b3I7CiAKIAotICAgIHB1YmxpYyBXU1NlcnZpY2VEZWxlZ2F0ZShTZXJ2aWNlQ29udGV4dCBzY29udGV4dCkgewotICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IHNjb250ZXh0OwotICAgICAgICB0aGlzLmRpc3BhdGNoUG9ydHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBzZWlQcm94aWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0LmdldEhhbmRsZXJSZXNvbHZlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXJSZXNvbHZlciA9IHNlcnZpY2VDb250ZXh0LmdldEhhbmRsZXJSZXNvbHZlcigpOwotICAgICAgICB9CisgICAgcHVibGljIFdTU2VydmljZURlbGVnYXRlKFVSTCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUsIENsYXNzPD8gZXh0ZW5kcyBTZXJ2aWNlPiBzZXJ2aWNlQ2xhc3MpIHsKKyAgICAgICAgdGhpcygKKyAgICAgICAgICAgIHdzZGxEb2N1bWVudExvY2F0aW9uPT1udWxsID8gbnVsbCA6IG5ldyBTdHJlYW1Tb3VyY2Uod3NkbERvY3VtZW50TG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSksCisgICAgICAgICAgICBzZXJ2aWNlTmFtZSxzZXJ2aWNlQ2xhc3MpOwogICAgIH0KIAotICAgIHB1YmxpYyBXU1NlcnZpY2VEZWxlZ2F0ZShVUkwgd3NkbERvY3VtZW50TG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lLCBDbGFzcyBzZXJ2aWNlQ2xhc3MpIHsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzCisgICAgICogICAgICBFaXRoZXIge0BsaW5rIFNlcnZpY2V9LmNsYXNzIG9yIG90aGVyIGdlbmVyYXRlZCBzZXJ2aWNlLWRlcml2ZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgV1NTZXJ2aWNlRGVsZWdhdGUoQE51bGxhYmxlIFNvdXJjZSB3c2RsLCBATm90TnVsbCBRTmFtZSBzZXJ2aWNlTmFtZSwgQE5vdE51bGwgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFNlcnZpY2U+IHNlcnZpY2VDbGFzcykgewogICAgICAgICAvL3dlIGNhbnQgY3JlYXRlIGEgU2VydmljZSB3aXRob3V0IHNlcnZpY2VOYW1lCiAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudENvbmZpZ3VyYXRpb25FeGNlcHRpb24oInNlcnZpY2Uubm9TZXJ2aWNlTmFtZSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQ2xpZW50TWVzc2FnZXMuSU5WQUxJRF9TRVJWSUNFX05BTUVfTlVMTChzZXJ2aWNlTmFtZSkpOworICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIHRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IENvbnRhaW5lclJlc29sdmVyLmdldEluc3RhbmNlKCkuZ2V0Q29udGFpbmVyKCk7CiAKLSAgICAgICAgdGhpcy5kaXNwYXRjaFBvcnRzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgc2VpUHJveGllcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIC8vIGxvYWQgaW50ZXJjZXB0b3IKKyAgICAgICAgU2VydmljZUludGVyY2VwdG9yIGludGVyY2VwdG9yID0gU2VydmljZUludGVyY2VwdG9yRmFjdG9yeS5sb2FkKHRoaXMsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgICAgICBTZXJ2aWNlSW50ZXJjZXB0b3Igc2kgPSBjb250YWluZXIuZ2V0U1BJKFNlcnZpY2VJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIGlmIChzaSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlcmNlcHRvciA9IFNlcnZpY2VJbnRlcmNlcHRvci5hZ2dyZWdhdGUoaW50ZXJjZXB0b3IsIHNpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNlcnZpY2VJbnRlcmNlcHRvciA9IGludGVyY2VwdG9yOwogCi0gICAgICAgIHNlcnZpY2VDb250ZXh0ID0gU2VydmljZUNvbnRleHRCdWlsZGVyLmJ1aWxkKHdzZGxEb2N1bWVudExvY2F0aW9uLCBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgIHNlcnZpY2VDbGFzcywgWG1sVXRpbC5jcmVhdGVEZWZhdWx0Q2F0YWxvZ1Jlc29sdmVyKCkpOwogCi0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dC5nZXRIYW5kbGVyUmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyUmVzb2x2ZXIgPSBzZXJ2aWNlQ29udGV4dC5nZXRIYW5kbGVyUmVzb2x2ZXIoKTsKKyAgICAgICAgV1NETFNlcnZpY2VJbXBsIHNlcnZpY2U9bnVsbDsKKyAgICAgICAgaWYgKHdzZGwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVUkwgdXJsID0gd3NkbC5nZXRTeXN0ZW1JZCgpPT1udWxsID8gbnVsbCA6IG5ldyBVUkwod3NkbC5nZXRTeXN0ZW1JZCgpKTsKKyAgICAgICAgICAgICAgICBXU0RMTW9kZWxJbXBsIG1vZGVsID0gcGFyc2VXU0RMKHVybCwgd3NkbCk7CisgICAgICAgICAgICAgICAgc2VydmljZSA9IG1vZGVsLmdldFNlcnZpY2UodGhpcy5zZXJ2aWNlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRNZXNzYWdlcy5JTlZBTElEX1NFUlZJQ0VfTkFNRSh0aGlzLnNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkTmFtZUxpc3QobW9kZWwuZ2V0U2VydmljZXMoKS5rZXlTZXQoKSkpKTsKKyAgICAgICAgICAgICAgICAvLyBmaWxsIGluIHN0YXRpY2FsbHkga25vd24gcG9ydHMKKyAgICAgICAgICAgICAgICBmb3IgKFdTRExQb3J0SW1wbCBwb3J0IDogc2VydmljZS5nZXRQb3J0cygpKQorICAgICAgICAgICAgICAgICAgICBwb3J0cy5wdXQocG9ydC5nZXROYW1lKCksIG5ldyBQb3J0SW5mbyh0aGlzLCBwb3J0KSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKENsaWVudE1lc3NhZ2VzLklOVkFMSURfV1NETF9VUkwod3NkbC5nZXRTeXN0ZW1JZCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhpcy53c2RsU2VydmljZSA9IHNlcnZpY2U7CisKKyAgICAgICAgaWYgKHNlcnZpY2VDbGFzcyAhPSBTZXJ2aWNlLmNsYXNzKSB7CisgICAgICAgICAgICAvL2lmIEBIYW5kbGVyQ2hhaW4gcHJlc2VudCwgc2V0IEhhbmRsZXJSZXNvbHZlciBvbiBzZXJ2aWNlIGNvbnRleHQKKyAgICAgICAgICAgIEhhbmRsZXJDaGFpbiBoYW5kbGVyQ2hhaW4gPQorICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxIYW5kbGVyQ2hhaW4+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEhhbmRsZXJDaGFpbiBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VDbGFzcy5nZXRBbm5vdGF0aW9uKEhhbmRsZXJDaGFpbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGhhbmRsZXJDb25maWd1cmF0b3IgPSBuZXcgQW5ub3RhdGlvbkNvbmZpZ3VyYXRvcih0aGlzKTsKICAgICAgICAgfQogCi0gICAgICAgIHBvcHVsYXRlUG9ydHMoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NlcnZpY2VDb250ZXh0KFFOYW1lIHBvcnROYW1lLCBDbGFzcyBwb3J0SW50ZXJmYWNlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0QnVpbGRlci5jb21wbGV0ZVNlcnZpY2VDb250ZXh0KHBvcnROYW1lLCBzZXJ2aWNlQ29udGV4dCwgcG9ydEludGVyZmFjZSk7CisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBXU0RMIGFuZCBidWlsZHMge0BsaW5rIFdTRExNb2RlbH0uCisgICAgICogQHBhcmFtIHdzZGxEb2N1bWVudExvY2F0aW9uCisgICAgICogICAgICBFaXRoZXIgdGhpcyBvciA8dHQ+d3NkbDwvdHQ+IHBhcmFtZXRlciBtdXN0IGJlIGdpdmVuLgorICAgICAqICAgICAgTnVsbCBsb2NhdGlvbiBtZWFucyB0aGUgc3lzdGVtIHdvbid0IGJlIGFibGUgdG8gcmVzb2x2ZSByZWxhdGl2ZSByZWZlcmVuY2VzIGluIHRoZSBXU0RMLAorICAgICAqLworICAgIHByaXZhdGUgV1NETE1vZGVsSW1wbCBwYXJzZVdTREwoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBTb3VyY2Ugd3NkbFNvdXJjZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFJ1bnRpbWVXU0RMUGFyc2VyLnBhcnNlKHdzZGxEb2N1bWVudExvY2F0aW9uLCB3c2RsU291cmNlLCBjcmVhdGVEZWZhdWx0Q2F0YWxvZ1Jlc29sdmVyKCksCisgICAgICAgICAgICAgICAgdHJ1ZSwgU2VydmljZUZpbmRlci5maW5kKFdTRExQYXJzZXJFeHRlbnNpb24uY2xhc3MpLnRvQXJyYXkoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBVUkwgZ2V0V1NETExvY2F0aW9uKCkgewotICAgICAgICBpZiAod3NkbExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICBzZXRXU0RMTG9jYXRpb24oZ2V0V3NkbExvY2F0aW9uKCkpOwotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFdTRExMb2NhdGlvbihVUkwgbG9jYXRpb24pIHsKLSAgICAgICAgd3NkbExvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgfQorCiAKICAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3IoKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciAhPSBudWxsKQotICAgICAgICAvL3RvZG86bmVlZHMgdG8gYmUgZGVjb3VwbGVkIGZyb20gc2VydmljZSBhdCBleGVjdXRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChFeGVjdXRvcikgZXhlY3V0b3I7CisgICAgICAgIGlmIChleGVjdXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZXhlY3V0b3I7CiAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDMsIG5ldyBEYWVtb25UaHJlYWRGYWN0b3J5KCkpOworICAgICAgICAgICAgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgRGFlbW9uVGhyZWFkRmFjdG9yeSgpKTsKICAgICAgICAgcmV0dXJuIGV4ZWN1dG9yOwogICAgIH0KIApAQCAtMTYzLDI2MSArMjU0LDM2MCBAQAogICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7CiAgICAgfQogCi0KICAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVyIGdldEhhbmRsZXJSZXNvbHZlcigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXNvbHZlcjsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXJDb25maWd1cmF0b3IuZ2V0UmVzb2x2ZXIoKTsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyBmaW5hbCBIYW5kbGVyQ29uZmlndXJhdG9yIGdldEhhbmRsZXJDb25maWd1cmF0b3IoKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVyQ29uZmlndXJhdG9yOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJSZXNvbHZlcihIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgaGFuZGxlclJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgIGhhbmRsZXJDb25maWd1cmF0b3IgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChyZXNvbHZlcik7CiAgICAgfQogCi0gICAgcHVibGljIE9iamVjdCBnZXRQb3J0KFFOYW1lIHBvcnROYW1lLCBDbGFzcyBwb3J0SW50ZXJmYWNlKQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBzZWlQcm94eSA9IGNyZWF0ZUVuZHBvaW50SUZCYXNlUHJveHkocG9ydE5hbWUsIHBvcnRJbnRlcmZhY2UpOwotICAgICAgICBzZWlQcm94aWVzLmFkZChzZWlQcm94eSk7Ci0gICAgICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRQb3J0KHBvcnROYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZWlQcm94eTsKKyAgICBwdWJsaWMgPFQ+IFQgZ2V0UG9ydChRTmFtZSBwb3J0TmFtZSwgQ2xhc3M8VD4gcG9ydEludGVyZmFjZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0UG9ydChwb3J0TmFtZSwgcG9ydEludGVyZmFjZSwgRU1QVFlfRkVBVFVSRVMpOwogICAgIH0KIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UG9ydChDbGFzcyBwb3J0SW50ZXJmYWNlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVFbmRwb2ludElGQmFzZVByb3h5KG51bGwsIHBvcnRJbnRlcmZhY2UpOworICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KFFOYW1lIHBvcnROYW1lLCBDbGFzczxUPiBwb3J0SW50ZXJmYWNlLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgeworICAgICAgICBpZiAocG9ydE5hbWUgPT0gbnVsbCB8fCBwb3J0SW50ZXJmYWNlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIFdTRExQb3J0SW1wbCBwb3J0TW9kZWwgPSBnZXRQb3J0TW9kZWwocG9ydE5hbWUpOworICAgICAgICByZXR1cm4gZ2V0UG9ydChwb3J0TW9kZWwuZ2V0RVBSKCkscG9ydE5hbWUscG9ydEludGVyZmFjZSxmZWF0dXJlcyk7CiAgICAgfQogCi0gICAgLy90b2RvOiByZW5hbWUgYWRkUG9ydCA6c3BlYyB0YmQKLSAgICBwdWJsaWMgdm9pZCBhZGRQb3J0KFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgYmluZGluZ0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24geworICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KEVuZHBvaW50UmVmZXJlbmNlIGVwciwgQ2xhc3M8VD4gcG9ydEludGVyZmFjZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIGdldFBvcnQoV1NFbmRwb2ludFJlZmVyZW5jZS5jcmVhdGUoZXByKSxwb3J0SW50ZXJmYWNlLGZlYXR1cmVzKTsKKyAgICB9CiAKLSAgICAgICAgaWYgKCFkaXNwYXRjaFBvcnRzLmNvbnRhaW5zS2V5KHBvcnROYW1lKSkgewotICAgICAgICAgICAgZGlzcGF0Y2hQb3J0cy5wdXQocG9ydE5hbWUsIG5ldyBQb3J0SW5mb0Jhc2UoZW5kcG9pbnRBZGRyZXNzLAotICAgICAgICAgICAgICAgIHBvcnROYW1lLCBiaW5kaW5nSWQpKTsKKyAgICBwdWJsaWMgPFQ+IFQgZ2V0UG9ydChXU0VuZHBvaW50UmVmZXJlbmNlIHdzZXByLCBDbGFzczxUPiBwb3J0SW50ZXJmYWNlLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgeworICAgICAgICAvL2dldCB0aGUgcG9ydFR5cGUgZnJvbSBTRUksIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgaWYgRVBSIGRvZXMgbid0IGhhdmUgZW5kcG9pbnROYW1lCisgICAgICAgIFFOYW1lIHBvcnRUeXBlTmFtZSA9IFJ1bnRpbWVNb2RlbGVyLmdldFBvcnRUeXBlTmFtZShwb3J0SW50ZXJmYWNlKTsKKyAgICAgICAgLy9pZiBwb3J0IG5hbWUgaXMgbm90IHNwZWNpZmllZCBpbiBFUFIsIGl0IHdpbGwgdXNlIHBvcnRUeXBlTmFtZSB0byBnZXQgaXQgZnJvbSB0aGUgV1NETCBtb2RlbC4KKyAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBnZXRQb3J0TmFtZUZyb21FUFIod3NlcHIsIHBvcnRUeXBlTmFtZSk7CisgICAgICAgIHJldHVybiBnZXRQb3J0KHdzZXByLHBvcnROYW1lLHBvcnRJbnRlcmZhY2UsZmVhdHVyZXMpOworICAgIH0KKworICAgIHByaXZhdGUgPFQ+IFQgZ2V0UG9ydChXU0VuZHBvaW50UmVmZXJlbmNlIHdzZXByLCBRTmFtZSBwb3J0TmFtZSwgQ2xhc3M8VD4gcG9ydEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgYWRkU0VJKHBvcnROYW1lLCBwb3J0SW50ZXJmYWNlKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUVuZHBvaW50SUZCYXNlUHJveHkod3NlcHIscG9ydE5hbWUscG9ydEludGVyZmFjZSxmZWF0dXJlcyk7CisgICAgfQorICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KENsYXNzPFQ+IHBvcnRJbnRlcmZhY2UsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7CisgICAgICAgIC8vZ2V0IHRoZSBwb3J0VHlwZSBmcm9tIFNFSQorICAgICAgICBRTmFtZSBwb3J0VHlwZU5hbWUgPSBSdW50aW1lTW9kZWxlci5nZXRQb3J0VHlwZU5hbWUocG9ydEludGVyZmFjZSk7CisgICAgICAgIC8vZ2V0IHRoZSBmaXJzdCBwb3J0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNFSQorICAgICAgICBXU0RMUG9ydEltcGwgcG9ydCA9IHdzZGxTZXJ2aWNlLmdldE1hdGNoaW5nUG9ydChwb3J0VHlwZU5hbWUpOworICAgICAgICBpZiAocG9ydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKENsaWVudE1lc3NhZ2VzLlVOREVGSU5FRF9QT1JUX1RZUEUocG9ydFR5cGVOYW1lKSk7CisgICAgICAgIFFOYW1lIHBvcnROYW1lID0gcG9ydC5nZXROYW1lKCk7CisgICAgICAgIHJldHVybiBnZXRQb3J0KHBvcnROYW1lLCBwb3J0SW50ZXJmYWNlLGZlYXR1cmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IFQgZ2V0UG9ydChDbGFzczxUPiBwb3J0SW50ZXJmYWNlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRQb3J0KHBvcnRJbnRlcmZhY2UsIEVNUFRZX0ZFQVRVUkVTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQb3J0KFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghcG9ydHMuY29udGFpbnNLZXkocG9ydE5hbWUpKSB7CisgICAgICAgICAgICBCaW5kaW5nSUQgYmlkID0gKGJpbmRpbmdJZCA9PSBudWxsKSA/IEJpbmRpbmdJRC5TT0FQMTFfSFRUUCA6IEJpbmRpbmdJRC5wYXJzZShiaW5kaW5nSWQpOworICAgICAgICAgICAgcG9ydHMucHV0KHBvcnROYW1lLAorICAgICAgICAgICAgICAgICAgICBuZXcgUG9ydEluZm8odGhpcywgKGVuZHBvaW50QWRkcmVzcyA9PSBudWxsKSA/IG51bGwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50QWRkcmVzcy5jcmVhdGUoZW5kcG9pbnRBZGRyZXNzKSwgcG9ydE5hbWUsIGJpZCkpOwogICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJQb3J0ICIgKyBwb3J0TmFtZS50b1N0cmluZygpICsgIiBhbHJlYWR5IGV4aXN0cyBjYW4gbm90IGNyZWF0ZSBhIHBvcnQgd2l0aCB0aGUgc2FtZSBuYW1lLiIpOwotICAgICAgICAvLyBuZWVkIHRvIGFkZCBwb3J0IHRvIGxpc3QgZm9yIEhhbmRsZXJSZWdpc3RyeQotICAgICAgICBhZGRQb3J0KHBvcnROYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKERpc3BhdGNoTWVzc2FnZXMuRFVQTElDQVRFX1BPUlQocG9ydE5hbWUudG9TdHJpbmcoKSkpOwogICAgIH0KIAogCi0gICAgcHVibGljIDxUPiBEaXNwYXRjaDxUPiBjcmVhdGVEaXNwYXRjaChRTmFtZSBxTmFtZSwgQ2xhc3M8VD4gYUNsYXNzLCBTZXJ2aWNlLk1vZGUgbW9kZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlRGlzcGF0Y2hDbGF6eihxTmFtZSwgYUNsYXNzLCBtb2RlKTsKKyAgICBwdWJsaWMgPFQ+IERpc3BhdGNoPFQ+IGNyZWF0ZURpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBDbGFzczxUPiAgYUNsYXNzLCBTZXJ2aWNlLk1vZGUgbW9kZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIGFDbGFzcywgbW9kZSwgRU1QVFlfRkVBVFVSRVMpOwogICAgIH0KIAotICAgIHB1YmxpYyBEaXNwYXRjaDxPYmplY3Q+IGNyZWF0ZURpc3BhdGNoKFFOYW1lIHFOYW1lLCBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCwgU2VydmljZS5Nb2RlIG1vZGUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURpc3BhdGNoSkFYQihxTmFtZSwgamF4YkNvbnRleHQsIG1vZGUpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIFdTRW5kcG9pbnRSZWZlcmVuY2Ugd3NlcHIsIENsYXNzPFQ+IGFDbGFzcywgU2VydmljZS5Nb2RlIG1vZGUsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7CisgICAgICAgIFBvcnRJbmZvIHBvcnQgPSBzYWZlR2V0UG9ydChwb3J0TmFtZSk7CisgICAgICAgIEJpbmRpbmdJbXBsIGJpbmRpbmcgPSBwb3J0LmNyZWF0ZUJpbmRpbmcoZmVhdHVyZXMsbnVsbCk7CisgICAgICAgIERpc3BhdGNoPFQ+IGRpc3BhdGNoID0gU3R1YnMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIHRoaXMsIGJpbmRpbmcsIGFDbGFzcywgbW9kZSwgY3JlYXRlUGlwZWxpbmUocG9ydCwgYmluZGluZyksIHdzZXByKTsKKyAgICAgICAgc2VydmljZUludGVyY2VwdG9yLnBvc3RDcmVhdGVEaXNwYXRjaCgoV1NCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoKTsKKyAgICAgICAgcmV0dXJuIGRpc3BhdGNoOwogICAgIH0KIAorICAgIHB1YmxpYyA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIENsYXNzPFQ+IGFDbGFzcywgU2VydmljZS5Nb2RlIG1vZGUsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7CisgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlTGlzdCBmZWF0dXJlTGlzdCA9ICBuZXcgV2ViU2VydmljZUZlYXR1cmVMaXN0KGZlYXR1cmVzKTsKKyAgICAgICAgV1NFbmRwb2ludFJlZmVyZW5jZSB3c2VwciA9IG51bGw7CisgICAgICAgIGlmKGZlYXR1cmVMaXN0LmlzRW5hYmxlZChBZGRyZXNzaW5nRmVhdHVyZS5jbGFzcykgJiYgd3NkbFNlcnZpY2UgIT0gbnVsbCAmJiB3c2RsU2VydmljZS5nZXQocG9ydE5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdzZXByID0gd3NkbFNlcnZpY2UuZ2V0KHBvcnROYW1lKS5nZXRFUFIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIHdzZXByLCBhQ2xhc3MsIG1vZGUsIGZlYXR1cmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IERpc3BhdGNoPFQ+IGNyZWF0ZURpc3BhdGNoKEVuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50UmVmZXJlbmNlLCBDbGFzczxUPiB0eXBlLCBTZXJ2aWNlLk1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgV1NFbmRwb2ludFJlZmVyZW5jZSB3c2VwciA9IG5ldyBXU0VuZHBvaW50UmVmZXJlbmNlKGVuZHBvaW50UmVmZXJlbmNlKTsKKyAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBhZGRQb3J0RXByKHdzZXByKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCB3c2VwciwgdHlwZSwgbW9kZSwgZmVhdHVyZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9idGFpbnMge0BsaW5rIFBvcnRJbmZvfSBmb3IgdGhlIGdpdmVuIG5hbWUsIHdpdGggZXJyb3IgY2hlY2suCisgICAgICovCisgICAgcHVibGljCisgICAgQE5vdE51bGwKKyAgICBQb3J0SW5mbyBzYWZlR2V0UG9ydChRTmFtZSBwb3J0TmFtZSkgeworICAgICAgICBQb3J0SW5mbyBwb3J0ID0gcG9ydHMuZ2V0KHBvcnROYW1lKTsKKyAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQ2xpZW50TWVzc2FnZXMuSU5WQUxJRF9QT1JUX05BTUUocG9ydE5hbWUsIGJ1aWxkTmFtZUxpc3QocG9ydHMua2V5U2V0KCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGJ1aWxkTmFtZUxpc3QoQ29sbGVjdGlvbjxRTmFtZT4gbmFtZXMpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoUU5hbWUgcW4gOiBuYW1lcykgeworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICBzYi5hcHBlbmQocW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcG9ydCBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgVHViZSBjcmVhdGVQaXBlbGluZShQb3J0SW5mbyBwb3J0SW5mbywgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgLy9DaGVjayBhbGwgcmVxdWlyZWQgV1NETCBleHRlbnNpb25zIGFyZSB1bmRlcnN0b29kCisgICAgICAgIGNoZWNrQWxsV1NETEV4dGVuc2lvbnNVbmRlcnN0b29kKHBvcnRJbmZvLGJpbmRpbmcpOworCisgICAgICAgIEJpbmRpbmdJRCBiaW5kaW5nSWQgPSBwb3J0SW5mby5iaW5kaW5nSWQ7CisKKyAgICAgICAgVHViZWxpbmVBc3NlbWJsZXIgYXNzZW1ibGVyID0gVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5LmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLCBiaW5kaW5nSWQpOworICAgICAgICBpZiAoYXNzZW1ibGVyID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHByb2Nlc3MgYmluZGluZ0lEPSIgKyBiaW5kaW5nSWQpOyAgICAvLyBUT0RPOiBpMThuCisgICAgICAgIHJldHVybiBhc3NlbWJsZXIuY3JlYXRlQ2xpZW50KAorICAgICAgICAgICAgICAgIG5ldyBDbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmZvLnRhcmdldEVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZm8ucG9ydE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgYmluZGluZywgY29udGFpbmVyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIG9ubHkgaWYgUmVzcGVjdEJpbmRpbmdGZWF0dXJlIGlzIGVuYWJsZWQKKyAgICAgKiBjaGVja3MgaWYgYWxsIHJlcXVpcmVkIHdzZGwgZXh0ZW5zaW9ucyBpbiB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHdzZGw6UG9ydCBhcmUgdW5kZXJzdG9vZCB3aGVuIFJlc3BlY3RCaW5kaW5nRmVhdHVyZSBpcyBlbmFibGVkLgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgd2hlbiBhbnkgd3NkbCBleHRlbnNpb24gdGhhdCBoYXMgd3NkbDpyZXF1aXJlZD10cnVlIGlzIG5vdCB1bmRlcnN0b29kCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWxsV1NETEV4dGVuc2lvbnNVbmRlcnN0b29kKFBvcnRJbmZvIHBvcnQsIFdTQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIGlmIChwb3J0LnBvcnRNb2RlbCAhPSBudWxsICYmIGJpbmRpbmcuaXNGZWF0dXJlRW5hYmxlZChSZXNwZWN0QmluZGluZ0ZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICAoKFdTRExQb3J0SW1wbCkgcG9ydC5wb3J0TW9kZWwpLmFyZVJlcXVpcmVkRXh0ZW5zaW9uc1VuZGVyc3Rvb2QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBFbmRwb2ludEFkZHJlc3MgZ2V0RW5kcG9pbnRBZGRyZXNzKFFOYW1lIHFOYW1lKSB7CisgICAgICAgIHJldHVybiBwb3J0cy5nZXQocU5hbWUpLnRhcmdldEVuZHBvaW50OworICAgIH0KKworICAgIHB1YmxpYyBEaXNwYXRjaDxPYmplY3Q+IGNyZWF0ZURpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCwgU2VydmljZS5Nb2RlIG1vZGUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBqYXhiQ29udGV4dCwgbW9kZSwgRU1QVFlfRkVBVFVSRVMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEaXNwYXRjaDxPYmplY3Q+IGNyZWF0ZURpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBXU0VuZHBvaW50UmVmZXJlbmNlIHdzZXByLCBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCwgU2VydmljZS5Nb2RlIG1vZGUsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7CisgICAgICAgIFBvcnRJbmZvIHBvcnQgPSBzYWZlR2V0UG9ydChwb3J0TmFtZSk7CisgICAgICAgIEJpbmRpbmdJbXBsIGJpbmRpbmcgPSBwb3J0LmNyZWF0ZUJpbmRpbmcoZmVhdHVyZXMsbnVsbCk7CisgICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBTdHVicy5jcmVhdGVKQVhCRGlzcGF0Y2goCisgICAgICAgICAgICAgICAgcG9ydE5hbWUsIHRoaXMsIGJpbmRpbmcsIGpheGJDb250ZXh0LCBtb2RlLAorICAgICAgICAgICAgICAgIGNyZWF0ZVBpcGVsaW5lKHBvcnQsIGJpbmRpbmcpLCB3c2Vwcik7CisgICAgICAgICBzZXJ2aWNlSW50ZXJjZXB0b3IucG9zdENyZWF0ZURpc3BhdGNoKChXU0JpbmRpbmdQcm92aWRlcilkaXNwYXRjaCk7CisgICAgICAgICByZXR1cm4gZGlzcGF0Y2g7CisgICAgfQorCisgICAgcHVibGljIERpc3BhdGNoPE9iamVjdD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIEpBWEJDb250ZXh0IGpheGJDb250ZXh0LCBTZXJ2aWNlLk1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gd2ViU2VydmljZUZlYXR1cmVzKSB7CisgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlTGlzdCBmZWF0dXJlTGlzdCA9ICBuZXcgV2ViU2VydmljZUZlYXR1cmVMaXN0KHdlYlNlcnZpY2VGZWF0dXJlcyk7CisgICAgICAgIFdTRW5kcG9pbnRSZWZlcmVuY2Ugd3NlcHIgPSBudWxsOworICAgICAgICBpZihmZWF0dXJlTGlzdC5pc0VuYWJsZWQoQWRkcmVzc2luZ0ZlYXR1cmUuY2xhc3MpICYmIHdzZGxTZXJ2aWNlICE9IG51bGwgJiYgd3NkbFNlcnZpY2UuZ2V0KHBvcnROYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICB3c2VwciA9IHdzZGxTZXJ2aWNlLmdldChwb3J0TmFtZSkuZ2V0RVBSKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCB3c2VwciwgamF4YkNvbnRleHQsIG1vZGUsIHdlYlNlcnZpY2VGZWF0dXJlcyk7CisgICAgfQorCisgICAgcHVibGljIERpc3BhdGNoPE9iamVjdD4gY3JlYXRlRGlzcGF0Y2goRW5kcG9pbnRSZWZlcmVuY2UgZW5kcG9pbnRSZWZlcmVuY2UsIEpBWEJDb250ZXh0IGNvbnRleHQsIFNlcnZpY2UuTW9kZSBtb2RlLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgeworICAgICAgICBXU0VuZHBvaW50UmVmZXJlbmNlIHdzZXByID0gbmV3IFdTRW5kcG9pbnRSZWZlcmVuY2UoZW5kcG9pbnRSZWZlcmVuY2UpOworICAgICAgICBRTmFtZSBwb3J0TmFtZSA9IGFkZFBvcnRFcHIod3NlcHIpOworICAgICAgICByZXR1cm4gY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIHdzZXByLCBjb250ZXh0LCBtb2RlLCBmZWF0dXJlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBRTmFtZSBhZGRQb3J0RXByKFdTRW5kcG9pbnRSZWZlcmVuY2Ugd3NlcHIpIHsKKyAgICAgICAgaWYgKHdzZXByID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihQcm92aWRlckFwaU1lc3NhZ2VzLk5VTExfRVBSKCkpOworICAgICAgICBRTmFtZSBlcHJQb3J0TmFtZSA9IGdldFBvcnROYW1lRnJvbUVQUih3c2VwciwgbnVsbCk7CisgICAgICAgIC8vYWRkIFBvcnQsIGlmIGl0IGRvZXMgbid0IGV4aXN0OworICAgICAgICAvLyBUT0RPOiB3aGF0IGlmIGl0IGhhcyBkaWZmZXJlbnQgZXByIGFkZHJlc3M/CisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gbmV3IFBvcnRJbmZvKHRoaXMsICh3c2Vwci5nZXRBZGRyZXNzKCkgPT0gbnVsbCkgPyBudWxsIDogRW5kcG9pbnRBZGRyZXNzLmNyZWF0ZSh3c2Vwci5nZXRBZGRyZXNzKCkpLCBlcHJQb3J0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0UG9ydE1vZGVsKGVwclBvcnROYW1lKS5nZXRCaW5kaW5nKCkuZ2V0QmluZGluZ0lkKCkpOworICAgICAgICAgICAgaWYgKCFwb3J0cy5jb250YWluc0tleShlcHJQb3J0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwb3J0cy5wdXQoZXByUG9ydE5hbWUsIHBvcnRJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXByUG9ydE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3NlcHIgRW5kcG9pbnRSZWZlcmVuY2UgZnJvbSB3aGljaCBwb3J0TmFtZSB3aWxsIGJlIGV4dHJhY3RlZC4KKyAgICAgKiAgICAgIElmIEVuZHBvaW50TmFtZSAoIHBvcnQgbmFtZSkgaXMgbnVsbCBpbiBFUFIsIHRoZW4gaXQgd2lsbCB0cnkgdG8gZ2V0IGlmIGZyb20gV1NETE1vZGVsIHVzaW5nIHBvcnRUeXBlIFFOYW1lCisgICAgICogQHBhcmFtIHBvcnRUeXBlTmFtZQorICAgICAqICAgICAgICAgIHNob3VsZCBiZSBudWxsIGluIGRpc3BhdGNoIGNhc2UKKyAgICAgKiAgICAgICAgICBzaG91bGQgYmUgbm9uIG51bGwgaW4gU0VJIGNhc2UKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBwb3J0IG5hbWUgZnJvbSBFUFIgYWZ0ZXIgdmFsaWRhdGluZyB2YXJpb3VzIG1ldGFkYXQgZWxlbWVudHMuCisgICAgICogICAgICBBbHNvIGlmIHNlcnZpY2UgaW5zdGFuY2UgZG9lcyBuJ3QgaGF2ZSB3c2RsLAorICAgICAqICAgICAgdGhlbiBpdCBnZXRzIHRoZSBXU0RMIG1ldGFkYXRhIGZyb20gRVBSIGFuZCBidWlsZHMgd3NkbCBtb2RlbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFFOYW1lIGdldFBvcnROYW1lRnJvbUVQUihATm90TnVsbCBXU0VuZHBvaW50UmVmZXJlbmNlIHdzZXByLCBATnVsbGFibGUgUU5hbWUgcG9ydFR5cGVOYW1lKSB7CisgICAgICAgIFFOYW1lIHBvcnROYW1lOworICAgICAgICBXU0VuZHBvaW50UmVmZXJlbmNlLk1ldGFkYXRhIG1ldGFkYXRhID0gd3NlcHIuZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgUU5hbWUgZXByU2VydmljZU5hbWUgPSBtZXRhZGF0YS5nZXRTZXJ2aWNlTmFtZSgpOworICAgICAgICBRTmFtZSBlcHJQb3J0TmFtZSA9IG1ldGFkYXRhLmdldFBvcnROYW1lKCk7CisgICAgICAgIGlmICgoZXByU2VydmljZU5hbWUgIT0gbnVsbCApICYmICFlcHJTZXJ2aWNlTmFtZS5lcXVhbHMoc2VydmljZU5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRW5kcG9pbnRSZWZlcmVuY2UgV1NETCBTZXJ2aWNlTmFtZSBkaWZmZXJzIGZyb20gU2VydmljZSBJbnN0YW5jZSBXU0RMIFNlcnZpY2UgUU5hbWUuXG4iCisgICAgICAgICAgICAgICAgICAgICsgIiBUaGUgdHdvIFNlcnZpY2UgUU5hbWVzIG11c3QgbWF0Y2giKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3NkbFNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgU291cmNlIGVwcldzZGxTb3VyY2UgPSBtZXRhZGF0YS5nZXRXc2RsU291cmNlKCk7CisgICAgICAgICAgICBpZiAoZXByV3NkbFNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oUHJvdmlkZXJBcGlNZXNzYWdlcy5OVUxMX1dTREwoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFdTRExNb2RlbEltcGwgZXByV3NkbE1kbCA9IHBhcnNlV1NETChuZXcgVVJMKHdzZXByLmdldEFkZHJlc3MoKSksIGVwcldzZGxTb3VyY2UpOworICAgICAgICAgICAgICAgIHdzZGxTZXJ2aWNlID0gZXByV3NkbE1kbC5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAod3NkbFNlcnZpY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQ2xpZW50TWVzc2FnZXMuSU5WQUxJRF9TRVJWSUNFX05BTUUoc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGROYW1lTGlzdChlcHJXc2RsTWRsLmdldFNlcnZpY2VzKCkua2V5U2V0KCkpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKENsaWVudE1lc3NhZ2VzLklOVkFMSURfQUREUkVTUyh3c2Vwci5nZXRBZGRyZXNzKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwb3J0TmFtZSA9IGVwclBvcnROYW1lOworCisgICAgICAgIGlmIChwb3J0TmFtZSA9PSBudWxsICYmIHBvcnRUeXBlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvL2dldCB0aGUgZmlyc3QgcG9ydCBjb3JyZXNwb25kaW5nIHRvIHRoZSBTRUkKKyAgICAgICAgICAgIFdTRExQb3J0SW1wbCBwb3J0ID0gd3NkbFNlcnZpY2UuZ2V0TWF0Y2hpbmdQb3J0KHBvcnRUeXBlTmFtZSk7CisgICAgICAgICAgICBpZiAocG9ydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKENsaWVudE1lc3NhZ2VzLlVOREVGSU5FRF9QT1JUX1RZUEUocG9ydFR5cGVOYW1lKSk7CisgICAgICAgICAgICBwb3J0TmFtZSA9IHBvcnQuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChwb3J0TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oUHJvdmlkZXJBcGlNZXNzYWdlcy5OVUxMX1BPUlROQU1FKCkpOworICAgICAgICBpZiAod3NkbFNlcnZpY2UuZ2V0KHBvcnROYW1lKSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oQ2xpZW50TWVzc2FnZXMuSU5WQUxJRF9FUFJfUE9SVF9OQU1FKHBvcnROYW1lLCBidWlsZFdzZGxQb3J0TmFtZXMoKSkpOworCisgICAgICAgIHJldHVybiBwb3J0TmFtZTsKKworICAgIH0KICAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ29udGV4dC5nZXRTZXJ2aWNlTmFtZSgpOworICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFBvcnRzKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAocG9ydHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHBvcHVsYXRlUG9ydHMoKTsKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0U2VydmljZUNsYXNzKCkgeworICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzOworICAgIH0KIAotICAgICAgICBpZiAocG9ydHMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICB0aHJvdyBub1dzZGxFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIHBvcnRzLml0ZXJhdG9yKCk7CisgICAgcHVibGljIEl0ZXJhdG9yPFFOYW1lPiBnZXRQb3J0cygpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gS0s6IHRoZSBzcGVjIHNlZW1zIHRvIGJlIGFtYmlnb3VzIGFib3V0IHdoZXRoZXIKKyAgICAgICAgLy8gdGhpcyByZXR1cm5zIHBvcnRzIHRoYXQgYXJlIGR5bmFtaWNhbGx5IGFkZGVkIG9yIG5vdC4KKyAgICAgICAgaWYgKHBvcnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJkaWkuc2VydmljZS5uby53c2RsLmF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm4gcG9ydHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKICAgICB9CiAKICAgICBwdWJsaWMgVVJMIGdldFdTRExEb2N1bWVudExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0V3NkbExvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUG9ydHMoUU5hbWVbXSBwb3J0cykgewotICAgICAgICBpZiAocG9ydHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIGFkZFBvcnQocG9ydHNbaV0pOwotICAgICAgICAgICAgfQorICAgICAgICBpZih3c2RsU2VydmljZT09bnVsbCkgICByZXR1cm4gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKHdzZGxTZXJ2aWNlLmdldFBhcmVudCgpLmdldExvY2F0aW9uKCkuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7IC8vIGltcG9zc2libGUKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVBvcnRzKCkgewotICAgICAgICBpZiAocG9ydHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHBvcnRzID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7Ci0KLSAgICAgICAgV1NETENvbnRleHQgd3Njb250ZXh0ID0gc2VydmljZUNvbnRleHQuZ2V0V3NkbENvbnRleHQoKTsKLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQuZ2V0U2VydmljZU5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAod3Njb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRTZXJ2aWNlTmFtZSh3c2NvbnRleHQuZ2V0Rmlyc3RTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTZXQga25vd25Qb3J0cyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHdzY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VDb250ZXh0LmdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICBrbm93blBvcnRzID0KLSAgICAgICAgICAgICAgICB3c2NvbnRleHQuZ2V0UG9ydHNBc1NldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoa25vd25Qb3J0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWVbXSBwb3J0eiA9IChRTmFtZVtdKSBrbm93blBvcnRzLnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZVtrbm93blBvcnRzLnNpemUoKV0pOwotICAgICAgICAgICAgICAgIGFkZFBvcnRzKHBvcnR6KTsKLSAgICAgICAgICAgICAgICBmb3IgKFFOYW1lIHBvcnQgOiBwb3J0eikgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgd3Njb250ZXh0LmdldEVuZHBvaW50KHNlcnZpY2VOYW1lLCBwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJpZCA9IHdzY29udGV4dC5nZXRXc2RsQmluZGluZyhzZXJ2aWNlTmFtZSwgcG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCaW5kaW5nSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hQb3J0cy5wdXQocG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb3J0SW5mb0Jhc2UoZW5kcG9pbnQsIHBvcnQsIGJpZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFBvcnQoUU5hbWUgcG9ydCkgewotICAgICAgICBpZiAocG9ydHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHBvcHVsYXRlUG9ydHMoKTsKLSAgICAgICAgcG9ydHMuYWRkKHBvcnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBXZWJTZXJ2aWNlRXhjZXB0aW9uIG5vV3NkbEV4Y2VwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJkaWkuc2VydmljZS5uby53c2RsLmF2YWlsYWJsZSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZUVuZHBvaW50SUZCYXNlUHJveHkoUU5hbWUgcG9ydE5hbWUsIENsYXNzIHBvcnRJbnRlcmZhY2UpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIDxUPiBUIGNyZWF0ZUVuZHBvaW50SUZCYXNlUHJveHkoQE51bGxhYmxlIFdTRW5kcG9pbnRSZWZlcmVuY2UgZXByLFFOYW1lIHBvcnROYW1lLCBDbGFzczxUPiBwb3J0SW50ZXJmYWNlLCBXZWJTZXJ2aWNlRmVhdHVyZVtdIHdlYlNlcnZpY2VGZWF0dXJlcykgewogICAgICAgICAvL2ZhaWwgaWYgc2VydmljZSBkb2VzbnQgaGF2ZSBXU0RMCi0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dC5nZXRXc2RsQ29udGV4dCgpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50Q29uZmlndXJhdGlvbkV4Y2VwdGlvbigic2VydmljZS5ub1dTRExVcmwiKTsKKyAgICAgICAgaWYgKHdzZGxTZXJ2aWNlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihDbGllbnRNZXNzYWdlcy5JTlZBTElEX1NFUlZJQ0VfTk9fV1NETChzZXJ2aWNlTmFtZSkpOwogCi0gICAgICAgIC8vaWYgdGhlcmUgaXMgcG9ydE5hbWUgdmFsaWRhdGUgaXQKLSAgICAgICAgaWYgKChwb3J0TmFtZSAhPSBudWxsKSAmJiAhc2VydmljZUNvbnRleHQuZ2V0V3NkbENvbnRleHQoKS5jb250YWlucyhzZXJ2aWNlQ29udGV4dC5nZXRTZXJ2aWNlTmFtZSgpLCBwb3J0TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJzZXJ2aWNlLmludmFsaWRQb3J0IiwgcG9ydE5hbWUsIHNlcnZpY2VDb250ZXh0LmdldFNlcnZpY2VOYW1lKCksIHNlcnZpY2VDb250ZXh0LmdldFdzZGxDb250ZXh0KCkuZ2V0V3NkbExvY2F0aW9uKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGlmICh3c2RsU2VydmljZS5nZXQocG9ydE5hbWUpPT1udWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBDbGllbnRNZXNzYWdlcy5JTlZBTElEX1BPUlRfTkFNRShwb3J0TmFtZSxidWlsZFdzZGxQb3J0TmFtZXMoKSkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJvY2Vzc1NlcnZpY2VDb250ZXh0KHBvcnROYW1lLCBwb3J0SW50ZXJmYWNlKTsKKyAgICAgICAgU0VJUG9ydEluZm8gZWlmID0gc2VpQ29udGV4dC5nZXQocG9ydE5hbWUpOwogCi0gICAgICAgIC8vaWYgdGhlIHBvcnROYW1lIGlzIG51bGwgaXQgbXVzdCBoYXZlIGJlZW4gc2V0IGluc2lkZSBwcm9jZXNzU2VydmljZUNvbnRleHQsIG5vdyBnZXQgaXQKLSAgICAgICAgLy9mcm9tIEVuZHBvaW50SWZDb250ZXh0Ci0gICAgICAgIGlmIChwb3J0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcG9ydE5hbWUgPSBzZXJ2aWNlQ29udGV4dC5nZXRFbmRwb2ludElGQ29udGV4dChwb3J0SW50ZXJmYWNlLmdldE5hbWUoKSkuZ2V0UG9ydE5hbWUoKTsKKyAgICAgICAgQmluZGluZ0ltcGwgYmluZGluZyA9IGVpZi5jcmVhdGVCaW5kaW5nKHdlYlNlcnZpY2VGZWF0dXJlcyxwb3J0SW50ZXJmYWNlKTsKKyAgICAgICAgU0VJU3R1YiBwaXMgPSBuZXcgU0VJU3R1Yih0aGlzLCBiaW5kaW5nLCBlaWYubW9kZWwsIGNyZWF0ZVBpcGVsaW5lKGVpZiwgYmluZGluZyksIGVwcik7CiAKLSAgICAgICAgcmV0dXJuIGJ1aWxkRW5kcG9pbnRJRlByb3h5KHBvcnROYW1lLCBwb3J0SW50ZXJmYWNlKTsKKyAgICAgICAgVCBwcm94eSA9IHBvcnRJbnRlcmZhY2UuY2FzdChQcm94eS5uZXdQcm94eUluc3RhbmNlKHBvcnRJbnRlcmZhY2UuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXtwb3J0SW50ZXJmYWNlLCBXU0JpbmRpbmdQcm92aWRlci5jbGFzcywgQ2xvc2VhYmxlLmNsYXNzfSwgcGlzKSk7CisgICAgICAgIGlmIChzZXJ2aWNlSW50ZXJjZXB0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmljZUludGVyY2VwdG9yLnBvc3RDcmVhdGVQcm94eSgoV1NCaW5kaW5nUHJvdmlkZXIpcHJveHksIHBvcnRJbnRlcmZhY2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm94eTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgSGFzaFNldDxRTmFtZT4gZ2V0UG9ydHNBc1NldCgpIHsKLSAgICAgICAgaWYgKHBvcnRzID09IG51bGwpCi0gICAgICAgICAgICBwb3B1bGF0ZVBvcnRzKCk7Ci0gICAgICAgIHJldHVybiBwb3J0czsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYmluZGluZyBvbiB0aGUgYmluZGluZyBwcm92aWRlci4gQ2FsbGVkIGJ5IHRoZSBzZXJ2aWNlCi0gICAgICogY2xhc3Mgd2hlbiBjcmVhdGluZyB0aGUgYmluZGluZyBwcm92aWRlci4KKyAgICAvKioKKyAgICAgKiBMaXN0cyB1cCB0aGUgcG9ydCBuYW1lcyBpbiBXU0RMLiBGb3IgZXJyb3IgZGlhZ25vc3RpY3MuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QmluZGluZ09uUHJvdmlkZXIoSW50ZXJuYWxCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcG9ydE5hbWUsIFN0cmluZyBiaW5kaW5nSWQpIHsKLQotICAgICAgICAvLyBnZXQgaGFuZGxlciBjaGFpbgotICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJDaGFpbiA9IG51bGw7Ci0gICAgICAgIEhhbmRsZXJSZXNvbHZlciBoUmVzb2x2ZXIgPSBnZXRIYW5kbGVyUmVzb2x2ZXIoKTsKLSAgICAgICAgaWYgKGhhbmRsZXJSZXNvbHZlciAhPSBudWxsICYmIGdldFNlcnZpY2VOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUG9ydEluZm8gcG9ydEluZm8gPSBuZXcgUG9ydEluZm9JbXBsKGJpbmRpbmdJZCwgcG9ydE5hbWUsCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICBoYW5kbGVyQ2hhaW4gPSBoYW5kbGVyUmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBvcnRJbmZvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZXJDaGFpbiA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBiaW5kaW5nCi0gICAgICAgIGlmIChiaW5kaW5nSWQudG9TdHJpbmcoKS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKSB8fAotICAgICAgICAgICAgYmluZGluZ0lkLnRvU3RyaW5nKCkuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKSB8fAotICAgICAgICAgICAgYmluZGluZ0lkLnRvU3RyaW5nKCkuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgIGJpbmRpbmdJZC50b1N0cmluZygpLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpIHsKLSAgICAgICAgICAgIFNPQVBCaW5kaW5nSW1wbCBiaW5kaW5nSW1wbCA9IG5ldyBTT0FQQmluZGluZ0ltcGwoaGFuZGxlckNoYWluLAotICAgICAgICAgICAgICAgIGJpbmRpbmdJZCwgZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiByb2xlcyA9IHNlcnZpY2VDb250ZXh0LmdldFJvbGVzKHBvcnROYW1lKTsKLSAgICAgICAgICAgIGlmIChyb2xlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0ltcGwuc2V0Um9sZXMocm9sZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvdmlkZXIuX3NldEJpbmRpbmcoYmluZGluZ0ltcGwpOwotICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmdJZC5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkgewotICAgICAgICAgICAgcHJvdmlkZXIuX3NldEJpbmRpbmcobmV3IEhUVFBCaW5kaW5nSW1wbChoYW5kbGVyQ2hhaW4pKTsKLSAgICAgICAgfQorICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBidWlsZFdzZGxQb3J0TmFtZXMoKSB7CisgICAgICAgIFNldDxRTmFtZT4gd3NkbFBvcnROYW1lcyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOworICAgICAgICBmb3IgKFdTRExQb3J0SW1wbCBwb3J0IDogd3NkbFNlcnZpY2UuZ2V0UG9ydHMoKSkKKyAgICAgICAgICAgIHdzZGxQb3J0TmFtZXMuYWRkKHBvcnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkTmFtZUxpc3Qod3NkbFBvcnROYW1lcyk7CiAgICAgfQogCi0KLSAgICBwcml2YXRlIERpc3BhdGNoIGNyZWF0ZURpc3BhdGNoQ2xhenooUU5hbWUgcG9ydCwgQ2xhc3MgY2xhenosIFNlcnZpY2UuTW9kZSBtb2RlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFBvcnRJbmZvQmFzZSBkaXNwYXRjaFBvcnQgPSBkaXNwYXRjaFBvcnRzLmdldChwb3J0KTsKLSAgICAgICAgaWYgKGRpc3BhdGNoUG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEaXNwYXRjaEJhc2UgZEJhc2UgPSBuZXcgRGlzcGF0Y2hCYXNlKChQb3J0SW5mb0Jhc2UpIGRpc3BhdGNoUG9ydCwgY2xhenosIChTZXJ2aWNlLk1vZGUpIG1vZGUsIHRoaXMpOwotICAgICAgICAgICAgc2V0QmluZGluZ09uUHJvdmlkZXIoZEJhc2UsIHBvcnQsIGRCYXNlLl9nZXRCaW5kaW5nSWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZEJhc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiUG9ydCBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gY3JlYXRlIERpc3BhdGNoIik7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEge0BsaW5rIFdTRExQb3J0SW1wbH0gd2l0aCBlcnJvciBjaGVjay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZ3VhcmFudGVlZCB0byBiZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgV1NETFBvcnRJbXBsIGdldFBvcnRNb2RlbChRTmFtZSBwb3J0TmFtZSkgeworICAgICAgICBXU0RMUG9ydEltcGwgcG9ydCA9IHdzZGxTZXJ2aWNlLmdldChwb3J0TmFtZSk7CisgICAgICAgIGlmIChwb3J0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBDbGllbnRNZXNzYWdlcy5JTlZBTElEX1BPUlRfTkFNRShwb3J0TmFtZSxidWlsZFdzZGxQb3J0TmFtZXMoKSkpOworICAgICAgICByZXR1cm4gcG9ydDsKICAgICB9CiAKLSAgICBwcml2YXRlIERpc3BhdGNoIGNyZWF0ZURpc3BhdGNoSkFYQihRTmFtZSBwb3J0LCBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCwgU2VydmljZS5Nb2RlIG1vZGUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgUG9ydEluZm9CYXNlIGRpc3BhdGNoUG9ydCA9IGRpc3BhdGNoUG9ydHMuZ2V0KHBvcnQpOwotICAgICAgICBpZiAoZGlzcGF0Y2hQb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIERpc3BhdGNoQmFzZSBkQmFzZSA9IG5ldyBEaXNwYXRjaEJhc2UoKFBvcnRJbmZvQmFzZSkgZGlzcGF0Y2hQb3J0LCBqYXhiQ29udGV4dCwgbW9kZSwgdGhpcyk7Ci0gICAgICAgICAgICBzZXRCaW5kaW5nT25Qcm92aWRlcihkQmFzZSwgcG9ydCwgZEJhc2UuX2dldEJpbmRpbmdJZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBkQmFzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJQb3J0IG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byBjcmVhdGUgRGlzcGF0Y2giKTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIENvbnRyaWJ1dGVzIHRvIHRoZSBjb25zdHJ1Y3Rpb24gb2Yge0BsaW5rIFdTU2VydmljZURlbGVnYXRlfSBieSBmaWxsaW5nIGluCisgICAgICoge0BsaW5rIFNFSVBvcnRJbmZvfSBhYm91dCBhIGdpdmVuIFNFSSAobGlua2VkIGZyb20gdGhlIHtAbGluayBTZXJ2aWNlfS1kZXJpdmVkIGNsYXNzLikKKyAgICAgKi8KKyAgICAvL3RvZG86IHZhbGlkIHBvcnQgaW4gd3NkbAorICAgIHByaXZhdGUgdm9pZCBhZGRTRUkoUU5hbWUgcG9ydE5hbWUsIENsYXNzIHBvcnRJbnRlcmZhY2UpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKKyAgICAgICAgU0VJUG9ydEluZm8gc3BpID0gc2VpQ29udGV4dC5nZXQocG9ydE5hbWUpOworICAgICAgICBpZiAoc3BpICE9IG51bGwpIHJldHVybjsKKyAgICAgICAgV1NETFBvcnRJbXBsIHdzZGxQb3J0ID0gZ2V0UG9ydE1vZGVsKHBvcnROYW1lKTsKKyAgICAgICAgUnVudGltZU1vZGVsZXIgbW9kZWxlciA9IG5ldyBSdW50aW1lTW9kZWxlcihwb3J0SW50ZXJmYWNlLCBzZXJ2aWNlTmFtZSwgd3NkbFBvcnQpOworICAgICAgICBtb2RlbGVyLnNldFBvcnROYW1lKHBvcnROYW1lKTsKKyAgICAgICAgQWJzdHJhY3RTRUlNb2RlbEltcGwgbW9kZWwgPSBtb2RlbGVyLmJ1aWxkUnVudGltZU1vZGVsKCk7CisKKyAgICAgICAgc3BpID0gbmV3IFNFSVBvcnRJbmZvKHRoaXMsIHBvcnRJbnRlcmZhY2UsIChTT0FQU0VJTW9kZWwpIG1vZGVsLCB3c2RsUG9ydCk7CisgICAgICAgIHNlaUNvbnRleHQucHV0KHNwaS5wb3J0TmFtZSwgc3BpKTsKKyAgICAgICAgLy9zZWlDb250ZXh0LnB1dChzcGkuc2VpLCBzcGkpOworICAgICAgICBwb3J0cy5wdXQoc3BpLnBvcnROYW1lLCBzcGkpOworCiAgICAgfQogCi0gICAgcHJpdmF0ZSBVUkwgZ2V0V3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNvbnRleHQuZ2V0V3NkbENvbnRleHQoKS5nZXRXc2RsTG9jYXRpb24oKTsKKyAgICBwdWJsaWMgV1NETFNlcnZpY2VJbXBsIGdldFdzZGxTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gd3NkbFNlcnZpY2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBPYmplY3QgYnVpbGRFbmRwb2ludElGUHJveHkoUU5hbWUgcG9ydFFOYW1lLCBDbGFzcyBwb3J0SW50ZXJmYWNlKQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJRkNvbnRleHQgZWlmID0gY29tcGxldGVFbmRwb2ludElGQ29udGV4dChzZXJ2aWNlQ29udGV4dCwgcG9ydFFOYW1lLCBwb3J0SW50ZXJmYWNlKTsKLQotICAgICAgICAvL2FwcGx5IHBhcmFtZXRlciBiaW5kaW5ncwotICAgICAgICBSdW50aW1lTW9kZWwgbW9kZWwgPSBlaWYuZ2V0UnVudGltZUNvbnRleHQoKS5nZXRNb2RlbCgpOwotICAgICAgICBpZiAocG9ydFFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGdldFdTRExCaW5kaW5nKHBvcnRRTmFtZSk7Ci0gICAgICAgICAgICBlaWYuc2V0QmluZGluZ0lEKGJpbmRpbmcuZ2V0QmluZGluZ0lkKCkpOwotICAgICAgICAgICAgbW9kZWwuYXBwbHlQYXJhbWV0ZXJCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9uZWVkcyBjbGVhbmluZyB1cAotICAgICAgICBFbmRwb2ludElGSW52b2NhdGlvbkhhbmRsZXIgaGFuZGxlciA9Ci0gICAgICAgICAgICBuZXcgRW5kcG9pbnRJRkludm9jYXRpb25IYW5kbGVyKHBvcnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgZWlmLCB0aGlzLCBnZXRTZXJ2aWNlTmFtZSgpKTsgLy9uZWVkIGhhbmRsZXIgcmVnaXN0cnkgcGFzc2VkIGluIGhlcmUKLSAgICAgICAgc2V0QmluZGluZ09uUHJvdmlkZXIoaGFuZGxlciwgcG9ydFFOYW1lLCBoYW5kbGVyLl9nZXRCaW5kaW5nSWQoKSk7Ci0KLSAgICAgICAgT2JqZWN0IHByb3h5ID0gUHJveHkubmV3UHJveHlJbnN0YW5jZShwb3J0SW50ZXJmYWNlLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICBuZXcgQ2xhc3NbXXsKLSAgICAgICAgICAgICAgICBwb3J0SW50ZXJmYWNlLCBCaW5kaW5nUHJvdmlkZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5jbGFzcywKLSAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5TdHViQmFzZS5jbGFzcwotICAgICAgICAgICAgfSwgaGFuZGxlcik7Ci0gICAgICAgIGhhbmRsZXIuc2V0UHJveHkoKE9iamVjdCkgcHJveHkpOwotICAgICAgICByZXR1cm4gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7Ci0gICAgfQotCi0gICAgQmluZGluZyBnZXRXU0RMQmluZGluZyhRTmFtZSBwb3J0UU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0LmdldFdzZGxDb250ZXh0KCkuZ2V0V3NkbEJpbmRpbmcoc2VydmljZUNvbnRleHQuZ2V0U2VydmljZU5hbWUoKSwgcG9ydFFOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVuZHBvaW50SUZDb250ZXh0IGNvbXBsZXRlRW5kcG9pbnRJRkNvbnRleHQoU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQsIFFOYW1lIHBvcnRRTmFtZSwgQ2xhc3MgcG9ydEludGVyZmFjZSkgewotCi0gICAgICAgIEVuZHBvaW50SUZDb250ZXh0IGNvbnRleHQgPSBzZXJ2aWNlQ29udGV4dC5nZXRFbmRwb2ludElGQ29udGV4dChwb3J0SW50ZXJmYWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIFdTRExDb250ZXh0IHdzY29udGV4dCA9IHNlcnZpY2VDb250ZXh0LmdldFdzZGxDb250ZXh0KCk7Ci0gICAgICAgIGlmICh3c2NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50ID0gd3Njb250ZXh0LmdldEVuZHBvaW50KHNlcnZpY2VDb250ZXh0LmdldFNlcnZpY2VOYW1lKCksIHBvcnRRTmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lEID0gd3Njb250ZXh0LmdldEJpbmRpbmdJRCgKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5nZXRTZXJ2aWNlTmFtZSgpLCBwb3J0UU5hbWUpOwotICAgICAgICAgICAgY29udGV4dC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlQ29udGV4dC5nZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0UG9ydEluZm8ocG9ydFFOYW1lLCBlbmRwb2ludCwgYmluZGluZ0lEKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICBjbGFzcyBEYWVtb25UaHJlYWRGYWN0b3J5IGltcGxlbWVudHMgVGhyZWFkRmFjdG9yeSB7CisgICAgIGNsYXNzIERhZW1vblRocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKICAgICAgICAgcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgewogICAgICAgICAgICAgVGhyZWFkIGRhZW1vblRocmVhZCA9IG5ldyBUaHJlYWQocik7CiAgICAgICAgICAgICBkYWVtb25UaHJlYWQuc2V0RGFlbW9uKEJvb2xlYW4uVFJVRSk7CiAgICAgICAgICAgICByZXR1cm4gZGFlbW9uVGhyZWFkOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2ViU2VydmljZUZlYXR1cmVbXSBFTVBUWV9GRUFUVVJFUyA9IG5ldyBXZWJTZXJ2aWNlRmVhdHVyZVswXTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9EYXRhU291cmNlRGlzcGF0Y2guamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9EYXRhU291cmNlRGlzcGF0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGVlMjRiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL0RhdGFTb3VyY2VEaXNwYXRjaC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2g7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5XU0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuV1NTZXJ2aWNlRGVsZWdhdGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTE1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTE1lc3NhZ2UuTWVzc2FnZURhdGFTb3VyY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zb3VyY2UuUGF5bG9hZFNvdXJjZU1lc3NhZ2U7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIERhdGFTb3VyY2VEaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoSW1wbDxEYXRhU291cmNlPiB7CisKKyAgICBwdWJsaWMgRGF0YVNvdXJjZURpc3BhdGNoKFFOYW1lIHBvcnQsIFNlcnZpY2UuTW9kZSBtb2RlLCBXU1NlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlLCBUdWJlIHBpcGUsIEJpbmRpbmdJbXBsIGJpbmRpbmcsIFdTRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7CisgICAgICAgc3VwZXIocG9ydCwgbW9kZSwgc2VydmljZSwgcGlwZSwgYmluZGluZywgZXByICk7CisgICAgfQorCisgICAgUGFja2V0IGNyZWF0ZVBhY2tldChEYXRhU291cmNlIGFyZykgeworCisgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgUEFZTE9BRDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEYXRhU291cmNlIHVzZSBpcyBub3QgYWxsb3dlZCBpbiBTZXJ2aWNlLk1vZGUuUEFZTE9BRFxuIik7CisgICAgICAgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXQoWE1MTWVzc2FnZS5jcmVhdGUoYXJnKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgbWVzc2FnZSBtb2RlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEYXRhU291cmNlIHRvUmV0dXJuVmFsdWUoUGFja2V0IHJlc3BvbnNlKSB7CisKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gcmVzcG9uc2UuZ2V0TWVzc2FnZSgpOworCisgICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgTWVzc2FnZURhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIE1lc3NhZ2VEYXRhU291cmNlIGhhc0RTID0gKE1lc3NhZ2VEYXRhU291cmNlKW1lc3NhZ2U7CisgICAgICAgICAgICAvLyBUT0RPIE5lZWQgdG8gY2FsbCBoYXNVbmNvbnN1bWVkRGF0YVNvdXJjZSgpCisgICAgICAgICAgICByZXR1cm4gaGFzRFMuZ2V0RGF0YVNvdXJjZSgpOworICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBQYXlsb2FkU291cmNlTWVzc2FnZSkgeworICAgICAgICAgICAgcmV0dXJuIFhNTE1lc3NhZ2UuZ2V0RGF0YVNvdXJjZShtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hCYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTdmZTQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEwICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoOwotCi1pbXBvcnQgc3RhdGljIGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGUuTUVTU0FHRTsKLWltcG9ydCBzdGF0aWMgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS4qOwotaW1wb3J0IHN0YXRpYyBqYXZheC54bWwud3MuU2VydmljZS4qOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5pbXBsLkRpc3BhdGNoQ29udGFjdEluZm9MaXN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5pbXBsLkRpc3BhdGNoRGVsZWdhdGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5EZWxlZ2F0ZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLkNsaWVudFRyYW5zcG9ydEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuY2xpZW50Lkh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLio7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotCi0vKioKLSAqIFRoZSA8Y29kZT5qYXZheC54bWwud3MuRGlzcGF0Y2g8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyBzdXBwb3J0Ci0gKiBmb3IgdGhlIGR5bmFtaWMgaW52b2NhdGlvbiBvZiBhIHNlcnZpY2UgZW5kcG9pbnQgb3BlcmF0aW9uIHVzaW5nIFhNTAotICogY29uc3RydWN0cyBvciBKQVhCIG9iamVjdHMuIFRoZSA8Y29kZT5qYXZheC54bWwud3MuU2VydmljZTwvY29kZT4KLSAqIGludGVyZmFjZSBhY3RzIGFzIGEgZmFjdG9yeSBmb3IgdGhlIGNyZWF0aW9uIG9mIDxjb2RlPkRpc3BhdGNoPC9jb2RlPgotICogaW5zdGFuY2VzLgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi0KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaEJhc2UgaW1wbGVtZW50cyBCaW5kaW5nUHJvdmlkZXIsIEludGVybmFsQmluZGluZ1Byb3ZpZGVyLAotICAgIERpc3BhdGNoIHsKLQotICAgIHB1YmxpYyBEaXNwYXRjaEJhc2UoUG9ydEluZm9CYXNlIHBvcnQsIENsYXNzIGFDbGFzcywgU2VydmljZS5Nb2RlIG1vZGUsIFdTU2VydmljZURlbGVnYXRlIHNlcnZpY2UpIHsKLSAgICAgICAgdGhpcyhwb3J0LCBtb2RlLCBudWxsLCBhQ2xhc3MsIHNlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEaXNwYXRjaEJhc2UoUG9ydEluZm9CYXNlIHBvcnQsIEpBWEJDb250ZXh0IGpheGJDb250ZXh0LCBTZXJ2aWNlLk1vZGUgbW9kZSwgV1NTZXJ2aWNlRGVsZWdhdGUgc2VydmljZSkgewotICAgICAgICB0aGlzKHBvcnQsIG1vZGUsIGpheGJDb250ZXh0LCBudWxsLCBzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBEaXNwYXRjaEJhc2UoUG9ydEluZm9CYXNlIHBvcnQsIFNlcnZpY2UuTW9kZSBtb2RlLCBKQVhCQ29udGV4dCBjb250ZXh0LCBDbGFzcyBjbGF6eiwgV1NTZXJ2aWNlRGVsZWdhdGUgc2VydmljZSkgewotICAgICAgICBfZGVsZWdhdGUgPSBuZXcgRGlzcGF0Y2hEZWxlZ2F0ZShuZXcgRGlzcGF0Y2hDb250YWN0SW5mb0xpc3QoKSk7Ci0gICAgICAgIF9tb2RlID0gbW9kZTsKLSAgICAgICAgX3BvcnRJbmZvID0gcG9ydDsKLSAgICAgICAgX2pheGJDb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgX2NsYXp6ID0gY2xheno7Ci0gICAgICAgIF9zZXJ2aWNlID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgYSBzZXJ2aWNlIG9wZXJhdGlvbiBzeW5jaHJvbm91c2x5LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSA8Y29kZT5tc2c8L2NvZGU+IG9iamVjdAotICAgICAqIGlzIGZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgcHJvdG9jb2wgYmluZGluZyBpbiB1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnIEFuIG9iamVjdCB0aGF0IHdpbGwgZm9ybSB0aGUgcGF5bG9hZCBvZgotICAgICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdXNlZCB0byBpbnZva2UgdGhlIG9wZXJhdGlvbi4gTXVzdCBiZSBhbiBpbnN0YW5jZSBvZgotICAgICAqICAgICAgICAgICAgZWl0aGVyIDxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPC9jb2RlPiBvciBhIEpBWEIgb2JqZWN0LiBJZgotICAgICAqICAgICAgICAgICAgPGNvZGU+bXNnPC9jb2RlPiBpcyBhbiBpbnN0YW5jZSBvZiBhIEpBWEIgb2JqZWN0IHRoZW4gdGhlIHJlcXVlc3QKLSAgICAgKiAgICAgICAgICAgIGNvbnRleHQgbXVzdCBoYXZlIHRoZSA8Y29kZT5qYXZheC54bWwud3MuYmluZGluZy5jb250ZXh0PC9jb2RlPgotICAgICAqICAgICAgICAgICAgcHJvcGVydHkgc2V0LgotICAgICAqIEByZXR1cm4gVGhlIHJlc3BvbnNlIHRvIHRoZSBvcGVyYXRpb24gaW52b2NhdGlvbi4gVGhlIG9iamVjdCBpcwotICAgICAqICAgICAgICAgZWl0aGVyIGFuIGluc3RhbmNlIG9mIDxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3IgYSBKQVhCIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlcmUgaXMgYW55IGVycm9yIGluIHRoZSBjb25maWd1cmF0aW9uIG9mCi0gICAgICogICAgICAgICAgdGhlIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hlbiB1c2luZyBhIHN1cHBsaWVkCi0gICAgICogICAgICAgICAgSkFYQkNvbnRleHQgdG8gbWFyc2hhbGwgbXNnIG9yIHVubWFyc2hhbGwgdGhlIHJlc3BvbnNlLiBUaGUgY2F1c2Ugb2YKLSAgICAgKiAgICAgICAgICB0aGUgV2ViU2VydmljZUV4Y2VwdGlvbiBpcyB0aGUgb3JpZ2luYWwgSkFYQkV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgbXNnKQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWVzc2FnZVN0cnVjdCBtZXNzYWdlU3RydWN0ID0gc2V0dXBNZXNzYWdlU3RydWN0KG1zZyk7Ci0gICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TUVQKE1lc3NhZ2VTdHJ1Y3QuUkVRVUVTVF9SRVNQT05TRV9NRVApOwotICAgICAgICByZXR1cm4gc2VuZEFuZFJlY2VpdmUobWVzc2FnZVN0cnVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlIGEgc2VydmljZSBvcGVyYXRpb24gYXN5bmNocm9ub3VzbHkuICBUaGUKLSAgICAgKiBtZXRob2QgcmV0dXJucyB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0byB0aGUgb3BlcmF0aW9uCi0gICAgICogaW52b2NhdGlvbiwgdGhlIHJlc3VsdHMgb2YgdGhlIG9wZXJhdGlvbiBhcmUgb2J0YWluZWQgYnkgcG9sbGluZyB0aGUKLSAgICAgKiByZXR1cm5lZCA8Y29kZT5SZXNwb25zZTwvY29kZT4uCi0gICAgICogPHAvPgotICAgICAqIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIDxjb2RlPm1zZzwvY29kZT4gb2JqZWN0Ci0gICAgICogd2hlbiBtYXJzaGFsbGVkIGlzIGZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgcHJvdG9jb2wKLSAgICAgKiBiaW5kaW5nIGluIHVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgQW4gb2JqZWN0IHRoYXQsIHdoZW4gbWFyc2hhbGxlZCwgd2lsbCBmb3JtIHRoZSBwYXlsb2FkIG9mCi0gICAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB1c2VkIHRvIGludm9rZSB0aGUgb3BlcmF0aW9uLiBNdXN0IGJlIGFuIGluc3RhbmNlIG9mCi0gICAgICogICAgICAgICAgICBlaXRoZXIgPGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U8L2NvZGU+IG9yIGEgSkFYQiBvYmplY3QuIElmCi0gICAgICogICAgICAgICAgICA8Y29kZT5tc2c8L2NvZGU+IGlzIGFuIGluc3RhbmNlIG9mIGEgSkFYQiBvYmplY3QgdGhlbiB0aGUgcmVxdWVzdAotICAgICAqICAgICAgICAgICAgY29udGV4dCBtdXN0IGhhdmUgdGhlIDxjb2RlPmphdmF4LnhtbC53cy5iaW5kaW5nLmNvbnRleHQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICBwcm9wZXJ0eSBzZXQuCi0gICAgICogQHJldHVybiBUaGUgcmVzcG9uc2UgdG8gdGhlIG9wZXJhdGlvbiBpbnZvY2F0aW9uLiBUaGUgb2JqZWN0Ci0gICAgICogICAgICAgICByZXR1cm5lZCBieSA8Y29kZT5SZXNwb25zZS5nZXQoKTwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIGVpdGhlciBhbiBpbnN0YW5jZSBvZiA8Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvY29kZT4KLSAgICAgKiAgICAgICAgIG9yIGEgSkFYQiBvYmplY3QuCi0gICAgICogQHRocm93cyBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvciBpbiB0aGUgY29uZmlndXJhdGlvbiBvZgotICAgICAqICAgICAgICAgIHRoZSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gdXNpbmcgYSBzdXBwbGllZAotICAgICAqICAgICAgICAgIEpBWEJDb250ZXh0IHRvIG1hcnNoYWxsIG1zZy4gVGhlIGNhdXNlIG9mCi0gICAgICogICAgICAgICAgdGhlIFdlYlNlcnZpY0V4Y2VwdGlvbiBpcyB0aGUgb3JpZ2luYWwgSkFYQkV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzcG9uc2U8T2JqZWN0PiBpbnZva2VBc3luYyhPYmplY3QgbXNnKQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWVzc2FnZVN0cnVjdCBtZXNzYWdlU3RydWN0ID0gc2V0dXBNZXNzYWdlU3RydWN0KG1zZyk7Ci0gICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TUVQKE1lc3NhZ2VTdHJ1Y3QuQVNZTkNfUE9MTF9NRVApOwotICAgICAgICBPYmplY3QgcmVzdWx0ID0gc2VuZEFzeW5jKG1lc3NhZ2VTdHJ1Y3QpOwotICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpCi0gICAgICAgICAgICByZXR1cm4gKFJlc3BvbnNlPE9iamVjdD4pIHJlc3VsdDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIHJlc3VsdDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEludm9rZSBhIHNlcnZpY2Ugb3BlcmF0aW9uIGFzeW5jaHJvbm91c2x5LiBUaGUKLSAgICAgKiBtZXRob2QgcmV0dXJucyB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0byB0aGUgb3BlcmF0aW9uCi0gICAgICogaW52b2NhdGlvbiwgdGhlIHJlc3VsdHMgb2YgdGhlIG9wZXJhdGlvbiBhcmUgY29tbXVuaWNhdGVkIHRvIHRoZSBjbGllbnQKLSAgICAgKiB2aWEgdGhlIHBhc3NlZCBpbiBoYW5kbGVyLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSA8Y29kZT5tc2c8L2NvZGU+IG9iamVjdAotICAgICAqIHdoZW4gbWFyc2hhbGxlZCBpcyBmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHByb3RvY29sCi0gICAgICogYmluZGluZyBpbiB1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnICAgICBBbiBvYmplY3QgdGhhdCwgd2hlbiBtYXJzaGFsbGVkLCB3aWxsIGZvcm0gdGhlIHBheWxvYWQgb2YKLSAgICAgKiAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZSB1c2VkIHRvIGludm9rZSB0aGUgb3BlcmF0aW9uLiBNdXN0IGJlIGFuIGluc3RhbmNlIG9mCi0gICAgICogICAgICAgICAgICAgICAgZWl0aGVyIDxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPC9jb2RlPiBvciBhIEpBWEIgb2JqZWN0LiBJZgotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPm1zZzwvY29kZT4gaXMgYW4gaW5zdGFuY2Ugb2YgYSBKQVhCIG9iamVjdCB0aGVuIHRoZSByZXF1ZXN0Ci0gICAgICogICAgICAgICAgICAgICAgY29udGV4dCBtdXN0IGhhdmUgdGhlIDxjb2RlPmphdmF4LnhtbC53cy5iaW5kaW5nLmNvbnRleHQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgcHJvcGVydHkgc2V0LgotICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICByZXNwb25zZSB0byB0aGUgb3BlcmF0aW9uIGludm9jYXRpb24uIFRoZSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgICAgICByZXR1cm5lZCBieSA8Y29kZT5SZXNwb25zZS5nZXQoKTwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvY29kZT4gb3IgYSBKQVhCIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgPGNvZGU+RnV0dXJlPC9jb2RlPiBvYmplY3QgdGhhdCBtYXkgYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzCi0gICAgICogICAgICAgICBvZiB0aGUgb3BlcmF0aW9uIGludm9jYXRpb24uIFRoaXMgb2JqZWN0IG11c3Qgbm90IGJlIHVzZWQgdG8gdHJ5IHRvCi0gICAgICogICAgICAgICBvYnRhaW4gdGhlIHJlc3VsdHMgb2YgdGhlIG9wZXJhdGlvbiAtIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbQotICAgICAqICAgICAgICAgPGNvZGU+RnV0dXJlPD8+LmdldCgpPC9jb2RlPiBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQKLSAgICAgKiAgICAgICAgIGFuZCBhbnkgdXNlIG9mIGl0IHdpbGwgcmVzdWx0IGluIG5vbi1wb3J0YWJsZSBiZWhhdmlvdXIuCi0gICAgICogQHRocm93cyBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZXJlIGlzIGFueSBlcnJvciBpbiB0aGUgY29uZmlndXJhdGlvbiBvZgotICAgICAqICAgICAgICAgIHRoZSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gdXNpbmcgYSBzdXBwbGllZAotICAgICAqICAgICAgICAgIEpBWEJDb250ZXh0IHRvIG1hcnNoYWxsIG1zZy4gVGhlIGNhdXNlIG9mCi0gICAgICogICAgICAgICAgdGhlIFdlYlNlcnZpY2VFeGNlcHRpb24gaXMgdGhlIG9yaWdpbmFsIEpBWEJFeGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luYyhqYXZhLmxhbmcuT2JqZWN0IG1zZywgQXN5bmNIYW5kbGVyIGhhbmRsZXIpIHsKLQotICAgICAgICBNZXNzYWdlU3RydWN0IG1lc3NhZ2VTdHJ1Y3QgPSBzZXR1cE1lc3NhZ2VTdHJ1Y3QobXNnKTsKLSAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZVN0cnVjdC5zZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NMSUVOVF9BU1lOQ19IQU5ETEVSLCAoT2JqZWN0KSBuZXcgQXN5bmNIYW5kbGVyU2VydmljZShoYW5kbGVyLCBnZXRDdXJyZW50RXhlY3V0b3IoKSkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJBc3luY0hhbmRsZXIgYXJndW1lbnQgaXMgbnVsbC4gIiArCi0gICAgICAgICAgICAgICAgIkFzeW5jSGFuZGxlciBpcyByZXF1aXJlZCBmb3IgYXN5bmNocm9ub3VzIGNhbGxiYWNrIGludm9jYXRpb25zICIpOwotCi0gICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TUVQKE1lc3NhZ2VTdHJ1Y3QuQVNZTkNfQ0FMTEJBQ0tfTUVQKTsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHNlbmRBc3luYyhtZXNzYWdlU3RydWN0KTsKLSAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFdTRnV0dXJlKQotICAgICAgICAgICAgcmV0dXJuIChGdXR1cmU8T2JqZWN0PikgcmVzdWx0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgYSBzZXJ2aWNlIG9wZXJhdGlvbiB1c2luZyB0aGUgb25lLXdheQotICAgICAqIGludGVyYWN0aW9uIG1vZGUuIFRoZSBvcGVyYXRpb24gaW52b2NhdGlvbiBpcyBsb2dpY2FsbHkgbm9uLWJsb2NraW5nLAotICAgICAqIHN1YmplY3QgdG8gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgdW5kZXJseWluZyBwcm90b2NvbCwgbm8gcmVzdWx0cwotICAgICAqIGFyZSByZXR1cm5lZC4gV2hlbgotICAgICAqIHRoZSBwcm90b2NvbCBpbiB1c2UgaXMgU09BUC9IVFRQLCB0aGlzIG1ldGhvZCBtdXN0IGJsb2NrIHVudGlsCi0gICAgICogYW4gSFRUUCByZXNwb25zZSBjb2RlIGhhcyBiZWVuIHJlY2VpdmVkIG9yIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgPGNvZGU+bXNnPC9jb2RlPiBvYmplY3QKLSAgICAgKiB3aGVuIG1hcnNoYWxsZWQgaXMgZm9ybWVkIGFjY29yZGluZyB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBwcm90b2NvbAotICAgICAqIGJpbmRpbmcgaW4gdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyBBbiBvYmplY3QgdGhhdCwgd2hlbiBtYXJzaGFsbGVkLCB3aWxsIGZvcm0gdGhlIHBheWxvYWQgb2YKLSAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHVzZWQgdG8gaW52b2tlIHRoZSBvcGVyYXRpb24uIE11c3QgYmUgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKiAgICAgICAgICAgIGVpdGhlciA8Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvY29kZT4gb3IgYSBKQVhCIG9iamVjdC4gSWYKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPm1zZzwvY29kZT4gaXMgYW4gaW5zdGFuY2Ugb2YgYSBKQVhCIG9iamVjdCB0aGVuIHRoZSByZXF1ZXN0Ci0gICAgICogICAgICAgICAgICBjb250ZXh0IG11c3QgaGF2ZSB0aGUgPGNvZGU+amF2YXgueG1sLndzLmJpbmRpbmcuY29udGV4dDwvY29kZT4KLSAgICAgKiAgICAgICAgICAgIHByb3BlcnR5IHNldC4KLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSWYgdGhlcmUgaXMgYW55IGVycm9yIGluIHRoZSBjb25maWd1cmF0aW9uIG9mCi0gICAgICogICAgICAgICAgdGhlIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBpbnN0YW5jZSBvciBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZQotICAgICAqICAgICAgICAgIGludm9jYXRpb24uCi0gICAgICogQHRocm93cyBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyB3aGVuIHVzaW5nIGEgc3VwcGxpZWQKLSAgICAgKiAgICAgICAgICBKQVhCQ29udGV4dCB0byBtYXJzaGFsbCBtc2cuIFRoZSBjYXVzZSBvZgotICAgICAqICAgICAgICAgIHRoZSBXZWJTZXJ2aWNlRXhjZXB0aW9uIGlzIHRoZSBvcmlnaW5hbCBKQVhCRXhjZXB0aW9uLgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgaW52b2tlT25lV2F5KE9iamVjdCBtc2cpIHsKLQotICAgICAgICBNZXNzYWdlU3RydWN0IG1lc3NhZ2VTdHJ1Y3QgPSBzZXR1cE1lc3NhZ2VTdHJ1Y3QobXNnKTsKLSAgICAgICAgbWVzc2FnZVN0cnVjdC5zZXRNRVAoTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCk7Ci0gICAgICAgIHNlbmRPbmVXYXkobWVzc2FnZVN0cnVjdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0pBWEJDb250ZXh0KE9iamVjdCBtc2csIE1lc3NhZ2VTdHJ1Y3QgbWVzc2FnZVN0cnVjdCkgewotICAgICAgICBSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCA9IChSZXF1ZXN0Q29udGV4dCkgZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgaWYgKF9qYXhiQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhCX0NPTlRFWFRfUFJPUEVSVFksIF9qYXhiQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3NldERlbGVnYXRlKERlbGVnYXRlIGRlbGVnYXRlKSB7Ci0gICAgICAgIF9kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWxlZ2F0ZSBfZ2V0RGVsZWdhdGUoKSB7Ci0gICAgICAgIHJldHVybiBfZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRUcmFuc3BvcnRGYWN0b3J5KENsaWVudFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBkZWZhdWx0VHJhbnNwb3J0RmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IGdldERlZmF1bHRUcmFuc3BvcnRGYWN0b3J5KCkgewotICAgICAgICBpZiAoZGVmYXVsdFRyYW5zcG9ydEZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgICAgIGRlZmF1bHRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBfZ2V0VHJhbnNwb3J0RmFjdG9yeSgpIHsKLSAgICAgICAgX3RyYW5zcG9ydEZhY3RvcnkgPQotICAgICAgICAgICAgKENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIGdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQ0xJRU5UX1RSQU5TUE9SVF9GQUNUT1JZKTsKLQotICAgICAgICBpZiAoX3RyYW5zcG9ydEZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgX3RyYW5zcG9ydEZhY3RvcnkgPSBuZXcgSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3RyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3NldFRyYW5zcG9ydEZhY3RvcnkoY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBmKSB7Ci0gICAgICAgIGdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQ0xJRU5UX1RSQU5TUE9SVF9GQUNUT1JZLCBmKTsKLSAgICAgICAgX3RyYW5zcG9ydEZhY3RvcnkgPSAoQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSkgZjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBzZW5kQW5kUmVjZWl2ZShNZXNzYWdlU3RydWN0IG1lc3NhZ2VTdHJ1Y3QpIHsKLSAgICAgICAgT2JqZWN0IHJlc3BvbnNlID0gbnVsbDsKLQotICAgICAgICBfZGVsZWdhdGUuc2VuZChtZXNzYWdlU3RydWN0KTsKLSAgICAgICAgcmVzcG9uc2UgPSBtZXNzYWdlU3RydWN0LmdldFJlc3BvbnNlKCk7Ci0gICAgICAgIHVwZGF0ZVJlc3BvbnNlQ29udGV4dChtZXNzYWdlU3RydWN0KTsKLSAgICAgICAgLy8oKENvbnRleHRNYXApIGdldFJlcXVlc3RDb250ZXh0KCkpLmNsZWFyKCk7Ci0gICAgICAgIHN3aXRjaCAobWVzc2FnZVN0cnVjdC5nZXRSZXNwb25zZVR5cGUoKSkgewotCi0gICAgICAgICAgICBjYXNlIE1lc3NhZ2VTdHJ1Y3QuTk9STUFMX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgIC8vbm90IHN1cmUgd2hlcmUgdGhpcyBiZWxvbmdzIHlldCAtIGJ1dCBmb3Igbm93LQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFNPQVBGYXVsdEV4Y2VwdGlvbikgcmVzcG9uc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgU09BUEZhdWx0SW5mbykgewotICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRJbmZvIHNvYXBGYXVsdEluZm8gPSAoU09BUEZhdWx0SW5mbykgcmVzcG9uc2U7Ci0gICAgICAgICAgICAgICAgICAgIEpBWEJFeGNlcHRpb24gamJlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvYXBGYXVsdEluZm8uZ2V0U3RyaW5nKCkuY29udGFpbnMoImphdmF4LnhtbC5iaW5kIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpiZSA9IG5ldyBKQVhCRXhjZXB0aW9uKHNvYXBGYXVsdEluZm8uZ2V0U3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9kbyBJIG5lZWQgdG8gcHV0IHRoaXMgaW4gYSB3ZWJzZXJ2aWNlIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oc29hcEZhdWx0SW5mby5nZXRTT0FQRmF1bHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZmUuaW5pdENhdXNlKGpiZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBGYXVsdEV4Y2VwdGlvbihzb2FwRmF1bHRJbmZvLmdldFNPQVBGYXVsdCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgSFRUUEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSFRUUEV4Y2VwdGlvbikgcmVzcG9uc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSByZXNwb25zZTsKLSAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAoU09BUEZhdWx0RXhjZXB0aW9uKSByZXNwb25zZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgSFRUUEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSFRUUEV4Y2VwdGlvbikgcmVzcG9uc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIHJlc3BvbnNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsgICAvL2p1c3QgYnJlYWsgYW5kIHJldHVybiByZXNwb25zZQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgLy9tdXN0IGJlIHNvbWUga2luZCBvZiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkNsaWVudCBzaWRlIGV4Y2VwdGlvbiAtIGV4YW1pbmUgY2F1c2UgIiwgKEV4Y2VwdGlvbikgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBzZW5kQXN5bmMoTWVzc2FnZVN0cnVjdCBtZXNzYWdlU3RydWN0KQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIF9sb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLSAgICAgICAgX2xvY2subG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgX2RlbGVnYXRlLnNlbmQobWVzc2FnZVN0cnVjdCk7Ci0gICAgICAgICAgICByZXNwb25zZSA9IG1lc3NhZ2VTdHJ1Y3QuZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgX2xvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kT25lV2F5KE1lc3NhZ2VTdHJ1Y3QgbWVzc2FnZVN0cnVjdCkgewotCi0gICAgICAgIF9kZWxlZ2F0ZS5zZW5kKG1lc3NhZ2VTdHJ1Y3QpOwotICAgICAgICBPYmplY3QgcmVzcG9uc2UgPSBtZXNzYWdlU3RydWN0LmdldFJlc3BvbnNlKCk7Ci0gICAgICAgIC8vbm8gZXhjZXB0aW9ucyBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIgYnV0Ci0gICAgICAgIC8vZXhjZXB0aW9ucyBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgY2xpZW50Ci0gICAgICAgIHN3aXRjaCAobWVzc2FnZVN0cnVjdC5nZXRSZXNwb25zZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBNZXNzYWdlU3RydWN0Lk5PUk1BTF9SRVNQT05TRToKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRToKLSAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgIC8vYmVmb3JlIGludm9jYXRpb24KLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgcmVzcG9uc2U7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDbGllbnQgc2lkZSBFeGNlcHRpb24gIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VTdHJ1Y3Qgc2V0dXBNZXNzYWdlU3RydWN0KE9iamVjdCBtc2cpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZVN0cnVjdCBtZXNzYWdlU3RydWN0ID0gX2RlbGVnYXRlLmdldE1lc3NhZ2VTdHJ1Y3QoKTsKLQotICAgICAgICBpZiAobXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotICAgICAgICAgICAgaWYgKCgobXNnIGluc3RhbmNlb2YgU291cmNlKSAmJiBfbW9kZSA9PSBNRVNTQUdFKSAmJgotICAgICAgICAgICAgICAgICghX2dldEJpbmRpbmdJZCgpLnRvU3RyaW5nKCkuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9nZXRCaW5kaW5nSWQoKS50b1N0cmluZygpLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKQotICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFNPQVBQYXJ0KCkuc2V0Q29udGVudCgoU291cmNlKSBtc2cpOwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZyA9IG1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3NldE1lc3NhZ2VTdHJ1Y3QobWVzc2FnZVN0cnVjdCwgbXNnKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy90b2RvIC0gbmVlZHMgdG8gYmUgYSBnZXQgcmVxdWVzdAotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTnVsbFBhcmFtZXRlcihtc2cpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJUaGlzIGlzIG5vdCBhIHZhbGlkIHJlcXVlc3QgIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0TWVzc2FnZVN0cnVjdChtZXNzYWdlU3RydWN0LCBtc2cpOwotICAgICAgICByZXR1cm4gbWVzc2FnZVN0cnVjdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0TWVzc2FnZVN0cnVjdChNZXNzYWdlU3RydWN0IG1lc3NhZ2VTdHJ1Y3QsIE9iamVjdCBtc2cpIHsKLSAgICAgICAgbWVzc2FnZVN0cnVjdC5zZXREYXRhKG5ldyBPYmplY3RbXXttc2d9KTsKLSAgICAgICAgc2V0TWV0YWRhdGEoZ2V0UmVxdWVzdENvbnRleHQoKSwgbXNnLCBtZXNzYWdlU3RydWN0KTsKLSAgICAgICAgLy9zZXQgbXRvbSB0aHJlc2hvbGQgdmFsdWUgdG8KLSAgICAgICAgT2JqZWN0IG10b21UaHJlc2hvbGQgPSBnZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLk1UT01fVEhSRVNIT0xPRF9WQUxVRSk7Ci0gICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5NVE9NX1RIUkVTSE9MT0RfVkFMVUUsIG10b21UaHJlc2hvbGQpOwotCi0gICAgICAgIC8vIFNldCBNVE9NIHByb2Nlc3NpbmcgZm9yIFhNTCByZXF1ZXN0cyBvbmx5Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPQotICAgICAgICAgICAgKGdldEJpbmRpbmcoKSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKT8KLSAgICAgICAgICAgICAgICAoKFNPQVBCaW5kaW5nSW1wbCliaW5kaW5nKS5nZXRCaW5kaW5nSWQoKS50b1N0cmluZygpOkhUVFBCaW5kaW5nLkhUVFBfQklORElORzsKLSAgICAgICAgaWYgKGJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpfHwKLSAgICAgICAgYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpCi0gICAgICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TWV0YURhdGEoImNvbS5zdW4ueG1sLmludGVybmFsLndzLm10b20uZW5hYmxlZCIsICgoU09BUEJpbmRpbmdJbXBsKWdldEJpbmRpbmcoKSkuaXNNVE9NRW5hYmxlZCgpKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGNvbnRlbnQgbmVnb3RpYXRpb24gcHJvcGVydHkKLSAgICAgICAgQ29udGVudE5lZ290aWF0aW9uLmluaXRpYWxpemUoZ2V0UmVxdWVzdENvbnRleHQoKSwgbWVzc2FnZVN0cnVjdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlc3BvbnNlQ29udGV4dChNZXNzYWdlU3RydWN0IG1lc3NhZ2VTdHJ1Y3QpIHsKLSAgICAgICAgUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCA9IChSZXNwb25zZUNvbnRleHQpCi0gICAgICAgICAgICBtZXNzYWdlU3RydWN0LmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfUkVTUE9OU0VfQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgIHNldFJlc3BvbnNlQ29udGV4dChyZXNwb25zZUNvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRNZXRhZGF0YShNYXAgamF4d3NDb250ZXh0LCBPYmplY3Qgb2JqLCBNZXNzYWdlU3RydWN0IG1lc3NhZ2VTdHJ1Y3QpIHsKLQotICAgICAgICBqYXh3c0NvbnRleHQucHV0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ0xJRU5UX0hBTkRMRV9QUk9QRVJUWSwgdGhpcyk7Ci0KLSAgICAgICAgaWYgKGpheHdzQ29udGV4dC5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpID09IG51bGwpCi0gICAgICAgICAgICBqYXh3c0NvbnRleHQucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBfcG9ydEluZm8uZ2V0VGFyZ2V0RW5kcG9pbnQoKSk7Ci0KLSAgICAgICAgamF4d3NDb250ZXh0LnB1dChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkJJTkRJTkdfSURfUFJPUEVSVFksIF9nZXRCaW5kaW5nSWQoKS50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKF9qYXhiQ29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgamF4d3NDb250ZXh0LnB1dChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWEJfQ09OVEVYVF9QUk9QRVJUWSwgX2pheGJDb250ZXh0KTsKLSAgICAgICAgbWVzc2FnZVN0cnVjdC5zZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFksCi0gICAgICAgICAgICBqYXh3c0NvbnRleHQpOwotCi0gICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TWV0YURhdGEoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfTU9ERSwgX21vZGUpOwotICAgICAgICBpZiAoX2NsYXp6ICE9IG51bGwpCi0gICAgICAgICAgICBtZXNzYWdlU3RydWN0LnNldE1ldGFEYXRhKERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFX0NMQVNTLCBfY2xhenopOwotCi0gICAgICAgIERpc3BhdGNoQ29udGV4dCBjb250ZXh0ID0gc2V0RGlzcGF0Y2hDb250ZXh0KGpheHdzQ29udGV4dCwgb2JqLCBfbW9kZSk7Ci0gICAgICAgIG1lc3NhZ2VTdHJ1Y3Quc2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5ESVNQQVRDSF9DT05URVhULCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gKEJpbmRpbmcpIGJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3NldEJpbmRpbmcoQmluZGluZ0ltcGwgYmluZGluZykgewotICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgIH0KLQotICAgIC8vIGRlZmF1bHQgZm9yIG5vdyBpcyBzb2FwIGJpbmRpbmcKLSAgICBwdWJsaWMgU3RyaW5nIF9nZXRCaW5kaW5nSWQoKSB7Ci0gICAgICAgIF9iaW5kaW5nSWQgPSBfcG9ydEluZm8uZ2V0QmluZGluZ0lkKCk7Ci0gICAgICAgIGlmIChfYmluZGluZ0lkID09IG51bGwpIHsKLSAgICAgICAgICAgIF9iaW5kaW5nSWQgPSBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9iaW5kaW5nSWQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGpheHdzQ29udGV4dCB0aGF0IGlzIHVzZWQgaW4gcHJvY2Vzc2luZyByZXF1ZXN0IG1lc3NhZ2VzLgotICAgICAqIDxwLz4KLSAgICAgKiBNb2RpZmljYXRpb25zIHRvIHRoZSByZXF1ZXN0IGNvbnRleHQgZG8gbm90IGFmZmVjdCBhc3luY2hyb25vdXMKLSAgICAgKiBvcGVyYXRpb25zIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gc3RhcnRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGpheHdzQ29udGV4dCB0aGF0IGlzIHVzZWQgaW4gcHJvY2Vzc2luZyByZXF1ZXN0IG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0UmVxdWVzdENvbnRleHQoKSB7Ci0gICAgICAgIGlmIChfcmVxdWVzdENvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIF9yZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCh0aGlzKTsKLQotICAgICAgICByZXR1cm4gX3JlcXVlc3RDb250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRSZXNwb25zZUNvbnRleHQoUmVzcG9uc2VDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgX3Jlc3BvbnNlQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBqYXh3c0NvbnRleHQgdGhhdCByZXN1bHRlZCBmcm9tIHByb2Nlc3NpbmcgYSByZXNwb25zZSBtZXNzYWdlLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgcmV0dXJuZWQgY29udGV4dCBpcyBmb3IgdGhlIG1vc3QgcmVjZW50bHkgY29tcGxldGVkIHN5bmNocm9ub3VzCi0gICAgICogb3BlcmF0aW9uLiBTdWJzZXF1ZW50IHN5bmNocm9ub3VzIG9wZXJhdGlvbiBpbnZvY2F0aW9ucyBvdmVyd3JpdGUgdGhlCi0gICAgICogcmVzcG9uc2UgY29udGV4dC4gQXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcmV0dXJuIHRoZWlyIHJlc3BvbnNlIGNvbnRleHQKLSAgICAgKiB2aWEgdGhlIFJlc3BvbnNlIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGpheHdzQ29udGV4dCB0aGF0IGlzIHVzZWQgaW4gcHJvY2Vzc2luZyByZXF1ZXN0IG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0UmVzcG9uc2VDb250ZXh0KCkgewotICAgICAgICBpZiAoX3Jlc3BvbnNlQ29udGV4dCA9PSBudWxsKQotICAgICAgICAgICAgX3Jlc3BvbnNlQ29udGV4dCA9IG5ldyBSZXNwb25zZUNvbnRleHQodGhpcyk7Ci0gICAgICAgIHJldHVybiBfcmVzcG9uc2VDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBEaXNwYXRjaENvbnRleHQgc2V0RGlzcGF0Y2hDb250ZXh0KE1hcCBqYXh3c0NvbnRleHQsIE9iamVjdCBvYmosIFNlcnZpY2UuTW9kZSBtb2RlKSB7Ci0KLSAgICAgICAgRGlzcGF0Y2hDb250ZXh0IGNvbnRleHQgPSBuZXcgRGlzcGF0Y2hDb250ZXh0KCk7Ci0gICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfTU9ERSwgbW9kZSk7Ci0KLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRV9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VDbGFzcy5TT1VSQ0UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTT0FQTWVzc2FnZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgIERpc3BhdGNoQ29udGV4dC5NZXNzYWdlQ2xhc3MuU09BUE1FU1NBR0UpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgob2JqIGluc3RhbmNlb2YgRGF0YVNvdXJjZSkgJiYKLSAgICAgICAgICAgICAgICBfZ2V0QmluZGluZ0lkKCkudG9TdHJpbmcoKS5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgIERpc3BhdGNoQ29udGV4dC5NZXNzYWdlQ2xhc3MuREFUQVNPVVJDRSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoX2pheGJDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5KERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICBEaXNwYXRjaENvbnRleHQuTWVzc2FnZUNsYXNzLkpBWEJPQkpFQ1QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9nZXRCaW5kaW5nSWQoKS50b1N0cmluZygpLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG5vdCBhIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIG9yIHRoZXJlIGlzIG5vIEpBWEIgQ29udGV4dCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9jbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoX2NsYXp6LmlzQXNzaWduYWJsZUZyb20oU291cmNlLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIGlmIChtb2RlID09IFBBWUxPQUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9nZXRCaW5kaW5nSWQoKS50b1N0cmluZygpLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRSwgRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLkhUVFBfU09VUkNFX1BBWUxPQUQpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5KERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFLCBEaXNwYXRjaENvbnRleHQuTWVzc2FnZVR5cGUuU09VUkNFX1BBWUxPQUQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBNRVNTQUdFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfZ2V0QmluZGluZ0lkKCkudG9TdHJpbmcoKS5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0UsIERpc3BhdGNoQ29udGV4dC5NZXNzYWdlVHlwZS5IVFRQX1NPVVJDRV9NRVNTQUdFKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRSwgRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLlNPVVJDRV9NRVNTQUdFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKF9jbGF6ei5pc0Fzc2lnbmFibGVGcm9tKFNPQVBNZXNzYWdlLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIGlmIChtb2RlID09IFBBWUxPQUQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlNPQVBNZXNzYWdlcyBtdXN0IGJlIFNlcnZpY2UuTW9kZS5NRVNTQUdFLiAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTUVTU0FHRSkKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRSwgRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLlNPQVBNRVNTQUdFX01FU1NBR0UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChfY2xhenouaXNBc3NpZ25hYmxlRnJvbShEYXRhU291cmNlLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIGlmIChtb2RlID09IFBBWUxPQUQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJDYW4gbm90IGhhdmUgYSBEYXRhaGFuZGxlciBjbGFzcyB3aXRoIG1vZGUgUEFZTE9BRCIpOwotICAgICAgICAgICAgICAgICAgICAvL2NvbnRleHQuc2V0UHJvcGVydHkoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0UsIERpc3BhdGNoQ29udGV4dC5NZXNzYWdlVHlwZS5IVFRQX0RBVEFTT1VSQ0VfUEFZTE9BRCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PSBNRVNTQUdFKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5KERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFLCBEaXNwYXRjaENvbnRleHQuTWVzc2FnZVR5cGUuSFRUUF9EQVRBU09VUkNFX01FU1NBR0UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5KERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFX0NMQVNTLCBfY2xhenopOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGhhc0pBWEJDb250ZXh0KG9iaiwgbnVsbCkpIHsKLSAgICAgICAgICAgIGlmIChtb2RlID09IFBBWUxPQUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoX2dldEJpbmRpbmdJZCgpLnRvU3RyaW5nKCkuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0UsIERpc3BhdGNoQ29udGV4dC5NZXNzYWdlVHlwZS5IVFRQX0pBWEJfUEFZTE9BRCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5KERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFLCBEaXNwYXRjaENvbnRleHQuTWVzc2FnZVR5cGUuSkFYQl9QQVlMT0FEKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBNRVNTQUdFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKF9nZXRCaW5kaW5nSWQoKS50b1N0cmluZygpLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiIENhbiBub3QgaGF2ZSBhIEpBWEIgb2JqZWN0IHdpdGggbW9kZSBNRVNTQUdFIik7Ci0gICAgICAgICAgICAgICAgICAgIC8vY29udGV4dC5zZXRQcm9wZXJ0eShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRSwgRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLkhUVFBfSkFYQl9NRVNTQUdFKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0UsIERpc3BhdGNoQ29udGV4dC5NZXNzYWdlVHlwZS5KQVhCX01FU1NBR0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgRXhlY3V0b3IgZ2V0Q3VycmVudEV4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gX3NlcnZpY2UuZ2V0RXhlY3V0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIGlmIChfc2VydmljZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9zZXJ2aWNlLmdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsKLSAgICAgICAgaWYgKF9wb3J0SW5mbyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIF9wb3J0SW5mby5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkTnVsbFBhcmFtZXRlcihPYmplY3QgbXNnKSB7Ci0gICAgICAgIGlmIChtc2cgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIFN0cmluZyBtZXRob2QgPSAoU3RyaW5nKSBnZXRSZXF1ZXN0Q29udGV4dCgpLmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9EKTsKLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQotICAgICAgICAgICAgbWV0aG9kID0gIlBPU1QiOwotCi0gICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSBfZ2V0QmluZGluZ0lkKCkudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKCgiUE9TVCIuZXF1YWxzSWdub3JlQ2FzZShtZXRob2QpKSkgewotCi0gICAgICAgICAgICBpZiAoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLmVxdWFscyhiaW5kaW5nSWQpIHx8Ci0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdJZCkpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKF9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJTT0FQIDEuMSBCaW5kaW5nIHdpdGggbnVsbCBpbnZvY2F0aW9uIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZCB3aXRoIEhUVFAgUE9TVCBSZXF1ZXN0IE1ldGhvZCBpbiBNRVNTQUdFIG1vZGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBBWUxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEhUVFBCaW5kaW5nLkhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ0lkKSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoX21vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFBBWUxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiWE1ML0hUVFAgQmluZGluZyB3aXRoIG51bGwgaW52b2NhdGlvbiBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQgd2l0aCBIVFRQIFBPU1QgUmVxdWVzdCBNZXRob2QgaW4gTUVTU0FHRSBvciBQQVlMT0FEIG1vZGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLmVxdWFscyhiaW5kaW5nSWQpIHx8Ci0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdJZCkpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKF9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJTT0FQIDEuMiBCaW5kaW5nIHdpdGggbnVsbCBpbnZvY2F0aW9uIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZCB3aXRoIEhUVFAgUE9TVCBSZXF1ZXN0IE1ldGhvZCBpbiBNRVNTQUdFIG1vZGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBBWUxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICgiR0VUIi5lcXVhbHNJZ25vcmVDYXNlKG1ldGhvZCkpIHsKLQotICAgICAgICAgICAgaWYgKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ0lkKSB8fAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLmVxdWFscyhiaW5kaW5nSWQpKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChfbW9kZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJTT0FQIDEuMiBCaW5kaW5nIHdpdGggbnVsbCBpbnZvY2F0aW9uIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZCB3aXRoIEhUVFAgR0VUIFJlcXVlc3QgTWV0aG9kIGluIE1FU0FHRSBtb2RlLiIpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBBWUxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ0lkKSB8fAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HLmVxdWFscyhiaW5kaW5nSWQpKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChfbW9kZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUEFZTE9BRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJTT0FQIDEuMSBCaW5kaW5nIHdpdGggbnVsbCBpbnZvY2F0aW9uIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZCB3aXRoIEhUVFAgR0VUIFJlcXVlc3QgTWV0aG9kIGluIGVpdGhlciBQQVlMT0FEIG9yIE1FU0FHRSBtb2RlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdJZCkpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKF9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQQVlMT0FEOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoIkRFTEVURSIuZXF1YWxzSWdub3JlQ2FzZShtZXRob2QpIHx8ICJIRUFEIi5lcXVhbHNJZ25vcmVDYXNlKG1ldGhvZCkpIHsKLQotICAgICAgICAgICAgaWYgKEhUVFBCaW5kaW5nLkhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ0lkKSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoX21vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFBBWUxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ0lkKSB8fAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLmVxdWFscyhiaW5kaW5nSWQpKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChfbW9kZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJTT0FQIDEuMiBCaW5kaW5nIHdpdGggbnVsbCBpbnZvY2F0aW9uIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZCB3aXRoIEhUVFAgIiArIG1ldGhvZCArICIgUmVxdWVzdCBNZXRob2QgaW4gTUVTQUdFIG1vZGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUEFZTE9BRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLmVxdWFscyhiaW5kaW5nSWQpIHx8Ci0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdJZCkpIHsKLSAgICAgICAgICAgICAgICAvL3JldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiU09BUCAxLjEgQmluZGluZyB3aXRoIG51bGwgaW52b2NhdGlvbiBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQgd2l0aCBIVFRQICIgKyBtZXRob2QgKyAiIFJlcXVlc3QgTWV0aG9kIGluIGVpdGhlciBQQVlMT0FEIG9yIE1FU0FHRSBtb2RlLiIpOwotICAgICAgICAgICAgICAgIC8vcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENsaWVudFRyYW5zcG9ydEZhY3RvcnkgZGVmYXVsdFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQotICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKG5ldyBTdHJpbmdCdWZmZXIoKS5hcHBlbmQoY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db25zdGFudHMuTG9nZ2luZ0RvbWFpbikuYXBwZW5kKCIuY2xpZW50LmRpc3BhdGNoIikudG9TdHJpbmcoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIF9yZXF1ZXN0Q29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTWFwIF9yZXNwb25zZUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2UuTW9kZSBfbW9kZTsKLSAgICBwcm90ZWN0ZWQgV1NTZXJ2aWNlRGVsZWdhdGUgX3NlcnZpY2U7Ci0gICAgcHJvdGVjdGVkIENsYXNzIF9jbGF6ejsKLSAgICBwcm90ZWN0ZWQgSkFYQkNvbnRleHQgX2pheGJDb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIERlbGVnYXRlIF9kZWxlZ2F0ZSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFBvcnRJbmZvQmFzZSBfcG9ydEluZm8gPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBfYmluZGluZ0lkID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQmluZGluZ0ltcGwgYmluZGluZzsKLQotICAgIHByaXZhdGUgQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBfdHJhbnNwb3J0RmFjdG9yeTsKLSAgICBwcml2YXRlIExvY2sgX2xvY2s7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaENvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxM2Q3OS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiAkYXV0aG9yOiBKQVhXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaENvbnRleHQgewotCi0gICAgcHJpdmF0ZSBIYXNoTWFwIGRwcm9wcyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGlzcGF0Y2hDb250ZXh0KCkgewotICAgICAgICBkcHJvcHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgZHByb3BzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZHByb3BzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICBkcHJvcHMucmVtb3ZlKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyUHJvcGVydGllcygpIHsKLSAgICAgICAgZHByb3BzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUEFUQ0hfTUVTU0FHRSA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5ydC5jbGllbnQuZGlzcGF0Y2gubWVzc2FnZXR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BBVENIX01FU1NBR0VfTU9ERSA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5ydC5jbGllbnQuZGlzcGF0Y2gubW9kZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUEFUQ0hfTUVTU0FHRV9DTEFTUyA9Ci0gICAgICAgICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5ydC5jbGllbnQuZGlzcGF0Y2gubWVzc2FnZWNsYXNzIjsKLQotICAgIHB1YmxpYyBlbnVtIE1lc3NhZ2VDbGFzcyB7Ci0gICAgICAgIFNPVVJDRSAsSkFYQk9CSkVDVCwgU09BUE1FU1NBR0UsIERBVEFTT1VSQ0UKLSAgICB9Ci0KLSAgICBwdWJsaWMgZW51bSBNZXNzYWdlVHlwZSB7Ci0gICAgICAgIEpBWEJfUEFZTE9BRCwgICAgICAgICAgICAgLy9TT0FQIEJpbmRpbmcKLSAgICAgICAgU09VUkNFX1BBWUxPQUQsCi0gICAgICAgIEpBWEJfTUVTU0FHRSwKLSAgICAgICAgU09VUkNFX01FU1NBR0UgLAotICAgICAgICBTT0FQTUVTU0FHRV9NRVNTQUdFLAotICAgICAgICAvL0hUVFBfREFUQVNPVVJDRV9QQVlMT0FELCAgLy9IVFRQIEJpbmRpbmcKLSAgICAgICAgSFRUUF9EQVRBU09VUkNFX01FU1NBR0UsCi0gICAgICAgIEhUVFBfU09VUkNFX01FU1NBR0UsIC8vY2FuIGJlIGFsbG93ZWQgd2l0aCBhbiBIVFRQIEdFVCBtZXRob2QKLSAgICAgICAgSFRUUF9TT1VSQ0VfUEFZTE9BRCwKLSAgICAgICAgSFRUUF9KQVhCX1BBWUxPQUQsCi0gICAgICAgIC8vSFRUUF9KQVhCX01FU1NBR0UKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlZTA5OAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaEltcGwuamF2YQpAQCAtMCwwICsxLDQ1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5XU0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5GaWJlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkFzeW5jSW52b2tlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQXN5bmNSZXNwb25zZUltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlJlcXVlc3RDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlJlc3BvbnNlQ29udGV4dFJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TdHViOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLkRlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5mYXVsdC5TT0FQRmF1bHRCdWlsZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQXR0YWNobWVudFNldEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5EYXRhSGFuZGxlckF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkRpc3BhdGNoTWVzc2FnZXM7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOworaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworCisvKioKKyAqIFRoZSA8Y29kZT5EaXNwYXRjaEltcGw8L2NvZGU+IGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQKKyAqIGZvciB0aGUgZHluYW1pYyBpbnZvY2F0aW9uIG9mIGEgc2VydmljZSBlbmRwb2ludCBvcGVyYXRpb24gdXNpbmcgWE1MCisgKiBjb25zdHJ1Y3RzLCBKQVhCIG9iamVjdHMgb3IgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+LiBUaGUgPGNvZGU+amF2YXgueG1sLndzLlNlcnZpY2U8L2NvZGU+CisgKiBpbnRlcmZhY2UgYWN0cyBhcyBhIGZhY3RvcnkgZm9yIHRoZSBjcmVhdGlvbiBvZiA8Y29kZT5EaXNwYXRjaEltcGw8L2NvZGU+CisgKiBpbnN0YW5jZXMuCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERpc3BhdGNoSW1wbDxUPiBleHRlbmRzIFN0dWIgaW1wbGVtZW50cyBEaXNwYXRjaDxUPiB7CisKKyAgICBmaW5hbCBTZXJ2aWNlLk1vZGUgbW9kZTsKKyAgICBmaW5hbCBRTmFtZSBwb3J0bmFtZTsKKyAgICBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBBV0FJVF9URVJNSU5BVElPTl9USU1FID0gODAwTDsKKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnQgICAgZGlzcGF0Y2ggaW5zdGFuY2UgaXMgYXNzc29jaWF0ZWQgd2l0aCB0aGlzIHdzZGwgcG9ydCBxTmFtZQorICAgICAqIEBwYXJhbSBtb2RlICAgIFNlcnZpY2UubW9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBEaXNwYXRjaCBpbnN0YW5jZSAtIFNlcnZpY2UubW9kZS5NRVNTQUdFIG9yIFNlcnZpY2UubW9kZS5QQVlMT0FECisgICAgICogQHBhcmFtIG93bmVyICAgU2VydmljZSB0aGF0IGNyZWF0ZWQgdGhlIERpc3BhdGNoCisgICAgICogQHBhcmFtIHBpcGUgICAgTWFzdGVyIHBpcGUgZm9yIHRoZSBwaXBlbGluZQorICAgICAqIEBwYXJhbSBiaW5kaW5nIEJpbmRpbmcgb2YgdGhpcyBEaXNwYXRjaCBpbnN0YW5jZSwgY3VycmVudCBvbmUgb2YgU09BUC9IVFRQIG9yIFhNTC9IVFRQCisgICAgICovCisgICAgcHJvdGVjdGVkIERpc3BhdGNoSW1wbChRTmFtZSBwb3J0LCBTZXJ2aWNlLk1vZGUgbW9kZSwgV1NTZXJ2aWNlRGVsZWdhdGUgb3duZXIsIFR1YmUgcGlwZSwgQmluZGluZ0ltcGwgYmluZGluZywgQE51bGxhYmxlIFdTRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7CisgICAgICAgIHN1cGVyKG93bmVyLCBwaXBlLCBiaW5kaW5nLCAob3duZXIuZ2V0V3NkbFNlcnZpY2UoKSAhPSBudWxsKT8gb3duZXIuZ2V0V3NkbFNlcnZpY2UoKS5nZXQocG9ydCkgOiBudWxsICwgb3duZXIuZ2V0RW5kcG9pbnRBZGRyZXNzKHBvcnQpLCBlcHIpOworICAgICAgICB0aGlzLnBvcnRuYW1lID0gcG9ydDsKKyAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBtZXRob2QgdGhhdCBpcyBpbXBsZW1lbnRlZCBieSBlYWNoIGNvbmNyZXRlIERpc3BhdGNoIGNsYXNzCisgICAgICogQHBhcmFtIG1zZyAgbWVzc2FnZSBwYXNzZWQgaW4gZnJvbSB0aGUgY2xpZW50IHByb2dyYW0gb24gdGhlIGludm9jYXRpb24KKyAgICAgKiBAcmV0dXJuICBUaGUgTWVzc2FnZSBjcmVhdGVkIHJldHVybmVkIGFzIHRoZSBJbnRlcmZhY2UgaW4gYWN0dWFsbGl0eSBhCisgICAgICogICAgICAgICAgY29uY3JldGUgTWVzc2FnZSBUeXBlCisgICAgICovCisgICAgYWJzdHJhY3QgUGFja2V0IGNyZWF0ZVBhY2tldChUIG1zZyk7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIHRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBUIHRvUmV0dXJuVmFsdWUoUGFja2V0IHJlc3BvbnNlKTsKKworICAgIHB1YmxpYyBmaW5hbCBSZXNwb25zZTxUPiBpbnZva2VBc3luYyhUIHBhcmFtKSB7CisgICAgICAgIEFzeW5jSW52b2tlciBpbnZva2VyID0gbmV3IERpc3BhdGNoQXN5bmNJbnZva2VyKHBhcmFtKTsKKyAgICAgICAgQXN5bmNSZXNwb25zZUltcGw8VD4gZnQgPSBuZXcgQXN5bmNSZXNwb25zZUltcGw8VD4oaW52b2tlcixudWxsKTsKKyAgICAgICAgaW52b2tlci5zZXRSZWNlaXZlcihmdCk7CisgICAgICAgIC8vIFRPRE86IERvIHdlIHNldCB0aGlzIGV4ZWN1dG9yIG9uIEVuZ2luZSBhbmQgcnVuIHRoZSBBc3luY0ludm9rZXIgaW4gdGhpcyB0aHJlYWQgPworICAgICAgICBvd25lci5nZXRFeGVjdXRvcigpLmV4ZWN1dGUoZnQpOworICAgICAgICByZXR1cm4gZnQ7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIEZ1dHVyZTw/PiBpbnZva2VBc3luYyhUIHBhcmFtLCBBc3luY0hhbmRsZXI8VD4gYXN5bmNIYW5kbGVyKSB7CisgICAgICAgIEFzeW5jSW52b2tlciBpbnZva2VyID0gbmV3IERpc3BhdGNoQXN5bmNJbnZva2VyKHBhcmFtKTsKKyAgICAgICAgQXN5bmNSZXNwb25zZUltcGw8VD4gZnQgPSBuZXcgQXN5bmNSZXNwb25zZUltcGw8VD4oaW52b2tlcixhc3luY0hhbmRsZXIpOworICAgICAgICBpbnZva2VyLnNldFJlY2VpdmVyKGZ0KTsKKworICAgICAgICAvLyB0ZW1wIG5lZWRlZCBzbyB0aGF0IHVuaXQgdGVzdHMgcnVuIGFuZCBjb21wbGV0ZSBvdGhlcndpc2UgdGhleSBtYXkKKyAgICAgICAgLy9ub3QuIE5lZWQgYSB3YXkgdG8gcHV0IHRoaXMgaW4gdGhlIHRlc3QgaGFybmVzcyBvciBvdGhlciB3YXkgdG8gZG8gdGhpcworICAgICAgICAvL3RvZG86IGFzIGFib3ZlCisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjID0gKEV4ZWN1dG9yU2VydmljZSkgb3duZXIuZ2V0RXhlY3V0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWMuYXdhaXRUZXJtaW5hdGlvbihBV0FJVF9URVJNSU5BVElPTl9USU1FLCBUaW1lVW5pdC5NSUNST1NFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBleGVjLmV4ZWN1dGUoZnQpOworICAgICAgICByZXR1cm4gZnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3luY2hyb25vdXNseSBpbnZva2VzIGEgc2VydmljZS4KKyAgICAgKgorICAgICAqIFNlZSB7QGxpbmsgI3Byb2Nlc3MoUGFja2V0LCBSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXIpfSBvbgorICAgICAqIHdoeSBpdCB0YWtlcyBhIHtAbGluayBSZXF1ZXN0Q29udGV4dH0gYW5kIHtAbGluayBSZXNwb25zZUNvbnRleHRSZWNlaXZlcn0gYXMgYSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFQgZG9JbnZva2UoVCBpbiwgUmVxdWVzdENvbnRleHQgcmMsIFJlc3BvbnNlQ29udGV4dFJlY2VpdmVyIHJlY2VpdmVyKXsKKyAgICAgICAgUGFja2V0IHJlc3BvbnNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tOdWxsQWxsb3dlZChpbiwgcmMsIGJpbmRpbmcsIG1vZGUpOworCisgICAgICAgICAgICBQYWNrZXQgbWVzc2FnZSA9IGNyZWF0ZVBhY2tldChpbik7CisgICAgICAgICAgICByZXNvbHZlRW5kcG9pbnRBZGRyZXNzKG1lc3NhZ2UsIHJjKTsKKyAgICAgICAgICAgIHNldFByb3BlcnRpZXMobWVzc2FnZSx0cnVlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gcHJvY2VzcyhtZXNzYWdlLHJjLHJlY2VpdmVyKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gcmVzcG9uc2UuZ2V0TWVzc2FnZSgpOworCisgICAgICAgICAgICBpZihtc2cgIT0gbnVsbCAmJiBtc2cuaXNGYXVsdCgpKSB7CisgICAgICAgICAgICAgICAgU09BUEZhdWx0QnVpbGRlciBmYXVsdEJ1aWxkZXIgPSBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZShtc2cpOworICAgICAgICAgICAgICAgIC8vIHBhc3NpbmcgbnVsbCBtZWFucyB0aGVyZSBpcyBubyBjaGVja2VkIGV4Y3BldGlvbiB3ZSdyZSBsb29raW5nIGZvciBhbGwKKyAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGdldCBiYWNrIHRvIHVzIGlzIGEgcHJvdG9jb2wgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgdGhyb3cgKFNPQVBGYXVsdEV4Y2VwdGlvbilmYXVsdEJ1aWxkZXIuY3JlYXRlRXhjZXB0aW9uKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vVE9ETzogaTE4bmlmeQorICAgICAgICAgICAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbihEaXNwYXRjaE1lc3NhZ2VzLklOVkFMSURfUkVTUE9OU0VfREVTRVJJQUxJWkFUSU9OKCksZSk7CisgICAgICAgIH0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIC8vaXQgY291bGQgYmUgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIG9yIGEgUHJvdG9jb2xFeGNlcHRpb24gb3IgYW55IFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgICAgICAgIC8vIHJlc3VsdGluZyBkdWUgdG8gc29tZSBpbnRlcm5hbCBidWcuCisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBlKXsKKyAgICAgICAgICAgIC8vaXRzIHNvbWUgb3RoZXIgZXhjZXB0aW9uIHJlc3VsdGluZyBmcm9tIHVzZXIgZXJyb3IsIHdyYXAgaXQgaW4KKyAgICAgICAgICAgIC8vIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRvUmV0dXJuVmFsdWUocmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBUIGludm9rZShUIGluKSB7CisgICAgICAgIHJldHVybiBkb0ludm9rZShpbixyZXF1ZXN0Q29udGV4dCx0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZva2VPbmVXYXkoVCBpbikgeworCisgICAgICAgIGNoZWNrTnVsbEFsbG93ZWQoaW4sIHJlcXVlc3RDb250ZXh0LCBiaW5kaW5nLCBtb2RlKTsKKworICAgICAgICBQYWNrZXQgcmVxdWVzdCA9IGNyZWF0ZVBhY2tldChpbik7CisgICAgICAgIHNldFByb3BlcnRpZXMocmVxdWVzdCxmYWxzZSk7CisgICAgICAgIFBhY2tldCByZXNwb25zZSA9IHByb2Nlc3MocmVxdWVzdCxyZXF1ZXN0Q29udGV4dCx0aGlzKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFByb3BlcnRpZXMoUGFja2V0IHBhY2tldCwgYm9vbGVhbiBleHBlY3RSZXBseSkgeworICAgICAgICBwYWNrZXQuZXhwZWN0UmVwbHkgPSBleHBlY3RSZXBseTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpc1hNTEh0dHAoQE5vdE51bGwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmcuZ2V0QmluZGluZ0lkKCkuZXF1YWxzKEJpbmRpbmdJRC5YTUxfSFRUUCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gaXNQQVlMT0FETW9kZShATm90TnVsbCBTZXJ2aWNlLk1vZGUgbW9kZSkgeworICAgICAgICAgICByZXR1cm4gbW9kZSA9PSBTZXJ2aWNlLk1vZGUuUEFZTE9BRDsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja051bGxBbGxvd2VkKEBOdWxsYWJsZSBPYmplY3QgaW4sIFJlcXVlc3RDb250ZXh0IHJjLCBXU0JpbmRpbmcgYmluZGluZywgU2VydmljZS5Nb2RlIG1vZGUpIHsKKworICAgICAgICBpZiAoaW4gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvL1dpdGggSFRUUCBCaW5kaW5nIGEgbnVsbCBpbnZvY2F0aW9uIHBhcmFtZXRlciBjYW4gbm90IGJlIHVzZWQKKyAgICAgICAgLy93aXRoIEhUVFAgUmVxdWVzdCBNZXRob2QgPT0gUE9TVAorICAgICAgICBpZiAoaXNYTUxIdHRwKGJpbmRpbmcpKXsKKyAgICAgICAgICAgIGlmIChtZXRob2ROb3RPayhyYykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRGlzcGF0Y2hNZXNzYWdlcy5JTlZBTElEX05VTExBUkdfWE1MSFRUUF9SRVFVRVNUX01FVEhPRChIVFRQX1JFUVVFU1RfTUVUSE9EX1BPU1QsIEhUVFBfUkVRVUVTVF9NRVRIT0RfR0VUKSk7CisgICAgICAgIH0gZWxzZSB7IC8vc29hcEJpbmRpbmcKKyAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gU2VydmljZS5Nb2RlLk1FU1NBR0UgKQorICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKERpc3BhdGNoTWVzc2FnZXMuSU5WQUxJRF9OVUxMQVJHX1NPQVBfTVNHTU9ERShtb2RlLm5hbWUoKSwgU2VydmljZS5Nb2RlLlBBWUxPQUQudG9TdHJpbmcoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gbWV0aG9kTm90T2soQE5vdE51bGwgUmVxdWVzdENvbnRleHQgcmMpIHsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RNZXRob2QgPSAoU3RyaW5nKXJjLmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9EKTsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAocmVxdWVzdE1ldGhvZCA9PSBudWxsKT8gSFRUUF9SRVFVRVNUX01FVEhPRF9QT1NUOiByZXF1ZXN0TWV0aG9kOworICAgICAgICAvLyBpZiBtZXRob2QgPT0gcG9zdCBvciBwdXQgd2l0aCBhIG51bGwgaW52b2NhdGlvbiBwYXJhbWV0ZXIgaW4geG1sL2h0dHAgYmluZGluZyB0aGlzIGlzIG5vdCBvaworICAgICAgICByZXR1cm4gSFRUUF9SRVFVRVNUX01FVEhPRF9QT1NULmVxdWFsc0lnbm9yZUNhc2UocmVxdWVzdCkgfHwgSFRUUF9SRVFVRVNUX01FVEhPRF9QVVQuZXF1YWxzSWdub3JlQ2FzZShyZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tWYWxpZFNPQVBNZXNzYWdlRGlzcGF0Y2goV1NCaW5kaW5nIGJpbmRpbmcsIFNlcnZpY2UuTW9kZSBtb2RlKSB7CisgICAgICAgIC8vIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBpcyBvbmx5IHZhbGlkIGZvciBzb2FwIGJpbmRpbmcgYW5kIGluIFNlcnZpY2UuTW9kZS5NRVNTQUdFCisgICAgICAgIGlmIChEaXNwYXRjaEltcGwuaXNYTUxIdHRwKGJpbmRpbmcpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRGlzcGF0Y2hNZXNzYWdlcy5JTlZBTElEX1NPQVBNRVNTQUdFX0RJU1BBVENIX0JJTkRJTkcoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcgKyAiIG9yICIgKyBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKTsKKyAgICAgICAgaWYgKERpc3BhdGNoSW1wbC5pc1BBWUxPQURNb2RlKG1vZGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRGlzcGF0Y2hNZXNzYWdlcy5JTlZBTElEX1NPQVBNRVNTQUdFX0RJU1BBVENIX01TR01PREUobW9kZS5uYW1lKCksIFNlcnZpY2UuTW9kZS5NRVNTQUdFLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tWYWxpZERhdGFTb3VyY2VEaXNwYXRjaChXU0JpbmRpbmcgYmluZGluZywgU2VydmljZS5Nb2RlIG1vZGUpIHsKKyAgICAgICAgLy8gRGlzcGF0Y2g8RGF0YVNvdXJjZT4gaXMgb25seSB2YWxpZCB3aXRoIHhtbC9odHRwIGJpbmRpbmcgYW5kIGluIFNlcnZpY2UuTW9kZS5NRVNTQUdFCisgICAgICAgIGlmICghRGlzcGF0Y2hJbXBsLmlzWE1MSHR0cChiaW5kaW5nKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKERpc3BhdGNoTWVzc2FnZXMuSU5WQUxJRF9EQVRBU09VUkNFX0RJU1BBVENIX0JJTkRJTkcoIlNPQVAvSFRUUCIsIEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpOworICAgICAgICBpZiAoRGlzcGF0Y2hJbXBsLmlzUEFZTE9BRE1vZGUobW9kZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihEaXNwYXRjaE1lc3NhZ2VzLklOVkFMSURfREFUQVNPVVJDRV9ESVNQQVRDSF9NU0dNT0RFKG1vZGUubmFtZSgpLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRS50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIEBOb3ROdWxsIFFOYW1lIGdldFBvcnROYW1lKCkgeworICAgICAgICByZXR1cm4gcG9ydG5hbWU7CisgICAgfQorCisKKyAgICB2b2lkIHJlc29sdmVFbmRwb2ludEFkZHJlc3MoQE5vdE51bGwgUGFja2V0IG1lc3NhZ2UsIEBOb3ROdWxsIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgIC8vcmVzb2x2ZSBlbmRwb2ludCBsb29rIGZvciBxdWVyeSBwYXJhbWV0ZXJzLCBwYXRoSW5mbworICAgICAgICBTdHJpbmcgZW5kcG9pbnQgPSAoU3RyaW5nKSByZXF1ZXN0Q29udGV4dC5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOworICAgICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIGVuZHBvaW50ID0gbWVzc2FnZS5lbmRwb2ludEFkZHJlc3MudG9TdHJpbmcoKTsKKworICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSBudWxsOworICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSBudWxsOworICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0LlBBVEhfSU5GTykgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGhJbmZvID0gKFN0cmluZykgcmVxdWVzdENvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0LlBBVEhfSU5GTyk7CisKKyAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5RVUVSWV9TVFJJTkcpICE9IG51bGwpCisgICAgICAgICAgICBxdWVyeVN0cmluZyA9IChTdHJpbmcpIHJlcXVlc3RDb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5RVUVSWV9TVFJJTkcpOworCisKKyAgICAgICAgU3RyaW5nIHJlc29sdmVkRW5kcG9pbnQgPSBudWxsOworICAgICAgICBpZiAocGF0aEluZm8gIT0gbnVsbCB8fCBxdWVyeVN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXRoSW5mbyA9IGNoZWNrUGF0aChwYXRoSW5mbyk7CisgICAgICAgICAgICBxdWVyeVN0cmluZyA9IGNoZWNrUXVlcnkocXVlcnlTdHJpbmcpOworICAgICAgICAgICAgaWYgKGVuZHBvaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkkgZW5kcG9pbnRVUkkgPSBuZXcgVVJJKGVuZHBvaW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRFbmRwb2ludCA9IHJlc29sdmVVUkkoZW5kcG9pbnRVUkksIHBhdGhJbmZvLCBxdWVyeVN0cmluZyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRGlzcGF0Y2hNZXNzYWdlcy5JTlZBTElEX1VSSShlbmRwb2ludCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgcmVzb2x2ZWRFbmRwb2ludCk7CisgICAgICAgICAgICAvL21lc3NhZ2UuZW5kcG9pbnRBZGRyZXNzID0gRW5kcG9pbnRBZGRyZXNzLmNyZWF0ZShyZXNvbHZlZEVuZHBvaW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBATm90TnVsbCBTdHJpbmcgcmVzb2x2ZVVSSShATm90TnVsbCBVUkkgZW5kcG9pbnRVUkksIEBOdWxsYWJsZSBTdHJpbmcgcGF0aEluZm8sIEBOdWxsYWJsZSBTdHJpbmcgcXVlcnlTdHJpbmcpIHsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGZyYWdtZW50ID0gbnVsbDsKKyAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSByZXN1bHQ7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFVSSSB0cCA9IG5ldyBVUkkobnVsbCwgbnVsbCwgZW5kcG9pbnRVUkkuZ2V0UGF0aCgpLCBxdWVyeVN0cmluZywgbnVsbCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZW5kcG9pbnRVUkkucmVzb2x2ZSh0cCk7CisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKERpc3BhdGNoTWVzc2FnZXMuSU5WQUxJRF9RVUVSWV9TVFJJTkcocXVlcnlTdHJpbmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXJ5ID0gcmVzdWx0LmdldFF1ZXJ5KCk7CisgICAgICAgICAgICBmcmFnbWVudCA9IHJlc3VsdC5nZXRGcmFnbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSAocGF0aEluZm8gIT0gbnVsbCkgPyBwYXRoSW5mbyA6IGVuZHBvaW50VVJJLmdldFBhdGgoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB0ZW1wID0gbmV3IFVSSShudWxsLCBudWxsLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpOworICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50VVJJLnJlc29sdmUodGVtcCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRGlzcGF0Y2hNZXNzYWdlcy5JTlZBTElEX1VSSV9QQVRIX1FVRVJZKHBhdGggLHF1ZXJ5KSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihEaXNwYXRjaE1lc3NhZ2VzLklOVkFMSURfVVJJX1JFU09MVVRJT04ocGF0aCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrUGF0aChATnVsbGFibGUgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgLy9kb2VzIGl0IGJlZ2luIHdpdGggLworICAgICAgICByZXR1cm4gKHBhdGggPT0gbnVsbCB8fCBwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgPyBwYXRoIDogIi8iICsgcGF0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tRdWVyeShATnVsbGFibGUgU3RyaW5nIHF1ZXJ5KSB7CisgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAocXVlcnkuaW5kZXhPZignPycpID09IDApCisgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKERpc3BhdGNoTWVzc2FnZXMuSU5WQUxJRF9RVUVSWV9MRUFESU5HX0NIQVIocXVlcnkpKTsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5OworICAgIH0KKworCisgICAgcHJvdGVjdGVkIEF0dGFjaG1lbnRTZXQgc2V0T3V0Ym91bmRBdHRhY2htZW50cygpIHsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRhY2htZW50cyA9IChIYXNoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KQorICAgICAgICAgICAgICAgIGdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOworCisgICAgICAgIGlmIChhdHRhY2htZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBMaXN0PEF0dGFjaG1lbnQ+IGFsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEYXRhSGFuZGxlcj4gYXR0IDogYXR0YWNobWVudHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIERhdGFIYW5kbGVyQXR0YWNobWVudCBkaGEgPSBuZXcgRGF0YUhhbmRsZXJBdHRhY2htZW50KGF0dC5nZXRLZXkoKSwgYXR0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGFsaXN0LmFkZChkaGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRhY2htZW50U2V0SW1wbChhbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBBdHRhY2htZW50U2V0SW1wbCgpOworICAgIH0KKworICAgLyogcHJpdmF0ZSB2b2lkIGdldEluYm91bmRBdHRhY2htZW50cyhNZXNzYWdlIG1zZykgeworICAgICAgICBBdHRhY2htZW50U2V0IGF0dGFjaG1lbnRzID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7CisgICAgICAgIGlmICghYXR0YWNobWVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gaW4gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPigpOworICAgICAgICAgICAgZm9yIChBdHRhY2htZW50IGF0dGFjaG1lbnQgOiBhdHRhY2htZW50cykKKyAgICAgICAgICAgICAgICBpbi5wdXQoYXR0YWNobWVudC5nZXRDb250ZW50SWQoKSwgYXR0YWNobWVudC5hc0RhdGFIYW5kbGVyKCkpOworICAgICAgICAgICAgZ2V0UmVzcG9uc2VDb250ZXh0KCkucHV0KE1lc3NhZ2VDb250ZXh0LklOQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUywgaW4pOworICAgICAgICB9CisKKyAgICB9CisgICAgKi8KKworCisgICAgLyoqCisgICAgICogQ2FsbHMge0BsaW5rIERpc3BhdGNoSW1wbCNkb0ludm9rZShPYmplY3QsUmVxdWVzdENvbnRleHQsUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXIpfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEludm9rZXIgaW1wbGVtZW50cyBDYWxsYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVCBwYXJhbTsKKyAgICAgICAgLy8gc25hcHNob3QgdGhlIGNvbnRleHQgbm93LiB0aGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBjb25jdXJyZW5jeSBpc3N1ZSwKKyAgICAgICAgLy8gYW5kIGlzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdENvbnRleHQgcmMgPSByZXF1ZXN0Q29udGV4dC5jb3B5KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJlY2F1c2Ugb2YgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIG9yZGVyLAorICAgICAgICAgKiB3ZSBjYW4ndCB0YWtlIHRoaXMgYXMgYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFJlc3BvbnNlQ29udGV4dFJlY2VpdmVyIHJlY2VpdmVyOworCisgICAgICAgIEludm9rZXIoVCBwYXJhbSkgeworICAgICAgICAgICAgdGhpcy5wYXJhbSA9IHBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGRvSW52b2tlKHBhcmFtLHJjLHJlY2VpdmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UmVjZWl2ZXIoUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBEaXNwYXRjaEFzeW5jSW52b2tlciBleHRlbmRzIEFzeW5jSW52b2tlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVCBwYXJhbTsKKyAgICAgICAgLy8gc25hcHNob3QgdGhlIGNvbnRleHQgbm93LiB0aGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBjb25jdXJyZW5jeSBpc3N1ZSwKKyAgICAgICAgLy8gYW5kIGlzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdENvbnRleHQgcmMgPSByZXF1ZXN0Q29udGV4dC5jb3B5KCk7CisKKyAgICAgICAgRGlzcGF0Y2hBc3luY0ludm9rZXIoVCBwYXJhbSkgeworICAgICAgICAgICAgdGhpcy5wYXJhbSA9IHBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuICgpIHsKKyAgICAgICAgICAgIGNoZWNrTnVsbEFsbG93ZWQocGFyYW0sIHJjLCBiaW5kaW5nLCBtb2RlKTsKKyAgICAgICAgICAgIFBhY2tldCBtZXNzYWdlID0gY3JlYXRlUGFja2V0KHBhcmFtKTsKKyAgICAgICAgICAgIHJlc29sdmVFbmRwb2ludEFkZHJlc3MobWVzc2FnZSwgcmMpOworICAgICAgICAgICAgc2V0UHJvcGVydGllcyhtZXNzYWdlLHRydWUpOworICAgICAgICAgICAgRmliZXIuQ29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEZpYmVyLkNvbXBsZXRpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRpb24oQE5vdE51bGwgUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gcmVzcG9uc2UuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYobXNnICE9IG51bGwgJiYgbXNnLmlzRmF1bHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdEJ1aWxkZXIgZmF1bHRCdWlsZGVyID0gU09BUEZhdWx0QnVpbGRlci5jcmVhdGUobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzaW5nIG51bGwgbWVhbnMgdGhlcmUgaXMgbm8gY2hlY2tlZCBleGNwZXRpb24gd2UncmUgbG9va2luZyBmb3IgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBnZXQgYmFjayB0byB1cyBpcyBhIHByb3RvY29sIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChTT0FQRmF1bHRFeGNlcHRpb24pZmF1bHRCdWlsZGVyLmNyZWF0ZUV4Y2VwdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSW1wbC5zZXRSZXNwb25zZUNvbnRleHQobmV3IFJlc3BvbnNlQ29udGV4dChyZXNwb25zZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VJbXBsLnNldCh0b1JldHVyblZhbHVlKHJlc3BvbnNlKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBpMThuaWZ5CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUltcGwuc2V0KG51bGwsIG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oRGlzcGF0Y2hNZXNzYWdlcy5JTlZBTElEX1JFU1BPTlNFX0RFU0VSSUFMSVpBVElPTigpLGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgLy9pdCBjb3VsZCBiZSBhIFdlYlNlcnZpY2VFeGNlcHRpb24gb3IgYSBQcm90b2NvbEV4Y2VwdGlvbiBvciBhbnkgUnVudGltZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0aW5nIGR1ZSB0byBzb21lIGludGVybmFsIGJ1Zy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSW1wbC5zZXQobnVsbCwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpeworICAgICAgICAgICAgICAgICAgICAgICAgLy9pdHMgc29tZSBvdGhlciBleGNlcHRpb24gcmVzdWx0aW5nIGZyb20gdXNlciBlcnJvciwgd3JhcCBpdCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VJbXBsLnNldChudWxsLCBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0aW9uKEBOb3ROdWxsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZUltcGwuc2V0KG51bGwsIGVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcHJvY2Vzc0FzeW5jKG1lc3NhZ2UscmMsIGNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dGJvdW5kSGVhZGVycyhPYmplY3QuLi4gaGVhZGVycykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUkVRVUVTVF9NRVRIT0RfR0VUPSJHRVQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFVRVNUX01FVEhPRF9QT1NUPSJQT1NUIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUkVRVUVTVF9NRVRIT0RfUFVUPSJQVVQiOworCisgICAgcHVibGljIHN0YXRpYyBEaXNwYXRjaDxTb3VyY2U+IGNyZWF0ZVNvdXJjZURpc3BhdGNoKFFOYW1lIHBvcnQsIE1vZGUgbW9kZSwgV1NTZXJ2aWNlRGVsZWdhdGUgb3duZXIsIFR1YmUgcGlwZSwgQmluZGluZ0ltcGwgYmluZGluZywgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgaWYoaXNYTUxIdHRwKGJpbmRpbmcpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSRVNUU291cmNlRGlzcGF0Y2gocG9ydCxtb2RlLG93bmVyLHBpcGUsYmluZGluZyxlcHIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBTb3VyY2VEaXNwYXRjaChwb3J0LG1vZGUsb3duZXIscGlwZSxiaW5kaW5nLGVwcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL0pBWEJEaXNwYXRjaC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL0pBWEJEaXNwYXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjljZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvSkFYQkRpc3BhdGNoLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2g7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcnM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgPGNvZGU+SkFYQkRpc3BhdGNoPC9jb2RlPiBjbGFzcyBwcm92aWRlcyBzdXBwb3J0CisgKiBmb3IgdGhlIGR5bmFtaWMgaW52b2NhdGlvbiBvZiBhIHNlcnZpY2UgZW5kcG9pbnQgb3BlcmF0aW9uIHVzaW5nCisgKiBKQVhCIG9iamVjdHMuIFRoZSA8Y29kZT5qYXZheC54bWwud3MuU2VydmljZTwvY29kZT4KKyAqIGludGVyZmFjZSBhY3RzIGFzIGEgZmFjdG9yeSBmb3IgdGhlIGNyZWF0aW9uIG9mIDxjb2RlPkpBWEJEaXNwYXRjaDwvY29kZT4KKyAqIGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgSkFYQkRpc3BhdGNoIGV4dGVuZHMgRGlzcGF0Y2hJbXBsPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBKQVhCQ29udGV4dCBqYXhiY29udGV4dDsKKworICAgIHB1YmxpYyBKQVhCRGlzcGF0Y2goUU5hbWUgcG9ydCwgSkFYQkNvbnRleHQgamMsIFNlcnZpY2UuTW9kZSBtb2RlLCBXU1NlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlLCBUdWJlIHBpcGUsIEJpbmRpbmdJbXBsIGJpbmRpbmcsIFdTRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7CisgICAgICAgIHN1cGVyKHBvcnQsIG1vZGUsIHNlcnZpY2UsIHBpcGUsIGJpbmRpbmcsIGVwcik7CisgICAgICAgIHRoaXMuamF4YmNvbnRleHQgPSBqYzsKKyAgICB9CisKKworICAgIE9iamVjdCB0b1JldHVyblZhbHVlKFBhY2tldCByZXNwb25zZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGpheGJjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSByZXNwb25zZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBBWUxPQUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2cuPE9iamVjdD5yZWFkUGF5bG9hZEFzSkFYQih1bm1hcnNoYWxsZXIpOworICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgICAgICAgICAgICAgU291cmNlIHJlc3VsdCA9IG1zZy5yZWFkRW52ZWxvcGVBc1NvdXJjZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXJzaGFsbGVyLnVubWFyc2hhbChyZXN1bHQpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgZGlzcGF0Y2ggbW9kZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBQYWNrZXQgY3JlYXRlUGFja2V0KE9iamVjdCBtc2cpIHsKKyAgICAgICAgYXNzZXJ0IGpheGJjb250ZXh0ICE9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IGpheGJjb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKTsKKyAgICAgICAgICAgIG1hcnNoYWxsZXIuc2V0UHJvcGVydHkoImpheGIuZnJhZ21lbnQiLCBCb29sZWFuLlRSVUUpOworCisgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAobXNnID09IG51bGwpID8gTWVzc2FnZXMuY3JlYXRlRW1wdHkoc29hcFZlcnNpb24pOiBNZXNzYWdlcy5jcmVhdGUobWFyc2hhbGxlciwgbXNnLCBzb2FwVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhY2tldChtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dGJvdW5kSGVhZGVycyhPYmplY3QuLi4gaGVhZGVycykgeworICAgICAgICBpZihoZWFkZXJzPT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBIZWFkZXJbXSBobCA9IG5ldyBIZWFkZXJbaGVhZGVycy5sZW5ndGhdOworICAgICAgICBmb3IoIGludCBpPTA7IGk8aGwubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBpZihoZWFkZXJzW2ldPT1udWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBhbnkgSkFYQkNvbnRleHQuCisgICAgICAgICAgICBobFtpXSA9IEhlYWRlcnMuY3JlYXRlKChKQVhCUklDb250ZXh0KWpheGJjb250ZXh0LGhlYWRlcnNbaV0pOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldE91dGJvdW5kSGVhZGVycyhobCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL01lc3NhZ2VEaXNwYXRjaC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL01lc3NhZ2VEaXNwYXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTgzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvTWVzc2FnZURpc3BhdGNoLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOworaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7CisKKy8qKgorICoge0BsaW5rIERpc3BhdGNofSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIE1lc3NhZ2V9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBzaW5jZSAyLjEuMQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZURpc3BhdGNoIGV4dGVuZHMgRGlzcGF0Y2hJbXBsPE1lc3NhZ2U+IHsKKworICAgIHB1YmxpYyBNZXNzYWdlRGlzcGF0Y2goUU5hbWUgcG9ydCwgV1NTZXJ2aWNlRGVsZWdhdGUgc2VydmljZSwgVHViZSBwaXBlLCBCaW5kaW5nSW1wbCBiaW5kaW5nLCBXU0VuZHBvaW50UmVmZXJlbmNlIGVwcikgeworICAgICAgICBzdXBlcihwb3J0LCBNb2RlLk1FU1NBR0UsIHNlcnZpY2UsIHBpcGUsIGJpbmRpbmcsIGVwcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgTWVzc2FnZSB0b1JldHVyblZhbHVlKFBhY2tldCByZXNwb25zZSkgeworICAgICAgICByZXR1cm4gcmVzcG9uc2UuZ2V0TWVzc2FnZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIFBhY2tldCBjcmVhdGVQYWNrZXQoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXQobXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvUkVTVFNvdXJjZURpc3BhdGNoLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvUkVTVFNvdXJjZURpc3BhdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0NzhkYwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9SRVNUU291cmNlRGlzcGF0Y2guamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuV1NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LldTU2VydmljZURlbGVnYXRlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc291cmNlLlBheWxvYWRTb3VyY2VNZXNzYWdlOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOworaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiB7QGxpbmsgRGlzcGF0Y2h9IGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgU291cmNlfSBhbmQgWE1ML0hUVFAgYmluZGluZy4KKyAqCisgKiBAYXV0aG9yIEthdGh5IFdhbHNoCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAc2VlIFNPQVBTb3VyY2VEaXNwYXRjaAorICovCitmaW5hbCBjbGFzcyBSRVNUU291cmNlRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaEltcGw8U291cmNlPiB7CisKKyAgICBwdWJsaWMgUkVTVFNvdXJjZURpc3BhdGNoKFFOYW1lIHBvcnQsIE1vZGUgbW9kZSwgV1NTZXJ2aWNlRGVsZWdhdGUgb3duZXIsIFR1YmUgcGlwZSwgQmluZGluZ0ltcGwgYmluZGluZywgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgc3VwZXIocG9ydCwgbW9kZSwgb3duZXIsIHBpcGUsIGJpbmRpbmcsIGVwcik7CisgICAgICAgIGFzc2VydCBpc1hNTEh0dHAoYmluZGluZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgU291cmNlIHRvUmV0dXJuVmFsdWUoUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gcmVzcG9uc2UuZ2V0TWVzc2FnZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UoWE1MTWVzc2FnZS5nZXREYXRhU291cmNlKG1zZykuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgUGFja2V0IGNyZWF0ZVBhY2tldChTb3VyY2UgbXNnKSB7CisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKKworICAgICAgICBpZihtc2c9PW51bGwpCisgICAgICAgICAgICBtZXNzYWdlID0gTWVzc2FnZXMuY3JlYXRlRW1wdHkoc29hcFZlcnNpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFBheWxvYWRTb3VyY2VNZXNzYWdlKG51bGwsIG1zZywgc2V0T3V0Ym91bmRBdHRhY2htZW50cygpLCBzb2FwVmVyc2lvbik7CisKKyAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXQobWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL1Jlc3BvbnNlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL1Jlc3BvbnNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JlZWVmLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9SZXNwb25zZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQXN5bmNIYW5kbGVyU2VydmljZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuUmVzcG9uc2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmEucm1pLnNlcnZlci5VSUQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogVGhlIDxjb2RlPlJlc3BvbnNlPC9jb2RlPiBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyB1c2VkIHRvIG9idGFpbiB0aGUKLSAqIHBheWxvYWQgYW5kIGNvbnRleHQgYSBtZXNzYWdlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYW4gb3BlcmF0aW9uIGludm9jYXRpb24uCi0gKiBGb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBpbnZvY2F0aW9ucyBpdCBwcm92aWRlcyBhZGRpdGlvbmFsIG1ldGhvZHMgdG8KLSAqIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHJlcXVlc3QuCi0gKgotICogQGF1dGhvciBKQVhXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgUmVzcG9uc2VJbXBsPFQ+IGV4dGVuZHMgRnV0dXJlVGFzazxUPiBpbXBsZW1lbnRzIFJlc3BvbnNlPFQ+IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KLSAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihuZXcgU3RyaW5nQnVmZmVyKCkuYXBwZW5kKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4pLmFwcGVuZCgiLmNsaWVudC5kaXNwYXRjaCIpLnRvU3RyaW5nKCkpOwotICAgIHByaXZhdGUgVUlEIHVpZDsKLSAgICBwcml2YXRlIExvY2sgX2xvY2s7Ci0gICAgcHJpdmF0ZSBBc3luY0hhbmRsZXJTZXJ2aWNlIF9oYW5kbGVyU2VydmljZTsKLSAgICBwcml2YXRlIFJlc3BvbnNlQ29udGV4dCBfcmVzcG9uc2VDb250ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVyOwotCi0gICAgcHVibGljIFJlc3BvbnNlSW1wbChDYWxsYWJsZTxUPiBjYWxsYWJsZSkgewotICAgICAgICBzdXBlcihjYWxsYWJsZSk7Ci0gICAgICAgIF9sb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VJbXBsKFJ1bm5hYmxlIHJ1bmFibGUsIFQgcmVzdWx0KSB7Ci0gICAgICAgIHN1cGVyKHJ1bmFibGUsIHJlc3VsdCk7Ci0gICAgICAgIF9sb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLSAgICB9Ci0KLSAgICAvL3Byb3RlY3RlZCBtZXRob2QgbmVlZCB0byBvdmVyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uKEV4Y2VwdGlvbiBleCkgewotICAgICAgICBfbG9jay5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRFeGNlcHRpb24oZXgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgX2xvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoVCByZXN1bHQpIHsKLSAgICAgICAgX2xvY2subG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3VwZXIuc2V0KHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBfbG9jay51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRhaW5lZCByZXNwb25zZSBjb250ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGFpbmVkIHJlc3BvbnNlIGNvbnRleHQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiBhCi0gICAgICogICAgICAgICByZXNwb25zZSBpcyBub3QgeWV0IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDb250ZXh0KCkgewotICAgICAgICBpZiAoIWlzRG9uZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoX3Jlc3BvbnNlQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZUNvbnRleHQoTWFwIGNvbnRleHQpIHsKLSAgICAgICAgX3Jlc3BvbnNlQ29udGV4dCA9IChSZXNwb25zZUNvbnRleHQpIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFVJRChVSUQgaWQpIHsKLSAgICAgICAgdWlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBVSUQgZ2V0VUlEKCkgewotICAgICAgICByZXR1cm4gdWlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJTZXJ2aWNlKEFzeW5jSGFuZGxlclNlcnZpY2UgaGFuZGxlclNlcnZpY2UpIHsKLSAgICAgICAgX2hhbmRsZXJTZXJ2aWNlID0gaGFuZGxlclNlcnZpY2U7Ci0gICAgfQotCi0gICAgLy9nb3QgdG8gbG9jawotCi0gICAgcHVibGljIHZvaWQgZG9uZSgpIHsKLSAgICAgICAgX2xvY2subG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKQotICAgICAgICAgICAgICAgIF9oYW5kbGVyU2VydmljZS5leGVjdXRlV1NGdXR1cmUoKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgX2xvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvU09BUE1lc3NhZ2VEaXNwYXRjaC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL1NPQVBNZXNzYWdlRGlzcGF0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI0MDVlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL1NPQVBNZXNzYWdlRGlzcGF0Y2guamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuV1NTZXJ2aWNlRGVsZWdhdGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zYWFqLlNBQUpNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5EaXNwYXRjaE1lc3NhZ2VzOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUaGUgPGNvZGU+U09BUE1lc3NhZ2VEaXNwYXRjaDwvY29kZT4gY2xhc3MgcHJvdmlkZXMgc3VwcG9ydAorICogZm9yIHRoZSBkeW5hbWljIGludm9jYXRpb24gb2YgYSBzZXJ2aWNlIGVuZHBvaW50IG9wZXJhdGlvbiB1c2luZworICogdGhlIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPiBjbGFzcy4gVGhlIDxjb2RlPmphdmF4LnhtbC53cy5TZXJ2aWNlPC9jb2RlPgorICogaW50ZXJmYWNlIGFjdHMgYXMgYSBmYWN0b3J5IGZvciB0aGUgY3JlYXRpb24gb2YgPGNvZGU+U09BUE1lc3NhZ2VEaXNwYXRjaDwvY29kZT4KKyAqIGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgU09BUE1lc3NhZ2VEaXNwYXRjaCBleHRlbmRzIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5EaXNwYXRjaEltcGw8U09BUE1lc3NhZ2U+IHsKKyAgICBwdWJsaWMgU09BUE1lc3NhZ2VEaXNwYXRjaChRTmFtZSBwb3J0LCBTZXJ2aWNlLk1vZGUgbW9kZSwgV1NTZXJ2aWNlRGVsZWdhdGUgb3duZXIsIFR1YmUgcGlwZSwgQmluZGluZ0ltcGwgYmluZGluZywgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgc3VwZXIocG9ydCwgbW9kZSwgb3duZXIsIHBpcGUsIGJpbmRpbmcsIGVwcik7CisgICAgfQorCisgICAgUGFja2V0IGNyZWF0ZVBhY2tldChTT0FQTWVzc2FnZSBhcmcpIHsKKworICAgICAgICBpZiAoYXJnID09IG51bGwgJiYgIWlzWE1MSHR0cChiaW5kaW5nKSkKKyAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRGlzcGF0Y2hNZXNzYWdlcy5JTlZBTElEX05VTExBUkdfU09BUF9NU0dNT0RFKG1vZGUubmFtZSgpLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRC50b1N0cmluZygpKSk7CisKKyAgICAgICAgTWltZUhlYWRlcnMgbWhzID0gYXJnLmdldE1pbWVIZWFkZXJzKCk7CisgICAgICAgIC8vIFRPRE86IHRoZXNlIHR3byBsaW5lcyBzZWVtIGRhbmdlcm91cy4gSXQgc2hvdWxkIGJlIGxlZnQgdXAgdG8gdGhlIHRyYW5zcG9ydCBhbmQgY29kZWMKKyAgICAgICAgLy8gdG8gZGVjaWRlIGhvdyB0aGV5IGFyZSBzZW50LiByZW1vdmUgYWZ0ZXIgMi4xIEZDUyAtIEtLLgorICAgICAgICBtaHMuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC94bWwiKTsKKyAgICAgICAgbWhzLmFkZEhlYWRlcigiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIsICJiaW5hcnkiKTsKKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBjaCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcmcuZ2V0TWltZUhlYWRlcnMoKS5nZXRBbGxIZWFkZXJzKCk7IGl0ZXIuaGFzTmV4dCgpOykKKyAgICAgICAgeworICAgICAgICAgICAgTWltZUhlYWRlciBtaCA9IChNaW1lSGVhZGVyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBoLmFkZChtaC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGNoLnB1dChtaC5nZXROYW1lKCksIGgpOworICAgICAgICB9CisKKyAgICAgICAgUGFja2V0IHBhY2tldCA9IG5ldyBQYWNrZXQobmV3IFNBQUpNZXNzYWdlKGFyZykpOworICAgICAgICBwYWNrZXQuaW52b2NhdGlvblByb3BlcnRpZXMucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9IRUFERVJTLGNoKTsKKyAgICAgICAgcmV0dXJuIHBhY2tldDsKKyAgICB9CisKKyAgICBTT0FQTWVzc2FnZSB0b1JldHVyblZhbHVlKFBhY2tldCByZXNwb25zZSkgeworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvL25vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIGRlYWwgd2l0aCB0aGlzLgorICAgICAgICAgICAgaWYgKCByZXNwb25zZSA9PW51bGwgfHwgcmVzcG9uc2UuZ2V0TWVzc2FnZSgpID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRGlzcGF0Y2hNZXNzYWdlcy5JTlZBTElEX1JFU1BPTlNFKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRNZXNzYWdlKCkucmVhZEFzU09BUE1lc3NhZ2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9TT0FQU291cmNlRGlzcGF0Y2guamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9TT0FQU291cmNlRGlzcGF0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmFjM2M4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL1NPQVBTb3VyY2VEaXNwYXRjaC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2g7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5XU0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuV1NTZXJ2aWNlRGVsZWdhdGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zb3VyY2UuUGF5bG9hZFNvdXJjZU1lc3NhZ2U7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CisKKworLyoqCisgKiBUaGUgPGNvZGU+U09BUFNvdXJjZURpc3BhdGNoPC9jb2RlPiBjbGFzcyBwcm92aWRlcyBzdXBwb3J0CisgKiBmb3IgdGhlIGR5bmFtaWMgaW52b2NhdGlvbiBvZiBhIHNlcnZpY2UgZW5kcG9pbnQgb3BlcmF0aW9uIHVzaW5nIFhNTAorICogY29uc3RydWN0cy4gVGhlIDxjb2RlPmphdmF4LnhtbC53cy5TZXJ2aWNlPC9jb2RlPgorICogaW50ZXJmYWNlIGFjdHMgYXMgYSBmYWN0b3J5IGZvciB0aGUgY3JlYXRpb24gb2YgPGNvZGU+U09BUFNvdXJjZURpc3BhdGNoPC9jb2RlPgorICogaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQorICogQHZlcnNpb24gMS4wCisgKiBAc2VlIFJFU1RTb3VyY2VEaXNwYXRjaAorICovCitmaW5hbCBjbGFzcyBTT0FQU291cmNlRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaEltcGw8U291cmNlPiB7CisKKyAgICBwdWJsaWMgU09BUFNvdXJjZURpc3BhdGNoKFFOYW1lIHBvcnQsIE1vZGUgbW9kZSwgV1NTZXJ2aWNlRGVsZWdhdGUgb3duZXIsIFR1YmUgcGlwZSwgQmluZGluZ0ltcGwgYmluZGluZywgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKKyAgICAgICAgc3VwZXIocG9ydCwgbW9kZSwgb3duZXIsIHBpcGUsIGJpbmRpbmcsIGVwcik7CisgICAgICAgIGFzc2VydCAhaXNYTUxIdHRwKGJpbmRpbmcpOworICAgIH0KKworICAgIFNvdXJjZSB0b1JldHVyblZhbHVlKFBhY2tldCByZXNwb25zZSkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IHJlc3BvbnNlLmdldE1lc3NhZ2UoKTsKKworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBQQVlMT0FEOgorICAgICAgICAgICAgcmV0dXJuIG1zZy5yZWFkUGF5bG9hZEFzU291cmNlKCk7CisgICAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgICAgIHJldHVybiBtc2cucmVhZEVudmVsb3BlQXNTb3VyY2UoKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgZGlzcGF0Y2ggbW9kZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgUGFja2V0IGNyZWF0ZVBhY2tldChTb3VyY2UgbXNnKSB7CisKKyAgICAgICAgZmluYWwgTWVzc2FnZSBtZXNzYWdlOworCisgICAgICAgIGlmIChtc2cgPT0gbnVsbCkKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlcy5jcmVhdGVFbXB0eShzb2FwVmVyc2lvbik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIFBBWUxPQUQ6CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBQYXlsb2FkU291cmNlTWVzc2FnZShudWxsLCBtc2csIHNldE91dGJvdW5kQXR0YWNobWVudHMoKSwgc29hcFZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNRVNTQUdFOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlcy5jcmVhdGUobXNnLCBzb2FwVmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgbWVzc2FnZSBtb2RlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFBhY2tldChtZXNzYWdlKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL2ltcGwvRGlzcGF0Y2hDb250YWN0SW5mb0xpc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9pbXBsL0Rpc3BhdGNoQ29udGFjdEluZm9MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGViN2QuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL2ltcGwvRGlzcGF0Y2hDb250YWN0SW5mb0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5Db250YWN0SW5mb0xpc3Q7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuQ29udGFjdEluZm9MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkNvbnRhY3RJbmZvQmFzZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQ29udGFjdEluZm9MaXN0SXRlcmF0b3JCYXNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5pbXBsLnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVySGVscGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuY2xpZW50LlNPQVAxMlhNTERlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5jbGllbnQuU09BUDEyWE1MRW5jb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmNsaWVudC5TT0FQWE1MRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmNsaWVudC5TT0FQWE1MRW5jb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy54bWwuWE1MRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy54bWwuWE1MRW5jb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC54bWwuY2xpZW50LlhNTE1lc3NhZ2VEaXNwYXRjaGVyOwotCi0vKioKLSAqIEBhdXRob3I6IFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIERpc3BhdGNoQ29udGFjdEluZm9MaXN0IGltcGxlbWVudHMgQ29udGFjdEluZm9MaXN0IHsKLQotICAgIHB1YmxpYyBDb250YWN0SW5mb0xpc3RJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0KLSAgICAgICAgYXJyYXlMaXN0LmFkZChuZXcgQ29udGFjdEluZm9CYXNlKG51bGwsCi0gICAgICAgICAgICBuZXcgTWVzc2FnZURpc3BhdGNoZXJIZWxwZXIoKSwKLSAgICAgICAgICAgIG5ldyBTT0FQWE1MRW5jb2RlcigpLAotICAgICAgICAgICAgbmV3IFNPQVBYTUxEZWNvZGVyKCksU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKSk7Ci0gICAgICAgIGFycmF5TGlzdC5hZGQobmV3IENvbnRhY3RJbmZvQmFzZShudWxsLAotICAgICAgICAgICAgbmV3IE1lc3NhZ2VEaXNwYXRjaGVySGVscGVyKCksCi0gICAgICAgICAgICBuZXcgU09BUDEyWE1MRW5jb2RlcigpLAotICAgICAgICAgICAgbmV3IFNPQVAxMlhNTERlY29kZXIoKSwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKSk7Ci0gICAgICAgIGFycmF5TGlzdC5hZGQobmV3IENvbnRhY3RJbmZvQmFzZShudWxsLAotICAgICAgICAgICAgICAgIG5ldyBYTUxNZXNzYWdlRGlzcGF0Y2hlcigpLAotICAgICAgICAgICAgICAgIG5ldyBYTUxFbmNvZGVyKCksCi0gICAgICAgICAgICAgICAgbmV3IFhNTERlY29kZXIoKSwgSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSk7Ci0gICAgICAgIC8qYXJyYXlMaXN0LmFkZChuZXcgRGlzcGF0Y2hDb250YWN0SW5mbyhudWxsLAotICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlRGlzcGF0Y2hlckhlbHBlcihuZXcgRGlzcGF0Y2hFbmNvZGVyRGVjb2RlclV0aWwoKSksCi0gICAgICAgICAgICAgICAgbmV3IFNPQVBGYXN0RW5jb2RlcihuZXcgRGlzcGF0Y2hFbmNvZGVyRGVjb2RlclV0aWwoKSksCi0gICAgICAgICAgICAgICAgbmV3IFNPQVBGYXN0RGVjb2RlcihuZXcgRGlzcGF0Y2hFbmNvZGVyRGVjb2RlclV0aWwoKSkpKTsKLSAgICAgICAgICAqLwotICAgICAgICByZXR1cm4gbmV3IENvbnRhY3RJbmZvTGlzdEl0ZXJhdG9yQmFzZShhcnJheUxpc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9pbXBsL0Rpc3BhdGNoRGVsZWdhdGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9pbXBsL0Rpc3BhdGNoRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyNmRiYS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvaW1wbC9EaXNwYXRjaERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoLmltcGw7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5Db250YWN0SW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5Db250YWN0SW5mb0xpc3Q7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuQ29udGFjdEluZm9MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuRGVsZWdhdGVCYXNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC4qOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIERpc3BhdGNoRGVsZWdhdGUgZXh0ZW5kcyBEZWxlZ2F0ZUJhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9Ci0gICAgICAgIExvZ2dlci5nZXRMb2dnZXIobmV3IFN0cmluZ0J1ZmZlcigpLmFwcGVuZChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluKS5hcHBlbmQoIi5jbGllbnQuZGlzcGF0Y2giKS50b1N0cmluZygpKTsKLQotICAgIHB1YmxpYyBEaXNwYXRjaERlbGVnYXRlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEaXNwYXRjaERlbGVnYXRlKENvbnRhY3RJbmZvTGlzdCBjb250YWN0SW5mb0xpc3QpIHsKLSAgICAgICAgdGhpcy5jb250YWN0SW5mb0xpc3QgPSBjb250YWN0SW5mb0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZChNZXNzYWdlU3RydWN0IG1lc3NhZ2VTdHJ1Y3QpIHsKLSAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8gPSAoTWVzc2FnZUluZm8pIG1lc3NhZ2VTdHJ1Y3Q7Ci0KLSAgICAgICAgQ29udGV4dE1hcCBwcm9wZXJ0aWVzID0gKENvbnRleHRNYXApCi0gICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGRpc3BhdGNoID0gKEJpbmRpbmdQcm92aWRlcilwcm9wZXJ0aWVzLmdldChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NMSUVOVF9IQU5ETEVfUFJPUEVSVFkpOwotCi0gICAgICAgIGlmICghY29udGFjdEluZm9MaXN0Lml0ZXJhdG9yKCkuaGFzTmV4dCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oImNhbid0IHBpY2t1cCBtZXNzYWdlIGVuY29kZXIvZGVjb2Rlciwgbm8gQ29udGFjdEluZm8hIik7Ci0KLQotICAgICAgICBCaW5kaW5nSW1wbCBiaSA9IChCaW5kaW5nSW1wbClkaXNwYXRjaC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSBiaS5nZXRCaW5kaW5nSWQoKTsKLSAgICAgICAgQ29udGFjdEluZm8gY29udGFjdEluZm8gPSBnZXRDb250YWN0SW5mbyhjb250YWN0SW5mb0xpc3QsIGJpbmRpbmdJZCk7Ci0gICAgICAgIG1lc3NhZ2VJbmZvLnNldEVQVEZhY3RvcnkoY29udGFjdEluZm8pOwotICAgICAgICBtZXNzYWdlSW5mby5zZXRDb25uZWN0aW9uKGNvbnRhY3RJbmZvLmdldENvbm5lY3Rpb24obWVzc2FnZUluZm8pKTsKLQotICAgICAgICBNZXNzYWdlRGlzcGF0Y2hlciBtZXNzYWdlRGlzcGF0Y2hlciA9Ci0gICAgICAgICAgICBjb250YWN0SW5mby5nZXRNZXNzYWdlRGlzcGF0Y2hlcihtZXNzYWdlSW5mbyk7Ci0gICAgICAgIG1lc3NhZ2VEaXNwYXRjaGVyLnNlbmQobWVzc2FnZUluZm8pOwotICAgIH0KLQotICAgICBwcml2YXRlIENvbnRhY3RJbmZvIGdldENvbnRhY3RJbmZvKENvbnRhY3RJbmZvTGlzdCBjaWwsIFN0cmluZyBiaW5kaW5nSWQpewotICAgICAgICBDb250YWN0SW5mb0xpc3RJdGVyYXRvciBpdGVyID0gY2lsLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgIENvbnRhY3RJbmZvQmFzZSBjaWIgPSAoQ29udGFjdEluZm9CYXNlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYoY2liLmdldEJpbmRpbmdJZCgpLmVxdWFscyhiaW5kaW5nSWQpKQotICAgICAgICAgICAgICAgIHJldHVybiBjaWI7Ci0gICAgICAgIH0KLSAgICAgICAgLy9yZXR1cm4gdGhlIGZpcnN0IG9uZQotICAgICAgICByZXR1cm4gY2lsLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIH0KLSAgICAvKnByaXZhdGUgQ29udGFjdEluZm8gZ2V0Q29udGFjdEluZm8oQ29udGFjdEluZm9MaXN0SXRlcmF0b3IgaXRlcmF0b3IsIE1lc3NhZ2VTdHJ1Y3QgbWVzc2FnZVN0cnVjdCkgewotICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJubyBuZXh0Iik7Ci0KLSAgICAgICAgQ29udGFjdEluZm8gY29udGFjdEluZm8gPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIC8vVG9kbzogdXNlIE1hcAotICAgICAgICAvL2lmIGZhc3QgZW5jb2RpbmcgZ28gdG8gbmV4dAotICAgICAgICAgaWYgKGlzRmFzdEVuY29kaW5nKChSZXF1ZXN0Q29udGV4dCkKLSAgICAgICAgICAgICAgICAgbWVzc2FnZVN0cnVjdC5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpKSkgewotICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgIGNvbnRhY3RJbmZvID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzTG9nZ2FibGUoTGV2ZWwuSU5GTykpICAgICAvL25lZWRzIGxvY2FsaWNhbGl6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEZWZhdWx0aW5nIHRvIFhNTCBFbmNvZGluZy4gIik7Ci0gICAgICAgICAgICAgICAgIHNldERlZmF1bHRFbmNvZGluZygoUmVxdWVzdENvbnRleHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVN0cnVjdC5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICBzZXREZWZhdWx0RW5jb2RpbmcoKFJlcXVlc3RDb250ZXh0KQotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVN0cnVjdC5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpKTsKLQotICAgICAgICByZXR1cm4gY29udGFjdEluZm87Ci0gICAgfQotICovCi0KLSAgICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRFbmNvZGluZyhSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgewotICAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQUNDRVBUX0VOQ09ESU5HX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLlhNTF9FTkNPRElOR19WQUxVRSk7Ci0gICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL2ltcGwvZW5jb2RpbmcvRGlzcGF0Y2hTZXJpYWxpemVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvaW1wbC9lbmNvZGluZy9EaXNwYXRjaFNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4MTc3ZC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvaW1wbC9lbmNvZGluZy9EaXNwYXRjaFNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5pbXBsLmVuY29kaW5nOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5KQVhCQmVhbkluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU2VyaWFsaXphdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuQXR0cmlidXRlczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuU291cmNlUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkJ5dGVBcnJheUJ1ZmZlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgc3RhdGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLio7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpc3BhdGNoU2VyaWFsaXplciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KLSAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihuZXcgU3RyaW5nQnVmZmVyKCkuYXBwZW5kKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4pLmFwcGVuZCgiLmNsaWVudC5kaXNwYXRjaCIpLnRvU3RyaW5nKCkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBib2R5VGFnTmFtZTsKLQotICAgIC8qKgotICAgICAqIEZvciBTT0FQIDEuMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoU2VyaWFsaXplciBTT0FQXzFfMCA9IG5ldyBEaXNwYXRjaFNlcmlhbGl6ZXIoU09BUENvbnN0YW50cy5RTkFNRV9TT0FQX0JPRFkpOwotCi0gICAgLyoqCi0gICAgICogRm9yIFNPQVAgMS4yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hTZXJpYWxpemVyIFNPQVBfMV8yID0gbmV3IERpc3BhdGNoU2VyaWFsaXplcihTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9CT0RZKTsKLQotCi0gICAgcHJpdmF0ZSBEaXNwYXRjaFNlcmlhbGl6ZXIoUU5hbWUgc29hcEJvZHlUYWdOYW1lKSB7Ci0gICAgICAgIGJvZHlUYWdOYW1lID0gc29hcEJvZHlUYWdOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPYmplY3Qgb2JqLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBKQVhCQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTb3VyY2UpCi0gICAgICAgICAgICBzZXJpYWxpemVTb3VyY2Uob2JqLCB3cml0ZXIpOwotICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBKQVhCQmVhbkluZm8pIHsKLSAgICAgICAgICAgICgoSkFYQkJlYW5JbmZvKSBvYmopLndyaXRlVG8od3JpdGVyKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHNlcmlhbGl6ZSBvYmplY3QgdHlwZSAiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgLy9zaG91bGQgbm90IGhhcHBlbgotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnROdWxsKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIGlzIHZlcnkgdmVyeSBpbmVmZmljaWVudC4KLSAgICAvL2t3LW5lZWRzIGxvdHMgb2YgY2xlYW51cAotICAgIC8va3ctbW9kaWZ5aW5nIHRoaXMgaW4gYW55IHdheSB3aWxsIGNhdXNlIGRpc3BhdGNoIHRlc3RzIHNxZSBmYWlsdXJlcwotICAgIHB1YmxpYyBTb3VyY2UgZGVzZXJpYWxpemVTb3VyY2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgRGlzcGF0Y2hVdGlsIGRpc3BhdGNoVXRpbCkgewotCi0gICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBiYW9zID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigpOwotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MU3RyZWFtV3JpdGVyRmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoYmFvcyk7Ci0gICAgICAgIGRpc3BhdGNoVXRpbC5wb3B1bGF0ZVByZWZpeGVzKHdyaXRlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBycHJlZml4ID0gcmVhZGVyLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5sb2NhbCA9IHJlYWRlci5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFdyaXRlclByZWZpeGVzKHJwcmVmaXgsIHVyaSwgd3JpdGVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd3ByZWZpeCA9IHdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0UHJlZml4KHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdwcmVmaXggIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHdwcmVmaXgpKSAmJiB3cHJlZml4Lmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gd3ByZWZpeDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChycHJlZml4ICE9IG51bGwgJiYgISIiLmVxdWFscyhycHJlZml4KSkgJiYgKHVyaSAhPSBudWxsICYmICEibnVsbCIuZXF1YWxzKHVyaSkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBzZXRXcml0ZXJQcmVmaXhlcyhyZWFkZXIsIHVyaSwgd3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29udmVydE51bGwocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkgPSBjb252ZXJ0TnVsbCh1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBubG9jYWwsIHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCB1cmkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHMgPSBYTUxTdHJlYW1SZWFkZXJVdGlsLmdldEF0dHJpYnV0ZXMocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGVzKGF0dHMsIHdyaXRlciwgcHJlZml4LCB1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDSEFSQUNURVJTOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhyZWFkZXIuZ2V0VGV4dCgpKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0ZSA9IFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dChyZWFkZXIpOwotICAgICAgICAgICAgICAgIGlmICgocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IEVORF9FTEVNRU5UKSAmJiAocmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoYm9keVRhZ05hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShiYW9zLm5ld0lucHV0U3RyZWFtKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRzLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspIHsKLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBhdHRzLmdldE5hbWUoaSkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgYXByZWZpeCA9IGF0dHMuZ2V0UHJlZml4KGkpOwotICAgICAgICAgICAgU3RyaW5nIGF1cmkgPSBhdHRzLmdldFVSSShpKTsKLQotICAgICAgICAgICAgc2V0V3JpdGVyUHJlZml4KGxvY2FsTmFtZSwgdmFsdWUsIGFwcmVmaXgsIHdyaXRlcik7Ci0gICAgICAgICAgICBpZiAoYXR0cy5pc05hbWVzcGFjZURlY2xhcmF0aW9uKGkpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVBdHRyTmFtZXNwYWNlKGFwcmVmaXgsIGF1cmksIHdyaXRlciwgbG9jYWxOYW1lLCBwcmVmaXgsIHVyaSwgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZShhdHRzLCBpLCB3cml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFdyaXRlclByZWZpeChTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBhcHJlZml4LCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoInhzaSIpICYmCi0gICAgICAgICAgICB2YWx1ZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIikgJiYKLSAgICAgICAgICAgIGFwcmVmaXguZXF1YWxzKCJ4bWxucyIpKSB7Ci0gICAgICAgICAgICAvL2t3IHdhcyBhYSBwcmVmaXgKLSAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgobG9jYWxOYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzZXRXcml0ZXJQcmVmaXhlcyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBTdHJpbmcgbnVyaSwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldFByZWZpeChudXJpKTsKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgICAgICAgICAgcHJlZml4ID0gY29udmVydE51bGwocHJlZml4KTsKLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgbnVyaSAhPSBudWxsICYmICFwcmVmaXguZXF1YWxzKCJ4bWxucyIpKSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbnVyaSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0V3JpdGVyUHJlZml4ZXMoU3RyaW5nIG5wcmUsIFN0cmluZyBudXJpLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChucHJlICE9IG51bGwgJiYgbnByZS5sZW5ndGgoKSA+IDApICYmIChudXJpLmxlbmd0aCgpID4gMCAmJiBudXJpICE9IG51bGwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG5wcmUuZXF1YWxzKCJudWxsIikgfHwgbnVyaS5lcXVhbHMoIm51bGwiKSkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KG5wcmUsIG51cmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0ck5hbWVzcGFjZShTdHJpbmcgYXByZWZpeCwgU3RyaW5nIGF1cmksIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBudXJpLCBTdHJpbmcgdmFsdWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoYXByZWZpeCA9PSBudWxsIHx8ICFhcHJlZml4LmVxdWFscygiIikgfHwgKGFwcmVmaXguZXF1YWxzKCJ4bWxucyIpKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBhcHJlZml4OwotICAgICAgICAgICAgaWYgKGF1cmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB3cHJlZml4ID0gd3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXRQcmVmaXgoYXVyaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFwcmVmaXguZXF1YWxzKCJ4bWxucyIpICYmICEobG9jYWxOYW1lLmVxdWFscygieHNpIikpKXsKLSAgICAgICAgICAgICAgICAgICAgYXByZWZpeCA9IHByZWZpeDsKLSAgICAgICAgICAgICAgICAgICAgYXVyaSA9IG51cmk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdwcmVmaXggIT0gbnVsbCAmJiAhd3ByZWZpeC5lcXVhbHMoInhtbG5zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcmVmaXggPSB3cHJlZml4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhcHJlZml4ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnROdWxsKGFwcmVmaXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZU5hbWVzcGFjZShhcHJlZml4LCBwcmVmaXgsIGF1cmksIG51cmksIHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZVhTSU5hbXNwZWNlKGxvY2FsTmFtZSwgdmFsdWUsIHRlbXAsIHdyaXRlciwgYXByZWZpeCwgYXVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVOYW1lc3BhY2UoU3RyaW5nIGFwcmVmaXgsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBhdXJpLCBTdHJpbmcgbnVyaSwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKGFwcmVmaXguZXF1YWxzKHByZWZpeCkgJiYgYXVyaS5lcXVhbHMobnVyaSkpKXsKLSAgICAgICAgICAgIGlmICghYXByZWZpeC5lcXVhbHMoInhtbG5zIikpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoYXByZWZpeCwgYXVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVYU0lOYW1zcGVjZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyB0ZW1wLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBTdHJpbmcgYXByZWZpeCwgU3RyaW5nIGF1cmkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscygieHNpIikgJiYKLSAgICAgICAgICAgIHZhbHVlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSAmJgotICAgICAgICAgICAgdGVtcC5lcXVhbHMoInhtbG5zIikpIHsKLSAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgobG9jYWxOYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXByZWZpeCwgYXVyaSwgbG9jYWxOYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoQXR0cmlidXRlcyBhdHRzLCBpbnQgaSwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgoYXR0cy5nZXRVUkkoaSkgPT0gbnVsbCkgJiYgKGF0dHMuZ2V0UHJlZml4KGkpICE9IG51bGwpKSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5zID0gd3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkoYXR0cy5nZXRVUkkoaSkpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dHMuZ2V0UHJlZml4KGkpLCBucywgYXR0cy5nZXRMb2NhbE5hbWUoaSksCi0gICAgICAgICAgICAgICAgYXR0cy5nZXRWYWx1ZShpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dHMuZ2V0UHJlZml4KGkpLCBhdHRzLmdldFVSSShpKSwgYXR0cy5nZXRMb2NhbE5hbWUoaSksIGF0dHMuZ2V0VmFsdWUoaSkpOwotICAgIH0KLQotICAgIHZvaWQgc2VyaWFsaXplU291cmNlKE9iamVjdCBzb3VyY2UsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTb3VyY2VSZWFkZXJGYWN0b3J5LmNyZWF0ZVNvdXJjZVJlYWRlcigoU291cmNlKSBzb3VyY2UsIHRydWUpOwotCi0gICAgICAgICAgICBpbnQgc3RhdGU7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0gcmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBlbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50TmFtZS5nZXRQcmVmaXgoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxQYXJ0LCBuYW1lc3BhY2VVUkkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHMgPSBYTUxTdHJlYW1SZWFkZXJVdGlsLmdldEF0dHJpYnV0ZXMocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cy5pc05hbWVzcGFjZURlY2xhcmF0aW9uKGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBhdHRzLmdldE5hbWUoaSkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgobG9jYWxOYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShsb2NhbE5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0cy5nZXRQcmVmaXgoaSksIGF0dHMuZ2V0VVJJKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cy5nZXRMb2NhbE5hbWUoaSksIGF0dHMuZ2V0VmFsdWUoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0hBUkFDVEVSUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMocmVhZGVyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoc3RhdGUgIT0gRU5EX0RPQ1VNRU5UKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0vLyAgICBwcml2YXRlIHZvaWQgZGlzcGxheURPTShOb2RlIG5vZGUsIGphdmEuaW8uT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuPT09PVxuIik7Ci0vLyAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0obmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZShub2RlKSwKLS8vICAgICAgICAgICAgICAgIG5ldyBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQob3N0cmVhbSkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuPT09PVxuIik7Ci0vLyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0KLS8vICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZVRvWE1MU3RyaW5nKFNvdXJjZSByZXN1bHQpIHsKLS8vICAgICAgICBTdHJpbmcgeG1sUmVzdWx0ID0gbnVsbDsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotLy8gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLS8vICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOwotLy8gICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOwotLy8gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotLy8gICAgICAgICAgICBTdHJlYW1SZXN1bHQgc3RyZWFtUmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCgpOwotLy8gICAgICAgICAgICBzdHJlYW1SZXN1bHQuc2V0T3V0cHV0U3RyZWFtKG91dCk7Ci0vLyAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShyZXN1bHQsIHN0cmVhbVJlc3VsdCk7Ci0vLyAgICAgICAgICAgIHhtbFJlc3VsdCA9IHN0cmVhbVJlc3VsdC5nZXRPdXRwdXRTdHJlYW0oKS50b1N0cmluZygpOwotLy8gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgcmV0dXJuIHhtbFJlc3VsdDsKLS8vICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL2ltcGwvZW5jb2RpbmcvRGlzcGF0Y2hVdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvaW1wbC9lbmNvZGluZy9EaXNwYXRjaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3ZjI3YS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvZGlzcGF0Y2gvaW1wbC9lbmNvZGluZy9EaXNwYXRjaFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoLmltcGwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hVdGlsIHsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VQcmVmaXhNYXA7Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhck5QTWFwKCkgewotICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVByZWZpeGVzKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgaWYgKCFuYW1lc3BhY2VQcmVmaXhNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gZW50cnlzID0gbmFtZXNwYWNlUHJlZml4TWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBlbnRyeXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbGxlY3RQcmVmaXhlcyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VQcmVmaXhNYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIGludCBpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKXsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSByZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGopOwotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoaik7Ci0gICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCAmJiBuYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcC5wdXQobmFtZXNwYWNlLCBwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL2ltcGwvcHJvdG9jb2wvTWVzc2FnZURpc3BhdGNoZXJIZWxwZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9kaXNwYXRjaC9pbXBsL3Byb3RvY29sL01lc3NhZ2VEaXNwYXRjaGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYWI4NTUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L2Rpc3BhdGNoL2ltcGwvcHJvdG9jb2wvTWVzc2FnZURpc3BhdGNoZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5pbXBsLnByb3RvY29sOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkNvbnRleHRNYXA7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcC5jbGllbnQuU09BUE1lc3NhZ2VEaXNwYXRjaGVyOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGlzcGF0Y2hlckhlbHBlciBleHRlbmRzIFNPQVBNZXNzYWdlRGlzcGF0Y2hlcgotICAgIGltcGxlbWVudHMgQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KLSAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihuZXcgU3RyaW5nQnVmZmVyKCkuYXBwZW5kKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4pLmFwcGVuZCgiLmNsaWVudC5kaXNwYXRjaCIpLnRvU3RyaW5nKCkpOwotCi0gICAgcHVibGljIE1lc3NhZ2VEaXNwYXRjaGVySGVscGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFJlc3BvbnNlVHlwZShUaHJvd2FibGUgZSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAvL2xlYXZlIGZvciBub3ctIGZpeCBsYXRlcgotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZVR5cGUoTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBIYW5kbGVyQ2hhaW5DYWxsZXIgZ2V0SGFuZGxlckNoYWluQ2FsbGVyKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIENvbnRleHRNYXAgY29udGV4dCA9IChDb250ZXh0TWFwKQotICAgICAgICAgICAgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ0xJRU5UX0hBTkRMRV9QUk9QRVJUWSk7Ci0gICAgICAgIEJpbmRpbmdJbXBsIGJpbmRpbmcgPSAoQmluZGluZ0ltcGwpIHByb3ZpZGVyLmdldEJpbmRpbmcoKTsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluQ2FsbGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggN2JmMTI1OC4uODlkNTIyNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxMzIgKzI0LDE3IEBACiAgKi8KIAogLyoqCi0gKiAgPGgxPkpBWC1XUyAyLjAgQ2xpZW50IFJ1bnRpbWU8L2gxPgorICogIDxoMT5KQVgtV1MgMi4wLjEgQ2xpZW50IFJ1bnRpbWU8L2gxPgogICogPFA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGFyY2hpdGVjdHVyZSBvZiBjbGllbnQgc2lkZQotICogSkFYLVdTIDIuMCBydW50aW1lLgorICogSkFYLVdTIDIuMC4xIHJ1bnRpbWUuCiAgKgotICogPGgzPkpBWC1XUyAyLjAgU2VydmVyIENsaWVudCBTZXF1ZW5jZSBEaWFncmFtPC9oMz4KLSAqIHtAU2VxdWVuY2VEaWFncmFtCi0gKiAgICBwb2JqZWN0KFUsInVzZXIiKTsKLSAqICAgb2JqZWN0KEEsIkVuZHBvaW50SUZJbnZvY2F0aW9uSGFuZGxlciIpOwotICogICBvYmplY3QoQiwiRGVsZWdhdGVCYXNlIik7Ci0gKiAgIG9iamVjdChDLCJNZXNzYWdlRGlzcGF0Y2hlciIpOwotICogICBvYmplY3QoRCwiRW5jb2Rlci9EZWNvZGVyIik7Ci0gKiAgIG9iamVjdChGLCJXU0Nvbm5lY3Rpb24iKTsKLSAqICAgc3RlcCgpOwotICoKLSAqICAgbWVzc2FnZShVLEEsImludm9rZSBXZWIgU2VydmljZSIpOwotICogICBhY3RpdmUoQSk7Ci0gKiAgIG1lc3NhZ2UoQSxBLCJpbnZva2UiKTsKLSAqICAgYWN0aXZlKEEpOwotICogICBzdGVwKCk7Ci0gKiAgIGluYWN0aXZlKEEpOwotICojICAgIHN0ZXAoKTsKLSAqCi0gKiAgIG1lc3NhZ2UoQSxBLCJpbXBsZW1lbnRTRUlNZXRob2QiKTsKLSAqICAgYWN0aXZlKEEpOwotICogICBzdGVwKCk7Ci0gKiAgIGluYWN0aXZlKEEpOwotICoKLSAqICAgbWVzc2FnZShBLEIsInNlbmQiKTsKLSAqICAgYWN0aXZlKEIpOwotICoKLSAqICAgbWVzc2FnZShCLEIsImdldENvbnRhY3RJbmZvIik7Ci0gKiAgIGFjdGl2ZShCKTsKLSAqICAgc3RlcCgpOwotICogICBpbmFjdGl2ZShCKTsKLSAqCi0gKiAgIG1lc3NhZ2UoQixCLCJnZXRNZXNzYWdlRGlzcGF0Y2hlciIpOwotICogICBhY3RpdmUoQik7Ci0gKiAgIHN0ZXAoKTsKLSAqICBpbmFjdGl2ZShCKTsKLSAqCi0gKiAgIG1lc3NhZ2UoQixDLCJzZW5kIik7Ci0gKiAgIGFjdGl2ZShDKTsKLSAqIyAgICBzdGVwKCk7Ci0gKiMgICAgaW5hY3RpdmUoQik7Ci0gKgotICojICAgIG1lc3NhZ2UoQyxDLCJkb1NlbmQiKTsKLSAqIyAgICBhY3RpdmUoQyk7Ci0gKiMgICAgc3RlcCgpOwotICojICAgIGluYWN0aXZlKEMpOwotICoKLSAqIyAgICBhY3RpdmUoQyk7Ci0gKiAgIG1lc3NhZ2UoQyxELCJ0b0ludGVybmFsTWVzc2FnZSIpOwotICogICBhY3RpdmUoRCk7Ci0gKiAgIHN0ZXAoKTsKLSAqICAgaW5hY3RpdmUoRCk7Ci0gKgotICogICBtZXNzYWdlKEMsRCwidG9TT0FQTWVzc2FnZSIpOwotICogICBhY3RpdmUoRCk7Ci0gKiAgIHN0ZXAoKTsKLSAqICAgaW5hY3RpdmUoRCk7Ci0gKgotICogICBtZXNzYWdlKEMsQywiaW52b2tlSGFuZGxlcnMiKTsKLSAqICAgYWN0aXZlKEMpOwotICogICBzdGVwKCk7Ci0gKiAgIGluYWN0aXZlKEMpOwotICoKLSAqICAgbWVzc2FnZShDLEYsInNldEhlYWRlcnMiKTsKLSAqICAgYWN0aXZlKEYpOwotICogICBzdGVwKCk7Ci0gKiAgIGluYWN0aXZlKEYpOwotICoKLSAqICAgbWVzc2FnZShDLEYsImdldE91dHB1dCIpOwotICogICBhY3RpdmUoRik7Ci0gKiAgIHN0ZXAoKTsKLSAqICAgaW5hY3RpdmUoRik7Ci0gKgotICogICBtZXNzYWdlKEMsRiwid3JpdGVUbyIpOwotICogICBhY3RpdmUoRik7Ci0gKiAgIHN0ZXAoKTsKLSAqICAgaW5hY3RpdmUoRik7Ci0gKgotICojICAgIG1lc3NhZ2UoQyxDLCJyZWNlaXZlIik7Ci0gKiMgICAgYWN0aXZlKEMpOwotICojICAgIHN0ZXAoKTsKLSAqIyAgICBpbmFjdGl2ZShDKTsKLSAqCi0gKiAgIG1lc3NhZ2UoQyxGLCJyZWFkU09BUE1lc3NhZ2UiKTsKLSAqICAgYWN0aXZlKEYpOwotICogICBzdGVwKCk7Ci0gKiAgIGluYWN0aXZlKEYpOwotICoKLSAqICAgbWVzc2FnZShDLEMsIm11c3RVbmRlcnN0YW5kIik7Ci0gKiAgIGFjdGl2ZShDKTsKLSAqICAgc3RlcCgpOwotICogICBpbmFjdGl2ZShDKTsKLSAqCi0gKiAgbWVzc2FnZShDLEMsImludm9rZUhhbmRsZXJzIik7Ci0gKiAgYWN0aXZlKEMpOwotICogIHN0ZXAoKTsKLSAqICBpbmFjdGl2ZShDKTsKLSAqCi0gKiAgbWVzc2FnZShDLEQsInRvSW50ZXJuYWxNZXNzYWdlIik7Ci0gKiAgYWN0aXZlKEQpOwotICogIHN0ZXAoKTsKLSAqICBpbmFjdGl2ZShEKTsKLSAqCi0gKiMgICAgbWVzc2FnZShDLEMsImRvU2VuZEFzeW5jIik7Ci0gKiMgICAgYWN0aXZlKEMpOwotICojICAgIHN0ZXAoKTsKLSAqIyAgICBpbmFjdGl2ZShDKTsKLSAqCi0gKiMgICAgbWVzc2FnZShDLEMsInNlbmRBc3luY1JlY2VpdmUiKTsKLSAqIyAgICBhY3RpdmUoQyk7Ci0gKiMgICAgc3RlcCgpOwotICojICAgIGluYWN0aXZlKEMpOwotICoKLSAqICAgcm1lc3NhZ2UoQyxCLCJyZXNwb25zZSIpOwotICogICBpbmFjdGl2ZShDKTsKLSAqCi0gKiAgIHJtZXNzYWdlKEIsQSwicmVzcG9uc2UiKTsKLSAqICAgaW5hY3RpdmUoQik7Ci0gKgotICogICBybWVzc2FnZShBLFUsInJlc3BvbnNlIik7Ci0gKiAgIGNvbXBsZXRlKEEpOwotICogfQotICoKKyAqIDxoMz5KQVgtV1MgMi4wLjEgQ2xpZW50IFNlcXVlbmNlIERpYWdyYW08L2gzPgorICogPGltZyBzcmM9Jy4uLy4uLy4uLy4uLy4uL2pheHdzL2Jhc2ljLWNsaWVudC5zZXEucG5nJz4KKyAgKiA8aDM+SkFYLVdTIDIuMC4xIEFzeW5jaHJvbm91cyBJbnZvY2F0aW9uIFNlcXVlbmNlIERpYWdyYW08L2gzPgorICogPGltZyBzcmM9Jy4uLy4uLy4uLy4uLy4uL2pheHdzL2NsaWVudC1hc3luYy5zZXEucG5nJz4KKyAgKiA8aDM+SkFYLVdTIDIuMC4xIERpc3BhdGNoIEludm9jYXRpb24gU2VxdWVuY2UgRGlhZ3JhbTwvaDM+CisgKiA8aW1nIHNyYz0nLi4vLi4vLi4vLi4vLi4vamF4d3MvZGlzcGF0Y2guc2VxLnBuZyc+CisKICAqIDxIMz5NZXNzYWdlIEZsb3c8L0gzPgogICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XZWJTZXJ2aWNlfSBwcm92aWRlcyBjbGllbnQgdmlldyBvZiBhIFdlYiBzZXJ2aWNlLgogICogV2ViU2VydmljZS5nZXRQb3J0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5FbmRwb2ludElGSW52b2NhdGlvbkhhbmRsZXJ9CkBAIC0xNjYsNyArNTEsNyBAQAogICoge0BsaW5rIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXJ9IGFuZCBzZXRzIGl0IG9uIHRoZSBNZXNzYWdlSW5mby4gQWZ0ZXIgdGhlCiAgKiBEZWxlZ2F0ZSBvYnRhaW5zIGEgc3BlY2lmaWMgQ29udGFjdEluZm8gaXQgdXNlcyB0aGF0IENvbnRhY3RJbmZvIHRvIG9idGFpbiBhCiAgKiBwcm90b2NvbC1zcGVjaWZpYyB7QGxpbmsgY29tLnN1bi5wZXB0LnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVyfS4gVGhlcmUgd2lsbCBiZQotICogdHdvIHR5cGVzIG9mIGNsaWVudC1zaWRlIE1lc3NhZ2VEaXNwYXRjaGVycyBmb3IgSkFYLVdTIDIuMCBGQ1MsCisgKiB0d28gdHlwZXMgb2YgY2xpZW50LXNpZGUgTWVzc2FnZURpc3BhdGNoZXJzIGZvciBKQVgtV1MgMi4wLjEsCiAgKiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcC5jbGllbnQuU09BUE1lc3NhZ2VEaXNwYXRjaGVyfSBhbmQKICAqIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC54bWwuY2xpZW50LlhNTE1lc3NhZ2VEaXNwYXRjaGVyfS4gVGhlIERlbGVnYXRlCiAgKiB0aGVuIGludm9rZXMge0BsaW5rIGNvbS5zdW4ucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlciNzZW5kfS4gVGhlCkBAIC0xNzcsMTIgKzYyLDEyIEBACiAgKiBUaGUgTWVzc2FnZURpc3BhdGNoZXIgdXNlcyBDb250YWN0SW5mbyB0byBvYnRhaW4KICAqIGEge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuY2xpZW50LlNPQVBYTUxFbmNvZGVyfSB3aGljaCBjb252ZXJ0cwogICogdGhlIE1lc3NhZ2VJbmZvIHRvIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkludGVybmFsTWVzc2FnZX0uCi0gKiBUaGVyZSB3aWxsIGJlIHR3byB0eXBlcyBvZiBjbGllbnQtc2lkZSBTT0FQWE1MRW5jb2RlciBmb3IgSkFYLVdTIDIuMCBGQ1MsCisgKiBUaGVyZSB3aWxsIGJlIHR3byB0eXBlcyBvZiBjbGllbnQtc2lkZSBTT0FQWE1MRW5jb2RlciBmb3IgSkFYLVdTIDIuMC4xLAogICogU09BUFhNRW5jb2RlciBmb3IgU09BUCAxLjEgYW5kIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmNsaWVudC5TT0FQMTJYTUxFbmNvZGVyfQogICogZm9yIFNPQVAgMS4yLiBUaGUgTWVzc2FnZURpc3BhdGNoZXIgaW52b2tlcyBjb25maWd1cmVkIGhhbmRsZXJzIGFuZCB1c2UgdGhlCi0gKiBlbmNvZGVyIHRvIGNvbnZlcnQgdGhlIEludGVybmFsTWVzc2FnZSB0byBhIHtAbGluayBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZX0uCisgKiBjb2RlYyB0byBjb252ZXJ0IHRoZSBJbnRlcm5hbE1lc3NhZ2UgdG8gYSB7QGxpbmsgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2V9LgogICogVGhlIG1ldGFkYXRhIGZyb20gdGhlIE1lc3NhZ2VJbmZvIGlzIGNsYXNzaWZpZWQgaW50byB7QGxpbmsgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnN9Ci0gKiBvZiB0aGlzIFNPQVBNZXNzYWdlIGFuZCBjb250ZXh0IGluZm9ybWF0aW9uIGZvciB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9ufS4KKyAqIG9mIHRoaXMgU09BUE1lc3NhZ2UgYW5kIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTQ29ubmVjdGlvbn0uCiAgKiBUaGUgU09BUE1lc3NnZSBpcyB0aGVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0gb2YgdGhlIFdTQ29ubmVjdGlvbgogICogb2J0YWluZWQgZnJvbSBNZXNzYWdlSW5mby4KICAqPFA+PC9QPgpAQCAtMTkyLDcgKzc3LDcgQEAKICAqIG9mIGFueSBoYW5kbGVycy4gVGhlIE1lc3NhZ2VEaXNwYXRjaGVyIHVzZXMgQ29udGFjdEluZm8gdG8gb2J0YWluIGEKICAqIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmNsaWVudC5TT0FQWE1MRGVjb2Rlcn0gd2hpY2ggY29udmVydHMgdGhlIFNPQVBNZXNzYWdlCiAgKiB0byBJbnRlcm5hbE1lc3NhZ2UgYW5kIHRoZW4gSW50ZXJuYWxNZXNzYWdlIHRvIE1lc3NhZ2VJbmZvLiBUaGVyZSB3aWxsIGJlIHR3byB0eXBlcyBvZgotICogY2xpZW50LXNpZGUgU09BUFhNTERlY29kZXIgZm9yIEpBWC1XUyAyLjAgRkNTLCBTT0FQWE1MRGVuY29kZXIgZm9yIFNPQVAgMS4xIGFuZAorICogY2xpZW50LXNpZGUgU09BUFhNTERlY29kZXIgZm9yIEpBWC1XUyAyLjAuMSwgU09BUFhNTERlbmNvZGVyIGZvciBTT0FQIDEuMSBhbmQKICAqIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmNsaWVudC5TT0FQMTJYTUxEZWNvZGVyfSBmb3IgU09BUCAxLjIuIFRoZQogICogcmVzcG9uc2UgaXMgcmV0dXJuZWQgYmFjayB0byB0aGUgY2xpZW50IGNvZGUgdmlhIERlbGVnYXRlLgogICoKQEAgLTI2NCw3ICsxNDksNiBAQAogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlQ29udGV4dDsKIAotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9Bc3luY0J1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvQXN5bmNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5ZDkzNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvQXN5bmNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuc2VpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkNvbXBvc2l0ZVN0cnVjdHVyZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5SYXdBY2Nlc3NvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuU0VJTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVySW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuamF4Yi5KQVhCTWVzc2FnZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJ1aWxkcyBBc3luYyBiZWFuCisgKgorICogQHNlZSBNZXNzYWdlRmlsbGVyCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCithYnN0cmFjdCBjbGFzcyBBc3luY0J1aWxkZXIgeworCisgICAgYWJzdHJhY3QgT2JqZWN0IGZpbGxBc3luY0JlYW4oT2JqZWN0W10gbWV0aG9kQXJncywgT2JqZWN0IHJldHVyblZhbHVlLCBPYmplY3QgYmVhbik7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHBheWxvYWQgSkFYQiBvYmplY3QganVzdCBieSB0YWtpbmcKKyAgICAgKiBvbmUgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgZmluYWwgc3RhdGljIGNsYXNzIEJhcmUgZXh0ZW5kcyBBc3luY0J1aWxkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBtZXRob2QgaW52b2NhdGlvbiBwYXJhbWV0ZXJzIHRoYXQgZ29lcyBpbnRvIHRoZSBwYXlsb2FkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWV0aG9kUG9zOworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlR2V0dGVyIGdldHRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSYXdBY2Nlc3NvciBhY2Nlc3NvcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBCb2R5QnVpbGRlcn0gZnJvbSBhIGJhcmUgcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQmFyZShDbGFzcyB3cmFwcGVyLCBQYXJhbWV0ZXJJbXBsIHApIHsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kUG9zID0gcC5nZXRJbmRleCgpOworICAgICAgICAgICAgdGhpcy5nZXR0ZXIgPSBWYWx1ZUdldHRlci5nZXQocCk7CisgICAgICAgICAgICBRTmFtZSBuYW1lID0gcC5nZXROYW1lKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yID0gcC5nZXRPd25lcigpLmdldEpBWEJDb250ZXh0KCkuZ2V0RWxlbWVudFByb3BlcnR5QWNjZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbiggIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlcisiIGRvIG5vdCBoYXZlIGEgcHJvcGVydHkgb2YgdGhlIG5hbWUgIituYW1lLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBpY2tzIHVwIGFuIG9iamVjdCBmcm9tIHRoZSBtZXRob2QgYXJndW1lbnRzIGFuZCB1c2VzIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgT2JqZWN0IGZpbGxBc3luY0JlYW4oT2JqZWN0W10gbWV0aG9kQXJncywgT2JqZWN0IHJldHVyblZhbHVlLCBPYmplY3QgYmVhbikgeworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IChtZXRob2RQb3MgPT0gLTEpID8gcmV0dXJuVmFsdWUgOiBnZXR0ZXIuZ2V0KG1ldGhvZEFyZ3NbbWV0aG9kUG9zXSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLnNldChiZWFuLCBvYmopOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsgICAgLy8gVE9ETzppMThuCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmVhbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBGaWxsZXIgZXh0ZW5kcyBBc3luY0J1aWxkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBtZXRob2QgaW52b2NhdGlvbiBwYXJhbWV0ZXJzIHRoYXQgZ29lcyBpbnRvIHRoZSBwYXlsb2FkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWV0aG9kUG9zOworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlR2V0dGVyIGdldHRlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBCb2R5QnVpbGRlcn0gZnJvbSBhIGJhcmUgcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgRmlsbGVyKFBhcmFtZXRlckltcGwgcCkgeworICAgICAgICAgICAgdGhpcy5tZXRob2RQb3MgPSBwLmdldEluZGV4KCk7CisgICAgICAgICAgICB0aGlzLmdldHRlciA9IFZhbHVlR2V0dGVyLmdldChwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQaWNrcyB1cCBhbiBvYmplY3QgZnJvbSB0aGUgbWV0aG9kIGFyZ3VtZW50cyBhbmQgdXNlcyBpdC4KKyAgICAgICAgICovCisgICAgICAgIE9iamVjdCBmaWxsQXN5bmNCZWFuKE9iamVjdFtdIG1ldGhvZEFyZ3MsIE9iamVjdCByZXR1cm5WYWx1ZSwgT2JqZWN0IGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiAobWV0aG9kUG9zID09IC0xKSA/IHJldHVyblZhbHVlIDogZ2V0dGVyLmdldChtZXRob2RBcmdzW21ldGhvZFBvc10pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBBc3luY0J1aWxkZXIgTk9ORSA9IG5ldyBOb25lKCk7CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTm9uZSBleHRlbmRzIEFzeW5jQnVpbGRlciB7CisgICAgICAgIE9iamVjdCBmaWxsQXN5bmNCZWFuKE9iamVjdFtdIG1ldGhvZEFyZ3MsIE9iamVjdCByZXR1cm5WYWx1ZSwgT2JqZWN0IGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiBiZWFuOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIENvbXBvc2l0ZSBleHRlbmRzIEFzeW5jQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXN5bmNCdWlsZGVyW10gYnVpbGRlcnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgYmVhbkNsYXNzOworCisgICAgICAgIHB1YmxpYyBDb21wb3NpdGUoQXN5bmNCdWlsZGVyW10gYnVpbGRlcnMsIENsYXNzIGJlYW5DbGFzcykgeworICAgICAgICAgICAgdGhpcy5idWlsZGVycyA9IGJ1aWxkZXJzOworICAgICAgICAgICAgdGhpcy5iZWFuQ2xhc3MgPSBiZWFuQ2xhc3M7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBDb21wb3NpdGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQXN5bmNCdWlsZGVyPiBidWlsZGVycywgQ2xhc3MgYmVhbkNsYXNzKSB7CisgICAgICAgICAgICB0aGlzKGJ1aWxkZXJzLnRvQXJyYXkobmV3IEFzeW5jQnVpbGRlcltidWlsZGVycy5zaXplKCldKSwgYmVhbkNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBmaWxsQXN5bmNCZWFuKE9iamVjdFtdIG1ldGhvZEFyZ3MsIE9iamVjdCByZXR1cm5WYWx1ZSwgT2JqZWN0IGJlYW4pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmVhbiA9IGJlYW5DbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChBc3luY0J1aWxkZXIgYnVpbGRlciA6IGJ1aWxkZXJzKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5maWxsQXN5bmNCZWFuKG1ldGhvZEFyZ3MsIHJldHVyblZhbHVlLCBiZWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiZWFuOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGhhbmRsZSBhICd3cmFwcGVyJyBzdHlsZSByZXF1ZXN0LgorICAgICAqIENvbW1vbiBwYXJ0IG9mIHJwYy9saXQgYW5kIGRvYy9saXQuCisgICAgICovCisgICAgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFdyYXBwZWQgZXh0ZW5kcyBBc3luY0J1aWxkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGVyZSBpbiB0aGUgbWV0aG9kIGFyZ3VtZW50IGxpc3QgZG8gdGhleSBjb21lIGZyb20/CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgaW50W10gaW5kaWNlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWJzdHJhY3RzIGF3YXkgdGhlIHtAbGluayBIb2xkZXJ9IGhhbmRsaW5nIHdoZW4gdG91Y2hpbmcgbWV0aG9kIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBWYWx1ZUdldHRlcltdIGdldHRlcnM7CisKKyAgICAgICAgcHJvdGVjdGVkIFdyYXBwZWQoV3JhcHBlclBhcmFtZXRlciB3cCkgeworCisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IGNoaWxkcmVuID0gd3AuZ2V0V3JhcHBlckNoaWxkcmVuKCk7CisKKyAgICAgICAgICAgIGluZGljZXMgPSBuZXcgaW50W2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICBnZXR0ZXJzID0gbmV3IFZhbHVlR2V0dGVyW2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8aW5kaWNlcy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHAgPSBjaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgaW5kaWNlc1tpXSA9IHAuZ2V0SW5kZXgoKTsKKyAgICAgICAgICAgICAgICBnZXR0ZXJzW2ldID0gVmFsdWVHZXR0ZXIuZ2V0KHApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBjcmVhdGUgYSBwYXlsb2FkIEpBWEIgb2JqZWN0IGJ5IHdyYXBwaW5nCisgICAgICogbXVsdGlwbGUgcGFyYW1ldGVycyBpbnRvIG9uZSAid3JhcHBlciBiZWFuIi4KKyAgICAgKi8KKyAgICBmaW5hbCBzdGF0aWMgY2xhc3MgRG9jTGl0IGV4dGVuZHMgV3JhcHBlZCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIb3cgZG9lcyBlYWNoIHdyYXBwZWQgcGFyYW1ldGVyIGJpbmRzIHRvIFhNTD8KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgUmF3QWNjZXNzb3JbXSBhY2Nlc3NvcnM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyYXBwZXIgYmVhbi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3Mgd3JhcHBlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBCb2R5QnVpbGRlcn0gZnJvbSBhIHtAbGluayBXcmFwcGVyUGFyYW1ldGVyfS4KKyAgICAgICAgICovCisgICAgICAgIERvY0xpdChDbGFzcyB3cmFwcGVyLCBXcmFwcGVyUGFyYW1ldGVyIHdwKSB7CisgICAgICAgICAgICBzdXBlcih3cCk7CisgICAgICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworCisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IGNoaWxkcmVuID0gd3AuZ2V0V3JhcHBlckNoaWxkcmVuKCk7CisKKyAgICAgICAgICAgIGFjY2Vzc29ycyA9IG5ldyBSYXdBY2Nlc3NvcltjaGlsZHJlbi5zaXplKCldOworICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGFjY2Vzc29ycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHAgPSBjaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHAuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yc1tpXSA9IHAuZ2V0T3duZXIoKS5nZXRKQVhCQ29udGV4dCgpLmdldEVsZW1lbnRQcm9wZXJ0eUFjY2Vzc29yKAorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlciwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbiggIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIrIiBkbyBub3QgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBuYW1lICIrbmFtZSxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYWNrcyBhIGJ1bmNoIG9mIGFyZ3VtZW50cyBpbnRvIGEge0BsaW5rIENvbXBvc2l0ZVN0cnVjdHVyZX0uCisgICAgICAgICAqLworICAgICAgICBPYmplY3QgZmlsbEFzeW5jQmVhbihPYmplY3RbXSBtZXRob2RBcmdzLCBPYmplY3QgcmV0dXJuVmFsdWUsIE9iamVjdCBiZWFuKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGZpbGwgaW4gd3JhcHBlZCBwYXJhbWV0ZXJzIGZyb20gbWV0aG9kQXJncworICAgICAgICAgICAgICAgIGZvciggaW50IGk9aW5kaWNlcy5sZW5ndGgtMTsgaT49MDsgaS0tICkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gKGluZGljZXNbaV0gPT0gLTEpID8gcmV0dXJuVmFsdWUgOiBtZXRob2RBcmdzW2luZGljZXNbaV1dOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbaV0uc2V0KGJlYW4sZ2V0dGVyc1tpXS5nZXQob2JqKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsgICAgLy8gVE9ETzppMThuCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmVhbjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9Bc3luY01ldGhvZEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvQXN5bmNNZXRob2RIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxMGVmOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvQXN5bmNNZXRob2RIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuc2VpOworCisvL2ltcG9ydCBjb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzZGwuZG9jdW1lbnQuc29hcC5TT0FQQmluZGluZzsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlJlc3BvbnNlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5KYXZhTWV0aG9kSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5QYXJhbWV0ZXJJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLldyYXBwZXJQYXJhbWV0ZXI7CisKK2ltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKK2ltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CitpbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworCisvKioKKyAqIENvbW1vbiBwYXJ0IGJldHdlZW4ge0BsaW5rIENhbGxiYWNrTWV0aG9kSGFuZGxlcn0gYW5kIHtAbGluayBQb2xsaW5nTWV0aG9kSGFuZGxlcn0uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworYWJzdHJhY3QgY2xhc3MgQXN5bmNNZXRob2RIYW5kbGVyIGV4dGVuZHMgTWV0aG9kSGFuZGxlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEphdmFNZXRob2RJbXBsIGptOworICAgIHByaXZhdGUgZmluYWwgQXN5bmNCdWlsZGVyIGFzeW5jQnVpbGRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN5bmNNZXRob2RIYW5kbGVyIGNvcmU7CisgICAgLyoqCisgICAgICogQXN5bmMgV3JhcHBlciBiZWFuLgorICAgICAqLworICAgIC8vcHJpdmF0ZSBmaW5hbCBDbGFzcyB3cmFwcGVyOworCisgICAgcHJvdGVjdGVkIEFzeW5jTWV0aG9kSGFuZGxlcihTRUlTdHViIG93bmVyLCBKYXZhTWV0aG9kSW1wbCBqbSwgU3luY01ldGhvZEhhbmRsZXIgY29yZSkgeworICAgICAgICBzdXBlcihvd25lcik7CisgICAgICAgIHRoaXMuam0gPSBqbTsKKyAgICAgICAgdGhpcy5jb3JlID0gY29yZTsKKworICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IHJwID0gam0uZ2V0UmVzcG9uc2VQYXJhbWV0ZXJzKCk7CisKKworCisgICAgICAgIENsYXNzIHRlbXBXcmFwID0gbnVsbDsKKyAgICAgICAgZm9yKFBhcmFtZXRlckltcGwgcGFyYW0gOiBycCkgeworICAgICAgICAgICAgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICBXcmFwcGVyUGFyYW1ldGVyIHdyYXBQYXJhbSA9IChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtOworICAgICAgICAgICAgICAgIGlmIChjb3JlLmdldEphdmFNZXRob2QoKS5nZXRCaW5kaW5nKCkuZ2V0U3R5bGUoKSA9PSBTdHlsZS5ET0NVTUVOVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkb2Mvd3JhcHBlciBzdHlsZQorICAgICAgICAgICAgICAgICAgICB0ZW1wV3JhcCA9IChDbGFzcyl3cmFwUGFyYW0uZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IoUGFyYW1ldGVySW1wbCBwIDogd3JhcFBhcmFtLmdldFdyYXBwZXJDaGlsZHJlbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwLmdldEluZGV4KCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBXcmFwID0gKENsYXNzKXAuZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGVtcFdyYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbmRleCgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBXcmFwID0gKENsYXNzKXBhcmFtLmdldFR5cGVSZWZlcmVuY2UoKS50eXBlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3Mgd3JhcHBlciA9IHRlbXBXcmFwOworCisgICAgICAgIHJwID0gY29yZS5nZXRKYXZhTWV0aG9kKCkuZ2V0UmVzcG9uc2VQYXJhbWV0ZXJzKCk7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgZm9yKCBQYXJhbWV0ZXJJbXBsIHBhcmFtIDogcnAgKSB7CisgICAgICAgICAgICBpZiAocGFyYW0uaXNXcmFwcGVyU3R5bGUoKSkgeworICAgICAgICAgICAgICAgIFdyYXBwZXJQYXJhbWV0ZXIgd3JhcFBhcmFtID0gKFdyYXBwZXJQYXJhbWV0ZXIpcGFyYW07CisgICAgICAgICAgICAgICAgc2l6ZSArPSB3cmFwUGFyYW0uZ2V0V3JhcHBlckNoaWxkcmVuKCkuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChjb3JlLmdldEphdmFNZXRob2QoKS5nZXRCaW5kaW5nKCkuZ2V0U3R5bGUoKSA9PSBTdHlsZS5ET0NVTUVOVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkb2Mvd3JhcHBlciAtIHdyYXBwZXIgYmVhbiBpcyBpbiBhc3luYyBzaWduYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIDIgc28gdGhhdCBpdCBpcyBjb25zaWRlcmVkIGFzIGFzeW5jIGJlYW4gY2FzZQorICAgICAgICAgICAgICAgICAgICBzaXplICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMaXN0PEFzeW5jQnVpbGRlcj4gYnVpbGRlcnMgPSBuZXcgQXJyYXlMaXN0PEFzeW5jQnVpbGRlcj4oKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgLy8gbm8gbWFwcGluZworICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSkgeworICAgICAgICAgICAgUGFyYW1ldGVySW1wbCBzaW5nbGUgPSBudWxsOworICAgICAgICAgICAgZm9yKCBQYXJhbWV0ZXJJbXBsIHBhcmFtIDogcnAgKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgV3JhcHBlclBhcmFtZXRlciB3cmFwUGFyYW0gPSAoV3JhcHBlclBhcmFtZXRlcilwYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKFBhcmFtZXRlckltcGwgcCA6IHdyYXBQYXJhbS5nZXRXcmFwcGVyQ2hpbGRyZW4oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpbmdsZSA9IHBhcmFtOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQgc2luZ2xlICE9IG51bGw7CisgICAgICAgICAgICBidWlsZGVycy5hZGQobmV3IEFzeW5jQnVpbGRlci5GaWxsZXIoc2luZ2xlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IoIFBhcmFtZXRlckltcGwgcGFyYW0gOiBycCApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocGFyYW0uZ2V0T3V0QmluZGluZygpLmtpbmQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJPRFk6CisgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtLmdldFBhcmVudCgpLmdldEJpbmRpbmcoKS5pc1JwY0xpdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJzLmFkZChuZXcgQXN5bmNCdWlsZGVyLkRvY0xpdCh3cmFwcGVyLCAoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJzLmFkZChuZXcgQXN5bmNCdWlsZGVyLkRvY0xpdCh3cmFwcGVyLCAoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBBc3luY0J1aWxkZXIuQmFyZSh3cmFwcGVyLCBwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSEVBREVSOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVycy5hZGQobmV3IEFzeW5jQnVpbGRlci5CYXJlKHdyYXBwZXIsIHBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVRUQUNITUVOVDoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBBc3luY0J1aWxkZXIuQmFyZSh3cmFwcGVyLCBwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVOQk9VTkQ6CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJzLmFkZChuZXcgQXN5bmNCdWlsZGVyLk51bGxTZXR0ZXIoc2V0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VCdWlsZGVyLmdldFZNVW5pbml0aWFsaXplZFZhbHVlKHBhcmFtLmdldFR5cGVSZWZlcmVuY2UoKS50eXBlKSkpOworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKHNpemUpIHsgICAgICAvLyBVc2Ugc2l6ZSwgc2luY2UgQ29tcG9zaXRlIGlzIGNyZWF0aW5nIGFzeW5jIGJlYW4KKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgYXN5bmNCdWlsZGVyID0gQXN5bmNCdWlsZGVyLk5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYXN5bmNCdWlsZGVyID0gYnVpbGRlcnMuZ2V0KDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3luY0J1aWxkZXIgPSBuZXcgQXN5bmNCdWlsZGVyLkNvbXBvc2l0ZShidWlsZGVycywgd3JhcHBlcik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBSZXNwb25zZTxPYmplY3Q+IGRvSW52b2tlKE9iamVjdCBwcm94eSwgT2JqZWN0W10gYXJncywgQXN5bmNIYW5kbGVyIGhhbmRsZXIpIHsKKworICAgICAgICBBc3luY01ldGhvZEhhbmRsZXIuSW52b2tlciBpbnZva2VyID0gbmV3IEludm9rZXIocHJveHksIGFyZ3MpOworICAgICAgICBSZXNwb25zZUltcGw8T2JqZWN0PiBmdCA9IG5ldyBSZXNwb25zZUltcGw8T2JqZWN0PihpbnZva2VyLGhhbmRsZXIpOworICAgICAgICBpbnZva2VyLnNldFJlY2VpdmVyKGZ0KTsKKworICAgICAgICBvd25lci5nZXRFeGVjdXRvcigpLmV4ZWN1dGUoZnQpOworICAgICAgICByZXR1cm4gZnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBJbnZva2VyIGltcGxlbWVudHMgQ2FsbGFibGU8T2JqZWN0PiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHByb3h5OworICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIGFyZ3M7CisgICAgICAgIC8vIG5lZWQgdG8gdGFrZSBhIGNvcHkuIHJlcXVpcmVkIGJ5IHRoZSBzcGVjCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdENvbnRleHQgc25hcHNob3QgPSBvd25lci5yZXF1ZXN0Q29udGV4dC5jb3B5KCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCZWNhdXNlIG9mIHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBvcmRlciwKKyAgICAgICAgICogd2UgY2FuJ3QgdGFrZSB0aGlzIGFzIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBSZXNwb25zZUNvbnRleHRSZWNlaXZlciByZWNlaXZlcjsKKworICAgICAgICBwdWJsaWMgSW52b2tlcihPYmplY3QgcHJveHksIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIHRoaXMucHJveHkgPSBwcm94eTsKKyAgICAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydCByZWNlaXZlciE9bnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2FsbGluZyB0aGUgc3luYyBtZXRob2QgaGFzIHRoaXMgb3ZlcmhlYWQKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBuZXdBcmdzOworICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjb3JlLmdldEphdmFNZXRob2QoKS5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgICAgICBpbnQgbm9PZkFyZ3MgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7CisgICAgICAgICAgICAgICAgbmV3QXJncyA9IG5ldyBPYmplY3Rbbm9PZkFyZ3NdOworICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgbm9PZkFyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbaV0uaXNBc3NpZ25hYmxlRnJvbShIb2xkZXIuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBIb2xkZXIgaG9sZGVyID0gbmV3IEhvbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci52YWx1ZSA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBcmdzW2ldID0gaG9sZGVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXJnc1tpXSA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gY29yZS5pbnZva2UocHJveHksbmV3QXJncyxzbmFwc2hvdCxyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jQnVpbGRlci5maWxsQXN5bmNCZWFuKG5ld0FyZ3MsIHJldHVyblZhbHVlLCBudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFdlYlNlcnZpY2VFeGNlcHRpb24pdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gIGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEV4Y2VwdGlvbil0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UmVjZWl2ZXIoUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvQm9keUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvQm9keUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWFiOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9Cb2R5QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LnNlaTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkFjY2Vzc29yRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5Db21wb3NpdGVTdHJ1Y3R1cmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuUmF3QWNjZXNzb3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5qYXhiLkpBWEJNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuV3JhcHBlclBhcmFtZXRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJ1aWxkcyBhIEpBWEIgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcGF5bG9hZC4KKyAqCisgKiBAc2VlIE1lc3NhZ2VGaWxsZXIKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworYWJzdHJhY3QgY2xhc3MgQm9keUJ1aWxkZXIgeworICAgIGFic3RyYWN0IE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShPYmplY3RbXSBtZXRob2RBcmdzKTsKKworICAgIHN0YXRpYyBmaW5hbCBCb2R5QnVpbGRlciBFTVBUWV9TT0FQMTEgPSBuZXcgRW1wdHkoU09BUFZlcnNpb24uU09BUF8xMSk7CisgICAgc3RhdGljIGZpbmFsIEJvZHlCdWlsZGVyIEVNUFRZX1NPQVAxMiA9IG5ldyBFbXB0eShTT0FQVmVyc2lvbi5TT0FQXzEyKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVtcHR5IGV4dGVuZHMgQm9keUJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uOworCisgICAgICAgIHB1YmxpYyBFbXB0eShTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IHNvYXBWZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKE9iamVjdFtdIG1ldGhvZEFyZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlcy5jcmVhdGVFbXB0eShzb2FwVmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNsYXNzIGZvciB0aG9zZSB7QGxpbmsgQm9keUJ1aWxkZXJ9cyB0aGF0IGJ1aWxkIGEge0BsaW5rIE1lc3NhZ2V9CisgICAgICogZnJvbSBKQVhCIG9iamVjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSkFYQiBleHRlbmRzIEJvZHlCdWlsZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgb2JqZWN0IGRldGVybWluZXMgdGhlIGJpbmRpbmcgb2YgdGhlIG9iamVjdCByZXR1cm5lZAorICAgICAgICAgKiBmcm9tIHtAbGluayAjYnVpbGQoT2JqZWN0W10pfS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgQnJpZGdlIGJyaWRnZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKworICAgICAgICBwcm90ZWN0ZWQgSkFYQihCcmlkZ2UgYnJpZGdlLCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICAgICAgYXNzZXJ0IGJyaWRnZSE9bnVsbDsKKyAgICAgICAgICAgIHRoaXMuYnJpZGdlID0gYnJpZGdlOworICAgICAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IHNvYXBWZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKE9iamVjdFtdIG1ldGhvZEFyZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVhCTWVzc2FnZS5jcmVhdGUoIGJyaWRnZSwgYnVpbGQobWV0aG9kQXJncyksIHNvYXBWZXJzaW9uICk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRzIGEgSkFYQiBvYmplY3QgdGhhdCBiZWNvbWVzIHRoZSBwYXlsb2FkLgorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgT2JqZWN0IGJ1aWxkKE9iamVjdFtdIG1ldGhvZEFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgcGF5bG9hZCBKQVhCIG9iamVjdCBqdXN0IGJ5IHRha2luZworICAgICAqIG9uZSBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBmaW5hbCBzdGF0aWMgY2xhc3MgQmFyZSBleHRlbmRzIEpBWEIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBtZXRob2QgaW52b2NhdGlvbiBwYXJhbWV0ZXJzIHRoYXQgZ29lcyBpbnRvIHRoZSBwYXlsb2FkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWV0aG9kUG9zOworCisgICAgICAgIHByaXZhdGUgZmluYWwgVmFsdWVHZXR0ZXIgZ2V0dGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEJvZHlCdWlsZGVyfSBmcm9tIGEgYmFyZSBwYXJhbWV0ZXIuCisgICAgICAgICAqLworICAgICAgICBCYXJlKFBhcmFtZXRlckltcGwgcCwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKHAuZ2V0QnJpZGdlKCksIHNvYXBWZXJzaW9uKTsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kUG9zID0gcC5nZXRJbmRleCgpOworICAgICAgICAgICAgdGhpcy5nZXR0ZXIgPSBWYWx1ZUdldHRlci5nZXQocCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGlja3MgdXAgYW4gb2JqZWN0IGZyb20gdGhlIG1ldGhvZCBhcmd1bWVudHMgYW5kIHVzZXMgaXQuCisgICAgICAgICAqLworICAgICAgICBPYmplY3QgYnVpbGQoT2JqZWN0W10gbWV0aG9kQXJncykgeworICAgICAgICAgICAgcmV0dXJuIGdldHRlci5nZXQobWV0aG9kQXJnc1ttZXRob2RQb3NdKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlZCB0byBoYW5kbGUgYSAnd3JhcHBlcicgc3R5bGUgcmVxdWVzdC4KKyAgICAgKiBDb21tb24gcGFydCBvZiBycGMvbGl0IGFuZCBkb2MvbGl0LgorICAgICAqLworICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBXcmFwcGVkIGV4dGVuZHMgSkFYQiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXJlIGluIHRoZSBtZXRob2QgYXJndW1lbnQgbGlzdCBkbyB0aGV5IGNvbWUgZnJvbT8KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBpbnRbXSBpbmRpY2VzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBYnN0cmFjdHMgYXdheSB0aGUge0BsaW5rIEhvbGRlcn0gaGFuZGxpbmcgd2hlbiB0b3VjaGluZyBtZXRob2QgYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFZhbHVlR2V0dGVyW10gZ2V0dGVyczsKKworICAgICAgICBwcm90ZWN0ZWQgV3JhcHBlZChXcmFwcGVyUGFyYW1ldGVyIHdwLCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICAgICAgc3VwZXIod3AuZ2V0QnJpZGdlKCksIHNvYXBWZXJzaW9uKTsKKworICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiBjaGlsZHJlbiA9IHdwLmdldFdyYXBwZXJDaGlsZHJlbigpOworCisgICAgICAgICAgICBpbmRpY2VzID0gbmV3IGludFtjaGlsZHJlbi5zaXplKCldOworICAgICAgICAgICAgZ2V0dGVycyA9IG5ldyBWYWx1ZUdldHRlcltjaGlsZHJlbi5zaXplKCldOworICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGluZGljZXMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVySW1wbCBwID0gY2hpbGRyZW4uZ2V0KGkpOworICAgICAgICAgICAgICAgIGluZGljZXNbaV0gPSBwLmdldEluZGV4KCk7CisgICAgICAgICAgICAgICAgZ2V0dGVyc1tpXSA9IFZhbHVlR2V0dGVyLmdldChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgcGF5bG9hZCBKQVhCIG9iamVjdCBieSB3cmFwcGluZworICAgICAqIG11bHRpcGxlIHBhcmFtZXRlcnMgaW50byBvbmUgIndyYXBwZXIgYmVhbiIuCisgICAgICovCisgICAgZmluYWwgc3RhdGljIGNsYXNzIERvY0xpdCBleHRlbmRzIFdyYXBwZWQgeworICAgICAgICAvKioKKyAgICAgICAgICogSG93IGRvZXMgZWFjaCB3cmFwcGVkIHBhcmFtZXRlciBiaW5kcyB0byBYTUw/CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIFJhd0FjY2Vzc29yW10gYWNjZXNzb3JzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwcGVyIGJlYW4uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzIHdyYXBwZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQm9keUJ1aWxkZXJ9IGZyb20gYSB7QGxpbmsgV3JhcHBlclBhcmFtZXRlcn0uCisgICAgICAgICAqLworICAgICAgICBEb2NMaXQoV3JhcHBlclBhcmFtZXRlciB3cCwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKHdwLCBzb2FwVmVyc2lvbik7CisKKyAgICAgICAgICAgIHdyYXBwZXIgPSAoQ2xhc3Mpd3AuZ2V0QnJpZGdlKCkuZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGU7CisKKyAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVySW1wbD4gY2hpbGRyZW4gPSB3cC5nZXRXcmFwcGVyQ2hpbGRyZW4oKTsKKworICAgICAgICAgICAgYWNjZXNzb3JzID0gbmV3IFJhd0FjY2Vzc29yW2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8YWNjZXNzb3JzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIFBhcmFtZXRlckltcGwgcCA9IGNoaWxkcmVuLmdldChpKTsKKyAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzW2ldID0gcC5nZXRPd25lcigpLmdldEpBWEJDb250ZXh0KCkuZ2V0RWxlbWVudFByb3BlcnR5QWNjZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCAgLy8gVE9ETzogaTE4bgorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcisiIGRvIG5vdCBoYXZlIGEgcHJvcGVydHkgb2YgdGhlIG5hbWUgIituYW1lLGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhY2tzIGEgYnVuY2ggb2YgYXJndW1lbnRzIGludG8gYSB7QGxpbmsgQ29tcG9zaXRlU3RydWN0dXJlfS4KKyAgICAgICAgICovCisgICAgICAgIE9iamVjdCBidWlsZChPYmplY3RbXSBtZXRob2RBcmdzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdCBiZWFuID0gd3JhcHBlci5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgICAgICAgLy8gZmlsbCBpbiB3cmFwcGVkIHBhcmFtZXRlcnMgZnJvbSBtZXRob2RBcmdzCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaT1pbmRpY2VzLmxlbmd0aC0xOyBpPj0wOyBpLS0gKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yc1tpXS5zZXQoYmVhbixnZXR0ZXJzW2ldLmdldChtZXRob2RBcmdzW2luZGljZXNbaV1dKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGJlYW47CisgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGlycmVjb3ZlcmFibGUKKyAgICAgICAgICAgICAgICBFcnJvciB4ID0gbmV3IEluc3RhbnRpYXRpb25FcnJvcihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgeC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaXJyZWNvdmVyYWJsZQorICAgICAgICAgICAgICAgIEVycm9yIHggPSBuZXcgSWxsZWdhbEFjY2Vzc0Vycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgfSBjYXRjaCAoQWNjZXNzb3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBzZXQgbWV0aG9kIHRocm93IGEgY2hlY2tlZCBleGNlcHRpb24gb3Igc29tZXRoaW5nIGxpa2UgdGhhdAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOyAgICAvLyBUT0RPOmkxOG4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlZCB0byBjcmVhdGUgYSBwYXlsb2FkIEpBWEIgb2JqZWN0IGJ5IHdyYXBwaW5nCisgICAgICogbXVsdGlwbGUgcGFyYW1ldGVycyBpbnRvIGEge0BsaW5rIENvbXBvc2l0ZVN0cnVjdHVyZX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHJwYy9saXQsIGFzIHdlIGRvbid0IGhhdmUgYSB3cmFwcGVyIGJlYW4gZm9yIGl0LgorICAgICAqIChUT0RPOiBXaHkgZG9uJ3Qgd2UgaGF2ZSBhIHdyYXBwZXIgYmVhbiBmb3IgdGhpcywgd2hlbiBkb2MvbGl0IGRvZXMhPykKKyAgICAgKi8KKyAgICBmaW5hbCBzdGF0aWMgY2xhc3MgUnBjTGl0IGV4dGVuZHMgV3JhcHBlZCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIb3cgZG9lcyBlYWNoIHdyYXBwZWQgcGFyYW1ldGVyIGJpbmRzIHRvIFhNTD8KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgQnJpZGdlW10gcGFyYW1ldGVyQnJpZGdlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogTGlzdCBvZiBQYXJhbWV0ZXJzIHBhY2tlZCBpbiB0aGUgYm9keS4KKyAgICAgICAgICogT25seSB1c2VkIGZvciBlcnJvciBkaWFnbm9zdGljcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbWV0ZXJJbXBsPiBjaGlsZHJlbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBCb2R5QnVpbGRlcn0gZnJvbSBhIHtAbGluayBXcmFwcGVyUGFyYW1ldGVyfS4KKyAgICAgICAgICovCisgICAgICAgIFJwY0xpdChXcmFwcGVyUGFyYW1ldGVyIHdwLCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICAgICAgc3VwZXIod3AsIHNvYXBWZXJzaW9uKTsKKyAgICAgICAgICAgIC8vIHdlJ2xsIHVzZSBDb21wb3NpdGVTdHJ1Y3R1cmUgdG8gcGFjayByZXF1ZXN0cworICAgICAgICAgICAgYXNzZXJ0IHdwLmdldFR5cGVSZWZlcmVuY2UoKS50eXBlPT1Db21wb3NpdGVTdHJ1Y3R1cmUuY2xhc3M7CisKKyAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSB3cC5nZXRXcmFwcGVyQ2hpbGRyZW4oKTsKKworICAgICAgICAgICAgcGFyYW1ldGVyQnJpZGdlcyA9IG5ldyBCcmlkZ2VbY2hpbGRyZW4uc2l6ZSgpXTsKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxwYXJhbWV0ZXJCcmlkZ2VzLmxlbmd0aDsgaSsrICkKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJCcmlkZ2VzW2ldID0gY2hpbGRyZW4uZ2V0KGkpLmdldEJyaWRnZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhY2tzIGEgYnVuY2ggb2YgYXJndW1lbnRzIGludG9hIHtAbGluayBDb21wb3NpdGVTdHJ1Y3R1cmV9LgorICAgICAgICAgKi8KKyAgICAgICAgQ29tcG9zaXRlU3RydWN0dXJlIGJ1aWxkKE9iamVjdFtdIG1ldGhvZEFyZ3MpIHsKKyAgICAgICAgICAgIENvbXBvc2l0ZVN0cnVjdHVyZSBjcyA9IG5ldyBDb21wb3NpdGVTdHJ1Y3R1cmUoKTsKKyAgICAgICAgICAgIGNzLmJyaWRnZXMgPSBwYXJhbWV0ZXJCcmlkZ2VzOworICAgICAgICAgICAgY3MudmFsdWVzID0gbmV3IE9iamVjdFtwYXJhbWV0ZXJCcmlkZ2VzLmxlbmd0aF07CisKKyAgICAgICAgICAgIC8vIGZpbGwgaW4gd3JhcHBlZCBwYXJhbWV0ZXJzIGZyb20gbWV0aG9kQXJncworICAgICAgICAgICAgZm9yKCBpbnQgaT1pbmRpY2VzLmxlbmd0aC0xOyBpPj0wOyBpLS0gKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGFyZyA9IGdldHRlcnNbaV0uZ2V0KG1ldGhvZEFyZ3NbaW5kaWNlc1tpXV0pOworICAgICAgICAgICAgICAgIGlmKGFyZz09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTWV0aG9kIFBhcmFtZXRlcjogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmdldChpKS5nZXROYW1lKCkrIiBjYW5ub3QgYmUgbnVsbC4gVGhpcyBpcyBCUCAxLjEgUjIyMTEgdmlvbGF0aW9uLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjcy52YWx1ZXNbaV0gPSBhcmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvQ2FsbGJhY2tNZXRob2RIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvc2VpL0NhbGxiYWNrTWV0aG9kSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOGVjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvc2VpL0NhbGxiYWNrTWV0aG9kSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuc2VpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuSmF2YU1ldGhvZEltcGw7CitpbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKKy8qKgorICoge0BsaW5rIE1ldGhvZEhhbmRsZXJ9IHRoYXQgdXNlcyB7QGxpbmsgQXN5bmNIYW5kbGVyfS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2ZpbmFsIGNsYXNzIENhbGxiYWNrTWV0aG9kSGFuZGxlciBleHRlbmRzIEFzeW5jTWV0aG9kSGFuZGxlciB7CisKKyAgICAvKioKKyAgICAgKiBQb3NpdGlvbiBvZiB0aGUgYXJndW1lbnQgdGhhdCB0YWtlcyB7QGxpbmsgQXN5bmNIYW5kbGVyfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBoYW5kbGVyUG9zOworCisgICAgcHVibGljIENhbGxiYWNrTWV0aG9kSGFuZGxlcihTRUlTdHViIG93bmVyLCBKYXZhTWV0aG9kSW1wbCBqbSwgU3luY01ldGhvZEhhbmRsZXIgY29yZSwgaW50IGhhbmRsZXJQb3MpIHsKKyAgICAgICAgc3VwZXIob3duZXIsam0sY29yZSk7CisgICAgICAgIHRoaXMuaGFuZGxlclBvcyA9IGhhbmRsZXJQb3M7CisgICAgfQorCisgICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2UoT2JqZWN0IHByb3h5LCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoZSBzcGVjIHJlcXVpcmVzIHRoZSBsYXN0IGFyZ3VtZW50CisgICAgICAgIGZpbmFsIEFzeW5jSGFuZGxlciBoYW5kbGVyID0gKEFzeW5jSGFuZGxlcilhcmdzW2hhbmRsZXJQb3NdOworCisgICAgICAgIHJldHVybiBkb0ludm9rZShwcm94eSwgYXJncywgaGFuZGxlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9NZXNzYWdlRmlsbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvc2VpL01lc3NhZ2VGaWxsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRmNGJhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9NZXNzYWdlRmlsbGVyLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuc2VpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQnl0ZUFycmF5QXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkRhdGFIYW5kbGVyQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkpBWEJBdHRhY2htZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckltcGw7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKiBQdXRzIGEgbm9uLXBheWxvYWQgbWVzc2FnZSBwYXJhbWV0ZXIgdG8ge0BsaW5rIE1lc3NhZ2V9LgorICoKKyAqIDxwPgorICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGhhbmRsZSBoZWFkZXIgcGFyYW1ldGVycyBhbmQgYXR0YWNobWVudCBwYXJhbWV0ZXJzLgorICogVGhleSBhZGQgdGhpbmdzIHRvIHtAbGluayBNZXNzYWdlfS4KKyAqCisgKiBAc2VlIEJvZHlCdWlsZGVyCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCithYnN0cmFjdCBjbGFzcyBNZXNzYWdlRmlsbGVyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbWV0aG9kIGludm9jYXRpb24gcGFyYW1ldGVycyB0aGF0IHRoaXMgb2JqZWN0IGxvb2tzIGZvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1ldGhvZFBvczsKKworICAgIHByb3RlY3RlZCBNZXNzYWdlRmlsbGVyKCBpbnQgbWV0aG9kUG9zKSB7CisgICAgICAgIHRoaXMubWV0aG9kUG9zID0gbWV0aG9kUG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vdmVzIGFuIGFyZ3VtZW50IG9mIGEgbWV0aG9kIGludm9jYXRpb24gaW50byBhIHtAbGluayBNZXNzYWdlfS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGZpbGxJbihPYmplY3RbXSBtZXRob2RBcmdzLCBNZXNzYWdlIG1zZyk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGFyYW1ldGVyIGFzIGFuIE1JTUUgYXR0YWNobWVudCB0byB7QGxpbmsgTWVzc2FnZX0uCisgICAgICovCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEF0dGFjaG1lbnRGaWxsZXIgZXh0ZW5kcyBNZXNzYWdlRmlsbGVyIHsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFBhcmFtZXRlckltcGwgcGFyYW07CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBWYWx1ZUdldHRlciBnZXR0ZXI7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbWltZVR5cGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRlbnRJZFBhcnQ7CisKKyAgICAgICAgcHJvdGVjdGVkIEF0dGFjaG1lbnRGaWxsZXIoUGFyYW1ldGVySW1wbCBwYXJhbSwgVmFsdWVHZXR0ZXIgZ2V0dGVyKSB7CisgICAgICAgICAgICBzdXBlcihwYXJhbS5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIHRoaXMucGFyYW0gPSBwYXJhbTsKKyAgICAgICAgICAgIHRoaXMuZ2V0dGVyID0gZ2V0dGVyOworICAgICAgICAgICAgbWltZVR5cGUgPSBwYXJhbS5nZXRCaW5kaW5nKCkuZ2V0TWltZVR5cGUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udGVudElkUGFydCA9IFVSTEVuY29kZXIuZW5jb2RlKHBhcmFtLmdldFBhcnROYW1lKCksICJVVEYtOCIpKyc9JzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gTWVzc2FnZUZpbGxlciBiYXNlZCBvbiB0aGUgcGFyYW1ldGVyIHR5cGUKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmFtCisgICAgICAgICAqICAgICAgcnVudGltZSBQYXJhbWV0ZXIgdGhhdCBhYnN0cmFjdHMgdGhlIGFubm90YXRlZCBqYXZhIHBhcmFtZXRlcgorICAgICAgICAgKiBAcGFyYW0gZ2V0dGVyCisgICAgICAgICAqICAgICAgR2V0cyBhIHZhbHVlIGZyb20gYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHBhcmFtZXRlciBwYXNzZWQKKyAgICAgICAgICogICAgICBhcyBhIG1ldGhvZCBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUZpbGxlciBjcmVhdGVBdHRhY2htZW50RmlsbGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIFZhbHVlR2V0dGVyIGdldHRlcikgeworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IChDbGFzcylwYXJhbS5nZXRUeXBlUmVmZXJlbmNlKCkudHlwZTsKKyAgICAgICAgICAgIGlmIChEYXRhSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpIHx8IFNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlckZpbGxlcihwYXJhbSwgZ2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZVtdLmNsYXNzPT10eXBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlGaWxsZXIocGFyYW0sIGdldHRlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYoaXNYTUxNaW1lVHlwZShwYXJhbS5nZXRCaW5kaW5nKCkuZ2V0TWltZVR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpBWEJGaWxsZXIocGFyYW0sIGdldHRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YUhhbmRsZXJGaWxsZXIocGFyYW0sIGdldHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZ2V0Q29udGVudElkKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRJZFBhcnQrVVVJRC5yYW5kb21VVUlEKCkrIkBqYXh3cy5zdW4uY29tIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ5dGVBcnJheUZpbGxlciBleHRlbmRzIEF0dGFjaG1lbnRGaWxsZXIgeworICAgICAgICBwcm90ZWN0ZWQgQnl0ZUFycmF5RmlsbGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIFZhbHVlR2V0dGVyIGdldHRlcikgeworICAgICAgICAgICAgc3VwZXIocGFyYW0sIGdldHRlcik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBmaWxsSW4oT2JqZWN0W10gbWV0aG9kQXJncywgTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50SWQgPSBnZXRDb250ZW50SWQoKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBnZXR0ZXIuZ2V0KG1ldGhvZEFyZ3NbbWV0aG9kUG9zXSk7CisgICAgICAgICAgICBBdHRhY2htZW50IGF0dCA9IG5ldyBCeXRlQXJyYXlBdHRhY2htZW50KGNvbnRlbnRJZCwoYnl0ZVtdKW9iaixtaW1lVHlwZSk7CisgICAgICAgICAgICBtc2cuZ2V0QXR0YWNobWVudHMoKS5hZGQoYXR0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERhdGFIYW5kbGVyRmlsbGVyIGV4dGVuZHMgQXR0YWNobWVudEZpbGxlciB7CisgICAgICAgIHByb3RlY3RlZCBEYXRhSGFuZGxlckZpbGxlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBWYWx1ZUdldHRlciBnZXR0ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtLCBnZXR0ZXIpOworICAgICAgICB9CisgICAgICAgIHZvaWQgZmlsbEluKE9iamVjdFtdIG1ldGhvZEFyZ3MsIE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBTdHJpbmcgY29udGVudElkID0gZ2V0Q29udGVudElkKCk7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gZ2V0dGVyLmdldChtZXRob2RBcmdzW21ldGhvZFBvc10pOworICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSAob2JqIGluc3RhbmNlb2YgRGF0YUhhbmRsZXIpID8gKERhdGFIYW5kbGVyKW9iaiA6IG5ldyBEYXRhSGFuZGxlcihvYmosbWltZVR5cGUpOworICAgICAgICAgICAgQXR0YWNobWVudCBhdHQgPSBuZXcgRGF0YUhhbmRsZXJBdHRhY2htZW50KGNvbnRlbnRJZCwgZGgpOworICAgICAgICAgICAgbXNnLmdldEF0dGFjaG1lbnRzKCkuYWRkKGF0dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKQVhCRmlsbGVyIGV4dGVuZHMgQXR0YWNobWVudEZpbGxlciB7CisgICAgICAgIHByb3RlY3RlZCBKQVhCRmlsbGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIFZhbHVlR2V0dGVyIGdldHRlcikgeworICAgICAgICAgICAgc3VwZXIocGFyYW0sIGdldHRlcik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBmaWxsSW4oT2JqZWN0W10gbWV0aG9kQXJncywgTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50SWQgPSBnZXRDb250ZW50SWQoKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBnZXR0ZXIuZ2V0KG1ldGhvZEFyZ3NbbWV0aG9kUG9zXSk7CisgICAgICAgICAgICBBdHRhY2htZW50IGF0dCA9IG5ldyBKQVhCQXR0YWNobWVudChjb250ZW50SWQsIG9iaiwgcGFyYW0uZ2V0QnJpZGdlKCksIG1pbWVUeXBlKTsKKyAgICAgICAgICAgIG1zZy5nZXRBdHRhY2htZW50cygpLmFkZChhdHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhcmFtZXRlciBhcyBhbiBoZWFkZXIuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEhlYWRlciBleHRlbmRzIE1lc3NhZ2VGaWxsZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJyaWRnZSBicmlkZ2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgVmFsdWVHZXR0ZXIgZ2V0dGVyOworCisgICAgICAgIHByb3RlY3RlZCBIZWFkZXIoaW50IG1ldGhvZFBvcywgQnJpZGdlIGJyaWRnZSwgVmFsdWVHZXR0ZXIgZ2V0dGVyKSB7CisgICAgICAgICAgICBzdXBlcihtZXRob2RQb3MpOworICAgICAgICAgICAgdGhpcy5icmlkZ2UgPSBicmlkZ2U7CisgICAgICAgICAgICB0aGlzLmdldHRlciA9IGdldHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZmlsbEluKE9iamVjdFtdIG1ldGhvZEFyZ3MsIE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXR0ZXIuZ2V0KG1ldGhvZEFyZ3NbbWV0aG9kUG9zXSk7CisgICAgICAgICAgICBtc2cuZ2V0SGVhZGVycygpLmFkZChIZWFkZXJzLmNyZWF0ZShicmlkZ2UsdmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpeworICAgICAgICByZXR1cm4gKG1pbWVUeXBlLmVxdWFscygidGV4dC94bWwiKSB8fCBtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL3htbCIpKSA/IHRydWUgOiBmYWxzZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvTWV0aG9kSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9NZXRob2RIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjZTVhOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvTWV0aG9kSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuc2VpOworCitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CisKKy8qKgorICogSGFuZGxlcyBhbiBpbnZvY2F0aW9uIG9mIGEgbWV0aG9kLgorICoKKyAqIDxwPgorICogRWFjaCBpbnN0YW5jZSBvZiB7QGxpbmsgTWV0aG9kSGFuZGxlcn0gaGFzIGFuIGltcGxpY2l0IGtub3dsZWRnZSBvZgorICogYSBwYXJ0aWN1bGFyIG1ldGhvZCB0aGF0IGl0IGhhbmRsZXMuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kSGFuZGxlciB7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgU0VJU3R1YiBvd25lcjsKKworICAgIHByb3RlY3RlZCBNZXRob2RIYW5kbGVyKFNFSVN0dWIgb3duZXIpIHsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm94eQorICAgICAqICAgICAgVGhlIHByb3h5IG9iamVjdCBleHBvc2VkIHRvIHRoZSB1c2VyLiBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogICAgICBUaGUgbWV0aG9kIGludm9jYXRpb24gYXJndW1lbnRzLiBUbyBoYW5kbGUgYXN5bmNocm9vbnVzIG1ldGhvZCBpbnZvY2F0aW9ucworICAgICAqICAgICAgd2l0aG91dCBhcnJheSByZWFsbG9jYXRpb24sIHRoaXMgYXJheSBpcyBhbGxvd2VkIHRvIGJlIGxvbmdlciB0aGFuIHRoZQorICAgICAqICAgICAgYWN0dWFsIG51bWJlciBvZiBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZC4gQWRkaXRpb25hbCBhcnJheSBzcGFjZSBzaG91bGQgYmUKKyAgICAgKiAgICAgIHNpbXBseSBpZ25vcmVkLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGEgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uLiBtYXkgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgSWYgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUsIGEge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259IHNpZ25hbHMgYW4gZXJyb3IKKyAgICAgKiAgICAgIGR1cmluZyB0aGUgc2VydmljZSBpbnZvY2F0aW9uLgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICogICAgICBzb21lIGZhdWx0cyBhcmUgcmVwb3J0ZWQgaW4gdGVybXMgb2YgY2hlY2tlZCBleGNlcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgT2JqZWN0W10gYXJncykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFRocm93YWJsZTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvUG9sbGluZ01ldGhvZEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvUG9sbGluZ01ldGhvZEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODMwYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9Qb2xsaW5nTWV0aG9kSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuc2VpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuSmF2YU1ldGhvZEltcGw7CitpbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworCisvKioKKyAqIHtAbGluayBNZXRob2RIYW5kbGVyfSB0aGF0IGhhbmRsZXMgYXN5bmNocm9ub3VzIGludm9jYXRpb25zIHRocm91Z2gge0BsaW5rIFJlc3BvbnNlfS4KKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZmluYWwgY2xhc3MgUG9sbGluZ01ldGhvZEhhbmRsZXIgZXh0ZW5kcyBBc3luY01ldGhvZEhhbmRsZXIgeworCisgICAgcHVibGljIFBvbGxpbmdNZXRob2RIYW5kbGVyKFNFSVN0dWIgb3duZXIsIEphdmFNZXRob2RJbXBsIGptLCBTeW5jTWV0aG9kSGFuZGxlciBjb3JlKSB7CisgICAgICAgIHN1cGVyKG93bmVyLCBqbSwgY29yZSk7CisgICAgfQorCisgICAgcHVibGljIFJlc3BvbnNlPD8+IGludm9rZShPYmplY3QgcHJveHksIE9iamVjdFtdIGFyZ3MpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRvSW52b2tlKHByb3h5LGFyZ3MsbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9SZXNwb25zZUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvUmVzcG9uc2VCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1MzljOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvUmVzcG9uc2VCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw2NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuc2VpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkNvbXBvc2l0ZVN0cnVjdHVyZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5SYXdBY2Nlc3NvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQXR0YWNobWVudFVubWFyc2hhbGxlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVySW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5TZXJ2ZXJNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKKworaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CitpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmF3dC5JbWFnZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBSZWFkcyBhIHJlc3BvbnNlIHtAbGluayBNZXNzYWdlfSwgZGlzYXNzZW1ibGVzIGl0LCBhbmQgbW92ZXMgb2J0YWluZWQgSmF2YSB2YWx1ZXMKKyAqIHRvIHRoZSBleHBlY3RlZCBwbGFjZXMuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworYWJzdHJhY3QgY2xhc3MgUmVzcG9uc2VCdWlsZGVyIHsKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIHJlc3BvbnNlIHtAbGluayBNZXNzYWdlfSwgZGlzYXNzZW1ibGVzIGl0LCBhbmQgbW92ZXMgb2J0YWluZWQgSmF2YSB2YWx1ZXMKKyAgICAgKiB0byB0aGUgZXhwZWN0ZWQgcGxhY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcGx5CisgICAgICogICAgICBUaGUgcmVwbHkge0BsaW5rIE1lc3NhZ2V9IHRvIGJlIGRlLWNvbXBvc2VkLgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogICAgICBUaGUgSmF2YSBhcmd1bWVudHMgZ2l2ZW4gdG8gdGhlIFNFSSBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgKiAgICAgIFNvbWUgcGFydHMgb2YgdGhlIHJlcGx5IG1lc3NhZ2UgbWF5IGJlIHNldCB0byB7QGxpbmsgSG9sZGVyfXMgaW4gdGhlIGFyZ3VtZW50cy4KKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBJZiBhIHBhcnQgb2YgdGhlIHJlcGx5IG1lc3NhZ2UgaXMgcmV0dXJuZWQgYXMgYSByZXR1cm4gdmFsdWUgZnJvbQorICAgICAqICAgICAgdGhlIFNFSSBtZXRob2QsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhhdCB2YWx1ZS4gT3RoZXJ3aXNlIG51bGwuCisgICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZyB1bm1hcnNoYWxsaW5nIHRoZSByZXBseSBtZXNzYWdlLgorICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgICogICAgICBpZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZyB1bm1hcnNoYWxsaW5nIHRoZSByZXBseSBtZXNzYWdlLgorICAgICAqLworICAgIGFic3RyYWN0IE9iamVjdCByZWFkUmVzcG9uc2UoTWVzc2FnZSByZXBseSwgT2JqZWN0W10gYXJncykgdGhyb3dzIEpBWEJFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBOb25lIGV4dGVuZHMgUmVzcG9uc2VCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBOb25lKCl7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIE9iamVjdCByZWFkUmVzcG9uc2UoTWVzc2FnZSBtc2csIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIG1zZy5jb25zdW1lKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UgdGhhdCBwcm9kdWNlcyBudWxsIHJldHVybiB2YWx1ZS4KKyAgICAgKiBVc2VkIGZvciBvcGVyYXRpb25zIHRoYXQgZG9lc24ndCBoYXZlIGFueSBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNwb25zZUJ1aWxkZXIgTk9ORSA9IG5ldyBOb25lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSAndW5pbml0aWFsaXplZCcgdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIHByaW1pdGl2ZSB0eXBlcywgaXQncyAnMCcsIGFuZCBmb3IgcmVmZXJlbmNlIHR5cGVzLCBpdCdzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Vk1VbmluaXRpYWxpemVkVmFsdWUoVHlwZSB0eXBlKSB7CisgICAgICAgIC8vIGlmIHRoaXMgbWFwIHJldHVybnMgbnVsbCwgdGhhdCBtZWFucyB0aGUgJ3R5cGUnIGlzIGEgcmVmZXJlbmNlIHR5cGUsCisgICAgICAgIC8vIGluIHdoaWNoIGNhc2UgJ251bGwnIGlzIHRoZSBjb3JyZWN0IG51bGwgdmFsdWUsIHNvIHRoaXMgY29kZSBpcyBjb3JyZWN0LgorICAgICAgICByZXR1cm4gcHJpbWl0aXZlVW5pbml0aWFsaXplZFZhbHVlcy5nZXQodHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzLE9iamVjdD4gcHJpbWl0aXZlVW5pbml0aWFsaXplZFZhbHVlcyA9IG5ldyBIYXNoTWFwPENsYXNzLCBPYmplY3Q+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBNYXA8Q2xhc3MsIE9iamVjdD4gbSA9IHByaW1pdGl2ZVVuaW5pdGlhbGl6ZWRWYWx1ZXM7CisgICAgICAgIG0ucHV0KGludC5jbGFzcywoaW50KTApOworICAgICAgICBtLnB1dChjaGFyLmNsYXNzLChjaGFyKTApOworICAgICAgICBtLnB1dChieXRlLmNsYXNzLChieXRlKTApOworICAgICAgICBtLnB1dChzaG9ydC5jbGFzcywoc2hvcnQpMCk7CisgICAgICAgIG0ucHV0KGxvbmcuY2xhc3MsKGxvbmcpMCk7CisgICAgICAgIG0ucHV0KGZsb2F0LmNsYXNzLChmbG9hdCkwKTsKKyAgICAgICAgbS5wdXQoZG91YmxlLmNsYXNzLChkb3VibGUpMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIFJlc3BvbnNlQnVpbGRlcn0gdGhhdCBzZXRzIHRoZSBWTSB1bmluaXRpYWxpemVkIHZhbHVlIHRvIHRoZSB0eXBlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBOdWxsU2V0dGVyIGV4dGVuZHMgUmVzcG9uc2VCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZVNldHRlciBzZXR0ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG51bGxWYWx1ZTsKKworICAgICAgICBwdWJsaWMgTnVsbFNldHRlcihWYWx1ZVNldHRlciBzZXR0ZXIsIE9iamVjdCBudWxsVmFsdWUpeworICAgICAgICAgICAgYXNzZXJ0IHNldHRlciE9bnVsbDsKKyAgICAgICAgICAgIHRoaXMubnVsbFZhbHVlID0gbnVsbFZhbHVlOworICAgICAgICAgICAgdGhpcy5zZXR0ZXIgPSBzZXR0ZXI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIE9iamVjdCByZWFkUmVzcG9uc2UoTWVzc2FnZSBtc2csIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXR0ZXIucHV0KG51bGxWYWx1ZSwgYXJncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgUmVzcG9uc2VCdWlsZGVyfSB0aGF0IGlzIGEgY29tcG9zaXRpb24gb2YgbXVsdGlwbGUKKyAgICAgKiB7QGxpbmsgUmVzcG9uc2VCdWlsZGVyfXMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTb21ldGltZXMgd2UgbmVlZCB0byBsb29rIGF0IG11bHRpcGxlIHBhcnRzIG9mIHRoZSByZXBseSBtZXNzYWdlCisgICAgICogKHNheSwgdHdvIGhlYWRlciBwYXJhbXMsIG9uZSBib2R5IHBhcmFtLCBhbmQgdGhyZWUgYXR0YWNobWVudHMsIGV0Yy4pCisgICAgICogYW5kIHRoYXQncyB3aGVuIHRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gY29tYmluZSBtdWx0aXBsZSB7QGxpbmsgUmVzcG9uc2VCdWlsZGVyfXMKKyAgICAgKiAodGhhdCBlYWNoIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBvbmUgcGFydCkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbW9kZWwgZ3VhcmFudGVlcyB0aGF0IG9ubHkgYXQgbW9zdCBvbmUge0BsaW5rIFJlc3BvbnNlQnVpbGRlcn0gd2lsbAorICAgICAqIHJldHVybiBhIHZhbHVlIGFzIGEgcmV0dXJuIHZhbHVlIChhbmQgZXZlcnl0aGluZyBlbHNlIGhhcyB0byBnbyB0bworICAgICAqIHtAbGluayBIb2xkZXJ9cy4pCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIENvbXBvc2l0ZSBleHRlbmRzIFJlc3BvbnNlQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzcG9uc2VCdWlsZGVyW10gYnVpbGRlcnM7CisKKyAgICAgICAgcHVibGljIENvbXBvc2l0ZShSZXNwb25zZUJ1aWxkZXIuLi4gYnVpbGRlcnMpIHsKKyAgICAgICAgICAgIHRoaXMuYnVpbGRlcnMgPSBidWlsZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wb3NpdGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmVzcG9uc2VCdWlsZGVyPiBidWlsZGVycykgeworICAgICAgICAgICAgdGhpcyhidWlsZGVycy50b0FycmF5KG5ldyBSZXNwb25zZUJ1aWxkZXJbYnVpbGRlcnMuc2l6ZSgpXSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCByZWFkUmVzcG9uc2UoTWVzc2FnZSBtc2csIE9iamVjdFtdIGFyZ3MpIHRocm93cyBKQVhCRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0IHJldFZhbCA9IG51bGw7CisgICAgICAgICAgICBmb3IgKFJlc3BvbnNlQnVpbGRlciBidWlsZGVyIDogYnVpbGRlcnMpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgciA9IGJ1aWxkZXIucmVhZFJlc3BvbnNlKG1zZyxhcmdzKTsKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIG9ubHkgYXQgbW9zdCBvbmUgUmVzcG9uc2VCdWlsZGVyIHRoYXQgcmV0dXJucyBhIHZhbHVlLgorICAgICAgICAgICAgICAgIGlmKHIhPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHJldFZhbD09bnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYW4gQXR0YWNobWVudCBpbnRvIGEgSmF2YSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEF0dGFjaG1lbnRCdWlsZGVyIGV4dGVuZHMgUmVzcG9uc2VCdWlsZGVyIHsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFZhbHVlU2V0dGVyIHNldHRlcjsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFBhcmFtZXRlckltcGwgcGFyYW07CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBuYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwbmFtZTE7CisKKyAgICAgICAgQXR0YWNobWVudEJ1aWxkZXIoUGFyYW1ldGVySW1wbCBwYXJhbSwgVmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICB0aGlzLnNldHRlciA9IHNldHRlcjsKKyAgICAgICAgICAgIHRoaXMucGFyYW0gPSBwYXJhbTsKKyAgICAgICAgICAgIHRoaXMucG5hbWUgPSBwYXJhbS5nZXRQYXJ0TmFtZSgpOworICAgICAgICAgICAgdGhpcy5wbmFtZTEgPSAiPCIrcG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBBdHRhY2htZW50QnVpbGRlciBiYXNlZCBvbiB0aGUgcGFyYW1ldGVyIHR5cGUKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmFtCisgICAgICAgICAqICAgICAgcnVudGltZSBQYXJhbWV0ZXIgdGhhdCBhYnN0cmFjdHMgdGhlIGFubm90YXRlZCBqYXZhIHBhcmFtZXRlcgorICAgICAgICAgKiBAcGFyYW0gc2V0dGVyCisgICAgICAgICAqICAgICAgc3BlY2lmaWVzIGhvdyB0aGUgb2J0YWluZWQgdmFsdWUgaXMgc2V0IGludG8gdGhlIGFyZ3VtZW50LiBUYWtlcworICAgICAgICAgKiAgICAgIGNhcmUgb2YgSG9sZGVyIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzcG9uc2VCdWlsZGVyIGNyZWF0ZUF0dGFjaG1lbnRCdWlsZGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IChDbGFzcylwYXJhbS5nZXRUeXBlUmVmZXJlbmNlKCkudHlwZTsKKyAgICAgICAgICAgIGlmIChEYXRhSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlckJ1aWxkZXIocGFyYW0sIHNldHRlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGVbXS5jbGFzcz09dHlwZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5QnVpbGRlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU291cmNlQnVpbGRlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihJbWFnZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJ1aWxkZXIocGFyYW0sIHNldHRlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYoSW5wdXRTdHJlYW0uY2xhc3M9PXR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtQnVpbGRlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihpc1hNTE1pbWVUeXBlKHBhcmFtLmdldEJpbmRpbmcoKS5nZXRNaW1lVHlwZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSkFYQkJ1aWxkZXIocGFyYW0sIHNldHRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXR0YWNobWVudCBpcyBub3QgbWFwcGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJlYWRSZXNwb25zZShNZXNzYWdlIG1zZywgT2JqZWN0W10gYXJncykgdGhyb3dzIEpBWEJFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBUT0RPIG5vdCB0byBsb29wCisgICAgICAgICAgICBmb3IgKEF0dGFjaG1lbnQgYXR0IDogbXNnLmdldEF0dGFjaG1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCA9IGdldFdTRExQYXJ0TmFtZShhdHQpOworICAgICAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHBhcnQuZXF1YWxzKHBuYW1lKSB8fCBwYXJ0LmVxdWFscyhwbmFtZTEpKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcEF0dGFjaG1lbnQoYXR0LCBhcmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IE9iamVjdCBtYXBBdHRhY2htZW50KEF0dGFjaG1lbnQgYXR0LCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEYXRhSGFuZGxlckJ1aWxkZXIgZXh0ZW5kcyBBdHRhY2htZW50QnVpbGRlciB7CisgICAgICAgIERhdGFIYW5kbGVyQnVpbGRlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBWYWx1ZVNldHRlciBzZXR0ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtLCBzZXR0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IG1hcEF0dGFjaG1lbnQoQXR0YWNobWVudCBhdHQsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXR0ZXIucHV0KGF0dC5hc0RhdGFIYW5kbGVyKCksIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQnl0ZUFycmF5QnVpbGRlciBleHRlbmRzIEF0dGFjaG1lbnRCdWlsZGVyIHsKKyAgICAgICAgQnl0ZUFycmF5QnVpbGRlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBWYWx1ZVNldHRlciBzZXR0ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtLCBzZXR0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IG1hcEF0dGFjaG1lbnQoQXR0YWNobWVudCBhdHQsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXR0ZXIucHV0KGF0dC5hc0J5dGVBcnJheSgpLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNvdXJjZUJ1aWxkZXIgZXh0ZW5kcyBBdHRhY2htZW50QnVpbGRlciB7CisgICAgICAgIFNvdXJjZUJ1aWxkZXIoUGFyYW1ldGVySW1wbCBwYXJhbSwgVmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICBzdXBlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBtYXBBdHRhY2htZW50KEF0dGFjaG1lbnQgYXR0LCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0dGVyLnB1dChhdHQuYXNTb3VyY2UoKSwgYXJncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbWFnZUJ1aWxkZXIgZXh0ZW5kcyBBdHRhY2htZW50QnVpbGRlciB7CisgICAgICAgIEltYWdlQnVpbGRlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBWYWx1ZVNldHRlciBzZXR0ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtLCBzZXR0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IG1hcEF0dGFjaG1lbnQoQXR0YWNobWVudCBhdHQsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIEltYWdlIGltYWdlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbWFnZSA9IEltYWdlSU8ucmVhZChhdHQuYXNJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXR0ZXIucHV0KGltYWdlLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIElucHV0U3RyZWFtQnVpbGRlciBleHRlbmRzIEF0dGFjaG1lbnRCdWlsZGVyIHsKKyAgICAgICAgSW5wdXRTdHJlYW1CdWlsZGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgc3VwZXIocGFyYW0sIHNldHRlcik7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgbWFwQXR0YWNobWVudChBdHRhY2htZW50IGF0dCwgT2JqZWN0W10gYXJncykgeworICAgICAgICAgICAgcmV0dXJuIHNldHRlci5wdXQoYXR0LmFzSW5wdXRTdHJlYW0oKSwgYXJncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBKQVhCQnVpbGRlciBleHRlbmRzIEF0dGFjaG1lbnRCdWlsZGVyIHsKKyAgICAgICAgSkFYQkJ1aWxkZXIoUGFyYW1ldGVySW1wbCBwYXJhbSwgVmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICBzdXBlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBtYXBBdHRhY2htZW50KEF0dGFjaG1lbnQgYXR0LCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gcGFyYW0uZ2V0QnJpZGdlKCkudW5tYXJzaGFsKGF0dC5hc0lucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgcmV0dXJuIHNldHRlci5wdXQob2JqLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFdTREwgcGFydCBuYW1lIG9mIHRoaXMgYXR0YWNobWVudC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEFjY29yZGluZyB0byBXU0kgQVAgMS4wCisgICAgICogPFBSRT4KKyAgICAgKiAzLjggVmFsdWUtc3BhY2Ugb2YgQ29udGVudC1JZCBIZWFkZXIKKyAgICAgKiAgIERlZmluaXRpb246IGNvbnRlbnQtaWQgcGFydCBlbmNvZGluZworICAgICAqICAgVGhlICJjb250ZW50LWlkIHBhcnQgZW5jb2RpbmciIGNvbnNpc3RzIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mOgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIHdzZGw6cGFydCBlbGVtZW50IHJlZmVyZW5jZWQgYnkgdGhlIG1pbWU6Y29udGVudCwgaW4gd2hpY2ggY2hhcmFjdGVycyBkaXNhbGxvd2VkIGluIGNvbnRlbnQtaWQgaGVhZGVycyAobm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXMgcmVwcmVzZW50ZWQgYnkgY29kZSBwb2ludHMgYWJvdmUgMHg3RikgYXJlIGVzY2FwZWQgYXMgZm9sbG93czoKKyAgICAgKiAgICAgbyBFYWNoIGRpc2FsbG93ZWQgY2hhcmFjdGVyIGlzIGNvbnZlcnRlZCB0byBVVEYtOCBhcyBvbmUgb3IgbW9yZSBieXRlcy4KKyAgICAgKiAgICAgbyBBbnkgYnl0ZXMgY29ycmVzcG9uZGluZyB0byBhIGRpc2FsbG93ZWQgY2hhcmFjdGVyIGFyZSBlc2NhcGVkIHdpdGggdGhlIFVSSSBlc2NhcGluZyBtZWNoYW5pc20gKHRoYXQgaXMsIGNvbnZlcnRlZCB0byAlSEgsIHdoZXJlIEhIIGlzIHRoZSBoZXhhZGVjaW1hbCBub3RhdGlvbiBvZiB0aGUgYnl0ZSB2YWx1ZSkuCisgICAgICogICAgIG8gVGhlIG9yaWdpbmFsIGNoYXJhY3RlciBpcyByZXBsYWNlZCBieSB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgKiBUaGUgY2hhcmFjdGVyICc9JyAoMHgzRCkuCisgICAgICogQSBnbG9iYWxseSB1bmlxdWUgdmFsdWUgc3VjaCBhcyBhIFVVSUQuCisgICAgICogVGhlIGNoYXJhY3RlciAnQCcgKDB4NDApLgorICAgICAqIEEgdmFsaWQgZG9tYWluIG5hbWUgdW5kZXIgdGhlIGF1dGhvcml0eSBvZiB0aGUgZW50aXR5IGNvbnN0cnVjdGluZyB0aGUgbWVzc2FnZS4KKyAgICAgKiA8L1BSRT4KKyAgICAgKgorICAgICAqIFNvIGEgd3NkbDpwYXJ0IGZvb1BhcnQgd2lsbCBiZSBlbmNvZGVkIGFzOgorICAgICAqICAgICAgPGZvb1BhcnQ9c29tZXJlYWxseWJpZ251bWJlcmxpa2VhdXVpZEBleGFtcGxlLmNvbT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbAorICAgICAqICAgICAgaWYgdGhlIHBhcnNpbmcgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0V1NETFBhcnROYW1lKGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQgYXR0KXsKKyAgICAgICAgU3RyaW5nIGNJZCA9IGF0dC5nZXRDb250ZW50SWQoKTsKKworICAgICAgICBpbnQgaW5kZXggPSBjSWQubGFzdEluZGV4T2YoJ0AnLCBjSWQubGVuZ3RoKCkpOworICAgICAgICBpZihpbmRleCA9PSAtMSl7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gY0lkLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgIGluZGV4ID0gbG9jYWxQYXJ0Lmxhc3RJbmRleE9mKCc9JywgbG9jYWxQYXJ0Lmxlbmd0aCgpKTsKKyAgICAgICAgaWYoaW5kZXggPT0gLTEpeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhLm5ldC5VUkxEZWNvZGVyLmRlY29kZShsb2NhbFBhcnQuc3Vic3RyaW5nKDAsIGluZGV4KSwgIlVURi04Iik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgaGVhZGVyIGludG8gYSBKQVhCIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgSGVhZGVyIGV4dGVuZHMgUmVzcG9uc2VCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCcmlkZ2U8Pz4gYnJpZGdlOworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlU2V0dGVyIHNldHRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBoZWFkZXJOYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gc29hcFZlcnNpb24KKyAgICAgICAgICogICAgICBTT0FQMS4xIG9yIDEuMgorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIGJyaWRnZQorICAgICAgICAgKiAgICAgIHNwZWNpZmllcyBob3cgdG8gdW5tYXJzaGFsIGEgaGVhZGVyIGludG8gYSBKQVhCIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHNldHRlcgorICAgICAgICAgKiAgICAgIHNwZWNpZmllcyBob3cgdGhlIG9idGFpbmVkIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSGVhZGVyKFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uLCBRTmFtZSBuYW1lLCBCcmlkZ2U8Pz4gYnJpZGdlLCBWYWx1ZVNldHRlciBzZXR0ZXIpIHsKKyAgICAgICAgICAgIHRoaXMuc29hcFZlcnNpb24gPSBzb2FwVmVyc2lvbjsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyTmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLmJyaWRnZSA9IGJyaWRnZTsKKyAgICAgICAgICAgIHRoaXMuc2V0dGVyID0gc2V0dGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEhlYWRlcihTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgUGFyYW1ldGVySW1wbCBwYXJhbSwgVmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICB0aGlzKHNvYXBWZXJzaW9uLAorICAgICAgICAgICAgICAgIHBhcmFtLmdldFR5cGVSZWZlcmVuY2UoKS50YWdOYW1lLAorICAgICAgICAgICAgICAgIHBhcmFtLmdldEJyaWRnZSgpLAorICAgICAgICAgICAgICAgIHNldHRlcik7CisgICAgICAgICAgICBhc3NlcnQgcGFyYW0uZ2V0T3V0QmluZGluZygpPT0gUGFyYW1ldGVyQmluZGluZy5IRUFERVI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNPQVBGYXVsdEV4Y2VwdGlvbiBjcmVhdGVEdXBsaWNhdGVIZWFkZXJFeGNlcHRpb24oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IHNvYXBWZXJzaW9uLnNhYWpTb2FwRmFjdG9yeS5jcmVhdGVGYXVsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlck1lc3NhZ2VzLkRVUExJQ0FURV9QT1JUX0tOT1dOX0hFQURFUihoZWFkZXJOYW1lKSwgc29hcFZlcnNpb24uZmF1bHRDb2RlU2VydmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBGYXVsdEV4Y2VwdGlvbihmYXVsdCk7CisgICAgICAgICAgICB9IGNhdGNoKFNPQVBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCByZWFkUmVzcG9uc2UoTWVzc2FnZSBtc2csIE9iamVjdFtdIGFyZ3MpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlciBoZWFkZXIgPSBudWxsOworICAgICAgICAgICAgSXRlcmF0b3I8Y29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyPiBpdCA9CisgICAgICAgICAgICAgICAgbXNnLmdldEhlYWRlcnMoKS5nZXRIZWFkZXJzKGhlYWRlck5hbWUsdHJ1ZSk7CisgICAgICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlRHVwbGljYXRlSGVhZGVyRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihoZWFkZXIhPW51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNldHRlci5wdXQoIGhlYWRlci5yZWFkQXNKQVhCKGJyaWRnZSksIGFyZ3MgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvLyBoZWFkZXIgbm90IGZvdW5kLgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIHdob2xlIHBheWxvYWQgaW50byBhIHNpbmdsZSBKQVhCIGJlYW4uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEJvZHkgZXh0ZW5kcyBSZXNwb25zZUJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJyaWRnZTw/PiBicmlkZ2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgVmFsdWVTZXR0ZXIgc2V0dGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gYnJpZGdlCisgICAgICAgICAqICAgICAgc3BlY2lmaWVzIGhvdyB0byB1bm1hcnNoYWwgdGhlIHBheWxvYWQgaW50byBhIEpBWEIgb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gc2V0dGVyCisgICAgICAgICAqICAgICAgc3BlY2lmaWVzIGhvdyB0aGUgb2J0YWluZWQgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCb2R5KEJyaWRnZTw/PiBicmlkZ2UsIFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgdGhpcy5icmlkZ2UgPSBicmlkZ2U7CisgICAgICAgICAgICB0aGlzLnNldHRlciA9IHNldHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcmVhZFJlc3BvbnNlKE1lc3NhZ2UgbXNnLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc2V0dGVyLnB1dCggbXNnLnJlYWRQYXlsb2FkQXNKQVhCKGJyaWRnZSksIGFyZ3MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyZWF0cyBhIHBheWxvYWQgYXMgbXVsdGlwbGUgcGFydHMgd3JhcHBlZCBpbnRvIG9uZSBlbGVtZW50LAorICAgICAqIGFuZCBwcm9jZXNzZXMgYWxsIHN1Y2ggd3JhcHBlZCBwYXJ0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgRG9jTGl0IGV4dGVuZHMgUmVzcG9uc2VCdWlsZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAbGluayBQYXJ0QnVpbGRlcn0ga2V5ZWQgYnkgdGhlIGVsZW1lbnQgbmFtZSAoaW5zaWRlIHRoZSB3cmFwcGVyIGVsZW1lbnQuKQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXJ0QnVpbGRlcltdIHBhcnRzOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQnJpZGdlIHdyYXBwZXI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSB3cmFwcGVyTmFtZTsKKworICAgICAgICBwdWJsaWMgRG9jTGl0KFdyYXBwZXJQYXJhbWV0ZXIgd3ApIHsKKyAgICAgICAgICAgIHdyYXBwZXJOYW1lID0gd3AuZ2V0TmFtZSgpOworICAgICAgICAgICAgd3JhcHBlciA9IHdwLmdldEJyaWRnZSgpOworICAgICAgICAgICAgQ2xhc3Mgd3JhcHBlclR5cGUgPSAoQ2xhc3MpIHdyYXBwZXIuZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGU7CisKKyAgICAgICAgICAgIExpc3Q8UGFydEJ1aWxkZXI+IHBhcnRzID0gbmV3IEFycmF5TGlzdDxQYXJ0QnVpbGRlcj4oKTsKKworICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiBjaGlsZHJlbiA9IHdwLmdldFdyYXBwZXJDaGlsZHJlbigpOworICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHAgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgICAgIGlmKHAuaXNJTigpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkKCBuZXcgUGFydEJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB3cC5nZXRPd25lcigpLmdldEpBWEJDb250ZXh0KCkuZ2V0RWxlbWVudFByb3BlcnR5QWNjZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVNldHRlci5nZXQocCkKKyAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyYXBwZXIgcGFyYW1ldGVyIGl0c2VsZiBhbHdheXMgYmluZCB0byBib2R5LCBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gZG8gYWxsIGl0cyBjaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcC5nZXRCaW5kaW5nKCk9PSBQYXJhbWV0ZXJCaW5kaW5nLkJPRFk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCAgLy8gVE9ETzogaTE4bgorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclR5cGUrIiBkbyBub3QgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBuYW1lICIrbmFtZSxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMucGFydHMgPSBwYXJ0cy50b0FycmF5KG5ldyBQYXJ0QnVpbGRlcltwYXJ0cy5zaXplKCldKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcmVhZFJlc3BvbnNlKE1lc3NhZ2UgbXNnLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9iamVjdCByZXRWYWwgPSBudWxsOworCisgICAgICAgICAgICBpZihwYXJ0cy5sZW5ndGg+MCkgeworICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBtc2cucmVhZFBheWxvYWQoKTsKKyAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsd3JhcHBlck5hbWUpOworICAgICAgICAgICAgICAgIE9iamVjdCB3cmFwcGVyQmVhbiA9IHdyYXBwZXIudW5tYXJzaGFsKHJlYWRlciwgKG1zZy5nZXRBdHRhY2htZW50cygpICE9IG51bGwpID8KKyAgICAgICAgICAgICAgICAgICAgbmV3IEF0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsKG1zZy5nZXRBdHRhY2htZW50cygpKTogbnVsbCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcnRCdWlsZGVyIHBhcnQgOiBwYXJ0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBwYXJ0LnJlYWRSZXNwb25zZShhcmdzLHdyYXBwZXJCZWFuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3Mgb25seSBhdCBtb3N0IG9uZSBSZXNwb25zZUJ1aWxkZXIgdGhhdCByZXR1cm5zIGEgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW9yZGVyIHBhcnRzIHNvIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBjb21lcyBhdCB0aGUgZW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYobyE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCByZXRWYWw9PW51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc29yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHNldCBtZXRob2QgdGhyb3cgYSBjaGVja2VkIGV4Y2VwdGlvbiBvciBzb21ldGhpbmcgbGlrZSB0aGF0CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOyAgICAvLyBUT0RPOmkxOG4KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBib2R5CisgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5yZWN5Y2xlKHJlYWRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVW5tYXJzaGFscyBlYWNoIHdyYXBwZWQgcGFydCBpbnRvIGEgSkFYQiBvYmplY3QgYW5kIG1vdmVzIGl0CisgICAgICAgICAqIHRvIHRoZSBleHBlY3RlZCBwbGFjZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJ0QnVpbGRlciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFJhd0FjY2Vzc29yIGFjY2Vzc29yOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZVNldHRlciBzZXR0ZXI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQHBhcmFtIGFjY2Vzc29yCisgICAgICAgICAgICAgKiAgICAgIHNwZWNpZmllcyB3aGljaCBwb3J0aW9uIG9mIHRoZSB3cmFwcGVyIGJlYW4gdG8gb2J0YWluIHRoZSB2YWx1ZSBmcm9tLgorICAgICAgICAgICAgICogQHBhcmFtIHNldHRlcgorICAgICAgICAgICAgICogICAgICBzcGVjaWZpZXMgaG93IHRoZSBvYnRhaW5lZCB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgUGFydEJ1aWxkZXIoUmF3QWNjZXNzb3IgYWNjZXNzb3IsIFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzb3IgPSBhY2Nlc3NvcjsKKyAgICAgICAgICAgICAgICB0aGlzLnNldHRlciA9IHNldHRlcjsKKyAgICAgICAgICAgICAgICBhc3NlcnQgYWNjZXNzb3IhPW51bGwgJiYgc2V0dGVyIT1udWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBPYmplY3QgcmVhZFJlc3BvbnNlKCBPYmplY3RbXSBhcmdzLCBPYmplY3Qgd3JhcHBlckJlYW4gKSB0aHJvd3MgQWNjZXNzb3JFeGNlcHRpb24geworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBhY2Nlc3Nvci5nZXQod3JhcHBlckJlYW4pOworICAgICAgICAgICAgICAgIHJldHVybiBzZXR0ZXIucHV0KG9iaixhcmdzKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmVhdHMgYSBwYXlsb2FkIGFzIG11bHRpcGxlIHBhcnRzIHdyYXBwZWQgaW50byBvbmUgZWxlbWVudCwKKyAgICAgKiBhbmQgcHJvY2Vzc2VzIGFsbCBzdWNoIHdyYXBwZWQgcGFydHMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFJwY0xpdCBleHRlbmRzIFJlc3BvbnNlQnVpbGRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiB7QGxpbmsgUGFydEJ1aWxkZXJ9IGtleWVkIGJ5IHRoZSBlbGVtZW50IG5hbWUgKGluc2lkZSB0aGUgd3JhcHBlciBlbGVtZW50LikKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFFOYW1lLFBhcnRCdWlsZGVyPiBwYXJ0cyA9IG5ldyBIYXNoTWFwPFFOYW1lLFBhcnRCdWlsZGVyPigpOworCisgICAgICAgIHByaXZhdGUgUU5hbWUgd3JhcHBlck5hbWU7CisKKyAgICAgICAgcHVibGljIFJwY0xpdChXcmFwcGVyUGFyYW1ldGVyIHdwKSB7CisgICAgICAgICAgICBhc3NlcnQgd3AuZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGU9PSBDb21wb3NpdGVTdHJ1Y3R1cmUuY2xhc3M7CisKKyAgICAgICAgICAgIHdyYXBwZXJOYW1lID0gd3AuZ2V0TmFtZSgpOworICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiBjaGlsZHJlbiA9IHdwLmdldFdyYXBwZXJDaGlsZHJlbigpOworICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHAgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgICAgIHBhcnRzLnB1dCggcC5nZXROYW1lKCksIG5ldyBQYXJ0QnVpbGRlcigKKyAgICAgICAgICAgICAgICAgICAgcC5nZXRCcmlkZ2UoKSwgVmFsdWVTZXR0ZXIuZ2V0KHApCisgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgLy8gd3JhcHBlciBwYXJhbWV0ZXIgaXRzZWxmIGFsd2F5cyBiaW5kIHRvIGJvZHksIGFuZAorICAgICAgICAgICAgICAgIC8vIHNvIGRvIGFsbCBpdHMgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICBhc3NlcnQgcC5nZXRCaW5kaW5nKCk9PSBQYXJhbWV0ZXJCaW5kaW5nLkJPRFk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJlYWRSZXNwb25zZShNZXNzYWdlIG1zZywgT2JqZWN0W10gYXJncykgdGhyb3dzIEpBWEJFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3QgcmV0VmFsID0gbnVsbDsKKworICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IG1zZy5yZWFkUGF5bG9hZCgpOworICAgICAgICAgICAgaWYgKCFyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyh3cmFwcGVyTmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZWxlbWVudCAiK3JlYWRlci5nZXROYW1lKCkrIiBleHBlY3RlZDogIit3cmFwcGVyTmFtZSk7CisgICAgICAgICAgICByZWFkZXIubmV4dFRhZygpOworCisgICAgICAgICAgICB3aGlsZShyZWFkZXIuZ2V0RXZlbnRUeXBlKCk9PVhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogUU5hbWUgaGFzIGEgcGVyZm9ybWFuY2UgaXNzdWUKKyAgICAgICAgICAgICAgICBQYXJ0QnVpbGRlciBwYXJ0ID0gcGFydHMuZ2V0KHJlYWRlci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmKHBhcnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gY29ycmVzcG9uZGluZyBwYXJ0IGZvdW5kLiBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOworICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gcGFydC5yZWFkUmVzcG9uc2UoYXJncyxyZWFkZXIsIG1zZy5nZXRBdHRhY2htZW50cygpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBvbmx5IGF0IG1vc3Qgb25lIFJlc3BvbnNlQnVpbGRlciB0aGF0IHJldHVybnMgYSB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYobyE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHJldFZhbD09bnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IG87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdlIGFyZSBkb25lIHdpdGggdGhlIGJvZHkKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5yZWN5Y2xlKHJlYWRlcik7CisKKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVW5tYXJzaGFscyBlYWNoIHdyYXBwZWQgcGFydCBpbnRvIGEgSkFYQiBvYmplY3QgYW5kIG1vdmVzIGl0CisgICAgICAgICAqIHRvIHRoZSBleHBlY3RlZCBwbGFjZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJ0QnVpbGRlciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIEJyaWRnZSBicmlkZ2U7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlU2V0dGVyIHNldHRlcjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBAcGFyYW0gYnJpZGdlCisgICAgICAgICAgICAgKiAgICAgIHNwZWNpZmllcyBob3cgdGhlIHBhcnQgaXMgdW5tYXJzaGFsbGVkLgorICAgICAgICAgICAgICogQHBhcmFtIHNldHRlcgorICAgICAgICAgICAgICogICAgICBzcGVjaWZpZXMgaG93IHRoZSBvYnRhaW5lZCB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgUGFydEJ1aWxkZXIoQnJpZGdlIGJyaWRnZSwgVmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICAgICAgdGhpcy5icmlkZ2UgPSBicmlkZ2U7CisgICAgICAgICAgICAgICAgdGhpcy5zZXR0ZXIgPSBzZXR0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCByZWFkUmVzcG9uc2UoT2JqZWN0W10gYXJncywgWE1MU3RyZWFtUmVhZGVyIHIsIEF0dGFjaG1lbnRTZXQgYXR0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGJyaWRnZS51bm1hcnNoYWwociwgKGF0dCAhPSBudWxsKT9uZXcgQXR0YWNobWVudFVubWFyc2hhbGxlckltcGwoYXR0KTpudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0dGVyLnB1dChvYmosYXJncyk7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1hNTE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSl7CisgICAgICAgIHJldHVybiAobWltZVR5cGUuZXF1YWxzKCJ0ZXh0L3htbCIpIHx8IG1pbWVUeXBlLmVxdWFscygiYXBwbGljYXRpb24veG1sIikpID8gdHJ1ZSA6IGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvU0VJU3R1Yi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9TRUlTdHViLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkYzJkMQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvU0VJU3R1Yi5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LnNlaTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcnM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5NRVA7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlJlc3BvbnNlQ29udGV4dFJlY2VpdmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TdHViOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5KYXZhTWV0aG9kSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5TT0FQU0VJTW9kZWw7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICoge0BsaW5rIFN0dWJ9IHRoYXQgaGFuZGxlcyBtZXRob2QgaW52b2NhdGlvbnMKKyAqIHRocm91Z2ggYSBzdHJvbmdseS10eXBlZCBlbmRwb2ludCBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU0VJU3R1YiBleHRlbmRzIFN0dWIgaW1wbGVtZW50cyBJbnZvY2F0aW9uSGFuZGxlciB7CisgICAgcHVibGljIFNFSVN0dWIoV1NTZXJ2aWNlRGVsZWdhdGUgb3duZXIsIEJpbmRpbmdJbXBsIGJpbmRpbmcsIFNPQVBTRUlNb2RlbCBzZWlNb2RlbCwgVHViZSBtYXN0ZXIsIFdTRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7CisgICAgICAgIHN1cGVyKG93bmVyLG1hc3RlciwgYmluZGluZywgc2VpTW9kZWwuZ2V0UG9ydCgpLCBzZWlNb2RlbC5nZXRQb3J0KCkuZ2V0QWRkcmVzcygpLGVwcik7CisgICAgICAgIHRoaXMuc2VpTW9kZWwgPSBzZWlNb2RlbDsKKyAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKTsKKworICAgICAgICBNYXA8V1NETEJvdW5kT3BlcmF0aW9uLCBTeW5jTWV0aG9kSGFuZGxlcj4gc3luY3MgPSBuZXcgSGFzaE1hcDxXU0RMQm91bmRPcGVyYXRpb24sIFN5bmNNZXRob2RIYW5kbGVyPigpOworCisgICAgICAgIC8vIGZpbGwgaW4gbWV0aG9kSGFuZGxlcnMuCisgICAgICAgIC8vIGZpcnN0IGZpbGwgaW4gc3ljaHJvbml6ZWQgdmVyc2lvbnMKKyAgICAgICAgZm9yIChKYXZhTWV0aG9kSW1wbCBtIDogc2VpTW9kZWwuZ2V0SmF2YU1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKCFtLmdldE1FUCgpLmlzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBTeW5jTWV0aG9kSGFuZGxlciBoYW5kbGVyID0gbmV3IFN5bmNNZXRob2RIYW5kbGVyKHRoaXMsIG0pOworICAgICAgICAgICAgICAgIHN5bmNzLnB1dChtLmdldE9wZXJhdGlvbigpLCBoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBtZXRob2RIYW5kbGVycy5wdXQobS5nZXRNZXRob2QoKSwgaGFuZGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEphdmFNZXRob2RJbXBsIGptIDogc2VpTW9kZWwuZ2V0SmF2YU1ldGhvZHMoKSkgeworICAgICAgICAgICAgU3luY01ldGhvZEhhbmRsZXIgc3luYyA9IHN5bmNzLmdldChqbS5nZXRPcGVyYXRpb24oKSk7CisgICAgICAgICAgICBpZiAoam0uZ2V0TUVQKCkgPT0gTUVQLkFTWU5DX0NBTExCQUNLKSB7CisgICAgICAgICAgICAgICAgTWV0aG9kIG0gPSBqbS5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgICAgICBDYWxsYmFja01ldGhvZEhhbmRsZXIgaGFuZGxlciA9IG5ldyBDYWxsYmFja01ldGhvZEhhbmRsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBqbSwgc3luYywgbS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgIG1ldGhvZEhhbmRsZXJzLnB1dChtLCBoYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbS5nZXRNRVAoKSA9PSBNRVAuQVNZTkNfUE9MTCkgeworICAgICAgICAgICAgICAgIE1ldGhvZCBtID0gam0uZ2V0TWV0aG9kKCk7CisgICAgICAgICAgICAgICAgUG9sbGluZ01ldGhvZEhhbmRsZXIgaGFuZGxlciA9IG5ldyBQb2xsaW5nTWV0aG9kSGFuZGxlcih0aGlzLCBqbSwgc3luYyk7CisgICAgICAgICAgICAgICAgbWV0aG9kSGFuZGxlcnMucHV0KG0sIGhhbmRsZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFNPQVBTRUlNb2RlbCBzZWlNb2RlbDsKKworICAgIHB1YmxpYyBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKworCisgICAgLyoqCisgICAgICogRm9yIGVhY2ggbWV0aG9kIG9uIHRoZSBwb3J0IGludGVyZmFjZSB3ZSBoYXZlCisgICAgICogYSB7QGxpbmsgTWV0aG9kSGFuZGxlcn0gdGhhdCBwcm9jZXNzZXMgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8TWV0aG9kLCBNZXRob2RIYW5kbGVyPiBtZXRob2RIYW5kbGVycyA9IG5ldyBIYXNoTWFwPE1ldGhvZCwgTWV0aG9kSGFuZGxlcj4oKTsKKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIE1ldGhvZEhhbmRsZXIgaGFuZGxlciA9IG1ldGhvZEhhbmRsZXJzLmdldChtZXRob2QpOworICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlci5pbnZva2UocHJveHksIGFyZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2UgaGFuZGxlIHRoZSBvdGhlciBtZXRob2QgaW52b2NhdGlvbnMgYnkgb3Vyc2VsdmVzCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRoaXMsIGFyZ3MpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaW1wb3NzaWJsZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFBhY2tldCBkb1Byb2Nlc3MoUGFja2V0IHJlcXVlc3QsIFJlcXVlc3RDb250ZXh0IHJjLCBSZXNwb25zZUNvbnRleHRSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICByZXR1cm4gc3VwZXIucHJvY2VzcyhyZXF1ZXN0LCByYywgcmVjZWl2ZXIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBATm90TnVsbCBRTmFtZSBnZXRQb3J0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHdzZGxQb3J0LmdldE5hbWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldE91dGJvdW5kSGVhZGVycyhPYmplY3QuLi4gaGVhZGVycykgeworICAgICAgICBpZihoZWFkZXJzPT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBIZWFkZXJbXSBobCA9IG5ldyBIZWFkZXJbaGVhZGVycy5sZW5ndGhdOworICAgICAgICBmb3IoIGludCBpPTA7IGk8aGwubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBpZihoZWFkZXJzW2ldPT1udWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGhsW2ldID0gSGVhZGVycy5jcmVhdGUoc2VpTW9kZWwuZ2V0SkFYQkNvbnRleHQoKSxoZWFkZXJzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRPdXRib3VuZEhlYWRlcnMoaGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvU3luY01ldGhvZEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvU3luY01ldGhvZEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM1OTc0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9TeW5jTWV0aG9kSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LnNlaTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5EZXNlcmlhbGl6YXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZmF1bHQuU09BUEZhdWx0QnVpbGRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLmpheGIuSkFYQk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuQ2hlY2tlZEV4Y2VwdGlvbkltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuSmF2YU1ldGhvZEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVySW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIHtAbGluayBNZXRob2RIYW5kbGVyfSB0aGF0IGhhbmRsZXMgc3luY2hyb25vdXMgbWV0aG9kIGludm9jYXRpb25zLgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBtYWlubHkgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0d28gdGFza3M6CisgKiA8b2w+CisgKiAgPGxpPkFjY2VwdHMgT2JqZWN0W10gdGhhdCByZXByZXNlbnRzIGFyZ3VtZW50cyBmb3IgYSBKYXZhIG1ldGhvZCwKKyAqICAgICAgYW5kIGNyZWF0ZXMge0BsaW5rIEpBWEJNZXNzYWdlfSB0aGF0IHJlcHJlc2VudHMgYSByZXF1ZXN0IG1lc3NhZ2UuCisgKiAgPGxpPlRha2VzIGEge0BsaW5rIE1lc3NhZ2VdIHRoYXQgcmVwcmVzZW50cyBhIHJlc3BvbnNlLAorICogICAgICBhbmQgZXh0cmFjdHMgdGhlIHJldHVybiB2YWx1ZSAoYW5kIHVwZGF0ZXMge0BsaW5rIEhvbGRlcn1zLikKKyAqIDwvb2w+CisgKgorICogPGgyPkNyZWF0aW5nIHtAbGluayBKQVhCTWVzc2FnZX08L2gyPgorICogPHA+CisgKiBBdCB0aGUgY29uc3RydWN0aW9uIHRpbWUsIHdlIHByZXBhcmUge0BsaW5rIEJvZHlCdWlsZGVyfSBhbmQge0BsaW5rIE1lc3NhZ2VGaWxsZXJ9cworICogdGhhdCBrbm93IGhvdyB0byBtb3ZlIGFyZ3VtZW50cyBpbnRvIGEge0BsaW5rIE1lc3NhZ2V9LgorICogU29tZSBhcmd1bWVudHMgZ28gdG8gdGhlIHBheWxvYWQsIHNvbWUgZ28gdG8gaGVhZGVycywgc3RpbGwgb3RoZXJzIGdvIHRvIGF0dGFjaG1lbnRzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZmluYWwgY2xhc3MgU3luY01ldGhvZEhhbmRsZXIgZXh0ZW5kcyBNZXRob2RIYW5kbGVyIHsKKworICAgIC8vIHRoZXNlIG9iamVjdHMgdG9nZXRoZXIgY3JlYXRlIGEgbWVzc2FnZSBmcm9tIG1ldGhvZCBwYXJhbWV0ZXJzCisgICAgcHJpdmF0ZSBmaW5hbCBCb2R5QnVpbGRlciBib2R5QnVpbGRlcjsKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VGaWxsZXJbXSBpbkZpbGxlcnM7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzb2FwQWN0aW9uOworCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzT25lV2F5OworCisgICAgcHJpdmF0ZSBmaW5hbCBKYXZhTWV0aG9kSW1wbCBqYXZhTWV0aG9kOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBnZXQgYSB2YWx1ZSBmcm9tIG1ldGhvZCBpbnZvY2F0aW9uIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIHZhbHVlR2V0dGVyc1tpXSBpcyBmb3IgbWV0aG9kQXJnc1tpXSwgYW5kIHNvIG9uLgorICAgICAqLworICAgIC8qcGFja2FnZSovIGZpbmFsIFZhbHVlR2V0dGVyW10gdmFsdWVHZXR0ZXJzOworCisgICAgcHJpdmF0ZSBmaW5hbCBSZXNwb25zZUJ1aWxkZXIgcmVzcG9uc2VCdWlsZGVyOworICAgIHByaXZhdGUgZmluYWwgTWFwPFFOYW1lLCBDaGVja2VkRXhjZXB0aW9uSW1wbD4gY2hlY2tlZEV4Y2VwdGlvbnM7CisKKyAgICBwdWJsaWMgU3luY01ldGhvZEhhbmRsZXIoU0VJU3R1YiBvd25lciwgSmF2YU1ldGhvZEltcGwgbWV0aG9kKSB7CisgICAgICAgIHN1cGVyKG93bmVyKTsKKworICAgICAgICAvL2tlZXAgYWxsIHRoZSBDaGVja2VkRXhjZXB0aW9uIG1vZGVsIGZvciB0aGUgZGV0YWlsIHFuYW1lCisgICAgICAgIHRoaXMuY2hlY2tlZEV4Y2VwdGlvbnMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgQ2hlY2tlZEV4Y2VwdGlvbkltcGw+KCk7CisgICAgICAgIGZvcihDaGVja2VkRXhjZXB0aW9uSW1wbCBjZSA6IG1ldGhvZC5nZXRDaGVja2VkRXhjZXB0aW9ucygpKXsKKyAgICAgICAgICAgIGNoZWNrZWRFeGNlcHRpb25zLnB1dChjZS5nZXRCcmlkZ2UoKS5nZXRUeXBlUmVmZXJlbmNlKCkudGFnTmFtZSwgY2UpOworICAgICAgICB9CisgICAgICAgIC8vSWYgYSBub24tIiIgc29hcEFjdGlvbiBpcyBzcGVjaWZpZWQsIHdzYTphY3Rpb24gdGhlIFNPQVBBY3Rpb24KKyAgICAgICAgaWYobWV0aG9kLmdldElucHV0QWN0aW9uKCkgIT0gbnVsbCAmJiAhbWV0aG9kLmdldEJpbmRpbmcoKS5nZXRTT0FQQWN0aW9uKCkuZXF1YWxzKCIiKSApIHsKKyAgICAgICAgICAgIHRoaXMuc29hcEFjdGlvbiA9IG1ldGhvZC5nZXRJbnB1dEFjdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5zb2FwQWN0aW9uID0gbWV0aG9kLmdldEJpbmRpbmcoKS5nZXRTT0FQQWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5qYXZhTWV0aG9kID0gbWV0aG9kOworCisgICAgICAgIHsvLyBwcmVwYXJlIG9iamVjdHMgZm9yIGNyZWF0aW5nIG1lc3NhZ2VzCisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IHJwID0gbWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgICAgIEJvZHlCdWlsZGVyIGJvZHlCdWlsZGVyID0gbnVsbDsKKyAgICAgICAgICAgIExpc3Q8TWVzc2FnZUZpbGxlcj4gZmlsbGVycyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZUZpbGxlcj4oKTsKKyAgICAgICAgICAgIHZhbHVlR2V0dGVycyA9IG5ldyBWYWx1ZUdldHRlcltycC5zaXplKCldOworCisgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcGFyYW0gOiBycCkgeworICAgICAgICAgICAgICAgIFZhbHVlR2V0dGVyIGdldHRlciA9IFZhbHVlR2V0dGVyLmdldChwYXJhbSk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2gocGFyYW0uZ2V0SW5CaW5kaW5nKCkua2luZCkgeworICAgICAgICAgICAgICAgIGNhc2UgQk9EWToKKyAgICAgICAgICAgICAgICAgICAgaWYocGFyYW0uaXNXcmFwcGVyU3R5bGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyYW0uZ2V0UGFyZW50KCkuZ2V0QmluZGluZygpLmlzUnBjTGl0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keUJ1aWxkZXIgPSBuZXcgQm9keUJ1aWxkZXIuUnBjTGl0KChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtLCBvd25lci5zb2FwVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keUJ1aWxkZXIgPSBuZXcgQm9keUJ1aWxkZXIuRG9jTGl0KChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtLCBvd25lci5zb2FwVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5QnVpbGRlciA9IG5ldyBCb2R5QnVpbGRlci5CYXJlKHBhcmFtLCBvd25lci5zb2FwVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIRUFERVI6CisgICAgICAgICAgICAgICAgICAgIGZpbGxlcnMuYWRkKG5ldyBNZXNzYWdlRmlsbGVyLkhlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmdldEluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5nZXRCcmlkZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlciApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVFRBQ0hNRU5UOgorICAgICAgICAgICAgICAgICAgICBmaWxsZXJzLmFkZChNZXNzYWdlRmlsbGVyLkF0dGFjaG1lbnRGaWxsZXIuY3JlYXRlQXR0YWNobWVudEZpbGxlcihwYXJhbSwgZ2V0dGVyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVU5CT1VORDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7IC8vIGltcG9zc2libGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGJvZHlCdWlsZGVyPT1udWxsKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gcGFyYW1ldGVyIGJpbmRzIHRvIGJvZHkuIHdlIGNyZWF0ZSBhbiBlbXB0eSBtZXNzYWdlCisgICAgICAgICAgICAgICAgc3dpdGNoKG93bmVyLnNvYXBWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTT0FQXzExOgorICAgICAgICAgICAgICAgICAgICBib2R5QnVpbGRlciA9IEJvZHlCdWlsZGVyLkVNUFRZX1NPQVAxMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTT0FQXzEyOgorICAgICAgICAgICAgICAgICAgICBib2R5QnVpbGRlciA9IEJvZHlCdWlsZGVyLkVNUFRZX1NPQVAxMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmJvZHlCdWlsZGVyID0gYm9keUJ1aWxkZXI7CisgICAgICAgICAgICB0aGlzLmluRmlsbGVycyA9IGZpbGxlcnMudG9BcnJheShuZXcgTWVzc2FnZUZpbGxlcltmaWxsZXJzLnNpemUoKV0pOworICAgICAgICB9CisKKyAgICAgICAgey8vIHByZXBhcmUgb2JqZWN0cyBmb3IgcHJvY2Vzc2luZyByZXNwb25zZQorICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiBycCA9IG1ldGhvZC5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIExpc3Q8UmVzcG9uc2VCdWlsZGVyPiBidWlsZGVycyA9IG5ldyBBcnJheUxpc3Q8UmVzcG9uc2VCdWlsZGVyPigpOworCisgICAgICAgICAgICBmb3IoIFBhcmFtZXRlckltcGwgcGFyYW0gOiBycCApIHsKKyAgICAgICAgICAgICAgICBWYWx1ZVNldHRlciBzZXR0ZXIgPSBWYWx1ZVNldHRlci5nZXQocGFyYW0pOworICAgICAgICAgICAgICAgIHN3aXRjaChwYXJhbS5nZXRPdXRCaW5kaW5nKCkua2luZCkgeworICAgICAgICAgICAgICAgIGNhc2UgQk9EWToKKyAgICAgICAgICAgICAgICAgICAgaWYocGFyYW0uaXNXcmFwcGVyU3R5bGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyYW0uZ2V0UGFyZW50KCkuZ2V0QmluZGluZygpLmlzUnBjTGl0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBSZXNwb25zZUJ1aWxkZXIuUnBjTGl0KChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBSZXNwb25zZUJ1aWxkZXIuRG9jTGl0KChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVycy5hZGQobmV3IFJlc3BvbnNlQnVpbGRlci5Cb2R5KHBhcmFtLmdldEJyaWRnZSgpLHNldHRlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSEVBREVSOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVycy5hZGQobmV3IFJlc3BvbnNlQnVpbGRlci5IZWFkZXIob3duZXIuc29hcFZlcnNpb24sIHBhcmFtLCBzZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVFRBQ0hNRU5UOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVycy5hZGQoUmVzcG9uc2VCdWlsZGVyLkF0dGFjaG1lbnRCdWlsZGVyLmNyZWF0ZUF0dGFjaG1lbnRCdWlsZGVyKHBhcmFtLCBzZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVTkJPVU5EOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVycy5hZGQobmV3IFJlc3BvbnNlQnVpbGRlci5OdWxsU2V0dGVyKHNldHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlQnVpbGRlci5nZXRWTVVuaW5pdGlhbGl6ZWRWYWx1ZShwYXJhbS5nZXRUeXBlUmVmZXJlbmNlKCkudHlwZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2goYnVpbGRlcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmVzcG9uc2VCdWlsZGVyID0gUmVzcG9uc2VCdWlsZGVyLk5PTkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmVzcG9uc2VCdWlsZGVyID0gYnVpbGRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXNwb25zZUJ1aWxkZXIgPSBuZXcgUmVzcG9uc2VCdWlsZGVyLkNvbXBvc2l0ZShidWlsZGVycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pc09uZVdheSA9IG1ldGhvZC5nZXRNRVAoKS5pc09uZVdheSgpOworICAgIH0KKworICAgIHB1YmxpYyBKYXZhTWV0aG9kSW1wbCBnZXRKYXZhTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gamF2YU1ldGhvZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZXR1cm4gaW52b2tlKHByb3h5LGFyZ3Msb3duZXIucmVxdWVzdENvbnRleHQsb3duZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgc3luY2hyb25vdXNseSwgYnV0IHdpdGggdGhlIGdpdmVuIHtAbGluayBSZXF1ZXN0Q29udGV4dH0KKyAgICAgKiBhbmQge0BsaW5rIFJlc3BvbnNlQ29udGV4dFJlY2VpdmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYworICAgICAqICAgICAgVGhpcyB7QGxpbmsgUmVxdWVzdENvbnRleHR9IGlzIHVzZWQgZm9yIGludm9raW5nIHRoaXMgbWV0aG9kLgorICAgICAqICAgICAgV2UgdGFrZSB0aGlzIGFzIGEgc2VwYXJhdGUgcGFyYW1ldGVyIGJlY2F1c2Ugb2YgdGhlIGFzeW5jIGludm9jYXRpb24KKyAgICAgKiAgICAgIGhhbmRsaW5nLCB3aGljaCByZXF1aXJlcyBhIHNlcGFyYXRlIGNvcHkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBPYmplY3RbXSBhcmdzLCBSZXF1ZXN0Q29udGV4dCByYywgUmVzcG9uc2VDb250ZXh0UmVjZWl2ZXIgcmVjZWl2ZXIpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBQYWNrZXQgcmVxID0gbmV3IFBhY2tldChjcmVhdGVSZXF1ZXN0TWVzc2FnZShhcmdzKSk7CisKKyAgICAgICAgcmVxLnNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uOworICAgICAgICByZXEuZXhwZWN0UmVwbHkgPSAhaXNPbmVXYXk7CisgICAgICAgIHJlcS5nZXRNZXNzYWdlKCkuYXNzZXJ0T25lV2F5KGlzT25lV2F5KTsKKworICAgICAgICAvLyBwcm9jZXNzIHRoZSBtZXNzYWdlCisgICAgICAgIFBhY2tldCByZXBseSA9IG93bmVyLmRvUHJvY2VzcyhyZXEscmMscmVjZWl2ZXIpOworCisgICAgICAgIE1lc3NhZ2UgbXNnID0gcmVwbHkuZ2V0TWVzc2FnZSgpOworICAgICAgICBpZihtc2cgPT1udWxsKQorICAgICAgICAgICAgLy8gbm8gcmVwbHkuIG11c3QgaGF2ZSBiZWVuIG9uZS13YXkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZihtc2cuaXNGYXVsdCgpKSB7CisgICAgICAgICAgICAgICAgU09BUEZhdWx0QnVpbGRlciBmYXVsdEJ1aWxkZXIgPSBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZShtc2cpOworICAgICAgICAgICAgICAgIHRocm93IGZhdWx0QnVpbGRlci5jcmVhdGVFeGNlcHRpb24oY2hlY2tlZEV4Y2VwdGlvbnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VCdWlsZGVyLnJlYWRSZXNwb25zZShtc2csYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbigiZmFpbGVkLnRvLnJlYWQucmVzcG9uc2UiLGUpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbigiZmFpbGVkLnRvLnJlYWQucmVzcG9uc2UiLGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlcXVlc3Qge0BsaW5rIEpBWEJNZXNzYWdlfSBmcm9tIG1ldGhvZCBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIE1lc3NhZ2UgY3JlYXRlUmVxdWVzdE1lc3NhZ2UoT2JqZWN0W10gYXJncykgeworICAgICAgICBNZXNzYWdlIG1zZyA9IGJvZHlCdWlsZGVyLmNyZWF0ZU1lc3NhZ2UoYXJncyk7CisKKyAgICAgICAgZm9yIChNZXNzYWdlRmlsbGVyIGZpbGxlciA6IGluRmlsbGVycykKKyAgICAgICAgICAgIGZpbGxlci5maWxsSW4oYXJncyxtc2cpOworCisgICAgICAgIHJldHVybiBtc2c7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9WYWx1ZUdldHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9WYWx1ZUdldHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NmRhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9jbGllbnQvc2VpL1ZhbHVlR2V0dGVyLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5zZWk7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5QYXJhbWV0ZXJJbXBsOworCitpbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7CitpbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKKworLyoqCisgKiBHZXRzIGEgdmFsdWUgZnJvbSBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgcGFyYW1ldGVyIHBhc3NlZAorICogYXMgYSBtZXRob2QgYXJndW1lbnQuCisgKgorICogPHA+CisgKiBUaGlzIGFic3RyYWN0aW9uIGhpZGVzIHRoZSBoYW5kbGluZyBvZiB7QGxpbmsgSG9sZGVyfS4KKyAqCisgKiA8cD4KKyAqIHtAbGluayBWYWx1ZUdldHRlcn0gaXMgYSBzdGF0ZWxlc3MgYmVoYXZpb3IgZW5jYXBzdWxhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2VudW0gVmFsdWVHZXR0ZXIgeworICAgIC8qKgorICAgICAqIHtAbGluayBWYWx1ZUdldHRlcn0gdGhhdCB3b3JrcyBmb3Ige0BsaW5rIE1vZGUjSU59ICBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTaW5jZSBpdCdzIHRoZSBJTiBtb2RlLCB0aGUgcGFyYW1ldGVyIGlzIG5vdCBhIHtAbGluayBIb2xkZXJ9LAorICAgICAqIHRoZXJlZm9yZSB0aGUgcGFyYW1ldGVyIGl0c2VsZiBpcyBhIHZhbHVlLgorICAgICAqLworICAgIFBMQUlOKCkgeworICAgICAgICBPYmplY3QgZ2V0KE9iamVjdCBwYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXI7CisgICAgICAgIH0KKyAgICB9LAorICAgIC8qKgorICAgICAqIENyZWF0ZXMge0BsaW5rIFZhbHVlR2V0dGVyfSB0aGF0IHdvcmtzIGZvciB7QGxpbmsgSG9sZGVyfSwKKyAgICAgKiB3aGljaCBpcyAge0BsaW5rIE1vZGUjSU5PVVR9IG9yICB7QGxpbmsgTW9kZSNPVVR9LgorICAgICAqCisgICAgICogPHA+CisgICAgICogSW4gdGhvc2Uge0BsaW5rIE1vZGV9cywgdGhlIHBhcmFtZXRlciBpcyBhIHtAbGluayBIb2xkZXJ9LAorICAgICAqIHNvIHRoZSB2YWx1ZSB0byBiZSBzZW50IGlzIG9idGFpbmVkIGJ5IGdldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBob2xkZXIuCisgICAgICovCisgICAgSE9MREVSKCkgeworICAgICAgICBPYmplY3QgZ2V0KE9iamVjdCBwYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgIGlmKHBhcmFtZXRlcj09bnVsbCkKKyAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIHBhc3MgaW4gbnVsbCB3aGVyZSBhIEhvbGRlciBpcyBleHBlY3RlZC4KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiAoKEhvbGRlcilwYXJhbWV0ZXIpLnZhbHVlOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIHRvIGJlIHNlbnQsIGZyb20gYSBwYXJhbWV0ZXIgZ2l2ZW4gYXMgYSBtZXRob2QgYXJndW1lbnQuCisgICAgICovCisgICAgYWJzdHJhY3QgT2JqZWN0IGdldChPYmplY3QgcGFyYW1ldGVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgVmFsdWVHZXR0ZXJ9IHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIFBhcmFtZXRlcn0uCisgICAgICovCisgICAgc3RhdGljIFZhbHVlR2V0dGVyIGdldChQYXJhbWV0ZXJJbXBsIHApIHsKKyAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyBQTEFJTgorICAgICAgICBpZihwLmdldE1vZGUoKT09IE1vZGUuSU4gfHwgcC5nZXRJbmRleCgpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIFBMQUlOOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gSE9MREVSOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvVmFsdWVTZXR0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvVmFsdWVTZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTMzMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9WYWx1ZVNldHRlci5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LnNlaTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVySW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CisKKy8qKgorICogTW92ZXMgYSBKYXZhIHZhbHVlIHVubWFyc2hhbGxlZCBmcm9tIGEgcmVzcG9uc2UgbWVzc2FnZQorICogdG8gdGhlIHJpZ2h0IHBsYWNlLgorICoKKyAqIDxwPgorICogU29tZXRpbWVzIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgYSByZXR1cm4gdmFsdWUsIGFuZAorICogb3RoZXJzIGFyZSByZXR1cm5lZCBpbiB0aGUge0BsaW5rIEhvbGRlcn0gdmFsdWUuIEluc3RhbmNlcworICogb2YgdGhpcyBpbnRlcmZhY2UgYWJzdHJhY3RzIHRoaXMgZGV0YWlsLgorICoKKyAqIDxwPgorICoge0BsaW5rIFZhbHVlU2V0dGVyfSBpcyBhIHN0YXRlbGVzcyBiZWhhdmlvciBlbmNhcHN1bGF0aW9uLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworYWJzdHJhY3QgY2xhc3MgVmFsdWVTZXR0ZXIgeworICAgIHByaXZhdGUgVmFsdWVTZXR0ZXIoKSB7fQorCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIHZhbHVlIHRvIHRoZSBleHBlY3RlZCBwbGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgIFRoZSB1bm1hcnNoYWxsZWQgb2JqZWN0LgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogICAgICBUaGUgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSBKYXZhIG1ldGhvZCBpbnZvY2F0aW9uLiBJZiA8dHQ+b2JqPC90dD4KKyAgICAgKiAgICAgIGlzIHN1cHBvc2VkIHRvIGJlIHJldHVybmVkIGFzIGEge0BsaW5rIEhvbGRlcn0gdmFsdWUsIGEgc3VpdGFibGUKKyAgICAgKiAgICAgIHtAbGluayBIb2xkZXJ9IGlzIG9idGFpbmVkIGZyb20gdGhpcyBhcmd1bWVudCBsaXN0IGFuZCA8dHQ+b2JqPC90dD4KKyAgICAgKiAgICAgIGlzIHNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGlmIDx0dD5vYmo8L3R0PiBpcyBzdXBwb3NlZCB0byBiZSByZXR1cm5lZCBhcyBhIHJldHVybiB2YWx1ZQorICAgICAqICAgICAgZnJvbSB0aGUgbWV0aG9kLCB0aGlzIG1ldGhvZCByZXR1cm5zIDx0dD5vYmo8L3R0Pi4gT3RoZXJ3aXNlIG51bGwuCisgICAgICovCisgICAgYWJzdHJhY3QgT2JqZWN0IHB1dChPYmplY3Qgb2JqLCBPYmplY3RbXSBhcmdzKTsKKworICAgIC8qKgorICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWYWx1ZVNldHRlciBSRVRVUk5fVkFMVUUgPSBuZXcgUmV0dXJuVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgUGFyYW19cyB3aXRoIHNtYWxsIGluZGV4IG51bWJlcnMgYXJlIHVzZWQgb2Z0ZW4sCisgICAgICogc28gd2UgcG9vbCB0aGVtIHRvIHJlZHVjZSB0aGUgZm9vdHByaW50LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhbHVlU2V0dGVyW10gUE9PTCA9IG5ldyBWYWx1ZVNldHRlclsxNl07CisKKyAgICBzdGF0aWMgeworICAgICAgICBmb3IoIGludCBpPTA7IGk8UE9PTC5sZW5ndGg7IGkrKyApCisgICAgICAgICAgICBQT09MW2ldID0gbmV3IFBhcmFtKGkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgVmFsdWVTZXR0ZXJ9IHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIFBhcmFtZXRlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBWYWx1ZVNldHRlciBnZXQoUGFyYW1ldGVySW1wbCBwKSB7CisgICAgICAgIGludCBpZHggPSBwLmdldEluZGV4KCk7CisKKyAgICAgICAgaWYoaWR4PT0tMSkKKyAgICAgICAgICAgIHJldHVybiBSRVRVUk5fVkFMVUU7CisgICAgICAgIGlmKGlkeDxQT09MLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBQT09MW2lkeF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW0oaWR4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXR1cm5WYWx1ZSBleHRlbmRzIFZhbHVlU2V0dGVyIHsKKyAgICAgICAgT2JqZWN0IHB1dChPYmplY3Qgb2JqLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFBhcmFtIGV4dGVuZHMgVmFsdWVTZXR0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogSW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHB1dCB0aGUgdmFsdWUgdG8uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBpZHg7CisKKyAgICAgICAgcHVibGljIFBhcmFtKGludCBpZHgpIHsKKyAgICAgICAgICAgIHRoaXMuaWR4ID0gaWR4OworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IHB1dChPYmplY3Qgb2JqLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICBPYmplY3QgYXJnID0gYXJnc1tpZHhdOworICAgICAgICAgICAgaWYoYXJnIT1udWxsKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgYnVpbGQgbW9kZWwgaW4gc3VjaCBhIHdheSB0aGF0IHRoaXMgaXMgZ3VhcmFudGVlZAorICAgICAgICAgICAgICAgIGFzc2VydCBhcmcgaW5zdGFuY2VvZiBIb2xkZXI7CisgICAgICAgICAgICAgICAgKChIb2xkZXIpYXJnKS52YWx1ZSA9IG9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGVsc2UgeworICAgICAgICAgICAgLy8gICBpZiBudWxsIGlzIGdpdmVuIGFzIGEgSG9sZGVyLCB0aGVyZSdzIG5vIHBsYWNlIHRvIHJldHVybgorICAgICAgICAgICAgLy8gICB0aGUgdmFsdWUsIHNvIGp1c3QgaWdub3JlLgorICAgICAgICAgICAgLy8gfQorCisgICAgICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvY2xpZW50L3NlaS9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4NzQzNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2NsaWVudC9zZWkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKioKKyAqIHtAbGluayBTRUlTdHVifSBhbmQgaXRzIHN1cHBvcnRpbmcgY29kZS4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuc2VpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL0VQUlJlY2lwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL0VQUlJlY2lwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjgzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9kZXZlbG9wZXIvRVBSUmVjaXBlLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJzOworCitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRzIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBhZGRlZCB0byBFUFJzCisgKiBjcmVhdGVkIGZyb20ge0BsaW5rIFN0YXRlZnVsV2ViU2VydmljZU1hbmFnZXJ9IChmb3IgYWR2YW5jZWQgdXNlcnMpLgorICoKKyAqIDxwPgorICogT2NjYXNpb25hbGx5IGl0IGlzIGNvbnZlbmllbnQgdG8gYmUgYWJsZSB0byBjb250cm9sIHRoZSBkYXRhIHRvIGJlCisgKiBwcmVzZW50IG9uIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX1zIGNyZWF0ZWQgYnkge0BsaW5rIFN0YXRlZnVsV2ViU2VydmljZU1hbmFnZXJ9LgorICogWW91IGNhbiBkbyBzbyBieSB1c2luZyB0aGlzIGNsYXNzIGxpa2UgdGhpczoKKyAqCisgKiA8cHJlPgorICogc3RhdGVmdWxXZWJTZXJ2aWNlTWFuYWdlci5leHBvcnQoe0BsaW5rIFczQ0VuZHBvaW50UmVmZXJlbmNlfS5jbGFzcyxteU9iamVjdCwKKyAqICAgbmV3IEVQUlJlY2lwZSgpLmFkZFJlZmVyZW5jZVBhcmFtZXRlcih7QGxpbmsgSGVhZGVyc30uY3JlYXRlKC4uLikpCisgKiAgICAgICAgICAgICAgICAgIC5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIoe0BsaW5rIEhlYWRlcnN9LmNyZWF0ZSguLi4pKSk7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFRoZSBtZXRob2RzIG9uIHRoaXMgY2xhc3MgZm9sbG93cyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcnRpbmZvd2xlci5jb20vYmxpa2kvRmx1ZW50SW50ZXJmYWNlLmh0bWwiPgorICogdGhlIGZsdWVudCBpbnRlcmZhY2UgZGVzaWduPC9hPiB0byBhbGxvdyBjb25zdHJ1Y3Rpb24gd2l0aG91dCB1c2luZyBhIHZhcmlhYmxlLgorICoKKyAqCisgKiA8cD4KKyAqIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy13cy1hZGRyLWNvcmUtMjAwNjA1MDkvI2VwcmluZm9tb2RlbCI+CisgKiBXUy1BZGRyZXNzaW5nIEVQUiBpbmZvcm1hdGlvbiBtb2RlbDwvYT4gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAc2luY2UgMi4xLjEKKyAqIEBzZWUgU3RhdGVmdWxXZWJTZXJ2aWNlTWFuYWdlcgorICogQHNlZSBIZWFkZXJzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFUFJSZWNpcGUgeworICAgIHByaXZhdGUgZmluYWwgTGlzdDxIZWFkZXI+IHJlZmVyZW5jZVBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PEhlYWRlcj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U291cmNlPiBtZXRhZGF0YSA9IG5ldyBBcnJheUxpc3Q8U291cmNlPigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgdGhlIHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGFkZGVkIHNvIGZhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgTGlzdDxIZWFkZXI+IGdldFJlZmVyZW5jZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiByZWZlcmVuY2VQYXJhbWV0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYWxsIHRoZSBtZXRhZGF0YSBhZGRlZCBzbyBmYXIuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIExpc3Q8U291cmNlPiBnZXRNZXRhZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgcmVmZXJlbmNlIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRVBSUmVjaXBlIGFkZFJlZmVyZW5jZVBhcmFtZXRlcihIZWFkZXIgaCkgeworICAgICAgICBpZihoPT1udWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHJlZmVyZW5jZVBhcmFtZXRlcnMuYWRkKGgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFsbCB0aGUgaGVhZGVycyBhcyByZWZlcmVuY2UgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRVBSUmVjaXBlIGFkZFJlZmVyZW5jZVBhcmFtZXRlcnMoSGVhZGVyLi4uIGhlYWRlcnMpIHsKKyAgICAgICAgZm9yIChIZWFkZXIgaCA6IGhlYWRlcnMpCisgICAgICAgICAgICBhZGRSZWZlcmVuY2VQYXJhbWV0ZXIoaCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYWxsIHRoZSBoZWFkZXJzIGFzIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBFUFJSZWNpcGUgYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhJdGVyYWJsZTw/IGV4dGVuZHMgSGVhZGVyPiBoZWFkZXJzKSB7CisgICAgICAgIGZvciAoSGVhZGVyIGggOiBoZWFkZXJzKQorICAgICAgICAgICAgYWRkUmVmZXJlbmNlUGFyYW1ldGVyKGgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBFUFJSZWNpcGUgYWRkTWV0YWRhdGEoU291cmNlIHNvdXJjZSkgeworICAgICAgICBpZihzb3VyY2U9PW51bGwpICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgbWV0YWRhdGEuYWRkKHNvdXJjZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBFUFJSZWNpcGUgYWRkTWV0YWRhdGEoU291cmNlLi4uIHNvdXJjZXMpIHsKKyAgICAgICAgZm9yIChTb3VyY2UgcyA6IHNvdXJjZXMpCisgICAgICAgICAgICBhZGRNZXRhZGF0YShzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEVQUlJlY2lwZSBhZGRNZXRhZGF0YShJdGVyYWJsZTw/IGV4dGVuZHMgU291cmNlPiBzb3VyY2VzKSB7CisgICAgICAgIGZvciAoU291cmNlIHMgOiBzb3VyY2VzKQorICAgICAgICAgICAgYWRkTWV0YWRhdGEocyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9KQVhXU1Byb3BlcnRpZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9KQVhXU1Byb3BlcnRpZXMuamF2YQppbmRleCA5ZGZjYTE2Li4wNThlZDBiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9kZXZlbG9wZXIvSkFYV1NQcm9wZXJ0aWVzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL0pBWFdTUHJvcGVydGllcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDExICsyNCw4MSBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3BlcjsKIAoraW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlckxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworCiBwdWJsaWMgaW50ZXJmYWNlIEpBWFdTUHJvcGVydGllcyB7Ci0gICAgICAgIC8vIFNvbWUgdmFsdWVzIGFyZSBzcGxpdCBpbnRvIHR3byBzdHJpbmdzIHNvIHRoYXQgcGFja2FnZSByZW5hbWluZyBmb3IKLSAgICAgICAgLy8gbXVzdGFuZyBkb2Vzbid0IGFsdGVyIHRoZSB2YWx1ZXMuIFNvIGRvIG5vdCBjb21iaW5lIHRoZW0KICAgICAvLyBDb250ZW50IG5lZ290aWF0aW9uIHByb3BlcnR5OiB2YWx1ZXMgIm5vbmUiLCAicGVzc2ltaXN0aWMiIGFuZCAib3B0aW1pc3RpYyIKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZID0gImNvbS5zdW4uIisgInhtbC53cy5jbGllbnQuQ29udGVudE5lZ290aWF0aW9uIjsKKyAgICAvLyBJdCBpcyBzcGxpdCBpbnRvIHR3byBzdHJpbmdzIHNvIHRoYXQgcGFja2FnZSByZW5hbWluZyBmb3IKKyAgICAvLyBKYXZhIFNFIDYgZG9lc24ndCBhbHRlciB0aGUgdmFsdWUuIFNvIGRvIG5vdCBjb21iaW5lIHRoZW0KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFkgPSAiY29tLnN1bi4iKyJ4bWwud3MuY2xpZW50LkNvbnRlbnROZWdvdGlhdGlvbiI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRPTV9USFJFU0hPTE9EX1ZBTFVFID0gICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jb21tb24uTXRvbVRocmVzaG9sZFZhbHVlIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0VYQ0hBTkdFID0gImNvbS5zdW4ueG1sLmludGVybmFsLndzLmh0dHAuZXhjaGFuZ2UiOworCisgICAgLyoqCisgICAgICogU2V0IHRoaXMgcHJvcGVydHkgb24gdGhlIHtAbGluayBCaW5kaW5nUHJvdmlkZXIjZ2V0UmVxdWVzdENvbnRleHQoKX0gdG8KKyAgICAgKiBlbmFibGUge0BsaW5rIEh0dHBVUkxDb25uZWN0aW9uI3NldENodW5rZWRTdHJlYW1pbmdNb2RlKGludCl9CisgICAgICoKKyAgICAgKjxwPgorICAgICAqIGludCBjaHVua1NpemUgPSAuLi47CisgICAgICogTWFwPFN0cmluZywgT2JqZWN0PiBjdHh0ID0gKEJpbmRpbmdQcm92aWRlcilwcm94eSkuZ2V0UmVxdWVzdENvbnRleHQoKTsKKyAgICAgKiBjdHh0LnB1dChIVFRQX0NMSUVOVF9TVFJFQU1JTkdfQ0hVTktfU0laRSwgY2h1bmtTaXplKTsKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0NMSUVOVF9TVFJFQU1JTkdfQ0hVTktfU0laRSA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5jbGllbnQuc3RyZWFtaW5nLmNodW5rLnNpemUiOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBvbiB0aGUge0BsaW5rIEJpbmRpbmdQcm92aWRlciNnZXRSZXF1ZXN0Q29udGV4dCgpfSB0bworICAgICAqIGVuYWJsZSB7QGxpbmsgSHR0cHNVUkxDb25uZWN0aW9uI3NldEhvc3RuYW1lVmVyaWZpZXIoSG9zdG5hbWVWZXJpZmllcil9fS4gVGhlIHByb3BlcnR5CisgICAgICogaXMgc2V0IGFzIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBIb3N0TmFtZVZlcmlmaWVyIGhvc3ROYW1lVmVyaWZpZXIgPSAuLi47CisgICAgICogTWFwPFN0cmluZywgT2JqZWN0PiBjdHh0ID0gKEJpbmRpbmdQcm92aWRlcilwcm94eSkuZ2V0UmVxdWVzdENvbnRleHQoKTsKKyAgICAgKiBjdHh0LnB1dChIT1NUTkFNRV9WRVJJRklFUiwgaG9zdE5hbWVWZXJpZmllcik7CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5USElTIFBST1BFUlRZIElTIEVYUEVSSU1FTlRBTCBBTkQgSVMgU1VCSkVDVCBUTyBDSEFOR0UgV0lUSE9VVCBOT1RJQ0UgSU4gRlVUVVJFLjwvYj4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUTkFNRV9WRVJJRklFUiA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cHMuY2xpZW50Lmhvc3RuYW1lLnZlcmlmaWVyIjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIHByb3BlcnR5IG9uIHRoZSB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyI2dldFJlcXVlc3RDb250ZXh0KCl9IHRvCisgICAgICogZW5hYmxlIHtAbGluayBIdHRwc1VSTENvbm5lY3Rpb24jc2V0U1NMU29ja2V0RmFjdG9yeShTU0xTb2NrZXRGYWN0b3J5KX0uIFRoZSBwcm9wZXJ0eSBpcyBzZXQKKyAgICAgKiBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogPHA+CisgICAgICogU1NMU29ja2V0RmFjdG9yeSBzc2xGYWN0b3J5ID0gLi4uOworICAgICAqIE1hcDxTdHJpbmcsIE9iamVjdD4gY3R4dCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHkpLmdldFJlcXVlc3RDb250ZXh0KCk7CisgICAgICogY3R4dC5wdXQoU1NMX1NPQ0tFVF9GQUNUT1JZLCBzc2xGYWN0b3J5KTsKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIDxiPlRISVMgUFJPUEVSVFkgSVMgRVhQRVJJTUVOVEFMIEFORCBJUyBTVUJKRUNUIFRPIENIQU5HRSBXSVRIT1VUIE5PVElDRSBJTiBGVVRVUkUuPC9iPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9TT0NLRVRfRkFDVE9SWSA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cHMuY2xpZW50LlNTTFNvY2tldEZhY3RvcnkiOworCisgICAgLyoqCisgICAgICogQWNjY2VzcyB0aGUgbGlzdCBvZiBTT0FQIGhlYWRlcnMgaW4gdGhlIFNPQVAgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9uIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0sIHRoaXMgcHJvcGVydHkgcmV0dXJucyBhIHtAbGluayBIZWFkZXJMaXN0fSBvYmplY3QKKyAgICAgKiB0aGF0IHJlcHJlc2VudHMgU09BUCBoZWFkZXJzIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgdGhhdCB3YXMgcmVjZWl2ZWQuCisgICAgICogT24ge0BsaW5rIEJpbmRpbmdQcm92aWRlciNnZXRSZXNwb25zZUNvbnRleHQoKX0sIHRoaXMgcHJvcGVydHkgcmV0dXJucyBhCisgICAgICoge0BsaW5rIEhlYWRlckxpc3R9IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgU09BUCBoZWFkZXJzIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIGZyb20gdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm9wZXJ0eSBpcyByZWFkLW9ubHksIGFuZCBwbGVhc2UgZG8gbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQge0BsaW5rIEhlYWRlckxpc3R9CisgICAgICogYXMgdGhhdCBtYXkgYnJlYWsgdGhlIEpBWC1XUyBSSSBpbiBzb21lIHVuZXhwZWN0ZWQgd2F5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogPGI+VEhJUyBQUk9QRVJUWSBJUyBFWFBFUklNRU5UQUwgQU5EIElTIFNVQkpFQ1QgVE8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFIElOIEZVVFVSRS48L2I+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5CT1VORF9IRUFERVJfTElTVF9QUk9QRVJUWSA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0IjsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9NZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL01lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmMmZmZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9NZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZy5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3BlcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKK2ltcG9ydCBqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbjsKKworLyoqCisgKiBUaGlzIGZlYXR1cmUgcmVwcmVzZW50cyB0aGUgdXNlIG9mIFdTLUFkZHJlc3Npbmcgd2l0aCBlaXRoZXIKKyAqIHRoZSBTT0FQIDEuMS9IVFRQIG9yIFNPQVAgMS4yL0hUVFAgYmluZGluZy4gIFVzaW5nIHRoaXMgZmVhdHVyZQorICogd2l0aCBhbnkgb3RoZXIgYmluZGluZyBpcyBOT1QgcmVxdWlyZWQuCisgKiA8cD4KKyAqIEVuYWJsaW5nIHRoaXMgZmVhdHVyZSB3aWxsIHJlc3VsdCBpbiB0aGUKKyAqIDxjb2RlPndzYXc6VXNpbmdBZGRyZXNzaW5nPC9jb2RlPiBlbGVtZW50IGJlaW5nIGFkZGVkIHRvIHRoZQorICogPGNvZGU+d3NkbDpCaW5kaW5nPC9jb2RlPiBmb3IKKyAqIHRoZSBlbmRwb2ludCBhbmQgaW4gdGhlIHJ1bnRpbWUgYmVpbmcgY2FwYWJsZSBvZiByZXNwb25kaW5nIHRvCisgKiBXUy1BZGRyZXNzaW5nIGhlYWRlcnMuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBhZmZlY3RzIG9mIHRoaXMgZmVhdHVyZSB3aXRoIHJlc3BlY3QKKyAqIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQ6CisgKiA8dWw+CisgKiAgPGxpPiBFTkFCTEVEOiBJbiB0aGlzIE1vZGUsIEFkZHJlc3Npbmcgd2lsbCBiZSBlbmFibGVkLgorICogICAgICAgSWYgdGhlcmUgaXMgbm90IGEgV1NETCBhc3NvY2lhdGVkIHdpdGggdGhlIEVuZHBvaW50IGFuZAorICogICAgICAgYSBXU0RMIGlzIHRvIGJlIGdlbmVyYXRlZCwgaXQgTVVTVCBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUKKyAqICAgICAgIHdzYXc6VXNpbmdBZGRyZXNzaW5nIGVsZW1lbnQuIEF0IHJ1bnRpbWUsIEFkZHJlc3NpbmcgaGVhZGVycworICogICAgICAgTVVTVCBiZSBjb25zdW1lZCBieSB0aGUgcmVjZWl2ZXIgYW5kIGdlbmVyYXRlZCBieSB0aGUKKyAqICAgICAgIHNlbmRlciBldmVuIGlmIHRoZSBXU0RMIGRlY2xhcmVzIG90aGVyd2lzZS4gVGhlCisgKiAgICAgICBtdXN0VW5kZXJzdGFuZD0iMCIgYXR0cmlidXRlIE1VU1QgYmUgdXNlZCBvbiB0aGUgQWRkcmVzc2luZworICogICAgICAgaGVhZGVycy4KKyAqICA8bGk+IERJU0FCTEVEOiBJbiB0aGlzIE1vZGUsIEFkZHJlc3Npbmcgd2lsbCBiZSBkaXNhYmxlZAorICogICAgICAgZXZlbiBpZiBhbiBhc3NvY2lhdGVkIFdTREwgc3BlY2lmaWVzIG90aGVyd2lzZS4gQXQgcnVudGltZSwKKyAqICAgICAgIEFkZHJlc3NpbmcgaGVhZGVycyBNVVNUIE5PVCBiZSB1c2VkLgorICogPC91bD4KKyAqIDxwPgorICogVGhlIHtAbGluayAjcmVxdWlyZWR9IHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvCisgKiBzcGVjaWZ5IGlmIHRoZSA8Y29kZT5yZXF1aXJlZDwvY29kZT4gYXR0cmlidXRlIG9uIHRoZQorICogPGNvZGU+d3NhdzpVc2luZ0FkZHJlc3Npbmc8L2NvZGU+IGVsZW1lbnQgc2hvdWxkCisgKiBiZSA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4uICBCeSBkZWZhdWx0IHRoZQorICogPGNvZGU+d3NkbDpyZXF1aXJlZDwvY29kZT4gcGFyYW1ldGVyIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAqCisgKiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9SRUMtd3MtYWRkci1jb3JlLTIwMDYwNTA5LyI+V1MtQWRkcmVzc2luZzwvYT4KKyAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFdTLUFkZHJlc3NpbmcuCisgKiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9DUi13cy1hZGRyLXdzZGwtMjAwNjA1MjkvIj5XUy1BZGRyZXNzaW5nIC0gV1NETCAxLjAKKyAqIDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gPGNvZGU+d3NhdzpVc2luZ0FkZHJlc3Npbmc8L2NvZGU+LgorICoKKyAqIEBzaW5jZSBKQVgtV1MgMi4xCisgKi8KK0BUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorQFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbihpZD0gTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLklELGJlYW49TWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmNsYXNzKQorcHVibGljIEBpbnRlcmZhY2UgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmcgeworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqIDxjb2RlPndzZGw6cmVxdWlyZWQ8L2NvZGU+IGF0dHJpYnV0ZSBvbgorICAgICAqIDxjb2RlPndzYXc6VXNpbmdBZGRyZXNzaW5nPC9jb2RlPiBlbGVtZW50IGluIHRoZSBXU0RMLgorICAgICAqLworICAgIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL01lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL01lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlODVkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9kZXZlbG9wZXIvTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkZlYXR1cmVDb25zdHJ1Y3RvcjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKKworLyoqCisgKiBBZGRyZXNzaW5nIEZlYXR1cmUgcmVwcmVzZW50aW5nIE1lbWJlclN1Ym1pc3Npb24gVmVyc2lvbi4KKyAqCisgKiBAYXV0aG9yIFJhbWEgUHVsYXZhcnRoaQorICovCisKK3B1YmxpYyBjbGFzcyBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZSB7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdmFsdWUgaWRlbnRpZnlpbmcgdGhlIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheHdzLzIwMDQvMDgvYWRkcmVzc2luZyI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBJRCBmb3IgdGhlIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBmZWF0dXJlIHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1JFUVVJUkVEID0gIkFERFJFU1NJTkdfSVNfUkVRVUlSRUQiOworCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIE1lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZQorICAgICAqIFRoZSBpbnN0YW5jZSBjcmVhdGVkIHdpbGwgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgeworICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUKKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgZmVhdHVyZSBzaG91bGQKKyAgICAgKiAgICAgICAgICAgICAgICBiZSBlbmFibGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5NZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIGZlYXR1cmUgc2hvdWxkCisgICAgICogYmUgZW5hYmxlZCBvciBub3QuCisgICAgICogQHBhcmFtIHJlcXVpcmVkIHNwZWNpZmllcyB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQKKyAgICAgKiBmb3IgdGhlIDxjb2RlPnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUgb24gdGhlCisgICAgICogPGNvZGU+d3NhdzpVc2luZ0FkZHJlc3Npbmc8L2NvZGU+IGVsZW1lbnQuCisgICAgICovCisgICAgQEZlYXR1cmVDb25zdHJ1Y3Rvcih7ImVuYWJsZWQiLCJyZXF1aXJlZCJ9KQorICAgIHB1YmxpYyBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoYm9vbGVhbiBlbmFibGVkLCBib29sZWFuIHJlcXVpcmVkKSB7CisgICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIHRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gSUQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVpcmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZWQpIHsKKyAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9NZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9NZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzM2ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL01lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hZGRyZXNzaW5nLnYyMDA0MDguTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuV1NETENvbnN0YW50czsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRGF0YSBtb2RlbCBmb3IgTWVtYmVyIFN1Ym1pc3Npb24gV1MtQWRkcmVzc2luZyBzcGVjaWZpY2F0aW9uLiBUaGlzIGlzIG1vZGVsZWQgYWZ0ZXIgdGhlCisgKiBtZW1iZXIgc3VibWlzc2lvbiBzY2hlbWEgYXQ6CisgKgorICogIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy8KKyAqCisgKiBAYXV0aG9yIEthdGh5IFdhbHNoCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCisKK0BYbWxSb290RWxlbWVudChuYW1lID0gIkVuZHBvaW50UmVmZXJlbmNlIiwgbmFtZXNwYWNlID0gTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLk1TTlMpCitAWG1sVHlwZShuYW1lID0gIkVuZHBvaW50UmVmZXJlbmNlVHlwZSIsIG5hbWVzcGFjZSA9IE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5NU05TKQorcHVibGljIGNsYXNzIE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlIGltcGxlbWVudHMgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdDb25zdGFudHMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSkFYQkNvbnRleHQgbXNqYyA9IE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5nZXRNU0pheGJDb250ZXh0KCk7CisKKyAgICBwdWJsaWMgTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdCBhbiBFUFIgZnJvbSBpbmZvc2V0IHJlcHJlc2VudGF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIEEgc291cmNlIG9iamVjdCBjb250YWluaW5nIHZhbGlkIFhtbEluZm9zZXQKKyAgICAgKiAgICAgICAgICAgICAgIGluc3RhbmNlIGNvbnNpc3RlbnQgd2l0aCB0aGUgTWVtYmVyIFN1Ym1pc3Npb24gV1MtQWRkcmVzc2luZworICAgICAqIEB0aHJvd3MgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBzb3VyY2UgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIFczQyBXUy1BZGRyZXNzaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZS4KKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gaWYgdGhlIDxjb2RlPm51bGw8L2NvZGU+IDxjb2RlPnNvdXJjZTwvY29kZT4gdmFsdWUgaXMgZ2l2ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlKEBOb3ROdWxsIFNvdXJjZSBzb3VyY2UpIHsKKworICAgICAgICBpZiAoc291cmNlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiU291cmNlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwgb24gY29uc3RydWN0b3IiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5tc2pjLmNyZWF0ZVVubWFyc2hhbGxlcigpOworICAgICAgICAgICAgTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIGVwciA9IHVubWFyc2hhbGxlci51bm1hcnNoYWwoc291cmNlLE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5jbGFzcykuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgdGhpcy5hZGRyID0gZXByLmFkZHI7CisgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVByb3BlcnRpZXMgPSBlcHIucmVmZXJlbmNlUHJvcGVydGllczsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9IGVwci5yZWZlcmVuY2VQYXJhbWV0ZXJzOworICAgICAgICAgICAgdGhpcy5wb3J0VHlwZU5hbWUgPSBlcHIucG9ydFR5cGVOYW1lOworICAgICAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IGVwci5zZXJ2aWNlTmFtZTsKKyAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGVwci5hdHRyaWJ1dGVzOworICAgICAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVwci5lbGVtZW50czsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRXJyb3IgdW5tYXJzaGFsbGluZyBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiU291cmNlIGRpZCBub3QgY29udGFpbiBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oUmVzdWx0IHJlc3VsdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLm1zamMuY3JlYXRlTWFyc2hhbGxlcigpOworICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsIHRydWUpOworICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKHRoaXMsIHJlc3VsdCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkVycm9yIG1hcnNoYWxsaW5nIFczQ0VuZHBvaW50UmVmZXJlbmNlLiAiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBTb3VyY2UgY29udGFpbmluZyB0aGUgd3NkbCBmcm9tIHRoZSBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gU291cmNlIEEgc291cmNlIG9iamVjdCBjb250YWluaW5nIHRoZSB3c2RsIGluIHRoZSBNZW1lYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLCBpZiBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2UgdG9XU0RMU291cmNlKCkgeworICAgICAgICBFbGVtZW50IHdzZGxFbGVtZW50ID0gbnVsbDsKKworICAgICAgICBmb3IgKEVsZW1lbnQgZWxlbSA6IGVsZW1lbnRzKSB7CisgICAgICAgICAgICBpZiAoZWxlbS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NETENvbnN0YW50cy5OU19XU0RMKSAmJgorICAgICAgICAgICAgICAgICAgICBlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX0RFRklOSVRJT05TLmdldExvY2FsUGFydCgpKSkgeworICAgICAgICAgICAgICAgIHdzZGxFbGVtZW50ID0gZWxlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgRE9NU291cmNlKHdzZGxFbGVtZW50KTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0IGdldE1TSmF4YkNvbnRleHQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgSkFYQkNvbnRleHQgZm9yIE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS4gIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAWG1sRWxlbWVudChuYW1lID0gIkFkZHJlc3MiLCBuYW1lc3BhY2UgPSBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuTVNOUykKKyAgICBwdWJsaWMgQWRkcmVzcyBhZGRyOworCisgICAgQFhtbEVsZW1lbnQobmFtZSA9ICJSZWZlcmVuY2VQcm9wZXJ0aWVzIiwgbmFtZXNwYWNlID0gTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLk1TTlMpCisgICAgcHVibGljIEVsZW1lbnRzIHJlZmVyZW5jZVByb3BlcnRpZXM7CisKKyAgICBAWG1sRWxlbWVudChuYW1lID0gIlJlZmVyZW5jZVBhcmFtZXRlcnMiLCBuYW1lc3BhY2UgPSBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuTVNOUykKKyAgICBwdWJsaWMgRWxlbWVudHMgcmVmZXJlbmNlUGFyYW1ldGVyczsKKworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiUG9ydFR5cGUiLCBuYW1lc3BhY2UgPSBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuTVNOUykKKyAgICBwdWJsaWMgQXR0cmlidXRlZFFOYW1lIHBvcnRUeXBlTmFtZTsKKworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiU2VydmljZU5hbWUiLCBuYW1lc3BhY2UgPSBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuTVNOUykKKyAgICBwdWJsaWMgU2VydmljZU5hbWVUeXBlIHNlcnZpY2VOYW1lOworCisgICAgQFhtbEFueUF0dHJpYnV0ZQorICAgIHB1YmxpYyBNYXA8UU5hbWUsU3RyaW5nPiBhdHRyaWJ1dGVzOworCisgICAgQFhtbEFueUVsZW1lbnQKKyAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBlbGVtZW50czsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWRkcmVzcyB7CisgICAgICAgIHB1YmxpYyBBZGRyZXNzKCkgeworICAgICAgICB9CisKKyAgICAgICAgQFhtbFZhbHVlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdXJpOworICAgICAgICBAWG1sQW55QXR0cmlidXRlCisgICAgICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gYXR0cmlidXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVsZW1lbnRzIHsKKyAgICAgICAgcHVibGljIEVsZW1lbnRzKCkge30KKworICAgICAgICBAWG1sQW55RWxlbWVudAorICAgICAgICBwdWJsaWMgTGlzdDxFbGVtZW50PiBlbGVtZW50czsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXR0cmlidXRlZFFOYW1lIHsKKyAgICAgICAgcHVibGljIEF0dHJpYnV0ZWRRTmFtZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBYbWxWYWx1ZQorICAgICAgICBwdWJsaWMgUU5hbWUgbmFtZTsKKyAgICAgICAgQFhtbEFueUF0dHJpYnV0ZQorICAgICAgICBwdWJsaWMgTWFwPFFOYW1lLCBTdHJpbmc+IGF0dHJpYnV0ZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXJ2aWNlTmFtZVR5cGUgZXh0ZW5kcyBBdHRyaWJ1dGVkUU5hbWV7CisgICAgICAgIHB1YmxpYyBTZXJ2aWNlTmFtZVR5cGUoKSB7CisgICAgICAgIH0KKworICAgICAgICBAWG1sQXR0cmlidXRlKG5hbWU9IlBvcnROYW1lIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3J0TmFtZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNU05TID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9kZXZlbG9wZXIvU2VydmVyU2lkZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL1NlcnZlclNpZGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNThlYjBmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL1NlcnZlclNpZGVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyOworCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGUgc2VydmVyIHNpZGUuCisgKgorICogPHA+CisgKiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgb24gdGhlIHNlcnZlciwgSkFYLVdTIFJJIHNlbmRzIHRoZSBzdGFjaworICogdHJhY2Ugb2YgdGhhdCBleGNlcHRpb24gdG8gdGhlIGNsaWVudC4gT24gdGhlIGNsaWVudCBzaWRlLAorICogaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHN1Y2ggc3RhY2sgdHJhY2UuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgU2VydmVyU2lkZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOworCisgICAgcHVibGljIFNlcnZlclNpZGVFeGNlcHRpb24oU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBzID0gY2xhc3NOYW1lOworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGdldExvY2FsaXplZE1lc3NhZ2UoKTsKKyAgICAgICAgcmV0dXJuIChtZXNzYWdlICE9IG51bGwpID8gKHMgKyAiOiAiICsgbWVzc2FnZSkgOiBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9TdGF0ZWZ1bC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL1N0YXRlZnVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3NTZlOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9TdGF0ZWZ1bC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkluc3RhbmNlUmVzb2x2ZXJBbm5vdGF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TdGF0ZWZ1bEluc3RhbmNlUmVzb2x2ZXI7CisKK2ltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIERlc2lnbmF0ZXMgYSBzdGF0ZWZ1bCB7QGxpbmsgV2ViU2VydmljZX0uCisgKgorICogPHA+CisgKiBBIHNlcnZpY2UgY2xhc3MgdGhhdCBoYXMgdGhpcyBmZWF0dXJlIG9uIHdpbGwgYmVoYXZlIGFzIGEgc3RhdGVmdWwgd2ViIHNlcnZpY2UuCisgKiBTZWUge0BsaW5rIFN0YXRlZnVsV2ViU2VydmljZU1hbmFnZXJ9IGZvciBtb3JlIGFib3V0IHN0YXRlZnVsIHdlYiBzZXJ2aWNlLgorICoKKyAqIEBzaW5jZSAyLjEKKyAqIEBzZXMgU3RhdGVmdWxXZWJTZXJ2aWNlTWFuYWdlcgorICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAVGFyZ2V0KFRZUEUpCitARG9jdW1lbnRlZAorQFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbihpZCA9IFN0YXRlZnVsRmVhdHVyZS5JRCwgYmVhbiA9IFN0YXRlZnVsRmVhdHVyZS5jbGFzcykKK0BJbnN0YW5jZVJlc29sdmVyQW5ub3RhdGlvbihTdGF0ZWZ1bEluc3RhbmNlUmVzb2x2ZXIuY2xhc3MpCitwdWJsaWMgQGludGVyZmFjZSBTdGF0ZWZ1bCB7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9kZXZlbG9wZXIvU3RhdGVmdWxGZWF0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9kZXZlbG9wZXIvU3RhdGVmdWxGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MmM0NwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9TdGF0ZWZ1bEZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuRmVhdHVyZUNvbnN0cnVjdG9yOworCitpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworCisvKioKKyAqIERlc2lnbmF0ZXMgYSBzdGF0ZWZ1bCB7QGxpbmsgV2ViU2VydmljZX0uCisgKiBBIHNlcnZpY2UgY2xhc3MgdGhhdCBoYXMgdGhpcyBmZWF0dXJlIG9uIHdpbGwgYmVoYXZlIGFzIGEgc3RhdGVmdWwgd2ViIHNlcnZpY2UuCisgKgorICogQHNpbmNlIDIuMQorICogQHNlZSBTdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0ZWZ1bEZlYXR1cmUgZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZSB7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdmFsdWUgaWRlbnRpZnlpbmcgdGhlIFN0YXRlZnVsRmVhdHVyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImh0dHA6Ly9qYXgtd3MuZGV2LmphdmEubmV0L2ZlYXR1cmVzL3N0YXRlZnVsIjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5TdGF0ZWZ1bEZlYXR1cmU8L2NvZGU+LgorICAgICAqIFRoZSBpbnN0YW5jZSBjcmVhdGVkIHdpbGwgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBARmVhdHVyZUNvbnN0cnVjdG9yCisgICAgcHVibGljIFN0YXRlZnVsRmVhdHVyZSgpIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gSUQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL1N0YXRlZnVsV2ViU2VydmljZU1hbmFnZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9TdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1YjBmOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2RldmVsb3Blci9TdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQXN5bmNQcm92aWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkFzeW5jUHJvdmlkZXJDYWxsYmFjazsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKK2ltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7CisKKy8qKgorICogU3RhdGVmdWwgd2ViIHNlcnZpY2Ugc3VwcG9ydCBpbiB0aGUgSkFYLVdTIFJJLgorICoKKyAqIDxoMj5Vc2FnZTwvaDI+CisgKiA8cD4KKyAqIEFwcGxpY2F0aW9uIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3NlcyAob3IgcHJvdmlkZXJzKSB3aG8nZCBsaWtlCisgKiB0byB1c2UgdGhlIHN0YXRlZnVsIHdlYiBzZXJ2aWNlIHN1cHBvcnQgbXVzdCBkZWNsYXJlIHtAbGluayBTdGF0ZWZ1bH0KKyAqIGFubm90YXRpb24gb24gYSBjbGFzcy4gSXQgc2hvdWxkIGFsc28gaGF2ZSBhIDxiPnB1YmxpYyBzdGF0aWM8L2I+IG1ldGhvZC9maWVsZAorICogdGhhdCB0YWtlcyB7QGxpbmsgU3RhdGVmdWxXZWJTZXJ2aWNlTWFuYWdlcn0uCisgKgorICogPHByZT4KKyAqICYjNjQ7e0BsaW5rIFN0YXRlZnVsfSAmIzY0O3tAbGluayBXZWJTZXJ2aWNlfQorICogY2xhc3MgQmFua0FjY291bnQgeworICogICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgaWQ7CisgKiAgICAgcHJpdmF0ZSBpbnQgYmFsYW5jZTsKKyAqCisgKiAgICAgQmFua0FjY291bnQoaW50IGlkKSB7IHRoaXMuaWQgPSBpZDsgfQorICogICAgICYjNjQ7e0BsaW5rIFdlYk1ldGhvZH0KKyAqICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVwb3NpdChpbnQgYW1vdW50KSB7IGJhbGFuY2UrPWFtb3VudDsgfQorICoKKyAqICAgICAvLyBlaXRoZXIgdmlhIGEgcHVibGljIHN0YXRpYyBmaWVsZAorICogICAgIDxmb250IGNvbG9yPXJlZD4KKyAqICAgICBwdWJsaWMgc3RhdGljIHtAbGluayBTdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyfSZsdDtCYW5rQWNjb3VudD4gbWFuYWdlcjsKKyAqICAgICA8L2ZvbnQ+CisgKiAgICAgLy8gLi4uIG9yICB2aWEgYSBwdWJsaWMgc3RhdGljIG1ldGhvZCAodGhlIG1ldGhvZCBuYW1lIGNvdWxkIGJlIGFueXRoaW5nKQorICogICAgIDxmb250IGNvbG9yPXJlZD4KKyAqICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TWFuYWdlcih7QGxpbmsgU3RhdGVmdWxXZWJTZXJ2aWNlTWFuYWdlcn0mbHQ7QmFua0FjY291bnQ+IG1hbmFnZXIpIHsKKyAqICAgICAgICAuLi4KKyAqICAgICB9CisgKiAgICAgPC9mb250PgorICogfQorICogPC9wcmU+CisgKgorICogPHA+CisgKiBBZnRlciB5b3VyIHNlcnZpY2UgaXMgZGVwbG95ZWQgYnV0IGJlZm9yZSB5b3UgcmVjZWl2ZSBhIGZpcnN0IHJlcXVlc3QsCisgKiB0aGUgcmVzb3VyY2UgaW5qZWN0aW9uIG9jY3VycyBvbiB0aGUgZmllbGQgb3IgdGhlIG1ldGhvZC4KKyAqCisgKiA8cD4KKyAqIEEgc3RhdGVmdWwgd2ViIHNlcnZpY2UgY2xhc3MgZG9lcyBub3QgbmVlZCB0byBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAqIEluIGZhY3QsIG1vc3Qgb2YgdGhlIHRpbWUgeW91IHdhbnQgdG8gZGVmaW5lIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcworICogc29tZSBhcmd1bWVudHMsIHNvIHRoYXQgZWFjaCBpbnN0YW5jZSBjYXJyaWVzIGNlcnRhaW4gc3RhdGUgKGFzIGlsbHVzdHJhdGVkCisgKiBpbiB0aGUgYWJvdmUgZXhhbXBsZS4pCisgKgorICogPHA+CisgKiBFYWNoIGluc3RhbmNlIG9mIGEgc3RhdGVmdWwgd2ViIHNlcnZpY2UgY2xhc3MgaXMgaWRlbnRpZmllZCBieSBhbiB1bmlxdWUKKyAqIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0uIFlvdXIgYXBwbGljYXRpb24gY3JlYXRlcyBhbiBpbnN0YW5jZSBvZgorICogYSBjbGFzcywgdGhlbiB5b3UnbGwgaGF2ZSB0aGUgSkFYLVdTIFJJIGFzc2lnbiB0aGlzIHVuaXF1ZSBFUFIgZm9yIHRoZQorICogaW5zdGFuY2UgYXMgZm9sbG93czoKKyAqCisgKiA8cHJlPgorICogJiM2NDt7QGxpbmsgV2ViU2VydmljZX0KKyAqIGNsYXNzIEJhbmsgeyAvLyB0aGlzIGlzIG9yZGluYXJ5IHN0YXRlbGVzcyBzZXJ2aWNlCisgKiAgICAgJiM2NDt7QGxpbmsgV2ViTWV0aG9kfQorICogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgVzNDRW5kcG9pbnRSZWZlcmVuY2UgbG9naW4oaW50IGFjY291bnRJZCwgaW50IHBpbikgeworICogICAgICAgICBpZighY2hlY2tQaW4ocGluKSkKKyAqICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkZhaWxlZEV4Y2VwdGlvbigiaW52YWxpZCBwaW4iKTsKKyAqICAgICAgICAgQmFua0FjY291bnQgYWNjID0gbmV3IEJhbmtBY2NvdW50KGFjY291bnRJZCk7CisgKiAgICAgICAgIHJldHVybiBCYW5rQWNjb3VudC5tYW5hZ2VyLntAbGluayAjZXhwb3J0IGV4cG9ydH0oYWNjKTsKKyAqICAgICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFR5cGljYWxseSB5b3UgdGhlbiBwYXNzIHRoaXMgRVBSIHRvIHJlbW90ZSBzeXN0ZW1zLiBXaGVuIHRoZXkgc2VuZAorICogbWVzc2FnZXMgdG8gdGhpcyBFUFIsIHRoZSBKQVgtV1MgUkkgbWFrZXMgc3VyZSB0aGF0IHRoZSBwYXJ0aWN1bGFyIGV4cG9ydGVkCisgKiBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBFUFIgd2lsbCByZWNlaXZlIGEgc2VydmljZSBpbnZvY2F0aW9uLgorICoKKyAqIDxoMj5UaGluZ3MgVG8gQ29uc2lkZXI8L2gyPgorICogPHA+CisgKiBXaGVuIHlvdSBubyBsb25nZXIgbmVlZCB0byB0aWUgYW4gaW5zdGFuY2UgdG8gdGhlIEVQUiwKKyAqIHVzZSB7QGxpbmsgI3VuZXhwb3J0KE9iamVjdCl9IHNvIHRoYXQgdGhlIG9iamVjdCBjYW4gYmUgR0MtZWQKKyAqIChvciBlbHNlIHlvdSdsbCBsZWFrIG1lbW9yeS4pIFlvdSBtYXkgY2hvb3NlIHRvIGRvIHNvIGV4cGxpY2l0bHksCisgKiBvciB5b3UgY2FuIHJlbHkgb24gdGhlIHRpbWUgb3V0IGJ5IHVzaW5nIHtAbGluayAjc2V0VGltZW91dChsb25nLCBDYWxsYmFjayl9LgorICoKKyAqIDxwPgorICoge0BsaW5rIFN0YXRlZnVsV2ViU2VydmljZU1hbmFnZXJ9IGlzIHRocmVhZC1zYWZlLiBJdCBjYW4gYmUgc2FmZWx5CisgKiBpbnZva2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHkuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQHNlZSBTdGF0ZWZ1bEZlYXR1cmUKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBTdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyPFQ+IHsKKyAgICAvKioKKyAgICAgKiBFeHBvcnRzIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGxpa2Uge0BsaW5rICNleHBvcnQoT2JqZWN0KX0gZXhjZXB0IHRoYXQKKyAgICAgKiB5b3UgY2FuIG9idGFpbiB0aGUgRVBSIGluIHlvdXIgY2hvaWNlIG9mIGFkZHJlc3NpbmcgdmVyc2lvbiwKKyAgICAgKiBieSBwYXNzaW5nIGluIHRoZSBzdWl0YWJsZSA8dHQ+ZXByPC90dD4gcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGVwcgorICAgICAqICAgICAgRWl0aGVyIHtAbGluayBXM0NFbmRwb2ludFJlZmVyZW5jZX0gb3Ige0BsaW5rIE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZX0uCisgICAgICogICAgICBJZiBvdGhlciB0eXBlcyBhcmUgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCB0aHJvd3MgYW4ge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259LgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0tc3ViY2xhc3MgdGhhdCBpZGVudGlmaWVzIHRoaXMgZXhwb3J0ZWQKKyAgICAgKiAgICAgIG9iamVjdC4KKyAgICAgKi8KKyAgICBATm90TnVsbCA8RVBSIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IEVQUiBleHBvcnQoQ2xhc3M8RVBSPiBlcHIsIFQgbyk7CisKKyAgICAvKioKKyAgICAgKiBFeHBvcnRzIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGxpa2Uge0BsaW5rICNleHBvcnQoT2JqZWN0KX0gZXhjZXB0IHRoYXQKKyAgICAgKiB5b3UgY2FuIG9idGFpbiB0aGUgRVBSIGluIHlvdXIgY2hvaWNlIG9mIGFkZHJlc3NpbmcgdmVyc2lvbiwKKyAgICAgKiBieSBwYXNzaW5nIGluIHRoZSBzdWl0YWJsZSA8dHQ+ZXByPC90dD4gcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGVwcgorICAgICAqICAgICAgRWl0aGVyIHtAbGluayBXM0NFbmRwb2ludFJlZmVyZW5jZX0gb3Ige0BsaW5rIE1lbWJlclN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZX0uCisgICAgICogICAgICBJZiBvdGhlciB0eXBlcyBhcmUgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCB0aHJvd3MgYW4ge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259LgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICBUaGUgb2JqZWN0IHRvIGJlIGV4cG9ydGVkLCB3aG9zZSBpZGVudGl0eSBiZSByZWZlcmVuY2VkIGJ5IHRoZSByZXR1cm5lZCBFUFIuCisgICAgICogQHBhcmFtIHJlY2lwZQorICAgICAqICAgICAgVGhlIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBwdXQgaW50byBFUFIuIENhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0tc3ViY2xhc3MgdGhhdCBpZGVudGlmaWVzIHRoaXMgZXhwb3J0ZWQKKyAgICAgKiAgICAgIG9iamVjdC4KKyAgICAgKiBAc2luY2UgMi4xLjEKKyAgICAgKi8KKyAgICBATm90TnVsbCA8RVBSIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IEVQUiBleHBvcnQoQ2xhc3M8RVBSPiBlcHIsIFQgbywgQE51bGxhYmxlIEVQUlJlY2lwZSByZWNpcGUgKTsKKworICAgIC8qKgorICAgICAqIEV4cG9ydHMgYW4gb2JqZWN0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogSkFYLVdTIFJJIGFzc2lnbnMgYW4gdW5pcXVlIEVQUiB0byB0aGUgZXhwb3J0ZWQgb2JqZWN0LAorICAgICAqIGFuZCBmcm9tIG5vdyBvbiwgbWVzc2FnZXMgdGhhdCBhcmUgc2VudCB0byB0aGlzIEVQUiB3aWxsCisgICAgICogYmUgcm91dGVkIHRvIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgb2JqZWN0IHdpbGwgYmUgbG9ja2VkIGluIG1lbW9yeSwgc28gYmUgc3VyZSB0bworICAgICAqIHtAbGluayAjdW5leHBvcnQoT2JqZWN0KSB1bmV4cG9ydH0gaXQgd2hlbiBpdCdzIG5vIGxvbmdlciBuZWVkZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBOb3RpY2UgdGhhdCB0aGUgb2J0YWluZWQgRVBSIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzZXJ2aWNlLAorICAgICAqIHdoaWNoIGRlcGVuZHMgb24gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgcmVxdWVzdC4gU28gaW52b2tpbmcKKyAgICAgKiB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIG9iamVjdCBtYXkgcmV0dXJuCisgICAgICogZGlmZmVyZW50IEVQUnMsIGlmIHN1Y2ggbXVsdGlwbGUgaW52b2NhdGlvbnMgYXJlIGRvbmUgd2hpbGUKKyAgICAgKiBzZXJ2aWNpbmcgZGlmZmVyZW50IHJlcXVlc3RzLiAoT2YgY291cnNlIGFsbCBzdWNoIEVQUnMgcG9pbnQKKyAgICAgKiB0byB0aGUgc2FtZSBvYmplY3QsIHNvIG1lc3NhZ2VzIHNlbnQgdG8gdGhvc2UgRVBScyB3aWxsIGJlCisgICAgICogc2VydmVkIGJ5IHRoZSBzYW1lIGluc3RhbmNlLikKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHtAbGluayBXM0NFbmRwb2ludFJlZmVyZW5jZX0gdGhhdCBpZGVudGlmaWVzIHRoaXMgZXhwb3J0ZWQKKyAgICAgKiAgICAgIG9iamVjdC4gQWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIEBOb3ROdWxsIFczQ0VuZHBvaW50UmVmZXJlbmNlIGV4cG9ydChUIG8pOworCisgICAgLyoqCisgICAgICogRXhwb3J0cyBhbiBvYmplY3QgKGZvciB7QGxpbmsgQXN5bmNQcm92aWRlciBhc3luY2hyb25vdXMgd2ViIHNlcnZpY2VzfS4pCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCB3b3JrcyBsaWtlIHtAbGluayAjZXhwb3J0KENsYXNzLE9iamVjdCl9IGJ1dCBpdAorICAgICAqIHRha2VzIGFuIGV4dHJhIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0gdGhhdCByZXByZXNlbnRzIHRoZSByZXF1ZXN0IGN1cnJlbnRseQorICAgICAqIGJlaW5nIHByb2Nlc3NlZCBieSB0aGUgY2FsbGVyICh0aGUgSkFYLVdTIFJJIHJlbWVtYmVycyB0aGlzIHdoZW4gdGhlIHNlcnZpY2UKKyAgICAgKiBwcm9jZXNzaW5nIGlzIHN5bmNocm9ub3VzLCBhbmQgdGhhdCdzIHdoeSB0aGlzIHBhcmFtZXRlciBpcyBvbmx5IG5lZWRlZCBmb3IKKyAgICAgKiBhc3luY2hyb25vdXMgd2ViIHNlcnZpY2VzLikKKyAgICAgKgorICAgICAqIDxoMz5XaHkge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0fSBpcyBuZWVkZWQ/PC9oMz4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgb2J0YWluZWQgRVBSIGNvbnRhaW5zIGFkZHJlc3MsIHN1Y2ggYXMgaG9zdCBuYW1lLiBUaGUgc2VydmVyIGRvZXMgbm90CisgICAgICoga25vdyB3aGF0IGl0cyBvd24gaG9zdCBuYW1lIGlzIChvciB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBvZiB0aGVtKSwKKyAgICAgKiBzbyB0aGlzIHZhbHVlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0aGUgY3VycmVudCBjbGllbnQgdGhpbmtzIHRoZSBzZXJ2ZXIgbmFtZSBpcy4KKyAgICAgKiBUaGlzIGlzIHdoeSB3ZSBuZWVkIHRvIHRha2Uge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0fS4gUGFzcyBpbiB0aGUKKyAgICAgKiBvYmplY3QgZ2l2ZW4gdG8ge0BsaW5rIEFzeW5jUHJvdmlkZXIjaW52b2tlKE9iamVjdCwgQXN5bmNQcm92aWRlckNhbGxiYWNrLFdlYlNlcnZpY2VDb250ZXh0KX0uCisgICAgICovCisgICAgQE5vdE51bGwgPEVQUiBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBFUFIgZXhwb3J0KENsYXNzPEVQUj4gZXByVHlwZSwgQE5vdE51bGwgV2ViU2VydmljZUNvbnRleHQgY29udGV4dCwgVCBvKTsKKworICAgIC8qKgorICAgICAqIEV4cG9ydHMgYW4gb2JqZWN0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogPGI+VGhpcyBtZXRob2QgaXMgbm90IG1lYW50IGZvciBhcHBsaWNhdGlvbiBjb2RlLjwvYj4KKyAgICAgKiBUaGlzIGlzIGZvciB7QGxpbmsgVHViZX1zIHRoYXQgd2lzaCB0byB1c2Ugc3RhdGVmdWwgd2ViIHNlcnZpY2Ugc3VwcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50UmVxdWVzdAorICAgICAqICAgICAgVGhlIHJlcXVlc3QgdGhhdCB3ZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcuIFRoaXMgaXMgdXNlZCB0byBpbmZlciB0aGUgYWRkcmVzcyBpbiBFUFIuCisgICAgICogQHNlZSAjZXhwb3J0KENsYXNzLCBXZWJTZXJ2aWNlQ29udGV4dCwgT2JqZWN0KQorICAgICAqLworICAgIEBOb3ROdWxsIDxFUFIgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gRVBSIGV4cG9ydChDbGFzczxFUFI+IGVwclR5cGUsIEBOb3ROdWxsIFBhY2tldCBjdXJyZW50UmVxdWVzdCwgVCBvKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayAjZXhwb3J0KENsYXNzLCBQYWNrZXQsIE9iamVjdCl9IGV4Y2VwdAorICAgICAqIHRoYXQgaXQgdGFrZXMge0BsaW5rIEVQUlJlY2lwZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjaXBlCisgICAgICogICAgICBTZWUge0BsaW5rICNleHBvcnQoQ2xhc3MsIE9iamVjdCwgRVBSUmVjaXBlKX0uCisgICAgICovCisgICAgQE5vdE51bGwgPEVQUiBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBFUFIgZXhwb3J0KENsYXNzPEVQUj4gZXByVHlwZSwgQE5vdE51bGwgUGFja2V0IGN1cnJlbnRSZXF1ZXN0LCBUIG8sIEVQUlJlY2lwZSByZWNpcGUpOworCisgICAgLyoqCisgICAgICogRXhwb3J0cyBhbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCwgYW5kIHdlJ2xsIGV2ZW50dWFsbHkgdHJ5IHRvIHJlbW92ZSBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmRwb2ludEFkZHJlc3MKKyAgICAgKiAgICAgIFRoZSBlbmRwb2ludCBhZGRyZXNzIFVSTC4gTm9ybWFsbHksIHRoaXMgaW5mb3JtYXRpb24gaXMgZGV0ZXJtaW5lZCBieSBvdGhlciBpbnB1dHMsCisgICAgICogICAgICBsaWtlIHtAbGluayBQYWNrZXR9IG9yIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0uCisgICAgICovCisgICAgQE5vdE51bGwgPEVQUiBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBFUFIgZXhwb3J0KENsYXNzPEVQUj4gZXByVHlwZSwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcywgVCBvKTsKKworICAgIC8qKgorICAgICAqIFVuZXhwb3J0cyB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBKQVgtV1Mgd2lsbCByZWxlYXNlIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB1bmV4cG9ydGVkIG9iamVjdHMsCisgICAgICogYW5kIHRoZXkgd2lsbCBuZXZlciByZWNlaXZlIGZ1cnRoZXIgcmVxdWVzdHMgKHJlcXVlc3RzIHRhcmdldGVkCisgICAgICogZm9yIHRob3NlIHVuZXhwb3J0ZWQgb2JqZWN0cyB3aWxsIGJlIHNlcnZlZCBieSB0aGUgZmFsbGJhY2sgb2JqZWN0LikKKyAgICAgKgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICBpZiBudWxsLCB0aGlzIG1ldGhvZCB3aWxsIGJlIG5vLW9wLgorICAgICAqLworICAgIHZvaWQgdW5leHBvcnQoQE51bGxhYmxlIFQgbyk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIEVQUiByZXByZXNlbnRzIGFuIG9iamVjdCB0aGF0IGhhcyBiZWVuIGV4cG9ydGVkIGZyb20gdGhpcyBtYW5hZ2VyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaGF2ZSB0d28gZW5kcG9pbnRzIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGNvbW11bmljYXRlCisgICAgICogbG9jYWxseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgRVBSIGlzIG5vdCBleHBvcnRlZCBmcm9tIHRoaXMgbWFuYWdlci4KKyAgICAgKi8KKyAgICBATnVsbGFibGUgVCByZXNvbHZlKEBOb3ROdWxsIEVuZHBvaW50UmVmZXJlbmNlIGVwcik7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSAiZmFsbGJhY2siIGluc3RhbmNlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgaW5jb21pbmcgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkgaGVhZGVyIHRvCisgICAgICogZGlzdGluZ3Vpc2ggaW5zdGFuY2VzIG9mIDx0dD5UPC90dD4sIG9yIHdoZW4gdGhlIGhlYWRlciBpcyBwcmVzZW50CisgICAgICogYnV0IGl0cyB2YWx1ZSBkb2VzIG5vdCBjb3JyZXNwb25kIHdpdGggYW55IG9mIHRoZSBhY3RpdmUgZXhwb3J0ZWQKKyAgICAgKiBpbnN0YW5jZXMga25vd24gdG8gdGhlIEpBWC1XUywgdGhlbiB0aGUgSkFYLVdTIFJJIHdpbGwgdHJ5IHRvCisgICAgICogcm91dGUgdGhlIHJlcXVlc3QgdG8gdGhlIGZhbGxiYWNrIGluc3RhbmNlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBwcm92aWRlcyB0aGUgYXBwbGljYXRpb24gYW4gb3Bwb3J0dW5pdHkgdG8gcGVyZm9ybSBhcHBsaWNhdGlvbgorICAgICAqIHNwZWNpZmljIGVycm9yIHJlY292ZXJ5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgbm8gZmFsbGJhY2sgaW5zdGFuY2UgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIEpBWC1XUyBSSSB3aWxsCisgICAgICogc2VuZCBiYWNrIHRoZSBmYXVsdC4gQnkgZGVmYXVsdCwgbm8gZmFsbGJhY2sgaW5zdGFuY2UgaXMgc2V0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGludm9rZWQgYW55IHRpbWUsIGJ1dCBtb3N0IG9mdGVuIHlvdSdkIGxpa2UgdG8KKyAgICAgKiB1c2Ugb25lIGluc3RhbmNlIGF0IHRoZSBnZXQtZ28uIFRoZSBmb2xsb3dpbmcgY29kZSBleGFtcGxlCisgICAgICogaWxsdXN0cmF0ZXMgaG93IHRvIGRvIHRoaXM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICYjNjQ7e0BsaW5rIFdlYlNlcnZpY2V9CisgICAgICogY2xhc3MgQmFua0FjY291bnQgeworICAgICAqICAgICAuLi4gY29udGludXRpbmcgZnJvbSB0aGUgZXhhbXBsZSBpbiBjbGFzcyBqYXZhZG9jIC4uLgorICAgICAqCisgICAgICogICAgICYjNjQ7e0BsaW5rIFJlc291cmNlfSBzdGF0aWMgdm9pZCBzZXRNYW5hZ2VyKHtAbGluayBTdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyfSBtYW5hZ2VyKSB7CisgICAgICogICAgICAgIG1hbmFnZXIuc2V0RmFsbGJhY2tJbnN0YW5jZShuZXcgQmFua0FjY291bnQoMCkgeworICAgICAqICAgICAgICAgICAgJiM2NDt7QGxpbmsgT3ZlcnJpZGV9CisgICAgICogICAgICAgICAgICB2b2lkIGRlcG9zaXQoaW50IGFtb3VudCkgeworICAgICAqICAgICAgICAgICAgICAgIHB1dFRvQXVkaXRSZWNvcmQoaWQpOworICAgICAqICAgICAgICAgICAgICAgIGlmKHRoaXNMb29rc0JhZCgpKSAgIGNhbGxQb2xpY2UoKTsKKyAgICAgKiAgICAgICAgICAgICAgICB0aHJvdyBuZXcge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259KCJObyBzdWNoIGJhbmsgYWNjb3VudCBleGlzdHMiKTsKKyAgICAgKiAgICAgICAgICAgIH0KKyAgICAgKiAgICAgICAgfSk7CisgICAgICogICAgIH0KKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgdm9pZCBzZXRGYWxsYmFja0luc3RhbmNlKFQgbyk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRpbWVvdXQgZm9yIGV4cG9ydGVkIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoZW4gY29uZmlndXJlZCwgdGhlIEpBWC1XUyBSSSB3aWxsIGludGVybmFsbHkgdXNlIGEgdGltZXIKKyAgICAgKiBzbyB0aGF0IGV4cG9ydGVkIG9iamVjdHMgdGhhdCBoYXZlIG5vdCByZWNlaXZlZCBhbnkgcmVxdWVzdAorICAgICAqIGZvciB0aGUgZ2l2ZW4gYW1vdW50IG9mIG1pbnV0ZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVuZXhwb3J0ZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBdCBzb21lIHBvaW50IGFmdGVyIHRoZSB0aW1lIG91dCBoYXMgb2NjdXJyZWQgZm9yIGFuIGluc3RhbmNlLAorICAgICAqIHRoZSBKQVgtV1MgUkkgd2lsbCBpbnZva2UgdGhlIHtAbGluayBDYWxsYmFja30gdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbgorICAgICAqIHRoYXQgdGhlIHRpbWUgb3V0IGhhcyByZWFjaGVkLiBBcHBsaWNhdGlvbiB0aGVuIGhhcyBhIGNob2ljZSBvZgorICAgICAqIGVpdGhlciBsZXQgdGhlIG9iamVjdCBnbyB1bmV4cG9ydGVkLCBvciB7QGxpbmsgI3RvdWNoKE9iamVjdCkgdG91Y2h9CisgICAgICogbGV0IHRoZSBvYmplY3QgbGl2ZSBmb3IgYW5vdGhlciByb3VuZCBvZiB0aW1lciBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIG5vIGNhbGxiYWNrIGlzIHNldCwgdGhlIGV4cGlyZWQgb2JqZWN0IHdpbGwgYXV0b21hdGljYWxseSB1bmV4cG9ydGVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiB5b3UgY2FsbCB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcywgaXRzIGVmZmVjdCBvbiBleGlzdGluZworICAgICAqIGluc3RhbmNlcyBhcmUgdW5zcGVjaWZpZWQsIGFsdGhvdWdoIGRldGVybWluaXN0aWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzCisgICAgICogICAgICBUaGUgdGltZSBvdXQgaW50ZXJ2YWwuIFNwZWNpZnkgMCB0byBjYW5jZWwgdGhlIHRpbWVvdXQgdGltZXIuCisgICAgICogICAgICBOb3RlIHRoYXQgdGhpcyBvbmx5IGd1YXJhbnRlZXMgdGhhdCB0aW1lIG91dCBkb2VzIG5vdCBvY2N1cgorICAgICAqICAgICAgYXQgbGVhc3QgdW50aWwgdGhpcyBhbW91bnQgb2YgdGltZSBoYXMgZWxhcHNlZC4gSXQgZG9lcyBub3QKKyAgICAgKiAgICAgIGd1YXJhbnRlZSB0aGF0IHRoZSB0aW1lIG91dCB3aWxsIGFsd2F5cyBoYXBwZW4gcmlnaHQgYWZ0ZXIKKyAgICAgKiAgICAgIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuCisgICAgICogQHBhcmFtIGNhbGxiYWNrCisgICAgICogICAgICBhcHBsaWNhdGlvbiBtYXkgY2hvb3NlIHRvIGluc3RhbGwgYSBjYWxsYmFjayB0byBjb250cm9sIHRoZQorICAgICAqICAgICAgdGltZW91dCBiZWhhdmlvci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFRpbWVvdXQobG9uZyBtaWxsaXNlY29uZHMsIEBOdWxsYWJsZSBDYWxsYmFjazxUPiBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIHRpbWUgb3V0IHRpbWVyIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIG5vdCBleHBvcnRlZCwgb3IgYWxyZWFkeSB1bmV4cG9ydGVkLCB0aGlzCisgICAgICogbWV0aG9kIHdpbGwgYmUgbm8tb3AuCisgICAgICovCisgICAgdm9pZCB0b3VjaChUIG8pOworCisgICAgLyoqCisgICAgICogVXNlZCBieSB7QGxpbmsgU3RhdGVmdWxXZWJTZXJ2aWNlTWFuYWdlciNzZXRUaW1lb3V0KGxvbmcsIENhbGxiYWNrKX0KKyAgICAgKiB0byBkZXRlcm1pbmUgd2hhdCB0byBkbyB3aGVuIHRoZSB0aW1lIG91dCBpcyByZWFjaGVkLgorICAgICAqLworICAgIGludGVyZmFjZSBDYWxsYmFjazxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBsaWNhdGlvbiBoYXMgYSBjaGFuY2UgdG8gZGVjaWRlIGlmIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHVuZXhwb3J0ZWQsCisgICAgICAgICAqIG9yIGtlcHQgYWxpdmUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGVpdGhlciB1bmV4cG9ydCB0aGUgb2JqZWN0LCBvciB0b3VjaCB0aGUgb2JqZWN0CisgICAgICAgICAqIGZyb20gd2l0aGluIHRoaXMgY2FsbGJhY2suCisgICAgICAgICAqIElmIG5vIGFjdGlvbiBpcyB0YWtlbiwgdGhlIG9iamVjdCB3aWxsIHJlbWFpbiBleHBvcnRlZCB1bnRpbCBpdCBpcworICAgICAgICAgKiBtYW51YWxseSB1bmV4cG9ydGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGltZWRPdXRPYmplY3QKKyAgICAgICAgICogICAgICBUaGUgb2JqZWN0IHRoYXQgcmVhY2hlZCB0aGUgdGltZSBvdXQuCisgICAgICAgICAqIEBwYXJhbSBtYW5hZ2VyCisgICAgICAgICAqICAgICAgVGhlIG1hbmFnZXIgaW5zdGFuY2UgdGhhdCB5b3UgZXhwb3J0ZWQgdGhlIG9iamVjdCB0by4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25UaW1lb3V0KEBOb3ROdWxsIFQgdGltZWRPdXRPYmplY3QsIEBOb3ROdWxsIFN0YXRlZnVsV2ViU2VydmljZU1hbmFnZXI8VD4gbWFuYWdlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL1dTQmluZGluZ1Byb3ZpZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9kZXZlbG9wZXIvV1NCaW5kaW5nUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTkyOTAzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL1dTQmluZGluZ1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyczsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7CitpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7CitpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyfSB3aXRoIEpBWC1XUyBSSSdzIGV4dGVuc2lvbiBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKiBAc2luY2UgMi4xRUEzCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV1NCaW5kaW5nUHJvdmlkZXIgZXh0ZW5kcyBCaW5kaW5nUHJvdmlkZXIgeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dC1ib3VuZCBoZWFkZXJzIHRvIGJlIGFkZGVkIHRvIG1lc3NhZ2VzIHNlbnQgZnJvbQorICAgICAqIHRoaXMge0BsaW5rIEJpbmRpbmdQcm92aWRlcn0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdvdWxkIGRpc2NhcmQgYW55IG91dC1ib3VuZCBoZWFkZXJzCisgICAgICogdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2V0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogQSBuZXcge0BsaW5rIEhlYWRlcn0gb2JqZWN0IGNhbiBiZSBjcmVhdGVkIGJ5IHVzaW5nCisgICAgICogb25lIG9mIHRoZSBtZXRob2RzIG9uIHtAbGluayBIZWFkZXJzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXJzCisgICAgICogICAgICBUaGUgaGVhZGVycyB0byBiZSBhZGRlZCB0byB0aGUgZnV0dXJlIHJlcXVlc3QgbWVzc2FnZXMuCisgICAgICogICAgICBUbyBjbGVhciB0aGUgb3V0Ym91bmQgaGVhZGVycywgcGFzcyBpbiBlaXRoZXIgbnVsbAorICAgICAqICAgICAgb3IgZW1wdHkgbGlzdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhlIGxpc3QgY29udGFpbnMgbnVsbCBpdGVtLgorICAgICAqLworICAgIHZvaWQgc2V0T3V0Ym91bmRIZWFkZXJzKExpc3Q8SGVhZGVyPiBoZWFkZXJzKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dC1ib3VuZCBoZWFkZXJzIHRvIGJlIGFkZGVkIHRvIG1lc3NhZ2VzIHNlbnQgZnJvbQorICAgICAqIHRoaXMge0BsaW5rIEJpbmRpbmdQcm92aWRlcn0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBXb3JrcyBsaWtlIHtAbGluayAjc2V0T3V0Ym91bmRIZWFkZXJzKExpc3QpfSBleGNlcHQKKyAgICAgKiB0aGF0IGl0IGFjY2VwdHMgYSB2YXIgYXJnIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlcnMKKyAgICAgKiAgICAgIENhbiBiZSBudWxsIG9yIGVtcHR5LgorICAgICAqLworICAgIHZvaWQgc2V0T3V0Ym91bmRIZWFkZXJzKEhlYWRlci4uLiBoZWFkZXJzKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dC1ib3VuZCBoZWFkZXJzIHRvIGJlIGFkZGVkIHRvIG1lc3NhZ2VzIHNlbnQgZnJvbQorICAgICAqIHRoaXMge0BsaW5rIEJpbmRpbmdQcm92aWRlcn0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBFYWNoIG9iamVjdCBtdXN0IGJlIGEgSkFYQi1ib3VuZCBvYmplY3QgdGhhdCBpcyB1bmRlcnN0b29kCisgICAgICogYnkgdGhlIHtAbGluayBKQVhCQ29udGV4dH0gb2JqZWN0IGtub3duIGJ5IHRoaXMge0BsaW5rIFdTQmluZGluZ1Byb3ZpZGVyfQorICAgICAqICh0aGF0IGlzLCBpZiB0aGlzIGlzIGEge0BsaW5rIERpc3BhdGNofSB3aXRoIEpBWEIsIHRoZW4KKyAgICAgKiB7QGxpbmsgSkFYQkNvbnRleHR9IGdpdmVuIHRvIHtAbGluayBTZXJ2aWNlI2NyZWF0ZURpc3BhdGNoKFFOYW1lLEpBWEJDb250ZXh0LE1vZGUpfQorICAgICAqIGFuZCBpZiB0aGlzIGlzIGEgdHlwZWQgcHJveHksIHRoZW4ge0BsaW5rIEpBWEJDb250ZXh0fQorICAgICAqIGltcGxpY2l0bHkgY3JlYXRlZCBieSB0aGUgSkFYLVdTIFJJLikKKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXJzCisgICAgICogICAgICBDYW4gYmUgbnVsbCBvciBlbXB0eS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICBJZiB0aGlzIHtAbGluaSBXU0JpbmRpbmdQcm92aWRlcn0gaXMgYSB7QGxpbmsgRGlzcGF0Y2h9CisgICAgICogICAgICB0aGF0IGRvZXMgbm90IHVzZSBKQVhCLgorICAgICAqLworICAgIHZvaWQgc2V0T3V0Ym91bmRIZWFkZXJzKE9iamVjdC4uLiBoZWFkZXJzKTsKKworICAgIExpc3Q8SGVhZGVyPiBnZXRJbmJvdW5kSGVhZGVycygpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YmJhNWZmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZGV2ZWxvcGVyL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoqCisgKiBKQVgtV1MgUkkgdmVuZG9yIGV4dGVuc2lvbiBmZWF0dXJlcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIEpBWC1XUyBSSSB1c2Vycy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9BYnN0cmFjdFhNTFN0cmVhbVdyaXRlckV4SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvQWJzdHJhY3RYTUxTdHJlYW1Xcml0ZXJFeEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTUyNGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvQWJzdHJhY3RYTUxTdHJlYW1Xcml0ZXJFeEltcGwuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmc7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5YTUxTdHJlYW1FeGNlcHRpb24yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguWE1MU3RyZWFtV3JpdGVyRXg7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogUGFydGlhbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJFeH0uCisgKgorICogVE9ETzogZmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhNTFN0cmVhbVdyaXRlckV4SW1wbCBpbXBsZW1lbnRzIFhNTFN0cmVhbVdyaXRlckV4IHsKKworICAgIHByaXZhdGUgU3RyZWFtSW1wbCBzdHJlYW07CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShEYXRhSGFuZGxlciBkYXRhKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmVhbUltcGwgc3RyZWFtID0gX3dyaXRlQmluYXJ5KGRhdGEuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoZGF0YS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uMihlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHdyaXRlQmluYXJ5KFN0cmluZyBjb250ZW50VHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfd3JpdGVCaW5hcnkoY29udGVudFR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyZWFtSW1wbCBfd3JpdGVCaW5hcnkoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIGlmKHN0cmVhbT09bnVsbCkKKyAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBTdHJlYW1JbXBsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmVhbS5yZXNldCgpOworICAgICAgICBzdHJlYW0uY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgcmV0dXJuIHN0cmVhbTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFN0cmVhbUltcGwgZXh0ZW5kcyBCeXRlQXJyYXlCdWZmZXIgeworICAgICAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZTsKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JpdGVCaW5hcnkoYnVmLDAsc2l6ZSgpLGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24geCA9IG5ldyBJT0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIHguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9Db250ZW50VHlwZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL0NvbnRlbnRUeXBlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzVlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9Db250ZW50VHlwZUltcGwuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmc7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db250ZW50VHlwZTsKKworLyoqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFR5cGVJbXBsIGltcGxlbWVudHMgQ29udGVudFR5cGUgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNvYXBBY3Rpb247CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWNjZXB0OworCisgICAgcHVibGljIENvbnRlbnRUeXBlSW1wbChTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgICAgICB0aGlzLnNvYXBBY3Rpb24gPSBudWxsOworICAgICAgICB0aGlzLmFjY2VwdCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIENvbnRlbnRUeXBlSW1wbChTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBzb2FwQWN0aW9uKSB7CisgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgdGhpcy5zb2FwQWN0aW9uID0gZ2V0UXVvdGVkU09BUEFjdGlvbihzb2FwQWN0aW9uKTsKKyAgICAgICAgdGhpcy5hY2NlcHQgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50VHlwZUltcGwoU3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJpbmcgc29hcEFjdGlvbiwgU3RyaW5nIGFjY2VwdCkgeworICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgIHRoaXMuYWNjZXB0ID0gYWNjZXB0OworICAgICAgICB0aGlzLnNvYXBBY3Rpb24gPSBnZXRRdW90ZWRTT0FQQWN0aW9uKHNvYXBBY3Rpb24pOworICAgIH0KKworICAgIC8qKiBCUCAxLjEgUjExMDkgcmVxdWlyZXMgU09BUEFjdGlvbiB0b28gYmUgYSBxdW90ZWQgdmFsdWUgKiovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UXVvdGVkU09BUEFjdGlvbihTdHJpbmcgc29hcEFjdGlvbil7CisgICAgICAgIGlmKHNvYXBBY3Rpb24gPT0gbnVsbCB8fCBzb2FwQWN0aW9uLmxlbmd0aCgpID09IDApeworICAgICAgICAgICAgcmV0dXJuICJcIlwiIjsKKyAgICAgICAgfWVsc2UgaWYoc29hcEFjdGlvbi5jaGFyQXQoMCkgIT0gJyInICYmIHNvYXBBY3Rpb24uY2hhckF0KHNvYXBBY3Rpb24ubGVuZ3RoKCkgLTEpICE9ICciJyl7CisgICAgICAgICAgICAvL3N1cnJvdW5kIHNvYXBBY3Rpb24gYnkgZG91YmxlIHF1b3RlcyBmb3IgQlAgUjExMDkKKyAgICAgICAgICAgIHJldHVybiAiXCIiICsgc29hcEFjdGlvbiArICJcIiI7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gY29udGVudFR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTT0FQQWN0aW9uSGVhZGVyKCkgeworICAgICAgICByZXR1cm4gc29hcEFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGFjY2VwdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9FbmNvZGVyRGVjb2RlckJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL0VuY29kZXJEZWNvZGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODZmNDFjLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL0VuY29kZXJEZWNvZGVyQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQWNjZXNzb3JFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuSkFYQlJJQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5SYXdBY2Nlc3NvcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNlcmlhbGl6YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlJ1bnRpbWVNb2RlbDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIFZpdmVrIFBhbmRleQotICoKLSAqIEJhc2UgQWJzdHJhY3QgY2xhc3MgdG8gYmUgdXNlZCBmb3IgZW5jb2RpbmctZGVjb2RpbmcgYSBnaXZlbiBiaW5kaW5nLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW5jb2RlckRlY29kZXJCYXNlIHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGludGVybmFsIG1lc3NhZ2UgYmFzZWQgdGhhdHMgYmluZGluZyBkZXBlbmRlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUluZm8KLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcm5hbCBtZXNzYWdlIGdpdmVuIGEgbWVzc2FnZUluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHRvSW50ZXJuYWxNZXNzYWdlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IEltcGxlbWVudGF0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgaW4gTWVzc2FnZUluZm8gZnJvbSBiaW5kaW5nIGRlcGVuZGVudCBpbnRlcm5hbCBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGludGVybmFsTWVzc2FnZQotICAgICAqIEBwYXJhbSBtZXNzYWdlSW5mbwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRvTWVzc2FnZUluZm8oT2JqZWN0IGludGVybmFsTWVzc2FnZSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgSW1wbGVtZW50YXRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHdyYXBwZXIgY2hpbGQgdmFsdWUgZnJvbSBhIGpheGIgc3R5bGUgd3JhcHBlciBiZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0IHRvIGJlIHBhc3NlZCBieSB0aGUgZW5jb2Rlci9kZWNvZGVyIHByb2Nlc3NpbmcKLSAgICAgKiAgICAgICAgICAgIFNPQVAgbWVzc2FnZSBkdXJpbmcgdG9NZXNzYWdlSW5mbygpCi0gICAgICogQHBhcmFtIHdyYXBwZXJCZWFuCi0gICAgICogICAgICAgICAgICBUaGUgd3JhcHBlciBiZWFuIGluc3RhbmNlCi0gICAgICogQHBhcmFtIG5zVVJJCi0gICAgICogICAgICAgICAgICBuYW1lc3BhY2Ugb2YgdGhlIHdyYXBwZXIgY2hpbGQgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAgICogICAgICAgICAgICBsb2NhbCBuYW1lIG9mIHRoZSB3cmFwcGVyIGNoaWxkIHByb3BlcnR5Ci0gICAgICogQHJldHVybiBUaGUgd3JhcHBlciBjaGlsZAotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRXcmFwcGVyQ2hpbGRWYWx1ZShSdW50aW1lQ29udGV4dCBjb250ZXh0LCBPYmplY3Qgd3JhcHBlckJlYW4sIFN0cmluZyBuc1VSSSwKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgaWYgKHdyYXBwZXJCZWFuID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBSYXdBY2Nlc3NvciByYSA9IGdldFJhd0FjY2Vzc29yKGNvbnRleHQsIHdyYXBwZXJCZWFuLmdldENsYXNzKCksIG5zVVJJLCBsb2NhbE5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHJhLmdldCh3cmFwcGVyQmVhbik7Ci0gICAgICAgIH0gY2F0Y2ggKEFjY2Vzc29yRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB3cmFwcGVyIGNoaWxkIHZhbHVlIGZyb20gYSBqYXhiIHN0eWxlIHdyYXBwZXIgYmVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICBjb250ZXh0IFJ1bnRpbWVDb250ZXh0IHRvIGJlIHBhc3NlZCBieSB0aGUgZW5jb2Rlci9kZWNvZGVyCi0gICAgICogICAgICAgICAgICBwcm9jZXNzaW5nIFNPQVAgbWVzc2FnZSBkdXJpbmcgdG9NZXNzYWdlSW5mbygpCi0gICAgICogQHBhcmFtIHdyYXBwZXJCZWFuCi0gICAgICogICAgICAgICAgICBUaGUgd3JhcHBlciBiZWFuIGluc3RhbmNlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB2YWx1ZSBvZiB0aGUgd3JhcHBlciBjaGlsZCBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSBuc1VSSQotICAgICAqICAgICAgICAgICAgbmFtZXNwYWNlIG9mIHRoZSB3cmFwcGVyIGNoaWxkIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgICAqICAgICAgICAgICAgbG9jYWxOYW1lIGxvY2FsIG5hbWUgb2YgdGhlIHdyYXBwZXIgY2hpbGQgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRXcmFwcGVyQ2hpbGRWYWx1ZShSdW50aW1lQ29udGV4dCBjb250ZXh0LCBPYmplY3Qgd3JhcHBlckJlYW4sIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgIFN0cmluZyBuc1VSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBpZiAod3JhcHBlckJlYW4gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgUmF3QWNjZXNzb3IgcmEgPSBnZXRSYXdBY2Nlc3Nvcihjb250ZXh0LCB3cmFwcGVyQmVhbi5nZXRDbGFzcygpLCBuc1VSSSwgbG9jYWxOYW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhLnNldCh3cmFwcGVyQmVhbiwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChBY2Nlc3NvckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUmF3QWNjZXNzb3IgZ2V0UmF3QWNjZXNzb3IoUnVudGltZUNvbnRleHQgY29udGV4dCwgQ2xhc3Mgd3JhcHBlckJlYW4sIFN0cmluZyBuc1VSSSwgU3RyaW5nIGxvY2FsTmFtZSl7Ci0gICAgICAgIFJ1bnRpbWVNb2RlbCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTsKLSAgICAgICAgTWFwPEludGVnZXIsIFJhd0FjY2Vzc29yPiBtYXAgPSBtb2RlbC5nZXRSYXdBY2Nlc3Nvck1hcCgpOwotICAgICAgICBpbnQgaWQgID0gZ2V0SGFzaENvZGUod3JhcHBlckJlYW4sIG5zVVJJLCBsb2NhbE5hbWUpOwotICAgICAgICBSYXdBY2Nlc3NvciByYSA9IG1hcC5nZXQoaWQpOwotICAgICAgICBpZihyYSA9PSBudWxsKXsKLSAgICAgICAgICAgIEpBWEJSSUNvbnRleHQgamF4YkNvbnRleHQgPSBtb2RlbC5nZXRKQVhCQ29udGV4dCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByYSA9IGpheGJDb250ZXh0LmdldEVsZW1lbnRQcm9wZXJ0eUFjY2Vzc29yKHdyYXBwZXJCZWFuLCBuc1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChpZCwgcmEpOwotICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJhOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEhhc2hDb2RlKENsYXNzIGJlYW4sIFN0cmluZyB1cmksIFN0cmluZyBwZml4KXsKLSAgICAgICAgcmV0dXJuIGJlYW4uaGFzaENvZGUoKSt1cmkuaGFzaENvZGUoKStwZml4Lmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUzNTRhLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL0pBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZzsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuQXR0YWNobWVudEJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuTXRvbUNhbGxiYWNrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50TWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKgotICoKLSAqLwotcHVibGljIGNsYXNzIEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIgZXh0ZW5kcyBBdHRhY2htZW50TWFyc2hhbGxlciB7Ci0KLSAgICBwdWJsaWMgSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlcihib29sZWFuIGlzWE9QKXsKLSAgICAgICAgdGhpcy5pc1hPUCA9IGlzWE9QOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWE9QUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzWE9QOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgWE9QIHBhY2thZ2UgaWYgdGhlIGluY29taW5nIFNPQVAgZW52ZWxvcGUgaXMgYSBYT1AgcGFja2FnZQotICAgICAqIEBwYXJhbSBpc1hPUAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhPUFBhY2thZ2UoYm9vbGVhbiBpc1hPUCl7Ci0gICAgICAgIHRoaXMuaXNYT1AgPSBpc1hPUDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgQXR0YWNobWVudE1hcnNoYWxsZXIjYWRkTXRvbUF0dGFjaG1lbnQoRGF0YUhhbmRsZXIsIFN0cmluZywgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYWRkTXRvbUF0dGFjaG1lbnQoRGF0YUhhbmRsZXIgZGF0YSwgU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICBpZighaXNYT1ApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNpZCA9IGVuY29kZUNpZChlbGVtZW50TmFtZXNwYWNlKTsKLSAgICAgICAgaWYoY2lkICE9IG51bGwpewotICAgICAgICAgICAgU3RyaW5nIGNpZEJyYWNrZXQgPSAnPCcgKyBjaWQgKyAnPic7Ci0gICAgICAgICAgICBhdHRhY2htZW50cy5wdXQoY2lkQnJhY2tldCwgQXR0YWNobWVudEJsb2NrLmZyb21EYXRhSGFuZGxlcihjaWRCcmFja2V0LGRhdGEpKTsKLSAgICAgICAgICAgIGFkZFRvTWVzc2FnZUNvbnRleHQoY2lkQnJhY2tldCwgZGF0YSk7Ci0gICAgICAgICAgICBpZihtdG9tQ2FsbGJhY2sgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtdG9tQ2FsbGJhY2suYWRkZWRNdG9tQXR0YWNobWVudChjaWRCcmFja2V0LCBkYXRhLCBlbGVtZW50TmFtZXNwYWNlLCBlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICBpc1hvcHBlZCA9IHRydWU7Ci0gICAgICAgICAgICBjaWQgPSAiY2lkOiIrY2lkOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Q29uc2lkZXIgYmluYXJ5IDxjb2RlPmRhdGE8L2NvZGU+IGZvciBvcHRpbWl6ZWQgYmluYXJ5IHN0b3JhZ2UgYXMgYW4gYXR0YWNobWVudC4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+U2luY2UgY29udGVudCB0eXBlIGlzIG5vdCBrbm93biwgdGhlIGF0dGFjaG1lbnQncyBNSU1FIGNvbnRlbnQgdHlwZSBtdXN0IGJlIHNldCB0byAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIi48L3A+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgPGNvZGU+ZWxlbWVudE5hbWVzcGFjZTwvY29kZT4gYW5kIDxjb2RlPmVsZW1lbnRMb2NhbE5hbWU8L2NvZGU+Ci0gICAgICogcGFyYW1ldGVycyBwcm92aWRlIHRoZQotICAgICAqIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgYmluYXJ5IGRhdGEuIFRoaXMgaW5mb3JtYXRpb24gY291bGQKLSAgICAgKiBiZSB1c2VkIGJ5IHRoZSBNSU1FLWJhc2VkIHBhY2thZ2UgcHJvY2Vzc29yIHRvIGRldGVybWluZSBpZiB0aGUKLSAgICAgKiBiaW5hcnkgZGF0YSBzaG91bGQgYmUgaW5saW5lZCBvciBvcHRpbWl6ZWQgYXMgYW4gYXR0YWNobWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIGRhdGEgdG8gYmUgYXR0YWNoZWQuIE11c3QgYmUgbm9uLW51bGwuIFRoZSBhY3R1YWwgZGF0YSByZWdpb24gaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgPHR0PihkYXRhLG9mZnNldCxsZW4pPC90dD4gdHVwbGUuCi0gICAgICogQHBhcmFtIG1pbWVUeXBlICAgICAgICAgSWYgdGhlIGRhdGEgaGFzIGFuIGFzc29jaWF0ZWQgTUlNRSB0eXBlIGtub3duIHRvIEpBWEIsIHRoYXQgaXMgcGFzc2VkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhpcyBwYXJhbWV0ZXIuIElmIG5vbmUgaXMga25vd24sICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG1heSBuZXZlciBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50IHRoYXQgZW5jbG9zZXMgdGhlIGJhc2U2NEJpbmFyeSBkYXRhLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBlbXB0eSBidXQgbmV2ZXIgbnVsbC4KLSAgICAgKiBAcGFyYW0gZWxlbWVudExvY2FsTmFtZSBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgZWxlbWVudC4gQWx3YXlzIGEgbm9uLW51bGwgdmFsaWQgc3RyaW5nLgotICAgICAqIEByZXR1cm4gY29udGVudC1pZCBVUkksIGNpZCwgdG8gdGhlIGF0dGFjaG1lbnQgY29udGFpbmluZwotICAgICAqICAgICAgICAgPGNvZGU+ZGF0YTwvY29kZT4gb3IgbnVsbCBpZiBkYXRhIHNob3VsZCBiZSBpbmxpbmVkLgotICAgICAqIEBzZWUgI2FkZE10b21BdHRhY2htZW50KGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIsIFN0cmluZywgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYWRkTXRvbUF0dGFjaG1lbnQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW4sIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBlbGVtZW50TG9jYWxOYW1lKSB7Ci0gICAgICAgIGlmKCFpc1hPUCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIC8vVE9ETzogV2l0aCBwZXJmb3JtYW5jZSByZXN1bHRzIHdlIG5lZWQgdG8gZmluZCBvdXQgd2hhdCBsZW5ndGggd291bGQgbmVlZCBvcHRpbWl6YXRpb24KLSAgICAgICAgaWYobGVuIDwgbXRvbVRocmVzaG9sZFZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy90aGlzIHdpbGwgbm90IGJlIG5lZWRlZCBpZiBzYWFqIGV4cG9zZXMgYXBpIHRoYXQgdGFrZXMKLSAgICAgICAgLy9ieXRlW10gYWN0dWFsRGF0YSA9IGdldEFjdHVhbERhdGEoZGF0YSwgb2Zmc2V0LCBsZW4pOwotCi0gICAgICAgIFN0cmluZyBjaWQgPSBlbmNvZGVDaWQoZWxlbWVudE5hbWVzcGFjZSk7Ci0gICAgICAgIGlmKGNpZCAhPSBudWxsKXsKLSAgICAgICAgICAgIFN0cmluZyBjaWRCcmFja2V0ID0gJzwnICsgY2lkICsgJz4nOwotICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoZGF0YSwgb2Zmc2V0LCBsZW4sICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSk7Ci0gICAgICAgICAgICBhdHRhY2htZW50cy5wdXQoY2lkQnJhY2tldCwgQXR0YWNobWVudEJsb2NrLmZyb21EYXRhSGFuZGxlcihjaWRCcmFja2V0LGRoKSk7Ci0gICAgICAgICAgICBhZGRUb01lc3NhZ2VDb250ZXh0KGNpZEJyYWNrZXQsIGRoKTsKLSAgICAgICAgICAgIGlmKG10b21DYWxsYmFjayAhPSBudWxsKQotICAgICAgICAgICAgICAgIG10b21DYWxsYmFjay5hZGRlZE10b21BdHRhY2htZW50KGNpZEJyYWNrZXQsIGRoLCBlbGVtZW50TmFtZXNwYWNlLCBlbGVtZW50TG9jYWxOYW1lKTsKLSAgICAgICAgICAgIGlzWG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGNpZCA9ICJjaWQ6IitjaWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNpZDsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBBdHRhY2htZW50TWFyc2hhbGxlciNhZGRTd2FSZWZBdHRhY2htZW50KERhdGFIYW5kbGVyKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYWRkU3dhUmVmQXR0YWNobWVudChEYXRhSGFuZGxlciBkYXRhKSB7Ci0gICAgICAgIFN0cmluZyBjaWQgPSBlbmNvZGVDaWQobnVsbCk7Ci0gICAgICAgIGlmKGNpZCAhPSBudWxsKXsKLSAgICAgICAgICAgIFN0cmluZyBjaWRCcmFja2V0ID0gJzwnICsgY2lkICsgJz4nOwotICAgICAgICAgICAgYXR0YWNobWVudHMucHV0KGNpZEJyYWNrZXQsIEF0dGFjaG1lbnRCbG9jay5mcm9tRGF0YUhhbmRsZXIoIjwiK2NpZCsiPiIsIGRhdGEpKTsKLSAgICAgICAgICAgIGFkZFRvTWVzc2FnZUNvbnRleHQoY2lkQnJhY2tldCwgZGF0YSk7Ci0gICAgICAgICAgICBpc1hvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgY2lkID0gImNpZDoiK2NpZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2lkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUb01lc3NhZ2VDb250ZXh0KFN0cmluZyBjaWQsIERhdGFIYW5kbGVyIGRoKXsKLSAgICAgICAgaWYoaGMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3R4dCA9IGhjLmdldE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGlmKGN0eHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlsLmFkZE1lc3NhZ2VBdHRhY2htZW50KGN0eHQsIGNpZCwgZGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIG5zCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZUNpZChTdHJpbmcgbnMpewotICAgICAgICBTdHJpbmcgY2lkPSJleGFtcGxlLmpheHdzLnN1bi5jb20iOwotICAgICAgICBTdHJpbmcgbmFtZSA9IFVVSUQucmFuZG9tVVVJRCgpKyJAIjsKLSAgICAgICAgaWYobnMgIT0gbnVsbCAmJiAobnMubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFVSSSB1cmkgPSBuZXcgVVJJKG5zKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IHVyaS50b1VSTCgpLmdldEhvc3QoKTsKLSAgICAgICAgICAgICAgICBjaWQgPSBob3N0OwotICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjaWQgPSBVUkxFbmNvZGVyLmVuY29kZShucywgIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWUgKyBjaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIG1hcnNoYWxsaW5nIGFueSBkYXRhLgotICAgICAqIEBwYXJhbSBhdHRhY2htZW50cyBSZWZlcmVuY2UgdG8gTWFwIGZyb20gSW50ZXJuYWxNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXR0YWNobWVudHMoTWFwPFN0cmluZywgQXR0YWNobWVudEJsb2NrPiBhdHRhY2htZW50cyl7Ci0gICAgICAgIHRoaXMuYXR0YWNobWVudHMgPSBhdHRhY2htZW50czsKLSAgICAgICAgaXNYb3BwZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ29udGF4dChIYW5kbGVyQ29udGV4dCBoYyl7Ci0gICAgICAgIHRoaXMuaGMgPSBoYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBYb3BwZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWG9wcGVkKCkgewotICAgICAgICByZXR1cm4gaXNYb3BwZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TXRvbVRocmVzaG9sZFZhbHVlKEludGVnZXIgbXRvbVRocmVzaG9sZFZhbHVlKSB7Ci0gICAgICAgIGlmKChtdG9tVGhyZXNob2xkVmFsdWUgIT0gbnVsbCkgJiYgKG10b21UaHJlc2hvbGRWYWx1ZSA+PTApKQotICAgICAgICAgICAgdGhpcy5tdG9tVGhyZXNob2xkVmFsdWUgPSBtdG9tVGhyZXNob2xkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TXRvbUNhbGxiYWNrKE10b21DYWxsYmFjayBtdG9tQ2FsbGJhY2spewotICAgICAgICB0aGlzLm10b21DYWxsYmFjayA9IG10b21DYWxsYmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE10b21DYWxsYmFjayBtdG9tQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzWE9QOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1hvcHBlZDsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF0dGFjaG1lbnRCbG9jaz4gYXR0YWNobWVudHM7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyQ29udGV4dCBoYzsKLSAgICBwcml2YXRlIGludCBtdG9tVGhyZXNob2xkVmFsdWUgPSAxMDAwOwotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9KQVhXU0F0dGFjaG1lbnRVbm1hcnNoYWxsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL0pBWFdTQXR0YWNobWVudFVubWFyc2hhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2I4OTY0Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL0pBWFdTQXR0YWNobWVudFVubWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5BdHRhY2htZW50QmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5BU0NJSVV0aWxpdHk7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudFVubWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi0vKioKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKgotICogQXR0YWNobWVudFVubWFyc2hhbGxlciwgd2lsbCBiZSBjYWxsZWQgYnkgamF4YiB1bm1hcnNoYWxsZXIgdG8gcHJvY2VzcyB4b3AgcGFja2FnZS4KLSAqLwotcHVibGljIGNsYXNzIEpBWFdTQXR0YWNobWVudFVubWFyc2hhbGxlciBleHRlbmRzIEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgewotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgSkFYV1NBdHRhY2htZW50VW5tYXJzaGFsbGVyKCl7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2lkCi0gICAgICogQHJldHVybiBhIDxjb2RlPkRhdGFIYW5kbGVyPC9jb2RlPiBmb3IgdGhlIGF0dGFjaG1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YUhhbmRsZXIgZ2V0QXR0YWNobWVudEFzRGF0YUhhbmRsZXIoU3RyaW5nIGNpZCkgewotICAgICAgICBBdHRhY2htZW50QmxvY2sgYWIgPSBhdHRhY2htZW50cy5nZXQoZGVjb2RlQ2lkKGNpZCkpOwotICAgICAgICBpZihhYiA9PSBudWxsKQotICAgICAgICAgICAgLy9UT0RPIGxvY2FsaXplIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRhY2htZW50IGNvcnJlc3BvbmRpbmcgdG8gIitjaWQrICIgbm90IGZvdW5kISIpOwotICAgICAgICByZXR1cm4gYWIuYXNEYXRhSGFuZGxlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIGNpZAotICAgICAqIEByZXR1cm4gdGhlIGF0dGFjaG1lbnQgYXMgYSA8Y29kZT5ieXRlW108L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRBdHRhY2htZW50QXNCeXRlQXJyYXkoU3RyaW5nIGNpZCkgewotICAgICAgICBBdHRhY2htZW50QmxvY2sgYWIgPSBhdHRhY2htZW50cy5nZXQoZGVjb2RlQ2lkKGNpZCkpOwotICAgICAgICBpZihhYiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0YWNobWVudCBjb3JyZXNwb25kaW5nIHRvICIrY2lkKyAiIG5vdCBmb3VuZCEiKTsKLSAgICAgICAgcmV0dXJuIGFiLmFzQnl0ZUFycmF5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgWE9QUGFja2FnZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWE9QUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzWE9QOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgWE9QIHBhY2thZ2UgaWYgdGhlIGluY29taW5nIFNPQVAgZW52ZWxvcGUgaXMgYSBYT1AgcGFja2FnZQotICAgICAqIEBwYXJhbSBpc1hPUAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhPUFBhY2thZ2UoYm9vbGVhbiBpc1hPUCl7Ci0gICAgICAgIHRoaXMuaXNYT1AgPSBpc1hPUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbWFyc2hhbGxpbmcgYW55IGRhdGEuCi0gICAgICogQHBhcmFtIGF0dGFjaG1lbnRzIFJlZmVyZW5jZSB0byBNYXAgZnJvbSBJbnRlcm5hbE1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRhY2htZW50cyhNYXA8U3RyaW5nLCBBdHRhY2htZW50QmxvY2s+IGF0dGFjaG1lbnRzKXsKLSAgICAgICAgdGhpcy5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIGNpZAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZWNvZGVDaWQoU3RyaW5nIGNpZCl7Ci0gICAgICAgIGlmKGNpZC5zdGFydHNXaXRoKCJjaWQ6IikpCi0gICAgICAgICAgICBjaWQgPSBjaWQuc3Vic3RyaW5nKDQsIGNpZC5sZW5ndGgoKSk7Ci0vLyAgICAgICAgdHJ5IHsgICAgICAgLy8gQWRkZWQgZml4IGZvciBDUiA2NDU2NDQyCi0gICAgICAgICAgICAvL3JldHVybiAiPCIrVVJMRGVjb2Rlci5kZWNvZGUoY2lkLCAiVVRGLTgiKSsiPiI7Ci0gICAgICAgICAgICByZXR1cm4gIjwiK2NpZCsiPiI7Ci0vLyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotLy8gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF0dGFjaG1lbnRCbG9jaz4gYXR0YWNobWVudHM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzWE9QOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvTWltZUNvZGVjLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9NaW1lQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ4MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvTWltZUNvZGVjLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZzsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLnV0aWwuT3V0cHV0VXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db250ZW50VHlwZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCisvKioKKyAqIHtAbGluayBDb2RlY31zIHRoYXQgdXNlcyB0aGUgTUlNRSBtdWx0aXBhcnQgYXMgdGhlIHVuZGVybHlpbmcgZm9ybWF0LgorICoKKyAqIDxwPgorICogV2hlbiB0aGUgcnVudGltZSBuZWVkcyB0byBkeW5hbWljYWxseSBjaG9vc2UgYSB7QGxpbmsgQ29kZWN9LCBhbmQKKyAqIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUge0BsaW5rIENvZGVjfXMgdGhhdCB1c2UgTUlNRSBtdWx0aXBhcnQsCisgKiBpdCBpcyBvZnRlbiBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgcmlnaHQge0BsaW5rIENvZGVjfSB1bmxlc3MKKyAqIHlvdSBwYXJzZSB0aGUgbXVsdGlwYXJ0IG1lc3NhZ2UgdG8gc29tZSBleHRlbnQuCisgKgorICogPHA+CisgKiBCeSBoYXZpbmcgYWxsIHN1Y2gge0BsaW5rIENvZGVjfXMgZXh0ZW5kaW5nIGZyb20gdGhpcyBjbGFzcywKKyAqIHRoZSAic25pZmZlciIgY2FuIGRlY29kZSBhIG11bHRpcGFydCBtZXNzYWdlIHBhcnRpYWxseSwgYW5kIHRoZW4KKyAqIHBhc3MgdGhlIHBhcnRpYWwgcGFyc2UgcmVzdWx0IHRvIHRoZSB1bHRpbWF0ZWx5LXJlc3BvbnNpYmxlIHtAbGluayBDb2RlY30uCisgKiBUaGlzIGltcHJvdmVzIHRoZSBwZXJmb3JtYW5jZS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2Fic3RyYWN0IGNsYXNzIE1pbWVDb2RlYyBpbXBsZW1lbnRzIENvZGVjIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlRfUkVMQVRFRF9NSU1FX1RZUEUgPSAibXVsdGlwYXJ0L3JlbGF0ZWQiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgYm91bmRhcnk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUNvbnRlbnRUeXBlOworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNBdHRhY2htZW50czsKKyAgICBwcm90ZWN0ZWQgQ29kZWMgcm9vdENvZGVjOworICAgIHByb3RlY3RlZCBmaW5hbCBTT0FQVmVyc2lvbiB2ZXJzaW9uOworCisgICAgcHJvdGVjdGVkIE1pbWVDb2RlYyhTT0FQVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE1VTFRJUEFSVF9SRUxBVEVEX01JTUVfVFlQRTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBwcmVlbmNvZGUgU3RyaW5nIGxpdGVyYWxzIHRvIGJ5dGVbXSBzbyB0aGF0IHRoZXkgZG9uJ3QgaGF2ZSB0bworICAgIC8vIGdvIHRocm91Z2ggY2hhcltdLT5ieXRlW10gY29udmVyc2lvbiBhdCBydW50aW1lLgorICAgIHB1YmxpYyBDb250ZW50VHlwZSBlbmNvZGUoUGFja2V0IHBhY2tldCwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBwYWNrZXQuZ2V0TWVzc2FnZSgpOworICAgICAgICBpZiAobXNnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc0F0dGFjaG1lbnRzKSB7CisgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4oIi0tIitib3VuZGFyeSwgb3V0KTsKKyAgICAgICAgICAgIE91dHB1dFV0aWwud3JpdGVsbigiQ29udGVudC1UeXBlOiAiICsgcm9vdENvZGVjLmdldE1pbWVUeXBlKCksIG91dCk7CisgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4ob3V0KTsKKyAgICAgICAgfQorICAgICAgICBDb250ZW50VHlwZSBwcmltYXJ5Q3QgPSByb290Q29kZWMuZW5jb2RlKHBhY2tldCwgb3V0KTsKKworICAgICAgICBpZiAoaGFzQXR0YWNobWVudHMpIHsKKyAgICAgICAgICAgIE91dHB1dFV0aWwud3JpdGVsbihvdXQpOworICAgICAgICAgICAgLy8gRW5jb2RlIGFsbCB0aGUgYXR0Y2htZW50cworICAgICAgICAgICAgZm9yIChBdHRhY2htZW50IGF0dCA6IG1zZy5nZXRBdHRhY2htZW50cygpKSB7CisgICAgICAgICAgICAgICAgT3V0cHV0VXRpbC53cml0ZWxuKCItLSIrYm91bmRhcnksIG91dCk7CisgICAgICAgICAgICAgICAgLy9TQUFKJ3MgQXR0YWNobWVudFBhcnQuZ2V0Q29udGVudElkKCkgcmV0dXJucyBjb250ZW50IGlkIGFscmVhZHkgZW5jbG9zZWQgd2l0aAorICAgICAgICAgICAgICAgIC8vYW5nbGUgYnJhY2tldHMuIEZvciBub3cgcHV0IGFuZ2xlIGJyYWNrZXQgb25seSBpZiBpdHMgbm90IHRoZXJlCisgICAgICAgICAgICAgICAgU3RyaW5nIGNpZCA9IGF0dC5nZXRDb250ZW50SWQoKTsKKyAgICAgICAgICAgICAgICBpZihjaWQgIT0gbnVsbCAmJiBjaWQubGVuZ3RoKCkgPjAgJiYgY2lkLmNoYXJBdCgwKSAhPSAnPCcpCisgICAgICAgICAgICAgICAgICAgIGNpZCA9ICc8JyArIGNpZCArICc+JzsKKyAgICAgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4oIkNvbnRlbnQtSWQ6IiArIGNpZCwgb3V0KTsKKyAgICAgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4oIkNvbnRlbnQtVHlwZTogIiArIGF0dC5nZXRDb250ZW50VHlwZSgpLCBvdXQpOworICAgICAgICAgICAgICAgIE91dHB1dFV0aWwud3JpdGVsbigiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5Iiwgb3V0KTsKKyAgICAgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4ob3V0KTsgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIFxyXG4KKyAgICAgICAgICAgICAgICBhdHQud3JpdGVUbyhvdXQpOworICAgICAgICAgICAgICAgIE91dHB1dFV0aWwud3JpdGVsbihvdXQpOyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgXHJcbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgT3V0cHV0VXRpbC53cml0ZUFzQXNjaWkoIi0tIitib3VuZGFyeSwgb3V0KTsKKyAgICAgICAgICAgIE91dHB1dFV0aWwud3JpdGVBc0FzY2lpKCItLSIsIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyBub3QgcmV0dXJpbmcgY29ycmVjdCBtdWx0aXBhcnQvcmVsYXRlZCB0eXBlKG5vIGJvdW5kYXJ5KQorICAgICAgICByZXR1cm4gaGFzQXR0YWNobWVudHMgPyBuZXcgQ29udGVudFR5cGVJbXBsKG1lc3NhZ2VDb250ZW50VHlwZSwgcGFja2V0LnNvYXBBY3Rpb24sIG51bGwpIDogcHJpbWFyeUN0OworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50VHlwZSBnZXRTdGF0aWNDb250ZW50VHlwZShQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gcGFja2V0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaGFzQXR0YWNobWVudHMgPSAhbXNnLmdldEF0dGFjaG1lbnRzKCkuaXNFbXB0eSgpOworCisgICAgICAgIGlmIChoYXNBdHRhY2htZW50cykgeworICAgICAgICAgICAgYm91bmRhcnkgPSAidXVpZDoiICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBib3VuZGFyeVBhcmFtZXRlciA9ICJib3VuZGFyeT1cIiIgKyBib3VuZGFyeSArICJcIiI7CisgICAgICAgICAgICAvLyBUT0RPIHVzZSBwcmltYXJ5RW5jb2RlciB0byBnZXQgdHlwZQorICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnRUeXBlID0gIE1VTFRJUEFSVF9SRUxBVEVEX01JTUVfVFlQRSArCisgICAgICAgICAgICAgICAgICAgICI7IHR5cGU9XCIiICsgcm9vdENvZGVjLmdldE1pbWVUeXBlKCkgKyAiXCI7ICIgKworICAgICAgICAgICAgICAgICAgICBib3VuZGFyeVBhcmFtZXRlcjsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGVudFR5cGVJbXBsKG1lc3NhZ2VDb250ZW50VHlwZSwgcGFja2V0LnNvYXBBY3Rpb24sIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJvb3RDb2RlYy5nZXRTdGF0aWNDb250ZW50VHlwZShwYWNrZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWltZUNvZGVjKE1pbWVDb2RlYyB0aGF0KSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHRoYXQudmVyc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWNvZGUoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBjb250ZW50VHlwZSwgUGFja2V0IHBhY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWltZU11bHRpcGFydFBhcnNlciBwYXJzZXIgPSBuZXcgTWltZU11bHRpcGFydFBhcnNlcihpbiwgY29udGVudFR5cGUpOworICAgICAgICBkZWNvZGUocGFyc2VyLHBhY2tldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVjb2RlKFJlYWRhYmxlQnl0ZUNoYW5uZWwgaW4sIFN0cmluZyBjb250ZW50VHlwZSwgUGFja2V0IHBhY2tldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSB7QGxpbmsgUGFja2V0fSBmcm9tIGEge0BsaW5rIE1pbWVNdWx0aXBhcnRQYXJzZXJ9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRlY29kZShNaW1lTXVsdGlwYXJ0UGFyc2VyIG1wcCwgUGFja2V0IHBhY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgcHVibGljIGFic3RyYWN0IE1pbWVDb2RlYyBjb3B5KCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9NaW1lTXVsdGlwYXJ0UGFyc2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9NaW1lTXVsdGlwYXJ0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2M2NkMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL01pbWVNdWx0aXBhcnRQYXJzZXIuamF2YQpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nOworCisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldC5Db250ZW50VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldC5JbnRlcm5ldEhlYWRlcnM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUuaW50ZXJuZXQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW0uU3RyZWFtQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkFTQ0lJVXRpbGl0eTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkJ5dGVBcnJheUJ1ZmZlcjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFBhcnNlcyBNaW1lIG11bHRpcGFydCBtZXNzYWdlIGludG8gcHJpbWFyeSBwYXJ0IGFuZCBhdHRhY2htZW50IHBhcnRzLiBJdAorICogcGFyc2VzIHRoZSBzdHJlYW0gbGF6aWx5IGFzIGFuZCB3aGVuIHJlcXVpcmVkLgorICoKKyAqIFRPRE8gbmVlZCBhIGxpc3QgdG8ga2VlcCBhbGwgdGhlIGF0dGFjaG1lbnRzIHNvIHRoYXQgZXZlbiBpZiBDb250ZW50LUlkIGlzCisgKiBub3QgdGhlcmUgaXQgaXMgYWNjb3VudGVkCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNaW1lTXVsdGlwYXJ0UGFyc2VyIHsKKworICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW47CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RhcnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYm91bmRhcnlCeXRlczsKKworICAgIHByaXZhdGUgZmluYWwgQml0U2V0IGxhc3RQYXJ0Rm91bmQgPSBuZXcgQml0U2V0KDEpOworICAgIC8vIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uLCBzZXQgdG8gLTEgb24gRU9GCisgICAgcHJpdmF0ZSBpbnQgYiA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBiY3MgPSBuZXcgaW50WzI1Nl07CisgICAgcHJpdmF0ZSBpbnRbXSBnc3M7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKKyAgICBwcml2YXRlIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisgICAgcHJpdmF0ZSBieXRlW10gcHJldkJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RQYXJ0ID0gdHJ1ZTsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyZWFtQXR0YWNobWVudD4gYXR0YWNobWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmVhbUF0dGFjaG1lbnQ+KCk7CisgICAgcHJpdmF0ZSBTdHJlYW1BdHRhY2htZW50IHJvb3Q7CisKKyAgICBwcml2YXRlIGludCBjaWRDb3VudGVyID0gMDsKKworICAgIHB1YmxpYyBNaW1lTXVsdGlwYXJ0UGFyc2VyKElucHV0U3RyZWFtIGluLCBTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbnRlbnRUeXBlIGN0ID0gbmV3IENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgIFN0cmluZyBib3VuZGFyeSA9IGN0LmdldFBhcmFtZXRlcigiYm91bmRhcnkiKTsKKyAgICAgICAgICAgIGlmIChib3VuZGFyeSA9PSBudWxsIHx8IGJvdW5kYXJ5LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTUlNRSBib3VuZGFyeSBwYXJhbWV0ZXIgbm90IGZvdW5kIiArIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBibmQgPSAiLS0iICsgYm91bmRhcnk7CisgICAgICAgICAgICBib3VuZGFyeUJ5dGVzID0gQVNDSUlVdGlsaXR5LmdldEJ5dGVzKGJuZCk7CisgICAgICAgICAgICBzdGFydCA9IGN0LmdldFBhcmFtZXRlcigic3RhcnQiKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICAvL0lucHV0U3RyZWFtIE1VU1Qgc3VwcG9ydCBtYXJrKCkKKyAgICAgICAgaWYgKCFpbi5tYXJrU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHRoaXMuaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmluID0gaW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHN0cmVhbSBhbmQgcmV0dXJucyB0aGUgcm9vdCBwYXJ0LiBJZiBzdGFydCBwYXJhbWV0ZXIgaXMKKyAgICAgKiBwcmVzZW50IGluIENvbnRlbnQtVHlwZSwgaXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJvb3QgcGFydCwgb3RoZXJ3aXNlCisgICAgICogcm9vdCBwYXJ0IGlzIHRoZSBmaXJzdCBwYXJ0LgorICAgICAqCisgICAgICogQHJldHVybiBTdHJlYW1BdHRhY2htZW50IGZvciByb290IHBhcnQKKyAgICAgKiAgICAgICAgIG51bGwgaWYgcm9vdCBwYXJ0IGNhbm5vdCBiZSBmb3VuZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBTdHJlYW1BdHRhY2htZW50IGdldFJvb3RQYXJ0KCkgeworICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcm9vdDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSghbGFzdEJvZHlQYXJ0Rm91bmQoKSAmJiAoYiAhPSAtMSkgJiYgcm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICBnZXROZXh0UGFydCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgZW50aXJlIHN0cmVhbSBhbmQgcmV0dXJucyBhbGwgTUlNRSBwYXJ0cyBleGNlcHQgcm9vdCBNSU1FIHBhcnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1hcDxTdHJpbmcsIFN0cmVhbUF0dGFjaG1lbnQ+IGZvciBhbGwgYXR0YWNobWVudCBwYXJ0cworICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBNYXA8U3RyaW5nLCBTdHJlYW1BdHRhY2htZW50PiBnZXRBdHRhY2htZW50UGFydHMoKSB7CisgICAgICAgIHdoaWxlKCFsYXN0Qm9keVBhcnRGb3VuZCgpICYmIChiICE9IC0xKSkgeworICAgICAgICAgICAgZ2V0TmV4dFBhcnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXR0YWNobWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBnZXQgYSBtYXRjaGluZyBNSU1FIGF0dGFjaG1lbnQgcGFydCBmb3IgdGhlCisgICAgICogZ2l2ZW4gY29udGVudElkLiBJdCBwYXJzZXMgdGhlIHN0cmVhbSB1bnRpbCBpdCBmaW5kcyBhIG1hdGNoaW5nIHBhcnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmVhbUF0dGFjaG1lbnQgYXR0YWNobWVudCBmb3IgY29udGVudElkCisgICAgICogICAgICAgICBudWxsIGlmIHRoZXJlIGlzIG5vIGF0dGFjaG1lbnQgZm9yIGNvbnRlbnRJZAorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgU3RyZWFtQXR0YWNobWVudCBnZXRBdHRhY2htZW50UGFydChTdHJpbmcgY29udGVudElkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL2ZpcnN0IHNlZSBpZiB0aGlzIGF0dGFjaG1lbnQgaXMgYWxyZWFkeSBwYXJzZWQsIGlmIHNvIHJldHVybiBpdAorICAgICAgICBTdHJlYW1BdHRhY2htZW50IHN0cmVhbUF0dGFjaCA9IGF0dGFjaG1lbnRzLmdldChjb250ZW50SWQpOworICAgICAgICBpZiAoc3RyZWFtQXR0YWNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW1BdHRhY2g7CisgICAgICAgIH0KKyAgICAgICAgLy9lbHNlIHBhcnNlIHRoZSBNSU1FIHBhcnRzIHRpbGwgd2UgZ2V0IHdoYXQgd2Ugd2FudAorICAgICAgICB3aGlsZSAoIWxhc3RCb2R5UGFydEZvdW5kKCkgJiYgKGIgIT0gLTEpKSB7CisgICAgICAgICAgICBzdHJlYW1BdHRhY2ggPSBnZXROZXh0UGFydCgpOworICAgICAgICAgICAgU3RyaW5nIG5ld0NvbnRlbnRJZCA9IHN0cmVhbUF0dGFjaC5nZXRDb250ZW50SWQoKTsKKyAgICAgICAgICAgIGlmIChuZXdDb250ZW50SWQgIT0gbnVsbCAmJiBuZXdDb250ZW50SWQuZXF1YWxzKGNvbnRlbnRJZCkpeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1BdHRhY2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7ICAgICAgICAgICAgLy8gQXR0YWNobWVudCBpcyBub3QgZm91bmQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBuZXh0IGF2YWlsYWJsZSBNSU1FIHBhcnQuIFRoaXMgc2hvdWxkbid0CisgICAgICogYmUgY2FsbGVkIGlmIHRoZXJlIGFyZSBubyBNSU1FIHBhcnRzIGluIHRoZSBzdHJlYW0uIEF0dGFjaG1lbnQKKyAgICAgKiBwYXJ0KG5vdCByb290IHBhcnQpIGlzIGNhY2hlZCBpbiB0aGUge0BsaW5rIE1hcH08e0BsaW5rIFN0cmluZ30se0BsaW5rIFN0cmVhbUF0dGFjaG1lbnR9PgorICAgICAqIGJlZm9yZSByZXR1cm5pbmcgdGhlIE1JTUUgcGFydC4gSXQgYWxzbyBmaW5kcyB0aGUgcm9vdCBwYXJ0IG9mIHRoZSBNSU1FCisgICAgICogcGFja2FnZSBhbmQgYXNzaWducyByb290IHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJlYW1BdHRhY2htZW50IG5leHQgYXZhaWxhYmxlIE1JTUUgcGFydAorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJlYW1BdHRhY2htZW50IGdldE5leHRQYXJ0KCkgeworICAgICAgICBhc3NlcnQgIWxhc3RCb2R5UGFydEZvdW5kKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaXJzdFBhcnQpIHsKKyAgICAgICAgICAgICAgICBjb21waWxlQm91bmRhcnlQYXR0ZXJuKCk7CisgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgZmlyc3QgYm91bmRhcnkgb2YgdGhlIE1JTUUgcGFja2FnZQorICAgICAgICAgICAgICAgIGlmICghc2tpcFByZWFtYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIk1pc3NpbmcgU3RhcnQgQm91bmRhcnksIG9yIGJvdW5kYXJ5IGRvZXMgbm90IHN0YXJ0IG9uIGEgbmV3IGxpbmUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbnRlcm5ldEhlYWRlcnMgaWggPSBuZXcgSW50ZXJuZXRIZWFkZXJzKGluKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IGloLmdldEhlYWRlcigiY29udGVudC10eXBlIik7CisgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSAoY29udGVudFR5cGVzICE9IG51bGwpID8gY29udGVudFR5cGVzWzBdIDogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgICAgICAgICBTdHJpbmcgW10gY29udGVudElkcyA9IGloLmdldEhlYWRlcigiY29udGVudC1pZCIpOworICAgICAgICAgICAgU3RyaW5nIG1pbWVDb250ZW50SWQgPSAoY29udGVudElkcyAhPSBudWxsKSA/IGNvbnRlbnRJZHNbMF0gOiBudWxsOworICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRJZCA9IG1pbWVDb250ZW50SWQ7CisgICAgICAgICAgICBpZihtaW1lQ29udGVudElkIT1udWxsICYmIG1pbWVDb250ZW50SWQubGVuZ3RoKCk+MikgeworICAgICAgICAgICAgICAgIGlmKGNvbnRlbnRJZC5jaGFyQXQoMCk9PSc8JykgICBjb250ZW50SWQ9bWltZUNvbnRlbnRJZC5zdWJzdHJpbmcoMSxtaW1lQ29udGVudElkLmxlbmd0aCgpLTEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYm9zID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigpOworICAgICAgICAgICAgYiA9IHJlYWRCb2R5KGJvcyk7CisgICAgICAgICAgICBTdHJlYW1BdHRhY2htZW50IGFzID0gbmV3IFN0cmVhbUF0dGFjaG1lbnQoYm9zLCBjb250ZW50SWQsIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgIGlmIChzdGFydCA9PSBudWxsICYmIGZpcnN0UGFydCkgeworICAgICAgICAgICAgICAgIHJvb3QgPSBhczsgICAgICAvLyBUYWtpbmcgZmlyc3QgcGFydCBhcyByb290IHBhcnQKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZUNvbnRlbnRJZCAhPSBudWxsICYmIHN0YXJ0ICE9IG51bGwgJiYgc3RhcnQuZXF1YWxzKG1pbWVDb250ZW50SWQpKSB7CisgICAgICAgICAgICAgICAgcm9vdCA9IGFzOyAgICAgIC8vIHJvb3QgcGFydCBhcyBpZGVudGlmaWVkIGJ5IHN0YXJ0IHBhcmFtZXRlcgorICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50SWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLnB1dChjb250ZW50SWQsIGFzKTsgICAgIC8vIEF0dGFjaG1lbnQgcGFydAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpZENvdW50ZXI7CisgICAgICAgICAgICAgICAgYXR0YWNobWVudHMucHV0KCIiK2NpZENvdW50ZXIsIGFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0UGFydCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGFzOworICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfSBjYXRjaChNZXNzYWdpbmdFeGNlcHRpb24gbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKG1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHJlYWRCb2R5KEJ5dGVBcnJheUJ1ZmZlciBiYW9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWZpbmRNaW1lQm9keShiYW9zKSkgeworICAgICAgICAgICAgLy9UT0RPOiBpMThuCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTWlzc2luZyBib3VuZGFyeSBkZWxpbWl0aWVyICIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBmaW5kTWltZUJvZHkoQnl0ZUFycmF5QnVmZmVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBsID0gYm91bmRhcnlCeXRlcy5sZW5ndGg7CisgICAgICAgIGludCBseCA9IGwgLSAxOworICAgICAgICBpbnQgYnVmZmVyTGVuZ3RoOworICAgICAgICBpbnQgcyA9IDA7CisgICAgICAgIGJ5dGVbXSB0bXA7CisKKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIEJpdFNldCBlb2YgPSBuZXcgQml0U2V0KDEpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbi5tYXJrKGwpOworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIHRtcCA9IHByZXZCdWZmZXI7CisgICAgICAgICAgICAgICAgcHJldkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJMZW5ndGggPSByZWFkTmV4dChpbiwgbCwgZW9mKTsKKworICAgICAgICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGIgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoKHMgPT0gbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHByZXZCdWZmZXIsIDAsIHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IGwpIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBidWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGIgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gbHg7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSAhPSBib3VuZGFyeUJ5dGVzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvIGlmIHMgPT0gMSA6IGl0IG11c3QgYmUgYW4gTEYKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgcyA9PSAyIDogaXQgbXVzdCBiZSBhIENSIExGCisgICAgICAgICAgICAgICAgICAgIGlmIChzIDw9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmxmID0gbmV3IFN0cmluZyhwcmV2QnVmZmVyLCAwLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIlxuIi5lcXVhbHMoY3JsZikgJiYgISJcclxuIi5lcXVhbHMoY3JsZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb3VuZGFyeSBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHBhcnQgQm9keSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgYSBwcmVjZWVkaW5nIENSTEYiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmV2QnVmZmVyW3MgLSAyXSA9PSAnXHInKSAmJiAocHJldkJ1ZmZlcltzIC0gMV0gPT0gJ1xuJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUocHJldkJ1ZmZlciwgMCwgcyAtIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2QnVmZmVyW3MgLSAxXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHByZXZCdWZmZXIsIDAsIHMgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm91bmRhcnkgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiBwYXJ0IEJvZHkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRob3V0IGEgcHJlY2VlZGluZyBDUkxGIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhlIGJvdW5kYXJ5LCBza2lwICpMV1NQLWNoYXIgYW5kIENSTEYKKyAgICAgICAgICAgICAgICBpZiAoIXNraXBMV1NQQW5kQ1JMRihpbikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAvLyAgICJCb3VuZGFyeSBkb2VzIG5vdCB0ZXJtaW5hdGUgd2l0aCBDUkxGIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHMgPiAwKSkgeworICAgICAgICAgICAgICAgIGlmIChwcmV2QnVmZmVyW3MgLSAxXSA9PSAoYnl0ZSkgMTMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYnVmZmVyWzBdID09IChieXRlKTEwCisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJbMF0gPT0gKGJ5dGUpIDEwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGx4IC0gMTsgaiA+IDA7IGotLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJbaiArIDFdICE9IGJvdW5kYXJ5Qnl0ZXNbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZWQgdGhlIGJvdW5kYXJ5Qnl0ZXMgZXhjbHVkaW5nIHRoZSBsYXN0IGNoYXIgb2YgdGhlIGJvdW5kYXJ5Qnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBkb250IHdyaXRlIHRoZSBDUiBpbnRvIHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShwcmV2QnVmZmVyLCAwLCBzIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShwcmV2QnVmZmVyLCAwLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShwcmV2QnVmZmVyLCAwLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShwcmV2QnVmZmVyLCAwLCBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMgPSBNYXRoLm1heChpICsgMSAtIGJjc1tidWZmZXJbaV0gJiAweDdmXSwgZ3NzW2ldKTsKKyAgICAgICAgICAgIGluLnJlc2V0KCk7CisgICAgICAgICAgICBpbi5za2lwKHMpOworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBib29sZWFuIGxhc3RCb2R5UGFydEZvdW5kKCkgeworICAgICAgICByZXR1cm4gbGFzdFBhcnRGb3VuZC5nZXQoMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGVCb3VuZGFyeVBhdHRlcm4oKSB7CisgICAgICAgIGludCBsID0gYm91bmRhcnlCeXRlcy5sZW5ndGg7CisKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBqOworCisgICAgICAgIC8vIENvcGllZCBmcm9tIEoyU0UgMS40IHJlZ2V4IGNvZGUKKyAgICAgICAgLy8gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uamF2YQorCisgICAgICAgIC8vIEluaXRpYWxpc2UgQmFkIENoYXJhY3RlciBTaGlmdCB0YWJsZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICAgICAgICBiY3NbYm91bmRhcnlCeXRlc1tpXV0gPSBpICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluaXRpYWxpc2UgR29vZCBTdWZmaXggU2hpZnQgdGFibGUKKyAgICAgICAgZ3NzID0gbmV3IGludFtsXTsKKworICAgICAgICBORVhUOgorICAgICAgICBmb3IgKGkgPSBsOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAvLyBqIGlzIHRoZSBiZWdpbm5pbmcgaW5kZXggb2Ygc3VmZml4IGJlaW5nIGNvbnNpZGVyZWQKKyAgICAgICAgICAgIGZvciAoaiA9IGwgLSAxOyBqID49IGk7IGotLSkgeworICAgICAgICAgICAgICAgIC8vIFRlc3RpbmcgZm9yIGdvb2Qgc3VmZml4CisgICAgICAgICAgICAgICAgaWYgKGJvdW5kYXJ5Qnl0ZXNbal0gPT0gYm91bmRhcnlCeXRlc1tqIC0gaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRhcnlCeXRlc1tqLi5sZW5dIGlzIGEgZ29vZCBzdWZmaXgKKyAgICAgICAgICAgICAgICAgICAgZ3NzW2ogLSAxXSA9IGk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWF0Y2guIFRoZSBhcnJheSBoYXMgYWxyZWFkeSBiZWVuCisgICAgICAgICAgICAgICAgICAgIC8vIGZpbGxlZCB1cCB3aXRoIGNvcnJlY3QgdmFsdWVzIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgTkVYVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoaiA+IDApIHsKKyAgICAgICAgICAgICAgICBnc3NbLS1qXSA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ3NzW2wgLSAxXSA9IDE7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNraXBQcmVhbWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZmluZEJvdW5kYXJ5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdFBhcnRGb3VuZC5nZXQoMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJGb3VuZCBjbG9zaW5nIGJvdW5kYXJ5IGRlbGltaXRlciB3aGlsZSB0cnlpbmcgdG8gc2tpcCBwcmVhbWJsZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBmaW5kQm91bmRhcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGwgPSBib3VuZGFyeUJ5dGVzLmxlbmd0aDsKKyAgICAgICAgaW50IGx4ID0gbCAtIDE7CisgICAgICAgIEJpdFNldCBlb2YgPSBuZXcgQml0U2V0KDEpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbi5tYXJrKGwpOworICAgICAgICAgICAgcmVhZE5leHQoaW4sIGwsIGVvZik7CisgICAgICAgICAgICBpZiAoZW9mLmdldCgwKSkgeworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IGx4OyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gIT0gYm91bmRhcnlCeXRlc1tpXSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoZSBib3VuZGFyeSwgc2tpcCAqTFdTUC1jaGFyIGFuZCBDUkxGCisgICAgICAgICAgICAgICAgaWYgKCFza2lwTFdTUEFuZENSTEYoaW4pKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJCb3VuZGFyeSBkb2VzIG5vdCB0ZXJtaW5hdGUgd2l0aCBDUkxGIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcyA9IE1hdGgubWF4KGkgKyAxIC0gYmNzW2J1ZmZlcltpXSAmIDB4N2ZdLCBnc3NbaV0pOworICAgICAgICAgICAgaW4ucmVzZXQoKTsKKyAgICAgICAgICAgIGluLnNraXAocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcExXU1BBbmRDUkxGKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGIgPSBpcy5yZWFkKCk7CisgICAgICAgIC8vbG9va3MgbGlrZSBvbGQgaW1wbCBhbGxvd2VkIGp1c3QgYSBcbiBhcyB3ZWxsCisgICAgICAgIGlmIChiID09ICdcbicpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGIgPT0gJ1xyJykgeworICAgICAgICAgICAgYiA9IGlzLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChiID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IHBhZGRpbmcgYWZ0ZXIgYSBNaW1lIEJvdW5kYXJ5ICBzaG91bGQgZW5kIGluIGEgQ1JMRiwgZm91bmQgQ1Igb25seSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGIgPT0gJy0nKSB7CisgICAgICAgICAgICBiID0gaXMucmVhZCgpOworICAgICAgICAgICAgaWYgKGIgIT0gJy0nKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBzaW5ndWxhciAnLScgY2hhcmFjdGVyIGFmdGVyIE1pbWUgQm91bmRhcnkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGFzdFBhcnRGb3VuZC5mbGlwKDApOworICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIG5leHQgY2hhcgorICAgICAgICAgICAgICAgIGIgPSBpcy5yZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoKGIgIT0gLTEpICYmICgoYiA9PSAnICcpIHx8IChiID09ICdcdCcpKSkgeworICAgICAgICAgICAgYiA9IGlzLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChiID09ICdccicpIHsKKyAgICAgICAgICAgICAgICBiID0gaXMucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChiID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGIgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIHRoZSBsYXN0IGJvdW5kYXJ5IG5lZWQgbm90IGhhdmUgQ1JMRgorICAgICAgICAgICAgaWYgKCFsYXN0UGFydEZvdW5kLmdldCgwKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVuZCBvZiBNdWx0aXBhcnQgU3RyZWFtIGJlZm9yZSBlbmNvdW50ZXJpbmcgIGNsb3NpbmcgYm91bmRhcnkgZGVsaW1pdGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKyAgICBwcml2YXRlIGludCByZWFkTmV4dChJbnB1dFN0cmVhbSBpcywgaW50IHBhdHRlcm5MZW5ndGgsIEJpdFNldCBlb2YpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBidWZmZXJMZW5ndGggPSBpcy5yZWFkKGJ1ZmZlciwgMCwgcGF0dGVybkxlbmd0aCk7CisgICAgICAgIGlmIChidWZmZXJMZW5ndGggPT0gLTEpIHsKKyAgICAgICAgICAgIGVvZi5mbGlwKDApOworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlckxlbmd0aCA8IHBhdHRlcm5MZW5ndGgpIHsKKyAgICAgICAgICAgIC8vcmVwZWF0ZWRseSByZWFkIHBhdHRlcm5MZW5ndGggLSBidWZmZXJMZW5ndGgKKyAgICAgICAgICAgIGludCB0ZW1wIDsKKyAgICAgICAgICAgIGludCBpID0gYnVmZmVyTGVuZ3RoOworICAgICAgICAgICAgZm9yICg7IGkgPCBwYXR0ZXJuTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gaXMucmVhZCgpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGVvZi5mbGlwKDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gKGJ5dGUpIHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJMZW5ndGggPSBpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXJMZW5ndGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvTXRvbUNvZGVjLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9NdG9tQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTNkNjFiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvTXRvbUNvZGVjLmphdmEKQEAgLTAsMCArMSw1NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZzsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5EYXRhdHlwZUNvbnZlcnRlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLm91dHB1dC5FbmNvZGVkOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLnV0aWwuT3V0cHV0VXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db250ZW50VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5TdHJlYW1TT0FQQ29kZWM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLk1pbWVBdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtLlN0cmVhbUF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CeXRlQXJyYXlEYXRhU291cmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhNTFN0cmVhbVJlYWRlckZpbHRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YTUxTdHJlYW1Xcml0ZXJGaWx0ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleC5CYXNlNjREYXRhOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguTmFtZXNwYWNlQ29udGV4dEV4OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguWE1MU3RyZWFtUmVhZGVyRXg7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LnN0YXhleC5YTUxTdHJlYW1Xcml0ZXJFeDsKKworaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NRmVhdHVyZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCisvKioKKyAqIE10b20gbWVzc2dlIENvZGVjLiBJdCBjYW4gYmUgdXNlZCBldmVuIGZvciBub24tc29hcCBtZXNzYWdlJ3MgbXRvbSBlbmNvZGluZy4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgY2xhc3MgTXRvbUNvZGVjIGV4dGVuZHMgTWltZUNvZGVjIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYT1BfWE1MX01JTUVfVFlQRSA9ICJhcHBsaWNhdGlvbi94b3AreG1sIjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyZWFtU09BUENvZGVjIGNvZGVjOworCisgICAgLy8gZW5jb2RpbmcgcmVsYXRlZCBwYXJhbWV0ZXJzCisgICAgcHJpdmF0ZSBTdHJpbmcgYm91bmRhcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc29hcFhvcENvbnRlbnRUeXBlOworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VDb250ZW50VHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIE1UT01GZWF0dXJlIG10b21GZWF0dXJlOworCisgICAgLy9UaGlzIGlzIHRoZSBtdG9tIGF0dGFjaG1lbnQgc3RyZWFtLCB3ZSBzaG91bGQgd3JpdGUgaXQganVzdCBhZnRlciB0aGUgcm9vdCBwYXJ0IGZvciBkZWNvZGVyCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEJ5dGVBcnJheUJ1ZmZlcj4gbXRvbUF0dGFjaG1lbnRTdHJlYW0gPSBuZXcgQXJyYXlMaXN0PEJ5dGVBcnJheUJ1ZmZlcj4oKTsKKworICAgIE10b21Db2RlYyhTT0FQVmVyc2lvbiB2ZXJzaW9uLCBTdHJlYW1TT0FQQ29kZWMgY29kZWMsIFdlYlNlcnZpY2VGZWF0dXJlIG10b21GZWF0dXJlKXsKKyAgICAgICAgc3VwZXIodmVyc2lvbik7CisgICAgICAgIHRoaXMuY29kZWMgPSBjb2RlYzsKKyAgICAgICAgY3JlYXRlQ29udGVUeXBlSGVhZGVyKCk7CisgICAgICAgIHRoaXMuc29hcFhvcENvbnRlbnRUeXBlID0gWE9QX1hNTF9NSU1FX1RZUEUgKyI7Y2hhcnNldD11dGYtODt0eXBlPVwiIit2ZXJzaW9uLmNvbnRlbnRUeXBlKyJcIiI7CisgICAgICAgIGlmKG10b21GZWF0dXJlID09IG51bGwpCisgICAgICAgICAgICB0aGlzLm10b21GZWF0dXJlID0gbmV3IE1UT01GZWF0dXJlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMubXRvbUZlYXR1cmUgPSAoTVRPTUZlYXR1cmUpIG10b21GZWF0dXJlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb250ZVR5cGVIZWFkZXIoKXsKKyAgICAgICAgYm91bmRhcnkgPSAidXVpZDoiICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIGJvdW5kYXJ5UGFyYW1ldGVyID0gImJvdW5kYXJ5PVwiIiArIGJvdW5kYXJ5ICsiXCIiOworICAgICAgICBtZXNzYWdlQ29udGVudFR5cGUgPSBNVUxUSVBBUlRfUkVMQVRFRF9NSU1FX1RZUEUgKworICAgICAgICAgICAgICAgICI7dHlwZT1cIiIgKyBYT1BfWE1MX01JTUVfVFlQRSArICJcIjsiICsKKyAgICAgICAgICAgICAgICBib3VuZGFyeVBhcmFtZXRlciArCisgICAgICAgICAgICAgICAgIjtzdGFydC1pbmZvPVwiIiArIHZlcnNpb24uY29udGVudFR5cGUgKyAiXCIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc29hcCAxLjEgYW5kIHNvYXAgMS4yIHNwZWNpZmljIFhPUCBwYWNrYWdlZCBDb250ZW50VHlwZQorICAgICAqCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIGNvbnRlbnQgdHlwZSBmb3Igc29hcDExIG9yIHNvYXAgMS4yIGNvbnRlbnQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBDb250ZW50VHlwZSBnZXRTdGF0aWNDb250ZW50VHlwZShQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIHJldHVybiBnZXRDb250ZW50VHlwZShwYWNrZXQpOworICAgIH0KKworICAgIHByaXZhdGUgQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoUGFja2V0IHBhY2tldCl7CisgICAgICAgIHN3aXRjaCh2ZXJzaW9uKXsKKyAgICAgICAgICAgIGNhc2UgU09BUF8xMToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRUeXBlSW1wbChtZXNzYWdlQ29udGVudFR5cGUsIChwYWNrZXQuc29hcEFjdGlvbiA9PSBudWxsKT8iIjpwYWNrZXQuc29hcEFjdGlvbiwgbnVsbCk7CisgICAgICAgICAgICBjYXNlIFNPQVBfMTI6CisgICAgICAgICAgICAgICAgaWYocGFja2V0LnNvYXBBY3Rpb24gIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50VHlwZSArPSAiO2FjdGlvbj1cIiIrcGFja2V0LnNvYXBBY3Rpb24rIlwiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50VHlwZUltcGwobWVzc2FnZUNvbnRlbnRUeXBlLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICAvL25ldmVyIGhhcHBlbnMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENvbnRlbnRUeXBlIGVuY29kZShQYWNrZXQgcGFja2V0LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL2dldCB0aGUgY3VycmVudCBib3VuZGFyeSB0aGFhdCB3aWxsIGJlIHJlYXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCisgICAgICAgIG10b21BdHRhY2htZW50U3RyZWFtLmNsZWFyKCk7CisgICAgICAgIENvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUocGFja2V0KTsKKworICAgICAgICBpZihwYWNrZXQuZ2V0TWVzc2FnZSgpICE9IG51bGwpeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4oIi0tIitib3VuZGFyeSwgb3V0KTsKKyAgICAgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4oIkNvbnRlbnQtVHlwZTogIisgc29hcFhvcENvbnRlbnRUeXBlLCAgb3V0KTsKKyAgICAgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4oIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeSIsIG91dCk7CisgICAgICAgICAgICAgICAgT3V0cHV0VXRpbC53cml0ZWxuKG91dCk7CisgICAgICAgICAgICAgICAgTXRvbVN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgTXRvbVN0cmVhbVdyaXRlcihYTUxTdHJlYW1Xcml0ZXJGYWN0b3J5LmNyZWF0ZShvdXQpLG91dCk7CisgICAgICAgICAgICAgICAgcGFja2V0LmdldE1lc3NhZ2UoKS53cml0ZVRvKHdyaXRlcik7CisgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeS5yZWN5Y2xlKHdyaXRlcik7CisgICAgICAgICAgICAgICAgT3V0cHV0VXRpbC53cml0ZWxuKG91dCk7CisKKyAgICAgICAgICAgICAgICBmb3IoQnl0ZUFycmF5QnVmZmVyIGJvcyA6IG10b21BdHRhY2htZW50U3RyZWFtKXsKKyAgICAgICAgICAgICAgICAgICAgYm9zLndyaXRlKG91dCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9ub3cgd3JpdGUgb3V0IHRoZSBhdHRhY2htZW50cyBpbiB0aGUgbWVzc2FnZQorICAgICAgICAgICAgICAgIHdyaXRlQXR0YWNobWVudHMocGFja2V0LmdldE1lc3NhZ2UoKS5nZXRBdHRhY2htZW50cygpLG91dCk7CisKKyAgICAgICAgICAgICAgICAvL3dyaXRlIG91dCB0aGUgZW5kIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgT3V0cHV0VXRpbC53cml0ZUFzQXNjaWkoIi0tIitib3VuZGFyeSwgb3V0KTsKKyAgICAgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlQXNBc2NpaSgiLS0iLCBvdXQpOworCisgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vbm93IGNyZWF0ZSB0aGUgYm91bmRhcnkgZm9yIG5leHQgZW5jb2RlKCkgY2FsbAorICAgICAgICBjcmVhdGVDb250ZVR5cGVIZWFkZXIoKTsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQnl0ZUFycmF5QnVmZmVyeworICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudElkOworCisgICAgICAgIHByaXZhdGUgRGF0YUhhbmRsZXIgZGg7CisKKyAgICAgICAgQnl0ZUFycmF5QnVmZmVyKEBOb3ROdWxsIERhdGFIYW5kbGVyIGRoKSB7CisgICAgICAgICAgICB0aGlzLmRoID0gZGg7CisgICAgICAgICAgICB0aGlzLmNvbnRlbnRJZCA9IGVuY29kZUNpZCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvL2J1aWxkIGF0dGFjaG1lbnQgZnJhbWUKKyAgICAgICAgICAgIE91dHB1dFV0aWwud3JpdGVsbigiLS0iK2JvdW5kYXJ5LCBvcyk7CisgICAgICAgICAgICB3cml0ZU1pbWVIZWFkZXJzKGRoLmdldENvbnRlbnRUeXBlKCksIGNvbnRlbnRJZCwgb3MpOworICAgICAgICAgICAgZGgud3JpdGVUbyhvcyk7CisgICAgICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4ob3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWltZUhlYWRlcnMoU3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJpbmcgY29udGVudElkLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4oIkNvbnRlbnQtVHlwZTogIiArIGNvbnRlbnRUeXBlLCBvdXQpOworICAgICAgICBTdHJpbmcgY2lkID0gY29udGVudElkOworICAgICAgICBpZihjaWQgIT0gbnVsbCAmJiBjaWQubGVuZ3RoKCkgPjAgJiYgY2lkLmNoYXJBdCgwKSAhPSAnPCcpCisgICAgICAgICAgICBjaWQgPSAnPCcgKyBjaWQgKyAnPic7CisgICAgICAgIE91dHB1dFV0aWwud3JpdGVsbigiQ29udGVudC1JZDogIiArIGNpZCwgb3V0KTsKKyAgICAgICAgT3V0cHV0VXRpbC53cml0ZWxuKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkiLCBvdXQpOworICAgICAgICBPdXRwdXRVdGlsLndyaXRlbG4ob3V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRhY2htZW50cyhBdHRhY2htZW50U2V0IGF0dGFjaG1lbnRzLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IoQXR0YWNobWVudCBhdHQgOiBhdHRhY2htZW50cyl7CisgICAgICAgICAgICAvL2J1aWxkIGF0dGFjaG1lbnQgZnJhbWUKKyAgICAgICAgICAgIE91dHB1dFV0aWwud3JpdGVsbigiLS0iK2JvdW5kYXJ5LCBvdXQpOworICAgICAgICAgICAgd3JpdGVNaW1lSGVhZGVycyhhdHQuZ2V0Q29udGVudFR5cGUoKSwgYXR0LmdldENvbnRlbnRJZCgpLCBvdXQpOworICAgICAgICAgICAgYXR0LndyaXRlVG8ob3V0KTsKKyAgICAgICAgICAgIE91dHB1dFV0aWwud3JpdGVsbihvdXQpOyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgXHJcbgorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbnRlbnRUeXBlIGVuY29kZShQYWNrZXQgcGFja2V0LCBXcml0YWJsZUJ5dGVDaGFubmVsIGJ1ZmZlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRvbUNvZGVjIGNvcHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXRvbUNvZGVjKHZlcnNpb24sIChTdHJlYW1TT0FQQ29kZWMpY29kZWMuY29weSgpLCBtdG9tRmVhdHVyZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlQ2lkKCl7CisgICAgICAgIFN0cmluZyBjaWQ9ImV4YW1wbGUuamF4d3Muc3VuLmNvbSI7CisgICAgICAgIFN0cmluZyBuYW1lID0gVVVJRC5yYW5kb21VVUlEKCkrIkAiOworICAgICAgICByZXR1cm4gbmFtZSArIGNpZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkZWNvZGUoTWltZU11bHRpcGFydFBhcnNlciBtcHAsIFBhY2tldCBwYWNrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHdlJ2QgbGlrZSB0byByZXVzZSB0aG9zZSByZWFkZXIgb2JqZWN0cyBidXQgdW5mb3J0dW5hdGVseSBkZWNvZGVyIG1heSBiZSByZXVzZWQKKyAgICAgICAgLy8gYmVmb3JlIHRoZSBkZWNvZGVkIG1lc3NhZ2UgaXMgY29tcGxldGVseSB1c2VkLgorCisgICAgICAgIFhNTFN0cmVhbVJlYWRlciBtdG9tUmVhZGVyID0gbmV3IE10b21YTUxTdHJlYW1SZWFkZXJFeCggbXBwLAorICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5jcmVhdGUobnVsbCwgbXBwLmdldFJvb3RQYXJ0KCkuYXNJbnB1dFN0cmVhbSgpLCB0cnVlKQorICAgICAgICApOworCisgICAgICAgIC8vVE9ETzogcmVtb3ZlIHRoaXMgY29kZSBhZnRlciB7QGxpbmsgU3RyZWFtU09BUENvZGVjI2RlY29kZX0gaXMgbW9kaWZpZWQgdG8KKyAgICAgICAgLy90YWtlIEF0dGFjaG1lbnRTZXQuCisgICAgICAgIGlmKGNvZGVjIGluc3RhbmNlb2YgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuU3RyZWFtU09BUENvZGVjKXsKKyAgICAgICAgICAgIHBhY2tldC5zZXRNZXNzYWdlKCgoY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuU3RyZWFtU09BUENvZGVjKWNvZGVjKS5kZWNvZGUobXRvbVJlYWRlciwgbmV3IE1pbWVBdHRhY2htZW50U2V0KG1wcCkpKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBwYWNrZXQuc2V0TWVzc2FnZShjb2RlYy5kZWNvZGUobXRvbVJlYWRlcikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBNdG9tU3RyZWFtV3JpdGVyIGV4dGVuZHMgWE1MU3RyZWFtV3JpdGVyRmlsdGVyIGltcGxlbWVudHMgWE1MU3RyZWFtV3JpdGVyRXggeworICAgICAgICBwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgRW5jb2RlZCBlbmNvZGVkID0gbmV3IEVuY29kZWQoKTsKKworICAgICAgICBwdWJsaWMgTXRvbVN0cmVhbVdyaXRlcihYTUxTdHJlYW1Xcml0ZXIgdywgT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICAgICAgc3VwZXIodyk7CisgICAgICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnQsIGludCBsZW4sIFN0cmluZyBjb250ZW50VHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvL2NoZWNrIHRocmVzaG9sZCBhbmQgaWYgbGVzcyB3cml0ZSBhcyBiYXNlNjRlbmNvZGVkIHZhbHVlCisgICAgICAgICAgICBpZihtdG9tRmVhdHVyZS5nZXRUaHJlc2hvbGQoKSA+IGxlbil7CisgICAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJzKERhdGF0eXBlQ29udmVydGVySW1wbC5fcHJpbnRCYXNlNjRCaW5hcnkoZGF0YSwgc3RhcnQsIGxlbikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBiYWIgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKG5ldyBEYXRhSGFuZGxlcihuZXcgQnl0ZUFycmF5RGF0YVNvdXJjZShkYXRhLCBzdGFydCwgbGVuLCBjb250ZW50VHlwZSkpKTsKKyAgICAgICAgICAgIHdyaXRlQmluYXJ5KGJhYik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShEYXRhSGFuZGxlciBkYXRhSGFuZGxlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBCYXNlNjREYXRhIGRhdGEgID0gbmV3IEJhc2U2NERhdGEoKTsKKyAgICAgICAgICAgIGRhdGEuc2V0KGRhdGFIYW5kbGVyKTsKKyAgICAgICAgICAgIHdyaXRlQmluYXJ5KG5ldyBCeXRlQXJyYXlCdWZmZXIoZGF0YS5nZXREYXRhSGFuZGxlcigpKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHdyaXRlQmluYXJ5KFN0cmluZyBjb250ZW50VHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlUENEQVRBKENoYXJTZXF1ZW5jZSBkYXRhKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZihkYXRhIGluc3RhbmNlb2YgQmFzZTY0RGF0YSl7CisgICAgICAgICAgICAgICAgQmFzZTY0RGF0YSBiaW5hcnlEYXRhID0gKEJhc2U2NERhdGEpZGF0YTsKKyAgICAgICAgICAgICAgICB3cml0ZUJpbmFyeShiaW5hcnlEYXRhLmdldERhdGFIYW5kbGVyKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVycyhkYXRhLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVBcnJheUJ1ZmZlciBiYWIpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbXRvbUF0dGFjaG1lbnRTdHJlYW0uYWRkKGJhYik7CisKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKCIiKTsgICAvLyBGb3JjZSBjb21wbGV0aW9uIG9mIG9wZW4gZWxlbXMKKyAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAvL2ZsdXNoIHRoZSB1bmRlcmx5aW5nIHdyaXRlciB0byB3cml0ZS1vdXQgYW55IGNhY2hlZCBkYXRhIHRvIHRoZSB1bmRlcmx5aW5nCisgICAgICAgICAgICAgICAgLy8gc3RyZWFtIGJlZm9yZSB3cml0aW5nIGRpcmVjdGx5IHRvIGl0CisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgdGhlIHhvcCByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoWE9QX1BSRUYpOworICAgICAgICAgICAgICAgIGVuY29kZWQuc2V0KGJhYi5jb250ZW50SWQpOworICAgICAgICAgICAgICAgIG91dC53cml0ZShlbmNvZGVkLmJ1ZiwwLGVuY29kZWQubGVuKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoWE9QX1NVRkYpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgTXRvbU5hbWVzcGFjZUNvbnRleHRFeCBpbXBsZW1lbnRzIE5hbWVzcGFjZUNvbnRleHRFeCB7CisgICAgICAgICAgICBwcml2YXRlIE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0OworCisgICAgICAgICAgICBwdWJsaWMgTXRvbU5hbWVzcGFjZUNvbnRleHRFeChOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCkgeworICAgICAgICAgICAgICAgIHRoaXMubnNDb250ZXh0ID0gbnNDb250ZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8QmluZGluZz4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnNDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5zQ29udGV4dC5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yIGdldFByZWZpeGVzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnNDb250ZXh0LmdldFByZWZpeGVzKG5hbWVzcGFjZVVSSSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dEV4IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7CisgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCA9IHdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE10b21OYW1lc3BhY2VDb250ZXh0RXgobnNDb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE10b21YTUxTdHJlYW1SZWFkZXJFeCBleHRlbmRzIFhNTFN0cmVhbVJlYWRlckZpbHRlciBpbXBsZW1lbnRzIFhNTFN0cmVhbVJlYWRlckV4IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwYXJzZXIgZm9yIHRoZSBvdXRlciBNSU1FICdzaGVsbCcuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIE1pbWVNdWx0aXBhcnRQYXJzZXIgbWltZU1QOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB4b3BSZWZlcmVuY2VQcmVzZW50ID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgQmFzZTY0RGF0YSBiYXNlNjRBdHREYXRhOworCisgICAgICAgIC8vdmFsdWVzIHRoYXQgd2lsbCBzZXQgdG8gd2hldGhlciBtdG9tIG9yIG5vdCBhcyBjYWxsZXIgY2FuIGNhbGwgZ2V0UGNEYXRhIG9yIGdldFRleHRDaGFyYWN0ZXJzCisgICAgICAgIHByaXZhdGUgaW50IHRleHRMZW5ndGg7CisgICAgICAgIHByaXZhdGUgaW50IHRleHRTdGFydDsKKworICAgICAgICAvL1RvIGJlIHVzZWQgd2l0aCAjZ2V0VGV4dENoYXJhY3RlcnMKKyAgICAgICAgcHJpdmF0ZSBjaGFyW10gYmFzZTY0RW5jb2RlZFRleHQ7CisKKyAgICAgICAgcHVibGljIE10b21YTUxTdHJlYW1SZWFkZXJFeChNaW1lTXVsdGlwYXJ0UGFyc2VyIG1pbWVNUCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgICAgc3VwZXIocmVhZGVyKTsKKyAgICAgICAgICAgIHRoaXMubWltZU1QID0gbWltZU1QOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRQQ0RBVEEoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmKHhvcFJlZmVyZW5jZVByZXNlbnQpeworICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRBdHREYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dEV4IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7CisgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE10b21OYW1lc3BhY2VDb250ZXh0RXgobnNDb250ZXh0KTsKKworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0VHJpbSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIE10b21OYW1lc3BhY2VDb250ZXh0RXggaW1wbGVtZW50cyBOYW1lc3BhY2VDb250ZXh0RXggeworICAgICAgICAgICAgcHJpdmF0ZSBOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dDsKKworICAgICAgICAgICAgcHVibGljIE10b21OYW1lc3BhY2VDb250ZXh0RXgoTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5zQ29udGV4dCA9IG5zQ29udGV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPEJpbmRpbmc+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5zQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuc0NvbnRleHQuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVmaXhlcyhTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5zQ29udGV4dC5nZXRQcmVmaXhlcyhuYW1lc3BhY2VVUkkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7CisgICAgICAgICAgICBpZiAoeG9wUmVmZXJlbmNlUHJlc2VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dExlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dExlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7CisgICAgICAgICAgICAvL1RPRE86IGNoZWNrIGlmIHRoaXMgaXMgY29ycmVjdAorICAgICAgICAgICAgaWYgKHhvcFJlZmVyZW5jZVByZXNlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHRTdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7CisgICAgICAgICAgICBpZih4b3BSZWZlcmVuY2VQcmVzZW50KQorICAgICAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1Db25zdGFudHMuQ0hBUkFDVEVSUzsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgaW50IGV2ZW50ID0gcmVhZGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICgoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpICYmIHJlYWRlci5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWE9QX0xPQ0FMTkFNRSkgJiYgcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhYT1BfTkFNRVNQQUNFVVJJKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2l0cyB4b3AgcmVmZXJlbmNlLCB0YWtlIHRoZSBVUkkgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgU3RyaW5nIGhyZWYgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImhyZWYiKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdHRhY2htZW50IGF0dCA9IGdldEF0dGFjaG1lbnQoaHJlZik7CisgICAgICAgICAgICAgICAgICAgIGlmKGF0dCAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NEF0dERhdGEgPSBhdHQuYXNCYXNlNjREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0TGVuZ3RoID0gYmFzZTY0QXR0RGF0YS5nZXREYXRhTGVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeG9wUmVmZXJlbmNlUHJlc2VudCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9tb3ZlIHRvIHRoZSA8L3hvcDpJbmNsdWRlPgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1Db25zdGFudHMuQ0hBUkFDVEVSUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHhvcFJlZmVyZW5jZVByZXNlbnQpeworICAgICAgICAgICAgICAgIHhvcFJlZmVyZW5jZVByZXNlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB0ZXh0U3RhcnQgPSAwOworICAgICAgICAgICAgICAgIHRleHRMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJhc2U2NEVuY29kZWRUZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBldmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRlY29kZUNpZChTdHJpbmcgY2lkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNpZCA9IFVSTERlY29kZXIuZGVjb2RlKGNpZCwgInV0Zi04Iik7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL29uIHJlY2NlaXZpbmcgc2lkZSBsZXRzIG5vdCBmYWlsIG5vdywgdHJ5IHRvIGxvb2sgZm9yIGl0CisgICAgICAgICAgICAgICAgcmV0dXJuIGNpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaWQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFRvRGVjb2RlKFN0cmluZyBjaWQpeworICAgICAgICAgICAgaW50IG51bUNoYXJzID0gY2lkLmxlbmd0aCgpOworICAgICAgICAgICAgaW50IGk9MDsKKyAgICAgICAgICAgIGNoYXIgYzsKKyAgICAgICAgICAgIHdoaWxlIChpIDwgbnVtQ2hhcnMpIHsKKyAgICAgICAgICAgICAgICBjID0gY2lkLmNoYXJBdChpKyspOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBTdHJlYW1BdHRhY2htZW50IGdldEF0dGFjaG1lbnQoU3RyaW5nIGNpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChjaWQuc3RhcnRzV2l0aCgiY2lkOiIpKQorICAgICAgICAgICAgICAgIGNpZCA9IGNpZC5zdWJzdHJpbmcoNCwgY2lkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIFN0cmVhbUF0dGFjaG1lbnQgYXR0ID0gbWltZU1QLmdldEF0dGFjaG1lbnRQYXJ0KGNpZCk7CisgICAgICAgICAgICBpZihhdHQgPT0gbnVsbCAmJiBuZWVkVG9EZWNvZGUoY2lkKSl7CisgICAgICAgICAgICAgICAgLy90cnkgbm90IGJlIHVybCBkZWNvZGluZyBpdCAtIHRoaXMgaXMgcmVxdWlyZWQgZm9yIEluZGlnbyBpbnRlcm9wLCB0aGV5IHdyaXRlIGNvbnRlbnQtaWQgd2l0aG91dCBlc2NhcGluZworICAgICAgICAgICAgICAgIGNpZCA9IGRlY29kZUNpZChjaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBtaW1lTVAuZ2V0QXR0YWNobWVudFBhcnQoY2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhdHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgeworICAgICAgICAgICAgaWYgKHhvcFJlZmVyZW5jZVByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcltiYXNlNjRBdHREYXRhLmxlbmd0aCgpXTsKKyAgICAgICAgICAgICAgICBiYXNlNjRBdHREYXRhLndyaXRlVG8oY2hhcnMsIDApOworICAgICAgICAgICAgICAgIHRleHRMZW5ndGggPSBjaGFycy5sZW5ndGg7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRUZXh0Q2hhcmFjdGVycyhpbnQgc291cmNlU3RhcnQsIGNoYXJbXSB0YXJnZXQsIGludCB0YXJnZXRTdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZih4b3BSZWZlcmVuY2VQcmVzZW50KXsKKyAgICAgICAgICAgICAgICBpbnQgZXZlbnQgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYoZXZlbnQgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMpeworICAgICAgICAgICAgICAgICAgICAvL2l0cyBpbnZhbGlkIHN0YXRlIC0gZGVsZWdhdGUgaXQgdG8gdW5kZXJseWluZyByZWFkZXIgdG8gdGhyb3cgdGhlIGNvcnJyZWN0IGV4Y2VwdGlvbiBzbyB0aGF0IHVzZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHNlZXMgdGhlIHVuaWZvcm0gZXhjZXB0aW9uIGZyb20gdGhlIFhNTFN0cmVhbVJlYWRlcgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJJbnZhbGlkIHN0YXRlOiBFeHBlY3RlZCBDSEFSQUNURVJTIGZvdW5kIDoiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYodGFyZ2V0ID09IG51bGwpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRhcmdldCBjaGFyIGFycmF5IGNhbid0IGJlIG51bGwiKSA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYodGFyZ2V0U3RhcnQgPCAwIHx8IGxlbmd0aCA8IDAgfHwgc291cmNlU3RhcnQgPCAwIHx8IHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXRTdGFydCArIGxlbmd0aCApID4gdGFyZ2V0Lmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKGJhc2U2NEVuY29kZWRUZXh0ICE9IG51bGwpeworICAgICAgICAgICAgICAgICAgICBiYXNlNjRFbmNvZGVkVGV4dCA9IG5ldyBjaGFyW2Jhc2U2NEF0dERhdGEubGVuZ3RoKCldOworICAgICAgICAgICAgICAgICAgICBiYXNlNjRBdHREYXRhLndyaXRlVG8oYmFzZTY0RW5jb2RlZFRleHQsIDApOworICAgICAgICAgICAgICAgICAgICB0ZXh0TGVuZ3RoID0gYmFzZTY0RW5jb2RlZFRleHQubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB0ZXh0U3RhcnQgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCh0ZXh0U3RhcnQgKyBzb3VyY2VTdGFydCkgPiB0ZXh0TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCisgICAgICAgICAgICAgICAgaW50IGF2YWlsYWJsZSA9IHRleHRMZW5ndGggLSBzb3VyY2VTdGFydDsKKyAgICAgICAgICAgICAgICBpZihhdmFpbGFibGUgPCAwKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oInNvdXJjZVN0YXJ0IGlzIGdyZWF0ZXIgdGhhbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgY2hhcmFjdGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBjb3BpZWRMZW5ndGggPSBNYXRoLm1pbihhdmFpbGFibGUsbGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYmFzZTY0RW5jb2RlZFRleHQsIGdldFRleHRTdGFydCgpICsgc291cmNlU3RhcnQgLCB0YXJnZXQsIHRhcmdldFN0YXJ0LCBjb3BpZWRMZW5ndGgpOworICAgICAgICAgICAgICAgIHRleHRTdGFydCA9IHNvdXJjZVN0YXJ0OworICAgICAgICAgICAgICAgIHJldHVybiBjb3BpZWRMZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHRDaGFyYWN0ZXJzKHNvdXJjZVN0YXJ0LCB0YXJnZXQsIHRhcmdldFN0YXJ0LCBsZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICAgICAgaWYgKHhvcFJlZmVyZW5jZVByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9ICBiYXNlNjRBdHREYXRhLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBYT1BfUFJFRiA9IGVuY29kZSgiPEluY2x1ZGUgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlXCIgaHJlZj1cImNpZDoiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBlbmNvZGUoU3RyaW5nIHN0cikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gWE9QX1NVRkYgPSBlbmNvZGUoIlwiLz4iKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE9QX0xPQ0FMTkFNRSA9ICJJbmNsdWRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE9QX05BTUVTUEFDRVVSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlIjsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBVVEY4ID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvU09BUEJpbmRpbmdDb2RlYy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvU09BUEJpbmRpbmdDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWIzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9TT0FQQmluZGluZ0NvZGVjLmphdmEKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NRmVhdHVyZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5jbGllbnQuU2VsZWN0T3B0aW1hbEVuY29kaW5nRmVhdHVyZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuZmFzdGluZm9zZXQuRmFzdEluZm9zZXRGZWF0dXJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlN0cmVhbVNPQVBDb2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db2RlY3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5TT0FQQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkNvbnRlbnROZWdvdGlhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuU2VydmVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLlN0cmVhbWluZ01lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TZXJ2ZXJSdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuVW5zdXBwb3J0ZWRNZWRpYUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5XU0hUVFBDb25uZWN0aW9uOworCisvKioKKyAqIFNPQVAgYmluZGluZyB7QGxpbmsgQ29kZWN9IHRoYXQgY2FuIGhhbmRsZSBNVE9NLCBTd0EsIGFuZCBTT0FQIG1lc3NhZ2VzCisgKiBlbmNvZGVkIHVzaW5nIFhNTCBvciBGYXN0IEluZm9zZXQuCisgKgorICogPHA+CisgKiBUaGlzIGlzIHVzZWQgd2hlbiB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgZW5jb2RpbmcgZnJvbSB3aGF0IHdlIHJlY2VpdmVkIChmb3IgZGVjb2RpbmcpCisgKiBhbmQgZnJvbSBjb25maWd1cmF0aW9uIGFuZCB7QGxpbmsgTWVzc2FnZX0gY29udGVudHMgKGZvciBlbmNvZGluZykKKyAqCisgKiA8cD4KKyAqIFRPRE86IFNwbGl0IHRoaXMgQ29kZWMgaW50byB0d28sIG9uZSB0aGF0IHN1cHBvcnRzIEZJIGFuZCBvbmUgdGhhdCBkb2VzIG5vdC4KKyAqIFRoZW4gZnVydGhlciBzcGxpdCB0aGUgRkkgQ29kZWMgaW50byB0d28sIG9uZSBmb3IgY2xpZW50IGFuZCBvbmUgZm9yCisgKiBzZXJ2ZXIuIFRoaXMgd2lsbCBzaW1wbGlmeSB0aGUgbG9naWMgYW5kIG1ha2UgaXQgZWFzaWVyIHRvIHVuZGVyc3RhbmQvbWFpbnRhaW4uCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nQ29kZWMgZXh0ZW5kcyBNaW1lQ29kZWMgaW1wbGVtZW50cyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5TT0FQQmluZGluZ0NvZGVjIHsKKyAgICAvKioKKyAgICAgKiBCYXNlIEhUVFAgQWNjZXB0IHJlcXVlc3QtaGVhZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0FDQ0VQVF9WQUxVRSA9CisgICAgICAgICAgICAidGV4dC9odG1sLCBpbWFnZS9naWYsIGltYWdlL2pwZWcsICo7IHE9LjIsICovKjsgcT0uMiI7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIEZhc3QgSW5mb3NldCBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuCisgICAgICogY29uZmlndXJlZCB0byBiZSBkaXNhYmxlZCwgb3IgdGhlIEZhc3QgSW5mb3NldAorICAgICAqIHJ1bnRpbWUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNGYXN0SW5mb3NldERpc2FibGVkOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgRmFzdCBJbmZvc2V0IGNvZGVjIHNob3VsZCBiZSB1c2VkIGZvciBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFzdEluZm9zZXRGb3JFbmNvZGluZzsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGNvbnRlbnQgbmVnb3RpYXRpb24gcHJvcGVydHkgc2hvdWxkCisgICAgICogYmUgaWdub3JlZCBieSB0aGUgY2xpZW50LiBUaGlzIHdpbGwgYmUgdXNlZCBpbgorICAgICAqIHRoZSBjYXNlIG9mIEZhc3QgSW5mb3NldCBiZWluZyBjb25maWd1cmVkIHRvIGJlCisgICAgICogZGlzYWJsZWQgb3IgYXV0b21hdGljYWxseSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlQ29udGVudE5lZ290aWF0aW9uUHJvcGVydHk7CisKKyAgICAvLyBUaGUgWE1MIFNPQVAgY29kZWMKKyAgICBwcml2YXRlIGZpbmFsIFN0cmVhbVNPQVBDb2RlYyB4bWxTb2FwQ29kZWM7CisKKyAgICAvLyBUaGUgRmFzdCBJbmZvc2V0IFNPQVAgY29kZWMKKyAgICBwcml2YXRlIGZpbmFsIENvZGVjIGZpU29hcENvZGVjOworCisgICAgLy8gVGhlIFhNTCBNVE9NIGNvZGVjCisgICAgcHJpdmF0ZSBmaW5hbCBNaW1lQ29kZWMgeG1sTXRvbUNvZGVjOworCisgICAgLy8gVGhlIFhNTCBTV0EgY29kZWMKKyAgICBwcml2YXRlIGZpbmFsIE1pbWVDb2RlYyB4bWxTd2FDb2RlYzsKKworICAgIC8vIFRoZSBGYXN0IEluZm9zZXQgU1dBIGNvZGVjCisgICAgcHJpdmF0ZSBmaW5hbCBNaW1lQ29kZWMgZmlTd2FDb2RlYzsKKworICAgIHByaXZhdGUgZmluYWwgU09BUEJpbmRpbmdJbXBsIGJpbmRpbmc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgWE1MIFNPQVAgTUlNRSB0eXBlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgeG1sTWltZVR5cGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgRmFzdCBJbmZvc2V0IFNPQVAgTUlNRSB0eXBlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlNaW1lVHlwZTsKKworICAgIC8qKgorICAgICAqIFRoZSBBY2NlcHQgaGVhZGVyIGZvciBYTUwgZW5jb2RpbmdzCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgeG1sQWNjZXB0OworCisgICAgLyoqCisgICAgICogVGhlIEFjY2VwdCBoZWFkZXIgZm9yIEZhc3QgSW5mb3NldCBhbmQgWE1MIGVuY29kaW5ncworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbm5lZ1htbEFjY2VwdDsKKworICAgIHB1YmxpYyBTdHJlYW1TT0FQQ29kZWMgZ2V0WE1MQ29kZWMoKSB7CisgICAgICAgIHJldHVybiB4bWxTb2FwQ29kZWM7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBBY2NlcHRDb250ZW50VHlwZSBpbXBsZW1lbnRzIENvbnRlbnRUeXBlIHsKKyAgICAgICAgcHJpdmF0ZSBDb250ZW50VHlwZSBfYzsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2FjY2VwdDsKKworICAgICAgICBwdWJsaWMgQWNjZXB0Q29udGVudFR5cGUgc2V0KFBhY2tldCBwLCBDb250ZW50VHlwZSBjKSB7CisgICAgICAgICAgICBpZiAoIWlnbm9yZUNvbnRlbnROZWdvdGlhdGlvblByb3BlcnR5ICYmIHAuY29udGVudE5lZ290aWF0aW9uICE9IENvbnRlbnROZWdvdGlhdGlvbi5ub25lKSB7CisgICAgICAgICAgICAgICAgX2FjY2VwdCA9IGNvbm5lZ1htbEFjY2VwdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX2FjY2VwdCA9IHhtbEFjY2VwdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9jID0gYzsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfYy5nZXRDb250ZW50VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTT0FQQWN0aW9uSGVhZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIF9jLmdldFNPQVBBY3Rpb25IZWFkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXB0SGVhZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIF9hY2NlcHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEFjY2VwdENvbnRlbnRUeXBlIF9hZGFwdGluZ0NvbnRlbnRUeXBlID0gbmV3IEFjY2VwdENvbnRlbnRUeXBlKCk7CisKKyAgICBwdWJsaWMgU09BUEJpbmRpbmdDb2RlYyhXU0JpbmRpbmcgYmluZGluZykgeworICAgICAgICB0aGlzKGJpbmRpbmcsIENvZGVjcy5jcmVhdGVTT0FQRW52ZWxvcGVYbWxDb2RlYyhiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU09BUEJpbmRpbmdDb2RlYyhXU0JpbmRpbmcgYmluZGluZywgU3RyZWFtU09BUENvZGVjIHhtbFNvYXBDb2RlYykgeworICAgICAgICBzdXBlcihiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkpOworCisgICAgICAgIHRoaXMueG1sU29hcENvZGVjID0geG1sU29hcENvZGVjOworICAgICAgICB4bWxNaW1lVHlwZSA9IHhtbFNvYXBDb2RlYy5nZXRNaW1lVHlwZSgpOworCisgICAgICAgIHhtbE10b21Db2RlYyA9IG5ldyBNdG9tQ29kZWModmVyc2lvbiwgeG1sU29hcENvZGVjLCBiaW5kaW5nLmdldEZlYXR1cmUoTVRPTUZlYXR1cmUuY2xhc3MpKTsKKworICAgICAgICB4bWxTd2FDb2RlYyA9IG5ldyBTd0FDb2RlYyh2ZXJzaW9uLCB4bWxTb2FwQ29kZWMpOworCisgICAgICAgIFN0cmluZyBjbGllbnRBY2NlcHRlZENvbnRlbnRUeXBlcyA9IHhtbFNvYXBDb2RlYy5nZXRNaW1lVHlwZSgpICsgIiwgIiArCisgICAgICAgICAgICAgICAgeG1sTXRvbUNvZGVjLmdldE1pbWVUeXBlKCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICBCQVNFX0FDQ0VQVF9WQUxVRTsKKworICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZSBmaSA9IGJpbmRpbmcuZ2V0RmVhdHVyZShGYXN0SW5mb3NldEZlYXR1cmUuY2xhc3MpOworICAgICAgICBpc0Zhc3RJbmZvc2V0RGlzYWJsZWQgPSAoZmkgIT0gbnVsbCAmJiAhZmkuaXNFbmFibGVkKCkpOworICAgICAgICBpZiAoIWlzRmFzdEluZm9zZXREaXNhYmxlZCkgeworICAgICAgICAgICAgZmlTb2FwQ29kZWMgPSBnZXRGSUNvZGVjKHhtbFNvYXBDb2RlYywgdmVyc2lvbik7CisgICAgICAgICAgICBpZiAoZmlTb2FwQ29kZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpTWltZVR5cGUgPSBmaVNvYXBDb2RlYy5nZXRNaW1lVHlwZSgpOworICAgICAgICAgICAgICAgIGZpU3dhQ29kZWMgPSBuZXcgU3dBQ29kZWModmVyc2lvbiwgZmlTb2FwQ29kZWMpOworICAgICAgICAgICAgICAgIGNvbm5lZ1htbEFjY2VwdCA9IGZpTWltZVR5cGUgKyAiLCAiICsgY2xpZW50QWNjZXB0ZWRDb250ZW50VHlwZXM7CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBUaGlzIGZlYXR1cmUgd2lsbCBvbmx5IGJlIHByZXNlbnQgb24gdGhlIGNsaWVudCBzaWRlLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogRmFzdCBJbmZvc2V0IGlzIGVuYWJsZWQgb24gdGhlIGNsaWVudCBpZiB0aGUgc2VydmljZQorICAgICAgICAgICAgICAgICAqIGV4cGxpY2l0bHkgc3VwcG9ydHMgRmFzdCBJbmZvc2V0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlIHNlbGVjdCA9IGJpbmRpbmcuZ2V0RmVhdHVyZShTZWxlY3RPcHRpbWFsRW5jb2RpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHsgLy8gaWYgdGhlIGNsaWVudCBGSSBmZWF0dXJlIGlzIHNldCAtIGlnbm9yZSBuZWdvdGlhdGlvbiBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICBpZ25vcmVDb250ZW50TmVnb3RpYXRpb25Qcm9wZXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3QuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjbGllbnQncyBGSSBlbmNvZGluZyBmZWF0dXJlIGlzIGVuYWJsZWQsIGFuZCBzZXJ2ZXIncyBpcyBub3QgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaSAhPSBudWxsKSB7ICAvLyBpZiBzZXJ2ZXIncyBGSSBmZWF0dXJlIGFsc28gZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZhc3RJbmZvc2V0Rm9yRW5jb2RpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRBY2NlcHRlZENvbnRlbnRUeXBlcyA9IGNvbm5lZ1htbEFjY2VwdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIElmIGNsaWVudCBGSSBmZWF0dXJlIGlzIGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgICAgICBpc0Zhc3RJbmZvc2V0RGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGYXN0IEluZm9zZXQgY291bGQgbm90IGJlIGxvYWRlZCBieSB0aGUgcnVudGltZQorICAgICAgICAgICAgICAgIGlzRmFzdEluZm9zZXREaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZmlTd2FDb2RlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgZmlNaW1lVHlwZSA9ICIiOworICAgICAgICAgICAgICAgIGNvbm5lZ1htbEFjY2VwdCA9IGNsaWVudEFjY2VwdGVkQ29udGVudFR5cGVzOworICAgICAgICAgICAgICAgIGlnbm9yZUNvbnRlbnROZWdvdGlhdGlvblByb3BlcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZhc3QgSW5mb3NldCBpcyBleHBsaWNpdGx5IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZpY2UKKyAgICAgICAgICAgIGZpU29hcENvZGVjID0gZmlTd2FDb2RlYyA9IG51bGw7CisgICAgICAgICAgICBmaU1pbWVUeXBlID0gIiI7CisgICAgICAgICAgICBjb25uZWdYbWxBY2NlcHQgPSBjbGllbnRBY2NlcHRlZENvbnRlbnRUeXBlczsKKyAgICAgICAgICAgIGlnbm9yZUNvbnRlbnROZWdvdGlhdGlvblByb3BlcnR5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHhtbEFjY2VwdCA9IGNsaWVudEFjY2VwdGVkQ29udGVudFR5cGVzOworCisgICAgICAgIHRoaXMuYmluZGluZyA9IChTT0FQQmluZGluZ0ltcGwpYmluZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGVudFR5cGUgZ2V0U3RhdGljQ29udGVudFR5cGUoUGFja2V0IHBhY2tldCkgeworICAgICAgICBDb250ZW50VHlwZSB0b0FkYXB0ID0gZ2V0RW5jb2RlcihwYWNrZXQpLmdldFN0YXRpY0NvbnRlbnRUeXBlKHBhY2tldCk7CisgICAgICAgIHJldHVybiAodG9BZGFwdCAhPSBudWxsKSA/IF9hZGFwdGluZ0NvbnRlbnRUeXBlLnNldChwYWNrZXQsIHRvQWRhcHQpIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGVudFR5cGUgZW5jb2RlKFBhY2tldCBwYWNrZXQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBfYWRhcHRpbmdDb250ZW50VHlwZS5zZXQocGFja2V0LCBnZXRFbmNvZGVyKHBhY2tldCkuZW5jb2RlKHBhY2tldCwgb3V0KSk7CisgICAgfQorCisgICAgcHVibGljIENvbnRlbnRUeXBlIGVuY29kZShQYWNrZXQgcGFja2V0LCBXcml0YWJsZUJ5dGVDaGFubmVsIGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gX2FkYXB0aW5nQ29udGVudFR5cGUuc2V0KHBhY2tldCwgZ2V0RW5jb2RlcihwYWNrZXQpLmVuY29kZShwYWNrZXQsIGJ1ZmZlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlY29kZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGNvbnRlbnRUeXBlLCBQYWNrZXQgcGFja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkTWVkaWFFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNldCB0aGUgZW5jb2Rpbmcgc3RhdGUgd2hlbiBvbiB0aGUgc2VydmVyIHNpZGUgZm9yIGVhY2gKKyAgICAgICAgICogZGVjb2RlL2VuY29kZSBzdGVwLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBhY2tldC5jb250ZW50TmVnb3RpYXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHVzZUZhc3RJbmZvc2V0Rm9yRW5jb2RpbmcgPSBmYWxzZTsKKworICAgICAgICBpZihpc011bHRpcGFydFJlbGF0ZWQoY29udGVudFR5cGUpKQorICAgICAgICAgICAgLy8gcGFyc2UgdGhlIG11bHRpcGFydCBwb3J0aW9uIGFuZCB0aGVuIGRlY2lkZSB3aGV0aGVyIGl0J3MgTVRPTSBvciBTd0EKKyAgICAgICAgICAgIHN1cGVyLmRlY29kZShpbiwgY29udGVudFR5cGUsIHBhY2tldCk7CisgICAgICAgIGVsc2UgaWYoaXNGYXN0SW5mb3NldChjb250ZW50VHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghaWdub3JlQ29udGVudE5lZ290aWF0aW9uUHJvcGVydHkgJiYgcGFja2V0LmNvbnRlbnROZWdvdGlhdGlvbiA9PSBDb250ZW50TmVnb3RpYXRpb24ubm9uZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBub0Zhc3RJbmZvc2V0Rm9yRGVjb2RpbmcoKTsKKworICAgICAgICAgICAgdXNlRmFzdEluZm9zZXRGb3JFbmNvZGluZyA9IHRydWU7CisgICAgICAgICAgICBmaVNvYXBDb2RlYy5kZWNvZGUoaW4sIGNvbnRlbnRUeXBlLCBwYWNrZXQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHhtbFNvYXBDb2RlYy5kZWNvZGUoaW4sIGNvbnRlbnRUeXBlLCBwYWNrZXQpOworCisgICAgICAgIGlmICghdXNlRmFzdEluZm9zZXRGb3JFbmNvZGluZykgeworICAgICAgICAgICAgdXNlRmFzdEluZm9zZXRGb3JFbmNvZGluZyA9IGlzRmFzdEluZm9zZXRBY2NlcHRhYmxlKHBhY2tldC5hY2NlcHRhYmxlTWltZVR5cGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlY29kZShSZWFkYWJsZUJ5dGVDaGFubmVsIGluLCBTdHJpbmcgY29udGVudFR5cGUsIFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE1lZGlhRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc2V0IHRoZSBlbmNvZGluZyBzdGF0ZSB3aGVuIG9uIHRoZSBzZXJ2ZXIgc2lkZSBmb3IgZWFjaAorICAgICAgICAgKiBkZWNvZGUvZW5jb2RlIHN0ZXAuCisgICAgICAgICAqLworICAgICAgICBpZiAocGFja2V0LmNvbnRlbnROZWdvdGlhdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgdXNlRmFzdEluZm9zZXRGb3JFbmNvZGluZyA9IGZhbHNlOworCisgICAgICAgIGlmKGlzTXVsdGlwYXJ0UmVsYXRlZChjb250ZW50VHlwZSkpCisgICAgICAgICAgICBzdXBlci5kZWNvZGUoaW4sIGNvbnRlbnRUeXBlLCBwYWNrZXQpOworICAgICAgICBlbHNlIGlmKGlzRmFzdEluZm9zZXQoY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICBpZiAocGFja2V0LmNvbnRlbnROZWdvdGlhdGlvbiA9PSBDb250ZW50TmVnb3RpYXRpb24ubm9uZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBub0Zhc3RJbmZvc2V0Rm9yRGVjb2RpbmcoKTsKKworICAgICAgICAgICAgdXNlRmFzdEluZm9zZXRGb3JFbmNvZGluZyA9IHRydWU7CisgICAgICAgICAgICBmaVNvYXBDb2RlYy5kZWNvZGUoaW4sIGNvbnRlbnRUeXBlLCBwYWNrZXQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHhtbFNvYXBDb2RlYy5kZWNvZGUoaW4sIGNvbnRlbnRUeXBlLCBwYWNrZXQpOworCisvLyAgICAgICAgY2hlY2tEdXBsaWNhdGVLbm93bkhlYWRlcnMocGFja2V0KTsKKyAgICAgICAgaWYgKCF1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nKSB7CisgICAgICAgICAgICB1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nID0gaXNGYXN0SW5mb3NldEFjY2VwdGFibGUocGFja2V0LmFjY2VwdGFibGVNaW1lVHlwZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNPQVBCaW5kaW5nQ29kZWMgY29weSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTT0FQQmluZGluZ0NvZGVjKGJpbmRpbmcsIChTdHJlYW1TT0FQQ29kZWMpeG1sU29hcENvZGVjLmNvcHkoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlKE1pbWVNdWx0aXBhcnRQYXJzZXIgbXBwLCBQYWNrZXQgcGFja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBpcyB0aGlzIFN3QSBvciBYT1A/CisgICAgICAgIGZpbmFsIFN0cmluZyByb290Q29udGVudFR5cGUgPSBtcHAuZ2V0Um9vdFBhcnQoKS5nZXRDb250ZW50VHlwZSgpOworCisgICAgICAgIGlmKGlzQXBwbGljYXRpb25Yb3BYbWwocm9vdENvbnRlbnRUeXBlKSkKKyAgICAgICAgICAgIHhtbE10b21Db2RlYy5kZWNvZGUobXBwLHBhY2tldCk7CisgICAgICAgIGVsc2UgaWYgKGlzRmFzdEluZm9zZXQocm9vdENvbnRlbnRUeXBlKSkgeworICAgICAgICAgICAgaWYgKHBhY2tldC5jb250ZW50TmVnb3RpYXRpb24gPT0gQ29udGVudE5lZ290aWF0aW9uLm5vbmUpCisgICAgICAgICAgICAgICAgdGhyb3cgbm9GYXN0SW5mb3NldEZvckRlY29kaW5nKCk7CisKKyAgICAgICAgICAgIHVzZUZhc3RJbmZvc2V0Rm9yRW5jb2RpbmcgPSB0cnVlOworICAgICAgICAgICAgZmlTd2FDb2RlYy5kZWNvZGUobXBwLHBhY2tldCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNYbWwocm9vdENvbnRlbnRUeXBlKSkKKyAgICAgICAgICAgIHhtbFN3YUNvZGVjLmRlY29kZShtcHAscGFja2V0KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPIGxvY2FsaXplIGV4Y2VwdGlvbgorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgfQorLy8gICAgICAgIGNoZWNrRHVwbGljYXRlS25vd25IZWFkZXJzKHBhY2tldCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTXVsdGlwYXJ0UmVsYXRlZChTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGNvbnRlbnRUeXBlLCBNaW1lQ29kZWMuTVVMVElQQVJUX1JFTEFURURfTUlNRV9UWVBFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhdGlvblhvcFhtbChTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGNvbnRlbnRUeXBlLCBNdG9tQ29kZWMuWE9QX1hNTF9NSU1FX1RZUEUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1htbChTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGNvbnRlbnRUeXBlLCB4bWxNaW1lVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRmFzdEluZm9zZXQoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIGlmIChpc0Zhc3RJbmZvc2V0RGlzYWJsZWQpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoY29udGVudFR5cGUsIGZpTWltZVR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlU3RyaW5ncyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKKyAgICAgICAgcmV0dXJuIGEubGVuZ3RoKCkgPj0gYi5sZW5ndGgoKSAmJgorICAgICAgICAgICAgICAgIGIuZXF1YWxzSWdub3JlQ2FzZSgKKyAgICAgICAgICAgICAgICBhLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgIGIubGVuZ3RoKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNGYXN0SW5mb3NldEFjY2VwdGFibGUoU3RyaW5nIGFjY2VwdCkgeworICAgICAgICBpZiAoYWNjZXB0ID09IG51bGwgfHwgaXNGYXN0SW5mb3NldERpc2FibGVkKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY2NlcHQsICIsIik7CisgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi5lcXVhbHNJZ25vcmVDYXNlKGZpTWltZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgdGhlIGVuY29kaW5nIGNvZGVjLgorICAgICAqLworICAgIHByaXZhdGUgQ29kZWMgZ2V0RW5jb2RlcihQYWNrZXQgcCkgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyBsb2dpYyBpcyBvbmx5IGZvciBvdXRib3VuZCBwYWNrZXRzCisgICAgICAgICAqIHRvIGJlIGVuY29kZWQgYnkgYSBjbGllbnQuCisgICAgICAgICAqIEZvciBhIHNlcnZlciB0aGUgcC5jb250ZW50TmVnb3RpYXRpb24gPT0gbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIGlmICghaWdub3JlQ29udGVudE5lZ290aWF0aW9uUHJvcGVydHkpIHsKKyAgICAgICAgICAgIGlmIChwLmNvbnRlbnROZWdvdGlhdGlvbiA9PSBDb250ZW50TmVnb3RpYXRpb24ubm9uZSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjbGllbnQgbWF5IGhhdmUgY2hhbmdlZCB0aGUgbmVnb3RpYXRpb24gcHJvcGVydHkgZnJvbQorICAgICAgICAgICAgICAgIC8vIHBlc3Npc21pc3RpYyB0byBub25lIGJldHdlZW4gaW52b2NhdGlvbnMKKyAgICAgICAgICAgICAgICB1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHAuY29udGVudE5lZ290aWF0aW9uID09IENvbnRlbnROZWdvdGlhdGlvbi5vcHRpbWlzdGljKSB7CisgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGVuY29kZSB1c2luZyBGYXN0IEluZm9zZXQgaWYgaW4gb3B0aW1pc2l0aWMgbW9kZQorICAgICAgICAgICAgICAgIHVzZUZhc3RJbmZvc2V0Rm9yRW5jb2RpbmcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIE1UT00gYmluZGluZyBmb3Igbm93CisgICAgICAgIC8vIE5vdGU6IFVzaW5nIEZJIHdpdGggTVRPTSBkb2VzIG5vdCBtYWtlIHNlbnNlCisgICAgICAgIGlmICh1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nKSB7CisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlIG0gPSBwLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGlmKG09PW51bGwgfHwgbS5nZXRBdHRhY2htZW50cygpLmlzRW1wdHkoKSB8fCBiaW5kaW5nLmlzRmVhdHVyZUVuYWJsZWQoTVRPTUZlYXR1cmUuY2xhc3MpKQorICAgICAgICAgICAgICAgIHJldHVybiBmaVNvYXBDb2RlYzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlTd2FDb2RlYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGJpbmRpbmcuaXNGZWF0dXJlRW5hYmxlZChNVE9NRmVhdHVyZS5jbGFzcykpCisgICAgICAgICAgICByZXR1cm4geG1sTXRvbUNvZGVjOworCisgICAgICAgIE1lc3NhZ2UgbSA9IHAuZ2V0TWVzc2FnZSgpOworICAgICAgICBpZihtPT1udWxsIHx8IG0uZ2V0QXR0YWNobWVudHMoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4geG1sU29hcENvZGVjOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4geG1sU3dhQ29kZWM7CisgICAgfQorCisgICAgcHJpdmF0ZSBSdW50aW1lRXhjZXB0aW9uIG5vRmFzdEluZm9zZXRGb3JEZWNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmVhbWluZ01lc3NhZ2VzLkZBU1RJTkZPU0VUX0RFQ09ESU5HX05PVF9BQ0NFUFRFRCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gYW4gRkkgU09BUCBjb2RlYyBpbnN0YW5jZSB1c2luZyByZWZsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvZGVjIGdldEZJQ29kZWMoU3RyZWFtU09BUENvZGVjIHNvYXBDb2RlYywgU09BUFZlcnNpb24gdmVyc2lvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoImNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0U3RyZWFtU09BUENvZGVjIik7CisgICAgICAgICAgICBNZXRob2QgbSA9IGMuZ2V0TWV0aG9kKCJjcmVhdGUiLCBTdHJlYW1TT0FQQ29kZWMuY2xhc3MsIFNPQVBWZXJzaW9uLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiAoQ29kZWMpbS5pbnZva2UobnVsbCwgc29hcENvZGVjLCB2ZXJzaW9uKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gTG9nIHRoYXQgRkkgY2Fubm90IGJlIGxvYWRlZAorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9TdHJlYW1TT0FQMTFDb2RlYy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvU3RyZWFtU09BUDExQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDI0ZWUyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvU3RyZWFtU09BUDExQ29kZWMuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmc7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29udGVudFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW0uU3RyZWFtSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtLlN0cmVhbUhlYWRlcjExOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIHtAbGluayBTdHJlYW1TT0FQQ29kZWN9IGZvciBTT0FQIDEuMS4KKyAqCisgKiBAYXV0aG9yIFBhdWwuU2FuZG96QFN1bi5Db20KKyAqLworZmluYWwgY2xhc3MgU3RyZWFtU09BUDExQ29kZWMgZXh0ZW5kcyBTdHJlYW1TT0FQQ29kZWMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9NSU1FX1RZUEUgPSAidGV4dC94bWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9DT05URU5UX1RZUEUgPSBTT0FQMTFfTUlNRV9UWVBFKyI7IGNoYXJzZXQ9dXRmLTgiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IGV4cGVjdGVkQ29udGVudFR5cGVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChTT0FQMTFfTUlNRV9UWVBFKTsKKworICAgIC8qcGFja2FnZSovICBTdHJlYW1TT0FQMTFDb2RlYygpIHsKKyAgICAgICAgc3VwZXIoU09BUFZlcnNpb24uU09BUF8xMSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFNPQVAxMV9NSU1FX1RZUEU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmVhbUhlYWRlciBjcmVhdGVIZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgWE1MU3RyZWFtQnVmZmVyIG1hcmspIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWFkZXIxMShyZWFkZXIsIG1hcmspOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29udGVudFR5cGVJbXBsIGRlZmF1bHRDb250ZW50VHlwZSA9CisgICAgICAgICAgICBuZXcgQ29udGVudFR5cGVJbXBsKFNPQVAxMV9DT05URU5UX1RZUEUsICIiKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZShTdHJpbmcgc29hcEFjdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRUeXBlSW1wbChTT0FQMTFfQ09OVEVOVF9UWVBFLCBzb2FwQWN0aW9uKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldEV4cGVjdGVkQ29udGVudFR5cGVzKCkgeworICAgICAgICByZXR1cm4gZXhwZWN0ZWRDb250ZW50VHlwZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvU3RyZWFtU09BUDEyQ29kZWMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL1N0cmVhbVNPQVAxMkNvZGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2OWNhMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL1N0cmVhbVNPQVAxMkNvZGVjLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtLlN0cmVhbUhlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnN0cmVhbS5TdHJlYW1IZWFkZXIxMjsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiB7QGxpbmsgU3RyZWFtU09BUENvZGVjfSBmb3IgU09BUCAxLjIuCisgKgorICogQGF1dGhvciBQYXVsLlNhbmRvekBTdW4uQ29tCisgKi8KK2ZpbmFsIGNsYXNzIFN0cmVhbVNPQVAxMkNvZGVjIGV4dGVuZHMgU3RyZWFtU09BUENvZGVjIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTUlNRV9UWVBFID0gImFwcGxpY2F0aW9uL3NvYXAreG1sIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfQ09OVEVOVF9UWVBFID0gU09BUDEyX01JTUVfVFlQRSsiOyBjaGFyc2V0PXV0Zi04IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBleHBlY3RlZENvbnRlbnRUeXBlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoU09BUDEyX01JTUVfVFlQRSk7CisKKyAgICAvKnBhY2thZ2UqLyBTdHJlYW1TT0FQMTJDb2RlYygpIHsKKyAgICAgICAgc3VwZXIoU09BUFZlcnNpb24uU09BUF8xMik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFNPQVAxMl9NSU1FX1RZUEU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmVhbUhlYWRlciBjcmVhdGVIZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgWE1MU3RyZWFtQnVmZmVyIG1hcmspIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWFkZXIxMihyZWFkZXIsIG1hcmspOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29udGVudFR5cGVJbXBsIGRlZmF1bHRDb250ZW50VHlwZSA9CisgICAgICAgICAgICBuZXcgQ29udGVudFR5cGVJbXBsKFNPQVAxMl9DT05URU5UX1RZUEUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKFN0cmluZyBzb2FwQWN0aW9uKSB7CisgICAgICAgIC8vIFRPRE86IHNldCBhY2NlcHQgaGVhZGVyCisgICAgICAgIGlmIChzb2FwQWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q29udGVudFR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRUeXBlSW1wbChTT0FQMTJfQ09OVEVOVF9UWVBFICsgIjthY3Rpb249XCIiK3NvYXBBY3Rpb24rIlwiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldEV4cGVjdGVkQ29udGVudFR5cGVzKCkgeworICAgICAgICByZXR1cm4gZXhwZWN0ZWRDb250ZW50VHlwZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvU3RyZWFtU09BUENvZGVjLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9TdHJlYW1TT0FQQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzI5N2RlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvU3RyZWFtU09BUENvZGVjLmphdmEKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZzsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5NdXRhYmxlWE1MU3RyZWFtQnVmZmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuWE1MU3RyZWFtQnVmZmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuWE1MU3RyZWFtQnVmZmVyTWFyazsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLnN0YXguU3RyZWFtUmVhZGVyQnVmZmVyQ3JlYXRvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc3RyZWFtaW5nLlhNTFN0cmVhbVdyaXRlckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5BdHRhY2htZW50U2V0SW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnN0cmVhbS5TdHJlYW1IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW0uU3RyZWFtTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC5zb2FwLlZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuVW5zdXBwb3J0ZWRNZWRpYUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuVGlkeVhNTFN0cmVhbVJlYWRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBIHN0cmVhbSBTT0FQIGNvZGVjLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSJ9KQorcHVibGljIGFic3RyYWN0IGNsYXNzIFN0cmVhbVNPQVBDb2RlYyBpbXBsZW1lbnRzIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlN0cmVhbVNPQVBDb2RlYyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTlZFTE9QRSA9ICJFbnZlbG9wZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfSEVBREVSID0gIkhlYWRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfQk9EWSA9ICJCb2R5IjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFNPQVBfTkFNRVNQQUNFX1VSSTsKKyAgICBwcml2YXRlIGZpbmFsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uOworCisgICAgLypwYWNrYWdlKi8gU3RyZWFtU09BUENvZGVjKFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgIFNPQVBfTkFNRVNQQUNFX1VSSSA9IHNvYXBWZXJzaW9uLm5zVXJpOworICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gc29hcFZlcnNpb247CisgICAgfQorCisgICAgLy8gY29uc2lkZXIgY2FjaGluZworICAgIC8vIHByaXZhdGUgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcjsKKworICAgIC8vIGNvbnNpZGVyIGNhY2hpbmcKKyAgICAvLyBwcml2YXRlIGZpbmFsIE11dGFibGVYTUxTdHJlYW1CdWZmZXIgYnVmZmVyOworCisgICAgcHVibGljIENvbnRlbnRUeXBlIGdldFN0YXRpY0NvbnRlbnRUeXBlKFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbnRlbnRUeXBlKHBhY2tldC5zb2FwQWN0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGVudFR5cGUgZW5jb2RlKFBhY2tldCBwYWNrZXQsIE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgaWYgKHBhY2tldC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTFN0cmVhbVdyaXRlckZhY3RvcnkuY3JlYXRlKG91dCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBhY2tldC5nZXRNZXNzYWdlKCkud3JpdGVUbyh3cml0ZXIpOworICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlckZhY3RvcnkucmVjeWNsZSh3cml0ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRDb250ZW50VHlwZShwYWNrZXQuc29hcEFjdGlvbik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IENvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKFN0cmluZyBzb2FwQWN0aW9uKTsKKworICAgIHB1YmxpYyBDb250ZW50VHlwZSBlbmNvZGUoUGFja2V0IHBhY2tldCwgV3JpdGFibGVCeXRlQ2hhbm5lbCBidWZmZXIpIHsKKyAgICAgICAgLy9UT0RPOiBub3QgeWV0IGltcGxlbWVudGVkCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PFN0cmluZz4gZ2V0RXhwZWN0ZWRDb250ZW50VHlwZXMoKTsKKworICAgIHB1YmxpYyB2b2lkIGRlY29kZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGNvbnRlbnRUeXBlLCBQYWNrZXQgcGFja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMaXN0PFN0cmluZz4gZXhwZWN0ZWRDb250ZW50VHlwZXMgPSBnZXRFeHBlY3RlZENvbnRlbnRUeXBlcygpOworICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCAmJiAhaXNDb250ZW50VHlwZVN1cHBvcnRlZChjb250ZW50VHlwZSxleHBlY3RlZENvbnRlbnRUeXBlcykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE1lZGlhRXhjZXB0aW9uKGNvbnRlbnRUeXBlLCBleHBlY3RlZENvbnRlbnRUeXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGRlZmluaXRlbHkgbGV0IERlY29kZSBvd25zIG9uZSBYTUxTdHJlYW1SZWFkZXIgaW5zdGFuY2UKKyAgICAgICAgLy8gaW5zdGVhZCBvZiBnb2luZyB0byB0aGlzIGdlbmVyaWMgZmFjdG9yeQorICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IFRpZHlYTUxTdHJlYW1SZWFkZXIoWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5jcmVhdGUobnVsbCwgaW4sIHRydWUpLCBpbik7CisgICAgICAgIHBhY2tldC5zZXRNZXNzYWdlKGRlY29kZShyZWFkZXIpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrcyBhZ2FpbnN0IGV4cGVjdGVkIENvbnRlbnQtVHlwZSBoZWFkZXJzIHRoYXQgaXMgaGFuZGxlZCBieSBhIGNvZGVjCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3QgdGhlIENvbnRlbnQtVHlwZSBvZiB0aGUgcmVxdWVzdAorICAgICAqIEBwYXJhbSBleHBlY3RlZCBleHBlY3RlZCBDb250ZW50LVR5cGVzIGZvciBhIGNvZGVjCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2RlYyBzdXBwb3J0cyB0aGlzIENvbnRlbnQtVHlwZQorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKFN0cmluZyBjdCwgTGlzdDxTdHJpbmc+IGV4cGVjdGVkKSB7CisgICAgICAgIGZvcihTdHJpbmcgY29udGVudFR5cGUgOiBleHBlY3RlZCkgeworICAgICAgICAgICAgaWYgKGN0LmluZGV4T2YoY29udGVudFR5cGUpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgYSBtZXNzYWdlIGZyb20ge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gdGhhdCBwb2ludHMgdG8KKyAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIGEgU09BUCBpbmZvc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlcgorICAgICAqICAgICAgY2FuIHBvaW50IHRvIHRoZSBzdGFydCBkb2N1bWVudCBvciB0aGUgc3RhcnQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQE5vdE51bGwgTWVzc2FnZSBkZWNvZGUoQE5vdE51bGwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gZGVjb2RlKHJlYWRlcixuZXcgQXR0YWNobWVudFNldEltcGwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyBhIG1lc3NhZ2UgZnJvbSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSB0aGF0IHBvaW50cyB0bworICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgYSBTT0FQIGluZm9zZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICogICAgICBjYW4gcG9pbnQgdG8gdGhlIHN0YXJ0IGRvY3VtZW50IG9yIHRoZSBzdGFydCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBhdHRhY2htZW50U2V0CisgICAgICogICAgICB7QGxpbmsgU3RyZWFtU09BUENvZGVjfSBjYW4gdGFrZSBhdHRhY2htZW50cyBwYXJzZWQgb3V0c2lkZSwKKyAgICAgKiAgICAgIHNvIHRoYXQgdGhpcyBjb2RlYyBjYW4gYmUgdXNlZCBhcyBhIHBhcnQgb2YgYSBiaWdncmUgY29kZWMKKyAgICAgKiAgICAgIChsaWtlIE1JTUUgbXVsdGlwYXJ0IGNvZGVjLikKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWVzc2FnZSBkZWNvZGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgQE5vdE51bGwgQXR0YWNobWVudFNldCBhdHRhY2htZW50U2V0KSB7CisKKyAgICAgICAgLy8gTW92ZSB0byBzb2FwOkVudmVsb3BlIGFuZCB2ZXJpZnkKKyAgICAgICAgaWYocmVhZGVyLmdldEV2ZW50VHlwZSgpIT1YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKTsKKyAgICAgICAgaWYgKFNPQVBfRU5WRUxPUEUuZXF1YWxzKHJlYWRlci5nZXRMb2NhbE5hbWUoKSkgJiYgIVNPQVBfTkFNRVNQQUNFX1VSSS5lcXVhbHMocmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbihzb2FwVmVyc2lvbiwgU09BUF9OQU1FU1BBQ0VfVVJJLCByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICB9CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgU09BUF9OQU1FU1BBQ0VfVVJJLCBTT0FQX0VOVkVMT1BFKTsKKworICAgICAgICBUYWdJbmZvc2V0IGVudmVsb3BlVGFnID0gbmV3IFRhZ0luZm9zZXQocmVhZGVyKTsKKworICAgICAgICAvLyBDb2xsZWN0IG5hbWVzcGFjZXMgb24gc29hcDpFbnZlbG9wZQorICAgICAgICBNYXA8U3RyaW5nLFN0cmluZz4gbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisKKyAgICAgICAgLy8gTW92ZSB0byBuZXh0IGVsZW1lbnQKKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsCisgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCk7CisKKyAgICAgICAgSGVhZGVyTGlzdCBoZWFkZXJzID0gbnVsbDsKKyAgICAgICAgVGFnSW5mb3NldCBoZWFkZXJUYWcgPSBudWxsOworCisgICAgICAgIGlmIChyZWFkZXIuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFNPQVBfSEVBREVSKQorICAgICAgICAgICAgICAgICYmIHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUF9OQU1FU1BBQ0VfVVJJKSkgeworICAgICAgICAgICAgaGVhZGVyVGFnID0gbmV3IFRhZ0luZm9zZXQocmVhZGVyKTsKKworICAgICAgICAgICAgLy8gQ29sbGVjdCBuYW1lc3BhY2VzIG9uIHNvYXA6SGVhZGVyCisgICAgICAgICAgICBmb3IoaW50IGk9MDsgaTwgcmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7aSsrKXsKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLnB1dChyZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpLCByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNraXAgPHNvYXA6SGVhZGVyPgorICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKKworICAgICAgICAgICAgLy8gSWYgU09BUCBoZWFkZXIgYmxvY2tzIGFyZSBwcmVzZW50IChpLmUuIG5vdCA8c29hcDpIZWFkZXIvPikKKyAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJzID0gbmV3IEhlYWRlckxpc3QoKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhY2hlIFNPQVAgaGVhZGVyIGJsb2NrcworICAgICAgICAgICAgICAgICAgICBjYWNoZUhlYWRlcnMocmVhZGVyLCBuYW1lc3BhY2VzLCBoZWFkZXJzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG5lZWQgdG8gdGhyb3cgbW9yZSBtZWFuaW5nZnVsIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vdmUgdG8gc29hcDpCb2R5CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgPHNvYXA6Qm9keT4gaXMgcHJlc2VudAorICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIFNPQVBfTkFNRVNQQUNFX1VSSSwgU09BUF9CT0RZKTsKKyAgICAgICAgVGFnSW5mb3NldCBib2R5VGFnID0gbmV3IFRhZ0luZm9zZXQocmVhZGVyKTsKKworICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOworICAgICAgICByZXR1cm4gbmV3IFN0cmVhbU1lc3NhZ2UoZW52ZWxvcGVUYWcsaGVhZGVyVGFnLGF0dGFjaG1lbnRTZXQsaGVhZGVycyxib2R5VGFnLHJlYWRlcixzb2FwVmVyc2lvbik7CisgICAgICAgIC8vIHdoZW4gdGhlcmUncyBubyBwYXlsb2FkLAorICAgICAgICAvLyBpdCdzIHRlbXB0aW5nIHRvIHVzZSBFbXB0eU1lc3NhZ2VJbXBsLCBidXQgaXQgZG9lc24ndCBwcmVzZXJlIHRoZSBpbmZvc2V0CisgICAgICAgIC8vIG9mIDxlbnZlbG9wZT4sPGhlYWRlcj4sIGFuZCA8Ym9keT4sIHNvIHdlIG5lZWQgdG8gc3RpY2sgdG8gU3RyZWFtTWVzc2FnZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWNvZGUoUmVhZGFibGVCeXRlQ2hhbm5lbCBpbiwgU3RyaW5nIGNvbnRlbnRUeXBlLCBQYWNrZXQgcGFja2V0ICkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyZWFtU09BUENvZGVjIGNvcHkoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgWE1MU3RyZWFtQnVmZmVyIGNhY2hlSGVhZGVycyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLAorICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VzLCBIZWFkZXJMaXN0IGhlYWRlcnMpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIGJ1ZmZlciA9IGNyZWF0ZVhNTFN0cmVhbUJ1ZmZlcigpOworICAgICAgICBTdHJlYW1SZWFkZXJCdWZmZXJDcmVhdG9yIGNyZWF0b3IgPSBuZXcgU3RyZWFtUmVhZGVyQnVmZmVyQ3JlYXRvcigpOworICAgICAgICBjcmVhdG9yLnNldFhNTFN0cmVhbUJ1ZmZlcihidWZmZXIpOworCisgICAgICAgIC8vIFJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBmaXJzdCBoZWFkZXIgYmxvY2sKKyAgICAgICAgd2hpbGUocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBoZWFkZXJCbG9ja05hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOworCisgICAgICAgICAgICAvLyBDb2xsZWN0IG5hbWVzcGFjZXMgb24gU09BUCBoZWFkZXIgYmxvY2sKKyAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJCbG9ja05hbWVzcGFjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPihuYW1lc3BhY2VzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2tOYW1lc3BhY2VzLnB1dChyZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpLCByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1hcmsKKyAgICAgICAgICAgIFhNTFN0cmVhbUJ1ZmZlciBtYXJrID0gbmV3IFhNTFN0cmVhbUJ1ZmZlck1hcmsoaGVhZGVyQmxvY2tOYW1lc3BhY2VzLCBjcmVhdG9yKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBIZWFkZXIKKyAgICAgICAgICAgIGhlYWRlcnMuYWRkKGNyZWF0ZUhlYWRlcihyZWFkZXIsIG1hcmspKTsKKworCisgICAgICAgICAgICAvLyBDYWNoZSB0aGUgaGVhZGVyIGJsb2NrCisgICAgICAgICAgICAvLyBBZnRlciBjYWNoaW5nIFJlYWRlciB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgbmV4dCBoZWFkZXIgYmxvY2sgb3IKKyAgICAgICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIDwvc29hcDpoZWFkZXI+CisgICAgICAgICAgICBjcmVhdG9yLmNyZWF0ZUVsZW1lbnRGcmFnbWVudChyZWFkZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEV2ZW50VHlwZSgpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgeworICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJlYW1IZWFkZXIgY3JlYXRlSGVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFhNTFN0cmVhbUJ1ZmZlciBtYXJrKTsKKworICAgIHByaXZhdGUgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBjcmVhdGVYTUxTdHJlYW1CdWZmZXIoKSB7CisgICAgICAgIC8vIFRPRE86IERlY29kZSBzaG91bGQgb3duIG9uZSBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIGZvciByZXVzZQorICAgICAgICAvLyBzaW5jZSBpdCBpcyBtb3JlIGVmZmljaWVudC4gSVNTVUU6IHBvc3NpYmxlIGlzc3VlIHdpdGgKKyAgICAgICAgLy8gbGlmZXRpbWUgb2YgaW5mb3JtYXRpb24gaW4gdGhlIGJ1ZmZlciBpZiBhY2Nlc3NlZCBiZXlvbmQKKyAgICAgICAgLy8gdGhlIHBpcGUgbGluZS4KKyAgICAgICAgcmV0dXJuIG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCk7CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU3RyZWFtU09BUENvZGVjfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmVhbVNPQVBDb2RlYyBjcmVhdGUoU09BUFZlcnNpb24gdmVyc2lvbikgeworICAgICAgICBpZih2ZXJzaW9uPT1udWxsKQorICAgICAgICAgICAgLy8gdGhpcyBkZWNvZGVyIGlzIGZvciBTT0FQLCBub3QgZm9yIFhNTC9IVFRQCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHN3aXRjaCh2ZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIFNPQVBfMTE6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1TT0FQMTFDb2RlYygpOworICAgICAgICAgICAgY2FzZSBTT0FQXzEyOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU09BUDEyQ29kZWMoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL1N3QUNvZGVjLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9Td0FDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzgwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9Td0FDb2RlYy5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZzsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29kZWM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29udGVudFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW0uU3RyZWFtQXR0YWNobWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIHtAbGluayBDb2RlY30gdGhhdCB1c2VzIE1JTUUvbXVsdGlwYXJ0IGFzIHRoZSBiYXNlIGZvcm1hdC4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3dBQ29kZWMgZXh0ZW5kcyBNaW1lQ29kZWMgeworCisgICAgcHVibGljIFN3QUNvZGVjKFNPQVBWZXJzaW9uIHZlcnNpb24sIENvZGVjIHJvb3RDb2RlYykgeworICAgICAgICBzdXBlcih2ZXJzaW9uKTsKKyAgICAgICAgdGhpcy5yb290Q29kZWMgPSByb290Q29kZWM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTd0FDb2RlYyhTd0FDb2RlYyB0aGF0KSB7CisgICAgICAgIHN1cGVyKHRoYXQpOworICAgICAgICB0aGlzLnJvb3RDb2RlYyA9IHRoYXQucm9vdENvZGVjLmNvcHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkZWNvZGUoTWltZU11bHRpcGFydFBhcnNlciBtcHAsIFBhY2tldCBwYWNrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBhdHRhY2htZW50cyBjb3JyZWN0bHkKKyAgICAgICAgU3RyZWFtQXR0YWNobWVudCByb290ID0gbXBwLmdldFJvb3RQYXJ0KCk7CisgICAgICAgIHJvb3RDb2RlYy5kZWNvZGUocm9vdC5hc0lucHV0U3RyZWFtKCkscm9vdC5nZXRDb250ZW50VHlwZSgpLHBhY2tldCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmVhbUF0dGFjaG1lbnQ+IGF0dHMgPSBtcHAuZ2V0QXR0YWNobWVudFBhcnRzKCk7CisgICAgICAgIGZvcihNYXAuRW50cnk8U3RyaW5nLCBTdHJlYW1BdHRhY2htZW50PiBhdHQgOiBhdHRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0QXR0YWNobWVudHMoKS5hZGQoYXR0LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbnRlbnRUeXBlIGVuY29kZShQYWNrZXQgcGFja2V0LCBXcml0YWJsZUJ5dGVDaGFubmVsIGJ1ZmZlcikgeworICAgICAgICAvL1RPRE86IG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFN3QUNvZGVjIGNvcHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3dBQ29kZWModGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvVGFnSW5mb3NldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvVGFnSW5mb3NldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZDA3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9UYWdJbmZvc2V0LmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZzsKKworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnN0cmVhbS5TdHJlYW1NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLlN0cmVhbVNPQVBDb2RlYzsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworCisvKioKKyAqIENvbXBsZXRlIGluZm9zZXQgYWJvdXQgYSBzdGFydCB0YWcuCisgKgorICogPHA+CisgKiBUaGlzIGlzIHVzZWQgYmV0d2VlbiB7QGxpbmsgU3RyZWFtTWVzc2FnZX0gYW5kIHtAbGluayBTdHJlYW1TT0FQQ29kZWN9CisgKiB0byBjYXB0dXJlIHRoZSBpbmZvc2V0IG9mIHRoZSBzOkVudmVsb3BlLCBzOkhlYWRlciwgYW5kIHM6Qm9keSBlbGVtZW50cy4KKyAqCisgKgorICogPGgzPkRlc2lnbiBOb3RlPC9oMz4KKyAqIDxwPgorICogU2luY2UgU3RBWCBhbmQgU0FYIHVzZXMgZGlmZmVyZW50IG51bGwgdnMgZW1wdHkgc3RyaW5nIGNvbnZlbnRpb24sIG9uZSBoYXMKKyAqIHRvIGNob29zZSB3aGljaCBmb3JtYXQgd2Ugc3RvcmUgdGhpbmdzLiBJdCBjYW4gZ28gZWl0aGVyIHdheSwgYnV0IEknbSBhc3N1bWluZworICogdGhhdCB3ZSdsbCBiZSB1c2luZyBTdEFYIG1vcmUgaW4gSkFYLVdTLCBzbyB0aGluZ3MgYXJlIGtlcHQgaW4gdGhlIFN0QVggc3R5bGUKKyAqIGluIHRoaXMgY2xhc3MuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGFnSW5mb3NldCB7CisgICAgLyoqCisgICAgICogTmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBvbiB0aGlzIHRhZy4gUmVhZC1vbmx5LgorICAgICAqCisgICAgICogVVJJcy9wcmVmaXhlcyBjYW4gYmUgbnVsbCAoU3RBWC1zdHlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQE5vdE51bGwgU3RyaW5nW10gbnM7CisgICAgLyoqCisgICAgICogQXR0cmlidXRlcyBvbiB0aGlzIHRhZy4gUmVhZC1vbmx5LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBATm90TnVsbCBBdHRyaWJ1dGVzSW1wbCBhdHRzOworCisgICAgLyoqCisgICAgICogUHJlZml4IG9mIHRoZSBzdGFydCB0YWcgaW4gc3RheC1zdHlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQE51bGxhYmxlIFN0cmluZyBwcmVmaXg7CisKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2UgVVJJIG9mIHRoZSBzdGFydCB0YWcgaW4gc3RheC1zdHlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQE51bGxhYmxlIFN0cmluZyBuc1VyaTsKKworICAgIC8qKgorICAgICAqIExvY2FsIG5hbWUgb2YgdGhlIHN0YXJ0IHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQE5vdE51bGwgU3RyaW5nIGxvY2FsTmFtZTsKKworICAgIC8qKgorICAgICAqIExhemlseSBjb21wdXRlZCBRTmFtZSAoaS5lLiwgImZvbzpiYXIiKQorICAgICAqLworICAgIHByaXZhdGUgQE51bGxhYmxlIFN0cmluZyBxbmFtZTsKKworICAgIHB1YmxpYyBUYWdJbmZvc2V0KFN0cmluZyBuc1VyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlc0ltcGwgYXR0cywgU3RyaW5nLi4uIG5zKSB7CisgICAgICAgIHRoaXMubnNVcmkgPSBuc1VyaTsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworICAgICAgICB0aGlzLmF0dHMgPSBhdHRzOworICAgICAgICB0aGlzLm5zID0gbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsbHMgYSB7QGxpbmsgVGFnSW5mb3NldH0gb2JqZWN0IGJ5IHRoZSBjdXJyZW50IGVsZW1lbnQKKyAgICAgKiB0aGF0IHRoZSByZWFkZXIgcG9pbnRzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBUYWdJbmZvc2V0KFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcHJlZml4ID0gcmVhZGVyLmdldFByZWZpeCgpOworICAgICAgICBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgbG9jYWxOYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOworCisgICAgICAgIGludCBuc2MgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKTsKKyAgICAgICAgaWYobnNjPjApIHsKKyAgICAgICAgICAgIG5zID0gbmV3IFN0cmluZ1tuc2MqMl07CisgICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxuc2M7IGkrKyl7CisgICAgICAgICAgICAgICAgbnNbaSoyICBdID0gZml4TnVsbChyZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpKTsKKyAgICAgICAgICAgICAgICBuc1tpKjIrMV0gPSBmaXhOdWxsKHJlYWRlci5nZXROYW1lc3BhY2VVUkkoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnMgPSBFTVBUWV9BUlJBWTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBhYyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOworICAgICAgICBpZihhYz4wKSB7CisgICAgICAgICAgICBhdHRzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPCBhYztpKyspeworICAgICAgICAgICAgICAgIHNiLnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZTsKKyAgICAgICAgICAgICAgICBpZihwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkhPTApeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsb2NhbE5hbWUpOworICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXR0cy5hZGRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIGZpeE51bGwocmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKSksCisgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcW5hbWUsCisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVUeXBlKGkpLAorICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXR0cyA9IEVNUFRZX0FUVFJJQlVURVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHN0YXJ0IGVsZW1lbnQgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVTdGFydChDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciggaW50IGk9MDsgaTxucy5sZW5ndGg7IGkrPTIgKQorICAgICAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKGZpeE51bGwobnNbaV0pLGZpeE51bGwobnNbaSsxXSkpOworICAgICAgICBjb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQoZml4TnVsbChuc1VyaSksIGxvY2FsTmFtZSAsZ2V0UU5hbWUoKSwgYXR0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBlbmQgZWxlbWVudCBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZChDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbnsKKyAgICAgICAgY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChmaXhOdWxsKG5zVXJpKSxsb2NhbE5hbWUsZ2V0UU5hbWUoKSk7CisgICAgICAgIGZvciggaW50IGk9bnMubGVuZ3RoLTI7IGk+PTA7IGktPTIgKSB7CisgICAgICAgICAgICBjb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKGZpeE51bGwobnNbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgc3RhcnQgZWxlbWVudCBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0KFhNTFN0cmVhbVdyaXRlciB3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gd3JpdGUgc3RhcnQgdGFnLiBBcnJyZ2dnZ2hoaCEhCisgICAgICAgIGlmKHByZWZpeD09bnVsbCkgeworICAgICAgICAgICAgaWYobnNVcmk9PW51bGwpCisgICAgICAgICAgICAgICAgdy53cml0ZVN0YXJ0RWxlbWVudChsb2NhbE5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQobnNVcmksbG9jYWxOYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LGxvY2FsTmFtZSxuc1VyaSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGludCBpPTA7IGk8bnMubGVuZ3RoOyBpKz0yICkgeworICAgICAgICAgICAgdy53cml0ZU5hbWVzcGFjZShuc1tpXSxuc1tpKzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaW50IGk9MDsgaTxhdHRzLmdldExlbmd0aCgpOyBpKysgKSB7CisgICAgICAgICAgICBTdHJpbmcgbnNVcmkgPSBhdHRzLmdldFVSSShpKTsKKyAgICAgICAgICAgIGlmKG5zVXJpPT1udWxsIHx8IG5zVXJpLmxlbmd0aCgpID09MCkgeworICAgICAgICAgICAgICAgIHcud3JpdGVBdHRyaWJ1dGUoYXR0cy5nZXRMb2NhbE5hbWUoaSksYXR0cy5nZXRWYWx1ZShpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyByYXdOYW1lID0gYXR0cy5nZXRRTmFtZShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcmF3TmFtZS5zdWJzdHJpbmcoMCxyYXdOYW1lLmluZGV4T2YoJzonKSk7CisgICAgICAgICAgICAgICAgdy53cml0ZUF0dHJpYnV0ZShwcmVmaXgsbnNVcmksYXR0cy5nZXRMb2NhbE5hbWUoaSksYXR0cy5nZXRWYWx1ZShpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRRTmFtZSgpIHsKKyAgICAgICAgaWYocW5hbWUhPW51bGwpIHJldHVybiBxbmFtZTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYocHJlZml4IT1udWxsKXsKKyAgICAgICAgICAgIHNiLmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICBzYi5hcHBlbmQobG9jYWxOYW1lKTsKKyAgICAgICAgICAgIHFuYW1lID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHFuYW1lID0gbG9jYWxOYW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBxbmFtZTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYocz09bnVsbCkgcmV0dXJuICIiOworICAgICAgICBlbHNlICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9BUlJBWSA9IG5ldyBTdHJpbmdbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXR0cmlidXRlc0ltcGwgRU1QVFlfQVRUUklCVVRFUyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvWE1MSFRUUEJpbmRpbmdDb2RlYy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvWE1MSFRUUEJpbmRpbmdDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzUxYmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9YTUxIVFRQQmluZGluZ0NvZGVjLmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZzsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnV0aWwuQnl0ZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5Db250ZW50TmVnb3RpYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTENvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxNZXNzYWdlLk1lc3NhZ2VEYXRhU291cmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxNZXNzYWdlLlVua25vd25Db250ZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxNZXNzYWdlLlhNTE11bHRpUGFydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuU3RyZWFtaW5nTWVzc2FnZXM7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKgorICogWE1MIChpbmZvc2V0KSBvdmVyIEhUVFAgYmluZGluZyB7QGxpbmsgQ29kZWN9LgorICogPHA+CisgKiBUT0RPOiBTdXBwb3J0IEZJIGZvciBtdWx0aXBhcnQvcmVsYXRlZAorICogICAgICAgU3VwcG9ydCBGSSBmb3IgTWVzc2FnZURhdGFTb3VyY2UKKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgWE1MSFRUUEJpbmRpbmdDb2RlYyBleHRlbmRzIE1pbWVDb2RlYyB7CisgICAgLyoqCisgICAgICogQmFzZSBIVFRQIEFjY2VwdCByZXF1ZXN0LWhlYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9BQ0NFUFRfVkFMVUUgPQorICAgICAgICAiKiI7CisKKyAgICAvKioKKyAgICAgKiBGYXN0IEluZm9zZXQgTUlNRSB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9GQVNUX0lORk9TRVRfTUlNRV9UWVBFID0KKyAgICAgICAgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IjsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIEZhc3QgSW5mb3NldCBjb2RlYyBzaG91bGQgYmUgdXNlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nOworCisgICAgLyoqCisgICAgICogVGhlIFhNTCBjb2RlYworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ29kZWMgeG1sQ29kZWM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgRkkgY29kZWMKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENvZGVjIGZpQ29kZWM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQWNjZXB0IGhlYWRlciBmb3IgWE1MIGVuY29kaW5ncworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHhtbEFjY2VwdDsKKworICAgIC8qKgorICAgICAqIFRoZSBBY2NlcHQgaGVhZGVyIGZvciBGYXN0IEluZm9zZXQgYW5kIFhNTCBlbmNvZGluZ3MKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaVhtbEFjY2VwdDsKKworICAgIHByaXZhdGUgY2xhc3MgQWNjZXB0Q29udGVudFR5cGUgaW1wbGVtZW50cyBDb250ZW50VHlwZSB7CisgICAgICAgIHByaXZhdGUgQ29udGVudFR5cGUgX2M7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIF9hY2NlcHQ7CisKKyAgICAgICAgcHVibGljIEFjY2VwdENvbnRlbnRUeXBlIHNldChQYWNrZXQgcCwgQ29udGVudFR5cGUgYykgeworICAgICAgICAgICAgLy8gVE9ETzogbmVlZCB0byBjb21wb3NlIGJhc2VkIG9uIHVuZGVybHlpbmcgY29kZWNzCisgICAgICAgICAgICBpZiAocC5jb250ZW50TmVnb3RpYXRpb24gPT0gQ29udGVudE5lZ290aWF0aW9uLm9wdGltaXN0aWMKKyAgICAgICAgICAgICAgICAgICAgfHwgcC5jb250ZW50TmVnb3RpYXRpb24gPT0gQ29udGVudE5lZ290aWF0aW9uLnBlc3NpbWlzdGljKSB7CisgICAgICAgICAgICAgICAgX2FjY2VwdCA9IGZpWG1sQWNjZXB0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfYWNjZXB0ID0geG1sQWNjZXB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2MgPSBjOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIF9jLmdldENvbnRlbnRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNPQVBBY3Rpb25IZWFkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gX2MuZ2V0U09BUEFjdGlvbkhlYWRlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBY2NlcHRIZWFkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gX2FjY2VwdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQWNjZXB0Q29udGVudFR5cGUgX2FkYXB0aW5nQ29udGVudFR5cGUgPSBuZXcgQWNjZXB0Q29udGVudFR5cGUoKTsKKworICAgIHB1YmxpYyBYTUxIVFRQQmluZGluZ0NvZGVjKCkgeworICAgICAgICBzdXBlcihTT0FQVmVyc2lvbi5TT0FQXzExKTsKKworICAgICAgICB4bWxDb2RlYyA9IG5ldyBYTUxDb2RlYygpOworCisgICAgICAgIGZpQ29kZWMgPSBnZXRGSUNvZGVjKCk7CisKKyAgICAgICAgeG1sQWNjZXB0ID0gbnVsbDsKKworICAgICAgICBmaVhtbEFjY2VwdCA9IEFQUExJQ0FUSU9OX0ZBU1RfSU5GT1NFVF9NSU1FX1RZUEUgKyAiLCAiICsKKyAgICAgICAgICAgICAgICBCQVNFX0FDQ0VQVF9WQUxVRTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29udGVudFR5cGUgZ2V0U3RhdGljQ29udGVudFR5cGUoUGFja2V0IHBhY2tldCkgeworICAgICAgICBzZXRSb290Q29kZWMocGFja2V0KTsKKworICAgICAgICBDb250ZW50VHlwZSBjdCA9IG51bGw7CisgICAgICAgIGlmIChwYWNrZXQuZ2V0TWVzc2FnZSgpIGluc3RhbmNlb2YgTWVzc2FnZURhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VEYXRhU291cmNlIG1kcyA9IChNZXNzYWdlRGF0YVNvdXJjZSlwYWNrZXQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgaWYgKG1kcy5oYXNVbmNvbnN1bWVkRGF0YVNvdXJjZSgpKSB7CisgICAgICAgICAgICAgICAgY3QgPSBnZXRTdGF0aWNDb250ZW50VHlwZShtZHMpOworICAgICAgICAgICAgICAgIHJldHVybiAoY3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyBfYWRhcHRpbmdDb250ZW50VHlwZS5zZXQocGFja2V0LCBjdCkKKyAgICAgICAgICAgICAgICAgICAgOiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3QgPSBzdXBlci5nZXRTdGF0aWNDb250ZW50VHlwZShwYWNrZXQpOworICAgICAgICByZXR1cm4gKGN0ICE9IG51bGwpCisgICAgICAgICAgICA/IF9hZGFwdGluZ0NvbnRlbnRUeXBlLnNldChwYWNrZXQsIGN0KQorICAgICAgICAgICAgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250ZW50VHlwZSBlbmNvZGUoUGFja2V0IHBhY2tldCwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0Um9vdENvZGVjKHBhY2tldCk7CisKKyAgICAgICAgaWYgKHBhY2tldC5nZXRNZXNzYWdlKCkgaW5zdGFuY2VvZiBNZXNzYWdlRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgZmluYWwgTWVzc2FnZURhdGFTb3VyY2UgbWRzID0gKE1lc3NhZ2VEYXRhU291cmNlKXBhY2tldC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBpZiAobWRzLmhhc1VuY29uc3VtZWREYXRhU291cmNlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9hZGFwdGluZ0NvbnRlbnRUeXBlLnNldChwYWNrZXQsIGVuY29kZShtZHMsIG91dCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9hZGFwdGluZ0NvbnRlbnRUeXBlLnNldChwYWNrZXQsIHN1cGVyLmVuY29kZShwYWNrZXQsIG91dCkpOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50VHlwZSBlbmNvZGUoUGFja2V0IHBhY2tldCwgV3JpdGFibGVCeXRlQ2hhbm5lbCBidWZmZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVjb2RlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgY29udGVudFR5cGUsIFBhY2tldCBwYWNrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNldCB0aGUgZW5jb2Rpbmcgc3RhdGUgd2hlbiBvbiB0aGUgc2VydmVyIHNpZGUgZm9yIGVhY2gKKyAgICAgICAgICogZGVjb2RlL2VuY29kZSBzdGVwLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBhY2tldC5jb250ZW50TmVnb3RpYXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHVzZUZhc3RJbmZvc2V0Rm9yRW5jb2RpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgeG1sQ29kZWMuZGVjb2RlKGluLCBjb250ZW50VHlwZSwgcGFja2V0KTsKKyAgICAgICAgfSBlbHNlIGlmIChpc011bHRpcGFydFJlbGF0ZWQoY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICBwYWNrZXQuc2V0TWVzc2FnZShuZXcgWE1MTXVsdGlQYXJ0KGNvbnRlbnRUeXBlLCBpbikpOworICAgICAgICB9IGVsc2UgaWYoaXNGYXN0SW5mb3NldChjb250ZW50VHlwZSkpIHsKKyAgICAgICAgICAgIGlmIChmaUNvZGVjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJlYW1pbmdNZXNzYWdlcy5GQVNUSU5GT1NFVF9OT19JTVBMRU1FTlRBVElPTigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNlRmFzdEluZm9zZXRGb3JFbmNvZGluZyA9IHRydWU7CisgICAgICAgICAgICBmaUNvZGVjLmRlY29kZShpbiwgY29udGVudFR5cGUsIHBhY2tldCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNYbWwoY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICB4bWxDb2RlYy5kZWNvZGUoaW4sIGNvbnRlbnRUeXBlLCBwYWNrZXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFja2V0LnNldE1lc3NhZ2UobmV3IFVua25vd25Db250ZW50KGNvbnRlbnRUeXBlLCBpbikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nKSB7CisgICAgICAgICAgICB1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nID0gaXNGYXN0SW5mb3NldEFjY2VwdGFibGUocGFja2V0LmFjY2VwdGFibGVNaW1lVHlwZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlKE1pbWVNdWx0aXBhcnRQYXJzZXIgbXBwLCBQYWNrZXQgcGFja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGludm9rZWQKKyAgICB9CisKKyAgICBwdWJsaWMgTWltZUNvZGVjIGNvcHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgWE1MSFRUUEJpbmRpbmdDb2RlYygpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc011bHRpcGFydFJlbGF0ZWQoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHJldHVybiBjb21wYXJlU3RyaW5ncyhjb250ZW50VHlwZSwgTWltZUNvZGVjLk1VTFRJUEFSVF9SRUxBVEVEX01JTUVfVFlQRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQXBwbGljYXRpb25Yb3BYbWwoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHJldHVybiBjb21wYXJlU3RyaW5ncyhjb250ZW50VHlwZSwgTXRvbUNvZGVjLlhPUF9YTUxfTUlNRV9UWVBFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNYbWwoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHJldHVybiBjb21wYXJlU3RyaW5ncyhjb250ZW50VHlwZSwgWE1MQ29kZWMuWE1MX0FQUExJQ0FUSU9OX01JTUVfVFlQRSkKKyAgICAgICAgICAgICAgICB8fCBjb21wYXJlU3RyaW5ncyhjb250ZW50VHlwZSwgWE1MQ29kZWMuWE1MX1RFWFRfTUlNRV9UWVBFKQorICAgICAgICAgICAgICAgIHx8IChjb21wYXJlU3RyaW5ncyhjb250ZW50VHlwZSwgImFwcGxpY2F0aW9uLyIpJiYoY29udGVudFR5cGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIreG1sIikgIT0gLTEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNGYXN0SW5mb3NldChTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGNvbnRlbnRUeXBlLCBBUFBMSUNBVElPTl9GQVNUX0lORk9TRVRfTUlNRV9UWVBFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZVN0cmluZ3MoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisgICAgICAgIHJldHVybiBhLmxlbmd0aCgpID49IGIubGVuZ3RoKCkgJiYKKyAgICAgICAgICAgICAgICBiLmVxdWFsc0lnbm9yZUNhc2UoCisgICAgICAgICAgICAgICAgICAgIGEuc3Vic3RyaW5nKDAsCisgICAgICAgICAgICAgICAgICAgICAgICBiLmxlbmd0aCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRmFzdEluZm9zZXRBY2NlcHRhYmxlKFN0cmluZyBhY2NlcHQpIHsKKyAgICAgICAgaWYgKGFjY2VwdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY2NlcHQsICIsIik7CisgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi5lcXVhbHNJZ25vcmVDYXNlKEFQUExJQ0FUSU9OX0ZBU1RfSU5GT1NFVF9NSU1FX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgQ29udGVudFR5cGUgZ2V0U3RhdGljQ29udGVudFR5cGUoTWVzc2FnZURhdGFTb3VyY2UgbWRzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZSA9IG1kcy5nZXREYXRhU291cmNlKCkuZ2V0Q29udGVudFR5cGUoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0ID0gWE1MTWVzc2FnZS5pc0Zhc3RJbmZvc2V0KGNvbnRlbnRUeXBlKTsKKworICAgICAgICBpZiAoIXJlcXVpcmVzVHJhbnNmb3JtYXRpb25PZkRhdGFTb3VyY2UoaXNGYXN0SW5mb3NldCwKKyAgICAgICAgICAgICAgICB1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50VHlwZUltcGwoY29udGVudFR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRlbnRUeXBlIGVuY29kZShNZXNzYWdlRGF0YVNvdXJjZSBtZHMsIE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNGYXN0SW5mb3NldCA9IFhNTE1lc3NhZ2UuaXNGYXN0SW5mb3NldCgKKyAgICAgICAgICAgICAgICAgICAgbWRzLmdldERhdGFTb3VyY2UoKS5nZXRDb250ZW50VHlwZSgpKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2UgZHMgPSB0cmFuc2Zvcm1EYXRhU291cmNlKG1kcy5nZXREYXRhU291cmNlKCksCisgICAgICAgICAgICAgICAgICAgIGlzRmFzdEluZm9zZXQsIHVzZUZhc3RJbmZvc2V0Rm9yRW5jb2RpbmcpOworCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGRzLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICB3aGlsZSgoY291bnQ9aXMucmVhZChidWYpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGVudFR5cGVJbXBsKGRzLmdldENvbnRlbnRUeXBlKCkpOworICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRSb290Q29kZWMoUGFja2V0IHApIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgbG9naWMgaXMgb25seSBmb3Igb3V0Ym91bmQgcGFja2V0cworICAgICAgICAgKiB0byBiZSBlbmNvZGVkIGJ5IGNsaWVudC4KKyAgICAgICAgICogT24gdGhlIHNlcnZlciB0aGUgcC5jb250ZW50TmVnb3RpYXRpb24gPT0gbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwLmNvbnRlbnROZWdvdGlhdGlvbiA9PSBDb250ZW50TmVnb3RpYXRpb24ubm9uZSkgeworICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBuZWdvdGlhdGlvbiBwcm9wZXJ0eSBmcm9tCisgICAgICAgICAgICAvLyBwZXNzaXNtaXN0aWMgdG8gbm9uZSBiZXR3ZWVuIGludm9jYXRpb25zCisgICAgICAgICAgICB1c2VGYXN0SW5mb3NldEZvckVuY29kaW5nID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAocC5jb250ZW50TmVnb3RpYXRpb24gPT0gQ29udGVudE5lZ290aWF0aW9uLm9wdGltaXN0aWMpIHsKKyAgICAgICAgICAgIC8vIEFsd2F5cyBlbmNvZGUgdXNpbmcgRmFzdCBJbmZvc2V0IGlmIGluIG9wdGltaXNpdGljIG1vZGUKKyAgICAgICAgICAgIHVzZUZhc3RJbmZvc2V0Rm9yRW5jb2RpbmcgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcm9vdENvZGVjID0gKHVzZUZhc3RJbmZvc2V0Rm9yRW5jb2RpbmcgJiYgZmlDb2RlYyAhPSBudWxsKQorICAgICAgICAgICAgPyBmaUNvZGVjIDogeG1sQ29kZWM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlcXVpcmVzVHJhbnNmb3JtYXRpb25PZkRhdGFTb3VyY2UoCisgICAgICAgICAgICBib29sZWFuIGlzRmFzdEluZm9zZXQsIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQpIHsKKyAgICAgICAgcmV0dXJuIChpc0Zhc3RJbmZvc2V0ICYmICF1c2VGYXN0SW5mb3NldCkgfHwgKCFpc0Zhc3RJbmZvc2V0ICYmIHVzZUZhc3RJbmZvc2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERhdGFTb3VyY2UgdHJhbnNmb3JtRGF0YVNvdXJjZShEYXRhU291cmNlIGluLAorICAgICAgICAgICAgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0LCBib29sZWFuIHVzZUZhc3RJbmZvc2V0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNGYXN0SW5mb3NldCAmJiAhdXNlRmFzdEluZm9zZXQpIHsKKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGZyb20gRmFzdCBJbmZvc2V0IHRvIFhNTAorICAgICAgICAgICAgICAgIENvZGVjIGNvZGVjID0gbmV3IFhNTEhUVFBCaW5kaW5nQ29kZWMoKTsKKyAgICAgICAgICAgICAgICBQYWNrZXQgcCA9IG5ldyBQYWNrZXQoKTsKKyAgICAgICAgICAgICAgICBjb2RlYy5kZWNvZGUoaW4uZ2V0SW5wdXRTdHJlYW0oKSwgaW4uZ2V0Q29udGVudFR5cGUoKSwgcCk7CisKKyAgICAgICAgICAgICAgICBwLmdldE1lc3NhZ2UoKS5nZXRBdHRhY2htZW50cygpOworICAgICAgICAgICAgICAgIGNvZGVjLmdldFN0YXRpY0NvbnRlbnRUeXBlKHApOworCisgICAgICAgICAgICAgICAgQnl0ZU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlIGN0ID0gY29kZWMuZW5jb2RlKHAsIGJvcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTE1lc3NhZ2UuY3JlYXRlRGF0YVNvdXJjZShjdC5nZXRDb250ZW50VHlwZSgpLCBib3MubmV3SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Zhc3RJbmZvc2V0ICYmIHVzZUZhc3RJbmZvc2V0KSB7CisgICAgICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFhNTCB0byBGYXN0IEluZm9zZXQKKyAgICAgICAgICAgICAgICBDb2RlYyBjb2RlYyA9IG5ldyBYTUxIVFRQQmluZGluZ0NvZGVjKCk7CisgICAgICAgICAgICAgICAgUGFja2V0IHAgPSBuZXcgUGFja2V0KCk7CisgICAgICAgICAgICAgICAgY29kZWMuZGVjb2RlKGluLmdldElucHV0U3RyZWFtKCksIGluLmdldENvbnRlbnRUeXBlKCksIHApOworCisgICAgICAgICAgICAgICAgcC5jb250ZW50TmVnb3RpYXRpb24gPSBDb250ZW50TmVnb3RpYXRpb24ub3B0aW1pc3RpYzsKKyAgICAgICAgICAgICAgICBwLmdldE1lc3NhZ2UoKS5nZXRBdHRhY2htZW50cygpOworICAgICAgICAgICAgICAgIGNvZGVjLmdldFN0YXRpY0NvbnRlbnRUeXBlKHApOworCisgICAgICAgICAgICAgICAgQnl0ZU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlIGN0ID0gY29kZWMuZW5jb2RlKHAsIGJvcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTE1lc3NhZ2UuY3JlYXRlRGF0YVNvdXJjZShjdC5nZXRDb250ZW50VHlwZSgpLCBib3MubmV3SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWluIGFuIEZJIFNPQVAgY29kZWMgaW5zdGFuY2UgdXNpbmcgcmVmbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb2RlYyBnZXRGSUNvZGVjKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoImNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0Q29kZWMiKTsKKyAgICAgICAgICAgIE1ldGhvZCBtID0gYy5nZXRNZXRob2QoImNyZWF0ZSIpOworICAgICAgICAgICAgcmV0dXJuIChDb2RlYyltLmludm9rZShudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRDb2RlYy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzQ1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9mYXN0aW5mb3NldC9GYXN0SW5mb3NldENvZGVjLmphdmEKQEAgLTAsMCArMSwyODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuZmFzdGluZm9zZXQ7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFNlcmlhbGl6ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5TdEFYRG9jdW1lbnRQYXJzZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQudm9jYWIuUGFyc2VyVm9jYWJ1bGFyeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC52b2NhYi5TZXJpYWxpemVyVm9jYWJ1bGFyeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db250ZW50VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuQ29udGVudFR5cGVJbXBsOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0U291cmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5mYXN0aW5mb3NldC5zdGF4LkZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyOworCisvKioKKyAqIEEgY29kZWMgZm9yIGVuY29kaW5nL2RlY29kaW5nIFhNTCBpbmZvc2V0cyB0by9mcm9tIGZhc3QKKyAqIGluZm9zZXQgZG9jdW1lbnRzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEZhc3RJbmZvc2V0Q29kZWMgaW1wbGVtZW50cyBDb2RlYyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5ERVhFRF9TVFJJTkdfU0laRV9MSU1JVCA9IDMyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOREVYRURfU1RSSU5HX01FTU9SWV9MSU1JVCA9IDQgKiAxMDI0ICogMTAyNDsgLy80TSBsaW1pdAorCisgICAgcHJpdmF0ZSBTdEFYRG9jdW1lbnRQYXJzZXIgX3BhcnNlcjsKKworICAgIHByaXZhdGUgU3RBWERvY3VtZW50U2VyaWFsaXplciBfc2VyaWFsaXplcjsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfcmV0YWluU3RhdGU7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRUeXBlIF9jb250ZW50VHlwZTsKKworICAgIC8qIHBhY2thZ2UgKi8gRmFzdEluZm9zZXRDb2RlYyhib29sZWFuIHJldGFpblN0YXRlKSB7CisgICAgICAgIF9yZXRhaW5TdGF0ZSA9IHJldGFpblN0YXRlOworICAgICAgICBfY29udGVudFR5cGUgPSAocmV0YWluU3RhdGUpID8gbmV3IENvbnRlbnRUeXBlSW1wbChGYXN0SW5mb3NldE1JTUVUeXBlcy5TVEFURUZVTF9JTkZPU0VUKSA6CisgICAgICAgICAgICBuZXcgQ29udGVudFR5cGVJbXBsKEZhc3RJbmZvc2V0TUlNRVR5cGVzLklORk9TRVQpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBfY29udGVudFR5cGUuZ2V0Q29udGVudFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29kZWMgY29weSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGYXN0SW5mb3NldENvZGVjKF9yZXRhaW5TdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIENvbnRlbnRUeXBlIGdldFN0YXRpY0NvbnRlbnRUeXBlKFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgcmV0dXJuIF9jb250ZW50VHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGVudFR5cGUgZW5jb2RlKFBhY2tldCBwYWNrZXQsIE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gcGFja2V0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmhhc1BheWxvYWQoKSkgeworICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IGdldFhNTFN0cmVhbVdyaXRlcihvdXQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgcGFja2V0LmdldE1lc3NhZ2UoKS53cml0ZVBheWxvYWRUbyh3cml0ZXIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9jb250ZW50VHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGVudFR5cGUgZW5jb2RlKFBhY2tldCBwYWNrZXQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgYnVmZmVyKSB7CisgICAgICAgIC8vVE9ETzogbm90IHlldCBpbXBsZW1lbnRlZAorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWNvZGUoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBjb250ZW50VHlwZSwgUGFja2V0IHBhY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLyogSW1wbGVtZW50cyBzaW1pbGFyIGxvZ2ljIGFzIHRoZSBYTUxNZXNzYWdlLmNyZWF0ZShTdHJpbmcsIElucHV0U3RyZWFtKS4KKyAgICAgICAgICogQnV0IGl0J3MgZmFzdGVyLCBhcyB3ZSBrbm93IHRoZSBJbnB1dFN0cmVhbSBoYXMgRmFzdEluZm9zZXQgY29udGVudCovCisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7CisgICAgICAgIGluID0gaGFzU29tZURhdGEoaW4pOworICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VzLmNyZWF0ZVVzaW5nUGF5bG9hZChuZXcgRmFzdEluZm9zZXRTb3VyY2UoaW4pLAorICAgICAgICAgICAgICAgICAgICBTT0FQVmVyc2lvbi5TT0FQXzExKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlcy5jcmVhdGVFbXB0eShTT0FQVmVyc2lvbi5TT0FQXzExKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhY2tldC5zZXRNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlY29kZShSZWFkYWJsZUJ5dGVDaGFubmVsIGluLCBTdHJpbmcgY29udGVudFR5cGUsIFBhY2tldCByZXNwb25zZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFhNTFN0cmVhbVdyaXRlciBnZXRYTUxTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICBpZiAoX3NlcmlhbGl6ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgX3NlcmlhbGl6ZXIuc2V0T3V0cHV0U3RyZWFtKG91dCk7CisgICAgICAgICAgICByZXR1cm4gX3NlcmlhbGl6ZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gX3NlcmlhbGl6ZXIgPSBjcmVhdGVOZXdTdHJlYW1Xcml0ZXIob3V0LCBfcmV0YWluU3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBYTUxTdHJlYW1SZWFkZXIgZ2V0WE1MU3RyZWFtUmVhZGVyKElucHV0U3RyZWFtIGluKSB7CisgICAgICAgIGlmIChfcGFyc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9wYXJzZXIuc2V0SW5wdXRTdHJlYW0oaW4pOworICAgICAgICAgICAgcmV0dXJuIF9wYXJzZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gX3BhcnNlciA9IGNyZWF0ZU5ld1N0cmVhbVJlYWRlcihpbiwgX3JldGFpblN0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEZhc3RJbmZvc2V0Q29kZWN9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgRmFzdEluZm9zZXRDb2RlY30gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGYXN0SW5mb3NldENvZGVjIGNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRmFzdEluZm9zZXRDb2RlY30gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0YWluU3RhdGUgaWYgdHJ1ZSB0aGUgQ29kZWMgc2hvdWxkIHJldGFpbiB0aGUgc3RhdGUgb2YKKyAgICAgKiAgICAgICAgdm9jYWJ1bGFyeSB0YWJsZXMgZm9yIG11bHRpcGxlIGVuY29kZS9kZWNvZGUgaW52b2NhdGlvbnMuCisgICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgRmFzdEluZm9zZXRDb2RlY30gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGYXN0SW5mb3NldENvZGVjIGNyZWF0ZShib29sZWFuIHJldGFpblN0YXRlKSB7CisgICAgICAgIHJldHVybiBuZXcgRmFzdEluZm9zZXRDb2RlYyhyZXRhaW5TdGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IChAbGluayBTdEFYRG9jdW1lbnRTZXJpYWxpemVyfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgT3V0cHV0U3RyZWFtIHRvIHNlcmlhbGl6ZSB0by4KKyAgICAgKiBAcGFyYW0gcmV0YWluU3RhdGUgaWYgdHJ1ZSB0aGUgc2VyaWFsaXplciBzaG91bGQgcmV0YWluIHRoZSBzdGF0ZSBvZgorICAgICAqICAgICAgICB2b2NhYnVsYXJ5IHRhYmxlcyBmb3IgbXVsdGlwbGUgc2VyaWFsaXphdGlvbnMuCisgICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgU3RBWERvY3VtZW50U2VyaWFsaXplcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgU3RBWERvY3VtZW50U2VyaWFsaXplciBjcmVhdGVOZXdTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiByZXRhaW5TdGF0ZSkgeworICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RyZWFtV3JpdGVyKG91dCwgcmV0YWluU3RhdGUsIERFRkFVTFRfSU5ERVhFRF9TVFJJTkdfU0laRV9MSU1JVCwgREVGQVVMVF9JTkRFWEVEX1NUUklOR19NRU1PUllfTElNSVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyAoQGxpbmsgU3RBWERvY3VtZW50U2VyaWFsaXplcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gdGhlIE91dHB1dFN0cmVhbSB0byBzZXJpYWxpemUgdG8uCisgICAgICogQHBhcmFtIHJldGFpblN0YXRlIGlmIHRydWUgdGhlIHNlcmlhbGl6ZXIgc2hvdWxkIHJldGFpbiB0aGUgc3RhdGUgb2YKKyAgICAgKiAgICAgICAgdm9jYWJ1bGFyeSB0YWJsZXMgZm9yIG11bHRpcGxlIHNlcmlhbGl6YXRpb25zLgorICAgICAqIEByZXR1cm4gYSBuZXcge0BsaW5rIFN0QVhEb2N1bWVudFNlcmlhbGl6ZXJ9IGluc3RhbmNlLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIgY3JlYXRlTmV3U3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQsCisgICAgICAgICAgICBib29sZWFuIHJldGFpblN0YXRlLCBpbnQgaW5kZXhlZFN0cmluZ1NpemVMaW1pdCwgaW50IHN0cmluZ3NNZW1vcnlMaW1pdCkgeworICAgICAgICBTdEFYRG9jdW1lbnRTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgU3RBWERvY3VtZW50U2VyaWFsaXplcihvdXQpOworICAgICAgICBpZiAocmV0YWluU3RhdGUpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ3JlYXRlIGEgc2VyaWFsaXplciB2b2NhYnVsYXJ5IGV4dGVybmFsIHRvIHRoZSBzZXJpYWxpemVyLgorICAgICAgICAgICAgICogVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSB2b2NhYnVsYXJ5IHdpbGwgbmV2ZXIgYmUgY2xlYXJlZAorICAgICAgICAgICAgICogZm9yIGVhY2ggc2VyaWFsaXphdGlvbiBhbmQgd2lsbCBiZSByZXRhaW5lZCAoYW5kIHdpbGwgZ3JvdykKKyAgICAgICAgICAgICAqIGZvciBlYWNoIHNlcmlhbGl6YXRpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU2VyaWFsaXplclZvY2FidWxhcnkgdm9jYWJ1bGFyeSA9IG5ldyBTZXJpYWxpemVyVm9jYWJ1bGFyeSgpOworICAgICAgICAgICAgc2VyaWFsaXplci5zZXRWb2NhYnVsYXJ5KHZvY2FidWxhcnkpOworICAgICAgICAgICAgc2VyaWFsaXplci5zZXRBdHRyaWJ1dGVWYWx1ZVNpemVMaW1pdChpbmRleGVkU3RyaW5nU2l6ZUxpbWl0KTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2V0Q2hhcmFjdGVyQ29udGVudENodW5rU2l6ZUxpbWl0KGluZGV4ZWRTdHJpbmdTaXplTGltaXQpOworICAgICAgICAgICAgc2VyaWFsaXplci5zZXRBdHRyaWJ1dGVWYWx1ZU1hcE1lbW9yeUxpbWl0KHN0cmluZ3NNZW1vcnlMaW1pdCk7CisgICAgICAgICAgICBzZXJpYWxpemVyLnNldENoYXJhY3RlckNvbnRlbnRDaHVua01hcE1lbW9yeUxpbWl0KHN0cmluZ3NNZW1vcnlMaW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IChAbGluayBTdEFYRG9jdW1lbnRQYXJzZXJ9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGluIHRoZSBJbnB1dFN0cmVhbSB0byBwYXJzZSBmcm9tLgorICAgICAqIEBwYXJhbSByZXRhaW5TdGF0ZSBpZiB0cnVlIHRoZSBwYXJzZXIgc2hvdWxkIHJldGFpbiB0aGUgc3RhdGUgb2YKKyAgICAgKiAgICAgICAgdm9jYWJ1bGFyeSB0YWJsZXMgZm9yIG11bHRpcGxlIHBhcnNlcy4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBTdEFYRG9jdW1lbnRQYXJzZXJ9IGluc3RhbmNlLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0QVhEb2N1bWVudFBhcnNlciBjcmVhdGVOZXdTdHJlYW1SZWFkZXIoSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gcmV0YWluU3RhdGUpIHsKKyAgICAgICAgU3RBWERvY3VtZW50UGFyc2VyIHBhcnNlciA9IG5ldyBTdEFYRG9jdW1lbnRQYXJzZXIoaW4pOworICAgICAgICBwYXJzZXIuc2V0U3RyaW5nSW50ZXJuaW5nKHRydWUpOworICAgICAgICBpZiAocmV0YWluU3RhdGUpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ3JlYXRlIGEgcGFyc2VyIHZvY2FidWxhcnkgZXh0ZXJuYWwgdG8gdGhlIHBhcnNlci4KKyAgICAgICAgICAgICAqIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgdm9jYWJ1bGFyeSB3aWxsIG5ldmVyIGJlIGNsZWFyZWQKKyAgICAgICAgICAgICAqIGZvciBlYWNoIHBhcnNlIGFuZCB3aWxsIGJlIHJldGFpbmVkIChhbmQgd2lsbCBncm93KQorICAgICAgICAgICAgICogZm9yIGVhY2ggcGFyc2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBhcnNlclZvY2FidWxhcnkgdm9jYWJ1bGFyeSA9IG5ldyBQYXJzZXJWb2NhYnVsYXJ5KCk7CisgICAgICAgICAgICBwYXJzZXIuc2V0Vm9jYWJ1bGFyeSh2b2NhYnVsYXJ5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyAoQGxpbmsgU3RBWERvY3VtZW50UGFyc2VyfSByZWN5Y2xhYmxlIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGluIHRoZSBJbnB1dFN0cmVhbSB0byBwYXJzZSBmcm9tLgorICAgICAqIEBwYXJhbSByZXRhaW5TdGF0ZSBpZiB0cnVlIHRoZSBwYXJzZXIgc2hvdWxkIHJldGFpbiB0aGUgc3RhdGUgb2YKKyAgICAgKiAgICAgICAgdm9jYWJ1bGFyeSB0YWJsZXMgZm9yIG11bHRpcGxlIHBhcnNlcy4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IHJlY3ljbGFibGUge0BsaW5rIFN0QVhEb2N1bWVudFBhcnNlcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgU3RBWERvY3VtZW50UGFyc2VyIGNyZWF0ZU5ld1N0cmVhbVJlYWRlclJlY3ljbGFibGUoSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gcmV0YWluU3RhdGUpIHsKKyAgICAgICAgU3RBWERvY3VtZW50UGFyc2VyIHBhcnNlciA9IG5ldyBGYXN0SW5mb3NldFN0cmVhbVJlYWRlclJlY3ljbGFibGUoaW4pOworICAgICAgICBwYXJzZXIuc2V0U3RyaW5nSW50ZXJuaW5nKHRydWUpOworICAgICAgICBwYXJzZXIuc2V0Rm9yY2VTdHJlYW1DbG9zZSh0cnVlKTsKKyAgICAgICAgaWYgKHJldGFpblN0YXRlKSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENyZWF0ZSBhIHBhcnNlciB2b2NhYnVsYXJ5IGV4dGVybmFsIHRvIHRoZSBwYXJzZXIuCisgICAgICAgICAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHZvY2FidWxhcnkgd2lsbCBuZXZlciBiZSBjbGVhcmVkCisgICAgICAgICAgICAgKiBmb3IgZWFjaCBwYXJzZSBhbmQgd2lsbCBiZSByZXRhaW5lZCAoYW5kIHdpbGwgZ3JvdykKKyAgICAgICAgICAgICAqIGZvciBlYWNoIHBhcnNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQYXJzZXJWb2NhYnVsYXJ5IHZvY2FidWxhcnkgPSBuZXcgUGFyc2VyVm9jYWJ1bGFyeSgpOworICAgICAgICAgICAgcGFyc2VyLnNldFZvY2FidWxhcnkodm9jYWJ1bGFyeSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgaXMgY29waWVkIGZyb20gY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTE1lc3NhZ2UKKyAgICAgKiBAVE9ETyBtZXRob2Qgc2hvdWxkIGJlIHB1YmxpYyBpbiBzb21lIHV0aWwgcGFja2FnZT8KKyAgICAgKgorICAgICAqIEZpbmRzIGlmIHRoZSBzdHJlYW0gaGFzIHNvbWUgY29udGVudCBvciBub3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBkYXRhCisgICAgICogICAgICAgICBlbHNlIHN0cmVhbSB0byBiZSB1c2VkCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gaGFzU29tZURhdGEoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaW4uYXZhaWxhYmxlKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpbi5tYXJrU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluLm1hcmsoMSk7CisgICAgICAgICAgICAgICAgaWYgKGluLnJlYWQoKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpbi5yZXNldCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGluID0gbnVsbDsgICAgICAgICAgLy8gTm8gZGF0YQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRNSU1FVHlwZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0TUlNRVR5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyYTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0TUlNRVR5cGVzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5mYXN0aW5mb3NldDsKKworLyoqCisgKiBNSU1FIHR5cGVzIGZvciBJbmZvc2V0cyBlbmNvZGVkIGFzIGZhc3QgaW5mb3NldCBkb2N1bWVudHMuCisgKgorICogQGF1dGhvciBQYXVsLlNhbmRvekBTdW4uQ29tCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGYXN0SW5mb3NldE1JTUVUeXBlcyB7CisgICAgLyoqCisgICAgICogTUlNRSB0eXBlIGZvciBhIGdlbmVyaWMgSW5mb3NldCBlbmNvZGVkIGFzIGEgZmFzdCBpbmZvc2V0IGRvY3VtZW50LgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIElORk9TRVQgPSAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiOworICAgIC8qKgorICAgICAqIE1JTUUgdHlwZSBmb3IgYSBTT0FQIDEuMSBJbmZvc2V0IGVuY29kZWQgYXMgYSBmYXN0IGluZm9zZXQgZG9jdW1lbnQuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgU09BUF8xMSA9ICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCI7CisgICAgLyoqCisgICAgICogTUlNRSB0eXBlIGZvciBhIFNPQVAgMS4yIEluZm9zZXQgZW5jb2RlZCBhcyBhIGZhc3QgaW5mb3NldCBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBTT0FQXzEyID0gImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXQiOworCisgICAgLyoqCisgICAgICogTUlNRSB0eXBlIGZvciBhIGdlbmVyaWMgSW5mb3NldCBlbmNvZGVkIGFzIGEgc3RhdGVmdWwgZmFzdCBpbmZvc2V0IGRvY3VtZW50LgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFNUQVRFRlVMX0lORk9TRVQgPSAiYXBwbGljYXRpb24vdm5kLnN1bi5zdGF0ZWZ1bC5mYXN0aW5mb3NldCI7CisgICAgLyoqCisgICAgICogTUlNRSB0eXBlIGZvciBhIFNPQVAgMS4xIEluZm9zZXQgZW5jb2RlZCBhcyBhIHN0YXRlZnVsIGZhc3QgaW5mb3NldCBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBTVEFURUZVTF9TT0FQXzExID0gImFwcGxpY2F0aW9uL3ZuZC5zdW4uc3RhdGVmdWwuZmFzdGluZm9zZXQiOworICAgIC8qKgorICAgICAqIE1JTUUgdHlwZSBmb3IgYSBTT0FQIDEuMiBJbmZvc2V0IGVuY29kZWQgYXMgYSBzdGF0ZWZ1bCBmYXN0IGluZm9zZXQgZG9jdW1lbnQuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgU1RBVEVGVUxfU09BUF8xMiA9ICJhcHBsaWNhdGlvbi92bmQuc3VuLnN0YXRlZnVsLnNvYXArZmFzdGluZm9zZXQiOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRTdHJlYW1SZWFkZXJGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFN0cmVhbVJlYWRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUxYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRTdHJlYW1SZWFkZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmZhc3RpbmZvc2V0OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5TdEFYRG9jdW1lbnRQYXJzZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICogQGF1dGhvciBBbGV4ZXkgU3Rhc2hvaworICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmFzdEluZm9zZXRTdHJlYW1SZWFkZXJGYWN0b3J5IGV4dGVuZHMgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmFzdEluZm9zZXRTdHJlYW1SZWFkZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFzdEluZm9zZXRTdHJlYW1SZWFkZXJGYWN0b3J5KCk7CisKKyAgICBwcml2YXRlIFRocmVhZExvY2FsPFN0QVhEb2N1bWVudFBhcnNlcj4gcG9vbCA9IG5ldyBUaHJlYWRMb2NhbDxTdEFYRG9jdW1lbnRQYXJzZXI+KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIEZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgfQorCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBkb0NyZWF0ZShTdHJpbmcgc3lzdGVtSWQsIElucHV0U3RyZWFtIGluLCBib29sZWFuIHJlamVjdERURHMpIHsKKyAgICAgICAgU3RBWERvY3VtZW50UGFyc2VyIHBhcnNlciA9IGZldGNoKCk7CisgICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEZhc3RJbmZvc2V0Q29kZWMuY3JlYXRlTmV3U3RyZWFtUmVhZGVyUmVjeWNsYWJsZShpbiwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcGFyc2VyLnNldElucHV0U3RyZWFtKGluKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGRvQ3JlYXRlKFN0cmluZyBzeXN0ZW1JZCwgUmVhZGVyIHJlYWRlciwgYm9vbGVhbiByZWplY3REVERzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgU3RBWERvY3VtZW50UGFyc2VyIGZldGNoKCkgeworICAgICAgICBTdEFYRG9jdW1lbnRQYXJzZXIgcGFyc2VyID0gcG9vbC5nZXQoKTsKKyAgICAgICAgcG9vbC5zZXQobnVsbCk7CisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9SZWN5Y2xlKFhNTFN0cmVhbVJlYWRlciByKSB7CisgICAgICAgIGlmIChyIGluc3RhbmNlb2YgU3RBWERvY3VtZW50UGFyc2VyKSB7CisgICAgICAgICAgICBwb29sLnNldCgoU3RBWERvY3VtZW50UGFyc2VyKSByKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U3RyZWFtUmVhZGVyUmVjeWNsYWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRTdHJlYW1SZWFkZXJSZWN5Y2xhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1NjA3YgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U3RyZWFtUmVhZGVyUmVjeWNsYWJsZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5mYXN0aW5mb3NldDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50UGFyc2VyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIEBhdXRob3IgQWxleGV5IFN0YXNob2sKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyUmVjeWNsYWJsZSBleHRlbmRzIFN0QVhEb2N1bWVudFBhcnNlciBpbXBsZW1lbnRzIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkuUmVjeWNsZUF3YXJlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGYXN0SW5mb3NldFN0cmVhbVJlYWRlckZhY3RvcnkgUkVBREVSX0ZBQ1RPUlkgPSBGYXN0SW5mb3NldFN0cmVhbVJlYWRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKworICAgIHB1YmxpYyBGYXN0SW5mb3NldFN0cmVhbVJlYWRlclJlY3ljbGFibGUoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIEZhc3RJbmZvc2V0U3RyZWFtUmVhZGVyUmVjeWNsYWJsZShJbnB1dFN0cmVhbSBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SZWN5Y2xlZCgpIHsKKyAgICAgICAgUkVBREVSX0ZBQ1RPUlkuZG9SZWN5Y2xlKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U3RyZWFtU09BUDExQ29kZWMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U3RyZWFtU09BUDExQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjAyMDM4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRTdHJlYW1TT0FQMTFDb2RlYy5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuZmFzdGluZm9zZXQ7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db250ZW50VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5Db2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuU3RyZWFtU09BUENvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLkNvbnRlbnRUeXBlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnN0cmVhbS5TdHJlYW1IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW0uU3RyZWFtSGVhZGVyMTE7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXI7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKKworLyoqCisgKiBBIGNvZGVjIHRoYXQgY29udmVydHMgU09BUCAxLjEgbWVzc2FnZXMgaW5mb3NldHMgdG8gZmFzdCBpbmZvc2V0CisgKiBkb2N1bWVudHMuCisgKgorICogQGF1dGhvciBQYXVsLlNhbmRvekBTdW4uQ29tCisgKi8KK2ZpbmFsIGNsYXNzIEZhc3RJbmZvc2V0U3RyZWFtU09BUDExQ29kZWMgZXh0ZW5kcyBGYXN0SW5mb3NldFN0cmVhbVNPQVBDb2RlYyB7CisgICAgLypwYWNrYWdlKi8gRmFzdEluZm9zZXRTdHJlYW1TT0FQMTFDb2RlYyhTdHJlYW1TT0FQQ29kZWMgc29hcENvZGVjLCBib29sZWFuIHJldGFpblN0YXRlKSB7CisgICAgICAgIHN1cGVyKHNvYXBDb2RlYywgU09BUFZlcnNpb24uU09BUF8xMSwgcmV0YWluU3RhdGUsCisgICAgICAgICAgICAgICAgKHJldGFpblN0YXRlKSA/IEZhc3RJbmZvc2V0TUlNRVR5cGVzLlNUQVRFRlVMX1NPQVBfMTEgOiBGYXN0SW5mb3NldE1JTUVUeXBlcy5TT0FQXzExKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZhc3RJbmZvc2V0U3RyZWFtU09BUDExQ29kZWMoRmFzdEluZm9zZXRTdHJlYW1TT0FQMTFDb2RlYyB0aGF0KSB7CisgICAgICAgIHN1cGVyKHRoYXQpOworICAgIH0KKworICAgIHB1YmxpYyBDb2RlYyBjb3B5KCkgeworICAgICAgICByZXR1cm4gbmV3IEZhc3RJbmZvc2V0U3RyZWFtU09BUDExQ29kZWModGhpcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmVhbUhlYWRlciBjcmVhdGVIZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgWE1MU3RyZWFtQnVmZmVyIG1hcmspIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWFkZXIxMShyZWFkZXIsIG1hcmspOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZShTdHJpbmcgc29hcEFjdGlvbikgeworICAgICAgICBpZiAoc29hcEFjdGlvbiA9PSBudWxsIHx8IHNvYXBBY3Rpb24ubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0Q29udGVudFR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRUeXBlSW1wbChfZGVmYXVsdENvbnRlbnRUeXBlLmdldENvbnRlbnRUeXBlKCksIHNvYXBBY3Rpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRTdHJlYW1TT0FQMTJDb2RlYy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRTdHJlYW1TT0FQMTJDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YmU5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFN0cmVhbVNPQVAxMkNvZGVjLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5mYXN0aW5mb3NldDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5TdHJlYW1TT0FQQ29kZWM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuQ29udGVudFR5cGVJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtLlN0cmVhbUhlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnN0cmVhbS5TdHJlYW1IZWFkZXIxMjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworCisvKioKKyAqIEEgY29kZWMgdGhhdCBjb252ZXJ0cyBTT0FQIDEuMiBtZXNzYWdlcyBpbmZvc2V0cyB0byBmYXN0IGluZm9zZXQKKyAqIGRvY3VtZW50cy4KKyAqCisgKiBAYXV0aG9yIFBhdWwuU2FuZG96QFN1bi5Db20KKyAqLworZmluYWwgY2xhc3MgRmFzdEluZm9zZXRTdHJlYW1TT0FQMTJDb2RlYyBleHRlbmRzIEZhc3RJbmZvc2V0U3RyZWFtU09BUENvZGVjIHsKKyAgICAvKnBhY2thZ2UqLyBGYXN0SW5mb3NldFN0cmVhbVNPQVAxMkNvZGVjKFN0cmVhbVNPQVBDb2RlYyBzb2FwQ29kZWMsIGJvb2xlYW4gcmV0YWluU3RhdGUpIHsKKyAgICAgICAgc3VwZXIoc29hcENvZGVjLCBTT0FQVmVyc2lvbi5TT0FQXzEyLCByZXRhaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAocmV0YWluU3RhdGUpID8gRmFzdEluZm9zZXRNSU1FVHlwZXMuU1RBVEVGVUxfU09BUF8xMiA6IEZhc3RJbmZvc2V0TUlNRVR5cGVzLlNPQVBfMTIpOworICAgIH0KKworICAgIHByaXZhdGUgRmFzdEluZm9zZXRTdHJlYW1TT0FQMTJDb2RlYyhGYXN0SW5mb3NldFN0cmVhbVNPQVBDb2RlYyB0aGF0KSB7CisgICAgICAgIHN1cGVyKHRoYXQpOworICAgIH0KKworICAgIHB1YmxpYyBDb2RlYyBjb3B5KCkgeworICAgICAgICByZXR1cm4gbmV3IEZhc3RJbmZvc2V0U3RyZWFtU09BUDEyQ29kZWModGhpcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmVhbUhlYWRlciBjcmVhdGVIZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgWE1MU3RyZWFtQnVmZmVyIG1hcmspIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWFkZXIxMihyZWFkZXIsIG1hcmspOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZShTdHJpbmcgc29hcEFjdGlvbikgeworICAgICAgICBpZiAoc29hcEFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRDb250ZW50VHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGVudFR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICBfZGVmYXVsdENvbnRlbnRUeXBlLmdldENvbnRlbnRUeXBlKCkgKyAiO2FjdGlvbj1cIiIrc29hcEFjdGlvbisiXCIiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0U3RyZWFtU09BUENvZGVjLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFN0cmVhbVNPQVBDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNGQ4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFN0cmVhbVNPQVBDb2RlYy5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmZhc3RpbmZvc2V0OworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5TdEFYRG9jdW1lbnRTZXJpYWxpemVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50UGFyc2VyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuU3RyZWFtU09BUENvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtLlN0cmVhbUhlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5Db250ZW50VHlwZUltcGw7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOworCisvKioKKyAqIEEgc3RyZWFtIFNPQVAgY29kZWMgZm9yIGhhbmRsaW5nIFNPQVAgbWVzc2FnZSBpbmZvc2V0cyB0byBmYXN0CisgKiBpbmZvc2V0IGRvY3VtZW50cy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gY3VycmVudGx5IGRlZmVycyB0byB7QGxpbmsgU3RyZWFtU09BUENvZGVjfSBmb3IgdGhlIGRlY29kaW5nCisgKiB1c2luZyB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYXN0SW5mb3NldFN0cmVhbVNPQVBDb2RlYyBpbXBsZW1lbnRzIENvZGVjIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGYXN0SW5mb3NldFN0cmVhbVJlYWRlckZhY3RvcnkgUkVBREVSX0ZBQ1RPUlkgPSBGYXN0SW5mb3NldFN0cmVhbVJlYWRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKworICAgIHByaXZhdGUgU3RBWERvY3VtZW50UGFyc2VyIF9zdGF0ZWZ1bFBhcnNlcjsKKyAgICBwcml2YXRlIFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIgX3NlcmlhbGl6ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmVhbVNPQVBDb2RlYyBfc29hcENvZGVjOworCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9yZXRhaW5TdGF0ZTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VHlwZSBfZGVmYXVsdENvbnRlbnRUeXBlOworCisgICAgLyogcGFja2FnZSAqLyBGYXN0SW5mb3NldFN0cmVhbVNPQVBDb2RlYyhTdHJlYW1TT0FQQ29kZWMgc29hcENvZGVjLCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgYm9vbGVhbiByZXRhaW5TdGF0ZSwgU3RyaW5nIG1pbWVUeXBlKSB7CisvLyAgICAgICAgX3NvYXBDb2RlYyA9IFN0cmVhbVNPQVBDb2RlYy5jcmVhdGUoc29hcFZlcnNpb24pOworICAgICAgICBfc29hcENvZGVjID0gc29hcENvZGVjOworICAgICAgICBfcmV0YWluU3RhdGUgPSByZXRhaW5TdGF0ZTsKKyAgICAgICAgX2RlZmF1bHRDb250ZW50VHlwZSA9IG5ldyBDb250ZW50VHlwZUltcGwobWltZVR5cGUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gRmFzdEluZm9zZXRTdHJlYW1TT0FQQ29kZWMoRmFzdEluZm9zZXRTdHJlYW1TT0FQQ29kZWMgdGhhdCkgeworICAgICAgICB0aGlzLl9zb2FwQ29kZWMgPSAoU3RyZWFtU09BUENvZGVjKSB0aGF0Ll9zb2FwQ29kZWMuY29weSgpOworICAgICAgICB0aGlzLl9yZXRhaW5TdGF0ZSA9IHRoYXQuX3JldGFpblN0YXRlOworICAgICAgICB0aGlzLl9kZWZhdWx0Q29udGVudFR5cGUgPSB0aGF0Ll9kZWZhdWx0Q29udGVudFR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIF9kZWZhdWx0Q29udGVudFR5cGUuZ2V0Q29udGVudFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGVudFR5cGUgZ2V0U3RhdGljQ29udGVudFR5cGUoUGFja2V0IHBhY2tldCkgeworICAgICAgICByZXR1cm4gZ2V0Q29udGVudFR5cGUocGFja2V0LnNvYXBBY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50VHlwZSBlbmNvZGUoUGFja2V0IHBhY2tldCwgT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICBpZiAocGFja2V0LmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gZ2V0WE1MU3RyZWFtV3JpdGVyKG91dCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBhY2tldC5nZXRNZXNzYWdlKCkud3JpdGVUbyh3cml0ZXIpOworICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0Q29udGVudFR5cGUocGFja2V0LnNvYXBBY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50VHlwZSBlbmNvZGUoUGFja2V0IHBhY2tldCwgV3JpdGFibGVCeXRlQ2hhbm5lbCBidWZmZXIpIHsKKyAgICAgICAgLy9UT0RPOiBub3QgeWV0IGltcGxlbWVudGVkCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlY29kZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGNvbnRlbnRUeXBlLCBQYWNrZXQgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc3BvbnNlLnNldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgX3NvYXBDb2RlYy5kZWNvZGUoZ2V0WE1MU3RyZWFtUmVhZGVyKGluKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlY29kZShSZWFkYWJsZUJ5dGVDaGFubmVsIGluLCBTdHJpbmcgY29udGVudFR5cGUsIFBhY2tldCByZXNwb25zZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyZWFtSGVhZGVyIGNyZWF0ZUhlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBYTUxTdHJlYW1CdWZmZXIgbWFyayk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoU3RyaW5nIHNvYXBBY3Rpb24pOworCisgICAgcHJpdmF0ZSBYTUxTdHJlYW1Xcml0ZXIgZ2V0WE1MU3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgaWYgKF9zZXJpYWxpemVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9zZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbShvdXQpOworICAgICAgICAgICAgcmV0dXJuIF9zZXJpYWxpemVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIF9zZXJpYWxpemVyID0gRmFzdEluZm9zZXRDb2RlYy5jcmVhdGVOZXdTdHJlYW1Xcml0ZXIob3V0LCBfcmV0YWluU3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBYTUxTdHJlYW1SZWFkZXIgZ2V0WE1MU3RyZWFtUmVhZGVyKElucHV0U3RyZWFtIGluKSB7CisgICAgICAgIC8vIElmIHRoZSBfcmV0YWluU3RhdGUgaXMgdHJ1ZSAoRkkgc3RhdGVmdWwpIHRoZW4gcGljayB1cCBDb2RlYyBhc3NpY2lhdGVkIFhNTFN0cmVhbVJlYWRlcgorICAgICAgICBpZiAoX3JldGFpblN0YXRlKSB7CisgICAgICAgICAgICBpZiAoX3N0YXRlZnVsUGFyc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfc3RhdGVmdWxQYXJzZXIuc2V0SW5wdXRTdHJlYW0oaW4pOworICAgICAgICAgICAgICAgIHJldHVybiBfc3RhdGVmdWxQYXJzZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3RhdGVmdWxQYXJzZXIgPSBGYXN0SW5mb3NldENvZGVjLmNyZWF0ZU5ld1N0cmVhbVJlYWRlcihpbiwgX3JldGFpblN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE90aGVyd2lzZSB0aHJlYWQgYXNzaWNpYXRlZCBYTUxTdHJlYW1SZWFkZXIKKyAgICAgICAgcmV0dXJuIFJFQURFUl9GQUNUT1JZLmRvQ3JlYXRlKG51bGwsIGluLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRmFzdEluZm9zZXRTdHJlYW1TT0FQQ29kZWN9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIFNPQVAgdmVyc2lvbiBvZiB0aGUgY29kZWMuCisgICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgRmFzdEluZm9zZXRTdHJlYW1TT0FQQ29kZWN9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmFzdEluZm9zZXRTdHJlYW1TT0FQQ29kZWMgY3JlYXRlKFN0cmVhbVNPQVBDb2RlYyBzb2FwQ29kZWMsIFNPQVBWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShzb2FwQ29kZWMsIHZlcnNpb24sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBGYXN0SW5mb3NldFN0cmVhbVNPQVBDb2RlY30gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgU09BUCB2ZXJzaW9uIG9mIHRoZSBjb2RlYy4KKyAgICAgKiBAcGFyYW0gcmV0YWluU3RhdGUgaWYgdHJ1ZSB0aGUgQ29kZWMgc2hvdWxkIHJldGFpbiB0aGUgc3RhdGUgb2YKKyAgICAgKiAgICAgICAgdm9jYWJ1bGFyeSB0YWJsZXMgZm9yIG11bHRpcGxlIGVuY29kZS9kZWNvZGUgaW52b2NhdGlvbnMuCisgICAgICogQHJldHVybiBhIG5ldyB7QGxpbmsgRmFzdEluZm9zZXRTdHJlYW1TT0FQQ29kZWN9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmFzdEluZm9zZXRTdHJlYW1TT0FQQ29kZWMgY3JlYXRlKFN0cmVhbVNPQVBDb2RlYyBzb2FwQ29kZWMsCisgICAgICAgICAgICBTT0FQVmVyc2lvbiB2ZXJzaW9uLCBib29sZWFuIHJldGFpblN0YXRlKSB7CisgICAgICAgIGlmKHZlcnNpb249PW51bGwpCisgICAgICAgICAgICAvLyB0aGlzIGRlY29kZXIgaXMgZm9yIFNPQVAsIG5vdCBmb3IgWE1ML0hUVFAKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgc3dpdGNoKHZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgU09BUF8xMToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZhc3RJbmZvc2V0U3RyZWFtU09BUDExQ29kZWMoc29hcENvZGVjLCByZXRhaW5TdGF0ZSk7CisgICAgICAgICAgICBjYXNlIFNPQVBfMTI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGYXN0SW5mb3NldFN0cmVhbVNPQVAxMkNvZGVjKHNvYXBDb2RlYywgcmV0YWluU3RhdGUpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2ludGVybmFsL0ludGVybmFsRW5jb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvaW50ZXJuYWwvSW50ZXJuYWxFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Y2U2MDguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvaW50ZXJuYWwvSW50ZXJuYWxFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5pbnRlcm5hbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLQotLyoqCi0gKiBQYXlsb2FkIGlzIGNvbnZlcnRlZCBmcm9tIG9uZSBmb3JtIHRvIHRoZSBvdGhlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEludGVybmFsRW5jb2RlciB7Ci0gICAgcHVibGljIHZvaWQgdG9NZXNzYWdlSW5mbyhPYmplY3QgaW50TWVzc2FnZSwgTWVzc2FnZUluZm8gbWkpOwotICAgIHB1YmxpYyBPYmplY3QgdG9JbnRlcm5hbE1lc3NhZ2UoTWVzc2FnZUluZm8gbWkpOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvamF4Yi9KQVhCQmVhbkluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL2pheGIvSkFYQkJlYW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjZjOTYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvamF4Yi9KQVhCQmVhbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TZXJpYWxpemF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogWE1MIGluZm9zZXQgcmVwcmVzZW50ZWQgYXMgYSBKQVhCIG9iamVjdC4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpBWEJCZWFuSW5mbyB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgamF4YkJlYW47Ci0gICAgcHJpdmF0ZSBKQVhCQ29udGV4dCBqYXhiQ29udGV4dDsKLSAgICBwcml2YXRlIEJyaWRnZUNvbnRleHQgYmM7Ci0gICAgcHJpdmF0ZSBNYXJzaGFsbGVyIG1hcnNoYWxsZXI7Ci0gICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyOwotCi0gICAgcHVibGljIEpBWEJCZWFuSW5mbyhPYmplY3QgcGF5bG9hZCwgSkFYQkNvbnRleHQgamF4YkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5qYXhiQmVhbiA9IHBheWxvYWQ7Ci0gICAgICAgIHRoaXMuamF4YkNvbnRleHQgPSBqYXhiQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEpBWEJCZWFuSW5mbyBmcm9tU291cmNlKFNvdXJjZSBzb3VyY2UsIEpBWEJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IEpBWEJUeXBlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShzb3VyY2UsIGNvbnRleHQpOwotICAgICAgICByZXR1cm4gbmV3IEpBWEJCZWFuSW5mbyhvYmosIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSkFYQkJlYW5JbmZvIGZyb21TdEFYKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEpBWEJDb250ZXh0IGNvbnRleHQpIHsKLQotICAgICAgICBPYmplY3Qgb2JqID0gSkFYQlR5cGVTZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlYWRlciwgY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkJlYW5JbmZvKG9iaiwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBKQVhCQmVhbkluZm8gZnJvbVN0QVgoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgSkFYQkNvbnRleHQgY29udGV4dCwgVW5tYXJzaGFsbGVyIHVtKSB7Ci0KLSAgICAgICAgT2JqZWN0IG9iaiA9IEpBWEJUeXBlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZWFkZXIsIGNvbnRleHQsIHVtKTsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQmVhbkluZm8ob2JqLCBjb250ZXh0KTsKLSAgICB9Ci0KLQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkgewotICAgICAgICByZXR1cm4gamF4YkJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIEpBWEJDb250ZXh0IGdldEpBWEJDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gamF4YkNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBET01Tb3VyY2V9IGZyb20gdGhpcyBKQVhCIGJlYW4uCi0gICAgICovCi0gICAgcHVibGljIERPTVNvdXJjZSB0b0RPTVNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWEJUeXBlU2VyaWFsaXplci5zZXJpYWxpemUoamF4YkJlYW4samF4YkNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGlzIGJlYW4gdG8gU3RBWC4KLSAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhYTUxTdHJlYW1Xcml0ZXIgdykgewotICAgICAgICAgICAgaWYgKG1hcnNoYWxsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBKQVhCVHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplKGpheGJCZWFuLCB3LCBqYXhiQ29udGV4dCwgbWFyc2hhbGxlcik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBKQVhCVHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplKGpheGJCZWFuLCB3LCBqYXhiQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykgewotICAgICAgICAgICAgaWYgKG1hcnNoYWxsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBKQVhCVHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplKGpheGJCZWFuLCBvcywgamF4YkNvbnRleHQsIG1hcnNoYWxsZXIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgIEpBWEJUeXBlU2VyaWFsaXplci5zZXJpYWxpemUoamF4YkJlYW4sb3MsamF4YkNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXJzaGFsbGVycyhNYXJzaGFsbGVyIG0sIFVubWFyc2hhbGxlciB1KSB7Ci0gICAgICAgIHRoaXMubWFyc2hhbGxlciA9IG07Ci0gICAgICAgIHRoaXMudW5tYXJzaGFsbGVyID0gdTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9qYXhiL0pBWEJCcmlkZ2VJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9qYXhiL0pBWEJCcmlkZ2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzZkNGYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvamF4Yi9KQVhCQnJpZGdlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU2VyaWFsaXphdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLkRlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogWE1MIGluZm9zZXQgcmVwcmVzZW50ZWQgYXMgYSBKQVhCIG9iamVjdCBhbmQge0BsaW5rIEJyaWRnZX0uCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKQVhCQnJpZGdlSW5mbyB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCcmlkZ2UgYnJpZGdlOwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotCi0gICAgcHVibGljIEpBWEJCcmlkZ2VJbmZvKEJyaWRnZSBicmlkZ2UpIHsKLSAgICAgICAgdGhpcy5icmlkZ2UgPSBicmlkZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWEJCcmlkZ2VJbmZvKEJyaWRnZSBicmlkZ2UsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzKGJyaWRnZSk7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGJyaWRnZS5nZXRUeXBlUmVmZXJlbmNlKCkudGFnTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVJlZmVyZW5jZSBnZXRUeXBlKCl7Ci0gICAgICAgIHJldHVybiBicmlkZ2UuZ2V0VHlwZVJlZmVyZW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCcmlkZ2UgZ2V0QnJpZGdlKCkgewotICAgICAgICByZXR1cm4gYnJpZGdlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEpBWEJCcmlkZ2VJbmZvIGNvcHkoSkFYQkJyaWRnZUluZm8gcGF5bG9hZCkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJCcmlkZ2VJbmZvKHBheWxvYWQuZ2V0QnJpZGdlKCksIHBheWxvYWQuZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSkFYQiBvYmplY3QgaXMgc2VyaWFsaXplZC4gTm90ZSB0aGF0IHRoZSBCcmlkZ2VDb250ZXh0IGlzIGNhY2hlZCBwZXIKLSAgICAgKiB0aHJlYWQsIGFuZCBKQVhCQnJpZGdlSW5mbyBzaG91bGQgY29udGFpbiBjb3JyZWN0IEJyaWRnZUNvbnRleHQgZm9yIHRoZQotICAgICAqIGN1cnJlbnQgdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShCcmlkZ2VDb250ZXh0IGJyaWRnZUNvbnRleHQsIE91dHB1dFN0cmVhbSBvcywgTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyaWRnZS5tYXJzaGFsKGJyaWRnZUNvbnRleHQsIHZhbHVlLCBvcywgbnNDb250ZXh0KTsKLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZSB0byBTdEFYLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShCcmlkZ2VDb250ZXh0IGJyaWRnZUNvbnRleHQsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyaWRnZS5tYXJzaGFsKGJyaWRnZUNvbnRleHQsIHZhbHVlLCB3cml0ZXIpOwotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VyaWFsaXplIHRvIERPTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQnJpZGdlQ29udGV4dCBicmlkZ2VDb250ZXh0LCBOb2RlIG5vZGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyaWRnZS5tYXJzaGFsKGJyaWRnZUNvbnRleHQsIHZhbHVlLCBub2RlKTsKLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFNvdXJjZSBzb3VyY2UsIEJyaWRnZUNvbnRleHQgYnJpZGdlQ29udGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBicmlkZ2UudW5tYXJzaGFsKGJyaWRnZUNvbnRleHQsIHNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKElucHV0U3RyZWFtIHN0cmVhbSwgQnJpZGdlQ29udGV4dCBicmlkZ2VDb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGJyaWRnZS51bm1hcnNoYWwoYnJpZGdlQ29udGV4dCwgc3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVzZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEpBWEIgb2JqZWN0IGlzIGRlc2VyaWFsaXplZCBhbmQgaXMgc2V0IGluIEpBWEJCcmlkZ2VJbmZvLiBOb3RlIHRoYXQKLSAgICAqIHRoZSBCcmlkZ2VDb250ZXh0IGlzIGNhY2hlZCBwZXIgdGhyZWFkLCBhbmQgSkFYQkJyaWRnZUluZm8gc2hvdWxkIGNvbnRhaW4KLSAgICAqIGNvcnJlY3QgQnJpZGdlQ29udGV4dCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotICAgICovCi0gICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgQnJpZGdlQ29udGV4dCBicmlkZ2VDb250ZXh0KSAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBicmlkZ2UudW5tYXJzaGFsKGJyaWRnZUNvbnRleHQsIHJlYWRlcik7Ci0KLSAgICAgICAgICAgIC8vIHJlYWRlciBjb3VsZCBiZSBsZWZ0IG9uIENIQVJTIHRva2VuIHJhdGhlciB0aGFuIDwvYm9keT4KLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmlzV2hpdGVTcGFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9qYXhiL0pBWEJUeXBlU2VyaWFsaXplci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvamF4Yi9KQVhCVHlwZVNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1NjIyOS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9qYXhiL0pBWEJUeXBlU2VyaWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4YjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLk1hcnNoYWxsZXJJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuRGVzZXJpYWxpemF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU2VyaWFsaXphdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFZpdmVrIFBhbmRleQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkFYQlR5cGVTZXJpYWxpemVyIHsKLSAgICBwcml2YXRlIEpBWEJUeXBlU2VyaWFsaXplcigpIHsKLSAgICB9ICAgIC8vIG5vIGluc3RhbmNpYXRpb24gcGxlYXNlCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKE9iamVjdCBvYmosIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIEpBWEJDb250ZXh0IGNvbnRleHQpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICBtYXJzaGFsbGVyLnNldFByb3BlcnR5KCJqYXhiLmZyYWdtZW50IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChvYmosIHdyaXRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShPYmplY3Qgb2JqLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCwgTWFyc2hhbGxlciBtYXJzaGFsbGVyKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtYXJzaGFsbGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgbWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eSgiamF4Yi5mcmFnbWVudCIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBtYXJzaGFsbGVyLm1hcnNoYWwob2JqLCB3cml0ZXIpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogZm9yIEZJLCBpdCB3aWxsIGJlIGEgd2hvbGUgZG9jdW1lbnQsIG5vdCBmcmFnbWVudAotICAgICAqIGNhbGxlZCBieSBzZXRQYXlsb2FkIGFuZCB3cml0ZVRvIG1ldGhvZHMgaW4gWE1MTWVzc2FnZSBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemVEb2N1bWVudChPYmplY3Qgb2JqLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBKQVhCQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXJzaGFsbGVyIG1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChvYmosIHdyaXRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShPYmplY3Qgb2JqLCBPdXRwdXRTdHJlYW0gb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0LCBNYXJzaGFsbGVyIG1hcnNoYWxsZXIpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1hcnNoYWxsZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICBtYXJzaGFsbGVyLnNldFByb3BlcnR5KCJqYXhiLmZyYWdtZW50IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChvYmosIG9zKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKE9iamVjdCBvYmosIE91dHB1dFN0cmVhbSBvcywgSkFYQkNvbnRleHQgY29udGV4dCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXJzaGFsbGVyIG1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIuc2V0UHJvcGVydHkoImpheGIuZnJhZ21lbnQiLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKG9iaiwgb3MpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBNYXJzaGFsbHMgYXJiaXRyYXJ5IHR5cGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRhZyBuYW1lCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERPTVNvdXJjZSBzZXJpYWxpemUoT2JqZWN0IGJlYW4sIEpBWEJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eSgiamF4Yi5mcmFnbWVudCIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBET01SZXN1bHQgZG9tUmVzdWx0ID0gbmV3IERPTVJlc3VsdCgpOwotICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKGJlYW4sIGRvbVJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERPTVNvdXJjZShkb21SZXN1bHQuZ2V0Tm9kZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBAc2VlIEpBWEJUeXBlU2VyaWFsaXplcklmI2Rlc2VyaWFsaXplKFhNTFN0cmVhbVJlYWRlcixKQVhCQ29udGV4dCkKLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRlc2VyaWFsaXplKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEpBWEJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgb2JqID0gdW5tYXJzaGFsbGVyLnVubWFyc2hhbChyZWFkZXIpOwotCi0gICAgICAgICAgICAvLyByZWFkZXIgY291bGQgYmUgbGVmdCBvbiBDSEFSUyB0b2tlbiByYXRoZXIgdGhhbiA8L2JvZHk+Ci0gICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTCi0gICAgICAgICAgICAgICAgJiYgcmVhZGVyLmlzV2hpdGVTcGFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLQotICAgICAgICB9IGNhdGNoIChEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBkZXNlcmlhbGl6ZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBKQVhCQ29udGV4dCBjb250ZXh0LCBVbm1hcnNoYWxsZXIgYmMpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIGlmIChiYyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHVubWFyc2hhbGxlci5zZXRBdHRhY2htZW50VW5tYXJzaGFsbGVyKGJjLmdldEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgb2JqID0gdW5tYXJzaGFsbGVyLnVubWFyc2hhbChyZWFkZXIpOwotCi0gICAgICAgICAgICAvLyByZWFkZXIgY291bGQgYmUgbGVmdCBvbiBDSEFSUyB0b2tlbiByYXRoZXIgdGhhbiA8L2JvZHk+Ci0gICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTCi0gICAgICAgICAgICAgICAgJiYgcmVhZGVyLmlzV2hpdGVTcGFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLQotICAgICAgICB9IGNhdGNoIChEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNvbnZlcnQgSkFYQiBiZWFuIGFzIGEgU291cmNlCi0gICAgICoKLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0b1NvdXJjZShPYmplY3Qgb2JqLCBKQVhCQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBVc2UgY3R4dCB0byBtYXJzaGFsbCB0aGUgb2JqZWN0Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICBtYXJzaGFsbGVyLnNldFByb3BlcnR5KCJqYXhiLmZyYWdtZW50IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChvYmosIGJvcyk7Ci0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UoYmlzKTsKLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVzZXJpYWxpemF0aW9uRXhjZXB0aW9uKG5ldyBMb2NhbGl6YWJsZUV4Y2VwdGlvbkFkYXB0ZXIoCi0gICAgICAgICAgICAgICAgICAgIGUpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotCi0gICAgLyoKLSAgICAqIENvbnZlcnQgU291cmNlIG9iamVjdCBhcyBhIEpBWEIgYmVhbgotICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZGVzZXJpYWxpemUoU291cmNlIHNvdXJjZSwgSkFYQkNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICByZXR1cm4gdW5tYXJzaGFsbGVyLnVubWFyc2hhbChzb3VyY2UpOwotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvamF4Yi9ScGNMaXRQYXlsb2FkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9qYXhiL1JwY0xpdFBheWxvYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiZmViNy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9qYXhiL1JwY0xpdFBheWxvYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4YjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgUnBjTGl0UGF5bG9hZCB7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb247Ci0gICAgcHJpdmF0ZSBMaXN0PEpBWEJCcmlkZ2VJbmZvPiBicmlkZ2VQYXJhbWV0ZXJzOwotCi0gICAgcHVibGljIFJwY0xpdFBheWxvYWQoUU5hbWUgb3BlcmF0aW9uKSB7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgICAgICB0aGlzLmJyaWRnZVBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PEpBWEJCcmlkZ2VJbmZvPigpOwotICAgIH0KLQotICAgIC8qIFNhbWUgYXMgdGhlIGFib3ZlIG9uZS4gTmVlZCB0byByZW1vdmUgdGhlIGFib3ZlIGNvbnN0cnVjdG9yLgotICAgIHB1YmxpYyBScGNMaXRQYXlsb2FkKFFOYW1lIG9wZXJhdGlvbiwgTGlzdDxKQVhCQnJpZGdlSW5mbz4gcGFyYW1ldGVycykgewotICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICAgICAgdGhpcy5icmlkZ2VQYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0gICAgICovCi0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEpBWEJCcmlkZ2VJbmZvPiBnZXRCcmlkZ2VQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gYnJpZGdlUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJwY0xpdFBheWxvYWQgY29weShScGNMaXRQYXlsb2FkIHBheWxvYWQpIHsKLSAgICAgICAgUnBjTGl0UGF5bG9hZCBuZXdQYXlsb2FkID0gbmV3IFJwY0xpdFBheWxvYWQocGF5bG9hZC5nZXRPcGVyYXRpb24oKSk7Ci0gICAgICAgIGZvcihKQVhCQnJpZGdlSW5mbyBwYXJhbTogcGF5bG9hZC5nZXRCcmlkZ2VQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIEpBWEJCcmlkZ2VJbmZvIG5ld1BhcmFtID0gSkFYQkJyaWRnZUluZm8uY29weShwYXJhbSk7Ci0gICAgICAgICAgICBuZXdQYXlsb2FkLmFkZFBhcmFtZXRlcihuZXdQYXJhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ld1BheWxvYWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWEJCcmlkZ2VJbmZvIGdldEJyaWRnZVBhcmFtZXRlckJ5TmFtZShTdHJpbmcgbmFtZSl7Ci0gICAgICAgIGZvcihKQVhCQnJpZGdlSW5mbyBwYXJhbSA6IGJyaWRnZVBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyYW0uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihKQVhCQnJpZGdlSW5mbyBwYXJhbWV0ZXIpIHsKLSAgICAgICAgYnJpZGdlUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9qYXhiL1JwY0xpdFBheWxvYWRTZXJpYWxpemVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9qYXhiL1JwY0xpdFBheWxvYWRTZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTA1YjAuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcvamF4Yi9ScGNMaXRQYXlsb2FkU2VyaWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4YjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZUNvbnRleHQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWEJfT1VUUFVUU1RSRUFNOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuRGVzZXJpYWxpemF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU2VyaWFsaXphdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBScGNMaXRQYXlsb2FkU2VyaWFsaXplciB7Ci0KLSAgICAvKgotICAgICAqIFVzZXMgQnJpZGdlQ29udGV4dCB0byBzZXJpYWxpemUgdGhlIHJwYy9saXQgcGF5bG9hZC4gRmlyc3QgaXQgd3JpdGVzCi0gICAgICogdGhlIG9wZXJhdGlvbiwgYW5kIHRoZW4gaXQgc2VyaWFsaXplcyBlYWNoIHBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoUnBjTGl0UGF5bG9hZCBvYmosIEJyaWRnZUNvbnRleHQgYnJpZGdlQ29udGV4dCwKLSAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgb3AgPSBvYmouZ2V0T3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmcgb3BVUkkgPSBvcC5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJhbnMiLCBvcC5nZXRMb2NhbFBhcnQoKSwgb3BVUkkpOwotICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeCgiYW5zIiwgb3BVUkkpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKCJhbnMiLCBvcFVSSSk7Ci0KLQotICAgICAgICAgICAgLy8gUGFzcyBvdXRwdXQgc3RyZWFtIGRpcmVjdGx5IHRvIEpBWEIgd2hlbiBhdmFpbGFibGUKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IChPdXRwdXRTdHJlYW0pIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEpBWEJfT1VUUFVUU1RSRUFNKTsKLSAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBNYWtlIHN1cmUgdGhhdCBjdXJyZW50IGVsZW1lbnQgaXMgY2xvc2VkIGJlZm9yZSBwYXNzaW5nIHRoZQotICAgICAgICAgICAgICAgICAqIG91dHB1dCBzdHJlYW0gdG8gSkFYQi4gVXNpbmcgWmVwaHlyLCBpdCBzdWZmaWNlcyB0byB3cml0ZQotICAgICAgICAgICAgICAgICAqIGFuIGVtcHR5IHN0cmluZyAoVE9ETzogb3RoZXIgU3RBWCBpbXBscz8pLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoIiIpOwotCi0gICAgICAgICAgICAgICAgLy8gRmx1c2ggb3V0cHV0IG9mIFN0QVggc2VyaWFsaXplcgotICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dCBuc2MgPSB3cml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotCi0gICAgICAgICAgICAgICAgLy8gTGV0IEpBWEIgc2VyaWFsaXplIGVhY2ggcGFyYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgICAgICAgICAgICBmb3IgKEpBWEJCcmlkZ2VJbmZvIHBhcmFtIDogb2JqLmdldEJyaWRnZVBhcmFtZXRlcnMoKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXJpYWxpemUoYnJpZGdlQ29udGV4dCwgb3MsIG5zYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB1c2UgYSBTdEFYIHdyaXRlcgotICAgICAgICAgICAgICAgIGZvciAoSkFYQkJyaWRnZUluZm8gcGFyYW0gOiBvYmouZ2V0QnJpZGdlUGFyYW1ldGVycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNlcmlhbGl6ZShicmlkZ2VDb250ZXh0LCB3cml0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAgICAgICAgICAgIC8vIDwvYW5zOm9wZXJhdGlvbj4KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShScGNMaXRQYXlsb2FkIG9iaiwgQnJpZGdlQ29udGV4dCBicmlkZ2VDb250ZXh0LCBPdXRwdXRTdHJlYW0gd3JpdGVyKSB7Ci0gICAgICAgIFFOYW1lIG9wID0gb2JqLmdldE9wZXJhdGlvbigpOwotICAgICAgICBTdHJpbmcgb3BVUkkgPSBvcC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIHN0YXJ0RWxtID0gIjxhbnM6IitvcC5nZXRMb2NhbFBhcnQoKSsiIHhtbG5zOmFucz1cIiIrb3BVUkkrIlwiPiI7Ci0gICAgICAgIFN0cmluZyBlbmRFbG09IjwvYW5zOiIrb3AuZ2V0TG9jYWxQYXJ0KCkrIj4iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKHN0YXJ0RWxtLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgZm9yIChKQVhCQnJpZGdlSW5mbyBwYXJhbSA6IG9iai5nZXRCcmlkZ2VQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5zZXJpYWxpemUoYnJpZGdlQ29udGV4dCx3cml0ZXIsbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoZW5kRWxtLmdldEJ5dGVzKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVXNlcyBCcmlkZ2VDb250ZXh0IHRvIGRlc2VyaWFsaXplIHRoZSBycGMvbGl0IHBheWxvYWQuIEZpcnN0IGl0IHJlYWRzCi0gICAgICogdGhlIG9wZXJhdGlvbiBlbGVtZW50LCBhbmQgdGhlbiBpdCBkZXNlcmlhbGl6ZXMgZWFjaCBwYXJhbWV0ZXIuIElmIHRoZQotICAgICAqIGV4cGVjdGVkIHBhcmFtZXRlciBpcyBub3QgZm91bmQsIGl0IHRocm93cyBhbiBleGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVzZXJpYWxpemUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgUnBjTGl0UGF5bG9hZCBwYXlsb2FkLAotICAgICAgICBCcmlkZ2VDb250ZXh0IGJyaWRnZUNvbnRleHQpCi0gICAgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOyAgICAgLy8gPC9vcGVyYXRpb24+IG9yIDxwYXJ0TmFtZT4KLSAgICAgICAgZm9yIChKQVhCQnJpZGdlSW5mbyBwYXJhbTogcGF5bG9hZC5nZXRCcmlkZ2VQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiB0aGUgcGFydCBhY2Nlc3NvciBuYW1lIGlzIG5vdCB3aGF0IHdlIGV4cGVjdAotICAgICAgICAgICAgUU5hbWUgcGFydE5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCFwYXJ0TmFtZS5lcXVhbHMocGFyYW0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oInhzZC51bmV4cGVjdGVkRWxlbWVudE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde3BhcmFtLmdldE5hbWUoKSwgcGFydE5hbWV9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtLmRlc2VyaWFsaXplKHJlYWRlciwgYnJpZGdlQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIHJlYWRlciBjb3VsZCBiZSBsZWZ0IG9uIENIQVJTIHRva2VuIHJhdGhlciB0aGFuIDxwYXJ0TmFtZT4KLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmlzV2hpdGVTcGFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7ICAgICAvLyA8L2Vudjpib2R5PgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NpbXBsZXR5cGUvRW5jb2RlclV0aWxzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zaW1wbGV0eXBlL0VuY29kZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGFmOWJhLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NpbXBsZXR5cGUvRW5jb2RlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zaW1wbGV0eXBlOwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEVuY29kZXJVdGlscyB7Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRzQ29sbGFwc2luZyhTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIGludCBzcGFuTGVuID0gMDsKLQotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBsZW47ICsraWR4KSB7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KGlkeCkpKSB7Ci0gICAgICAgICAgICAgICAgKytzcGFuTGVuOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzcGFuTGVuID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChzcGFuTGVuID09IGlkeCkgewotICAgICAgICAgICAgICAgICAgICAvLyBsZWFkaW5nIHdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWxlYWRpbmcsIG5vbi10cmFpbGluZyB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGlkeCAtIHNwYW5MZW4pICE9ICcgJykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgbm90IGEgc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuTGVuID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBzcGFuIG9mIG11bHRpcGxlIHdoaXRlc3BhY2UgY2hhcmFjdGVycwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcGFuTGVuID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzcGFuTGVuID4gMCkgewotICAgICAgICAgICAgLy8gdHJhaWxpbmcgd2hpdGVzcGFjZQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29sbGFwc2VXaGl0ZXNwYWNlKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKCFuZWVkc0NvbGxhcHNpbmcoc3RyKSkgewotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgbW9zdCBzdHJpbmdzIHdpbGwgbm90IG5lZWQgdG8gYmUgY29sbGFwc2VkLAotICAgICAgICAvLyBzbyB0aGUgY29kZSBiZWxvdyB3aWxsIHVzdWFsbHkgbm90IGJlIHJlYWNoZWQKLQotICAgICAgICBpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbbGVuXTsKLSAgICAgICAgc3RyLmdldENoYXJzKDAsIGxlbiwgYnVmLCAwKTsKLQotICAgICAgICBpbnQgbGVhZGluZ1dTTGVuID0gMDsKLSAgICAgICAgaW50IHRyYWlsaW5nV1NMZW4gPSAwOwotICAgICAgICBpbnQgc3BhbkxlbiA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgbGVuOyArK2lkeCkgewotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYnVmW2lkeF0pKSB7Ci0gICAgICAgICAgICAgICAgKytzcGFuTGVuOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzcGFuTGVuID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChzcGFuTGVuID09IGlkeCkgewotICAgICAgICAgICAgICAgICAgICAvLyBsZWFkaW5nIHdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgbGVhZGluZ1dTTGVuID0gc3BhbkxlbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBub24tbGVhZGluZywgbm9uLXRyYWlsaW5nIHdoaXRlc3BhY2UKLQotICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgYSBzcGFjZQotICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RXU0lkeCA9IGlkeCAtIHNwYW5MZW47Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZltmaXJzdFdTSWR4XSA9ICcgJzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkxlbiA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgYnV0IHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFdTSWR4ICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBpZHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IChzcGFuTGVuIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBmaXJzdFdTSWR4ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwYW5MZW4gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNwYW5MZW4gPiAwKSB7Ci0gICAgICAgICAgICAvLyB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gICAgICAgICAgICB0cmFpbGluZ1dTTGVuID0gc3BhbkxlbjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKAotICAgICAgICAgICAgYnVmLAotICAgICAgICAgICAgbGVhZGluZ1dTTGVuLAotICAgICAgICAgICAgbGVuIC0gbGVhZGluZ1dTTGVuIC0gdHJhaWxpbmdXU0xlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlV2hpdGVzcGFjZShTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGludCBmaXJzdE5vbldTID0gMDsKLSAgICAgICAgaW50IGlkeCA9IDA7Ci0gICAgICAgIGZvciAoOyBpZHggPCBsZW47ICsraWR4KSB7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KGlkeCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0Tm9uV1MgPCBpZHgpCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3RyLnN1YnN0cmluZyhmaXJzdE5vbldTLCBpZHgpKTsKLSAgICAgICAgICAgICAgICBmaXJzdE5vbldTID0gaWR4ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlyc3ROb25XUyA8IGlkeCkKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3RyLnN1YnN0cmluZyhmaXJzdE5vbldTLCBpZHgpKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NpbXBsZXR5cGUvU2ltcGxlVHlwZUNvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc2ltcGxldHlwZS9TaW1wbGVUeXBlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMTJkYzIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc2ltcGxldHlwZS9TaW1wbGVUeXBlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc2ltcGxldHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNlcmlhbGl6ZXJDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUE5hbWVzcGFjZUNvbnN0YW50czsKLQotLyoqCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2ltcGxlVHlwZUNvbnN0YW50cyBleHRlbmRzIFNlcmlhbGl6ZXJDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1hTSSA9IFNPQVBOYW1lc3BhY2VDb25zdGFudHMuWFNJOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9YU0QgPSBTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLlhTRDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfWFNJX1RZUEUgPSBuZXcgUU5hbWUoVVJJX1hTSSwgInR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1hTSV9OSUwgPSBuZXcgUU5hbWUoVVJJX1hTSSwgIm5pbCIpOwotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL0NsaWVudEVuY29kZXJEZWNvZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL0NsaWVudEVuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDA2N2MuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9DbGllbnRFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXA7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5pbnRlcm5hbC5JbnRlcm5hbEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5KQVhCQnJpZGdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLlJwY0xpdFBheWxvYWQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5BdHRhY2htZW50QmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5Cb2R5QmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5IZWFkZXJCbG9jazsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkludGVybmFsTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2UuRmF1bHRSZWFzb25UZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZS5TT0FQMTJGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuQ2hlY2tlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5FeGNlcHRpb25UeXBlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkphdmFNZXRob2Q7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUnVudGltZU1vZGVsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLldyYXBwZXJQYXJhbWV0ZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLkhhbmRsZXJDb250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqCi0gKiBTT0FQIENsaWVudCBzaWRlIGVuY29kZXIvZGVjb2Rlci4KLSAqLwotcHVibGljIGNsYXNzIENsaWVudEVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXIgaW1wbGVtZW50cyBJbnRlcm5hbEVuY29kZXIgewotICAgIHB1YmxpYyBDbGllbnRFbmNvZGVyRGVjb2RlcigpIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5ydC5lbmNvZGluZy5FbmNvZGVyRGVjb2RlckJhc2UjdG9NZXNzYWdlSW5mbyhqYXZhLmxhbmcuT2JqZWN0LCBjb20uc3VuLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRvTWVzc2FnZUluZm8oT2JqZWN0IGludE1lc3NhZ2UsIE1lc3NhZ2VJbmZvIG1pKSB7Ci0gICAgICAgIEludGVybmFsTWVzc2FnZSBpbSA9IChJbnRlcm5hbE1lc3NhZ2UpIGludE1lc3NhZ2U7Ci0gICAgICAgIEJvZHlCbG9jayBib2R5QmxvY2sgPSBpbS5nZXRCb2R5KCk7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q29udGV4dCA9IChSdW50aW1lQ29udGV4dCkgbWkuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19SVU5USU1FX0NPTlRFWFQpOwotICAgICAgICBKYXZhTWV0aG9kIGptID0gcnRDb250ZXh0LmdldE1vZGVsKCkuZ2V0SmF2YU1ldGhvZChtaS5nZXRNZXRob2QoKSk7Ci0gICAgICAgIG1pLnNldE1FUChqbS5nZXRNRVAoKSk7Ci0KLSAgICAgICAgT2JqZWN0IGJvZHlWYWx1ZSAgPSAoYm9keUJsb2NrID09IG51bGwpID8gbnVsbCA6IGJvZHlCbG9jay5nZXRWYWx1ZSgpOwotCi0gICAgICAgIGlmKGJvZHlWYWx1ZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEluZm8pewotICAgICAgICAgICAgU09BUEZhdWx0SW5mbyBzZmkgPSAoU09BUEZhdWx0SW5mbylib2R5VmFsdWU7Ci0gICAgICAgICAgICBPYmplY3QgZGV0YWlsID0gc2ZpLmdldERldGFpbCgpOwotICAgICAgICAgICAgaWYoZGV0YWlsID09IG51bGwgfHwgZGV0YWlsIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuRGV0YWlsKSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oc2ZpLmdldFNPQVBGYXVsdCgpKTsKLSAgICAgICAgICAgICAgICBtaS5zZXRSZXNwb25zZVR5cGUoTWVzc2FnZVN0cnVjdC5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgICAgICAgICAgbWkuc2V0UmVzcG9uc2Uoc2ZlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBKQVhCQnJpZGdlSW5mbyBiaSA9IChKQVhCQnJpZGdlSW5mbylkZXRhaWw7Ci0gICAgICAgICAgICBDaGVja2VkRXhjZXB0aW9uIGNlID0gam0uZ2V0Q2hlY2tlZEV4Y2VwdGlvbihiaS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgRXhjZXB0aW9uIGV4ID0gY3JlYXRlQ2hlY2tlZEV4Y2VwdGlvbihzZmkuZ2V0U3RyaW5nKCksIGNlLCBiaS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIG1pLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgICAgIG1pLnNldFJlc3BvbnNlKGV4KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGJvZHlWYWx1ZSBpbnN0YW5jZW9mIFNPQVAxMkZhdWx0SW5mbyl7Ci0gICAgICAgICAgICBTT0FQMTJGYXVsdEluZm8gc2ZpID0gKFNPQVAxMkZhdWx0SW5mbylib2R5VmFsdWU7Ci0gICAgICAgICAgICBPYmplY3QgZGV0YWlsID0gc2ZpLmdldERldGFpbCgpOwotICAgICAgICAgICAgaWYoZGV0YWlsID09IG51bGwgfHwgZGV0YWlsIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuRGV0YWlsKSB7Ci0vLyAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5EZXRhaWwgc2ZlRGV0YWlsID0gbnVsbDsKLS8vICAgICAgICAgICAgICAgIGlmKGRldGFpbCAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgICAgIHNmZURldGFpbCA9IChqYXZheC54bWwuc29hcC5EZXRhaWwpZGV0YWlsOwotLy8gICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IG51bGw7Ci0vLyAgICAgICAgICAgICAgICBMaXN0PEZhdWx0UmVhc29uVGV4dD4gZnJ0ID0gc2ZpLmdldFJlYXNvbnMoKS5nZXRGYXVsdFJlYXNvblRleHRzKCk7Ci0vLwotLy8gICAgICAgICAgICAgICAgLy9mb3Igbm93IHdlIHBpY2t1cCBvbmtseSB0aGUgZmlyc3QgUmVhc29uIFRleHQKLS8vICAgICAgICAgICAgICAgIGlmKGZydCAhPSBudWxsICYmICFmcnQuaXNFbXB0eSgpKQotLy8gICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IGZydC5nZXQoMCkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSBuZXcgU09BUEZhdWx0RXhjZXB0aW9uKHNmaS5nZXRTT0FQRmF1bHQoKSk7Ci0gICAgICAgICAgICAgICAgbWkuc2V0UmVzcG9uc2VUeXBlKE1lc3NhZ2VTdHJ1Y3QuQ0hFQ0tFRF9FWENFUFRJT05fUkVTUE9OU0UpOwotICAgICAgICAgICAgICAgIG1pLnNldFJlc3BvbnNlKHNmZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSkFYQkJyaWRnZUluZm8gYmkgPSAoSkFYQkJyaWRnZUluZm8pZGV0YWlsOwotICAgICAgICAgICAgQ2hlY2tlZEV4Y2VwdGlvbiBjZSA9IGptLmdldENoZWNrZWRFeGNlcHRpb24oYmkuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBudWxsOwotICAgICAgICAgICAgTGlzdDxGYXVsdFJlYXNvblRleHQ+IGZydCA9IHNmaS5nZXRSZWFzb25zKCkuZ2V0RmF1bHRSZWFzb25UZXh0cygpOwotICAgICAgICAgICAgLy9mb3Igbm93IHdlIHBpY2t1cCBvbmtseSB0aGUgZmlyc3QgUmVhc29uIFRleHQKLSAgICAgICAgICAgIGlmKGZydCAhPSBudWxsICYmICFmcnQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHJlYXNvbiA9IGZydC5nZXQoMCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIEV4Y2VwdGlvbiBleCA9IGNyZWF0ZUNoZWNrZWRFeGNlcHRpb24ocmVhc29uLCBjZSwgYmkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICBtaS5zZXRSZXNwb25zZVR5cGUoTWVzc2FnZVN0cnVjdC5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgICAgICBtaS5zZXRSZXNwb25zZShleCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm9jZXNzIGJvZHkvaGVhZGVycy9hdHRhY2htZW50cwotICAgICAgICBMaXN0PEhlYWRlckJsb2NrPiBoZWFkZXJzID0gaW0uZ2V0SGVhZGVycygpOwotICAgICAgICBNYXA8U3RyaW5nLCBBdHRhY2htZW50QmxvY2s+IGF0dGFjaG1lbnRzID0gaW0uZ2V0QXR0YWNobWVudHMoKTsKLSAgICAgICAgT2JqZWN0W10gZGF0YSA9IG1pLmdldERhdGEoKTsKLSAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpam0uZ2V0QmluZGluZygpOwotCi0gICAgICAgIC8vIFRPRE86IHdoeSBpcyB0aGUgYmluZGluZyBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0YW5jZT8KLSAgICAgICAgLy93aGF0IGhhcHBlbnMgd2hlbiBjbGllbnQgcmVjZWl2ZXMgdW5zb2xpY2l0ZWQgaGVhZGVycz8KLSAgICAgICAgaW50IGJCbG9ja3MgPSAoYm9keVZhbHVlICE9IG51bGwpPzE6MDsKLSAgICAgICAgaW50IGhCbG9ja3MgPSAoaW0uZ2V0SGVhZGVycygpICE9IG51bGwpP2ltLmdldEhlYWRlcnMoKS5zaXplKCk6MDsKLSAgICAgICAgaW50IG1CbG9ja3MgPSAoaW0uZ2V0QXR0YWNobWVudHMoKSAhPSBudWxsKT9pbS5nZXRBdHRhY2htZW50cygpLnNpemUoKTowOwotCi0gICAgICAgIGJvb2xlYW4gaXNSZXNwb25zZUFzeW5XcmFwcGVyID0gKGJCbG9ja3MgKyBoQmxvY2tzICsgbUJsb2NrcykgPiAxOwotCi0gICAgICAgIC8vZm9yIHJwY2xpdCB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIHBhcnRzIGJ1dCBvbmx5IG9uZSBib2R5YmxvY2sKLSAgICAgICAgLy8gc28gd2UgdXNlIGRpZmZlcmVudCBydWxlIGZvciBycGNsaXQKLSAgICAgICAgaWYoKGJvZHlWYWx1ZSBpbnN0YW5jZW9mIFJwY0xpdFBheWxvYWQpICYmICFpc1Jlc3BvbnNlQXN5bldyYXBwZXIpewotICAgICAgICAgICAgaXNSZXNwb25zZUFzeW5XcmFwcGVyID0gKCgoUnBjTGl0UGF5bG9hZClib2R5VmFsdWUpLmdldEJyaWRnZVBhcmFtZXRlcnMoKS5zaXplKCkgPiAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGptLmlzQXN5bmMoKSAmJiBpc1Jlc3BvbnNlQXN5bldyYXBwZXIpewotICAgICAgICAgICAgT2JqZWN0IGFzeW5jV3JhcHBlciA9IGNyZWF0ZUFzeW5jUmVzcG9uc2VDbGFzcyhqbS5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKS5nZXQoMCkpOwotICAgICAgICAgICAgaWYoYm9keVZhbHVlIGluc3RhbmNlb2YgUnBjTGl0UGF5bG9hZCl7Ci0gICAgICAgICAgICAgICAgUnBjTGl0UGF5bG9hZCBwYXlsb2FkID0gKFJwY0xpdFBheWxvYWQpYm9keVZhbHVlOwotICAgICAgICAgICAgICAgIGZvcihKQVhCQnJpZGdlSW5mbyBiaSA6IHBheWxvYWQuZ2V0QnJpZGdlUGFyYW1ldGVycygpKXsKLSAgICAgICAgICAgICAgICAgICAgc2V0QXN5bmNSZXNwb25zZVdyYXBwZXJWYWx1ZShydENvbnRleHQsIGFzeW5jV3JhcHBlciwgYmkuZ2V0VmFsdWUoKSwgYmkuZ2V0VHlwZSgpLnRhZ05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgICAgICBKQVhCQnJpZGdlSW5mbyB2YWx1ZSA9IChKQVhCQnJpZGdlSW5mbylib2R5VmFsdWU7Ci0gICAgICAgICAgICAgICAgc2V0QXN5bmNSZXNwb25zZVdyYXBwZXJWYWx1ZShydENvbnRleHQsIGFzeW5jV3JhcHBlciwgdmFsdWUuZ2V0VmFsdWUoKSwgdmFsdWUuZ2V0VHlwZSgpLnRhZ05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihpbS5nZXRIZWFkZXJzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvcihIZWFkZXJCbG9jayBoYiA6IGltLmdldEhlYWRlcnMoKSl7Ci0gICAgICAgICAgICAgICAgICAgIEpBWEJCcmlkZ2VJbmZvIHZhbHVlID0gKEpBWEJCcmlkZ2VJbmZvKWhiLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEFzeW5jUmVzcG9uc2VXcmFwcGVyVmFsdWUocnRDb250ZXh0LCBhc3luY1dyYXBwZXIsIHZhbHVlLmdldFZhbHVlKCksIHZhbHVlLmdldFR5cGUoKS50YWdOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZSBpZihhdHRhY2htZW50cyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBmb3IoU3RyaW5nIGlkIDogYXR0YWNobWVudHMua2V5U2V0KCkpewotICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50QmxvY2sgYWIgPSBhdHRhY2htZW50cy5nZXQoaWQpOwotICAgICAgICAgICAgICAgICAgICBpZihhYiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCA9IGFiLmdldFdTRExQYXJ0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXNuJ3QgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICBzZXRBc3luY1Jlc3BvbnNlV3JhcHBlclZhbHVlKHJ0Q29udGV4dCwgYXN5bmNXcmFwcGVyLCBhYi5hc0RhdGFIYW5kbGVyKCksIG5ldyBRTmFtZSgiIiwgcGFydCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1pLnNldFJlc3BvbnNlKGFzeW5jV3JhcHBlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH1lbHNlIGlmKGptLmlzQXN5bmMoKSAmJiAoKGJCbG9ja3MraEJsb2NrcyttQmxvY2tzKSA9PSAxKSl7Ci0gICAgICAgICAgICAvL3RoZXJlIGlzIG9ubHkgMSByZXNwb25zZSBwYXJ0Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgaWYoYm9keVZhbHVlIGluc3RhbmNlb2YgUnBjTGl0UGF5bG9hZCl7Ci0gICAgICAgICAgICAgICAgUnBjTGl0UGF5bG9hZCBwYXlsb2FkID0gKFJwY0xpdFBheWxvYWQpYm9keVZhbHVlOwotICAgICAgICAgICAgICAgIGZvcihKQVhCQnJpZGdlSW5mbyBiaTpwYXlsb2FkLmdldEJyaWRnZVBhcmFtZXRlcnMoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYmkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAoKEpBWEJCcmlkZ2VJbmZvKWJvZHlWYWx1ZSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYodmFsdWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgbWkuc2V0UmVzcG9uc2UodmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoaGVhZGVycyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBmb3IoSGVhZGVyQmxvY2sgaGIgOiBoZWFkZXJzKXsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKEpBWEJCcmlkZ2VJbmZvKWhiLmdldFZhbHVlKCkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgbWkuc2V0UmVzcG9uc2UodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihhdHRhY2htZW50cyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBmb3IoU3RyaW5nIGlkOmF0dGFjaG1lbnRzLmtleVNldCgpKXsKLSAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudEJsb2NrIGFiID0gYXR0YWNobWVudHMuZ2V0KGlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoYWIgPT0gbnVsbCkgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGlzbid0IGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgbWkuc2V0UmVzcG9uc2UoYWIuYXNEYXRhSGFuZGxlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYkJsb2NrcytoQmxvY2tzK21CbG9ja3M9PTEsIHNvIHdlIHNoYWxsIG5ldmVyIGdldCBoZXJlCi0gICAgICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogam0uZ2V0UmVzcG9uc2VQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYXJhbUJpbmRpbmcgPSBwYXJhbS5nZXRPdXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1CaW5kaW5nLmlzQm9keSgpKSB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBpZiB0aGUgYm9keVZhbHVlIHFuYW1lIGlzIHRoZSBvbmUgd2UgZXhwZWN0IQotICAgICAgICAgICAgICAgIG9iaiA9IGJvZHlWYWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVycyAhPSBudWxsICYmIHBhcmFtQmluZGluZy5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgSGVhZGVyQmxvY2sgaGVhZGVyID0gZ2V0SGVhZGVyQmxvY2socGFyYW0uZ2V0TmFtZSgpLCBoZWFkZXJzKTsKLSAgICAgICAgICAgICAgICBvYmogPSAoaGVhZGVyICE9IG51bGwpID8gaGVhZGVyLmdldFZhbHVlKCkgOiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUJpbmRpbmcuaXNBdHRhY2htZW50KCkpIHsKLSAgICAgICAgICAgICAgICBvYmogPSBnZXRBdHRhY2htZW50KHJ0Q29udGV4dCwgYXR0YWNobWVudHMsIHBhcmFtLCBwYXJhbUJpbmRpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IHJlc3AgPSBmaWxsRGF0YShydENvbnRleHQsIHBhcmFtLCBvYmosIGRhdGEsIHNvYXBCaW5kaW5nLCBwYXJhbUJpbmRpbmcpOwotICAgICAgICAgICAgaWYgKHBhcmFtLmlzUmVzcG9uc2UoKSkgewotICAgICAgICAgICAgICAgIG1pLnNldFJlc3BvbnNlKHJlc3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEFzeW5jUmVzcG9uc2VXcmFwcGVyVmFsdWUoUnVudGltZUNvbnRleHQgcnRDb250ZXh0LCBPYmplY3QgYmVhbiwgT2JqZWN0IHZhbHVlLCBRTmFtZSB0YWcpewotICAgICAgICBpZih2YWx1ZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHNldFdyYXBwZXJDaGlsZFZhbHVlKHJ0Q29udGV4dCwgYmVhbiwgdmFsdWUsIHRhZy5nZXROYW1lc3BhY2VVUkkoKSwgdGFnLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZUFzeW5jUmVzcG9uc2VDbGFzcyhQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7Ci0gICAgICAgIENsYXNzIGFzeW5jV3JhcHBlciA9IChDbGFzcylwYXJhbWV0ZXIuZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGU7Ci0gICAgICAgIGlmKFJwY0xpdFBheWxvYWQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhc3luY1dyYXBwZXIpKXsKLSAgICAgICAgICAgIFdyYXBwZXJQYXJhbWV0ZXIgd3AgPSAoV3JhcHBlclBhcmFtZXRlcilwYXJhbWV0ZXI7Ci0gICAgICAgICAgICBpZih3cC5nZXRXcmFwcGVyQ2hpbGRyZW4oKS5zaXplKCkgPiAwKXsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcCA9IHdwLmdldFdyYXBwZXJDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgICAgICAgICAgICBhc3luY1dyYXBwZXIgPSAoQ2xhc3MpIHAuZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGFzeW5jV3JhcHBlci5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFeGNlcHRpb24gY3JlYXRlQ2hlY2tlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQ2hlY2tlZEV4Y2VwdGlvbiBjZSwgT2JqZWN0IGRldGFpbCkgewotICAgICAgICBpZihjZS5nZXRFeGNlcHRpb25UeXBlKCkuZXF1YWxzKEV4Y2VwdGlvblR5cGUuVXNlckRlZmluZWQpKXsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVVc2VyRGVmaW5lZEV4Y2VwdGlvbihtZXNzYWdlLCBjZSwgZGV0YWlsKTsKLQotICAgICAgICB9Ci0gICAgICAgIENsYXNzIGV4Y2VwdGlvbkNsYXNzID0gY2UuZ2V0RXhjcGV0aW9uQ2xhc3MoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZXhjZXB0aW9uQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCAoQ2xhc3MpIGNlLmdldERldGFpbFR5cGUoKS50eXBlfSk7Ci0gICAgICAgICAgICBPYmplY3QgZXhjZXB0aW9uID0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde21lc3NhZ2UsIGRldGFpbH0pOwotICAgICAgICAgICAgcmV0dXJuIChFeGNlcHRpb24pZXhjZXB0aW9uOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2UKLSAgICAgKiBAcGFyYW0gZGV0YWlsCi0gICAgICovCi0gICAgcHJpdmF0ZSBFeGNlcHRpb24gY3JlYXRlVXNlckRlZmluZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIENoZWNrZWRFeGNlcHRpb24gY2UsIE9iamVjdCBkZXRhaWwpIHsKLSAgICAgICAgQ2xhc3MgZXhjZXB0aW9uQ2xhc3MgPSBjZS5nZXRFeGNwZXRpb25DbGFzcygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBleGNlcHRpb25DbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLSAgICAgICAgICAgIE9iamVjdCBleGNlcHRpb24gPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117bWVzc2FnZX0pOwotICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBkZXRhaWwuZ2V0Q2xhc3MoKS5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGZvcihGaWVsZCBmIDogZmllbGRzKXsKLSAgICAgICAgICAgICAgICBNZXRob2QgbSA9IGV4Y2VwdGlvbkNsYXNzLmdldE1ldGhvZChnZXRXcml0ZU1ldGhvZChmKSk7Ci0gICAgICAgICAgICAgICAgbS5pbnZva2UoZXhjZXB0aW9uLCBuZXcgT2JqZWN0W117Zi5nZXQoZGV0YWlsKX0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChFeGNlcHRpb24pZXhjZXB0aW9uOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGYKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRXcml0ZU1ldGhvZChGaWVsZCBmKXsKLSAgICAgICAgcmV0dXJuICJzZXQiICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShmLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucnQuZW5jb2RpbmcuRW5jb2RlckRlY29kZXJCYXNlI3RvSW50ZXJuYWxNZXNzYWdlKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIEludGVybmFsTWVzc2FnZSB0b0ludGVybmFsTWVzc2FnZShNZXNzYWdlSW5mbyBtaSkgewotICAgICAgICBSdW50aW1lQ29udGV4dCBydENvbnRleHQgPSAoUnVudGltZUNvbnRleHQpIG1pLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfUlVOVElNRV9DT05URVhUKTsKLSAgICAgICAgUnVudGltZU1vZGVsIG1vZGVsID0gcnRDb250ZXh0LmdldE1vZGVsKCk7Ci0KLSAgICAgICAgSmF2YU1ldGhvZCBqbSA9IG1vZGVsLmdldEphdmFNZXRob2QobWkuZ2V0TWV0aG9kKCkpOwotICAgICAgICBPYmplY3RbXSBkYXRhID0gbWkuZ2V0RGF0YSgpOwotICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgaW0gPSBuZXcgSW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgIC8vY29weSB0aGUgYXR0YWNobWVudHMgZnJvbSB0aGUgb3V0Ym91bmQgYXR0YWNobWVudHMgdG8gSW50ZXJuYWxNZXNzYWdlCi0gICAgICAgIFJlcXVlc3RDb250ZXh0IGN0eHQgPSAoUmVxdWVzdENvbnRleHQpbWkuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgY29weUF0dGFjaG1lbnRQcm9wZXJ0eShjdHh0LCBpbSk7Ci0gICAgICAgIEl0ZXJhdG9yPFBhcmFtZXRlcj4gaXRlciA9IGptLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpam0uZ2V0QmluZGluZygpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYXJhbUJpbmRpbmcgPSBwYXJhbS5nZXRJbkJpbmRpbmcoKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBjcmVhdGVQYXlsb2FkKHJ0Q29udGV4dCwgcGFyYW0sIGRhdGEsIG51bGwsIHNvYXBCaW5kaW5nLCBwYXJhbUJpbmRpbmcpOwotICAgICAgICAgICAgaWYgKHBhcmFtQmluZGluZy5pc0JvZHkoKSkgewotICAgICAgICAgICAgICAgIGltLnNldEJvZHkobmV3IEJvZHlCbG9jayhvYmopKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1CaW5kaW5nLmlzSGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBpbS5hZGRIZWFkZXIobmV3IEhlYWRlckJsb2NrKChKQVhCQnJpZGdlSW5mbylvYmopKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1CaW5kaW5nLmlzQXR0YWNobWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0YWNobWVudFBhcnQocnRDb250ZXh0LCBpbSwgb2JqLCBwYXJhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9EZXNlcmlhbGl6YXRpb25FeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvRGVzZXJpYWxpemF0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggNTg1ZWFhZi4uZDZjOWU5ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9EZXNlcmlhbGl6YXRpb25FeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL0Rlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgc3VwZXIoIm5lc3RlZERlc2VyaWFsaXphdGlvbkVycm9yIiwgYXJnKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLmVuY29kaW5nIjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL0VuY29kZXJEZWNvZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL0VuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmZiNGYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9FbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXA7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5FbmNvZGVyRGVjb2RlckJhc2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5KQVhCQnJpZGdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLlJwY0xpdFBheWxvYWQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5BdHRhY2htZW50QmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5IZWFkZXJCbG9jazsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkludGVybmFsTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlJlcXVlc3RDb250ZXh0OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYXd0LkltYWdlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLS8qKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqCi0gKiBCYXNlIFNPQVAgZW5jb2RlciBkZWNvZGVyIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW5jb2RlckRlY29kZXIgZXh0ZW5kcyBFbmNvZGVyRGVjb2RlckJhc2UgewotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhlIGRhdGFbXSB3aGljaCBpcyBvcmRlcmVkIGxpc3Qgb2YgamF2YSBtZXRob2QgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICB3aWxsIGJlIHVzZWQgaWYgbmVlZGVkCi0gICAgICogQHBhcmFtIG9iagotICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogQHJldHVybiBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBmaWxsRGF0YShSdW50aW1lQ29udGV4dCBjb250ZXh0LCBQYXJhbWV0ZXIgcGFyYW0sIE9iamVjdCBvYmosIE9iamVjdFtdIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nLCBQYXJhbWV0ZXJCaW5kaW5nIHBhcmFtQmluZGluZykgewotICAgICAgICBpZiAocGFyYW0uaXNXcmFwcGVyU3R5bGUoKSkgewotICAgICAgICAgICAgT2JqZWN0IHJlc3AgPSBudWxsOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcCA6ICgoV3JhcHBlclBhcmFtZXRlcikgcGFyYW0pLmdldFdyYXBwZXJDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHAuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuaXNEb2NMaXQoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3VwZXIuZ2V0V3JhcHBlckNoaWxkVmFsdWUoY29udGV4dCwgKChKQVhCQnJpZGdlSW5mbylvYmopLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgIH1lbHNlIGlmIChiaW5kaW5nLmlzUnBjTGl0KCkpewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldFdyYXBwZXJDaGlsZFZhbHVlKGNvbnRleHQsIG9iaiwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNldElmUHJpbWl0aXZlKHAuZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocC5pc1Jlc3BvbnNlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJlc3AgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFbcC5nZXRJbmRleCgpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIuc2V0SG9sZGVyVmFsdWUoZGF0YVtwLmdldEluZGV4KCldLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3AuZ2V0SW5kZXgoKV0gPSBwLmNyZWF0ZUhvbGRlclZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXNwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIXBhcmFtQmluZGluZy5pc0F0dGFjaG1lbnQoKSl7Ci0gICAgICAgICAgICBpZihwYXJhbUJpbmRpbmcuaXNVbmJvdW5kKCkpCi0gICAgICAgICAgICAgICAgb2JqID0gc2V0SWZQcmltaXRpdmUocGFyYW0uZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG9iaiA9IChvYmogIT0gbnVsbCk/KChKQVhCQnJpZGdlSW5mbylvYmopLmdldFZhbHVlKCk6bnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uaXNSZXNwb25zZSgpKSB7Ci0gICAgICAgICAgICBpZihwYXJhbUJpbmRpbmcuaXNVbmJvdW5kKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNldElmUHJpbWl0aXZlKHBhcmFtLmdldFR5cGVSZWZlcmVuY2UoKS50eXBlKTsKLSAgICAgICAgICAgIHJldHVybiBvYmo7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtwYXJhbS5nZXRJbmRleCgpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIuc2V0SG9sZGVyVmFsdWUoZGF0YVtwYXJhbS5nZXRJbmRleCgpXSwgb2JqKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGFbcGFyYW0uZ2V0SW5kZXgoKV0gPSBwYXJhbS5jcmVhdGVIb2xkZXJWYWx1ZShvYmopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHByaW1pdGl2ZSB0eXBlcy4gVG8gYmUgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCByZWZlcmVuZSBieSB0aGlzIHR5cGUgaXMgbnVsbC4KLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEByZXR1cm4gZGVmYXVsdCB2YWx1ZXMgb2YgcHJpbWl0aXZlIHR5cGVzIGlmIHR5cGUgaXMgcHJpbWl0aXZlIGVsc2UgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IHNldElmUHJpbWl0aXZlKFR5cGUgdHlwZSkgewotICAgICAgICBpZih0eXBlIGluc3RhbmNlb2YgQ2xhc3MpewotICAgICAgICAgICAgQ2xhc3MgY2xzID0gKENsYXNzKXR5cGU7Ci0gICAgICAgICAgICBpZihjbHMuaXNQcmltaXRpdmUoKSl7Ci0gICAgICAgICAgICAgICAgaWYoY2xzLmdldE5hbWUoKS5lcXVhbHMoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGVzIHRoZSBwYXlsb2FkIHRvIGJlIHNlcmlsaXplZCBvdmVyIHRoZSB3aXJlLiBJdCBjYW4gYmUgY29uc3RydWN0ZWQKLSAgICAgKiBmcm9tIHRoZSBwYXJhbWV0ZXJzIGluIGRhdGFbXSBvciBmcm9tIHRoZSByZXN1bHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgcnVudGltZSBjb250ZXh0LiBJdCBjYW4gYmUgdXNlZCB0byBnZXQgYWNjZXNzIHRvIHRoZQotICAgICAqICAgICAgICAgICAgSkFYQkNvbnRleHQuCi0gICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlcnMKLSAgICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAgICogICAgICAgICAgICBpdCBjb3VsZCBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyByZXNwb25zZSBvYmplY3QsZm9yIGV4YW1wbGUKLSAgICAgKiAgICAgICAgICAgIGluY2FzZSBvZiBvdXRnb2luZyBjbGllbnQgbWVzc2FnZS4KLSAgICAgKiBAcmV0dXJuIFBheWxvYWQgLSBkZWNpZGVkIGJ5IHRoZSBiaW5kaW5nIHVzZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVBheWxvYWQoUnVudGltZUNvbnRleHQgY29udGV4dCwgUGFyYW1ldGVyIHBhcmFtLCBPYmplY3RbXSBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmVzdWx0LCBTT0FQQmluZGluZyBiaW5kaW5nLCBQYXJhbWV0ZXJCaW5kaW5nIHBhcmFtQmluZGluZykgewotICAgICAgICBpZihwYXJhbUJpbmRpbmcuaXNBdHRhY2htZW50KCkpewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgICAgICAgICBpZihwYXJhbS5pc1Jlc3BvbnNlKCkpCi0gICAgICAgICAgICAgICAgb2JqID0gcmVzdWx0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG9iaiA9IHBhcmFtLmdldEhvbGRlclZhbHVlKGRhdGFbcGFyYW0uZ2V0SW5kZXgoKV0pOwotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGluZy5pc1JwY0xpdCgpICYmIHBhcmFtQmluZGluZy5pc0JvZHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJwY0xpdFBheWxvYWQoY29udGV4dCwgKFdyYXBwZXJQYXJhbWV0ZXIpIHBhcmFtLCBkYXRhLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCBvYmogPSBjcmVhdGVEb2NMaXRQYXlsb2FkVmFsdWUoY29udGV4dCwgcGFyYW0sIGRhdGEsIHJlc3VsdCk7Ci0gICAgICAgIFJ1bnRpbWVNb2RlbCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQnJpZGdlSW5mbyhtb2RlbC5nZXRCcmlkZ2UocGFyYW0uZ2V0VHlwZVJlZmVyZW5jZSgpKSwgb2JqKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2FsTmFtZSBvciBwYXJ0IGFjY2Vzc29yIGZyb20KLSAgICAgKiBycGNsaXQgc3RydWN0dXJlLgotICAgICAqCi0gICAgICogQHNlZSBFbmNvZGVyRGVjb2RlckJhc2UjZ2V0V3JhcHBlckNoaWxkVmFsdWUoUnVudGltZUNvbnRleHQsCi0gICAgICogICAgICBPYmplY3QsIFN0cmluZywgU3RyaW5nKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0V3JhcHBlckNoaWxkVmFsdWUoUnVudGltZUNvbnRleHQgY29udGV4dCwgT2JqZWN0IG9iaiwgU3RyaW5nIG5zVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBScGNMaXRQYXlsb2FkIHBheWxvYWQgPSAoUnBjTGl0UGF5bG9hZCkgb2JqOwotICAgICAgICBKQVhCQnJpZGdlSW5mbyBycGNQYXJhbSA9IHBheWxvYWQuZ2V0QnJpZGdlUGFyYW1ldGVyQnlOYW1lKGxvY2FsTmFtZSk7Ci0gICAgICAgIGlmKHJwY1BhcmFtICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcnBjUGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIGJpbmRpbmcgc3BlY2lmaWMgb2JqZWN0IHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogQHBhcmFtIHJlc3VsdAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZURvY0xpdFBheWxvYWRWYWx1ZShSdW50aW1lQ29udGV4dCBjb250ZXh0LCBQYXJhbWV0ZXIgcGFyYW0sIE9iamVjdFtdIGRhdGEsIE9iamVjdCByZXN1bHQpIHsKLSAgICAgICAgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVKQVhCQmVhblBheWxvYWQoY29udGV4dCwgKFdyYXBwZXJQYXJhbWV0ZXIpIHBhcmFtLCBkYXRhLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRCYXJlUGF5bG9hZChwYXJhbSwgZGF0YSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBIZWFkZXJCbG9jayBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBRTmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIGhlYWRlcnMKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5IZWFkZXJCbG9jazwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgKiA8Y29kZT5RTmFtZSBuYW1lPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBIZWFkZXJCbG9jayBnZXRIZWFkZXJCbG9jayhRTmFtZSBuYW1lLCBMaXN0PEhlYWRlckJsb2NrPiBoZWFkZXJzKSB7Ci0gICAgICAgIGZvciAoSGVhZGVyQmxvY2sgaGVhZGVyIDogaGVhZGVycykgewotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGhlYWRlci5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBlaXRoZXIgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhcmFtZXRlciBvciByZXN1bHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0KLSAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKiBAcmV0dXJuIEVpdGhlciB0aGUgdmFsdWUgb2YgcmVzcG9uc2Ugb2YgdGhlIHBhcmFtZXRlciBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4LCB0YWtlcyBjYXJlIG9mIEhvbGRlci52YWx1ZS4KLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldEJhcmVQYXlsb2FkKFBhcmFtZXRlciBwYXJhbSwgT2JqZWN0W10gZGF0YSwgT2JqZWN0IHJlc3VsdCkgewotICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKLSAgICAgICAgaWYgKHBhcmFtLmlzUmVzcG9uc2UoKSkgewotICAgICAgICAgICAgb2JqID0gcmVzdWx0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2JqID0gcGFyYW0uZ2V0SG9sZGVyVmFsdWUoZGF0YVtwYXJhbS5nZXRJbmRleCgpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIEpBWEIgc3R5bGUgd3JhcHBlciBiZWFuIGZyb20gdGhlIHBhcmFtZXRlcnMgb3IgcmVzdWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gcGFyYW0KLSAgICAgKiAgICAgICAgICAgIFdyYXBwZXJQYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKiBAcmV0dXJuIG5vbi1udWxsIEpBWEIgc3R5bGUgYmVhbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVKQVhCQmVhblBheWxvYWQoUnVudGltZUNvbnRleHQgY29udGV4dCwgV3JhcHBlclBhcmFtZXRlciBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gZGF0YSwgT2JqZWN0IHJlc3VsdCkgewotICAgICAgICBDbGFzcyBiZWFuID0gKENsYXNzKSBwYXJhbS5nZXRUeXBlUmVmZXJlbmNlKCkudHlwZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBiZWFuLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBmb3IoIFBhcmFtZXRlciBwIDogcGFyYW0uZ2V0V3JhcHBlckNoaWxkcmVuKCkgKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChwLmlzUmVzcG9uc2UoKSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHAuZ2V0SG9sZGVyVmFsdWUoZGF0YVtwLmdldEluZGV4KCldKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgc2V0V3JhcHBlckNoaWxkVmFsdWUoY29udGV4dCwgb2JqLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBScGNMaXRQYXlsb2FkIGZyb20gdGhlIHBhcmFtZXRlcnMgb3IgcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogQHBhcmFtIHJlc3VsdAotICAgICAqIEByZXR1cm4gbm9uLW51bGwgUnBjTGl0UGF5bG9hZAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZVJwY0xpdFBheWxvYWQoUnVudGltZUNvbnRleHQgY29udGV4dCwgV3JhcHBlclBhcmFtZXRlciBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGRhdGEsIE9iamVjdCByZXN1bHQpIHsKLSAgICAgICAgUnBjTGl0UGF5bG9hZCBwYXlsb2FkID0gbmV3IFJwY0xpdFBheWxvYWQocGFyYW0uZ2V0TmFtZSgpKTsKLQotICAgICAgICBmb3IgIChQYXJhbWV0ZXIgcCA6IHBhcmFtLmdldFdyYXBwZXJDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBpZihwLmdldEJpbmRpbmcoKS5pc1VuYm91bmQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocC5pc1Jlc3BvbnNlKCkpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBwLmdldEhvbGRlclZhbHVlKGRhdGFbcC5nZXRJbmRleCgpXSk7Ci0gICAgICAgICAgICBjaGVja1JQQ0xpdE51bGxhYmxlUGFyYW1ldGVyKHAsIHZhbHVlKTsKLSAgICAgICAgICAgIFJ1bnRpbWVNb2RlbCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTsKLSAgICAgICAgICAgIEpBWEJCcmlkZ2VJbmZvIGJpID0gbmV3IEpBWEJCcmlkZ2VJbmZvKG1vZGVsLmdldEJyaWRnZShwLmdldFR5cGVSZWZlcmVuY2UoKSksIHZhbHVlKTsKLSAgICAgICAgICAgIHBheWxvYWQuYWRkUGFyYW1ldGVyKGJpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGF5bG9hZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEF0dGFjaG1lbnQoUnVudGltZUNvbnRleHQgcnRDb250ZXh0LCBNYXA8U3RyaW5nLCBBdHRhY2htZW50QmxvY2s+IGF0dGFjaG1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0sIFBhcmFtZXRlckJpbmRpbmcgcGFyYW1CaW5kaW5nKXsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZyxBdHRhY2htZW50QmxvY2s+IGVudHJ5IDogYXR0YWNobWVudHMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRCbG9jayBhYiA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSBhYi5nZXRXU0RMUGFydE5hbWUoKTsKLSAgICAgICAgICAgICAgICAvLyBwYXJ0IGNhbiBiZSBudWxsIGlmIHRoZSBDb250ZW50LUlkIGlzIG5vdCBlbmNvZGVkIGFzIHBlciBBUCAxLjAgUjI5MzMuIFdoaWNoIGlzIG9rIHNpbmNlIHRoZXJlIGNvdWxkIGJlIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICAgICAgLy8gb3RoZXIgdGhhbiBXU0RMIE1JTUUgYm91bmQKLSAgICAgICAgICAgICAgICBpZihwYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgaWYocGFydC5lcXVhbHMocGFyYW0uZ2V0UGFydE5hbWUoKSkgfHwgcGFydC5lcXVhbHMoIjwiK3BhcmFtLmdldFBhcnROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IChDbGFzcylwYXJhbS5nZXRUeXBlUmVmZXJlbmNlKCkudHlwZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihEYXRhSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFiLmFzRGF0YUhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoYnl0ZVtdLmNsYXNzPT10eXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFiLmFzQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKFNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFiLmFzU291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKEltYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWIuYXNJbWFnZSgpOwotICAgICAgICAgICAgICAgICAgICBpZihJbnB1dFN0cmVhbS5jbGFzcz09dHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYi5hc0RhdGFIYW5kbGVyKCkuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoaXNYTUxNaW1lVHlwZShwYXJhbUJpbmRpbmcuZ2V0TWltZVR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWEJCcmlkZ2VJbmZvIGJpID0gKEpBWEJCcmlkZ2VJbmZvKXJ0Q29udGV4dC5nZXREZWNvZGVySW5mbyhwYXJhbS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWIuZGVzZXJpYWxpemUocnRDb250ZXh0LmdldEJyaWRnZUNvbnRleHQoKSxiaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dGFjaG1lbnRQYXJ0KFJ1bnRpbWVDb250ZXh0IHJ0Q29udGV4dCwgSW50ZXJuYWxNZXNzYWdlIGltLCBPYmplY3Qgb2JqLCBQYXJhbWV0ZXIgbWltZVBhcmFtKXsKLSAgICAgICAgaWYob2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFJ1bnRpbWVNb2RlbCBtb2RlbCA9IHJ0Q29udGV4dC5nZXRNb2RlbCgpOwotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBtaW1lUGFyYW0uZ2V0QmluZGluZygpLmdldE1pbWVUeXBlKCk7Ci0gICAgICAgIFN0cmluZyBjb250ZW50SWQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZW50SWQgPSBVUkxFbmNvZGVyLmVuY29kZShtaW1lUGFyYW0uZ2V0UGFydE5hbWUoKSwgIlVURi04IikrICc9JyArVVVJRC5yYW5kb21VVUlEKCkrIkBqYXh3cy5zdW4uY29tIjsKLSAgICAgICAgICAgIGNvbnRlbnRJZD0iPCIrY29udGVudElkKyI+IjsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEF0dGFjaG1lbnRCbG9jayBhYjsKLQotICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBEYXRhSGFuZGxlcikKLSAgICAgICAgICAgIGFiID0gQXR0YWNobWVudEJsb2NrLmZyb21EYXRhSGFuZGxlcihjb250ZW50SWQsKERhdGFIYW5kbGVyKW9iaik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgaWYob2JqIGluc3RhbmNlb2YgU291cmNlKQotICAgICAgICAgICAgLy8gdGhpcyBpcyBwb3RlbnRpYWxseSBicm9rZW4sIGFzIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoaXMgd2lsbCB3b3JrLgotICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGhhdmUgb3VyIG93biBBdHRhY2htZW50QmxvY2sgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMuCi0gICAgICAgICAgICBhYiA9IEF0dGFjaG1lbnRCbG9jay5mcm9tRGF0YUhhbmRsZXIoY29udGVudElkLCBuZXcgRGF0YUhhbmRsZXIob2JqLG1pbWVUeXBlKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgaWYob2JqIGluc3RhbmNlb2YgYnl0ZVtdKQotICAgICAgICAgICAgYWIgPSBBdHRhY2htZW50QmxvY2suZnJvbUJ5dGVBcnJheShjb250ZW50SWQsKGJ5dGVbXSlvYmosbWltZVR5cGUpOwotICAgICAgICBlbHNlCi0gICAgICAgIGlmKGlzWE1MTWltZVR5cGUobWltZVR5cGUpKQotICAgICAgICAgICAgYWIgPSBBdHRhY2htZW50QmxvY2suZnJvbUpBWEIoY29udGVudElkLAotICAgICAgICAgICAgICAgICAgICBuZXcgSkFYQkJyaWRnZUluZm8obW9kZWwuZ2V0QnJpZGdlKG1pbWVQYXJhbS5nZXRUeXBlUmVmZXJlbmNlKCkpLCBvYmopLAotICAgICAgICAgICAgICAgICAgICBydENvbnRleHQsIG1pbWVUeXBlICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYWxzbyBicm9rZW4sIGFzIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIG9iamVjdCB0eXBlIGFuZCB0aGUgTUlNRSB0eXBlCi0gICAgICAgICAgICAvLyBtYXRjaGVzLiBCdXQgbW9zdCBvZiB0aGUgdGltZSBpdCBtYXRjaGVzLCBzbyBpdCBtb3N0bHkgd29ya3MuCi0gICAgICAgICAgICBhYiA9IEF0dGFjaG1lbnRCbG9jay5mcm9tRGF0YUhhbmRsZXIoY29udGVudElkLG5ldyBEYXRhSGFuZGxlcihvYmosbWltZVR5cGUpKTsKLQotICAgICAgICAvL3BvcHVsYXRlIHRoZSBhdHRhY2htZW50IG1hcCBpbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIEhhbmRsZXJDb250ZXh0IGhjID0gcnRDb250ZXh0LmdldEhhbmRsZXJDb250ZXh0KCk7Ci0gICAgICAgIGlmKGhjICE9IG51bGwpewotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBoYy5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgaWYobWMgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlsLmFkZE1lc3NhZ2VBdHRhY2htZW50KG1jLCBhYi5nZXRJZCgpLCBhYi5hc0RhdGFIYW5kbGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW0uYWRkQXR0YWNobWVudChhYik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weUF0dGFjaG1lbnRQcm9wZXJ0eShNYXA8U3RyaW5nLCBPYmplY3Q+IGN0eHQsIEludGVybmFsTWVzc2FnZSBpbSkgewotICAgICAgICBpZihjdHh0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRNYXAgPSAoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KSBjdHh0LmdldChNZXNzYWdlQ29udGV4dC5PVVRCT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKTsKLSAgICAgICAgaWYgKGF0dE1hcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHQgOiBhdHRNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaW0uYWRkQXR0YWNobWVudChBdHRhY2htZW50QmxvY2suZnJvbURhdGFIYW5kbGVyKGF0dC5nZXRLZXkoKSwgYXR0LmdldFZhbHVlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1hNTE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSl7Ci0gICAgICAgIGlmKG1pbWVUeXBlLmVxdWFscygidGV4dC94bWwiKSB8fCBtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL3htbCIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgcnBjbGl0IGJvZHkgcGFydHMgZm9yIG51bGxhYmlsaXR5Ci0gICAgICovCi0gICAgdm9pZCBjaGVja1JQQ0xpdE51bGxhYmxlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTWV0aG9kIFBhcmFtZXRlcjogIitwYXJhbS5nZXROYW1lKCkgKyIgY2Fubm90IGJlIG51bGwuIFRoaXMgaXMgQlAgMS4xIFIyMjExIHZpb2xhdGlvbi4iKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU09BUDEyQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NPQVAxMkNvbnN0YW50cy5qYXZhCmluZGV4IDE1MTgwMjEuLmI4ODU4YzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU09BUDEyQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQMTJDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxMCArMjQsMTAgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwOwogCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKIAoraW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKIC8qKgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQpAQCAtNjcsOCArNjcsNiBAQAogCiAKICAgICAvL2ZhdWx0IGNvZGVzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBGQVVMVF9DT0RFX0NMSUVOVCAgICAgICAgICAgID0gbmV3IFFOYW1lKFVSSV9FTlZFTE9QRSwgIlNlbmRlciIpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRkFVTFRfQ09ERV9TRVJWRVIgICAgICAgICAgICA9IG5ldyBRTmFtZShVUklfRU5WRUxPUEUsICJSZWNlaXZlciIpOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRkFVTFRfQ09ERV9NVVNUX1VOREVSU1RBTkQgICA9IG5ldyBRTmFtZShVUklfRU5WRUxPUEUsICJNdXN0VW5kZXJzdGFuZCIpOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRkFVTFRfQ09ERV9NSVNVTkRFUlNUT09EICAgPSBuZXcgUU5hbWUoVVJJX0VOVkVMT1BFLCAiTWlzdW5kZXJzdG9vZCIpOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRkFVTFRfQ09ERV9WRVJTSU9OX01JU01BVENIICA9IG5ldyBRTmFtZShVUklfRU5WRUxPUEUsICJWZXJzaW9uTWlzbWF0Y2giKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU09BUENvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQQ29uc3RhbnRzLmphdmEKaW5kZXggOTAwYjRiMC4uMWFkMGI1NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsMTAgKzI2LDEwIEBACiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcDsKIAotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwogCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKwogLyoqCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCkBAIC01Miw4ICs1Miw2IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBRTkFNRV9TT0FQX0ZBVUxUX1NUUklORyAgICAgICAgICAgICA9IG5ldyBRTmFtZSgiIiwgImZhdWx0c3RyaW5nIik7CiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBRTkFNRV9TT0FQX0ZBVUxUX0FDVE9SICAgICAgICAgICAgID0gbmV3IFFOYW1lKCIiLCAiZmF1bHRhY3RvciIpOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgUU5BTUVfU09BUF9GQVVMVF9ERVRBSUwgICAgICAgICAgICAgPSBuZXcgUU5hbWUoIiIsICJkZXRhaWwiKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEZBVUxUX0NPREVfQ0xJRU5UICAgICAgICAgICAgPSBuZXcgUU5hbWUoVVJJX0VOVkVMT1BFLCAiQ2xpZW50Iik7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBGQVVMVF9DT0RFX1NFUlZFUiAgICAgICAgICAgID0gbmV3IFFOYW1lKFVSSV9FTlZFTE9QRSwgIlNlcnZlciIpOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRkFVTFRfQ09ERV9NVVNUX1VOREVSU1RBTkQgICA9IG5ldyBRTmFtZShVUklfRU5WRUxPUEUsICJNdXN0VW5kZXJzdGFuZCIpOwogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBGQVVMVF9DT0RFX1ZFUlNJT05fTUlTTUFUQ0ggID0gbmV3IFFOYW1lKFVSSV9FTlZFTE9QRSwgIlZlcnNpb25NaXNtYXRjaCIpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQRGVjb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNmMDllLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU09BUERlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXA7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkRlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLmludGVybmV0LkNvbnRlbnRUeXBlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLmludGVybmV0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnV0aWwuQnl0ZUlucHV0U3RyZWFtOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLkpBWFdTQXR0YWNobWVudFVubWFyc2hhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCcmlkZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuUnBjTGl0UGF5bG9hZDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLlJwY0xpdFBheWxvYWRTZXJpYWxpemVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuQXR0YWNobWVudEJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuQm9keUJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSGVhZGVyQmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUE5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLkhhbmRsZXJDaGFpbkNhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLkhhbmRsZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUFJ1bnRpbWVNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlNvdXJjZVJlYWRlckZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFJlYWRlckV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU09BUFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoLkRpc3BhdGNoQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guaW1wbC5lbmNvZGluZy5EaXNwYXRjaFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5GYXN0SW5mb3NldFJlZmxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IHN0YXRpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlci4qOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNPQVBEZWNvZGVyIGltcGxlbWVudHMgRGVjb2RlciB7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT1RfVU5ERVJTVE9PRF9IRUFERVJTID0KLSAgICAgICAgIm5vdC11bmRlcnN0b29kIHNvYXAgaGVhZGVycyI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKAotICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5zb2FwLmRlY29kZXIiKTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE1VU1RfVU5ERVJTVEFORF9GQVVMVF9NRVNTQUdFX1NUUklORyA9Ci0gICAgICAgICJTT0FQIG11c3QgdW5kZXJzdGFuZCBlcnJvciI7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnBlcHQuZW5jb2RpbmcuRGVjb2RlciNkZWNvZGUoY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoTWVzc2FnZUluZm8gYXJnMCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnBlcHQuZW5jb2RpbmcuRGVjb2RlciNyZWNlaWV2ZUFuZERlY29kZShjb20uc3VuLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVBbmREZWNvZGUoTWVzc2FnZUluZm8gYXJnMCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwYXJzZXMgYW5kIGJpbmRzIGhlYWRlcnMsIGJvZHkgZnJvbSBTT0FQTWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwTWVzc2FnZQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkludGVybmFsTWVzc2FnZTwvY29kZT4gZm9yIHRoZSA8Y29kZT5zb2FwTWVzc2FnZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZXJuYWxNZXNzYWdlIHRvSW50ZXJuYWxNZXNzYWdlKFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm9sZXMgcmVxdWlyZWQgZm9yIHRoZSB0eXBlIG9mIGJpbmRpbmcuIFJldHVybnMKLSAgICAgKiBhbiBlbXB0eSBzZXQgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldFJlcXVpcmVkUm9sZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuZCBiaW5kcyBoZWFkZXJzIGZyb20gU09BUE1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gaW50ZXJuYWxNZXNzYWdlCi0gICAgICogQHBhcmFtIG1lc3NhZ2VJbmZvCi0gICAgICogQHJldHVybiB0aGUgSW50ZXJuYWxNZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTT0FQTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBJbnRlcm5hbE1lc3NhZ2UgdG9JbnRlcm5hbE1lc3NhZ2UoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgdG9TT0FQTWVzc2FnZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0b01lc3NhZ2VJbmZvKEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldEVudmVsb3BlVGFnKCkgewotICAgICAgICByZXR1cm4gU09BUENvbnN0YW50cy5RTkFNRV9TT0FQX0VOVkVMT1BFOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRCb2R5VGFnKCkgewotICAgICAgICByZXR1cm4gU09BUENvbnN0YW50cy5RTkFNRV9TT0FQX0JPRFk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldEhlYWRlclRhZygpIHsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25zdGFudHMuUU5BTUVfU09BUF9IRUFERVI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldE1VQXR0clFOYW1lKCkgewotICAgICAgICByZXR1cm4gU09BUENvbnN0YW50cy5RTkFNRV9NVVNUVU5ERVJTVEFORDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWUgZ2V0Um9sZUF0dHJRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25zdGFudHMuUU5BTUVfUk9MRTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWUgZ2V0RmF1bHRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVBfRkFVTFQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldEZhdWx0RGV0YWlsVGFnKCkgewotICAgICAgICByZXR1cm4gU09BUENvbnN0YW50cy5RTkFNRV9TT0FQX0ZBVUxUX0RFVEFJTDsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNraXBCb2R5KFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIFNUQVJUX0VMRU1FTlQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEJvZHlUYWcoKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsgICAgLy8gTW92ZXMgdG8gPC9Cb2R5PgotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNraXBIZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIFNUQVJUX0VMRU1FTlQpOwotICAgICAgICBpZiAoIWlzRGlzcGF0Y2gobWVzc2FnZUluZm8pKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmICghU09BUE5hbWVzcGFjZUNvbnN0YW50cy5UQUdfSEVBREVSLmVxdWFscyhyZWFkZXIuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL1hNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0SGVhZGVyVGFnKCkpOwotCi0gICAgICAgIGRpc3BhdGNoVXRpbC5jb2xsZWN0UHJlZml4ZXMocmVhZGVyKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7ICAgIC8vIE1vdmVzIHRvIDwvSGVhZGVyPgotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcEhlYWRlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBpZiAobWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfTU9ERSkgPT0KLSAgICAgICAgICAgIFNlcnZpY2UuTW9kZS5QQVlMT0FEKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIHNraXBCb2R5IGlzIHRydWUsIHRoZSBib2R5IGlzIHNraXBwZWQgZHVyaW5nIHBhcnNpbmcuCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWNvZGVFbnZlbG9wZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBJbnRlcm5hbE1lc3NhZ2UgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNraXBCb2R5LCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0RW52ZWxvcGVUYWcoKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgICAgIGlmIChza2lwSGVhZGVyKG1lc3NhZ2VJbmZvKSkKLSAgICAgICAgICAgIHNraXBIZWFkZXIocmVhZGVyLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRlY29kZUhlYWRlcihyZWFkZXIsIG1lc3NhZ2VJbmZvLCByZXF1ZXN0KTsKLQotCi0gICAgICAgIGlmIChza2lwQm9keSkgewotICAgICAgICAgICAgc2tpcEJvZHkocmVhZGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlY29kZUJvZHkocmVhZGVyLCByZXF1ZXN0LCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBFTkRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0RW52ZWxvcGVUYWcoKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBFTkRfRE9DVU1FTlQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZUhlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxNZXNzYWdlIHJlcXVlc3QpIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIFNUQVJUX0VMRU1FTlQpOwotCi0KLSAgICAgICAgaWYgKCFTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLlRBR19IRUFERVIuZXF1YWxzKHJlYWRlci5nZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEhlYWRlclRhZygpKTsKLSAgICAgICAgaWYgKGlzRGlzcGF0Y2gobWVzc2FnZUluZm8pKQotICAgICAgICAgICAgZGlzcGF0Y2hVdGlsLmNvbGxlY3RQcmVmaXhlcyhyZWFkZXIpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBTVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgZGVjb2RlSGVhZGVyRWxlbWVudChyZWFkZXIsIG1lc3NhZ2VJbmZvLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIEVORF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcocmVhZGVyLCBnZXRIZWFkZXJUYWcoKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgfQotCi0vKgotKiBJZiBKQVhCIGNhbiBkZXNlcmlhbGl6ZSBhIGhlYWRlciwgZGVzZXJpYWxpemUgaXQuCi0qIE90aGVyd2lzZSwganVzdCBpZ25vcmUgdGhlIGhlYWRlcgotKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZUhlYWRlckVsZW1lbnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIGlmIChydEN0eHQgPT0gbnVsbCkgewotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7ICAgICAgICAgICAvLyBNb3ZlcyB0byBFTkQgc3RhdGUKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQnJpZGdlQ29udGV4dCBicmlkZ2VDb250ZXh0ID0gcnRDdHh0LmdldEJyaWRnZUNvbnRleHQoKTsKLSAgICAgICAgU2V0PFFOYW1lPiBrbm93bkhlYWRlcnMgPSAoKFNPQVBSdW50aW1lTW9kZWwpIHJ0Q3R4dC5nZXRNb2RlbCgpKS5nZXRLbm93bkhlYWRlcnMoKTsKLSAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChrbm93bkhlYWRlcnMgIT0gbnVsbCAmJiBrbm93bkhlYWRlcnMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIFFOYW1lIGhlYWRlck5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG1zZy5pc0hlYWRlclByZXNlbnQobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBNb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mIGhlYWRlciB3aG9zZSBRTmFtZSBpcyBtYXBwZWQgdG8gYQotICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBwYXJhbWV0ZXIuIEdlbmVyYXRlcyBhIHJ1bnRpbWUgZXJyb3IuCi0gICAgICAgICAgICAgICAgcmFpc2VGYXVsdChnZXRTZW5kZXJGYXVsdENvZGUoKSwgRFVQTElDQVRFX0hFQURFUiArIGhlYWRlck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IGRlY29kZXJJbmZvID0gcnRDdHh0LmdldERlY29kZXJJbmZvKG5hbWUpOwotICAgICAgICAgICAgaWYgKGRlY29kZXJJbmZvICE9IG51bGwgJiYgZGVjb2RlckluZm8gaW5zdGFuY2VvZiBKQVhCQnJpZGdlSW5mbykgewotICAgICAgICAgICAgICAgIEpBWEJCcmlkZ2VJbmZvIGJyaWRnZUluZm8gPSAoSkFYQkJyaWRnZUluZm8pIGRlY29kZXJJbmZvOwotLy8gSkFYQiBsZWF2ZXMgb24gPC9lbnY6SGVhZGVyPiBvciA8bmV4dEhlYWRlckVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgYnJpZGdlSW5mby5kZXNlcmlhbGl6ZShyZWFkZXIsIGJyaWRnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgIEhlYWRlckJsb2NrIGhlYWRlckJsb2NrID0gbmV3IEhlYWRlckJsb2NrKGJyaWRnZUluZm8pOwotICAgICAgICAgICAgICAgIG1zZy5hZGRIZWFkZXIoaGVhZGVyQmxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOyAgICAgICAgICAgLy8gTW92ZXMgdG8gRU5EIHN0YXRlCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlQm9keShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBJbnRlcm5hbE1lc3NhZ2UgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0Qm9keVRhZygpKTsKLSAgICAgICAgaW50IHN0YXRlID0gWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgZGVjb2RlQm9keUNvbnRlbnQocmVhZGVyLCByZXNwb25zZSwgbWVzc2FnZUluZm8pOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgRU5EX0VMRU1FTlQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEJvZHlUYWcoKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlQm9keUNvbnRlbnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgSW50ZXJuYWxNZXNzYWdlIHJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIEJyaWRnZUNvbnRleHQgYnJpZGdlQ29udGV4dCA9IHJ0Q3R4dC5nZXRCcmlkZ2VDb250ZXh0KCk7Ci0gICAgICAgIGRlY29kZURpc3BhdGNoTWV0aG9kKHJlYWRlciwgcmVzcG9uc2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBTVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUoKTsgLy8gT3BlcmF0aW9uIG5hbWUKLSAgICAgICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhnZXRFbnZlbG9wZVRhZygpLmdldE5hbWVzcGFjZVVSSSgpKSAmJgotICAgICAgICAgICAgICAgIG5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKFNPQVBOYW1lc3BhY2VDb25zdGFudHMuVEFHX0ZBVUxUKSkgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdEluZm8gc29hcEZhdWx0SW5mbyA9IGRlY29kZUZhdWx0KHJlYWRlciwgcmVzcG9uc2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBCb2R5QmxvY2sgcmVzcG9uc2VCb2R5ID0gbmV3IEJvZHlCbG9jayhzb2FwRmF1bHRJbmZvKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRCb2R5KHJlc3BvbnNlQm9keSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9iamVjdCBkZWNvZGVySW5mbyA9IHJ0Q3R4dC5nZXREZWNvZGVySW5mbyhuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckluZm8gIT0gbnVsbCAmJiBkZWNvZGVySW5mbyBpbnN0YW5jZW9mIEpBWEJCcmlkZ2VJbmZvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYQkJyaWRnZUluZm8gYnJpZGdlSW5mbyA9IChKQVhCQnJpZGdlSW5mbykgZGVjb2RlckluZm87Ci0gICAgICAgICAgICAgICAgICAgIGJyaWRnZUluZm8uZGVzZXJpYWxpemUocmVhZGVyLCBicmlkZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgQm9keUJsb2NrIHJlc3BvbnNlQm9keSA9IG5ldyBCb2R5QmxvY2soYnJpZGdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEJvZHkocmVzcG9uc2VCb2R5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckluZm8gIT0gbnVsbCAmJiBkZWNvZGVySW5mbyBpbnN0YW5jZW9mIFJwY0xpdFBheWxvYWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBScGNMaXRQYXlsb2FkIHJwY0xpdFBheWxvYWQgPSAoUnBjTGl0UGF5bG9hZCkgZGVjb2RlckluZm87Ci0gICAgICAgICAgICAgICAgICAgIFJwY0xpdFBheWxvYWRTZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlYWRlciwgcnBjTGl0UGF5bG9hZCwgYnJpZGdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIEJvZHlCbG9jayByZXNwb25zZUJvZHkgPSBuZXcgQm9keUJsb2NrKHJwY0xpdFBheWxvYWQpOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRCb2R5KHJlc3BvbnNlQm9keSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVjb2RlRGlzcGF0Y2hNZXRob2QoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgSW50ZXJuYWxNZXNzYWdlIHJlcXVlc3QsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNPQVBGYXVsdEluZm8gZGVjb2RlRmF1bHQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLS8qCi0qCi0qLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29udmVydEJvZHlCbG9jayhJbnRlcm5hbE1lc3NhZ2UgcmVxdWVzdCwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgQm9keUJsb2NrIGJvZHlCbG9jayA9IHJlcXVlc3QuZ2V0Qm9keSgpOwotICAgICAgICBpZiAoYm9keUJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGJvZHlCbG9jay5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSkFYQkJyaWRnZUluZm8gfHwgdmFsdWUgaW5zdGFuY2VvZiBScGNMaXRQYXlsb2FkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gKFNvdXJjZSkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFNvdXJjZVJlYWRlckZhY3RvcnkuY3JlYXRlU291cmNlUmVhZGVyKHNvdXJjZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICBkZWNvZGVCb2R5Q29udGVudChyZWFkZXIsIHJlcXVlc3QsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlNob3VsZG4ndCBoYXBwZW4uIFVua25vd24gdHlwZSBpbiBCb2R5QmxvY2sgPSIgKyB2YWx1ZS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtaQotICAgICAqIEBwYXJhbSBpbQotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBdHRhY2htZW50cyhNZXNzYWdlSW5mbyBtaSwgSW50ZXJuYWxNZXNzYWdlIGltLCBTT0FQTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IG1lc3NhZ2UuZ2V0QXR0YWNobWVudHMoKTsKLSAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBKQVhXU0F0dGFjaG1lbnRVbm1hcnNoYWxsZXIgYXUgPSBudWxsOwotICAgICAgICAgICAgaWYgKE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtaSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBhdSA9IChKQVhXU0F0dGFjaG1lbnRVbm1hcnNoYWxsZXIpIE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtaSkuZ2V0QnJpZGdlQ29udGV4dCgpLmdldEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vZm9yIGRpc3BhdGNoCi0gICAgICAgICAgICAgICAgVW5tYXJzaGFsbGVyIG0gPSAoVW5tYXJzaGFsbGVyKW1pLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfVU5NQVJTSEFMTEVSKTsKLSAgICAgICAgICAgICAgICBpZiAobSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhdSA9IChKQVhXU0F0dGFjaG1lbnRVbm1hcnNoYWxsZXIpIG0uZ2V0QXR0YWNobWVudFVubWFyc2hhbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF1ICE9IG51bGwpewotICAgICAgICAgICAgICAgIGF1LnNldFhPUFBhY2thZ2UoaXNYT1BQYWNrYWdlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgICAgICBhdS5zZXRBdHRhY2htZW50cyhpbS5nZXRBdHRhY2htZW50cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSAoQXR0YWNobWVudFBhcnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaW0uYWRkQXR0YWNobWVudChBdHRhY2htZW50QmxvY2suZnJvbVNBQUooYXApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyb20gdGhlIFNPQVAgbWVzc2FnZSBoZWFkZXIgZmluZCBvdXQgaWYgaXRzIGEgWE9QIHBhY2thZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc20KLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1hPUFBhY2thZ2UoU09BUE1lc3NhZ2Ugc20pIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjdCA9IGdldENvbnRlbnRUeXBlKHNtLmdldFNPQVBQYXJ0KCkpOwotICAgICAgICBDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG5ldyBDb250ZW50VHlwZShjdCk7Ci0gICAgICAgIFN0cmluZyBwcmltYXJ5ID0gY29udGVudFR5cGUuZ2V0UHJpbWFyeVR5cGUoKTsKLSAgICAgICAgU3RyaW5nIHN1YiA9IGNvbnRlbnRUeXBlLmdldFN1YlR5cGUoKTsKLSAgICAgICAgaWYgKHByaW1hcnkuZXF1YWxzSWdub3JlQ2FzZSgiYXBwbGljYXRpb24iKSAmJiBzdWIuZXF1YWxzSWdub3JlQ2FzZSgieG9wK3htbCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGNvbnRlbnRUeXBlLmdldFBhcmFtZXRlcigidHlwZSIpOwotICAgICAgICAgICAgaWYgKHR5cGUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJ0ZXh0L3htbCIpIHx8IHR5cGUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi9zb2FwK3htbCIpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZShTT0FQUGFydCBwYXJ0KSB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHBhcnQuZ2V0TWltZUhlYWRlcigiQ29udGVudC1UeXBlIik7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdmFsdWVzWzBdOwotICAgIH0KLQotLyoKLSogSXQgZG9lcyBtdXN0VW5kZXJzdGFuZCBwcm9jZXNzaW5nLCBhbmQgZG9lcyBiZXN0IGd1ZXNzIG9mIE1FUAotKgotKiBBdm9pZHMgU0FBSiBjYWxsIHRoYXQgY3JlYXRlIERPTS4KLSoKLSovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBkb011c3RVbmRlcnN0YW5kUHJvY2Vzc2luZyhTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlSW5mbyBtaSwgSGFuZGxlckNvbnRleHQgaGFuZGxlckNvbnRleHQsIGJvb2xlYW4gZ2V0TUVQKQotICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiBvbmV3YXkgPSBmYWxzZTsKLSAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIEJ5dGVJbnB1dFN0cmVhbSBiaXMgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3RyZWFtU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgU3RyZWFtU291cmNlIHN0cmVhbVNvdXJjZSA9IChTdHJlYW1Tb3VyY2UpIHNvdXJjZTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHN0cmVhbVNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsICYmIGlzIGluc3RhbmNlb2YgQnl0ZUlucHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJpcyA9ICgoQnl0ZUlucHV0U3RyZWFtKSBpcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmUoIlNBQUogU3RyZWFtU291cmNlIGRvZXNuJ3QgaGF2ZSBCeXRlSW5wdXRTdHJlYW0gIiArIGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5pc0Zhc3RJbmZvc2V0U291cmNlKHNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBiaXMgPSAoQnl0ZUlucHV0U3RyZWFtKSBGYXN0SW5mb3NldFJlZmxlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFzdEluZm9zZXRTb3VyY2VfZ2V0SW5wdXRTdHJlYW0oc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oImZhc3RpbmZvc2V0Lm5vSW1wbGVtZW50YXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKCJJbmVmZmljaWVudCBVc2UgLSBTT0FQTWVzc2FnZSBpcyBhbHJlYWR5IHBhcnNlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0KLSAgICAgICAgICAgICAgICBTb3VyY2VSZWFkZXJGYWN0b3J5LmNyZWF0ZVNvdXJjZVJlYWRlcihzb3VyY2UsIHRydWUpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgIGNoZWNrTXVzdFVuZGVyc3RhbmRIZWFkZXJzKHJlYWRlciwgbWksIGhhbmRsZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKGdldE1FUCkgewotICAgICAgICAgICAgICAgIG9uZXdheSA9IGlzT25ld2F5KHJlYWRlciwgbWkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5jbG9zZShyZWFkZXIpOwotICAgICAgICAgICAgaWYgKGJpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmlzLmNsb3NlKCk7ICAgICAgICAgICAgLy8gcmVzZXRzIHN0cmVhbTsgU0FBSiBoYXMgd2hvbGUgc3RyZWFtCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvbmV3YXk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbVJlYWRlckV4Y2VwdGlvbiB4ZSkgewotICAgICAgICAgICAgcmFpc2VCYWRYTUxGYXVsdChoYW5kbGVyQ29udGV4dCk7Ci0gICAgICAgICAgICB0aHJvdyB4ZTsKLSAgICAgICAgfQotICAgIH0KLQotLyoKLSogcmV0dXJucyBPbmV3YXkgb3Igbm90LiByZWFkZXIgaXMgb24gPEJvZHk+Ci0qCi0qIFBlZWsgaW50byB0aGUgYm9keSBhbmQgbWFrZSBhIGJlc3QgZ3Vlc3MgYXMgdG8gd2hldGhlciB0aGUgcmVxdWVzdAotKiBpcyBvbmUtd2F5IG9yIG5vdC4gQXNzdW1lIHJlcXVlc3QtcmVzcG9uc2UgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuCi0qCi0qLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT25ld2F5KFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE1lc3NhZ2VJbmZvIG1pKSB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBTVEFSVF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcocmVhZGVyLCBnZXRCb2R5VGFnKCkpOyAgICAvLyA8Qm9keT4KLSAgICAgICAgaW50IHN0YXRlID0gWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UKSB7ICAgLy8gaGFuZGxlcyBlbXB0eSBCb2R5IGkuZS4gPEJvZHkvPgotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1pKTsKLSAgICAgICAgcnRDdHh0LnNldE1ldGhvZEFuZE1FUChvcGVyYXRpb25OYW1lLCBtaSk7Ci0gICAgICAgIHJldHVybiAobWkuZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEb2VzIE1VIHByb2Nlc3NpbmcuIHJlYWRlciBpcyBvbiA8RW52ZWxvcGU+LCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kCi0gICAgICogbGVhdmVzIGl0IG9uIDxCb2R5Pi4gT25jZSB0aGUgcm9sZXMgYW5kIHVuZGVyc3Rvb2QgaGVhZGVycyBhcmUKLSAgICAgKiBrbm93biwgdGhpcyBjYWxscyBhIHNlcGFyYXRlIG1ldGhvZCB0byBjaGVjayB0aGUgbWVzc2FnZSBoZWFkZXJzCi0gICAgICogc2luY2UgYSBkaWZmZXJlbnQgYmVoYXZpb3IgaXMgZXhwZWN0ZWQgd2l0aCBkaWZmZXJlbnQgYmluZGluZ3MuCi0gICAgICoKLSAgICAgKiBBbHNvIGFzc3VtZSBoYW5kbGVyIGNoYWluIGNhbGxlciBpcyBudWxsIHVubGVzcyBvbmUgaXMgZm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTXVzdFVuZGVyc3RhbmRIZWFkZXJzKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VJbmZvIG1pLCBIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0KLSAgICAgICAgLy8gRGVjb2RlIGVudmVsb3BlCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBTVEFSVF9FTEVNRU5UKTsKLSAgICAgICAgUU5hbWUgZ290ID0gcmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgUU5hbWUgZXhwID0gZ2V0RW52ZWxvcGVUYWcoKTsKLSAgICAgICAgaWYgKGdvdC5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoZXhwLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgaWYgKCFnb3QuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKGV4cC5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICByYWlzZUZhdWx0KGdldFZlcnNpb25NaXNtYXRjaEZhdWx0Q29kZSgpLAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBTT0FQIGVudmVsb3BlIHZlcnNpb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEVudmVsb3BlVGFnKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotCi0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIFNUQVJUX0VMRU1FTlQpOwotICAgICAgICBpZiAoIVNPQVBOYW1lc3BhY2VDb25zdGFudHMuVEFHX0hFQURFUi5lcXVhbHMocmVhZGVyLmdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAvLyBObyBIZWFkZXIsIG5vIE1VIHByb2Nlc3NpbmcKLSAgICAgICAgfQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEhlYWRlclRhZygpKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLQotICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWkpOwotCi0gICAgICAgIC8vIHN0YXJ0IHdpdGgganVzdCB0aGUgZW5kcG9pbnQgcm9sZXMKLSAgICAgICAgU2V0PFN0cmluZz4gcm9sZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHJvbGVzLmFkZEFsbChnZXRSZXF1aXJlZFJvbGVzKCkpOwotICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIgaGNDYWxsZXIgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0SGFuZGxlckNoYWluQ2FsbGVyKG1pKTsKLSAgICAgICAgaWYgKGhjQ2FsbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJvbGVzLmFkZEFsbChoY0NhbGxlci5nZXRSb2xlcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FU1QpKSB7Ci0gICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJyb2xlczoiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHIgOiByb2xlcykgewotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoIlx0XCIiICsgciArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8ga2VlcCBzZXQ9bnVsbCBpZiB0aGVyZSBhcmUgbm8gdW5kZXJzdG9vZCBoZWFkZXJzCi0gICAgICAgIFNldDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBudWxsOwotICAgICAgICBpZiAocnRDdHh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNPQVBSdW50aW1lTW9kZWwgbW9kZWwgPSAoU09BUFJ1bnRpbWVNb2RlbCkgcnRDdHh0LmdldE1vZGVsKCk7Ci0gICAgICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRLbm93bkhlYWRlcnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgSGFzaFNldDxRTmFtZT4oCi0gICAgICAgICAgICAgICAgICAgICgoU09BUFJ1bnRpbWVNb2RlbCkgcnRDdHh0LmdldE1vZGVsKCkpLmdldEtub3duSGVhZGVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodW5kZXJzdG9vZEhlYWRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGhjQ2FsbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1bmRlcnN0b29kSGVhZGVycyA9IGhjQ2FsbGVyLmdldFVuZGVyc3Rvb2RIZWFkZXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaGNDYWxsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVuZGVyc3Rvb2RIZWFkZXJzLmFkZEFsbChoY0NhbGxlci5nZXRVbmRlcnN0b29kSGVhZGVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FU1QpKSB7Ci0gICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJ1bmRlcnN0b29kIGhlYWRlcnM6Iik7Ci0gICAgICAgICAgICBpZiAodW5kZXJzdG9vZEhlYWRlcnMgPT0gbnVsbCB8fCB1bmRlcnN0b29kSGVhZGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJcdG5vbmUiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChRTmFtZSBuYW1lWCA6IHVuZGVyc3Rvb2RIZWFkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoIlx0IiArIG5hbWVYLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNoZWNrSGVhZGVyc0FnYWluc3RLbm93bihyZWFkZXIsIHJvbGVzLCB1bmRlcnN0b29kSGVhZGVycywgbWkpOwotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBFTkRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0SGVhZGVyVGFnKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBmb3Igb3RoZXIgYmluZGluZ3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0hlYWRlcnNBZ2FpbnN0S25vd24oWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gcm9sZXMsIFNldDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMsIE1lc3NhZ2VJbmZvIG1pKSB7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIE1VIGhlYWRlciBmb3IgZWFjaCByb2xlCi0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtdSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0TVVBdHRyUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TVVBdHRyUU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG11ICE9IG51bGwgJiYgKG11LmVxdWFscygiMSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIG11LmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvbGUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRSb2xlQXR0clFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRSb2xlQXR0clFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSAhPSBudWxsICYmIHJvbGVzLmNvbnRhaW5zKHJvbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJFbGVtZW50PSIgKyBxTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0YXJnZXRlZCBhdD0iICsgcm9sZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJzdG9vZEhlYWRlcnMgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICF1bmRlcnN0b29kSGVhZGVycy5jb250YWlucyhxTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJFbGVtZW50IG5vdCB1bmRlcnN0b29kPSIgKyBxTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBTT0FQVXRpbC5jcmVhdGVTT0FQRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VU1RfVU5ERVJTVEFORF9GQVVMVF9NRVNTQUdFX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5GQVVMVF9DT0RFX01VU1RfVU5ERVJTVEFORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZSwgbnVsbCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEZhdWx0RXhjZXB0aW9uKHNmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7ICAgLy8gTW92ZXMgdG8gRU5EIHN0YXRlCi0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Rpc3BhdGNoKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0KLSAgICAgICAgRGlzcGF0Y2hDb250ZXh0IGNvbnRleHQgPSAoRGlzcGF0Y2hDb250ZXh0KQotICAgICAgICAgICAgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5ESVNQQVRDSF9DT05URVhUKTsKLSAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTT0FQTWVzc2FnZUNoYXJzZXRFbmNvZGluZyhTT0FQTWVzc2FnZSBzbSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY2hhcnNldCA9IChTdHJpbmcpIHNtLmdldFByb3BlcnR5KFNPQVBNZXNzYWdlLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICByZXR1cm4gKGNoYXJzZXQgIT0gbnVsbCkgPyBjaGFyc2V0IDogIlVURi04IjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByYWlzZUZhdWx0KFFOYW1lIGZhdWx0Q29kZSwgU3RyaW5nIGZhdWx0U3RyaW5nKSB7Ci0gICAgICAgIHRocm93IG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oU09BUFV0aWwuY3JlYXRlU09BUEZhdWx0KGZhdWx0U3RyaW5nLCBmYXVsdENvZGUsIG51bGwsIG51bGwsIGdldEJpbmRpbmdJZCgpKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmFpc2VCYWRYTUxGYXVsdChIYW5kbGVyQ29udGV4dCBjdHh0KSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFFOYW1lIGdldFNlbmRlckZhdWx0Q29kZSgpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFFOYW1lIGdldFJlY2VpdmVyRmF1bHRDb2RlKCk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUU5hbWUgZ2V0VmVyc2lvbk1pc21hdGNoRmF1bHRDb2RlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEJpbmRpbmdJZCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERVUExJQ0FURV9IRUFERVIgPQotICAgICAgICAiRHVwbGljYXRlIEhlYWRlciBpbiB0aGUgbWVzc2FnZToiOwotCi0gICAgcHVibGljIERpc3BhdGNoVXRpbCBnZXREaXNwYXRjaFV0aWwoKSB7Ci0gICAgICAgIHJldHVybiBkaXNwYXRjaFV0aWw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERpc3BhdGNoVXRpbCBkaXNwYXRjaFV0aWwgPSBuZXcgRGlzcGF0Y2hVdGlsKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU09BUEVQVEZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU09BUEVQVEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyYzQ5Zi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NPQVBFUFRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuaW50ZXJuYWwuSW50ZXJuYWxFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuKjsKLQotLyoqCi0gKiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyB0byBKYXh3c0VQVEZhY3Rvcnkgb3Igc29tZXRoaW5nIGVsc2UuIE9SCi0gKiBzcGxpdCBpbnRvIG11bHRpcGxlIGZhY3Rvcmllcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQRVBURmFjdG9yeSB7Ci0gICAgcHVibGljIEludGVybmFsRW5jb2RlciBnZXRJbnRlcm5hbEVuY29kZXIoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0aGUgU09BUEVuY29kZXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTT0FQRW5jb2RlciBnZXRTT0FQRW5jb2RlcigpOwotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0aGUgU09BUERlY29kZXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTT0FQRGVjb2RlciBnZXRTT0FQRGVjb2RlcigpOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQRW5jb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQRW5jb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIzM2JkLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU09BUEVuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4MCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5EaXNwYXRjaENvbnRleHQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWEJfT1VUUFVUU1RSRUFNOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5Db250ZXh0TWFwOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuSkFYV1NQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLkpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuSkFYV1NBdHRhY2htZW50VW5tYXJzaGFsbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQkJlYW5JbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQkJyaWRnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5ScGNMaXRQYXlsb2FkOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuUnBjTGl0UGF5bG9hZFNlcmlhbGl6ZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZS5TT0FQRmF1bHRJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVBOYW1lc3BhY2VDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLlNPQVBIYW5kbGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlNlcnZlclJ0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLkludGVybmFsU29hcEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuTXRvbUNhbGxiYWNrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5Tb3VyY2VSZWFkZXJGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1Xcml0ZXJGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuRE9NVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU09BUEVuY29kZXIgaW1wbGVtZW50cyBFbmNvZGVyLCBJbnRlcm5hbFNvYXBFbmNvZGVyIHsKLQotICAgIC8qCi0gICAgICogQHNlZSBFbmNvZGVyI2VuY29kZUFuZFNlbmQoTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQW5kU2VuZChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgRW5jb2RlciNlbmNvZGUoTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIEJ5dGVCdWZmZXIgZW5jb2RlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlcm5hbE1lc3NhZ2UgdG9JbnRlcm5hbE1lc3NhZ2UoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIERPTVNvdXJjZSB0b0RPTVNvdXJjZShKQVhCQnJpZGdlSW5mbyBicmlkZ2VJbmZvLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICBCcmlkZ2VDb250ZXh0IGJyaWRnZUNvbnRleHQgPSBydEN0eHQuZ2V0QnJpZGdlQ29udGV4dCgpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBET01VdGlsLmNyZWF0ZURvbSgpOwotICAgICAgICBicmlkZ2VJbmZvLnNlcmlhbGl6ZShicmlkZ2VDb250ZXh0LCBkb2MpOwotICAgICAgICByZXR1cm4gbmV3IERPTVNvdXJjZShkb2MpOwotICAgIH0KLQotICAgIHB1YmxpYyBET01Tb3VyY2UgdG9ET01Tb3VyY2UoUnBjTGl0UGF5bG9hZCBycGNMaXRQYXlsb2FkLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJhb3MgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MU3RyZWFtV3JpdGVyRmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoYmFvcyk7Ci0gICAgICAgICAgICB3cml0ZVJwY0xpdFBheWxvYWQocnBjTGl0UGF5bG9hZCwgbWVzc2FnZUluZm8sIHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgU3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFvcy5uZXdJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIERPTVJlc3VsdCBkb21SZXN1bHQgPSBuZXcgRE9NUmVzdWx0KCk7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCBkb21SZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBET01Tb3VyY2UoZG9tUmVzdWx0LmdldE5vZGUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbih0ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBET01Tb3VyY2UgdG9ET01Tb3VyY2UoU09BUEZhdWx0SW5mbyBmYXVsdEluZm8sIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYmFvcyA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxTdHJlYW1Xcml0ZXJGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihiYW9zKTsKLSAgICAgICAgICAgIHdyaXRlRmF1bHQoZmF1bHRJbmZvLCBtZXNzYWdlSW5mbywgd3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgU3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFvcy5uZXdJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIERPTVJlc3VsdCBkb21SZXN1bHQgPSBuZXcgRE9NUmVzdWx0KCk7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCBkb21SZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBET01Tb3VyY2UoZG9tUmVzdWx0LmdldE5vZGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbih0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiB4ZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oeGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVScGNMaXRQYXlsb2FkKFJwY0xpdFBheWxvYWQgcnBjTGl0UGF5bG9hZCwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgQnJpZGdlQ29udGV4dCBicmlkZ2VDb250ZXh0ID0gcnRDdHh0LmdldEJyaWRnZUNvbnRleHQoKTsKLSAgICAgICAgUnBjTGl0UGF5bG9hZFNlcmlhbGl6ZXIuc2VyaWFsaXplKHJwY0xpdFBheWxvYWQsIGJyaWRnZUNvbnRleHQsIG1lc3NhZ2VJbmZvLCB3cml0ZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlUnBjTGl0UGF5bG9hZChScGNMaXRQYXlsb2FkIHJwY0xpdFBheWxvYWQsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gd3JpdGVyKSB7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIEJyaWRnZUNvbnRleHQgYnJpZGdlQ29udGV4dCA9IHJ0Q3R4dC5nZXRCcmlkZ2VDb250ZXh0KCk7Ci0gICAgICAgIFJwY0xpdFBheWxvYWRTZXJpYWxpemVyLnNlcmlhbGl6ZShycGNMaXRQYXlsb2FkLCBicmlkZ2VDb250ZXh0LCB3cml0ZXIpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgICAgIEpBWEJDb250ZXh0IGpjID0gbnVsbDsKLSAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0IGNvbnRleHQgPSAoUmVxdWVzdENvbnRleHQpIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGpjID0gKEpBWEJDb250ZXh0KSBjb250ZXh0LmdldChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWEJfQ09OVEVYVF9QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBqYzsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlSkFYQkJlYW5JbmZvKEpBWEJCZWFuSW5mbyBiZWFuSW5mbywgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgLy8gUGFzcyBvdXRwdXQgc3RyZWFtIGRpcmVjdGx5IHRvIEpBWEIgd2hlbiBhdmFpbGFibGUKLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gKE91dHB1dFN0cmVhbSkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoSkFYQl9PVVRQVVRTVFJFQU0pOwotCi0gICAgICAgIE1hcnNoYWxsZXIgbSA9IChNYXJzaGFsbGVyKSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkRJU1BBVENIX01BUlNIQUxMRVIpOwotICAgICAgICBVbm1hcnNoYWxsZXIgdSA9IChVbm1hcnNoYWxsZXIpIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfVU5NQVJTSEFMTEVSKTsKLSAgICAgICAgYmVhbkluZm8uc2V0TWFyc2hhbGxlcnMobSwgdSk7Ci0KLSAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBNYWtlIHN1cmUgdGhhdCBjdXJyZW50IGVsZW1lbnQgaXMgY2xvc2VkIGJlZm9yZSBwYXNzaW5nIHRoZQotICAgICAgICAgICAgICAgICAqIG91dHB1dCBzdHJlYW0gdG8gSkFYQi4gVXNpbmcgWmVwaHlyLCBpdCBzdWZmaWNlcyB0byB3cml0ZQotICAgICAgICAgICAgICAgICAqIGFuIGVtcHR5IHN0cmluZyAoVE9ETzogb3RoZXIgU3RBWCBpbXBscz8pLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoIiIpOwotCi0gICAgICAgICAgICAgICAgLy8gRmx1c2ggb3V0cHV0IG9mIFN0QVggc2VyaWFsaXplcgotICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJlYW5JbmZvLndyaXRlVG8ob3MpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGJlYW5JbmZvLndyaXRlVG8od3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZUpBWEJCZWFuSW5mbyhKQVhCQmVhbkluZm8gYmVhbkluZm8sIE91dHB1dFN0cmVhbSB3cml0ZXIpIHsKLSAgICAgICAgYmVhbkluZm8ud3JpdGVUbyh3cml0ZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVKQVhCVHlwZUluZm8oSkFYQlR5cGVJbmZvIHR5cGVJbmZvLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSB0eXBlSW5mby5nZXROYW1lKCk7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHR5cGVJbmZvLmdldFR5cGUoKTsKLSAgICAgICAgd3JpdGVKQVhCVHlwZUluZm8obmFtZSwgdmFsdWUsIHdyaXRlcik7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUpBWEJUeXBlSW5mbyhRTmFtZSBuYW1lLCBPYmplY3QgdmFsdWUsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSBlbmNvZGVyRGVjb2RlclV0aWwuZ2V0SkFYQkNvbnRleHQoKTsKLSAgICAgICAgTWFwPFFOYW1lLCBDbGFzcz4gdHlwZU1hcHBpbmcgPSBlbmNvZGVyRGVjb2RlclV0aWwuZ2V0VHlwZU1hcHBpbmcoKTsKLSAgICAgICAgQ2xhc3MgdHlwZSA9IHR5cGVNYXBwaW5nLmdldChuYW1lKTsKLSAgICAgICAgSkFYQlR5cGVTZXJpYWxpemVyLmdldEluc3RhbmNlKCkuc2VyaWFsaXplKG5hbWUsIHR5cGUsIHZhbHVlLAotICAgICAgICAgICAgICAgIHdyaXRlciwgamF4YkNvbnRleHQpOwotICAgIH0KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSkFYQkJyaWRnZUluZm8oSkFYQkJyaWRnZUluZm8gYnJpZGdlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIEJyaWRnZUNvbnRleHQgYnJpZGdlQ29udGV4dCA9IHJ0Q3R4dC5nZXRCcmlkZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gUGFzcyBvdXRwdXQgc3RyZWFtIGRpcmVjdGx5IHRvIEpBWEIgd2hlbiBhdmFpbGFibGUKLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gKE91dHB1dFN0cmVhbSkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoSkFYQl9PVVRQVVRTVFJFQU0pOwotICAgICAgICBpZiAob3MgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIE1ha2Ugc3VyZSB0aGF0IGN1cnJlbnQgZWxlbWVudCBpcyBjbG9zZWQgYmVmb3JlIHBhc3NpbmcgdGhlCi0gICAgICAgICAgICAgICAgICogb3V0cHV0IHN0cmVhbSB0byBKQVhCLiBVc2luZyBaZXBoeXIsIGl0IHN1ZmZpY2VzIHRvIHdyaXRlCi0gICAgICAgICAgICAgICAgICogYW4gZW1wdHkgc3RyaW5nIChUT0RPOiBvdGhlciBTdEFYIGltcGxzPykuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycygiIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBGbHVzaCBvdXRwdXQgb2YgU3RBWCBzZXJpYWxpemVyCi0gICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJpZGdlSW5mby5zZXJpYWxpemUoYnJpZGdlQ29udGV4dCwgb3MsIHdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJpZGdlSW5mby5zZXJpYWxpemUoYnJpZGdlQ29udGV4dCwgd3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSkFYQkJyaWRnZUluZm8oSkFYQkJyaWRnZUluZm8gYnJpZGdlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBPdXRwdXRTdHJlYW0gd3JpdGVyKSB7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIEJyaWRnZUNvbnRleHQgYnJpZGdlQ29udGV4dCA9IHJ0Q3R4dC5nZXRCcmlkZ2VDb250ZXh0KCk7Ci0gICAgICAgIGJyaWRnZUluZm8uc2VyaWFsaXplKGJyaWRnZUNvbnRleHQsIHdyaXRlciwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgdG9TT0FQTWVzc2FnZShJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlcGxhY2UgdGhlIGJvZHkgaW4gU09BUE1lc3NhZ2Ugd2l0aCB0aGUgQm9keUJsb2NrIG9mIEludGVybmFsTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSB0b1NPQVBNZXNzYWdlKEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJvZHlCbG9jayBib2R5QmxvY2sgPSBpbnRlcm5hbE1lc3NhZ2UuZ2V0Qm9keSgpOwotICAgICAgICAgICAgaWYgKGJvZHlCbG9jayA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBzb2FwTWVzc2FnZTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGJvZHlCbG9jay5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc29hcE1lc3NhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gKFNvdXJjZSkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IHNvYXBNZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICAgICAgYm9keS5yZW1vdmVDb250ZW50cygpOwotCi0gICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBYbWxVdGlsLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgbmV3IERPTVJlc3VsdChib2R5KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5rbm93biBvYmplY3QgaW4gQm9keUJsb2NrOiIgKyB2YWx1ZS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzb2FwTWVzc2FnZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigic29hcGVuY29kZXIuZXJyIiwgbmV3IE9iamVjdFtde2V9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemVSZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHN0YXRlOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHN0YXRlID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogVE9ETzogSXMgdGhpcyBuZWNlc3NhcnksIHNob3VsZG4ndCB6ZXBoeXIgcmV0dXJuICIiIGluc3RlYWQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bGwgZm9yIGdldE5hbWVzcGFjZVVSSSgpIGFuZCBnZXRQcmVmaXgoKT8KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSByZWFkZXIuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCZWZvcmUgd2Ugd3JpdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd3JpdGVyVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlclVSSSA9IHdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3cml0ZXJQcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpLCB3cml0ZXJQcmVmaXgsIHdyaXRlclVSSSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgdXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCB1cmkgIT0gbnVsbCA/IHVyaSA6ICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnNQcmVmaXggPSByZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc1ByZWZpeCA9PSBudWxsKSBuc1ByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0QVggcmV0dXJucyBudWxsIGZvciBkZWZhdWx0IG5zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdyaXRlclVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyVVJJID0gd3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWmVwaHlyOiBXaHkgaXMgdGhpcyByZXR1cm5pbmcgbnVsbD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wYXJlIG5zUHJlZml4IHdpdGggcHJlZml4IGJlY2F1c2Ugb2YgWzFdIChhYm92ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhZGVyVVJJID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdyaXRlIHRoZSBuYW1lc3BhY2UgaW4gMyBjb25kaXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIC0gd2hlbiB0aGUgbmFtZXNwYWNlIFVSSSBpcyBub3QgYm91bmQgdG8gdGhlIHByZWZpeCBpbiB3cml0ZXIod3JpdGVyVVJJID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIC0gd2hlbiB0aGUgcmVhZGVyUHJlZml4IGFuZCB3cml0ZXJQcmVmaXggYXJlICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIC0gd2hlbiByZWFkZXJQcmVmaXggYW5kIHdyaXRlclByZWZpeCBhcmUgbm90IGVxdWFsIGFuZCB0aGUgVVJJIGJvdW5kIHRvIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICBhcmUgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclVSSSA9PSBudWxsIHx8ICgobnNQcmVmaXgubGVuZ3RoKCkgPT0gMCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuc1ByZWZpeC5lcXVhbHMocHJlZml4KSAmJiAhd3JpdGVyVVJJLmVxdWFscyhyZWFkZXJVUkkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgobnNQcmVmaXgsIHJlYWRlclVSSSAhPSBudWxsID8gcmVhZGVyVVJJIDogIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UobnNQcmVmaXgsIHJlYWRlclVSSSAhPSBudWxsID8gcmVhZGVyVVJJIDogIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clByZWZpeCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJVUkkgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dHJQcmVmaXggIT0gbnVsbCA/IGF0dHJQcmVmaXggOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0clVSSSAhPSBudWxsID8gYXR0clVSSSA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhdHRyaWJ1dGUgcHJlZml4IGlzIHVuZGVjbGFyZWQgaW4gY3VycmVudCB3cml0ZXIgc2NvcGUgdGhlbiBkZWNsYXJlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VW5kZWNsYXJlZFByZWZpeChhdHRyUHJlZml4LCBhdHRyVVJJLCB3cml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlM6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHJlYWRlci5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHN0YXRlICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXRzIHVuZGVjbGFyZWQgcHJlZml4ZXMgb24gdGhlIHdyaXRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0VW5kZWNsYXJlZFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgcmVhZGVyVVJJLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHdyaXRlclVSSSA9IG51bGw7Ci0gICAgICAgIGlmICh3cml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpICE9IG51bGwpCi0gICAgICAgICAgICB3cml0ZXJVUkkgPSB3cml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotCi0gICAgICAgIGlmICh3cml0ZXJVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIHJlYWRlclVSSSAhPSBudWxsID8gcmVhZGVyVVJJIDogIiIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgcmVhZGVyVVJJICE9IG51bGwgPyByZWFkZXJVUkkgOiAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGRlY2xhcmUKLSAgICAgKgotICAgICAqIEBwYXJhbSByUHJlZml4Ci0gICAgICogQHBhcmFtIHJVcmkKLSAgICAgKiBAcGFyYW0gd1ByZWZpeAotICAgICAqIEBwYXJhbSB3VXJpCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVjbGFyZVByZWZpeChTdHJpbmcgclByZWZpeCwgU3RyaW5nIHJVcmksIFN0cmluZyB3UHJlZml4LCBTdHJpbmcgd1VyaSkgewotICAgICAgICBpZiAod1VyaSA9PSBudWxsIHx8ICgod1ByZWZpeCAhPSBudWxsKSAmJiAhclByZWZpeC5lcXVhbHMod1ByZWZpeCkpIHx8Ci0gICAgICAgICAgICAoclVyaSAhPSBudWxsICYmICF3VXJpLmVxdWFscyhyVXJpKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZVNvdXJjZShTb3VyY2Ugc291cmNlLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU291cmNlUmVhZGVyRmFjdG9yeS5jcmVhdGVTb3VyY2VSZWFkZXIoc291cmNlLCB0cnVlKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZVJlYWRlcihyZWFkZXIsIHdyaXRlcik7Ci0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplU291cmNlKFNvdXJjZSBzb3VyY2UsIE91dHB1dFN0cmVhbSB3cml0ZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHQgPSBYbWxVdGlsLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICB0LnRyYW5zZm9ybShzb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogd3JpdGVzIHN0YXJ0IHRhZyBvZiBlbnZlbG9wZTogPGVudjpFbnZlbG9wZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydEVudmVsb3BlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vd3JpdGUgU09BUCBFbnZlbG9wZQotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgICAgICBTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLlRBR19FTlZFTE9QRSwgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgICAgICBTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLkVOVkVMT1BFKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLk5TUFJFRklYX1NPQVBfRU5WRUxPUEUsCi0gICAgICAgICAgICAgICAgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogd3JpdGUgdGhlIGtub3duIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0byB0aGUgZW52ZWxvcGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUVudmVsb3BlTmFtZXNwYWNlcyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgaWYgKHJ0Q3R4dCAhPSBudWxsICYmIHJ0Q3R4dC5nZXRNb2RlbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgoInhzZCIsIFNPQVBOYW1lc3BhY2VDb25zdGFudHMuWFNEKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZSgieHNkIiwgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5YU0QpOwotICAgICAgICAgICAgaW50IGkgPSAxOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWVzcGFjZSA6IHJ0Q3R4dC5nZXRNb2RlbCgpLmdldEtub3duTmFtZXNwYWNlVVJJcygpKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArIGkrKzsKLSAgICAgICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycygiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogd3JpdGVzIHN0YXJ0IHRhZyBvZiBCb2R5OiA8ZW52OkJvZHk+Ci0gICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydEJvZHkoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy93cml0ZSBTT0FQIEJvZHkKLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLk5TUFJFRklYX1NPQVBfRU5WRUxPUEUsCi0gICAgICAgICAgICAgICAgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5UQUdfQk9EWSwgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogd3JpdGVzIHN0YXJ0IHRhZyBvZiBIZWFkZXI6IDxlbnY6SGVhZGVyPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0SGVhZGVyKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLk5TUFJFRklYX1NPQVBfRU5WRUxPUEUsCi0gICAgICAgICAgICAgICAgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5UQUdfSEVBREVSLCBTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLkVOVkVMT1BFKTsgLy8gPGVudjpIZWFkZXI+Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogd3JpdGVzIG11bHRpcGxlIGhlYWRlciBlbGVtZW50cyBpbiA8ZW52OkhlYWRlcj4gLi4uIDwvZW52OkhlYWRlcj4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUhlYWRlcnMoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgSW50ZXJuYWxNZXNzYWdlIHJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxIZWFkZXJCbG9jaz4gaGVhZGVyQmxvY2tzID0gcmVzcG9uc2UuZ2V0SGVhZGVycygpOwotICAgICAgICAgICAgaWYgKGhlYWRlckJsb2NrcyA9PSBudWxsIHx8IGhlYWRlckJsb2Nrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydEhlYWRlcih3cml0ZXIpOyAvLyA8ZW52OkhlYWRlcj4KLSAgICAgICAgICAgIGZvciAoSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgOiBoZWFkZXJCbG9ja3MpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBoZWFkZXJCbG9jay5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpBWEJCcmlkZ2VJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUpBWEJCcmlkZ2VJbmZvKChKQVhCQnJpZGdlSW5mbykgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8sIHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbigidW5rbm93bi5vYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IGluIHNvYXAgMS4yCi0gICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJCbG9jayBpbnN0YW5jZW9mIFNPQVAxMk5vdFVuZGVyc3Rvb2RIZWFkZXJCbG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgKChTT0FQMTJOb3RVbmRlcnN0b29kSGVhZGVyQmxvY2spIGhlYWRlckJsb2NrKS53cml0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC9lbnY6SGVhZGVyPgotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHdyaXRlcyA8ZW52OkJvZHk+IC4uLiA8L2VudjpCb2R5PgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQm9keShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBJbnRlcm5hbE1lc3NhZ2UgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGFydEJvZHkod3JpdGVyKTsKLSAgICAgICAgICAgIEJvZHlCbG9jayBib2R5QmxvY2sgPSByZXNwb25zZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICAvLyBCb2R5QmxvY2sgY2FuIGJlIG51bGwgaWYgdGhlcmUgaXMgbm8gcGFydCBpbiB3c2RsOm1lc3NhZ2UKLSAgICAgICAgICAgIGlmIChib2R5QmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGJvZHlCbG9jay5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpBWEJCcmlkZ2VJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlSkFYQkJyaWRnZUluZm8oKEpBWEJCcmlkZ2VJbmZvKSB2YWx1ZSwgbWVzc2FnZUluZm8sIHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJwY0xpdFBheWxvYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVScGNMaXRQYXlsb2FkKChScGNMaXRQYXlsb2FkKSB2YWx1ZSwgbWVzc2FnZUluZm8sIHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVTb3VyY2UoKFNvdXJjZSkgdmFsdWUsIHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEluZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVGYXVsdCgoU09BUEZhdWx0SW5mbykgdmFsdWUsIG1lc3NhZ2VJbmZvLCB3cml0ZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBKQVhCQmVhbkluZm8pIHsKLQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChKQVhCQmVhbkluZm8pdmFsdWUpLmdldEJlYW4oKSAhPSBudWxsICYmIChEaXNwYXRjaENvbnRleHQpCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfQ09OVEVYVCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVKQVhCQmVhbkluZm8oKEpBWEJCZWFuSW5mbykgdmFsdWUsIG1lc3NhZ2VJbmZvLCB3cml0ZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCAmJiAoRGlzcGF0Y2hDb250ZXh0KQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkRJU1BBVENIX0NPTlRFWFQpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9idWcgNjQwMDU5NiAgLURpc3BhdGNoIGFuZCBudWxsIGludm9jYXRpb24gcGFyYW1ldGVyIHBheWxvYWQgbW9kZQotICAgICAgICAgICAgICAgICAgICAvL2NhbiBza2lwIHRoaXMgaGVyZSBhcyB3ZSB3YW50IHRvIHdyaXRlIGFuZCBlbXB0eSBTT0FQQm9keQotICAgICAgICAgICAgICAgICAgICAvL3dyaXRlSkFYQkJlYW5JbmZvKChKQVhCQmVhbkluZm8pIHZhbHVlLCBtZXNzYWdlSW5mbywgd3JpdGVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbigidW5rbm93bi5vYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsgICAgICAgICAgICAgICAgLy8gPC9lbnY6Ym9keT4KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFzcyByZWZlcmVuY2Ugb2YgYXR0YWNobWVudHMgTWFwIGZyb20gSW50ZXJuYWxNZXNzYWdlIHRvIEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWkKLSAgICAgKiBAcGFyYW0gaW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRhY2htZW50c01hcChNZXNzYWdlSW5mbyBtaSwgSW50ZXJuYWxNZXNzYWdlIGltKSB7Ci0gICAgICAgIE9iamVjdCBydGMgPSBtaS5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX1JVTlRJTUVfQ09OVEVYVCk7Ci0gICAgICAgIGlmIChydGMgIT0gbnVsbCkgewotICAgICAgICAgICAgQnJpZGdlQ29udGV4dCBiYyA9ICgoUnVudGltZUNvbnRleHQpIHJ0YykuZ2V0QnJpZGdlQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKGJjID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlciBhbSA9IChKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyKSBiYy5nZXRBdHRhY2htZW50TWFyc2hhbGxlcigpOwotICAgICAgICAgICAgYW0uc2V0QXR0YWNobWVudHMoaW0uZ2V0QXR0YWNobWVudHMoKSk7Ci0gICAgICAgICAgICBhbS5zZXRIYW5kbGVyQ29udGF4dCgoKFJ1bnRpbWVDb250ZXh0KSBydGMpLmdldEhhbmRsZXJDb250ZXh0KCkpOwotCi0gICAgICAgICAgICBIYW5kbGVyQ29udGV4dCBoYyA9ICgoUnVudGltZUNvbnRleHQpIHJ0YykuZ2V0SGFuZGxlckNvbnRleHQoKTsKLSAgICAgICAgICAgIE9iamVjdCBtdG9tVGhyZXNob2xkOwotICAgICAgICAgICAgaWYgKGhjID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL3RvIGJlIHJlbW92ZWQgd2hlbiBjbGllbnQgZ3VhcmFudGVlcyBoYW5kbGVyQ29udGV4dAotICAgICAgICAgICAgICAgIG10b21UaHJlc2hvbGQgPSBtaS5nZXRNZXRhRGF0YShKQVhXU1Byb3BlcnRpZXMuTVRPTV9USFJFU0hPTE9EX1ZBTFVFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbXRvbVRocmVzaG9sZCA9IGhjLmdldE1lc3NhZ2VDb250ZXh0KCkuZ2V0KEpBWFdTUHJvcGVydGllcy5NVE9NX1RIUkVTSE9MT0RfVkFMVUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG10b21UaHJlc2hvbGQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBhbS5zZXRNdG9tVGhyZXNob2xkVmFsdWUoKEludGVnZXIpIG10b21UaHJlc2hvbGQpOwotICAgICAgICB9IGVsc2UgaWYgKG1pLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfQ09OVEVYVCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICBDb250ZXh0TWFwIG1hcCA9IChDb250ZXh0TWFwKSBtaS5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikKLSAgICAgICAgICAgICAgICBtYXAuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ0xJRU5UX0hBTkRMRV9QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIEpBWEJDb250ZXh0IGpjID0gKEpBWEJDb250ZXh0KSBtYXAuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYQl9DT05URVhUX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgaWYgKGpjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBNYXJzaGFsbGVyIG0gPSBqYy5jcmVhdGVNYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIFVubWFyc2hhbGxlciB1bSA9IGpjLmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICAgICAgICAgICAgICBKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyIGFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyKCgoU09BUEJpbmRpbmcpIHByb3ZpZGVyLmdldEJpbmRpbmcoKSkuaXNNVE9NRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NBdHRhY2htZW50VW5tYXJzaGFsbGVyIHVhbSA9IG5ldyBKQVhXU0F0dGFjaG1lbnRVbm1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYW0uc2V0QXR0YWNobWVudHMoaW0uZ2V0QXR0YWNobWVudHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG0uc2V0QXR0YWNobWVudE1hcnNoYWxsZXIoYW0pOwotICAgICAgICAgICAgICAgICAgICB1bS5zZXRBdHRhY2htZW50VW5tYXJzaGFsbGVyKHVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIG1pLnNldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfTUFSU0hBTExFUiwgbSk7Ci0gICAgICAgICAgICAgICAgICAgIG1pLnNldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfVU5NQVJTSEFMTEVSLCB1bSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vc2V0IGhhbmRsZXJDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIGFtLnNldEhhbmRsZXJDb250YXh0KChTT0FQSGFuZGxlckNvbnRleHQpCi0gICAgICAgICAgICAgICAgICAgIG1pLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfSEFORExFUl9DT05URVhUX1BST1BFUlRZKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNvbnRleHQgaGMgPQotICAgICAgICAgICAgICAgICAgICAgICAgKEhhbmRsZXJDb250ZXh0KW1pLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfSEFORExFUl9DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICAgICAgLy9zZXQgWE9QIG9wdGltaXphdGlvbiB0byB0cnVlIGZvciBqYXhiCi0gICAgICAgICAgICAgICAgICAgIGFtLnNldFhPUFBhY2thZ2UoKChTT0FQQmluZGluZylwcm92aWRlci5nZXRCaW5kaW5nKCkpLmlzTVRPTUVuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVhbS5zZXRYT1BQYWNrYWdlKCgoU09BUEJpbmRpbmcpcHJvdmlkZXIuZ2V0QmluZGluZygpKS5pc01UT01FbmFibGVkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBtdG9tVGhyZXNob2xkOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy90byBiZSByZW1vdmVkIHdoZW4gY2xpZW50IGd1YXJhbnRlZXMgaGFuZGxlckNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIG10b21UaHJlc2hvbGQgPSBtaS5nZXRNZXRhRGF0YShKQVhXU1Byb3BlcnRpZXMuTVRPTV9USFJFU0hPTE9EX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG10b21UaHJlc2hvbGQgPSBoYy5nZXRNZXNzYWdlQ29udGV4dCgpLmdldChKQVhXU1Byb3BlcnRpZXMuTVRPTV9USFJFU0hPTE9EX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobXRvbVRocmVzaG9sZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgYW0uc2V0TXRvbVRocmVzaG9sZFZhbHVlKChJbnRlZ2VyKSBtdG9tVGhyZXNob2xkKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFsbCB0aGUgYXR0YWNobWVudHMgaW4gdGhlIEludGVybmFsTWVzc2FnZSB0byB0aGUgU09BUE1lc3NhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbQotICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQXR0YWNobWVudHMoSW50ZXJuYWxNZXNzYWdlIGltLCBTT0FQTWVzc2FnZSBtc2cpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBdHRhY2htZW50QmxvY2s+IGUgOiBpbS5nZXRBdHRhY2htZW50cygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRCbG9jayBibG9jayA9IGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGJsb2NrLmFkZFRvKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogd3JpdGVzIGVuZCB0YWcgb2YgZW52ZWxvcGU6IDwvZW52OkVudmVsb3BlPgotICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZW5kRW52ZWxvcGUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZhdWx0KFNPQVBGYXVsdEluZm8gaW5zdGFuY2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRmF1bHQoU09BUEZhdWx0SW5mbyBpbnN0YW5jZSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTFN0cmVhbVdyaXRlckZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCk7Ci0gICAgICAgIHdyaXRlRmF1bHQoaW5zdGFuY2UsIG1lc3NhZ2VJbmZvLCB3cml0ZXIpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb2JqLCBPdXRwdXRTdHJlYW0gd3JpdGVyLCBNdG9tQ2FsbGJhY2sgbXRvbUNhbGxiYWNrKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VJbmZvKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKCJpbmNvcnJlY3QubWVzc2FnZWluZm8iLCBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBNZXNzYWdlSW5mbyBtaSA9IChNZXNzYWdlSW5mbykgb2JqOwotICAgICAgICBPYmplY3QgcnRjID0gbWkuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19SVU5USU1FX0NPTlRFWFQpOwotICAgICAgICBpZiAocnRjICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJyaWRnZUNvbnRleHQgYmMgPSAoKFJ1bnRpbWVDb250ZXh0KSBydGMpLmdldEJyaWRnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIGlmIChiYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlciBhbSA9IChKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgKChSdW50aW1lQ29udGV4dCkgcnRjKS5nZXRCcmlkZ2VDb250ZXh0KCkuZ2V0QXR0YWNobWVudE1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgICAgICBhbS5zZXRNdG9tQ2FsbGJhY2sobXRvbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vZGlzcGF0Y2gKLSAgICAgICAgICAgIE1hcnNoYWxsZXIgbSA9IChNYXJzaGFsbGVyKW1pLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfTUFSU0hBTExFUik7Ci0gICAgICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlciBhbSA9IChKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyKW0uZ2V0QXR0YWNobWVudE1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgICAgICBhbS5zZXRNdG9tQ2FsbGJhY2sobXRvbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBKQVhCQnJpZGdlSW5mbykgewotICAgICAgICAgICAgd3JpdGVKQVhCQnJpZGdlSW5mbygoSkFYQkJyaWRnZUluZm8pIHZhbHVlLCBtaSwgd3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJwY0xpdFBheWxvYWQpIHsKLSAgICAgICAgICAgIHdyaXRlUnBjTGl0UGF5bG9hZCgoUnBjTGl0UGF5bG9hZCkgdmFsdWUsIG1pLCB3cml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU291cmNlKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVTb3VyY2UoKFNvdXJjZSkgdmFsdWUsIHdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTT0FQRmF1bHRJbmZvKSB7Ci0gICAgICAgICAgICB3cml0ZUZhdWx0KChTT0FQRmF1bHRJbmZvKSB2YWx1ZSwgbWksIHdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBKQVhCQmVhbkluZm8pIHsKLSAgICAgICAgICAgIHdyaXRlSkFYQkJlYW5JbmZvKChKQVhCQmVhbkluZm8pIHZhbHVlLCB3cml0ZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FeGNlcHRpb24oInVua25vd24ub2JqZWN0IiwgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb2JqLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBNdG9tQ2FsbGJhY2sgbXRvbUNhbGxiYWNrKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VJbmZvKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKCJpbmNvcnJlY3QubWVzc2FnZWluZm8iLCBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBNZXNzYWdlSW5mbyBtaSA9IChNZXNzYWdlSW5mbykgb2JqOwotICAgICAgICBPYmplY3QgcnRjID0gbWkuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19SVU5USU1FX0NPTlRFWFQpOwotICAgICAgICBpZiAocnRjICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJyaWRnZUNvbnRleHQgYmMgPSAoKFJ1bnRpbWVDb250ZXh0KSBydGMpLmdldEJyaWRnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIGlmIChiYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlciBhbSA9IChKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyKSAoKFJ1bnRpbWVDb250ZXh0KSBydGMpLmdldEJyaWRnZUNvbnRleHQoKS5nZXRBdHRhY2htZW50TWFyc2hhbGxlcigpOwotICAgICAgICAgICAgICAgIGFtLnNldE10b21DYWxsYmFjayhtdG9tQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9kaXNwYXRjaAotICAgICAgICAgICAgTWFyc2hhbGxlciBtID0gKE1hcnNoYWxsZXIpbWkuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5ESVNQQVRDSF9NQVJTSEFMTEVSKTsKLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyIGFtID0gKEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIpbS5nZXRBdHRhY2htZW50TWFyc2hhbGxlcigpOwotICAgICAgICAgICAgICAgIGFtLnNldE10b21DYWxsYmFjayhtdG9tQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpBWEJCcmlkZ2VJbmZvKSB7Ci0gICAgICAgICAgICB3cml0ZUpBWEJCcmlkZ2VJbmZvKChKQVhCQnJpZGdlSW5mbykgdmFsdWUsIG1pLCB3cml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUnBjTGl0UGF5bG9hZCkgewotICAgICAgICAgICAgd3JpdGVScGNMaXRQYXlsb2FkKChScGNMaXRQYXlsb2FkKSB2YWx1ZSwgbWksIHdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTb3VyY2UpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZVNvdXJjZSgoU291cmNlKSB2YWx1ZSwgd3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEluZm8pIHsKLSAgICAgICAgICAgIHdyaXRlRmF1bHQoKFNPQVBGYXVsdEluZm8pIHZhbHVlLCBtaSwgd3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpBWEJCZWFuSW5mbykgewotICAgICAgICAgICAgd3JpdGVKQVhCQmVhbkluZm8oKEpBWEJCZWFuSW5mbykgdmFsdWUsIG1pLCB3cml0ZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FeGNlcHRpb24oInVua25vd24ub2JqZWN0IiwgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NPQVBWZXJzaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NPQVBWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNmIxNTIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TT0FQVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwOwotCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotCi1wdWJsaWMgY2xhc3MgU09BUFZlcnNpb24gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKLQotICAgIHByaXZhdGUgU09BUFZlcnNpb24oU3RyaW5nIHZlcikgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIHN0clZlcnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHZlcnNpb24uZXF1YWxzKHN0clZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU09BUFZlcnNpb24gU09BUF8xMSA9IG5ldyBTT0FQVmVyc2lvbihTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU09BUFZlcnNpb24gU09BUF8xMiA9IG5ldyBTT0FQVmVyc2lvbihTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9TZXJpYWxpemF0aW9uRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NlcmlhbGl6YXRpb25FeGNlcHRpb24uamF2YQppbmRleCBkYTU4ZWIxLi5mM2RmMjBhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NlcmlhbGl6YXRpb25FeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NlcmlhbGl6YXRpb25FeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIHN1cGVyKHRocm93YWJsZSk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICByZXR1cm4gImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5lbmNvZGluZyI7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NlcmlhbGl6ZXJDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU2VyaWFsaXplckNvbnN0YW50cy5qYXZhCmluZGV4IGU2YjdjZDcuLjI5YThhNDQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU2VyaWFsaXplckNvbnN0YW50cy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU2VyaWFsaXplckNvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU2VydmVyRW5jb2RlckRlY29kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvU2VydmVyRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5ZWJjMS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL1NlcnZlckVuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uLk1lc3NhZ2VTdHJ1Y3Q7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5pbnRlcm5hbC5JbnRlcm5hbEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5KQVhCQnJpZGdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkF0dGFjaG1lbnRCbG9jazsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkJvZHlCbG9jazsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkhlYWRlckJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkNoZWNrZWRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuRXhjZXB0aW9uVHlwZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5KYXZhTWV0aG9kOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlJ1bnRpbWVNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQUnVudGltZU1vZGVsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlN0cmluZ1V0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqCi0gKiBTZXJ2ZXIgU09BUCBlbmNvZGVyIGRlY29kZXIKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXIgaW1wbGVtZW50cyBJbnRlcm5hbEVuY29kZXIgewotICAgIHB1YmxpYyBTZXJ2ZXJFbmNvZGVyRGVjb2RlcigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKgotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcudXRpbC5FbmNvZGVyRGVjb2RlckJhc2UjdG9NZXNzYWdlSW5mbyhqYXZhLmxhbmcuT2JqZWN0LAotICAgICAqICAgICAgY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0b01lc3NhZ2VJbmZvKE9iamVjdCBpbnRNZXNzYWdlLCBNZXNzYWdlSW5mbyBtaSkgewotICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgaW0gPSAoSW50ZXJuYWxNZXNzYWdlKSBpbnRNZXNzYWdlOwotICAgICAgICBSdW50aW1lQ29udGV4dCBydENvbnRleHQgPSAoUnVudGltZUNvbnRleHQpIG1pLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfUlVOVElNRV9DT05URVhUKTsKLQotICAgICAgICBCb2R5QmxvY2sgYm9keUJsb2NrID0gaW0uZ2V0Qm9keSgpOwotICAgICAgICBKYXZhTWV0aG9kIGptID0gcnRDb250ZXh0LmdldE1vZGVsKCkuZ2V0SmF2YU1ldGhvZChtaS5nZXRNZXRob2QoKSk7Ci0gICAgICAgIG1pLnNldE1FUChqbS5nZXRNRVAoKSk7Ci0gICAgICAgIExpc3Q8SGVhZGVyQmxvY2s+IGhlYWRlcnMgPSBpbS5nZXRIZWFkZXJzKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEF0dGFjaG1lbnRCbG9jaz4gYXR0YWNobWVudHMgPSBpbS5nZXRBdHRhY2htZW50cygpOwotCi0gICAgICAgIEl0ZXJhdG9yPFBhcmFtZXRlcj4gaXRlciA9IGptLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgT2JqZWN0IGJvZHlWYWx1ZSA9IChib2R5QmxvY2sgPT0gbnVsbCkgPyBudWxsIDogIGJvZHlCbG9jay5nZXRWYWx1ZSgpOwotCi0gICAgICAgIGludCBudW1JbnB1dFBhcmFtcyA9IGptLmdldElucHV0UGFyYW1ldGVyc0NvdW50KCk7Ci0gICAgICAgIE9iamVjdCBkYXRhW10gPSBuZXcgT2JqZWN0W251bUlucHV0UGFyYW1zXTsKLSAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpam0uZ2V0QmluZGluZygpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYXJhbUJpbmRpbmcgPSBwYXJhbS5nZXRJbkJpbmRpbmcoKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgICAgICAgICAgaWYgKHBhcmFtQmluZGluZy5pc0JvZHkoKSkgewotICAgICAgICAgICAgICAgIG9iaiA9IGJvZHlWYWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVycyAhPSBudWxsICYmIHBhcmFtQmluZGluZy5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgSGVhZGVyQmxvY2sgaGVhZGVyID0gZ2V0SGVhZGVyQmxvY2socGFyYW0uZ2V0TmFtZSgpLCBoZWFkZXJzKTsKLSAgICAgICAgICAgICAgICBvYmogPSAoaGVhZGVyICE9IG51bGwpP2hlYWRlci5nZXRWYWx1ZSgpOm51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtQmluZGluZy5pc0F0dGFjaG1lbnQoKSkgewotICAgICAgICAgICAgICBvYmogPSBnZXRBdHRhY2htZW50KHJ0Q29udGV4dCwgYXR0YWNobWVudHMsIHBhcmFtLCBwYXJhbUJpbmRpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlsbERhdGEocnRDb250ZXh0LCBwYXJhbSwgb2JqLCBkYXRhLCBzb2FwQmluZGluZywgcGFyYW1CaW5kaW5nKTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvcjxQYXJhbWV0ZXI+IHJlc0l0ZXIgPSBqbS5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShyZXNJdGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcCA9IHJlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgY3JlYXRlT1VUSG9sZGVycyhwLCBkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBtaS5zZXREYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy51dGlsLkVuY29kZXJEZWNvZGVyQmFzZSN0b0ludGVybmFsTWVzc2FnZShjb20uc3VuLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgdG9JbnRlcm5hbE1lc3NhZ2UoTWVzc2FnZUluZm8gbWkpIHsKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDb250ZXh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1pKTsKLSAgICAgICAgUnVudGltZU1vZGVsIG1vZGVsID0gcnRDb250ZXh0LmdldE1vZGVsKCk7Ci0gICAgICAgIEphdmFNZXRob2Qgam0gPSBtb2RlbC5nZXRKYXZhTWV0aG9kKG1pLmdldE1ldGhvZCgpKTsKLSAgICAgICAgT2JqZWN0W10gZGF0YSA9IG1pLmdldERhdGEoKTsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1pLmdldFJlc3BvbnNlKCk7Ci0gICAgICAgIEludGVybmFsTWVzc2FnZSBpbSA9IG5ldyBJbnRlcm5hbE1lc3NhZ2UoKTsKLSAgICAgICAgaWYocnRDb250ZXh0LmdldEhhbmRsZXJDb250ZXh0KCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICBjb3B5QXR0YWNobWVudFByb3BlcnR5KHJ0Q29udGV4dC5nZXRIYW5kbGVyQ29udGV4dCgpLmdldE1lc3NhZ2VDb250ZXh0KCksIGltKTsKLSAgICAgICAgfQotICAgICAgICBCaW5kaW5nSW1wbCBiaW5kaW5nSW1wbCA9Ci0gICAgICAgICAgICAoQmluZGluZ0ltcGwpcnRDb250ZXh0LmdldFJ1bnRpbWVFbmRwb2ludEluZm8oKS5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSBiaW5kaW5nSW1wbC5nZXRCaW5kaW5nSWQoKTsKLQotICAgICAgICBzd2l0Y2ggKG1pLmdldFJlc3BvbnNlVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIE1lc3NhZ2VTdHJ1Y3QuQ0hFQ0tFRF9FWENFUFRJT05fUkVTUE9OU0U6Ci0gICAgICAgICAgICAgICAgaWYoIShyZXN1bHQgaW5zdGFuY2VvZiBqYXZhLmxhbmcuRXhjZXB0aW9uKSl7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKCJleGNlcHRpb24uaW5jb3JyZWN0VHlwZSIsIHJlc3VsdC5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDaGVja2VkRXhjZXB0aW9uIGNlID0gam0uZ2V0Q2hlY2tlZEV4Y2VwdGlvbihyZXN1bHQuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgaWYoY2UgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXhjZXB0aW9uKCJleGNlcHRpb24ubm90Zm91bmQiLCByZXN1bHQuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGRldGFpbCA9IGdldERldGFpbChqbS5nZXRDaGVja2VkRXhjZXB0aW9uKHJlc3VsdC5nZXRDbGFzcygpKSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBKQVhCQnJpZGdlSW5mbyBkaSA9IG5ldyBKQVhCQnJpZGdlSW5mbyhtb2RlbC5nZXRCcmlkZ2UoY2UuZ2V0RGV0YWlsVHlwZSgpKSwgZGV0YWlsKTsKLQotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUFJ1bnRpbWVNb2RlbC5jcmVhdGVGYXVsdEluQm9keShyZXN1bHQsIG51bGwsIGRpLCBpbSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nSWQuZXF1YWxzKGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykpewotICAgICAgICAgICAgICAgICAgICBTT0FQUnVudGltZU1vZGVsLmNyZWF0ZVNPQVAxMkZhdWx0SW5Cb2R5KHJlc3VsdCwgbnVsbCwgbnVsbCwgZGksIGltKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW07Ci0gICAgICAgICAgICBjYXNlIE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRToKLSAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0lkLmVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpKQotICAgICAgICAgICAgICAgICAgICBTT0FQUnVudGltZU1vZGVsLmNyZWF0ZUZhdWx0SW5Cb2R5KHJlc3VsdCwgZ2V0QWN0b3IoKSwgbnVsbCwgaW0pOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpbmRpbmdJZC5lcXVhbHMoamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKSkKLSAgICAgICAgICAgICAgICAgICAgU09BUFJ1bnRpbWVNb2RlbC5jcmVhdGVTT0FQMTJGYXVsdEluQm9keShyZXN1bHQsIG51bGwsIG51bGwsIG51bGwsIGltKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW07Ci0gICAgICAgIH0KLQotICAgICAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZylqbS5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIEl0ZXJhdG9yPFBhcmFtZXRlcj4gaXRlciA9IGptLmdldFJlc3BvbnNlUGFyYW1ldGVycygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBhcmFtQmluZGluZyA9IHBhcmFtLmdldE91dEJpbmRpbmcoKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBjcmVhdGVQYXlsb2FkKHJ0Q29udGV4dCwgcGFyYW0sIGRhdGEsIHJlc3VsdCwgc29hcEJpbmRpbmcsIHBhcmFtQmluZGluZyk7Ci0gICAgICAgICAgICBpZiAocGFyYW1CaW5kaW5nLmlzQm9keSgpKSB7Ci0gICAgICAgICAgICAgICAgaW0uc2V0Qm9keShuZXcgQm9keUJsb2NrKG9iaikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUJpbmRpbmcuaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgIGltLmFkZEhlYWRlcihuZXcgSGVhZGVyQmxvY2soKEpBWEJCcmlkZ2VJbmZvKW9iaikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUJpbmRpbmcuaXNBdHRhY2htZW50KCkpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRhY2htZW50UGFydChydENvbnRleHQsIGltLCBvYmosIHBhcmFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0RGV0YWlsKENoZWNrZWRFeGNlcHRpb24gY2UsIE9iamVjdCBleGNlcHRpb24pIHsKLSAgICAgICAgaWYoY2UuZ2V0RXhjZXB0aW9uVHlwZSgpLmVxdWFscyhFeGNlcHRpb25UeXBlLlVzZXJEZWZpbmVkKSl7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRGV0YWlsRnJvbVVzZXJEZWZpbmVkRXhjZXB0aW9uKGNlLCBleGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgbSA9IGV4Y2VwdGlvbi5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0RmF1bHRJbmZvIik7Ci0gICAgICAgICAgICByZXR1cm4gbS5pbnZva2UoZXhjZXB0aW9uKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZURldGFpbEZyb21Vc2VyRGVmaW5lZEV4Y2VwdGlvbihDaGVja2VkRXhjZXB0aW9uIGNlLCBPYmplY3QgZXhjZXB0aW9uKSB7Ci0gICAgICAgIENsYXNzIGRldGFpbEJlYW4gPSBjZS5nZXREZXRhaWxCZWFuKCk7Ci0gICAgICAgIEZpZWxkW10gZmllbGRzID0gZGV0YWlsQmVhbi5nZXREZWNsYXJlZEZpZWxkcygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IGRldGFpbCA9IGRldGFpbEJlYW4ubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGZvcihGaWVsZCBmIDogZmllbGRzKXsKLSAgICAgICAgICAgICAgICBNZXRob2QgZW0gPSBleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoZ2V0UmVhZE1ldGhvZChmKSk7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIHNtID0gZGV0YWlsQmVhbi5nZXRNZXRob2QoZ2V0V3JpdGVNZXRob2QoZiksIGVtLmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgc20uaW52b2tlKGRldGFpbCwgZW0uaW52b2tlKGV4Y2VwdGlvbikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRldGFpbDsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFJlYWRNZXRob2QoRmllbGQgZil7Ci0gICAgICAgIGlmKGYuZ2V0VHlwZSgpLmlzQXNzaWduYWJsZUZyb20oYm9vbGVhbi5jbGFzcykpCi0gICAgICAgICAgICByZXR1cm4gImlzIiArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUoZi5nZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gImdldCIgKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKGYuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRXcml0ZU1ldGhvZChGaWVsZCBmKXsKLSAgICAgICAgcmV0dXJuICJzZXQiICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShmLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdG9yKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBiZSB1c2VkIGJ5IHRoZSBpbmNvbWluZyBtZXNzYWdlIG9uIHRoZSBzZXJ2ZXIgc2lkZSB0byBzZXQgdGhlIE9VVAotICAgICAqIGhvbGRlcnMgd2l0aCBIb2xkZXIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVPVVRIb2xkZXJzKFBhcmFtZXRlciBwYXJhbSwgT2JqZWN0W10gZGF0YSkgewotICAgICAgICBpZihwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKXsKLSAgICAgICAgICAgIGZvcihQYXJhbWV0ZXIgcCA6ICgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkuZ2V0V3JhcHBlckNoaWxkcmVuKCkpewotICAgICAgICAgICAgICAgIGlmKCFwLmlzUmVzcG9uc2UoKSAmJiBwLmlzT1VUKCkpCi0gICAgICAgICAgICAgICAgICAgIGRhdGFbcC5nZXRJbmRleCgpXSA9IG5ldyBIb2xkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvL2l0cyBCQVJFCi0gICAgICAgIGlmICghcGFyYW0uaXNSZXNwb25zZSgpICYmIHBhcmFtLmlzT1VUKCkpCi0gICAgICAgICAgICBkYXRhW3BhcmFtLmdldEluZGV4KCldID0gbmV3IEhvbGRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvY2xpZW50L1NPQVAxMlhNTERlY29kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvY2xpZW50L1NPQVAxMlhNTERlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3ZTc4My4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2NsaWVudC9TT0FQMTJYTUxEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5jbGllbnQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQkJyaWRnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc2ltcGxldHlwZS5FbmNvZGVyVXRpbHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5EZXNlcmlhbGl6YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5IZWFkZXJCbG9jazsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkludGVybmFsTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2UuRmF1bHRDb2RlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZS5GYXVsdENvZGVFbnVtOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZS5GYXVsdFJlYXNvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2UuRmF1bHRSZWFzb25UZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZS5GYXVsdFN1YmNvZGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVAxMkZhdWx0SW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2UuU09BUEZhdWx0SW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQMTJOYW1lc3BhY2VDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUE5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwLlNPQVBSdW50aW1lTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoLmltcGwuZW5jb2RpbmcuRGlzcGF0Y2hTZXJpYWxpemVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBzdGF0aWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuKjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQMTJYTUxEZWNvZGVyIGV4dGVuZHMgU09BUFhNTERlY29kZXIgewotCi0gICAgLy9uZWVkcyBmdXJ0aGVyIGNsZWFudXAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KLSAgICAgICAgTG9nZ2VyLmdldExvZ2dlciAobmV3IFN0cmluZ0J1ZmZlciAoKS5hcHBlbmQgKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4pLmFwcGVuZCAoIi5jbGllbnQuZGlzcGF0Y2giKS50b1N0cmluZyAoKSk7Ci0KLSAgICBwdWJsaWMgU09BUDEyWE1MRGVjb2RlciAoKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERpc3BhdGNoU2VyaWFsaXplciBnZXRTZXJpYWxpemVySW5zdGFuY2UgKCl7Ci0gICAgICAgIHJldHVybiBEaXNwYXRjaFNlcmlhbGl6ZXIuU09BUF8xXzI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKgotICAgICAqIEBzZWUgU09BUFhNTERlY29kZXIjZGVjb2RlRmF1bHQoWE1MU3RyZWFtUmVhZGVyLCBJbnRlcm5hbE1lc3NhZ2UsIE1lc3NhZ2VJbmZvKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTT0FQRmF1bHRJbmZvIGRlY29kZUZhdWx0IChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlIChyZWFkZXIsIFNUQVJUX0VMRU1FTlQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyAocmVhZGVyLCBTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVCk7Ci0KLSAgICAgICAgLy8gZW52OkNvZGUKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUgKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnIChyZWFkZXIsIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9GQVVMVF9DT0RFKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0KLSAgICAgICAgLy9lbnY6VmFsdWUKLSAgICAgICAgUU5hbWUgZmF1bHRjb2RlID0gcmVhZEZhdWx0VmFsdWUgKHJlYWRlcik7Ci0gICAgICAgIEZhdWx0Q29kZUVudW0gY29kZVZhbHVlID0gRmF1bHRDb2RlRW51bS5nZXQgKGZhdWx0Y29kZSk7Ci0gICAgICAgIGlmKGNvZGVWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbiAoInVua25vd24gZmF1bHQgY29kZToiLCBmYXVsdGNvZGUudG9TdHJpbmcgKCkpOwotCi0KLSAgICAgICAgLy9TdWJjb2RlCi0gICAgICAgIEZhdWx0U3ViY29kZSBzdWJjb2RlID0gbnVsbDsKLSAgICAgICAgaWYocmVhZGVyLmdldEV2ZW50VHlwZSAoKSA9PSBTVEFSVF9FTEVNRU5UKQotICAgICAgICAgICAgc3ViY29kZSA9IHJlYWRGYXVsdFN1YmNvZGUgKHJlYWRlcik7Ci0gICAgICAgIEZhdWx0Q29kZSBjb2RlID0gbmV3IEZhdWx0Q29kZSAoY29kZVZhbHVlLCBzdWJjb2RlKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlIChyZWFkZXIsIEVORF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcgKHJlYWRlciwgU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX0NPREUpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudCAocmVhZGVyKTsKLQotICAgICAgICBGYXVsdFJlYXNvbiByZWFzb24gPSByZWFkRmF1bHRSZWFzb24gKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBub2RlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHJvbGUgPSBudWxsOwotICAgICAgICBPYmplY3QgZGV0YWlsID0gbnVsbDsKLQotICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUgKCk7Ci0gICAgICAgIGlmKG5hbWUuZXF1YWxzIChTT0FQMTJDb25zdGFudHMuUU5BTUVfRkFVTFRfTk9ERSkpewotICAgICAgICAgICAgbm9kZSA9IHJlYWRlci5nZXRUZXh0ICgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobmFtZS5lcXVhbHMgKFNPQVAxMkNvbnN0YW50cy5RTkFNRV9GQVVMVF9ST0xFKSl7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRDb250ZW50IChyZWFkZXIpOwotICAgICAgICAgICAgcm9sZSA9IHJlYWRlci5nZXRUZXh0ICgpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudCAocmVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG5hbWUuZXF1YWxzIChTT0FQMTJDb25zdGFudHMuUU5BTUVfRkFVTFRfREVUQUlMKSl7Ci0gICAgICAgICAgICAvL1RPRE86IHByb2Nlc3MgZW5jb2RpbmdTdHlsZSBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gaXRlbQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0gICAgICAgICAgICBkZXRhaWwgPSByZWFkRmF1bHREZXRhaWwgKHJlYWRlciwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlIChyZWFkZXIsIEVORF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcgKHJlYWRlciwgU09BUDEyQ29uc3RhbnRzLlFOQU1FX1NPQVBfRkFVTFQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudCAocmVhZGVyKTsKLQotICAgICAgICByZXR1cm4gbmV3IFNPQVAxMkZhdWx0SW5mbyAoY29kZSwgcmVhc29uLCBub2RlLCByb2xlLCBkZXRhaWwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBRTmFtZSByZWFkRmF1bHRWYWx1ZSAoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcil7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUgKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnIChyZWFkZXIsIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9GQVVMVF9WQUxVRSk7Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudCAocmVhZGVyKTsKLQotICAgICAgICBTdHJpbmcgdG9rZW5zID0gcmVhZGVyLmdldFRleHQgKCk7Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0IChyZWFkZXIpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlIChyZWFkZXIsIEVORF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcgKHJlYWRlciwgU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX1ZBTFVFKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0KLSAgICAgICAgU3RyaW5nIHVyaSA9ICIiOwotICAgICAgICB0b2tlbnMgPSBFbmNvZGVyVXRpbHMuY29sbGFwc2VXaGl0ZXNwYWNlICh0b2tlbnMpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gWG1sVXRpbC5nZXRQcmVmaXggKHRva2Vucyk7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgdXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSAocHJlZml4KTsKLSAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24gKCJ4c2QudW5rbm93blByZWZpeCIsIHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IFhtbFV0aWwuZ2V0TG9jYWxQYXJ0ICh0b2tlbnMpOwotICAgICAgICByZXR1cm4gbmV3IFFOYW1lICh1cmksIGxvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZhdWx0U3ViY29kZSByZWFkRmF1bHRTdWJjb2RlIChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKXsKLSAgICAgICAgRmF1bHRTdWJjb2RlIGNvZGUgPSBudWxsOwotICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUgKCk7Ci0gICAgICAgIGlmKG5hbWUuZXF1YWxzIChTT0FQMTJDb25zdGFudHMuUU5BTUVfRkFVTFRfU1VCQ09ERSkpewotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0gICAgICAgICAgICBRTmFtZSBmYXVsdGNvZGUgPSByZWFkRmF1bHRWYWx1ZSAocmVhZGVyKTsKLSAgICAgICAgICAgIEZhdWx0U3ViY29kZSBzdWJjb2RlID0gbnVsbDsKLSAgICAgICAgICAgIGlmKHJlYWRlci5nZXRFdmVudFR5cGUgKCkgPT0gU1RBUlRfRUxFTUVOVCkKLSAgICAgICAgICAgICAgICBzdWJjb2RlID0gcmVhZEZhdWx0U3ViY29kZSAocmVhZGVyKTsKLSAgICAgICAgICAgIGNvZGUgPSBuZXcgRmF1bHRTdWJjb2RlIChmYXVsdGNvZGUsIHN1YmNvZGUpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZSAocmVhZGVyLCBFTkRfRUxFTUVOVCk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyAocmVhZGVyLCBTT0FQMTJDb25zdGFudHMuUU5BTUVfRkFVTFRfU1VCQ09ERSk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudCAocmVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29kZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmF1bHRSZWFzb24gcmVhZEZhdWx0UmVhc29uIChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKXsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZSAocmVhZGVyLCBTVEFSVF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcgKHJlYWRlciwgU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX1JFQVNPTik7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50IChyZWFkZXIpOwotCi0gICAgICAgIC8vc29hcGVudjpUZXh0Ci0gICAgICAgIExpc3Q8RmF1bHRSZWFzb25UZXh0PiB0ZXh0cyA9IG5ldyBBcnJheUxpc3Q8RmF1bHRSZWFzb25UZXh0PigpOwotICAgICAgICByZWFkRmF1bHRSZWFzb25UZXh0cyAocmVhZGVyLCB0ZXh0cyk7Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZSAocmVhZGVyLCBFTkRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnIChyZWFkZXIsIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9GQVVMVF9SRUFTT04pOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudCAocmVhZGVyKTsKLQotICAgICAgICBGYXVsdFJlYXNvblRleHRbXSBmcnQgPSB0ZXh0cy50b0FycmF5IChuZXcgRmF1bHRSZWFzb25UZXh0WzBdKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGYXVsdFJlYXNvbiAoZnJ0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkRmF1bHRSZWFzb25UZXh0cyAoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgTGlzdDxGYXVsdFJlYXNvblRleHQ+IHRleHRzKSB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSAoKTsKLSAgICAgICAgaWYgKCFuYW1lLmVxdWFscyAoU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX1JFQVNPTl9URVhUKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBsYW5nID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlIChTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuWE1MX05TLCAibGFuZyIpOwotICAgICAgICAvL2xldHMgYmUgbW9yZSBmb3JnaXZpbmcsIGlmIGl0cyBudWxsIGxldHMgYXNzdW1lIGl0cyAnZW4nCi0gICAgICAgIGlmKGxhbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIGxhbmcgPSAiZW4iOwotCi0gICAgICAgIC8vVE9ETzogd2hhdCB0byBkbyB3aGVuIHRoZSBsYW5nIGlzIG90aGVyIHRoYW4gJ2VuJywgZm9yIGV4YW1wbGUgY2xpbmdvbj8KLQotICAgICAgICAvL2dldCB0aGUgdGV4dCB2YWx1ZQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRDb250ZW50IChyZWFkZXIpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7Ci0gICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlICgpID09IENIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgIHRleHQgPSByZWFkZXIuZ2V0VGV4dCAoKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dCAocmVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlIChyZWFkZXIsIEVORF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcgKHJlYWRlciwgU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX1JFQVNPTl9URVhUKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0gICAgICAgIExvY2FsZSBsb2MgPSBuZXcgTG9jYWxlKGxhbmcpOwotCi0gICAgICAgIHRleHRzLmFkZCAobmV3IEZhdWx0UmVhc29uVGV4dCAodGV4dCwgbG9jKSk7Ci0KLSAgICAgICAgLy9jYWxsIGFnYWluIHRvIHNlZSBpZiB0aGVyZSBhcmUgbW9yZSBzb2FwZW52OlRleHQgZWxlbWVudHMKLSAgICAgICAgcmVhZEZhdWx0UmVhc29uVGV4dHMgKHJlYWRlciwgdGV4dHMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJ0LmVuY29kaW5nLnNvYXAuU09BUERlY29kZXIjZGVjb2RlSGVhZGVyKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXIsIGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8sIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZUhlYWRlciAoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIEludGVybmFsTWVzc2FnZSByZXF1ZXN0KSB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUgKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIGlmICghU09BUE5hbWVzcGFjZUNvbnN0YW50cy5UQUdfSEVBREVSLmVxdWFscyAocmVhZGVyLmdldExvY2FsTmFtZSAoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyAocmVhZGVyLCBnZXRIZWFkZXJUYWcgKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudCAocmVhZGVyKTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlICgpID09IFNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBkZWNvZGVIZWFkZXJFbGVtZW50IChyZWFkZXIsIG1lc3NhZ2VJbmZvLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZSAocmVhZGVyLCBFTkRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnIChyZWFkZXIsIGdldEhlYWRlclRhZyAoKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50IChyZWFkZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgSkFYQiBjYW4gZGVzZXJpYWxpemUgYSBoZWFkZXIsIGRlc2VyaWFsaXplIGl0LgotICAgICAqIE90aGVyd2lzZSwganVzdCBpZ25vcmUgdGhlIGhlYWRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZUhlYWRlckVsZW1lbnQgKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dCAobWVzc2FnZUluZm8pOwotICAgICAgICBCcmlkZ2VDb250ZXh0IGJyaWRnZUNvbnRleHQgPSBydEN0eHQuZ2V0QnJpZGdlQ29udGV4dCAoKTsKLSAgICAgICAgU2V0PFFOYW1lPiBrbm93bkhlYWRlcnMgPSAoKFNPQVBSdW50aW1lTW9kZWwpIHJ0Q3R4dC5nZXRNb2RlbCAoKSkuZ2V0S25vd25IZWFkZXJzICgpOwotICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUgKCk7Ci0gICAgICAgIGlmIChrbm93bkhlYWRlcnMgIT0gbnVsbCAmJiBrbm93bkhlYWRlcnMuY29udGFpbnMgKG5hbWUpKSB7Ci0gICAgICAgICAgICBRTmFtZSBoZWFkZXJOYW1lID0gcmVhZGVyLmdldE5hbWUgKCk7Ci0gICAgICAgICAgICBpZiAobXNnLmlzSGVhZGVyUHJlc2VudCAobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBNb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mIGhlYWRlciB3aG9zZSBRTmFtZSBpcyBtYXBwZWQgdG8gYQotICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBwYXJhbWV0ZXIuIEdlbmVyYXRlcyBhIHJ1bnRpbWUgZXJyb3IuCi0gICAgICAgICAgICAgICAgcmFpc2VGYXVsdCAoZ2V0U2VuZGVyRmF1bHRDb2RlKCksICJEdXBsaWNhdGUgSGVhZGVyIiArIGhlYWRlck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IGRlY29kZXJJbmZvID0gcnRDdHh0LmdldERlY29kZXJJbmZvIChuYW1lKTsKLSAgICAgICAgICAgIGlmIChkZWNvZGVySW5mbyAhPSBudWxsICYmIGRlY29kZXJJbmZvIGluc3RhbmNlb2YgSkFYQkJyaWRnZUluZm8pIHsKLSAgICAgICAgICAgICAgICBKQVhCQnJpZGdlSW5mbyBicmlkZ2VJbmZvID0gKEpBWEJCcmlkZ2VJbmZvKSBkZWNvZGVySW5mbzsKLSAgICAgICAgICAgICAgICAvLyBKQVhCIGxlYXZlcyBvbiA8L2VudjpIZWFkZXI+IG9yIDxuZXh0SGVhZGVyRWxlbWVudD4KLSAgICAgICAgICAgICAgICBicmlkZ2VJbmZvLmRlc2VyaWFsaXplKHJlYWRlcixicmlkZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IG5ldyBIZWFkZXJCbG9jayAoYnJpZGdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgbXNnLmFkZEhlYWRlciAoaGVhZGVyQmxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudCAocmVhZGVyKTsgICAgICAgICAgICAgICAgIC8vIE1vdmVzIHRvIEVORCBzdGF0ZQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQgKHJlYWRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5ydC5lbmNvZGluZy5zb2FwLlNPQVBEZWNvZGVyI2dldEZhdWx0VGFnKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUU5hbWUgZ2V0RmF1bHRUYWcgKCl7Ci0gICAgICAgIHJldHVybiBTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVDsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucnQuZW5jb2Rpbmcuc29hcC5TT0FQRGVjb2RlciNnZXRCb2R5VGFnKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUU5hbWUgZ2V0Qm9keVRhZyAoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9CT0RZOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJ0LmVuY29kaW5nLnNvYXAuU09BUERlY29kZXIjZ2V0RW52ZWxvcGVUYWcoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRFbnZlbG9wZVRhZyAoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9FTlZFTE9QRTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5ydC5lbmNvZGluZy5zb2FwLlNPQVBEZWNvZGVyI2dldEhlYWRlclRhZygpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldEhlYWRlclRhZyAoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9IRUFERVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldE1VQXR0clFOYW1lICgpewotICAgICAgICByZXR1cm4gU09BUDEyQ29uc3RhbnRzLlFOQU1FX01VU1RVTkRFUlNUQU5EOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRSb2xlQXR0clFOYW1lICgpewotICAgICAgICByZXR1cm4gU09BUDEyQ29uc3RhbnRzLlFOQU1FX1JPTEU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldEZhdWx0RGV0YWlsVGFnKCkgewotICAgICAgICByZXR1cm4gU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX0RFVEFJTDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdJZCgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUU5hbWUgZ2V0U2VuZGVyRmF1bHRDb2RlKCkgewotICAgICAgICByZXR1cm4gU09BUDEyQ29uc3RhbnRzLkZBVUxUX0NPREVfU0VSVkVSOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRSZWNlaXZlckZhdWx0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX0NMSUVOVDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUU5hbWUgZ2V0VmVyc2lvbk1pc21hdGNoRmF1bHRDb2RlKCkgewotICAgICAgICByZXR1cm4gU09BUDEyQ29uc3RhbnRzLkZBVUxUX0NPREVfVkVSU0lPTl9NSVNNQVRDSDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvY2xpZW50L1NPQVAxMlhNTEVuY29kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvY2xpZW50L1NPQVAxMlhNTEVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2YzM2MC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2NsaWVudC9TT0FQMTJYTUxFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5jbGllbnQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmdldExvZ2dlcjsKLQotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DT05URVhUX1BST1BFUlRZOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQMTJOYW1lc3BhY2VDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUE5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5KQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlNlbmRlckV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy4qOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgU09BUDEyWE1MRW5jb2RlciBleHRlbmRzIFNPQVBYTUxFbmNvZGVyIHsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9Ci0gICAgICAgICAgIGdldExvZ2dlcihuZXcgU3RyaW5nQnVmZmVyKCkuYXBwZW5kKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4pLmFwcGVuZCgiLmNsaWVudC5kaXNwYXRjaC51dGlsIikudG9TdHJpbmcoKSk7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgU09BUEVuY29kZXIjc3RhcnRFbnZlbG9wZShYTUxTdHJlYW1Xcml0ZXIpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRFbnZlbG9wZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgIFNPQVBOYW1lc3BhY2VDb25zdGFudHMuVEFHX0VOVkVMT1BFLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLk5TUFJFRklYX1NPQVBfRU5WRUxPUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VuZGVyRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFNPQVBFbmNvZGVyI3N0YXJ0Qm9keShYTUxTdHJlYW1Xcml0ZXIpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRCb2R5KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLk5TUFJFRklYX1NPQVBfRU5WRUxPUEUsCi0gICAgICAgICAgICAgICAgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5UQUdfQk9EWSwgU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLkVOVkVMT1BFKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZW5kZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgU09BUEVuY29kZXIjc3RhcnRIZWFkZXIoWE1MU3RyZWFtV3JpdGVyKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0SGVhZGVyKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLk5TUFJFRklYX1NPQVBfRU5WRUxPUEUsCi0gICAgICAgICAgICAgICAgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5UQUdfSEVBREVSLAotICAgICAgICAgICAgICAgIFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7ICAgICAvLyA8ZW52OkhlYWRlcj4KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZW5kZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICBKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyIG1hcnNoYWxsZXIpCi0gICAgewotICAgICAgICBTdHJpbmcgY29udGVudE5lZ290aWF0aW9uID0gKFN0cmluZykKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSk7Ci0KLSAgICAgICAgaWYgKG1hcnNoYWxsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbWFyc2hhbGxlciA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRBdHRhY2htZW50TWFyc2hhbGxlcihtZXNzYWdlSW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWFyc2hhbGxlciAhPSBudWxsICYmIG1hcnNoYWxsZXIuaXNYb3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIFhPUF9TT0FQMTJfWE1MX1RZUEVfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKGNvbnRlbnROZWdvdGlhdGlvbiA9PSAib3B0aW1pc3RpYyIpID8KLSAgICAgICAgICAgICAgICBGQVNUX0lORk9TRVRfVFlQRV9TT0FQMTIgOiBTT0FQMTJfWE1MX0NPTlRFTlRfVFlQRV9WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBTT0FQTWVzc2FnZSAoMS4xIG9yIDEuMiB1c2luZyBTQUFKIGFwaSkuCi0gICAgICogQHJldHVybiB0aGUgQmluZGluZ0lEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVuY29kZXIKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJpbmRpbmdJZCAoKXsKLSAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2NsaWVudC9TT0FQWE1MRGVjb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9jbGllbnQvU09BUFhNTERlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyOTZlZS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2NsaWVudC9TT0FQWE1MRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgxICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5jbGllbnQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guRGlzcGF0Y2hDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5pbXBsLmVuY29kaW5nLkRpc3BhdGNoU2VyaWFsaXplcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guaW1wbC5lbmNvZGluZy5EaXNwYXRjaFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuaW50ZXJuYWwuSW50ZXJuYWxFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQkJlYW5JbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQkJyaWRnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc2ltcGxldHlwZS5FbmNvZGVyVXRpbHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5EZXNlcmlhbGl6YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUERlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQRVBURmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuQm9keUJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSGVhZGVyQmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldTQ29ubmVjdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuU291cmNlUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuQXR0cmlidXRlczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNPQVBDb25uZWN0aW9uVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNPQVBVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlN0QVhTb3VyY2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBzdGF0aWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuKjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLQotcHVibGljIGNsYXNzIFNPQVBYTUxEZWNvZGVyIGV4dGVuZHMgU09BUERlY29kZXIgewotICAgIHB1YmxpYyBTT0FQWE1MRGVjb2RlcigpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRGlzcGF0Y2hTZXJpYWxpemVyIGdldFNlcmlhbGl6ZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIERpc3BhdGNoU2VyaWFsaXplci5TT0FQXzFfMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgdG9TT0FQTWVzc2FnZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBXU0Nvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChXU0Nvbm5lY3Rpb24pIG1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKTsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25uZWN0aW9uVXRpbC5nZXRTT0FQTWVzc2FnZShjb25uZWN0aW9uLCBtZXNzYWdlSW5mbywgZ2V0QmluZGluZ0lkKCkpOwotICAgIH0KLQotICAgIC8qcHJvdGVjdGVkIHZvaWQgZGVjb2RlQm9keShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBJbnRlcm5hbE1lc3NhZ2UgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0Qm9keVRhZygpKTsKLSAgICAgICAgaW50IHN0YXRlID0gWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgZGVjb2RlQm9keUNvbnRlbnQocmVhZGVyLCByZXNwb25zZSwgbWVzc2FnZUluZm8pOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgRU5EX0VMRU1FTlQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEJvZHlUYWcoKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgfQotICAgICovCi0KLQotICAgIC8qCi0gICAgKiBza2lwQm9keSBpcyB0cnVlLCB0aGUgYm9keSBpcyBza2lwcGVkIGR1cmluZyBwYXJzaW5nLgotICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlRW52ZWxvcGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgSW50ZXJuYWxNZXNzYWdlIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBza2lwQm9keSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIC8vWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcocmVhZGVyLCBnZXRFbnZlbG9wZVRhZygpKTsKLSAgICAgICAgaWYgKGlzRGlzcGF0Y2gobWVzc2FnZUluZm8pKQotICAgICAgICAgICBkaXNwYXRjaFV0aWwuY29sbGVjdFByZWZpeGVzKHJlYWRlcik7Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLQotICAgICAgICBpZiAoc2tpcEhlYWRlcihtZXNzYWdlSW5mbykpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyBoZWFkZXIiKTsKLSAgICAgICAgICAgIHNraXBIZWFkZXIocmVhZGVyLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRGVjb2RpbmcgaGVhZGVyIik7Ci0gICAgICAgICAgICBkZWNvZGVIZWFkZXIocmVhZGVyLCBtZXNzYWdlSW5mbywgcmVxdWVzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcEJvZHkpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyBib2R5Iik7Ci0gICAgICAgICAgICBza2lwQm9keShyZWFkZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRlY29kb25nIGJvZHkiKTsKLSAgICAgICAgICAgIGRlY29kZUJvZHkocmVhZGVyLCByZXF1ZXN0LCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgRU5EX0VMRU1FTlQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEVudmVsb3BlVGFnKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgRU5EX0RPQ1VNRU5UKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydE51bGwoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIChzICE9IG51bGwpID8gcyA6ICIiOwotICAgIH0KLQotICAgIC8vQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlQm9keShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBJbnRlcm5hbE1lc3NhZ2UgcmVzcG9uc2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIERpc3BhdGNoQ29udGV4dCBjb250ZXh0ID0gKERpc3BhdGNoQ29udGV4dCkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5ESVNQQVRDSF9DT05URVhUKTsKLSAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRpc3BhdGNoIGNvbnRleHQgbm90IG51bGwiKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBTVEFSVF9FTEVNRU5UKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0Qm9keVRhZygpKTsKLSAgICAgICAgICAgIGludCBzdGF0ZSA9IFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgICAgICAgICAvLyBpZiBCb2R5IGlzIG5vdCBlbXB0eSwgdGhlbiBkZXNlcmlhbGl6ZSB0aGUgQm9keQotICAgICAgICAgICAgaWYgKHN0YXRlICE9IEVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgQm9keUJsb2NrIHJlc3BvbnNlQm9keTsKLSAgICAgICAgICAgICAgICBRTmFtZSByZXNwb25zZUJvZHlOYW1lID0gcmVhZGVyLmdldE5hbWUoKTsgICAvLyBPcGVyYXRpb24gbmFtZQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlQm9keU5hbWUuZXF1YWxzKGdldEZhdWx0VGFnKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdEluZm8gc29hcEZhdWx0SW5mbyA9IGRlY29kZUZhdWx0KHJlYWRlciwgcmVzcG9uc2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5ID0gbmV3IEJvZHlCbG9jayhzb2FwRmF1bHRJbmZvKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzZXJpYWxpemluZyBib2R5Iik7Ci0gICAgICAgICAgICAgICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gZ2V0SkFYQkNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoamF4YkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkpBWEJDb250ZXh0ID09IG51bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IG5ldyBCb2R5QmxvY2soZ2V0U2VyaWFsaXplckluc3RhbmNlKCkuZGVzZXJpYWxpemVTb3VyY2UocmVhZGVyLCBkaXNwYXRjaFV0aWwpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vamF4YiB3aWxsIGxlYXZlIHJlYWRlciBvbiBlbmRpbmcgPC9ib2R5PiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRG9pbmcgYSBqYXhiIGJlYW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWEJCZWFuSW5mbyBqYXhCZWFuID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVubWFyc2hhbGxlciB1bSA9IChVbm1hcnNoYWxsZXIpbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5ESVNQQVRDSF9VTk1BUlNIQUxMRVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4QmVhbiA9IEpBWEJCZWFuSW5mby5mcm9tU3RBWChyZWFkZXIsIGpheGJDb250ZXh0LCB1bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4QmVhbiA9IEpBWEJCZWFuSW5mby5mcm9tU3RBWChyZWFkZXIsIGpheGJDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5ID0gbmV3IEJvZHlCbG9jayhqYXhCZWFuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRCb2R5KHJlc3BvbnNlQm9keSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBFTkRfRUxFTUVOVCk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEJvZHlUYWcoKSk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICB9IC8vZWxzZQotICAgICAgICBlbHNlIHN1cGVyLmRlY29kZUJvZHkocmVhZGVyLCByZXNwb25zZSwgbWVzc2FnZUluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIC8vVG9kbzprdyAxMDI1MDUKLSAgICBwdWJsaWMgdm9pZCB0b01lc3NhZ2VJbmZvKEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0KLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDb250ZXh0ID0KLSAgICAgICAgICAgIChSdW50aW1lQ29udGV4dCkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19SVU5USU1FX0NPTlRFWFQpOwotICAgICAgICBpZiAocnRDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNPQVBFUFRGYWN0b3J5IGVwdGYgPSAoU09BUEVQVEZhY3RvcnkpIG1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgICAgIEludGVybmFsRW5jb2RlciBlbmNvZGVyID0gZXB0Zi5nZXRJbnRlcm5hbEVuY29kZXIoKTsKLSAgICAgICAgICAgIGVuY29kZXIudG9NZXNzYWdlSW5mbyhpbnRlcm5hbE1lc3NhZ2UsIG1lc3NhZ2VJbmZvKTsKLQotICAgICAgICB9IGVsc2UgeyAgLy9oZXJlIHdlIG5lZWQgdG8gc2V0IGF0dGFjaG1lbnRzIGluIHJlc3BvbnNlIGNvbnRleHQKLSAgICAgICAgICAgIGlmIChpbnRlcm5hbE1lc3NhZ2UgIT0gbnVsbCAmJiBpbnRlcm5hbE1lc3NhZ2UuZ2V0Qm9keSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxNZXNzYWdlLmdldEJvZHkoKS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU09BUEZhdWx0SW5mbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoaW50ZXJuYWxNZXNzYWdlLmdldEJvZHkoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxNZXNzYWdlLmdldEJvZHkoKS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LlVOQ0hFQ0tFRF9FWENFUFRJT05fUkVTUE9OU0UpOwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShpbnRlcm5hbE1lc3NhZ2UuZ2V0Qm9keSgpLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0Lk5PUk1BTF9SRVNQT05TRSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEF0dGFjaG1lbnRzKGludGVybmFsTWVzc2FnZSwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgICAgICAvL3VuZm9ydHVuYXRlbHkgd2UgbXVzdCBkbyB0aGlzCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbE1lc3NhZ2UuZ2V0Qm9keSgpLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKQVhCQmVhbkluZm8pCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZSgoKEpBWEJCZWFuSW5mbykgaW50ZXJuYWxNZXNzYWdlLmdldEJvZHkoKS5nZXRWYWx1ZSgpKS5nZXRCZWFuKCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShpbnRlcm5hbE1lc3NhZ2UuZ2V0Qm9keSgpLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0Lk5PUk1BTF9SRVNQT05TRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0QXR0YWNobWVudHMoSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZUVudmVsb3BlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIEludGVybmFsTWVzc2FnZSBpbSA9IGRlY29kZUludGVybmFsTWVzc2FnZShyZWFkZXIsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgdG9NZXNzYWdlSW5mbyhpbSwgbWVzc2FnZUluZm8pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbnRlcm5hbE1lc3NhZ2UgZGVjb2RlSW50ZXJuYWxNZXNzYWdlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIEludGVybmFsTWVzc2FnZSByZXNwb25zZSA9IG5ldyBJbnRlcm5hbE1lc3NhZ2UoKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0RW52ZWxvcGVUYWcoKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgICAgIGRlY29kZUhlYWRlcihyZWFkZXIsIG1lc3NhZ2VJbmZvLCByZXNwb25zZSk7Ci0gICAgICAgIGRlY29kZUJvZHkocmVhZGVyLCByZXNwb25zZSwgbWVzc2FnZUluZm8pOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgRU5EX0VMRU1FTlQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIGdldEVudmVsb3BlVGFnKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgRU5EX0RPQ1VNRU5UKTsKLQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEludGVybmFsTWVzc2FnZSB0b0ludGVybmFsTWVzc2FnZShTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgLy8gVE9ETyBoYW5kbGUgZXhjZXB0aW9ucywgYXR0YWNobWVudHMKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgcmVzcG9uc2UgPSBuZXcgSW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudHMobWVzc2FnZUluZm8sIHJlc3BvbnNlLCBzb2FwTWVzc2FnZSk7Ci0gICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICByZWFkZXIgPSBTb3VyY2VSZWFkZXJGYWN0b3J5LmNyZWF0ZVNvdXJjZVJlYWRlcihzb3VyY2UsIHRydWUsIGdldFNPQVBNZXNzYWdlQ2hhcnNldEVuY29kaW5nKHNvYXBNZXNzYWdlKSk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgZGVjb2RlRW52ZWxvcGUocmVhZGVyLCByZXNwb25zZSwgZmFsc2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICAgICAgfSBjYXRjaCAoRGVzZXJpYWxpemF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuY2xvc2UocmVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbnRlcm5hbE1lc3NhZ2UgdG9JbnRlcm5hbE1lc3NhZ2UoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgcmVzcG9uc2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIC8vIFRPRE8gaGFuZGxlIGV4Y2VwdGlvbnMsIGF0dGFjaG1lbnRzCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnRzKG1lc3NhZ2VJbmZvLCByZXNwb25zZSwgc29hcE1lc3NhZ2UpOwotICAgICAgICAgICAgU291cmNlIHNvdXJjZSA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgcmVhZGVyID0gU291cmNlUmVhZGVyRmFjdG9yeS5jcmVhdGVTb3VyY2VSZWFkZXIoc291cmNlLCB0cnVlLCBnZXRTT0FQTWVzc2FnZUNoYXJzZXRFbmNvZGluZyhzb2FwTWVzc2FnZSkpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgIGRlY29kZUVudmVsb3BlKHJlYWRlciwgcmVzcG9uc2UsICFpc0Rpc3BhdGNoKG1lc3NhZ2VJbmZvKSwgbWVzc2FnZUluZm8pOwotCi0gICAgICAgICAgICBpZiAoIWlzRGlzcGF0Y2gobWVzc2FnZUluZm8pKQotICAgICAgICAgICAgICAgIGNvbnZlcnRCb2R5QmxvY2socmVzcG9uc2UsIG1lc3NhZ2VJbmZvKTsKLQotICAgICAgICB9IGNhdGNoIChEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5jbG9zZShyZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc29hcCBiaW5kaW5nIC0gU09BUCAxLjEgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUEJpbmRpbmdJZCgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25zdGFudHMuTlNfV1NETF9TT0FQOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTT0FQRmF1bHRJbmZvIGRlY29kZUZhdWx0KFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVJlYWRlclN0YXRlKHJlYWRlciwgU1RBUlRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgU09BUENvbnN0YW50cy5RTkFNRV9TT0FQX0ZBVUxUKTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZE5hbWUgPSBtZXNzYWdlSW5mby5nZXRNZXRob2QoKTsKLQotICAgICAgICAvLyBmYXVsdGNvZGUKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIFNUQVJUX0VMRU1FTlQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIFNPQVBDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVF9DT0RFKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwotICAgICAgICBRTmFtZSBmYXVsdGNvZGU7Ci0gICAgICAgIFN0cmluZyB0b2tlbnMgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgdXJpID0gIiI7Ci0gICAgICAgIHRva2VucyA9IEVuY29kZXJVdGlscy5jb2xsYXBzZVdoaXRlc3BhY2UodG9rZW5zKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IFhtbFV0aWwuZ2V0UHJlZml4KHRva2Vucyk7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgdXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkV4Y2VwdGlvbigieHNkLnVua25vd25QcmVmaXgiLCBwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBYbWxVdGlsLmdldExvY2FsUGFydCh0b2tlbnMpOwotICAgICAgICBmYXVsdGNvZGUgPSBuZXcgUU5hbWUodXJpLCBsb2NhbFBhcnQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIEVORF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcocmVhZGVyLCBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVBfRkFVTFRfQ09ERSk7Ci0KLSAgICAgICAgLy8gZmF1bHRzdHJpbmcKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIFNUQVJUX0VMRU1FTlQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIFNPQVBDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVF9TVFJJTkcpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRDb250ZW50KHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBmYXVsdHN0cmluZyA9ICIiOwotICAgICAgICAvL3JlYWRlciBtYXkgZ2l2ZSBtb3JlIHRoYW4gb25lIGNoYXIgZXZlbnRzIHNvIGNvYWxlc2MgdGhlbSBhbGwuCi0gICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gQ0hBUkFDVEVSUykgewotICAgICAgICAgICAgZG8gIHsKLSAgICAgICAgICAgICAgIGZhdWx0c3RyaW5nICs9IHJlYWRlci5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgICAgIH13aGlsZShyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gQ0hBUkFDVEVSUyk7Ci0gICAgICAgIH0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIEVORF9FTEVNRU5UKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcocmVhZGVyLCBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVBfRkFVTFRfU1RSSU5HKTsKLQotICAgICAgICBTdHJpbmcgZmF1bHRhY3RvciA9IG51bGw7Ci0gICAgICAgIE9iamVjdCBmYXVsdGRldGFpbCA9IG51bGw7Ci0gICAgICAgIFFOYW1lIGZhdWx0TmFtZTsKLSAgICAgICAgaWYgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgPT0gU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgLy8gZmF1bHRhY3RvcgotICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVBfRkFVTFRfQUNUT1IpKSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgICAgIC8vIGZhdWx0YWN0b3IgbWF5IGJlIGVtcHR5Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBDSEFSQUNURVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0YWN0b3IgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIEVORF9FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnZlcmlmeVRhZyhyZWFkZXIsIFNPQVBDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVF9BQ1RPUik7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZhdWx0ZGV0YWlsCi0gICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFNPQVBDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVF9ERVRBSUwpKSB7Ci0gICAgICAgICAgICAgICAgLy9za2lwIDxkZXRhaWwvPgotICAgICAgICAgICAgICAgIGlmKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dENvbnRlbnQocmVhZGVyKSA9PSBTVEFSVF9FTEVNRU5UKXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfQ09OVEVYVCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ZGV0YWlsID0gcmVhZEZhdWx0RGV0YWlsKHJlYWRlciwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dChyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG1vdmUgZnJvbSA8L2RldGFpbD4gdG8gPC9GYXVsdD4uCi0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxNZXNzYWdlLmdldEhlYWRlcnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNIZWFkZXJGYXVsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSBhIGhlYWRlciBmYXVsdCBvciBhIHByb3RvY29sIGV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbAotICAgICAgICAgICAgICAgICAgICBmb3IgKEhlYWRlckJsb2NrIGhlYWRlckJsb2NrIDogaW50ZXJuYWxNZXNzYWdlLmdldEhlYWRlcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ0Q3R4dC5nZXRNb2RlbCgpLmlzS25vd25GYXVsdChoZWFkZXJCbG9jay5nZXROYW1lKCksIG1ldGhvZE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSGVhZGVyRmF1bHQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ZGV0YWlsID0gaGVhZGVyQmxvY2suZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBhIGhlYWRlciBmYXVsdCwgdGhlbiBpdCBpcyBhIHByb3RvY29sIGV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbAotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSGVhZGVyRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ZGV0YWlsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhIGhlYWRlciBmYXVsdCAod2l0aCBubyBmYXVsdGFjdG9yKQotICAgICAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZS5nZXRIZWFkZXJzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgOiBpbnRlcm5hbE1lc3NhZ2UuZ2V0SGVhZGVycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydEN0eHQuZ2V0TW9kZWwoKS5pc0tub3duRmF1bHQoaGVhZGVyQmxvY2suZ2V0TmFtZSgpLCBtZXRob2ROYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRkZXRhaWwgPSBoZWFkZXJCbG9jay5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBTT0FQRmF1bHRJbmZvIHNvYXBGYXVsdEluZm8gPSBuZXcgU09BUEZhdWx0SW5mbyhmYXVsdHN0cmluZywgZmF1bHRjb2RlLCBmYXVsdGFjdG9yLCBmYXVsdGRldGFpbCwgZ2V0QmluZGluZ0lkKCkpOwotCi0gICAgICAgIC8vIHJlYWRlciBjb3VsZCBiZSBsZWZ0IG9uIENIQVJTIHRva2VuIHJhdGhlciB0aGFuIDwvZmF1bHQ+Ci0gICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gQ0hBUkFDVEVSUyAmJiByZWFkZXIuaXNXaGl0ZVNwYWNlKCkpIHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBFTkRfRUxFTUVOVCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgU09BUENvbnN0YW50cy5RTkFNRV9TT0FQX0ZBVUxUKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLQotICAgICAgICByZXR1cm4gc29hcEZhdWx0SW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNvZGVzIHRoZSBmYXVsdCAmbHQ7ZGV0YWlsPiBpbnRvIGEge0BsaW5rIERldGFpbH0gb2JqZWN0IG9yIGEgSkFYQiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIFVwb24gZW50cnkgdGhlIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBzdGFydCB0YWcgb2YgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgJmx0O2RldGFpbD4uCi0gICAgICogVXBvbiBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgdGhlIGN1cnNvciBpcyBsZWZ0IGF0ICZsdDsvZGV0YWlsPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHJlYWRGYXVsdERldGFpbChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBNZXNzYWdlSW5mbyBtaSkgewotICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWkpOwotICAgICAgICBpZiAocnRDdHh0ID09IG51bGwpewotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIGZhdWx0TmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChydEN0eHQuZ2V0TW9kZWwoKS5pc0tub3duRmF1bHQoZmF1bHROYW1lLCBtaS5nZXRNZXRob2QoKSkpIHsKLSAgICAgICAgICAgIE9iamVjdCBkZWNvZGVySW5mbyA9IHJ0Q3R4dC5nZXREZWNvZGVySW5mbyhmYXVsdE5hbWUpOwotICAgICAgICAgICAgaWYgKGRlY29kZXJJbmZvICE9IG51bGwgJiYgZGVjb2RlckluZm8gaW5zdGFuY2VvZiBKQVhCQnJpZGdlSW5mbykgewotICAgICAgICAgICAgICAgIEpBWEJCcmlkZ2VJbmZvIGJyaWRnZUluZm8gPSAoSkFYQkJyaWRnZUluZm8pIGRlY29kZXJJbmZvOwotICAgICAgICAgICAgICAgIC8vIEpBWEIgbGVhdmVzIG9uIDwvZW52OkhlYWRlcj4gb3IgPG5leHRIZWFkZXJFbGVtZW50PgotICAgICAgICAgICAgICAgIGJyaWRnZUluZm8uZGVzZXJpYWxpemUocmVhZGVyLCBydEN0eHQuZ2V0QnJpZGdlQ29udGV4dCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIHNraXAgb3RoZXIgZGV0YWlsIGVudHJpZXMKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCEoZXZlbnQgPT0gU1RBUlRfRUxFTUVOVCB8fCBldmVudCA9PSBFTkRfRUxFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5UmVhZGVyU3RhdGUocmVhZGVyLCBFTkRfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlUYWcocmVhZGVyLCBnZXRGYXVsdERldGFpbFRhZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnJpZGdlSW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZWNvZGVGYXVsdERldGFpbChyZWFkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY29kZXMgdGhlIGZhdWx0ICZsdDtkZXRhaWw+IGludG8gYSB7QGxpbmsgRGV0YWlsfSBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIFVwb24gZW50cnkgdGhlIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBzdGFydCB0YWcgb2YgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgJmx0O2RldGFpbD4uCi0gICAgICogVXBvbiBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgdGhlIGN1cnNvciBpcyBsZWZ0IGF0ICZsdDsvZGV0YWlsPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGV0YWlsIGRlY29kZUZhdWx0RGV0YWlsKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHBhcnNlIHRoZSBjdXJyZW50IGVsZW1lbnQgdGhhdCB0aGUgcmVhZGVyIGlzIHBvaW50aW5nIHRvCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IFhtbFV0aWwubmV3VHJhbnNmb3JtZXIoKTsKLQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBtZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gc29hcE1lc3NhZ2UuZ2V0U09BUEJvZHkoKS5hZGRGYXVsdCgpLmFkZERldGFpbCgpOwotCi0gICAgICAgICAgICAvLyByZXBlYXRlZGx5IGNvcHkgYWxsIHRoZSBjaGlsZCBlbGVtZW50cyBvZiA8ZGV0YWlsPi4KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB0cmFucy50cmFuc2Zvcm0obmV3IFN0QVhTb3VyY2UocmVhZGVyLCB0cnVlKSwgbmV3IERPTVJlc3VsdChkZXRhaWwpKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dENvbnRlbnQocmVhZGVyKSA9PSBTVEFSVF9FTEVNRU5UKTsKLQotICAgICAgICAgICAgLy8gbm93IHdlIHNob3VsZCBiZSBhdCA8L2RldGFpbD4uCi0gICAgICAgICAgICByZXR1cm4gZGV0YWlsOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJzZW5kZXIucmVzcG9uc2UuY2Fubm90RGVjb2RlRmF1bHREZXRhaWwiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oInNlbmRlci5yZXNwb25zZS5jYW5ub3REZWNvZGVGYXVsdERldGFpbCIsIGUpOwotICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oInNlbmRlci5yZXNwb25zZS5jYW5ub3REZWNvZGVGYXVsdERldGFpbCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAvKiBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRDdXJyZW50UHJlZml4KFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgdG9rZW5zID0gcmVhZGVyLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9ICIiOwotICAgICAgICB0b2tlbnMgPSBFbmNvZGVyVXRpbHMuY29sbGFwc2VXaGl0ZXNwYWNlKHRva2Vucyk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBYbWxVdGlsLmdldFByZWZpeCh0b2tlbnMpOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oInhzZC51bmtub3duUHJlZml4IiwgcHJlZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gWG1sVXRpbC5nZXRMb2NhbFBhcnQodG9rZW5zKTsKLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBKQVhCQ29udGV4dCBnZXRKQVhCQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBKQVhCQ29udGV4dCBqYyA9IG51bGw7Ci0KLSAgICAgICAgUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQgPSAoUmVxdWVzdENvbnRleHQpIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgLy8gVE9ETzogZG9lcyB0aGlzIHJlYWxseSBuZWVkIHRvIGJlIGNvcGllZD8KLSAgICAgICAgICAgIGpjID0gKEpBWEJDb250ZXh0KSByZXF1ZXN0Q29udGV4dC5jb3B5KCkuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYQl9DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgcmV0dXJuIGpjOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmluZGluZ0lkKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0ID0gKFJlcXVlc3RDb250ZXh0KSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBpZiAocmVxdWVzdENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9IChTdHJpbmcpIHJlcXVlc3RDb250ZXh0LmdldChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkJJTkRJTkdfSURfUFJPUEVSVFkpOwotICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldEJpbmRpbmdJZCgpOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSWQoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldFNlbmRlckZhdWx0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25zdGFudHMuRkFVTFRfQ09ERV9TRVJWRVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldFJlY2VpdmVyRmF1bHRDb2RlKCkgewotICAgICAgICByZXR1cm4gU09BUENvbnN0YW50cy5GQVVMVF9DT0RFX0NMSUVOVDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUU5hbWUgZ2V0VmVyc2lvbk1pc21hdGNoRmF1bHRDb2RlKCkgewotICAgICAgICByZXR1cm4gU09BUENvbnN0YW50cy5GQVVMVF9DT0RFX1ZFUlNJT05fTUlTTUFUQ0g7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2NsaWVudC9TT0FQWE1MRW5jb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9jbGllbnQvU09BUFhNTEVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MDQ1Zi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2NsaWVudC9TT0FQWE1MRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuY2xpZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7Ci1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlJlcXVlc3RDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TZW5kZXJFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoLkRpc3BhdGNoQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5KQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmludGVybmFsLkludGVybmFsRW5jb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCZWFuSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQRVBURmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuQXR0YWNobWVudEJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuQm9keUJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1Xcml0ZXJGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU09BUFV0aWw7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIuZ2V0TG9nZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgU09BUFhNTEVuY29kZXIgZXh0ZW5kcyBTT0FQRW5jb2RlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KLSAgICAgICAgZ2V0TG9nZ2VyKG5ldyBTdHJpbmdCdWZmZXIoKS5hcHBlbmQoY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db25zdGFudHMuTG9nZ2luZ0RvbWFpbikuYXBwZW5kKCIuY2xpZW50LmRpc3BhdGNoLnV0aWwiKS50b1N0cmluZygpKTsKLQotICAgIHB1YmxpYyBTT0FQWE1MRW5jb2RlcigpIHsKLSAgICB9Ci0gICAgLyogbW92ZWQgdG8gc3VwZXIKLSAgICBwcm90ZWN0ZWQgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgSkFYQkNvbnRleHQgamMgPSBudWxsOwotICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gKFJlcXVlc3RDb250ZXh0KSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgamMgPSAoSkFYQkNvbnRleHQpIGNvbnRleHQuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYQl9DT05URVhUX1BST1BFUlRZKTsKLQotICAgICAgICByZXR1cm4gamM7Ci0gICAgfQotICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcEhlYWRlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBpZiAobWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfTU9ERSkgPT0KLSAgICAgICAgICAgIFNlcnZpY2UuTW9kZS5QQVlMT0FEKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldEhlYWRlclRhZygpIHsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25zdGFudHMuUU5BTUVfU09BUF9IRUFERVI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2tpcEhlYWRlcihYTUxTdHJlYW1SZWFkZXIgd3JpdGVyKSB7Ci0gICAgICAgIC8vWE1MU3RyZWFtUmVhZGVyVXRpbC52ZXJpZnlSZWFkZXJTdGF0ZShyZWFkZXIsIFNUQVJUX0VMRU1FTlQpOwotICAgICAgICAvL2lmICghU09BUE5hbWVzcGFjZUNvbnN0YW50cy5UQUdfSEVBREVSLmVxdWFscyhyZWFkZXIuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgIC8vICByZXR1cm47Ci0gICAgICAgIC8vfQotICAgICAgICAvL1hNTFN0cmVhbVJlYWRlclV0aWwudmVyaWZ5VGFnKHJlYWRlciwgZ2V0SGVhZGVyVGFnKCkpOwotICAgICAgICAvL1hNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsgICAgLy8gTW92ZXMgdG8gPC9IZWFkZXI+Ci0gICAgICAgIC8vWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW50ZXJuYWxNZXNzYWdlIHRvSW50ZXJuYWxNZXNzYWdlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UgPSBuZXcgSW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgIERpc3BhdGNoQ29udGV4dCBjb250ZXh0ID0gKERpc3BhdGNoQ29udGV4dCkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5ESVNQQVRDSF9DT05URVhUKTsKLSAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlIHR5cGUgPQotICAgICAgICAgICAgICAgIChEaXNwYXRjaENvbnRleHQuTWVzc2FnZVR5cGUpIGNvbnRleHQuZ2V0UHJvcGVydHkoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0UpOwotICAgICAgICAgICAgT2JqZWN0W10gZGF0YSA9IG1lc3NhZ2VJbmZvLmdldERhdGEoKTsKLSAgICAgICAgICAgIEJvZHlCbG9jayBib2R5QmxvY2sgPSBudWxsOwotICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQVhCX01FU1NBR0U6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkFYQl9QQVlMT0FEOgotICAgICAgICAgICAgICAgICAgICBKQVhCQmVhbkluZm8gamF4YkluZm8gPSBuZXcgSkFYQkJlYW5JbmZvKGRhdGFbMF0sIGdldEpBWEJDb250ZXh0KG1lc3NhZ2VJbmZvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlCbG9jayA9IG5ldyBCb2R5QmxvY2soamF4YkluZm8pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNPVVJDRV9QQVlMT0FEOgotICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWVzc2FnZUluZm8uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBib2R5QmxvY2sgPSBuZXcgQm9keUJsb2NrKChTb3VyY2UpIGRhdGFbMF0pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJvZHlCbG9jayAhPSBudWxsKQotICAgICAgICAgICAgICAgIGludGVybmFsTWVzc2FnZS5zZXRCb2R5KGJvZHlCbG9jayk7Ci0KLSAgICAgICAgICAgIC8vbG9vayBmb3IgYXR0YWNobWVudHMgaGVyZQotICAgICAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dE1hcCA9IChNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4pICgoTWFwPFN0cmluZywgT2JqZWN0PikKLSAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpKS5nZXQoTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyk7Ci0KLSAgICAgICAgICAgIGlmIChhdHRNYXAgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHQgOiBhdHRNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbE1lc3NhZ2UuYWRkQXR0YWNobWVudChBdHRhY2htZW50QmxvY2suZnJvbURhdGFIYW5kbGVyKGF0dC5nZXRLZXkoKSwgYXR0LmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNPQVBFUFRGYWN0b3J5IGVwdGYgPSAoU09BUEVQVEZhY3RvcnkpIG1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgICAgIEludGVybmFsRW5jb2RlciBpbnRlcm5hbEVuY29kZXIgPSBlcHRmLmdldEludGVybmFsRW5jb2RlcigpOwotICAgICAgICAgICAgLy9wcm9jZXNzUHJvcGVydGllcyhtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gKEludGVybmFsTWVzc2FnZSkgaW50ZXJuYWxFbmNvZGVyLnRvSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW50ZXJuYWxNZXNzYWdlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSB0b1NPQVBNZXNzYWdlKEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICBKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyIG1hcnNoYWxsZXIgPSBudWxsOwotICAgICAgICBib29sZWFuIHhvcEVuYWJsZWQgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0QXR0YWNobWVudHNNYXAobWVzc2FnZUluZm8sIGludGVybmFsTWVzc2FnZSk7Ci0gICAgICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYmFiID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigpOwotCi0gICAgICAgICAgICBpZiAobWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSkgPT0gIm9wdGltaXN0aWMiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlciA9IFhNTFN0cmVhbVdyaXRlckZhY3RvcnkuY3JlYXRlRklTdHJlYW1Xcml0ZXIoYmFiKTsKLQotICAgICAgICAgICAgICAgIC8vIFR1cm4gWE9QIG9mZiBmb3IgRkkKLSAgICAgICAgICAgICAgICBtYXJzaGFsbGVyID0gTWVzc2FnZUluZm9VdGlsLmdldEF0dGFjaG1lbnRNYXJzaGFsbGVyKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAobWFyc2hhbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhvcEVuYWJsZWQgPSBtYXJzaGFsbGVyLmlzWE9QUGFja2FnZSgpOyAgICAgLy8gbGFzdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBtYXJzaGFsbGVyLnNldFhPUFBhY2thZ2UoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9yZSBvdXRwdXQgc3RyZWFtIHRvIHVzZSBpbiBKQVhCIGJyaWRnZSAobm90IHdpdGggRkkpCi0gICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0TWV0YURhdGEoSkFYQl9PVVRQVVRTVFJFQU0sIGJhYik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyID0gWE1MU3RyZWFtV3JpdGVyRmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoYmFiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnREb2N1bWVudCgpOwotICAgICAgICAgICAgc3RhcnRFbnZlbG9wZSh3cml0ZXIpOwotICAgICAgICAgICAgd3JpdGVFbnZlbG9wZU5hbWVzcGFjZXMod3JpdGVyLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBpZiAoIXNraXBIZWFkZXIobWVzc2FnZUluZm8pKQotICAgICAgICAgICAgICAgIHdyaXRlSGVhZGVycyh3cml0ZXIsIGludGVybmFsTWVzc2FnZSwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgd3JpdGVCb2R5KHdyaXRlciwgaW50ZXJuYWxNZXNzYWdlLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBlbmRFbnZlbG9wZSh3cml0ZXIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBDb3B5IHRoZSBtaW1lIGhlYWRlcnMgZnJvbSBtZXNzYWdlSW5mby5NRVRBREFUQQotICAgICAgICAgICAgTWltZUhlYWRlcnMgbWggPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIG1oLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgZ2V0Q29udGVudFR5cGUobWVzc2FnZUluZm8sIG1hcnNoYWxsZXIpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBTT0FQVXRpbC5jcmVhdGVNZXNzYWdlKG1oLCBiYWIubmV3SW5wdXRTdHJlYW0oKSwgZ2V0QmluZGluZ0lkKCkpOwotICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnRzKGludGVybmFsTWVzc2FnZSwgbWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlc3RvcmUgZGVmYXVsdCBYT1AgcHJvY2Vzc2luZyBiZWZvcmUgcmV0dXJuaW5nCi0gICAgICAgICAgICBpZiAobWFyc2hhbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRYT1BQYWNrYWdlKHhvcEVuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VuZGVyRXhjZXB0aW9uKCJzZW5kZXIucmVxdWVzdC5tZXNzYWdlTm90UmVhZHkiLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VuZGVyRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlbmRlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlbmRlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZXJuYWxNZXNzYWdlIGNyZWF0ZUludGVybmFsTWVzc2FnZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotCi0gICAgICAgIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UgPSBuZXcgSW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgIE9iamVjdCByZXNwb25zZSA9IG1lc3NhZ2VJbmZvLmdldFJlc3BvbnNlKCk7Ci0KLSAgICAgICAgQm9keUJsb2NrIGJvZHlCbG9jayA9IG51bGw7Ci0gICAgICAgIGlmIChnZXRKQVhCQ29udGV4dChtZXNzYWdlSW5mbykgIT0gbnVsbCkgewotICAgICAgICAgICAgSkFYQkJlYW5JbmZvIGpheGJCZWFuID0gbmV3IEpBWEJCZWFuSW5mbyhyZXNwb25zZSwgZ2V0SkFYQkNvbnRleHQobWVzc2FnZUluZm8pKTsKLSAgICAgICAgICAgIGJvZHlCbG9jayA9IG5ldyBCb2R5QmxvY2soamF4YkJlYW4pOwotICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgU291cmNlKSB7Ci0gICAgICAgICAgICBib2R5QmxvY2sgPSBuZXcgQm9keUJsb2NrKChTb3VyY2UpIHJlc3BvbnNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsTWVzc2FnZS5zZXRCb2R5KGJvZHlCbG9jayk7Ci0gICAgICAgIHJldHVybiBpbnRlcm5hbE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIgbWFyc2hhbGxlcikgewotICAgICAgICBTdHJpbmcgY29udGVudE5lZ290aWF0aW9uID0gKFN0cmluZykKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSk7Ci0KLSAgICAgICAgaWYgKG1hcnNoYWxsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbWFyc2hhbGxlciA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRBdHRhY2htZW50TWFyc2hhbGxlcihtZXNzYWdlSW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWFyc2hhbGxlciAhPSBudWxsICYmIG1hcnNoYWxsZXIuaXNYb3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIFhPUF9TT0FQMTFfWE1MX1RZUEVfVkFMVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKGNvbnRlbnROZWdvdGlhdGlvbiA9PSAib3B0aW1pc3RpYyIpID8KLSAgICAgICAgICAgICAgICBGQVNUX0lORk9TRVRfVFlQRV9TT0FQMTEgOiBYTUxfQ09OVEVOVF9UWVBFX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIFNPQVBNZXNzYWdlICgxLjEgb3IgMS4yIHVzaW5nIFNBQUogYXBpKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIEJpbmRpbmdJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbmNvZGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCaW5kaW5nSWQoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9BdHRhY2htZW50QmxvY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvaW50ZXJuYWwvQXR0YWNobWVudEJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MWYyY2EuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9BdHRhY2htZW50QmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai51dGlsLkJ5dGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5KQVhCQnJpZGdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNlcmlhbGl6YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQVNDSUlVdGlsaXR5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOwotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLS8qKgotICogQXR0YWNobWVudCBvZiB7QGxpbmsgSW50ZXJuYWxNZXNzYWdlfS4KLSAqCi0gKiA8cD4KLSAqIFRoZSBrZXkgaWRlYSBiZWhpbmQgdGhpcyBjbGFzcyBpcyB0byBoaWRlIHRoZSBhY3R1YWwgZGF0YSByZXByZXNlbnRhdGlvbi4KLSAqIFRoZSBwcm9kdWNlciBvZiB0aGUgb2JqZWN0IG1heSBjaG9vc2UgdGhlIGJlc3QgZm9ybWF0IGl0IHdhbnRzLCBhbmQgdGhlbgotICogdmFyaW91cyBhY2Nlc3NvciBtZXRob2RzIHByb3ZpZGUgdGhlIHJlc3Qgb2YgdGhlIHN0YWNrIHRvIGNob3NlIHRoZSBmb3JtYXQKLSAqIGl0IHdhbnRzLgotICoKLSAqIDxwPgotICogV2hlbiByZWNlaXZpbmcgZnJvbSBhIG5ldHdvcmssIHRoaXMgYWxsb3dzIGFuIHtAbGluayBBdHRhY2htZW50QmxvY2t9IG9iamVjdAotICogdG8gYmUgY29uc3RydWN0ZWQgd2l0aG91dCBhY3R1YWxseSBldmVuIHBhcnNpbmcgdGhlIGF0dGFjaG1lbnQuIFdoZW4KLSAqIHNlbmRpbmcgdG8gYSBuZXR3b3JrLCB0aGlzIGFsbG93cyB0aGUgY29udmVyc2lvbiB0byB0aGUgYnl0ZSBpbWFnZSB0byBoYXBwZW4KLSAqIGxhemlseSwgYW5kIGRpcmVjdGx5IHRvIHRoZSBuZXR3b3JrLgotICoKLSAqIDxwPgotICogRXZlbiB0aG91Z2ggbW9zdCBvZiB0aGUgZGF0YSBhY2Nlc3MgbWV0aG9kcyBoYXZlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzc2VzIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoZW0KLSAqIHNvIHRoYXQgdGhleSBjYW4gcnVuIGZhc3Rlciwgd2hlbmV2ZXIgcG9zc2libGUuIEluIHBhcnRpY3VsYXIsIHRoZSBkZWZhdWx0Ci0gKiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI2FzSW5wdXRTdHJlYW0oKX0gYW5kIHtAbGluayAjd3JpdGVUbyhPdXRwdXRTdHJlYW0pfQotICogaGFzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gYXQgbGVhc3Qgb25lIG11c3QgYmUgb3ZlcnJpZGRlbi4KLSAqCi0gKiBUT0RPOgotICogICBpbiB0aGUgcGVyZm9ybWFuY2UgY3JpdGljYWwgcGF0aCBvZiBtYXBwaW5nIGFuIGF0dGFjaG1lbnQgdG8gYSBKYXZhIHR5cGUsCi0gKiAgIG1vc3Qgb2YgdGhlIHR5cGUgdGhlIEphdmEgdHlwZSB0byB3aGljaCBpdCBiaW5kcyB0byBpcyBrbm93biBpbiBhZHZhbmNlLgotICogICBmb3IgdGhpcyByZWFzb24sIGl0J3MgYmV0dGVyIHRvIHByZXBhcmUgYW4gJ2FjY2Vzc29yJyBvYmplY3QgZm9yIGVhY2gKLSAqICAga2luZCBvZiBjb252ZXJzaW9uLiBJbiB0aGF0IHdheSB3ZSBjYW4gYXZvaWQgdGhlIGNvbXB1dGF0aW9uIG9mIHRoaXMKLSAqICAgaW4gdGhlIHByaXRpY2FsIHBhdGgsIHdoaWNoIGlzIHJlZHVuZGFudC4KLSAqCi0gKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdHRhY2htZW50QmxvY2sgewotCi0gICAgcHVibGljIHN0YXRpYyBBdHRhY2htZW50QmxvY2sgZnJvbURhdGFIYW5kbGVyKFN0cmluZyBjaWQsRGF0YUhhbmRsZXIgZGgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlckltcGwoY2lkLGRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF0dGFjaG1lbnRCbG9jayBmcm9tU0FBSihBdHRhY2htZW50UGFydCBwYXJ0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgU0FBSkltcGwocGFydCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBdHRhY2htZW50QmxvY2sgZnJvbUJ5dGVBcnJheShTdHJpbmcgY2lkLGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnQsIGludCBsZW4sIFN0cmluZyBtaW1lVHlwZSApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbXBsKGNpZCxkYXRhLHN0YXJ0LGxlbixtaW1lVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBdHRhY2htZW50QmxvY2sgZnJvbUJ5dGVBcnJheShTdHJpbmcgY2lkLGJ5dGVbXSBkYXRhLCBTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbXBsKGNpZCxkYXRhLDAsZGF0YS5sZW5ndGgsbWltZVR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXR0YWNobWVudEJsb2NrIGZyb21KQVhCKFN0cmluZyBjaWQsIEpBWEJCcmlkZ2VJbmZvIGJyaWRnZUluZm8sIFJ1bnRpbWVDb250ZXh0IHJ0Q29udGV4dCwgU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkltcGwoY2lkLGJyaWRnZUluZm8scnRDb250ZXh0LG1pbWVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBObyBkZXJpdmVkIGNsYXNzIG91dHNpZGUgdGhpcyBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEF0dGFjaG1lbnRCbG9jaygpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDb250ZW50IElEIG9mIHRoZSBhdHRhY2htZW50LiBVbmlxdWVseSBpZGVudGlmaWVzIGFuIGF0dGFjaG1lbnQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgV1NETCBwYXJ0IG5hbWUgb2YgdGhpcyBhdHRhY2htZW50LgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogQWNjb3JkaW5nIHRvIFdTSSBBUCAxLjAKLSAgICAgKiA8UFJFPgotICAgICAqIDMuOCBWYWx1ZS1zcGFjZSBvZiBDb250ZW50LUlkIEhlYWRlcgotICAgICAqICAgRGVmaW5pdGlvbjogY29udGVudC1pZCBwYXJ0IGVuY29kaW5nCi0gICAgICogICBUaGUgImNvbnRlbnQtaWQgcGFydCBlbmNvZGluZyIgY29uc2lzdHMgb2YgdGhlIGNvbmNhdGVuYXRpb24gb2Y6Ci0gICAgICogVGhlIHZhbHVlIG9mIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgd3NkbDpwYXJ0IGVsZW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgbWltZTpjb250ZW50LCBpbiB3aGljaCBjaGFyYWN0ZXJzIGRpc2FsbG93ZWQgaW4gY29udGVudC1pZCBoZWFkZXJzIChub24tQVNDSUkgY2hhcmFjdGVycyBhcyByZXByZXNlbnRlZCBieSBjb2RlIHBvaW50cyBhYm92ZSAweDdGKSBhcmUgZXNjYXBlZCBhcyBmb2xsb3dzOgotICAgICAqICAgICBvIEVhY2ggZGlzYWxsb3dlZCBjaGFyYWN0ZXIgaXMgY29udmVydGVkIHRvIFVURi04IGFzIG9uZSBvciBtb3JlIGJ5dGVzLgotICAgICAqICAgICBvIEFueSBieXRlcyBjb3JyZXNwb25kaW5nIHRvIGEgZGlzYWxsb3dlZCBjaGFyYWN0ZXIgYXJlIGVzY2FwZWQgd2l0aCB0aGUgVVJJIGVzY2FwaW5nIG1lY2hhbmlzbSAodGhhdCBpcywgY29udmVydGVkIHRvICVISCwgd2hlcmUgSEggaXMgdGhlIGhleGFkZWNpbWFsIG5vdGF0aW9uIG9mIHRoZSBieXRlIHZhbHVlKS4KLSAgICAgKiAgICAgbyBUaGUgb3JpZ2luYWwgY2hhcmFjdGVyIGlzIHJlcGxhY2VkIGJ5IHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyIHNlcXVlbmNlLgotICAgICAqIFRoZSBjaGFyYWN0ZXIgJz0nICgweDNEKS4KLSAgICAgKiBBIGdsb2JhbGx5IHVuaXF1ZSB2YWx1ZSBzdWNoIGFzIGEgVVVJRC4KLSAgICAgKiBUaGUgY2hhcmFjdGVyICdAJyAoMHg0MCkuCi0gICAgICogQSB2YWxpZCBkb21haW4gbmFtZSB1bmRlciB0aGUgYXV0aG9yaXR5IG9mIHRoZSBlbnRpdHkgY29uc3RydWN0aW5nIHRoZSBtZXNzYWdlLgotICAgICAqIDwvUFJFPgotICAgICAqCi0gICAgICogU28gYSB3c2RsOnBhcnQgZm9vUGFydCB3aWxsIGJlIGVuY29kZWQgYXM6Ci0gICAgICogICAgICA8Zm9vUGFydD1zb21lcmVhbGx5YmlnbnVtYmVybGlrZWF1dWlkQGV4YW1wbGUuY29tPgotICAgICAqCi0gICAgICogQHJldHVybiBudWxsCi0gICAgICogICAgICBpZiB0aGUgcGFyc2luZyBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFdTRExQYXJ0TmFtZSgpewotICAgICAgICBTdHJpbmcgY0lkID0gZ2V0SWQoKTsKLQotICAgICAgICBpbnQgaW5kZXggPSBjSWQubGFzdEluZGV4T2YoJ0AnLCBjSWQubGVuZ3RoKCkpOwotICAgICAgICBpZihpbmRleCA9PSAtMSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gY0lkLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgIGluZGV4ID0gbG9jYWxQYXJ0Lmxhc3RJbmRleE9mKCc9JywgbG9jYWxQYXJ0Lmxlbmd0aCgpKTsKLSAgICAgICAgaWYoaW5kZXggPT0gLTEpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLm5ldC5VUkxEZWNvZGVyLmRlY29kZShsb2NhbFBhcnQuc3Vic3RyaW5nKDAsIGluZGV4KSwgIlVURi04Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBNSU1FIGNvbnRlbnQtdHlwZSBvZiB0aGlzIGF0dGFjaG1lbnQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXR0YWNobWVudCBhcyBhbiBleGFjdC1sZW5ndGggYnl0ZSBhcnJheS4KLSAgICAgKi8KLSAgICAvLyBub3Qgc28gZmFzdCBidXQgdXNlZnVsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICBwdWJsaWMgYnl0ZVtdIGFzQnl0ZUFycmF5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEFTQ0lJVXRpbGl0eS5nZXRCeXRlcyhhc0lucHV0U3RyZWFtKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGF0dGFjaG1lbnQgYXMgYSB7QGxpbmsgRGF0YUhhbmRsZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBEYXRhSGFuZGxlciBhc0RhdGFIYW5kbGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhdHRhY2htZW50IGFzIGEge0BsaW5rIFNvdXJjZX0uCi0gICAgICogTm90ZSB0aGF0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgYWN0dWFsbHkgYW4gWE1MLgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgYXNTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKGFzSW5wdXRTdHJlYW0oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT2J0YWlucyB0aGlzIGF0dGFjaG1lbnQgYXMgYW4ge0BsaW5rIElucHV0U3RyZWFtfS4KLSAgICAgKi8KLSAgICAvLyBub3Qtc28tZWZmaWNpZW50IGJ1dCB1c2VmdWwgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gYXNJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgQnl0ZU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZU91dHB1dFN0cmVhbSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVUbyhib3MpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYm9zLm5ld0lucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzZXJpYWxpemVzIHRoaXMgYXR0YWNobWVudCBieSB1c2luZyBKQVhCIGludG8ge0BsaW5rIEpBWEJCcmlkZ2VJbmZvfS4KLSAgICAgKgotICAgICAqIFRPRE86IHRoaXMgYWJzdHJhY3Rpb24gaXMgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVzZXJpYWxpemUoQnJpZGdlQ29udGV4dCBiYywgSkFYQkJyaWRnZUluZm8gYmkpIHsKLSAgICAgICAgYmkuZGVzZXJpYWxpemUoYXNJbnB1dFN0cmVhbSgpLGJjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoaXMgYXR0YWNobWVudCBhcyBhbiB7QGxpbmsgQXR0YWNobWVudFBhcnR9IGludG8gdGhlIGdpdmVuIHtAbGluayBTT0FQTWVzc2FnZX0uCi0gICAgICovCi0gICAgLy8gbm90IHNvIGZhc3QgYnV0IHVzZWZ1bCBkZWZhdWx0Ci0gICAgcHVibGljIHZvaWQgYWRkVG8oU09BUE1lc3NhZ2UgbXNnKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IHBhcnQgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQoYXNEYXRhSGFuZGxlcigpKTsKLSAgICAgICAgcGFydC5zZXRDb250ZW50SWQoZ2V0SWQoKSk7Ci0gICAgICAgIC8vaXQgbWF5IGJlIHNhZmUgdG8gc2F5IHRoZSBlbmNvZGluZyBpcyBiaW5hcnkgbWVhbmluZyB0aGUgYnl0ZXMgYXJlIG5vdCBzdWJqZWN0ZWQgYW55Ci0gICAgICAgIC8vc3BlY2lmaWMgZW5jb2RpbmcuCi0gICAgICAgIHBhcnQuc2V0TWltZUhlYWRlcigiQ29udGVudC10cmFuc2Zlci1lbmNvZGluZyIsICJiaW5hcnkiKTsKLSAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KHBhcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgY29udGVudHMgb2YgdGhlIGF0dGFjaG1lbnQgaW50byB0aGUgZ2l2ZW4gc3RyZWFtLgotICAgICAqLwotICAgIC8vIG5vdCBzbyBmYXN0IGJ1dCB1c2VmdWwgZGVmYXVsdAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBBU0NJSVV0aWxpdHkuY29weVN0cmVhbShhc0lucHV0U3RyZWFtKCksb3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlc2VyaWFsaXplcyB0aGlzIGF0dGFjaG1lbnQgaW50byBhbiB7QGxpbmsgSW1hZ2V9LgotICAgICAqCi0gICAgICogQHJldHVybiBudWxsIGlmIHRoZSBkZWNvZGluZyBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSW1hZ2UgYXNJbWFnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRlY2huaWNhbGx5IHdlIHNob3VsZCBjaGVjayB0aGUgTUlNRSB0eXBlIGhlcmUsIGJ1dAotICAgICAgICAvLyBub3JtYWxseSBpbWFnZXMgY2FuIGJlIGNvbnRlbnQtc25pZmZlZC4KLSAgICAgICAgLy8gc28gdGhlIE1JTUUgdHlwZSBjaGVjayB3aWxsIG9ubHkgbWFrZSB1cyBzbG93ZXIgYW5kIGRyYWNvbmlhbiwgYm90aCBvZiB3aGljaAotICAgICAgICAvLyBKQVhCIDIuMCBpc24ndCBpbnRlcmVzdGVkLgotICAgICAgICByZXR1cm4gSW1hZ2VJTy5yZWFkKGFzSW5wdXRTdHJlYW0oKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB7QGxpbmsgQXR0YWNobWVudEJsb2NrfSBzdG9yZWQgYXMgU0FBSiB7QGxpbmsgQXR0YWNobWVudFBhcnR9LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNBQUpJbXBsIGV4dGVuZHMgQXR0YWNobWVudEJsb2NrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdHRhY2htZW50UGFydCBhcDsKLQotICAgICAgICBwdWJsaWMgU0FBSkltcGwoQXR0YWNobWVudFBhcnQgcGFydCkgewotICAgICAgICAgICAgdGhpcy5hcCA9IHBhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIGFwLmdldENvbnRlbnRJZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBhcC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJ5dGVbXSBhc0J5dGVBcnJheSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFwLmdldFJhd0NvbnRlbnRCeXRlcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGF0YUhhbmRsZXIgYXNEYXRhSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFwLmdldERhdGFIYW5kbGVyKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTb3VyY2UgYXNTb3VyY2UoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKGFwLmdldFJhd0NvbnRlbnQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBhc0lucHV0U3RyZWFtKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXAuZ2V0UmF3Q29udGVudCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUbyhTT0FQTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGxpbmsgQXR0YWNobWVudEJsb2NrfSBzdG9yZWQgYXMgYSB7QGxpbmsgRGF0YUhhbmRsZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERhdGFIYW5kbGVySW1wbCBleHRlbmRzIEF0dGFjaG1lbnRCbG9jayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNpZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEYXRhSGFuZGxlciBkaDsKLQotICAgICAgICBwdWJsaWMgRGF0YUhhbmRsZXJJbXBsKFN0cmluZyBjaWQsIERhdGFIYW5kbGVyIGRoKSB7Ci0gICAgICAgICAgICB0aGlzLmNpZCA9IGNpZDsKLSAgICAgICAgICAgIHRoaXMuZGggPSBkaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2lkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBkaC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERhdGFIYW5kbGVyIGFzRGF0YUhhbmRsZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gYXNJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRoLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBCeXRlQXJyYXlJbXBsIGV4dGVuZHMgQXR0YWNobWVudEJsb2NrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2lkOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBkYXRhOwotICAgICAgICBwcml2YXRlIGludCBzdGFydDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbGVuOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtaW1lVHlwZTsKLQotICAgICAgICBwdWJsaWMgQnl0ZUFycmF5SW1wbChTdHJpbmcgY2lkLCBieXRlW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuLCBTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMuY2lkID0gY2lkOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIHRoaXMubGVuID0gbGVuOwotICAgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1pbWVUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJ5dGVbXSBhc0J5dGVBcnJheSgpIHsKLSAgICAgICAgICAgIGlmKHN0YXJ0IT0wIHx8IGxlbiE9ZGF0YS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBvdXIgYnVmZmVyIGlzbid0IGV4YWN0LCBzd2l0Y2ggdG8gdGhlIGV4YWN0IG9uZQotICAgICAgICAgICAgICAgIGJ5dGVbXSBleGFjdCA9IG5ldyBieXRlW2xlbl07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLHN0YXJ0LGV4YWN0LDAsbGVuKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGV4YWN0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGF0YUhhbmRsZXIgYXNEYXRhSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoZGF0YSxzdGFydCxsZW4sZ2V0Q29udGVudFR5cGUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGFzSW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEsc3RhcnQsbGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFRvKFNPQVBNZXNzYWdlIG1zZykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgcGFydCA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydCgpOwotICAgICAgICAgICAgcGFydC5zZXRSYXdDb250ZW50Qnl0ZXMoZGF0YSxzdGFydCxsZW4sZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgICAgICAgICBwYXJ0LnNldENvbnRlbnRJZChnZXRJZCgpKTsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChwYXJ0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgb3Mud3JpdGUoZGF0YSxzdGFydCxsZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0BsaW5rIEF0dGFjaG1lbnRQYXJ0fSB0aGF0IHN0b3JlcyB0aGUgdmFsdWUgYXMgYSBKQVhCIG9iamVjdC4KLSAgICAgKgotICAgICAqIFRPRE86IGlmIGl0J3MgY29tbW9uIGZvciBhbiBhdHRhaGNobWVudCB0byBiZSB3cml0dGVuIG1vcmUgdGhhbiBvbmNlLAotICAgICAqIGl0J3MgYmV0dGVyIHRvIGNhY2hlIHRoZSBtYXJzaGFsbGVkIHJlc3VsdCwgYXMgaXQgaXMgZXhwZW5zaXZlIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBKQVhCSW1wbCBleHRlbmRzIEF0dGFjaG1lbnRCbG9jayBpbXBsZW1lbnRzIERhdGFTb3VyY2UgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKQVhCQnJpZGdlSW5mbyBicmlkZ2VJbmZvOwotICAgICAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVDb250ZXh0IHJ0Q29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKLQotICAgICAgICBwdWJsaWMgSkFYQkltcGwoU3RyaW5nIGlkLCBKQVhCQnJpZGdlSW5mbyBicmlkZ2VJbmZvLCBSdW50aW1lQ29udGV4dCBydENvbnRleHQsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgICAgICB0aGlzLmJyaWRnZUluZm8gPSBicmlkZ2VJbmZvOwotICAgICAgICAgICAgdGhpcy5ydENvbnRleHQgPSBydENvbnRleHQ7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEYXRhSGFuZGxlciBhc0RhdGFIYW5kbGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlcih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBhc0lucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykgewotICAgICAgICAgICAgYnJpZGdlSW5mby5zZXJpYWxpemUocnRDb250ZXh0LmdldEJyaWRnZUNvbnRleHQoKSxvcyxudWxsKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvaW50ZXJuYWwvQm9keUJsb2NrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2ludGVybmFsL0JvZHlCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTU0ODZmLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvaW50ZXJuYWwvQm9keUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCZWFuSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCcmlkZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuUnBjTGl0UGF5bG9hZDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVAxMkZhdWx0SW5mbzsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEJvZHlCbG9jayB7Ci0KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQotICAgIHB1YmxpYyBCb2R5QmxvY2soT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9keUJsb2NrKEpBWEJCZWFuSW5mbyBiZWFuSW5mbykgewotICAgICAgICB0aGlzLnZhbHVlID0gYmVhbkluZm87Ci0gICAgfQotCi0gICAgcHVibGljIEJvZHlCbG9jayhKQVhCQnJpZGdlSW5mbyBicmlkZ2VJbmZvKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSBicmlkZ2VJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBCb2R5QmxvY2soU291cmNlIHNvdXJjZSkgewotICAgICAgICBzZXRTb3VyY2Uoc291cmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9keUJsb2NrKFNPQVBGYXVsdEluZm8gZmF1bHRJbmZvKSB7Ci0gICAgICAgIHNldEZhdWx0SW5mbyhmYXVsdEluZm8pOwotICAgIH0KLQotICAgIHB1YmxpYyBCb2R5QmxvY2soUnBjTGl0UGF5bG9hZCBycGNMb2FkKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSBycGNMb2FkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSBzb3VyY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRJbmZvKFNPQVBGYXVsdEluZm8gZmF1bHRJbmZvKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSBmYXVsdEluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIHNvIG1hbnkgc2V0dGVyIHRvIHNldCB0byBhbiBPYmplY3QuIEp1c3Qgc2V0VmFsdWUgaXMgYWxsIHRoYXQgd2UgbmVlZD8KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvaW50ZXJuYWwvRGVsZWdhdGVCYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2ludGVybmFsL0RlbGVnYXRlQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWY4MWVlLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvaW50ZXJuYWwvRGVsZWdhdGVCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuRGVsZWdhdGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkRlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lbmNvZGluZy5FbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0LkNvbnRhY3RJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0LkNvbnRhY3RJbmZvTGlzdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5Db250YWN0SW5mb0xpc3RJdGVyYXRvcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5Db250ZXh0TWFwOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkNvbnRhY3RJbmZvQmFzZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQ29udGFjdEluZm9MaXN0SW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGVCYXNlIGltcGxlbWVudHMgRGVsZWdhdGUgewotICAgIHByb3RlY3RlZCBDb250YWN0SW5mb0xpc3QgY29udGFjdEluZm9MaXN0OwotICAgIHByb3RlY3RlZCBXU1NlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlOwotCi0gICAgcHVibGljIERlbGVnYXRlQmFzZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVsZWdhdGVCYXNlKENvbnRhY3RJbmZvTGlzdCBjb250YWN0SW5mb0xpc3QpIHsKLSAgICAgICAgdGhpcy5jb250YWN0SW5mb0xpc3QgPSBjb250YWN0SW5mb0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIERlbGVnYXRlQmFzZShDb250YWN0SW5mb0xpc3QgY2lsLCBXU1NlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlKSB7Ci0gICAgICAgdGhpcyhjaWwpOwotICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VTdHJ1Y3QgZ2V0TWVzc2FnZVN0cnVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlSW5mb0Jhc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kKE1lc3NhZ2VTdHJ1Y3QgbWVzc2FnZVN0cnVjdCkgewotICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbyA9IChNZXNzYWdlSW5mbykgbWVzc2FnZVN0cnVjdDsKLQotICAgICAgICAvLyBDb250YWN0SW5mb0xpc3RJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRhY3RJbmZvTGlzdC5pdGVyYXRvcigpOwotICAgICAgICBpZiAoIWNvbnRhY3RJbmZvTGlzdC5pdGVyYXRvcigpLmhhc05leHQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjYW4ndCBwaWNrdXAgbWVzc2FnZSBlbmNvZGVyL2RlY29kZXIsIG5vIENvbnRhY3RJbmZvISIpOwotCi0gICAgICAgIENvbnRleHRNYXAgcHJvcGVydGllcyA9IChDb250ZXh0TWFwKQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgIEJpbmRpbmdQcm92aWRlciBzdHViID0gKEJpbmRpbmdQcm92aWRlcilwcm9wZXJ0aWVzLmdldChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NMSUVOVF9IQU5ETEVfUFJPUEVSVFkpOwotCi0gICAgICAgIEJpbmRpbmdJbXBsIGJpID0gKEJpbmRpbmdJbXBsKXN0dWIuZ2V0QmluZGluZygpOwotICAgICAgICBTdHJpbmcgYmluZGluZ0lkID0gYmkuZ2V0QmluZGluZ0lkKCk7Ci0gICAgICAgIENvbnRhY3RJbmZvIGNvbnRhY3RJbmZvID0gZ2V0Q29udGFjdEluZm8oY29udGFjdEluZm9MaXN0LCBiaW5kaW5nSWQpOwotCi0gICAgICAgIG1lc3NhZ2VJbmZvLnNldEVQVEZhY3RvcnkoY29udGFjdEluZm8pOwotICAgICAgICBNZXNzYWdlRGlzcGF0Y2hlciBtZXNzYWdlRGlzcGF0Y2hlciA9IGNvbnRhY3RJbmZvLmdldE1lc3NhZ2VEaXNwYXRjaGVyKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgbWVzc2FnZURpc3BhdGNoZXIuc2VuZChtZXNzYWdlSW5mbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250YWN0SW5mbyBnZXRDb250YWN0SW5mbyhDb250YWN0SW5mb0xpc3QgY2lsLCBTdHJpbmcgYmluZGluZ0lkKXsKLSAgICAgICAgQ29udGFjdEluZm9MaXN0SXRlcmF0b3IgaXRlciA9IGNpbC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBDb250YWN0SW5mb0Jhc2UgY2liID0gKENvbnRhY3RJbmZvQmFzZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmKGNpYi5nZXRCaW5kaW5nSWQoKS5lcXVhbHMoYmluZGluZ0lkKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gY2liOwotICAgICAgICB9Ci0gICAgICAgIC8vcmV0dXJuIHRoZSBmaXJzdCBvbmUKLSAgICAgICAgcmV0dXJuIGNpbC5pdGVyYXRvcigpLm5leHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2ludGVybmFsL0hlYWRlckJsb2NrLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2ludGVybmFsL0hlYWRlckJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjRmN2EuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9IZWFkZXJCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQkJyaWRnZUluZm87Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEhlYWRlckJsb2NrIHsKLQotICAgIHByaXZhdGUgSkFYQkJyaWRnZUluZm8gdmFsdWU7Ci0KLSAgICBwdWJsaWMgSGVhZGVyQmxvY2soSkFYQkJyaWRnZUluZm8gYnJpZGdlSW5mbykgewotICAgICAgICB0aGlzLnZhbHVlID0gYnJpZGdlSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5nZXROYW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9JbnRlcm5hbE1lc3NhZ2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvaW50ZXJuYWwvSW50ZXJuYWxNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZWVlZTguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9JbnRlcm5hbE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBTT0FQIG1lc3NhZ2Ugd2l0aCBoZWFkZXJzLCBhIGJvZHksIGFuZCBhdHRhY2htZW50cy4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsTWVzc2FnZSB7Ci0gICAgcHJpdmF0ZSBMaXN0PEhlYWRlckJsb2NrPiBoZWFkZXJzOwotICAgIHByaXZhdGUgU2V0PFFOYW1lPiBoZWFkZXJTZXQ7Ci0gICAgcHJpdmF0ZSBCb2R5QmxvY2sgYm9keTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsQXR0YWNobWVudEJsb2NrPiBhdHRhY2htZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXR0YWNobWVudEJsb2NrPigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Qm9keUJsb2NrPC9jb2RlPiBmb3IgdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIEJvZHlCbG9jayBnZXRCb2R5KCkgewotICAgICAgICByZXR1cm4gYm9keTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2spIHsKLSAgICAgICAgaWYgKGhlYWRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8SGVhZGVyQmxvY2s+KCk7Ci0gICAgICAgICAgICBoZWFkZXJTZXQgPSBuZXcgSGFzaFNldDxRTmFtZT4oKTsKLSAgICAgICAgfQotICAgICAgICBoZWFkZXJzLmFkZChoZWFkZXJCbG9jayk7Ci0gICAgICAgIGhlYWRlclNldC5hZGQoaGVhZGVyQmxvY2suZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrcyBpZiBhIGhlYWRlciBpcyBhbHJlYWR5IHByZXNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRlclByZXNlbnQoUU5hbWUgbmFtZSkgewotICAgICAgICBpZiAoaGVhZGVyU2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyU2V0LmNvbnRhaW5zKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiA8Y29kZT5IZWFkZXJCbG9ja3M8L2NvZGUgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SGVhZGVyQmxvY2s+IGdldEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBoZWFkZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBib2R5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Qm9keShCb2R5QmxvY2sgYm9keSkgewotICAgICAgICB0aGlzLmJvZHkgPSBib2R5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEF0dGFjaG1lbnQoQXR0YWNobWVudEJsb2NrIGF0dGFjaG1lbnQpewotICAgICAgICBhdHRhY2htZW50cy5wdXQoYXR0YWNobWVudC5nZXRJZCgpLGF0dGFjaG1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBdHRhY2htZW50QmxvY2sgZ2V0QXR0YWNobWVudChTdHJpbmcgY29udGVudElkKXsKLSAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzLmdldChjb250ZW50SWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5NYXA8L2NvZGU+IG9mIGNvbnRlbnRJZHMgdG8gYXR0YWNobWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgQXR0YWNobWVudEJsb2NrPiBnZXRBdHRhY2htZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9NZXNzYWdlQmxvY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvaW50ZXJuYWwvTWVzc2FnZUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjYzM2EuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9NZXNzYWdlQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUJsb2NrIHsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgX25hbWU7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBfdmFsdWU7Ci0KLSAgICBwdWJsaWMgTWVzc2FnZUJsb2NrKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlQmxvY2soUU5hbWUgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VCbG9jayhRTmFtZSBuYW1lKSB7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGJsb2NrCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIF92YWx1ZSA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+UU5hbWU8L2NvZGU+IG9mIHRoaXMgYmxvY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShRTmFtZSBuYW1lKSB7Ci0gICAgICAgIF9uYW1lID0gbmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2ludGVybmFsL01lc3NhZ2VJbmZvQmFzZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9NZXNzYWdlSW5mb0Jhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyOGIzZi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL2ludGVybmFsL01lc3NhZ2VJbmZvQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZW5jb2RpbmcuRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuRVBURmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldTQ29ubmVjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VJbmZvQmFzZSBpbXBsZW1lbnRzIE1lc3NhZ2VJbmZvIHsKLQotICAgIHByb3RlY3RlZCBPYmplY3RbXSBfZGF0YTsKLSAgICBwcm90ZWN0ZWQgTWV0aG9kIF9tZXRob2Q7Ci0gICAgcHJvdGVjdGVkIE1hcCBfbWV0YWRhdGE7Ci0gICAgcHJvdGVjdGVkIGludCBfbWVzc2FnZVBhdHRlcm47Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBfcmVzcG9uc2U7Ci0gICAgcHJvdGVjdGVkIGludCBfcmVzcG9uc2VUeXBlOwotICAgIHByb3RlY3RlZCBFUFRGYWN0b3J5IF9lcHRGYWN0b3J5OwotICAgIHByb3RlY3RlZCBNZXNzYWdlRGlzcGF0Y2hlciBfbWVzc2FnZURpc3BhdGNoZXI7Ci0gICAgcHJvdGVjdGVkIEVuY29kZXIgX2VuY29kZXI7Ci0gICAgcHJvdGVjdGVkIERlY29kZXIgX2RlY29kZXI7Ci0gICAgcHJvdGVjdGVkIFdTQ29ubmVjdGlvbiBfY29ubmVjdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGEoT2JqZWN0W10gZGF0YSkgewotICAgICAgICBfZGF0YSA9IGRhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldERhdGEoKSB7Ci0gICAgICAgIHJldHVybiBfZGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBfbWV0aG9kID0gbWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgewotICAgICAgICByZXR1cm4gX21ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChfbWV0YWRhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgX21ldGFkYXRhID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgX21ldGFkYXRhLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXRhRGF0YShPYmplY3QgbmFtZSkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotCi0gICAgICAgIGlmICgobmFtZSAhPSBudWxsKSAmJiAoX21ldGFkYXRhICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgdmFsdWUgPSBfbWV0YWRhdGEuZ2V0KG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1FUCgpIHsKLSAgICAgICAgcmV0dXJuIF9tZXNzYWdlUGF0dGVybjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNRVAoaW50IG1lc3NhZ2VQYXR0ZXJuKSB7Ci0gICAgICAgIF9tZXNzYWdlUGF0dGVybiA9IG1lc3NhZ2VQYXR0ZXJuOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UmVzcG9uc2VUeXBlKCkgewotICAgICAgICByZXR1cm4gX3Jlc3BvbnNlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZVR5cGUoaW50IHJlc3BvbnNlVHlwZSkgewotICAgICAgICBfcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzcG9uc2UoKSB7Ci0gICAgICAgIHJldHVybiBfcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2UoT2JqZWN0IHJlc3BvbnNlKSB7Ci0gICAgICAgIF9yZXNwb25zZSA9IHJlc3BvbnNlOwotICAgIH0KLQotICAgIHB1YmxpYyBFUFRGYWN0b3J5IGdldEVQVEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBfZXB0RmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFUFRGYWN0b3J5KEVQVEZhY3RvcnkgZXB0RmFjdG9yeSkgewotICAgICAgICBfZXB0RmFjdG9yeSA9IGVwdEZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIE1lc3NhZ2VJbmZvI2dldE1lc3NhZ2VEaXNwYXRjaGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZURpc3BhdGNoZXIgZ2V0TWVzc2FnZURpc3BhdGNoZXIoKSB7Ci0gICAgICAgIHJldHVybiBfbWVzc2FnZURpc3BhdGNoZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIE1lc3NhZ2VJbmZvI2dldEVuY29kZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBFbmNvZGVyIGdldEVuY29kZXIoKSB7Ci0gICAgICAgIHJldHVybiBfZW5jb2RlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgTWVzc2FnZUluZm8jZ2V0RGVjb2RlcigpCi0gICAgICovCi0gICAgcHVibGljIERlY29kZXIgZ2V0RGVjb2RlcigpIHsKLSAgICAgICAgcmV0dXJuIF9kZWNvZGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBNZXNzYWdlSW5mbyNnZXRDb25uZWN0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBfY29ubmVjdGlvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgTWVzc2FnZUluZm8jc2V0TWVzc2FnZURpc3BhdGNoZXIoTWVzc2FnZURpc3BhdGNoZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZURpc3BhdGNoZXIoTWVzc2FnZURpc3BhdGNoZXIgYXJnMCkgewotICAgICAgICB0aGlzLl9tZXNzYWdlRGlzcGF0Y2hlciA9IGFyZzA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIE1lc3NhZ2VJbmZvI3NldEVuY29kZXIoRW5jb2RlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVyKEVuY29kZXIgZW5jb2RlcikgewotICAgICAgICB0aGlzLl9lbmNvZGVyID0gZW5jb2RlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgTWVzc2FnZUluZm8jc2V0RGVjb2RlcihEZWNvZGVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZXIoRGVjb2RlciBkZWNvZGVyKSB7Ci0gICAgICAgIHRoaXMuX2RlY29kZXIgPSBkZWNvZGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBNZXNzYWdlSW5mbyNzZXRDb25uZWN0aW9uKENvbm5lY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbihXU0Nvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICB0aGlzLl9jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VJbmZvIGNvcHkoTWVzc2FnZUluZm8gbWkpewotICAgICAgICBNZXNzYWdlSW5mb0Jhc2UgbWliID0gKE1lc3NhZ2VJbmZvQmFzZSltaTsKLSAgICAgICAgTWVzc2FnZUluZm9CYXNlIG5ld01pID0gbmV3IE1lc3NhZ2VJbmZvQmFzZSgpOwotICAgICAgICBpZihuZXdNaS5fZGF0YSAhPSBudWxsKXsKLSAgICAgICAgICAgIE9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0W21pYi5fZGF0YS5sZW5ndGhdOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yKE9iamVjdCBvIDogbWliLl9kYXRhKXsKLSAgICAgICAgICAgICAgICBkYXRhW2krK10gPSBvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV3TWkuX2RhdGEgPSBkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG5ld01pLnNldENvbm5lY3Rpb24obWkuZ2V0Q29ubmVjdGlvbigpKTsKLSAgICAgICAgbmV3TWkuc2V0TWV0aG9kKG1pLmdldE1ldGhvZCgpKTsKLSAgICAgICAgbmV3TWkuc2V0RGVjb2RlcihtaS5nZXREZWNvZGVyKCkpOwotICAgICAgICBuZXdNaS5zZXRFbmNvZGVyKG1pLmdldEVuY29kZXIoKSk7Ci0gICAgICAgIG5ld01pLnNldEVQVEZhY3RvcnkobWkuZ2V0RVBURmFjdG9yeSgpKTsKLSAgICAgICAgbmV3TWkuc2V0TUVQKG1pLmdldE1FUCgpKTsKLSAgICAgICAgbmV3TWkuX21lc3NhZ2VEaXNwYXRjaGVyID0gbWliLl9tZXNzYWdlRGlzcGF0Y2hlcjsKLSAgICAgICAgbmV3TWkuX21ldGFkYXRhID0gbmV3IEhhc2hNYXAobWliLl9tZXRhZGF0YSk7Ci0gICAgICAgIHJldHVybiAoTWVzc2FnZUluZm8pbmV3TWk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9TT0FQMTJOb3RVbmRlcnN0b29kSGVhZGVyQmxvY2suamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvaW50ZXJuYWwvU09BUDEyTm90VW5kZXJzdG9vZEhlYWRlckJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDE3NGYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9pbnRlcm5hbC9TT0FQMTJOb3RVbmRlcnN0b29kSGVhZGVyQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUE5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQMTJOYW1lc3BhY2VDb25zdGFudHM7Ci0KLS8qKgotICogU09BUCAxLjIgdmVyc2lvbiBvZiBOb3RVbmRlcnN0b29kSGVhZGVyQmxvY2suCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQMTJOb3RVbmRlcnN0b29kSGVhZGVyQmxvY2sgZXh0ZW5kcyBIZWFkZXJCbG9jayB7Ci0KLSAgICBwcml2YXRlIFFOYW1lIG51SGVhZGVyOwotCi0gICAgLy8gc3VwZXIobnVsbCkgaXMgYSBoYWNrIGluIHRoaXMgY2FzZQotICAgIHB1YmxpYyBTT0FQMTJOb3RVbmRlcnN0b29kSGVhZGVyQmxvY2soUU5hbWUgaGVhZGVyKSB7Ci0gICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICBudUhlYWRlciA9IGhlYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUsCi0gICAgICAgICAgICBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuVEFHX05PVF9VTkRFUlNUT09EKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gInQiOyAvLyBzaG91bGQgbm90IGhhdmUgYmVlbiB1c2VkIGJlZm9yZSA8aGVhZGVyPgotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KAotICAgICAgICAgICAgICAgIFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgICAgICBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuVEFHX05PVF9VTkRFUlNUT09ELAotICAgICAgICAgICAgICAgIFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLkFUVFJfTk9UX1VOREVSU1RPT0RfUU5BTUUsCi0gICAgICAgICAgICAgICAgcHJlZml4ICsgIjoiICsgbnVIZWFkZXIuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbnVIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9GYXVsdENvZGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9GYXVsdENvZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzNDJhYy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL21lc3NhZ2UvRmF1bHRDb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVAxMkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFNPQVAgMS4yIHNvYXBlbnY6Q29kZQotICoKLSAqIDxzb2FwZW52OkZhdWx0PgotICogIDxzb2FwZW52OkNvZGU+Ci0gKiAgICAgIDxzb2FwZW52OlZhbHVlPnNvYXBlbnY6U2VuZGVyPC9zb2FwZW52OlZhbHVlPgotICogICAgICA8c29hcGVudjpTdWJjb2RlPgotICogICAgICAgICAgPHNvYXBlbnY6VmFsdWU+bnMxOmluY29yZWN0UmVxdWVzdDwvVmFsdWU+Ci0gKiAgICAgICAgICA8c29hcGVudjpTdWJjb2RlPgotICogICAgICAgICAgLi4uCi0gKiAgICAgIDwvc29hcGVudjpTdWJjb2RlPgotICogIDwvc29hcGVudjpDb2RlPgotICogPC9zb2FwZW52OkZhdWx0PgotICoKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKi8KLXB1YmxpYyBjbGFzcyBGYXVsdENvZGUgewotICAgIHByaXZhdGUgRmF1bHRDb2RlRW51bSB2YWx1ZTsKLSAgICBwcml2YXRlIEZhdWx0U3ViY29kZSBzdWJjb2RlOwotCi0gICAgcHVibGljIEZhdWx0Q29kZShGYXVsdENvZGVFbnVtIHZhbHVlLCBGYXVsdFN1YmNvZGUgc3ViY29kZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHRoaXMuc3ViY29kZSA9IHN1YmNvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIEZhdWx0Q29kZShGYXVsdENvZGVFbnVtIHZhbHVlLCBJdGVyYXRvcjxRTmFtZT4gc3ViY29kZXMpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICBpZihzdWJjb2Rlcy5oYXNOZXh0KCkpewotICAgICAgICAgICAgc3ViY29kZSA9IG5ldyBGYXVsdFN1YmNvZGUoc3ViY29kZXMubmV4dCgpLCBzdWJjb2Rlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRmF1bHRDb2RlRW51bSBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBGYXVsdFN1YmNvZGUgZ2V0U3ViY29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1YmNvZGU7Ci0gICAgfQotCi0gICAgdm9pZCB3cml0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gPHNvYXBlbnY6Q29kZT4KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9GQVVMVF9DT0RFLmdldExvY2FsUGFydCgpLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotCi0gICAgICAgIC8vIDxzb2FwZW52OlZhbHVlPgotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX1ZBTFVFLmdldExvY2FsUGFydCgpLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotCi0gICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnModmFsdWUuZ2V0UHJlZml4KCkrIjoiK3ZhbHVlLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyA8L3NvYXBlbnY6VmFsdWU+Ci0KLSAgICAgICAgLy8gPHNvYXBlbnY6U3ViY29kZT4uLi48L3NvYXBlbnY6U3ViY29kZT4KLSAgICAgICAgaWYoc3ViY29kZSAhPSBudWxsKQotICAgICAgICAgICAgc3ViY29kZS53cml0ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7IC8vIDwvc29hcGVudjpDb2RlPgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9GYXVsdENvZGVFbnVtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL21lc3NhZ2UvRmF1bHRDb2RlRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWIzMzFlLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9GYXVsdENvZGVFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQMTJOYW1lc3BhY2VDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUE5hbWVzcGFjZUNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBlbnVtIEZhdWx0Q29kZUVudW0gewotICAgIFZlcnNpb25NaXNtYXRjaChuZXcgUU5hbWUoU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLkVOVkVMT1BFLCAiVmVyc2lvbk1pc21hdGNoIiwgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFKSksCi0gICAgTXVzdFVuZGVyc3RhbmQobmV3IFFOYW1lKFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSwgIk11c3RVbmRlcnN0YW5kIiwgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFKSksCi0gICAgRGF0YUVuY29kaW5nVW5rbm93bihuZXcgUU5hbWUoU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLkVOVkVMT1BFLCAiRGF0YUVuY29kaW5nVW5rbm93biIsIFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSkpLAotICAgIFNlbmRlcihuZXcgUU5hbWUoU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLkVOVkVMT1BFLCAiU2VuZGVyIiwgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFKSksCi0gICAgUmVjZWl2ZXIobmV3IFFOYW1lKFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSwgIlJlY2VpdmVyIiwgU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFKSk7Ci0KLSAgICBwcml2YXRlIEZhdWx0Q29kZUVudW0oUU5hbWUgY29kZSl7Ci0gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIHZhbHVlKCl7Ci0gICAgICAgIHJldHVybiBjb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCl7Ci0gICAgICAgIHJldHVybiBjb2RlLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCl7Ci0gICAgICAgIHJldHVybiBjb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCl7Ci0gICAgICAgIHJldHVybiBjb2RlLmdldFByZWZpeCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmF1bHRDb2RlRW51bSBnZXQoUU5hbWUgc29hcEZhdWx0Q29kZSl7Ci0gICAgICAgIGlmKFZlcnNpb25NaXNtYXRjaC5jb2RlLmVxdWFscyhzb2FwRmF1bHRDb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBWZXJzaW9uTWlzbWF0Y2g7Ci0gICAgICAgIGVsc2UgaWYoTXVzdFVuZGVyc3RhbmQuY29kZS5lcXVhbHMoc29hcEZhdWx0Q29kZSkpCi0gICAgICAgICAgICByZXR1cm4gTXVzdFVuZGVyc3RhbmQ7Ci0gICAgICAgIGVsc2UgaWYoRGF0YUVuY29kaW5nVW5rbm93bi5jb2RlLmVxdWFscyhzb2FwRmF1bHRDb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBEYXRhRW5jb2RpbmdVbmtub3duOwotICAgICAgICBlbHNlIGlmKFNlbmRlci5jb2RlLmVxdWFscyhzb2FwRmF1bHRDb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBTZW5kZXI7Ci0gICAgICAgIGVsc2UgaWYoUmVjZWl2ZXIuY29kZS5lcXVhbHMoc29hcEZhdWx0Q29kZSkpCi0gICAgICAgICAgICByZXR1cm4gUmVjZWl2ZXI7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgUU5hbWUgY29kZTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9GYXVsdFJlYXNvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL0ZhdWx0UmVhc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmYzNjQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL0ZhdWx0UmVhc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVAxMkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogU09BUCAxLjIgRmF1bHQgUmVhc29uCi0gKiAgPHNvYXBlbnY6UmVhc29uPgotICogICAgICA8c29hcGVudjpUZXh0IHhtbDpsYW5nPSJlbiI+Li4uPC9zb2FwZW52OlRleHQ+Ci0gKiAgPC9zb2FwZW52OlJlYXNvbj4KLSAqCi0gKiBAYXV0aG9yIFZpdmVrIFBhbmRleQotICovCi1wdWJsaWMgY2xhc3MgRmF1bHRSZWFzb24gewotICAgIHByaXZhdGUgTGlzdDxGYXVsdFJlYXNvblRleHQ+IHRleHRzOwotCi0gICAgcHVibGljIEZhdWx0UmVhc29uKEZhdWx0UmVhc29uVGV4dC4uLiB0ZXh0cykgewotICAgICAgICBhc3NlcnQodGV4dHMgPT0gbnVsbCk7Ci0gICAgICAgIHRoaXMudGV4dHMgPSBBcnJheXMuYXNMaXN0KHRleHRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmF1bHRSZWFzb24oTGlzdDxGYXVsdFJlYXNvblRleHQ+IHRleHRMaXN0KSB7Ci0gICAgICAgIHRleHRzID0gdGV4dExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8RmF1bHRSZWFzb25UZXh0PiBnZXRGYXVsdFJlYXNvblRleHRzKCl7Ci0gICAgICAgIHJldHVybiB0ZXh0czsKLSAgICB9Ci0KLSAgICB2b2lkIHdyaXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX1JFQVNPTi5nZXRMb2NhbFBhcnQoKSwgU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLkVOVkVMT1BFKTsKLSAgICAgICAgZm9yKEZhdWx0UmVhc29uVGV4dCB0ZXh0OnRleHRzKXsKLSAgICAgICAgICAgIHRleHQud3JpdGUod3JpdGVyKTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL0ZhdWx0UmVhc29uVGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL0ZhdWx0UmVhc29uVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjI4Yzc2Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9GYXVsdFJlYXNvblRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZTsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiA8c29hcGVudjpUZXh0IHhtbG5zOmxhbmc9ImVuIj4KLSAqIC4uLgotICogPC9zb2FwZW52OlRleHQ+Ci0gKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqLwotcHVibGljIGNsYXNzIEZhdWx0UmVhc29uVGV4dCB7Ci0gICAgcHJpdmF0ZSBMb2NhbGUgbGFuZ3VhZ2UgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0gICAgcHVibGljIEZhdWx0UmVhc29uVGV4dChTdHJpbmcgdmFsdWUsIExvY2FsZSBsYW5nKSB7Ci0gICAgICAgIGlmKGxhbmd1YWdlICE9IG51bGwgJiYgIWxhbmd1YWdlLmVxdWFscygiIikpCi0gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZzsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhbGUgZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgdm9pZCB3cml0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuUU5BTUVfRkFVTFRfUkVBU09OX1RFWFQuZ2V0TG9jYWxQYXJ0KCksIFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0KLSAgICAgICAgLy9mb3Igbm93IHdlIG9ubHkgZ2VuZXJhdGUgImVuIiBsYW5ndWFnZQotICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoInhtbCIsIFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5YTUxfTlMsICJsYW5nIiwgbGFuZ3VhZ2UuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnModmFsdWUpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL0ZhdWx0U3ViY29kZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL0ZhdWx0U3ViY29kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWFjYTU5Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9GYXVsdFN1YmNvZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVAxMkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFNPQVAgMS4yIHNvYXBlbnY6Q29kZQotICoKLSAqIDxzb2FwZW52OkZhdWx0PgotICogIDxzb2FwZW52OkNvZGU+Ci0gKiAgICAgIDxzb2FwZW52OlZhbHVlPnNvYXBlbnY6U2VuZGVyPC9zb2FwZW52OlZhbHVlPgotICogICAgICA8c29hcGVudjpTdWJjb2RlPgotICogICAgICAgICAgPHNvYXBlbnY6VmFsdWU+bnMxOmluY29yZWN0UmVxdWVzdDwvVmFsdWU+Ci0gKiAgICAgICAgICA8c29hcGVudjpTdWJjb2RlPgotICogICAgICAgICAgLi4uCi0gKiAgICAgIDwvc29hcGVudjpTdWJjb2RlPgotICogIDwvc29hcGVudjpDb2RlPgotICogPC9zb2FwZW52OkZhdWx0PgotICoKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKi8KLXB1YmxpYyBjbGFzcyBGYXVsdFN1YmNvZGUgewotICAgIHByaXZhdGUgUU5hbWUgdmFsdWU7Ci0gICAgcHJpdmF0ZSBGYXVsdFN1YmNvZGUgc3ViY29kZTsKLQotICAgIHB1YmxpYyBGYXVsdFN1YmNvZGUoUU5hbWUgdmFsdWUsIEZhdWx0U3ViY29kZSBzdWJjb2RlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5zdWJjb2RlID0gc3ViY29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmF1bHRTdWJjb2RlKFFOYW1lIHZhbHVlLCBJdGVyYXRvcjxRTmFtZT4gc3ViY29kZXMpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICBpZihzdWJjb2Rlcy5oYXNOZXh0KCkpewotICAgICAgICAgICAgc3ViY29kZSA9IG5ldyBGYXVsdFN1YmNvZGUoc3ViY29kZXMubmV4dCgpLCBzdWJjb2Rlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmF1bHRTdWJjb2RlIGdldFN1YmNvZGUoKSB7Ci0gICAgICAgIHJldHVybiBzdWJjb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBGYXVsdFN1YmNvZGUgc2V0U3ViQ29kZShGYXVsdFN1YmNvZGUgc2MpewotICAgICAgICB0aGlzLnN1YmNvZGUgPSBzYzsKLSAgICAgICAgcmV0dXJuIHN1YmNvZGU7Ci0gICAgfQotCi0gICAgdm9pZCB3cml0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gPHNvYXBlbnY6U3ViY29kZT4KLSAgICAgICAgaWYodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9GQVVMVF9TVUJDT0RFLmdldExvY2FsUGFydCgpLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotCi0gICAgICAgIC8vIDxzb2FwZW52OlZhbHVlPgotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlFOQU1FX0ZBVUxUX1ZBTFVFLmdldExvY2FsUGFydCgpLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotCi0gICAgICAgIHdyaXRlci5zZXRQcmVmaXgodmFsdWUuZ2V0UHJlZml4KCksIHZhbHVlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgaWYodmFsdWUuZ2V0UHJlZml4KCkuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnModmFsdWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHZhbHVlLmdldFByZWZpeCgpKyI6Iit2YWx1ZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsgLy8gPC9zb2FwZW52OlZhbHVlPgotICAgICAgICBpZihzdWJjb2RlICE9IG51bGwpCi0gICAgICAgICAgICBzdWJjb2RlLndyaXRlKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsgLy8gPC9zb2FwZW52OlN1YmNvZGU+Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL1NPQVAxMkZhdWx0SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL1NPQVAxMkZhdWx0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGVjOGQzLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9TT0FQMTJGYXVsdEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZTsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5KQVhCQnJpZGdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJUeXBlU2VyaWFsaXplcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuU2VydmVyUnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLkRPTVN0cmVhbVJlYWRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNPQVBVdGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogU09BUCAxLjIgc29hcCBzb2FwRmF1bHQgaW5mbyBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgU09BUDEyRmF1bHRJbmZvIGV4dGVuZHMgU09BUEZhdWx0SW5mbyB7Ci0gICAgcHJpdmF0ZSBGYXVsdENvZGUgY29kZTsKLSAgICBwcml2YXRlIEZhdWx0UmVhc29uIHJlYXNvbjsKLSAgICBwcml2YXRlIFN0cmluZyBub2RlOwotICAgIHByaXZhdGUgU3RyaW5nIHJvbGU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgZGV0YWlsOwotCi0gICAgcHVibGljIFNPQVAxMkZhdWx0SW5mbyhGYXVsdENvZGUgY29kZSwgRmF1bHRSZWFzb24gcmVhc29uLCBTdHJpbmcgbm9kZSwgU3RyaW5nIHJvbGUsIE9iamVjdCBkZXRhaWwpIHsKLSAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKLSAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb247Ci0gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7Ci0gICAgICAgIHRoaXMuZGV0YWlsID0gZGV0YWlsOwotCi0gICAgICAgIHNvYXBGYXVsdCA9IFNPQVBVdGlsLmNyZWF0ZVNPQVBGYXVsdChTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpOwotICAgICAgICBzZXRGYXVsdENvZGUoKTsKLSAgICAgICAgc2V0RmF1bHRSZWFzb24oKTsKLSAgICAgICAgc2V0RmF1bHROb2RlKCk7Ci0gICAgICAgIHNldEZhdWx0Um9sZSgpOwotICAgICAgICBpZigoZGV0YWlsICE9IG51bGwpICYmIChkZXRhaWwgaW5zdGFuY2VvZiBEZXRhaWwpKXsKLSAgICAgICAgICAgIE5vZGUgbiA9IHNvYXBGYXVsdC5nZXRPd25lckRvY3VtZW50KCkuaW1wb3J0Tm9kZSgoRGV0YWlsKWRldGFpbCwgdHJ1ZSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYXBwZW5kQ2hpbGQobik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgZmF1bHRCZWFuID0gKGRldGFpbCAhPSBudWxsKT8oSkFYQkJyaWRnZUluZm8pZGV0YWlsOm51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUDEyRmF1bHRJbmZvKFNPQVBGYXVsdCBmYXVsdCkgewotICAgICAgICB0aGlzLnNvYXBGYXVsdCA9IGZhdWx0OwotCi0gICAgICAgIC8vZmF1bHQgY29kZQotICAgICAgICBRTmFtZSBmYyA9IHNvYXBGYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBzb2FwRmF1bHQuZ2V0RmF1bHRTdWJjb2RlcygpOwotICAgICAgICBjb2RlID0gbmV3IEZhdWx0Q29kZShGYXVsdENvZGVFbnVtLmdldChmYyksIGl0ZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL2ZhdWx0IHJlYXNvbgotICAgICAgICAgICAgTGlzdDxGYXVsdFJlYXNvblRleHQ+IHRleHRzID0gbmV3IEFycmF5TGlzdDxGYXVsdFJlYXNvblRleHQ+KCk7Ci0gICAgICAgICAgICBpdGVyID0gc29hcEZhdWx0LmdldEZhdWx0UmVhc29uTG9jYWxlcygpOwotICAgICAgICAgICAgd2hpbGUoaXRlci5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgIExvY2FsZSBsYW5nID0gKExvY2FsZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHNvYXBGYXVsdC5nZXRGYXVsdFJlYXNvblRleHQobGFuZyk7Ci0gICAgICAgICAgICAgICAgdGV4dHMuYWRkKG5ldyBGYXVsdFJlYXNvblRleHQodGV4dCwgbGFuZykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhc29uID0gbmV3IEZhdWx0UmVhc29uKHRleHRzKTsKLQotICAgICAgICAgICAgLy9ub2RlCi0gICAgICAgICAgICBub2RlID0gc29hcEZhdWx0LmdldEZhdWx0Tm9kZSgpOwotCi0gICAgICAgICAgICAvL3JvbGUKLSAgICAgICAgICAgIHJvbGUgPSBzb2FwRmF1bHQuZ2V0RmF1bHRSb2xlKCk7Ci0KLSAgICAgICAgICAgIC8vZGV0YWlsCi0gICAgICAgICAgICBkZXRhaWwgPSBzb2FwRmF1bHQuZ2V0RGV0YWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgY2F0Y2ggc3RhdGVtZW50IHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBGYXVsdENvZGUgZ2V0RmF1bHRDb2RlKCkgewotICAgICAgICByZXR1cm4gY29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmF1bHRSZWFzb24gZ2V0UmVhc29ucygpIHsKLSAgICAgICAgcmV0dXJuIHJlYXNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpIHsKLSAgICAgICAgcmV0dXJuIHJvbGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEZhdWx0Um9sZSgpIHsKLSAgICAgICAgaWYgKHNvYXBGYXVsdCA9PSBudWxsIHx8IHJvbGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdFJvbGUocm9sZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RmF1bHROb2RlKCkgewotICAgICAgICBpZiAoc29hcEZhdWx0ID09IG51bGwgfHwgbm9kZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0Tm9kZShub2RlKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRGYXVsdFJlYXNvbigpIHsKLSAgICAgICAgaWYgKHNvYXBGYXVsdCA9PSBudWxsIHx8IHJlYXNvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBMaXN0PEZhdWx0UmVhc29uVGV4dD4gdGV4dHMgPSByZWFzb24uZ2V0RmF1bHRSZWFzb25UZXh0cygpOwotICAgICAgICBmb3IgKEZhdWx0UmVhc29uVGV4dCB0ZXh0IDogdGV4dHMpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dCh0ZXh0LmdldFZhbHVlKCksIHRleHQuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBTT0FQIDEuMiBGYXVsdCBDb2RlL1N1YmNvZGVzIHRvIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRGYXVsdENvZGUoKSB7Ci0gICAgICAgIGlmIChzb2FwRmF1bHQgPT0gbnVsbCB8fCBjb2RlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHRDb2RlKGNvZGUuZ2V0VmFsdWUoKS52YWx1ZSgpKTsKLSAgICAgICAgICAgIEZhdWx0U3ViY29kZSBmc2MgPSBjb2RlLmdldFN1YmNvZGUoKTsKLSAgICAgICAgICAgIHdoaWxlIChmc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5hcHBlbmRGYXVsdFN1YmNvZGUoZnNjLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIGZzYyA9IGZzYy5nZXRTdWJjb2RlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIE1lc3NhZ2VJbmZvIG1pKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVC5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlFOQU1FX1NPQVBfRkFVTFQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgLy8gV3JpdGluZyBOUyBzaW5jZSB0aGlzIG1heSBiZSBjYWxsZWQgd2l0aG91dCB3cml0aW5nIGVudmVsb3BlCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICAgICAgICAgIGNvZGUud3JpdGUod3JpdGVyKTsgLy88c29hcGVudjpDb2RlPiAuLi4gPC9zb2FwZW52OkNvZGU+Ci0gICAgICAgICAgICByZWFzb24ud3JpdGUod3JpdGVyKTsKLQotCi0gICAgICAgICAgICAvLzxzb2FwZW52Ok5vZGU+Li4uPC9zb2FwZW52Ok5vZGU+Ci0gICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9GQVVMVF9OT0RFLmdldExvY2FsUGFydCgpLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMobm9kZSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLzxzb2FwZW52OlJvbGU+Li4uPC9zb2FwZW52OlJvbGU+Ci0gICAgICAgICAgICBpZiAocm9sZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9GQVVMVF9ST0xFLmdldExvY2FsUGFydCgpLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMocm9sZSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLzxzb2FwZW52OkRldGFpbD4uLi48L3NvYXBlbnY6RGV0YWlsPgotICAgICAgICAgICAgaWYgKGRldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90IFJ1bnRpbWVFeGNlcHRpb24sIE5vdCBoZWFkZXIgc29hcEZhdWx0Ci0gICAgICAgICAgICAgICAgaWYgKGRldGFpbCBpbnN0YW5jZW9mIERldGFpbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQRmF1bHRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgU09BUEVuY29kZXIuc2VyaWFsaXplUmVhZGVyKG5ldyBET01TdHJlYW1SZWFkZXIoKERldGFpbCkgZGV0YWlsKSwgd3JpdGVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldGFpbCBpbnN0YW5jZW9mIEpBWEJCcmlkZ2VJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGV0YWlsRWxlbWVudCh3cml0ZXIpOyAgICAgLy8gPHNvYXBlbnY6RGV0YWlsPgotICAgICAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWkpOwotICAgICAgICAgICAgICAgICAgICBCcmlkZ2VDb250ZXh0IGJyaWRnZUNvbnRleHQgPSBydEN0eHQuZ2V0QnJpZGdlQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAoKEpBWEJCcmlkZ2VJbmZvKSBkZXRhaWwpLnNlcmlhbGl6ZShicmlkZ2VDb250ZXh0LCB3cml0ZXIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7ICAvLyA8L3NvYXBlbnY6RGV0YWlsPgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsgICAgICAgICAgICAgICAgLy8gPC9zb2FwZW52OkZhdWx0PgotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0RGV0YWlsRWxlbWVudChYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuUU5BTUVfRkFVTFRfREVUQUlMLmdldExvY2FsUGFydCgpLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9TT0FQRmF1bHRJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL21lc3NhZ2UvU09BUEZhdWx0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjUyODQ2Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9TT0FQRmF1bHRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCcmlkZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU09BUFV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQRmF1bHRJbmZvIHsKLQotICAgIHB1YmxpYyBTT0FQRmF1bHRJbmZvKCl7fQotICAgIC8qKgotICAgICAqIGNyZWF0ZSBTT0FQRmF1bHRJbmZvIHdpdGggU09BUEZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0SW5mbyhTT0FQRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgdGhpcy5zb2FwRmF1bHQgPSBmYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY2Nlc3NvciBtZXRob2QgdG8gZ2V0IHRoZSBmYXVsdCBiZWFuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBKQVhCQmlkZ2VJbmZvIGZvciB0aGlzIGZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEpBWEJCcmlkZ2VJbmZvIGdldEZhdWx0QmVhbigpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0QmVhbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGVzIFNPQVBGYXVsdEluZm8sIGNvdWxkIGJlIFNPQVAgMS4xIG9yIFNPQVAgMS4yIGZhdWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogQHBhcmFtIGFjdG9yCi0gICAgICogQHBhcmFtIGRldGFpbAotICAgICAqIEBwYXJhbSBiaW5kaW5nSWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0SW5mbyhTdHJpbmcgc3RyaW5nLCBRTmFtZSBjb2RlLCBTdHJpbmcgYWN0b3IsIE9iamVjdCBkZXRhaWwsIFN0cmluZyBiaW5kaW5nSWQpIHsKLSAgICAgICAgaWYgKGRldGFpbCA9PSBudWxsIHx8IGRldGFpbCBpbnN0YW5jZW9mIERldGFpbCkgewotICAgICAgICAgICAgRGV0YWlsIGRldCA9IChkZXRhaWwgIT0gbnVsbCkgPyAoRGV0YWlsKSBkZXRhaWwgOiBudWxsOwotICAgICAgICAgICAgc29hcEZhdWx0ID0gU09BUFV0aWwuY3JlYXRlU09BUEZhdWx0KHN0cmluZywgY29kZSwgYWN0b3IsIGRldCwgYmluZGluZ0lkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdCA9IFNPQVBVdGlsLmNyZWF0ZVNPQVBGYXVsdChzdHJpbmcsIGNvZGUsIGFjdG9yLCBudWxsLCBiaW5kaW5nSWQpOwotICAgICAgICAgICAgZmF1bHRCZWFuID0gKEpBWEJCcmlkZ2VJbmZvKSBkZXRhaWw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBGYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdG9yKCkgewotICAgICAgICByZXR1cm4gc29hcEZhdWx0LmdldEZhdWx0QWN0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldERldGFpbCgpIHsKLSAgICAgICAgaWYgKGZhdWx0QmVhbiAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhdWx0QmVhbjsKLQotICAgICAgICByZXR1cm4gc29hcEZhdWx0LmdldERldGFpbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRmF1bHQgZ2V0U09BUEZhdWx0KCkgewotICAgICAgICByZXR1cm4gc29hcEZhdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTT0FQRmF1bHQgc29hcEZhdWx0OwotICAgIHByb3RlY3RlZCBKQVhCQnJpZGdlSW5mbyBmYXVsdEJlYW47Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL21lc3NhZ2UvU09BUE1zZ0NyZWF0ZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL1NPQVBNc2dDcmVhdGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmNGNkMS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL21lc3NhZ2UvU09BUE1zZ0NyZWF0ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmV4Y2VwdGlvbi5KQVhXU0V4Y2VwdGlvbkJhc2U7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQTXNnQ3JlYXRlRXhjZXB0aW9uIGV4dGVuZHMgSkFYV1NFeGNlcHRpb25CYXNlIHsKLQotICAgIHB1YmxpYyBTT0FQTXNnQ3JlYXRlRXhjZXB0aW9uKFN0cmluZyBrZXksIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIHN1cGVyKGtleSwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLnNvYXAiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvbWVzc2FnZS9TT0FQTXNnRmFjdG9yeUNyZWF0ZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL1NPQVBNc2dGYWN0b3J5Q3JlYXRlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYzc3YzMuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9tZXNzYWdlL1NPQVBNc2dGYWN0b3J5Q3JlYXRlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZTsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuZXhjZXB0aW9uLkpBWFdTRXhjZXB0aW9uQmFzZTsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFNPQVBNc2dGYWN0b3J5Q3JlYXRlRXhjZXB0aW9uIGV4dGVuZHMgSkFYV1NFeGNlcHRpb25CYXNlIHsKLQotICAgIHB1YmxpYyBTT0FQTXNnRmFjdG9yeUNyZWF0ZUV4Y2VwdGlvbihTdHJpbmcga2V5LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICBzdXBlcihrZXksIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5zb2FwIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL3NlcnZlci9Qcm92aWRlclNFRC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zZXJ2ZXIvUHJvdmlkZXJTRUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkZWQ0Ny4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL3NlcnZlci9Qcm92aWRlclNFRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zZXJ2ZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuaW50ZXJuYWwuSW50ZXJuYWxFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuQm9keUJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUFJ1bnRpbWVNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5NZXNzYWdlSW5mb1V0aWw7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLXB1YmxpYyBjbGFzcyBQcm92aWRlclNFRCBpbXBsZW1lbnRzIEludGVybmFsRW5jb2RlciB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0b01lc3NhZ2VJbmZvKE9iamVjdCBpbnRlcm5hbE1lc3NhZ2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU2V0cyBTb3VyY2UgaW4gSW50ZXJuYWxNZXNzYWdlJ3MgQm9keUJsb2NrLiBJZiB0aGVyZSBpcyBhbiBleGNlcHRpb24KLSAgICAgKiBpbiBNZXNzYWdlSW5mbywgaXQgaXMgc2V0IGFzIGZhdWx0IGluIEJvZHlCbG9jawotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIEludGVybmFsTWVzc2FnZSB0b0ludGVybmFsTWVzc2FnZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlID0gbmV3IEludGVybmFsTWVzc2FnZSgpOwotICAgICAgICBzd2l0Y2gobWVzc2FnZUluZm8uZ2V0UmVzcG9uc2VUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5OT1JNQUxfUkVTUE9OU0UgOgotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBtZXNzYWdlSW5mby5nZXRSZXNwb25zZSgpOwotICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQm9keUJsb2NrIGJvZHlCbG9jayA9IG5ldyBCb2R5QmxvY2soKFNvdXJjZSlvYmopOwotICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbE1lc3NhZ2Uuc2V0Qm9keShib2R5QmxvY2spOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFIDoKLSAgICAgICAgICAgICAgICAvLyBpbnZva2UoKSBkb2Vzbid0IHRocm93IGFueSBjaGVja2VkIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC8vIEZhbGx0aHJvdWdoCi0KLSAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFIDoKLSAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dCBydENvbnRleHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgIEJpbmRpbmdJbXBsIGJpbmRpbmdJbXBsID0KLSAgICAgICAgICAgICAgICAgICAgKEJpbmRpbmdJbXBsKXJ0Q29udGV4dC5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCkuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSBiaW5kaW5nSW1wbC5nZXRCaW5kaW5nSWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBSdW50aW1lTW9kZWwuY3JlYXRlRmF1bHRJbkJvZHkobWVzc2FnZUluZm8uZ2V0UmVzcG9uc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBpbnRlcm5hbE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBSdW50aW1lTW9kZWwuY3JlYXRlU09BUDEyRmF1bHRJbkJvZHkobWVzc2FnZUluZm8uZ2V0UmVzcG9uc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBpbnRlcm5hbE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW50ZXJuYWxNZXNzYWdlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zZXJ2ZXIvU09BUDEyWE1MRGVjb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zZXJ2ZXIvU09BUDEyWE1MRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY2MTM3Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvc2VydmVyL1NPQVAxMlhNTERlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc2VydmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSGVhZGVyQmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5TT0FQMTJOb3RVbmRlcnN0b29kSGVhZGVyQmxvY2s7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOwotCi1pbXBvcnQgc3RhdGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyLio7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkludGVybmFsTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MUmVhZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU09BUFV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQMTJYTUxEZWNvZGVyIGV4dGVuZHMgU09BUFhNTERlY29kZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gcmVxdWlyZWRSb2xlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHB1YmxpYyBTT0FQMTJYTUxEZWNvZGVyKCkgewotICAgICAgICByZXF1aXJlZFJvbGVzLmFkZCgiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCIpOwotICAgICAgICByZXF1aXJlZFJvbGVzLmFkZCgiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJ0LmVuY29kaW5nLnNvYXAuU09BUERlY29kZXIjZGVjb2RlSGVhZGVyKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxSZWFkZXIsIGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8sIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRlY29kZUhlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgSW50ZXJuYWxNZXNzYWdlIHJlcXVlc3QpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICBzdXBlci5kZWNvZGVIZWFkZXIocmVhZGVyLCBtZXNzYWdlSW5mbywgcmVxdWVzdCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucnQuZW5jb2Rpbmcuc29hcC5TT0FQRGVjb2RlciNnZXRCb2R5VGFnKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUU5hbWUgZ2V0Qm9keVRhZygpIHsKLSAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9TT0FQX0JPRFk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucnQuZW5jb2Rpbmcuc29hcC5TT0FQRGVjb2RlciNnZXRFbnZlbG9wZVRhZygpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldEVudmVsb3BlVGFnKCkgewotICAgICAgICByZXR1cm4gU09BUDEyQ29uc3RhbnRzLlFOQU1FX1NPQVBfRU5WRUxPUEU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucnQuZW5jb2Rpbmcuc29hcC5TT0FQRGVjb2RlciNnZXRIZWFkZXJUYWcoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRIZWFkZXJUYWcoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQMTJDb25zdGFudHMuUU5BTUVfU09BUF9IRUFERVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldE1VQXR0clFOYW1lKCl7Ci0gICAgICAgIHJldHVybiBTT0FQMTJDb25zdGFudHMuUU5BTUVfTVVTVFVOREVSU1RBTkQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldFJvbGVBdHRyUU5hbWUoKXsKLSAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9ST0xFOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRSZXF1aXJlZFJvbGVzKCkgewotICAgICAgICByZXR1cm4gcmVxdWlyZWRSb2xlczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEtlZXAgdHJhY2sgb2YgYWxsIG5vdC11bmRlcnN0b29kIGhlYWRlcnMgdG8gcmV0dXJuCi0gICAgICogd2l0aCBmYXVsdCB0byBjbGllbnQuIEluIHNvYXAgMS4xLCB0aGUgY2hlY2sgZmFpbHMKLSAgICAgKiBvbiB0aGUgZmlyc3Qgbm90LXVuZGVyc3Rvb2QgaGVhZGVyLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrSGVhZGVyc0FnYWluc3RLbm93bihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLAotICAgICAgICBTZXQ8U3RyaW5nPiByb2xlcywgU2V0PFFOYW1lPiB1bmRlcnN0b29kSGVhZGVycywgTWVzc2FnZUluZm8gbWkpIHsKLQotICAgICAgICBTZXQ8UU5hbWU+IG5vdFVuZGVyc3Rvb2RIZWFkZXJzID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIE1VIGhlYWRlciBmb3IgZWFjaCByb2xlCi0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtdSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0TVVBdHRyUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TVVBdHRyUU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG11ICE9IG51bGwgJiYgKG11LmVxdWFscygiMSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIG11LmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvbGUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRSb2xlQXR0clFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRSb2xlQXR0clFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSAhPSBudWxsICYmIHJvbGVzLmNvbnRhaW5zKHJvbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJFbGVtZW50PSIgKyBxTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0YXJnZXRlZCBhdD0iICsgcm9sZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJzdG9vZEhlYWRlcnMgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICF1bmRlcnN0b29kSGVhZGVycy5jb250YWlucyhxTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJFbGVtZW50IG5vdCB1bmRlcnN0b29kPSIgKyBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90VW5kZXJzdG9vZEhlYWRlcnMuYWRkKHFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7ICAgLy8gTW92ZXMgdG8gRU5EIHN0YXRlCi0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobm90VW5kZXJzdG9vZEhlYWRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBuZWVkIHRvIGFkZCBoZWFkZXJzIHRvIGZhdWx0Ci0gICAgICAgIFNPQVBGYXVsdCBzZiA9IFNPQVBVdGlsLmNyZWF0ZVNPQVBGYXVsdCgKLSAgICAgICAgICAgIE1VU1RfVU5ERVJTVEFORF9GQVVMVF9NRVNTQUdFX1NUUklORywKLSAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX01VU1RfVU5ERVJTVEFORCwKLSAgICAgICAgICAgIG51bGwsIG51bGwsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORyk7Ci0gICAgICAgIFNldDxIZWFkZXJCbG9jaz4gbnVIZWFkZXJCbG9ja3MgPSBuZXcgSGFzaFNldDxIZWFkZXJCbG9jaz4oKTsKLSAgICAgICAgZm9yIChRTmFtZSBoZWFkZXJOYW1lIDogbm90VW5kZXJzdG9vZEhlYWRlcnMpIHsKLSAgICAgICAgICAgIG51SGVhZGVyQmxvY2tzLmFkZChuZXcgU09BUDEyTm90VW5kZXJzdG9vZEhlYWRlckJsb2NrKGhlYWRlck5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlSW5mb1V0aWwuc2V0Tm90VW5kZXJzdG9vZEhlYWRlcnMobWksIG51SGVhZGVyQmxvY2tzKTsKLSAgICAgICAgdGhyb3cgbmV3IFNPQVBGYXVsdEV4Y2VwdGlvbihzZik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSWQoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldFNlbmRlckZhdWx0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX0NMSUVOVDsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRSZWNlaXZlckZhdWx0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX1NFUlZFUjsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRWZXJzaW9uTWlzbWF0Y2hGYXVsdENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQMTJDb25zdGFudHMuRkFVTFRfQ09ERV9WRVJTSU9OX01JU01BVENIOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zZXJ2ZXIvU09BUDEyWE1MRW5jb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zZXJ2ZXIvU09BUDEyWE1MRW5jb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjEyZjExLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvc2VydmVyL1NPQVAxMlhNTEVuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnNlcnZlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVAxMkZhdWx0SW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQMTJOYW1lc3BhY2VDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUE5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5KQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci4qOwotCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgU09BUDEyWE1MRW5jb2RlciBleHRlbmRzIFNPQVBYTUxFbmNvZGVyIHsKLSAgICAvKgotICAgICAqIEBzZWUgU09BUEVuY29kZXIjc3RhcnRFbnZlbG9wZShYTUxTdHJlYW1Xcml0ZXIpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRFbnZlbG9wZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgIFNPQVBOYW1lc3BhY2VDb25zdGFudHMuVEFHX0VOVkVMT1BFLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLk5TUFJFRklYX1NPQVBfRU5WRUxPUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgU09BUEVuY29kZXIjc3RhcnRCb2R5KFhNTFN0cmVhbVdyaXRlcikKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydEJvZHkoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFNPQVBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSwKLSAgICAgICAgICAgICAgICBTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLlRBR19CT0RZLCBTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFNPQVBFbmNvZGVyI3N0YXJ0SGVhZGVyKFhNTFN0cmVhbVdyaXRlcikKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydEhlYWRlcihYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgIFNPQVBOYW1lc3BhY2VDb25zdGFudHMuVEFHX0hFQURFUiwgU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLkVOVkVMT1BFKTsgLy8gPGVudjpIZWFkZXI+Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5ydC5zZXJ2ZXIuU09BUFhNTEVuY29kZXIjd3JpdGVGYXVsdChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zb2FwLm1lc3NhZ2UuU09BUEZhdWx0SW5mbywgY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbywgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFN0cmVhbVdyaXRlcikKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZhdWx0KFNPQVBGYXVsdEluZm8gZmF1bHRJbmZvLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotICAgICAgICBpZighKGZhdWx0SW5mbyBpbnN0YW5jZW9mIFNPQVAxMkZhdWx0SW5mbykpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIFNldCBhIHN0YXR1cyBjb2RlIGZvciBGYXVsdAotICAgICAgICBNZXNzYWdlQ29udGV4dCBjdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldE1lc3NhZ2VDb250ZXh0KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgaWYgKE1lc3NhZ2VDb250ZXh0VXRpbC5nZXRIdHRwU3RhdHVzQ29kZShjdHh0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dFV0aWwuc2V0SHR0cFN0YXR1c0NvZGUoY3R4dCwgV1NDb25uZWN0aW9uLklOVEVSTkFMX0VSUik7Ci0gICAgICAgIH0KLQotICAgICAgICAoKFNPQVAxMkZhdWx0SW5mbylmYXVsdEluZm8pLndyaXRlKHdyaXRlciwgbWVzc2FnZUluZm8pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgIEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIgbWFyc2hhbGxlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50TmVnb3RpYXRpb24gPSAoU3RyaW5nKQotICAgICAgICAgICAgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5DT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZKTsKLQotICAgICAgICBpZiAobWFyc2hhbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYXJzaGFsbGVyID0gZ2V0QXR0YWNobWVudE1hcnNoYWxsZXIobWVzc2FnZUluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hcnNoYWxsZXIgIT0gbnVsbCAmJiBtYXJzaGFsbGVyLmlzWG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBYT1BfU09BUDEyX1hNTF9UWVBFX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChjb250ZW50TmVnb3RpYXRpb24gPT0gIm9wdGltaXN0aWMiKSA/Ci0gICAgICAgICAgICAgICAgRkFTVF9JTkZPU0VUX1RZUEVfU09BUDEyIDogU09BUDEyX1hNTF9DT05URU5UX1RZUEVfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgU09BUE1lc3NhZ2UgKDEuMSBvciAxLjIgdXNpbmcgU0FBSiBhcGkpLgotICAgICAqIEByZXR1cm4gdGhlIEJpbmRpbmdJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbmNvZGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCaW5kaW5nSWQoKXsKLSAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL3NlcnZlci9TT0FQWE1MRGVjb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zZXJ2ZXIvU09BUFhNTERlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzYzE0OS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL3NlcnZlci9TT0FQWE1MRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zZXJ2ZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0VXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5KYXZhTWV0aG9kOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlJ1bnRpbWVNb2RlbDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUERlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuU291cmNlUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNPQVBVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFNPQVBYTUxEZWNvZGVyIGV4dGVuZHMgU09BUERlY29kZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gcmVxdWlyZWRSb2xlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBlbXB0eUJvZHlOYW1lID0gbmV3IFFOYW1lKCIiKTsKLQotICAgIHB1YmxpYyBTT0FQWE1MRGVjb2RlcigpIHsKLSAgICAgICAgcmVxdWlyZWRSb2xlcy5hZGQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCIpOwotICAgICAgICByZXF1aXJlZFJvbGVzLmFkZCgiIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKgotICAgICAqIEB0aHJvd3MgU2VydmVyUnRFeGNlcHRpb24KLSAgICAgKiBAc2VlIFNPQVBEZWNvZGVyI3RvSW50ZXJuYWxNZXNzYWdlKFNPQVBNZXNzYWdlKQotICAgICAqLwotICAgIHB1YmxpYyBJbnRlcm5hbE1lc3NhZ2UgdG9JbnRlcm5hbE1lc3NhZ2UoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIC8vIFRPRE8gaGFuZGxlIGV4Y2VwdGlvbnMsIGF0dGFjaG1lbnRzCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW50ZXJuYWxNZXNzYWdlIHJlcXVlc3QgPSBuZXcgSW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudHMobWVzc2FnZUluZm8sIHJlcXVlc3QsIHNvYXBNZXNzYWdlKTsKLSAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIHJlYWRlciA9IFNvdXJjZVJlYWRlckZhY3RvcnkuY3JlYXRlU291cmNlUmVhZGVyKHNvdXJjZSwgdHJ1ZSxnZXRTT0FQTWVzc2FnZUNoYXJzZXRFbmNvZGluZyhzb2FwTWVzc2FnZSkpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKLSAgICAgICAgICAgIGRlY29kZUVudmVsb3BlKHJlYWRlciwgcmVxdWVzdCwgZmFsc2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoaXNCYWRYTUwoZSkpIHsKLSAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgIEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDdHh0ID0gcnRDdHh0LmdldEhhbmRsZXJDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmFpc2VCYWRYTUxGYXVsdChoYW5kbGVyQ3R4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNvYXBkZWNvZGVyLmVyciIsIG5ldyBPYmplY3RbXXtlfSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLmNsb3NlKHJlYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0JhZFhNTChFeGNlcHRpb24gZSkgewotICAgICAgICB3aGlsZSAoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFhNTFN0cmVhbUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZSA9IChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBFeGNlcHRpb24pID8gKEV4Y2VwdGlvbillLmdldENhdXNlKCkgOiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogSGVhZGVycyBmcm9tIFNPQVBNZXNzc2FnZSBhcmUgbWFwcGVkIHRvIEhlYWRlckJsb2NrcyBpbiBJbnRlcm5hbE1lc3NhZ2UKLSAgICAgKiBCb2R5IGZyb20gU09BUE1lc3NhZ2UgaXMgc2tpcHBlZAotICAgICAqIEJvZHlCbG9jayBpbiBJbnRlcm5hbE1lc3NhZ2UgaXMgY29udmVydGVkIHRvIEpBWEJUeXBlSW5mbyBvciBScGNMaXRQYXlsb2FkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNlcnZlclJ0RXhjZXB0aW9uCi0gICAgICogQHNlZSBTT0FQRGVjb2RlciN0b0ludGVybmFsTWVzc2FnZShTT0FQTWVzc2FnZSwgSW50ZXJuYWxNZXNzYWdlKQotICAgICAqLwotICAgIHB1YmxpYyBJbnRlcm5hbE1lc3NhZ2UgdG9JbnRlcm5hbE1lc3NhZ2UoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UsCi0gICAgICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgcmVxdWVzdCwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLQotICAgICAgICAvLyBUT0RPIGhhbmRsZSBleGNlcHRpb25zLCBhdHRhY2htZW50cwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50cyhtZXNzYWdlSW5mbywgcmVxdWVzdCwgc29hcE1lc3NhZ2UpOwotICAgICAgICAgICAgU291cmNlIHNvdXJjZSA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgcmVhZGVyID0gU291cmNlUmVhZGVyRmFjdG9yeS5jcmVhdGVTb3VyY2VSZWFkZXIoc291cmNlLCB0cnVlLGdldFNPQVBNZXNzYWdlQ2hhcnNldEVuY29kaW5nKHNvYXBNZXNzYWdlKSk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgZGVjb2RlRW52ZWxvcGUocmVhZGVyLCByZXF1ZXN0LCB0cnVlLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBjb252ZXJ0Qm9keUJsb2NrKHJlcXVlc3QsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGlzQmFkWE1MKGUpKSB7Ci0gICAgICAgICAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ3R4dCA9IHJ0Q3R4dC5nZXRIYW5kbGVyQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIHJhaXNlQmFkWE1MRmF1bHQoaGFuZGxlckN0eHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJzb2FwZGVjb2Rlci5lcnIiLCBuZXcgT2JqZWN0W117ZX0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5jbG9zZShyZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZURpc3BhdGNoTWV0aG9kKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEludGVybmFsTWVzc2FnZSByZXF1ZXN0LCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICAvLyBPcGVyYXRpb24ncyBRTmFtZS4gdGFrZXMgY2FyZSBvZiA8Ym9keS8+Ci0gICAgICAgIFFOYW1lIG5hbWUgPSAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKSA/IHJlYWRlci5nZXROYW1lKCkgOiBlbXB0eUJvZHlOYW1lOwotICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICBSdW50aW1lTW9kZWwgcnRNb2RlbCA9IHJ0Q3R4dC5nZXRNb2RlbCgpOwotICAgICAgICBKYXZhTWV0aG9kIGphdmFNZXRob2QgPSBydE1vZGVsLmdldEphdmFNZXRob2QobmFtZSk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSAoamF2YU1ldGhvZCA9PSBudWxsKSA/IG51bGwgOiBqYXZhTWV0aG9kLmdldE1ldGhvZCgpOwotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgIHJhaXNlRmF1bHQoZ2V0U2VuZGVyRmF1bHRDb2RlKCksICJDYW5ub3QgZmluZCB0aGUgZGlzcGF0Y2ggbWV0aG9kIik7Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRNZXNzYWdlQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIGlmIChtc2dDdHh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBvcE5zVXJpID0gcnRNb2RlbC5nZXRQb3J0VHlwZU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIFN0cmluZyBvcE5hbWUgPSBqYXZhTWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0VXRpbC5zZXRXc2RsT3BlcmF0aW9uKG1zZ0N0eHQsIG5ldyBRTmFtZShvcE5zVXJpLCBvcE5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlSW5mby5zZXRNZXRob2QobWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU09BUEZhdWx0SW5mbyBkZWNvZGVGYXVsdChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlLAotICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByYWlzZUZhdWx0KGdldFNlbmRlckZhdWx0Q29kZSgpLCAiU2VydmVyIGNhbm5vdCBoYW5kbGUgZmF1bHQgbWVzc2FnZSIpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCByYWlzZUJhZFhNTEZhdWx0KEhhbmRsZXJDb250ZXh0IGN0eHQpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlsLnNldEh0dHBTdGF0dXNDb2RlKGN0eHQuZ2V0TWVzc2FnZUNvbnRleHQoKSwgNDAwKTsKLSAgICAgICAgcmFpc2VGYXVsdChnZXRTZW5kZXJGYXVsdENvZGUoKSwgIkJhZCByZXF1ZXN0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldFJlcXVpcmVkUm9sZXMoKSB7Ci0gICAgICAgIHJldHVybiByZXF1aXJlZFJvbGVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lkKCkgewotICAgICAgICByZXR1cm4gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRTZW5kZXJGYXVsdENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBTT0FQQ29uc3RhbnRzLkZBVUxUX0NPREVfQ0xJRU5UOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRTmFtZSBnZXRSZWNlaXZlckZhdWx0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25zdGFudHMuRkFVTFRfQ09ERV9TRVJWRVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdldFZlcnNpb25NaXNtYXRjaEZhdWx0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25zdGFudHMuRkFVTFRfQ09ERV9WRVJTSU9OX01JU01BVENIOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zZXJ2ZXIvU09BUFhNTEVuY29kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvc2VydmVyL1NPQVBYTUxFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjY4YTguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zZXJ2ZXIvU09BUFhNTEVuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnNlcnZlcjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7Ci1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCcmlkZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAubWVzc2FnZS5TT0FQRmF1bHRJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVBOYW1lc3BhY2VDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TZXJ2ZXJSdEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5XU0Nvbm5lY3Rpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLkRPTVN0cmVhbVJlYWRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkJ5dGVBcnJheUJ1ZmZlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNPQVBVdGlsOwotCi1pbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFNPQVBYTUxFbmNvZGVyIGV4dGVuZHMgU09BUEVuY29kZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRDT0RFX05BTUUgICA9ICJmYXVsdGNvZGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUU1RSSU5HX05BTUUgPSAiZmF1bHRzdHJpbmciOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUQUNUT1JfTkFNRSAgPSAiZmF1bHRhY3RvciI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMX05BTUUgICAgICA9ICJkZXRhaWwiOwotCi0gICAgcHVibGljIFNPQVBYTUxFbmNvZGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSB0b1NPQVBNZXNzYWdlKEludGVybmFsTWVzc2FnZSByZXNwb25zZSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4geG9wRW5hYmxlZCA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRBdHRhY2htZW50c01hcChtZXNzYWdlSW5mbywgcmVzcG9uc2UpOwotICAgICAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJhYiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKLQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFkpID09ICJvcHRpbWlzdGljIikgewotICAgICAgICAgICAgICAgIHdyaXRlciA9IFhNTFN0cmVhbVdyaXRlckZhY3RvcnkuY3JlYXRlRklTdHJlYW1Xcml0ZXIoYmFiKTsKLQotICAgICAgICAgICAgICAgIC8vIFR1cm4gWE9QIG9mZiBmb3IgRkkKLSAgICAgICAgICAgICAgICBtYXJzaGFsbGVyID0gZ2V0QXR0YWNobWVudE1hcnNoYWxsZXIobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgIGlmIChtYXJzaGFsbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgeG9wRW5hYmxlZCA9IG1hcnNoYWxsZXIuaXNYT1BQYWNrYWdlKCk7ICAgICAvLyBsYXN0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIG1hcnNoYWxsZXIuc2V0WE9QUGFja2FnZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RvcmUgb3V0cHV0IHN0cmVhbSB0byB1c2UgaW4gSkFYQiBicmlkZ2UgKG5vdCB3aXRoIEZJKQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldE1ldGFEYXRhKEpBWEJfT1VUUFVUU1RSRUFNLCBiYWIpOwotICAgICAgICAgICAgICAgIHdyaXRlciA9IFhNTFN0cmVhbVdyaXRlckZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKGJhYik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHN0YXJ0RW52ZWxvcGUod3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlRW52ZWxvcGVOYW1lc3BhY2VzKHdyaXRlciwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgd3JpdGVIZWFkZXJzKHdyaXRlciwgcmVzcG9uc2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIHdyaXRlQm9keSh3cml0ZXIsIHJlc3BvbnNlLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBlbmRFbnZlbG9wZSh3cml0ZXIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotCi0gICAgICAgICAgICBNaW1lSGVhZGVycyBtaCA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgbWguYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCBnZXRDb250ZW50VHlwZShtZXNzYWdlSW5mbywgbWFyc2hhbGxlcikpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gU09BUFV0aWwuY3JlYXRlTWVzc2FnZShtaCwgYmFiLm5ld0lucHV0U3RyZWFtKCksIGdldEJpbmRpbmdJZCgpKTsKLSAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50cyhyZXNwb25zZSwgbXNnKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBkZWZhdWx0IFhPUCBwcm9jZXNzaW5nIGJlZm9yZSByZXR1cm5pbmcKLSAgICAgICAgICAgIGlmIChtYXJzaGFsbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYXJzaGFsbGVyLnNldFhPUFBhY2thZ2UoeG9wRW5hYmxlZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtc2c7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNvYXBlbmNvZGVyLmVyciIsIG5ldyBPYmplY3RbXXtlfSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlciBnZXRBdHRhY2htZW50TWFyc2hhbGxlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBPYmplY3QgcnRjID0gbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19SVU5USU1FX0NPTlRFWFQpOwotICAgICAgICBpZiAocnRjICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJyaWRnZUNvbnRleHQgYmMgPSAoKFJ1bnRpbWVDb250ZXh0KSBydGMpLmdldEJyaWRnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIGlmIChiYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyKSBiYy5nZXRBdHRhY2htZW50TWFyc2hhbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgIEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIgbWFyc2hhbGxlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50TmVnb3RpYXRpb24gPSAoU3RyaW5nKQotICAgICAgICAgICAgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5DT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZKTsKLQotICAgICAgICBpZiAobWFyc2hhbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYXJzaGFsbGVyID0gZ2V0QXR0YWNobWVudE1hcnNoYWxsZXIobWVzc2FnZUluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hcnNoYWxsZXIgIT0gbnVsbCAmJiBtYXJzaGFsbGVyLmlzWG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBYT1BfU09BUDExX1hNTF9UWVBFX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChjb250ZW50TmVnb3RpYXRpb24gPT0gIm9wdGltaXN0aWMiKSA/Ci0gICAgICAgICAgICAgICAgRkFTVF9JTkZPU0VUX1RZUEVfU09BUDExIDogWE1MX0NPTlRFTlRfVFlQRV9WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogd3JpdGVzIDxlbnY6RmF1bHQ+IC4uLiA8L2VudjpGYXVsdD4uIEpBWEIgc2VyaWFsaXplcyB0aGUgY29udGVudHMKLSAgICAgKiBpbiB0aGUgPGRldGFpbD4gZm9yIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9ucy4gV2Ugc2VyaWFsaXplIHByb3RvY29sCi0gICAgICogc3BlY2lmaWMgZXhjZXB0aW9ucyBvdXJzZWx2ZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZhdWx0KFNPQVBGYXVsdEluZm8gaW5zdGFuY2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTZXQgYSBzdGF0dXMgY29kZSBmb3IgRmF1bHQKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0TWVzc2FnZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgaWYgKE1lc3NhZ2VDb250ZXh0VXRpbC5nZXRIdHRwU3RhdHVzQ29kZShjdHh0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlsLnNldEh0dHBTdGF0dXNDb2RlKGN0eHQsIFdTQ29ubmVjdGlvbi5JTlRFUk5BTF9FUlIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuUU5BTUVfU09BUF9GQVVMVC5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVBfRkFVTFQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgLy8gV3JpdGluZyBOUyBzaW5jZSB0aGlzIG1heSBiZSBjYWxsZWQgd2l0aG91dCB3cml0aW5nIGVudmVsb3BlCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFLAotICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVBfRkFVTFQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoRkFVTFRDT0RFX05BTUUpOyAgIC8vIDxmYXVsdGNvZGU+Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gU09BUE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFOwotICAgICAgICAgICAgUU5hbWUgZmF1bHRDb2RlID0gaW5zdGFuY2UuZ2V0Q29kZSgpOwotICAgICAgICAgICAgU3RyaW5nIG5zVVJJID0gZmF1bHRDb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKCFuc1VSSS5lcXVhbHMoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5FTlZFTE9QRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBhZGQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGZvciB0aGlzIGN1c3RvbSBmYXVsdCBjb2RlCi0gICAgICAgICAgICAgICAgaWYgKG5zVVJJLmVxdWFscyhYTUxDb25zdGFudHMuTlVMTF9OU19VUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IFhNTENvbnN0YW50cy5ERUZBVUxUX05TX1BSRUZJWDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBmYXVsdENvZGUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKFhNTENvbnN0YW50cy5ERUZBVUxUX05TX1BSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJhbnMiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuc1VSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5zVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyhYTUxDb25zdGFudHMuREVGQVVMVF9OU19QUkVGSVgpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhpbnN0YW5jZS5nZXRDb2RlKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXgrIjoiK2luc3RhbmNlLmdldENvZGUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7ICAgICAgICAgICAgICAgICAgICAvLyA8L2ZhdWx0Y29kZT4KLQotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEZBVUxUU1RSSU5HX05BTUUpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhpbnN0YW5jZS5nZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbnN0YW5jZS5nZXRBY3RvcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoRkFVTFRBQ1RPUl9OQU1FKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKGluc3RhbmNlLmdldEFjdG9yKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0IGRldGFpbCA9IGluc3RhbmNlLmdldERldGFpbCgpOwotICAgICAgICAgICAgaWYgKGRldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90IFJ1bnRpbWVFeGNlcHRpb24sIE5vdCBoZWFkZXIgZmF1bHQKLSAgICAgICAgICAgICAgICBpZiAoZGV0YWlsIGluc3RhbmNlb2YgRGV0YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNPQVBGYXVsdEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICBlbmNvZGVEZXRhaWwoKERldGFpbClkZXRhaWwsIHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXRhaWwgaW5zdGFuY2VvZiBKQVhCQnJpZGdlSW5mbykgewotICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoREVUQUlMX05BTUUpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZUpBWEJCcmlkZ2VJbmZvKChKQVhCQnJpZGdlSW5mbylkZXRhaWwsIG1lc3NhZ2VJbmZvLCB3cml0ZXIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7ICAgICAgICAvLyA8L2RldGFpbD4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsgICAgICAgICAgICAgICAgLy8gPC9lbnY6RmF1bHQ+Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNlcmlhbGl6ZXMgamF2YXgueG1sLnNvYXAuRGV0YWlsLiBEZXRhaWwgaXMgb2YgdHlwZSBTT0FQRWxlbWVudC4KLSAgICAgKiBYbWxUcmVlUmVhZGVyIGlzIHVzZWQgdG8gdHJhdmVyc2UgdGhlIFNPQVBFbGVtZW50L0RPTSBOb2RlIGFuZCBzZXJpYWxpemVzCi0gICAgICogdGhlIFhNTC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBlbmNvZGVEZXRhaWwoRGV0YWlsIGRldGFpbCwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotICAgICAgICBzZXJpYWxpemVSZWFkZXIobmV3IERPTVN0cmVhbVJlYWRlcihkZXRhaWwpLCB3cml0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBTT0FQTWVzc2FnZSAoMS4xIG9yIDEuMiB1c2luZyBTQUFKIGFwaSkuCi0gICAgICogQHJldHVybiB0aGUgQmluZGluZ0lEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVuY29kZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJpbmRpbmdJZCgpewotICAgICAgICByZXR1cm4gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvc3RyZWFtaW5nL1NPQVAxMk5hbWVzcGFjZUNvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zdHJlYW1pbmcvU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLmphdmEKaW5kZXggYmZkNzM3NS4uNjU2M2I1YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zdHJlYW1pbmcvU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zdHJlYW1pbmcvU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zdHJlYW1pbmcvU09BUE5hbWVzcGFjZUNvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2Rpbmcvc29hcC9zdHJlYW1pbmcvU09BUE5hbWVzcGFjZUNvbnN0YW50cy5qYXZhCmluZGV4IGYzNDljOWIuLmYzN2FjMzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3NvYXAvc3RyZWFtaW5nL1NPQVBOYW1lc3BhY2VDb25zdGFudHMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy9zb2FwL3N0cmVhbWluZy9TT0FQTmFtZXNwYWNlQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcveG1sL1hNTENvZGVjLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy94bWwvWE1MQ29kZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGJmNWFiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcveG1sL1hNTENvZGVjLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5Db250ZW50VHlwZUltcGw7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsOworCitwdWJsaWMgZmluYWwgY2xhc3MgWE1MQ29kZWMgaW1wbGVtZW50cyBDb2RlYyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FQUExJQ0FUSU9OX01JTUVfVFlQRSA9ICJhcHBsaWNhdGlvbi94bWwiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RFWFRfTUlNRV9UWVBFID0gInRleHQveG1sIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbmV3IENvbnRlbnRUeXBlSW1wbChYTUxfVEVYVF9NSU1FX1RZUEUpOworCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFhNTF9BUFBMSUNBVElPTl9NSU1FX1RZUEU7CisgICAgfQorCisgICAgcHVibGljIENvbnRlbnRUeXBlIGdldFN0YXRpY0NvbnRlbnRUeXBlKFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50VHlwZSBlbmNvZGUoUGFja2V0IHBhY2tldCwgT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MU3RyZWFtV3JpdGVyRmFjdG9yeS5jcmVhdGUob3V0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChwYWNrZXQuZ2V0TWVzc2FnZSgpLmhhc1BheWxvYWQoKSl7CisgICAgICAgICAgICAgICAgcGFja2V0LmdldE1lc3NhZ2UoKS53cml0ZVBheWxvYWRUbyh3cml0ZXIpOworICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50VHlwZSBlbmNvZGUoUGFja2V0IHBhY2tldCwgV3JpdGFibGVCeXRlQ2hhbm5lbCBidWZmZXIpIHsKKyAgICAgICAgLy9UT0RPOiBub3QgeWV0IGltcGxlbWVudGVkCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBDb2RlYyBjb3B5KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWNvZGUoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBjb250ZW50VHlwZSwgUGFja2V0IHBhY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gWE1MTWVzc2FnZS5jcmVhdGUoY29udGVudFR5cGUsIGluKTsKKyAgICAgICAgcGFja2V0LnNldE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVjb2RlKFJlYWRhYmxlQnl0ZUNoYW5uZWwgaW4sIFN0cmluZyBjb250ZW50VHlwZSwgUGFja2V0IHBhY2tldCkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3htbC9YTUxEZWNvZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy94bWwvWE1MRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjk4YmQ5Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3htbC9YTUxEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy54bWw7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkRlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuQm9keUJsb2NrOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlOwotCi1pbXBvcnQgc3RhdGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyLio7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFhNTERlY29kZXIgaW1wbGVtZW50cyBEZWNvZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKAotICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi54bWwuZGVjb2RlciIpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi5wZXB0LmVuY29kaW5nLkRlY29kZXIjZGVjb2RlKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKE1lc3NhZ2VJbmZvIGFyZzApIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLnN1bi5wZXB0LmVuY29kaW5nLkRlY29kZXIjcmVjZWlldmVBbmREZWNvZGUoY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlQW5kRGVjb2RlKE1lc3NhZ2VJbmZvIGFyZzApIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGFyc2VzIGFuZCBiaW5kcyBib2R5IGZyb20geG1sTWVzc2FnZS4KLSAgICAgKiBAcGFyYW0geG1sTWVzc2FnZQotICAgICAqIEBwYXJhbSBtZXNzYWdlSW5mbwotICAgICAqIEByZXR1cm4gSW50ZXJuYWxNZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHhtbE1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZXJuYWxNZXNzYWdlIHRvSW50ZXJuYWxNZXNzYWdlKFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhbmQgYmluZHMgeG1sTWVzc2FnZS4KLSAgICAgKiBAcGFyYW0geG1sTWVzc2FnZQotICAgICAqIEBwYXJhbSBpbnRlcm5hbE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUluZm8KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlcm5hbE1lc3NhZ2UgdG9JbnRlcm5hbE1lc3NhZ2UoWE1MTWVzc2FnZSB4bWxNZXNzYWdlLAotICAgICAgICAgICAgSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIHRvU09BUE1lc3NhZ2UoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdG9NZXNzYWdlSW5mbyhJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgeyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGVEaXNwYXRjaE1ldGhvZChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBJbnRlcm5hbE1lc3NhZ2UgcmVxdWVzdCwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgKgotICAgICovCi0gICBwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0Qm9keUJsb2NrKEludGVybmFsTWVzc2FnZSByZXF1ZXN0LCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgIEJvZHlCbG9jayBib2R5QmxvY2sgPSByZXF1ZXN0LmdldEJvZHkoKTsKLSAgICAgICBpZiAoYm9keUJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYm9keUJsb2NrLmdldFZhbHVlKCk7Ci0gICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpBWEJCZWFuSW5mbykgewotICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqIE5PVCBIQU5ETEVEIEpBWEJCZWFuSW5mbyAqKioqKioqKioqKiIpOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgWE1MTWVzc2FnZSkgewotICAgICAgICAgICAgICAgWE1MTWVzc2FnZSB4bWxNZXNzYWdlID0gKFhNTE1lc3NhZ2UpdmFsdWU7Ci0gICAgICAgICAgICAgICAvL1hNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTb3VyY2VSZWFkZXJGYWN0b3J5LmNyZWF0ZVNvdXJjZVJlYWRlcihzb3VyY2UsIHRydWUpOwotICAgICAgICAgICAgICAgLy9YTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICAgICAgICAgLy9kZWNvZGVCb2R5Q29udGVudChyZWFkZXIsIHJlcXVlc3QsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIFVua25vd24gdHlwZSBpbiBCb2R5QmxvY2sgKioqKiogIit2YWx1ZS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcveG1sL1hNTEVQVEZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3htbC9YTUxFUFRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwY2E2MTEuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcveG1sL1hNTEVQVEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0LkVQVEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuaW50ZXJuYWwuSW50ZXJuYWxFbmNvZGVyOwotCi0vKioKLSAqIENoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIHRvIEpheHdzRVBURmFjdG9yeSBvciBzb21ldGhpbmcgZWxzZS4gT1IKLSAqIHNwbGl0IGludG8gbXVsdGlwbGUgZmFjdG9yaWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTEVQVEZhY3RvcnkgZXh0ZW5kcyBFUFRGYWN0b3J5IHsKLSAgICBwdWJsaWMgSW50ZXJuYWxFbmNvZGVyIGdldEludGVybmFsRW5jb2RlcigpOwotICAgIHB1YmxpYyBYTUxFbmNvZGVyIGdldFhNTEVuY29kZXIoKTsKLSAgICBwdWJsaWMgWE1MRGVjb2RlciBnZXRYTUxEZWNvZGVyKCk7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy94bWwvWE1MRW5jb2Rlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcveG1sL1hNTEVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0YjJkMy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy94bWwvWE1MRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5KQVhCQmVhbkluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5KQVhCVHlwZVNlcmlhbGl6ZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5Cb2R5QmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlNlcnZlclJ0RXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFhNTEVuY29kZXIgaW1wbGVtZW50cyBFbmNvZGVyIHsKLQotICAgIC8qCi0gICAgICogQHNlZSBjb20uc3VuLnBlcHQuZW5jb2RpbmcuRW5jb2RlciNlbmNvZGVBbmRTZW5kKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQW5kU2VuZChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgY29tLnN1bi5wZXB0LmVuY29kaW5nLkVuY29kZXIjZW5jb2RlKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIEJ5dGVCdWZmZXIgZW5jb2RlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlcm5hbE1lc3NhZ2UgdG9JbnRlcm5hbE1lc3NhZ2UoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTE1lc3NhZ2UgdG9YTUxNZXNzYWdlKEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVwbGFjZSB0aGUgYm9keSBpbiBTT0FQTWVzc2FnZSB3aXRoIHRoZSBCb2R5QmxvY2sgb2YgSW50ZXJuYWxNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFhNTE1lc3NhZ2UgdG9YTUxNZXNzYWdlKEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UsCi0gICAgICAgICAgICBYTUxNZXNzYWdlIHhtbE1lc3NhZ2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJvZHlCbG9jayBib2R5QmxvY2sgPSBpbnRlcm5hbE1lc3NhZ2UuZ2V0Qm9keSgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYm9keUJsb2NrLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB4bWxNZXNzYWdlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWE1MTWVzc2FnZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoWE1MTWVzc2FnZSl2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmtub3duIG9iamVjdCBpbiBCb2R5QmxvY2s6Iit2YWx1ZS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJ4bWxlbmNvZGVyLmVyciIsIG5ldyBPYmplY3RbXXtlfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3htbC9YTUxNZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9lbmNvZGluZy94bWwvWE1MTWVzc2FnZS5qYXZhCmluZGV4IGEyZmE2OWQuLjY5MWEwZTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2VuY29kaW5nL3htbC9YTUxNZXNzYWdlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZW5jb2RpbmcveG1sL1hNTE1lc3NhZ2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw1MyArMjUsNTEgQEAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy54bWw7CiAKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5NZXNzYWdpbmdFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldC5Db250ZW50VHlwZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5wYWNrYWdpbmcubWltZS5pbnRlcm5ldC5JbnRlcm5ldEhlYWRlcnM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUuaW50ZXJuZXQuTWltZUJvZHlQYXJ0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLmludGVybmV0Lk1pbWVNdWx0aXBhcnQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbC5CeXRlSW5wdXRTdHJlYW07CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbC5CeXRlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQlR5cGVTZXJpYWxpemVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnhtbC5YTUxNZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldTQ29ubmVjdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkJ5dGVBcnJheUJ1ZmZlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkZhc3RJbmZvc2V0UmVmbGVjdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkZhc3RJbmZvc2V0VXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc3RyZWFtaW5nLlhNTFN0cmVhbVdyaXRlckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuTWltZU11bHRpcGFydFBhcnNlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5YTUxIVFRQQmluZGluZ0NvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQWJzdHJhY3RNZXNzYWdlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkVtcHR5TWVzc2FnZUltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWE1MU3RyZWFtUmVhZGVyVG9YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKIGltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgogICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcGVtZW50IFRlYW0KKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBYTUxNZXNzYWdlIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKAotICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5wcm90b2NvbC54bWwiKTsKLQogICAgIC8vIFNvIHRoYXQgU0FBSiByZWdpc3RlcnMgRENIcyBmb3IgTUlNRSB0eXBlcwogICAgIHN0YXRpYyB7CiAgICAgICAgIG5ldyBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLkF0dGFjaG1lbnRQYXJ0SW1wbCgpOwpAQCAtODEsMjcgKzc5LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlNRV9NVUxUSVBBUlRfRkxBRyA9IDI7ICAgICAgIC8vIDAwMDEwCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJX0VOQ09ERURfRkxBRyAgICAgPSAxNjsgICAgICAvLyAxMDAwMAogCi0gICAgcHJpdmF0ZSBmaW5hbCBEYXRhUmVwcmVzZW50YXRpb24gZGF0YTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGVuIEZhc3QgSW5mb3NldCBzaG91bGQgYmUgdXNlZCB0byBzZXJpYWxpemUKLSAgICAgKiB0aGlzIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG1lc3NhZ2UgZnJvbSBhbiBpbnB1dCBzdHJlYW0uIFdoZW4gbWVzc2FnZXMgYXJlCi0gICAgICogcmVjZWl2ZWQsIHRoZXJlJ3MgdHdvIHBhcnRzIC0tIHRoZSB0cmFuc3BvcnQgaGVhZGVycyBhbmQgdGhlCi0gICAgICogbWVzc2FnZSBjb250ZW50IGluIGEgdHJhbnNwb3J0IHNwZWNpZmljIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MTWVzc2FnZShNaW1lSGVhZGVycyBoZWFkZXJzLCBmaW5hbCBJbnB1dFN0cmVhbSBpbikgewotICAgICAgICBTdHJpbmcgY3QgPSBudWxsOwotICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdCA9IGdldENvbnRlbnRUeXBlKGhlYWRlcnMpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZGF0YSA9IGdldERhdGEoY3QsIGluKTsKLSAgICAgICAgLy8gVE9ETyBzaG91bGQgaGVhZGVycyBiZSBzZXQgb24gdGhlIGRhdGE/Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogRmluZHMgaWYgdGhlIHN0cmVhbSBoYXMgc29tZSBjb250ZW50IG9yIG5vdApAQCAtMTA5LDcgKzg2LDcgQEAKICAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gZGF0YQogICAgICAqICAgICAgICAgZWxzZSBzdHJlYW0gdG8gYmUgdXNlZAogICAgICAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaGFzU29tZURhdGEoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gaGFzU29tZURhdGEoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoaW4uYXZhaWxhYmxlKCkgPCAxKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFpbi5tYXJrU3VwcG9ydGVkKCkpIHsKQEAgLTEyNiwyNiArMTAzLDMyIEBACiAgICAgICAgIHJldHVybiBpbjsKICAgICB9CiAKLSAgICBwcml2YXRlIERhdGFSZXByZXNlbnRhdGlvbiBnZXREYXRhKGZpbmFsIFN0cmluZyBjdCwgSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgRGF0YVJlcHJlc2VudGF0aW9uIGRhdGE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBtZXNzYWdlIGdpdmVuIGEgY29udGVudCB0eXBlIGFuZCBhbiBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZShmaW5hbCBTdHJpbmcgY3QsIElucHV0U3RyZWFtIGluKSB7CisgICAgICAgIE1lc3NhZ2UgZGF0YTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGluID0gaGFzU29tZURhdGEoaW4pOwogICAgICAgICAgICAgaWYgKGluID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE51bGxDb250ZW50KCk7CisgICAgICAgICAgICAgICAgZGF0YSA9IE1lc3NhZ2VzLmNyZWF0ZUVtcHR5KFNPQVBWZXJzaW9uLlNPQVBfMTEpOworICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbmV3IENvbnRlbnRUeXBlKGN0KTsKLSAgICAgICAgICAgICAgICBpbnQgY29udGVudFR5cGVJZCA9IGlkZW50aWZ5Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGYXN0SW5mb3NldCA9IChjb250ZW50VHlwZUlkICYgRklfRU5DT0RFRF9GTEFHKSA+IDA7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBuZXcgQ29udGVudFR5cGUoY3QpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50VHlwZUlkID0gaWRlbnRpZnlDb250ZW50VHlwZShjb250ZW50VHlwZSk7CiAgICAgICAgICAgICAgICAgaWYgKChjb250ZW50VHlwZUlkICYgTUlNRV9NVUxUSVBBUlRfRkxBRykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmV3IFhNTE11bHRpUGFydChjdCwgaW4sIGlzRmFzdEluZm9zZXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlSWQgJiBQTEFJTl9YTUxfRkxBRykgIT0gMCB8fCAoY29udGVudFR5cGVJZCAmIEZJX0VOQ09ERURfRkxBRykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmV3IFhNTFNvdXJjZShpbiwgaXNGYXN0SW5mb3NldCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgWE1MTXVsdGlQYXJ0KGN0LCBpbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY29udGVudFR5cGVJZCAmIFBMQUlOX1hNTF9GTEFHKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBNZXNzYWdlcy5jcmVhdGVVc2luZ1BheWxvYWQobmV3IFN0cmVhbVNvdXJjZShpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUFZlcnNpb24uU09BUF8xMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBVbmtub3duQ29udGVudChjdCwgaW4pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBOdWxsQ29udGVudCgpOworICAgICAgICAgICAgICAgIGRhdGEgPSBNZXNzYWdlcy5jcmVhdGVFbXB0eShTT0FQVmVyc2lvbi5TT0FQXzExKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGV4KTsKQEAgLTE1NCwxMDYgKzEzNyw0MyBAQAogICAgIH0KIAogCi0gICAgcHVibGljIFhNTE1lc3NhZ2UoU291cmNlIHNvdXJjZSwgYm9vbGVhbiB1c2VGYXN0SW5mb3NldCkgewotICAgICAgICB0aGlzLmRhdGEgPSAoc291cmNlID09IG51bGwpID8gbmV3IE51bGxDb250ZW50KCkgOiBuZXcgWE1MU291cmNlKHNvdXJjZSk7Ci0gICAgICAgIHRoaXMudXNlRmFzdEluZm9zZXQgPSB1c2VGYXN0SW5mb3NldDsKLQotICAgICAgICB0aGlzLmRhdGEuZ2V0TWltZUhlYWRlcnMoKS5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsCi0gICAgICAgICAgICB1c2VGYXN0SW5mb3NldCA/ICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIgOiAidGV4dC94bWwiKTsKKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlKFNvdXJjZSBzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIChzb3VyY2UgPT0gbnVsbCkgPworICAgICAgICAgICAgTWVzc2FnZXMuY3JlYXRlRW1wdHkoU09BUFZlcnNpb24uU09BUF8xMSkgOgorICAgICAgICAgICAgTWVzc2FnZXMuY3JlYXRlVXNpbmdQYXlsb2FkKHNvdXJjZSwgU09BUFZlcnNpb24uU09BUF8xMSk7CiAgICAgfQogCi0gICAgcHVibGljIFhNTE1lc3NhZ2UoRXhjZXB0aW9uIGVyciwgYm9vbGVhbiB1c2VGYXN0SW5mb3NldCkgewotICAgICAgICB0aGlzLmRhdGEgPSBuZXcgWE1MRXJyKGVycik7Ci0gICAgICAgIHRoaXMudXNlRmFzdEluZm9zZXQgPSB1c2VGYXN0SW5mb3NldDsKLQotICAgICAgICB0aGlzLmRhdGEuZ2V0TWltZUhlYWRlcnMoKS5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsCi0gICAgICAgICAgICB1c2VGYXN0SW5mb3NldCA/ICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIgOiAidGV4dC94bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MTWVzc2FnZShEYXRhU291cmNlIGRzLCBib29sZWFuIHVzZUZhc3RJbmZvc2V0KSB7Ci0gICAgICAgIHRoaXMudXNlRmFzdEluZm9zZXQgPSB1c2VGYXN0SW5mb3NldDsKKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlKERhdGFTb3VyY2UgZHMpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IChkcyA9PSBudWxsKSA/IG5ldyBOdWxsQ29udGVudCgpIDogZ2V0RGF0YShkcy5nZXRDb250ZW50VHlwZSgpLCBkcy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIHJldHVybiAoZHMgPT0gbnVsbCkgPworICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmNyZWF0ZUVtcHR5KFNPQVBWZXJzaW9uLlNPQVBfMTEpIDoKKyAgICAgICAgICAgICAgICBjcmVhdGUoZHMuZ2V0Q29udGVudFR5cGUoKSwgZHMuZ2V0SW5wdXRTdHJlYW0oKSk7CiAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihpb2UpOwogICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gKGRzICE9IG51bGwpID8gZHMuZ2V0Q29udGVudFR5cGUoKSA6IG51bGw7Ci0gICAgICAgIGNvbnRlbnRUeXBlID0gIChjb250ZW50VHlwZSA9PSBudWxsKSA/IGNvbnRlbnRUeXBlID0gInRleHQveG1sIjogY29udGVudFR5cGU7Ci0gICAgICAgIHRoaXMuZGF0YS5nZXRNaW1lSGVhZGVycygpLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwKLSAgICAgICAgICAgICF1c2VGYXN0SW5mb3NldCA/IGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgICAgOiBjb250ZW50VHlwZS5yZXBsYWNlRmlyc3QoInRleHQveG1sIiwgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IikpOwogICAgIH0KIAotICAgIHB1YmxpYyBYTUxNZXNzYWdlKE9iamVjdCBvYmplY3QsIEpBWEJDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQpIHsKLSAgICAgICAgdGhpcy5kYXRhID0gKG9iamVjdCA9PSBudWxsKSA/IG5ldyBOdWxsQ29udGVudCgpIDogbmV3IFhNTEpheGIob2JqZWN0LCBjb250ZXh0KTsKLSAgICAgICAgdGhpcy51c2VGYXN0SW5mb3NldCA9IHVzZUZhc3RJbmZvc2V0OwotCi0gICAgICAgIHRoaXMuZGF0YS5nZXRNaW1lSGVhZGVycygpLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwKLSAgICAgICAgICAgIHVzZUZhc3RJbmZvc2V0ID8gImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IiA6ICJ0ZXh0L3htbCIpOworICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZSBjcmVhdGUoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGYXVsdE1lc3NhZ2UoU09BUFZlcnNpb24uU09BUF8xMSk7CiAgICAgfQogCi0KLSAgICBwdWJsaWMgWE1MTWVzc2FnZShTb3VyY2Ugc291cmNlLCBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gYXR0YWNobWVudHMsIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQpIHsKLSAgICAgICAgaWYgKGF0dGFjaG1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IChzb3VyY2UgPT0gbnVsbCkgPyBuZXcgTnVsbENvbnRlbnQoKSA6IG5ldyBYTUxTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVbmtub3duQ29udGVudChhdHRhY2htZW50cyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBYTUxNdWx0aVBhcnQoc291cmNlLCBhdHRhY2htZW50cywgdXNlRmFzdEluZm9zZXQpOwotICAgICAgICAgICAgfQorICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGVudCB0eXBlIElEIGZyb20gdGhlIGNvbnRlbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Q29udGVudElkKFN0cmluZyBjdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBuZXcgQ29udGVudFR5cGUoY3QpOworICAgICAgICAgICAgcmV0dXJuIGlkZW50aWZ5Q29udGVudFR5cGUoY29udGVudFR5cGUpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZXgpOwogICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy51c2VGYXN0SW5mb3NldCA9IHVzZUZhc3RJbmZvc2V0OwotICAgICAgICB0aGlzLmRhdGEuZ2V0TWltZUhlYWRlcnMoKS5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsCi0gICAgICAgICAgICB1c2VGYXN0SW5mb3NldCA/ICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIgOiAidGV4dC94bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MTWVzc2FnZShPYmplY3Qgb2JqZWN0LCBKQVhCQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gYXR0YWNobWVudHMsIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQpIHsKLSAgICAgICAgaWYgKGF0dGFjaG1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IChvYmplY3QgPT0gbnVsbCkgPyBuZXcgTnVsbENvbnRlbnQoKSA6IG5ldyBYTUxKYXhiKG9iamVjdCwgY29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVW5rbm93bkNvbnRlbnQoYXR0YWNobWVudHMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgWE1MTXVsdGlQYXJ0KEpBWEJUeXBlU2VyaWFsaXplci5zZXJpYWxpemUob2JqZWN0LCBjb250ZXh0KSwgYXR0YWNobWVudHMsIHVzZUZhc3RJbmZvc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudXNlRmFzdEluZm9zZXQgPSB1c2VGYXN0SW5mb3NldDsKLSAgICAgICAgdGhpcy5kYXRhLmdldE1pbWVIZWFkZXJzKCkuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLAotICAgICAgICAgICAgdXNlRmFzdEluZm9zZXQgPyAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiIDogInRleHQveG1sIik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIGVuY29kaW5nIG9mIHRoaXMgbWVzc2FnZSBpcyBGSS4KKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29udGVudCB1c2VzIGZhc3QgaW5mb3NldC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0KCkgewotICAgICAgICByZXR1cm4gZGF0YS5pc0Zhc3RJbmZvc2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBGSSBlbmNvZGluZyBzaG91bGQgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VGYXN0SW5mb3NldCgpIHsKLSAgICAgICAgcmV0dXJuIHVzZUZhc3RJbmZvc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VuZGVyIG9mIHRoaXMgbWVzc2FnZSBhY2NlcHRzIEZJLiBTbG93LCBidXQKLSAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRGYXN0SW5mb3NldCgpIHsKLSAgICAgICAgcmV0dXJuIEZhc3RJbmZvc2V0VXRpbC5pc0Zhc3RJbmZvc2V0QWNjZXB0ZWQoZ2V0TWltZUhlYWRlcnMoKS5nZXRIZWFkZXIoIkFjY2VwdCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU291cmNlIGdldFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGEuZ2V0U291cmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RGF0YVNvdXJjZSgpOworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0KFN0cmluZyBjdCkgeworICAgICAgICByZXR1cm4gKGdldENvbnRlbnRJZChjdCkgJiBGSV9FTkNPREVEX0ZMQUcpICE9IDA7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjYsNyArMTg2LDcgQEAKICAgICAgKiBGSV9FTkNPREVEX0ZMQUcKICAgICAgKgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBpZGVudGlmeUNvbnRlbnRUeXBlKENvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQgaWRlbnRpZnlDb250ZW50VHlwZShDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewogICAgICAgICBTdHJpbmcgcHJpbWFyeSA9IGNvbnRlbnRUeXBlLmdldFByaW1hcnlUeXBlKCk7CiAgICAgICAgIFN0cmluZyBzdWIgPSBjb250ZW50VHlwZS5nZXRTdWJUeXBlKCk7CiAKQEAgLTI4OCwxMyArMjA4LDE3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1hNTFR5cGUoU3RyaW5nIHByaW1hcnksIFN0cmluZyBzdWIpIHsKLSAgICAgICAgcmV0dXJuIChwcmltYXJ5LmVxdWFsc0lnbm9yZUNhc2UoInRleHQiKSB8fCBwcmltYXJ5LmVxdWFsc0lnbm9yZUNhc2UoImFwcGxpY2F0aW9uIikpICYmIHN1Yi5lcXVhbHNJZ25vcmVDYXNlKCJ4bWwiKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNYTUxUeXBlKEBOb3ROdWxsIFN0cmluZyBwcmltYXJ5LCBATm90TnVsbCBTdHJpbmcgc3ViKSB7CisgICAgICAgIHJldHVybiAocHJpbWFyeS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0IikgJiYgc3ViLmVxdWFsc0lnbm9yZUNhc2UoInhtbCIpKQorICAgICAgICAgICAgICAgIHx8IChwcmltYXJ5LmVxdWFsc0lnbm9yZUNhc2UoImFwcGxpY2F0aW9uIikgJiYgc3ViLmVxdWFsc0lnbm9yZUNhc2UoInhtbCIpKQorICAgICAgICAgICAgICAgIHx8IChwcmltYXJ5LmVxdWFsc0lnbm9yZUNhc2UoImFwcGxpY2F0aW9uIikgJiYgc3ViLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIit4bWwiKSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzWE1MVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInRleHQveG1sIikgfHwKLSAgICAgICAgICAgIHR5cGUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi94bWwiKTsKKyAgICAgICAgU3RyaW5nIGxvd2VyVHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuIGxvd2VyVHlwZS5zdGFydHNXaXRoKCJ0ZXh0L3htbCIpCisgICAgICAgICAgICAgICAgfHwgbG93ZXJUeXBlLnN0YXJ0c1dpdGgoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgICAgICAgICAgfHwgKGxvd2VyVHlwZS5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi8iKSAmJiAobG93ZXJUeXBlLmluZGV4T2YoIit4bWwiKSAhPSAtMSkpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0VHlwZShTdHJpbmcgcHJpbWFyeSwgU3RyaW5nIHN1YikgewpAQCAtMzA1LDU5OCArMjI5LDE4OSBAQAogICAgICAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0Iik7CiAgICAgfQogCisKICAgICAvKioKLSAgICAgKiBJZGVhbGx5IHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBqdXN0IGJlZm9yZSB3cml0aW5nIHRoZSBtZXNzYWdlCisgICAgICogQWNjZXNzIGEge0BsaW5rIE1lc3NhZ2V9IGFzIGEge0BsaW5rIERhdGFTb3VyY2V9LgorICAgICAqIDxwPgorICAgICAqIEEge0BsaW5rIE1lc3NhZ2V9IGltcGxlbWVudGF0aW9uIHdpbGwgaW1wbGVtZW50IHRoaXMgaWYgdGhlCisgICAgICogbWVzc2FnZXMgaXMgdG8gYmUgYWNjZXNzIGFzIGRhdGEgc291cmNlLgorICAgICAqIDxwPgorICAgICAqIFRPRE86IGNvbnNpZGVyIHB1dHRpbmcgYXMgcGFydCBvZiB0aGUgQVBJLgogICAgICAqLwotICAgIHB1YmxpYyBNaW1lSGVhZGVycyBnZXRNaW1lSGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIGRhdGEuZ2V0TWltZUhlYWRlcnMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoTWltZUhlYWRlcnMgaGVhZGVycykgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBoZWFkZXJzLmdldEhlYWRlcigiQ29udGVudC1UeXBlIik7Ci0gICAgICAgIHJldHVybiAodmFsdWVzID09IG51bGwpID8gbnVsbCA6IHZhbHVlc1swXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIGRhdGEuZ2V0U3RhdHVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBkYXRhLndyaXRlVG8ob3V0LHVzZUZhc3RJbmZvc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU291cmNlIGdldFBheWxvYWQoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhLmdldFBheWxvYWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGdldEF0dGFjaG1lbnRzKCkgewotICAgICAgICByZXR1cm4gZGF0YS5nZXRBdHRhY2htZW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGF5bG9hZChKQVhCQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIEdldCBhIGNvcHkgb2YgU291cmNlIHVzaW5nIGdldFBheWxvYWQoKSBhbmQgdXNlIGl0IHRvIGRlc2VyaWFsaXplCi0gICAgICAgIC8vIHRvIEpBWEIgb2JqZWN0Ci0gICAgICAgIHJldHVybiBKQVhCVHlwZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZ2V0UGF5bG9hZCgpLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIG9wZXJhdGlvbnMgYXZhaWxhYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCBpbi1tZW1vcnkgZGF0YSByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBEYXRhUmVwcmVzZW50YXRpb24geworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE1lc3NhZ2VEYXRhU291cmNlIHsKICAgICAgICAgLyoqCi0gICAgICAgICAqIENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFR5cGljYWxseSBmcm9tIFhNTExvZ2ljYWxNZXNzYWdlSW1wbAorICAgICAgICAgKiBDaGVjayBpZiB0aGUgZGF0YSBzb3VyY2UgaGFzIGJlZW4gY29uc3VtZWQuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBvZiB0aGUgZGF0YSBzb3VyY2UgaGFzIGJlZW4gY29uc3VtZWQsIG90aGVyd2lzZSBmYWxzZS4KICAgICAgICAgICovCi0gICAgICAgIGFic3RyYWN0IFNvdXJjZSBnZXRQYXlsb2FkKCk7CisgICAgICAgIGJvb2xlYW4gaGFzVW5jb25zdW1lZERhdGFTb3VyY2UoKTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogU2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuIE9uY2UgdGhpcyBpcyBjYWxsZWQsIGRvbid0IHVzZSB0aGlzIG9iamVjdCBhbnltb3JlCisgICAgICAgICAqIEdldCB0aGUgZGF0YSBzb3VyY2UuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGRhdGEgc291cmNlLgogICAgICAgICAgKi8KLSAgICAgICAgYWJzdHJhY3Qgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQsYm9vbGVhbiB1c2VGYXN0SW5mb3NldCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIHdoZW5ldmVyIHRoZSB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZQotICAgICAgICAgKiBpcyBhIEZhc3QgSW5mb3NldCBzdHJlYW0uCi0gICAgICAgICAqLwotICAgICAgICBhYnN0cmFjdCBib29sZWFuIGlzRmFzdEluZm9zZXQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuIE9uY2UgdGhpcyBpcyBjYWxsZWQsIGRvbid0IHVzZSB0aGlzIG9iamVjdCBhbnltb3JlCi0gICAgICAgICAqLwotICAgICAgICBhYnN0cmFjdCBTb3VyY2UgZ2V0U291cmNlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLiBPbmNlIHRoaXMgaXMgY2FsbGVkLCBkb24ndCB1c2UgdGhpcyBvYmplY3QgYW55bW9yZQotICAgICAgICAgKi8KLSAgICAgICAgYWJzdHJhY3QgRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLiBPbmNlIHRoaXMgaXMgY2FsbGVkLCBkb24ndCB1c2UgdGhpcyBvYmplY3QgYW55bW9yZQotICAgICAgICAgKi8KLSAgICAgICAgYWJzdHJhY3QgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGdldEF0dGFjaG1lbnRzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3VsZCBjb250YWluIENvbnRlbnQtVHlwZSBmb3IgdGhpcyBtZXNzYWdlLgotICAgICAgICAgKi8KLSAgICAgICAgYWJzdHJhY3QgTWltZUhlYWRlcnMgZ2V0TWltZUhlYWRlcnMoKTsKLSAgICAgICAgaW50IGdldFN0YXR1cygpIHsKLSAgICAgICAgICAgIHJldHVybiBXU0Nvbm5lY3Rpb24uT0s7Ci0gICAgICAgIH0KKyAgICAgICAgRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCk7CiAgICAgfQogCiAKICAgICAvKioKLSAgICAgKiBEYXRhIHJlcHJlc2VudGVkIGFzIGEgbXVsdGktcGFydCBNSU1FIG1lc3NhZ2UuIEl0IGFsc28gaGFzIFhNTCBhcwotICAgICAqIHJvb3QgcGFydAorICAgICAqIERhdGEgcmVwcmVzZW50ZWQgYXMgYSBtdWx0aS1wYXJ0IE1JTUUgbWVzc2FnZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcm9vdCBwYXJ0IG1heSBiZSBhbiBYTUwgb3IgYW4gRkkgZG9jdW1lbnQuCiAgICAgICoKICAgICAgKiBUaGlzIGNsYXNzIHBhcnNlcyB7QGxpbmsgTWltZU11bHRpcGFydH0gbGF6aWx5LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFhNTE11bHRpUGFydCBleHRlbmRzIERhdGFSZXByZXNlbnRhdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgRGF0YVNvdXJjZSBkYXRhU291cmNlOwotICAgICAgICBwcml2YXRlIE1pbWVNdWx0aXBhcnQgbXVsdGlwYXJ0OwotICAgICAgICBwcml2YXRlIFhNTFNvdXJjZSB4bWxTb3VyY2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0OwotICAgICAgICBwcml2YXRlIGZpbmFsIE1pbWVIZWFkZXJzIGhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFhNTE11bHRpUGFydCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZUltcGwgaW1wbGVtZW50cyBNZXNzYWdlRGF0YVNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRGF0YVNvdXJjZSBkYXRhU291cmNlOworICAgICAgICBwcml2YXRlIE1pbWVNdWx0aXBhcnRQYXJzZXIgbXBwOwogCi0gICAgICAgIHB1YmxpYyBYTUxNdWx0aVBhcnQoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlLCBmaW5hbCBJbnB1dFN0cmVhbSBpcywgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0KSB7Ci0gICAgICAgICAgICB0aGlzLmlzRmFzdEluZm9zZXQgPSBpc0Zhc3RJbmZvc2V0OwotICAgICAgICAgICAgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKKyAgICAgICAgcHVibGljIFhNTE11bHRpUGFydChmaW5hbCBTdHJpbmcgY29udGVudFR5cGUsIGZpbmFsIElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgICAgICBzdXBlcihTT0FQVmVyc2lvbi5TT0FQXzExKTsKKyAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBjcmVhdGVEYXRhU291cmNlKGNvbnRlbnRUeXBlLCBpcyk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgWE1MTXVsdGlQYXJ0KFNvdXJjZSBzb3VyY2UsIGZpbmFsIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRzLCBib29sZWFuIGlzRmFzdEluZm9zZXQpIHsKLSAgICAgICAgICAgIHRoaXMuaXNGYXN0SW5mb3NldCA9IGlzRmFzdEluZm9zZXQ7Ci0gICAgICAgICAgICBtdWx0aXBhcnQgPSBuZXcgTWltZU11bHRpcGFydCgicmVsYXRlZCIpOwotICAgICAgICAgICAgbXVsdGlwYXJ0LmdldENvbnRlbnRUeXBlKCkuc2V0UGFyYW1ldGVyKCJ0eXBlIiwgInRleHQveG1sIik7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZXMgUHJpbWFyeSBwYXJ0Ci0gICAgICAgICAgICBCeXRlT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlT3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBuZXcgWE1MU291cmNlKHNvdXJjZSkud3JpdGVUbyhib3MsIGlzRmFzdEluZm9zZXQpOwotICAgICAgICAgICAgSW50ZXJuZXRIZWFkZXJzIGhlYWRlcnMgPSBuZXcgSW50ZXJuZXRIZWFkZXJzKCk7Ci0gICAgICAgICAgICBoZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwKLSAgICAgICAgICAgICAgICBpc0Zhc3RJbmZvc2V0ID8gImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IiA6ICJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgTWltZUJvZHlQYXJ0IHJvb3RQYXJ0ID0gbmV3IE1pbWVCb2R5UGFydChoZWFkZXJzLCBib3MuZ2V0Qnl0ZXMoKSxib3MuZ2V0Q291bnQoKSk7Ci0gICAgICAgICAgICBtdWx0aXBhcnQuYWRkQm9keVBhcnQocm9vdFBhcnQsIDApOwotCi0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgRGF0YUhhbmRsZXI+IGUgOiBhdHRzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBNaW1lQm9keVBhcnQgcGFydCA9IG5ldyBNaW1lQm9keVBhcnQoKTsKLSAgICAgICAgICAgICAgICBwYXJ0LnNldERhdGFIYW5kbGVyKGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KHBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhNTE11bHRpUGFydChEYXRhU291cmNlIGRhdGFTb3VyY2UsIGJvb2xlYW4gaXNGYXN0SW5mb3NldCkgeworICAgICAgICBwdWJsaWMgWE1MTXVsdGlQYXJ0KERhdGFTb3VyY2UgZGF0YVNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoU09BUFZlcnNpb24uU09BUF8xMSk7CiAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlOwotICAgICAgICAgICAgdGhpcy5pc0Zhc3RJbmZvc2V0ID0gaXNGYXN0SW5mb3NldDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmFzdEluZm9zZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNGYXN0SW5mb3NldDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtdWx0aXBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVJvb3RQYXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGFydC53cml0ZVRvKGJvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvcy5uZXdJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChNZXNzYWdpbmdFeGNlcHRpb24gbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MTWVzc2FnZUV4Y2VwdGlvbigieG1sLmdldC5kcy5lcnIiLG1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTE1lc3NhZ2VFeGNlcHRpb24oInhtbC5nZXQuZHMuZXJyIixpb2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXVsdGlwYXJ0LmdldENvbnRlbnRUeXBlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGFzc2VydCBkYXRhU291cmNlICE9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZGF0YVNvdXJjZTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgTWltZUJvZHlQYXJ0IGdldFJvb3RQYXJ0KCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0VG9NdWx0aXBhcnQoKTsKLSAgICAgICAgICAgICAgICBDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG11bHRpcGFydC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydFBhcmFtID0gY29udGVudFR5cGUuZ2V0UGFyYW1ldGVyKCJzdGFydCIpOwotICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCBzb3VyY2VQYXJ0ID0gKHN0YXJ0UGFyYW0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyAoTWltZUJvZHlQYXJ0KW11bHRpcGFydC5nZXRCb2R5UGFydCgwKQotICAgICAgICAgICAgICAgICAgICA6IChNaW1lQm9keVBhcnQpbXVsdGlwYXJ0LmdldEJvZHlQYXJ0KHN0YXJ0UGFyYW0pOwotICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VQYXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxNZXNzYWdlRXhjZXB0aW9uKCJ4bWwuZ2V0LnNvdXJjZS5lcnIiLGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZXBsYWNlUm9vdFBhcnQoYm9vbGVhbiB1c2VGYXN0SW5mb3NldCkgewotICAgICAgICAgICAgaWYgKHhtbFNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNaW1lQm9keVBhcnQgc291cmNlUGFydCA9IGdldFJvb3RQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGN0eXBlID0gc291cmNlUGFydC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIG11bHRpcGFydC5yZW1vdmVCb2R5UGFydChzb3VyY2VQYXJ0KTsKLQotICAgICAgICAgICAgICAgIEJ5dGVPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB4bWxTb3VyY2Uud3JpdGVUbyhib3MsIHVzZUZhc3RJbmZvc2V0KTsKLSAgICAgICAgICAgICAgICBJbnRlcm5ldEhlYWRlcnMgaGVhZGVycyA9IG5ldyBJbnRlcm5ldEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgdXNlRmFzdEluZm9zZXQgPyAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiIDogY3R5cGUpOwotCi0gICAgICAgICAgICAgICAgc291cmNlUGFydCA9IG5ldyBNaW1lQm9keVBhcnQoaGVhZGVycywgYm9zLmdldEJ5dGVzKCksYm9zLmdldENvdW50KCkpOwotICAgICAgICAgICAgICAgIG11bHRpcGFydC5hZGRCb2R5UGFydChzb3VyY2VQYXJ0LCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MTWVzc2FnZUV4Y2VwdGlvbigieG1sLmdldC5zb3VyY2UuZXJyIixleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY29udmVydFRvTXVsdGlwYXJ0KCkgewotICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2UgIT0gbnVsbCkgeworICAgICAgICBwcml2YXRlIHZvaWQgY29udmVydERhdGFTb3VyY2VUb01lc3NhZ2UoKSB7CisgICAgICAgICAgICBpZiAobXBwID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtdWx0aXBhcnQgPSBuZXcgTWltZU11bHRpcGFydChkYXRhU291cmNlLG51bGwpOwotICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTE1lc3NhZ2VFeGNlcHRpb24oInhtbC5nZXQuc291cmNlLmVyciIsZXgpOworICAgICAgICAgICAgICAgICAgICBtcHAgPSBuZXcgTWltZU11bHRpcGFydFBhcnNlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlLmdldElucHV0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihpb2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHJvb3QgcGFydCBvZiB0aGUgTUlNRSBtZXNzYWdlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU291cmNlIGdldFNvdXJjZSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gWE1MU291cmNlLCByZXR1cm4gdGhhdAotICAgICAgICAgICAgICAgIGlmICh4bWxTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4geG1sU291cmNlLmdldFBheWxvYWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHBhcnNlIE1JTUUgcGFja2FnZSBhbmQgZmluZCByb290IHBhcnQKLSAgICAgICAgICAgICAgICBjb252ZXJ0VG9NdWx0aXBhcnQoKTsKLSAgICAgICAgICAgICAgICBNaW1lQm9keVBhcnQgc291cmNlUGFydCA9IGdldFJvb3RQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgQ29udGVudFR5cGUgY3R5cGUgPSBuZXcgQ29udGVudFR5cGUoc291cmNlUGFydC5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBjdHlwZS5nZXRCYXNlVHlwZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgU3RyZWFtU291cmNlIG9yIEZhc3RJbmZvc2V0U291cmNlIGRlcGVuZGluZyBvbiB0eXBlCi0gICAgICAgICAgICAgICAgaWYgKGlzWE1MVHlwZShiYXNlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2Uoc291cmNlUGFydC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNGYXN0SW5mb3NldFR5cGUoYmFzZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGYXN0SW5mb3NldFJlZmxlY3Rpb24uRmFzdEluZm9zZXRTb3VyY2VfbmV3KAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUGFydC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxNZXNzYWdlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWwucm9vdC5wYXJ0LmludmFsaWQuQ29udGVudC1UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2Jhc2VUeXBlfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTE1lc3NhZ2VFeGNlcHRpb24oInhtbC5nZXQuc291cmNlLmVyciIsZXgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxNZXNzYWdlRXhjZXB0aW9uKCJ4bWwuZ2V0LnNvdXJjZS5lcnIiLGlvZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU291cmNlIGdldFBheWxvYWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgYSBzb3VyY2UgaGFzIGJlZW4gc2V0LCBlbnN1cmUgTUlNRSBwYXJzaW5nCi0gICAgICAgICAgICAgICAgaWYgKHhtbFNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb011bHRpcGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRyeSB0byB1c2UgZGF0YVNvdXJjZSB3aGVuZXZlciBwb3NzaWJsZQotICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYWxyZWFkeSBlbmNvZGVkIGNvcnJlY3RseSwganVzdCBjb3B5IHRoZSBieXRlcwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYXN0SW5mb3NldCA9PSB1c2VGYXN0SW5mb3NldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBkYXRhU291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBpcy5yZWFkKGJ1ZikpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgIC8vIHdlJ3JlIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIE1JTUUgYW5kIGNyZWF0ZSBzb3VyY2UgZm9yIHJvb3QgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU291cmNlID0gbmV3IFhNTFNvdXJjZShnZXRTb3VyY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBGaW5hbGx5LCBwb3NzaWJseSByZS1lbmNvZGUgcm9vdCBwYXJ0IGFuZCB3cml0ZSBpdCBvdXQKLSAgICAgICAgICAgICAgICByZXBsYWNlUm9vdFBhcnQodXNlRmFzdEluZm9zZXQpOwotICAgICAgICAgICAgICAgIG11bHRpcGFydC53cml0ZVRvKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBnZXRBdHRhY2htZW50cygpIHsKLSAgICAgICAgICAgIC8vIElmIGEgc291cmNlIGhhcyBiZWVuIHNldCwgZW5zdXJlIE1JTUUgcGFyc2luZwotICAgICAgICAgICAgaWYgKHhtbFNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udmVydFRvTXVsdGlwYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCByb290UGFydCA9IGdldFJvb3RQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KCk7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbXVsdGlwYXJ0LmdldENvdW50KCk7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpPTA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCBwYXJ0ID0gbXVsdGlwYXJ0LmdldEJvZHlQYXJ0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFydCAhPSByb290UGFydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChwYXJ0LmdldENvbnRlbnRJRCgpLCBwYXJ0LmdldERhdGFIYW5kbGVyKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MTWVzc2FnZUV4Y2VwdGlvbigieG1sLmdldC5zb3VyY2UuZXJyIixleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNaW1lSGVhZGVycyBnZXRNaW1lSGVhZGVycygpIHsKLSAgICAgICAgICAgIGhlYWRlcnMucmVtb3ZlSGVhZGVyKCJDb250ZW50LVR5cGUiKTsKLSAgICAgICAgICAgIGlmIChkYXRhU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgZGF0YVNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG11bHRpcGFydCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgbXVsdGlwYXJ0LmdldENvbnRlbnRUeXBlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnM7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERhdGEgcmVwcmVzZW50ZWQgYXMge0BsaW5rIFNvdXJjZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBYTUxTb3VyY2UgZXh0ZW5kcyBEYXRhUmVwcmVzZW50YXRpb24gewotCi0gICAgICAgIHByaXZhdGUgU291cmNlIHNvdXJjZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRmFzdEluZm9zZXQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWltZUhlYWRlcnMgaGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotCi0gICAgICAgIHB1YmxpYyBYTUxTb3VyY2UoSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gaXNGYXN0SW5mb3NldCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IGlzRmFzdEluZm9zZXQgPwotICAgICAgICAgICAgICAgIEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5GYXN0SW5mb3NldFNvdXJjZV9uZXcoaW4pCi0gICAgICAgICAgICAgICAgOiBuZXcgU3RyZWFtU291cmNlKGluKTsKLSAgICAgICAgICAgIHRoaXMuaXNGYXN0SW5mb3NldCA9IGlzRmFzdEluZm9zZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgWE1MU291cmNlKFNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwotICAgICAgICAgICAgdGhpcy5pc0Zhc3RJbmZvc2V0ID0KLSAgICAgICAgICAgICAgICAoKHNvdXJjZSAhPSBudWxsKT8oc291cmNlLmdldENsYXNzKCkgPT0gRmFzdEluZm9zZXRSZWZsZWN0aW9uLmZpRmFzdEluZm9zZXRTb3VyY2UpOmZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmFzdEluZm9zZXQoKSB7Ci0gICAgICAgICAgIHJldHVybiBpc0Zhc3RJbmZvc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlcmUgaXMgYSBCeXRlSW5wdXRTdHJlYW0gYXZhaWxhYmxlLCB0aGVuIHdyaXRlIGl0IHRvIHRoZSBvdXRwdXQKLSAgICAgICAgICogc3RyZWFtLiBPdGhlcndpc2UsIHVzZSBUcmFuc2Zvcm1lciB0byB3cml0ZSBTb3VyY2UgdG8gb3V0cHV0IHN0cmVhbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiB1c2VGYXN0SW5mb3NldCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjYW5Bdm9pZFRyYW5zZm9ybSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTdHJlYW1Tb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaXMgPSAoKFN0cmVhbVNvdXJjZSlzb3VyY2UpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHVzZSBvZiBGSSBpcyByZXF1ZXN0ZWQsIG5lZWQgdG8gdHJhbnNjb2RlCi0gICAgICAgICAgICAgICAgICAgIGNhbkF2b2lkVHJhbnNmb3JtID0gIXVzZUZhc3RJbmZvc2V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzb3VyY2UuZ2V0Q2xhc3MoKSA9PSBGYXN0SW5mb3NldFJlZmxlY3Rpb24uZmlGYXN0SW5mb3NldFNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBpcyA9IEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5GYXN0SW5mb3NldFNvdXJjZV9nZXRJbnB1dFN0cmVhbShzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB1c2Ugb2YgRkkgaXMgbm90IHJlcXVlc3RlZCwgbmVlZCB0byB0cmFuc2NvZGUKLSAgICAgICAgICAgICAgICAgICAgY2FuQXZvaWRUcmFuc2Zvcm0gPSB1c2VGYXN0SW5mb3NldDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FuQXZvaWRUcmFuc2Zvcm0gJiYgaXMgIT0gbnVsbCAmJiBpcyBpbnN0YW5jZW9mIEJ5dGVJbnB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICBCeXRlSW5wdXRTdHJlYW0gYmlzID0gKEJ5dGVJbnB1dFN0cmVhbSlpczsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gYmlzLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYpOwotICAgICAgICAgICAgICAgICAgICBiaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzZSBhbiBlZmZpY2llbnQgdHJhbnNmb3JtZXIgZnJvbSBTQUFKIHRoYXQga25vd3MgaG93IHRvIG9wdGltYWxseQotICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRvIEZJIHJlc3VsdHMKLSAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFhtbFV0aWwubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLAotICAgICAgICAgICAgICAgICAgICB1c2VGYXN0SW5mb3NldCA/IEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5GYXN0SW5mb3NldFJlc3VsdF9uZXcob3V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBTdHJlYW1SZXN1bHQob3V0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTb3VyY2UgZ2V0U291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3RyZWFtU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSAoKFN0cmVhbVNvdXJjZSlzb3VyY2UpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZS5nZXRDbGFzcygpID09IEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5maUZhc3RJbmZvc2V0U291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBGYXN0SW5mb3NldFJlZmxlY3Rpb24uRmFzdEluZm9zZXRTb3VyY2VfZ2V0SW5wdXRTdHJlYW0oc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBzb3VyY2UgdG8gcmVzdWx0IHJlc3BlY3RpbmcgZGVzaXJlZCBlbmNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJhYiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgaXNGYXN0SW5mb3NldCgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXN0SW5mb3NldFJlZmxlY3Rpb24uRmFzdEluZm9zZXRSZXN1bHRfbmV3KGJhYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBTdHJlYW1SZXN1bHQoYmFiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiYWIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYWIubmV3SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRmFzdEluZm9zZXQoKSA/ICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIgOiAidGV4dC94bWwiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICogVXN1YWxseSBjYWxsZWQgZnJvbSBsb2dpY2FsIGhhbmRsZXIKLSAgICAgICAgKiBJZiB0aGVyZSBpcyBhIERPTVNvdXJjZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSwgcmV0dXJuIGEgY29weSBvZgotICAgICAgICAqIHRoZSBleGlzdGluZyBzb3VyY2UuCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTb3VyY2UgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgRE9NU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFN0cmVhbVNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBpcyA9ICgoU3RyZWFtU291cmNlKXNvdXJjZSkuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlLmdldENsYXNzKCkgPT0gRmFzdEluZm9zZXRSZWZsZWN0aW9uLmZpRmFzdEluZm9zZXRTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaXMgPSBGYXN0SW5mb3NldFJlZmxlY3Rpb24uRmFzdEluZm9zZXRTb3VyY2VfZ2V0SW5wdXRTdHJlYW0oc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCAmJiBpcyBpbnN0YW5jZW9mIEJ5dGVJbnB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICBCeXRlSW5wdXRTdHJlYW0gYmlzID0gKEJ5dGVJbnB1dFN0cmVhbSlpczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBiaXMuZ2V0Qnl0ZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICBiaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRmFzdEluZm9zZXQgPwotICAgICAgICAgICAgICAgICAgICAgICAgRmFzdEluZm9zZXRSZWZsZWN0aW9uLkZhc3RJbmZvc2V0U291cmNlX25ldyhpcykKLSAgICAgICAgICAgICAgICAgICAgOiBuZXcgU3RyZWFtU291cmNlKGJhaXMpOwotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQ29weSBzb3VyY2UgdG8gcmVzdWx0IHJlc3BlY3RpbmcgZGVzaXJlZCBlbmNvZGluZwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBiYWIgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBYbWxVdGlsLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoaXMgdG8gd29yayB3aXRoIGVtcHR5IHNvdXJjZS4gSXMgaXQgSkFYUCBidWcgPwotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgb3Byb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICBvcHJvcHMucHV0KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0aWVzKG9wcm9wcyk7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgaXNGYXN0SW5mb3NldCA/Ci0gICAgICAgICAgICAgICAgICAgIEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5GYXN0SW5mb3NldFJlc3VsdF9uZXcoYmFiKQotICAgICAgICAgICAgICAgICAgICA6IG5ldyBTdHJlYW1SZXN1bHQoYmFiKSk7Ci0gICAgICAgICAgICAgICAgYmFiLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZXQgaW50ZXJuYWwgc291cmNlCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gYmlzID0gKGJhYi5zaXplKCkgPT0gMCkgPyBudWxsIDogYmFiLm5ld0lucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgc291cmNlID0gaXNGYXN0SW5mb3NldCA/Ci0gICAgICAgICAgICAgICAgICAgIEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5GYXN0SW5mb3NldFNvdXJjZV9uZXcoYmlzKQotICAgICAgICAgICAgICAgICAgICA6IG5ldyBTdHJlYW1Tb3VyY2UoYmlzKTsKLQotICAgICAgICAgICAgICAgIC8vIFJldHVybiBmcmVzaCBzb3VyY2UgYmFjayB0byBoYW5kbGVyCi0gICAgICAgICAgICAgICAgYmlzID0gYmFiLm5ld0lucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzRmFzdEluZm9zZXQgPwotICAgICAgICAgICAgICAgICAgICBGYXN0SW5mb3NldFJlZmxlY3Rpb24uRmFzdEluZm9zZXRTb3VyY2VfbmV3KGJpcykKLSAgICAgICAgICAgICAgICAgICAgOiBuZXcgU3RyZWFtU291cmNlKGJpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gZ2V0QXR0YWNobWVudHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE1pbWVIZWFkZXJzIGdldE1pbWVIZWFkZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnM7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERhdGEgcmVwcmVzZW50ZWQgYXMgYSBKQVhCIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFhNTEpheGIgZXh0ZW5kcyBEYXRhUmVwcmVzZW50YXRpb24gewotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBvYmplY3Q7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSkFYQkNvbnRleHQgamF4YkNvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWltZUhlYWRlcnMgaGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotCi0gICAgICAgIHB1YmxpYyBYTUxKYXhiKE9iamVjdCBvYmplY3QsIEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICAgICAgICAgIHRoaXMuamF4YkNvbnRleHQgPSBqYXhiQ29udGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiB1c2VGYXN0SW5mb3NldCkgewotICAgICAgICAgICAgaWYgKHVzZUZhc3RJbmZvc2V0KSB7Ci0gICAgICAgICAgICAgICAgSkFYQlR5cGVTZXJpYWxpemVyLnNlcmlhbGl6ZURvY3VtZW50KG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyRmFjdG9yeS5jcmVhdGVGSVN0cmVhbVdyaXRlcihvdXQpLAotICAgICAgICAgICAgICAgICAgICBqYXhiQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBKQVhCVHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplKG9iamVjdCwgb3V0LCBqYXhiQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRmFzdEluZm9zZXQoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09uZVdheShATm90TnVsbCBXU0RMUG9ydCBwb3J0KSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgU291cmNlIGdldFNvdXJjZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBKQVhCVHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplKG9iamVjdCwgamF4YkNvbnRleHQpOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgICAgICAgICAgQnl0ZU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBKQVhCVHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplKG9iamVjdCwgYm9zLCBqYXhiQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBib3MubmV3SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRmFzdEluZm9zZXQoKSA/ICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIgOiAidGV4dC94bWwiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07CisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICAvKgotICAgICAgICAqIFVzdWFsbHkgY2FsbGVkIGZyb20gbG9naWNhbCBoYW5kbGVyCi0gICAgICAgICogSWYgdGhlcmUgaXMgYSBET01Tb3VyY2UsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsIHJldHVybiBhIGNvcHkgb2YKLSAgICAgICAgKiB0aGUgZXhpc3Rpbmcgc291cmNlLgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU291cmNlIGdldFBheWxvYWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlKCk7CisgICAgICAgIHB1YmxpYyBIZWFkZXJMaXN0IGdldEhlYWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRlckxpc3QoKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gZ2V0QXR0YWNobWVudHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBdHRhY2htZW50U2V0IGdldEF0dGFjaG1lbnRzKCkgeworICAgICAgICAgICAgY29udmVydERhdGFTb3VyY2VUb01lc3NhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWE1MQXR0YWNobWVudFNldChtcHApOwogICAgICAgICB9CiAKLSAgICAgICAgTWltZUhlYWRlcnMgZ2V0TWltZUhlYWRlcnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGVhZGVyczsKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTG9jYWxQYXJ0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBheWxvYWROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BheWxvYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb3VyY2UgcmVhZFBheWxvYWRBc1NvdXJjZSgpIHsKKyAgICAgICAgICAgIGNvbnZlcnREYXRhU291cmNlVG9NZXNzYWdlKCk7CisgICAgICAgICAgICByZXR1cm4gbXBwLmdldFJvb3RQYXJ0KCkuYXNTb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZFBheWxvYWQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNvbnZlcnREYXRhU291cmNlVG9NZXNzYWdlKCk7CisgICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5jcmVhdGUoIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG1wcC5nZXRSb290UGFydCgpLmFzSW5wdXRTdHJlYW0oKSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVBheWxvYWRUbyhYTUxTdHJlYW1Xcml0ZXIgc3cpIHsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclRvWE1MU3RyZWFtV3JpdGVyIGMgPSBuZXcgWE1MU3RyZWFtUmVhZGVyVG9YTUxTdHJlYW1Xcml0ZXIoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHIgPSByZWFkUGF5bG9hZCgpOworICAgICAgICAgICAgICAgIGMuYnJpZGdlKHIsIHN3KTsKKyAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LnJlY3ljbGUocik7CisgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVBheWxvYWRUbyhDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBib29sZWFuIGZyYWdtZW50KXsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc3NhZ2UgY29weSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzVW5jb25zdW1lZERhdGFTb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbXBwID09IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFhNTEF0dGFjaG1lbnRTZXQgaW1wbGVtZW50cyBBdHRhY2htZW50U2V0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEF0dGFjaG1lbnQ+IGF0dE1hcDsKKworICAgICAgICBwdWJsaWMgWE1MQXR0YWNobWVudFNldChNaW1lTXVsdGlwYXJ0UGFyc2VyIG1wcCkgeworICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgYXR0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBdHRhY2htZW50PigpOworICAgICAgICAgICAgYXR0TWFwLnB1dEFsbChtcHAuZ2V0QXR0YWNobWVudFBhcnRzKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGF0dGFjaG1lbnQgYnkgdGhlIGNvbnRlbnQgSUQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbnVsbAorICAgICAgICAgKiAgICAgICAgIGlmIG5vIHN1Y2ggYXR0YWNobWVudCBleGlzdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBdHRhY2htZW50IGdldChTdHJpbmcgY29udGVudElkKSB7CisgICAgICAgICAgICByZXR1cm4gYXR0TWFwLmdldChjb250ZW50SWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRNYXAuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciBhIHNldCBvZiBlbGVtZW50cyBvZiB0eXBlIFQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8QXR0YWNobWVudD4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gYXR0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoQXR0YWNobWVudCBhdHQpIHsKKyAgICAgICAgICAgIGF0dE1hcC5wdXQoYXR0LmdldENvbnRlbnRJZCgpLCBhdHQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGYXVsdE1lc3NhZ2UgZXh0ZW5kcyBFbXB0eU1lc3NhZ2VJbXBsIHsKKworICAgICAgICBwdWJsaWMgRmF1bHRNZXNzYWdlKFNPQVBWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmF1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogICAgIH0KIAogCkBAIC05MDYsMTk5ICs0MjEsMTMyIEBACiAgICAgICoKICAgICAgKiBUaGlzIGNvdWxkIGJlIHVzZWQgdG8gcmVwcmVzZW50IGltYWdlL2pwZWcgZXRjCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbmtub3duQ29udGVudCBleHRlbmRzIERhdGFSZXByZXNlbnRhdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGN0OwotICAgICAgICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGluOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1pbWVNdWx0aXBhcnQgbXVsdGlwYXJ0OwotICAgICAgICBwcml2YXRlIGZpbmFsIE1pbWVIZWFkZXJzIGhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVua25vd25Db250ZW50IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlSW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEYXRhU291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEYXRhU291cmNlIGRzOworICAgICAgICBwcml2YXRlIGZpbmFsIEhlYWRlckxpc3QgaGVhZGVyTGlzdDsKIAotICAgICAgICBwdWJsaWMgVW5rbm93bkNvbnRlbnQoU3RyaW5nIGN0LCBJbnB1dFN0cmVhbSBpbikgewotICAgICAgICAgICAgdGhpcy5jdCA9IGN0OwotICAgICAgICAgICAgdGhpcy5pbiA9IGluOwotICAgICAgICAgICAgdGhpcy5tdWx0aXBhcnQgPSBudWxsOworICAgICAgICBwdWJsaWMgVW5rbm93bkNvbnRlbnQoZmluYWwgU3RyaW5nIGN0LCBmaW5hbCBJbnB1dFN0cmVhbSBpbikgeworICAgICAgICAgICAgdGhpcyhjcmVhdGVEYXRhU291cmNlKGN0LGluKSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVW5rbm93bkNvbnRlbnQoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dHMpIHsKLSAgICAgICAgICAgIHRoaXMuaW4gPSBudWxsOwotICAgICAgICAgICAgbXVsdGlwYXJ0ID0gbmV3IE1pbWVNdWx0aXBhcnQoIm1peGVkIik7Ci0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgRGF0YUhhbmRsZXI+IGUgOiBhdHRzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBNaW1lQm9keVBhcnQgcGFydCA9IG5ldyBNaW1lQm9keVBhcnQoKTsKLSAgICAgICAgICAgICAgICBwYXJ0LnNldERhdGFIYW5kbGVyKGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KHBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5jdCA9IG11bHRpcGFydC5nZXRDb250ZW50VHlwZSgpLnRvU3RyaW5nKCk7CisgICAgICAgIHB1YmxpYyBVbmtub3duQ29udGVudChEYXRhU291cmNlIGRzKSB7CisgICAgICAgICAgICBzdXBlcihTT0FQVmVyc2lvbi5TT0FQXzExKTsKKyAgICAgICAgICAgIHRoaXMuZHMgPSBkczsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyTGlzdCA9IG5ldyBIZWFkZXJMaXN0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG11bHRpcGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG11bHRpcGFydC53cml0ZVRvKG91dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gaW4ucmVhZChidWYpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIENvcHkgY29uc3RydWN0b3IuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFVua25vd25Db250ZW50KFVua25vd25Db250ZW50IHRoYXQpIHsKKyAgICAgICAgICAgIHN1cGVyKHRoYXQuc29hcFZlcnNpb24pOworICAgICAgICAgICAgdGhpcy5kcyA9IHRoYXQuZHM7CisgICAgICAgICAgICB0aGlzLmhlYWRlckxpc3QgPSBIZWFkZXJMaXN0LmNvcHkodGhhdC5oZWFkZXJMaXN0KTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gaXNGYXN0SW5mb3NldCgpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzVW5jb25zdW1lZERhdGFTb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoKSB7CisgICAgICAgICAgICBhc3NlcnQgZHMgIT0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBkczsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlUGF5bG9hZFRvKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIGJvb2xlYW4gZnJhZ21lbnQpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFkZXJzKCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5PIFhNTCBjb250ZW50IHNvIHJldHVybiBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU291cmNlIGdldFNvdXJjZSgpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGYXVsdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBIZWFkZXJMaXN0IGdldEhlYWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF5bG9hZExvY2FsUGFydCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXlsb2FkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNvdXJjZSByZWFkUGF5bG9hZEFzU291cmNlKCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGFydC53cml0ZVRvKGJvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvcy5uZXdJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oaW9lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBjdCAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3Q7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKKyAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkUGF5bG9hZCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlRoZXJlIGlzbid0IFhNTCBwYXlsb2FkLiBTaG91bGRuJ3QgY29tZSBoZXJlLiIpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5PIFhNTCBjb250ZW50IHNvIHJldHVybiBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU291cmNlIGdldFBheWxvYWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVQYXlsb2FkVG8oWE1MU3RyZWFtV3JpdGVyIHN3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIE5vIFhNTC4gTm90aGluZyB0byBkbwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEpBWFdTIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIGNvbmVudC4gU28gd2UgdHJlYXRlIHRoZSB3aG9sZSBjb250ZW50Ci0gICAgICAgICAqIGFzIG9uZSBwYXlsb2FkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBnZXRBdHRhY2htZW50cygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTWltZUhlYWRlcnMgZ2V0TWltZUhlYWRlcnMoKSB7Ci0gICAgICAgICAgICBoZWFkZXJzLnJlbW92ZUhlYWRlcigiQ29udGVudC1UeXBlIik7Ci0gICAgICAgICAgICBoZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgY3QpOwotICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnM7CisgICAgICAgIHB1YmxpYyBNZXNzYWdlIGNvcHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVua25vd25Db250ZW50KHRoaXMpOwogICAgICAgICB9CiAKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIEhUVFBFeGNlcHRpb24gb3IgYW55b3RoZXIgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgWE1MRXJyIGV4dGVuZHMgRGF0YVJlcHJlc2VudGF0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeGNlcHRpb24gZXJyOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1pbWVIZWFkZXJzIGhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKKyAgICBwdWJsaWMgc3RhdGljIERhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZShNZXNzYWdlIG1zZykgeworICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgTWVzc2FnZURhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lc3NhZ2VEYXRhU291cmNlKW1zZykuZ2V0RGF0YVNvdXJjZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXR0YWNobWVudFNldCBhdHRzID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7CisgICAgICAgICAgICBpZiAoYXR0cyAhPSBudWxsICYmICFhdHRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDb2RlYyBjb2RlYyA9IG5ldyBYTUxIVFRQQmluZGluZ0NvZGVjKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlIGN0ID0gY29kZWMuZ2V0U3RhdGljQ29udGVudFR5cGUobmV3IFBhY2tldChtc2cpKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZWMuZW5jb2RlKG5ldyBQYWNrZXQobXNnKSwgYm9zKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURhdGFTb3VyY2UoY3QuZ2V0Q29udGVudFR5cGUoKSwgYm9zLm5ld0lucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGlvZSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgIFhNTEVycihFeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgICAgICB0aGlzLmVyciA9IGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTb3VyY2UgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBnZXRBdHRhY2htZW50cygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIHVzZUZhc3RJbmZvc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGVyci5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBlcnIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZyA9ICI8ZXJyPiIrbXNnKyI8L2Vycj4iOwotCi0gICAgICAgICAgICBpZiAodXNlRmFzdEluZm9zZXQpIHsKLSAgICAgICAgICAgICAgICBGYXN0SW5mb3NldFV0aWwudHJhbnNjb2RlWE1MU3RyaW5nVG9GSShtc2csIG91dCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC53cml0ZShtc2cuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxTdHJlYW1Xcml0ZXJGYWN0b3J5LmNyZWF0ZShib3MpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy53cml0ZVBheWxvYWRUbyh3cml0ZXIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTE1lc3NhZ2UuY3JlYXRlRGF0YVNvdXJjZSgidGV4dC94bWwiLCBib3MubmV3SW5wdXRTdHJlYW0oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRmFzdEluZm9zZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTb3VyY2UgZ2V0U291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBpbnQgZ2V0U3RhdHVzKCkgewotICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEhUVFBFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChIVFRQRXhjZXB0aW9uKWVycikuZ2V0U3RhdHVzQ29kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFdTQ29ubmVjdGlvbi5JTlRFUk5BTF9FUlI7Ci0gICAgICAgIH0KLQotICAgICAgICBNaW1lSGVhZGVycyBnZXRNaW1lSGVhZGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXJzOwotICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlLCBmaW5hbCBJbnB1dFN0cmVhbSBpcykgeworICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2UoKSB7CisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzOworICAgICAgICAgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhlcmUgaXMgbm8gY29udGVudCB0byB3cml0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOdWxsQ29udGVudCBleHRlbmRzIERhdGFSZXByZXNlbnRhdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWltZUhlYWRlcnMgaGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOworICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFNvdXJjZSBnZXRQYXlsb2FkKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICAgICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gZ2V0QXR0YWNobWVudHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiB1c2VGYXN0SW5mb3NldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNGYXN0SW5mb3NldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFNvdXJjZSBnZXRTb3VyY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTWltZUhlYWRlcnMgZ2V0TWltZUhlYWRlcnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGVhZGVyczsKLSAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9mYXVsdC9Db2RlVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvQ29kZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDE5MTQxCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvQ29kZVR5cGUuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZmF1bHQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIDxwcmU+CisgKiAgJmx0O2VudjpDb2RlPgorICogICAgICAgJmx0O2VudjpWYWx1ZT5lbnY6U2VuZGVyJmx0Oy9lbnY6VmFsdWU+CisgKiAgICAgICAmbHQ7ZW52OlN1YmNvZGU+CisgKiAgICAgICAgICAgJmx0O2VudjpWYWx1ZT5tOk1lc3NhZ2VUaW1lb3V0MSZsdDsvZW52OlZhbHVlPgorICogICAgICAgICAgICZsdDtlbnY6U3ViY29kZT4KKyAqICAgICAgICAgICAgICAgJmx0O2VudjpWYWx1ZT5tOk1lc3NhZ2VUaW1lb3V0MiZsdDsvZW52OlZhbHVlPgorICogICAgICAgICAgICZsdDsvZW52OlN1YmNvZGU+CisgKiAgICAgICAmbHQ7L2VudjpTdWJjb2RlPgorICogICZsdDsvZW52OkNvZGU+CisgKiA8L3ByZT4KKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICJDb2RlVHlwZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiLCBwcm9wT3JkZXIgPSB7CisgICAgIlZhbHVlIiwKKyAgICAiU3ViY29kZSIKK30pCitjbGFzcyBDb2RlVHlwZSB7CisgICAgQFhtbFRyYW5zaWVudAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKKworICAgIC8qKgorICAgICAqIG1hbmRhdG9yeSwgbWluT2NjdXJzPTEKKyAgICAgKi8KKyAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSBucykKKyAgICBwcml2YXRlIFFOYW1lIFZhbHVlOworCisgICAgLyoqCisgICAgICogb3B0aW9uYWwsIG1pbk9jY2N1cnM9MCwgbWF4T2NjdXJzPSIxIgorICAgICAqLworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9IG5zKQorICAgIHByaXZhdGUgU3ViY29kZVR5cGUgU3ViY29kZTsKKworICAgIENvZGVUeXBlKFFOYW1lIHZhbHVlKSB7CisgICAgICAgIFZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgQ29kZVR5cGUoKSB7CisgICAgfQorCisgICAgUU5hbWUgZ2V0VmFsdWUoKXsKKyAgICAgICAgcmV0dXJuIFZhbHVlOworICAgIH0KKworICAgIFN1YmNvZGVUeXBlIGdldFN1YmNvZGUoKXsKKyAgICAgICAgcmV0dXJuIFN1YmNvZGU7CisgICAgfQorCisgICAgdm9pZCBzZXRTdWJjb2RlKFN1YmNvZGVUeXBlIHN1YmNvZGUpIHsKKyAgICAgICAgU3ViY29kZSA9IHN1YmNvZGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvRGV0YWlsVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvRGV0YWlsVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YjhkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9mYXVsdC9EZXRhaWxUeXBlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmZhdWx0OworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiAmbHQ7ZW52OkRldGFpbD4KKyAqICAgICAmbHQ7bTpNYXhUaW1lPlA1TTwvbTpNYXhUaW1lPgorICogJmx0Oy9lbnY6RGV0YWlsPgorICovCitjbGFzcyBEZXRhaWxUeXBlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgZGV0YWlsIGVudHJ5IGNvdWxkIGJlIDAgb3IgbW9yZSBlbGVtZW50cy4gUGVyaGFwcyBzb21lIGVsZW1lbnRzIG1heSBiZQorICAgICAqIGtub3duIHRvIEpBWEIgd2hpbGUgb3RoZXJzIGNhbiBiZSBoYW5kbGVkIHVzaW5nIERPTUhhbmRsZXIuCisgICAgICoKKyAgICAgKiBFdmVuIHRob3VnaCB0aGUgamF4YkNvbnRleHQgaXMgYXdhcmUgb2YgdGhlIGRldGFpbCBqYXhiQmVhbiBidXQgd2UgZ2V0IHRoZSBsaXN0IG9mCisgICAgICoge0BsaW5rIG9yZy53M2MuZG9tLk5vZGV9cy4KKyAgICAgKgorICAgICAqIHRoaXMgaXMgYmVjYXVzZSBzaW5jZSB3ZSB1bm1hcnNoYWxsIHVzaW5nIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2V9IGFsbCB3ZSdyZQorICAgICAqIGdvaW5nIHRvIGdldCBkdXJpbmcgdW5tYXJzaGFsbGluZyBpcyB7QGxpbmsgb3JnLnczYy5kb20uTm9kZX0gYW5kIG5vdCB0aGUgamF4YiBiZWFuIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIFRPRE86IEZvciBub3cgZGV0YWlsRW50cnkgd291bGQgYmUgTGlzdCBvZiBOb2RlIGlzbnRlYWQgb2YgT2JqZWN0IGFuZCBpdCBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvCisgICAgICoge0BsaW5rIE9iamVjdH0gb25jZSB3ZSBoYXZlIGJldHRlciBzb2x1dGlvbiB0aGF0IHdvcmtpbmcgdGhydSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlfQorICAgICAqLworICAgIEBYbWxBbnlFbGVtZW50CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEVsZW1lbnQ+IGRldGFpbEVudHJ5ID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOworCisgICAgQE5vdE51bGwKKyAgICBMaXN0PEVsZW1lbnQ+IGdldERldGFpbHMoKSB7CisgICAgICAgIHJldHVybiBkZXRhaWxFbnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuLXRoIGRldGFpbCBvYmplY3QsIG9yIG51bGwgaWYgbm8gc3VjaCBpdGVtIGV4aXN0cy4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBOb2RlIGdldERldGFpbChpbnQgbikgeworICAgICAgICBpZihuIDwgZGV0YWlsRW50cnkuc2l6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGRldGFpbEVudHJ5LmdldChuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgRGV0YWlsVHlwZShFbGVtZW50IGRldGFpbE9iamVjdCkgeworICAgICAgICBpZihkZXRhaWxPYmplY3QgIT0gbnVsbCkKKyAgICAgICAgICAgIGRldGFpbEVudHJ5LmFkZChkZXRhaWxPYmplY3QpOworICAgIH0KKworICAgIERldGFpbFR5cGUoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvRXhjZXB0aW9uQmVhbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvRXhjZXB0aW9uQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGI4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9mYXVsdC9FeGNlcHRpb25CZWFuLmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5mYXVsdDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQubWFyc2hhbGxlci5OYW1lc3BhY2VQcmVmaXhNYXBwZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLlNlcnZlclNpZGVFeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBKQVhCLWJvdW5kIGJlYW4gdGhhdCBjYXB0dXJlcyB0aGUgZXhjZXB0aW9uIGFuZCBpdHMgY2FsbCBzdGFjay4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaXMgdXNlZCB0byBjYXB0dXJlIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc2VydmVyIHNpZGUgZXJyb3IgYW5kCisgKiBzZW5kIHRoYXQgb3ZlciB0byB0aGUgY2xpZW50LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworQFhtbFJvb3RFbGVtZW50KG5hbWVzcGFjZT1FeGNlcHRpb25CZWFuLk5TLG5hbWU9RXhjZXB0aW9uQmVhbi5MT0NBTF9OQU1FKQorZmluYWwgY2xhc3MgRXhjZXB0aW9uQmVhbiB7CisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGdpdmVuIHtAbGluayBUaHJvd2FibGV9IGludG8gYW4gWE1MIHJlcHJlc2VudGF0aW9uCisgICAgICogYW5kIHB1dCB0aGF0IGFzIGEgRE9NIHRyZWUgdW5kZXIgdGhlIGdpdmVuIG5vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcnNoYWwoIFRocm93YWJsZSB0LCBOb2RlIHBhcmVudCApIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyc2hhbGxlciBtID0gSkFYQl9DT05URVhULmNyZWF0ZU1hcnNoYWxsZXIoKTsKKyAgICAgICAgbS5zZXRQcm9wZXJ0eSgiY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5uYW1lc3BhY2VQcmVmaXhNYXBwZXIiLG5zcCk7CisgICAgICAgIG0ubWFyc2hhbChuZXcgRXhjZXB0aW9uQmVhbih0KSwgcGFyZW50ICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgcmV2ZXJzZSBvcGVyYXRpb24gb2Yge0BsaW5rICNtYXJzaGFsKFRocm93YWJsZSwgTm9kZSl9LiBDb25zdHJ1Y3RzIGFuCisgICAgICoge0BsaW5rIEV4Y2VwdGlvbn0gb2JqZWN0IGZyb20gdGhlIFhNTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlclNpZGVFeGNlcHRpb24gdW5tYXJzaGFsKCBOb2RlIHhtbCApIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgRXhjZXB0aW9uQmVhbiBlID0gKEV4Y2VwdGlvbkJlYW4pIEpBWEJfQ09OVEVYVC5jcmVhdGVVbm1hcnNoYWxsZXIoKS51bm1hcnNoYWwoeG1sKTsKKyAgICAgICAgcmV0dXJuIGUudG9FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAWG1sQXR0cmlidXRlKG5hbWU9ImNsYXNzIikKKyAgICBwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKKyAgICBAWG1sRWxlbWVudFdyYXBwZXIobmFtZXNwYWNlPU5TLG5hbWU9InN0YWNrVHJhY2UiKQorICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZT1OUyxuYW1lPSJmcmFtZSIpCisgICAgcHVibGljIExpc3Q8U3RhY2tGcmFtZT4gc3RhY2tUcmFjZSA9IG5ldyBBcnJheUxpc3Q8U3RhY2tGcmFtZT4oKTsKKyAgICBAWG1sRWxlbWVudChuYW1lc3BhY2U9TlMsbmFtZT0iY2F1c2UiKQorICAgIHB1YmxpYyBFeGNlcHRpb25CZWFuIGNhdXNlOworCisgICAgLy8gc28gdGhhdCBwZW9wbGUgbm90aWNlZCB0aGlzIGZyYWdtZW50IGNhbiB0dXJuIGl0IG9mZgorICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgU3RyaW5nIG5vdGUgPSAiVG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUsIHNldCAiK1NPQVBGYXVsdEJ1aWxkZXIuQ0FQVFVSRV9TVEFDS19UUkFDRV9QUk9QRVJUWSsiIHN5c3RlbSBwcm9wZXJ0eSB0byBmYWxzZSI7CisKKyAgICBFeGNlcHRpb25CZWFuKCkgey8vIGZvciBKQVhCCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgRXhjZXB0aW9uQmVhbn0gdHJlZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHtAbGluayBUaHJvd2FibGV9LgorICAgICAqLworICAgIHByaXZhdGUgRXhjZXB0aW9uQmVhbihUaHJvd2FibGUgdCkgeworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IHQuZ2V0TWVzc2FnZSgpOworCisgICAgICAgIGZvciAoU3RhY2tUcmFjZUVsZW1lbnQgZiA6IHQuZ2V0U3RhY2tUcmFjZSgpKSB7CisgICAgICAgICAgICBzdGFja1RyYWNlLmFkZChuZXcgU3RhY2tGcmFtZShmKSk7CisgICAgICAgIH0KKworICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSB0LmdldENhdXNlKCk7CisgICAgICAgIGlmKHQhPWNhdXNlICYmIGNhdXNlIT1udWxsKQorICAgICAgICAgICAgdGhpcy5jYXVzZSA9IG5ldyBFeGNlcHRpb25CZWFuKGNhdXNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlcnZlclNpZGVFeGNlcHRpb24gdG9FeGNlcHRpb24oKSB7CisgICAgICAgIFNlcnZlclNpZGVFeGNlcHRpb24gZSA9IG5ldyBTZXJ2ZXJTaWRlRXhjZXB0aW9uKGNsYXNzTmFtZSxtZXNzYWdlKTsKKyAgICAgICAgaWYoc3RhY2tUcmFjZSE9bnVsbCkgeworICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGUgPSBuZXcgU3RhY2tUcmFjZUVsZW1lbnRbc3RhY2tUcmFjZS5zaXplKCldOworICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPHN0YWNrVHJhY2Uuc2l6ZSgpOyBpKysgKQorICAgICAgICAgICAgICAgIHN0ZVtpXSA9IHN0YWNrVHJhY2UuZ2V0KGkpLnRvU3RhY2tUcmFjZUVsZW1lbnQoKTsKKyAgICAgICAgICAgIGUuc2V0U3RhY2tUcmFjZShzdGUpOworICAgICAgICB9CisgICAgICAgIGlmKGNhdXNlIT1udWxsKQorICAgICAgICAgICAgZS5pbml0Q2F1c2UoY2F1c2UudG9FeGNlcHRpb24oKSk7CisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhcHR1cmVzIG9uZSBzdGFjayBmcmFtZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgU3RhY2tGcmFtZSB7CisgICAgICAgIEBYbWxBdHRyaWJ1dGUobmFtZT0iY2xhc3MiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlY2xhcmluZ0NsYXNzOworICAgICAgICBAWG1sQXR0cmlidXRlKG5hbWU9Im1ldGhvZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kTmFtZTsKKyAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lPSJmaWxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBmaWxlTmFtZTsKKyAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lPSJsaW5lIikKKyAgICAgICAgcHVibGljIFN0cmluZyBsaW5lTnVtYmVyOworCisgICAgICAgIFN0YWNrRnJhbWUoKSB7Ly8gZm9yIEpBWEIKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdGFja0ZyYW1lKFN0YWNrVHJhY2VFbGVtZW50IHN0ZSkgeworICAgICAgICAgICAgdGhpcy5kZWNsYXJpbmdDbGFzcyA9IHN0ZS5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IHN0ZS5nZXRNZXRob2ROYW1lKCk7CisgICAgICAgICAgICB0aGlzLmZpbGVOYW1lID0gc3RlLmdldEZpbGVOYW1lKCk7CisgICAgICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBib3goc3RlLmdldExpbmVOdW1iZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBib3goaW50IGkpIHsKKyAgICAgICAgICAgIGlmKGk+PTApIHJldHVybiBTdHJpbmcudmFsdWVPZihpKTsKKyAgICAgICAgICAgIGlmKGk9PS0yKSAgIHJldHVybiAibmF0aXZlIjsKKyAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCB1bmJveChTdHJpbmcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh2KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYodi5lcXVhbHMoIm5hdGl2ZSIpKSAgcmV0dXJuIC0yOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RhY2tUcmFjZUVsZW1lbnQgdG9TdGFja1RyYWNlRWxlbWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhY2tUcmFjZUVsZW1lbnQoZGVjbGFyaW5nQ2xhc3MsbWV0aG9kTmFtZSxmaWxlTmFtZSx1bmJveChsaW5lTnVtYmVyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgdGhlIFhNTCByZXByZXNlbnRhdGlvbiBvZiB7QGxpbmsgRXhjZXB0aW9uQmVhbn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhY2tUcmFjZVhtbChFbGVtZW50IG4pIHsKKyAgICAgICAgcmV0dXJuIG4uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKExPQ0FMX05BTUUpICYmIG4uZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKE5TKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKQVhCQ29udGV4dCBKQVhCX0NPTlRFWFQ7CisKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2UgVVJJLgorICAgICAqLworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlMgPSAiaHR0cDovL2pheC13cy5kZXYuamF2YS5uZXQvIjsKKworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfTkFNRSA9ICJleGNlcHRpb24iOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpBWEJfQ09OVEVYVCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKEV4Y2VwdGlvbkJlYW4uY2xhc3MpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBiZSBhIGJ1ZyBpbiBvdXIgY29kZQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZXNwYWNlUHJlZml4TWFwcGVyIG5zcCA9IG5ldyBOYW1lc3BhY2VQcmVmaXhNYXBwZXIoKSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVycmVkUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVcmksIFN0cmluZyBzdWdnZXN0aW9uLCBib29sZWFuIHJlcXVpcmVQcmVmaXgpIHsKKyAgICAgICAgICAgIGlmKG5hbWVzcGFjZVVyaS5lcXVhbHMoTlMpKSByZXR1cm4gIiI7CisgICAgICAgICAgICByZXR1cm4gc3VnZ2VzdGlvbjsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9mYXVsdC9SZWFzb25UeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9mYXVsdC9SZWFzb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5ZTkzNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1JlYXNvblR5cGUuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZmF1bHQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIDxwcmU+CisgKiAmbHQ7ZW52OlJlYXNvbj4KKyAqICAgICAmbHQ7ZW52OlRleHQgeG1sOmxhbmc9ImVuIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+CisgKiAmbHQ7L2VudjpSZWFzb24+CisgKiA8L3ByZT4KKyAqLworY2xhc3MgUmVhc29uVHlwZSB7CisgICAgUmVhc29uVHlwZSgpIHsKKyAgICB9CisKKyAgICBSZWFzb25UeXBlKFN0cmluZyB0eHQpIHsKKyAgICAgICAgdGV4dC5hZGQobmV3IFRleHRUeXBlKHR4dCkpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBtaW5PY2N1cnM9MSBtYXhPY2N1cnM9dW5ib3VuZGVkCisgICAgICovCisgICAgQFhtbEVsZW1lbnRzKEBYbWxFbGVtZW50KG5hbWUgPSAiVGV4dCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiLCB0eXBlID0gVGV4dFR5cGUuY2xhc3MpKQorICAgIHByaXZhdGUgZmluYWwgTGlzdDxUZXh0VHlwZT4gdGV4dCA9IG5ldyBBcnJheUxpc3Q8VGV4dFR5cGU+KCk7CisKKyAgICBMaXN0PFRleHRUeXBlPiB0ZXh0cygpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvU09BUDExRmF1bHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1NPQVAxMUZhdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzNmMzNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1NPQVAxMUZhdWx0LmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5mYXVsdDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkRPTVV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIFNPQVAxLjEgRmF1bHQuIFRoaXMgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIG1hcnNoYWxsL3VubWFyc2hhbGwgYSBzb2FwIGZhdWx0IHVzaW5nIEpBWEIuCisgKiA8cC8+CisgKiA8cHJlPgorICogRXhhbXBsZToKKyAqIDxwLz4KKyAqICAgICAmbHQ7c29hcDpGYXVsdCB4bWxuczpzb2FwPSdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyc+CisgKiAgICAgICAgICZsdDtmYXVsdGNvZGU+c29hcDpDbGllbnQmbHQ7L2ZhdWx0Y29kZT4KKyAqICAgICAgICAgJmx0O2ZhdWx0c3RyaW5nPkludmFsaWQgbWVzc2FnZSBmb3JtYXQmbHQ7L2ZhdWx0c3RyaW5nPgorICogICAgICAgICAmbHQ7ZmF1bHRhY3Rvcj5odHRwOi8vZXhhbXBsZS5vcmcvc29tZWFjdG9yJmx0Oy9mYXVsdGFjdG9yPgorICogICAgICAgICAmbHQ7ZGV0YWlsPgorICogICAgICAgICAgICAgJmx0O206bXNnIHhtbG5zOm09J2h0dHA6Ly9leGFtcGxlLm9yZy9mYXVsdHMvZXhjZXB0aW9ucyc+CisgKiAgICAgICAgICAgICAgICAgVGVzdCBtZXNzYWdlCisgKiAgICAgICAgICAgICAmbHQ7L206bXNnPgorICogICAgICAgICAmbHQ7L2RldGFpbD4KKyAqICAgICAmbHQ7L3NvYXA6RmF1bHQ+CisgKiA8cC8+CisgKiBBYm92ZSwgbTptc2csIGlmIGEga25vd24gZmF1bHQgKGRlc2NyaWJlZCBpbiB0aGUgV1NETCksIElPVywgaWYgbTptc2cgaXMga25vd24gYnkgSkFYQkNvbnRleHQgaXQgc2hvdWxkIGJlIHVubWFyc2hhbGxlZCBpbnRvIGEKKyAqIEphdmEgb2JqZWN0IG90aGVyd2lzZSBpdCBzaG91bGQgYmUgZGVzZXJpYWxpemVkIGFzIHtAbGluayBqYXZheC54bWwuc29hcC5EZXRhaWx9CisgKiA8L3ByZT4KKyAqIDxwLz4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCisKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0geworICAgICAgICAiZmF1bHRjb2RlIiwKKyAgICAgICAgImZhdWx0c3RyaW5nIiwKKyAgICAgICAgImZhdWx0YWN0b3IiLAorICAgICAgICAiZGV0YWlsIgorICAgICAgICB9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiRmF1bHQiLCBuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iKQorY2xhc3MgU09BUDExRmF1bHQgZXh0ZW5kcyBTT0FQRmF1bHRCdWlsZGVyIHsKKyAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiIikKKyAgICBwcml2YXRlIFFOYW1lIGZhdWx0Y29kZTsKKworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICIiKQorICAgIHByaXZhdGUgU3RyaW5nIGZhdWx0c3RyaW5nOworCisgICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gIiIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZmF1bHRhY3RvcjsKKworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICIiKQorICAgIHByaXZhdGUgRGV0YWlsVHlwZSBkZXRhaWw7CisKKyAgICBTT0FQMTFGYXVsdCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHRha2VzIHNvYXAgZmF1bHQgZGV0YWlsIGFtb25nIG90aGVyIHRoaW5ncy4gVGhlIGRldGFpbCBjb3VsZCByZXByZXNlbnQge0BsaW5rIGphdmF4LnhtbC5zb2FwLkRldGFpbH0KKyAgICAgKiBvciBhIGphdmEgb2JqZWN0IHRoYXQgY2FuIGJlIG1hcnNoYWxsZWQvdW5tYXJzaGFsbGVkIGJ5IEpBWEIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZQorICAgICAqIEBwYXJhbSByZWFzb24KKyAgICAgKiBAcGFyYW0gYWN0b3IKKyAgICAgKiBAcGFyYW0gZGV0YWlsT2JqZWN0CisgICAgICovCisgICAgU09BUDExRmF1bHQoUU5hbWUgY29kZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFjdG9yLCBFbGVtZW50IGRldGFpbE9iamVjdCkgeworICAgICAgICB0aGlzLmZhdWx0Y29kZSA9IGNvZGU7CisgICAgICAgIHRoaXMuZmF1bHRzdHJpbmcgPSByZWFzb247CisgICAgICAgIHRoaXMuZmF1bHRhY3RvciA9IGFjdG9yOworICAgICAgICBpZiAoZGV0YWlsT2JqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmKGRldGFpbE9iamVjdC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIiIpICYmIGRldGFpbE9iamVjdC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImRldGFpbCIpKXsKKyAgICAgICAgICAgICAgICBkZXRhaWwgPSBuZXcgRGV0YWlsVHlwZSgpOworICAgICAgICAgICAgICAgIGZvcihFbGVtZW50IGRldGFpbEVudHJ5IDogRE9NVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGRldGFpbE9iamVjdCkpeworICAgICAgICAgICAgICAgICAgICBkZXRhaWwuZ2V0RGV0YWlscygpLmFkZChkZXRhaWxFbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZGV0YWlsID0gbmV3IERldGFpbFR5cGUoZGV0YWlsT2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFNPQVAxMUZhdWx0KFNPQVBGYXVsdCBmYXVsdCkgeworICAgICAgICB0aGlzLmZhdWx0Y29kZSA9IGZhdWx0LmdldEZhdWx0Q29kZUFzUU5hbWUoKTsKKyAgICAgICAgdGhpcy5mYXVsdHN0cmluZyA9IGZhdWx0LmdldEZhdWx0U3RyaW5nKCk7CisgICAgICAgIHRoaXMuZmF1bHRhY3RvciA9IGZhdWx0LmdldEZhdWx0QWN0b3IoKTsKKyAgICAgICAgaWYgKGZhdWx0LmdldERldGFpbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRldGFpbCA9IG5ldyBEZXRhaWxUeXBlKGZhdWx0LmdldERldGFpbCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFFOYW1lIGdldEZhdWx0Y29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhdWx0Y29kZTsKKyAgICB9CisKKyAgICB2b2lkIHNldEZhdWx0Y29kZShRTmFtZSBmYXVsdGNvZGUpIHsKKyAgICAgICAgdGhpcy5mYXVsdGNvZGUgPSBmYXVsdGNvZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgU3RyaW5nIGdldEZhdWx0U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZmF1bHRzdHJpbmc7CisgICAgfQorCisgICAgdm9pZCBzZXRGYXVsdHN0cmluZyhTdHJpbmcgZmF1bHRzdHJpbmcpIHsKKyAgICAgICAgdGhpcy5mYXVsdHN0cmluZyA9IGZhdWx0c3RyaW5nOworICAgIH0KKworICAgIFN0cmluZyBnZXRGYXVsdGFjdG9yKCkgeworICAgICAgICByZXR1cm4gZmF1bHRhY3RvcjsKKyAgICB9CisKKyAgICB2b2lkIHNldEZhdWx0YWN0b3IoU3RyaW5nIGZhdWx0YWN0b3IpIHsKKyAgICAgICAgdGhpcy5mYXVsdGFjdG9yID0gZmF1bHRhY3RvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRoZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIGRldGFpbC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBEZXRhaWxUeXBlIGdldERldGFpbCgpIHsKKyAgICAgICAgcmV0dXJuIGRldGFpbDsKKyAgICB9CisKKyAgICB2b2lkIHNldERldGFpbChEZXRhaWxUeXBlIGRldGFpbCkgeworICAgICAgICB0aGlzLmRldGFpbCA9IGRldGFpbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGdldFByb3RvY29sRXhjZXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gU09BUFZlcnNpb24uU09BUF8xMS5zYWFqU29hcEZhY3RvcnkuY3JlYXRlRmF1bHQoZmF1bHRzdHJpbmcsIGZhdWx0Y29kZSk7CisgICAgICAgICAgICBpZihkZXRhaWwgIT0gbnVsbCAmJiBkZXRhaWwuZ2V0RGV0YWlsKDApICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBOb2RlIG4gPSBmYXVsdC5nZXRPd25lckRvY3VtZW50KCkuaW1wb3J0Tm9kZShkZXRhaWwuZ2V0RGV0YWlsKDApLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBEZXRhaWwgZCA9IGZhdWx0LmFkZERldGFpbCgpOworICAgICAgICAgICAgICAgIGQuYXBwZW5kQ2hpbGQobik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYXVsdC5zZXRGYXVsdEFjdG9yKGZhdWx0YWN0b3IpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oZmF1bHQpOworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvU09BUDEyRmF1bHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1NPQVAxMkZhdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0YzY5NwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1NPQVAxMkZhdWx0LmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5mYXVsdDsKKworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFNPQVAgMS4yIEZhdWx0IGNsYXNzIHRoYXQgY2FuIGJlIG1hcnNoYWxsZWQvdW5tYXJzaGFsbGVkIGJ5IEpBWEIKKyAqIDxwLz4KKyAqIDxwcmU+CisgKiBFeGFtcGxlOgorICogJmx0O2VudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIKKyAqICAgICAgICAgICAgeG1sbnM6bT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy90aW1lb3V0cyIKKyAqICAgICAgICAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgorICogJmx0O2VudjpCb2R5PgorICogICAgICZsdDtlbnY6RmF1bHQ+CisgKiAgICAgICAgICZsdDtlbnY6Q29kZT4KKyAqICAgICAgICAgICAgICZsdDtlbnY6VmFsdWU+ZW52OlNlbmRlciogJmx0Oy9lbnY6VmFsdWU+CisgKiAgICAgICAgICAgICAmbHQ7ZW52OlN1YmNvZGU+CisgKiAgICAgICAgICAgICAgICAgJmx0O2VudjpWYWx1ZT5tOk1lc3NhZ2VUaW1lb3V0KiAmbHQ7L2VudjpWYWx1ZT4KKyAqICAgICAgICAgICAgICZsdDsvZW52OlN1YmNvZGU+CisgKiAgICAgICAgICZsdDsvZW52OkNvZGU+CisgKiAgICAgICAgICZsdDtlbnY6UmVhc29uPgorICogICAgICAgICAgICAgJmx0O2VudjpUZXh0IHhtbDpsYW5nPSJlbiI+U2VuZGVyIFRpbWVvdXQqICZsdDsvZW52OlRleHQ+CisgKiAgICAgICAgICZsdDsvZW52OlJlYXNvbj4KKyAqICAgICAgICAgJmx0O2VudjpEZXRhaWw+CisgKiAgICAgICAgICAgICAmbHQ7bTpNYXhUaW1lPlA1TSogJmx0Oy9tOk1heFRpbWU+CisgKiAgICAgICAgICZsdDsvZW52OkRldGFpbD4KKyAqICAgICAmbHQ7L2VudjpGYXVsdD4KKyAqICZsdDsvZW52OkJvZHk+CisgKiAmbHQ7L2VudjpFbnZlbG9wZT4KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK0BYbWxSb290RWxlbWVudChuYW1lID0gIkZhdWx0IiwgbmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAiY29kZSIsCisgICAgInJlYXNvbiIsCisgICAgIm5vZGUiLAorICAgICJyb2xlIiwKKyAgICAiZGV0YWlsIgorfSkKK2NsYXNzIFNPQVAxMkZhdWx0IGV4dGVuZHMgU09BUEZhdWx0QnVpbGRlciB7CisgICAgQFhtbFRyYW5zaWVudAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBucyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOworCisgICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlPW5zLCBuYW1lPSJDb2RlIikKKyAgICBwcml2YXRlIENvZGVUeXBlIGNvZGU7CisKKyAgICBAWG1sRWxlbWVudChuYW1lc3BhY2U9bnMsIG5hbWU9IlJlYXNvbiIpCisgICAgcHJpdmF0ZSBSZWFzb25UeXBlIHJlYXNvbjsKKworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZT1ucywgbmFtZT0iTm9kZSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZTsKKworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZT1ucywgbmFtZT0iUm9sZSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZTsKKworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZT1ucywgbmFtZT0iRGV0YWlsIikKKyAgICBwcml2YXRlIERldGFpbFR5cGUgZGV0YWlsOworCisgICAgU09BUDEyRmF1bHQoKSB7CisgICAgfQorCisgICAgU09BUDEyRmF1bHQoQ29kZVR5cGUgY29kZSwgUmVhc29uVHlwZSByZWFzb24sIFN0cmluZyBub2RlLCBTdHJpbmcgcm9sZSwgRGV0YWlsVHlwZSBkZXRhaWwpIHsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKKyAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb247CisgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgICAgIHRoaXMucm9sZSA9IHJvbGU7CisgICAgICAgIHRoaXMuZGV0YWlsID0gZGV0YWlsOworICAgIH0KKworICAgIFNPQVAxMkZhdWx0KFNPQVBGYXVsdCBmYXVsdCkgeworICAgICAgICBjb2RlID0gbmV3IENvZGVUeXBlKGZhdWx0LmdldEZhdWx0Q29kZUFzUU5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxsRmF1bHRTdWJDb2RlcyhmYXVsdCk7CisgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICByZWFzb24gPSBuZXcgUmVhc29uVHlwZShmYXVsdC5nZXRGYXVsdFN0cmluZygpKTsKKyAgICAgICAgcm9sZSA9IGZhdWx0LmdldEZhdWx0Um9sZSgpOworICAgICAgICBkZXRhaWwgPSBuZXcgRGV0YWlsVHlwZShmYXVsdC5nZXREZXRhaWwoKSk7CisgICAgfQorCisgICAgU09BUDEyRmF1bHQoUU5hbWUgY29kZSwgU3RyaW5nIHJlYXNvbiwgRWxlbWVudCBkZXRhaWxPYmplY3QpIHsKKyAgICAgICAgdGhpcy5jb2RlID0gbmV3IENvZGVUeXBlKGNvZGUpOworICAgICAgICB0aGlzLnJlYXNvbiA9IG5ldyBSZWFzb25UeXBlKHJlYXNvbik7CisgICAgICAgIGlmKGRldGFpbE9iamVjdCAhPSBudWxsKQorICAgICAgICAgICAgZGV0YWlsID0gbmV3IERldGFpbFR5cGUoZGV0YWlsT2JqZWN0KTsKKyAgICB9CisKKyAgICBDb2RlVHlwZSBnZXRDb2RlKCkgeworICAgICAgICByZXR1cm4gY29kZTsKKyAgICB9CisKKyAgICBSZWFzb25UeXBlIGdldFJlYXNvbigpIHsKKyAgICAgICAgcmV0dXJuIHJlYXNvbjsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0Tm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgU3RyaW5nIGdldFJvbGUoKSB7CisgICAgICAgIHJldHVybiByb2xlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIERldGFpbFR5cGUgZ2V0RGV0YWlsKCkgeworICAgICAgICByZXR1cm4gZGV0YWlsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgc2V0RGV0YWlsKERldGFpbFR5cGUgZGV0YWlsKSB7CisgICAgICAgIHRoaXMuZGV0YWlsID0gZGV0YWlsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIFN0cmluZyBnZXRGYXVsdFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHJlYXNvbi50ZXh0cygpLmdldCgwKS5nZXRUZXh0KCk7CisgICAgfQorCisgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZ2V0UHJvdG9jb2xFeGNlcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBTT0FQVmVyc2lvbi5TT0FQXzEyLnNhYWpTb2FwRmFjdG9yeS5jcmVhdGVGYXVsdChyZWFzb24udGV4dHMoKS5nZXQoMCkuZ2V0VGV4dCgpLCAoY29kZSAhPSBudWxsKT8gY29kZS5nZXRWYWx1ZSgpOm51bGwpOworICAgICAgICAgICAgaWYoZGV0YWlsICE9IG51bGwgJiYgZGV0YWlsLmdldERldGFpbCgwKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5EZXRhaWwgZGV0YWlsID0gZmF1bHQuYWRkRGV0YWlsKCk7CisgICAgICAgICAgICAgICAgZm9yKE5vZGUgb2JqOiB0aGlzLmRldGFpbC5nZXREZXRhaWxzKCkpeworICAgICAgICAgICAgICAgICAgICBOb2RlIG4gPSBmYXVsdC5nZXRPd25lckRvY3VtZW50KCkuaW1wb3J0Tm9kZShvYmosIHRydWUpOworICAgICAgICAgICAgICAgICAgICBkZXRhaWwuYXBwZW5kQ2hpbGQobik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoY29kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGxGYXVsdFN1YkNvZGVzKGZhdWx0LCBjb2RlLmdldFN1YmNvZGUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgU09BUEZhdWx0RXhjZXB0aW9uKGZhdWx0KTsKKyAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIHRoZSBTdWJjb2RlcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaWxsRmF1bHRTdWJDb2RlcyhTT0FQRmF1bHQgZmF1bHQsIFN1YmNvZGVUeXBlIHN1YmNvZGUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoc3ViY29kZSAhPSBudWxsKXsKKyAgICAgICAgICAgIGZhdWx0LmFwcGVuZEZhdWx0U3ViY29kZShzdWJjb2RlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgZmlsbEZhdWx0U3ViQ29kZXMoZmF1bHQsIHN1YmNvZGUuZ2V0U3ViY29kZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgRmF1bHQgc3ViY29kZXMgZnJvbSB7QGxpbmsgU09BUEZhdWx0fSB0byB7QGxpbmsgI2NvZGV9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZpbGxGYXVsdFN1YkNvZGVzKFNPQVBGYXVsdCBmYXVsdCkgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICBJdGVyYXRvciBzdWJjb2RlcyA9IGZhdWx0LmdldEZhdWx0U3ViY29kZXMoKTsKKyAgICAgICAgU3ViY29kZVR5cGUgZmlyc3RTY3QgPSBudWxsOworICAgICAgICB3aGlsZShzdWJjb2Rlcy5oYXNOZXh0KCkpeworICAgICAgICAgICAgUU5hbWUgc3ViY29kZSA9IChRTmFtZSlzdWJjb2Rlcy5uZXh0KCk7CisgICAgICAgICAgICBpZihmaXJzdFNjdCA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICBmaXJzdFNjdCA9IG5ldyBTdWJjb2RlVHlwZShzdWJjb2RlKTsKKyAgICAgICAgICAgICAgICBjb2RlLnNldFN1YmNvZGUoZmlyc3RTY3QpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3ViY29kZVR5cGUgbmV4dFNjdCA9IG5ldyBTdWJjb2RlVHlwZShzdWJjb2RlKTsKKyAgICAgICAgICAgIGZpcnN0U2N0LnNldFN1YmNvZGUobmV4dFNjdCk7CisgICAgICAgICAgICBmaXJzdFNjdCA9IG5leHRTY3Q7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1NPQVBGYXVsdEJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1NPQVBGYXVsdEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ZmNjUyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvU09BUEZhdWx0QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZmF1bHQ7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5DaGVja2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5FeGNlcHRpb25UeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUDEyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUENvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNlcmlhbGl6YXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5qYXhiLkpBWEJNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkNoZWNrZWRFeGNlcHRpb25JbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkphdmFNZXRob2RJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuRE9NVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBCYXNlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBTT0FQIDEuMSBvciBTT0FQIDEuMiBmYXVsdC4gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBieSB0aGUgaW52b2NhdGlvbiBoYW5kbGVycyB0byBjcmVhdGUKKyAqIGFuIEV4Y2VwdGlvbiBmcm9tIGEgcmVjZWl2ZWQgbWVzc2dlLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTT0FQRmF1bHRCdWlsZGVyIHsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSB7QGxpbmsgRGV0YWlsVHlwZX0gZm9yIGEgU29hcCAxLjEgb3IgU29hcCAxLjIgbWVzc2FnZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBlaXRoZXIgYSBjaGVja2VkIGV4Y2VwdGlvbiBvcgorICAgICAqIGEgcHJvdG9jb2wgc3BlY2lmaWMgZXhjZXB0aW9uCisgICAgICovCisgICAgYWJzdHJhY3QgRGV0YWlsVHlwZSBnZXREZXRhaWwoKTsKKworICAgIGFic3RyYWN0IHZvaWQgc2V0RGV0YWlsKERldGFpbFR5cGUgZGV0YWlsVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBnaXZlcyB0aGUgZmF1bHQgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIHtAbGluayBFeGNlcHRpb259CisgICAgICovCisgICAgYWJzdHJhY3QgU3RyaW5nIGdldEZhdWx0U3RyaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgdG8gdGhyb3cgYW4ge0BsaW5rIEV4Y2VwdGlvbn0gZm9yIGEgZ2l2ZW4gc29hcCBtZXNhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGNyZWF0ZUV4Y2VwdGlvbihNYXA8UU5hbWUsIENoZWNrZWRFeGNlcHRpb25JbXBsPiBleGNlcHRpb25zKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIERldGFpbFR5cGUgZHQgPSBnZXREZXRhaWwoKTsKKyAgICAgICAgTm9kZSBkZXRhaWwgPSBudWxsOworICAgICAgICBpZihkdCAhPSBudWxsKSAgZGV0YWlsID0gZHQuZ2V0RGV0YWlsKDApOworCisgICAgICAgIC8vcmV0dXJuIFByb3RvY29sRXhjZXB0aW9uIGlmIHRoZSBkZXRhaWwgaXMgbm90IHByZXNlbnQgb3IgdGhlcmUgaXMgbm8gY2hlY2tlZCBleGNlcHRpb24KKyAgICAgICAgaWYoZGV0YWlsID09IG51bGwgfHwgZXhjZXB0aW9ucyA9PSBudWxsKXsKKyAgICAgICAgICAgIC8vIE5vIHNvYXAgZGV0YWlsLCBkb2VzbnQgbG9vayBsaWtlIGl0cyBhIGNoZWNrZWQgZXhjZXB0aW9uCisgICAgICAgICAgICAvLyB0aHJvdyBhIHByb3RvY29sIGV4Y2VwdGlvbgorICAgICAgICAgICAgcmV0dXJuIGF0dGFjaFNlcnZlckV4Y2VwdGlvbihnZXRQcm90b2NvbEV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vY2hlY2sgaWYgdGhlIGRldGFpbCBpcyBhIGNoZWNrZWQgZXhjZXB0aW9uLCBpZiBub3QgdGhyb3cgYSBQcm90b2NvbEV4Y2VwdGlvbgorICAgICAgICBRTmFtZSBkZXRhaWxOYW1lID0gbmV3IFFOYW1lKGRldGFpbC5nZXROYW1lc3BhY2VVUkkoKSwgZGV0YWlsLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgQ2hlY2tlZEV4Y2VwdGlvbkltcGwgY2UgPSBleGNlcHRpb25zLmdldChkZXRhaWxOYW1lKTsKKyAgICAgICAgaWYgKGNlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vTm8gQ2hlY2tlZCBleGNlcHRpb24gZm9yIHRoZSByZWNlaXZlZCBkZXRhaWwgUU5hbWUsIHRocm93IGEgU09BUEZhdWx0IGV4Y2VwdGlvbgorICAgICAgICAgICAgcmV0dXJuIGF0dGFjaFNlcnZlckV4Y2VwdGlvbihnZXRQcm90b2NvbEV4Y2VwdGlvbigpKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNlLmdldEV4Y2VwdGlvblR5cGUoKS5lcXVhbHMoRXhjZXB0aW9uVHlwZS5Vc2VyRGVmaW5lZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRhY2hTZXJ2ZXJFeGNlcHRpb24oY3JlYXRlVXNlckRlZmluZWRFeGNlcHRpb24oY2UpKTsKKworICAgICAgICB9CisgICAgICAgIENsYXNzIGV4Y2VwdGlvbkNsYXNzID0gY2UuZ2V0RXhjZXB0aW9uQ2xhc3MoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZXhjZXB0aW9uQ2xhc3MuZ2V0Q29uc3RydWN0b3IoU3RyaW5nLmNsYXNzLCAoQ2xhc3MpIGNlLmdldERldGFpbFR5cGUoKS50eXBlKTsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSAoRXhjZXB0aW9uKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShnZXRGYXVsdFN0cmluZygpLCBnZXRKQVhCT2JqZWN0KGRldGFpbCwgY2UpKTsKKyAgICAgICAgICAgIHJldHVybiBhdHRhY2hTZXJ2ZXJFeGNlcHRpb24oZXhjZXB0aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgY2FsbGVkIHRvIGNvbnZlcnQgYSAge0BsaW5rIFByb3RvY29sRXhjZXB0aW9ufSBhbmQgZmF1bHRjb2RlIGZvciBhIGdpdmVuIHtAbGluayBTT0FQVmVyc2lvbn0gaW4gdG8gYSB7QGxpbmsgTWVzc2FnZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc29hcFZlcnNpb24ge0BsaW5rIFNPQVBWZXJzaW9uI1NPQVBfMTF9IG9yIHtAbGluayBTT0FQVmVyc2lvbiNTT0FQXzEyfQorICAgICAqIEBwYXJhbSBleCBhIFByb3RvY29sRXhjZXB0aW9uCisgICAgICogQHBhcmFtIGZhdWx0Y29kZSBzb2FwIGZhdWx0Y29kZS4gSXRzIGlnbm9yZWQgaWYgdGhlIHtAbGluayBQcm90b2NvbEV4Y2VwdGlvbn0gaW5zdGFuY2UgaXMge0BsaW5rIFNPQVBGYXVsdEV4Y2VwdGlvbn0gYW5kIGl0IGhhcyBhCisgICAgICogZmF1bHRjb2RlIHByZXNlbnQgaW4gdGhlIHVuZGVybHlpbmcge0BsaW5rIFNPQVBGYXVsdH0uCisgICAgICogQHJldHVybiB7QGxpbmsgTWVzc2FnZX0gcmVwcmVzZW50aW5nIFNPQVAgZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIE1lc3NhZ2UgY3JlYXRlU09BUEZhdWx0TWVzc2FnZShATm90TnVsbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgQE5vdE51bGwgUHJvdG9jb2xFeGNlcHRpb24gZXgsIEBOdWxsYWJsZSBRTmFtZSBmYXVsdGNvZGUpeworICAgICAgICBPYmplY3QgZGV0YWlsID0gZ2V0RmF1bHREZXRhaWwobnVsbCwgZXgpOworICAgICAgICBpZihzb2FwVmVyc2lvbiA9PSBTT0FQVmVyc2lvbi5TT0FQXzEyKQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVAxMkZhdWx0KHNvYXBWZXJzaW9uLCBleCwgZGV0YWlsLCBudWxsLCBmYXVsdGNvZGUpOworICAgICAgICByZXR1cm4gY3JlYXRlU09BUDExRmF1bHQoc29hcFZlcnNpb24sIGV4LCBkZXRhaWwsIG51bGwsIGZhdWx0Y29kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgcnVudGltZSBpbiB0aGUgc2l0dWF0aW9ucyB3aGVuIHRoZXJlIGlzIGFuIEV4Y2VwdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHRyYW5zZm9ybWVkIGluCisgICAgICogdG8gYSBzb2FwZW52OkZhdWx0IHBheWxvYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2VNb2RlbCAgICAge0BsaW5rIENoZWNrZWRFeGNlcHRpb25JbXBsfSBtb2RlbCB0aGF0IHByb3ZpZGVzIHVzZWZ1bCBpbmZvcm1hdGlvbnMgc3VjaCBhcyB0aGUgZGV0YWlsIHRhZ25hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBFeGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIGl0LiBDYWxsZXIgb2YgdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgZ2V0IHRoZSBDaGVja2VkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgIG1vZGVsIGJ5IGNhbGxpbmcge0BsaW5rIEphdmFNZXRob2RJbXBsI2dldENoZWNrZWRFeGNlcHRpb24oQ2xhc3MpfSwgd2hlcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaXMgdC5nZXRDbGFzcygpLgorICAgICAqICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgSWYgaXRzIG51bGwgdGhlbiB0aGlzIGlzIG5vdCBhIGNoZWNrZWQgZXhjZXB0aW9uICBhbmQgaW4gdGhhdCBjYXNlIHRoZSBzb2FwIGZhdWx0IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvbmx5IGZyb20gdGhlIGV4Y2VwdGlvbiBhcyBkZXNjcmliZWQgYmVsb3cuCisgICAgICogQHBhcmFtIGV4ICAgICAgICAgIEV4Y2VwdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQgaW50byBzb2FwZW52OkZhdWx0LCBhbHdheXMgbm9uLW51bGwuCisgICAgICogICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPklmIHQgaXMgaW5zdGFuY2Ugb2Yge0BsaW5rIFNPQVBGYXVsdEV4Y2VwdGlvbn0gdGhlbiBpdHMgc2VyaWxhaXplZCBhcyBwcm90b2NvbCBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT5JZiB0LmdldENhdXNlKCkgaXMgaW5zdGFuY2Ugb2Yge0BsaW5rIFNPQVBGYXVsdEV4Y2VwdGlvbn0gYW5kIHQgaXMgYSBjaGVja2VkIGV4Y2VwdGlvbiB0aGVuCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBzb2FwIGZhdWx0IGRldGFpbCBpcyBzZXJpbGFpemVkIGZyb20gdCBhbmQgdGhlIGZhdWx0IGFjdG9yL3N0cmluZy9yb2xlIGlzIHRha2VuIGZyb20gdC5nZXRDYXVzZSgpLgorICAgICAqICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAqIEBwYXJhbSBzb2FwVmVyc2lvbiBub24tbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZSBjcmVhdGVTT0FQRmF1bHRNZXNzYWdlKFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uLCBDaGVja2VkRXhjZXB0aW9uSW1wbCBjZU1vZGVsLCBUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgT2JqZWN0IGRldGFpbCA9IGdldEZhdWx0RGV0YWlsKGNlTW9kZWwsIGV4KTsKKyAgICAgICAgaWYoc29hcFZlcnNpb24gPT0gU09BUFZlcnNpb24uU09BUF8xMikKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVTT0FQMTJGYXVsdChzb2FwVmVyc2lvbiwgZXgsIGRldGFpbCwgY2VNb2RlbCwgbnVsbCk7CisgICAgICAgIHJldHVybiBjcmVhdGVTT0FQMTFGYXVsdChzb2FwVmVyc2lvbiwgZXgsIGRldGFpbCwgY2VNb2RlbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmVyIHJ1bnRpbWUgd2lsbCBjYWxsIHRoaXMgd2hlbiB0aGVyZSBpcyBzb21lIGludGVybmFsIGVycm9yIG5vdCByZXN1bHRpbmcgZnJvbSBhbiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc29hcFZlcnNpb24ge0BsaW5rIFNPQVBWZXJzaW9uI1NPQVBfMTF9IG9yIHtAbGluayBTT0FQVmVyc2lvbiNTT0FQXzEyfQorICAgICAqIEBwYXJhbSBmYXVsdFN0cmluZyBtdXN0IGJlIG5vbi1udWxsCisgICAgICogQHBhcmFtIGZhdWx0Q29kZSAgIEZvciBTT0FQIDEuMSwgaXQgbXVzdCBiZSBvbmUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgICAgICAgICAgICA8bGk+e0BsaW5rIFNPQVBWZXJzaW9uI2ZhdWx0Q29kZUNsaWVudH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPntAbGluayBTT0FQVmVyc2lvbiNmYXVsdENvZGVTZXJ2ZXJ9CisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT57QGxpbmsgU09BUENvbnN0YW50cyNGQVVMVF9DT0RFX01VU1RfVU5ERVJTVEFORH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPntAbGluayBTT0FQQ29uc3RhbnRzI0ZBVUxUX0NPREVfVkVSU0lPTl9NSVNNQVRDSH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICBGb3IgU09BUCAxLjIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgICAgICAgICAgICA8bGk+e0BsaW5rIFNPQVBWZXJzaW9uI2ZhdWx0Q29kZUNsaWVudH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPntAbGluayBTT0FQVmVyc2lvbiNmYXVsdENvZGVTZXJ2ZXJ9CisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT57QGxpbmsgU09BUDEyQ29uc3RhbnRzI0ZBVUxUX0NPREVfTVVTVF9VTkRFUlNUQU5EfQorICAgICAqICAgICAgICAgICAgICAgICAgICA8bGk+e0BsaW5rIFNPQVAxMkNvbnN0YW50cyNGQVVMVF9DT0RFX1ZFUlNJT05fTUlTTUFUQ0h9CisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT57QGxpbmsgU09BUDEyQ29uc3RhbnRzI0ZBVUxUX0NPREVfREFUQV9FTkNPRElOR19VTktOT1dOfQorICAgICAqICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAqIEByZXR1cm4gbm9uLW51bGwge0BsaW5rIE1lc3NhZ2V9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2UoU09BUFZlcnNpb24gc29hcFZlcnNpb24sIFN0cmluZyBmYXVsdFN0cmluZywgUU5hbWUgZmF1bHRDb2RlKSB7CisgICAgICAgIGlmIChmYXVsdENvZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGZhdWx0Q29kZSA9IGdldERlZmF1bHRGYXVsdENvZGUoc29hcFZlcnNpb24pOworICAgICAgICByZXR1cm4gY3JlYXRlU09BUEZhdWx0TWVzc2FnZShzb2FwVmVyc2lvbiwgZmF1bHRTdHJpbmcsIGZhdWx0Q29kZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2UoU09BUFZlcnNpb24gc29hcFZlcnNpb24sIFNPQVBGYXVsdCBmYXVsdCkgeworICAgICAgICBzd2l0Y2ggKHNvYXBWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIFNPQVBfMTE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEpBWEJNZXNzYWdlLmNyZWF0ZShKQVhCX0NPTlRFWFQsIG5ldyBTT0FQMTFGYXVsdChmYXVsdCksIHNvYXBWZXJzaW9uKTsKKyAgICAgICAgICAgIGNhc2UgU09BUF8xMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gSkFYQk1lc3NhZ2UuY3JlYXRlKEpBWEJfQ09OVEVYVCwgbmV3IFNPQVAxMkZhdWx0KGZhdWx0KSwgc29hcFZlcnNpb24pOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2UgY3JlYXRlU09BUEZhdWx0TWVzc2FnZShTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgU3RyaW5nIGZhdWx0U3RyaW5nLCBRTmFtZSBmYXVsdENvZGUsIEVsZW1lbnQgZGV0YWlsKSB7CisgICAgICAgIHN3aXRjaCAoc29hcFZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgU09BUF8xMToKKyAgICAgICAgICAgICAgICByZXR1cm4gSkFYQk1lc3NhZ2UuY3JlYXRlKEpBWEJfQ09OVEVYVCwgbmV3IFNPQVAxMUZhdWx0KGZhdWx0Q29kZSwgZmF1bHRTdHJpbmcsIG51bGwsIGRldGFpbCksIHNvYXBWZXJzaW9uKTsKKyAgICAgICAgICAgIGNhc2UgU09BUF8xMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gSkFYQk1lc3NhZ2UuY3JlYXRlKEpBWEJfQ09OVEVYVCwgbmV3IFNPQVAxMkZhdWx0KGZhdWx0Q29kZSwgZmF1bHRTdHJpbmcsIGRldGFpbCksIHNvYXBWZXJzaW9uKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgRE9NIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBzdGFjayB0cmFjZSBvZiB0aGUgZXhjZXB0aW9uLAorICAgICAqIGFuZCBhdHRhY2ggdGhhdCB0byB7QGxpbmsgRGV0YWlsVHlwZX0uCisgICAgICovCisgICAgZmluYWwgdm9pZCBjYXB0dXJlU3RhY2tUcmFjZShATnVsbGFibGUgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgaWYodD09bnVsbCkgICAgIHJldHVybjsKKyAgICAgICAgaWYoIWNhcHR1cmVTdGFja1RyYWNlKSAgcmV0dXJuOyAgICAgLy8gZmVhdHVyZSBkaXNhYmxlZAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEb2N1bWVudCBkID0gRE9NVXRpbC5jcmVhdGVEb20oKTsKKyAgICAgICAgICAgIEV4Y2VwdGlvbkJlYW4ubWFyc2hhbCh0LGQpOworCisgICAgICAgICAgICBEZXRhaWxUeXBlIGRldGFpbCA9IGdldERldGFpbCgpOworICAgICAgICAgICAgaWYoZGV0YWlsPT1udWxsKQorICAgICAgICAgICAgc2V0RGV0YWlsKGRldGFpbD1uZXcgRGV0YWlsVHlwZSgpKTsKKworICAgICAgICAgICAgZGV0YWlsLmdldERldGFpbHMoKS5hZGQoZC5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLldBUk5JTkcsICJVbmFibGUgdG8gY2FwdHVyZSB0aGUgc3RhY2sgdHJhY2UgaW50byBYTUwiLGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24gYnkgYXR0YWNoaW5nIHRoZSBzZXJ2ZXIgc2lkZSBleGNlcHRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSA8VCBleHRlbmRzIFRocm93YWJsZT4gVCBhdHRhY2hTZXJ2ZXJFeGNlcHRpb24oVCB0KSB7CisgICAgICAgIERldGFpbFR5cGUgZGV0YWlsID0gZ2V0RGV0YWlsKCk7CisgICAgICAgIGlmKGRldGFpbD09bnVsbCkgICAgICAgIHJldHVybiB0OyAgIC8vIG5vIGRldGFpbHMKKworICAgICAgICBmb3IgKEVsZW1lbnQgbiA6IGRldGFpbC5nZXREZXRhaWxzKCkpIHsKKyAgICAgICAgICAgIGlmKEV4Y2VwdGlvbkJlYW4uaXNTdGFja1RyYWNlWG1sKG4pKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdC5pbml0Q2F1c2UoRXhjZXB0aW9uQmVhbi51bm1hcnNoYWwobikpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBwZXJoYXBzIGluY29ycmVjdGx5IGZvcm1hdHRlZCBYTUwuCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byByZWFkIHRoZSBjYXB0dXJlIHN0YWNrIHRyYWNlIGluIHRoZSBmYXVsdCIsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgYWJzdHJhY3QgcHJvdGVjdGVkIFRocm93YWJsZSBnZXRQcm90b2NvbEV4Y2VwdGlvbigpOworCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0SkFYQk9iamVjdChOb2RlIGpheGJCZWFuLCBDaGVja2VkRXhjZXB0aW9uIGNlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIEJyaWRnZSBicmlkZ2UgPSBjZS5nZXRCcmlkZ2UoKTsKKyAgICAgICAgcmV0dXJuIGJyaWRnZS51bm1hcnNoYWwoamF4YkJlYW4pOworICAgIH0KKworICAgIHByaXZhdGUgRXhjZXB0aW9uIGNyZWF0ZVVzZXJEZWZpbmVkRXhjZXB0aW9uKENoZWNrZWRFeGNlcHRpb25JbXBsIGNlKSB7CisgICAgICAgIENsYXNzIGV4Y2VwdGlvbkNsYXNzID0gY2UuZ2V0RXhjZXB0aW9uQ2xhc3MoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZXhjZXB0aW9uQ2xhc3MuZ2V0Q29uc3RydWN0b3IoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIE9iamVjdCBleGNlcHRpb24gPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShnZXRGYXVsdFN0cmluZygpKTsKKyAgICAgICAgICAgIE5vZGUgZGV0YWlsID0gZ2V0RGV0YWlsKCkuZ2V0RGV0YWlscygpLmdldCgwKTsKKyAgICAgICAgICAgIE9iamVjdCBqYXhiRGV0YWlsID0gZ2V0SkFYQk9iamVjdChkZXRhaWwsIGNlKTsKKyAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gamF4YkRldGFpbC5nZXRDbGFzcygpLmdldEZpZWxkcygpOworICAgICAgICAgICAgZm9yIChGaWVsZCBmIDogZmllbGRzKSB7CisgICAgICAgICAgICAgICAgTWV0aG9kIG0gPSBleGNlcHRpb25DbGFzcy5nZXRNZXRob2QoZ2V0V3JpdGVNZXRob2QoZikpOworICAgICAgICAgICAgICAgIG0uaW52b2tlKGV4Y2VwdGlvbiwgZi5nZXQoamF4YkRldGFpbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgKEV4Y2VwdGlvbikgZXhjZXB0aW9uOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0V3JpdGVNZXRob2QoRmllbGQgZikgeworICAgICAgICByZXR1cm4gInNldCIgKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKGYuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0RmF1bHREZXRhaWwoQ2hlY2tlZEV4Y2VwdGlvbkltcGwgY2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKyAgICAgICAgaWYgKGNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGNlLmdldEV4Y2VwdGlvblR5cGUoKS5lcXVhbHMoRXhjZXB0aW9uVHlwZS5Vc2VyRGVmaW5lZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVEZXRhaWxGcm9tVXNlckRlZmluZWRFeGNlcHRpb24oY2UsIGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtID0gZXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRGYXVsdEluZm8iKTsKKyAgICAgICAgICAgIHJldHVybiBtLmludm9rZShleGNlcHRpb24pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRlRGV0YWlsRnJvbVVzZXJEZWZpbmVkRXhjZXB0aW9uKENoZWNrZWRFeGNlcHRpb25JbXBsIGNlLCBPYmplY3QgZXhjZXB0aW9uKSB7CisgICAgICAgIENsYXNzIGRldGFpbEJlYW4gPSBjZS5nZXREZXRhaWxCZWFuKCk7CisgICAgICAgIEZpZWxkW10gZmllbGRzID0gZGV0YWlsQmVhbi5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IGRldGFpbCA9IGRldGFpbEJlYW4ubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IGZpZWxkcykgeworICAgICAgICAgICAgICAgIE1ldGhvZCBlbSA9IGV4Y2VwdGlvbi5nZXRDbGFzcygpLmdldE1ldGhvZChnZXRSZWFkTWV0aG9kKGYpKTsKKyAgICAgICAgICAgICAgICBNZXRob2Qgc20gPSBkZXRhaWxCZWFuLmdldE1ldGhvZChnZXRXcml0ZU1ldGhvZChmKSwgZW0uZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgICAgICBzbS5pbnZva2UoZGV0YWlsLCBlbS5pbnZva2UoZXhjZXB0aW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGV0YWlsOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmVhZE1ldGhvZChGaWVsZCBmKSB7CisgICAgICAgIGlmIChmLmdldFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKGJvb2xlYW4uY2xhc3MpKQorICAgICAgICAgICAgcmV0dXJuICJpcyIgKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKGYuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuICJnZXQiICsgU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShmLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZSBjcmVhdGVTT0FQMTFGYXVsdChTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgVGhyb3dhYmxlIGUsIE9iamVjdCBkZXRhaWwsIENoZWNrZWRFeGNlcHRpb25JbXBsIGNlLCBRTmFtZSBmYXVsdENvZGUpIHsKKyAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNvYXBGYXVsdEV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIFN0cmluZyBmYXVsdFN0cmluZyA9IG51bGw7CisgICAgICAgIFN0cmluZyBmYXVsdEFjdG9yID0gbnVsbDsKKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOworICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikgeworICAgICAgICAgICAgc29hcEZhdWx0RXhjZXB0aW9uID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZTsKKyAgICAgICAgfSBlbHNlIGlmIChjYXVzZSAhPSBudWxsICYmIGNhdXNlIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICBzb2FwRmF1bHRFeGNlcHRpb24gPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBlLmdldENhdXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBGYXVsdEV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBRTmFtZSBzb2FwRmF1bHRDb2RlID0gc29hcEZhdWx0RXhjZXB0aW9uLmdldEZhdWx0KCkuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOworICAgICAgICAgICAgaWYoc29hcEZhdWx0Q29kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZhdWx0Q29kZSA9IHNvYXBGYXVsdENvZGU7CisKKyAgICAgICAgICAgIGZhdWx0U3RyaW5nID0gc29hcEZhdWx0RXhjZXB0aW9uLmdldEZhdWx0KCkuZ2V0RmF1bHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhdWx0QWN0b3IgPSBzb2FwRmF1bHRFeGNlcHRpb24uZ2V0RmF1bHQoKS5nZXRGYXVsdEFjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhdWx0Q29kZSA9IGdldERlZmF1bHRGYXVsdENvZGUoc29hcFZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhdWx0U3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhdWx0U3RyaW5nID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBpZiAoZmF1bHRTdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhdWx0U3RyaW5nID0gZS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEVsZW1lbnQgZGV0YWlsTm9kZSA9IG51bGw7CisgICAgICAgIGlmIChkZXRhaWwgPT0gbnVsbCAmJiBzb2FwRmF1bHRFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZGV0YWlsTm9kZSA9IHNvYXBGYXVsdEV4Y2VwdGlvbi5nZXRGYXVsdCgpLmdldERldGFpbCgpOworICAgICAgICB9IGVsc2UgaWYoY2UgIT0gbnVsbCl7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERPTVJlc3VsdCBkciA9IG5ldyBET01SZXN1bHQoKTsKKyAgICAgICAgICAgICAgICBjZS5nZXRCcmlkZ2UoKS5tYXJzaGFsKGRldGFpbCxkcik7CisgICAgICAgICAgICAgICAgZGV0YWlsTm9kZSA9IChFbGVtZW50KWRyLmdldE5vZGUoKS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgLy9TaG91bGQgd2UgdGhyb3cgSW50ZXJuYWwgU2VydmVyIEVycm9yPz8/CisgICAgICAgICAgICAgICAgZmF1bHRTdHJpbmcgPSBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBmYXVsdENvZGUgPSBnZXREZWZhdWx0RmF1bHRDb2RlKHNvYXBWZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTT0FQMTFGYXVsdCBzb2FwMTFGYXVsdCA9IG5ldyBTT0FQMTFGYXVsdChmYXVsdENvZGUsIGZhdWx0U3RyaW5nLCBmYXVsdEFjdG9yLCBkZXRhaWxOb2RlKTsKKyAgICAgICAgc29hcDExRmF1bHQuY2FwdHVyZVN0YWNrVHJhY2UoZSk7CisKKyAgICAgICAgcmV0dXJuIEpBWEJNZXNzYWdlLmNyZWF0ZShKQVhCX0NPTlRFWFQsIHNvYXAxMUZhdWx0LCBzb2FwVmVyc2lvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZSBjcmVhdGVTT0FQMTJGYXVsdChTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiwgVGhyb3dhYmxlIGUsIE9iamVjdCBkZXRhaWwsIENoZWNrZWRFeGNlcHRpb25JbXBsIGNlLCBRTmFtZSBmYXVsdENvZGUpIHsKKyAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNvYXBGYXVsdEV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIENvZGVUeXBlIGNvZGUgPSBudWxsOworICAgICAgICBTdHJpbmcgZmF1bHRTdHJpbmcgPSBudWxsOworICAgICAgICBTdHJpbmcgZmF1bHRSb2xlID0gbnVsbDsKKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOworICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikgeworICAgICAgICAgICAgc29hcEZhdWx0RXhjZXB0aW9uID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZTsKKyAgICAgICAgfSBlbHNlIGlmIChjYXVzZSAhPSBudWxsICYmIGNhdXNlIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICBzb2FwRmF1bHRFeGNlcHRpb24gPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBlLmdldENhdXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBGYXVsdEV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBzb2FwRmF1bHRFeGNlcHRpb24uZ2V0RmF1bHQoKTsKKyAgICAgICAgICAgIFFOYW1lIHNvYXBGYXVsdENvZGUgPSBmYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCk7CisgICAgICAgICAgICBpZihzb2FwRmF1bHRDb2RlICE9IG51bGwpeworICAgICAgICAgICAgICAgIGZhdWx0Q29kZSA9IHNvYXBGYXVsdENvZGU7CisgICAgICAgICAgICAgICAgY29kZSA9IG5ldyBDb2RlVHlwZShmYXVsdENvZGUpOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBmYXVsdC5nZXRGYXVsdFN1YmNvZGVzKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgU3ViY29kZVR5cGUgc3ViY29kZSA9IG51bGw7CisgICAgICAgICAgICAgICAgd2hpbGUoaXRlci5oYXNOZXh0KCkpeworICAgICAgICAgICAgICAgICAgICBRTmFtZSB2YWx1ZSA9IChRTmFtZSlpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZmlyc3QpeworICAgICAgICAgICAgICAgICAgICAgICAgU3ViY29kZVR5cGUgc2N0ID0gbmV3IFN1YmNvZGVUeXBlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuc2V0U3ViY29kZShzY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgc3ViY29kZSA9IHNjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdWJjb2RlID0gZmlsbFN1YmNvZGVzKHN1YmNvZGUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYXVsdFN0cmluZyA9IHNvYXBGYXVsdEV4Y2VwdGlvbi5nZXRGYXVsdCgpLmdldEZhdWx0U3RyaW5nKCk7CisgICAgICAgICAgICBmYXVsdFJvbGUgPSBzb2FwRmF1bHRFeGNlcHRpb24uZ2V0RmF1bHQoKS5nZXRGYXVsdEFjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhdWx0Q29kZSA9IGdldERlZmF1bHRGYXVsdENvZGUoc29hcFZlcnNpb24pOworICAgICAgICAgICAgY29kZSA9IG5ldyBDb2RlVHlwZShmYXVsdENvZGUpOworICAgICAgICB9ZWxzZSBpZihjb2RlID09IG51bGwpeworICAgICAgICAgICAgY29kZSA9IG5ldyBDb2RlVHlwZShmYXVsdENvZGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhdWx0U3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhdWx0U3RyaW5nID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBpZiAoZmF1bHRTdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhdWx0U3RyaW5nID0gZS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUmVhc29uVHlwZSByZWFzb24gPSBuZXcgUmVhc29uVHlwZShmYXVsdFN0cmluZyk7CisgICAgICAgIEVsZW1lbnQgZGV0YWlsTm9kZSA9IG51bGw7CisgICAgICAgIGlmIChkZXRhaWwgPT0gbnVsbCAmJiBzb2FwRmF1bHRFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZGV0YWlsTm9kZSA9IHNvYXBGYXVsdEV4Y2VwdGlvbi5nZXRGYXVsdCgpLmdldERldGFpbCgpOworICAgICAgICB9IGVsc2UgaWYoZGV0YWlsICE9IG51bGwpeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBET01SZXN1bHQgZHIgPSBuZXcgRE9NUmVzdWx0KCk7CisgICAgICAgICAgICAgICAgY2UuZ2V0QnJpZGdlKCkubWFyc2hhbChkZXRhaWwsIGRyKTsKKyAgICAgICAgICAgICAgICBkZXRhaWxOb2RlID0gKEVsZW1lbnQpZHIuZ2V0Tm9kZSgpLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICAvL1Nob3VsZCB3ZSB0aHJvdyBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3I/Pz8KKyAgICAgICAgICAgICAgICBmYXVsdFN0cmluZyA9IGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIGZhdWx0Q29kZSA9IGdldERlZmF1bHRGYXVsdENvZGUoc29hcFZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERldGFpbFR5cGUgZGV0YWlsVHlwZSA9IG51bGw7CisgICAgICAgIGlmKGRldGFpbE5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIGRldGFpbFR5cGUgPSBuZXcgRGV0YWlsVHlwZShkZXRhaWxOb2RlKTsKKyAgICAgICAgU09BUDEyRmF1bHQgc29hcDEyRmF1bHQgPSBuZXcgU09BUDEyRmF1bHQoY29kZSwgcmVhc29uLCBudWxsLCBmYXVsdFJvbGUsIGRldGFpbFR5cGUpOworICAgICAgICBzb2FwMTJGYXVsdC5jYXB0dXJlU3RhY2tUcmFjZShlKTsKKworICAgICAgICByZXR1cm4gSkFYQk1lc3NhZ2UuY3JlYXRlKEpBWEJfQ09OVEVYVCwgc29hcDEyRmF1bHQsIHNvYXBWZXJzaW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdWJjb2RlVHlwZSBmaWxsU3ViY29kZXMoU3ViY29kZVR5cGUgcGFyZW50LCBRTmFtZSB2YWx1ZSl7CisgICAgICAgIFN1YmNvZGVUeXBlIG5ld0NvZGUgPSBuZXcgU3ViY29kZVR5cGUodmFsdWUpOworICAgICAgICBwYXJlbnQuc2V0U3ViY29kZShuZXdDb2RlKTsKKyAgICAgICAgcmV0dXJuIG5ld0NvZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUU5hbWUgZ2V0RGVmYXVsdEZhdWx0Q29kZShTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICByZXR1cm4gc29hcFZlcnNpb24uZmF1bHRDb2RlU2VydmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIGZhdWx0IHtAbGluayBNZXNzYWdlfSBhbmQgcmV0dXJucyBpdCBhcyBhIHtAbGluayBTT0FQRmF1bHRCdWlsZGVyfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWx3YXlzIG5vbi1udWxsIHZhbGlkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24gaWYgdGhlIHBhcnNpbmcgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTT0FQRmF1bHRCdWlsZGVyIGNyZWF0ZShNZXNzYWdlIG1zZykgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbXNnLnJlYWRQYXlsb2FkQXNKQVhCKEpBWEJfQ09OVEVYVC5jcmVhdGVVbm1hcnNoYWxsZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB7QGxpbmsgSkFYQkNvbnRleHR9IGNhbiBoYW5kbGUgU09BUCAxLjEvMS4yIGZhdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKQVhCUklDb250ZXh0IEpBWEJfQ09OVEVYVDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNPQVBGYXVsdEJ1aWxkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIFNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZ2VuZXJhdGVkIGZhdWx0cyB0byBoYXZlIHN0YWNrIHRyYWNlIGluIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYXB0dXJlU3RhY2tUcmFjZTsKKworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQVFVSRV9TVEFDS19UUkFDRV9QUk9QRVJUWSA9IFNPQVBGYXVsdEJ1aWxkZXIuY2xhc3MuZ2V0TmFtZSgpKyIuZGlzYWJsZUNhcHR1cmVTdGFja1RyYWNlIjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYXB0dXJlU3RhY2tUcmFjZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDQVBUVVJFX1NUQUNLX1RSQUNFX1BST1BFUlRZKT09bnVsbDsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSkFYQl9DT05URVhUID0gKEpBWEJSSUNvbnRleHQpSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoU09BUDExRmF1bHQuY2xhc3MsIFNPQVAxMkZhdWx0LmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7IC8vIHRoaXMgbXVzdCBiZSBhIGJ1ZyBpbiBvdXIgY29kZQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvU3ViY29kZVR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1N1YmNvZGVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3ODI2MwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2ZhdWx0L1N1YmNvZGVUeXBlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmZhdWx0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRzOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIDxwcmU+CisgKiAgICAgICZsdDtlbnY6U3ViY29kZT4KKyAqICAgICAgICAgICZsdDtlbnY6VmFsdWU+bTpNZXNzYWdlVGltZW91dDEmbHQ7L2VudjpWYWx1ZT4KKyAqICAgICAgICAgICZsdDtlbnY6U3ViY29kZT4KKyAqICAgICAgICAgICAgICAmbHQ7ZW52OlZhbHVlPm06TWVzc2FnZVRpbWVvdXQyJmx0Oy9lbnY6VmFsdWU+CisgKiAgICAgICAgICAmbHQ7L2VudjpTdWJjb2RlPgorICogICAgICAmbHQ7L2VudjpTdWJjb2RlPgorICogIDwvcHJlPgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIlN1YmNvZGVUeXBlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIsIHByb3BPcmRlciA9IHsKKyAgICAiVmFsdWUiLAorICAgICJTdWJjb2RlIgorICAgICAgICB9KQorY2xhc3MgU3ViY29kZVR5cGUgeworICAgIEBYbWxUcmFuc2llbnQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7CisgICAgLyoqCisgICAgICogbWFuZGF0b3J5LCBtaW5PY2N1cnM9MQorICAgICAqLworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9IG5zKQorICAgIHByaXZhdGUgUU5hbWUgVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBvcHRpb25hbCwgbWluT2NjY3Vycz0wCisgICAgICovCisgICAgQFhtbEVsZW1lbnRzKEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9IG5zKSkKKyAgICBwcml2YXRlIFN1YmNvZGVUeXBlIFN1YmNvZGU7CisKKyAgICBwdWJsaWMgU3ViY29kZVR5cGUoUU5hbWUgdmFsdWUpIHsKKyAgICAgICAgVmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViY29kZVR5cGUoKSB7CisgICAgfQorCisgICAgUU5hbWUgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBWYWx1ZTsKKyAgICB9CisKKyAgICBTdWJjb2RlVHlwZSBnZXRTdWJjb2RlKCkgeworICAgICAgICByZXR1cm4gU3ViY29kZTsKKyAgICB9CisKKyAgICB2b2lkIHNldFN1YmNvZGUoU3ViY29kZVR5cGUgc3ViY29kZSkgeworICAgICAgICBTdWJjb2RlID0gc3ViY29kZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9mYXVsdC9UZXh0VHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvVGV4dFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGM3NmMwCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvZmF1bHQvVGV4dFR5cGUuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZmF1bHQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIDxwcmU+CisgKiAgICAmbHQ7ZW52OlRleHQgeG1sOmxhbmc9ImVuIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+CisgKiA8L3ByZT4KKyAqLworQFhtbFR5cGUobmFtZSA9ICJUZXh0VHlwZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiKQorY2xhc3MgVGV4dFR5cGUgeworICAgIHByaXZhdGUgQFhtbFZhbHVlIFN0cmluZyB0ZXh0OworCisgICAgLyoqCisgICAgICogeG1sOmxhbmcgYXR0cmlidXRlLiBXaGF0IHNob3VsZCBiZSB2YWx1ZSBvZiBuYW1lc3BhY2UgZm9yICJ4bWwiCisgICAgICovCisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gImxhbmciLCBuYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgcmVxdWlyZWQgPSB0cnVlKQorICAgIHByaXZhdGUgU3RyaW5nIGxhbmc7CisKKyAgICBUZXh0VHlwZSgpIHsKKyAgICB9CisKKyAgICBUZXh0VHlwZShTdHJpbmcgdGV4dCkgeworICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICB0aGlzLmxhbmcgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCk7CisgICAgfQorCisgICAgU3RyaW5nIGdldFRleHQoKXsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9DbGllbnRMb2dpY2FsSGFuZGxlclR1YmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvQ2xpZW50TG9naWNhbEhhbmRsZXJUdWJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzNjIwOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvQ2xpZW50TG9naWNhbEhhbmRsZXJUdWJlLmphdmEKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlQ2xvbmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuaGVscGVyLkFic3RyYWN0RmlsdGVyVHViZUltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICoKKyAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50TG9naWNhbEhhbmRsZXJUdWJlIGV4dGVuZHMgSGFuZGxlclR1YmUgeworCisgICAgcHJpdmF0ZSBXU0JpbmRpbmcgYmluZGluZzsKKyAgICBwcml2YXRlIExpc3Q8TG9naWNhbEhhbmRsZXI+IGxvZ2ljYWxIYW5kbGVyczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTG9naWNhbEhhbmRsZXJUdWJlCisgICAgICovCisgICAgcHVibGljIENsaWVudExvZ2ljYWxIYW5kbGVyVHViZShXU0JpbmRpbmcgYmluZGluZywgV1NETFBvcnQgcG9ydCwgVHViZSBuZXh0KSB7CisgICAgICAgIHN1cGVyKG5leHQsIHBvcnQpOworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBvbiBjbGllbnQtc2lkZSB3aGVyZSwgU09BUEhhbmRsZXJUdWJlIGlzIGNyZWF0ZWQKKyAgICAgKiBmaXJzdCBhbmQgdGhlbiBhIExvZ2ljYWxIYW5kbGVyVHViZSBpcyBjcmVhdGVkIHdpdGggYSBoYW5kbGVyIHRvIHRoYXQKKyAgICAgKiBTT0FQSGFuZGxlclR1YmUuCisgICAgICogV2l0aCB0aGlzIGhhbmRsZSwgTG9naWNhbEhhbmRsZXJUdWJlIGNhbiBjYWxsCisgICAgICogU09BUEhhbmRsZXJUdWJlLmNsb3NlSGFuZGxlcnMoKQorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRMb2dpY2FsSGFuZGxlclR1YmUoV1NCaW5kaW5nIGJpbmRpbmcsIFR1YmUgbmV4dCwgSGFuZGxlclR1YmUgY291c2luVHViZSkgeworICAgICAgICBzdXBlcihuZXh0LCBjb3VzaW5UdWJlKTsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZSNjb3B5KGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVDbG9uZXIpfS4KKyAgICAgKi8KKworICAgIHByaXZhdGUgQ2xpZW50TG9naWNhbEhhbmRsZXJUdWJlKENsaWVudExvZ2ljYWxIYW5kbGVyVHViZSB0aGF0LCBUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICBzdXBlcih0aGF0LCBjbG9uZXIpOworICAgICAgICB0aGlzLmJpbmRpbmcgPSB0aGF0LmJpbmRpbmc7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0hhbmRsZXJDaGFpbkVtcHR5KCkgeworICAgICAgICByZXR1cm4gbG9naWNhbEhhbmRsZXJzLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBTT0FQSGFuZGxlcnMgZmlyc3QgYW5kIHRoZW4gTG9naWNhbEhhbmRsZXJzIG9uIENsaWVudAorICAgICAqIENsb3NlIExvZ2ljYWxIYW5kbGVycyBmaXJzdCBhbmQgdGhlbiBTT0FQSGFuZGxlcnMgb24gU2VydmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgeworICAgICAgICAvL2Fzc3VtaW5nIGNvdXNpblR1YmUgaXMgY2FsbGVkIGlmIHJlcXVlc3RQcm9jZXNzaW5nU3VjZXNzZnVsIGlzIHRydWUKKyAgICAgICAgaWYgKHJlcXVlc3RQcm9jZXNzaW5nU3VjZXNzZnVsKSB7CisgICAgICAgICAgICAvL2NvdXNpblR1YmUgaXMgbnVsbCBpbiBYTUwvSFRUUCBCaW5kaW5nCisgICAgICAgICAgICBpZiAoY291c2luVHViZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xvc2UgU09BUEhhbmRsZXJUdWJlCisgICAgICAgICAgICAgICAgY291c2luVHViZS5jbG9zZUNhbGwobXNnQ29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2Nlc3NvciAhPSBudWxsKQorICAgICAgICAgICAgY2xvc2VMb2dpY2FsSGFuZGxlcnMobXNnQ29udGV4dCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGNvdXNpblR1YmUuCisgICAgICogQ2xvc2UgdGhpcyBUdWJlcydzIGhhbmRsZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlQ2FsbChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7CisgICAgICAgIGNsb3NlTG9naWNhbEhhbmRsZXJzKG1zZ0NvbnRleHQpOworICAgIH0KKworICAgIC8vVE9ETzoKKyAgICBwcml2YXRlIHZvaWQgY2xvc2VMb2dpY2FsSGFuZGxlcnMoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgeworICAgICAgICBpZiAocHJvY2Vzc29yID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChyZW1lZHlBY3Rpb25UYWtlbikgeworICAgICAgICAgICAgLy9DbG9zZSBvbmx5IGludm9rZWQgaGFuZGxlcnMgaW4gdGhlIGNoYWluCisKKyAgICAgICAgICAgIC8vQ0xJRU5ULVNJREUKKyAgICAgICAgICAgIHByb2Nlc3Nvci5jbG9zZUhhbmRsZXJzKG1zZ0NvbnRleHQsIHByb2Nlc3Nvci5nZXRJbmRleCgpLCAwKTsKKyAgICAgICAgICAgIHByb2Nlc3Nvci5zZXRJbmRleCgtMSk7CisgICAgICAgICAgICAvL3Jlc2V0IHJlbWVkeUFjdGlvblRha2VuCisgICAgICAgICAgICByZW1lZHlBY3Rpb25UYWtlbiA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9DbG9zZSBhbGwgaGFuZGxlcnMgaW4gdGhlIGNoYWluCisKKyAgICAgICAgICAgIC8vQ0xJRU5ULVNJREUKKyAgICAgICAgICAgIHByb2Nlc3Nvci5jbG9zZUhhbmRsZXJzKG1zZ0NvbnRleHQsIGxvZ2ljYWxIYW5kbGVycy5zaXplKCkgLSAxLCAwKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEFic3RyYWN0RmlsdGVyVHViZUltcGwgY29weShUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICByZXR1cm4gbmV3IENsaWVudExvZ2ljYWxIYW5kbGVyVHViZSh0aGlzLCBjbG9uZXIpOworICAgIH0KKworICAgIHZvaWQgc2V0VXBQcm9jZXNzb3IoKSB7CisgICAgICAgIC8vIFRha2UgYSBzbmFwc2hvdCwgVXNlciBtYXkgY2hhbmdlIGNoYWluIGFmdGVyIGludm9jYXRpb24sIFNhbWUgY2hhaW4KKyAgICAgICAgLy8gc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBlbnRpcmUgTUVQCisgICAgICAgIGxvZ2ljYWxIYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8TG9naWNhbEhhbmRsZXI+KCk7CisgICAgICAgIExpc3Q8TG9naWNhbEhhbmRsZXI+IGxvZ2ljYWxTbmFwU2hvdD0gKChCaW5kaW5nSW1wbCkgYmluZGluZykuZ2V0SGFuZGxlckNvbmZpZygpLmdldExvZ2ljYWxIYW5kbGVycygpOworICAgICAgICBpZiAoIWxvZ2ljYWxTbmFwU2hvdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxvZ2ljYWxIYW5kbGVycy5hZGRBbGwobG9naWNhbFNuYXBTaG90KTsKKyAgICAgICAgICAgIGlmIChiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBYTUxIYW5kbGVyUHJvY2Vzc29yKHRoaXMsIGJpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsSGFuZGxlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgU09BUEhhbmRsZXJQcm9jZXNzb3IodHJ1ZSwgdGhpcywgYmluZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxIYW5kbGVycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGdldENvbnRleHQoUGFja2V0IHBhY2tldCkgeworICAgICAgICByZXR1cm4gbmV3IExvZ2ljYWxNZXNzYWdlQ29udGV4dEltcGwoYmluZGluZywgcGFja2V0KTsKKyAgICB9CisKKyAgICBib29sZWFuIGNhbGxIYW5kbGVyc09uUmVxdWVzdChNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGlzT25lV2F5KSB7CisKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVyUmVzdWx0OworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvL0NMSUVOVC1TSURFCisgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcHJvY2Vzc29yLmNhbGxIYW5kbGVyc1JlcXVlc3QoSGFuZGxlclByb2Nlc3Nvci5EaXJlY3Rpb24uT1VUQk9VTkQsIGNvbnRleHQsICFpc09uZVdheSk7CisgICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7CisgICAgICAgICAgICByZW1lZHlBY3Rpb25UYWtlbiA9IHRydWU7CisgICAgICAgICAgICAvL25vIHJld3JhcHBpbmcKKyAgICAgICAgICAgIHRocm93IHdzZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVtZWR5QWN0aW9uVGFrZW4gPSB0cnVlOworCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihyZSk7CisKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHsKKyAgICAgICAgICAgIHJlbWVkeUFjdGlvblRha2VuID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDsKKyAgICB9CisKKyAgICB2b2lkIGNhbGxIYW5kbGVyc09uUmVzcG9uc2UoTWVzc2FnZVVwZGF0YWJsZUNvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoYW5kbGVGYXVsdCkgeworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvL0NMSUVOVC1TSURFCisgICAgICAgICAgICBwcm9jZXNzb3IuY2FsbEhhbmRsZXJzUmVzcG9uc2UoSGFuZGxlclByb2Nlc3Nvci5EaXJlY3Rpb24uSU5CT1VORCwgY29udGV4dCwgaGFuZGxlRmF1bHQpOworCisgICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7CisgICAgICAgICAgICAvL25vIHJld3JhcHBpbmcKKyAgICAgICAgICAgIHRocm93IHdzZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihyZSk7CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvQ2xpZW50U09BUEhhbmRsZXJUdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0NsaWVudFNPQVBIYW5kbGVyVHViZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOGI2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0NsaWVudFNPQVBIYW5kbGVyVHViZS5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVDbG9uZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuSGFuZGxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkRhdGFIYW5kbGVyQXR0YWNobWVudDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRTT0FQSGFuZGxlclR1YmUgZXh0ZW5kcyBIYW5kbGVyVHViZSB7CisKKyAgICBwcml2YXRlIFdTQmluZGluZyBiaW5kaW5nOworICAgIHByaXZhdGUgTGlzdDxTT0FQSGFuZGxlcj4gc29hcEhhbmRsZXJzOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gcm9sZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNPQVBIYW5kbGVyVHViZQorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRTT0FQSGFuZGxlclR1YmUoV1NCaW5kaW5nIGJpbmRpbmcsIFdTRExQb3J0IHBvcnQsIFR1YmUgbmV4dCkgeworICAgICAgICBzdXBlcihuZXh0LCBwb3J0KTsKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTT0FQSGFuZGxlclR1YmUgc2hvdWxkIG4ndCBiZSB1c2VkIGZvciBiaW5kaW5ncyBvdGhlciB0aGFuIFNPQVAuCisgICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBFeGNlcHRpb24KKyAgICAgICAgfQorICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgIH0KKworICAgIC8vIEhhbmRsZSB0byBMb2dpY2FsSGFuZGxlclR1YmUgbWVhbnMgaXRzIHVzZWQgb24gU0VSVkVSLVNJREUKKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBvbiBjbGllbnQtc2lkZSB3aGVyZSwgTG9naWNhbEhhbmRsZXJUdWJlIGlzIGNyZWF0ZWQKKyAgICAgKiBmaXJzdCBhbmQgdGhlbiBhIFNPQVBIYW5kbGVyVHViZSBpcyBjcmVhdGVkIHdpdGggYSBoYW5kbGVyIHRvIHRoYXQKKyAgICAgKiBMb2dpY2FsSGFuZGxlclR1YmUuCisgICAgICogV2l0aCB0aGlzIGhhbmRsZSwgU09BUEhhbmRsZXJUdWJlIGNhbiBjYWxsIExvZ2ljYWxIYW5kbGVyVHViZS5jbG9zZUhhbmRsZXJzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50U09BUEhhbmRsZXJUdWJlKFdTQmluZGluZyBiaW5kaW5nLCBUdWJlIG5leHQsIEhhbmRsZXJUdWJlIGNvdXNpblR1YmUpIHsKKyAgICAgICAgc3VwZXIobmV4dCwgY291c2luVHViZSk7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3RvciBmb3Ige0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmUjY29weShjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlQ2xvbmVyKX0uCisgICAgICovCisgICAgcHJpdmF0ZSBDbGllbnRTT0FQSGFuZGxlclR1YmUoQ2xpZW50U09BUEhhbmRsZXJUdWJlIHRoYXQsIFR1YmVDbG9uZXIgY2xvbmVyKSB7CisgICAgICAgIHN1cGVyKHRoYXQsIGNsb25lcik7CisgICAgICAgIHRoaXMuYmluZGluZyA9IHRoYXQuYmluZGluZzsKKyAgICB9CisKKyAgICBib29sZWFuIGlzSGFuZGxlckNoYWluRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBzb2FwSGFuZGxlcnMuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIFNPQVBIYW5kbGVycyBmaXJzdCBhbmQgdGhlbiBMb2dpY2FsSGFuZGxlcnMgb24gQ2xpZW50CisgICAgICogQ2xvc2UgTG9naWNhbEhhbmRsZXJzIGZpcnN0IGFuZCB0aGVuIFNPQVBIYW5kbGVycyBvbiBTZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGNvdXNpblR1YmUuCisgICAgICogQ2xvc2UgdGhpcyBUdWJlJ3MgaGFuZGxlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VDYWxsKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKKyAgICAgICAgY2xvc2VTT0FQSGFuZGxlcnMobXNnQ29udGV4dCk7CisgICAgfQorCisgICAgLy9UT0RPOgorICAgIHByaXZhdGUgdm9pZCBjbG9zZVNPQVBIYW5kbGVycyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7CisgICAgICAgIGlmIChwcm9jZXNzb3IgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHJlbWVkeUFjdGlvblRha2VuKSB7CisgICAgICAgICAgICAvL0Nsb3NlIG9ubHkgaW52b2tlZCBoYW5kbGVycyBpbiB0aGUgY2hhaW4KKworICAgICAgICAgICAgLy9DTElFTlQtU0lERQorICAgICAgICAgICAgcHJvY2Vzc29yLmNsb3NlSGFuZGxlcnMobXNnQ29udGV4dCwgcHJvY2Vzc29yLmdldEluZGV4KCksIDApOworICAgICAgICAgICAgcHJvY2Vzc29yLnNldEluZGV4KC0xKTsKKyAgICAgICAgICAgIC8vcmVzZXQgcmVtZWR5QWN0aW9uVGFrZW4KKyAgICAgICAgICAgIHJlbWVkeUFjdGlvblRha2VuID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL0Nsb3NlIGFsbCBoYW5kbGVycyBpbiB0aGUgY2hhaW4KKworICAgICAgICAgICAgLy9DTElFTlQtU0lERQorICAgICAgICAgICAgcHJvY2Vzc29yLmNsb3NlSGFuZGxlcnMobXNnQ29udGV4dCwgc29hcEhhbmRsZXJzLnNpemUoKSAtIDEsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEFic3RyYWN0RmlsdGVyVHViZUltcGwgY29weShUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICByZXR1cm4gbmV3IENsaWVudFNPQVBIYW5kbGVyVHViZSh0aGlzLCBjbG9uZXIpOworICAgIH0KKworICAgIHZvaWQgc2V0VXBQcm9jZXNzb3IoKSB7CisgICAgICAgIC8vIFRha2UgYSBzbmFwc2hvdCwgVXNlciBtYXkgY2hhbmdlIGNoYWluIGFmdGVyIGludm9jYXRpb24sIFNhbWUgY2hhaW4KKyAgICAgICAgLy8gc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBlbnRpcmUgTUVQCisgICAgICAgIHNvYXBIYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8U09BUEhhbmRsZXI+KCk7CisgICAgICAgIEhhbmRsZXJDb25maWd1cmF0aW9uIGhhbmRsZXJDb25maWcgPSAoKEJpbmRpbmdJbXBsKSBiaW5kaW5nKS5nZXRIYW5kbGVyQ29uZmlnKCk7CisgICAgICAgIExpc3Q8U09BUEhhbmRsZXI+IHNvYXBTbmFwU2hvdD0gaGFuZGxlckNvbmZpZy5nZXRTb2FwSGFuZGxlcnMoKTsKKyAgICAgICAgaWYgKCFzb2FwU25hcFNob3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzb2FwSGFuZGxlcnMuYWRkQWxsKHNvYXBTbmFwU2hvdCk7CisgICAgICAgICAgICByb2xlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIHJvbGVzLmFkZEFsbChoYW5kbGVyQ29uZmlnLmdldFJvbGVzKCkpOworICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IFNPQVBIYW5kbGVyUHJvY2Vzc29yKHRydWUsIHRoaXMsIGJpbmRpbmcsIHNvYXBIYW5kbGVycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBnZXRDb250ZXh0KFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgU09BUE1lc3NhZ2VDb250ZXh0SW1wbCBjb250ZXh0ID0gbmV3IFNPQVBNZXNzYWdlQ29udGV4dEltcGwoYmluZGluZywgcGFja2V0KTsKKyAgICAgICAgY29udGV4dC5zZXRSb2xlcyhyb2xlcyk7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworICAgIGJvb2xlYW4gY2FsbEhhbmRsZXJzT25SZXF1ZXN0KE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaXNPbmVXYXkpIHsKKworICAgICAgICBib29sZWFuIGhhbmRsZXJSZXN1bHQ7CisgICAgICAgIC8vTGV0cyBjb3B5IGFsbCB0aGUgTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfQVRUQUNITUVOVF9QUk9QRVJUWSB0byB0aGUgbWVzc2FnZQorICAgICAgICBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gYXR0cyA9IChNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4pIGNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOworICAgICAgICBBdHRhY2htZW50U2V0IGF0dFNldCA9IHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0QXR0YWNobWVudHMoKTsKKyAgICAgICAgZm9yKFN0cmluZyBjaWQgOiBhdHRzLmtleVNldCgpKXsKKyAgICAgICAgICAgIEF0dGFjaG1lbnQgYXR0ID0gbmV3IERhdGFIYW5kbGVyQXR0YWNobWVudChjaWQsIGF0dHMuZ2V0KGNpZCkpOworICAgICAgICAgICAgYXR0U2V0LmFkZChhdHQpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vQ0xJRU5ULVNJREUKKyAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSBwcm9jZXNzb3IuY2FsbEhhbmRsZXJzUmVxdWVzdChIYW5kbGVyUHJvY2Vzc29yLkRpcmVjdGlvbi5PVVRCT1VORCwgY29udGV4dCwgIWlzT25lV2F5KTsKKyAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKKyAgICAgICAgICAgIHJlbWVkeUFjdGlvblRha2VuID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vbm8gcmV3cmFwcGluZworICAgICAgICAgICAgdGhyb3cgd3NlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZW1lZHlBY3Rpb25UYWtlbiA9IHRydWU7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKHJlKTsKKworICAgICAgICB9CisgICAgICAgIGlmICghaGFuZGxlclJlc3VsdCkgeworICAgICAgICAgICAgcmVtZWR5QWN0aW9uVGFrZW4gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0OworICAgIH0KKworICAgIHZvaWQgY2FsbEhhbmRsZXJzT25SZXNwb25zZShNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGhhbmRsZUZhdWx0KSB7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vQ0xJRU5ULVNJREUKKyAgICAgICAgICAgIHByb2Nlc3Nvci5jYWxsSGFuZGxlcnNSZXNwb25zZShIYW5kbGVyUHJvY2Vzc29yLkRpcmVjdGlvbi5JTkJPVU5ELCBjb250ZXh0LCBoYW5kbGVGYXVsdCk7CisKKyAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKKyAgICAgICAgICAgIC8vbm8gcmV3cmFwcGluZworICAgICAgICAgICAgdGhyb3cgd3NlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihyZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJDaGFpbkNhbGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5DYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0YTMyOS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJDaGFpbkNhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdG9jb2xFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzOwotCi0vKioKLSAqIFRoZSBjbGFzcyBzdG9yZXMgdGhlIGFjdHVhbCAiY2hhaW4iIG9mIGhhbmRsZXJzIHRoYXQgaXMgY2FsbGVkCi0gKiBkdXJpbmcgYSByZXF1ZXN0IG9yIHJlc3BvbnNlLiBPbiB0aGUgY2xpZW50IHNpZGUsIGl0IGlzIGNyZWF0ZWQKLSAqIGJ5IGEge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGx9IGNsYXNzIHdoZW4gYQotICogYmluZGluZyBwcm92aWRlciBpcyBjcmVhdGVkLiBPbiB0aGUgc2VydmVyIHNpZGUsIHdoZXJlIGEgQmluZGluZwotICogb2JqZWN0IG1heSBiZSBwYXNzZWQgZnJvbSBhbiBvdXRzaWRlIHNvdXJjZSwgdGhlIGhhbmRsZXIgY2hhaW4KLSAqIGNhbGxlciBtYXkgYmUgY3JlYXRlZCBieSB0aGUgbWVzc2FnZSBkaXNwYXRjaGVyIGNsYXNzZXMuCi0gKgotICogPHA+V2hlbiBjcmVhdGVkLCBhIGphdmEudXRpbC5MaXN0IG9mIEhhbmRsZXJzIGlzIHBhc3NlZCBpbi4gVGhpcyBsaXN0Ci0gKiBpcyBzb3J0ZWQgaW50byBsb2dpY2FsIGFuZCBwcm90b2NvbCBoYW5kbGVycywgc28gdGhlIGhhbmRsZXIgb3JkZXIKLSAqIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXRIYW5kbGVyQ2hhaW4oKSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlCi0gKiBvcmlnaW5hbCB0aGF0IHdhcyBwYXNzZWQgaW4uCi0gKgotICogPHA+QXQgcnVudGltZSwgb25lIG9mIHRoZSBjYWxsSGFuZGxlcnMoKSBtZXRob2RzIGlzIGludm9rZWQgYnkgdGhlCi0gKiBzb2FwIG9yIHhtbCBtZXNzYWdlIGRpc3BhdGNoZXJzLCBwYXNzaW5nIGluIGEge0BsaW5rIEhhbmRsZXJDb250ZXh0fQotICogb3Ige0BsaW5rIFhNTEhhbmRsZXJDb250ZXh0fSBvYmplY3QgYWxvbmcgd2l0aCBvdGhlciBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlIGN1cnJlbnQgbWVzc2FnZSB0aGF0IGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgaGFuZGxlciBmbG93LgotICoKLSAqIDxwPkV4Y2VwdGlvbnMgYXJlIGxvZ2dlZCBpbiBtYW55IGNhc2VzIGhlcmUgYmVmb3JlIGJlaW5nIHJldGhyb3duLiBUaGlzCi0gKiBpcyB0byBoZWxwIHByaW1hcmlseSB3aXRoIHNlcnZlciBzaWRlIGhhbmRsZXJzLgotICoKLSAqIDxwPkN1cnJlbnRseSwgdGhlIGhhbmRsZXIgY2hhaW4gY2FsbGVyIGNoZWNrcyBmb3IgYSBudWxsIHNvYXAKLSAqIG1lc3NhZ2UgY29udGV4dCB0byBzZWUgaWYgdGhlIGJpbmRpbmcgaW4gdXNlIGlzIFhNTC9IVFRQLgotICoKLSAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbAotICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC5zb2FwLmNsaWVudC5TT0FQTWVzc2FnZURpc3BhdGNoZXIKLSAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcC5zZXJ2ZXIuU09BUE1lc3NhZ2VEaXNwYXRjaGVyCi0gKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnhtbC5zZXJ2ZXIuWE1MTWVzc2FnZURpc3BhdGNoZXIKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpbkNhbGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX0NIQUlOX0NBTExFUiA9ICJoYW5kbGVyX2NoYWluX2NhbGxlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX0ZBVUxUX1BST1BFUlRZID0KLSAgICAgICAgImlnbm9yZSBmYXVsdCBpbiBtZXNzYWdlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKAotICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5oYW5kbGVyIik7Ci0KLSAgICAvLyBuZWVkIHJlcXVlc3Qgb3IgcmVzcG9uc2UgZm9yIEhhbmRsZSBpbnRlcmZhY2UKLSAgICBwdWJsaWMgZW51bSBSZXF1ZXN0T3JSZXNwb25zZSB7IFJFUVVFU1QsIFJFU1BPTlNFIH0KLSAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24geyBPVVRCT1VORCwgSU5CT1VORCB9Ci0KLSAgICBwcml2YXRlIFNldDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzOyAvLyBtYXkgYmUgbG9naWNhbC9zb2FwIG1peGVkCi0KLSAgICBwcml2YXRlIExpc3Q8TG9naWNhbEhhbmRsZXI+IGxvZ2ljYWxIYW5kbGVyczsKLSAgICBwcml2YXRlIExpc3Q8U09BUEhhbmRsZXI+IHNvYXBIYW5kbGVyczsKLQotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gcm9sZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaGFuZGxlcnMgdGhhdCBhcmUgcGFzc2VkIGluIHdpbGwgYmUgc29ydGVkIGludG8KLSAgICAgKiBsb2dpY2FsIGFuZCBzb2FwIGhhbmRsZXJzLiBEdXJpbmcgdGhpcyBzb3J0aW5nLCB0aGUKLSAgICAgKiB1bmRlcnN0b29kIGhlYWRlcnMgYXJlIGFsc28gb2J0YWluZWQgZnJvbSBhbnkgc29hcAotICAgICAqIGhhbmRsZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNoYWluIEEgbGlzdCBvZiBoYW5kbGVyIG9iamVjdHMsIHdoaWNoIGNhbgotICAgICAqIGJlIHByb3RvY29sIG9yIGxvZ2ljYWwgaGFuZGxlcnMuCi0gICAgICovCi0gICAgcHVibGljIEhhbmRsZXJDaGFpbkNhbGxlcihMaXN0PEhhbmRsZXI+IGNoYWluKSB7Ci0gICAgICAgIGlmIChjaGFpbiA9PSBudWxsKSB7IC8vIHNob3VsZCBvbmx5IGhhcHBlbiBpbiB0ZXN0aW5nCi0gICAgICAgICAgICBjaGFpbiA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVycyA9IGNoYWluOwotICAgICAgICBsb2dpY2FsSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PExvZ2ljYWxIYW5kbGVyPigpOwotICAgICAgICBzb2FwSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PFNPQVBIYW5kbGVyPigpOwotICAgICAgICB1bmRlcnN0b29kSGVhZGVycyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOwotICAgICAgICBzb3J0SGFuZGxlcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGxpc3QgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBjaGFpbiB0aGF0IGlzIHBhc3NlZAotICAgICAqIGluIHNpbmNlIHRoZSBsb2dpY2FsIGFuZCBwcm90b2NvbCBoYW5kbGVycyBtdXN0IGJlIHNlcGFyYXRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgaGFuZGxlcnMsIHNvcnRlZCBieSBsb2dpY2FsIGFuZCB0aGVuIHByb3RvY29sLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0hhbmRsZXJzKCkgewotICAgICAgICByZXR1cm4gKGhhbmRsZXJzLnNpemUoKSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBTT0FQQmluZGluZ0ltcGwgd2hlbiBpdCBjcmVhdGVzIHRoZQotICAgICAqIEhhbmRsZXJDaGFpbkNhbGxlciBvciB3aGVuIG5ldyByb2xlcyBhcmUgc2V0IG9uIHRoZSBiaW5kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvbGVzIEEgc2V0IG9mIHJvbGVzIHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZXMoU2V0PFN0cmluZz4gcm9sZXMpIHsKLSAgICAgICAgdGhpcy5yb2xlcyA9IHJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvbGVzIHRoYXQgd2VyZSBwYXNzZWQgaW4gYnkgdGhlIGJpbmRpbmcKLSAgICAgKiBpbiB0aGUgY2FzZSBvZiBzb2FwIGJpbmRpbmcuCi0gICAgICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldFJvbGVzKCkgewotICAgICAgICByZXR1cm4gcm9sZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGVhZGVycyB1bmRlcnN0b29kIGJ5IHRoZSBoYW5kbGVycy4gVGhpcyBzZXQKLSAgICAgKiBpcyBjcmVhdGVkIHdoZW4gdGhlIGhhbmRsZXIgY2hhaW4gY2FsbGVyIGlzIGluc3RhbnRpYXRlZCBhbmQKLSAgICAgKiB0aGUgaGFuZGxlcnMgYXJlIHNvcnRlZC4gVGhlIHNldCBpcyBjb21wcmlzZWQgb2YgaGVhZGVycwotICAgICAqIHJldHVybmVkIGZyb20gU09BUEhhbmRsZXIuZ2V0SGVhZGVycygpIG1ldGhvZCBjYWxscy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNldCBvZiBhbGwgaGVhZGVycyB0aGF0IHRoZSBoYW5kbGVycyBkZWNsYXJlCi0gICAgICogdGhhdCB0aGV5IHVuZGVyc3RhbmQuCi0gICAgICovCi0gICAgcHVibGljIFNldDxRTmFtZT4gZ2V0VW5kZXJzdG9vZEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiB1bmRlcnN0b29kSGVhZGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBzZXBhcmF0ZXMgdGhlIGxvZ2ljYWwgYW5kIHByb3RvY29sIGhhbmRsZXJzLiBXaGVuCi0gICAgICogdGhpcyBtZXRob2QgcmV0dXJucywgdGhlIG9yaWdpbmFsICJoYW5kbGVycyIgTGlzdCBoYXMgYmVlbgotICAgICAqIHJlc29ydGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzb3J0SGFuZGxlcnMoKSB7Ci0gICAgICAgIGZvciAoSGFuZGxlciBoYW5kbGVyIDogaGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGlmIChMb2dpY2FsSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGhhbmRsZXIuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICBsb2dpY2FsSGFuZGxlcnMuYWRkKChMb2dpY2FsSGFuZGxlcikgaGFuZGxlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNPQVBIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaGFuZGxlci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgIHNvYXBIYW5kbGVycy5hZGQoKFNPQVBIYW5kbGVyKSBoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBTZXQ8UU5hbWU+IGhlYWRlcnMgPSAoKFNPQVBIYW5kbGVyKSBoYW5kbGVyKS5nZXRIZWFkZXJzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGRBbGwoaGVhZGVycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaGFuZGxlci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBIYW5kbGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiY2Fubm90LmV4dGVuZC5oYW5kbGVyLmRpcmVjdGx5IiwKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSGFuZGxlckV4Y2VwdGlvbigiaGFuZGxlci5ub3QudmFsaWQudHlwZSIsCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBoYW5kbGVycy5jbGVhcigpOwotICAgICAgICBoYW5kbGVycy5hZGRBbGwobG9naWNhbEhhbmRsZXJzKTsKLSAgICAgICAgaGFuZGxlcnMuYWRkQWxsKHNvYXBIYW5kbGVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSB0aGUgbWVzc2FnZSBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSBjb250ZXh0IHdpdGggYQotICAgICAqIGZhdWx0IG1lc3NhZ2UuIElmIHRoZSBjb250ZXh0IGFscmVhZHkgY29udGFpbnMgYSBmYXVsdAotICAgICAqIG1lc3NhZ2UsIHRoZW4gcmV0dXJuIHdpdGhvdXQgY2hhbmdpbmcgaXQuCi0gICAgICogQWxzbyBzZXRzIHRoZSBIVFRQX1JFU1BPTlNFX0NPREUgaW4gdGhlIGNvbnRleHQgb24gU2VydmVyLXNpZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydEZhdWx0TWVzc2FnZShDb250ZXh0SG9sZGVyIGhvbGRlciwKLSAgICAgICAgUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZUNvbnRleHQgY29udGV4dCA9IGhvbGRlci5nZXRTTUMoKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsgLy8gbm9uLXNvYXAgY2FzZQotICAgICAgICAgICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBob2xkZXIuZ2V0TE1DKCk7Ci0gICAgICAgICAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbG1jLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnLnNldFBheWxvYWQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vU2V0IFN0YXR1cyBDb2RlIG9ubHkgaWYgaXQgaXMgb24gc2VydmVyCi0gICAgICAgICAgICAgICAgaWYoKEJvb2xlYW4pbG1jLmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKSl7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBIVFRQRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsbWMucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSwoKEhUVFBFeGNlcHRpb24pZXhjZXB0aW9uKS5nZXRTdGF0dXNDb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG1jLnB1dChNZXNzYWdlQ29udGV4dC5IVFRQX1JFU1BPTlNFX0NPREUsV1NDb25uZWN0aW9uLklOVEVSTkFMX0VSUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9TZXQgU3RhdHVzIENvZGUgb25seSBpZiBpdCBpcyBvbiBzZXJ2ZXIKLSAgICAgICAgICAgIGlmKChCb29sZWFuKWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpKXsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5IVFRQX1JFU1BPTlNFX0NPREUsV1NDb25uZWN0aW9uLklOVEVSTkFMX0VSUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gY29udGV4dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBpZiAoYm9keS5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVudmVsb3BlLmdldEhlYWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRIZWFkZXIoKS5kZXRhY2hOb2RlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvZHkucmVtb3ZlQ29udGVudHMoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBlbnZlbG9wZU5hbWVzcGFjZSA9IGVudmVsb3BlLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgdXNlckZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSBmYXVsdENvZGUgPSB1c2VyRmF1bHQuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChmYXVsdENvZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdENvZGUgPSBkZXRlcm1pbmVGYXVsdENvZGUoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0Q29kZShmYXVsdENvZGUpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0U3RyaW5nID0gdXNlckZhdWx0LmdldEZhdWx0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhdWx0U3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNmZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRTdHJpbmcgPSBzZmUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRTdHJpbmcgPSBzZmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmYXVsdC5zZXRGYXVsdFN0cmluZyhmYXVsdFN0cmluZyk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZmF1bHRBY3RvciA9IHVzZXJGYXVsdC5nZXRGYXVsdEFjdG9yKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhdWx0QWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdEFjdG9yID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0QWN0b3IoZmF1bHRBY3Rvcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAodXNlckZhdWx0LmdldERldGFpbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuYWRkQ2hpbGRFbGVtZW50KHVzZXJGYXVsdC5nZXREZXRhaWwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5zZXRGYXVsdENvZGUoZGV0ZXJtaW5lRmF1bHRDb2RlKGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0U3RyaW5nKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0U3RyaW5nKGV4Y2VwdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBzZXZlcmUgc2luY2UgdGhpcyBpcyBmcm9tIHJ1bnRpbWUgYW5kIG5vdCBoYW5kbGVyCi0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwKLSAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIGZhdWx0IG1lc3NhZ2UgaW4gaGFuZGxlciBjaGFpbiIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogPHA+VGhlIGV4cGVjdGF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZSBjb2RlIGlzIHRoYXQsCi0gICAgICogaWYgYSBQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSB0aGUgaGFuZGxlciBjaGFpbiwKLSAgICAgKiB0aGUgbWVzc2FnZSBjb250ZW50cyByZWZsZWN0IHRoZSBwcm90b2NvbCBleGNlcHRpb24uCi0gICAgICogSG93ZXZlciwgaWYgYSBuZXcgUHJvdG9jb2xFeGNlcHRpb24gaXMgdGhyb3duIGZyb20KLSAgICAgKiB0aGUgaGFuZGxlRmF1bHQgbWV0aG9kLCB0aGVuIHRoZSBmYXVsdCBzaG91bGQgYmUKLSAgICAgKiBpZ25vcmVkIGFuZCB0aGUgbmV3IGV4Y2VwdGlvbiBzaG91bGQgYmUgZGlzcGF0Y2hlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNpbXBseSBzZXRzIGEgcHJvcGVydHkgdGhhdCBpcyBjaGVja2VkCi0gICAgICogYnkgdGhlIGNsaWVudCBhbmQgc2VydmVyIGNvZGUgd2hlbiBhIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICogaXMgY2F1Z2h0LiBUaGUgcHJvcGVydHkgY2FuIGJlIGNoZWNrZWQgd2l0aAotICAgICAqIHtAbGluayBNZXNzYWdlQ29udGV4dFV0aWwjaWdub3JlRmF1bHRJbk1lc3NhZ2V9Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZElnbm9yZUZhdWx0UHJvcGVydHkoQ29udGV4dEhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGNvbnRleHQgPSBob2xkZXIuZ2V0TE1DKCk7Ci0gICAgICAgIGNvbnRleHQucHV0KElHTk9SRV9GQVVMVF9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5GaWd1cmUgb3V0IGlmIHRoZSBmYXVsdCBjb2RlIGxvY2FsIHBhcnQgaXMgY2xpZW50LAotICAgICAqIHNlcnZlciwgc2VuZGVyLCByZWNlaXZlciwgZXRjLiBUaGlzIGlzIGNhbGxlZCBieQotICAgICAqIGluc2VydEZhdWx0TWVzc2FnZS4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgKiBkdXJpbmcgcmVxdWVzdC4gUmV2ZXJzZSB0aGUgTWVzc2FnZSBkaXJlY3Rpb24gZmlyc3QsCi0gICAgICogU28gdGhpcyBtZXRob2QgY2FuIHVzZSB0aGUgTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWQotICAgICAqIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIGJlaW5nIGNhbGxlZCBvbiB0aGUgY2xpZW50Ci0gICAgICogb3IgdGhlIHNlcnZlciBzaWRlLiBJZiB0aGlzIGNoYW5nZXMgaW4gdGhlIHNwZWMsIHRoZW4KLSAgICAgKiBzb21ldGhpbmcgZWxzZSB3aWxsIG5lZWQgdG8gYmUgcGFzc2VkIHRvIHRoZSBtZXRob2QKLSAgICAgKiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZmF1bHQgY29kZSBpcyBjbGllbnQgb3Igc2VydmVyLgotICAgICAqCi0gICAgICogPHA+Rm9yIGRldGVybWluaW5nIHNvYXAgdmVyc2lvbiwgc3RhcnQgY2hlY2tpbmcgd2l0aCB0aGUKLSAgICAgKiBsYXRlc3QgdmVyc2lvbiBhbmQgZGVmYXVsdCB0byBzb2FwIDEuMS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFFOYW1lIGRldGVybWluZUZhdWx0Q29kZShTT0FQTWVzc2FnZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9Ci0gICAgICAgICAgICBjb250ZXh0LmdldE1lc3NhZ2UoKS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBlbnZlbG9wZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAvLyBjbGllbnQgY2FzZQotICAgICAgICBpZiAoIShCb29sZWFuKSBjb250ZXh0LmdldCgKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpKSB7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX0NMSUVOVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTT0FQQ29uc3RhbnRzLkZBVUxUX0NPREVfQ0xJRU5UOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZXJ2ZXIgY2FzZQotICAgICAgICBpZiAodXJpLmVxdWFscyhTT0FQMTJOYW1lc3BhY2VDb25zdGFudHMuRU5WRUxPUEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU09BUDEyQ29uc3RhbnRzLkZBVUxUX0NPREVfU0VSVkVSOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTT0FQQ29uc3RhbnRzLkZBVUxUX0NPREVfU0VSVkVSOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPk1ldGhvZCB1c2VkIHRvIGNhbGwgaGFuZGxlcnMgd2l0aCBhIEhhbmRsZXJDb250ZXh0IHRoYXQKLSAgICAgKiBtYXkgY29udGFpbiBsb2dpY2FsIGFuZCBwcm90b2NvbCBoYW5kbGVycy4gVGhpcyBpcyB0aGUKLSAgICAgKiBtYWluIGVudHJ5IHBvaW50IGZvciBjYWxsaW5nIHRoZSBoYW5kbGVycyBpbiB0aGUgY2FzZQotICAgICAqIG9mIFNPQVAgYmluZGluZy4gQmVmb3JlIGNhbGxpbmcgdGhlIGhhbmRsZXJzLCB0aGUKLSAgICAgKiBoYW5kbGVyIGNoYWluIGNhbGxlciB3aWxsIHNldCB0aGUgb3V0Ym91bmQgcHJvcGVydHkgYW5kCi0gICAgICogdGhlIHJvbGVzIG9uIHRoZSBtZXNzYWdlIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiA8cD5CZXNpZGVzIHRoZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgaW4sIHRoZSBvdGhlciBpbmZvcm1hdGlvbgotICAgICAqIGlzIHVzZWQgdG8gY29udHJvbCBoYW5kbGVyIGV4ZWN1dGlvbiBhbmQgY2xvc2luZy4gU2VlIHRoZQotICAgICAqIGhhbmRsZXIgc2VjdGlvbiBvZiB0aGUgc3BlYyBmb3IgdGhlIHJ1bGVzIGNvbmNlcmluZyBoYW5kbGVycwotICAgICAqIHJldHVybmluZyBmYWxzZSwgdGhyb3dpbmcgZXhjZXB0aW9ucywgZXRjLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpcmVjdGlvbiBJbmJvdW5kIG9yIG91dGJvdW5kLgotICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSBSZXF1ZXN0IG9yIHJlc3BvbnNlLgotICAgICAqIEBwYXJhbSBjb250ZXh0IEEgc29hcCBoYW5kbGVyIGNvbnRleHQgY29udGFpbmluZyB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gcmVzcG9uc2VFeHBlY3RlZCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdAotICAgICAqIGEgcmVzcG9uc2UgaXMgZXhwZWN0ZWQgdG8gdGhlIGN1cnJlbnQgbWVzc2FnZSAoc2hvdWxkIGJlIGZhbHNlCi0gICAgICogZm9yIHJlc3BvbnNlcyBvciBvbmUtd2F5IHJlcXVlc3RzKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpbiB0aGUgbm9ybWFsIGNhc2UsIGZhbHNlIGlmIGEgaGFuZGxlcgotICAgICAqIHJldHVybmVkIGZhbHNlLiBUaGlzIG5vcm1hbGx5IG1lYW5zIHRoYXQgdGhlIHJ1bnRpbWUKLSAgICAgKiBzaG91bGQgcmV2ZXJzZSBkaXJlY3Rpb24gaWYgY2FsbGVkIGR1cmluZyBhIHJlcXVlc3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FsbEhhbmRsZXJzKERpcmVjdGlvbiBkaXJlY3Rpb24sCi0gICAgICAgIFJlcXVlc3RPclJlc3BvbnNlIG1lc3NhZ2VUeXBlLAotICAgICAgICBTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgYm9vbGVhbiByZXNwb25zZUV4cGVjdGVkKSB7Ci0KLSAgICAgICAgcmV0dXJuIGludGVybmFsQ2FsbEhhbmRsZXJzKGRpcmVjdGlvbiwgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICBuZXcgQ29udGV4dEhvbGRlcihjb250ZXh0KSwgcmVzcG9uc2VFeHBlY3RlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHVzZWQgdG8gY2FsbCBoYW5kbGVycyB3aXRoIGEgSGFuZGxlckNvbnRleHQgdGhhdAotICAgICAqIG1heSBjb250YWluIGxvZ2ljYWwgaGFuZGxlcnMgb25seS4gVGhpcyBpcyB0aGUKLSAgICAgKiBtYWluIGVudHJ5IHBvaW50IGZvciBjYWxsaW5nIHRoZSBoYW5kbGVycyBpbiB0aGUgY2FzZQotICAgICAqIG9mIGh0dHAgYmluZGluZy4gQmVmb3JlIGNhbGxpbmcgdGhlIGhhbmRsZXJzLCB0aGUKLSAgICAgKiBoYW5kbGVyIGNoYWluIGNhbGxlciB3aWxsIHNldCB0aGUgb3V0Ym91bmQgcHJvcGVydHkgb24KLSAgICAgKiB0aGUgbWVzc2FnZSBjb250ZXh0LgotICAgICAqCi0gICAgICogPHA+QmVzaWRlcyB0aGUgY29udGV4dCBvYmplY3QgcGFzc2VkIGluLCB0aGUgb3RoZXIgaW5mb3JtYXRpb24KLSAgICAgKiBpcyB1c2VkIHRvIGNvbnRyb2wgaGFuZGxlciBleGVjdXRpb24gYW5kIGNsb3NpbmcuIFNlZSB0aGUKLSAgICAgKiBoYW5kbGVyIHNlY3Rpb24gb2YgdGhlIHNwZWMgZm9yIHRoZSBydWxlcyBjb25jZXJpbmcgaGFuZGxlcnMKLSAgICAgKiByZXR1cm5pbmcgZmFsc2UsIHRocm93aW5nIGV4Y2VwdGlvbnMsIGV0Yy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gSW5ib3VuZCBvciBvdXRib3VuZC4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZVR5cGUgUmVxdWVzdCBvciByZXNwb25zZS4KLSAgICAgKiBAcGFyYW0gY29udGV4dCBBIHNvYXAgaGFuZGxlciBjb250ZXh0IGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHJlc3BvbnNlRXhwZWN0ZWQgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QKLSAgICAgKiBhIHJlc3BvbnNlIGlzIGV4cGVjdGVkIHRvIHRoZSBjdXJyZW50IG1lc3NhZ2UgKHNob3VsZCBiZSBmYWxzZQotICAgICAqIGZvciByZXNwb25zZXMgb3Igb25lLXdheSByZXF1ZXN0cykuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaW4gdGhlIG5vcm1hbCBjYXNlLCBmYWxzZSBpZiBhIGhhbmRsZXIKLSAgICAgKiByZXR1cm5lZCBmYWxzZS4gVGhpcyBub3JtYWxseSBtZWFucyB0aGF0IHRoZSBydW50aW1lCi0gICAgICogc2hvdWxkIHJldmVyc2UgZGlyZWN0aW9uIGlmIGNhbGxlZCBkdXJpbmcgYSByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbGxIYW5kbGVycyhEaXJlY3Rpb24gZGlyZWN0aW9uLAotICAgICAgICBSZXF1ZXN0T3JSZXNwb25zZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgWE1MSGFuZGxlckNvbnRleHQgY29udGV4dCwKLSAgICAgICAgYm9vbGVhbiByZXNwb25zZUV4cGVjdGVkKSB7Ci0KLSAgICAgICAgcmV0dXJuIGludGVybmFsQ2FsbEhhbmRsZXJzKGRpcmVjdGlvbiwgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICBuZXcgQ29udGV4dEhvbGRlcihjb250ZXh0KSwgcmVzcG9uc2VFeHBlY3RlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFpbiBydW50aW1lIG1ldGhvZCwgY2FsbGVkIGludGVybmFsbHkgYnkgdGhlIGNhbGxIYW5kbGVycygpCi0gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSBjYWxsZWQgd2l0aCBIYW5kbGVyQ29udGV4dCBvcgotICAgICAqIFhNTEhhbmRsZXJDb250ZXh0IG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBUaGUgYm9vbGVhbiBwYXNzZWQgaW4gaXMgd2hldGhlciBvciBub3QgYSByZXNwb25zZSBpcyByZXF1aXJlZAotICAgICAqIGZvciB0aGUgY3VycmVudCBtZXNzYWdlLiBTZWUgc2VjdGlvbiA1LjMuMi4gKHRvZG86IHRoaXMgc2VjdGlvbgotICAgICAqIGlzIGdvaW5nIHRvIGNoYW5nZSkuCi0gICAgICoKLSAgICAgKiBUaGUgY2FsbExvZ2ljYWxIYW5kbGVycyBhbmQgY2FsbFByb3RvY29sSGFuZGxlcnMgbWV0aG9kcyB3aWxsCi0gICAgICogdGFrZSBjYXJlIG9mIGV4ZWN1dGlvbiBvbmNlIGNhbGxlZCBhbmQgcmV0dXJuIHRydWUgb3IgZmFsc2Ugb3IKLSAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGludGVybmFsQ2FsbEhhbmRsZXJzKERpcmVjdGlvbiBkaXJlY3Rpb24sCi0gICAgICAgIFJlcXVlc3RPclJlc3BvbnNlIG1lc3NhZ2VUeXBlLAotICAgICAgICBDb250ZXh0SG9sZGVyIGNoLAotICAgICAgICBib29sZWFuIHJlc3BvbnNlRXhwZWN0ZWQpIHsKLQotICAgICAgICAvLyBzZXQgb3V0Ym91bmQgcHJvcGVydHkKLSAgICAgICAgY2guZ2V0TE1DKCkucHV0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksCi0gICAgICAgICAgICAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVRCT1VORCkpOwotCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIGFzIHNvYXAgbWVzc2FnZSBjb250ZXh0LCBzZXQgcm9sZXMKLSAgICAgICAgaWYgKGNoLmdldFNNQygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICgoU09BUE1lc3NhZ2VDb250ZXh0SW1wbCkgY2guZ2V0U01DKCkpLnNldFJvbGVzKGdldFJvbGVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2FsbCBoYW5kbGVycwotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVRCT1VORCkgewotICAgICAgICAgICAgaWYgKGNhbGxMb2dpY2FsSGFuZGxlcnMoY2gsIGRpcmVjdGlvbiwgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRXhwZWN0ZWQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGxQcm90b2NvbEhhbmRsZXJzKGNoLCBkaXJlY3Rpb24sIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICByZXNwb25zZUV4cGVjdGVkKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjYWxsUHJvdG9jb2xIYW5kbGVycyhjaCwgZGlyZWN0aW9uLCBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VFeHBlY3RlZCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbExvZ2ljYWxIYW5kbGVycyhjaCwgZGlyZWN0aW9uLCBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VFeHBlY3RlZCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDbG9zZSBpZiBNRVAgZmluaXNoZWQuIFNlcnZlciBjb2RlIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nCi0gICAgICAgICAqIGhhbmRsZXJzIGlmIGl0IGRldGVybWluZXMgdGhhdCBhbiBpbmNvbWluZyByZXF1ZXN0IGlzIGEKLSAgICAgICAgICogb25lIHdheSBtZXNzYWdlLgotICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlRXhwZWN0ZWQpIHsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PSBSZXF1ZXN0T3JSZXNwb25zZS5SRVFVRVNUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uSU5CT1VORCkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZUhhbmRsZXJzU2VydmVyKGNoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjbG9zZUhhbmRsZXJzQ2xpZW50KGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLklOQk9VTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VIYW5kbGVyc0NsaWVudChjaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VIYW5kbGVyc1NlcnZlcihjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNhbGxlZCBieSB0aGUgc2VydmVyIHdoZW4gYW4gZW5kcG9pbnQgaGFzIHRocm93bgotICAgICAqIGFuIGV4Y2VwdGlvbi4gVGhpcyBtZXRob2QgY2FsbHMgaGFuZGxlRmF1bHQgb24gdGhlIGhhbmRsZXJzCi0gICAgICogYW5kIGNsb3NlcyB0aGVtLiBCZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IGR1cmluZwotICAgICAqIGEgcmVzcG9uc2UgYWZ0ZXIgdGhlIGVuZHBvaW50IGhhcyBiZWVuIHJlYWNoZWQsIGFsbCBvZiB0aGUKLSAgICAgKiBoYW5kbGVycyBoYXZlIGJlZW4gY2FsbGVkIGR1cmluZyB0aGUgcmVxdWVzdCBhbmQgc28gYWxsIGFyZQotICAgICAqIGNsb3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYWxsSGFuZGxlRmF1bHQoU09BUEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgQ29udGV4dEhvbGRlciBjaCA9IG5ldyBDb250ZXh0SG9sZGVyKGNvbnRleHQpOwotICAgICAgICBjaC5nZXRTTUMoKS5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwgdHJ1ZSk7Ci0gICAgICAgICgoU09BUE1lc3NhZ2VDb250ZXh0SW1wbCkgY2guZ2V0U01DKCkpLnNldFJvbGVzKGdldFJvbGVzKCkpOwotCi0gICAgICAgIGludCBpID0gMDsgLy8gY291bnRlciBmb3IgbG9naWNhbCBoYW5kbGVycwotICAgICAgICBpbnQgaiA9IDA7IC8vIGNvdW50ZXIgZm9yIHByb3RvY29sIGhhbmRsZXJzCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IGxvZ2ljYWxIYW5kbGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9naWNhbEhhbmRsZXJzLmdldChpKS5oYW5kbGVGYXVsdChjaC5nZXRMTUMoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoaiA8IHNvYXBIYW5kbGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEhhbmRsZXJzLmdldChqKS5oYW5kbGVGYXVsdChjaC5nZXRTTUMoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVIsICJleGNlcHRpb24gaW4gaGFuZGxlciBjaGFpbiIsIHJlKTsKLSAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VIYW5kbGVyc1NlcnZlcihjaCk7IC8vIHRoaXMgaXMgYWx3YXlzIGNhbGxlZCBvbiBzZXJ2ZXIgc2lkZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gaXQgc2VlcyBhIFNPQVBGYXVsdCBtZXNzYWdlLgotICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIGhhbmRsZUZhdWx0IG9uIHRoZSBoYW5kbGVycyBhbmQgY2xvc2VzIHRoZW0uIEJlY2F1c2UKLSAgICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBkdXJpbmcgYSByZXNwb25zZSwgYWxsIG9mIHRoZSBoYW5kbGVycyBoYXZlCi0gICAgICogYmVlbiBjYWxsZWQgZHVyaW5nIHRoZSByZXF1ZXN0IGFuZCBzbyBhbGwgYXJlIGNsb3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYWxsSGFuZGxlRmF1bHRPbkNsaWVudChTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBDb250ZXh0SG9sZGVyIGNoID0gbmV3IENvbnRleHRIb2xkZXIoY29udGV4dCk7Ci0gICAgICAgIGNoLmdldFNNQygpLnB1dChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCBmYWxzZSk7Ci0gICAgICAgICgoU09BUE1lc3NhZ2VDb250ZXh0SW1wbCkgY2guZ2V0U01DKCkpLnNldFJvbGVzKGdldFJvbGVzKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPXNvYXBIYW5kbGVycy5zaXplKCktMTsgaT49MDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBIYW5kbGVycy5nZXQoaSkuaGFuZGxlRmF1bHQoY2guZ2V0U01DKCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpPWxvZ2ljYWxIYW5kbGVycy5zaXplKCktMTsgaT49MDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWxIYW5kbGVycy5nZXQoaSkuaGFuZGxlRmF1bHQoY2guZ2V0TE1DKCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVIsICJleGNlcHRpb24gaW4gaGFuZGxlciBjaGFpbiIsIHJlKTsKLSAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VIYW5kbGVyc0NsaWVudChjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgZnJvbSB0aGUgbWFpbiBjYWxsSGFuZGxlcnMoKSBtZXRob2QuCi0gICAgICogTG9naWNhbCBtZXNzYWdlIGNvbnRleHQgdXBkYXRlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsTG9naWNhbEhhbmRsZXJzKENvbnRleHRIb2xkZXIgaG9sZGVyLAotICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uLCBSZXF1ZXN0T3JSZXNwb25zZSB0eXBlLCBib29sZWFuIHJlc3BvbnNlRXhwZWN0ZWQpIHsKLQotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVRCT1VORCkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGxvZ2ljYWxIYW5kbGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWxIYW5kbGVycy5nZXQoaSkuCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZXNzYWdlKGhvbGRlci5nZXRMTUMoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBhbmQgY2FsbCBoYW5kbGUgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5nZXRMTUMoKS5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSxmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbExvZ2ljYWxIYW5kbGVNZXNzYWdlKGhvbGRlciwgaS0xLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFJlcXVlc3RPclJlc3BvbnNlLlJFU1BPTlNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VIYW5kbGVyc1NlcnZlcihob2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUxvZ2ljYWxIYW5kbGVycyhob2xkZXIsIGksIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FUiwgImV4Y2VwdGlvbiBpbiBoYW5kbGVyIGNoYWluIiwgcmUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUV4cGVjdGVkICYmIHJlIGluc3RhbmNlb2YgUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBkaXJlY3Rpb24gYW5kIGhhbmRsZSBmYXVsdAotICAgICAgICAgICAgICAgICAgICBob2xkZXIuZ2V0TE1DKCkucHV0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpbnNlcnRGYXVsdE1lc3NhZ2UoaG9sZGVyLCAoUHJvdG9jb2xFeGNlcHRpb24pIHJlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGk+MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsTG9naWNhbEhhbmRsZUZhdWx0KGhvbGRlciwgaS0xLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9uIHJlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZElnbm9yZUZhdWx0UHJvcGVydHkoaG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZSA9IHJlMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSByZTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUmVxdWVzdE9yUmVzcG9uc2UuUkVTUE9OU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VIYW5kbGVyc1NlcnZlcihob2xkZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlTG9naWNhbEhhbmRsZXJzKGhvbGRlciwgaSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBpbmJvdW5kIGNhc2UsIEgoeCkgLT4gSCh4LTEpIC0+IC4uLiBIKDEpIC0+IEgoMCkKLSAgICAgICAgICAgIGludCBpID0gbG9naWNhbEhhbmRsZXJzLnNpemUoKS0xOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsSGFuZGxlcnMuZ2V0KGkpLgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWVzc2FnZShob2xkZXIuZ2V0TE1DKCkpID09IGZhbHNlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBhbmQgY2FsbCBoYW5kbGUgbWVzc2FnZS9yZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5nZXRMTUMoKS5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSx0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsTG9naWNhbEhhbmRsZU1lc3NhZ2UoaG9sZGVyLCBpKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxIYW5kbGVycy5zaXplKCktMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFByb3RvY29sSGFuZGxlTWVzc2FnZShob2xkZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBIYW5kbGVycy5zaXplKCktMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBSZXF1ZXN0T3JSZXNwb25zZS5SRVNQT05TRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSGFuZGxlcnNDbGllbnQoaG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VMb2dpY2FsSGFuZGxlcnMoaG9sZGVyLCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsSGFuZGxlcnMuc2l6ZSgpLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlUHJvdG9jb2xIYW5kbGVycyhob2xkZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBIYW5kbGVycy5zaXplKCktMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVSLCAiZXhjZXB0aW9uIGluIGhhbmRsZXIgY2hhaW4iLCByZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRXhwZWN0ZWQgJiYgcmUgaW5zdGFuY2VvZiBQcm90b2NvbEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGRpcmVjdGlvbiBhbmQgaGFuZGxlIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgIGhvbGRlci5nZXRMTUMoKS5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSx0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RmF1bHRNZXNzYWdlKGhvbGRlciwgKFByb3RvY29sRXhjZXB0aW9uKSByZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGk9PXNpemUtMSwgbm8gbW9yZSBsb2dpY2FsIGhhbmRsZXJzIHRvIGNhbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IGxvZ2ljYWxIYW5kbGVycy5zaXplKCktMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxMb2dpY2FsSGFuZGxlRmF1bHQoaG9sZGVyLCBpKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxIYW5kbGVycy5zaXplKCktMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHJvdG9jb2xIYW5kbGVGYXVsdChob2xkZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBIYW5kbGVycy5zaXplKCktMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9uIHJlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWdub3JlRmF1bHRQcm9wZXJ0eShob2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSByZTE7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZSA9IHJlMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBSZXF1ZXN0T3JSZXNwb25zZS5SRVNQT05TRSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZUhhbmRsZXJzQ2xpZW50KGhvbGRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VMb2dpY2FsSGFuZGxlcnMoaG9sZGVyLCBpLCBsb2dpY2FsSGFuZGxlcnMuc2l6ZSgpLTEpOwotICAgICAgICAgICAgICAgICAgICBjbG9zZVByb3RvY29sSGFuZGxlcnMoaG9sZGVyLCAwLCBzb2FwSGFuZGxlcnMuc2l6ZSgpLTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBmcm9tIHRoZSBtYWluIGNhbGxIYW5kbGVycygpIG1ldGhvZC4KLSAgICAgKiBTT0FQIG1lc3NhZ2UgY29udGV4dCB1cGRhdGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhbGxQcm90b2NvbEhhbmRsZXJzKENvbnRleHRIb2xkZXIgaG9sZGVyLAotICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uLCBSZXF1ZXN0T3JSZXNwb25zZSB0eXBlLCBib29sZWFuIHJlc3BvbnNlRXhwZWN0ZWQpIHsKLQotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVRCT1VORCkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaTxzb2FwSGFuZGxlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb2FwSGFuZGxlcnMuZ2V0KGkpLgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWVzc2FnZShob2xkZXIuZ2V0U01DKCkpID09IGZhbHNlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBhbmQgY2FsbCBoYW5kbGUgbWVzc2FnZS9yZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5nZXRTTUMoKS5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSxmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGk+MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHJvdG9jb2xIYW5kbGVNZXNzYWdlKGhvbGRlciwgaS0xLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbExvZ2ljYWxIYW5kbGVNZXNzYWdlKGhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbEhhbmRsZXJzLnNpemUoKS0xLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFJlcXVlc3RPclJlc3BvbnNlLlJFU1BPTlNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VIYW5kbGVyc1NlcnZlcihob2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZVByb3RvY29sSGFuZGxlcnMoaG9sZGVyLCBpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUxvZ2ljYWxIYW5kbGVycyhob2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxIYW5kbGVycy5zaXplKCktMSAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FUiwgImV4Y2VwdGlvbiBpbiBoYW5kbGVyIGNoYWluIiwgcmUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUV4cGVjdGVkICYmIHJlIGluc3RhbmNlb2YgUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBkaXJlY3Rpb24gYW5kIGhhbmRsZSBmYXVsdAotICAgICAgICAgICAgICAgICAgICBob2xkZXIuZ2V0U01DKCkucHV0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpbnNlcnRGYXVsdE1lc3NhZ2UoaG9sZGVyLCAoUHJvdG9jb2xFeGNlcHRpb24pIHJlKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDAgfHwgLy8gc3RpbGwgb24gZmlyc3QgaGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxQcm90b2NvbEhhbmRsZUZhdWx0KGhvbGRlciwgaS0xLCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxMb2dpY2FsSGFuZGxlRmF1bHQoaG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsSGFuZGxlcnMuc2l6ZSgpLTEsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiByZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZElnbm9yZUZhdWx0UHJvcGVydHkoaG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlID0gcmUxOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSByZTI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUmVxdWVzdE9yUmVzcG9uc2UuUkVTUE9OU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VIYW5kbGVyc1NlcnZlcihob2xkZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlUHJvdG9jb2xIYW5kbGVycyhob2xkZXIsIGksIDApOwotICAgICAgICAgICAgICAgICAgICBjbG9zZUxvZ2ljYWxIYW5kbGVycyhob2xkZXIsIGxvZ2ljYWxIYW5kbGVycy5zaXplKCktMSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBpbmJvdW5kIGNhc2UsIEgoeCkgLT4gSCh4LTEpIC0+IC4uLiBIKDEpIC0+IEgoMCkKLSAgICAgICAgICAgIGludCBpID0gc29hcEhhbmRsZXJzLnNpemUoKS0xOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb2FwSGFuZGxlcnMuZ2V0KGkpLgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWVzc2FnZShob2xkZXIuZ2V0U01DKCkpID09IGZhbHNlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldmVyc2UgYW5kIGNhbGwgaGFuZGxlIG1lc3NhZ2UvcmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5nZXRTTUMoKS5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSx0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUV4cGVjdGVkICYmIGkgIT0gc29hcEhhbmRsZXJzLnNpemUoKS0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFByb3RvY29sSGFuZGxlTWVzc2FnZShob2xkZXIsIGkrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEhhbmRsZXJzLnNpemUoKS0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFJlcXVlc3RPclJlc3BvbnNlLlJFU1BPTlNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VIYW5kbGVyc0NsaWVudChob2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZVByb3RvY29sSGFuZGxlcnMoaG9sZGVyLCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwSGFuZGxlcnMuc2l6ZSgpLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FUiwgImV4Y2VwdGlvbiBpbiBoYW5kbGVyIGNoYWluIiwgcmUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUV4cGVjdGVkICYmIHJlIGluc3RhbmNlb2YgUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBkaXJlY3Rpb24gYW5kIGhhbmRsZSBmYXVsdAotICAgICAgICAgICAgICAgICAgICBob2xkZXIuZ2V0U01DKCkucHV0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluc2VydEZhdWx0TWVzc2FnZShob2xkZXIsIChQcm90b2NvbEV4Y2VwdGlvbikgcmUpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBzb2FwSGFuZGxlcnMuc2l6ZSgpLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHJvdG9jb2xIYW5kbGVGYXVsdChob2xkZXIsIGkrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEhhbmRsZXJzLnNpemUoKS0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gcmUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRJZ25vcmVGYXVsdFByb3BlcnR5KGhvbGRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZSA9IHJlMTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlID0gcmUyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFJlcXVlc3RPclJlc3BvbnNlLlJFU1BPTlNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlSGFuZGxlcnNDbGllbnQoaG9sZGVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjbG9zZVByb3RvY29sSGFuZGxlcnMoaG9sZGVyLCBpLCBzb2FwSGFuZGxlcnMuc2l6ZSgpLTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgY2FsbGVkIGZvciBhYm5vcm1hbCBwcm9jZXNzaW5nIChmb3IgaW5zdGFuY2UsIGFzIHRoZQotICAgICAqIHJlc3VsdCBvZiBhIGhhbmRsZXIgcmV0dXJuaW5nIGZhbHNlIGR1cmluZyBub3JtYWwgcHJvY2Vzc2luZykuCi0gICAgICogU3RhcnQgYW5kIGVuZCBpbmRpY2VzIGFyZSBpbmNsdXNpdmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxMb2dpY2FsSGFuZGxlTWVzc2FnZShDb250ZXh0SG9sZGVyIGhvbGRlciwKLSAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCkgewotCi0gICAgICAgIGlmIChsb2dpY2FsSGFuZGxlcnMuaXNFbXB0eSgpIHx8Ci0gICAgICAgICAgICBzdGFydCA9PSAtMSB8fAotICAgICAgICAgICAgc3RhcnQgPT0gbG9naWNhbEhhbmRsZXJzLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNhbGxHZW5lcmljSGFuZGxlTWVzc2FnZShsb2dpY2FsSGFuZGxlcnMsaG9sZGVyLmdldExNQygpLHN0YXJ0LGVuZCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgY2FsbGVkIGZvciBhYm5vcm1hbCBwcm9jZXNzaW5nIChmb3IgaW5zdGFuY2UsIGFzIHRoZQotICAgICAqIHJlc3VsdCBvZiBhIGhhbmRsZXIgcmV0dXJuaW5nIGZhbHNlIGR1cmluZyBub3JtYWwgcHJvY2Vzc2luZykuCi0gICAgICogU3RhcnQgYW5kIGVuZCBpbmRpY2VzIGFyZSBpbmNsdXNpdmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxQcm90b2NvbEhhbmRsZU1lc3NhZ2UoQ29udGV4dEhvbGRlciBob2xkZXIsCi0gICAgICAgIGludCBzdGFydCwgaW50IGVuZCkgewotCi0gICAgICAgIGlmIChzb2FwSGFuZGxlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2FsbEdlbmVyaWNIYW5kbGVNZXNzYWdlKHNvYXBIYW5kbGVycyxob2xkZXIuZ2V0U01DKCksc3RhcnQsZW5kKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY2FsbGluZyBoYW5kbGVNZXNzYWdlIGR1cmluZyBhYm5vcm1hbCBwcm9jZXNzaW5nKGZvcgotICAgICAqIGluc3RhbmNlLCBhcyB0aGUgcmVzdWx0IG9mIGEgaGFuZGxlciByZXR1cm5pbmcgZmFsc2UgZHVyaW5nIG5vcm1hbAotICAgICAqIHByb2Nlc3NpbmcpLiBTdGFydCBhbmQgZW5kIGluZGljZXMgYXJlIGluY2x1c2l2ZS4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgPEMgZXh0ZW5kcyBNZXNzYWdlQ29udGV4dD4gdm9pZCBjYWxsR2VuZXJpY0hhbmRsZU1lc3NhZ2UoTGlzdDw/IGV4dGVuZHMgSGFuZGxlcj4gaGFuZGxlckxpc3QsCi0gICAgICAgIEMgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGkgPSBzdGFydDsKLSAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHdoaWxlIChpID49IGVuZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckxpc3QuZ2V0KGkpLmhhbmRsZU1lc3NhZ2UoY29udGV4dCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FUiwKLSAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbiBpbiBoYW5kbGVyIGNoYWluIiwgcmUpOwotICAgICAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJMaXN0LmdldChpKS5oYW5kbGVNZXNzYWdlKGNvbnRleHQpID09IGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVSLAotICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIGluIGhhbmRsZXIgY2hhaW4iLCByZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2FsbHMgaGFuZGxlRmF1bHQgb24gdGhlIGxvZ2ljYWwgaGFuZGxlcnMuIEluZGljZXMgYXJlCi0gICAgICogaW5jbHVzaXZlLiBFeGNlcHRpb25zIGdldCBwYXNzZWQgdXAgdGhlIGNoYWluLCBhbmQgYW4KLSAgICAgKiBleGNlcHRpb24gb3IgcmV0dXJuIG9mICdmYWxzZScgZW5kcyBwcm9jZXNzaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsTG9naWNhbEhhbmRsZUZhdWx0KENvbnRleHRIb2xkZXIgaG9sZGVyLAotICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0KLSAgICAgICAgcmV0dXJuIGNhbGxHZW5lcmljSGFuZGxlRmF1bHQobG9naWNhbEhhbmRsZXJzLAotICAgICAgICAgICAgaG9sZGVyLmdldExNQygpLCBzdGFydCwgZW5kKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxscyBoYW5kbGVGYXVsdCBvbiB0aGUgcHJvdG9jb2wgaGFuZGxlcnMuIEluZGljZXMgYXJlCi0gICAgICogaW5jbHVzaXZlLiBFeGNlcHRpb25zIGdldCBwYXNzZWQgdXAgdGhlIGNoYWluLCBhbmQgYW4KLSAgICAgKiBleGNlcHRpb24gb3IgcmV0dXJuIG9mICdmYWxzZScgZW5kcyBwcm9jZXNzaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsUHJvdG9jb2xIYW5kbGVGYXVsdChDb250ZXh0SG9sZGVyIGhvbGRlciwKLSAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0KLSAgICAgICAgcmV0dXJuIGNhbGxHZW5lcmljSGFuZGxlRmF1bHQoc29hcEhhbmRsZXJzLAotICAgICAgICAgICAgaG9sZGVyLmdldFNNQygpLCBzdGFydCwgZW5kKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFVzZWQgYnkgY2FsbExvZ2ljYWxIYW5kbGVGYXVsdCBhbmQgY2FsbFByb3RvY29sSGFuZGxlRmF1bHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSA8QyBleHRlbmRzIE1lc3NhZ2VDb250ZXh0PiBib29sZWFuIGNhbGxHZW5lcmljSGFuZGxlRmF1bHQoTGlzdDw/IGV4dGVuZHMgSGFuZGxlcj4gaGFuZGxlckxpc3QsCi0gICAgICAgIEMgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGkgPSBzdGFydDsKLSAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHdoaWxlIChpID49IGVuZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckxpc3QuZ2V0KGkpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUZhdWx0KGNvbnRleHQpID09IGZhbHNlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVIsCi0gICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gaW4gaGFuZGxlciBjaGFpbiIsIHJlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyTGlzdC5nZXQoaSkuCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVGYXVsdChjb250ZXh0KSA9PSBmYWxzZSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVSLAotICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIGluIGhhbmRsZXIgY2hhaW4iLCByZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgY2xvc2VzIHByb3RvY29sIGhhbmRsZXJzIGFuZCB0aGVuCi0gICAgICogbG9naWNhbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VIYW5kbGVyc0NsaWVudChDb250ZXh0SG9sZGVyIGhvbGRlcikgewotICAgICAgICBjbG9zZVByb3RvY29sSGFuZGxlcnMoaG9sZGVyLCBzb2FwSGFuZGxlcnMuc2l6ZSgpLTEsIDApOwotICAgICAgICBjbG9zZUxvZ2ljYWxIYW5kbGVycyhob2xkZXIsIGxvZ2ljYWxIYW5kbGVycy5zaXplKCktMSwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgY2xvc2VzIGxvZ2ljYWwgaGFuZGxlcnMgYW5kIHRoZW4KLSAgICAgKiBwcm90b2NvbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VIYW5kbGVyc1NlcnZlcihDb250ZXh0SG9sZGVyIGhvbGRlcikgewotICAgICAgICBjbG9zZUxvZ2ljYWxIYW5kbGVycyhob2xkZXIsIDAsIGxvZ2ljYWxIYW5kbGVycy5zaXplKCktMSk7Ci0gICAgICAgIGNsb3NlUHJvdG9jb2xIYW5kbGVycyhob2xkZXIsIDAsIHNvYXBIYW5kbGVycy5zaXplKCktMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB2ZXJzaW9uIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvZGUgb25jZSBpdCBkZXRlcm1pbmVzCi0gICAgICogdGhhdCBhbiBpbmNvbWluZyBtZXNzYWdlIGlzIGEgb25lLXdheSByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZvcmNlQ2xvc2VIYW5kbGVyc09uU2VydmVyKFNPQVBIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIENvbnRleHRIb2xkZXIgY2ggPSBuZXcgQ29udGV4dEhvbGRlcihjb250ZXh0KTsKLSAgICAgICAgLy8gb25seSBjYWxsZWQgYWZ0ZXIgYW4gaW5ib3VuZCByZXF1ZXN0Ci0gICAgICAgIGNoLmdldFNNQygpLnB1dChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCBmYWxzZSk7Ci0gICAgICAgICgoU09BUE1lc3NhZ2VDb250ZXh0SW1wbCkgY2guZ2V0U01DKCkpLnNldFJvbGVzKGdldFJvbGVzKCkpOwotICAgICAgICBjbG9zZUhhbmRsZXJzU2VydmVyKGNoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJdCBpcyBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIGFuIE1VIGZhdWx0IG9jY3VycyBzaW5jZSB0aGUgaGFuZGxlcmNoYWluCi0gICAgICogbmV2ZXIgZ2V0cyBpbnZva2VkLiBUaGUgZGlyZWN0aW9uIGlzIGFuIGluYm91bmQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmb3JjZUNsb3NlSGFuZGxlcnNPbkNsaWVudChTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBDb250ZXh0SG9sZGVyIGNoID0gbmV3IENvbnRleHRIb2xkZXIoY29udGV4dCk7Ci0KLSAgICAgICAgLy8gb25seSBjYWxsZWQgYWZ0ZXIgYW4gaW5ib3VuZCByZXF1ZXN0Ci0gICAgICAgIGNoLmdldFNNQygpLnB1dChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCBmYWxzZSk7Ci0gICAgICAgICgoU09BUE1lc3NhZ2VDb250ZXh0SW1wbCkgY2guZ2V0U01DKCkpLnNldFJvbGVzKGdldFJvbGVzKCkpOwotICAgICAgICBjbG9zZUhhbmRsZXJzQ2xpZW50KGNoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJzaW9uIG9mIGZvcmNlQ2xvc2VIYW5kbGVycyhIYW5kbGVyQ29udGV4dCkgdGhhdCBpcyB1c2VkCi0gICAgICogYnkgWE1MIGJpbmRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9yY2VDbG9zZUhhbmRsZXJzT25TZXJ2ZXIoWE1MSGFuZGxlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBDb250ZXh0SG9sZGVyIGNoID0gbmV3IENvbnRleHRIb2xkZXIoY29udGV4dCk7Ci0gICAgICAgIC8vIG9ubHkgY2FsbGVkIGFmdGVyIGFuIGluYm91bmQgcmVxdWVzdAotICAgICAgICBjaC5nZXRMTUMoKS5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwgZmFsc2UpOwotICAgICAgICBjbG9zZUhhbmRsZXJzU2VydmVyKGNoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJzaW9uIG9mIGZvcmNlQ2xvc2VIYW5kbGVycyhIYW5kbGVyQ29udGV4dCkgdGhhdCBpcyB1c2VkCi0gICAgICogYnkgWE1MIGJpbmRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9yY2VDbG9zZUhhbmRsZXJzT25DbGllbnQoWE1MSGFuZGxlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBDb250ZXh0SG9sZGVyIGNoID0gbmV3IENvbnRleHRIb2xkZXIoY29udGV4dCk7Ci0gICAgICAgIC8vIG9ubHkgY2FsbGVkIGFmdGVyIGFuIGluYm91bmQgcmVxdWVzdAotICAgICAgICBjaC5nZXRMTUMoKS5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwgZmFsc2UpOwotICAgICAgICBjbG9zZUhhbmRsZXJzQ2xpZW50KGNoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VQcm90b2NvbEhhbmRsZXJzKENvbnRleHRIb2xkZXIgaG9sZGVyLAotICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQotICAgICAgICBjbG9zZUdlbmVyaWNIYW5kbGVycyhzb2FwSGFuZGxlcnMsIGhvbGRlci5nZXRTTUMoKSwgc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlTG9naWNhbEhhbmRsZXJzKENvbnRleHRIb2xkZXIgaG9sZGVyLAotICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQotICAgICAgICBjbG9zZUdlbmVyaWNIYW5kbGVycyhsb2dpY2FsSGFuZGxlcnMsIGhvbGRlci5nZXRMTUMoKSwgc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgY2xvc2Ugb24gdGhlIGhhbmRsZXJzIGZyb20gdGhlIHN0YXJ0aW5nCi0gICAgICogaW5kZXggdGhyb3VnaCB0aGUgZW5kaW5nIGluZGV4IChpbmNsdXNpdmUpLiBNYWRlIGluZGljZXMKLSAgICAgKiBpbmNsdXNpdmUgdG8gYWxsb3cgYm90aCBkaXJlY3Rpb25zIG1vcmUgZWFzaWx5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbG9zZUdlbmVyaWNIYW5kbGVycyhMaXN0PD8gZXh0ZW5kcyBIYW5kbGVyPiBoYW5kbGVyTGlzdCwKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGFydCA+IGVuZCkgewotICAgICAgICAgICAgZm9yIChpbnQgaT1zdGFydDsgaT49ZW5kOyBpLS0pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyTGlzdC5nZXQoaSkuY2xvc2UoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLklORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGlnbm9yZWQgZHVyaW5nIGNsb3NlIiwgcmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9c3RhcnQ7IGk8PWVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckxpc3QuZ2V0KGkpLmNsb3NlKGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBpZ25vcmVkIGR1cmluZyBjbG9zZSIsIHJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGhvbGQgdGhlIGNvbnRleHQgb2JqZWN0cyB0aGF0IGFyZSB1c2VkIHRvIGdldAotICAgICAqIGFuZCBzZXQgdGhlIGN1cnJlbnQgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIElmIGEgSGFuZGxlckNvbnRleHQgaXMgcGFzc2VkIGluLCBib3RoIGxvZ2ljYWwgYW5kIHNvYXAKLSAgICAgKiBoYW5kbGVycyBhcmUgdXNlZC4gSWYgWE1MSGFuZGxlckNvbnRleHQgaXMgcGFzc2VkIGluLAotICAgICAqIG9ubHkgbG9naWNhbCBoYW5kbGVycyBhcmUgYXNzdW1lZCB0byBiZSBwcmVzZW50LgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBDb250ZXh0SG9sZGVyIHsKLQotICAgICAgICBib29sZWFuIGxvZ2ljYWxPbmx5OwotICAgICAgICBTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dDsKLSAgICAgICAgWE1MSGFuZGxlckNvbnRleHQgeG1sQ29udGV4dDsKLQotICAgICAgICBDb250ZXh0SG9sZGVyKFNPQVBIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICAgICAgbG9naWNhbE9ubHkgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRleHRIb2xkZXIoWE1MSGFuZGxlckNvbnRleHQgeG1sQ29udGV4dCkgewotICAgICAgICAgICAgdGhpcy54bWxDb250ZXh0ID0geG1sQ29udGV4dDsKLSAgICAgICAgICAgIGxvZ2ljYWxPbmx5ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBnZXRMTUMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGxvZ2ljYWxPbmx5ID8geG1sQ29udGV4dC5nZXRMb2dpY2FsTWVzc2FnZUNvbnRleHQoKSA6Ci0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dpY2FsTWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTT0FQTWVzc2FnZUNvbnRleHQgZ2V0U01DKCkgewotICAgICAgICAgICAgcmV0dXJuIChsb2dpY2FsT25seSA/IG51bGwgOiBjb250ZXh0LmdldFNPQVBNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5zTW9kZWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvSGFuZGxlckNoYWluc01vZGVsLmphdmEKaW5kZXggMWU5NjgwYS4uODRiYjJmOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5zTW9kZWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJDaGFpbnNNb2RlbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDcgKzI1LDEwIEBACiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlcjsKIAoraW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5EZXBsb3ltZW50RGVzY3JpcHRvclBhcnNlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkhhbmRsZXJBbm5vdGF0aW9uSW5mbzsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkpBWFdTVXRpbHM7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5VdGlsRXhjZXB0aW9uOwpAQCAtMzYsMTAgKzM5LDEyIEBACiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKIGltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsKLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwogCiAKQEAgLTQ3LDI2ICs1MiwyNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKAogICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db25zdGFudHMuTG9nZ2luZ0RvbWFpbiArICIudXRpbCIpOwogCi0gICAgcHJvdGVjdGVkIENsYXNzIGFubm90YXRlZENsYXNzOwotICAgIHByb3RlY3RlZCBMaXN0PEhhbmRsZXJDaGFpblR5cGU+IGhhbmRsZXJDaGFpbnM7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBpZDsKKyAgICBwcml2YXRlIENsYXNzIGFubm90YXRlZENsYXNzOworICAgIHByaXZhdGUgTGlzdDxIYW5kbGVyQ2hhaW5UeXBlPiBoYW5kbGVyQ2hhaW5zOworICAgIHByaXZhdGUgU3RyaW5nIGlkOwogICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEhhbmRsZXJDaGFpbnMgKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc01vZGVsKENsYXNzIGFubm90YXRlZENsYXNzKSB7CisgICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zTW9kZWwoQ2xhc3MgYW5ub3RhdGVkQ2xhc3MpIHsKICAgICAgICAgdGhpcy5hbm5vdGF0ZWRDbGFzcyA9IGFubm90YXRlZENsYXNzOwogICAgIH0KIAotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXJDaGFpblR5cGU+IGdldEhhbmRsZXJDaGFpbigpIHsKKyAgICBwcml2YXRlIExpc3Q8SGFuZGxlckNoYWluVHlwZT4gZ2V0SGFuZGxlckNoYWluKCkgewogICAgICAgICBpZiAoaGFuZGxlckNoYWlucyA9PSBudWxsKSB7CiAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5zID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyQ2hhaW5UeXBlPigpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5zOwogICAgIH0KIAotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CiAgICAgICAgIHJldHVybiBpZDsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7CisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKICAgICB9CiAgICAgLyoqCkBAIC0xMDgsNyArMTEzLDcgQEAKICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRDb250ZW50KHJlYWRlcik7CiAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKFFOQU1FX0hBTkRMRVJfTkFNRSkpIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZXJOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLmdldEVsZW1lbnRUZXh0KHJlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5nZXRFbGVtZW50VGV4dChyZWFkZXIpLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zZXRIYW5kbGVyTmFtZShoYW5kbGVyTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dENvbnRlbnQocmVhZGVyKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTYsNyArMTIxLDcgQEAKICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGNsYXNzCiAgICAgICAgICAgICAgICAgZW5zdXJlUHJvcGVyTmFtZShyZWFkZXIsIFFOQU1FX0hBTkRMRVJfQ0xBU1MpOwogICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGVyQ2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5nZXRFbGVtZW50VGV4dChyZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5nZXRFbGVtZW50VGV4dChyZWFkZXIpLnRyaW0oKTsKICAgICAgICAgICAgICAgICBoYW5kbGVyLnNldEhhbmRsZXJDbGFzcyhoYW5kbGVyQ2xhc3MpOwogICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dENvbnRlbnQocmVhZGVyKTsKIApAQCAtMTU2LDE3ICsxNjEsMjEgQEAKICAgICAvKioKICAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSBIYW5kbGVyQW5ub3RhdGlvblByb2Nlc3NvciwKICAgICAgKiBhbmQgYnkKLSAgICAgKiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuc2VydmxldC5SdW50aW1lRW5kcG9pbnRJbmZvUGFyc2VyfQorICAgICAqIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5EZXBsb3ltZW50RGVzY3JpcHRvclBhcnNlcn0KICAgICAgKiBkaXJlY3RseSB3aGVuIGl0IHJlYWNoZXMgdGhlIGhhbmRsZXIgY2hhaW5zIGVsZW1lbnQgaW4gdGhlCiAgICAgICogZGVzY3JpcHRvciBmaWxlIGl0IGlzIHBhcnNpbmcuCi0gICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIHNob3VsZCBiZSBvbiA8aGFuZGxlci1jaGFpbnM+IGVsZW1lbnQKICAgICAgKiBAcmV0dXJuIEEgSGFuZGxlckFubm90YXRpb25JbmZvIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUKICAgICAgKiBoYW5kbGVycyBhbmQgcm9sZXMuCiAgICAgICovCisKKworCiAgICAgcHVibGljIHN0YXRpYyBIYW5kbGVyQW5ub3RhdGlvbkluZm8gcGFyc2VIYW5kbGVyRmlsZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLAogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIFFOYW1lIHNlcnZpY2VOYW1lLCBRTmFtZSBwb3J0TmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQpIHsKKyAgICAgICAgICAgIFdTQmluZGluZyB3c2JpbmRpbmcpIHsKICAgICAgICAgZW5zdXJlUHJvcGVyTmFtZShyZWFkZXIsUU5BTUVfSEFORExFUl9DSEFJTlMpOworICAgICAgICBTdHJpbmcgYmluZGluZ0lkID0gd3NiaW5kaW5nLmdldEJpbmRpbmdJZCgpLnRvU3RyaW5nKCk7CiAgICAgICAgIEhhbmRsZXJBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEhhbmRsZXJBbm5vdGF0aW9uSW5mbygpOwogCiAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7CkBAIC0yMDEsMTEgKzIxMCwxMiBAQAogICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBiaW5kaW5nTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgICAgICAgICAgICAgIHdoaWxlKHN0ay5oYXNNb3JlVG9rZW5zKCkpIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuT3JVUkkgPSBzdGsubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nID0gdG9rZW5CaW5kaW5nTWFwLmdldCh0b2tlbk9yVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoYmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1Vua25vd24gYmluZGluZyBvciBVbmtub3duIHRva2VuLCBQdXQgaXQgYXMgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcgPSB0b2tlbk9yVVJJOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIENvbnZlcnQgc2hvcnQtZm9ybSB0b2tlbnMgdG8gQVBJJ3MgYmluZGluZyBpZHMKKyAgICAgICAgICAgICAgICAgICAgVW5rbm93biB0b2tlbiwgUHV0IGl0IGFzIGl0IGlzCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHRva2VuT3JVUkkgPSBEZXBsb3ltZW50RGVzY3JpcHRvclBhcnNlci5nZXRCaW5kaW5nSWRGb3JUb2tlbih0b2tlbk9yVVJJKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmcgPSBCaW5kaW5nSUQucGFyc2UodG9rZW5PclVSSSkudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0xpc3QuYWRkKGJpbmRpbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZihiaW5kaW5nTGlzdC5jb250YWlucyhiaW5kaW5nSWQpKXsKQEAgLTIzNCw3ICsyNDQsNyBAQAogCiAgICAgICAgICAgICAvLyBwcm9jZXNzIGFsbCA8aGFuZGxlcj4gZWxlbWVudHMKICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhRTkFNRV9IQU5ETEVSKSkgewotICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG51bGw7CisgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyOwogCiAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwogICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhRTkFNRV9IQU5ETEVSX05BTUUpKSB7CkBAIC0yNDUsNyArMjU1LDcgQEAKICAgICAgICAgICAgICAgICBlbnN1cmVQcm9wZXJOYW1lKHJlYWRlciwgUU5BTUVfSEFORExFUl9DTEFTUyk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IChIYW5kbGVyKSBsb2FkQ2xhc3MoY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5nZXRFbGVtZW50VGV4dChyZWFkZXIpKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuZ2V0RWxlbWVudFRleHQocmVhZGVyKS50cmltKCkpLm5ld0luc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSl7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKQEAgLTMzOSw3ICszNDksNyBAQAogCiAgICAgfQogCi0gICAgc3RhdGljIENsYXNzIGxvYWRDbGFzcyhDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBuYW1lKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKENsYXNzTG9hZGVyIGxvYWRlciwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIHRydWUsIGxvYWRlcik7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewpAQCAtMzQ5LDcgKzM1OSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBjYWxsSGFuZGxlclBvc3RDb25zdHJ1Y3QoT2JqZWN0IGhhbmRsZXJDbGFzcykgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2FsbEhhbmRsZXJQb3N0Q29uc3RydWN0KE9iamVjdCBoYW5kbGVyQ2xhc3MpIHsKICAgICAgICAgLy8gY2FsbCBAUG9zdENvbnN0cnVjdCBtZXRob2Qgb24gaGFuZGxlciBpZiBwcmVzZW50CiAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGhhbmRsZXJDbGFzcy5nZXRDbGFzcygpLmdldE1ldGhvZHMoKSkgewogICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRBbm5vdGF0aW9uKFBvc3RDb25zdHJ1Y3QuY2xhc3MpID09IG51bGwpIHsKQEAgLTM2NCwyMCArMzc0LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBza2lwQ2hhaW4oWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2tpcENoYWluKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKICAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dENvbnRlbnQocmVhZGVyKSAhPQogICAgICAgICAgICAgICAgIFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCB8fAogICAgICAgICAgICAgICAgICFyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhRTkFNRV9IQU5ETEVSX0NIQUlOKSkge30KICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBza2lwVGV4dEVsZW1lbnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2tpcFRleHRFbGVtZW50KFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0Q29udGVudChyZWFkZXIpOwogICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwogICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwogICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIHNraXBJbml0UGFyYW1FbGVtZW50KFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNraXBJbml0UGFyYW1FbGVtZW50KFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKICAgICAgICAgaW50IHN0YXRlOwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBzdGF0ZSA9IFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dENvbnRlbnQocmVhZGVyKTsKQEAgLTM4Niw3ICszOTYsNyBAQAogICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwogICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIGVuc3VyZVByb3Blck5hbWUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuc3VyZVByb3Blck5hbWUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKICAgICAgICAgICAgIFFOYW1lIGV4cGVjdGVkTmFtZSkgewogCiAgICAgICAgIGlmICghcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoZXhwZWN0ZWROYW1lKSkgewpAQCAtNDAyLDEzICs0MTIsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIGZhaWxXaXRoTG9jYWxOYW1lKFN0cmluZyBrZXksCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmYWlsV2l0aExvY2FsTmFtZShTdHJpbmcga2V5LAogICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgU3RyaW5nIGFyZykgewogICAgICAgICB0aHJvdyBuZXcgVXRpbEV4Y2VwdGlvbihrZXksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcocmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpKSwKICAgICAgICAgICAgIHJlYWRlci5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgIGFyZyB9KTsKKyAgICAgICAgICAgIGFyZyApOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX1NPQVAxMV9UT0tFTiA9ICIjI1NPQVAxMV9IVFRQIjsKQEAgLTQ0MywyOCArNDUyLDE4IEBACiAgICAgICAgICAgICBuZXcgUU5hbWUoTlNfMTA5LCAic29hcC1oZWFkZXIiKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0hBTkRMRVJfUk9MRSA9CiAgICAgICAgICAgICBuZXcgUU5hbWUoTlNfMTA5LCAic29hcC1yb2xlIik7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gdG9rZW5CaW5kaW5nTWFwOwotICAgIC8vUG9wdWxhdGUgdGhlIHRva2VuIG1hcAotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRva2VuQmluZGluZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0gICAgICAgIHRva2VuQmluZGluZ01hcC5wdXQoIiMjU09BUDExX0hUVFAiLFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyk7Ci0gICAgICAgIHRva2VuQmluZGluZ01hcC5wdXQoIiMjU09BUDExX0hUVFBfTVRPTSIsU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpOwotICAgICAgICB0b2tlbkJpbmRpbmdNYXAucHV0KCIjI1NPQVAxMl9IVFRQIixTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpOwotICAgICAgICB0b2tlbkJpbmRpbmdNYXAucHV0KCIjI1NPQVAxMl9IVFRQX01UT00iLFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKTsKLSAgICAgICAgdG9rZW5CaW5kaW5nTWFwLnB1dCgiIyNYTUxfSFRUUCIsSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKTsKLSAgICB9CiAKICAgICBzdGF0aWMgY2xhc3MgSGFuZGxlckNoYWluVHlwZSB7CiAgICAgICAgIC8vY29uc3RyYWludHMKLSAgICAgICAgcHJvdGVjdGVkIFFOYW1lIHNlcnZpY2VOYW1lUGF0dGVybjsKLSAgICAgICAgcHJvdGVjdGVkIFFOYW1lIHBvcnROYW1lUGF0dGVybjsKLSAgICAgICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBwcm90b2NvbEJpbmRpbmdzOworICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZVBhdHRlcm47CisgICAgICAgIFFOYW1lIHBvcnROYW1lUGF0dGVybjsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByb3RvY29sQmluZGluZ3M7CiAKICAgICAgICAgLy8gVGhpcyBmbGFnIGlzIHNldCBpZiBvbmUgb2YgdGhlIGFib3ZlIGNvbnN0cmFpbnQgaXMgc2V0IG9uIGhhbmRsZXIgY2hhaW4KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uc3RyYWludFNldCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGNvbnN0cmFpbnRTZXQgPSBmYWxzZTsKIAotICAgICAgICBwcm90ZWN0ZWQgTGlzdDxIYW5kbGVyVHlwZT4gaGFuZGxlcnM7Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgaWQ7CisgICAgICAgIExpc3Q8SGFuZGxlclR5cGU+IGhhbmRsZXJzOworICAgICAgICBTdHJpbmcgaWQ7CiAKIAogICAgICAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBIYW5kbGVyQ2hhaW4gKi8KQEAgLTQ5NCwxMiArNDkzLDEzIEBACiAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbEJpbmRpbmdzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUHJvdG9jb2xCaW5kaW5nKFN0cmluZyB0b2tlbm9yVVJJKXsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nID0gdG9rZW5CaW5kaW5nTWFwLmdldCh0b2tlbm9yVVJJKTsKLSAgICAgICAgICAgIGlmKGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vVW5rbm93biBiaW5kaW5nIG9yIFVua25vd24gdG9rZW4sIFB1dCBpdCBhcyBpdCBpcwotICAgICAgICAgICAgICAgIGJpbmRpbmcgPSB0b2tlbm9yVVJJOwotICAgICAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm90b2NvbEJpbmRpbmcoU3RyaW5nIHRva2VuT3JVUkkpeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIENvbnZlcnQgc2hvcnQtZm9ybSB0b2tlbnMgdG8gQVBJJ3MgYmluZGluZyBpZHMKKyAgICAgICAgICAgIFVua25vd24gdG9rZW4sIFB1dCBpdCBhcyBpdCBpcworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRva2VuT3JVUkkgPSBEZXBsb3ltZW50RGVzY3JpcHRvclBhcnNlci5nZXRCaW5kaW5nSWRGb3JUb2tlbih0b2tlbk9yVVJJKTsKKyAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nID0gQmluZGluZ0lELnBhcnNlKHRva2VuT3JVUkkpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBwcm90b2NvbEJpbmRpbmdzLmFkZChiaW5kaW5nKTsKICAgICAgICAgICAgIGNvbnN0cmFpbnRTZXQgPSB0cnVlOwogICAgICAgICB9CkBAIC01MjQsMTEgKzUyNCwxMSBAQAogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBIYW5kbGVyVHlwZSB7Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgaGFuZGxlck5hbWU7Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgaGFuZGxlckNsYXNzOwotICAgICAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHNvYXBSb2xlczsKKyAgICAgICAgU3RyaW5nIGhhbmRsZXJOYW1lOworICAgICAgICBTdHJpbmcgaGFuZGxlckNsYXNzOworICAgICAgICBMaXN0PFN0cmluZz4gc29hcFJvbGVzOwogCi0gICAgICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOworICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlkOwogCiAgICAgICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEhhbmRsZXJDb21wb25lbnQgKi8KICAgICAgICAgcHVibGljIEhhbmRsZXJUeXBlKCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9IYW5kbGVyQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9IYW5kbGVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzUzNTFhLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvSGFuZGxlckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5IZWFkZXJCbG9jazsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkF0dGFjaG1lbnRCbG9jazsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5JbnRlcm5hbFNvYXBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLkludm9rZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogVGhlIEhhbmRsZXJDb250ZXh0IGlzIHVzZWQgaW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIHJ1bnRpbWUKLSAqIGluIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC5zb2FwLmNsaWVudC5TT0FQTWVzc2FnZURpc3BhdGNoZXJ9IGFuZAotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuc2VydmVyLlNPQVBNZXNzYWdlRGlzcGF0Y2hlcn0gdG8gaG9sZAotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbWVzc2FnZS4KLSAqCi0gKiA8cD5JdCBzdG9yZXMgYSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm99IGFuZAotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlfQotICogd2hpY2ggYXJlIHVzZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHJ1bnRpbWUsIGFuZCBwcm92aWRlcyBhIGJyaWRnZQotICogYmV0d2VlbiB0aGVzZSBhbmQgdGhlIHNvYXAgYW5kIGxvZ2ljYWwgbWVzc2FnZSBjb250ZXh0cyB0aGF0Ci0gKiBhcmUgdXNlZCBieSB0aGUgaGFuZGxlcnMuCi0gKgotICogQHNlZSBMb2dpY2FsTWVzc2FnZUNvbnRleHRJbXBsCi0gKiBAc2VlIE1lc3NhZ2VDb250ZXh0SW1wbAotICogQHNlZSBTT0FQTWVzc2FnZUNvbnRleHRJbXBsCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVyQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvOwotICAgIHByaXZhdGUgSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZTsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQ7Ci0KLSAgICBwcml2YXRlIE1ldGhvZCBtZXRob2Q7Ci0gICAgcHJpdmF0ZSBJbnZva2VyIGludm9rZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYWxnb3JpdGhtOwotICAgIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdJZDsKLQotICAgIHB1YmxpYyBIYW5kbGVyQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZSkgewotICAgICAgICB0aGlzLm1lc3NhZ2VJbmZvID0gbWVzc2FnZUluZm87Ci0gICAgICAgIHRoaXMuaW50ZXJuYWxNZXNzYWdlID0gaW50ZXJuYWxNZXNzYWdlOwotICAgICAgICB0aGlzLm1zZ0NvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHRJbXBsKCk7Ci0gICAgICAgIC8vcG9wdWxhdGVBdHRhY2htZW50TWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzb2FwTWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtc2dDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgdGhpcy5tc2dDb250ZXh0ID0gbXNnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZXJuYWxNZXNzYWdlIGdldEludGVybmFsTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGludGVybmFsTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEBwYXJhbSBpbnRlcm5hbE1lc3NhZ2UgVGhlIGludGVybmFsTWVzc2FnZSB0byBzZXQuCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbE1lc3NhZ2UoSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZSkgewotICAgICAgICB0aGlzLmludGVybmFsTWVzc2FnZSA9IGludGVybmFsTWVzc2FnZTsKLSAgICAgICAgcG9wdWxhdGVBdHRhY2htZW50TWFwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VJbmZvIGdldE1lc3NhZ2VJbmZvKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBAcGFyYW0gbWVzc2FnZUluZm8gVGhlIG1lc3NhZ2VJbmZvIHRvIHNldC4KLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJbmZvKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUluZm8gPSBtZXNzYWdlSW5mbzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIGludm9jYXRpb24gbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFJldHVybnMgSW50ZXJuYWxNZXNzYWdlJ3MgQm9keUJsb2NrIHZhbHVlLiBJdCBjYW4gYmUgbnVsbCBmb3IgZW1wdHkgYm9keS4KLSAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Qm9keSgpIHsKLSAgICAgICAgcmV0dXJuIChpbnRlcm5hbE1lc3NhZ2UgPT0gbnVsbCkgPyBudWxsIDogKChpbnRlcm5hbE1lc3NhZ2UuZ2V0Qm9keSgpID09IG51bGwpP251bGw6aW50ZXJuYWxNZXNzYWdlLmdldEJvZHkoKS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogUmV0dXJucyBJbnRlcm5hbE1lc3NhZ2UncyBIZWFkZXJCbG9jayB2YWx1ZXMKLSAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldEhlYWRlcnMoKSB7Ci0gICAgICAgIExpc3Q8SGVhZGVyQmxvY2s+IGhlYWRlckJsb2NrcyA9Ci0gICAgICAgICAgICAoaW50ZXJuYWxNZXNzYWdlID09IG51bGwpID8gbnVsbCA6IGludGVybmFsTWVzc2FnZS5nZXRIZWFkZXJzKCk7Ci0gICAgICAgIGlmIChoZWFkZXJCbG9ja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgIExpc3QgaGVhZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICBmb3IgKEhlYWRlckJsb2NrIGhlYWRlckJsb2NrIDogaGVhZGVyQmxvY2tzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlckJsb2NrLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZChoZWFkZXJCbG9jay5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJldHVybiBoZWFkZXJzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lkKCkgewotICAgICAgICByZXR1cm4gYmluZGluZ0lkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdJZChTdHJpbmcgYmluZGluZ0lEKSB7Ci0gICAgICAgIGJpbmRpbmdJZCA9IGJpbmRpbmdJRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5vbmljYWxpemF0aW9uKFN0cmluZyBhbGdvcml0aG0pIHsKLSAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07Ci0gICAgfQotCi0gICAgcHVibGljIEludm9rZXIgZ2V0SW52b2tlcigpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW52b2tlcihJbnZva2VyIGludm9rZXIpIHsKLSAgICAgICAgdGhpcy5pbnZva2VyID0gaW52b2tlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUF0dGFjaG1lbnRNYXAoKXsKLSAgICAgICAgLy9wb3B1bGF0ZSB0aGUgYXR0YWNobWVudCBtYXAKLSAgICAgICAgaWYoaW50ZXJuYWxNZXNzYWdlICE9IG51bGwpewotICAgICAgICAgICAgZm9yKEF0dGFjaG1lbnRCbG9jayBhYjogaW50ZXJuYWxNZXNzYWdlLmdldEF0dGFjaG1lbnRzKCkudmFsdWVzKCkpewotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0VXRpbC5hZGRNZXNzYWdlQXR0YWNobWVudChtc2dDb250ZXh0LCBhYi5nZXRJZCgpLCBhYi5hc0RhdGFIYW5kbGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvSGFuZGxlckV4Y2VwdGlvbi5qYXZhCmluZGV4IGRjMDdkMDAuLjRjZDExZTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvSGFuZGxlckV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvSGFuZGxlckV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgc3VwZXIoImhhbmRsZXIubmVzdGVkRXJyb3IiLCBhcmcpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlc291cmNlQnVuZGxlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuaGFuZGxlciI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9IYW5kbGVyUHJvY2Vzc29yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM0MGNkCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9IYW5kbGVyUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CisKK2ltcG9ydCBqYXZheC54bWwud3MuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworYWJzdHJhY3QgY2xhc3MgSGFuZGxlclByb2Nlc3NvcjxDIGV4dGVuZHMgTWVzc2FnZVVwZGF0YWJsZUNvbnRleHQ+IHsKKworICAgIGJvb2xlYW4gaXNDbGllbnQ7CisgICAgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKAorICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db25zdGFudHMuTG9nZ2luZ0RvbWFpbiArICIuaGFuZGxlciIpOworCisgICAgLy8gbmVlZCByZXF1ZXN0IG9yIHJlc3BvbnNlIGZvciBIYW5kbGUgaW50ZXJmYWNlCisgICAgcHVibGljIGVudW0gUmVxdWVzdE9yUmVzcG9uc2UgeworICAgICAgICBSRVFVRVNULCBSRVNQT05TRSB9CisKKyAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24geworICAgICAgICBPVVRCT1VORCwgSU5CT1VORCB9CisKKyAgICBwcml2YXRlIExpc3Q8PyBleHRlbmRzIEhhbmRsZXI+IGhhbmRsZXJzOyAvLyBtYXkgYmUgbG9naWNhbC9zb2FwIG1peGVkCisKKyAgICBXU0JpbmRpbmcgYmluZGluZzsKKyAgICBwcml2YXRlIGludCBpbmRleCA9IC0xOworICAgIHByaXZhdGUgSGFuZGxlclR1YmUgb3duZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGFuZGxlcnMgdGhhdCBhcmUgcGFzc2VkIGluIHdpbGwgYmUgc29ydGVkIGludG8KKyAgICAgKiBsb2dpY2FsIGFuZCBzb2FwIGhhbmRsZXJzLiBEdXJpbmcgdGhpcyBzb3J0aW5nLCB0aGUKKyAgICAgKiB1bmRlcnN0b29kIGhlYWRlcnMgYXJlIGFsc28gb2J0YWluZWQgZnJvbSBhbnkgc29hcAorICAgICAqIGhhbmRsZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGNoYWluIEEgbGlzdCBvZiBoYW5kbGVyIG9iamVjdHMsIHdoaWNoIGNhbgorICAgICAqICAgICAgICAgICAgICBiZSBwcm90b2NvbCBvciBsb2dpY2FsIGhhbmRsZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYW5kbGVyUHJvY2Vzc29yKEhhbmRsZXJUdWJlIG93bmVyLCBXU0JpbmRpbmcgYmluZGluZywgTGlzdDw/IGV4dGVuZHMgSGFuZGxlcj4gY2hhaW4pIHsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICBpZiAoY2hhaW4gPT0gbnVsbCkgeyAvLyBzaG91bGQgb25seSBoYXBwZW4gaW4gdGVzdGluZworICAgICAgICAgICAgY2hhaW4gPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlcnMgPSBjaGFpbjsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyBpbmRleCBvZiB0aGUgaGFuZGxlciBpbiB0aGUgY2hhaW4gdG8ga25vdyB3aGF0IGhhbmRsZXJzIGluIHRoZSBjaGFpbgorICAgICAqIGFyZSBpbnZva2VkCisgICAgICovCisgICAgaW50IGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGhhbmRsZXIgcmV0dXJucyBmYWxzZSBvciB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uCisgICAgICovCisgICAgdm9pZCBzZXRJbmRleChpbnQgaSkgeworICAgICAgICBpbmRleCA9IGk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogSnVzdCBwdXR0aW5nIHRob3VnaHRzLAorICAgICAqIEN1cnJlbnQgY29udHJhY3Q6IFRoaXMgaXMgQ2FsbGVkIGR1cmluZyBSZXF1ZXN0IFByb2Nlc3NpbmcuCisgICAgICogcmV0dXJuIHRydWUsIGlmIGFsbCBoYW5kbGVycyBpbiB0aGUgY2hhaW4gcmV0dXJuIHRydWUKKyAgICAgKiBDdXJyZW50IFBpcGUgY2FuIGNhbGwgbmV4dFBpcGUucHJvY2VzcygpOworICAgICAqIHJldHVybiBmYWxzZSwgT25lIG9mIHRoZSBoYW5kbGVycyBoYXMgcmV0dXJuZWQgZmFsc2Ugb3IgdGhyb3duIGEKKyAgICAgKiBSdW50aW1lRXhjZXB0aW9uLiBSZW1lZHkgQWN0aW9ucyB0YWtlbjoKKyAgICAgKiAxKSBJbiB0aGlzIGNhc2UsIFRoZSBwcm9jZXNzb3Igd2lsbCBzZXRJbmRleCgpdG8gdHJhY2sgd2hhdAorICAgICAqIGhhbmRsZXJzIGFyZSBpbnZva2VkIHVudGlsIHRoYXQgcG9pbnQuCisgICAgICogMikgUHJldmlvdXNseSBpbnZva2VkIGhhbmRsZXJzIGFyZSBhZ2FpbiBpbnZva2VkIChoYW5kbGVNZXNzYWdlKCkKKyAgICAgKiBvciBoYW5kbGVGYXVsdCgpKSB0byB0YWtlIHJlbWVkeSBhY3Rpb24uCisgICAgICogQ3VycmVudFBpcGUgc2hvdWxkIE5PVCBjYWxsIG5leHRQaXBlLnByb2Nlc3MoKQorICAgICAqIFdoaWxlIGNsb3NpbmcgaGFuZGxlcnMsIGNoZWNrIGdldEluZGV4KCkgdG8gZ2V0IHRoZSBpbnZva2VkCisgICAgICogaGFuZGxlcnMuCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHRoaXMgaGFwcGVucyB3aGVuIGEgUnVudGltZUV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nCisgICAgICogaGFuZGxlTWVzc2FnZSBkdXJpbmcgUmVxdWVzdCBwcm9jZXNzaW5nIG9yCisgICAgICogZHVyaW5nIHJlbWVkeSBhY3Rpb24gMikKKyAgICAgKiBDdXJyZW50UGlwZSBzaG91bGQgTk9UIGNhbGwgbmV4dFBpcGUucHJvY2VzcygpIGFuZCB0aHJvdyB0aGUKKyAgICAgKiBleGNlcHRpb24gdG8gdGhlIHByZXZpb3VzIFBpcGUKKyAgICAgKiBXaGlsZSBjbG9zaW5nIGhhbmRsZXJzLCBjaGVjayBnZXRJbmRleCgpIHRvIGdldCB0aGUgaW52b2tlZAorICAgICAqIGhhbmRsZXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbGxIYW5kbGVyc1JlcXVlc3QoRGlyZWN0aW9uIGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzcG9uc2VFeHBlY3RlZCkgeworICAgICAgICBzZXREaXJlY3Rpb24oZGlyZWN0aW9uLCBjb250ZXh0KTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQ7CisgICAgICAgIC8vIGNhbGwgaGFuZGxlcnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVEJPVU5EKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FsbEhhbmRsZU1lc3NhZ2UoY29udGV4dCwgMCwgaGFuZGxlcnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxIYW5kbGVNZXNzYWdlKGNvbnRleHQsIGhhbmRsZXJzLnNpemUoKSAtIDEsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FUiwgImV4Y2VwdGlvbiBpbiBoYW5kbGVyIGNoYWluIiwgcGUpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlRXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAvL2luc2VydCBmYXVsdCBtZXNzYWdlIGlmIGl0cyBub3QgYSBmYXVsdCBtZXNzYWdlCisgICAgICAgICAgICAgICAgaW5zZXJ0RmF1bHRNZXNzYWdlKGNvbnRleHQsIHBlKTsKKyAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGRpcmVjdGlvbgorICAgICAgICAgICAgICAgIHJldmVyc2VEaXJlY3Rpb24oZGlyZWN0aW9uLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAvL1NldCBoYW5kbGVGYXVsdCBzbyB0aGF0IGNvdXNpblR1YmUgaXMgYXdhcmUgb2YgZmF1bHQKKyAgICAgICAgICAgICAgICBzZXRIYW5kbGVGYXVsdFByb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgLy8gY2FsbCBoYW5kbGUgZmF1bHQKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVRCT1VORCkgeworICAgICAgICAgICAgICAgICAgICBjYWxsSGFuZGxlRmF1bHQoY29udGV4dCwgZ2V0SW5kZXgoKSAtIDEsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxIYW5kbGVGYXVsdChjb250ZXh0LCBnZXRJbmRleCgpICsgMSwgaGFuZGxlcnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IHBlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVSLCAiZXhjZXB0aW9uIGluIGhhbmRsZXIgY2hhaW4iLCByZSk7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VFeHBlY3RlZCkgeworICAgICAgICAgICAgICAgIC8vIHJldmVyc2UgZGlyZWN0aW9uCisgICAgICAgICAgICAgICAgcmV2ZXJzZURpcmVjdGlvbihkaXJlY3Rpb24sIGNvbnRleHQpOworICAgICAgICAgICAgICAgIC8vIGNhbGwgaGFuZGxlIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVRCT1VORCkgeworICAgICAgICAgICAgICAgICAgICBjYWxsSGFuZGxlTWVzc2FnZVJldmVyc2UoY29udGV4dCwgZ2V0SW5kZXgoKSAtIDEsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxIYW5kbGVNZXNzYWdlUmV2ZXJzZShjb250ZXh0LCBnZXRJbmRleCgpICsgMSwgaGFuZGxlcnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgaGFuZGxlRmFsc2Ugc28gdGhhdCBjb3VzaW5UdWJlIGlzIGF3YXJlIG9mIGZhbHNlIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAgICAvLyBPbmV3YXksIGRpc3BhdGNoIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgLy8gY291c2luVHViZSBzaG91bGQgbid0IGNhbGwgaGFuZGxlTWVzc2FnZSgpIGFueW1vcmUuCisgICAgICAgICAgICAgICAgc2V0SGFuZGxlRmFsc2VQcm9wZXJ0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRPRE86IEp1c3QgcHV0dGluZyB0aG91Z2h0cywKKyAgICAgKiBDdXJyZW50IGNvbnRyYWN0OiBUaGlzIGlzIENhbGxlZCBkdXJpbmcgUmVzcG9uc2UgUHJvY2Vzc2luZy4KKyAgICAgKiBSdW5zIGFsbCBoYW5kbGVycyB1bnRpbCBoYW5kbGUgcmV0dXJucyBmYWxzZSBvciB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uCisgICAgICogQ3VycmVudFBpcGUgc2hvdWxkIGNsb3NlIGFsbCB0aGUgaGFuZGxlcnMgaW4gdGhlIGNoYWluLgorICAgICAqIHRocm93IFJ1bnRpbWVFeGNlcHRpb24sIHRoaXMgaGFwcGVucyB3aGVuIGEgUnVudGltZUV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nCisgICAgICogbm9ybWFsIFJlc3BvbnNlIHByb2Nlc3Npbmcgb3IgcmVtZWR5IGFjdGlvbiAyKSB0YWtlbgorICAgICAqIGR1cmluZyBjYWxsSGFuZGxlcnNSZXF1ZXN0KCkuCisgICAgICogQ3VycmVudFBpcGUgc2hvdWxkIGNsb3NlIGFsbCB0aGUgaGFuZGxlcnMgaW4gdGhlIGNoYWluLiAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNhbGxIYW5kbGVyc1Jlc3BvbnNlKERpcmVjdGlvbiBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyBjb250ZXh0LCBib29sZWFuIGlzRmF1bHQpIHsKKyAgICAgICAgc2V0RGlyZWN0aW9uKGRpcmVjdGlvbiwgY29udGV4dCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNGYXVsdCkgeworICAgICAgICAgICAgICAgIC8vIGNhbGwgaGFuZGxlRmF1bHQgb24gaGFuZGxlcnMKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVRCT1VORCkgeworICAgICAgICAgICAgICAgICAgICBjYWxsSGFuZGxlRmF1bHQoY29udGV4dCwgMCwgaGFuZGxlcnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbEhhbmRsZUZhdWx0KGNvbnRleHQsIGhhbmRsZXJzLnNpemUoKSAtIDEsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY2FsbCBoYW5kbGVNZXNzYWdlIG9uIGhhbmRsZXJzCisgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUQk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbEhhbmRsZU1lc3NhZ2VSZXZlcnNlKGNvbnRleHQsIDAsIGhhbmRsZXJzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxIYW5kbGVNZXNzYWdlUmV2ZXJzZShjb250ZXh0LCBoYW5kbGVycy5zaXplKCkgLSAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVIsICJleGNlcHRpb24gaW4gaGFuZGxlciBjaGFpbiIsIHJlKTsKKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXZlcnNlcyB0aGUgTWVzc2FnZSBEaXJlY3Rpb24uCisgICAgICogTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSBpcyBjaGFuZ2VkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXZlcnNlRGlyZWN0aW9uKERpcmVjdGlvbiBvcmlnRGlyZWN0aW9uLCBDIGNvbnRleHQpIHsKKyAgICAgICAgaWYgKG9yaWdEaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVEJPVU5EKSB7CisgICAgICAgICAgICBjb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCBmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIE1lc3NhZ2UgRGlyZWN0aW9uLgorICAgICAqIE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkgaXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RGlyZWN0aW9uKERpcmVjdGlvbiBkaXJlY3Rpb24sIEMgY29udGV4dCkgeworICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVRCT1VORCkgeworICAgICAgICAgICAgY29udGV4dC5wdXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IEhhbmRsZXJQaXBlcyBjYW4gY2FsbCBoYW5kbGVGYXVsdCgpIG9uIHRoZQorICAgICAqIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0SGFuZGxlRmF1bHRQcm9wZXJ0eSgpIHsKKyAgICAgICAgb3duZXIuc2V0SGFuZGxlRmF1bHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IEhhbmRsZXJQaXBlcyB3aWxsIG5vdCBjYWxsCisgICAgICogaGFuZGxlTWVzc2FnZSgpIGR1cmluZyBSZXNwb25zZSBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRIYW5kbGVGYWxzZVByb3BlcnR5KCkgeworICAgICAgICBvd25lci5zZXRIYW5kbGVGYWxzZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gYSBQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoaXMgaXMgY2FsbGVkLgorICAgICAqIElmIGl0J3MgWE1ML0hUVFAgQmluZGluZywgY2xlYXIgdGhlIHRoZSBtZXNzYWdlCisgICAgICogSWYgaXRzIFNPQVAvSFRUUCBCaW5kaW5nLCBwdXQgcmlnaHQgU09BUCBGYXVsdCB2ZXJzaW9uCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBpbnNlcnRGYXVsdE1lc3NhZ2UoQyBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbik7CisKKyAgICAvKgorICAgICogQ2FsbHMgaGFuZGxlTWVzc2FnZSBvbiB0aGUgaGFuZGxlcnMuIEluZGljZXMgYXJlCisgICAgKiBpbmNsdXNpdmUuIEV4Y2VwdGlvbnMgZ2V0IHBhc3NlZCB1cCB0aGUgY2hhaW4sIGFuZCBhbgorICAgICogZXhjZXB0aW9uIG9yIHJldHVybiBvZiAnZmFsc2UnIGVuZHMgcHJvY2Vzc2luZy4KKyAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsSGFuZGxlTWVzc2FnZShDIGNvbnRleHQsIGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICAvKiBEbyB3ZSBuZWVkIHRoaXMgY2hlY2s/CisgICAgICAgIGlmIChoYW5kbGVycy5pc0VtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICBzdGFydCA9PSAtMSB8fAorICAgICAgICAgICAgICAgIHN0YXJ0ID09IGhhbmRsZXJzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICAqLworICAgICAgICBpbnQgaSA9IHN0YXJ0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGkgPj0gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlcnMuZ2V0KGkpLmhhbmRsZU1lc3NhZ2UoY29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEluZGV4KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlIChpIDw9IGVuZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJzLmdldChpKS5oYW5kbGVNZXNzYWdlKGNvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbmRleChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNldEluZGV4KGkpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKgorICAgICogQ2FsbHMgaGFuZGxlTWVzc2FnZSBvbiB0aGUgaGFuZGxlcnMuIEluZGljZXMgYXJlCisgICAgKiBpbmNsdXNpdmUuIEV4Y2VwdGlvbnMgZ2V0IHBhc3NlZCB1cCB0aGUgY2hhaW4sIGFuZCBhbgorICAgICogZXhjZXB0aW9uIChvcikKKyAgICAqIHJldHVybiBvZiAnZmFsc2UnIGNhbGxzIGFkZEhhbmRsZUZhbHNlUHJvcGVydHkoY29udGV4dCkgYW5kCisgICAgKiBlbmRzIHByb2Nlc3NpbmcuCisgICAgKiBzZXRJbmRleCgpIGlzIG5vdCBjYWxsZWQuCisgICAgKgorICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNhbGxIYW5kbGVNZXNzYWdlUmV2ZXJzZShDIGNvbnRleHQsIGludCBzdGFydCwgaW50IGVuZCkgeworCisgICAgICAgIGlmIChoYW5kbGVycy5pc0VtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICBzdGFydCA9PSAtMSB8fAorICAgICAgICAgICAgICAgIHN0YXJ0ID09IGhhbmRsZXJzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGkgPSBzdGFydDsKKworICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHsKKyAgICAgICAgICAgIHdoaWxlIChpID49IGVuZCkgeworICAgICAgICAgICAgICAgIGlmICghaGFuZGxlcnMuZ2V0KGkpLmhhbmRsZU1lc3NhZ2UoY29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGhhbmRsZUZhbHNlIHNvIHRoYXQgY291c2luVHViZSBpcyBhd2FyZSBvZiBmYWxzZSBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgIHNldEhhbmRsZUZhbHNlUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoaSA8PSBlbmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJzLmdldChpKS5oYW5kbGVNZXNzYWdlKGNvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCBoYW5kbGVGYWxzZSBzbyB0aGF0IGNvdXNpblR1YmUgaXMgYXdhcmUgb2YgZmFsc2UgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgICAgICBzZXRIYW5kbGVGYWxzZVByb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qCisgICAgKiBDYWxscyBoYW5kbGVGYXVsdCBvbiB0aGUgaGFuZGxlcnMuIEluZGljZXMgYXJlCisgICAgKiBpbmNsdXNpdmUuIEV4Y2VwdGlvbnMgZ2V0IHBhc3NlZCB1cCB0aGUgY2hhaW4sIGFuZCBhbgorICAgICogZXhjZXB0aW9uIG9yIHJldHVybiBvZiAnZmFsc2UnIGVuZHMgcHJvY2Vzc2luZy4KKyAgICAqLworCisgICAgcHJpdmF0ZSBib29sZWFuIGNhbGxIYW5kbGVGYXVsdChDIGNvbnRleHQsIGludCBzdGFydCwgaW50IGVuZCkgeworCisgICAgICAgIGlmIChoYW5kbGVycy5pc0VtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICBzdGFydCA9PSAtMSB8fAorICAgICAgICAgICAgICAgIHN0YXJ0ID09IGhhbmRsZXJzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGkgPSBzdGFydDsKKyAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlIChpID49IGVuZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJzLmdldChpKS5oYW5kbGVGYXVsdChjb250ZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gaW4gaGFuZGxlciBjaGFpbiIsIHJlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGkgPD0gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlcnMuZ2V0KGkpLmhhbmRsZUZhdWx0KGNvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbiBpbiBoYW5kbGVyIGNoYWluIiwgcmUpOworICAgICAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIGNsb3NlIG9uIHRoZSBoYW5kbGVycyBmcm9tIHRoZSBzdGFydGluZworICAgICAqIGluZGV4IHRocm91Z2ggdGhlIGVuZGluZyBpbmRleCAoaW5jbHVzaXZlKS4gTWFkZSBpbmRpY2VzCisgICAgICogaW5jbHVzaXZlIHRvIGFsbG93IGJvdGggZGlyZWN0aW9ucyBtb3JlIGVhc2lseS4KKyAgICAgKi8KKyAgICB2b2lkIGNsb3NlSGFuZGxlcnMoTWVzc2FnZUNvbnRleHQgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgIGlmIChoYW5kbGVycy5pc0VtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICBzdGFydCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFydCA+IGVuZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IGVuZDsgaS0tKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZ2V0KGkpLmNsb3NlKGNvbnRleHQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gaWdub3JlZCBkdXJpbmcgY2xvc2UiLCByZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZ2V0KGkpLmNsb3NlKGNvbnRleHQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gaWdub3JlZCBkdXJpbmcgY2xvc2UiLCByZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5ZTI1My4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSGFuZGxlckFubm90YXRpb25JbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSGFuZGxlckFubm90YXRpb25Qcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIDxwPkltcGxlbWVudGF0aW9uIGNsYXNzIG9mIEhhbmRsZXJSZXNvbHZlci4gVGhpcyBjbGFzcyBpcyBhIHNpbXBsZQotICogbWFwIG9mIFBvcnRJbmZvIG9iamVjdHMgdG8gaGFuZGxlciBjaGFpbnMuIEl0IGlzIHVzZWQgYnkgYQotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TZXJ2aWNlQ29udGV4dH0gb2JqZWN0LCBhbmQgY2FuCi0gKiBiZSByZXBsYWNlZCBieSB1c2VyIGNvZGUgd2l0aCBhIGRpZmZlcmVudCBjbGFzcyBpbXBsZW1lbnRpbmcKLSAqIEhhbmRsZXJSZXNvbHZlci4gVGhpcyBjbGFzcyBpcyBvbmx5IHVzZWQgb24gdGhlIGNsaWVudCBzaWRlLCBhbmQKLSAqIGl0IGluY2x1ZGVzIGEgbG90IG9mIGxvZ2dpbmcgdG8gaGVscCB3aGVuIHRoZXJlIGFyZSBpc3N1ZXMgc2luY2UKLSAqIGl0IGRlYWxzIHdpdGggcG9ydCBuYW1lcywgc2VydmljZSBuYW1lcywgYW5kIGJpbmRpbmdzLiBBbGwgdGhyZWUKLSAqIG11c3QgbWF0Y2ggd2hlbiBnZXR0aW5nIGEgaGFuZGxlciBjaGFpbiBmcm9tIHRoZSBtYXAuCi0gKgotICogPHA+SXQgaXMgY3JlYXRlZCBieSB0aGUge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TZXJ2aWNlQ29udGV4dEJ1aWxkZXJ9Ci0gKiBjbGFzcyBhbmQgc2V0IG9uIHRoZSBTZXJ2aWNlQ29udGV4dC4gVGhlIFNlcnZpY2VDb250ZXh0QnVpbGRlciB1c2VzCi0gKiB0aGUge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSGFuZGxlckFubm90YXRpb25Qcm9jZXNzb3J9IHRvIGNyZWF0ZQotICogYSBoYW5kbGVyIGNoYWluIGFuZCB0aGVuIGl0IHNldHMgdGhlIGNoYWlucyBvbiB0aGlzIGNsYXNzIGFuZCB0aGV5Ci0gKiBhcmUgcHV0IGludG8gdGhlIG1hcC4gVGhlIFNlcnZpY2VDb250ZXh0IHVzZXMgdGhlIG1hcCB0byBzZXQgaGFuZGxlcgotICogY2hhaW5zIG9uIGJpbmRpbmdzIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4KLSAqCi0gKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TZXJ2aWNlQ29udGV4dAotICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLlBvcnRJbmZvSW1wbAotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlclJlc29sdmVySW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJSZXNvbHZlciB7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zTW9kZWwgaGFuZGxlck1vZGVsOwotICAgIHByaXZhdGUgTWFwPFBvcnRJbmZvLCBMaXN0PEhhbmRsZXI+PiBjaGFpbk1hcDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKAotICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5oYW5kbGVyIik7Ci0KLSAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVySW1wbChTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCkgewotICAgICAgICB0aGlzLnNlcnZpY2VDb250ZXh0ID0gc2VydmljZUNvbnRleHQ7Ci0gICAgICAgIGhhbmRsZXJNb2RlbCA9IEhhbmRsZXJBbm5vdGF0aW9uUHJvY2Vzc29yLmJ1aWxkSGFuZGxlckNoYWluc01vZGVsKHNlcnZpY2VDb250ZXh0LmdldFNlcnZpY2VDbGFzcygpKTsKLSAgICAgICAgY2hhaW5NYXAgPSBuZXcgSGFzaE1hcDxQb3J0SW5mbywgTGlzdDxIYW5kbGVyPj4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBUEkgbWV0aG9kIHRvIHJldHVybiB0aGUgY29ycmVjdCBoYW5kbGVyIGNoYWluIGZvciBhIGdpdmVuCi0gICAgICogUG9ydEluZm8gY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5mbyBBIFBvcnRJbmZvIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBoYW5kbGVyIG9iamVjdHMuIElmIHRoZXJlIGlzIG5vIGhhbmRsZXIgY2hhaW4KLSAgICAgKiBmb3VuZCwgaXQgd2lsbCByZXR1cm4gYW4gZW1wdHkgbGlzdCByYXRoZXIgdGhhbiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbihQb3J0SW5mbyBpbmZvKSB7Ci0gICAgICAgIC8vQ2hlY2sgaW4gY2FjaGUgZmlyc3QKLSAgICAgICAgTGlzdDxIYW5kbGVyPiBjaGFpbiA9IGNoYWluTWFwLmdldChpbmZvKTsKLQotICAgICAgICBpZihjaGFpbiAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGNoYWluOwotICAgICAgICBpZihoYW5kbGVyTW9kZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgSGFuZGxlckFubm90YXRpb25JbmZvIGNoYWluSW5mbyA9IGhhbmRsZXJNb2RlbC5nZXRIYW5kbGVyc0ZvclBvcnRJbmZvKGluZm8pOwotICAgICAgICAgICAgaWYoY2hhaW5JbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGFpbiA9IGNoYWluSW5mby5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0LnNldFJvbGVzKGluZm8uZ2V0UG9ydE5hbWUoKSxjaGFpbkluZm8uZ2V0Um9sZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYWluID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkgewotICAgICAgICAgICAgICAgIGxvZ0dldENoYWluKGluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhaW4gPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUHV0IGl0IGluIGNhY2hlCi0gICAgICAgIGNoYWluTWFwLnB1dChpbmZvLGNoYWluKTsKLSAgICAgICAgcmV0dXJuIGNoYWluOwotICAgIH0KLQotICAgIC8vIGxvZ2dlZCBhdCBmaW5lIGxldmVsCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ0dldENoYWluKFBvcnRJbmZvIGluZm8pIHsKLSAgICAgICAgbG9nZ2VyLmZpbmUoIk5vIGhhbmRsZXIgY2hhaW4gZm91bmQgZm9yIHBvcnQgaW5mbzoiKTsKLSAgICAgICAgbG9nUG9ydEluZm8oaW5mbywgTGV2ZWwuRklORSk7Ci0gICAgICAgIGxvZ2dlci5maW5lKCJFeGlzdGluZyBoYW5kbGVyIGNoYWluczoiKTsKLSAgICAgICAgaWYgKGNoYWluTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbG9nZ2VyLmZpbmUoIm5vbmUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoUG9ydEluZm8ga2V5IDogY2hhaW5NYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZShjaGFpbk1hcC5nZXQoa2V5KS5zaXplKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGhhbmRsZXJzIGZvciBwb3J0IGluZm8gIik7Ci0gICAgICAgICAgICAgICAgbG9nUG9ydEluZm8oa2V5LCBMZXZlbC5GSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2dQb3J0SW5mbyhQb3J0SW5mbyBpbmZvLCBMZXZlbCBsZXZlbCkgewotICAgICAgICBsb2dnZXIubG9nKGxldmVsLCAiYmluZGluZzogIiArIGluZm8uZ2V0QmluZGluZ0lEKCkgKwotICAgICAgICAgICAgIlxuc2VydmljZTogIiArIGluZm8uZ2V0U2VydmljZU5hbWUoKSArCi0gICAgICAgICAgICAiXG5wb3J0OiAiICsgaW5mby5nZXRQb3J0TmFtZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJUdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0hhbmRsZXJUdWJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjMTllNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvSGFuZGxlclR1YmUuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuKjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgdGVhbQorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBIYW5kbGVyVHViZSBleHRlbmRzIEFic3RyYWN0RmlsdGVyVHViZUltcGwgeworCisgICAgLyoqCisgICAgICogaGFuZGxlIGhvbGQgcmVmZXJlbmNlIHRvIG90aGVyIFR1YmUgZm9yIGludGVyLXR1YmUgY29tbXVuaWNhdGlvbgorICAgICAqLworICAgIEhhbmRsZXJUdWJlIGNvdXNpblR1YmU7CisgICAgSGFuZGxlclByb2Nlc3NvciBwcm9jZXNzb3I7CisgICAgYm9vbGVhbiByZW1lZHlBY3Rpb25UYWtlbiA9IGZhbHNlOworICAgIHByaXZhdGUgZmluYWwgQE51bGxhYmxlIFdTRExQb3J0IHBvcnQ7CisgICAgLy8gZmxhZyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgY2xvc2Ugb24gY291c2luVHViZQorICAgIGJvb2xlYW4gcmVxdWVzdFByb2Nlc3NpbmdTdWNlc3NmdWwgPSBmYWxzZTsKKworICAgIC8vIFRPRE86IEZvciBjbG9zaW5nIGluIEV4Y2VwdGlvbnMgdGhpcyBpcyBuZWVkZWQKKyAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIGNyZWF0aW5nIE1lc3NhZ2VDb250ZXh0IGluICNjbG9zZQorICAgIFBhY2tldCBwYWNrZXQ7CisKKyAgICBwdWJsaWMgSGFuZGxlclR1YmUoVHViZSBuZXh0LCBXU0RMUG9ydCBwb3J0KSB7CisgICAgICAgIHN1cGVyKG5leHQpOworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIHB1YmxpYyBIYW5kbGVyVHViZShUdWJlIG5leHQsIEhhbmRsZXJUdWJlIGNvdXNpblR1YmUpIHsKKyAgICAgICAgc3VwZXIobmV4dCk7CisgICAgICAgIHRoaXMuY291c2luVHViZSA9IGNvdXNpblR1YmU7CisgICAgICAgIGlmKGNvdXNpblR1YmUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5wb3J0ID0gY291c2luVHViZS5wb3J0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5wb3J0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgY29uc3RydWN0b3IgZm9yIHtAbGluayBUdWJlI2NvcHkoVHViZUNsb25lcil9LgorICAgICAqLworICAgIHByb3RlY3RlZCBIYW5kbGVyVHViZShIYW5kbGVyVHViZSB0aGF0LCBUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICBzdXBlcih0aGF0LGNsb25lcik7CisgICAgICAgIGlmKHRoYXQuY291c2luVHViZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvdXNpblR1YmUgPSBjbG9uZXIuY29weSh0aGF0LmNvdXNpblR1YmUpOworICAgICAgICB9CisgICAgICAgIHRoaXMucG9ydCA9IHRoYXQucG9ydDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzUmVxdWVzdChQYWNrZXQgcmVxdWVzdCkgeworICAgICAgICB0aGlzLnBhY2tldCA9IHJlcXVlc3Q7CisgICAgICAgIHNldHVwRXhjaGFuZ2UoKTsKKyAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBkb25lIHRvIGNvdmVyIGhhbmRsZXIgcmV0dXJuaW5nIGZhbHNlIGluIE9uZXdheSByZXF1ZXN0CisgICAgICAgIGlmIChpc0hhbmRsZUZhbHNlKCkpIHsKKyAgICAgICAgICAgIC8vIENvdXNpbiBIYW5kbGVyVHViZSByZXR1cm5lZCBmYWxzZSBkdXJpbmcgT25ld2F5IFJlcXVlc3QgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIC8vIERvbid0IGNhbGwgaGFuZGxlcnMgYW5kIGRpc3BhdGNoIHRoZSBtZXNzYWdlLgorICAgICAgICAgICAgcmVtZWR5QWN0aW9uVGFrZW4gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGRvSW52b2tlKHN1cGVyLm5leHQsIHBhY2tldCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIHRoZSBjb25zdHJ1Y3Rvciwgc2luY2UgVXNlciBjYW4gY2hhbmdlCisgICAgICAgIC8vIHRoZSByb2xlcyBhbmQgaGFuZGxlcmNoYWluIGFmdGVyIGEgc3R1Yi9wcm94eSBpcyBjcmVhdGVkLgorICAgICAgICBzZXRVcFByb2Nlc3NvcigpOworCisgICAgICAgIE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KHBhY2tldCk7CisgICAgICAgIGJvb2xlYW4gaXNPbmVXYXkgPSBjaGVja09uZVdheShwYWNrZXQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFpc0hhbmRsZXJDaGFpbkVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBDYWxsIGhhbmRsZXJzIG9uIFJlcXVlc3QKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhbmRsZXJSZXN1bHQgPSBjYWxsSGFuZGxlcnNPblJlcXVlc3QoY29udGV4dCwgaXNPbmVXYXkpOworICAgICAgICAgICAgICAgIC8vVXBkYXRlIFBhY2tldCB3aXRoIHVzZXIgbW9kaWZpY2F0aW9ucworICAgICAgICAgICAgICAgIGNvbnRleHQudXBkYXRlUGFja2V0KCk7CisgICAgICAgICAgICAgICAgLy8gdHdvLXdheSBjYXNlIHdoZXJlIG5vIG1lc3NhZ2UgaXMgc2VudAorICAgICAgICAgICAgICAgIGlmICghaXNPbmVXYXkgJiYgIWhhbmRsZXJSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvUmV0dXJuV2l0aChwYWNrZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3RQcm9jZXNzaW5nU3VjZXNzZnVsID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIENhbGwgbmV4dCBUdWJlCisgICAgICAgICAgICByZXR1cm4gZG9JbnZva2Uoc3VwZXIubmV4dCwgcGFja2V0KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgaWYoaXNPbmVXYXkpIHsKKyAgICAgICAgICAgICAgICAvL0VhdCB0aGUgZXhjZXB0aW9uLCBpdHMgYWxyZWFkeSBsb2dnZWQgYW5kIGNsb3NlIHRoZSB0cmFuc3BvcnRCYWNrQ2hhbm5lbAorICAgICAgICAgICAgICAgIGlmKHBhY2tldC50cmFuc3BvcnRCYWNrQ2hhbm5lbCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBwYWNrZXQudHJhbnNwb3J0QmFja0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFja2V0LnNldE1lc3NhZ2UobnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvUmV0dXJuV2l0aChwYWNrZXQpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZighcmVxdWVzdFByb2Nlc3NpbmdTdWNlc3NmdWwpIHsKKyAgICAgICAgICAgICAgICBjbGVhblVwU3RhdGUoY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5leHRBY3Rpb24gcHJvY2Vzc1Jlc3BvbnNlKFBhY2tldCByZXNwb25zZSkgeworICAgICAgICB0aGlzLnBhY2tldCA9IHJlc3BvbnNlOworICAgICAgICBNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChwYWNrZXQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzSGFuZGxlRmFsc2UoKSB8fCAocGFja2V0LmdldE1lc3NhZ2UoKSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIC8vIENvdXNpbiBIYW5kbGVyVHViZSByZXR1cm5lZCBmYWxzZSBkdXJpbmcgUmVzcG9uc2UgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAvLyBvciBpdCBpcyBvbmV3YXkgcmVxdWVzdAorICAgICAgICAgICAgICAgIC8vIG9yIGhhbmRsZXIgY2hhaW4gaXMgZW1wdHkKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBjYWxsIGhhbmRsZXJzLgorICAgICAgICAgICAgICAgIHJldHVybiBkb1JldHVybldpdGgocGFja2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IGlzSGFuZGxlRmF1bHQocGFja2V0KTsKKyAgICAgICAgICAgIGlmICghaXNIYW5kbGVyQ2hhaW5FbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FsbCBoYW5kbGVycyBvbiBSZXNwb25zZQorICAgICAgICAgICAgICAgIGNhbGxIYW5kbGVyc09uUmVzcG9uc2UoY29udGV4dCwgaXNGYXVsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbGVhblVwU3RhdGUoY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICAvL1VwZGF0ZSBQYWNrZXQgd2l0aCB1c2VyIG1vZGlmaWNhdGlvbnMKKyAgICAgICAgY29udGV4dC51cGRhdGVQYWNrZXQoKTsKKworICAgICAgICByZXR1cm4gZG9SZXR1cm5XaXRoKHBhY2tldCk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZG9UaHJvdyh0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KHBhY2tldCk7CisgICAgICAgICAgICBjbGVhblVwU3RhdGUoY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpKTsKKyAgICAgICAgICAgIC8qIFRPRE8gcmV2aXNpdDogY29tbWVudGVkIHRoaXMgb3V0IGFzIHRoZSBtb2RpZmllZCBwYWNrZXQgaXMgbm8gbG9uZ2VyIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgSW4gZnV0dXJlIGlmIHRoZSBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgZXZlbiB3aGVuIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICBvY2N1cnMsIHRoZW4gdW5jb21tZW50IGNvbnRleHQudXBkYXRlUGFja2V0KCk7CisgICAgICAgICAgICAqLworICAgICAgICAgICAgLy9VcGRhdGUgUGFja2V0IHdpdGggdXNlciBtb2RpZmljYXRpb25zCisgICAgICAgICAgICAvL2NvbnRleHQudXBkYXRlUGFja2V0KCk7CisKKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbHMgY2xvc2Ugb24gcHJldmlvdXNseSBpbnZva2VkIGhhbmRsZXJzLgorICAgICAqIEFsc28sIENsZWFucyB1cCBhbnkgc3RhdGUgbGVmdCBvdmVyIGluIHRoZSBUdWJlIGluc3RhbmNlIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgKiBpbnZvY2F0aW9uLCBhcyBUdWJlIGluc3RhbmNlcyBjYW4gYmUgcmV1c2VkIGFmdGVyIHRoZSBjb21wbGV0aW9uIG9mIE1FUC4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhblVwU3RhdGUoTWVzc2FnZUNvbnRleHQgbWMpIHsKKyAgICAgICAgY2xvc2UobWMpOworICAgICAgICAvLyBDbGVhbiB1cCB0aGUgZXhjaGFuZ2UgZm9yIG5leHQgaW52b2NhdGlvbi4KKyAgICAgICAgZXhjaGFuZ2UgPSBudWxsOworICAgICAgICByZXF1ZXN0UHJvY2Vzc2luZ1N1Y2Vzc2Z1bCA9IGZhbHNlOworICAgIH0KKworICAgIGFic3RyYWN0IHZvaWQgY2FsbEhhbmRsZXJzT25SZXNwb25zZShNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGhhbmRsZUZhdWx0KTsKKworICAgIGFic3RyYWN0IGJvb2xlYW4gY2FsbEhhbmRsZXJzT25SZXF1ZXN0KE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gb25lV2F5KTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja09uZVdheShQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIGlmIChwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIHdlIGNhbiBkZXRlcm1pbmUgdGhpcyB2YWx1ZSBmcm9tIFdTREwgKi8KKyAgICAgICAgICAgIHJldHVybiBwYWNrZXQuZ2V0TWVzc2FnZSgpLmlzT25lV2F5KHBvcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgb3RoZXJ3aXNlIHVzZSB0aGlzIHZhbHVlIGFzIGFuIGFwcHJveGltYXRpb24sIHNpbmNlIHRoaXMgY2FycmllcworICAgICAgICAgICAgICB0aGUgYXBwbGlhdGlvbidzIGludGVudGlvbiAtLS0gd2hldGhlciBpdCB3YXMgaW52b2tlT25ld2F5IHZzIGludm9rZSxldGMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiAocGFja2V0LmV4cGVjdFJlcGx5ICE9IG51bGwgJiYgcGFja2V0LmV4cGVjdFJlcGx5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFic3RyYWN0IHZvaWQgc2V0VXBQcm9jZXNzb3IoKTsKKyAgICBhYnN0cmFjdCBib29sZWFuIGlzSGFuZGxlckNoYWluRW1wdHkoKTsKKyAgICBhYnN0cmFjdCBNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBnZXRDb250ZXh0KFBhY2tldCBwKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIFNPQVBIYW5kbGVycyBmaXJzdCBhbmQgdGhlbiBMb2dpY2FsSGFuZGxlcnMgb24gQ2xpZW50CisgICAgICogQ2xvc2UgTG9naWNhbEhhbmRsZXJzIGZpcnN0IGFuZCB0aGVuIFNPQVBIYW5kbGVycyBvbiBTZXJ2ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIGZyb20gY291c2luVHViZS4KKyAgICAgKiBDbG9zZSB0aGlzIFR1YmUncyBoYW5kbGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjbG9zZUNhbGwoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNIYW5kbGVGYXVsdChQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIGlmIChjb3VzaW5UdWJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBleGNoYW5nZS5pc0hhbmRsZUZhdWx0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBwYWNrZXQuZ2V0TWVzc2FnZSgpLmlzRmF1bHQoKTsKKyAgICAgICAgICAgIGV4Y2hhbmdlLnNldEhhbmRsZUZhdWx0KGlzRmF1bHQpOworICAgICAgICAgICAgcmV0dXJuIGlzRmF1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIHNldEhhbmRsZUZhdWx0KCkgeworICAgICAgICBleGNoYW5nZS5zZXRIYW5kbGVGYXVsdCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNIYW5kbGVGYWxzZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2hhbmdlLmlzSGFuZGxlRmFsc2UoKTsKKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIHNldEhhbmRsZUZhbHNlKCkgeworICAgICAgICBleGNoYW5nZS5zZXRIYW5kbGVGYWxzZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cEV4Y2hhbmdlKCkgeworICAgICAgICBpZihleGNoYW5nZSA9PSBudWxsKSB7CisgICAgICAgICAgICBleGNoYW5nZSA9IG5ldyBIYW5kbGVyVHViZUV4Y2hhbmdlKCk7CisgICAgICAgICAgICBpZihjb3VzaW5UdWJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb3VzaW5UdWJlLmV4Y2hhbmdlID0gZXhjaGFuZ2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBIYW5kbGVyVHViZUV4Y2hhbmdlIGV4Y2hhbmdlOworCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHByaW1hcmlseSB0byBleGNoYW5nZSBpbmZvcm1hdGlvbiBvciBzdGF0dXMgYmV0d2VlbgorICAgICAqIExvZ2ljYWxIYW5kbGVyVHViZSBhbmQgU09BUEhhbmRsZXJUdWJlCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEhhbmRsZXJUdWJlRXhjaGFuZ2UgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVGYXVsdDsKKworICAgICAgICBib29sZWFuIGlzSGFuZGxlRmF1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlRmF1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldEhhbmRsZUZhdWx0KGJvb2xlYW4gaXNGYXVsdCkgeworICAgICAgICAgICAgdGhpcy5oYW5kbGVGYXVsdCA9IGlzRmF1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0hhbmRsZUZhbHNlKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRIYW5kbGVGYWxzZSgpIHsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFsc2UgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlQ29udGV4dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCmluZGV4IGZiYTc1MzkuLmIxYzg2ZGIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDEwMiArMjQsNzEgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnRTZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyTGlzdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuRW1wdHlNZXNzYWdlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnNvdXJjZS5QYXlsb2FkU291cmNlTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKIAogaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsKIGltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuU2NvcGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgTG9naWNhbE1lc3NhZ2VDb250ZXh0LiBUaGlzIGNsYXNzIGlzIHVzZWQgYXQgcnVudGltZQogICogdG8gcGFzcyB0byB0aGUgaGFuZGxlcnMgZm9yIHByb2Nlc3NpbmcgbG9naWNhbCBtZXNzYWdlcy4KICAqCi0gKiA8cD5DbGFzcyBoYXMgdG8gZGVmZXIgaW5mb3JtYXRpb24gdG8gSGFuZGxlckNvbnRleHQgc28gdGhhdCBwcm9wZXJ0aWVzCi0gKiBhcmUgc2hhcmVkIGJldHdlZW4gdGhpcyBhbmQgU09BUE1lc3NhZ2VDb250ZXh0LgorICogPHA+VGhpcyBDbGFzcyBkZWxlZ2F0ZXMgbW9zdCBvZiB0aGUgZnVjdGlvbmFsaXR5IHRvIFBhY2tldAogICoKLSAqIEBzZWUgTWVzc2FnZUNvbnRleHRJbXBsCisgKiBAc2VlIFBhY2tldAogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbCBpbXBsZW1lbnRzIExvZ2ljYWxNZXNzYWdlQ29udGV4dCB7CitjbGFzcyBMb2dpY2FsTWVzc2FnZUNvbnRleHRJbXBsIGV4dGVuZHMgTWVzc2FnZVVwZGF0YWJsZUNvbnRleHQgaW1wbGVtZW50cyBMb2dpY2FsTWVzc2FnZUNvbnRleHQgeworICAgIHByaXZhdGUgTG9naWNhbE1lc3NhZ2VJbXBsIGxtOworICAgIHByaXZhdGUgV1NCaW5kaW5nIGJpbmRpbmc7CiAKLSAgICBTT0FQSGFuZGxlckNvbnRleHQgaGFuZGxlckN0eHQ7Ci0gICAgTWVzc2FnZUNvbnRleHQgY3R4dDsKLQotICAgIHB1YmxpYyBMb2dpY2FsTWVzc2FnZUNvbnRleHRJbXBsKFNPQVBIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ3R4dCkgewotICAgICAgICB0aGlzLmhhbmRsZXJDdHh0ID0gaGFuZGxlckN0eHQ7Ci0gICAgICAgIGN0eHQgPSBoYW5kbGVyQ3R4dC5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBIYW5kbGVyQ29udGV4dCBnZXRIYW5kbGVyQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDdHh0OworICAgIHB1YmxpYyBMb2dpY2FsTWVzc2FnZUNvbnRleHRJbXBsKFdTQmluZGluZyBiaW5kaW5nLCBQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIHN1cGVyKHBhY2tldCk7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CiAgICAgfQogCiAgICAgcHVibGljIExvZ2ljYWxNZXNzYWdlIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9naWNhbE1lc3NhZ2VJbXBsKGhhbmRsZXJDdHh0KTsKKyAgICAgICAgaWYobG0gPT0gbnVsbCkKKyAgICAgICAgICAgIGxtID0gbmV3IExvZ2ljYWxNZXNzYWdlSW1wbChwYWNrZXQpOworICAgICAgICByZXR1cm4gbG07CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5hbWUsIFNjb3BlIHNjb3BlKSB7Ci0gICAgICAgIGN0eHQuc2V0U2NvcGUobmFtZSwgc2NvcGUpOworICAgIHZvaWQgc2V0UGFja2V0TWVzc2FnZShNZXNzYWdlIG5ld01lc3NhZ2UpeworICAgICAgICBpZihuZXdNZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhY2tldC5zZXRNZXNzYWdlKG5ld01lc3NhZ2UpOworICAgICAgICAgICAgbG0gPSBudWxsOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIFNjb3BlIGdldFNjb3BlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LmdldFNjb3BlKG5hbWUpOwotICAgIH0KIAotICAgIC8qIGphdmEudXRpbC5NYXAgbWV0aG9kcyBiZWxvdyBoZXJlICovCisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWVzc2FnZSgpIHsKKyAgICAgICAgLy9JZiBMb2dpY2FsTWVzc2FnZSBpcyBub3QgYWNjY2Vzc2VkLCBpdHMgbm90IG1vZGlmaWVkLgorICAgICAgICBpZihsbSAhPSBudWxsKSB7CisgICAgICAgICAgICAvL0NoZWNrIGlmIExvZ2ljYWxNZXNzYWdlSW1wbCBoYXMgY2hhbmdlZCwgaWYgc28gY29uc3RydWN0IG5ldyBvbmUKKyAgICAgICAgICAgIC8vVE9ETzogQXR0YWNobWVudHMgYXJlIG5vdCB1c2VkCisgICAgICAgICAgICAvLyBQYWNrZXQgYXJlIGhhbmRsZWQgdGhyb3VnaCBNZXNzYWdlQ29udGV4dAorICAgICAgICAgICAgaWYobG0uaXNQYXlsb2FkTW9kaWZlZCgpKXsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHBhY2tldC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgSGVhZGVyTGlzdCBoZWFkZXJzID0gbXNnLmdldEhlYWRlcnMoKTsKKyAgICAgICAgICAgICAgICBBdHRhY2htZW50U2V0IGF0dGFjaG1lbnRzID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7CisgICAgICAgICAgICAgICAgU291cmNlIG1vZGlmaWVkUGF5bG9hZCA9IGxtLmdldE1vZGlmaWVkUGF5bG9hZCgpOworICAgICAgICAgICAgICAgIGlmKG1vZGlmaWVkUGF5bG9hZCA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0LnNldE1lc3NhZ2UobmV3IEVtcHR5TWVzc2FnZUltcGwoaGVhZGVycyxhdHRhY2htZW50cyxiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYWNrZXQuc2V0TWVzc2FnZShuZXcgUGF5bG9hZFNvdXJjZU1lc3NhZ2UoaGVhZGVycyxtb2RpZmllZFBheWxvYWQsIGF0dGFjaG1lbnRzLCBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsbSA9IG51bGw7CisgICAgICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBjdHh0LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gY3R4dC5jb250YWluc0tleShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gY3R4dC5jb250YWluc1ZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0KCkgewotICAgICAgICByZXR1cm4gY3R4dC5lbnRyeVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuZ2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LmtleVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBzdHIsIE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGN0eHQucHV0KHN0ciwgb2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+IG1hcCkgewotICAgICAgICBjdHh0LnB1dEFsbChtYXApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGN0eHQucmVtb3ZlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gY3R4dC5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiB2YWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LnZhbHVlcygpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9Mb2dpY2FsTWVzc2FnZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTG9naWNhbE1lc3NhZ2VJbXBsLmphdmEKaW5kZXggOGY0MTJkZS4uMGZmMzc0NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9Mb2dpY2FsTWVzc2FnZUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDI2ICsyMiwxNyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7CiAKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCZWFuSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCcmlkZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuUnBjTGl0UGF5bG9hZDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJUeXBlU2VyaWFsaXplcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFUFRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5Cb2R5QmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CkBAIC01MSwxNTkgKzQyLDE0MSBAQAogaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwogCiAvKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIExvZ2ljYWxNZXNzYWdlLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIG1ldGhvZHMKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBMb2dpY2FsTWVzc2FnZX0uIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbWV0aG9kcwogICogdXNlZCBieSBMb2dpY2FsSGFuZGxlcnMgdG8gZ2V0L3NldCB0aGUgcmVxdWVzdCBvciByZXNwb25zZSBlaXRoZXIKICAqIGFzIGEgSkFYQiBvYmplY3Qgb3IgYXMgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UuCiAgKgotICogPHA+VGhlIHtAbGluayBIYW5kbGVyQ29udGV4dH0gdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IKKyAqIDxwPlRoZSB7QGxpbmsgTWVzc2FnZX0gdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IKICAqIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBheWxvYWQgb2YgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2UuCiAgKgotICogQHNlZSBIYW5kbGVyQ29udGV4dAorICogQHNlZSBNZXNzYWdlCiAgKiBAc2VlIExvZ2ljYWxNZXNzYWdlQ29udGV4dEltcGwKICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIExvZ2ljYWxNZXNzYWdlSW1wbCBpbXBsZW1lbnRzIExvZ2ljYWxNZXNzYWdlIHsKKy8qKgorKiBUT0RPOiBUYWtlIGNhcmUgb2YgdmFyaWF0aW9ucyBpbiBiZWhhdmlvciB3cnQgdG8gdmFpb3VzIHNvdXJjZXMuCisqIERPTVNvdXJjZSA6IGNoYW5nZXMgbWFkZSBzaG91bGQgYmUgcmVmbGVjdGVkLCBTdHJlYW1Tb3VyY2Ugb3IgU0FYU291cmNlLCBHaXZlIGNvcHkKKyovCitjbGFzcyBMb2dpY2FsTWVzc2FnZUltcGwgaW1wbGVtZW50cyBMb2dpY2FsTWVzc2FnZSB7CisgICAgcHJpdmF0ZSBQYWNrZXQgcGFja2V0OworICAgIC8vIFRoaXMgaG9sZHMgdGhlIChtb2RpZmllZClwYXlsb2FkIHNldCBieSBVc2VyCisgICAgcHJpdmF0ZSBTb3VyY2UgcGF5bG9hZFNyYyA9IG51bGw7CisgICAgLy8gRmxhZyB0byBjaGVjayBpZiB0aGUgUGF5bG9hZFNyYyBpcyBhY2Nlc3NlZC9tb2RpZmllZAorICAgIHByaXZhdGUgYm9vbGVhbiBwYXlsb2FkTW9kaWZlZCA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBTT0FQSGFuZGxlckNvbnRleHQgY3R4dDsKLQotICAgIHB1YmxpYyBMb2dpY2FsTWVzc2FnZUltcGwoU09BUEhhbmRsZXJDb250ZXh0IGN0eHQpIHsKLSAgICAgICAgdGhpcy5jdHh0ID0gY3R4dDsKKyAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBMb2dpY2FsTWVzc2FnZUltcGxSZWFyY2ggKi8KKyAgICBwdWJsaWMgTG9naWNhbE1lc3NhZ2VJbXBsKFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgLy8gZG9uJ3QgY3JlYXRlIGV4dHJhY3QgcGF5bG9hZCB1bnRpbCBVc2VycyB3YW50cyBpdC4KKyAgICAgICAgdGhpcy5wYWNrZXQgPSBwYWNrZXQ7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgcGF5bG9hZCBpcyBET01Tb3VyY2UsIHJldHVybiBpdAotICAgICAqIElmIHRoZSBwYXlsb2FkIGlzIFNvdXJjZS9TT0FQRmF1bHRJbmZvL0pBWEJCcmlkZ2VJbmZvL0pBWEJCZWFuSW5mbywKLSAgICAgKiBjb252ZXJ0IHRvIERPTVNvdXJjZSBhbmQgcmV0dXJuIGl0LiBET01Tb3VyY2UgaXMgYWxzbyBzdG9yZWQgaW4gQm9keUJsb2NrCi0gICAgICovCisgICAgYm9vbGVhbiBpc1BheWxvYWRNb2RpZmVkKCl7CisgICAgICAgIHJldHVybiBwYXlsb2FkTW9kaWZlZDsKKyAgICB9CisgICAgU291cmNlIGdldE1vZGlmaWVkUGF5bG9hZCgpeworICAgICAgICBpZighcGF5bG9hZE1vZGlmZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGF5bG9hZCBub3QgbW9kaWZpZWQuIik7CisgICAgICAgIHJldHVybiBwYXlsb2FkU3JjOworCisgICAgfQogICAgIHB1YmxpYyBTb3VyY2UgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UgPSBjdHh0LmdldEludGVybmFsTWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBjdHh0LmdldFNPQVBNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBNZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQQm9keSgpLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgZWxlbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBjaGlsZCA9IChOb2RlKWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IChTT0FQRWxlbWVudCljaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTb3VyY2UobmV3IERPTVNvdXJjZShlbGVtKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsTWVzc2FnZSA9IGN0eHQuZ2V0SW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgICAgICBCb2R5QmxvY2sgYm9keUJsb2NrID0gaW50ZXJuYWxNZXNzYWdlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIGlmIChib2R5QmxvY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gYm9keUJsb2NrLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERPTVNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFNvdXJjZSlvYmo7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU291cmNlIHNvdXJjZSA9IChTb3VyY2Upb2JqOwotICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFhtbFV0aWwubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgRE9NUmVzdWx0IGRvbVJlc3VsdCA9IG5ldyBET01SZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgZG9tUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgRE9NU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9tUmVzdWx0LmdldE5vZGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlCbG9jay5zZXRTb3VyY2UoZG9tU291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbVNvdXJjZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEpBWEJCcmlkZ2VJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvID0gY3R4dC5nZXRNZXNzYWdlSW5mbygpOwotICAgICAgICAgICAgICAgICAgICBTT0FQRVBURmFjdG9yeSBlcHRmID0gKFNPQVBFUFRGYWN0b3J5KW1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUEVuY29kZXIgZW5jb2RlciA9IGVwdGYuZ2V0U09BUEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgRE9NU291cmNlIGRvbVNvdXJjZSA9IGVuY29kZXIudG9ET01Tb3VyY2UoKEpBWEJCcmlkZ2VJbmZvKW9iaiwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgICAgICBib2R5QmxvY2suc2V0U291cmNlKGRvbVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb21Tb3VyY2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBKQVhCQmVhbkluZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgRE9NU291cmNlIGRvbVNvdXJjZSA9ICgoSkFYQkJlYW5JbmZvKW9iaikudG9ET01Tb3VyY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9keUJsb2NrLnNldFNvdXJjZShkb21Tb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9tU291cmNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUnBjTGl0UGF5bG9hZCkgewotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbyA9IGN0eHQuZ2V0TWVzc2FnZUluZm8oKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUEVQVEZhY3RvcnkgZXB0ZiA9IChTT0FQRVBURmFjdG9yeSltZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbmNvZGVyIGVuY29kZXIgPSBlcHRmLmdldFNPQVBFbmNvZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIERPTVNvdXJjZSBkb21Tb3VyY2UgPSBlbmNvZGVyLnRvRE9NU291cmNlKChScGNMaXRQYXlsb2FkKW9iaiwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgICAgICBib2R5QmxvY2suc2V0U291cmNlKGRvbVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb21Tb3VyY2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTT0FQRmF1bHRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvID0gY3R4dC5nZXRNZXNzYWdlSW5mbygpOwotICAgICAgICAgICAgICAgICAgICBTT0FQRVBURmFjdG9yeSBlcHRmID0gKFNPQVBFUFRGYWN0b3J5KW1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUEVuY29kZXIgZW5jb2RlciA9IGVwdGYuZ2V0U09BUEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgRE9NU291cmNlIGRvbVNvdXJjZSA9IGVuY29kZXIudG9ET01Tb3VyY2UoKFNPQVBGYXVsdEluZm8pb2JqLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlCbG9jay5zZXRTb3VyY2UoZG9tU291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbVNvdXJjZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiVW5rbm93biB0eXBlICIrb2JqLmdldENsYXNzKCkrIiBpbiBCb2R5QmxvY2siKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKHRlKTsKLSAgICAgICAgfSBjYXRjaChTT0FQRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihzZSk7CisgICAgICAgIGlmKCFwYXlsb2FkTW9kaWZlZCkgeworICAgICAgICAgICAgcGF5bG9hZFNyYyA9IHBhY2tldC5nZXRNZXNzYWdlKCkucmVhZFBheWxvYWRBc1NvdXJjZSgpOworICAgICAgICAgICAgcGF5bG9hZE1vZGlmZWQgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIGlmIChwYXlsb2FkU3JjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYocGF5bG9hZFNyYyBpbnN0YW5jZW9mIERPTVNvdXJjZSl7CisgICAgICAgICAgICByZXR1cm4gcGF5bG9hZFNyYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFhtbFV0aWwubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgICAgICAgIERPTVJlc3VsdCBkb21SZXN1bHQgPSBuZXcgRE9NUmVzdWx0KCk7CisgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0ocGF5bG9hZFNyYywgZG9tUmVzdWx0KTsKKyAgICAgICAgICAgIHBheWxvYWRTcmMgPSBuZXcgRE9NU291cmNlKGRvbVJlc3VsdC5nZXROb2RlKCkpOworICAgICAgICAgICAgcmV0dXJuIHBheWxvYWRTcmM7CisgICAgICAgICAgICB9IGNhdGNoKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24odGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgIFNvdXJjZSBjb3B5U3JjOworICAgICAgICBpZihwYXlsb2FkU3JjIGluc3RhbmNlb2YgRE9NU291cmNlKXsKKyAgICAgICAgICAgIGNvcHlTcmMgPSBwYXlsb2FkU3JjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29weVNyYyA9IGNvcHkocGF5bG9hZFNyYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHlTcmM7CisgICAgICAgICAqLwogICAgIH0KIAotICAgIC8qCi0gICAgICogU2V0cyB0aGUgU291cmNlIGFzIHBheWxvYWQgaW4gdGhlIEJvZHlCbG9jayBvZiBJbnRlcm5hbE1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF5bG9hZChTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIHNldFNvdXJjZShzb3VyY2UpOworICAgIHB1YmxpYyB2b2lkIHNldFBheWxvYWQoU291cmNlIHBheWxvYWQpIHsKKyAgICAgICAgcGF5bG9hZE1vZGlmZWQgPSB0cnVlOworICAgICAgICBwYXlsb2FkU3JjID0gcGF5bG9hZDsKICAgICB9Ci0KICAgICAvKgotICAgICAqIENvbnZlcnRzIHRvIERPTVNvdXJjZSBhbmQga2VlcHMgaXQgaW4gQm9keUJsb2NrLiBUaGVuIGl0IHVubWFyc2hhbGxzIHRoaXMKLSAgICAgKiBET01Tb3VyY2UgdG8gYSBqYXhiIG9iamVjdC4gQW55IGNoYW5nZXMgZG9uZSBpbiBqYXhiIG9iamVjdCBhcmUgbG9zdCBpZgorICAgICAqIENvbnZlcnRzIHRvIERPTVNvdXJjZSBhbmQgdGhlbiBpdCB1bm1hcnNoYWxscyB0aGlzICBET01Tb3VyY2UKKyAgICAgKiB0byBhIGpheGIgb2JqZWN0LiBBbnkgY2hhbmdlcyBkb25lIGluIGpheGIgb2JqZWN0IGFyZSBsb3N0IGlmCiAgICAgICogdGhlIG9iamVjdCBpc24ndCBzZXQgYWdhaW4uCiAgICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXlsb2FkKEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBKQVhCVHlwZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZ2V0UGF5bG9hZCgpLCBqYXhiQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgb2JqZWN0IGlzIG1hcnNoYWxsZWQgaW50byBET01Tb3VyY2UgYW5kIHN0b3JlZCBpbiBCb2R5QmxvY2suIElmIGFuCi0gICAgICogZXJyb3Igb2NjdXJzIHdoZW4gdXNpbmcgdGhlIHN1cHBsaWVkIEpBWEJDb250ZXh0IHRvIG1hcnNoYWxsIHRoZQotICAgICAqIHBheWxvYWQsIGl0IHRocm93cyBhIEpBWFdTRXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBheWxvYWQoT2JqZWN0IGJlYW4sIEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2U7CisgICAgcHVibGljIE9iamVjdCBnZXRQYXlsb2FkKEpBWEJDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvdXJjZSA9IEpBWEJUeXBlU2VyaWFsaXplci5zZXJpYWxpemUoYmVhbixqYXhiQ29udGV4dCk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNvdXJjZSBwYXlsb2FkU3JjID0gZ2V0UGF5bG9hZCgpOworICAgICAgICAgICAgaWYocGF5bG9hZFNyYyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7CisgICAgICAgICAgICByZXR1cm4gdW5tYXJzaGFsbGVyLnVubWFyc2hhbChwYXlsb2FkU3JjKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKXsKICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwogICAgICAgICB9Ci0gICAgICAgIHNldFNvdXJjZShzb3VyY2UpOyAgICAgICAgICAgICAgLy8gc2V0IFNvdXJjZSBpbiBCb2R5QmxvY2sKICAgICB9CiAKLSAgICBwdWJsaWMgSGFuZGxlckNvbnRleHQgZ2V0SGFuZGxlckNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjdHh0OworICAgIHB1YmxpYyB2b2lkIHNldFBheWxvYWQoT2JqZWN0IHBheWxvYWQsIEpBWEJDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcGF5bG9hZE1vZGlmZWQgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgICAgICAgICBtYXJzaGFsbGVyLnNldFByb3BlcnR5KCJqYXhiLmZyYWdtZW50IiwgdHJ1ZSk7CisgICAgICAgICAgICBET01SZXN1bHQgZG9tUmVzdWx0ID0gbmV3IERPTVJlc3VsdCgpOworICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKHBheWxvYWQsIGRvbVJlc3VsdCk7CisgICAgICAgICAgICBwYXlsb2FkU3JjID0gbmV3IERPTVNvdXJjZShkb21SZXN1bHQuZ2V0Tm9kZSgpKTsKKyAgICAgICAgfSBjYXRjaChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CiAgICAgfQotCiAgICAgLyoKLSAgICAgKiBJdCBzdG9yZXMgU291cmNlIGluIHRoZSBCb2R5QmxvY2suIElmIG5lY2Vzc2FyeSwgaXQgY3JlYXRlcwotICAgICAqIEludGVybmFsTWVzc2FnZSwgYW5kIEJvZHlCbG9jawotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTb3VyY2UoU291cmNlIHNvdXJjZSkgewotICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlID0gY3R4dC5nZXRJbnRlcm5hbE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlcm5hbE1lc3NhZ2UgPSBuZXcgSW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgICAgICBjdHh0LnNldEludGVybmFsTWVzc2FnZShpbnRlcm5hbE1lc3NhZ2UpOworICAgIHByaXZhdGUgU291cmNlIGNvcHkoU291cmNlIHNyYykgeworICAgICAgICBpZihzcmMgaW5zdGFuY2VvZiBTdHJlYW1Tb3VyY2UpeworICAgICAgICAgICAgU3RyZWFtU291cmNlIG9yaWdTcmMgPSAoU3RyZWFtU291cmNlKXNyYzsKKyAgICAgICAgICAgIGJ5dGVbXSBwYXlsb2FkYnl0ZXM7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBheWxvYWRieXRlcyA9IEFTQ0lJVXRpbGl0eS5nZXRCeXRlcyhvcmlnU3JjLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBheWxvYWRieXRlcyk7CisgICAgICAgICAgICBvcmlnU3JjLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwYXlsb2FkYnl0ZXMpKTsKKyAgICAgICAgICAgIFN0cmVhbVNvdXJjZSBjb3B5U291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShiaXMsIHNyYy5nZXRTeXN0ZW1JZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBjb3B5U291cmNlOworICAgICAgICB9IGVsc2UgaWYoc3JjIGluc3RhbmNlb2YgU0FYU291cmNlKXsKKyAgICAgICAgICAgIFNBWFNvdXJjZSBzYXhTcmMgPSAoU0FYU291cmNlKXNyYzsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWE1MU3RyZWFtQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJlYW1CdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gc2F4U3JjLmdldFhNTFJlYWRlcigpOworICAgICAgICAgICAgICAgIGlmKHJlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgU0FYQnVmZmVyUHJvY2Vzc29yKCk7CisgICAgICAgICAgICAgICAgc2F4U3JjLnNldFhNTFJlYWRlcihyZWFkZXIpOworICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgU0FYQnVmZmVyQ3JlYXRvcih4c2IpKTsKKyAgICAgICAgICAgICAgICByZWFkZXIucGFyc2Uoc2F4U3JjLmdldElucHV0U291cmNlKCkpOworICAgICAgICAgICAgICAgIHNyYyA9IG5ldyBYTUxTdHJlYW1CdWZmZXJTb3VyY2UoeHNiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhNTFN0cmVhbUJ1ZmZlclNvdXJjZSh4c2IpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBCb2R5QmxvY2sgYm9keUJsb2NrID0gaW50ZXJuYWxNZXNzYWdlLmdldEJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHlCbG9jayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBib2R5QmxvY2sgPSBuZXcgQm9keUJsb2NrKHNvdXJjZSk7Ci0gICAgICAgICAgICBpbnRlcm5hbE1lc3NhZ2Uuc2V0Qm9keShib2R5QmxvY2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9keUJsb2NrLnNldFNvdXJjZShzb3VyY2UpOwotICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJDb3B5IGlzIG5vdCBuZWVkZWQgZm9yIHRoaXMgU291cmNlIik7CiAgICAgfQotCisgICAgICovCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL01lc3NhZ2VDb250ZXh0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9NZXNzYWdlQ29udGV4dEltcGwuamF2YQppbmRleCAxMDAwNmM5Li43ZTdmMjY2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL01lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTWVzc2FnZUNvbnRleHRJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNDQgKzIyLDIwMCBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnRTZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuUmVhZE9ubHlQcm9wZXJ0eUV4Y2VwdGlvbjsKIAoraW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CiBpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuU2NvcGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2VDb250ZXh0LiBUaGlzIGNsYXNzIGhvbGRzIHByb3BlcnRpZXMgYXMKLSAqIHdlbGwgYXMga2VlcGluZyB0cmFjayBvZiB0aGVpciBzY29wZS4KICAqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0SW1wbCBleHRlbmRzIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+Ci0gICAgaW1wbGVtZW50cyBNZXNzYWdlQ29udGV4dCB7CiAKLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTY29wZT4gcHJvcGVydHlTY29wZXMgPQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFNjb3BlPigpOworY2xhc3MgTWVzc2FnZUNvbnRleHRJbXBsIGltcGxlbWVudHMgTWVzc2FnZUNvbnRleHQgeworICAgIHByaXZhdGUgTWFwPFN0cmluZyxPYmplY3Q+IGZhbGxiYWNrTWFwID0gbnVsbDsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGhhbmRsZXJTY29wZVByb3BzOworICAgIFBhY2tldCBwYWNrZXQ7CiAKIAorICAgIHZvaWQgZmFsbGJhY2soKSB7CisgICAgICAgIGlmKGZhbGxiYWNrTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhbGxiYWNrTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4oKTsKKyAgICAgICAgICAgIGZhbGxiYWNrTWFwLnB1dEFsbChwYWNrZXQuY3JlYXRlTWFwVmlldygpKTsKKyAgICAgICAgICAgIGZhbGxiYWNrTWFwLnB1dEFsbChwYWNrZXQuaW52b2NhdGlvblByb3BlcnRpZXMpOworICAgICAgICB9CisgICAgfQorICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIE1lc3NhZ2VDb250ZXh0SW1wbCAqLworICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dEltcGwoUGFja2V0IHBhY2tldCkgeworICAgICAgICB0aGlzLnBhY2tldCA9IHBhY2tldDsKKyAgICAgICAgaGFuZGxlclNjb3BlUHJvcHMgPSAgcGFja2V0LmdldEhhbmRsZXJTY29wZVByb3BlcnR5TmFtZXMoZmFsc2UpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWNrZXQoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigid3JvbmcgY2FsbCIpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBuYW1lLCBTY29wZSBzY29wZSkgewotICAgICAgICBpZiAoIXRoaXMuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgdXNlIG9mIHNldFNjb3BlKCkgb24gIiArCi0gICAgICAgICAgICAgICAgICAgICJub24tZXhpc3RhbnQgcHJvcGVydHkgOiIrIG5hbWUpOworICAgICAgICBpZighY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgbmFtZSArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgIGlmKHNjb3BlID09IFNjb3BlLkFQUExJQ0FUSU9OKSB7CisgICAgICAgICAgICBoYW5kbGVyU2NvcGVQcm9wcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYW5kbGVyU2NvcGVQcm9wcy5hZGQobmFtZSk7CisKICAgICAgICAgfQotICAgICAgICBwcm9wZXJ0eVNjb3Blcy5wdXQobmFtZSwgc2NvcGUpOwogICAgIH0KIAogICAgIHB1YmxpYyBTY29wZSBnZXRTY29wZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoIXRoaXMuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgdXNlIG9mIGdldFNjb3BlKCkgb24gIiArCi0gICAgICAgICAgICAgICAgICAgICJub24tZXhpc3RhbnQgcHJvcGVydHkgOiIrIG5hbWUpOworICAgICAgICBpZighY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgbmFtZSArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgIGlmKGhhbmRsZXJTY29wZVByb3BzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gU2NvcGUuSEFORExFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBTY29wZS5BUFBMSUNBVElPTjsKICAgICAgICAgfQotICAgICAgICBTY29wZSBzY29wZSA9IHByb3BlcnR5U2NvcGVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHNjb3BlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNjb3BlID0gU2NvcGUuSEFORExFUjsgLy8gdGhlIGRlZmF1bHQKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIGZhbGxiYWNrKCk7CisgICAgICAgIHJldHVybiBmYWxsYmFja01hcC5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgZmFsbGJhY2soKTsKKyAgICAgICAgcmV0dXJuIGZhbGxiYWNrTWFwLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgIGlmKGZhbGxiYWNrTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmKHBhY2tldC5zdXBwb3J0cyhrZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHBhY2tldC5pbnZvY2F0aW9uUHJvcGVydGllcy5jb250YWluc0tleShrZXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFsbGJhY2soKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxsYmFja01hcC5jb250YWluc0tleShrZXkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY29wZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBmYWxsYmFjaygpOworICAgICAgICByZXR1cm4gZmFsbGJhY2tNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChmYWxsYmFja01hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocGFja2V0LnN1cHBvcnRzKGtleSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja2V0LnB1dChrZXksIHZhbHVlKTsgICAgIC8vIHN0cm9uZ2x5IHR5cGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBhY2tldC5pbnZvY2F0aW9uUHJvcGVydGllcy5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgLy9OZXcgcHJvcGVydHksIGRlZmF1bHQgdG8gU2NvcGUuSEFORExFUgorICAgICAgICAgICAgICAgIGhhbmRsZXJTY29wZVByb3BzLmFkZChrZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhY2tldC5pbnZvY2F0aW9uUHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhbGxiYWNrKCk7CisgICAgICAgICAgICBpZiAoIWZhbGxiYWNrTWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICAvL25ldyBwcm9wZXJ0eSwgZGVmYXVsdCB0byBTY29wZS5IQU5ETEVSCisgICAgICAgICAgICAgICAgaGFuZGxlclNjb3BlUHJvcHMuYWRkKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2tNYXAucHV0KGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKKyAgICAgICAgaWYoa2V5ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgT2JqZWN0IHZhbHVlOworICAgICAgICBpZihmYWxsYmFja01hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocGFja2V0LnN1cHBvcnRzKGtleSkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICBwYWNrZXQuZ2V0KGtleSk7ICAgIC8vIHN0cm9uZ2x5IHR5cGVkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcGFja2V0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLmdldChrZXkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFsbGJhY2soKTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFsbGJhY2tNYXAuZ2V0KGtleSk7CisgICAgICAgIH0KKyAgICAgICAgLy9hZGQgdGhlIGF0dGFjaG1lbnRzIGZyb20gdGhlIE1lc3NhZ2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBwcm9wZXJ0eQorICAgICAgICBpZihrZXkuZXF1YWxzKE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpIHx8CisgICAgICAgICAgICBrZXkuZXF1YWxzKE1lc3NhZ2VDb250ZXh0LklOQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUykpeworICAgICAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dHMgPSAoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KSB2YWx1ZTsKKyAgICAgICAgICAgIGlmKGF0dHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhdHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4oKTsKKyAgICAgICAgICAgIEF0dGFjaG1lbnRTZXQgYXR0U2V0ID0gcGFja2V0LmdldE1lc3NhZ2UoKS5nZXRBdHRhY2htZW50cygpOworICAgICAgICAgICAgZm9yKEF0dGFjaG1lbnQgYXR0IDogYXR0U2V0KXsKKyAgICAgICAgICAgICAgICBhdHRzLnB1dChhdHQuZ2V0Q29udGVudElkKCksIGF0dC5hc0RhdGFIYW5kbGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGF0dHM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXA8PyBleHRlbmRzIFN0cmluZywgPyBleHRlbmRzIE9iamVjdD4gdCkgeworICAgICAgICBmYWxsYmFjaygpOworICAgICAgICBmb3IoU3RyaW5nIGtleTogdC5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYoIWZhbGxiYWNrTWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICAvL25ldyBwcm9wZXJ0eSwgZGVmYXVsdCB0byBTY29wZS5IQU5ETEVSCisgICAgICAgICAgICAgICAgaGFuZGxlclNjb3BlUHJvcHMuYWRkKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmFsbGJhY2tNYXAucHV0QWxsKHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBmYWxsYmFjaygpOworICAgICAgICBmYWxsYmFja01hcC5jbGVhcigpOworICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KXsKKyAgICAgICAgZmFsbGJhY2soKTsKKyAgICAgICAgaGFuZGxlclNjb3BlUHJvcHMucmVtb3ZlKGtleSk7CisgICAgICAgIHJldHVybiBmYWxsYmFja01hcC5yZW1vdmUoa2V5KTsKKyAgICB9CisgICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldCgpIHsKKyAgICAgICAgZmFsbGJhY2soKTsKKyAgICAgICAgcmV0dXJuIGZhbGxiYWNrTWFwLmtleVNldCgpOworICAgIH0KKyAgICBwdWJsaWMgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0KCl7CisgICAgICAgIGZhbGxiYWNrKCk7CisgICAgICAgIHJldHVybiBmYWxsYmFja01hcC5lbnRyeVNldCgpOworICAgIH0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IHZhbHVlcygpIHsKKyAgICAgICAgZmFsbGJhY2soKTsKKyAgICAgICAgcmV0dXJuIGZhbGxiYWNrTWFwLnZhbHVlcygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmlsbCBhIHtAbGluayBQYWNrZXR9IHdpdGggdmFsdWVzIG9mIHRoaXMge0BsaW5rIE1lc3NhZ2VDb250ZXh0fS4KKyAgICAgKi8KKyAgICB2b2lkIGZpbGwoUGFja2V0IHBhY2tldCkgeworICAgICAgICBpZihmYWxsYmFja01hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGZhbGxiYWNrTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgaWYgKHBhY2tldC5zdXBwb3J0cyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQucHV0KGtleSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLnB1dChrZXksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9SZW1vdmUgcHJvcGVydGllcyB3aGljaCBhcmUgcmVtb3ZlZCBieSB1c2VyLgorICAgICAgICAgICAgcGFja2V0LmNyZWF0ZU1hcFZpZXcoKS5rZXlTZXQoKS5yZXRhaW5BbGwoZmFsbGJhY2tNYXAua2V5U2V0KCkpOworICAgICAgICAgICAgcGFja2V0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLmtleVNldCgpLnJldGFpbkFsbChmYWxsYmFja01hcC5rZXlTZXQoKSk7CisgICAgICAgIH0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTWVzc2FnZUNvbnRleHRVdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL01lc3NhZ2VDb250ZXh0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlmMGU0Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTWVzc2FnZUNvbnRleHRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlcjsKLQotaW1wb3J0IGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cEV4Y2hhbmdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5KQVhXU1Byb3BlcnRpZXM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5BdHRhY2htZW50QmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CeXRlQXJyYXlEYXRhU291cmNlOwotCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNoYWluQ2FsbGVyLklHTk9SRV9GQVVMVF9QUk9QRVJUWTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogVXRpbGl0eSB0byBtYW5pcHVsYXRlIE1lc3NhZ2VDb250ZXh0IHByb3BlcnRpZXMKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0VXRpbCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0SHR0cFN0YXR1c0NvZGUoTWVzc2FnZUNvbnRleHQgY3R4dCkgewotICAgICAgICByZXR1cm4gKEludGVnZXIpY3R4dC5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9DT0RFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SHR0cFN0YXR1c0NvZGUoTWVzc2FnZUNvbnRleHQgY3R4dCwgSW50ZWdlciBjb2RlKSB7Ci0gICAgICAgIGN0eHQucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSwgY29kZSk7Ci0gICAgICAgIGN0eHQuc2V0U2NvcGUoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9DT0RFLCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKE1lc3NhZ2VDb250ZXh0IGN0eHQsIFN0cmluZyBxdWVyeVN0cmluZykgewotICAgICAgICBjdHh0LnB1dChNZXNzYWdlQ29udGV4dC5RVUVSWV9TVFJJTkcsIHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgY3R4dC5zZXRTY29wZShNZXNzYWdlQ29udGV4dC5RVUVSWV9TVFJJTkcsIFNjb3BlLkFQUExJQ0FUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGF0aEluZm8oTWVzc2FnZUNvbnRleHQgY3R4dCwgU3RyaW5nIHBhdGhJbmZvKSB7Ci0gICAgICAgIGN0eHQucHV0KE1lc3NhZ2VDb250ZXh0LlBBVEhfSU5GTywgcGF0aEluZm8pOwotICAgICAgICBjdHh0LnNldFNjb3BlKE1lc3NhZ2VDb250ZXh0LlBBVEhfSU5GTywgU2NvcGUuQVBQTElDQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIdHRwRXhjaGFuZ2UoTWVzc2FnZUNvbnRleHQgY3R4dCwgSHR0cEV4Y2hhbmdlIGV4Y2gpIHsKLSAgICAgICAgY3R4dC5wdXQoSkFYV1NQcm9wZXJ0aWVzLkhUVFBfRVhDSEFOR0UsIGV4Y2gpOwotICAgICAgICBjdHh0LnNldFNjb3BlKEpBWFdTUHJvcGVydGllcy5IVFRQX0VYQ0hBTkdFLCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBIdHRwRXhjaGFuZ2UgZ2V0SHR0cEV4Y2hhbmdlKE1lc3NhZ2VDb250ZXh0IGN0eHQpIHsKLSAgICAgICAgcmV0dXJuIChIdHRwRXhjaGFuZ2UpY3R4dC5nZXQoSkFYV1NQcm9wZXJ0aWVzLkhUVFBfRVhDSEFOR0UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIdHRwUmVxdWVzdE1ldGhvZChNZXNzYWdlQ29udGV4dCBjdHh0LCBTdHJpbmcgbWV0aG9kKSB7Ci0gICAgICAgIGN0eHQucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9NRVRIT0QsIG1ldGhvZCk7Ci0gICAgICAgIGN0eHQuc2V0U2NvcGUoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX01FVEhPRCwgU2NvcGUuQVBQTElDQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIdHRwUmVxdWVzdEhlYWRlcnMoTWVzc2FnZUNvbnRleHQgY3R4dCwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycykgewotICAgICAgICBjdHh0LnB1dChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUywgaGVhZGVycyk7Ci0gICAgICAgIGN0eHQuc2V0U2NvcGUoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX0hFQURFUlMsIFNjb3BlLkFQUExJQ0FUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SHR0cFJlc3BvbnNlSGVhZGVycyhNZXNzYWdlQ29udGV4dCBjdHh0LAotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7Ci0gICAgICAgIGN0eHQucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfSEVBREVSUywgaGVhZGVycyk7Ci0gICAgICAgIGN0eHQuc2V0U2NvcGUoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTLCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldEh0dHBSZXNwb25zZUhlYWRlcnMoTWVzc2FnZUNvbnRleHQgY3R4dCkgewotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4pY3R4dC5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0V3NkbE9wZXJhdGlvbihNZXNzYWdlQ29udGV4dCBjdHh0LCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGN0eHQucHV0KE1lc3NhZ2VDb250ZXh0LldTRExfT1BFUkFUSU9OLCBuYW1lKTsKLSAgICAgICAgY3R4dC5zZXRTY29wZShNZXNzYWdlQ29udGV4dC5XU0RMX09QRVJBVElPTiwgU2NvcGUuQVBQTElDQVRJT04pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBnZXRNZXNzYWdlQXR0YWNobWVudHMoTWVzc2FnZUNvbnRleHQgY3R4dCkgewotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFM7Ci0gICAgICAgIEJvb2xlYW4gb3V0ID0gKEJvb2xlYW4pY3R4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7Ci0gICAgICAgIGlmIChvdXQgIT0gbnVsbCAmJiBvdXQpIHsKLSAgICAgICAgICAgIHByb3BlcnR5ID0gTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUzsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBhdHQgPSBjdHh0LmdldChwcm9wZXJ0eSk7Ci0gICAgICAgIGlmKGF0dCA9PSBudWxsKXsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPigpOwotICAgICAgICAgICAgY3R4dC5wdXQocHJvcGVydHksIGF0dE1hcCk7Ci0gICAgICAgICAgICBjdHh0LnNldFNjb3BlKHByb3BlcnR5LCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgICAgICAgICByZXR1cm4gYXR0TWFwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KWF0dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUluYm91bmRNZXNzYWdlQXR0YWNobWVudHMoTWVzc2FnZUNvbnRleHQgY3R4dCwgSXRlcmF0b3I8QXR0YWNobWVudFBhcnQ+IGF0dGFjaG1lbnRzKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRhY2hNYXAgPSBnZXRNZXNzYWdlQXR0YWNobWVudHMoY3R4dCk7Ci0gICAgICAgIHdoaWxlKGF0dGFjaG1lbnRzLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IGF0dGFjaG1lbnRzLm5leHQoKTsKLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gbmV3IERhdGFIYW5kbGVyKG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKGFwLmdldFJhd0NvbnRlbnRCeXRlcygpLCBhcC5nZXRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgICAgICBhdHRhY2hNYXAucHV0KGFwLmdldENvbnRlbnRJZCgpLCBkaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVzc2FnZUF0dGFjaG1lbnQoTWVzc2FnZUNvbnRleHQgY3R4dCwgU3RyaW5nIGNpZCwgRGF0YUhhbmRsZXIgZGgpewotICAgICAgICBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gYXR0YWNoTWFwID0gZ2V0TWVzc2FnZUF0dGFjaG1lbnRzKGN0eHQpOwotICAgICAgICBhdHRhY2hNYXAucHV0KGNpZCwgZGgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU2VlIEhhbmRsZXJDaGFpbkNhbGxlciBmb3IgZnVsbCBkZXRhaWxzLiBXaGVuIGEgUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgKiBpcyBjYXVnaHQgZnJvbSB0aGUgaGFuZGxlciBjaGFpbiwgdGhpcyBtZXRob2QgaXMgdXNlZCB0byB0ZWxsCi0gICAgICogdGhlIHJ1bnRpbWUgd2hldGhlciB0byB1c2UgdGhlIGZhdWx0IGluIHRoZSBjdXJyZW50IG1lc3NhZ2Ugb3IKLSAgICAgKiB1c2UgdGhlIGV4Y2VwdGlvbiBhbmQgY3JlYXRlIGEgbmV3IG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlnbm9yZUZhdWx0SW5NZXNzYWdlKE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0KElHTk9SRV9GQVVMVF9QUk9QRVJUWSkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoQm9vbGVhbikgY29udGV4dC5nZXQoSUdOT1JFX0ZBVUxUX1BST1BFUlRZKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTWVzc2FnZVVwZGF0YWJsZUNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvTWVzc2FnZVVwZGF0YWJsZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWVhN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9NZXNzYWdlVXBkYXRhYmxlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGNsYXNzIHJlcHJlc2VudHMgYSBNZXNzYWdlQ29udGV4dChQcm9wZXJ0aWVzKSBhbmQgYWxzbyBhbGxvd3MgdGhlIE1lc3NhZ2UgdG8gYmUgbW9kaWZpZWQuCisgKiBUaGlzIGlzIGV4dGVuZGVkIGJ5IFNPQVBNZXNzYWdlQ29udGV4dEltcGwgYW5kIExvZ2ljYWxNZXNzYWdlQ29udGV4dEltcGwuCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBpbXBsZW1lbnRzIE1lc3NhZ2VDb250ZXh0IHsKKyAgICBmaW5hbCBQYWNrZXQgcGFja2V0OworICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHRJbXBsIGN0eHQ7CisgICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTWVzc2FnZVVwZGF0YWJsZUNvbnRleHQgKi8KKyAgICBwdWJsaWMgTWVzc2FnZVVwZGF0YWJsZUNvbnRleHQoUGFja2V0IHBhY2tldCkgeworICAgICAgICBjdHh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0SW1wbChwYWNrZXQpOworICAgICAgICB0aGlzLnBhY2tldCA9IHBhY2tldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxsIGEge0BsaW5rIFBhY2tldH0gd2l0aCB2YWx1ZXMgb2YgdGhpcyB7QGxpbmsgTWVzc2FnZUNvbnRleHR9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaWxsKFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgY3R4dC5maWxsKHBhY2tldCk7CisgICAgfQorICAgIC8qKgorICAgICAqIFVwZGF0ZXMgTWVzc2FnZSBpbiB0aGUgcGFja2V0IHdpdGggdXNlciBtb2RpZmljYXRpb25zCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCB1cGRhdGVNZXNzYWdlKCk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIE1lc3NhZ2UgaW4gdGhlIHBhY2tldCB3aXRoIHVzZXIgbW9kaWZpY2F0aW9ucworICAgICAqIHJldHVybnMgdGhlIG5ldyBwYWNrZXQncyBtZXNzYWdlCisgICAgICovCisgICAgTWVzc2FnZSBnZXRQYWNrZXRNZXNzYWdlKCl7CisgICAgICAgIHVwZGF0ZU1lc3NhZ2UoKTsKKyAgICAgICAgcmV0dXJuIHBhY2tldC5nZXRNZXNzYWdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBNZXNzYWdlIGluIHRoZSBwYWNrZXQKKyAgICAgKiBBbnkgdXNlciBtb2RpZmljYXRpb25zIGRvbmUgb24gcHJldmlvdXMgTWVzc2FnZSBhcmUgbG9zdC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIHNldFBhY2tldE1lc3NhZ2UoTWVzc2FnZSBuZXdNZXNzYWdlKTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIGNvbXBsZXRlIHBhY2tldCB3aXRoIHVzZXIgbW9kZmljYXRpb25zIHRvIHRoZSBtZXNzYWdlIGFuZAorICAgICAqIHByb3BlcnRpZXMgY2FobmdlcyBpbiBNZXNzYWdlQ29udGV4dAorICAgICAqLworICAgIGZpbmFsIHZvaWQgdXBkYXRlUGFja2V0KCkgeworICAgICAgICB1cGRhdGVNZXNzYWdlKCk7CisgICAgICAgIGZpbGwocGFja2V0KTsKKyAgICB9CisKKyAgICBNZXNzYWdlQ29udGV4dEltcGwgZ2V0TWVzc2FnZUNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjdHh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBuYW1lLCBTY29wZSBzY29wZSkgeworICAgICAgICBjdHh0LnNldFNjb3BlKG5hbWUsIHNjb3BlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NvcGUgZ2V0U2NvcGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGN0eHQuZ2V0U2NvcGUobmFtZSk7CisgICAgfQorCisgICAgLyogamF2YS51dGlsLk1hcCBtZXRob2RzIGJlbG93IGhlcmUgKi8KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBjdHh0LmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gY3R4dC5jb250YWluc0tleShvYmopOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gY3R4dC5jb250YWluc1ZhbHVlKG9iaik7CisgICAgfQorCisgICAgcHVibGljIFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0KCkgeworICAgICAgICByZXR1cm4gY3R4dC5lbnRyeVNldCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBvYmopIHsKKyAgICAgICAgcmV0dXJuIGN0eHQuZ2V0KG9iaik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGN0eHQuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7CisgICAgICAgIHJldHVybiBjdHh0LmtleVNldCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBzdHIsIE9iamVjdCBvYmopIHsKKyAgICAgICAgcmV0dXJuIGN0eHQucHV0KHN0ciwgb2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+IG1hcCkgeworICAgICAgICBjdHh0LnB1dEFsbChtYXApOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBvYmopIHsKKyAgICAgICAgcmV0dXJuIGN0eHQucmVtb3ZlKG9iaik7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gY3R4dC5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiB2YWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBjdHh0LnZhbHVlcygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9Qb3J0SW5mb0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvUG9ydEluZm9JbXBsLmphdmEKaW5kZXggZWI0Y2JiNy4uNGJmMDQyMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9Qb3J0SW5mb0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1BvcnRJbmZvSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDYgKzI0LDkgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwogCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuV1NTZXJ2aWNlRGVsZWdhdGU7CisKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOwogCkBAIC0zNCwyMSArMzcsMjAgQEAKICAqIGlzIG9ubHkgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUuCiAgKgogICogPHA+QW4gaW5zdGFuY2UgaXMgY3JlYXRlZCBieQotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TZXJ2aWNlQ29udGV4dEJ1aWxkZXJ9IHdoZW4gdXNlZCB0bworICoge0BsaW5rIFdTU2VydmljZURlbGVnYXRlfSB3aGVuIHVzZWQgdG8KICAqIHBsYWNlIGEgaGFuZGxlciBjaGFpbiBpbnRvIHRoZSBIYW5kbGVyUmVzb2x2ZXIgbWFwLiBBbm90aGVyIGlzCiAgKiBjcmVhdGVkIGxhdGVyIGJ5CiAgKiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LldTU2VydmljZURlbGVnYXRlfSB0byByZXRyaWV2ZSB0aGUKICAqIG5lY2Vzc2FyeSBoYW5kbGVyIGNoYWluIHRvIHNldCBvbiBhIGJpbmRpbmcgaW5zdGFuY2UuCiAgKgotICogQHNlZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuU2VydmljZUNvbnRleHRCdWlsZGVyCi0gKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZQotICogQHNlZSBIYW5kbGVyUmVzb2x2ZXJJbXBsCisgKiBAc2VlIFdTU2VydmljZURlbGVnYXRlCisgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5IYW5kbGVyUmVzb2x2ZXJJbXBsCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KIHB1YmxpYyBjbGFzcyBQb3J0SW5mb0ltcGwgaW1wbGVtZW50cyBQb3J0SW5mbyB7CiAKLSAgICBwcml2YXRlIFN0cmluZyBiaW5kaW5nSWQ7CisgICAgcHJpdmF0ZSBCaW5kaW5nSUQgYmluZGluZ0lkOwogICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWU7CiAgICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZTsKIApAQCAtNjAsNyArNjIsNyBAQAogICAgICAqIEBwYXJhbSBwb3J0TmFtZSBUaGUgUU5hbWUgb2YgdGhlIHBvcnQuCiAgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBRTmFtZSBvZiB0aGUgc2VydmljZS4KICAgICAgKi8KLSAgICBwdWJsaWMgUG9ydEluZm9JbXBsKFN0cmluZyBiaW5kaW5nSWQsIFFOYW1lIHBvcnROYW1lLCBRTmFtZSBzZXJ2aWNlTmFtZSkgeworICAgIHB1YmxpYyBQb3J0SW5mb0ltcGwoQmluZGluZ0lEIGJpbmRpbmdJZCwgUU5hbWUgcG9ydE5hbWUsIFFOYW1lIHNlcnZpY2VOYW1lKSB7CiAgICAgICAgIGlmIChiaW5kaW5nSWQgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImJpbmRpbmdJZCBjYW5ub3QgYmUgbnVsbCIpOwogICAgICAgICB9CkBAIC03Niw3ICs3OCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSUQoKSB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nSWQ7CisgICAgICAgIHJldHVybiBiaW5kaW5nSWQudG9TdHJpbmcoKTsKICAgICB9CiAKICAgICBwdWJsaWMgUU5hbWUgZ2V0UG9ydE5hbWUoKSB7CkBAIC0xMDAsNyArMTAyLDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUG9ydEluZm8pIHsKICAgICAgICAgICAgIFBvcnRJbmZvIGluZm8gPSAoUG9ydEluZm8pIG9iajsKLSAgICAgICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKGluZm8uZ2V0QmluZGluZ0lEKCkpICYmCisgICAgICAgICAgICBpZiAoYmluZGluZ0lkLnRvU3RyaW5nKCkuZXF1YWxzKGluZm8uZ2V0QmluZGluZ0lEKCkpICYmCiAgICAgICAgICAgICAgICAgcG9ydE5hbWUuZXF1YWxzKGluZm8uZ2V0UG9ydE5hbWUoKSkgJiYKICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZS5lcXVhbHMoaW5mby5nZXRTZXJ2aWNlTmFtZSgpKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9TSERTT0FQTWVzc2FnZUNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU0hEU09BUE1lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNmE4ZjAuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9TSERTT0FQTWVzc2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUEVQVEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5JbnRlcm5hbFNvYXBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLkludm9rZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5NZXNzYWdlSW5mb1V0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgU09BUE1lc3NhZ2VDb250ZXh0LiBUaGlzIGNsYXNzIGlzIHVzZWQgYXQgcnVudGltZQotICogdG8gcGFzcyB0byB0aGUgaGFuZGxlcnMgZm9yIHByb2Nlc3Npbmcgc29hcCBtZXNzYWdlcy4KLSAqCi0gKiBAc2VlIE1lc3NhZ2VDb250ZXh0SW1wbAotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgU0hEU09BUE1lc3NhZ2VDb250ZXh0IGV4dGVuZHMgU09BUE1lc3NhZ2VDb250ZXh0SW1wbCBpbXBsZW1lbnRzIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLlNPQVBNZXNzYWdlQ29udGV4dCB7Ci0KLSAgICBTT0FQSGFuZGxlckNvbnRleHQgaGFuZGxlckN0eHQ7Ci0KLSAgICBwdWJsaWMgU0hEU09BUE1lc3NhZ2VDb250ZXh0KFNPQVBIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ3R4dCkgewotICAgICAgICBzdXBlcihoYW5kbGVyQ3R4dCk7Ci0gICAgICAgIHRoaXMuaGFuZGxlckN0eHQgPSBoYW5kbGVyQ3R4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGVyZSBpcyBhIFNPQVBNZXNzYWdlIGFscmVhZHksIHVzZSBnZXRTT0FQTWVzc2FnZSgpLiBJZ25vcmUgYWxsIG90aGVyCi0gICAgICogbWV0aG9kcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWxyZWFkeVNvYXAoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ3R4dC5nZXRTT0FQTWVzc2FnZSgpICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIEludGVybmFsTWVzc2FnZSdzIEJvZHlCbG9jayB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Qm9keSgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDdHh0LmdldEJvZHkoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgSW50ZXJuYWxNZXNzYWdlJ3MgSGVhZGVyQmxvY2sgdmFsdWVzCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0SGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDdHh0LmdldEhlYWRlcnMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFVzZSB0aGlzIE1lc3NhZ2VJbmZvIHRvIHBhc3MgdG8gSW50ZXJuYWxTb2FwRW5jb2RlciB3cml0ZSBtZXRob2RzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXNzYWdlSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDdHh0LmdldE1lc3NhZ2VJbmZvKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFbmNvZGVyIHRvIG1hcnNoYWxsIGFsbCBKQVhXUyBvYmplY3RzOiBScGNMaXRQYXlsb2FkLCBKQVhCQnJpZGdlSW5mbyBldGMKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZXJuYWxTb2FwRW5jb2RlciBnZXRFbmNvZGVyKCkgewotICAgICAgICByZXR1cm4gKEludGVybmFsU29hcEVuY29kZXIpKChTT0FQRVBURmFjdG9yeSloYW5kbGVyQ3R4dC5nZXRNZXNzYWdlSW5mbygpLmdldEVQVEZhY3RvcnkoKSkuZ2V0U09BUEVuY29kZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdJZCgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDdHh0LmdldEJpbmRpbmdJZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckN0eHQuZ2V0TWV0aG9kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2Fub25pY2FsaXphdGlvbihTdHJpbmcgYWxnb3JpdGhtKSB7Ci0gICAgICAgIGhhbmRsZXJDdHh0LnNldENhbm9uaWNhbGl6YXRpb24oYWxnb3JpdGhtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2tlciBnZXRJbnZva2VyKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckN0eHQuZ2V0SW52b2tlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgTVRPTSBpcyBhbmJsZWQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBNVE9NIGlzIGVuYWJsZWQgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2U7Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdG9tRW5hYmxlZCgpIHsKLSAgICAgICAgSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlciBhbSA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRBdHRhY2htZW50TWFyc2hhbGxlcihoYW5kbGVyQ3R4dC5nZXRNZXNzYWdlSW5mbygpKTsKLSAgICAgICAgcmV0dXJuIChhbSAhPSBudWxsKT9hbS5pc1hPUFBhY2thZ2UoKTpmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU09BUEhhbmRsZXJDb250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1NPQVBIYW5kbGVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjNjZDJkLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU09BUEhhbmRsZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLkludm9rZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEhhbmRsZXJDb250ZXh0IGlzIHVzZWQgaW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIHJ1bnRpbWUKLSAqIGluIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC5zb2FwLmNsaWVudC5TT0FQTWVzc2FnZURpc3BhdGNoZXJ9IGFuZAotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuc2VydmVyLlNPQVBNZXNzYWdlRGlzcGF0Y2hlcn0gdG8gaG9sZAotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbWVzc2FnZS4KLSAqCi0gKiA8cD5JdCBzdG9yZXMgYSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm99IGFuZAotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlfQotICogd2hpY2ggYXJlIHVzZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHJ1bnRpbWUsIGFuZCBwcm92aWRlcyBhIGJyaWRnZQotICogYmV0d2VlbiB0aGVzZSBhbmQgdGhlIHNvYXAgYW5kIGxvZ2ljYWwgbWVzc2FnZSBjb250ZXh0cyB0aGF0Ci0gKiBhcmUgdXNlZCBieSB0aGUgaGFuZGxlcnMuCi0gKgotICogQHNlZSBMb2dpY2FsTWVzc2FnZUNvbnRleHRJbXBsCi0gKiBAc2VlIE1lc3NhZ2VDb250ZXh0SW1wbAotICogQHNlZSBTT0FQTWVzc2FnZUNvbnRleHRJbXBsCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGFuZGxlckNvbnRleHQgZXh0ZW5kcyBIYW5kbGVyQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlOwotICAgIHByaXZhdGUgU09BUE1lc3NhZ2VDb250ZXh0IHNvYXBDb250ZXh0OwotICAgIHByaXZhdGUgU0hEU09BUE1lc3NhZ2VDb250ZXh0IHNoZHNvYXBDb250ZXh0OwotICAgIHByaXZhdGUgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGxvZ2ljYWxDb250ZXh0OwotCi0gICAgcHVibGljIFNPQVBIYW5kbGVyQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywKLSAgICAgICAgICAgIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UsCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlSW5mbywgaW50ZXJuYWxNZXNzYWdlKTsKLSAgICAgICAgdGhpcy5zb2FwTWVzc2FnZSA9IHNvYXBNZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZUNvbnRleHQgZ2V0U09BUE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICBpZiAoc29hcENvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgc29hcENvbnRleHQgPSBuZXcgU09BUE1lc3NhZ2VDb250ZXh0SW1wbCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNIRFNPQVBNZXNzYWdlQ29udGV4dCBnZXRTSERTT0FQTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIGlmIChzaGRzb2FwQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzaGRzb2FwQ29udGV4dCA9IG5ldyBTSERTT0FQTWVzc2FnZUNvbnRleHQodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNoZHNvYXBDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBMb2dpY2FsTWVzc2FnZUNvbnRleHQgZ2V0TG9naWNhbE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICBpZiAobG9naWNhbENvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9naWNhbENvbnRleHQgPSBuZXcgTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbG9naWNhbENvbnRleHQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNvYXBNZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBnZXRTT0FQTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBNZXNzYWdlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNvYXBNZXNzYWdlIFRoZSBzb2FwTWVzc2FnZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U09BUE1lc3NhZ2UoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5zb2FwTWVzc2FnZSA9IHNvYXBNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZXJlIGlzIGEgU09BUE1lc3NhZ2UgYWxyZWFkeSwgdXNlIGdldFNPQVBNZXNzYWdlKCkuIElnbm9yZSBhbGwgb3RoZXIKLSAgICAgKiBtZXRob2RzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbHJlYWR5U29hcCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNPQVBNZXNzYWdlKCkgIT0gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU09BUEhhbmRsZXJQcm9jZXNzb3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU09BUEhhbmRsZXJQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQxMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9TT0FQSGFuZGxlclByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBTT0FQSGFuZGxlclByb2Nlc3Nvci5qYXZhCisgKgorICogQ3JlYXRlZCBvbiBGZWJydWFyeSA4LCAyMDA2LCA1OjQzIFBNCisgKgorICoKKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUDEyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUENvbnN0YW50czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOworCisvKioKKyAqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworZmluYWwgY2xhc3MgU09BUEhhbmRsZXJQcm9jZXNzb3I8QyBleHRlbmRzIE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0PiBleHRlbmRzIEhhbmRsZXJQcm9jZXNzb3I8Qz4geworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBTT0FQSGFuZGxlclByb2Nlc3NvcgorICAgICAqLworICAgIHB1YmxpYyBTT0FQSGFuZGxlclByb2Nlc3Nvcihib29sZWFuIGlzQ2xpZW50LCBIYW5kbGVyVHViZSBvd25lciwgV1NCaW5kaW5nIGJpbmRpbmcsIExpc3Q8PyBleHRlbmRzIEhhbmRsZXI+IGNoYWluKSB7CisgICAgICAgIHN1cGVyKG93bmVyLCBiaW5kaW5nLCBjaGFpbik7CisgICAgICAgIHRoaXMuaXNDbGllbnQgPSBpc0NsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHRoZSBtZXNzYWdlIGluIHRoZSBnaXZlbiBtZXNzYWdlIGNvbnRleHQgd2l0aCBhCisgICAgICogZmF1bHQgbWVzc2FnZS4gSWYgdGhlIGNvbnRleHQgYWxyZWFkeSBjb250YWlucyBhIGZhdWx0CisgICAgICogbWVzc2FnZSwgdGhlbiByZXR1cm4gd2l0aG91dCBjaGFuZ2luZyBpdC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgYSByZXF1ZXN0LAorICAgICAqIGJlY2F1c2UgZHVyaW5nIGEgcmVzcG9uc2UgYW4gZXhjZXB0aW9uIGZyb20gYSBoYW5kbGVyCisgICAgICogaXMgZGlzcGF0Y2hlZCByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlIG1lc3NhZ2Ugd2l0aAorICAgICAqIGEgZmF1bHQuIFNvIHRoaXMgbWV0aG9kIGNhbiB1c2UgdGhlIE1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkKKyAgICAgKiB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBiZWluZyBjYWxsZWQgb24gdGhlIGNsaWVudAorICAgICAqIG9yIHRoZSBzZXJ2ZXIgc2lkZS4gSWYgdGhpcyBjaGFuZ2VzIGluIHRoZSBzcGVjLCB0aGVuCisgICAgICogc29tZXRoaW5nIGVsc2Ugd2lsbCBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kCisgICAgICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZhdWx0IGNvZGUgaXMgY2xpZW50IG9yIHNlcnZlci4KKyAgICAgKi8KKyAgICBmaW5hbCB2b2lkIGluc2VydEZhdWx0TWVzc2FnZShDIGNvbnRleHQsCisgICAgICAgIFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYoIWNvbnRleHQuZ2V0UGFja2V0TWVzc2FnZSgpLmlzRmF1bHQoKSkgeworICAgICAgICAgICAgICAgIE1lc3NhZ2UgZmF1bHRNZXNzYWdlID0gTWVzc2FnZXMuY3JlYXRlKGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbixkZXRlcm1pbmVGYXVsdENvZGUoYmluZGluZy5nZXRTT0FQVmVyc2lvbigpKSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRQYWNrZXRNZXNzYWdlKGZhdWx0TWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBzZXZlcmUgc2luY2UgdGhpcyBpcyBmcm9tIHJ1bnRpbWUgYW5kIG5vdCBoYW5kbGVyCisgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIGZhdWx0IG1lc3NhZ2UgaW4gaGFuZGxlciBjaGFpbiIsIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5GaWd1cmUgb3V0IGlmIHRoZSBmYXVsdCBjb2RlIGxvY2FsIHBhcnQgaXMgY2xpZW50LAorICAgICAqIHNlcnZlciwgc2VuZGVyLCByZWNlaXZlciwgZXRjLiBUaGlzIGlzIGNhbGxlZCBieQorICAgICAqIGluc2VydEZhdWx0TWVzc2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFFOYW1lIGRldGVybWluZUZhdWx0Q29kZShTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICByZXR1cm4gaXNDbGllbnQgPyBzb2FwVmVyc2lvbi5mYXVsdENvZGVDbGllbnQgOiBzb2FwVmVyc2lvbi5mYXVsdENvZGVTZXJ2ZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1NPQVBNZXNzYWdlQ29udGV4dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU09BUE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCmluZGV4IDQ0Yzk5OTYuLjVjZWIwN2EgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU09BUE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU09BUE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDExOCArMjMsOTYgQEAKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQkJlYW5JbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuSkFYQlR5cGVTZXJpYWxpemVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUEVQVEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc2Fhai5TQUFKTWVzc2FnZTsKIAogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247CiBpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwogaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwogaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KIC8qKgotICogSW1wbGVtZW50YXRpb24gb2YgU09BUE1lc3NhZ2VDb250ZXh0LiBUaGlzIGNsYXNzIGlzIHVzZWQgYXQgcnVudGltZQorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFNPQVBNZXNzYWdlQ29udGV4dH0uIFRoaXMgY2xhc3MgaXMgdXNlZCBhdCBydW50aW1lCiAgKiB0byBwYXNzIHRvIHRoZSBoYW5kbGVycyBmb3IgcHJvY2Vzc2luZyBzb2FwIG1lc3NhZ2VzLgogICoKICAqIEBzZWUgTWVzc2FnZUNvbnRleHRJbXBsCiAgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUNvbnRleHRJbXBsIGltcGxlbWVudHMgU09BUE1lc3NhZ2VDb250ZXh0IHsKK2NsYXNzIFNPQVBNZXNzYWdlQ29udGV4dEltcGwgZXh0ZW5kcyBNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBpbXBsZW1lbnRzIFNPQVBNZXNzYWdlQ29udGV4dCB7CiAKLSAgICBwcml2YXRlIFNPQVBIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ3R4dDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IGN0eHQ7CiAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiByb2xlczsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDbGFzcz4gYWxsb3dlZFR5cGVzID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmFpbHVyZTsKKyAgICBwcml2YXRlIFNPQVBNZXNzYWdlIHNvYXBNc2cgPSBudWxsOworICAgIHByaXZhdGUgV1NCaW5kaW5nIGJpbmRpbmc7CiAKLSAgICBwdWJsaWMgU09BUE1lc3NhZ2VDb250ZXh0SW1wbChTT0FQSGFuZGxlckNvbnRleHQgaGFuZGxlckN0eHQpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyQ3R4dCA9IGhhbmRsZXJDdHh0OwotICAgICAgICB0aGlzLmN0eHQgPSBoYW5kbGVyQ3R4dC5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBpZiAoYWxsb3dlZFR5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGFsbG93ZWRUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0gICAgICAgICAgICBhbGxvd2VkVHlwZXMucHV0KE1lc3NhZ2VDb250ZXh0LklOQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUywgTWFwLmNsYXNzKTsKLSAgICAgICAgICAgIGFsbG93ZWRUeXBlcy5wdXQoTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUywgTWFwLmNsYXNzKTsKLSAgICAgICAgICAgIGFsbG93ZWRUeXBlcy5wdXQoTWVzc2FnZUNvbnRleHQuV1NETF9ERVNDUklQVElPTiwgSW5wdXRTb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgYWxsb3dlZFR5cGVzLnB1dChNZXNzYWdlQ29udGV4dC5XU0RMX1NFUlZJQ0UsIFFOYW1lLmNsYXNzKTsKLSAgICAgICAgICAgIGFsbG93ZWRUeXBlcy5wdXQoTWVzc2FnZUNvbnRleHQuV1NETF9QT1JULCBRTmFtZS5jbGFzcyk7Ci0gICAgICAgICAgICBhbGxvd2VkVHlwZXMucHV0KE1lc3NhZ2VDb250ZXh0LldTRExfSU5URVJGQUNFLCBRTmFtZS5jbGFzcyk7Ci0gICAgICAgICAgICBhbGxvd2VkVHlwZXMucHV0KE1lc3NhZ2VDb250ZXh0LldTRExfT1BFUkFUSU9OLCBRTmFtZS5jbGFzcyk7Ci0gICAgICAgICAgICBhbGxvd2VkVHlwZXMucHV0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksIEJvb2xlYW4uY2xhc3MpOwotICAgICAgICB9CisgICAgcHVibGljIFNPQVBNZXNzYWdlQ29udGV4dEltcGwoV1NCaW5kaW5nIGJpbmRpbmcsIFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgc3VwZXIocGFja2V0KTsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKICAgICB9CiAKICAgICBwdWJsaWMgU09BUE1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgU09BUE1lc3NhZ2Ugc29hcCA9IGhhbmRsZXJDdHh0LmdldFNPQVBNZXNzYWdlKCk7Ci0gICAgICAgIEludGVybmFsTWVzc2FnZSBpbnRyID0gaGFuZGxlckN0eHQuZ2V0SW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChpbnRyID09IG51bGwgJiYgc29hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBOb3QgbXVjaCB0byBkbwotICAgICAgICB9IGVsc2UgaWYgKGludHIgIT0gbnVsbCAmJiBzb2FwICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE92ZXJsYXkgQm9keUJsb2NrIG9mIEludGVybmFsTWVzc2FnZSBvbiB0b3Agb2YgZXhpc3RpbmcgU09BUE1lc3NhZ2UKLSAgICAgICAgICAgIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvID0gaGFuZGxlckN0eHQuZ2V0TWVzc2FnZUluZm8oKTsKLSAgICAgICAgICAgIFNPQVBFUFRGYWN0b3J5IGVwdGYgPSAoU09BUEVQVEZhY3RvcnkpbWVzc2FnZUluZm8uZ2V0RVBURmFjdG9yeSgpOwotICAgICAgICAgICAgc29hcCA9IGVwdGYuZ2V0U09BUEVuY29kZXIoKS50b1NPQVBNZXNzYWdlKGludHIsIHNvYXApOwotICAgICAgICAgICAgc2V0TWVzc2FnZShzb2FwKTsgICAgICAgIC8vIEl0IGFsc28gc2V0cyBJbmVybmFsTWVzc2FnZSB0byBudWxsCi0gICAgICAgIH0gZWxzZSBpZiAoaW50ciAhPSBudWxsICYmIHNvYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ29udmVydCBJbnRlcm5hbE1lc3NhZ2UgdG8gYSBTT0FQTWVzc2FnZQotICAgICAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8gPSBoYW5kbGVyQ3R4dC5nZXRNZXNzYWdlSW5mbygpOwotICAgICAgICAgICAgU09BUEVQVEZhY3RvcnkgZXB0ZiA9IChTT0FQRVBURmFjdG9yeSltZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCk7Ci0gICAgICAgICAgICBzb2FwID0gZXB0Zi5nZXRTT0FQRW5jb2RlcigpLnRvU09BUE1lc3NhZ2UoaW50ciwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgc2V0TWVzc2FnZShzb2FwKTsgICAgICAgIC8vIEl0IGFsc28gc2V0cyBJbmVybmFsTWVzc2FnZSB0byBudWxsCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRG9uJ3QgaGF2ZSBTT0FQTWVzc2FnZSIpOworICAgICAgICBpZihzb2FwTXNnID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc29hcE1zZyA9IHBhY2tldC5nZXRNZXNzYWdlKCkucmVhZEFzU09BUE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwOworICAgICAgICByZXR1cm4gc29hcE1zZzsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlKSB7Ci0gICAgICAgIGhhbmRsZXJDdHh0LnNldFNPQVBNZXNzYWdlKHNvYXBNZXNzYWdlKTsKLSAgICAgICAgLy8gY3VycmVudCBJbnRlcm5hbE1lc3NhZ2UgaXMgbm90IHZhbGlkIGFueW1vcmUuIFNvIHJlc2V0IGl0LgotICAgICAgICBoYW5kbGVyQ3R4dC5zZXRJbnRlcm5hbE1lc3NhZ2UobnVsbCk7CisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTT0FQTWVzc2FnZSBzb2FwTXNnKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnNvYXBNc2cgPSBzb2FwTXNnOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgc2V0UGFja2V0TWVzc2FnZShNZXNzYWdlIG5ld01lc3NhZ2UpeworICAgICAgICBpZihuZXdNZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhY2tldC5zZXRNZXNzYWdlKG5ld01lc3NhZ2UpOworICAgICAgICAgICAgc29hcE1zZyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNZXNzYWdlKCkgeworICAgICAgICAvL0NoZWNrIGlmIFNPQVBNZXNzYWdlIGhhcyBjaGFuZ2VkLCBpZiBzbyBjb25zdHJ1Y3QgbmV3IG9uZSwKKyAgICAgICAgLy8gUGFja2V0IGFyZSBoYW5kbGVkIHRocm91Z2ggTWVzc2FnZUNvbnRleHQKKyAgICAgICAgaWYoc29hcE1zZyAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWNrZXQuc2V0TWVzc2FnZShuZXcgU0FBSk1lc3NhZ2Uoc29hcE1zZykpOworICAgICAgICAgICAgc29hcE1zZyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0SGVhZGVycyhRTmFtZSBoZWFkZXIsIEpBWEJDb250ZXh0IGpheGJDb250ZXh0LCBib29sZWFuIGFsbFJvbGVzKSB7CisgICAgICAgIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uID0gYmluZGluZy5nZXRTT0FQVmVyc2lvbigpOworCisgICAgICAgIExpc3Q8T2JqZWN0PiBiZWFuTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdCBiZWFuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgc0hlYWRlciA9IG1zZy5nZXRTT0FQSGVhZGVyKCk7Ci0gICAgICAgICAgICBpZiAoc0hlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gc0hlYWRlci5nZXRDaGlsZEVsZW1lbnRzKGhlYWRlcik7Ci0gICAgICAgICAgICB3aGlsZShpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGNoaWxkID0gKFNPQVBIZWFkZXJFbGVtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmKGFsbFJvbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vSWYgYWxsUm9sZXMgaXMgdHJ1ZSwgYWRkIGFsbCBoZWFkZXJzCi0gICAgICAgICAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgYmVhbkxpc3QuYWRkKEpBWEJUeXBlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShzb3VyY2UsIGpheGJDb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9JZiBhbGxSb2xlcyBpcyBmYWxzZSwgYWRkIG9ubHkgaGVhZGVycyB3aXRoIG1hdGNoaW5nIHJvbGVzIGFuZCBoZWFkZXJzIHdpdGggbm8gcm9sZQotICAgICAgICAgICAgICAgICAgICBpZiggKGNoaWxkLmdldEFjdG9yKCkgPT0gbnVsbCl8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGdldFJvbGVzKCkuY29udGFpbnMoY2hpbGQuZ2V0QWN0b3IoKSkpICApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5MaXN0LmFkZChKQVhCVHlwZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc291cmNlLCBqYXhiQ29udGV4dCkpOworICAgICAgICAgICAgSXRlcmF0b3I8SGVhZGVyPiBpdHIgPSBwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldEhlYWRlcnMoKS5nZXRIZWFkZXJzKGhlYWRlcixmYWxzZSk7CisgICAgICAgICAgICBpZihhbGxSb2xlcykgeworICAgICAgICAgICAgICAgIHdoaWxlKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmVhbkxpc3QuYWRkKGl0ci5uZXh0KCkucmVhZEFzSkFYQihqYXhiQ29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hpbGUoaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBIZWFkZXIgc29hcEhlYWRlciA9IGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgdGhlIHJvbGUgaXMgb25lIG9mIHRoZSByb2xlcyBvbiB0aGlzIEJpbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvbGUgPSBzb2FwSGVhZGVyLmdldFJvbGUoc29hcFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICBpZihnZXRSb2xlcygpLmNvbnRhaW5zKHJvbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZWFuTGlzdC5hZGQoc29hcEhlYWRlci5yZWFkQXNKQVhCKGpheGJDb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTEsNzQgKzEyOSw0IEBACiAgICAgdm9pZCBzZXRSb2xlcyhTZXQ8U3RyaW5nPiByb2xlcykgewogICAgICAgICB0aGlzLnJvbGVzID0gcm9sZXM7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoYWxsb3dlZFR5cGVzLmNvbnRhaW5zS2V5KG5hbWUpKSB7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGFsbG93ZWRUeXBlcy5nZXQobmFtZSk7Ci0gICAgICAgICAgICBpZiAoIShjbGF6ei5pc0luc3RhbmNlKHZhbHVlKSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEhhbmRsZXJFeGNlcHRpb24oImhhbmRsZXIubWVzc2FnZUNvbnRleHQuaW52YWxpZC5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB2YWx1ZSwgbmFtZSB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBuYW1lLCBTY29wZSBzY29wZSkgewotICAgICAgICBjdHh0LnNldFNjb3BlKG5hbWUsIHNjb3BlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NvcGUgZ2V0U2NvcGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuZ2V0U2NvcGUobmFtZSk7Ci0gICAgfQotCi0gICAgLyogamF2YS51dGlsLk1hcCBtZXRob2RzIGJlbG93IGhlcmUgKi8KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBjdHh0LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gY3R4dC5jb250YWluc0tleShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gY3R4dC5jb250YWluc1ZhbHVlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0KCkgewotICAgICAgICByZXR1cm4gY3R4dC5lbnRyeVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuZ2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LmtleVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBzdHIsIE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGN0eHQucHV0KHN0ciwgb2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+IG1hcCkgewotICAgICAgICBjdHh0LnB1dEFsbChtYXApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGN0eHQucmVtb3ZlKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gY3R4dC5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiB2YWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LnZhbHVlcygpOwotICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9TZXJ2ZXJMb2dpY2FsSGFuZGxlclR1YmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU2VydmVyTG9naWNhbEhhbmRsZXJUdWJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4ODMyMQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU2VydmVyTG9naWNhbEhhbmRsZXJUdWJlLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZUNsb25lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5BYnN0cmFjdEZpbHRlclR1YmVJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5EYXRhSGFuZGxlckF0dGFjaG1lbnQ7CisKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJMb2dpY2FsSGFuZGxlclR1YmUgZXh0ZW5kcyBIYW5kbGVyVHViZSB7CisKKyAgICBwcml2YXRlIFdTQmluZGluZyBiaW5kaW5nOworICAgIHByaXZhdGUgTGlzdDxMb2dpY2FsSGFuZGxlcj4gbG9naWNhbEhhbmRsZXJzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBMb2dpY2FsSGFuZGxlclR1YmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmVyTG9naWNhbEhhbmRsZXJUdWJlKFdTQmluZGluZyBiaW5kaW5nLCBXU0RMUG9ydCBwb3J0LCBUdWJlIG5leHQpIHsKKyAgICAgICAgc3VwZXIobmV4dCwgcG9ydCk7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgIHNldFVwUHJvY2Vzc29yT25jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBvbiBjbGllbnQtc2lkZSB3aGVyZSwgU09BUEhhbmRsZXJUdWJlIGlzIGNyZWF0ZWQKKyAgICAgKiBmaXJzdCBhbmQgdGhlbiBhIExvZ2ljYWxIYW5kbGVyVHViZSBpcyBjcmVhdGVkIHdpdGggYSBoYW5kbGVyIHRvIHRoYXQKKyAgICAgKiBTT0FQSGFuZGxlclR1YmUuCisgICAgICogV2l0aCB0aGlzIGhhbmRsZSwgTG9naWNhbEhhbmRsZXJUdWJlIGNhbiBjYWxsCisgICAgICogU09BUEhhbmRsZXJUdWJlLmNsb3NlSGFuZGxlcnMoKQorICAgICAqLworICAgIHB1YmxpYyBTZXJ2ZXJMb2dpY2FsSGFuZGxlclR1YmUoV1NCaW5kaW5nIGJpbmRpbmcsIFR1YmUgbmV4dCwgSGFuZGxlclR1YmUgY291c2luVHViZSkgeworICAgICAgICBzdXBlcihuZXh0LCBjb3VzaW5UdWJlKTsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKKyAgICAgICAgc2V0VXBQcm9jZXNzb3JPbmNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3RvciBmb3Ige0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmUjY29weShjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlQ2xvbmVyKX0uCisgICAgICovCisKKyAgICBwcml2YXRlIFNlcnZlckxvZ2ljYWxIYW5kbGVyVHViZShTZXJ2ZXJMb2dpY2FsSGFuZGxlclR1YmUgdGhhdCwgVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgc3VwZXIodGhhdCwgY2xvbmVyKTsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gdGhhdC5iaW5kaW5nOworICAgICAgICBzZXRVcFByb2Nlc3Nvck9uY2UoKTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzSGFuZGxlckNoYWluRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBsb2dpY2FsSGFuZGxlcnMuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIFNPQVBIYW5kbGVycyBmaXJzdCBhbmQgdGhlbiBMb2dpY2FsSGFuZGxlcnMgb24gQ2xpZW50CisgICAgICogQ2xvc2UgTG9naWNhbEhhbmRsZXJzIGZpcnN0IGFuZCB0aGVuIFNPQVBIYW5kbGVycyBvbiBTZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7CisKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvL1NPQVBIYW5kbGVyVHViZSB3aWxsIGRyaXZlIHRoZSBjbG9zaW5nIG9mIExvZ2ljYWxIYW5kbGVyVHViZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHByb2Nlc3NvciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNsb3NlTG9naWNhbEhhbmRsZXJzKG1zZ0NvbnRleHQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGNvdXNpblR1YmUuCisgICAgICogQ2xvc2UgdGhpcyBUdWJlJ3MgaGFuZGxlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VDYWxsKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKKyAgICAgICAgY2xvc2VMb2dpY2FsSGFuZGxlcnMobXNnQ29udGV4dCk7CisgICAgfQorCisgICAgLy9UT0RPOgorICAgIHByaXZhdGUgdm9pZCBjbG9zZUxvZ2ljYWxIYW5kbGVycyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7CisgICAgICAgIGlmIChwcm9jZXNzb3IgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHJlbWVkeUFjdGlvblRha2VuKSB7CisgICAgICAgICAgICAvL0Nsb3NlIG9ubHkgaW52b2tlZCBoYW5kbGVycyBpbiB0aGUgY2hhaW4KKyAgICAgICAgICAgIC8vU0VSVkVSLVNJREUKKyAgICAgICAgICAgIHByb2Nlc3Nvci5jbG9zZUhhbmRsZXJzKG1zZ0NvbnRleHQsIHByb2Nlc3Nvci5nZXRJbmRleCgpLCBsb2dpY2FsSGFuZGxlcnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBwcm9jZXNzb3Iuc2V0SW5kZXgoLTEpOworICAgICAgICAgICAgLy9yZXNldCByZW1lZHlBY3Rpb25UYWtlbgorICAgICAgICAgICAgcmVtZWR5QWN0aW9uVGFrZW4gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vQ2xvc2UgYWxsIGhhbmRsZXJzIGluIHRoZSBjaGFpbgorICAgICAgICAgICAgLy9TRVJWRVItU0lERQorICAgICAgICAgICAgcHJvY2Vzc29yLmNsb3NlSGFuZGxlcnMobXNnQ29udGV4dCwgMCwgbG9naWNhbEhhbmRsZXJzLnNpemUoKSAtIDEpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbCBjb3B5KFR1YmVDbG9uZXIgY2xvbmVyKSB7CisgICAgICAgIHJldHVybiBuZXcgU2VydmVyTG9naWNhbEhhbmRsZXJUdWJlKHRoaXMsIGNsb25lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVwUHJvY2Vzc29yT25jZSgpIHsKKyAgICAgICAgbG9naWNhbEhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxMb2dpY2FsSGFuZGxlcj4oKTsKKyAgICAgICAgTGlzdDxMb2dpY2FsSGFuZGxlcj4gbG9naWNhbFNuYXBTaG90PSAoKEJpbmRpbmdJbXBsKSBiaW5kaW5nKS5nZXRIYW5kbGVyQ29uZmlnKCkuZ2V0TG9naWNhbEhhbmRsZXJzKCk7CisgICAgICAgIGlmICghbG9naWNhbFNuYXBTaG90LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbG9naWNhbEhhbmRsZXJzLmFkZEFsbChsb2dpY2FsU25hcFNob3QpOworICAgICAgICAgICAgaWYgKGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IFhNTEhhbmRsZXJQcm9jZXNzb3IodGhpcywgYmluZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxIYW5kbGVycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBTT0FQSGFuZGxlclByb2Nlc3NvcihmYWxzZSwgdGhpcywgYmluZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxIYW5kbGVycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldFVwUHJvY2Vzc29yKCkgeworICAgICAvLyBEbyBub3RoaW5nLCBQcm9jZXNzb3IgaXMgc2V0dXAgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgIH0KKworICAgIE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGdldENvbnRleHQoUGFja2V0IHBhY2tldCkgeworICAgICAgICByZXR1cm4gbmV3IExvZ2ljYWxNZXNzYWdlQ29udGV4dEltcGwoYmluZGluZywgcGFja2V0KTsKKyAgICB9CisKKyAgICBib29sZWFuIGNhbGxIYW5kbGVyc09uUmVxdWVzdChNZXNzYWdlVXBkYXRhYmxlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGlzT25lV2F5KSB7CisKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVyUmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9TRVJWRVItU0lERQorICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHByb2Nlc3Nvci5jYWxsSGFuZGxlcnNSZXF1ZXN0KEhhbmRsZXJQcm9jZXNzb3IuRGlyZWN0aW9uLklOQk9VTkQsIGNvbnRleHQsICFpc09uZVdheSk7CisKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVtZWR5QWN0aW9uVGFrZW4gPSB0cnVlOworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYW5kbGVyUmVzdWx0KSB7CisgICAgICAgICAgICByZW1lZHlBY3Rpb25UYWtlbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBjYWxsSGFuZGxlcnNPblJlc3BvbnNlKE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaGFuZGxlRmF1bHQpIHsKKyAgICAgICAgLy9MZXRzIGNvcHkgYWxsIHRoZSBNZXNzYWdlQ29udGV4dC5PVVRCT1VORF9BVFRBQ0hNRU5UX1BST1BFUlRZIHRvIHRoZSBtZXNzYWdlCisgICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRzID0gKE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPikgY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyk7CisgICAgICAgIEF0dGFjaG1lbnRTZXQgYXR0U2V0ID0gcGFja2V0LmdldE1lc3NhZ2UoKS5nZXRBdHRhY2htZW50cygpOworICAgICAgICBmb3IoU3RyaW5nIGNpZCA6IGF0dHMua2V5U2V0KCkpeworICAgICAgICAgICAgQXR0YWNobWVudCBhdHQgPSBuZXcgRGF0YUhhbmRsZXJBdHRhY2htZW50KGNpZCwgYXR0cy5nZXQoY2lkKSk7CisgICAgICAgICAgICBhdHRTZXQuYWRkKGF0dCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9TRVJWRVItU0lERQorICAgICAgICAgICAgcHJvY2Vzc29yLmNhbGxIYW5kbGVyc1Jlc3BvbnNlKEhhbmRsZXJQcm9jZXNzb3IuRGlyZWN0aW9uLk9VVEJPVU5ELCBjb250ZXh0LCBoYW5kbGVGYXVsdCk7CisKKyAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKKyAgICAgICAgICAgIC8vbm8gcmV3cmFwcGluZworICAgICAgICAgICAgdGhyb3cgd3NlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvU2VydmVyU09BUEhhbmRsZXJUdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1NlcnZlclNPQVBIYW5kbGVyVHViZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWRkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1NlcnZlclNPQVBIYW5kbGVyVHViZS5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVDbG9uZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuSGFuZGxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkRhdGFIYW5kbGVyQXR0YWNobWVudDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJTT0FQSGFuZGxlclR1YmUgZXh0ZW5kcyBIYW5kbGVyVHViZSB7CisKKyAgICBwcml2YXRlIFdTQmluZGluZyBiaW5kaW5nOworICAgIHByaXZhdGUgTGlzdDxTT0FQSGFuZGxlcj4gc29hcEhhbmRsZXJzOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gcm9sZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNPQVBIYW5kbGVyVHViZQorICAgICAqLworICAgIHB1YmxpYyBTZXJ2ZXJTT0FQSGFuZGxlclR1YmUoV1NCaW5kaW5nIGJpbmRpbmcsIFdTRExQb3J0IHBvcnQsIFR1YmUgbmV4dCkgeworICAgICAgICBzdXBlcihuZXh0LCBwb3J0KTsKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTT0FQSGFuZGxlclR1YmUgc2hvdWxkIG4ndCBiZSB1c2VkIGZvciBiaW5kaW5ncyBvdGhlciB0aGFuIFNPQVAuCisgICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBFeGNlcHRpb24KKyAgICAgICAgfQorICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgICAgICBzZXRVcFByb2Nlc3Nvck9uY2UoKTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgdG8gTG9naWNhbEhhbmRsZXJUdWJlIG1lYW5zIGl0cyB1c2VkIG9uIFNFUlZFUi1TSURFCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgb24gY2xpZW50LXNpZGUgd2hlcmUsIExvZ2ljYWxIYW5kbGVyVHViZSBpcyBjcmVhdGVkCisgICAgICogZmlyc3QgYW5kIHRoZW4gYSBTT0FQSGFuZGxlclR1YmUgaXMgY3JlYXRlZCB3aXRoIGEgaGFuZGxlciB0byB0aGF0CisgICAgICogTG9naWNhbEhhbmRsZXJUdWJlLgorICAgICAqIFdpdGggdGhpcyBoYW5kbGUsIFNPQVBIYW5kbGVyVHViZSBjYW4gY2FsbCBMb2dpY2FsSGFuZGxlclR1YmUuY2xvc2VIYW5kbGVycygpCisgICAgICovCisgICAgcHVibGljIFNlcnZlclNPQVBIYW5kbGVyVHViZShXU0JpbmRpbmcgYmluZGluZywgVHViZSBuZXh0LCBIYW5kbGVyVHViZSBjb3VzaW5UdWJlKSB7CisgICAgICAgIHN1cGVyKG5leHQsIGNvdXNpblR1YmUpOworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgICAgICBzZXRVcFByb2Nlc3Nvck9uY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZSNjb3B5KGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVDbG9uZXIpfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZlclNPQVBIYW5kbGVyVHViZShTZXJ2ZXJTT0FQSGFuZGxlclR1YmUgdGhhdCwgVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgc3VwZXIodGhhdCwgY2xvbmVyKTsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gdGhhdC5iaW5kaW5nOworICAgICAgICBzZXRVcFByb2Nlc3Nvck9uY2UoKTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzSGFuZGxlckNoYWluRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBzb2FwSGFuZGxlcnMuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIFNPQVBIYW5kbGVycyBmaXJzdCBhbmQgdGhlbiBMb2dpY2FsSGFuZGxlcnMgb24gQ2xpZW50CisgICAgICogQ2xvc2UgTG9naWNhbEhhbmRsZXJzIGZpcnN0IGFuZCB0aGVuIFNPQVBIYW5kbGVycyBvbiBTZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7CisgICAgICAgIC8vYXNzdW1pbmcgY291c2luVHViZSBpcyBjYWxsZWQgaWYgcmVxdWVzdFByb2Nlc3NpbmdTdWNlc3NmdWwgaXMgdHJ1ZQorICAgICAgICBpZiAocmVxdWVzdFByb2Nlc3NpbmdTdWNlc3NmdWwpIHsKKyAgICAgICAgICAgIGlmIChjb3VzaW5UdWJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDbG9zZSBMb2dpY2FsSGFuZGxlclR1YmUKKyAgICAgICAgICAgICAgICBjb3VzaW5UdWJlLmNsb3NlQ2FsbChtc2dDb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc29yICE9IG51bGwpCisgICAgICAgICAgICBjbG9zZVNPQVBIYW5kbGVycyhtc2dDb250ZXh0KTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIGZyb20gY291c2luVHViZS4KKyAgICAgKiBDbG9zZSB0aGlzIFR1YmUncyBoYW5kbGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUNhbGwoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgeworICAgICAgICBjbG9zZVNPQVBIYW5kbGVycyhtc2dDb250ZXh0KTsKKyAgICB9CisKKyAgICAvL1RPRE86CisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlU09BUEhhbmRsZXJzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKKyAgICAgICAgaWYgKHByb2Nlc3NvciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAocmVtZWR5QWN0aW9uVGFrZW4pIHsKKyAgICAgICAgICAgIC8vQ2xvc2Ugb25seSBpbnZva2VkIGhhbmRsZXJzIGluIHRoZSBjaGFpbgorICAgICAgICAgICAgLy9TRVJWRVItU0lERQorICAgICAgICAgICAgcHJvY2Vzc29yLmNsb3NlSGFuZGxlcnMobXNnQ29udGV4dCwgcHJvY2Vzc29yLmdldEluZGV4KCksIHNvYXBIYW5kbGVycy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIHByb2Nlc3Nvci5zZXRJbmRleCgtMSk7CisgICAgICAgICAgICAvL3Jlc2V0IHJlbWVkeUFjdGlvblRha2VuCisgICAgICAgICAgICByZW1lZHlBY3Rpb25UYWtlbiA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9DbG9zZSBhbGwgaGFuZGxlcnMgaW4gdGhlIGNoYWluCisgICAgICAgICAgICAvL1NFUlZFUi1TSURFCisgICAgICAgICAgICBwcm9jZXNzb3IuY2xvc2VIYW5kbGVycyhtc2dDb250ZXh0LCAwLCBzb2FwSGFuZGxlcnMuc2l6ZSgpIC0gMSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBBYnN0cmFjdEZpbHRlclR1YmVJbXBsIGNvcHkoVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJTT0FQSGFuZGxlclR1YmUodGhpcywgY2xvbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBQcm9jZXNzb3JPbmNlKCkgeworICAgICAgICBzb2FwSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PFNPQVBIYW5kbGVyPigpOworICAgICAgICBIYW5kbGVyQ29uZmlndXJhdGlvbiBoYW5kbGVyQ29uZmlnID0gKChCaW5kaW5nSW1wbCkgYmluZGluZykuZ2V0SGFuZGxlckNvbmZpZygpOworICAgICAgICBMaXN0PFNPQVBIYW5kbGVyPiBzb2FwU25hcFNob3Q9IGhhbmRsZXJDb25maWcuZ2V0U29hcEhhbmRsZXJzKCk7CisgICAgICAgIGlmICghc29hcFNuYXBTaG90LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc29hcEhhbmRsZXJzLmFkZEFsbChzb2FwU25hcFNob3QpOworICAgICAgICAgICAgcm9sZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICByb2xlcy5hZGRBbGwoaGFuZGxlckNvbmZpZy5nZXRSb2xlcygpKTsKKyAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBTT0FQSGFuZGxlclByb2Nlc3NvcihmYWxzZSwgdGhpcywgYmluZGluZywgc29hcEhhbmRsZXJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0VXBQcm9jZXNzb3IoKSB7CisgICAgICAgIC8vIERvIG5vdGhpbmcsIFByb2Nlc3NvciBpcyBzZXR1cCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgfQorICAgIE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGdldENvbnRleHQoUGFja2V0IHBhY2tldCkgeworICAgICAgICBTT0FQTWVzc2FnZUNvbnRleHRJbXBsIGNvbnRleHQgPSBuZXcgU09BUE1lc3NhZ2VDb250ZXh0SW1wbChiaW5kaW5nLCBwYWNrZXQpOworICAgICAgICBjb250ZXh0LnNldFJvbGVzKHJvbGVzKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorCisgICAgYm9vbGVhbiBjYWxsSGFuZGxlcnNPblJlcXVlc3QoTWVzc2FnZVVwZGF0YWJsZUNvbnRleHQgY29udGV4dCwgYm9vbGVhbiBpc09uZVdheSkgeworCisgICAgICAgIGJvb2xlYW4gaGFuZGxlclJlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vU0VSVkVSLVNJREUKKyAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSBwcm9jZXNzb3IuY2FsbEhhbmRsZXJzUmVxdWVzdChIYW5kbGVyUHJvY2Vzc29yLkRpcmVjdGlvbi5JTkJPVU5ELCBjb250ZXh0LCAhaXNPbmVXYXkpOworCisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlbWVkeUFjdGlvblRha2VuID0gdHJ1ZTsKKyAgICAgICAgICAgIHRocm93IHJlOworCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYW5kbGVyUmVzdWx0KSB7CisgICAgICAgICAgICByZW1lZHlBY3Rpb25UYWtlbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBjYWxsSGFuZGxlcnNPblJlc3BvbnNlKE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaGFuZGxlRmF1bHQpIHsKKworICAgICAgICAvL0xldHMgY29weSBhbGwgdGhlIE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX0FUVEFDSE1FTlRfUFJPUEVSVFkgdG8gdGhlIG1lc3NhZ2UKKyAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dHMgPSAoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KSBjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5PVVRCT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKTsKKyAgICAgICAgQXR0YWNobWVudFNldCBhdHRTZXQgPSBwYWNrZXQuZ2V0TWVzc2FnZSgpLmdldEF0dGFjaG1lbnRzKCk7CisgICAgICAgIGZvcihTdHJpbmcgY2lkIDogYXR0cy5rZXlTZXQoKSl7CisgICAgICAgICAgICBBdHRhY2htZW50IGF0dCA9IG5ldyBEYXRhSGFuZGxlckF0dGFjaG1lbnQoY2lkLCBhdHRzLmdldChjaWQpKTsKKyAgICAgICAgICAgIGF0dFNldC5hZGQoYXR0KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL1NFUlZFUi1TSURFCisgICAgICAgICAgICBwcm9jZXNzb3IuY2FsbEhhbmRsZXJzUmVzcG9uc2UoSGFuZGxlclByb2Nlc3Nvci5EaXJlY3Rpb24uT1VUQk9VTkQsIGNvbnRleHQsIGhhbmRsZUZhdWx0KTsKKworICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgeworICAgICAgICAgICAgLy9ubyByZXdyYXBwaW5nCisgICAgICAgICAgICB0aHJvdyB3c2U7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHRocm93IHJlOworCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1hNTEhhbmRsZXJDb250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1hNTEhhbmRsZXJDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNmQ0OGMuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9YTUxIYW5kbGVyQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5JbnZva2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkludGVybmFsTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy54bWwuWE1MTWVzc2FnZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLQotLyoqCi0gKiBWZXJzaW9uIG9mIHtAbGluayBIYW5kbGVyQ29udGV4dH0gZm9yIFhNTC9IVFRQIGJpbmRpbmcgdGhhdAotICogb25seSBkZWFscyB3aXRoIGxvZ2ljYWwgbWVzc2FnZXMuCi0gKgotICogPHA+Q2xhc3MgaGFzIHRvIGRlZmVyIGluZm9ybWF0aW9uIHRvIEhhbmRsZXJDb250ZXh0IHNvIHRoYXQgcHJvcGVydGllcwotICogYXJlIHNoYXJlZCBiZXR3ZWVuIHRoaXMgYW5kIFNPQVBNZXNzYWdlQ29udGV4dC4KLSAqCi0gKiBAc2VlIEhhbmRsZXJDb250ZXh0Ci0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFhNTEhhbmRsZXJDb250ZXh0IGV4dGVuZHMgSGFuZGxlckNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBYTUxNZXNzYWdlIHhtbE1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBMb2dpY2FsTWVzc2FnZUNvbnRleHQgbG9naWNhbENvbnRleHQ7Ci0gICAgcHJpdmF0ZSBTSERYTUxNZXNzYWdlQ29udGV4dCBzaGRYbWxDb250ZXh0OwotCi0gICAgcHVibGljIFhNTEhhbmRsZXJDb250ZXh0KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICAgICAgSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZSwKLSAgICAgICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlSW5mbywgaW50ZXJuYWxNZXNzYWdlKTsKLSAgICAgICAgdGhpcy54bWxNZXNzYWdlID0geG1sTWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGdldExvZ2ljYWxNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKGxvZ2ljYWxDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ2ljYWxDb250ZXh0ID0gbmV3IFhNTExvZ2ljYWxNZXNzYWdlQ29udGV4dEltcGwodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvZ2ljYWxDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBYTUxNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFhNTE1lc3NhZ2UgZ2V0WE1MTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHhtbE1lc3NhZ2UgVGhlIHhtbE1lc3NhZ2UgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhNTE1lc3NhZ2UoWE1MTWVzc2FnZSB4bWxNZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMueG1sTWVzc2FnZSA9IHhtbE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFNIRFhNTE1lc3NhZ2VDb250ZXh0IGdldFNIRFhNTE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICBpZiAoc2hkWG1sQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzaGRYbWxDb250ZXh0ID0gbmV3IFNIRFhNTE1lc3NhZ2VDb250ZXh0KHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaGRYbWxDb250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNIRFhNTE1lc3NhZ2VDb250ZXh0IGV4dGVuZHMgWE1MTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbCBpbXBsZW1lbnRzIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLk1lc3NhZ2VDb250ZXh0IHsKLQotICAgICAgICBYTUxIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ3R4dDsKLQotICAgICAgICBwdWJsaWMgU0hEWE1MTWVzc2FnZUNvbnRleHQoWE1MSGFuZGxlckNvbnRleHQgaGFuZGxlckN0eHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGhhbmRsZXJDdHh0KTsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlckN0eHQgPSBoYW5kbGVyQ3R4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lkKCkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJDdHh0LmdldEJpbmRpbmdJZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlckN0eHQuZ2V0TWV0aG9kKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYW5vbmljYWxpemF0aW9uKFN0cmluZyBhbGdvcml0aG0pIHsKLSAgICAgICAgICAgIGhhbmRsZXJDdHh0LnNldENhbm9uaWNhbGl6YXRpb24oYWxnb3JpdGhtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnZva2VyIGdldEludm9rZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlckN0eHQuZ2V0SW52b2tlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNdG9tRW5hYmxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1hNTEhhbmRsZXJQcm9jZXNzb3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvWE1MSGFuZGxlclByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjQ1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1hNTEhhbmRsZXJQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBMb2dpY2FsSGFuZGxlclByb2Nlc3Nvci5qYXZhCisgKgorICogQ3JlYXRlZCBvbiBGZWJydWFyeSA4LCAyMDA2LCA1OjQwIFBNCisgKgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHVzZWQgb25seSBmb3IgWE1ML0hUVFAgYmluZGluZworICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKi8KK2ZpbmFsIGNsYXNzIFhNTEhhbmRsZXJQcm9jZXNzb3I8QyBleHRlbmRzIE1lc3NhZ2VVcGRhdGFibGVDb250ZXh0PiBleHRlbmRzIEhhbmRsZXJQcm9jZXNzb3I8Qz4geworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBMb2dpY2FsSGFuZGxlclByb2Nlc3NvcgorICAgICAqLworICAgIHB1YmxpYyBYTUxIYW5kbGVyUHJvY2Vzc29yKEhhbmRsZXJUdWJlIG93bmVyLCBXU0JpbmRpbmcgYmluZGluZywgTGlzdDw/IGV4dGVuZHMgSGFuZGxlcj4gY2hhaW4pIHsKKyAgICAgICAgc3VwZXIob3duZXIsIGJpbmRpbmcsIGNoYWluKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRPRE86IFRoaXMgaXMgdmFsaWQgb25seSBmb3IgWE1ML0hUVFAgYmluZGluZworICAgICAqIEVtcHR5IHRoZSBYTUwgbWVzc2FnZQorICAgICAqLworICAgIGZpbmFsIHZvaWQgaW5zZXJ0RmF1bHRNZXNzYWdlKEMgY29udGV4dCwKKyAgICAgICAgICAgIFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICBpZihleGNlcHRpb24gaW5zdGFuY2VvZiBIVFRQRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBjb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5IVFRQX1JFU1BPTlNFX0NPREUsKChIVFRQRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBub24tc29hcCBjYXNlCisgICAgICAgICAgICBjb250ZXh0LnNldFBhY2tldE1lc3NhZ2UoTWVzc2FnZXMuY3JlYXRlRW1wdHkoYmluZGluZy5nZXRTT0FQVmVyc2lvbigpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1hNTExvZ2ljYWxNZXNzYWdlQ29udGV4dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvWE1MTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTcwOGE4Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvWE1MTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuTG9naWNhbE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIExvZ2ljYWxNZXNzYWdlQ29udGV4dCB0aGF0IGlzIHVzZWQgaW4KLSAqIHRoZSBYTUwvSFRUUCBiaW5kaW5nLiBJdCBpcyBzaW1pbGFyIHRvIExvZ2ljYWxNZXNzYWdlQ29udGV4dEltcGwKLSAqIGV4Y2VwdCB0aGF0IHRoZSBtZXNzYWdlIGltcGwgY2xhc3MgaXQgdXNlcyBpcyBhCi0gKiB7QGxpbmsgWE1MTG9naWNhbE1lc3NhZ2VJbXBsfSByYXRoZXIgdGhhbiBhCi0gKiB7QGxpbmsgTG9naWNhbE1lc3NhZ2VJbXBsfS4KLSAqCi0gKiA8cD5DbGFzcyBoYXMgdG8gZGVmZXIgaW5mb3JtYXRpb24gdG8gSGFuZGxlckNvbnRleHQgc28gdGhhdCBwcm9wZXJ0aWVzCi0gKiBhcmUgc2hhcmVkIGJldHdlZW4gdGhpcyBhbmQgU09BUE1lc3NhZ2VDb250ZXh0LgotICoKLSAqIEBzZWUgTG9naWNhbE1lc3NhZ2VJbXBsCi0gKiBAc2VlIFhNTEhhbmRsZXJDb250ZXh0Ci0gKiBAc2VlIFhNTExvZ2ljYWxNZXNzYWdlSW1wbAotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgWE1MTG9naWNhbE1lc3NhZ2VDb250ZXh0SW1wbCBpbXBsZW1lbnRzIExvZ2ljYWxNZXNzYWdlQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IGN0eHQ7Ci0gICAgcHJpdmF0ZSBYTUxIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ3R4dDsKLQotICAgIHB1YmxpYyBYTUxMb2dpY2FsTWVzc2FnZUNvbnRleHRJbXBsKFhNTEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDdHh0KSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckN0eHQgPSBoYW5kbGVyQ3R4dDsKLSAgICAgICAgY3R4dCA9IGhhbmRsZXJDdHh0LmdldE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTEhhbmRsZXJDb250ZXh0IGdldEhhbmRsZXJDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckN0eHQ7Ci0gICAgfQotCi0gICAgcHVibGljIExvZ2ljYWxNZXNzYWdlIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgWE1MTG9naWNhbE1lc3NhZ2VJbXBsKGhhbmRsZXJDdHh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgbmFtZSwgU2NvcGUgc2NvcGUpIHsKLSAgICAgICAgY3R4dC5zZXRTY29wZShuYW1lLCBzY29wZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjb3BlIGdldFNjb3BlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LmdldFNjb3BlKG5hbWUpOwotICAgIH0KLQotICAgIC8qIGphdmEudXRpbC5NYXAgbWV0aG9kcyBiZWxvdyBoZXJlICovCi0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgY3R4dC5jbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuY29udGFpbnNLZXkob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuY29udGFpbnNWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCgpIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuZW50cnlTZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LmdldChvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgewotICAgICAgICByZXR1cm4gY3R4dC5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChTdHJpbmcgc3RyLCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LnB1dChzdHIsIG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgT2JqZWN0PiBtYXApIHsKLSAgICAgICAgY3R4dC5wdXRBbGwobWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBjdHh0LnJlbW92ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGN0eHQuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gdmFsdWVzKCkgewotICAgICAgICByZXR1cm4gY3R4dC52YWx1ZXMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvWE1MTG9naWNhbE1lc3NhZ2VJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL1hNTExvZ2ljYWxNZXNzYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDg5ZTVmLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL2hhbmRsZXIvWE1MTG9naWNhbE1lc3NhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLkxvZ2ljYWxNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxNZXNzYWdlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIExvZ2ljYWxNZXNzYWdlIHRoYXQgaXMgdXNlZCBpbiB0aGUKLSAqIFhNTC9IVFRQIGJpbmRpbmcuIEl0IGlzIHNpbWlsYXIgdG8gTG9naWNhbE1lc3NhZ2VJbXBsCi0gKiBleGNlcHQgdGhhdCB0aGUgY29udGV4dCBvYmplY3QgcGFzc2VkIGluIGlzIGFuCi0gKiB7QGxpbmsgWE1MSGFuZGxlckNvbnRleHR9IHJhdGhlciB0aGFuIGEge0BsaW5rIEhhbmRsZXJDb250ZXh0fS4KLSAqCi0gKiBAc2VlIExvZ2ljYWxNZXNzYWdlSW1wbAotICogQHNlZSBYTUxIYW5kbGVyQ29udGV4dAotICogQHNlZSBYTUxMb2dpY2FsTWVzc2FnZUNvbnRleHRJbXBsCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxMb2dpY2FsTWVzc2FnZUltcGwgaW1wbGVtZW50cyBMb2dpY2FsTWVzc2FnZSB7Ci0KLSAgICBwcml2YXRlIFhNTEhhbmRsZXJDb250ZXh0IGN0eHQ7Ci0KLSAgICBwdWJsaWMgWE1MTG9naWNhbE1lc3NhZ2VJbXBsKFhNTEhhbmRsZXJDb250ZXh0IGN0eHQpIHsKLSAgICAgICAgdGhpcy5jdHh0ID0gY3R4dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdldHMgdGhlIHNvdXJjZSBmcm9tIFhNTE1lc3NhZ2UuIFhNTE1lc3NhZ2UgZ2l2ZXMgYSBjb3B5IG9mIGV4aXN0aW5nCi0gICAgICogZGF0YQotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgWE1MTWVzc2FnZSB4bWxNZXNzYWdlID0gY3R4dC5nZXRYTUxNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiB4bWxNZXNzYWdlLmdldFBheWxvYWQoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldHMgdGhlIFNvdXJjZSBhcyBwYXlsb2FkIGluIFhNTE1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXlsb2FkKFNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgWE1MTWVzc2FnZSB4bWxNZXNzYWdlID0gY3R4dC5nZXRYTUxNZXNzYWdlKCk7Ci0gICAgICAgIHhtbE1lc3NhZ2UgPSBuZXcgWE1MTWVzc2FnZShzb3VyY2UsIHhtbE1lc3NhZ2UuZ2V0QXR0YWNobWVudHMoKSwgeG1sTWVzc2FnZS51c2VGYXN0SW5mb3NldCgpKTsKLSAgICAgICAgY3R4dC5zZXRYTUxNZXNzYWdlKHhtbE1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogR2V0cyBYTUxNZXNzYWdlIGRhdGEgYXMgSkFYQiBiZWFuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXlsb2FkKEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7Ci0gICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSA9IGN0eHQuZ2V0WE1MTWVzc2FnZSgpOwotICAgICAgICByZXR1cm4geG1sTWVzc2FnZS5nZXRQYXlsb2FkKGpheGJDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldHMgSkFYQiBiZWFuIGludG8gWE1MTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBheWxvYWQoT2JqZWN0IGJlYW4sIEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7Ci0gICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSA9IGN0eHQuZ2V0WE1MTWVzc2FnZSgpOwotICAgICAgICB4bWxNZXNzYWdlID0gbmV3IFhNTE1lc3NhZ2UoYmVhbiwgamF4YkNvbnRleHQsIHhtbE1lc3NhZ2UuZ2V0QXR0YWNobWVudHMoKSwgeG1sTWVzc2FnZS51c2VGYXN0SW5mb3NldCgpKTsKLSAgICAgICAgY3R4dC5zZXRYTUxNZXNzYWdlKHhtbE1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxIYW5kbGVyQ29udGV4dCBnZXRIYW5kbGVyQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGN0eHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvaGFuZGxlci9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1YzdjZC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9oYW5kbGVyL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogPGgxPkpBWC1XUyAyLjAgSGFuZGxlciBSdW50aW1lPC9oMT4KLSAqIDxwPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGhhbmRsZXIgY29kZQotICogaW4gdGhlIEpBWC1XUyAyLjAgcnVudGltZS4KLSAqCi0gKiA8cD5IYW5kbGVycyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb24gdGhlCi0gKiBzZXJ2ZXIgc2lkZSwgb3IgYnkgYSB3c2RsIGN1c3RvbWl6YXRpb24gb3IgSmF2YSBhbm5vdGF0aW9uLiBJbiB0aGUKLSAqIGNhc2Ugb2YgYSB3c2RsIGN1c3RvbWl6YXRpb24sIHdzaW1wb3J0IHdpbGwgY3JlYXRlIHRoZSBKYXZhIGludGVyZmFjZQotICogd2l0aCB0aGUgaGFuZGxlciBjaGFpbiBhbm5vdGF0aW9uIGFuZCB3aWxsIGNyZWF0ZSBhIGhhbmRsZXIgeG1sIGZpbGUKLSAqIHRvIHdoaWNoIHRoZSBhbm5vdGF0aW9uIHBvaW50cy4gQXQgcnVudGltZSwgdGh1cywgb25seSBkZXBsb3ltZW50Ci0gKiBkZXNjcmlwdG9ycyBhbmQgaGFuZGxlciBmaWxlcyBwb2ludGVkIHRvIGJ5IGFubm90YXRpb25zIGFyZSBwYXJzZWQuCi0gKiBUaGUgc2NoZW1hIGluIGFsbCBjYXNlcyBpcyB0aGUgc2FtZSwgYW5kICBASGFuZGxlckNoYWluQW5ub3RhdGlvbiBpcwotICogcHJvY2Vzc2VkIGJ5IHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkhhbmRsZXJBbm5vdGF0aW9uUHJvY2Vzc29yfSwgd2hpY2gKLSAqIGRlbGVnYXRlcyB0aGUgcGFyc2luZyBvZiBoYW5kbGVyIGNvbmZpZ3VhcnRpb24gZmlsZSB0bwotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNoYWluc01vZGVsfSAuCi0gKgotICogPGgzPlNlcnZlciBzaWRlIGhhbmRsZXIgY3JlYXRpb248L2gzPgotICoKLSAqIDxwPlRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgZmlyc3QgcGFyc2VkLCBhbmQKLSAqIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5zZXJ2bGV0LlJ1bnRpbWVFbmRwb2ludEluZm9QYXJzZXIjc2V0SGFuZGxlcnNBbmRSb2xlc30KLSAqIHBhcnNlcyB0aGUgaGFuZGxlciBjaGFpbnMgeG1sIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaWYgcHJlc2VudC4KLSAqIEl0IHRoZW4gc2V0cyB0aGUgaGFuZGxlcnMgYW5kIHJvbGVzIG9uIHRoZSBCaW5kaW5nIG9iamVjdCB0aGF0IGhhcwotICogYWxyZWFkeSBiZWVuIGNyZWF0ZWQuIFNldHRpbmcgdGhlIGhhbmRsZXIgY2hhaW4gb24gdGhlIGJpbmRpbmcgZG9lcwotICogbm90IGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgaGFuZGxlciBjaGFpbiBjYWxsZXIuCi0gKgotICogPHA+TGF0ZXIsIHdoZW4KLSAqIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUVuZHBvaW50SW5mbyNpbml0fSBpcyBwYXJzaW5nIHRoZQotICogYW5ub3RhdGlvbnMgaXQgY2hlY2tzIGZvciBoYW5kbGVycyBvbiB0aGUgYmluZGluZy4gSWYgdGhlcmUgYXJlIGhhbmRsZXJzCi0gKiBhbHJlYWR5LCBpdCBza2lwcyBhbnkgZnVydGhlciBoYW5kbGVyIHByb2Nlc3NpbmcuIEluIHRoaXMgd2F5LCB0aGUgZGVwbG95bWVudAotICogZGVzY3JpcHRvciBvdmVycmlkZXMgYW55IG90aGVyIGhhbmRsZXJzLiBJZiB0aGVyZSBhcmUgbm8gaGFuZGxlcnMgb24KLSAqIHRoZSBiaW5kaW5nIGF0IHRoaXMgcG9pbnQsIFJ1bnRpbWVFbmRwb2ludEluZm8gaGFzIHRoZQotICogSGFuZGxlckFubm90YXRpb25Qcm9jZXNzb3IgcGFyc2UgdGhlIGhhbmRsZXIgY2hhaW4gZmlsZSBhbmQgdGhlbgotICogc2V0cyB0aGUgaGFuZGxlcnMgYW5kIHJvbGVzIG9uIHRoZSBiaW5kaW5nLgotICoKLSAqIDxoMz5DbGllbnQgc2lkZSBoYW5kbGVyIGNyZWF0aW9uPC9oMz4KLSAqCi0gKiA8cD5PbiB0aGUgY2xpZW50IHNpZGUsIHRoZSBASGFuZGxlckNoYWluIGFubm90YXRpb24gb24gZ2VuZXJhdGVkIFNlcnZpY2UKLSAqIGNsYXNzIGlzIHByb2Nlc3NlZCBieSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LlNlcnZpY2VDb250ZXh0QnVpbGRlciNidWlsZH0uCi0gKiBJZiB0aGVyZSBpcyBASGFuZGxlckNoYWluIG9uIHNlcnZpY2UgY2xhc3MsIHRoZSBTZXJ2aWNlQ29udGV4dEJ1aWxkZXIgY3JlYXRlcwotICogSGFuZGxlclJlc29sdmVySW1wbCBmcm9tIHRoYXQgaGFuZGxlciBmaWxlIGFuZCBzZXRzIGl0IG9uIHRoZQotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TZXJ2aWNlQ29udGV4dH0uIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbnMgb24KLSAqIHRoZSBTRUlzIGFyZSBpZ25vcmVkIG9uIHRoZSBjbGllbnQtc2lkZS4KLSAqCi0gKiA8cD5Vbmxpa2UgdGhlIHNlcnZlciBzaWRlLCB0aGVyZSBpcyBubyBiaW5kaW5nIG9iamVjdCBhbHJlYWR5Ci0gKiBjcmVhdGVkIHdoZW4gdGhlIGhhbmRsZXJzIGFyZSBwYXJzZWQuIFdoZW4gYSBiaW5kaW5nIHByb3ZpZGVyIGlzIGNyZWF0ZWQsIHRoZQotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZX0gd2lsbCB1c2UgdGhlIGhhbmRsZXIKLSAqIHJlZ2lzdHJ5ICh3aGljaCBtYXkgYmUgdGhlIEhhbmRsZXJSZXNvbHZlckltcGwgb3IgYW5vdGhlciBoYW5kbGVyCi0gKiByZXNvbHZlciBzZXQgb24gdGhlIHNlcnZpY2UgYnkgdGhlIHVzZXIgY29kZSkgdG8gZ2V0IHRoZSBoYW5kbGVycyB0bwotICogc2V0IG9uIHRoZSBiaW5kaW5nLiBJdCB3aWxsIGdldCB0aGUgcm9sZXMgZnJvbSB0aGUgc2VydmljZSBjb250ZXh0IGFuZAotICogc2V0IHRob3NlIG9uIHRoZSBiaW5kaW5nIGlmIGl0IGlzIGEgc29hcCBiaW5kaW5nLiBUaGUgcmVsZXZhbnQgbWV0aG9kIGlzCi0gKiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LldTU2VydmljZURlbGVnYXRlI3NldEJpbmRpbmdPblByb3ZpZGVyfQotICoKLSAqIDxoMz5DYWxsaW5nIHRoZSBoYW5kbGVyczwvaDM+Ci0gKgotICogPHA+RHVyaW5nIGEgcmVxdWVzdCBvciByZXNwb25zZSwgYQotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNoYWluQ2FsbGVyfSBpcwotICogY3JlYXRlZCBieSB0aGUgYmluZGluZyBvciBtYXkgYmUgY3JlYXRlZCBieSBhIG1lc3NhZ2UgZGlzcGF0Y2hlciBvbiB0aGUKLSAqIHNlcnZlciBzaWRlICh0aGlzIGhhcHBlbnMgaW4gdGhlIGh0dHAgYmluZGluZyByaWdodCBub3cpLiBJbiB0aGUgYmluZGluZwotICogb2JqZWN0cywgdGhlIGhhbmRsZXIgY2FsbGVyIGlzIG5vdCBjcmVhdGVkIHVudGlsIG5lZWRlZCwgYW5kIGl0IHNldHMKLSAqIHRoZSBoYW5kbGVycyBhbmQgcm9sZXMgKGlmIHByZXNlbnQpIG9uIHRoZSBoYW5kbGVyIGNoYWluIGNhbGxlciB0aGVuLgotICogU2VlIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsI2dldEhhbmRsZXJDaGFpbkNhbGxlcn0KLSAqIGFuZCB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nSW1wbCNnZXRIYW5kbGVyQ2hhaW5DYWxsZXJ9Ci0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIDxwPlRoZSBoYW5kbGVyIGNoYWluIGNhbGxlciBkb2VzIHRoZSBoYW5kbGVyIGludm9jYXRpb24gYW5kIGNvbnRyb2xzIHRoZQotICogZmxvdyBvZiB0aGUgaGFuZGxlcnMuIEZvciBkZXRhaWxzIG9mIHRoZSBjb2RlIHRoYXQgY2FsbHMgdGhlIGhhbmRsZXIKLSAqIGNoYWluIGNhbGxlciwgc2VlCi0gKiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcC5jbGllbnQuU09BUE1lc3NhZ2VEaXNwYXRjaGVyfQotICogb24gdGhlIGNsaWVudCBzaWRlIGFuZAotICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuc2VydmVyLlNPQVBNZXNzYWdlRGlzcGF0Y2hlcn0gYW5kCi0gKiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wueG1sLnNlcnZlci5YTUxNZXNzYWdlRGlzcGF0Y2hlcn0gb24gdGhlCi0gKiBzZXJ2ZXIgc2lkZS4KLSAqCi0gKiBAQXJjaGl0ZWN0dXJlRG9jdW1lbnQKLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9BYnN0cmFjdEhlYWRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvQWJzdHJhY3RIZWFkZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkOWI3MQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvQWJzdHJhY3RIZWFkZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuV1NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogUGFydGlhbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBIZWFkZXJ9LgorICoKKyAqIDxwPgorICogVGhpcyBpcyBtZWFudCB0byBiZSBhIGNvbnZlbmllbnQgYmFzZSBjbGFzcworICogZm9yIHtAbGluayBIZWFkZXJ9LWRlcml2ZWQgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEhlYWRlckltcGwgaW1wbGVtZW50cyBIZWFkZXIgeworCisgICAgcHJvdGVjdGVkIEFic3RyYWN0SGVhZGVySW1wbCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCA8VD4gVCByZWFkQXNKQVhCKEJyaWRnZTxUPiBicmlkZ2UsIEJyaWRnZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEFzSkFYQihicmlkZ2UpOworICAgIH0KKworICAgIHB1YmxpYyA8VD4gVCByZWFkQXNKQVhCKFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoVCl1bm1hcnNoYWxsZXIudW5tYXJzaGFsKHJlYWRIZWFkZXIoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyA8VD4gVCByZWFkQXNKQVhCKEJyaWRnZTxUPiBicmlkZ2UpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBicmlkZ2UudW5tYXJzaGFsKHJlYWRIZWFkZXIoKSk7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdGhhdCBjb3BpZXMgdGhlIGluZm9zZXQuIE5vdCB0ZXJyaWJseSBlZmZpY2llbnQuCisgICAgICovCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UgcmVhZEFzRVBSKEFkZHJlc3NpbmdWZXJzaW9uIGV4cGVjdGVkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhzciA9IHJlYWRIZWFkZXIoKTsKKyAgICAgICAgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBuZXcgV1NFbmRwb2ludFJlZmVyZW5jZSh4c3IsIGV4cGVjdGVkKTsKKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5yZWN5Y2xlKHhzcik7CisgICAgICAgIHJldHVybiBlcHI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoQE5vdE51bGwgU09BUFZlcnNpb24gc29hcFZlcnNpb24sIEBOb3ROdWxsIFNldDxTdHJpbmc+IHJvbGVzKSB7CisgICAgICAgIC8vIGNoZWNrIG11c3RVbmRlcnN0YW5kCisgICAgICAgIFN0cmluZyB2ID0gZ2V0QXR0cmlidXRlKHNvYXBWZXJzaW9uLm5zVXJpLCAibXVzdFVuZGVyc3RhbmQiKTsKKyAgICAgICAgaWYodj09bnVsbCB8fCAhcGFyc2VCb29sKHYpKSByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBub3cgcm9sZQorICAgICAgICByZXR1cm4gIXJvbGVzLmNvbnRhaW5zKGdldFJvbGUoc29hcFZlcnNpb24pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgU3RyaW5nIGdldFJvbGUoQE5vdE51bGwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgU3RyaW5nIHYgPSBnZXRBdHRyaWJ1dGUoc29hcFZlcnNpb24ubnNVcmksIHNvYXBWZXJzaW9uLnJvbGVBdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgaWYodj09bnVsbCkKKyAgICAgICAgICAgIHYgPSBzb2FwVmVyc2lvbi5pbXBsaWNpdFJvbGU7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVsYXkoKSB7CisgICAgICAgIFN0cmluZyB2ID0gZ2V0QXR0cmlidXRlKFNPQVBWZXJzaW9uLlNPQVBfMTIubnNVcmksInJlbGF5Iik7CisgICAgICAgIGlmKHY9PW51bGwpIHJldHVybiBmYWxzZTsgICAvLyBvbiBTT0FQIDEuMSBtZXNzYWdlIHRoZXJlIHNob3VsZG4ndCBiZSBzdWNoIGFuIGF0dHJpYnV0ZSwgc28gdGhpcyB3b3JrcyBmaW5lCisgICAgICAgIHJldHVybiBwYXJzZUJvb2wodik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoUU5hbWUgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksbmFtZS5nZXRMb2NhbFBhcnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgc3RyaW5nIHRoYXQgbG9va3MgbGlrZSA8dHQ+eHM6Ym9vbGVhbjwvdHQ+IGludG8gYm9vbGVhbi4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgd2hpbGVzcGFjZSBub3JtYWxpemF0aW9uIGhhcyBhbHJlYWR5IHRha2VuIHBsYWNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHBhcnNlQm9vbChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYodmFsdWUubGVuZ3RoKCk9PTApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdCgwKTsKKyAgICAgICAgcmV0dXJuIGNoPT0ndCcgfHwgY2g9PScxJzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ0NvbnRlbnQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeHNyID0gcmVhZEhlYWRlcigpOworICAgICAgICAgICAgeHNyLm5leHRUYWcoKTsKKyAgICAgICAgICAgIHJldHVybiB4c3IuZ2V0RWxlbWVudFRleHQoKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVzSW1wbCBFTVBUWV9BVFRTID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0Fic3RyYWN0TWVzc2FnZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvQWJzdHJhY3RNZXNzYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzVhODUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0Fic3RyYWN0TWVzc2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQubWFyc2hhbGxlci5TQVgyRE9NRXg7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyTGlzdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkxvY2F0b3JJbXBsOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFBhcnRpYWwge0BsaW5rIE1lc3NhZ2V9IGltcGxlbWVudGF0aW9uLgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHNvbWUgb2YgdGhlIHtAbGluayBNZXNzYWdlfSBtZXRob2RzLgorICogVGhlIGlkZWEgaXMgdGhhdCB0aG9zZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGJlIG5vbi1vcHRpbWFsIGJ1dAorICogaXQgbWF5IHNhdmUgZWZmb3J0IGluIGltcGxlbWVudGluZyB7QGxpbmsgTWVzc2FnZX0gYW5kIHJlZHVjZQorICogdGhlIGNvZGUgc2l6ZS4KKyAqCisgKiA8cD4KKyAqIHtAbGluayBNZXNzYWdlfSBjbGFzc2VzIHRoYXQgYXJlIHVzZWQgbW9yZSBjb21tb25seSBzaG91bGQKKyAqIGV4YW1pbmUgY2FyZWZ1bGx5IHdoaWNoIG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgZmFzdGVyLAorICogYW5kIG92ZXJyaWRlIHRoZW0gYWNjb3JkaW5nbHkuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXNzYWdlSW1wbCBleHRlbmRzIE1lc3NhZ2UgeworICAgIC8qKgorICAgICAqIFNPQVAgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2UuCisgICAgICogVXNlZCB0byBpbXBsZW1lbnQgc29tZSBvZiB0aGUgbWV0aG9kcywgYnV0IG5vdGhpbmcgbW9yZSB0aGFuIHRoYXQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTbyBpZiB5b3UgYXJlbid0IHVzaW5nIHRob3NlIG1ldGhvZHMgdGhhdCB1c2UgdGhpcyBmaWVsZCwKKyAgICAgKiB0aGlzIGNhbiBiZSBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKworICAgIHByb3RlY3RlZCBBYnN0cmFjdE1lc3NhZ2VJbXBsKFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgIHRoaXMuc29hcFZlcnNpb24gPSBzb2FwVmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdE1lc3NhZ2VJbXBsKEFic3RyYWN0TWVzc2FnZUltcGwgdGhhdCkgeworICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gdGhhdC5zb2FwVmVyc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlIHJlYWRFbnZlbG9wZUFzU291cmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IFNBWFNvdXJjZShuZXcgWE1MUmVhZGVySW1wbCh0aGlzKSwgWE1MUmVhZGVySW1wbC5USEVfU09VUkNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZFBheWxvYWRBc0pBWEIoVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBpZihoYXNBdHRhY2htZW50cygpKQorICAgICAgICAgICAgdW5tYXJzaGFsbGVyLnNldEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIobmV3IEF0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsKGdldEF0dGFjaG1lbnRzKCkpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoVCkgdW5tYXJzaGFsbGVyLnVubWFyc2hhbChyZWFkUGF5bG9hZEFzU291cmNlKCkpOworICAgICAgICB9IGZpbmFsbHl7CisgICAgICAgICAgICB1bm1hcnNoYWxsZXIuc2V0QXR0YWNobWVudFVubWFyc2hhbGxlcihudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyA8VD4gVCByZWFkUGF5bG9hZEFzSkFYQihCcmlkZ2U8VD4gYnJpZGdlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBicmlkZ2UudW5tYXJzaGFsKHJlYWRQYXlsb2FkQXNTb3VyY2UoKSwKKyAgICAgICAgICAgIGhhc0F0dGFjaG1lbnRzKCk/IG5ldyBBdHRhY2htZW50VW5tYXJzaGFsbGVySW1wbChnZXRBdHRhY2htZW50cygpKSA6IG51bGwgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgcmVsaWVzIG9uIHtAbGluayAjd3JpdGVQYXlsb2FkVG8oWE1MU3RyZWFtV3JpdGVyKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFhNTFN0cmVhbVdyaXRlciB3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNvYXBOc1VyaSA9IHNvYXBWZXJzaW9uLm5zVXJpOworICAgICAgICB3LndyaXRlU3RhcnREb2N1bWVudCgpOworICAgICAgICB3LndyaXRlU3RhcnRFbGVtZW50KCJTIiwiRW52ZWxvcGUiLHNvYXBOc1VyaSk7CisgICAgICAgIHcud3JpdGVOYW1lc3BhY2UoIlMiLHNvYXBOc1VyaSk7CisgICAgICAgIGlmKGhhc0hlYWRlcnMoKSkgeworICAgICAgICAgICAgdy53cml0ZVN0YXJ0RWxlbWVudCgiUyIsIkhlYWRlciIsc29hcE5zVXJpKTsKKyAgICAgICAgICAgIEhlYWRlckxpc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBoZWFkZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxsZW47IGkrKyApIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJzLmdldChpKS53cml0ZVRvKHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdy53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyB3cml0ZSB0aGUgYm9keQorICAgICAgICB3LndyaXRlU3RhcnRFbGVtZW50KCJTIiwiQm9keSIsc29hcE5zVXJpKTsKKworICAgICAgICB3cml0ZVBheWxvYWRUbyh3KTsKKworICAgICAgICB3LndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB3LndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB3LndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHdob2xlIGVudmVsb3BlIGFzIFNBWCBldmVudHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyggQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNvYXBOc1VyaSA9IHNvYXBWZXJzaW9uLm5zVXJpOworCisgICAgICAgIGNvbnRlbnRIYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihOVUxMX0xPQ0FUT1IpOworICAgICAgICBjb250ZW50SGFuZGxlci5zdGFydERvY3VtZW50KCk7CisgICAgICAgIGNvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZygiUyIsc29hcE5zVXJpKTsKKyAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KHNvYXBOc1VyaSwiRW52ZWxvcGUiLCJTOkVudmVsb3BlIixFTVBUWV9BVFRTKTsKKyAgICAgICAgaWYoaGFzSGVhZGVycygpKSB7CisgICAgICAgICAgICBjb250ZW50SGFuZGxlci5zdGFydEVsZW1lbnQoc29hcE5zVXJpLCJIZWFkZXIiLCJTOkhlYWRlciIsRU1QVFlfQVRUUyk7CisgICAgICAgICAgICBIZWFkZXJMaXN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7CisgICAgICAgICAgICBpbnQgbGVuID0gaGVhZGVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8bGVuOyBpKysgKSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IEpESyBiZSBzbWFydCBlbm91Z2ggdG8gdXNlIGFycmF5LXN0eWxlIGluZGV4aW5nIGZvciB0aGlzIGZvcmVhY2ghPworICAgICAgICAgICAgICAgIGhlYWRlcnMuZ2V0KGkpLndyaXRlVG8oY29udGVudEhhbmRsZXIsZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQoc29hcE5zVXJpLCJIZWFkZXIiLCJTOkhlYWRlciIpOworICAgICAgICB9CisgICAgICAgIC8vIHdyaXRlIHRoZSBib2R5CisgICAgICAgIGNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudChzb2FwTnNVcmksIkJvZHkiLCJTOkJvZHkiLEVNUFRZX0FUVFMpOworICAgICAgICB3cml0ZVBheWxvYWRUbyhjb250ZW50SGFuZGxlcixlcnJvckhhbmRsZXIsIHRydWUpOworICAgICAgICBjb250ZW50SGFuZGxlci5lbmRFbGVtZW50KHNvYXBOc1VyaSwiQm9keSIsIlM6Qm9keSIpOworICAgICAgICBjb250ZW50SGFuZGxlci5lbmRFbGVtZW50KHNvYXBOc1VyaSwiRW52ZWxvcGUiLCJTOkVudmVsb3BlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBwYXlsb2FkIHRvIFNBWCBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQKKyAgICAgKiAgICAgIGlmIHRydWUsIHRoaXMgbWV0aG9kIHdpbGwgZmlyZSBTQVggZXZlbnRzIHdpdGhvdXQgc3RhcnQvZW5kRG9jdW1lbnQgZXZlbnRzLAorICAgICAqICAgICAgc3VpdGFibGUgZm9yIGVtYmVkZGluZyB0aGlzIGludG8gYSBiaWdnZXIgU0FYIGV2ZW50IHNlcXVlbmNlLgorICAgICAqICAgICAgaWYgZmFsc2UsIHRoaXMgbWV0aG9kIGdlbmVyYWV0cyBhIGNvbXBsZXRlbHkgU0FYIGV2ZW50IHNlcXVlbmNlIG9uIGl0cyBvd24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVQYXlsb2FkVG8oQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIGJvb2xlYW4gZnJhZ21lbnQpIHRocm93cyBTQVhFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB7QGxpbmsgI3dyaXRlVG8oQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlcil9CisgICAgICovCisgICAgcHVibGljIFNPQVBNZXNzYWdlIHJlYWRBc1NPQVBNZXNzYWdlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBzb2FwVmVyc2lvbi5zYWFqTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOworICAgICAgICBTQVgyRE9NRXggczJkID0gbmV3IFNBWDJET01FeChtc2cuZ2V0U09BUFBhcnQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZVRvKHMyZCwgWG1sVXRpbC5EUkFDT05JQU5fRVJST1JfSEFORExFUik7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoQXR0YWNobWVudCBhdHQgOiBnZXRBdHRhY2htZW50cygpKSB7CisgICAgICAgICAgICBBdHRhY2htZW50UGFydCBwYXJ0ID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7CisgICAgICAgICAgICBwYXJ0LnNldERhdGFIYW5kbGVyKGF0dC5hc0RhdGFIYW5kbGVyKCkpOworICAgICAgICAgICAgcGFydC5zZXRDb250ZW50SWQoJzwnK2F0dC5nZXRDb250ZW50SWQoKSsnPicpOworICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KHBhcnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtc2c7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU09BUE1lc3NhZ2UgcmVhZEFzU09BUE1lc3NhZ2UoUGFja2V0IHBhY2tldCwgYm9vbGVhbiBpbmJvdW5kKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IHJlYWRBc1NPQVBNZXNzYWdlKCk7CisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycyA9IG51bGw7CisgICAgICAgIFN0cmluZyBrZXkgPSBpbmJvdW5kID8gUGFja2V0LklOQk9VTkRfVFJBTlNQT1JUX0hFQURFUlMgOiBQYWNrZXQuT1VUQk9VTkRfVFJBTlNQT1JUX0hFQURFUlM7CisgICAgICAgIGlmIChwYWNrZXQuc3VwcG9ydHMoa2V5KSkgeworICAgICAgICAgICAgaGVhZGVycyA9IChNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KXBhY2tldC5nZXQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlIDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFlLmdldEtleSgpLmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtVHlwZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcihTdHJpbmcgdmFsdWUgOiBlLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5nZXRNaW1lSGVhZGVycygpLmFkZEhlYWRlcihlLmdldEtleSgpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXNnLnNhdmVDaGFuZ2VzKCk7CisgICAgICAgIHJldHVybiBtc2c7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXNJbXBsIEVNUFRZX0FUVFMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvY2F0b3JJbXBsIE5VTExfTE9DQVRPUiA9IG5ldyBMb2NhdG9ySW1wbCgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9BdHRhY2htZW50U2V0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9BdHRhY2htZW50U2V0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWE2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0F0dGFjaG1lbnRTZXRJbXBsLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogRGVmYXVsdCBkdW1iIHtAbGluayBBdHRhY2htZW50U2V0fSBpbXBsZW1lbnRhdGlvbiBiYWNrZWQgYnkge0BsaW5rIEFycmF5TGlzdH0uCisgKgorICogPHA+CisgKiBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgdGhlIG51bWJlciBvZiBhdHRhY2htZW50cyBhcmUgc21hbGwgZW5vdWdoIHRvCisgKiBqdXN0aWZ5IGxpbmVhciBzZWFyY2ggaW4ge0BsaW5rICNnZXQoU3RyaW5nKX0uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXR0YWNobWVudFNldEltcGwgaW1wbGVtZW50cyBBdHRhY2htZW50U2V0IHsKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEF0dGFjaG1lbnQ+IGF0dExpc3QgPSBuZXcgQXJyYXlMaXN0PEF0dGFjaG1lbnQ+KCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHtAbGluayBBdHRhY2htZW50U2V0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0YWNobWVudFNldEltcGwoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQXR0YWNobWVudFNldH0gYnkgY29weWluZyBjb250ZW50cyBmcm9tIGFub3RoZXIuCisgICAgICovCisgICAgcHVibGljIEF0dGFjaG1lbnRTZXRJbXBsKEl0ZXJhYmxlPEF0dGFjaG1lbnQ+IGJhc2UpIHsKKyAgICAgICAgZm9yIChBdHRhY2htZW50IGEgOiBiYXNlKQorICAgICAgICAgICAgYWRkKGEpOworICAgIH0KKworICAgIHB1YmxpYyBBdHRhY2htZW50IGdldChTdHJpbmcgY29udGVudElkKSB7CisgICAgICAgIGZvciggaW50IGk9YXR0TGlzdC5zaXplKCktMTsgaT49MDsgaS0tICkgeworICAgICAgICAgICAgQXR0YWNobWVudCBhID0gYXR0TGlzdC5nZXQoaSk7CisgICAgICAgICAgICBpZihhLmdldENvbnRlbnRJZCgpLmVxdWFscyhjb250ZW50SWQpKQorICAgICAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBhdHRMaXN0LmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGQoQXR0YWNobWVudCBhdHQpIHsKKyAgICAgICAgYXR0TGlzdC5hZGQoYXR0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8QXR0YWNobWVudD4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBhdHRMaXN0Lml0ZXJhdG9yKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0F0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0F0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2YjIxOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvQXR0YWNobWVudFVubWFyc2hhbGxlckltcGwuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5NaW1lTXVsdGlwYXJ0UGFyc2VyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5FbmNvZGluZ01lc3NhZ2VzOworCitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRVbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEF0dGFjaG1lbnRVbm1hcnNoYWxsZXJ9IHRoYXQgdXNlcworICogbG9hZHMgYXR0YWNobWVudHMgZnJvbSB7QGxpbmsgQXR0YWNobWVudFNldH0gZGlyZWN0bHkuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqIEBzZWUgTWltZU11bHRpcGFydFBhcnNlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXR0YWNobWVudFVubWFyc2hhbGxlckltcGwgZXh0ZW5kcyBBdHRhY2htZW50VW5tYXJzaGFsbGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgQXR0YWNobWVudFNldCBhdHRhY2htZW50czsKKworICAgIHB1YmxpYyBBdHRhY2htZW50VW5tYXJzaGFsbGVySW1wbChBdHRhY2htZW50U2V0IGF0dGFjaG1lbnRzKSB7CisgICAgICAgIHRoaXMuYXR0YWNobWVudHMgPSBhdHRhY2htZW50czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0YUhhbmRsZXIgZ2V0QXR0YWNobWVudEFzRGF0YUhhbmRsZXIoU3RyaW5nIGNpZCkgeworICAgICAgICBBdHRhY2htZW50IGEgPSBhdHRhY2htZW50cy5nZXQoc3RyaXBTY2hlbWUoY2lkKSk7CisgICAgICAgIGlmKGE9PW51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihFbmNvZGluZ01lc3NhZ2VzLk5PX1NVQ0hfQ09OVEVOVF9JRChjaWQpKTsKKyAgICAgICAgcmV0dXJuIGEuYXNEYXRhSGFuZGxlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZ2V0QXR0YWNobWVudEFzQnl0ZUFycmF5KFN0cmluZyBjaWQpIHsKKyAgICAgICAgQXR0YWNobWVudCBhID0gYXR0YWNobWVudHMuZ2V0KHN0cmlwU2NoZW1lKGNpZCkpOworICAgICAgICBpZihhPT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRW5jb2RpbmdNZXNzYWdlcy5OT19TVUNIX0NPTlRFTlRfSUQoY2lkKSk7CisgICAgICAgIHJldHVybiBhLmFzQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIENJRCByZWZlcmVuY2UgaGFzICdjaWQ6JyBwcmVmaXgsIHNvIGdldCByaWQgb2YgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyaXBTY2hlbWUoU3RyaW5nIGNpZCkgeworICAgICAgICBpZihjaWQuc3RhcnRzV2l0aCgiY2lkOiIpKSAvLyB3b3JrIGRlZmVuc2l2ZWx5LCBpbiBjYXNlIHRoZSBpbnB1dCBpcyB3cm9uZworICAgICAgICAgICAgY2lkID0gY2lkLnN1YnN0cmluZyg0KTsKKyAgICAgICAgcmV0dXJuIGNpZDsKKyAgICB9CisKKyAgICAvLyBUT0RPIGZpeCB0aGUgaGFjaworICAgIC8vIFNvIHRoYXQgU0FBSiByZWdpc3RlcnMgRENIcyBmb3IgTUlNRSB0eXBlcworICAgIHN0YXRpYyB7CisgICAgICAgIG5ldyBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLkF0dGFjaG1lbnRQYXJ0SW1wbCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvQnl0ZUFycmF5QXR0YWNobWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9CeXRlQXJyYXlBdHRhY2htZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1NjJiZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvQnl0ZUFycmF5QXR0YWNobWVudC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkJ5dGVBcnJheURhdGFTb3VyY2U7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCeXRlQXJyYXlBdHRhY2htZW50IGltcGxlbWVudHMgQXR0YWNobWVudCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZW50SWQ7CisgICAgcHJpdmF0ZSBieXRlW10gZGF0YTsKKyAgICBwcml2YXRlIGludCBzdGFydDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBsZW47CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWltZVR5cGU7CisKKyAgICBwdWJsaWMgQnl0ZUFycmF5QXR0YWNobWVudChATm90TnVsbCBTdHJpbmcgY29udGVudElkLCBieXRlW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgdGhpcy5jb250ZW50SWQgPSBjb250ZW50SWQ7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICAgICAgdGhpcy5sZW4gPSBsZW47CisgICAgICAgIHRoaXMubWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnl0ZUFycmF5QXR0YWNobWVudChATm90TnVsbCBTdHJpbmcgY29udGVudElkLCBieXRlW10gZGF0YSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIHRoaXMoY29udGVudElkLCBkYXRhLCAwLCBkYXRhLmxlbmd0aCwgbWltZVR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudElkKCkgeworICAgICAgICByZXR1cm4gY29udGVudElkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBtaW1lVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGFzQnl0ZUFycmF5KCkgeworICAgICAgICBpZihzdGFydCE9MCB8fCBsZW4hPWRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBpZiBvdXIgYnVmZmVyIGlzbid0IGV4YWN0LCBzd2l0Y2ggdG8gdGhlIGV4YWN0IG9uZQorICAgICAgICAgICAgYnl0ZVtdIGV4YWN0ID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSxzdGFydCxleGFjdCwwLGxlbik7CisgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICBkYXRhID0gZXhhY3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIERhdGFIYW5kbGVyIGFzRGF0YUhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoZGF0YSxzdGFydCxsZW4sZ2V0Q29udGVudFR5cGUoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBTb3VyY2UgYXNTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKGFzSW5wdXRTdHJlYW0oKSk7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGFzSW5wdXRTdHJlYW0oKSB7CisgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEsc3RhcnQsbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3Mud3JpdGUoYXNCeXRlQXJyYXkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTT0FQTWVzc2FnZSBzYWFqKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIEF0dGFjaG1lbnRQYXJ0IHBhcnQgPSBzYWFqLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7CisgICAgICAgIHBhcnQuc2V0RGF0YUhhbmRsZXIoYXNEYXRhSGFuZGxlcigpKTsKKyAgICAgICAgcGFydC5zZXRDb250ZW50SWQoY29udGVudElkKTsKKyAgICAgICAgc2Fhai5hZGRBdHRhY2htZW50UGFydChwYXJ0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvRE9NSGVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0RPTUhlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmYzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0RPTUhlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2VDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyLkRPTVNjYW5uZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoucGFja2FnaW5nLm1pbWUuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5ET01TdHJlYW1SZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5ET01VdGlsOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworCisvKioKKyAqIHtAbGluayBIZWFkZXJ9IGltcGxlbWVudGF0aW9uIGZvciBhIERPTS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBjbGFzcyBET01IZWFkZXI8TiBleHRlbmRzIEVsZW1lbnQ+IGV4dGVuZHMgQWJzdHJhY3RIZWFkZXJJbXBsIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTiBub2RlOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbnNVcmk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lOworCisgICAgcHVibGljIERPTUhlYWRlcihOIG5vZGUpIHsKKyAgICAgICAgYXNzZXJ0IG5vZGUhPW51bGw7CisgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisKKyAgICAgICAgdGhpcy5uc1VyaSA9IGZpeE51bGwobm9kZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbm9kZS5nZXRMb2NhbE5hbWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gbnNVcmk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkSGVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIERPTVN0cmVhbVJlYWRlciByID0gbmV3IERPTVN0cmVhbVJlYWRlcihub2RlKTsKKyAgICAgICAgci5uZXh0VGFnKCk7ICAgIC8vIG1vdmUgYWhlYWQgdG8gdGhlIHN0YXJ0IHRhZworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEFzSkFYQihVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoVCkgdW5tYXJzaGFsbGVyLnVubWFyc2hhbChub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEFzSkFYQihCcmlkZ2U8VD4gYnJpZGdlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBicmlkZ2UudW5tYXJzaGFsKG5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oWE1MU3RyZWFtV3JpdGVyIHcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBET01VdGlsLnNlcmlhbGl6ZU5vZGUobm9kZSwgdyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYocyE9bnVsbCkgICAgIHJldHVybiBzOworICAgICAgICBlbHNlICAgICAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBET01TY2FubmVyIGRzID0gbmV3IERPTVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0Q29udGVudEhhbmRsZXIoY29udGVudEhhbmRsZXIpOworICAgICAgICBkcy5zY2FuKG5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuc1VyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBpZihuc1VyaS5sZW5ndGgoKT09MCkgICBuc1VyaT1udWxsOyAvLyBET00gd2FudHMgbnVsbCwgbm90ICIiLgorICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGVOUyhuc1VyaSxsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU09BUE1lc3NhZ2Ugc2FhaikgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IHNhYWouZ2V0U09BUEhlYWRlcigpOworICAgICAgICBOb2RlIGNsb25lID0gaGVhZGVyLmdldE93bmVyRG9jdW1lbnQoKS5pbXBvcnROb2RlKG5vZGUsdHJ1ZSk7CisgICAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChjbG9uZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdDb250ZW50KCkgeworICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXh0Q29udGVudCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvRE9NTWVzc2FnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9ET01NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlZGM1OQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvRE9NTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLkZyYWdtZW50Q29udGVudEhhbmRsZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyLkRPTVNjYW5uZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlckxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuRE9NU3RyZWFtUmVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuRE9NVXRpbDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CisKKy8qKgorICoge0BsaW5rIE1lc3NhZ2V9IGJhY2tlZCBieSBhIERPTSB7QGxpbmsgRWxlbWVudH0gdGhhdCByZXByZXNlbnRzIHRoZSBwYXlsb2FkLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERPTU1lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VJbXBsIHsKKyAgICBwcml2YXRlIEhlYWRlckxpc3QgaGVhZGVyczsKKyAgICBwcml2YXRlIGZpbmFsIEVsZW1lbnQgcGF5bG9hZDsKKworICAgIHB1YmxpYyBET01NZXNzYWdlKFNPQVBWZXJzaW9uIHZlciwgRWxlbWVudCBwYXlsb2FkKSB7CisgICAgICAgIHRoaXModmVyLG51bGwscGF5bG9hZCk7CisgICAgfQorCisgICAgcHVibGljIERPTU1lc3NhZ2UoU09BUFZlcnNpb24gdmVyLCBIZWFkZXJMaXN0IGhlYWRlcnMsIEVsZW1lbnQgcGF5bG9hZCkgeworICAgICAgICBzdXBlcih2ZXIpOworICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOworICAgICAgICBhc3NlcnQgcGF5bG9hZCE9bnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGEgY29udmVuaWVuY2UgYW5kIGNhbGxlZCBieSB0aGUge0BsaW5rICNjb3B5fQorICAgICAqLworICAgIHByaXZhdGUgRE9NTWVzc2FnZShET01NZXNzYWdlIHRoYXQpIHsKKyAgICAgICAgc3VwZXIodGhhdCk7CisgICAgICAgIHRoaXMuaGVhZGVycyA9IEhlYWRlckxpc3QuY29weSh0aGF0LmhlYWRlcnMpOworICAgICAgICB0aGlzLnBheWxvYWQgPSB0aGF0LnBheWxvYWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzSGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldEhlYWRlcnMoKS5zaXplKCkgPiAwOworICAgIH0KKworICAgIHB1YmxpYyBIZWFkZXJMaXN0IGdldEhlYWRlcnMoKSB7CisgICAgICAgIGlmIChoZWFkZXJzID09IG51bGwpCisgICAgICAgICAgICBoZWFkZXJzID0gbmV3IEhlYWRlckxpc3QoKTsKKworICAgICAgICByZXR1cm4gaGVhZGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBheWxvYWRMb2NhbFBhcnQoKSB7CisgICAgICAgIHJldHVybiBwYXlsb2FkLmdldExvY2FsTmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF5bG9hZE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUGF5bG9hZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIFNvdXJjZSByZWFkUGF5bG9hZEFzU291cmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IERPTVNvdXJjZShwYXlsb2FkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZFBheWxvYWRBc0pBWEIoVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBpZihoYXNBdHRhY2htZW50cygpKQorICAgICAgICAgICAgdW5tYXJzaGFsbGVyLnNldEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIobmV3IEF0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsKGdldEF0dGFjaG1lbnRzKCkpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoVCl1bm1hcnNoYWxsZXIudW5tYXJzaGFsKHBheWxvYWQpOworICAgICAgICB9IGZpbmFsbHl7CisgICAgICAgICAgICB1bm1hcnNoYWxsZXIuc2V0QXR0YWNobWVudFVubWFyc2hhbGxlcihudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyA8VD4gVCByZWFkUGF5bG9hZEFzSkFYQihCcmlkZ2U8VD4gYnJpZGdlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBicmlkZ2UudW5tYXJzaGFsKHBheWxvYWQsCisgICAgICAgICAgICBoYXNBdHRhY2htZW50cygpPyBuZXcgQXR0YWNobWVudFVubWFyc2hhbGxlckltcGwoZ2V0QXR0YWNobWVudHMoKSkgOiBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIHJlYWRQYXlsb2FkKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIERPTVN0cmVhbVJlYWRlciBkc3MgPSBuZXcgRE9NU3RyZWFtUmVhZGVyKCk7CisgICAgICAgIGRzcy5zZXRDdXJyZW50Tm9kZShwYXlsb2FkKTsKKyAgICAgICAgZHNzLm5leHRUYWcoKTsKKyAgICAgICAgYXNzZXJ0IGRzcy5nZXRFdmVudFR5cGUoKT09WE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQ7CisgICAgICAgIHJldHVybiBkc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVQYXlsb2FkVG8oWE1MU3RyZWFtV3JpdGVyIHN3KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocGF5bG9hZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIERPTVV0aWwuc2VyaWFsaXplTm9kZShwYXlsb2FkLCBzdyk7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlUGF5bG9hZFRvKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBib29sZWFuIGZyYWdtZW50KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoZnJhZ21lbnQpCisgICAgICAgICAgICBjb250ZW50SGFuZGxlciA9IG5ldyBGcmFnbWVudENvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKTsKKyAgICAgICAgRE9NU2Nhbm5lciBkcyA9IG5ldyBET01TY2FubmVyKCk7CisgICAgICAgIGRzLnNldENvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKTsKKyAgICAgICAgZHMuc2NhbihwYXlsb2FkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZSBjb3B5KCkgeworICAgICAgICByZXR1cm4gbmV3IERPTU1lc3NhZ2UodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9EYXRhSGFuZGxlckF0dGFjaG1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvRGF0YUhhbmRsZXJBdHRhY2htZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1M2I0NAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvRGF0YUhhbmRsZXJBdHRhY2htZW50LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOworCitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CisKKy8qKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERhdGFIYW5kbGVyQXR0YWNobWVudCBpbXBsZW1lbnRzIEF0dGFjaG1lbnQgeworICAgIC8vIFRPRE8gZml4IHRoZSBoYWNrCisgICAgLy8gU28gdGhhdCBTQUFKIHJlZ2lzdGVycyBEQ0hzIGZvciBNSU1FIHR5cGVzCisgICAgc3RhdGljIHsKKyAgICAgICAgbmV3IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuQXR0YWNobWVudFBhcnRJbXBsKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhSGFuZGxlciBkaDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZW50SWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHdpbGwgYmUgY29uc3RydWN0ZWQgYnkge0BsaW5rIEF0dGFjaG1lbnRNYXJzaGFsbGVySW1wbH0KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YUhhbmRsZXJBdHRhY2htZW50KEBOb3ROdWxsIFN0cmluZyBjb250ZW50SWQsIEBOb3ROdWxsIERhdGFIYW5kbGVyIGRoKSB7CisgICAgICAgIHRoaXMuZGggPSBkaDsKKyAgICAgICAgdGhpcy5jb250ZW50SWQgPSBjb250ZW50SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50SWQoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGRoLmdldENvbnRlbnRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBhc0J5dGVBcnJheSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGRoLndyaXRlVG8ob3MpOworICAgICAgICAgICAgcmV0dXJuIG9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERhdGFIYW5kbGVyIGFzRGF0YUhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBkaDsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlIGFzU291cmNlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UoZGguZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGFzSW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZGguZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3Mud3JpdGUoYXNCeXRlQXJyYXkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTT0FQTWVzc2FnZSBzYWFqKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIEF0dGFjaG1lbnRQYXJ0IHBhcnQgPSBzYWFqLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7CisgICAgICAgIHBhcnQuc2V0RGF0YUhhbmRsZXIoZGgpOworICAgICAgICBwYXJ0LnNldENvbnRlbnRJZChjb250ZW50SWQpOworICAgICAgICBzYWFqLmFkZEF0dGFjaG1lbnRQYXJ0KHBhcnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvRW1wdHlNZXNzYWdlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9FbXB0eU1lc3NhZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyYmM5OAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvRW1wdHlNZXNzYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnRTZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlckxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKKworLyoqCisgKiB7QGxpbmsgTWVzc2FnZX0gdGhhdCBoYXMgbm8gYm9keS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eU1lc3NhZ2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlSW1wbCB7CisKKyAgICAvKioKKyAgICAgKiBJZiBhIG1lc3NhZ2UgaGFzIG5vIHBheWxvYWQsIGl0J3MgbW9yZSBsaWtlbHkgdG8gaGF2ZQorICAgICAqIHNvbWUgaGVhZGVyLCBzbyB3ZSBjcmVhdGUgaXQgZWFnZXJseSBoZXJlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgSGVhZGVyTGlzdCBoZWFkZXJzOworICAgIHByaXZhdGUgZmluYWwgQXR0YWNobWVudFNldCBhdHRhY2htZW50U2V0OworCisgICAgcHVibGljIEVtcHR5TWVzc2FnZUltcGwoU09BUFZlcnNpb24gdmVyc2lvbikgeworICAgICAgICBzdXBlcih2ZXJzaW9uKTsKKyAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlckxpc3QoKTsKKyAgICAgICAgdGhpcy5hdHRhY2htZW50U2V0ID0gbmV3IEF0dGFjaG1lbnRTZXRJbXBsKCk7CisgICAgfQorCisgICAgcHVibGljIEVtcHR5TWVzc2FnZUltcGwoSGVhZGVyTGlzdCBoZWFkZXJzLCBATm90TnVsbCBBdHRhY2htZW50U2V0IGF0dGFjaG1lbnRTZXQsIFNPQVBWZXJzaW9uIHZlcnNpb24peworICAgICAgICBzdXBlcih2ZXJzaW9uKTsKKyAgICAgICAgaWYoaGVhZGVycz09bnVsbCkKKyAgICAgICAgICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVyTGlzdCgpOworICAgICAgICB0aGlzLmF0dGFjaG1lbnRTZXQgPSBhdHRhY2htZW50U2V0OworICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBFbXB0eU1lc3NhZ2VJbXBsKEVtcHR5TWVzc2FnZUltcGwgdGhhdCkgeworICAgICAgICBzdXBlcih0aGF0KTsKKyAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlckxpc3QodGhhdC5oZWFkZXJzKTsKKyAgICAgICAgdGhpcy5hdHRhY2htZW50U2V0ID0gdGhhdC5hdHRhY2htZW50U2V0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiAhaGVhZGVycy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOb3ROdWxsIEF0dGFjaG1lbnRTZXQgZ2V0QXR0YWNobWVudHMoKSB7CisgICAgICAgIHJldHVybiBhdHRhY2htZW50U2V0OworICAgIH0KKworICAgIHB1YmxpYyBIZWFkZXJMaXN0IGdldEhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF5bG9hZExvY2FsUGFydCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXlsb2FkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFNvdXJjZSByZWFkUGF5bG9hZEFzU291cmNlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIHJlYWRQYXlsb2FkKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlUGF5bG9hZFRvKFhNTFN0cmVhbVdyaXRlciBzdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG5vb3AKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVBheWxvYWRUbyhDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgYm9vbGVhbiBmcmFnbWVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG5vb3AKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZSBjb3B5KCkgeworICAgICAgICByZXR1cm4gbmV3IEVtcHR5TWVzc2FnZUltcGwodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9GYXVsdERldGFpbEhlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9GYXVsdERldGFpbEhlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWQ2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0ZhdWx0RGV0YWlsSGVhZGVyLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgQXJ1biBHdXB0YQorICovCitwdWJsaWMgY2xhc3MgRmF1bHREZXRhaWxIZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdEhlYWRlckltcGwgeworCisgICAgcHJpdmF0ZSBBZGRyZXNzaW5nVmVyc2lvbiBhdjsKKyAgICBwcml2YXRlIFN0cmluZyB3cmFwcGVyOworICAgIHByaXZhdGUgU3RyaW5nIHByb2JsZW1WYWx1ZSA9IG51bGw7CisKKyAgICBwdWJsaWMgRmF1bHREZXRhaWxIZWFkZXIoQWRkcmVzc2luZ1ZlcnNpb24gYXYsIFN0cmluZyB3cmFwcGVyLCBRTmFtZSBwcm9ibGVtSGVhZGVyKSB7CisgICAgICAgIHRoaXMuYXYgPSBhdjsKKyAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICAgICAgdGhpcy5wcm9ibGVtVmFsdWUgPSBwcm9ibGVtSGVhZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIEZhdWx0RGV0YWlsSGVhZGVyKEFkZHJlc3NpbmdWZXJzaW9uIGF2LCBTdHJpbmcgd3JhcHBlciwgU3RyaW5nIHByb2JsZW1WYWx1ZSkgeworICAgICAgICB0aGlzLmF2ID0gYXY7CisgICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICAgIHRoaXMucHJvYmxlbVZhbHVlID0gcHJvYmxlbVZhbHVlOworICAgIH0KKworICAgIHB1YmxpYworICAgIEBOb3ROdWxsCisgICAgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIGF2Lm5zVXJpOworICAgIH0KKworICAgIHB1YmxpYworICAgIEBOb3ROdWxsCisgICAgU3RyaW5nIGdldExvY2FsUGFydCgpIHsKKyAgICAgICAgcmV0dXJuIGF2LmZhdWx0RGV0YWlsVGFnLmdldExvY2FsUGFydCgpOworICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKEBOb3ROdWxsIFN0cmluZyBuc1VyaSwgQE5vdE51bGwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIHJlYWRIZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciBidWYgPSBuZXcgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcigpOworICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgdyA9IGJ1Zi5jcmVhdGVGcm9tWE1MU3RyZWFtV3JpdGVyKCk7CisgICAgICAgIHdyaXRlVG8odyk7CisgICAgICAgIHJldHVybiBidWYucmVhZEFzWE1MU3RyZWFtUmVhZGVyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhYTUxTdHJlYW1Xcml0ZXIgdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQoIiIsIGF2LmZhdWx0RGV0YWlsVGFnLmdldExvY2FsUGFydCgpLCBhdi5mYXVsdERldGFpbFRhZy5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIHcud3JpdGVEZWZhdWx0TmFtZXNwYWNlKGF2Lm5zVXJpKTsKKyAgICAgICAgdy53cml0ZVN0YXJ0RWxlbWVudCgiIiwgd3JhcHBlciwgYXYubnNVcmkpOworICAgICAgICB3LndyaXRlQ2hhcmFjdGVycyhwcm9ibGVtVmFsdWUpOworICAgICAgICB3LndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB3LndyaXRlRW5kRWxlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU09BUE1lc3NhZ2Ugc2FhaikgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IHNhYWouZ2V0U09BUEhlYWRlcigpOworICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBzaGUgPSBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudChhdi5mYXVsdERldGFpbFRhZyk7CisgICAgICAgIHNoZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KG5ldyBRTmFtZShhdi5uc1VyaSwgd3JhcHBlcikpOworICAgICAgICBzaGUuYWRkVGV4dE5vZGUocHJvYmxlbVZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvbnRlbnRIYW5kbGVyIGgsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbnNVcmkgPSBhdi5uc1VyaTsKKyAgICAgICAgU3RyaW5nIGxuID0gYXYuZmF1bHREZXRhaWxUYWcuZ2V0TG9jYWxQYXJ0KCk7CisKKyAgICAgICAgaC5zdGFydFByZWZpeE1hcHBpbmcoIiIsbnNVcmkpOworICAgICAgICBoLnN0YXJ0RWxlbWVudChuc1VyaSxsbixsbixFTVBUWV9BVFRTKTsKKyAgICAgICAgaC5zdGFydEVsZW1lbnQobnNVcmksd3JhcHBlcix3cmFwcGVyLEVNUFRZX0FUVFMpOworICAgICAgICBoLmNoYXJhY3RlcnMocHJvYmxlbVZhbHVlLnRvQ2hhckFycmF5KCksMCxwcm9ibGVtVmFsdWUubGVuZ3RoKCkpOworICAgICAgICBoLmVuZEVsZW1lbnQobnNVcmksd3JhcHBlcix3cmFwcGVyKTsKKyAgICAgICAgaC5lbmRFbGVtZW50KG5zVXJpLGxuLGxuKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0pBWEJBdHRhY2htZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL0pBWEJBdHRhY2htZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjODc0YwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvSkFYQkF0dGFjaG1lbnQuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2U7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai51dGlsLkJ5dGVPdXRwdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkFTQ0lJVXRpbGl0eTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkJ5dGVBcnJheURhdGFTb3VyY2U7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKQVhCQXR0YWNobWVudCBpbXBsZW1lbnRzIEF0dGFjaG1lbnQsIERhdGFTb3VyY2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudElkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1pbWVUeXBlOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGpheGJPYmplY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBCcmlkZ2UgYnJpZGdlOworCisgICAgcHVibGljIEpBWEJBdHRhY2htZW50KEBOb3ROdWxsIFN0cmluZyBjb250ZW50SWQsIE9iamVjdCBqYXhiT2JqZWN0LCBCcmlkZ2UgYnJpZGdlLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgdGhpcy5jb250ZW50SWQgPSBjb250ZW50SWQ7CisgICAgICAgIHRoaXMuamF4Yk9iamVjdCA9IGpheGJPYmplY3Q7CisgICAgICAgIHRoaXMuYnJpZGdlID0gYnJpZGdlOworICAgICAgICB0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50SWQoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1pbWVUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gYXNCeXRlQXJyYXkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQVNDSUlVdGlsaXR5LmdldEJ5dGVzKGFzSW5wdXRTdHJlYW0oKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERhdGFIYW5kbGVyIGFzRGF0YUhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0YUhhbmRsZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIFNvdXJjZSBhc1NvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UoYXNJbnB1dFN0cmVhbSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gYXNJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgQnl0ZU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVUbyhib3MpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm9zLm5ld0lucHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBicmlkZ2UubWFyc2hhbChqYXhiT2JqZWN0LCBvcywgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFNPQVBNZXNzYWdlIHNhYWopIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0YWNobWVudFBhcnQgcGFydCA9IHNhYWouY3JlYXRlQXR0YWNobWVudFBhcnQoKTsKKyAgICAgICAgcGFydC5zZXREYXRhSGFuZGxlcihhc0RhdGFIYW5kbGVyKCkpOworICAgICAgICBwYXJ0LnNldENvbnRlbnRJZChjb250ZW50SWQpOworICAgICAgICBzYWFqLmFkZEF0dGFjaG1lbnRQYXJ0KHBhcnQpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhc0lucHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9NaW1lQXR0YWNobWVudFNldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9NaW1lQXR0YWNobWVudFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTMwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL01pbWVBdHRhY2htZW50U2V0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnRTZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5NaW1lTXVsdGlwYXJ0UGFyc2VyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtLlN0cmVhbUF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkVuY29kaW5nTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIHtAbGluayBBdHRhY2htZW50U2V0fSBiYWNrZWQgYnkge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLk1pbWVNdWx0aXBhcnRQYXJzZXJ9CisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1pbWVBdHRhY2htZW50U2V0IGltcGxlbWVudHMgQXR0YWNobWVudFNldCB7CisgICAgcHJpdmF0ZSBmaW5hbCBNaW1lTXVsdGlwYXJ0UGFyc2VyIG1wcDsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF0dGFjaG1lbnQ+IGF0dHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF0dGFjaG1lbnQ+KCk7CisKKworICAgIHB1YmxpYyBNaW1lQXR0YWNobWVudFNldChNaW1lTXVsdGlwYXJ0UGFyc2VyIG1wcCkgeworICAgICAgICB0aGlzLm1wcCA9IG1wcDsKKyAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgQXR0YWNobWVudCBnZXQoU3RyaW5nIGNvbnRlbnRJZCkgeworICAgICAgICBBdHRhY2htZW50IGF0dDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpcnN0IHRyeSB0byBnZXQgdGhlIEF0dGFjaG1lbnQgZnJvbSBpbnRlcm5hbCBtYXAsIG1heWJlIHRoaXMgYXR0YWNobWVudAorICAgICAgICAgKiBpcyBhZGRlZCBieSB0aGUgdXNlci4KKyAgICAgICAgICovCisgICAgICAgIGF0dCA9IGF0dHMuZ2V0KGNvbnRlbnRJZCk7CisgICAgICAgIGlmKGF0dCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGF0dDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQXR0YWNobWVudCBpcyBub3QgZm91bmQgaW4gdGhlIGludGVybmFsIG1hcCwgbm93IGRvIGxvb2sgaW4KKyAgICAgICAgICAgICAqIHRoZSBtcHAsIGlmIGZvdW5kIGFkZCB0byB0aGUgaW50ZXJuYWwgQXR0YWNobWVudCBtYXAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGF0dCA9IG1wcC5nZXRBdHRhY2htZW50UGFydChjb250ZW50SWQpOworICAgICAgICAgICAgaWYoYXR0ICE9IG51bGwpeworICAgICAgICAgICAgICAgIGF0dHMucHV0KGNvbnRlbnRJZCwgYXR0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oRW5jb2RpbmdNZXNzYWdlcy5OT19TVUNIX0NPTlRFTlRfSUQoY29udGVudElkKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGV4cGVuc2l2ZSBvcGVyYXRpb24sIGl0cyBnb2luZyB0byB0byByZWFkIGFsbCB0aGUgdW5kZXJseWluZworICAgICAqIGF0dGFjaG1lbnRzIGluIHtAbGluayBNaW1lTXVsdGlwYXJ0UGFyc2VyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gYXR0cy5zaXplKCkgPD0gMCAmJiBtcHAuZ2V0QXR0YWNobWVudFBhcnRzKCkuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChBdHRhY2htZW50IGF0dCkgeworICAgICAgICBhdHRzLnB1dChhdHQuZ2V0Q29udGVudElkKCksIGF0dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhwZW5zaXZlIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8QXR0YWNobWVudD4gaXRlcmF0b3IoKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCcm93c2UgdGhydSBhbGwgdGhlIGF0dGFjaG1lbnRzIGluIHRoZSBtcHAsIGFkZCB0aGVtIHRvICNhdHRzLAorICAgICAgICAgKiB0aGVuIHJldHVybiB3aGV0aGVyIGl0cyBlbXB0eS4KKyAgICAgICAgICovCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmVhbUF0dGFjaG1lbnQ+IGF0dGFjaG1lbnRzID0gbXBwLmdldEF0dGFjaG1lbnRQYXJ0cygpOworICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgU3RyZWFtQXR0YWNobWVudD4gYXR0IDogYXR0YWNobWVudHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYoYXR0cy5nZXQoYXR0LmdldEtleSgpKSA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICBhdHRzLnB1dChhdHQuZ2V0S2V5KCksIGF0dC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhdHRzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9Qcm9ibGVtQWN0aW9uSGVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL1Byb2JsZW1BY3Rpb25IZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU3NjhhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9Qcm9ibGVtQWN0aW9uSGVhZGVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLk11dGFibGVYTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKKworLyoqCisgKiB7QGxpbmsgSGVhZGVyfSB0aGF0IHJlcHJlc2VudHMgJmx0O3dzYTpQcm9ibGVtQWN0aW9uPgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9ibGVtQWN0aW9uSGVhZGVyIGV4dGVuZHMgQWJzdHJhY3RIZWFkZXJJbXBsIHsKKyAgICBwcm90ZWN0ZWQgQE5vdE51bGwgU3RyaW5nIGFjdGlvbjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNvYXBBY3Rpb247CisgICAgcHJvdGVjdGVkIEBOb3ROdWxsIEFkZHJlc3NpbmdWZXJzaW9uIGF2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGFjdGlvbkxvY2FsTmFtZSA9ICJBY3Rpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb2FwQWN0aW9uTG9jYWxOYW1lID0gIlNvYXBBY3Rpb24iOworCisgICAgcHVibGljIFByb2JsZW1BY3Rpb25IZWFkZXIoQE5vdE51bGwgU3RyaW5nIGFjdGlvbiwgQE5vdE51bGwgQWRkcmVzc2luZ1ZlcnNpb24gYXYpIHsKKyAgICAgICAgdGhpcyhhY3Rpb24sbnVsbCxhdik7CisgICAgfQorCisgICAgcHVibGljIFByb2JsZW1BY3Rpb25IZWFkZXIoQE5vdE51bGwgU3RyaW5nIGFjdGlvbiwgU3RyaW5nIHNvYXBBY3Rpb24sIEBOb3ROdWxsIEFkZHJlc3NpbmdWZXJzaW9uIGF2KSB7CisgICAgICAgIGFzc2VydCBhY3Rpb24hPW51bGw7CisgICAgICAgIGFzc2VydCBhdiE9bnVsbDsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgICAgIHRoaXMuc29hcEFjdGlvbiA9IHNvYXBBY3Rpb247CisgICAgICAgIHRoaXMuYXYgPSBhdjsKKyAgICB9CisKKyAgICBwdWJsaWMKKyAgICBATm90TnVsbAorICAgIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBhdi5uc1VyaTsKKyAgICB9CisKKyAgICBwdWJsaWMKKyAgICBATm90TnVsbAorICAgIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7CisgICAgICAgIHJldHVybiAiUHJvYmxlbUFjdGlvbiI7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoQE5vdE51bGwgU3RyaW5nIG5zVXJpLCBATm90TnVsbCBTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZEhlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIGJ1ZiA9IG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCk7CisgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3ID0gYnVmLmNyZWF0ZUZyb21YTUxTdHJlYW1Xcml0ZXIoKTsKKyAgICAgICAgd3JpdGVUbyh3KTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5yZWFkQXNYTUxTdHJlYW1SZWFkZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFhNTFN0cmVhbVdyaXRlciB3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdy53cml0ZVN0YXJ0RWxlbWVudCgiIiwgZ2V0TG9jYWxQYXJ0KCksIGdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgdy53cml0ZURlZmF1bHROYW1lc3BhY2UoZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICB3LndyaXRlU3RhcnRFbGVtZW50KGFjdGlvbkxvY2FsTmFtZSk7CisgICAgICAgIHcud3JpdGVDaGFyYWN0ZXJzKGFjdGlvbik7CisgICAgICAgIHcud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQoc29hcEFjdGlvbkxvY2FsTmFtZSk7CisgICAgICAgICAgICB3LndyaXRlQ2hhcmFjdGVycyhzb2FwQWN0aW9uKTsKKyAgICAgICAgICAgIHcud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgdy53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFNPQVBNZXNzYWdlIHNhYWopIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKKyAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBzYWFqLmdldFNPQVBIZWFkZXIoKTsKKyAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc2hlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQobmV3IFFOYW1lKGdldE5hbWVzcGFjZVVSSSgpLCBnZXRMb2NhbFBhcnQoKSkpOworICAgICAgICBzaGUuYWRkQ2hpbGRFbGVtZW50KGFjdGlvbkxvY2FsTmFtZSk7CisgICAgICAgIHNoZS5hZGRUZXh0Tm9kZShhY3Rpb24pOworICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzaGUuYWRkQ2hpbGRFbGVtZW50KHNvYXBBY3Rpb25Mb2NhbE5hbWUpOworICAgICAgICAgICAgc2hlLmFkZFRleHROb2RlKHNvYXBBY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhDb250ZW50SGFuZGxlciBoLCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5zVXJpID0gZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIFN0cmluZyBsbiA9IGdldExvY2FsUGFydCgpOworCisgICAgICAgIGguc3RhcnRQcmVmaXhNYXBwaW5nKCIiLG5zVXJpKTsKKyAgICAgICAgaC5zdGFydEVsZW1lbnQobnNVcmksbG4sbG4sRU1QVFlfQVRUUyk7CisgICAgICAgIGguc3RhcnRFbGVtZW50KG5zVXJpLGFjdGlvbkxvY2FsTmFtZSxhY3Rpb25Mb2NhbE5hbWUsRU1QVFlfQVRUUyk7CisgICAgICAgIGguY2hhcmFjdGVycyhhY3Rpb24udG9DaGFyQXJyYXkoKSwwLGFjdGlvbi5sZW5ndGgoKSk7CisgICAgICAgIGguZW5kRWxlbWVudChuc1VyaSxhY3Rpb25Mb2NhbE5hbWUsYWN0aW9uTG9jYWxOYW1lKTsKKyAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaC5zdGFydEVsZW1lbnQobnNVcmksc29hcEFjdGlvbkxvY2FsTmFtZSxzb2FwQWN0aW9uTG9jYWxOYW1lLEVNUFRZX0FUVFMpOworICAgICAgICAgICAgaC5jaGFyYWN0ZXJzKHNvYXBBY3Rpb24udG9DaGFyQXJyYXkoKSwwLHNvYXBBY3Rpb24ubGVuZ3RoKCkpOworICAgICAgICAgICAgaC5lbmRFbGVtZW50KG5zVXJpLHNvYXBBY3Rpb25Mb2NhbE5hbWUsc29hcEFjdGlvbkxvY2FsTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaC5lbmRFbGVtZW50KG5zVXJpLGxuLGxuKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL1JlbGF0ZXNUb0hlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9SZWxhdGVzVG9IZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFmYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9SZWxhdGVzVG9IZWFkZXIuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworCisvKioKKyAqIFdTLUFkZHJlc3NpbmcgJmx0O1JlbGF0ZXNUbz4gaGVhZGVyLgorICoKKyAqIFVzZWQgZm9yIG91dGJvdW5kIG9ubHkuCisgKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZWxhdGVzVG9IZWFkZXIgZXh0ZW5kcyBTdHJpbmdIZWFkZXIgeworICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFFOYW1lIHR5cGVBdHRyaWJ1dGVOYW1lOworCisgICAgcHVibGljIFJlbGF0ZXNUb0hlYWRlcihRTmFtZSBuYW1lLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgdHlwZSkgeworICAgICAgICBzdXBlcihuYW1lLCBtZXNzYWdlSWQpOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLnR5cGVBdHRyaWJ1dGVOYW1lID0gbmV3IFFOYW1lKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksICJ0eXBlIik7CisgICAgfQorCisgICAgcHVibGljIFJlbGF0ZXNUb0hlYWRlcihRTmFtZSBuYW1lLCBTdHJpbmcgbWlkKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIG1pZCk7CisgICAgICAgIHRoaXMudHlwZUF0dHJpYnV0ZU5hbWUgPSBuZXcgUU5hbWUobmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgInR5cGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oWE1MU3RyZWFtV3JpdGVyIHcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3LndyaXRlU3RhcnRFbGVtZW50KCIiLCBuYW1lLmdldExvY2FsUGFydCgpLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgdy53cml0ZURlZmF1bHROYW1lc3BhY2UobmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpCisgICAgICAgICAgICB3LndyaXRlQXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7CisgICAgICAgIHcud3JpdGVDaGFyYWN0ZXJzKHZhbHVlKTsKKyAgICAgICAgdy53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFNPQVBNZXNzYWdlIHNhYWopIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKKyAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBzYWFqLmdldFNPQVBIZWFkZXIoKTsKKyAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc2hlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQobmFtZSk7CisKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHNoZS5hZGRBdHRyaWJ1dGUodHlwZUF0dHJpYnV0ZU5hbWUsIHR5cGUpOworICAgICAgICBzaGUuYWRkVGV4dE5vZGUodmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvUm9vdEVsZW1lbnRTbmlmZmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL1Jvb3RFbGVtZW50U25pZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmQzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL1Jvb3RFbGVtZW50U25pZmZlci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKKworLyoqCisgKiBTbmlmZnMgdGhlIHJvb3QgZWxlbWVudCBuYW1lIGFuZCBpdHMgYXR0cmlidXRlcyBmcm9tIFNBWCBldmVudHMuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUm9vdEVsZW1lbnRTbmlmZmVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworICAgIHByaXZhdGUgU3RyaW5nIG5zVXJpID0gIiMjZXJyb3IiOworICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZSA9ICIjI2Vycm9yIjsKKyAgICBwcml2YXRlIEF0dHJpYnV0ZXMgYXR0czsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBwYXJzZUF0dHJpYnV0ZXM7CisKKyAgICBwdWJsaWMgUm9vdEVsZW1lbnRTbmlmZmVyKGJvb2xlYW4gcGFyc2VBdHRyaWJ1dGVzKSB7CisgICAgICAgIHRoaXMucGFyc2VBdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzOworICAgIH0KKworICAgIHB1YmxpYyBSb290RWxlbWVudFNuaWZmZXIoKSB7CisgICAgICAgIHRoaXModHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5uc1VyaSA9IHVyaTsKKyAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisKKyAgICAgICAgaWYocGFyc2VBdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICBpZihhLmdldExlbmd0aCgpPT0wKSAgICAvLyBvZnRlbiB0aGVyZSdzIG5vIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIHRoaXMuYXR0cyA9IEVNUFRZX0FUVFJJQlVURVM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpcy5hdHRzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKGEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gbmVlZCB0byBwYXJzZSBhbnkgZnVydGhlci4KKyAgICAgICAgdGhyb3cgYVNBWEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5zVXJpKCkgeworICAgICAgICByZXR1cm4gbnNVcmk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbE5hbWU7CisgICAgfQorCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKKyAgICAgICAgcmV0dXJuIGF0dHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU0FYRXhjZXB0aW9uIGFTQVhFeGNlcHRpb24gPSBuZXcgU0FYRXhjZXB0aW9uKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXR0cmlidXRlcyBFTVBUWV9BVFRSSUJVVEVTID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL1N0cmluZ0hlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9TdHJpbmdIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmRkZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9TdHJpbmdIZWFkZXIuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2U7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworCisvKioKKyAqIHtAbGluayBIZWFkZXJ9IHRoYXQgaGFzIGEgc2luZ2xlIHRleHQgdmFsdWUgaW4gaXQKKyAqIChJT1csIG9mIHRoZSBmb3JtICZsdDtmb28+dGV4dCZsdDsvZm9vPi4pCisgKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdIZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdEhlYWRlckltcGwgeworICAgIC8qKgorICAgICAqIFRhZyBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBRTmFtZSBuYW1lOworICAgIC8qKgorICAgICAqIEhlYWRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIFN0cmluZ0hlYWRlcihRTmFtZSBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCkgeworICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKKyAgICB9CisKKyAgICBATnVsbGFibGUgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoQE5vdE51bGwgU3RyaW5nIG5zVXJpLCBATm90TnVsbCBTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZEhlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIGJ1ZiA9IG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCk7CisgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3ID0gYnVmLmNyZWF0ZUZyb21YTUxTdHJlYW1Xcml0ZXIoKTsKKyAgICAgICAgd3JpdGVUbyh3KTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5yZWFkQXNYTUxTdHJlYW1SZWFkZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFhNTFN0cmVhbVdyaXRlciB3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdy53cml0ZVN0YXJ0RWxlbWVudCgiIiwgbmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIHcud3JpdGVEZWZhdWx0TmFtZXNwYWNlKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICB3LndyaXRlQ2hhcmFjdGVycyh2YWx1ZSk7CisgICAgICAgIHcud3JpdGVFbmRFbGVtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTT0FQTWVzc2FnZSBzYWFqKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gc2Fhai5nZXRTT0FQSGVhZGVyKCk7CisgICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IHNoZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KG5hbWUpOworICAgICAgICBzaGUuYWRkVGV4dE5vZGUodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ29udGVudEhhbmRsZXIgaCwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuc1VyaSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIFN0cmluZyBsbiA9IG5hbWUuZ2V0TG9jYWxQYXJ0KCk7CisKKyAgICAgICAgaC5zdGFydFByZWZpeE1hcHBpbmcoIiIsbnNVcmkpOworICAgICAgICBoLnN0YXJ0RWxlbWVudChuc1VyaSxsbixsbixFTVBUWV9BVFRTKTsKKyAgICAgICAgaC5jaGFyYWN0ZXJzKHZhbHVlLnRvQ2hhckFycmF5KCksMCx2YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIGguZW5kRWxlbWVudChuc1VyaSxsbixsbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9VdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGJjY2QyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9VdGlsLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKKworLyoqCisgKiBVdGlsaXR5IGNvZGUgZm9yIHRoZSB7QGxpbmsgTWVzc2FnZX0gaW1wbGVtZW50YXRpb24uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBVdGlsIHsKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBzdHJpbmd0aGF0IHJlcHJlc2VudHMgYSBib29sZWFuIGludG8gYm9vbGVhbi4KKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIHdoaWxlc3BhY2Ugbm9ybWFsaXphdGlvbiBoYXMgYWxyZWFkeSB0YWtlbiBwbGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXJzZUJvb2woU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmKHZhbHVlLmxlbmd0aCgpPT0wKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoMCk7CisgICAgICAgIHJldHVybiBjaD09J3QnIHx8IGNoPT0nMSc7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL1hNTFJlYWRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvWE1MUmVhZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDQ5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL1hNTFJlYWRlckltcGwuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2U7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKKworLyoqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2ZpbmFsIGNsYXNzIFhNTFJlYWRlckltcGwgZXh0ZW5kcyBYTUxGaWx0ZXJJbXBsIHsKKworICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZSBtc2c7CisKKyAgICBYTUxSZWFkZXJJbXBsKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBzeXN0ZW1JZCkgeworICAgICAgICByZXBvcnRFcnJvcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXBvcnRFcnJvcigpIHsKKyAgICAgICAgLy8gVE9ETzogaTE4bgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgIlRoaXMgaXMgYSBzcGVjaWFsIFhNTFJlYWRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IG9ubHkgd29ya3Mgd2l0aCB0aGUgSW5wdXRTb3VyY2UgZ2l2ZW4gaW4gU0FYU291cmNlLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U291cmNlIGlucHV0KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoaW5wdXQhPVRIRV9TT1VSQ0UpCisgICAgICAgICAgICByZXBvcnRFcnJvcigpOworICAgICAgICBtc2cud3JpdGVUbyh0aGlzLHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpIHsKKyAgICAgICAgaWYoc3VwZXIuZ2V0Q29udGVudEhhbmRsZXIoKT09RFVNTVkpICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50SGFuZGxlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyKSB7CisgICAgICAgIGlmKGNvbnRlbnRIYW5kbGVyPT1udWxsKSAgICBjb250ZW50SGFuZGxlciA9IERVTU1ZOworICAgICAgICBzdXBlci5zZXRDb250ZW50SGFuZGxlcihjb250ZW50SGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29udGVudEhhbmRsZXIgRFVNTVkgPSBuZXcgRGVmYXVsdEhhbmRsZXIoKTsKKworICAgIC8qKgorICAgICAqIFNwZWNpYWwge0BsaW5rIElucHV0U291cmNlfSBpbnN0YW5jZSB0aGF0IHdlIHVzZSB0byBwYXNzIHRvIHtAbGluayBTQVhTb3VyY2V9LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW5wdXRTb3VyY2UgVEhFX1NPVVJDRSA9IG5ldyBJbnB1dFNvdXJjZSgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL0F0dGFjaG1lbnRNYXJzaGFsbGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL0F0dGFjaG1lbnRNYXJzaGFsbGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZmU4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL2pheGIvQXR0YWNobWVudE1hcnNoYWxsZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLmpheGI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQXR0YWNobWVudFNldEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5EYXRhSGFuZGxlckF0dGFjaG1lbnQ7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudE1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEF0dGFjaG1lbnRNYXJzaGFsbGVyfSwgaXRzIHVzZWQgZnJvbSBKQVhCTWVzc2FnZSB0byBtYXJzaGFsbCBzd2FyZWYgdHlwZQorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKiBAc2VlIEpBWEJNZXNzYWdlCisgKi8KK2ZpbmFsIGNsYXNzIEF0dGFjaG1lbnRNYXJzaGFsbGVySW1wbCBleHRlbmRzIEF0dGFjaG1lbnRNYXJzaGFsbGVyIHsKKyAgICBwcml2YXRlIEF0dGFjaG1lbnRTZXRJbXBsIGF0dGFjaG1lbnRzOworCisgICAgcHVibGljIEF0dGFjaG1lbnRNYXJzaGFsbGVySW1wbChBdHRhY2htZW50U2V0SW1wbCBhdHRhY2hlbW50cykgeworICAgICAgICB0aGlzLmF0dGFjaG1lbnRzID0gYXR0YWNoZW1udHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhIHJlZmVyZW5jZSB0byB1c2VyIG9iamVjdHMgdG8gYXZvaWQga2VlcGluZyBpdCBpbiBtZW1vcnkuCisgICAgICovCisgICAgdm9pZCBjbGVhbnVwKCkgeworICAgICAgICBhdHRhY2htZW50cyA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBhZGRNdG9tQXR0YWNobWVudChEYXRhSGFuZGxlciBkYXRhLCBTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnRMb2NhbE5hbWUpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgdXNlIEpBWEIgZm9yIGhhbmRsaW5nIFhPUAorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBhZGRNdG9tQXR0YWNobWVudChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnRMb2NhbE5hbWUpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgdXNlIEpBWEIgZm9yIGhhbmRsaW5nIFhPUAorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBhZGRTd2FSZWZBdHRhY2htZW50KERhdGFIYW5kbGVyIGRhdGEpIHsKKyAgICAgICAgU3RyaW5nIGNpZCA9IGVuY29kZUNpZChudWxsKTsKKyAgICAgICAgQXR0YWNobWVudCBhdHQgPSBuZXcgRGF0YUhhbmRsZXJBdHRhY2htZW50KGNpZCwgZGF0YSk7CisgICAgICAgIGF0dGFjaG1lbnRzLmFkZChhdHQpOworICAgICAgICBjaWQgPSAiY2lkOiIgKyBjaWQ7CisgICAgICAgIHJldHVybiBjaWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlQ2lkKFN0cmluZyBucykgeworICAgICAgICBTdHJpbmcgY2lkID0gImV4YW1wbGUuamF4d3Muc3VuLmNvbSI7CisgICAgICAgIFN0cmluZyBuYW1lID0gVVVJRC5yYW5kb21VVUlEKCkgKyAiQCI7CisgICAgICAgIGlmIChucyAhPSBudWxsICYmIChucy5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFVSSSB1cmkgPSBuZXcgVVJJKG5zKTsKKyAgICAgICAgICAgICAgICBjaWQgPSB1cmkudG9VUkwoKS5nZXRIb3N0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNpZCA9IFVSTEVuY29kZXIuZW5jb2RlKG5zLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZSArIGNpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL2pheGIvSkFYQkJyaWRnZVNvdXJjZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL0pBWEJCcmlkZ2VTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODkzMjkzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL0pBWEJCcmlkZ2VTb3VyY2UuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuamF4YjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKKworLyoqCisgKiBXcmFwcyBhIGJyaWRnZSBhbmQgSkFYQiBvYmplY3QgaW50byBhIHBzZXVkby17QGxpbmsgU291cmNlfS4KKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZmluYWwgY2xhc3MgSkFYQkJyaWRnZVNvdXJjZSBleHRlbmRzIFNBWFNvdXJjZSB7CisKKyAgICBwdWJsaWMgSkFYQkJyaWRnZVNvdXJjZSggQnJpZGdlIGJyaWRnZSwgT2JqZWN0IGNvbnRlbnRPYmplY3QgKSB7CisgICAgICAgIHRoaXMuYnJpZGdlID0gYnJpZGdlOworICAgICAgICB0aGlzLmNvbnRlbnRPYmplY3QgPSBjb250ZW50T2JqZWN0OworCisgICAgICAgIHN1cGVyLnNldFhNTFJlYWRlcihwc2V1ZG9QYXJzZXIpOworICAgICAgICAvLyBwYXNzIGEgZHVtbXkgSW5wdXRTb3VyY2UuIFdlIGRvbid0IGNhcmUKKyAgICAgICAgc3VwZXIuc2V0SW5wdXRTb3VyY2UobmV3IElucHV0U291cmNlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQnJpZGdlIGJyaWRnZTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBjb250ZW50T2JqZWN0OworCisgICAgLy8gdGhpcyBvYmplY3Qgd2lsbCBwcmV0ZW5kIGFzIGFuIFhNTFJlYWRlci4KKyAgICAvLyBubyBtYXR0ZXIgd2hhdCBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIHRvIHRoZSBwYXJzZSBtZXRob2QsCisgICAgLy8gaXQganVzdCBwYXJzZSB0aGUgY29udGVudE9iamVjdC4KKyAgICBwcml2YXRlIGZpbmFsIFhNTFJlYWRlciBwc2V1ZG9QYXJzZXIgPSBuZXcgWE1MRmlsdGVySW1wbCgpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYobmFtZS5lcXVhbHMoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZihuYW1lLmVxdWFscygiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYobmFtZS5lcXVhbHMoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIikgJiYgdmFsdWUpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYobmFtZS5lcXVhbHMoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiKSAmJiAhdmFsdWUpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24obmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiggImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIuZXF1YWxzKG5hbWUpICkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXhpY2FsSGFuZGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYoICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLmVxdWFscyhuYW1lKSApIHsKKyAgICAgICAgICAgICAgICB0aGlzLmxleGljYWxIYW5kbGVyID0gKExleGljYWxIYW5kbGVyKXZhbHVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBMZXhpY2FsSGFuZGxlciBsZXhpY2FsSGFuZGxlcjsKKworICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFNvdXJjZSBpbnB1dCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBwYXJzZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBwYXJzZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIHBhcnNlcyBhIGNvbnRlbnQgb2JqZWN0IGJ5IHVzaW5nIHRoZSBnaXZlbiBicmlkZ2UKKyAgICAgICAgICAgIC8vIFNBWCBldmVudHMgd2lsbCBiZSBzZW50IHRvIHRoZSByZXBlYXRlciwgYW5kIHRoZSByZXBlYXRlcgorICAgICAgICAgICAgLy8gd2lsbCBmdXJ0aGVyIGZvcndhcmQgaXQgdG8gYW4gYXBwcm9wcmlhdGUgY29tcG9uZW50LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBtZXRob2Qgb25seSB3cml0ZXMgYSBmcmFnbWVudCwgc28gbmVlZCBzdGFydC9lbmQgZG9jdW1lbnQKKyAgICAgICAgICAgICAgICBicmlkZ2UubWFyc2hhbCggY29udGVudE9iamVjdCwgdGhpcyApOworICAgICAgICAgICAgICAgIGVuZERvY3VtZW50KCk7CisgICAgICAgICAgICB9IGNhdGNoKCBKQVhCRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAgICAgLy8gd3JhcCBpdCB0byBhIFNBWEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uIHNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIC0xLCAtMSwgZSApOworCisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnN1bWVyIHNldHMgYW4gZXJyb3IgaGFuZGxlciwgaXQgaXMgb3VyIHJlc3BvbnNpYmlsaXR5CisgICAgICAgICAgICAgICAgLy8gdG8gbm90aWZ5IGl0LgorICAgICAgICAgICAgICAgIGZhdGFsRXJyb3Ioc2UpOworCisgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGZhdGFsIGVycm9yLiBFdmVuIGlmIHRoZSBlcnJvciBoYW5kbGVyCisgICAgICAgICAgICAgICAgLy8gcmV0dXJucywgd2Ugd2lsbCBhYm9ydCBhbnl3YXkuCisgICAgICAgICAgICAgICAgdGhyb3cgc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL0pBWEJIZWFkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvamF4Yi9KQVhCSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5MzQxYQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvamF4Yi9KQVhCSGVhZGVyLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5qYXhiOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5YTUxTdHJlYW1FeGNlcHRpb24yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuWE1MU3RyZWFtQnVmZmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuWE1MU3RyZWFtQnVmZmVyUmVzdWx0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkFic3RyYWN0SGVhZGVySW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLlJvb3RFbGVtZW50U25pZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyVXRpbDsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC51dGlsLkpBWEJSZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICoge0BsaW5rIEhlYWRlcn0gd2hvc2UgcGh5c2ljYWwgZGF0YSByZXByZXNlbnRhdGlvbiBpcyBhIEpBWEIgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKQVhCSGVhZGVyIGV4dGVuZHMgQWJzdHJhY3RIZWFkZXJJbXBsIHsKKworICAgIC8qKgorICAgICAqIFRoZSBKQVhCIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGhlYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBqYXhiT2JqZWN0OworCisgICAgcHJpdmF0ZSBmaW5hbCBCcmlkZ2UgYnJpZGdlOworCisgICAgLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBoZWFkZXIuIGxhemlseSBvYnRhaW5lZC4KKyAgICBwcml2YXRlIFN0cmluZyBuc1VyaTsKKyAgICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7CisgICAgcHJpdmF0ZSBBdHRyaWJ1dGVzIGF0dHM7CisKKyAgICAvKioKKyAgICAgKiBPbmNlIHRoZSBoZWFkZXIgaXMgdHVybmVkIGludG8gaW5mb3NldCwKKyAgICAgKiB0aGlzIGJ1ZmZlciBrZWVwcyBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFhNTFN0cmVhbUJ1ZmZlciBpbmZvc2V0OworCisgICAgcHVibGljIEpBWEJIZWFkZXIoSkFYQlJJQ29udGV4dCBjb250ZXh0LCBPYmplY3QgamF4Yk9iamVjdCkgeworICAgICAgICB0aGlzLmpheGJPYmplY3QgPSBqYXhiT2JqZWN0OworICAgICAgICB0aGlzLmJyaWRnZSA9IG5ldyBNYXJzaGFsbGVyQnJpZGdlKGNvbnRleHQpOworCisgICAgICAgIGlmIChqYXhiT2JqZWN0IGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKKyAgICAgICAgICAgIEpBWEJFbGVtZW50IGUgPSAoSkFYQkVsZW1lbnQpIGpheGJPYmplY3Q7CisgICAgICAgICAgICB0aGlzLm5zVXJpID0gZS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGUuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEpBWEJIZWFkZXIoQnJpZGdlIGJyaWRnZSwgT2JqZWN0IGpheGJPYmplY3QpIHsKKyAgICAgICAgdGhpcy5qYXhiT2JqZWN0ID0gamF4Yk9iamVjdDsKKyAgICAgICAgdGhpcy5icmlkZ2UgPSBicmlkZ2U7CisKKyAgICAgICAgUU5hbWUgdGFnTmFtZSA9IGJyaWRnZS5nZXRUeXBlUmVmZXJlbmNlKCkudGFnTmFtZTsKKyAgICAgICAgdGhpcy5uc1VyaSA9IHRhZ05hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIHRoaXMubG9jYWxOYW1lID0gdGFnTmFtZS5nZXRMb2NhbFBhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXppbHkgcGFyc2UgdGhlIGZpcnN0IGVsZW1lbnQgdG8gb2J0YWluIGF0dHJpYnV0ZSB2YWx1ZXMgb24gaXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkgeworICAgICAgICBSb290RWxlbWVudFNuaWZmZXIgc25pZmZlciA9IG5ldyBSb290RWxlbWVudFNuaWZmZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyaWRnZS5tYXJzaGFsKGpheGJPYmplY3Qsc25pZmZlcik7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWYgaXQncyBkdWUgdG8gdXMgYWJvcnRpbmcgdGhlIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQsCisgICAgICAgICAgICAvLyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBpZiBpdCdzIGR1ZSB0byBlcnJvciBpbiB0aGUgb2JqZWN0LCB0aGUgc2FtZSBlcnJvciB3aWxsIGJlIHJlcG9ydGVkCisgICAgICAgICAgICAvLyB3aGVuIHRoZSByZWFkSGVhZGVyKCkgbWV0aG9kIGlzIHVzZWQsIHNvIHdlIGRvbid0IGhhdmUgdG8gcmVwb3J0CisgICAgICAgICAgICAvLyBhbiBlcnJvciByaWdodCBub3cuCisgICAgICAgICAgICBuc1VyaSA9IHNuaWZmZXIuZ2V0TnNVcmkoKTsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IHNuaWZmZXIuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICBhdHRzID0gc25pZmZlci5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICBpZihuc1VyaT09bnVsbCkKKyAgICAgICAgICAgIHBhcnNlKCk7CisgICAgICAgIHJldHVybiBuc1VyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgU3RyaW5nIGdldExvY2FsUGFydCgpIHsKKyAgICAgICAgaWYobG9jYWxOYW1lPT1udWxsKQorICAgICAgICAgICAgcGFyc2UoKTsKKyAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgaWYoYXR0cz09bnVsbCkKKyAgICAgICAgICAgIHBhcnNlKCk7CisgICAgICAgIHJldHVybiBhdHRzLmdldFZhbHVlKG5zVXJpLGxvY2FsTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkSGVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZihpbmZvc2V0PT1udWxsKSB7CisgICAgICAgICAgICAgICAgWE1MU3RyZWFtQnVmZmVyUmVzdWx0IHNiciA9IG5ldyBYTUxTdHJlYW1CdWZmZXJSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICBicmlkZ2UubWFyc2hhbChqYXhiT2JqZWN0LHNicik7CisgICAgICAgICAgICAgICAgaW5mb3NldCA9IHNici5nZXRYTUxTdHJlYW1CdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmZvc2V0LnJlYWRBc1hNTFN0cmVhbVJlYWRlcigpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIDxUPiBUIHJlYWRBc0pBWEIoVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBKQVhCUmVzdWx0IHIgPSBuZXcgSkFYQlJlc3VsdCh1bm1hcnNoYWxsZXIpOworICAgICAgICBicmlkZ2UubWFyc2hhbChqYXhiT2JqZWN0LHIpOworICAgICAgICByZXR1cm4gKFQpci5nZXRSZXN1bHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEFzSkFYQihCcmlkZ2U8VD4gYnJpZGdlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBicmlkZ2UudW5tYXJzaGFsKG5ldyBKQVhCQnJpZGdlU291cmNlKHRoaXMuYnJpZGdlLGpheGJPYmplY3QpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFhNTFN0cmVhbVdyaXRlciBzdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBHZXQgb3V0cHV0IHN0cmVhbSBhbmQgdXNlIEpBWEIgVVRGLTggd3JpdGVyCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBYTUxTdHJlYW1Xcml0ZXJVdGlsLmdldE91dHB1dFN0cmVhbShzdyk7CisgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJyaWRnZS5tYXJzaGFsKGpheGJPYmplY3QsIG9zLCBzdy5nZXROYW1lc3BhY2VDb250ZXh0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmlkZ2UubWFyc2hhbChqYXhiT2JqZWN0LHN3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uMihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU09BUE1lc3NhZ2Ugc2FhaikgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnJpZGdlLm1hcnNoYWwoamF4Yk9iamVjdCxzYWFqLmdldFNPQVBIZWFkZXIoKSk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyaWRnZS5tYXJzaGFsKGpheGJPYmplY3QsY29udGVudEhhbmRsZXIpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uIHggPSBuZXcgU0FYUGFyc2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksbnVsbCxudWxsLC0xLC0xLGUpOworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmZhdGFsRXJyb3IoeCk7CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL0pBWEJNZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL2pheGIvSkFYQk1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjIzMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL0pBWEJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5qYXhiOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuRnJhZ21lbnRDb250ZW50SGFuZGxlcjsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlclJlc3VsdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5BYnN0cmFjdE1lc3NhZ2VJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQXR0YWNobWVudFNldEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5Sb290RWxlbWVudFNuaWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW0uU3RyZWFtTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyVXRpbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLnV0aWwuSkFYQlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICoge0BsaW5rIE1lc3NhZ2V9IGJhY2tlZCBieSBhIEpBWEIgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKQVhCTWVzc2FnZSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZUltcGwgeworICAgIHByaXZhdGUgSGVhZGVyTGlzdCBoZWFkZXJzOworCisgICAgLyoqCisgICAgICogVGhlIEpBWEIgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgaGVhZGVyLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGpheGJPYmplY3Q7CisKKyAgICBwcml2YXRlIGZpbmFsIEF0dGFjaG1lbnRTZXRJbXBsIGF0dGFjaG1lbnRTZXQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEJyaWRnZSBicmlkZ2U7CisKKyAgICAvKioKKyAgICAgKiBMYXppbHkgc25pZmZlZCBwYXlsb2FkIGVsZW1lbnQgbmFtZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5zVXJpLGxvY2FsTmFtZTsKKworICAgIC8qKgorICAgICAqIElmIHdlIGhhdmUgdGhlIGluZm9zZXQgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBwYXlsb2FkLCB0aGlzIGZpZWxkIGlzIG5vbi1udWxsLgorICAgICAqLworICAgIHByaXZhdGUgWE1MU3RyZWFtQnVmZmVyIGluZm9zZXQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIE1lc3NhZ2V9IGJhY2tlZCBieSBhIEpBWEIgYmVhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICBUaGUgSkFYQkNvbnRleHQgdG8gYmUgdXNlZCBmb3IgbWFyc2hhbGxpbmcuCisgICAgICogQHBhcmFtIGpheGJPYmplY3QKKyAgICAgKiAgICAgIFRoZSBKQVhCIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBheWxvYWQuIG11c3Qgbm90IGJlIG51bGwuIFRoaXMgb2JqZWN0CisgICAgICogICAgICBtdXN0IGJlIGJvdW5kIHRvIGFuIGVsZW1lbnQgKHdoaWNoIG1lYW5zIGl0IGVpdGhlciBpcyBhIHtAbGluayBKQVhCRWxlbWVudH0gb3IKKyAgICAgKiAgICAgIGFuIGluc3RhbmNlb2YgYSBjbGFzcyB3aXRoIHtAbGluayBYbWxSb290RWxlbWVudH0pLgorICAgICAqIEBwYXJhbSBzb2FwVmVyc2lvbgorICAgICAqICAgICAgVGhlIFNPQVAgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZS4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlKEpBWEJSSUNvbnRleHQgY29udGV4dCwgT2JqZWN0IGpheGJPYmplY3QsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgIGlmKCFjb250ZXh0Lmhhc1N3YVJlZigpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpBWEJNZXNzYWdlKGNvbnRleHQsamF4Yk9iamVjdCxzb2FwVmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBoYXZlIHN3YVJlZiwgdGhlbiB0aGF0IG1lYW5zIHdlIG1pZ2h0IGhhdmUgYXR0YWNobWVudHMuCisgICAgICAgIC8vIHRvIGNvbXBseSB3aXRoIHRoZSBwYWNrZXQgQVBJLCB3ZSBuZWVkIHRvIGVhZ2VybHkgdHVybiB0aGUgSkFYQiBvYmplY3QgaW50byBpbmZvc2V0CisgICAgICAgIC8vIHRvIGNvcnJlY3RseSBmaW5kIG91dCBhYm91dCBhdHRhY2htZW50cy4KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciB4c2IgPSBuZXcgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcigpOworCisgICAgICAgICAgICBNYXJzaGFsbGVyIG0gPSBjb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKTsKKyAgICAgICAgICAgIEF0dGFjaG1lbnRTZXRJbXBsIGF0dGFjaG1lbnRzID0gbmV3IEF0dGFjaG1lbnRTZXRJbXBsKCk7CisgICAgICAgICAgICBBdHRhY2htZW50TWFyc2hhbGxlckltcGwgYW0gPSBuZXcgQXR0YWNobWVudE1hcnNoYWxsZXJJbXBsKGF0dGFjaG1lbnRzKTsKKyAgICAgICAgICAgIG0uc2V0QXR0YWNobWVudE1hcnNoYWxsZXIoYW0pOworICAgICAgICAgICAgYW0uY2xlYW51cCgpOworICAgICAgICAgICAgbS5tYXJzaGFsKGpheGJPYmplY3QseHNiLmNyZWF0ZUZyb21YTUxTdHJlYW1Xcml0ZXIoKSk7CisKKyAgICAgICAgICAgIC8vIGFueSB3YXkgdG8gcmV1c2UgdGhpcyBYTUxTdHJlYW1CdWZmZXIgaW4gU3RyZWFtTWVzc2FnZT8KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtTWVzc2FnZShudWxsLGF0dGFjaG1lbnRzLHhzYi5yZWFkQXNYTUxTdHJlYW1SZWFkZXIoKSxzb2FwVmVyc2lvbik7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSkFYQk1lc3NhZ2UoIEpBWEJSSUNvbnRleHQgY29udGV4dCwgT2JqZWN0IGpheGJPYmplY3QsIFNPQVBWZXJzaW9uIHNvYXBWZXIgKSB7CisgICAgICAgIHN1cGVyKHNvYXBWZXIpOworICAgICAgICB0aGlzLmJyaWRnZSA9IG5ldyBNYXJzaGFsbGVyQnJpZGdlKGNvbnRleHQpOworICAgICAgICB0aGlzLmpheGJPYmplY3QgPSBqYXhiT2JqZWN0OworICAgICAgICB0aGlzLmF0dGFjaG1lbnRTZXQgPSBuZXcgQXR0YWNobWVudFNldEltcGwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIE1lc3NhZ2V9IGJhY2tlZCBieSBhIEpBWEIgYmVhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBicmlkZ2UKKyAgICAgKiAgICAgIFNwZWNpZnkgdGhlIHBheWxvYWQgdGFnIG5hbWUgYW5kIGhvdyA8dHQ+amF4Yk9iamVjdDwvdHQ+IGlzIGJvdW5kLgorICAgICAqIEBwYXJhbSBqYXhiT2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZShCcmlkZ2UgYnJpZGdlLCBPYmplY3QgamF4Yk9iamVjdCwgU09BUFZlcnNpb24gc29hcFZlcikgeworICAgICAgICBpZighYnJpZGdlLmdldENvbnRleHQoKS5oYXNTd2FSZWYoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKQVhCTWVzc2FnZShicmlkZ2UsamF4Yk9iamVjdCxzb2FwVmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGhhdmUgc3dhUmVmLCB0aGVuIHRoYXQgbWVhbnMgd2UgbWlnaHQgaGF2ZSBhdHRhY2htZW50cy4KKyAgICAgICAgLy8gdG8gY29tcGx5IHdpdGggdGhlIHBhY2tldCBBUEksIHdlIG5lZWQgdG8gZWFnZXJseSB0dXJuIHRoZSBKQVhCIG9iamVjdCBpbnRvIGluZm9zZXQKKyAgICAgICAgLy8gdG8gY29ycmVjdGx5IGZpbmQgb3V0IGFib3V0IGF0dGFjaG1lbnRzLgorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIHhzYiA9IG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCk7CisKKyAgICAgICAgICAgIEF0dGFjaG1lbnRTZXRJbXBsIGF0dGFjaG1lbnRzID0gbmV3IEF0dGFjaG1lbnRTZXRJbXBsKCk7CisgICAgICAgICAgICBBdHRhY2htZW50TWFyc2hhbGxlckltcGwgYW0gPSBuZXcgQXR0YWNobWVudE1hcnNoYWxsZXJJbXBsKGF0dGFjaG1lbnRzKTsKKyAgICAgICAgICAgIGJyaWRnZS5tYXJzaGFsKGpheGJPYmplY3QseHNiLmNyZWF0ZUZyb21YTUxTdHJlYW1Xcml0ZXIoKSwgYW0pOworICAgICAgICAgICAgYW0uY2xlYW51cCgpOworCisgICAgICAgICAgICAvLyBhbnkgd2F5IHRvIHJldXNlIHRoaXMgWE1MU3RyZWFtQnVmZmVyIGluIFN0cmVhbU1lc3NhZ2U/CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbU1lc3NhZ2UobnVsbCxhdHRhY2htZW50cyx4c2IucmVhZEFzWE1MU3RyZWFtUmVhZGVyKCksc29hcFZlcik7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSkFYQk1lc3NhZ2UoQnJpZGdlIGJyaWRnZSwgT2JqZWN0IGpheGJPYmplY3QsIFNPQVBWZXJzaW9uIHNvYXBWZXIpIHsKKyAgICAgICAgc3VwZXIoc29hcFZlcik7CisgICAgICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IGEgYmV0dGVyIHdheSB0byBoYW5kbGUgQnJpZGdlQ29udGV4dAorICAgICAgICB0aGlzLmJyaWRnZSA9IGJyaWRnZTsKKyAgICAgICAgdGhpcy5qYXhiT2JqZWN0ID0gamF4Yk9iamVjdDsKKyAgICAgICAgUU5hbWUgdGFnTmFtZSA9IGJyaWRnZS5nZXRUeXBlUmVmZXJlbmNlKCkudGFnTmFtZTsKKyAgICAgICAgdGhpcy5uc1VyaSA9IHRhZ05hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIHRoaXMubG9jYWxOYW1lID0gdGFnTmFtZS5nZXRMb2NhbFBhcnQoKTsKKyAgICAgICAgdGhpcy5hdHRhY2htZW50U2V0ID0gbmV3IEF0dGFjaG1lbnRTZXRJbXBsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSkFYQk1lc3NhZ2UoSkFYQk1lc3NhZ2UgdGhhdCkgeworICAgICAgICBzdXBlcih0aGF0KTsKKyAgICAgICAgdGhpcy5oZWFkZXJzID0gdGhhdC5oZWFkZXJzOworICAgICAgICBpZih0aGlzLmhlYWRlcnMhPW51bGwpCisgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVyTGlzdCh0aGlzLmhlYWRlcnMpOworICAgICAgICB0aGlzLmF0dGFjaG1lbnRTZXQgPSB0aGF0LmF0dGFjaG1lbnRTZXQ7CisKKyAgICAgICAgdGhpcy5qYXhiT2JqZWN0ID0gdGhhdC5qYXhiT2JqZWN0OworICAgICAgICB0aGlzLmJyaWRnZSA9IHRoYXQuYnJpZGdlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBATm90TnVsbCBBdHRhY2htZW50U2V0IGdldEF0dGFjaG1lbnRzKCkgeworICAgICAgICByZXR1cm4gYXR0YWNobWVudFNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gaGVhZGVycyE9bnVsbCAmJiAhaGVhZGVycy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEhlYWRlckxpc3QgZ2V0SGVhZGVycygpIHsKKyAgICAgICAgaWYoaGVhZGVycz09bnVsbCkKKyAgICAgICAgICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVyTGlzdCgpOworICAgICAgICByZXR1cm4gaGVhZGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBheWxvYWRMb2NhbFBhcnQoKSB7CisgICAgICAgIGlmKGxvY2FsTmFtZT09bnVsbCkKKyAgICAgICAgICAgIHNuaWZmKCk7CisgICAgICAgIHJldHVybiBsb2NhbE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCkgeworICAgICAgICBpZihuc1VyaT09bnVsbCkKKyAgICAgICAgICAgIHNuaWZmKCk7CisgICAgICAgIHJldHVybiBuc1VyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXlsb2FkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIHRoZSB0YWcgbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzbmlmZigpIHsKKyAgICAgICAgUm9vdEVsZW1lbnRTbmlmZmVyIHNuaWZmZXIgPSBuZXcgUm9vdEVsZW1lbnRTbmlmZmVyKGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyaWRnZS5tYXJzaGFsKGpheGJPYmplY3Qsc25pZmZlcik7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWYgaXQncyBkdWUgdG8gdXMgYWJvcnRpbmcgdGhlIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQsCisgICAgICAgICAgICAvLyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBpZiBpdCdzIGR1ZSB0byBlcnJvciBpbiB0aGUgb2JqZWN0LCB0aGUgc2FtZSBlcnJvciB3aWxsIGJlIHJlcG9ydGVkCisgICAgICAgICAgICAvLyB3aGVuIHRoZSByZWFkSGVhZGVyKCkgbWV0aG9kIGlzIHVzZWQsIHNvIHdlIGRvbid0IGhhdmUgdG8gcmVwb3J0CisgICAgICAgICAgICAvLyBhbiBlcnJvciByaWdodCBub3cuCisgICAgICAgICAgICBuc1VyaSA9IHNuaWZmZXIuZ2V0TnNVcmkoKTsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IHNuaWZmZXIuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlIHJlYWRQYXlsb2FkQXNTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgSkFYQkJyaWRnZVNvdXJjZShicmlkZ2UsamF4Yk9iamVjdCk7CisgICAgfQorCisgICAgcHVibGljIDxUPiBUIHJlYWRQYXlsb2FkQXNKQVhCKFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgSkFYQlJlc3VsdCBvdXQgPSBuZXcgSkFYQlJlc3VsdCh1bm1hcnNoYWxsZXIpOworICAgICAgICAvLyBzaW5jZSB0aGUgYnJpZGdlIG9ubHkgcHJvZHVjZXMgZnJhZ21lbnRzLCB3ZSBuZWVkIHRvIGZpcmUgc3RhcnQvZW5kIGRvY3VtZW50LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LmdldEhhbmRsZXIoKS5zdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICBicmlkZ2UubWFyc2hhbChqYXhiT2JqZWN0LG91dCk7CisgICAgICAgICAgICBvdXQuZ2V0SGFuZGxlcigpLmVuZERvY3VtZW50KCk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFQpb3V0LmdldFJlc3VsdCgpOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZFBheWxvYWQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICB0cnkgeworICAgICAgICAgICAgaWYoaW5mb3NldD09bnVsbCkgeworICAgICAgICAgICAgICAgIFhNTFN0cmVhbUJ1ZmZlclJlc3VsdCBzYnIgPSBuZXcgWE1MU3RyZWFtQnVmZmVyUmVzdWx0KCk7CisgICAgICAgICAgICAgICAgYnJpZGdlLm1hcnNoYWwoamF4Yk9iamVjdCxzYnIpOworICAgICAgICAgICAgICAgIGluZm9zZXQgPSBzYnIuZ2V0WE1MU3RyZWFtQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5mb3NldC5yZWFkQXNYTUxTdHJlYW1SZWFkZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIC8vIGJ1ZyA2NDQ5Njg0LCBzcGVjIDQuMy40CisgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBwYXlsb2FkIGFzIFNBWCBldmVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQYXlsb2FkVG8oQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIGJvb2xlYW4gZnJhZ21lbnQpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYoZnJhZ21lbnQpCisgICAgICAgICAgICAgICAgY29udGVudEhhbmRsZXIgPSBuZXcgRnJhZ21lbnRDb250ZW50SGFuZGxlcihjb250ZW50SGFuZGxlcik7CisgICAgICAgICAgICBBdHRhY2htZW50TWFyc2hhbGxlckltcGwgYW0gPSBuZXcgQXR0YWNobWVudE1hcnNoYWxsZXJJbXBsKGF0dGFjaG1lbnRTZXQpOworICAgICAgICAgICAgYnJpZGdlLm1hcnNoYWwoamF4Yk9iamVjdCxjb250ZW50SGFuZGxlciwgYW0pOworICAgICAgICAgICAgYW0uY2xlYW51cCgpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgcmVhbGx5IG1vcmUgaGVscGZ1bCBidXQgc3BlYyBjb21wbGlhbmNlCisgICAgICAgICAgICAvLyBlcnJvckhhbmRsZXIuZmF0YWxFcnJvcihuZXcgU0FYUGFyc2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksTlVMTF9MT0NBVE9SLGUpKTsKKyAgICAgICAgICAgIC8vIGJ1ZyA2NDQ5Njg0LCBzcGVjIDQuMy40CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlUGF5bG9hZFRvKFhNTFN0cmVhbVdyaXRlciBzdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBdHRhY2htZW50TWFyc2hhbGxlckltcGwgYW0gPSBuZXcgQXR0YWNobWVudE1hcnNoYWxsZXJJbXBsKGF0dGFjaG1lbnRTZXQpOworICAgICAgICAgICAgLy8gR2V0IG91dHB1dCBzdHJlYW0gYW5kIHVzZSBKQVhCIFVURi04IHdyaXRlcgorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gWE1MU3RyZWFtV3JpdGVyVXRpbC5nZXRPdXRwdXRTdHJlYW0oc3cpOworICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBicmlkZ2UubWFyc2hhbChqYXhiT2JqZWN0LCBvcywgc3cuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLGFtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJpZGdlLm1hcnNoYWwoamF4Yk9iamVjdCxzdyxhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbS5jbGVhbnVwKCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gYnVnIDY0NDk2ODQsIHNwZWMgNC4zLjQKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2UgY29weSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKQVhCTWVzc2FnZSh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL2pheGIvTWFyc2hhbGxlckJyaWRnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL01hcnNoYWxsZXJCcmlkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDFkMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL01hcnNoYWxsZXJCcmlkZ2UuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuamF4YjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5UeXBlUmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkpBWEJSSUNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5ydW50aW1lLkpBWEJDb250ZXh0SW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLnJ1bnRpbWUuTWFyc2hhbGxlckltcGw7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogVXNlZCB0byBhZGFwdCB7QGxpbmsgTWFyc2hhbGxlcn0gaW50byBhIHtAbGluayBCcmlkZ2V9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZmluYWwgY2xhc3MgTWFyc2hhbGxlckJyaWRnZSBleHRlbmRzIEJyaWRnZSB7CisgICAgcHVibGljIE1hcnNoYWxsZXJCcmlkZ2UoSkFYQlJJQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKChKQVhCQ29udGV4dEltcGwpY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFyc2hhbChNYXJzaGFsbGVyIG0sIE9iamVjdCBvYmplY3QsIFhNTFN0cmVhbVdyaXRlciBvdXRwdXQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtLm1hcnNoYWwob2JqZWN0LG91dHB1dCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GUkFHTUVOVCxmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE1hcnNoYWxsZXIgbSwgT2JqZWN0IG9iamVjdCwgT3V0cHV0U3RyZWFtIG91dHB1dCwgTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtLm1hcnNoYWwob2JqZWN0LG91dHB1dCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GUkFHTUVOVCxmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE1hcnNoYWxsZXIgbSwgT2JqZWN0IG9iamVjdCwgTm9kZSBvdXRwdXQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtLm1hcnNoYWwob2JqZWN0LG91dHB1dCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GUkFHTUVOVCxmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE1hcnNoYWxsZXIgbSwgT2JqZWN0IG9iamVjdCwgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtLm1hcnNoYWwob2JqZWN0LGNvbnRlbnRIYW5kbGVyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG0uc2V0UHJvcGVydHkoTWFyc2hhbGxlci5KQVhCX0ZSQUdNRU5ULGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoTWFyc2hhbGxlciBtLCBPYmplY3Qgb2JqZWN0LCBSZXN1bHQgcmVzdWx0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIG0uc2V0UHJvcGVydHkoTWFyc2hhbGxlci5KQVhCX0ZSQUdNRU5ULHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbS5tYXJzaGFsKG9iamVjdCxyZXN1bHQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoVW5tYXJzaGFsbGVyIHUsIFhNTFN0cmVhbVJlYWRlciBpbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChVbm1hcnNoYWxsZXIgdSwgU291cmNlIGluKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKFVubWFyc2hhbGxlciB1LCBJbnB1dFN0cmVhbSBpbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChVbm1hcnNoYWxsZXIgdSwgTm9kZSBuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlUmVmZXJlbmNlIGdldFR5cGVSZWZlcmVuY2UoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvamF4Yi9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvamF4Yi9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU4Njg5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9qYXhiL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoqCisgKiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZX0gaW1wbGVtZW50YXRpb24gZm9yIEpBWEIuCisgKgorICogPHByZT4KKyAqIFRPRE86CisgKiAgICAgIEJlY2F1c2UgYSBwcm9kdWNlciBvZiBhIG1lc3NhZ2UgZG9lc24ndCBnZW5lcmFsbHkga25vdworICogICAgICB3aGVuIGEgbWVzc2FnZSBpcyBjb25zdW1lZCwgaXQncyBkaWZmaWN1bHQgZm9yCisgKiAgICAgIHRoZSBjYWxsZXIgdG8gZG8gYSBwcm9wZXIgaW5zdGFuY2UgY2FjaGluZy4gUGVyaGFwcworICogICAgICB0aGVyZSBzaG91bGQgYmUgYSBsYXllciBhcm91bmQgSkFYQkNvbnRleHQgdGhhdCBkb2VzIHRoYXQ/CisgKiA8L3ByZT4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLmpheGI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3NmY1YgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2UvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKioKKyAqIHtAbGluayBNZXNzYWdlfSBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3NhYWovU0FBSkhlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zYWFqL1NBQUpIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTIyOTYzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zYWFqL1NBQUpIZWFkZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc2FhajsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5ET01IZWFkZXI7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OworCisvKioKKyAqIHtAbGluayBIZWFkZXJ9IGZvciB7QGxpbmsgU09BUEhlYWRlckVsZW1lbnR9LgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTQUFKSGVhZGVyIGV4dGVuZHMgRE9NSGVhZGVyPFNPQVBIZWFkZXJFbGVtZW50PiB7CisgICAgcHVibGljIFNBQUpIZWFkZXIoU09BUEhlYWRlckVsZW1lbnQgaGVhZGVyKSB7CisgICAgICAgIC8vIHdlIHdvbid0IHJlbHkgb24gYW55IG9mIHRoZSBzdXBlciBjbGFzcyBtZXRob2QgdGhhdCB1c2VzIFNPQVBWZXJzaW9uLAorICAgICAgICAvLyBzbyB3ZSBjYW4ganVzdCBwYXNzIGluIGEgZHVtbXkgdmVyc2lvbgorICAgICAgICBzdXBlcihoZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYworICAgIEBOb3ROdWxsCisgICAgU3RyaW5nIGdldFJvbGUoQE5vdE51bGwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgU3RyaW5nIHYgPSBnZXRBdHRyaWJ1dGUoc29hcFZlcnNpb24ubnNVcmksIHNvYXBWZXJzaW9uLnJvbGVBdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgaWYodj09bnVsbCB8fCB2LmVxdWFscygiIikpCisgICAgICAgICAgICB2ID0gc29hcFZlcnNpb24uaW1wbGljaXRSb2xlOworICAgICAgICByZXR1cm4gdjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3NhYWovU0FBSk1lc3NhZ2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc2Fhai9TQUFKTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjE5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3NhYWovU0FBSk1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDUwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnNhYWo7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLlhNTFN0cmVhbUV4Y2VwdGlvbjI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQudW5tYXJzaGFsbGVyLkRPTVNjYW5uZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQXR0YWNobWVudFVubWFyc2hhbGxlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLkRPTVN0cmVhbVJlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkRPTVV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICoge0BsaW5rIE1lc3NhZ2V9IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSB7QGxpbmsgU09BUE1lc3NhZ2V9LgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBjbGFzcyBTQUFKTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgeworICAgIHByaXZhdGUgZmluYWwgU09BUE1lc3NhZ2Ugc207CisgICAgcHJpdmF0ZSBIZWFkZXJMaXN0IGhlYWRlcnM7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGF5bG9hZExvY2FsTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBwYXlsb2FkTmFtc3BhY2U7CisgICAgcHJpdmF0ZSBMaXN0PEVsZW1lbnQ+IGJvZHlQYXJ0czsKKyAgICBwcml2YXRlIEVsZW1lbnQgcGF5bG9hZDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZWRIZWFkZXI7CisKKyAgICBwdWJsaWMgU0FBSk1lc3NhZ2UoU09BUE1lc3NhZ2Ugc20pIHsKKyAgICAgICAgdGhpcy5zbSA9IHNtOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOb2RlIGJvZHkgPSBzbS5nZXRTT0FQQm9keSgpOworICAgICAgICAgICAgLy9jYXR1cmUgYWxsIHRoZSBib2R5IGVsZW1lbnRzCisgICAgICAgICAgICBib2R5UGFydHMgPSBET01VdGlsLmdldENoaWxkRWxlbWVudHMoYm9keSk7CisKKyAgICAgICAgICAgIC8vd2UgdHJlYXQgcGF5bG9hZCBhcyB0aGUgZmlyc3QgYm9keSBwYXJ0CisgICAgICAgICAgICBwYXlsb2FkID0gYm9keVBhcnRzLnNpemUoKSA+IDA/IGJvZHlQYXJ0cy5nZXQoMCk6bnVsbDsKKyAgICAgICAgICAgIC8vIGhvcGUgdGhpcyBpcyBjb3JyZWN0LiBDYWNoaW5nIHRoZSBsb2NhbG5hbWUgYW5kIG5hbWVzcGFjZSBvZiB0aGUgcGF5bG9hZCBzaG91bGQgYmUgZmluZQorICAgICAgICAgICAgLy8gYnV0IHdoYXQgYWJvdXQgaWYgYSBIYW5kbGVyIHJlcGxhY2VzIHRoZSBwYXlsb2FkIHdpdGggc29tZXRoaW5nIGVsc2U/IFdlZWwsIG1heSBiZSBpdAorICAgICAgICAgICAgLy8gd2lsbCBiZSBlcnJvciBjb25kaXRpb24gYW55d2F5CisgICAgICAgICAgICBpZiAocGF5bG9hZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGF5bG9hZExvY2FsTmFtZSA9IHBheWxvYWQuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICAgICAgcGF5bG9hZE5hbXNwYWNlID0gcGF5bG9hZC5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgYSBjb252ZW5pZW5jZSBhbmQgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgI2NvcHl9CisgICAgICogQHBhcmFtIGhlYWRlcnMKKyAgICAgKiBAcGFyYW0gc20KKyAgICAgKi8KKyAgICBwcml2YXRlIFNBQUpNZXNzYWdlKEhlYWRlckxpc3QgaGVhZGVycywgQXR0YWNobWVudFNldCBhcywgU09BUE1lc3NhZ2Ugc20pIHsKKyAgICAgICAgdGhpcyhzbSk7CisgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgIHRoaXMuYXR0YWNobWVudFNldCA9IGFzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRIZWFkZXJzKCkuc2l6ZSgpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFsbCB0aGUgaGVhZGVycyBvZiB0aGlzIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgbm9uLW51bGwgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBIZWFkZXJMaXN0IGdldEhlYWRlcnMoKSB7CisgICAgICAgIGlmIChwYXJzZWRIZWFkZXIpCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyczsKKworICAgICAgICBpZiAoaGVhZGVycyA9PSBudWxsKQorICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBIZWFkZXJMaXN0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gc20uZ2V0U09BUEhlYWRlcigpOworICAgICAgICAgICAgaWYoaGVhZGVyIT1udWxsKSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGhlYWRlci5leGFtaW5lQWxsSGVhZGVyRWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQobmV3IFNBQUpIZWFkZXIoKFNPQVBIZWFkZXJFbGVtZW50KSBpdGVyLm5leHQoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcnNlZEhlYWRlciA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGVhZGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhdHRhY2htZW50cyBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKiAoYXR0YWNobWVudHMgbGl2ZSBvdXRzaWRlIGEgbWVzc2FnZS4pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgQXR0YWNobWVudFNldCBnZXRBdHRhY2htZW50cygpIHsKKyAgICAgICAgaWYgKGF0dGFjaG1lbnRTZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIGF0dGFjaG1lbnRTZXQgPSBuZXcgU0FBSkF0dGFjaG1lbnRTZXQoc20pOworICAgICAgICByZXR1cm4gYXR0YWNobWVudFNldDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNBdHRhY2htZW50cygpIHsKKyAgICAgICAgcmV0dXJuICFnZXRBdHRhY2htZW50cygpLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBwYXlsb2FkIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTG9jYWxQYXJ0KCkgeworICAgICAgICByZXR1cm4gcGF5bG9hZExvY2FsTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBwYXlsb2FkIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gcGF5bG9hZE5hbXNwYWNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1BheWxvYWQoKSB7CisgICAgICAgIHJldHVybiBwYXlsb2FkTmFtc3BhY2UhPW51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhpcyBtZXNzYWdlIGluY2x1ZGluZyB0aGUgZW52ZWxvcGUuCisgICAgICogcmV0dXJucyBpdCBhcyBhIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZX0gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2UgcmVhZEVudmVsb3BlQXNTb3VyY2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTT0FQRW52ZWxvcGUgc2UgPSBzbSAuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBET01Tb3VyY2Uoc2UpOworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGF5bG9hZCBhcyBhIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZX0gb2JqZWN0LgorICAgICAqCisgICAgICogQ2FuJ3QgcmVhbGx5IGdpdmUgYWxsIHRoZSBib2R5IHBhcnRzIGluc2lkZSBzb2FwZW52OkJvZHkgYXMgU291cmNlCisgICAgICogY2FudCB0YWtlIG9ubHkgb25lIHBhcnQuCisgICAgICoKKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBjb25zdW1lcyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlIHJlYWRQYXlsb2FkQXNTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiAocGF5bG9hZCAhPSBudWxsKSA/IG5ldyBET01Tb3VyY2UocGF5bG9hZCkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGVxdWl2YWxlbnQge0BsaW5rIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlfSBmcm9tIHRoaXMgbWVzc2FnZS4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBjb25zdW1lcyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU09BUE1lc3NhZ2UgcmVhZEFzU09BUE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBzbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU09BUE1lc3NhZ2UgcmVhZEFzU09BUE1lc3NhZ2UoUGFja2V0IHBhY2tldCwgYm9vbGVhbiBpbmJvdW5kKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgcGF5bG9hZCBhcyBhIEpBWEIgb2JqZWN0IGJ5IHVzaW5nIHRoZSBnaXZlbiB1bm1hcnNoYWxsZXIuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgY29uc3VtZXMgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIDxUPiBUIHJlYWRQYXlsb2FkQXNKQVhCKFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5vZGUgcG4gPSBzbS5nZXRTT0FQQm9keSgpLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIGlmIChwbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoVCkgdW5tYXJzaGFsbGVyLnVubWFyc2hhbChwbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyA8VD4gVCByZWFkUGF5bG9hZEFzSkFYQihCcmlkZ2U8VD4gYnJpZGdlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOb2RlIHBuID0gc20uZ2V0U09BUEJvZHkoKS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgICAgICBpZiAocG4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYnJpZGdlLnVubWFyc2hhbChwbiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEF0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsKGdldEF0dGFjaG1lbnRzKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIHBheWxvYWQgYXMgYSB7QGxpbmsgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXJ9CisgICAgICogPHAvPgorICAgICAqIFRoaXMgY29uc3VtZXMgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkUGF5bG9hZCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZihwYXlsb2FkPT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgRE9NU3RyZWFtUmVhZGVyIGRzcyA9IG5ldyBET01TdHJlYW1SZWFkZXIoKTsKKyAgICAgICAgZHNzLnNldEN1cnJlbnROb2RlKHBheWxvYWQpOworICAgICAgICBkc3MubmV4dFRhZygpOworICAgICAgICBhc3NlcnQgZHNzLmdldEV2ZW50VHlwZSgpPT1YTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVDsKKyAgICAgICAgcmV0dXJuIGRzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHBheWxvYWQgdG8gU3RBWC4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2Qgd3JpdGVzIGp1c3QgdGhlIHBheWxvYWQgb2YgdGhlIG1lc3NhZ2UgdG8gdGhlIHdyaXRlci4KKyAgICAgKiBUaGlzIGNvbnN1bWVzIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlUGF5bG9hZFRvKFhNTFN0cmVhbVdyaXRlciBzdykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yKEVsZW1lbnQgcGFydDogYm9keVBhcnRzKQorICAgICAgICAgICAgICAgIERPTVV0aWwuc2VyaWFsaXplTm9kZShwYXJ0LCBzdyk7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBET01TY2FubmVyIGRzID0gbmV3IERPTVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0Q29udGVudEhhbmRsZXIoY29udGVudEhhbmRsZXIpOworICAgICAgICBkcy5zY2FuKHNtLmdldFNPQVBQYXJ0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIGEge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2V9LgorICAgICAqIDxwLz4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZX0gd2hvc2UgaGVhZGVyL3BheWxvYWQvYXR0YWNobWVudHMvcHJvcGVydGllcworICAgICAqIGFyZSBpZGVudGljYWwgdG8gdGhpcyB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZX0uIE9uY2UgY3JlYXRlZCwgdGhlIGNyZWF0ZWQge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2V9CisgICAgICogYW5kIHRoZSBvcmlnaW5hbCB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZX0gYmVoYXZlcyBpbmRlcGVuZGVudGx5IC0tLSBhZGRpbmcgaGVhZGVyLworICAgICAqIGF0dGFjaG1lbnQgdG8gb25lIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlfSBkb2Vzbid0IGFmZmVjdCBhbm90aGVyIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlfQorICAgICAqIGF0IGFsbC4KKyAgICAgKiA8cC8+CisgICAgICogPGgzPkRlc2lnbiBSYXRpb25hbGU8L2gzPgorICAgICAqIDxwLz4KKyAgICAgKiBTaW5jZSBhIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlfSBib2R5IGlzIHJlYWQtb25jZSwgc29tZXRpbWVzCisgICAgICogKHN1Y2ggYXMgd2hlbiB5b3UgZG8gZmFpbC1vdmVyLCBvciBXUy1STSkgeW91IG5lZWQgdG8KKyAgICAgKiBjcmVhdGUgYW4gaWRlbnRpYWwgY29weSBvZiBhIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlfS4KKyAgICAgKiA8cC8+CisgICAgICogPHAvPgorICAgICAqIFRoZSBhY3R1YWwgY29weSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUgbGF5b3V0CisgICAgICogb2YgdGhlIGRhdGEgaW4gbWVtb3J5LCBoZW5jZSBpdCdzIGJlc3QgdG8gYmUgZG9uZSBieQorICAgICAqIHRoZSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZX0gaW1wbGVtZW50YXRpb24gaXRzZWxmLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGNvcHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTT0FQQm9keSBzYiA9IHNtLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCk7CisgICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBTT0FQVmVyc2lvbi5mcm9tTnNVcmkoc2IuZ2V0TmFtZXNwYWNlVVJJKCkpLnNhYWpNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7CisgICAgICAgICAgICBTT0FQQm9keSBuZXdCb2R5ID0gbXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCk7CisgICAgICAgICAgICBmb3IoRWxlbWVudCBwYXJ0OiBib2R5UGFydHMpeworICAgICAgICAgICAgICAgIE5vZGUgbiA9IG5ld0JvZHkuZ2V0T3duZXJEb2N1bWVudCgpLmltcG9ydE5vZGUocGFydCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbmV3Qm9keS5hcHBlbmRDaGlsZChuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU0FBSk1lc3NhZ2UoZ2V0SGVhZGVycygpLCBnZXRBdHRhY2htZW50cygpLCBtc2cpOworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGNsYXNzIFNBQUpBdHRhY2htZW50IGltcGxlbWVudHMgQXR0YWNobWVudCB7CisKKyAgICAgICAgQXR0YWNobWVudFBhcnQgYXA7CisKKyAgICAgICAgcHVibGljIFNBQUpBdHRhY2htZW50KEF0dGFjaG1lbnRQYXJ0IHBhcnQpIHsKKyAgICAgICAgICAgIHRoaXMuYXAgPSBwYXJ0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQuIFVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gYXR0YWNobWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudElkKCkgeworICAgICAgICAgICAgcmV0dXJuIGFwLmdldENvbnRlbnRJZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIE1JTUUgY29udGVudC10eXBlIG9mIHRoaXMgYXR0YWNobWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gYXAuZ2V0Q29udGVudFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBhdHRhY2htZW50IGFzIGFuIGV4YWN0LWxlbmd0aCBieXRlIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJ5dGVbXSBhc0J5dGVBcnJheSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFwLmdldFJhd0NvbnRlbnRCeXRlcygpOworICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgYXR0YWNobWVudCBhcyBhIHtAbGluayBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEYXRhSGFuZGxlciBhc0RhdGFIYW5kbGVyKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXAuZ2V0RGF0YUhhbmRsZXIoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGF0dGFjaG1lbnQgYXMgYSB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2V9LgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBhY3R1YWxseSBhbiBYTUwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU291cmNlIGFzU291cmNlKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShhcC5nZXRSYXdDb250ZW50KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT2J0YWlucyB0aGlzIGF0dGFjaG1lbnQgYXMgYW4ge0BsaW5rIGphdmEuaW8uSW5wdXRTdHJlYW19LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGFzSW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBhcC5nZXRSYXdDb250ZW50KCk7CisgICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBhdHRhY2htZW50IGludG8gdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgb3Mud3JpdGUoYXNCeXRlQXJyYXkoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGVzIHRoaXMgYXR0YWNobWVudCB0byB0aGUgZ2l2ZW4ge0BsaW5rIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU09BUE1lc3NhZ2Ugc2FhaikgeworICAgICAgICAgICAgc2Fhai5hZGRBdHRhY2htZW50UGFydChhcCk7CisgICAgICAgIH0KKworICAgICAgICBBdHRhY2htZW50UGFydCBhc0F0dGFjaG1lbnRQYXJ0KCl7CisgICAgICAgICAgICByZXR1cm4gYXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgQXR0YWNobWVudFNldH0gZm9yIFNBQUouCisgICAgICoKKyAgICAgKiBTQUFKIHdhbnRzICcmbHQ7JyBhbmQgJz4nIGZvciB0aGUgY29udGVudCBJRCwgYnV0IHtAbGluayBBdHRhY2htZW50U2V0fQorICAgICAqIGRvZXNuJ3QuIFMgdGhpcyBjbGFzcyBhbHNvIGRvZXMgdGhlIGNvbnZlcnNpb24gYmV0d2VlbiB0aGVtLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgU0FBSkF0dGFjaG1lbnRTZXQgaW1wbGVtZW50cyBBdHRhY2htZW50U2V0IHsKKworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF0dGFjaG1lbnQ+IGF0dE1hcDsKKyAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBhdHRJdGVyOworCisgICAgICAgIHB1YmxpYyBTQUFKQXR0YWNobWVudFNldChTT0FQTWVzc2FnZSBzbSkgeworICAgICAgICAgICAgYXR0SXRlciA9IHNtLmdldEF0dGFjaG1lbnRzKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgYXR0YWNobWVudCBieSB0aGUgY29udGVudCBJRC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBudWxsCisgICAgICAgICAqICAgICAgICAgaWYgbm8gc3VjaCBhdHRhY2htZW50IGV4aXN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEF0dGFjaG1lbnQgZ2V0KFN0cmluZyBjb250ZW50SWQpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlbiBjcmVhdGUgdGhlIGF0dGFjaG1lbnQgTWFwCisgICAgICAgICAgICBpZiAoYXR0TWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWF0dEl0ZXIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBhdHRNYXAgPSBjcmVhdGVBdHRhY2htZW50TWFwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihjb250ZW50SWQuY2hhckF0KDApICE9ICc8Jyl7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF0dE1hcC5nZXQoJzwnK2NvbnRlbnRJZCsnPicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGF0dE1hcC5nZXQoY29udGVudElkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICBpZihhdHRNYXAhPW51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGF0dE1hcC5pc0VtcHR5KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuICFhdHRJdGVyLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgYSBzZXQgb2YgZWxlbWVudHMgb2YgdHlwZSBULgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPEF0dGFjaG1lbnQ+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgaWYgKGF0dE1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXR0TWFwID0gY3JlYXRlQXR0YWNobWVudE1hcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGF0dE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBBdHRhY2htZW50PiBjcmVhdGVBdHRhY2htZW50TWFwKCkgeworICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEF0dGFjaG1lbnQ+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXR0YWNobWVudD4oKTsKKyAgICAgICAgICAgIHdoaWxlIChhdHRJdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gKEF0dGFjaG1lbnRQYXJ0KSBhdHRJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KGFwLmdldENvbnRlbnRJZCgpLCBuZXcgU0FBSkF0dGFjaG1lbnQoYXApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoQXR0YWNobWVudCBhdHQpIHsKKyAgICAgICAgICAgIGF0dE1hcC5wdXQoJzwnK2F0dC5nZXRDb250ZW50SWQoKSsnPicsIGF0dCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKKyAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBzbS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7CisgICAgICAgICAgICBET01VdGlsLndyaXRlVGFnV2l0aEF0dHJpYnV0ZXMoZW52LCB3cml0ZXIpOworICAgICAgICAgICAgaWYoaGFzSGVhZGVycygpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGVudi5nZXRQcmVmaXgoKSwiSGVhZGVyIixlbnYuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICAgICAgICAgIGludCBsZW4gPSBoZWFkZXJzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8bGVuOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMuZ2V0KGkpLndyaXRlVG8od3JpdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBET01VdGlsLnNlcmlhbGl6ZU5vZGUoc20uZ2V0U09BUEJvZHkoKSx3cml0ZXIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uMihleCk7CisgICAgICAgICAgICAvL2ZvciBub3cuIGFzayBqYXh3cyB0ZWFtIHdoYXQgdG8gZG8uCisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zb3VyY2UvUGF5bG9hZFNvdXJjZU1lc3NhZ2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc291cmNlL1BheWxvYWRTb3VyY2VNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxZWRjNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc291cmNlL1BheWxvYWRTb3VyY2VNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc291cmNlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5BdHRhY2htZW50U2V0SW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnN0cmVhbS5QYXlsb2FkU3RyZWFtUmVhZGVyTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuU291cmNlUmVhZGVyRmFjdG9yeTsKKworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworCisvKioKKyAqIHtAbGluayBNZXNzYWdlfSBiYWNrZWQgYnkge0BsaW5rIFNvdXJjZX0gYXMgcGF5bG9hZAorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBjbGFzcyBQYXlsb2FkU291cmNlTWVzc2FnZSBleHRlbmRzIFBheWxvYWRTdHJlYW1SZWFkZXJNZXNzYWdlIHsKKworICAgIHB1YmxpYyBQYXlsb2FkU291cmNlTWVzc2FnZShATnVsbGFibGUgSGVhZGVyTGlzdCBoZWFkZXJzLAorICAgICAgICBATm90TnVsbCBTb3VyY2UgcGF5bG9hZCwgQE5vdE51bGwgQXR0YWNobWVudFNldCBhdHRTZXQsCisgICAgICAgIEBOb3ROdWxsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisKKyAgICAgICAgc3VwZXIoaGVhZGVycywgU291cmNlUmVhZGVyRmFjdG9yeS5jcmVhdGVTb3VyY2VSZWFkZXIocGF5bG9hZCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgYXR0U2V0LCBzb2FwVmVyc2lvbik7CisgICAgfQorCisgICAgcHVibGljIFBheWxvYWRTb3VyY2VNZXNzYWdlKFNvdXJjZSBzLCBTT0FQVmVyc2lvbiBzb2FwVmVyKSB7CisgICAgICAgIHRoaXMobnVsbCwgcywgbmV3IEF0dGFjaG1lbnRTZXRJbXBsKCksIHNvYXBWZXIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zb3VyY2UvUHJvdG9jb2xTb3VyY2VNZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3NvdXJjZS9Qcm90b2NvbFNvdXJjZU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmIyNmVlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zb3VyY2UvUHJvdG9jb2xTb3VyY2VNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnNvdXJjZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29kZWNzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlN0cmVhbVNPQVBDb2RlYzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5Tb3VyY2VSZWFkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNZXNzYWdlfSBiYWNrZWQgYnkge0BsaW5rIFNvdXJjZX0gd2hlcmUgdGhlIFNvdXJjZQorICogcmVwcmVzZW50cyB0aGUgY29tcGxldGUgbWVzc2FnZSBzdWNoIGFzIGEgU09BUCBlbnZlbG9wZS4gSXQgdXNlcworICoge0BsaW5rIFN0cmVhbVNPQVBDb2RlY30gdG8gY3JlYXRlIGEge0BsaW5rIE1lc3NhZ2V9IGFuZCB1c2VzIGl0IGFzIGEKKyAqIGRlbGVnYXRlIGZvciBhbGwgdGhlIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBjbGFzcyBQcm90b2NvbFNvdXJjZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2Ugc207CisKKyAgICBwdWJsaWMgUHJvdG9jb2xTb3VyY2VNZXNzYWdlKFNvdXJjZSBzb3VyY2UsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTb3VyY2VSZWFkZXJGYWN0b3J5LmNyZWF0ZVNvdXJjZVJlYWRlcihzb3VyY2UsIHRydWUpOworICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5TdHJlYW1TT0FQQ29kZWMgY29kZWMgPSBDb2RlY3MuY3JlYXRlU09BUEVudmVsb3BlWG1sQ29kZWMoc29hcFZlcnNpb24pOworICAgICAgICBzbSA9IGNvZGVjLmRlY29kZShyZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBzbS5oYXNIZWFkZXJzKCk7CisgICAgfQorCisgICAgcHVibGljIEhlYWRlckxpc3QgZ2V0SGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIHNtLmdldEhlYWRlcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBheWxvYWRMb2NhbFBhcnQoKSB7CisgICAgICAgIHJldHVybiBzbS5nZXRQYXlsb2FkTG9jYWxQYXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gc20uZ2V0UGF5bG9hZE5hbWVzcGFjZVVSSSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1BheWxvYWQoKSB7CisgICAgICAgIHJldHVybiBzbS5oYXNQYXlsb2FkKCk7CisgICAgfQorCisgICAgcHVibGljIFNvdXJjZSByZWFkUGF5bG9hZEFzU291cmNlKCkgeworICAgICAgICByZXR1cm4gc20ucmVhZFBheWxvYWRBc1NvdXJjZSgpOworICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZFBheWxvYWQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNtLnJlYWRQYXlsb2FkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVQYXlsb2FkVG8oWE1MU3RyZWFtV3JpdGVyIHN3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc20ud3JpdGVQYXlsb2FkVG8oc3cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oWE1MU3RyZWFtV3JpdGVyIHN3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc20ud3JpdGVUbyhzdyk7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2UgY29weSgpIHsKKyAgICAgICAgcmV0dXJuIHNtLmNvcHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlIHJlYWRFbnZlbG9wZUFzU291cmNlKCkgeworICAgICAgICByZXR1cm4gc20ucmVhZEVudmVsb3BlQXNTb3VyY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU09BUE1lc3NhZ2UgcmVhZEFzU09BUE1lc3NhZ2UoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzbS5yZWFkQXNTT0FQTWVzc2FnZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTT0FQTWVzc2FnZSByZWFkQXNTT0FQTWVzc2FnZShQYWNrZXQgcGFja2V0LCBib29sZWFuIGluYm91bmQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNtLnJlYWRBc1NPQVBNZXNzYWdlKHBhY2tldCwgaW5ib3VuZCk7CisgICAgfQorCisgICAgcHVibGljIDxUPiBUIHJlYWRQYXlsb2FkQXNKQVhCKFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChUKXNtLnJlYWRQYXlsb2FkQXNKQVhCKHVubWFyc2hhbGxlcik7CisgICAgfQorCisgICAgcHVibGljIDxUPiBUIHJlYWRQYXlsb2FkQXNKQVhCKEJyaWRnZTxUPiBicmlkZ2UpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNtLnJlYWRQYXlsb2FkQXNKQVhCKGJyaWRnZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHNtLndyaXRlVG8oY29udGVudEhhbmRsZXIsIGVycm9ySGFuZGxlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zb3VyY2UvU291cmNlVXRpbHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc291cmNlL1NvdXJjZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkYzdhNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc291cmNlL1NvdXJjZVV0aWxzLmphdmEKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnNvdXJjZTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuUm9vdEVsZW1lbnRTbmlmZmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5Tb3VyY2VSZWFkZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworZmluYWwgY2xhc3MgU291cmNlVXRpbHMgeworCisgICAgaW50IHNyY1R5cGU7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBkb21Tb3VyY2UgPSAxOworICAgIHByaXZhdGUgZmluYWwgaW50IHN0cmVhbVNvdXJjZSA9IDI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2F4U291cmNlPTQ7CisKKyAgICBwdWJsaWMgU291cmNlVXRpbHMoU291cmNlIHNyYykgeworICAgICAgICBpZihzcmMgaW5zdGFuY2VvZiBTdHJlYW1Tb3VyY2UpeworICAgICAgICAgICAgc3JjVHlwZSA9IHN0cmVhbVNvdXJjZTsKKyAgICAgICAgfWVsc2UgaWYoc3JjIGluc3RhbmNlb2YgRE9NU291cmNlKXsKKyAgICAgICAgICAgIHNyY1R5cGUgPSBkb21Tb3VyY2U7CisgICAgICAgIH1lbHNlIGlmKHNyYyBpbnN0YW5jZW9mIFNBWFNvdXJjZSl7CisgICAgICAgICAgICBzcmNUeXBlID0gc2F4U291cmNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNET01Tb3VyY2UoKXsKKyAgICAgICAgcmV0dXJuIChzcmNUeXBlJmRvbVNvdXJjZSkgPT0gZG9tU291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3RyZWFtU291cmNlKCl7CisgICAgICAgIHJldHVybiAoc3JjVHlwZSZzdHJlYW1Tb3VyY2UpID09IHN0cmVhbVNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NheFNvdXJjZSgpeworICAgICAgICByZXR1cm4gKHNyY1R5cGUmc2F4U291cmNlKSA9PSBzYXhTb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB3b3VsZCBwZWVrIGludG8gdGhlIFNvdXJjZSAoRE9NU291cmNlIGFuZCBTQVhTb3VyY2UpIGZvciB0aGUgbG9jYWxOYW1lIGFuZCBOYW1lc3BhY2VVUkkKKyAgICAgKiBvZiB0aGUgdG9wLWxldmVsIGVsZW1lbnQuCisgICAgICogQHBhcmFtIHNyYworICAgICAqIEByZXR1cm4gUU5hbWUgb2YgdGhlIHBheWxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWUgc25pZmYoU291cmNlIHNyYykgeworICAgICAgICByZXR1cm4gc25pZmYoc3JjLCBuZXcgUm9vdEVsZW1lbnRTbmlmZmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBzbmlmZihTb3VyY2Ugc3JjLCBSb290RWxlbWVudFNuaWZmZXIgc25pZmZlcil7CisgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVXJpID0gbnVsbDsKKworICAgICAgICBpZihpc0RPTVNvdXJjZSgpKXsKKyAgICAgICAgICAgIERPTVNvdXJjZSBkb21Tb3VyY2UgPSAoRE9NU291cmNlKXNyYzsKKyAgICAgICAgICAgIE5vZGUgbiA9IGRvbVNvdXJjZS5nZXROb2RlKCk7CisgICAgICAgICAgICBpZihuLmdldE5vZGVUeXBlKCk9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBuID0gKChEb2N1bWVudCluKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IG4uZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICBuYW1lc3BhY2VVcmkgPSBuLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICB9ZWxzZSBpZihpc1NheFNvdXJjZSgpKXsKKyAgICAgICAgICAgIFNBWFNvdXJjZSBzYXhTcmMgPSAoU0FYU291cmNlKXNyYzsKKyAgICAgICAgICAgIFNBWFJlc3VsdCBzYXhSZXN1bHQgPSBuZXcgU0FYUmVzdWx0KHNuaWZmZXIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0ciA9IFhtbFV0aWwubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgICAgICAgICAgICB0ci50cmFuc2Zvcm0oc2F4U3JjLCBzYXhSZXN1bHQpOworICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGR1ZSB0byBhYm9ydGluZyB0aGUgcHJvY2Vzc2luZyBhZnRlciB0aGUgZmlyc3QgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgZHVlIHRvIGVycm9yIGluIHRoZSBvYmplY3QsIHRoZSBzYW1lIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSByZWFkSGVhZGVyKCkgbWV0aG9kIGlzIHVzZWQsIHNvIHdlIGRvbid0IGhhdmUgdG8gcmVwb3J0CisgICAgICAgICAgICAgICAgLy8gYW4gZXJyb3IgcmlnaHQgbm93LgorICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IHNuaWZmZXIuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlVXJpID0gc25pZmZlci5nZXROc1VyaSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlVXJpLCBsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemVTb3VyY2UoU291cmNlIHNyYywgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTb3VyY2VSZWFkZXJGYWN0b3J5LmNyZWF0ZVNvdXJjZVJlYWRlcihzcmMsIHRydWUpOworICAgICAgICBpbnQgc3RhdGU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXRlID0gcmVhZGVyLm5leHQoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeSwgc2hvdWxkbid0IHplcGh5ciByZXR1cm4gIiIgaW5zdGVhZCBvZgorICAgICAgICAgICAgICAgICAgICAgKiBudWxsIGZvciBnZXROYW1lc3BhY2VVUkkoKSBhbmQgZ2V0UHJlZml4KCk/CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcmVhZGVyLmdldFByZWZpeCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZpeC5sZW5ndGgoKSA+IDApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEJlZm9yZSB3ZSB3cml0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd3JpdGVyVVJJID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXJVUkkgPSB3cml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3cml0ZXJQcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVjbGFyZVByZWZpeChwcmVmaXgsIHVyaSwgd3JpdGVyUHJlZml4LCB3cml0ZXJVUkkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHByZWZpeCwgdXJpICE9IG51bGwgPyB1cmkgOiAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgdXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnNQcmVmaXggPSByZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zUHJlZml4ID09IG51bGwpIG5zUHJlZml4ID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdEFYIHJldHVybnMgbnVsbCBmb3IgZGVmYXVsdCBucworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdyaXRlclVSSSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlclVSSSA9IHdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gWmVwaHlyOiBXaHkgaXMgdGhpcyByZXR1cm5pbmcgbnVsbD8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBhcmUgbnNQcmVmaXggd2l0aCBwcmVmaXggYmVjYXVzZSBvZiBbMV0gKGFib3ZlKQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYWRlclVSSSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogd3JpdGUgdGhlIG5hbWVzcGFjZSBpbiAzIGNvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAtIHdoZW4gdGhlIG5hbWVzcGFjZSBVUkkgaXMgbm90IGJvdW5kIHRvIHRoZSBwcmVmaXggaW4gd3JpdGVyKHdyaXRlclVSSSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICogIC0gd2hlbiB0aGUgcmVhZGVyUHJlZml4IGFuZCB3cml0ZXJQcmVmaXggYXJlICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgLSB3aGVuIHJlYWRlclByZWZpeCBhbmQgd3JpdGVyUHJlZml4IGFyZSBub3QgZXF1YWwgYW5kIHRoZSBVUkkgYm91bmQgdG8gdGhlbQorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgYXJlIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyVVJJID09IG51bGwgfHwgKChuc1ByZWZpeC5sZW5ndGgoKSA9PSAwKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5zUHJlZml4LmVxdWFscyhwcmVmaXgpICYmICF3cml0ZXJVUkkuZXF1YWxzKHJlYWRlclVSSSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChuc1ByZWZpeCwgcmVhZGVyVVJJICE9IG51bGwgPyByZWFkZXJVUkkgOiAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKG5zUHJlZml4LCByZWFkZXJVUkkgIT0gbnVsbCA/IHJlYWRlclVSSSA6ICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgbiA9IHJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJQcmVmaXggPSByZWFkZXIuZ2V0QXR0cmlidXRlUHJlZml4KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJVUkkgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0clByZWZpeCAhPSBudWxsID8gYXR0clByZWZpeCA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJVUkkgIT0gbnVsbCA/IGF0dHJVUkkgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0cmlidXRlIHByZWZpeCBpcyB1bmRlY2xhcmVkIGluIGN1cnJlbnQgd3JpdGVyIHNjb3BlIHRoZW4gZGVjbGFyZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0VW5kZWNsYXJlZFByZWZpeChhdHRyUHJlZml4LCBhdHRyVVJJLCB3cml0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlM6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMocmVhZGVyLmdldFRleHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0YXRlICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQpOworICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRzIHVuZGVjbGFyZWQgcHJlZml4ZXMgb24gdGhlIHdyaXRlcgorICAgICAqIEBwYXJhbSBwcmVmaXgKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFVuZGVjbGFyZWRQcmVmaXgoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHJlYWRlclVSSSwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB3cml0ZXJVUkkgPSBudWxsOworICAgICAgICBpZiAod3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKSAhPSBudWxsKQorICAgICAgICAgICAgd3JpdGVyVVJJID0gd3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKKworICAgICAgICBpZiAod3JpdGVyVVJJID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCByZWFkZXJVUkkgIT0gbnVsbCA/IHJlYWRlclVSSSA6ICIiKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIHJlYWRlclVSSSAhPSBudWxsID8gcmVhZGVyVVJJIDogIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hlY2sgaWYgd2UgbmVlZCB0byBkZWNsYXJlCisgICAgICogQHBhcmFtIHJQcmVmaXgKKyAgICAgKiBAcGFyYW0gclVyaQorICAgICAqIEBwYXJhbSB3UHJlZml4CisgICAgICogQHBhcmFtIHdVcmkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlY2xhcmVQcmVmaXgoU3RyaW5nIHJQcmVmaXgsIFN0cmluZyByVXJpLCBTdHJpbmcgd1ByZWZpeCwgU3RyaW5nIHdVcmkpeworICAgICAgICBpZiAod1VyaSA9PSBudWxsIHx8KCh3UHJlZml4ICE9IG51bGwpICYmICFyUHJlZml4LmVxdWFscyh3UHJlZml4KSl8fAorICAgICAgICAgICAgICAgIChyVXJpICE9IG51bGwgJiYgIXdVcmkuZXF1YWxzKHJVcmkpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zdHJlYW0vT3V0Ym91bmRTdHJlYW1IZWFkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc3RyZWFtL091dGJvdW5kU3RyZWFtSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiZmM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc3RyZWFtL091dGJvdW5kU3RyZWFtSGVhZGVyLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnN0cmVhbTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLkZpbmFsQXJyYXlMaXN0OworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXJFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQWJzdHJhY3RIZWFkZXJJbXBsOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworCisvKioKKyAqIFVzZWQgdG8gcmVwcmVzZW50IG91dGJvdW5kIGhlYWRlciBjcmVhdGVkIGZyb20ge0BsaW5rIFhNTFN0cmVhbUJ1ZmZlcn0uCisgKgorICogPHA+CisgKiBUaGlzIGlzIG9wdGltaXplZCBmb3Igb3V0Ym91bmQgdXNlLCBzbyBpdCBpbXBsZW1lbnRzIHNvbWUgb2YgdGhlIG1ldGhvZHMgbGF6aWx5LAorICogaW4gYSBzbG93IHdheS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPdXRib3VuZFN0cmVhbUhlYWRlciBleHRlbmRzIEFic3RyYWN0SGVhZGVySW1wbCB7CisgICAgcHJpdmF0ZSBmaW5hbCBYTUxTdHJlYW1CdWZmZXIgaW5mb3NldDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuc1VyaSxsb2NhbE5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXR0cmlidXRlcyBvbiB0aGUgaGVhZGVyIGVsZW1lbnQuCisgICAgICogTGF6aWx5IHBhcnNlZC4KKyAgICAgKiBOdWxsIGlmIG5vdCBwYXJzZWQgeWV0LgorICAgICAqLworICAgIHByaXZhdGUgRmluYWxBcnJheUxpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzOworCisgICAgcHVibGljIE91dGJvdW5kU3RyZWFtSGVhZGVyKFhNTFN0cmVhbUJ1ZmZlciBpbmZvc2V0LCBTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgdGhpcy5pbmZvc2V0ID0gaW5mb3NldDsKKyAgICAgICAgdGhpcy5uc1VyaSA9IG5zVXJpOworICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIG5zVXJpOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCkgeworICAgICAgICByZXR1cm4gbG9jYWxOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuc1VyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBpZihhdHRyaWJ1dGVzPT1udWxsKQorICAgICAgICAgICAgcGFyc2VBdHRyaWJ1dGVzKCk7CisgICAgICAgIGZvcihpbnQgaT1hdHRyaWJ1dGVzLnNpemUoKS0xOyBpPj0wOyBpLS0gKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYSA9IGF0dHJpYnV0ZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYoYS5sb2NhbE5hbWUuZXF1YWxzKGxvY2FsTmFtZSkgJiYgYS5uc1VyaS5lcXVhbHMobnNVcmkpKQorICAgICAgICAgICAgICAgIHJldHVybiBhLnZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlIGRvbid0IHJlYWxseSBleHBlY3QgdGhpcyB0byBiZSB1c2VkLCBidXQganVzdCB0byBzYXRpc2Z5CisgICAgICogdGhlIHtAbGluayBIZWFkZXJ9IGNvbnRyYWN0LgorICAgICAqCisgICAgICogU28gdGhpcyBpcyByYXRoZXIgc2xvdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VBdHRyaWJ1dGVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IHJlYWRIZWFkZXIoKTsKKworICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBGaW5hbEFycmF5TGlzdDxBdHRyaWJ1dGU+KCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVUkkgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKKworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBBdHRyaWJ1dGUobmFtZXNwYWNlVVJJLGxvY2FsTmFtZSx2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIHRoZSBhdHRyaWJ1dGVzIGZvciB7Iituc1VyaSsifSIrbG9jYWxOYW1lKyIgaGVhZGVyIixlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgcmVhZEhlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gaW5mb3NldC5yZWFkQXNYTUxTdHJlYW1SZWFkZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFhNTFN0cmVhbVdyaXRlciB3KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgaW5mb3NldC53cml0ZVRvWE1MU3RyZWFtV3JpdGVyKHcsdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTT0FQTWVzc2FnZSBzYWFqKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmZvc2V0LndyaXRlVG8oc2Fhai5nZXRTT0FQSGVhZGVyKCkpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1CdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaW5mb3NldC53cml0ZVRvKGNvbnRlbnRIYW5kbGVyLGVycm9ySGFuZGxlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBLZWVwIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBhdHRyaWJ1dGUgb24gdGhlIGhlYWRlciBlbGVtZW50LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBdHRyaWJ1dGUgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FuIGJlIGVtcHR5IGJ1dCBuZXZlciBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgU3RyaW5nIG5zVXJpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lOworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5uc1VyaSA9IGZpeE51bGwobnNVcmkpOworICAgICAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydCBudWxsIHRvICIiLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGlmKHM9PW51bGwpIHJldHVybiAiIjsKKyAgICAgICAgICAgIGVsc2UgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2UgdGhlIHBlcmZvcm1hbmNlIHBhcmFub2lkIHBlb3BsZSBpbiB0aGUgSkFYLVdTIFJJIHRoaW5rcworICAgICAqIHNhdmluZyB0aHJlZSBieXRlcyBpcyB3b3J0aCB3aGlsZS4uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFX1ZBTFVFID0gIjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU19SRUZFUkVOQ0VfUEFSQU1FVEVSID0gIklzUmVmZXJlbmNlUGFyYW1ldGVyIjsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc3RyZWFtL1BheWxvYWRTdHJlYW1SZWFkZXJNZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3N0cmVhbS9QYXlsb2FkU3RyZWFtUmVhZGVyTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWUxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3N0cmVhbS9QYXlsb2FkU3RyZWFtUmVhZGVyTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW07CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5BYnN0cmFjdE1lc3NhZ2VJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQXR0YWNobWVudFNldEltcGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CisKKy8qKgorICoge0BsaW5rIE1lc3NhZ2V9IGJhY2tlZCBieSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSBhcyBwYXlsb2FkCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGNsYXNzIFBheWxvYWRTdHJlYW1SZWFkZXJNZXNzYWdlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlSW1wbCB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJlYW1NZXNzYWdlIG1lc3NhZ2U7CisKKyAgICBwdWJsaWMgUGF5bG9hZFN0cmVhbVJlYWRlck1lc3NhZ2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgU09BUFZlcnNpb24gc29hcFZlcikgeworICAgICAgICB0aGlzKG51bGwsIHJlYWRlcixuZXcgQXR0YWNobWVudFNldEltcGwoKSwgc29hcFZlcik7CisgICAgfQorCisgICAgcHVibGljIFBheWxvYWRTdHJlYW1SZWFkZXJNZXNzYWdlKEBOdWxsYWJsZSBIZWFkZXJMaXN0IGhlYWRlcnMsIEBOb3ROdWxsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb3ROdWxsIEF0dGFjaG1lbnRTZXQgYXR0U2V0LCBATm90TnVsbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICBzdXBlcihzb2FwVmVyc2lvbik7CisgICAgICAgIG1lc3NhZ2UgPSBuZXcgU3RyZWFtTWVzc2FnZShoZWFkZXJzLCBhdHRTZXQsIHJlYWRlciwgc29hcFZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlLmhhc0hlYWRlcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyTGlzdCBnZXRIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZS5nZXRIZWFkZXJzKCk7CisgICAgfQorCisgICAgcHVibGljIEF0dGFjaG1lbnRTZXQgZ2V0QXR0YWNobWVudHMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlLmdldEF0dGFjaG1lbnRzKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTG9jYWxQYXJ0KCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZS5nZXRQYXlsb2FkTG9jYWxQYXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZS5nZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUGF5bG9hZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIFNvdXJjZSByZWFkUGF5bG9hZEFzU291cmNlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZS5yZWFkUGF5bG9hZEFzU291cmNlKCk7CisgICAgfQorCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkUGF5bG9hZCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbWVzc2FnZS5yZWFkUGF5bG9hZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlUGF5bG9hZFRvKFhNTFN0cmVhbVdyaXRlciBzdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIG1lc3NhZ2Uud3JpdGVQYXlsb2FkVG8oc3cpOworICAgIH0KKworICAgIHB1YmxpYyA8VD4gVCByZWFkUGF5bG9hZEFzSkFYQihVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoVCkgbWVzc2FnZS5yZWFkUGF5bG9hZEFzSkFYQih1bm1hcnNoYWxsZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBtZXNzYWdlLndyaXRlVG8oY29udGVudEhhbmRsZXIsIGVycm9ySGFuZGxlcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQYXlsb2FkVG8oQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIGJvb2xlYW4gZnJhZ21lbnQpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBtZXNzYWdlLndyaXRlUGF5bG9hZFRvKGNvbnRlbnRIYW5kbGVyLCBlcnJvckhhbmRsZXIsIGZyYWdtZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZSBjb3B5KCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZS5jb3B5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zdHJlYW0vU3RyZWFtQXR0YWNobWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zdHJlYW0vU3RyZWFtQXR0YWNobWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2Q5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3N0cmVhbS9TdHJlYW1BdHRhY2htZW50LmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLnN0cmVhbTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CeXRlQXJyYXlEYXRhU291cmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOworCitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm9yZy5qdm5ldC5zdGF4ZXguQmFzZTY0RGF0YTsKKworLyoqCisgKiBBdHRhY2htZW50IGNyZWF0ZWQgZnJvbSByYXcgYnl0ZXMuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGNsYXNzIFN0cmVhbUF0dGFjaG1lbnQgaW1wbGVtZW50cyBBdHRhY2htZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZW50SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudFR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQXJyYXlCdWZmZXIgYnl0ZUFycmF5QnVmZmVyOworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGRhdGE7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGVuOworCisgICAgcHVibGljIFN0cmVhbUF0dGFjaG1lbnQoQnl0ZUFycmF5QnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGNvbnRlbnRJZCwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHRoaXMuY29udGVudElkID0gY29udGVudElkOworICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgIHRoaXMuYnl0ZUFycmF5QnVmZmVyID0gYnVmZmVyOworICAgICAgICB0aGlzLmRhdGEgPSBieXRlQXJyYXlCdWZmZXIuZ2V0UmF3RGF0YSgpOworICAgICAgICB0aGlzLmxlbiA9IGJ5dGVBcnJheUJ1ZmZlci5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50SWQoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICAgIH0KKworCisgICAgcHVibGljIGJ5dGVbXSBhc0J5dGVBcnJheSgpIHsKKyAgICAgICAgLy93ZSBnb3QgdG8gcmVhbGxvY2F0ZSBhbmQgZ2l2ZSB0aGUgZXhhY3QgYnl0ZVtdCisgICAgICAgIHJldHVybiBieXRlQXJyYXlCdWZmZXIudG9CeXRlQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUhhbmRsZXIgYXNEYXRhSGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlcihuZXcgQnl0ZUFycmF5RGF0YVNvdXJjZShkYXRhLDAsbGVuLGdldENvbnRlbnRUeXBlKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlIGFzU291cmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSwwLGxlbikpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBhc0lucHV0U3RyZWFtKCkgeworICAgICAgICByZXR1cm4gYnl0ZUFycmF5QnVmZmVyLm5ld0lucHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgcHVibGljIEJhc2U2NERhdGEgYXNCYXNlNjREYXRhKCl7CisgICAgICAgIEJhc2U2NERhdGEgYmFzZTY0RGF0YSA9IG5ldyBCYXNlNjREYXRhKCk7CisgICAgICAgIGJhc2U2NERhdGEuc2V0KGRhdGEsIGxlbiwgY29udGVudFR5cGUpOworICAgICAgICByZXR1cm4gYmFzZTY0RGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZUFycmF5QnVmZmVyLndyaXRlVG8ob3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU09BUE1lc3NhZ2Ugc2FhaikgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICBBdHRhY2htZW50UGFydCBwYXJ0ID0gc2Fhai5jcmVhdGVBdHRhY2htZW50UGFydCgpOworICAgICAgICBwYXJ0LnNldFJhd0NvbnRlbnRCeXRlcyhkYXRhLDAsbGVuLGdldENvbnRlbnRUeXBlKCkpOworICAgICAgICBwYXJ0LnNldENvbnRlbnRJZChjb250ZW50SWQpOworICAgICAgICBzYWFqLmFkZEF0dGFjaG1lbnRQYXJ0KHBhcnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc3RyZWFtL1N0cmVhbUhlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zdHJlYW0vU3RyZWFtSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmZjU3OAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc3RyZWFtL1N0cmVhbUhlYWRlci5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2Uuc3RyZWFtOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuRmluYWxBcnJheUxpc3Q7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlclNvdXJjZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuV1NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5BYnN0cmFjdEhlYWRlckltcGw7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICoge0BsaW5rIEhlYWRlcn0gd2hvc2UgcGh5c2ljYWwgZGF0YSByZXByZXNlbnRhdGlvbiBpcyBhbiBYTUxTdHJlYW1CdWZmZXIuCisgKgorICogQGF1dGhvciBQYXVsLlNhbmRvekBTdW4uQ29tCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJlYW1IZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdEhlYWRlckltcGwgeworICAgIHByb3RlY3RlZCBmaW5hbCBYTUxTdHJlYW1CdWZmZXIgX21hcms7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaXNNdXN0VW5kZXJzdGFuZDsKKworICAgIC8qKgorICAgICAqIFJvbGUgb3IgYWN0b3IgdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEBOb3ROdWxsIFN0cmluZyBfcm9sZTsKKworICAgIHByb3RlY3RlZCBib29sZWFuIF9pc1JlbGF5OworCisgICAgcHJvdGVjdGVkIFN0cmluZyBfbG9jYWxOYW1lOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBfbmFtZXNwYWNlVVJJOworCisgICAgLyoqCisgICAgICogS2VlcCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYW4gYXR0cmlidXRlIG9uIHRoZSBoZWFkZXIgZWxlbWVudC4KKyAgICAgKgorICAgICAqIFRPRE86IHRoaXMgd2hvbGUgYXR0cmlidXRlIGhhbmRsaW5nIGNvdWxkIGJlIGRvbmUgYmV0dGVyLCBJIHRoaW5rLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbiBiZSBlbXB0eSBidXQgbmV2ZXIgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFN0cmluZyBuc1VyaTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUoU3RyaW5nIG5zVXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMubnNVcmkgPSBmaXhOdWxsKG5zVXJpKTsKKyAgICAgICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGF0dHJpYnV0ZXMgb24gdGhlIGhlYWRlciBlbGVtZW50LgorICAgICAqIFdlIGV4cGVjdCB0aGVyZSB0byBiZSBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHRoZW0sCisgICAgICogc28gdGhlIHVzZSBvZiB7QGxpbmsgTGlzdH0gd291bGQgYmUganVzdGlmaWVkLgorICAgICAqCisgICAgICogTnVsbCBpZiBubyBhdHRyaWJ1dGUgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEZpbmFsQXJyYXlMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgU3RyZWFtSGVhZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiAgICAgIFRoZSBwYXJzZXIgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBtYXJrLgorICAgICAqICAgICAgVGVjaG5pY2FsbHkgdGhpcyBpbmZvcm1hdGlvbiBpcyByZWR1bmRhbnQsCisgICAgICogICAgICBidXQgaXQgYWNoaWV2ZXMgYSBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICogQHBhcmFtIG1hcmsKKyAgICAgKiAgICAgIFRoZSBzdGFydCBvZiB0aGUgYnVmZmVyZWQgaGVhZGVyIGNvbnRlbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmVhbUhlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBYTUxTdHJlYW1CdWZmZXIgbWFyaykgeworICAgICAgICBhc3NlcnQgcmVhZGVyIT1udWxsICYmIG1hcmshPW51bGw7CisgICAgICAgIF9tYXJrID0gbWFyazsKKyAgICAgICAgX2xvY2FsTmFtZSA9IHJlYWRlci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgX25hbWVzcGFjZVVSSSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgYXR0cmlidXRlcyA9IHByb2Nlc3NIZWFkZXJBdHRyaWJ1dGVzKHJlYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBTdHJlYW1IZWFkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlcgorICAgICAqICAgICAgVGhlIHBhcnNlciB0aGF0IHBvaW50cyB0byB0aGUgc3RhcnQgdGFnIG9mIHRoZSBoZWFkZXIuCisgICAgICogICAgICBCeSB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLCB0aGUgcGFyc2VyIHdpbGwgcG9pbnQgYXQKKyAgICAgKiAgICAgIHRoZSBlbmQgdGFnIG9mIHRoaXMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyZWFtSGVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBfbG9jYWxOYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOworICAgICAgICBfbmFtZXNwYWNlVVJJID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICBhdHRyaWJ1dGVzID0gcHJvY2Vzc0hlYWRlckF0dHJpYnV0ZXMocmVhZGVyKTsKKyAgICAgICAgLy8gY2FjaGUgdGhlIGJvZHkKKyAgICAgICAgX21hcmsgPSBYTUxTdHJlYW1CdWZmZXIuY3JlYXRlTmV3QnVmZmVyRnJvbVhNTFN0cmVhbVJlYWRlcihyZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSWdub3JhYmxlKEBOb3ROdWxsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uLCBATm90TnVsbCBTZXQ8U3RyaW5nPiByb2xlcykgeworICAgICAgICAvLyBjaGVjayBtdXN0VW5kZXJzdGFuZAorICAgICAgICBpZighX2lzTXVzdFVuZGVyc3RhbmQpIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChyb2xlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gbm93IHJvbGUKKyAgICAgICAgcmV0dXJuICFyb2xlcy5jb250YWlucyhfcm9sZSk7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIFN0cmluZyBnZXRSb2xlKEBOb3ROdWxsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgIGFzc2VydCBfcm9sZSE9bnVsbDsKKyAgICAgICAgcmV0dXJuIF9yb2xlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVsYXkoKSB7CisgICAgICAgIHJldHVybiBfaXNSZWxheTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lc3BhY2VVUkk7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7CisgICAgICAgIHJldHVybiBfbG9jYWxOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuc1VyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBpZihhdHRyaWJ1dGVzIT1udWxsKSB7CisgICAgICAgICAgICBmb3IoaW50IGk9YXR0cmlidXRlcy5zaXplKCktMTsgaT49MDsgaS0tICkgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhID0gYXR0cmlidXRlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYoYS5sb2NhbE5hbWUuZXF1YWxzKGxvY2FsTmFtZSkgJiYgYS5uc1VyaS5lcXVhbHMobnNVcmkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS52YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgaGVhZGVyIGFzIGEge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIHJlYWRIZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIF9tYXJrLnJlYWRBc1hNTFN0cmVhbVJlYWRlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oWE1MU3RyZWFtV3JpdGVyIHcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAvLyBUT0RPIHdoYXQgYWJvdXQgaW4tc2NvcGUgbmFtZXNwYWNlcworICAgICAgICBfbWFyay53cml0ZVRvWE1MU3RyZWFtV3JpdGVyKHcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU09BUE1lc3NhZ2Ugc2FhaikgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVE9ETyB3aGF0IGFib3V0IGluLXNjb3BlIG5hbWVzcGFjZXMKKyAgICAgICAgICAgIC8vIE5vdCB2ZXJ5IGVmZmljaWVudCBjb25zaWRlciBpbXBsZW1lbnRpbmcgYSBzdHJlYW0gYnVmZmVyCisgICAgICAgICAgICAvLyBwcm9jZXNzb3IgdGhhdCBwcm9kdWNlcyBhIERPTSBub2RlIGZyb20gdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgVHJhbnNmb3JtZXIgdCA9IHRmLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgICBYTUxTdHJlYW1CdWZmZXJTb3VyY2Ugc291cmNlID0gbmV3IFhNTFN0cmVhbUJ1ZmZlclNvdXJjZShfbWFyayk7CisgICAgICAgICAgICBET01SZXN1bHQgcmVzdWx0ID0gbmV3IERPTVJlc3VsdCgpOworICAgICAgICAgICAgdC50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOworICAgICAgICAgICAgTm9kZSBkID0gcmVzdWx0LmdldE5vZGUoKTsKKyAgICAgICAgICAgIGlmKGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCisgICAgICAgICAgICAgICAgZCA9IGQuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBzYWFqLmdldFNPQVBIZWFkZXIoKTsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IGhlYWRlci5nZXRPd25lckRvY3VtZW50KCkuaW1wb3J0Tm9kZShkLCB0cnVlKTsKKyAgICAgICAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChub2RlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIF9tYXJrLndyaXRlVG8oY29udGVudEhhbmRsZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gRVBSIHdpdGhvdXQgY29weWluZyBpbmZvc2V0LgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gaW1wbGVtZW50YXRpb24gb24gd2hpY2gge0BsaW5rIEhlYWRlciNyZWFkQXNFUFIoQWRkcmVzc2luZ1ZlcnNpb24pfQorICAgICAqIGlzIGludm9rZWQgb24uCisgICAgICovCisgICAgQE92ZXJyaWRlIEBOb3ROdWxsCisgICAgcHVibGljIFdTRW5kcG9pbnRSZWZlcmVuY2UgcmVhZEFzRVBSKEFkZHJlc3NpbmdWZXJzaW9uIGV4cGVjdGVkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXU0VuZHBvaW50UmVmZXJlbmNlKF9tYXJrLGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmluYWxBcnJheUxpc3Q8QXR0cmlidXRlPiBwcm9jZXNzSGVhZGVyQXR0cmlidXRlcyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgbnVsbCB0byAiIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZml4TnVsbChTdHJpbmcgcykgeworICAgICAgICBpZihzPT1udWxsKSByZXR1cm4gIiI7CisgICAgICAgIGVsc2UgICAgICAgIHJldHVybiBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc3RyZWFtL1N0cmVhbUhlYWRlcjExLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3N0cmVhbS9TdHJlYW1IZWFkZXIxMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDUzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3N0cmVhbS9TdHJlYW1IZWFkZXIxMS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW07CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5GaW5hbEFycmF5TGlzdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLlV0aWw7CisKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworCisvKioKKyAqIHtAbGluayBTdHJlYW1IZWFkZXJ9IGZvciBTT0FQIDEuMS4KKyAqCisgKiBAYXV0aG9yIFBhdWwuU2FuZG96QFN1bi5Db20KKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSJ9KQorcHVibGljIGNsYXNzIFN0cmVhbUhlYWRlcjExIGV4dGVuZHMgU3RyZWFtSGVhZGVyIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQXzFfMV9NVVNUX1VOREVSU1RBTkQgPSAibXVzdFVuZGVyc3RhbmQiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF8xXzFfUk9MRSA9ICJhY3RvciI7CisKKyAgICBwdWJsaWMgU3RyZWFtSGVhZGVyMTEoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgWE1MU3RyZWFtQnVmZmVyIG1hcmspIHsKKyAgICAgICAgc3VwZXIocmVhZGVyLCBtYXJrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyZWFtSGVhZGVyMTEoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHJlYWRlcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIEZpbmFsQXJyYXlMaXN0PEF0dHJpYnV0ZT4gcHJvY2Vzc0hlYWRlckF0dHJpYnV0ZXMoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBGaW5hbEFycmF5TGlzdDxBdHRyaWJ1dGU+IGF0dHMgPSBudWxsOworCisgICAgICAgIF9yb2xlID0gU09BUENvbnN0YW50cy5VUklfU09BUF9BQ1RPUl9ORVhUOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKKworICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSkgeworICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgPT0gU09BUF8xXzFfTVVTVF9VTkRFUlNUQU5EKSB7CisgICAgICAgICAgICAgICAgICAgIF9pc011c3RVbmRlcnN0YW5kID0gVXRpbC5wYXJzZUJvb2wodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lID09IFNPQVBfMV8xX1JPTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfcm9sZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihhdHRzPT1udWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cyA9IG5ldyBGaW5hbEFycmF5TGlzdDxBdHRyaWJ1dGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRzLmFkZChuZXcgQXR0cmlidXRlKG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUsdmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhdHRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21lc3NhZ2Uvc3RyZWFtL1N0cmVhbUhlYWRlcjEyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3N0cmVhbS9TdHJlYW1IZWFkZXIxMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOGJjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3N0cmVhbS9TdHJlYW1IZWFkZXIxMi5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW07CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLlhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLlV0aWw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuRmluYWxBcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworCisvKioKKyAqIHtAbGluayBTdHJlYW1IZWFkZXJ9IGZvciBTT0FQIDEuMi4KKyAqCisgKiBAYXV0aG9yIFBhdWwuU2FuZG96QFN1bi5Db20KKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSJ9KQorcHVibGljIGNsYXNzIFN0cmVhbUhlYWRlcjEyIGV4dGVuZHMgU3RyZWFtSGVhZGVyIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQXzFfMl9NVVNUX1VOREVSU1RBTkQgPSAibXVzdFVuZGVyc3RhbmQiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF8xXzJfUk9MRSA9ICJyb2xlIjsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfMV8yX1JFTEFZID0gInJlbGF5IjsKKworICAgIHB1YmxpYyBTdHJlYW1IZWFkZXIxMihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBYTUxTdHJlYW1CdWZmZXIgbWFyaykgeworICAgICAgICBzdXBlcihyZWFkZXIsIG1hcmspOworICAgIH0KKworICAgIHB1YmxpYyBTdHJlYW1IZWFkZXIxMihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIocmVhZGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgRmluYWxBcnJheUxpc3Q8QXR0cmlidXRlPiBwcm9jZXNzSGVhZGVyQXR0cmlidXRlcyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIEZpbmFsQXJyYXlMaXN0PEF0dHJpYnV0ZT4gYXR0cyA9IG51bGw7CisKKyAgICAgICAgX3JvbGUgPSBTT0FQQ29uc3RhbnRzLlVSSV9TT0FQXzFfMl9ST0xFX1VMVElNQVRFX1JFQ0VJVkVSOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKKworICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRSkgeworICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgPT0gU09BUF8xXzJfTVVTVF9VTkRFUlNUQU5EKSB7CisgICAgICAgICAgICAgICAgICAgIF9pc011c3RVbmRlcnN0YW5kID0gVXRpbC5wYXJzZUJvb2wodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lID09IFNPQVBfMV8yX1JPTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfcm9sZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUgPT0gU09BUF8xXzJfUkVMQVkpIHsKKyAgICAgICAgICAgICAgICAgICAgX2lzUmVsYXkgPSBVdGlsLnBhcnNlQm9vbCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihhdHRzPT1udWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cyA9IG5ldyBGaW5hbEFycmF5TGlzdDxBdHRyaWJ1dGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRzLmFkZChuZXcgQXR0cmlidXRlKG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUsdmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhdHRzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zdHJlYW0vU3RyZWFtTWVzc2FnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbWVzc2FnZS9zdHJlYW0vU3RyZWFtTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTlmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tZXNzYWdlL3N0cmVhbS9TdHJlYW1NZXNzYWdlLmphdmEKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5zdHJlYW07CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLlhNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uYnVmZmVyLnN0YXguU3RyZWFtUmVhZGVyQnVmZmVyQ3JlYXRvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyTGlzdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5UYWdJbmZvc2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuQWJzdHJhY3RNZXNzYWdlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLkR1bW15TG9jYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuU3RBWFNvdXJjZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YTUxTdHJlYW1SZWFkZXJUb1hNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKK2ltcG9ydCBzdGF0aWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRE9DVU1FTlQ7CitpbXBvcnQgc3RhdGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQ7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CisKKy8qKgorICoge0BsaW5rIE1lc3NhZ2V9IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfS4KKyAqCisgKiBUT0RPOiB3ZSBuZWVkIGFub3RoZXIgbWVzc2FnZSBjbGFzcyB0aGF0IGtlZXBzIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IHRoYXQgcG9pbnRzCisgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGVudmVsb3BlIGVsZW1lbnQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdHJlYW1NZXNzYWdlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlSW1wbCB7CisgICAgLyoqCisgICAgICogVGhlIHJlYWRlciB3aWxsIGJlIHBvc2l0aW9uZWQgYXQKKyAgICAgKiB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIFNPQVAgYm9keQorICAgICAqLworICAgIHByaXZhdGUgQE5vdE51bGwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcjsKKworICAgIC8vIGxhemlseSBjcmVhdGVkCisgICAgcHJpdmF0ZSBATnVsbGFibGUgSGVhZGVyTGlzdCBoZWFkZXJzOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF5bG9hZExvY2FsTmFtZTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBheWxvYWROYW1lc3BhY2VVUkk7CisKKyAgICAvKioKKyAgICAgKiBpbmZvc2V0IGFib3V0IHRoZSBTT0FQIGVudmVsb3BlLCBoZWFkZXIsIGFuZCBib2R5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGNyZWF0ZXIgb2YgdGhpcyBvYmplY3QgZGlkbid0IGNhcmUgYWJvdXQgdGhvc2UsCisgICAgICogd2UgdXNlIHN0b2NrIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIC8qYWxtb3N0IGZpbmFsKi8gQE5vdE51bGwgVGFnSW5mb3NldCBlbnZlbG9wZVRhZyxoZWFkZXJUYWcsYm9keVRhZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgU3RyZWFtTWVzc2FnZX0gZnJvbSBhIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9CisgICAgICogdGhhdCBwb2ludHMgYXQgdGhlIHN0YXJ0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQsIGFuZCBoZWFkZXJzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgY3JlYWV0cyBhIHtAbGluayBNZXNzYWdlfSBmcm9tIGEgcGF5bG9hZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXJzCisgICAgICogICAgICBpZiBudWxsLCBpdCBtZWFucyBubyBoZWFkZXJzLiBpZiBub24tbnVsbCwKKyAgICAgKiAgICAgIGl0IHdpbGwgYmUgb3duZWQgYnkgdGhpcyBtZXNzYWdlLgorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiAgICAgIHBvaW50cyBhdCB0aGUgc3RhcnQgZWxlbWVudC9kb2N1bWVudCBvZiB0aGUgcGF5bG9hZCAob3IgdGhlIGVuZCBlbGVtZW50IG9mIHRoZSAmbHQ7czpCb2R5PgorICAgICAqICAgICAgaWYgdGhlcmUncyBubyBwYXlsb2FkKQorICAgICAqLworICAgIHB1YmxpYyBTdHJlYW1NZXNzYWdlKEBOdWxsYWJsZSBIZWFkZXJMaXN0IGhlYWRlcnMsIEBOb3ROdWxsIEF0dGFjaG1lbnRTZXQgYXR0YWNobWVudFNldCwgQE5vdE51bGwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgQE5vdE51bGwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgc3VwZXIoc29hcFZlcnNpb24pOworICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICB0aGlzLmF0dGFjaG1lbnRTZXQgPSBhdHRhY2htZW50U2V0OworICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKKworICAgICAgICBpZihyZWFkZXIuZ2V0RXZlbnRUeXBlKCk9PSBTVEFSVF9ET0NVTUVOVCkKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7CisKKyAgICAgICAgLy9pZiB0aGUgcmVhZGVyIGlzIHBvaW50aW5nIHRvIHRoZSBlbmQgZWxlbWVudCA8L3NvYXBlbnY6Qm9keT4gdGhlbiBpdHMgZW1wdHkgbWVzc2FnZQorICAgICAgICAvLyBvciBubyBwYXlsb2FkCisgICAgICAgIGlmKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpeworICAgICAgICAgICAgU3RyaW5nIGJvZHkgPSByZWFkZXIuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICBhc3NlcnQgYm9keSAhPSBudWxsOworICAgICAgICAgICAgYXNzZXJ0IG5zVXJpICE9IG51bGw7CisgICAgICAgICAgICAvL2lmIGl0cyBub3Qgc29hcGVudjpCb2R5IHRoZW4gdGhyb3cgZXhjZXB0aW9uLCB3ZSByZWNlaXZlZCBtYWxmb3JtZWQgc3RyZWFtCisgICAgICAgICAgICBpZihib2R5LmVxdWFscygiQm9keSIpICYmIG5zVXJpLmVxdWFscyhzb2FwVmVyc2lvbi5uc1VyaSkpeworICAgICAgICAgICAgICAgIHRoaXMucGF5bG9hZExvY2FsTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkTmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgICAgIH1lbHNleyAvL1RPRE86IGkxOG4gYW5kIGFsc28gd2Ugc2hvdWxkIGJlIHRocm93aW5nIGJldHRlciBtZXNzYWdlIHRoYXQgdGhpcworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJNYWxmb3JtZWQgc3RyZWFtOiB7Iituc1VyaSsifSIrYm9keSk7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgdGhpcy5wYXlsb2FkTG9jYWxOYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOworICAgICAgICAgICAgdGhpcy5wYXlsb2FkTmFtZXNwYWNlVVJJID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IGluZm9zZXQgcmVwcmVzZW50YXRpb24gZm9yIGhlYWRlcnMKKyAgICAgICAgaW50IGJhc2UgPSBzb2FwVmVyc2lvbi5vcmRpbmFsKCkqMzsKKyAgICAgICAgdGhpcy5lbnZlbG9wZVRhZyA9IERFRkFVTFRfVEFHU1tiYXNlXTsKKyAgICAgICAgdGhpcy5oZWFkZXJUYWcgPSBERUZBVUxUX1RBR1NbYmFzZSsxXTsKKyAgICAgICAgdGhpcy5ib2R5VGFnID0gREVGQVVMVF9UQUdTW2Jhc2UrMl07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBTdHJlYW1NZXNzYWdlfSBmcm9tIGEge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0KKyAgICAgKiBhbmQgdGhlIGNvbXBsZXRlIGluZm9zZXQgb2YgdGhlIFNPQVAgZW52ZWxvcGUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTZWUge0BsaW5rICNTdHJlYW1NZXNzYWdlKEhlYWRlckxpc3QsIEF0dGFjaG1lbnRTZXQsIFhNTFN0cmVhbVJlYWRlciwgU09BUFZlcnNpb24pfSBmb3IKKyAgICAgKiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJhc2ljIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGVhZGVyVGFnCisgICAgICogICAgICBOdWxsIGlmIHRoZSBtZXNzYWdlIGRpZG4ndCBoYXZlIGEgaGVhZGVyIHRhZy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJlYW1NZXNzYWdlKEBOb3ROdWxsIFRhZ0luZm9zZXQgZW52ZWxvcGVUYWcsIEBOdWxsYWJsZSBUYWdJbmZvc2V0IGhlYWRlclRhZywgQE5vdE51bGwgQXR0YWNobWVudFNldCBhdHRhY2htZW50U2V0LCBATnVsbGFibGUgSGVhZGVyTGlzdCBoZWFkZXJzLCBATm90TnVsbCBUYWdJbmZvc2V0IGJvZHlUYWcsIEBOb3ROdWxsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEBOb3ROdWxsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgIHRoaXMoaGVhZGVycyxhdHRhY2htZW50U2V0LHJlYWRlcixzb2FwVmVyc2lvbik7CisgICAgICAgIGFzc2VydCBlbnZlbG9wZVRhZyE9bnVsbCAmJiBib2R5VGFnIT1udWxsOworICAgICAgICB0aGlzLmVudmVsb3BlVGFnID0gZW52ZWxvcGVUYWc7CisgICAgICAgIHRoaXMuaGVhZGVyVGFnID0gaGVhZGVyVGFnIT1udWxsID8gaGVhZGVyVGFnIDoKKyAgICAgICAgICAgIG5ldyBUYWdJbmZvc2V0KGVudmVsb3BlVGFnLm5zVXJpLCJIZWFkZXIiLGVudmVsb3BlVGFnLnByZWZpeCxFTVBUWV9BVFRTKTsKKyAgICAgICAgdGhpcy5ib2R5VGFnID0gYm9keVRhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gaGVhZGVycyE9bnVsbCAmJiAhaGVhZGVycy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEhlYWRlckxpc3QgZ2V0SGVhZGVycygpIHsKKyAgICAgICAgaWYgKGhlYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBIZWFkZXJMaXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhlYWRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOb3ROdWxsIEF0dGFjaG1lbnRTZXQgZ2V0QXR0YWNobWVudHMoKSB7CisgICAgICAgIHJldHVybiBhdHRhY2htZW50U2V0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF5bG9hZExvY2FsUGFydCgpIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWRMb2NhbE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gcGF5bG9hZE5hbWVzcGFjZVVSSTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXlsb2FkKCkgeworICAgICAgICByZXR1cm4gcGF5bG9hZExvY2FsTmFtZSE9bnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlIHJlYWRQYXlsb2FkQXNTb3VyY2UoKSB7CisgICAgICAgIGlmKGhhc1BheWxvYWQoKSkgeworICAgICAgICAgICAgYXNzZXJ0IHVuY29uc3VtZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RBWFNvdXJjZShyZWFkZXIsIHRydWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcmVhZFBheWxvYWRBc0pBWEIoVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBpZighaGFzUGF5bG9hZCgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGFzc2VydCB1bmNvbnN1bWVkKCk7CisgICAgICAgIC8vIFRPRE86IEhvdyBjYW4gdGhlIHVubWFyc2hhbGxlciBwcm9jZXNzIHRoaXMgYXMgYSBmcmFnbWVudD8KKyAgICAgICAgaWYoaGFzQXR0YWNobWVudHMoKSkKKyAgICAgICAgICAgIHVubWFyc2hhbGxlci5zZXRBdHRhY2htZW50VW5tYXJzaGFsbGVyKG5ldyBBdHRhY2htZW50VW5tYXJzaGFsbGVySW1wbChnZXRBdHRhY2htZW50cygpKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdW5tYXJzaGFsbGVyLnVubWFyc2hhbChyZWFkZXIpOworICAgICAgICB9IGZpbmFsbHl7CisgICAgICAgICAgICB1bm1hcnNoYWxsZXIuc2V0QXR0YWNobWVudFVubWFyc2hhbGxlcihudWxsKTsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuY2xvc2UocmVhZGVyKTsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkucmVjeWNsZShyZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIDxUPiBUIHJlYWRQYXlsb2FkQXNKQVhCKEJyaWRnZTxUPiBicmlkZ2UpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIWhhc1BheWxvYWQoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBhc3NlcnQgdW5jb25zdW1lZCgpOworICAgICAgICBUIHIgPSBicmlkZ2UudW5tYXJzaGFsKHJlYWRlciwKKyAgICAgICAgICAgIGhhc0F0dGFjaG1lbnRzKCkgPyBuZXcgQXR0YWNobWVudFVubWFyc2hhbGxlckltcGwoZ2V0QXR0YWNobWVudHMoKSkgOiBudWxsKTsKKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5jbG9zZShyZWFkZXIpOworICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LnJlY3ljbGUocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uc3VtZSgpIHsKKyAgICAgICAgYXNzZXJ0IHVuY29uc3VtZWQoKTsKKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5yZWN5Y2xlKHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkUGF5bG9hZCgpIHsKKyAgICAgICAgLy8gVE9ETzogV2hhdCBhYm91dCBhY2Nlc3MgYXQgYW5kIGJleW9uZCA8L3NvYXA6Qm9keT4KKyAgICAgICAgYXNzZXJ0IHVuY29uc3VtZWQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlUGF5bG9hZFRvKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmKHBheWxvYWRMb2NhbE5hbWU9PW51bGwpCisgICAgICAgICAgICByZXR1cm47IC8vIG5vIGJvZHkKKyAgICAgICAgYXNzZXJ0IHVuY29uc3VtZWQoKTsKKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyVG9YTUxTdHJlYW1Xcml0ZXIgY29udiA9IG5ldyBYTUxTdHJlYW1SZWFkZXJUb1hNTFN0cmVhbVdyaXRlcigpOworICAgICAgICB3aGlsZShyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9ET0NVTUVOVCl7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlYWRlci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKKworICAgICAgICAgICAgLy9hZnRlciBwcmV2aW91cyBjb252LmJyaWRnZSgpIGNhbGwgdGhlIGN1cnNvciB3aWxsIGJlIGF0CisgICAgICAgICAgICAvL0VORF9FTEVNRU5ULiBDaGVjayBpZiBpdHMgbm90IHNvYXBlbnY6Qm9keSB0aGVuIG1vdmUgdG8gbmV4dAorICAgICAgICAgICAgLy8gRUxFTUVOVAorICAgICAgICAgICAgaWYocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCl7CisgICAgICAgICAgICAgICAgaWYoIW5hbWUuZXF1YWxzKCJCb2R5IikgfHwgIW5zVXJpLmVxdWFscyhzb2FwVmVyc2lvbi5uc1VyaSkpeworICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBpZihyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9ET0NVTUVOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihuYW1lLmVxdWFscygiQm9keSIpICYmIG5zVXJpLmVxdWFscyhzb2FwVmVyc2lvbi5uc1VyaSkgfHwgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnYuYnJpZGdlKHJlYWRlcix3cml0ZXIpOworICAgICAgICB9CisgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LnJlY3ljbGUocmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFhNTFN0cmVhbVdyaXRlciBzdykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbnsKKyAgICAgICAgd3JpdGVFbnZlbG9wZShzdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBTdHJlYW1NZXNzYWdlIGlzIGNyZWF0ZWQgd2l0aCBhIHBheWxvYWQKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRW52ZWxvcGUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKKyAgICAgICAgZW52ZWxvcGVUYWcud3JpdGVTdGFydCh3cml0ZXIpOworCisgICAgICAgIC8vd3JpdGUgaGVhZGVycworICAgICAgICBIZWFkZXJMaXN0IGhsID0gZ2V0SGVhZGVycygpOworICAgICAgICBpZihobC5zaXplKCkgPiAwKXsKKyAgICAgICAgICAgIGhlYWRlclRhZy53cml0ZVN0YXJ0KHdyaXRlcik7CisgICAgICAgICAgICBmb3IoSGVhZGVyIGg6aGwpeworICAgICAgICAgICAgICAgIGgud3JpdGVUbyh3cml0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB9CisgICAgICAgIGJvZHlUYWcud3JpdGVTdGFydCh3cml0ZXIpOworICAgICAgICBpZihoYXNQYXlsb2FkKCkpCisgICAgICAgICAgICB3cml0ZVBheWxvYWRUbyh3cml0ZXIpOworICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVBheWxvYWRUbyhDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgYm9vbGVhbiBmcmFnbWVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydCB1bmNvbnN1bWVkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZihwYXlsb2FkTG9jYWxOYW1lPT1udWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gYm9keQorCisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyIGNvbnYgPQorICAgICAgICAgICAgICAgIG5ldyBYTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyKHJlYWRlcixjb250ZW50SGFuZGxlcix0cnVlLGZyYWdtZW50KTsKKworICAgICAgICAgICAgd2hpbGUocmVhZGVyLmdldEV2ZW50VHlwZSgpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQpeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKKworICAgICAgICAgICAgICAgIC8vYWZ0ZXIgcHJldmlvdXMgY29udi5icmlkZ2UoKSBjYWxsIHRoZSBjdXJzb3Igd2lsbCBiZSBhdAorICAgICAgICAgICAgICAgIC8vRU5EX0VMRU1FTlQuIENoZWNrIGlmIGl0cyBub3Qgc29hcGVudjpCb2R5IHRoZW4gbW92ZSB0byBuZXh0CisgICAgICAgICAgICAgICAgLy8gRUxFTUVOVAorICAgICAgICAgICAgICAgIGlmKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpeworICAgICAgICAgICAgICAgICAgICBpZighbmFtZS5lcXVhbHMoIkJvZHkiKSB8fCAhbnNVcmkuZXF1YWxzKHNvYXBWZXJzaW9uLm5zVXJpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobmFtZS5lcXVhbHMoIkJvZHkiKSAmJiBuc1VyaS5lcXVhbHMoc29hcFZlcnNpb24ubnNVcmkpIHx8IChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9ET0NVTUVOVCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY29udi5icmlkZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5yZWN5Y2xlKHJlYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2NhdGlvbiBsb2MgPSBlLmdldExvY2F0aW9uKCk7CisgICAgICAgICAgICBpZihsb2M9PW51bGwpICAgbG9jID0gRHVtbXlMb2NhdGlvbi5JTlNUQU5DRTsKKworICAgICAgICAgICAgU0FYUGFyc2VFeGNlcHRpb24geCA9IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSxsb2MuZ2V0UHVibGljSWQoKSxsb2MuZ2V0U3lzdGVtSWQoKSxsb2MuZ2V0TGluZU51bWJlcigpLGxvYy5nZXRDb2x1bW5OdW1iZXIoKSxlKTsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5lcnJvcih4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlIGNvcHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjb3B5IHRoZSBwYXlsb2FkCisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgY2xvbmU7CisgICAgICAgICAgICBpZihoYXNQYXlsb2FkKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgdW5jb25zdW1lZCgpOworICAgICAgICAgICAgICAgIGNvbnN1bWVkQXQgPSBudWxsOyAvLyBidXQgd2UgZG9uJ3Qgd2FudCB0byBtYXJrIGl0IGFzIGNvbnN1bWVkCisgICAgICAgICAgICAgICAgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciB4c2IgPSBuZXcgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcigpOworCisgICAgICAgICAgICAgICAgLy90aGUgYm9vbGVhbiB2YWx1ZSB0ZWxscyB0aGUgZmlyc3QgYm9keSBwYXJ0IGlzIHdyaXR0ZW4uCisgICAgICAgICAgICAgICAgLy9iYXNlZCBvbiB0aGlzIHdlIGRvIHRoZSByaWdodCB0aGluZworICAgICAgICAgICAgICAgIFN0cmVhbVJlYWRlckJ1ZmZlckNyZWF0b3IgYyA9IG5ldyBTdHJlYW1SZWFkZXJCdWZmZXJDcmVhdG9yKHhzYik7CisgICAgICAgICAgICAgICAgd2hpbGUocmVhZGVyLmdldEV2ZW50VHlwZSgpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQpeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlYWRlci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICAgICAgICAgICAgICBpZihuYW1lLmVxdWFscygiQm9keSIpICYmIG5zVXJpLmVxdWFscyhzb2FwVmVyc2lvbi5uc1VyaSkgfHwgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjLmNyZWF0ZShyZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LnJlY3ljbGUocmVhZGVyKTsKKworICAgICAgICAgICAgICAgIHJlYWRlciA9IHhzYi5yZWFkQXNYTUxTdHJlYW1SZWFkZXIoKTsKKyAgICAgICAgICAgICAgICBjbG9uZSA9IHhzYi5yZWFkQXNYTUxTdHJlYW1SZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBzdGFydCB0YWcgb2YgdGhlIGZpcnN0IGVsZW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZWVkVG9Sb290RWxlbWVudChyZWFkZXIpOworICAgICAgICAgICAgICAgIHByb2NlZWRUb1Jvb3RFbGVtZW50KGNsb25lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaXQncyB0ZW1wdGluZyB0byB1c2UgRW1wdHlNZXNzYWdlSW1wbCwgYnV0IGl0IGRvZXNuJ3QgcHJlc2VyZSB0aGUgaW5mb3NldAorICAgICAgICAgICAgICAgIC8vIG9mIDxlbnZlbG9wZT4sPGhlYWRlcj4sIGFuZCA8Ym9keT4sIHNvIHdlIG5lZWQgdG8gc3RpY2sgdG8gU3RyZWFtTWVzc2FnZS4KKyAgICAgICAgICAgICAgICBjbG9uZSA9IHJlYWRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1NZXNzYWdlKGVudmVsb3BlVGFnLCBoZWFkZXJUYWcsIGF0dGFjaG1lbnRTZXQsIEhlYWRlckxpc3QuY29weShoZWFkZXJzKSwgYm9keVRhZywgY2xvbmUsIHNvYXBWZXJzaW9uKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgdG8gY29weSBhIG1lc3NhZ2UiLGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2NlZWRUb1Jvb3RFbGVtZW50KFhNTFN0cmVhbVJlYWRlciB4c3IpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBhc3NlcnQgeHNyLmdldEV2ZW50VHlwZSgpPT1TVEFSVF9ET0NVTUVOVDsKKyAgICAgICAgeHNyLm5leHRUYWcoKTsKKyAgICAgICAgYXNzZXJ0IHhzci5nZXRFdmVudFR5cGUoKT09U1RBUlRfRUxFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKCBDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciApIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBjb250ZW50SGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IoTlVMTF9MT0NBVE9SKTsKKyAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpOworICAgICAgICBlbnZlbG9wZVRhZy53cml0ZVN0YXJ0KGNvbnRlbnRIYW5kbGVyKTsKKyAgICAgICAgaGVhZGVyVGFnLndyaXRlU3RhcnQoY29udGVudEhhbmRsZXIpOworICAgICAgICBpZihoYXNIZWFkZXJzKCkpIHsKKyAgICAgICAgICAgIEhlYWRlckxpc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBoZWFkZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxsZW47IGkrKyApIHsKKyAgICAgICAgICAgICAgICAvLyBzaG91bGRuJ3QgSkRLIGJlIHNtYXJ0IGVub3VnaCB0byB1c2UgYXJyYXktc3R5bGUgaW5kZXhpbmcgZm9yIHRoaXMgZm9yZWFjaCE/CisgICAgICAgICAgICAgICAgaGVhZGVycy5nZXQoaSkud3JpdGVUbyhjb250ZW50SGFuZGxlcixlcnJvckhhbmRsZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGhlYWRlclRhZy53cml0ZUVuZChjb250ZW50SGFuZGxlcik7CisgICAgICAgIGJvZHlUYWcud3JpdGVTdGFydChjb250ZW50SGFuZGxlcik7CisgICAgICAgIHdyaXRlUGF5bG9hZFRvKGNvbnRlbnRIYW5kbGVyLGVycm9ySGFuZGxlciwgdHJ1ZSk7CisgICAgICAgIGJvZHlUYWcud3JpdGVFbmQoY29udGVudEhhbmRsZXIpOworICAgICAgICBlbnZlbG9wZVRhZy53cml0ZUVuZChjb250ZW50SGFuZGxlcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciBhbiBhc3NlcnRpb24uIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBtZXNzYWdlIGlzIHVuY29uc3VtZWQsCisgICAgICogb3Igb3RoZXJ3aXNlIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYWxzbyBtYXJrcyB0aGUgc3RyZWFtIGFzICdjb25zdW1lZCcKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdW5jb25zdW1lZCgpIHsKKyAgICAgICAgaWYocGF5bG9hZExvY2FsTmFtZT09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAvLyBubyBwYXlsb2FkLiBjYW4gYmUgY29uc3VtZWQgbXVsdGlwbGUgdGltZXMuCisKKyAgICAgICAgaWYocmVhZGVyLmdldEV2ZW50VHlwZSgpIT1YTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgeworICAgICAgICAgICAgQXNzZXJ0aW9uRXJyb3IgZXJyb3IgPSBuZXcgQXNzZXJ0aW9uRXJyb3IoIlN0cmVhbU1lc3NhZ2UgaGFzIGJlZW4gYWxyZWFkeSBjb25zdW1lZC4gU2VlIHRoZSBuZXN0ZWQgZXhjZXB0aW9uIGZvciB3aGVyZSBpdCdzIGNvbnN1bWVkIik7CisgICAgICAgICAgICBlcnJvci5pbml0Q2F1c2UoY29uc3VtZWRBdCk7CisgICAgICAgICAgICB0aHJvdyBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lZEF0ID0gbmV3IEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcuIFRoaXMgcmVjb3JkcyB3aGVyZSB0aGUgbWVzc2FnZSB3YXMgY29uc3VtZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBUaHJvd2FibGUgY29uc3VtZWRBdDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgczpFbnZlbG9wZSwgczpIZWFkZXIsIGFuZCBzOkJvZHkgdGFnIGluZm9zZXQgZGVmaW5pdGlvbnMuCisgICAgICoKKyAgICAgKiBXZSBuZWVkIDMgZm9yIFNPQVAgMS4xLCAzIGZvciBTT0FQIDEuMi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUYWdJbmZvc2V0W10gREVGQVVMVF9UQUdTOworCisgICAgc3RhdGljIHsKKyAgICAgICAgREVGQVVMVF9UQUdTID0gbmV3IFRhZ0luZm9zZXRbNl07CisgICAgICAgIGNyZWF0ZShTT0FQVmVyc2lvbi5TT0FQXzExKTsKKyAgICAgICAgY3JlYXRlKFNPQVBWZXJzaW9uLlNPQVBfMTIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlKFNPQVBWZXJzaW9uIHYpIHsKKyAgICAgICAgaW50IGJhc2UgPSB2Lm9yZGluYWwoKSozOworICAgICAgICBERUZBVUxUX1RBR1NbYmFzZSAgXSA9IG5ldyBUYWdJbmZvc2V0KHYubnNVcmksIkVudmVsb3BlIiwiUyIsRU1QVFlfQVRUUywiUyIsdi5uc1VyaSk7CisgICAgICAgIERFRkFVTFRfVEFHU1tiYXNlKzFdID0gbmV3IFRhZ0luZm9zZXQodi5uc1VyaSwiSGVhZGVyIiwiUyIsRU1QVFlfQVRUUyk7CisgICAgICAgIERFRkFVTFRfVEFHU1tiYXNlKzJdID0gbmV3IFRhZ0luZm9zZXQodi5uc1VyaSwiQm9keSIsIlMiLEVNUFRZX0FUVFMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL0Fic3RyYWN0U0VJTW9kZWxJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9BYnN0cmFjdFNFSU1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTI0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9BYnN0cmFjdFNFSU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuSkFYQlJJQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5UeXBlUmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LldTU2VydmljZURlbGVnYXRlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVBOYW1lc3BhY2VDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMQm91bmRPcGVyYXRpb25JbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETEJvdW5kUG9ydFR5cGVJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETFBhcnRJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETFBvcnRJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5Nb2RlbGVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Qb29sOworCitpbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogbW9kZWwgb2YgdGhlIHdlYiBzZXJ2aWNlLiAgVXNlZCBieSB0aGUgcnVudGltZSBtYXJzaGFsbC91bm1hcnNoYWxsCisgKiB3ZWIgc2VydmljZSBpbnZvY2F0aW9ucworICoKKyAqICRhdXRob3I6IEpBWFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U0VJTW9kZWxJbXBsIGltcGxlbWVudHMgU0VJTW9kZWwgeworCisgICAgdm9pZCBwb3N0UHJvY2VzcygpIHsKKyAgICAgICAgLy8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuCisgICAgICAgIGlmIChqYXhiQ29udGV4dCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwb3B1bGF0ZU1hcHMoKTsKKyAgICAgICAgY3JlYXRlSkFYQkNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaW5rIHtAbGluayBTRUlNb2RlbH0gdG8ge0BsaW5rIFdTRExNb2RlbH0uCisgICAgICogTWVyZ2UgaXQgd2l0aCB7QGxpbmsgI3Bvc3RQcm9jZXNzKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZyZWV6ZShXU0RMUG9ydEltcGwgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICBmb3IgKEphdmFNZXRob2RJbXBsIG0gOiBqYXZhTWV0aG9kcykgeworICAgICAgICAgICAgbS5mcmVlemUocG9ydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSBtZXRob2RUb0pNIGFuZCBuYW1lVG9KTSBtYXBzLgorICAgICAqLworICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFwcygpOworCisgICAgcHVibGljIFBvb2wuTWFyc2hhbGxlciBnZXRNYXJzaGFsbGVyUG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIG1hcnNoYWxsZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkpBWEJSSUNvbnRleHQ8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIEpBWEJSSUNvbnRleHQgZ2V0SkFYQkNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBqYXhiQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBrbm93biBuYW1lc3BhY2VzIGZyb20gSkFYQlJJQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0S25vd25OYW1lc3BhY2VVUklzKCkgeworICAgICAgICByZXR1cm4ga25vd25OYW1lc3BhY2VVUklzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkJyaWRnZTwvY29kZT4gZm9yIHRoZSA8Y29kZT50eXBlPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBCcmlkZ2UgZ2V0QnJpZGdlKFR5cGVSZWZlcmVuY2UgdHlwZSkgeworICAgICAgICBCcmlkZ2UgYiA9IGJyaWRnZU1hcC5nZXQodHlwZSk7CisgICAgICAgIGFzc2VydCBiIT1udWxsOyAvLyB3ZSBzaG91bGQgaGF2ZSBjcmVhdGVkIEJyaWRnZSBmb3IgYWxsIFR5cGVSZWZlcmVuY2VzIGtub3duIHRvIHRoaXMgbW9kZWwKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgcHJpdmF0ZSBKQVhCUklDb250ZXh0IGNyZWF0ZUpBWEJDb250ZXh0KCkgeworICAgICAgICBmaW5hbCBMaXN0PFR5cGVSZWZlcmVuY2U+IHR5cGVzID0gZ2V0QWxsVHlwZVJlZmVyZW5jZXMoKTsKKyAgICAgICAgZmluYWwgQ2xhc3NbXSBjbHMgPSBuZXcgQ2xhc3NbdHlwZXMuc2l6ZSgpICsgYWRkaXRpb25hbENsYXNzZXMuc2l6ZSgpXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IoQ2xhc3MgYWRkaXRpb25hbENsYXNzOmFkZGl0aW9uYWxDbGFzc2VzKXsKKyAgICAgICAgICAgIGNsc1tpKytdID0gYWRkaXRpb25hbENsYXNzOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChUeXBlUmVmZXJlbmNlIHR5cGUgOiB0eXBlcykgeworICAgICAgICAgICAgY2xzW2krK10gPSAoQ2xhc3MpIHR5cGUudHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL2pheGJDb250ZXh0ID0gSkFYQlJJQ29udGV4dC5uZXdJbnN0YW5jZShjbHMsIHR5cGVzLCB0YXJnZXROYW1lc3BhY2UsIGZhbHNlKTsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gYXZvaWQgZG9Qcml2IGJsb2NrIG9uY2UgSkFYQiBpcyBmaXhlZC4gQWZ0ZXJ3YXJkcywgdXNlIHRoZSBhYm92ZQorICAgICAgICAgICAgamF4YkNvbnRleHQgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxKQVhCUklDb250ZXh0PigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgSkFYQlJJQ29udGV4dCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWEJSSUNvbnRleHQubmV3SW5zdGFuY2UoY2xzLCB0eXBlcywgbnVsbCwgdGFyZ2V0TmFtZXNwYWNlLCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjcmVhdGVCcmlkZ2VNYXAodHlwZXMpOworICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKE1vZGVsZXJNZXNzYWdlcy5VTkFCTEVfVE9fQ1JFQVRFX0pBWEJfQ09OVEVYVCgpLCBlKTsKKyAgICAgICAgfQorICAgICAgICBrbm93bk5hbWVzcGFjZVVSSXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgbmFtZXNwYWNlIDogamF4YkNvbnRleHQuZ2V0S25vd25OYW1lc3BhY2VVUklzKCkpIHsKKyAgICAgICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2UuZXF1YWxzKFNPQVBOYW1lc3BhY2VDb25zdGFudHMuWFNEKSAmJiAhbmFtZXNwYWNlLmVxdWFscyhTT0FQTmFtZXNwYWNlQ29uc3RhbnRzLlhNTE5TKSkKKyAgICAgICAgICAgICAgICAgICAga25vd25OYW1lc3BhY2VVUklzLmFkZChuYW1lc3BhY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWFyc2hhbGxlcnMgPSBuZXcgUG9vbC5NYXJzaGFsbGVyKGpheGJDb250ZXh0KTsKKworICAgICAgICByZXR1cm4gamF4YkNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiByZXR1cm5zIG5vbi1udWxsIGxpc3Qgb2YgVHlwZVJlZmVyZW5jZQorICAgICAqLworICAgIHByaXZhdGUgTGlzdDxUeXBlUmVmZXJlbmNlPiBnZXRBbGxUeXBlUmVmZXJlbmNlcygpIHsKKyAgICAgICAgTGlzdDxUeXBlUmVmZXJlbmNlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8VHlwZVJlZmVyZW5jZT4oKTsKKyAgICAgICAgQ29sbGVjdGlvbjxKYXZhTWV0aG9kSW1wbD4gbWV0aG9kcyA9IG1ldGhvZFRvSk0udmFsdWVzKCk7CisgICAgICAgIGZvciAoSmF2YU1ldGhvZEltcGwgbSA6IG1ldGhvZHMpIHsKKyAgICAgICAgICAgIG0uZmlsbFR5cGVzKHR5cGVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyaWRnZU1hcChMaXN0PFR5cGVSZWZlcmVuY2U+IHR5cGVzKSB7CisgICAgICAgIGZvciAoVHlwZVJlZmVyZW5jZSB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgIEJyaWRnZSBicmlkZ2UgPSBqYXhiQ29udGV4dC5jcmVhdGVCcmlkZ2UodHlwZSk7CisgICAgICAgICAgICBicmlkZ2VNYXAucHV0KHR5cGUsIGJyaWRnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IGZvciBhIGdpdmVuIFdTRExPcGVyYXRpb24gPGNvZGU+cW5hbWU8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIE1ldGhvZCBnZXREaXNwYXRjaE1ldGhvZChRTmFtZSBxbmFtZSkgeworICAgICAgICAvL2hhbmRsZSB0aGUgZW1wdHkgYm9keQorICAgICAgICBpZiAocW5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHFuYW1lID0gZW1wdHlCb2R5TmFtZTsKKyAgICAgICAgSmF2YU1ldGhvZEltcGwgam0gPSBnZXRKYXZhTWV0aG9kKHFuYW1lKTsKKyAgICAgICAgaWYgKGptICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBqbS5nZXRNZXRob2QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+bmFtZTwvY29kZT4gaXMgdGhlIG5hbWUKKyAgICAgKiBvZiBhIGtub3duIGZhdWx0IG5hbWUgZm9yIHRoZSA8Y29kZT5NZXRob2QgbWV0aG9kPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzS25vd25GYXVsdChRTmFtZSBuYW1lLCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIEphdmFNZXRob2RJbXBsIG0gPSBnZXRKYXZhTWV0aG9kKG1ldGhvZCk7CisgICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbkltcGwgY2UgOiBtLmdldENoZWNrZWRFeGNlcHRpb25zKCkpIHsKKyAgICAgICAgICAgIGlmIChjZS5nZXREZXRhaWxUeXBlKCkudGFnTmFtZS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5leDwvY29kZT4gaXMgYSBDaGVja2VkIEV4Y2VwdGlvbgorICAgICAqIGZvciA8Y29kZT5NZXRob2QgbTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWRFeGNlcHRpb24oTWV0aG9kIG0sIENsYXNzIGV4KSB7CisgICAgICAgIEphdmFNZXRob2RJbXBsIGptID0gZ2V0SmF2YU1ldGhvZChtKTsKKyAgICAgICAgZm9yIChDaGVja2VkRXhjZXB0aW9uSW1wbCBjZSA6IGptLmdldENoZWNrZWRFeGNlcHRpb25zKCkpIHsKKyAgICAgICAgICAgIGlmIChjZS5nZXRFeGNlcHRpb25DbGFzcygpLmVxdWFscyhleCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgPGNvZGU+bWV0aG9kPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBKYXZhTWV0aG9kSW1wbCBnZXRKYXZhTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZFRvSk0uZ2V0KG1ldGhvZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIG9wZXJhdGlvbiBuYW1lZCBuYW1lCisgICAgICovCisgICAgcHVibGljIEphdmFNZXRob2RJbXBsIGdldEphdmFNZXRob2QoUU5hbWUgbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZVRvSk0uZ2V0KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlFOYW1lPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogSmF2YU1ldGhvZCBqbQorICAgICAqLworICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZUZvckpNKEphdmFNZXRob2RJbXBsIGptKSB7CisgICAgICAgIGZvciAoUU5hbWUga2V5IDogbmFtZVRvSk0ua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIEphdmFNZXRob2RJbXBsIGptZXRob2QgPSBuYW1lVG9KTS5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmIChqbWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKS5lcXVhbHMoam0uZ2V0T3BlcmF0aW9uTmFtZSgpKSl7CisgICAgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBvZiA8Y29kZT5KYXZhTWV0aG9kczwvY29kZT4KKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Y29kZT5SdW50aW1lTW9kZWw8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248SmF2YU1ldGhvZEltcGw+IGdldEphdmFNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChqYXZhTWV0aG9kcyk7CisgICAgfQorCisgICAgdm9pZCBhZGRKYXZhTWV0aG9kKEphdmFNZXRob2RJbXBsIGptKSB7CisgICAgICAgIGlmIChqbSAhPSBudWxsKQorICAgICAgICAgICAgamF2YU1ldGhvZHMuYWRkKGptKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGZyb20ge0BsaW5rIFdTU2VydmljZURlbGVnYXRlfQorICAgICAqIHRvIGFwcGx5IHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uIGZyb20gV1NETCBhZnRlciB0aGUgbW9kZWwgaXMgY3JlYXRlZCBmcm0gU0VJIGNsYXNzIG9uIHRoZSBjbGllbnQgc2lkZS4gT24gdGhlIHNlcnZlcgorICAgICAqIHNpZGUgYWxsIHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBiZWZvcmUgbW9kZWxpbmcgYW5kIHRoaXMgbWV0aG9kIGlzIG5vdCB1c2VkLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBvbmNlIGNsaWVudCBzaWRlIG5ldyBhcmNoaXRlY3R1cmUgaXMgaW1wbGVtZW50ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBseVBhcmFtZXRlckJpbmRpbmcoV1NETEJvdW5kUG9ydFR5cGVJbXBsIHdzZGxCaW5kaW5nKXsKKyAgICAgICAgaWYod3NkbEJpbmRpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IoSmF2YU1ldGhvZEltcGwgbWV0aG9kIDogamF2YU1ldGhvZHMpeworICAgICAgICAgICAgaWYobWV0aG9kLmlzQXN5bmMoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFFOYW1lIG9wTmFtZSA9IG5ldyBRTmFtZSh3c2RsQmluZGluZy5nZXRQb3J0VHlwZU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgbWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKSk7CisKKyAgICAgICAgICAgIC8vcGF0Y2ggdGhlIHNvYXBhY3Rpb24gY29ycmVjdGx5IGZyb20gdGhlIFdTREwKKyAgICAgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbkltcGwgYm8gPSB3c2RsQmluZGluZy5nZXQob3BOYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBiby5nZXRTT0FQQWN0aW9uKCk7CisgICAgICAgICAgICBtZXRob2QuZ2V0QmluZGluZygpLnNldFNPQVBBY3Rpb24oYWN0aW9uKTsKKworICAgICAgICAgICAgYm9vbGVhbiBpc1JwY2xpdCA9IG1ldGhvZC5nZXRCaW5kaW5nKCkuaXNScGNMaXQoKTsKKyAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVySW1wbD4gcmVxUGFyYW1zID0gbWV0aG9kLnJlcXVlc3RQYXJhbXM7CisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IHJlcUF0dGFjaFBhcmFtcyA9IG51bGw7CisgICAgICAgICAgICBmb3IoUGFyYW1ldGVySW1wbCBwYXJhbTpyZXFQYXJhbXMpeworICAgICAgICAgICAgICAgIGlmKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpeworICAgICAgICAgICAgICAgICAgICBpZihpc1JwY2xpdCl7CisgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyUGFyYW1ldGVyIHJlcVBhcmFtID0gKFdyYXBwZXJQYXJhbWV0ZXIpcGFyYW07CisgICAgICAgICAgICAgICAgICAgICAgICBpZihiby5nZXRSZXF1ZXN0TmFtZXNwYWNlKCkgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hScGNsaXROYW1lc3BhY2UoYm8uZ2V0UmVxdWVzdE5hbWVzcGFjZSgpLCByZXFQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXFBdHRhY2hQYXJhbXMgPSBhcHBseVJwY0xpdFBhcmFtQmluZGluZyhtZXRob2QsIChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtLCB3c2RsQmluZGluZywgTW9kZS5JTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHBhcmFtLmdldFBhcnROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYocGFydE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYXJhbUJpbmRpbmcgPSB3c2RsQmluZGluZy5nZXRCaW5kaW5nKG9wTmFtZSwgcGFydE5hbWUsIE1vZGUuSU4pOworICAgICAgICAgICAgICAgIGlmKHBhcmFtQmluZGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRJbkJpbmRpbmcocGFyYW1CaW5kaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiByZXNBdHRhY2hQYXJhbXMgPSBudWxsOworICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiByZXNQYXJhbXMgPSBtZXRob2QucmVzcG9uc2VQYXJhbXM7CisgICAgICAgICAgICBmb3IoUGFyYW1ldGVySW1wbCBwYXJhbTpyZXNQYXJhbXMpeworICAgICAgICAgICAgICAgIGlmKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpeworICAgICAgICAgICAgICAgICAgICBpZihpc1JwY2xpdCl7CisgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyUGFyYW1ldGVyIHJlc3BQYXJhbSA9IChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm8uZ2V0UmVzcG9uc2VOYW1lc3BhY2UoKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFJwY2xpdE5hbWVzcGFjZShiby5nZXRSZXNwb25zZU5hbWVzcGFjZSgpLCByZXNwUGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXR0YWNoUGFyYW1zID0gYXBwbHlScGNMaXRQYXJhbUJpbmRpbmcobWV0aG9kLCAoV3JhcHBlclBhcmFtZXRlcilwYXJhbSwgd3NkbEJpbmRpbmcsIE1vZGUuT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9pZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBpbm91dCBhbmQgaXRzIGhlYWRlcj10cnVlIHRoZW4gZG9udCBnZXQgYmluZGluZyBmcm9tIFdTREwKKy8vICAgICAgICAgICAgICAgIGlmKCFwYXJhbS5pc0lOT1VUKCkgJiYgcGFyYW0uZ2V0QmluZGluZygpLmlzSGVhZGVyKCkpCisvLyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gcGFyYW0uZ2V0UGFydE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZihwYXJ0TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBhcmFtQmluZGluZyA9IHdzZGxCaW5kaW5nLmdldEJpbmRpbmcob3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsIE1vZGUuT1VUKTsKKyAgICAgICAgICAgICAgICBpZihwYXJhbUJpbmRpbmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0T3V0QmluZGluZyhwYXJhbUJpbmRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocmVxQXR0YWNoUGFyYW1zICE9IG51bGwpeworICAgICAgICAgICAgICAgIGZvcihQYXJhbWV0ZXJJbXBsIHAgOiByZXFBdHRhY2hQYXJhbXMpeworICAgICAgICAgICAgICAgICAgICBtZXRob2QuYWRkUmVxdWVzdFBhcmFtZXRlcihwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihyZXNBdHRhY2hQYXJhbXMgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgZm9yKFBhcmFtZXRlckltcGwgcCA6IHJlc0F0dGFjaFBhcmFtcyl7CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5hZGRSZXNwb25zZVBhcmFtZXRlcihwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBycGNsaXQgd3JhcHBlciBlbGVtZW50IGluc2lkZSA8c29hcGVudjpCb2R5PiwgdGhlIHRhcmdldE5hbWVzcGFjZSBzaG91bGQgYmUgdGFrZWQgZnJvbQorICAgICAqIHRoZSBzb2FwYmluZDpib2R5QG5hbWVzcGFjZSB2YWx1ZS4gU2luY2Ugbm8gYW5ub3RhdGlvbnMgb24gU0VJL2ltcGwgY2xhc3MgY2FwdHVyZXMgaXQgc28gd2UKKyAgICAgKiBuZWVkIHRvIGdldCBpdCBmcm9tIFdTREwgYW5kIHBhdGNoIGl0LiAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXRjaFJwY2xpdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlLCBXcmFwcGVyUGFyYW1ldGVyIHBhcmFtKXsKKyAgICAgICAgVHlwZVJlZmVyZW5jZSB0eXBlID0gcGFyYW0uZ2V0VHlwZVJlZmVyZW5jZSgpOworICAgICAgICBUeXBlUmVmZXJlbmNlIG5ld1R5cGUgPSBuZXcgVHlwZVJlZmVyZW5jZShuZXcgUU5hbWUobmFtZXNwYWNlLCB0eXBlLnRhZ05hbWUuZ2V0TG9jYWxQYXJ0KCkpLCB0eXBlLnR5cGUsIHR5cGUuYW5ub3RhdGlvbnMpOworICAgICAgICBwYXJhbS5zZXRUeXBlUmVmZXJlbmNlKG5ld1R5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgYmluZGluZyByZWxhdGVkIGluZm9ybWF0aW9uIHRvIHRoZSBScGNMaXRQYXlsb2FkLiBUaGUgcGF5bG9hZCBtYXAgaXMgcG9wdWxhdGVkIGNvcnJlY3RsCisgICAgICogQHJldHVybgorICAgICAqIFJldHVybnMgYXR0YWNobWVudCBwYXJhbWV0ZXJzIGlmL2FueS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8UGFyYW1ldGVySW1wbD4gYXBwbHlScGNMaXRQYXJhbUJpbmRpbmcoSmF2YU1ldGhvZEltcGwgbWV0aG9kLCBXcmFwcGVyUGFyYW1ldGVyIHdyYXBwZXJQYXJhbWV0ZXIsIFdTRExCb3VuZFBvcnRUeXBlSW1wbCBib3VuZFBvcnRUeXBlLCBNb2RlIG1vZGUpIHsKKyAgICAgICAgUU5hbWUgb3BOYW1lID0gbmV3IFFOYW1lKGJvdW5kUG9ydFR5cGUuZ2V0UG9ydFR5cGVOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIG1ldGhvZC5nZXRPcGVyYXRpb25OYW1lKCkpOworICAgICAgICBXU0RMQm91bmRPcGVyYXRpb25JbXBsIGJvID0gYm91bmRQb3J0VHlwZS5nZXQob3BOYW1lKTsKKyAgICAgICAgTWFwPEludGVnZXIsIFBhcmFtZXRlckltcGw+IGJvZHlQYXJhbXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBQYXJhbWV0ZXJJbXBsPigpOworICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IHVuYm91bmRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlckltcGw+KCk7CisgICAgICAgIExpc3Q8UGFyYW1ldGVySW1wbD4gYXR0YWNoUGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXJJbXBsPigpOworICAgICAgICBmb3IoUGFyYW1ldGVySW1wbCBwYXJhbSA6IHdyYXBwZXJQYXJhbWV0ZXIud3JhcHBlckNoaWxkcmVuKXsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHBhcmFtLmdldFBhcnROYW1lKCk7CisgICAgICAgICAgICBpZihwYXJ0TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBhcmFtQmluZGluZyA9IGJvdW5kUG9ydFR5cGUuZ2V0QmluZGluZyhvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lLCBtb2RlKTsKKyAgICAgICAgICAgIGlmKHBhcmFtQmluZGluZyAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBpZihtb2RlID09IE1vZGUuSU4pCisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEluQmluZGluZyhwYXJhbUJpbmRpbmcpOworICAgICAgICAgICAgICAgIGVsc2UgaWYobW9kZSA9PSBNb2RlLk9VVCB8fCBtb2RlID09IE1vZGUuSU5PVVQpCisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldE91dEJpbmRpbmcocGFyYW1CaW5kaW5nKTsKKworICAgICAgICAgICAgICAgIGlmKHBhcmFtQmluZGluZy5pc1VuYm91bmQoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kUGFyYW1zLmFkZChwYXJhbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBhcmFtQmluZGluZy5pc0F0dGFjaG1lbnQoKSl7CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaFBhcmFtcy5hZGQocGFyYW0pOworICAgICAgICAgICAgICAgIH1lbHNlIGlmKHBhcmFtQmluZGluZy5pc0JvZHkoKSl7CisgICAgICAgICAgICAgICAgICAgIGlmKGJvICE9IG51bGwpeworICAgICAgICAgICAgICAgICAgICAgICAgV1NETFBhcnRJbXBsIHAgPSBiby5nZXRQYXJ0KHBhcmFtLmdldFBhcnROYW1lKCksIG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlQYXJhbXMucHV0KHAuZ2V0SW5kZXgoKSwgcGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlQYXJhbXMucHV0KGJvZHlQYXJhbXMuc2l6ZSgpLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgYm9keVBhcmFtcy5wdXQoYm9keVBhcmFtcy5zaXplKCksIHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHdyYXBwZXJQYXJhbWV0ZXIuY2xlYXIoKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8ICBib2R5UGFyYW1zLnNpemUoKTtpKyspeworICAgICAgICAgICAgUGFyYW1ldGVySW1wbCBwID0gYm9keVBhcmFtcy5nZXQoaSk7CisgICAgICAgICAgICB3cmFwcGVyUGFyYW1ldGVyLmFkZFdyYXBwZXJDaGlsZChwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vYWRkIHVuYm91bmRlZCBwYXJ0cworICAgICAgICBmb3IoUGFyYW1ldGVySW1wbCBwOnVuYm91bmRQYXJhbXMpeworICAgICAgICAgICAgd3JhcHBlclBhcmFtZXRlci5hZGRXcmFwcGVyQ2hpbGQocCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0dGFjaFBhcmFtczsKKyAgICB9CisKKworICAgIHZvaWQgcHV0KFFOYW1lIG5hbWUsIEphdmFNZXRob2RJbXBsIGptKSB7CisgICAgICAgIG5hbWVUb0pNLnB1dChuYW1lLCBqbSk7CisgICAgfQorCisgICAgdm9pZCBwdXQoTWV0aG9kIG1ldGhvZCwgSmF2YU1ldGhvZEltcGwgam0pIHsKKyAgICAgICAgbWV0aG9kVG9KTS5wdXQobWV0aG9kLCBqbSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247CisgICAgfQorCisgICAgdm9pZCBzZXRXU0RMTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIHdzZGxMb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoKSB7CisgICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETFBvcnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFBvcnROYW1lKCkgeworICAgICAgICByZXR1cm4gcG9ydE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFBvcnRUeXBlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnRUeXBlTmFtZTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNlcnZpY2VRTmFtZShRTmFtZSBuYW1lKSB7CisgICAgICAgIHNlcnZpY2VOYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICB2b2lkIHNldFBvcnROYW1lKFFOYW1lIG5hbWUpIHsKKyAgICAgICAgcG9ydE5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHZvaWQgc2V0UG9ydFR5cGVOYW1lKFFOYW1lIG5hbWUpIHsKKyAgICAgICAgcG9ydFR5cGVOYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSB0YXJnZXROYW1lc3BhY2UgZm9yIHRoZSBXU0RMIGNvbnRhaW5pbmcgdGhlIFBvcnRUeXBlCisgICAgICogZGVmaW5pdGlvbgorICAgICAqLworICAgIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKKyAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gbmFtZXNwYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIHRhcmdldE5hbWVzcGFjZSBmb3IgdGhlIFdTREwgY29udGFpbmluZyB0aGUgUG9ydFR5cGUKKyAgICAgKiBkZWZpbml0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7CisgICAgfQorCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgUU5hbWUgZ2V0Qm91bmRQb3J0VHlwZU5hbWUoKSB7CisgICAgICAgIGFzc2VydCBwb3J0TmFtZSAhPSBudWxsOworICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHBvcnROYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwb3J0TmFtZS5nZXRMb2NhbFBhcnQoKSsiQmluZGluZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYWRkaXRpb25hbCBjbGFzc2VzIG9idGFpbmVkIGZyb20ge0BsaW5rIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzb30gYW5ub3RhdGlvbi4gSW4gc3RhcnRpbmcKKyAgICAgKiBmcm9tIHdzZGwgY2FzZSB0aGVzZSBjbGFzc2VzIHdvdWxkIG1vc3QgbGlrZWx5IGJlIEpBWEIgT2JqZWN0RmFjdG9yeSB0aGF0IHJlZmVyZW5jZXMgb3RoZXIgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsQ2xhc3NlcyhDbGFzc1tdIGFkZGl0aW9uYWxDbGFzc2VzKSB7CisgICAgICAgIGZvcihDbGFzcyBjbHM6YWRkaXRpb25hbENsYXNzZXMpeworICAgICAgICAgICAgdGhpcy5hZGRpdGlvbmFsQ2xhc3Nlcy5hZGQoY2xzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gYWRkaXRpb25hbENsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOworCisgICAgcHJpdmF0ZSBQb29sLk1hcnNoYWxsZXIgbWFyc2hhbGxlcnM7CisgICAgcHJvdGVjdGVkIEpBWEJSSUNvbnRleHQgamF4YkNvbnRleHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uOworICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWU7CisgICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZTsKKyAgICBwcml2YXRlIFFOYW1lIHBvcnRUeXBlTmFtZTsKKyAgICBwcml2YXRlIE1hcDxNZXRob2QsSmF2YU1ldGhvZEltcGw+IG1ldGhvZFRvSk0gPSBuZXcgSGFzaE1hcDxNZXRob2QsIEphdmFNZXRob2RJbXBsPigpOworICAgIHByaXZhdGUgTWFwPFFOYW1lLEphdmFNZXRob2RJbXBsPiBuYW1lVG9KTSA9IG5ldyBIYXNoTWFwPFFOYW1lLCBKYXZhTWV0aG9kSW1wbD4oKTsKKyAgICBwcml2YXRlIExpc3Q8SmF2YU1ldGhvZEltcGw+IGphdmFNZXRob2RzID0gbmV3IEFycmF5TGlzdDxKYXZhTWV0aG9kSW1wbD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxUeXBlUmVmZXJlbmNlLCBCcmlkZ2U+IGJyaWRnZU1hcCA9IG5ldyBIYXNoTWFwPFR5cGVSZWZlcmVuY2UsIEJyaWRnZT4oKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUU5hbWUgZW1wdHlCb2R5TmFtZSA9IG5ldyBRTmFtZSgiIik7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4ga25vd25OYW1lc3BhY2VVUklzID0gbnVsbDsKKyAgICBwcml2YXRlIFdTRExQb3J0SW1wbCBwb3J0OworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvQ2hlY2tlZEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvQ2hlY2tlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE5NTJjLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL0NoZWNrZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwotCi0vKioKLSAqIENoZWNrZWRFeGNlcHRpb24gY2xhc3MuIEhvbGRzIHRoZSBleGNlcHRpb24gY2xhc3MgLSBjbGFzcyB0aGF0IGhhcyBwdWJsaWMKLSAqIGNvbnN0cnVjdG9yCi0gKgotICogPGNvZGU+cHVibGljIFdyYXBwZXJFeGNlcHRpb24oKVN0cmluZyBtZXNzYWdlLCBGYXVsdEJlYW4pe308L2NvZGU+Ci0gKgotICogYW5kIG1ldGhvZAotICoKLSAqIDxjb2RlPnB1YmxpYyBGYXVsdEJlYW4gZ2V0RmF1bHRJbmZvKCk7PC9jb2RlPgotICoKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKi8KLQotcHVibGljIGNsYXNzIENoZWNrZWRFeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIEBwYXJhbSBleGNlcHRpb25DbGFzcwotICAgICAqICAgICAgICAgICAgVXNlcmRlZmluZWQgb3IgV1NETCBleGNlcHRpb24gY2xhc3MgdGhhdCBleHRlbmRzCi0gICAgICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uLgotICAgICAqIEBwYXJhbSBkZXRhaWwKLSAgICAgKiAgICAgICAgICAgIGRldGFpbCBvciBleGNlcHRpb24gYmVhbidzIFR5cGVSZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZQotICAgICAqICAgICAgICAgICAgZWl0aGVyIEV4Y2VwdGlvblR5cGUuVXNlckRlZmluZWQgb3IKLSAgICAgKiAgICAgICAgICAgIEV4Y2VwdGlvblR5cGUuV1NETEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDaGVja2VkRXhjZXB0aW9uKENsYXNzIGV4Y2VwdGlvbkNsYXNzLCBUeXBlUmVmZXJlbmNlIGRldGFpbCwgRXhjZXB0aW9uVHlwZSBleGNlcHRpb25UeXBlKSB7Ci0gICAgICAgIHRoaXMuZGV0YWlsID0gZGV0YWlsOwotICAgICAgICB0aGlzLmV4Y2VwdGlvblR5cGUgPSBleGNlcHRpb25UeXBlOwotICAgICAgICB0aGlzLmV4Y2VwdGlvbkNsYXNzID0gZXhjZXB0aW9uQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Q2xhc3M8L2Nsb2RlPiBmb3IgdGhpcyBvYmplY3QKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRFeGNwZXRpb25DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbkNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXREZXRhaWxCZWFuKCkgewotICAgICAgICByZXR1cm4gKENsYXNzKSBkZXRhaWwudHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZVJlZmVyZW5jZSBnZXREZXRhaWxUeXBlKCkgewotICAgICAgICByZXR1cm4gZGV0YWlsOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIGdldEV4Y2VwdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBleGNlcHRpb25UeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlckZhdWx0KGJvb2xlYW4gaGYpIHsKLSAgICAgICAgdGhpcy5oZWFkZXJGYXVsdCA9IGhmOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSGVhZGVyRmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBoZWFkZXJGYXVsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlTmFtZShTdHJpbmcgbWVzc2FnZU5hbWUpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlTmFtZSA9IG1lc3NhZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIGV4Y2VwdGlvbkNsYXNzOwotCi0gICAgcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIGRldGFpbDsKLQotICAgIHByaXZhdGUgRXhjZXB0aW9uVHlwZSBleGNlcHRpb25UeXBlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhlYWRlckZhdWx0ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlTmFtZTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL0NoZWNrZWRFeGNlcHRpb25JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9DaGVja2VkRXhjZXB0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTNkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9DaGVja2VkRXhjZXB0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWw7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5UeXBlUmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuQ2hlY2tlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuRXhjZXB0aW9uVHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuU0VJTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLkphdmFNZXRob2Q7CisKKy8qKgorICogQ2hlY2tlZEV4Y2VwdGlvbiBjbGFzcy4gSG9sZHMgdGhlIGV4Y2VwdGlvbiBjbGFzcyAtIGNsYXNzIHRoYXQgaGFzIHB1YmxpYworICogY29uc3RydWN0b3IKKyAqCisgKiA8Y29kZT5wdWJsaWMgV3JhcHBlckV4Y2VwdGlvbigpU3RyaW5nIG1lc3NhZ2UsIEZhdWx0QmVhbil7fTwvY29kZT4KKyAqCisgKiBhbmQgbWV0aG9kCisgKgorICogPGNvZGU+cHVibGljIEZhdWx0QmVhbiBnZXRGYXVsdEluZm8oKTs8L2NvZGU+CisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENoZWNrZWRFeGNlcHRpb25JbXBsIGltcGxlbWVudHMgQ2hlY2tlZEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBleGNlcHRpb25DbGFzczsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGVSZWZlcmVuY2UgZGV0YWlsOworICAgIHByaXZhdGUgZmluYWwgRXhjZXB0aW9uVHlwZSBleGNlcHRpb25UeXBlOworICAgIHByaXZhdGUgZmluYWwgSmF2YU1ldGhvZEltcGwgamF2YU1ldGhvZDsKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBmYXVsdEFjdGlvbjsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBqbSB7QGxpbmsgSmF2YU1ldGhvZEltcGx9IHRoYXQgdGhyb3dzIHRoaXMgZXhjZXB0aW9uCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbkNsYXNzCisgICAgICogICAgICAgICAgICBVc2VyZGVmaW5lZCBvciBXU0RMIGV4Y2VwdGlvbiBjbGFzcyB0aGF0IGV4dGVuZHMKKyAgICAgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24uCisgICAgICogQHBhcmFtIGRldGFpbAorICAgICAqICAgICAgICAgICAgZGV0YWlsIG9yIGV4Y2VwdGlvbiBiZWFuJ3MgVHlwZVJlZmVyZW5jZQorICAgICAqIEBwYXJhbSBleGNlcHRpb25UeXBlCisgICAgICogICAgICAgICAgICBlaXRoZXIgRXhjZXB0aW9uVHlwZS5Vc2VyRGVmaW5lZCBvcgorICAgICAqLworICAgIHB1YmxpYyBDaGVja2VkRXhjZXB0aW9uSW1wbChKYXZhTWV0aG9kSW1wbCBqbSwgQ2xhc3MgZXhjZXB0aW9uQ2xhc3MsIFR5cGVSZWZlcmVuY2UgZGV0YWlsLCBFeGNlcHRpb25UeXBlIGV4Y2VwdGlvblR5cGUpIHsKKyAgICAgICAgdGhpcy5kZXRhaWwgPSBkZXRhaWw7CisgICAgICAgIHRoaXMuZXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7CisgICAgICAgIHRoaXMuZXhjZXB0aW9uQ2xhc3MgPSBleGNlcHRpb25DbGFzczsKKyAgICAgICAgdGhpcy5qYXZhTWV0aG9kID0gam07CisgICAgfQorCisgICAgcHVibGljIEFic3RyYWN0U0VJTW9kZWxJbXBsIGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gamF2YU1ldGhvZC5vd25lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YU1ldGhvZCBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBqYXZhTWV0aG9kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkNsYXNzPC9jbG9kZT4gZm9yIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RXhjZXB0aW9uQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBleGNlcHRpb25DbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RGV0YWlsQmVhbigpIHsKKyAgICAgICAgcmV0dXJuIChDbGFzcykgZGV0YWlsLnR5cGU7CisgICAgfQorCisgICAgcHVibGljIEJyaWRnZSBnZXRCcmlkZ2UoKSB7CisgICAgICAgIHJldHVybiBnZXRPd25lcigpLmdldEJyaWRnZShkZXRhaWwpOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlUmVmZXJlbmNlIGdldERldGFpbFR5cGUoKSB7CisgICAgICAgIHJldHVybiBkZXRhaWw7CisgICAgfQorCisgICAgcHVibGljIEV4Y2VwdGlvblR5cGUgZ2V0RXhjZXB0aW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvblR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VOYW1lKFN0cmluZyBtZXNzYWdlTmFtZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2VOYW1lID0gbWVzc2FnZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGYXVsdEFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGZhdWx0QWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0QWN0aW9uKFN0cmluZyBmYXVsdEFjdGlvbikgeworICAgICAgICB0aGlzLmZhdWx0QWN0aW9uID0gZmF1bHRBY3Rpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvRXhjZXB0aW9uVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvRXhjZXB0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdkMWViLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL0V4Y2VwdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsOwotLyoqCi0gKiBUeXBlIG9mIGphdmEgZXhjZXB0aW9uCi0gKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqLwotcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZSB7Ci0gICAgV1NETEV4Y2VwdGlvbigwKSwgVXNlckRlZmluZWQoMSk7Ci0KLSAgICBFeGNlcHRpb25UeXBlKGludCBleGNlcHRpb25UeXBlKXsKLSAgICAgICAgdGhpcy5leGNlcHRpb25UeXBlID0gZXhjZXB0aW9uVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHZhbHVlKCkgewotICAgICAgICByZXR1cm4gZXhjZXB0aW9uVHlwZTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXhjZXB0aW9uVHlwZTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL0phdmFNZXRob2QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL0phdmFNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlOTk4YS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9KYXZhTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5UeXBlUmVmZXJlbmNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdDsKLQotLyoqCi0gKiBCdWlsZCB0aGlzIHJ1bnRpbWUgbW9kZWwgdXNpbmcgamF2YSBTRUkgYW5kIGFubm90YXRpb25zCi0gKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqLwotcHVibGljIGNsYXNzIEphdmFNZXRob2QgewotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIEphdmFNZXRob2QoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kIGdldE1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1lcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1FUCgpIHsKLSAgICAgICAgcmV0dXJuIG1lcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVwCi0gICAgICogICAgICAgICAgICBUaGUgbWVwIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNRVAoaW50IG1lcCkgewotICAgICAgICB0aGlzLm1lcCA9IG1lcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBCaW5kaW5nIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZygpIHsKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU09BUEJpbmRpbmcoKTsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJpbmRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKE9iamVjdCBiaW5kaW5nKSB7Ci0gICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25OYW1lKFN0cmluZyBvcGVyYXRpb25OYW1lKSB7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCkgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiByZXR1cm5zIHVubW9kaWZpYWJsZSBsaXN0IG9mIHJlcXVlc3QgcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiB1bm1SZXFQYXJhbXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiByZXR1cm5zIHVubW9kaWZpYWJsZSBsaXN0IG9mIHJlc3BvbnNlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IGdldFJlc3BvbnNlUGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHVubVJlc1BhcmFtczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcCkgewotICAgICAgICBpZiAocC5pc0lOKCkgfHwgcC5pc0lOT1VUKCkpIHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0UGFyYW1zLmNvbnRhaW5zKHApKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcXVlc3RQYXJhbXMuYWRkKHApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAuaXNPVVQoKSB8fCBwLmlzSU5PVVQoKSkgewotICAgICAgICAgICAgLy8gdGhpcyBjaGVjayBpcyBvbmx5IGZvciBvdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgaWYgKHJlcXVlc3RQYXJhbXMuY29udGFpbnMocCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIHRocm93IGV4Y2VwdGlvbgotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMuYWRkKHApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVxdWVzdFBhcmFtZXRlcihQYXJhbWV0ZXIgcCl7Ci0gICAgICAgIGlmIChwLmlzSU4oKSB8fCBwLmlzSU5PVVQoKSkgewotICAgICAgICAgICAgcmVxdWVzdFBhcmFtcy5hZGQocCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZXNwb25zZVBhcmFtZXRlcihQYXJhbWV0ZXIgcCl7Ci0gICAgICAgIGlmIChwLmlzT1VUKCkgfHwgcC5pc0lOT1VUKCkpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zLmFkZChwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBudW1iZXIgb2YgamF2YSBtZXRob2QgcGFyYW1ldGVycyAtIHRoYXQgd2lsbCBiZSBhbGwgdGhlCi0gICAgICogICAgICAgICBJTiwgSU5PVVQgYW5kIE9VVCBob2xkZXJzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnB1dFBhcmFtZXRlcnNDb3VudCgpIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiByZXF1ZXN0UGFyYW1zKSB7Ci0gICAgICAgICAgICBpZiAocGFyYW0uaXNXcmFwcGVyU3R5bGUoKSkgewotICAgICAgICAgICAgICAgIGNvdW50ICs9ICgoV3JhcHBlclBhcmFtZXRlcikgcGFyYW0pLmdldFdyYXBwZXJDaGlsZHJlbigpLnNpemUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogcmVzcG9uc2VQYXJhbXMpIHsKLSAgICAgICAgICAgIGlmIChwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgd2MgOiAoKFdyYXBwZXJQYXJhbWV0ZXIpIHBhcmFtKS5nZXRXcmFwcGVyQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXdjLmlzUmVzcG9uc2UoKSAmJiB3Yy5pc09VVCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghcGFyYW0uaXNSZXNwb25zZSgpICYmIHBhcmFtLmlzT1VUKCkpIHsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2VwdGlvbihDaGVja2VkRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgIGlmICghZXhjZXB0aW9ucy5jb250YWlucyhjZSkpCi0gICAgICAgICAgICBleGNlcHRpb25zLmFkZChjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbkNsYXNzCi0gICAgICogQHJldHVybiBDaGVja2VkRXhjZXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4Y2VwdGlvbkNsYXNzLiBSZXR1cm5zCi0gICAgICogICAgICAgICBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tlZEV4Y2VwdGlvbiBnZXRDaGVja2VkRXhjZXB0aW9uKENsYXNzIGV4Y2VwdGlvbkNsYXNzKSB7Ci0gICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbiBjZSA6IGV4Y2VwdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChjZS5nZXRFeGNwZXRpb25DbGFzcygpLmVxdWFscyhleGNlcHRpb25DbGFzcykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGNoZWNrZWQgRXhjZXB0aW9ucyB0aHJvd24gYnkgdGhpcyBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxDaGVja2VkRXhjZXB0aW9uPiBnZXRDaGVja2VkRXhjZXB0aW9ucygpewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChleGNlcHRpb25zKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGRldGFpbFR5cGUKLSAgICAgKiBAcmV0dXJuIEdldHMgdGhlIENoZWNrZWRFeGNlcHRpb24gY29ycmVzcG9uZGluZyB0byBkZXRhaWxUeXBlLiBSZXR1cm5zCi0gICAgICogICAgICAgICBudWxsIGlmIG5vIENoZWNrZWRFeGNwZXRpb24gd2l0aCB0aGUgZGV0YWlsVHlwZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tlZEV4Y2VwdGlvbiBnZXRDaGVja2VkRXhjZXB0aW9uKFR5cGVSZWZlcmVuY2UgZGV0YWlsVHlwZSkgewotICAgICAgICBmb3IgKENoZWNrZWRFeGNlcHRpb24gY2UgOiBleGNlcHRpb25zKSB7Ci0gICAgICAgICAgICBUeXBlUmVmZXJlbmNlIGFjdHVhbCA9IGNlLmdldERldGFpbFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWwudGFnTmFtZS5lcXVhbHMoZGV0YWlsVHlwZS50YWdOYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBhY3R1YWwudHlwZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoZGV0YWlsVHlwZS50eXBlLmdldENsYXNzKCkuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBqYXZhIG1ldGhvZCBNRVAgaXMgYXN5bmMKLSAgICAgKiBAcmV0dXJuIGlmIHRoaXMgaXMgYW4gQXN5bmNoIE1FUAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQXN5bmMoKXsKLSAgICAgICAgcmV0dXJuIG1lcCA9PSBNZXNzYWdlU3RydWN0LkFTWU5DX0NBTExCQUNLX01FUCB8fCBtZXAgPT0gTWVzc2FnZVN0cnVjdC5BU1lOQ19QT0xMX01FUDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8Q2hlY2tlZEV4Y2VwdGlvbj4gZXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8Q2hlY2tlZEV4Y2VwdGlvbj4oKTsKLSAgICBwcml2YXRlIE1ldGhvZCBtZXRob2Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcmVxdWVzdFBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHJlc3BvbnNlUGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gdW5tUmVxUGFyYW1zID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVxdWVzdFBhcmFtcyk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gdW5tUmVzUGFyYW1zID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzcG9uc2VQYXJhbXMpOwotICAgIHByaXZhdGUgT2JqZWN0IGJpbmRpbmc7Ci0gICAgcHJpdmF0ZSBpbnQgbWVwOwotICAgIHByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbk5hbWU7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9KYXZhTWV0aG9kSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvSmF2YU1ldGhvZEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdlZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvSmF2YU1ldGhvZEltcGwuamF2YQpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLkphdmFNZXRob2Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLk1FUDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuU0VJTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmdJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETEJvdW5kT3BlcmF0aW9uSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsLldTRExQb3J0SW1wbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCdWlsZCB0aGlzIHJ1bnRpbWUgbW9kZWwgdXNpbmcgamF2YSBTRUkgYW5kIGFubm90YXRpb25zCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEphdmFNZXRob2RJbXBsIGltcGxlbWVudHMgSmF2YU1ldGhvZCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXRBY3Rpb247CisgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0QWN0aW9uOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxDaGVja2VkRXhjZXB0aW9uSW1wbD4gZXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8Q2hlY2tlZEV4Y2VwdGlvbkltcGw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOworICAgIC8qcGFja2FnZSovIGZpbmFsIExpc3Q8UGFyYW1ldGVySW1wbD4gcmVxdWVzdFBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVySW1wbD4oKTsKKyAgICAvKnBhY2thZ2UqLyBmaW5hbCBMaXN0PFBhcmFtZXRlckltcGw+IHJlc3BvbnNlUGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXJJbXBsPigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbWV0ZXJJbXBsPiB1bm1SZXFQYXJhbXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlcXVlc3RQYXJhbXMpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbWV0ZXJJbXBsPiB1bm1SZXNQYXJhbXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3BvbnNlUGFyYW1zKTsKKyAgICBwcml2YXRlIFNPQVBCaW5kaW5nSW1wbCBiaW5kaW5nOworICAgIHByaXZhdGUgTUVQIG1lcDsKKyAgICBwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lOworICAgIHByaXZhdGUgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCB3c2RsT3BlcmF0aW9uOworICAgIC8qcGFja2FnZSovIGZpbmFsIEFic3RyYWN0U0VJTW9kZWxJbXBsIG93bmVyOworICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIHNlaU1ldGhvZDsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqIEBwYXJhbSBtZXRob2QgOiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBtZXRob2QKKyAgICAgKiBAcGFyYW0gc2VpTWV0aG9kIDogY29ycmVzcG9uZGluZyBTRUkgTWV0aG9kLgorICAgICAqICAgICAgICAgICAgICAgICAgSXMgdGhlcmUgaXMgbm8gU0VJLCBpdCBzaG91bGQgYmUgSW1wbGVtZW50YXRpb24gY2xhc3MgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIEphdmFNZXRob2RJbXBsKEFic3RyYWN0U0VJTW9kZWxJbXBsIG93bmVyLCBNZXRob2QgbWV0aG9kLCBNZXRob2Qgc2VpTWV0aG9kKSB7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgICAgIHRoaXMuc2VpTWV0aG9kID0gc2VpTWV0aG9kOworICAgICAgICBBY3Rpb24gYWN0aW9uID0gbWV0aG9kLmdldEFubm90YXRpb24oQWN0aW9uLmNsYXNzKTsKKyAgICAgICAgaWYoYWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0QWN0aW9uID0gYWN0aW9uLmlucHV0KCk7CisgICAgICAgICAgICBvdXRwdXRBY3Rpb24gPSBhY3Rpb24ub3V0cHV0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU0VJTW9kZWwgZ2V0T3duZXIoKSB7CisgICAgICAgIHJldHVybiBvd25lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIHtAbGluayBKYXZhTWV0aG9kfQorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSB7QGxpbmsgSmF2YU1ldGhvZH0KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgU0VJIG1ldGhvZCB3aGVyZSBhbm5vdGF0aW9ucyBhcmUgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0U0VJTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gc2VpTWV0aG9kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWVwLgorICAgICAqLworICAgIHB1YmxpYyBNRVAgZ2V0TUVQKCkgeworICAgICAgICByZXR1cm4gbWVwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBtZXAKKyAgICAgKiAgICAgICAgICAgIFRoZSBtZXAgdG8gc2V0LgorICAgICAqLworICAgIHZvaWQgc2V0TUVQKE1FUCBtZXApIHsKKyAgICAgICAgdGhpcy5tZXAgPSBtZXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgQmluZGluZyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU09BUEJpbmRpbmdJbXBsIGdldEJpbmRpbmcoKSB7CisgICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBCaW5kaW5nSW1wbCgpOworICAgICAgICByZXR1cm4gYmluZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYmluZGluZworICAgICAqLworICAgIHZvaWQgc2V0QmluZGluZyhTT0FQQmluZGluZ0ltcGwgYmluZGluZykgeworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBXU0RMQm91bmRPcGVyYXRpb259IE9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGgge0BsaW5rIHRoaXN9CisgICAgICogb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgV1NETEJvdW5kT3BlcmF0aW9uIGZvciB0aGlzIEphdmFNZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgV1NETEJvdW5kT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0IHdzZGxPcGVyYXRpb24gIT0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHdzZGxPcGVyYXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm9wZXJhdGlvbk5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0aW9uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0TWVzc2FnZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VNZXNzYWdlTmFtZSgpIHsKKyAgICAgICAgaWYobWVwLmlzT25lV2F5KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWUrIlJlc3BvbnNlIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgdW5tb2RpZmlhYmxlIGxpc3Qgb2YgcmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFyYW1ldGVySW1wbD4gZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiB1bm1SZXFQYXJhbXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiByZXR1cm5zIHVubW9kaWZpYWJsZSBsaXN0IG9mIHJlc3BvbnNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQYXJhbWV0ZXJJbXBsPiBnZXRSZXNwb25zZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiB1bm1SZXNQYXJhbXM7CisgICAgfQorCisgICAgdm9pZCBhZGRQYXJhbWV0ZXIoUGFyYW1ldGVySW1wbCBwKSB7CisgICAgICAgIGlmIChwLmlzSU4oKSB8fCBwLmlzSU5PVVQoKSkgeworICAgICAgICAgICAgYXNzZXJ0ICFyZXF1ZXN0UGFyYW1zLmNvbnRhaW5zKHApOworICAgICAgICAgICAgcmVxdWVzdFBhcmFtcy5hZGQocCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocC5pc09VVCgpIHx8IHAuaXNJTk9VVCgpKSB7CisgICAgICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIG9ubHkgZm9yIG91dCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBhc3NlcnQgIXJlc3BvbnNlUGFyYW1zLmNvbnRhaW5zKHApOworICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMuYWRkKHApOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhZGRSZXF1ZXN0UGFyYW1ldGVyKFBhcmFtZXRlckltcGwgcCl7CisgICAgICAgIGlmIChwLmlzSU4oKSB8fCBwLmlzSU5PVVQoKSkgeworICAgICAgICAgICAgcmVxdWVzdFBhcmFtcy5hZGQocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFkZFJlc3BvbnNlUGFyYW1ldGVyKFBhcmFtZXRlckltcGwgcCl7CisgICAgICAgIGlmIChwLmlzT1VUKCkgfHwgcC5pc0lOT1VUKCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zLmFkZChwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyBudW1iZXIgb2YgamF2YSBtZXRob2QgcGFyYW1ldGVycyAtIHRoYXQgd2lsbCBiZSBhbGwgdGhlCisgICAgICogICAgICAgICBJTiwgSU5PVVQgYW5kIE9VVCBob2xkZXJzCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBubyBsb25nZXIgdXNlIGluIHRoZSBuZXcgYXJjaGl0ZWN0dXJlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnB1dFBhcmFtZXRlcnNDb3VudCgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHBhcmFtIDogcmVxdWVzdFBhcmFtcykgeworICAgICAgICAgICAgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAoKFdyYXBwZXJQYXJhbWV0ZXIpIHBhcmFtKS5nZXRXcmFwcGVyQ2hpbGRyZW4oKS5zaXplKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcGFyYW0gOiByZXNwb25zZVBhcmFtcykgeworICAgICAgICAgICAgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgd2MgOiAoKFdyYXBwZXJQYXJhbWV0ZXIpIHBhcmFtKS5nZXRXcmFwcGVyQ2hpbGRyZW4oKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXdjLmlzUmVzcG9uc2UoKSAmJiB3Yy5pc09VVCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghcGFyYW0uaXNSZXNwb25zZSgpICYmIHBhcmFtLmlzT1VUKCkpIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjZQorICAgICAqLworICAgIHZvaWQgYWRkRXhjZXB0aW9uKENoZWNrZWRFeGNlcHRpb25JbXBsIGNlKSB7CisgICAgICAgIGlmICghZXhjZXB0aW9ucy5jb250YWlucyhjZSkpCisgICAgICAgICAgICBleGNlcHRpb25zLmFkZChjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbkNsYXNzCisgICAgICogQHJldHVybiBDaGVja2VkRXhjZXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4Y2VwdGlvbkNsYXNzLiBSZXR1cm5zCisgICAgICogICAgICAgICBudWxsIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hlY2tlZEV4Y2VwdGlvbkltcGwgZ2V0Q2hlY2tlZEV4Y2VwdGlvbihDbGFzcyBleGNlcHRpb25DbGFzcykgeworICAgICAgICBmb3IgKENoZWNrZWRFeGNlcHRpb25JbXBsIGNlIDogZXhjZXB0aW9ucykgeworICAgICAgICAgICAgaWYgKGNlLmdldEV4Y2VwdGlvbkNsYXNzKCk9PWV4Y2VwdGlvbkNsYXNzKQorICAgICAgICAgICAgICAgIHJldHVybiBjZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0UGF5bG9hZE5hbWUoKXsKKyAgICAgICAgaWYocGF5bG9hZE5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwYXlsb2FkTmFtZTsKKyAgICAgICAgcGF5bG9hZE5hbWUgPSB3c2RsT3BlcmF0aW9uLmdldFBheWxvYWROYW1lKCk7CisgICAgICAgIHJldHVybiBwYXlsb2FkTmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFFOYW1lIHBheWxvYWROYW1lOworCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgY2hlY2tlZCBFeGNlcHRpb25zIHRocm93biBieSB0aGlzIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PENoZWNrZWRFeGNlcHRpb25JbXBsPiBnZXRDaGVja2VkRXhjZXB0aW9ucygpeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChleGNlcHRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElucHV0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gaW5wdXRBY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRBY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGRldGFpbFR5cGUKKyAgICAgKiBAcmV0dXJuIEdldHMgdGhlIENoZWNrZWRFeGNlcHRpb24gY29ycmVzcG9uZGluZyB0byBkZXRhaWxUeXBlLiBSZXR1cm5zCisgICAgICogICAgICAgICBudWxsIGlmIG5vIENoZWNrZWRFeGNwZXRpb24gd2l0aCB0aGUgZGV0YWlsVHlwZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hlY2tlZEV4Y2VwdGlvbkltcGwgZ2V0Q2hlY2tlZEV4Y2VwdGlvbihUeXBlUmVmZXJlbmNlIGRldGFpbFR5cGUpIHsKKyAgICAgICAgZm9yIChDaGVja2VkRXhjZXB0aW9uSW1wbCBjZSA6IGV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICAgIFR5cGVSZWZlcmVuY2UgYWN0dWFsID0gY2UuZ2V0RGV0YWlsVHlwZSgpOworICAgICAgICAgICAgaWYgKGFjdHVhbC50YWdOYW1lLmVxdWFscyhkZXRhaWxUeXBlLnRhZ05hbWUpICYmIGFjdHVhbC50eXBlPT1kZXRhaWxUeXBlLnR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgdGhlIGphdmEgbWV0aG9kICBpcyBhc3luYworICAgICAqIEByZXR1cm4gaWYgdGhpcyBpcyBhbiBBc3luY2gKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FzeW5jKCl7CisgICAgICAgIHJldHVybiBtZXAuaXNBc3luYzsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyB2b2lkIGZyZWV6ZShXU0RMUG9ydEltcGwgcG9ydFR5cGUpIHsKKyAgICAgICAgdGhpcy53c2RsT3BlcmF0aW9uID0gcG9ydFR5cGUuZ2V0QmluZGluZygpLmdldChuZXcgUU5hbWUocG9ydFR5cGUuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLG9wZXJhdGlvbk5hbWUpKTsKKyAgICAgICAgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggcHJvcGVyIGVycm9yIGhhbmRsaW5nCisgICAgICAgIGlmKHdzZGxPcGVyYXRpb24gPT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmRlZmluZWQgb3BlcmF0aW9uIG5hbWUgIitvcGVyYXRpb25OYW1lKTsKKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIGZpbGxUeXBlcyhMaXN0PFR5cGVSZWZlcmVuY2U+IHR5cGVzKSB7CisgICAgICAgIGZpbGxUeXBlcyhyZXF1ZXN0UGFyYW1zLCB0eXBlcyk7CisgICAgICAgIGZpbGxUeXBlcyhyZXNwb25zZVBhcmFtcywgdHlwZXMpOworCisgICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbkltcGwgY2UgOiBleGNlcHRpb25zKSB7CisgICAgICAgICAgICB0eXBlcy5hZGQoY2UuZ2V0RGV0YWlsVHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsVHlwZXMoTGlzdDxQYXJhbWV0ZXJJbXBsPiBwYXJhbXMsIExpc3Q8VHlwZVJlZmVyZW5jZT4gdHlwZXMpIHsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHAgOiBwYXJhbXMpIHsKKyAgICAgICAgICAgIHAuZmlsbFR5cGVzKHR5cGVzKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvTW9kZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjkxZmNlLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL01vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWw7Ci0KLS8qKgotICogRGVmaW5lcyBwYXJhbWV0ZXIgbW9kZSwgSU4sIE9VVCBvciBJTk9VVAotICoKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKi8KLQotcHVibGljIGVudW0gTW9kZSB7Ci0gICAgSU4oMCksIE9VVCgxKSwgSU5PVVQoMik7Ci0KLSAgICBwcml2YXRlIE1vZGUoaW50IG1vZGUpewotICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwotICAgIH0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtb2RlOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvUGFyYW1ldGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9QYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyNjQzYS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotLyoqCi0gKiBydW50aW1lIFBhcmFtZXRlciB0aGF0IGFic3RyYWN0cyB0aGUgYW5ub3RhdGVkIGphdmEgcGFyYW1ldGVyCi0gKgotICogQGF1dGhvciBWaXZlayBQYW5kZXkKLSAqLwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyIHsKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIoVHlwZVJlZmVyZW5jZSB0eXBlLCBNb2RlIG1vZGUsIGludCBpbmRleCkgewotICAgICAgICB0aGlzLnR5cGVSZWZlcmVuY2UgPSB0eXBlOwotICAgICAgICB0aGlzLm5hbWUgPSB0eXBlLnRhZ05hbWU7Ci0gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7Ci0gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgVHlwZVJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZVJlZmVyZW5jZSBnZXRUeXBlUmVmZXJlbmNlKCkgewotICAgICAgICByZXR1cm4gdHlwZVJlZmVyZW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTb21ldGltZXMgd2UgbmVlZCB0byBvdmVyd3JpdGUgdGhlIHR5cGVSZWZlcmVuYywgc3VjaCBhcyBkdXJpbmcgcGF0Y2hpbmcgZm9yIHJwY2xpdAotICAgICAqIEBzZWUgUnVudGltZU1vZGVsI2FwcGx5UGFyYW1ldGVyQmluZGluZyhjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5CaW5kaW5nKQotICAgICAqLwotCi0gICAgdm9pZCBzZXRUeXBlUmVmZXJlbmNlKFR5cGVSZWZlcmVuY2UgdHlwZSl7Ci0gICAgICAgIHR5cGVSZWZlcmVuY2UgPSB0eXBlOwotICAgICAgICBuYW1lID0gdHlwZS50YWdOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTW9kZSBnZXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbW9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluZGV4LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFdyYXBwZXJTdHlsZSA9PSB0cnVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNXcmFwcGVyU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBCaW5kaW5nIGZvciB0aGlzIFBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXJCaW5kaW5nIGdldEJpbmRpbmcoKSB7Ci0gICAgICAgIGlmKGJpbmRpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXJCaW5kaW5nLkJPRFk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbkJpbmRpbmcoUGFyYW1ldGVyQmluZGluZyBiaW5kaW5nKXsKLSAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcgYmluZGluZyl7Ci0gICAgICAgIHRoaXMub3V0QmluZGluZyA9IGJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlckJpbmRpbmcgZ2V0SW5CaW5kaW5nKCl7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJCaW5kaW5nIGdldE91dEJpbmRpbmcoKXsKLSAgICAgICAgaWYob3V0QmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgICAgIHJldHVybiBvdXRCaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSU4oKSB7Ci0gICAgICAgIHJldHVybiBtb2RlPT1Nb2RlLklOOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT1VUKCkgewotICAgICAgICByZXR1cm4gbW9kZT09TW9kZS5PVVQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJTk9VVCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGU9PU1vZGUuSU5PVVQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXNwb25zZSgpIHsKLSAgICAgICAgcmV0dXJuIGluZGV4ID09IC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBob2xkZXIgaWYgYXBwbGljYWJsZSBlbHNlIGdpdmVzIHRoZSBvYmplY3QgYXMgaXQgaXMuIFRvIGJlCi0gICAgICogY2FsbGVkIG9uIHRoZSBpbmJvdW5kIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBub24taG9sZGVyIHZhbHVlIGlmIGl0cyBSZXNwb25zZSBvciBJTiBvdGhlcndpc2UgY3JlYXRlcyBhCi0gICAgICogICAgICAgICBob2xkZXIgd2l0aCB0aGUgcGFzc2VkIHZhbHVlIGFuZCByZXR1cm5zIGl0IGJhY2suCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUhvbGRlclZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoaXNSZXNwb25zZSgpIHx8IGlzSU4oKSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSG9sZGVyKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob2xkZXIgdmFsdWUgaWYgYXBwbGljYWJsZS4gVG8gYmUgY2FsbGVkIGZvciBpbmJvdW5kIGNsaWVudCBzaWRlCi0gICAgICogbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiBAcmV0dXJuIHRoZSBob2xkZXIgdmFsdWUgaWYgYXBwbGljYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEhvbGRlclZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIEhvbGRlcikKLSAgICAgICAgICAgIHJldHVybiAoKEhvbGRlcikgb2JqKS52YWx1ZTsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SG9sZGVyVmFsdWUoT2JqZWN0IG9iaiwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBIb2xkZXIpCi0gICAgICAgICAgICAoKEhvbGRlcikgb2JqKS52YWx1ZSA9IHZhbHVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGNhbid0IGJlIGNvcnJlY3QKLSAgICAgICAgICAgIG9iaiA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFydE5hbWUoKSB7Ci0gICAgICAgIGlmKHBhcnROYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgcmV0dXJuIHBhcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnROYW1lKFN0cmluZyBwYXJ0TmFtZSkgewotICAgICAgICB0aGlzLnBhcnROYW1lID0gcGFydE5hbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFBhcmFtZXRlckJpbmRpbmcgYmluZGluZzsKLSAgICBwcm90ZWN0ZWQgUGFyYW1ldGVyQmluZGluZyBvdXRCaW5kaW5nOwotICAgIHByb3RlY3RlZCBpbnQgaW5kZXg7Ci0gICAgcHJvdGVjdGVkIE1vZGUgbW9kZTsKLSAgICBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlOwotICAgIHByb3RlY3RlZCBRTmFtZSBuYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmcgcGFydE5hbWU7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9QYXJhbWV0ZXJCaW5kaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9QYXJhbWV0ZXJCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzNmYmIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvUGFyYW1ldGVyQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsOwotCi0vKioKLSAqIERlbm90ZXMgdGhlIGJpbmRpbmcgb2YgYSBwYXJhbWV0ZXIuCi0gKgotICogPHA+Ci0gKiBUaGlzIGlzIHNvbWV3aGF0IGxpa2UgYW4gZW51bWVyYXRpb24gKGJ1dCBpdCBpcyA8Yj5OT1Q8L2I+IGFuIGVudW1lcmF0aW9uLikKLSAqCi0gKiA8cD4KLSAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlCi0gKiBCT0RZLCBIRUFERVIsIFVOQk9VTkQsIGFuZCBBVFRBQ0hNRU5ULiBCT0RZLCBIRUFERVIsIGFuZCBVTkJPVU5ECi0gKiBoYXMgYSBzaW5nbGV0b24gc2VtYW50aWNzLCBidXQgdGhlcmUgYXJlIG11bHRpcGxlIEFUVEFDSE1FTlQgaW5zdGFuY2VzCi0gKiBhcyBpdCBjYXJyaWVzIGFkZGl0aW9uYWwgTUlNRSB0eXBlIHBhcmFtZXRlci4KLSAqCi0gKiA8cD4KLSAqIFNvIGRvbid0IHVzZSAnPT0nIGZvciB0ZXN0aW5nIHRoZSBlcXVhbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBhcmFtZXRlckJpbmRpbmcgewotICAgIC8qKgotICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZSB0aGF0IHJlcHJlc2VudHMgJ0JPRFknCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJhbWV0ZXJCaW5kaW5nIEJPRFkgPSBuZXcgUGFyYW1ldGVyQmluZGluZygiQk9EWSIsbnVsbCk7Ci0gICAgLyoqCi0gICAgICogU2luZ2xldG9uIGluc3RhbmNlIHRoYXQgcmVwcmVzZW50cyAnSEVBREVSJwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyYW1ldGVyQmluZGluZyBIRUFERVIgPSBuZXcgUGFyYW1ldGVyQmluZGluZygiSEVBREVSIixudWxsKTsKLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2UgdGhhdCByZXByZXNlbnRzICdVTkJPVU5EJywKLSAgICAgKiBtZWFuaW5nIHRoZSBwYXJhbWV0ZXIgZG9lc24ndCBoYXZlIGEgcmVwcmVzZW50YXRpb24gaW4gYSBTT0FQIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJhbWV0ZXJCaW5kaW5nIFVOQk9VTkQgPSBuZXcgUGFyYW1ldGVyQmluZGluZygiVU5CT1VORCIsbnVsbCk7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB0aGF0IHJlcHJlc2VudHMgdGhlIGF0dGFjaG1lbnQKLSAgICAgKiB3aXRoIGEgZ2l2ZW4gTUlNRSB0eXBlLgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogVE9ETzogc2hhbGwgd2UgY29uc2lkZXIgZ2l2aW50IHRoZSBzaW5nbGV0b24gc2VtYW50aWNzIGJ5IHVzaW5nCi0gICAgICogYSBjYWNoZT8gSXQncyBtb3JlIGVsZWdhbnQgdG8gZG8gc28sIGJ1dAotICAgICAqIG5vIHdoZXJlIGluIEpBWC1XUyBSSSB0d28ge0BsaW5rIFBhcmFtZXRlckJpbmRpbmd9cyBhcmUgY29tcGFyZWQgdG9kYXksCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQYXJhbWV0ZXJCaW5kaW5nIGNyZWF0ZUF0dGFjaG1lbnQoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyQmluZGluZygiQVRUQUNITUVOVCIsbWltZVR5cGUpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWltZVR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotICAgIHByaXZhdGUgUGFyYW1ldGVyQmluZGluZyhTdHJpbmcgbmFtZSxTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOwotICAgIH0KLQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBNSU1FIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGluZy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICBpZiB0aGlzIGJpbmRpbmcgZG9lc24ndCByZXByZXNlbnQgYW4gYXR0YWNobWVudC4KLSAgICAgKiAgICAgIElPVywgaWYge0BsaW5rICNpc0F0dGFjaG1lbnQoKX0gcmV0dXJucyBmYWxzZS4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgICBDYW4gYmUgbnVsbCwgaWYgdGhlIE1JTUUgdHlwZSBpcyBub3Qga25vd24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICAgICAgaWYoIWlzQXR0YWNobWVudCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm4gbWltZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCb2R5KCl7Ci0gICAgICAgIHJldHVybiB0aGlzPT1CT0RZOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSGVhZGVyKCl7Ci0gICAgICAgIHJldHVybiB0aGlzPT1IRUFERVI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVbmJvdW5kKCl7Ci0gICAgICAgIHJldHVybiB0aGlzPT1VTkJPVU5EOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0YWNobWVudCgpewotICAgICAgICByZXR1cm4gbmFtZT09IkFUVEFDSE1FTlQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL1BhcmFtZXRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL1BhcmFtZXRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzY5ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvUGFyYW1ldGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWw7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuSmF2YU1ldGhvZDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOworCitpbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIHJ1bnRpbWUgUGFyYW1ldGVyIHRoYXQgYWJzdHJhY3RzIHRoZSBhbm5vdGF0ZWQgamF2YSBwYXJhbWV0ZXIKKyAqCisgKiA8cD4KKyAqIEEgcGFyYW1ldGVyIG1heSBiZSBib3VuZCB0byBhIGhlYWRlciwgYSBib2R5LCBvciBhbiBhdHRhY2htZW50LgorICogTm90ZSB0aGF0IHdoZW4gaXQncyBib3VuZCB0byBhIGJvZHksIGl0J3MgYm91bmQgdG8gYSBib2R5LAorICogaXQgYmluZHMgdG8gdGhlIHdob2xlIHBheWxvYWQuCisgKgorICogPHA+CisgKiBTb21ldGltZXMgbXVsdGlwbGUgSmF2YSBwYXJhbWV0ZXJzIGFyZSBwYWNrZWQgaW50byB0aGUgcGF5bG9hZCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHN1YmNsYXNzIHtAbGluayBXcmFwcGVyUGFyYW1ldGVyfSBpcyB1c2VkLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJJbXBsIGltcGxlbWVudHMgUGFyYW1ldGVyIHsKKworICAgIHByaXZhdGUgUGFyYW1ldGVyQmluZGluZyBiaW5kaW5nOworICAgIHByaXZhdGUgUGFyYW1ldGVyQmluZGluZyBvdXRCaW5kaW5nOworICAgIHByaXZhdGUgU3RyaW5nIHBhcnROYW1lOworICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OworICAgIHByaXZhdGUgZmluYWwgTW9kZSBtb2RlOworICAgIHByaXZhdGUgVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlOworICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIEphdmFNZXRob2RJbXBsIHBhcmVudDsKKworICAgIHB1YmxpYyBQYXJhbWV0ZXJJbXBsKEphdmFNZXRob2RJbXBsIHBhcmVudCwgVHlwZVJlZmVyZW5jZSB0eXBlLCBNb2RlIG1vZGUsIGludCBpbmRleCkgeworICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOworCisgICAgICAgIHRoaXMudHlwZVJlZmVyZW5jZSA9IHR5cGU7CisgICAgICAgIHRoaXMubmFtZSA9IHR5cGUudGFnTmFtZTsKKyAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisKKyAgICAvL3B1YmxpYyBQYXJhbWV0ZXJJbXBsKFR5cGVSZWZlcmVuY2UgdHlwZSwgTW9kZSBtb2RlLCBpbnQgaW5kZXgpIHsKKyAgICAvLyAgICB0aGlzKG51bGwsIHR5cGUsIG1vZGUsIGluZGV4KTsKKyAgICAvL30KKworICAgIHB1YmxpYyBBYnN0cmFjdFNFSU1vZGVsSW1wbCBnZXRPd25lcigpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudC5vd25lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YU1ldGhvZCBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnJpZGdlIGdldEJyaWRnZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE93bmVyKCkuZ2V0QnJpZGdlKHR5cGVSZWZlcmVuY2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBCcmlkZ2UgZ2V0QnJpZGdlKFR5cGVSZWZlcmVuY2UgdHlwZVJlZikgeworICAgICAgICByZXR1cm4gZ2V0T3duZXIoKS5nZXRCcmlkZ2UodHlwZVJlZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogb25jZSB0aGUgbW9kZWwgZ2V0cyBKQVhCQ29udGV4dCwgc2hvdWxkbid0IHtAbGluayBCcmlkZ2V9cworICAgICAqIGJlIG1hZGUgYXZhaWxhYmxlIGZyb20gbW9kZWwgb2JqZWN0cz8KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgVHlwZVJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZVJlZmVyZW5jZSBnZXRUeXBlUmVmZXJlbmNlKCkgeworICAgICAgICByZXR1cm4gdHlwZVJlZmVyZW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb21ldGltZXMgd2UgbmVlZCB0byBvdmVyd3JpdGUgdGhlIHR5cGVSZWZlcmVuYywgc3VjaCBhcyBkdXJpbmcgcGF0Y2hpbmcgZm9yIHJwY2xpdAorICAgICAqIEBzZWUgQWJzdHJhY3RTRUlNb2RlbEltcGwjYXBwbHlQYXJhbWV0ZXJCaW5kaW5nKGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETEJvdW5kUG9ydFR5cGVJbXBsKQorICAgICAqLworICAgIHZvaWQgc2V0VHlwZVJlZmVyZW5jZShUeXBlUmVmZXJlbmNlIHR5cGUpeworICAgICAgICB0eXBlUmVmZXJlbmNlID0gdHlwZTsKKyAgICAgICAgbmFtZSA9IHR5cGUudGFnTmFtZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBNb2RlIGdldE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtb2RlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgPHR0PnRoaXMgaW5zdGFuY2VvZiB7QGxpbmsgV3JhcHBlclBhcmFtZXRlcn08L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyYXBwZXJTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmV0dXJuVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBpbmRleD09LTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgQmluZGluZyBmb3IgdGhpcyBQYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyQmluZGluZyBnZXRCaW5kaW5nKCkgeworICAgICAgICBpZihiaW5kaW5nID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyQmluZGluZy5CT0RZOworICAgICAgICByZXR1cm4gYmluZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYmluZGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmcoUGFyYW1ldGVyQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5CaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcgYmluZGluZyl7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nIGJpbmRpbmcpeworICAgICAgICB0aGlzLm91dEJpbmRpbmcgPSBiaW5kaW5nOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXJCaW5kaW5nIGdldEluQmluZGluZygpeworICAgICAgICByZXR1cm4gYmluZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyQmluZGluZyBnZXRPdXRCaW5kaW5nKCl7CisgICAgICAgIGlmKG91dEJpbmRpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBiaW5kaW5nOworICAgICAgICByZXR1cm4gb3V0QmluZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lOKCkgeworICAgICAgICByZXR1cm4gbW9kZT09TW9kZS5JTjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09VVCgpIHsKKyAgICAgICAgcmV0dXJuIG1vZGU9PU1vZGUuT1VUOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSU5PVVQoKSB7CisgICAgICAgIHJldHVybiBtb2RlPT1Nb2RlLklOT1VUOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBhIG1ldGhvZCBpbnZvY2F0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICoge0BsaW5rIEphdmFNZXRob2RJbXBsI2dldFJlc3BvbnNlUGFyYW1ldGVycygpfSBpcyBndWFyYW50ZWVkIHRvIGhhdmUKKyAgICAgKiBhdCBtb3N0IG9uZSBzdWNoIHtAbGluayBQYXJhbWV0ZXJJbXBsfS4gTm90ZSB0aGF0IHRoZXJlIGNvdWxlIGJlIG5vbmUsCisgICAgICogaW4gd2hpY2ggY2FzZSB0aGUgbWV0aG9kIHJldHVybnMgPHR0PnZvaWQ8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlKCkgeworICAgICAgICByZXR1cm4gaW5kZXggPT0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhvbGRlciBpZiBhcHBsaWNhYmxlIGVsc2UgZ2l2ZXMgdGhlIG9iamVjdCBhcyBpdCBpcy4gVG8gYmUKKyAgICAgKiBjYWxsZWQgb24gdGhlIGluYm91bmQgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqIEByZXR1cm4gdGhlIG5vbi1ob2xkZXIgdmFsdWUgaWYgaXRzIFJlc3BvbnNlIG9yIElOIG90aGVyd2lzZSBjcmVhdGVzIGEKKyAgICAgKiAgICAgICAgIGhvbGRlciB3aXRoIHRoZSBwYXNzZWQgdmFsdWUgYW5kIHJldHVybnMgaXQgYmFjay4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlSG9sZGVyVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChpc1Jlc3BvbnNlKCkgfHwgaXNJTigpKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBIb2xkZXIodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGhvbGRlciB2YWx1ZSBpZiBhcHBsaWNhYmxlLiBUbyBiZSBjYWxsZWQgZm9yIGluYm91bmQgY2xpZW50IHNpZGUKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG9iagorICAgICAqIEByZXR1cm4gdGhlIGhvbGRlciB2YWx1ZSBpZiBhcHBsaWNhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0SG9sZGVyVmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgSG9sZGVyKQorICAgICAgICAgICAgcmV0dXJuICgoSG9sZGVyKSBvYmopLnZhbHVlOworICAgICAgICByZXR1cm4gb2JqOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIb2xkZXJWYWx1ZShPYmplY3Qgb2JqLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEhvbGRlcikKKyAgICAgICAgICAgICgoSG9sZGVyKSBvYmopLnZhbHVlID0gdmFsdWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgY2FuJ3QgYmUgY29ycmVjdAorICAgICAgICAgICAgb2JqID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJ0TmFtZSgpIHsKKyAgICAgICAgaWYocGFydE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICByZXR1cm4gcGFydE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFydE5hbWUoU3RyaW5nIHBhcnROYW1lKSB7CisgICAgICAgIHRoaXMucGFydE5hbWUgPSBwYXJ0TmFtZTsKKyAgICB9CisKKworICAgIHZvaWQgZmlsbFR5cGVzKExpc3Q8VHlwZVJlZmVyZW5jZT4gdHlwZXMpIHsKKyAgICAgICAgdHlwZXMuYWRkKGdldFR5cGVSZWZlcmVuY2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvUnVudGltZU1vZGVsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9SdW50aW1lTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4YjIzMy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9SdW50aW1lTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5CcmlkZ2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkpBWEJSSUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5SYXdBY2Nlc3NvcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5KQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLkpBWFdTQXR0YWNobWVudFVubWFyc2hhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCcmlkZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuUnBjTGl0UGF5bG9hZDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLkJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuUGFydDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwud3JpdGVyLldTRExHZW5lcmF0b3I7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBtb2RlbCBvZiB0aGUgd2ViIHNlcnZpY2UuICBVc2VkIGJ5IHRoZSBydW50aW1lIG1hcnNoYWxsL3VubWFyc2hhbGwKLSAqIHdlYiBzZXJ2aWNlIGludm9jYXRpb25zCi0gKgotICogJGF1dGhvcjogSkFYV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVudGltZU1vZGVsIHsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFJ1bnRpbWVNb2RlbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9zdFByb2Nlc3MoKSB7Ci0gICAgICAgIC8vIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLgotICAgICAgICBpZiAoamF4YkNvbnRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgcG9wdWxhdGVNYXBzKCk7Ci0gICAgICAgIHBvcHVsYXRlQXN5bmNFeGNlcHRpb25zKCk7Ci0gICAgICAgIGNyZWF0ZUpBWEJDb250ZXh0KCk7Ci0gICAgICAgIGNyZWF0ZURlY29kZXJJbmZvKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgbWV0aG9kVG9KTSBhbmQgbmFtZVRvSk0gbWFwcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hcHMoKSB7Ci0gICAgICAgIGZvciAoSmF2YU1ldGhvZCBqbSA6IGdldEphdmFNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIHB1dChqbS5nZXRNZXRob2QoKSwgam0pOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcCA6IGptLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgICAgICBwdXQocC5nZXROYW1lKCksIGptKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXN5bmNFeGNlcHRpb25zKCkgewotICAgICAgICBmb3IgKEphdmFNZXRob2Qgam0gOiBnZXRKYXZhTWV0aG9kcygpKSB7Ci0gICAgICAgICAgICBpbnQgbWVwID0gam0uZ2V0TUVQKCk7Ci0gICAgICAgICAgICBpZiAobWVwID09IE1lc3NhZ2VJbmZvLkFTWU5DX0NBTExCQUNLX01FUCB8fCBtZXAgPT0gTWVzc2FnZUluZm8uQVNZTkNfUE9MTF9NRVApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BOYW1lID0gam0uZ2V0T3BlcmF0aW9uTmFtZSgpOwotICAgICAgICAgICAgICAgIE1ldGhvZCBtID0gam0uZ2V0TWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbXMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lcCA9PSBNZXNzYWdlSW5mby5BU1lOQ19DQUxMQkFDS19NRVApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gbmV3IENsYXNzW3BhcmFtcy5sZW5ndGgtMV07Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobS5nZXRQYXJhbWV0ZXJUeXBlcygpLCAwLCBwYXJhbXMsIDAsIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGgtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZCBvbSA9IG0uZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRNZXRob2Qob3BOYW1lLCBwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBKYXZhTWV0aG9kIGptMiA9IGdldEphdmFNZXRob2Qob20pOwotICAgICAgICAgICAgICAgICAgICBmb3IgKENoZWNrZWRFeGNlcHRpb24gY2UgOiBqbTIuZ2V0Q2hlY2tlZEV4Y2VwdGlvbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgam0uYWRkRXhjZXB0aW9uKGNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkJyaWRnZUNvbnRleHQ8L2NvZGU+IGZvciB0aGlzIDxjb2RlPlJ1bnRpbWVNb2RlbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnJpZGdlQ29udGV4dCBnZXRCcmlkZ2VDb250ZXh0KCkgewotICAgICAgICBpZiAoamF4YkNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBCcmlkZ2VDb250ZXh0IGJjID0gYnJpZGdlQ29udGV4dC5nZXQoKTsKLSAgICAgICAgaWYgKGJjID09IG51bGwpIHsKLSAgICAgICAgICAgIGJjID0gamF4YkNvbnRleHQuY3JlYXRlQnJpZGdlQ29udGV4dCgpOwotICAgICAgICAgICAgYmMuc2V0QXR0YWNobWVudE1hcnNoYWxsZXIobmV3IEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIoZW5hYmxlTXRvbSkpOwotICAgICAgICAgICAgYmMuc2V0QXR0YWNobWVudFVubWFyc2hhbGxlcihuZXcgSkFYV1NBdHRhY2htZW50VW5tYXJzaGFsbGVyKCkpOwotICAgICAgICAgICAgYnJpZGdlQ29udGV4dC5zZXQoYmMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5KQVhCUklDb250ZXh0PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBKQVhCUklDb250ZXh0IGdldEpBWEJDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gamF4YkNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUga25vd24gbmFtZXNwYWNlcyBmcm9tIEpBWEJSSUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEtub3duTmFtZXNwYWNlVVJJcygpIHsKLSAgICAgICAgcmV0dXJuIGtub3duTmFtZXNwYWNlVVJJczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkJyaWRnZTwvY29kZT4gZm9yIHRoZSA8Y29kZT50eXBlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBCcmlkZ2UgZ2V0QnJpZGdlKFR5cGVSZWZlcmVuY2UgdHlwZSkgewotICAgICAgICByZXR1cm4gYnJpZGdlTWFwLmdldCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gZWl0aGVyIGEgPGNvZGU+UnBjTGl0cGF5bG9hZDwvY29kZT4gb3IgYSA8Y29kZT5KQVhCQnJpZGdlSW5mbzwvY29kZT4gZm9yCi0gICAgICogYW4gb3BlcmF0aW9uIG5hbWVkIDxjb2RlPm5hbWU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREZWNvZGVySW5mbyhRTmFtZSBuYW1lKSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwYXlsb2FkTWFwLmdldChuYW1lKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJwY0xpdFBheWxvYWQpIHsKLSAgICAgICAgICAgIHJldHVybiBScGNMaXRQYXlsb2FkLmNvcHkoKFJwY0xpdFBheWxvYWQpIG9iaik7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSkFYQkJyaWRnZUluZm8pIHsKLSAgICAgICAgICAgIHJldHVybiBKQVhCQnJpZGdlSW5mby5jb3B5KChKQVhCQnJpZGdlSW5mbykgb2JqKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSBwYXlsb2FkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGVjb2RlckluZm8oUU5hbWUgbmFtZSwgT2JqZWN0IHBheWxvYWQpIHsKLSAgICAgICAgcGF5bG9hZE1hcC5wdXQobmFtZSwgcGF5bG9hZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgSkFYQlJJQ29udGV4dCBjcmVhdGVKQVhCQ29udGV4dCgpIHsKLSAgICAgICAgZmluYWwgTGlzdDxUeXBlUmVmZXJlbmNlPiB0eXBlcyA9IGdldEFsbFR5cGVSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZpbmFsIENsYXNzW10gY2xzID0gbmV3IENsYXNzW3R5cGVzLnNpemUoKV07Ci0gICAgICAgIGZpbmFsIFN0cmluZyBucyA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKFR5cGVSZWZlcmVuY2UgdHlwZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICBjbHNbaSsrXSA9IChDbGFzcykgdHlwZS50eXBlOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL2pheGJDb250ZXh0ID0gSkFYQlJJQ29udGV4dC5uZXdJbnN0YW5jZShjbHMsIHR5cGVzLCB0YXJnZXROYW1lc3BhY2UsIGZhbHNlKTsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gYXZvaWQgZG9Qcml2IGJsb2NrIG9uY2UgSkFYQiBpcyBmaXhlZC4gQWZ0ZXJ3YXJkcywgdXNlIHRoZSBhYm92ZQotICAgICAgICAgICAgamF4YkNvbnRleHQgPSAoSkFYQlJJQ29udGV4dCkKLSAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSkFYQlJJQ29udGV4dC5uZXdJbnN0YW5jZShjbHMsIHR5cGVzLCBucywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGNyZWF0ZUJyaWRnZU1hcCh0eXBlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGtub3duTmFtZXNwYWNlVVJJcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyBuYW1lc3BhY2UgOiBqYXhiQ29udGV4dC5nZXRLbm93bk5hbWVzcGFjZVVSSXMoKSkgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5lcXVhbHMoU09BUE5hbWVzcGFjZUNvbnN0YW50cy5YU0QpICYmICFuYW1lc3BhY2UuZXF1YWxzKFNPQVBOYW1lc3BhY2VDb25zdGFudHMuWE1MTlMpKQotICAgICAgICAgICAgICAgICAgICBrbm93bk5hbWVzcGFjZVVSSXMuYWRkKG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gamF4YkNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiByZXR1cm5zIG5vbi1udWxsIGxpc3Qgb2YgVHlwZVJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFR5cGVSZWZlcmVuY2U+IGdldEFsbFR5cGVSZWZlcmVuY2VzKCkgewotICAgICAgICBMaXN0PFR5cGVSZWZlcmVuY2U+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxUeXBlUmVmZXJlbmNlPigpOwotICAgICAgICBDb2xsZWN0aW9uPEphdmFNZXRob2Q+IG1ldGhvZHMgPSBtZXRob2RUb0pNLnZhbHVlcygpOwotICAgICAgICBmb3IgKEphdmFNZXRob2QgbSA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGZpbGxUeXBlcyhtLCB0eXBlcyk7Ci0gICAgICAgICAgICBmaWxsRmF1bHREZXRhaWxUeXBlcyhtLCB0eXBlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaWxsRmF1bHREZXRhaWxUeXBlcyhKYXZhTWV0aG9kIG0sIExpc3Q8VHlwZVJlZmVyZW5jZT4gdHlwZXMpIHsKLSAgICAgICAgZm9yIChDaGVja2VkRXhjZXB0aW9uIGNlIDogbS5nZXRDaGVja2VkRXhjZXB0aW9ucygpKSB7Ci0gICAgICAgICAgICB0eXBlcy5hZGQoY2UuZ2V0RGV0YWlsVHlwZSgpKTsKLS8vICAgICAgICAgICAgYWRkR2xvYmFsVHlwZShjZS5nZXREZXRhaWxUeXBlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbFR5cGVzKEphdmFNZXRob2QgbSwgTGlzdDxUeXBlUmVmZXJlbmNlPiB0eXBlcykgewotICAgICAgICBhZGRUeXBlcyhtLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCksIHR5cGVzKTsKLSAgICAgICAgYWRkVHlwZXMobS5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKSwgdHlwZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUeXBlcyhMaXN0PFBhcmFtZXRlcj4gcGFyYW1zLCBMaXN0PFR5cGVSZWZlcmVuY2U+IHR5cGVzKSB7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyIHAgOiBwYXJhbXMpIHsKLSAgICAgICAgICAgIHR5cGVzLmFkZChwLmdldFR5cGVSZWZlcmVuY2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQnJpZGdlTWFwKExpc3Q8VHlwZVJlZmVyZW5jZT4gdHlwZXMpIHsKLSAgICAgICAgZm9yIChUeXBlUmVmZXJlbmNlIHR5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgQnJpZGdlIGJyaWRnZSA9IGpheGJDb250ZXh0LmNyZWF0ZUJyaWRnZSh0eXBlKTsKLSAgICAgICAgICAgIGJyaWRnZU1hcC5wdXQodHlwZSwgYnJpZGdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gZm9yIGEgZ2l2ZW4gT3BlcmF0aW9uIDxjb2RlPnFuYW1lPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2QgZ2V0RGlzcGF0Y2hNZXRob2QoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgLy9oYW5kbGUgdGhlIGVtcHR5IGJvZHkKLSAgICAgICAgaWYgKHFuYW1lID09IG51bGwpCi0gICAgICAgICAgICBxbmFtZSA9IGVtcHR5Qm9keU5hbWU7Ci0gICAgICAgIEphdmFNZXRob2Qgam0gPSBnZXRKYXZhTWV0aG9kKHFuYW1lKTsKLSAgICAgICAgaWYgKGptICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBqbS5nZXRNZXRob2QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+bmFtZTwvY29kZT4gaXMgdGhlIG5hbWUKLSAgICAgKiBvZiBhIGtub3duIGZhdWx0IG5hbWUgZm9yIHRoZSA8Y29kZT5NZXRob2QgbWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzS25vd25GYXVsdChRTmFtZSBuYW1lLCBNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIEphdmFNZXRob2QgbSA9IGdldEphdmFNZXRob2QobWV0aG9kKTsKLSAgICAgICAgZm9yIChDaGVja2VkRXhjZXB0aW9uIGNlIDogbS5nZXRDaGVja2VkRXhjZXB0aW9ucygpKSB7Ci0gICAgICAgICAgICBpZiAoY2UuZ2V0RGV0YWlsVHlwZSgpLnRhZ05hbWUuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbQotICAgICAqIEBwYXJhbSBleAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5leDwvY29kZT4gaXMgYSBDaGVja2VkIEV4Y2VwdGlvbgotICAgICAqIGZvciA8Y29kZT5NZXRob2QgbTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWRFeGNlcHRpb24oTWV0aG9kIG0sIENsYXNzIGV4KSB7Ci0gICAgICAgIEphdmFNZXRob2Qgam0gPSBnZXRKYXZhTWV0aG9kKG0pOwotICAgICAgICBmb3IgKENoZWNrZWRFeGNlcHRpb24gY2UgOiBqbS5nZXRDaGVja2VkRXhjZXB0aW9ucygpKSB7Ci0gICAgICAgICAgICBpZiAoY2UuZ2V0RXhjcGV0aW9uQ2xhc3MoKS5lcXVhbHMoZXgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5tZXRob2Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEphdmFNZXRob2QgZ2V0SmF2YU1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RUb0pNLmdldChtZXRob2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIG9wZXJhdGlvbiBuYW1lZCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIEphdmFNZXRob2QgZ2V0SmF2YU1ldGhvZChRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lVG9KTS5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGptCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+UU5hbWU8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgKiBKYXZhTWV0aG9kIGptCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lRm9ySk0oSmF2YU1ldGhvZCBqbSkgewotICAgICAgICBTZXQ8UU5hbWU+IHNldCA9IG5hbWVUb0pNLmtleVNldCgpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBRTmFtZSBrZXkgPSAoUU5hbWUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgSmF2YU1ldGhvZCBqbWV0aG9kID0gKEphdmFNZXRob2QpIG5hbWVUb0pNLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKGptZXRob2QuZ2V0T3BlcmF0aW9uTmFtZSgpLmVxdWFscyhqbS5nZXRPcGVyYXRpb25OYW1lKCkpKXsKLSAgICAgICAgICAgICAgIHJldHVybiBrZXk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IG9mIDxjb2RlPkphdmFNZXRob2RzPC9jb2RlPgotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxjb2RlPlJ1bnRpbWVNb2RlbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxKYXZhTWV0aG9kPiBnZXRKYXZhTWV0aG9kcygpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoamF2YU1ldGhvZHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEphdmFNZXRob2QoSmF2YU1ldGhvZCBqbSkgewotICAgICAgICBpZiAoam0gIT0gbnVsbCkKLSAgICAgICAgICAgIGphdmFNZXRob2RzLmFkZChqbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQYXJhbWV0ZXJCaW5kaW5nKEJpbmRpbmcgd3NkbEJpbmRpbmcpewotICAgICAgICBpZih3c2RsQmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB3c2RsQmluZGluZy5maW5hbGl6ZUJpbmRpbmcoKTsKLSAgICAgICAgZm9yKEphdmFNZXRob2QgbWV0aG9kIDogamF2YU1ldGhvZHMpewotICAgICAgICAgICAgaWYobWV0aG9kLmlzQXN5bmMoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNScGNsaXQgPSAoKFNPQVBCaW5kaW5nKW1ldGhvZC5nZXRCaW5kaW5nKCkpLmlzUnBjTGl0KCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlcj4gcmVxUGFyYW1zID0gbWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlcj4gcmVxQXR0YWNoUGFyYW1zID0gbnVsbDsKLSAgICAgICAgICAgIGZvcihQYXJhbWV0ZXIgcGFyYW06cmVxUGFyYW1zKXsKLSAgICAgICAgICAgICAgICBpZihwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoaXNScGNsaXQpewotICAgICAgICAgICAgICAgICAgICAgICAgV3JhcHBlclBhcmFtZXRlciByZXFQYXJhbSA9IChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBibyA9IHdzZGxCaW5kaW5nLmdldChtZXRob2QuZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJvICE9IG51bGwgJiYgYm8uZ2V0UmVxdWVzdE5hbWVzcGFjZSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoUnBjbGl0TmFtZXNwYWNlKGJvLmdldFJlcXVlc3ROYW1lc3BhY2UoKSwgcmVxUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxQXR0YWNoUGFyYW1zID0gYXBwbHlScGNMaXRQYXJhbUJpbmRpbmcobWV0aG9kLCByZXFQYXJhbSwgd3NkbEJpbmRpbmcsIE1vZGUuSU4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBwYXJhbS5nZXRQYXJ0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmKHBhcnROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgcGFyYW1CaW5kaW5nID0gd3NkbEJpbmRpbmcuZ2V0QmluZGluZyhtZXRob2QuZ2V0T3BlcmF0aW9uTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsIE1vZGUuSU4pOwotICAgICAgICAgICAgICAgIGlmKHBhcmFtQmluZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRJbkJpbmRpbmcocGFyYW1CaW5kaW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHJlc0F0dGFjaFBhcmFtcyA9IG51bGw7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlcj4gcmVzUGFyYW1zID0gbWV0aG9kLmdldFJlc3BvbnNlUGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yKFBhcmFtZXRlciBwYXJhbTpyZXNQYXJhbXMpewotICAgICAgICAgICAgICAgIGlmKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpewotICAgICAgICAgICAgICAgICAgICBpZihpc1JwY2xpdCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyUGFyYW1ldGVyIHJlc3BQYXJhbSA9IChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBibyA9IHdzZGxCaW5kaW5nLmdldChtZXRob2QuZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJvICE9IG51bGwgJiYgYm8uZ2V0UmVzcG9uc2VOYW1lc3BhY2UoKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFJwY2xpdE5hbWVzcGFjZShiby5nZXRSZXNwb25zZU5hbWVzcGFjZSgpLCByZXNwUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXR0YWNoUGFyYW1zID0gYXBwbHlScGNMaXRQYXJhbUJpbmRpbmcobWV0aG9kLCByZXNwUGFyYW0sIHdzZGxCaW5kaW5nLCBNb2RlLk9VVCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgaW5vdXQgYW5kIGl0cyBoZWFkZXI9dHJ1ZSB0aGVuIGRvbnQgZ2V0IGJpbmRpbmcgZnJvbSBXU0RMCi0vLyAgICAgICAgICAgICAgICBpZighcGFyYW0uaXNJTk9VVCgpICYmIHBhcmFtLmdldEJpbmRpbmcoKS5pc0hlYWRlcigpKQotLy8gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHBhcmFtLmdldFBhcnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYocGFydE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYXJhbUJpbmRpbmcgPSB3c2RsQmluZGluZy5nZXRCaW5kaW5nKG1ldGhvZC5nZXRPcGVyYXRpb25OYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwgTW9kZS5PVVQpOwotICAgICAgICAgICAgICAgIGlmKHBhcmFtQmluZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRPdXRCaW5kaW5nKHBhcmFtQmluZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihyZXFBdHRhY2hQYXJhbXMgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgZm9yKFBhcmFtZXRlciBwIDogcmVxQXR0YWNoUGFyYW1zKXsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmFkZFJlcXVlc3RQYXJhbWV0ZXIocCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocmVzQXR0YWNoUGFyYW1zICE9IG51bGwpewotICAgICAgICAgICAgICAgIGZvcihQYXJhbWV0ZXIgcCA6IHJlc0F0dGFjaFBhcmFtcyl7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5hZGRSZXNwb25zZVBhcmFtZXRlcihwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBycGNsaXQgd3JhcHBlciBlbGVtZW50IGluc2lkZSA8c29hcGVudjpCb2R5PiwgdGhlIHRhcmdldE5hbWVzcGFjZSBzaG91bGQgYmUgdGFrZWQgZnJvbQotICAgICAqIHRoZSBzb2FwYmluZDpib2R5QG5hbWVzcGFjZSB2YWx1ZS4gU2luY2Ugbm8gYW5ub3RhdGlvbnMgb24gU0VJL2ltcGwgY2xhc3MgY2FwdHVyZXMgaXQgc28gd2UKLSAgICAgKiBuZWVkIHRvIGdldCBpdCBmcm9tIFdTREwgYW5kIHBhdGNoIGl0LiAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXRjaFJwY2xpdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlLCBXcmFwcGVyUGFyYW1ldGVyIHBhcmFtKXsKLSAgICAgICAgVHlwZVJlZmVyZW5jZSB0eXBlID0gcGFyYW0uZ2V0VHlwZVJlZmVyZW5jZSgpOwotICAgICAgICBUeXBlUmVmZXJlbmNlIG5ld1R5cGUgPSBuZXcgVHlwZVJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUobmFtZXNwYWNlLCB0eXBlLnRhZ05hbWUuZ2V0TG9jYWxQYXJ0KCkpLCB0eXBlLnR5cGUsIHR5cGUuYW5ub3RhdGlvbnMpOwotCi0gICAgICAgIHBhcmFtLnNldFR5cGVSZWZlcmVuY2UobmV3VHlwZSk7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgYmluZGluZyByZWxhdGVkIGluZm9ybWF0aW9uIHRvIHRoZSBScGNMaXRQYXlsb2FkLiBUaGUgcGF5bG9hZCBtYXAgaXMgcG9wdWxhdGVkIGNvcnJlY3RseS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogQHBhcmFtIHdyYXBwZXJQYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gd3NkbEJpbmRpbmcKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqIEByZXR1cm4KLSAgICAgKgotICAgICAqIFJldHVybnMgYXR0YWNobWVudCBwYXJhbWV0ZXJzIGlmL2FueS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8UGFyYW1ldGVyPiBhcHBseVJwY0xpdFBhcmFtQmluZGluZyhKYXZhTWV0aG9kIG1ldGhvZCwgV3JhcHBlclBhcmFtZXRlciB3cmFwcGVyUGFyYW1ldGVyLCBCaW5kaW5nIHdzZGxCaW5kaW5nLCBNb2RlIG1vZGUpIHsKLSAgICAgICAgU3RyaW5nIG9wTmFtZSA9IG1ldGhvZC5nZXRPcGVyYXRpb25OYW1lKCk7Ci0gICAgICAgIFJwY0xpdFBheWxvYWQgcGF5bG9hZCA9IG5ldyBScGNMaXRQYXlsb2FkKHdyYXBwZXJQYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBibyA9IHdzZGxCaW5kaW5nLmdldChvcE5hbWUpOwotCi0gICAgICAgIE1hcDxJbnRlZ2VyLCBQYXJhbWV0ZXI+IGJvZHlQYXJhbXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBQYXJhbWV0ZXI+KCk7Ci0gICAgICAgIExpc3Q8UGFyYW1ldGVyPiB1bmJvdW5kUGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7Ci0gICAgICAgIExpc3Q8UGFyYW1ldGVyPiBhdHRhY2hQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLSAgICAgICAgZm9yKFBhcmFtZXRlciBwYXJhbTp3cmFwcGVyUGFyYW1ldGVyLmdldFdyYXBwZXJDaGlsZHJlbigpKXsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHBhcmFtLmdldFBhcnROYW1lKCk7Ci0gICAgICAgICAgICBpZihwYXJ0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBhcmFtQmluZGluZyA9IHdzZGxCaW5kaW5nLmdldEJpbmRpbmcob3BOYW1lLAotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwgbW9kZSk7Ci0gICAgICAgICAgICBpZihwYXJhbUJpbmRpbmcgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgaWYobW9kZSA9PSBNb2RlLklOKQotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRJbkJpbmRpbmcocGFyYW1CaW5kaW5nKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmKG1vZGUgPT0gTW9kZS5PVVQpCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldE91dEJpbmRpbmcocGFyYW1CaW5kaW5nKTsKLQotICAgICAgICAgICAgICAgIGlmKHBhcmFtQmluZGluZy5pc1VuYm91bmQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kUGFyYW1zLmFkZChwYXJhbSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBhcmFtQmluZGluZy5pc0F0dGFjaG1lbnQoKSl7Ci0gICAgICAgICAgICAgICAgICAgIGF0dGFjaFBhcmFtcy5hZGQocGFyYW0pOwotICAgICAgICAgICAgICAgIH1lbHNlIGlmKHBhcmFtQmluZGluZy5pc0JvZHkoKSl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGJvICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgUGFydCBwID0gYm8uZ2V0UGFydChwYXJhbS5nZXRQYXJ0TmFtZSgpLCBtb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHAgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5UGFyYW1zLnB1dChwLmdldEluZGV4KCksIHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5UGFyYW1zLnB1dChib2R5UGFyYW1zLnNpemUoKSwgcGFyYW0pOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlQYXJhbXMucHV0KGJvZHlQYXJhbXMuc2l6ZSgpLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICB3cmFwcGVyUGFyYW1ldGVyLmNsZWFyKCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAgYm9keVBhcmFtcy5zaXplKCk7aSsrKXsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwID0gYm9keVBhcmFtcy5nZXQoaSk7Ci0gICAgICAgICAgICB3cmFwcGVyUGFyYW1ldGVyLmFkZFdyYXBwZXJDaGlsZChwKTsKLSAgICAgICAgICAgIGlmKCgobW9kZSA9PSBNb2RlLklOKSAmJiBwLmdldEluQmluZGluZygpLmlzQm9keSgpKXx8Ci0gICAgICAgICAgICAgICAgICAgICgobW9kZSA9PSBNb2RlLk9VVCkgJiYgcC5nZXRPdXRCaW5kaW5nKCkuaXNCb2R5KCkpKXsKLSAgICAgICAgICAgICAgICBKQVhCQnJpZGdlSW5mbyBiaSA9IG5ldyBKQVhCQnJpZGdlSW5mbyhnZXRCcmlkZ2UocC5nZXRUeXBlUmVmZXJlbmNlKCkpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBwYXlsb2FkLmFkZFBhcmFtZXRlcihiaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoUGFyYW1ldGVyIHAgOiBhdHRhY2hQYXJhbXMpewotICAgICAgICAgICAgSkFYQkJyaWRnZUluZm8gYmkgPSBuZXcgSkFYQkJyaWRnZUluZm8oZ2V0QnJpZGdlKHAuZ2V0VHlwZVJlZmVyZW5jZSgpKSwgbnVsbCk7Ci0gICAgICAgICAgICBwYXlsb2FkTWFwLnB1dChwLmdldE5hbWUoKSwgYmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9hZGQgdW5ib3VuZGVkIHBhcnRzCi0gICAgICAgIGZvcihQYXJhbWV0ZXIgcDp1bmJvdW5kUGFyYW1zKXsKLSAgICAgICAgICAgIHdyYXBwZXJQYXJhbWV0ZXIuYWRkV3JhcHBlckNoaWxkKHApOwotICAgICAgICB9Ci0gICAgICAgIHBheWxvYWRNYXAucHV0KHdyYXBwZXJQYXJhbWV0ZXIuZ2V0TmFtZSgpLCBwYXlsb2FkKTsKLSAgICAgICAgcmV0dXJuIGF0dGFjaFBhcmFtczsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIGptCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHV0KFFOYW1lIG5hbWUsIEphdmFNZXRob2Qgam0pIHsKLSAgICAgICAgbmFtZVRvSk0ucHV0KG5hbWUsIGptKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogQHBhcmFtIGptCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHV0KE1ldGhvZCBtZXRob2QsIEphdmFNZXRob2Qgam0pIHsKLSAgICAgICAgbWV0aG9kVG9KTS5wdXQobWV0aG9kLCBqbSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V1NETExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB3c2RsTG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZVFOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFBvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFBvcnRUeXBlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnRUeXBlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUU5hbWUoUU5hbWUgbmFtZSkgewotICAgICAgICBzZXJ2aWNlTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoUU5hbWUgbmFtZSkgewotICAgICAgICBwb3J0TmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydFR5cGVOYW1lKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgcG9ydFR5cGVOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHRoZSB0YXJnZXROYW1lc3BhY2UgZm9yIHRoZSBXU0RMIGNvbnRhaW5pbmcgdGhlIFBvcnRUeXBlCi0gICAgICogZGVmaW5pdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHRoZSB0YXJnZXROYW1lc3BhY2UgZm9yIHRoZSBXU0RMIGNvbnRhaW5pbmcgdGhlIFBvcnRUeXBlCi0gICAgICogZGVmaW5pdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIGdsb2JhbCB0eXBlLiAgR2xvYmFsIHR5cGVzIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBnbG9iYWwKLSAgICAgKiBlbGVtZW50cyBpbiB0aGUgZ2VuZXJhdGVkIHNjaGVtYSdzCi0gICAgICogQHBhcmFtIHR5cGVSZWZlcmVuY2UKLSAgICAgKi8KLS8qICAgIHB1YmxpYyB2b2lkIGFkZEdsb2JhbFR5cGUoVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKSB7Ci0KLSAgICB9Ki8KLQotICAgIC8qKgotICAgICAqIEFkZCBhIGdsb2JhbCB0eXBlLiAgR2xvYmFsIHR5cGVzIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBnbG9iYWwKLSAgICAgKiBlbGVtZW50cyBpbiB0aGUgZ2VuZXJhdGVkIHNjaGVtYSdzCi0gICAgICogQHJldHVybgotICAgICAqLwotLyogICAgcHVibGljIENvbGxlY3Rpb248VHlwZVJlZmVyZW5jZT4gZ2V0R2xvYmFsVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBnbG9iYWxUeXBlczsKLSAgICB9Ki8KLQotCi0gICAgLyoqCi0gICAgICogTXRvbSBwcm9jZXNzaW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFRvIGVuYWJsZSBpdCB0aGUgUnVudGltZU1vZGVsIGNyZWF0b3IgbXVzdCBjYWxsIGl0IHRvIGVuYWJsZSBpdC4KLSAgICAgKiBAcGFyYW0gZW5hYmxlTXRvbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuYWJsZU10b20oYm9vbGVhbiBlbmFibGVNdG9tKXsKLSAgICAgICAgdGhpcy5lbmFibGVNdG9tID0gZW5hYmxlTXRvbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPEludGVnZXIsIFJhd0FjY2Vzc29yPiBnZXRSYXdBY2Nlc3Nvck1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHJhd0FjY2Vzc29yTWFwOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZURlY29kZXJJbmZvKCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlTXRvbSA9IGZhbHNlOwotICAgIHByaXZhdGUgVGhyZWFkTG9jYWw8QnJpZGdlQ29udGV4dD4gYnJpZGdlQ29udGV4dCA9IG5ldyBUaHJlYWRMb2NhbDxCcmlkZ2VDb250ZXh0PigpOwotICAgIHByb3RlY3RlZCBKQVhCUklDb250ZXh0IGpheGJDb250ZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbjsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWU7Ci0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0VHlwZU5hbWU7Ci0gICAgcHJpdmF0ZSBNYXA8TWV0aG9kLCBKYXZhTWV0aG9kPiBtZXRob2RUb0pNID0gbmV3IEhhc2hNYXA8TWV0aG9kLCBKYXZhTWV0aG9kPigpOwotICAgIHByaXZhdGUgTWFwPFFOYW1lLCBKYXZhTWV0aG9kPiBuYW1lVG9KTSA9IG5ldyBIYXNoTWFwPFFOYW1lLCBKYXZhTWV0aG9kPigpOwotICAgIHByaXZhdGUgTGlzdDxKYXZhTWV0aG9kPiBqYXZhTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8SmF2YU1ldGhvZD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxUeXBlUmVmZXJlbmNlLCBCcmlkZ2U+IGJyaWRnZU1hcCA9IG5ldyBIYXNoTWFwPFR5cGVSZWZlcmVuY2UsIEJyaWRnZT4oKTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxRTmFtZSwgT2JqZWN0PiBwYXlsb2FkTWFwID0gbmV3IEhhc2hNYXA8UU5hbWUsIE9iamVjdD4oKTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgUU5hbWUgZW1wdHlCb2R5TmFtZSA9IG5ldyBRTmFtZSgiIik7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgUmF3QWNjZXNzb3I+IHJhd0FjY2Vzc29yTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgUmF3QWNjZXNzb3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4ga25vd25OYW1lc3BhY2VVUklzID0gbnVsbDsKLS8vICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFR5cGVSZWZlcmVuY2U+IGdsb2JhbFR5cGVzID0gbmV3IEFycmF5TGlzdDxUeXBlUmVmZXJlbmNlPigpOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvUnVudGltZU1vZGVsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL1J1bnRpbWVNb2RlbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMmI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL1J1bnRpbWVNb2RlbGVyLmphdmEKQEAgLTAsMCArMSwxMzMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5Db21wb3NpdGVTdHJ1Y3R1cmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnYyLm1vZGVsLm5hdi5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLkV4Y2VwdGlvblR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLk1FUDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQYXJ0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETEJvdW5kT3BlcmF0aW9uSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsLldTRExQb3J0SW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsLldTRExJbnB1dEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLk1vZGVsZXJNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKKworaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7CitpbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKK2ltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07CitpbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7CitpbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKK2ltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKK2ltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKK2ltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc287CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLndzLkZhdWx0QWN0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CitpbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKKy8qKgorICogQ3JlYXRlcyBhIHJ1bnRpbWUgbW9kZWwgb2YgYSBTRUkgKHBvcnRDbGFzcykuCisgKgorICogQGF1dGhvciBXUyBEZXZlbG9wZW1lbnQgVGVhbQorICovCitwdWJsaWMgY2xhc3MgUnVudGltZU1vZGVsZXIgeworICAgIHByaXZhdGUgQmluZGluZ0lEIGJpbmRpbmdJZDsKKyAgICBwcml2YXRlIENsYXNzIHBvcnRDbGFzczsKKyAgICBwcml2YXRlIEFic3RyYWN0U0VJTW9kZWxJbXBsIG1vZGVsOworICAgIHByaXZhdGUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZ0ltcGwgZGVmYXVsdEJpbmRpbmc7CisgICAgLy8gY2FuIGJlIGVtcHR5IGJ1dCBuZXZlciBudWxsCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1dyYXBwZWQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VzV2ViTWV0aG9kID0gZmFsc2U7CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgLy9wcml2YXRlIE9iamVjdCBpbXBsZW1lbnRvcjsKKyAgICBwcml2YXRlIGZpbmFsIFdTRExQb3J0SW1wbCBiaW5kaW5nOworICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWU7CisgICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZTsKKyAgICBwcml2YXRlIE1hcDxDbGFzcywgQm9vbGVhbj4gY2xhc3NVc2VzV2ViTWV0aG9kID0gbmV3IEhhc2hNYXA8Q2xhc3MsIEJvb2xlYW4+KCk7CisKKyAgICAvKioKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBEX0pBWFdTX1BBQ0tBR0VfUEQgID0gIi5qYXh3cy4iOworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfUEFDS0FHRV9QRCAgICAgPSAiamF4d3MuIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSAgICAgICAgICAgICA9ICJSZXNwb25zZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOICAgICAgICAgICAgICAgPSAicmV0dXJuIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOICAgICAgICAgICAgICAgICA9ICJCZWFuIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFICAgICAgICAgICAgICA9ICJTZXJ2aWNlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUICAgICAgICAgICAgICAgICA9ICJQb3J0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEhPTERFUl9DTEFTUyA9IEhvbGRlci5jbGFzczsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFJlbW90ZUV4Y2VwdGlvbj4gUkVNT1RFX0VYQ0VQVElPTl9DTEFTUyA9IFJlbW90ZUV4Y2VwdGlvbi5jbGFzczsKKworICAgIC8qKgorICAgICAqIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUnVuVGltZU1vZGVsZXIgZ2l2ZW4gYSA8Y29kZT5wb3J0Q2xhc3M8L2NvZGU+IGFuZCA8Y29kZT5iaW5kaW5nSWQ8L2NvZGU+CisgICAgICogQHBhcmFtIHBvcnRDbGFzcyBUaGUgU0VJIGNsYXNzIHRvIGJlIG1vZGVsZWQuCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBTZXJ2aWNlTmFtZSB0byB1c2UgaW5zdGVhZCBvZiBvbmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcworICAgICAqIEBwYXJhbSBiaW5kaW5nSWQgVGhlIGJpbmRpbmcgaWRlbnRpZmllciB0byBiZSB1c2VkIHdoZW4gbW9kZWxpbmcgdGhlIDxjb2RlPnBvcnRDbGFzczwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFJ1bnRpbWVNb2RlbGVyKEBOb3ROdWxsIENsYXNzIHBvcnRDbGFzcywgQE5vdE51bGwgUU5hbWUgc2VydmljZU5hbWUsIEBOb3ROdWxsIEJpbmRpbmdJRCBiaW5kaW5nSWQpIHsKKyAgICAgICAgdGhpcy5wb3J0Q2xhc3MgPSBwb3J0Q2xhc3M7CisgICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gbnVsbDsKKyAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBiaW5kaW5nSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJ1blRpbWVNb2RlbGVyIGdpdmVuIGEgPGNvZGU+c2VpPC9jb2RlPiBhbmQgPGNvZGU+YmluZGluZzwvY29kZT4KKyAgICAgKiBAcGFyYW0gc2VpIFRoZSBTRUkgY2xhc3MgdG8gYmUgbW9kZWxlZC4KKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIFNlcnZpY2VOYW1lIHRvIHVzZSBpbnN0ZWFkIG9mIG9uZSBjYWxjdWxhdGVkIGZyb20gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzCisgICAgICogQHBhcmFtIHdzZGxQb3J0IHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydH0KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVudGltZU1vZGVsZXIoQE5vdE51bGwgQ2xhc3Mgc2VpLCBATm90TnVsbCBRTmFtZSBzZXJ2aWNlTmFtZSwgQE5vdE51bGwgV1NETFBvcnRJbXBsIHdzZGxQb3J0KXsKKyAgICAgICAgdGhpcy5wb3J0Q2xhc3MgPSBzZWk7CisgICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSB3c2RsUG9ydC5nZXRCaW5kaW5nKCkuZ2V0QmluZGluZ0lkKCk7CisKKyAgICAgICAgLy9JZiB0aGUgYmluZGluZ0lkIGlzIG51bGwgbGV0cyBkZWZhdWx0IHRvIFNPQVAgMS4xIGJpbmRpbmcgaWQuIEFzIGl0IGxvb2tzIGxpa2UgdGhpcyBiaW5kaW5nSWQKKyAgICAgICAgLy9pcyB1c2VkIGxhdHRlciBvbiBmcm9tIG1vZGVsIHRvIGdlbmVyYXRlIGJpbmRpbmcgb24gdGhlIFdTREwuIFNvIGRlZmF1bHRpbmcgdG8gU09BUCAxLjEgbWF5YmUKKyAgICAgICAgLy8gc2FmZSB0byBkby4KKyAgICAgICAgaWYodGhpcy5iaW5kaW5nSWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYmluZGluZ0lkID0gQmluZGluZ0lELlNPQVAxMV9IVFRQOworCisgICAgICAgIHRoaXMuYmluZGluZyA9IHdzZGxQb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldHMgdGhlIGNsYXNzbG9hZGVyIHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIGNsYXNzZXMgYnkgdGhlIDxjb2RlPlJ1bnRpbWVNb2RlbGVyPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgQ2xhc3NMb2FkZXIgdXNlZCB0byBsb2FkIGNsYXNzZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgUG9ydE5hbWUgdG8gYmUgdXNlZCBieSB0aGUgPGNvZGU+UnVudGltZU1vZGVsZXI8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwb3J0TmFtZSBUaGUgUG9ydE5hbWUgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBQb3J0TmFtZQorICAgICAqIHJldHJpZXZlZCB2aWEgYW5ub3RhdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShRTmFtZSBwb3J0TmFtZSkgeworICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBUIGdldFByaXZDbGFzc0Fubm90YXRpb24oZmluYWwgQ2xhc3M8Pz4gY2xhenosIGZpbmFsIENsYXNzPFQ+IFQpIHsKKyAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFQ+KCkgeworICAgICAgICAgICBwdWJsaWMgVCBydW4oKSB7CisgICAgICAgICAgICAgICByZXR1cm4gY2xhenouZ2V0QW5ub3RhdGlvbihUKTsKKyAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IFQgZ2V0UHJpdk1ldGhvZEFubm90YXRpb24oZmluYWwgTWV0aG9kIG1ldGhvZCwgZmluYWwgQ2xhc3M8VD4gVCkgeworICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248VD4oKSB7CisgICAgICAgICAgIHB1YmxpYyBUIHJ1bigpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuZ2V0QW5ub3RhdGlvbihUKTsKKyAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uW11bXSBnZXRQcml2UGFyYW1ldGVyQW5ub3RhdGlvbnMoZmluYWwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248QW5ub3RhdGlvbltdW10+KCkgeworICAgICAgICAgICBwdWJsaWMgQW5ub3RhdGlvbltdW10gcnVuKCkgeworICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOworICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vY3VycmVudGx5IGhhcyBtYW55IGxvY2FsIHZhcnMgd2hpY2ggd2lsbCBiZSBlbGltaW5hdGVkIGFmdGVyIGRlYnVnZ2luZyBpc3N1ZXMKKyAgICAvL2ZpcnN0IGRyYWZ0CisgICAgLyoqCisgICAgICogYnVpbGRzIHRoZSBydW50aW1lIG1vZGVsIGZyb20gdGhlIDxjb2RlPnBvcnRDbGFzczwvY29kZT4gdXNpbmcgdGhlIGJpbmRpbmcgSUQgPGNvZGU+YmluZGluZ0lkPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIG1vZGVsIGZvciB0aGUgPGNvZGU+cG9ydENsYXNzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RTRUlNb2RlbEltcGwgYnVpbGRSdW50aW1lTW9kZWwoKSB7CisgICAgICAgIG1vZGVsID0gbmV3IFNPQVBTRUlNb2RlbCgpOworICAgICAgICBDbGFzcyBjbGF6eiA9IHBvcnRDbGFzczsKKyAgICAgICAgV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gZ2V0UHJpdkNsYXNzQW5ub3RhdGlvbihwb3J0Q2xhc3MsIFdlYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBpZiAod2ViU2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5uby53ZWJzZXJ2aWNlLmFubm90YXRpb24iLAorICAgICAgICAgICAgICAgIHBvcnRDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh3ZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBjbGF6eiA9IGdldENsYXNzKHdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UoKSwgTW9kZWxlck1lc3NhZ2VzLmxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX0NMQVNTX05PVF9GT1VORCh3ZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlKCkpKTsKKyAgICAgICAgICAgIFdlYlNlcnZpY2Ugc2VpU2VydmljZSA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oY2xhenosIFdlYlNlcnZpY2UuY2xhc3MpOworICAgICAgICAgICAgaWYgKHNlaVNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLmVuZHBvaW50LmludGVyZmFjZS5uby53ZWJzZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gZ2V0U2VydmljZU5hbWUocG9ydENsYXNzKTsKKyAgICAgICAgbW9kZWwuc2V0U2VydmljZVFOYW1lKHNlcnZpY2VOYW1lKTsKKworICAgICAgICBTdHJpbmcgcG9ydExvY2FsTmFtZSAgPSBwb3J0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpK1BPUlQ7CisgICAgICAgIGlmICh3ZWJTZXJ2aWNlLnBvcnROYW1lKCkubGVuZ3RoKCkgPjApIHsKKyAgICAgICAgICAgIHBvcnRMb2NhbE5hbWUgPSB3ZWJTZXJ2aWNlLnBvcnROYW1lKCk7CisgICAgICAgIH0gZWxzZSBpZiAod2ViU2VydmljZS5uYW1lKCkubGVuZ3RoKCkgPjApIHsKKyAgICAgICAgICAgIHBvcnRMb2NhbE5hbWUgPSB3ZWJTZXJ2aWNlLm5hbWUoKStQT1JUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpCisgICAgICAgICAgICBwb3J0TmFtZSA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcG9ydExvY2FsTmFtZSk7CisgICAgICAgIGlmICghcG9ydE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHNlcnZpY2VOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIucG9ydG5hbWUuc2VydmljZW5hbWUubmFtZXNwYWNlLm1pc21hdGNoIiwKKyAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOworICAgICAgICB9CisgICAgICAgIG1vZGVsLnNldFBvcnROYW1lKHBvcnROYW1lKTsKKworICAgICAgICBwcm9jZXNzQ2xhc3MoY2xhenopOworICAgICAgICBpZiAobW9kZWwuZ2V0SmF2YU1ldGhvZHMoKS5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLm5vLm9wZXJhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICBwb3J0Q2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgbW9kZWwucG9zdFByb2Nlc3MoKTsKKworICAgICAgICAvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIGZpeGVkIHByb3Blcmx5IC0tCisgICAgICAgIC8vIHdoZW4gd2UgYXJlIGJ1aWxkaW5nIFJ1bnRpbWVNb2RlbCBmaXJzdCBiZWZvcmUgYnVpbGRpbmcgV1NETE1vZGVsLAorICAgICAgICAvLyB3ZSBzdGlsbCBuZWVkIHRvIGRvIHRoaXMgY29ycmVjdHlsCisgICAgICAgIGlmKGJpbmRpbmchPW51bGwpCisgICAgICAgICAgICBtb2RlbC5mcmVlemUoYmluZGluZyk7CisKKyAgICAgICAgcmV0dXJuIG1vZGVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHV0aWxpdHkgbWV0aG9kIHRvIGxvYWQgY2xhc3NlcworICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGxvYWQKKyAgICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlCisgICAgICogICAgICBFcnJvciBtZXNzYWdlIHRvIHVzZSB3aGVuIHRoZSByZXNvbHV0aW9uIGZhaWxzLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHNwZWNpZmllZCBieSA8Y29kZT5jbGFzc05hbWU8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBnZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBMb2NhbGl6YWJsZSBlcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc05hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVzZXNXZWJNZXRob2QoQ2xhc3MgY2xhenosIEJvb2xlYW4gdXNlc1dlYk1ldGhvZCkgeworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2xhc3M6ICIrY2xhenouZ2V0TmFtZSgpKyIgdXNlcyBXZWJNZXRob2Q6ICIrdXNlc1dlYk1ldGhvZCk7CisgICAgICAgIGNsYXNzVXNlc1dlYk1ldGhvZC5wdXQoY2xhenosIHVzZXNXZWJNZXRob2QpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRldGVybWluZVdlYk1ldGhvZFVzZShDbGFzcyBjbGF6eikgeworICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHNldFVzZXNXZWJNZXRob2QoY2xhenosIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdlYk1ldGhvZCB3ZWJNZXRob2Q7CisgICAgICAgICAgICBib29sZWFuIGhhc1dlYk1ldGhvZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogY2xhenouZ2V0TWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpIT1jbGF6eikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgd2ViTWV0aG9kID0gZ2V0UHJpdk1ldGhvZEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOworICAgICAgICAgICAgICAgIGlmICh3ZWJNZXRob2QgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhd2ViTWV0aG9kLmV4Y2x1ZGUoKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNXZWJNZXRob2QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRVc2VzV2ViTWV0aG9kKGNsYXp6LCBoYXNXZWJNZXRob2QpOworICAgICAgICB9CisgICAgICAgIGRldGVybWluZVdlYk1ldGhvZFVzZShjbGF6ei5nZXRTdXBlcmNsYXNzKCkpOworICAgIH0KKworICAgIHZvaWQgcHJvY2Vzc0NsYXNzKENsYXNzIGNsYXp6KSB7CisgICAgICAgIGRldGVybWluZVdlYk1ldGhvZFVzZShjbGF6eik7CisgICAgICAgIFdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oY2xhenosIFdlYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBTdHJpbmcgcG9ydFR5cGVMb2NhbE5hbWUgID0gY2xhenouZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICBpZiAod2ViU2VydmljZS5uYW1lKCkubGVuZ3RoKCkgPjApCisgICAgICAgICAgICBwb3J0VHlwZUxvY2FsTmFtZSA9IHdlYlNlcnZpY2UubmFtZSgpOworCisKKyAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gd2ViU2VydmljZS50YXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgcGFja2FnZU5hbWUgPSAiIjsKKyAgICAgICAgaWYgKGNsYXp6LmdldFBhY2thZ2UoKSAhPSBudWxsKQorICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBjbGF6ei5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShwYWNrYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIFFOYW1lIHBvcnRUeXBlTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIHBvcnRUeXBlTG9jYWxOYW1lKTsKKyAgICAgICAgbW9kZWwuc2V0UG9ydFR5cGVOYW1lKHBvcnRUeXBlTmFtZSk7CisgICAgICAgIG1vZGVsLnNldFdTRExMb2NhdGlvbih3ZWJTZXJ2aWNlLndzZGxMb2NhdGlvbigpKTsKKworICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyBzb2FwQmluZGluZyA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oY2xhenosIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlzV3JhcHBlZCA9IHNvYXBCaW5kaW5nLnBhcmFtZXRlclN0eWxlKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQpOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHRCaW5kaW5nID0gY3JlYXRlQmluZGluZyhzb2FwQmluZGluZyk7CisgICAgICAgIC8qCisgICAgICAgICAqIGlmIGNsYXp6ICE9IHBvcnRDbGFzcyB0aGVuIHRoZXJlIGlzIGFuIFNFSS4gIElmIHRoZXJlIGlzIGFuCisgICAgICAgICAqIFNFSSwgdGhlbiBhbGwgbWV0aG9kcyBzaG91bGQgYmUgcHJvY2Vzc2VkLiAgSG93ZXZlciwgaWYgdGhlcmUgaXMKKyAgICAgICAgICogbm8gU0VJLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIHVzZXMgYXQgbGVhc3Qgb25lCisgICAgICAgICAqIFdlYk1ldGhvZCBhbm5vdGF0aW9uLCB0aGVuIG9ubHkgbWV0aG9kcyB3aXRoIHRoaXMgYW5ub3RhdGlvbgorICAgICAgICAgKiB3aWxsIGJlIHByb2Nlc3NlZC4KKyAgICAgICAgICovCisvKiAgICAgICAgaWYgKGNsYXp6ID09IHBvcnRDbGFzcykgeworICAgICAgICAgICAgV2ViTWV0aG9kIHdlYk1ldGhvZDsKKyAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGNsYXp6LmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIHdlYk1ldGhvZCA9IGdldFByaXZNZXRob2RBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIXdlYk1ldGhvZC5leGNsdWRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlc1dlYk1ldGhvZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSovCisKKyAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogY2xhenouZ2V0TWV0aG9kcygpKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk9PU9iamVjdC5jbGFzcyB8fAorICAgICAgICAgICAgICAgICFpc1dlYk1ldGhvZChtZXRob2QsIGNsYXp6KSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogYmluZGluZyBjYW4gYmUgbnVsbC4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBwb3N0LXByb2Nlc3MKKyAgICAgICAgICAgIC8vIFJ1bnRpbWVNb2RlbCB0byBsaW5rIHRvIFdTRExNb2RlbAorICAgICAgICAgICAgcHJvY2Vzc01ldGhvZChtZXRob2QsIHdlYlNlcnZpY2UpOworICAgICAgICB9CisgICAgICAgIC8vQWRkIGFkZGl0aW9uYWwgamF4YiBjbGFzc2VzIHJlZmVyZW5jZWQgYnkge0BsaW5rIFhtbFNlZUFsc299CisgICAgICAgIFhtbFNlZUFsc28geG1sU2VlQWxzbyA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oY2xhenosIFhtbFNlZUFsc28uY2xhc3MpOworICAgICAgICBpZih4bWxTZWVBbHNvICE9IG51bGwpCisgICAgICAgICAgICBtb2RlbC5zZXRBZGRpdGlvbmFsQ2xhc3Nlcyh4bWxTZWVBbHNvLnZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzV2ViTWV0aG9kKE1ldGhvZCBtZXRob2QsIENsYXNzIGNsYXp6KSB7CisgICAgICAgIGlmIChjbGF6ei5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBDbGFzcyBkZWNsQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgYm9vbGVhbiBkZWNsSGFzV2ViU2VydmljZSA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oZGVjbENsYXNzLCBXZWJTZXJ2aWNlLmNsYXNzKSAhPSBudWxsOworICAgICAgICBXZWJNZXRob2Qgd2ViTWV0aG9kID0gZ2V0UHJpdk1ldGhvZEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOworICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYgIXdlYk1ldGhvZC5leGNsdWRlKCkgJiYKKyAgICAgICAgICAgIGRlY2xIYXNXZWJTZXJ2aWNlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVjbEhhc1dlYlNlcnZpY2UgJiYKKyAgICAgICAgICAgICAgICAhY2xhc3NVc2VzV2ViTWV0aG9kLmdldChkZWNsQ2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZXMgYSBydW50aW1lIG1vZGVsIDxjb2RlPlNPQVBCaW5kaW5nPC9jb2RlPiBmcm9tIGEgPGNvZGU+amF2YXguandzLnNvYXAuU09BUEJpbmRpbmc8L2NvZGU+IG9iamVjdAorICAgICAqIEBwYXJhbSBzb2FwQmluZGluZyB0aGUgPGNvZGU+amF2YXguandzLnNvYXAuU09BUEJpbmRpbmc8L2NvZGU+IHRvIG1vZGVsCisgICAgICogQHJldHVybiByZXR1cm5zIHRoZSBydW50aW1lIG1vZGVsIFNPQVBCaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gPGNvZGU+c29hcEJpbmRpbmc8L2NvZGU+CisgICAgICovCisgICAgcHJvdGVjdGVkIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmdJbXBsIGNyZWF0ZUJpbmRpbmcoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcgc29hcEJpbmRpbmcpIHsKKyAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZ0ltcGwgcnRTT0FQQmluZGluZyA9CisgICAgICAgICAgICBuZXcgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZ0ltcGwoKTsKKyAgICAgICAgU3R5bGUgc3R5bGUgPSBzb2FwQmluZGluZyE9bnVsbCA/IHNvYXBCaW5kaW5nLnN0eWxlKCkgOiBTdHlsZS5ET0NVTUVOVDsKKyAgICAgICAgcnRTT0FQQmluZGluZy5zZXRTdHlsZShzdHlsZSk7CisgICAgICAgIGFzc2VydCBiaW5kaW5nSWQgIT0gbnVsbDsKKyAgICAgICAgU09BUFZlcnNpb24gc29hcFZlcnNpb24gPSBiaW5kaW5nSWQuZ2V0U09BUFZlcnNpb24oKTsKKyAgICAgICAgcnRTT0FQQmluZGluZy5zZXRTT0FQVmVyc2lvbihzb2FwVmVyc2lvbik7CisgICAgICAgIHJldHVybiBydFNPQVBCaW5kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldHMgdGhlIG5hbWVzcGFjZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvciBhIGdpdmVuIDxjb2RlPnBhY2thZ2VOYW1lPC9jb2RlPgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB1c2VkIHRvIGZpbmQgYSBuYW1lc3BhY2UuCisgICAgICogICAgICBjYW4gYmUgZW1wdHkuCisgICAgICogQHJldHVybiB0aGUgbmFtZXNwYWNlIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPnBhY2thZ2VOYW1lPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZShATm90TnVsbCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYWNrYWdlTmFtZSwgIi4iKTsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5zOworICAgICAgICBpZiAodG9rZW5pemVyLmNvdW50VG9rZW5zKCkgPT0gMCkgeworICAgICAgICAgICAgdG9rZW5zID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRva2VucyA9IG5ldyBTdHJpbmdbdG9rZW5pemVyLmNvdW50VG9rZW5zKCldOworICAgICAgICAgICAgZm9yIChpbnQgaT10b2tlbml6ZXIuY291bnRUb2tlbnMoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIHRva2Vuc1tpXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWlsZGVyIG5hbWVzcGFjZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCJodHRwOi8vIik7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTx0b2tlbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpIT0wKQorICAgICAgICAgICAgICAgIG5hbWVzcGFjZS5hcHBlbmQoJy4nKTsKKyAgICAgICAgICAgIG5hbWVzcGFjZS5hcHBlbmQodG9rZW5zW2ldKTsKKyAgICAgICAgfQorICAgICAgICBuYW1lc3BhY2UuYXBwZW5kKCcvJyk7CisgICAgICAgIHJldHVybiBuYW1lc3BhY2UudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIHRoZSBydW50aW1lIG1vZGVsIGZvciBhIG1ldGhvZCBvbiB0aGUgPGNvZGU+cG9ydENsYXNzPC9jb2RlPgorICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCB0byBtb2RlbAorICAgICAqIEBwYXJhbSB3ZWJTZXJ2aWNlIHRoZSBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+V2ViU2VydmljZTwvY29kZT4gYW5ub3RhdGlvbiBvbiB0aGUgPGNvZGU+cG9ydENsYXNzPC9jb2RlPgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNZXRob2QoTWV0aG9kIG1ldGhvZCwgV2ViU2VydmljZSB3ZWJTZXJ2aWNlKSB7CisgICAgICAgIGludCBtb2RzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOworICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKG1vZHMpIHx8IE1vZGlmaWVyLmlzU3RhdGljKG1vZHMpKSB7CisgICAgICAgICAgICBpZihtZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MpIT1udWxsKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZXIgcHV0IEBXZWJNZXRob2Qgb24gdGhlc2Ugbm9uLXF1YWxpZnlpbmcgbWV0aG9kLAorICAgICAgICAgICAgICAgIC8vIGl0J3MgYW4gZXJyb3IKKyAgICAgICAgICAgICAgICBpZihNb2RpZmllci5pc1N0YXRpYyhtb2RzKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKE1vZGVsZXJNZXNzYWdlcy5sb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9XRUJNRVRIT0RfTVVTVF9CRV9OT05TVEFUSUMobWV0aG9kKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oTW9kZWxlck1lc3NhZ2VzLmxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX1dFQk1FVEhPRF9NVVNUX0JFX1BVQkxJQyhtZXRob2QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFdlYk1ldGhvZCB3ZWJNZXRob2QgPSBnZXRQcml2TWV0aG9kQW5ub3RhdGlvbihtZXRob2QsIFdlYk1ldGhvZC5jbGFzcyk7CisgICAgICAgIGlmICh3ZWJNZXRob2QgIT0gbnVsbCAmJiB3ZWJNZXRob2QuZXhjbHVkZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElmIG9uZSBXZWJNZXRob2QgaXMgdXNlZCwgdGhlbiBvbmx5IG1ldGhvZHMgd2l0aCBXZWJNZXRob2Qgd2lsbCBiZQorICAgICAgICAvLyBwcm9jZXNzZWQuCisgICAgICAgIGlmICh1c2VzV2ViTWV0aG9kICYmIHdlYk1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBKYXZhTWV0aG9kSW1wbCBqYXZhTWV0aG9kOworICAgICAgICAvL0NsYXNzIGltcGxlbWVudG9yQ2xhc3MgPSBwb3J0Q2xhc3M7CisgICAgICAgIGlmIChtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKT09cG9ydENsYXNzKSB7CisgICAgICAgICAgICBqYXZhTWV0aG9kID0gbmV3IEphdmFNZXRob2RJbXBsKG1vZGVsLG1ldGhvZCxtZXRob2QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNZXRob2QgdG1wTWV0aG9kID0gcG9ydENsYXNzLmdldE1ldGhvZChtZXRob2QuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7CisgICAgICAgICAgICAgICAgamF2YU1ldGhvZCA9IG5ldyBKYXZhTWV0aG9kSW1wbChtb2RlbCx0bXBNZXRob2QsbWV0aG9kKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIubWV0aG9kLm5vdC5mb3VuZCIsCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCksIHBvcnRDbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworCisgICAgICAgIC8vc2V0IE1FUCAtb25ld2F5LCBhc3luYywgcmVxL3Jlc3AKKyAgICAgICAgTUVQIG1lcCA9IGdldE1FUChtZXRob2QpOworICAgICAgICBqYXZhTWV0aG9kLnNldE1FUChtZXApOworCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOworCisKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgKSB7CisgICAgICAgICAgICBhY3Rpb24gPSB3ZWJNZXRob2QuYWN0aW9uKCk7CisgICAgICAgICAgICBvcGVyYXRpb25OYW1lID0gd2ViTWV0aG9kLm9wZXJhdGlvbk5hbWUoKS5sZW5ndGgoKSA+IDAgPworICAgICAgICAgICAgICAgIHdlYk1ldGhvZC5vcGVyYXRpb25OYW1lKCkgOgorICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvL292ZXJyaWRlIHRoZSBAV2ViTWV0aG9kLmFjdGlvbiB2YWx1ZSBieSB0aGUgb25lIGZyb20gdGhlIFdTREwKKyAgICAgICAgaWYoYmluZGluZyAhPSBudWxsKXsKKyAgICAgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbkltcGwgYm8gPSBiaW5kaW5nLmdldEJpbmRpbmcoKS5nZXQobmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgb3BlcmF0aW9uTmFtZSkpOworICAgICAgICAgICAgaWYoYm8gIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgV1NETElucHV0SW1wbCB3c2RsSW5wdXQgPSBiby5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB3c2FBY3Rpb24gPSB3c2RsSW5wdXQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYod3NhQWN0aW9uICE9IG51bGwgJiYgIXdzZGxJbnB1dC5pc0RlZmF1bHRBY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gd3NhQWN0aW9uOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gYm8uZ2V0U09BUEFjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgamF2YU1ldGhvZC5zZXRPcGVyYXRpb25OYW1lKG9wZXJhdGlvbk5hbWUpOworICAgICAgICBTT0FQQmluZGluZyBtZXRob2RCaW5kaW5nID0KKyAgICAgICAgICAgIG1ldGhvZC5nZXRBbm5vdGF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgaWYgKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCAmJiAhbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZXF1YWxzKHBvcnRDbGFzcykpIHsKKyAgICAgICAgICAgIGlmICghbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgIG1ldGhvZEJpbmRpbmcgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRBbm5vdGF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBib29sZWFuIG1ldGhvZElzV3JhcHBlZCA9IGlzV3JhcHBlZDsKKyAgICAgICAgU3R5bGUgc3R5bGUgPSBkZWZhdWx0QmluZGluZy5nZXRTdHlsZSgpOworICAgICAgICBpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwLlNPQVBCaW5kaW5nSW1wbCBteVNPQVBCaW5kaW5nID0gY3JlYXRlQmluZGluZyhtZXRob2RCaW5kaW5nKTsKKyAgICAgICAgICAgIHN0eWxlID0gbXlTT0FQQmluZGluZy5nZXRTdHlsZSgpOworICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIG15U09BUEJpbmRpbmcuc2V0U09BUEFjdGlvbihhY3Rpb24pOworICAgICAgICAgICAgbWV0aG9kSXNXcmFwcGVkID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJTdHlsZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKKyAgICAgICAgICAgIGphdmFNZXRob2Quc2V0QmluZGluZyhteVNPQVBCaW5kaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmdJbXBsIHNiID0gbmV3IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmdJbXBsKGRlZmF1bHRCaW5kaW5nKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzYi5zZXRTT0FQQWN0aW9uKGFjdGlvbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2Iuc2V0U09BUEFjdGlvbigiIik7CisgICAgICAgICAgICBqYXZhTWV0aG9kLnNldEJpbmRpbmcoc2IpOworICAgICAgICB9CisgICAgICAgIGlmICghbWV0aG9kSXNXcmFwcGVkKSB7CisgICAgICAgICAgICBwcm9jZXNzRG9jQmFyZU1ldGhvZChqYXZhTWV0aG9kLCBtZXRob2ROYW1lLCB3ZWJNZXRob2QsIG9wZXJhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgbWV0aG9kLCB3ZWJTZXJ2aWNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHlsZS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQpKSB7CisgICAgICAgICAgICBwcm9jZXNzRG9jV3JhcHBlZE1ldGhvZChqYXZhTWV0aG9kLCBtZXRob2ROYW1lLCB3ZWJNZXRob2QsIG9wZXJhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgbWV0aG9kLCB3ZWJTZXJ2aWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2Nlc3NScGNNZXRob2QoamF2YU1ldGhvZCwgbWV0aG9kTmFtZSwgd2ViTWV0aG9kLCBvcGVyYXRpb25OYW1lLAorICAgICAgICAgICAgICAgIG1ldGhvZCwgd2ViU2VydmljZSk7CisgICAgICAgIH0KKyAgICAgICAgbW9kZWwuYWRkSmF2YU1ldGhvZChqYXZhTWV0aG9kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1FUCBnZXRNRVAoTWV0aG9kIG0peworICAgICAgICBpZiAobS5pc0Fubm90YXRpb25QcmVzZW50KE9uZXdheS5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBNRVAuT05FX1dBWTsKKyAgICAgICAgfQorICAgICAgICBpZihSZXNwb25zZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG0uZ2V0UmV0dXJuVHlwZSgpKSl7CisgICAgICAgICAgICByZXR1cm4gTUVQLkFTWU5DX1BPTEw7CisgICAgICAgIH1lbHNlIGlmKEZ1dHVyZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG0uZ2V0UmV0dXJuVHlwZSgpKSl7CisgICAgICAgICAgICByZXR1cm4gTUVQLkFTWU5DX0NBTExCQUNLOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNRVAuUkVRVUVTVF9SRVNQT05TRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2RlbHMgYSBkb2N1bWVudC9saXRlcmFsIHdyYXBwZWQgbWV0aG9kCisgICAgICogQHBhcmFtIGphdmFNZXRob2QgdGhlIHJ1bnRpbWUgbW9kZWwgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gd2ViTWV0aG9kIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZSB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgPGNvZGU+bWV0aG9kPC9jb2RlPiB0byBtb2RlbAorICAgICAqIEBwYXJhbSB3ZWJTZXJ2aWNlIFRoZSA8Y29kZT5XZWJTZXJ2aWNlPC9jb2RlPiBhbm5vdGF0aW9uIGluc3RhbmNlIG9uIHRoZSA8Y29kZT5wb3J0Q2xhc3M8L2NvZGU+CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RvY1dyYXBwZWRNZXRob2QoSmF2YU1ldGhvZEltcGwgamF2YU1ldGhvZCwgU3RyaW5nIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViTWV0aG9kIHdlYk1ldGhvZCwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIE1ldGhvZCBtZXRob2QsIFdlYlNlcnZpY2Ugd2ViU2VydmljZSkgeworICAgICAgICBib29sZWFuIGlzT25ld2F5ID0gbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoT25ld2F5LmNsYXNzKTsKKyAgICAgICAgUmVxdWVzdFdyYXBwZXIgcmVxV3JhcHBlciA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKFJlcXVlc3RXcmFwcGVyLmNsYXNzKTsKKyAgICAgICAgUmVzcG9uc2VXcmFwcGVyIHJlc1dyYXBwZXIgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihSZXNwb25zZVdyYXBwZXIuY2xhc3MpOworICAgICAgICBTdHJpbmcgYmVhblBhY2thZ2UgPSBwYWNrYWdlTmFtZSArIFBEX0pBWFdTX1BBQ0tBR0VfUEQ7CisgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApKQorICAgICAgICAgICAgYmVhblBhY2thZ2UgPSBKQVhXU19QQUNLQUdFX1BEOworICAgICAgICBTdHJpbmcgcmVxdWVzdENsYXNzTmFtZTsKKyAgICAgICAgaWYocmVxV3JhcHBlciAhPSBudWxsICYmIHJlcVdyYXBwZXIuY2xhc3NOYW1lKCkubGVuZ3RoKCk+MCl7CisgICAgICAgICAgICByZXF1ZXN0Q2xhc3NOYW1lID0gcmVxV3JhcHBlci5jbGFzc05hbWUoKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICByZXF1ZXN0Q2xhc3NOYW1lID0gYmVhblBhY2thZ2UgKyBjYXBpdGFsaXplKG1ldGhvZC5nZXROYW1lKCkpOworICAgICAgICB9CisKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2VDbGFzc05hbWU7CisgICAgICAgIGlmKHJlc1dyYXBwZXIgIT0gbnVsbCAmJiByZXNXcmFwcGVyLmNsYXNzTmFtZSgpLmxlbmd0aCgpPjApeworICAgICAgICAgICAgcmVzcG9uc2VDbGFzc05hbWUgPSByZXNXcmFwcGVyLmNsYXNzTmFtZSgpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHJlc3BvbnNlQ2xhc3NOYW1lID0gYmVhblBhY2thZ2UgKyBjYXBpdGFsaXplKG1ldGhvZC5nZXROYW1lKCkpICsgUkVTUE9OU0U7CisgICAgICAgIH0KKworICAgICAgICBDbGFzcyByZXF1ZXN0Q2xhc3MgPSBnZXRDbGFzcyhyZXF1ZXN0Q2xhc3NOYW1lLCBNb2RlbGVyTWVzc2FnZXMubG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfV1JBUFBFUl9OT1RfRk9VTkQocmVxdWVzdENsYXNzTmFtZSkpOworCisgICAgICAgIFN0cmluZyByZXFOYW1lID0gb3BlcmF0aW9uTmFtZTsKKyAgICAgICAgU3RyaW5nIHJlcU5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgaWYgKHJlcVdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlcVdyYXBwZXIudGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgIHJlcU5hbWVzcGFjZSA9IHJlcVdyYXBwZXIudGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgICAgICBpZiAocmVxV3JhcHBlci5sb2NhbE5hbWUoKS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgcmVxTmFtZSA9IHJlcVdyYXBwZXIubG9jYWxOYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgUU5hbWUgcmVxRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUocmVxTmFtZXNwYWNlLCByZXFOYW1lKTsKKworICAgICAgICBDbGFzcyByZXNwb25zZUNsYXNzID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHJlc05hbWUgPSBvcGVyYXRpb25OYW1lKyJSZXNwb25zZSI7CisgICAgICAgIFN0cmluZyByZXNOYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7CisgICAgICAgIGlmICghaXNPbmV3YXkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ2xhc3MgPSBnZXRDbGFzcyhyZXNwb25zZUNsYXNzTmFtZSwgTW9kZWxlck1lc3NhZ2VzLmxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX1dSQVBQRVJfTk9UX0ZPVU5EKHJlc3BvbnNlQ2xhc3NOYW1lKSk7CisgICAgICAgICAgICBpZiAocmVzV3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc1dyYXBwZXIudGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXNOYW1lc3BhY2UgPSByZXNXcmFwcGVyLnRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgIGlmIChyZXNXcmFwcGVyLmxvY2FsTmFtZSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzTmFtZSA9IHJlc1dyYXBwZXIubG9jYWxOYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUU5hbWUgcmVzRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUocmVzTmFtZXNwYWNlLCByZXNOYW1lKTsKKworICAgICAgICBUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPQorICAgICAgICAgICAgICAgIG5ldyBUeXBlUmVmZXJlbmNlKHJlcUVsZW1lbnROYW1lLCByZXF1ZXN0Q2xhc3MpOworICAgICAgICBXcmFwcGVyUGFyYW1ldGVyIHJlcXVlc3RXcmFwcGVyID0gbmV3IFdyYXBwZXJQYXJhbWV0ZXIoamF2YU1ldGhvZCwgdHlwZVJlZiwKKyAgICAgICAgICAgIE1vZGUuSU4sIDApOworICAgICAgICByZXF1ZXN0V3JhcHBlci5zZXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuQk9EWSk7CisgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJlcXVlc3RXcmFwcGVyKTsKKyAgICAgICAgV3JhcHBlclBhcmFtZXRlciByZXNwb25zZVdyYXBwZXIgPSBudWxsOworICAgICAgICBpZiAoIWlzT25ld2F5KSB7CisgICAgICAgICAgICB0eXBlUmVmID0gbmV3IFR5cGVSZWZlcmVuY2UocmVzRWxlbWVudE5hbWUsIHJlc3BvbnNlQ2xhc3MpOworICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXJQYXJhbWV0ZXIoamF2YU1ldGhvZCwgdHlwZVJlZiwgTW9kZS5PVVQsIC0xKTsKKyAgICAgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJlc3BvbnNlV3JhcHBlcik7CisgICAgICAgICAgICByZXNwb25zZVdyYXBwZXIuc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkJPRFkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmV0dXJuIHZhbHVlCisgICAgICAgIFN0cmluZyByZXN1bHROYW1lID0gUkVUVVJOOworICAgICAgICBTdHJpbmcgcmVzdWx0VE5TID0gIiI7CisgICAgICAgIFFOYW1lIHJlc3VsdFFOYW1lID0gbnVsbDsKKyAgICAgICAgV2ViUmVzdWx0IHdlYlJlc3VsdCA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKFdlYlJlc3VsdC5jbGFzcyk7CisgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOworICAgICAgICBib29sZWFuIGlzUmVzdWx0SGVhZGVyID0gZmFsc2U7CisgICAgICAgIGlmICh3ZWJSZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHdlYlJlc3VsdC5uYW1lKCkubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgIHJlc3VsdE5hbWUgPSB3ZWJSZXN1bHQubmFtZSgpOworICAgICAgICAgICAgcmVzdWx0VE5TID0gd2ViUmVzdWx0LnRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgaXNSZXN1bHRIZWFkZXIgPSB3ZWJSZXN1bHQuaGVhZGVyKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0VE5TLmxlbmd0aCgpID09IDAgJiYgd2ViUmVzdWx0LmhlYWRlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gaGVhZGVycyBtdXN0IGhhdmUgYSBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICByZXN1bHRUTlMgPSB0YXJnZXROYW1lc3BhY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHRRTmFtZSA9IG5ldyBRTmFtZShyZXN1bHRUTlMsIHJlc3VsdE5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKCFpc09uZXdheSAmJiAhcmV0dXJuVHlwZS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikgJiYgIWphdmFNZXRob2QuaXNBc3luYygpKSB7CisgICAgICAgICAgICBpZihyZXN1bHRRTmFtZSA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICByZXN1bHRRTmFtZSA9IG5ldyBRTmFtZShyZXN1bHRUTlMsIFJFVFVSTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihqYXZhTWV0aG9kLmlzQXN5bmMoKSl7CisgICAgICAgICAgICByZXR1cm5UeXBlID0gZ2V0QXN5bmNSZXR1cm5UeXBlKG1ldGhvZCwgcmV0dXJuVHlwZSk7CisgICAgICAgICAgICByZXN1bHRRTmFtZSA9IG5ldyBRTmFtZShSRVRVUk4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc09uZXdheSAmJiAocmV0dXJuVHlwZSAhPSBudWxsKSAmJiAoIXJldHVyblR5cGUuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKSkgeworICAgICAgICAgICAgQW5ub3RhdGlvbltdIHJhbm4gPSBtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRRTmFtZS5nZXRMb2NhbFBhcnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVHlwZVJlZmVyZW5jZSByVHlwZVJlZmVyZW5jZSA9IG5ldyBUeXBlUmVmZXJlbmNlKHJlc3VsdFFOYW1lLCByZXR1cm5UeXBlLCByYW5uKTsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHJldHVyblBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXJJbXBsKGphdmFNZXRob2QsIHJUeXBlUmVmZXJlbmNlLCBNb2RlLk9VVCwgLTEpOworICAgICAgICAgICAgICAgIGlmIChpc1Jlc3VsdEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXIuc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkhFQURFUik7CisgICAgICAgICAgICAgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJldHVyblBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuUGFyYW1ldGVyLnNldEJpbmRpbmcoUGFyYW1ldGVyQmluZGluZy5CT0RZKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyLmFkZFdyYXBwZXJDaGlsZChyZXR1cm5QYXJhbWV0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vZ2V0IFdlYlBhcmFtCisgICAgICAgIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgVHlwZVtdIGdlbmVyaWNQYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgQW5ub3RhdGlvbltdW10gcGFubm90YXRpb25zID0gZ2V0UHJpdlBhcmFtZXRlckFubm90YXRpb25zKG1ldGhvZCk7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBmb3IgKENsYXNzIGNsYXp6VHlwZSA6IHBhcmFtZXRlclR5cGVzKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWU9bnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSAiYXJnIitwb3M7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lc3BhY2UgPSAiIjsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNIZWFkZXIgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYoamF2YU1ldGhvZC5pc0FzeW5jKCkgJiYgQXN5bmNIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenpUeXBlKSl7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gaXNIb2xkZXIgPSBIT0xERVJfQ0xBU1MuaXNBc3NpZ25hYmxlRnJvbShjbGF6elR5cGUpOworICAgICAgICAgICAgLy9zZXQgdGhlIGFjdHVhbCB0eXBlIGFyZ3VtZW50IG9mIEhvbGRlciBpbiB0aGUgVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgaWYgKGlzSG9sZGVyKSB7CisgICAgICAgICAgICAgICAgaWYoY2xhenpUeXBlPT1Ib2xkZXIuY2xhc3MpeworICAgICAgICAgICAgICAgICAgICBjbGF6elR5cGUgPSBOYXZpZ2F0b3IuUkVGTEVDVElPTi5lcmFzdXJlKCgoUGFyYW1ldGVyaXplZFR5cGUpZ2VuZXJpY1BhcmFtZXRlclR5cGVzW3Bvc10pLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTW9kZSBwYXJhbU1vZGUgPSBpc0hvbGRlciA/IE1vZGUuSU5PVVQgOiBNb2RlLklOOworICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBwYW5ub3RhdGlvbnNbcG9zXSkgeworICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkgPT0gV2ViUGFyYW0uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgV2ViUGFyYW0gd2ViUGFyYW0gPSAoV2ViUGFyYW0pIGFubm90YXRpb247CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbS5uYW1lKCkubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gd2ViUGFyYW0ubmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpc0hlYWRlciA9IHdlYlBhcmFtLmhlYWRlcigpOworICAgICAgICAgICAgICAgICAgICBpZih3ZWJQYXJhbS5wYXJ0TmFtZSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0gd2ViUGFyYW0ucGFydE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSBwYXJhbU5hbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0hlYWRlcikgLy8gaGVhZGVycyBjYW5ub3QgYmUgaW4gZW1wdHkgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3ZWJQYXJhbS50YXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzcGFjZSA9IHdlYlBhcmFtLnRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhcmFtTW9kZSA9IHdlYlBhcmFtLm1vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzSG9sZGVyICYmIHBhcmFtTW9kZSA9PSBNb2RlLklOKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1Nb2RlID0gTW9kZS5JTk9VVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSA9IG5ldyBRTmFtZShwYXJhbU5hbWVzcGFjZSwgcGFyYW1OYW1lKTsKKyAgICAgICAgICAgIHR5cGVSZWYgPQorICAgICAgICAgICAgICAgIG5ldyBUeXBlUmVmZXJlbmNlKHBhcmFtUU5hbWUsIGNsYXp6VHlwZSwgcGFubm90YXRpb25zW3Bvc10pOworICAgICAgICAgICAgUGFyYW1ldGVySW1wbCBwYXJhbSA9IG5ldyBQYXJhbWV0ZXJJbXBsKGphdmFNZXRob2QsIHR5cGVSZWYsIHBhcmFtTW9kZSwgcG9zKyspOworCisgICAgICAgICAgICBpZiAoaXNIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5zZXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuSEVBREVSKTsKKyAgICAgICAgICAgICAgICBqYXZhTWV0aG9kLmFkZFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgICAgICAgICAgcGFyYW0uc2V0UGFydE5hbWUocGFydE5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5zZXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuQk9EWSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtTW9kZSE9TW9kZS5PVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXIuYWRkV3JhcHBlckNoaWxkKHBhcmFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtTW9kZSE9TW9kZS5JTikgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNPbmV3YXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLm9uZXdheS5vcGVyYXRpb24ubm8ub3V0LnBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIG1ldGhvZE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlci5hZGRXcmFwcGVyQ2hpbGQocGFyYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzRXhjZXB0aW9ucyhqYXZhTWV0aG9kLCBtZXRob2QpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogbW9kZWxzIGEgcnBjL2xpdGVyYWwgbWV0aG9kCisgICAgICogQHBhcmFtIGphdmFNZXRob2QgdGhlIHJ1bnRpbWUgbW9kZWwgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5tZXRob2Q8L2NvZGU+IGJlaW5nIG1vZGVsZWQuCisgICAgICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgPGNvZGU+V2ViTWV0aG9kPC9jb2RlPiBhbm5vdGF0aW9ucyBpbnN0YW5jZSBvbiB0aGUgPGNvZGU+bWV0aG9kPC9jb2RlPgorICAgICAqIEBwYXJhbSBvcGVyYXRpb25OYW1lIHRoZSBXU0RMIG9wZXJhdGlvbiBuYW1lIGZvciB0aGlzIDxjb2RlPm1ldGhvZDwvY29kZT4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gd2ViU2VydmljZSB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JwY01ldGhvZChKYXZhTWV0aG9kSW1wbCBqYXZhTWV0aG9kLCBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYk1ldGhvZCB3ZWJNZXRob2QsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBNZXRob2QgbWV0aG9kLCBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UpIHsKKyAgICAgICAgYm9vbGVhbiBpc09uZXdheSA9IG1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KE9uZXdheS5jbGFzcyk7CisKKyAgICAgICAgLy8gdXNlIE1hcCB0byBidWlsZCBwYXJhbWV0ZXJzIGluIHRoZSBwYXJ0IG9yZGVyIHdoZW4gdGhleSBhcmUga25vd24uCisgICAgICAgIC8vIGlmIHBhcnQgaXMgdW5ib3VuZCwgd2UganVzdCBwdXQgdGhlbSBhdCB0aGUgZW5kLCBhbmQgZm9yIHRoYXQgd2UKKyAgICAgICAgLy8gdXNlIGEgbGFyZ2UgaW5kZXggKDEwMDAwKykgdG8gYXZvaWQgY29sbGlkaW5nIHdpdGggb3JkZXJlZCBvbmVzLgorICAgICAgICAvLyB0aGlzIGFzc3VtZXMgdGhhdCB0aGVyZSdzIG5vIG9wZXJhdGlvbiB3aXRoICMgb2YgcGFyYW1ldGVycyA+IDEwMDAwLAorICAgICAgICAvLyBidXQgSSB0aGluayBpdCdzIGEgcHJldHR5IHNhZmUgYXNzdW1wdGlvbiAtIEtLLgorICAgICAgICBNYXA8SW50ZWdlciwgUGFyYW1ldGVySW1wbD4gcmVzUnBjUGFyYW1zID0gbmV3IFRyZWVNYXA8SW50ZWdlciwgUGFyYW1ldGVySW1wbD4oKTsKKyAgICAgICAgTWFwPEludGVnZXIsIFBhcmFtZXRlckltcGw+IHJlcVJwY1BhcmFtcyA9IG5ldyBUcmVlTWFwPEludGVnZXIsIFBhcmFtZXRlckltcGw+KCk7CisKKyAgICAgICAgLy9MZXRzIHRha2UgdGhlIHNlcnZpY2UgbmFtZXNwYWNlIGFuZCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgb25lIHdlIGdldCBpdCBmcm9tIHdzZGwKKyAgICAgICAgU3RyaW5nIHJlcU5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgU3RyaW5nIHJlc3BOYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7CisKKyAgICAgICAgaWYoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuZ2V0QmluZGluZygpLmlzUnBjTGl0KCkpeworICAgICAgICAgICAgUU5hbWUgb3BRTmFtZSA9IG5ldyBRTmFtZShiaW5kaW5nLmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgb3BlcmF0aW9uTmFtZSk7CisgICAgICAgICAgICBXU0RMQm91bmRPcGVyYXRpb25JbXBsIG9wID0gYmluZGluZy5nZXRCaW5kaW5nKCkuZ2V0KG9wUU5hbWUpOworICAgICAgICAgICAgaWYob3AgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgLy9pdCBjYW50IGJlIG51bGwsIGJ1dCBsZXRzIG5vdCBmYWlsIGFuZCB0cnkgdG8gd29yayB3aXRoIHNlcnZpY2UgbmFtZXNwY2UKKyAgICAgICAgICAgICAgICBpZihvcC5nZXRSZXF1ZXN0TmFtZXNwYWNlKCkgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIHJlcU5hbWVzcGFjZSA9IG9wLmdldFJlcXVlc3ROYW1lc3BhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL2l0IGNhbnQgYmUgbnVsbCwgYnV0IGxldHMgbm90IGZhaWwgYW5kIHRyeSB0byB3b3JrIHdpdGggc2VydmljZSBuYW1lc3BjZQorICAgICAgICAgICAgICAgIGlmKG9wLmdldFJlc3BvbnNlTmFtZXNwYWNlKCkgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIHJlc3BOYW1lc3BhY2UgPSBvcC5nZXRSZXNwb25zZU5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFFOYW1lIHJlcUVsZW1lbnROYW1lID0gbmV3IFFOYW1lKHJlcU5hbWVzcGFjZSwgb3BlcmF0aW9uTmFtZSk7CisgICAgICAgIFFOYW1lIHJlc0VsZW1lbnROYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKCFpc09uZXdheSkgeworICAgICAgICAgICAgcmVzRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUocmVzcE5hbWVzcGFjZSwgb3BlcmF0aW9uTmFtZStSRVNQT05TRSk7CisgICAgICAgIH0KKworICAgICAgICBDbGFzcyB3cmFwcGVyVHlwZSA9IENvbXBvc2l0ZVN0cnVjdHVyZS5jbGFzczsKKyAgICAgICAgVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gbmV3IFR5cGVSZWZlcmVuY2UocmVxRWxlbWVudE5hbWUsIHdyYXBwZXJUeXBlKTsKKyAgICAgICAgV3JhcHBlclBhcmFtZXRlciByZXF1ZXN0V3JhcHBlciA9IG5ldyBXcmFwcGVyUGFyYW1ldGVyKGphdmFNZXRob2QsIHR5cGVSZWYsIE1vZGUuSU4sIDApOworICAgICAgICByZXF1ZXN0V3JhcHBlci5zZXRJbkJpbmRpbmcoUGFyYW1ldGVyQmluZGluZy5CT0RZKTsKKyAgICAgICAgamF2YU1ldGhvZC5hZGRQYXJhbWV0ZXIocmVxdWVzdFdyYXBwZXIpOworICAgICAgICBXcmFwcGVyUGFyYW1ldGVyIHJlc3BvbnNlV3JhcHBlciA9IG51bGw7CisgICAgICAgIGlmICghaXNPbmV3YXkpIHsKKyAgICAgICAgICAgIHR5cGVSZWYgPSBuZXcgVHlwZVJlZmVyZW5jZShyZXNFbGVtZW50TmFtZSwgd3JhcHBlclR5cGUpOworICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXJQYXJhbWV0ZXIoamF2YU1ldGhvZCwgdHlwZVJlZiwgTW9kZS5PVVQsIC0xKTsKKyAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlci5zZXRPdXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuQk9EWSk7CisgICAgICAgICAgICBqYXZhTWV0aG9kLmFkZFBhcmFtZXRlcihyZXNwb25zZVdyYXBwZXIpOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgIFN0cmluZyByZXN1bHROYW1lID0gUkVUVVJOOworICAgICAgICBTdHJpbmcgcmVzdWx0VE5TID0gdGFyZ2V0TmFtZXNwYWNlOworICAgICAgICBTdHJpbmcgcmVzdWx0UGFydE5hbWUgPSByZXN1bHROYW1lOworICAgICAgICBib29sZWFuIGlzUmVzdWx0SGVhZGVyID0gZmFsc2U7CisgICAgICAgIFdlYlJlc3VsdCB3ZWJSZXN1bHQgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJSZXN1bHQuY2xhc3MpOworCisgICAgICAgIGlmICh3ZWJSZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgaXNSZXN1bHRIZWFkZXIgPSB3ZWJSZXN1bHQuaGVhZGVyKCk7CisgICAgICAgICAgICBpZiAod2ViUmVzdWx0Lm5hbWUoKS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgcmVzdWx0TmFtZSA9IHdlYlJlc3VsdC5uYW1lKCk7CisgICAgICAgICAgICBpZiAod2ViUmVzdWx0LnBhcnROYW1lKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0UGFydE5hbWUgPSB3ZWJSZXN1bHQucGFydE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzUmVzdWx0SGVhZGVyKQorICAgICAgICAgICAgICAgICAgICByZXN1bHROYW1lID0gcmVzdWx0UGFydE5hbWU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHRQYXJ0TmFtZSA9IHJlc3VsdE5hbWU7CisgICAgICAgICAgICBpZiAod2ViUmVzdWx0LnRhcmdldE5hbWVzcGFjZSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICByZXN1bHRUTlMgPSB3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgICAgICBpc1Jlc3VsdEhlYWRlciA9IHdlYlJlc3VsdC5oZWFkZXIoKTsKKyAgICAgICAgfQorICAgICAgICBRTmFtZSByZXN1bHRRTmFtZTsKKyAgICAgICAgaWYgKGlzUmVzdWx0SGVhZGVyKQorICAgICAgICAgICAgcmVzdWx0UU5hbWUgPSBuZXcgUU5hbWUocmVzdWx0VE5TLCByZXN1bHROYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0UU5hbWUgPSBuZXcgUU5hbWUocmVzdWx0TmFtZSk7CisKKyAgICAgICAgaWYoamF2YU1ldGhvZC5pc0FzeW5jKCkpeworICAgICAgICAgICAgcmV0dXJuVHlwZSA9IGdldEFzeW5jUmV0dXJuVHlwZShtZXRob2QsIHJldHVyblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc09uZXdheSAmJiByZXR1cm5UeXBlIT1udWxsICYmIHJldHVyblR5cGUhPXZvaWQuY2xhc3MpIHsKKyAgICAgICAgICAgIEFubm90YXRpb25bXSByYW5uID0gbWV0aG9kLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICBUeXBlUmVmZXJlbmNlIHJUeXBlUmVmZXJlbmNlID0gbmV3IFR5cGVSZWZlcmVuY2UocmVzdWx0UU5hbWUsIHJldHVyblR5cGUsIHJhbm4pOworICAgICAgICAgICAgUGFyYW1ldGVySW1wbCByZXR1cm5QYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVySW1wbChqYXZhTWV0aG9kLCByVHlwZVJlZmVyZW5jZSwgTW9kZS5PVVQsIC0xKTsKKyAgICAgICAgICAgIHJldHVyblBhcmFtZXRlci5zZXRQYXJ0TmFtZShyZXN1bHRQYXJ0TmFtZSk7CisgICAgICAgICAgICBpZihpc1Jlc3VsdEhlYWRlcil7CisgICAgICAgICAgICAgICAgcmV0dXJuUGFyYW1ldGVyLnNldEJpbmRpbmcoUGFyYW1ldGVyQmluZGluZy5IRUFERVIpOworICAgICAgICAgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJldHVyblBhcmFtZXRlcik7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHJiID0gZ2V0QmluZGluZyhvcGVyYXRpb25OYW1lLCByZXN1bHRQYXJ0TmFtZSwgZmFsc2UsIE1vZGUuT1VUKTsKKyAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXIuc2V0QmluZGluZyhyYik7CisgICAgICAgICAgICAgICAgaWYocmIuaXNCb2R5KCkpeworICAgICAgICAgICAgICAgICAgICBXU0RMUGFydCBwID0gZ2V0UGFydChuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLG9wZXJhdGlvbk5hbWUpLCByZXN1bHRQYXJ0TmFtZSwgTW9kZS5PVVQpOworICAgICAgICAgICAgICAgICAgICBpZihwID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXNScGNQYXJhbXMucHV0KHJlc1JwY1BhcmFtcy5zaXplKCkrMTAwMDAsIHJldHVyblBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JwY1BhcmFtcy5wdXQocC5nZXRJbmRleCgpLCByZXR1cm5QYXJhbWV0ZXIpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBqYXZhTWV0aG9kLmFkZFBhcmFtZXRlcihyZXR1cm5QYXJhbWV0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vZ2V0IFdlYlBhcmFtCisgICAgICAgIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgVHlwZVtdIGdlbmVyaWNQYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgQW5ub3RhdGlvbltdW10gcGFubm90YXRpb25zID0gZ2V0UHJpdlBhcmFtZXRlckFubm90YXRpb25zKG1ldGhvZCk7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBmb3IgKENsYXNzIGNsYXp6VHlwZSA6IHBhcmFtZXRlclR5cGVzKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gIiI7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lc3BhY2UgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9ICIiOworICAgICAgICAgICAgYm9vbGVhbiBpc0hlYWRlciA9IGZhbHNlOworCisgICAgICAgICAgICBpZihqYXZhTWV0aG9kLmlzQXN5bmMoKSAmJiBBc3luY0hhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6elR5cGUpKXsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBpc0hvbGRlciA9IEhPTERFUl9DTEFTUy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6VHlwZSk7CisgICAgICAgICAgICAvL3NldCB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnQgb2YgSG9sZGVyIGluIHRoZSBUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICBpZiAoaXNIb2xkZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xhenpUeXBlPT1Ib2xkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIGNsYXp6VHlwZSA9IE5hdmlnYXRvci5SRUZMRUNUSU9OLmVyYXN1cmUoKChQYXJhbWV0ZXJpemVkVHlwZSlnZW5lcmljUGFyYW1ldGVyVHlwZXNbcG9zXSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1vZGUgcGFyYW1Nb2RlID0gaXNIb2xkZXIgPyBNb2RlLklOT1VUIDogTW9kZS5JTjsKKyAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogcGFubm90YXRpb25zW3Bvc10pIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpID09IGphdmF4Lmp3cy5XZWJQYXJhbS5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3MuV2ViUGFyYW0gd2ViUGFyYW0gPSAoamF2YXguandzLldlYlBhcmFtKSBhbm5vdGF0aW9uOworICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB3ZWJQYXJhbS5uYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0gd2ViUGFyYW0ucGFydE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaXNIZWFkZXIgPSB3ZWJQYXJhbS5oZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgV2ViUGFyYW0uTW9kZSBtb2RlID0gd2ViUGFyYW0ubW9kZSgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzcGFjZSA9IHdlYlBhcmFtLnRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNIb2xkZXIgJiYgbW9kZSA9PSBNb2RlLklOKQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IE1vZGUuSU5PVVQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtTW9kZSA9IG1vZGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gImFyZyIrcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcnROYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBwYXJ0TmFtZSA9IHBhcmFtTmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gcGFydE5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFydE5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBhcnROYW1lID0gcGFyYW1OYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBRTmFtZSBwYXJhbVFOYW1lOworICAgICAgICAgICAgaWYgKCFpc0hlYWRlcikgeworICAgICAgICAgICAgICAgIC8vaXRzIHJwY2xpdCBib2R5IHBhcmFtLCBzZXQgbmFtZXNwYWNlIHRvICIiCisgICAgICAgICAgICAgICAgcGFyYW1RTmFtZSA9IG5ldyBRTmFtZSgiIiwgcGFyYW1OYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZXNwYWNlLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOworICAgICAgICAgICAgICAgIHBhcmFtUU5hbWUgPSBuZXcgUU5hbWUocGFyYW1OYW1lc3BhY2UsIHBhcmFtTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlUmVmID0KKyAgICAgICAgICAgICAgICBuZXcgVHlwZVJlZmVyZW5jZShwYXJhbVFOYW1lLCBjbGF6elR5cGUsIHBhbm5vdGF0aW9uc1twb3NdKTsKKworICAgICAgICAgICAgUGFyYW1ldGVySW1wbCBwYXJhbSA9IG5ldyBQYXJhbWV0ZXJJbXBsKGphdmFNZXRob2QsIHR5cGVSZWYsIHBhcmFtTW9kZSwgcG9zKyspOworICAgICAgICAgICAgcGFyYW0uc2V0UGFydE5hbWUocGFydE5hbWUpOworCisgICAgICAgICAgICBpZihwYXJhbU1vZGUgPT0gTW9kZS5JTk9VVCl7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYiA9IGdldEJpbmRpbmcob3BlcmF0aW9uTmFtZSwgcGFydE5hbWUsIGlzSGVhZGVyLCBNb2RlLklOKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5zZXRJbkJpbmRpbmcocGIpOworICAgICAgICAgICAgICAgIHBiID0gZ2V0QmluZGluZyhvcGVyYXRpb25OYW1lLCBwYXJ0TmFtZSwgaXNIZWFkZXIsIE1vZGUuT1VUKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5zZXRPdXRCaW5kaW5nKHBiKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmIChpc0hlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuSEVBREVSKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBiID0gZ2V0QmluZGluZyhvcGVyYXRpb25OYW1lLCBwYXJ0TmFtZSwgZmFsc2UsIHBhcmFtTW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEJpbmRpbmcocGIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBhcmFtLmdldEluQmluZGluZygpLmlzQm9keSgpKXsKKyAgICAgICAgICAgICAgICBpZighcGFyYW0uaXNPVVQoKSl7CisgICAgICAgICAgICAgICAgICAgIFdTRExQYXJ0IHAgPSBnZXRQYXJ0KG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2Usb3BlcmF0aW9uTmFtZSksIHBhcnROYW1lLCBNb2RlLklOKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxUnBjUGFyYW1zLnB1dChyZXFScGNQYXJhbXMuc2l6ZSgpKzEwMDAwLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcVJwY1BhcmFtcy5wdXQocC5nZXRJbmRleCgpLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIXBhcmFtLmlzSU4oKSl7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc09uZXdheSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLm9uZXdheS5vcGVyYXRpb24ubm8ub3V0LnBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBtZXRob2ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBXU0RMUGFydCBwID0gZ2V0UGFydChuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLG9wZXJhdGlvbk5hbWUpLCBwYXJ0TmFtZSwgTW9kZS5PVVQpOworICAgICAgICAgICAgICAgICAgICBpZihwID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXNScGNQYXJhbXMucHV0KHJlc1JwY1BhcmFtcy5zaXplKCkrMTAwMDAsIHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzUnBjUGFyYW1zLnB1dChwLmdldEluZGV4KCksIHBhcmFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBqYXZhTWV0aG9kLmFkZFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHAgOiByZXFScGNQYXJhbXMudmFsdWVzKCkpCisgICAgICAgICAgICByZXF1ZXN0V3JhcHBlci5hZGRXcmFwcGVyQ2hpbGQocCk7CisgICAgICAgIGZvciAoUGFyYW1ldGVySW1wbCBwIDogcmVzUnBjUGFyYW1zLnZhbHVlcygpKQorICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyLmFkZFdyYXBwZXJDaGlsZChwKTsKKyAgICAgICAgcHJvY2Vzc0V4Y2VwdGlvbnMoamF2YU1ldGhvZCwgbWV0aG9kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2RlbHMgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IDxjb2RlPm1ldGhvZDwvY29kZT4gYW5kIGFkZHMgdGhlbSB0byB0aGUgPGNvZGU+amF2YU1ldGhvZDwvY29kZT4KKyAgICAgKiBydW50aW1lIG1vZGVsIG9iamVjdAorICAgICAqIEBwYXJhbSBqYXZhTWV0aG9kIHRoZSBydW50aW1lIG1vZGVsIG9iamVjdCB0byBhZGQgdGhlIGV4Y2VwdGlvbiBtb2RlbCBvYmplY3RzIHRvCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgPGNvZGU+bWV0aG9kPC9jb2RlPiBmcm9tIHdoaWNoIHRvIGZpbmQgdGhlIGV4Y2VwdGlvbnMgdG8gbW9kZWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRXhjZXB0aW9ucyhKYXZhTWV0aG9kSW1wbCBqYXZhTWV0aG9kLCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIEFjdGlvbiBhY3Rpb25Bbm4gPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihBY3Rpb24uY2xhc3MpOworICAgICAgICBGYXVsdEFjdGlvbltdIGZhdWx0QWN0aW9ucyA9IHt9OworICAgICAgICBpZihhY3Rpb25Bbm4gIT0gbnVsbCkKKyAgICAgICAgICAgIGZhdWx0QWN0aW9ucyA9IGFjdGlvbkFubi5mYXVsdCgpOworICAgICAgICBmb3IgKENsYXNzPD8+IGV4Y2VwdGlvbiA6IG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpKSB7CisgICAgICAgICAgICBpZiAoUkVNT1RFX0VYQ0VQVElPTl9DTEFTUy5pc0Fzc2lnbmFibGVGcm9tKGV4Y2VwdGlvbikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBDbGFzcyBleGNlcHRpb25CZWFuOworICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubnM7CisgICAgICAgICAgICBXZWJGYXVsdCB3ZWJGYXVsdCA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oZXhjZXB0aW9uLCBXZWJGYXVsdC5jbGFzcyk7CisgICAgICAgICAgICBNZXRob2QgZmF1bHRJbmZvTWV0aG9kID0gZ2V0V1NETEV4Y2VwdGlvbkZhdWx0SW5mbyhleGNlcHRpb24pOworICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleGNlcHRpb25UeXBlID0gRXhjZXB0aW9uVHlwZS5XU0RMRXhjZXB0aW9uOworICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZXhjZXB0aW9uLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBiZWFuUGFja2FnZSA9IHBhY2thZ2VOYW1lICsgUERfSkFYV1NfUEFDS0FHRV9QRDsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgIGJlYW5QYWNrYWdlID0gSkFYV1NfUEFDS0FHRV9QRDsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBiZWFuUGFja2FnZSsgbmFtZSArIEJFQU47CisgICAgICAgICAgICBpZiAod2ViRmF1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh3ZWJGYXVsdC5mYXVsdEJlYW4oKS5sZW5ndGgoKT4wKQorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3ZWJGYXVsdC5mYXVsdEJlYW4oKTsKKyAgICAgICAgICAgICAgICBpZiAod2ViRmF1bHQubmFtZSgpLmxlbmd0aCgpPjApCisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB3ZWJGYXVsdC5uYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHdlYkZhdWx0LnRhcmdldE5hbWVzcGFjZSgpLmxlbmd0aCgpPjApCisgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHdlYkZhdWx0LnRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZhdWx0SW5mb01ldGhvZCA9PSBudWxsKSAgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkJlYW4gPSBnZXRDbGFzcyhjbGFzc05hbWUsIE1vZGVsZXJNZXNzYWdlcy5sb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9XUkFQUEVSX05PVF9GT1VORChjbGFzc05hbWUpKTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25UeXBlID0gRXhjZXB0aW9uVHlwZS5Vc2VyRGVmaW5lZDsKKyAgICAgICAgICAgICAgICBhbm5zID0gZXhjZXB0aW9uQmVhbi5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25CZWFuID0gZmF1bHRJbmZvTWV0aG9kLmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgICAgICAgICBhbm5zID0gZmF1bHRJbmZvTWV0aG9kLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBRTmFtZSBmYXVsdE5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLCBuYW1lKTsKKyAgICAgICAgICAgIFR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IG5ldyBUeXBlUmVmZXJlbmNlKGZhdWx0TmFtZSwgZXhjZXB0aW9uQmVhbiwgYW5ucyk7CisgICAgICAgICAgICBDaGVja2VkRXhjZXB0aW9uSW1wbCBjaGVja2VkRXhjZXB0aW9uID0KKyAgICAgICAgICAgICAgICBuZXcgQ2hlY2tlZEV4Y2VwdGlvbkltcGwoamF2YU1ldGhvZCwgZXhjZXB0aW9uLCB0eXBlUmVmLCBleGNlcHRpb25UeXBlKTsKKyAgICAgICAgICAgIGNoZWNrZWRFeGNlcHRpb24uc2V0TWVzc2FnZU5hbWUoZXhjZXB0aW9uLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICBmb3IoRmF1bHRBY3Rpb24gZmE6IGZhdWx0QWN0aW9ucykgeworICAgICAgICAgICAgICAgIGlmKGZhLmNsYXNzTmFtZSgpLmVxdWFscyhleGNlcHRpb24pICYmICFmYS52YWx1ZSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tlZEV4Y2VwdGlvbi5zZXRGYXVsdEFjdGlvbihmYS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgamF2YU1ldGhvZC5hZGRFeGNlcHRpb24oY2hlY2tlZEV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRoZSBtZXRob2QgdGhhdCBjb3JyZXNwb25kcyB0byAiZ2V0RmF1bHRJbmZvIi4gIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIG5vdCBhbgorICAgICAqIGV4Y2VwdGlvbiBnZW5lcmF0ZWQgZnJvbSBhIFdTREwKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBjbGFzcyB0byBzZWFyY2ggZm9yIHRoZSAiZ2V0RmF1bHRJbmZvIiBtZXRob2QKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgbmFtZWQgImdldEZhdWx0SW5mbyIgaWYgdGhpcyBpcyBhbiBleGNlcHRpb24gZ2VuZXJhdGVkIGZyb20gV1NETCBvciBhbgorICAgICAqIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSA8Y29kZT5XZWJGYXVsdDwvY29kZT4gYW5ub3RhdGlvbi4gIE90aGVyd2lzZSBpdCByZXR1cm5zIG51bGwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWV0aG9kIGdldFdTRExFeGNlcHRpb25GYXVsdEluZm8oQ2xhc3MgZXhjZXB0aW9uKSB7CisgICAgICAgIGlmICghZXhjZXB0aW9uLmlzQW5ub3RhdGlvblByZXNlbnQoV2ViRmF1bHQuY2xhc3MpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uLmdldE1ldGhvZCgiZ2V0RmF1bHRJbmZvIik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIG1vZGVscyBhIGRvY3VtZW50L2xpdGVyYWwgYmFyZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gamF2YU1ldGhvZCB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIHJ1bnRpbWUgbW9kZWwgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAorICAgICAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIHJ1bnRpbWUgbW9kZWwgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAorICAgICAqIEBwYXJhbSBvcGVyYXRpb25OYW1lIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gd2ViU2VydmljZSB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RvY0JhcmVNZXRob2QoSmF2YU1ldGhvZEltcGwgamF2YU1ldGhvZCwgU3RyaW5nIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViTWV0aG9kIHdlYk1ldGhvZCwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIE1ldGhvZCBtZXRob2QsIFdlYlNlcnZpY2Ugd2ViU2VydmljZSkgeworCisgICAgICAgIFN0cmluZyByZXN1bHROYW1lID0gb3BlcmF0aW9uTmFtZStSRVNQT05TRTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdFROUyA9IHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdFBhcnROYW1lID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBpc1Jlc3VsdEhlYWRlciA9IGZhbHNlOworICAgICAgICBXZWJSZXN1bHQgd2ViUmVzdWx0ID0gbWV0aG9kLmdldEFubm90YXRpb24oV2ViUmVzdWx0LmNsYXNzKTsKKyAgICAgICAgaWYgKHdlYlJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAod2ViUmVzdWx0Lm5hbWUoKS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgcmVzdWx0TmFtZSA9IHdlYlJlc3VsdC5uYW1lKCk7CisgICAgICAgICAgICBpZiAod2ViUmVzdWx0LnRhcmdldE5hbWVzcGFjZSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICByZXN1bHRUTlMgPSB3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgICAgICByZXN1bHRQYXJ0TmFtZSA9IHdlYlJlc3VsdC5wYXJ0TmFtZSgpOworICAgICAgICAgICAgaXNSZXN1bHRIZWFkZXIgPSB3ZWJSZXN1bHQuaGVhZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKKworICAgICAgICBpZihqYXZhTWV0aG9kLmlzQXN5bmMoKSl7CisgICAgICAgICAgICByZXR1cm5UeXBlID0gZ2V0QXN5bmNSZXR1cm5UeXBlKG1ldGhvZCwgcmV0dXJuVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldHVyblR5cGUgIT0gbnVsbCkgJiYgKCFyZXR1cm5UeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkpIHsKKyAgICAgICAgICAgIEFubm90YXRpb25bXSByYW5uID0gbWV0aG9kLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUU5hbWUgcmVzcG9uc2VRTmFtZSA9IG5ldyBRTmFtZShyZXN1bHRUTlMsIHJlc3VsdE5hbWUpOworICAgICAgICAgICAgICAgIFR5cGVSZWZlcmVuY2UgclR5cGVSZWZlcmVuY2UgPSBuZXcgVHlwZVJlZmVyZW5jZShyZXNwb25zZVFOYW1lLCByZXR1cm5UeXBlLCByYW5uKTsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHJldHVyblBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXJJbXBsKGphdmFNZXRob2QsIHJUeXBlUmVmZXJlbmNlLCBNb2RlLk9VVCwgLTEpOworCisgICAgICAgICAgICAgICAgaWYocmVzdWx0UGFydE5hbWUgPT0gbnVsbCB8fCAocmVzdWx0UGFydE5hbWUubGVuZ3RoKCkgPT0gMCkpeworICAgICAgICAgICAgICAgICAgICByZXN1bHRQYXJ0TmFtZSA9IHJlc3VsdE5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVyblBhcmFtZXRlci5zZXRQYXJ0TmFtZShyZXN1bHRQYXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgaWYoaXNSZXN1bHRIZWFkZXIpeworICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXIuc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkhFQURFUik7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgcmIgPSBnZXRCaW5kaW5nKG9wZXJhdGlvbk5hbWUsIHJlc3VsdFBhcnROYW1lLCBmYWxzZSwgTW9kZS5PVVQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXIuc2V0QmluZGluZyhyYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJldHVyblBhcmFtZXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL2dldCBXZWJQYXJhbQorICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIFR5cGVbXSBnZW5lcmljUGFyYW1ldGVyVHlwZXMgPSBtZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIEFubm90YXRpb25bXVtdIHBhbm5vdGF0aW9ucyA9IGdldFByaXZQYXJhbWV0ZXJBbm5vdGF0aW9ucyhtZXRob2QpOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgZm9yIChDbGFzcyBjbGF6elR5cGUgOiBwYXJhbWV0ZXJUeXBlcykgeworICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IG9wZXJhdGlvbk5hbWU7IC8vbWV0aG9kLmdldE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNIZWFkZXIgPSBmYWxzZTsKKworICAgICAgICAgICAgLy9hc3luYworICAgICAgICAgICAgaWYoamF2YU1ldGhvZC5pc0FzeW5jKCkgJiYgQXN5bmNIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenpUeXBlKSl7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gaXNIb2xkZXIgPSBIT0xERVJfQ0xBU1MuaXNBc3NpZ25hYmxlRnJvbShjbGF6elR5cGUpOworICAgICAgICAgICAgLy9zZXQgdGhlIGFjdHVhbCB0eXBlIGFyZ3VtZW50IG9mIEhvbGRlciBpbiB0aGUgVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgaWYgKGlzSG9sZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsYXp6VHlwZT09SG9sZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICBjbGF6elR5cGUgPSBOYXZpZ2F0b3IuUkVGTEVDVElPTi5lcmFzdXJlKCgoUGFyYW1ldGVyaXplZFR5cGUpZ2VuZXJpY1BhcmFtZXRlclR5cGVzW3Bvc10pLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1vZGUgcGFyYW1Nb2RlID0gaXNIb2xkZXIgPyBNb2RlLklOT1VUIDogTW9kZS5JTjsKKyAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogcGFubm90YXRpb25zW3Bvc10pIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpID09IGphdmF4Lmp3cy5XZWJQYXJhbS5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3MuV2ViUGFyYW0gd2ViUGFyYW0gPSAoamF2YXguandzLldlYlBhcmFtKSBhbm5vdGF0aW9uOworICAgICAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW0ubmFtZSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IHdlYlBhcmFtLm5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSB3ZWJQYXJhbS5wYXJ0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXdlYlBhcmFtLnRhcmdldE5hbWVzcGFjZSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3ROYW1lc3BhY2UgPSB3ZWJQYXJhbS50YXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpc0hlYWRlciA9IHdlYlBhcmFtLmhlYWRlcigpOworICAgICAgICAgICAgICAgICAgICBwYXJhbU1vZGUgPSB3ZWJQYXJhbS5tb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0hvbGRlciAmJiBwYXJhbU1vZGUgPT0gTW9kZS5JTikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTW9kZSA9IE1vZGUuSU5PVVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUU5hbWUgcmVxdWVzdFFOYW1lID0gbmV3IFFOYW1lKHJlcXVlc3ROYW1lc3BhY2UsIHBhcmFtTmFtZSk7CisgICAgICAgICAgICAvL2RvY2xpdC93cmFwcGVkCisgICAgICAgICAgICBUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAvL29wZXJhdGlvbk5hbWUgd2l0aCB1cHBlciAxIGNoYXIKKyAgICAgICAgICAgICAgICBuZXcgVHlwZVJlZmVyZW5jZShyZXF1ZXN0UU5hbWUsIGNsYXp6VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgcGFubm90YXRpb25zW3Bvc10pOworCisgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHBhcmFtID0gbmV3IFBhcmFtZXRlckltcGwoamF2YU1ldGhvZCwgdHlwZVJlZiwgcGFyYW1Nb2RlLCBwb3MrKyk7CisgICAgICAgICAgICBpZihwYXJ0TmFtZSA9PSBudWxsIHx8IChwYXJ0TmFtZS5sZW5ndGgoKSA9PSAwKSl7CisgICAgICAgICAgICAgICAgcGFydE5hbWUgPSBwYXJhbU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJhbS5zZXRQYXJ0TmFtZShwYXJ0TmFtZSk7CisgICAgICAgICAgICBpZihwYXJhbU1vZGUgPT0gTW9kZS5JTk9VVCl7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYiA9IGdldEJpbmRpbmcob3BlcmF0aW9uTmFtZSwgcGFydE5hbWUsIGlzSGVhZGVyLCBNb2RlLklOKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5zZXRJbkJpbmRpbmcocGIpOworICAgICAgICAgICAgICAgIHBiID0gZ2V0QmluZGluZyhvcGVyYXRpb25OYW1lLCBwYXJ0TmFtZSwgaXNIZWFkZXIsIE1vZGUuT1VUKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5zZXRPdXRCaW5kaW5nKHBiKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmIChpc0hlYWRlcil7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEJpbmRpbmcoUGFyYW1ldGVyQmluZGluZy5IRUFERVIpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBiID0gZ2V0QmluZGluZyhvcGVyYXRpb25OYW1lLCBwYXJ0TmFtZSwgZmFsc2UsIHBhcmFtTW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEJpbmRpbmcocGIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICB2YWxpZGF0ZURvY0JhcmUoamF2YU1ldGhvZCk7CisgICAgICAgIHByb2Nlc3NFeGNlcHRpb25zKGphdmFNZXRob2QsIG1ldGhvZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRG9jQmFyZShKYXZhTWV0aG9kSW1wbCBqYXZhTWV0aG9kKSB7CisgICAgICAgIGludCBudW1JbkJvZHlCaW5kaW5ncyA9IDA7CisgICAgICAgIGZvcihQYXJhbWV0ZXIgcGFyYW0gOiBqYXZhTWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkpeworICAgICAgICAgICAgaWYocGFyYW0uZ2V0QmluZGluZygpLmVxdWFscyhQYXJhbWV0ZXJCaW5kaW5nLkJPRFkpICYmIHBhcmFtLmlzSU4oKSl7CisgICAgICAgICAgICAgICAgbnVtSW5Cb2R5QmluZGluZ3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG51bUluQm9keUJpbmRpbmdzID4gMSl7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKE1vZGVsZXJNZXNzYWdlcy5sb2NhbGl6YWJsZU5PVF9BX1ZBTElEX0JBUkVfTUVUSE9EKHBvcnRDbGFzcy5nZXROYW1lKCksIGphdmFNZXRob2QuZ2V0TWV0aG9kKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzIGdldEFzeW5jUmV0dXJuVHlwZShNZXRob2QgbWV0aG9kLCBDbGFzcyByZXR1cm5UeXBlKSB7CisgICAgICAgIGlmKFJlc3BvbnNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmV0dXJuVHlwZSkpeworICAgICAgICAgICAgVHlwZSByZXQgPSBtZXRob2QuZ2V0R2VuZXJpY1JldHVyblR5cGUoKTsKKyAgICAgICAgICAgIHJldHVybiBOYXZpZ2F0b3IuUkVGTEVDVElPTi5lcmFzdXJlKCgoUGFyYW1ldGVyaXplZFR5cGUpcmV0KS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF0pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIFR5cGVbXSB0eXBlcyA9IG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIENsYXNzW10gcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IoQ2xhc3MgY2xzIDogcGFyYW1zKXsKKyAgICAgICAgICAgICAgICBpZihBc3luY0hhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hdmlnYXRvci5SRUZMRUNUSU9OLmVyYXN1cmUoKChQYXJhbWV0ZXJpemVkVHlwZSl0eXBlc1tpXSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5UeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHV0aWxpdHkgdG8gY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIGluIGEgc3RyaW5nCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHN0cmluZyB0byBjYXBpdGFsaXplCisgICAgICogQHJldHVybiB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBjaGFyc1tdID0gbmFtZS50b0NoYXJBcnJheSgpOworICAgICAgICBjaGFyc1swXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaGFyc1swXSk7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKKyAgICB9CisKKyAgICAvKgorICAgICogUmV0dXJuIHNlcnZpY2UgUU5hbWUKKyAgICAqLworICAgIC8qKgorICAgICAqIGdldHMgdGhlIDxjb2RlPndzZGw6c2VydmljZU5hbWU8L2NvZGU+IGZvciBhIGdpdmVuIGltcGxlbWVudGF0aW9uIGNsYXNzCisgICAgICogQHBhcmFtIGltcGxDbGFzcyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT53c2RsOnNlcnZpY2VOYW1lPC9jb2RlPiBmb3IgdGhlIDxjb2RlPmltcGxDbGFzczwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFNlcnZpY2VOYW1lKENsYXNzPD8+IGltcGxDbGFzcykgeworICAgICAgICBpZiAoaW1wbENsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLmNhbm5vdC5nZXQuc2VydmljZU5hbWUuZnJvbS5pbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbENsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbmFtZSA9IGltcGxDbGFzcy5nZXRTaW1wbGVOYW1lKCkrU0VSVklDRTsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gIiI7CisgICAgICAgIGlmIChpbXBsQ2xhc3MuZ2V0UGFja2FnZSgpICE9IG51bGwpCisgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IGltcGxDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworCisgICAgICAgIFdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGltcGxDbGFzcy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBpZiAod2ViU2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5uby53ZWJzZXJ2aWNlLmFubm90YXRpb24iLAorICAgICAgICAgICAgICAgIGltcGxDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh3ZWJTZXJ2aWNlLnNlcnZpY2VOYW1lKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBuYW1lID0gd2ViU2VydmljZS5zZXJ2aWNlTmFtZSgpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UocGFja2FnZU5hbWUpOworICAgICAgICBpZiAod2ViU2VydmljZS50YXJnZXROYW1lc3BhY2UoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IHdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLm5vLnBhY2thZ2UiLAorICAgICAgICAgICAgICAgIGltcGxDbGFzcy5nZXROYW1lKCkpOworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRzIHRoZSA8Y29kZT53c2RsOnBvcnROYW1lPC9jb2RlPiBmb3IgYSBnaXZlbiBpbXBsZW1lbnRhdGlvbiBjbGFzcworICAgICAqIEBwYXJhbSBpbXBsQ2xhc3MgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzCisgICAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBOYW1lc3BhY2UgVVJJIGZvciBzZXJ2aWNlIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT53c2RsOnBvcnROYW1lPC9jb2RlPiBmb3IgdGhlIDxjb2RlPmltcGxDbGFzczwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFBvcnROYW1lKENsYXNzPD8+IGltcGxDbGFzcywgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgeworICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgPSBpbXBsQ2xhc3MuZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgaWYgKHdlYlNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIubm8ud2Vic2VydmljZS5hbm5vdGF0aW9uIiwKKyAgICAgICAgICAgICAgICBpbXBsQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgaWYgKHdlYlNlcnZpY2UucG9ydE5hbWUoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIG5hbWUgPSB3ZWJTZXJ2aWNlLnBvcnROYW1lKCk7CisgICAgICAgIH0gZWxzZSBpZiAod2ViU2VydmljZS5uYW1lKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBuYW1lID0gd2ViU2VydmljZS5uYW1lKCkrUE9SVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hbWUgPSBpbXBsQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpK1BPUlQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IHdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGltcGxDbGFzcy5nZXRQYWNrYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IGltcGxDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5uby5wYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxDbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVzIHBvcnRUeXBlIFFOYW1lIGZyb20gaW1wbGVtZW50YXRvckNsYXNzIG9yIFNFSQorICAgICAqIEBwYXJhbSAgaW1wbE9yU2VpQ2xhc3MgY2FudCBiZSBudWxsCisgICAgICogQHJldHVybiAgPGNvZGU+d3NkbDpwb3J0VHlwZUBuYW1lPC9jb2RlPiwgbnVsbCBpZiBpdCBjb3VsZCBub3QgZmluZCB0aGUgYW5ub3RhdGVkIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UG9ydFR5cGVOYW1lKENsYXNzPD8+IGltcGxPclNlaUNsYXNzKXsKKyAgICAgICAgYXNzZXJ0KGltcGxPclNlaUNsYXNzICE9IG51bGwpOworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IGltcGxPclNlaUNsYXNzOworICAgICAgICBpZiAoIWltcGxPclNlaUNsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoV2ViU2VydmljZS5jbGFzcykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIubm8ud2Vic2VydmljZS5hbm5vdGF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsT3JTZWlDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworCisgICAgICAgIGlmICghaW1wbE9yU2VpQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gaW1wbE9yU2VpQ2xhc3MuZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIFN0cmluZyBlcGkgPSB3ZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpZiAoZXBpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZXBpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIuY2xhc3Mubm90LmZvdW5kIiwgZXBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5pc0Fubm90YXRpb25QcmVzZW50KGphdmF4Lmp3cy5XZWJTZXJ2aWNlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5lbmRwb2ludC5pbnRlcmZhY2Uubm8ud2Vic2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgPSBjbGF6ei5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBTdHJpbmcgbmFtZSA9IHdlYlNlcnZpY2UubmFtZSgpOworICAgICAgICBpZihuYW1lLmxlbmd0aCgpID09IDApeworICAgICAgICAgICAgbmFtZSA9IGNsYXp6LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB0bnMgPSB3ZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICBpZiAodG5zLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICB0bnMgPSBnZXROYW1lc3BhY2UoY2xhenouZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmICh0bnMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIubm8ucGFja2FnZSIsIGNsYXp6LmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh0bnMsIG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgUGFyYW1ldGVyQmluZGluZyBnZXRCaW5kaW5nKFN0cmluZyBvcGVyYXRpb24sIFN0cmluZyBwYXJ0LCBib29sZWFuIGlzSGVhZGVyLCBNb2RlIG1vZGUpeworICAgICAgICBpZihiaW5kaW5nID09IG51bGwpeworICAgICAgICAgICAgaWYoaXNIZWFkZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlckJpbmRpbmcuSEVBREVSOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXJCaW5kaW5nLkJPRFk7CisgICAgICAgIH0KKyAgICAgICAgUU5hbWUgb3BOYW1lID0gbmV3IFFOYW1lKGJpbmRpbmcuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBvcGVyYXRpb24pOworICAgICAgICByZXR1cm4gYmluZGluZy5nZXRCaW5kaW5nKCkuZ2V0QmluZGluZyhvcE5hbWUsIHBhcnQsIG1vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgV1NETFBhcnQgZ2V0UGFydChRTmFtZSBvcE5hbWUsIFN0cmluZyBwYXJ0TmFtZSwgTW9kZSBtb2RlKXsKKyAgICAgICAgaWYoYmluZGluZyAhPSBudWxsKXsKKyAgICAgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbkltcGwgYm8gPSBiaW5kaW5nLmdldEJpbmRpbmcoKS5nZXQob3BOYW1lKTsKKyAgICAgICAgICAgIGlmKGJvICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJvLmdldFBhcnQocGFydE5hbWUsIG1vZGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL1J1bnRpbWVNb2RlbGVyRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9SdW50aW1lTW9kZWxlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkY2Q5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9SdW50aW1lTW9kZWxlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmV4Y2VwdGlvbi5KQVhXU0V4Y2VwdGlvbkJhc2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CisKKy8qKgorICogUnVudGltZU1vZGVsZXJFeGNlcHRpb24gcmVwcmVzZW50cyBhbiBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZQorICogc2VyaWFsaXppbmcgYSBKYXZhIHZhbHVlIGFzIFhNTC4KKyAqCisgKiBAc2VlIEpBWFdTRXhjZXB0aW9uQmFzZQorICoKKyAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQorICovCitwdWJsaWMgY2xhc3MgUnVudGltZU1vZGVsZXJFeGNlcHRpb24gZXh0ZW5kcyBKQVhXU0V4Y2VwdGlvbkJhc2UgeworCisgICAgcHVibGljIFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKFN0cmluZyBrZXksIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIHN1cGVyKGtleSwgYXJncyk7CisgICAgfQorCisgICAgcHVibGljIFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oTG9jYWxpemFibGUgYXJnKSB7CisgICAgICAgIHN1cGVyKCJuZXN0ZWRNb2RlbGVyRXJyb3IiLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMubW9kZWxlciI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9TT0FQU0VJTW9kZWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL1NPQVBTRUlNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTI3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9TT0FQU0VJTW9kZWwuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7CisKK2ltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIENyZWF0ZXMgU09BUCBzcGVjaWZpYyBSdW50aW1lTW9kZWwKKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgY2xhc3MgU09BUFNFSU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RTRUlNb2RlbEltcGwgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYXBzKCkgeworICAgICAgICBpbnQgZW1wdHlCb2R5Q291bnQgPSAwOworICAgICAgICBmb3IoSmF2YU1ldGhvZEltcGwgam0gOiBnZXRKYXZhTWV0aG9kcygpKXsKKyAgICAgICAgICAgIHB1dChqbS5nZXRNZXRob2QoKSwgam0pOworICAgICAgICAgICAgYm9vbGVhbiBib2R5Rm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvcihQYXJhbWV0ZXJJbXBsIHA6am0uZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSl7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBiaW5kaW5nID0gcC5nZXRCaW5kaW5nKCk7CisgICAgICAgICAgICAgICAgaWYoYmluZGluZy5pc0JvZHkoKSl7CisgICAgICAgICAgICAgICAgICAgIHB1dChwLmdldE5hbWUoKSwgam0pOworICAgICAgICAgICAgICAgICAgICBib2R5Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFib2R5Rm91bmQpeworICAgICAgICAgICAgICAgIHB1dChlbXB0eUJvZHlOYW1lLCBqbSk7CisvLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkIGVtcHR5IGJvZHkgZm9yOiAiK2ptLmdldE1ldGhvZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZW1wdHlCb2R5Q291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihlbXB0eUJvZHlDb3VudCA+IDEpeworICAgICAgICAgICAgLy9UT0RPIHRocm93IGV4Y2VwdGlvbgorLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBVbnFpdWUgc2lnbmF0dXJlIHZpb2xhdGlvbiAtIG1vcmUgdGhhbiAxIGVtcHR5IGJvZHkhIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRLbm93bkhlYWRlcnMoKSB7CisgICAgICAgIFNldDxRTmFtZT4gaGVhZGVycyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOworICAgICAgICBmb3IgKEphdmFNZXRob2RJbXBsIG1ldGhvZCA6IGdldEphdmFNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIC8vIGZpbGwgaW4gcmVxdWVzdCBoZWFkZXJzCisgICAgICAgICAgICBJdGVyYXRvcjxQYXJhbWV0ZXJJbXBsPiBwYXJhbXMgPSBtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgZmlsbEhlYWRlcnMocGFyYW1zLCBoZWFkZXJzLCBNb2RlLklOKTsKKworICAgICAgICAgICAgLy8gZmlsbCBpbiByZXNwb25zZSBoZWFkZXJzCisgICAgICAgICAgICBwYXJhbXMgPSBtZXRob2QuZ2V0UmVzcG9uc2VQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZpbGxIZWFkZXJzKHBhcmFtcywgaGVhZGVycywgTW9kZS5PVVQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZWFkZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiBAcGFyYW0gaGVhZGVycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaWxsSGVhZGVycyhJdGVyYXRvcjxQYXJhbWV0ZXJJbXBsPiBwYXJhbXMsIFNldDxRTmFtZT4gaGVhZGVycywgTW9kZSBtb2RlKSB7CisgICAgICAgIHdoaWxlIChwYXJhbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHBhcmFtID0gcGFyYW1zLm5leHQoKTsKKyAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgYmluZGluZyA9IChtb2RlID09IE1vZGUuSU4pP3BhcmFtLmdldEluQmluZGluZygpOnBhcmFtLmdldE91dEJpbmRpbmcoKTsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJhbS5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoYmluZGluZy5pc0hlYWRlcigpICYmICFoZWFkZXJzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9XcmFwcGVyUGFyYW1ldGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9XcmFwcGVyUGFyYW1ldGVyLmphdmEKaW5kZXggZmI1YThhYy4uZmY2MTljNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvV3JhcHBlclBhcmFtZXRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL1dyYXBwZXJQYXJhbWV0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwyNiArMjQsNDQgQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbDsKIAoraW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkNvbXBvc2l0ZVN0cnVjdHVyZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5UeXBlUmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5KYXZhTWV0aG9kOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOworCitpbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5UeXBlUmVmZXJlbmNlOwotCiAvKioKLSAqIE1vZGVscyBXcmFwcGVyIHBhcmFtZXRlcgorICoge0BsaW5rIFBhcmFtZXRlckltcGx9IHRoYXQgcmVwcmVzZW50cyBhIHdyYXBwZXIsCisgKiB3aGljaCBpcyBhIHBhcmFtZXRlciB0aGF0IGNvbnNpc3RzIG9mIG11bHRpcGxlIG5lc3RlZCB7QGxpbmsgUGFyYW1ldGVySW1wbH1zCisgKiB3aXRoaW4sIHdoaWNoIHRvZ2V0aGVyIGZvcm0gYSBib2R5IHBhcnQuCisgKgorICogPHA+CisgKiBKYXZhIG1ldGhvZCBwYXJhbWV0ZXJzIHJlcHJlc2VudGVkIGJ5IG5lc3RlZCB7QGxpbmsgUGFyYW1ldGVySW1wbH1zIHdpbGwgYmUKKyAqIHBhY2tlZCBpbnRvIGEgIndyYXBwZXIgYmVhbiIgYW5kIGl0IGJlY29tZXMgdGhlIHtAbGluayBQYXJhbWV0ZXJJbXBsfSBmb3IgdGhlCisgKiBib2R5LgorICoKKyAqIDxwPgorICogVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGZvciB0aGUge0BsaW5rIFBhcmFtZXRlckJpbmRpbmcjQk9EWX0gYmluZGluZy4KKyAqIE90aGVyIHBhcmFtZXRlcnMgdGhhdCBiaW5kIHRvIG90aGVyIHBhcnRzIChzdWNoIGFzIGhlYWRlcnMgb3IgdW5ib3VuZCkKKyAqIHdpbGwgc2hvdyB1cCBkaXJlY3RseSB1bmRlciB7QGxpbmsgSmF2YU1ldGhvZH0uCiAgKgogICogQGF1dGhvciBWaXZlayBQYW5kZXkKICAqLwotcHVibGljIGNsYXNzIFdyYXBwZXJQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXJ7Ci0gICAgcHVibGljIFdyYXBwZXJQYXJhbWV0ZXIoVHlwZVJlZmVyZW5jZSB0eXBlLCBNb2RlIG1vZGUsIGludCBpbmRleCkgewotICAgICAgICBzdXBlcih0eXBlLCBtb2RlLCBpbmRleCk7CitwdWJsaWMgY2xhc3MgV3JhcHBlclBhcmFtZXRlciBleHRlbmRzIFBhcmFtZXRlckltcGwgeworICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PFBhcmFtZXRlckltcGw+IHdyYXBwZXJDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVySW1wbD4oKTsKKworICAgIC8vIFRPRE86IHdyYXBwZXIgcGFyYW1ldGVyIGRvZXNuJ3QgdXNlICd0eXBlUmVmJyAtLS0gaXQgb25seSB1c2VzIHRhZyBuYW1lLgorICAgIHB1YmxpYyBXcmFwcGVyUGFyYW1ldGVyKEphdmFNZXRob2RJbXBsIHBhcmVudCwgVHlwZVJlZmVyZW5jZSB0eXBlUmVmLCBNb2RlIG1vZGUsIGludCBpbmRleCkgeworICAgICAgICBzdXBlcihwYXJlbnQsIHR5cGVSZWYsIG1vZGUsIGluZGV4KTsKICAgICB9CiAKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKKyAgICAvKioKICAgICAgKgotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucnQubW9kZWwuUGFyYW1ldGVyI2lzV3JhcHBlclN0eWxlKCkKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgV2h5IGFyZSB5b3UgY2FsbGluZyBhIG1ldGhvZCB0aGF0IGFsd2F5cyByZXR1cm4gdHJ1ZT8KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyYXBwZXJTdHlsZSgpIHsKQEAgLTUzLDM2ICs3MSwzNCBAQAogICAgIC8qKgogICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3JhcHBlckNoaWxkcmVuLgogICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0V3JhcHBlckNoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh3cmFwcGVyQ2hpbGRyZW4pOworICAgIHB1YmxpYyBMaXN0PFBhcmFtZXRlckltcGw+IGdldFdyYXBwZXJDaGlsZHJlbigpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZXJDaGlsZHJlbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcGFyYW0gd3JhcHBlckNoaWxkcmVuCi0gICAgICogICAgICAgICAgICBUaGUgd3JhcHBlckNoaWxkcmVuIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRXcmFwcGVyQ2hpbGRyZW4oTGlzdDxQYXJhbWV0ZXI+IHdyYXBwZXJDaGlsZHJlbikgewotICAgICAgICB0aGlzLndyYXBwZXJDaGlsZHJlbi5hZGRBbGwod3JhcHBlckNoaWxkcmVuKTsKLSAgICB9Ci0KLSAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IGNoaWxkIHBhcmFtZXRlci4KKyAgICAgKgogICAgICAqIEBwYXJhbSB3cmFwcGVyQ2hpbGQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRXcmFwcGVyQ2hpbGQoUGFyYW1ldGVyIHdyYXBwZXJDaGlsZCkgeworICAgIHB1YmxpYyB2b2lkIGFkZFdyYXBwZXJDaGlsZChQYXJhbWV0ZXJJbXBsIHdyYXBwZXJDaGlsZCkgewogICAgICAgICB3cmFwcGVyQ2hpbGRyZW4uYWRkKHdyYXBwZXJDaGlsZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlcyB0aGUgd3JhcHBlciBjaGlsZCBmcm9tIHRoZSBnaXZlbiBpbmRleAotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIHJlbW92ZVdyYXBwZXJDaGlsZChpbnQgaW5kZXgpewotICAgICAgICByZXR1cm4gd3JhcHBlckNoaWxkcmVuLnJlbW92ZShpbmRleCk7CisgICAgICAgIC8vIG11c3QgYmluZCB0byBib2R5LiBzZWUgY2xhc3MgamF2YWRvYworICAgICAgICBhc3NlcnQgd3JhcHBlckNoaWxkLmdldEJpbmRpbmcoKT09IFBhcmFtZXRlckJpbmRpbmcuQk9EWTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpewogICAgICAgICB3cmFwcGVyQ2hpbGRyZW4uY2xlYXIoKTsKICAgICB9Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiB3cmFwcGVyQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgZmlsbFR5cGVzKExpc3Q8VHlwZVJlZmVyZW5jZT4gdHlwZXMpIHsKKyAgICAgICAgc3VwZXIuZmlsbFR5cGVzKHR5cGVzKTsKKyAgICAgICAgaWYoZ2V0UGFyZW50KCkuZ2V0QmluZGluZygpLmlzUnBjTGl0KCkpIHsKKyAgICAgICAgICAgIC8vIGZvciBycGMvbGl0LCB3ZSBuZWVkIHRvIGluZGl2aWR1YWxseSBtYXJzaGFsL3VubWFyc2hhbCB3cmFwcGVkIHZhbHVlcywKKyAgICAgICAgICAgIC8vIHNvIHRoZWlyIFR5cGVSZWZlcmVuY2UgbmVlZHMgdG8gYmUgY29sbGVjdGVkCisgICAgICAgICAgICBhc3NlcnQgZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGU9PUNvbXBvc2l0ZVN0cnVjdHVyZS5jbGFzczsKKyAgICAgICAgICAgIGZvciAoUGFyYW1ldGVySW1wbCBwIDogd3JhcHBlckNoaWxkcmVuKQorICAgICAgICAgICAgICAgIHAuZmlsbFR5cGVzKHR5cGVzKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3NvYXAvU09BUEJpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3NvYXAvU09BUEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyMWJlNi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9zb2FwL1NPQVBCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUFZlcnNpb247Ci0KLS8qKgotICogQmluZGluZyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHNvYXA6YmluZGluZwotICoKLSAgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQotICovCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmcgewotICAgIHB1YmxpYyBTT0FQQmluZGluZygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEJpbmRpbmcoU09BUEJpbmRpbmcgc2IpewotICAgICAgICB0aGlzLnVzZSA9IHNiLnVzZTsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHNiLnN0eWxlOwotICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gc2Iuc29hcFZlcnNpb247Ci0gICAgICAgIHRoaXMuc29hcEFjdGlvbiA9IHNiLnNvYXBBY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1c2UuCi0gICAgICovCi0gICAgcHVibGljIFVzZSBnZXRVc2UoKSB7Ci0gICAgICAgIHJldHVybiB1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHVzZQotICAgICAqICAgICAgICAgICAgVGhlIHVzZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlKFVzZSB1c2UpIHsKLSAgICAgICAgdGhpcy51c2UgPSB1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdHlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3R5bGUgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKiAgICAgICAgICAgIFRoZSBzdHlsZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgc3R5bGUpIHsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U09BUFZlcnNpb24oU09BUFZlcnNpb24gdmVyc2lvbikgewotICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBTT0FQVmVyc2lvbiBvZiB0aGlzIFNPQVBCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIFNPQVBWZXJzaW9uIGdldFNPQVBWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gc29hcFZlcnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBkb2N1bWVudC9saXRlcmFsIFNPQVBCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2NMaXQoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQpICYmIHVzZS5lcXVhbHMoVXNlLkxJVEVSQUwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcnBjL2xpdGVyYWwgU09BUEJpbmRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JwY0xpdCgpIHsKLSAgICAgICAgcmV0dXJuIHN0eWxlLmVxdWFscyhTdHlsZS5SUEMpICYmIHVzZS5lcXVhbHMoVXNlLkxJVEVSQUwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHNvYXBBY3Rpb24gaGVhZGVyIHZhbHVlLiBJdCdzIGFsd2F5cyBub24tbnVsbC4gc29hcAotICAgICAqICAgICAgICAgbWVzc2FnZSBzZXJpYWxpemVyIG5lZWRzIHRvIGdlbmVyYXRlZCBTT0FQQWN0aW9uIEhUVFAgaGVhZGVyIHdpdGgKLSAgICAgKiAgICAgICAgIHRoZSByZXR1cm4gb2YgdGhpcyBtZXRob2QgZW5jbG9zZWQgaW4gcXVvdGVzKCIiKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNPQVBBY3Rpb24oKSB7Ci0gICAgICAgIGlmIChzb2FwQWN0aW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiBzb2FwQWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzb2FwQWN0aW9uCi0gICAgICogICAgICAgICAgICBUaGUgc29hcEFjdGlvbiB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U09BUEFjdGlvbihTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICB0aGlzLnNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgU3R5bGUgc3R5bGUgPSBTdHlsZS5ET0NVTUVOVDsKLQotICAgIHByaXZhdGUgVXNlIHVzZSA9IFVzZS5MSVRFUkFMOwotCi0gICAgcHJpdmF0ZSBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiA9IFNPQVBWZXJzaW9uLlNPQVBfMTE7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzb2FwQWN0aW9uOwotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9zb2FwL1NPQVBCaW5kaW5nSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvc29hcC9TT0FQQmluZGluZ0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTA3YzllCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvc29hcC9TT0FQQmluZGluZ0ltcGwuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXA7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuc29hcC5TT0FQQmluZGluZzsKK2ltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CisKKy8qKgorICogQSB3c2RsOm9wZWFydGlvbiBiaW5kaW5nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgc29hcDpiaW5kaW5nLiBUaGlzIGNhbiBiZQorICogdGhlIHJldHVybiBvZiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLkphdmFNZXRob2QjZ2V0QmluZGluZygpfS4KKyAqIDxwLz4KKyAqIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYWx3YXlzIGRvY3VtZW50L2xpdGVyYWwgYW5kIFNvYXBWZXJzaW9uIGlzIFNPQVAgMS4xLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0ltcGwgZXh0ZW5kcyBTT0FQQmluZGluZyB7CisgICAgcHVibGljIFNPQVBCaW5kaW5nSW1wbCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU09BUEJpbmRpbmdJbXBsKFNPQVBCaW5kaW5nIHNiKSB7CisgICAgICAgIHRoaXMudXNlID0gc2IuZ2V0VXNlKCk7CisgICAgICAgIHRoaXMuc3R5bGUgPSBzYi5nZXRTdHlsZSgpOworICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gc2IuZ2V0U09BUFZlcnNpb24oKTsKKyAgICAgICAgdGhpcy5zb2FwQWN0aW9uID0gc2IuZ2V0U09BUEFjdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIHN0eWxlKSB7CisgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNPQVBWZXJzaW9uKFNPQVBWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHNvYXBBY3Rpb24gVGhlIHNvYXBBY3Rpb24gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNPQVBBY3Rpb24oU3RyaW5nIHNvYXBBY3Rpb24pIHsKKyAgICAgICAgdGhpcy5zb2FwQWN0aW9uID0gc29hcEFjdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9zb2FwL1NPQVBSdW50aW1lTW9kZWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3NvYXAvU09BUFJ1bnRpbWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODQwNWI1Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3NvYXAvU09BUFJ1bnRpbWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXA7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5SYXdBY2Nlc3NvcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5UeXBlUmVmZXJlbmNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuU09BUFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5qYXhiLkpBWEJCcmlkZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuUnBjTGl0UGF5bG9hZDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5Cb2R5QmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5IZWFkZXJCbG9jazsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkludGVybmFsTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2UuKjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TZXJ2ZXJSdEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQ3JlYXRlcyBTT0FQIHNwZWNpZmljIFJ1bnRpbWVNb2RlbAotICoKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQUnVudGltZU1vZGVsIGV4dGVuZHMgUnVudGltZU1vZGVsIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZURlY29kZXJJbmZvKCkgewotICAgICAgICBDb2xsZWN0aW9uPEphdmFNZXRob2Q+IG1ldGhvZHMgPSBnZXRKYXZhTWV0aG9kcygpOwotICAgICAgICBmb3IgKEphdmFNZXRob2QgbSA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmKG0uaXNBc3luYygpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZykgbS5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBzZXREZWNvZGVySW5mbyhtLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCksIGJpbmRpbmcsIE1vZGUuSU4pOwotICAgICAgICAgICAgc2V0RGVjb2RlckluZm8obS5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKSwgYmluZGluZywgTW9kZS5PVVQpOwotICAgICAgICAgICAgZm9yKENoZWNrZWRFeGNlcHRpb24gY2U6bS5nZXRDaGVja2VkRXhjZXB0aW9ucygpKXsKLSAgICAgICAgICAgICAgICBKQVhCQnJpZGdlSW5mbyBiaSA9IG5ldyBKQVhCQnJpZGdlSW5mbyhnZXRCcmlkZ2UoY2UuZ2V0RGV0YWlsVHlwZSgpKSk7Ci0gICAgICAgICAgICAgICAgYWRkRGVjb2RlckluZm8oY2UuZ2V0RGV0YWlsVHlwZSgpLnRhZ05hbWUsIGJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlY29kZXJJbmZvKExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMsIFNPQVBCaW5kaW5nIGJpbmRpbmcsIE1vZGUgbW9kZSl7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1zKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBhcmFtQmluZGluZyA9IChtb2RlID09IE1vZGUuSU4pP3BhcmFtLmdldEluQmluZGluZygpOnBhcmFtLmdldE91dEJpbmRpbmcoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbUJpbmRpbmcuaXNCb2R5KCkgJiYgYmluZGluZy5pc1JwY0xpdCgpKSB7Ci0gICAgICAgICAgICAgICAgUnBjTGl0UGF5bG9hZCBwYXlsb2FkID0gbmV3IFJwY0xpdFBheWxvYWQocGFyYW0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBXcmFwcGVyUGFyYW1ldGVyIHdwID0gKFdyYXBwZXJQYXJhbWV0ZXIpIHBhcmFtOwotICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHAgOiB3cC5nZXRXcmFwcGVyQ2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICBpZihwLmdldEJpbmRpbmcoKS5pc1VuYm91bmQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBKQVhCQnJpZGdlSW5mbyBiaSA9IG5ldyBKQVhCQnJpZGdlSW5mbyhnZXRCcmlkZ2UocC5nZXRUeXBlUmVmZXJlbmNlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWRkUGFyYW1ldGVyKGJpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkRGVjb2RlckluZm8ocGFyYW0uZ2V0TmFtZSgpLCBwYXlsb2FkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSkFYQkJyaWRnZUluZm8gYmkgPSBuZXcgSkFYQkJyaWRnZUluZm8oZ2V0QnJpZGdlKHBhcmFtLmdldFR5cGVSZWZlcmVuY2UoKSksCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgIGFkZERlY29kZXJJbmZvKHBhcmFtLmdldE5hbWUoKSwgYmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFJ1bnRpbWVNb2RlbCNwb3B1bGF0ZU1hcHMoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFwcygpIHsKLSAgICAgICAgaW50IGVtcHR5Qm9keUNvdW50ID0gMDsKLSAgICAgICAgZm9yKEphdmFNZXRob2Qgam06Z2V0SmF2YU1ldGhvZHMoKSl7Ci0gICAgICAgICAgICBwdXQoam0uZ2V0TWV0aG9kKCksIGptKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYm9keUZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IoUGFyYW1ldGVyIHA6am0uZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSl7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBiaW5kaW5nID0gcC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYoYmluZGluZy5pc0JvZHkoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHB1dChwLmdldE5hbWUoKSwgam0pOwotICAgICAgICAgICAgICAgICAgICBib2R5Rm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFib2R5Rm91bmQpewotICAgICAgICAgICAgICAgIHB1dChlbXB0eUJvZHlOYW1lLCBqbSk7Ci0vLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkIGVtcHR5IGJvZHkgZm9yOiAiK2ptLmdldE1ldGhvZCgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZW1wdHlCb2R5Q291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihlbXB0eUJvZHlDb3VudCA+IDEpewotICAgICAgICAgICAgLy9UT0RPIHRocm93IGV4Y2VwdGlvbgotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBVbnFpdWUgc2lnbmF0dXJlIHZpb2xhdGlvbiAtIG1vcmUgdGhhbiAxIGVtcHR5IGJvZHkhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQHNlZSBSdW50aW1lTW9kZWwjZmlsbFR5cGVzKEphdmFNZXRob2QsIExpc3QpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbFR5cGVzKEphdmFNZXRob2QgbSwgTGlzdDxUeXBlUmVmZXJlbmNlPiB0eXBlcykgewotICAgICAgICBpZighKG0uZ2V0QmluZGluZygpIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpKXsKLSAgICAgICAgICAgIC8vVE9ETyB0aHJvd3MgZXhjZXB0aW9uCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBXcm9uZyBCaW5kaW5nISIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmKCgoU09BUEJpbmRpbmcpbS5nZXRCaW5kaW5nKCkpLmlzRG9jTGl0KCkpewotICAgICAgICAgICAgc3VwZXIuZmlsbFR5cGVzKG0sIHR5cGVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZWxzZSBpcyBycGNsaXQKLSAgICAgICAgYWRkVHlwZXMobS5nZXRSZXF1ZXN0UGFyYW1ldGVycygpLCB0eXBlcywgTW9kZS5JTik7Ci0gICAgICAgIGFkZFR5cGVzKG0uZ2V0UmVzcG9uc2VQYXJhbWV0ZXJzKCksIHR5cGVzLCBNb2RlLk9VVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmFtcwotICAgICAqIEBwYXJhbSB0eXBlcwotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFR5cGVzKExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMsIExpc3Q8VHlwZVJlZmVyZW5jZT4gdHlwZXMsIE1vZGUgbW9kZSkgewotICAgICAgICBmb3IoUGFyYW1ldGVyIHA6cGFyYW1zKXsKLSAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgYmluZGluZyA9IChtb2RlID09IE1vZGUuSU4pP3AuZ2V0SW5CaW5kaW5nKCk6cC5nZXRPdXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBpZighcC5pc1dyYXBwZXJTdHlsZSgpKXsKLSAgICAgICAgICAgICAgICB0eXBlcy5hZGQocC5nZXRUeXBlUmVmZXJlbmNlKCkpOwotICAgICAgICAgICAgfWVsc2UgaWYoYmluZGluZy5pc0JvZHkoKSl7Ci0gICAgICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHdjUGFyYW1zID0gKChXcmFwcGVyUGFyYW1ldGVyKXApLmdldFdyYXBwZXJDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIGZvcihQYXJhbWV0ZXIgd2M6d2NQYXJhbXMpewotICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGQod2MuZ2V0VHlwZVJlZmVyZW5jZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGdldEtub3duSGVhZGVycygpIHsKLSAgICAgICAgU2V0PFFOYW1lPiBoZWFkZXJzID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7Ci0gICAgICAgIEl0ZXJhdG9yPEphdmFNZXRob2Q+IG1ldGhvZHMgPSBnZXRKYXZhTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChtZXRob2RzLmhhc05leHQoKSkgewotICAgICAgICAgICAgSmF2YU1ldGhvZCBtZXRob2QgPSBtZXRob2RzLm5leHQoKTsKLSAgICAgICAgICAgIC8vIGZpbGwgaW4gcmVxdWVzdCBoZWFkZXJzCi0gICAgICAgICAgICBJdGVyYXRvcjxQYXJhbWV0ZXI+IHBhcmFtcyA9IG1ldGhvZC5nZXRSZXF1ZXN0UGFyYW1ldGVycygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBmaWxsSGVhZGVycyhwYXJhbXMsIGhlYWRlcnMsIE1vZGUuSU4pOwotCi0gICAgICAgICAgICAvLyBmaWxsIGluIHJlc3BvbnNlIGhlYWRlcnMKLSAgICAgICAgICAgIHBhcmFtcyA9IG1ldGhvZC5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgZmlsbEhlYWRlcnMocGFyYW1zLCBoZWFkZXJzLCBNb2RlLk9VVCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmFtcwotICAgICAqIEBwYXJhbSBoZWFkZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxIZWFkZXJzKEl0ZXJhdG9yPFBhcmFtZXRlcj4gcGFyYW1zLCBTZXQ8UU5hbWU+IGhlYWRlcnMsIE1vZGUgbW9kZSkgewotICAgICAgICB3aGlsZSAocGFyYW1zLmhhc05leHQoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1zLm5leHQoKTsKLSAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgYmluZGluZyA9IChtb2RlID09IE1vZGUuSU4pP3BhcmFtLmdldEluQmluZGluZygpOnBhcmFtLmdldE91dEJpbmRpbmcoKTsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJhbS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZy5pc0hlYWRlcigpICYmICFoZWFkZXJzLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVycy5hZGQobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgc2VydmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogQHBhcmFtIGFjdG9yCi0gICAgICogQHBhcmFtIGRldGFpbAotICAgICAqIEBwYXJhbSBpbnRlcm5hbE1zZwotICAgICAqIEByZXR1cm4gdGhlIEludGVybmFsTWVzc2FnZSBmb3IgYSBmYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW50ZXJuYWxNZXNzYWdlIGNyZWF0ZUZhdWx0SW5Cb2R5KE9iamVjdCBvYmosIFN0cmluZyBhY3RvciwKLSAgICAgICAgICAgIE9iamVjdCBkZXRhaWwsIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1zZykgewotICAgICAgICBTT0FQRmF1bHRJbmZvIGZhdWx0SW5mbzsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNPQVBGYXVsdEluZm8pIHsKLSAgICAgICAgICAgIGZhdWx0SW5mbyA9IChTT0FQRmF1bHRJbmZvKW9iajsKLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2ZXJSdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gKChTZXJ2ZXJSdEV4Y2VwdGlvbilvYmopLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdGggPSAoY2F1c2UgPT0gbnVsbCkgPyAoU2VydmVyUnRFeGNlcHRpb24pb2JqIDogY2F1c2U7Ci0gICAgICAgICAgICBmYXVsdEluZm8gPSBjcmVhdGVTT0FQRmF1bHRJbmZvKHRoLCBhY3RvciwgZGV0YWlsKTsKLQotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIGUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKW9iajsKLSAgICAgICAgICAgIGZhdWx0SW5mbyA9IG5ldyBTT0FQRmF1bHRJbmZvKGUuZ2V0RmF1bHQoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU09BUFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbikgewotICAgICAgICAgICAgUU5hbWUgZmF1bHRDb2RlID0gU09BUENvbnN0YW50cy5GQVVMVF9DT0RFX1ZFUlNJT05fTUlTTUFUQ0g7Ci0gICAgICAgICAgICBTdHJpbmcgZmF1bHRTdHJpbmcgPSAiU09BUCBlbnZlbG9wZSB2ZXJzaW9uIG1pc21hdGNoIjsKLSAgICAgICAgICAgIGZhdWx0SW5mbyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNPQVBGYXVsdEluZm8oZmF1bHRTdHJpbmcsIGZhdWx0Q29kZSwgYWN0b3IsIG51bGwsIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBmYXVsdEluZm8gPSBjcmVhdGVTT0FQRmF1bHRJbmZvKChFeGNlcHRpb24pb2JqLCBhY3RvciwgZGV0YWlsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFFOYW1lIGZhdWx0Q29kZSA9IFNPQVBDb25zdGFudHMuRkFVTFRfQ09ERV9TRVJWRVI7Ci0gICAgICAgICAgICBTdHJpbmcgZmF1bHRTdHJpbmcgPSAiVW5rbm93biBmYXVsdCB0eXBlOiIrb2JqLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBmYXVsdEluZm8gPQotICAgICAgICAgICAgICAgIG5ldyBTT0FQRmF1bHRJbmZvKGZhdWx0U3RyaW5nLCBmYXVsdENvZGUsIGFjdG9yLCBudWxsLGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW50ZXJuYWxNc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZXJuYWxNc2cgPSBuZXcgSW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBCb2R5QmxvY2sgYm9keUJsb2NrID0gaW50ZXJuYWxNc2cuZ2V0Qm9keSgpOwotICAgICAgICBpZiAoYm9keUJsb2NrID09IG51bGwpIHsKLSAgICAgICAgICAgIGJvZHlCbG9jayA9IG5ldyBCb2R5QmxvY2soZmF1bHRJbmZvKTsKLSAgICAgICAgICAgIGludGVybmFsTXNnLnNldEJvZHkoYm9keUJsb2NrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvZHlCbG9jay5zZXRGYXVsdEluZm8oZmF1bHRJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbnRlcm5hbE1zZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEludGVybmFsTWVzc2FnZSBjcmVhdGVTT0FQMTJGYXVsdEluQm9keShPYmplY3Qgb2JqLCBTdHJpbmcgcm9sZSwgU3RyaW5nIG5vZGUsIE9iamVjdCBkZXRhaWwsIEludGVybmFsTWVzc2FnZSBpbSkgewotICAgICAgICBTT0FQMTJGYXVsdEluZm8gZmF1bHRJbmZvOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU09BUDEyRmF1bHRJbmZvKSB7Ci0gICAgICAgICAgICBmYXVsdEluZm8gPSAoU09BUDEyRmF1bHRJbmZvKW9iajsKLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2ZXJSdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gKChTZXJ2ZXJSdEV4Y2VwdGlvbilvYmopLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdGggPSAoY2F1c2UgPT0gbnVsbCkgPyAoU2VydmVyUnRFeGNlcHRpb24pb2JqIDogY2F1c2U7Ci0gICAgICAgICAgICBmYXVsdEluZm8gPSBjcmVhdGVTT0FQMTJGYXVsdEluZm8odGgsIHJvbGUsIG5vZGUsIGRldGFpbCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbilvYmo7Ci0gICAgICAgICAgICBmYXVsdEluZm8gPSBuZXcgU09BUDEyRmF1bHRJbmZvKGUuZ2V0RmF1bHQoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU09BUFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbikgewotICAgICAgICAgICAgU3RyaW5nIGZhdWx0U3RyaW5nID0gIlNPQVAgZW52ZWxvcGUgdmVyc2lvbiBtaXNtYXRjaCI7Ci0gICAgICAgICAgICBGYXVsdENvZGUgY29kZSA9IG5ldyBGYXVsdENvZGUoRmF1bHRDb2RlRW51bS5WZXJzaW9uTWlzbWF0Y2gsIChGYXVsdFN1YmNvZGUpIG51bGwpOwotICAgICAgICAgICAgRmF1bHRSZWFzb24gcmVhc29uID0gbmV3IEZhdWx0UmVhc29uKG5ldyBGYXVsdFJlYXNvblRleHQoZmF1bHRTdHJpbmcsIExvY2FsZS5nZXREZWZhdWx0KCkpKTsKLSAgICAgICAgICAgIGZhdWx0SW5mbyA9IG5ldyBTT0FQMTJGYXVsdEluZm8oY29kZSwgcmVhc29uLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIGZhdWx0SW5mbyA9IGNyZWF0ZVNPQVAxMkZhdWx0SW5mbygoRXhjZXB0aW9uKW9iaiwgcm9sZSwgbm9kZSwgZGV0YWlsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBmYXVsdFN0cmluZyA9ICJVbmtub3duIGZhdWx0IHR5cGU6IitvYmouZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIEZhdWx0Q29kZSBjb2RlID0gbmV3IEZhdWx0Q29kZShGYXVsdENvZGVFbnVtLlJlY2VpdmVyLCAoRmF1bHRTdWJjb2RlKSBudWxsKTsKLSAgICAgICAgICAgIEZhdWx0UmVhc29uIHJlYXNvbiA9IG5ldyBGYXVsdFJlYXNvbihuZXcgRmF1bHRSZWFzb25UZXh0KGZhdWx0U3RyaW5nLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKSk7Ci0gICAgICAgICAgICBmYXVsdEluZm8gPSBuZXcgU09BUDEyRmF1bHRJbmZvKGNvZGUsIHJlYXNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGltID09IG51bGwpIHsKLSAgICAgICAgICAgIGltID0gbmV3IEludGVybmFsTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIEJvZHlCbG9jayBib2R5QmxvY2sgPSBpbS5nZXRCb2R5KCk7Ci0gICAgICAgIGlmIChib2R5QmxvY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgYm9keUJsb2NrID0gbmV3IEJvZHlCbG9jayhmYXVsdEluZm8pOwotICAgICAgICAgICAgaW0uc2V0Qm9keShib2R5QmxvY2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9keUJsb2NrLnNldFZhbHVlKGZhdWx0SW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltOwotICAgIH0KLQotICAgIC8vIGN1cnJlbnRseSBhZGRzIG5vdCB1bmRlcnN0b29kIGhlYWRlciBibG9ja3MgaWYgdGhlcmUgYXJlIGFueQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRIZWFkZXJzKEludGVybmFsTWVzc2FnZSBtZXNzYWdlLCBNZXNzYWdlSW5mbyBtaSkgewotICAgICAgICBTZXQ8SGVhZGVyQmxvY2s+IG5vdFVuZGVyc3Rvb2RIZWFkZXJzID0KLSAgICAgICAgICAgIE1lc3NhZ2VJbmZvVXRpbC5nZXROb3RVbmRlcnN0b29kSGVhZGVycyhtaSk7Ci0gICAgICAgIGlmIChub3RVbmRlcnN0b29kSGVhZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEhlYWRlckJsb2NrIGJsb2NrIDogbm90VW5kZXJzdG9vZEhlYWRlcnMpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZEhlYWRlcihibG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTT0FQMTJGYXVsdEluZm8gY3JlYXRlU09BUDEyRmF1bHRJbmZvKFRocm93YWJsZSBlLCBTdHJpbmcgcm9sZSwgU3RyaW5nIG5vZGUsIE9iamVjdCBkZXRhaWwpIHsKLSAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNvYXBGYXVsdEV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIEZhdWx0Q29kZSBjb2RlID0gbnVsbDsKLSAgICAgICAgRmF1bHRSZWFzb24gcmVhc29uID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGZhdWx0Um9sZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmYXVsdE5vZGUgPSBudWxsOwotICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBzb2FwRmF1bHRFeGNlcHRpb24gPSAoU09BUEZhdWx0RXhjZXB0aW9uKWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2F1c2UgIT0gbnVsbCAmJiBjYXVzZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgc29hcEZhdWx0RXhjZXB0aW9uID0gKFNPQVBGYXVsdEV4Y2VwdGlvbillLmdldENhdXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvYXBGYXVsdEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gIHNvYXBGYXVsdEV4Y2VwdGlvbi5nZXRGYXVsdCgpOwotICAgICAgICAgICAgY29kZSA9IG5ldyBGYXVsdENvZGUoRmF1bHRDb2RlRW51bS5nZXQoc29hcEZhdWx0LmdldEZhdWx0Q29kZUFzUU5hbWUoKSksIChGYXVsdFN1YmNvZGUpIG51bGwpOwotICAgICAgICAgICAgcmVhc29uID0gbmV3IEZhdWx0UmVhc29uKG5ldyBGYXVsdFJlYXNvblRleHQoc29hcEZhdWx0LmdldEZhdWx0U3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZ0xvY2FsZSgpKSk7Ci0gICAgICAgICAgICBmYXVsdFJvbGUgPSBzb2FwRmF1bHQuZ2V0RmF1bHRSb2xlKCk7Ci0gICAgICAgICAgICBpZihmYXVsdFJvbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmYXVsdFJvbGUgPSByb2xlOwotICAgICAgICAgICAgZmF1bHROb2RlID0gc29hcEZhdWx0LmdldEZhdWx0Tm9kZSgpOwotICAgICAgICAgICAgaWYoZmF1bHROb2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgZmF1bHROb2RlID0gbm9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2RlID09IG51bGwgfHwgKChjb2RlICE9IG51bGwpICYmIGNvZGUuZ2V0VmFsdWUoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgY29kZSA9IG5ldyBGYXVsdENvZGUoRmF1bHRDb2RlRW51bS5SZWNlaXZlciwgKEZhdWx0U3ViY29kZSkgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZWFzb24gPT0gbnVsbCl7Ci0gICAgICAgICAgICBTdHJpbmcgZmF1bHRTdHJpbmcgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmIChmYXVsdFN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRTdHJpbmcgPSBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlYXNvbiA9IG5ldyBGYXVsdFJlYXNvbihuZXcgRmF1bHRSZWFzb25UZXh0KGZhdWx0U3RyaW5nLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGRldGFpbCA9PSBudWxsKSAmJiAoc29hcEZhdWx0RXhjZXB0aW9uICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBkZXRhaWwgPSBzb2FwRmF1bHRFeGNlcHRpb24uZ2V0RmF1bHQoKS5nZXREZXRhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU09BUDEyRmF1bHRJbmZvKGNvZGUsIHJlYXNvbiwgZmF1bHRSb2xlLCBmYXVsdE5vZGUsIGRldGFpbCk7Ci0gICAgfQotCi0gICAgLy9UT0RPOiBjcmVhdGVTT0FQMTJIZWFkZXJGYXVsdCgpCi0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiBAcGFyYW0gYWN0b3IKLSAgICAgKiBAcGFyYW0gZGV0YWlsQmxvY2sKLSAgICAgKiBAcGFyYW0gaW50ZXJuYWxNc2cKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5JbnRlcmFsTWVzc2FnZTwvY29kZT4gZm9yIGEgSGVhZGVyRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEludGVybmFsTWVzc2FnZSBjcmVhdGVIZWFkZXJGYXVsdChPYmplY3Qgb2JqLCBTdHJpbmcgYWN0b3IsIEpBWEJCcmlkZ2VJbmZvIGRldGFpbEJsb2NrLCBJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNc2cpewotICAgICAgICAvL2l0cyBoZWFkZXJmYXVsdCBzbywgY3JlYXRlIGJvZHkgZmF1bHQgd2l0aCBubyBkZXRhaWwuIGRldGFpbCBvYmplY3QgZ29lcyBhcyBhIGhlYWRlciBibG9jawotICAgICAgICBpbnRlcm5hbE1zZyA9IGNyZWF0ZUZhdWx0SW5Cb2R5KG9iaiwgYWN0b3IsIG51bGwsIGludGVybmFsTXNnKTsKLSAgICAgICAgSGVhZGVyQmxvY2sgaGRyQmxvY2sgPSBuZXcgSGVhZGVyQmxvY2soZGV0YWlsQmxvY2spOwotICAgICAgICBpbnRlcm5hbE1zZy5hZGRIZWFkZXIoaGRyQmxvY2spOwotICAgICAgICByZXR1cm4gaW50ZXJuYWxNc2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGUKLSAgICAgKiBAcGFyYW0gYWN0b3IKLSAgICAgKiBAcGFyYW0gZGV0YWlsCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFNPQVBGYXVsdEluZm8gY3JlYXRlU09BUEZhdWx0SW5mbyhUaHJvd2FibGUgZSwgU3RyaW5nIGFjdG9yLAotICAgICAgICAgICAgT2JqZWN0IGRldGFpbCkgewotLy8gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzb2FwRmF1bHRFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBRTmFtZSBmYXVsdENvZGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgZmF1bHRTdHJpbmcgPSBudWxsOwotICAgICAgICBTdHJpbmcgZmF1bHRBY3RvciA9IG51bGw7Ci0gICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdEV4Y2VwdGlvbiA9IChTT0FQRmF1bHRFeGNlcHRpb24pZTsKLSAgICAgICAgfSBlbHNlIGlmIChjYXVzZSAhPSBudWxsICYmIGNhdXNlIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBzb2FwRmF1bHRFeGNlcHRpb24gPSAoU09BUEZhdWx0RXhjZXB0aW9uKWUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc29hcEZhdWx0RXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0Q29kZSA9IHNvYXBGYXVsdEV4Y2VwdGlvbi5nZXRGYXVsdCgpLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsKLSAgICAgICAgICAgIGZhdWx0U3RyaW5nID0gc29hcEZhdWx0RXhjZXB0aW9uLmdldEZhdWx0KCkuZ2V0RmF1bHRTdHJpbmcoKTsKLSAgICAgICAgICAgIGZhdWx0QWN0b3IgPSBzb2FwRmF1bHRFeGNlcHRpb24uZ2V0RmF1bHQoKS5nZXRGYXVsdEFjdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0Q29kZSA9IFNPQVBDb25zdGFudHMuRkFVTFRfQ09ERV9TRVJWRVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmF1bHRTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgZmF1bHRTdHJpbmcgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmIChmYXVsdFN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRTdHJpbmcgPSBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmF1bHRBY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdEFjdG9yID0gYWN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGV0YWlsID09IG51bGwgJiYgc29hcEZhdWx0RXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRldGFpbCA9IHNvYXBGYXVsdEV4Y2VwdGlvbi5nZXRGYXVsdCgpLmdldERldGFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQRmF1bHRJbmZvKGZhdWx0U3RyaW5nLCBmYXVsdENvZGUsIGZhdWx0QWN0b3IsIGRldGFpbCwgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3NvYXAvU3R5bGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3NvYXAvU3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1YzIwYy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9zb2FwL1N0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwOwotCi0vKioKLSAqIEBhdXRob3IgVml2ZWsgUGFuZGV5Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgZW51bSBTdHlsZSB7Ci0gICAgRE9DVU1FTlQoMCksIFJQQygxKTsKLQotICAgIHByaXZhdGUgU3R5bGUoaW50IHN0eWxlKXsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3R5bGU7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9zb2FwL1VzZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvc29hcC9Vc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5ODQ3Yy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC9zb2FwL1VzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcDsKLQotLyoqCi0gKiBAYXV0aG9yIFZpdmVrIFBhbmRleQotICoKLSAqLwotcHVibGljIGVudW0gVXNlIHsKLSAgICBMSVRFUkFMKDApLCBFTkNPREVEKDEpOwotCi0gICAgcHJpdmF0ZSBVc2UoaW50IHVzZSl7Ci0gICAgICAgIHRoaXMudXNlID0gdXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB1c2U7Ci0gICAgfQotICAgIHByaXZhdGUgZmluYWwgaW50IHVzZTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvQWJzdHJhY3RFeHRlbnNpYmxlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9BYnN0cmFjdEV4dGVuc2libGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0ZWYzNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvQWJzdHJhY3RFeHRlbnNpYmxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExFeHRlbnNpYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE9iamVjdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuVXRpbE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLldTRExDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTG9jYXRvckltcGw7CisKKy8qKgorICogQWxsIHRoZSBXU0RMIDEuMSBlbGVtZW50cyB0aGF0IGFyZSBleHRlbnNpYmxlIHNob3VsZCBzdWJjbGFzcyBmcm9tIHRoaXMgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YKKyAqIHtAbGluayBXU0RMRXh0ZW5zaWJsZX0gaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0RXh0ZW5zaWJsZUltcGwgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdEltcGwgaW1wbGVtZW50cyBXU0RMRXh0ZW5zaWJsZSB7CisgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxXU0RMRXh0ZW5zaW9uPiBleHRlbnNpb25zID0gbmV3IEhhc2hTZXQ8V1NETEV4dGVuc2lvbj4oKTsKKyAgICAvLyB0aGlzIGNhcHR1cmVzIGFueSB3c2RsIGV4dGVuc2lvbnMgdGhhdCBhcmUgbm90IHVuZGVyc3Rvb2QgYnkgV1NETEV4dGVuc2lvblBhcnNlcnMKKyAgICAvLyBhbmQgaGF2ZSB3c2RsOnJlcXVpcmVkPXRydWUKKyAgICBwcm90ZWN0ZWQgTGlzdDxVbmtub3duV1NETEV4dGVuc2lvbj4gbm90VW5kZXJzdG9vZEV4dGVuc2lvbnMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxVbmtub3duV1NETEV4dGVuc2lvbj4oKTsKKworICAgIHByb3RlY3RlZCBBYnN0cmFjdEV4dGVuc2libGVJbXBsKFhNTFN0cmVhbVJlYWRlciB4c3IpIHsKKyAgICAgICAgc3VwZXIoeHNyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFeHRlbnNpYmxlSW1wbChTdHJpbmcgc3lzdGVtSWQsIGludCBsaW5lTnVtYmVyKSB7CisgICAgICAgIHN1cGVyKHN5c3RlbUlkLCBsaW5lTnVtYmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgSXRlcmFibGU8V1NETEV4dGVuc2lvbj4gZ2V0RXh0ZW5zaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIDxUIGV4dGVuZHMgV1NETEV4dGVuc2lvbj4gSXRlcmFibGU8VD4gZ2V0RXh0ZW5zaW9ucyhDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgYSByYXRoZXIgc3R1cGlkIGltcGxlbWVudGF0aW9uCisgICAgICAgIExpc3Q8VD4gciA9IG5ldyBBcnJheUxpc3Q8VD4oZXh0ZW5zaW9ucy5zaXplKCkpOworICAgICAgICBmb3IgKFdTRExFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmKHR5cGUuaXNJbnN0YW5jZShlKSkKKyAgICAgICAgICAgICAgICByLmFkZCh0eXBlLmNhc3QoZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFdTRExFeHRlbnNpb24+IFQgZ2V0RXh0ZW5zaW9uKENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgZm9yIChXU0RMRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKSB7CisgICAgICAgICAgICBpZih0eXBlLmlzSW5zdGFuY2UoZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuY2FzdChlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oV1NETEV4dGVuc2lvbiBleCkgeworICAgICAgICBpZihleD09bnVsbCkKKyAgICAgICAgICAgIC8vIEkgZG9uJ3QgdHJ1c3QgcGx1Z2lucy4gU28gbGV0J3MgYWx3YXlzIGNoZWNrIGl0LCBpbnN0ZWFkIG9mIG1ha2luZyB0aGlzIGFuIGFzc2VydGlvbgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBleHRlbnNpb25zLmFkZChleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCBpZiBhIFdTREwgZXh0ZW5zaW9uIGVsZW1lbnQgdGhhdCBoYXMgd3NkbDpyZXF1aXJlZD10cnVlCisgICAgICogaXMgbm90IHVuZGVyc3Rvb2QKKyAgICAgKiBAcGFyYW0gZXh0bkVsCisgICAgICogQHBhcmFtIGxvY2F0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGROb3RVbmRlcnN0b29kRXh0ZW5zaW9uKFFOYW1lIGV4dG5FbCwgTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIG5vdFVuZGVyc3Rvb2RFeHRlbnNpb25zLmFkZChuZXcgVW5rbm93bldTRExFeHRlbnNpb24oZXh0bkVsLCBsb2NhdG9yKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGNsYXNzIFVua25vd25XU0RMRXh0ZW5zaW9uIGltcGxlbWVudHMgV1NETEV4dGVuc2lvbiwgV1NETE9iamVjdCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUU5hbWUgZXh0bkVsOworICAgICAgICBwcml2YXRlIGZpbmFsIExvY2F0b3IgbG9jYXRvcjsKKyAgICAgICAgcHVibGljIFVua25vd25XU0RMRXh0ZW5zaW9uKFFOYW1lIGV4dG5FbCwgTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgICAgICB0aGlzLmV4dG5FbCA9IGV4dG5FbDsKKyAgICAgICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0bkVsOworICAgICAgICB9CisgICAgICAgIEBOb3ROdWxsIHB1YmxpYyBMb2NhdG9yIGdldExvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpeworICAgICAgICAgICByZXR1cm4gZXh0bkVsICsgIiAiKyBVdGlsTWVzc2FnZXMuVVRJTF9MT0NBVElPTiggbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksIGxvY2F0b3IuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZnJlZXppbmcgdGhlIFdTRExNb2RlbAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgd3NkbCByZXF1aXJlZCBleHRlbnNpb25zIG9uIFBvcnQgYW5kIEJpbmRpbmcgYXJlIHVuZGVyc3Rvb2QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhcmVSZXF1aXJlZEV4dGVuc2lvbnNVbmRlcnN0b29kKCkgeworICAgICAgICBpZiAobm90VW5kZXJzdG9vZEV4dGVuc2lvbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIlVua25vd24gV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnRzOiIpOworICAgICAgICAgICAgZm9yIChVbmtub3duV1NETEV4dGVuc2lvbiBleHRuIDogbm90VW5kZXJzdG9vZEV4dGVuc2lvbnMpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQoZXh0bi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL0Fic3RyYWN0RmVhdHVyZWRPYmplY3RJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL0Fic3RyYWN0RmVhdHVyZWRPYmplY3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1MjdiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL0Fic3RyYWN0RmVhdHVyZWRPYmplY3RJbXBsLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGw7aW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEZlYXR1cmVkT2JqZWN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuV2ViU2VydmljZUZlYXR1cmVMaXN0OworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworCisvKioKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGZWF0dXJlZE9iamVjdEltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2libGVJbXBsIGltcGxlbWVudHMgV1NETEZlYXR1cmVkT2JqZWN0IHsKKyAgICBwcm90ZWN0ZWQgV2ViU2VydmljZUZlYXR1cmVMaXN0IGZlYXR1cmVzOworCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmVhdHVyZWRPYmplY3RJbXBsKFhNTFN0cmVhbVJlYWRlciB4c3IpIHsKKyAgICAgICAgc3VwZXIoeHNyKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmVhdHVyZWRPYmplY3RJbXBsKFN0cmluZyBzeXN0ZW1JZCwgaW50IGxpbmVOdW1iZXIpIHsKKyAgICAgICAgc3VwZXIoc3lzdGVtSWQsIGxpbmVOdW1iZXIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZEZlYXR1cmUoV2ViU2VydmljZUZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICBpZiAoZmVhdHVyZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIGZlYXR1cmVzID0gbmV3IFdlYlNlcnZpY2VGZWF0dXJlTGlzdCgpOworCisgICAgICAgIGZlYXR1cmVzLmFkZChmZWF0dXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgV2ViU2VydmljZUZlYXR1cmVMaXN0IGdldEZlYXR1cmVzKCkgeworICAgICAgICBpZihmZWF0dXJlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlRmVhdHVyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIGZlYXR1cmVzOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBXZWJTZXJ2aWNlRmVhdHVyZSBnZXRGZWF0dXJlKFN0cmluZyBpZCkgeworICAgICAgICBpZiAoZmVhdHVyZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChXZWJTZXJ2aWNlRmVhdHVyZSBmIDogZmVhdHVyZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXRJRCgpLmVxdWFscyhpZCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIDxGIGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmU+IEYgZ2V0RmVhdHVyZShATm90TnVsbCBDbGFzczxGPiBmZWF0dXJlVHlwZSkgeworICAgICAgICBpZihmZWF0dXJlcz09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXMuZ2V0KGZlYXR1cmVUeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL0Fic3RyYWN0T2JqZWN0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9BYnN0cmFjdE9iamVjdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmM0NzExCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9BYnN0cmFjdE9iamVjdEltcGwuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE9iamVjdDsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTG9jYXRvckltcGw7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworCisvKioKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPYmplY3RJbXBsIGltcGxlbWVudHMgV1NETE9iamVjdCB7CisgICAgLy8gc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGluZU51bWJlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzeXN0ZW1JZDsKKworCisgICAgLypwYWNrYWdlKi8gQWJzdHJhY3RPYmplY3RJbXBsKFhNTFN0cmVhbVJlYWRlciB4c3IpIHsKKyAgICAgICAgTG9jYXRpb24gbG9jID0geHNyLmdldExvY2F0aW9uKCk7CisgICAgICAgIHRoaXMubGluZU51bWJlciA9IGxvYy5nZXRMaW5lTnVtYmVyKCk7CisgICAgICAgIHRoaXMuc3lzdGVtSWQgPSBsb2MuZ2V0U3lzdGVtSWQoKTsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyBBYnN0cmFjdE9iamVjdEltcGwoU3RyaW5nIHN5c3RlbUlkLCBpbnQgbGluZU51bWJlcikgeworICAgICAgICB0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7CisgICAgICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIEBOb3ROdWxsIExvY2F0b3IgZ2V0TG9jYXRpb24oKSB7CisgICAgICAgIExvY2F0b3JJbXBsIGxvYyA9IG5ldyBMb2NhdG9ySW1wbCgpOworICAgICAgICBsb2Muc2V0U3lzdGVtSWQoc3lzdGVtSWQpOworICAgICAgICBsb2Muc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIGxvYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExCb3VuZE9wZXJhdGlvbkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETEJvdW5kT3BlcmF0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTRjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExCb3VuZE9wZXJhdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExPcGVyYXRpb247CisKK2ltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKK2ltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFdTRExCb3VuZE9wZXJhdGlvbn0KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaWJsZUltcGwgaW1wbGVtZW50cyBXU0RMQm91bmRPcGVyYXRpb24geworICAgIHByaXZhdGUgZmluYWwgUU5hbWUgbmFtZTsKKworICAgIC8vIG1hcCBvZiB3c2RsOnBhcnQgdG8gdGhlIGJpbmRpbmcKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBhcmFtZXRlckJpbmRpbmc+IGlucHV0UGFydHM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBQYXJhbWV0ZXJCaW5kaW5nPiBvdXRwdXRQYXJ0czsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBhcmFtZXRlckJpbmRpbmc+IGZhdWx0UGFydHM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGlucHV0TWltZVR5cGVzOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBvdXRwdXRNaW1lVHlwZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZhdWx0TWltZVR5cGVzOworCisgICAgcHJpdmF0ZSBib29sZWFuIGV4cGxpY2l0SW5wdXRTT0FQQm9keVBhcnRzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGV4cGxpY2l0T3V0cHV0U09BUEJvZHlQYXJ0cyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBleHBsaWNpdEZhdWx0U09BUEJvZHlQYXJ0cyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBCb29sZWFuIGVtcHR5SW5wdXRCb2R5OworICAgIHByaXZhdGUgQm9vbGVhbiBlbXB0eU91dHB1dEJvZHk7CisgICAgcHJpdmF0ZSBCb29sZWFuIGVtcHR5RmF1bHRCb2R5OworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBXU0RMUGFydEltcGw+IGluUGFydHM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBXU0RMUGFydEltcGw+IG91dFBhcnRzOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgV1NETFBhcnRJbXBsPiBmbHRQYXJ0czsKKyAgICBwcml2YXRlIFdTRExPcGVyYXRpb25JbXBsIG9wZXJhdGlvbjsKKyAgICBwcml2YXRlIFN0cmluZyBzb2FwQWN0aW9uOworICAgIHByaXZhdGUgQU5PTllNT1VTIGFub255bW91czsKKworICAgIHByaXZhdGUgZmluYWwgV1NETEJvdW5kUG9ydFR5cGVJbXBsIG93bmVyOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB3c2RsOm9wZXJhdGlvbiBuYW1lIHF1YWxpZmllZCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBXU0RMQm91bmRPcGVyYXRpb25JbXBsKFhNTFN0cmVhbVJlYWRlciB4c3IsIFdTRExCb3VuZFBvcnRUeXBlSW1wbCBvd25lciwgUU5hbWUgbmFtZSkgeworICAgICAgICBzdXBlcih4c3IpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBpbnB1dFBhcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXJhbWV0ZXJCaW5kaW5nPigpOworICAgICAgICBvdXRwdXRQYXJ0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGFyYW1ldGVyQmluZGluZz4oKTsKKyAgICAgICAgZmF1bHRQYXJ0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGFyYW1ldGVyQmluZGluZz4oKTsKKyAgICAgICAgaW5wdXRNaW1lVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgb3V0cHV0TWltZVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIGZhdWx0TWltZVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIGluUGFydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdTRExQYXJ0SW1wbD4oKTsKKyAgICAgICAgb3V0UGFydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdTRExQYXJ0SW1wbD4oKTsKKyAgICAgICAgZmx0UGFydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdTRExQYXJ0SW1wbD4oKTsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCl7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUEFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29hcEFjdGlvbihTdHJpbmcgc29hcEFjdGlvbikgeworICAgICAgICB0aGlzLnNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uIT1udWxsP3NvYXBBY3Rpb246IiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBhcnR9IGZvciB0aGUgZ2l2ZW4gd3NkbDppbnB1dCBvciB3c2RsOm91dHB1dCBwYXJ0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFydE5hbWUgbXVzdCBiZSBub24tbnVsbAorICAgICAqIEBwYXJhbSBtb2RlICAgICBtdXN0IGJlIG5vbi1udWxsCisgICAgICogQHJldHVybiBudWxsIGlmIG5vIHBhcnQgaXMgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgV1NETFBhcnRJbXBsIGdldFBhcnQoU3RyaW5nIHBhcnROYW1lLCBNb2RlIG1vZGUpeworICAgICAgICBpZihtb2RlPT1Nb2RlLklOKXsKKyAgICAgICAgICAgIHJldHVybiBpblBhcnRzLmdldChwYXJ0TmFtZSk7CisgICAgICAgIH1lbHNlIGlmKG1vZGU9PU1vZGUuT1VUKXsKKyAgICAgICAgICAgIHJldHVybiBvdXRQYXJ0cy5nZXQocGFydE5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFBhcnQoV1NETFBhcnRJbXBsIHBhcnQsIE1vZGUgbW9kZSl7CisgICAgICAgIGlmKG1vZGU9PU1vZGUuSU4pCisgICAgICAgICAgICBpblBhcnRzLnB1dChwYXJ0LmdldE5hbWUoKSwgcGFydCk7CisgICAgICAgIGVsc2UgaWYobW9kZT09TW9kZS5PVVQpCisgICAgICAgICAgICBvdXRQYXJ0cy5wdXQocGFydC5nZXROYW1lKCksIHBhcnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcCBvZiB3c2RsOmlucHV0IHBhcnQgbmFtZSBhbmQgdGhlIGJpbmRpbmcgYXMge0BsaW5rIFBhcmFtZXRlckJpbmRpbmd9CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVtcHR5IE1hcCBpZiB0aGVyZSBpcyBubyBwYXJ0cworICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBQYXJhbWV0ZXJCaW5kaW5nPiBnZXRJbnB1dFBhcnRzKCkgeworICAgICAgICByZXR1cm4gaW5wdXRQYXJ0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAgb2Ygd3NkbDpvdXRwdXQgcGFydCBuYW1lIGFuZCB0aGUgYmluZGluZyBhcyB7QGxpbmsgUGFyYW1ldGVyQmluZGluZ30KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW1wdHkgTWFwIGlmIHRoZXJlIGlzIG5vIHBhcnRzCisgICAgICovCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFBhcmFtZXRlckJpbmRpbmc+IGdldE91dHB1dFBhcnRzKCkgeworICAgICAgICByZXR1cm4gb3V0cHV0UGFydHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIG9mIHdzZGw6ZmF1bHQgcGFydCBuYW1lIGFuZCB0aGUgYmluZGluZyBhcyB7QGxpbmsgUGFyYW1ldGVyQmluZGluZ30KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW1wdHkgTWFwIGlmIHRoZXJlIGlzIG5vIHBhcnRzCisgICAgICovCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFBhcmFtZXRlckJpbmRpbmc+IGdldEZhdWx0UGFydHMoKSB7CisgICAgICAgIHJldHVybiBmYXVsdFBhcnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcCBvZiBtaW1lOmNvbnRlbnRAcGFydCBhbmQgdGhlIG1pbWUgdHlwZSBmcm9tIG1pbWU6Y29udGVudEB0eXBlIGZvciB3c2RsOm91dHB1dAorICAgICAqCisgICAgICogQHJldHVybiBlbXB0eSBNYXAgaWYgdGhlcmUgaXMgbm8gcGFydHMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRJbnB1dE1pbWVUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0TWltZVR5cGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcCBvZiBtaW1lOmNvbnRlbnRAcGFydCBhbmQgdGhlIG1pbWUgdHlwZSBmcm9tIG1pbWU6Y29udGVudEB0eXBlIGZvciB3c2RsOm91dHB1dAorICAgICAqCisgICAgICogQHJldHVybiBlbXB0eSBNYXAgaWYgdGhlcmUgaXMgbm8gcGFydHMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRPdXRwdXRNaW1lVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRNaW1lVHlwZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIG9mIG1pbWU6Y29udGVudEBwYXJ0IGFuZCB0aGUgbWltZSB0eXBlIGZyb20gbWltZTpjb250ZW50QHR5cGUgZm9yIHdzZGw6ZmF1bHQKKyAgICAgKgorICAgICAqIEByZXR1cm4gZW1wdHkgTWFwIGlmIHRoZXJlIGlzIG5vIHBhcnRzCisgICAgICovCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RmF1bHRNaW1lVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBmYXVsdE1pbWVUeXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHtAbGluayBQYXJhbWV0ZXJCaW5kaW5nfSBmb3IgYSBnaXZlbiB3c2RsIHBhcnQgaW4gd3NkbDppbnB1dAorICAgICAqCisgICAgICogQHBhcmFtIHBhcnQgTmFtZSBvZiB3c2RsOnBhcnQsIG11c3QgYmUgbm9uLW51bGwKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHBhcnQgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJCaW5kaW5nIGdldElucHV0QmluZGluZyhTdHJpbmcgcGFydCl7CisgICAgICAgIGlmKGVtcHR5SW5wdXRCb2R5ID09IG51bGwpeworICAgICAgICAgICAgaWYoaW5wdXRQYXJ0cy5nZXQoIiAiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVtcHR5SW5wdXRCb2R5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbXB0eUlucHV0Qm9keSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgYmxvY2sgPSBpbnB1dFBhcnRzLmdldChwYXJ0KTsKKyAgICAgICAgaWYoYmxvY2sgPT0gbnVsbCl7CisgICAgICAgICAgICBpZihleHBsaWNpdElucHV0U09BUEJvZHlQYXJ0cyB8fCBlbXB0eUlucHV0Qm9keSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyQmluZGluZy5VTkJPVU5EOworICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlckJpbmRpbmcuQk9EWTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHtAbGluayBQYXJhbWV0ZXJCaW5kaW5nfSBmb3IgYSBnaXZlbiB3c2RsIHBhcnQgaW4gd3NkbDpvdXRwdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJ0IE5hbWUgb2Ygd3NkbDpwYXJ0LCBtdXN0IGJlIG5vbi1udWxsCisgICAgICogQHJldHVybiBudWxsIGlmIHRoZSBwYXJ0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyQmluZGluZyBnZXRPdXRwdXRCaW5kaW5nKFN0cmluZyBwYXJ0KXsKKyAgICAgICAgaWYoZW1wdHlPdXRwdXRCb2R5ID09IG51bGwpeworICAgICAgICAgICAgaWYob3V0cHV0UGFydHMuZ2V0KCIgIikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlbXB0eU91dHB1dEJvZHkgPSB0cnVlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVtcHR5T3V0cHV0Qm9keSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgYmxvY2sgPSBvdXRwdXRQYXJ0cy5nZXQocGFydCk7CisgICAgICAgIGlmKGJsb2NrID09IG51bGwpeworICAgICAgICAgICAgaWYoZXhwbGljaXRPdXRwdXRTT0FQQm9keVBhcnRzIHx8IGVtcHR5T3V0cHV0Qm9keSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyQmluZGluZy5VTkJPVU5EOworICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlckJpbmRpbmcuQk9EWTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHtAbGluayBQYXJhbWV0ZXJCaW5kaW5nfSBmb3IgYSBnaXZlbiB3c2RsIHBhcnQgaW4gd3NkbDpmYXVsdAorICAgICAqCisgICAgICogQHBhcmFtIHBhcnQgTmFtZSBvZiB3c2RsOnBhcnQsIG11c3QgYmUgbm9uLW51bGwKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHBhcnQgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJCaW5kaW5nIGdldEZhdWx0QmluZGluZyhTdHJpbmcgcGFydCl7CisgICAgICAgIGlmKGVtcHR5RmF1bHRCb2R5ID09IG51bGwpeworICAgICAgICAgICAgaWYoZmF1bHRQYXJ0cy5nZXQoIiAiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVtcHR5RmF1bHRCb2R5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbXB0eUZhdWx0Qm9keSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgYmxvY2sgPSBmYXVsdFBhcnRzLmdldChwYXJ0KTsKKyAgICAgICAgaWYoYmxvY2sgPT0gbnVsbCl7CisgICAgICAgICAgICBpZihleHBsaWNpdEZhdWx0U09BUEJvZHlQYXJ0cyB8fCBlbXB0eUZhdWx0Qm9keSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyQmluZGluZy5VTkJPVU5EOworICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlckJpbmRpbmcuQk9EWTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBNSU1FIHR5cGUgZm9yIGEgZ2l2ZW4gd3NkbCBwYXJ0IGluIHdzZGw6aW5wdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJ0IE5hbWUgb2Ygd3NkbDpwYXJ0LCBtdXN0IGJlIG5vbi1udWxsCisgICAgICogQHJldHVybiBudWxsIGlmIHRoZSBwYXJ0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlRm9ySW5wdXRQYXJ0KFN0cmluZyBwYXJ0KXsKKyAgICAgICAgcmV0dXJuIGlucHV0TWltZVR5cGVzLmdldChwYXJ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBNSU1FIHR5cGUgZm9yIGEgZ2l2ZW4gd3NkbCBwYXJ0IGluIHdzZGw6b3V0cHV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFydCBOYW1lIG9mIHdzZGw6cGFydCwgbXVzdCBiZSBub24tbnVsbAorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgcGFydCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZUZvck91dHB1dFBhcnQoU3RyaW5nIHBhcnQpeworICAgICAgICByZXR1cm4gb3V0cHV0TWltZVR5cGVzLmdldChwYXJ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBNSU1FIHR5cGUgZm9yIGEgZ2l2ZW4gd3NkbCBwYXJ0IGluIHdzZGw6ZmF1bHQKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJ0IE5hbWUgb2Ygd3NkbDpwYXJ0LCBtdXN0IGJlIG5vbi1udWxsCisgICAgICogQHJldHVybiBudWxsIGlmIHRoZSBwYXJ0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlRm9yRmF1bHRQYXJ0KFN0cmluZyBwYXJ0KXsKKyAgICAgICAgcmV0dXJuIGZhdWx0TWltZVR5cGVzLmdldChwYXJ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETE9wZXJhdGlvbkltcGwgZ2V0T3BlcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gb3BlcmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElucHV0RXhwbGljaXRCb2R5UGFydHMoYm9vbGVhbiBiKSB7CisgICAgICAgIGV4cGxpY2l0SW5wdXRTT0FQQm9keVBhcnRzID0gYjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRFeHBsaWNpdEJvZHlQYXJ0cyhib29sZWFuIGIpIHsKKyAgICAgICAgZXhwbGljaXRPdXRwdXRTT0FQQm9keVBhcnRzID0gYjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdEV4cGxpY2l0Qm9keVBhcnRzKGJvb2xlYW4gYikgeworICAgICAgICBleHBsaWNpdEZhdWx0U09BUEJvZHlQYXJ0cyA9IGI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHlsZSBzdHlsZSA9IFN0eWxlLkRPQ1VNRU5UOworICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIHN0eWxlKXsKKyAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOworICAgIH0KKworICAgIHB1YmxpYyBATnVsbGFibGUgUU5hbWUgZ2V0UGF5bG9hZE5hbWUoKSB7CisgICAgICAgIGlmKHN0eWxlLmVxdWFscyhTdHlsZS5SUEMpKXsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGlmKGVtcHR5UGF5bG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaWYocGF5bG9hZE5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZE5hbWU7CisKKyAgICAgICAgICAgIFFOYW1lIGluTXNnTmFtZSA9IG9wZXJhdGlvbi5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKS5nZXROYW1lKCk7CisgICAgICAgICAgICBXU0RMTWVzc2FnZUltcGwgbWVzc2FnZSA9IG1lc3NhZ2VzLmdldChpbk1zZ05hbWUpOworICAgICAgICAgICAgZm9yKFdTRExQYXJ0SW1wbCBwYXJ0Om1lc3NhZ2UucGFydHMoKSl7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBiaW5kaW5nID0gZ2V0SW5wdXRCaW5kaW5nKHBhcnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZihiaW5kaW5nLmlzQm9keSgpKXsKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZE5hbWUgPSBwYXJ0LmdldERlc2NyaXB0b3IoKS5uYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkTmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vSXRzIGVtcHR5IHBheWxvYWQKKyAgICAgICAgICAgIGVtcHR5UGF5bG9hZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy9lbXB0eSBib2R5CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJlcU5hbWVzcGFjZTsKKyAgICBwcml2YXRlIFN0cmluZyByZXNwTmFtZXNwYWNlOworCisgICAgLyoqCisgICAgICogRm9yIHJwY2xpdCBnaXZlcyBuYW1lc3BhY2UgdmFsdWUgb24gc29hcGJpbmRpbmc6Ym9keUBuYW1lc3BhY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gICBub24tbnVsbCBmb3IgcnBjbGl0IGFuZCBudWxsIGZvciBkb2NsaXQKKyAgICAgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlJ1bnRpbWVNb2RlbGVyI3Byb2Nlc3NScGNNZXRob2QoY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuSmF2YU1ldGhvZEltcGwsIFN0cmluZywgamF2YXguandzLldlYk1ldGhvZCwgU3RyaW5nLCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QsIGphdmF4Lmp3cy5XZWJTZXJ2aWNlKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE5hbWVzcGFjZSgpeworICAgICAgICByZXR1cm4gcmVxTmFtZXNwYWNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3ROYW1lc3BhY2UoU3RyaW5nIG5zKXsKKyAgICAgICAgcmVxTmFtZXNwYWNlID0gbnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGb3IgcnBjbGl0IGdpdmVzIG5hbWVzcGFjZSB2YWx1ZSBvbiBzb2FwYmluZGluZzpib2R5QG5hbWVzcGFjZQorICAgICAqCisgICAgICogQHJldHVybiAgIG5vbi1udWxsIGZvciBycGNsaXQgYW5kIG51bGwgZm9yIGRvY2xpdAorICAgICAqICAgICAgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsZXIuUnVudGltZU1vZGVsZXIjcHJvY2Vzc1JwY01ldGhvZChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5KYXZhTWV0aG9kLCBTdHJpbmcsIGphdmF4Lmp3cy5XZWJNZXRob2QsIFN0cmluZywgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLCBqYXZheC5qd3MuV2ViU2VydmljZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlTmFtZXNwYWNlKCl7CisgICAgICAgIHJldHVybiByZXNwTmFtZXNwYWNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3BvbnNlTmFtZXNwYWNlKFN0cmluZyBucyl7CisgICAgICAgIHJlc3BOYW1lc3BhY2UgPSBuczsKKyAgICB9CisKKyAgICBXU0RMQm91bmRQb3J0VHlwZUltcGwgZ2V0T3duZXIoKXsKKyAgICAgICAgcmV0dXJuIG93bmVyOworICAgIH0KKworICAgIHByaXZhdGUgUU5hbWUgcGF5bG9hZE5hbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGVtcHR5UGF5bG9hZDsKKyAgICBwcml2YXRlIE1hcDxRTmFtZSwgV1NETE1lc3NhZ2VJbXBsPiBtZXNzYWdlczsKKworICAgIHZvaWQgZnJlZXplKFdTRExNb2RlbEltcGwgcGFyZW50KSB7CisgICAgICAgIG1lc3NhZ2VzID0gcGFyZW50LmdldE1lc3NhZ2VzKCk7CisgICAgICAgIG9wZXJhdGlvbiA9IG93bmVyLmdldFBvcnRUeXBlKCkuZ2V0KG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFub255bW91cyhBTk9OWU1PVVMgYW5vbnltb3VzKSB7CisgICAgICAgIHRoaXMuYW5vbnltb3VzID0gYW5vbnltb3VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICovCisgICAgcHVibGljIEFOT05ZTU9VUyBnZXRBbm9ueW1vdXMoKSB7CisgICAgICAgIHJldHVybiBhbm9ueW1vdXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMQm91bmRQb3J0VHlwZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETEJvdW5kUG9ydFR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0OTY5NgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETEJvdW5kUG9ydFR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExCb3VuZFBvcnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuUU5hbWVNYXA7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5leGNlcHRpb24uTG9jYXRhYmxlV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuQ2xpZW50TWVzc2FnZXM7CisKK2ltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKK2ltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKK2ltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBXU0RMQm91bmRQb3J0VHlwZX0KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV1NETEJvdW5kUG9ydFR5cGVJbXBsIGV4dGVuZHMgQWJzdHJhY3RGZWF0dXJlZE9iamVjdEltcGwgaW1wbGVtZW50cyBXU0RMQm91bmRQb3J0VHlwZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBuYW1lOworICAgIHByaXZhdGUgZmluYWwgUU5hbWUgcG9ydFR5cGVOYW1lOworICAgIHByaXZhdGUgV1NETFBvcnRUeXBlSW1wbCBwb3J0VHlwZTsKKyAgICBwcml2YXRlIEJpbmRpbmdJRCBiaW5kaW5nSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBATm90TnVsbCBXU0RMTW9kZWxJbXBsIG93bmVyOworICAgIHByaXZhdGUgYm9vbGVhbiBmaW5hbGl6ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZpbmFsIFFOYW1lTWFwPFdTRExCb3VuZE9wZXJhdGlvbkltcGw+IGJpbmRpbmdPcGVyYXRpb25zID0gbmV3IFFOYW1lTWFwPFdTRExCb3VuZE9wZXJhdGlvbkltcGw+KCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVyYXRpb25zIGtleWVkIGJ5IHRoZSBwYXlsb2FkIHRhZyBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgUU5hbWVNYXA8V1NETEJvdW5kT3BlcmF0aW9uSW1wbD4gcGF5bG9hZE1hcDsKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgI3BheWxvYWRNYXB9IGRvZXNuJ3QgYWxsb3cgbnVsbCBrZXksIHNvIHdlIHN0b3JlIHRoZSB2YWx1ZSBmb3IgaXQgaGVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFdTRExCb3VuZE9wZXJhdGlvbkltcGwgZW1wdHlQYXlsb2FkT3BlcmF0aW9uOworCisKKworICAgIHB1YmxpYyBXU0RMQm91bmRQb3J0VHlwZUltcGwoWE1MU3RyZWFtUmVhZGVyIHhzcixATm90TnVsbCBXU0RMTW9kZWxJbXBsIG93bmVyLCBRTmFtZSBuYW1lLCBRTmFtZSBwb3J0VHlwZU5hbWUpIHsKKyAgICAgICAgc3VwZXIoeHNyKTsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnBvcnRUeXBlTmFtZSA9IHBvcnRUeXBlTmFtZTsKKyAgICAgICAgb3duZXIuYWRkQmluZGluZyh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIFdTRExNb2RlbEltcGwgZ2V0T3duZXIoKSB7CisgICAgICAgIHJldHVybiBvd25lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBnZXQoUU5hbWUgb3BlcmF0aW9uTmFtZSkgeworICAgICAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbk5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlcyB0aGUgTWFwIHRoYXQgaG9sZHMgb3BlcmF0aW9uIG5hbWUgYXMga2V5IGFuZCB7QGxpbmsgV1NETEJvdW5kT3BlcmF0aW9ufSBhcyB0aGUgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3BOYW1lIE11c3QgYmUgbm9uLW51bGwKKyAgICAgKiBAcGFyYW0gcHRPcCAgIE11c3QgYmUgbm9uLW51bGwKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBvcE5hbWUgb3IgcHRPcCBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0KFFOYW1lIG9wTmFtZSwgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBwdE9wKSB7CisgICAgICAgIGJpbmRpbmdPcGVyYXRpb25zLnB1dChvcE5hbWUscHRPcCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFBvcnRUeXBlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnRUeXBlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETFBvcnRUeXBlSW1wbCBnZXRQb3J0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnRUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYWJsZTxXU0RMQm91bmRPcGVyYXRpb25JbXBsPiBnZXRCaW5kaW5nT3BlcmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb25zLnZhbHVlcygpOworICAgIH0KKworICAgIHB1YmxpYyBCaW5kaW5nSUQgZ2V0QmluZGluZ0lkKCkgeworICAgICAgICAvL1Nob3VsZCB0aGUgZGVmYXVsdCBiZSBTT0FQMS4xL0hUVFAgYmluZGluZz8gRm9yIG5vdyBsZXRzIGtlZXAgaXQgZm9yCisgICAgICAgIC8vSkJJIGJ1ZyA2NTA5ODAwCisgICAgICAgIHJldHVybiAoYmluZGluZ0lkPT1udWxsKT9CaW5kaW5nSUQuU09BUDExX0hUVFA6YmluZGluZ0lkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdJZChCaW5kaW5nSUQgYmluZGluZ0lkKSB7CisgICAgICAgIHRoaXMuYmluZGluZ0lkID0gYmluZGluZ0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldHMgd2hldGhlciB0aGUge0BsaW5rIFdTRExCb3VuZFBvcnRUeXBlfSBpcyBycGMgb3IgbGl0CisgICAgICovCisgICAgcHJpdmF0ZSBTdHlsZSBzdHlsZSA9IFN0eWxlLkRPQ1VNRU5UOworICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIHN0eWxlKXsKKyAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOworICAgIH0KKworICAgIHB1YmxpYyBTT0FQQmluZGluZy5TdHlsZSBnZXRTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0eWxlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUnBjTGl0KCl7CisgICAgICAgIHJldHVybiBTdHlsZS5SUEM9PXN0eWxlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRG9jbGl0KCl7CisgICAgICAgIHJldHVybiBTdHlsZS5ET0NVTUVOVD09c3R5bGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgUGFyYW1ldGVyQmluZGluZ30gZm9yIGEgZ2l2ZW4gb3BlcmF0aW9uLCBwYXJ0IG5hbWUgYW5kIHRoZSBkaXJlY3Rpb24gLSBJTi9PVVQKKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGVyYXRpb24gd3NkbDpvcGVyYXRpb25AbmFtZSB2YWx1ZS4gTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKiBAcGFyYW0gcGFydCAgICAgIHdzZGw6cGFydEBuYW1lIHN1Y2ggYXMgdmFsdWUgb2Ygc29hcDpoZWFkZXJAcGFydC4gTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKiBAcGFyYW0gbW9kZSAgICAgIHtAbGluayBNb2RlI0lOfSBvciB7QGxpbmsgTW9kZUBPVVR9LiBNdXN0IGJlIG5vbi1udWxsLgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgYmluZGluZyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZm9yIHRoZSBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJCaW5kaW5nIGdldEJpbmRpbmcoUU5hbWUgb3BlcmF0aW9uLCBTdHJpbmcgcGFydCwgTW9kZSBtb2RlKSB7CisgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbkltcGwgb3AgPSBnZXQob3BlcmF0aW9uKTsKKyAgICAgICAgaWYgKG9wID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vVE9ETyB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICgoTW9kZS5JTiA9PSBtb2RlKSB8fCAoTW9kZS5JTk9VVCA9PSBtb2RlKSkKKyAgICAgICAgICAgIHJldHVybiBvcC5nZXRJbnB1dEJpbmRpbmcocGFydCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBvcC5nZXRPdXRwdXRCaW5kaW5nKHBhcnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgbWltZTpjb250ZW50QHBhcnQgdmFsdWUgd2hpY2ggaXMgdGhlIE1JTUUgdHlwZSBmb3IgYSBnaXZlbiBvcGVyYXRpb24sIHBhcnQgYW5kIHtAbGluayBNb2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGVyYXRpb24gd3NkbDpvcGVyYXRpb25AbmFtZSB2YWx1ZS4gTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKiBAcGFyYW0gcGFydCAgICAgIHdzZGw6cGFydEBuYW1lIHN1Y2ggYXMgdmFsdWUgb2Ygc29hcDpoZWFkZXJAcGFydC4gTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKiBAcGFyYW0gbW9kZSAgICAgIHtAbGluayBNb2RlI0lOfSBvciB7QGxpbmsgTW9kZUBPVVR9LiBNdXN0IGJlIG5vbi1udWxsLgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgYmluZGluZyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZm9yIHRoZSBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoUU5hbWUgb3BlcmF0aW9uLCBTdHJpbmcgcGFydCwgTW9kZSBtb2RlKSB7CisgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbkltcGwgb3AgPSBnZXQob3BlcmF0aW9uKTsKKyAgICAgICAgaWYgKE1vZGUuSU4gPT0gbW9kZSkKKyAgICAgICAgICAgIHJldHVybiBvcC5nZXRNaW1lVHlwZUZvcklucHV0UGFydChwYXJ0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG9wLmdldE1pbWVUeXBlRm9yT3V0cHV0UGFydChwYXJ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBnZXRPcGVyYXRpb24oU3RyaW5nIG5hbWVzcGFjZVVyaSwgU3RyaW5nIGxvY2FsTmFtZSkgeworICAgICAgICBpZihuYW1lc3BhY2VVcmk9PW51bGwgJiYgbG9jYWxOYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZW1wdHlQYXlsb2FkT3BlcmF0aW9uOworICAgICAgICBlbHNleworICAgICAgICAgICAgcmV0dXJuIHBheWxvYWRNYXAuZ2V0KChuYW1lc3BhY2VVcmk9PW51bGwpPyIiOm5hbWVzcGFjZVVyaSxsb2NhbE5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5hYmxlTVRPTSgpIHsKKyAgICAgICAgZmVhdHVyZXMuYWRkKG5ldyBNVE9NRmVhdHVyZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKCkgeworICAgICAgICByZXR1cm4gZmVhdHVyZXMuaXNFbmFibGVkKE1UT01GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU09BUFZlcnNpb24gZ2V0U09BUFZlcnNpb24oKXsKKyAgICAgICAgcmV0dXJuIGdldEJpbmRpbmdJZCgpLmdldFNPQVBWZXJzaW9uKCk7CisgICAgfQorCisgICAgdm9pZCBmcmVlemUoKSB7CisgICAgICAgIHBvcnRUeXBlID0gb3duZXIuZ2V0UG9ydFR5cGUocG9ydFR5cGVOYW1lKTsKKyAgICAgICAgaWYocG9ydFR5cGUgPT0gbnVsbCl7CisgICAgICAgICAgICB0aHJvdyBuZXcgTG9jYXRhYmxlV2ViU2VydmljZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgQ2xpZW50TWVzc2FnZXMuVU5ERUZJTkVEX1BPUlRfVFlQRShwb3J0VHlwZU5hbWUpLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBwb3J0VHlwZS5mcmVlemUoKTsKKworICAgICAgICBmb3IgKFdTRExCb3VuZE9wZXJhdGlvbkltcGwgb3AgOiBiaW5kaW5nT3BlcmF0aW9ucy52YWx1ZXMoKSkgeworICAgICAgICAgICAgb3AuZnJlZXplKG93bmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyZWV6ZVBheWxvYWRNYXAoKTsKKyAgICAgICAgaWYoc3R5bGUgPT0gU3R5bGUuUlBDKXsKKyAgICAgICAgICAgIG93bmVyLmZpbmFsaXplUnBjTGl0QmluZGluZyh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmcmVlemVQYXlsb2FkTWFwKCkgeworICAgICAgICBpZihzdHlsZT09IFN0eWxlLlJQQykgeworICAgICAgICAgICAgLy8gSWYgdGhlIHN0eWxlIGlzIHJwYyB0aGVuIHRoZSB0YWcgbmFtZSBzaG91bGQgYmUKKyAgICAgICAgICAgIC8vIHNhbWUgYXMgb3BlcmF0aW9uIG5hbWUgc28gcmV0dXJuIHRoZSBvcGVyYXRpb24gdGhhdCBtYXRjaGVzIHRoZSB0YWcgbmFtZS4KKyAgICAgICAgICAgIHBheWxvYWRNYXAgPSBiaW5kaW5nT3BlcmF0aW9uczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBheWxvYWRNYXAgPSBuZXcgUU5hbWVNYXA8V1NETEJvdW5kT3BlcmF0aW9uSW1wbD4oKTsKKyAgICAgICAgICAgIC8vIEZvciBkb2NsaXQgVGhlIHRhZyB3aWxsIGJlIHRoZSBvcGVyYXRpb24gdGhhdCBoYXMgdGhlIHNhbWUgaW5wdXQgcGFydCBkZXNjcmlwdG9yIHZhbHVlCisgICAgICAgICAgICBmb3IoV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBvcCA6IGJpbmRpbmdPcGVyYXRpb25zLnZhbHVlcygpKXsKKyAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gb3AuZ2V0UGF5bG9hZE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZihuYW1lID09IG51bGwpeworICAgICAgICAgICAgICAgICAgICAvL2VtcHR5IHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgZW1wdHlQYXlsb2FkT3BlcmF0aW9uID0gb3A7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBheWxvYWRNYXAucHV0KG5hbWUsIG9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETEZhdWx0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMRmF1bHRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmMGZlNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETEZhdWx0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEZhdWx0OworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKKworLyoqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV1NETEZhdWx0SW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaWJsZUltcGwgaW1wbGVtZW50cyBXU0RMRmF1bHQgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBtZXNzYWdlTmFtZTsKKyAgICBwcml2YXRlIFdTRExNZXNzYWdlSW1wbCBtZXNzYWdlOworCisgICAgcHVibGljIFdTRExGYXVsdEltcGwoWE1MU3RyZWFtUmVhZGVyIHhzcixTdHJpbmcgbmFtZSwgUU5hbWUgbWVzc2FnZU5hbWUpIHsKKyAgICAgICAgc3VwZXIoeHNyKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5tZXNzYWdlTmFtZSA9IG1lc3NhZ2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFdTRExNZXNzYWdlSW1wbCBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZShXU0RMTW9kZWxJbXBsIHJvb3QpeworICAgICAgICBtZXNzYWdlID0gcm9vdC5nZXRNZXNzYWdlKG1lc3NhZ2VOYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExJbnB1dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETElucHV0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmRjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExJbnB1dEltcGwuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExJbnB1dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMTWVzc2FnZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdTRExJbnB1dEltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2libGVJbXBsIGltcGxlbWVudHMgV1NETElucHV0IHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgUU5hbWUgbWVzc2FnZU5hbWU7CisgICAgcHJpdmF0ZSBXU0RMT3BlcmF0aW9uSW1wbCBvcGVyYXRpb247CisgICAgcHJpdmF0ZSBXU0RMTWVzc2FnZUltcGwgbWVzc2FnZTsKKyAgICBwcml2YXRlIFN0cmluZyBhY3Rpb247CisgICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRBY3Rpb24gPSB0cnVlOworCisgICAgcHVibGljIFdTRExJbnB1dEltcGwoWE1MU3RyZWFtUmVhZGVyIHhzcixTdHJpbmcgbmFtZSwgUU5hbWUgbWVzc2FnZU5hbWUsIFdTRExPcGVyYXRpb25JbXBsIG9wZXJhdGlvbikgeworICAgICAgICBzdXBlcih4c3IpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLm1lc3NhZ2VOYW1lID0gbWVzc2FnZU5hbWU7CisgICAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgaWYobmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisKKyAgICAgICAgcmV0dXJuIChvcGVyYXRpb24uaXNPbmVXYXkoKSk/b3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTpvcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKyJSZXF1ZXN0IjsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETE1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBhY3Rpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0QWN0aW9uKGJvb2xlYW4gZGVmYXVsdEFjdGlvbikgeworICAgICAgICB0aGlzLmRlZmF1bHRBY3Rpb24gPSBkZWZhdWx0QWN0aW9uOworICAgIH0KKworICAgIHZvaWQgZnJlZXplKFdTRExNb2RlbEltcGwgcGFyZW50KSB7CisgICAgICAgIG1lc3NhZ2UgPSBwYXJlbnQuZ2V0TWVzc2FnZShtZXNzYWdlTmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMTWVzc2FnZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETE1lc3NhZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMGEwZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETE1lc3NhZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE1lc3NhZ2U7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogUHJvdmlkZXMgYWJzdHJhY3Rpb24gZm9yIHdzZGw6bWVzc2FnZQorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdTRExNZXNzYWdlSW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaWJsZUltcGwgaW1wbGVtZW50cyBXU0RMTWVzc2FnZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBuYW1lOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFdTRExQYXJ0SW1wbD4gcGFydHM7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZSB3c2RsOm1lc3NhZ2UgbmFtZSBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgV1NETE1lc3NhZ2VJbXBsKFhNTFN0cmVhbVJlYWRlciB4c3IsUU5hbWUgbmFtZSkgeworICAgICAgICBzdXBlcih4c3IpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnBhcnRzID0gbmV3IEFycmF5TGlzdDxXU0RMUGFydEltcGw+KCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChXU0RMUGFydEltcGwgcGFydCl7CisgICAgICAgIHBhcnRzLmFkZChwYXJ0KTsKKyAgICB9CisKKyAgICBJdGVyYWJsZTxXU0RMUGFydEltcGw+IHBhcnRzKCl7CisgICAgICAgIHJldHVybiBwYXJ0czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExNb2RlbEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETE1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjM2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExNb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGw7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExCb3VuZFBvcnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMU2VydmljZTsKKworaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgV1NETE1vZGVsfQorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXU0RMTW9kZWxJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpYmxlSW1wbCBpbXBsZW1lbnRzIFdTRExNb2RlbCB7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UU5hbWUsIFdTRExNZXNzYWdlSW1wbD4gbWVzc2FnZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgV1NETE1lc3NhZ2VJbXBsPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFFOYW1lLCBXU0RMUG9ydFR5cGVJbXBsPiBwb3J0VHlwZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgV1NETFBvcnRUeXBlSW1wbD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxRTmFtZSwgV1NETEJvdW5kUG9ydFR5cGVJbXBsPiBiaW5kaW5ncyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBXU0RMQm91bmRQb3J0VHlwZUltcGw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UU5hbWUsIFdTRExTZXJ2aWNlSW1wbD4gc2VydmljZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxRTmFtZSwgV1NETFNlcnZpY2VJbXBsPigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UU5hbWUsV1NETEJvdW5kUG9ydFR5cGU+IHVubUJpbmRpbmdzCisgICAgICAgID0gQ29sbGVjdGlvbnMuPFFOYW1lLFdTRExCb3VuZFBvcnRUeXBlPnVubW9kaWZpYWJsZU1hcChiaW5kaW5ncyk7CisKKworICAgIHB1YmxpYyBXU0RMTW9kZWxJbXBsKEBOb3ROdWxsIFN0cmluZyBzeXN0ZW1JZCkgeworICAgICAgICBzdXBlcihzeXN0ZW1JZCwtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gY3JlYXRlIHtAbGluayBXU0RMTW9kZWxJbXBsfSBmcm9tIFdTREwgdGhhdCBkb2Vzbid0IGhhdmUgYSBzeXN0ZW0gSUQuCisgICAgICovCisgICAgcHVibGljIFdTRExNb2RlbEltcGwoKSB7CisgICAgICAgIHN1cGVyKG51bGwsLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoV1NETE1lc3NhZ2VJbXBsIG1zZyl7CisgICAgICAgIG1lc3NhZ2VzLnB1dChtc2cuZ2V0TmFtZSgpLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBXU0RMTWVzc2FnZUltcGwgZ2V0TWVzc2FnZShRTmFtZSBuYW1lKXsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQb3J0VHlwZShXU0RMUG9ydFR5cGVJbXBsIHB0KXsKKyAgICAgICAgcG9ydFR5cGVzLnB1dChwdC5nZXROYW1lKCksIHB0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETFBvcnRUeXBlSW1wbCBnZXRQb3J0VHlwZShRTmFtZSBuYW1lKXsKKyAgICAgICAgcmV0dXJuIHBvcnRUeXBlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmluZGluZyhXU0RMQm91bmRQb3J0VHlwZUltcGwgYm91bmRQb3J0VHlwZSl7CisgICAgICAgIGFzc2VydCAhYmluZGluZ3MuY29udGFpbnNWYWx1ZShib3VuZFBvcnRUeXBlKTsKKyAgICAgICAgYmluZGluZ3MucHV0KGJvdW5kUG9ydFR5cGUuZ2V0TmFtZSgpLCBib3VuZFBvcnRUeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETEJvdW5kUG9ydFR5cGVJbXBsIGdldEJpbmRpbmcoUU5hbWUgbmFtZSl7CisgICAgICAgIHJldHVybiBiaW5kaW5ncy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkU2VydmljZShXU0RMU2VydmljZUltcGwgc3ZjKXsKKyAgICAgICAgc2VydmljZXMucHV0KHN2Yy5nZXROYW1lKCksIHN2Yyk7CisgICAgfQorCisgICAgcHVibGljIFdTRExTZXJ2aWNlSW1wbCBnZXRTZXJ2aWNlKFFOYW1lIG5hbWUpeworICAgICAgICByZXR1cm4gc2VydmljZXMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8UU5hbWUsIFdTRExNZXNzYWdlSW1wbD4gZ2V0TWVzc2FnZXMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlczsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgTWFwPFFOYW1lLCBXU0RMUG9ydFR5cGVJbXBsPiBnZXRQb3J0VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBwb3J0VHlwZXM7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIE1hcDxRTmFtZSwgV1NETEJvdW5kUG9ydFR5cGU+IGdldEJpbmRpbmdzKCkgeworICAgICAgICByZXR1cm4gdW5tQmluZGluZ3M7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIE1hcDxRTmFtZSwgV1NETFNlcnZpY2VJbXBsPiBnZXRTZXJ2aWNlcygpeworICAgICAgICByZXR1cm4gc2VydmljZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlyc3Qgc2VydmljZSBRTmFtZSBmcm9tIGluc2VydGlvbiBvcmRlcgorICAgICAqLworICAgIHB1YmxpYyBRTmFtZSBnZXRGaXJzdFNlcnZpY2VOYW1lKCl7CisgICAgICAgIGlmKHNlcnZpY2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgZmlyc3QgcG9ydCBRTmFtZSBmcm9tIGZpcnN0IHNlcnZpY2UgYXMgcGVyIHRoZSBpbnNlcnRpb24gb3JkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWUgZ2V0Rmlyc3RQb3J0TmFtZSgpeworICAgICAgICBXU0RMUG9ydCBmcCA9IGdldEZpcnN0UG9ydCgpOworICAgICAgICBpZihmcD09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZnAuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHByaXZhdGUgV1NETFBvcnQgZ2V0Rmlyc3RQb3J0KCl7CisgICAgICAgIGlmKHNlcnZpY2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBXU0RMU2VydmljZSBzZXJ2aWNlID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBXU0RMUG9ydD4gaXRlciA9IHNlcnZpY2UuZ2V0UG9ydHMoKS5pdGVyYXRvcigpOworICAgICAgICBXU0RMUG9ydCBwb3J0ID0gaXRlci5oYXNOZXh0KCk/aXRlci5uZXh0KCk6bnVsbDsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgKiBnZXRzIHRoZSBmaXJzdCBwb3J0IGluIHRoZSB3c2RsIHdoaWNoIG1hdGNoZXMgdGhlIHNlcnZpY2VOYW1lIGFuZCBwb3J0VHlwZQorICAgICovCisgICAgcHVibGljIFdTRExQb3J0SW1wbCBnZXRNYXRjaGluZ1BvcnQoUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnRUeXBlKXsKKyAgICAgICAgcmV0dXJuIGdldFNlcnZpY2Uoc2VydmljZU5hbWUpLmdldE1hdGNoaW5nUG9ydChwb3J0VHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgbm9uLW51bGwgc2VydmljZSBRTmFtZQorICAgICAqIEBwYXJhbSBwb3J0TmFtZSAgICBub24tbnVsbCBwb3J0IFFOYW1lCisgICAgICogQHJldHVybgorICAgICAqICAgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbiBvbiBzdWNjZXNzIG90aGVyd2lzZSBudWxsLiB0aHJvd3MgTlBFIGlmIGFueSBvZiB0aGUgcGFyYW1ldGVycyBudWxsCisgICAgICovCisgICAgcHVibGljIFdTRExCb3VuZFBvcnRUeXBlSW1wbCBnZXRCaW5kaW5nKFFOYW1lIHNlcnZpY2VOYW1lLCBRTmFtZSBwb3J0TmFtZSl7CisgICAgICAgIFdTRExTZXJ2aWNlSW1wbCBzZXJ2aWNlID0gc2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKKyAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKXsKKyAgICAgICAgICAgIFdTRExQb3J0SW1wbCBwb3J0ID0gc2VydmljZS5nZXQocG9ydE5hbWUpOworICAgICAgICAgICAgaWYocG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBwb3J0LmdldEJpbmRpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2b2lkIGZpbmFsaXplUnBjTGl0QmluZGluZyhXU0RMQm91bmRQb3J0VHlwZUltcGwgYm91bmRQb3J0VHlwZSl7CisgICAgICAgIGFzc2VydChib3VuZFBvcnRUeXBlICE9IG51bGwpOworICAgICAgICBRTmFtZSBwb3J0VHlwZU5hbWUgPSBib3VuZFBvcnRUeXBlLmdldFBvcnRUeXBlTmFtZSgpOworICAgICAgICBpZihwb3J0VHlwZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgV1NETFBvcnRUeXBlIHB0ID0gcG9ydFR5cGVzLmdldChwb3J0VHlwZU5hbWUpOworICAgICAgICBpZihwdCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmb3IgKFdTRExCb3VuZE9wZXJhdGlvbkltcGwgYm9wIDogYm91bmRQb3J0VHlwZS5nZXRCaW5kaW5nT3BlcmF0aW9ucygpKSB7CisgICAgICAgICAgICBXU0RMT3BlcmF0aW9uIHB0byA9IHB0LmdldChib3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgICAgIFdTRExNZXNzYWdlIGluTXNnTmFtZSA9IHB0by5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGlmKGluTXNnTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgV1NETE1lc3NhZ2VJbXBsIGluTXNnID0gbWVzc2FnZXMuZ2V0KGluTXNnTmFtZS5nZXROYW1lKCkpOworICAgICAgICAgICAgaW50IGJvZHlpbmRleCA9IDA7CisgICAgICAgICAgICBpZihpbk1zZyAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBmb3IoV1NETFBhcnRJbXBsIHBhcnQ6aW5Nc2cucGFydHMoKSl7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFydC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgcGIgPSBib3AuZ2V0SW5wdXRCaW5kaW5nKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZihwYi5pc0JvZHkoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LnNldEluZGV4KGJvZHlpbmRleCsrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuc2V0QmluZGluZyhwYik7CisgICAgICAgICAgICAgICAgICAgICAgICBib3AuYWRkUGFydChwYXJ0LCBNb2RlLklOKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvZHlpbmRleD0wOworICAgICAgICAgICAgaWYocHRvLmlzT25lV2F5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBXU0RMTWVzc2FnZSBvdXRNc2dOYW1lID0gcHRvLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGlmKG91dE1zZ05hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFdTRExNZXNzYWdlSW1wbCBvdXRNc2cgPSBtZXNzYWdlcy5nZXQob3V0TXNnTmFtZS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYob3V0TXNnIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgZm9yKFdTRExQYXJ0SW1wbCBwYXJ0Om91dE1zZy5wYXJ0cygpKXsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJ0LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYiA9IGJvcC5nZXRPdXRwdXRCaW5kaW5nKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZihwYi5pc0JvZHkoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LnNldEluZGV4KGJvZHlpbmRleCsrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuc2V0QmluZGluZyhwYik7CisgICAgICAgICAgICAgICAgICAgICAgICBib3AuYWRkUGFydChwYXJ0LCBNb2RlLk9VVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGF0IHRoZSBlbmQgb2YgdGhlIG1vZGVsIGNvbnN0cnVjdGlvbiB0byBmaXggdXAgcmVmZXJlbmNlcywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZyZWV6ZSgpIHsKKyAgICAgICAgZm9yIChXU0RMU2VydmljZUltcGwgc2VydmljZSA6IHNlcnZpY2VzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBzZXJ2aWNlLmZyZWV6ZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFdTRExCb3VuZFBvcnRUeXBlSW1wbCBicCA6IGJpbmRpbmdzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBicC5mcmVlemUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETE9wZXJhdGlvbkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETE9wZXJhdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTZjY2IzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMT3BlcmF0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGw7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExGYXVsdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlFOYW1lTWFwOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSW1wbGVtZW50YWl0b24gb2Yge0BsaW5rIFdTRExPcGVyYXRpb259CisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdTRExPcGVyYXRpb25JbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpYmxlSW1wbCBpbXBsZW1lbnRzIFdTRExPcGVyYXRpb24geworICAgIHByaXZhdGUgZmluYWwgUU5hbWUgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBwYXJhbWV0ZXJPcmRlcjsKKyAgICBwcml2YXRlIFdTRExJbnB1dEltcGwgaW5wdXQ7CisgICAgcHJpdmF0ZSBXU0RMT3V0cHV0SW1wbCBvdXRwdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFdTRExGYXVsdEltcGw+IGZhdWx0czsKKyAgICBwcml2YXRlIGZpbmFsIFFOYW1lTWFwPFdTRExGYXVsdEltcGw+IGZhdWx0TWFwOworICAgIHByb3RlY3RlZCBJdGVyYWJsZTxXU0RMTWVzc2FnZUltcGw+IG1lc3NhZ2VzOworICAgIHByaXZhdGUgZmluYWwgV1NETFBvcnRUeXBlIG93bmVyOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IGZhdWx0QWN0aW9uTWFwOworCisgICAgcHVibGljIFdTRExPcGVyYXRpb25JbXBsKFhNTFN0cmVhbVJlYWRlciB4c3IsV1NETFBvcnRUeXBlSW1wbCBvd25lciwgUU5hbWUgbmFtZSkgeworICAgICAgICBzdXBlcih4c3IpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmZhdWx0cyA9IG5ldyBBcnJheUxpc3Q8V1NETEZhdWx0SW1wbD4oKTsKKyAgICAgICAgdGhpcy5mYXVsdE1hcCA9IG5ldyBRTmFtZU1hcDxXU0RMRmF1bHRJbXBsPigpOworICAgICAgICB0aGlzLmZhdWx0QWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck9yZGVyKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyT3JkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyT3JkZXIoU3RyaW5nIHBhcmFtZXRlck9yZGVyKSB7CisgICAgICAgIHRoaXMucGFyYW1ldGVyT3JkZXIgPSBwYXJhbWV0ZXJPcmRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETElucHV0SW1wbCBnZXRJbnB1dCgpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElucHV0KFdTRExJbnB1dEltcGwgaW5wdXQpIHsKKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgIH0KKworICAgIHB1YmxpYyBXU0RMT3V0cHV0SW1wbCBnZXRPdXRwdXQoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPbmVXYXkoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXQgPT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoV1NETE91dHB1dEltcGwgb3V0cHV0KSB7CisgICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYWJsZTxXU0RMRmF1bHRJbXBsPiBnZXRGYXVsdHMoKSB7CisgICAgICAgIHJldHVybiBmYXVsdHM7CisgICAgfQorCisgICAgcHVibGljIFdTRExGYXVsdCBnZXRGYXVsdChRTmFtZSBmYXVsdERldGFpbE5hbWUpIHsKKyAgICAgICAgV1NETEZhdWx0SW1wbCBmYXVsdCA9IGZhdWx0TWFwLmdldChmYXVsdERldGFpbE5hbWUpOworICAgICAgICBpZihmYXVsdCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhdWx0OworCisgICAgICAgIGZvcihXU0RMRmF1bHRJbXBsIGZpOmZhdWx0cyl7CisgICAgICAgICAgICBhc3NlcnQgZmkuZ2V0TWVzc2FnZSgpLnBhcnRzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCk7CisgICAgICAgICAgICBXU0RMUGFydEltcGwgcGFydCA9IGZpLmdldE1lc3NhZ2UoKS5wYXJ0cygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgICAgaWYocGFydC5nZXREZXNjcmlwdG9yKCkubmFtZSgpLmVxdWFscyhmYXVsdERldGFpbE5hbWUpKXsKKyAgICAgICAgICAgICAgICBmYXVsdE1hcC5wdXQoZmF1bHREZXRhaWxOYW1lLCBmaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0RmF1bHRBY3Rpb25NYXAoKSB7CisgICAgICAgIHJldHVybiBmYXVsdEFjdGlvbk1hcDsKKyAgICB9CisKKyAgICBXU0RMUG9ydFR5cGUgZ2V0T3duZXIoKSB7CisgICAgICAgIHJldHVybiBvd25lcjsKKyAgICB9CisKKyAgICBATm90TnVsbAorICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0VHlwZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBvd25lci5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRmF1bHQoV1NETEZhdWx0SW1wbCBmYXVsdCkgeworICAgICAgICBmYXVsdHMuYWRkKGZhdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmcmVleihXU0RMTW9kZWxJbXBsIHJvb3QpIHsKKyAgICAgICAgYXNzZXJ0IGlucHV0ICE9IG51bGw7CisgICAgICAgIGlucHV0LmZyZWV6ZShyb290KTsKKyAgICAgICAgaWYob3V0cHV0ICE9IG51bGwpCisgICAgICAgICAgICBvdXRwdXQuZnJlZXplKHJvb3QpOworICAgICAgICBmb3IoV1NETEZhdWx0SW1wbCBmYXVsdCA6IGZhdWx0cyl7CisgICAgICAgICAgICBmYXVsdC5mcmVlemUocm9vdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExPdXRwdXRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExPdXRwdXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjZmY1NQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETE91dHB1dEltcGwuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExPdXRwdXQ7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworCisvKioKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXU0RMT3V0cHV0SW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaWJsZUltcGwgaW1wbGVtZW50cyBXU0RMT3V0cHV0IHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgUU5hbWUgbWVzc2FnZU5hbWU7CisgICAgcHJpdmF0ZSBXU0RMT3BlcmF0aW9uSW1wbCBvcGVyYXRpb247CisgICAgcHJpdmF0ZSBXU0RMTWVzc2FnZUltcGwgbWVzc2FnZTsKKyAgICBwcml2YXRlIFN0cmluZyBhY3Rpb247CisKKyAgICBwdWJsaWMgV1NETE91dHB1dEltcGwoWE1MU3RyZWFtUmVhZGVyIHhzcixTdHJpbmcgbmFtZSwgUU5hbWUgbWVzc2FnZU5hbWUsIFdTRExPcGVyYXRpb25JbXBsIG9wZXJhdGlvbikgeworICAgICAgICBzdXBlcih4c3IpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLm1lc3NhZ2VOYW1lID0gbWVzc2FnZU5hbWU7CisgICAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIChuYW1lID09IG51bGwpP29wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkrIlJlc3BvbnNlIjpuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBXU0RMTWVzc2FnZSBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZShXU0RMTW9kZWxJbXBsIHJvb3QpIHsKKyAgICAgICAgbWVzc2FnZSA9IHJvb3QuZ2V0TWVzc2FnZShtZXNzYWdlTmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMUGFydERlc2NyaXB0b3JJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExQYXJ0RGVzY3JpcHRvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQyZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMUGFydERlc2NyaXB0b3JJbXBsLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGw7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMRGVzY3JpcHRvcktpbmQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBhcnREZXNjcmlwdG9yOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKKworLyoqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV1NETFBhcnREZXNjcmlwdG9ySW1wbCBleHRlbmRzIEFic3RyYWN0T2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdTRExQYXJ0RGVzY3JpcHRvciB7CisgICAgcHJpdmF0ZSBRTmFtZSBuYW1lOworICAgIHByaXZhdGUgV1NETERlc2NyaXB0b3JLaW5kIHR5cGU7CisKKyAgICBwdWJsaWMgV1NETFBhcnREZXNjcmlwdG9ySW1wbChYTUxTdHJlYW1SZWFkZXIgeHNyLFFOYW1lIG5hbWUsIFdTRExEZXNjcmlwdG9yS2luZCBraW5kKSB7CisgICAgICAgIHN1cGVyKHhzcik7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IGtpbmQ7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIG5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBXU0RMRGVzY3JpcHRvcktpbmQgdHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMUGFydEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETFBhcnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZDQxNgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETFBhcnRJbXBsLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBhcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBhcnREZXNjcmlwdG9yOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFdTRExQYXJ0fQorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXU0RMUGFydEltcGwgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdEltcGwgaW1wbGVtZW50cyBXU0RMUGFydCB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFBhcmFtZXRlckJpbmRpbmcgYmluZGluZzsKKyAgICBwcml2YXRlIGludCBpbmRleDsKKyAgICBwcml2YXRlIGZpbmFsIFdTRExQYXJ0RGVzY3JpcHRvciBkZXNjcmlwdG9yOworCisgICAgcHVibGljIFdTRExQYXJ0SW1wbChYTUxTdHJlYW1SZWFkZXIgeHNyLCBTdHJpbmcgcGFydE5hbWUsIGludCBpbmRleCwgV1NETFBhcnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgc3VwZXIoeHNyKTsKKyAgICAgICAgdGhpcy5uYW1lID0gcGFydE5hbWU7CisgICAgICAgIHRoaXMuYmluZGluZyA9IFBhcmFtZXRlckJpbmRpbmcuVU5CT1VORDsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyQmluZGluZyBnZXRCaW5kaW5nKCkgeworICAgICAgICByZXR1cm4gYmluZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcgYmluZGluZykgeworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICAvL25lZWQgdG8gc2V0IHRoZSBpbmRleCBpbiBjYXNlIG9mIHJwY2xpdCB0byByZW9yZGVyIHRoZSBib2R5IHBhcnRzCisgICAgcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KXsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgIH0KKworICAgIGJvb2xlYW4gaXNCb2R5KCl7CisgICAgICAgIHJldHVybiBiaW5kaW5nLmlzQm9keSgpOworICAgIH0KKworICAgIHB1YmxpYyBXU0RMUGFydERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMUG9ydEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETFBvcnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0ZmJhMwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETFBvcnRJbXBsLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkNsaWVudE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuZXhjZXB0aW9uLkxvY2F0YWJsZVdlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuUnVudGltZVdTRExQYXJzZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5XZWJTZXJ2aWNlRmVhdHVyZUxpc3Q7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFdTRExQb3J0fQorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXU0RMUG9ydEltcGwgZXh0ZW5kcyBBYnN0cmFjdEZlYXR1cmVkT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdTRExQb3J0IHsKKyAgICBwcml2YXRlIGZpbmFsIFFOYW1lIG5hbWU7CisgICAgcHJpdmF0ZSBFbmRwb2ludEFkZHJlc3MgYWRkcmVzczsKKyAgICBwcml2YXRlIGZpbmFsIFFOYW1lIGJpbmRpbmdOYW1lOworICAgIHByaXZhdGUgZmluYWwgV1NETFNlcnZpY2VJbXBsIG93bmVyOworICAgIHByaXZhdGUgV1NFbmRwb2ludFJlZmVyZW5jZSBlcHI7CisKKyAgICAvKioKKyAgICAgKiBUbyBiZSBzZXQgYWZ0ZXIgdGhlIFdTREwgcGFyc2luZyBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFdTRExCb3VuZFBvcnRUeXBlSW1wbCBib3VuZFBvcnRUeXBlOworCisgICAgcHVibGljIFdTRExQb3J0SW1wbChYTUxTdHJlYW1SZWFkZXIgeHNyLFdTRExTZXJ2aWNlSW1wbCBvd25lciwgUU5hbWUgbmFtZSwgUU5hbWUgYmluZGluZykgeworICAgICAgICBzdXBlcih4c3IpOworICAgICAgICB0aGlzLm93bmVyID0gb3duZXI7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuYmluZGluZ05hbWUgPSBiaW5kaW5nOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0QmluZGluZ05hbWUoKSB7CisgICAgICAgIHJldHVybiBiaW5kaW5nTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRW5kcG9pbnRBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBXU0RMU2VydmljZUltcGwgZ2V0T3duZXIoKSB7CisgICAgICAgIHJldHVybiBvd25lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IG1lYW50IGZvciB7QGxpbmsgUnVudGltZVdTRExQYXJzZXJ9IHRvIGNhbGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhFbmRwb2ludEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICBhc3NlcnQgYWRkcmVzcyE9bnVsbDsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IG1lYW50IGZvciB7QGxpbmsgUnVudGltZVdTRExQYXJzZXJ9IHRvIGNhbGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RVBSKEBOb3ROdWxsIFdTRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7CisgICAgICAgIGFzc2VydCBlcHIhPW51bGw7CisgICAgICAgIHRoaXMuZXByID0gZXByOworICAgIH0KKworICAgIHB1YmxpYyBATnVsbGFibGUgV1NFbmRwb2ludFJlZmVyZW5jZSBnZXRFUFIoKSB7CisgICAgICAgIHJldHVybiBlcHI7CisgICAgfQorICAgIHB1YmxpYyBXU0RMQm91bmRQb3J0VHlwZUltcGwgZ2V0QmluZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGJvdW5kUG9ydFR5cGU7CisgICAgfQorCisgICAgcHVibGljIFNPQVBWZXJzaW9uIGdldFNPQVBWZXJzaW9uKCl7CisgICAgICAgIHJldHVybiBib3VuZFBvcnRUeXBlLmdldFNPQVBWZXJzaW9uKCk7CisgICAgfQorCisgICAgdm9pZCBmcmVlemUoV1NETE1vZGVsSW1wbCByb290KSB7CisgICAgICAgIGJvdW5kUG9ydFR5cGUgPSByb290LmdldEJpbmRpbmcoYmluZGluZ05hbWUpOworICAgICAgICBpZihib3VuZFBvcnRUeXBlPT1udWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTG9jYXRhYmxlV2ViU2VydmljZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBDbGllbnRNZXNzYWdlcy5VTkRFRklORURfQklORElORyhiaW5kaW5nTmFtZSksIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmKGZlYXR1cmVzID09IG51bGwpCisgICAgICAgICAgICBmZWF0dXJlcyA9ICBuZXcgV2ViU2VydmljZUZlYXR1cmVMaXN0KCk7CisgICAgICAgIGZlYXR1cmVzLnNldFBhcmVudEZlYXR1cmVkT2JqZWN0KGJvdW5kUG9ydFR5cGUpOworICAgICAgICBub3RVbmRlcnN0b29kRXh0ZW5zaW9ucy5hZGRBbGwoYm91bmRQb3J0VHlwZS5ub3RVbmRlcnN0b29kRXh0ZW5zaW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExQb3J0VHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY3ZTdhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydFR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBQcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgV1NETFBvcnRUeXBlfQorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXU0RMUG9ydFR5cGVJbXBsICBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaWJsZUltcGwgaW1wbGVtZW50cyBXU0RMUG9ydFR5cGUgeworICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFdTRExPcGVyYXRpb25JbXBsPiBwb3J0VHlwZU9wZXJhdGlvbnM7CisgICAgcHJpdmF0ZSBXU0RMTW9kZWxJbXBsIG93bmVyOworCisgICAgcHVibGljIFdTRExQb3J0VHlwZUltcGwoWE1MU3RyZWFtUmVhZGVyIHhzcixXU0RMTW9kZWxJbXBsIG93bmVyLCBRTmFtZSBuYW1lKSB7CisgICAgICAgIHN1cGVyKHhzcik7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICAgICAgcG9ydFR5cGVPcGVyYXRpb25zID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFdTRExPcGVyYXRpb25JbXBsPigpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETE9wZXJhdGlvbkltcGwgZ2V0KFN0cmluZyBvcGVyYXRpb25OYW1lKSB7CisgICAgICAgIHJldHVybiBwb3J0VHlwZU9wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbk5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYWJsZTxXU0RMT3BlcmF0aW9uSW1wbD4gZ2V0T3BlcmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHBvcnRUeXBlT3BlcmF0aW9ucy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZXMgdGhlIE1hcCB0aGF0IGhvbGRzIG9wZXJhdGlvbiBuYW1lIGFzIGtleSBhbmQge0BsaW5rIFdTRExPcGVyYXRpb259IGFzIHRoZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gb3BOYW1lIE11c3QgYmUgbm9uLW51bGwKKyAgICAgKiBAcGFyYW0gcHRPcCAgTXVzdCBiZSBub24tbnVsbAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIG9wTmFtZSBvciBwdE9wIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIG9wTmFtZSwgV1NETE9wZXJhdGlvbkltcGwgcHRPcCl7CisgICAgICAgIHBvcnRUeXBlT3BlcmF0aW9ucy5wdXQob3BOYW1lLCBwdE9wKTsKKyAgICB9CisKKyAgICBXU0RMTW9kZWxJbXBsIGdldE93bmVyKCl7CisgICAgICAgIHJldHVybiBvd25lcjsKKyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZSgpIHsKKyAgICAgICAgZm9yKFdTRExPcGVyYXRpb25JbXBsIG9wIDogcG9ydFR5cGVPcGVyYXRpb25zLnZhbHVlcygpKXsKKyAgICAgICAgICAgIG9wLmZyZWV6KG93bmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETFByb3BlcnRpZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsL3dzZGwvV1NETFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MThkZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlByb3BlcnR5U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKKworLyoqCisgKiBQcm9wZXJ0aWVzIGV4cG9zZWQgZnJvbSB7QGxpbmsgV1NETFBvcnR9IGZvciB7QGxpbmsgTWVzc2FnZUNvbnRleHR9LgorICogRG9ub3QgYWRkIHRoaXMgc2F0ZWxsaXRlIGlmIHtAbGluayBXU0RMUG9ydH0gaXMgbnVsbC4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV1NETFByb3BlcnRpZXMgZXh0ZW5kcyBQcm9wZXJ0eVNldCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eU1hcCBtb2RlbDsKKyAgICBzdGF0aWMgeworICAgICAgICBtb2RlbCA9IHBhcnNlKFdTRExQcm9wZXJ0aWVzLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIFdTRExQb3J0IHBvcnQ7CisKKyAgICBwdWJsaWMgV1NETFByb3BlcnRpZXMoQE5vdE51bGwgV1NETFBvcnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIEBQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5XU0RMX1NFUlZJQ0UpCisgICAgcHVibGljIFFOYW1lIGdldFdTRExTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gcG9ydC5nZXRPd25lcigpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAUHJvcGVydHkoTWVzc2FnZUNvbnRleHQuV1NETF9QT1JUKQorICAgIHB1YmxpYyBRTmFtZSBnZXRXU0RMUG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5XU0RMX0lOVEVSRkFDRSkKKyAgICBwdWJsaWMgUU5hbWUgZ2V0V1NETFBvcnRUeXBlKCkgeworICAgICAgICByZXR1cm4gcG9ydC5nZXRCaW5kaW5nKCkuZ2V0UG9ydFR5cGVOYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFByb3BlcnR5TWFwIGdldFByb3BlcnR5TWFwKCkgeworICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbC93c2RsL1dTRExTZXJ2aWNlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTA2NTJkCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWwvd3NkbC9XU0RMU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMU2VydmljZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgV1NETFNlcnZpY2V9CisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdTRExTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaWJsZUltcGwgaW1wbGVtZW50cyBXU0RMU2VydmljZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBuYW1lOworICAgIHByaXZhdGUgZmluYWwgTWFwPFFOYW1lLCBXU0RMUG9ydEltcGw+IHBvcnRzOworICAgIHByaXZhdGUgZmluYWwgV1NETE1vZGVsSW1wbCBwYXJlbnQ7CisKKyAgICBwdWJsaWMgV1NETFNlcnZpY2VJbXBsKFhNTFN0cmVhbVJlYWRlciB4c3IsV1NETE1vZGVsSW1wbCBwYXJlbnQsIFFOYW1lIG5hbWUpIHsKKyAgICAgICAgc3VwZXIoeHNyKTsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHBvcnRzID0gbmV3IExpbmtlZEhhc2hNYXA8UU5hbWUsV1NETFBvcnRJbXBsPigpOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbAorICAgIFdTRExNb2RlbEltcGwgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETFBvcnRJbXBsIGdldChRTmFtZSBwb3J0TmFtZSkgeworICAgICAgICByZXR1cm4gcG9ydHMuZ2V0KHBvcnROYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETFBvcnQgZ2V0Rmlyc3RQb3J0KCkgeworICAgICAgICBpZihwb3J0cy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYWJsZTxXU0RMUG9ydEltcGw+IGdldFBvcnRzKCl7CisgICAgICAgIHJldHVybiBwb3J0cy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIGdldHMgdGhlIGZpcnN0IHBvcnQgaW4gdGhpcyBzZXJ2aWNlIHdoaWNoIG1hdGNoZXMgdGhlIHBvcnRUeXBlCisgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlCisgICAgV1NETFBvcnRJbXBsIGdldE1hdGNoaW5nUG9ydChRTmFtZSBwb3J0VHlwZU5hbWUpeworICAgICAgICBmb3IoV1NETFBvcnRJbXBsIHBvcnQgOiBnZXRQb3J0cygpKXsKKyAgICAgICAgICAgIFFOYW1lIHB0TmFtZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlTmFtZSgpOworICAgICAgICAgICAgYXNzZXJ0IChwdE5hbWUgIT0gbnVsbCk7CisgICAgICAgICAgICBpZihwdE5hbWUuZXF1YWxzKHBvcnRUeXBlTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGVzIHRoZSBNYXAgdGhhdCBob2xkcyBwb3J0IG5hbWUgYXMga2V5IGFuZCB7QGxpbmsgV1NETFBvcnR9IGFzIHRoZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0TmFtZSBNdXN0IGJlIG5vbi1udWxsCisgICAgICogQHBhcmFtIHBvcnQgICAgIE11c3QgYmUgbm9uLW51bGwKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBvcE5hbWUgb3IgcHRPcCBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0KFFOYW1lIHBvcnROYW1lLCBXU0RMUG9ydEltcGwgcG9ydCkgeworICAgICAgICBpZiAocG9ydE5hbWUgPT0gbnVsbCB8fCBwb3J0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgcG9ydHMucHV0KHBvcnROYW1lLCBwb3J0KTsKKyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZShXU0RMTW9kZWxJbXBsIHJvb3QpIHsKKyAgICAgICAgZm9yIChXU0RMUG9ydEltcGwgcG9ydCA6IHBvcnRzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBwb3J0LmZyZWV6ZShyb290KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsZXIvUnVudGltZU1vZGVsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL21vZGVsZXIvUnVudGltZU1vZGVsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhMmU0Zi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbGVyL1J1bnRpbWVNb2RlbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcwICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLlR5cGVSZWZlcmVuY2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5tb2RlbC5uYXYuTmF2aWdhdG9yOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQVmVyc2lvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5KYXZhTWV0aG9kOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuQ2hlY2tlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5FeGNlcHRpb25UeXBlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlJ1bnRpbWVNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUFJ1bnRpbWVNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwLlN0eWxlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuUGFydDsKLQotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47Ci1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0vKioKLSAqIENyZWF0ZXMgYSBydW50aW1lIG1vZGVsIG9mIGEgU0VJIChwb3J0Q2xhc3MpLgotICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcGVtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVNb2RlbGVyIHsKLSAgICBwcml2YXRlIFN0cmluZyBiaW5kaW5nSWQ7Ci0gICAgcHJpdmF0ZSBDbGFzcyBwb3J0Q2xhc3M7Ci0gICAgcHJpdmF0ZSBSdW50aW1lTW9kZWwgcnVudGltZU1vZGVsOwotICAgIHByaXZhdGUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZyBkZWZhdWx0QmluZGluZzsKLSAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzV3JhcHBlZCA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHVzZXNXZWJNZXRob2QgPSBmYWxzZTsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLSAgICBwcml2YXRlIE9iamVjdCBpbXBsZW1lbnRvcjsKLSAgICBwcml2YXRlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLkJpbmRpbmcgYmluZGluZzsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWU7Ci0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIEJvb2xlYW4+IGNsYXNzVXNlc1dlYk1ldGhvZCA9IG5ldyBIYXNoTWFwPENsYXNzLCBCb29sZWFuPigpOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRF9KQVhXU19QQUNLQUdFX1BEICA9ICIuamF4d3MuIjsKLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX1BBQ0tBR0VfUEQgICAgID0gImpheHdzLiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgICAgICAgICAgICAgPSAiUmVzcG9uc2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTiAgICAgICAgICAgICAgID0gInJldHVybiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTiAgICAgICAgICAgICAgICAgPSAiQmVhbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRSAgICAgICAgICAgICAgPSAiU2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVCAgICAgICAgICAgICAgICAgPSAiUG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBIT0xERVJfQ0xBU1MgPSBIb2xkZXIuY2xhc3M7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBSRU1PVEVfRVhDRVBUSU9OX0NMQVNTID0gUmVtb3RlRXhjZXB0aW9uLmNsYXNzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgUlBDX0xJVF9QQVlMT0FEX0NMQVNTID0gY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5ScGNMaXRQYXlsb2FkLmNsYXNzOwotCi0gICAgLyoqCi0gICAgICogY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSdW5UaW1lTW9kZWxlciBnaXZlbiBhIDxjb2RlPnBvcnRDbGFzczwvY29kZT4gYW5kIDxjb2RlPmJpbmRpbmdJZDwvY29kZT4KLSAgICAgKiBAcGFyYW0gcG9ydENsYXNzIFRoZSBTRUkgY2xhc3MgdG8gYmUgbW9kZWxlZC4KLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIFNlcnZpY2VOYW1lIHRvIHVzZSBpbnN0ZWFkIG9mIG9uZSBjYWxjdWxhdGVkIGZyb20gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICogQHBhcmFtIGJpbmRpbmdJZCBUaGUgYmluZGluZyBpZGVudGlmaWVyIHRvIGJlIHVzZWQgd2hlbiBtb2RlbGluZyB0aGUgPGNvZGU+cG9ydENsYXNzPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUnVudGltZU1vZGVsZXIoQ2xhc3MgcG9ydENsYXNzLCBRTmFtZSBzZXJ2aWNlTmFtZSwgU3RyaW5nIGJpbmRpbmdJZCkgewotICAgICAgICB0aGlzLnBvcnRDbGFzcyA9IHBvcnRDbGFzczsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLmJpbmRpbmdJZCA9IGJpbmRpbmdJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUnVuVGltZU1vZGVsZXIgZ2l2ZW4gYSA8Y29kZT5zZWk8L2NvZGU+IGFuZCA8Y29kZT5iaW5kaW5nPC9jb2RlPgotICAgICAqIEBwYXJhbSBzZWkgVGhlIFNFSSBjbGFzcyB0byBiZSBtb2RlbGVkLgotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgU2VydmljZU5hbWUgdG8gdXNlIGluc3RlYWQgb2Ygb25lIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgKiBAcGFyYW0gYmluZGluZyBUaGUgQmluZGluZyByZXByZXNlbnRpbmcgV1NETCBCaW5kaW5nIGZvciB0aGUgZ2l2ZW4gcG9ydCB0byBiZSB1c2VkIHdoZW4gbW9kZWxpbmcgdGhlCi0gICAgICogPGNvZGU+c2VpPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUnVudGltZU1vZGVsZXIoQ2xhc3Mgc2VpLCBRTmFtZSBzZXJ2aWNlTmFtZSwgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuQmluZGluZyBiaW5kaW5nKXsKLSAgICAgICAgdGhpcy5wb3J0Q2xhc3MgPSBzZWk7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBiaW5kaW5nLmdldEJpbmRpbmdJZCgpOwotICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUnVuVGltZU1vZGVsZXIgZ2l2ZW4gYSA8Y29kZT5wb3J0Q2xhc3M8L2NvZGU+IGFuZCA8Y29kZT5iaW5kaW5nSWQ8L2NvZGU+Ci0gICAgICogaW1wbGVtZW50b3Igb2JqZWN0J3MgY2xhc3MgbWF5IG5vdCBiZSBwb3J0Q2xhc3MsIGFzIGl0IGNvdWxkIGJlIHByb3h5IHRvCi0gICAgICogcG9ydENsYXNzIHdlYm1ldGhvZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9ydENsYXNzIFRoZSBTRUkgY2xhc3MgdG8gYmUgbW9kZWxlZC4KLSAgICAgKiBAcGFyYW0gaW1wbGVtZW50b3IgVGhlIG9iamVjdCBvbiB3aGljaCBzZXJ2aWNlIG1ldGhvZHMgYXJlIGludm9rZWQKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIFNlcnZpY2VOYW1lIHRvIHVzZSBpbnN0ZWFkIG9mIG9uZSBjYWxjdWxhdGVkIGZyb20gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICogQHBhcmFtIGJpbmRpbmdJZCBUaGUgYmluZGluZyBpZGVudGlmaWVyIHRvIGJlIHVzZWQgd2hlbiBtb2RlbGluZyB0aGUgPGNvZGU+cG9ydENsYXNzPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUnVudGltZU1vZGVsZXIoQ2xhc3MgcG9ydENsYXNzLCBPYmplY3QgaW1wbGVtZW50b3IsIFFOYW1lIHNlcnZpY2VOYW1lLCBTdHJpbmcgYmluZGluZ0lkKSB7Ci0gICAgICAgIHRoaXMocG9ydENsYXNzLCBzZXJ2aWNlTmFtZSwgYmluZGluZ0lkKTsKLSAgICAgICAgdGhpcy5pbXBsZW1lbnRvciA9IGltcGxlbWVudG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUnVuVGltZU1vZGVsZXIgZ2l2ZW4gYSA8Y29kZT5zZWk8L2NvZGU+IGNsYXNzIGFuZCA8Y29kZT5iaW5kaW5nPC9jb2RlPgotICAgICAqIGltcGxlbWVudG9yIG9iamVjdCdzIGNsYXNzIG1heSBub3QgYmUgc2VpIENsYXNzLCBhcyBpdCBjb3VsZCBiZSBwcm94eSB0bwotICAgICAqIHNlaSB3ZWJtZXRob2RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBvcnRDbGFzcyBUaGUgU0VJIGNsYXNzIHRvIGJlIG1vZGVsZWQuCi0gICAgICogQHBhcmFtIGltcGxlbWVudG9yIFRoZSBvYmplY3Qgb24gd2hpY2ggc2VydmljZSBtZXRob2RzIGFyZSBpbnZva2VkCi0gICAgICogQHBhcmFtIGJpbmRpbmcgVGhlIEJpbmRpbmcgcmVwcmVzZW50aW5nIFdTREwgQmluZGluZyBmb3IgdGhlIGdpdmVuIHBvcnQgdG8gYmUgdXNlZCB3aGVuIG1vZGVsaW5nIHRoZQotICAgICAqIDxjb2RlPnNlaTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFJ1bnRpbWVNb2RlbGVyKENsYXNzIHBvcnRDbGFzcywgT2JqZWN0IGltcGxlbWVudG9yLCBRTmFtZSBzZXJ2aWNlTmFtZSwgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIHRoaXMocG9ydENsYXNzLCBzZXJ2aWNlTmFtZSwgYmluZGluZyk7Ci0gICAgICAgIHRoaXMuaW1wbGVtZW50b3IgPSBpbXBsZW1lbnRvcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIGNsYXNzbG9hZGVyIHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIGNsYXNzZXMgYnkgdGhlIDxjb2RlPlJ1bnRpbWVNb2RlbGVyPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgQ2xhc3NMb2FkZXIgdXNlZCB0byBsb2FkIGNsYXNzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0cyB0aGUgUG9ydE5hbWUgdG8gYmUgdXNlZCBieSB0aGUgPGNvZGU+UnVudGltZU1vZGVsZXI8L2NvZGU+LgotICAgICAqIEBwYXJhbSBwb3J0TmFtZSBUaGUgUG9ydE5hbWUgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBQb3J0TmFtZQotICAgICAqIHJldHJpZXZlZCB2aWEgYW5ub3RhdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShRTmFtZSBwb3J0TmFtZSkgewotICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgZ2V0UHJpdkNsYXNzQW5ub3RhdGlvbihmaW5hbCBDbGFzcyBjbGF6eiwgZmluYWwgQ2xhc3MgVCkgewotICAgICAgICByZXR1cm4gKFQpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldEFubm90YXRpb24oVCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgZ2V0UHJpdk1ldGhvZEFubm90YXRpb24oZmluYWwgTWV0aG9kIG1ldGhvZCwgZmluYWwgQ2xhc3MgVCkgewotICAgICAgICByZXR1cm4gKFQpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRBbm5vdGF0aW9uKFQpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEFubm90YXRpb25bXVtdIGdldFByaXZQYXJhbWV0ZXJBbm5vdGF0aW9ucyhmaW5hbCBNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbltdW10pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vY3VycmVudGx5IGhhcyBtYW55IGxvY2FsIHZhcnMgd2hpY2ggd2lsbCBiZSBlbGltaW5hdGVkIGFmdGVyIGRlYnVnZ2luZyBpc3N1ZXMKLSAgICAvL2ZpcnN0IGRyYWZ0Ci0gICAgLyoqCi0gICAgICogYnVpbGRzIHRoZSBydW50aW1lIG1vZGVsIGZyb20gdGhlIDxjb2RlPnBvcnRDbGFzczwvY29kZT4gdXNpbmcgdGhlIGJpbmRpbmcgSUQgPGNvZGU+YmluZGluZ0lkPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIG1vZGVsIGZvciB0aGUgPGNvZGU+cG9ydENsYXNzPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUnVudGltZU1vZGVsIGJ1aWxkUnVudGltZU1vZGVsKCkgewotICAgICAgICBydW50aW1lTW9kZWwgPSBuZXcgU09BUFJ1bnRpbWVNb2RlbCgpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IHBvcnRDbGFzczsKLSAgICAgICAgV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gZ2V0UHJpdkNsYXNzQW5ub3RhdGlvbihwb3J0Q2xhc3MsIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICBpZiAod2ViU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5uby53ZWJzZXJ2aWNlLmFubm90YXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwb3J0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpfSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGNsYXp6ID0gZ2V0Q2xhc3Mod2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAgICAgICAgIFdlYlNlcnZpY2Ugc2VpU2VydmljZSA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oY2xhenosIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHNlaVNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLmVuZHBvaW50LmludGVyZmFjZS5uby53ZWJzZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7d2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGdldFNlcnZpY2VOYW1lKHBvcnRDbGFzcyk7Ci0gICAgICAgIHJ1bnRpbWVNb2RlbC5zZXRTZXJ2aWNlUU5hbWUoc2VydmljZU5hbWUpOwotCi0gICAgICAgIFN0cmluZyBwb3J0TG9jYWxOYW1lICA9IHBvcnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkrUE9SVDsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2UucG9ydE5hbWUoKS5sZW5ndGgoKSA+MCkgewotICAgICAgICAgICAgcG9ydExvY2FsTmFtZSA9IHdlYlNlcnZpY2UucG9ydE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmICh3ZWJTZXJ2aWNlLm5hbWUoKS5sZW5ndGgoKSA+MCkgewotICAgICAgICAgICAgcG9ydExvY2FsTmFtZSA9IHdlYlNlcnZpY2UubmFtZSgpK1BPUlQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocG9ydE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHBvcnROYW1lID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwb3J0TG9jYWxOYW1lKTsKLQotICAgICAgICBpZiAoIXBvcnROYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhzZXJ2aWNlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLnBvcnRuYW1lLnNlcnZpY2VuYW1lLm5hbWVzcGFjZS5taXNtYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7c2VydmljZU5hbWUsIHBvcnROYW1lfSk7Ci0gICAgICAgIH0KLSAgICAgICAgcnVudGltZU1vZGVsLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLQotICAgICAgICBwcm9jZXNzQ2xhc3MoY2xhenopOwotICAgICAgICBpZiAocnVudGltZU1vZGVsLmdldEphdmFNZXRob2RzKCkuc2l6ZSgpID09IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5uby5vcGVyYXRpb25zIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwb3J0Q2xhc3MuZ2V0TmFtZSgpLnRvU3RyaW5nKCl9KTsKLSAgICAgICAgcnVudGltZU1vZGVsLnBvc3RQcm9jZXNzKCk7Ci0gICAgICAgIHJldHVybiBydW50aW1lTW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdXRpbGl0eSBtZXRob2QgdG8gbG9hZCBjbGFzc2VzCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gbG9hZAotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHNwZWNpZmllZCBieSA8Y29kZT5jbGFzc05hbWU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5jbGFzcy5ub3QuZm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NsYXNzTmFtZX0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXNlc1dlYk1ldGhvZChDbGFzcyBjbGF6eiwgQm9vbGVhbiB1c2VzV2ViTWV0aG9kKSB7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbGFzczogIitjbGF6ei5nZXROYW1lKCkrIiB1c2VzIFdlYk1ldGhvZDogIit1c2VzV2ViTWV0aG9kKTsKLSAgICAgICAgY2xhc3NVc2VzV2ViTWV0aG9kLnB1dChjbGF6eiwgdXNlc1dlYk1ldGhvZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZGV0ZXJtaW5lV2ViTWV0aG9kVXNlKENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIGlmIChjbGF6eiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAoY2xhenouaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgc2V0VXNlc1dlYk1ldGhvZChjbGF6eiwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgV2ViTWV0aG9kIHdlYk1ldGhvZDsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzV2ViTWV0aG9kID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBjbGF6ei5nZXRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmVxdWFscyhjbGF6eikpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHdlYk1ldGhvZCA9IGdldFByaXZNZXRob2RBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIXdlYk1ldGhvZC5leGNsdWRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzV2ViTWV0aG9kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0VXNlc1dlYk1ldGhvZChjbGF6eiwgaGFzV2ViTWV0aG9kKTsKLSAgICAgICAgfQotICAgICAgICBkZXRlcm1pbmVXZWJNZXRob2RVc2UoY2xhenouZ2V0U3VwZXJjbGFzcygpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByb2Nlc3NDbGFzcyhDbGFzcyBjbGF6eikgewotICAgICAgICBkZXRlcm1pbmVXZWJNZXRob2RVc2UoY2xhenopOwotICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgPSBnZXRQcml2Q2xhc3NBbm5vdGF0aW9uKGNsYXp6LCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHBvcnRUeXBlTG9jYWxOYW1lICA9IGNsYXp6LmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2UubmFtZSgpLmxlbmd0aCgpID4wKQotICAgICAgICAgICAgcG9ydFR5cGVMb2NhbE5hbWUgPSB3ZWJTZXJ2aWNlLm5hbWUoKTsKLQotCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IHdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKGNsYXp6LmdldFBhY2thZ2UoKSAhPSBudWxsKQotICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBjbGF6ei5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcnVudGltZU1vZGVsLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBRTmFtZSBwb3J0VHlwZU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBwb3J0VHlwZUxvY2FsTmFtZSk7Ci0gICAgICAgIHJ1bnRpbWVNb2RlbC5zZXRQb3J0VHlwZU5hbWUocG9ydFR5cGVOYW1lKTsKLSAgICAgICAgcnVudGltZU1vZGVsLnNldFdTRExMb2NhdGlvbih3ZWJTZXJ2aWNlLndzZGxMb2NhdGlvbigpKTsKLQotICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyBzb2FwQmluZGluZyA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oY2xhenosIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzV3JhcHBlZCA9IHNvYXBCaW5kaW5nLnBhcmFtZXRlclN0eWxlKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQpOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHRCaW5kaW5nID0gY3JlYXRlQmluZGluZyhzb2FwQmluZGluZyk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIGlmIGNsYXp6ICE9IHBvcnRDbGFzcyB0aGVuIHRoZXJlIGlzIGFuIFNFSS4gIElmIHRoZXJlIGlzIGFuCi0gICAgICAgICAqIFNFSSwgdGhlbiBhbGwgbWV0aG9kcyBzaG91bGQgYmUgcHJvY2Vzc2VkLiAgSG93ZXZlciwgaWYgdGhlcmUgaXMKLSAgICAgICAgICogbm8gU0VJLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIHVzZXMgYXQgbGVhc3Qgb25lCi0gICAgICAgICAqIFdlYk1ldGhvZCBhbm5vdGF0aW9uLCB0aGVuIG9ubHkgbWV0aG9kcyB3aXRoIHRoaXMgYW5ub3RhdGlvbgotICAgICAgICAgKiB3aWxsIGJlIHByb2Nlc3NlZC4KLSAgICAgICAgICovCi0vKiAgICAgICAgaWYgKGNsYXp6ID09IHBvcnRDbGFzcykgewotICAgICAgICAgICAgV2ViTWV0aG9kIHdlYk1ldGhvZDsKLSAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGNsYXp6LmdldE1ldGhvZHMoKSkgewotICAgICAgICAgICAgICAgIHdlYk1ldGhvZCA9IGdldFByaXZNZXRob2RBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIXdlYk1ldGhvZC5leGNsdWRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlc1dlYk1ldGhvZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSovCi0KLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogY2xhenouZ2V0TWV0aG9kcygpKSB7Ci0gICAgICAgICAgICBpZiAobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZXF1YWxzKE9iamVjdC5jbGFzcykgfHwKLSAgICAgICAgICAgICAgICAhaXNXZWJNZXRob2QobWV0aG9kLCBjbGF6eikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2Nlc3NNZXRob2QobWV0aG9kLCB3ZWJTZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzV2ViTWV0aG9kKE1ldGhvZCBtZXRob2QsIENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIGlmIChjbGF6ei5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBDbGFzcyBkZWNsQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgYm9vbGVhbiBkZWNsSGFzV2ViU2VydmljZSA9IGdldFByaXZDbGFzc0Fubm90YXRpb24oZGVjbENsYXNzLCBXZWJTZXJ2aWNlLmNsYXNzKSAhPSBudWxsOwotICAgICAgICBXZWJNZXRob2Qgd2ViTWV0aG9kID0gZ2V0UHJpdk1ldGhvZEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYKLSAgICAgICAgICAgIHdlYk1ldGhvZC5leGNsdWRlKCkgPT0gZmFsc2UgJiYKLSAgICAgICAgICAgIGRlY2xIYXNXZWJTZXJ2aWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVjbEhhc1dlYlNlcnZpY2UgJiYKLSAgICAgICAgICAgICFjbGFzc1VzZXNXZWJNZXRob2QuZ2V0KGRlY2xDbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGVzIGEgcnVudGltZSBtb2RlbCA8Y29kZT5TT0FQQmluZGluZzwvY29kZT4gZnJvbSBhIDxjb2RlPmphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nPC9jb2RlPiBvYmplY3QKLSAgICAgKiBAcGFyYW0gc29hcEJpbmRpbmcgdGhlIDxjb2RlPmphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nPC9jb2RlPiB0byBtb2RlbAotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgcnVudGltZSBtb2RlbCBTT0FQQmluZGluZyBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPnNvYXBCaW5kaW5nPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwLlNPQVBCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcgc29hcEJpbmRpbmcpIHsKLSAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZyBydFNPQVBCaW5kaW5nID0KLSAgICAgICAgICAgIG5ldyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwLlNPQVBCaW5kaW5nKCk7Ci0gICAgICAgIFN0eWxlIHN0eWxlID0gKHNvYXBCaW5kaW5nID09IG51bGwgfHwKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nLnN0eWxlKCkuZXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5UKSkgPwotICAgICAgICAgICAgU3R5bGUuRE9DVU1FTlQgOiBTdHlsZS5SUEM7Ci0gICAgICAgIHJ0U09BUEJpbmRpbmcuc2V0U3R5bGUoc3R5bGUpOwotICAgICAgICAvL2RlZmF1bHQgc29hcCB2ZXJzaW9uIGlzIDEuMSwgY2hhbmdlIGl0IHRvIHNvYXAgMS4yIGlmIHRoZSBiaW5kaW5nIGlkIHNheXMgc28KLSAgICAgICAgaWYoU09BUFZlcnNpb24uU09BUF8xMi5lcXVhbHMoYmluZGluZ0lkKSkKLSAgICAgICAgICAgIHJ0U09BUEJpbmRpbmcuc2V0U09BUFZlcnNpb24oU09BUFZlcnNpb24uU09BUF8xMik7Ci0gICAgICAgIHJldHVybiBydFNPQVBCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldHMgdGhlIG5hbWVzcGFjZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvciBhIGdpdmVuIDxjb2RlPnBhY2thZ2VOYW1lPC9jb2RlPgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB1c2VkIHRvIGZpbmQgYSBuYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+cGFja2FnZU5hbWU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGFja2FnZU5hbWUsICIuIik7Ci0gICAgICAgIFN0cmluZ1tdIHRva2VuczsKLSAgICAgICAgaWYgKHRva2VuaXplci5jb3VudFRva2VucygpID09IDApIHsKLSAgICAgICAgICAgIHRva2VucyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0b2tlbnMgPSBuZXcgU3RyaW5nW3Rva2VuaXplci5jb3VudFRva2VucygpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9dG9rZW5pemVyLmNvdW50VG9rZW5zKCktMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICB0b2tlbnNbaV0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIG5hbWVzcGFjZSA9IG5ldyBTdHJpbmdCdWZmZXIoImh0dHA6Ly8iKTsKLSAgICAgICAgU3RyaW5nIGRvdCA9ICIiOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8dG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaT09MSkKLSAgICAgICAgICAgICAgICBkb3QgPSAiLiI7Ci0gICAgICAgICAgICBuYW1lc3BhY2UuYXBwZW5kKGRvdCt0b2tlbnNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIG5hbWVzcGFjZS5hcHBlbmQoJy8nKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZXMgdGhlIHJ1bnRpbWUgbW9kZWwgZm9yIGEgbWV0aG9kIG9uIHRoZSA8Y29kZT5wb3J0Q2xhc3M8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kIHRvIG1vZGVsCi0gICAgICogQHBhcmFtIHdlYlNlcnZpY2UgdGhlIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5XZWJTZXJ2aWNlPC9jb2RlPiBhbm5vdGF0aW9uIG9uIHRoZSA8Y29kZT5wb3J0Q2xhc3M8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01ldGhvZChNZXRob2QgbWV0aG9kLCBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgaWYgKCFNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXZWJNZXRob2Qgd2ViTWV0aG9kID0gZ2V0UHJpdk1ldGhvZEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYgd2ViTWV0aG9kLmV4Y2x1ZGUoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBJZiBvbmUgV2ViTWV0aG9kIGlzIHVzZWQsIHRoZW4gb25seSBtZXRob2RzIHdpdGggV2ViTWV0aG9kIHdpbGwgYmUKLSAgICAgICAgLy8gcHJvY2Vzc2VkLgotICAgICAgICBpZiAodXNlc1dlYk1ldGhvZCAmJiB3ZWJNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXNlIGltcGxlbWVudG9yIHRvIGZpbmQgdGhlIGV4YWN0IGludm9jYXRpb24gbWV0aG9kIGFzIGltcGxlbWVudG9yCi0gICAgICAgIC8vIGNvdWxkIGJlIGEgcHJveHkgdG8gcG9ydENsYXNzIG9iamVjdAotICAgICAgICBKYXZhTWV0aG9kIGphdmFNZXRob2Q7Ci0gICAgICAgIENsYXNzIGltcGxlbWVudG9yQ2xhc3MgPSAoaW1wbGVtZW50b3IgIT0gbnVsbCkKLSAgICAgICAgICAgID8gaW1wbGVtZW50b3IuZ2V0Q2xhc3MoKSA6IHBvcnRDbGFzczsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmVxdWFscyhpbXBsZW1lbnRvckNsYXNzKSkgewotICAgICAgICAgICAgamF2YU1ldGhvZCA9IG5ldyBKYXZhTWV0aG9kKG1ldGhvZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1ldGhvZCB0bXBNZXRob2QgPSBpbXBsZW1lbnRvckNsYXNzLmdldE1ldGhvZChtZXRob2QuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0gICAgICAgICAgICAgICAgamF2YU1ldGhvZCA9IG5ldyBKYXZhTWV0aG9kKHRtcE1ldGhvZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLm1ldGhvZC5ub3QuZm91bmQiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge21ldGhvZC5nZXROYW1lKCksIHBvcnRDbGFzcy5nZXROYW1lKCl9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgIGludCBtb2RpZmllciA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgLy91c2UgZm9yIGNoZWNraW5nCi0KLSAgICAgICAgLy9zZXQgTUVQIC1vbmV3YXksIGFzeW5jLCByZXEvcmVzcAotICAgICAgICBpbnQgbWVwID0gZ2V0TUVQKG1ldGhvZCk7Ci0gICAgICAgIGphdmFNZXRob2Quc2V0TUVQKG1lcCk7Ci0KLSAgICAgICAgU3RyaW5nIGFjdGlvbiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKHdlYk1ldGhvZCAhPSBudWxsICkgewotICAgICAgICAgICAgYWN0aW9uID0gd2ViTWV0aG9kLmFjdGlvbigpOwotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSA9IHdlYk1ldGhvZC5vcGVyYXRpb25OYW1lKCkubGVuZ3RoKCkgPiAwID8KLSAgICAgICAgICAgICAgICB3ZWJNZXRob2Qub3BlcmF0aW9uTmFtZSgpIDoKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOwotICAgICAgICB9Ci0gICAgICAgIGphdmFNZXRob2Quc2V0T3BlcmF0aW9uTmFtZShvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgU09BUEJpbmRpbmcgbWV0aG9kQmluZGluZyA9Ci0gICAgICAgICAgICBtZXRob2QuZ2V0QW5ub3RhdGlvbihTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmIChtZXRob2RCaW5kaW5nID09IG51bGwgJiYgIW1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmVxdWFscyhwb3J0Q2xhc3MpKSB7Ci0gICAgICAgICAgICBpZiAoIW1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RCaW5kaW5nID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0QW5ub3RhdGlvbihTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBtZXRob2RJc1dyYXBwZWQgPSBpc1dyYXBwZWQ7Ci0gICAgICAgIFN0eWxlIHN0eWxlID0gZGVmYXVsdEJpbmRpbmcuZ2V0U3R5bGUoKTsKLSAgICAgICAgaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZyBteVNPQVBCaW5kaW5nID0gY3JlYXRlQmluZGluZyhtZXRob2RCaW5kaW5nKTsKLSAgICAgICAgICAgIHN0eWxlID0gbXlTT0FQQmluZGluZy5nZXRTdHlsZSgpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIG15U09BUEJpbmRpbmcuc2V0U09BUEFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgbWV0aG9kSXNXcmFwcGVkID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJTdHlsZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLSAgICAgICAgICAgIGphdmFNZXRob2Quc2V0QmluZGluZyhteVNPQVBCaW5kaW5nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmcgc2IgPSBuZXcgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TT0FQQmluZGluZyhkZWZhdWx0QmluZGluZyk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2Iuc2V0U09BUEFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNiLnNldFNPQVBBY3Rpb24oIiIpOwotICAgICAgICAgICAgamF2YU1ldGhvZC5zZXRCaW5kaW5nKHNiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1ldGhvZElzV3JhcHBlZCkgewotICAgICAgICAgICAgcHJvY2Vzc0RvY0JhcmVNZXRob2QoamF2YU1ldGhvZCwgbWV0aG9kTmFtZSwgd2ViTWV0aG9kLCBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgIG1ldGhvZCwgd2ViU2VydmljZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3R5bGUuZXF1YWxzKFN0eWxlLkRPQ1VNRU5UKSkgewotICAgICAgICAgICAgcHJvY2Vzc0RvY1dyYXBwZWRNZXRob2QoamF2YU1ldGhvZCwgbWV0aG9kTmFtZSwgd2ViTWV0aG9kLCBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgIG1ldGhvZCwgd2ViU2VydmljZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9jZXNzUnBjTWV0aG9kKGphdmFNZXRob2QsIG1ldGhvZE5hbWUsIHdlYk1ldGhvZCwgb3BlcmF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICBtZXRob2QsIHdlYlNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJ1bnRpbWVNb2RlbC5hZGRKYXZhTWV0aG9kKGphdmFNZXRob2QpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldE1FUChNZXRob2QgbSl7Ci0gICAgICAgIGlmIChtLmlzQW5ub3RhdGlvblByZXNlbnQoT25ld2F5LmNsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VTdHJ1Y3QuT05FX1dBWV9NRVA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoUmVzcG9uc2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShtLmdldFJldHVyblR5cGUoKSkpewotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VTdHJ1Y3QuQVNZTkNfUE9MTF9NRVA7Ci0gICAgICAgIH1lbHNlIGlmKEZ1dHVyZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG0uZ2V0UmV0dXJuVHlwZSgpKSl7Ci0gICAgICAgICAgICByZXR1cm4gTWVzc2FnZVN0cnVjdC5BU1lOQ19DQUxMQkFDS19NRVA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VTdHJ1Y3QuUkVRVUVTVF9SRVNQT05TRV9NRVA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbW9kZWxzIGEgZG9jdW1lbnQvbGl0ZXJhbCB3cmFwcGVkIG1ldGhvZAotICAgICAqIEBwYXJhbSBqYXZhTWV0aG9kIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAgICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbk5hbWUgdGhlIHJ1bnRpbWUgbW9kZWwgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIDxjb2RlPm1ldGhvZDwvY29kZT4gdG8gbW9kZWwKLSAgICAgKiBAcGFyYW0gd2ViU2VydmljZSBUaGUgPGNvZGU+V2ViU2VydmljZTwvY29kZT4gYW5ub3RhdGlvbiBpbnN0YW5jZSBvbiB0aGUgPGNvZGU+cG9ydENsYXNzPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NEb2NXcmFwcGVkTWV0aG9kKEphdmFNZXRob2QgamF2YU1ldGhvZCwgU3RyaW5nIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViTWV0aG9kIHdlYk1ldGhvZCwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIE1ldGhvZCBtZXRob2QsIFdlYlNlcnZpY2Ugd2ViU2VydmljZSkgewotICAgICAgICBib29sZWFuIGlzT25ld2F5ID0gbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoT25ld2F5LmNsYXNzKTsKLSAgICAgICAgUmVxdWVzdFdyYXBwZXIgcmVxV3JhcHBlciA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKFJlcXVlc3RXcmFwcGVyLmNsYXNzKTsKLSAgICAgICAgUmVzcG9uc2VXcmFwcGVyIHJlc1dyYXBwZXIgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihSZXNwb25zZVdyYXBwZXIuY2xhc3MpOwotICAgICAgICBTdHJpbmcgYmVhblBhY2thZ2UgPSBwYWNrYWdlTmFtZSArIFBEX0pBWFdTX1BBQ0tBR0VfUEQ7Ci0gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApKQotICAgICAgICAgICAgYmVhblBhY2thZ2UgPSBKQVhXU19QQUNLQUdFX1BEOwotICAgICAgICBTdHJpbmcgcmVxdWVzdENsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmKHJlcVdyYXBwZXIgIT0gbnVsbCAmJiByZXFXcmFwcGVyLmNsYXNzTmFtZSgpLmxlbmd0aCgpPjApewotICAgICAgICAgICAgcmVxdWVzdENsYXNzTmFtZSA9IHJlcVdyYXBwZXIuY2xhc3NOYW1lKCk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgcmVxdWVzdENsYXNzTmFtZSA9IGJlYW5QYWNrYWdlICsgY2FwaXRhbGl6ZShtZXRob2QuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlQ2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgaWYocmVzV3JhcHBlciAhPSBudWxsICYmIHJlc1dyYXBwZXIuY2xhc3NOYW1lKCkubGVuZ3RoKCk+MCl7Ci0gICAgICAgICAgICByZXNwb25zZUNsYXNzTmFtZSA9IHJlc1dyYXBwZXIuY2xhc3NOYW1lKCk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgcmVzcG9uc2VDbGFzc05hbWUgPSBiZWFuUGFja2FnZSArIGNhcGl0YWxpemUobWV0aG9kLmdldE5hbWUoKSkgKyBSRVNQT05TRTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHJlcXVlc3RDbGFzcyA9IGdldENsYXNzKHJlcXVlc3RDbGFzc05hbWUpOwotCi0gICAgICAgIFN0cmluZyByZXFOYW1lID0gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgU3RyaW5nIHJlcU5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgaWYgKHJlcVdyYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlcVdyYXBwZXIudGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJlcU5hbWVzcGFjZSA9IHJlcVdyYXBwZXIudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAocmVxV3JhcHBlci5sb2NhbE5hbWUoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgcmVxTmFtZSA9IHJlcVdyYXBwZXIubG9jYWxOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgcmVxRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUocmVxTmFtZXNwYWNlLCByZXFOYW1lKTsKLQotICAgICAgICBDbGFzcyByZXNwb25zZUNsYXNzID0gbnVsbDsKLSAgICAgICAgUU5hbWUgcmVzRWxlbWVudE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgcmVzTmFtZSA9IG9wZXJhdGlvbk5hbWUrIlJlc3BvbnNlIjsKLSAgICAgICAgU3RyaW5nIHJlc05hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgaWYgKCFpc09uZXdheSkgewotICAgICAgICAgICAgcmVzcG9uc2VDbGFzcyA9IGdldENsYXNzKHJlc3BvbnNlQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXNXcmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzV3JhcHBlci50YXJnZXROYW1lc3BhY2UoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHJlc05hbWVzcGFjZSA9IHJlc1dyYXBwZXIudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc1dyYXBwZXIubG9jYWxOYW1lKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICByZXNOYW1lID0gcmVzV3JhcHBlci5sb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXNFbGVtZW50TmFtZSA9IG5ldyBRTmFtZShyZXNOYW1lc3BhY2UsIHJlc05hbWUpOwotCi0gICAgICAgIFR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9Ci0gICAgICAgICAgICAgICAgbmV3IFR5cGVSZWZlcmVuY2UocmVxRWxlbWVudE5hbWUsIHJlcXVlc3RDbGFzcywgbmV3IEFubm90YXRpb25bMF0pOwotICAgICAgICBXcmFwcGVyUGFyYW1ldGVyIHJlcXVlc3RXcmFwcGVyID0gbmV3IFdyYXBwZXJQYXJhbWV0ZXIodHlwZVJlZiwKLSAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuSU4sIDApOwotICAgICAgICByZXF1ZXN0V3JhcHBlci5zZXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuQk9EWSk7Ci0gICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJlcXVlc3RXcmFwcGVyKTsKLSAgICAgICAgV3JhcHBlclBhcmFtZXRlciByZXNwb25zZVdyYXBwZXIgPSBudWxsOwotICAgICAgICBpZiAoIWlzT25ld2F5KSB7Ci0gICAgICAgICAgICB0eXBlUmVmID0gbmV3IFR5cGVSZWZlcmVuY2UocmVzRWxlbWVudE5hbWUsIHJlc3BvbnNlQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bMF0pOwotICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXJQYXJhbWV0ZXIodHlwZVJlZiwKLSAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLk9VVCwgLTEpOwotICAgICAgICAgICAgamF2YU1ldGhvZC5hZGRQYXJhbWV0ZXIocmVzcG9uc2VXcmFwcGVyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlci5zZXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuQk9EWSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXR1cm4gdmFsdWUKLSAgICAgICAgU3RyaW5nIHJlc3VsdE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgcmVzdWx0VE5TID0gIiI7Ci0gICAgICAgIFFOYW1lIHJlc3VsdFFOYW1lID0gbnVsbDsKLSAgICAgICAgV2ViUmVzdWx0IHdlYlJlc3VsdCA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKFdlYlJlc3VsdC5jbGFzcyk7Ci0gICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBib29sZWFuIGlzUmVzdWx0SGVhZGVyID0gZmFsc2U7Ci0gICAgICAgIGlmICh3ZWJSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHdlYlJlc3VsdC5uYW1lKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJlc3VsdE5hbWUgPSB3ZWJSZXN1bHQubmFtZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdE5hbWUgPSBSRVRVUk47Ci0gICAgICAgICAgICByZXN1bHRUTlMgPSB3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpc1Jlc3VsdEhlYWRlciA9IHdlYlJlc3VsdC5oZWFkZXIoKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHRUTlMubGVuZ3RoKCkgPT0gMCAmJiB3ZWJSZXN1bHQuaGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBoZWFkZXJzIG11c3QgaGF2ZSBhIG5hbWVzcGFjZQotICAgICAgICAgICAgICAgIHJlc3VsdFROUyA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdFFOYW1lID0gbmV3IFFOYW1lKHJlc3VsdFROUywgcmVzdWx0TmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWlzT25ld2F5ICYmICFyZXR1cm5UeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSAmJiAhamF2YU1ldGhvZC5pc0FzeW5jKCkpIHsKLSAgICAgICAgICAgIGlmKHJlc3VsdFFOYW1lID09IG51bGwpewotICAgICAgICAgICAgICAgIHJlc3VsdFFOYW1lID0gbmV3IFFOYW1lKHJlc3VsdFROUywgUkVUVVJOKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGphdmFNZXRob2QuaXNBc3luYygpKXsKLSAgICAgICAgICAgIHJldHVyblR5cGUgPSBnZXRBc3luY1JldHVyblR5cGUobWV0aG9kLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgIHJlc3VsdFFOYW1lID0gbmV3IFFOYW1lKFJFVFVSTik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzT25ld2F5ICYmIChyZXR1cm5UeXBlICE9IG51bGwpICYmICghcmV0dXJuVHlwZS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikpKSB7Ci0gICAgICAgICAgICBDbGFzcyByZXR1cm5DbGF6eiA9IHJldHVyblR5cGU7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uW10gcmFubiA9IG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgaWYgKHJlc3VsdFFOYW1lLmdldExvY2FsUGFydCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBUeXBlUmVmZXJlbmNlIHJUeXBlUmVmZXJlbmNlID0gbmV3IFR5cGVSZWZlcmVuY2UocmVzdWx0UU5hbWUsIHJldHVyblR5cGUsIHJhbm4pOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlciByZXR1cm5QYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHJUeXBlUmVmZXJlbmNlLCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLk9VVCwgLTEpOwotICAgICAgICAgICAgICAgIGlmIChpc1Jlc3VsdEhlYWRlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXIuc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkhFQURFUik7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJldHVyblBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuUGFyYW1ldGVyLnNldEJpbmRpbmcoUGFyYW1ldGVyQmluZGluZy5CT0RZKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyLmFkZFdyYXBwZXJDaGlsZChyZXR1cm5QYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vZ2V0IFdlYlBhcmFtCi0gICAgICAgIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgVHlwZVtdIGdlbmVyaWNQYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgQW5ub3RhdGlvbltdW10gcGFubm90YXRpb25zID0gZ2V0UHJpdlBhcmFtZXRlckFubm90YXRpb25zKG1ldGhvZCk7Ci0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICBRTmFtZSBwYXJhbVFOYW1lID0gbnVsbDsKLSAgICAgICAgZm9yIChDbGFzcyBjbGF6elR5cGUgOiBwYXJhbWV0ZXJUeXBlcykgewotICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lPW51bGw7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9ICJhcmciK3BvczsKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWVzcGFjZSA9ICIiOwotICAgICAgICAgICAgYm9vbGVhbiBpc0hlYWRlciA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZihqYXZhTWV0aG9kLmlzQXN5bmMoKSAmJiBBc3luY0hhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6elR5cGUpKXsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBpc0hvbGRlciA9IEhPTERFUl9DTEFTUy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6VHlwZSk7Ci0gICAgICAgICAgICAvL3NldCB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnQgb2YgSG9sZGVyIGluIHRoZSBUeXBlUmVmZXJlbmNlCi0gICAgICAgICAgICBpZiAoaXNIb2xkZXIpIHsKLSAgICAgICAgICAgICAgICBpZihjbGF6elR5cGUuZ2V0TmFtZSgpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXp6VHlwZSA9IE5hdmlnYXRvci5SRUZMRUNUSU9OLmVyYXN1cmUoKChQYXJhbWV0ZXJpemVkVHlwZSlnZW5lcmljUGFyYW1ldGVyVHlwZXNbcG9zXSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlIHBhcmFtTW9kZSA9IGlzSG9sZGVyID8KLSAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLklOT1VUIDoKLSAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLklOOwotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBwYW5ub3RhdGlvbnNbcG9zXSkgewotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkgPT0gamF2YXguandzLldlYlBhcmFtLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmF4Lmp3cy5XZWJQYXJhbSB3ZWJQYXJhbSA9IChqYXZheC5qd3MuV2ViUGFyYW0pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbS5uYW1lKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gd2ViUGFyYW0ubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpc0hlYWRlciA9IHdlYlBhcmFtLmhlYWRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZih3ZWJQYXJhbS5wYXJ0TmFtZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0gd2ViUGFyYW0ucGFydE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSBwYXJhbU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0hlYWRlcikgLy8gaGVhZGVycyBjYW5ub3QgYmUgaW4gZW1wdHkgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF3ZWJQYXJhbS50YXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzcGFjZSA9IHdlYlBhcmFtLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFdlYlBhcmFtLk1vZGUgbW9kZSA9IHdlYlBhcmFtLm1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzSG9sZGVyICYmIG1vZGUgPT0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU4pCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU5PVVQ7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtTW9kZSA9IChtb2RlID09IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlLklOKSA/IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuSU4gOgotICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU5PVVQpID8gY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuTW9kZS5JTk9VVCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLk9VVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1RTmFtZSA9IG5ldyBRTmFtZShwYXJhbU5hbWVzcGFjZSwgcGFyYW1OYW1lKTsKLSAgICAgICAgICAgIHR5cGVSZWYgPQotICAgICAgICAgICAgICAgIG5ldyBUeXBlUmVmZXJlbmNlKHBhcmFtUU5hbWUsIGNsYXp6VHlwZSwgcGFubm90YXRpb25zW3Bvc10pOwotICAgICAgICAgICAgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKHR5cGVSZWYsIHBhcmFtTW9kZSwgcG9zKyspOwotICAgICAgICAgICAgaWYgKGlzSGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0uc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkhFQURFUik7Ci0gICAgICAgICAgICAgICAgamF2YU1ldGhvZC5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICAgICAgICAgIHBhcmFtLnNldFBhcnROYW1lKHBhcnROYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0uc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkJPRFkpOwotICAgICAgICAgICAgICAgIGlmICghcGFyYW1Nb2RlLmVxdWFscyhjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLk9VVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXIuYWRkV3JhcHBlckNoaWxkKHBhcmFtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFwYXJhbU1vZGUuZXF1YWxzKGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuSU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc09uZXdheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIub25ld2F5Lm9wZXJhdGlvbi5uby5vdXQucGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cG9ydENsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgbWV0aG9kTmFtZX0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlci5hZGRXcmFwcGVyQ2hpbGQocGFyYW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9jZXNzRXhjZXB0aW9ucyhqYXZhTWV0aG9kLCBtZXRob2QpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogbW9kZWxzIGEgcnBjL2xpdGVyYWwgbWV0aG9kCi0gICAgICogQHBhcmFtIGphdmFNZXRob2QgdGhlIHJ1bnRpbWUgbW9kZWwgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5tZXRob2Q8L2NvZGU+IGJlaW5nIG1vZGVsZWQuCi0gICAgICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgPGNvZGU+V2ViTWV0aG9kPC9jb2RlPiBhbm5vdGF0aW9ucyBpbnN0YW5jZSBvbiB0aGUgPGNvZGU+bWV0aG9kPC9jb2RlPgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25OYW1lIHRoZSBXU0RMIG9wZXJhdGlvbiBuYW1lIGZvciB0aGlzIDxjb2RlPm1ldGhvZDwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICAgKiBAcGFyYW0gd2ViU2VydmljZSB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JwY01ldGhvZChKYXZhTWV0aG9kIGphdmFNZXRob2QsIFN0cmluZyBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViTWV0aG9kIHdlYk1ldGhvZCwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIE1ldGhvZCBtZXRob2QsIFdlYlNlcnZpY2Ugd2ViU2VydmljZSkgewotICAgICAgICBib29sZWFuIGlzT25ld2F5ID0gbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoT25ld2F5LmNsYXNzKTsKLSAgICAgICAgLy9idWlsZCBvcmRlcmVkIGxpc3QKLSAgICAgICAgTWFwPEludGVnZXIsIFBhcmFtZXRlcj4gcmVzUnBjUGFyYW1zID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgUGFyYW1ldGVyPigpOwotICAgICAgICBNYXA8SW50ZWdlciwgUGFyYW1ldGVyPiByZXFScGNQYXJhbXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBQYXJhbWV0ZXI+KCk7Ci0KLSAgICAgICAgLy9MZXRzIHRha2UgdGhlIHNlcnZpY2UgbmFtZXNwYWNlIGFuZCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgb25lIHdlIGdldCBpdCBmcm9tIHdzZGwKLSAgICAgICAgU3RyaW5nIHJlcU5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgU3RyaW5nIHJlc3BOYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIGlmKGJpbmRpbmcgIT0gbnVsbCl7Ci0gICAgICAgICAgICBiaW5kaW5nLmZpbmFsaXplQmluZGluZygpOwotICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBvcCA9IGJpbmRpbmcuZ2V0KG9wZXJhdGlvbk5hbWUpOwotICAgICAgICAgICAgaWYob3AgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgLy9pdCBjYW50IGJlIG51bGwsIGJ1dCBsZXRzIG5vdCBmYWlsIGFuZCB0cnkgdG8gd29yayB3aXRoIHNlcnZpY2UgbmFtZXNwY2UKLSAgICAgICAgICAgICAgICBpZihvcC5nZXRSZXF1ZXN0TmFtZXNwYWNlKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHJlcU5hbWVzcGFjZSA9IG9wLmdldFJlcXVlc3ROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2l0IGNhbnQgYmUgbnVsbCwgYnV0IGxldHMgbm90IGZhaWwgYW5kIHRyeSB0byB3b3JrIHdpdGggc2VydmljZSBuYW1lc3BjZQotICAgICAgICAgICAgICAgIGlmKG9wLmdldFJlc3BvbnNlTmFtZXNwYWNlKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BOYW1lc3BhY2UgPSBvcC5nZXRSZXNwb25zZU5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIHJlcUVsZW1lbnROYW1lID0gbmV3IFFOYW1lKHJlcU5hbWVzcGFjZSwgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFFOYW1lIHJlc0VsZW1lbnROYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKCFpc09uZXdheSkgewotICAgICAgICAgICAgcmVzRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUocmVzcE5hbWVzcGFjZSwgb3BlcmF0aW9uTmFtZStSRVNQT05TRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPQotICAgICAgICAgICAgICAgIG5ldyBUeXBlUmVmZXJlbmNlKHJlcUVsZW1lbnROYW1lLCBSUENfTElUX1BBWUxPQURfQ0xBU1MsIG5ldyBBbm5vdGF0aW9uWzBdKTsKLSAgICAgICAgV3JhcHBlclBhcmFtZXRlciByZXF1ZXN0V3JhcHBlciA9IG5ldyBXcmFwcGVyUGFyYW1ldGVyKHR5cGVSZWYsCi0gICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLklOLCAwKTsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXIuc2V0SW5CaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuQk9EWSk7Ci0gICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJlcXVlc3RXcmFwcGVyKTsKLSAgICAgICAgV3JhcHBlclBhcmFtZXRlciByZXNwb25zZVdyYXBwZXIgPSBudWxsOwotICAgICAgICBpZiAoIWlzT25ld2F5KSB7Ci0gICAgICAgICAgICB0eXBlUmVmID0gbmV3IFR5cGVSZWZlcmVuY2UocmVzRWxlbWVudE5hbWUsIFJQQ19MSVRfUEFZTE9BRF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblswXSk7Ci0gICAgICAgICAgICByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlclBhcmFtZXRlcih0eXBlUmVmLAotICAgICAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuT1VULCAtMSk7Ci0gICAgICAgICAgICByZXNwb25zZVdyYXBwZXIuc2V0T3V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkJPRFkpOwotICAgICAgICAgICAgamF2YU1ldGhvZC5hZGRQYXJhbWV0ZXIocmVzcG9uc2VXcmFwcGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBTdHJpbmcgcmVzdWx0TmFtZSA9IFJFVFVSTjsKLSAgICAgICAgU3RyaW5nIHJlc3VsdFROUyA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdFBhcnROYW1lID0gcmVzdWx0TmFtZTsKLSAgICAgICAgUU5hbWUgcmVzdWx0UU5hbWUgPSBudWxsOwotICAgICAgICBib29sZWFuIGlzUmVzdWx0SGVhZGVyID0gZmFsc2U7Ci0gICAgICAgIFdlYlJlc3VsdCB3ZWJSZXN1bHQgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJSZXN1bHQuY2xhc3MpOwotCi0gICAgICAgIGlmICh3ZWJSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaXNSZXN1bHRIZWFkZXIgPSB3ZWJSZXN1bHQuaGVhZGVyKCk7Ci0gICAgICAgICAgICBpZiAod2ViUmVzdWx0Lm5hbWUoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgcmVzdWx0TmFtZSA9IHdlYlJlc3VsdC5uYW1lKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzdWx0TmFtZSA9IFJFVFVSTjsKLSAgICAgICAgICAgIGlmICh3ZWJSZXN1bHQucGFydE5hbWUoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHRQYXJ0TmFtZSA9IHdlYlJlc3VsdC5wYXJ0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICghaXNSZXN1bHRIZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdE5hbWUgPSByZXN1bHRQYXJ0TmFtZTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdFBhcnROYW1lID0gcmVzdWx0TmFtZTsKLSAgICAgICAgICAgIGlmICh3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJlc3VsdFROUyA9IHdlYlJlc3VsdC50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlzUmVzdWx0SGVhZGVyID0gd2ViUmVzdWx0LmhlYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1Jlc3VsdEhlYWRlcikKLSAgICAgICAgICAgIHJlc3VsdFFOYW1lID0gbmV3IFFOYW1lKHJlc3VsdFROUywgcmVzdWx0TmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdFFOYW1lID0gbmV3IFFOYW1lKHJlc3VsdE5hbWUpOwotCi0gICAgICAgIGlmKGphdmFNZXRob2QuaXNBc3luYygpKXsKLSAgICAgICAgICAgIHJldHVyblR5cGUgPSBnZXRBc3luY1JldHVyblR5cGUobWV0aG9kLCByZXR1cm5UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNPbmV3YXkgJiYgKHJldHVyblR5cGUgIT0gbnVsbCkgJiYgKCFyZXR1cm5UeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkpIHsKLSAgICAgICAgICAgIENsYXNzIHJldHVybkNsYXp6ID0gcmV0dXJuVHlwZTsKLSAgICAgICAgICAgIEFubm90YXRpb25bXSByYW5uID0gbWV0aG9kLmdldEFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICBUeXBlUmVmZXJlbmNlIHJUeXBlUmVmZXJlbmNlID0gbmV3IFR5cGVSZWZlcmVuY2UocmVzdWx0UU5hbWUsIHJldHVyblR5cGUsIHJhbm4pOwotICAgICAgICAgICAgUGFyYW1ldGVyIHJldHVyblBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoclR5cGVSZWZlcmVuY2UsIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuT1VULCAtMSk7Ci0gICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXIuc2V0UGFydE5hbWUocmVzdWx0UGFydE5hbWUpOwotICAgICAgICAgICAgaWYoaXNSZXN1bHRIZWFkZXIpewotICAgICAgICAgICAgICAgIHJldHVyblBhcmFtZXRlci5zZXRCaW5kaW5nKFBhcmFtZXRlckJpbmRpbmcuSEVBREVSKTsKLSAgICAgICAgICAgICAgICBqYXZhTWV0aG9kLmFkZFBhcmFtZXRlcihyZXR1cm5QYXJhbWV0ZXIpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyByYiA9IGdldEJpbmRpbmcoYmluZGluZywgb3BlcmF0aW9uTmFtZSwgcmVzdWx0UGFydE5hbWUsIGZhbHNlLCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLk9VVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuUGFyYW1ldGVyLnNldEJpbmRpbmcocmIpOwotICAgICAgICAgICAgICAgIGlmKHJiLmlzQm9keSgpIHx8IHJiLmlzVW5ib3VuZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgUGFydCBwID0gZ2V0UGFydChvcGVyYXRpb25OYW1lLCByZXN1bHRQYXJ0TmFtZSwgTW9kZS5PVVQpOwotICAgICAgICAgICAgICAgICAgICBpZihwID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNScGNQYXJhbXMucHV0KHJlc1JwY1BhcmFtcy5zaXplKCksIHJldHVyblBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JwY1BhcmFtcy5wdXQocC5nZXRJbmRleCgpLCByZXR1cm5QYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgICAgICAvL3Jlc3BvbnNlV3JhcHBlci5hZGRXcmFwcGVyQ2hpbGQocmV0dXJuUGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgamF2YU1ldGhvZC5hZGRQYXJhbWV0ZXIocmV0dXJuUGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL2dldCBXZWJQYXJhbQotICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIFR5cGVbXSBnZW5lcmljUGFyYW1ldGVyVHlwZXMgPSBtZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIEFubm90YXRpb25bXVtdIHBhbm5vdGF0aW9ucyA9IGdldFByaXZQYXJhbWV0ZXJBbm5vdGF0aW9ucyhtZXRob2QpOwotICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSA9IG51bGw7Ci0gICAgICAgIGZvciAoQ2xhc3MgY2xhenpUeXBlIDogcGFyYW1ldGVyVHlwZXMpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9ICIiOwotICAgICAgICAgICAgYm9vbGVhbiBpc0hlYWRlciA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZihqYXZhTWV0aG9kLmlzQXN5bmMoKSAmJiBBc3luY0hhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6elR5cGUpKXsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBpc0hvbGRlciA9IEhPTERFUl9DTEFTUy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6VHlwZSk7Ci0gICAgICAgICAgICAvL3NldCB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnQgb2YgSG9sZGVyIGluIHRoZSBUeXBlUmVmZXJlbmNlCi0gICAgICAgICAgICBpZiAoaXNIb2xkZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xhenpUeXBlLmdldE5hbWUoKS5lcXVhbHMoSG9sZGVyLmNsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIGNsYXp6VHlwZSA9IE5hdmlnYXRvci5SRUZMRUNUSU9OLmVyYXN1cmUoKChQYXJhbWV0ZXJpemVkVHlwZSlnZW5lcmljUGFyYW1ldGVyVHlwZXNbcG9zXSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUgcGFyYW1Nb2RlID0gaXNIb2xkZXIgPwotICAgICAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuSU5PVVQgOgotICAgICAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuSU47Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IHBhbm5vdGF0aW9uc1twb3NdKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSA9PSBqYXZheC5qd3MuV2ViUGFyYW0uY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YXguandzLldlYlBhcmFtIHdlYlBhcmFtID0gKGphdmF4Lmp3cy5XZWJQYXJhbSkgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gd2ViUGFyYW0ubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSA9IHdlYlBhcmFtLnBhcnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlzSGVhZGVyID0gd2ViUGFyYW0uaGVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIFdlYlBhcmFtLk1vZGUgbW9kZSA9IHdlYlBhcmFtLm1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc3BhY2UgPSB3ZWJQYXJhbS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzSG9sZGVyICYmIG1vZGUgPT0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU4pCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU5PVVQ7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtTW9kZSA9IChtb2RlID09IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlLklOKSA/IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuSU4gOgotICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU5PVVQpID8gY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuTW9kZS5JTk9VVCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLk9VVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyYW1OYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSAiYXJnIitwb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFydE5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHBhcnROYW1lID0gcGFyYW1OYW1lOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaXNIZWFkZXIpIHsKLSAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBwYXJ0TmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJ0TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGFydE5hbWUgPSBwYXJhbU5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaXNIZWFkZXIpIHsKLSAgICAgICAgICAgICAgICAvL2l0cyBycGNsaXQgYm9keSBwYXJhbSwgc2V0IG5hbWVzcGFjZSB0byAiIgotICAgICAgICAgICAgICAgIHBhcmFtUU5hbWUgPSBuZXcgUU5hbWUoIiIsIHBhcmFtTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbU5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgICAgICBwYXJhbVFOYW1lID0gbmV3IFFOYW1lKHBhcmFtTmFtZXNwYWNlLCBwYXJhbU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHlwZVJlZiA9Ci0gICAgICAgICAgICAgICAgbmV3IFR5cGVSZWZlcmVuY2UocGFyYW1RTmFtZSwgY2xhenpUeXBlLCBwYW5ub3RhdGlvbnNbcG9zXSk7Ci0KLSAgICAgICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcih0eXBlUmVmLCBwYXJhbU1vZGUsIHBvcysrKTsKLSAgICAgICAgICAgIHBhcmFtLnNldFBhcnROYW1lKHBhcnROYW1lKTsKLQotICAgICAgICAgICAgaWYocGFyYW1Nb2RlID09IE1vZGUuSU5PVVQpewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgcGIgPSBnZXRCaW5kaW5nKGJpbmRpbmcsIG9wZXJhdGlvbk5hbWUsIHBhcnROYW1lLCBpc0hlYWRlciwgTW9kZS5JTik7Ci0gICAgICAgICAgICAgICAgcGFyYW0uc2V0SW5CaW5kaW5nKHBiKTsKLSAgICAgICAgICAgICAgICBwYiA9IGdldEJpbmRpbmcoYmluZGluZywgb3BlcmF0aW9uTmFtZSwgcGFydE5hbWUsIGlzSGVhZGVyLCBNb2RlLk9VVCk7Ci0gICAgICAgICAgICAgICAgcGFyYW0uc2V0T3V0QmluZGluZyhwYik7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBpZiAoaXNIZWFkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkhFQURFUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYiA9IGdldEJpbmRpbmcoYmluZGluZywgb3BlcmF0aW9uTmFtZSwgcGFydE5hbWUsIGZhbHNlLCBwYXJhbU1vZGUpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRCaW5kaW5nKHBiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwYXJhbS5nZXRJbkJpbmRpbmcoKS5pc0JvZHkoKSl7Ci0gICAgICAgICAgICAgICAgaWYoIXBhcmFtLmlzT1VUKCkpewotICAgICAgICAgICAgICAgICAgICBQYXJ0IHAgPSBnZXRQYXJ0KG9wZXJhdGlvbk5hbWUsIHBhcnROYW1lLCBNb2RlLklOKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxUnBjUGFyYW1zLnB1dChyZXFScGNQYXJhbXMuc2l6ZSgpLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcVJwY1BhcmFtcy5wdXQocC5nZXRJbmRleCgpLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVxdWVzdFdyYXBwZXIuYWRkV3JhcHBlckNoaWxkKHBhcmFtKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZighcGFyYW0uaXNJTigpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzT25ld2F5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIub25ld2F5Lm9wZXJhdGlvbi5uby5vdXQucGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BvcnRDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIG1ldGhvZE5hbWV9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBQYXJ0IHAgPSBnZXRQYXJ0KG9wZXJhdGlvbk5hbWUsIHBhcnROYW1lLCBNb2RlLk9VVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JwY1BhcmFtcy5wdXQocmVzUnBjUGFyYW1zLnNpemUoKSwgcGFyYW0pOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNScGNQYXJhbXMucHV0KHAuZ2V0SW5kZXgoKSwgcGFyYW0pOwotLy8gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXIuYWRkV3JhcHBlckNoaWxkKHBhcmFtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBqYXZhTWV0aG9kLmFkZFBhcmFtZXRlcihwYXJhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlcVJwY1BhcmFtcy5zaXplKCk7aSsrKQotICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXIuYWRkV3JhcHBlckNoaWxkKHJlcVJwY1BhcmFtcy5nZXQoaSkpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzUnBjUGFyYW1zLnNpemUoKTtpKyspCi0gICAgICAgICAgICByZXNwb25zZVdyYXBwZXIuYWRkV3JhcHBlckNoaWxkKHJlc1JwY1BhcmFtcy5nZXQoaSkpOwotICAgICAgICBwcm9jZXNzRXhjZXB0aW9ucyhqYXZhTWV0aG9kLCBtZXRob2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1vZGVscyB0aGUgZXhjZXB0aW9ucyB0aHJvd24gYnkgPGNvZGU+bWV0aG9kPC9jb2RlPiBhbmQgYWRkcyB0aGVtIHRvIHRoZSA8Y29kZT5qYXZhTWV0aG9kPC9jb2RlPgotICAgICAqIHJ1bnRpbWUgbW9kZWwgb2JqZWN0Ci0gICAgICogQHBhcmFtIGphdmFNZXRob2QgdGhlIHJ1bnRpbWUgbW9kZWwgb2JqZWN0IHRvIGFkZCB0aGUgZXhjZXB0aW9uIG1vZGVsIG9iamVjdHMgdG8KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSA8Y29kZT5tZXRob2Q8L2NvZGU+IGZyb20gd2hpY2ggdG8gZmluZCB0aGUgZXhjZXB0aW9ucyB0byBtb2RlbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NFeGNlcHRpb25zKEphdmFNZXRob2QgamF2YU1ldGhvZCwgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBmb3IgKFR5cGUgZXhjZXB0aW9uIDogbWV0aG9kLmdldEdlbmVyaWNFeGNlcHRpb25UeXBlcygpKSB7Ci0gICAgICAgICAgICBpZiAoUkVNT1RFX0VYQ0VQVElPTl9DTEFTUy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzcylleGNlcHRpb24pKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQ2xhc3MgZXhjZXB0aW9uQmVhbjsKLSAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5zOwotICAgICAgICAgICAgV2ViRmF1bHQgd2ViRmF1bHQgPSBnZXRQcml2Q2xhc3NBbm5vdGF0aW9uKChDbGFzcylleGNlcHRpb24sIFdlYkZhdWx0LmNsYXNzKTsKLSAgICAgICAgICAgIE1ldGhvZCBmYXVsdEluZm9NZXRob2QgPSBnZXRXU0RMRXhjZXB0aW9uRmF1bHRJbmZvKChDbGFzcylleGNlcHRpb24pOwotICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleGNlcHRpb25UeXBlID0gRXhjZXB0aW9uVHlwZS5XU0RMRXhjZXB0aW9uOwotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKChDbGFzcylleGNlcHRpb24pLmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBiZWFuUGFja2FnZSA9IHBhY2thZ2VOYW1lICsgUERfSkFYV1NfUEFDS0FHRV9QRDsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBiZWFuUGFja2FnZSsgbmFtZSArIEJFQU47Ci0gICAgICAgICAgICBpZiAod2ViRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh3ZWJGYXVsdC5mYXVsdEJlYW4oKS5sZW5ndGgoKT4wKQotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3ZWJGYXVsdC5mYXVsdEJlYW4oKTsKLSAgICAgICAgICAgICAgICBpZiAod2ViRmF1bHQubmFtZSgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSB3ZWJGYXVsdC5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYkZhdWx0LnRhcmdldE5hbWVzcGFjZSgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHdlYkZhdWx0LnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZhdWx0SW5mb01ldGhvZCA9PSBudWxsKSAgewotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkJlYW4gPSBnZXRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGV4Y2VwdGlvblR5cGUgPSBFeGNlcHRpb25UeXBlLlVzZXJEZWZpbmVkOwotICAgICAgICAgICAgICAgIGFubnMgPSBleGNlcHRpb25CZWFuLmdldEFubm90YXRpb25zKCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uQmVhbiA9IGZhdWx0SW5mb01ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgYW5ucyA9IGZhdWx0SW5mb01ldGhvZC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUU5hbWUgZmF1bHROYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgICAgICBUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBuZXcgVHlwZVJlZmVyZW5jZShmYXVsdE5hbWUsIGV4Y2VwdGlvbkJlYW4sCi0gICAgICAgICAgICAgICAgYW5ucyk7Ci0gICAgICAgICAgICBDaGVja2VkRXhjZXB0aW9uIGNoZWNrZWRFeGNlcHRpb24gPQotICAgICAgICAgICAgICAgIG5ldyBDaGVja2VkRXhjZXB0aW9uKChDbGFzcylleGNlcHRpb24sIHR5cGVSZWYsIGV4Y2VwdGlvblR5cGUpOwotICAgICAgICAgICAgY2hlY2tlZEV4Y2VwdGlvbi5zZXRNZXNzYWdlTmFtZSgoKENsYXNzKWV4Y2VwdGlvbikuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgICAgIGphdmFNZXRob2QuYWRkRXhjZXB0aW9uKGNoZWNrZWRFeGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0aGUgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gImdldEZhdWx0SW5mbyIuICBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBub3QgYW4KLSAgICAgKiBleGNlcHRpb24gZ2VuZXJhdGVkIGZyb20gYSBXU0RMCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgY2xhc3MgdG8gc2VhcmNoIGZvciB0aGUgImdldEZhdWx0SW5mbyIgbWV0aG9kCi0gICAgICogQHJldHVybiB0aGUgbWV0aG9kIG5hbWVkICJnZXRGYXVsdEluZm8iIGlmIHRoaXMgaXMgYW4gZXhjZXB0aW9uIGdlbmVyYXRlZCBmcm9tIFdTREwgb3IgYW4KLSAgICAgKiBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgPGNvZGU+V2ViRmF1bHQ8L2NvZGU+IGFubm90YXRpb24uICBPdGhlcndpc2UgaXQgcmV0dXJucyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBnZXRXU0RMRXhjZXB0aW9uRmF1bHRJbmZvKENsYXNzIGV4Y2VwdGlvbikgewotICAgICAgICBpZiAoZ2V0UHJpdkNsYXNzQW5ub3RhdGlvbihleGNlcHRpb24sIFdlYkZhdWx0LmNsYXNzKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgZ2V0RmF1bHRJbmZvID0gZXhjZXB0aW9uLmdldE1ldGhvZCgiZ2V0RmF1bHRJbmZvIiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRGYXVsdEluZm87Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1vZGVscyBhIGRvY3VtZW50L2xpdGVyYWwgYmFyZSBtZXRob2QKLSAgICAgKiBAcGFyYW0gamF2YU1ldGhvZCB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIHJ1bnRpbWUgbW9kZWwgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgICAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIHJ1bnRpbWUgbW9kZWwgPGNvZGU+SmF2YU1ldGhvZDwvY29kZT4gaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgICAqIEBwYXJhbSBvcGVyYXRpb25OYW1lIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBydW50aW1lIG1vZGVsIDxjb2RlPkphdmFNZXRob2Q8L2NvZGU+IGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICAgKiBAcGFyYW0gd2ViU2VydmljZSB0aGUgcnVudGltZSBtb2RlbCA8Y29kZT5KYXZhTWV0aG9kPC9jb2RlPiBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RvY0JhcmVNZXRob2QoSmF2YU1ldGhvZCBqYXZhTWV0aG9kLCBTdHJpbmcgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJNZXRob2Qgd2ViTWV0aG9kLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSwgTWV0aG9kIG1ldGhvZCwgV2ViU2VydmljZSB3ZWJTZXJ2aWNlKSB7Ci0KLSAgICAgICAgU3RyaW5nIHJlc3VsdE5hbWUgPSBvcGVyYXRpb25OYW1lK1JFU1BPTlNFOwotICAgICAgICBTdHJpbmcgcmVzdWx0VE5TID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICBTdHJpbmcgcmVzdWx0UGFydE5hbWUgPSBudWxsOwotICAgICAgICBib29sZWFuIGlzUmVzdWx0SGVhZGVyID0gZmFsc2U7Ci0gICAgICAgIFdlYlJlc3VsdCB3ZWJSZXN1bHQgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJSZXN1bHQuY2xhc3MpOwotICAgICAgICBpZiAod2ViUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh3ZWJSZXN1bHQubmFtZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICByZXN1bHROYW1lID0gd2ViUmVzdWx0Lm5hbWUoKTsKLSAgICAgICAgICAgIGlmICh3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJlc3VsdFROUyA9IHdlYlJlc3VsdC50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIHJlc3VsdFBhcnROYW1lID0gd2ViUmVzdWx0LnBhcnROYW1lKCk7Ci0gICAgICAgICAgICBpc1Jlc3VsdEhlYWRlciA9IHdlYlJlc3VsdC5oZWFkZXIoKTsKLSAgICAgICAgfQotICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQotICAgICAgICBpZihqYXZhTWV0aG9kLmlzQXN5bmMoKSl7Ci0gICAgICAgICAgICByZXR1cm5UeXBlID0gZ2V0QXN5bmNSZXR1cm5UeXBlKG1ldGhvZCwgcmV0dXJuVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBRTmFtZSByZXNwb25zZVFOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKChyZXR1cm5UeXBlICE9IG51bGwpICYmICghcmV0dXJuVHlwZS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikpKSB7Ci0gICAgICAgICAgICBDbGFzcyByZXR1cm5DbGF6eiA9IHJldHVyblR5cGU7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uW10gcmFubiA9IG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgUU5hbWUgcnFuYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChyZXN1bHROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZVFOYW1lID0gbmV3IFFOYW1lKHJlc3VsdFROUywgcmVzdWx0TmFtZSk7Ci0gICAgICAgICAgICAgICAgVHlwZVJlZmVyZW5jZSByVHlwZVJlZmVyZW5jZSA9IG5ldyBUeXBlUmVmZXJlbmNlKHJlc3BvbnNlUU5hbWUsIHJldHVyblR5cGUsIHJhbm4pOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlciByZXR1cm5QYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHJUeXBlUmVmZXJlbmNlLCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLk9VVCwgLTEpOwotCi0gICAgICAgICAgICAgICAgaWYocmVzdWx0UGFydE5hbWUgPT0gbnVsbCB8fCAocmVzdWx0UGFydE5hbWUubGVuZ3RoKCkgPT0gMCkpewotICAgICAgICAgICAgICAgICAgICByZXN1bHRQYXJ0TmFtZSA9IHJlc3VsdE5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVyblBhcmFtZXRlci5zZXRQYXJ0TmFtZShyZXN1bHRQYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYoaXNSZXN1bHRIZWFkZXIpewotICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXIuc2V0QmluZGluZyhQYXJhbWV0ZXJCaW5kaW5nLkhFQURFUik7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgcmIgPSBnZXRCaW5kaW5nKGJpbmRpbmcsIG9wZXJhdGlvbk5hbWUsIHJlc3VsdFBhcnROYW1lLCBmYWxzZSwgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuTW9kZS5PVVQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXIuc2V0QmluZGluZyhyYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHJldHVyblBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL2dldCBXZWJQYXJhbQotICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIFR5cGVbXSBnZW5lcmljUGFyYW1ldGVyVHlwZXMgPSBtZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIEFubm90YXRpb25bXVtdIHBhbm5vdGF0aW9ucyA9IGdldFByaXZQYXJhbWV0ZXJBbm5vdGF0aW9ucyhtZXRob2QpOwotICAgICAgICBRTmFtZSByZXF1ZXN0UU5hbWUgPSBudWxsOwotICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgZm9yIChDbGFzcyBjbGF6elR5cGUgOiBwYXJhbWV0ZXJUeXBlcykgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBvcGVyYXRpb25OYW1lOyAvL21ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3ROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgICAgICBib29sZWFuIGlzSGVhZGVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vYXN5bmMKLSAgICAgICAgICAgIGlmKGphdmFNZXRob2QuaXNBc3luYygpICYmIEFzeW5jSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6VHlwZSkpewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGlzSG9sZGVyID0gSE9MREVSX0NMQVNTLmlzQXNzaWduYWJsZUZyb20oY2xhenpUeXBlKTsKLSAgICAgICAgICAgIC8vc2V0IHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudCBvZiBIb2xkZXIgaW4gdGhlIFR5cGVSZWZlcmVuY2UKLSAgICAgICAgICAgIGlmIChpc0hvbGRlcikgewotICAgICAgICAgICAgICAgIGlmIChjbGF6elR5cGUuZ2V0TmFtZSgpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgY2xhenpUeXBlID0gTmF2aWdhdG9yLlJFRkxFQ1RJT04uZXJhc3VyZSgoKFBhcmFtZXRlcml6ZWRUeXBlKWdlbmVyaWNQYXJhbWV0ZXJUeXBlc1twb3NdKS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlIHBhcmFtTW9kZSA9IGlzSG9sZGVyID8KLSAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLklOT1VUIDoKLSAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLklOOwotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBwYW5ub3RhdGlvbnNbcG9zXSkgewotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkgPT0gamF2YXguandzLldlYlBhcmFtLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmF4Lmp3cy5XZWJQYXJhbSB3ZWJQYXJhbSA9IChqYXZheC5qd3MuV2ViUGFyYW0pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbS5uYW1lKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gd2ViUGFyYW0ubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSA9IHdlYlBhcmFtLnBhcnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghd2ViUGFyYW0udGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE5hbWVzcGFjZSA9IHdlYlBhcmFtLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlzSGVhZGVyID0gd2ViUGFyYW0uaGVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIFdlYlBhcmFtLk1vZGUgbW9kZSA9IHdlYlBhcmFtLm1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzSG9sZGVyICYmIG1vZGUgPT0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU4pCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU5PVVQ7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtTW9kZSA9IChtb2RlID09IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlLklOKSA/IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuSU4gOgotICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU5PVVQpID8gY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuTW9kZS5JTk9VVCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLk9VVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXF1ZXN0UU5hbWUgPSBuZXcgUU5hbWUocmVxdWVzdE5hbWVzcGFjZSwgcGFyYW1OYW1lKTsKLSAgICAgICAgICAgIC8vZG9jbGl0L3dyYXBwZWQKLSAgICAgICAgICAgIFR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IC8vb3BlcmF0aW9uTmFtZSB3aXRoIHVwcGVyIDEgY2hhcgotICAgICAgICAgICAgICAgIG5ldyBUeXBlUmVmZXJlbmNlKHJlcXVlc3RRTmFtZSwgY2xhenpUeXBlLAotICAgICAgICAgICAgICAgICAgICBwYW5ub3RhdGlvbnNbcG9zXSk7Ci0KLSAgICAgICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcih0eXBlUmVmLCBwYXJhbU1vZGUsIHBvcysrKTsKLSAgICAgICAgICAgIGlmKHBhcnROYW1lID09IG51bGwgfHwgKHBhcnROYW1lLmxlbmd0aCgpID09IDApKXsKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSBwYXJhbU5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbS5zZXRQYXJ0TmFtZShwYXJ0TmFtZSk7Ci0gICAgICAgICAgICBpZihwYXJhbU1vZGUgPT0gY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuTW9kZS5JTk9VVCl7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBwYiA9IGdldEJpbmRpbmcoYmluZGluZywgb3BlcmF0aW9uTmFtZSwgcGFydE5hbWUsIGlzSGVhZGVyLCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlLklOKTsKLSAgICAgICAgICAgICAgICBwYXJhbS5zZXRJbkJpbmRpbmcocGIpOwotICAgICAgICAgICAgICAgIHBiID0gZ2V0QmluZGluZyhiaW5kaW5nLCBvcGVyYXRpb25OYW1lLCBwYXJ0TmFtZSwgaXNIZWFkZXIsIGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGUuT1VUKTsKLSAgICAgICAgICAgICAgICBwYXJhbS5zZXRPdXRCaW5kaW5nKHBiKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGlmIChpc0hlYWRlcil7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEJpbmRpbmcoUGFyYW1ldGVyQmluZGluZy5IRUFERVIpOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBiID0gZ2V0QmluZGluZyhiaW5kaW5nLCBvcGVyYXRpb25OYW1lLCBwYXJ0TmFtZSwgZmFsc2UsIHBhcmFtTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEJpbmRpbmcocGIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGphdmFNZXRob2QuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgfQotICAgICAgICBwcm9jZXNzRXhjZXB0aW9ucyhqYXZhTWV0aG9kLCBtZXRob2QpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgZ2V0QXN5bmNSZXR1cm5UeXBlKE1ldGhvZCBtZXRob2QsIENsYXNzIHJldHVyblR5cGUpIHsKLSAgICAgICAgaWYoUmVzcG9uc2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5UeXBlKSl7Ci0gICAgICAgICAgICBUeXBlIHJldCA9IG1ldGhvZC5nZXRHZW5lcmljUmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgcmV0dXJuIE5hdmlnYXRvci5SRUZMRUNUSU9OLmVyYXN1cmUoKChQYXJhbWV0ZXJpemVkVHlwZSlyZXQpLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgVHlwZVtdIHR5cGVzID0gbWV0aG9kLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvcihDbGFzcyBjbHMgOiBwYXJhbXMpewotICAgICAgICAgICAgICAgIGlmKEFzeW5jSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmF2aWdhdG9yLlJFRkxFQ1RJT04uZXJhc3VyZSgoKFBhcmFtZXRlcml6ZWRUeXBlKXR5cGVzW2ldKS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdXRpbGl0eSB0byBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgaW4gYSBzdHJpbmcKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIHRvIGNhcGl0YWxpemUKLSAgICAgKiBAcmV0dXJuIHRoZSBjYXBpdGFsaXplZCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotICAgICAgICBjaGFyIGNoYXJzW10gPSBuYW1lLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJzWzBdKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBSZXR1cm4gc2VydmljZSBRTmFtZQotICAgICovCi0gICAgLyoqCi0gICAgICogZ2V0cyB0aGUgPGNvZGU+d3NkbDpzZXJ2aWNlTmFtZTwvY29kZT4gZm9yIGEgZ2l2ZW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgKiBAcGFyYW0gaW1wbENsYXNzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPndzZGw6c2VydmljZU5hbWU8L2NvZGU+IGZvciB0aGUgPGNvZGU+aW1wbENsYXNzPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoQ2xhc3MgaW1wbENsYXNzKSB7Ci0gICAgICAgIGlmIChpbXBsQ2xhc3MuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIuY2Fubm90LmdldC5zZXJ2aWNlTmFtZS5mcm9tLmludGVyZmFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2ltcGxDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCl9KTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuYW1lID0gaW1wbENsYXNzLmdldFNpbXBsZU5hbWUoKStTRVJWSUNFOwotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoaW1wbENsYXNzLmdldFBhY2thZ2UoKSAhPSBudWxsKQotICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBpbXBsQ2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQotICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgPQotICAgICAgICAgICAgKFdlYlNlcnZpY2UpaW1wbENsYXNzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLm5vLndlYnNlcnZpY2UuYW5ub3RhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2ltcGxDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCl9KTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2ViU2VydmljZS5zZXJ2aWNlTmFtZSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgbmFtZSA9IHdlYlNlcnZpY2Uuc2VydmljZU5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSB3ZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5uby5wYWNrYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtpbXBsQ2xhc3MuZ2V0TmFtZSgpfSk7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldHMgdGhlIDxjb2RlPndzZGw6cG9ydE5hbWU8L2NvZGU+IGZvciBhIGdpdmVuIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICogQHBhcmFtIGltcGxDbGFzcyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIE5hbWVzcGFjZSBVUkkgZm9yIHNlcnZpY2UgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPndzZGw6cG9ydE5hbWU8L2NvZGU+IGZvciB0aGUgPGNvZGU+aW1wbENsYXNzPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UG9ydE5hbWUoQ2xhc3MgaW1wbENsYXNzLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2Ugd2ViU2VydmljZSA9Ci0gICAgICAgICAgICAoV2ViU2VydmljZSlpbXBsQ2xhc3MuZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIubm8ud2Vic2VydmljZS5hbm5vdGF0aW9uIiwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2ltcGxDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCl9KTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlLnBvcnROYW1lKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBuYW1lID0gd2ViU2VydmljZS5wb3J0TmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHdlYlNlcnZpY2UubmFtZSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgbmFtZSA9IHdlYlNlcnZpY2UubmFtZSgpK1BPUlQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuYW1lID0gaW1wbENsYXNzLmdldFNpbXBsZU5hbWUoKStQT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAod2ViU2VydmljZS50YXJnZXROYW1lc3BhY2UoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSB3ZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChpbXBsQ2xhc3MuZ2V0UGFja2FnZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBpbXBsQ2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVNb2RlbGVyRXhjZXB0aW9uKCJydW50aW1lLm1vZGVsZXIubm8ucGFja2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2ltcGxDbGFzcy5nZXROYW1lKCl9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyBwb3J0VHlwZSBRTmFtZSBmcm9tIGltcGxlbWVudGF0b3JDbGFzcyBvciBTRUkKLSAgICAgKiBAcGFyYW0gIGltcGxPclNlaUNsYXNzIGNhbnQgYmUgbnVsbAotICAgICAqIEByZXR1cm4gIDxjb2RlPndzZGw6cG9ydFR5cGVAbmFtZTwvY29kZT4sIG51bGwgaWYgaXQgY291bGQgbm90IGZpbmQgdGhlIGFubm90YXRlZCBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFBvcnRUeXBlTmFtZShDbGFzcyBpbXBsT3JTZWlDbGFzcyl7Ci0gICAgICAgIGFzc2VydChpbXBsT3JTZWlDbGFzcyAhPSBudWxsKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBpbXBsT3JTZWlDbGFzczsKLSAgICAgICAgV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgaWYgKCFpbXBsT3JTZWlDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KGphdmF4Lmp3cy5XZWJTZXJ2aWNlLmNsYXNzKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oInJ1bnRpbWUubW9kZWxlci5uby53ZWJzZXJ2aWNlLmFubm90YXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7aW1wbE9yU2VpQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpfSk7Ci0KLSAgICAgICAgaWYgKCFpbXBsT3JTZWlDbGFzcy5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlID0gKFdlYlNlcnZpY2UpIGltcGxPclNlaUNsYXNzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgZXBpID0gd2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgICAgICAgaWYgKGVwaS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGVwaSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLmNsYXNzLm5vdC5mb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2VwaX0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWNsYXp6LmlzQW5ub3RhdGlvblByZXNlbnQoamF2YXguandzLldlYlNlcnZpY2UuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLmVuZHBvaW50LmludGVyZmFjZS5uby53ZWJzZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3dlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UoKX0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdlYlNlcnZpY2UgPSAoV2ViU2VydmljZSkgY2xhenouZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB3ZWJTZXJ2aWNlLm5hbWUoKTsKLSAgICAgICAgaWYobmFtZS5sZW5ndGgoKSA9PSAwKXsKLSAgICAgICAgICAgIG5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdG5zID0gd2ViU2VydmljZS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKHRucy5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgdG5zID0gZ2V0TmFtZXNwYWNlKGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICBpZiAodG5zID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5tb2RlbGVyLm5vLnBhY2thZ2UiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y2xhenouZ2V0TmFtZSgpfSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh0bnMsIG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJpbmRpbmdJZChDbGFzcyBpbXBsQ2xhc3MpIHsKLSAgICAgICAgQmluZGluZ1R5cGUgYmluZGluZ1R5cGUgPQotICAgICAgICAgICAgKEJpbmRpbmdUeXBlKWltcGxDbGFzcy5nZXRBbm5vdGF0aW9uKEJpbmRpbmdUeXBlLmNsYXNzKTsKLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSBiaW5kaW5nVHlwZS52YWx1ZSgpOwotICAgICAgICAgICAgaWYgKGJpbmRpbmdJZC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIWJpbmRpbmdJZC5lcXVhbHMoamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQotICAgICAgICAgICAgICAgICAgICAmJiAhYmluZGluZ0lkLmVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykKLSAgICAgICAgICAgICAgICAgICAgJiYgIWJpbmRpbmdJZC5lcXVhbHMoamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQotICAgICAgICAgICAgICAgICAgICAmJiAhYmluZGluZ0lkLmVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykKLSAgICAgICAgICAgICAgICAgICAgJiYgIWJpbmRpbmdJZC5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKQotICAgICAgICAgICAgICAgICAgICAmJiAhYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZ0ltcGwuWF9TT0FQMTJIVFRQX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldyb25nIGJpbmRpbmcgaWQgIitiaW5kaW5nSWQrIiBpbiBAQmluZGluZ1R5cGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBhcmFtZXRlckJpbmRpbmcgZ2V0QmluZGluZyhjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5CaW5kaW5nIGJpbmRpbmcsIFN0cmluZyBvcGVyYXRpb24sIFN0cmluZyBwYXJ0LCBib29sZWFuIGlzSGVhZGVyLCBNb2RlIG1vZGUpewotICAgICAgICBpZihiaW5kaW5nID09IG51bGwpewotICAgICAgICAgICAgaWYoaXNIZWFkZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlckJpbmRpbmcuSEVBREVSOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXJCaW5kaW5nLkJPRFk7Ci0gICAgICAgIH0KLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBibyA9IGJpbmRpbmcuZ2V0KG9wZXJhdGlvbik7Ci0KLSAgICAgICAgLy9pZiB0aGUgYmluZGluZyBPcGVyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgb3BlcmF0aW9uIGlzIG5vdCBmb3VuZCBpbiB0aGUgV1NETCB0aGVuCi0gICAgICAgIC8vdGhyb3cgdGhlIGV4Y2VwdGlvbgotICAgICAgICBpZihibyA9PSBudWxsKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbigicnVudGltZS5vcGVyYXRpb24ubm9CaW5kaW5nIiwgb3BlcmF0aW9uLCBwb3J0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYmluZGluZy5nZXRCaW5kaW5nKGJvLCBwYXJ0LCBtb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBhcnQgZ2V0UGFydChTdHJpbmcgb3BOYW1lLCBTdHJpbmcgcGFydE5hbWUsIE1vZGUgbW9kZSl7Ci0gICAgICAgIGlmKGJpbmRpbmcgIT0gbnVsbCl7Ci0gICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvID0gYmluZGluZy5nZXQob3BOYW1lKTsKLSAgICAgICAgICAgIGlmKGJvICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJvLmdldFBhcnQocGFydE5hbWUsIG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSWQoKSB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nSWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbGVyL1J1bnRpbWVNb2RlbGVyRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9tb2RlbGVyL1J1bnRpbWVNb2RlbGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTIyN2EuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvbW9kZWxlci9SdW50aW1lTW9kZWxlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuZXhjZXB0aW9uLkpBWFdTRXhjZXB0aW9uQmFzZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKLQotLyoqCi0gKiBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbiByZXByZXNlbnRzIGFuIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIHdoaWxlCi0gKiBzZXJpYWxpemluZyBhIEphdmEgdmFsdWUgYXMgWE1MLgotICoKLSAqIEBzZWUgSkFYV1NFeGNlcHRpb25CYXNlCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbiBleHRlbmRzIEpBWFdTRXhjZXB0aW9uQmFzZSB7Ci0KLSAgICBwdWJsaWMgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oU3RyaW5nIGtleSwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgc3VwZXIoa2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUnVudGltZU1vZGVsZXJFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICBzdXBlcih0aHJvd2FibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBSdW50aW1lTW9kZWxlckV4Y2VwdGlvbihMb2NhbGl6YWJsZSBhcmcpIHsKLSAgICAgICAgc3VwZXIoIm5lc3RlZE1vZGVsZXJFcnJvciIsIGFyZyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLm1vZGVsZXIiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wYWNrYWdlLWluZm8uamF2YQppbmRleCAzMzEyOGUzLi4yNzc4MzQwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMywxNiArMzMsNiBAQAogICogYXR0YWNobWVudCBzdXBwb3J0IHdpdGggU09BUCBtZXNzYWdlcyBhbmQgdG8gYWxsb3cgaGFuZGxlciBkZXZlbG9wZXJzCiAgKiB0byBnYWluIGFjY2VzcyB0byB0aGUgU09BUCBtZXNzYWdlIHZpYSBhIHN0YW5kYXJkIGludGVyZmFjZS4gRmFzdAogICogSW5mb3NldCBpcyBhIGJpbmFyeSBlbmNvZGluZyBvZiBYTUwgdGhhdCBjYW4gaW1wcm92ZSBwZXJmb3JtYW5jZS48L1A+Ci0gKiA8UD5KQVgtV1MgMi4wIHdhcyBvcmlnaW5hbGx5IGNhbGxlZCBKQVgtUlBDIDIuMCBhbmQgd2FzIGhlbmNlCi0gKiBkZXZlbG9wZWQgZnJvbSB0aGUgSkFYLVJQQyAxLjEgY29kZSBiYXNlLiBKQVgtV1MgaGFzIGJlZW4KLSAqIHNpZ25pZmljYW5sdHkgcmVhcmNoaXRlY3RlZCB0byBmb3IgZXh0ZW5zaWJpbGl0eSBnb2luZyBmb3J3YXJkIGJ5Ci0gKiBpbmNvcnBvcmF0aW5nIGFuZCBpbXBsZW1lbnRpbmcgY29uY2VwdHMgZnJvbSA8QSBIUkVGPSJwZXB0Lmh0bWwiPlBFUFQ8L0E+LgotICogUEVQVCBwcmVzZW50cyBmb3VyIG1haW4gY29tcG9uZW50cyBwcmVzZW50YXRpb24sIGVuY29kaW5nLCBwcm90b2NvbAotICogYW5kIHRyYW5zcG9ydC4gSWRlYWxseSBlYWNoIG9mIHRoZXNlIGNvbXBvbmVudHMgd291bGQgbm90IGJlCi0gKiBkZXBlbmRlbnQgb24gYW5vdGhlciwgaG93ZXZlciwgZHVlIHRvIHRpbWUgY29uc3RyYWludHMgYW4gb3B0aW1hbAotICogUEVQVCBpbXBsZW1lbnRhdGlvbiB3YXMgbm90IHBvc3NpYmxlIGFuZCB0aHVzIHNvbWUgb2YgdGhlIFBFUFQKLSAqIGJvdW5kYXJpZXMgaGF2ZSBiZWVuIGJsdXJyZWQuIEZ1dHVyZSB2ZXJzaW9ucyBvZiBKQVgtV1MgbWF5IHNoYXJwZW4KLSAqIHRoZXNlIGJvdW5kYXJpZXMgd2hlbiBwb3NzaWJsZS48L1A+CiAgKiA8UD5UaGUgcmVtYWluZGVyIG9mIHRoaXMgZG9jdW1lbnQgd2lsbCBkZXNjcmliZSB0aGUgSkFYLVdTIHJ1bnRpbWUKICAqIGFyY2hpdGVjdHVyZSBmcm9tIHRoZSBjbGllbnQgYW5kIHNlcnZlciBwZXJzcGVjdGl2ZXMuPC9QPgogICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvRGVsZWdhdGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjY2VkOS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L0RlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotLyoqIEphdmEgaW50ZXJmYWNlICJEZWxlZ2F0ZS5qYXZhIiBnZW5lcmF0ZWQgZnJvbSBQb3NlaWRvbiBmb3IgVU1MLgotICogIFBvc2VpZG9uIGZvciBVTUwgaXMgZGV2ZWxvcGVkIGJ5IDxBIEhSRUY9Imh0dHA6Ly93d3cuZ2VudGxld2FyZS5jb20iPkdlbnRsZXdhcmU8L0E+LgotICogIEdlbmVyYXRlZCB3aXRoIDxBIEhSRUY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvIj52ZWxvY2l0eTwvQT4gdGVtcGxhdGUgZW5naW5lLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotCi0vKioKLSAqIDxwPgotICoKLSAqIEBhdXRob3IgRHIuIEhhcm9sZCBDYXJyCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsZWdhdGUgewotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBvcGVyYXRpb25zCi0KLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEByZXR1cm4gYSBNZXNzYWdlU3RydWN0IHdpdGggLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgTWVzc2FnZVN0cnVjdCBnZXRNZXNzYWdlU3RydWN0KCk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiA8L3A+PHA+Ci0gKgotICogQHBhcmFtIG1lc3NhZ2UgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kKE1lc3NhZ2VTdHJ1Y3QgbWVzc2FnZSk7Ci0KLX0gLy8gZW5kIERlbGVnYXRlCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VuY29kaW5nL0RlY29kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvZW5jb2RpbmcvRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMwMjQzLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvZW5jb2RpbmcvRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLS8qKiBKYXZhIGludGVyZmFjZSAiRGVjb2Rlci5qYXZhIiBnZW5lcmF0ZWQgZnJvbSBQb3NlaWRvbiBmb3IgVU1MLgotICogIFBvc2VpZG9uIGZvciBVTUwgaXMgZGV2ZWxvcGVkIGJ5IDxBIEhSRUY9Imh0dHA6Ly93d3cuZ2VudGxld2FyZS5jb20iPkdlbnRsZXdhcmU8L0E+LgotICogIEdlbmVyYXRlZCB3aXRoIDxBIEhSRUY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvIj52ZWxvY2l0eTwvQT4gdGVtcGxhdGUgZW5naW5lLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZW5jb2Rpbmc7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLQotLyoqCi0gKiA8cD4KLSAqCi0gKiBAYXV0aG9yIERyLiBIYXJvbGQgQ2FycgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlY29kZXIgewotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBvcGVyYXRpb25zCi0KLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD48cD4KLSAqCi0gKiBAcGFyYW0gbWVzc2FnZUluZm8gLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBtZXNzYWdlSW5mbyAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVBbmREZWNvZGUoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pOwotCi19IC8vIGVuZCBEZWNvZGVyCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VuY29kaW5nL0VuY29kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvZW5jb2RpbmcvRW5jb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNlMGE0Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvZW5jb2RpbmcvRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLS8qKiBKYXZhIGludGVyZmFjZSAiRW5jb2Rlci5qYXZhIiBnZW5lcmF0ZWQgZnJvbSBQb3NlaWRvbiBmb3IgVU1MLgotICogIFBvc2VpZG9uIGZvciBVTUwgaXMgZGV2ZWxvcGVkIGJ5IDxBIEhSRUY9Imh0dHA6Ly93d3cuZ2VudGxld2FyZS5jb20iPkdlbnRsZXdhcmU8L0E+LgotICogIEdlbmVyYXRlZCB3aXRoIDxBIEhSRUY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvIj52ZWxvY2l0eTwvQT4gdGVtcGxhdGUgZW5naW5lLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZW5jb2Rpbmc7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotCi0vKioKLSAqIDxwPgotICoKLSAqIEBhdXRob3IgQXJ1biBHdXB0YQotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVuY29kZXIgewotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBvcGVyYXRpb25zCi0KLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD48cD4KLSAqCi0gKiBAcGFyYW0gbWVzc2FnZUluZm8gLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVBbmRTZW5kKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEByZXR1cm4gYSBCeXRlQnVmZmVyIHdpdGggLi4uCi0gKiA8L3A+PHA+Ci0gKiBAcGFyYW0gbWVzc2FnZUluZm8gLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBlbmNvZGUoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pOwotCi19IC8vIGVuZCBFbmNvZGVyCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9BY2NlcHRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9lcHQvQWNjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjYWE0MC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9BY2NlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLS8qKiBKYXZhIGludGVyZmFjZSAiQWNjZXB0b3IuamF2YSIgZ2VuZXJhdGVkIGZyb20gUG9zZWlkb24gZm9yIFVNTC4KLSAqICBQb3NlaWRvbiBmb3IgVU1MIGlzIGRldmVsb3BlZCBieSA8QSBIUkVGPSJodHRwOi8vd3d3LmdlbnRsZXdhcmUuY29tIj5HZW50bGV3YXJlPC9BPi4KLSAqICBHZW5lcmF0ZWQgd2l0aCA8QSBIUkVGPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5LyI+dmVsb2NpdHk8L0E+IHRlbXBsYXRlIGVuZ2luZS4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdDsKLQotLyoqCi0gKiA8cD4KLSAqCi0gKiBAYXV0aG9yIERyLiBIYXJvbGQgQ2FycgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjY2VwdG9yIGV4dGVuZHMgRVBURmFjdG9yeSB7Ci0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIC8vIG9wZXJhdGlvbnMKLQotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPgotICovCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KCk7Ci0KLX0gLy8gZW5kIEFjY2VwdG9yCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9Db250YWN0SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9lcHQvQ29udGFjdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5ZmYwYi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9Db250YWN0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLS8qKiBKYXZhIGludGVyZmFjZSAiQ29udGFjdEluZm8uamF2YSIgZ2VuZXJhdGVkIGZyb20gUG9zZWlkb24gZm9yIFVNTC4KLSAqICBQb3NlaWRvbiBmb3IgVU1MIGlzIGRldmVsb3BlZCBieSA8QSBIUkVGPSJodHRwOi8vd3d3LmdlbnRsZXdhcmUuY29tIj5HZW50bGV3YXJlPC9BPi4KLSAqICBHZW5lcmF0ZWQgd2l0aCA8QSBIUkVGPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5LyI+dmVsb2NpdHk8L0E+IHRlbXBsYXRlIGVuZ2luZS4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5XU0Nvbm5lY3Rpb247Ci0KLS8qKgotICogPHA+Ci0gKgotICogQGF1dGhvciBEci4gSGFyb2xkIENhcnIKLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250YWN0SW5mbyBleHRlbmRzIEVQVEZhY3RvcnkgewotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBvcGVyYXRpb25zCi0KLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEByZXR1cm4gYSBDb25uZWN0aW9uIHdpdGggLi4uCi0gKiA8L3A+PHA+Ci0gKiBAcGFyYW0gbWVzc2FnZUluZm8gLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgV1NDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pOwotCi19IC8vIGVuZCBDb250YWN0SW5mbwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9lcHQvQ29udGFjdEluZm9MaXN0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9Db250YWN0SW5mb0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlMzg2OC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9Db250YWN0SW5mb0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0vKiogSmF2YSBpbnRlcmZhY2UgIkNvbnRhY3RJbmZvTGlzdC5qYXZhIiBnZW5lcmF0ZWQgZnJvbSBQb3NlaWRvbiBmb3IgVU1MLgotICogIFBvc2VpZG9uIGZvciBVTUwgaXMgZGV2ZWxvcGVkIGJ5IDxBIEhSRUY9Imh0dHA6Ly93d3cuZ2VudGxld2FyZS5jb20iPkdlbnRsZXdhcmU8L0E+LgotICogIEdlbmVyYXRlZCB3aXRoIDxBIEhSRUY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvIj52ZWxvY2l0eTwvQT4gdGVtcGxhdGUgZW5naW5lLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0OwotCi0vKioKLSAqIDxwPgotICoKLSAqIEBhdXRob3IgRHIuIEhhcm9sZCBDYXJyCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGFjdEluZm9MaXN0IHsKLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy8gb3BlcmF0aW9ucwotCi0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgQ29udGFjdEluZm9MaXN0SXRlcmF0b3Igd2l0aCAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBDb250YWN0SW5mb0xpc3RJdGVyYXRvciBpdGVyYXRvcigpOwotCi19IC8vIGVuZCBDb250YWN0SW5mb0xpc3QKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvZXB0L0NvbnRhY3RJbmZvTGlzdEl0ZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9Db250YWN0SW5mb0xpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODEwZGI2Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvZXB0L0NvbnRhY3RJbmZvTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotLyoqIEphdmEgaW50ZXJmYWNlICJDb250YWN0SW5mb0xpc3RJdGVyYXRvci5qYXZhIiBnZW5lcmF0ZWQgZnJvbSBQb3NlaWRvbiBmb3IgVU1MLgotICogIFBvc2VpZG9uIGZvciBVTUwgaXMgZGV2ZWxvcGVkIGJ5IDxBIEhSRUY9Imh0dHA6Ly93d3cuZ2VudGxld2FyZS5jb20iPkdlbnRsZXdhcmU8L0E+LgotICogIEdlbmVyYXRlZCB3aXRoIDxBIEhSRUY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvIj52ZWxvY2l0eTwvQT4gdGVtcGxhdGUgZW5naW5lLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0OwotCi0vKioKLSAqIDxwPgotICoKLSAqIEBhdXRob3IgRHIuIEhhcm9sZCBDYXJyCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGFjdEluZm9MaXN0SXRlcmF0b3IgewotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBvcGVyYXRpb25zCi0KLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEByZXR1cm4gYSBib29sZWFuIHdpdGggLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgQ29udGFjdEluZm8gd2l0aCAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBDb250YWN0SW5mbyBuZXh0KCk7Ci0KLX0gLy8gZW5kIENvbnRhY3RJbmZvTGlzdEl0ZXJhdG9yCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9FUFRGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L2VwdC9FUFRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZmMwYjQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9lcHQvRVBURmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0vKiogSmF2YSBpbnRlcmZhY2UgIkVQVEZhY3RvcnkuamF2YSIgZ2VuZXJhdGVkIGZyb20gUG9zZWlkb24gZm9yIFVNTC4KLSAqICBQb3NlaWRvbiBmb3IgVU1MIGlzIGRldmVsb3BlZCBieSA8QSBIUkVGPSJodHRwOi8vd3d3LmdlbnRsZXdhcmUuY29tIj5HZW50bGV3YXJlPC9BPi4KLSAqICBHZW5lcmF0ZWQgd2l0aCA8QSBIUkVGPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5LyI+dmVsb2NpdHk8L0E+IHRlbXBsYXRlIGVuZ2luZS4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZW5jb2RpbmcuRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uVGFyZ2V0RmluZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJvdG9jb2wuSW50ZXJjZXB0b3JzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJvdG9jb2wuTWVzc2FnZURpc3BhdGNoZXI7Ci0KLS8qKgotICogPHA+Ci0gKgotICogQGF1dGhvciBEci4gSGFyb2xkIENhcnIKLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBFUFRGYWN0b3J5IHsKLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy8gb3BlcmF0aW9ucwotCi0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgTWVzc2FnZURpc3BhdGNoZXIgd2l0aCAuLi4KLSAqIDwvcD48cD4KLSAqIEBwYXJhbSBtZXNzYWdlSW5mbyAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGlzcGF0Y2hlciBnZXRNZXNzYWdlRGlzcGF0Y2hlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbyk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgRW5jb2RlciB3aXRoIC4uLgotICogPC9wPjxwPgotICogQHBhcmFtIG1lc3NhZ2VJbmZvIC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIEVuY29kZXIgZ2V0RW5jb2RlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbyk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgRGVjb2RlciB3aXRoIC4uLgotICogPC9wPjxwPgotICogQHBhcmFtIG1lc3NhZ2VJbmZvIC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIERlY29kZXIgZ2V0RGVjb2RlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbyk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgSW50ZXJjZXB0b3JzIHdpdGggLi4uCi0gKiA8L3A+PHA+Ci0gKiBAcGFyYW0geCAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBJbnRlcmNlcHRvcnMgZ2V0SW50ZXJjZXB0b3JzKE1lc3NhZ2VJbmZvIHgpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogQHJldHVybiBhIFRhcmdldEZpbmRlciB3aXRoIC4uLgotICogPC9wPjxwPgotICogQHBhcmFtIHggLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgVGFyZ2V0RmluZGVyIGdldFRhcmdldEZpbmRlcihNZXNzYWdlSW5mbyB4KTsKLQotfSAvLyBlbmQgRVBURmFjdG9yeQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9lcHQvTWVzc2FnZUluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvZXB0L01lc3NhZ2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmQ1MTguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9lcHQvTWVzc2FnZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotLyoqIEphdmEgaW50ZXJmYWNlICJNZXNzYWdlSW5mby5qYXZhIiBnZW5lcmF0ZWQgZnJvbSBQb3NlaWRvbiBmb3IgVU1MLgotICogIFBvc2VpZG9uIGZvciBVTUwgaXMgZGV2ZWxvcGVkIGJ5IDxBIEhSRUY9Imh0dHA6Ly93d3cuZ2VudGxld2FyZS5jb20iPkdlbnRsZXdhcmU8L0E+LgotICogIEdlbmVyYXRlZCB3aXRoIDxBIEhSRUY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvIj52ZWxvY2l0eTwvQT4gdGVtcGxhdGUgZW5naW5lLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lbmNvZGluZy5EZWNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZW5jb2RpbmcuRW5jb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJvdG9jb2wuTWVzc2FnZURpc3BhdGNoZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotCi0vKioKLSAqIDxwPgotICoKLSAqIEBhdXRob3IgRHIuIEhhcm9sZCBDYXJyCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUluZm8gZXh0ZW5kcyBNZXNzYWdlU3RydWN0IHsKLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy8gb3BlcmF0aW9ucwotCi0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgRVBURmFjdG9yeSB3aXRoIC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIEVQVEZhY3RvcnkgZ2V0RVBURmFjdG9yeSgpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogQHJldHVybiBhIE1lc3NhZ2VEaXNwYXRjaGVyIHdpdGggLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgTWVzc2FnZURpc3BhdGNoZXIgZ2V0TWVzc2FnZURpc3BhdGNoZXIoKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEByZXR1cm4gYSBFbmNvZGVyIHdpdGggLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgRW5jb2RlciBnZXRFbmNvZGVyKCk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgRGVjb2RlciB3aXRoIC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIERlY29kZXIgZ2V0RGVjb2RlcigpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogQHJldHVybiBhIENvbm5lY3Rpb24gd2l0aCAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBXU0Nvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBlcHRGYWN0b3J5IC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIHZvaWQgc2V0RVBURmFjdG9yeShFUFRGYWN0b3J5IGVwdEZhY3RvcnkpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBtZXNzYWdlRGlzcGF0Y2hlciAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEaXNwYXRjaGVyKE1lc3NhZ2VEaXNwYXRjaGVyIG1lc3NhZ2VEaXNwYXRjaGVyKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD48cD4KLSAqCi0gKiBAcGFyYW0gZW5jb2RlciAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZXIoRW5jb2RlciBlbmNvZGVyKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD48cD4KLSAqCi0gKiBAcGFyYW0gZGVjb2RlciAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZXIoRGVjb2RlciBkZWNvZGVyKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD48cD4KLSAqCi0gKiBAcGFyYW0gY29ubmVjdGlvbiAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb24oV1NDb25uZWN0aW9uIGNvbm5lY3Rpb24pOwotCi19IC8vIGVuZCBNZXNzYWdlSW5mbwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9wcmVzZW50YXRpb24vTWVzc2FnZVN0cnVjdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9wcmVzZW50YXRpb24vTWVzc2FnZVN0cnVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODAyMWJhLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvcHJlc2VudGF0aW9uL01lc3NhZ2VTdHJ1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotLyoqIEphdmEgaW50ZXJmYWNlICJNZXNzYWdlU3RydWN0LmphdmEiIGdlbmVyYXRlZCBmcm9tIFBvc2VpZG9uIGZvciBVTUwuCi0gKiAgUG9zZWlkb24gZm9yIFVNTCBpcyBkZXZlbG9wZWQgYnkgPEEgSFJFRj0iaHR0cDovL3d3dy5nZW50bGV3YXJlLmNvbSI+R2VudGxld2FyZTwvQT4uCi0gKiAgR2VuZXJhdGVkIHdpdGggPEEgSFJFRj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy92ZWxvY2l0eS8iPnZlbG9jaXR5PC9BPiB0ZW1wbGF0ZSBlbmdpbmUuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogPHA+Ci0gKgotICogQGF1dGhvciBEci4gSGFyb2xkIENhcnIKLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlU3RydWN0IHsKLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy9hdHRyaWJ1dGVzCi0KLQotLyoqCi0gKiA8cD4KLSAqIFJlcHJlc2VudHMgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfUkVTUE9OU0UgPSAwOwotCi0vKioKLSAqIDxwPgotICogUmVwcmVzZW50cyAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFID0gMTsKLQotLyoqCi0gKiA8cD4KLSAqIFJlcHJlc2VudHMgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFID0gMjsKLQotLyoqCi0gKiA8cD4KLSAqIFJlcHJlc2VudHMgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX1JFU1BPTlNFX01FUCA9IDE7Ci0KLS8qKgotICogPHA+Ci0gKiBSZXByZXNlbnRzIC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05FX1dBWV9NRVAgPSAyOwotCi0vKioKLSAqIDxwPgotICogUmVwcmVzZW50cyAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTWU5DX1BPTExfTUVQID0gMzsKLQotLyoqCi0gKiA8cD4KLSAqIFJlcHJlc2VudHMgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1lOQ19DQUxMQkFDS19NRVAgPSA0OwotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBvcGVyYXRpb25zCi0KLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBkYXRhIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGEoT2JqZWN0W10gZGF0YSk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgT2JqZWN0W10gd2l0aCAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXREYXRhKCk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiA8L3A+PHA+Ci0gKgotICogQHBhcmFtIG5hbWUgLi4uCi0gKiA8L3A+PHA+Ci0gKiBAcGFyYW0gdmFsdWUgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEByZXR1cm4gYSBPYmplY3Qgd2l0aCAuLi4KLSAqIDwvcD48cD4KLSAqIEBwYXJhbSBuYW1lIC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXRhRGF0YShPYmplY3QgbmFtZSk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiA8L3A+PHA+Ci0gKgotICogQHBhcmFtIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4gLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNRVAoaW50IG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogQHJldHVybiBhIGludCB3aXRoIC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIGludCBnZXRNRVAoKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEByZXR1cm4gYSBpbnQgd2l0aCAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UmVzcG9uc2VUeXBlKCk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiA8L3A+PHA+Ci0gKgotICogQHBhcmFtIHJlc3BvbnNlVHlwZSAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc3BvbnNlVHlwZShpbnQgcmVzcG9uc2VUeXBlKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIEByZXR1cm4gYSBPYmplY3Qgd2l0aCAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzcG9uc2UoKTsKLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD48cD4KLSAqCi0gKiBAcGFyYW0gcmVzcG9uc2UgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShPYmplY3QgcmVzcG9uc2UpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBtZXRob2QgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoTWV0aG9kIG1ldGhvZCk7Ci0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgTWV0aG9kIHdpdGggLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgTWV0aG9kIGdldE1ldGhvZCgpOwotCi19IC8vIGVuZCBNZXNzYWdlU3RydWN0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L3ByZXNlbnRhdGlvbi9TdHViLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L3ByZXNlbnRhdGlvbi9TdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjdlZmIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9wcmVzZW50YXRpb24vU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLS8qKiBKYXZhIGludGVyZmFjZSAiU3R1Yi5qYXZhIiBnZW5lcmF0ZWQgZnJvbSBQb3NlaWRvbiBmb3IgVU1MLgotICogIFBvc2VpZG9uIGZvciBVTUwgaXMgZGV2ZWxvcGVkIGJ5IDxBIEhSRUY9Imh0dHA6Ly93d3cuZ2VudGxld2FyZS5jb20iPkdlbnRsZXdhcmU8L0E+LgotICogIEdlbmVyYXRlZCB3aXRoIDxBIEhSRUY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvIj52ZWxvY2l0eTwvQT4gdGVtcGxhdGUgZW5naW5lLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5EZWxlZ2F0ZTsKLQotLyoqCi0gKiA8cD4KLSAqCi0gKiBAYXV0aG9yIERyLiBIYXJvbGQgQ2FycgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0dWIgewotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBvcGVyYXRpb25zCi0KLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD48cD4KLSAqCi0gKiBAcGFyYW0gZGVsZWdhdGUgLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBfc2V0RGVsZWdhdGUoRGVsZWdhdGUgZGVsZWdhdGUpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogQHJldHVybiBhIERlbGVnYXRlIHdpdGggLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgRGVsZWdhdGUgX2dldERlbGVnYXRlKCk7Ci0KLX0gLy8gZW5kIFN0dWIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvcHJlc2VudGF0aW9uL1RhcmdldEZpbmRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9wcmVzZW50YXRpb24vVGFyZ2V0RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZGJlOTQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9wcmVzZW50YXRpb24vVGFyZ2V0RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotLyoqIEphdmEgaW50ZXJmYWNlICJUYXJnZXRGaW5kZXIuamF2YSIgZ2VuZXJhdGVkIGZyb20gUG9zZWlkb24gZm9yIFVNTC4KLSAqICBQb3NlaWRvbiBmb3IgVU1MIGlzIGRldmVsb3BlZCBieSA8QSBIUkVGPSJodHRwOi8vd3d3LmdlbnRsZXdhcmUuY29tIj5HZW50bGV3YXJlPC9BPi4KLSAqICBHZW5lcmF0ZWQgd2l0aCA8QSBIUkVGPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5LyI+dmVsb2NpdHk8L0E+IHRlbXBsYXRlIGVuZ2luZS4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotCi0vKioKLSAqIDxwPgotICoKLSAqIEBhdXRob3IgRHIuIEhhcm9sZCBDYXJyCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFyZ2V0RmluZGVyIHsKLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy8gb3BlcmF0aW9ucwotCi0vKioKLSAqIDxwPgotICogRG9lcyAuLi4KLSAqIDwvcD48cD4KLSAqCi0gKiBAcmV0dXJuIGEgVGllIHdpdGggLi4uCi0gKiA8L3A+PHA+Ci0gKiBAcGFyYW0geCAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyBUaWUgZmluZFRhcmdldChNZXNzYWdlSW5mbyB4KTsKLQotfSAvLyBlbmQgVGFyZ2V0RmluZGVyCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L3ByZXNlbnRhdGlvbi9UaWUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvcHJlc2VudGF0aW9uL1RpZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTdlNzdhLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvcHJlc2VudGF0aW9uL1RpZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLS8qKiBKYXZhIGludGVyZmFjZSAiVGllLmphdmEiIGdlbmVyYXRlZCBmcm9tIFBvc2VpZG9uIGZvciBVTUwuCi0gKiAgUG9zZWlkb24gZm9yIFVNTCBpcyBkZXZlbG9wZWQgYnkgPEEgSFJFRj0iaHR0cDovL3d3dy5nZW50bGV3YXJlLmNvbSI+R2VudGxld2FyZTwvQT4uCi0gKiAgR2VuZXJhdGVkIHdpdGggPEEgSFJFRj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy92ZWxvY2l0eS8iPnZlbG9jaXR5PC9BPiB0ZW1wbGF0ZSBlbmdpbmUuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb247Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLQotLyoqCi0gKiA8cD4KLSAqCi0gKiBAYXV0aG9yIERyLiBIYXJvbGQgQ2FycgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRpZSB7Ci0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIC8vIG9wZXJhdGlvbnMKLQotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBzZXJ2YW50IC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIHZvaWQgX3NldFNlcnZhbnQoT2JqZWN0IHNlcnZhbnQpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogQHJldHVybiBhIE9iamVjdCB3aXRoIC4uLgotICogPC9wPgotICovCi0gICAgcHVibGljIE9iamVjdCBfZ2V0U2VydmFudCgpOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBtZXNzYWdlSW5mbyAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIF9pbnZva2UoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pOwotCi19IC8vIGVuZCBUaWUKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvcHJvdG9jb2wvSW50ZXJjZXB0b3JzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L3Byb3RvY29sL0ludGVyY2VwdG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNmODZlLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3BlcHQvcHJvdG9jb2wvSW50ZXJjZXB0b3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotLyoqIEphdmEgaW50ZXJmYWNlICJJbnRlcmNlcHRvcnMuamF2YSIgZ2VuZXJhdGVkIGZyb20gUG9zZWlkb24gZm9yIFVNTC4KLSAqICBQb3NlaWRvbiBmb3IgVU1MIGlzIGRldmVsb3BlZCBieSA8QSBIUkVGPSJodHRwOi8vd3d3LmdlbnRsZXdhcmUuY29tIj5HZW50bGV3YXJlPC9BPi4KLSAqICBHZW5lcmF0ZWQgd2l0aCA8QSBIUkVGPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5LyI+dmVsb2NpdHk8L0E+IHRlbXBsYXRlIGVuZ2luZS4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByb3RvY29sOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci0KLS8qKgotICogPHA+Ci0gKgotICogQGF1dGhvciBEci4gSGFyb2xkIENhcnIKLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcmNlcHRvcnMgewotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBvcGVyYXRpb25zCi0KLS8qKgotICogPHA+Ci0gKiBEb2VzIC4uLgotICogPC9wPjxwPgotICoKLSAqIDwvcD48cD4KLSAqCi0gKiBAcGFyYW0gbWVzc2FnZUluZm8gLi4uCi0gKiA8L3A+Ci0gKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcmNlcHRNZXNzYWdlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKTsKLQotfSAvLyBlbmQgSW50ZXJjZXB0b3JzCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L3Byb3RvY29sL01lc3NhZ2VEaXNwYXRjaGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wZXB0L3Byb3RvY29sL01lc3NhZ2VEaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNDhkZWUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcGVwdC9wcm90b2NvbC9NZXNzYWdlRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLS8qKiBKYXZhIGludGVyZmFjZSAiTWVzc2FnZURpc3BhdGNoZXIuamF2YSIgZ2VuZXJhdGVkIGZyb20gUG9zZWlkb24gZm9yIFVNTC4KLSAqICBQb3NlaWRvbiBmb3IgVU1MIGlzIGRldmVsb3BlZCBieSA8QSBIUkVGPSJodHRwOi8vd3d3LmdlbnRsZXdhcmUuY29tIj5HZW50bGV3YXJlPC9BPi4KLSAqICBHZW5lcmF0ZWQgd2l0aCA8QSBIUkVGPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5LyI+dmVsb2NpdHk8L0E+IHRlbXBsYXRlIGVuZ2luZS4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByb3RvY29sOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci0KLS8qKgotICogPHA+Ci0gKgotICogQGF1dGhvciBEci4gSGFyb2xkIENhcnIKLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRGlzcGF0Y2hlciB7Ci0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIC8vIG9wZXJhdGlvbnMKLQotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBtZXNzYWdlSW5mbyAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pOwotLyoqCi0gKiA8cD4KLSAqIERvZXMgLi4uCi0gKiA8L3A+PHA+Ci0gKgotICogPC9wPjxwPgotICoKLSAqIEBwYXJhbSBtZXNzYWdlSW5mbyAuLi4KLSAqIDwvcD4KLSAqLwotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pOwotCi19IC8vIGVuZCBNZXNzYWdlRGlzcGF0Y2hlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wvc29hcC9DbGllbnRNVVR1YmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3NvYXAvQ2xpZW50TVVUdWJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3NvYXAvQ2xpZW50TVVUdWJlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC5zb2FwOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5OZXh0QWN0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZUNsb25lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuSGFuZGxlckNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFBlcmZvcm1zIHNvYXAgbXVzdFVuZGVyc3RhbmQgcHJvY2Vzc2luZyBmb3IgY2xpZW50cy4KKyAqCisgKiBAYXV0aG9yIFJhbWEgUHVsYXZhcnRoaQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50TVVUdWJlIGV4dGVuZHMgTVVUdWJlIHsKKworICAgIHB1YmxpYyBDbGllbnRNVVR1YmUoV1NCaW5kaW5nIGJpbmRpbmcsIFR1YmUgbmV4dCkgeworICAgICAgICBzdXBlcihiaW5kaW5nLCBuZXh0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xpZW50TVVUdWJlKENsaWVudE1VVHViZSB0aGF0LCBUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICBzdXBlcih0aGF0LGNsb25lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gTVUgSGVhZGVyIFByb2Nlc3Npbmcgb24gaW5jb21pbmcgbWVzc2FnZSAocmVzcG9uc2UpCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICAgICBpZiBhbGwgdGhlIGhlYWRlcnMgaW4gdGhlIHBhY2tldCBhcmUgdW5kZXJzdG9vZCwgcmV0dXJucyBhbiBhY3Rpb24gdG8KKyAgICAgKiAgICAgICAgIGNhbGwgdGhlIHByZXZpb3VzIHBpcGVzIHdpdGggcmVzcG9uc2UgcGFja2V0CisgICAgICogQHRocm93cyBTT0FQRmF1bHRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgIGlmIGFsbCB0aGUgaGVhZGVycyBpbiB0aGUgcGFja2V0IGFyZSBub3QgdW5kZXJzdG9vZCwgdGhyb3dzIFNPQVBGYXVsdEV4Y2VwdGlvbgorICAgICAqLworICAgIEBPdmVycmlkZSBATm90TnVsbAorICAgIHB1YmxpYyBOZXh0QWN0aW9uIHByb2Nlc3NSZXNwb25zZShQYWNrZXQgcmVzcG9uc2UpIHsKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldE1lc3NhZ2UoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgICAgICBIYW5kbGVyQ29uZmlndXJhdGlvbiBoYW5kbGVyQ29uZmlnID0gcmVzcG9uc2UuaGFuZGxlckNvbmZpZzsKKyAgICAgICAgU2V0PFFOYW1lPiBrbm93bkhlYWRlcnM7CisgICAgICAgIFNldDxTdHJpbmc+IHJvbGVzOworICAgICAgICBpZiAoaGFuZGxlckNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBrbm93bkhlYWRlcnMgPSBoYW5kbGVyQ29uZmlnLmdldEtub3duSGVhZGVycygpOworICAgICAgICAgICAgcm9sZXMgPSBoYW5kbGVyQ29uZmlnLmdldFJvbGVzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByb2xlcyA9IHNvYXBWZXJzaW9uLmltcGxpY2l0Um9sZVNldDsKKyAgICAgICAgICAgIGtub3duSGVhZGVycyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOworICAgICAgICB9CisgICAgICAgIFNldDxRTmFtZT4gbWlzVW5kZXJzdG9vZEhlYWRlcnMgPSBnZXRNaXNVbmRlcnN0b29kSGVhZGVycygKKyAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRNZXNzYWdlKCkuZ2V0SGVhZGVycygpLCByb2xlcywKKyAgICAgICAgICAgICAgICBrbm93bkhlYWRlcnMpOworICAgICAgICBpZigobWlzVW5kZXJzdG9vZEhlYWRlcnMgPT0gbnVsbCkgfHwgbWlzVW5kZXJzdG9vZEhlYWRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBjcmVhdGVNVVNPQVBGYXVsdEV4Y2VwdGlvbihtaXNVbmRlcnN0b29kSGVhZGVycyk7CisgICAgfQorCisgICAgcHVibGljIENsaWVudE1VVHViZSBjb3B5KFR1YmVDbG9uZXIgY2xvbmVyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xpZW50TVVUdWJlKHRoaXMsY2xvbmVyKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3NvYXAvTVVUdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC9zb2FwL01VVHViZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmE4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC9zb2FwL01VVHViZS5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXA7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbi5TT0FQXzExOworaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb24uU09BUF8xMjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlQ2xvbmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5BYnN0cmFjdEZpbHRlclR1YmVJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1lc3NhZ2UuRE9NSGVhZGVyOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBAYXV0aG9yIFJhbWEgUHVsYXZhcnRoaQorICovCisKK2Fic3RyYWN0IGNsYXNzIE1VVHViZSBleHRlbmRzIEFic3RyYWN0RmlsdGVyVHViZUltcGwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1VX0ZBVUxUX0RFVEFJTF9MT0NBTFBBUlQgPSAiTm90VW5kZXJzdG9vZCI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgTVVfSEVBREVSX0RFVEFJTCA9IG5ldyBRTmFtZShTT0FQVmVyc2lvbi5TT0FQXzEyLm5zVXJpLCBNVV9GQVVMVF9ERVRBSUxfTE9DQUxQQVJUKTsKKyAgICAvL1RPRE86IGNoYW5nZQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoCisgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5zb2FwLmRlY29kZXIiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTVVTVF9VTkRFUlNUQU5EX0ZBVUxUX01FU1NBR0VfU1RSSU5HID0KKyAgICAgICAgICAgICJPbmUgb3IgbW9yZSBtYW5kYXRvcnkgU09BUCBoZWFkZXIgYmxvY2tzIG5vdCB1bmRlcnN0b29kIjsKKworICAgIHByb3RlY3RlZCBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKyAgICBwcml2YXRlIGZpbmFsIEFkZHJlc3NpbmdWZXJzaW9uIGFkZHJlc3NpbmdWZXJzaW9uOworCisgICAgcHJvdGVjdGVkIE1VVHViZShXU0JpbmRpbmcgYmluZGluZywgVHViZSBuZXh0KSB7CisgICAgICAgIHN1cGVyKG5leHQpOworICAgICAgICAvLyBNVVBpcGUgc2hvdWxkIG4ndCBiZSB1c2VkIGZvciBiaW5kaW5ncyBvdGhlciB0aGFuIFNPQVAuCisgICAgICAgIGlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTVVQaXBlIHNob3VsZCBuJ3QgYmUgdXNlZCBmb3IgYmluZGluZ3Mgb3RoZXIgdGhhbiBTT0FQLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc29hcFZlcnNpb24gPSBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCk7CisgICAgICAgIHRoaXMuYWRkcmVzc2luZ1ZlcnNpb24gPSBiaW5kaW5nLmdldEFkZHJlc3NpbmdWZXJzaW9uKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE1VVHViZShNVVR1YmUgdGhhdCwgVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgc3VwZXIodGhhdCwgY2xvbmVyKTsKKyAgICAgICAgc29hcFZlcnNpb24gPSB0aGF0LnNvYXBWZXJzaW9uOworICAgICAgICBhZGRyZXNzaW5nVmVyc2lvbiA9IHRoYXQuYWRkcmVzc2luZ1ZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGhlYWRlcnMgICAgICBIZWFkZXJMaXN0IHRoYXQgbmVlZHMgTVUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByb2xlcyAgICAgICAgUm9sZXMgY29uZmlndXJlZCBvbiB0aGUgQmluZGluZy4gUmVxdWlyZWQgUm9sZXMgc3VwcG9zZWQgdG8gYmUgYXNzdW1iZWQgYSBieSBhCisgICAgICogICAgICAgICAgICAgICAgICAgICBTT0FQIEJpbmRpbmcgaW1wbGVtZW50YXRpb24gYXJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBrbm93bkhlYWRlcnMgU2V0IG9mIGhlYWRlcnMgdGhhdCB0aGlzIGJpbmRpbmcgdW5kZXJzdGFuZHMKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGhlYWRlcnMgdGhhdCBoYXZlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBhbmQgYXJlIG5vdCB1bmRlcnN0b29kCisgICAgICogICAgICAgICBieSB0aGUgYmluZGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PFFOYW1lPiBnZXRNaXNVbmRlcnN0b29kSGVhZGVycyhIZWFkZXJMaXN0IGhlYWRlcnMsIFNldDxTdHJpbmc+IHJvbGVzLCBTZXQ8UU5hbWU+IGtub3duSGVhZGVycykgeworICAgICAgICBTZXQ8UU5hbWU+IG5vdFVuZGVyc3Rvb2RIZWFkZXJzID0gbnVsbDsKKworICAgICAgICB1bmRlcnN0YW5kQWRkcmVzc2luZ0hlYWRlcnMoa25vd25IZWFkZXJzKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghaGVhZGVycy5pc1VuZGVyc3Rvb2QoaSkpIHsKKyAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gaGVhZGVycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCFoZWFkZXIuaXNJZ25vcmFibGUoc29hcFZlcnNpb24sIHJvbGVzKSkgeworICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShoZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCksIGhlYWRlci5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghIGtub3duSGVhZGVycy5jb250YWlucyhxTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoIkVsZW1lbnQgbm90IHVuZGVyc3Rvb2Q9IiArIHFOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3RVbmRlcnN0b29kSGVhZGVycyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdFVuZGVyc3Rvb2RIZWFkZXJzID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RVbmRlcnN0b29kSGVhZGVycy5hZGQocU5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBub3RVbmRlcnN0b29kSGVhZGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmRlcnN0YW5kIFdTLUFkZHJlc3NpbmcgaGVhZGVycyBpZiBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBrbm93bkhlYWRlcnMgU2V0IG9mIGhlYWRlcnMgdGhhdCB0aGlzIGJpbmRpbmcgdW5kZXJzdGFuZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdW5kZXJzdGFuZEFkZHJlc3NpbmdIZWFkZXJzKFNldDxRTmFtZT4ga25vd25IZWFkZXJzKSB7CisgICAgICAgIGlmIChhZGRyZXNzaW5nVmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBrbm93bkhlYWRlcnMuYWRkKGFkZHJlc3NpbmdWZXJzaW9uLmFjdGlvblRhZyk7CisgICAgICAgICAgICBrbm93bkhlYWRlcnMuYWRkKGFkZHJlc3NpbmdWZXJzaW9uLmZhdWx0VG9UYWcpOworICAgICAgICAgICAga25vd25IZWFkZXJzLmFkZChhZGRyZXNzaW5nVmVyc2lvbi5mcm9tVGFnKTsKKyAgICAgICAgICAgIGtub3duSGVhZGVycy5hZGQoYWRkcmVzc2luZ1ZlcnNpb24ubWVzc2FnZUlEVGFnKTsKKyAgICAgICAgICAgIGtub3duSGVhZGVycy5hZGQoYWRkcmVzc2luZ1ZlcnNpb24ucmVsYXRlc1RvVGFnKTsKKyAgICAgICAgICAgIGtub3duSGVhZGVycy5hZGQoYWRkcmVzc2luZ1ZlcnNpb24ucmVwbHlUb1RhZyk7CisgICAgICAgICAgICBrbm93bkhlYWRlcnMuYWRkKGFkZHJlc3NpbmdWZXJzaW9uLnRvVGFnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBub3RVbmRlcnN0b29kSGVhZGVycworICAgICAqIEByZXR1cm4gU09BUGZhdWx0RXhjZXB0aW9uIHdpdGggU09BUEZhdWx0IHJlcHJlc2VudGluZyB0aGUgTXVzdFVuZGVyc3RhbmQgU09BUCBGYXVsdC4KKyAgICAgKiAgICAgICAgIG5vdFVuZGVyc3Rvb2RIZWFkZXJzIGFyZSBhZGRlZCBpbiB0aGUgZmF1bHQgZGV0YWlsLgorICAgICAqLworICAgIGZpbmFsIFNPQVBGYXVsdEV4Y2VwdGlvbiBjcmVhdGVNVVNPQVBGYXVsdEV4Y2VwdGlvbihTZXQ8UU5hbWU+IG5vdFVuZGVyc3Rvb2RIZWFkZXJzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBjcmVhdGVNVVNPQVBGYXVsdCgpOworICAgICAgICAgICAgc2V0TVVGYXVsdFN0cmluZyhmYXVsdCwgbm90VW5kZXJzdG9vZEhlYWRlcnMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oZmF1bHQpOworICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGluIFNlcnZlck1VUGlwZQorICAgICAqCisgICAgICogQHBhcmFtIG5vdFVuZGVyc3Rvb2RIZWFkZXJzCisgICAgICogQHJldHVybiBNZXNzYWdlIHJlcHJlc2VudGluZyBhIFNPQVBGYXVsdAorICAgICAqICAgICAgICAgSW4gU09BUCAxLjEsIG5vdFVuZGVyc3Rvb2RIZWFkZXJzIGFyZSBhZGRlZCBpbiB0aGUgZmF1bHQgRGV0YWlsCisgICAgICogICAgICAgICBpbiBTT0FQIDEuMiwgbm90VW5kZXJzdG9vZEhlYWRlcnMgYXJlIGFkZGVkIGFzIHRoZSBTT0FQIEhlYWRlcnMKKyAgICAgKi8KKworICAgIGZpbmFsIE1lc3NhZ2UgY3JlYXRlTVVTT0FQRmF1bHRNZXNzYWdlKFNldDxRTmFtZT4gbm90VW5kZXJzdG9vZEhlYWRlcnMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGNyZWF0ZU1VU09BUEZhdWx0KCk7CisgICAgICAgICAgICBpZiAoc29hcFZlcnNpb24gPT0gU09BUF8xMSkgeworICAgICAgICAgICAgICAgIHNldE1VRmF1bHRTdHJpbmcoZmF1bHQsIG5vdFVuZGVyc3Rvb2RIZWFkZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1lc3NhZ2UgbXVGYXVsdE1lc3NhZ2UgPSBNZXNzYWdlcy5jcmVhdGUoZmF1bHQpOworICAgICAgICAgICAgaWYgKHNvYXBWZXJzaW9uID09IFNPQVBfMTIpIHsKKyAgICAgICAgICAgICAgICBhZGRIZWFkZXIobXVGYXVsdE1lc3NhZ2UsIG5vdFVuZGVyc3Rvb2RIZWFkZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtdUZhdWx0TWVzc2FnZTsKKyAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRNVUZhdWx0U3RyaW5nKFNPQVBGYXVsdCBmYXVsdCwgU2V0PFFOYW1lPiBub3RVbmRlcnN0b29kSGVhZGVycykgdGhyb3dzIFNPQVBFeGNlcHRpb24geworICAgICAgICBmYXVsdC5zZXRGYXVsdFN0cmluZygiTXVzdFVuZGVyc3RhbmQgaGVhZGVyczoiICsKKyAgICAgICAgICAgICAgICBub3RVbmRlcnN0b29kSGVhZGVycyArICIgYXJlIG5vdCB1bmRlcnN0b29kIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRIZWFkZXIoTWVzc2FnZSBtLCBTZXQ8UU5hbWU+IG5vdFVuZGVyc3Rvb2RIZWFkZXJzKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoUU5hbWUgcW5hbWUgOiBub3RVbmRlcnN0b29kSGVhZGVycykgeworICAgICAgICAgICAgU09BUEVsZW1lbnQgc29hcEVsID0gU09BUF8xMi5zYWFqU29hcEZhY3RvcnkuY3JlYXRlRWxlbWVudChNVV9IRUFERVJfREVUQUlMKTsKKyAgICAgICAgICAgIHNvYXBFbC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiYWJjIiwgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICAgICAgc29hcEVsLnNldEF0dHJpYnV0ZSgicW5hbWUiLCAiYWJjOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IERPTUhlYWRlcjxFbGVtZW50Pihzb2FwRWwpOworICAgICAgICAgICAgbS5nZXRIZWFkZXJzKCkuYWRkKGhlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFNPQVBGYXVsdCBjcmVhdGVNVVNPQVBGYXVsdCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNvYXBWZXJzaW9uLnNhYWpTb2FwRmFjdG9yeS5jcmVhdGVGYXVsdCgKKyAgICAgICAgICAgICAgICBNVVNUX1VOREVSU1RBTkRfRkFVTFRfTUVTU0FHRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgc29hcFZlcnNpb24uZmF1bHRDb2RlTXVzdFVuZGVyc3RhbmQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3NvYXAvU2VydmVyTVVUdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC9zb2FwL1NlcnZlck1VVHViZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTBhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC9zb2FwL1NlcnZlck1VVHViZS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLio7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkhhbmRsZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEBhdXRob3IgUmFtYSBQdWxhdmFydGhpCisgKi8KKworcHVibGljIGNsYXNzIFNlcnZlck1VVHViZSBleHRlbmRzIE1VVHViZSB7CisKKyAgICBwcml2YXRlIEhhbmRsZXJDb25maWd1cmF0aW9uIGhhbmRsZXJDb25maWc7CisKKyAgICBwdWJsaWMgU2VydmVyTVVUdWJlKFdTQmluZGluZyBiaW5kaW5nLCBUdWJlIG5leHQpIHsKKyAgICAgICAgc3VwZXIoYmluZGluZywgbmV4dCk7CisgICAgICAgIC8vT24gU2VydmVyLCBIYW5kbGVyQ29uZmlndXJhdGlvbiBkb2VzIG4ndCBjaGFuZ2UgYWZ0ZXIgcHVibGlzaC4KKyAgICAgICAgaGFuZGxlckNvbmZpZyA9ICgoQmluZGluZ0ltcGwpYmluZGluZykuZ2V0SGFuZGxlckNvbmZpZygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTZXJ2ZXJNVVR1YmUoU2VydmVyTVVUdWJlIHRoYXQsIFR1YmVDbG9uZXIgY2xvbmVyKSB7CisgICAgICAgIHN1cGVyKHRoYXQsY2xvbmVyKTsKKyAgICAgICAgaGFuZGxlckNvbmZpZyA9IHRoYXQuaGFuZGxlckNvbmZpZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyBNVSBIZWFkZXIgUHJvY2Vzc2luZyBvbiBpbmNvbWluZyBtZXNzYWdlIChyZXF1ZXN0KQorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGlmIGFsbCB0aGUgaGVhZGVycyBpbiB0aGUgcGFja2V0IGFyZSB1bmRlcnN0b29kLCByZXR1cm5zIGFjdGlvbiBzdWNoIHRoYXQKKyAgICAgKiAgICAgIG5leHQgcGlwZSB3aWxsIGJlIGlub3ZrZWQuCisgICAgICogICAgICBpZiBhbGwgdGhlIGhlYWRlcnMgaW4gdGhlIHBhY2tldCBhcmUgbm90IHVuZGVyc3Rvb2QsIHJldHVybnMgYWN0aW9uIHN1Y2ggdGhhdAorICAgICAqICAgICAgU09BUEZhdWx0IE1lc3NhZ2UgaXMgc2VudCB0byBwcmV2aW91cyBwaXBlcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzUmVxdWVzdChQYWNrZXQgcmVxdWVzdCkgeworICAgICAgICBTZXQ8UU5hbWU+IG1pc1VuZGVyc3Rvb2RIZWFkZXJzID0gZ2V0TWlzVW5kZXJzdG9vZEhlYWRlcnMocmVxdWVzdC5nZXRNZXNzYWdlKCkuZ2V0SGVhZGVycygpLAorICAgICAgICAgICAgICAgIGhhbmRsZXJDb25maWcuZ2V0Um9sZXMoKSxoYW5kbGVyQ29uZmlnLmdldEtub3duSGVhZGVycygpKTsKKyAgICAgICAgaWYoKG1pc1VuZGVyc3Rvb2RIZWFkZXJzID09IG51bGwpICB8fCBtaXNVbmRlcnN0b29kSGVhZGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkb0ludm9rZShzdXBlci5uZXh0LCByZXF1ZXN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZG9SZXR1cm5XaXRoKHJlcXVlc3QuY3JlYXRlUmVzcG9uc2UoY3JlYXRlTVVTT0FQRmF1bHRNZXNzYWdlKG1pc1VuZGVyc3Rvb2RIZWFkZXJzKSkpOworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2ZXJNVVR1YmUgY29weShUdWJlQ2xvbmVyIGNsb25lcikgeworICAgICAgICByZXR1cm4gbmV3IFNlcnZlck1VVHViZSh0aGlzLGNsb25lcik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC9zb2FwL1ZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wvc29hcC9WZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDU5MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wvc29hcC9WZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5TT0FQVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5FeGNlcHRpb25IYXNNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQMTJDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmZhdWx0LlNPQVBGYXVsdEJ1aWxkZXI7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgU09BUCBWZXJzaW9uTWlzbWF0Y2hGYXVsdC4gVXNlCisgKiB0aGlzIHdoZW4gdGhlIHJlY2VpdmVkIHNvYXAgZW52ZWxvcGUgaXMgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCisgKiB0aGFuIHdoYXQgdGhlIHNwZWNpZmllZCBCaW5kaW5nIHNheXMuCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGNsYXNzIFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbkhhc01lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKworICAgIHB1YmxpYyBWZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24oU09BUFZlcnNpb24gc29hcFZlcnNpb24sIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIHN1cGVyKCJzb2FwLnZlcnNpb24ubWlzbWF0Y2guZXJyIiwgYXJncyk7CisgICAgICAgIHRoaXMuc29hcFZlcnNpb24gPSBzb2FwVmVyc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLnNvYXAiOworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlIGdldEZhdWx0TWVzc2FnZSgpIHsKKyAgICAgICAgUU5hbWUgZmF1bHRDb2RlID0gKHNvYXBWZXJzaW9uID09IFNPQVBWZXJzaW9uLlNPQVBfMTEpCisgICAgICAgICAgICA/IFNPQVBDb25zdGFudHMuRkFVTFRfQ09ERV9WRVJTSU9OX01JU01BVENICisgICAgICAgICAgICA6IFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX1ZFUlNJT05fTUlTTUFUQ0g7CisgICAgICAgIHJldHVybiBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgc29hcFZlcnNpb24sIGdldExvY2FsaXplZE1lc3NhZ2UoKSwgZmF1bHRDb2RlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3NvYXAvY2xpZW50L1NPQVBNZXNzYWdlRGlzcGF0Y2hlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wvc29hcC9jbGllbnQvU09BUE1lc3NhZ2VEaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMWI5NjAuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wvc29hcC9jbGllbnQvU09BUE1lc3NhZ2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEyICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuY2xpZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcC5NZXNzYWdlSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5Bc3luY0hhbmRsZXJTZXJ2aWNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5Db250ZXh0TWFwOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzOwotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5FbmRwb2ludElGSW52b2NhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkVuZHBvaW50SUZDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuUmVzcG9uc2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU0Z1dHVyZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuZGlzcGF0Y2guRGlzcGF0Y2hDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5SZXNwb25zZUltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuY2xpZW50LlNPQVAxMlhNTEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5jbGllbnQuU09BUFhNTERlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5jbGllbnQuU09BUFhNTEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5NZXNzYWdlSW5mb0Jhc2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXIuRGlyZWN0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNoYWluQ2FsbGVyLlJlcXVlc3RPclJlc3BvbnNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHRVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuU09BUEhhbmRsZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkphdmFNZXRob2Q7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUnVudGltZU1vZGVsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0LkVQVEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5DbGllbnRUcmFuc3BvcnRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLlN5c3RlbUhhbmRsZXJEZWxlZ2F0ZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5XU0Nvbm5lY3Rpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuY2xpZW50Lkh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQmFzZTY0VXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkZhc3RJbmZvc2V0VXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNPQVBDb25uZWN0aW9uVXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlci5QQVNTV09SRF9QUk9QRVJUWTsKLWltcG9ydCBzdGF0aWMgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlci5VU0VSTkFNRV9QUk9QRVJUWTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotCi0vKioKLSAqIENsaWVudC1zaWRlIFNPQVAgcHJvdG9jb2wtc3BlY2lmaWMge0BsaW5rIGNvbS5zdW4ucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlcn0KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlRGlzcGF0Y2hlciBpbXBsZW1lbnRzIE1lc3NhZ2VEaXNwYXRjaGVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BWF9USFJFQURfUE9PTF9TSVpFID0gMzsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBBV0FJVF9URVJNSU5BVElPTl9USU1FID0gMTBMOwotCi0gICAgcHJvdGVjdGVkIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTVVTVF9VTkRFUlNUQU5EX0ZBVUxUX01FU1NBR0VfU1RSSU5HID0gIlNPQVAgbXVzdCB1bmRlcnN0YW5kIGVycm9yIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2VEaXNwYXRjaGVyKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogSW52b2tlcyBkb1NlbmRBc3luYyBtZXRob2QgaWYgdGhlIG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybiBpcyBhc3luY2hyb25vdXMsIG90aGVyd2lzZQotICAgICAqIGludm9rZXMgZG9TZW5kIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBzZWUgY29tLnN1bi5wZXB0LnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVyI3NlbmQoY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIGlmIChpc0FzeW5jKG1lc3NhZ2VJbmZvKSkgewotICAgICAgICAgICAgZG9TZW5kQXN5bmMobWVzc2FnZUluZm8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG9TZW5kKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9yY2hlc3RyYXRlcyB0aGUgc2VuZGluZyBvZiBhIHN5bmNocm9ub3VzIHJlcXVlc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU09BUE1lc3NhZ2UgZG9TZW5kKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIC8vY2hhbmdlIGZyb20gTG9naWNhbEVQVEZhY3RvcnkgdG8gQ29udGFjdEluZm9CYXNlIC0gc2hvdWxkIGJlIGNoYW5nZWQgYmFjayB3aGVuIHdlIGhhdmUgdGhpbmdzIHdvcmtpbmcKLSAgICAgICAgRVBURmFjdG9yeSBjb250YWN0SW5mbyA9IG1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgU09BUFhNTEVuY29kZXIgZW5jb2RlciA9IChTT0FQWE1MRW5jb2RlcikgY29udGFjdEluZm8uZ2V0RW5jb2RlcihtZXNzYWdlSW5mbyk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHNtID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVyUmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3RSZXNwb25zZSA9IChtZXNzYWdlSW5mby5nZXRNRVAoKSA9PSBNZXNzYWdlU3RydWN0LlJFUVVFU1RfUkVTUE9OU0VfTUVQKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFX01PREUpID09IFNlcnZpY2UuTW9kZS5NRVNTQUdFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNtID0gKFNPQVBNZXNzYWdlKSBtZXNzYWdlSW5mby5nZXREYXRhKClbMF07Ci0gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHN1cHBsaWVkIG1lc3NhZ2UgaXMgZW5jb2RlZCBhY2NvcmRpbmcgdG8gY29ubmVnCi0gICAgICAgICAgICAgICAgRmFzdEluZm9zZXRVdGlsLmVuc3VyZUNvcnJlY3RFbmNvZGluZyhtZXNzYWdlSW5mbywgc20pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTT0FQSGFuZGxlckNvbnRleHQgaGFuZGxlckNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgSW50ZXJuYWxNZXNzYWdlIGltID0gZW5jb2Rlci50b0ludGVybmFsTWVzc2FnZShtZXNzYWdlSW5mbyk7Ci0KLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBjYWxsZXIgPSBnZXRIYW5kbGVyQ2hhaW5DYWxsZXIobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgaWYgKGNhbGxlci5oYXNIYW5kbGVycygpKSB7Ci0gICAgICAgICAgICAgICAgaW0gPSBwcmVIYW5kbGVyT3V0Ym91bmRIb29rKHNtLCBpbSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNvbnRleHQgPSBuZXcgU09BUEhhbmRsZXJDb250ZXh0KG1lc3NhZ2VJbmZvLCBpbSwgc20pOwotCi0gICAgICAgICAgICAgICAgLy90aGlzIGlzIG5lZWRlZCBzbyB0aGF0IGF0dGFjaG1lbnRzIGFyZSBjb21waWVkIGZyb20gUkVTUE9OU0VfTUVTU0FHRV9BVFRBQ0hNRU1UTiBQUk9QRVJUWQotICAgICAgICAgICAgICAgIGhhbmRsZXJDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkucHV0KAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgICAgICAgICAgZW5jb2Rlci5zZXRBdHRhY2htZW50c01hcChtZXNzYWdlSW5mbywgaW0pOwotICAgICAgICAgICAgICAgIHVwZGF0ZU1lc3NhZ2VDb250ZXh0KG1lc3NhZ2VJbmZvLCBoYW5kbGVyQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAvL25vdyB0aGF0IHRoZSBNRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZIGlzIHNldCBzbyBwb3B1bGF0ZSB0aGUgYXR0YWNoZW1udHMKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ29udGV4dC5wb3B1bGF0ZUF0dGFjaG1lbnRNYXAoKTsKLQotICAgICAgICAgICAgICAgIEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIgYW0gPSBNZXNzYWdlSW5mb1V0aWwuZ2V0QXR0YWNobWVudE1hcnNoYWxsZXIobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNYb3BwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvL3RoZXJlIGFyZSBoYW5kbGVycyBzbyBkaXNhYmxlIFhvcCBlbmNvZGluZyBpZiBlbmFibGVkLCBzbyB0aGF0IHRoZXkgZG9udAotICAgICAgICAgICAgICAgIC8vIHNlZSB4b3A6SW5jbHVkZSByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICBpZiAoKGFtICE9IG51bGwpICYmIGFtLmlzWE9QUGFja2FnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzWG9wcGVkID0gYW0uaXNYT1BQYWNrYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFtLnNldFhPUFBhY2thZ2UoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gY2FsbEhhbmRsZXJzT25SZXF1ZXN0KGhhbmRsZXJDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvLyBub3cgcHV0IGJhY2sgdGhlIG9sZCB2YWx1ZQotICAgICAgICAgICAgICAgIGlmICgoYW0gIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYW0uc2V0WE9QUGFja2FnZShpc1hvcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc20gPSBoYW5kbGVyQ29udGV4dC5nZXRTT0FQTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHBvc3RIYW5kbGVyT3V0Ym91bmRIb29rKG1lc3NhZ2VJbmZvLCBoYW5kbGVyQ29udGV4dCwgc20pOwotICAgICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNtID0gZW5jb2Rlci50b1NPQVBNZXNzYWdlKGhhbmRsZXJDb250ZXh0LmdldEludGVybmFsTWVzc2FnZSgpLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSB3aGVyZSBubyBtZXNzYWdlIGlzIHNlbnQKLSAgICAgICAgICAgICAgICBpZiAoaXNSZXF1ZXN0UmVzcG9uc2UgJiYgIWhhbmRsZXJSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUFhNTERlY29kZXIgZGVjb2RlciA9IChTT0FQWE1MRGVjb2RlcikgY29udGFjdEluZm8uZ2V0RGVjb2RlcihtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGltID0gZGVjb2Rlci50b0ludGVybmFsTWVzc2FnZShzbSwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnRvTWVzc2FnZUluZm8oaW0sIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0dGluZyBlbmNvZGVyIGhlcmUgaXMgbmVjZXNzYXJ5IGZvciBjYWxscyB0byBnZXRCaW5kaW5nSWQoKQotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0RW5jb2RlcihlbmNvZGVyKTsKLQotICAgICAgICAgICAgU3lzdGVtSGFuZGxlckRlbGVnYXRlIHN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSA9Ci0gICAgICAgICAgICAgICAgKChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5CaW5kaW5nKSBnZXRCaW5kaW5nKG1lc3NhZ2VJbmZvKSkuCi0gICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSgpOwotICAgICAgICAgICAgaWYgKHN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNvbnRleHQgPSBuZXcgU09BUEhhbmRsZXJDb250ZXh0KG1lc3NhZ2VJbmZvLCBpbSwgc20pOwotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbmVlZGVkIHNvIHRoYXQgYXR0YWNobWVudHMgYXJlIGNvbXBpZWQgZnJvbSBSRVNQT05TRV9NRVNTQUdFX0FUVEFDSE1FTVROIFBST1BFUlRZCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICAgICAgICAgICAgICAvL25vdyB0aGF0IHRoZSBNRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZIGlzIHNldCBzbyBwb3B1bGF0ZSB0aGUgYXR0YWNoZW1udHMKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNvbnRleHQucG9wdWxhdGVBdHRhY2htZW50TWFwKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWVzc2FnZUNvbnRleHQobWVzc2FnZUluZm8sIGhhbmRsZXJDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbmNvZGVyLnNldEF0dGFjaG1lbnRzTWFwKG1lc3NhZ2VJbmZvLCBpbSk7Ci0gICAgICAgICAgICAgICAgLy9hbHJlYWR5IHVzZWQgaW0sIHdlIGNhbiBzZXQgdGhhdCB0byBudWxsCi0gICAgICAgICAgICAgICAgaWYgKChzbSAhPSBudWxsKSAmJiAoaW0gIT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDb250ZXh0LnNldEludGVybmFsTWVzc2FnZShudWxsKTsKLQotCi0gICAgICAgICAgICAgICAgaGFuZGxlckNvbnRleHQuZ2V0QmluZGluZ0lkKCk7Ci0gICAgICAgICAgICAgICAgc3lzdGVtSGFuZGxlckRlbGVnYXRlLnByb2Nlc3NSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ29udGV4dC5nZXRTSERTT0FQTWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc20gPSBoYW5kbGVyQ29udGV4dC5nZXRTT0FQTWVzc2FnZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc20gPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgc20gPSBlbmNvZGVyLnRvU09BUE1lc3NhZ2UoaW0sIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNvbnRleHQgPSBuZXcgU09BUEhhbmRsZXJDb250ZXh0KG1lc3NhZ2VJbmZvLCBpbSwgc20pOwotICAgICAgICAgICAgICAgIHVwZGF0ZU1lc3NhZ2VDb250ZXh0KG1lc3NhZ2VJbmZvLCBoYW5kbGVyQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0ID0gcHJvY2Vzc01ldGFkYXRhKG1lc3NhZ2VJbmZvLCBzbSk7Ci0KLSAgICAgICAgICAgIHNldENvbm5lY3Rpb24obWVzc2FnZUluZm8sIGNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAoIWlzQXN5bmMobWVzc2FnZUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgV1NDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoV1NDb25uZWN0aW9uKSBtZXNzYWdlSW5mby5nZXRDb25uZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBsb2dSZXF1ZXN0TWVzc2FnZShzbSwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uVXRpbC5zZW5kUmVzcG9uc2UoY29ubmVjdGlvbiwgc20pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNSZXF1ZXN0UmVzcG9uc2UpIHsKLSAgICAgICAgICAgICAgICByZWNlaXZlKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPbmV3YXkobWVzc2FnZUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tSZXR1cm5TdGF0dXMobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgc2V0UmVzcG9uc2VUeXBlKHdzZSwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2Uod3NlKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gZXggPSAoUnVudGltZUV4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIHNldFJlc3BvbnNlVHlwZShleCwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzbTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc09uZXdheShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gbWVzc2FnZUluZm8uZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGFuZCBjbGFzc2lmeSB0aGUgbWV0YWRhdGEgaW4gTUlNRSBoZWFkZXJzIG9yIG1lc3NhZ2UgY29udGV4dC4gPFN0cmluZyxTdHJpbmc+IGRhdGEKLSAgICAgKiBpcyBjb3BpZWQgaW50byBNSU1FIGhlYWRlcnMgYW5kIHRoZSByZW1haW5pbmcgbWV0YWRhdGEgaXMgcGFzc2VkIGluIG1lc3NhZ2UgY29udGV4dCB0byB0aGUKLSAgICAgKiB0cmFuc3BvcnQgbGF5ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUluZm8KLSAgICAgKiBAcGFyYW0gc29hcE1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9jZXNzTWV0YWRhdGEoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWVzc2FnZUNvbnRleHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIENvbnRleHRNYXAgcHJvcGVydGllcyA9IChDb250ZXh0TWFwKSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShKQVhXU19DT05URVhUX1BST1BFUlRZKTsKLQotICAgICAgICBpZiAobWVzc2FnZUluZm8uZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCkKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChPTkVfV0FZX09QRVJBVElPTiwgInRydWUiKTsKLQotICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gdXNlU29hcEFjdGlvbiA9IGZhbHNlOwotCi0gICAgICAgIC8vIHByb2Nlc3MgdGhlIHByb3BlcnRpZXMKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBuYW1lcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHlOYW1lcygpOyBuYW1lcy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgUEVQVC1zcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lLmVxdWFscyhDbGllbnRUcmFuc3BvcnRGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQucHV0KENMSUVOVF9UUkFOU1BPUlRfRkFDVE9SWSwgKENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIHByb3BlcnRpZXMuZ2V0KHByb3BOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVVNFUk5BTUVfUFJPUEVSVFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVkZW50aWFscyA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KFVTRVJOQU1FX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWRlbnRpYWxzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzICs9ICI6IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KFBBU1NXT1JEX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzICs9IHBhc3N3b3JkOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gQmFzZTY0VXRpbC5lbmNvZGUoY3JlZGVudGlhbHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRNaW1lSGVhZGVycygpLmFkZEhlYWRlcigiQXV0aG9yaXphdGlvbiIsICJCYXNpYyAiICsgY3JlZGVudGlhbHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lLmVxdWFscyhCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzZVNvYXBBY3Rpb24gPSAoKEJvb2xlYW4pCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFkpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVNvYXBBY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwQWN0aW9uID0gKFN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChwcm9wTmFtZSwgcHJvcGVydGllcy5nZXQocHJvcE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgYWNjZXB0IGhlYWRlciBkZXBlbmRpbmcgb24gY29udGVudCBuZWdvdGlhdGlvbiBwcm9wZXJ0eQotICAgICAgICBTdHJpbmcgY29udGVudE5lZ290aWF0aW9uID0gKFN0cmluZykgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSk7Ci0KLSAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9IGdldEJpbmRpbmdJZChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwgYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvYXBNZXNzYWdlLmdldE1pbWVIZWFkZXJzKCkuc2V0SGVhZGVyKEFDQ0VQVF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBjb250ZW50TmVnb3RpYXRpb24gIT0gIm5vbmUiID8gU09BUDEyX1hNTF9GSV9BQ0NFUFRfVkFMVUUgOiBTT0FQMTJfWE1MX0FDQ0VQVF9WQUxVRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRNaW1lSGVhZGVycygpLnNldEhlYWRlcihBQ0NFUFRfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgY29udGVudE5lZ290aWF0aW9uICE9ICJub25lIiA/IFhNTF9GSV9BQ0NFUFRfVkFMVUUgOiBYTUxfQUNDRVBUX1ZBTFVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChCSU5ESU5HX0lEX1BST1BFUlRZLCBiaW5kaW5nSWQpOwotCi0gICAgICAgIC8vIFNPQVBBY3Rpb246IE1JTUUgaGVhZGVyCi0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ1bnRpbWVDb250ZXh0ID0gKFJ1bnRpbWVDb250ZXh0KSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShKQVhXU19SVU5USU1FX0NPTlRFWFQpOwotICAgICAgICBpZiAocnVudGltZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgSmF2YU1ldGhvZCBqYXZhTWV0aG9kID0gcnVudGltZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRKYXZhTWV0aG9kKG1lc3NhZ2VJbmZvLmdldE1ldGhvZCgpKTsKLSAgICAgICAgICAgIGlmIChqYXZhTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb2FwQWN0aW9uID0gKChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwLlNPQVBCaW5kaW5nKSBqYXZhTWV0aG9kLmdldEJpbmRpbmcoKSkuZ2V0U09BUEFjdGlvbigpOwotICAgICAgICAgICAgICAgIGhlYWRlci5jbGVhcigpOwotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwgYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHNvYXBBY3Rpb24gIT0gbnVsbCkgJiYgKHNvYXBBY3Rpb24ubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChNZXNzYWdlSW1wbCkgc29hcE1lc3NhZ2UpLnNldEFjdGlvbihzb2FwQWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLmdldE1pbWVIZWFkZXJzKCkuYWRkSGVhZGVyKCJTT0FQQWN0aW9uIiwgIlwiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLmdldE1pbWVIZWFkZXJzKCkuYWRkSGVhZGVyKCJTT0FQQWN0aW9uIiwgIlwiIiArIHNvYXBBY3Rpb24gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkRJU1BBVENIX0NPTlRFWFQpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vYnVnIGZpeCA2MzQ0MzU4Ci0gICAgICAgICAgICBoZWFkZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwgYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChzb2FwQWN0aW9uICE9IG51bGwpICYmIChzb2FwQWN0aW9uLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKChNZXNzYWdlSW1wbCkgc29hcE1lc3NhZ2UpLnNldEFjdGlvbihzb2FwQWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc29hcE1lc3NhZ2UuZ2V0TWltZUhlYWRlcnMoKS5hZGRIZWFkZXIoIlNPQVBBY3Rpb24iLCAiXCJcIiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLmdldE1pbWVIZWFkZXJzKCkuYWRkSGVhZGVyKCJTT0FQQWN0aW9uIiwgIlwiIiArIHNvYXBBY3Rpb24gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Q29ubmVjdGlvbihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0KSB7Ci0gICAgICAgIENsaWVudFRyYW5zcG9ydEZhY3RvcnkgY2xpZW50VHJhbnNwb3J0RmFjdG9yeSA9IChDbGllbnRUcmFuc3BvcnRGYWN0b3J5KSBjb250ZXh0LmdldChDTElFTlRfVFJBTlNQT1JUX0ZBQ1RPUlkpOwotICAgICAgICBXU0Nvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChjbGllbnRUcmFuc3BvcnRGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsaWVudFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkoKTsKLSAgICAgICAgICAgIGNvbnRleHQucHV0KENMSUVOVF9UUkFOU1BPUlRfRkFDVE9SWSwgY2xpZW50VHJhbnNwb3J0RmFjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29ubmVjdGlvbiA9IGNsaWVudFRyYW5zcG9ydEZhY3RvcnkuY3JlYXRlKGNvbnRleHQpOwotICAgICAgICBtZXNzYWdlSW5mby5zZXRDb25uZWN0aW9uKGNvbm5lY3Rpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFJlc3BvbnNlVHlwZShUaHJvd2FibGUgZSwgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZVR5cGUoTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja1JldHVyblN0YXR1cyhNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBXU0Nvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChXU0Nvbm5lY3Rpb24pIG1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKTsKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gY29ubmVjdGlvbi5nZXRIZWFkZXJzKCk7Ci0gICAgICAgIGlmIChjb25uZWN0aW9uLmdldFN0YXR1cygpICE9IDIwMiAmJiBjb25uZWN0aW9uLmdldFN0YXR1cygpICE9IDIwMCkgewotICAgICAgICAgICAgTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpLmxvZyhMZXZlbC5TRVZFUkUsICJIVFRQIHN0YXR1cyBjb2RlIGZvciBvbmV3YXk6IGV4cGVjdGVkIDIwMiBvciAyMDAsIGdvdCAiICsgY29ubmVjdGlvbi5nZXRTdGF0dXMoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhdHVzOiAiK2Nvbm5lY3Rpb24uZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIE9yY2hlc3RyYXRlcyB0aGUgcmVjZWl2aW5nIG9mIGEgc3luY2hyb25vdXMgcmVzcG9uc2UKLSAgICAqCi0gICAgKiBAc2VlIGNvbS5zdW4ucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlciNyZWNlaXZlKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgKgotICAgICogdG9kbzogZXhjZXB0aW9uIGhhbmRsaW5nIHdpdGggcG9zc2libGUgc2FhaiBlcnJvciBiZWxvdwotICAgICovCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICAvLyBjaGFuZ2UgZnJvbSBMb2dpY2FsRVBURmFjdG9yeSB0byBDb250YWN0SW5mb0Jhc2UgLSBzaG91bGQgYmUgY2hhbmdlZCBiYWNrIHdoZW4gd2UgaGF2ZSB0aGluZ3Mgd29ya2luZwotICAgICAgICBFUFRGYWN0b3J5IGNvbnRhY3RJbmZvID0gbWVzc2FnZUluZm8uZ2V0RVBURmFjdG9yeSgpOwotICAgICAgICAvL0xvZ2ljYWxFUFRGYWN0b3J5IGNvbnRhY3RJbmZvID0gKExvZ2ljYWxFUFRGYWN0b3J5KSBtZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCk7Ci0KLSAgICAgICAgU09BUFhNTERlY29kZXIgZGVjb2RlciA9IChTT0FQWE1MRGVjb2RlcikgY29udGFjdEluZm8uZ2V0RGVjb2RlcihtZXNzYWdlSW5mbyk7Ci0KLQotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzbSA9IGRlY29kZXIudG9TT0FQTWVzc2FnZShtZXNzYWdlSW5mbyk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9pZiB0aGVyZSBpcyBhIHRyYW5zcG9ydCBlcnJvciBIVFRQIHN0YXR1cyBjb2RlIGFuZCByZXNwb25zZSBIZWFkZXJzCi0gICAgICAgICAgICAvL25lZWQgdG8gYmUgcG9wdWxhdGVkIGludG8gbWVzc2FnZUNvbnRleHQgYW5kIHJlcXVlc3RDb250ZXh0Ci0gICAgICAgICAgICAvL2J1ZyA2MzczNjg4Ci0gICAgICAgICAgICBzZXRDb250ZXh0cyhtZXNzYWdlSW5mbywgc20pOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgICAvLyBDb250ZW50IG5lZ290aWF0aW9uIGxvZ2ljCi0gICAgICAgIFN0cmluZyBjb250ZW50TmVnb3RpYXRpb25UeXBlID0gKFN0cmluZykgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSk7Ci0gICAgICAgIC8vIElmIFhNTCByZXF1ZXN0Ci0gICAgICAgIGlmIChjb250ZW50TmVnb3RpYXRpb25UeXBlID09ICJwZXNzaW1pc3RpYyIpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgoY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcC5NZXNzYWdlSW1wbCkgc20pLmlzRmFzdEluZm9zZXQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCByZXF1ZXN0Q29udGV4dCA9IChNYXApIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICAgICAgICAgICAgICAvLyBGdXJ0aGVyIHJlcXVlc3RzIHdpbGwgYmUgc2VuZCB1c2luZyBGSQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSwgIm9wdGltaXN0aWMiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBDb250ZW50IG5lZ290aWF0aW9uIGZhaWxzCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9nUmVzcG9uc2VNZXNzYWdlKHNtLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ29udGV4dCA9IGdldEluYm91bmRIYW5kbGVyQ29udGV4dChtZXNzYWdlSW5mbywgc20pOwotICAgICAgICBXU0Nvbm5lY3Rpb24gY29uID0gKFdTQ29ubmVjdGlvbikgbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICBNZXNzYWdlQ29udGV4dFV0aWwuc2V0SHR0cFN0YXR1c0NvZGUoaGFuZGxlckNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKSwKLSAgICAgICAgICAgIGNvbi5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0VXRpbC5zZXRIdHRwUmVzcG9uc2VIZWFkZXJzKGhhbmRsZXJDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCksCi0gICAgICAgICAgICBjb24uZ2V0SGVhZGVycygpKTsKLQotICAgICAgICAvL3NldCB0aGUgaGFuZGxlckNvbnRleHQgdG8gUnVudGltZUNvbnRleHQKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDb250ZXh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgaWYgKHJ0Q29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgcnRDb250ZXh0LnNldEhhbmRsZXJDb250ZXh0KGhhbmRsZXJDb250ZXh0KTsKLQotICAgICAgICBoYW5kbGVyQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpLnB1dCgKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICAvL3NldCBNRVNTQUdFX0FUVEFDSE1FTlRTIHByb3BlcnR5Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0TWVzc2FnZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICBpZiAobXNnQ3R4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vY2xlYXIgdGhlIGF0dE1hcCBvbiB0aGlzIG1lc3NhZ2VDb250ZXh0LCBpdHMgZnJvbSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dE1hcCA9IChNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4pIG1zZ0N0eHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOwotICAgICAgICAgICAgICAgIGlmIChhdHRNYXAgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYXR0TWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlsLmNvcHlJbmJvdW5kTWVzc2FnZUF0dGFjaG1lbnRzKG1zZ0N0eHQsIHNtLmdldEF0dGFjaG1lbnRzKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW1IYW5kbGVyRGVsZWdhdGUgc3lzdGVtSGFuZGxlckRlbGVnYXRlID0KLSAgICAgICAgICAgICgoY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuQmluZGluZykgZ2V0QmluZGluZyhtZXNzYWdlSW5mbykpLgotICAgICAgICAgICAgICAgIGdldFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSgpOwotICAgICAgICBpZiAoc3lzdGVtSGFuZGxlckRlbGVnYXRlICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgaGFuZGxlckNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5wdXQoCi0vLyAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3lzdGVtSGFuZGxlckRlbGVnYXRlLnByb2Nlc3NSZXNwb25zZShoYW5kbGVyQ29udGV4dC5nZXRTSERTT0FQTWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VJbmZvVXRpbC5zZXRIYW5kbGVyQ2hhaW5DYWxsZXIobWVzc2FnZUluZm8sCi0gICAgICAgICAgICAgICAgZ2V0SGFuZGxlckNoYWluQ2FsbGVyKG1lc3NhZ2VJbmZvKSk7Ci0gICAgICAgICAgICBkZWNvZGVyLmRvTXVzdFVuZGVyc3RhbmRQcm9jZXNzaW5nKHNtLCBtZXNzYWdlSW5mbywgaGFuZGxlckNvbnRleHQsIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgeyAvLyB1bnVzdWFsIHNhYWogZXJyb3IKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWUpIHsgLy8gdW51c3VhbCBzYWFqIGVycm9yCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUpIHsKLSAgICAgICAgICAgIGNsb3NlQWxsSGFuZGxlcnMoaGFuZGxlckNvbnRleHQpOwotICAgICAgICAgICAgdGhyb3cgc2ZlOwotICAgICAgICB9Ci0KLSAgICAgICAgSGFuZGxlckNoYWluQ2FsbGVyIGNhbGxlciA9IGdldEhhbmRsZXJDaGFpbkNhbGxlcihtZXNzYWdlSW5mbyk7Ci0gICAgICAgIGlmIChjYWxsZXIuaGFzSGFuZGxlcnMoKSkgewotICAgICAgICAgICAgY2FsbEhhbmRsZXJzT25SZXNwb25zZShoYW5kbGVyQ29udGV4dCk7Ci0gICAgICAgICAgICBwb3N0SGFuZGxlckluYm91bmRIb29rKG1lc3NhZ2VJbmZvLCBoYW5kbGVyQ29udGV4dCwgc20pOwotICAgICAgICB9Ci0KLSAgICAgICAgU09BUFhNTEVuY29kZXIgZW5jb2RlciA9IChTT0FQWE1MRW5jb2RlcikgY29udGFjdEluZm8uZ2V0RW5jb2RlcihtZXNzYWdlSW5mbyk7Ci0KLSAgICAgICAgSW50ZXJuYWxNZXNzYWdlIGltID0gaGFuZGxlckNvbnRleHQuZ2V0SW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRV9NT0RFKSA9PSBTZXJ2aWNlLk1vZGUuTUVTU0FHRSkKLSAgICAgICAgICAgIGltID0gbnVsbDsKLSAgICAgICAgaWYgKGltID09IG51bGwpIHsKLSAgICAgICAgICAgIGltID0gZGVjb2Rlci50b0ludGVybmFsTWVzc2FnZShzbSwgbWVzc2FnZUluZm8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW0gPSBkZWNvZGVyLnRvSW50ZXJuYWxNZXNzYWdlKHNtLCBpbSwgbWVzc2FnZUluZm8pOwotICAgICAgICB9Ci0gICAgICAgIGRlY29kZXIudG9NZXNzYWdlSW5mbyhpbSwgbWVzc2FnZUluZm8pOwotICAgICAgICB1cGRhdGVSZXNwb25zZUNvbnRleHQobWVzc2FnZUluZm8sIGhhbmRsZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFX01PREUpID09IFNlcnZpY2UuTW9kZS5NRVNTQUdFKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShzbSk7Ci0gICAgICAgICAgICBwb3N0UmVjZWl2ZUFuZERlY29kZUhvb2sobWVzc2FnZUluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENvbnRleHRzKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBTT0FQTWVzc2FnZSBzbSkgewotICAgICAgICBXU0Nvbm5lY3Rpb24gY29uID0gKFdTQ29ubmVjdGlvbikgbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICBTT0FQSGFuZGxlckNvbnRleHQgaGFuZGxlckNvbnRleHQgPSBnZXRJbmJvdW5kSGFuZGxlckNvbnRleHQobWVzc2FnZUluZm8sIHNtKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlsLnNldEh0dHBTdGF0dXNDb2RlKGhhbmRsZXJDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCksCi0gICAgICAgICAgICBjb24uZ2V0U3RhdHVzKCkpOwotICAgICAgICB1cGRhdGVSZXNwb25zZUNvbnRleHQobWVzc2FnZUluZm8sIGhhbmRsZXJDb250ZXh0KTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgU09BUEhhbmRsZXJDb250ZXh0IGdldEluYm91bmRIYW5kbGVyQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgU09BUE1lc3NhZ2Ugc20pIHsKLSAgICAgICAgU09BUEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDb250ZXh0ID0gKFNPQVBIYW5kbGVyQ29udGV4dCkgbWVzc2FnZUluZm8KLSAgICAgICAgICAgIC5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0hBTkRMRVJfQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgIGlmIChoYW5kbGVyQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyQ29udGV4dC5zZXRTT0FQTWVzc2FnZShzbSk7Ci0gICAgICAgICAgICBoYW5kbGVyQ29udGV4dC5zZXRJbnRlcm5hbE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaGFuZGxlckNvbnRleHQgPSBuZXcgU09BUEhhbmRsZXJDb250ZXh0KG1lc3NhZ2VJbmZvLCBudWxsLCBzbSk7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHNlbmRpbmcgb2YgYW4gYXN5bmNocm9ub3VzIHJlcXVlc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NlbmRBc3luYyhmaW5hbCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICB0cnkgeyAvLyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0Ci0gICAgICAgICAgICBwcmVTZW5kSG9vayhtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IGRvU2VuZChtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBwb3N0U2VuZEhvb2sobWVzc2FnZUluZm8pOwotCi0gICAgICAgICAgICAvL3Bhc3MgYSBjb3B5IG9mIE1lc3NhZ2VJbmZvIHRvIHRoZSBmdXR1cmUgdGFzayxzbyB0aGF0IG5vIGNvbmZsaWN0cwotICAgICAgICAgICAgLy9kdWUgdG8gdGhyZWFkaW5nIGhhcHBlbnMKLSAgICAgICAgICAgIFJlc3BvbnNlIHIgPSBzZW5kQXN5bmNSZWNlaXZlKE1lc3NhZ2VJbmZvQmFzZS5jb3B5KG1lc3NhZ2VJbmZvKSwgc20pOwotICAgICAgICAgICAgaWYgKGV4ZWN1dG9yU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXhlY3V0b3JTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChNQVhfVEhSRUFEX1BPT0xfU0laRSwgbmV3IERhZW1vblRocmVhZEZhY3RvcnkoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFzeW5jSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IChBc3luY0hhbmRsZXJTZXJ2aWNlKSBtZXNzYWdlSW5mbwotICAgICAgICAgICAgICAgIC5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NMSUVOVF9BU1lOQ19IQU5ETEVSKTsKLSAgICAgICAgICAgIFdTRnV0dXJlIHdzZnV0dXJlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2Z1dHVyZSA9IHNlcnZpY2Uuc2V0dXBBc3luY0NhbGxiYWNrKHIpOwotICAgICAgICAgICAgICAgICgoUmVzcG9uc2VJbXBsKSByKS5zZXRVSUQoc2VydmljZS5nZXRVSUQoKSk7Ci0gICAgICAgICAgICAgICAgKChSZXNwb25zZUltcGwpIHIpLnNldEhhbmRsZXJTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleGVjdXRvclNlcnZpY2UuZXhlY3V0ZSgoRnV0dXJlVGFzaykgcik7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHdzZnV0dXJlKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3JjaGVzdHJhdGVzIHRoZSByZWNlaXZpbmcgb2YgYW4gYXN5bmNocm9ub3VzIHJlc3BvbnNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlc3BvbnNlPE9iamVjdD4gc2VuZEFzeW5jUmVjZWl2ZShmaW5hbCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgZmluYWwgU09BUE1lc3NhZ2Ugc20pIHsKLQotICAgICAgICBmaW5hbCBBc3luY0hhbmRsZXJTZXJ2aWNlIGhhbmRsZXIgPSAoQXN5bmNIYW5kbGVyU2VydmljZSkgbWVzc2FnZUluZm8KLSAgICAgICAgICAgIC5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NMSUVOVF9BU1lOQ19IQU5ETEVSKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBjYWxsYmFjayA9IChtZXNzYWdlSW5mby5nZXRNRVAoKSA9PSBNZXNzYWdlU3RydWN0LkFTWU5DX0NBTExCQUNLX01FUCkgPyB0cnVlCi0gICAgICAgICAgICA6IGZhbHNlOwotICAgICAgICBpZiAoY2FsbGJhY2sgJiYgKGhhbmRsZXIgPT0gbnVsbCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiQXN5bmNocm9ub3VzIGNhbGxiYWNrIGludm9jYXRpb24sIGJ1dCBubyBoYW5kbGVyIC0gQXN5bmNIYW5kbGVyIHJlcXVpcmVkIik7Ci0KLSAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IG5ldyBSZXNwb25zZUltcGw8T2JqZWN0PihuZXcgQ2FsbGFibGU8T2JqZWN0PigpIHsKLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IGNvbm5lY3Rpb24gYW5kIGRvIGh0dHAuaW52b2tlKCkKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBXU0Nvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChXU0Nvbm5lY3Rpb24pIG1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdE1lc3NhZ2Uoc20sIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUENvbm5lY3Rpb25VdGlsLnNlbmRSZXNwb25zZShjb25uZWN0aW9uLCBzbSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UodCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LlVOQ0hFQ0tFRF9FWENFUFRJT05fUkVTUE9OU0UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyByZWNlaXZlIHJlc3BvbnNlCi0gICAgICAgICAgICAgICAgcHJlUmVjZWl2ZUhvb2sobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY2VpdmUobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvc3RSZWNlaXZlSG9vayhtZXNzYWdlSW5mbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUluZm8uZ2V0UmVzcG9uc2UoKSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEV4Y2VwdGlvbikgbWVzc2FnZUluZm8uZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZUluZm8uZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1lc3NhZ2VJbmZvLnNldE1ldGFEYXRhKEpBWFdTX0NMSUVOVF9BU1lOQ19SRVNQT05TRV9DT05URVhULCByKTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxsSGFuZGxlcnNPblJlcXVlc3QoU09BUEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIgY2FsbGVyID0gZ2V0SGFuZGxlckNoYWluQ2FsbGVyKGhhbmRsZXJDb250ZXh0LmdldE1lc3NhZ2VJbmZvKCkpOwotICAgICAgICAgICAgYm9vbGVhbiByZXNwb25zZUV4cGVjdGVkID0gKGhhbmRsZXJDb250ZXh0LmdldE1lc3NhZ2VJbmZvKCkuZ2V0TUVQKCkgIT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCk7Ci0gICAgICAgICAgICByZXR1cm4gY2FsbGVyLmNhbGxIYW5kbGVycyhEaXJlY3Rpb24uT1VUQk9VTkQsIFJlcXVlc3RPclJlc3BvbnNlLlJFUVVFU1QsIGhhbmRsZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIHJlc3BvbnNlRXhwZWN0ZWQpOwotICAgICAgICB9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBwZSkgewotICAgICAgICAgICAgaWYgKE1lc3NhZ2VDb250ZXh0VXRpbC5pZ25vcmVGYXVsdEluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpKSkgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBmYXVsdCBpbiB0aGlzIGNhc2UgYW5kIHVzZSBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgcGU7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7Ci0gICAgICAgICAgICB0aHJvdyB3c2U7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZXJzIGFyZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvIHRocm93IFJFCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihyZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFVzZXIncyBoYW5kbGVyIGNhbiB0aHJvdyBSdW50aW1lRXhjZXB0aW9ucwotICAgICAqIChlLmcuLCBhIFByb3RvY29sRXhjZXB0aW9uKS4KLSAgICAgKiBOZWVkIHRvIHdyYXAgYW55IFJ1bnRpbWVFeGNlcHRpb24gKG90aGVyIHRoYW4gV2ViU2VydmljZUV4Y2VwdGlvbikgaW4KLSAgICAgKiBXZWJTZXJ2aWNlRXhjZXB0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGNhbGxIYW5kbGVyc09uUmVzcG9uc2UoU09BUEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDb250ZXh0KSB7Ci0gICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBjYWxsZXIgPQotICAgICAgICAgICAgZ2V0SGFuZGxlckNoYWluQ2FsbGVyKGhhbmRsZXJDb250ZXh0LmdldE1lc3NhZ2VJbmZvKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGh0dHBSZXNwb25zZUNvZGUgPSAoSW50ZWdlcikgaGFuZGxlckNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSk7Ci0gICAgICAgICAgICBpZihodHRwUmVzcG9uc2VDb2RlICE9IDIwMCAmJiBodHRwUmVzcG9uc2VDb2RlICE9IDIwMikgewotICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgaXQgaXMgYSBmYXVsdCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc20gPSBoYW5kbGVyQ29udGV4dC5nZXRTT0FQTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmKChzbSAhPSBudWxsKSAmJiBzbS5nZXRTT0FQQm9keSgpLmhhc0ZhdWx0KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsZXIuY2FsbEhhbmRsZUZhdWx0T25DbGllbnQoaGFuZGxlckNvbnRleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY2FsbGVyLmNhbGxIYW5kbGVycyhEaXJlY3Rpb24uSU5CT1VORCwKLSAgICAgICAgICAgICAgICBSZXF1ZXN0T3JSZXNwb25zZS5SRVNQT05TRSwgaGFuZGxlckNvbnRleHQsIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oc2UpOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgdGhyb3cgd3NlOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAvLyBoYW5kbGVycyBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0byB0aHJvdyBSRQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24ocmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJpbmRpbmcgZ2V0QmluZGluZyhNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBDb250ZXh0TWFwIGNvbnRleHQgPSAoQ29udGV4dE1hcCkgKChNZXNzYWdlSW5mb0Jhc2UpIG1lc3NhZ2VJbmZvKQotICAgICAgICAgICAgLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIGNvbnRleHQKLSAgICAgICAgICAgIC5nZXQoSkFYV1NfQ0xJRU5UX0hBTkRMRV9QUk9QRVJUWSk7Ci0gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEhhbmRsZXJDaGFpbkNhbGxlciBnZXRIYW5kbGVyQ2hhaW5DYWxsZXIoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgQmluZGluZ0ltcGwgYmluZGluZyA9IChCaW5kaW5nSW1wbCkgZ2V0QmluZGluZyhtZXNzYWdlSW5mbyk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nLmdldEhhbmRsZXJDaGFpbkNhbGxlcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTT0FQTWVzc2FnZShPYmplY3QgdmFsdWUsIFNPQVBNZXNzYWdlIHNtKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBTT0FQQm9keSBzYiA9IHNtLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICAgICAgc2IucmVtb3ZlQ29udGVudHMoKTsKLSAgICAgICAgICAgICAgICBYbWxVdGlsLm5ld1RyYW5zZm9ybWVyKCkudHJhbnNmb3JtKChTb3VyY2UpIHZhbHVlLCBuZXcgRE9NUmVzdWx0KHNiKSk7Ci0gICAgICAgICAgICAgICAgc20uc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBjb250ZXh0LmdldFNPQVBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlSW5mby5zZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0hBTkRMRVJfQ09OVEVYVF9QUk9QRVJUWSwgY29udGV4dCk7Ci0gICAgICAgIFJlcXVlc3RDb250ZXh0IGN0eHQgPSAoUmVxdWVzdENvbnRleHQpIG1lc3NhZ2VJbmZvCi0gICAgICAgICAgICAuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGN0eHQuY29weSgpLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY3R4dC5nZXQobmFtZSk7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpCi0gICAgICAgICAgICAuZ2V0KEpBWFdTX0NMSUVOVF9IQU5ETEVfUFJPUEVSVFkpOwotCi0gICAgICAgIFFOYW1lIHBvcnRUeXBlUU5hbWUgPSBudWxsOwotICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKFByb3h5LmlzUHJveHlDbGFzcyhwcm92aWRlci5nZXRDbGFzcygpKSkgewotCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRJRkludm9jYXRpb25IYW5kbGVyIGludm9jYXRpb25IYW5kbGVyID0gKEVuZHBvaW50SUZJbnZvY2F0aW9uSGFuZGxlcikgUHJveHkuZ2V0SW52b2NhdGlvbkhhbmRsZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIEVuZHBvaW50SUZDb250ZXh0IGVuZHBvaW50Q29udGV4dCA9IGludm9jYXRpb25IYW5kbGVyLmdldEVuZHBvaW50Q29udGV4dCgpOwotICAgICAgICAgICAgICAgIHBvcnRUeXBlUU5hbWUgPSBpbnZvY2F0aW9uSGFuZGxlci5nZXRXU0RMUG9ydFR5cGVRTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQucHV0KE1lc3NhZ2VDb250ZXh0LldTRExfU0VSVklDRSwgaW52b2NhdGlvbkhhbmRsZXIuZ2V0U2VydmljZVFOYW1lKCkpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5XU0RMX1BPUlQsIGVuZHBvaW50Q29udGV4dC5nZXRQb3J0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QmluZGluZ0lkKGVuZHBvaW50Q29udGV4dC5nZXRCaW5kaW5nSUQoKS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q29udGV4dCA9IChSdW50aW1lQ29udGV4dCkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19SVU5USU1FX0NPTlRFWFQpOwotICAgICAgICAgICAgICAgIGlmIChydENvbnRleHQgIT0gbnVsbCkgeyAgIC8vc2hvdWxkIG5ldmVyIGJlCi0gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVNb2RlbCBtb2RlbCA9IHJ0Q29udGV4dC5nZXRNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICBKYXZhTWV0aG9kIGphdmFNZXRob2QgPSBtb2RlbC5nZXRKYXZhTWV0aG9kKG1lc3NhZ2VJbmZvLmdldE1ldGhvZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wbmFtZSA9IGphdmFNZXRob2QuZ2V0T3BlcmF0aW9uTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydFR5cGVRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG5zID0gcG9ydFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5XU0RMX09QRVJBVElPTiwgbmV3IFFOYW1lKHRucyxvcG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL3NldCBoYW5kbGVyQ29udGV4dAotICAgICAgICAgICAgICAgIHJ0Q29udGV4dC5zZXRIYW5kbGVyQ29udGV4dChjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vbm93IGdldCB2YWx1ZSBmb3IgQ29udGVudE5lZ290aWF0aW9uCi0gICAgICAgIE9iamVjdCBwcm9wID0gbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSk7Ci0gICAgICAgIGlmIChwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZLCBwcm9wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc3BvbnNlQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gY29udGV4dC5nZXRTT0FQTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgUmVxdWVzdENvbnRleHQgcmMgPSAoUmVxdWVzdENvbnRleHQpIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSByYy5nZXQoSkFYV1NfQ0xJRU5UX0hBTkRMRV9QUk9QRVJUWSk7Ci0gICAgICAgIFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQgPSBuZXcgUmVzcG9uc2VDb250ZXh0KHByb3ZpZGVyKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG1lc3NhZ2VDb250ZXh0LmtleVNldCgpKSB7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5TY29wZSBzY29wZSA9IG1lc3NhZ2VDb250ZXh0LmdldFNjb3BlKG5hbWUpOwotICAgICAgICAgICAgaWYgKE1lc3NhZ2VDb250ZXh0LlNjb3BlLkFQUExJQ0FUSU9OID09IHNjb3BlKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbWVzc2FnZUNvbnRleHQuZ2V0KG5hbWUpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJlc3BvbnNlSW1wbCBhc3luY1Jlc3BvbnNlID0gKFJlc3BvbnNlSW1wbCkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoCi0gICAgICAgICAgICBKQVhXU19DTElFTlRfQVNZTkNfUkVTUE9OU0VfQ09OVEVYVCk7Ci0gICAgICAgIGlmIChhc3luY1Jlc3BvbnNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0UmVzcG9uc2VDb250ZXh0KHJlc3BvbnNlQ29udGV4dC5jb3B5KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0TWV0YURhdGEoSkFYV1NfUkVTUE9OU0VfQ09OVEVYVF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuY29weSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gaW5kaWNhdGVzIGFzeW5jaHJvbm91cywgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FzeW5jKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIGlmICgobWVzc2FnZUluZm8uZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5BU1lOQ19QT0xMX01FUCkKLSAgICAgICAgICAgIHx8IChtZXNzYWdlSW5mby5nZXRNRVAoKSA9PSBNZXNzYWdlU3RydWN0LkFTWU5DX0NBTExCQUNLX01FUCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJlU2VuZEhvb2soTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJlUmVjZWl2ZUhvb2soTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcG9zdFNlbmRIb29rKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlSW5mby5nZXRSZXNwb25zZVR5cGUoKSAhPSBNZXNzYWdlU3RydWN0Lk5PUk1BTF9SRVNQT05TRSkgewotICAgICAgICAgICAgcG9zdFJlY2VpdmVIb29rKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIHRocm93IChXZWJTZXJ2aWNlRXhjZXB0aW9uKSBtZXNzYWdlSW5mby5nZXRSZXNwb25zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvc3RSZWNlaXZlQW5kRGVjb2RlSG9vayhNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBEaXNwYXRjaENvbnRleHQgZGlzcGF0Y2hDb250ZXh0ID0gKERpc3BhdGNoQ29udGV4dCkgbWVzc2FnZUluZm8KLSAgICAgICAgICAgIC5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkRJU1BBVENIX0NPTlRFWFQpOwotICAgICAgICBpZiAoKG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKERpc3BhdGNoQ29udGV4dC5ESVNQQVRDSF9NRVNTQUdFX01PREUpID09IFNlcnZpY2UuTW9kZS5NRVNTQUdFKQotICAgICAgICAgICAgJiYgKGRpc3BhdGNoQ29udGV4dC5nZXRQcm9wZXJ0eShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRSkgPT0gRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLlNPVVJDRV9NRVNTQUdFKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IHJlc3BvbnNlID0gbWVzc2FnZUluZm8uZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFNPQVBNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgU09BUFBhcnQgcGFydCA9ICgoU09BUE1lc3NhZ2UpIHJlc3BvbnNlKS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHBhcnQuZ2V0Q29udGVudCgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvc3RSZWNlaXZlSG9vayhNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICAvLyBwb3N0UmVjZWl2ZUhvb2sgZXhhaW1pbmVzIHRoZSByZXN1bHQgZm9yIGFuIGV4Y2VwdGlvbgotICAgICAgICAvLyBvciBTT0FQRmF1bHRJbmZvIC0gaXQgd2lsbCBzZXQgYXBwcm9wcmlhdGUKLSAgICAgICAgLy8gYXN5bmNocm9ub3VzIGV4Y2VwdGlvbnMKLSAgICAgICAgT2JqZWN0IHJlc3BvbnNlID0gbWVzc2FnZUluZm8uZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgc3dpdGNoIChtZXNzYWdlSW5mby5nZXRSZXNwb25zZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBNZXNzYWdlU3RydWN0Lk5PUk1BTF9SRVNQT05TRToKLSAgICAgICAgICAgICAgICAvLyBub3Qgc3VyZSB3aGVyZSB0aGlzIGJlbG9uZ3MgeWV0IC0gYnV0IGZvciBub3ctCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEluZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0SW5mbyBzb2FwRmF1bHRJbmZvID0gKFNPQVBGYXVsdEluZm8pIHJlc3BvbnNlOwotICAgICAgICAgICAgICAgICAgICBKQVhCRXhjZXB0aW9uIGpiZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb2FwRmF1bHRJbmZvLmdldFN0cmluZygpLmNvbnRhaW5zKCJqYXZheC54bWwuYmluZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYmUgPSBuZXcgSkFYQkV4Y2VwdGlvbihzb2FwRmF1bHRJbmZvLmdldFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIEkgbmVlZCB0byBwdXQgdGhpcyBpbiBhIGpheHdzIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSBuZXcgU09BUEZhdWx0RXhjZXB0aW9uKHNvYXBGYXVsdEluZm8uZ2V0U09BUEZhdWx0KCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoamJlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZmUuaW5pdENhdXNlKGpiZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKChTT0FQRmF1bHRFeGNlcHRpb24pIHNmZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZSgoU09BUEZhdWx0RXhjZXB0aW9uKSByZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gamV4ID0gKFJ1bnRpbWVFeGNlcHRpb24pIHJlc3BvbnNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoamV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSW50ZXJuYWxNZXNzYWdlIHByZUhhbmRsZXJPdXRib3VuZEhvb2soU09BUE1lc3NhZ2Ugc20sIEludGVybmFsTWVzc2FnZSBpbSkgewotICAgICAgICBpZiAoKHNtICE9IG51bGwpICYmIChpbSAhPSBudWxsKSkKLSAgICAgICAgICAgIGltID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIGltOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3N0SGFuZGxlck91dGJvdW5kSG9vayhNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgU09BUEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDb250ZXh0LCBTT0FQTWVzc2FnZSBzbSkgewotICAgICAgICBpZiAobWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfTU9ERSkgPT0gU2VydmljZS5Nb2RlLk1FU1NBR0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEludGVybmFsTWVzc2FnZSBpbSA9IGhhbmRsZXJDb250ZXh0LmdldEludGVybmFsTWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKGltICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpbS5nZXRCb2R5KCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTT0FQTWVzc2FnZSh2YWx1ZSwgc20pOwotICAgICAgICAgICAgICAgIGltID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNtLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3N0SGFuZGxlckluYm91bmRIb29rKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBTT0FQSGFuZGxlckNvbnRleHQgaGFuZGxlckNvbnRleHQsIFNPQVBNZXNzYWdlIHNtKSB7Ci0gICAgICAgIGlmICgobWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfTU9ERSkgPT0gU2VydmljZS5Nb2RlLk1FU1NBR0UpIHx8Ci0gICAgICAgICAgICAobWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoRGlzcGF0Y2hDb250ZXh0LkRJU1BBVENIX01FU1NBR0VfTU9ERSkgPT0gU2VydmljZS5Nb2RlLlBBWUxPQUQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgaW0gPSBoYW5kbGVyQ29udGV4dC5nZXRJbnRlcm5hbE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmIChpbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaW0uZ2V0Qm9keSgpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU09BUE1lc3NhZ2UodmFsdWUsIHNtKTsKLSAgICAgICAgICAgICAgICBpbSA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzbS5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZUFsbEhhbmRsZXJzKFNPQVBIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBjYWxsZXIgPSBnZXRIYW5kbGVyQ2hhaW5DYWxsZXIoY29udGV4dC5nZXRNZXNzYWdlSW5mbygpKTsKLSAgICAgICAgaWYgKGNhbGxlciAhPSBudWxsICYmIGNhbGxlci5oYXNIYW5kbGVycygpKSB7Ci0gICAgICAgICAgICBjYWxsZXIuZm9yY2VDbG9zZUhhbmRsZXJzT25DbGllbnQoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgU09BUE1lc3NhZ2UgKDEuMSBvciAxLjIgdXNpbmcgU0FBSiBhcGkpLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQmluZGluZ0lkIGFzc29jaWF0ZWQgd2l0aCBtZXNzYWdlSW5mbwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmluZGluZ0lkKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIFNPQVBFbmNvZGVyIGVuY29kZXIgPSAoU09BUEVuY29kZXIpIG1lc3NhZ2VJbmZvLmdldEVuY29kZXIoKTsKLSAgICAgICAgaWYgKGVuY29kZXIgaW5zdGFuY2VvZiBTT0FQMTJYTUxFbmNvZGVyKQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2dzIHRoZSBTT0FQIHJlcXVlc3QgbWVzc2FnZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ1JlcXVlc3RNZXNzYWdlKFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlLCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTT0FQRXhjZXB0aW9uIHsKLQotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gKChXU0Nvbm5lY3Rpb24pIG1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKSkuZ2V0RGVidWcoKTsKLQotICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gIioqKioqKioqKioqKioqKioqKlxuUmVxdWVzdFxuIjsKLSAgICAgICAgICAgIG91dC53cml0ZShzLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0KLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRNaW1lSGVhZGVycygpLmdldEFsbEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7Ci0gICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgTWltZUhlYWRlciBoZWFkZXIgPSAoTWltZUhlYWRlcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcyA9IGhlYWRlci5nZXROYW1lKCkgKyAiOiAiICsgaGVhZGVyLmdldFZhbHVlKCkgKyAiXG4iOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShzLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICBzb2FwTWVzc2FnZS53cml0ZVRvKG91dCk7Ci0gICAgICAgICAgICBzID0gIlxuIjsKLSAgICAgICAgICAgIG91dC53cml0ZShzLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2dzIHRoZSBTT0FQIHJlc3BvbnNlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dSZXNwb25zZU1lc3NhZ2UoU09BUE1lc3NhZ2UgcmVzcG9uc2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNPQVBFeGNlcHRpb24gewotCi0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSAoKFdTQ29ubmVjdGlvbikgbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpKS5nZXREZWJ1ZygpOwotICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gIlJlc3BvbnNlXG4iOwotICAgICAgICAgICAgb3V0LndyaXRlKHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBzID0KLSAgICAgICAgICAgICAgICAiSHR0cCBTdGF0dXMgQ29kZTogIgotICAgICAgICAgICAgICAgICAgICArICgoV1NDb25uZWN0aW9uKSBtZXNzYWdlSW5mby5nZXRDb25uZWN0aW9uKCkpLmdldFN0YXR1cygpCi0gICAgICAgICAgICAgICAgICAgICsgIlxuXG4iOwotICAgICAgICAgICAgb3V0LndyaXRlKHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE1pbWVIZWFkZXJzKCkuZ2V0QWxsSGVhZGVycygpOwotICAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBNaW1lSGVhZGVyIGhlYWRlciA9IChNaW1lSGVhZGVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzID0gaGVhZGVyLmdldE5hbWUoKSArICI6ICIgKyBoZWFkZXIuZ2V0VmFsdWUoKSArICJcbiI7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlVG8ob3V0KTsKLSAgICAgICAgICAgIHMgPSAiKioqKioqKioqKioqKioqKioqXG5cbiI7Ci0gICAgICAgICAgICBvdXQud3JpdGUocy5nZXRCeXRlcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIERhZW1vblRocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKLSAgICAgICAgcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgewotICAgICAgICAgICAgVGhyZWFkIGRhZW1vblRocmVhZCA9IG5ldyBUaHJlYWQocik7Ci0gICAgICAgICAgICBkYWVtb25UaHJlYWQuc2V0RGFlbW9uKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICByZXR1cm4gZGFlbW9uVGhyZWFkOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wvc29hcC9zZXJ2ZXIvUHJvdmlkZXJTT0FQTUQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3NvYXAvc2VydmVyL1Byb3ZpZGVyU09BUE1ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZGIwNzIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wvc29hcC9zZXJ2ZXIvUHJvdmlkZXJTT0FQTUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC5zb2FwLnNlcnZlcjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuaW50ZXJuYWwuSW50ZXJuYWxFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuU09BUEhhbmRsZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSW50ZXJuYWxNZXNzYWdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUEVQVEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQRW5jb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVFbmRwb2ludEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlNlcnZlclJ0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU09BUFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5GYXN0SW5mb3NldFV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLkpBWFdTUHJvcGVydGllcy4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5wcm92aWRlci5Qcm92aWRlck1vZGVsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5wcm92aWRlci5Qcm92aWRlclBlcHRUaWU7Ci0KLXB1YmxpYyBjbGFzcyBQcm92aWRlclNPQVBNRCBleHRlbmRzIFNPQVBNZXNzYWdlRGlzcGF0Y2hlciB7Ci0KLSAgICAvKgotICAgICAqIEZpbGwgdGhlIHBhcmFtZXRlcnMsIG1ldGhvZCBpbiBNZXNzYWdlSW5mbyBmb3IgUHJvdmlkZXIgaW50ZXJmYWNlLgotICAgICAqIGludm9rZShTb3VyY2UsIEhhbmRsZXJDb250ZXh0KSB0byBPYmplY3RbXQotICAgICAqIGludm9rZShTT0FQTWVzc2FnZSwgSGFuZGxlckNvbnRleHQpIHRvIE9iamVjdFtdCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdG9NZXNzYWdlSW5mbyhNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgU09BUEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0W10gZGF0YSA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvID0gcnRDdHh0LmdldFJ1bnRpbWVFbmRwb2ludEluZm8oKTsKLSAgICAgICAgQ2xhc3MgcHJvdmlkZXJDbGFzcyA9IGVuZHBvaW50SW5mby5nZXRJbXBsZW1lbnRvckNsYXNzKCk7Ci0gICAgICAgIFByb3ZpZGVyTW9kZWwgbW9kZWwgPSBlbmRwb2ludEluZm8uZ2V0UHJvdmlkZXJNb2RlbCgpOwotICAgICAgICBib29sZWFuIGlzU291cmNlID0gbW9kZWwuaXNTb3VyY2UoKTsKLSAgICAgICAgU2VydmljZS5Nb2RlIG1vZGUgPSBtb2RlbC5nZXRTZXJ2aWNlTW9kZSgpOwotCi0gICAgICAgIGlmIChtb2RlID09IFNlcnZpY2UuTW9kZS5QQVlMT0FEKSB7Ci0gICAgICAgICAgICBpZiAoaXNTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBkYXRhWzBdID0gbmV3IExvZ2ljYWxNZXNzYWdlSW1wbChjb250ZXh0KS5nZXRQYXlsb2FkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBlbHNlIGRvZXNuJ3QgaGFwcGVuIGFuZCBpdCBpcyBjaGVja2VkIHdoaWxlIGNyZWF0aW5nIHRoZSBtb2RlbAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZSA9IGNvbnRleHQuZ2V0SW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGNvbnRleHQuZ2V0U09BUE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNPQVBNZXNzYWdlJ3MgYm9keSBpcyByZXBsYWNlZCBieSBJbnRlcm5hbE1lc3NhZ2UncyBCb2R5QmxvY2sKLSAgICAgICAgICAgICAgICAgICAgU09BUEVQVEZhY3RvcnkgZXB0ZiA9IChTT0FQRVBURmFjdG9yeSltZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbmNvZGVyIGVuY29kZXIgPSBlcHRmLmdldFNPQVBFbmNvZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlID0gZW5jb2Rlci50b1NPQVBNZXNzYWdlKGludGVybmFsTWVzc2FnZSwgc29hcE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaXNTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gR2V0IFNPQVBNZXNzYWdlJ3MgU09BUFBhcnQgYXMgU291cmNlCi0gICAgICAgICAgICAgICAgICAgIGRhdGFbMF09IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSBzb2FwTWVzc2FnZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2VUeXBlKE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZUluZm8uc2V0RGF0YShkYXRhKTsKLSAgICAgICAgbWVzc2FnZUluZm8uc2V0TWV0aG9kKFByb3ZpZGVyUGVwdFRpZS5pbnZva2VfTWV0aG9kKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1lc3NhZ2VJbmZvIGNvbnRhaW5zIHRoZSBlbmRwb2ludCBpbnZvY2F0aW9uIHJlc3VsdHMuIElmIHRoZSBlbmRwb2ludAotICAgICAqIHJldHVybnMgYSBTT0FQTWVzc2FnZSwganVzdCBzZXQgdGhlIG9iamVjdCBpbiBIYW5kbGVyQ29udGV4dC4gSWYgdGhlCi0gICAgICogZW5kcG9pbnQgcmV0dXJucyBhIFNvdXJjZSBpbiBNb2RlLk1FU1NBR0UsIGl0IGlzIGNvbnZlcnRlZCB0byBTT0FQTWVzc2FnZQotICAgICAqIGFuZCBzZXQgaW4gSGFuZGxlckNvbnRleHQuIElmIHRoZSBlbmRwb2ludCByZXR1cm5zIGEgU291cmNlIGluCi0gICAgICogTW9kZS5QQVlMT0FELCBpdCBpcyBzZXQgaW4gSW50ZXJuYWxNZXNzYWdlLCBhbmQgSW50ZXJuYWxNZXNzYWdlIGlzIHNldAotICAgICAqIGluIEhhbmRsZXJDb250ZXh0Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UmVzcG9uc2VJbkNvbnRleHQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgICAgICBTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBtZXNzYWdlSW5mby5nZXRSZXNwb25zZSgpOwotICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbyA9IHJ0Q3R4dC5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCk7Ci0gICAgICAgIENsYXNzIHByb3ZpZGVyQ2xhc3MgPSBlbmRwb2ludEluZm8uZ2V0SW1wbGVtZW50b3JDbGFzcygpOwotICAgICAgICBQcm92aWRlck1vZGVsIG1vZGVsID0gZW5kcG9pbnRJbmZvLmdldFByb3ZpZGVyTW9kZWwoKTsKLSAgICAgICAgU2VydmljZS5Nb2RlIG1vZGUgPSBtb2RlbC5nZXRTZXJ2aWNlTW9kZSgpOwotCi0gICAgICAgIGlmIChtZXNzYWdlSW5mby5nZXRSZXNwb25zZVR5cGUoKSA9PSBNZXNzYWdlSW5mby5OT1JNQUxfUkVTUE9OU0UgJiYKLSAgICAgICAgICAgICAgICBtb2RlID09IFNlcnZpY2UuTW9kZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU09BUE1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZSA9IChTT0FQTWVzc2FnZSlvYmo7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHB1dCBTb3VyY2UgaW50byBTT0FQUGFydCBvZiBTT0FQTWVzc2FnZQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSAoU291cmNlKW9iajsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9ICgoQmluZGluZ0ltcGwpZW5kcG9pbnRJbmZvLmdldEJpbmRpbmcoKSkuZ2V0QmluZGluZ0lkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlID0gU09BUFV0aWwuY3JlYXRlTWVzc2FnZShiaW5kaW5nSWQpOwotICAgICAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLnNldENvbnRlbnQoc291cmNlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNvYXBlbmNvZGVyLmVyciIsIG5ldyBPYmplY3RbXXtlfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFbnN1cmUgbWVzc2FnZSBpcyBlbmNvZGVkIGFjY29yZGluZyB0byBjb25uZWcKLSAgICAgICAgICAgIEZhc3RJbmZvc2V0VXRpbC5lbnN1cmVDb3JyZWN0RW5jb2RpbmcobWVzc2FnZUluZm8sIHNvYXBNZXNzYWdlKTsKLQotICAgICAgICAgICAgY29udGV4dC5zZXRTT0FQTWVzc2FnZShzb2FwTWVzc2FnZSk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldEludGVybmFsTWVzc2FnZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNldCBTb3VyY2Ugb3IgYW55IEV4Y2VwdGlvbiBpbiBJbnRlcm5hbE1lc3NhZ2UncyBCb2R5QmxvY2sKLSAgICAgICAgICAgIFNPQVBFUFRGYWN0b3J5IGVwdGYgPSAoU09BUEVQVEZhY3RvcnkpbWVzc2FnZUluZm8uZ2V0RVBURmFjdG9yeSgpOwotICAgICAgICAgICAgSW50ZXJuYWxFbmNvZGVyIGluZSA9IGVwdGYuZ2V0SW50ZXJuYWxFbmNvZGVyKCk7Ci0gICAgICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlID0KLSAgICAgICAgICAgICAgICAoSW50ZXJuYWxNZXNzYWdlKWluZS50b0ludGVybmFsTWVzc2FnZShtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAvLyBzZXQgaGFuZGxlciBjb250ZXh0Ci0gICAgICAgICAgICBjb250ZXh0LnNldEludGVybmFsTWVzc2FnZShpbnRlcm5hbE1lc3NhZ2UpOwotICAgICAgICAgICAgY29udGV4dC5zZXRTT0FQTWVzc2FnZShudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wvc29hcC9zZXJ2ZXIvU09BUE1lc3NhZ2VEaXNwYXRjaGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC9zb2FwL3NlcnZlci9TT0FQTWVzc2FnZURpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViNmI5Yy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC9zb2FwL3NlcnZlci9TT0FQTWVzc2FnZURpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wcm90b2NvbC5zb2FwLnNlcnZlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uLlRhcmdldEZpbmRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5UaWU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFUFRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5JbnRlcm5hbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5tZXNzYWdlLlNPQVBGYXVsdEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXIuRGlyZWN0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNoYWluQ2FsbGVyLlJlcXVlc3RPclJlc3BvbnNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHRVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuU09BUEhhbmRsZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUFJ1bnRpbWVNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuQXBwTXNnQ29udGV4dEltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lRW5kcG9pbnRJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TZXJ2ZXJSdEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5JbnZva2VyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLlN5c3RlbUhhbmRsZXJEZWxlZ2F0ZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5XU0Nvbm5lY3Rpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5GYXN0SW5mb3NldFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5NZXNzYWdlSW5mb1V0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5TT0FQQ29ubmVjdGlvblV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TY29wZTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBzdGF0aWMgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWTsKLQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlRGlzcGF0Y2hlciBpbXBsZW1lbnRzIE1lc3NhZ2VEaXNwYXRjaGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IHsKLSAgICAgICAgICAgICJ0ZXh0L3htbCIsICJhcHBsaWNhdGlvbi9zb2FwK3htbCIsICJhcHBsaWNhdGlvbi94b3AreG1sIiwKLSAgICAgICAgICAgICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIsICJhcHBsaWNhdGlvbi9zb2FwK2Zhc3RpbmZvc2V0IiB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoCi0gICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4gKyAiLnNlcnZlci5zb2FwbWQiKTsKLQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZURpc3BhdGNoZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICAvLyBOb3QgcmVxdWlyZWQgZm9yIHNlcnZlcgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIC8vIENoZWNrcyB0aGUgQ29udGVudC1UeXBlIHRvIHNlbmQgdW5zdXBwb3J0ZWQgbWVkaWEgZXJyb3IKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoZWNrQ29udGVudFR5cGUobWVzc2FnZUluZm8pOwotICAgICAgICB9IGNhdGNoKFNlcnZlclJ0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uVXRpbC5zZW5kS25vd25FcnJvcihtZXNzYWdlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgV1NDb25uZWN0aW9uLlVOU1VQUE9SVEVEX01FRElBKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldHMgcmVxdWVzdCBzdHJlYW0gZnJvbSBXU0Nvbm5lY3Rpb24gYW5kIGNyZWF0ZXMgU09BUCBtZXNzYWdlCi0gICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvYXBNZXNzYWdlID0gZ2V0U09BUE1lc3NhZ2UobWVzc2FnZUluZm8pOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzZW5kUmVzcG9uc2VFcnJvcihtZXNzYWdlSW5mbywgZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgaXQgYmVmb3JlIHJlc3BvbnNlIGlzIHNlbnQgb24gdHJhbnNwb3J0LiBJZiB0cmFuc3BvcnQgY3JlYXRlcwotICAgICAgICAvLyBhbnkgZXhjZXB0aW9uLCB0aGlzIGNhbiBiZSB1c2VkIG5vdCB0byBzZW5kIGFnYWluCi0gICAgICAgIGJvb2xlYW4gc2VudCA9IGZhbHNlOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBDb250ZW50IG5lZ290aWF0aW9uIGxvZ2ljCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIElmIEZJIGlzIGFjY2VwdGVkIGJ5IGNsaWVudCwgc2V0IHByb3BlcnR5IHRvIG9wdGltaXN0aWMKLSAgICAgICAgICAgICAgICBpZiAoKChjb20uc3VuLnhtbC5pbnRlcm5hbC5tZXNzYWdpbmcuc2Fhai5zb2FwLk1lc3NhZ2VJbXBsKSBzb2FwTWVzc2FnZSkuYWNjZXB0RmFzdEluZm9zZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRNZXRhRGF0YShDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZLCAib3B0aW1pc3RpYyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIENvbnRlbnQgbmVnb3RpYXRpb24gZmFpbHMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY29udGV4dCBob2xkcyBNZXNzYWdlSW5mbywgSW50ZXJuYWxNZXNzYWdlLCBTT0FQTWVzc2FnZQotICAgICAgICAgICAgU09BUEhhbmRsZXJDb250ZXh0IGNvbnRleHQgPSBuZXcgU09BUEhhbmRsZXJDb250ZXh0KG1lc3NhZ2VJbmZvLCBudWxsLAotICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlKTsKLSAgICAgICAgICAgIC8vIFdlYlNlcnZpY2VDb250ZXh0J3MgTWVzc2FnZUNvbnRleHQgaXMgc2V0IGludG8gSGFuZGxlckNvbnRleHQKLSAgICAgICAgICAgIHVwZGF0ZUhhbmRsZXJDb250ZXh0KG1lc3NhZ2VJbmZvLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5wdXQoCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICAgICAgLy9zZXQgTUVTU0FHRV9BVFRBQ0hNRU5UUyBwcm9wZXJ0eQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRNZXNzYWdlQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBpZiAobXNnQ3R4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlsLmNvcHlJbmJvdW5kTWVzc2FnZUF0dGFjaG1lbnRzKG1zZ0N0eHQsIHNvYXBNZXNzYWdlLmdldEF0dGFjaG1lbnRzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtSGFuZGxlckRlbGVnYXRlIHNoZCA9IGdldFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZShtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBTb2FwSW52b2tlciBpbXBsZW1lbnRvciA9IG5ldyBTb2FwSW52b2tlcihtZXNzYWdlSW5mbywgc29hcE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgY29udGV4dCwgc2hkKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNoZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludm9rZXMgcmVxdWVzdCBoYW5kbGVyIGNoYWluLCBlbmRwb2ludCwgcmVzcG9uc2UgaGFuZGxlciBjaGFpbgotICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRvci5pbnZva2UoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEludm9rZXIoaW1wbGVtZW50b3IpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2hkLnByb2Nlc3NSZXF1ZXN0KGNvbnRleHQuZ2V0U0hEU09BUE1lc3NhZ2VDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRvci5pbnZva2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoZC5wcm9jZXNzUmVzcG9uc2UoY29udGV4dC5nZXRTSERTT0FQTWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHNlbnQgPSBpbXBsZW1lbnRvci5pc1NlbnQoKTsgICAgLy8gcmVzcG9uc2UgaXMgc2VudCBvciBub3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaXNPbmV3YXkobWVzc2FnZUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNPQVBNZXNzYWdlKG1lc3NhZ2VJbmZvLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UobWVzc2FnZUluZm8sIGNvbnRleHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc2VudCkgewotICAgICAgICAgICAgICAgIC8vIE9uZXdheSBhbmQgcmVxdWVzdCBoYW5kbGVyIGNoYWluIHJldmVyc2VkIHRoZSBleGVjdXRpb24gZGlyZWN0aW9uCi0gICAgICAgICAgICAgICAgc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlT25ld2F5KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICBpZiAoIXNlbnQpIHsKLSAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2VFcnJvcihtZXNzYWdlSW5mbywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0IHNlbnQ7ICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJlc3BvbnNlIGlzIHNlbnQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoaXMgZGVjb2RlcyB0aGUgU09BUE1lc3NhZ2UgaW50byBJbnRlcm5hbE1lc3NhZ2UuIFRoZW4gSW50ZXJuYWxNZXNzYWdlCi0gICAgICogaXMgY29udmVydGVkIHRvIGphdmEgbWV0aG9kIGFuZCBwYXJhbWV0ZXJzIGFuZCBwb3B1bGF0ZXMgdGhlbSBpbnRvCi0gICAgICogTWVzc2FnZUluZm8uCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0b01lc3NhZ2VJbmZvKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBJbnRlcm5hbE1lc3NhZ2UgaW50ZXJuYWxNZXNzYWdlID0gY29udGV4dC5nZXRJbnRlcm5hbE1lc3NhZ2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gY29udGV4dC5nZXRTT0FQTWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQmluZCBoZWFkZXJzLCBib2R5IGZyb20gU09BUE1lc3NhZ2UKLSAgICAgICAgICAgICAgICBTT0FQRVBURmFjdG9yeSBlcHRmID0gKFNPQVBFUFRGYWN0b3J5KW1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBTT0FQRGVjb2RlciBkZWNvZGVyID0gZXB0Zi5nZXRTT0FQRGVjb2RlcigpOwotICAgICAgICAgICAgICAgIGludGVybmFsTWVzc2FnZSA9IGRlY29kZXIudG9JbnRlcm5hbE1lc3NhZ2Uoc29hcE1lc3NhZ2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQmluZCBoZWFkZXJzIGZyb20gU09BUE1lc3NhZ2UKLSAgICAgICAgICAgICAgICBTT0FQRVBURmFjdG9yeSBlcHRmID0gKFNPQVBFUFRGYWN0b3J5KW1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBTT0FQRGVjb2RlciBkZWNvZGVyID0gZXB0Zi5nZXRTT0FQRGVjb2RlcigpOwotICAgICAgICAgICAgICAgIGludGVybmFsTWVzc2FnZSA9IGRlY29kZXIudG9JbnRlcm5hbE1lc3NhZ2Uoc29hcE1lc3NhZ2UsIGludGVybmFsTWVzc2FnZSwgbWVzc2FnZUluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9zZXR1cCBKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyIGZvciBvdXRnb2luZyBhdHRhY2htZW50cwotICAgICAgICAgICAgU09BUEVQVEZhY3RvcnkgZXB0ZiA9IChTT0FQRVBURmFjdG9yeSltZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCk7Ci0gICAgICAgICAgICBTT0FQRW5jb2RlciBlbmNvZGVyID0gZXB0Zi5nZXRTT0FQRW5jb2RlcigpOwotICAgICAgICAgICAgZW5jb2Rlci5zZXRBdHRhY2htZW50c01hcChtZXNzYWdlSW5mbywgaW50ZXJuYWxNZXNzYWdlKTsKLQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2VUeXBlKE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBJbnRlcm5hbE1lc3NhZ2UgdG8gTWVzc2FnZUluZm8KLSAgICAgICAgaWYgKCFpc0ZhaWx1cmUobWVzc2FnZUluZm8pKSB7Ci0gICAgICAgICAgICBTT0FQRVBURmFjdG9yeSBlcHRmID0gKFNPQVBFUFRGYWN0b3J5KW1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgICAgIGVwdGYuZ2V0SW50ZXJuYWxFbmNvZGVyKCkudG9NZXNzYWdlSW5mbyhpbnRlcm5hbE1lc3NhZ2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbykuZ2V0UnVudGltZUVuZHBvaW50SW5mbygpLmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSAoYmluZGluZyAhPSBudWxsKT8oKFNPQVBCaW5kaW5nSW1wbCliaW5kaW5nKS5nZXRCaW5kaW5nSWQoKTpTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlSW5mby5nZXRNZXRob2QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2VUeXBlKE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0SW5mbyBmYXVsdEluZm8gPSBuZXcgU09BUEZhdWx0SW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGZpbmQgZGlzcGF0Y2ggbWV0aG9kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLkZBVUxUX0NPREVfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGJpbmRpbmdJZCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoZmF1bHRJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlcyBTT0FQTWVzc2FnZSBmcm9tIHRoZSBjb25uZWN0aW9uJ3MgcmVxdWVzdCBzdHJlYW0KLSAgICAgKi8KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFNPQVBNZXNzYWdlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIFdTQ29ubmVjdGlvbiBjb24gPSAoV1NDb25uZWN0aW9uKW1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKTsKLSAgICAgICAgcmV0dXJuIFNPQVBDb25uZWN0aW9uVXRpbC5nZXRTT0FQTWVzc2FnZShjb24sIG1lc3NhZ2VJbmZvLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrcyBhZ2FpbnN0IGtub3duIENvbnRlbnQtVHlwZSBoZWFkZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGVudFR5cGUoTWVzc2FnZUluZm8gbWkpIHsKLSAgICAgICAgV1NDb25uZWN0aW9uIGNvbiA9IChXU0Nvbm5lY3Rpb24pbWkuZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBjb24uZ2V0SGVhZGVycygpOwotICAgICAgICBMaXN0PFN0cmluZz4gY3RzID0gaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpOwotICAgICAgICBpZiAoY3RzICE9IG51bGwgJiYgY3RzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBjdCA9IGN0cy5nZXQoMCk7Ci0gICAgICAgICAgICBmb3IoU3RyaW5nIGNvbnRlbnRUeXBlIDogY29udGVudFR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN0LmluZGV4T2YoY29udGVudFR5cGUpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJJbmNvcnJlY3QgQ29udGVudC1UeXBlPSIrY3RzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldHMgdGhlIFdlYlNlcnZpY2VDb250ZXh0IHdpdGggY29ycmVjdCBNZXNzYWdlQ29udGV4dCB3aGljaCBjb250YWlucwotICAgICAqIEFQUExJQ0FUSU9OIHNjb3BlIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXZWJTZXJ2aWNlQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgU09BUEhhbmRsZXJDb250ZXh0IGhjKSB7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIC8vcnRDdHh0LnNldEhhbmRsZXJDb250ZXh0KGhjKTsKLSAgICAgICAgUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8gPSBydEN0eHQuZ2V0UnVudGltZUVuZHBvaW50SW5mbygpOwotICAgICAgICBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQgPSBlbmRwb2ludEluZm8uZ2V0V2ViU2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgaGMuZ2V0TWVzc2FnZUNvbnRleHQoKS5wdXQoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZKSk7Ci0gICAgICAgIGhjLmdldE1lc3NhZ2VDb250ZXh0KCkuc2V0U2NvcGUoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSwgU2NvcGUuQVBQTElDQVRJT04pOwotICAgICAgICBpZiAod3NDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFwcE1zZ0NvbnRleHRJbXBsIGFwcEN0eHQgPSBuZXcgQXBwTXNnQ29udGV4dEltcGwoaGMuZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICB3c0NvbnRleHQuc2V0TWVzc2FnZUNvbnRleHQoYXBwQ3R4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEludm9rZXMgdGhlIGVuZHBvaW50LiBGb3IgUHJvdmlkZXIgZW5kcG9pbnRzLCB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMKLSAgICAgKiBvbmV3YXkgb3Igbm90IGtub3duIG9ubHkgYWZ0ZXIgdGhlIGVuZHBvaW50IGlzIGludm9rZWQuIFByb3ZpZGVyU09BUE1ECi0gICAgICogb3ZlcnJpZGVzIHRoaXMgYW5kIHNlbmRzIHRoZSByZXNwb25zZSBtZXNzYWdlIG9uIHRyYW5zcG9ydCBmb3Igb25ld2F5Ci0gICAgICogb3BlcmF0aW9ucy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByZXNwb25zZSBpcyBzZW50IG9uIHRyYW5zcG9ydAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZUVuZHBvaW50KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBTT0FQSGFuZGxlckNvbnRleHQgaGMpIHsKLSAgICAgICAgVGFyZ2V0RmluZGVyIHRhcmdldEZpbmRlciA9Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCkuZ2V0VGFyZ2V0RmluZGVyKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgVGllIHRpZSA9IHRhcmdldEZpbmRlci5maW5kVGFyZ2V0KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgdGllLl9pbnZva2UobWVzc2FnZUluZm8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGphdmEgbWV0aG9kIHBhcmFtZXRlcnMsIGFuZCByZXR1cm4gdmFsdWUgdG8gSW50ZXJuYWxNZXNzYWdlLgotICAgICAqIEl0IGNhbGxzIHJlc3BvbnNlIGhhbmRsZXJzLiBBdCB0aGUgZW5kLCB0aGUgY29udGV4dCBoYXMgZWl0aGVyCi0gICAgICogSW50ZXJuYWxNZXNzYWdlIG9yIFNPQVBNZXNzYWdlCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZXRSZXNwb25zZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgU09BUEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc2V0UmVzcG9uc2VJbkNvbnRleHQobWVzc2FnZUluZm8sIGNvbnRleHQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSGFuZGxlckNoYWluQ2FsbGVyIGhhbmRsZXJDYWxsZXIgPQotICAgICAgICAgICAgICAgIGdldENhbGxlckZyb21NZXNzYWdlSW5mbyhtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlckNhbGxlciAhPSBudWxsICYmIGhhbmRsZXJDYWxsZXIuaGFzSGFuZGxlcnMoKSkgewotICAgICAgICAgICAgICAgIGludCBtZXNzYWdlVHlwZSA9IG1lc3NhZ2VJbmZvLmdldFJlc3BvbnNlVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PSBNZXNzYWdlSW5mby5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSB8fAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZSA9PSBNZXNzYWdlSW5mby5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FsbEhhbmRsZUZhdWx0KGhhbmRsZXJDYWxsZXIsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhlcmUgYXJlIGhhbmRsZXJzIHNvIGRpc2FibGUgWG9wIGVuY29kaW5nIGlmIGVuYWJsZWQsIHNvIHRoYXQgdGhleSBkb250Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNlZSB4b3A6SW5jbHVkZSByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlciBhbSA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRBdHRhY2htZW50TWFyc2hhbGxlcihtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNYb3BwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYoKGFtICE9IG51bGwpICYmIGFtLmlzWE9QUGFja2FnZSgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzWG9wcGVkID0gYW0uaXNYT1BQYWNrYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbS5zZXRYT1BQYWNrYWdlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYWxsSGFuZGxlcnNPblJlc3BvbnNlKGhhbmRsZXJDYWxsZXIsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvLyBub3cgcHV0IGJhY2sgdGhlIG9sZCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBpZigoYW0gIT0gbnVsbCkpewotICAgICAgICAgICAgICAgICAgICAgICAgYW0uc2V0WE9QUGFja2FnZShpc1hvcHBlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICBjcmVhdGVJbnRlcm5hbE1lc3NhZ2VGb3JFeGNlcHRpb24obWVzc2FnZUluZm8sIGUsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKgotICAgICAqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlSW50ZXJuYWxNZXNzYWdlRm9yRXhjZXB0aW9uKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICAgICAgRXhjZXB0aW9uIGUsIFNPQVBIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGJvb2xlYW4gc29hcDEyID0gZmFsc2U7Ci0gICAgICAgIFJ1bnRpbWVFbmRwb2ludEluZm8gcmVpID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KAotICAgICAgICAgICAgbWVzc2FnZUluZm8pLmdldFJ1bnRpbWVFbmRwb2ludEluZm8oKTsKLSAgICAgICAgU3RyaW5nIGlkID0gKChTT0FQQmluZGluZ0ltcGwpcmVpLmdldEJpbmRpbmcoKSkuZ2V0QmluZGluZ0lkKCk7Ci0gICAgICAgIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAoaWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykpIHsKLSAgICAgICAgICAgIGludGVybmFsTWVzc2FnZSA9IFNPQVBSdW50aW1lTW9kZWwuY3JlYXRlRmF1bHRJbkJvZHkoCi0gICAgICAgICAgICAgICAgZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykpIHsKLSAgICAgICAgICAgIGludGVybmFsTWVzc2FnZSA9IFNPQVBSdW50aW1lTW9kZWwuY3JlYXRlU09BUDEyRmF1bHRJbkJvZHkoCi0gICAgICAgICAgICAgICAgZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBzb2FwMTIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHQuc2V0SW50ZXJuYWxNZXNzYWdlKGludGVybmFsTWVzc2FnZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0U09BUE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIHJldHVybiBzb2FwMTI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1ha2VTT0FQTWVzc2FnZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgU09BUEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgSW50ZXJuYWxNZXNzYWdlIGludGVybmFsTWVzc2FnZSA9IGNvbnRleHQuZ2V0SW50ZXJuYWxNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChpbnRlcm5hbE1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU09BUEVQVEZhY3RvcnkgZXB0ZiA9IChTT0FQRVBURmFjdG9yeSltZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCk7Ci0gICAgICAgICAgICBTT0FQRW5jb2RlciBlbmNvZGVyID0gZXB0Zi5nZXRTT0FQRW5jb2RlcigpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc2FnZSA9IGVuY29kZXIudG9TT0FQTWVzc2FnZShpbnRlcm5hbE1lc3NhZ2UsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U09BUE1lc3NhZ2Uoc29hcE1lc2FnZSk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldEludGVybmFsTWVzc2FnZShudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogTWVzc2FnZUluZm8gY29udGFpbnMgdGhlIGVuZHBvaW50IGludm9jYXRpb24gcmVzdWx0cy4gVGhlIGluZm9ybWF0aW9uCi0gICAgICogaXMgY29udmVydGVkIHRvIEludGVybmFsTWVzc2FnZSBvciBTT0FQTWVzc2FnZSBhbmQgc2V0IGluIEhhbmRsZXJDb250ZXh0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UmVzcG9uc2VJbkNvbnRleHQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgICAgICBTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyBNZXNzYWdlSW5mbyB0byBJbnRlcm5hbE1lc3NhZ2UKLSAgICAgICAgU09BUEVQVEZhY3RvcnkgZXB0ZiA9IChTT0FQRVBURmFjdG9yeSltZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCk7Ci0gICAgICAgIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UgPSAoSW50ZXJuYWxNZXNzYWdlKWVwdGYuZ2V0SW50ZXJuYWxFbmNvZGVyKCkudG9JbnRlcm5hbE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgbWVzc2FnZUluZm8pOwotICAgICAgICAvLyBzZXQgaGFuZGxlciBjb250ZXh0Ci0gICAgICAgIGNvbnRleHQuc2V0SW50ZXJuYWxNZXNzYWdlKGludGVybmFsTWVzc2FnZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0U09BUE1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTZW5kcyBTT0FQTWVzc2FnZSByZXNwb25zZSBvbiB0aGUgY29ubmVjdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZW5kUmVzcG9uc2UoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFNPQVBIYW5kbGVyQ29udGV4dCBjdHh0KSB7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gY3R4dC5nZXRTT0FQTWVzc2FnZSgpOwotICAgICAgICBXU0Nvbm5lY3Rpb24gY29uID0gKFdTQ29ubmVjdGlvbiltZXNzYWdlSW5mby5nZXRDb25uZWN0aW9uKCk7Ci0gICAgICAgIEludGVnZXIgc3RhdHVzID0gTWVzc2FnZUNvbnRleHRVdGlsLmdldEh0dHBTdGF0dXNDb2RlKGN0eHQuZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIGludCBzdGF0dXNDb2RlID0gKHN0YXR1cyA9PSBudWxsKSA/IFdTQ29ubmVjdGlvbi5PSyA6IHN0YXR1czsKLSAgICAgICAgU09BUENvbm5lY3Rpb25VdGlsLnNldFN0YXR1cyhjb24sIHN0YXR1c0NvZGUpOwotICAgICAgICBTT0FQQ29ubmVjdGlvblV0aWwuc2VuZFJlc3BvbnNlKGNvbiwgc29hcE1lc3NhZ2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNlbmRSZXNwb25zZU9uZXdheShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBTT0FQQ29ubmVjdGlvblV0aWwuc2VuZFJlc3BvbnNlT25ld2F5KG1lc3NhZ2VJbmZvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFJlc3BvbnNlRXJyb3IoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFdTQ29ubmVjdGlvbiBjb24gPSAoV1NDb25uZWN0aW9uKW1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKTsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvKS5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCkuZ2V0QmluZGluZygpOwotICAgICAgICBTdHJpbmcgYmluZGluZ0lkID0gKChTT0FQQmluZGluZ0ltcGwpYmluZGluZykuZ2V0QmluZGluZ0lkKCk7Ci0gICAgICAgIFNPQVBDb25uZWN0aW9uVXRpbC5zZW5kUmVzcG9uc2VFcnJvcihjb24sIGJpbmRpbmdJZCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDYWxscyBpbmJvdW5kIGhhbmRsZXJzLiBJdCBhbHNvIGNhbGxzIG91dGJvdW5kIGhhbmRsZXJzIGluY2FzZSBmbG93IGlzCi0gICAgICogcmV2ZXJzZWQuIElmIHRoZSBoYW5kbGVyIHRocm93cyBhIFByb3RvY29sRXhjZXB0aW9uLCBTT0FQIG1lc3NhZ2UgaXMKLSAgICAgKiBhbHJlYWR5IHNldCBpbiB0aGUgY29udGV4dC4gT3RoZXJ3aXNlLCBpdCBjcmVhdGVzIEludGVybmFsTWVzc2FnZSwKLSAgICAgKiBhbmQgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBTT0FQTWVzc2FnZS4KLSAgICAgKgotICAgICAqIHJldHVybnMgd2hldGhlciB0byBpbnZva2UgZW5kcG9pbnQgb3Igbm90LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsSGFuZGxlcnNPblJlcXVlc3QoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgIFNPQVBIYW5kbGVyQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJlc3BvbnNlRXhwZWN0ZWQpIHsKLQotICAgICAgICBib29sZWFuIHNraXBFbmRwb2ludCA9IGZhbHNlOwotICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIgaGFuZGxlckNhbGxlciA9Ci0gICAgICAgICAgICBnZXRDYWxsZXJGcm9tTWVzc2FnZUluZm8obWVzc2FnZUluZm8pOwotCi0gICAgICAgIGlmIChoYW5kbGVyQ2FsbGVyICE9IG51bGwgJiYgaGFuZGxlckNhbGxlci5oYXNIYW5kbGVycygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNraXBFbmRwb2ludCA9ICFoYW5kbGVyQ2FsbGVyLmNhbGxIYW5kbGVycyhEaXJlY3Rpb24uSU5CT1VORCwKLSAgICAgICAgICAgICAgICAgICAgUmVxdWVzdE9yUmVzcG9uc2UuUkVRVUVTVCwgY29udGV4dCwgcmVzcG9uc2VFeHBlY3RlZCk7Ci0gICAgICAgICAgICB9IGNhdGNoKFByb3RvY29sRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICAgICAgc2tpcEVuZHBvaW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoTWVzc2FnZUNvbnRleHRVdGlsLmlnbm9yZUZhdWx0SW5NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSB0aGUgZmF1bHQsIHVzZSB0aGUgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUludGVybmFsTWVzc2FnZUZvckV4Y2VwdGlvbihtZXNzYWdlSW5mbywgcGUsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHNraXBFbmRwb2ludCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY3JlYXRlSW50ZXJuYWxNZXNzYWdlRm9yRXhjZXB0aW9uKG1lc3NhZ2VJbmZvLCByZSwgY29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNraXBFbmRwb2ludDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbkNhbGxlciBnZXRDYWxsZXJGcm9tTWVzc2FnZUluZm8oTWVzc2FnZUluZm8gaW5mbykgewotICAgICAgICBSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gKFJ1bnRpbWVDb250ZXh0KSBpbmZvLmdldE1ldGFEYXRhKAotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfUlVOVElNRV9DT05URVhUKTsKLSAgICAgICAgQmluZGluZ0ltcGwgYmluZGluZyA9IChCaW5kaW5nSW1wbCljb250ZXh0LmdldFJ1bnRpbWVFbmRwb2ludEluZm8oKS5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nLmhhc0hhbmRsZXJzKCkpIHsKLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBjYWxsZXIgPSBiaW5kaW5nLmdldEhhbmRsZXJDaGFpbkNhbGxlcigpOwotICAgICAgICAgICAgTWVzc2FnZUluZm9VdGlsLnNldEhhbmRsZXJDaGFpbkNhbGxlcihpbmZvLCBjYWxsZXIpOwotICAgICAgICAgICAgcmV0dXJuIGNhbGxlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEludm9rZXMgcmVzcG9uc2UgaGFuZGxlciBjaGFpbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGNhbGxIYW5kbGVyc09uUmVzcG9uc2UoSGFuZGxlckNoYWluQ2FsbGVyIGNhbGxlciwKLSAgICAgICAgU09BUEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLQotICAgICAgICByZXR1cm4gY2FsbGVyLmNhbGxIYW5kbGVycyhEaXJlY3Rpb24uT1VUQk9VTkQsCi0gICAgICAgICAgICBSZXF1ZXN0T3JSZXNwb25zZS5SRVNQT05TRSwgY29udGV4dCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgd2hlbiB0aGUgZW5kcG9pbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4gSGFuZGxlRmF1bHQgaXMgY2FsbGVkCi0gICAgICogb24gdGhlIHNlcnZlciBoYW5kbGVycyByYXRoZXIgdGhhbiBoYW5kbGVNZXNzYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuICBjYWxsSGFuZGxlRmF1bHQoSGFuZGxlckNoYWluQ2FsbGVyIGNhbGxlciwgU09BUEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxlci5jYWxsSGFuZGxlRmF1bHQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VydmVyIGRvZXMgbm90IGtub3cgaWYgYSBtZXNzYWdlIGlzIG9uZS13YXkgdW50aWwgYWZ0ZXIKLSAgICAgKiB0aGUgaGFuZGxlciBjaGFpbiBoYXMgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdC4gSWYKLSAgICAgKiBpdCBpcyBhIG9uZS13YXkgbWVzc2FnZSwgaGF2ZSB0aGUgaGFuZGxlciBjaGFpbiBjYWxsZXIKLSAgICAgKiBjYWxsIGNsb3NlIG9uIHRoZSBoYW5kbGVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VIYW5kbGVycyhNZXNzYWdlSW5mbyBpbmZvLCBTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIgaGFuZGxlckNhbGxlciA9IGdldENhbGxlckZyb21NZXNzYWdlSW5mbyhpbmZvKTsKLSAgICAgICAgaWYgKGhhbmRsZXJDYWxsZXIgIT0gbnVsbCAmJiBoYW5kbGVyQ2FsbGVyLmhhc0hhbmRsZXJzKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZXJDYWxsZXIuZm9yY2VDbG9zZUhhbmRsZXJzT25TZXJ2ZXIoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRmFpbHVyZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gKG1lc3NhZ2VJbmZvLmdldFJlc3BvbnNlVHlwZSgpID09IE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzT25ld2F5KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHJldHVybiAobWVzc2FnZUluZm8uZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIE1lc3NhZ2VDb250ZXh0IGludG8gSGFuZGxlckNvbnRleHQgYW5kIHNldHMgSGFuZGxlckNvbnRleHQgaW4KLSAgICAgKiBSdW50aW1lQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVIYW5kbGVyQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywKLSAgICAgICAgICAgIFNPQVBIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbykuc2V0SGFuZGxlckNvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvID0KLSAgICAgICAgICAgIE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbykuZ2V0UnVudGltZUVuZHBvaW50SW5mbygpOwotICAgICAgICBjb250ZXh0LnNldEJpbmRpbmdJZCgoKEJpbmRpbmdJbXBsKWVuZHBvaW50SW5mby5nZXRCaW5kaW5nKCkpLmdldEFjdHVhbEJpbmRpbmdJZCgpKTsKLSAgICAgICAgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0ID0gZW5kcG9pbnRJbmZvLmdldFdlYlNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIGlmICh3c0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRNZXNzYWdlQ29udGV4dCh3c0NvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBmcm9tIGVuZHBvaW50J3MgQmluZGluZwotICAgICAqLwotICAgIHByaXZhdGUgU3lzdGVtSGFuZGxlckRlbGVnYXRlIGdldFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZShNZXNzYWdlSW5mbyBtaSkgewotICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWkpOwotICAgICAgICBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbyA9IHJ0Q3R4dC5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCk7Ci0gICAgICAgIHJldHVybiBlbmRwb2ludEluZm8uZ2V0QmluZGluZygpLmdldFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgcmVxdWVzdCBoYW5kbGVyIGNoYWluLCBlbmRwb2ludCBhbmQgcmVzcG9uc2UgaGFuZGxlciBjaGFpbi4KLSAgICAgKiBTZXBhcmF0ZWQgYXMgYSBzZXBhcmF0ZSBjbGFzcywgc28gdGhhdCBTSEQgY2FuIGNhbGwgdGhpcyBpbiBkb1ByaXYoKQotICAgICAqIGJsb2NrLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU29hcEludm9rZXIgaW1wbGVtZW50cyBJbnZva2VyIHsKLQotICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbzsKLSAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2U7Ci0gICAgICAgIFNPQVBIYW5kbGVyQ29udGV4dCBjb250ZXh0OwotICAgICAgICBib29sZWFuIHNraXBFbmRwb2ludDsKLSAgICAgICAgU3lzdGVtSGFuZGxlckRlbGVnYXRlIHNoZDsKLSAgICAgICAgYm9vbGVhbiBzZW50OwotCi0gICAgICAgIFNvYXBJbnZva2VyKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSwKLSAgICAgICAgICAgICAgICBTT0FQSGFuZGxlckNvbnRleHQgY29udGV4dCwgU3lzdGVtSGFuZGxlckRlbGVnYXRlIHNoZCkgewotICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW5mbyA9IG1lc3NhZ2VJbmZvOwotICAgICAgICAgICAgdGhpcy5zb2FwTWVzc2FnZSA9IHNvYXBNZXNzYWdlOwotICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgICAgIHRoaXMuc2hkID0gc2hkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW52b2tlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBib29sZWFuIHBlZWtPbmVXYXkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICghc2tpcEVuZHBvaW50KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU09BUEVQVEZhY3RvcnkgZXB0ZiA9IChTT0FQRVBURmFjdG9yeSltZXNzYWdlSW5mby5nZXRFUFRGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBEZWNvZGVyIGRlY29kZXIgPSBlcHRmLmdldFNPQVBEZWNvZGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGhhbmRsZXIgY2hhaW4gY2FsbGVyIHRvIG1lc3NhZ2UgaW5mbwotICAgICAgICAgICAgICAgICAgICBnZXRDYWxsZXJGcm9tTWVzc2FnZUluZm8obWVzc2FnZUluZm8pOwotICAgICAgICAgICAgICAgICAgICBwZWVrT25lV2F5ID0gZGVjb2Rlci5kb011c3RVbmRlcnN0YW5kUHJvY2Vzc2luZyhzb2FwTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mbywgY29udGV4dCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0TWV0aG9kKG1lc3NhZ2VJbmZvLmdldE1ldGhvZCgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBza2lwRW5kcG9pbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNvYXAxMiA9IGNyZWF0ZUludGVybmFsTWVzc2FnZUZvckV4Y2VwdGlvbihtZXNzYWdlSW5mbywgZSwgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBSdW50aW1lTW9kZWwuYWRkSGVhZGVycyhjb250ZXh0LmdldEludGVybmFsTWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENhbGwgaW5ib3VuZCBoYW5kbGVycy4gSXQgYWxzbyBjYWxscyBvdXRib3VuZCBoYW5kbGVycyBpbmNhc2Ugb2YKLSAgICAgICAgICAgIC8vIHJldmVyc2FsIG9mIGZsb3cuCi0gICAgICAgICAgICBpZiAoIXNraXBFbmRwb2ludCkgewotICAgICAgICAgICAgICAgIHNraXBFbmRwb2ludCA9IGNhbGxIYW5kbGVyc09uUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8sIGNvbnRleHQsICFwZWVrT25lV2F5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNraXBFbmRwb2ludCkgewotICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlID0gY29udGV4dC5nZXRTT0FQTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmIChzb2FwTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVybmFsTWVzc2FnZSBpbnRlcm5hbE1lc3NhZ2UgPSBjb250ZXh0LmdldEludGVybmFsTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICBTT0FQRVBURmFjdG9yeSBlcHRmID0gKFNPQVBFUFRGYWN0b3J5KW1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUEVuY29kZXIgZW5jb2RlciA9IGVwdGYuZ2V0U09BUEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcE1lc3NhZ2UgPSBlbmNvZGVyLnRvU09BUE1lc3NhZ2UoaW50ZXJuYWxNZXNzYWdlLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRW5zdXJlIG1lc3NhZ2UgaXMgZW5jb2RlZCBhY2NvcmRpbmcgdG8gY29ubmVnCi0gICAgICAgICAgICAgICAgRmFzdEluZm9zZXRVdGlsLmVuc3VyZUNvcnJlY3RFbmNvZGluZyhtZXNzYWdlSW5mbywgc29hcE1lc3NhZ2UpOwotCi0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRTT0FQTWVzc2FnZShzb2FwTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbnRlcm5hbE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRvTWVzc2FnZUluZm8obWVzc2FnZUluZm8sIGNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzT25ld2F5KG1lc3NhZ2VJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICBzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlT25ld2F5KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwZWVrT25lV2F5KSB7IC8vIGhhbmRsZXIgY2hhaW4gZGlkbid0IGFscmVhZHkgY2xvcwotICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VIYW5kbGVycyhtZXNzYWdlSW5mbywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzRmFpbHVyZShtZXNzYWdlSW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNoZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaGQucHJlSW52b2tlRW5kcG9pbnRIb29rKGNvbnRleHQuZ2V0U0hEU09BUE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdlYlNlcnZpY2VDb250ZXh0KG1lc3NhZ2VJbmZvLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaW52b2tlRW5kcG9pbnQobWVzc2FnZUluZm8sIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgUHJvdmlkZXIgZW5kcG9pbnRzIE9uZXdheSBpcyBrbm93biBvbmx5IGFmdGVyIGV4ZWN1dGluZyBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbnQgJiYgaXNPbmV3YXkobWVzc2FnZUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZU9uZXdheShtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzT25ld2F5KG1lc3NhZ2VJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWlsdXJlKG1lc3NhZ2VJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBsb2cgdGhlIGVycm9yLiBOb3QgbXVjaCB0byBkbwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVzcG9uc2UobWVzc2FnZUluZm8sIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBkaXNwYXRjaCBtZXRob2QgaW4gdGhlIGVuZHBvaW50IGZvciB0aGUgcGF5bG9hZCdzIFFOYW1lCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gZGlzcGF0Y2ggbWV0aG9kCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWV0aG9kIGdldE1ldGhvZChRTmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgcmV0dXJuIHJ0Q3R4dC5nZXREaXNwYXRjaE1ldGhvZChuYW1lLCBtZXNzYWdlSW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBJcyB0aGUgbWVzc2FnZSBzZW50IG9uIHRyYW5zcG9ydC4gSGFwcGVucyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgb25ld2F5Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBpcyBzZW50Ci0gICAgICAgICAqICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzZW50OwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC94bWwvWE1MTWVzc2FnZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcHJvdG9jb2wveG1sL1hNTE1lc3NhZ2VFeGNlcHRpb24uamF2YQppbmRleCBlMWVjOGI3Li5mMGEwOTM3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC94bWwvWE1MTWVzc2FnZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3htbC9YTUxNZXNzYWdlRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDUsNyArNDUsNyBAQAogICAgICAgICBzdXBlcigic2VydmVyLnJ0LmVyciIsIGFyZyk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICByZXR1cm4gImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy54bWxtZXNzYWdlIjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3htbC9jbGllbnQvWE1MTWVzc2FnZURpc3BhdGNoZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3htbC9jbGllbnQvWE1MTWVzc2FnZURpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5YTc1Yy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC94bWwvY2xpZW50L1hNTE1lc3NhZ2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wueG1sLmNsaWVudDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnBhY2thZ2luZy5taW1lLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC4qOwotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5kaXNwYXRjaC5EaXNwYXRjaENvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LmRpc3BhdGNoLlJlc3BvbnNlSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuY2xpZW50LlNPQVAxMlhNTEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5jbGllbnQuU09BUFhNTEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5pbnRlcm5hbC5NZXNzYWdlSW5mb0Jhc2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXIuRGlyZWN0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNoYWluQ2FsbGVyLlJlcXVlc3RPclJlc3BvbnNlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHRVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuWE1MSGFuZGxlckNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5KYXZhTWV0aG9kOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0LkVQVEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5DbGllbnRUcmFuc3BvcnRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldTQ29ubmVjdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5jbGllbnQuSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CYXNlNjRVdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuWE1MQ29ubmVjdGlvblV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLio7Ci1pbXBvcnQgc3RhdGljIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIuUEFTU1dPUkRfUFJPUEVSVFk7Ci1pbXBvcnQgc3RhdGljIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIuVVNFUk5BTUVfUFJPUEVSVFk7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwotCi0vKioKLSAqIENsaWVudC1zaWRlIFhNTC1iYXNlZCBtZXNzYWdlIGRpc3BhdGNoZXIge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJvdG9jb2wuTWVzc2FnZURpc3BhdGNoZXJ9Ci0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNZXNzYWdlRGlzcGF0Y2hlciBpbXBsZW1lbnRzIE1lc3NhZ2VEaXNwYXRjaGVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BWF9USFJFQURfUE9PTF9TSVpFID0gMzsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgQVdBSVRfVEVSTUlOQVRJT05fVElNRSA9IDEwTDsKLQotICAgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbnVsbDsKLQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotCi0gICAgcHVibGljIFhNTE1lc3NhZ2VEaXNwYXRjaGVyKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogSW52b2tlcyBkb1NlbmRBc3luYyBtZXRob2QgaWYgdGhlIG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybiBpcyBhc3luY2hyb25vdXMsIG90aGVyd2lzZQotICAgICAqIGludm9rZXMgZG9TZW5kIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBzZWUgY29tLnN1bi5wZXB0LnByb3RvY29sLk1lc3NhZ2VEaXNwYXRjaGVyI3NlbmQoY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIGlmIChpc0FzeW5jKG1lc3NhZ2VJbmZvKSkgewotICAgICAgICAgICAgZG9TZW5kQXN5bmMobWVzc2FnZUluZm8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG9TZW5kKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9yY2hlc3RyYXRlcyB0aGUgc2VuZGluZyBvZiBhIHN5bmNocm9ub3VzIHJlcXVlc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MTWVzc2FnZSBkb1NlbmQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgLy9jaGFuZ2UgZnJvbSBMb2dpY2FsRVBURmFjdG9yeSB0byBDb250YWN0SW5mb0Jhc2UgLSBzaG91bGQgYmUgY2hhbmdlZCBiYWNrIHdoZW4gd2UgaGF2ZSB0aGluZ3Mgd29ya2luZwotICAgICAgICBFUFRGYWN0b3J5IGNvbnRhY3RJbmZvID0gbWVzc2FnZUluZm8uZ2V0RVBURmFjdG9yeSgpOwotICAgICAgICBYTUxFbmNvZGVyIGVuY29kZXIgPSAoWE1MRW5jb2RlcikgY29udGFjdEluZm8uZ2V0RW5jb2RlcihtZXNzYWdlSW5mbyk7Ci0KLSAgICAgICAgYm9vbGVhbiBoYW5kbGVyUmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3RSZXNwb25zZSA9IChtZXNzYWdlSW5mby5nZXRNRVAoKSA9PSBNZXNzYWdlU3RydWN0LlJFUVVFU1RfUkVTUE9OU0VfTUVQKTsKLQotICAgICAgICBEaXNwYXRjaENvbnRleHQgZGlzcGF0Y2hDb250ZXh0ID0gKERpc3BhdGNoQ29udGV4dCkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5ESVNQQVRDSF9DT05URVhUKTsKLQotICAgICAgICBpZiAoIWlzSFRUUE1lc3NhZ2VUeXBlKGRpc3BhdGNoQ29udGV4dCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJNb2RlIG5vdCBhbGxvd2VkIHdpdGggSFRUUCBCaW5kaW5nLiBNdXN0IHVzZSBvdGhlciBTZXJ2aWNlLm1vZGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTE1lc3NhZ2UgeG0gPSBtYWtlWE1MTWVzc2FnZShtZXNzYWdlSW5mbyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBjYWxsZXIgPSBnZXRIYW5kbGVyQ2hhaW5DYWxsZXIobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgaWYgKGNhbGxlci5oYXNIYW5kbGVycygpKSB7Ci0gICAgICAgICAgICAgICAgWE1MSGFuZGxlckNvbnRleHQgaGFuZGxlckNvbnRleHQgPSBuZXcgWE1MSGFuZGxlckNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLCBudWxsLCB4bSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTWVzc2FnZUNvbnRleHQobWVzc2FnZUluZm8sIGhhbmRsZXJDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gY2FsbEhhbmRsZXJzT25SZXF1ZXN0KGhhbmRsZXJDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVYTUxNZXNzYWdlKGhhbmRsZXJDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB4bSA9IGhhbmRsZXJDb250ZXh0LmdldFhNTE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoeG0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB4bSA9IGVuY29kZXIudG9YTUxNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNvbnRleHQuZ2V0SW50ZXJuYWxNZXNzYWdlKCksIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGUgb25seSBjYXNlIHdoZXJlIG5vIG1lc3NhZ2UgaXMgc2VudAotICAgICAgICAgICAgICAgIGlmIChpc1JlcXVlc3RSZXNwb25zZSAmJiAhaGFuZGxlclJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4geG07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXR0aW5nIGVuY29kZXIgaGVyZSBpcyBuZWNlc3NhcnkgZm9yIGNhbGxzIHRvIGdldEJpbmRpbmdJZCgpCi0vLyAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldEVuY29kZXIoZW5jb2Rlcik7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnRleHQgPSBwcm9jZXNzTWV0YWRhdGEobWVzc2FnZUluZm8sIHhtKTsKLQotICAgICAgICAgICAgLy8gc2V0IHRoZSBNSU1FIGhlYWRlcnMgb24gY29ubmVjdGlvbiBoZWFkZXJzCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB4bS5nZXRNaW1lSGVhZGVycygpLmdldEFsbEhlYWRlcnMoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgTWltZUhlYWRlciBtaCA9IChNaW1lSGVhZGVyKSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGguY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBoLmFkZChtaC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBjaC5wdXQobWguZ2V0TmFtZSgpLCBoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0Q29ubmVjdGlvbihtZXNzYWdlSW5mbywgY29udGV4dCk7Ci0gICAgICAgICAgICAoKFdTQ29ubmVjdGlvbikgbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpKS5zZXRIZWFkZXJzKGNoKTsKLQotICAgICAgICAgICAgaWYgKCFpc0FzeW5jKG1lc3NhZ2VJbmZvKSkgewotICAgICAgICAgICAgICAgIFdTQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKFdTQ29ubmVjdGlvbikgbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgIC8vbG9nUmVxdWVzdE1lc3NhZ2UoeG0sIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBYTUxDb25uZWN0aW9uVXRpbC5zZW5kUmVzcG9uc2UoY29ubmVjdGlvbiwgeG0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiBoYW5kbGVyUmVzdWx0IGlzIGZhbHNlLCB0aGUgcmVjZWl2ZSBoYXMgYWxyZWFkeSBoYXBwZW5lZAotICAgICAgICAgICAgaWYgKGlzUmVxdWVzdFJlc3BvbnNlICYmIGhhbmRsZXJSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZWNlaXZlKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBwb3N0UmVjZWl2ZUhvb2sobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgc2V0UmVzcG9uc2VUeXBlKGUsIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGFuZCBjbGFzc2lmeSB0aGUgbWV0YWRhdGEgaW4gTUlNRSBoZWFkZXJzIG9yIG1lc3NhZ2UgY29udGV4dC4gPFN0cmluZyxTdHJpbmc+IGRhdGEKLSAgICAgKiBpcyBjb3BpZWQgaW50byBNSU1FIGhlYWRlcnMgYW5kIHRoZSByZW1haW5pbmcgbWV0YWRhdGEgaXMgcGFzc2VkIGluIG1lc3NhZ2UgY29udGV4dCB0byB0aGUKLSAgICAgKiB0cmFuc3BvcnQgbGF5ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUluZm8KLSAgICAgKiBAcGFyYW0geG0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9jZXNzTWV0YWRhdGEoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFhNTE1lc3NhZ2UgeG0pIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXNzYWdlQ29udGV4dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBMaXN0PFN0cmluZz4gaGVhZGVyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgQ29udGV4dE1hcCBwcm9wZXJ0aWVzID0gKENvbnRleHRNYXApCi0gICAgICAgICAgICBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShKQVhXU19DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgRGlzcGF0Y2hDb250ZXh0IGRjb250ZXh0ID0gKERpc3BhdGNoQ29udGV4dCkKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuRElTUEFUQ0hfQ09OVEVYVCk7Ci0gICAgICAgIGlmIChpc0hUVFBNZXNzYWdlVHlwZShkY29udGV4dCkpIHsKLSAgICAgICAgICAgIHNldEhUVFBDb250ZXh0KG1lc3NhZ2VDb250ZXh0LCBkY29udGV4dCwgcHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVzc2FnZUluZm8uZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCkKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChPTkVfV0FZX09QRVJBVElPTiwgInRydWUiKTsKLQotICAgICAgICAvLyBwcm9jZXNzIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbmFtZXMgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5TmFtZXMoKTsgbmFtZXMuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjb25zdW1lIFBFUFQtc3BlY2lmaWMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZS5lcXVhbHMoQ2xpZW50VHJhbnNwb3J0RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChDTElFTlRfVFJBTlNQT1JUX0ZBQ1RPUlksIChDbGllbnRUcmFuc3BvcnRGYWN0b3J5KSBwcm9wZXJ0aWVzLmdldChwcm9wTmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFVTRVJOQU1FX1BST1BFUlRZKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlZGVudGlhbHMgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChVU0VSTkFNRV9QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjcmVkZW50aWFscyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyArPSAiOiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChQQVNTV09SRF9QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyArPSBwYXNzd29yZDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyA9IEJhc2U2NFV0aWwuZW5jb2RlKGNyZWRlbnRpYWxzLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgeG0uZ2V0TWltZUhlYWRlcnMoKS5hZGRIZWFkZXIoIkF1dGhvcml6YXRpb24iLCAiQmFzaWMgIiArIGNyZWRlbnRpYWxzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZS5lcXVhbHMoQmluZGluZ1Byb3ZpZGVyLlNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1haW50YWluU2Vzc2lvbiA9IHByb3BlcnRpZXMuZ2V0KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1haW50YWluU2Vzc2lvbiAhPSBudWxsICYmIG1haW50YWluU2Vzc2lvbi5lcXVhbHMoQm9vbGVhbi5UUlVFKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvb2tpZUphciA9IHByb3BlcnRpZXMuZ2V0KEhUVFBfQ09PS0lFX0pBUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llSmFyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQucHV0KEhUVFBfQ09PS0lFX0pBUiwgY29va2llSmFyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnB1dChwcm9wTmFtZSwgcHJvcGVydGllcy5nZXQocHJvcE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgYWNjZXB0IGhlYWRlciBkZXBlbmRpbmcgb24gY29udGVudCBuZWdvdGlhdGlvbiBwcm9wZXJ0eQotICAgICAgICBTdHJpbmcgY29udGVudE5lZ290aWF0aW9uID0gKFN0cmluZykKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFkpOwotCi0gICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSBnZXRCaW5kaW5nSWQobWVzc2FnZUluZm8pOwotCi0gICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykpIHsKLSAgICAgICAgICAgIHhtLmdldE1pbWVIZWFkZXJzKCkuYWRkSGVhZGVyKEFDQ0VQVF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBjb250ZW50TmVnb3RpYXRpb24gIT0gIm5vbmUiID8gU09BUDEyX1hNTF9GSV9BQ0NFUFRfVkFMVUUgOiBTT0FQMTJfWE1MX0FDQ0VQVF9WQUxVRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4bS5nZXRNaW1lSGVhZGVycygpLmFkZEhlYWRlcihBQ0NFUFRfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgY29udGVudE5lZ290aWF0aW9uICE9ICJub25lIiA/IFhNTF9GSV9BQ0NFUFRfVkFMVUUgOiBYTUxfQUNDRVBUX1ZBTFVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2V0UmVxdWVzdEhlYWRlcnMKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXF1ZXN0SGVhZGVycyA9IChNYXApCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUyk7Ci0gICAgICAgIC8vcmVxdWVzdEhlYWRlcnMuCi0gICAgICAgIHNldE1pbWVIZWFkZXJzKHJlcXVlc3RIZWFkZXJzLCB4bSk7Ci0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQucHV0KEJJTkRJTkdfSURfUFJPUEVSVFksIGJpbmRpbmdJZCk7Ci0KLSAgICAgICAgLy8gU09BUEFjdGlvbjogTUlNRSBoZWFkZXIKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnVudGltZUNvbnRleHQgPSAoUnVudGltZUNvbnRleHQpIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEpBWFdTX1JVTlRJTUVfQ09OVEVYVCk7Ci0gICAgICAgIGlmIChydW50aW1lQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKYXZhTWV0aG9kIGphdmFNZXRob2QgPSBydW50aW1lQ29udGV4dC5nZXRNb2RlbCgpLmdldEphdmFNZXRob2QobWVzc2FnZUluZm8uZ2V0TWV0aG9kKCkpOwotICAgICAgICAgICAgaWYgKGphdmFNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gKChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwLlNPQVBCaW5kaW5nKSBqYXZhTWV0aG9kLmdldEJpbmRpbmcoKSkuZ2V0U09BUEFjdGlvbigpOwotICAgICAgICAgICAgICAgIGhlYWRlci5jbGVhcigpOwotICAgICAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgeG0uZ2V0TWltZUhlYWRlcnMoKS5hZGRIZWFkZXIoIlNPQVBBY3Rpb24iLCAiXCJcIiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtLmdldE1pbWVIZWFkZXJzKCkuYWRkSGVhZGVyKCJTT0FQQWN0aW9uIiwgc29hcEFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0aW9uKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnRleHQpIHsKLSAgICAgICAgQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBjbGllbnRUcmFuc3BvcnRGYWN0b3J5ID0gKENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIGNvbnRleHQuZ2V0KENMSUVOVF9UUkFOU1BPUlRfRkFDVE9SWSk7Ci0gICAgICAgIFdTQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGNsaWVudFRyYW5zcG9ydEZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xpZW50VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIGNvbm5lY3Rpb24gPSBjbGllbnRUcmFuc3BvcnRGYWN0b3J5LmNyZWF0ZShjb250ZXh0KTsKLSAgICAgICAgbWVzc2FnZUluZm8uc2V0Q29ubmVjdGlvbihjb25uZWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNwb25zZVR5cGUoVGhyb3dhYmxlIGUsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZVR5cGUoTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlIHRlbXAgPSBlOwotICAgICAgICAgICAgICAgIGUgPSBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbih0ZW1wLmdldE1lc3NhZ2UoKSwgdGVtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZVR5cGUoTWVzc2FnZVN0cnVjdC5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHJlY2VpdmluZyBvZiBhIHN5bmNocm9ub3VzIHJlc3BvbnNlCi0gICAgICoKLSAgICAgKiBAc2VlIGNvbS5zdW4ucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlciNyZWNlaXZlKGNvbS5zdW4ucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICoKLSAgICAgKiB0b2RvOiBleGNlcHRpb24gaGFuZGxpbmcgd2l0aCBwb3NzaWJsZSBzYWFqIGVycm9yIGJlbG93Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICAvLyBjaGFuZ2UgZnJvbSBMb2dpY2FsRVBURmFjdG9yeSB0byBDb250YWN0SW5mb0Jhc2UgLSBzaG91bGQgYmUgY2hhbmdlZCBiYWNrIHdoZW4gd2UgaGF2ZSB0aGluZ3Mgd29ya2luZwotICAgICAgICBFUFRGYWN0b3J5IGNvbnRhY3RJbmZvID0gbWVzc2FnZUluZm8uZ2V0RVBURmFjdG9yeSgpOwotCi0gICAgICAgIFhNTE1lc3NhZ2UgeG0gPSBnZXRYTUxNZXNzYWdlKG1lc3NhZ2VJbmZvKTsKLQotICAgICAgICAvLyBDb250ZW50IG5lZ290aWF0aW9uIGxvZ2ljCi0gICAgICAgIFN0cmluZyBjb250ZW50TmVnb3RpYXRpb24gPSAoU3RyaW5nKSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZKTsKLSAgICAgICAgLy8gSWYgWE1MIHJlcXVlc3QKLSAgICAgICAgaWYgKGNvbnRlbnROZWdvdGlhdGlvbiA9PSAicGVzc2ltaXN0aWMiKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICh4bS5pc0Zhc3RJbmZvc2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwIHJlcXVlc3RDb250ZXh0ID0gKE1hcCkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoSkFYV1NfQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZ1cnRoZXIgcmVxdWVzdHMgd2lsbCBiZSBzZW5kIHVzaW5nIEZJCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZLCAib3B0aW1pc3RpYyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIENvbnRlbnQgbmVnb3RpYXRpb24gZmFpbHMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL2xvZ1Jlc3BvbnNlTWVzc2FnZSh4bSwgbWVzc2FnZUluZm8pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDb250ZXh0ID0KLSAgICAgICAgICAgIGdldEluYm91bmRIYW5kbGVyQ29udGV4dChtZXNzYWdlSW5mbywgeG0pOwotCi0gICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBjYWxsZXIgPSBnZXRIYW5kbGVyQ2hhaW5DYWxsZXIobWVzc2FnZUluZm8pOwotICAgICAgICBpZiAoY2FsbGVyLmhhc0hhbmRsZXJzKCkpIHsKLSAgICAgICAgICAgIGNhbGxIYW5kbGVyc09uUmVzcG9uc2UoaGFuZGxlckNvbnRleHQpOwotICAgICAgICAgICAgeG0gPSBoYW5kbGVyQ29udGV4dC5nZXRYTUxNZXNzYWdlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NldCBtZXNzYWdlSW5mbyByZXNwb25zZSB3aXRoIGFwcHJvcHJpYXRlIHJlc3VsdAotICAgICAgICAvL2F0IHNhbWUgdGltZSBzZXRzIFJlc3BvbnNlQ29udGV4dAotICAgICAgICBzZXRSZXNwb25zZShtZXNzYWdlSW5mbywgeG0sIGhhbmRsZXJDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0UmVzcG9uc2UoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFhNTE1lc3NhZ2UgeG0sIEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDb250ZXh0KSB7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dGFjaG1lbnRzID0gZ2V0QXR0YWNobWVudHMoaGFuZGxlckNvbnRleHQsIHhtKTsKLQotICAgICAgICB1cGRhdGVSZXNwb25zZUNvbnRleHQobWVzc2FnZUluZm8sIChYTUxIYW5kbGVyQ29udGV4dCloYW5kbGVyQ29udGV4dCwgYXR0YWNobWVudHMpOwotCi0gICAgICAgIERpc3BhdGNoQ29udGV4dCBkaXNwYXRjaENvbnRleHQgPSAoRGlzcGF0Y2hDb250ZXh0KSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkRJU1BBVENIX0NPTlRFWFQpOwotICAgICAgICBEaXNwYXRjaENvbnRleHQuTWVzc2FnZVR5cGUgbXNndHlwZSA9IChEaXNwYXRjaENvbnRleHQuTWVzc2FnZVR5cGUpIGRpc3BhdGNoQ29udGV4dC5nZXRQcm9wZXJ0eShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRSk7Ci0gICAgICAgIGlmIChtc2d0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoKERpc3BhdGNoQ29udGV4dC5NZXNzYWdlVHlwZSkgbXNndHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgSFRUUF9TT1VSQ0VfTUVTU0FHRToKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoeG0uZ2V0U291cmNlKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEhUVFBfU09VUkNFX1BBWUxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHhtLmdldFNvdXJjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBIVFRQX0pBWEJfUEFZTE9BRDoKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoeG0uZ2V0UGF5bG9hZChnZXRKQVhCQ29udGV4dChtZXNzYWdlSW5mbykpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBIVFRQX0RBVEFTT1VSQ0VfTUVTU0FHRToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhtLmdldERhdGFTb3VyY2UoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoeG0uZ2V0RGF0YVNvdXJjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlVua25vd24gaW52b2NhdGlvbiByZXR1cm4gb2JqZWN0ICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy90YmQganVzdCBhc3N1bWUgc291cmNlIGZvciBub3cKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbmtub3duIGludm9jYXRpb24gcmV0dXJuIG9iamVjdCIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBnZXRBdHRhY2htZW50cyhIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ29udGV4dCwgWE1MTWVzc2FnZSB4bSkgewotICAgICAgICAvL2FyZSB0aGVyZSBhdHRhY2htZW50cyBvbiB0aGUgTWVzc2FnZUNvbnRleHQgcHJvcGVydGllcyA/IEhhbmRsZXJzCi0gICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRtYyA9IChNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4pCi0gICAgICAgICAgICBoYW5kbGVyQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpLmdldChNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOwotICAgICAgICAvL2NhbiB3ZSBnZXQgaXQgZnJvbSBYTUxNZXNzYWdlIGFzIHdlbGw/Ci0gICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHR4bSA9IHhtLmdldEF0dGFjaG1lbnRzKCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dGFjaG1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4oKTsKLSAgICAgICAgaWYgKGF0dHhtICE9IG51bGwgJiYgYXR0bWMgIT0gbnVsbCkgewotICAgICAgICAgICAgYXR0YWNobWVudHMucHV0QWxsKGF0dHhtKTsKLSAgICAgICAgICAgIGF0dGFjaG1lbnRzLnB1dEFsbChhdHRtYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXR0eG0gIT0gbnVsbCkgewotICAgICAgICAgICAgYXR0YWNobWVudHMucHV0QWxsKGF0dHhtKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdHRtYyAhPSBudWxsKQotICAgICAgICAgICAgYXR0YWNobWVudHMucHV0QWxsKGF0dG1jKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhdHRhY2htZW50cyA9IG51bGw7IC8vZ2MgaXQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdHRhY2htZW50czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhNTEhhbmRsZXJDb250ZXh0IGdldEluYm91bmRIYW5kbGVyQ29udGV4dCgKLSAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFhNTE1lc3NhZ2UgeG0pIHsKLSAgICAgICAgWE1MSGFuZGxlckNvbnRleHQgaGFuZGxlckNvbnRleHQgPSAoWE1MSGFuZGxlckNvbnRleHQpIG1lc3NhZ2VJbmZvCi0gICAgICAgICAgICAuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19IQU5ETEVSX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBpZiAoaGFuZGxlckNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlckNvbnRleHQuc2V0WE1MTWVzc2FnZSh4bSk7Ci0gICAgICAgICAgICBoYW5kbGVyQ29udGV4dC5zZXRJbnRlcm5hbE1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVyQ29udGV4dCA9IG5ldyBYTUxIYW5kbGVyQ29udGV4dChtZXNzYWdlSW5mbywgbnVsbCwgeG0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHNlbmRpbmcgb2YgYW4gYXN5bmNocm9ub3VzIHJlcXVlc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NlbmRBc3luYyhmaW5hbCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICB0cnkgeyAvLyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0Ci0gICAgICAgICAgICBwcmVTZW5kSG9vayhtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBYTUxNZXNzYWdlIHhtID0gZG9TZW5kKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIHBvc3RTZW5kSG9vayhtZXNzYWdlSW5mbyk7Ci0KLSAgICAgICAgICAgIC8vcGFzcyBhIGNvcHkgb2YgTWVzc2FnZUluZm8gdG8gdGhlIGZ1dHVyZSB0YXNrLHNvIHRoYXQgbm8gY29uZmxpY3RzCi0gICAgICAgICAgICAvL2R1ZSB0byB0aHJlYWRpbmcgaGFwcGVucwotICAgICAgICAgICAgUmVzcG9uc2UgciA9IHNlbmRBc3luY1JlY2VpdmUoTWVzc2FnZUluZm9CYXNlLmNvcHkobWVzc2FnZUluZm8pLCB4bSk7Ci0gICAgICAgICAgICBpZiAoZXhlY3V0b3JTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBleGVjdXRvclNlcnZpY2UgPQotICAgICAgICAgICAgICAgICAgICBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKE1BWF9USFJFQURfUE9PTF9TSVpFLCBuZXcgRGFlbW9uVGhyZWFkRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXN5bmNIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gKEFzeW5jSGFuZGxlclNlcnZpY2UpIG1lc3NhZ2VJbmZvCi0gICAgICAgICAgICAgICAgLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ0xJRU5UX0FTWU5DX0hBTkRMRVIpOwotICAgICAgICAgICAgV1NGdXR1cmUgd3NmdXR1cmUgPSBudWxsOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdzZnV0dXJlID0gc2VydmljZS5zZXR1cEFzeW5jQ2FsbGJhY2socik7Ci0gICAgICAgICAgICAgICAgKChSZXNwb25zZUltcGwpIHIpLnNldFVJRChzZXJ2aWNlLmdldFVJRCgpKTsKLSAgICAgICAgICAgICAgICAoKFJlc3BvbnNlSW1wbCkgcikuc2V0SGFuZGxlclNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGVjdXRvclNlcnZpY2UuZXhlY3V0ZSgoRnV0dXJlVGFzaykgcik7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHdzZnV0dXJlKTsKLQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHJlY2VpdmluZyBvZiBhbiBhc3luY2hyb25vdXMgcmVzcG9uc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmVzcG9uc2U8T2JqZWN0PiBzZW5kQXN5bmNSZWNlaXZlKGZpbmFsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBmaW5hbCBYTUxNZXNzYWdlIHhtKSB7Ci0KLSAgICAgICAgZmluYWwgQXN5bmNIYW5kbGVyU2VydmljZSBoYW5kbGVyID0gKEFzeW5jSGFuZGxlclNlcnZpY2UpIG1lc3NhZ2VJbmZvCi0gICAgICAgICAgICAuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DTElFTlRfQVNZTkNfSEFORExFUik7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2FsbGJhY2sgPSAobWVzc2FnZUluZm8uZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5BU1lOQ19DQUxMQkFDS19NRVApID8gdHJ1ZQotICAgICAgICAgICAgOiBmYWxzZTsKLSAgICAgICAgaWYgKGNhbGxiYWNrICYmIChoYW5kbGVyID09IG51bGwpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkFzeW5jaHJvbm91cyBjYWxsYmFjayBpbnZvY2F0aW9uLCBidXQgbm8gaGFuZGxlciAtIEFzeW5jSGFuZGxlciByZXF1aXJlZCIpOwotCi0gICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSBuZXcgUmVzcG9uc2VJbXBsPE9iamVjdD4obmV3IENhbGxhYmxlPE9iamVjdD4oKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIC8vIGdldCBjb25uZWN0aW9uIGFuZCBkbyBodHRwLmludm9rZSgpCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgV1NDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoV1NDb25uZWN0aW9uKSBtZXNzYWdlSW5mby5nZXRDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vbG9nUmVxdWVzdE1lc3NhZ2UoeG0sIG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgWE1MQ29ubmVjdGlvblV0aWwuc2VuZFJlc3BvbnNlKGNvbm5lY3Rpb24sIHhtKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZSh0KTsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2VUeXBlKE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHJlY2VpdmUgcmVzcG9uc2UKLSAgICAgICAgICAgICAgICBwcmVSZWNlaXZlSG9vayhtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZShtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcG9zdFJlY2VpdmVIb29rKG1lc3NhZ2VJbmZvKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlSW5mby5nZXRSZXNwb25zZSgpIGluc3RhbmNlb2YgRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyAoRXhjZXB0aW9uKSBtZXNzYWdlSW5mby5nZXRSZXNwb25zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlSW5mby5nZXRSZXNwb25zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbWVzc2FnZUluZm8uc2V0TWV0YURhdGEoSkFYV1NfQ0xJRU5UX0FTWU5DX1JFU1BPTlNFX0NPTlRFWFQsIHIpOwotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxsSGFuZGxlcnNPblJlcXVlc3QoWE1MSGFuZGxlckNvbnRleHQgaGFuZGxlckNvbnRleHQpIHsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIgY2FsbGVyID0gZ2V0SGFuZGxlckNoYWluQ2FsbGVyKAotICAgICAgICAgICAgaGFuZGxlckNvbnRleHQuZ2V0TWVzc2FnZUluZm8oKSk7Ci0gICAgICAgIGJvb2xlYW4gcmVzcG9uc2VFeHBlY3RlZCA9IChoYW5kbGVyQ29udGV4dC5nZXRNZXNzYWdlSW5mbygpLmdldE1FUCgpICE9Ci0gICAgICAgICAgICBNZXNzYWdlU3RydWN0Lk9ORV9XQVlfTUVQKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjYWxsZXIuY2FsbEhhbmRsZXJzKERpcmVjdGlvbi5PVVRCT1VORCwKLSAgICAgICAgICAgICAgICBSZXF1ZXN0T3JSZXNwb25zZS5SRVFVRVNULCBoYW5kbGVyQ29udGV4dCwgcmVzcG9uc2VFeHBlY3RlZCk7Ci0gICAgICAgIH0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICBpZiAoTWVzc2FnZUNvbnRleHRVdGlsLmlnbm9yZUZhdWx0SW5NZXNzYWdlKAotICAgICAgICAgICAgICAgIGhhbmRsZXJDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlIGZhdWx0IGluIHRoaXMgY2FzZSBhbmQgdXNlIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBwZTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgIHRocm93IHdzZTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlcnMgYXJlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gdGhyb3cgUkUKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKHJlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBVc2VyJ3MgaGFuZGxlciBjYW4gdGhyb3cgYSBSdW50aW1lRXhjZXB0aW9ucwotICAgICogKGUuZy4sIGEgUHJvdG9jb2xFeGNlcHRpb24pLgotICAgICogTmVlZCB0byB3cmFwIGFueSBSdW50aW1lRXhjZXB0aW9uIChvdGhlciB0aGFuIFdlYlNlcnZpY2VFeGNlcHRpb24pIGluCi0gICAgKiBXZWJTZXJ2aWNlRXhjZXB0aW9uLgotICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsbEhhbmRsZXJzT25SZXNwb25zZShYTUxIYW5kbGVyQ29udGV4dCBoYW5kbGVyQ29udGV4dCkgewotICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIgY2FsbGVyID0gZ2V0SGFuZGxlckNoYWluQ2FsbGVyKAotICAgICAgICAgICAgaGFuZGxlckNvbnRleHQuZ2V0TWVzc2FnZUluZm8oKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FsbGVyLmNhbGxIYW5kbGVycyhEaXJlY3Rpb24uSU5CT1VORCwKLSAgICAgICAgICAgICAgICBSZXF1ZXN0T3JSZXNwb25zZS5SRVNQT05TRSwgaGFuZGxlckNvbnRleHQsIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgIHRocm93IHdzZTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlcnMgYXJlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gdGhyb3cgUkUKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKHJlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBCaW5kaW5nIGdldEJpbmRpbmcoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgQ29udGV4dE1hcCBjb250ZXh0ID0gKENvbnRleHRNYXApICgoTWVzc2FnZUluZm9CYXNlKSBtZXNzYWdlSW5mbykKLSAgICAgICAgICAgIC5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBjb250ZXh0Ci0gICAgICAgICAgICAuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfQ0xJRU5UX0hBTkRMRV9QUk9QRVJUWSk7Ci0gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEhhbmRsZXJDaGFpbkNhbGxlciBnZXRIYW5kbGVyQ2hhaW5DYWxsZXIoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgQmluZGluZ0ltcGwgYmluZGluZyA9IChCaW5kaW5nSW1wbCkgZ2V0QmluZGluZyhtZXNzYWdlSW5mbyk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nLmdldEhhbmRsZXJDaGFpbkNhbGxlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUluZm8uc2V0TWV0YURhdGEoCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0hBTkRMRVJfQ09OVEVYVF9QUk9QRVJUWSwgY29udGV4dCk7Ci0gICAgICAgIFJlcXVlc3RDb250ZXh0IGN0eHQgPSAoUmVxdWVzdENvbnRleHQpIG1lc3NhZ2VJbmZvCi0gICAgICAgICAgICAuZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGN0eHQuY29weSgpLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY3R4dC5nZXQobmFtZSk7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzcG9uc2VDb250ZXh0KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gYXR0YWNobWVudHMpIHsKLQotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKQotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0KEpBWFdTX0NMSUVOVF9IQU5ETEVfUFJPUEVSVFkpOwotICAgICAgICBSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0ID0gbmV3IFJlc3BvbnNlQ29udGV4dChwcm92aWRlcik7Ci0gICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBtZXNzYWdlQ29udGV4dC5rZXlTZXQoKSkgewotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuU2NvcGUgc2NvcGUgPSBtZXNzYWdlQ29udGV4dC5nZXRTY29wZShuYW1lKTsKLSAgICAgICAgICAgIGlmIChNZXNzYWdlQ29udGV4dC5TY29wZS5BUFBMSUNBVElPTiA9PSBzY29wZSkgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1lc3NhZ2VDb250ZXh0LmdldChuYW1lKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vbGV0J3MgdXBkYXRlIHN0YXR1cyBjb2RlCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gIGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgV1NDb25uZWN0aW9uIGNvbiA9IG1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKTsKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gY29uLmdldEhlYWRlcnMoKTsKLQotICAgICAgICByZXNwb25zZUNvbnRleHQucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfSEVBREVSUywgaGVhZGVycyk7Ci0gICAgICAgIHJlc3BvbnNlQ29udGV4dC5wdXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9DT0RFLCBjb24uZ2V0U3RhdHVzKCkpOwotCi0gICAgICAgIC8vYXR0YWNobWVudHMgZm9yIFJlc3BvbnNlQ29udGV4dAotICAgICAgICBpZiAoYXR0YWNobWVudHMgIT0gbnVsbCkKLSAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMsIGF0dGFjaG1lbnRzKTsKLQotICAgICAgICBSZXNwb25zZUltcGwgYXN5bmNSZXNwb25zZSA9IChSZXNwb25zZUltcGwpIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKAotICAgICAgICAgICAgSkFYV1NfQ0xJRU5UX0FTWU5DX1JFU1BPTlNFX0NPTlRFWFQpOwotICAgICAgICBpZiAoYXN5bmNSZXNwb25zZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFJlc3BvbnNlQ29udGV4dChyZXNwb25zZUNvbnRleHQuY29weSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldE1ldGFEYXRhKEpBWFdTX1JFU1BPTlNFX0NPTlRFWFRfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmNvcHkoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIGluZGljYXRlcyBhc3luY2hyb25vdXMsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBc3luYyhNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBpZiAoKG1lc3NhZ2VJbmZvLmdldE1FUCgpID09IE1lc3NhZ2VTdHJ1Y3QuQVNZTkNfUE9MTF9NRVApCi0gICAgICAgICAgICB8fCAobWVzc2FnZUluZm8uZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5BU1lOQ19DQUxMQkFDS19NRVApKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZVNlbmRIb29rKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZVJlY2VpdmVIb29rKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvc3RTZW5kSG9vayhNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBpZiAobWVzc2FnZUluZm8uZ2V0UmVzcG9uc2VUeXBlKCkgIT0gTWVzc2FnZVN0cnVjdC5OT1JNQUxfUkVTUE9OU0UpIHsKLSAgICAgICAgICAgIHBvc3RSZWNlaXZlSG9vayhtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICB0aHJvdyAoV2ViU2VydmljZUV4Y2VwdGlvbikgbWVzc2FnZUluZm8uZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3N0UmVjZWl2ZUFuZERlY29kZUhvb2soTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcG9zdFJlY2VpdmVIb29rKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2VJbmZvLmdldE1FUCgpID09IE1lc3NhZ2VTdHJ1Y3QuT05FX1dBWV9NRVApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIE9iamVjdCByZXNwb25zZSA9IG1lc3NhZ2VJbmZvLmdldFJlc3BvbnNlKCk7Ci0gICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFN0cmVhbVNvdXJjZSkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSAoKFN0cmVhbVNvdXJjZSkgcmVzcG9uc2UpLmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShpcy5hdmFpbGFibGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG91dC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSgoU3RyZWFtU291cmNlKSByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQob3V0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAvL2NvdWxkIGRvIHRvIHN0cmluZwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3IFN0cmluZyhieXRlcykuaW5kZXhPZigiSFRUUEV4Y2VwdGlvbiIpID4gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSFRUUEV4Y2VwdGlvbihIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0lOVEVSTkFMX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UobmV3IFN0cmVhbVNvdXJjZShiaXMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VJbmZvLmdldFJlc3BvbnNlVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIE1lc3NhZ2VTdHJ1Y3QuTk9STUFMX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgIC8vIG5vdCBzdXJlIHdoZXJlIHRoaXMgYmVsb25ncyB5ZXQgLSBidXQgZm9yIG5vdy0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIE1lc3NhZ2VTdHJ1Y3QuQ0hFQ0tFRF9FWENFUFRJT05fUkVTUE9OU0U6Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBIVFRQRXhjZXB0aW9uKEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfSU5URVJOQUxfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRToKLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBQcm90b2NvbEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSFRUUEV4Y2VwdGlvbihIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0lOVEVSTkFMX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIGpleCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oKEV4Y2VwdGlvbikgcmVzcG9uc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VBbGxIYW5kbGVycyhYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBjYWxsZXIgPSBnZXRIYW5kbGVyQ2hhaW5DYWxsZXIoCi0gICAgICAgICAgICBjb250ZXh0LmdldE1lc3NhZ2VJbmZvKCkpOwotICAgICAgICBpZiAoY2FsbGVyICE9IG51bGwgJiYgY2FsbGVyLmhhc0hhbmRsZXJzKCkpIHsKLSAgICAgICAgICAgIGNhbGxlci5mb3JjZUNsb3NlSGFuZGxlcnNPbkNsaWVudChjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBTT0FQTWVzc2FnZSAoMS4xIG9yIDEuMiB1c2luZyBTQUFKIGFwaSkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBCaW5kaW5nSWQgYXNzb2NpYXRlZCB3aXRoIG1lc3NhZ2VJbmZvCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCaW5kaW5nSWQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgU09BUEVuY29kZXIgZW5jb2RlciA9IChTT0FQRW5jb2RlcikgbWVzc2FnZUluZm8uZ2V0RW5jb2RlcigpOwotICAgICAgICBpZiAoZW5jb2RlciBpbnN0YW5jZW9mIFNPQVBYTUxFbmNvZGVyKQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsKLSAgICAgICAgZWxzZSBpZiAoZW5jb2RlciBpbnN0YW5jZW9mIFNPQVAxMlhNTEVuY29kZXIpCi0gICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvZ3MgdGhlIFNPQVAgcmVxdWVzdCBtZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nUmVxdWVzdE1lc3NhZ2UoWE1MTWVzc2FnZSByZXF1ZXN0LCBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLQotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gKChXU0Nvbm5lY3Rpb24pIG1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKSkuZ2V0RGVidWcoKTsKLQotICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gIioqKioqKioqKioqKioqKioqKlxuUmVxdWVzdFxuIjsKLSAgICAgICAgICAgIG91dC53cml0ZShzLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0KLSAgICAgICAgICAgICAgICByZXF1ZXN0LmdldE1pbWVIZWFkZXJzKCkuZ2V0QWxsSGVhZGVycygpOwotICAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBNaW1lSGVhZGVyIGhlYWRlciA9IChNaW1lSGVhZGVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzID0gaGVhZGVyLmdldE5hbWUoKSArICI6ICIgKyBoZWFkZXIuZ2V0VmFsdWUoKSArICJcbiI7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgIHJlcXVlc3Qud3JpdGVUbyhvdXQpOwotICAgICAgICAgICAgcyA9ICJcbiI7Ci0gICAgICAgICAgICBvdXQud3JpdGUocy5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyB0aGUgU09BUCByZXNwb25zZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nUmVzcG9uc2VNZXNzYWdlKFhNTE1lc3NhZ2UgcmVzcG9uc2UsIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotCi0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSAoKFdTQ29ubmVjdGlvbikgbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpKS5nZXREZWJ1ZygpOwotCi0gICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAiUmVzcG9uc2VcbiI7Ci0gICAgICAgICAgICBvdXQud3JpdGUocy5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIHMgPQotICAgICAgICAgICAgICAgICJIdHRwIFN0YXR1cyBDb2RlOiAiCi0gICAgICAgICAgICAgICAgICAgICsgKChXU0Nvbm5lY3Rpb24pIG1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKSkuZ2V0U3RhdHVzKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiXG5cbiI7Ci0gICAgICAgICAgICBvdXQud3JpdGUocy5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0TWltZUhlYWRlcnMoKS5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIE1pbWVIZWFkZXIgaGVhZGVyID0gKE1pbWVIZWFkZXIpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHMgPSBoZWFkZXIuZ2V0TmFtZSgpICsgIjogIiArIGhlYWRlci5nZXRWYWx1ZSgpICsgIlxuIjsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUocy5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVUbyhvdXQpOwotICAgICAgICAgICAgcyA9ICIqKioqKioqKioqKioqKioqKipcblxuIjsKLSAgICAgICAgICAgIG91dC53cml0ZShzLmdldEJ5dGVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEdldHMgWE1MTWVzc2FnZSBmcm9tIHRoZSBjb25uZWN0aW9uCi0gICAgKi8KLSAgICBwcml2YXRlIFhNTE1lc3NhZ2UgZ2V0WE1MTWVzc2FnZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBXU0Nvbm5lY3Rpb24gY29uID0gKFdTQ29ubmVjdGlvbikgbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICByZXR1cm4gWE1MQ29ubmVjdGlvblV0aWwuZ2V0WE1MTWVzc2FnZShjb24sIG1lc3NhZ2VJbmZvKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgSkFYQkNvbnRleHQgamMgPSBudWxsOwotICAgICAgICBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gKFJlcXVlc3RDb250ZXh0KSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgamMgPSAoSkFYQkNvbnRleHQpIGNvbnRleHQuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYQl9DT05URVhUX1BST1BFUlRZKTsKLQotICAgICAgICByZXR1cm4gamM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SFRUUENvbnRleHQoTWFwPFN0cmluZywgT2JqZWN0PiBtZXNzYWdlQ29udGV4dCwgRGlzcGF0Y2hDb250ZXh0IGRpc3BhdGNoQ29udGV4dCwgTWFwIHJlcXVlc3RDb250ZXh0KSB7Ci0KLSAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9EKSAhPSBudWxsKQotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9NRVRIT0QsIHJlcXVlc3RDb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9EKSk7Ci0gICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX0hFQURFUlMpICE9IG51bGwpCi0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5wdXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX0hFQURFUlMsIHJlcXVlc3RDb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUykpOwotCi0gICAgICAgIC8vcmVzb2x2ZSBlbmRwb2ludCBsb29rIGZvciBxdWVyeSBwYXJhbWV0ZXJzLCBwYXRoSW5mbwotICAgICAgICBTdHJpbmcgb3JpZ0VuZHBvaW50ID0gKFN0cmluZykgcmVxdWVzdENvbnRleHQuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLQotICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSBudWxsOwotICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSBudWxsOwotICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0LlBBVEhfSU5GTykgIT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aEluZm8gPSAoU3RyaW5nKSByZXF1ZXN0Q29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuUEFUSF9JTkZPKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0LlFVRVJZX1NUUklORykgIT0gbnVsbCkgewotICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSAoU3RyaW5nKSByZXF1ZXN0Q29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuUVVFUllfU1RSSU5HKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXNvbHZlZEVuZHBvaW50ID0gbnVsbDsKLSAgICAgICAgaWYgKHBhdGhJbmZvICE9IG51bGwgfHwgcXVlcnlTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aEluZm8gPSBjaGVja1BhdGgocGF0aEluZm8pOwotICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSBjaGVja1F1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgICAgIGlmIChvcmlnRW5kcG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSSSBlbmRwb2ludFVSSSA9IG5ldyBVUkkob3JpZ0VuZHBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRFbmRwb2ludCA9IHJlc29sdmVVUkkoZW5kcG9pbnRVUkksIHBhdGhJbmZvLCBxdWVyeVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRFbmRwb2ludCA9IG9yaWdFbmRwb2ludDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgcmVzb2x2ZWRFbmRwb2ludCk7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIHJlc29sdmVkRW5kcG9pbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlVVJJKFVSSSBlbmRwb2ludFVSSSwgU3RyaW5nIHBhdGhJbmZvLCBTdHJpbmcgcXVlcnlTdHJpbmcpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGZyYWdtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIFVSSSByZXN1bHQgPSBlbmRwb2ludFVSSS5yZXNvbHZlKHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgICAgIHF1ZXJ5ID0gcmVzdWx0LmdldFF1ZXJ5KCk7Ci0gICAgICAgICAgICBmcmFnbWVudCA9IHJlc3VsdC5nZXRGcmFnbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIC8vU3RyaW5nIHBhdGggPSAocGF0aEluZm8gIT0gbnVsbCkgPyBlbmRwb2ludFVSSS5nZXRQYXRoKCkgKyBwYXRoSW5mbyA6IGVuZHBvaW50VVJJLmdldFBhdGgoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSAocGF0aEluZm8gIT0gbnVsbCkgPyBwYXRoSW5mbyA6IGVuZHBvaW50VVJJLmdldFBhdGgoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSSSB0ZW1wID0gbmV3IFVSSShudWxsLCBudWxsLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50VVJJLnJlc29sdmUodGVtcCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZHBvaW50VVJJLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2hlY2tQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIC8vZG9lcyBpdCBiZWdpbiB3aXRoIC8KLSAgICAgICAgcmV0dXJuIChwYXRoID09IG51bGwgfHwgcGF0aC5zdGFydHNXaXRoKCIvIikpID8gcGF0aCA6ICIvIiArIHBhdGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2hlY2tRdWVyeShTdHJpbmcgcXVlcnkpIHsKLSAgICAgICAgLy9kb2VzIGl0IGJlZ2luIHdpdGggPwotICAgICAgICByZXR1cm4gKHF1ZXJ5ID09IG51bGwgfHwgcXVlcnkuc3RhcnRzV2l0aCgiPyIpKSA/IHF1ZXJ5IDogIj8iICsgcXVlcnk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNIVFRQTWVzc2FnZVR5cGUoRGlzcGF0Y2hDb250ZXh0IGRpc3BhdGNoQ29udGV4dCkgewotCi0gICAgICAgIERpc3BhdGNoQ29udGV4dC5NZXNzYWdlVHlwZSB0eXBlID0gKERpc3BhdGNoQ29udGV4dC5NZXNzYWdlVHlwZSkKLSAgICAgICAgICAgIGRpc3BhdGNoQ29udGV4dC5nZXRQcm9wZXJ0eShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRSk7Ci0KLSAgICAgICAgaWYgKCh0eXBlID09IERpc3BhdGNoQ29udGV4dC5NZXNzYWdlVHlwZS5IVFRQX0RBVEFTT1VSQ0VfTUVTU0FHRSkgfHwKLSAgICAgICAgICAgIC8vKHR5cGUgPT0gRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLkhUVFBfREFUQVNPVVJDRV9QQVlMT0FEKSB8fAotICAgICAgICAgICAgKHR5cGUgPT0gRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLkhUVFBfU09VUkNFX01FU1NBR0UpIHx8Ci0gICAgICAgICAgICAodHlwZSA9PSBEaXNwYXRjaENvbnRleHQuTWVzc2FnZVR5cGUuSFRUUF9TT1VSQ0VfUEFZTE9BRCkgfHwKLSAgICAgICAgICAgIC8vKHR5cGUgPT0gRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLkhUVFBfSkFYQl9NRVNTQUdFKSB8fAotICAgICAgICAgICAgKHR5cGUgPT0gRGlzcGF0Y2hDb250ZXh0Lk1lc3NhZ2VUeXBlLkhUVFBfSkFYQl9QQVlMT0FEKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWE1MTWVzc2FnZSBtYWtlWE1MTWVzc2FnZQotICAgICAgICAoTWVzc2FnZUluZm8KLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvKSB7Ci0KLSAgICAgICAgWE1MTWVzc2FnZSB4bSA9IG51bGw7Ci0KLSAgICAgICAgQ2xhc3MgY2xhenogPSAoQ2xhc3MpCi0gICAgICAgICAgICBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShEaXNwYXRjaENvbnRleHQuRElTUEFUQ0hfTUVTU0FHRV9DTEFTUyk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0ID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pCi0gICAgICAgICAgICBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gYXR0YWNobWVudHMgPSAoY29udGV4dCAhPSBudWxsKSA/Ci0gICAgICAgICAgICAoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+ICljb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5PVVRCT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKSA6IG51bGw7Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIEZhc3QgSW5mb3NldCBpcyB0byBiZSB1c2VkCi0gICAgICAgIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQgPQotICAgICAgICAgICAgKG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFkpID09ICJvcHRpbWlzdGljIik7Ci0KLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IG1lc3NhZ2VJbmZvLmdldERhdGEoKVswXTsKLQotICAgICAgICBpZiAoY2xhenogIT0gbnVsbCAmJiBjbGF6ei5pc0Fzc2lnbmFibGVGcm9tKFNvdXJjZS5jbGFzcykpIHsKLSAgICAgICAgICAgIC8veG0gPSBuZXcgWE1MTWVzc2FnZSgoU291cmNlKSBvYmplY3QsIHVzZUZhc3RJbmZvc2V0KTsKLSAgICAgICAgICAgIHhtID0gbmV3IFhNTE1lc3NhZ2UoKFNvdXJjZSkgb2JqZWN0LCBhdHRhY2htZW50cywgdXNlRmFzdEluZm9zZXQpOwotICAgICAgICB9IGVsc2UgaWYgKGNsYXp6ICE9IG51bGwgJiYgY2xhenouaXNBc3NpZ25hYmxlRnJvbShEYXRhU291cmNlLmNsYXNzKSkgewotICAgICAgICAgICAgeG0gPSBuZXcgWE1MTWVzc2FnZSgoRGF0YVNvdXJjZSkgb2JqZWN0LCB1c2VGYXN0SW5mb3NldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4bSA9IG5ldyBYTUxNZXNzYWdlKG9iamVjdCwgZ2V0SkFYQkNvbnRleHQobWVzc2FnZUluZm8pLCBhdHRhY2htZW50cywgdXNlRmFzdEluZm9zZXQpOwotICAgICAgICAgICAgLy94bSA9IG5ldyBYTUxNZXNzYWdlKG9iamVjdCwgZ2V0SkFYQkNvbnRleHQobWVzc2FnZUluZm8pLCB1c2VGYXN0SW5mb3NldCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4geG07Ci0gICAgfQotCi0gICAgIHByaXZhdGUgdm9pZCBzZXRNaW1lSGVhZGVycyhNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlcXVlc3RIZWFkZXJzLCBYTUxNZXNzYWdlIHhtKSB7Ci0KLSAgICAgICAgaWYgKChyZXF1ZXN0SGVhZGVycyAhPSBudWxsKSAmJiAoIXJlcXVlc3RIZWFkZXJzLmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIFNldDxNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBoZWFkZXJTZXQgPSByZXF1ZXN0SGVhZGVycy5lbnRyeVNldCgpOwotICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gaXRlciA9IGhlYWRlclNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZyxMaXN0PFN0cmluZz4+IGVudHJ5ID1pdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBNaW1lSGVhZGVycyBoZWFkZXJzID0geG0uZ2V0TWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBlbnRyeS5nZXRWYWx1ZSgpLnRvQXJyYXkobmV3IFN0cmluZ1tlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKV0gKTs7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMjUwKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh2YWx1ZXNbMF0pOwotICAgICAgICAgICAgICAgIGVsc2UgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoIC0gMTsgaSsrKXsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh2YWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGhlYWRlcnMuYWRkSGVhZGVyKGVudHJ5LmdldEtleSgpLCBidWYudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFhNTE1lc3NhZ2UgdXBkYXRlWE1MTWVzc2FnZShYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgLy8gQ3JlYXRlIGEgbmV3IFhNTE1lc3NhZ2UgZnJvbSBleGlzdGluZyBtZXNzYWdlIGFuZCBPVVRCT1VORCBhdHRhY2htZW50cyBwcm9wZXJ0eQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHh0ID0gY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gYXR0cyA9IChNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4pbXNnQ3R4dC5nZXQoCi0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyk7Ci0gICAgICAgIGlmIChhdHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSA9IGNvbnRleHQuZ2V0WE1MTWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKHhtbE1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhbGxBdHRzID0geG1sTWVzc2FnZS5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgICAgIGlmIChhbGxBdHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsQXR0cy5wdXRBbGwoYXR0cyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsQXR0cyA9IGF0dHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0WE1MTWVzc2FnZShuZXcgWE1MTWVzc2FnZSh4bWxNZXNzYWdlLmdldFNvdXJjZSgpLCBhbGxBdHRzLAotICAgICAgICAgICAgICAgICAgICB4bWxNZXNzYWdlLmlzRmFzdEluZm9zZXQoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL2NhbiBJIG1ha2UgYSBtZXNzYWdlIHcvbyBzcmMKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFhNTE1lc3NhZ2UoKTsKLSAgICB9Ci0KLQotICAgIGNsYXNzIERhZW1vblRocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKLSAgICAgICAgcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgewotICAgICAgICAgICAgVGhyZWFkIGRhZW1vblRocmVhZCA9IG5ldyBUaHJlYWQocik7Ci0gICAgICAgICAgICBkYWVtb25UaHJlYWQuc2V0RGFlbW9uKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICByZXR1cm4gZGFlbW9uVGhyZWFkOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC94bWwvc2VydmVyL1Byb3ZpZGVyWE1MTUQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3htbC9zZXJ2ZXIvUHJvdmlkZXJYTUxNRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjU0Nzc3Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3htbC9zZXJ2ZXIvUHJvdmlkZXJYTUxNRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnhtbC5zZXJ2ZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXIuUHJvdmlkZXJNb2RlbDsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uTWVzc2FnZVN0cnVjdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy54bWwuWE1MTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLlhNTEhhbmRsZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUVuZHBvaW50SW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXIuUHJvdmlkZXJQZXB0VGllOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLQotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy4qOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJvdmlkZXJYTUxNRCBleHRlbmRzIFhNTE1lc3NhZ2VEaXNwYXRjaGVyIHsKLQotICAgIC8qCi0gICAgICogRmlsbCB0aGUgcGFyYW1ldGVycywgbWV0aG9kIGluIE1lc3NhZ2VJbmZvIGZvciBQcm92aWRlciBpbnRlcmZhY2UuCi0gICAgICogaW52b2tlKFNvdXJjZSwgWE1MSGFuZGxlckNvbnRleHQpIHRvIE9iamVjdFtdCi0gICAgICogaW52b2tlKFNPQVBNZXNzYWdlLCBYTUxIYW5kbGVyQ29udGV4dCkgdG8gT2JqZWN0W10KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0b01lc3NhZ2VJbmZvKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIE9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbyA9IHJ0Q3R4dC5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCk7Ci0gICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gKFByb3ZpZGVyKWVuZHBvaW50SW5mby5nZXRJbXBsZW1lbnRvcigpOwotICAgICAgICBDbGFzcyBwcm92aWRlckNsYXNzID0gcHJvdmlkZXIuZ2V0Q2xhc3MoKTsKLSAgICAgICAgUHJvdmlkZXJNb2RlbCBtb2RlbCA9IGVuZHBvaW50SW5mby5nZXRQcm92aWRlck1vZGVsKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNTb3VyY2UgPSBtb2RlbC5pc1NvdXJjZSgpOwotICAgICAgICBTZXJ2aWNlLk1vZGUgbW9kZSA9IG1vZGVsLmdldFNlcnZpY2VNb2RlKCk7Ci0gICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSA9IGNvbnRleHQuZ2V0WE1MTWVzc2FnZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgZGF0YVswXSA9IHhtbE1lc3NhZ2UuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGFbMF0gPSB4bWxNZXNzYWdlLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2VUeXBlKE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShlKTsKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlSW5mby5zZXREYXRhKGRhdGEpOwotICAgICAgICBtZXNzYWdlSW5mby5zZXRNZXRob2QoUHJvdmlkZXJQZXB0VGllLmludm9rZV9NZXRob2QpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTWVzc2FnZUluZm8gY29udGFpbnMgdGhlIGVuZHBvaW50IGludm9jYXRpb24gcmVzdWx0cy4gSWYgdGhlIGVuZHBvaW50Ci0gICAgICogcmV0dXJucyBhIFNPQVBNZXNzYWdlLCBqdXN0IHNldCB0aGUgb2JqZWN0IGluIEhhbmRsZXJDb250ZXh0LiBJZiB0aGUKLSAgICAgKiBlbmRwb2ludCByZXR1cm5zIGEgU291cmNlIGluIE1vZGUuTUVTU0FHRSwgaXQgaXMgY29udmVydGVkIHRvIFNPQVBNZXNzYWdlCi0gICAgICogYW5kIHNldCBpbiBIYW5kbGVyQ29udGV4dC4gSWYgdGhlIGVuZHBvaW50IHJldHVybnMgYSBTb3VyY2UgaW4KLSAgICAgKiBNb2RlLlBBWUxPQUQsIGl0IGlzIHNldCBpbiBJbnRlcm5hbE1lc3NhZ2UsIGFuZCBJbnRlcm5hbE1lc3NhZ2UgaXMgc2V0Ci0gICAgICogaW4gSGFuZGxlckNvbnRleHQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNwb25zZUluQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywKLSAgICAgICAgICAgIFhNTEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IG1lc3NhZ2VJbmZvLmdldFJlc3BvbnNlKCk7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgIFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvID0gcnRDdHh0LmdldFJ1bnRpbWVFbmRwb2ludEluZm8oKTsKLSAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIgPSAoUHJvdmlkZXIpZW5kcG9pbnRJbmZvLmdldEltcGxlbWVudG9yKCk7Ci0gICAgICAgIENsYXNzIHByb3ZpZGVyQ2xhc3MgPSBwcm92aWRlci5nZXRDbGFzcygpOwotCi0gICAgICAgIGJvb2xlYW4gdXNlRmFzdEluZm9zZXQgPQotICAgICAgICAgICAgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSkgPT0gIm9wdGltaXN0aWMiOwotCi0gICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIGlmIChtZXNzYWdlSW5mby5nZXRSZXNwb25zZVR5cGUoKSA9PSBNZXNzYWdlSW5mby5OT1JNQUxfUkVTUE9OU0UpIHsKLSAgICAgICAgICAgIHhtbE1lc3NhZ2UgPSAob2JqIGluc3RhbmNlb2YgRGF0YVNvdXJjZSkKLSAgICAgICAgICAgICAgICA/IG5ldyBYTUxNZXNzYWdlKChEYXRhU291cmNlKW9iaiwgdXNlRmFzdEluZm9zZXQpCi0gICAgICAgICAgICAgICAgOiBuZXcgWE1MTWVzc2FnZSgoU291cmNlKW9iaiwgdXNlRmFzdEluZm9zZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sTWVzc2FnZSA9IG5ldyBYTUxNZXNzYWdlKChFeGNlcHRpb24pb2JqLCB1c2VGYXN0SW5mb3NldCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGV4dC5zZXRYTUxNZXNzYWdlKHhtbE1lc3NhZ2UpOwotICAgICAgICBjb250ZXh0LnNldEludGVybmFsTWVzc2FnZShudWxsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3htbC9zZXJ2ZXIvWE1MTWVzc2FnZURpc3BhdGNoZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Byb3RvY29sL3htbC9zZXJ2ZXIvWE1MTWVzc2FnZURpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3ZmQ1OS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9wcm90b2NvbC94bWwvc2VydmVyL1hNTE1lc3NhZ2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wueG1sLnNlcnZlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0VXRpbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uLlRhcmdldEZpbmRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5UaWU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy54bWwuWE1MTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLkhhbmRsZXJDaGFpbkNhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5oYW5kbGVyLkhhbmRsZXJDaGFpbkNhbGxlci5EaXJlY3Rpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXIuUmVxdWVzdE9yUmVzcG9uc2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5YTUxIYW5kbGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXIuUHJvdmlkZXJNb2RlbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXIuUHJvdmlkZXJQZXB0VGllOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLkludm9rZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci4qOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLlN5c3RlbUhhbmRsZXJEZWxlZ2F0ZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlhNTENvbm5lY3Rpb25VdGlsOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOwotCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkNPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFk7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MTWVzc2FnZURpc3BhdGNoZXIgaW1wbGVtZW50cyBNZXNzYWdlRGlzcGF0Y2hlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigKLSAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db25zdGFudHMuTG9nZ2luZ0RvbWFpbiArICIuc2VydmVyLnhtbG1kIik7Ci0KLSAgICBwdWJsaWMgWE1MTWVzc2FnZURpc3BhdGNoZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICAvLyBOb3QgcmVxdWlyZWQgZm9yIHNlcnZlcgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBuZWVkIHRvIHdvcmsgdGhlIGV4Y2VwdGlvbiBsb2dpYwotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgWE1MTWVzc2FnZSB4bWxNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHhtbE1lc3NhZ2UgPSBnZXRYTUxNZXNzYWdlKG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc2VuZFJlc3BvbnNlRXJyb3IobWVzc2FnZUluZm8sIGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNldCBpdCBiZWZvcmUgcmVzcG9uc2UgaXMgc2VudCBvbiB0cmFuc3BvcnQuIElmIHRyYW5zcG9ydCBjcmVhdGVzCi0gICAgICAgIC8vIGFueSBleGNlcHRpb24sIHRoaXMgY2FuIGJlIHVzZWQgbm90IHRvIHNlbmQgYWdhaW4KLSAgICAgICAgYm9vbGVhbiBzZW50ID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vIElmIEZJIGlzIGFjY2VwdGVkIGJ5IGNsaWVudCwgc2V0IHByb3BlcnR5IHRvIG9wdGltaXN0aWMKLSAgICAgICAgICAgIGlmICh4bWxNZXNzYWdlLmFjY2VwdEZhc3RJbmZvc2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRNZXRhRGF0YShDT05URU5UX05FR09USUFUSU9OX1BST1BFUlRZLCAib3B0aW1pc3RpYyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0ID0gbmV3IFhNTEhhbmRsZXJDb250ZXh0KG1lc3NhZ2VJbmZvLCBudWxsLAotICAgICAgICAgICAgICAgIHhtbE1lc3NhZ2UpOwotICAgICAgICAgICAgdXBkYXRlSGFuZGxlckNvbnRleHQobWVzc2FnZUluZm8sIGNvbnRleHQpOwotCi0KLSAgICAgICAgICAgIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBzaGQgPSBnZXRTeXN0ZW1IYW5kbGVyRGVsZWdhdGUobWVzc2FnZUluZm8pOwotICAgICAgICAgICAgWG1sSW52b2tlciBpbXBsZW1lbnRvciA9IG5ldyBYbWxJbnZva2VyKG1lc3NhZ2VJbmZvLCB4bWxNZXNzYWdlLAotICAgICAgICAgICAgICAgIGNvbnRleHQsIHNoZCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChzaGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2VzIHJlcXVlc3QgaGFuZGxlciBjaGFpbiwgZW5kcG9pbnQsIHJlc3BvbnNlIGhhbmRsZXIgY2hhaW4KLSAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50b3IuaW52b2tlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbnZva2VyKGltcGxlbWVudG9yKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNoZC5wcm9jZXNzUmVxdWVzdChjb250ZXh0LmdldFNIRFhNTE1lc3NhZ2VDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRvci5pbnZva2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoZC5wcm9jZXNzUmVzcG9uc2UoY29udGV4dC5nZXRTSERYTUxNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc2VudCA9IGltcGxlbWVudG9yLmlzU2VudCgpOyAgICAvLyByZXNwb25zZSBpcyBzZW50IG9yIG5vdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFpc09uZXdheShtZXNzYWdlSW5mbykpIHsKLSAgICAgICAgICAgICAgICBzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UobWVzc2FnZUluZm8sIGNvbnRleHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc2VudCkgewotICAgICAgICAgICAgICAgIC8vIE9uZXdheSBhbmQgcmVxdWVzdCBoYW5kbGVyIGNoYWluIHJldmVyc2VkIHRoZSBleGVjdXRpb24gZGlyZWN0aW9uCi0gICAgICAgICAgICAgICAgc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlT25ld2F5KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICBpZiAoIXNlbnQpIHsKLSAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2VFcnJvcihtZXNzYWdlSW5mbywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0IHNlbnQ7ICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJlc3BvbnNlIGlzIHNlbnQKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB0b01lc3NhZ2VJbmZvKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qCi0gICAgICogR2V0cyBYTUxNZXNzYWdlIGZyb20gdGhlIGNvbm5lY3Rpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFhNTE1lc3NhZ2UgZ2V0WE1MTWVzc2FnZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBXU0Nvbm5lY3Rpb24gY29uID0gKFdTQ29ubmVjdGlvbiltZXNzYWdlSW5mby5nZXRDb25uZWN0aW9uKCk7Ci0gICAgICAgIHJldHVybiBYTUxDb25uZWN0aW9uVXRpbC5nZXRYTUxNZXNzYWdlKGNvbiwgbWVzc2FnZUluZm8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIGVuZHBvaW50Ci0gICAgICoKLSAgICAgKiBJbiB0aGlzIGNhc2UsIE9uZXdheSBpcyBrbm93biBvbmx5IGFmdGVyIGludm9raW5nIHRoZSBlbmRwb2ludC4gRm9yIG90aGVyCi0gICAgICogZW5kcG9pbnRzLCB0aGUgSFRUUCByZXNwb25zZSBjb2RlIGlzIHNlbnQgYmVmb3JlIGludm9raW5nIHRoZSBlbmRwb2ludC4KLSAgICAgKiBUaGlzIGlzIHRha2VuIGNhcmUgaGVyZSBhZnRlciBpbnZva2luZyB0aGUgZW5kcG9pbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludm9rZUVuZHBvaW50KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBYTUxIYW5kbGVyQ29udGV4dCBoYykgewotICAgICAgICBUYXJnZXRGaW5kZXIgdGFyZ2V0RmluZGVyID0KLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKS5nZXRUYXJnZXRGaW5kZXIobWVzc2FnZUluZm8pOwotICAgICAgICBUaWUgdGllID0gdGFyZ2V0RmluZGVyLmZpbmRUYXJnZXQobWVzc2FnZUluZm8pOwotICAgICAgICB0aWUuX2ludm9rZShtZXNzYWdlSW5mbyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhNTE1lc3NhZ2UgZ2V0UmVzcG9uc2UoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFhNTEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc2V0UmVzcG9uc2VJbkNvbnRleHQobWVzc2FnZUluZm8sIGNvbnRleHQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSGFuZGxlckNoYWluQ2FsbGVyIGhhbmRsZXJDYWxsZXIgPQotICAgICAgICAgICAgICAgIGdldENhbGxlckZyb21NZXNzYWdlSW5mbyhtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlckNhbGxlciAhPSBudWxsICYmIGhhbmRsZXJDYWxsZXIuaGFzSGFuZGxlcnMoKSkgewotICAgICAgICAgICAgICAgIGludCBtZXNzYWdlVHlwZSA9IG1lc3NhZ2VJbmZvLmdldFJlc3BvbnNlVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PSBNZXNzYWdlSW5mby5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSB8fAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZSA9PSBNZXNzYWdlSW5mby5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FsbEhhbmRsZUZhdWx0KGhhbmRsZXJDYWxsZXIsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxIYW5kbGVyc09uUmVzcG9uc2UoaGFuZGxlckNhbGxlciwgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgYm9vbGVhbiB1c2VGYXN0SW5mb3NldCA9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSkgPT0gIm9wdGltaXN0aWMiOwotICAgICAgICAgICAgWE1MTWVzc2FnZSB4bWxNZXNzYWdlID0gbmV3IFhNTE1lc3NhZ2UoZSwgdXNlRmFzdEluZm9zZXQpOwotICAgICAgICAgICAgY29udGV4dC5zZXRYTUxNZXNzYWdlKHhtbE1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBYTUxNZXNzYWdlIGZyb20gZXhpc3RpbmcgbWVzc2FnZSBhbmQgT1VUQk9VTkQgYXR0YWNobWVudHMgcHJvcGVydHkKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCA9IGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dHMgPSAoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KW1zZ0N0eHQuZ2V0KAotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOwotICAgICAgICBpZiAoYXR0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBYTUxNZXNzYWdlIHhtbE1lc3NhZ2UgPSBjb250ZXh0LmdldFhNTE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhbGxBdHRzID0geG1sTWVzc2FnZS5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgaWYgKGFsbEF0dHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFsbEF0dHMucHV0QWxsKGF0dHMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhbGxBdHRzID0gYXR0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbE1lc3NhZ2UgPSBuZXcgWE1MTWVzc2FnZSh4bWxNZXNzYWdlLmdldFNvdXJjZSgpLCBhbGxBdHRzLAotICAgICAgICAgICAgICAgICAgICB4bWxNZXNzYWdlLmlzRmFzdEluZm9zZXQoKSk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFhNTE1lc3NhZ2UoeG1sTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0WE1MTWVzc2FnZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTWVzc2FnZUluZm8gY29udGFpbnMgdGhlIGVuZHBvaW50IGludm9jYXRpb24gcmVzdWx0cy4gVGhlIGluZm9ybWF0aW9uCi0gICAgICogaXMgY29udmVydGVkIHRvIFhNTE1lc3NhZ2UgYW5kIGlzIHNldCBpbiBIYW5kbGVyQ29udGV4dAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFJlc3BvbnNlSW5Db250ZXh0KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICAgICAgWE1MSGFuZGxlckNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBYTUxNZXNzYWdlIHJlc3BvbnNlIG9uIHRoZSBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRSZXNwb25zZShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgWE1MSGFuZGxlckNvbnRleHQgY3R4dCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBYTUxNZXNzYWdlIHhtbE1lc3NhZ2UgPSBjdHh0LmdldFhNTE1lc3NhZ2UoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCA9IGN0eHQuZ2V0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgV1NDb25uZWN0aW9uIGNvbiA9IG1lc3NhZ2VJbmZvLmdldENvbm5lY3Rpb24oKTsKLQotICAgICAgICAvLyBTZWUgaWYgTWVzc2FnZUNvbnRleHQuSFRUUF9TVEFUVVNfQ09ERSBpcyBwcmVzZW50Ci0gICAgICAgIEludGVnZXIgc3RhdHVzID0gTWVzc2FnZUNvbnRleHRVdGlsLmdldEh0dHBTdGF0dXNDb2RlKG1zZ0N0eHQpOwotICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IChzdGF0dXMgPT0gbnVsbCkgPyB4bWxNZXNzYWdlLmdldFN0YXR1cygpIDogc3RhdHVzOwotCi0KLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7Ci0KLSAgICAgICAgLy8gcHV0IGFsbCBoZWFkZXJzIGZyb20gTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTCi0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gY3R4dEhkcnMgPSBNZXNzYWdlQ29udGV4dFV0aWwuZ2V0SHR0cFJlc3BvbnNlSGVhZGVycyhtc2dDdHh0KTsKLSAgICAgICAgaWYgKGN0eHRIZHJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhlYWRlcnMucHV0QWxsKGN0eHRIZHJzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwdXQgYWxsIGhlYWRlcnMgZnJvbSBYTUxNZXNzYWdlCi0gICAgICAgIE1pbWVIZWFkZXJzIG1ocyA9IHhtbE1lc3NhZ2UuZ2V0TWltZUhlYWRlcnMoKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IG1ocy5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWltZUhlYWRlciBtaCA9IChNaW1lSGVhZGVyKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWguZ2V0TmFtZSgpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IGhlYWRlcnMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgaGVhZGVycy5wdXQobmFtZSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlcy5hZGQobWguZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgSFRUUCBzdGF0dXMgY29kZQotICAgICAgICBjb24uc2V0U3RhdHVzKHN0YXR1c0NvZGUpOwotICAgICAgICAvLyBwdXQgcmVzcG9uc2UgaGVhZGVycyBvbiB0aGUgY29ubmVjdGlvbgotICAgICAgICBjb24uc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICAgICAgLy8gV3JpdGUgY29udGVudHMgb24gdGhlIGNvbm5lY3Rpb24KLSAgICAgICAgeG1sTWVzc2FnZS53cml0ZVRvKGNvbi5nZXRPdXRwdXQoKSk7Ci0gICAgICAgIGNvbi5jbG9zZU91dHB1dCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNlbmRSZXNwb25zZU9uZXdheShNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBXU0Nvbm5lY3Rpb24gY29uID0gKFdTQ29ubmVjdGlvbiltZXNzYWdlSW5mby5nZXRDb25uZWN0aW9uKCk7Ci0gICAgICAgIFhNTENvbm5lY3Rpb25VdGlsLnNlbmRSZXNwb25zZU9uZXdheShjb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kUmVzcG9uc2VFcnJvcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgV1NDb25uZWN0aW9uIGNvbiA9IChXU0Nvbm5lY3Rpb24pbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICBYTUxDb25uZWN0aW9uVXRpbC5zZW5kUmVzcG9uc2VFcnJvcihjb24sIG1lc3NhZ2VJbmZvKTsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgaW5ib3VuZCBoYW5kbGVycy4gSXQgYWxzbyBjYWxscyBvdXRib3VuZCBoYW5kbGVycyBpbmNhc2UgZmxvdyBpcwotICAgICAqIHJldmVyc2VkLiBJZiB0aGUgaGFuZGxlciB0aHJvd3MgYSBQcm90b2NvbEV4Y2VwdGlvbiwgU09BUCBtZXNzYWdlIGlzCi0gICAgICogYWxyZWFkeSBzZXQgaW4gdGhlIGNvbnRleHQuIE90aGVyd2lzZSwgaXQgY3JlYXRlcyBJbnRlcm5hbE1lc3NhZ2UsCi0gICAgICogYW5kIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgU09BUE1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiByZXR1cm5zIHdoZXRoZXIgdG8gaW52b2tlIGVuZHBvaW50IG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FsbEhhbmRsZXJzT25SZXF1ZXN0KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJlc3BvbnNlRXhwZWN0ZWQpIHsKLQotICAgICAgICBib29sZWFuIHNraXBFbmRwb2ludCA9IGZhbHNlOwotICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIgaGFuZGxlckNhbGxlciA9Ci0gICAgICAgICAgICBnZXRDYWxsZXJGcm9tTWVzc2FnZUluZm8obWVzc2FnZUluZm8pOwotCi0gICAgICAgIGlmIChoYW5kbGVyQ2FsbGVyICE9IG51bGwgJiYgaGFuZGxlckNhbGxlci5oYXNIYW5kbGVycygpKSB7Ci0gICAgICAgICAgICBza2lwRW5kcG9pbnQgPSAhaGFuZGxlckNhbGxlci5jYWxsSGFuZGxlcnMoRGlyZWN0aW9uLklOQk9VTkQsCi0gICAgICAgICAgICAgICAgUmVxdWVzdE9yUmVzcG9uc2UuUkVRVUVTVCwgY29udGV4dCwgcmVzcG9uc2VFeHBlY3RlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNraXBFbmRwb2ludDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyB0byBmaW5kIG91dCBpZiBoYW5kbGVycyBhcmUgdGhlcmUgaW4gdGhlIGV4ZWN1dGlvbiBwYXRoIG9yIG5vdAotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBoYW5kbGVycyBpbiBleGVjdXRpb24gcGF0aAotICAgICAqICAgICAgICAgZmFsc3Qgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0hhbmRsZXJzKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBoYW5kbGVyQ2FsbGVyID0KLSAgICAgICAgICAgIGdldENhbGxlckZyb21NZXNzYWdlSW5mbyhtZXNzYWdlSW5mbyk7Ci0gICAgICAgIHJldHVybiAoaGFuZGxlckNhbGxlciAhPSBudWxsICYmIGhhbmRsZXJDYWxsZXIuaGFzSGFuZGxlcnMoKSkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5DYWxsZXIgZ2V0Q2FsbGVyRnJvbU1lc3NhZ2VJbmZvKE1lc3NhZ2VJbmZvIGluZm8pIHsKLSAgICAgICAgSGFuZGxlckNoYWluQ2FsbGVyIGNhbGxlciA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRIYW5kbGVyQ2hhaW5DYWxsZXIoaW5mbyk7Ci0gICAgICAgIGlmIChjYWxsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgUnVudGltZUNvbnRleHQgY29udGV4dCA9IChSdW50aW1lQ29udGV4dCkKLSAgICAgICAgICAgICAgICBpbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfUlVOVElNRV9DT05URVhUKTsKLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGNvbnRleHQuZ2V0UnVudGltZUVuZHBvaW50SW5mbygpLmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgIGNhbGxlciA9IG5ldyBIYW5kbGVyQ2hhaW5DYWxsZXIoYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKSk7Ci0gICAgICAgICAgICBNZXNzYWdlSW5mb1V0aWwuc2V0SGFuZGxlckNoYWluQ2FsbGVyKGluZm8sIGNhbGxlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhbGxlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxsSGFuZGxlcnNPblJlc3BvbnNlKEhhbmRsZXJDaGFpbkNhbGxlciBjYWxsZXIsCi0gICAgICAgIFhNTEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLQotICAgICAgICByZXR1cm4gY2FsbGVyLmNhbGxIYW5kbGVycyhEaXJlY3Rpb24uT1VUQk9VTkQsCi0gICAgICAgICAgICBSZXF1ZXN0T3JSZXNwb25zZS5SRVNQT05TRSwgY29udGV4dCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVXNlZCB3aGVuIHRoZSBlbmRwb2ludCB0aHJvd3MgYW4gZXhjZXB0aW9uLiBIYW5kbGVGYXVsdCBpcyBjYWxsZWQKLSAgICAgKiBvbiB0aGUgc2VydmVyIGhhbmRsZXJzIHJhdGhlciB0aGFuIGhhbmRsZU1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gIGNhbGxIYW5kbGVGYXVsdChIYW5kbGVyQ2hhaW5DYWxsZXIgY2FsbGVyLCBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8qCi0gICAgICAgIHJldHVybiBjYWxsZXIuY2FsbEhhbmRsZUZhdWx0KGNvbnRleHQpOwotICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU2VydmVyIGRvZXMgbm90IGtub3cgaWYgYSBtZXNzYWdlIGlzIG9uZS13YXkgdW50aWwgYWZ0ZXIKLSAgICAgKiB0aGUgaGFuZGxlciBjaGFpbiBoYXMgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdC4gSWYKLSAgICAgKiBpdCBpcyBhIG9uZS13YXkgbWVzc2FnZSwgaGF2ZSB0aGUgaGFuZGxlciBjaGFpbiBjYWxsZXIKLSAgICAgKiBjYWxsIGNsb3NlIG9uIHRoZSBoYW5kbGVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VIYW5kbGVycyhNZXNzYWdlSW5mbyBpbmZvLCBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIEhhbmRsZXJDaGFpbkNhbGxlciBoYW5kbGVyQ2FsbGVyID0gZ2V0Q2FsbGVyRnJvbU1lc3NhZ2VJbmZvKGluZm8pOwotICAgICAgICBpZiAoaGFuZGxlckNhbGxlciAhPSBudWxsICYmIGhhbmRsZXJDYWxsZXIuaGFzSGFuZGxlcnMoKSkgewotICAgICAgICAgICAgaGFuZGxlckNhbGxlci5mb3JjZUNsb3NlSGFuZGxlcnNPblNlcnZlcihjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGYWlsdXJlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHJldHVybiAobWVzc2FnZUluZm8uZ2V0UmVzcG9uc2VUeXBlKCkgPT0gTWVzc2FnZVN0cnVjdC5VTkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPbmV3YXkoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgcmV0dXJuIChtZXNzYWdlSW5mby5nZXRNRVAoKSA9PSBNZXNzYWdlU3RydWN0Lk9ORV9XQVlfTUVQKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldHMgdGhlIFdlYlNlcnZpY2VDb250ZXh0IHdpdGggY29ycmVjdCBNZXNzYWdlQ29udGV4dCB3aGljaCBjb250YWlucwotICAgICAqIEFQUExJQ0FUSU9OIHNjb3BlIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXZWJTZXJ2aWNlQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywgWE1MSGFuZGxlckNvbnRleHQgaGMpIHsKLSAgICAgICAgUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8gPQotICAgICAgICAgICAgTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvKS5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VDb250ZXh0IHdzQ29udGV4dCA9IGVuZHBvaW50SW5mby5nZXRXZWJTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBpZiAod3NDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFwcE1zZ0NvbnRleHRJbXBsIGFwcEN0eHQgPSBuZXcgQXBwTXNnQ29udGV4dEltcGwoaGMuZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICB3c0NvbnRleHQuc2V0TWVzc2FnZUNvbnRleHQoYXBwQ3R4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb3B5IGZyb20gbWVzc2FnZSBpbmZvIHRvIGhhbmRsZXIgY29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVIYW5kbGVyQ29udGV4dChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbywKLSAgICAgICAgICAgIFhNTEhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLQotICAgICAgICBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbyA9Ci0gICAgICAgICAgICBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pLmdldFJ1bnRpbWVFbmRwb2ludEluZm8oKTsKLSAgICAgICAgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0ID0gZW5kcG9pbnRJbmZvLmdldFdlYlNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIGlmICh3c0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRNZXNzYWdlQ29udGV4dCh3c0NvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBnZXRTeXN0ZW1IYW5kbGVyRGVsZWdhdGUoTWVzc2FnZUluZm8gbWkpIHsKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1pKTsKLSAgICAgICAgUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8gPSBydEN0eHQuZ2V0UnVudGltZUVuZHBvaW50SW5mbygpOwotICAgICAgICByZXR1cm4gZW5kcG9pbnRJbmZvLmdldEJpbmRpbmcoKS5nZXRTeXN0ZW1IYW5kbGVyRGVsZWdhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGJyZWFrcyB0aGUgWE1MTWVzc2FnZSBpbnRvIHNvdXJjZSBhbmQgYXR0YWNobWVudHMuIEEgbmV3IFhNTE1lc3NhZ2UKLSAgICAgKiBpcyBjcmVhdGVkIHdpdGggc291cmNlIGFuZCBpcyBzZXQgaW4gWE1MSGFuZGxlckNvbnRleHQuIFRoZSBhdHRhY2htZW50cwotICAgICAqIGFyZSBzZXQgaW4gTWVzc2FnZUNvbnRleHQgYXMgSU5CT1VORCBhdHRhY2htZW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5ib3VuZEF0dGFjaG1lbnRzKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChoYXNIYW5kbGVycyhtZXNzYWdlSW5mbykpIHsKLSAgICAgICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSA9IGNvbnRleHQuZ2V0WE1MTWVzc2FnZSgpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dHMgPSB4bWxNZXNzYWdlLmdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXR0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCA9IGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBtc2dDdHh0LnB1dChNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMsIGF0dHMpOwotICAgICAgICAgICAgICAgIG1zZ0N0eHQuc2V0U2NvcGUoTWVzc2FnZUNvbnRleHQuSU5CT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTLCBNZXNzYWdlQ29udGV4dC5TY29wZS5BUFBMSUNBVElPTik7Ci0gICAgICAgICAgICAgICAgeG1sTWVzc2FnZSA9IG5ldyBYTUxNZXNzYWdlKHhtbE1lc3NhZ2UuZ2V0U291cmNlKCksIHhtbE1lc3NhZ2UuaXNGYXN0SW5mb3NldCgpKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFhNTE1lc3NhZ2UoeG1sTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgWE1MTWVzc2FnZSBmcm9tIGV4aXN0aW5nIHNvdXJjZSBhbmQgaW5ib3VuZCBhdHRhY2htZW50cy4KLSAgICAgKiBpbmJvdW5kIGF0dGFjaGVtZW50cyBjYW5ub3QgYmUgdGhlcmUgaWYgdGhlcmUgYXJlIG5vIGhhbmRsZXJzLgotICAgICAqIElmIHRoZSBlbmRwb2ludCBpcyBQcm92aWRlcjxTb3VyY2U+LCBpdCBkb2Vzbid0IGNyZWF0ZSBhIG5ldyBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW5ib3VuZEF0dGFjaG1lbnRzKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLCBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChoYXNIYW5kbGVycyhtZXNzYWdlSW5mbykpIHsKLSAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbyA9IHJ0Q3R4dC5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCk7Ci0gICAgICAgICAgICBQcm92aWRlck1vZGVsIG1vZGVsID0gZW5kcG9pbnRJbmZvLmdldFByb3ZpZGVyTW9kZWwoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNTb3VyY2UgPSBtb2RlbC5pc1NvdXJjZSgpOwotICAgICAgICAgICAgaWYgKCFpc1NvdXJjZSkgewotICAgICAgICAgICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSA9IGNvbnRleHQuZ2V0WE1MTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQgPSBjb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGF0dHMgPSAoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KQotICAgICAgICAgICAgICAgICAgICBtc2dDdHh0LmdldChNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOwotICAgICAgICAgICAgICAgIHhtbE1lc3NhZ2UgPSBuZXcgWE1MTWVzc2FnZSh4bWxNZXNzYWdlLmdldFNvdXJjZSgpLCBhdHRzLCB4bWxNZXNzYWdlLmlzRmFzdEluZm9zZXQoKSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRYTUxNZXNzYWdlKHhtbE1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyByZXF1ZXN0IGhhbmRsZXIgY2hhaW4sIGVuZHBvaW50IGFuZCByZXNwb25zZSBoYW5kbGVyIGNoYWluLgotICAgICAqIFNlcGFyYXRlZCBhcyBhIHNlcGFyYXRlIGNsYXNzLCBzbyB0aGF0IFNIRCBjYW4gY2FsbCB0aGlzIGluIGRvUHJpdigpCi0gICAgICogYmxvY2suCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBYbWxJbnZva2VyIGltcGxlbWVudHMgSW52b2tlciB7Ci0KLSAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm87Ci0gICAgICAgIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZTsKLSAgICAgICAgWE1MSGFuZGxlckNvbnRleHQgY29udGV4dDsKLSAgICAgICAgU3lzdGVtSGFuZGxlckRlbGVnYXRlIHNoZDsKLSAgICAgICAgYm9vbGVhbiBzZW50OwotCi0gICAgICAgIFhtbEludm9rZXIoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFhNTE1lc3NhZ2UgeG1sTWVzc2FnZSwKLSAgICAgICAgICAgICAgICBYTUxIYW5kbGVyQ29udGV4dCBjb250ZXh0LCBTeXN0ZW1IYW5kbGVyRGVsZWdhdGUgc2hkKSB7Ci0gICAgICAgICAgICB0aGlzLm1lc3NhZ2VJbmZvID0gbWVzc2FnZUluZm87Ci0gICAgICAgICAgICB0aGlzLnhtbE1lc3NhZ2UgPSB4bWxNZXNzYWdlOwotICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgICAgIHRoaXMuc2hkID0gc2hkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW52b2tlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBib29sZWFuIHNraXBFbmRwb2ludCA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBTZXRzIElOQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyBpbiBNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgc2V0SW5ib3VuZEF0dGFjaG1lbnRzKG1lc3NhZ2VJbmZvLCBjb250ZXh0KTsKLSAgICAgICAgICAgIC8vIENhbGwgaW5ib3VuZCBoYW5kbGVycy4gSXQgYWxzbyBjYWxscyBvdXRib3VuZCBoYW5kbGVycyBpbmNhc2Ugb2YKLSAgICAgICAgICAgIC8vIHJldmVyc2FsIG9mIGZsb3cuCi0gICAgICAgICAgICBza2lwRW5kcG9pbnQgPSBjYWxsSGFuZGxlcnNPblJlcXVlc3QobWVzc2FnZUluZm8sIGNvbnRleHQsIHRydWUpOwotCi0gICAgICAgICAgICBpZiAoIXNraXBFbmRwb2ludCkgewotICAgICAgICAgICAgICAgIC8vIG5ldyBYTUxNZXNzYWdlIGlzIGNyZWF0ZWQgdXNpbmcgSU5CT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTCi0gICAgICAgICAgICAgICAgLy8gaW4gTWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICBwcm9jZXNzSW5ib3VuZEF0dGFjaG1lbnRzKG1lc3NhZ2VJbmZvLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICB0b01lc3NhZ2VJbmZvKG1lc3NhZ2VJbmZvLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRmFpbHVyZShtZXNzYWdlSW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNoZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaGQucHJlSW52b2tlRW5kcG9pbnRIb29rKGNvbnRleHQuZ2V0U0hEWE1MTWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlV2ViU2VydmljZUNvbnRleHQobWVzc2FnZUluZm8sIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBpbnZva2VFbmRwb2ludChtZXNzYWdlSW5mbywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAvLyBGb3IgUHJvdmlkZXIgZW5kcG9pbnRzIE9uZXdheSBpcyBrbm93biBvbmx5IGFmdGVyIGV4ZWN1dGluZyBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbnQgJiYgaXNPbmV3YXkobWVzc2FnZUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZU9uZXdheShtZXNzYWdlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNPbmV3YXkobWVzc2FnZUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhaWx1cmUobWVzc2FnZUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGxvZyB0aGUgZXJyb3IuIE5vdCBtdWNoIHRvIGRvCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVIYW5kbGVyQ29udGV4dChtZXNzYWdlSW5mbywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbE1lc3NhZ2UgPSBnZXRSZXNwb25zZShtZXNzYWdlSW5mbywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0WE1MTWVzc2FnZSh4bWxNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgZGlzcGF0Y2ggbWV0aG9kIGluIHRoZSBlbmRwb2ludCBmb3IgdGhlIHBheWxvYWQncyBRTmFtZQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIGRpc3BhdGNoIG1ldGhvZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoUU5hbWUgbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIFByb3ZpZGVyUGVwdFRpZS5pbnZva2VfTWV0aG9kOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSXMgdGhlIG1lc3NhZ2Ugc2VudCBvbiB0cmFuc3BvcnQuIEhhcHBlbnMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIG9uZXdheQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgc2VudAotICAgICAgICAgKiAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VudDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9BZGRyZXNzaW5nTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9BZGRyZXNzaW5nTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmY2MGNjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0FkZHJlc3NpbmdNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBZGRyZXNzaW5nTWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuYWRkcmVzc2luZyIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTk9OX0FOT05ZTU9VU19SRVNQT05TRV9PTkVXQVkoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJub25Bbm9ueW1vdXMucmVzcG9uc2Uub25ld2F5Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3Jpbmcgbm9uLWFub255bW91cyByZXNwb25zZSBmb3Igb25lLXdheSBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOT05fQU5PTllNT1VTX1JFU1BPTlNFX09ORVdBWSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5PTl9BTk9OWU1PVVNfUkVTUE9OU0VfT05FV0FZKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOVUxMX1dTQV9IRUFERVJTKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibnVsbC53c2EuaGVhZGVycyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIFdTLUFkZHJlc3NpbmcgaGVhZGVycyBmb3VuZCBwcm9jZXNzaW5nIHRoZSBzZXJ2ZXIgaW5ib3VuZCByZXF1ZXN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOVUxMX1dTQV9IRUFERVJTKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTlVMTF9XU0FfSEVBREVSUygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVU5LTk9XTl9XU0FfSEVBREVSKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidW5rbm93bi53c2EuaGVhZGVyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5rbm93biBXUy1BZGRyZXNzaW5nIGhlYWRlcgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVU5LTk9XTl9XU0FfSEVBREVSKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVU5LTk9XTl9XU0FfSEVBREVSKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOVUxMX0FDVElPTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm51bGwuYWN0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGluZyByZXF1ZXN0IEFkZHJlc3NpbmcgaGVhZGVycyBhbmQgZm91bmQgbnVsbCBBY3Rpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfQUNUSU9OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTlVMTF9BQ1RJT04oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVkFMSURfV1NBV19BTk9OWU1PVVMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQud3Nhdy5hbm9ueW1vdXMiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIHZhbHVlIG9idGFpbmVkIGZyb20gd3NhdzpBbm9ueW1vdXM6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1dTQVdfQU5PTllNT1VTKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX1dTQVdfQU5PTllNT1VTKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTlVMTF9TT0FQX1ZFUlNJT04oKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJudWxsLnNvYXAudmVyc2lvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuZXhwZWN0ZWQgbnVsbCBTT0FQIHZlcnNpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfU09BUF9WRVJTSU9OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTlVMTF9TT0FQX1ZFUlNJT04oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExfQk9VTkRfT1BFUkFUSU9OX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbEJvdW5kT3BlcmF0aW9uLm5vdEZvdW5kIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2Fubm90IGZpbmQgYW4gb3BlcmF0aW9uIGluIHdzZGw6YmluZGluZyBmb3IgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfQk9VTkRfT1BFUkFUSU9OX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETF9CT1VORF9PUEVSQVRJT05fTk9UX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTk9OX0FOT05ZTU9VU19SRVNQT05TRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vbkFub255bW91cy5yZXNwb25zZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRpbmcgMjAyIGFuZCBwcm9jZXNzaW5nIG5vbi1hbm9ueW1vdXMgcmVzcG9uc2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PTl9BTk9OWU1PVVNfUkVTUE9OU0UoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVOT05fQU5PTllNT1VTX1JFU1BPTlNFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVWQUxJREFUSU9OX1NFUlZFUl9OVUxMX0FDVElPTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24uc2VydmVyLm51bGxBY3Rpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0aW5nIGluYm91bmQgQWRkcmVzc2luZyBoZWFkZXJzIG9uIHNlcnZlciBhbmQgZm91bmQgbnVsbCBBY3Rpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fU0VSVkVSX05VTExfQUNUSU9OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9TRVJWRVJfTlVMTF9BQ1RJT04oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUZBVUxUX1RPX0NBTk5PVF9QQVJTRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImZhdWx0VG8uY2Fubm90LnBhcnNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmF1bHRUbyBoZWFkZXIgY2Fubm90IGJlIHBhcnNlZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRkFVTFRfVE9fQ0FOTk9UX1BBUlNFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRkFVTFRfVE9fQ0FOTk9UX1BBUlNFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVWQUxJREFUSU9OX0NMSUVOVF9OVUxMX0FDVElPTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInZhbGlkYXRpb24uY2xpZW50Lm51bGxBY3Rpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0aW5nIGluYm91bmQgQWRkcmVzc2luZyBoZWFkZXJzIG9uIGNsaWVudCBhbmQgZm91bmQgbnVsbCBBY3Rpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fQ0xJRU5UX05VTExfQUNUSU9OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVkFMSURBVElPTl9DTElFTlRfTlVMTF9BQ1RJT04oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5VTExfTUVTU0FHRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm51bGwubWVzc2FnZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE51bGwgbWVzc2FnZSBmb3VuZCB3aGVuIHByb2Nlc3NpbmcgdGhlIHNlcnZlciBpbmJvdW5kIHJlcXVlc3QgYW5kIFdTLUFkZHJlc3NpbmcgaXMgcmVxdWlyZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfTUVTU0FHRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5VTExfTUVTU0FHRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTk9OX0FOT05ZTU9VU19SRVNQT05TRV9OVUxMX0hFQURFUlMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vbkFub255bW91cy5yZXNwb25zZS5udWxsSGVhZGVycyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIHJlc3BvbnNlIGhlYWRlcnMgZm91bmQgaW4gbm9uLWFub255bW91cyByZXNwb25zZSBmcm9tICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOT05fQU5PTllNT1VTX1JFU1BPTlNFX05VTExfSEVBREVSUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTk9OX0FOT05ZTU9VU19SRVNQT05TRV9OVUxMX0hFQURFUlMoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOT05fQU5PTllNT1VTX1JFU1BPTlNFX1NFTkRJTkcoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vbkFub255bW91cy5yZXNwb25zZS5zZW5kaW5nIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZGluZyBub24tYW5vbnltb3VzIHJlcGx5IHRvICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOT05fQU5PTllNT1VTX1JFU1BPTlNFX1NFTkRJTkcoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5PTl9BTk9OWU1PVVNfUkVTUE9OU0VfU0VORElORyhhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJFUExZX1RPX0NBTk5PVF9QQVJTRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJlcGx5VG8uY2Fubm90LnBhcnNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbHlUbyBoZWFkZXIgY2Fubm90IGJlIHBhcnNlZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVQTFlfVE9fQ0FOTk9UX1BBUlNFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUkVQTFlfVE9fQ0FOTk9UX1BBUlNFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0FXX0FOT05ZTU9VU19QUk9ISUJJVEVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3Nhdy5hbm9ueW1vdXNQcm9oaWJpdGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlcmF0aW9uIGhhcyAicHJvaGliaXRlZCIgdmFsdWUgZm9yIHdzYXc6YW5vbnltb3VzIGluIHRoZSBXU0RMLCBBZGRyZXNzaW5nIG11c3QgYmUgZGlzYWJsZWQgYW5kIFNPQVAgbWVzc2FnZSBuZWVkIHRvIGJlIGhhbmQtY3JhZnRlZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NBV19BTk9OWU1PVVNfUFJPSElCSVRFRCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTQVdfQU5PTllNT1VTX1BST0hJQklURUQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5VTExfV1NETF9QT1JUKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibnVsbC53c2RsUG9ydCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRpbmcgcmVxdWVzdCBBZGRyZXNzaW5nIGhlYWRlcnMgYW5kIGZvdW5kIG51bGwgV1NETFBvcnQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfV1NETF9QT1JUKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTlVMTF9XU0RMX1BPUlQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5VTExfQUREUkVTU0lOR19WRVJTSU9OKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibnVsbC5hZGRyZXNzaW5nLnZlcnNpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmV4cGVjdGVkIG51bGwgQWRkcmVzc2luZyB2ZXJzaW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOVUxMX0FERFJFU1NJTkdfVkVSU0lPTigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5VTExfQUREUkVTU0lOR19WRVJTSU9OKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOVUxMX1BBQ0tFVCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm51bGwucGFja2V0Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGluZyByZXF1ZXN0IEFkZHJlc3NpbmcgaGVhZGVycyBhbmQgZm91bmQgbnVsbCBQYWNrZXQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfUEFDS0VUKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTlVMTF9QQUNLRVQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdST05HX0FERFJFU1NJTkdfVkVSU0lPTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndyb25nLmFkZHJlc3NpbmcudmVyc2lvbiIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGVjdGVkICJ7MH0iIHZlcnNpb24gb2YgV1MtQWRkcmVzc2luZyBidXQgZm91bmQgInsxfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdST05HX0FERFJFU1NJTkdfVkVSU0lPTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdST05HX0FERFJFU1NJTkdfVkVSU0lPTihhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUFERFJFU1NJTkdfTk9UX0VOQUJMRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImFkZHJlc3Npbmcubm90RW5hYmxlZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHJlc3NpbmcgaXMgbm90IGVuYWJsZWQsIHswfSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBwaXBlbGluZSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERFJFU1NJTkdfTk9UX0VOQUJMRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUFERFJFU1NJTkdfTk9UX0VOQUJMRUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOT05fQU5PTllNT1VTX1VOS05PV05fUFJPVE9DT0woT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vbkFub255bW91cy51bmtub3duLnByb3RvY29sIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5rbm93biBwcm90b2NvbDogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PTl9BTk9OWU1PVVNfVU5LTk9XTl9QUk9UT0NPTChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTk9OX0FOT05ZTU9VU19VTktOT1dOX1BST1RPQ09MKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTk9OX0FOT05ZTU9VU19SRVNQT05TRV9OVUxMX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vbkFub255bW91cy5yZXNwb25zZS5udWxsTWVzc2FnZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIG1lc3NhZ2UgZm9yIG5vbi1hbm9ueW1vdXMgcmVzcG9uc2UgZnJvbSAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9OX0FOT05ZTU9VU19SRVNQT05TRV9OVUxMX01FU1NBR0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5PTl9BTk9OWU1PVVNfUkVTUE9OU0VfTlVMTF9NRVNTQUdFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTlVMTF9IRUFERVJTKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibnVsbC5oZWFkZXJzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gaGVhZGVycyBmb3VuZCB3aGVuIHByb2Nlc3NpbmcgdGhlIHNlcnZlciBpbmJvdW5kIHJlcXVlc3QgYW5kIFdTLUFkZHJlc3NpbmcgaXMgcmVxdWlyZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfSEVBREVSUygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5VTExfSEVBREVSUygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTlVMTF9CSU5ESU5HKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibnVsbC5iaW5kaW5nIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGluZyByZXF1ZXN0IEFkZHJlc3NpbmcgaGVhZGVycyBhbmQgZm91bmQgbnVsbCBCaW5kaW5nCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOVUxMX0JJTkRJTkcoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVOVUxMX0JJTkRJTkcoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvQ2xpZW50TWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9DbGllbnRNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNmM0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvQ2xpZW50TWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXM7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKKworCisvKioKKyAqIERlZmluZXMgc3RyaW5nIGZvcm1hdHRpbmcgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGluIHRoZSByZXNvdXJjZSBmaWxlCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xpZW50TWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuY2xpZW50Iik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVGQUlMRURfVE9fUEFSU0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJmYWlsZWQudG8ucGFyc2UiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsZWQgdG8gYWNjZXNzIHRoZSBXU0RMIGF0OiB7MH0uIEl0IGZhaWxlZCB3aXRoOgorICAgICAqICB7MX0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBGQUlMRURfVE9fUEFSU0UoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVGQUlMRURfVE9fUEFSU0UoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX0JJTkRJTkdfSUQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLmJpbmRpbmcuaWQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIGJpbmRpbmcgaWQ6IHswfS4gTXVzdCBiZTogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX0JJTkRJTkdfSUQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX0JJTkRJTkdfSUQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUFJfV0lUSE9VVF9BRERSRVNTSU5HX09OKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXByLndpdGhvdXQuYWRkcmVzc2luZy5vbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVQUiBpcyBzcGVjaWZpZWQgd2l0aG91dCBlbmFibGluZyBXUy1BZGRyZXNzaW5nIHN1cHBvcnQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUFJfV0lUSE9VVF9BRERSRVNTSU5HX09OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVBSX1dJVEhPVVRfQUREUkVTU0lOR19PTigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9TRVJWSUNFX05PX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQuc2VydmljZS5uby53c2RsIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gd3NkbCBtZXRhZGF0YSBmb3Igc2VydmljZTogezB9LCBjYW4ndCBjcmVhdGUgcHJveHkhIFRyeSBjcmVhdGluZyBTZXJ2aWNlIGJ5IHByb3ZpZGluZyBhIFdTREwgVVJMCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1NFUlZJQ0VfTk9fV1NETChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WQUxJRF9TRVJWSUNFX05PX1dTREwoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX1NPQVBfUk9MRV9OT05FKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC5zb2FwLnJvbGUubm9uZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbm5vdCBzZXQgU09BUCAxLjIgcm9sZSAibm9uZSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfU09BUF9ST0xFX05PTkUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX1NPQVBfUk9MRV9OT05FKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVVTkRFRklORURfQklORElORyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidW5kZWZpbmVkLmJpbmRpbmciLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmRlZmluZWQgYmluZGluZzogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVTkRFRklORURfQklORElORyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVU5ERUZJTkVEX0JJTkRJTkcoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVFRQX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHR0cC5ub3QuZm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIVFRQIFN0YXR1cy1Db2RlIDQwNDogTm90IEZvdW5kIC0gezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSFRUUF9OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVFRQX0NMSUVOVF9DQU5OT1RfQ09OTkVDVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHR0cC5jbGllbnQuY2Fubm90LmNvbm5lY3QiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYW5ub3QgY29ubmVjdCB0byBzZXJ2ZXI6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9DTElFTlRfQ0FOTk9UX0NPTk5FQ1QoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUVFBfQ0xJRU5UX0NBTk5PVF9DT05ORUNUKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9FUFJfUE9SVF9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC5lcHIucG9ydC5uYW1lIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5kcG9pbnQgTmFtZSBzcGVjaWZpZWQgaW4gRVBSIHswfSAgaXMgbm90IGEgV1NETCBwb3J0IFFOYW1lLCB2YWxpZCBQb3J0cyBhcmUgezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX0VQUl9QT1JUX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX0VQUl9QT1JUX05BTUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVGQUlMRURfVE9fUEFSU0VfV0lUSF9NRVgoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZmFpbGVkLnRvLnBhcnNlV2l0aE1FWCIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWxlZCB0byBhY2Nlc3MgdGhlIFdTREwgYXQ6IHswfS4gSXQgZmFpbGVkIHdpdGg6CisgICAgICogIHsxfS4KKyAgICAgKiBSZXRyeWluZyB3aXRoIE1FWCBnYXZlOgorICAgICAqICB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZBSUxFRF9UT19QQVJTRV9XSVRIX01FWChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVGQUlMRURfVE9fUEFSU0VfV0lUSF9NRVgoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVFRQX1NUQVRVU19DT0RFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHR0cC5zdGF0dXMuY29kZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2ZXIgc2VudCBIVFRQIHN0YXR1cyBjb2RlIHswfTogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX1NUQVRVU19DT0RFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSFRUUF9TVEFUVVNfQ09ERShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVkFMSURfQUREUkVTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC5hZGRyZXNzIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBhZGRyZXNzOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfQUREUkVTUyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WQUxJRF9BRERSRVNTKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVU5ERUZJTkVEX1BPUlRfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidW5kZWZpbmVkLnBvcnRUeXBlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5kZWZpbmVkIHBvcnQgdHlwZTogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVTkRFRklORURfUE9SVF9UWVBFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVVTkRFRklORURfUE9SVF9UWVBFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9TT0FQX0FDVElPTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQuc29hcC5hY3Rpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZhbGlkIFNPQVBBY3Rpb24gc2hvdWxkIGJlIHNldCBpbiB0aGUgUmVxdWVzdENvbnRleHQgd2hlbiBBZGRyZXNzaW5nIGlzIGVuYWJsZWQsIFVzZSBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFkgdG8gc2V0IGl0LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9TT0FQX0FDVElPTigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfU09BUF9BQ1RJT04oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5PTl9MT0dJQ0FMX0hBTkRMRVJfU0VUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJub24ubG9naWNhbC5oYW5kbGVyLnNldCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbm5vdCBzZXQgezB9IG9uIGJpbmRpbmcuIEhhbmRsZXIgbXVzdCBiZSBhIExvZ2ljYWxIYW5kbGVyLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9OX0xPR0lDQUxfSEFORExFUl9TRVQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5PTl9MT0dJQ0FMX0hBTkRMRVJfU0VUKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTE9DQUxfQ0xJRU5UX0ZBSUxFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibG9jYWwuY2xpZW50LmZhaWxlZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxvY2FsIHRyYW5zcG9ydCBlcnJvcjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTF9DTElFTlRfRkFJTEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVMT0NBTF9DTElFTlRfRkFJTEVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9XU0RMUEFSU0VSX0lOVkFMSURfV1NETChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLCBPYmplY3QgYXJnMykgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS53c2RscGFyc2VyLmludmFsaWRXU0RMIiwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBXU0RMIHswfSwgZXhwZWN0ZWQgezF9IGZvdW5kIHsyfSBhdCAobGluZXszfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfV1NETFBBUlNFUl9JTlZBTElEX1dTREwoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwgT2JqZWN0IGFyZzMpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfV1NETFBBUlNFUl9JTlZBTElEX1dTREwoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU0RMX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbC5ub3QuZm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU0RMIHVybCB7MH0gaXMgbm90IGFjY2Vzc2libGUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NETF9OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVFRQX0NMSUVOVF9GQUlMRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImh0dHAuY2xpZW50LmZhaWxlZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhUVFAgdHJhbnNwb3J0IGVycm9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUVFBfQ0xJRU5UX0ZBSUxFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSFRUUF9DTElFTlRfRkFJTEVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSFRUUF9DTElFTlRfQ0FOTk9UX0NSRUFURV9NRVNTQUdFX0ZBQ1RPUlkoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodHRwLmNsaWVudC5jYW5ub3RDcmVhdGVNZXNzYWdlRmFjdG9yeSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNhbm5vdCBjcmVhdGUgbWVzc2FnZSBmYWN0b3J5CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX0NMSUVOVF9DQU5OT1RfQ1JFQVRFX01FU1NBR0VfRkFDVE9SWSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUVFBfQ0xJRU5UX0NBTk5PVF9DUkVBVEVfTUVTU0FHRV9GQUNUT1JZKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX1NFUlZJQ0VfTkFNRV9OVUxMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLnNlcnZpY2UubmFtZS5udWxsIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogezB9IGlzIG5vdCBhIHZhbGlkIHNlcnZpY2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfU0VSVklDRV9OQU1FX05VTEwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfU0VSVklDRV9OQU1FX05VTEwoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX1dTRExfVVJMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLndzZGwudXJsIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBXU0RMIFVSTDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1dTRExfVVJMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX1dTRExfVVJMKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSFRUUF9DTElFTlRfVU5BVVRIT1JJWkVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodHRwLmNsaWVudC51bmF1dGhvcml6ZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXF1ZXN0IHJlcXVpcmVzIEhUVFAgYXV0aGVudGljYXRpb246IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9DTElFTlRfVU5BVVRIT1JJWkVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVIVFRQX0NMSUVOVF9VTkFVVEhPUklaRUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX1BPUlRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQucG9ydC5uYW1lIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogezB9IGlzIG5vdCBhIHZhbGlkIHBvcnQuIFZhbGlkIHBvcnRzIGFyZTogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1BPUlRfTkFNRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfUE9SVF9OQU1FKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9TRVJWSUNFX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLnNlcnZpY2UubmFtZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHswfSBpcyBub3QgYSB2YWxpZCBzZXJ2aWNlLiBWYWxpZCBzZXJ2aWNlcyBhcmU6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9TRVJWSUNFX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX1NFUlZJQ0VfTkFNRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVVOU1VQUE9SVEVEX09QRVJBVElPTihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ1bnN1cHBvcnRlZC5vcGVyYXRpb24iLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7MH0gbm90IHN1cHBvcnRlZCB3aXRoIHsxfS4gTXVzdCBiZTogezJ9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVTlNVUFBPUlRFRF9PUEVSQVRJT04oT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVU5TVVBQT1JURURfT1BFUkFUSU9OKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRkFJTEVEX1RPX1BBUlNFX0VQUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZmFpbGVkLnRvLnBhcnNlLmVwciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWxlZCB0byBwYXJzZSBFUFI6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRkFJTEVEX1RPX1BBUlNFX0VQUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRkFJTEVEX1RPX1BBUlNFX0VQUihhcmcwKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvRGlzcGF0Y2hNZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0Rpc3BhdGNoTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFiODdiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0Rpc3BhdGNoTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXM7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKKworCisvKioKKyAqIERlZmluZXMgc3RyaW5nIGZvcm1hdHRpbmcgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGluIHRoZSByZXNvdXJjZSBmaWxlCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGlzcGF0Y2hNZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5kaXNwYXRjaCIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9OVUxMQVJHX1hNTEhUVFBfUkVRVUVTVF9NRVRIT0QoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLm51bGxhcmcueG1saHR0cC5yZXF1ZXN0Lm1ldGhvZCIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgWE1ML0hUVFAgcmVxdWVzdCB1c2luZyBNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9EIGVxdWFscyB7MH0gd2l0aCBhIE51bGwgaW52b2NhdGlvbiBBcmd1bWVudCBpcyBub3QgYWxsb3dlZC4gTXVzdCBiZTogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX05VTExBUkdfWE1MSFRUUF9SRVFVRVNUX01FVEhPRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfTlVMTEFSR19YTUxIVFRQX1JFUVVFU1RfTUVUSE9EKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9TT0FQTUVTU0FHRV9ESVNQQVRDSF9NU0dNT0RFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC5zb2FwbWVzc2FnZS5kaXNwYXRjaC5tc2dtb2RlIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuIG5vdCBjcmVhdGUgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IG9mIHswfS4gTXVzdCBiZSB7MX0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1NPQVBNRVNTQUdFX0RJU1BBVENIX01TR01PREUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX1NPQVBNRVNTQUdFX0RJU1BBVENIX01TR01PREUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX1JFU1BPTlNFX0RFU0VSSUFMSVpBVElPTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQucmVzcG9uc2UuZGVzZXJpYWxpemF0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbGVkIHRvIGRlc2VyaWFsaXplIHRoZSByZXNwb25zZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfUkVTUE9OU0VfREVTRVJJQUxJWkFUSU9OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WQUxJRF9SRVNQT05TRV9ERVNFUklBTElaQVRJT04oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVkFMSURfUVVFUllfTEVBRElOR19DSEFSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLnF1ZXJ5LmxlYWRpbmcuY2hhciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlYWRpbmcgJz8nIG9mIE1lc3NhZ2VDb250ZXh0LlFVRVJZX1NUUklORzogezB9IGlzIG5vdCB2YWxpZC4gUmVtb3ZlICc/JyBhbmQgcnVuIGFnYWluLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9RVUVSWV9MRUFESU5HX0NIQVIoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfUVVFUllfTEVBRElOR19DSEFSKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9RVUVSWV9TVFJJTkcoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQucXVlcnkuc3RyaW5nIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5hYmxlIHRvIHJlc29sdmUgZW5kcG9pbnQgYWRkcmVzcyB1c2luZyB0aGUgc3VwcGxpZWQgcXVlcnkgc3RyaW5nOiB7MH0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1FVRVJZX1NUUklORyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WQUxJRF9RVUVSWV9TVFJJTkcoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVEVVBMSUNBVEVfUE9SVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZHVwbGljYXRlLnBvcnQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU0RMUG9ydCB7MH0gYWxyZWFkeSBleGlzdHMuIENhbiBub3QgY3JlYXRlIGEgcG9ydCBvZiB0aGUgc2FtZSBRTmFtZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERVUExJQ0FURV9QT1JUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVEVVBMSUNBVEVfUE9SVChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVkFMSURfREFUQVNPVVJDRV9ESVNQQVRDSF9CSU5ESU5HKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC5kYXRhc291cmNlLmRpc3BhdGNoLmJpbmRpbmciLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW4gbm90IGNyZWF0ZSBEaXNwYXRjaDxEYXRhU291cmNlPiB3aXRoIHswfS4gTXVzdCBiZTogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX0RBVEFTT1VSQ0VfRElTUEFUQ0hfQklORElORyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfREFUQVNPVVJDRV9ESVNQQVRDSF9CSU5ESU5HKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9EQVRBU09VUkNFX0RJU1BBVENIX01TR01PREUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLmRhdGFzb3VyY2UuZGlzcGF0Y2gubXNnbW9kZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbiBub3QgY3JlYXRlIERpc3BhdGNoPERhdGFTb3VyY2U+IG9mIFNlcnZpY2UuTW9kZS5QQVlMT0FEezB9LiBNdXN0IGJlOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfREFUQVNPVVJDRV9ESVNQQVRDSF9NU0dNT0RFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WQUxJRF9EQVRBU09VUkNFX0RJU1BBVENIX01TR01PREUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX05VTExBUkdfU09BUF9NU0dNT0RFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC5udWxsYXJnLnNvYXAubXNnbW9kZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNPQVAvSFRUUCBCaW5kaW5nIGluIHswfSBpcyBub3QgYWxsb3dlZCB3aXRoIGEgbnVsbCBpbnZvY2F0aW9uIGFyZ3VtZW50LiBNdXN0IGJlOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfTlVMTEFSR19TT0FQX01TR01PREUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTlZBTElEX05VTExBUkdfU09BUF9NU0dNT0RFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9VUkkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQudXJpIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5kcG9pbnQgU3RyaW5nOiB7MH0gaXMgYW5kIGludmFsaWQgVVJJLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9VUkkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfVVJJKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9TT0FQTUVTU0FHRV9ESVNQQVRDSF9CSU5ESU5HKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC5zb2FwbWVzc2FnZS5kaXNwYXRjaC5iaW5kaW5nIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuIG5vdCBjcmVhdGUgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IHdpdGggezB9IEJpbmRpbmcuIE11c3QgYmU6IHsxfSBCaW5kaW5nLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9TT0FQTUVTU0FHRV9ESVNQQVRDSF9CSU5ESU5HKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WQUxJRF9TT0FQTUVTU0FHRV9ESVNQQVRDSF9CSU5ESU5HKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9VUklfUEFUSF9RVUVSWShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImludmFsaWQudXJpLnBhdGgucXVlcnkiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmFibGUgdG8gY29uc3RydWN0IGEgVVJJIHdpdGggdGhpcyBwYXRoIGluZm8gezB9IGFuZCB0aGlzIHF1ZXJ5IHN0cmluZyB7MX0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1VSSV9QQVRIX1FVRVJZKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WQUxJRF9VUklfUEFUSF9RVUVSWShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlOVkFMSURfUkVTUE9OU0UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLnJlc3BvbnNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gcmVzcG9uc2UgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1JFU1BPTlNFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5WQUxJRF9SRVNQT05TRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5WQUxJRF9VUklfUkVTT0xVVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW52YWxpZC51cmkucmVzb2x1dGlvbiIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuYWJsZSB0byByZXNvbHZlIGVuZHBvaW50IGFkZHJlc3MgdXNpbmcgdGhlIHN1cHBsaWVkIHBhdGg6IHswfS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfVVJJX1JFU09MVVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfVVJJX1JFU09MVVRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTlZBTElEX1VSSV9ERUNPREUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbnZhbGlkLnVyaS5kZWNvZGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmFibGUgdG8gZGVjb2RlIHRoZSByZXNvbHZlZCBlbmRwb2ludCB1c2luZyBVVEYtOCBlbmNvZGluZy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfVVJJX0RFQ09ERSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlOVkFMSURfVVJJX0RFQ09ERSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9FbmNvZGluZ01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvRW5jb2RpbmdNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTFhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvRW5jb2RpbmdNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbmNvZGluZ01lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLmVuY29kaW5nIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVGQUlMRURfVE9fUkVBRF9SRVNQT05TRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZmFpbGVkLnRvLnJlYWQucmVzcG9uc2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsZWQgdG8gcmVhZCBhIHJlc3BvbnNlOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZBSUxFRF9UT19SRUFEX1JFU1BPTlNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVGQUlMRURfVE9fUkVBRF9SRVNQT05TRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVYQ0VQVElPTl9JTkNPUlJFQ1RfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXhjZXB0aW9uLmluY29ycmVjdFR5cGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgamF2YS5sYW5nLkV4Y2VwdGlvbiwgZm91bmQgezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFWENFUFRJT05fSU5DT1JSRUNUX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVYQ0VQVElPTl9JTkNPUlJFQ1RfVFlQRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVYQ0VQVElPTl9OT1RGT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXhjZXB0aW9uLm5vdGZvdW5kIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXhjZXB0aW9uIGNsYXNzOiB7MH0gbm90IGZvdW5kIGluIHRoZSBtb2RlbCEKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVYQ0VQVElPTl9OT1RGT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVhDRVBUSU9OX05PVEZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWFNEX1VORVhQRUNURURfRUxFTUVOVF9OQU1FKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgieHNkLnVuZXhwZWN0ZWRFbGVtZW50TmFtZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVuZXhwZWN0ZWQgZWxlbWVudCBuYW1lOiBleHBlY3RlZD17MH0sIGFjdHVhbDogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RfVU5FWFBFQ1RFRF9FTEVNRU5UX05BTUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYU0RfVU5FWFBFQ1RFRF9FTEVNRU5UX05BTUUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVORVNURURfREVTRVJJQUxJWkFUSU9OX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJuZXN0ZWREZXNlcmlhbGl6YXRpb25FcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRlc2VyaWFsaXphdGlvbiBlcnJvcjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBORVNURURfREVTRVJJQUxJWkFUSU9OX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVORVNURURfREVTRVJJQUxJWkFUSU9OX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWFNEX1VOS05PV05fUFJFRklYKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4c2QudW5rbm93blByZWZpeCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVua25vd24gcHJlZml4ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RfVU5LTk9XTl9QUkVGSVgoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVhTRF9VTktOT1dOX1BSRUZJWChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5FU1RFRF9FTkNPRElOR19FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibmVzdGVkRW5jb2RpbmdFcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVuY29kaW5nIGVycm9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FU1RFRF9FTkNPRElOR19FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTkVTVEVEX0VOQ09ESU5HX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVU5LTk9XTl9PQkpFQ1QoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ1bmtub3duLm9iamVjdCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRvbid0IGtub3cgaG93IHRvIHdyaXRlIG9iamVjdDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVTktOT1dOX09CSkVDVCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVVOS05PV05fT0JKRUNUKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVJTkNPUlJFQ1RfTUVTU0FHRUlORk8oKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbmNvcnJlY3QubWVzc2FnZWluZm8iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjYW4ndCB3cml0ZSBvYmplY3QhIHVuZXhwZWN0ZWQgdHlwZTogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTkNPUlJFQ1RfTUVTU0FHRUlORk8oKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTkNPUlJFQ1RfTUVTU0FHRUlORk8oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5FU1RFRF9TRVJJQUxJWkFUSU9OX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJuZXN0ZWRTZXJpYWxpemF0aW9uRXJyb3IiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXJpYWxpemF0aW9uIGVycm9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FU1RFRF9TRVJJQUxJWkFUSU9OX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVORVNURURfU0VSSUFMSVpBVElPTl9FUlJPUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5PX1NVQ0hfQ09OVEVOVF9JRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibm9TdWNoQ29udGVudElkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlcmUnJ3Mgbm8gYXR0YWNobWVudCBmb3IgdGhlIGNvbnRlbnQgSUQgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PX1NVQ0hfQ09OVEVOVF9JRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTk9fU1VDSF9DT05URU5UX0lEKGFyZzApKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9IYW5kbGVyTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9IYW5kbGVyTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzA5MGU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL0hhbmRsZXJNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBIYW5kbGVyTWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuaGFuZGxlciIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSEFORExFUl9NRVNTQUdFX0NPTlRFWFRfSU5WQUxJRF9DTEFTUyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImhhbmRsZXIubWVzc2FnZUNvbnRleHQuaW52YWxpZC5jbGFzcyIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqICJ7MH0iIGlzIG5vdCBhbiBhbGxvd2VkIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgInsxfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfTUVTU0FHRV9DT05URVhUX0lOVkFMSURfQ0xBU1MoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVIQU5ETEVSX01FU1NBR0VfQ09OVEVYVF9JTlZBTElEX0NMQVNTKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlQ0FOTk9UX0VYVEVORF9IQU5ETEVSX0RJUkVDVExZKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJjYW5ub3QuZXh0ZW5kLmhhbmRsZXIuZGlyZWN0bHkiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIHswfSBtdXN0IGltcGxlbWVudCBMb2dpY2FsSGFuZGxlciBvciBTT0FQSGFuZGxlci4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENBTk5PVF9FWFRFTkRfSEFORExFUl9ESVJFQ1RMWShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlQ0FOTk9UX0VYVEVORF9IQU5ETEVSX0RJUkVDVExZKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSEFORExFUl9OT1RfVkFMSURfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaGFuZGxlci5ub3QudmFsaWQudHlwZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHswfSBkb2VzIG5vdCBpbXBsZW1lbnQgb25lIG9mIHRoZSBoYW5kbGVyIGludGVyZmFjZXMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX05PVF9WQUxJRF9UWVBFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVIQU5ETEVSX05PVF9WQUxJRF9UWVBFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlQ0FOTk9UX0lOU1RBTlRJQVRFX0hBTkRMRVIoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJjYW5ub3QuaW5zdGFudGlhdGUuaGFuZGxlciIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuYWJsZSB0byBpbnN0YW50aWF0ZSBoYW5kbGVyOiB7MH0gYmVjYXVzZTogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDQU5OT1RfSU5TVEFOVElBVEVfSEFORExFUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUNBTk5PVF9JTlNUQU5USUFURV9IQU5ETEVSKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSEFORExFUl9DSEFJTl9DT05UQUlOU19IQU5ETEVSX09OTFkoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImhhbmRsZXIuY2hhaW4uY29udGFpbnMuaGFuZGxlci5vbmx5IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBIYW5kbGVyQ2hhaW4gY2FuIG9ubHkgY29udGFpbiBIYW5kbGVyIGluc3RhbmNlczogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0NIQUlOX0NPTlRBSU5TX0hBTkRMRVJfT05MWShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSEFORExFUl9DSEFJTl9DT05UQUlOU19IQU5ETEVSX09OTFkoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIQU5ETEVSX05FU1RFRF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaGFuZGxlci5uZXN0ZWRFcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGhhbmRsZXIgZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9ORVNURURfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhBTkRMRVJfTkVTVEVEX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSEFORExFUl9QUkVERVNUUk9ZX0lHTk9SRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaGFuZGxlci5wcmVkZXN0cm95Lmlnbm9yZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4Y2VwdGlvbiBpZ25vcmVkIGZyb20gaW52b2tpbmcgaGFuZGxlciBAUHJlRGVzdHJveSBtZXRob2Q6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9QUkVERVNUUk9ZX0lHTk9SRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSEFORExFUl9QUkVERVNUUk9ZX0lHTk9SRShhcmcwKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvSHR0cHNlcnZlck1lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvSHR0cHNlcnZlck1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YzRkOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9IdHRwc2VydmVyTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBIdHRwc2VydmVyTWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuaHR0cHNlcnZlciIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVU5FWFBFQ1RFRF9IVFRQX01FVEhPRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidW5leHBlY3RlZC5odHRwLm1ldGhvZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbm5vdCBoYW5kbGUgSFRUUCBtZXRob2Q6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVU5FWFBFQ1RFRF9IVFRQX01FVEhPRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVU5FWFBFQ1RFRF9IVFRQX01FVEhPRChhcmcwKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvTW9kZWxlck1lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvTW9kZWxlck1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlOTE2OQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9Nb2RlbGVyTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXM7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKKworCisvKioKKyAqIERlZmluZXMgc3RyaW5nIGZvcm1hdHRpbmcgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGluIHRoZSByZXNvdXJjZSBmaWxlCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTW9kZWxlck1lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLm1vZGVsZXIiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6ZXIgbG9jYWxpemVyID0gbmV3IExvY2FsaXplcigpOworCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5FU1RFRF9NT0RFTEVSX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJuZXN0ZWRNb2RlbGVyRXJyb3IiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBydW50aW1lIG1vZGVsZXIgZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTkVTVEVEX01PREVMRVJfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5FU1RFRF9NT0RFTEVSX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX1dTRkVBVFVSRV9OT19GVFJDT05TVFJVQ1RPUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci53c2ZlYXR1cmUubm8uZnRyY29uc3RydWN0b3IiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0aW9uIHswfSBpcyBub3QgcmVjb2duaXphYmxlLCBhdGxlYXN0IG9uZSBjb25zdHJ1Y3RvciBvZiB7MX0gc2hvdWxkIGJlIG1hcmtlZCB3aXRoIEBGZWF0dXJlQ29uc3RydWN0b3IKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9XU0ZFQVRVUkVfTk9fRlRSQ09OU1RSVUNUT1IoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfV1NGRUFUVVJFX05PX0ZUUkNPTlNUUlVDVE9SKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX1dFQk1FVEhPRF9NVVNUX0JFX1BVQkxJQyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5tb2RlbGVyLndlYm1ldGhvZC5tdXN0LmJlLnB1YmxpYyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBXZWJNZXRob2QgaXMgbm90IGFsbG93ZWQgb24gYSBub24tcHVibGljIG1ldGhvZCB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9XRUJNRVRIT0RfTVVTVF9CRV9QVUJMSUMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9XRUJNRVRIT0RfTVVTVF9CRV9QVUJMSUMoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfV1JBUFBFUl9OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci53cmFwcGVyLm5vdC5mb3VuZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXBwZXIgY2xhc3MgezB9IGlzIG5vdCBmb3VuZC4gSGF2ZSB5b3UgcnVuIEFQVCB0byBnZW5lcmF0ZSB0aGVtPworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9NT0RFTEVSX1dSQVBQRVJfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfV1JBUFBFUl9OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfTVRPTV9DT05GTElDVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci5tdG9tLmNvbmZsaWN0IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXJyb3IgaW4gIEBCaW5kaW5nVHlwZTogTVRPTSBDb25maWd1cmF0aW9uIGluIGJpbmRpbmcgaWRlbnRpZmllciB7MH0gY29uZmxpY3RzIHdpdGggZmVhdHVyZSBATVRPTSB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9NVE9NX0NPTkZMSUNUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX01UT01fQ09ORkxJQ1QoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfRkVBVFVSRV9DT05GTElDVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci5mZWF0dXJlLmNvbmZsaWN0IiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmVhdHVyZSB7MH0gaW4gaW1wbGVtZW50YXRpb24gY29uZmxpY3RzIHdpdGggezF9IGluIFdTREwgY29uZmlndXJhdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9NT0RFTEVSX0ZFQVRVUkVfQ09ORkxJQ1QoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfRkVBVFVSRV9DT05GTElDVChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9XU0ZFQVRVUkVfTU9SRVRIQU5PTkVfRlRSQ09OU1RSVUNUT1IoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJydW50aW1lLm1vZGVsZXIud3NmZWF0dXJlLm1vcmV0aGFub25lLmZ0cmNvbnN0cnVjdG9yIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5ub3RhdGlvbiB7MH0gaXMgaWxsZWdhbCwgT25seSBvbmUgY29uc3RydWN0b3Igb2YgezF9IGNhbiBiZSBtYXJrZWQgYXMgQEZlYXR1cmVDb25zdHJ1Y3RvcgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9NT0RFTEVSX1dTRkVBVFVSRV9NT1JFVEhBTk9ORV9GVFJDT05TVFJVQ1RPUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9XU0ZFQVRVUkVfTU9SRVRIQU5PTkVfRlRSQ09OU1RSVUNUT1IoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOT1RfQV9WQUxJRF9CQVJFX01FVEhPRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vdC5hLnZhbGlkLmJhcmUubWV0aG9kIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU0VJIHswfSBoYXMgbWV0aG9kIHsxfSBhbm5vdGF0ZWQgYXMgQkFSRSBidXQgaXQgaGFzIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyIGJvdW5kIHRvIGJvZHkuIFRoaXMgaXMgaW52YWxpZC4gUGxlYXNlIGFubm90YXRlIHRoZSBtZXRob2Qgd2l0aCBhbm5vdGF0aW9uOiBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGU9U09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PVF9BX1ZBTElEX0JBUkVfTUVUSE9EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTk9UX0FfVkFMSURfQkFSRV9NRVRIT0QoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfTk9fUEFDS0FHRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5tb2RlbGVyLm5vLnBhY2thZ2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIEBXZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZSBtdXN0IGJlIHNwZWNpZmllZCBvbiBjbGFzc2VzIHdpdGggbm8gcGFja2FnZS4gIENsYXNzOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9OT19QQUNLQUdFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfTk9fUEFDS0FHRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9OT19XRUJTRVJWSUNFX0FOTk9UQVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci5uby53ZWJzZXJ2aWNlLmFubm90YXRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBpcyBub3QgcHJlc2VudCBvbiBjbGFzczogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX01PREVMRVJfTk9fV0VCU0VSVklDRV9BTk5PVEFUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfTk9fV0VCU0VSVklDRV9BTk5PVEFUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX09ORVdBWV9PUEVSQVRJT05fTk9fT1VUX1BBUkFNRVRFUlMoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJydW50aW1lLm1vZGVsZXIub25ld2F5Lm9wZXJhdGlvbi5uby5vdXQucGFyYW1ldGVycyIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG9uZXdheSBvcGVyYXRpb24gc2hvdWxkIG5vdCBoYXZlIG91dCBwYXJhbWV0ZXJzIGNsYXNzOiB7MH0gbWV0aG9kOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9PTkVXQVlfT1BFUkFUSU9OX05PX09VVF9QQVJBTUVURVJTKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX09ORVdBWV9PUEVSQVRJT05fTk9fT1VUX1BBUkFNRVRFUlMoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVVTkFCTEVfVE9fQ1JFQVRFX0pBWEJfQ09OVEVYVCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInVuYWJsZS50by5jcmVhdGUuSkFYQkNvbnRleHQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmFibGUgdG8gY3JlYXRlIEpBWEJDb250ZXh0IGR1ZSB0byB0aGUgc2VjdXJpdHkgcmVzdHJpY3Rpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVOQUJMRV9UT19DUkVBVEVfSkFYQl9DT05URVhUKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVU5BQkxFX1RPX0NSRUFURV9KQVhCX0NPTlRFWFQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9OT19PUEVSQVRJT05TKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJydW50aW1lLm1vZGVsZXIubm8ub3BlcmF0aW9ucyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3ZWIgc2VydmljZSBkZWZpbmVkIGJ5IHRoZSBjbGFzcyB7MH0gZG9lcyBub3QgY29udGFpbiBhbnkgdmFsaWQgV2ViTWV0aG9kcy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9OT19PUEVSQVRJT05TKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfTk9fT1BFUkFUSU9OUyhhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9XRUJNRVRIT0RfTVVTVF9CRV9OT05TVEFUSUMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci53ZWJtZXRob2QubXVzdC5iZS5ub25zdGF0aWMiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAV2ViTWV0aG9kIGlzIG5vdCBhbGxvd2VkIG9uIGEgc3RhdGljIG1ldGhvZCB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9XRUJNRVRIT0RfTVVTVF9CRV9OT05TVEFUSUMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9XRUJNRVRIT0RfTVVTVF9CRV9OT05TVEFUSUMoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfTUVUSE9EX05PVF9GT1VORChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci5tZXRob2Qubm90LmZvdW5kIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbWV0aG9kOiB7MH0gY291bGQgbm90IGJlIGZvdW5kIG9uIGNsYXNzOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9NRVRIT0RfTk9UX0ZPVU5EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX01FVEhPRF9OT1RfRk9VTkQoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfQ0xBU1NfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJydW50aW1lLm1vZGVsZXIuY2xhc3Mubm90LmZvdW5kIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xhc3M6IHswfSBjb3VsZCBub3QgYmUgZm91bmQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9DTEFTU19OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9DTEFTU19OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfQ0FOTk9UX0dFVF9TRVJWSUNFX05BTUVfRlJPTV9JTlRFUkZBQ0UoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci5jYW5ub3QuZ2V0LnNlcnZpY2VOYW1lLmZyb20uaW50ZXJmYWNlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcnZpY2VOYW1lIGNhbm5vdCBiZSByZXRyaWV2ZWQgZnJvbSBhbiBpbnRlcmZhY2UuICBjbGFzcyB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9DQU5OT1RfR0VUX1NFUlZJQ0VfTkFNRV9GUk9NX0lOVEVSRkFDRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX0NBTk5PVF9HRVRfU0VSVklDRV9OQU1FX0ZST01fSU5URVJGQUNFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX0VORFBPSU5UX0lOVEVSRkFDRV9OT19XRUJTRVJWSUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJydW50aW1lLm1vZGVsZXIuZW5kcG9pbnQuaW50ZXJmYWNlLm5vLndlYnNlcnZpY2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgRW5kcG9pbnQgSW50ZXJmYWNlOiB7MH0gZG9lcyBub3QgaGF2ZSBXZWJTZXJ2aWNlIEFubm90YXRpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfTU9ERUxFUl9FTkRQT0lOVF9JTlRFUkZBQ0VfTk9fV0VCU0VSVklDRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX0VORFBPSU5UX0lOVEVSRkFDRV9OT19XRUJTRVJWSUNFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX1BPUlROQU1FX1NFUlZJQ0VOQU1FX05BTUVTUEFDRV9NSVNNQVRDSChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUubW9kZWxlci5wb3J0bmFtZS5zZXJ2aWNlbmFtZS5uYW1lc3BhY2UubWlzbWF0Y2giLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBzZXJ2aWNlTmFtZSAiezB9IiBhbmQgdGhlIG5hbWVzcGFjZSBvZiB0aGUgcG9ydE5hbWUgInsxfSIgbXVzdCBtYXRjaAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9NT0RFTEVSX1BPUlROQU1FX1NFUlZJQ0VOQU1FX05BTUVTUEFDRV9NSVNNQVRDSChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfTU9ERUxFUl9QT1JUTkFNRV9TRVJWSUNFTkFNRV9OQU1FU1BBQ0VfTUlTTUFUQ0goYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX01PREVMRVJfV1NGRUFUVVJFX0lMTEVHQUxfRlRSQ09OU1RSVUNUT1IoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJydW50aW1lLm1vZGVsZXIud3NmZWF0dXJlLmlsbGVnYWwuZnRyY29uc3RydWN0b3IiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0aW9uIHswfSBpcyBpbGxlZ2FsLCBJbiB7MX0gQEZlYXR1cmVDb25zdHJ1Y3RvciB2YWx1ZSBkb2VzIG4ndCBtYXRjaCB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9NT0RFTEVSX1dTRkVBVFVSRV9JTExFR0FMX0ZUUkNPTlNUUlVDVE9SKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUlVOVElNRV9NT0RFTEVSX1dTRkVBVFVSRV9JTExFR0FMX0ZUUkNPTlNUUlVDVE9SKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9Qcm92aWRlckFwaU1lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvUHJvdmlkZXJBcGlNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGU5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvUHJvdmlkZXJBcGlNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm92aWRlckFwaU1lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLnByb3ZpZGVyQXBpIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOVUxMX0FERFJFU1NfU0VSVklDRV9FTkRQT0lOVCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm51bGwuYWRkcmVzcy5zZXJ2aWNlLmVuZHBvaW50Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcmVzcyBpbiBhbiBFUFIgY2Fubm90IGJlIG51bGwsIHdoZW4gc2VydmljZU5hbWUgb3IgcG9ydE5hbWUgaXMgbnVsbAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTlVMTF9BRERSRVNTX1NFUlZJQ0VfRU5EUE9JTlQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVOVUxMX0FERFJFU1NfU0VSVklDRV9FTkRQT0lOVCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTlVMTF9TRVJWSUNFKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibnVsbC5zZXJ2aWNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VydmljZU5hbWUgY2FuJ3QgYmUgbnVsbCB3aGVuIHBvcnROYW1lIGlzIHNwZWNpZmllZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTlVMTF9TRVJWSUNFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTlVMTF9TRVJWSUNFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOVUxMX0FERFJFU1MoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJudWxsLmFkZHJlc3MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRyZXNzIGluIGFuIEVQUiBjYW5ub3QgYmUgbnVsbAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTlVMTF9BRERSRVNTKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTlVMTF9BRERSRVNTKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOVUxMX1BPUlROQU1FKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibnVsbC5wb3J0bmFtZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVQUiBkb2VzIG4ndCBoYXZlIEVuZHBvaW50TmFtZSBpbiB0aGUgTWV0YWRhdGEKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfUE9SVE5BTUUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVOVUxMX1BPUlROQU1FKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOT1RGT1VORF9TRVJWSUNFX0lOX1dTREwoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJub3Rmb3VuZC5zZXJ2aWNlLmluLndzZGwiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2aWNlOiB7MH0gbm90IGZvdW5kIGluIFdTREw6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9URk9VTkRfU0VSVklDRV9JTl9XU0RMKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTk9URk9VTkRfU0VSVklDRV9JTl9XU0RMKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTlVMTF9FUFIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJudWxsLmVwciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHBvaW50UmVmZXJlbmNlIGlzIG51bGwKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfRVBSKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTlVMTF9FUFIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5VTExfV1NETCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm51bGwud3NkbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVQUiBkb2VzIG4ndCBoYXZlIFdTREwgTWV0YWRhdGEgd2hpY2ggaXMgbmVlZGVkIGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5VTExfV1NETCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5VTExfV1NETCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTk9URk9VTkRfUE9SVF9JTl9XU0RMKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vdGZvdW5kLnBvcnQuaW4ud3NkbCIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcnQ6IHswfSBub3QgYSB2YWxpZCBwb3J0IGluIFNlcnZpY2U6IHsxfSBpbiBXU0RMOiB7Mn0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PVEZPVU5EX1BPUlRfSU5fV1NETChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVOT1RGT1VORF9QT1JUX0lOX1dTREwoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUlJPUl9XU0RMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci53c2RsIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXJyb3IgaW4gcGFyc2luZyBXU0RMOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVSUk9SX1dTREwoYXJnMCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1NlbmRlck1lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvU2VuZGVyTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQyYWExCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1NlbmRlck1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXM7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKKworCisvKioKKyAqIERlZmluZXMgc3RyaW5nIGZvcm1hdHRpbmcgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGluIHRoZSByZXNvdXJjZSBmaWxlCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2VuZGVyTWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KCJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuc2VuZGVyIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRU5ERVJfUkVRVUVTVF9JTExFR0FMX1ZBTFVFX0ZPUl9DT05URU5UX05FR09USUFUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZW5kZXIucmVxdWVzdC5pbGxlZ2FsVmFsdWVGb3JDb250ZW50TmVnb3RpYXRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbGxlZ2FsIHZhbHVlIGZvciBjb250ZW50IG5lZ290aWF0aW9uIHByb3BlcnR5ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRU5ERVJfUkVRVUVTVF9JTExFR0FMX1ZBTFVFX0ZPUl9DT05URU5UX05FR09USUFUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRU5ERVJfUkVRVUVTVF9JTExFR0FMX1ZBTFVFX0ZPUl9DT05URU5UX05FR09USUFUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VOREVSX1JFU1BPTlNFX0NBTk5PVF9ERUNPREVfRkFVTFRfREVUQUlMKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VuZGVyLnJlc3BvbnNlLmNhbm5vdERlY29kZUZhdWx0RGV0YWlsIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmF1bHQgZGV0YWlsIGNhbm5vdCBiZSBkZWNvZGVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRU5ERVJfUkVTUE9OU0VfQ0FOTk9UX0RFQ09ERV9GQVVMVF9ERVRBSUwoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRU5ERVJfUkVTUE9OU0VfQ0FOTk9UX0RFQ09ERV9GQVVMVF9ERVRBSUwoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFTkRFUl9ORVNURURfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlbmRlci5uZXN0ZWRFcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNlbmRlciBlcnJvcjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRU5ERVJfTkVTVEVEX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRU5ERVJfTkVTVEVEX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VOREVSX1JFUVVFU1RfTUVTU0FHRV9OT1RfUkVBRFkoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZW5kZXIucmVxdWVzdC5tZXNzYWdlTm90UmVhZHkiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtZXNzYWdlIG5vdCByZWFkeSB0byBiZSBzZW50CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRU5ERVJfUkVRVUVTVF9NRVNTQUdFX05PVF9SRUFEWSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFTkRFUl9SRVFVRVNUX01FU1NBR0VfTk9UX1JFQURZKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1NlcnZlck1lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvU2VydmVyTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTdlNjJiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1NlcnZlck1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw2OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlcnZlck1lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLnNlcnZlciIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9QQVJTRVJfTUlTU0lOR19BVFRSSUJVVEVfTk9fTElORSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLm1pc3NpbmcuYXR0cmlidXRlLm5vLmxpbmUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtaXNzaW5nIGF0dHJpYnV0ZSAiezJ9IiBpbiBlbGVtZW50ICJ7MX0iIG9mIHJ1bnRpbWUgZGVzY3JpcHRvcgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9QQVJTRVJfTUlTU0lOR19BVFRSSUJVVEVfTk9fTElORSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX01JU1NJTkdfQVRUUklCVVRFX05PX0xJTkUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNUQVRFRlVMX0NPT0tJRV9IRUFERVJfSU5DT1JSRUNUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic3RhdGVmdWwuY29va2llLmhlYWRlci5pbmNvcnJlY3QiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkL2V4cGlyZWQgezB9IGhlYWRlciB2YWx1ZTogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTVEFURUZVTF9DT09LSUVfSEVBREVSX0lOQ09SUkVDVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNUQVRFRlVMX0NPT0tJRV9IRUFERVJfSU5DT1JSRUNUKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTk9UX0lNUExFTUVOVF9QUk9WSURFUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibm90LmltcGxlbWVudC5wcm92aWRlciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqICJ7MH0iIGRvZXNuJ3QgaW1wbGVtZW50IFByb3ZpZGVyCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOT1RfSU1QTEVNRU5UX1BST1ZJREVSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVOT1RfSU1QTEVNRU5UX1BST1ZJREVSKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU1RBVEVGVUxfUkVRVVJFU19BRERSRVNTSU5HKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzdGF0ZWZ1bC5yZXF1cmVzLmFkZHJlc3NpbmciLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZWZ1bCB3ZWIgc2VydmljZSB7MH0gcmVxdWlyZXMgdGhlIFdTLUFkZHJlc3Npbmcgc3VwcG9ydCB0byBiZSBlbmFibGVkLiBQZXJoYXBzIHlvdSBhcmUgbWlzc2luZyBAQWRkcmVzc2luZworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1RBVEVGVUxfUkVRVVJFU19BRERSRVNTSU5HKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTVEFURUZVTF9SRVFVUkVTX0FERFJFU1NJTkcoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTT0FQREVDT0RFUl9FUlIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzb2FwZGVjb2Rlci5lcnIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFcnJvciBpbiBkZWNvZGluZyBTT0FQIE1lc3NhZ2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBERUNPREVSX0VSUigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNPQVBERUNPREVSX0VSUigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9QQVJTRVJfSU5WQUxJRF9SRUFERVJfU1RBVEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLmludmFsaWRSZWFkZXJTdGF0ZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVycm9yIHBhcnNpbmcgcnVudGltZSBkZXNjcmlwdG9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfUEFSU0VSX0lOVkFMSURfUkVBREVSX1NUQVRFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9JTlZBTElEX1JFQURFUl9TVEFURShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUdFTkVSQVRFX05PTl9TVEFOREFSRF9XU0RMKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZ2VuZXJhdGUubm9uLnN0YW5kYXJkLndzZGwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0aW5nIG5vbi1zdGFuZGFyZCBXU0RMIGZvciB0aGUgc3BlY2lmaWVkIGJpbmRpbmcKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRFX05PTl9TVEFOREFSRF9XU0RMKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlR0VORVJBVEVfTk9OX1NUQU5EQVJEX1dTREwoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZURJU1BBVENIX0NBTk5PVF9GSU5EX01FVEhPRChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImRpc3BhdGNoLmNhbm5vdEZpbmRNZXRob2QiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5ub3QgZmluZCBkaXNwYXRjaCBtZXRob2QgZm9yIHswfSB1c2luZyAiezF9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRElTUEFUQ0hfQ0FOTk9UX0ZJTkRfTUVUSE9EKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRElTUEFUQ0hfQ0FOTk9UX0ZJTkRfTUVUSE9EKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTk9fQ09OVEVOVF9UWVBFKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibm8uY29udGVudFR5cGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGRvZXNuJ3QgaGF2ZSBhIENvbnRlbnQtVHlwZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fQ09OVEVOVF9UWVBFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTk9fQ09OVEVOVF9UWVBFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9JTlZBTElEX1ZFUlNJT05fTlVNQkVSKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5wYXJzZXIuaW52YWxpZFZlcnNpb25OdW1iZXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bnN1cHBvcnRlZCBydW50aW1lIGRlc2NyaXB0b3IgdmVyc2lvbjogezJ9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX1BBUlNFUl9JTlZBTElEX1ZFUlNJT05fTlVNQkVSKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUlVOVElNRV9QQVJTRVJfSU5WQUxJRF9WRVJTSU9OX05VTUJFUigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUFJPVklERVJfSU5WQUxJRF9QQVJBTUVURVJfVFlQRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInByb3ZpZGVyLmludmFsaWQucGFyYW1ldGVyVHlwZSIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqICJ7MH0iIGltcGxlbWVudHMgUHJvdmlkZXIgYnV0IGl0cyB0eXBlIHBhcmFtZXRlciB7MX0gaXMgaW5jb3JyZWN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9WSURFUl9JTlZBTElEX1BBUkFNRVRFUl9UWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUFJPVklERVJfSU5WQUxJRF9QQVJBTUVURVJfVFlQRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdST05HX05PX1BBUkFNRVRFUlMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndyb25nLm5vLnBhcmFtZXRlcnMiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNvcnJlY3Qgbm8gb2YgYXJndW1lbnRzIGZvciBtZXRob2QgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdST05HX05PX1BBUkFNRVRFUlMoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdST05HX05PX1BBUkFNRVRFUlMoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVBTk5PVEFUSU9OX09OTFlfT05DRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiYW5ub3RhdGlvbi5vbmx5Lm9uY2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IG9uZSBtZXRob2Qgc2hvdWxkIGhhdmUgdGhlIGFubm90YXRpb24gInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fT05MWV9PTkNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVBTk5PVEFUSU9OX09OTFlfT05DRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUFMUkVBRFlfSFRUUFNfU0VSVkVSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJhbHJlYWR5Lmh0dHBzLnNlcnZlciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZXJlIGlzIGFscmVhZHkgYSBIVFRQUyBzZXJ2ZXIgYXQgOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFMUkVBRFlfSFRUUFNfU0VSVkVSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVBTFJFQURZX0hUVFBTX1NFUlZFUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX1hNTF9SRUFERVIoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLnhtbFJlYWRlciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVycm9yIHBhcnNpbmcgcnVudGltZSBkZXNjcmlwdG9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfUEFSU0VSX1hNTF9SRUFERVIoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX1hNTF9SRUFERVIoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9XU0RMX0lOQ09SUkVDVFNFUlZJQ0VQT1JUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLndzZGwuaW5jb3JyZWN0c2VydmljZXBvcnQiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb3VsZCBub3QgZ2V0IGJpbmRpbmcgZnJvbSBXU0RMISBzZXJ2aWNlOiB7MH0gb3IgcG9ydCB7MX0gbm90IGZvdW5kIGluIHRoZSBXU0RMIHsyfS4KKyAgICAgKiBJdCBjb3VsZCBiZSBiZWNhdXNlIHNlcnZpY2UgYW5kIHBvcnQgbmFtZXMgZG8gbm90IG1hdGNoIFdTREwnJ3Mgd3NkbDpzZXJ2aWNlIGFuZCB3c2RsOnBvcnQgbmFtZXM6CisgICAgICogIDEuIHNlcnZpY2UgYW5kIHBvcnQgbmFtZXMgYXJlIG5vdCB0aGVyZSBpbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgT1IKKyAgICAgKiAgMi4gRWl0aGVyIHRoZXJlIGlzIGEgdHlwbyBpbiBkZXBsb3ltZW50IGRlc2NyaXB0b3InJ3Mgc2VydmljZSBhbmQgcG9ydCBuYW1lcyBPUgorICAgICAqICAzLiBUaGUgY29tcHV0ZWQgbmFtZXMgZnJvbSBAV2ViU2VydmljZSBkbyBub3QgbWF0Y2ggd3NkbDpzZXJ2aWNlIGFuZCB3c2RsOnBvcnQgbmFtZXMKKyAgICAgKiBTdWdnZXN0IGRvaW5nIHRoZSBmb2xsb3dpbmc6CisgICAgICogIDEuIEFkZC9Db3JyZWN0IGVudHJpZXMgZm9yIHNlcnZpY2UgYW5kIHBvcnQgbmFtZXMgaW4gZGVwbG95bWVudCBkZXNjcmlwdG9yIE9SCisgICAgICogIDIuIFNwZWNpZnkgdGFyZ2V0TmFtZXNwYWNlLCBzZXJ2aWNlTmFtZSwgcG9ydE5hbWUgaW4gQFdlYlNlcnZpY2Ugb24gdGhlIGVuZHBvaW50IGNsYXNzCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX1BBUlNFUl9XU0RMX0lOQ09SUkVDVFNFUlZJQ0VQT1JUKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX1dTRExfSU5DT1JSRUNUU0VSVklDRVBPUlQoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWRVJfUlRfRVJSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2ZXIucnQuZXJyIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmVyIFJ1bnRpbWUgRXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkVSX1JUX0VSUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU0VSVkVSX1JUX0VSUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLmludmFsaWRBdHRyaWJ1dGVWYWx1ZSIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludmFsaWQgdmFsdWUgZm9yIGF0dHJpYnV0ZSAiezJ9IiBvZiBlbGVtZW50ICJ7MX0iIGluIHJ1bnRpbWUgZGVzY3JpcHRvciAobGluZSB7MH0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX1BBUlNFUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRShhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5PX0NVUlJFTlRfUEFDS0VUKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibm8uY3VycmVudC5wYWNrZXQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRocmVhZCBpcyBub3QgY3VycmVudGx5IHByb2Nlc3NpbmcgYW55IHdlYiBzZXJ2aWNlIHJlcXVlc3QuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOT19DVVJSRU5UX1BBQ0tFVCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5PX0NVUlJFTlRfUEFDS0VUKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9VTkVYUEVDVEVEX0NPTlRFTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLnVuZXhwZWN0ZWRDb250ZW50IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5leHBlY3RlZCBjb250ZW50IGluIHJ1bnRpbWUgZGVzY3JpcHRvciAobGluZSB7MH0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX1BBUlNFUl9VTkVYUEVDVEVEX0NPTlRFTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX1VORVhQRUNURURfQ09OVEVOVChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNUQVRFRlVMX0NPT0tJRV9IRUFERVJfUkVRVUlSRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInN0YXRlZnVsLmNvb2tpZS5oZWFkZXIucmVxdWlyZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgc3RhdGVmdWwgd2ViIHNlcnZpY2UgYW5kIHswfSBoZWFkZXIgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTVEFURUZVTF9DT09LSUVfSEVBREVSX1JFUVVJUkVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTVEFURUZVTF9DT09LSUVfSEVBREVSX1JFUVVJUkVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlTlVMTF9JTVBMRU1FTlRPUigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm51bGwuaW1wbGVtZW50b3IiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRvciBjYW5ub3QgYmUgbnVsbAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTlVMTF9JTVBMRU1FTlRPUigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU5VTExfSU1QTEVNRU5UT1IoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLndzZGwiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBleGNlcHRpb24gZHVyaW5nIFdTREwgcGFyc2luZzogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX1BBUlNFUl9XU0RMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9XU0RMKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU09BUEVOQ09ERVJfRVJSKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic29hcGVuY29kZXIuZXJyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXJyb3IgaW4gZW5jb2RpbmcgU09BUCBNZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQRU5DT0RFUl9FUlIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTT0FQRU5DT0RFUl9FUlIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExfUkVRVUlSRUQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3c2RsLnJlcXVpcmVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogd3NkbCBpcyByZXF1aXJlZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9SRVFVSVJFRCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTRExfUkVRVUlSRUQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU5PVF9IVFRQX0NPTlRFWFRfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibm90Lkh0dHBDb250ZXh0LnR5cGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1aXJlZCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBDb250ZXh0LiBHb3QgOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PVF9IVFRQX0NPTlRFWFRfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTk9UX0hUVFBfQ09OVEVYVF9UWVBFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUE9SVF9OQU1FX1JFUVVJUkVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicG9ydC5uYW1lLnJlcXVpcmVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9ydCBRTmFtZSBpcyBub3QgZm91bmQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBPUlRfTkFNRV9SRVFVSVJFRCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBPUlRfTkFNRV9SRVFVSVJFRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1JPTkdfVE5TX0ZPUl9QT1JUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3cm9uZy50bnMuZm9yLnBvcnQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3J0IG5hbWVzcGFjZSB7MH0gZG9lc24ndCBtYXRjaCBTZXJ2aWNlIG5hbWVzcGFjZSB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdST05HX1ROU19GT1JfUE9SVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1JPTkdfVE5TX0ZPUl9QT1JUKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9QQVJTRVJfV1NETF9NVUxUSVBMRUJJTkRJTkcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5wYXJzZXIud3NkbC5tdWx0aXBsZWJpbmRpbmciLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtdWx0aXBsZSBiaW5kaW5ncyBmb3VuZCBmb3IgYmluZGluZyBJRCB7MH0gZm9yIHNlcnZpY2UgezF9IGluIFdTREwgezJ9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX1BBUlNFUl9XU0RMX01VTFRJUExFQklORElORyhPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9XU0RMX01VTFRJUExFQklORElORyhhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUFMUkVBRFlfSFRUUF9TRVJWRVIoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImFscmVhZHkuaHR0cC5zZXJ2ZXIiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGVyZSBpcyBhbHJlYWR5IGEgSFRUUCBzZXJ2ZXIgYXQgOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFMUkVBRFlfSFRUUF9TRVJWRVIoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUFMUkVBRFlfSFRUUF9TRVJWRVIoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVDQU5fTk9UX0dFTkVSQVRFX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImNhbi5ub3QuZ2VuZXJhdGUud3NkbCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbm5vdCBnZW5lcmF0ZSBXU0RMIGZvciBiaW5kaW5nICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDQU5fTk9UX0dFTkVSQVRFX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUNBTl9OT1RfR0VORVJBVEVfV1NETChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5wYXJzZXIuaW52YWxpZC5hdHRyaWJ1dGUudmFsdWUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSAiezF9IiBpbiBydW50aW1lIGRlc2NyaXB0b3IgKGxpbmUgezB9KQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9QQVJTRVJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRShhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX1dST05HX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5wYXJzZXIud3JvbmcuZWxlbWVudCIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZvdW5kIGVsZW1lbnQgInsxfSIsIGV4cGVjdGVkICJ7Mn0iIGluIHJ1bnRpbWUgZGVzY3JpcHRvciAobGluZSB7MH0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX1BBUlNFUl9XUk9OR19FTEVNRU5UKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX1dST05HX0VMRU1FTlQoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9XU0RMX05PU0VSVklDRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLndzZGwubm9zZXJ2aWNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2FuJ3QgYXBwbHkgYmluZGluZyEgc2VydmljZSB7MH0gbm90IGZvdW5kIGluIHRoZSBXU0RMIHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9QQVJTRVJfV1NETF9OT1NFUlZJQ0UoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9XU0RMX05PU0VSVklDRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVklDRV9OQU1FX1JFUVVJUkVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmljZS5uYW1lLnJlcXVpcmVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmljZSBRTmFtZSBpcyBub3QgZm91bmQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfTkFNRV9SRVFVSVJFRCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZJQ0VfTkFNRV9SRVFVSVJFRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUFJPVklERVJfTk9UX1BBUkFNRVRFUklaRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInByb3ZpZGVyLm5vdC5wYXJhbWV0ZXJpemVkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogInswfSIgaW1wbGVtZW50cyBQcm92aWRlciBidXQgZG9lc24ndCBzcGVjaWZ5IHRoZSB0eXBlIHBhcmFtZXRlcgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPVklERVJfTk9UX1BBUkFNRVRFUklaRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBST1ZJREVSX05PVF9QQVJBTUVURVJJWkVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9XU0RMX1BBVENIRVIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJydW50aW1lLndzZGwucGF0Y2hlciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVycm9yIHdoaWxlIHBhdGNoaW5nIFdTREwgcmVsYXRlZCBkb2N1bWVudAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9XU0RMX1BBVENIRVIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1dTRExfUEFUQ0hFUigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9TQVhQQVJTRVJfRVhDRVBUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5zYXhwYXJzZXIuZXhjZXB0aW9uIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogezB9CisgICAgICogezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSVU5USU1FX1NBWFBBUlNFUl9FWENFUFRJT04oT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1NBWFBBUlNFUl9FWENFUFRJT04oYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9XU0RMX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5wYXJzZXIud3NkbC5ub3QuZm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7MH0gaXMgbm90IGZvdW5kIGluIHRoZSBXQVIgZmlsZS4gUGFja2FnZSBpdCBpbiB0aGUgV0FSIGZpbGUgb3IgY29ycmVjdCBpdCBpbiBzdW4tamF4d3MueG1sLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9QQVJTRVJfV1NETF9OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX1dTRExfTk9UX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1JPTkdfUEFSQU1FVEVSX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndyb25nLnBhcmFtZXRlci50eXBlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jb3JyZWN0IGFyZ3VtZW50IHR5cGVzIGZvciBtZXRob2QgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdST05HX1BBUkFNRVRFUl9UWVBFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXUk9OR19QQVJBTUVURVJfVFlQRShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX0NMQVNTX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5wYXJzZXIuY2xhc3NOb3RGb3VuZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNsYXNzIG5vdCBmb3VuZCBpbiBydW50aW1lIGRlc2NyaXB0b3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9QQVJTRVJfQ0xBU1NfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9DTEFTU19OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTVEFUSUNfUkVTT1VSQ0VfSU5KRUNUSU9OX09OTFkoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzdGF0aWMucmVzb3VyY2UuaW5qZWN0aW9uLm9ubHkiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgcmVzb3VyY2UgezB9IGNhbm5vdCBiZSBpbmplY3RlZCB0byBub24tc3RhdGljICJ7MX0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTVEFUSUNfUkVTT1VSQ0VfSU5KRUNUSU9OX09OTFkoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTVEFUSUNfUkVTT1VSQ0VfSU5KRUNUSU9OX09OTFkoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOT1RfWkVST19QQVJBTUVURVJTKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJub3QuemVyby5wYXJhbWV0ZXJzIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kICJ7MH0iIHNob3VsZG4nJ3QgaGF2ZSBhbnkgYXJndW1lbnRzCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOT1RfWkVST19QQVJBTUVURVJTKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVOT1RfWkVST19QQVJBTUVURVJTKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRFVQTElDQVRFX1BSSU1BUllfV1NETChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZHVwbGljYXRlLnByaW1hcnkud3NkbCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGFkYXRhIGhhcyBtb3JlIHRoYW4gb25lIFdTREwgdGhhdCBoYXMgU2VydmljZSBkZWZpbml0b24gZm9yIHRoZSBlbmRwb2ludC4gV1NETD17MH0gaXMgb25lIHN1Y2ggV1NETC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERVUExJQ0FURV9QUklNQVJZX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZURVUExJQ0FURV9QUklNQVJZX1dTREwoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVEVVBMSUNBVEVfQUJTVFJBQ1RfV1NETChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZHVwbGljYXRlLmFic3RyYWN0LndzZGwiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRhZGF0YSBoYXMgbW9yZSB0aGFuIG9uZSBXU0RMIHRoYXQgaGFzIFBvcnRUeXBlIGRlZmluaXRvbiBmb3IgdGhlIGVuZHBvaW50LiBXU0RMPXswfSBpcyBvbmUgc3VjaCBXU0RMLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRFVQTElDQVRFX0FCU1RSQUNUX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZURVUExJQ0FURV9BQlNUUkFDVF9XU0RMKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU1RBVEVGVUxfSU5WQUxJRF9XRUJTRVJWSUNFX0NPTlRFWFQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInN0YXRlZnVsLmludmFsaWQud2Vic2VydmljZS5jb250ZXh0IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90IGEgV2ViU2VydmljZUNvbnRleHQgZnJvbSBKQVgtV1MgUkk6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1RBVEVGVUxfSU5WQUxJRF9XRUJTRVJWSUNFX0NPTlRFWFQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNUQVRFRlVMX0lOVkFMSURfV0VCU0VSVklDRV9DT05URVhUKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9QQVJTRVJfV1NETF9OT0JJTkRJTkcoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJydW50aW1lLnBhcnNlci53c2RsLm5vYmluZGluZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNhbid0IGFwcGx5IGJpbmRpbmchIG5vIGJpbmRpbmcgZm91bmQgZm9yIGJpbmRpbmcgSUQgezBdIGZvciBzZXJ2aWNlIHsxfSBpbiBXU0RMIHsyfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9QQVJTRVJfV1NETF9OT0JJTkRJTkcoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9XU0RMX05PQklORElORygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlUlVOVElNRV9QQVJTRVJfSU5WQUxJRF9FTEVNRU5UKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicnVudGltZS5wYXJzZXIuaW52YWxpZEVsZW1lbnQiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbnZhbGlkIGVsZW1lbnQgInsxfSIgaW4gcnVudGltZSBkZXNjcmlwdG9yIChsaW5lIHswfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJVTlRJTUVfUEFSU0VSX0lOVkFMSURfRUxFTUVOVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX0lOVkFMSURfRUxFTUVOVChhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVJVTlRJTUVfUEFSU0VSX01JU1NJTkdfQVRUUklCVVRFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInJ1bnRpbWUucGFyc2VyLm1pc3NpbmcuYXR0cmlidXRlIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogbWlzc2luZyBhdHRyaWJ1dGUgInsyfSIgaW4gZWxlbWVudCAiezF9IiBvZiBydW50aW1lIGRlc2NyaXB0b3IgKGxpbmUgezB9KQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9QQVJTRVJfTUlTU0lOR19BVFRSSUJVVEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlUlVOVElNRV9QQVJTRVJfTUlTU0lOR19BVFRSSUJVVEUoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXUk9OR19GSUVMRF9UWVBFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ3cm9uZy5maWVsZC50eXBlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jb3JyZWN0IHR5cGUgZm9yIGZpZWxkICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXUk9OR19GSUVMRF9UWVBFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXUk9OR19GSUVMRF9UWVBFKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRFVQTElDQVRFX1BPUlRfS05PV05fSEVBREVSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJkdXBsaWNhdGUucG9ydEtub3duSGVhZGVyIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjZWl2ZWQgU09BUCBtZXNzYWdlIGNvbnRhaW5zIGR1cGxpY2F0ZSBoZWFkZXI6IHswfSBmb3IgYSBib3VuZCBwYXJhbWV0ZXIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERVUExJQ0FURV9QT1JUX0tOT1dOX0hFQURFUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRFVQTElDQVRFX1BPUlRfS05PV05fSEVBREVSKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidW5zdXBwb3J0ZWQuY29udGVudFR5cGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnN1cHBvcnRlZCBDb250ZW50LVR5cGU6IHswfSBTdXBwb3J0ZWQgb25lcyBhcmU6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRkFJTEVEX1RPX0lOU1RBTlRJQVRFX0lOU1RBTkNFX1JFU09MVkVSKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImZhaWxlZC50by5pbnN0YW50aWF0ZS5pbnN0YW5jZVJlc29sdmVyIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5hYmxlIHRvIGluc3RhbnRpYXRlIHswfSAod2hpY2ggaXMgc3BlY2lmaWVkIGluIHsxfSBvbiB7Mn0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBGQUlMRURfVE9fSU5TVEFOVElBVEVfSU5TVEFOQ0VfUkVTT0xWRVIoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRkFJTEVEX1RPX0lOU1RBTlRJQVRFX0lOU1RBTkNFX1JFU09MVkVSKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRERfTVRPTV9DT05GTElDVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImRkLm10b20uY29uZmxpY3QiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFcnJvciBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3IgOiBNVE9NIENvbmZpZ3VyYXRpb24gaW4gYmluZGluZyB7MH0gY29uZmxpY3RzIHdpdGggZW5hYmxlLW10b20gYXR0cmlidXRlIHZhbHVlIHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRERfTVRPTV9DT05GTElDVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUREX01UT01fQ09ORkxJQ1QoYXJnMCwgYXJnMSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1NvYXBNZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1NvYXBNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjBiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvU29hcE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvYXBNZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5zb2FwIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTT0FQX0ZBVUxUX0NSRUFURV9FUlIoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNvYXAuZmF1bHQuY3JlYXRlLmVyciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvdWxkbicndCBjcmVhdGUgU09BUCBGYXVsdCBkdWUgdG8gZXhjZXB0aW9uOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBfRkFVTFRfQ1JFQVRFX0VSUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU09BUF9GQVVMVF9DUkVBVEVfRVJSKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU09BUF9NU0dfRkFDVE9SWV9DUkVBVEVfRVJSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzb2FwLm1zZy5mYWN0b3J5LmNyZWF0ZS5lcnIiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3VsZG4nJ3QgY3JlYXRlIFNPQVAgbWVzc2FnZSBmYWN0b3J5IGR1ZSB0byBleGNlcHRpb246IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU09BUF9NU0dfRkFDVE9SWV9DUkVBVEVfRVJSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTT0FQX01TR19GQUNUT1JZX0NSRUFURV9FUlIoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTT0FQX01TR19DUkVBVEVfRVJSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzb2FwLm1zZy5jcmVhdGUuZXJyIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ291bGRuJyd0IGNyZWF0ZSBTT0FQIG1lc3NhZ2UgZHVlIHRvIGV4Y2VwdGlvbjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQX01TR19DUkVBVEVfRVJSKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTT0FQX01TR19DUkVBVEVfRVJSKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU09BUF9GQUNUT1JZX0NSRUFURV9FUlIoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNvYXAuZmFjdG9yeS5jcmVhdGUuZXJyIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ291bGRuJyd0IGNyZWF0ZSBTT0FQIGZhY3RvcnkgZHVlIHRvIGV4Y2VwdGlvbjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQX0ZBQ1RPUllfQ1JFQVRFX0VSUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU09BUF9GQUNUT1JZX0NSRUFURV9FUlIoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTT0FQX1BST1RPQ09MX0lOVkFMSURfRkFVTFRfQ09ERShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic29hcC5wcm90b2NvbC5pbnZhbGlkRmF1bHRDb2RlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZCBmYXVsdCBjb2RlOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBfUFJPVE9DT0xfSU5WQUxJRF9GQVVMVF9DT0RFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTT0FQX1BST1RPQ09MX0lOVkFMSURfRkFVTFRfQ09ERShhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNPQVBfVkVSU0lPTl9NSVNNQVRDSF9FUlIoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzb2FwLnZlcnNpb24ubWlzbWF0Y2guZXJyIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ291bGRuJyd0IGNyZWF0ZSBTT0FQIG1lc3NhZ2UuIEV4cGVjdGluZyBFbnZlbG9wZSBpbiBuYW1lc3BhY2UgezB9LCBidXQgZ290IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU09BUF9WRVJTSU9OX01JU01BVENIX0VSUihPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNPQVBfVkVSU0lPTl9NSVNNQVRDSF9FUlIoYXJnMCwgYXJnMSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1N0cmVhbWluZ01lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvU3RyZWFtaW5nTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzVlMGQyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1N0cmVhbWluZ01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN0cmVhbWluZ01lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLnN0cmVhbWluZyIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRkFTVElORk9TRVRfREVDT0RJTkdfTk9UX0FDQ0VQVEVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZmFzdGluZm9zZXQuZGVjb2RpbmdOb3RBY2NlcHRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhc3QgSW5mb3NldCBkZWNvZGluZyBpcyBub3QgYWNjZXB0ZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZBU1RJTkZPU0VUX0RFQ09ESU5HX05PVF9BQ0NFUFRFRCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUZBU1RJTkZPU0VUX0RFQ09ESU5HX05PVF9BQ0NFUFRFRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU1RBWF9DQU5UX0NSRUFURSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInN0YXguY2FudENyZWF0ZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuYWJsZSB0byBjcmVhdGUgU3RBWCByZWFkZXIgb3Igd3JpdGVyCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTVEFYX0NBTlRfQ1JFQVRFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU1RBWF9DQU5UX0NSRUFURSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU1RSRUFNSU5HX0lPX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic3RyZWFtaW5nLmlvRXhjZXB0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWE1MIHBhcnNpbmcgZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1RSRUFNSU5HX0lPX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU1RSRUFNSU5HX0lPX0VYQ0VQVElPTihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNPVVJDRVJFQURFUl9JTlZBTElEX1NPVVJDRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic291cmNlcmVhZGVyLmludmFsaWRTb3VyY2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmFibGUgdG8gY3JlYXRlIHJlYWRlciBmcm9tIHNvdXJjZSAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU09VUkNFUkVBREVSX0lOVkFMSURfU09VUkNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTT1VSQ0VSRUFERVJfSU5WQUxJRF9TT1VSQ0UoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxSRUFERVJfVU5FWFBFQ1RFRF9TVEFURShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInhtbHJlYWRlci51bmV4cGVjdGVkU3RhdGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bmV4cGVjdGVkIFhNTCByZWFkZXIgc3RhdGUuIGV4cGVjdGVkOiB7MH0gYnV0IGZvdW5kOiB7MX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFJFQURFUl9VTkVYUEVDVEVEX1NUQVRFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MUkVBREVSX1VORVhQRUNURURfU1RBVEUoYXJnMCwgYXJnMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxSRUFERVJfSU9fRVhDRVBUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWxyZWFkZXIuaW9FeGNlcHRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBYTUwgcmVhZGVyIGVycm9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFJFQURFUl9JT19FWENFUFRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVhNTFJFQURFUl9JT19FWENFUFRJT04oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVGQVNUSU5GT1NFVF9OT19JTVBMRU1FTlRBVElPTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImZhc3RpbmZvc2V0Lm5vSW1wbGVtZW50YXRpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmFibGUgdG8gbG9jYXRlIGNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgRmFzdCBJbmZvc2V0IGluIGNsYXNzcGF0aAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRkFTVElORk9TRVRfTk9fSU1QTEVNRU5UQVRJT04oKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVGQVNUSU5GT1NFVF9OT19JTVBMRU1FTlRBVElPTigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MV1JJVEVSX0lPX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgieG1sd3JpdGVyLmlvRXhjZXB0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWE1MIHdyaXRlciBlcnJvcjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxXUklURVJfSU9fRVhDRVBUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxXUklURVJfSU9fRVhDRVBUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MUkVBREVSX1VORVhQRUNURURfQ0hBUkFDVEVSX0NPTlRFTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInhtbHJlYWRlci51bmV4cGVjdGVkQ2hhcmFjdGVyQ29udGVudCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFhNTCByZWFkZXIgZXJyb3I6IHVuZXhwZWN0ZWQgY2hhcmFjdGVyIGNvbnRlbnQ6ICJ7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxSRUFERVJfVU5FWFBFQ1RFRF9DSEFSQUNURVJfQ09OVEVOVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MUkVBREVSX1VORVhQRUNURURfQ0hBUkFDVEVSX0NPTlRFTlQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTVFJFQU1JTkdfUEFSU0VfRVhDRVBUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzdHJlYW1pbmcucGFyc2VFeGNlcHRpb24iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBYTUwgcGFyc2luZyBlcnJvcjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTVFJFQU1JTkdfUEFSU0VfRVhDRVBUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTVFJFQU1JTkdfUEFSU0VfRVhDRVBUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MV1JJVEVSX05PX1BSRUZJWF9GT1JfVVJJKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWx3cml0ZXIubm9QcmVmaXhGb3JVUkkiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBYTUwgd3JpdGVyIGVycm9yOiBubyBwcmVmaXggZm9yIFVSSTogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFdSSVRFUl9OT19QUkVGSVhfRk9SX1VSSShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MV1JJVEVSX05PX1BSRUZJWF9GT1JfVVJJKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MUkVBREVSX05FU1RFRF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgieG1scmVhZGVyLm5lc3RlZEVycm9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWE1MIHJlYWRlciBlcnJvcjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxSRUFERVJfTkVTVEVEX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxSRUFERVJfTkVTVEVEX0VSUk9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU1RBWFJFQURFUl9YTUxTVFJFQU1FWENFUFRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInN0YXhyZWFkZXIueG1sc3RyZWFtZXhjZXB0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWE1MIHN0cmVhbSByZWFkZXIgZXhjZXB0aW9uOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNUQVhSRUFERVJfWE1MU1RSRUFNRVhDRVBUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTVEFYUkVBREVSX1hNTFNUUkVBTUVYQ0VQVElPTihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVhNTFdSSVRFUl9ORVNURURfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInhtbHdyaXRlci5uZXN0ZWRFcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFhNTCB3cml0ZXIgZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MV1JJVEVSX05FU1RFRF9FUlJPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MV1JJVEVSX05FU1RFRF9FUlJPUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVhNTFJFQURFUl9JTExFR0FMX1NUQVRFX0VOQ09VTlRFUkVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWxyZWFkZXIuaWxsZWdhbFN0YXRlRW5jb3VudGVyZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBYTUwgcmVhZGVyIGludGVybmFsIGVycm9yOiBpbGxlZ2FsIHN0YXRlICh7MH0pCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxSRUFERVJfSUxMRUdBTF9TVEFURV9FTkNPVU5URVJFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MUkVBREVSX0lMTEVHQUxfU1RBVEVfRU5DT1VOVEVSRUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxSRUFERVJfVU5FWFBFQ1RFRF9TVEFURV9UQUcoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWxyZWFkZXIudW5leHBlY3RlZFN0YXRlLnRhZyIsIGFyZzAsIGFyZzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVuZXhwZWN0ZWQgWE1MIHRhZy4gZXhwZWN0ZWQ6IHswfSBidXQgZm91bmQ6IHsxfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUkVBREVSX1VORVhQRUNURURfU1RBVEVfVEFHKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MUkVBREVSX1VORVhQRUNURURfU1RBVEVfVEFHKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MUkVBREVSX1VORVhQRUNURURfU1RBVEVfTUVTU0FHRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWxyZWFkZXIudW5leHBlY3RlZFN0YXRlLm1lc3NhZ2UiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bmV4cGVjdGVkIFhNTCByZWFkZXIgc3RhdGUuIGV4cGVjdGVkOiB7MH0gYnV0IGZvdW5kOiB7MX0uIHsyfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUkVBREVSX1VORVhQRUNURURfU1RBVEVfTUVTU0FHRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxSRUFERVJfVU5FWFBFQ1RFRF9TVEFURV9NRVNTQUdFKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MUkVBREVSX1BBUlNFX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgieG1scmVhZGVyLnBhcnNlRXhjZXB0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogWE1MIHBhcnNpbmcgZXJyb3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUkVBREVSX1BBUlNFX0VYQ0VQVElPTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MUkVBREVSX1BBUlNFX0VYQ0VQVElPTihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVhNTFJFQ09SREVSX1JFQ09SRElOR19FTkRFRCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInhtbHJlY29yZGVyLnJlY29yZGluZy5lbmRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5vIG1vcmUgcmVjb3JkZWQgZWxlbWVudHMgYXZhaWxhYmxlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxSRUNPUkRFUl9SRUNPUkRJTkdfRU5ERUQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxSRUNPUkRFUl9SRUNPUkRJTkdfRU5ERUQoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvVXRpbE1lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvVXRpbE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNGZhMQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9VdGlsTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXM7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKKworCisvKioKKyAqIERlZmluZXMgc3RyaW5nIGZvcm1hdHRpbmcgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGluIHRoZSByZXNvdXJjZSBmaWxlCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVXRpbE1lc3NhZ2VzIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBuZXcgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSgiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLnV0aWwiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6ZXIgbG9jYWxpemVyID0gbmV3IExvY2FsaXplcigpOworCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVVUSUxfTE9DQVRJT04oT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ1dGlsLmxvY2F0aW9uIiwgYXJnMCwgYXJnMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXQgbGluZSB7MH0gb2YgezF9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVVElMX0xPQ0FUSU9OKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVVRJTF9MT0NBVElPTihhcmcwLCBhcmcxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVVUSUxfRkFJTEVEX1RPX1BBUlNFX0hBTkRMRVJDSEFJTl9GSUxFKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidXRpbC5mYWlsZWQudG8ucGFyc2UuaGFuZGxlcmNoYWluLmZpbGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3VsZCBub3QgcGFyc2UgaGFuZGxlciBjaGFpbiBmaWxlIHsxfSBmb3IgY2xhc3MgezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVVElMX0ZBSUxFRF9UT19QQVJTRV9IQU5ETEVSQ0hBSU5fRklMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVVUSUxfRkFJTEVEX1RPX1BBUlNFX0hBTkRMRVJDSEFJTl9GSUxFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVVRJTF9QQVJTRVJfV1JPTkdfRUxFTUVOVChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ1dGlsLnBhcnNlci53cm9uZy5lbGVtZW50IiwgYXJnMCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZm91bmQgZWxlbWVudCAiezF9IiwgZXhwZWN0ZWQgInsyfSIgaW4gaGFuZGxlciBjaGFpbiBjb25maWd1cmF0aW9uIChsaW5lIHswfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVUSUxfUEFSU0VSX1dST05HX0VMRU1FTlQoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVVRJTF9QQVJTRVJfV1JPTkdfRUxFTUVOVChhcmcwLCBhcmcxLCBhcmcyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVVUSUxfSEFORExFUl9DTEFTU19OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInV0aWwuaGFuZGxlci5jbGFzcy5ub3QuZm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAiQ2xhc3M6IHswfSBjb3VsZCBub3QgYmUgZm91bmQiCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVVElMX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVVVElMX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVVRJTF9IQU5ETEVSX0VORFBPSU5UX0lOVEVSRkFDRV9OT19XRUJTRVJWSUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ1dGlsLmhhbmRsZXIuZW5kcG9pbnQuaW50ZXJmYWNlLm5vLndlYnNlcnZpY2UiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAiVGhlIEVuZHBvaW50IEludGVyZmFjZTogezB9IGRvZXMgbm90IGhhdmUgV2ViU2VydmljZSBBbm5vdGF0aW9uIgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVRJTF9IQU5ETEVSX0VORFBPSU5UX0lOVEVSRkFDRV9OT19XRUJTRVJWSUNFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVVVElMX0hBTkRMRVJfRU5EUE9JTlRfSU5URVJGQUNFX05PX1dFQlNFUlZJQ0UoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVVVElMX0hBTkRMRVJfTk9fV0VCU0VSVklDRV9BTk5PVEFUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ1dGlsLmhhbmRsZXIubm8ud2Vic2VydmljZS5hbm5vdGF0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIkEgV2ViU2VydmljZSBhbm5vdGF0aW9uIGlzIG5vdCBwcmVzZW50IG9uIGNsYXNzOiB7MH0iCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVVElMX0hBTkRMRVJfTk9fV0VCU0VSVklDRV9BTk5PVEFUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVVVElMX0hBTkRMRVJfTk9fV0VCU0VSVklDRV9BTk5PVEFUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVVRJTF9GQUlMRURfVE9fRklORF9IQU5ETEVSQ0hBSU5fRklMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInV0aWwuZmFpbGVkLnRvLmZpbmQuaGFuZGxlcmNoYWluLmZpbGUiLCBhcmcwLCBhcmcxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3VsZCBub3QgZmluZCBoYW5kbGVyIGNoYWluIGZpbGUgezF9IGZvciBjbGFzcyB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVUSUxfRkFJTEVEX1RPX0ZJTkRfSEFORExFUkNIQUlOX0ZJTEUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVVVElMX0ZBSUxFRF9UT19GSU5EX0hBTkRMRVJDSEFJTl9GSUxFKGFyZzAsIGFyZzEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlVVRJTF9IQU5ETEVSX0NBTk5PVF9DT01CSU5FX1NPQVBNRVNTQUdFSEFORExFUlMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ1dGlsLmhhbmRsZXIuY2Fubm90LmNvbWJpbmUuc29hcG1lc3NhZ2VoYW5kbGVycyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFlvdSBtdXN0IHVzZSBIYW5sZGVyQ2hhaW4gYW5ub3RhdGlvbiwgbm90IFNPQVBNZXNzYWdlSGFuZGxlcnMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVUSUxfSEFORExFUl9DQU5OT1RfQ09NQklORV9TT0FQTUVTU0FHRUhBTkRMRVJTKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVVRJTF9IQU5ETEVSX0NBTk5PVF9DT01CSU5FX1NPQVBNRVNTQUdFSEFORExFUlMoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvV3NkbG1vZGVsTWVzc2FnZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9Xc2RsbW9kZWxNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWUyODUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvV3NkbG1vZGVsTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXc2RsbW9kZWxNZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy53c2RsbW9kZWwiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6ZXIgbG9jYWxpemVyID0gbmV3IExvY2FsaXplcigpOworCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTRExfUE9SVEFERFJFU1NfRVBSQUREUkVTU19OT1RfTUFUQ0goT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid3NkbC5wb3J0YWRkcmVzcy5lcHJhZGRyZXNzLm5vdC5tYXRjaCIsIGFyZzAsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBQb3J0OiB7MH0sIHNlcnZpY2UgbG9jYXRpb24gezF9IGRvZXMgbm90IG1hdGNoIGFkZHJlc3MgezJ9IGluIHRoZSBFbmRwb2ludFJlZmVyZW5jZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9QT1JUQUREUkVTU19FUFJBRERSRVNTX05PVF9NQVRDSChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMX1BPUlRBRERSRVNTX0VQUkFERFJFU1NfTk9UX01BVENIKGFyZzAsIGFyZzEsIGFyZzIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NETF9JTVBPUlRfU0hPVUxEX0JFX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIndzZGwuaW1wb3J0LnNob3VsZC5iZS53c2RsIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wb3J0IG9mIHswfSBpcyB2aW9sYXRpb24gb2YgQlAgMS4xIFIyMDAxLiBQcm9jZWVkaW5nIHdpdGggYSB3YXJuaW5nLgorICAgICAqIFIyMDAxIEEgREVTQ1JJUFRJT04gTVVTVCBvbmx5IHVzZSB0aGUgV1NETCAiaW1wb3J0IiBzdGF0ZW1lbnQgdG8gaW1wb3J0IGFub3RoZXIgV1NETCBkZXNjcmlwdGlvbi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfSU1QT1JUX1NIT1VMRF9CRV9XU0RMKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU0RMX0lNUE9SVF9TSE9VTERfQkVfV1NETChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZU1FWF9NRVRBREFUQV9TWVNURU1JRF9OVUxMKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiTWV4Lm1ldGFkYXRhLnN5c3RlbWlkLm51bGwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXggV1NETCBtZXRhZGF0YSBjYW4gbm90IGJlIHBhcnNlZCwgdGhlIHN5c3RlbUlkIGlzIG9mIHRoZSBNRVggc291cmNlIGlzIG51bGwuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNRVhfTUVUQURBVEFfU1lTVEVNSURfTlVMTCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZU1FWF9NRVRBREFUQV9TWVNURU1JRF9OVUxMKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1dzc2VydmxldE1lc3NhZ2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvV3NzZXJ2bGV0TWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQ0NDBjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1dzc2VydmxldE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwxOTEzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlczsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworCisKKy8qKgorICogRGVmaW5lcyBzdHJpbmcgZm9ybWF0dGluZyBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgaW4gdGhlIHJlc291cmNlIGZpbGUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXc3NlcnZsZXRNZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy53c3NlcnZsZXQiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6ZXIgbG9jYWxpemVyID0gbmV3IExvY2FsaXplcigpOworCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVSUk9SX1dTRExfUFVCTElTSEVSX0NBTk5PVF9SRUFEX0NPTkZJR1VSQVRJT04oKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci53c2RsUHVibGlzaGVyLmNhbm5vdFJlYWRDb25maWd1cmF0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUNDY6IGNhbm5vdCByZWFkIGNvbmZpZ3VyYXRpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1dTRExfUFVCTElTSEVSX0NBTk5PVF9SRUFEX0NPTkZJR1VSQVRJT04oKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFUlJPUl9XU0RMX1BVQkxJU0hFUl9DQU5OT1RfUkVBRF9DT05GSUdVUkFUSU9OKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMjJfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMjIuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGVuZHBvaW50IHdpdGggc3R1Yi5zZXRUYXJnZXRFbmRwb2ludCBwcm9wZXJ0eQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzIyX0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8yMl9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8zM19ESUFHX0NBVVNFXzIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQzMy5kaWFnLmNhdXNlLjIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHB1Ymxpc2hpbmcgdGhlIHNlcnZpY2Ugd3NkbCwgdGhlIGh0dHAgbG9jYXRpb24gaXMgcGF0Y2hlZCB3aXRoIHRoZSBkZXBsb3llZCBsb2NhdGlvbi9lbmRwb2ludCB1c2luZyBYU0xUIHRyYW5zZm9ybWF0aW9uLiBUaGUgdHJhbnNmb3JtZXIgY291bGQgbm90IGJlIGNyZWF0ZWQgdG8gZG8gdGhlIHRyYW5zZm9ybWF0aW9uLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzMzX0RJQUdfQ0FVU0VfMigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8zM19ESUFHX0NBVVNFXzIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8zM19ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQzMy5kaWFnLmNhdXNlLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHB1Ymxpc2hpbmcgdGhlIHNlcnZpY2Ugd3NkbCwgdGhlIGh0dHAgbG9jYXRpb24gaXMgcGF0Y2hlZCB3aXRoIHRoZSBkZXBsb3llZCBsb2NhdGlvbi9lbmRwb2ludCB1c2luZyBYU0xUIHRyYW5zZm9ybWF0aW9uLiBUaGUgdHJhbnNmb3JtZXIgY291bGQgbm90IGJlIGNyZWF0ZWQgdG8gZG8gdGhlIHRyYW5zZm9ybWF0aW9uLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzMzX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8zM19ESUFHX0NBVVNFXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVSUk9SX0lNUExFTUVOVE9SX1JFR0lTVFJZX0RVUExJQ0FURV9OQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci5pbXBsZW1lbnRvclJlZ2lzdHJ5LmR1cGxpY2F0ZU5hbWUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ0MjogZHVwbGljYXRlIHBvcnQgbmFtZTogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTVBMRU1FTlRPUl9SRUdJU1RSWV9EVVBMSUNBVEVfTkFNRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVJST1JfSU1QTEVNRU5UT1JfUkVHSVNUUllfRFVQTElDQVRFX05BTUUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUlJPUl9JTVBMRU1FTlRPUl9SRUdJU1RSWV9GSUxFX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXJyb3IuaW1wbGVtZW50b3JSZWdpc3RyeS5maWxlTm90Rm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ0NTogZmlsZSBub3QgZm91bmQ6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU1QTEVNRU5UT1JfUkVHSVNUUllfRklMRV9OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVSUk9SX0lNUExFTUVOVE9SX1JFR0lTVFJZX0ZJTEVfTk9UX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9UUkFDRV9JTlZPS0lOR19JTVBMRU1FTlRPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC50cmFjZS5pbnZva2luZ0ltcGxlbWVudG9yIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMjE6IGludm9raW5nIGltcGxlbWVudG9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfVFJBQ0VfSU5WT0tJTkdfSU1QTEVNRU5UT1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfVFJBQ0VfSU5WT0tJTkdfSU1QTEVNRU5UT1IoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMTdfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTcuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHdvIG9yIG1vcmUgZW5kcG9pbnRzIHdpdGggdGhlIHNhbWUgbmFtZSB3aGVyZSBmb3VuZCBpbiB0aGUgamF4cnBjLXJpLnhtbCBydW50aW1lIGRlc2NyaXB0b3IKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8xN19ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMTdfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVE1MX05PTl9ST09UX1BBR0VfQk9EWV8yKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHRtbC5ub25Sb290UGFnZS5ib2R5MiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkludmFsaWQgcmVxdWVzdCBVUkkuPC9wPjxwPlBsZWFzZSBjaGVjayB5b3VyIGRlcGxveW1lbnQgaW5mb3JtYXRpb24uPC9wPgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTF9OT05fUk9PVF9QQUdFX0JPRFlfMigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUTUxfTk9OX1JPT1RfUEFHRV9CT0RZXzIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUhUTUxfTk9OX1JPT1RfUEFHRV9CT0RZXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodG1sLm5vblJvb3RQYWdlLmJvZHkxIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QSBXZWIgU2VydmljZSBpcyBpbnN0YWxsZWQgYXQgdGhpcyBVUkwuPC9wPgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTF9OT05fUk9PVF9QQUdFX0JPRFlfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUTUxfTk9OX1JPT1RfUEFHRV9CT0RZXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBVQkxJU0hFUl9JTkZPX0FQUExZSU5HX1RSQU5TRk9STUFUSU9OKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJwdWJsaXNoZXIuaW5mby5hcHBseWluZ1RyYW5zZm9ybWF0aW9uIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMzE6IGFwcGx5aW5nIHRyYW5zZm9ybWF0aW9uIHdpdGggYWN0dWFsIGFkZHJlc3M6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFVCTElTSEVSX0lORk9fQVBQTFlJTkdfVFJBTlNGT1JNQVRJT04oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBVQkxJU0hFUl9JTkZPX0FQUExZSU5HX1RSQU5TRk9STUFUSU9OKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzI5X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDI5LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZSBwb3J0IHZhbGlkPyBVbnppcCB0aGUgd2FyIGZpbGUgYW5kIG1ha2Ugc3VyZSB0aGUgdGllIGFuZCBzZXJpYWxpemVycyBhcmUgcHJlc2VudAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzI5X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8yOV9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFUlZMRVRfVFJBQ0VfR09UX1JFUVVFU1RfRk9SX0VORFBPSU5UKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0LnRyYWNlLmdvdFJlcXVlc3RGb3JFbmRwb2ludCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDE5OiBnb3QgcmVxdWVzdCBmb3IgZW5kcG9pbnQ6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9UUkFDRV9HT1RfUkVRVUVTVF9GT1JfRU5EUE9JTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfVFJBQ0VfR09UX1JFUVVFU1RfRk9SX0VORFBPSU5UKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRVJST1JfU0VSVkxFVF9JTklUX0NPTkZJR19QQVJBTUVURVJfTUlTU0lORyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXJyb3Iuc2VydmxldC5pbml0LmNvbmZpZy5wYXJhbWV0ZXIubWlzc2luZyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDQ3OiBjYW5ub3QgZmluZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjogInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1NFUlZMRVRfSU5JVF9DT05GSUdfUEFSQU1FVEVSX01JU1NJTkcoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVSUk9SX1NFUlZMRVRfSU5JVF9DT05GSUdfUEFSQU1FVEVSX01JU1NJTkcoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUlJPUl9JTVBMRU1FTlRPUl9GQUNUT1JZX1NFUlZBTlRfSU5JVF9GQUlMRUQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImVycm9yLmltcGxlbWVudG9yRmFjdG9yeS5zZXJ2YW50SW5pdEZhaWxlZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDQ0OiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc2VydmljZSBpbXBsZW1lbnRvciBmb3IgcG9ydCAiezB9IgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU1QTEVNRU5UT1JfRkFDVE9SWV9TRVJWQU5UX0lOSVRfRkFJTEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFUlJPUl9JTVBMRU1FTlRPUl9GQUNUT1JZX1NFUlZBTlRfSU5JVF9GQUlMRUQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMTNfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTMuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9ybWFsIHdlYiBzZXJ2aWNlIHNodXRkb3duCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMTNfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzEzX0RJQUdfQ0hFQ0tfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzMxX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDMxLmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybWF0aW9uIGJlaW5nIGFwcGxpZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8zMV9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMzFfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfNTBfRElBR19DSEVDS18zKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUNTAuZGlhZy5jaGVjay4zIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIHNlcnZlci54bWwgZmlsZSBpbiB0aGUgZG9tYWluIGRpcmVjdG9yeSBmb3IgZmFpbHVyZXMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF81MF9ESUFHX0NIRUNLXzMoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNTBfRElBR19DSEVDS18zKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUlJPUl9JTVBMRU1FTlRPUl9GQUNUT1JZX05PX0lOUFVUX1NUUkVBTSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImVycm9yLmltcGxlbWVudG9yRmFjdG9yeS5ub0lucHV0U3RyZWFtIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMzc6IG5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTVBMRU1FTlRPUl9GQUNUT1JZX05PX0lOUFVUX1NUUkVBTSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVSUk9SX0lNUExFTUVOVE9SX0ZBQ1RPUllfTk9fSU5QVVRfU1RSRUFNKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMjRfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMjQuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU09BUEZhdWx0IG1lc3NhZ2UgaXMgYmVpbmcgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yNF9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjRfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfNTBfRElBR19DSEVDS18yKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUNTAuZGlhZy5jaGVjay4yIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgQXBwbGljYXRpb24gc2VydmVyIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlIGNvcnJlY3QgaW4gdGhlIHNlcnZpY2Ugd2FyIGZpbGUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF81MF9ESUFHX0NIRUNLXzIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNTBfRElBR19DSEVDS18yKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfNTBfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUNTAuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgc3VuLWpheHdzLnhtbCBhbmQgd2ViLnhtbCBhcmUgY29ycmVjdCBpbiB0aGUgc2VydmljZSB3YXIgZmlsZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzUwX0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF81MF9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF80M19ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQ0My5kaWFnLmNoZWNrLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgd2ViIHNlcnZpY2UgaXMgYXZhaWxhYmxlIGFuZCBwdWJsaWMuIEV4YW1pbmUgZXhjZXB0aW9uIGZvciBtb3JlIGRldGFpbHMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF80M19ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNDNfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMTVfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTUuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2ViIFNlcnZpY2VzIHNlcnZsZXQgc2h1dGRvd24uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMTVfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzE1X0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzI3X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDI3LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgaW1wbGljaXQgVVJMCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMjdfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzI3X0RJQUdfQ0hFQ0tfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRVJST1JfSU1QTEVNRU5UT1JfUkVHSVNUUllfVU5LTk9XTl9OQU1FKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci5pbXBsZW1lbnRvclJlZ2lzdHJ5LnVua25vd25OYW1lIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMzg6IHVua25vd24gcG9ydCBuYW1lOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0lNUExFTUVOVE9SX1JFR0lTVFJZX1VOS05PV05fTkFNRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVJST1JfSU1QTEVNRU5UT1JfUkVHSVNUUllfVU5LTk9XTl9OQU1FKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9IVE1MX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC5odG1sLm5vdEZvdW5kIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogPGgxPjQwNCBOb3QgRm91bmQ6IHswfTwvaDE+CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0hUTUxfTk9UX0ZPVU5EKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0hUTUxfTk9UX0ZPVU5EKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSFRNTF9ST09UX1BBR0VfVElUTEUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodG1sLnJvb3RQYWdlLnRpdGxlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2ViIFNlcnZpY2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxfUk9PVF9QQUdFX1RJVExFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSFRNTF9ST09UX1BBR0VfVElUTEUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8yMF9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQyMC5kaWFnLmNoZWNrLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnppcCB0aGUgd2FyLCBhcmUgdGhlIHRpZSBhbmQgc2VyaWFsaXplciBjbGFzc2VzIGZvdW5kPworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzIwX0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8yMF9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUpBWFJQQ1NFUlZMRVRfMTFfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiSkFYUlBDU0VSVkxFVDExLmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTUnVudGltZUluZm9QYXJzZXIgY2F1bGQgbm90IHBhcnNlIHN1bi1qYXh3cy54bWwgcnVudGltZSBkZXNjcmlwdG9yCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhSUENTRVJWTEVUXzExX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUpBWFJQQ1NFUlZMRVRfMTFfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMTFfRElBR19DSEVDS18yKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTEuZGlhZy5jaGVjay4yIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGxlYXNlIGNoZWNrIHRoZSBqYXhycGMtcmkueG1sIGZpbGUgdG8gbWFrZSBzdXJlIGl0IGlzIHByZXNlbnQgaW4gdGhlIHdhciBmaWxlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMTFfRElBR19DSEVDS18yKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzExX0RJQUdfQ0hFQ0tfMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzExX0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDExLmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBsZWFzZSBjaGVjayB0aGUgc3VuLWpheHdzLnhtbCBmaWxlIHRvIG1ha2Ugc3VyZSBpdCBpcyBjb3JyZWN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMTFfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzExX0RJQUdfQ0hFQ0tfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzIyX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDIyLmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcmVxdWVzdCB3YXMgaW52b2tlZCB3aXRoIG5vIGVuZHBvaW50CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMjJfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzIyX0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzM0X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDM0LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBsb2cgZmlsZShzKSBmb3IgbW9yZSBkZXRhaWxlZCBlcnJvcnMvZXhjZXB0aW9ucy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8zNF9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMzRfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUlJPUl9TRVJWTEVUX05PX0lNUExFTUVOVE9SX0ZPUl9QT1JUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci5zZXJ2bGV0Lm5vSW1wbGVtZW50b3JGb3JQb3J0IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUNTI6IG5vIGltcGxlbWVudG9yIHJlZ2lzdGVyZWQgZm9yIHBvcnQ6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfU0VSVkxFVF9OT19JTVBMRU1FTlRPUl9GT1JfUE9SVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVJST1JfU0VSVkxFVF9OT19JTVBMRU1FTlRPUl9GT1JfUE9SVChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF82NF9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQ2NC5kaWFnLmNoZWNrLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgdGhlIGNsaWVudCByZXF1ZXN0IGlzIHVzaW5nIHRleHQveG1sCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfNjRfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzY0X0RJQUdfQ0hFQ0tfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzE4X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDE4LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgaW50ZW50aW9uYWwuIElmIG5vdCBleGFtaW5lIGNsaWVudCBwcm9ncmFtIGZvciBlcnJvcnMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMThfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzE4X0RJQUdfQ0hFQ0tfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzI5X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDI5LmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcG9ydCBpcyBzcGVjaWZpZWQsIGJ1dCBhIGNvcnJlc3BvbmRpbmcgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZm91bmQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yOV9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjlfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX0VSUk9SX05PX1JFU1BPTlNFX01FU1NBR0UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0LmVycm9yLm5vUmVzcG9uc2VNZXNzYWdlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMjM6IG5vIHJlc3BvbnNlIG1lc3NhZ2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfRVJST1JfTk9fUkVTUE9OU0VfTUVTU0FHRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfRVJST1JfTk9fUkVTUE9OU0VfTUVTU0FHRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9IVE1MX1NUQVRVU19FUlJPUigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQuaHRtbC5zdGF0dXMuZXJyb3IiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFUlJPUgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9IVE1MX1NUQVRVU19FUlJPUigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfSFRNTF9TVEFUVVNfRVJST1IoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUxJU1RFTkVSX0lORk9fSU5JVElBTElaRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImxpc3RlbmVyLmluZm8uaW5pdGlhbGl6ZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDEyOiBKQVgtV1MgY29udGV4dCBsaXN0ZW5lciBpbml0aWFsaXppbmcKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExJU1RFTkVSX0lORk9fSU5JVElBTElaRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUxJU1RFTkVSX0lORk9fSU5JVElBTElaRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9IVE1MX05PX0lORk9fQVZBSUxBQkxFKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC5odG1sLm5vSW5mb0F2YWlsYWJsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPk5vIEpBWC1XUyBjb250ZXh0IGluZm9ybWF0aW9uIGF2YWlsYWJsZS48L3A+CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0hUTUxfTk9fSU5GT19BVkFJTEFCTEUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0hUTUxfTk9fSU5GT19BVkFJTEFCTEUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFUlZMRVRfSFRNTF9JTkZPUk1BVElPTl9UQUJMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0Lmh0bWwuaW5mb3JtYXRpb24udGFibGUiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8dGFibGUgYm9yZGVyPSIwIj48dHI+PHRkPkFkZHJlc3M6PC90ZD48dGQ+ezB9PC90ZD48L3RyPjx0cj48dGQ+V1NETDo8L3RkPjx0ZD48YSBocmVmPSJ7MH0/d3NkbCI+ezB9P3dzZGw8L2E+PC90ZD48L3RyPjx0cj48dGQ+UG9ydCBRTmFtZTo8L3RkPjx0ZD57MX08L3RkPjwvdHI+PHRyPjx0ZD5JbXBsZW1lbnRhdGlvbiBjbGFzczo8L3RkPjx0ZD57Mn08L3RkPjwvdHI+PC90YWJsZT4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfSFRNTF9JTkZPUk1BVElPTl9UQUJMRShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0hUTUxfSU5GT1JNQVRJT05fVEFCTEUoYXJnMCwgYXJnMSwgYXJnMikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX1RSQUNFX1dSSVRJTkdfRkFVTFRfUkVTUE9OU0UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0LnRyYWNlLndyaXRpbmdGYXVsdFJlc3BvbnNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMjQ6IHdyaXRpbmcgZmF1bHQgcmVzcG9uc2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfVFJBQ0VfV1JJVElOR19GQVVMVF9SRVNQT05TRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfVFJBQ0VfV1JJVElOR19GQVVMVF9SRVNQT05TRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9FUlJPUl9OT19JTVBMRU1FTlRPUl9GT1JfRU5EUE9JTlQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQuZXJyb3Iubm9JbXBsZW1lbnRvckZvckVuZHBvaW50IiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMjA6IG5vIGltcGxlbWVudG9yIGZvciBlbmRwb2ludDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0VSUk9SX05PX0lNUExFTUVOVE9SX0ZPUl9FTkRQT0lOVChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU0VSVkxFVF9FUlJPUl9OT19JTVBMRU1FTlRPUl9GT1JfRU5EUE9JTlQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMTNfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTMuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGV4dCBsaXN0ZW5lciBzaHV0ZG93bgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzEzX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8xM19ESUFHX0NBVVNFXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF81MF9ESUFHX0NBVVNFXzMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQ1MC5kaWFnLmNhdXNlLjMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGVyZSBtYXkgc29tZSBBcHBsaWNhdGlvbiBTZXJ2ZXIgaW5pdGlhbGl6YXRpb24gcHJvYmxlbXMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF81MF9ESUFHX0NBVVNFXzMoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNTBfRElBR19DQVVTRV8zKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMzJfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMzIuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9ybWFsIE9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8zMl9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMzJfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfNTBfRElBR19DQVVTRV8yKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUNTAuZGlhZy5jYXVzZS4yIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gc2VydmVyIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbWF5IGJlIGluY29ycmVjdAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzUwX0RJQUdfQ0FVU0VfMigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF81MF9ESUFHX0NBVVNFXzIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF81MF9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQ1MC5kaWFnLmNhdXNlLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUyBydW50aW1lIHN1bi1qYXh3cy54bWwgb3Igd2ViLnhtbCBtYXkgYmUgaW5jb3JyZWN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfNTBfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzUwX0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9IVE1MX1NUQVRVU19BQ1RJVkUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0Lmh0bWwuc3RhdHVzLmFjdGl2ZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFDVElWRQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9IVE1MX1NUQVRVU19BQ1RJVkUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0hUTUxfU1RBVFVTX0FDVElWRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzI1X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDI1LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYWNpbmcgbWVzc2FnZSwgbm9ybWFsIHJlc3BvbnNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzI1X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8yNV9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF80M19ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQ0My5kaWFnLmNhdXNlLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0aW9uIG9mIHRoZSB3ZWIgc2VydmljZSBmYWlsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfNDNfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzQzX0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzI3X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDI3LmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxpY2l0IFVSTFMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyByZWFsZWFzZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzI3X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8yN19ESUFHX0NBVVNFXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVSUk9SX1NFUlZMRVRfQ0FVR0hUX1RIUk9XQUJMRV9JTl9JTklUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci5zZXJ2bGV0LmNhdWdodFRocm93YWJsZUluSW5pdCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDUwOiBjYXVnaHQgdGhyb3dhYmxlIGR1cmluZyBzZXJ2bGV0IGluaXRpYWxpemF0aW9uOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1NFUlZMRVRfQ0FVR0hUX1RIUk9XQUJMRV9JTl9JTklUKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFUlJPUl9TRVJWTEVUX0NBVUdIVF9USFJPV0FCTEVfSU5fSU5JVChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVSUk9SX1NFUlZMRVRfQ0FVR0hUX1RIUk9XQUJMRV9XSElMRV9SRUNPVkVSSU5HKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci5zZXJ2bGV0LmNhdWdodFRocm93YWJsZVdoaWxlUmVjb3ZlcmluZyIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDUxOiBjYXVnaHQgdGhyb3dhYmxlIHdoaWxlIHJlY292ZXJpbmcgZnJvbSBhIHByZXZpb3VzIGV4Y2VwdGlvbjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9TRVJWTEVUX0NBVUdIVF9USFJPV0FCTEVfV0hJTEVfUkVDT1ZFUklORyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVJST1JfU0VSVkxFVF9DQVVHSFRfVEhST1dBQkxFX1dISUxFX1JFQ09WRVJJTkcoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVOT19TVU5KQVhXU19YTUwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIm5vLnN1bmpheHdzLnhtbCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnRpbWUgZGVzY3JpcHRvciAiezB9IiBpcyBtaXNpbmcKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PX1NVTkpBWFdTX1hNTChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlTk9fU1VOSkFYV1NfWE1MKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9IVE1MX1RJVExFXzIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0Lmh0bWwudGl0bGUyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogPGgxPldlYiBTZXJ2aWNlczwvaDE+CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0hUTUxfVElUTEVfMigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfSFRNTF9USVRMRV8yKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVMSVNURU5FUl9JTkZPX0RFU1RST1koKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJsaXN0ZW5lci5pbmZvLmRlc3Ryb3kiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQxMzogSkFYLVdTIGNvbnRleHQgbGlzdGVuZXIgZGVzdHJveWVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMSVNURU5FUl9JTkZPX0RFU1RST1koKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVMSVNURU5FUl9JTkZPX0RFU1RST1koKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVYQ0VQVElPTl9URU1QTEFURV9DUkVBVElPTl9GQUlMRUQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJleGNlcHRpb24udGVtcGxhdGVDcmVhdGlvbkZhaWxlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDM1OiBmYWlsZWQgdG8gY3JlYXRlIGEgdGVtcGxhdGUgb2JqZWN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFWENFUFRJT05fVEVNUExBVEVfQ1JFQVRJT05fRkFJTEVEKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVhDRVBUSU9OX1RFTVBMQVRFX0NSRUFUSU9OX0ZBSUxFRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzIwX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDIwLmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNlcnZpY2UgY2FuIG5vdCBiZSBmb3VuZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzIwX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8yMF9ESUFHX0NBVVNFXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVRSQUNFX1NFUlZMRVRfV1JJVElOR19GQVVMVF9SRVNQT05TRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInRyYWNlLnNlcnZsZXQud3JpdGluZ0ZhdWx0UmVzcG9uc2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ2MTogd3JpdGluZyBmYXVsdCByZXNwb25zZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFJBQ0VfU0VSVkxFVF9XUklUSU5HX0ZBVUxUX1JFU1BPTlNFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVFJBQ0VfU0VSVkxFVF9XUklUSU5HX0ZBVUxUX1JFU1BPTlNFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMjNfRElBR19DSEVDS18yKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMjMuZGlhZy5jaGVjay4yIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgbWF5IGJlIG1hbGZvcm1lZCBhbmQgYmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZpY2UsIHlldCBkaWQgbm90IGdlbmVyYXRlIGEgcmVzcG9uc2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yM19ESUFHX0NIRUNLXzIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjNfRElBR19DSEVDS18yKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMjNfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMjMuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgYSByZXNwb25zZSB3YXMgZXhwZWN0ZWQsIGNoZWNrIHRoYXQgYSByZXF1ZXN0IG1lc3NhZ2Ugd2FzIGFjdHVhbGx5IHNlbnQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yM19ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjNfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX1dBUk5JTkdfTUlTU0lOR19DT05URVhUX0lORk9STUFUSU9OKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC53YXJuaW5nLm1pc3NpbmdDb250ZXh0SW5mb3JtYXRpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQxNjogbWlzc2luZyBjb250ZXh0IGluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX1dBUk5JTkdfTUlTU0lOR19DT05URVhUX0lORk9STUFUSU9OKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU0VSVkxFVF9XQVJOSU5HX01JU1NJTkdfQ09OVEVYVF9JTkZPUk1BVElPTigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzE2X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDE2LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuamFyIHRoZSBzZXJ2aWNlIHdhciBmaWxlOyBjaGVjayB0byBzZWUgdGhhdCB0aGUgamF4cnBjLXJpLXJ1bnRpbWUueG1sIGZpbGUgaXMgcHJlc2VudAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzE2X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8xNl9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8zNF9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQzNC5kaWFnLmNhdXNlLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYXRpb24gcGF0Y2hpbmcgb24gdGhlIHdzZGwgZmFpbGVkIHdoZW4gYXR0ZW1wdGluZyB0byB0cmFuc2Zvcm0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMzRfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzM0X0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSFRNTF9OT05fUk9PVF9QQUdFX1RJVExFKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHRtbC5ub25Sb290UGFnZS50aXRsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlYiBTZXJ2aWNlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MX05PTl9ST09UX1BBR0VfVElUTEUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVIVE1MX05PTl9ST09UX1BBR0VfVElUTEUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFUlZMRVRfSFRNTF9DT0xVTU5fSEVBREVSX0lORk9STUFUSU9OKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC5odG1sLmNvbHVtbkhlYWRlci5pbmZvcm1hdGlvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0hUTUxfQ09MVU1OX0hFQURFUl9JTkZPUk1BVElPTigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfSFRNTF9DT0xVTU5fSEVBREVSX0lORk9STUFUSU9OKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMThfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTguZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVzc2FnZSBzZW50IGJ5IGNsaWVudCBpcyBlbXB0eQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzE4X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8xOF9ESUFHX0NBVVNFXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF82NF9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQ2NC5kaWFnLmNhdXNlLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZWIgc2VydmljZSByZXF1ZXN0cyBtdXN0IGJlIGEgY29udGVudCB0eXBlIHRleHQveG1sOiBXU0kgQlAgMS4wCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfNjRfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzY0X0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5GT19TRVJWTEVUX0lOSVRJQUxJWklORygpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImluZm8uc2VydmxldC5pbml0aWFsaXppbmciKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ1NjogSkFYLVdTIHNlcnZsZXQ6IGluaXQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElORk9fU0VSVkxFVF9JTklUSUFMSVpJTkcoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVJTkZPX1NFUlZMRVRfSU5JVElBTElaSU5HKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX0lORk9fRU1QVFlfUkVRVUVTVF9NRVNTQUdFKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC5pbmZvLmVtcHR5UmVxdWVzdE1lc3NhZ2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQxODogZ290IGVtcHR5IHJlcXVlc3QgbWVzc2FnZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9JTkZPX0VNUFRZX1JFUVVFU1RfTUVTU0FHRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfSU5GT19FTVBUWV9SRVFVRVNUX01FU1NBR0UoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFUlZMRVRfRVJST1JfTk9fRU5EUE9JTlRfU1BFQ0lGSUVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC5lcnJvci5ub0VuZHBvaW50U3BlY2lmaWVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMjI6IG5vIGVuZHBvaW50IHNwZWNpZmllZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9FUlJPUl9OT19FTkRQT0lOVF9TUEVDSUZJRUQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0VSUk9SX05PX0VORFBPSU5UX1NQRUNJRklFRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzExX0RJQUdfQ0FVU0VfMigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDExLmRpYWcuY2F1c2UuMiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdW4tamF4d3MueG1sIHJ1bnRpbWUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG1heSBiZSBtaXNzaW5nCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMTFfRElBR19DQVVTRV8yKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzExX0RJQUdfQ0FVU0VfMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzMwX0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDMwLmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY291bGQgYmUgZHVlIHRvIGEgbnVtYmVyIG9mIGNhdXNlcy4gQ2hlY2sgdGhlIHNlcnZlciBsb2cgZmlsZSBmb3IgZXhjZXB0aW9ucy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8zMF9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMzBfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFWENFUFRJT05fQ0FOTk9UX0NSRUFURV9UUkFOU0ZPUk1FUigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImV4Y2VwdGlvbi5jYW5ub3RDcmVhdGVUcmFuc2Zvcm1lciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDMzOiBjYW5ub3QgY3JlYXRlIHRyYW5zZm9ybWVyCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFWENFUFRJT05fQ0FOTk9UX0NSRUFURV9UUkFOU0ZPUk1FUigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVYQ0VQVElPTl9DQU5OT1RfQ1JFQVRFX1RSQU5TRk9STUVSKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX0ZBVUxUU1RSSU5HX0lOVkFMSURfU09BUF9BQ1RJT04oKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0LmZhdWx0c3RyaW5nLmludmFsaWRTT0FQQWN0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUNjU6IEludmFsaWQgSGVhZGVyIFNPQVBBY3Rpb24gcmVxdWlyZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfRkFVTFRTVFJJTkdfSU5WQUxJRF9TT0FQX0FDVElPTigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfRkFVTFRTVFJJTkdfSU5WQUxJRF9TT0FQX0FDVElPTigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSFRNTF9ST09UX1BBR0VfQk9EWV8zX0IoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodG1sLnJvb3RQYWdlLmJvZHkzYiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqICc+aGVyZS48L2E+PC9wPgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTF9ST09UX1BBR0VfQk9EWV8zX0IoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVIVE1MX1JPT1RfUEFHRV9CT0RZXzNfQigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSFRNTF9ST09UX1BBR0VfQk9EWV8zX0EoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodG1sLnJvb3RQYWdlLmJvZHkzYSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkEgV1NETCBkZXNjcmlwdGlvbiBvZiB0aGVzZSBwb3J0cyBpcyBhdmFpbGFibGUgPGEgaHJlZj0nCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MX1JPT1RfUEFHRV9CT0RZXzNfQSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUTUxfUk9PVF9QQUdFX0JPRFlfM19BKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMTRfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTQuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9ybWFsIFdlYiBTZXJ2aWNlIGRlcGxveW1lbnQuIERlcGxveW1lbnQgb2Ygc2VydmljZSBjb21wbGV0ZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8xNF9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMTRfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMzJfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMzIuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NETCBiZWluZyBnZW5lcmF0ZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8zMl9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMzJfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMjVfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMjUuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU09BUE1lc3NhZ2UgcmVzcG9uc2UgaXMgYmVpbmcgcmV0dXJuZWQgdG8gY2xpZW50CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMjVfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzI1X0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzQ0X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDQ0LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBleGNlcHRpb24gZm9yIG1vcmUgZGV0YWlscy4gTWFrZSBzdXJlIGFsbCB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgY29ycmVjdC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF80NF9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNDRfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMjhfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMjguZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRhcmdldCBlbmRwb2ludCB3aXRoIHN0dWIuc2V0VGFyZ2V0RW5kcG9pbnQoKSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yOF9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjhfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX0lORk9fSU5JVElBTElaRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQuaW5mby5pbml0aWFsaXplIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMTQ6IEpBWC1XUyBzZXJ2bGV0IGluaXRpYWxpemluZworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9JTkZPX0lOSVRJQUxJWkUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0lORk9fSU5JVElBTElaRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRVJST1JfU0VSVkxFVF9JTklUX0NPTkZJR19GSUxFX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXJyb3Iuc2VydmxldC5pbml0LmNvbmZpZy5maWxlTm90Rm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ0ODogY29uZmlnIGZpbGU6ICJ7MH0iIG5vdCBmb3VuZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfU0VSVkxFVF9JTklUX0NPTkZJR19GSUxFX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVJST1JfU0VSVkxFVF9JTklUX0NPTkZJR19GSUxFX05PVF9GT1VORChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUhUTUxfV1NETF9QQUdFX1RJVExFKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHRtbC53c2RsUGFnZS50aXRsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlYiBTZXJ2aWNlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MX1dTRExfUEFHRV9USVRMRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUTUxfV1NETF9QQUdFX1RJVExFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX0hUTUxfQ09MVU1OX0hFQURFUl9QT1JUX05BTUUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0Lmh0bWwuY29sdW1uSGVhZGVyLnBvcnROYW1lIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9ydCBOYW1lCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0hUTUxfQ09MVU1OX0hFQURFUl9QT1JUX05BTUUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0hUTUxfQ09MVU1OX0hFQURFUl9QT1JUX05BTUUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUhUTUxfUk9PVF9QQUdFX0JPRFlfMl9CKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHRtbC5yb290UGFnZS5ib2R5MmIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MX1JPT1RfUEFHRV9CT0RZXzJfQigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUTUxfUk9PVF9QQUdFX0JPRFlfMl9CKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVE1MX1JPT1RfUEFHRV9CT0RZXzJfQSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImh0bWwucm9vdFBhZ2UuYm9keTJhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+SXQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwb3J0czoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxfUk9PVF9QQUdFX0JPRFlfMl9BKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSFRNTF9ST09UX1BBR0VfQk9EWV8yX0EoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8yMV9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQyMS5kaWFnLmNoZWNrLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWwgd2ViIHNlcnZpY2UgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yMV9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjFfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUlJPUl9TRVJWTEVUX05PX1BPUlRfU1BFQ0lGSUVEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXJyb3Iuc2VydmxldC5ub1BvcnRTcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ1Mzogbm8gcG9ydCBzcGVjaWZpZWQgaW4gSFRUUCBQT1NUIHJlcXVlc3QgVVJMCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9TRVJWTEVUX05PX1BPUlRfU1BFQ0lGSUVEKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVJST1JfU0VSVkxFVF9OT19QT1JUX1NQRUNJRklFRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlSU5GT19TRVJWTEVUX0dPVF9FTVBUWV9SRVFVRVNUX01FU1NBR0UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJpbmZvLnNlcnZsZXQuZ290RW1wdHlSZXF1ZXN0TWVzc2FnZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDU1OiBnb3QgZW1wdHkgcmVxdWVzdCBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPX1NFUlZMRVRfR09UX0VNUFRZX1JFUVVFU1RfTUVTU0FHRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUlORk9fU0VSVkxFVF9HT1RfRU1QVFlfUkVRVUVTVF9NRVNTQUdFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfNTFfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUNTEuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIHNlcnZlci54bWwgbG9nIGZpbGUgZm9yIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzUxX0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF81MV9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8yM19ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQyMy5kaWFnLmNhdXNlLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBnZW5lcmF0ZWQgbm8gcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzIzX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8yM19ESUFHX0NBVVNFXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8xNl9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQxNi5kaWFnLmNhdXNlLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgamF4cnBjLXJpLnhtbCBmaWxlIG1heSBiZSBtaXNzaW5nIGZyb20gdGhlIHdhciBmaWxlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMTZfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzE2X0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzM1X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDM1LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGR1cmluZyBjcmVhdGlvbiBvZiB0aGUgdGVtcGxhdGUuIFZpZXcgZXhjZXB0aW9uIGFuZCBzdGFja3RyYWNlIGZvciBtb3JlIGRldGFpbHMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMzVfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzM1X0RJQUdfQ0hFQ0tfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzY1X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDY1LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBTT0FQQWN0aW9uIGFuZCBhcHByb3ByaWF0ZSB2YWx1ZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzY1X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF82NV9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVRSQUNFX1NFUlZMRVRfSEFORElOR19SRVFVRVNUX09WRVJfVE9fSU1QTEVNRU5UT1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInRyYWNlLnNlcnZsZXQuaGFuZGluZ1JlcXVlc3RPdmVyVG9JbXBsZW1lbnRvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDU5OiBoYW5kaW5nIHJlcXVlc3Qgb3ZlciB0byBpbXBsZW1lbnRvcjogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUUkFDRV9TRVJWTEVUX0hBTkRJTkdfUkVRVUVTVF9PVkVSX1RPX0lNUExFTUVOVE9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVUUkFDRV9TRVJWTEVUX0hBTkRJTkdfUkVRVUVTVF9PVkVSX1RPX0lNUExFTUVOVE9SKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzE5X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDE5LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uYWwgbWVzc2FnZSBvbmx5LiBOb3JtYWwgb3BlcmF0aW9uLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzE5X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8xOV9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVBVQkxJU0hFUl9JTkZPX0dFTkVSQVRJTkdfV1NETChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgicHVibGlzaGVyLmluZm8uZ2VuZXJhdGluZ1dTREwiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQzMjogZ2VuZXJhdGluZyBXU0RMIGZvciBlbmRwb2ludDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQVUJMSVNIRVJfSU5GT19HRU5FUkFUSU5HX1dTREwoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVBVQkxJU0hFUl9JTkZPX0dFTkVSQVRJTkdfV1NETChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFUlZMRVRfV0FSTklOR19EVVBMSUNBVEVfRU5EUE9JTlRfVVJMX1BBVFRFUk4oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQud2FybmluZy5kdXBsaWNhdGVFbmRwb2ludFVybFBhdHRlcm4iLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQyNjogZHVwbGljYXRlIFVSTCBwYXR0ZXJuIGluIGVuZHBvaW50OiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfV0FSTklOR19EVVBMSUNBVEVfRU5EUE9JTlRfVVJMX1BBVFRFUk4oT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfV0FSTklOR19EVVBMSUNBVEVfRU5EUE9JTlRfVVJMX1BBVFRFUk4oYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVE1MX05PTl9ST09UX1BBR0VfQk9EWV8zX0IoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodG1sLm5vblJvb3RQYWdlLmJvZHkzYiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqICc+dGhpcyBwYWdlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlcGxveWVkIHNlcnZpY2VzLjwvcD4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxfTk9OX1JPT1RfUEFHRV9CT0RZXzNfQigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUTUxfTk9OX1JPT1RfUEFHRV9CT0RZXzNfQigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzQ5X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDQ5LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBzZXJ2ZXIueG1sIGxvZyBmaWxlIGZvciBleGNlcHRpb24gaW5mb3JtYXRpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF80OV9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNDlfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVE1MX05PTl9ST09UX1BBR0VfQk9EWV8zX0EoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodG1sLm5vblJvb3RQYWdlLmJvZHkzYSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPlBsZWFzZSByZWZlciB0byA8YSBocmVmPScKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxfTk9OX1JPT1RfUEFHRV9CT0RZXzNfQSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUhUTUxfTk9OX1JPT1RfUEFHRV9CT0RZXzNfQSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRVJST1JfSU1QTEVNRU5UT1JfUkVHSVNUUllfQ0FOTk9UX1JFQURfQ09ORklHVVJBVElPTigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImVycm9yLmltcGxlbWVudG9yUmVnaXN0cnkuY2Fubm90UmVhZENvbmZpZ3VyYXRpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQzOTogY2Fubm90IHJlYWQgY29uZmlndXJhdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU1QTEVNRU5UT1JfUkVHSVNUUllfQ0FOTk9UX1JFQURfQ09ORklHVVJBVElPTigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVSUk9SX0lNUExFTUVOVE9SX1JFR0lTVFJZX0NBTk5PVF9SRUFEX0NPTkZJR1VSQVRJT04oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVRSQUNFX1NFUlZMRVRfR09UX1JFU1BPTlNFX0ZST01fSU1QTEVNRU5UT1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInRyYWNlLnNlcnZsZXQuZ290UmVzcG9uc2VGcm9tSW1wbGVtZW50b3IiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ2MDogZ290IHJlc3BvbnNlIGZyb20gaW1wbGVtZW50b3I6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFJBQ0VfU0VSVkxFVF9HT1RfUkVTUE9OU0VfRlJPTV9JTVBMRU1FTlRPUihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVFJBQ0VfU0VSVkxFVF9HT1RfUkVTUE9OU0VfRlJPTV9JTVBMRU1FTlRPUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVSUk9SX0lNUExFTUVOVE9SX1JFR0lTVFJZX0lOQ09NUExFVEVfSU5GT1JNQVRJT04oKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci5pbXBsZW1lbnRvclJlZ2lzdHJ5LmluY29tcGxldGVJbmZvcm1hdGlvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDQxOiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluY29tcGxldGUKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0lNUExFTUVOVE9SX1JFR0lTVFJZX0lOQ09NUExFVEVfSU5GT1JNQVRJT04oKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFUlJPUl9JTVBMRU1FTlRPUl9SRUdJU1RSWV9JTkNPTVBMRVRFX0lORk9STUFUSU9OKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMTJfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTIuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9ybWFsIHdlYiBzZXJ2aWNlIHN0YXJ0dXAKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8xMl9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMTJfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMzBfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMzAuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlcmUgd2FzIGEgc2VydmVyIGVycm9yIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8zMF9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMzBfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVE1MX1dTRExfUEFHRV9OT19XU0RMKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHRtbC53c2RsUGFnZS5ub1dzZGwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5ObyBXU0RMIGRvY3VtZW50IGF2YWlsYWJsZSBmb3IgcHVibGlzaGluZy48L3A+PHA+UGxlYXNlIGNoZWNrIHlvdXIgZGVwbG95bWVudCBpbmZvcm1hdGlvbi48L3A+CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MX1dTRExfUEFHRV9OT19XU0RMKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSFRNTF9XU0RMX1BBR0VfTk9fV1NETCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzE0X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDE0LmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlYiBTZXJ2aWNlcyBzZXJ2bGV0IHN0YXJ0aW5nIHVwLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzE0X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8xNF9ESUFHX0NBVVNFXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUlORk9fU0VSVkxFVF9ERVNUUk9ZSU5HKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaW5mby5zZXJ2bGV0LmRlc3Ryb3lpbmciKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ1NzogSkFYLVdTIHNlcnZsZXQ6IGRlc3Ryb3kKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElORk9fU0VSVkxFVF9ERVNUUk9ZSU5HKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSU5GT19TRVJWTEVUX0RFU1RST1lJTkcoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVSUk9SX1NFUlZMRVRfTk9fUkVTUE9OU0VfV0FTX1BST0RVQ0VEKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXJyb3Iuc2VydmxldC5ub1Jlc3BvbnNlV2FzUHJvZHVjZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ1NDogbm8gcmVzcG9uc2Ugd2FzIHByb2R1Y2VkIChpbnRlcm5hbCBlcnJvcikKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1NFUlZMRVRfTk9fUkVTUE9OU0VfV0FTX1BST0RVQ0VEKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVJST1JfU0VSVkxFVF9OT19SRVNQT05TRV9XQVNfUFJPRFVDRUQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8yNl9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQyNi5kaWFnLmNoZWNrLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1heSBjYXVzZSBhIHByb2JsZW0sIHBsZWFzZSByZW1vdmUgZHVwbGljYXRlIGVuZHBvaW50cworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzI2X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8yNl9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFUlZMRVRfSFRNTF9USVRMRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQuaHRtbC50aXRsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlYiBTZXJ2aWNlcworICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9IVE1MX1RJVExFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU0VSVkxFVF9IVE1MX1RJVExFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfNDRfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUNDQuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHdlYiBzZXJ2aWNlIHdhcyBpbnN0YW50aWF0ZWQsIGhvd2V2ZXIsIGl0IGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzQ0X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF80NF9ESUFHX0NBVVNFXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF82M19ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQ2My5kaWFnLmNoZWNrLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgdGhhdCB5b3VyIEhUVFAgY2xpZW50IGlzIHVzaW5nIFBPU1QgcmVxdWVzdHMsIG5vdCBHRVQgcmVxdWVzdHMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF82M19ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNjNfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMjhfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMjguZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFyZ2V0IGVuZHBvaW50IGlzIG51bGwKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yOF9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjhfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUlJPUl9JTVBMRU1FTlRPUl9GQUNUT1JZX05PX0NPTkZJR1VSQVRJT04oKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci5pbXBsZW1lbnRvckZhY3Rvcnkubm9Db25maWd1cmF0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMzY6IG5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTVBMRU1FTlRPUl9GQUNUT1JZX05PX0NPTkZJR1VSQVRJT04oKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFUlJPUl9JTVBMRU1FTlRPUl9GQUNUT1JZX05PX0NPTkZJR1VSQVRJT04oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUhUTUxfUk9PVF9QQUdFX0JPRFlfNCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImh0bWwucm9vdFBhZ2UuYm9keTQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGVuZHBvaW50IGlzIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQuIFBsZWFzZSBjaGVjayB0aGUgbG9jYXRpb24gYW5kIGNvbnRlbnRzIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuPC9wPgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTF9ST09UX1BBR0VfQk9EWV80KCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSFRNTF9ST09UX1BBR0VfQk9EWV80KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVIVE1MX1JPT1RfUEFHRV9CT0RZXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJodG1sLnJvb3RQYWdlLmJvZHkxIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QSBXZWIgU2VydmljZSBpcyBpbnN0YWxsZWQgYXQgdGhpcyBVUkwuPC9wPgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTF9ST09UX1BBR0VfQk9EWV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlSFRNTF9ST09UX1BBR0VfQk9EWV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFWENFUFRJT05fVFJBTlNGT1JNQVRJT05fRkFJTEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJleGNlcHRpb24udHJhbnNmb3JtYXRpb25GYWlsZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQzNDogdHJhbnNmb3JtYXRpb24gZmFpbGVkIDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFWENFUFRJT05fVFJBTlNGT1JNQVRJT05fRkFJTEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFWENFUFRJT05fVFJBTlNGT1JNQVRJT05fRkFJTEVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9IVE1MX01FVEhPRCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQuaHRtbC5tZXRob2QiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ2MzogbXVzdCB1c2UgUG9zdCBmb3IgdGhpcyB0eXBlIG9mIHJlcXVlc3QKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfSFRNTF9NRVRIT0QoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0hUTUxfTUVUSE9EKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX0ZBVUxUU1RSSU5HX01JU1NJTkdfUE9SVCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQuZmF1bHRzdHJpbmcubWlzc2luZ1BvcnQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQyODogTWlzc2luZyBwb3J0IGluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0ZBVUxUU1RSSU5HX01JU1NJTkdfUE9SVCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfRkFVTFRTVFJJTkdfTUlTU0lOR19QT1JUKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMjFfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMjEuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFdlYiBzZXJ2aWNlIGlzIGJlaW5nIGludm9rZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yMV9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjFfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX1RSQUNFX1dSSVRJTkdfU1VDQ0VTU19SRVNQT05TRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQudHJhY2Uud3JpdGluZ1N1Y2Nlc3NSZXNwb25zZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDI1OiB3cml0aW5nIHN1Y2Nlc3MgcmVzcG9uc2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfVFJBQ0VfV1JJVElOR19TVUNDRVNTX1JFU1BPTlNFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU0VSVkxFVF9UUkFDRV9XUklUSU5HX1NVQ0NFU1NfUkVTUE9OU0UoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8zM19ESUFHX0NIRUNLXzIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQzMy5kaWFnLmNoZWNrLjIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGVyZSBtYXliZSBhIHRyYW5mb3JtYXRpb24gZW5naW5lIG1heSBub3QgYmUgc3VwcG9ydGVkIG9yIGNvbXBhdGlibGUuIENoZWNrIHRoZSBzZXJ2ZXIueG1sIGZpbGUgZm9yIGV4Y2VwdGlvbnMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMzNfRElBR19DSEVDS18yKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzMzX0RJQUdfQ0hFQ0tfMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzMzX0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDMzLmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZXJlIG1heWJlIGEgdHJhbmZvcm1hdGlvbiBlbmdpbmUgYmVpbmcgdXNlZCB0aGF0IGlzIG5vdCBjb21wYXRpYmxlLiBNYWtlIHN1cmUgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCB0cmFuc2Zvcm1lciBhbmQgdmVyc2lvbi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8zM19ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMzNfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfNTFfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUNTEuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmljZSBwcm9jZXNzaW5nIG9mIHRoZSByZXF1ZXN0IGdlbmVyYXRlZCBhbiBleGNlcHRpb247IHdoaWxlIGF0dGVtcHRpbmcgdG8gcmV0dXJuIGEgU09BUFBGYXVsdE1lc3NhZ2UgYSB0aG93YWJsZSB3YXMgYWdhaW4gZ2VuZXJhdGVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfNTFfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzUxX0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzI0X0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDI0LmRpYWcuY2hlY2suMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYWNpbmcgbWVzc2FnZSBmYXVsdCByZWNvcmRlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8yNF9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMjRfRElBR19DSEVDS18xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMTdfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMTcuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZSB0aGF0IHRoaXMgbWF5IGNhdXNlIHByb2JsZW1zIHdpdGggc2VydmljZSBkZXBsb3ltZW50CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMTdfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzE3X0RJQUdfQ0hFQ0tfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzM1X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDM1LmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgWFNMVCBzdHlsZXNoZWV0IHRlbXBsYXRlIGlzIGNyZWF0ZSBmb3IgdGhlIHdzZGwgbG9jYXRpb24gcGF0Y2hpbmcgdXNpbmcgdHJhbnNmb3JtYXRpb24uIFRlbXBsYXRlIGNyZWF0ZSBmYWlsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMzVfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzM1X0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzE5X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDE5LmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsaWVudCByZXF1ZXN0IGZvciB0aGlzIGVuZHBvaW50IGFycml2ZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8xOV9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMTlfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfNjVfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUNjUuZGlhZy5jYXVzZS4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU09BUCBBY3Rpb24gaXMgcmVxdWlyZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF82NV9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNjVfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVMSVNURU5FUl9QQVJTSU5HX0ZBSUxFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgibGlzdGVuZXIucGFyc2luZ0ZhaWxlZCIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDExOiBmYWlsZWQgdG8gcGFyc2UgcnVudGltZSBkZXNjcmlwdG9yOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExJU1RFTkVSX1BBUlNJTkdfRkFJTEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVMSVNURU5FUl9QQVJTSU5HX0ZBSUxFRChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFUlZMRVRfV0FSTklOR19JR05PUklOR19JTVBMSUNJVF9VUkxfUEFUVEVSTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC53YXJuaW5nLmlnbm9yaW5nSW1wbGljaXRVcmxQYXR0ZXJuIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMjc6IHVuc3VwcG9ydGVkIGltcGxpY2l0IFVSTCBwYXR0ZXJuIGluIGVuZHBvaW50OiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfV0FSTklOR19JR05PUklOR19JTVBMSUNJVF9VUkxfUEFUVEVSTihPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlU0VSVkxFVF9XQVJOSU5HX0lHTk9SSU5HX0lNUExJQ0lUX1VSTF9QQVRURVJOKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzQ5X0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDQ5LmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcnZpY2UgcHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdCBnZW5lcmF0ZWQgYW4gZXhjZXB0aW9uOyB3aGlsZSBhdHRlbXB0aW5nIHRvIHJldHVybiBhIFNPQVBGYXVsdE1lc3NhZ2UgYSB0aG93YWJsZSB3YXMgYWdhaW4gZ2VuZXJhdGVkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfNDlfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzQ5X0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlRVJST1JfSU1QTEVNRU5UT1JfRkFDVE9SWV9ORVdfSU5TVEFOQ0VfRkFJTEVEKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJlcnJvci5pbXBsZW1lbnRvckZhY3RvcnkubmV3SW5zdGFuY2VGYWlsZWQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQ0MzogZmFpbGVkIHRvIGluc3RhbnRpYXRlIHNlcnZpY2UgaW1wbGVtZW50b3IgZm9yIHBvcnQgInswfSIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0lNUExFTUVOVE9SX0ZBQ1RPUllfTkVXX0lOU1RBTkNFX0ZBSUxFRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlRVJST1JfSU1QTEVNRU5UT1JfRkFDVE9SWV9ORVdfSU5TVEFOQ0VfRkFJTEVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzEyX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDEyLmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRleHQgbGlzdGVuZXIgc3RhcnRpbmcKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF8xMl9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfMTJfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXU1NFUlZMRVRfMzFfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiV1NTRVJWTEVUMzEuZGlhZy5jaGVjay4xIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9ybWFsIG9wZXJhdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NTRVJWTEVUXzMxX0RJQUdfQ0hFQ0tfMSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVdTU0VSVkxFVF8zMV9ESUFHX0NIRUNLXzEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVNFUlZMRVRfRkFVTFRTVFJJTkdfSU5WQUxJRF9DT05URU5UX1RZUEUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0LmZhdWx0c3RyaW5nLmludmFsaWRDb250ZW50VHlwZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDY0OiBJbnZhbGlkIENvbnRlbnQtVHlwZSwgdGV4dC94bWwgcmVxdWlyZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfRkFVTFRTVFJJTkdfSU5WQUxJRF9DT05URU5UX1RZUEUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0ZBVUxUU1RSSU5HX0lOVkFMSURfQ09OVEVOVF9UWVBFKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVFUlJPUl9TRVJWTEVUX0NBVUdIVF9USFJPV0FCTEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImVycm9yLnNlcnZsZXQuY2F1Z2h0VGhyb3dhYmxlIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUNDk6IGNhdWdodCB0aHJvd2FibGU6IHswfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfU0VSVkxFVF9DQVVHSFRfVEhST1dBQkxFKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVFUlJPUl9TRVJWTEVUX0NBVUdIVF9USFJPV0FCTEUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVUUkFDRV9TRVJWTEVUX1dSSVRJTkdfU1VDQ0VTU19SRVNQT05TRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInRyYWNlLnNlcnZsZXQud3JpdGluZ1N1Y2Nlc3NSZXNwb25zZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDYyOiB3cml0aW5nIHN1Y2Nlc3MgcmVzcG9uc2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRSQUNFX1NFUlZMRVRfV1JJVElOR19TVUNDRVNTX1JFU1BPTlNFKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVFJBQ0VfU0VSVkxFVF9XUklUSU5HX1NVQ0NFU1NfUkVTUE9OU0UoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZUVSUk9SX0lNUExFTUVOVE9SX1JFR0lTVFJZX0NMQVNTX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiZXJyb3IuaW1wbGVtZW50b3JSZWdpc3RyeS5jbGFzc05vdEZvdW5kIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUNDA6IGNsYXNzIG5vdCBmb3VuZDogezB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTVBMRU1FTlRPUl9SRUdJU1RSWV9DTEFTU19OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZUVSUk9SX0lNUExFTUVOVE9SX1JFR0lTVFJZX0NMQVNTX05PVF9GT1VORChhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8xNV9ESUFHX0NIRUNLXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQxNS5kaWFnLmNoZWNrLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWwgV2ViIHNlcnZpY2UgdW5kZXBsb3ltZW50LiBVbmRlcGxveW1lbnQgY29tcGxldGUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMTVfRElBR19DSEVDS18xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzE1X0RJQUdfQ0hFQ0tfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9GQVVMVFNUUklOR19QT1JUX05PVF9GT1VORChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC5mYXVsdHN0cmluZy5wb3J0Tm90Rm91bmQiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXU1NFUlZMRVQyOTogUG9ydCBub3QgZm91bmQgKHswfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfRkFVTFRTVFJJTkdfUE9SVF9OT1RfRk9VTkQoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfRkFVTFRTVFJJTkdfUE9SVF9OT1RfRk9VTkQoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX0lORk9fREVTVFJPWSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQuaW5mby5kZXN0cm95Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMTU6IEpBWC1XUyBzZXJ2bGV0IGRlc3Ryb3llZAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9JTkZPX0RFU1RST1koKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0lORk9fREVTVFJPWSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9GQVVMVFNUUklOR19JTlRFUk5BTF9TRVJWRVJfRVJST1IoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInNlcnZsZXQuZmF1bHRzdHJpbmcuaW50ZXJuYWxTZXJ2ZXJFcnJvciIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdTU0VSVkxFVDMwOiBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IgKHswfSkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfRkFVTFRTVFJJTkdfSU5URVJOQUxfU0VSVkVSX0VSUk9SKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX0ZBVUxUU1RSSU5HX0lOVEVSTkFMX1NFUlZFUl9FUlJPUihhcmcwKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVdTU0VSVkxFVF8yNl9ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJXU1NFUlZMRVQyNi5kaWFnLmNhdXNlLjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5kcG9pbnQgVVJMIGlzIGEgZHVwbGljYXRlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU1NFUlZMRVRfMjZfRElBR19DQVVTRV8xKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlV1NTRVJWTEVUXzI2X0RJQUdfQ0FVU0VfMSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9IVE1MX0NPTFVNTl9IRUFERVJfU1RBVFVTKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC5odG1sLmNvbHVtbkhlYWRlci5zdGF0dXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfSFRNTF9DT0xVTU5fSEVBREVSX1NUQVRVUygpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfSFRNTF9DT0xVTU5fSEVBREVSX1NUQVRVUygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlV1NTRVJWTEVUXzYzX0RJQUdfQ0FVU0VfMSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoIldTU0VSVkxFVDYzLmRpYWcuY2F1c2UuMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlYiBzZXJ2aWNlIHJlcXVlc3RzIG11c3QgdXNlIEhUVFAgUE9TVCBtZXRob2Q6IFdTSSBCUCAxLjAKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTU0VSVkxFVF82M19ESUFHX0NBVVNFXzEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXU1NFUlZMRVRfNjNfRElBR19DQVVTRV8xKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVTRVJWTEVUX1dBUk5JTkdfRFVQTElDQVRFX0VORFBPSU5UX05BTUUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJzZXJ2bGV0Lndhcm5pbmcuZHVwbGljYXRlRW5kcG9pbnROYW1lIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUMTc6IGR1cGxpY2F0ZSBlbmRwb2ludCBuYW1lCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX1dBUk5JTkdfRFVQTElDQVRFX0VORFBPSU5UX05BTUUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVTRVJWTEVUX1dBUk5JTkdfRFVQTElDQVRFX0VORFBPSU5UX05BTUUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVRSQUNFX1NFUlZMRVRfUkVRVUVTVF9GT1JfUE9SVF9OQU1FRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgidHJhY2Uuc2VydmxldC5yZXF1ZXN0Rm9yUG9ydE5hbWVkIiwgYXJnMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1NTRVJWTEVUNTg6IGdvdCByZXF1ZXN0IGZvciBwb3J0OiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRSQUNFX1NFUlZMRVRfUkVRVUVTVF9GT1JfUE9SVF9OQU1FRChPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlVFJBQ0VfU0VSVkxFVF9SRVFVRVNUX0ZPUl9QT1JUX05BTUVEKGFyZzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlU0VSVkxFVF9OT19BRERSRVNTX0FWQUlMQUJMRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgic2VydmxldC5uby5hZGRyZXNzLmF2YWlsYWJsZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIGFkZHJlc3MgaXMgYXZhaWxhYmxlIGZvciB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfTk9fQUREUkVTU19BVkFJTEFCTEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVNFUlZMRVRfTk9fQUREUkVTU19BVkFJTEFCTEUoYXJnMCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1htbG1lc3NhZ2VNZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL1htbG1lc3NhZ2VNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYmIyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvWG1sbWVzc2FnZU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5Mb2NhbGl6ZXI7CisKKworLyoqCisgKiBEZWZpbmVzIHN0cmluZyBmb3JtYXR0aW5nIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBpbiB0aGUgcmVzb3VyY2UgZmlsZQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFhtbG1lc3NhZ2VNZXNzYWdlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy54bWxtZXNzYWdlIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxfTlVMTF9IRUFERVJTKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgieG1sLm51bGwuaGVhZGVycyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludmFsaWQgYXJndW1lbnQuIE1pbWVIZWFkZXJzPW51bGwKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9OVUxMX0hFQURFUlMoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxfTlVMTF9IRUFERVJTKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxfU0VUX1BBWUxPQURfRVJSKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgieG1sLnNldC5wYXlsb2FkLmVyciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvdWxkbid0IHNldCBQYXlsb2FkIGluIFhNTE1lc3NhZ2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9TRVRfUEFZTE9BRF9FUlIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxfU0VUX1BBWUxPQURfRVJSKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxfQ09OVEVOVF9UWVBFX01VU1RCRV9NVUxUSVBBUlQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWwuY29udGVudC10eXBlLm11c3RiZS5tdWx0aXBhcnQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250ZW50LVR5cGUgbmVlZHMgdG8gYmUgTXVsdGlwYXJ0L1JlbGF0ZWQgYW5kIHdpdGggdHlwZT10ZXh0L3htbAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0NPTlRFTlRfVFlQRV9NVVNUQkVfTVVMVElQQVJUKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MX0NPTlRFTlRfVFlQRV9NVVNUQkVfTVVMVElQQVJUKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxfVU5LTk9XTl9DT05URU5UX1RZUEUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWwudW5rbm93bi5Db250ZW50LVR5cGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlY29nbml6ZWQgQ29udGVudC1UeXBlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfVU5LTk9XTl9DT05URU5UX1RZUEUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxfVU5LTk9XTl9DT05URU5UX1RZUEUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVhNTF9HRVRfRFNfRVJSKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgieG1sLmdldC5kcy5lcnIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3VsZG4ndCBnZXQgRGF0YVNvdXJjZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0dFVF9EU19FUlIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxfR0VUX0RTX0VSUigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MX0NPTlRFTlRfVFlQRV9QQVJTRV9FUlIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWwuQ29udGVudC1UeXBlLnBhcnNlLmVyciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVycm9yIHdoaWxlIHBhcnNpbmcgTWltZUhlYWRlcnMgZm9yIENvbnRlbnQtVHlwZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0NPTlRFTlRfVFlQRV9QQVJTRV9FUlIoKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVYTUxfQ09OVEVOVF9UWVBFX1BBUlNFX0VSUigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MX0dFVF9TT1VSQ0VfRVJSKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgieG1sLmdldC5zb3VyY2UuZXJyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ291bGRuJ3QgcmV0dXJuIFNvdXJjZQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0dFVF9TT1VSQ0VfRVJSKCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MX0dFVF9TT1VSQ0VfRVJSKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxfQ0FOTk9UX0lOVEVSTkFMSVpFX01FU1NBR0UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeS5nZXRNZXNzYWdlKCJ4bWwuY2Fubm90LmludGVybmFsaXplLm1lc3NhZ2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5ub3QgY3JlYXRlIFhNTE1lc3NhZ2UKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9DQU5OT1RfSU5URVJOQUxJWkVfTUVTU0FHRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVhNTF9DQU5OT1RfSU5URVJOQUxJWkVfTUVTU0FHRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsaXphYmxlIGxvY2FsaXphYmxlWE1MX05PX0NPTlRFTlRfVFlQRSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInhtbC5uby5Db250ZW50LVR5cGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNaW1lSGVhZGVycyBkb2Vzbid0IGNvbnRhaW4gQ29udGVudC1UeXBlIGhlYWRlcgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX05PX0NPTlRFTlRfVFlQRSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVhNTF9OT19DT05URU5UX1RZUEUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGl6YWJsZSBsb2NhbGl6YWJsZVhNTF9ST09UX1BBUlRfSU5WQUxJRF9DT05URU5UX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInhtbC5yb290LnBhcnQuaW52YWxpZC5Db250ZW50LVR5cGUiLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYWQgQ29udGVudC1UeXBlIGZvciBSb290IFBhcnQgOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9ST09UX1BBUlRfSU5WQUxJRF9DT05URU5UX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsaXplci5sb2NhbGl6ZShsb2NhbGl6YWJsZVhNTF9ST09UX1BBUlRfSU5WQUxJRF9DT05URU5UX1RZUEUoYXJnMCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVYTUxfSU5WQUxJRF9DT05URU5UX1RZUEUoT2JqZWN0IGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoInhtbC5pbnZhbGlkLmNvbnRlbnQtdHlwZSIsIGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludmFsaWQgQ29udGVudC1UeXBlOiB7MH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9JTlZBTElEX0NPTlRFTlRfVFlQRShPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbG9jYWxpemVyLmxvY2FsaXplKGxvY2FsaXphYmxlWE1MX0lOVkFMSURfQ09OVEVOVF9UWVBFKGFyZzApKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9hZGRyZXNzaW5nLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvYWRkcmVzc2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMWJlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvYWRkcmVzc2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTMgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCit3cm9uZy5hZGRyZXNzaW5nLnZlcnNpb249RXhwZWN0ZWQgInswfSIgdmVyc2lvbiBvZiBXUy1BZGRyZXNzaW5nIGJ1dCBmb3VuZCAiezF9IgorcmVwbHlUby5jYW5ub3QucGFyc2U9UmVwbHlUbyBoZWFkZXIgY2Fubm90IGJlIHBhcnNlZAorZmF1bHRUby5jYW5ub3QucGFyc2U9RmF1bHRUbyBoZWFkZXIgY2Fubm90IGJlIHBhcnNlZAordW5rbm93bi53c2EuaGVhZGVyPVVua25vd24gV1MtQWRkcmVzc2luZyBoZWFkZXIKK2ludmFsaWQud3Nhdy5hbm9ueW1vdXM9SW52YWxpZCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHdzYXc6QW5vbnltb3VzOiAiezB9Igord3Nhdy5hbm9ueW1vdXNQcm9oaWJpdGVkPU9wZXJhdGlvbiBoYXMgInByb2hpYml0ZWQiIHZhbHVlIGZvciB3c2F3OmFub255bW91cyBpbiB0aGUgV1NETCwgXAorICBBZGRyZXNzaW5nIG11c3QgYmUgZGlzYWJsZWQgYW5kIFNPQVAgbWVzc2FnZSBuZWVkIHRvIGJlIGhhbmQtY3JhZnRlZAorbnVsbC5hZGRyZXNzaW5nLnZlcnNpb249VW5leHBlY3RlZCBudWxsIEFkZHJlc3NpbmcgdmVyc2lvbgorbnVsbC5zb2FwLnZlcnNpb249VW5leHBlY3RlZCBudWxsIFNPQVAgdmVyc2lvbgord3NkbEJvdW5kT3BlcmF0aW9uLm5vdEZvdW5kPUNhbm5vdCBmaW5kIGFuIG9wZXJhdGlvbiBpbiB3c2RsOmJpbmRpbmcgZm9yICJ7MH0iCitudWxsLmJpbmRpbmc9UG9wdWxhdGluZyByZXF1ZXN0IEFkZHJlc3NpbmcgaGVhZGVycyBhbmQgZm91bmQgbnVsbCBCaW5kaW5nCitudWxsLndzZGxQb3J0PVBvcHVsYXRpbmcgcmVxdWVzdCBBZGRyZXNzaW5nIGhlYWRlcnMgYW5kIGZvdW5kIG51bGwgV1NETFBvcnQKK251bGwucGFja2V0PVBvcHVsYXRpbmcgcmVxdWVzdCBBZGRyZXNzaW5nIGhlYWRlcnMgYW5kIGZvdW5kIG51bGwgUGFja2V0CitudWxsLmFjdGlvbj1Qb3B1bGF0aW5nIHJlcXVlc3QgQWRkcmVzc2luZyBoZWFkZXJzIGFuZCBmb3VuZCBudWxsIEFjdGlvbgorbnVsbC5tZXNzYWdlPU51bGwgbWVzc2FnZSBmb3VuZCB3aGVuIHByb2Nlc3NpbmcgdGhlIHNlcnZlciBpbmJvdW5kIHJlcXVlc3QgYW5kIFdTLUFkZHJlc3NpbmcgaXMgcmVxdWlyZWQKK251bGwuaGVhZGVycz1ObyBoZWFkZXJzIGZvdW5kIHdoZW4gcHJvY2Vzc2luZyB0aGUgc2VydmVyIGluYm91bmQgcmVxdWVzdCBhbmQgV1MtQWRkcmVzc2luZyBpcyByZXF1aXJlZAorbnVsbC53c2EuaGVhZGVycz1ObyBXUy1BZGRyZXNzaW5nIGhlYWRlcnMgZm91bmQgcHJvY2Vzc2luZyB0aGUgc2VydmVyIGluYm91bmQgcmVxdWVzdAorYWRkcmVzc2luZy5ub3RFbmFibGVkPUFkZHJlc3NpbmcgaXMgbm90IGVuYWJsZWQsIHswfSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBwaXBlbGluZSIKK3ZhbGlkYXRpb24uY2xpZW50Lm51bGxBY3Rpb249VmFsaWRhdGluZyBpbmJvdW5kIEFkZHJlc3NpbmcgaGVhZGVycyBvbiBjbGllbnQgYW5kIGZvdW5kIG51bGwgQWN0aW9uCit2YWxpZGF0aW9uLnNlcnZlci5udWxsQWN0aW9uPVZhbGlkYXRpbmcgaW5ib3VuZCBBZGRyZXNzaW5nIGhlYWRlcnMgb24gc2VydmVyIGFuZCBmb3VuZCBudWxsIEFjdGlvbgorCitub25Bbm9ueW1vdXMucmVzcG9uc2U9U2VuZGluZyAyMDIgYW5kIHByb2Nlc3Npbmcgbm9uLWFub255bW91cyByZXNwb25zZQorbm9uQW5vbnltb3VzLnVua25vd24ucHJvdG9jb2w9VW5rbm93biBwcm90b2NvbDogInswfSIKK25vbkFub255bW91cy5yZXNwb25zZS5zZW5kaW5nPVNlbmRpbmcgbm9uLWFub255bW91cyByZXBseSB0byAiezB9Igorbm9uQW5vbnltb3VzLnJlc3BvbnNlLm51bGxIZWFkZXJzPU5vIHJlc3BvbnNlIGhlYWRlcnMgZm91bmQgaW4gbm9uLWFub255bW91cyByZXNwb25zZSBmcm9tICJ7MH0iCitub25Bbm9ueW1vdXMucmVzcG9uc2UubnVsbE1lc3NhZ2U9Tm8gbWVzc2FnZSBmb3Igbm9uLWFub255bW91cyByZXNwb25zZSBmcm9tICJ7MH0iCitub25Bbm9ueW1vdXMucmVzcG9uc2Uub25ld2F5PUlnbm9yaW5nIG5vbi1hbm9ueW1vdXMgcmVzcG9uc2UgZm9yIG9uZS13YXkgbWVzc2FnZQorIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2NsaWVudC5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2NsaWVudC5wcm9wZXJ0aWVzCmluZGV4IGNlYjViODcuLjhmYzc3ZDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9jbGllbnQucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvY2xpZW50LnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsNyArMjEsNyBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogaHR0cC5jbGllbnQuY2Fubm90LmNvbm5lY3Q9Y2Fubm90IGNvbm5lY3QgdG8gc2VydmVyOiB7MH0KIGh0dHAuY2xpZW50LmZhaWxlZD1IVFRQIHRyYW5zcG9ydCBlcnJvcjogezB9CkBAIC0yOSwxNSArMjksMjYgQEAKIGh0dHAuY2xpZW50LmNhbm5vdENyZWF0ZU1lc3NhZ2VGYWN0b3J5PWNhbm5vdCBjcmVhdGUgbWVzc2FnZSBmYWN0b3J5CiBodHRwLmNsaWVudC51bmF1dGhvcml6ZWQ9cmVxdWVzdCByZXF1aXJlcyBIVFRQIGF1dGhlbnRpY2F0aW9uOiB7MH0KIGh0dHAubm90LmZvdW5kPUhUVFAgU3RhdHVzLUNvZGUgNDA0OiBOb3QgRm91bmQgLSB7MH0KLWh0dHAuc3RhdHVzLmNvZGU9SFRUUCBTdGF0dXMtQ29kZSB7MH06IHsxfQotaW52YWxpZC5wb3J0Lm5hbWU9ezB9IGlzIG5vdCBhIHZhbGlkIHBvcnQuIFZhbGlkIHBvcnRzOnsxfQoraHR0cC5zdGF0dXMuY29kZT1UaGUgc2VydmVyIHNlbnQgSFRUUCBzdGF0dXMgY29kZSB7MH06IHsxfQoraW52YWxpZC5wb3J0Lm5hbWU9ezB9IGlzIG5vdCBhIHZhbGlkIHBvcnQuIFZhbGlkIHBvcnRzIGFyZTogezF9CitpbnZhbGlkLmVwci5wb3J0Lm5hbWU9RW5kcG9pbnQgTmFtZSBzcGVjaWZpZWQgaW4gRVBSIHswfSAgaXMgbm90IGEgV1NETCBwb3J0IFFOYW1lLCB2YWxpZCBQb3J0cyBhcmUgezF9CitpbnZhbGlkLnNlcnZpY2UubmFtZT17MH0gaXMgbm90IGEgdmFsaWQgc2VydmljZS4gVmFsaWQgc2VydmljZXMgYXJlOiB7MX0KK2ludmFsaWQuc2VydmljZS5uYW1lLm51bGw9ezB9IGlzIG5vdCBhIHZhbGlkIHNlcnZpY2UKK2ludmFsaWQuc2VydmljZS5uby53c2RsPU5vIHdzZGwgbWV0YWRhdGEgZm9yIHNlcnZpY2U6IHswfSwgY2FuJ3QgY3JlYXRlIHByb3h5ISBUcnkgY3JlYXRpbmcgU2VydmljZSBieSBwcm92aWRpbmcgYSBXU0RMIFVSTAogaW52YWxpZC5iaW5kaW5nLmlkPUludmFsaWQgYmluZGluZyBpZDogezB9LiBNdXN0IGJlOiB7MX0KIGludmFsaWQuc29hcC5yb2xlLm5vbmU9Q2Fubm90IHNldCBTT0FQIDEuMiByb2xlICJub25lIgogbm9uLmxvZ2ljYWwuaGFuZGxlci5zZXQ9Q2Fubm90IHNldCB7MH0gb24gYmluZGluZy4gSGFuZGxlciBtdXN0IGJlIGEgTG9naWNhbEhhbmRsZXIuCi1ydW50aW1lLnBhcnNlci53c2RsLmludmFsaWRFbGVtZW50PWludmFsaWQgZWxlbWVudCBcInsxfVwiIGluIHRoZSBXU0RMIChsaW5lIHswfSkKLXNlcnZpY2Uubm9TZXJ2aWNlTmFtZT1DYW4ndCBjcmVhdGUgc2VydmljZSEgU2VydmljZSBuYW1lIG11c3QgYmUgbm9uLW51bGwKLXNlcnZpY2Uubm9XU0RMVXJsPU5vIHdzZGwgbWV0YWRhdGEgd2l0aCB0aGUgU2VydmljZSwgY2FuJ3QgY3JlYXRlIHByb3h5ISBUcnkgY3JlYXRpbmcgU2VydmljZSBieSBwcm92aWRpbmcgYSBXU0RMIFVSTAotc2VydmljZS5pbnZhbGlkUG9ydD1Qb3J0IHswfSBpcyBub3QgZm91bmQgaW4gc2VydmljZSB7MX0gaW4gdGhlIHdzZGwgezJ9Ci1zZXJ2aWNlLm5vUG9ydE5hbWU9Tm8gY29ycmVzcG9uZGluZyBwb3J0IGZvdW5kIGZvciB0aGUgc2VydmljZSBpbnRlcmZhY2UgezB9IGluIHsxfQotc2VydmljZS5pbnZhbGlkU2VydmljZU5hbWU9Q2Fubm90IGNyZWF0ZSBTZXJ2aWNlIGluc3RhbmNlLCBzZXJ2aWNlIHswfSBub3QgZm91bmQgaW4gdGhlIFdTREwgezF9CitydW50aW1lLndzZGxwYXJzZXIuaW52YWxpZFdTREw9SW52YWxpZCBXU0RMIHswfSwgZXhwZWN0ZWQgezF9IGZvdW5kIHsyfSBhdCAobGluZXszfSkKK3VuZGVmaW5lZC5iaW5kaW5nPVVuZGVmaW5lZCBiaW5kaW5nOiB7MH0KK3VuZGVmaW5lZC5wb3J0VHlwZT1VbmRlZmluZWQgcG9ydCB0eXBlOiB7MH0KK2ZhaWxlZC50by5wYXJzZS5lcHI9RmFpbGVkIHRvIHBhcnNlIEVQUjogezB9CitlcHIud2l0aG91dC5hZGRyZXNzaW5nLm9uPUVQUiBpcyBzcGVjaWZpZWQgd2l0aG91dCBlbmFibGluZyBXUy1BZGRyZXNzaW5nIHN1cHBvcnQuCitpbnZhbGlkLndzZGwudXJsPUludmFsaWQgV1NETCBVUkw6IHswfQord3NkbC5ub3QuZm91bmQ9V1NETCB1cmwgezB9IGlzIG5vdCBhY2Nlc3NpYmxlLgoraW52YWxpZC5hZGRyZXNzPUludmFsaWQgYWRkcmVzczogezB9Cit1bnN1cHBvcnRlZC5vcGVyYXRpb249ezB9IG5vdCBzdXBwb3J0ZWQgd2l0aCB7MX0uIE11c3QgYmU6IHsyfQoraW52YWxpZC5zb2FwLmFjdGlvbj1BIHZhbGlkIFNPQVBBY3Rpb24gc2hvdWxkIGJlIHNldCBpbiB0aGUgUmVxdWVzdENvbnRleHQgd2hlbiBBZGRyZXNzaW5nIGlzIGVuYWJsZWQsIFwKKyAgVXNlIEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSB0byBzZXQgaXQuCitmYWlsZWQudG8ucGFyc2VXaXRoTUVYPUZhaWxlZCB0byBhY2Nlc3MgdGhlIFdTREwgYXQ6IHswfS4gSXQgZmFpbGVkIHdpdGg6IFxuXHR7MX0uXG5SZXRyeWluZyB3aXRoIE1FWCBnYXZlOiBcblx0ezJ9CitmYWlsZWQudG8ucGFyc2U9RmFpbGVkIHRvIGFjY2VzcyB0aGUgV1NETCBhdDogezB9LiBJdCBmYWlsZWQgd2l0aDogXG5cdHsxfS4KICAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9kaXNwYXRjaC5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2Rpc3BhdGNoLnByb3BlcnRpZXMKaW5kZXggM2FiODMxNC4uZGU5ZTJjOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2Rpc3BhdGNoLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2Rpc3BhdGNoLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsNSArMjEsMjIgQEAKICMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCiAjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAjIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSMgCisjCisKK2ludmFsaWQubnVsbGFyZy5zb2FwLm1zZ21vZGU9U09BUC9IVFRQIEJpbmRpbmcgaW4gezB9IGlzIG5vdCBhbGxvd2VkIHdpdGggYSBudWxsIGludm9jYXRpb24gYXJndW1lbnQuIE11c3QgYmU6IHsxfQoraW52YWxpZC5udWxsYXJnLnhtbGh0dHAucmVxdWVzdC5tZXRob2Q9QSBYTUwvSFRUUCByZXF1ZXN0IHVzaW5nIE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9NRVRIT0QgZXF1YWxzIHswfSB3aXRoIGEgTnVsbCBpbnZvY2F0aW9uIEFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkLiBNdXN0IGJlOiB7MX0KK2ludmFsaWQucmVzcG9uc2U9Tm8gcmVzcG9uc2UgcmV0dXJuZWQuCitpbnZhbGlkLnJlc3BvbnNlLmRlc2VyaWFsaXphdGlvbj1GYWlsZWQgdG8gZGVzZXJpYWxpemUgdGhlIHJlc3BvbnNlLgoraW52YWxpZC5kYXRhc291cmNlLmRpc3BhdGNoLm1zZ21vZGU9Q2FuIG5vdCBjcmVhdGUgRGlzcGF0Y2g8RGF0YVNvdXJjZT4gb2YgU2VydmljZS5Nb2RlLlBBWUxPQUR7MH0uIE11c3QgYmU6IHsxfQoraW52YWxpZC5zb2FwbWVzc2FnZS5kaXNwYXRjaC5tc2dtb2RlPUNhbiBub3QgY3JlYXRlIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBvZiB7MH0uIE11c3QgYmUgezF9LgoraW52YWxpZC5kYXRhc291cmNlLmRpc3BhdGNoLmJpbmRpbmc9Q2FuIG5vdCBjcmVhdGUgRGlzcGF0Y2g8RGF0YVNvdXJjZT4gd2l0aCB7MH0uIE11c3QgYmU6IHsxfQoraW52YWxpZC5zb2FwbWVzc2FnZS5kaXNwYXRjaC5iaW5kaW5nPUNhbiBub3QgY3JlYXRlIERpc3BhdGNoPFNPQVBNZXNzYWdlPiB3aXRoIHswfSBCaW5kaW5nLiBNdXN0IGJlOiB7MX0gQmluZGluZy4KK2ludmFsaWQucXVlcnkuc3RyaW5nPVVuYWJsZSB0byByZXNvbHZlIGVuZHBvaW50IGFkZHJlc3MgdXNpbmcgdGhlIHN1cHBsaWVkIHF1ZXJ5IHN0cmluZzogezB9LgoraW52YWxpZC51cmkucGF0aC5xdWVyeT1VbmFibGUgdG8gY29uc3RydWN0IGEgVVJJIHdpdGggdGhpcyBwYXRoIGluZm8gezB9IGFuZCB0aGlzIHF1ZXJ5IHN0cmluZyB7MX0uCitpbnZhbGlkLnVyaT1FbmRwb2ludCBTdHJpbmc6IHswfSBpcyBhbmQgaW52YWxpZCBVUkkuCitpbnZhbGlkLnVyaS5kZWNvZGU9VW5hYmxlIHRvIGRlY29kZSB0aGUgcmVzb2x2ZWQgZW5kcG9pbnQgdXNpbmcgVVRGLTggZW5jb2RpbmcuCitpbnZhbGlkLnVyaS5yZXNvbHV0aW9uPVVuYWJsZSB0byByZXNvbHZlIGVuZHBvaW50IGFkZHJlc3MgdXNpbmcgdGhlIHN1cHBsaWVkIHBhdGg6IHswfS4KK2R1cGxpY2F0ZS5wb3J0PVdTRExQb3J0IHswfSBhbHJlYWR5IGV4aXN0cy4gQ2FuIG5vdCBjcmVhdGUgYSBwb3J0IG9mIHRoZSBzYW1lIFFOYW1lLgoraW52YWxpZC5xdWVyeS5sZWFkaW5nLmNoYXI9TGVhZGluZyAnPycgb2YgTWVzc2FnZUNvbnRleHQuUVVFUllfU1RSSU5HOiB7MH0gaXMgbm90IHZhbGlkLiBSZW1vdmUgJz8nIGFuZCBydW4gYWdhaW4uCitkdXBsaWNhdGUucG9ydD1XU0RMUG9ydCB7MH0gYWxyZWFkeSBleGlzdHMuIENhbiBub3QgY3JlYXRlIGEgcG9ydCBvZiB0aGUgc2FtZSBRTmFtZS4KICAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9lbmNvZGluZy5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2VuY29kaW5nLnByb3BlcnRpZXMKaW5kZXggZjcwZThlNy4uNThjMTY3NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2VuY29kaW5nLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2VuY29kaW5nLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsMTMgKzIxLDE0IEBACiAjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIyBoYXZlIGFueSBxdWVzdGlvbnMuCi0jIAorIwogCiAjbmVzdGVkCiBuZXN0ZWRTZXJpYWxpemF0aW9uRXJyb3I9c2VyaWFsaXphdGlvbiBlcnJvcjogezB9CiBuZXN0ZWREZXNlcmlhbGl6YXRpb25FcnJvcj1kZXNlcmlhbGl6YXRpb24gZXJyb3I6IHswfQogbmVzdGVkRW5jb2RpbmdFcnJvcj1lbmNvZGluZyBlcnJvcjogezB9CiAKK25vU3VjaENvbnRlbnRJZD1UaGVyZScncyBubyBhdHRhY2htZW50IGZvciB0aGUgY29udGVudCBJRCAiezB9IgogCiAjRW5jb2RlckRlY29kZXIKIGV4Y2VwdGlvbi5ub3Rmb3VuZD1leGNlcHRpb24gY2xhc3M6IHswfSBub3QgZm91bmQgaW4gdGhlIG1vZGVsIQpAQCAtMzYsNSArMzcsNiBAQAogdW5rbm93bi5vYmplY3Q9ZG9uXCd0IGtub3cgaG93IHRvIHdyaXRlIG9iamVjdDogezB9CiB4c2QudW5rbm93blByZWZpeD11bmtub3duIHByZWZpeCBcInswfVwiCiB4c2QudW5leHBlY3RlZEVsZW1lbnROYW1lPXVuZXhwZWN0ZWQgZWxlbWVudCBuYW1lOiBleHBlY3RlZD17MH0sIGFjdHVhbDogezF9Ci1taW1lLmNvbnRlbnRJZC5wYXJ0PUNhbid0IGFzc29jaWF0ZWQgdGhlIENvbnRlbnQtSUQgXCJ7MH1cIiB0byBhIFdTREwgcGFydCwgdGhlIENvbnRlbnQtSWQgbWlnaHQgbm90IGJlIGZvcm1hdHRlZCBhcyBwZXIgUjI5MzMgZGVmaW5lZCBpbiBBUCAxLjAuICAKKworZmFpbGVkLnRvLnJlYWQucmVzcG9uc2U9RmFpbGVkIHRvIHJlYWQgYSByZXNwb25zZTogezB9CiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvaGFuZGxlci5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2hhbmRsZXIucHJvcGVydGllcwppbmRleCA0MDc2MzRkLi40NDM2MGM4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvaGFuZGxlci5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9oYW5kbGVyLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsNyArMjEsNyBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogaGFuZGxlci5uZXN0ZWRFcnJvcj1oYW5kbGVyIGVycm9yOiB7MH0KIGhhbmRsZXIuY2hhaW4uY29udGFpbnMuaGFuZGxlci5vbmx5PUEgSGFuZGxlckNoYWluIGNhbiBvbmx5IGNvbnRhaW4gSGFuZGxlciBpbnN0YW5jZXM6IHswfQpAQCAtMjksNCArMjksNSBAQAogY2Fubm90LmV4dGVuZC5oYW5kbGVyLmRpcmVjdGx5PUhhbmRsZXIgezB9IG11c3QgaW1wbGVtZW50IExvZ2ljYWxIYW5kbGVyIG9yIFNPQVBIYW5kbGVyLgogaGFuZGxlci5ub3QudmFsaWQudHlwZT0gezB9IGRvZXMgbm90IGltcGxlbWVudCBvbmUgb2YgdGhlIGhhbmRsZXIgaW50ZXJmYWNlcy4KIGhhbmRsZXIubWVzc2FnZUNvbnRleHQuaW52YWxpZC5jbGFzcz0gXCJ7MH1cIiBpcyBub3QgYW4gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IFwiezF9XCIKK2hhbmRsZXIucHJlZGVzdHJveS5pZ25vcmU9RXhjZXB0aW9uIGlnbm9yZWQgZnJvbSBpbnZva2luZyBoYW5kbGVyIEBQcmVEZXN0cm95IG1ldGhvZDogezB9CiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvaHR0cHNlcnZlci5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL2h0dHBzZXJ2ZXIucHJvcGVydGllcwppbmRleCBjNzM4ZjMxLi4wNTFhZDU2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvaHR0cHNlcnZlci5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9odHRwc2VydmVyLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjEsOSArMjEsNyBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAotaHRtbC50aXRsZT1XZWIgU2VydmljZXMKLWh0bWwubm90Rm91bmQ9PGgxPjQwNCBOb3QgRm91bmQ6IHswfTwvaDE+CiB1bmV4cGVjdGVkLmh0dHAubWV0aG9kPUNhbm5vdCBoYW5kbGUgSFRUUCBtZXRob2Q6IHswfQogIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL21vZGVsZXIucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9tb2RlbGVyLnByb3BlcnRpZXMKaW5kZXggYjVkMzFiMC4uZTk2ZDUxNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL21vZGVsZXIucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvbW9kZWxlci5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDE4ICsyMSwyOSBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAotbmVzdGVkTW9kZWxlcm5FcnJvcj1ydW50aW1lIG1vZGVsZXIgZXJyb3I6IHswfQorbmVzdGVkTW9kZWxlckVycm9yPXJ1bnRpbWUgbW9kZWxlciBlcnJvcjogezB9CiAKIHJ1bnRpbWUubW9kZWxlci5uby53ZWJzZXJ2aWNlLmFubm90YXRpb249QSBXZWJTZXJ2aWNlIGFubm90YXRpb24gaXMgbm90IHByZXNlbnQgb24gY2xhc3M6IHswfQogcnVudGltZS5tb2RlbGVyLmVuZHBvaW50LmludGVyZmFjZS5uby53ZWJzZXJ2aWNlPVRoZSBFbmRwb2ludCBJbnRlcmZhY2U6IHswfSBkb2VzIG5vdCBoYXZlIFdlYlNlcnZpY2UgQW5ub3RhdGlvbgogcnVudGltZS5tb2RlbGVyLmNsYXNzLm5vdC5mb3VuZD1jbGFzczogezB9IGNvdWxkIG5vdCBiZSBmb3VuZAorcnVudGltZS5tb2RlbGVyLndyYXBwZXIubm90LmZvdW5kPVdyYXBwZXIgY2xhc3MgezB9IGlzIG5vdCBmb3VuZC4gSGF2ZSB5b3UgcnVuIEFQVCB0byBnZW5lcmF0ZSB0aGVtPwogcnVudGltZS5tb2RlbGVyLm1ldGhvZC5ub3QuZm91bmQ9bWV0aG9kOiB7MH0gY291bGQgbm90IGJlIGZvdW5kIG9uIGNsYXNzOiB7MX0KK3J1bnRpbWUubW9kZWxlci53ZWJtZXRob2QubXVzdC5iZS5wdWJsaWM9QFdlYk1ldGhvZCBpcyBub3QgYWxsb3dlZCBvbiBhIG5vbi1wdWJsaWMgbWV0aG9kIHswfQorcnVudGltZS5tb2RlbGVyLndlYm1ldGhvZC5tdXN0LmJlLm5vbnN0YXRpYz1AV2ViTWV0aG9kIGlzIG5vdCBhbGxvd2VkIG9uIGEgc3RhdGljIG1ldGhvZCB7MH0gIAogcnVudGltZS5tb2RlbGVyLm9uZXdheS5vcGVyYXRpb24ubm8ub3V0LnBhcmFtZXRlcnM9b25ld2F5IG9wZXJhdGlvbiBzaG91bGQgbm90IGhhdmUgb3V0IHBhcmFtZXRlcnMgY2xhc3M6IHswfSBtZXRob2Q6IHsxfQogcnVudGltZS5tb2RlbGVyLmNhbm5vdC5nZXQuc2VydmljZU5hbWUuZnJvbS5pbnRlcmZhY2U9VGhlIHNlcnZpY2VOYW1lIGNhbm5vdCBiZSByZXRyaWV2ZWQgZnJvbSBhbiBpbnRlcmZhY2UuICBjbGFzcyB7MH0KIHJ1bnRpbWUubW9kZWxlci5wb3J0bmFtZS5zZXJ2aWNlbmFtZS5uYW1lc3BhY2UubWlzbWF0Y2g9VGhlIG5hbWVzcGFjZSBvZiB0aGUgc2VydmljZU5hbWUgXCJ7MH1cIiBhbmQgdGhlIG5hbWVzcGFjZSBvZiB0aGUgcG9ydE5hbWUgXCJ7MX1cIiBtdXN0IG1hdGNoCiBydW50aW1lLm1vZGVsZXIubm8ucGFja2FnZT1BIEBXZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZSBtdXN0IGJlIHNwZWNpZmllZCBvbiBjbGFzc2VzIHdpdGggbm8gcGFja2FnZS4gIENsYXNzOiB7MH0KIHJ1bnRpbWUubW9kZWxlci5uby5vcGVyYXRpb25zPVRoZSB3ZWIgc2VydmljZSBkZWZpbmVkIGJ5IHRoZSBjbGFzcyB7MH0gZG9lcyBub3QgY29udGFpbiBhbnkgdmFsaWQgV2ViTWV0aG9kcy4KLXJ1bnRpbWUub3BlcmF0aW9uLm5vQmluZGluZz1CaW5kaW5nIGZvciBvcGVyYXRpb24gezB9IGluIHBvcnQgezF9IG5vdCBmb3VuZCEgUHJvYmFibHkgV1NETCBkb2Vzbid0IGNvbnRhaW4gYmluZGluZyBmb3IgdGhpcyBvcGVyYXRpb24uCitydW50aW1lLm1vZGVsZXIubXRvbS5jb25mbGljdCA9IEVycm9yIGluICBAQmluZGluZ1R5cGU6IE1UT00gQ29uZmlndXJhdGlvbiBpbiBiaW5kaW5nIGlkZW50aWZpZXIgezB9IGNvbmZsaWN0cyB3aXRoIGZlYXR1cmUgQE1UT00gezF9CitydW50aW1lLm1vZGVsZXIuZmVhdHVyZS5jb25mbGljdD0gRmVhdHVyZSB7MH0gaW4gaW1wbGVtZW50YXRpb24gY29uZmxpY3RzIHdpdGggezF9IGluIFdTREwgY29uZmlndXJhdGlvbiAKKworcnVudGltZS5tb2RlbGVyLndzZmVhdHVyZS5uby5mdHJjb25zdHJ1Y3Rvcj1Bbm5vdGF0aW9uIHswfSBpcyBub3QgcmVjb2duaXphYmxlLCBhdGxlYXN0IG9uZSBjb25zdHJ1Y3RvciBvZiB7MX0gc2hvdWxkIGJlIG1hcmtlZCB3aXRoIEBGZWF0dXJlQ29uc3RydWN0b3IKK3J1bnRpbWUubW9kZWxlci53c2ZlYXR1cmUubW9yZXRoYW5vbmUuZnRyY29uc3RydWN0b3I9QW5ub3RhdGlvbiB7MH0gaXMgaWxsZWdhbCwgT25seSBvbmUgY29uc3RydWN0b3Igb2YgezF9IGNhbiBiZSBtYXJrZWQgYXMgQEZlYXR1cmVDb25zdHJ1Y3RvcgorcnVudGltZS5tb2RlbGVyLndzZmVhdHVyZS5pbGxlZ2FsLmZ0cmNvbnN0cnVjdG9yPUFubm90YXRpb24gezB9IGlzIGlsbGVnYWwsIEluIHsxfSBARmVhdHVyZUNvbnN0cnVjdG9yIHZhbHVlIGRvZXMgbid0IG1hdGNoIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzCisKK3VuYWJsZS50by5jcmVhdGUuSkFYQkNvbnRleHQ9VW5hYmxlIHRvIGNyZWF0ZSBKQVhCQ29udGV4dCBkdWUgdG8gdGhlIHNlY3VyaXR5IHJlc3RyaWN0aW9uCitub3QuYS52YWxpZC5iYXJlLm1ldGhvZD1TRUkgezB9IGhhcyBtZXRob2QgezF9IGFubm90YXRlZCBhcyBCQVJFIGJ1dCBpdCBoYXMgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIgYm91bmQgdG8gYm9keS4gVGhpcyBpcyBpbnZhbGlkLiBQbGVhc2UgYW5ub3RhdGUgdGhlIG1ldGhvZCB3aXRoIGFubm90YXRpb246IEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZT1TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKQogIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3Byb3ZpZGVyQXBpLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvcHJvdmlkZXJBcGkucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTg1MTc1Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3Byb3ZpZGVyQXBpLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzNSBAQAorIworIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIyBoYXZlIGFueSBxdWVzdGlvbnMuCisjCisKK251bGwuYWRkcmVzcz1BZGRyZXNzIGluIGFuIEVQUiBjYW5ub3QgYmUgbnVsbAorbnVsbC5hZGRyZXNzLnNlcnZpY2UuZW5kcG9pbnQ9QWRkcmVzcyBpbiBhbiBFUFIgY2Fubm90IGJlIG51bGwsIHdoZW4gc2VydmljZU5hbWUgb3IgcG9ydE5hbWUgaXMgbnVsbAorbnVsbC5zZXJ2aWNlPXNlcnZpY2VOYW1lIGNhbid0IGJlIG51bGwgd2hlbiBwb3J0TmFtZSBpcyBzcGVjaWZpZWQKK251bGwucG9ydG5hbWU9RVBSIGRvZXMgbid0IGhhdmUgRW5kcG9pbnROYW1lIGluIHRoZSBNZXRhZGF0YQorbnVsbC53c2RsPSBFUFIgZG9lcyBuJ3QgaGF2ZSBXU0RMIE1ldGFkYXRhIHdoaWNoIGlzIG5lZWRlZCBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW9uCitub3Rmb3VuZC5zZXJ2aWNlLmluLndzZGw9IFNlcnZpY2U6IHswfSBub3QgZm91bmQgaW4gV1NETDogezF9Citub3Rmb3VuZC5wb3J0LmluLndzZGw9UG9ydDogezB9IG5vdCBhIHZhbGlkIHBvcnQgaW4gU2VydmljZTogezF9IGluIFdTREw6IHsyfQorZXJyb3Iud3NkbD0gRXJyb3IgaW4gcGFyc2luZyBXU0RMOiB7MH0KK251bGwuZXByPSBFbmRwb2ludFJlZmVyZW5jZSBpcyBudWxsCisgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvc2VuZGVyLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvc2VuZGVyLnByb3BlcnRpZXMKaW5kZXggNTRiMDM5YS4uOGNiODIwNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3NlbmRlci5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9zZW5kZXIucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw3ICsyMSw3IEBACiAjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIyBoYXZlIGFueSBxdWVzdGlvbnMuCi0jIAorIwogCiBzZW5kZXIubmVzdGVkRXJyb3I9c2VuZGVyIGVycm9yOiB7MH0KIHNlbmRlci5yZXF1ZXN0Lm1lc3NhZ2VOb3RSZWFkeT1tZXNzYWdlIG5vdCByZWFkeSB0byBiZSBzZW50CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvc2VydmVyLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvc2VydmVyLnByb3BlcnRpZXMKaW5kZXggOGFhMTUyOS4uMzVlNzNhMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3NlcnZlci5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9zZXJ2ZXIucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw3ICsyMSw3IEBACiAjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIyBoYXZlIGFueSBxdWVzdGlvbnMuCi0jIAorIwogCiBzb2FwZGVjb2Rlci5lcnI9RXJyb3IgaW4gZGVjb2RpbmcgU09BUCBNZXNzYWdlCiBzZXJ2ZXIucnQuZXJyPVNlcnZlciBSdW50aW1lIEVycm9yOiB7MH0KQEAgLTQwLDcgKzQwLDEwIEBACiAKIHJ1bnRpbWUud3NkbC5wYXRjaGVyPWVycm9yIHdoaWxlIHBhdGNoaW5nIFdTREwgcmVsYXRlZCBkb2N1bWVudAogCi1ub3QuaW1wbGVtZW50LnByb3ZpZGVyPUNsYXNzIFwiezB9XCIgZG9lc24ndCBpbXBsZW1lbnQgUHJvdmlkZXIKK25vdC5pbXBsZW1lbnQucHJvdmlkZXI9XCJ7MH1cIiBkb2Vzbid0IGltcGxlbWVudCBQcm92aWRlcgorcHJvdmlkZXIubm90LnBhcmFtZXRlcml6ZWQ9XCJ7MH1cIiBpbXBsZW1lbnRzIFByb3ZpZGVyIGJ1dCBkb2Vzbid0IHNwZWNpZnkgdGhlIHR5cGUgcGFyYW1ldGVyCitwcm92aWRlci5pbnZhbGlkLnBhcmFtZXRlclR5cGU9XCJ7MH1cIiBpbXBsZW1lbnRzIFByb3ZpZGVyIGJ1dCBpdHMgdHlwZSBwYXJhbWV0ZXIgezF9IGlzIGluY29ycmVjdAorCiB3c2RsLnJlcXVpcmVkPXdzZGwgaXMgcmVxdWlyZWQKIHNlcnZpY2UubmFtZS5yZXF1aXJlZD1TZXJ2aWNlIFFOYW1lIGlzIG5vdCBmb3VuZAogcG9ydC5uYW1lLnJlcXVpcmVkPVBvcnQgUU5hbWUgaXMgbm90IGZvdW5kCkBAIC01MCwxNSArNTMsOSBAQAogYWxyZWFkeS5odHRwcy5zZXJ2ZXI9VGhlcmUgaXMgYWxyZWFkeSBhIEhUVFBTIHNlcnZlciBhdCA6IHswfQogbm90Lkh0dHBDb250ZXh0LnR5cGU9UmVxdWlyZWQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwQ29udGV4dC4gR290IDogezB9CiAKLWNhbm5vdC5sb2FkLndzZGw9V1NETCBjYW5ub3QgYmUgbG9hZGVkIGZyb20gZ2l2ZW4gbG9jYXRpb24gOiB7MH0KLQotbm90LnByaW1hcnkud3NkbD1XU0RMIHNwZWNpZmllZCBieSB3c2RsTG9jYXRpb249ezB9IGlzIG5vdCBhIHByaW1hcnkgV1NETC4KIGR1cGxpY2F0ZS5wcmltYXJ5LndzZGw9TWV0YWRhdGEgaGFzIG1vcmUgdGhhbiBvbmUgV1NETCB0aGF0IGhhcyBTZXJ2aWNlIGRlZmluaXRvbiBmb3IgdGhlIGVuZHBvaW50LiBXU0RMPXswfSBpcyBvbmUgc3VjaCBXU0RMLgogZHVwbGljYXRlLmFic3RyYWN0LndzZGw9TWV0YWRhdGEgaGFzIG1vcmUgdGhhbiBvbmUgV1NETCB0aGF0IGhhcyBQb3J0VHlwZSBkZWZpbml0b24gZm9yIHRoZSBlbmRwb2ludC4gV1NETD17MH0gaXMgb25lIHN1Y2ggV1NETC4KLW5vLndzLmFubm90YXRpb249RW5kcG9pbnQgaW1wbGVtZW50YXRpb24gezB9IGRvZXNuJyd0IGhhdmUgQFdlYlNlcnZpY2Ugb3IgQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uCi1ib3RoLndzLmFubm90YXRpb25zPUVuZHBvaW50IGltcGxlbWVudGF0aW9uIHswfSBjYW5ub3QgaGF2ZSBib3RoIEBXZWJTZXJ2aWNlIGFuZCBAV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb25zCiAKLXJ1bnRpbWUucGFyc2VyLndyb25nLndzZGwubG9jYXRpb249SW5jb3JyZWN0IFdTREwgbG9jYWx0aW9uOiB7MH0uIEl0IHNob3VsZCBzdGFydCB3aXRoIFdFQi1JTkYvd3NkbAogcnVudGltZS5wYXJzZXIuY2xhc3NOb3RGb3VuZD1jbGFzcyBub3QgZm91bmQgaW4gcnVudGltZSBkZXNjcmlwdG9yOiB7MH0KIHJ1bnRpbWUucGFyc2VyLnhtbFJlYWRlcj1lcnJvciBwYXJzaW5nIHJ1bnRpbWUgZGVzY3JpcHRvcjogezB9CiBydW50aW1lLnBhcnNlci5pbnZhbGlkUmVhZGVyU3RhdGU9ZXJyb3IgcGFyc2luZyBydW50aW1lIGRlc2NyaXB0b3I6IHswfQpAQCAtNzAsMTAgKzY3LDM2IEBACiBydW50aW1lLnBhcnNlci5pbnZhbGlkLmF0dHJpYnV0ZS52YWx1ZT1pbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBcInsxfVwiIGluIHJ1bnRpbWUgZGVzY3JpcHRvciAobGluZSB7MH0pCiBydW50aW1lLnBhcnNlci5taXNzaW5nLmF0dHJpYnV0ZS5uby5saW5lPW1pc3NpbmcgYXR0cmlidXRlIFwiezJ9XCIgaW4gZWxlbWVudCBcInsxfVwiIG9mIHJ1bnRpbWUgZGVzY3JpcHRvcgogcnVudGltZS5wYXJzZXIud3JvbmcuZWxlbWVudD1mb3VuZCBlbGVtZW50IFwiezF9XCIsIGV4cGVjdGVkIFwiezJ9XCIgaW4gcnVudGltZSBkZXNjcmlwdG9yIChsaW5lIHswfSkKK3J1bnRpbWUucGFyc2VyLndzZGwubm90LmZvdW5kPXswfSBpcyBub3QgZm91bmQgaW4gdGhlIFdBUiBmaWxlLiBQYWNrYWdlIGl0IGluIHRoZSBXQVIgZmlsZSBvciBjb3JyZWN0IGl0IGluIHN1bi1qYXh3cy54bWwuCiBydW50aW1lLnBhcnNlci53c2RsPWV4Y2VwdGlvbiBkdXJpbmcgV1NETCBwYXJzaW5nOiB7MH0KIHJ1bnRpbWUuc2F4cGFyc2VyLmV4Y2VwdGlvbj17MH1cbnsxfQogcnVudGltZS5wYXJzZXIud3NkbC5ub3NlcnZpY2U9Y2FuXCd0IGFwcGx5IGJpbmRpbmchIHNlcnZpY2UgezB9IG5vdCBmb3VuZCBpbiB0aGUgV1NETCB7MX0KIHJ1bnRpbWUucGFyc2VyLndzZGwubm9iaW5kaW5nPWNhblwndCBhcHBseSBiaW5kaW5nISBubyBiaW5kaW5nIGZvdW5kIGZvciBiaW5kaW5nIElEIHswXSBmb3Igc2VydmljZSB7MX0gaW4gV1NETCB7Mn0KIHJ1bnRpbWUucGFyc2VyLndzZGwubXVsdGlwbGViaW5kaW5nPW11bHRpcGxlIGJpbmRpbmdzIGZvdW5kIGZvciBiaW5kaW5nIElEIHswfSBmb3Igc2VydmljZSB7MX0gaW4gV1NETCB7Mn0KLXJ1bnRpbWUucGFyc2VyLndzZGwuaW5jb3JyZWN0c2VydmljZXBvcnQ9Y291bGQgbm90IGdldCBiaW5kaW5nIGZyb20gV1NETCEgc2VydmljZTogezB9IG9yIHBvcnQgezF9IG5vdCBmb3VuZCBpbiB0aGUgV1NETCB7Mn0KK3J1bnRpbWUucGFyc2VyLndzZGwuaW5jb3JyZWN0c2VydmljZXBvcnQ9Y291bGQgbm90IGdldCBiaW5kaW5nIGZyb20gV1NETCEgc2VydmljZTogezB9IG9yIHBvcnQgezF9IG5vdCBmb3VuZCBpbiB0aGUgV1NETCB7Mn0uXG5cCisgIEl0IGNvdWxkIGJlIGJlY2F1c2Ugc2VydmljZSBhbmQgcG9ydCBuYW1lcyBkbyBub3QgbWF0Y2ggV1NETCcncyB3c2RsOnNlcnZpY2UgYW5kIHdzZGw6cG9ydCBuYW1lczpcblwKKyAgICAxLiBzZXJ2aWNlIGFuZCBwb3J0IG5hbWVzIGFyZSBub3QgdGhlcmUgaW4gZGVwbG95bWVudCBkZXNjcmlwdG9yIE9SXG5cCisgICAgMi4gRWl0aGVyIHRoZXJlIGlzIGEgdHlwbyBpbiBkZXBsb3ltZW50IGRlc2NyaXB0b3InJ3Mgc2VydmljZSBhbmQgcG9ydCBuYW1lcyBPUlxuXAorICAgIDMuIFRoZSBjb21wdXRlZCBuYW1lcyBmcm9tIEBXZWJTZXJ2aWNlIGRvIG5vdCBtYXRjaCB3c2RsOnNlcnZpY2UgYW5kIHdzZGw6cG9ydCBuYW1lc1xuXAorICBTdWdnZXN0IGRvaW5nIHRoZSBmb2xsb3dpbmc6XG5cCisgICAgMS4gQWRkL0NvcnJlY3QgZW50cmllcyBmb3Igc2VydmljZSBhbmQgcG9ydCBuYW1lcyBpbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgT1IgXG5cCisgICAgMi4gU3BlY2lmeSB0YXJnZXROYW1lc3BhY2UsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSBpbiBAV2ViU2VydmljZSBvbiB0aGUgZW5kcG9pbnQgY2xhc3MKKworc3RhdGVmdWwuY29va2llLmhlYWRlci5yZXF1aXJlZD1UaGlzIGlzIGEgc3RhdGVmdWwgd2ViIHNlcnZpY2UgYW5kIHswfSBoZWFkZXIgaXMgcmVxdWlyZWQuCitzdGF0ZWZ1bC5jb29raWUuaGVhZGVyLmluY29ycmVjdD1JbnZhbGlkL2V4cGlyZWQgezB9IGhlYWRlciB2YWx1ZTogezF9CitzdGF0ZWZ1bC5pbnZhbGlkLndlYnNlcnZpY2UuY29udGV4dD1Ob3QgYSBXZWJTZXJ2aWNlQ29udGV4dCBmcm9tIEpBWC1XUyBSSTogezB9CitzdGF0ZWZ1bC5yZXF1cmVzLmFkZHJlc3Npbmc9U3RhdGVmdWwgd2ViIHNlcnZpY2UgezB9IHJlcXVpcmVzIHRoZSBXUy1BZGRyZXNzaW5nIHN1cHBvcnQgdG8gYmUgZW5hYmxlZC4gUGVyaGFwcyB5b3UgYXJlIG1pc3NpbmcgQEFkZHJlc3NpbmcKKworbm8uY3VycmVudC5wYWNrZXQ9VGhpcyB0aHJlYWQgaXMgbm90IGN1cnJlbnRseSBwcm9jZXNzaW5nIGFueSB3ZWIgc2VydmljZSByZXF1ZXN0LgorCitmYWlsZWQudG8uaW5zdGFudGlhdGUuaW5zdGFuY2VSZXNvbHZlcj1VbmFibGUgdG8gaW5zdGFudGlhdGUgezB9ICh3aGljaCBpcyBzcGVjaWZpZWQgaW4gezF9IG9uIHsyfSkKKworc3RhdGljLnJlc291cmNlLmluamVjdGlvbi5vbmx5PVN0YXRpYyByZXNvdXJjZSB7MH0gY2Fubm90IGJlIGluamVjdGVkIHRvIG5vbi1zdGF0aWMgInsxfSIKKworZGQubXRvbS5jb25mbGljdCA9IEVycm9yIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciA6IE1UT00gQ29uZmlndXJhdGlvbiBpbiBiaW5kaW5nIHswfSBjb25mbGljdHMgd2l0aCBlbmFibGUtbXRvbSBhdHRyaWJ1dGUgdmFsdWUgezF9CisKK2Rpc3BhdGNoLmNhbm5vdEZpbmRNZXRob2Q9Q2Fubm90IGZpbmQgZGlzcGF0Y2ggbWV0aG9kIGZvciB7MH0gdXNpbmcgInsxfSIKK3Vuc3VwcG9ydGVkLmNvbnRlbnRUeXBlPVVuc3VwcG9ydGVkIENvbnRlbnQtVHlwZTogezB9IFN1cHBvcnRlZCBvbmVzIGFyZTogezF9Cituby5jb250ZW50VHlwZT1SZXF1ZXN0IGRvZXNuJ3QgaGF2ZSBhIENvbnRlbnQtVHlwZQorZHVwbGljYXRlLnBvcnRLbm93bkhlYWRlcj1SZWNlaXZlZCBTT0FQIG1lc3NhZ2UgY29udGFpbnMgZHVwbGljYXRlIGhlYWRlcjogezB9IGZvciBhIGJvdW5kIHBhcmFtZXRlcgogIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3NvYXAucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9zb2FwLnByb3BlcnRpZXMKaW5kZXggYjlhYWZlNC4uMjQyOThkNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3NvYXAucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvc29hcC5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDExICsyMSwxMiBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAogc29hcC5tc2cuY3JlYXRlLmVycj1Db3VsZG4nJ3QgY3JlYXRlIFNPQVAgbWVzc2FnZSBkdWUgdG8gZXhjZXB0aW9uOiB7MH0KIHNvYXAubXNnLmZhY3RvcnkuY3JlYXRlLmVycj1Db3VsZG4nJ3QgY3JlYXRlIFNPQVAgbWVzc2FnZSBmYWN0b3J5IGR1ZSB0byBleGNlcHRpb246IHswfQogc29hcC5wcm90b2NvbC5pbnZhbGlkRmF1bHRDb2RlPUludmFsaWQgZmF1bHQgY29kZTogezB9CiBzb2FwLmZhY3RvcnkuY3JlYXRlLmVycj1Db3VsZG4nJ3QgY3JlYXRlIFNPQVAgZmFjdG9yeSBkdWUgdG8gZXhjZXB0aW9uOiB7MH0KIHNvYXAuZmF1bHQuY3JlYXRlLmVycj1Db3VsZG4nJ3QgY3JlYXRlIFNPQVAgRmF1bHQgZHVlIHRvIGV4Y2VwdGlvbjogezB9Citzb2FwLnZlcnNpb24ubWlzbWF0Y2guZXJyPUNvdWxkbicndCBjcmVhdGUgU09BUCBtZXNzYWdlLiBFeHBlY3RpbmcgRW52ZWxvcGUgaW4gbmFtZXNwYWNlIHswfSwgYnV0IGdvdCB7MX0gCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvc3RyZWFtaW5nLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvc3RyZWFtaW5nLnByb3BlcnRpZXMKaW5kZXggNTliZDliMy4uZjM0NWIwNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3N0cmVhbWluZy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy9zdHJlYW1pbmcucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw3ICsyMSw3IEBACiAjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIyBoYXZlIGFueSBxdWVzdGlvbnMuCi0jIAorIwogCiBzdHJlYW1pbmcuaW9FeGNlcHRpb249WE1MIHBhcnNpbmcgZXJyb3I6IHswfQogc3RyZWFtaW5nLnBhcnNlRXhjZXB0aW9uPVhNTCBwYXJzaW5nIGVycm9yOiB7MH0KQEAgLTQ0LDYgKzQ0LDcgQEAKIHN0YXguY2FudENyZWF0ZT1VbmFibGUgdG8gY3JlYXRlIFN0QVggcmVhZGVyIG9yIHdyaXRlcgogc3RheHJlYWRlci54bWxzdHJlYW1leGNlcHRpb249WE1MIHN0cmVhbSByZWFkZXIgZXhjZXB0aW9uOiB7MH0KIAorZmFzdGluZm9zZXQuZGVjb2RpbmdOb3RBY2NlcHRlZD1GYXN0IEluZm9zZXQgZGVjb2RpbmcgaXMgbm90IGFjY2VwdGVkCiBmYXN0aW5mb3NldC5ub0ltcGxlbWVudGF0aW9uPVVuYWJsZSB0byBsb2NhdGUgY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBGYXN0IEluZm9zZXQgaW4gY2xhc3NwYXRoCiAKIHNvdXJjZXJlYWRlci5pbnZhbGlkU291cmNlPVVuYWJsZSB0byBjcmVhdGUgcmVhZGVyIGZyb20gc291cmNlIFwiezB9XCIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy91dGlsLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvdXRpbC5wcm9wZXJ0aWVzCmluZGV4IDg4MzRhYjguLmEzNDg5NjMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy91dGlsLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3V0aWwucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw3ICsyMSw3IEBACiAjIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogIyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogIyBoYXZlIGFueSBxdWVzdGlvbnMuCi0jIAorIwogCiB1dGlsLmhhbmRsZXIubm8ud2Vic2VydmljZS5hbm5vdGF0aW9uPSJBIFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBpcyBub3QgcHJlc2VudCBvbiBjbGFzczogezB9IgogdXRpbC5oYW5kbGVyLmVuZHBvaW50LmludGVyZmFjZS5uby53ZWJzZXJ2aWNlPSJUaGUgRW5kcG9pbnQgSW50ZXJmYWNlOiB7MH0gZG9lcyBub3QgaGF2ZSBXZWJTZXJ2aWNlIEFubm90YXRpb24iCkBAIC0zMCw0ICszMCw1IEBACiB1dGlsLnBhcnNlci53cm9uZy5lbGVtZW50PWZvdW5kIGVsZW1lbnQgXCJ7MX1cIiwgZXhwZWN0ZWQgXCJ7Mn1cIiBpbiBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24gKGxpbmUgezB9KQogdXRpbC5mYWlsZWQudG8uZmluZC5oYW5kbGVyY2hhaW4uZmlsZT1Db3VsZCBub3QgZmluZCBoYW5kbGVyIGNoYWluIGZpbGUgezF9IGZvciBjbGFzcyB7MH0KIHV0aWwuZmFpbGVkLnRvLnBhcnNlLmhhbmRsZXJjaGFpbi5maWxlPUNvdWxkIG5vdCBwYXJzZSBoYW5kbGVyIGNoYWluIGZpbGUgezF9IGZvciBjbGFzcyB7MH0KK3V0aWwubG9jYXRpb249YXQgbGluZSB7MH0gb2YgezF9CiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvd3NkbG1vZGVsLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvd3NkbG1vZGVsLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4ZDJiMgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy93c2RsbW9kZWwucHJvcGVydGllcwpAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKworTWV4Lm1ldGFkYXRhLnN5c3RlbWlkLm51bGw9TWV4IFdTREwgbWV0YWRhdGEgY2FuIG5vdCBiZSBwYXJzZWQsIHRoZSBzeXN0ZW1JZCBpcyBvZiB0aGUgTUVYIHNvdXJjZSBpcyBudWxsLgord3NkbC5pbXBvcnQuc2hvdWxkLmJlLndzZGw9SW1wb3J0IG9mIHswfSBpcyB2aW9sYXRpb24gb2YgQlAgMS4xIFIyMDAxLiBQcm9jZWVkaW5nIHdpdGggYSB3YXJuaW5nLlxuXAorICBSMjAwMSBBIERFU0NSSVBUSU9OIE1VU1Qgb25seSB1c2UgdGhlIFdTREwgXCJpbXBvcnRcIiBzdGF0ZW1lbnQgdG8gaW1wb3J0IGFub3RoZXIgV1NETCBkZXNjcmlwdGlvbi4KK3dzZGwucG9ydGFkZHJlc3MuZXByYWRkcmVzcy5ub3QubWF0Y2g9IEZvciBQb3J0OiB7MH0sIHNlcnZpY2UgbG9jYXRpb24gezF9IGRvZXMgbm90IG1hdGNoIGFkZHJlc3MgezJ9IFwKKyAgaW4gdGhlIEVuZHBvaW50UmVmZXJlbmNlCisgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvd3NzZXJ2bGV0LnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMvd3NzZXJ2bGV0LnByb3BlcnRpZXMKaW5kZXggY2YyZGI3MC4uZWIxYjRiZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3dzc2VydmxldC5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy93c3NlcnZsZXQucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMSw5ICsyMSwxMCBAQAogIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKICMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIyAKKyMKIAotIyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIHVzZWQgYnkgdGhlIGh0dHAgcGFja2FnZQorbm8uc3VuamF4d3MueG1sPVJ1bnRpbWUgZGVzY3JpcHRvciAiezB9IiBpcyBtaXNpbmcKKwogbGlzdGVuZXIucGFyc2luZ0ZhaWxlZD1XU1NFUlZMRVQxMTogZmFpbGVkIHRvIHBhcnNlIHJ1bnRpbWUgZGVzY3JpcHRvcjogezB9CiBKQVhSUENTRVJWTEVUMTEuZGlhZy5jYXVzZS4xPVdTUnVudGltZUluZm9QYXJzZXIgY2F1bGQgbm90IHBhcnNlIHN1bi1qYXh3cy54bWwgcnVudGltZSBkZXNjcmlwdG9yCiBXU1NFUlZMRVQxMS5kaWFnLmNoZWNrLjE9UGxlYXNlIGNoZWNrIHRoZSBzdW4tamF4d3MueG1sIGZpbGUgdG8gbWFrZSBzdXJlIGl0IGlzIGNvcnJlY3QKQEAgLTE3Miw2ICsxNzMsOCBAQAogV1NTRVJWTEVUNjUuZGlhZy5jYXVzZS4xPVNPQVAgQWN0aW9uIGlzIHJlcXVpcmVkCiBXU1NFUlZMRVQ2NS5kaWFnLmNoZWNrLjE9QWRkIFNPQVBBY3Rpb24gYW5kIGFwcHJvcHJpYXRlIHZhbHVlCiAKK3NlcnZsZXQubm8uYWRkcmVzcy5hdmFpbGFibGU9Tm8gYWRkcmVzcyBpcyBhdmFpbGFibGUgZm9yIHswfQorCiBzZXJ2bGV0Lmh0bWwudGl0bGU9IFdlYiBTZXJ2aWNlcwogc2VydmxldC5odG1sLnRpdGxlMj08aDE+V2ViIFNlcnZpY2VzPC9oMT4KIHNlcnZsZXQuaHRtbC5ub0luZm9BdmFpbGFibGU9PHA+Tm8gSkFYLVdTIGNvbnRleHQgaW5mb3JtYXRpb24gYXZhaWxhYmxlLjwvcD4KQEAgLTE4MCw3ICsxODMsNyBAQAogc2VydmxldC5odG1sLmNvbHVtbkhlYWRlci5pbmZvcm1hdGlvbj1JbmZvcm1hdGlvbgogc2VydmxldC5odG1sLnN0YXR1cy5hY3RpdmU9QUNUSVZFCiBzZXJ2bGV0Lmh0bWwuc3RhdHVzLmVycm9yPUVSUk9SCi1zZXJ2bGV0Lmh0bWwuaW5mb3JtYXRpb24udGFibGU9PHRhYmxlIGJvcmRlclw9JzAnPjx0cj48dGQ+QWRkcmVzc1w6PC90ZD48dGQ+ezB9PC90ZD48L3RyPjx0cj48dGQ+V1NETFw6PC90ZD48dGQ+PGEgaHJlZlw9InszfSI+ezN9PC9hPjwvdGQ+PC90cj48dHI+PHRkPlBvcnQgUU5hbWVcOjwvdGQ+PHRkPnsxfTwvdGQ+PC90cj48dHI+PHRkPkltcGxlbWVudGF0aW9uIGNsYXNzXDo8L3RkPjx0ZD57Mn08L3RkPjwvdHI+PC90YWJsZT4KK3NlcnZsZXQuaHRtbC5pbmZvcm1hdGlvbi50YWJsZT08dGFibGUgYm9yZGVyPVwiMFwiPjx0cj48dGQ+QWRkcmVzc1w6PC90ZD48dGQ+ezB9PC90ZD48L3RyPjx0cj48dGQ+V1NETFw6PC90ZD48dGQ+PGEgaHJlZlw9InswfT93c2RsIj57MH0/d3NkbDwvYT48L3RkPjwvdHI+PHRyPjx0ZD5Qb3J0IFFOYW1lXDo8L3RkPjx0ZD57MX08L3RkPjwvdHI+PHRyPjx0ZD5JbXBsZW1lbnRhdGlvbiBjbGFzc1w6PC90ZD48dGQ+ezJ9PC90ZD48L3RyPjwvdGFibGU+CiBzZXJ2bGV0Lmh0bWwubm90Rm91bmQ9PGgxPjQwNCBOb3QgRm91bmQ6IHswfTwvaDE+CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3htbG1lc3NhZ2UucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3Jlc291cmNlcy94bWxtZXNzYWdlLnByb3BlcnRpZXMKaW5kZXggMTc3ZjAxMy4uNzBhNDE4ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvcmVzb3VyY2VzL3htbG1lc3NhZ2UucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9yZXNvdXJjZXMveG1sbWVzc2FnZS5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDcgKzIxLDcgQEAKICMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCiAjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAjIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSMgCisjCiAKIHhtbC5udWxsLmhlYWRlcnM9SW52YWxpZCBhcmd1bWVudC4gTWltZUhlYWRlcnM9bnVsbAogeG1sLm5vLkNvbnRlbnQtVHlwZT1NaW1lSGVhZGVycyBkb2Vzbid0IGNvbnRhaW4gQ29udGVudC1UeXBlIGhlYWRlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0Fic3RyYWN0SW5zdGFuY2VSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0Fic3RyYWN0SW5zdGFuY2VSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMmNhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvQWJzdHJhY3RJbnN0YW5jZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkluc3RhbmNlUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5SZXNvdXJjZUluamVjdG9yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuV1NFbmRwb2ludDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuU2VydmVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBQYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJbnN0YW5jZVJlc29sdmVyfSB3aXRoCisgKiBjb252ZW5pZW5jZSBtZXRob2RzIHRvIGRvIHRoZSByZXNvdXJjZSBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluc3RhbmNlUmVzb2x2ZXI8VD4gZXh0ZW5kcyBJbnN0YW5jZVJlc29sdmVyPFQ+IHsKKworICAgIC8qKgorICAgICAqIEVuY2Fwc3VsYXRlcyB3aGljaCBmaWVsZC9tZXRob2QgdGhlIGluamVjdGlvbiBpcyBkb25lLAorICAgICAqIGFuZCBwZXJmb3JtcyB0aGUgaW5qZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgaW50ZXJmYWNlIEluamVjdGlvblBsYW48VCxSPiB7CisgICAgICAgIHZvaWQgaW5qZWN0KFQgaW5zdGFuY2UsUiByZXNvdXJjZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgaW5qZWN0aW9ucyB0byBiZSBwZXJmb3JtZWQuCisgICAgICAgICAqLworICAgICAgICBpbnQgY291bnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmplY3RzIHRvIGEgZmllbGQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBGaWVsZEluamVjdGlvblBsYW48VCxSPiBpbXBsZW1lbnRzIEluamVjdGlvblBsYW48VCxSPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRmllbGQgZmllbGQ7CisKKyAgICAgICAgcHVibGljIEZpZWxkSW5qZWN0aW9uUGxhbihGaWVsZCBmaWVsZCkgeworICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5qZWN0KGZpbmFsIFQgaW5zdGFuY2UsIGZpbmFsIFIgcmVzb3VyY2UpIHsKKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmlzQWNjZXNzaWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldChpbnN0YW5jZSxyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNlcnZlci5ydC5lcnIiLGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmplY3RzIHRvIGEgbWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTWV0aG9kSW5qZWN0aW9uUGxhbjxULFI+IGltcGxlbWVudHMgSW5qZWN0aW9uUGxhbjxULFI+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOworCisgICAgICAgIHB1YmxpYyBNZXRob2RJbmplY3Rpb25QbGFuKE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5qZWN0KFQgaW5zdGFuY2UsIFIgcmVzb3VyY2UpIHsKKyAgICAgICAgICAgIGludm9rZU1ldGhvZChtZXRob2QsIGluc3RhbmNlLCByZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21iaW5lcyBtdWx0aXBsZSB7QGxpbmsgSW5qZWN0aW9uUGxhbn1zIGludG8gb25lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvc2l0b3I8VCxSPiBpbXBsZW1lbnRzIEluamVjdGlvblBsYW48VCxSPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uUGxhbjxULFI+W10gY2hpbGRyZW47CisKKyAgICAgICAgcHVibGljIENvbXBvc2l0b3IoQ29sbGVjdGlvbjxJbmplY3Rpb25QbGFuPFQsUj4+IGNoaWxkcmVuKSB7CisgICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW4udG9BcnJheShuZXcgSW5qZWN0aW9uUGxhbltjaGlsZHJlbi5zaXplKCldKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluamVjdChUIGluc3RhbmNlLCBSIHJlcykgeworICAgICAgICAgICAgZm9yIChJbmplY3Rpb25QbGFuPFQsUj4gcGxhbiA6IGNoaWxkcmVuKQorICAgICAgICAgICAgICAgIHBsYW4uaW5qZWN0KGluc3RhbmNlLHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNvdW50KCkgeworICAgICAgICAgICAgaW50IHIgPSAwOworICAgICAgICAgICAgZm9yIChJbmplY3Rpb25QbGFuPFQsIFI+IHBsYW4gOiBjaGlsZHJlbikKKyAgICAgICAgICAgICAgICByICs9IHBsYW4uY291bnQoKTsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUluamVjdG9yIGdldFJlc291cmNlSW5qZWN0b3IoV1NFbmRwb2ludCBlbmRwb2ludCkgeworICAgICAgICBSZXNvdXJjZUluamVjdG9yIHJpID0gZW5kcG9pbnQuZ2V0Q29udGFpbmVyKCkuZ2V0U1BJKFJlc291cmNlSW5qZWN0b3IuY2xhc3MpOworICAgICAgICBpZihyaT09bnVsbCkKKyAgICAgICAgICAgIHJpID0gUmVzb3VyY2VJbmplY3Rvci5TVEFOREFMT05FOworICAgICAgICByZXR1cm4gcmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGZvciBpbnZva2luZyBhIG1ldGhvZCB3aXRoIGVsZXZhdGVkIHByaXZpbGVnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW52b2tlTWV0aG9kKGZpbmFsIEBOdWxsYWJsZSBNZXRob2QgbWV0aG9kLCBmaW5hbCBPYmplY3QgaW5zdGFuY2UsIGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIGlmKG1ldGhvZD09bnVsbCkgICAgcmV0dXJuOworICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxWb2lkPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBWb2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZC5pc0FjY2Vzc2libGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShpbnN0YW5jZSxhcmdzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJzZXJ2ZXIucnQuZXJyIixlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJzZXJ2ZXIucnQuZXJyIixlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIHRoZSBtZXRob2QgdGhhdCBoYXMgdGhlIGdpdmVuIGFubm90YXRpb24sIHdoaWxlIG1ha2luZyBzdXJlIHRoYXQKKyAgICAgKiB0aGVyZSdzIG9ubHkgYXQgbW9zdCBvbmUgc3VjaCBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIEBOdWxsYWJsZSBNZXRob2QgZmluZEFubm90YXRlZE1ldGhvZChDbGFzcyBjbGF6eiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFublR5cGUpIHsKKyAgICAgICAgYm9vbGVhbiBvbmNlID0gZmFsc2U7CisgICAgICAgIE1ldGhvZCByID0gbnVsbDsKKyAgICAgICAgZm9yKE1ldGhvZCBtZXRob2QgOiBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRBbm5vdGF0aW9uKGFublR5cGUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAob25jZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKFNlcnZlck1lc3NhZ2VzLkFOTk9UQVRJT05fT05MWV9PTkNFKGFublR5cGUpKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoICE9IDApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5OT1RfWkVST19QQVJBTUVURVJTKG1ldGhvZCkpOworICAgICAgICAgICAgICAgIHIgPSBtZXRob2Q7CisgICAgICAgICAgICAgICAgb25jZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgSW5qZWN0aW9uUGxhbn0gdGhhdCBpbmplY3RzIHRoZSBnaXZlbiByZXNvdXJjZSB0eXBlIHRvIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc1N0YXRpYworICAgICAqICAgICAgT25seSBsb29rIGZvciBzdGF0aWMgZmllbGQvbWV0aG9kCisgICAgICoKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIDxULFI+CisgICAgSW5qZWN0aW9uUGxhbjxULFI+IGJ1aWxkSW5qZWN0aW9uUGxhbihDbGFzczw/IGV4dGVuZHMgVD4gY2xhenosIENsYXNzPFI+IHJlc291cmNlVHlwZSwgYm9vbGVhbiBpc1N0YXRpYykgeworICAgICAgICBMaXN0PEluamVjdGlvblBsYW48VCxSPj4gcGxhbiA9IG5ldyBBcnJheUxpc3Q8SW5qZWN0aW9uUGxhbjxULFI+PigpOworCisgICAgICAgIGZvcihGaWVsZCBmaWVsZDogY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKSkgeworICAgICAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWVsZC5nZXRBbm5vdGF0aW9uKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYoaXNJbmplY3Rpb25Qb2ludChyZXNvdXJjZSwgZmllbGQuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJNZXNzYWdlcy5sb2NhbGl6YWJsZVdST05HX0ZJRUxEX1RZUEUoZmllbGQuZ2V0TmFtZSgpKSxyZXNvdXJjZVR5cGUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaXNTdGF0aWMgJiYgIU1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKFNlcnZlck1lc3NhZ2VzLlNUQVRJQ19SRVNPVVJDRV9JTkpFQ1RJT05fT05MWShyZXNvdXJjZVR5cGUsZmllbGQpKTsKKworICAgICAgICAgICAgICAgICAgICBwbGFuLmFkZChuZXcgRmllbGRJbmplY3Rpb25QbGFuPFQsUj4oZmllbGQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoTWV0aG9kIG1ldGhvZCA6IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtVHlwZXMubGVuZ3RoICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5XUk9OR19OT19QQVJBTUVURVJTKG1ldGhvZCkpOworICAgICAgICAgICAgICAgIGlmKGlzSW5qZWN0aW9uUG9pbnQocmVzb3VyY2UscGFyYW1UeXBlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgU2VydmVyTWVzc2FnZXMubG9jYWxpemFibGVXUk9OR19QQVJBTUVURVJfVFlQRShtZXRob2QuZ2V0TmFtZSgpKSxyZXNvdXJjZVR5cGUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaXNTdGF0aWMgJiYgIU1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5TVEFUSUNfUkVTT1VSQ0VfSU5KRUNUSU9OX09OTFkocmVzb3VyY2VUeXBlLG1ldGhvZCkpOworCisgICAgICAgICAgICAgICAgICAgIHBsYW4uYWRkKG5ldyBNZXRob2RJbmplY3Rpb25QbGFuPFQsUj4obWV0aG9kKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdG9yPFQsUj4ocGxhbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgUmVzb3VyY2V9IGFuZCB0aGUgZmllbGQvbWV0aG9kIHR5cGUKKyAgICAgKiBhcmUgY29uc2lzdGVudCBmb3Ige0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0fSBpbmplY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luamVjdGlvblBvaW50KFJlc291cmNlIHJlc291cmNlLCBDbGFzcyBmaWVsZFR5cGUsIExvY2FsaXphYmxlIGVycm9yTWVzc2FnZSwgQ2xhc3MgcmVzb3VyY2VUeXBlICkgeworICAgICAgICBDbGFzcyB0ID0gcmVzb3VyY2UudHlwZSgpOworICAgICAgICBpZiAodC5lcXVhbHMoT2JqZWN0LmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkVHlwZS5lcXVhbHMocmVzb3VyY2VUeXBlKTsKKyAgICAgICAgfSBlbHNlIGlmICh0LmVxdWFscyhyZXNvdXJjZVR5cGUpKSB7CisgICAgICAgICAgICBpZiAoZmllbGRUeXBlLmlzQXNzaWduYWJsZUZyb20ocmVzb3VyY2VUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0eXBlIGNvbXBhdGliaWxpdHkgZXJyb3IKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0Fic3RyYWN0TXVsdGlJbnN0YW5jZVJlc29sdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvQWJzdHJhY3RNdWx0aUluc3RhbmNlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTcwZDUxCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0Fic3RyYWN0TXVsdGlJbnN0YW5jZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuSW5zdGFuY2VSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlJlc291cmNlSW5qZWN0b3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU0VuZHBvaW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuV1NXZWJTZXJ2aWNlQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIFBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEluc3RhbmNlUmVzb2x2ZXJ9IHdpdGggY29kZQorICogdG8gaGFuZGxlIG11bHRpcGxlIGluc3RhbmNlcyBwZXIgc2VydmVyLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TXVsdGlJbnN0YW5jZVJlc29sdmVyPFQ+IGV4dGVuZHMgQWJzdHJhY3RJbnN0YW5jZVJlc29sdmVyPFQ+IHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8VD4gY2xheno7CisKKyAgICAvLyBmaWVsZHMgZm9yIHJlc291cmNlIGluamVjdGlvbi4KKyAgICBwcml2YXRlIC8qYWxtb3N0IGZpbmFsKi8gV1NXZWJTZXJ2aWNlQ29udGV4dCB3ZWJTZXJ2aWNlQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgLyphbG1vc3QgZmluYWwqLyBXU0VuZHBvaW50IG93bmVyOworICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIHBvc3RDb25zdHJ1Y3RNZXRob2Q7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgcHJlRGVzdHJveU1ldGhvZDsKKyAgICBwcml2YXRlIC8qYWxtb3N0IGZpbmFsKi8gUmVzb3VyY2VJbmplY3RvciByZXNvdXJjZUluamVjdG9yOworCisgICAgcHVibGljIEFic3RyYWN0TXVsdGlJbnN0YW5jZVJlc29sdmVyKENsYXNzPFQ+IGNsYXp6KSB7CisgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejsKKworICAgICAgICBwb3N0Q29uc3RydWN0TWV0aG9kID0gZmluZEFubm90YXRlZE1ldGhvZChjbGF6eiwgUG9zdENvbnN0cnVjdC5jbGFzcyk7CisgICAgICAgIHByZURlc3Ryb3lNZXRob2QgPSBmaW5kQW5ub3RhdGVkTWV0aG9kKGNsYXp6LCBQcmVEZXN0cm95LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHJlc291cmNlIGluamVjdGlvbiBvbiB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJlcGFyZShUIHQpIHsKKyAgICAgICAgLy8gd2UgY2FuIG9ubHkgc3RhcnQgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyBhZnRlciB0aGUgc3RhcnQgbWV0aG9kIGlzIGludm9rZWQuCisgICAgICAgIGFzc2VydCB3ZWJTZXJ2aWNlQ29udGV4dCE9bnVsbDsKKworICAgICAgICByZXNvdXJjZUluamVjdG9yLmluamVjdCh3ZWJTZXJ2aWNlQ29udGV4dCx0KTsKKyAgICAgICAgaW52b2tlTWV0aG9kKHBvc3RDb25zdHJ1Y3RNZXRob2QsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB2aWEgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFQgY3JlYXRlKCkgeworICAgICAgICBUIHQgPSBjcmVhdGVOZXdJbnN0YW5jZShjbGF6eik7CisgICAgICAgIHByZXBhcmUodCk7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KFdTV2ViU2VydmljZUNvbnRleHQgd3NjLCBXU0VuZHBvaW50IGVuZHBvaW50KSB7CisgICAgICAgIHJlc291cmNlSW5qZWN0b3IgPSBnZXRSZXNvdXJjZUluamVjdG9yKGVuZHBvaW50KTsKKyAgICAgICAgdGhpcy53ZWJTZXJ2aWNlQ29udGV4dCA9IHdzYzsKKyAgICAgICAgdGhpcy5vd25lciA9IGVuZHBvaW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc3Bvc2UoVCBpbnN0YW5jZSkgeworICAgICAgICBpbnZva2VNZXRob2QocHJlRGVzdHJveU1ldGhvZCxpbnN0YW5jZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0Fic3RyYWN0V2ViU2VydmljZUNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9BYnN0cmFjdFdlYlNlcnZpY2VDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmMGFjNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9BYnN0cmFjdFdlYlNlcnZpY2VDb250ZXh0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU1dlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCisvKioKKyAqIFBhcnRpYWwge0BsaW5rIFdTV2ViU2VydmljZUNvbnRleHR9IGltcGxlbWVudGF0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24KKyAqIHtAbGluayBQYWNrZXR9IGFuZCBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSBpdCB2aWEKKyAqIHtAbGluayAjZ2V0UmVxdWVzdFBhY2tldCgpfS4KKyAqCisgKiBAc2VlIEludm9rZXJUdWJlLCBBc3luY1Byb3ZpZGVySW52b2tlclR1YmUKKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlQ29udGV4dCBpbXBsZW1lbnRzIFdTV2ViU2VydmljZUNvbnRleHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBXU0VuZHBvaW50IGVuZHBvaW50OworCisgICAgcHVibGljIEFic3RyYWN0V2ViU2VydmljZUNvbnRleHQoQE5vdE51bGwgV1NFbmRwb2ludCBlbmRwb2ludCkgeworICAgICAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldE1lc3NhZ2VDb250ZXh0KCkgeworICAgICAgICBQYWNrZXQgcGFja2V0ID0gZ2V0UmVxdWVzdFBhY2tldCgpOworICAgICAgICBpZiAocGFja2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldE1lc3NhZ2VDb250ZXh0KCkgY2FuIG9ubHkgYmUgY2FsbGVkIHdoaWxlIHNlcnZpY2luZyBhIHJlcXVlc3QiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50TWVzc2FnZUNvbnRleHRJbXBsKHBhY2tldCk7CisgICAgfQorCisgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICBQYWNrZXQgcGFja2V0ID0gZ2V0UmVxdWVzdFBhY2tldCgpOworICAgICAgICBpZiAocGFja2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldFVzZXJQcmluY2lwYWwoKSBjYW4gb25seSBiZSBjYWxsZWQgd2hpbGUgc2VydmljaW5nIGEgcmVxdWVzdCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrZXQud2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZS5nZXRVc2VyUHJpbmNpcGFsKHBhY2tldCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7CisgICAgICAgIFBhY2tldCBwYWNrZXQgPSBnZXRSZXF1ZXN0UGFja2V0KCk7CisgICAgICAgIGlmIChwYWNrZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaXNVc2VySW5Sb2xlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIHdoaWxlIHNlcnZpY2luZyBhIHJlcXVlc3QiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja2V0LndlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUuaXNVc2VySW5Sb2xlKHBhY2tldCxyb2xlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoRWxlbWVudC4uLnJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIGdldEVuZHBvaW50UmVmZXJlbmNlKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzLCByZWZlcmVuY2VQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gVCBnZXRFbmRwb2ludFJlZmVyZW5jZShDbGFzczxUPiBjbGF6eiwgRWxlbWVudC4uLnJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgUGFja2V0IHBhY2tldCA9IGdldFJlcXVlc3RQYWNrZXQoKTsKKyAgICAgICAgaWYgKHBhY2tldCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRFbmRwb2ludFJlZmVyZW5jZSgpIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGlsZSBzZXJ2aWNpbmcgYSByZXF1ZXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBwYWNrZXQud2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZS5nZXRFUFJBZGRyZXNzKHBhY2tldCwgZW5kcG9pbnQpOworICAgICAgICBTdHJpbmcgd3NkbEFkZHJlc3MgPSBudWxsOworICAgICAgICBpZihlbmRwb2ludC5nZXRTZXJ2aWNlRGVmaW5pdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdzZGxBZGRyZXNzID0gcGFja2V0LndlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUuZ2V0V1NETEFkZHJlc3MocGFja2V0LGVuZHBvaW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhenouY2FzdCgoKFdTRW5kcG9pbnRJbXBsKWVuZHBvaW50KS5nZXRFbmRwb2ludFJlZmVyZW5jZShjbGF6eixhZGRyZXNzLHdzZGxBZGRyZXNzLCByZWZlcmVuY2VQYXJhbWV0ZXJzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvQXBwTXNnQ29udGV4dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9BcHBNc2dDb250ZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDkzMjZkLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9BcHBNc2dDb250ZXh0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOwotCi1wdWJsaWMgY2xhc3MgQXBwTXNnQ29udGV4dEltcGwgaW1wbGVtZW50cyBNZXNzYWdlQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IGN0eHQ7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGFwcENvbnRleHQ7IC8vIHByb3BlcnRpZXMgaW4gQVBQTElDQVRJT04gc2NvcGUKLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBpZiAoYXBwQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhcHBDb250ZXh0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICBJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGkgPSBjdHh0LmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN0eHQuZ2V0U2NvcGUoZW50cnkuZ2V0S2V5KCkpID09IFNjb3BlLkFQUExJQ0FUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcENvbnRleHQucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwTXNnQ29udGV4dEltcGwoTWVzc2FnZUNvbnRleHQgY3R4dCkgewotICAgICAgICB0aGlzLmN0eHQgPSBjdHh0OwotICAgIH0KLQotICAgIC8qIGphdmEudXRpbC5NYXAgbWV0aG9kcyBiZWxvdyBoZXJlICovCi0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBwcm9wcyA9IGFwcENvbnRleHQuZW50cnlTZXQoKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gcHJvcCA6IHByb3BzKSB7Ci0gICAgICAgICAgICBjdHh0LnJlbW92ZShwcm9wLmdldEtleSgpKTsKLSAgICAgICAgfQotICAgICAgICBhcHBDb250ZXh0LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IG9iaikgewotICAgICAgICBpbml0KCk7Ci0gICAgICAgIHJldHVybiBhcHBDb250ZXh0LmNvbnRhaW5zS2V5KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGluaXQoKTsKLSAgICAgICAgcmV0dXJuIGFwcENvbnRleHQuY29udGFpbnNWYWx1ZShvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCgpIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICByZXR1cm4gYXBwQ29udGV4dC5lbnRyeVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBvYmopIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICByZXR1cm4gYXBwQ29udGV4dC5nZXQob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBpbml0KCk7Ci0gICAgICAgIHJldHVybiBhcHBDb250ZXh0LmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgewotICAgICAgICBpbml0KCk7Ci0gICAgICAgIHJldHVybiBhcHBDb250ZXh0LmtleVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBzdHIsIE9iamVjdCBvYmopIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBTY29wZSBzY29wZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzY29wZSA9IGN0eHQuZ2V0U2NvcGUoc3RyKTsKLSAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIC8vIEl0J3Mgb2theSwgTWVzc2FnZUNvbnRleHQgZGlkbid0IGhhdmUgdGhpcyBwcm9wZXJ0eQotICAgICAgICB9Ci0gICAgICAgIGlmIChzY29wZSAhPSBudWxsICYmIHNjb3BlID09IFNjb3BlLkhBTkRMRVIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgb3ZlcndyaXRlIHByb3BlcnR5IGluIEhBTkRMRVIgc2NvcGUiKTsKLSAgICAgICAgfQotICAgICAgICBjdHh0LnB1dChzdHIsIG9iaik7Ci0gICAgICAgIGN0eHQuc2V0U2NvcGUoc3RyLCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgICAgIHJldHVybiBhcHBDb250ZXh0LnB1dChzdHIsIG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgT2JqZWN0PiBtYXApIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBTZXQ8PyBleHRlbmRzIEVudHJ5PD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+PiBwcm9wcyA9IG1hcC5lbnRyeVNldCgpOwotICAgICAgICBmb3IoRW50cnk8PyBleHRlbmRzIFN0cmluZywgPyBleHRlbmRzIE9iamVjdD4gcHJvcCA6IHByb3BzKSB7Ci0gICAgICAgICAgICBwdXQocHJvcC5nZXRLZXkoKSwgcHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBTY29wZSBzY29wZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzY29wZSA9IGN0eHQuZ2V0U2NvcGUoKFN0cmluZylrZXkpOwotICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgLy8gSXQncyBva2F5LCBNZXNzYWdlQ29udGV4dCBkaWRuJ3QgaGF2ZSB0aGlzIHByb3BlcnR5Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjb3BlICE9IG51bGwgJiYgc2NvcGUgPT0gU2NvcGUuSEFORExFUikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZW1vdmUgcHJvcGVydHkgaW4gSEFORExFUiBzY29wZSIpOwotICAgICAgICB9Ci0gICAgICAgIGN0eHQucmVtb3ZlKGtleSk7Ci0gICAgICAgIHJldHVybiBhcHBDb250ZXh0LnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICByZXR1cm4gYXBwQ29udGV4dC5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiB2YWx1ZXMoKSB7Ci0gICAgICAgIGluaXQoKTsKLSAgICAgICAgcmV0dXJuIGFwcENvbnRleHQudmFsdWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5hbWUsIFNjb3BlIHNjb3BlKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NvcGUgZ2V0U2NvcGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvRGVmYXVsdFJlc291cmNlSW5qZWN0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9EZWZhdWx0UmVzb3VyY2VJbmplY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODcwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvRGVmYXVsdFJlc291cmNlSW5qZWN0b3IuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlJlc291cmNlSW5qZWN0b3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU1dlYlNlcnZpY2VDb250ZXh0OworCitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworCisvKioKKyAqIERlZmF1bHQge0BsaW5rIFJlc291cmNlSW5qZWN0b3J9LgorICoKKyAqIEBzZWUgUmVzb3VyY2VJbmplY3RvciNTVEFOREFMT05FCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWZhdWx0UmVzb3VyY2VJbmplY3RvciBleHRlbmRzIFJlc291cmNlSW5qZWN0b3IgeworICAgIHB1YmxpYyB2b2lkIGluamVjdChATm90TnVsbCBXU1dlYlNlcnZpY2VDb250ZXh0IGNvbnRleHQsIEBOb3ROdWxsIE9iamVjdCBpbnN0YW5jZSkgeworICAgICAgICBBYnN0cmFjdEluc3RhbmNlUmVzb2x2ZXIuYnVpbGRJbmplY3Rpb25QbGFuKAorICAgICAgICAgICAgaW5zdGFuY2UuZ2V0Q2xhc3MoKSxXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyxmYWxzZSkuaW5qZWN0KGluc3RhbmNlLGNvbnRleHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9Eb2NJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvRG9jSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjEzOTk5Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9Eb2NJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotcHVibGljIGludGVyZmFjZSBEb2NJbmZvIHsKLQotICAgIHB1YmxpYyBlbnVtIERPQ19UWVBFIHsgV1NETCwgU0NIRU1BLCBPVEhFUiB9OwotCi0gICAgLyoKLSAgICAgKiBUaGUgaW1wbGVtZW5hdGlvbiBuZWVkcyB0byB3b3JrIGZvciBtdWx0aXBsZSBpbnZvY2F0aW9ucyBvZiB0aGlzIG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXREb2MoKTsKLQotICAgIC8qCi0gICAgICogQHJldHVybiB3c2RsPWEsIHhzZD1jIGV0YwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKTsKLQotICAgIC8qCi0gICAgICogc2V0IHdzZGw9YSwgeHNkPWMgZXRjIGFzIHF1ZXJ5U3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyaW5nKTsKLQotICAgIC8qCi0gICAgICogU2V0cyBkb2N1bWVudCB0eXBlIDogV1NETCwgb3IgU2NoZW1hID8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb2NUeXBlKERPQ19UWVBFIGRvY1R5cGUpOwotCi0gICAgLyoKLSAgICAgKiByZXR1cm4gZG9jdW1lbnQgdHlwZSA6IFdTREwsIG9yIFNjaGVtYSA/Ci0gICAgICovCi0gICAgcHVibGljIERPQ19UWVBFIGdldERvY1R5cGUoKTsKLQotICAgIC8qCi0gICAgICogU2V0cyB0YXJnZXROYW1lc3BhY2Ugb2YgV1NETCwgYW5kIHNjaGVtYQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbnMpOwotCi0gICAgLyoKLSAgICAgKiBTZXRzIHRhcmdldE5hbWVzcGFjZSBvZiBXU0RMLCBhbmQgc2NoZW1hCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIC8qCi0gICAgICogU2V0cyBpZiB0aGUgZW5kcG9pbnQgc2VydmljZSBpcyBkZWZpbmVkIGluIHRoaXMgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSk7Ci0KLSAgICAvKgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiBlbmRwb2ludCBzZXJ2aWNlIGlzIHByZXNlbnQgaW4gdGhpcyBkb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoKTsKLQotICAgIC8qCi0gICAgICogU2V0cyBpZiB0aGUgZW5kcG9pbnQgUG9ydCBUeXBlIGlzIGRlZmluZWQgaW4gdGhpcyBkb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhdmluZ1BvcnRUeXBlKGJvb2xlYW4gcG9ydFR5cGUpOwotCi0gICAgLyoKLSAgICAgKiByZXR1cm5zIHRydWUgaWYgZW5kcG9pbnQgUG9ydFR5cGUgaXMgcHJlc2VudCBpbiB0aGlzIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNIYXZpbmdQb3J0VHlwZSgpOwotCi0gICAgLyoKLSAgICAgKiBAcmV0dXJuIC9XRUItSU5GL3dzZGwveHh4LndzZGwKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKTsKLQotICAgIC8qCi0gICAgICogQHJldHVybiBVUkwgZm9yIC9XRUItSU5GL3dzZGwveHh4LndzZGwKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFVybCgpOwotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvRVBURmFjdG9yeUJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9FUFRGYWN0b3J5QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVjMGJjLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9FUFRGYWN0b3J5QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlcjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZW5jb2RpbmcuRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuRVBURmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5UYXJnZXRGaW5kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcm90b2NvbC5JbnRlcmNlcHRvcnM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5pbnRlcm5hbC5JbnRlcm5hbEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFUFRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUEVuY29kZXI7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBFUFRGYWN0b3J5QmFzZSBpbXBsZW1lbnRzIEVQVEZhY3RvcnksIFNPQVBFUFRGYWN0b3J5IHsKLSAgICBwcml2YXRlIEVuY29kZXIgZW5jb2RlcjsKLSAgICBwcml2YXRlIERlY29kZXIgZGVjb2RlcjsKLSAgICBwcml2YXRlIFNPQVBFbmNvZGVyIHNvYXBFbmNvZGVyOwotICAgIHByaXZhdGUgU09BUERlY29kZXIgc29hcERlY29kZXI7Ci0gICAgcHJpdmF0ZSBJbnRlcm5hbEVuY29kZXIgaW50ZXJuYWxFbmNvZGVyOwotICAgIHByaXZhdGUgVGFyZ2V0RmluZGVyIHRhcmdldEZpbmRlcjsKLSAgICBwcml2YXRlIE1lc3NhZ2VEaXNwYXRjaGVyIG1lc3NhZ2VEaXNwYXRjaGVyOwotCi0gICAgcHVibGljIEVQVEZhY3RvcnlCYXNlKEVuY29kZXIgZW5jb2RlciwgRGVjb2RlciBkZWNvZGVyLAotICAgICAgICAgICAgVGFyZ2V0RmluZGVyIHRhcmdldEZpbmRlciwgTWVzc2FnZURpc3BhdGNoZXIgbWVzc2FnZURpc3BhdGNoZXIpIHsKLSAgICAgICAgdGhpcy5lbmNvZGVyID0gZW5jb2RlcjsKLSAgICAgICAgdGhpcy5kZWNvZGVyID0gZGVjb2RlcjsKLSAgICAgICAgdGhpcy50YXJnZXRGaW5kZXIgPSB0YXJnZXRGaW5kZXI7Ci0gICAgICAgIHRoaXMubWVzc2FnZURpc3BhdGNoZXIgPSBtZXNzYWdlRGlzcGF0Y2hlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRVBURmFjdG9yeUJhc2UoU09BUEVuY29kZXIgc29hcEVuY29kZXIsIFNPQVBEZWNvZGVyIHNvYXBEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEVuY29kZXIgaW50ZXJuYWxFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRGaW5kZXIgdGFyZ2V0RmluZGVyLCBNZXNzYWdlRGlzcGF0Y2hlciBtZXNzYWdlRGlzcGF0Y2hlcikgewotICAgICAgICB0aGlzLmVuY29kZXIgPSBudWxsOwotICAgICAgICB0aGlzLmRlY29kZXIgPSBudWxsOwotICAgICAgICB0aGlzLnNvYXBFbmNvZGVyID0gc29hcEVuY29kZXI7Ci0gICAgICAgIHRoaXMuc29hcERlY29kZXIgPSBzb2FwRGVjb2RlcjsKLSAgICAgICAgdGhpcy5pbnRlcm5hbEVuY29kZXIgPSBpbnRlcm5hbEVuY29kZXI7Ci0gICAgICAgIHRoaXMudGFyZ2V0RmluZGVyID0gdGFyZ2V0RmluZGVyOwotICAgICAgICB0aGlzLm1lc3NhZ2VEaXNwYXRjaGVyID0gbWVzc2FnZURpc3BhdGNoZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEVuY29kZXIgZ2V0RW5jb2RlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBtZXNzYWdlSW5mby5zZXRFbmNvZGVyKGVuY29kZXIpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUluZm8uZ2V0RW5jb2RlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWNvZGVyIGdldERlY29kZXIoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgbWVzc2FnZUluZm8uc2V0RGVjb2RlcihkZWNvZGVyKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VJbmZvLmdldERlY29kZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFyZ2V0RmluZGVyIGdldFRhcmdldEZpbmRlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gdGFyZ2V0RmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlRGlzcGF0Y2hlciBnZXRNZXNzYWdlRGlzcGF0Y2hlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBtZXNzYWdlSW5mby5zZXRNZXNzYWdlRGlzcGF0Y2hlcihtZXNzYWdlRGlzcGF0Y2hlcik7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRGlzcGF0Y2hlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgRVBURmFjdG9yeSNnZXRJbnRlcmNlcHRvcnMoY29tLnN1bi5pc3RhY2suaW50ZXJuYWwucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIEludGVyY2VwdG9ycyBnZXRJbnRlcmNlcHRvcnMoTWVzc2FnZUluZm8geCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgTG9naWNhbEVQVEZhY3RvcnkjZ2V0U29hcEVuY29kZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRW5jb2RlciBnZXRTT0FQRW5jb2RlcigpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBFbmNvZGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBMb2dpY2FsRVBURmFjdG9yeSNnZXRTb2FwRGVjb2RlcigpCi0gICAgICovCi0gICAgcHVibGljIFNPQVBEZWNvZGVyIGdldFNPQVBEZWNvZGVyKCkgewotICAgICAgICByZXR1cm4gc29hcERlY29kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVybmFsRW5jb2RlciBnZXRJbnRlcm5hbEVuY29kZXIoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcm5hbEVuY29kZXI7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9FUFRGYWN0b3J5RmFjdG9yeUJhc2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9FUFRGYWN0b3J5RmFjdG9yeUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2YzEyOS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvRVBURmFjdG9yeUZhY3RvcnlCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuRVBURmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5UYXJnZXRGaW5kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5pbnRlcm5hbC5JbnRlcm5hbEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5TT0FQRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU2VydmVyRW5jb2RlckRlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wuc29hcC5zZXJ2ZXIuUHJvdmlkZXJTT0FQTUQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5NZXNzYWdlSW5mb1V0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnByb3ZpZGVyLlByb3ZpZGVyUGVwdFRpZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnNlcnZlci5Qcm92aWRlclNFRDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5iaW5kaW5nLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnByb3RvY29sLnNvYXAuc2VydmVyLlNPQVBNZXNzYWdlRGlzcGF0Y2hlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnNlcnZlci5TT0FQMTJYTUxEZWNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc2VydmVyLlNPQVAxMlhNTEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zZXJ2ZXIuU09BUFhNTERlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zZXJ2ZXIuU09BUFhNTEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTERlY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTEVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucHJvdG9jb2wueG1sLnNlcnZlci5Qcm92aWRlclhNTE1EOwotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOwotCi0vKioKLSAqIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSBhcHByb3ByaWF0ZSBFUFRGYWN0b3J5IGdpdmVuIHRoZSBCaW5kaW5nSWQgZnJvbSB0aGUgRW5kcG9pbnRJbmZvCi0gKiBpbiB0aGUgUnVudGltZUNvbnRleHQgb2YgdGhlIE1lc3NhZ2VJbmZvCi0gKiBCYXNlZCBvbiBNZXNzYWdlSW5mbyBkYXRhKEJpbmRpbmcsIEltcGxlbWVudG9yKSBpdCBzZWxlY3RzIG9uZSB0aGUgc3RhdGljIEVQVEZhY3RvcmllcwotICogdXNpbmcgQmluZGluZyBpbmZvcm1hdGlvbgotICogSGFzIGEgc3RhdGljIEVQVEZhY3Rvcnkgb2JqZWN0IGZvciBlYWNoIHBhcnRpY3VsYXIgYmluZGluZy4KLSAqIEVQVEZhY3RvcmllcyBhcmUgcmV1c2VkIGZvciBhbGwgdGhlIHJlcXVlc3RzLgotICogSGFzIHN0YXRpYyBwcm92aWRlciBFUFRGYWN0b3J5IG9iamVjdHMuCi0gKiBUaGUgcHJvdmlkZXIgRVBURmFjdG9yaWVzIGFyZSByZXVzZWQgZm9yIGFsbCB0aGUgcmVxdWVzdHMuCi0gKiBUaGUgZmFjdG9yaWVzIHJldXNlIGVuY29kZXIsIGRlY29kZXIsIG1lc3NhZ2UgZGlzcGF0Y2hlciBvYmplY3RzIHNpbmNlIHRoZXNlIG9iamVjdHMKLSAqIGFyZSBTdGF0ZWxlc3MuIFRoZXkgYXJlIHJldXNlZCBmb3IgYWxsIHRoZSByZXF1ZXN0cy4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVQVEZhY3RvcnlGYWN0b3J5QmFzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByb3ZpZGVyU09BUE1EIHByb3ZpZGVyTWVzc2FnZURpc3BhdGNoZXIgPQotICAgICAgICBuZXcgUHJvdmlkZXJTT0FQTUQoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNPQVBFbmNvZGVyIHNvYXAxMUVuY29kZXIgPSBuZXcgU09BUFhNTEVuY29kZXIoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNPQVBEZWNvZGVyIHNvYXAxMURlY29kZXIgPSBuZXcgU09BUFhNTERlY29kZXIoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNPQVBFbmNvZGVyIHNvYXAxMkVuY29kZXIgPSBuZXcgU09BUDEyWE1MRW5jb2RlcigpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU09BUERlY29kZXIgc29hcDEyRGVjb2RlciA9IG5ldyBTT0FQMTJYTUxEZWNvZGVyKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFhNTEVuY29kZXIgeG1sRW5jb2RlciA9IG51bGw7IC8vbmV3IFhNTEVuY29kZXIoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFhNTERlY29kZXIgeG1sRGVjb2RlciA9IG51bGw7IC8vbmV3IFhNTERlY29kZXIoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU09BUE1lc3NhZ2VEaXNwYXRjaGVyIHNvYXAxMU1lc3NhZ2VEaXNwYXRjaGVyID0KLSAgICAgICAgbmV3IFNPQVBNZXNzYWdlRGlzcGF0Y2hlcigpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURpc3BhdGNoZXIgcHJvdmlkZXJYbWxNRCA9Ci0gICAgICAgIG5ldyBQcm92aWRlclhNTE1EKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlcm5hbEVuY29kZXIgaW50ZXJuYWxTRUQgPSBuZXcgU2VydmVyRW5jb2RlckRlY29kZXIoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVybmFsRW5jb2RlciBwcm92aWRlclNFRCA9IG5ldyBQcm92aWRlclNFRCgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGFyZ2V0RmluZGVyIHByb3ZpZGVyVGFyZ2V0RmluZGVyID0KLSAgICAgICAgICAgIG5ldyBUYXJnZXRGaW5kZXJJbXBsKG5ldyBQcm92aWRlclBlcHRUaWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBUYXJnZXRGaW5kZXIgdGFyZ2V0RmluZGVyID0KLSAgICAgICAgICAgIG5ldyBUYXJnZXRGaW5kZXJJbXBsKG5ldyBQZXB0VGllKCkpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFUFRGYWN0b3J5IHByb3ZpZGVyU29hcDExID0KLSAgICAgICAgICAgIG5ldyBFUFRGYWN0b3J5QmFzZShzb2FwMTFFbmNvZGVyLCBzb2FwMTFEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBwcm92aWRlclNFRCwgcHJvdmlkZXJUYXJnZXRGaW5kZXIsCi0gICAgICAgICAgICAgICAgcHJvdmlkZXJNZXNzYWdlRGlzcGF0Y2hlcik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVQVEZhY3RvcnkgcHJvdmlkZXJTb2FwMTIgPQotICAgICAgICAgICAgbmV3IEVQVEZhY3RvcnlCYXNlKHNvYXAxMkVuY29kZXIsIHNvYXAxMkRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyU0VELCBwcm92aWRlclRhcmdldEZpbmRlciwKLSAgICAgICAgICAgICAgICBwcm92aWRlck1lc3NhZ2VEaXNwYXRjaGVyKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRVBURmFjdG9yeSBzb2FwMTEgPQotICAgICAgICAgICAgbmV3IEVQVEZhY3RvcnlCYXNlKAotICAgICAgICAgICAgICAgIHNvYXAxMUVuY29kZXIsIHNvYXAxMURlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgIGludGVybmFsU0VELCB0YXJnZXRGaW5kZXIsCi0gICAgICAgICAgICAgICAgc29hcDExTWVzc2FnZURpc3BhdGNoZXIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFUFRGYWN0b3J5IHNvYXAxMiA9Ci0gICAgICAgICAgICBuZXcgRVBURmFjdG9yeUJhc2UoCi0gICAgICAgICAgICAgICAgc29hcDEyRW5jb2Rlciwgc29hcDEyRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxTRUQsIHRhcmdldEZpbmRlciwKLSAgICAgICAgICAgICAgICBzb2FwMTFNZXNzYWdlRGlzcGF0Y2hlcik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVQVEZhY3RvcnkgcHJvdmlkZXJYbWwgPQotICAgICAgICBuZXcgWE1MRVBURmFjdG9yeUltcGwoCi0gICAgICAgICAgICB4bWxFbmNvZGVyLCB4bWxEZWNvZGVyLAotICAgICAgICAgICAgICAgIHByb3ZpZGVyU0VELCBwcm92aWRlclRhcmdldEZpbmRlciwKLSAgICAgICAgICAgIHByb3ZpZGVyWG1sTUQpOwotCi0gICAgLyoqCi0gICAgICogQ2hvb3NlIGNvcnJlY3QgRVBURmFjdG9yeS4gTWVzc2FnZUluZm8gY29udGFpbnMgYWxsIHRoZSBuZWVkZWQKLSAgICAgKiBpbmZvcm1hdGlvbiBsaWtlIEJpbmRpbmcsIFdTQ29ubmVjdGlvbiB0byBtYWtlIHRoYXQgZGVjaXNpb24uCi0gICAgICogQHBhcmFtIG1pIHRoZSBNZXNzYWdlSW5mbyBvYmplY3QgdG8gb2J0YWluIHRoZSBCaW5kaW5nSUQgZnJvbS4KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIEVQVEZhY3RvcnkgZm9yIHRoZSBCaW5kaW5nSUQgaW4gdGhlIG1pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFUFRGYWN0b3J5IGdldEVQVEZhY3RvcnkoTWVzc2FnZUluZm8gbWkpIHsKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1pKTsKLSAgICAgICAgUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8gPSBydEN0eHQuZ2V0UnVudGltZUVuZHBvaW50SW5mbygpOwotICAgICAgICBTdHJpbmcgYmluZGluZ0lkID0gKChCaW5kaW5nSW1wbCllbmRwb2ludEluZm8uZ2V0QmluZGluZygpKS5nZXRCaW5kaW5nSWQoKTsKLSAgICAgICAgaWYoYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpKXsKLSAgICAgICAgICAgIGlmIChlbmRwb2ludEluZm8uZ2V0SW1wbGVtZW50b3IoKSBpbnN0YW5jZW9mIFByb3ZpZGVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyU29hcDExOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc29hcDExOwotICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZSBpZihiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykpewotICAgICAgICAgICAgaWYgKGVuZHBvaW50SW5mby5nZXRJbXBsZW1lbnRvcigpIGluc3RhbmNlb2YgUHJvdmlkZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJTb2FwMTI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzb2FwMTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihiaW5kaW5nSWQuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpewotICAgICAgICAgICAgaWYgKGVuZHBvaW50SW5mby5nZXRJbXBsZW1lbnRvcigpIGluc3RhbmNlb2YgUHJvdmlkZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJYbWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0VuZHBvaW50RmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0VuZHBvaW50RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGM5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvRW5kcG9pbnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkFzeW5jUHJvdmlkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Db250YWluZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Db250YWluZXJSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkluc3RhbmNlUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5JbnZva2VyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuU0REb2N1bWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlNERG9jdW1lbnRTb3VyY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU0VuZHBvaW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlci5XU0RMUGFyc2VyRXh0ZW5zaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIuUGFyc2VyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLndyaXRlci5XU0RMR2VuZXJhdG9yRXh0ZW5zaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5TT0FQQmluZGluZ0ltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5XZWJTZXJ2aWNlRmVhdHVyZUxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuQWJzdHJhY3RTRUlNb2RlbEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUnVudGltZU1vZGVsZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuU09BUFNFSU1vZGVsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETE1vZGVsSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsLldTRExQb3J0SW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuU2VydmVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnByb3ZpZGVyLlByb3ZpZGVySW52b2tlclR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnNlaS5TRUlJbnZva2VyVHViZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkhhbmRsZXJBbm5vdGF0aW9uSW5mbzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkhhbmRsZXJBbm5vdGF0aW9uUHJvY2Vzc29yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlNlcnZpY2VGaW5kZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuUnVudGltZVdTRExQYXJzZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuV1NETEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogRW50cnkgcG9pbnQgdG8gdGhlIEpBWC1XUyBSSSBzZXJ2ZXItc2lkZSBydW50aW1lLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBjbGFzcyBFbmRwb2ludEZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyB7QGxpbmsgV1NFbmRwb2ludCNjcmVhdGV9LgorICAgICAqCisgICAgICogTm8gbmVlZCB0byB0YWtlIFdlYlNlcnZpY2VDb250ZXh0IGltcGxlbWVudGF0aW9uLiBXaGVuIEludm9rZXJQaXBlIGlzCisgICAgICogaW5zdGFudGlhdGVkLCBpdCBjYWxscyBJbnN0YW5jZVJlc29sdmVyIHRvIHNldCB1cCBhIFdlYlNlcnZpY2VDb250ZXh0LgorICAgICAqIFdlIHNoYWxsIG9ubHkgdGFrZSBkZWxlZ2F0ZSB0byBnZXRVc2VyUHJpbmNpcGFsIGFuZCBpc1VzZXJJblJvbGUgZnJvbSBhZGFwdGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogTm9ib2R5IGVsc2Ugc2hvdWxkIGJlIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gV1NFbmRwb2ludDxUPiBjcmVhdGVFbmRwb2ludCgKKyAgICAgICAgQ2xhc3M8VD4gaW1wbFR5cGUsIGJvb2xlYW4gcHJvY2Vzc0hhbmRsZXJBbm5vdGF0aW9uLCBATnVsbGFibGUgSW52b2tlciBpbnZva2VyLAorICAgICAgICBATnVsbGFibGUgUU5hbWUgc2VydmljZU5hbWUsIEBOdWxsYWJsZSBRTmFtZSBwb3J0TmFtZSwKKyAgICAgICAgQE51bGxhYmxlIENvbnRhaW5lciBjb250YWluZXIsIEBOdWxsYWJsZSBXU0JpbmRpbmcgYmluZGluZywKKyAgICAgICAgQE51bGxhYmxlIFNERG9jdW1lbnRTb3VyY2UgcHJpbWFyeVdzZGwsCisgICAgICAgIEBOdWxsYWJsZSBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTRERvY3VtZW50U291cmNlPiBtZXRhZGF0YSwgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIsIGJvb2xlYW4gaXNUcmFuc3BvcnRTeW5jaHJvbm91cykgeworCisgICAgICAgIGlmKGltcGxUeXBlID09bnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICB2ZXJpZnlJbXBsZW1lbnRvckNsYXNzKGltcGxUeXBlKTsKKworICAgICAgICBpZiAoaW52b2tlciA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnZva2VyID0gSW5zdGFuY2VSZXNvbHZlci5jcmVhdGVEZWZhdWx0KGltcGxUeXBlKS5jcmVhdGVJbnZva2VyKCk7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFNERG9jdW1lbnRTb3VyY2U+IG1kID0gbmV3IEFycmF5TGlzdDxTRERvY3VtZW50U291cmNlPigpOworICAgICAgICBpZihtZXRhZGF0YSE9bnVsbCkKKyAgICAgICAgICAgIG1kLmFkZEFsbChtZXRhZGF0YSk7CisKKyAgICAgICAgaWYocHJpbWFyeVdzZGwhPW51bGwgJiYgIW1kLmNvbnRhaW5zKHByaW1hcnlXc2RsKSkKKyAgICAgICAgICAgIG1kLmFkZChwcmltYXJ5V3NkbCk7CisKKyAgICAgICAgaWYoY29udGFpbmVyPT1udWxsKQorICAgICAgICAgICAgY29udGFpbmVyID0gQ29udGFpbmVyUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb250YWluZXIoKTsKKworICAgICAgICBpZihzZXJ2aWNlTmFtZT09bnVsbCkKKyAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKGltcGxUeXBlKTsKKworICAgICAgICBpZihwb3J0TmFtZT09bnVsbCkKKyAgICAgICAgICAgIHBvcnROYW1lID0gZ2V0RGVmYXVsdFBvcnROYW1lKHNlcnZpY2VOYW1lLGltcGxUeXBlKTsKKworICAgICAgICB7Ly8gZXJyb3IgY2hlY2sKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTlMgPSBzZXJ2aWNlTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgIFN0cmluZyBwb3J0TlMgPSBwb3J0TmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgIGlmICghc2VydmljZU5TLmVxdWFscyhwb3J0TlMpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJ3cm9uZy50bnMuZm9yLnBvcnQiLHBvcnROUywgc2VydmljZU5TKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldHRpbmcgYSBkZWZhdWx0IGJpbmRpbmcKKyAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIGJpbmRpbmcgPSBCaW5kaW5nSW1wbC5jcmVhdGUoQmluZGluZ0lELnBhcnNlKGltcGxUeXBlKSk7CisKKyAgICAgICAgaWYgKHByaW1hcnlXc2RsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZlcmlmeVByaW1hcnlXU0RMKHByaW1hcnlXc2RsLCBzZXJ2aWNlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBRTmFtZSBwb3J0VHlwZU5hbWUgPSBudWxsOworICAgICAgICBpZiAoaW1wbFR5cGUuZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpPT1udWxsKSB7CisgICAgICAgICAgICBwb3J0VHlwZU5hbWUgPSBSdW50aW1lTW9kZWxlci5nZXRQb3J0VHlwZU5hbWUoaW1wbFR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2F0ZWdvcmlzZXMgdGhlIGRvY3VtZW50cyBhcyBXU0RMLCBTY2hlbWEgZXRjCisgICAgICAgIExpc3Q8U0REb2N1bWVudEltcGw+IGRvY0xpc3QgPSBjYXRlZ29yaXNlTWV0YWRhdGEobWQsIHNlcnZpY2VOYW1lLCBwb3J0VHlwZU5hbWUpOworICAgICAgICAvLyBGaW5kcyB0aGUgcHJpbWFyeSBXU0RMIGFuZCBtYWtlcyBzdXJlIHRoYXQgbWV0YWRhdGEgZG9lc24ndCBoYXZlCisgICAgICAgIC8vIHR3byBjb25jcmV0ZSBvciBhYnN0cmFjdCBXU0RMcworICAgICAgICBTRERvY3VtZW50SW1wbCBwcmltYXJ5RG9jID0gZmluZFByaW1hcnkoZG9jTGlzdCk7CisKKyAgICAgICAgSW52b2tlclR1YmUgdGVybWluYWw7CisgICAgICAgIFdTRExQb3J0SW1wbCB3c2RsUG9ydCA9IG51bGw7CisgICAgICAgIEFic3RyYWN0U0VJTW9kZWxJbXBsIHNlaU1vZGVsID0gbnVsbDsKKyAgICAgICAgLy8gY3JlYXRlIFdTREwgbW9kZWwKKyAgICAgICAgaWYgKHByaW1hcnlEb2MgIT0gbnVsbCkgeworICAgICAgICAgICAgd3NkbFBvcnQgPSBnZXRXU0RMUG9ydChwcmltYXJ5RG9jLCBkb2NMaXN0LCBzZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgV2ViU2VydmljZUZlYXR1cmVMaXN0IGZlYXR1cmVzPSgoQmluZGluZ0ltcGwpYmluZGluZykuZ2V0RmVhdHVyZXMoKTsKKyAgICAgICAgZmVhdHVyZXMucGFyc2VBbm5vdGF0aW9ucyhpbXBsVHlwZSk7CisKKyAgICAgICAgLy8gY3JlYXRlIHRlcm1pbmFsIHBpcGUgdGhhdCBpbnZva2VzIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICBpZiAoaW1wbFR5cGUuZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpIT1udWxsKSB7CisgICAgICAgICAgICAvL1Byb3ZpZGVyIGNhc2U6IEVuYWJsZSBBZGRyZXNzaW5nIGZyb20gV1NETCBvbmx5IGlmIGl0IGhhcyBSZXNwZWN0QmluZGluZ0ZlYXR1cmUgZW5hYmxlZAorICAgICAgICAgICAgaWYgKHdzZGxQb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmVhdHVyZXMubWVyZ2VGZWF0dXJlcyh3c2RsUG9ydCx0cnVlLHRydWUpOworICAgICAgICAgICAgdGVybWluYWwgPSBQcm92aWRlckludm9rZXJUdWJlLmNyZWF0ZShpbXBsVHlwZSxiaW5kaW5nLGludm9rZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ3JlYXRlIHJ1bnRpbWUgbW9kZWwgZm9yIG5vbiBQcm92aWRlciBlbmRwb2ludHMKKyAgICAgICAgICAgIHNlaU1vZGVsID0gY3JlYXRlU0VJTW9kZWwod3NkbFBvcnQsIGltcGxUeXBlLCBzZXJ2aWNlTmFtZSwgcG9ydE5hbWUsIGJpbmRpbmcpOworICAgICAgICAgICAgaWYoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nSW1wbCl7CisgICAgICAgICAgICAgICAgLy9zZXQgcG9ydEtub3duSGVhZGVycyBvbiBCaW5kaW5nLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgZm9yIE1VIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAgICAoKFNPQVBCaW5kaW5nSW1wbCliaW5kaW5nKS5zZXRQb3J0S25vd25IZWFkZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgKChTT0FQU0VJTW9kZWwpc2VpTW9kZWwpLmdldEtub3duSGVhZGVycygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIFdTREwgZm9yIFNFSSBlbmRwb2ludHMobm90IGZvciBQcm92aWRlciBlbmRwb2ludHMpCisgICAgICAgICAgICBpZiAocHJpbWFyeURvYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJpbWFyeURvYyA9IGdlbmVyYXRlV1NETChiaW5kaW5nLCBzZWlNb2RlbCwgZG9jTGlzdCwgY29udGFpbmVyLCBpbXBsVHlwZSk7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIFdTREwgbW9kZWwKKyAgICAgICAgICAgICAgICB3c2RsUG9ydCA9IGdldFdTRExQb3J0KHByaW1hcnlEb2MsIGRvY0xpc3QsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7CisgICAgICAgICAgICAgICAgc2VpTW9kZWwuZnJlZXplKHdzZGxQb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5ldyBGZWF0dXJlcyBtaWdodCBoYXZlIGJlZW4gYWRkZWQgaW4gV1NETCB0aHJvdWdoIFBvbGljeS4KKyAgICAgICAgICAgIC8vIFRoaXMgc2V0cyBvbmx5IHRoZSB3c2RsIGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IHNldChlbmFibGVkL2Rpc2FibGVkKQorICAgICAgICAgICAgZmVhdHVyZXMubWVyZ2VGZWF0dXJlcyh3c2RsUG9ydCwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgdGVybWluYWw9IG5ldyBTRUlJbnZva2VyVHViZShzZWlNb2RlbCxpbnZva2VyLGJpbmRpbmcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyBASGFuZGxlckNoYWluLCBpZiBoYW5kbGVyLWNoYWluIGlzIG5vdCBzZXQgdmlhIERlcGxveW1lbnQgRGVzY3JpcHRvcgorICAgICAgICBpZiAocHJvY2Vzc0hhbmRsZXJBbm5vdGF0aW9uKSB7CisgICAgICAgICAgICBwcm9jZXNzSGFuZGxlckFubm90YXRpb24oYmluZGluZywgaW1wbFR5cGUsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2VsZWN0cyBvbmx5IHJlcXVpcmVkIG1ldGFkYXRhIGZvciB0aGlzIGVuZHBvaW50IGZyb20gdGhlIHBhc3NlZC1pbiBtZXRhZGF0YQorICAgICAgICBpZiAocHJpbWFyeURvYyAhPSBudWxsKSB7CisgICAgICAgICAgICBkb2NMaXN0ID0gZmluZE1ldGFkYXRhQ2xvc3VyZShwcmltYXJ5RG9jLCBkb2NMaXN0KTsKKyAgICAgICAgfQorICAgICAgICBTZXJ2aWNlRGVmaW5pdGlvbkltcGwgc2VydmljZURlZmluaXRvbiA9IChwcmltYXJ5RG9jICE9IG51bGwpID8gbmV3IFNlcnZpY2VEZWZpbml0aW9uSW1wbChkb2NMaXN0LCBwcmltYXJ5RG9jKSA6IG51bGw7CisKKyAgICAgICAgcmV0dXJuIG5ldyBXU0VuZHBvaW50SW1wbDxUPihzZXJ2aWNlTmFtZSwgcG9ydE5hbWUsIGJpbmRpbmcsY29udGFpbmVyLHNlaU1vZGVsLHdzZGxQb3J0LGltcGxUeXBlLCBzZXJ2aWNlRGVmaW5pdG9uLHRlcm1pbmFsLCBpc1RyYW5zcG9ydFN5bmNocm9ub3VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHb2VzIHRocm91Z2ggdGhlIG9yaWdpbmFsIG1ldGFkYXRhIGRvY3VtZW50cyBhbmQgY29sbGVjdHMgdGhlIHJlcXVpcmVkIG9uZXMuCisgICAgICogVGhpcyBkb25lIHRyYXZlcnNpbmcgZnJvbSBwcmltYXJ5IFdTREwgYW5kIGl0cyBpbXBvcnRzIHVudGlsIGl0IGJ1aWxkcyBhCisgICAgICogY29tcGxldGUgc2V0IG9mIGRvY3VtZW50cyh0cmFuc2l0aXZlIGNsb3N1cmUpIGZvciB0aGUgZW5kcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpbWFyeURvYyBwcmltYXJ5IFdTREwgZG9jCisgICAgICogQHBhcmFtIGRvY0xpc3QgY29tcGxldGUgbWV0YWRhdGEKKyAgICAgKiBAcmV0dXJuIG5ldyBtZXRhZGF0YSB0aGF0IGRvZXNuJ3QgY29udGFpbiBleHRyYW5lb3VzIGRvY3VtbmV0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFNERG9jdW1lbnRJbXBsPiBmaW5kTWV0YWRhdGFDbG9zdXJlKFNERG9jdW1lbnRJbXBsIHByaW1hcnlEb2MsIExpc3Q8U0REb2N1bWVudEltcGw+IGRvY0xpc3QpIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgbWFwIGZvciBvbGQgbWV0YWRhdGEKKyAgICAgICAgTWFwPFN0cmluZywgU0REb2N1bWVudEltcGw+IG9sZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU0REb2N1bWVudEltcGw+KCk7CisgICAgICAgIGZvcihTRERvY3VtZW50SW1wbCBkb2MgOiBkb2NMaXN0KSB7CisgICAgICAgICAgICBvbGRNYXAucHV0KGRvYy5nZXRTeXN0ZW1JZCgpLnRvU3RyaW5nKCksIGRvYyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIGEgbWFwIGZvciBuZXcgbWV0YWRhdGEKKyAgICAgICAgTWFwPFN0cmluZywgU0REb2N1bWVudEltcGw+IG5ld01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU0REb2N1bWVudEltcGw+KCk7CisgICAgICAgIG5ld01hcC5wdXQocHJpbWFyeURvYy5nZXRTeXN0ZW1JZCgpLnRvU3RyaW5nKCksIHByaW1hcnlEb2MpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiByZW1haW5pbmcgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgcmVtYWluaW5nLmFkZEFsbChwcmltYXJ5RG9jLmdldEltcG9ydHMoKSk7CisgICAgICAgIHdoaWxlKCFyZW1haW5pbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgdXJsID0gcmVtYWluaW5nLnJlbW92ZSgwKTsKKyAgICAgICAgICAgIFNERG9jdW1lbnRJbXBsIGRvYyA9IG9sZE1hcC5nZXQodXJsKTsKKyAgICAgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIG9sZCBtZXRhZGF0YSBkb2Vzbid0IGhhdmUgdGhpcyBpbXBvcnRlZCBkb2MsIG1heSBiZSBleHRlcm5hbAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbmV3IG1ldGFkYXRhIGFscmVhZHkgY29udGFpbnMgdGhpcyBkb2MKKyAgICAgICAgICAgIGlmICghbmV3TWFwLmNvbnRhaW5zS2V5KHVybCkpIHsKKyAgICAgICAgICAgICAgICBuZXdNYXAucHV0KHVybCwgZG9jKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcuYWRkQWxsKGRvYy5nZXRJbXBvcnRzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExpc3Q8U0REb2N1bWVudEltcGw+IG5ld01ldGFkYXRhID0gbmV3IEFycmF5TGlzdDxTRERvY3VtZW50SW1wbD4oKTsKKyAgICAgICAgbmV3TWV0YWRhdGEuYWRkQWxsKG5ld01hcC52YWx1ZXMoKSk7CisgICAgICAgIHJldHVybiBuZXdNZXRhZGF0YTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gdm9pZCBwcm9jZXNzSGFuZGxlckFubm90YXRpb24oV1NCaW5kaW5nIGJpbmRpbmcsIENsYXNzPFQ+IGltcGxUeXBlLCBRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydE5hbWUpIHsKKyAgICAgICAgSGFuZGxlckFubm90YXRpb25JbmZvIGNoYWluSW5mbyA9CisgICAgICAgICAgICAgICAgSGFuZGxlckFubm90YXRpb25Qcm9jZXNzb3IuYnVpbGRIYW5kbGVySW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxUeXBlLCBzZXJ2aWNlTmFtZSwgcG9ydE5hbWUsIGJpbmRpbmcpOworICAgICAgICBpZiAoY2hhaW5JbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJpbmRpbmcuc2V0SGFuZGxlckNoYWluKGNoYWluSW5mby5nZXRIYW5kbGVycygpKTsKKyAgICAgICAgICAgIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAoKFNPQVBCaW5kaW5nKSBiaW5kaW5nKS5zZXRSb2xlcyhjaGFpbkluZm8uZ2V0Um9sZXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIGlmIHRoZSBlbmRwb2ludCBpbXBsZW1lbnRvciBjbGFzcyBoYXMgQFdlYlNlcnZpY2Ugb3IgQFdlYlNlcnZpY2VQcm92aWRlcgorICAgICAqIGFubm90YXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgICB0cnVlIGlmIGl0IGlzIGEgUHJvdmlkZXIgb3IgQXN5bmNQcm92aWRlciBlbmRwb2ludAorICAgICAqICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgSWYgaXQgZG9lc24ndCBoYXZlIGFueSBvbmUgb2YgQFdlYlNlcnZpY2Ugb3IgQFdlYlNlcnZpY2VQcm92aWRlcgorICAgICAqICAgICAgSWYgaXQgaGFzIGJvdGggQFdlYlNlcnZpY2UgYW5kIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyaWZ5SW1wbGVtZW50b3JDbGFzcyhDbGFzczw/PiBjbHopIHsKKyAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyIHdzUHJvdmlkZXIgPSBjbHouZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICBXZWJTZXJ2aWNlIHdzID0gY2x6LmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7CisgICAgICAgIGlmICh3c1Byb3ZpZGVyID09IG51bGwgJiYgd3MgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbHogKyIgaGFzIG5laXRoZXIgQFdlYlNlcml2Y2Ugbm9yIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGlmICh3c1Byb3ZpZGVyICE9IG51bGwgJiYgd3MgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbHogKyIgaGFzIGJvdGggQFdlYlNlcml2Y2UgYW5kIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3NQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoUHJvdmlkZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHopIHx8IEFzeW5jUHJvdmlkZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHopKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNseiArIiBkb2Vzbid0IGltcGxlbWVudCBQcm92aWRlciBvciBBc3luY1Byb3ZpZGVyIGludGVyZmFjZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0U0VJTW9kZWxJbXBsIGNyZWF0ZVNFSU1vZGVsKFdTRExQb3J0IHdzZGxQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGltcGxUeXBlLCBATm90TnVsbCBRTmFtZSBzZXJ2aWNlTmFtZSwgQE5vdE51bGwgUU5hbWUgcG9ydE5hbWUsIFdTQmluZGluZyBiaW5kaW5nKSB7CisKKyAgICAgICAgUnVudGltZU1vZGVsZXIgcmFwOworICAgICAgICAvLyBDcmVhdGUgcnVudGltZSBtb2RlbCBmb3Igbm9uIFByb3ZpZGVyIGVuZHBvaW50cworCisgICAgICAgIC8vIHdzZGxQb3J0IHdpbGwgYmUgbnVsbCwgbWVhbnMgd2Ugd2lsbCBnZW5lcmF0ZSBXU0RMLiBIZW5jZSBubyBuZWVkIHRvIGFwcGx5CisgICAgICAgIC8vIGJpbmRpbmdzIG9yIG5lZWQgdG8gbG9vayBpbiB0aGUgV1NETAorICAgICAgICBpZih3c2RsUG9ydCA9PSBudWxsKXsKKyAgICAgICAgICAgIHJhcCA9IG5ldyBSdW50aW1lTW9kZWxlcihpbXBsVHlwZSxzZXJ2aWNlTmFtZSwgYmluZGluZy5nZXRCaW5kaW5nSWQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgVGhpcyBub3QgbmVlZGVkIGFueW1vcmUgYXMgd3NkbEZlYXR1cmVzIGFyZSBtZXJnZWQgbGF0ZXIgYW55d2F5CisgICAgICAgICAgICBhbmQgc28gaXMgdGhlIE1UT01GZWF0dXJlLgorICAgICAgICAgICAgYXBwbHlFZmZlY3RpdmVNdG9tU2V0dGluZyh3c2RsUG9ydC5nZXRCaW5kaW5nKCksIGJpbmRpbmcpOworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8vbm93IHdlIGdvdCB0aGUgQmluZGluZyBzbyBsZXRzIGJ1aWxkIHRoZSBtb2RlbAorICAgICAgICAgICAgcmFwID0gbmV3IFJ1bnRpbWVNb2RlbGVyKGltcGxUeXBlLCBzZXJ2aWNlTmFtZSwgKFdTRExQb3J0SW1wbCl3c2RsUG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgcmFwLnNldFBvcnROYW1lKHBvcnROYW1lKTsKKyAgICAgICAgcmV0dXJuIHJhcC5idWlsZFJ1bnRpbWVNb2RlbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqU2V0IHRoZSBtdG9tIGVuYWJsZSBzZXR0aW5nIGZyb20gd3NkbCBtb2RlbCAobXRvbSBwb2xpY3kgYXNzZXJ0aW9uKSBvbiB0byBAbGluayBXU0JpbmRpbmd9IGlmIEREIGhhcworICAgICAqIG5vdCBhbHJlYWR5IHNldCBpdCBvbiBCaW5kaW5nSUQuIEFsc28gY2hlY2sgY29uZmxpY3RzLgorICAgICAqLworICAgIC8qCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseUVmZmVjdGl2ZU10b21TZXR0aW5nKFdTRExCb3VuZFBvcnRUeXBlIHdzZGxCaW5kaW5nLCBXU0JpbmRpbmcgYmluZGluZyl7CisgICAgICAgIGlmKHdzZGxCaW5kaW5nLmlzTVRPTUVuYWJsZWQoKSl7CisgICAgICAgICAgICBCaW5kaW5nSUQgYmluZGluZ0lkID0gYmluZGluZy5nZXRCaW5kaW5nSWQoKTsKKyAgICAgICAgICAgIGlmKGJpbmRpbmdJZC5pc01UT01FbmFibGVkKCkgPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgYmluZGluZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIH1lbHNlIGlmIChiaW5kaW5nSWQuaXNNVE9NRW5hYmxlZCgpICE9IG51bGwgJiYgYmluZGluZ0lkLmlzTVRPTUVuYWJsZWQoKSA9PSBCb29sZWFuLkZBTFNFKXsKKyAgICAgICAgICAgICAgICAvL1RPRE86IGkxOE4KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oIkRlcGxveW1lbnQgZmFpbGVkISBNdG9tIHBvbGljeSBhc3NlcnRpb24gaW4gV1NETCBpcyBlbmFibGVkIHdoZXJlYXMgdGhlIGRlcGx5bWVudCBkZXNjcmlwdG9yIHNldHRpbmcgd2FudHMgdG8gZGlzYWJsZSBpdCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqLworICAgIC8qKgorICAgICAqIElmIHNlcnZpY2UgbmFtZSBpcyBub3QgYWxyZWFkeSBzZXQgdmlhIEREIG9yIHByb2dyYW1tYXRpY2FsbHksIGl0IHVzZXMKKyAgICAgKiBhbm5vdGF0aW9ucyB7QGxpbmsgV2ViU2VydmljZVByb3ZpZGVyfSwge0BsaW5rIFdlYlNlcnZpY2V9IG9uIGltcGxlbWVudG9yQ2xhc3MgdG8gZ2V0IFBvcnROYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBub24tbnVsbCBzZXJ2aWNlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIFFOYW1lIGdldERlZmF1bHRTZXJ2aWNlTmFtZShDbGFzczw/PiBpbXBsVHlwZSkgeworICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyIHdzUHJvdmlkZXIgPSBpbXBsVHlwZS5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGlmICh3c1Byb3ZpZGVyIT1udWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdG5zID0gd3NQcm92aWRlci50YXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IHdzUHJvdmlkZXIuc2VydmljZU5hbWUoKTsKKyAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKHRucywgbG9jYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VydmljZU5hbWUgPSBSdW50aW1lTW9kZWxlci5nZXRTZXJ2aWNlTmFtZShpbXBsVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IHNlcnZpY2VOYW1lICE9IG51bGw7CisgICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBwb3J0TmFtZSBpcyBub3QgYWxyZWFkeSBzZXQgdmlhIEREIG9yIHByb2dyYW1tYXRpY2FsbHksIGl0IHVzZXMKKyAgICAgKiBhbm5vdGF0aW9ucyBvbiBpbXBsZW1lbnRvckNsYXNzIHRvIGdldCBQb3J0TmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbm9uLW51bGwgcG9ydCBuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBRTmFtZSBnZXREZWZhdWx0UG9ydE5hbWUoUU5hbWUgc2VydmljZU5hbWUsIENsYXNzPD8+IGltcGxUeXBlKSB7CisgICAgICAgIFFOYW1lIHBvcnROYW1lOworICAgICAgICBXZWJTZXJ2aWNlUHJvdmlkZXIgd3NQcm92aWRlciA9IGltcGxUeXBlLmdldEFubm90YXRpb24oV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgaWYgKHdzUHJvdmlkZXIhPW51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0bnMgPSB3c1Byb3ZpZGVyLnRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gd3NQcm92aWRlci5wb3J0TmFtZSgpOworICAgICAgICAgICAgcG9ydE5hbWUgPSBuZXcgUU5hbWUodG5zLCBsb2NhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwb3J0TmFtZSA9IFJ1bnRpbWVNb2RlbGVyLmdldFBvcnROYW1lKGltcGxUeXBlLCBzZXJ2aWNlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IHBvcnROYW1lICE9IG51bGw7CisgICAgICAgIHJldHVybiBwb3J0TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB3c2RsIGZyb20gQFdlYlNlcnZpY2UsIG9yIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiB1c2luZworICAgICAqIHdzZGxMb2NhdGlvbiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGltcGxUeXBlCisgICAgICogICAgICBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBjbGFzcworICAgICAqICAgICAgbWFrZSBzdXJlIHRoYXQgeW91IGNhbGxlZCB7QGxpbmsgI3ZlcmlmeUltcGxlbWVudG9yQ2xhc3N9IG9uIGl0LgorICAgICAqIEByZXR1cm4gd3NkbCBpZiB0aGVyZSBpcyB3c2RsTG9jYXRpb24sIGVsc2UgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQE51bGxhYmxlIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oQ2xhc3M8Pz4gaW1wbFR5cGUpIHsKKyAgICAgICAgU3RyaW5nIHdzZGw7CisgICAgICAgIFdlYlNlcnZpY2Ugd3MgPSBpbXBsVHlwZS5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBpZiAod3MgIT0gbnVsbCkgeworICAgICAgICAgICAgd3NkbCA9IHdzLndzZGxMb2NhdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyIHdzUHJvdmlkZXIgPSBpbXBsVHlwZS5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnQgd3NQcm92aWRlciAhPSBudWxsOworICAgICAgICAgICAgd3NkbCA9IHdzUHJvdmlkZXIud3NkbExvY2F0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdzZGwubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICB3c2RsID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3NkbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIFdTREwgYW5kIFhNTCBTY2hlbWEgZm9yIHRoZSBlbmRwb2ludCBpZiBuZWNlc3NhcnkKKyAgICAgKiBJdCBnZW5lcmF0ZXMgV1NETCBvbmx5IGZvciBTT0FQMS4xLCBhbmQgZm9yIFhTT0FQMS4yIGJpbmRpbmdzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU0REb2N1bWVudEltcGwgZ2VuZXJhdGVXU0RMKFdTQmluZGluZyBiaW5kaW5nLCBBYnN0cmFjdFNFSU1vZGVsSW1wbCBzZWlNb2RlbCwgTGlzdDxTRERvY3VtZW50SW1wbD4gZG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciwgQ2xhc3MgaW1wbFR5cGUpIHsKKyAgICAgICAgQmluZGluZ0lEIGJpbmRpbmdJZCA9IGJpbmRpbmcuZ2V0QmluZGluZ0lkKCk7CisgICAgICAgIGlmICghYmluZGluZ0lkLmNhbkdlbmVyYXRlV1NETCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oImNhbi5ub3QuZ2VuZXJhdGUud3NkbCIsIGJpbmRpbmdJZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmluZGluZ0lkLnRvU3RyaW5nKCkuZXF1YWxzKFNPQVBCaW5kaW5nSW1wbC5YX1NPQVAxMkhUVFBfQklORElORykpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTZXJ2ZXJNZXNzYWdlcy5HRU5FUkFURV9OT05fU1RBTkRBUkRfV1NETCgpOworICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdlbmVyYXRlIFdTREwgYW5kIHNjaGVtYSBkb2N1bWVudHMgdXNpbmcgcnVudGltZSBtb2RlbAorICAgICAgICBXU0RMR2VuUmVzb2x2ZXIgd3NkbFJlc29sdmVyID0gbmV3IFdTRExHZW5SZXNvbHZlcihkb2NzLHNlaU1vZGVsLmdldFNlcnZpY2VRTmFtZSgpLHNlaU1vZGVsLmdldFBvcnRUeXBlTmFtZSgpKTsKKyAgICAgICAgV1NETEdlbmVyYXRvciB3c2RsR2VuID0gbmV3IFdTRExHZW5lcmF0b3Ioc2VpTW9kZWwsIHdzZGxSZXNvbHZlciwgYmluZGluZywgY29udGFpbmVyLCBpbXBsVHlwZSwKKyAgICAgICAgICAgICAgICBTZXJ2aWNlRmluZGVyLmZpbmQoV1NETEdlbmVyYXRvckV4dGVuc2lvbi5jbGFzcykudG9BcnJheSgpKTsKKyAgICAgICAgd3NkbEdlbi5kb0dlbmVyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIHdzZGxSZXNvbHZlci51cGRhdGVEb2NzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRzIHtAbGluayBTRERvY3VtZW50SW1wbH0gZnJvbSB7QGxpbmsgU0REb2N1bWVudFNvdXJjZX0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTRERvY3VtZW50SW1wbD4gY2F0ZWdvcmlzZU1ldGFkYXRhKAorICAgICAgICBMaXN0PFNERG9jdW1lbnRTb3VyY2U+IHNyYywgUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnRUeXBlTmFtZSkgeworCisgICAgICAgIExpc3Q8U0REb2N1bWVudEltcGw+IHIgPSBuZXcgQXJyYXlMaXN0PFNERG9jdW1lbnRJbXBsPihzcmMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChTRERvY3VtZW50U291cmNlIGRvYyA6IHNyYykgeworICAgICAgICAgICAgci5hZGQoU0REb2N1bWVudEltcGwuY3JlYXRlKGRvYyxzZXJ2aWNlTmFtZSxwb3J0VHlwZU5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB3aGV0aGVyIHRoZSBnaXZlbiBwcmltYXJ5V3NkbCBjb250YWlucyB0aGUgZ2l2ZW4gc2VydmljZU5hbWUuCisgICAgICogSWYgdGhlIFdTREwgZG9lc24ndCBoYXZlIHRoZSBzZXJ2aWNlLCBpdCB0aHJvd3MgYW4gV2ViU2VydmljZUV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVByaW1hcnlXU0RMKEBOb3ROdWxsIFNERG9jdW1lbnRTb3VyY2UgcHJpbWFyeVdzZGwsIEBOb3ROdWxsIFFOYW1lIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIFNERG9jdW1lbnRJbXBsIHByaW1hcnlEb2MgPSBTRERvY3VtZW50SW1wbC5jcmVhdGUocHJpbWFyeVdzZGwsc2VydmljZU5hbWUsbnVsbCk7CisgICAgICAgIGlmICghKHByaW1hcnlEb2MgaW5zdGFuY2VvZiBTRERvY3VtZW50LldTREwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTm90IGEgcHJpbWFyeSBXU0RMPSIrcHJpbWFyeVdzZGwuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgU0REb2N1bWVudC5XU0RMIHdzZGxEb2MgPSAoU0REb2N1bWVudC5XU0RMKXByaW1hcnlEb2M7CisgICAgICAgIGlmICghd3NkbERvYy5oYXNTZXJ2aWNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJOb3QgYSBwcmltYXJ5IFdTREw9IitwcmltYXJ5V3NkbC5nZXRTeXN0ZW1JZCgpKworICAgICAgICAgICAgICAgICAgICAiIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBTZXJ2aWNlICIrc2VydmljZU5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgdGhlIHByaW1hcnkgV1NETCBkb2N1bWVudCBmcm9tIHRoZSBsaXN0IG9mIG1ldGFkYXRhIGRvY3VtZW50cy4gSWYKKyAgICAgKiB0aGVyZSBhcmUgdHdvIG1ldGFkYXRhIGRvY3VtZW50cyB0aGF0IHF1YWxpZnkgZm9yIHByaW1hcnksIGl0IHRocm93cyBhbgorICAgICAqIGV4Y2VwdGlvbi4gSWYgdGhlcmUgYXJlIHR3byBtZXRhZGF0YSBkb2N1bWVudHMgdGhhdCBxdWFsaWZ5IGZvciBwb3J0dHlwZSwKKyAgICAgKiBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBwcmltYXkgd3NkbCBkb2N1bWVudCwgbnVsbCBpZiBpcyBub3QgdGhlcmUgaW4gdGhlIGRvY0xpc3QKKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEBOdWxsYWJsZSBTRERvY3VtZW50SW1wbCBmaW5kUHJpbWFyeShATm90TnVsbCBMaXN0PFNERG9jdW1lbnRJbXBsPiBkb2NMaXN0KSB7CisgICAgICAgIFNERG9jdW1lbnRJbXBsIHByaW1hcnlEb2MgPSBudWxsOworICAgICAgICBib29sZWFuIGZvdW5kQ29uY3JldGUgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZEFic3RyYWN0ID0gZmFsc2U7CisgICAgICAgIGZvcihTRERvY3VtZW50SW1wbCBkb2MgOiBkb2NMaXN0KSB7CisgICAgICAgICAgICBpZiAoZG9jIGluc3RhbmNlb2YgU0REb2N1bWVudC5XU0RMKSB7CisgICAgICAgICAgICAgICAgU0REb2N1bWVudC5XU0RMIHdzZGxEb2MgPSAoU0REb2N1bWVudC5XU0RMKWRvYzsKKyAgICAgICAgICAgICAgICBpZiAod3NkbERvYy5oYXNTZXJ2aWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyeURvYyA9IGRvYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29uY3JldGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigiZHVwbGljYXRlLnByaW1hcnkud3NkbCIsIGRvYy5nZXRTeXN0ZW1JZCgpICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm91bmRDb25jcmV0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3c2RsRG9jLmhhc1BvcnRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kQWJzdHJhY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigiZHVwbGljYXRlLmFic3RyYWN0LndzZGwiLCBkb2MuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm91bmRBYnN0cmFjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwcmltYXJ5RG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgcHJpbWFyeSBXU0RMIGFuZCByZXR1cm5zIHRoZSB7QGxpbmsgV1NETFBvcnR9IGZvciB0aGUgZ2l2ZW4gc2VydmljZSBhbmQgcG9ydCBuYW1lcworICAgICAqCisgICAgICogQHBhcmFtIHByaW1hcnlXc2RsIFByaW1hcnkgV1NETAorICAgICAqIEBwYXJhbSBtZXRhZGF0YSBpdCBtYXkgY29udGFpbiBpbXBvcnRlZCBXU0RMIGFuZCBzY2hlbWEgZG9jdW1lbnRzCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIHNlcnZpY2UgbmFtZSBpbiB3c2RsCisgICAgICogQHBhcmFtIHBvcnROYW1lIHBvcnQgbmFtZSBpbiBXU0RMCisgICAgICogQHJldHVybiBub24tbnVsbCB3c2RsIHBvcnQgb2JqZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQE5vdE51bGwgV1NETFBvcnRJbXBsIGdldFdTRExQb3J0KFNERG9jdW1lbnRTb3VyY2UgcHJpbWFyeVdzZGwsIExpc3Q8PyBleHRlbmRzIFNERG9jdW1lbnRTb3VyY2U+IG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm90TnVsbCBRTmFtZSBzZXJ2aWNlTmFtZSwgQE5vdE51bGwgUU5hbWUgcG9ydE5hbWUpIHsKKyAgICAgICAgVVJMIHdzZGxVcmwgPSBwcmltYXJ5V3NkbC5nZXRTeXN0ZW1JZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVE9ETzogZGVsZWdhdGUgdG8gYW5vdGhlciBlbnRpdHkgcmVzb2x2ZXIKKyAgICAgICAgICAgIFdTRExNb2RlbEltcGwgd3NkbERvYyA9IFJ1bnRpbWVXU0RMUGFyc2VyLnBhcnNlKAorICAgICAgICAgICAgICAgIG5ldyBQYXJzZXIocHJpbWFyeVdzZGwpLCBuZXcgRW50aXR5UmVzb2x2ZXJJbXBsKG1ldGFkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIFNlcnZpY2VGaW5kZXIuZmluZChXU0RMUGFyc2VyRXh0ZW5zaW9uLmNsYXNzKS50b0FycmF5KCkpOworICAgICAgICAgICAgV1NETFBvcnRJbXBsIHdzZGxQb3J0ID0gd3NkbERvYy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKS5nZXQocG9ydE5hbWUpOworICAgICAgICAgICAgaWYgKHdzZGxQb3J0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oU2VydmVyTWVzc2FnZXMubG9jYWxpemFibGVSVU5USU1FX1BBUlNFUl9XU0RMX0lOQ09SUkVDVFNFUlZJQ0VQT1JUKHNlcnZpY2VOYW1lLCBwb3J0TmFtZSwgd3NkbFVybCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdzZGxQb3J0OworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInJ1bnRpbWUucGFyc2VyLndzZGwiLCB3c2RsVXJsLGUpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJydW50aW1lLnNheHBhcnNlci5leGNlcHRpb24iLCBlLmdldE1lc3NhZ2UoKSwgZS5nZXRMb2NhdGlvbigpLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigicnVudGltZS5wYXJzZXIud3NkbCIsIHdzZGxVcmwsZSk7CisgICAgICAgIH0gY2F0Y2ggKFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJydW50aW1lLnBhcnNlci53c2RsIiwgd3NkbFVybCxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBYTUxFbnRpdHlSZXNvbHZlcn0gdGhhdCBjYW4gcmVzb2x2ZSB0byB7QGxpbmsgU0REb2N1bWVudFNvdXJjZX1zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVudGl0eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyIHsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLFNERG9jdW1lbnRTb3VyY2U+IG1ldGFkYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLFNERG9jdW1lbnRTb3VyY2U+KCk7CisKKyAgICAgICAgcHVibGljIEVudGl0eVJlc29sdmVySW1wbChMaXN0PD8gZXh0ZW5kcyBTRERvY3VtZW50U291cmNlPiBtZXRhZGF0YSkgeworICAgICAgICAgICAgZm9yIChTRERvY3VtZW50U291cmNlIGRvYyA6IG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YS5wdXQoZG9jLmdldFN5c3RlbUlkKCkudG9FeHRlcm5hbEZvcm0oKSxkb2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBhcnNlciByZXNvbHZlRW50aXR5IChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTRERvY3VtZW50U291cmNlIGRvYyA9IG1ldGFkYXRhLmdldChzeXN0ZW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlcihkb2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKAorICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5zZXJ2ZXIuZW5kcG9pbnQiKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9FbmRwb2ludE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0VuZHBvaW50TWVzc2FnZUNvbnRleHRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhYWYxZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9FbmRwb2ludE1lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5BdHRhY2htZW50U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7CitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKKworLyoqCisgKiBJbXBsZW1lbnRzIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dH0ncyB7QGxpbmsgTWVzc2FnZUNvbnRleHR9IG9uIHRvcCBvZiB7QGxpbmsgUGFja2V0fS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIHtAbGluayBNYXB9IHZpZXcgZm9yIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0aWVzIHRoYXQKKyAqIGdldHMgZXhwb3NlZCB0byBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbnMgZHVyaW5nIHRoZSBpbnZvY2F0aW9uCisgKiBvZiB3ZWIgbWV0aG9kcy4gVGhlIGltcGxlbWVudGF0aW9ucyBhY2Nlc3MgdGhpcyBtYXAgdXNpbmcKKyAqIFdlYlNlcnZpY2VDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkuCisgKgorICogPHA+CisgKiBTb21lIG9mIHRoZSB7QGxpbmsgTWFwfSBtZXRob2RzIHJlcXVyZSB0aGlzIGNsYXNzIHRvCisgKiBidWlsZCB0aGUgY29tcGxldGUge0BsaW5rIFNldH0gb2YgcHJvcGVydGllcywgYnV0IHdlCisgKiB0cnkgdG8gYXZvaWQgdGhhdCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICoKKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlN1c3BpY2lvdXNNZXRob2RDYWxscyJ9KQorcHVibGljIGZpbmFsIGNsYXNzIEVuZHBvaW50TWVzc2FnZUNvbnRleHRJbXBsIGV4dGVuZHMgQWJzdHJhY3RNYXA8U3RyaW5nLE9iamVjdD4gaW1wbGVtZW50cyBNZXNzYWdlQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBMYXppbHkgY29tcHV0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8TWFwLkVudHJ5PFN0cmluZyxPYmplY3Q+PiBlbnRyeVNldDsKKyAgICBwcml2YXRlIGZpbmFsIFBhY2tldCBwYWNrZXQ7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcGFja2V0CisgICAgICogICAgICBUaGUge0BsaW5rIFBhY2tldH0gdG8gd3JhcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW5kcG9pbnRNZXNzYWdlQ29udGV4dEltcGwoUGFja2V0IHBhY2tldCkgeworICAgICAgICB0aGlzLnBhY2tldCA9IHBhY2tldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIGlmIChwYWNrZXQuc3VwcG9ydHMoa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIHBhY2tldC5nZXQoa2V5KTsgICAgLy8gc3Ryb25nbHkgdHlwZWQKKyAgICAgICAgfQorICAgICAgICBpZiAocGFja2V0LmdldEhhbmRsZXJTY29wZVByb3BlcnR5TmFtZXModHJ1ZSkuY29udGFpbnMoa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgICAgICAgICAgLy8gbm8gc3VjaCBhcHBsaWNhdGlvbi1zY29wZSBwcm9wZXJ0eQorICAgICAgICB9CisgICAgICAgIE9iamVjdCB2YWx1ZSA9ICBwYWNrZXQuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KGtleSk7CisKKyAgICAgICAgLy9hZGQgdGhlIGF0dGFjaG1lbnRzIGZyb20gdGhlIE1lc3NhZ2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXR0YWNobWVudCBwcm9wZXJ0eQorICAgICAgICBpZihrZXkuZXF1YWxzKE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpIHx8CisgICAgICAgICAgICAgICAga2V5LmVxdWFscyhNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpKXsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPiBhdHRzID0gKE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPikgdmFsdWU7CisgICAgICAgICAgICBpZihhdHRzID09IG51bGwpCisgICAgICAgICAgICAgICAgYXR0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KCk7CisgICAgICAgICAgICBBdHRhY2htZW50U2V0IGF0dFNldCA9IHBhY2tldC5nZXRNZXNzYWdlKCkuZ2V0QXR0YWNobWVudHMoKTsKKyAgICAgICAgICAgIGZvcihBdHRhY2htZW50IGF0dCA6IGF0dFNldCl7CisgICAgICAgICAgICAgICAgYXR0cy5wdXQoYXR0LmdldENvbnRlbnRJZCgpLCBhdHQuYXNEYXRhSGFuZGxlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhdHRzOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHBhY2tldC5zdXBwb3J0cyhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gcGFja2V0LnB1dChrZXksIHZhbHVlKTsgICAgIC8vIHN0cm9uZ2x5IHR5cGVkCisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IG9sZCA9IHBhY2tldC5pbnZvY2F0aW9uUHJvcGVydGllcy5nZXQoa2V5KTsKKyAgICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocGFja2V0LmdldEhhbmRsZXJTY29wZVByb3BlcnR5TmFtZXModHJ1ZSkuY29udGFpbnMoa2V5KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBvdmVyd3JpdGUgcHJvcGVydHkgaW4gSEFORExFUiBzY29wZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gT3ZlcndyaXRlIGV4aXN0aW5nIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0eQorICAgICAgICAgICAgcGFja2V0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBvbGQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gZXhpc3RpbmcgcHJvcGVydHkuIFNvIEFkZCBhIG5ldyBwcm9wZXJ0eQorICAgICAgICBwYWNrZXQuaW52b2NhdGlvblByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgICBpZiAocGFja2V0LnN1cHBvcnRzKGtleSkpIHsKKyAgICAgICAgICAgICByZXR1cm4gcGFja2V0LnJlbW92ZShrZXkpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBvbGQgPSBwYWNrZXQuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KGtleSk7CisgICAgICAgIGlmIChvbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHBhY2tldC5nZXRIYW5kbGVyU2NvcGVQcm9wZXJ0eU5hbWVzKHRydWUpLmNvbnRhaW5zKGtleSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgcmVtb3ZlIHByb3BlcnR5IGluIEhBTkRMRVIgc2NvcGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBBUFBMSUNBVElPTiBzY29wZWQgcHJvcGVydHkKKyAgICAgICAgICAgIHBhY2tldC5pbnZvY2F0aW9uUHJvcGVydGllcy5yZW1vdmUoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiBvbGQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gZXhpc3RpbmcgcHJvcGVydHkuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTZXQoKSB7CisgICAgICAgIGlmIChlbnRyeVNldCA9PSBudWxsKSB7CisgICAgICAgICAgICBlbnRyeVNldCA9IG5ldyBFbnRyeVNldCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbnRyeVNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgbmFtZSwgTWVzc2FnZUNvbnRleHQuU2NvcGUgc2NvcGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJBbGwgdGhlIHByb3BlcnRpZXMgaW4gdGhpcyBjb250ZXh0IGFyZSBpbiBBUFBMSUNBVElPTiBzY29wZS4gQ2Fubm90IGRvIHNldFNjb3BlKCkuIik7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VDb250ZXh0LlNjb3BlIGdldFNjb3BlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQWxsIHRoZSBwcm9wZXJ0aWVzIGluIHRoaXMgY29udGV4dCBhcmUgaW4gQVBQTElDQVRJT04gc2NvcGUuIENhbm5vdCBkbyBnZXRTY29wZSgpLiIpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldDxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiB7CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gaXQgPSBjcmVhdGVCYWNrdXBNYXAoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4oKSB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBjdXI7CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IG5leHQoKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ciA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICBFbmRwb2ludE1lc3NhZ2VDb250ZXh0SW1wbC50aGlzLnJlbW92ZShjdXIuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQmFja3VwTWFwKCkuc2l6ZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gY3JlYXRlQmFja3VwTWFwKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGJhY2t1cE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBiYWNrdXBNYXAucHV0QWxsKHBhY2tldC5jcmVhdGVNYXBWaWV3KCkpOworICAgICAgICBTZXQ8U3RyaW5nPiBoYW5kbGVyUHJvcHMgPSBwYWNrZXQuZ2V0SGFuZGxlclNjb3BlUHJvcGVydHlOYW1lcyh0cnVlKTsKKyAgICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZSA6IHBhY2tldC5pbnZvY2F0aW9uUHJvcGVydGllcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBpZiAoIWhhbmRsZXJQcm9wcy5jb250YWlucyhlLmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgIGJhY2t1cE1hcC5wdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmFja3VwTWFwOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0ludm9rZXJUdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvSW52b2tlclR1YmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGIxYWVmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL0ludm9rZXJUdWJlLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlQ2xvbmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLmhlbHBlci5BYnN0cmFjdFR1YmVJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuKjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuU2VydmVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnByb3ZpZGVyLlByb3ZpZGVySW52b2tlclR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnNlaS5TRUlJbnZva2VyVHViZTsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBCYXNlIGNvZGUgZm9yIHtAbGluayBQcm92aWRlckludm9rZXJUdWJlfSBhbmQge0BsaW5rIFNFSUludm9rZXJUdWJlfS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaGlkZXMge0BsaW5rIEluc3RhbmNlUmVzb2x2ZXJ9IGFuZCBwZXJmb3JtcyBhIHNldCB1cAorICogbmVjZXNzYXJ5IGZvciB7QGxpbmsgV2ViU2VydmljZUNvbnRleHR9IHRvIGNvcnJlY3RseS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnZva2VyVHViZTxUPiBleHRlbmRzIEFic3RyYWN0VHViZUltcGwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBJbnZva2VyIGludm9rZXI7CisgICAgcHJpdmF0ZSBXU0VuZHBvaW50IGVuZHBvaW50OworCisgICAgcHJvdGVjdGVkIEludm9rZXJUdWJlKEludm9rZXIgaW52b2tlcikgeworICAgICAgICB0aGlzLmludm9rZXIgPSBpbnZva2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KFdTRW5kcG9pbnQgZW5kcG9pbnQpIHsKKyAgICAgICAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50OworICAgICAgICBXU1dlYlNlcnZpY2VDb250ZXh0IHdlYlNlcnZpY2VDb250ZXh0ID0gbmV3IEFic3RyYWN0V2ViU2VydmljZUNvbnRleHQoZW5kcG9pbnQpIHsKKyAgICAgICAgICAgIHB1YmxpYyBATnVsbGFibGUgUGFja2V0IGdldFJlcXVlc3RQYWNrZXQoKSB7CisgICAgICAgICAgICAgICAgUGFja2V0IHAgPSBwYWNrZXRzLmdldCgpOworICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBpbnZva2VyLnN0YXJ0KHdlYlNlcnZpY2VDb250ZXh0LGVuZHBvaW50KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgV1NFbmRwb2ludCBnZXRFbmRwb2ludCgpIHsKKyAgICAgICAgcmV0dXJuIGVuZHBvaW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHNlcnZlcyB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgIHB1YmxpYyBmaW5hbCBATm90TnVsbCBUIGdldFNlcnZhbnQoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgLy8gdGhpcyBhbGxvd3MgV2ViU2VydmljZUNvbnRleHQgdG8gZmluZCB0aGlzIHBhY2tldAorICAgICAgICBwYWNrZXRzLnNldChyZXF1ZXN0KTsKKyAgICAgICAgcmV0dXJuIGludm9rZXIucmVzb2x2ZShyZXF1ZXN0KTsKKyAgICB9CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSW52b2tlcn0gb2JqZWN0IHRoYXQgc2VydmVzIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBATm90TnVsbCBJbnZva2VyIGdldEludm9rZXIoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJvY2Vzc1JlcXVlc3QoKSBhbmQgcHJvY2Vzc1Jlc3BvbnNlKCkgZG8gbm90IHNoYXJlIGFueSBpbnN0YW5jZSB2YXJpYWJsZXMKKyAgICAgKiB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0LiB7QGxpbmsgSW52b2tlclR1YmV9IGlzIHN0YXRlbGVzcyBhbmQgdGVybWluYWwsCisgICAgICogc28gbm8gbmVlZCB0byBjcmVhdGUgY29waWVzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBBYnN0cmFjdFR1YmVJbXBsIGNvcHkoVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgY2xvbmVyLmFkZCh0aGlzLHRoaXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBpbnZva2VyLmRpc3Bvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWFydCBvZiB7QGxpbmsgV2ViU2VydmljZUNvbnRleHR9LgorICAgICAqIFJlbWVtYmVycyB3aGljaCB0aHJlYWQgaXMgc2VydmluZyB3aGljaCBwYWNrZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8UGFja2V0PiBwYWNrZXRzID0gbmV3IFRocmVhZExvY2FsPFBhY2tldD4oKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2hpbGUgdGhlIHVzZXIgc2VydmljZSBpcyBzZXJ2aWNpbmcgdGhlIHJlcXVlc3QKKyAgICAgKiBzeW5jaHJvbm91c2x5LCB0byBvYnRhaW4gdGhlIGN1cnJlbnQgcmVxdWVzdCBwYWNrZXQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIHByaW1hcmlseSBkZXNpZ25lZCBmb3Ige0BsaW5rIFN0YXRlZnVsSW5zdGFuY2VSZXNvbHZlcn0uIFVzZSB3aXRoIGNhcmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBATm90TnVsbCBQYWNrZXQgZ2V0Q3VycmVudFBhY2tldCgpIHsKKyAgICAgICAgUGFja2V0IHBhY2tldCA9IHBhY2tldHMuZ2V0KCk7CisgICAgICAgIGlmKHBhY2tldD09bnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKFNlcnZlck1lc3NhZ2VzLk5PX0NVUlJFTlRfUEFDS0VUKCkpOworICAgICAgICByZXR1cm4gcGFja2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBJbnZva2VyfSBmaWx0ZXIgdGhhdCBzZXRzIGFuZCByZXN0b3JlcyB0aGUgY3VycmVudCBwYWNrZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBJbnZva2VyIHdyYXBwZXIgPSBuZXcgSW52b2tlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKFBhY2tldCBwLCBNZXRob2QgbSwgT2JqZWN0Li4uIGFyZ3MpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFBhY2tldCBvbGQgPSBzZXQocCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2VyLmludm9rZShwLCBtLCBhcmdzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc2V0KG9sZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPlQgaW52b2tlUHJvdmlkZXIoUGFja2V0IHAsIFQgYXJnKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBQYWNrZXQgb2xkID0gc2V0KHApOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW52b2tlci5pbnZva2VQcm92aWRlcihwLCBhcmcpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzZXQob2xkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+dm9pZCBpbnZva2VBc3luY1Byb3ZpZGVyKFBhY2tldCBwLCBUIGFyZywgQXN5bmNQcm92aWRlckNhbGxiYWNrIGNiYWssIFdlYlNlcnZpY2VDb250ZXh0IGN0eHQpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFBhY2tldCBvbGQgPSBzZXQocCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludm9rZXIuaW52b2tlQXN5bmNQcm92aWRlcihwLCBhcmcsIGNiYWssIGN0eHQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzZXQob2xkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUGFja2V0IHNldChQYWNrZXQgcCkgeworICAgICAgICAgICAgUGFja2V0IG9sZCA9IHBhY2tldHMuZ2V0KCk7CisgICAgICAgICAgICBwYWNrZXRzLnNldChwKTsKKyAgICAgICAgICAgIHJldHVybiBvbGQ7CisgICAgICAgIH0KKyAgICB9OworCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvUGVwdFRpZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1BlcHRUaWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3ZmQ1Zi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvUGVwdFRpZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uLlRpZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLk1lc3NhZ2VJbmZvVXRpbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogQ3JlYXRlcyBhIFN0YXRlbGVzcyBUaWUgb2JqZWN0IHNvIHRoYXQgaXQgaXMgY3JlYXRlZCBvbmx5IG9uY2UgYW5kIHJldXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFBlcHRUaWUgaW1wbGVtZW50cyBUaWUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoCi0gICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5zZXJ2ZXIuUGVwdFRpZSIpOwotCi0gICAgcHVibGljIHZvaWQgX3NldFNlcnZhbnQoT2JqZWN0IHNlcnZhbnQpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBfZ2V0U2VydmFudCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFRpZSNfaW52b2tlKE1lc3NhZ2VJbmZvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIF9pbnZva2UoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgT2JqZWN0W10gb2EgPSBtZXNzYWdlSW5mby5nZXREYXRhKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBtZXNzYWdlSW5mby5nZXRNZXRob2QoKTsKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gTWVzc2FnZUluZm9VdGlsLmdldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvKTsKLSAgICAgICAgUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8gPSBydEN0eHQuZ2V0UnVudGltZUVuZHBvaW50SW5mbygpOwotICAgICAgICBPYmplY3Qgc2VydmFudCA9IGVuZHBvaW50SW5mby5nZXRJbXBsZW1lbnRvcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHJldCA9IG1ldGhvZC5pbnZva2Uoc2VydmFudCwgb2EpOwotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2VUeXBlKE1lc3NhZ2VTdHJ1Y3QuTk9STUFMX1JFU1BPTlNFKTsKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKHJldCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzZXRSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2VJbmZvLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzZXRSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2VJbmZvLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghKGNhdXNlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgJiYgY2F1c2UgaW5zdGFuY2VvZiBFeGNlcHRpb24gKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2UoY2F1c2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZUluZm8sIGNhdXNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZUluZm8sIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIFRocm93YWJsZSBlKSB7Ci0gICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LlVOQ0hFQ0tFRF9FWENFUFRJT05fUkVTUE9OU0UpOwotICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9SdW50aW1lQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1J1bnRpbWVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNDJmYzkuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1J1bnRpbWVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUnVudGltZU1vZGVsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNvbnRleHQ7Ci0KLQotCi0KLS8qKgotICogJGF1dGhvcjogV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUNvbnRleHQgewotCi0gICAgcHVibGljIFJ1bnRpbWVDb250ZXh0KFJ1bnRpbWVNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUnVudGltZU1vZGVsIGdldE1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGluZm8gYWJvdXQgZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgUnVudGltZUVuZHBvaW50SW5mbyBnZXRSdW50aW1lRW5kcG9pbnRJbmZvKCkgewotICAgICAgICByZXR1cm4gZW5kcG9pbnRJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgaW5mbyBhYm91dCBlbmRwb2ludAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVFbmRwb2ludEluZm8oUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8pIHsKLSAgICAgICAgdGhpcy5lbmRwb2ludEluZm8gPSBlbmRwb2ludEluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gbWkKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlcmF0aW9uIG5hbWVkIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kIGdldERpc3BhdGNoTWV0aG9kKFFOYW1lIG5hbWUsIE1lc3NhZ2VJbmZvIG1pKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwYXRjaE1ldGhvZChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGVyYXRpb24gbmFtZWQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2QgZ2V0RGlzcGF0Y2hNZXRob2QoUU5hbWUgbmFtZSl7Ci0gICAgICAgIHJldHVybiBtb2RlbC5nZXREaXNwYXRjaE1ldGhvZChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgKiBAcGFyYW0gbWkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2RBbmRNRVAoUU5hbWUgcW5hbWUsIE1lc3NhZ2VJbmZvIG1pKSB7Ci0gICAgICAgIGlmIChtb2RlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtaS5zZXRNZXRob2QobW9kZWwuZ2V0RGlzcGF0Y2hNZXRob2QocW5hbWUpKTsKLQotICAgICAgICAgICAgLy8gaWYgbnVsbCwgZGVmYXVsdCBNRVAgaXMgb2sKLSAgICAgICAgICAgIGlmIChxbmFtZSAhPSBudWxsICYmIG1vZGVsLmdldEphdmFNZXRob2QocW5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtaS5zZXRNRVAobW9kZWwuZ2V0SmF2YU1ldGhvZChxbmFtZSkuZ2V0TUVQKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVyIEluZm8gYXNzb2NpYXRlZCB3aXRoIG9wZXJhdGlvbiBuYW1lZCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREZWNvZGVySW5mbyhRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbC5nZXREZWNvZGVySW5mbyhuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnJpZGdlQ29udGV4dCBnZXRCcmlkZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gKG1vZGVsICE9IG51bGwpP21vZGVsLmdldEJyaWRnZUNvbnRleHQoKTpudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBIYW5kbGVyQ29udGV4dCBnZXRIYW5kbGVyQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDb250ZXh0KEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNvbnRleHQgPSBoYW5kbGVyQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJ1bnRpbWVNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIEhhbmRsZXJDb250ZXh0IGhhbmRsZXJDb250ZXh0OwotICAgIHByaXZhdGUgUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm87Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvUnVudGltZUVuZHBvaW50SW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1J1bnRpbWVFbmRwb2ludEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5ZWE2OS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvUnVudGltZUVuZHBvaW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ2ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnByb3ZpZGVyLlByb3ZpZGVyTW9kZWw7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OwotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmJpbmRpbmcuQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5SdW50aW1lTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWxlci5SdW50aW1lTW9kZWxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuRG9jSW5mby5ET0NfVFlQRTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5CaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSGFuZGxlckFubm90YXRpb25JbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuSGFuZGxlckFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuUnVudGltZVdTRExQYXJzZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuU2VydmljZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5XU0RMRG9jdW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuV1NETEdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0KLQotLyoqCi0gKiBtb2RlbGVkIGFmdGVyIHRoZSBqYXZheC54bWwud3MuRW5kcG9pbnQgY2xhc3MgaW4gQVBJLgotICogQ29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBCaW5kaW5nLCBoYW5kbGVyIGNoYWluLCBJbXBsZW1lbnRvciBvYmplY3QsCi0gKiBXU0RMICYgU2NoZW1hIE1ldGFkYXRhCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVFbmRwb2ludEluZm8gaW1wbGVtZW50cyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5SdW50aW1lRW5kcG9pbnRJbmZvIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxGaWxlTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVwbG95ZWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsUGF0dGVybjsKLSAgICBwcml2YXRlIExpc3Q8U291cmNlPiBtZXRhZGF0YTsKLSAgICBwcml2YXRlIEJpbmRpbmcgYmluZGluZzsKLSAgICBwcml2YXRlIFJ1bnRpbWVNb2RlbCBydW50aW1lTW9kZWw7Ci0gICAgcHJpdmF0ZSBPYmplY3QgaW1wbGVtZW50b3I7Ci0gICAgcHJpdmF0ZSBDbGFzcyBpbXBsZW1lbnRvckNsYXNzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRG9jSW5mbz4gZG9jczsgICAgICAvLyAvV0VCLUlORi93c2RsL3h4eC53c2RsIC0+IERvY0luZm8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIERvY0luZm8+IHF1ZXJ5MkRvYzsgICAgIC8vICh3c2RsPWEpIC0tPiBEb2NJbmZvCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGJlZ2luU2VydmljZURvbmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuZFNlcnZpY2VEb25lOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmplY3RlZENvbnRleHQ7Ci0gICAgcHJpdmF0ZSBVUkwgd3NkbFVybDsKLSAgICBwcml2YXRlIEVudGl0eVJlc29sdmVyIHdzZGxSZXNvbHZlcjsKLSAgICBwcml2YXRlIFFOYW1lIHBvcnRUeXBlTmFtZTsKLSAgICBwcml2YXRlIEludGVnZXIgbXRvbVRocmVzaG9sZDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigKLSAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db25zdGFudHMuTG9nZ2luZ0RvbWFpbiArICIuc2VydmVyLmVuZHBvaW50Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0KLSAgICAgICAgbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5zZXJ2ZXIiKTsKLSAgICBwcml2YXRlIFdlYlNlcnZpY2Ugd3M7Ci0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlUHJvdmlkZXIgd3NQcm92aWRlcjsKLSAgICBwcml2YXRlIFByb3ZpZGVyTW9kZWwgcHJvdmlkZXJNb2RlbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgcykgewotICAgICAgICBuYW1lID0gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMRmlsZU5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgd3NkbEZpbGVOYW1lID0gczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgdGhlIFVSTCBmb3IgcHJpbWFyeSBXU0RMLCBhbmQgYW4gRW50aXR5UmVzb2x2ZXIgdG8gcmVzb2x2ZSBhbGwKLSAgICAgKiBpbXBvcnRzL3JlZmVyZW5jZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsSW5mbyhVUkwgd3NkbFVybCwgRW50aXR5UmVzb2x2ZXIgd3NkbFJlc29sdmVyKSB7Ci0gICAgICAgIHRoaXMud3NkbFVybCA9IHdzZGxVcmw7Ci0gICAgICAgIHRoaXMud3NkbFJlc29sdmVyID0gd3NkbFJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRXc2RsUmVzb2x2ZXIoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRXc2RsVXJsKCkgewotICAgICAgICByZXR1cm4gd3NkbFVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlcGxveWVkKCkgewotICAgICAgICByZXR1cm4gZGVwbG95ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUHJvdmlkZXJNb2RlbCgpIHsKLSAgICAgICAgcHJvdmlkZXJNb2RlbCA9IG5ldyBQcm92aWRlck1vZGVsKGltcGxlbWVudG9yQ2xhc3MsIGJpbmRpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNFSU1vZGVsKCkgewotICAgICAgICAvLyBDcmVhdGUgcnVudGltZSBtb2RlbCBmb3Igbm9uIFByb3ZpZGVyIGVuZHBvaW50cwotCi0gICAgICAgIC8vIHdzZGxVUkwgd2lsbCBiZSBudWxsLCBtZWFucyB3ZSB3aWxsIGdlbmVyYXRlIFdTREwuIEhlbmNlIG5vIG5lZWQgdG8gYXBwbHkKLSAgICAgICAgLy8gYmluZGluZ3Mgb3IgbmVlZCB0byBsb29rIGluIHRoZSBXU0RMCi0gICAgICAgIGlmKHdzZGxVcmwgPT0gbnVsbCl7Ci0gICAgICAgICAgICBSdW50aW1lTW9kZWxlciByYXAgPSBuZXcgUnVudGltZU1vZGVsZXIoZ2V0SW1wbGVtZW50b3JDbGFzcygpLAotICAgICAgICAgICAgICAgIGdldEltcGxlbWVudG9yKCksIGdldFNlcnZpY2VOYW1lKCksICgoQmluZGluZ0ltcGwpYmluZGluZykuZ2V0QmluZGluZ0lkKCkpOwotICAgICAgICAgICAgaWYgKGdldFBvcnROYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJhcC5zZXRQb3J0TmFtZShnZXRQb3J0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bnRpbWVNb2RlbCA9IHJhcC5idWlsZFJ1bnRpbWVNb2RlbCgpOwotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFdTRExEb2N1bWVudCB3c2RsRG9jID0gUnVudGltZVdTRExQYXJzZXIucGFyc2UoZ2V0V3NkbFVybCgpLCBnZXRXc2RsUmVzb2x2ZXIoKSk7Ci0gICAgICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXIuQmluZGluZyB3c2RsQmluZGluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYoc2VydmljZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBSdW50aW1lTW9kZWxlci5nZXRTZXJ2aWNlTmFtZShnZXRJbXBsZW1lbnRvckNsYXNzKCkpOwotICAgICAgICAgICAgICAgIGlmKGdldFBvcnROYW1lKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxCaW5kaW5nID0gd3NkbERvYy5nZXRCaW5kaW5nKGdldFNlcnZpY2VOYW1lKCksIGdldFBvcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZih3c2RsQmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJydW50aW1lLnBhcnNlci53c2RsLmluY29ycmVjdHNlcnZpY2Vwb3J0IiwgbmV3IE9iamVjdFtde3NlcnZpY2VOYW1lLCBwb3J0TmFtZSwgZ2V0V3NkbFVybCgpfSk7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHdzZGxEb2MuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHNlcnZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigicnVudGltZS5wYXJzZXIud3NkbC5ub3NlcnZpY2UiLCBuZXcgT2JqZWN0W117c2VydmljZU5hbWUsIGdldFdzZGxVcmwoKX0pOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSAoKEJpbmRpbmdJbXBsKWJpbmRpbmcpLmdldEJpbmRpbmdJZCgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0PGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLkJpbmRpbmc+IGJpbmRpbmdzID0gd3NkbERvYy5nZXRCaW5kaW5ncyhzZXJ2aWNlLCBiaW5kaW5nSWQpOwotICAgICAgICAgICAgICAgICAgICBpZihiaW5kaW5ncy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigicnVudGltZS5wYXJzZXIud3NkbC5ub2JpbmRpbmciLCBuZXcgT2JqZWN0W117YmluZGluZ0lkLCBzZXJ2aWNlTmFtZSwgZ2V0V3NkbFVybCgpfSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoYmluZGluZ3Muc2l6ZSgpID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigicnVudGltZS5wYXJzZXIud3NkbC5tdWx0aXBsZWJpbmRpbmciLCBuZXcgT2JqZWN0W117YmluZGluZ0lkLCBzZXJ2aWNlTmFtZSwgZ2V0V3NkbFVybCgpfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vbm93IHdlIGdvdCB0aGUgQmluZGluZyBzbyBsZXRzIGJ1aWxkIHRoZSBtb2RlbAotICAgICAgICAgICAgICAgIFJ1bnRpbWVNb2RlbGVyIHJhcCA9IG5ldyBSdW50aW1lTW9kZWxlcihnZXRJbXBsZW1lbnRvckNsYXNzKCksIGdldEltcGxlbWVudG9yKCksIGdldFNlcnZpY2VOYW1lKCksIHdzZGxCaW5kaW5nKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0UG9ydE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhcC5zZXRQb3J0TmFtZShnZXRQb3J0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcnVudGltZU1vZGVsID0gcmFwLmJ1aWxkUnVudGltZU1vZGVsKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJydW50aW1lLnBhcnNlci53c2RsIiwgZ2V0V3NkbFVybCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInJ1bnRpbWUuc2F4cGFyc2VyLmV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZS5nZXRNZXNzYWdlKCksIGUuZ2V0TG9jYXRpb24oKX0pOwotICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInJ1bnRpbWUucGFyc2VyLndzZGwiLCBnZXRXc2RsVXJsKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvdmlkZXJFbmRwb2ludCgpIHsKLSAgICAgICAgQW5ub3RhdGlvbiBhbm4gPSBnZXRJbXBsZW1lbnRvckNsYXNzKCkuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIHJldHVybiAoYW5uICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgc2VydmljZU5hbWUgaXMgbm90IGFscmVhZHkgc2V0IHZpYSBERCBvciBwcm9ncmFtbWF0aWNhbGx5LCBpdCB1c2VzCi0gICAgICogYW5ub3RhdGlvbnMgb24gaW1wbGVtZW50b3JDbGFzcyB0byBzZXQgU2VydmljZU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9TZXJ2aWNlTmFtZVByb2Nlc3NpbmcoKSB7Ci0gICAgICAgIGlmIChnZXRTZXJ2aWNlTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChpc1Byb3ZpZGVyRW5kcG9pbnQoKSkgewotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlciB3c1Byb3ZpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgKFdlYlNlcnZpY2VQcm92aWRlcilnZXRJbXBsZW1lbnRvckNsYXNzKCkuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRucyA9IHdzUHJvdmlkZXIudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gd3NQcm92aWRlci5zZXJ2aWNlTmFtZSgpOwotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBRTmFtZSgiIiwgIiIpLCBpZiB0aGUgYWJvdmUgdmFsdWVzIGFyZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgc2V0U2VydmljZU5hbWUobmV3IFFOYW1lKHRucywgbG9jYWwpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VydmljZU5hbWUoUnVudGltZU1vZGVsZXIuZ2V0U2VydmljZU5hbWUoZ2V0SW1wbGVtZW50b3JDbGFzcygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHBvcnROYW1lIGlzIG5vdCBhbHJlYWR5IHNldCB2aWEgREQgb3IgcHJvZ3JhbW1hdGljYWxseSwgaXQgdXNlcwotICAgICAqIGFubm90YXRpb25zIG9uIGltcGxlbWVudG9yQ2xhc3MgdG8gc2V0IFBvcnROYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvUG9ydE5hbWVQcm9jZXNzaW5nKCkgewotICAgICAgICBpZiAoZ2V0UG9ydE5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXNQcm92aWRlckVuZHBvaW50KCkpIHsKLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUHJvdmlkZXIgd3NQcm92aWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIChXZWJTZXJ2aWNlUHJvdmlkZXIpZ2V0SW1wbGVtZW50b3JDbGFzcygpLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0bnMgPSB3c1Byb3ZpZGVyLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IHdzUHJvdmlkZXIucG9ydE5hbWUoKTsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgUU5hbWUoIiIsICIiKSwgaWYgdGhlIGFib3ZlIHZhbHVlcyBhcmUgZGVmYXVsdAotICAgICAgICAgICAgICAgIHNldFBvcnROYW1lKG5ldyBRTmFtZSh0bnMsIGxvY2FsKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0UG9ydE5hbWUoUnVudGltZU1vZGVsZXIuZ2V0UG9ydE5hbWUoZ2V0SW1wbGVtZW50b3JDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljZU5TID0gZ2V0U2VydmljZU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TlMgPSBnZXRQb3J0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKCFzZXJ2aWNlTlMuZXF1YWxzKHBvcnROUykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oIndyb25nLnRucy5mb3IucG9ydCIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHBvcnROUywgc2VydmljZU5TIH0pOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldHMgUG9ydFR5cGUgUU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1BvcnRUeXBlTmFtZVByb2Nlc3NpbmcoKSB7Ci0gICAgICAgIGlmIChnZXRQb3J0VHlwZU5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzUHJvdmlkZXJFbmRwb2ludCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0UG9ydFR5cGVOYW1lKFJ1bnRpbWVNb2RlbGVyLmdldFBvcnRUeXBlTmFtZShnZXRJbXBsZW1lbnRvckNsYXNzKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogY3JlYXRlcyBhIFJ1bnRpbWVNb2RlbCB1c2luZyBAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbGVyLlJ1bnRpbWVNb2RlbGVyLgotICAgICAqIFRoZSBtb2RlbGVyIGNyZWF0ZXMgdGhlIG1vZGVsIGJ5IHJlYWRpbmcgYW5ub3RhdGlvbnMgb24gSW1wbGVtZW50b3JDbGFzc29iamVjdC4KLSAgICAgKiBSdW50aW1lTW9kZWwgaXMgcmVhZCBvbmx5IGFuZCBpcyBhY2Nlc3NlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgYWZ0ZXJ3YXJkcy4KLQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGlmIChpbXBsZW1lbnRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oIm51bGwuaW1wbGVtZW50b3IiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW1wbGVtZW50b3JDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRJbXBsZW1lbnRvckNsYXNzKGdldEltcGxlbWVudG9yKCkuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB2ZXJpZnkgaWYgaW1wbGVtZW50b3IgY2xhc3MgaGFzIEBXZWJTZXJ2aWNlIG9yIEBXZWJTZXJ2aWNlUHJvdmlkZXIKLSAgICAgICAgdmVyaWZ5SW1wbGVtZW50b3JDbGFzcygpOwotCi0gICAgICAgIC8vIFNlcnZpY2VOYW1lIHByb2Nlc3NpbmcKLSAgICAgICAgZG9TZXJ2aWNlTmFtZVByb2Nlc3NpbmcoKTsKLQotICAgICAgICAvLyBQb3J0IE5hbWUgcHJvY2Vzc2luZwotICAgICAgICBkb1BvcnROYW1lUHJvY2Vzc2luZygpOwotCi0gICAgICAgIC8vIFBvcnRUeXBlIE5hbWUgcHJvY2Vzc2luZwotICAgICAgICAvL2RvUG9ydFR5cGVOYW1lUHJvY2Vzc2luZygpOwotCi0gICAgICAgIC8vIHNldHRpbmcgYSBkZWZhdWx0IGJpbmRpbmcKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9IFJ1bnRpbWVNb2RlbGVyLmdldEJpbmRpbmdJZChnZXRJbXBsZW1lbnRvckNsYXNzKCkpOwotICAgICAgICAgICAgc2V0QmluZGluZyhuZXcgU09BUEJpbmRpbmdJbXBsKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzUHJvdmlkZXJFbmRwb2ludCgpKSB7Ci0gICAgICAgICAgICBjaGVja1Byb3ZpZGVyKCk7Ci0gICAgICAgICAgICBjcmVhdGVQcm92aWRlck1vZGVsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgcnVudGltZSBtb2RlbCBmb3Igbm9uIFByb3ZpZGVyIGVuZHBvaW50cwotICAgICAgICAgICAgY3JlYXRlU0VJTW9kZWwoKTsKLSAgICAgICAgICAgIGlmIChnZXRTZXJ2aWNlTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlTmFtZShydW50aW1lTW9kZWwuZ2V0U2VydmljZVFOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGdldFBvcnROYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFBvcnROYW1lKHJ1bnRpbWVNb2RlbC5nZXRQb3J0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vc2V0IG10b20gcHJvY2Vzc2luZwotICAgICAgICAgICAgaWYoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nSW1wbCl7Ci0gICAgICAgICAgICAgICAgcnVudGltZU1vZGVsLmVuYWJsZU10b20oKChTT0FQQmluZGluZyliaW5kaW5nKS5pc01UT01FbmFibGVkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFByb2Nlc3MgQEhhbmRsZXJDaGFpbiwgaWYgaGFuZGxlci1jaGFpbiBpcyBub3Qgc2V0IHZpYSBEZXBsb3ltZW50Ci0gICAgICAgIC8vIERlc2NyaXB0b3IKLSAgICAgICAgaWYgKGdldEJpbmRpbmcoKS5nZXRIYW5kbGVyQ2hhaW4oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9ICgoQmluZGluZ0ltcGwpIGJpbmRpbmcpLmdldEFjdHVhbEJpbmRpbmdJZCgpOwotICAgICAgICAgICAgICAgIEhhbmRsZXJBbm5vdGF0aW9uSW5mbyBjaGFpbkluZm8gPQotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQW5ub3RhdGlvblByb2Nlc3Nvci5idWlsZEhhbmRsZXJJbmZvKAotICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRvckNsYXNzLCBnZXRTZXJ2aWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBnZXRQb3J0TmFtZSgpLCBiaW5kaW5nSWQpOwotICAgICAgICAgICAgICAgIGlmIChjaGFpbkluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBnZXRCaW5kaW5nKCkuc2V0SGFuZGxlckNoYWluKGNoYWluSW5mby5nZXRIYW5kbGVycygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldEJpbmRpbmcoKSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFNPQVBCaW5kaW5nKSBnZXRCaW5kaW5nKCkpLnNldFJvbGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluSW5mby5nZXRSb2xlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXBsb3llZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbmVlZFdTRExHZW5lcmF0aW9uKCkgewotICAgICAgICBpZiAoaXNQcm92aWRlckVuZHBvaW50KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGdldFdzZGxVcmwoKSA9PSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdlbmVyYXRlcyB0aGUgV1NETCBhbmQgWE1MIFNjaGVtYSBmb3IgdGhlIGVuZHBvaW50IGlmIG5lY2Vzc2FyeQotICAgICAqIEl0IGdlbmVyYXRlcyBXU0RMIG9ubHkgZm9yIFNPQVAxLjEsIGFuZCBmb3IgWFNPQVAxLjIgYmluZGluZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdTREwoKSB7Ci0gICAgICAgIEJpbmRpbmdJbXBsIGJpbmRpbmdJbXBsID0gKEJpbmRpbmdJbXBsKWdldEJpbmRpbmcoKTsKLSAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9IGJpbmRpbmdJbXBsLmdldEFjdHVhbEJpbmRpbmdJZCgpOwotICAgICAgICBpZiAoIWJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKSAmJgotICAgICAgICAgICAgIWJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpICYmCi0gICAgICAgICAgICAhYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZ0ltcGwuWF9TT0FQMTJIVFRQX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oImNhbi5ub3QuZ2VuZXJhdGUud3NkbCIsIGJpbmRpbmdJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZ0ltcGwuWF9TT0FQMTJIVFRQX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gbG9jYWxpemVyLmxvY2FsaXplKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImdlbmVyYXRlLm5vbi5zdGFuZGFyZC53c2RsIikpOwotICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobXNnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdlbmVyYXRlIFdTREwgYW5kIHNjaGVtYSBkb2N1bWVudHMgdXNpbmcgcnVudGltZSBtb2RlbAotICAgICAgICBpZiAoZ2V0RG9jTWV0YWRhdGEoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRNZXRhZGF0YShuZXcgSGFzaE1hcDxTdHJpbmcsIERvY0luZm8+KCkpOwotICAgICAgICB9Ci0gICAgICAgIFdTRExHZW5SZXNvbHZlciB3c2RsUmVzb2x2ZXIgPSBuZXcgV1NETEdlblJlc29sdmVyKGdldERvY01ldGFkYXRhKCkpOwotICAgICAgICBXU0RMR2VuZXJhdG9yIHdzZGxHZW4gPSBuZXcgV1NETEdlbmVyYXRvcihydW50aW1lTW9kZWwsIHdzZGxSZXNvbHZlciwKLSAgICAgICAgICAgICAgICAoKEJpbmRpbmdJbXBsKWJpbmRpbmcpLmdldEJpbmRpbmdJZCgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdzZGxHZW4uZG9HZW5lcmF0aW9uKCk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigic2VydmVyLnJ0LmVyciIsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0V1NETEZpbGVOYW1lKHdzZGxSZXNvbHZlci5nZXRXU0RMRmlsZSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3ZpZGVyIGVuZHBvaW50IHZhbGlkYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQcm92aWRlcigpIHsKLSAgICAgICAgaWYgKCFQcm92aWRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGdldEltcGxlbWVudG9yQ2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigibm90LmltcGxlbWVudC5wcm92aWRlciIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtnZXRJbXBsZW1lbnRvckNsYXNzKCl9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFFOYW1lIG4pIHsKLSAgICAgICAgcG9ydE5hbWUgPSBuOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0VHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydFR5cGVOYW1lKFFOYW1lIG4pIHsKLSAgICAgICAgcG9ydFR5cGVOYW1lID0gbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShRTmFtZSBuKSB7Ci0gICAgICAgIHNlcnZpY2VOYW1lID0gbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybFBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiB1cmxQYXR0ZXJuOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsUGF0dGVybldpdGhvdXRTdGFyKCkgewotICAgICAgICBpZiAodXJsUGF0dGVybi5lbmRzV2l0aCgiLyoiKSkgewotICAgICAgICAgICAgcmV0dXJuIHVybFBhdHRlcm4uc3Vic3RyaW5nKDAsIHVybFBhdHRlcm4ubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB1cmxQYXR0ZXJuOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmxQYXR0ZXJuKFN0cmluZyBzKSB7Ci0gICAgICAgIHVybFBhdHRlcm4gPSBzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKXsKLSAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8U291cmNlPiBnZXRNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGFkYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKGphdmEudXRpbC5MaXN0PFNvdXJjZT4gbWV0YWRhdGEpIHsKLQotICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIFJ1bnRpbWVNb2RlbCBnZXRSdW50aW1lTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBydW50aW1lTW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbXBsZW1lbnRvcigpIHsKLSAgICAgICAgcmV0dXJuIGltcGxlbWVudG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudG9yKE9iamVjdCBpbXBsZW1lbnRvcikgewotICAgICAgICB0aGlzLmltcGxlbWVudG9yID0gaW1wbGVtZW50b3I7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldEltcGxlbWVudG9yQ2xhc3MoKSB7Ci0gICAgICAgIGlmIChpbXBsZW1lbnRvckNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIGltcGxlbWVudG9yQ2xhc3MgPSBpbXBsZW1lbnRvci5nZXRDbGFzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbXBsZW1lbnRvckNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudG9yQ2xhc3MoQ2xhc3MgaW1wbGVtZW50b3JDbGFzcykgewotICAgICAgICB0aGlzLmltcGxlbWVudG9yQ2xhc3MgPSBpbXBsZW1lbnRvckNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKE1hcDxTdHJpbmcsIERvY0luZm8+IGRvY3MpIHsKLSAgICAgICAgdGhpcy5kb2NzID0gZG9jczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUXVlcnkyRG9jSW5mbygpIHsKLSAgICAgICAgLy8gdXBkYXRlICh3c2RsLCB4c2Q9MSApLS0+RG9jSW5mbyBtYXAKLSAgICAgICAgaWYgKHF1ZXJ5MkRvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBxdWVyeTJEb2MuY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHF1ZXJ5MkRvYyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRG9jSW5mbz4oKTsKLSAgICAgICAgfQotICAgICAgICBTZXQ8TWFwLkVudHJ5PFN0cmluZywgRG9jSW5mbz4+IGVudHJpZXMgPSBkb2NzLmVudHJ5U2V0KCk7Ci0gICAgICAgIGZvcihNYXAuRW50cnk8U3RyaW5nLCBEb2NJbmZvPiBlbnRyeSA6IGVudHJpZXMpIHsKLSAgICAgICAgICAgIERvY0luZm8gZG9jSW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAvLyBDaGVjayB0byBoYW5kbGUgP1dTREwKLSAgICAgICAgICAgIGlmIChkb2NJbmZvLmdldFF1ZXJ5U3RyaW5nKCkuZXF1YWxzKCJ3c2RsIikpIHsKLSAgICAgICAgICAgICAgICBxdWVyeTJEb2MucHV0KCJXU0RMIiwgZG9jSW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBxdWVyeTJEb2MucHV0KGRvY0luZm8uZ2V0UXVlcnlTdHJpbmcoKSwgZG9jSW5mbyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgZ2V0V2ViU2VydmljZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB3c0NvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZUNvbnRleHQoV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMud3NDb250ZXh0ID0gd3NDb250ZXh0OwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBrZXkgLSAvV0VCLUlORi93c2RsL3h4eC53c2RsCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIERvY0luZm8+IGdldERvY01ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gZG9jczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHBhdGggLSAvV0VCLUlORi93c2RsL3h4eC53c2RsCi0gICAgICogcmV0dXJuIC0geHNkPWEgfCB3c2RsIHwgd3NkbD1iIGV0YwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoVVJMIHVybCkgewotICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBEb2NJbmZvPj4gZW50cmllcyA9IGdldERvY01ldGFkYXRhKCkuZW50cnlTZXQoKTsKLSAgICAgICAgZm9yKEVudHJ5PFN0cmluZywgRG9jSW5mbz4gZW50cnkgOiBlbnRyaWVzKSB7Ci0gICAgICAgICAgICAvLyBVUkxzIGFyZSBub3QgbWF0Y2hpbmcuIHNlcnZsZXQgY29udGFpbmVyIGJ1ZyA/Ci0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKS5nZXRVcmwoKS50b1N0cmluZygpLmVxdWFscyh1cmwudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKS5nZXRRdWVyeVN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcXVlcnlTdHJpbmcgLSB4c2Q9YSB8IHdzZGwgfCB3c2RsPWIgZXRjCi0gICAgICogcmV0dXJuIC0gL1dFQi1JTkYvd3NkbC94eHgud3NkbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aChTdHJpbmcgcXVlcnlTdHJpbmcpIHsKLSAgICAgICAgaWYgKHF1ZXJ5MkRvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEb2NJbmZvIGRvY0luZm8gPSBxdWVyeTJEb2MuZ2V0KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybiAoZG9jSW5mbyA9PSBudWxsKSA/IG51bGwgOiBkb2NJbmZvLmdldFVybCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbmplY3RzIHRoZSBXZWJTZXJ2aWNlQ29udGV4dC4gQ2FsbGVkIGZyb20gU2VydmxldC5pbml0KCksIG9yCi0gICAgICogRW5kcG9pbnQucHVibGlzaCgpLiBVc2VkIHN5bmNocm9uaXplZCBiZWNhdXNlIG11bHRpcGxlIHNlcnZsZXQKLSAgICAgKiBpbnN0YW5jZXMgbWF5IGNhbGwgdGhpcyBpbiB0aGVpciBpbml0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5qZWN0Q29udGV4dCgpCi0gICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgICAgICBpZiAoaW5qZWN0ZWRDb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvRmllbGRzSW5qZWN0aW9uKCk7Ci0gICAgICAgICAgICBkb01ldGhvZHNJbmplY3Rpb24oKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGluamVjdGVkQ29udGV4dCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9GaWVsZHNJbmplY3Rpb24oKSB7Ci0gICAgICAgIENsYXNzIGMgPSBnZXRJbXBsZW1lbnRvckNsYXNzKCk7Ci0gICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXREZWNsYXJlZEZpZWxkcygpOwotICAgICAgICBmb3IoZmluYWwgRmllbGQgZmllbGQ6IGZpZWxkcykgewotICAgICAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWVsZC5nZXRBbm5vdGF0aW9uKFJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgcmVzb3VyY2VUeXBlID0gcmVzb3VyY2UudHlwZSgpOwotICAgICAgICAgICAgICAgIENsYXNzIGZpZWxkVHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VUeXBlLmVxdWFscyhPYmplY3QuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZFR5cGUuZXF1YWxzKGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdEZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2VUeXBlLmVxdWFscyhqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZFR5cGUuaXNBc3NpZ25hYmxlRnJvbShqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oIndyb25nLmZpZWxkLnR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9NZXRob2RzSW5qZWN0aW9uKCkgewotICAgICAgICBDbGFzcyBjID0gZ2V0SW1wbGVtZW50b3JDbGFzcygpOwotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gYy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLSAgICAgICAgZm9yKGZpbmFsIE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKFJlc291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtVHlwZXMubGVuZ3RoICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJ3cm9uZy5uby5wYXJhbWV0ZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDbGFzcyByZXNvdXJjZVR5cGUgPSByZXNvdXJjZS50eXBlKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgYXJnVHlwZSA9IHBhcmFtVHlwZXNbMF07Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoT2JqZWN0LmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAmJiBhcmdUeXBlLmVxdWFscyhqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludm9rZU1ldGhvZChtZXRob2QsIG5ldyBPYmplY3RbXSB7IHdzQ29udGV4dCB9KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZS5pc0Fzc2lnbmFibGVGcm9tKGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZU1ldGhvZChtZXRob2QsIG5ldyBPYmplY3RbXSB7IHdzQ29udGV4dCB9KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigid3JvbmcucGFyYW1ldGVyLnR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmplY3RzIGEgcmVzb3VyY2UgaW50byBhIEZpZWxkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluamVjdEZpZWxkKGZpbmFsIEZpZWxkIGZpZWxkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXQoaW1wbGVtZW50b3IsIHdzQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJzZXJ2ZXIucnQuZXJyIixlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBpbnZva2UgYSBNZXRob2QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW52b2tlTWV0aG9kKGZpbmFsIE1ldGhvZCBtZXRob2QsIGZpbmFsIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbWV0aG9kLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKGltcGxlbWVudG9yLCBhcmdzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNlcnZlci5ydC5lcnIiLGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDYWxscyB0aGUgZmlyc3QgbWV0aG9kIGluIHRoZSBpbXBsZW1lbnRvciBvYmplY3QgdGhhdCBoYXMgQEJlZ2luU2VydmljZQotICAgICAqIGFubm90YXRpb24uIFNlcnZsZXQuaW5pdCgpLCBvciBFbmRwb2ludC5wdWJsaXNoKCkgbWF5IGNhbGwgdGhpcy4gVXNlZAotICAgICAqIHN5bmNocm9uaXplZCBiZWNhdXNlIG11bHRpcGxlIHNlcnZsZXQgaW5zdGFuY2VzIG1heSBjYWxsIHRoaXMgaW4gdGhlaXIKLSAgICAgKiBpbml0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYmVnaW5TZXJ2aWNlKCkgewotICAgICAgICBpZiAoYmVnaW5TZXJ2aWNlRG9uZSkgewotICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBjYWxsZWQgZm9yIHRoaXMgZW5kcG9pbnQgb2JqZWN0Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludm9rZU9uY2VNZXRob2QoUG9zdENvbnN0cnVjdC5jbGFzcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBiZWdpblNlcnZpY2VEb25lID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2FsbHMgdGhlIGZpcnN0IG1ldGhvZCBpbiB0aGUgaW1wbGVtZW50b3Igb2JqZWN0IHRoYXQgaGFzIEBFbmRTZXJ2aWNlCi0gICAgICogYW5ub3RhdGlvbi4gU2VydmxldC5kZXN0b3J5KCksIG9yIEVuZHBvaW50LnN0b3AoKSBtYXkgY2FsbCB0aGlzLiBVc2VkCi0gICAgICogc3luY2hyb25pemVkIGJlY2F1c2UgbXVsdGlwbGUgc2VydmxldCBpbnN0YW5jZXMgbWF5IGNhbGwgdGhpcyBpbiB0aGVpcgotICAgICAqIGRlc3Ryb3koKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbmRTZXJ2aWNlKCkgewotICAgICAgICBpZiAoZW5kU2VydmljZURvbmUpIHsKLSAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgY2FsbGVkIGZvciB0aGlzIGVuZHBvaW50IG9iamVjdAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnZva2VPbmNlTWV0aG9kKFByZURlc3Ryb3kuY2xhc3MpOwotICAgICAgICAgICAgZGVzdHJveSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZW5kU2VydmljZURvbmUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGludm9rZSBtZXRob2RzIHdoaWNoIGRvbid0IHRha2UgYW55IGFyZ3VtZW50cwotICAgICAqIEFsc28gdGhlIGFublR5cGUgYW5ub3RhdGlvbiBzaG91bGQgYmUgc2V0IG9ubHkgb24gb25lIG1ldGhvZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnZva2VPbmNlTWV0aG9kKENsYXNzIGFublR5cGUpIHsKLSAgICAgICAgQ2xhc3MgYyA9IGdldEltcGxlbWVudG9yQ2xhc3MoKTsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGMuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgIGJvb2xlYW4gb25jZSA9IGZhbHNlOwotICAgICAgICBmb3IoZmluYWwgTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0QW5ub3RhdGlvbihhbm5UeXBlKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9uY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRXJyOiBNdWx0aXBsZSBtZXRob2RzIGhhdmUgYW5uVHlwZSBhbm5vdGF0aW9uCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigiYW5ub3RhdGlvbi5vbmx5Lm9uY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgYW5uVHlwZSB9ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oIm5vdC56ZXJvLnBhcmFtZXRlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludm9rZU1ldGhvZChtZXRob2QsIG5ldyBPYmplY3RbXXsgfSk7Ci0gICAgICAgICAgICAgICAgb25jZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250YWluZXIgY2FsbHMgZW5kU2VydmljZSgpLiBVc2VkIGZvciBhbnkKLSAgICAgKiBjbGVhbnVwLiBDdXJyZW50bHkgY2FsbHMgQFByZURlc3Ryb3kgbWV0aG9kIG9uIGV4aXN0aW5nCi0gICAgICogaGFuZGxlcnMuIFRoaXMgc2hvdWxkIG5vdCB0aHJvdyBhbiBleGNlcHRpb24sIGJ1dCB3ZSBpZ25vcmUKLSAgICAgKiBpdCBpZiBpdCBoYXBwZW5zIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGhhbmRsZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZygpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChIYW5kbGVyIGhhbmRsZXIgOiBoYW5kbGVycykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldEFubm90YXRpb24oUHJlRGVzdHJveS5jbGFzcykgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKGhhbmRsZXIsIG5ldyBPYmplY3QgWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoImV4Y2VwdGlvbiBpZ25vcmVkIGZyb20gaGFuZGxlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkBQcmVEZXN0cm95IG1ldGhvZDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiByZXR1cm5zIG51bGwgaWYgbm8gbW90bS10aHJlc2hvbGQtdmFsdWUgaXMgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yCi0gICAgICovCi0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRNdG9tVGhyZXNob2xkKCkgewotICAgICAgICByZXR1cm4gbXRvbVRocmVzaG9sZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNdG9tVGhyZXNob2xkKGludCBtdG9tVGhyZXNob2xkKSB7Ci0gICAgICAgIHRoaXMubXRvbVRocmVzaG9sZCA9IG10b21UaHJlc2hvbGQ7Ci0gICAgfQotCi0gICAgLy8gRmlsbCBEb2NJbmZvIHdpdGggZG9jdW1lbnQgaW5mbyA6IFdTREwgb3IgU2NoZW1hLCB0YXJnZXROUyBldGMuCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGxEb2NJbmZvKFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvKQotICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBNYXA8U3RyaW5nLCBEb2NJbmZvPiBtZXRhZGF0YSA9IGVuZHBvaW50SW5mby5nZXREb2NNZXRhZGF0YSgpOwotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yKEVudHJ5PFN0cmluZywgRG9jSW5mbz4gZW50cnk6IG1ldGFkYXRhLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBSdW50aW1lV1NETFBhcnNlci5maWxsRG9jSW5mbyhlbnRyeS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEluZm8uZ2V0U2VydmljZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRJbmZvLmdldFBvcnRUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdWJsaXNoV1NETERvY3MoUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8pIHsKLSAgICAgICAgLy8gU2V0IHF1ZXJ5U3RyaW5nIGZvciB0aGUgZG9jdW1lbnRzCi0gICAgICAgIE1hcDxTdHJpbmcsIERvY0luZm8+IGRvY3MgPSBlbmRwb2ludEluZm8uZ2V0RG9jTWV0YWRhdGEoKTsKLSAgICAgICAgaWYgKGRvY3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIERvY0luZm8+PiBlbnRyaWVzID0gZG9jcy5lbnRyeVNldCgpOwotICAgICAgICBMaXN0PFN0cmluZz4gd3NkbFN5c3RlbUlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gc2NoZW1hU3lzdGVtSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvcihFbnRyeTxTdHJpbmcsIERvY0luZm8+IGVudHJ5IDogZW50cmllcykgewotICAgICAgICAgICAgRG9jSW5mbyBkb2NJbmZvID0gKERvY0luZm8pZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIERPQ19UWVBFIGRvY1R5cGUgPSBkb2NJbmZvLmdldERvY1R5cGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IGRvY0luZm8uZ2V0UXVlcnlTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsICYmIGRvY1R5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3aXRjaChkb2NUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV1NETCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsU3lzdGVtSWRzLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTQ0hFTUEgOgotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hU3lzdGVtSWRzLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPVEhFUiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyhkb2NJbmZvLmdldFVybCgpKyIgaXMgbm90IGEgV1NETCBvciBTY2hlbWEgZmlsZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHdzZGxTeXN0ZW1JZHMpOwotICAgICAgICBpbnQgd3NkbG51bSA9IDE7Ci0gICAgICAgIGZvcihTdHJpbmcgd3NkbFN5c3RlbUlkIDogd3NkbFN5c3RlbUlkcykgewotICAgICAgICAgICAgRG9jSW5mbyBkb2NJbmZvID0gZG9jcy5nZXQod3NkbFN5c3RlbUlkKTsKLSAgICAgICAgICAgIGRvY0luZm8uc2V0UXVlcnlTdHJpbmcoIndzZGw9Iisod3NkbG51bSsrKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzY2hlbWFTeXN0ZW1JZHMpOwotICAgICAgICBpbnQgeHNkbnVtID0gMTsKLSAgICAgICAgZm9yKFN0cmluZyBzY2hlbWFTeXN0ZW1JZCA6IHNjaGVtYVN5c3RlbUlkcykgewotICAgICAgICAgICAgRG9jSW5mbyBkb2NJbmZvID0gZG9jcy5nZXQoc2NoZW1hU3lzdGVtSWQpOwotICAgICAgICAgICAgZG9jSW5mby5zZXRRdWVyeVN0cmluZygieHNkPSIrKHhzZG51bSsrKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kcG9pbnRJbmZvLnVwZGF0ZVF1ZXJ5MkRvY0luZm8oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnlJbXBsZW1lbnRvckNsYXNzKCkgewotICAgICAgICBpZiAod3NQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3c1Byb3ZpZGVyID0gKFdlYlNlcnZpY2VQcm92aWRlcilpbXBsZW1lbnRvckNsYXNzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdzID09IG51bGwpIHsKLSAgICAgICAgICAgIHdzID0gKFdlYlNlcnZpY2UpaW1wbGVtZW50b3JDbGFzcy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3c1Byb3ZpZGVyID09IG51bGwgJiYgd3MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJuby53cy5hbm5vdGF0aW9uIiwgaW1wbGVtZW50b3JDbGFzcyk7Ci0KLSAgICAgICAgfQotICAgICAgICBpZiAod3NQcm92aWRlciAhPSBudWxsICYmIHdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigiYm90aC53cy5hbm5vdGF0aW9ucyIsIGltcGxlbWVudG9yQ2xhc3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIGlmICh3c1Byb3ZpZGVyICE9IG51bGwgJiYgd3NQcm92aWRlci53c2RsTG9jYXRpb24oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiB3c1Byb3ZpZGVyLndzZGxMb2NhdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKHdzICE9IG51bGwgJiYgd3Mud3NkbExvY2F0aW9uKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3Mud3NkbExvY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3ZpZGVyTW9kZWwgZ2V0UHJvdmlkZXJNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3ZpZGVyTW9kZWw7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TRERvY3VtZW50SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1NERG9jdW1lbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3YjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TRERvY3VtZW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Eb2N1bWVudEFkZHJlc3NSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlBvcnRBZGRyZXNzUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5TRERvY3VtZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuU0REb2N1bWVudEZpbHRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlNERG9jdW1lbnRTb3VyY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU0VuZHBvaW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtV3JpdGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5QYXJzZXJVdGlsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLldTRExDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5SdW50aW1lVmVyc2lvbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiB7QGxpbmsgU0REb2N1bWVudH0gaW1wbG1lbnRhdGlvbi4KKyAqCisgKiA8cD4KKyAqIFRoaXMgZXh0ZW5kcyBmcm9tIHtAbGluayBTRERvY3VtZW50U291cmNlfSBzbyB0aGF0CisgKiBKQVgtV1Mgc2VydmVyIHJ1bnRpbWUgY29kZSBjYW4gdXNlIHtAbGluayBTRERvY3VtZW50fQorICogYXMge0BsaW5rIFNERG9jdW1lbnRTb3VyY2V9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK2NsYXNzIFNERG9jdW1lbnRJbXBsIGV4dGVuZHMgU0REb2N1bWVudFNvdXJjZSBpbXBsZW1lbnRzIFNERG9jdW1lbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1hTRCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgU0NIRU1BX0lOQ0xVREVfUU5BTUUgPSBuZXcgUU5hbWUoTlNfWFNELCAiaW5jbHVkZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFNDSEVNQV9JTVBPUlRfUU5BTUUgPSBuZXcgUU5hbWUoTlNfWFNELCAiaW1wb3J0Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fQ09NTUVOVCA9CisgICAgICAgICIgUHVibGlzaGVkIGJ5IEpBWC1XUyBSSSBhdCBodHRwOi8vamF4LXdzLmRldi5qYXZhLm5ldC4gUkkncyB2ZXJzaW9uIGlzICIrUnVudGltZVZlcnNpb24uVkVSU0lPTisiLiAiOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB7QGxpbmsgU0REb2N1bWVudH0gZnJvbSB7QGxpbmsgU0REb2N1bWVudFNvdXJjZX0uCisgICAgICogQHBhcmFtIHNyYyBXU0RMIGRvY3VtZW50IGluZm9zZXQKKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgd3NkbDpzZXJ2aWNlIG5hbWUKKyAgICAgKiBAcGFyYW0gcG9ydFR5cGVOYW1lCisgICAgICogICAgICBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBvcnQgb2Yge0BsaW5rIFdTRW5kcG9pbnR9IHRvIHdoaWNoIHRoaXMgZG9jdW1lbnQgaXMgYnVpbHQgZm9yLgorICAgICAqICAgICAgVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBkb2N1bWVudCBpcyB0aGUgY29uY3JldGUgYW5kIGFic3RyYWN0IFdTRExzCisgICAgICogICAgICBmb3IgdGhpcyBlbmRwb2ludC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbAorICAgICAqICAgICAgQWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU0REb2N1bWVudEltcGwgY3JlYXRlKFNERG9jdW1lbnRTb3VyY2Ugc3JjLCBRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydFR5cGVOYW1lKSB7CisgICAgICAgIFVSTCBzeXN0ZW1JZCA9IHNyYy5nZXRTeXN0ZW1JZCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBSdW50aW1lV1NETFBhcnNlciBwYXJzZXIgPSBuZXcgUnVudGltZVdTRExQYXJzZXIobnVsbCk7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gc3JjLnJlYWQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKTsKKworICAgICAgICAgICAgICAgIFFOYW1lIHJvb3ROYW1lID0gcmVhZGVyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZihyb290TmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9TQ0hFTUEpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0bnMgPSBQYXJzZXJVdGlsLmdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgV1NETENvbnN0YW50cy5BVFRSX1ROUyk7CisgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGltcG9ydGVkRG9jcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNDSEVNQV9JTkNMVURFX1FOQU1FLmVxdWFscyhuYW1lKSB8fCBTQ0hFTUFfSU1QT1JUX1FOQU1FLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRlZERvYyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAic2NoZW1hTG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWREb2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZERvY3MuYWRkKG5ldyBVUkwoc3JjLmdldFN5c3RlbUlkKCksIGltcG9ydGVkRG9jKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFJbXBsKHJvb3ROYW1lLHN5c3RlbUlkLHNyYyx0bnMsaW1wb3J0ZWREb2NzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3ROYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX0RFRklOSVRJT05TKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG5zID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsIFdTRExDb25zdGFudHMuQVRUUl9UTlMpOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUG9ydFR5cGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXJ2aWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGltcG9ydGVkRG9jcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBpZiBXU0RMLCBwYXJzZSBtb3JlCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRDb250ZW50KHJlYWRlcikgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9ET0NVTUVOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlYWRlci5nZXRFdmVudFR5cGUoKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5RTkFNRV9QT1JUX1RZUEUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBuID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsIFdTRExDb25zdGFudHMuQVRUUl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydFR5cGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocG9ydFR5cGVOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhwbikmJnBvcnRUeXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHModG5zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUG9ydFR5cGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNuID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsIFdTRExDb25zdGFudHMuQVRUUl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBzcW4gPSBuZXcgUU5hbWUodG5zLHNuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXJ2aWNlTmFtZS5lcXVhbHMoc3FuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNTZXJ2aWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuUU5BTUVfSU1QT1JULmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRlZERvYyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWREb2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZERvY3MuYWRkKG5ldyBVUkwoc3JjLmdldFN5c3RlbUlkKCksIGltcG9ydGVkRG9jKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNDSEVNQV9JTkNMVURFX1FOQU1FLmVxdWFscyhuYW1lKSB8fCBTQ0hFTUFfSU1QT1JUX1FOQU1FLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRlZERvYyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAic2NoZW1hTG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWREb2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZERvY3MuYWRkKG5ldyBVUkwoc3JjLmdldFN5c3RlbUlkKCksIGltcG9ydGVkRG9jKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0RMSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROYW1lLHN5c3RlbUlkLHNyYyx0bnMsaGFzUG9ydFR5cGUsaGFzU2VydmljZSxpbXBvcnRlZERvY3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU0REb2N1bWVudEltcGwocm9vdE5hbWUsc3lzdGVtSWQsc3JjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigicnVudGltZS5wYXJzZXIud3NkbCIsIHN5c3RlbUlkLGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInJ1bnRpbWUucGFyc2VyLndzZGwiLCBzeXN0ZW1JZCxlKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigicnVudGltZS5wYXJzZXIud3NkbCIsIHN5c3RlbUlkLGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGZpbmFsIFFOYW1lIHJvb3ROYW1lOworICAgIHByaXZhdGUgZmluYWwgU0REb2N1bWVudFNvdXJjZSBzb3VyY2U7CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hlbiB7QGxpbmsgU2VydmljZURlZmluaXRpb25JbXBsfSBpcyBjb25zdHJ1Y3RlZC4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBTZXJ2aWNlRGVmaW5pdGlvbkltcGwgb3duZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZ2luYWwgc3lzdGVtIElEIG9mIHRoaXMgZG9jdW1lbnQuCisgICAgICoKKyAgICAgKiBXaGVuIHRoaXMgZG9jdW1lbnQgY29udGFpbnMgcmVsYXRpdmUgcmVmZXJlbmNlcyB0byBvdGhlciByZXNvdXJjZXMsCisgICAgICogdGhpcyBmaWVsZCBpcyB1c2VkIHRvIGZpbmQgd2hpY2gge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TRERvY3VtZW50SW1wbH0gaXQgcmVmZXJzIHRvLgorICAgICAqCisgICAgICogTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFVSTCB1cmw7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBpbXBvcnRzOworCisgICAgcHJvdGVjdGVkIFNERG9jdW1lbnRJbXBsKFFOYW1lIHJvb3ROYW1lLCBVUkwgdXJsLCBTRERvY3VtZW50U291cmNlIHNvdXJjZSkgeworICAgICAgICB0aGlzKHJvb3ROYW1lLCB1cmwsIHNvdXJjZSwgbmV3IEhhc2hTZXQ8U3RyaW5nPigpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU0REb2N1bWVudEltcGwoUU5hbWUgcm9vdE5hbWUsIFVSTCB1cmwsIFNERG9jdW1lbnRTb3VyY2Ugc291cmNlLCBTZXQ8U3RyaW5nPiBpbXBvcnRzKSB7CisgICAgICAgIGFzc2VydCB1cmwhPW51bGw7CisgICAgICAgIHRoaXMucm9vdE5hbWUgPSByb290TmFtZTsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIHRoaXMudXJsID0gdXJsOworICAgICAgICB0aGlzLmltcG9ydHMgPSBpbXBvcnRzOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRSb290TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHJvb3ROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzV1NETCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2NoZW1hKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFVSTCBnZXRVUkwoKSB7CisgICAgICAgIHJldHVybiB1cmw7CisgICAgfQorCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkKFhNTElucHV0RmFjdG9yeSB4aWYpIHRocm93cyBJT0V4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZS5yZWFkKHhpZik7CisgICAgfQorCisgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc291cmNlLnJlYWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVVJMIGdldFN5c3RlbUlkKCkgeworICAgICAgICByZXR1cm4gdXJsOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRJbXBvcnRzKCkgeworICAgICAgICByZXR1cm4gaW1wb3J0czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFBvcnRBZGRyZXNzUmVzb2x2ZXIgcG9ydEFkZHJlc3NSZXNvbHZlciwgRG9jdW1lbnRBZGRyZXNzUmVzb2x2ZXIgcmVzb2x2ZXIsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHcgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9nZW5lcmF0ZSB0aGUgV1NETCB3aXRoIHV0Zi04IGVuY29kaW5nIGFuZCBYTUwgdmVyc2lvbiAxLjAKKyAgICAgICAgICAgIHcgPSBYTUxTdHJlYW1Xcml0ZXJGYWN0b3J5LmNyZWF0ZShvcywgIlVURi04Iik7CisgICAgICAgICAgICB3LndyaXRlU3RhcnREb2N1bWVudCgiVVRGLTgiLCAiMS4wIik7CisgICAgICAgICAgICB3cml0ZVRvKHBvcnRBZGRyZXNzUmVzb2x2ZXIscmVzb2x2ZXIsdyk7CisgICAgICAgICAgICB3LndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBpb2UuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgaW9lOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB3LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgaW9lLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpb2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFBvcnRBZGRyZXNzUmVzb2x2ZXIgcG9ydEFkZHJlc3NSZXNvbHZlciwgRG9jdW1lbnRBZGRyZXNzUmVzb2x2ZXIgcmVzb2x2ZXIsIFhNTFN0cmVhbVdyaXRlciBvdXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTRERvY3VtZW50RmlsdGVyIGYgOiBvd25lci5maWx0ZXJzKSB7CisgICAgICAgICAgICBvdXQgPSBmLmZpbHRlcih0aGlzLG91dCk7CisgICAgICAgIH0KKworICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeHNyID0gc291cmNlLnJlYWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC53cml0ZUNvbW1lbnQoVkVSU0lPTl9DT01NRU5UKTsKKyAgICAgICAgICAgIG5ldyBXU0RMUGF0Y2hlcihvd25lci5vd25lcix0aGlzLHBvcnRBZGRyZXNzUmVzb2x2ZXIscmVzb2x2ZXIpLmJyaWRnZSh4c3Isb3V0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHhzci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgU0REb2N1bWVudC5TY2hlbWF9IGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNjaGVtYUltcGwgZXh0ZW5kcyBTRERvY3VtZW50SW1wbCBpbXBsZW1lbnRzIFNERG9jdW1lbnQuU2NoZW1hIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOworCisgICAgICAgIHB1YmxpYyBTY2hlbWFJbXBsKFFOYW1lIHJvb3ROYW1lLCBVUkwgdXJsLCBTRERvY3VtZW50U291cmNlIHNvdXJjZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaW1wb3J0cykgeworICAgICAgICAgICAgc3VwZXIocm9vdE5hbWUsIHVybCwgc291cmNlLCBpbXBvcnRzKTsKKyAgICAgICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTY2hlbWEoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgV1NETEltcGwgZXh0ZW5kcyBTRERvY3VtZW50SW1wbCBpbXBsZW1lbnRzIFNERG9jdW1lbnQuV1NETCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc1BvcnRUeXBlOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzU2VydmljZTsKKworICAgICAgICBwdWJsaWMgV1NETEltcGwoUU5hbWUgcm9vdE5hbWUsIFVSTCB1cmwsIFNERG9jdW1lbnRTb3VyY2Ugc291cmNlLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGhhc1BvcnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXJ2aWNlLCBTZXQ8U3RyaW5nPiBpbXBvcnRzKSB7CisgICAgICAgICAgICBzdXBlcihyb290TmFtZSwgdXJsLCBzb3VyY2UsIGltcG9ydHMpOworICAgICAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7CisgICAgICAgICAgICB0aGlzLmhhc1BvcnRUeXBlID0gaGFzUG9ydFR5cGU7CisgICAgICAgICAgICB0aGlzLmhhc1NlcnZpY2UgPSBoYXNTZXJ2aWNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUG9ydFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFzUG9ydFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZXJ2aWNlKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhc1NlcnZpY2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dTREwoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvU2VydmVyUHJvcGVydHlDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TZXJ2ZXJQcm9wZXJ0eUNvbnN0YW50cy5qYXZhCmluZGV4IGZhZjAxMWIuLmY0ODA1MTggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TZXJ2ZXJQcm9wZXJ0eUNvbnN0YW50cy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TZXJ2ZXJQcm9wZXJ0eUNvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TZXJ2ZXJSdEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1NlcnZlclJ0RXhjZXB0aW9uLmphdmEKaW5kZXggOTU1MjIxMC4uY2E5NzNlMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1NlcnZlclJ0RXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1NlcnZlclJ0RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDQsMTAgKzQ0LDcgQEAKICAgICAgICAgc3VwZXIoInNlcnZlci5ydC5lcnIiLCBhcmcpOwogICAgIH0KIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIEpBWFdTRXhjZXB0aW9uQmFzZSNnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlc291cmNlQnVuZGxlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuc2VydmVyIjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TZXJ2aWNlRGVmaW5pdGlvbkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TZXJ2aWNlRGVmaW5pdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNmYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1NlcnZpY2VEZWZpbml0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlNERG9jdW1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5TRERvY3VtZW50RmlsdGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuU2VydmljZURlZmluaXRpb247CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiB7QGxpbmsgU2VydmljZURlZmluaXRpb259IGltcGxlbWVudGF0aW9uLgorICoKKyAqIDxwPgorICogWW91IGNvbnN0cnVjdCBhIHtAbGluayBTZXJ2aWNlRGVmaW5pdGlvbkltcGx9IGJ5IGZpcnN0IGNvbnN0cnVjdGluZworICogYSBsaXN0IG9mIHtAbGluayBTRERvY3VtZW50SW1wbH1zLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlcnZpY2VEZWZpbml0aW9uSW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VEZWZpbml0aW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U0REb2N1bWVudEltcGw+IGRvY3M7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsU0REb2N1bWVudEltcGw+IGJ5U3lzdGVtSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBATm90TnVsbCBTRERvY3VtZW50SW1wbCBwcmltYXJ5V3NkbDsKKworICAgIC8qKgorICAgICAqIFNldCB3aGVuIHtAbGluayBXU0VuZHBvaW50SW1wbH0gaXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBXU0VuZHBvaW50SW1wbDw/PiBvd25lcjsKKworICAgIC8qcGFja2FnZSovIGZpbmFsIExpc3Q8U0REb2N1bWVudEZpbHRlcj4gZmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8U0REb2N1bWVudEZpbHRlcj4oKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkb2NzCisgICAgICogICAgICBMaXN0IG9mIHtAbGluayBTRERvY3VtZW50SW1wbH1zIHRvIGZvcm0gdGhlIGRlc2NyaXB0aW9uLgorICAgICAqICAgICAgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZW50cnkuCisgICAgICogICAgICBUaGUgZmlyc3QgZG9jdW1lbnQgaXMgY29uc2lkZXJlZCB7QGxpbmsgI2dldFByaW1hcnkoKSBwcmltYXJ5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZURlZmluaXRpb25JbXBsKExpc3Q8U0REb2N1bWVudEltcGw+IGRvY3MsIEBOb3ROdWxsIFNERG9jdW1lbnRJbXBsIHByaW1hcnlXc2RsKSB7CisgICAgICAgIGFzc2VydCBkb2NzLmNvbnRhaW5zKHByaW1hcnlXc2RsKTsKKyAgICAgICAgdGhpcy5kb2NzID0gZG9jczsKKyAgICAgICAgdGhpcy5wcmltYXJ5V3NkbCA9IHByaW1hcnlXc2RsOworCisgICAgICAgIHRoaXMuYnlTeXN0ZW1JZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU0REb2N1bWVudEltcGw+KGRvY3Muc2l6ZSgpKTsKKyAgICAgICAgZm9yIChTRERvY3VtZW50SW1wbCBkb2MgOiBkb2NzKSB7CisgICAgICAgICAgICBieVN5c3RlbUlkLnB1dChkb2MuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSxkb2MpOworCisgICAgICAgICAgICBhc3NlcnQgZG9jLm93bmVyPT1udWxsOworICAgICAgICAgICAgZG9jLm93bmVyID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvd25lciBpcyBzZXQgd2hlbiB7QGxpbmsgV1NFbmRwb2ludEltcGx9IGlzIGNyZWF0ZWQuCisgICAgICovCisgICAgLypwYWNrYWdlKi8gdm9pZCBzZXRPd25lcihXU0VuZHBvaW50SW1wbDw/PiBvd25lcikgeworICAgICAgICBhc3NlcnQgb3duZXIhPW51bGwgJiYgdGhpcy5vd25lcj09bnVsbDsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBTRERvY3VtZW50IGdldFByaW1hcnkoKSB7CisgICAgICAgIHJldHVybiBwcmltYXJ5V3NkbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoU0REb2N1bWVudEZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVycy5hZGQoZmlsdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8U0REb2N1bWVudD4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiAoSXRlcmF0b3IpZG9jcy5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI2dldEJ5U3lzdGVtSWQoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBTRERvY3VtZW50IGdldEJ5U3lzdGVtSWQoVVJMIHN5c3RlbUlkKSB7CisgICAgICAgIHJldHVybiBnZXRCeVN5c3RlbUlkKHN5c3RlbUlkLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBTRERvY3VtZW50SW1wbH0gd2hvc2Uge0BsaW5rIFNERG9jdW1lbnRJbXBsI2dldFVSTCgpfQorICAgICAqIHJldHVybnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU0REb2N1bWVudEltcGwgZ2V0QnlTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpIHsKKyAgICAgICAgcmV0dXJuIGJ5U3lzdGVtSWQuZ2V0KHN5c3RlbUlkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvU2luZ2xldG9uUmVzb2x2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9TaW5nbGV0b25SZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNjcyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvU2luZ2xldG9uUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5JbnN0YW5jZVJlc29sdmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuV1NFbmRwb2ludDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTV2ViU2VydmljZUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworCisvKioKKyAqIHtAbGluayBJbnN0YW5jZVJlc29sdmVyfSB0aGF0IGFsd2F5cyByZXR1cm5zIGEgc2luZ2xlIGluc3RhbmNlLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNpbmdsZXRvblJlc29sdmVyPFQ+IGV4dGVuZHMgQWJzdHJhY3RJbnN0YW5jZVJlc29sdmVyPFQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIFQgc2luZ2xldG9uOworCisgICAgcHVibGljIFNpbmdsZXRvblJlc29sdmVyKEBOb3ROdWxsIFQgc2luZ2xldG9uKSB7CisgICAgICAgIHRoaXMuc2luZ2xldG9uID0gc2luZ2xldG9uOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBUIHJlc29sdmUoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydChXU1dlYlNlcnZpY2VDb250ZXh0IHdzYywgV1NFbmRwb2ludCBlbmRwb2ludCkgeworICAgICAgICBnZXRSZXNvdXJjZUluamVjdG9yKGVuZHBvaW50KS5pbmplY3Qod3NjLHNpbmdsZXRvbik7CisgICAgICAgIC8vIG5vdGlmeSB0aGF0IHdlIGFyZSByZWFkeSB0byBzZXJ2ZQorICAgICAgICBpbnZva2VNZXRob2QoZmluZEFubm90YXRlZE1ldGhvZChzaW5nbGV0b24uZ2V0Q2xhc3MoKSxQb3N0Q29uc3RydWN0LmNsYXNzKSxzaW5nbGV0b24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIGludm9rZU1ldGhvZChmaW5kQW5ub3RhdGVkTWV0aG9kKHNpbmdsZXRvbi5nZXRDbGFzcygpLFByZURlc3Ryb3kuY2xhc3MpLHNpbmdsZXRvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1N0YXRlZnVsSW5zdGFuY2VSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1N0YXRlZnVsSW5zdGFuY2VSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWZiMWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvU3RhdGVmdWxJbnN0YW5jZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5GcmFnbWVudENvbnRlbnRIYW5kbGVyOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXJTb3VyY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5zdGF4LlN0cmVhbVdyaXRlckJ1ZmZlckNyZWF0b3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlckxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuSW5zdGFuY2VSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU1dlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5FUFJSZWNpcGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLlN0YXRlZnVsV2ViU2VydmljZU1hbmFnZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLlNlcnZlck1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5Qcm92aWRlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuQ29udGVudEhhbmRsZXJUb1hNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICoge0BsaW5rIEluc3RhbmNlUmVzb2x2ZXJ9IHRoYXQgbG9va3MgYXQgSkFYLVdTIGNvb2tpZSBoZWFkZXIgdG8KKyAqIGRldGVybWluZSB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggYSBtZXNzYWdlIHdpbGwgYmUgcm91dGVkLgorICoKKyAqIDxwPgorICogU2VlIHtAbGluayBTdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyfSBmb3IgbW9yZSBhYm91dCB1c2VyLWxldmVsIHNlbWFudGljcy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWZ1bEluc3RhbmNlUmVzb2x2ZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdE11bHRpSW5zdGFuY2VSZXNvbHZlcjxUPiBpbXBsZW1lbnRzIFN0YXRlZnVsV2ViU2VydmljZU1hbmFnZXI8VD4geworICAgIC8qKgorICAgICAqIFRoaXMgaW5zdGFuY2UgaXMgdXNlZCBmb3Igc2VydmluZyBtZXNzYWdlcyB0aGF0IGhhdmUgbm8gY29va2llCisgICAgICogb3IgY29va2llIHZhbHVlIHRoYXQgdGhlIHNlcnZlciBkb2Vzbid0IHJlY29nbml6ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIEBOdWxsYWJsZSBUIGZhbGxiYWNrOworCisgICAgLyoqCisgICAgICogTWFpbnRhaW5zIHRoZSBzdGF0ZWZ1bCBzZXJ2aWNlIGluc3RhbmNlIGFuZCBpdHMgdGltZS1vdXQgdGltZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBJbnN0YW5jZSB7CisgICAgICAgIGZpbmFsIEBOb3ROdWxsIFQgaW5zdGFuY2U7CisgICAgICAgIFRpbWVyVGFzayB0YXNrOworCisgICAgICAgIHB1YmxpYyBJbnN0YW5jZShUIGluc3RhbmNlKSB7CisgICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzZXRzIHRoZSB0aW1lci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXN0YXJ0VGltZXIoKSB7CisgICAgICAgICAgICBjYW5jZWwoKTsKKyAgICAgICAgICAgIGlmKHRpbWVvdXRNaWxsaXNlY29uZHM9PTApICByZXR1cm47IC8vIG5vIHRpbWVyCisKKyAgICAgICAgICAgIHRhc2sgPSBuZXcgVGltZXJUYXNrKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrPFQ+IGNiID0gdGltZW91dENhbGxiYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2IhPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi5vblRpbWVvdXQoaW5zdGFuY2UsU3RhdGVmdWxJbnN0YW5jZVJlc29sdmVyLnRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgb3BlcmF0aW9uIGlzIHRvIHVuZXhwb3J0IGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgdW5leHBvcnQoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgbGV0IGFuIGVycm9yIGluIHRoZSBjb2RlIGtpbGwgdGhlIHRpbWVyIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsICJ0aW1lIG91dCBoYW5kbGVyIGZhaWxlZCIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRpbWVyLnNjaGVkdWxlKHRhc2ssdGltZW91dE1pbGxpc2Vjb25kcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FuY2VscyB0aGUgdGltZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2FuY2VsKCkgeworICAgICAgICAgICAgaWYodGFzayE9bnVsbCkKKyAgICAgICAgICAgICAgICB0YXNrLmNhbmNlbCgpOworICAgICAgICAgICAgdGFzayA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXBzIG9iamVjdCBJRCB0byBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLEluc3RhbmNlPiBpbnN0YW5jZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLEluc3RhbmNlPigpKTsKKyAgICAvKioKKyAgICAgKiBSZXZlcnNlIGxvb2sgdXAgZm9yIHtAbGluayAjaW5zdGFuY2VzfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxULFN0cmluZz4gcmV2ZXJzZUluc3RhbmNlcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxULFN0cmluZz4oKSk7CisKKyAgICAvLyB0aW1lIG91dCBjb250cm9sLiAwPWRpc2FibGVkCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHRpbWVvdXRNaWxsaXNlY29uZHMgPSAwOworICAgIHByaXZhdGUgdm9sYXRpbGUgQ2FsbGJhY2s8VD4gdGltZW91dENhbGxiYWNrOworCisgICAgcHVibGljIFN0YXRlZnVsSW5zdGFuY2VSZXNvbHZlcihDbGFzczxUPiBjbGF6eikgeworICAgICAgICBzdXBlcihjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOb3ROdWxsIFQgcmVzb2x2ZShQYWNrZXQgcmVxdWVzdCkgeworICAgICAgICBIZWFkZXJMaXN0IGhlYWRlcnMgPSByZXF1ZXN0LmdldE1lc3NhZ2UoKS5nZXRIZWFkZXJzKCk7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBoZWFkZXJzLmdldChDT09LSUVfVEFHLCB0cnVlKTsKKyAgICAgICAgU3RyaW5nIGlkPW51bGw7CisgICAgICAgIGlmKGhlYWRlciE9bnVsbCkgeworICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zdGFuY2UKKyAgICAgICAgICAgIGlkID0gaGVhZGVyLmdldFN0cmluZ0NvbnRlbnQoKTsKKyAgICAgICAgICAgIEluc3RhbmNlIG8gPSBpbnN0YW5jZXMuZ2V0KGlkKTsKKyAgICAgICAgICAgIGlmKG8hPW51bGwpIHsKKyAgICAgICAgICAgICAgICBvLnJlc3RhcnRUaW1lcigpOworICAgICAgICAgICAgICAgIHJldHVybiBvLmluc3RhbmNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBodWg/IHdoYXQgaXMgdGhpcyBJRD8KKyAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuSU5GTywiUmVxdWVzdCBoYWQgYW4gdW5yZWNvZ25pemVkIG9iamVjdCBJRCAiK2lkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5lZWQgdG8gZmFsbGJhY2sKKyAgICAgICAgVCBmYWxsYmFjayA9IHRoaXMuZmFsbGJhY2s7CisgICAgICAgIGlmKGZhbGxiYWNrIT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrOworCisgICAgICAgIGlmKGlkPT1udWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oU2VydmVyTWVzc2FnZXMuU1RBVEVGVUxfQ09PS0lFX0hFQURFUl9SRVFVSVJFRChDT09LSUVfVEFHKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKFNlcnZlck1lc3NhZ2VzLlNUQVRFRlVMX0NPT0tJRV9IRUFERVJfSU5DT1JSRUNUKENPT0tJRV9UQUcsaWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydChXU1dlYlNlcnZpY2VDb250ZXh0IHdzYywgV1NFbmRwb2ludCBlbmRwb2ludCkgeworICAgICAgICBzdXBlci5zdGFydCh3c2MsZW5kcG9pbnQpOworCisgICAgICAgIGlmKGVuZHBvaW50LmdldEJpbmRpbmcoKS5nZXRBZGRyZXNzaW5nVmVyc2lvbigpPT1udWxsKQorICAgICAgICAgICAgLy8gYWRkcmVzc2luZyBpcyBub3QgZW5hYmxlZC4KKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKFNlcnZlck1lc3NhZ2VzLlNUQVRFRlVMX1JFUVVSRVNfQUREUkVTU0lORyhjbGF6eikpOworCisgICAgICAgICAgICAvLyBpbmplY3QgU3RhdGVmdWxXZWJTZXJ2aWNlTWFuYWdlci4KKyAgICAgICAgZm9yKEZpZWxkIGZpZWxkOiBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICAgICAgICBpZihmaWVsZC5nZXRUeXBlKCk9PVN0YXRlZnVsV2ViU2VydmljZU1hbmFnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBpZighTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5TVEFUSUNfUkVTT1VSQ0VfSU5KRUNUSU9OX09OTFkoU3RhdGVmdWxXZWJTZXJ2aWNlTWFuYWdlci5jbGFzcyxmaWVsZCkpOworICAgICAgICAgICAgICAgIG5ldyBGaWVsZEluamVjdGlvblBsYW48VCxTdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyPihmaWVsZCkuaW5qZWN0KG51bGwsdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoTWV0aG9kIG1ldGhvZCA6IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbVR5cGVzLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIG5vdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvcgorCisgICAgICAgICAgICBpZihwYXJhbVR5cGVzWzBdPT1TdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgaWYoIU1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKFNlcnZlck1lc3NhZ2VzLlNUQVRJQ19SRVNPVVJDRV9JTkpFQ1RJT05fT05MWShTdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyLmNsYXNzLG1ldGhvZCkpOworCisgICAgICAgICAgICAgICAgbmV3IE1ldGhvZEluamVjdGlvblBsYW48VCxTdGF0ZWZ1bFdlYlNlcnZpY2VNYW5hZ2VyPihtZXRob2QpLmluamVjdChudWxsLHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgcmV2ZXJzZUluc3RhbmNlcy5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQoaW5zdGFuY2VzKSB7CisgICAgICAgICAgICBmb3IgKEluc3RhbmNlIHQgOiBpbnN0YW5jZXMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICB0LmNhbmNlbCgpOworICAgICAgICAgICAgICAgIGRpc3Bvc2UodC5pbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnN0YW5jZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZihmYWxsYmFjayE9bnVsbCkKKyAgICAgICAgICAgIGRpc3Bvc2UoZmFsbGJhY2spOworICAgICAgICBmYWxsYmFjayA9IG51bGw7CisgICAgfQorCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgVzNDRW5kcG9pbnRSZWZlcmVuY2UgZXhwb3J0KFQgbykgeworICAgICAgICByZXR1cm4gZXhwb3J0KFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzLG8pOworICAgIH0KKworICAgIEBOb3ROdWxsCisgICAgcHVibGljIDxFUFIgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT5FUFIgZXhwb3J0KENsYXNzPEVQUj4gZXByLCBUIG8pIHsKKyAgICAgICAgcmV0dXJuIGV4cG9ydChlcHIsbyxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPEVQUiBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBFUFIgZXhwb3J0KENsYXNzPEVQUj4gZXByLCBUIG8sIEVQUlJlY2lwZSByZWNpcGUpIHsKKyAgICAgICAgcmV0dXJuIGV4cG9ydChlcHIsIEludm9rZXJUdWJlLmdldEN1cnJlbnRQYWNrZXQoKSwgbywgcmVjaXBlKTsKKyAgICB9CisKKyAgICBATm90TnVsbAorICAgIHB1YmxpYyA8RVBSIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+RVBSIGV4cG9ydChDbGFzczxFUFI+IGVwciwgV2ViU2VydmljZUNvbnRleHQgY29udGV4dCwgVCBvKSB7CisgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgV1NXZWJTZXJ2aWNlQ29udGV4dCkgeworICAgICAgICAgICAgV1NXZWJTZXJ2aWNlQ29udGV4dCB3c3dzYyA9IChXU1dlYlNlcnZpY2VDb250ZXh0KSBjb250ZXh0OworICAgICAgICAgICAgcmV0dXJuIGV4cG9ydChlcHIsIHdzd3NjLmdldFJlcXVlc3RQYWNrZXQoKSwgbyk7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5TVEFURUZVTF9JTlZBTElEX1dFQlNFUlZJQ0VfQ09OVEVYVChjb250ZXh0KSk7CisgICAgfQorCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgPEVQUiBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBFUFIgZXhwb3J0KENsYXNzPEVQUj4gYWRyc1ZlciwgQE5vdE51bGwgUGFja2V0IGN1cnJlbnRSZXF1ZXN0LCBUIG8pIHsKKyAgICAgICAgcmV0dXJuIGV4cG9ydChhZHJzVmVyLGN1cnJlbnRSZXF1ZXN0LG8sbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIDxFUFIgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gRVBSIGV4cG9ydChDbGFzczxFUFI+IGFkcnNWZXIsIEBOb3ROdWxsIFBhY2tldCBjdXJyZW50UmVxdWVzdCwgVCBvLCBFUFJSZWNpcGUgcmVjaXBlKSB7CisgICAgICAgIHJldHVybiBleHBvcnQoYWRyc1ZlciwgY3VycmVudFJlcXVlc3Qud2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZS5nZXRFUFJBZGRyZXNzKGN1cnJlbnRSZXF1ZXN0LG93bmVyKSwgbywgcmVjaXBlKTsKKyAgICB9CisKKyAgICBATm90TnVsbAorICAgIHB1YmxpYyA8RVBSIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IEVQUiBleHBvcnQoQ2xhc3M8RVBSPiBhZHJzVmVyLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzLCBUIG8pIHsKKyAgICAgICAgcmV0dXJuIGV4cG9ydChhZHJzVmVyLGVuZHBvaW50QWRkcmVzcyxvLG51bGwpOworICAgIH0KKworICAgIEBOb3ROdWxsCisgICAgcHVibGljIDxFUFIgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gRVBSIGV4cG9ydChDbGFzczxFUFI+IGFkcnNWZXIsIFN0cmluZyBlbmRwb2ludEFkZHJlc3MsIFQgbywgRVBSUmVjaXBlIHJlY2lwZSkgeworICAgICAgICBpZihlbmRwb2ludEFkZHJlc3M9PW51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBhZGRyZXNzIGF2YWlsYWJsZSIpOworCisgICAgICAgIFN0cmluZyBrZXkgPSByZXZlcnNlSW5zdGFuY2VzLmdldChvKTsKKworICAgICAgICBpZihrZXkhPW51bGwpIHJldHVybiBjcmVhdGVFUFIoa2V5LCBhZHJzVmVyLCBlbmRwb2ludEFkZHJlc3MsIHJlY2lwZSk7CisKKyAgICAgICAgLy8gbm90IGV4cG9ydGVkIHlldC4KKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIC8vIGRvdWJsZSBjaGVjayBub3cgaW4gdGhlIHN5bmNocm9uaXphdGlvbiBibG9jayB0bworICAgICAgICAgICAgLy8gcmVhbGx5IG1ha2Ugc3VyZSB0aGF0IHdlIGNhbiBleHBvcnQuCisgICAgICAgICAgICBrZXkgPSByZXZlcnNlSW5zdGFuY2VzLmdldChvKTsKKyAgICAgICAgICAgIGlmKGtleSE9bnVsbCkgcmV0dXJuIGNyZWF0ZUVQUihrZXksIGFkcnNWZXIsIGVuZHBvaW50QWRkcmVzcywgcmVjaXBlKTsKKworICAgICAgICAgICAgaWYobyE9bnVsbCkKKyAgICAgICAgICAgICAgICBwcmVwYXJlKG8pOworICAgICAgICAgICAga2V5ID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIEluc3RhbmNlIGluc3RhbmNlID0gbmV3IEluc3RhbmNlKG8pOworICAgICAgICAgICAgaW5zdGFuY2VzLnB1dChrZXksIGluc3RhbmNlKTsKKyAgICAgICAgICAgIHJldmVyc2VJbnN0YW5jZXMucHV0KG8sa2V5KTsKKyAgICAgICAgICAgIGlmKHRpbWVvdXRNaWxsaXNlY29uZHMhPTApCisgICAgICAgICAgICAgICAgaW5zdGFuY2UucmVzdGFydFRpbWVyKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlRVBSKGtleSwgYWRyc1ZlciwgZW5kcG9pbnRBZGRyZXNzLCByZWNpcGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gRVBSIHRoYXQgaGFzIHRoZSByaWdodCBrZXkuCisgICAgICovCisgICAgcHJpdmF0ZSA8RVBSIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IEVQUiBjcmVhdGVFUFIoU3RyaW5nIGtleSwgQ2xhc3M8RVBSPiBlcHJDbGFzcywgU3RyaW5nIGFkZHJlc3MsIEVQUlJlY2lwZSByZWNpcGUpIHsKKyAgICAgICAgQWRkcmVzc2luZ1ZlcnNpb24gYWRyc1ZlciA9IEFkZHJlc3NpbmdWZXJzaW9uLmZyb21TcGVjQ2xhc3MoZXByQ2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJlYW1Xcml0ZXJCdWZmZXJDcmVhdG9yIHcgPSBuZXcgU3RyZWFtV3JpdGVyQnVmZmVyQ3JlYXRvcigpOworCisgICAgICAgICAgICB3LndyaXRlU3RhcnREb2N1bWVudCgpOworICAgICAgICAgICAgdy53cml0ZVN0YXJ0RWxlbWVudCgid3NhIiwiRW5kcG9pbnRSZWZlcmVuY2UiLCBhZHJzVmVyLm5zVXJpKTsKKyAgICAgICAgICAgIHcud3JpdGVOYW1lc3BhY2UoIndzYSIsYWRyc1Zlci5uc1VyaSk7CisKKyAgICAgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQoIndzYSIsIkFkZHJlc3MiLGFkcnNWZXIubnNVcmkpOworICAgICAgICAgICAgdy53cml0ZUNoYXJhY3RlcnMoYWRkcmVzcyk7CisgICAgICAgICAgICB3LndyaXRlRW5kRWxlbWVudCgpOworCisgICAgICAgICAgICB3LndyaXRlU3RhcnRFbGVtZW50KCJ3c2EiLCJSZWZlcmVuY2VQYXJhbWV0ZXJzIixhZHJzVmVyLm5zVXJpKTsKKyAgICAgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQoQ09PS0lFX1RBRy5nZXRQcmVmaXgoKSwgQ09PS0lFX1RBRy5nZXRMb2NhbFBhcnQoKSwgQ09PS0lFX1RBRy5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICB3LndyaXRlQ2hhcmFjdGVycyhrZXkpOworICAgICAgICAgICAgdy53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmKHJlY2lwZSE9bnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoSGVhZGVyIGggOiByZWNpcGUuZ2V0UmVmZXJlbmNlUGFyYW1ldGVycygpKQorICAgICAgICAgICAgICAgICAgICBoLndyaXRlVG8odyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3LndyaXRlRW5kRWxlbWVudCgpOworCisgICAgICAgICAgICBpZihyZWNpcGUhPW51bGwpIHsKKyAgICAgICAgICAgICAgICBMaXN0PFNvdXJjZT4gbWV0YWRhdGEgPSByZWNpcGUuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgICBpZighbWV0YWRhdGEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHcud3JpdGVTdGFydEVsZW1lbnQoIndzYSIsIk1ldGFkYXRhIixhZHJzVmVyLm5zVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdCA9IFhtbFV0aWwubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTb3VyY2UgcyA6IG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRyYW5zZm9ybShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU0FYUmVzdWx0KG5ldyBGcmFnbWVudENvbnRlbnRIYW5kbGVyKG5ldyBDb250ZW50SGFuZGxlclRvWE1MU3RyZWFtV3JpdGVyKHcpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBFUFIgbWV0YWRhdGEgIitzLGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3LndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdy53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHcud3JpdGVFbmREb2N1bWVudCgpOworCisgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGNhbiBiZSBkb25lIGJldHRlciBieSB3cml0aW5nIFNBWCBjb2RlIHRoYXQgcHJvZHVjZXMgaW5mb3NldAorICAgICAgICAgICAgLy8gYW5kIHNldHRpbmcgdGhhdCBhcyBTb3VyY2UuCisgICAgICAgICAgICByZXR1cm4gZXByQ2xhc3MuY2FzdChQcm92aWRlckltcGwuSU5TVEFOQ0UucmVhZEVuZHBvaW50UmVmZXJlbmNlKAorICAgICAgICAgICAgICAgIG5ldyBYTUxTdHJlYW1CdWZmZXJTb3VyY2Uody5nZXRYTUxTdHJlYW1CdWZmZXIoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsgLy8gdGhpcyBtdXN0IGJlIGEgYnVnIGluIG91ciBjb2RlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmV4cG9ydChATnVsbGFibGUgVCBvKSB7CisgICAgICAgIGlmKG89PW51bGwpICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBrZXkgPSByZXZlcnNlSW5zdGFuY2VzLmdldChvKTsKKyAgICAgICAgaWYoa2V5PT1udWxsKSAgIHJldHVybjsgLy8gYWxyZWFkeSB1bmV4cG9ydGVkCisgICAgICAgIGluc3RhbmNlcy5yZW1vdmUoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVCByZXNvbHZlKEVuZHBvaW50UmVmZXJlbmNlIGVwcikgeworICAgICAgICBjbGFzcyBDb29raWVTbmlmZmVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYm9vbGVhbiBpbkNvb2tpZSA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZihsb2NhbE5hbWUuZXF1YWxzKENPT0tJRV9UQUcuZ2V0TG9jYWxQYXJ0KCkpICYmIHVyaS5lcXVhbHMoQ09PS0lFX1RBRy5nZXROYW1lc3BhY2VVUkkoKSkpCisgICAgICAgICAgICAgICAgICAgIGluQ29va2llID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmKGluQ29va2llKQorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNoLHN0YXJ0LGxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaW5Db29raWUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDb29raWVTbmlmZmVyIHNuaWZmZXIgPSBuZXcgQ29va2llU25pZmZlcigpOworICAgICAgICBlcHIud3JpdGVUbyhuZXcgU0FYUmVzdWx0KHNuaWZmZXIpKTsKKworICAgICAgICBJbnN0YW5jZSBvID0gaW5zdGFuY2VzLmdldChzbmlmZmVyLmJ1Zi50b1N0cmluZygpKTsKKyAgICAgICAgaWYobyE9bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBvLmluc3RhbmNlOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGYWxsYmFja0luc3RhbmNlKFQgbykgeworICAgICAgICBpZihvIT1udWxsKQorICAgICAgICAgICAgcHJlcGFyZShvKTsKKyAgICAgICAgdGhpcy5mYWxsYmFjayA9IG87CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIG1pbGxpc2Vjb25kcywgQ2FsbGJhY2s8VD4gY2FsbGJhY2spIHsKKyAgICAgICAgaWYobWlsbGlzZWNvbmRzPDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHRoaXMudGltZW91dE1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kczsKKyAgICAgICAgdGhpcy50aW1lb3V0Q2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgaWYodGltZW91dE1pbGxpc2Vjb25kcz4wKQorICAgICAgICAgICAgc3RhcnRUaW1lcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoKFQgbykgeworICAgICAgICBTdHJpbmcga2V5ID0gcmV2ZXJzZUluc3RhbmNlcy5nZXQobyk7CisgICAgICAgIGlmKGtleT09bnVsbCkgICByZXR1cm47IC8vIGFscmVhZHkgdW5leHBvcnRlZC4KKyAgICAgICAgSW5zdGFuY2UgaW5zdCA9IGluc3RhbmNlcy5nZXQoa2V5KTsKKyAgICAgICAgaWYoaW5zdD09bnVsbCkgIHJldHVybjsKKyAgICAgICAgaW5zdC5yZXN0YXJ0VGltZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaW1lciB0aGF0IGNvbnRyb2xzIHRoZSBpbnN0YW5jZSB0aW1lIG91dC4gTGF6aWx5IGNyZWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgVGltZXIgdGltZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydFRpbWVyKCkgeworICAgICAgICBpZih0aW1lcj09bnVsbCkKKyAgICAgICAgICAgIHRpbWVyID0gbmV3IFRpbWVyKCJKQVgtV1Mgc3RhdGVmdWwgd2ViIHNlcnZpY2UgdGltZW91dCB0aW1lciIpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgQ09PS0lFX1RBRyA9IG5ldyBRTmFtZSgiaHR0cDovL2pheC13cy5kZXYuamF2YS5uZXQveG1sL25zLyIsIm9iamVjdElkIiwiamF4d3MiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4gKyAiLnNlcnZlciIpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1RhcmdldEZpbmRlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9UYXJnZXRGaW5kZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNmI1NzcuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1RhcmdldEZpbmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0vLwotLy8gQ3JlYXRlZCAgICAgICA6IDIwMDQgQXByIDA5IChGcmkpIDA2OjE2OjU4IGJ5IEhhcm9sZCBDYXJyLgotLy8gTGFzdCBNb2RpZmllZCA6IDIwMDQgTWF5IDAzIChNb24pIDE3OjI4OjM4IGJ5IEhhcm9sZCBDYXJyLgotLy8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5UYXJnZXRGaW5kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uVGllOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0RmluZGVySW1wbCBpbXBsZW1lbnRzIFRhcmdldEZpbmRlciB7Ci0KLSAgICBwcml2YXRlIFRpZSB0aWU7Ci0KLSAgICBwdWJsaWMgVGFyZ2V0RmluZGVySW1wbChUaWUgdGllKSB7Ci0gICAgICAgIHRoaXMudGllID0gdGllOwotICAgIH0KLQotICAgIHB1YmxpYyBUaWUgZmluZFRhcmdldChNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gdGllOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9UaWUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9UaWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1NzM5Ny4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvVGllLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TY29wZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LkRlbGVnYXRlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0LkVQVEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcm90b2NvbC5NZXNzYWdlRGlzcGF0Y2hlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLmludGVybmFsLkRlbGVnYXRlQmFzZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5SdW50aW1lTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuTWVzc2FnZUluZm9VdGlsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5KQVhXU1Byb3BlcnRpZXM7Ci0KLS8qKgotICogRW50cnkgcG9pbnQgZm9yIGFsbCBzZXJ2ZXIgcmVxdWVzdHMuCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBUaWUgaW1wbGVtZW50cyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5UaWUgewotCi0gICAgLyoqCi0gICAgICogQ29tbW9uIGVudHJ5IHBvaW50IGZvciBzZXJ2ZXIgcnVudGltZS4gPGJyPgotICAgICAqIENyZWF0ZXMgYSBNZXNzYWdlSW5mbyBmb3IgZXZlcnkgUmVxdWVzdC9SZXNwb25zZS48YnI+Ci0gICAgICogQ3JlYXRlcyBhIFJ1bnRpbWVDb250ZXh0IGZvciBldmVyeSBSZXF1ZXN0L1Jlc3BvbnNlIGFuZCBzZXRzIHRoYXQgYXMgYSBtZXRhZGF0YSBpbgotICAgICAqIE1lc3NhZ2VJbmZvLiBEb2Vzbid0IGNyZWF0ZSBhbnkgb3RoZXIgbWV0YWRhdGEgb24gTWVzc2FnZUluZm8uIElmIGFueXRoaW5nIGlzIG5lZWRlZCwKLSAgICAgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIG9uIFJ1bnRpbWVDb250ZXh0PGJyPgotICAgICAqIEVQVEZhY3RvcnlGYWN0b3J5QmFzZSBpcyB1c2VkIHRvIHNlbGVjdCBhIGNvcnJlY3QgRVBURmFjdG9yeTxicj4KLSAgICAgKiBDYWxscyBNZXNzYWdlRGlzcGF0Y2hlci5yZWNlaXZlKE1lc3NhZ2VJbmZvKS4gPGJyPgotICAgICAqIE1lc3NhZ2VEaXNwYXRjaGVyIG9yY2hlc3RyYXRlcyBhbGwgdGhlIGZsb3c6IHJlYWRpbmcgZnJvbSBXU0Nvbm5lY3Rpb24sCi0gICAgICogZGVjb2RlcyBtZXNzYWdlIHRvIHBhcmFtZXRlcnMsIGludm9raW5nIGltcGxlbWVudG9yLCBlbmNvZGVzIHBhcmFtZXRlcnMgdG8gbWVzc2FnZSwKLSAgICAgKiBhbmQgd3JpdGluZyB0byBXU0Nvbm5lY3Rpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIGVuY2Fwc3VsYXRlcyBtdWx0aXBsZSB0cmFuc3BvcnRzCi0gICAgICogQHBhcmFtIGVuZHBvaW50IGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRhcmdldCBlbmRwb2ludAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHRocm93cyBFeGNlcHRpb24gaWYgYW55IGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZShXU0Nvbm5lY3Rpb24gY29ubmVjdGlvbiwKLSAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludCkKLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBDcmVhdGUgTWVzc2FnZUluZm8uIE1lc3NhZ2VJbmZvIGhvbGRzIGFsbCB0aGUgaW5mbyBmb3IgdGhpcyByZXF1ZXN0Ci0gICAgICAgIERlbGVnYXRlIGRlbGVnYXRlID0gbmV3IERlbGVnYXRlQmFzZSgpOwotICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbyA9IChNZXNzYWdlSW5mbylkZWxlZ2F0ZS5nZXRNZXNzYWdlU3RydWN0KCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHJ1bnRpbWUgY29udGV4dCwgcnVudGltZSBtb2RlbCBmb3IgZHluYW1pYyBydW50aW1lCi0gICAgICAgIFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvID0gKFJ1bnRpbWVFbmRwb2ludEluZm8pZW5kcG9pbnQ7Ci0gICAgICAgIFJ1bnRpbWVNb2RlbCBydW50aW1lTW9kZWwgPSBlbmRwb2ludEluZm8uZ2V0UnVudGltZU1vZGVsKCk7Ci0gICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ1bnRpbWVDb250ZXh0ID0gbmV3IFJ1bnRpbWVDb250ZXh0KHJ1bnRpbWVNb2RlbCk7Ci0gICAgICAgIHJ1bnRpbWVDb250ZXh0LnNldFJ1bnRpbWVFbmRwb2ludEluZm8oZW5kcG9pbnRJbmZvKTsKLQotICAgICAgICAvLyBVcGRhdGUgTWVzc2FnZUNvbnRleHQKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCA9Ci0gICAgICAgICAgICBlbmRwb2ludEluZm8uZ2V0V2ViU2VydmljZUNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICB1cGRhdGVNZXNzYWdlQ29udGV4dChlbmRwb2ludEluZm8sIG1zZ0N0eHQpOwotCi0gICAgICAgIC8vIFNldCBydW50aW1lIGNvbnRleHQgb24gTWVzc2FnZUluZm8KLSAgICAgICAgTWVzc2FnZUluZm9VdGlsLnNldFJ1bnRpbWVDb250ZXh0KG1lc3NhZ2VJbmZvLCBydW50aW1lQ29udGV4dCk7Ci0gICAgICAgIG1lc3NhZ2VJbmZvLnNldENvbm5lY3Rpb24oY29ubmVjdGlvbik7Ci0KLSAgICAgICAgLy8gU2VsZWN0IEVQVEZhY3RvcnkgYmFzZWQgb24gYmluZGluZywgYW5kIHRyYW5zcG9ydAotICAgICAgICBFUFRGYWN0b3J5IGVwdEZhY3RvcnkgPSBFUFRGYWN0b3J5RmFjdG9yeUJhc2UuZ2V0RVBURmFjdG9yeShtZXNzYWdlSW5mbyk7Ci0gICAgICAgIG1lc3NhZ2VJbmZvLnNldEVQVEZhY3RvcnkoZXB0RmFjdG9yeSk7Ci0KLSAgICAgICAgLy8gTWVzc2FnZURpc3BhdGNoZXIgYXJjaGVzdHJhdGVzIHRoZSBmbG93Ci0gICAgICAgIE1lc3NhZ2VEaXNwYXRjaGVyIG1lc3NhZ2VEaXNwYXRjaGVyID0KLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldEVQVEZhY3RvcnkoKS5nZXRNZXNzYWdlRGlzcGF0Y2hlcihtZXNzYWdlSW5mbyk7Ci0gICAgICAgIG1lc3NhZ2VEaXNwYXRjaGVyLnJlY2VpdmUobWVzc2FnZUluZm8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgTWVzc2FnZUNvbnRleHQgb2JqZWN0IHdpdGggU2VydmljZSwgYW5kIFBvcnQgUU5hbWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lc3NhZ2VDb250ZXh0KCBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50LAotICAgICAgICBNZXNzYWdlQ29udGV4dCBjdHh0KSB7Ci0KLSAgICAgICAgY3R4dC5wdXQoTWVzc2FnZUNvbnRleHQuV1NETF9TRVJWSUNFLCBlbmRwb2ludC5nZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgY3R4dC5zZXRTY29wZShNZXNzYWdlQ29udGV4dC5XU0RMX1NFUlZJQ0UsIFNjb3BlLkFQUExJQ0FUSU9OKTsKLSAgICAgICAgY3R4dC5wdXQoTWVzc2FnZUNvbnRleHQuV1NETF9QT1JULCBlbmRwb2ludC5nZXRQb3J0TmFtZSgpKTsKLSAgICAgICAgY3R4dC5zZXRTY29wZShNZXNzYWdlQ29udGV4dC5XU0RMX1BPUlQsIFNjb3BlLkFQUExJQ0FUSU9OKTsKLSAgICAgICAgY3R4dC5wdXQoSkFYV1NQcm9wZXJ0aWVzLk1UT01fVEhSRVNIT0xPRF9WQUxVRSwgZW5kcG9pbnQuZ2V0TXRvbVRocmVzaG9sZCgpKTsKLSAgICAgICAgY3R4dC5zZXRTY29wZShKQVhXU1Byb3BlcnRpZXMuTVRPTV9USFJFU0hPTE9EX1ZBTFVFLCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvVW5zdXBwb3J0ZWRNZWRpYUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1Vuc3VwcG9ydGVkTWVkaWFFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTVjZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1Vuc3VwcG9ydGVkTWVkaWFFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5leGNlcHRpb24uSkFYV1NFeGNlcHRpb25CYXNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5TZXJ2ZXJNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICoge0BsaW5rIENvZGVjfSB0aHJvd3MgdGhpcyBleGNlcHRpb24gd2hlbiBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgcmVxdWVzdCBtZXNzYWdlJ3MKKyAqIENvbnRlbnQtVHlwZQorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVuc3VwcG9ydGVkTWVkaWFFeGNlcHRpb24gZXh0ZW5kcyBKQVhXU0V4Y2VwdGlvbkJhc2UgeworCisgICAgcHVibGljIFVuc3VwcG9ydGVkTWVkaWFFeGNlcHRpb24oIEBOb3ROdWxsIFN0cmluZyBjb250ZW50VHlwZSwgTGlzdDxTdHJpbmc+IGV4cGVjdGVkQ29udGVudFR5cGVzKSB7CisgICAgICAgIHN1cGVyKFNlcnZlck1lc3NhZ2VzLmxvY2FsaXphYmxlVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFKGNvbnRlbnRUeXBlLCBleHBlY3RlZENvbnRlbnRUeXBlcykpOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1cHBvcnRlZE1lZGlhRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcihTZXJ2ZXJNZXNzYWdlcy5sb2NhbGl6YWJsZU5PX0NPTlRFTlRfVFlQRSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLnNlcnZlciI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvV1NETEdlblJlc29sdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvV1NETEdlblJlc29sdmVyLmphdmEKaW5kZXggNDk5MmJmZi4uNGFkY2E4YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL1dTRExHZW5SZXNvbHZlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9XU0RMR2VuUmVzb2x2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyMzAgKzI1LDE3MyBAQAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlcjsKIAotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5Eb2NJbmZvLkRPQ19UWVBFOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLlNlcnZpY2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuV1NETE91dHB1dFJlc29sdmVyOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5NdXRhYmxlWE1MU3RyZWFtQnVmZmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuWE1MU3RyZWFtQnVmZmVyUmVzdWx0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuU0REb2N1bWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlNERG9jdW1lbnRTb3VyY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuV1NETFJlc29sdmVyOwogCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CiBpbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqIFdTRExHZW5lcmF0b3IgdXNlcyBXU0RMUmVzb2x2ZXIgd2hpbGUgY3JlYXRpbmcgV1NETCBhcnRpZmFjdHMuIFdTRExSZXNvbHZlcgorICogaXMgdXNlZCB0byBjb250cm9sIHRoZSBmaWxlIG5hbWVzIGFuZCB3aGljaCBhcnRpZmFjdCB0byBiZSBnZW5lcmF0ZWQgb3Igbm90LgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CiAgKi8KK2ZpbmFsIGNsYXNzIFdTRExHZW5SZXNvbHZlciBpbXBsZW1lbnRzIFdTRExSZXNvbHZlciB7CiAKLXB1YmxpYyBjbGFzcyBXU0RMR2VuUmVzb2x2ZXIgaW1wbGVtZW50cyBXU0RMT3V0cHV0UmVzb2x2ZXIgeworICAgIHByaXZhdGUgZmluYWwgTGlzdDxTRERvY3VtZW50SW1wbD4gZG9jczsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U0REb2N1bWVudFNvdXJjZT4gbmV3RG9jcyA9IG5ldyBBcnJheUxpc3Q8U0REb2N1bWVudFNvdXJjZT4oKTsKKyAgICBwcml2YXRlIFNERG9jdW1lbnRTb3VyY2UgY29uY3JldGVXc2RsU291cmNlOwogCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBEb2NJbmZvPiBkb2NzOwotICAgIHByaXZhdGUgRG9jSW5mbyBhYnN0cmFjdFdzZGw7Ci0gICAgcHJpdmF0ZSBEb2NJbmZvIGNvbmNyZXRlV3NkbDsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gbnNNYXBwaW5nOyAgICAvLyB0YXJnZXROUyAtPiBzeXN0ZW0gaWQgbGlzdAorICAgIHByaXZhdGUgU0REb2N1bWVudEltcGwgYWJzdHJhY3RXc2RsOworICAgIHByaXZhdGUgU0REb2N1bWVudEltcGwgY29uY3JldGVXc2RsOwogCi0gICAgcHVibGljIFdTRExHZW5SZXNvbHZlcihNYXA8U3RyaW5nLCBEb2NJbmZvPiBkb2NzKSB7CisgICAgLyoqCisgICAgICogdGFyZ2V0TlMgLT4gc2NoZW1hIGRvY3VtZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U0REb2N1bWVudEltcGw+PiBuc01hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTGlzdDxTRERvY3VtZW50SW1wbD4+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFFOYW1lIHNlcnZpY2VOYW1lOworICAgIHByaXZhdGUgZmluYWwgUU5hbWUgcG9ydFR5cGVOYW1lOworCisgICAgcHVibGljIFdTRExHZW5SZXNvbHZlcihATm90TnVsbCBMaXN0PFNERG9jdW1lbnRJbXBsPiBkb2NzLFFOYW1lIHNlcnZpY2VOYW1lLFFOYW1lIHBvcnRUeXBlTmFtZSkgewogICAgICAgICB0aGlzLmRvY3MgPSBkb2NzOwotICAgICAgICBuc01hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgU2V0PEVudHJ5PFN0cmluZywgRG9jSW5mbz4+IGRvY0VudHJpZXMgPSBkb2NzLmVudHJ5U2V0KCk7Ci0gICAgICAgIGZvcihFbnRyeTxTdHJpbmcsIERvY0luZm8+IGVudHJ5IDogZG9jRW50cmllcykgewotICAgICAgICAgICAgRG9jSW5mbyBkb2NJbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChkb2NJbmZvLmlzSGF2aW5nUG9ydFR5cGUoKSkgewotICAgICAgICAgICAgICAgIGFic3RyYWN0V3NkbCA9IGRvY0luZm87CisgICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgdGhpcy5wb3J0VHlwZU5hbWUgPSBwb3J0VHlwZU5hbWU7CisKKyAgICAgICAgZm9yIChTRERvY3VtZW50SW1wbCBkb2MgOiBkb2NzKSB7CisgICAgICAgICAgICBpZihkb2MuaXNXU0RMKCkpIHsKKyAgICAgICAgICAgICAgICBTRERvY3VtZW50LldTREwgd3NkbCA9IChTRERvY3VtZW50LldTREwpIGRvYzsKKyAgICAgICAgICAgICAgICBpZih3c2RsLmhhc1BvcnRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0V3NkbCA9IGRvYzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkb2NJbmZvLmdldERvY1R5cGUoKSA9PSBET0NfVFlQRS5TQ0hFTUEpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc3lzSWRzID0gbnNNYXBwaW5nLmdldChkb2NJbmZvLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKKyAgICAgICAgICAgIGlmKGRvYy5pc1NjaGVtYSgpKSB7CisgICAgICAgICAgICAgICAgU0REb2N1bWVudC5TY2hlbWEgc2NoZW1hID0gKFNERG9jdW1lbnQuU2NoZW1hKSBkb2M7CisgICAgICAgICAgICAgICAgTGlzdDxTRERvY3VtZW50SW1wbD4gc3lzSWRzID0gbnNNYXBwaW5nLmdldChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwogICAgICAgICAgICAgICAgIGlmIChzeXNJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzeXNJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgbnNNYXBwaW5nLnB1dChkb2NJbmZvLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzeXNJZHMpOworICAgICAgICAgICAgICAgICAgICBzeXNJZHMgPSBuZXcgQXJyYXlMaXN0PFNERG9jdW1lbnRJbXBsPigpOworICAgICAgICAgICAgICAgICAgICBuc01hcHBpbmcucHV0KHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc3lzSWRzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3lzSWRzLmFkZChkb2NJbmZvLmdldFVybCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHN5c0lkcy5hZGQoZG9jKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBjb25jcmV0ZVdzZGwuZ2V0VXJsKCkudG9TdHJpbmcoKTsKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGNvbmNyZXRlIFdTREwgdGhhdCBjb250YWlucyBzZXJ2aWNlIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlc3VsdCB0aGUgZ2VuZXJhdGVkIGNvbmNyZXRlIFdTREwKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzdWx0IGdldFdTREwoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIFVSTCB1cmwgPSBjcmVhdGVVUkwoZmlsZW5hbWUpOworICAgICAgICBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIHhzYiA9IG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCk7CisgICAgICAgIHhzYi5zZXRTeXN0ZW1JZCh1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgIGNvbmNyZXRlV3NkbFNvdXJjZSA9IFNERG9jdW1lbnRTb3VyY2UuY3JlYXRlKHVybCx4c2IpOworICAgICAgICBuZXdEb2NzLmFkZChjb25jcmV0ZVdzZGxTb3VyY2UpOworICAgICAgICBYTUxTdHJlYW1CdWZmZXJSZXN1bHQgciA9IG5ldyBYTUxTdHJlYW1CdWZmZXJSZXN1bHQoeHNiKTsKKyAgICAgICAgci5zZXRTeXN0ZW1JZChmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiByOwogICAgIH0KIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBEb2NJbmZvPiBnZXREb2NzKCkgewotICAgICAgICByZXR1cm4gZG9jczsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBSZXN1bHQgZ2V0V1NETE91dHB1dChTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgU3RyZWFtRG9jSW5mbyBkb2NJbmZvID0gbmV3IFN0cmVhbURvY0luZm8oc3VnZ2VzdGVkRmlsZU5hbWUsIGJvdXQpOwotCi0gICAgICAgIGlmICh3c2RsRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkb2NJbmZvLnNldFF1ZXJ5U3RyaW5nKCJ3c2RsIik7Ci0gICAgICAgICAgICB3c2RsRmlsZSA9IHN1Z2dlc3RlZEZpbGVOYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG9jSW5mby5zZXRRdWVyeVN0cmluZygid3NkbD0iK3N1Z2dlc3RlZEZpbGVOYW1lKTsKKyAgICAvKioKKyAgICAgKiBBdCBwcmVzZW50LCBpdCByZXR1cm5zIGZpbGUgVVJMIHNjaGVtZSBldmVudGhvdWdoIHRoZXJlIGlzIG5vIHJlc291cmNlCisgICAgICogaW4gdGhlIGZpbGVzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVSTCBvZiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50CisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIFVSTCBjcmVhdGVVUkwoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCgiZmlsZTovLy8iK2ZpbGVuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEkgcmVhbGx5IGRvbid0IHRoaW5rIHRoaXMgaXMgdGhlIHJpZ2h0IHdheSB0byBoYW5kbGUgdGhpcyBlcnJvciwKKyAgICAgICAgICAgIC8vIFdTRExSZXNvbHZlciBuZWVkcyB0byBiZSBkb2N1bWVudGVkIGNhcmVmdWxseS4KKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwogICAgICAgICB9Ci0gICAgICAgIGRvY3MucHV0KGRvY0luZm8uZ2V0UGF0aCgpLCAgZG9jSW5mbyk7Ci0KLSAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoKTsKLSAgICAgICAgcmVzdWx0LnNldE91dHB1dFN0cmVhbShib3V0KTsKLSAgICAgICAgcmVzdWx0LnNldFN5c3RlbUlkKHN1Z2dlc3RlZEZpbGVOYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgICovCi0KLSAgICBwdWJsaWMgUmVzdWx0IGdldFNjaGVtYU91dHB1dChTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHsKLSAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJvdXQgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7Ci0KLSAgICAgICAgU3RyZWFtRG9jSW5mbyBkb2NJbmZvID0gbmV3IFN0cmVhbURvY0luZm8oc3VnZ2VzdGVkRmlsZU5hbWUsIGJvdXQpOwotICAgICAgICBkb2NJbmZvLnNldFF1ZXJ5U3RyaW5nKCJ4c2Q9IitzdWdnZXN0ZWRGaWxlTmFtZSk7Ci0gICAgICAgIGRvY0luZm8uc2V0RG9jVHlwZShET0NfVFlQRS5TQ0hFTUEpOwotICAgICAgICBkb2NzLnB1dChkb2NJbmZvLmdldFVybCgpLnRvU3RyaW5nKCksICBkb2NJbmZvKTsKLQotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCgpOwotICAgICAgICByZXN1bHQuc2V0T3V0cHV0U3RyZWFtKGJvdXQpOwotICAgICAgICByZXN1bHQuc2V0U3lzdGVtSWQoZG9jSW5mby5nZXRVcmwoKS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICAvKgotICAgICAqIHJldHVybiBudWxsIGlmIGNvbmNyZXRlIFdTREwgbmVlZCBub3QgYmUgZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFJlc3VsdCBnZXRXU0RMT3V0cHV0KFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYm91dCA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKLSAgICAgICAgU3RyZWFtRG9jSW5mbyBkb2NJbmZvID0gbmV3IFN0cmVhbURvY0luZm8oZmlsZW5hbWUsIGJvdXQpOwotICAgICAgICBkb2NJbmZvLnNldERvY1R5cGUoRE9DX1RZUEUuV1NETCk7Ci0gICAgICAgIGRvY0luZm8uc2V0UXVlcnlTdHJpbmcoIndzZGwiKTsKLSAgICAgICAgY29uY3JldGVXc2RsID0gZG9jSW5mbzsKLSAgICAgICAgZG9jcy5wdXQoZG9jSW5mby5nZXRVcmwoKS50b1N0cmluZygpLCAgZG9jSW5mbyk7Ci0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KCk7Ci0gICAgICAgIHJlc3VsdC5zZXRPdXRwdXRTdHJlYW0oYm91dCk7Ci0gICAgICAgIHJlc3VsdC5zZXRTeXN0ZW1JZChkb2NJbmZvLmdldFVybCgpLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qCisgICAgLyoqCiAgICAgICogVXBkYXRlcyBmaWxlbmFtZSBpZiB0aGUgc3VnZ2VzdGVkIGZpbGVuYW1lIG5lZWQgdG8gYmUgY2hhbmdlZCBpbgotICAgICAqIHdzZGw6aW1wb3J0CisgICAgICogd3NkbDppbXBvcnQuIElmIHRoZSBtZXRhZGF0YSBhbHJlYWR5IGNvbnRhaW5zIGFic3RyYWN0IHdzZGwoaS5lLiBhIFdTREwKKyAgICAgKiB3aGljaCBoYXMgdGhlIHBvcnR0eXBlKSwgdGhlbiB0aGUgYWJzdHJhY3Qgd3NkbCBzaG91bGRuJ3QgYmUgZ2VuZXJhdGVkCiAgICAgICoKICAgICAgKiByZXR1cm4gbnVsbCBpZiBhYnN0cmFjdCBXU0RMIG5lZWQgbm90IGJlIGdlbmVyYXRlZAorICAgICAqICAgICAgICBSZXN1bHQgdGhlIGFic3RyYWN0IFdTREwKICAgICAgKi8KLSAgICBwdWJsaWMgUmVzdWx0IGdldEFic3RyYWN0V1NETE91dHB1dChIb2xkZXI8U3RyaW5nPiBmaWxlbmFtZSkgeworICAgIHB1YmxpYyBSZXN1bHQgZ2V0QWJzdHJhY3RXU0RMKEhvbGRlcjxTdHJpbmc+IGZpbGVuYW1lKSB7CiAgICAgICAgIGlmIChhYnN0cmFjdFdzZGwgIT0gbnVsbCkgewotICAgICAgICAgICAgZmlsZW5hbWUudmFsdWUgPSBhYnN0cmFjdFdzZGwuZ2V0VXJsKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZpbGVuYW1lLnZhbHVlID0gYWJzdHJhY3RXc2RsLmdldFVSTCgpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZ2VuZXJhdGUgYWJzdHJhY3QgV1NETAogICAgICAgICB9Ci0gICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBib3V0ID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigpOwotICAgICAgICBTdHJlYW1Eb2NJbmZvIGFic3RyYWN0V3NkbCA9IG5ldyBTdHJlYW1Eb2NJbmZvKGZpbGVuYW1lLnZhbHVlLCBib3V0KTsKLSAgICAgICAgYWJzdHJhY3RXc2RsLnNldERvY1R5cGUoRE9DX1RZUEUuV1NETCk7Ci0gICAgICAgIC8vYWJzdHJhY3RXc2RsLnNldFF1ZXJ5U3RyaW5nKCJ3c2RsPSIrZmlsZW5hbWUudmFsdWUpOwotICAgICAgICBkb2NzLnB1dChhYnN0cmFjdFdzZGwuZ2V0VXJsKCkudG9TdHJpbmcoKSwgIGFic3RyYWN0V3NkbCk7Ci0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KCk7Ci0gICAgICAgIHJlc3VsdC5zZXRPdXRwdXRTdHJlYW0oYm91dCk7Ci0gICAgICAgIHJlc3VsdC5zZXRTeXN0ZW1JZChhYnN0cmFjdFdzZGwuZ2V0VXJsKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFVSTCB1cmwgPSBjcmVhdGVVUkwoZmlsZW5hbWUudmFsdWUpOworICAgICAgICBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyIHhzYiA9IG5ldyBNdXRhYmxlWE1MU3RyZWFtQnVmZmVyKCk7CisgICAgICAgIHhzYi5zZXRTeXN0ZW1JZCh1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgIFNERG9jdW1lbnRTb3VyY2UgYWJzdHJhY3RXc2RsU291cmNlID0gU0REb2N1bWVudFNvdXJjZS5jcmVhdGUodXJsLHhzYik7CisgICAgICAgIG5ld0RvY3MuYWRkKGFic3RyYWN0V3NkbFNvdXJjZSk7CisgICAgICAgIFhNTFN0cmVhbUJ1ZmZlclJlc3VsdCByID0gbmV3IFhNTFN0cmVhbUJ1ZmZlclJlc3VsdCh4c2IpOworICAgICAgICByLnNldFN5c3RlbUlkKGZpbGVuYW1lLnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHI7CiAgICAgfQogCi0gICAgLyoKKyAgICAvKioKICAgICAgKiBVcGRhdGVzIGZpbGVuYW1lIGlmIHRoZSBzdWdnZXN0ZWQgZmlsZW5hbWUgbmVlZCB0byBiZSBjaGFuZ2VkIGluCi0gICAgICogeHNkOmltcG9ydAorICAgICAqIHhzZDppbXBvcnQuIElmIHRoZXJlIGlzIGFscmVhZHkgYSBzY2hlbWEgZG9jdW1lbnQgZm9yIHRoZSBuYW1lc3BhY2UKKyAgICAgKiBpbiB0aGUgbWV0YWRhdGEsIHRoZW4gaXQgaXMgbm90IGdlbmVyYXRlZC4KICAgICAgKgogICAgICAqIHJldHVybiBudWxsIGlmIHNjaGVtYSBuZWVkIG5vdCBiZSBnZW5lcmF0ZWQKKyAgICAgKiAgICAgICAgUmVzdWx0IHRoZSBnZW5lcmF0ZWQgc2NoZW1hIGRvY3VtZW50CiAgICAgICovCiAgICAgcHVibGljIFJlc3VsdCBnZXRTY2hlbWFPdXRwdXQoU3RyaW5nIG5hbWVzcGFjZSwgSG9sZGVyPFN0cmluZz4gZmlsZW5hbWUpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHNjaGVtYXMgPSBuc01hcHBpbmcuZ2V0KG5hbWVzcGFjZSk7CisgICAgICAgIExpc3Q8U0REb2N1bWVudEltcGw+IHNjaGVtYXMgPSBuc01hcHBpbmcuZ2V0KG5hbWVzcGFjZSk7CiAgICAgICAgIGlmIChzY2hlbWFzICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChzY2hlbWFzLnNpemUoKSA+IDEpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNlcnZlci5ydC5lcnIiLAogICAgICAgICAgICAgICAgICAgICAiTW9yZSB0aGFuIG9uZSBzY2hlbWEgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlICIrbmFtZXNwYWNlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbGVuYW1lLnZhbHVlID0gc2NoZW1hcy5nZXQoMCk7CisgICAgICAgICAgICBmaWxlbmFtZS52YWx1ZSA9IHNjaGVtYXMuZ2V0KDApLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgICAgICAgICAvLyBEb24ndCBnZW5lcmF0ZSBzY2hlbWEKICAgICAgICAgfQotICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYm91dCA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKLSAgICAgICAgU3RyZWFtRG9jSW5mbyBkb2NJbmZvID0gbmV3IFN0cmVhbURvY0luZm8oZmlsZW5hbWUudmFsdWUsIGJvdXQpOwotICAgICAgICBkb2NJbmZvLnNldERvY1R5cGUoRE9DX1RZUEUuU0NIRU1BKTsKLSAgICAgICAgLy9kb2NJbmZvLnNldFF1ZXJ5U3RyaW5nKCJ4c2Q9IitmaWxlbmFtZS52YWx1ZSk7Ci0gICAgICAgIGRvY3MucHV0KGRvY0luZm8uZ2V0VXJsKCkudG9TdHJpbmcoKSwgIGRvY0luZm8pOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCgpOwotICAgICAgICByZXN1bHQuc2V0T3V0cHV0U3RyZWFtKGJvdXQpOwotICAgICAgICByZXN1bHQuc2V0U3lzdGVtSWQoZG9jSW5mby5nZXRVcmwoKS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICBVUkwgdXJsID0gY3JlYXRlVVJMKGZpbGVuYW1lLnZhbHVlKTsKKyAgICAgICAgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlciB4c2IgPSBuZXcgTXV0YWJsZVhNTFN0cmVhbUJ1ZmZlcigpOworICAgICAgICB4c2Iuc2V0U3lzdGVtSWQodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICBTRERvY3VtZW50U291cmNlIHNkID0gU0REb2N1bWVudFNvdXJjZS5jcmVhdGUodXJsLHhzYik7CisgICAgICAgIG5ld0RvY3MuYWRkKHNkKTsKKworICAgICAgICBYTUxTdHJlYW1CdWZmZXJSZXN1bHQgciA9IG5ldyBYTUxTdHJlYW1CdWZmZXJSZXN1bHQoeHNiKTsKKyAgICAgICAgci5zZXRTeXN0ZW1JZChmaWxlbmFtZS52YWx1ZSk7CisgICAgICAgIHJldHVybiByOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmVhbURvY0luZm8gaW1wbGVtZW50cyBEb2NJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBCeXRlQXJyYXlCdWZmZXIgYm91dDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2U7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5U3RyaW5nOwotICAgICAgICAgICAgICAgIHByaXZhdGUgRE9DX1RZUEUgZG9jVHlwZTsKLQotICAgICAgICBwdWJsaWMgU3RyZWFtRG9jSW5mbyhTdHJpbmcgcmVzb3VyY2UsIEJ5dGVBcnJheUJ1ZmZlciBib3V0KSB7Ci0gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0gICAgICAgICAgICB0aGlzLmJvdXQgPSBib3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldERvYygpIHsKLSAgICAgICAgICAgIGJvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBib3V0Lm5ld0lucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVVJMIGdldFVybCgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoImZpbGU6Ly8vIityZXNvdXJjZSk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0KKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBTRERvY3VtZW50U291cmNlIHRvIFNERG9jdW1lbnRJbXBsIGFuZCB1cGRhdGVzIG9yaWdpbmFsIGRvY3MuIEl0CisgICAgICogY2F0ZWdvcmllcyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50cyBpbnRvIFdTREwsIFNjaGVtYSB0eXBlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByaW1hcnkgV1NETAorICAgICAqICAgICAgICAgbnVsbCBpZiBpdCBpcyBub3QgdGhlcmUgaW4gdGhlIGdlbmVyYXRlZCBkb2N1bWVudHMKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTRERvY3VtZW50SW1wbCB1cGRhdGVEb2NzKCkgeworICAgICAgICBmb3IgKFNERG9jdW1lbnRTb3VyY2UgZG9jIDogbmV3RG9jcykgeworICAgICAgICAgICAgU0REb2N1bWVudEltcGwgZG9jSW1wbCA9IFNERG9jdW1lbnRJbXBsLmNyZWF0ZShkb2Msc2VydmljZU5hbWUscG9ydFR5cGVOYW1lKTsKKyAgICAgICAgICAgIGlmIChkb2MgPT0gY29uY3JldGVXc2RsU291cmNlKSB7CisgICAgICAgICAgICAgICAgY29uY3JldGVXc2RsID0gZG9jSW1wbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgZG9jcy5hZGQoZG9jSW1wbCk7CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyaW5nKSB7Ci0gICAgICAgICAgICB0aGlzLnF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREb2NUeXBlKERPQ19UWVBFIGRvY1R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVHlwZSA9IGRvY1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRE9DX1RZUEUgZ2V0RG9jVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBkb2NUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBucykgewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpIHsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SGF2aW5nUG9ydFR5cGUoYm9vbGVhbiBwb3J0VHlwZSkgewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0hhdmluZ1BvcnRUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25jcmV0ZVdzZGw7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvV1NETFBhdGNoZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9XU0RMUGF0Y2hlci5qYXZhCmluZGV4IDEwZDZiM2UuLmJiMDY0NTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9XU0RMUGF0Y2hlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9XU0RMUGF0Y2hlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDI4MiArMjIsMjI1IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Qb3J0QWRkcmVzc1Jlc29sdmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuV1NFbmRwb2ludDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkRvY3VtZW50QWRkcmVzc1Jlc29sdmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuU0REb2N1bWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YTUxTdHJlYW1SZWFkZXJUb1hNTFN0cmVhbVdyaXRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYWRkcmVzc2luZy5XM0NBZGRyZXNzaW5nQ29uc3RhbnRzOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MRXZlbnRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MRXZlbnRSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxFdmVudFdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5ldmVudHMuQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uZXZlbnRzLlN0YXJ0RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLmV2ZW50cy5TdGFydERvY3VtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uZXZlbnRzLlhNTEV2ZW50OwotcHVibGljIGNsYXNzIFdTRExQYXRjaGVyIHsKKworLyoqCisgKiBQYXRjaGVzIFdTREwgd2l0aCB0aGUgY29ycmVjdCBlbmRwb2ludCBhZGRyZXNzIGFuZCB0aGUgcmVsYXRpdmUgcGF0aHMKKyAqIHRvIG90aGVyIGRvY3VtZW50cy4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitmaW5hbCBjbGFzcyBXU0RMUGF0Y2hlciBleHRlbmRzIFhNTFN0cmVhbVJlYWRlclRvWE1MU3RyZWFtV3JpdGVyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOU19YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1NDSEVNQSA9IG5ldyBRTmFtZShOU19YU0QsICJzY2hlbWEiKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBTQ0hFTUFfSU5DTFVERV9RTkFNRSA9IG5ldyBRTmFtZShOU19YU0QsICJpbmNsdWRlIik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgU0NIRU1BX0lNUE9SVF9RTkFNRSA9IG5ldyBRTmFtZShOU19YU0QsICJpbXBvcnQiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBBVFRSX05BTUVfUU5BTUUgPSBuZXcgUU5hbWUoIiIsICJuYW1lIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgQVRUUl9UQVJHRVROU19RTkFNRSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoIiIsICJ0YXJnZXROYW1lc3BhY2UiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0RMX0xPQ0FUSU9OX1FOQU1FID0gbmV3IFFOYW1lKCIiLCAibG9jYXRpb24iKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBTQ0hFTUFfTE9DQVRJT05fUU5BTUUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCIiLCAic2NoZW1hTG9jYXRpb24iKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTEV2ZW50RmFjdG9yeSBldmVudEZhY3RvcnkgPQotICAgICAgICAgICAgWE1MRXZlbnRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MT3V0cHV0RmFjdG9yeSBvdXRwdXRGYWN0b3J5ID0KLSAgICAgICAgICAgIFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxJbnB1dEZhY3RvcnkgaW5wdXRGYWN0b3J5ID0KLSAgICAgICAgICAgIFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9Ci0gICAgICAgIExvZ2dlci5nZXRMb2dnZXIoCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoCiAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi53c2RsLnBhdGNoZXIiKTsKIAotICAgIHByaXZhdGUgRG9jSW5mbyBkb2NJbmZvOwotICAgIHByaXZhdGUgU3RyaW5nIGJhc2VBZGRyZXNzOwotICAgIHByaXZhdGUgUnVudGltZUVuZHBvaW50SW5mbyB0YXJnZXRFbmRwb2ludDsKLSAgICBwcml2YXRlIExpc3Q8UnVudGltZUVuZHBvaW50SW5mbz4gZW5kcG9pbnRzOwotCi0gICAgLyoKLSAgICAgKiBpblBhdGggLSAvV0VCLUlORi93c2RsL3h4eC53c2RsCi0gICAgICogYmFzZUFkZHJlc3MgLSBodHRwOi8vaG9zdDpwb3J0L2NvbnRleHQvCisgICAgLyoqCisgICAgICoge0BsaW5rIFdTRW5kcG9pbnR9IHRoYXQgb3ducyB0aGUgV1NETCB3ZSBhcmUgcGF0Y2hpbmcgcmlnaHQgbm93LgogICAgICAqLwotICAgIHB1YmxpYyBXU0RMUGF0Y2hlcihEb2NJbmZvIGRvY0luZm8sIFN0cmluZyBiYXNlQWRkcmVzcywKLSAgICAgICAgICAgIFJ1bnRpbWVFbmRwb2ludEluZm8gdGFyZ2V0RW5kcG9pbnQsCi0gICAgICAgICAgICBMaXN0PFJ1bnRpbWVFbmRwb2ludEluZm8+IGVuZHBvaW50cykgewotICAgICAgICB0aGlzLmRvY0luZm8gPSBkb2NJbmZvOwotICAgICAgICB0aGlzLmJhc2VBZGRyZXNzID0gYmFzZUFkZHJlc3M7Ci0gICAgICAgIHRoaXMudGFyZ2V0RW5kcG9pbnQgPSB0YXJnZXRFbmRwb2ludDsKLSAgICAgICAgdGhpcy5lbmRwb2ludHMgPSBlbmRwb2ludHM7CisgICAgcHJpdmF0ZSBmaW5hbCBXU0VuZHBvaW50SW1wbDw/PiBlbmRwb2ludDsKKworICAgIC8qKgorICAgICAqIERvY3VtZW50IHRoYXQgaXMgYmVpbmcgcGF0Y2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNERG9jdW1lbnRJbXBsIGN1cnJlbnQ7CisKKyAgICBwcml2YXRlIGZpbmFsIERvY3VtZW50QWRkcmVzc1Jlc29sdmVyIHJlc29sdmVyOworICAgIHByaXZhdGUgZmluYWwgUG9ydEFkZHJlc3NSZXNvbHZlciBwb3J0QWRkcmVzc1Jlc29sdmVyOworCisKKyAgICAvLworICAgIC8vIGZpZWxkcyBhY2N1bXVsYXRlZCBhcyB3ZSBwYXJzZSB0aHJvdWdoIGRvY3VtZW50cworICAgIC8vCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOworICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWU7CisgICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZTsKKworICAgIHByaXZhdGUgZW51bSBFUFJfQUREUkVTU19TVEFURSB7SU4sIE9VVCwgRE9ORX0KKyAgICBwcml2YXRlIEVQUl9BRERSRVNTX1NUQVRFIGVwckFkZHJlc3NTdGF0ZSA9IEVQUl9BRERSRVNTX1NUQVRFLk9VVDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgV1NETFBhdGNoZXJ9IGZvciBwYXRjaGluZyBXU0RMLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZHBvaW50CisgICAgICogICAgICBUaGUgZW5kcG9pbnQgdGhhdCB3ZSBhcmUgcGF0Y2hpbmlnIFdTREwgZm9yLiBUaGlzIG9iamVjdCBpcyBjb25zdWx0ZWQKKyAgICAgKiAgICAgIHRvIGNoZWNrIG90aGVyIHtAbGluayBTRERvY3VtZW50fXMuIE11c3Qgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIGN1cnJlbnQKKyAgICAgKiAgICAgIFRoZSBkb2N1bWVudCB0aGF0IHdlIGFyZSBwYXRjaGluZy4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gcG9ydEFkZHJlc3NSZXNvbHZlcgorICAgICAqICAgICAgYWRkcmVzcyBvZiB0aGUgZW5kcG9pbnQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhpcyByZXNvbHZlci4KKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXIKKyAgICAgKiAgICAgIENvbnN1bHRlZCB0byBnZW5lcmF0ZSByZWZlcmVuY2VzIGFtb25nICB7QGxpbmsgU0REb2N1bWVudH1zLgorICAgICAqICAgICAgTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV1NETFBhdGNoZXIoV1NFbmRwb2ludEltcGw8Pz4gZW5kcG9pbnQsIFNERG9jdW1lbnRJbXBsIGN1cnJlbnQsCisgICAgICAgICAgICBQb3J0QWRkcmVzc1Jlc29sdmVyIHBvcnRBZGRyZXNzUmVzb2x2ZXIsIERvY3VtZW50QWRkcmVzc1Jlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKKyAgICAgICAgdGhpcy5jdXJyZW50ID0gY3VycmVudDsKKyAgICAgICAgdGhpcy5wb3J0QWRkcmVzc1Jlc29sdmVyID0gcG9ydEFkZHJlc3NSZXNvbHZlcjsKKyAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwogICAgIH0KIAotICAgIC8qCi0gICAgICogaW1wb3J0LCBpbmNsdWRlLCBzb2FwOmFkZHJlc3MgbG9jYXRpb25zIGFyZSBwYXRjaGVkCi0gICAgICogY2FsbGVyIG5lZWRzIHRvIHRha2UgY2FyZSBvZiBjbG9zaW5nIG9mIHRoZSBzdHJlYW1zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGF0Y2hEb2MoSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICAgICAgWE1MRXZlbnRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgWE1MRXZlbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxFdmVudFJlYWRlcihpbik7Ci0gICAgICAgICAgICBTdGFydEVsZW1lbnQgc3RhcnQgPSBudWxsOwotICAgICAgICAgICAgUU5hbWUgc2VydmljZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZShyZWFkZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgWE1MRXZlbnQgZXZlbnQgPSByZWFkZXIubmV4dEV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmlzU3RhcnREb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXJ0RG9jdW1lbnQgc2QgPSAoU3RhcnREb2N1bWVudClldmVudDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gc2QuZW5jb2RpbmdTZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBzZC5nZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IChlbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBvdXRwdXRGYWN0b3J5LmNyZWF0ZVhNTEV2ZW50V3JpdGVyKG91dCwgZW5jb2RpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MRXZlbnRXcml0ZXIob3V0KTsKLSAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuaXNTdGFydEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGV2ZW50LmFzU3RhcnRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBzdGFydC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhTQ0hFTUFfSU5DTFVERV9RTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gaGFuZGxlU2NoZW1hSW5jbHVkZShzdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoU0NIRU1BX0lNUE9SVF9RTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gaGFuZGxlU2NoZW1hSW1wb3J0KHN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX0lNUE9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gaGFuZGxlV1NETEltcG9ydChzdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5OU19TT0FQX0JJTkRJTkdfQUREUkVTUykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLk5TX1NPQVAxMl9CSU5ESU5HX0FERFJFU1MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IGhhbmRsZVNvYXBBZGRyZXNzKHNlcnZpY2VOYW1lLCBwb3J0TmFtZSwgc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfREVGSU5JVElPTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IHN0YXJ0LmdldEF0dHJpYnV0ZUJ5TmFtZShBVFRSX1RBUkdFVE5TX1FOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBzdGFydC5nZXRBdHRyaWJ1dGVCeU5hbWUoQVRUUl9OQU1FX1FOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9QT1JUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBzdGFydC5nZXRBdHRyaWJ1dGVCeU5hbWUoQVRUUl9OQU1FX1FOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmFkZChldmVudCk7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQXR0cmlidXRlKGludCBpKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgUU5hbWUgbmFtZSA9IGluLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGF0dExvY2FsTmFtZSA9IGluLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKTsKKworICAgICAgICBpZigobmFtZS5lcXVhbHMoU0NIRU1BX0lOQ0xVREVfUU5BTUUpICYmIGF0dExvY2FsTmFtZS5lcXVhbHMoInNjaGVtYUxvY2F0aW9uIikpCisgICAgICAgIHx8IChuYW1lLmVxdWFscyhTQ0hFTUFfSU1QT1JUX1FOQU1FKSAgJiYgYXR0TG9jYWxOYW1lLmVxdWFscygic2NoZW1hTG9jYXRpb24iKSkKKyAgICAgICAgfHwgKG5hbWUuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfSU1QT1JUKSAgJiYgYXR0TG9jYWxOYW1lLmVxdWFscygibG9jYXRpb24iKSkpIHsKKyAgICAgICAgICAgIC8vIHBhdGNoIHRoaXMgYXR0cmlidXRlIHZhbHVlLgorCisgICAgICAgICAgICBTdHJpbmcgcmVsUGF0aCA9IGluLmdldEF0dHJpYnV0ZVZhbHVlKGkpOworICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFBhdGggPSBnZXRQYXRjaGVkSW1wb3J0TG9jYXRpb24ocmVsUGF0aCk7CisgICAgICAgICAgICBpZiAoYWN0dWFsUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIHRoaXMgYXR0cmlidXRlIHRvIGxlYXZlIGl0IHVwIHRvICJpbXBsaWNpdCByZWZlcmVuY2UiLgogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJydW50aW1lLndzZGwucGF0Y2hlciIsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCisgICAgICAgICAgICBsb2dnZXIuZmluZSgiRml4aW5nIHRoZSByZWxhdGl2ZSBsb2NhdGlvbjoiK3JlbFBhdGgKKyAgICAgICAgICAgICAgICAgICAgKyIgd2l0aCBhYnNvbHV0ZSBsb2NhdGlvbjoiK2FjdHVhbFBhdGgpOworICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoaSwgYWN0dWFsUGF0aCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5OU19TT0FQX0JJTkRJTkdfQUREUkVTUykgfHwKKyAgICAgICAgICAgIG5hbWUuZXF1YWxzKFdTRExDb25zdGFudHMuTlNfU09BUDEyX0JJTkRJTkdfQUREUkVTUykpIHsKKworICAgICAgICAgICAgaWYoYXR0TG9jYWxOYW1lLmVxdWFscygibG9jYXRpb24iKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEFkZHJlc3NMb2NhdGlvbigpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKCJGaXhpbmcgc2VydmljZToiK3NlcnZpY2VOYW1lKyAiIHBvcnQ6Iitwb3J0TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhZGRyZXNzIHdpdGggIit2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKGksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHN1cGVyLmhhbmRsZUF0dHJpYnV0ZShpKTsKICAgICB9CiAKLSAgICAvKgotICAgICAqIHJldHVybiBwYXRjaGVkbG9jYXRpb24gIG51bGwgaWYgd2UgZG9uJ3QgaG93IHRvIHBhdGNoIHRoaXMgbG9jYXRpb24KKyAgICAvKioKKyAgICAgKiBXcml0ZXMgb3V0IGFuIHtAY29kZSBpfS10aCBhdHRyaWJ1dGUgYnV0IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuCisgICAgICogQHBhcmFtIGkgYXR0cmlidXRlIGluZGV4CisgICAgICogQHBhcmFtIHZhbHVlIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgd3JpdGluZyBhdHRyaWJ1dGUKICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYXRjaGVkSW1wb3J0TG9jYXRpb24oU3RyaW5nIHJlbFBhdGgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCByZWxVcmwgPSBuZXcgVVJMKGRvY0luZm8uZ2V0VXJsKCksIHJlbFBhdGgpOwotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gdGFyZ2V0RW5kcG9pbnQuZ2V0UXVlcnlTdHJpbmcocmVsVXJsKTsKLSAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGludCBpLCBTdHJpbmcgdmFsdWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbnNVcmkgPSBpbi5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaSk7CisgICAgICAgIGlmKG5zVXJpIT1udWxsKQorICAgICAgICAgICAgb3V0LndyaXRlQXR0cmlidXRlKCBpbi5nZXRBdHRyaWJ1dGVQcmVmaXgoaSksIG5zVXJpLCBpbi5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSksIHZhbHVlICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC53cml0ZUF0dHJpYnV0ZSggaW4uZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpLCB2YWx1ZSApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXJ0RWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBRTmFtZSBuYW1lID0gaW4uZ2V0TmFtZSgpOworCisgICAgICAgIGlmIChuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX0RFRklOSVRJT05TKSkgeworICAgICAgICAgICAgLy9TdHJpbmcgdmFsdWUgPSBpbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwidGFyZ2V0TmFtZXNwYWNlIik7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBpbi5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCJ0YXJnZXROYW1lc3BhY2UiKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gdmFsdWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgYWJzID0gYmFzZUFkZHJlc3MrdGFyZ2V0RW5kcG9pbnQuZ2V0VXJsUGF0dGVybldpdGhvdXRTdGFyKCkrIj8iK3F1ZXJ5OwotICAgICAgICAgICAgcmV0dXJuIGFiczsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpKSB7CisgICAgICAgICAgICAvL1N0cmluZyB2YWx1ZSA9IGluLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCJuYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBpbi5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCJuYW1lIik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfUE9SVCkpIHsKKyAgICAgICAgICAgIC8vU3RyaW5nIHZhbHVlID0gaW4uZ2V0QXR0cmlidXRlVmFsdWUoIiIsIm5hbWUiKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGluLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIm5hbWUiKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcG9ydE5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BRERSRVNTX1FOQU1FKSkgeworICAgICAgICAgICAgZXByQWRkcmVzc1N0YXRlID0gRVBSX0FERFJFU1NfU1RBVEUuSU47CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuaGFuZGxlU3RhcnRFbGVtZW50KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRW5kRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBRTmFtZSBuYW1lID0gaW4uZ2V0TmFtZSgpOworICAgICAgICBpZiAobmFtZS5lcXVhbHMoVzNDQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfQUREUkVTU19RTkFNRSkpIHsKKyAgICAgICAgICAgIGVwckFkZHJlc3NTdGF0ZSA9IEVQUl9BRERSRVNTX1NUQVRFLk9VVDsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5oYW5kbGVFbmRFbGVtZW50KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhcmFjdGVycygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAvLyBoYW5kbGVDaGFyYWN0ZXJzKCkgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVG8gdGFrZSBjYXJlIG9mIHRoaXMsCisgICAgICAgIC8vIEVQUl9BRERSRVNTX1NUQVRFIGlzIHVzZWQuCisgICAgICAgIGlmIChlcHJBZGRyZXNzU3RhdGUgPT0gRVBSX0FERFJFU1NfU1RBVEUuSU4pIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEFkZHJlc3NMb2NhdGlvbigpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZmluZSgiRml4aW5nIEVQUiBBZGRyZXNzIGZvciBzZXJ2aWNlOiIrc2VydmljZU5hbWUrICIgcG9ydDoiK3BvcnROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFkZHJlc3Mgd2l0aCAiK3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVDaGFyYWN0ZXJzKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBlcHJBZGRyZXNzU3RhdGUgPSBFUFJfQUREUkVTU19TVEFURS5ET05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcHJBZGRyZXNzU3RhdGUgIT0gRVBSX0FERFJFU1NfU1RBVEUuRE9ORSkgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlQ2hhcmFjdGVycygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gdG8gYmUgcGxhY2VkIGludG8gdGhlIGdlbmVyYXRlZCBkb2N1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxQYXRoIHJlbGF0aXZlIFVSSSB0byBiZSByZXNvbHZlZAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG51bGwgdG8gbGVhdmUgaXQgdG8gdGhlICJpbXBsaWNpdCByZWZlcmVuY2UiLgorICAgICAqLworICAgIHByaXZhdGUgQE51bGxhYmxlIFN0cmluZyBnZXRQYXRjaGVkSW1wb3J0TG9jYXRpb24oU3RyaW5nIHJlbFBhdGgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcnZpY2VEZWZpbml0aW9uSW1wbCBkZWYgPSBlbmRwb2ludC5nZXRTZXJ2aWNlRGVmaW5pdGlvbigpOworICAgICAgICAgICAgYXNzZXJ0IGRlZiAhPW51bGw7IC8vIHRoaXMgY29kZSBpcyBvbmx5IHVzZWQgYnkgU2VydmllRGVmaW5pdGlvbkltcGwsIHNvIHRoaXMgbXVzdCBub3QgYmUgbnVsbC4KKworICAgICAgICAgICAgVVJMIHJlZiA9IG5ldyBVUkwoY3VycmVudC5nZXRVUkwoKSwgcmVsUGF0aCk7CisgICAgICAgICAgICBTRERvY3VtZW50IHJlZkRvYyA9IGRlZi5nZXRCeVN5c3RlbUlkKHJlZik7CisgICAgICAgICAgICBpZihyZWZEb2M9PW51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbFBhdGg7ICAvLyBub3Qgc29tZXRoaW5nIHdlIGtub3cuIGp1c3QgbGVhdmUgaXQgYXMgaXMuCisKKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlci5nZXRSZWxhdGl2ZUFkZHJlc3NGb3IoY3VycmVudCxyZWZEb2MpOwogICAgICAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBYTUxFdmVudCBwYXRjaEltcG9ydChTdGFydEVsZW1lbnQgc3RhcnRFbGVtZW50LCBRTmFtZSBsb2NhdGlvbikKLSAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgQXR0cmlidXRlIGxvY2F0aW9uQXR0ciA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVCeU5hbWUobG9jYXRpb24pOwotICAgICAgICBpZiAobG9jYXRpb25BdHRyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGFydEVsZW1lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PEF0dHJpYnV0ZT4gbmV3QXR0cnMgPSBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZT4oKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IChBdHRyaWJ1dGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMobG9jYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlbFBhdGggPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgLy9pZiAoaXNQYXRjaGFibGUocmVsUGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFic1BhdGggPSBnZXRQYXRjaGVkSW1wb3J0TG9jYXRpb24ocmVsUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhYnNQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9nZ2VyLndhcm5pbmcoIkNvdWxkbid0IGZpeCB0aGUgcmVsYXRpdmUgbG9jYXRpb246IityZWxQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydEVsZW1lbnQ7ICAgICAgICAvLyBOb3QgcGF0Y2hpbmcKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZSgiRml4aW5nIHRoZSByZWxhdGl2ZSBsb2NhdGlvbjoiK3JlbFBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiB3aXRoIGFic29sdXRlIGxvY2F0aW9uOiIrYWJzUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBuZXdBdHRyID0gZXZlbnRGYWN0b3J5LmNyZWF0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBhYnNQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3QXR0cnMuYWRkKG5ld0F0dHIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld0F0dHJzLmFkZChhdHRyKTsKLSAgICAgICAgfQotICAgICAgICBYTUxFdmVudCBldmVudCA9IGV2ZW50RmFjdG9yeS5jcmVhdGVTdGFydEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgc3RhcnRFbGVtZW50LmdldE5hbWUoKS5nZXRQcmVmaXgoKSwKLSAgICAgICAgICAgICAgICBzdGFydEVsZW1lbnQuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgIHN0YXJ0RWxlbWVudC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgbmV3QXR0cnMuaXRlcmF0b3IoKSwKLSAgICAgICAgICAgICAgICBzdGFydEVsZW1lbnQuZ2V0TmFtZXNwYWNlcygpLAotICAgICAgICAgICAgICAgIHN0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VDb250ZXh0KCkpOwotICAgICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiA8c2NoZW1hOmltcG9ydD4gZWxlbWVudCBpcyBwYXRjaGVkIHdpdGggY29ycmVjdCB1cmkgYW5kCi0gICAgICogcmV0dXJucyBhIG5ldyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBYTUxFdmVudCBoYW5kbGVTY2hlbWFJbXBvcnQoU3RhcnRFbGVtZW50IHN0YXJ0RWxlbWVudCkKLSAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHBhdGNoSW1wb3J0KHN0YXJ0RWxlbWVudCwgU0NIRU1BX0xPQ0FUSU9OX1FOQU1FKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIDxzY2hlbWE6aW5jbHVkZT4gZWxlbWVudCBpcyBwYXRjaGVkIHdpdGggY29ycmVjdCB1cmkgYW5kCi0gICAgICogcmV0dXJucyBhIG5ldyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBYTUxFdmVudCBoYW5kbGVTY2hlbWFJbmNsdWRlKFN0YXJ0RWxlbWVudCBzdGFydEVsZW1lbnQpCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXRjaEltcG9ydChzdGFydEVsZW1lbnQsIFNDSEVNQV9MT0NBVElPTl9RTkFNRSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiA8d3NkbDppbXBvcnQ+IGVsZW1lbnQgaXMgcGF0Y2hlZCB3aXRoIGNvcnJlY3QgdXJpIGFuZAotICAgICAqIHJldHVybnMgYSBuZXcgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgWE1MRXZlbnQgaGFuZGxlV1NETEltcG9ydChTdGFydEVsZW1lbnQgc3RhcnRFbGVtZW50KQotICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcGF0Y2hJbXBvcnQoc3RhcnRFbGVtZW50LCBXU0RMX0xPQ0FUSU9OX1FOQU1FKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIDxzb2FwOmFkZHJlc3M+IGVsZW1lbnQgaXMgcGF0Y2hlZCB3aXRoIGNvcnJlY3QgZW5kcG9pbnQgYWRkcmVzcyBhbmQKLSAgICAgKiByZXR1cm5zIGEgbmV3IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFhNTEV2ZW50IGhhbmRsZVNvYXBBZGRyZXNzKFFOYW1lIHNlcnZpY2UsIFFOYW1lIHBvcnQsCi0gICAgICAgICAgICBTdGFydEVsZW1lbnQgc3RhcnRFbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBMaXN0PEF0dHJpYnV0ZT4gbmV3QXR0cnMgPSBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZT4oKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IChBdHRyaWJ1dGUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoV1NETF9MT0NBVElPTl9RTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRBZGRyZXNzTG9jYXRpb24oc2VydmljZSwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RWxlbWVudDsgICAgICAgIC8vIE5vdCBwYXRjaGluZwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZSgiRml4aW5nIHNlcnZpY2U6IitzZXJ2aWNlKyAiIHBvcnQ6Iitwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIgYWRkcmVzcyB3aXRoICIrdmFsdWUpOwotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBuZXdBdHRyID0gZXZlbnRGYWN0b3J5LmNyZWF0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTRExfTE9DQVRJT05fUU5BTUUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBuZXdBdHRycy5hZGQobmV3QXR0cik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXdBdHRycy5hZGQoYXR0cik7Ci0gICAgICAgIH0KLSAgICAgICAgWE1MRXZlbnQgZXZlbnQgPSBldmVudEZhY3RvcnkuY3JlYXRlU3RhcnRFbGVtZW50KAotICAgICAgICAgICAgICAgIHN0YXJ0RWxlbWVudC5nZXROYW1lKCkuZ2V0UHJlZml4KCksCi0gICAgICAgICAgICAgICAgc3RhcnRFbGVtZW50LmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICBzdGFydEVsZW1lbnQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgIG5ld0F0dHJzLml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZXMoKSwKLSAgICAgICAgICAgICAgICBzdGFydEVsZW1lbnQuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIC8qCisgICAgLyoqCiAgICAgICogRm9yIHRoZSBnaXZlbiBzZXJ2aWNlLCBwb3J0IG5hbWVzIGl0IG1hdGNoZXMgdGhlIGNvcnJlY3QgZW5kcG9pbnQgYW5kCiAgICAgICogcmV1dHJucyBpdHMgZW5kcG9pbnQgYWRkcmVzcworICAgICAqCisgICAgICogQHJldHVybiByZXR1cm5zIHRoZSByZXNvbHZlZCBlbmRwb2ludCBhZGRyZXNzCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWRkcmVzc0xvY2F0aW9uKFFOYW1lIGRvY1NlcnZpY2VOYW1lLCBRTmFtZSBkb2NQb3J0TmFtZSkgewotICAgICAgICBmb3IoUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8gOiBlbmRwb2ludHMpIHsKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VOYW1lID0gZW5kcG9pbnRJbmZvLmdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICBRTmFtZSBwb3J0TmFtZSA9IGVuZHBvaW50SW5mby5nZXRQb3J0TmFtZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG9ydE5hbWUgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBkb2NTZXJ2aWNlTmFtZSAhPSBudWxsICYmIGRvY1BvcnROYW1lICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgc2VydmljZU5hbWUuZXF1YWxzKGRvY1NlcnZpY2VOYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBkb2NQb3J0TmFtZS5lcXVhbHMocG9ydE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VBZGRyZXNzK2VuZHBvaW50SW5mby5nZXRVcmxQYXR0ZXJuV2l0aG91dFN0YXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBnZXRBZGRyZXNzTG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiAocG9ydEFkZHJlc3NSZXNvbHZlciA9PSBudWxsIHx8IHBvcnROYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgPyBudWxsIDogcG9ydEFkZHJlc3NSZXNvbHZlci5nZXRBZGRyZXNzRm9yKHNlcnZpY2VOYW1lLCBwb3J0TmFtZS5nZXRMb2NhbFBhcnQoKSk7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvV1NFbmRwb2ludEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9XU0VuZHBvaW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzcxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvV1NFbmRwb2ludEltcGwuamF2YQpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlcjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLmFkZHJlc3NpbmcuV1NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuU0VJTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29kZWM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuRW5naW5lOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkZpYmVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkZpYmVyQ29udGV4dFN3aXRjaEludGVyY2VwdG9yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlNlcnZlclBpcGVBc3NlbWJsZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlNlcnZlclR1YmVBc3NlbWJsZXJDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZUNsb25lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Db250YWluZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5FbmRwb2ludEF3YXJlQ29kZWM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5UcmFuc3BvcnRCYWNrQ2hhbm5lbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmZhdWx0LlNPQVBGYXVsdEJ1aWxkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMUHJvcGVydGllczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuSGFuZGxlck1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuUG9vbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlBvb2wuVHViZVBvb2w7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiB7QGxpbmsgV1NFbmRwb2ludH0gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdTRW5kcG9pbnRJbXBsPFQ+IGV4dGVuZHMgV1NFbmRwb2ludDxUPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBATm90TnVsbCBRTmFtZSBzZXJ2aWNlTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIFFOYW1lIHBvcnROYW1lOworICAgIHByaXZhdGUgZmluYWwgV1NCaW5kaW5nIGJpbmRpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBTRUlNb2RlbCBzZWlNb2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIEBOb3ROdWxsIENvbnRhaW5lciBjb250YWluZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBXU0RMUG9ydCBwb3J0OworCisgICAgcHJpdmF0ZSBmaW5hbCBUdWJlIG1hc3RlclR1YmVsaW5lOworICAgIHByaXZhdGUgZmluYWwgU2VydmljZURlZmluaXRpb25JbXBsIHNlcnZpY2VEZWY7CisgICAgcHJpdmF0ZSBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKyAgICBwcml2YXRlIGZpbmFsIEVuZ2luZSBlbmdpbmU7CisgICAgcHJpdmF0ZSBmaW5hbCBATm90TnVsbCBDb2RlYyBtYXN0ZXJDb2RlYzsKKworICAgIHByaXZhdGUgZmluYWwgUG9vbDxUdWJlPiB0dWJlUG9vbDsKKworICAgIC8qKgorICAgICAqIFNldCB0byB0cnVlIG9uY2Ugd2Ugc3RhcnQgc2h1dHRpbmcgZG93biB0aGlzIGVuZHBvaW50LgorICAgICAqIFVzZWQgdG8gYXZvaWQgcnVubmluZyB0aGUgY2xlYW4gdXAgcHJvY2Vzc2luZyB0d2ljZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2Rpc3Bvc2UoKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8VD4gaW1wbGVtZW50YXRpb25DbGFzczsKKyAgICBwcml2YXRlIGZpbmFsIEBOdWxsYWJsZSBXU0RMUHJvcGVydGllcyB3c2RsUHJvcGVydGllczsKKworICAgIFdTRW5kcG9pbnRJbXBsKEBOb3ROdWxsIFFOYW1lIHNlcnZpY2VOYW1lLCBATm90TnVsbCBRTmFtZSBwb3J0TmFtZSwgV1NCaW5kaW5nIGJpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciwgU0VJTW9kZWwgc2VpTW9kZWwsIFdTRExQb3J0IHBvcnQsCisgICAgICAgICAgICAgICAgICAgQ2xhc3M8VD4gaW1wbGVtZW50YXRpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU2VydmljZURlZmluaXRpb25JbXBsIHNlcnZpY2VEZWYsCisgICAgICAgICAgICAgICAgICAgSW52b2tlclR1YmUgdGVybWluYWxUdWJlLCBib29sZWFuIGlzU3luY2hyb25vdXMpIHsKKyAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgIHRoaXMuc29hcFZlcnNpb24gPSBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCk7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uQ2xhc3MgPSBpbXBsZW1lbnRhdGlvbkNsYXNzOworICAgICAgICB0aGlzLnNlcnZpY2VEZWYgPSBzZXJ2aWNlRGVmOworICAgICAgICB0aGlzLnNlaU1vZGVsID0gc2VpTW9kZWw7CisgICAgICAgIGlmIChzZXJ2aWNlRGVmICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlcnZpY2VEZWYuc2V0T3duZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBUdWJlbGluZUFzc2VtYmxlciBhc3NlbWJsZXIgPSBUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkuY3JlYXRlKAorICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIGJpbmRpbmcuZ2V0QmluZGluZ0lkKCksIGNvbnRhaW5lcik7CisgICAgICAgIGFzc2VydCBhc3NlbWJsZXIhPW51bGw7CisKKyAgICAgICAgU2VydmVyVHViZUFzc2VtYmxlckNvbnRleHQgY29udGV4dCA9IG5ldyBTZXJ2ZXJQaXBlQXNzZW1ibGVyQ29udGV4dChzZWlNb2RlbCwgcG9ydCwgdGhpcywgdGVybWluYWxUdWJlLCBpc1N5bmNocm9ub3VzKTsKKyAgICAgICAgdGhpcy5tYXN0ZXJUdWJlbGluZSA9IGFzc2VtYmxlci5jcmVhdGVTZXJ2ZXIoY29udGV4dCk7CisKKyAgICAgICAgQ29kZWMgYyA9IGNvbnRleHQuZ2V0Q29kZWMoKTsKKyAgICAgICAgaWYoYyBpbnN0YW5jZW9mIEVuZHBvaW50QXdhcmVDb2RlYykgeworICAgICAgICAgICAgLy8gY3JlYXRlIGEgY29weSB0byBhdm9pZCBzaGFyaW5nIHRoZSBjb2RlYyBiZXR3ZWVuIG11bHRpcGxlIGVuZHBvaW50cworICAgICAgICAgICAgYyA9IGMuY29weSgpOworICAgICAgICAgICAgKChFbmRwb2ludEF3YXJlQ29kZWMpYykuc2V0RW5kcG9pbnQodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5tYXN0ZXJDb2RlYyA9IGM7CisKKyAgICAgICAgdHViZVBvb2wgPSBuZXcgVHViZVBvb2wobWFzdGVyVHViZWxpbmUpOworICAgICAgICB0ZXJtaW5hbFR1YmUuc2V0RW5kcG9pbnQodGhpcyk7CisgICAgICAgIGVuZ2luZSA9IG5ldyBFbmdpbmUodG9TdHJpbmcoKSk7CisgICAgICAgIHdzZGxQcm9wZXJ0aWVzID0gKHBvcnQ9PW51bGwpID8gbnVsbCA6IG5ldyBXU0RMUHJvcGVydGllcyhwb3J0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgQ2xhc3M8VD4gZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uQ2xhc3M7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIFdTQmluZGluZyBnZXRCaW5kaW5nKCkgeworICAgICAgICByZXR1cm4gYmluZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETFBvcnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIFNFSU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlbGF0aW9uc2hpcAorICAgICAqIGJldHdlZW4gV1NETCBhbmQgSmF2YSBTRUkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbm9uLW51bGwgdmFsdWUgaWYgYW5kIG9ubHkgaWYgdGhpcworICAgICAqIGVuZHBvaW50IGlzIHVsdGltYXRlbHkgc2VydmluZyBhbiBhcHBsaWNhdGlvbiB0aHJvdWdoIGFuIFNFSS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG1heWJlIG51bGwuIFNlZSBhYm92ZSBmb3IgbW9yZSBkaXNjdXNzaW9uLgorICAgICAqICAgICAgQWx3YXlzIHRoZSBzYW1lIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgU0VJTW9kZWwgZ2V0U0VJTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBzZWlNb2RlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBleGVjKSB7CisgICAgICAgIGVuZ2luZS5zZXRFeGVjdXRvcihleGVjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZShmaW5hbCBQYWNrZXQgcmVxdWVzdCwgZmluYWwgQ29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrLCBGaWJlckNvbnRleHRTd2l0Y2hJbnRlcmNlcHRvciBpbnRlcmNlcHRvcikgeworICAgICAgICByZXF1ZXN0LmVuZHBvaW50ID0gV1NFbmRwb2ludEltcGwudGhpczsKKyAgICAgICAgaWYgKHdzZGxQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYWRkU2F0ZWxsaXRlKHdzZGxQcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgICAgICBGaWJlciBmaWJlciA9IGVuZ2luZS5jcmVhdGVGaWJlcigpOworICAgICAgICBpZiAoaW50ZXJjZXB0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgZmliZXIuYWRkSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFR1YmUgdHViZSA9IHR1YmVQb29sLnRha2UoKTsKKyAgICAgICAgZmliZXIuc3RhcnQodHViZSwgcmVxdWVzdCwgbmV3IEZpYmVyLkNvbXBsZXRpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGlvbihATm90TnVsbCBQYWNrZXQgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICB0dWJlUG9vbC5yZWN5Y2xlKHR1YmUpOworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkNvbXBsZXRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0aW9uKEBOb3ROdWxsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgICAgIC8vIGxldCdzIG5vdCByZXVzZSB0dWJlcyBhcyB0aGV5IG1pZ2h0IGJlIGluIGEgd3Jvbmcgc3RhdGUsIHNvIG5vdAorICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgdHViZVBvb2wucmVjeWNsZSgpCisgICAgICAgICAgICAgICAgZXJyb3IucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgLy8gQ29udmVydCBhbGwgcnVudGltZSBleGNlcHRpb25zIHRvIFBhY2tldCBzbyB0aGF0IHRyYW5zcG9ydCBkb2Vzbid0CisgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byB3b3JyeSBhYm91dCBjb252ZXJ0aW5nIHRvIHdpcmUgbWVzc2FnZQorICAgICAgICAgICAgICAgIC8vIFRPRE8gWE1ML0hUVFAgYmluZGluZworICAgICAgICAgICAgICAgIE1lc3NhZ2UgZmF1bHRNc2cgPSBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBzb2FwVmVyc2lvbiwgbnVsbCwgZXJyb3IpOworICAgICAgICAgICAgICAgIFBhY2tldCByZXNwb25zZSA9IHJlcXVlc3QuY3JlYXRlU2VydmVyUmVzcG9uc2UoZmF1bHRNc2csIHJlcXVlc3QuZW5kcG9pbnQuZ2V0UG9ydCgpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5lbmRwb2ludC5nZXRCaW5kaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkNvbXBsZXRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIFBpcGVIZWFkIGNyZWF0ZVBpcGVIZWFkKCkgeworICAgICAgICByZXR1cm4gbmV3IFBpcGVIZWFkKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBUdWJlIHR1YmUgPSBUdWJlQ2xvbmVyLmNsb25lKG1hc3RlclR1YmVsaW5lKTsKKworICAgICAgICAgICAgcHVibGljIEBOb3ROdWxsIFBhY2tldCBwcm9jZXNzKFBhY2tldCByZXF1ZXN0LCBXZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlIHdzY2QsIFRyYW5zcG9ydEJhY2tDaGFubmVsIHRiYykgeworICAgICAgICAgICAgICAgIHJlcXVlc3Qud2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZSA9IHdzY2Q7CisgICAgICAgICAgICAgICAgcmVxdWVzdC50cmFuc3BvcnRCYWNrQ2hhbm5lbCA9IHRiYzsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmVuZHBvaW50ID0gV1NFbmRwb2ludEltcGwudGhpczsKKyAgICAgICAgICAgICAgICBpZiAod3NkbFByb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZFNhdGVsbGl0ZSh3c2RsUHJvcGVydGllcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpYmVyIGZpYmVyID0gZW5naW5lLmNyZWF0ZUZpYmVyKCk7CisgICAgICAgICAgICAgICAgUGFja2V0IHJlc3BvbnNlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZmliZXIucnVuU3luYyh0dWJlLHJlcXVlc3QpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2F0Y2ggYWxsIHJ1bnRpbWUgZXhjZXB0aW9ucyBzbyB0aGF0IHRyYW5zcG9ydCBkb2Vzbid0CisgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gd29ycnkgYWJvdXQgY29udmVydGluZyB0byB3aXJlIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBYTUwvSFRUUCBiaW5kaW5nCisgICAgICAgICAgICAgICAgICAgIHJlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIGZhdWx0TXNnID0gU09BUEZhdWx0QnVpbGRlci5jcmVhdGVTT0FQRmF1bHRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBWZXJzaW9uLCBudWxsLCByZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcmVxdWVzdC5jcmVhdGVTZXJ2ZXJSZXNwb25zZShmYXVsdE1zZywgcmVxdWVzdC5lbmRwb2ludC5nZXRQb3J0KCksIG51bGwsIHJlcXVlc3QuZW5kcG9pbnQuZ2V0QmluZGluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBpZihkaXNwb3NlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGlzcG9zZWQgPSB0cnVlOworCisgICAgICAgIG1hc3RlclR1YmVsaW5lLnByZURlc3Ryb3koKTsKKworICAgICAgICBmb3IgKEhhbmRsZXIgaGFuZGxlciA6IGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCkpIHsKKyAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldEFubm90YXRpb24oUHJlRGVzdHJveS5jbGFzcykgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLldBUk5JTkcsIEhhbmRsZXJNZXNzYWdlcy5IQU5ETEVSX1BSRURFU1RST1lfSUdOT1JFKGUuZ2V0TWVzc2FnZSgpKSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNlcnZpY2VEZWZpbml0aW9uSW1wbCBnZXRTZXJ2aWNlRGVmaW5pdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZpY2VEZWY7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoCisgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4gKyAiLnNlcnZlci5lbmRwb2ludCIpOworCisgICAgcHVibGljIDxUIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IFQgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoQ2xhc3M8VD4gY2xhenosIFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgd3NkbEFkZHJlc3MsIEVsZW1lbnQuLi5yZWZlcmVuY2VQYXJhbWV0ZXJzKSB7CisgICAgICAgIFFOYW1lIHBvcnRUeXBlID0gbnVsbDsKKyAgICAgICAgaWYocG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlTmFtZSgpOworICAgICAgICB9CisgICAgICAgIExpc3Q8RWxlbWVudD4gcmVmUGFyYW1zID0gbnVsbDsKKyAgICAgICAgaWYocmVmZXJlbmNlUGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICByZWZQYXJhbXMgPSBBcnJheXMuYXNMaXN0KHJlZmVyZW5jZVBhcmFtZXRlcnMpOworICAgICAgICB9CisgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uIGF2ID0gQWRkcmVzc2luZ1ZlcnNpb24uZnJvbVNwZWNDbGFzcyhjbGF6eik7CisgICAgICAgIGlmIChhdiA9PSBBZGRyZXNzaW5nVmVyc2lvbi5XM0MpIHsKKyAgICAgICAgICAgIC8vIFN1cHJlc3Mgd3JpdGluZyBTZXJ2aWNlTmFtZSBhbmQgRW5kcG9pbnROYW1lIGluIFczQyBFUFIsCisgICAgICAgICAgICAvLyBVbnRpbCB0aGUgbnMgZm9yIHRob3NlIG1ldGFkYXRhIGVsZW1lbnRzIGlzIHJlc29sdmVkLgorICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0VuZHBvaW50UmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbi5XM0MsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsbnVsbCAvKnNlcnZpY2VOYW1lKi8sbnVsbCAvKnBvcnROYW1lKi8sIG51bGwgLypwb3J0VHlwZSovLCBudWxsLCBudWxsIC8qd3NkbEFkZHJlc3MqLywgcmVmUGFyYW1zKS50b1NwZWMoY2xhenopOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0VuZHBvaW50UmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nVmVyc2lvbi5NRU1CRVIsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSwgcG9ydFR5cGUsIG51bGwsIHdzZGxBZGRyZXNzLCByZWZQYXJhbXMpLnRvU3BlYyhjbGF6eik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgUU5hbWUgZ2V0UG9ydE5hbWUoKSB7CisgICAgICAgIHJldHVybiBwb3J0TmFtZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBATm90TnVsbCBDb2RlYyBjcmVhdGVDb2RlYygpIHsKKyAgICAgICAgcmV0dXJuIG1hc3RlckNvZGVjLmNvcHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvWE1MRVBURmFjdG9yeUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9YTUxFUFRGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM0YTVhLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9YTUxFUFRGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlcjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZW5jb2RpbmcuRGVjb2RlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVuY29kaW5nLkVuY29kZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5wcmVzZW50YXRpb24uVGFyZ2V0RmluZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJvdG9jb2wuSW50ZXJjZXB0b3JzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJvdG9jb2wuTWVzc2FnZURpc3BhdGNoZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuaW50ZXJuYWwuSW50ZXJuYWxFbmNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxEZWNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxFUFRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxFbmNvZGVyOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgWE1MRVBURmFjdG9yeUltcGwgaW1wbGVtZW50cyBYTUxFUFRGYWN0b3J5IHsKLSAgICBwcml2YXRlIEVuY29kZXIgZW5jb2RlcjsKLSAgICBwcml2YXRlIERlY29kZXIgZGVjb2RlcjsKLSAgICBwcml2YXRlIFhNTEVuY29kZXIgeG1sRW5jb2RlcjsKLSAgICBwcml2YXRlIFhNTERlY29kZXIgeG1sRGVjb2RlcjsKLSAgICBwcml2YXRlIEludGVybmFsRW5jb2RlciBpbnRlcm5hbEVuY29kZXI7Ci0gICAgcHJpdmF0ZSBUYXJnZXRGaW5kZXIgdGFyZ2V0RmluZGVyOwotICAgIHByaXZhdGUgTWVzc2FnZURpc3BhdGNoZXIgbWVzc2FnZURpc3BhdGNoZXI7Ci0KLSAgICBwdWJsaWMgWE1MRVBURmFjdG9yeUltcGwoRW5jb2RlciBlbmNvZGVyLCBEZWNvZGVyIGRlY29kZXIsCi0gICAgICAgICAgICBUYXJnZXRGaW5kZXIgdGFyZ2V0RmluZGVyLCBNZXNzYWdlRGlzcGF0Y2hlciBtZXNzYWdlRGlzcGF0Y2hlcikgewotICAgICAgICB0aGlzLmVuY29kZXIgPSBlbmNvZGVyOwotICAgICAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyOwotICAgICAgICB0aGlzLnRhcmdldEZpbmRlciA9IHRhcmdldEZpbmRlcjsKLSAgICAgICAgdGhpcy5tZXNzYWdlRGlzcGF0Y2hlciA9IG1lc3NhZ2VEaXNwYXRjaGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxFUFRGYWN0b3J5SW1wbChYTUxFbmNvZGVyIHhtbEVuY29kZXIsIFhNTERlY29kZXIgeG1sRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxFbmNvZGVyIGludGVybmFsRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0RmluZGVyIHRhcmdldEZpbmRlciwgTWVzc2FnZURpc3BhdGNoZXIgbWVzc2FnZURpc3BhdGNoZXIpIHsKLSAgICAgICAgdGhpcy54bWxFbmNvZGVyID0geG1sRW5jb2RlcjsKLSAgICAgICAgdGhpcy54bWxEZWNvZGVyID0geG1sRGVjb2RlcjsKLSAgICAgICAgdGhpcy5lbmNvZGVyID0gbnVsbDsKLSAgICAgICAgdGhpcy5kZWNvZGVyID0gbnVsbDsKLSAgICAgICAgdGhpcy5pbnRlcm5hbEVuY29kZXIgPSBpbnRlcm5hbEVuY29kZXI7Ci0gICAgICAgIHRoaXMudGFyZ2V0RmluZGVyID0gdGFyZ2V0RmluZGVyOwotICAgICAgICB0aGlzLm1lc3NhZ2VEaXNwYXRjaGVyID0gbWVzc2FnZURpc3BhdGNoZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEVuY29kZXIgZ2V0RW5jb2RlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBtZXNzYWdlSW5mby5zZXRFbmNvZGVyKGVuY29kZXIpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUluZm8uZ2V0RW5jb2RlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWNvZGVyIGdldERlY29kZXIoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgbWVzc2FnZUluZm8uc2V0RGVjb2RlcihkZWNvZGVyKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VJbmZvLmdldERlY29kZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFyZ2V0RmluZGVyIGdldFRhcmdldEZpbmRlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gdGFyZ2V0RmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlRGlzcGF0Y2hlciBnZXRNZXNzYWdlRGlzcGF0Y2hlcihNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICBtZXNzYWdlSW5mby5zZXRNZXNzYWdlRGlzcGF0Y2hlcihtZXNzYWdlRGlzcGF0Y2hlcik7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRGlzcGF0Y2hlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwucGVwdC5lcHQuRVBURmFjdG9yeSNnZXRJbnRlcmNlcHRvcnMoY29tLnN1bi5pc3RhY2suaW50ZXJuYWwucGVwdC5lcHQuTWVzc2FnZUluZm8pCi0gICAgICovCi0gICAgcHVibGljIEludGVyY2VwdG9ycyBnZXRJbnRlcmNlcHRvcnMoTWVzc2FnZUluZm8geCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuamF4Yi5Mb2dpY2FsRVBURmFjdG9yeSNnZXRTb2FwRW5jb2RlcigpCi0gICAgICovCi0gICAgcHVibGljIFhNTEVuY29kZXIgZ2V0WE1MRW5jb2RlcigpIHsKLSAgICAgICAgcmV0dXJuIHhtbEVuY29kZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLmpheGIuTG9naWNhbEVQVEZhY3RvcnkjZ2V0U29hcERlY29kZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxEZWNvZGVyIGdldFhNTERlY29kZXIoKSB7Ci0gICAgICAgIHJldHVybiB4bWxEZWNvZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlcm5hbEVuY29kZXIgZ2V0SW50ZXJuYWxFbmNvZGVyKCkgewotICAgICAgICByZXR1cm4gaW50ZXJuYWxFbmNvZGVyOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggMjY4Y2UzYS4uZDgzMmY2NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxMTIgKzI0LDE0IEBACiAgKi8KIAogLyoqCi0gKiA8aDE+SkFYLVdTIDIuMCBTZXJ2ZXIgUnVudGltZTwvaDE+CisgKiA8aDE+SkFYLVdTIDIuMC4xIFNlcnZlciBSdW50aW1lPC9oMT4KICAqIDxQPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBhcmNoaXRlY3R1cmUgb2Ygc2VydmVyIHNpZGUKLSAqIEpBWC1XUyAyLjAgcnVudGltZS4gPC9wPgorICogSkFYLVdTIDIuMC4xIHJ1bnRpbWUuIDwvcD4KICAqCi0gKiA8aDM+SkFYLVdTIDIuMCBTZXJ2ZXIgUnVudGltZSBTZXF1ZW5jZSBEaWFncmFtPC9oMz4KLSAqIHtAU2VxdWVuY2VEaWFncmFtCi0gICAgICBwb2JqZWN0KFUsInVzZXIiKTsKLSAgICAgIG9iamVjdChBLCJXU0Nvbm5lY3Rpb24iKTsKLSAgICAgIG9iamVjdChCLCJUaWUiKTsKLSAgICAgIG9iamVjdChFLCJNZXNzYWdlRGlzcGF0Y2hlciIpOwotICAgICAgb2JqZWN0KEYsIkVQVEZhY3RvcnlGYWN0b3J5QmFzZSIpOwotICAgICAgb2JqZWN0KEcsIkVuZHBvaW50Iik7Ci0gICAgICBzdGVwKCk7CisgKiA8aDM+SkFYLVdTIDIuMC4xIFNlcnZlciBSdW50aW1lIFNlcXVlbmNlIERpYWdyYW08L2gzPgogCi0gICAgICBtZXNzYWdlKFUsQSwiaW52b2tlIFdlYiBTZXJ2aWNlIik7Ci0gICAgICBhY3RpdmUoQSk7Ci0gICAgICBtZXNzYWdlKEEsQSwiZ2V0UnVudGltZUVuZHBvaW50SW5mbyIpOwotICAgICAgYWN0aXZlKEEpOwotICAgICAgc3RlcCgpOwotICAgICAgaW5hY3RpdmUoQSk7CisgICogPGltZyBzcmM9Jy4uLy4uLy4uLy4uLy4uL2pheHdzL2Jhc2ljLXNlcnZlci5zZXEucG5nJz4KIAotICAgICAgbWVzc2FnZShBLEIsImhhbmRsZSIpOwotICAgICAgYWN0aXZlKEIpOwotIyAgICAgIGluYWN0aXZlKEEpOwotCi0gICAgICBtZXNzYWdlKEIsQiwiY3JlYXRlTWVzc2FnZUluZm8iKTsKLSAgICAgIGFjdGl2ZShCKTsKLSAgICAgIHN0ZXAoKTsKLSAgICAgIGluYWN0aXZlKEIpOwotCi0gICAgICBtZXNzYWdlKEIsQiwiY3JlYXRlUnVudGltZUNvbnRleHQiKTsKLSAgICAgIGFjdGl2ZShCKTsKLSAgICAgIHN0ZXAoKTsKLSAgICAgIGluYWN0aXZlKEIpOwotCi0gICAgICBtZXNzYWdlKEIsRiwiZ2V0RVBURmFjdG9yeSIpOwotICAgICAgYWN0aXZlKEYpOwotICAgICAgc3RlcCgpOwotICAgICAgaW5hY3RpdmUoRik7Ci0KLSAgICAgIG1lc3NhZ2UoQixCLCJnZXRNZXNzYWdlRGlzcGF0Y2hlciIpOwotICAgICAgYWN0aXZlKEIpOwotICAgICAgc3RlcCgpOwotICAgICAgaW5hY3RpdmUoQik7Ci0KLSAgICAgIG1lc3NhZ2UoQixFLCJyZWNlaXZlIik7Ci0gICAgICBhY3RpdmUoRSk7Ci0gICAgICBpbmFjdGl2ZShCKTsKLSMgICAgICBjb21wbGV0ZShCKTsKLQotICAgICAgbWVzc2FnZShFLEUsIm11c3RVbmRlcnN0YW5kIik7Ci0gICAgICBhY3RpdmUoRSk7Ci0gICAgICBzdGVwKCk7Ci0gICAgICBpbmFjdGl2ZShFKTsKLQotICAgICAgbWVzc2FnZShFLEUsImNyZWF0ZVNPQVBNZXNzYWdlIik7Ci0gICAgICBhY3RpdmUoRSk7Ci0gICAgICBzdGVwKCk7Ci0gICAgICBpbmFjdGl2ZShFKTsKLQotICAgICAgbWVzc2FnZShFLEUsImludm9rZUhhbmRsZXJzIik7Ci0gICAgICBhY3RpdmUoRSk7Ci0gICAgICBzdGVwKCk7Ci0gICAgICBpbmFjdGl2ZShFKTsKLQotICAgICAgbWVzc2FnZShFLEUsImNyZWF0ZUludGVybmFsTWVzc2FnZSIpOwotICAgICAgYWN0aXZlKEUpOwotICAgICAgc3RlcCgpOwotICAgICAgaW5hY3RpdmUoRSk7Ci0KLSAgICAgIG1lc3NhZ2UoRSxHLCJpbnZva2UgZW5kcG9pbnQiKTsKLSAgICAgIGFjdGl2ZShHKTsKLSMgICAgICBzdGVwKCk7Ci0gICAgICBybWVzc2FnZShHLEUsInJlc3BvbnNlIik7Ci0jICAgICAgY29tcGxldGUoRyk7Ci0gICAgICBpbmFjdGl2ZShHKTsKLQotICAgICAgbWVzc2FnZShFLEUsImNyZWF0ZUludGVybmFsTWVzc2FnZSIpOwotICAgICAgYWN0aXZlKEUpOwotICAgICAgc3RlcCgpOwotICAgICAgaW5hY3RpdmUoRSk7Ci0KLSAgICAgIG1lc3NhZ2UoRSxFLCJjcmVhdGVTT0FQTWVzc2FnZSIpOwotICAgICAgYWN0aXZlKEUpOwotICAgICAgc3RlcCgpOwotICAgICAgaW5hY3RpdmUoRSk7Ci0KLSAgICAgIG1lc3NhZ2UoRSxFLCJpbnZva2VIYW5kbGVycyIpOwotICAgICAgYWN0aXZlKEUpOwotICAgICAgc3RlcCgpOwotICAgICAgaW5hY3RpdmUoRSk7Ci0KLSMgICAgICBhY3RpdmUoQSk7Ci0gICAgICBybWVzc2FnZShFLEEsInJlc3BvbnNlIik7Ci0jICAgICAgY29tcGxldGUoRSk7Ci0jaW5hY3RpdmUoRSk7Ci0KLSAgICAgIGFjdGl2ZShBKTsKLSMgICAgICBjb21wbGV0ZShFKTsKLWluYWN0aXZlKEUpOwotIyAgICAgIHJtZXNzYWdlKEEsVSwicmVzcG9uc2UiKTsKLSMgICAgICBjb21wbGV0ZShFKTsKLSMgICAgICBjb21wbGV0ZShBKTsKLSAgICAgIGNvbXBsZXRlKEEpOwotICogfQotICoKICAqCiAgKgogICogPEgzPk1lc3NhZ2UgRmxvdzwvSDM+CkBAIC0xMzcsMTggKzM5LDE4IEBACiAgKiB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuc2VydmxldC5XU1NlcnZsZXREZWxlZ2F0ZSBXU1NlcnZsZXREZWxlZ2F0ZX0KICAqIG9yIHRoZSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuc2VydmVyLlNlcnZlckNvbm5lY3Rpb25JbXBsIFNlcnZlckNvbm5lY3Rpb25JbXBsfS4KICAqIEJvdGggb2YgdGhlc2UgY2xhc3NlcyBmaW5kIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVFbmRwb2ludEluZm8gUnVudGltZUVuZHBvaW50SW5mb30KLSAqIGFuZCBpbnZva2VzIHRoZSB7QGxpbmsgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlRpZSNoYW5kbGUoY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uLAorICogYW5kIGludm9rZXMgdGhlIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuVGllI2hhbmRsZShjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTQ29ubmVjdGlvbiwKICAqIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLlJ1bnRpbWVFbmRwb2ludEluZm8pIFRpZS5oYW5kbGV9CiAgKiBtZXRob2QuIFRoaXMgbWV0aG9kIGZpcnN0IGNyZWF0ZXMgYSB7QGxpbmsgY29tLnN1bi5wZXB0LmVwdC5NZXNzYWdlSW5mbyBNZXNzYWdlSW5mb30KICAqIHVzZWQgdG8gZ2F0aGVyIGluZm9ycm1hdGlvbiBhYm91dCB0aGUgbWVzc2FnZSB0byBiZSByZWNlaXZlZC4gQQogICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lQ29udGV4dCBSdW50aW1lQ29udGV4dH0KLSAqIGlzIHRoZW4gY3JlYXRlZCB3aXRoIHRoZSBNZXNzYWdlSW5mbyBhbmQgdGhlIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5SdW50aW1lTW9kZWwgUnVudGltZU1vZGVsfQorICogaXMgdGhlbiBjcmVhdGVkIHdpdGggdGhlIE1lc3NhZ2VJbmZvIGFuZCB0aGUge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbCBSdW50aW1lTW9kZWx9CiAgKiByZXRyaWV2ZWQgZnJvbSB0aGUgUnVudGltZUVuZHBvaW50SW5mby4gVGhlIFJ1bnRpbWVDb250ZXh0IGlzIHRoZW4KICAqIHN0b3JlZCBpbiB0aGUgTWVzc2FnZUluZm8uIFRoZSB7QGxpbmsgY29tLnN1bi5wZXB0LmVwdC5FUFRGYWN0b3J5IEVQVEZhY3Rvcnl9CiAgKiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5FUFRGYWN0b3J5RmFjdG9yeUJhc2UgRVBURmFjdG9yeUZhY3RvcnlCYXNlfQogICogYW5kIGFsc28gcGxhY2VkIGluIHRoZSBNZXNzYWdJbmZvLiBBIHtAbGluayBjb20uc3VuLnBlcHQucHJvdG9jb2wuTWVzc2FnZURpc3BhdGNoZXIgTWVzc2FnZURpc3BhdGNoZXJ9CiAgKiBpcyB0aGVuIGNyZWF0ZWQgYW5kIHRoZSByZWNlaXZlIG1ldGhvZCBpcyBpbnZva2VkLiBUaGVyZSB3aWxsIGJlIHR3bwotICogdHlwZXMgb2YgTWVzc2FnZURpc3BhdGNoZXJzIGZvciBKQVgtV1MgMi4wIEZDUywgU09BUE1lc3NhZ2VEaXNwYXRjaGVyCisgKiB0eXBlcyBvZiBNZXNzYWdlRGlzcGF0Y2hlcnMgZm9yIEpBWC1XUyAyLjAuMSwgU09BUE1lc3NhZ2VEaXNwYXRjaGVyCiAgKiAob25lIGZvciBjbGllbnQgYW5kIG9uZSBmb3IgdGhlIHNlcnZlcikgYW5kIGFuIFhNTE1lc3NhZ2VEaXNwYXRjaGVyCiAgKiAob25lIGZvciB0aGUgY2xpZW50IGFuZCBvbmUgZm9yIHRoZSBzZXJ2ZXIpLjwvUD4KICAqIDxQPlRoZSBNZXNzYWdlRGlzcGF0Y2hlci5yZWNlaXZlIG1ldGhvZCBvcmNoZXN0cmF0ZXMgdGhlIHJlY2VpdmluZyBvZgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL0FzeW5jUHJvdmlkZXJJbnZva2VyVHViZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL0FzeW5jUHJvdmlkZXJJbnZva2VyVHViZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2ZhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcHJvdmlkZXIvQXN5bmNQcm92aWRlckludm9rZXJUdWJlLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnByb3ZpZGVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuRmliZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQXN5bmNQcm92aWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkFzeW5jUHJvdmlkZXJDYWxsYmFjazsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkludm9rZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XU0VuZHBvaW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5BYnN0cmFjdFdlYlNlcnZpY2VDb250ZXh0OworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIFRoaXMge0BsaW5rIFR1YmV9IGlzIHVzZWQgdG8gaW52b2tlIHRoZSB7QGxpbmsgQXN5bmNQcm92aWRlcn0gZW5kcG9pbnRzLgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK2NsYXNzIEFzeW5jUHJvdmlkZXJJbnZva2VyVHViZTxUPiBleHRlbmRzIFByb3ZpZGVySW52b2tlclR1YmU8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoCisgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4gKyAiLnNlcnZlci5Bc3luY1Byb3ZpZGVySW52b2tlclR1YmUiKTsKKworICAgIHB1YmxpYyBBc3luY1Byb3ZpZGVySW52b2tlclR1YmUoSW52b2tlciBpbnZva2VyLCBQcm92aWRlckFyZ3VtZW50c0J1aWxkZXI8VD4gYXJnc0J1aWxkZXIpIHsKKyAgICAgICAgc3VwZXIoaW52b2tlciwgYXJnc0J1aWxkZXIpOworICAgIH0KKworICAgLyoKKyAgICAqIFRoaXMgYmluZHMgdGhlIHBhcmFtZXRlciBmb3IgUHJvdmlkZXIgZW5kcG9pbnRzIGFuZCBpbnZva2VzIHRoZQorICAgICogaW52b2tlKCkgbWV0aG9kIG9mIHtAbGlua2UgUHJvdmlkZXJ9IGVuZHBvaW50LiBUaGUgcmV0dXJuIHZhbHVlIGZyb20KKyAgICAqIGludm9rZSgpIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHtAbGluayBNZXNzYWdlfSB0aGF0IHRyYXZlcnNlcworICAgICogdGhyb3VnaCB0aGUgUGlwZWxpbmUgdG8gdHJhbnNwb3J0LgorICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoQE5vdE51bGwgUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgVCBwYXJhbSA9IGFyZ3NCdWlsZGVyLmdldFBhcmFtZXRlcihyZXF1ZXN0KTsKKyAgICAgICAgQXN5bmNQcm92aWRlckNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEFzeW5jUHJvdmlkZXJJbnZva2VyVHViZS5Bc3luY1Byb3ZpZGVyQ2FsbGJhY2tJbXBsKHJlcXVlc3QpOworICAgICAgICBBc3luY1dlYlNlcnZpY2VDb250ZXh0IGN0eHQgPSBuZXcgQXN5bmNXZWJTZXJ2aWNlQ29udGV4dChnZXRFbmRwb2ludCgpLHJlcXVlc3QpOworCisgICAgICAgIEFzeW5jUHJvdmlkZXJJbnZva2VyVHViZS5MT0dHRVIuZmluZSgiSW52b2tpbmcgQXN5bmNQcm92aWRlciBFbmRwb2ludCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0SW52b2tlcihyZXF1ZXN0KS5pbnZva2VBc3luY1Byb3ZpZGVyKHJlcXVlc3QsIHBhcmFtLCBjYWxsYmFjaywgY3R4dCk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICByZXR1cm4gZG9UaHJvdyhlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTdXNwZW5kIHRoZSBGaWJlci4gQXN5bmNQcm92aWRlckNhbGxiYWNrIHdpbGwgcmVzdW1lIHRoZSBGaWJlciBhZnRlcgorICAgICAgICAvLyBpdCByZWNlaXZlcyByZXNwb25zZS4KKyAgICAgICAgcmV0dXJuIGRvU3VzcGVuZCgpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQXN5bmNQcm92aWRlckNhbGxiYWNrSW1wbCBpbXBsZW1lbnRzIEFzeW5jUHJvdmlkZXJDYWxsYmFjazxUPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFja2V0IHJlcXVlc3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgRmliZXIgZmliZXI7CisKKyAgICAgICAgcHVibGljIEFzeW5jUHJvdmlkZXJDYWxsYmFja0ltcGwoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgICAgICB0aGlzLmZpYmVyID0gRmliZXIuY3VycmVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZChATnVsbGFibGUgVCBwYXJhbSkgeworICAgICAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC50cmFuc3BvcnRCYWNrQ2hhbm5lbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QudHJhbnNwb3J0QmFja0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQYWNrZXQgcGFja2V0ID0gYXJnc0J1aWxkZXIuZ2V0UmVzcG9uc2UocmVxdWVzdCwgcGFyYW0sIGdldEVuZHBvaW50KCkuZ2V0UG9ydCgpLCBnZXRFbmRwb2ludCgpLmdldEJpbmRpbmcoKSk7CisgICAgICAgICAgICBmaWJlci5yZXN1bWUocGFja2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihATm90TnVsbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGU7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBlID0gKFJ1bnRpbWVFeGNlcHRpb24pdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFja2V0IHBhY2tldCA9IGFyZ3NCdWlsZGVyLmdldFJlc3BvbnNlKHJlcXVlc3QsIGUsIGdldEVuZHBvaW50KCkuZ2V0UG9ydCgpLCBnZXRFbmRwb2ludCgpLmdldEJpbmRpbmcoKSk7CisgICAgICAgICAgICBmaWJlci5yZXN1bWUocGFja2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzaW5nbGUge0BsaW5rIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dH0gaW5zdGFuY2UgaW5qZWN0ZWQgaW50byBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBc3luY1dlYlNlcnZpY2VDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlQ29udGV4dCB7CisgICAgICAgIGZpbmFsIFBhY2tldCBwYWNrZXQ7CisKKyAgICAgICAgQXN5bmNXZWJTZXJ2aWNlQ29udGV4dChXU0VuZHBvaW50IGVuZHBvaW50LCBQYWNrZXQgcGFja2V0KSB7CisgICAgICAgICAgICBzdXBlcihlbmRwb2ludCk7CisgICAgICAgICAgICB0aGlzLnBhY2tldCA9IHBhY2tldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBATm90TnVsbCBQYWNrZXQgZ2V0UmVxdWVzdFBhY2tldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQE5vdE51bGwgTmV4dEFjdGlvbiBwcm9jZXNzUmVzcG9uc2UoQE5vdE51bGwgUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybiBkb1JldHVybldpdGgocmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBOZXh0QWN0aW9uIHByb2Nlc3NFeGNlcHRpb24oQE5vdE51bGwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXN5bmNQcm92aWRlckludm9rZXJUdWJlJ3MgcHJvY2Vzc0V4Y2VwdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkLiIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL01lc3NhZ2VQcm92aWRlckFyZ3VtZW50QnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL01lc3NhZ2VQcm92aWRlckFyZ3VtZW50QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjMyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcHJvdmlkZXIvTWVzc2FnZVByb3ZpZGVyQXJndW1lbnRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZmF1bHQuU09BUEZhdWx0QnVpbGRlcjsKKworLyoqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2ZpbmFsIGNsYXNzIE1lc3NhZ2VQcm92aWRlckFyZ3VtZW50QnVpbGRlciBleHRlbmRzIFByb3ZpZGVyQXJndW1lbnRzQnVpbGRlcjxNZXNzYWdlPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKworICAgIHB1YmxpYyBNZXNzYWdlUHJvdmlkZXJBcmd1bWVudEJ1aWxkZXIoU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IHNvYXBWZXJzaW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBNZXNzYWdlIGdldFBhcmFtZXRlcihQYWNrZXQgcGFja2V0KSB7CisgICAgICAgIHJldHVybiBwYWNrZXQuZ2V0TWVzc2FnZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBNZXNzYWdlIGdldFJlc3BvbnNlTWVzc2FnZShNZXNzYWdlIHJldHVyblZhbHVlKSB7CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTWVzc2FnZSBnZXRSZXNwb25zZU1lc3NhZ2UoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmV0dXJuIFNPQVBGYXVsdEJ1aWxkZXIuY3JlYXRlU09BUEZhdWx0TWVzc2FnZShzb2FwVmVyc2lvbiwgbnVsbCwgZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVyQXJndW1lbnRzQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVyQXJndW1lbnRzQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2Q3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcHJvdmlkZXIvUHJvdmlkZXJBcmd1bWVudHNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworCitpbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7CisKKy8qKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworCithYnN0cmFjdCBjbGFzcyBQcm92aWRlckFyZ3VtZW50c0J1aWxkZXI8VD4geworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZhdWx0IHtAbGluayBNZXNzYWdlfSBmcm9tIG1ldGhvZCBpbnZvY2F0aW9uJ3MgZXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE1lc3NhZ2UgZ2V0UmVzcG9uc2VNZXNzYWdlKEV4Y2VwdGlvbiBlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMge0BsaW5rIE1lc3NhZ2V9IGZyb20gbWV0aG9kIGludm9jYXRpb24ncyByZXR1cm4gdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGFja2V0IGdldFJlc3BvbnNlKFBhY2tldCByZXF1ZXN0LCBFeGNlcHRpb24gZSwgV1NETFBvcnQgcG9ydCwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0UmVzcG9uc2VNZXNzYWdlKGUpOworICAgICAgICBQYWNrZXQgcmVzcG9uc2UgPSByZXF1ZXN0LmNyZWF0ZVNlcnZlclJlc3BvbnNlKG1lc3NhZ2UscG9ydCxudWxsLGJpbmRpbmcpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2V9IHRvIG1ldGhvZCBpbnZvY2F0aW9uIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBwYWNrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRQYXJhbWV0ZXIoUGFja2V0IHBhY2tldCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWVzc2FnZSBnZXRSZXNwb25zZU1lc3NhZ2UoVCByZXR1cm5WYWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHtAbGluayBQYWNrZXR9IGZyb20gbWV0aG9kIGludm9jYXRpb24ncyByZXR1cm4gdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGFja2V0IGdldFJlc3BvbnNlKFBhY2tldCByZXF1ZXN0LCBATnVsbGFibGUgVCByZXR1cm5WYWx1ZSwgV1NETFBvcnQgcG9ydCwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgaWYgKHJldHVyblZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRSZXNwb25zZU1lc3NhZ2UocmV0dXJuVmFsdWUpOworICAgICAgICB9CisgICAgICAgIFBhY2tldCByZXNwb25zZSA9IHJlcXVlc3QuY3JlYXRlU2VydmVyUmVzcG9uc2UobWVzc2FnZSxwb3J0LG51bGwsYmluZGluZyk7CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb3ZpZGVyQXJndW1lbnRzQnVpbGRlcjw/PiBjcmVhdGUoUHJvdmlkZXJFbmRwb2ludE1vZGVsIG1vZGVsLCBXU0JpbmRpbmcgYmluZGluZykgeworICAgICAgICByZXR1cm4gKGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgPyBTT0FQUHJvdmlkZXJBcmd1bWVudEJ1aWxkZXIuY3JlYXRlKG1vZGVsLCBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgOiBYTUxQcm92aWRlckFyZ3VtZW50QnVpbGRlci5jcmVhdGUobW9kZWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVyRW5kcG9pbnRNb2RlbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVyRW5kcG9pbnRNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0N2IyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcHJvdmlkZXIvUHJvdmlkZXJFbmRwb2ludE1vZGVsLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnByb3ZpZGVyOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Bc3luY1Byb3ZpZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5TZXJ2ZXJNZXNzYWdlczsKKworaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7CitpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKKworLyoqCisgKiBLZWVwcyB0aGUgcnVudGltZSBpbmZvcm1hdGlvbiBsaWtlIFNlcnZpY2UuTW9kZSBhbmQgZXJhc3VyZSBvZiBQcm92aWRlciBjbGFzcworICogYWJvdXQgUHJvdmlkZXIgZW5kcG9pbnQuIEl0IHByb2NjZXNzIGFubm90YXRpb25zIHRvIGZpbmQgYWJvdXQgU2VydmljZS5Nb2RlCisgKiBJdCBhbHNvIGZpbmRzIGFib3V0IHBhcmFtZXRlcml6ZWQgdHlwZShlLmcuIFNvdXJjZSwgU09BUE1lc3NhZ2UsIERhdGFTb3VyY2UpCisgKiBvZiBlbmRwb2ludCBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitmaW5hbCBjbGFzcyBQcm92aWRlckVuZHBvaW50TW9kZWw8VD4geworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBpcyB7QGxpbmsgQXN5bmNQcm92aWRlcn0uCisgICAgICovCisgICAgZmluYWwgYm9vbGVhbiBpc0FzeW5jOworCisgICAgLyoqCisgICAgICogSW4gd2hpY2ggbW9kZSBkb2VzIHRoaXMgcHJvdmlkZXIgb3BlcmF0ZT8KKyAgICAgKi8KKyAgICBATm90TnVsbCBmaW5hbCBTZXJ2aWNlLk1vZGUgbW9kZTsKKyAgICAvKioKKyAgICAgKiBUIG9mIHtAbGluayBQcm92aWRlcn0mbHQ7VD4uCisgICAgICovCisgICAgQE5vdE51bGwgZmluYWwgQ2xhc3MgZGF0YXR5cGU7CisgICAgLyoqCisgICAgICogVXNlciBjbGFzcyB0aGF0IGV4dGVuZHMge0BsaW5rIFByb3ZpZGVyfS4KKyAgICAgKi8KKyAgICBATm90TnVsbCBmaW5hbCBDbGFzcyBpbXBsQ2xhc3M7CisKKyAgICBQcm92aWRlckVuZHBvaW50TW9kZWwoQ2xhc3M8VD4gaW1wbGVtZW50b3JDbGFzcywgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgYXNzZXJ0IGltcGxlbWVudG9yQ2xhc3MgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IGJpbmRpbmcgIT0gbnVsbDsKKworICAgICAgICBpbXBsQ2xhc3MgPSBpbXBsZW1lbnRvckNsYXNzOworICAgICAgICBtb2RlID0gZ2V0U2VydmljZU1vZGUoaW1wbGVtZW50b3JDbGFzcyk7CisgICAgICAgIENsYXNzIG90aGVyQ2xhc3MgPSAoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQorICAgICAgICAgICAgPyBTT0FQTWVzc2FnZS5jbGFzcyA6IERhdGFTb3VyY2UuY2xhc3M7CisgICAgICAgIGlzQXN5bmMgPSBBc3luY1Byb3ZpZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW1wbGVtZW50b3JDbGFzcyk7CisKKworICAgICAgICBDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBiYXNlVHlwZSA9IGlzQXN5bmMgPyBBc3luY1Byb3ZpZGVyLmNsYXNzIDogUHJvdmlkZXIuY2xhc3M7CisgICAgICAgIFR5cGUgYmFzZVBhcmFtID0gSkFYQlJJQ29udGV4dC5nZXRCYXNlVHlwZShpbXBsZW1lbnRvckNsYXNzLCBiYXNlVHlwZSk7CisgICAgICAgIGlmIChiYXNlUGFyYW09PW51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5OT1RfSU1QTEVNRU5UX1BST1ZJREVSKGltcGxlbWVudG9yQ2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgIGlmICghKGJhc2VQYXJhbSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKFNlcnZlck1lc3NhZ2VzLlBST1ZJREVSX05PVF9QQVJBTUVURVJJWkVEKGltcGxlbWVudG9yQ2xhc3MuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpYmFzZVBhcmFtOworICAgICAgICBUeXBlW10gdHlwZXMgPSBwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCk7CisgICAgICAgIGlmKCEodHlwZXNbMF0gaW5zdGFuY2VvZiBDbGFzcykpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5QUk9WSURFUl9JTlZBTElEX1BBUkFNRVRFUl9UWVBFKGltcGxlbWVudG9yQ2xhc3MuZ2V0TmFtZSgpLHR5cGVzWzBdKSk7CisgICAgICAgIGRhdGF0eXBlID0gKENsYXNzKXR5cGVzWzBdOworCisgICAgICAgIGlmIChtb2RlID09IFNlcnZpY2UuTW9kZS5QQVlMT0FEICYmIGRhdGF0eXBlIT1Tb3VyY2UuY2xhc3MpIHsKKyAgICAgICAgICAgIC8vIElsbGVnYWwgdG8gaGF2ZSBQQVlMT0FEICYmIFNPQVBNZXNzYWdlCisgICAgICAgICAgICAvLyBJbGxlZ2FsIHRvIGhhdmUgUEFZTE9BRCAmJiBEYXRhU291cmNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJJbGxlYWdhbCBjb21iaW5hdGlvbiAtIE1vZGUuUEFZTE9BRCBhbmQgUHJvdmlkZXI8IitvdGhlckNsYXNzLmdldE5hbWUoKSsiPiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgaXQgUEFZTE9BRCBvciBNRVNTQUdFID8/CisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBlbmRwb2ludCBjbGFzcworICAgICAqIEByZXR1cm4gU2VydmljZS5Nb2RlLlBBWUxPQUQgb3IgU2VydmljZS5Nb2RlLk1FU1NBR0UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTZXJ2aWNlLk1vZGUgZ2V0U2VydmljZU1vZGUoQ2xhc3M8Pz4gYykgeworICAgICAgICBTZXJ2aWNlTW9kZSBtb2RlID0gYy5nZXRBbm5vdGF0aW9uKFNlcnZpY2VNb2RlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIChtb2RlID09IG51bGwpID8gU2VydmljZS5Nb2RlLlBBWUxPQUQgOiBtb2RlLnZhbHVlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVySW52b2tlclR1YmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9wcm92aWRlci9Qcm92aWRlckludm9rZXJUdWJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMmM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9wcm92aWRlci9Qcm92aWRlckludm9rZXJUdWJlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Bc3luY1Byb3ZpZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuSW52b2tlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuSW52b2tlclR1YmU7CisKK2ltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyB7QGxpbmsgVHViZX0gaXMgdXNlZCB0byBpbnZva2UgdGhlIHtAbGluayBQcm92aWRlcn0gYW5kIHtAbGluayBBc3luY1Byb3ZpZGVyfSBlbmRwb2ludHMuCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3ZpZGVySW52b2tlclR1YmU8VD4gZXh0ZW5kcyBJbnZva2VyVHViZTxQcm92aWRlcjxUPj4geworCisgICAgcHJvdGVjdGVkIFByb3ZpZGVyQXJndW1lbnRzQnVpbGRlcjxUPiBhcmdzQnVpbGRlcjsKKworICAgIC8qcGFja2FnZSovIFByb3ZpZGVySW52b2tlclR1YmUoSW52b2tlciBpbnZva2VyLCBQcm92aWRlckFyZ3VtZW50c0J1aWxkZXI8VD4gYXJnc0J1aWxkZXIpIHsKKyAgICAgICAgc3VwZXIoaW52b2tlcik7CisgICAgICAgIHRoaXMuYXJnc0J1aWxkZXIgPSBhcmdzQnVpbGRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBQcm92aWRlckludm9rZXJUdWJlPFQ+CisgICAgY3JlYXRlKENsYXNzPFQ+IGltcGxUeXBlLCBXU0JpbmRpbmcgYmluZGluZywgSW52b2tlciBpbnZva2VyKSB7CisKKyAgICAgICAgUHJvdmlkZXJFbmRwb2ludE1vZGVsPFQ+IG1vZGVsID0gbmV3IFByb3ZpZGVyRW5kcG9pbnRNb2RlbDxUPihpbXBsVHlwZSwgYmluZGluZyk7CisgICAgICAgIFByb3ZpZGVyQXJndW1lbnRzQnVpbGRlcjw/PiBhcmdzQnVpbGRlciA9IFByb3ZpZGVyQXJndW1lbnRzQnVpbGRlci5jcmVhdGUobW9kZWwsIGJpbmRpbmcpOworICAgICAgICByZXR1cm4gbW9kZWwuaXNBc3luYyA/IG5ldyBBc3luY1Byb3ZpZGVySW52b2tlclR1YmUoaW52b2tlciwgYXJnc0J1aWxkZXIpCisgICAgICAgICAgICA6IG5ldyBTeW5jUHJvdmlkZXJJbnZva2VyVHViZShpbnZva2VyLCBhcmdzQnVpbGRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVyTW9kZWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9wcm92aWRlci9Qcm92aWRlck1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjI1NzguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVyTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5KQVhCUklDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlBlcHRUaWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLQotLyoqCi0gKiBLZWVwcyB0aGUgcnVudGltZSBpbmZvcm1hdGlvbiBsaWtlIFNlcnZpY2UuTW9kZSBhbmQgZXJhc3VyZSBvZiBQcm92aWRlciBjbGFzcwotICogYWJvdXQgUHJvdmlkZXIgZW5kcG9pbnQuIEl0IHByb2NjZXNzIGFubm90YXRpb25zIHRvIGZpbmQgYWJvdXQgU2VydmljZS5Nb2RlCi0gKiBJdCBhbHNvIGZpbmRzIGFib3V0IHBhcmFtZXRlcml6ZWQgdHlwZShlLmcuIFNvdXJjZSwgU09BUE1lc3NhZ2UsIERhdGFTb3VyY2UpCi0gKiBvZiBlbmRwb2ludCBjbGFzcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm92aWRlck1vZGVsIHsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1NvdXJjZTsKLSAgICBwcml2YXRlIGZpbmFsIFNlcnZpY2UuTW9kZSBtb2RlOwotCi0gICAgcHVibGljIFByb3ZpZGVyTW9kZWwoQ2xhc3MgaW1wbGVtZW50b3JDbGFzcywgQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIGFzc2VydCBpbXBsZW1lbnRvckNsYXNzICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBiaW5kaW5nICE9IG51bGw7Ci0KLSAgICAgICAgbW9kZSA9IGdldFNlcnZpY2VNb2RlKGltcGxlbWVudG9yQ2xhc3MpOwotICAgICAgICBDbGFzcyBvdGhlckNsYXNzID0gKGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZykKLSAgICAgICAgICAgID8gU09BUE1lc3NhZ2UuY2xhc3MgOiBEYXRhU291cmNlLmNsYXNzOwotICAgICAgICBpc1NvdXJjZSA9IGlzU291cmNlKGltcGxlbWVudG9yQ2xhc3MsIG90aGVyQ2xhc3MpOwotICAgICAgICBpZiAobW9kZSA9PSBTZXJ2aWNlLk1vZGUuUEFZTE9BRCAmJiAhaXNTb3VyY2UpIHsKLSAgICAgICAgICAgIC8vIElsbGVnYWwgdG8gaGF2ZSBQQVlMT0FEICYmIFNPQVBNZXNzYWdlCi0gICAgICAgICAgICAvLyBJbGxlZ2FsIHRvIGhhdmUgUEFZTE9BRCAmJiBEYXRhU291cmNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJJbGxlYWdhbCBjb21iaW5hdGlvbiAtIE1vZGUuUEFZTE9BRCBhbmQgUHJvdmlkZXI8IitvdGhlckNsYXNzLmdldE5hbWUoKSsiPiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBpc1NvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZS5Nb2RlIGdldFNlcnZpY2VNb2RlKCkgewotICAgICAgICByZXR1cm4gbW9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyBpdCBQQVlMT0FEIG9yIE1FU1NBR0UgPz8KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTZXJ2aWNlLk1vZGUgZ2V0U2VydmljZU1vZGUoQ2xhc3MgYykgewotICAgICAgICBTZXJ2aWNlTW9kZSBtb2RlID0gKFNlcnZpY2VNb2RlKWMuZ2V0QW5ub3RhdGlvbihTZXJ2aWNlTW9kZS5jbGFzcyk7Ci0gICAgICAgIGlmIChtb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBTZXJ2aWNlLk1vZGUuUEFZTE9BRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kZS52YWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzIGl0IFByb3ZpZGVyPFNvdXJjZT4gPyBGaW5kcyB3aGV0aGVyIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgaXMKLSAgICAgKiBTb3VyY2UuY2xhc3Mgb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIGMgcHJvdmlkZXIgZW5kcG9pbnQgY2xhc3MKLSAgICAgKiBAcGFyYW0gb3RoZXJDbGFzcyBUeXBpY2FsbHkgU09BUE1lc3NhZ2UuY2xhc3Mgb3IgRGF0YVNvdXJjZS5jbGFzcwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjJ3MgcGFyYW1ldGVyaXplZCB0eXBlIGlzIFNvdXJjZQotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaXQgaXMgbm90Ci0gICAgICogICAgICAgICBQcm92aWRlcjxTb3VyY2U+IG9yIFByb3ZpZGVyPG90aGVyQ2xhc3M+Ci0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU291cmNlKENsYXNzIGMsIENsYXNzIG90aGVyQ2xhc3MpIHsKLSAgICAgICAgVHlwZSBiYXNlID0gSkFYQlJJQ29udGV4dC5nZXRCYXNlVHlwZShjLCBQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIGFzc2VydCBiYXNlICE9IG51bGw7Ci0gICAgICAgIGlmIChiYXNlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKWJhc2U7Ci0gICAgICAgICAgICBUeXBlW10gdHlwZXMgPSBwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAodHlwZXNbMF0gaW5zdGFuY2VvZiBDbGFzcyAmJiBTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgoQ2xhc3MpdHlwZXNbMF0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZXNbMF0gaW5zdGFuY2VvZiBDbGFzcyAmJiBvdGhlckNsYXNzLmlzQXNzaWduYWJsZUZyb20oKENsYXNzKXR5cGVzWzBdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIkVuZHBvaW50IHNob3VsZCBpbXBsZW1lbnQgUHJvdmlkZXI8IitTb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKwotICAgICAgICAgICAgICAgICI+IG9yIFByb3ZpZGVyPCIrb3RoZXJDbGFzcy5nZXROYW1lKCkrIj4iKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVyUGVwdFRpZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1Byb3ZpZGVyUGVwdFRpZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ1ZGU0Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9wcm92aWRlci9Qcm92aWRlclBlcHRUaWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LnByZXNlbnRhdGlvbi5NZXNzYWdlU3RydWN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUGVwdFRpZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVFbmRwb2ludEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5NZXNzYWdlSW5mb1V0aWw7Ci0KLQotLyoqCi0gKiBDcmVhdGVzIGEgU3RhdGVsZXNzIFRpZSBvYmplY3Qgc28gdGhhdCBpdCBpcyBjcmVhdGVkIG9ubHkgb25jZSBhbmQgcmV1c2VkLgotICovCi1wdWJsaWMgY2xhc3MgUHJvdmlkZXJQZXB0VGllIGV4dGVuZHMgUGVwdFRpZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigKLSAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db25zdGFudHMuTG9nZ2luZ0RvbWFpbiArICIuc2VydmVyLlByb3ZpZGVyUGVwdFRpZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2QgaW52b2tlX01ldGhvZDsKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3NbXSBtZXRob2RQYXJhbXMgPSB7IE9iamVjdC5jbGFzcyB9OwotICAgICAgICAgICAgaW52b2tlX01ldGhvZCA9IChQcm92aWRlci5jbGFzcykuZ2V0TWV0aG9kKCJpbnZva2UiLCBtZXRob2RQYXJhbXMpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qCi0gICAgICogQHNlZSBUaWUjX2ludm9rZShNZXNzYWdlSW5mbykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBfaW52b2tlKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIE9iamVjdFtdIG9hID0gbWVzc2FnZUluZm8uZ2V0RGF0YSgpOwotICAgICAgICBSdW50aW1lQ29udGV4dCBydEN0eHQgPSBNZXNzYWdlSW5mb1V0aWwuZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbyA9IHJ0Q3R4dC5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCk7Ci0gICAgICAgIFByb3ZpZGVyIHNlcnZhbnQgPSAoUHJvdmlkZXIpZW5kcG9pbnRJbmZvLmdldEltcGxlbWVudG9yKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3QgcmVzcG9uc2UgPSBzZXJ2YW50Lmludm9rZShvYVswXSk7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZVR5cGUoTWVzc2FnZVN0cnVjdC5OT1JNQUxfUkVTUE9OU0UpOwotICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRNRVAoTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldE1FUChNZXNzYWdlU3RydWN0LlJFUVVFU1RfUkVTUE9OU0VfTUVQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgbWVzc2FnZUluZm8uc2V0UmVzcG9uc2VUeXBlKE1lc3NhZ2VTdHJ1Y3QuVU5DSEVDS0VEX0VYQ0VQVElPTl9SRVNQT05TRSk7Ci0gICAgICAgICAgICBtZXNzYWdlSW5mby5zZXRSZXNwb25zZShlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlVHlwZShNZXNzYWdlU3RydWN0LkNIRUNLRURfRVhDRVBUSU9OX1JFU1BPTlNFKTsKLSAgICAgICAgICAgIG1lc3NhZ2VJbmZvLnNldFJlc3BvbnNlKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcHJvdmlkZXIvU09BUFByb3ZpZGVyQXJndW1lbnRCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcHJvdmlkZXIvU09BUFByb3ZpZGVyQXJndW1lbnRCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyNThhNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9wcm92aWRlci9TT0FQUHJvdmlkZXJBcmd1bWVudEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5mYXVsdC5TT0FQRmF1bHRCdWlsZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5TZXJ2ZXJNZXNzYWdlczsKKworaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK2Fic3RyYWN0IGNsYXNzIFNPQVBQcm92aWRlckFyZ3VtZW50QnVpbGRlcjxUPiBleHRlbmRzIFByb3ZpZGVyQXJndW1lbnRzQnVpbGRlcjxUPiB7CisgICAgcHJvdGVjdGVkIGZpbmFsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uOworCisgICAgcHJpdmF0ZSBTT0FQUHJvdmlkZXJBcmd1bWVudEJ1aWxkZXIoU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IHNvYXBWZXJzaW9uOworICAgIH0KKworICAgIHN0YXRpYyBQcm92aWRlckFyZ3VtZW50c0J1aWxkZXIgY3JlYXRlKFByb3ZpZGVyRW5kcG9pbnRNb2RlbCBtb2RlbCwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgaWYgKG1vZGVsLm1vZGUgPT0gU2VydmljZS5Nb2RlLlBBWUxPQUQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGF5bG9hZFNvdXJjZShzb2FwVmVyc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihtb2RlbC5kYXRhdHlwZT09U291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZVNvdXJjZShzb2FwVmVyc2lvbik7CisgICAgICAgICAgICBpZihtb2RlbC5kYXRhdHlwZT09U09BUE1lc3NhZ2UuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQTWVzc2FnZVBhcmFtZXRlcihzb2FwVmVyc2lvbik7CisgICAgICAgICAgICBpZihtb2RlbC5kYXRhdHlwZT09TWVzc2FnZS5jbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VQcm92aWRlckFyZ3VtZW50QnVpbGRlcihzb2FwVmVyc2lvbik7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5QUk9WSURFUl9JTlZBTElEX1BBUkFNRVRFUl9UWVBFKG1vZGVsLmltcGxDbGFzcyxtb2RlbC5kYXRhdHlwZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGF5bG9hZFNvdXJjZSBleHRlbmRzIFNPQVBQcm92aWRlckFyZ3VtZW50QnVpbGRlcjxTb3VyY2U+IHsKKyAgICAgICAgUGF5bG9hZFNvdXJjZShTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICAgICAgc3VwZXIoc29hcFZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFNvdXJjZSBnZXRQYXJhbWV0ZXIoUGFja2V0IHBhY2tldCkgeworICAgICAgICAgICAgcmV0dXJuIHBhY2tldC5nZXRNZXNzYWdlKCkucmVhZFBheWxvYWRBc1NvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1lc3NhZ2UgZ2V0UmVzcG9uc2VNZXNzYWdlKFNvdXJjZSBzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlcy5jcmVhdGVVc2luZ1BheWxvYWQoc291cmNlLCBzb2FwVmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgTWVzc2FnZSBnZXRSZXNwb25zZU1lc3NhZ2UoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2Uoc29hcFZlcnNpb24sIG51bGwsIGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNZXNzYWdlU291cmNlIGV4dGVuZHMgU09BUFByb3ZpZGVyQXJndW1lbnRCdWlsZGVyPFNvdXJjZT4geworICAgICAgICBNZXNzYWdlU291cmNlKFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgICAgICBzdXBlcihzb2FwVmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU291cmNlIGdldFBhcmFtZXRlcihQYWNrZXQgcGFja2V0KSB7CisgICAgICAgICAgICByZXR1cm4gcGFja2V0LmdldE1lc3NhZ2UoKS5yZWFkRW52ZWxvcGVBc1NvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1lc3NhZ2UgZ2V0UmVzcG9uc2VNZXNzYWdlKFNvdXJjZSBzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlcy5jcmVhdGUoc291cmNlLCBzb2FwVmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgTWVzc2FnZSBnZXRSZXNwb25zZU1lc3NhZ2UoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2Uoc29hcFZlcnNpb24sIG51bGwsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU09BUE1lc3NhZ2VQYXJhbWV0ZXIgZXh0ZW5kcyBTT0FQUHJvdmlkZXJBcmd1bWVudEJ1aWxkZXI8U09BUE1lc3NhZ2U+IHsKKyAgICAgICAgU09BUE1lc3NhZ2VQYXJhbWV0ZXIoU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKHNvYXBWZXJzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTT0FQTWVzc2FnZSBnZXRQYXJhbWV0ZXIoUGFja2V0IHBhY2tldCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja2V0LmdldE1lc3NhZ2UoKS5yZWFkQXNTT0FQTWVzc2FnZShwYWNrZXQsIHRydWUpOworICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBNZXNzYWdlIGdldFJlc3BvbnNlTWVzc2FnZShTT0FQTWVzc2FnZSBzb2FwTXNnKSB7CisgICAgICAgICAgICByZXR1cm4gTWVzc2FnZXMuY3JlYXRlKHNvYXBNc2cpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1lc3NhZ2UgZ2V0UmVzcG9uc2VNZXNzYWdlKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gU09BUEZhdWx0QnVpbGRlci5jcmVhdGVTT0FQRmF1bHRNZXNzYWdlKHNvYXBWZXJzaW9uLCBudWxsLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGFja2V0IGdldFJlc3BvbnNlKFBhY2tldCByZXF1ZXN0LCBATnVsbGFibGUgU09BUE1lc3NhZ2UgcmV0dXJuVmFsdWUsIFdTRExQb3J0IHBvcnQsIFdTQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgICAgICBQYWNrZXQgcmVzcG9uc2UgPSBzdXBlci5nZXRSZXNwb25zZShyZXF1ZXN0LCByZXR1cm5WYWx1ZSwgcG9ydCwgYmluZGluZyk7CisgICAgICAgICAgICAvLyBQb3B1bGF0ZSBTT0FQTWVzc2FnZSdzIHRyYW5zcG9ydCBoZWFkZXJzCisgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWUgIT0gbnVsbCAmJiByZXNwb25zZS5zdXBwb3J0cyhQYWNrZXQuT1VUQk9VTkRfVFJBTlNQT1JUX0hFQURFUlMpKSB7CisgICAgICAgICAgICAgICAgTWltZUhlYWRlcnMgaGRycyA9IHJldHVyblZhbHVlLmdldE1pbWVIZWFkZXJzKCk7CisgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGhkcnMuZ2V0QWxsSGVhZGVycygpOworICAgICAgICAgICAgICAgIHdoaWxlKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1pbWVIZWFkZXIgaGVhZGVyID0gKE1pbWVIZWFkZXIpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmKGhlYWRlci5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiU09BUEFjdGlvbiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0FBSiBzZXRzIHRoaXMgaGVhZGVyIGF1dG9tYXRpY2FsbHksIGJ1dCBpdCBpbnRlcmZlcmVzIHdpdGggdGhlIGNvcnJlY3Qgb3BlcmF0aW9uIG9mIEpBWC1XUy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGlnbm9yZSB0aGlzIGhlYWRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gaGVhZGVycy5nZXQoaGVhZGVyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0KGhlYWRlci5nZXROYW1lKCksIGxpc3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzcG9uc2UucHV0KFBhY2tldC5PVVRCT1VORF9UUkFOU1BPUlRfSEVBREVSUywgaGVhZGVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1N5bmNQcm92aWRlckludm9rZXJUdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcHJvdmlkZXIvU3luY1Byb3ZpZGVySW52b2tlclR1YmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTY0MDc3Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1N5bmNQcm92aWRlckludm9rZXJUdWJlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIucHJvdmlkZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLk5leHRBY3Rpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5JbnZva2VyOworCitpbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBUaGlzIHR1YmUgaXMgdXNlZCB0byBpbnZva2UgdGhlIHtAbGluayBQcm92aWRlcn0gZW5kcG9pbnRzLgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK2NsYXNzIFN5bmNQcm92aWRlckludm9rZXJUdWJlPFQ+IGV4dGVuZHMgUHJvdmlkZXJJbnZva2VyVHViZTxUPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcigKKyAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5Db25zdGFudHMuTG9nZ2luZ0RvbWFpbiArICIuc2VydmVyLlN5bmNQcm92aWRlckludm9rZXJUdWJlIik7CisKKyAgICBwdWJsaWMgU3luY1Byb3ZpZGVySW52b2tlclR1YmUoSW52b2tlciBpbnZva2VyLCBQcm92aWRlckFyZ3VtZW50c0J1aWxkZXI8VD4gYXJnc0J1aWxkZXIpIHsKKyAgICAgICAgc3VwZXIoaW52b2tlciwgYXJnc0J1aWxkZXIpOworICAgIH0KKworICAgIC8qCisgICAgKiBUaGlzIGJpbmRzIHRoZSBwYXJhbWV0ZXIgZm9yIFByb3ZpZGVyIGVuZHBvaW50cyBhbmQgaW52b2tlcyB0aGUKKyAgICAqIGludm9rZSgpIG1ldGhvZCBvZiB7QGxpbmtlIFByb3ZpZGVyfSBlbmRwb2ludC4gVGhlIHJldHVybiB2YWx1ZSBmcm9tCisgICAgKiBpbnZva2UoKSBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyB7QGxpbmsgTWVzc2FnZX0gdGhhdCB0cmF2ZXJzZXMKKyAgICAqIHRocm91Z2ggdGhlIFBpcGVsaW5lIHRvIHRyYW5zcG9ydC4KKyAgICAqLworICAgIHB1YmxpYyBOZXh0QWN0aW9uIHByb2Nlc3NSZXF1ZXN0KFBhY2tldCByZXF1ZXN0KSB7CisgICAgICAgIFdTRExQb3J0IHBvcnQgPSBnZXRFbmRwb2ludCgpLmdldFBvcnQoKTsKKyAgICAgICAgV1NCaW5kaW5nIGJpbmRpbmcgPSBnZXRFbmRwb2ludCgpLmdldEJpbmRpbmcoKTsKKyAgICAgICAgVCBwYXJhbSA9IGFyZ3NCdWlsZGVyLmdldFBhcmFtZXRlcihyZXF1ZXN0KTsKKworICAgICAgICBMT0dHRVIuZmluZSgiSW52b2tpbmcgUHJvdmlkZXIgRW5kcG9pbnQiKTsKKworICAgICAgICBUIHJldHVyblZhbHVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBnZXRJbnZva2VyKHJlcXVlc3QpLmludm9rZVByb3ZpZGVyKHJlcXVlc3QsIHBhcmFtKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIFBhY2tldCByZXNwb25zZSA9IGFyZ3NCdWlsZGVyLmdldFJlc3BvbnNlKHJlcXVlc3QsZSxwb3J0LGJpbmRpbmcpOworICAgICAgICAgICAgcmV0dXJuIGRvUmV0dXJuV2l0aChyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldHVyblZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE9uZXdheS4gU2VuZCByZXNwb25zZSBjb2RlIGltbWVkaWF0ZWx5IGZvciB0cmFuc3BvcnRzKGxpa2UgSFRUUCkKKyAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgYWJvdmUsIHNpbmNlIGNsb3NlKCkgbWF5IGdlbmVyYXRlIHNvbWUgZXhjZXB0aW9ucworICAgICAgICAgICAgaWYgKHJlcXVlc3QudHJhbnNwb3J0QmFja0NoYW5uZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3QudHJhbnNwb3J0QmFja0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQYWNrZXQgcmVzcG9uc2UgPSBhcmdzQnVpbGRlci5nZXRSZXNwb25zZShyZXF1ZXN0LHJldHVyblZhbHVlLHBvcnQsYmluZGluZyk7CisgICAgICAgIHJldHVybiBkb1JldHVybldpdGgocmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyBOZXh0QWN0aW9uIHByb2Nlc3NSZXNwb25zZShQYWNrZXQgcmVzcG9uc2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5vdmtlclBpcGUncyBwcm9jZXNzUmVzcG9uc2Ugc2hvdWxkbid0IGJlIGNhbGxlZC4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzRXhjZXB0aW9uKEBOb3ROdWxsIFRocm93YWJsZSB0KSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklub3ZrZXJQaXBlJ3MgcHJvY2Vzc0V4Y2VwdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkLiIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1hNTFByb3ZpZGVyQXJndW1lbnRCdWlsZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvcHJvdmlkZXIvWE1MUHJvdmlkZXJBcmd1bWVudEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWIwMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3Byb3ZpZGVyL1hNTFByb3ZpZGVyQXJndW1lbnRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnByb3ZpZGVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcueG1sLlhNTE1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLlNlcnZlck1lc3NhZ2VzOworCitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworYWJzdHJhY3QgY2xhc3MgWE1MUHJvdmlkZXJBcmd1bWVudEJ1aWxkZXI8VD4gZXh0ZW5kcyBQcm92aWRlckFyZ3VtZW50c0J1aWxkZXI8VD4geworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBhY2tldCBnZXRSZXNwb25zZShQYWNrZXQgcmVxdWVzdCwgRXhjZXB0aW9uIGUsIFdTRExQb3J0IHBvcnQsIFdTQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIFBhY2tldCByZXNwb25zZSA9IHN1cGVyLmdldFJlc3BvbnNlKHJlcXVlc3QsIGUsIHBvcnQsIGJpbmRpbmcpOworICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEhUVFBFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdXBwb3J0cyhNZXNzYWdlQ29udGV4dC5IVFRQX1JFU1BPTlNFX0NPREUpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSwgKChIVFRQRXhjZXB0aW9uKWUpLmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKworICAgIHN0YXRpYyBYTUxQcm92aWRlckFyZ3VtZW50QnVpbGRlciBjcmVhdGUoUHJvdmlkZXJFbmRwb2ludE1vZGVsIG1vZGVsKSB7CisgICAgICAgIGlmIChtb2RlbC5tb2RlID09IFNlcnZpY2UuTW9kZS5QQVlMT0FEKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBheWxvYWRTb3VyY2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKG1vZGVsLmRhdGF0eXBlPT1Tb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXlsb2FkU291cmNlKCk7CisgICAgICAgICAgICBpZihtb2RlbC5kYXRhdHlwZT09IERhdGFTb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlUGFyYW1ldGVyKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihTZXJ2ZXJNZXNzYWdlcy5QUk9WSURFUl9JTlZBTElEX1BBUkFNRVRFUl9UWVBFKG1vZGVsLmltcGxDbGFzcyxtb2RlbC5kYXRhdHlwZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGF5bG9hZFNvdXJjZSBleHRlbmRzIFhNTFByb3ZpZGVyQXJndW1lbnRCdWlsZGVyPFNvdXJjZT4geworICAgICAgICBwdWJsaWMgU291cmNlIGdldFBhcmFtZXRlcihQYWNrZXQgcGFja2V0KSB7CisgICAgICAgICAgICByZXR1cm4gcGFja2V0LmdldE1lc3NhZ2UoKS5yZWFkUGF5bG9hZEFzU291cmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzc2FnZSBnZXRSZXNwb25zZU1lc3NhZ2UoU291cmNlIHNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VzLmNyZWF0ZVVzaW5nUGF5bG9hZChzb3VyY2UsIFNPQVBWZXJzaW9uLlNPQVBfMTEpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1lc3NhZ2UgZ2V0UmVzcG9uc2VNZXNzYWdlKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gWE1MTWVzc2FnZS5jcmVhdGUoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEYXRhU291cmNlUGFyYW1ldGVyIGV4dGVuZHMgWE1MUHJvdmlkZXJBcmd1bWVudEJ1aWxkZXI8RGF0YVNvdXJjZT4geworICAgICAgICBwdWJsaWMgRGF0YVNvdXJjZSBnZXRQYXJhbWV0ZXIoUGFja2V0IHBhY2tldCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBwYWNrZXQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgcmV0dXJuIChtc2cgaW5zdGFuY2VvZiBYTUxNZXNzYWdlLk1lc3NhZ2VEYXRhU291cmNlKQorICAgICAgICAgICAgICAgICAgICA/ICgoWE1MTWVzc2FnZS5NZXNzYWdlRGF0YVNvdXJjZSkgbXNnKS5nZXREYXRhU291cmNlKCkKKyAgICAgICAgICAgICAgICAgICAgOiBYTUxNZXNzYWdlLmdldERhdGFTb3VyY2UobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNzYWdlIGdldFJlc3BvbnNlTWVzc2FnZShEYXRhU291cmNlIGRzKSB7CisgICAgICAgICAgICByZXR1cm4gWE1MTWVzc2FnZS5jcmVhdGUoZHMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1lc3NhZ2UgZ2V0UmVzcG9uc2VNZXNzYWdlKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gWE1MTWVzc2FnZS5jcmVhdGUoZSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvQWN0aW9uQmFzZWREaXNwYXRjaGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL0FjdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YWEzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL0FjdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuc2VpOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlckxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuQWJzdHJhY3RTRUlNb2RlbEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuSmF2YU1ldGhvZEltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFuIHtAbGluayBFbmRwb2ludE1ldGhvZERpc3BhdGNoZXJ9IHRoYXQgdXNlcworICogV1MtQWRkcmVzc2luZyBBY3Rpb24gTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5LCA8Y29kZT53c2E6QWN0aW9uPC9jb2RlPiwKKyAqIGFzIHRoZSBrZXkgZm9yIGRpc3BhdGNoaW5nLgorICogPHAvPgorICogQSBtYXAgb2YgYWxsIHdzYTpBY3Rpb25zIG9uIHRoZSBwb3J0IGFuZCB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgRW5kcG9pbnRNZXRob2RIYW5kbGVyfQorICogaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiBUaGUgd3NhOkFjdGlvbiB2YWx1ZSBpcyBleHRyYWN0ZWQgZnJvbQorICogdGhlIHJlcXVlc3Qge0BsaW5rIFBhY2tldH0gYW5kIHVzZWQgYXMgdGhlIGtleSB0byByZXR1cm4gdGhlIGNvcnJlY3QKKyAqIGhhbmRsZXIuCisgKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK2ZpbmFsIGNsYXNzIEFjdGlvbkJhc2VkRGlzcGF0Y2hlciBpbXBsZW1lbnRzIEVuZHBvaW50TWV0aG9kRGlzcGF0Y2hlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBXU0JpbmRpbmcgYmluZGluZzsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEVuZHBvaW50TWV0aG9kSGFuZGxlcj4gYWN0aW9uTWV0aG9kSGFuZGxlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBATm90TnVsbCBBZGRyZXNzaW5nVmVyc2lvbiBhdjsKKworICAgIHB1YmxpYyBBY3Rpb25CYXNlZERpc3BhdGNoZXIoQWJzdHJhY3RTRUlNb2RlbEltcGwgbW9kZWwsIFdTQmluZGluZyBiaW5kaW5nLCBTRUlJbnZva2VyVHViZSBpbnZva2VyVHViZSkgeworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgICAgICBhc3NlcnQgYmluZGluZy5nZXRBZGRyZXNzaW5nVmVyc2lvbigpIT1udWxsOyAgICAvLyB0aGlzIGRpc3BhdGNoZXIgY2FuIGJlIG9ubHkgdXNlZCB3aGVuIGFkZHJlc3NpbmcgaXMgb24uCisgICAgICAgIGF2ID0gYmluZGluZy5nZXRBZGRyZXNzaW5nVmVyc2lvbigpOworICAgICAgICBhY3Rpb25NZXRob2RIYW5kbGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRW5kcG9pbnRNZXRob2RIYW5kbGVyPigpOworCisgICAgICAgIGZvciggSmF2YU1ldGhvZEltcGwgbSA6IG1vZGVsLmdldEphdmFNZXRob2RzKCkgKSB7CisgICAgICAgICAgICBFbmRwb2ludE1ldGhvZEhhbmRsZXIgaGFuZGxlciA9IG5ldyBFbmRwb2ludE1ldGhvZEhhbmRsZXIoaW52b2tlclR1YmUsbSxiaW5kaW5nKTsKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBtLmdldElucHV0QWN0aW9uKCk7CisgICAgICAgICAgICAvL2ZpcnN0IGxvb2sgYXQgYW5ub3RhdGlvbnMgYW5kIHRoZW4gaW4gd3NkbG1vZGVsCisgICAgICAgICAgICBpZihhY3Rpb24gIT0gbnVsbCAmJiAhYWN0aW9uLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBhY3Rpb25NZXRob2RIYW5kbGVycy5wdXQoYWN0aW9uLCBoYW5kbGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gbS5nZXRPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpLmdldEFjdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uTWV0aG9kSGFuZGxlcnMucHV0KGFjdGlvbiwgaGFuZGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRW5kcG9pbnRNZXRob2RIYW5kbGVyIGdldEVuZHBvaW50TWV0aG9kSGFuZGxlcihQYWNrZXQgcmVxdWVzdCkgdGhyb3dzIERpc3BhdGNoRXhjZXB0aW9uIHsKKworICAgICAgICBIZWFkZXJMaXN0IGhsID0gcmVxdWVzdC5nZXRNZXNzYWdlKCkuZ2V0SGVhZGVycygpOworCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBobC5nZXRBY3Rpb24oYXYsIGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSk7CisKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgLy8gdGhpcyBtZXNzYWdlIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzaW5nIGhlYWRlcnMsIHdoaWNoIGlzIGxlZ2FsLgorICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gdGhlIHNlcnZlciBpcyBjYXBhYmxlIG9mIHByb2Nlc3NpbmcgYWRkcmVzc2luZyBidXQgdGhlIGNsaWVudCBkaWRuJ3Qgc2VuZCB0aGVtCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBFbmRwb2ludE1ldGhvZEhhbmRsZXIgaCA9IGFjdGlvbk1ldGhvZEhhbmRsZXJzLmdldChhY3Rpb24pOworICAgICAgICBpZiAoaCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGg7CisKKyAgICAgICAgLy8gaW52YWxpZCBhY3Rpb24gaGVhZGVyCisgICAgICAgIE1lc3NhZ2UgcmVzdWx0ID0gTWVzc2FnZXMuY3JlYXRlKGFjdGlvbiwgYXYsIGJpbmRpbmcuZ2V0U09BUFZlcnNpb24oKSk7CisKKyAgICAgICAgdGhyb3cgbmV3IERpc3BhdGNoRXhjZXB0aW9uKHJlc3VsdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9EaXNwYXRjaEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9EaXNwYXRjaEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmM2I5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL0Rpc3BhdGNoRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5zZWk7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworCisvKioKKyAqIHtAbGluayBFeGNlcHRpb259IHRoYXQgZGVtYW5kcyBhIHNwZWNpZmljIGZhdWx0IG1lc3NhZ2UgdG8gYmUgc2VudCBiYWNrLgorICoKKyAqIFRPRE86IHRoaW5rIGFib3V0IGEgd2F5IHRvIGdlbmVyYWxpemUgaXQsIGFzIGl0IHNlZW1zIHRvIGJlIHVzZWZ1bAorICogaW4gb3RoZXIgcGxhY2VzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZmluYWwgY2xhc3MgRGlzcGF0Y2hFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICAgIGZpbmFsIE1lc3NhZ2UgZmF1bHQ7CisKKyAgICBwdWJsaWMgRGlzcGF0Y2hFeGNlcHRpb24oTWVzc2FnZSBmYXVsdCkgeworICAgICAgICB0aGlzLmZhdWx0ID0gZmF1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViNGVhNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw2MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnNlaTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkFjY2Vzc29yRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5Db21wb3NpdGVTdHJ1Y3R1cmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuUmF3QWNjZXNzb3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudFNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuV3JhcHBlclBhcmFtZXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuU2VydmVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlclV0aWw7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKK2ltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247CitpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogUmVhZHMgYSByZXF1ZXN0IHtAbGluayBNZXNzYWdlfSwgZGlzYXNzZW1ibGVzIGl0LCBhbmQgbW92ZXMgb2J0YWluZWQgSmF2YSB2YWx1ZXMKKyAqIHRvIHRoZSBleHBlY3RlZCBwbGFjZXMuCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworYWJzdHJhY3QgY2xhc3MgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyIHsKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIHJlcXVlc3Qge0BsaW5rIE1lc3NhZ2V9LCBkaXNhc3NlbWJsZXMgaXQsIGFuZCBtb3ZlcyBvYnRhaW5lZAorICAgICAqIEphdmEgdmFsdWVzIHRvIHRoZSBleHBlY3RlZCBwbGFjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqICAgICAgVGhlIHJlcXVlc3Qge0BsaW5rIE1lc3NhZ2V9IHRvIGJlIGRlLWNvbXBvc2VkLgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogICAgICBUaGUgSmF2YSBhcmd1bWVudHMgZ2l2ZW4gdG8gdGhlIFNFSSBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgKiAgICAgIFNvbWUgcGFydHMgb2YgdGhlIHJlcGx5IG1lc3NhZ2UgbWF5IGJlIHNldCB0byB7QGxpbmsgSG9sZGVyfXMgaW4gdGhlIGFyZ3VtZW50cy4KKyAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nIHVubWFyc2hhbGxpbmcgdGhlIHJlcXVlc3QgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgICAqICAgICAgaWYgdGhlcmUncyBhbiBlcnJvciBkdXJpbmcgdW5tYXJzaGFsbGluZyB0aGUgcmVxdWVzdCBtZXNzYWdlLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgcmVhZFJlcXVlc3QoTWVzc2FnZSByZXF1ZXN0LCBPYmplY3RbXSBhcmdzKQorICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uOworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE5vbmUgZXh0ZW5kcyBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIgeworICAgICAgICBwcml2YXRlIE5vbmUoKXsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCByZWFkUmVxdWVzdChNZXNzYWdlIG1zZywgT2JqZWN0W10gYXJncykgeworICAgICAgICAgICAgbXNnLmNvbnN1bWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UgdGhhdCBwcm9kdWNlcyBudWxsIHJldHVybiB2YWx1ZS4KKyAgICAgKiBVc2VkIGZvciBvcGVyYXRpb25zIHRoYXQgZG9lc24ndCBoYXZlIGFueSBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIgTk9ORSA9IG5ldyBOb25lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSAndW5pbml0aWFsaXplZCcgdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIHByaW1pdGl2ZSB0eXBlcywgaXQncyAnMCcsIGFuZCBmb3IgcmVmZXJlbmNlIHR5cGVzLCBpdCdzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Vk1VbmluaXRpYWxpemVkVmFsdWUoVHlwZSB0eXBlKSB7CisgICAgICAgIC8vIGlmIHRoaXMgbWFwIHJldHVybnMgbnVsbCwgdGhhdCBtZWFucyB0aGUgJ3R5cGUnIGlzIGEgcmVmZXJlbmNlIHR5cGUsCisgICAgICAgIC8vIGluIHdoaWNoIGNhc2UgJ251bGwnIGlzIHRoZSBjb3JyZWN0IG51bGwgdmFsdWUsIHNvIHRoaXMgY29kZSBpcyBjb3JyZWN0LgorICAgICAgICByZXR1cm4gcHJpbWl0aXZlVW5pbml0aWFsaXplZFZhbHVlcy5nZXQodHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzLE9iamVjdD4gcHJpbWl0aXZlVW5pbml0aWFsaXplZFZhbHVlcyA9IG5ldyBIYXNoTWFwPENsYXNzLCBPYmplY3Q+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBNYXA8Q2xhc3MsIE9iamVjdD4gbSA9IHByaW1pdGl2ZVVuaW5pdGlhbGl6ZWRWYWx1ZXM7CisgICAgICAgIG0ucHV0KGludC5jbGFzcywoaW50KTApOworICAgICAgICBtLnB1dChjaGFyLmNsYXNzLChjaGFyKTApOworICAgICAgICBtLnB1dChieXRlLmNsYXNzLChieXRlKTApOworICAgICAgICBtLnB1dChzaG9ydC5jbGFzcywoc2hvcnQpMCk7CisgICAgICAgIG0ucHV0KGxvbmcuY2xhc3MsKGxvbmcpMCk7CisgICAgICAgIG0ucHV0KGZsb2F0LmNsYXNzLChmbG9hdCkwKTsKKyAgICAgICAgbS5wdXQoZG91YmxlLmNsYXNzLChkb3VibGUpMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlcn0gdGhhdCBzZXRzIHRoZSBWTSB1bmluaXRpYWxpemVkIHZhbHVlIHRvIHRoZSB0eXBlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBOdWxsU2V0dGVyIGV4dGVuZHMgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbnVsbFZhbHVlOworCisgICAgICAgIHB1YmxpYyBOdWxsU2V0dGVyKEVuZHBvaW50VmFsdWVTZXR0ZXIgc2V0dGVyLCBPYmplY3QgbnVsbFZhbHVlKXsKKyAgICAgICAgICAgIGFzc2VydCBzZXR0ZXIhPW51bGw7CisgICAgICAgICAgICB0aGlzLm51bGxWYWx1ZSA9IG51bGxWYWx1ZTsKKyAgICAgICAgICAgIHRoaXMuc2V0dGVyID0gc2V0dGVyOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRSZXF1ZXN0KE1lc3NhZ2UgbXNnLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICBzZXR0ZXIucHV0KG51bGxWYWx1ZSwgYXJncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyfSB0aGF0IGlzIGEgY29tcG9zaXRpb24gb2YgbXVsdGlwbGUKKyAgICAgKiB7QGxpbmsgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyfXMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTb21ldGltZXMgd2UgbmVlZCB0byBsb29rIGF0IG11bHRpcGxlIHBhcnRzIG9mIHRoZSByZXBseSBtZXNzYWdlCisgICAgICogKHNheSwgdHdvIGhlYWRlciBwYXJhbXMsIG9uZSBib2R5IHBhcmFtLCBhbmQgdGhyZWUgYXR0YWNobWVudHMsIGV0Yy4pCisgICAgICogYW5kIHRoYXQncyB3aGVuIHRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gY29tYmluZSBtdWx0aXBsZSB7QGxpbmsgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyfXMKKyAgICAgKiAodGhhdCBlYWNoIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBvbmUgcGFydCkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbW9kZWwgZ3VhcmFudGVlcyB0aGF0IG9ubHkgYXQgbW9zdCBvbmUge0BsaW5rIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlcn0gd2lsbAorICAgICAqIHJldHVybiBhIHZhbHVlIGFzIGEgcmV0dXJuIHZhbHVlIChhbmQgZXZlcnl0aGluZyBlbHNlIGhhcyB0byBnbyB0bworICAgICAqIHtAbGluayBIb2xkZXJ9cy4pCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIENvbXBvc2l0ZSBleHRlbmRzIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyW10gYnVpbGRlcnM7CisKKyAgICAgICAgcHVibGljIENvbXBvc2l0ZShFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIuLi4gYnVpbGRlcnMpIHsKKyAgICAgICAgICAgIHRoaXMuYnVpbGRlcnMgPSBidWlsZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wb3NpdGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyPiBidWlsZGVycykgeworICAgICAgICAgICAgdGhpcyhidWlsZGVycy50b0FycmF5KG5ldyBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXJbYnVpbGRlcnMuc2l6ZSgpXSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVhZFJlcXVlc3QoTWVzc2FnZSBtc2csIE9iamVjdFtdIGFyZ3MpIHRocm93cyBKQVhCRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgZm9yIChFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIgYnVpbGRlciA6IGJ1aWxkZXJzKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5yZWFkUmVxdWVzdChtc2csYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWRzIGFuIEF0dGFjaG1lbnQgaW50byBhIEphdmEgcGFyYW1ldGVyLgorICAgICAqLworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBdHRhY2htZW50QnVpbGRlciBleHRlbmRzIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlciB7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlcjsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFBhcmFtZXRlckltcGwgcGFyYW07CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcG5hbWU7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcG5hbWUxOworCisgICAgICAgIEF0dGFjaG1lbnRCdWlsZGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIEVuZHBvaW50VmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICB0aGlzLnNldHRlciA9IHNldHRlcjsKKyAgICAgICAgICAgIHRoaXMucGFyYW0gPSBwYXJhbTsKKyAgICAgICAgICAgIHRoaXMucG5hbWUgPSBwYXJhbS5nZXRQYXJ0TmFtZSgpOworICAgICAgICAgICAgdGhpcy5wbmFtZTEgPSAiPCIrcG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBBdHRhY2htZW50QnVpbGRlciBiYXNlZCBvbiB0aGUgcGFyYW1ldGVyIHR5cGUKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmFtCisgICAgICAgICAqICAgICAgcnVudGltZSBQYXJhbWV0ZXIgdGhhdCBhYnN0cmFjdHMgdGhlIGFubm90YXRlZCBqYXZhIHBhcmFtZXRlcgorICAgICAgICAgKiBAcGFyYW0gc2V0dGVyCisgICAgICAgICAqICAgICAgc3BlY2lmaWVzIGhvdyB0aGUgb2J0YWluZWQgdmFsdWUgaXMgc2V0IGludG8gdGhlIGFyZ3VtZW50LiBUYWtlcworICAgICAgICAgKiAgICAgIGNhcmUgb2YgSG9sZGVyIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyIGNyZWF0ZUF0dGFjaG1lbnRCdWlsZGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIEVuZHBvaW50VmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICBDbGFzcyB0eXBlID0gKENsYXNzKXBhcmFtLmdldFR5cGVSZWZlcmVuY2UoKS50eXBlOworICAgICAgICAgICAgaWYgKERhdGFIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGFIYW5kbGVyQnVpbGRlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZVtdLmNsYXNzPT10eXBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlCdWlsZGVyKHBhcmFtLCBzZXR0ZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmKFNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VCdWlsZGVyKHBhcmFtLCBzZXR0ZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmKEltYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlQnVpbGRlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihJbnB1dFN0cmVhbS5jbGFzcz09dHlwZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW1CdWlsZGVyKHBhcmFtLCBzZXR0ZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmKGlzWE1MTWltZVR5cGUocGFyYW0uZ2V0QmluZGluZygpLmdldE1pbWVUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKQVhCQnVpbGRlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJBdHRhY2htZW50IGlzIG5vdCBtYXBwZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRSZXF1ZXN0KE1lc3NhZ2UgbXNnLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIFRPRE8gbm90IHRvIGxvb3AKKyAgICAgICAgICAgIGZvciAoQXR0YWNobWVudCBhdHQgOiBtc2cuZ2V0QXR0YWNobWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0ID0gZ2V0V1NETFBhcnROYW1lKGF0dCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocGFydC5lcXVhbHMocG5hbWUpIHx8IHBhcnQuZXF1YWxzKHBuYW1lMSkpeworICAgICAgICAgICAgICAgICAgICBtYXBBdHRhY2htZW50KGF0dCwgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IHZvaWQgbWFwQXR0YWNobWVudChBdHRhY2htZW50IGF0dCwgT2JqZWN0W10gYXJncykgdGhyb3dzIEpBWEJFeGNlcHRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGF0YUhhbmRsZXJCdWlsZGVyIGV4dGVuZHMgQXR0YWNobWVudEJ1aWxkZXIgeworICAgICAgICBEYXRhSGFuZGxlckJ1aWxkZXIoUGFyYW1ldGVySW1wbCBwYXJhbSwgRW5kcG9pbnRWYWx1ZVNldHRlciBzZXR0ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtLCBzZXR0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBtYXBBdHRhY2htZW50KEF0dGFjaG1lbnQgYXR0LCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICBzZXR0ZXIucHV0KGF0dC5hc0RhdGFIYW5kbGVyKCksIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQnl0ZUFycmF5QnVpbGRlciBleHRlbmRzIEF0dGFjaG1lbnRCdWlsZGVyIHsKKyAgICAgICAgQnl0ZUFycmF5QnVpbGRlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgc3VwZXIocGFyYW0sIHNldHRlcik7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG1hcEF0dGFjaG1lbnQoQXR0YWNobWVudCBhdHQsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIHNldHRlci5wdXQoYXR0LmFzQnl0ZUFycmF5KCksIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU291cmNlQnVpbGRlciBleHRlbmRzIEF0dGFjaG1lbnRCdWlsZGVyIHsKKyAgICAgICAgU291cmNlQnVpbGRlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgc3VwZXIocGFyYW0sIHNldHRlcik7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG1hcEF0dGFjaG1lbnQoQXR0YWNobWVudCBhdHQsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIHNldHRlci5wdXQoYXR0LmFzU291cmNlKCksIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW1hZ2VCdWlsZGVyIGV4dGVuZHMgQXR0YWNobWVudEJ1aWxkZXIgeworICAgICAgICBJbWFnZUJ1aWxkZXIoUGFyYW1ldGVySW1wbCBwYXJhbSwgRW5kcG9pbnRWYWx1ZVNldHRlciBzZXR0ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtLCBzZXR0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBtYXBBdHRhY2htZW50KEF0dGFjaG1lbnQgYXR0LCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICBJbWFnZSBpbWFnZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoYXR0LmFzSW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0ZXIucHV0KGltYWdlLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIElucHV0U3RyZWFtQnVpbGRlciBleHRlbmRzIEF0dGFjaG1lbnRCdWlsZGVyIHsKKyAgICAgICAgSW5wdXRTdHJlYW1CdWlsZGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIEVuZHBvaW50VmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICBzdXBlcihwYXJhbSwgc2V0dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbWFwQXR0YWNobWVudChBdHRhY2htZW50IGF0dCwgT2JqZWN0W10gYXJncykgeworICAgICAgICAgICAgc2V0dGVyLnB1dChhdHQuYXNJbnB1dFN0cmVhbSgpLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEpBWEJCdWlsZGVyIGV4dGVuZHMgQXR0YWNobWVudEJ1aWxkZXIgeworICAgICAgICBKQVhCQnVpbGRlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgc3VwZXIocGFyYW0sIHNldHRlcik7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG1hcEF0dGFjaG1lbnQoQXR0YWNobWVudCBhdHQsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBwYXJhbS5nZXRCcmlkZ2UoKS51bm1hcnNoYWwoYXR0LmFzSW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBzZXR0ZXIucHV0KG9iaiwgYXJncyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFdTREwgcGFydCBuYW1lIG9mIHRoaXMgYXR0YWNobWVudC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEFjY29yZGluZyB0byBXU0kgQVAgMS4wCisgICAgICogPFBSRT4KKyAgICAgKiAzLjggVmFsdWUtc3BhY2Ugb2YgQ29udGVudC1JZCBIZWFkZXIKKyAgICAgKiAgIERlZmluaXRpb246IGNvbnRlbnQtaWQgcGFydCBlbmNvZGluZworICAgICAqICAgVGhlICJjb250ZW50LWlkIHBhcnQgZW5jb2RpbmciIGNvbnNpc3RzIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mOgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIHdzZGw6cGFydCBlbGVtZW50IHJlZmVyZW5jZWQgYnkgdGhlIG1pbWU6Y29udGVudCwgaW4gd2hpY2ggY2hhcmFjdGVycyBkaXNhbGxvd2VkIGluIGNvbnRlbnQtaWQgaGVhZGVycyAobm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXMgcmVwcmVzZW50ZWQgYnkgY29kZSBwb2ludHMgYWJvdmUgMHg3RikgYXJlIGVzY2FwZWQgYXMgZm9sbG93czoKKyAgICAgKiAgICAgbyBFYWNoIGRpc2FsbG93ZWQgY2hhcmFjdGVyIGlzIGNvbnZlcnRlZCB0byBVVEYtOCBhcyBvbmUgb3IgbW9yZSBieXRlcy4KKyAgICAgKiAgICAgbyBBbnkgYnl0ZXMgY29ycmVzcG9uZGluZyB0byBhIGRpc2FsbG93ZWQgY2hhcmFjdGVyIGFyZSBlc2NhcGVkIHdpdGggdGhlIFVSSSBlc2NhcGluZyBtZWNoYW5pc20gKHRoYXQgaXMsIGNvbnZlcnRlZCB0byAlSEgsIHdoZXJlIEhIIGlzIHRoZSBoZXhhZGVjaW1hbCBub3RhdGlvbiBvZiB0aGUgYnl0ZSB2YWx1ZSkuCisgICAgICogICAgIG8gVGhlIG9yaWdpbmFsIGNoYXJhY3RlciBpcyByZXBsYWNlZCBieSB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgKiBUaGUgY2hhcmFjdGVyICc9JyAoMHgzRCkuCisgICAgICogQSBnbG9iYWxseSB1bmlxdWUgdmFsdWUgc3VjaCBhcyBhIFVVSUQuCisgICAgICogVGhlIGNoYXJhY3RlciAnQCcgKDB4NDApLgorICAgICAqIEEgdmFsaWQgZG9tYWluIG5hbWUgdW5kZXIgdGhlIGF1dGhvcml0eSBvZiB0aGUgZW50aXR5IGNvbnN0cnVjdGluZyB0aGUgbWVzc2FnZS4KKyAgICAgKiA8L1BSRT4KKyAgICAgKgorICAgICAqIFNvIGEgd3NkbDpwYXJ0IGZvb1BhcnQgd2lsbCBiZSBlbmNvZGVkIGFzOgorICAgICAqICAgICAgPGZvb1BhcnQ9c29tZXJlYWxseWJpZ251bWJlcmxpa2VhdXVpZEBleGFtcGxlLmNvbT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbAorICAgICAqICAgICAgaWYgdGhlIHBhcnNpbmcgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0V1NETFBhcnROYW1lKGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkF0dGFjaG1lbnQgYXR0KXsKKyAgICAgICAgU3RyaW5nIGNJZCA9IGF0dC5nZXRDb250ZW50SWQoKTsKKworICAgICAgICBpbnQgaW5kZXggPSBjSWQubGFzdEluZGV4T2YoJ0AnLCBjSWQubGVuZ3RoKCkpOworICAgICAgICBpZihpbmRleCA9PSAtMSl7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gY0lkLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgIGluZGV4ID0gbG9jYWxQYXJ0Lmxhc3RJbmRleE9mKCc9JywgbG9jYWxQYXJ0Lmxlbmd0aCgpKTsKKyAgICAgICAgaWYoaW5kZXggPT0gLTEpeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhLm5ldC5VUkxEZWNvZGVyLmRlY29kZShsb2NhbFBhcnQuc3Vic3RyaW5nKDAsIGluZGV4KSwgIlVURi04Iik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGhlYWRlciBpbnRvIGEgSkFYQiBvYmplY3QuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEhlYWRlciBleHRlbmRzIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnJpZGdlPD8+IGJyaWRnZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBoZWFkZXJOYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIGJyaWRnZQorICAgICAgICAgKiAgICAgIHNwZWNpZmllcyBob3cgdG8gdW5tYXJzaGFsIGEgaGVhZGVyIGludG8gYSBKQVhCIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHNldHRlcgorICAgICAgICAgKiAgICAgIHNwZWNpZmllcyBob3cgdGhlIG9idGFpbmVkIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSGVhZGVyKFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uLCBRTmFtZSBuYW1lLCBCcmlkZ2U8Pz4gYnJpZGdlLCBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IHNvYXBWZXJzaW9uOworICAgICAgICAgICAgdGhpcy5oZWFkZXJOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMuYnJpZGdlID0gYnJpZGdlOworICAgICAgICAgICAgdGhpcy5zZXR0ZXIgPSBzZXR0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSGVhZGVyKFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uLCBQYXJhbWV0ZXJJbXBsIHBhcmFtLCBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlcikgeworICAgICAgICAgICAgdGhpcygKKyAgICAgICAgICAgICAgICBzb2FwVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBwYXJhbS5nZXRUeXBlUmVmZXJlbmNlKCkudGFnTmFtZSwKKyAgICAgICAgICAgICAgICBwYXJhbS5nZXRCcmlkZ2UoKSwKKyAgICAgICAgICAgICAgICBzZXR0ZXIpOworICAgICAgICAgICAgYXNzZXJ0IHBhcmFtLmdldE91dEJpbmRpbmcoKT09IFBhcmFtZXRlckJpbmRpbmcuSEVBREVSOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTT0FQRmF1bHRFeGNlcHRpb24gY3JlYXRlRHVwbGljYXRlSGVhZGVyRXhjZXB0aW9uKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBzb2FwVmVyc2lvbi5zYWFqU29hcEZhY3RvcnkuY3JlYXRlRmF1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJNZXNzYWdlcy5EVVBMSUNBVEVfUE9SVF9LTk9XTl9IRUFERVIoaGVhZGVyTmFtZSksIHNvYXBWZXJzaW9uLmZhdWx0Q29kZUNsaWVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oZmF1bHQpOworICAgICAgICAgICAgfSBjYXRjaChTT0FQRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRSZXF1ZXN0KE1lc3NhZ2UgbXNnLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXIgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIEl0ZXJhdG9yPGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcj4gaXQgPQorICAgICAgICAgICAgICAgIG1zZy5nZXRIZWFkZXJzKCkuZ2V0SGVhZGVycyhoZWFkZXJOYW1lLHRydWUpOworICAgICAgICAgICAgaWYgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGhlYWRlciA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUR1cGxpY2F0ZUhlYWRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoaGVhZGVyIT1udWxsKSB7CisgICAgICAgICAgICAgICAgc2V0dGVyLnB1dCggaGVhZGVyLnJlYWRBc0pBWEIoYnJpZGdlKSwgYXJncyApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBoZWFkZXIgbm90IGZvdW5kLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIHdob2xlIHBheWxvYWQgaW50byBhIHNpbmdsZSBKQVhCIGJlYW4uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEJvZHkgZXh0ZW5kcyBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJyaWRnZTw/PiBicmlkZ2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgRW5kcG9pbnRWYWx1ZVNldHRlciBzZXR0ZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBicmlkZ2UKKyAgICAgICAgICogICAgICBzcGVjaWZpZXMgaG93IHRvIHVubWFyc2hhbCB0aGUgcGF5bG9hZCBpbnRvIGEgSkFYQiBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSBzZXR0ZXIKKyAgICAgICAgICogICAgICBzcGVjaWZpZXMgaG93IHRoZSBvYnRhaW5lZCB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJvZHkoQnJpZGdlPD8+IGJyaWRnZSwgRW5kcG9pbnRWYWx1ZVNldHRlciBzZXR0ZXIpIHsKKyAgICAgICAgICAgIHRoaXMuYnJpZGdlID0gYnJpZGdlOworICAgICAgICAgICAgdGhpcy5zZXR0ZXIgPSBzZXR0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWFkUmVxdWVzdChNZXNzYWdlIG1zZywgT2JqZWN0W10gYXJncykgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICAgICAgc2V0dGVyLnB1dCggbXNnLnJlYWRQYXlsb2FkQXNKQVhCKGJyaWRnZSksIGFyZ3MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyZWF0cyBhIHBheWxvYWQgYXMgbXVsdGlwbGUgcGFydHMgd3JhcHBlZCBpbnRvIG9uZSBlbGVtZW50LAorICAgICAqIGFuZCBwcm9jZXNzZXMgYWxsIHN1Y2ggd3JhcHBlZCBwYXJ0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgRG9jTGl0IGV4dGVuZHMgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAbGluayBQYXJ0QnVpbGRlcn0ga2V5ZWQgYnkgdGhlIGVsZW1lbnQgbmFtZSAoaW5zaWRlIHRoZSB3cmFwcGVyIGVsZW1lbnQuKQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXJ0QnVpbGRlcltdIHBhcnRzOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQnJpZGdlIHdyYXBwZXI7CisKKyAgICAgICAgcHVibGljIERvY0xpdChXcmFwcGVyUGFyYW1ldGVyIHdwLCBNb2RlIHNraXBNb2RlKSB7CisgICAgICAgICAgICB3cmFwcGVyID0gd3AuZ2V0QnJpZGdlKCk7CisgICAgICAgICAgICBDbGFzcyB3cmFwcGVyVHlwZSA9IChDbGFzcykgd3JhcHBlci5nZXRUeXBlUmVmZXJlbmNlKCkudHlwZTsKKworICAgICAgICAgICAgTGlzdDxQYXJ0QnVpbGRlcj4gcGFydHMgPSBuZXcgQXJyYXlMaXN0PFBhcnRCdWlsZGVyPigpOworCisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IGNoaWxkcmVuID0gd3AuZ2V0V3JhcHBlckNoaWxkcmVuKCk7CisgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcCA6IGNoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgaWYgKHAuZ2V0TW9kZSgpID09IHNraXBNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGlmKHAuaXNJTigpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkKCBuZXcgUGFydEJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB3cC5nZXRPd25lcigpLmdldEpBWEJDb250ZXh0KCkuZ2V0RWxlbWVudFByb3BlcnR5QWNjZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludFZhbHVlU2V0dGVyLmdldChwKQorICAgICAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JhcHBlciBwYXJhbWV0ZXIgaXRzZWxmIGFsd2F5cyBiaW5kIHRvIGJvZHksIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBzbyBkbyBhbGwgaXRzIGNoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBwLmdldEJpbmRpbmcoKT09IFBhcmFtZXRlckJpbmRpbmcuQk9EWTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oICAvLyBUT0RPOiBpMThuCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyVHlwZSsiIGRvIG5vdCBoYXZlIGEgcHJvcGVydHkgb2YgdGhlIG5hbWUgIituYW1lLGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5wYXJ0cyA9IHBhcnRzLnRvQXJyYXkobmV3IFBhcnRCdWlsZGVyW3BhcnRzLnNpemUoKV0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVhZFJlcXVlc3QoTWVzc2FnZSBtc2csIE9iamVjdFtdIGFyZ3MpIHRocm93cyBKQVhCRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0IHJldFZhbCA9IG51bGw7CisKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBtc2cucmVhZFBheWxvYWQoKTsKKyAgICAgICAgICAgIE9iamVjdCB3cmFwcGVyQmVhbiA9IHdyYXBwZXIudW5tYXJzaGFsKHJlYWRlciwgKG1zZy5nZXRBdHRhY2htZW50cygpICE9IG51bGwpID8KKyAgICAgICAgICAgICAgICAgICAgbmV3IEF0dGFjaG1lbnRVbm1hcnNoYWxsZXJJbXBsKG1zZy5nZXRBdHRhY2htZW50cygpKTogbnVsbCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChQYXJ0QnVpbGRlciBwYXJ0IDogcGFydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBwYXJ0LnJlYWRSZXNwb25zZShhcmdzLHdyYXBwZXJCZWFuKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBvbmx5IGF0IG1vc3Qgb25lIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlciB0aGF0IHJldHVybnMgYSB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVvcmRlciBwYXJ0cyBzbyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgY29tZXMgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgaWYobyE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHJldFZhbD09bnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IG87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChBY2Nlc3NvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHNldCBtZXRob2QgdGhyb3cgYSBjaGVja2VkIGV4Y2VwdGlvbiBvciBzb21ldGhpbmcgbGlrZSB0aGF0CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7ICAgIC8vIFRPRE86aTE4bgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBib2R5CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkucmVjeWNsZShyZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVubWFyc2hhbHMgZWFjaCB3cmFwcGVkIHBhcnQgaW50byBhIEpBWEIgb2JqZWN0IGFuZCBtb3ZlcyBpdAorICAgICAgICAgKiB0byB0aGUgZXhwZWN0ZWQgcGxhY2UuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgY2xhc3MgUGFydEJ1aWxkZXIgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBSYXdBY2Nlc3NvciBhY2Nlc3NvcjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgRW5kcG9pbnRWYWx1ZVNldHRlciBzZXR0ZXI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQHBhcmFtIGFjY2Vzc29yCisgICAgICAgICAgICAgKiAgICAgIHNwZWNpZmllcyB3aGljaCBwb3J0aW9uIG9mIHRoZSB3cmFwcGVyIGJlYW4gdG8gb2J0YWluIHRoZSB2YWx1ZSBmcm9tLgorICAgICAgICAgICAgICogQHBhcmFtIHNldHRlcgorICAgICAgICAgICAgICogICAgICBzcGVjaWZpZXMgaG93IHRoZSBvYnRhaW5lZCB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgUGFydEJ1aWxkZXIoUmF3QWNjZXNzb3IgYWNjZXNzb3IsIEVuZHBvaW50VmFsdWVTZXR0ZXIgc2V0dGVyKSB7CisgICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICAgICAgICAgIHRoaXMuc2V0dGVyID0gc2V0dGVyOworICAgICAgICAgICAgICAgIGFzc2VydCBhY2Nlc3NvciE9bnVsbCAmJiBzZXR0ZXIhPW51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCByZWFkUmVzcG9uc2UoIE9iamVjdFtdIGFyZ3MsIE9iamVjdCB3cmFwcGVyQmVhbiApIHRocm93cyBBY2Nlc3NvckV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGFjY2Vzc29yLmdldCh3cmFwcGVyQmVhbik7CisgICAgICAgICAgICAgICAgc2V0dGVyLnB1dChvYmosYXJncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJlYXRzIGEgcGF5bG9hZCBhcyBtdWx0aXBsZSBwYXJ0cyB3cmFwcGVkIGludG8gb25lIGVsZW1lbnQsCisgICAgICogYW5kIHByb2Nlc3NlcyBhbGwgc3VjaCB3cmFwcGVkIHBhcnRzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBScGNMaXQgZXh0ZW5kcyBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICoge0BsaW5rIFBhcnRCdWlsZGVyfSBrZXllZCBieSB0aGUgZWxlbWVudCBuYW1lIChpbnNpZGUgdGhlIHdyYXBwZXIgZWxlbWVudC4pCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxRTmFtZSxQYXJ0QnVpbGRlcj4gcGFydHMgPSBuZXcgSGFzaE1hcDxRTmFtZSxQYXJ0QnVpbGRlcj4oKTsKKworICAgICAgICBwcml2YXRlIFFOYW1lIHdyYXBwZXJOYW1lOworCisgICAgICAgIHB1YmxpYyBScGNMaXQoV3JhcHBlclBhcmFtZXRlciB3cCkgeworICAgICAgICAgICAgYXNzZXJ0IHdwLmdldFR5cGVSZWZlcmVuY2UoKS50eXBlPT0gQ29tcG9zaXRlU3RydWN0dXJlLmNsYXNzOworCisgICAgICAgICAgICB3cmFwcGVyTmFtZSA9IHdwLmdldE5hbWUoKTsKKyAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVySW1wbD4gY2hpbGRyZW4gPSB3cC5nZXRXcmFwcGVyQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIGZvciAoUGFyYW1ldGVySW1wbCBwIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICBwYXJ0cy5wdXQoIHAuZ2V0TmFtZSgpLCBuZXcgUGFydEJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgIHAuZ2V0QnJpZGdlKCksIEVuZHBvaW50VmFsdWVTZXR0ZXIuZ2V0KHApCisgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgLy8gd3JhcHBlciBwYXJhbWV0ZXIgaXRzZWxmIGFsd2F5cyBiaW5kIHRvIGJvZHksIGFuZAorICAgICAgICAgICAgICAgIC8vIHNvIGRvIGFsbCBpdHMgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICBhc3NlcnQgcC5nZXRCaW5kaW5nKCk9PSBQYXJhbWV0ZXJCaW5kaW5nLkJPRFk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWFkUmVxdWVzdChNZXNzYWdlIG1zZywgT2JqZWN0W10gYXJncykgdGhyb3dzIEpBWEJFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gbXNnLnJlYWRQYXlsb2FkKCk7CisgICAgICAgICAgICBpZiAoIXJlYWRlci5nZXROYW1lKCkuZXF1YWxzKHdyYXBwZXJOYW1lKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbiggLy8gVE9ETzogaTE4bgorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCByZXNwb25zZSBlbGVtZW50ICIrcmVhZGVyLmdldE5hbWUoKSsiIGV4cGVjdGVkOiAiK3dyYXBwZXJOYW1lKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0VGFnKCk7CisKKyAgICAgICAgICAgIHdoaWxlKHJlYWRlci5nZXRFdmVudFR5cGUoKT09WE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBRTmFtZSBoYXMgYSBwZXJmb3JtYW5jZSBpc3N1ZQorICAgICAgICAgICAgICAgIFBhcnRCdWlsZGVyIHBhcnQgPSBwYXJ0cy5nZXQocmVhZGVyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYocGFydD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBjb3JyZXNwb25kaW5nIHBhcnQgZm91bmQuIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0VGFnKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFydC5yZWFkUmVxdWVzdChhcmdzLHJlYWRlciwgbXNnLmdldEF0dGFjaG1lbnRzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd2UgYXJlIGRvbmUgd2l0aCB0aGUgYm9keQorICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LnJlY3ljbGUocmVhZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbm1hcnNoYWxzIGVhY2ggd3JhcHBlZCBwYXJ0IGludG8gYSBKQVhCIG9iamVjdCBhbmQgbW92ZXMgaXQKKyAgICAgICAgICogdG8gdGhlIGV4cGVjdGVkIHBsYWNlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGNsYXNzIFBhcnRCdWlsZGVyIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQnJpZGdlIGJyaWRnZTsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgRW5kcG9pbnRWYWx1ZVNldHRlciBzZXR0ZXI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQHBhcmFtIGJyaWRnZQorICAgICAgICAgICAgICogICAgICBzcGVjaWZpZXMgaG93IHRoZSBwYXJ0IGlzIHVubWFyc2hhbGxlZC4KKyAgICAgICAgICAgICAqIEBwYXJhbSBzZXR0ZXIKKyAgICAgICAgICAgICAqICAgICAgc3BlY2lmaWVzIGhvdyB0aGUgb2J0YWluZWQgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGVuZHBvaW50LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgUGFydEJ1aWxkZXIoQnJpZGdlIGJyaWRnZSwgRW5kcG9pbnRWYWx1ZVNldHRlciBzZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmJyaWRnZSA9IGJyaWRnZTsKKyAgICAgICAgICAgICAgICB0aGlzLnNldHRlciA9IHNldHRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgdm9pZCByZWFkUmVxdWVzdCggT2JqZWN0W10gYXJncywgWE1MU3RyZWFtUmVhZGVyIHIsIEF0dGFjaG1lbnRTZXQgYXR0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGJyaWRnZS51bm1hcnNoYWwociwgKGF0dCAhPSBudWxsKT9uZXcgQXR0YWNobWVudFVubWFyc2hhbGxlckltcGwoYXR0KTpudWxsKTsKKyAgICAgICAgICAgICAgICBzZXR0ZXIucHV0KG9iaixhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpeworICAgICAgICByZXR1cm4gKG1pbWVUeXBlLmVxdWFscygidGV4dC94bWwiKSB8fCBtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL3htbCIpKSA/IHRydWUgOiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL0VuZHBvaW50TWV0aG9kRGlzcGF0Y2hlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludE1ldGhvZERpc3BhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTYxZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludE1ldGhvZERpc3BhdGNoZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisvKgorICogJElkOiBFbmRwb2ludE1ldGhvZERpc3BhdGNoZXIuamF2YSx2IDEuMS4yLjUgMjAwNi8xMS8xMCAwMDo1NTowMyBrb2hzdWtlIEV4cCAkCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuc2VpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGlmIGEgbmV3IGRpc3BhdGNoaW5nCisgKiBtZWNoYW5pc20gbmVlZHMgdG8gYmUgcGx1Z2dlZCBpbi4gVGhlIGRpc3BhdGNoZXIgaXMgcGx1Z2dlZCBpbiB0aGUKKyAqIGNvbnN0cnVjdG9yIG9mIHtAbGluayBFbmRwb2ludE1ldGhvZERpc3BhdGNoZXJHZXR0ZXJ9LgorICoKKyAqIEBhdXRob3IgQXJ1biBHdXB0YQorICogQHNlZSBFbmRwb2ludE1ldGhvZERpc3BhdGNoZXJHZXR0ZXIKKyAqLworaW50ZXJmYWNlIEVuZHBvaW50TWV0aG9kRGlzcGF0Y2hlciB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIEVuZHBvaW50TWV0aG9kSGFuZGxlcn0gZm9yIHRoZSA8Y29kZT5yZXF1ZXN0PC9jb2RlPgorICAgICAqIHtAbGluayBQYWNrZXR9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgcmVxdWVzdCBwYWNrZXQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBub24tbnVsbCB7QGxpbmsgRW5kcG9pbnRNZXRob2RIYW5kbGVyfSB0aGF0IHdpbGwgcm91dGUgdGhlIHJlcXVlc3QgcGFja2V0LgorICAgICAqICAgICAgbnVsbCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZXF1ZXN0IHBhY2tldCBiZSBwcm9jZXNzZWQgYnkgdGhlIG5leHQgYXZhaWxhYmxlCisgICAgICogICAgICB7QGxpbmsgRW5kcG9pbnRNZXRob2REaXNwYXRjaGVyfS4KKyAgICAgKiBAdGhyb3dzIERpc3BhdGNoRXhjZXB0aW9uCisgICAgICogICAgICBJZiB0aGUgcmVxdWVzdCBpcyBpbnZhbGlkLCBhbmQgcHJvY2Vzc2luZyBzaGFsbCBiZSBhYm9ydGVkIHdpdGggYSBzcGVjaWZpYyBmYXVsdC4KKyAgICAgKi8KKyAgICBFbmRwb2ludE1ldGhvZEhhbmRsZXIgZ2V0RW5kcG9pbnRNZXRob2RIYW5kbGVyKFBhY2tldCByZXF1ZXN0KSB0aHJvd3MgRGlzcGF0Y2hFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL0VuZHBvaW50TWV0aG9kRGlzcGF0Y2hlckdldHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludE1ldGhvZERpc3BhdGNoZXJHZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzIwZjhmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludE1ldGhvZERpc3BhdGNoZXJHZXR0ZXIuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnNlaTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuQWJzdHJhY3RTRUlNb2RlbEltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEdldHMgdGhlIGxpc3Qgb2Yge0BsaW5rIEVuZHBvaW50TWV0aG9kRGlzcGF0Y2hlcn1zIGZvciB7QGxpbmsgU0VJSW52b2tlclR1YmV9LgorICogYSByZXF1ZXN0IHtAbGluayBQYWNrZXR9LiBJZiBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQgb24gdGhlIGVuZHBvaW50LCB0aGVuCisgKiBvbmx5IHtAbGluayBBY3Rpb25CYXNlZERpc3BhdGNoZXJ9IGlzIGFkZGVkIHRvIHRoZSBsaXN0LiBPdGhlcndpc2UsCisgKiB7QGxpbmsgUGF5bG9hZFFOYW1lQmFzZWREaXNwYXRjaGVyfSBpcyBhZGRlZCB0byB0aGUgbGlzdC4KKyAqCisgKiA8cD4KKyAqIHtAbGluayBNZXNzYWdlfSBwYXlsb2FkJ3MgUU5hbWUgdG8gb2J0YWluIHRoZSBoYW5kbGVyLiBJZiBubyBoYW5kbGVyIGlzCisgKiByZWdpc3RlcmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBRTmFtZSwgdGhlbiB1c2VzIEFjdGlvbiBNZXNzYWdlCisgKiBBZGRyZXNzaW5nIFByb3BlcnR5IHZhbHVlIHRvIGdldCB0aGUgaGFuZGxlci4KKyAqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworZmluYWwgY2xhc3MgRW5kcG9pbnRNZXRob2REaXNwYXRjaGVyR2V0dGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RW5kcG9pbnRNZXRob2REaXNwYXRjaGVyPiBkaXNwYXRjaGVyTGlzdDsKKworICAgIEVuZHBvaW50TWV0aG9kRGlzcGF0Y2hlckdldHRlcihBYnN0cmFjdFNFSU1vZGVsSW1wbCBtb2RlbCwgV1NCaW5kaW5nIGJpbmRpbmcsIFNFSUludm9rZXJUdWJlIGludm9rZXJUdWJlKSB7CisgICAgICAgIGRpc3BhdGNoZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxFbmRwb2ludE1ldGhvZERpc3BhdGNoZXI+KCk7CisKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0QWRkcmVzc2luZ1ZlcnNpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBkaXNwYXRjaGVyTGlzdC5hZGQobmV3IEFjdGlvbkJhc2VkRGlzcGF0Y2hlcihtb2RlbCwgYmluZGluZywgaW52b2tlclR1YmUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGV2ZW4gd2hlbiBhY3Rpb24gYmFzZWQgZGlzcGF0Y2hpbmcgaXMgaW4gcGxhY2UsCisgICAgICAgIC8vIHdlIHN0aWxsIG5lZWQgdGhpcyBiZWNhdXNlIGNsaWVudHMgYXJlIGFsb3dlZCBub3QgdG8gdXNlIGFkZHJlc3NpbmcgaGVhZGVycworICAgICAgICBkaXNwYXRjaGVyTGlzdC5hZGQobmV3IFBheWxvYWRRTmFtZUJhc2VkRGlzcGF0Y2hlcihtb2RlbCwgYmluZGluZywgaW52b2tlclR1YmUpKTsKKyAgICB9CisKKyAgICBMaXN0PEVuZHBvaW50TWV0aG9kRGlzcGF0Y2hlcj4gZ2V0RGlzcGF0Y2hlckxpc3QoKSB7CisgICAgICAgIHJldHVybiBkaXNwYXRjaGVyTGlzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL0VuZHBvaW50TWV0aG9kSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludE1ldGhvZEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTVmNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludE1ldGhvZEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5zZWk7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuU0VJTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5EZXNlcmlhbGl6YXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZmF1bHQuU09BUEZhdWx0QnVpbGRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLmpheGIuSkFYQk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuSmF2YU1ldGhvZEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVySW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyOworCitpbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgbWFpbmx5IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdHdvIHRhc2tzOgorICogPG9sPgorICogIDxsaT5UYWtlcyBhIHtAbGluayBNZXNzYWdlXSB0aGF0IHJlcHJlc2VudHMgYSByZXF1ZXN0LAorICogICAgICBhbmQgZXh0cmFjdHMgdGhlIGFyZ3VtZW50cyAoYW5kIHVwZGF0ZXMge0BsaW5rIEhvbGRlcn1zLikKKyAqICA8bGk+QWNjZXB0cyByZXR1cm4gdmFsdWUgYW5kIHtAbGluayBIb2xkZXJ9IGFyZ3VtZW50cyBmb3IgYSBKYXZhIG1ldGhvZCwKKyAqICAgICAgYW5kIGNyZWF0ZXMge0BsaW5rIEpBWEJNZXNzYWdlfSB0aGF0IHJlcHJlc2VudHMgYSByZXNwb25zZSBtZXNzYWdlLgorICogPC9vbD4KKyAqCisgKiA8aDI+Q3JlYXRpbmcge0BsaW5rIEpBWEJNZXNzYWdlfTwvaDI+CisgKiA8cD4KKyAqIEF0IHRoZSBjb25zdHJ1Y3Rpb24gdGltZSwgd2UgcHJlcGFyZSB7QGxpbmsgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyfSB0aGF0IGtub3dzIGhvdyB0byBjcmVhdGUgZW5kcG9pbnQge0BsaW5rIE1ldGhvZH0KKyAqIGludm9jYXRpb24gYXJndW1lbnRzLgorICogd2UgYWxzbyBwcmVwYXJlIHtAbGluayBFbmRwb2ludFJlc3BvbnNlTWVzc2FnZUJ1aWxkZXJ9IGFuZCB7QGxpbmsgTWVzc2FnZUZpbGxlcn1zCisgKiB0aGF0IGtub3cgaG93IHRvIG1vdmUgYXJndW1lbnRzIGludG8gYSB7QGxpbmsgTWVzc2FnZX0uCisgKiBTb21lIGFyZ3VtZW50cyBnbyB0byB0aGUgcGF5bG9hZCwgc29tZSBnbyB0byBoZWFkZXJzLCBzdGlsbCBvdGhlcnMgZ28gdG8gYXR0YWNobWVudHMuCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworZmluYWwgY2xhc3MgRW5kcG9pbnRNZXRob2RIYW5kbGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgU09BUFZlcnNpb24gc29hcFZlcnNpb247CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOworICAgIHByaXZhdGUgZmluYWwgaW50IG5vT2ZBcmdzOworICAgIHByaXZhdGUgZmluYWwgSmF2YU1ldGhvZEltcGwgamF2YU1ldGhvZE1vZGVsOworCisgICAgIHByaXZhdGUgZmluYWwgQm9vbGVhbiBpc09uZVdheTsKKworICAgIC8vIENvbnZlcnRzIHtAbGluayBNZXNzYWdlfSAtLT4gT2JqZWN0W10KKyAgICBwcml2YXRlIGZpbmFsIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlciBhcmd1bWVudHNCdWlsZGVyOworCisgICAgLy8gdGhlc2Ugb2JqZWN0cyB0b2dldGhlciBjcmVhdGUgYSByZXNwb25zZSBtZXNzYWdlIGZyb20gbWV0aG9kIHBhcmFtZXRlcnMKKyAgICBwcml2YXRlIGZpbmFsIEVuZHBvaW50UmVzcG9uc2VNZXNzYWdlQnVpbGRlciBib2R5QnVpbGRlcjsKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VGaWxsZXJbXSBvdXRGaWxsZXJzOworCisgICAgcHJpdmF0ZSBmaW5hbCBTRUlJbnZva2VyVHViZSBvd25lcjsKKworICAgIHB1YmxpYyBFbmRwb2ludE1ldGhvZEhhbmRsZXIoU0VJSW52b2tlclR1YmUgb3duZXIsIEphdmFNZXRob2RJbXBsIG1ldGhvZCwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gYmluZGluZy5nZXRTT0FQVmVyc2lvbigpOworICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZC5nZXRNZXRob2QoKTsKKyAgICAgICAgdGhpcy5qYXZhTWV0aG9kTW9kZWwgPSBtZXRob2Q7CisgICAgICAgIGFyZ3VtZW50c0J1aWxkZXIgPSBjcmVhdGVBcmd1bWVudHNCdWlsZGVyKCk7CisgICAgICAgIExpc3Q8TWVzc2FnZUZpbGxlcj4gZmlsbGVycyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZUZpbGxlcj4oKTsKKyAgICAgICAgYm9keUJ1aWxkZXIgPSBjcmVhdGVSZXNwb25zZU1lc3NhZ2VCdWlsZGVyKGZpbGxlcnMpOworICAgICAgICB0aGlzLm91dEZpbGxlcnMgPSBmaWxsZXJzLnRvQXJyYXkobmV3IE1lc3NhZ2VGaWxsZXJbZmlsbGVycy5zaXplKCldKTsKKyAgICAgICAgdGhpcy5pc09uZVdheSA9IG1ldGhvZC5nZXRNRVAoKS5pc09uZVdheSgpOworICAgICAgICB0aGlzLm5vT2ZBcmdzID0gdGhpcy5tZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXQgYnVpbGRzIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlciB3aGljaCBjb252ZXJ0cyByZXF1ZXN0IHtAbGluayBNZXNzYWdlfSB0byBlbmRwb2ludCBtZXRob2QncyBpbnZvY2F0aW9uCisgICAgICogYXJndW1lbnRzIE9iamVjdFtdCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlcgorICAgICAqLworICAgIHByaXZhdGUgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyIGNyZWF0ZUFyZ3VtZW50c0J1aWxkZXIoKSB7CisgICAgICAgIEVuZHBvaW50QXJndW1lbnRzQnVpbGRlciBhcmdzQnVpbGRlcjsKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiBycCA9IGphdmFNZXRob2RNb2RlbC5nZXRSZXF1ZXN0UGFyYW1ldGVycygpOworICAgICAgICBMaXN0PEVuZHBvaW50QXJndW1lbnRzQnVpbGRlcj4gYnVpbGRlcnMgPSBuZXcgQXJyYXlMaXN0PEVuZHBvaW50QXJndW1lbnRzQnVpbGRlcj4oKTsKKworICAgICAgICBmb3IoIFBhcmFtZXRlckltcGwgcGFyYW0gOiBycCApIHsKKyAgICAgICAgICAgIEVuZHBvaW50VmFsdWVTZXR0ZXIgc2V0dGVyID0gRW5kcG9pbnRWYWx1ZVNldHRlci5nZXQocGFyYW0pOworICAgICAgICAgICAgc3dpdGNoKHBhcmFtLmdldEluQmluZGluZygpLmtpbmQpIHsKKyAgICAgICAgICAgIGNhc2UgQk9EWToKKyAgICAgICAgICAgICAgICBpZihwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtLmdldFBhcmVudCgpLmdldEJpbmRpbmcoKS5pc1JwY0xpdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIuUnBjTGl0KChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXJzLmFkZChuZXcgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyLkRvY0xpdCgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSwgTW9kZS5PVVQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVycy5hZGQobmV3IEVuZHBvaW50QXJndW1lbnRzQnVpbGRlci5Cb2R5KHBhcmFtLmdldEJyaWRnZSgpLHNldHRlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSEVBREVSOgorICAgICAgICAgICAgICAgIGJ1aWxkZXJzLmFkZChuZXcgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyLkhlYWRlcihzb2FwVmVyc2lvbiwgcGFyYW0sIHNldHRlcikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVFRBQ0hNRU5UOgorICAgICAgICAgICAgICAgIGJ1aWxkZXJzLmFkZChFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIuQXR0YWNobWVudEJ1aWxkZXIuY3JlYXRlQXR0YWNobWVudEJ1aWxkZXIocGFyYW0sIHNldHRlcikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVTkJPVU5EOgorICAgICAgICAgICAgICAgIGJ1aWxkZXJzLmFkZChuZXcgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyLk51bGxTZXR0ZXIoc2V0dGVyLAorICAgICAgICAgICAgICAgICAgICBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIuZ2V0Vk1VbmluaXRpYWxpemVkVmFsdWUocGFyYW0uZ2V0VHlwZVJlZmVyZW5jZSgpLnR5cGUpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlcyB7QGxpbmsgSG9sZGVyfSBhcmd1bWVudHMgZm9yIE9VVCBwYXJhbWV0ZXJzCisgICAgICAgIExpc3Q8UGFyYW1ldGVySW1wbD4gcmVzcCA9IGphdmFNZXRob2RNb2RlbC5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgZm9yKCBQYXJhbWV0ZXJJbXBsIHBhcmFtIDogcmVzcCApIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKSB7CisgICAgICAgICAgICAgICAgV3JhcHBlclBhcmFtZXRlciB3cCA9IChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtOworICAgICAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVySW1wbD4gY2hpbGRyZW4gPSB3cC5nZXRXcmFwcGVyQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcCA6IGNoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwLmlzT1VUKCkgJiYgcC5nZXRJbmRleCgpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludFZhbHVlU2V0dGVyIHNldHRlciA9IEVuZHBvaW50VmFsdWVTZXR0ZXIuZ2V0KHApOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIuTnVsbFNldHRlcihzZXR0ZXIsIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uaXNPVVQoKSAmJiBwYXJhbS5nZXRJbmRleCgpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgRW5kcG9pbnRWYWx1ZVNldHRlciBzZXR0ZXIgPSBFbmRwb2ludFZhbHVlU2V0dGVyLmdldChwYXJhbSk7CisgICAgICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIuTnVsbFNldHRlcihzZXR0ZXIsIG51bGwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChidWlsZGVycy5zaXplKCkpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgYXJnc0J1aWxkZXIgPSBFbmRwb2ludEFyZ3VtZW50c0J1aWxkZXIuTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBhcmdzQnVpbGRlciA9IGJ1aWxkZXJzLmdldCgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXJnc0J1aWxkZXIgPSBuZXcgRW5kcG9pbnRBcmd1bWVudHNCdWlsZGVyLkNvbXBvc2l0ZShidWlsZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFyZ3NCdWlsZGVyOworICAgIH0KKworICAgIC8qKgorICAgICogcHJlcGFyZSBvYmplY3RzIGZvciBjcmVhdGluZyByZXNwb25zZSB7QGxpbmsgTWVzc2FnZX0KKyAgICAqLworICAgIHByaXZhdGUgRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyIGNyZWF0ZVJlc3BvbnNlTWVzc2FnZUJ1aWxkZXIoTGlzdDxNZXNzYWdlRmlsbGVyPiBmaWxsZXJzKSB7CisKKyAgICAgICAgRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyIGJvZHlCdWlsZGVyID0gbnVsbDsKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiBycCA9IGphdmFNZXRob2RNb2RlbC5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKTsKKworICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcGFyYW0gOiBycCkgeworICAgICAgICAgICAgVmFsdWVHZXR0ZXIgZ2V0dGVyID0gVmFsdWVHZXR0ZXIuZ2V0KHBhcmFtKTsKKworICAgICAgICAgICAgc3dpdGNoKHBhcmFtLmdldE91dEJpbmRpbmcoKS5raW5kKSB7CisgICAgICAgICAgICBjYXNlIEJPRFk6CisgICAgICAgICAgICAgICAgaWYocGFyYW0uaXNXcmFwcGVyU3R5bGUoKSkgeworICAgICAgICAgICAgICAgICAgICBpZihwYXJhbS5nZXRQYXJlbnQoKS5nZXRCaW5kaW5nKCkuaXNScGNMaXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9keUJ1aWxkZXIgPSBuZXcgRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyLlJwY0xpdCgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5QnVpbGRlciA9IG5ldyBFbmRwb2ludFJlc3BvbnNlTWVzc2FnZUJ1aWxkZXIuRG9jTGl0KChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHlCdWlsZGVyID0gbmV3IEVuZHBvaW50UmVzcG9uc2VNZXNzYWdlQnVpbGRlci5CYXJlKHBhcmFtLCBzb2FwVmVyc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIRUFERVI6CisgICAgICAgICAgICAgICAgZmlsbGVycy5hZGQobmV3IE1lc3NhZ2VGaWxsZXIuSGVhZGVyKHBhcmFtLmdldEluZGV4KCksIHBhcmFtLmdldEJyaWRnZSgpLCBnZXR0ZXIgKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFUVEFDSE1FTlQ6CisgICAgICAgICAgICAgICAgZmlsbGVycy5hZGQoTWVzc2FnZUZpbGxlci5BdHRhY2htZW50RmlsbGVyLmNyZWF0ZUF0dGFjaG1lbnRGaWxsZXIocGFyYW0sIGdldHRlcikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVTkJPVU5EOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsgLy8gaW1wb3NzaWJsZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJvZHlCdWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vIHBhcmFtZXRlciBiaW5kcyB0byBib2R5LiB3ZSBjcmVhdGUgYW4gZW1wdHkgbWVzc2FnZQorICAgICAgICAgICAgc3dpdGNoKHNvYXBWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIFNPQVBfMTE6CisgICAgICAgICAgICAgICAgYm9keUJ1aWxkZXIgPSBFbmRwb2ludFJlc3BvbnNlTWVzc2FnZUJ1aWxkZXIuRU1QVFlfU09BUDExOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTT0FQXzEyOgorICAgICAgICAgICAgICAgIGJvZHlCdWlsZGVyID0gRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyLkVNUFRZX1NPQVAxMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvZHlCdWlsZGVyOworICAgIH0KKworCisgICAgcHVibGljIFBhY2tldCBpbnZva2UoUGFja2V0IHJlcSkgeworICAgICAgICAvLyBTb21lIHRyYW5zcG9ydHMobGlrZSBIVFRQKSBtYXkgd2FudCB0byBzZW5kIHJlc3BvbnNlIGJlZm9yZSBlbnZva2luZyBlbmRwb2ludCBtZXRob2QKKyAgICAgICAgaWYgKGlzT25lV2F5ICYmIHJlcS50cmFuc3BvcnRCYWNrQ2hhbm5lbCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXEudHJhbnNwb3J0QmFja0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlIHJlcU1zZyA9IHJlcS5nZXRNZXNzYWdlKCk7CisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W25vT2ZBcmdzXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFyZ3VtZW50c0J1aWxkZXIucmVhZFJlcXVlc3QocmVxTXNnLGFyZ3MpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oImZhaWxlZC50by5yZWFkLnJlc3BvbnNlIixlKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEZXNlcmlhbGl6YXRpb25FeGNlcHRpb24oImZhaWxlZC50by5yZWFkLnJlc3BvbnNlIixlKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlIHJlc3BvbnNlTWVzc2FnZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCByZXQgPSBvd25lci5nZXRJbnZva2VyKHJlcSkuaW52b2tlKHJlcSwgbWV0aG9kLCBhcmdzKTsKKyAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZSA9IGlzT25lV2F5ID8gbnVsbCA6IGNyZWF0ZVJlc3BvbnNlTWVzc2FnZShhcmdzLCByZXQpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKworICAgICAgICAgICAgaWYgKCEoY2F1c2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSAmJiBjYXVzZSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIC8vIFNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCBjYXVzZS5nZXRNZXNzYWdlKCksIGNhdXNlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UgPSBTT0FQRmF1bHRCdWlsZGVyLmNyZWF0ZVNPQVBGYXVsdE1lc3NhZ2Uoc29hcFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhTWV0aG9kTW9kZWwuZ2V0Q2hlY2tlZEV4Y2VwdGlvbihjYXVzZS5nZXRDbGFzcygpKSwgY2F1c2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgY2F1c2UuZ2V0TWVzc2FnZSgpLCBjYXVzZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlID0gU09BUEZhdWx0QnVpbGRlci5jcmVhdGVTT0FQRmF1bHRNZXNzYWdlKHNvYXBWZXJzaW9uLCBudWxsLCBjYXVzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlID0gU09BUEZhdWx0QnVpbGRlci5jcmVhdGVTT0FQRmF1bHRNZXNzYWdlKHNvYXBWZXJzaW9uLCBudWxsLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVxLmNyZWF0ZVNlcnZlclJlc3BvbnNlKHJlc3BvbnNlTWVzc2FnZSwgcmVxLmVuZHBvaW50LmdldFBvcnQoKSwgamF2YU1ldGhvZE1vZGVsLmdldE93bmVyKCksIHJlcS5lbmRwb2ludC5nZXRCaW5kaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSByZXNwb25zZSB7QGxpbmsgSkFYQk1lc3NhZ2V9IGZyb20gbWV0aG9kIGFyZ3VtZW50cywgcmV0dXJuIHZhbHVlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlc3BvbnNlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIE1lc3NhZ2UgY3JlYXRlUmVzcG9uc2VNZXNzYWdlKE9iamVjdFtdIGFyZ3MsIE9iamVjdCByZXR1cm5WYWx1ZSkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IGJvZHlCdWlsZGVyLmNyZWF0ZU1lc3NhZ2UoYXJncywgcmV0dXJuVmFsdWUpOworCisgICAgICAgIGZvciAoTWVzc2FnZUZpbGxlciBmaWxsZXIgOiBvdXRGaWxsZXJzKQorICAgICAgICAgICAgZmlsbGVyLmZpbGxJbihhcmdzLCByZXR1cm5WYWx1ZSwgbXNnKTsKKworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEVuZHBvaW50TWV0aG9kSGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludFJlc3BvbnNlTWVzc2FnZUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkMmQwYwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnNlaTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkFjY2Vzc29yRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLmFwaS5Db21wb3NpdGVTdHJ1Y3R1cmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuUmF3QWNjZXNzb3I7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5qYXhiLkpBWEJNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuV3JhcHBlclBhcmFtZXRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJ1aWxkcyBhIEpBWEIgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcGF5bG9hZC4KKyAqCisgKiBAc2VlIE1lc3NhZ2VGaWxsZXIKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK2Fic3RyYWN0IGNsYXNzIEVuZHBvaW50UmVzcG9uc2VNZXNzYWdlQnVpbGRlciB7CisgICAgYWJzdHJhY3QgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKE9iamVjdFtdIG1ldGhvZEFyZ3MsIE9iamVjdCByZXR1cm5WYWx1ZSk7CisKKyAgICBzdGF0aWMgZmluYWwgRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyIEVNUFRZX1NPQVAxMSA9IG5ldyBFbXB0eShTT0FQVmVyc2lvbi5TT0FQXzExKTsKKyAgICBzdGF0aWMgZmluYWwgRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyIEVNUFRZX1NPQVAxMiA9IG5ldyBFbXB0eShTT0FQVmVyc2lvbi5TT0FQXzEyKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVtcHR5IGV4dGVuZHMgRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKKworICAgICAgICBwdWJsaWMgRW1wdHkoU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgICAgIHRoaXMuc29hcFZlcnNpb24gPSBzb2FwVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShPYmplY3RbXSBtZXRob2RBcmdzLCBPYmplY3QgcmV0dXJuVmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlcy5jcmVhdGVFbXB0eShzb2FwVmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNsYXNzIGZvciB0aG9zZSB7QGxpbmsgRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyfXMgdGhhdCBidWlsZCBhIHtAbGluayBNZXNzYWdlfQorICAgICAqIGZyb20gSkFYQiBvYmplY3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEpBWEIgZXh0ZW5kcyBFbmRwb2ludFJlc3BvbnNlTWVzc2FnZUJ1aWxkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBvYmplY3QgZGV0ZXJtaW5lcyB0aGUgYmluZGluZyBvZiB0aGUgb2JqZWN0IHJldHVybmVkCisgICAgICAgICAqIGZyb20ge0BsaW5rICNjcmVhdGVNZXNzYWdlKE9iamVjdFtdLCBPYmplY3QpfQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCcmlkZ2UgYnJpZGdlOworICAgICAgICBwcml2YXRlIGZpbmFsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uOworCisgICAgICAgIHByb3RlY3RlZCBKQVhCKEJyaWRnZSBicmlkZ2UsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgICAgICBhc3NlcnQgYnJpZGdlIT1udWxsOworICAgICAgICAgICAgdGhpcy5icmlkZ2UgPSBicmlkZ2U7CisgICAgICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gc29hcFZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoT2JqZWN0W10gbWV0aG9kQXJncywgT2JqZWN0IHJldHVyblZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gSkFYQk1lc3NhZ2UuY3JlYXRlKCBicmlkZ2UsIGJ1aWxkKG1ldGhvZEFyZ3MsIHJldHVyblZhbHVlKSwgc29hcFZlcnNpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZHMgYSBKQVhCIG9iamVjdCB0aGF0IGJlY29tZXMgdGhlIHBheWxvYWQuCisgICAgICAgICAqLworICAgICAgICBhYnN0cmFjdCBPYmplY3QgYnVpbGQoT2JqZWN0W10gbWV0aG9kQXJncywgT2JqZWN0IHJldHVyblZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHBheWxvYWQgSkFYQiBvYmplY3QganVzdCBieSB0YWtpbmcKKyAgICAgKiBvbmUgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgZmluYWwgc3RhdGljIGNsYXNzIEJhcmUgZXh0ZW5kcyBKQVhCIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbWV0aG9kIGludm9jYXRpb24gcGFyYW1ldGVycyB0aGF0IGdvZXMgaW50byB0aGUgcGF5bG9hZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1ldGhvZFBvczsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlR2V0dGVyIGdldHRlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBFbmRwb2ludFJlc3BvbnNlTWVzc2FnZUJ1aWxkZXJ9IGZyb20gYSBiYXJlIHBhcmFtZXRlci4KKyAgICAgICAgICovCisgICAgICAgIEJhcmUoUGFyYW1ldGVySW1wbCBwLCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbikgeworICAgICAgICAgICAgc3VwZXIocC5nZXRCcmlkZ2UoKSwgc29hcFZlcnNpb24pOworICAgICAgICAgICAgdGhpcy5tZXRob2RQb3MgPSBwLmdldEluZGV4KCk7CisgICAgICAgICAgICB0aGlzLmdldHRlciA9IFZhbHVlR2V0dGVyLmdldChwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQaWNrcyB1cCBhbiBvYmplY3QgZnJvbSB0aGUgbWV0aG9kIGFyZ3VtZW50cyBhbmQgdXNlcyBpdC4KKyAgICAgICAgICovCisgICAgICAgIE9iamVjdCBidWlsZChPYmplY3RbXSBtZXRob2RBcmdzLCBPYmplY3QgcmV0dXJuVmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChtZXRob2RQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ2V0dGVyLmdldChtZXRob2RBcmdzW21ldGhvZFBvc10pOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGhhbmRsZSBhICd3cmFwcGVyJyBzdHlsZSByZXF1ZXN0LgorICAgICAqIENvbW1vbiBwYXJ0IG9mIHJwYy9saXQgYW5kIGRvYy9saXQuCisgICAgICovCisgICAgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFdyYXBwZWQgZXh0ZW5kcyBKQVhCIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlcmUgaW4gdGhlIG1ldGhvZCBhcmd1bWVudCBsaXN0IGRvIHRoZXkgY29tZSBmcm9tPworICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIGludFtdIGluZGljZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFic3RyYWN0cyBhd2F5IHRoZSB7QGxpbmsgSG9sZGVyfSBoYW5kbGluZyB3aGVuIHRvdWNoaW5nIG1ldGhvZCBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVmFsdWVHZXR0ZXJbXSBnZXR0ZXJzOworCisgICAgICAgIHByb3RlY3RlZCBXcmFwcGVkKFdyYXBwZXJQYXJhbWV0ZXIgd3AsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgICAgICBzdXBlcih3cC5nZXRCcmlkZ2UoKSwgc29hcFZlcnNpb24pOworCisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IGNoaWxkcmVuID0gd3AuZ2V0V3JhcHBlckNoaWxkcmVuKCk7CisKKyAgICAgICAgICAgIGluZGljZXMgPSBuZXcgaW50W2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICBnZXR0ZXJzID0gbmV3IFZhbHVlR2V0dGVyW2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8aW5kaWNlcy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHAgPSBjaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgaW5kaWNlc1tpXSA9IHAuZ2V0SW5kZXgoKTsKKyAgICAgICAgICAgICAgICBnZXR0ZXJzW2ldID0gVmFsdWVHZXR0ZXIuZ2V0KHApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBjcmVhdGUgYSBwYXlsb2FkIEpBWEIgb2JqZWN0IGJ5IHdyYXBwaW5nCisgICAgICogbXVsdGlwbGUgcGFyYW1ldGVycyBpbnRvIG9uZSAid3JhcHBlciBiZWFuIi4KKyAgICAgKi8KKyAgICBmaW5hbCBzdGF0aWMgY2xhc3MgRG9jTGl0IGV4dGVuZHMgV3JhcHBlZCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIb3cgZG9lcyBlYWNoIHdyYXBwZWQgcGFyYW1ldGVyIGJpbmRzIHRvIFhNTD8KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgUmF3QWNjZXNzb3JbXSBhY2Nlc3NvcnM7CisKKyAgICAgICAgLy9wcml2YXRlIGZpbmFsIFJhd0FjY2Vzc29yIHJldEFjY2Vzc29yOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwcGVyIGJlYW4uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzIHdyYXBwZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgRW5kcG9pbnRSZXNwb25zZU1lc3NhZ2VCdWlsZGVyfSBmcm9tIGEge0BsaW5rIFdyYXBwZXJQYXJhbWV0ZXJ9LgorICAgICAgICAgKi8KKyAgICAgICAgRG9jTGl0KFdyYXBwZXJQYXJhbWV0ZXIgd3AsIFNPQVBWZXJzaW9uIHNvYXBWZXJzaW9uKSB7CisgICAgICAgICAgICBzdXBlcih3cCwgc29hcFZlcnNpb24pOworCisgICAgICAgICAgICB3cmFwcGVyID0gKENsYXNzKXdwLmdldEJyaWRnZSgpLmdldFR5cGVSZWZlcmVuY2UoKS50eXBlOworCisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IGNoaWxkcmVuID0gd3AuZ2V0V3JhcHBlckNoaWxkcmVuKCk7CisKKyAgICAgICAgICAgIGFjY2Vzc29ycyA9IG5ldyBSYXdBY2Nlc3NvcltjaGlsZHJlbi5zaXplKCldOworICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGFjY2Vzc29ycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHAgPSBjaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHAuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yc1tpXSA9IHAuZ2V0T3duZXIoKS5nZXRKQVhCQ29udGV4dCgpLmdldEVsZW1lbnRQcm9wZXJ0eUFjY2Vzc29yKAorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlciwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbiggIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIrIiBkbyBub3QgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBuYW1lICIrbmFtZSxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYWNrcyBhIGJ1bmNoIG9mIGFyZ3VtZW50cyBpbnRvIGEge0BsaW5rIENvbXBvc2l0ZVN0cnVjdHVyZX0uCisgICAgICAgICAqLworICAgICAgICBPYmplY3QgYnVpbGQoT2JqZWN0W10gbWV0aG9kQXJncywgT2JqZWN0IHJldHVyblZhbHVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdCBiZWFuID0gd3JhcHBlci5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgICAgICAgLy8gZmlsbCBpbiB3cmFwcGVkIHBhcmFtZXRlcnMgZnJvbSBtZXRob2RBcmdzCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaT1pbmRpY2VzLmxlbmd0aC0xOyBpPj0wOyBpLS0gKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRpY2VzW2ldID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbaV0uc2V0KGJlYW4sIHJldHVyblZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yc1tpXS5zZXQoYmVhbixnZXR0ZXJzW2ldLmdldChtZXRob2RBcmdzW2luZGljZXNbaV1dKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYmVhbjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaXJyZWNvdmVyYWJsZQorICAgICAgICAgICAgICAgIEVycm9yIHggPSBuZXcgSW5zdGFudGlhdGlvbkVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBpcnJlY292ZXJhYmxlCisgICAgICAgICAgICAgICAgRXJyb3IgeCA9IG5ldyBJbGxlZ2FsQWNjZXNzRXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICB9IGNhdGNoIChBY2Nlc3NvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHNldCBtZXRob2QgdGhyb3cgYSBjaGVja2VkIGV4Y2VwdGlvbiBvciBzb21ldGhpbmcgbGlrZSB0aGF0CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7ICAgIC8vIFRPRE86aTE4bgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHBheWxvYWQgSkFYQiBvYmplY3QgYnkgd3JhcHBpbmcKKyAgICAgKiBtdWx0aXBsZSBwYXJhbWV0ZXJzIGludG8gYSB7QGxpbmsgQ29tcG9zaXRlU3RydWN0dXJlfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgdXNlZCBmb3IgcnBjL2xpdCwgYXMgd2UgZG9uJ3QgaGF2ZSBhIHdyYXBwZXIgYmVhbiBmb3IgaXQuCisgICAgICogKFRPRE86IFdoeSBkb24ndCB3ZSBoYXZlIGEgd3JhcHBlciBiZWFuIGZvciB0aGlzLCB3aGVuIGRvYy9saXQgZG9lcyE/KQorICAgICAqLworICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBScGNMaXQgZXh0ZW5kcyBXcmFwcGVkIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhvdyBkb2VzIGVhY2ggd3JhcHBlZCBwYXJhbWV0ZXIgYmluZHMgdG8gWE1MPworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCcmlkZ2VbXSBwYXJhbWV0ZXJCcmlkZ2VzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIGZvciBlcnJvciBkaWFnbm9zdGljcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbWV0ZXJJbXBsPiBjaGlsZHJlbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBFbmRwb2ludFJlc3BvbnNlTWVzc2FnZUJ1aWxkZXJ9IGZyb20gYSB7QGxpbmsgV3JhcHBlclBhcmFtZXRlcn0uCisgICAgICAgICAqLworICAgICAgICBScGNMaXQoV3JhcHBlclBhcmFtZXRlciB3cCwgU09BUFZlcnNpb24gc29hcFZlcnNpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKHdwLCBzb2FwVmVyc2lvbik7CisgICAgICAgICAgICAvLyB3ZSdsbCB1c2UgQ29tcG9zaXRlU3RydWN0dXJlIHRvIHBhY2sgcmVxdWVzdHMKKyAgICAgICAgICAgIGFzc2VydCB3cC5nZXRUeXBlUmVmZXJlbmNlKCkudHlwZT09Q29tcG9zaXRlU3RydWN0dXJlLmNsYXNzOworCisgICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gd3AuZ2V0V3JhcHBlckNoaWxkcmVuKCk7CisKKyAgICAgICAgICAgIHBhcmFtZXRlckJyaWRnZXMgPSBuZXcgQnJpZGdlW2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8cGFyYW1ldGVyQnJpZGdlcy5sZW5ndGg7IGkrKyApCisgICAgICAgICAgICAgICAgcGFyYW1ldGVyQnJpZGdlc1tpXSA9IGNoaWxkcmVuLmdldChpKS5nZXRCcmlkZ2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYWNrcyBhIGJ1bmNoIG9mIGFyZ3VtZW50cyBpbnRvYSB7QGxpbmsgQ29tcG9zaXRlU3RydWN0dXJlfS4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvc2l0ZVN0cnVjdHVyZSBidWlsZChPYmplY3RbXSBtZXRob2RBcmdzLCBPYmplY3QgcmV0dXJuVmFsdWUpIHsKKyAgICAgICAgICAgIENvbXBvc2l0ZVN0cnVjdHVyZSBjcyA9IG5ldyBDb21wb3NpdGVTdHJ1Y3R1cmUoKTsKKyAgICAgICAgICAgIGNzLmJyaWRnZXMgPSBwYXJhbWV0ZXJCcmlkZ2VzOworICAgICAgICAgICAgY3MudmFsdWVzID0gbmV3IE9iamVjdFtwYXJhbWV0ZXJCcmlkZ2VzLmxlbmd0aF07CisKKyAgICAgICAgICAgIC8vIGZpbGwgaW4gd3JhcHBlZCBwYXJhbWV0ZXJzIGZyb20gbWV0aG9kQXJncworICAgICAgICAgICAgZm9yKCBpbnQgaT1pbmRpY2VzLmxlbmd0aC0xOyBpPj0wOyBpLS0gKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHY7CisgICAgICAgICAgICAgICAgaWYgKGluZGljZXNbaV0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGdldHRlcnNbaV0uZ2V0KHJldHVyblZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0dGVyc1tpXS5nZXQobWV0aG9kQXJnc1tpbmRpY2VzW2ldXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHY9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIk1ldGhvZCBQYXJhbWV0ZXI6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5nZXQoaSkuZ2V0TmFtZSgpICsiIGNhbm5vdCBiZSBudWxsLiBUaGlzIGlzIEJQIDEuMSBSMjIxMSB2aW9sYXRpb24uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNzLnZhbHVlc1tpXSA9IHY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvRW5kcG9pbnRWYWx1ZVNldHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9FbmRwb2ludFZhbHVlU2V0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkMzkyMwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvRW5kcG9pbnRWYWx1ZVNldHRlci5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnNlaTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVySW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CisKKy8qKgorICogTW92ZXMgYSBKYXZhIHZhbHVlIHVubWFyc2hhbGxlZCBmcm9tIGEgcmVzcG9uc2UgbWVzc2FnZQorICogdG8gdGhlIHJpZ2h0IHBsYWNlLgorICoKKyAqIDxwPgorICogU29tZXRpbWVzIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgYSByZXR1cm4gdmFsdWUsIGFuZAorICogb3RoZXJzIGFyZSByZXR1cm5lZCBpbiB0aGUge0BsaW5rIEhvbGRlcn0gdmFsdWUuIEluc3RhbmNlcworICogb2YgdGhpcyBpbnRlcmZhY2UgYWJzdHJhY3RzIHRoaXMgZGV0YWlsLgorICoKKyAqIDxwPgorICoge0BsaW5rIEVuZHBvaW50VmFsdWVTZXR0ZXJ9IGlzIGEgc3RhdGVsZXNzIGJlaGF2aW9yIGVuY2Fwc3VsYXRpb24uCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworYWJzdHJhY3QgY2xhc3MgRW5kcG9pbnRWYWx1ZVNldHRlciB7CisgICAgcHJpdmF0ZSBFbmRwb2ludFZhbHVlU2V0dGVyKCkge30KKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSB2YWx1ZSB0byB0aGUgZXhwZWN0ZWQgcGxhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICBUaGUgdW5tYXJzaGFsbGVkIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqICAgICAgVGhlIGFyZ3VtZW50cyB0aGF0IG5lZWQgdG8gYmUgZ2l2ZW4gdG8gdGhlIEphdmEgbWV0aG9kIGludm9jYXRpb24uIElmIDx0dD5vYmo8L3R0PgorICAgICAqICAgICAgaXMgc3VwcG9zZWQgdG8gYmUgcmV0dXJuZWQgYXMgYSB7QGxpbmsgSG9sZGVyfSB2YWx1ZSwgYSBzdWl0YWJsZQorICAgICAqICAgICAge0BsaW5rIEhvbGRlcn0gaXMgb2J0YWluZWQgZnJvbSB0aGlzIGFyZ3VtZW50IGxpc3QgYW5kIDx0dD5vYmo8L3R0PgorICAgICAqICAgICAgaXMgc2V0LgorICAgICAqCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBwdXQoT2JqZWN0IG9iaiwgT2JqZWN0W10gYXJncyk7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgUGFyYW19cyB3aXRoIHNtYWxsIGluZGV4IG51bWJlcnMgYXJlIHVzZWQgb2Z0ZW4sCisgICAgICogc28gd2UgcG9vbCB0aGVtIHRvIHJlZHVjZSB0aGUgZm9vdHByaW50LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVuZHBvaW50VmFsdWVTZXR0ZXJbXSBQT09MID0gbmV3IEVuZHBvaW50VmFsdWVTZXR0ZXJbMTZdOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yKCBpbnQgaT0wOyBpPFBPT0wubGVuZ3RoOyBpKysgKQorICAgICAgICAgICAgUE9PTFtpXSA9IG5ldyBQYXJhbShpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEVuZHBvaW50VmFsdWVTZXR0ZXJ9IHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIFBhcmFtZXRlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbmRwb2ludFZhbHVlU2V0dGVyIGdldChQYXJhbWV0ZXJJbXBsIHApIHsKKyAgICAgICAgaW50IGlkeCA9IHAuZ2V0SW5kZXgoKTsKKyAgICAgICAgaWYgKHAuaXNJTigpKSB7CisgICAgICAgICAgICBpZiAoaWR4PFBPT0wubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBPT0xbaWR4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJhbShpZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xkZXJQYXJhbShpZHgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFBhcmFtIGV4dGVuZHMgRW5kcG9pbnRWYWx1ZVNldHRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRleCBvZiB0aGUgYXJndW1lbnQgdG8gcHV0IHRoZSB2YWx1ZSB0by4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgaWR4OworCisgICAgICAgIHB1YmxpYyBQYXJhbShpbnQgaWR4KSB7CisgICAgICAgICAgICB0aGlzLmlkeCA9IGlkeDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHV0KE9iamVjdCBvYmosIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFyZ3NbaWR4XSA9IG9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBIb2xkZXJQYXJhbSBleHRlbmRzIFBhcmFtIHsKKworICAgICAgICBwdWJsaWMgSG9sZGVyUGFyYW0oaW50IGlkeCkgeworICAgICAgICAgICAgc3VwZXIoaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHB1dChPYmplY3Qgb2JqLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICBIb2xkZXIgaG9sZGVyID0gbmV3IEhvbGRlcigpOworICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaG9sZGVyLnZhbHVlID0gb2JqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnc1tpZHhdID0gaG9sZGVyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9NZXNzYWdlRmlsbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL01lc3NhZ2VGaWxsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjgxMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9NZXNzYWdlRmlsbGVyLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuc2VpOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuQnJpZGdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLkhlYWRlcnM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tZXNzYWdlLkJ5dGVBcnJheUF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5EYXRhSGFuZGxlckF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubWVzc2FnZS5KQVhCQXR0YWNobWVudDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5QYXJhbWV0ZXJJbXBsOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuQXR0YWNobWVudDsKKworLyoqCisgKiBQdXRzIGEgbm9uLXBheWxvYWQgbWVzc2FnZSBwYXJhbWV0ZXIgdG8ge0BsaW5rIE1lc3NhZ2V9LgorICoKKyAqIDxwPgorICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGhhbmRsZSBoZWFkZXIgcGFyYW1ldGVycyBhbmQgYXR0YWNobWVudCBwYXJhbWV0ZXJzLgorICogVGhleSBhZGQgdGhpbmdzIHRvIHtAbGluayBNZXNzYWdlfS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCithYnN0cmFjdCBjbGFzcyBNZXNzYWdlRmlsbGVyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgbWV0aG9kIGludm9jYXRpb24gcGFyYW1ldGVycyB0aGF0IHRoaXMgb2JqZWN0IGxvb2tzIGZvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1ldGhvZFBvczsKKworICAgIHByb3RlY3RlZCBNZXNzYWdlRmlsbGVyKCBpbnQgbWV0aG9kUG9zKSB7CisgICAgICAgIHRoaXMubWV0aG9kUG9zID0gbWV0aG9kUG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vdmVzIGFuIGFyZ3VtZW50IG9mIGEgbWV0aG9kIGludm9jYXRpb24gaW50byBhIHtAbGluayBNZXNzYWdlfS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGZpbGxJbihPYmplY3RbXSBtZXRob2RBcmdzLCBPYmplY3QgcmV0dXJuVmFsdWUsIE1lc3NhZ2UgbXNnKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXJhbWV0ZXIgYXMgYW4gTUlNRSBhdHRhY2htZW50IHRvIHtAbGluayBNZXNzYWdlfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQXR0YWNobWVudEZpbGxlciBleHRlbmRzIE1lc3NhZ2VGaWxsZXIgeworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgUGFyYW1ldGVySW1wbCBwYXJhbTsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFZhbHVlR2V0dGVyIGdldHRlcjsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtaW1lVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudElkUGFydDsKKworICAgICAgICBwcm90ZWN0ZWQgQXR0YWNobWVudEZpbGxlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBWYWx1ZUdldHRlciBnZXR0ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtLmdldEluZGV4KCkpOworICAgICAgICAgICAgdGhpcy5wYXJhbSA9IHBhcmFtOworICAgICAgICAgICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7CisgICAgICAgICAgICBtaW1lVHlwZSA9IHBhcmFtLmdldEJpbmRpbmcoKS5nZXRNaW1lVHlwZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb250ZW50SWRQYXJ0ID0gVVJMRW5jb2Rlci5lbmNvZGUocGFyYW0uZ2V0UGFydE5hbWUoKSwgIlVURi04IikrJz0nOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBNZXNzYWdlRmlsbGVyIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXIgdHlwZQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgICAgICogICAgICBydW50aW1lIFBhcmFtZXRlciB0aGF0IGFic3RyYWN0cyB0aGUgYW5ub3RhdGVkIGphdmEgcGFyYW1ldGVyCisgICAgICAgICAqIEBwYXJhbSBnZXR0ZXIKKyAgICAgICAgICogICAgICBHZXRzIGEgdmFsdWUgZnJvbSBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgcGFyYW1ldGVyIHBhc3NlZAorICAgICAgICAgKiAgICAgIGFzIGEgbWV0aG9kIGFyZ3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRmlsbGVyIGNyZWF0ZUF0dGFjaG1lbnRGaWxsZXIoUGFyYW1ldGVySW1wbCBwYXJhbSwgVmFsdWVHZXR0ZXIgZ2V0dGVyKSB7CisgICAgICAgICAgICBDbGFzcyB0eXBlID0gKENsYXNzKXBhcmFtLmdldFR5cGVSZWZlcmVuY2UoKS50eXBlOworICAgICAgICAgICAgaWYgKERhdGFIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgfHwgU291cmNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGFIYW5kbGVyRmlsbGVyKHBhcmFtLCBnZXR0ZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlW10uY2xhc3M9PXR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUZpbGxlcihwYXJhbSwgZ2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihpc1hNTE1pbWVUeXBlKHBhcmFtLmdldEJpbmRpbmcoKS5nZXRNaW1lVHlwZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSkFYQkZpbGxlcihwYXJhbSwgZ2V0dGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlckZpbGxlcihwYXJhbSwgZ2V0dGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRDb250ZW50SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGVudElkUGFydCtVVUlELnJhbmRvbVVVSUQoKSsiQGpheHdzLnN1bi5jb20iOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnl0ZUFycmF5RmlsbGVyIGV4dGVuZHMgQXR0YWNobWVudEZpbGxlciB7CisgICAgICAgIHByb3RlY3RlZCBCeXRlQXJyYXlGaWxsZXIoUGFyYW1ldGVySW1wbCBwYXJhbSwgVmFsdWVHZXR0ZXIgZ2V0dGVyKSB7CisgICAgICAgICAgICBzdXBlcihwYXJhbSwgZ2V0dGVyKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGZpbGxJbihPYmplY3RbXSBtZXRob2RBcmdzLCBPYmplY3QgcmV0dXJuVmFsdWUsIE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBTdHJpbmcgY29udGVudElkID0gZ2V0Q29udGVudElkKCk7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gKG1ldGhvZFBvcyA9PSAtMSkgPyByZXR1cm5WYWx1ZSA6IGdldHRlci5nZXQobWV0aG9kQXJnc1ttZXRob2RQb3NdKTsKKyAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgYXR0ID0gbmV3IEJ5dGVBcnJheUF0dGFjaG1lbnQoY29udGVudElkLChieXRlW10pb2JqLG1pbWVUeXBlKTsKKyAgICAgICAgICAgICAgICBtc2cuZ2V0QXR0YWNobWVudHMoKS5hZGQoYXR0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERhdGFIYW5kbGVyRmlsbGVyIGV4dGVuZHMgQXR0YWNobWVudEZpbGxlciB7CisgICAgICAgIHByb3RlY3RlZCBEYXRhSGFuZGxlckZpbGxlcihQYXJhbWV0ZXJJbXBsIHBhcmFtLCBWYWx1ZUdldHRlciBnZXR0ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtLCBnZXR0ZXIpOworICAgICAgICB9CisgICAgICAgIHZvaWQgZmlsbEluKE9iamVjdFtdIG1ldGhvZEFyZ3MsIE9iamVjdCByZXR1cm5WYWx1ZSwgTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50SWQgPSBnZXRDb250ZW50SWQoKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSAobWV0aG9kUG9zID09IC0xKSA/IHJldHVyblZhbHVlIDogZ2V0dGVyLmdldChtZXRob2RBcmdzW21ldGhvZFBvc10pOworICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSAob2JqIGluc3RhbmNlb2YgRGF0YUhhbmRsZXIpID8gKERhdGFIYW5kbGVyKW9iaiA6IG5ldyBEYXRhSGFuZGxlcihvYmosbWltZVR5cGUpOworICAgICAgICAgICAgQXR0YWNobWVudCBhdHQgPSBuZXcgRGF0YUhhbmRsZXJBdHRhY2htZW50KGNvbnRlbnRJZCwgZGgpOworICAgICAgICAgICAgbXNnLmdldEF0dGFjaG1lbnRzKCkuYWRkKGF0dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKQVhCRmlsbGVyIGV4dGVuZHMgQXR0YWNobWVudEZpbGxlciB7CisgICAgICAgIHByb3RlY3RlZCBKQVhCRmlsbGVyKFBhcmFtZXRlckltcGwgcGFyYW0sIFZhbHVlR2V0dGVyIGdldHRlcikgeworICAgICAgICAgICAgc3VwZXIocGFyYW0sIGdldHRlcik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBmaWxsSW4oT2JqZWN0W10gbWV0aG9kQXJncywgT2JqZWN0IHJldHVyblZhbHVlLCBNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRJZCA9IGdldENvbnRlbnRJZCgpOworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IChtZXRob2RQb3MgPT0gLTEpID8gcmV0dXJuVmFsdWUgOiBnZXR0ZXIuZ2V0KG1ldGhvZEFyZ3NbbWV0aG9kUG9zXSk7CisgICAgICAgICAgICBBdHRhY2htZW50IGF0dCA9IG5ldyBKQVhCQXR0YWNobWVudChjb250ZW50SWQsIG9iaiwgcGFyYW0uZ2V0QnJpZGdlKCksIG1pbWVUeXBlKTsKKyAgICAgICAgICAgIG1zZy5nZXRBdHRhY2htZW50cygpLmFkZChhdHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhcmFtZXRlciBhcyBhbiBoZWFkZXIuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEhlYWRlciBleHRlbmRzIE1lc3NhZ2VGaWxsZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJyaWRnZSBicmlkZ2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgVmFsdWVHZXR0ZXIgZ2V0dGVyOworCisgICAgICAgIHByb3RlY3RlZCBIZWFkZXIoaW50IG1ldGhvZFBvcywgQnJpZGdlIGJyaWRnZSwgVmFsdWVHZXR0ZXIgZ2V0dGVyKSB7CisgICAgICAgICAgICBzdXBlcihtZXRob2RQb3MpOworICAgICAgICAgICAgdGhpcy5icmlkZ2UgPSBicmlkZ2U7CisgICAgICAgICAgICB0aGlzLmdldHRlciA9IGdldHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZmlsbEluKE9iamVjdFtdIG1ldGhvZEFyZ3MsIE9iamVjdCByZXR1cm5WYWx1ZSwgTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IChtZXRob2RQb3MgPT0gLTEpID8gcmV0dXJuVmFsdWUgOiBnZXR0ZXIuZ2V0KG1ldGhvZEFyZ3NbbWV0aG9kUG9zXSk7CisgICAgICAgICAgICBtc2cuZ2V0SGVhZGVycygpLmFkZChIZWFkZXJzLmNyZWF0ZShicmlkZ2UsdmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpeworICAgICAgICByZXR1cm4gbWltZVR5cGUuZXF1YWxzKCJ0ZXh0L3htbCIpIHx8IG1pbWVUeXBlLmVxdWFscygiYXBwbGljYXRpb24veG1sIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9QYXlsb2FkUU5hbWVCYXNlZERpc3BhdGNoZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvUGF5bG9hZFFOYW1lQmFzZWREaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3M2FiMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvUGF5bG9hZFFOYW1lQmFzZWREaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5zZWk7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZmF1bHQuU09BUEZhdWx0QnVpbGRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5BYnN0cmFjdFNFSU1vZGVsSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5KYXZhTWV0aG9kSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuU2VydmVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5RTmFtZU1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogQW4ge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5zZWkuRW5kcG9pbnRNZXRob2REaXNwYXRjaGVyfSB0aGF0IHVzZXMKKyAqIFNPQVAgcGF5bG9hZCBmaXJzdCBjaGlsZCdzIFFOYW1lIGFzIHRoZSBrZXkgZm9yIGRpc3BhdGNoaW5nLgorICogPHAvPgorICogQSBtYXAgb2YgYWxsIHBheWxvYWQgUU5hbWVzIG9uIHRoZSBwb3J0IGFuZCB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgRW5kcG9pbnRNZXRob2RIYW5kbGVyfQorICogaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiBUaGUgcGF5bG9hZCBRTmFtZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUKKyAqIHJlcXVlc3Qge0BsaW5rIFBhY2tldH0gYW5kIHVzZWQgYXMgdGhlIGtleSB0byByZXR1cm4gdGhlIGNvcnJlY3QKKyAqIGhhbmRsZXIuCisgKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK2ZpbmFsIGNsYXNzIFBheWxvYWRRTmFtZUJhc2VkRGlzcGF0Y2hlciBpbXBsZW1lbnRzIEVuZHBvaW50TWV0aG9kRGlzcGF0Y2hlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBRTmFtZU1hcDxFbmRwb2ludE1ldGhvZEhhbmRsZXI+IG1ldGhvZEhhbmRsZXJzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9QQVlMT0FEX0xPQ0FMID0gIiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1BBWUxPQURfTlNVUkkgPSAiIjsKKyAgICBwcml2YXRlIFdTQmluZGluZyBiaW5kaW5nOworCisgICAgcHVibGljIFBheWxvYWRRTmFtZUJhc2VkRGlzcGF0Y2hlcihBYnN0cmFjdFNFSU1vZGVsSW1wbCBtb2RlbCwgV1NCaW5kaW5nIGJpbmRpbmcsIFNFSUludm9rZXJUdWJlIGludm9rZXJUdWJlKSB7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgIG1ldGhvZEhhbmRsZXJzID0gbmV3IFFOYW1lTWFwPEVuZHBvaW50TWV0aG9kSGFuZGxlcj4oKTsKKyAgICAgICAgZm9yKCBKYXZhTWV0aG9kSW1wbCBtIDogbW9kZWwuZ2V0SmF2YU1ldGhvZHMoKSApIHsKKyAgICAgICAgICAgIEVuZHBvaW50TWV0aG9kSGFuZGxlciBoYW5kbGVyID0gbmV3IEVuZHBvaW50TWV0aG9kSGFuZGxlcihpbnZva2VyVHViZSxtLGJpbmRpbmcpOworICAgICAgICAgICAgUU5hbWUgcGF5bG9hZE5hbWUgPSBtb2RlbC5nZXRRTmFtZUZvckpNKG0pOyAgICAgLy8gVE9ETyBuZWVkIGEgbmV3IG1ldGhvZCBvbiBKYXZhTWV0aG9kSW1wbAorICAgICAgICAgICAgbWV0aG9kSGFuZGxlcnMucHV0KHBheWxvYWROYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwYXlsb2FkTmFtZS5nZXRMb2NhbFBhcnQoKSwgaGFuZGxlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgUGF5bG9hZFFOYW1lQmFzZWREaXNwYXRjaGVyfSBuZXZlciByZXR1cm5zIG51bGwgYmVjYXVzZSB0aGlzIGlzIGFsd2F5cworICAgICAqIHRoZSBsYXN0IHtAbGluayBFbmRwb2ludE1ldGhvZEhhbmRsZXJ9IHRvIGtpY2sgaW4uCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIEVuZHBvaW50TWV0aG9kSGFuZGxlciBnZXRFbmRwb2ludE1ldGhvZEhhbmRsZXIoUGFja2V0IHJlcXVlc3QpIHRocm93cyBEaXNwYXRjaEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHJlcXVlc3QuZ2V0TWVzc2FnZSgpOworICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gbWVzc2FnZS5nZXRQYXlsb2FkTG9jYWxQYXJ0KCk7CisgICAgICAgIFN0cmluZyBuc1VyaTsKKyAgICAgICAgaWYgKGxvY2FsUGFydCA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2NhbFBhcnQgPSBFTVBUWV9QQVlMT0FEX0xPQ0FMOworICAgICAgICAgICAgbnNVcmkgPSBFTVBUWV9QQVlMT0FEX05TVVJJOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnNVcmkgPSBtZXNzYWdlLmdldFBheWxvYWROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEVuZHBvaW50TWV0aG9kSGFuZGxlciBoID0gbWV0aG9kSGFuZGxlcnMuZ2V0KG5zVXJpLCBsb2NhbFBhcnQpOworCisgICAgICAgIGlmIChoPT1udWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZGlzcGF0Y2hLZXkgPSAieyIgKyBuc1VyaSArICJ9IiArIGxvY2FsUGFydDsKKyAgICAgICAgICAgIFN0cmluZyBmYXVsdFN0cmluZyA9IFNlcnZlck1lc3NhZ2VzLkRJU1BBVENIX0NBTk5PVF9GSU5EX01FVEhPRChkaXNwYXRjaEtleSwgIlBheWxvYWQgUU5hbWUtYmFzZWQgRGlzcGF0Y2hlciIpOworICAgICAgICAgICAgdGhyb3cgbmV3IERpc3BhdGNoRXhjZXB0aW9uKFNPQVBGYXVsdEJ1aWxkZXIuY3JlYXRlU09BUEZhdWx0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCksIGZhdWx0U3RyaW5nLCBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCkuZmF1bHRDb2RlQ2xpZW50KSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvU0VJSW52b2tlclR1YmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvU0VJSW52b2tlclR1YmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNjMTMyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc2VydmVyL3NlaS9TRUlJbnZva2VyVHViZS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnNlaTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlNPQVBWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkludm9rZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LnNlaS5NZXRob2RIYW5kbGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkFic3RyYWN0U0VJTW9kZWxJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5JbnZva2VyVHViZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgcGlwZSBpcyB1c2VkIHRvIGludm9rZSBTRUkgYmFzZWQgZW5kcG9pbnRzLgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBjbGFzcyBTRUlJbnZva2VyVHViZSBleHRlbmRzIEludm9rZXJUdWJlIHsKKworICAgIC8qKgorICAgICAqIEZvciBlYWNoIG1ldGhvZCBvbiB0aGUgcG9ydCBpbnRlcmZhY2Ugd2UgaGF2ZQorICAgICAqIGEge0BsaW5rIE1ldGhvZEhhbmRsZXJ9IHRoYXQgcHJvY2Vzc2VzIGl0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU09BUFZlcnNpb24gc29hcFZlcnNpb247CisgICAgcHJpdmF0ZSBmaW5hbCBXU0JpbmRpbmcgYmluZGluZzsKKyAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0U0VJTW9kZWxJbXBsIG1vZGVsOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxFbmRwb2ludE1ldGhvZERpc3BhdGNoZXI+IGRpc3BhdGNoZXJMaXN0OworCisgICAgcHVibGljIFNFSUludm9rZXJUdWJlKEFic3RyYWN0U0VJTW9kZWxJbXBsIG1vZGVsLEludm9rZXIgaW52b2tlciwgV1NCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgc3VwZXIoaW52b2tlcik7CisgICAgICAgIHRoaXMuc29hcFZlcnNpb24gPSBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCk7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKKyAgICAgICAgRW5kcG9pbnRNZXRob2REaXNwYXRjaGVyR2V0dGVyIG1ldGhvZERpc3BhdGNoZXJHZXR0ZXIgPSBuZXcgRW5kcG9pbnRNZXRob2REaXNwYXRjaGVyR2V0dGVyKG1vZGVsLCBiaW5kaW5nLCB0aGlzKTsKKyAgICAgICAgZGlzcGF0Y2hlckxpc3QgPSBtZXRob2REaXNwYXRjaGVyR2V0dGVyLmdldERpc3BhdGNoZXJMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBiaW5kcyB0aGUgcGFyYW1ldGVycyBmb3IgU0VJIGVuZHBvaW50cyBhbmQgaW52b2tlcyB0aGUgZW5kcG9pbnQgbWV0aG9kLiBUaGUKKyAgICAgKiByZXR1cm4gdmFsdWUsIGFuZCByZXNwb25zZSBIb2xkZXIgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyB7QGxpbmsgTWVzc2FnZX0KKyAgICAgKiB0aGF0IHRyYXZlcnNlcyB0aHJvdWdoIHRoZSBQaXBlbGluZSB0byB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoQE5vdE51bGwgUGFja2V0IHJlcSkgeworICAgICAgICBQYWNrZXQgcmVzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChFbmRwb2ludE1ldGhvZERpc3BhdGNoZXIgZGlzcGF0Y2hlciA6IGRpc3BhdGNoZXJMaXN0KSB7CisgICAgICAgICAgICAgICAgRW5kcG9pbnRNZXRob2RIYW5kbGVyIGhhbmRsZXIgPSBkaXNwYXRjaGVyLmdldEVuZHBvaW50TWV0aG9kSGFuZGxlcihyZXEpOworICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gaGFuZGxlci5pbnZva2UocmVxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZG9SZXR1cm5XaXRoKHJlcS5jcmVhdGVTZXJ2ZXJSZXNwb25zZShlLmZhdWx0LCBtb2RlbC5nZXRQb3J0KCksIG51bGwsIGJpbmRpbmcpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBheWxvYWRRTmFtZUJhc2VkRGlzcGF0Y2hlciBzaG91bGQgdGhyb3cgRGlzcGF0Y2hFeGNlcHRpb24KKyAgICAgICAgYXNzZXJ0IHJlcyE9bnVsbDsKKworICAgICAgICByZXR1cm4gZG9SZXR1cm5XaXRoKHJlcyk7CisgICAgfQorCisgICAgcHVibGljIEBOb3ROdWxsIE5leHRBY3Rpb24gcHJvY2Vzc1Jlc3BvbnNlKEBOb3ROdWxsIFBhY2tldCByZXNwb25zZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbm92a2VyUGlwZSdzIHByb2Nlc3NSZXNwb25zZSBzaG91bGRuJ3QgYmUgY2FsbGVkLiIpOworICAgIH0KKworICAgIHB1YmxpYyBATm90TnVsbCBOZXh0QWN0aW9uIHByb2Nlc3NFeGNlcHRpb24oQE5vdE51bGwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5vdmtlclBpcGUncyBwcm9jZXNzRXhjZXB0aW9uIHNob3VsZG4ndCBiZSBjYWxsZWQuIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL1ZhbHVlR2V0dGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zZXJ2ZXIvc2VpL1ZhbHVlR2V0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2MjhlNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NlcnZlci9zZWkvVmFsdWVHZXR0ZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLnNlaTsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlBhcmFtZXRlcjsKKworaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CisKKy8qKgorICogR2V0cyBhIHZhbHVlIGZyb20gYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHBhcmFtZXRlciBwYXNzZWQKKyAqIGFzIGEgbWV0aG9kIGFyZ3VtZW50LgorICoKKyAqIDxwPgorICogVGhpcyBhYnN0cmFjdGlvbiBoaWRlcyB0aGUgaGFuZGxpbmcgb2Yge0BsaW5rIEhvbGRlcn0uCisgKgorICogPHA+CisgKiB7QGxpbmsgVmFsdWVHZXR0ZXJ9IGlzIGEgc3RhdGVsZXNzIGJlaGF2aW9yIGVuY2Fwc3VsYXRpb24uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitlbnVtIFZhbHVlR2V0dGVyIHsKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgVmFsdWVHZXR0ZXJ9IHRoYXQgd29ya3MgZm9yIHtAbGluayBNb2RlI0lOfSAgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogU2luY2UgaXQncyB0aGUgSU4gbW9kZSwgdGhlIHBhcmFtZXRlciBpcyBub3QgYSB7QGxpbmsgSG9sZGVyfSwKKyAgICAgKiB0aGVyZWZvcmUgdGhlIHBhcmFtZXRlciBpdHNlbGYgaXMgYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBQTEFJTigpIHsKKyAgICAgICAgT2JqZWN0IGdldChPYmplY3QgcGFyYW1ldGVyKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyOworICAgICAgICB9CisgICAgfSwKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHtAbGluayBWYWx1ZUdldHRlcn0gdGhhdCB3b3JrcyBmb3Ige0BsaW5rIEhvbGRlcn0sCisgICAgICogd2hpY2ggaXMgIHtAbGluayBNb2RlI0lOT1VUfSBvciAge0BsaW5rIE1vZGUjT1VUfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEluIHRob3NlIHtAbGluayBNb2RlfXMsIHRoZSBwYXJhbWV0ZXIgaXMgYSB7QGxpbmsgSG9sZGVyfSwKKyAgICAgKiBzbyB0aGUgdmFsdWUgdG8gYmUgc2VudCBpcyBvYnRhaW5lZCBieSBnZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgaG9sZGVyLgorICAgICAqLworICAgIEhPTERFUigpIHsKKyAgICAgICAgT2JqZWN0IGdldChPYmplY3QgcGFyYW1ldGVyKSB7CisgICAgICAgICAgICBpZihwYXJhbWV0ZXI9PW51bGwpCisgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBwYXNzIGluIG51bGwgd2hlcmUgYSBIb2xkZXIgaXMgZXhwZWN0ZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gKChIb2xkZXIpcGFyYW1ldGVyKS52YWx1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSB0byBiZSBzZW50LCBmcm9tIGEgcGFyYW1ldGVyIGdpdmVuIGFzIGEgbWV0aG9kIGFyZ3VtZW50LgorICAgICAqLworICAgIGFic3RyYWN0IE9iamVjdCBnZXQoT2JqZWN0IHBhcmFtZXRlcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFZhbHVlR2V0dGVyfSBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIHtAbGluayBQYXJhbWV0ZXJ9LgorICAgICAqLworICAgIHN0YXRpYyBWYWx1ZUdldHRlciBnZXQoUGFyYW1ldGVySW1wbCBwKSB7CisgICAgICAgIC8vIHJldHVybiB2YWx1ZSBpcyBhbHdheXMgUExBSU4KKyAgICAgICAgaWYocC5nZXRNb2RlKCkgPT0gTW9kZS5JTiB8fCBwLmdldEluZGV4KCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBQTEFJTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBIT0xERVI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvUHJvdmlkZXJJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvUHJvdmlkZXJJbXBsLmphdmEKaW5kZXggMmZkMzdmNi4uNjczYTBiNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL1Byb3ZpZGVySW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9Qcm92aWRlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw0MiArMjUsMTg1IEBACiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaTsKIAogCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NTZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuKjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5XU0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExQb3J0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExTZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlci5XU0RMUGFyc2VyRXh0ZW5zaW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5XU1NlcnZpY2VEZWxlZ2F0ZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETE1vZGVsSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuUHJvdmlkZXJBcGlNZXNzYWdlczsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuRW5kcG9pbnRJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUZpbmRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLlJ1bnRpbWVXU0RMUGFyc2VyOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CiAKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLndzLio7CiBpbXBvcnQgamF2YXgueG1sLndzLnNwaS5Qcm92aWRlcjsKIGltcG9ydCBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKK2ltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKKyAqIFRoZSBlbnRyeSBwb2ludCB0byB0aGUgSkFYLVdTIFJJIGZyb20gdGhlIEpBWC1XUyBBUEkuCisgKgogICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCiAgKi8KIHB1YmxpYyBjbGFzcyBQcm92aWRlckltcGwgZXh0ZW5kcyBQcm92aWRlciB7CiAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBKQVhCQ29udGV4dCBlcHJqYyA9IGdldEVQUkpheGJDb250ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW50IHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByb3ZpZGVySW1wbCBJTlNUQU5DRSA9IG5ldyBQcm92aWRlckltcGwoKTsKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFbmRwb2ludCBjcmVhdGVFbmRwb2ludChTdHJpbmcgYmluZGluZ0lkLCBPYmplY3QgaW1wbGVtZW50b3IpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludEltcGwoYmluZGluZ0lkLCBpbXBsZW1lbnRvcik7CisgICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRJbXBsKAorICAgICAgICAgICAgKGJpbmRpbmdJZCAhPSBudWxsKSA/IEJpbmRpbmdJRC5wYXJzZShiaW5kaW5nSWQpIDogQmluZGluZ0lELnBhcnNlKGltcGxlbWVudG9yLmdldENsYXNzKCkpLAorICAgICAgICAgICAgaW1wbGVtZW50b3IpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXJ2aWNlRGVsZWdhdGUgY3JlYXRlU2VydmljZURlbGVnYXRlKAotICAgICAgICAgamF2YS5uZXQuVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLAotICAgICAgICAgUU5hbWUgc2VydmljZU5hbWUsIENsYXNzIHNlcnZpY2VDbGFzcykgewotCi0KLQorICAgIHB1YmxpYyBTZXJ2aWNlRGVsZWdhdGUgY3JlYXRlU2VydmljZURlbGVnYXRlKCBVUkwgd3NkbERvY3VtZW50TG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lLCBDbGFzcyBzZXJ2aWNlQ2xhc3MpIHsKICAgICAgICAgIHJldHVybiBuZXcgV1NTZXJ2aWNlRGVsZWdhdGUod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lLCBzZXJ2aWNlQ2xhc3MpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFbmRwb2ludCBjcmVhdGVBbmRQdWJsaXNoRW5kcG9pbnQoU3RyaW5nIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgaW1wbGVtZW50b3IpIHsKLSAgICAgICAgRW5kcG9pbnQgZW5kcG9pbnQgPSBuZXcgRW5kcG9pbnRJbXBsKG51bGwsIGltcGxlbWVudG9yKTsKKyAgICAgICAgRW5kcG9pbnQgZW5kcG9pbnQgPSBuZXcgRW5kcG9pbnRJbXBsKAorICAgICAgICAgICAgQmluZGluZ0lELnBhcnNlKGltcGxlbWVudG9yLmdldENsYXNzKCkpLAorICAgICAgICAgICAgaW1wbGVtZW50b3IpOwogICAgICAgICBlbmRwb2ludC5wdWJsaXNoKGFkZHJlc3MpOwogICAgICAgICByZXR1cm4gZW5kcG9pbnQ7CiAgICAgfQogCisgICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIHJlYWRFbmRwb2ludFJlZmVyZW5jZShmaW5hbCBTb3VyY2UgZXBySW5mb3NldCkgeworICAgICAgICAvLyBFUFIgY29uc3RydWN0b3JzIGFyZSBwcml2YXRlLCBzbyB3ZSBuZWVkIHByaXZpbGVnZSBlc2NhbGF0aW9uLgorICAgICAgICAvLyB0aGlzIHVubWFyc2hhbGxpbmcgY2FuIG9ubHkgYWNjZXNzIGluc3RhbmNlcyBvZiBhIGZpeGVkLCBrbm93biBzZXQgb2YgY2xhc3NlcywKKyAgICAgICAgLy8gc28gZG9pbmcgdGhhdCBzaG91bGRuJ3QgaW50cm9kdWNlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkuCisgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxFbmRwb2ludFJlZmVyZW5jZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBlcHJqYy5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFbmRwb2ludFJlZmVyZW5jZSkgdW5tYXJzaGFsbGVyLnVubWFyc2hhbChlcHJJbmZvc2V0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIE1hcnNoYWxsZXIgb3IgbWFyc2hhbGxpbmcuIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IFQgZ2V0UG9ydChFbmRwb2ludFJlZmVyZW5jZSBlbmRwb2ludFJlZmVyZW5jZSwgQ2xhc3M8VD4gY2xhenosIFdlYlNlcnZpY2VGZWF0dXJlLi4uIHdlYlNlcnZpY2VGZWF0dXJlcykgeworICAgICAgICAvKgorICAgICAgICBmaW5hbCBATm90TnVsbCBNZW1iZXJTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgbXNlcHIgPQorICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbC50cmFuc2Zvcm0oTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmNsYXNzLCBlbmRwb2ludFJlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgV1NTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgV1NTZXJ2aWNlRGVsZWdhdGUobXNlcHIudG9XU0RMU291cmNlKCksIG1zZXByLnNlcnZpY2VOYW1lLm5hbWUsIFNlcnZpY2UuY2xhc3MpOworICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmKGVuZHBvaW50UmVmZXJlbmNlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihQcm92aWRlckFwaU1lc3NhZ2VzLk5VTExfRVBSKCkpOworICAgICAgICBXU0VuZHBvaW50UmVmZXJlbmNlIHdzZXByID0gIG5ldyBXU0VuZHBvaW50UmVmZXJlbmNlKGVuZHBvaW50UmVmZXJlbmNlKTsKKyAgICAgICAgV1NFbmRwb2ludFJlZmVyZW5jZS5NZXRhZGF0YSBtZXRhZGF0YSA9IHdzZXByLmdldE1ldGFEYXRhKCk7CisgICAgICAgIFdTU2VydmljZSBzZXJ2aWNlOworICAgICAgICBpZihtZXRhZGF0YS5nZXRXc2RsU291cmNlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZpY2UgPSBuZXcgV1NTZXJ2aWNlRGVsZWdhdGUobWV0YWRhdGEuZ2V0V3NkbFNvdXJjZSgpLCBtZXRhZGF0YS5nZXRTZXJ2aWNlTmFtZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIldTREwgbWV0YWRhdGEgaXMgbWlzc2luZyBpbiBFUFIiKTsKKyAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0UG9ydCh3c2VwciwgY2xhenosIHdlYlNlcnZpY2VGZWF0dXJlcyk7CisgICAgfQorCisgICAgcHVibGljIFczQ0VuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZVczQ0VuZHBvaW50UmVmZXJlbmNlKFN0cmluZyBhZGRyZXNzLCBRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydE5hbWUsIExpc3Q8RWxlbWVudD4gbWV0YWRhdGEsIFN0cmluZyB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgTGlzdDxFbGVtZW50PiByZWZlcmVuY2VQYXJhbWV0ZXJzKSB7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHBvcnROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3ZpZGVyQXBpTWVzc2FnZXMuTlVMTF9BRERSRVNTX1NFUlZJQ0VfRU5EUE9JTlQoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXQgaXMgcnVuIGluIGEgSmF2YSBFRSBDb250YWluZXIgYW5kIGlmIHNvLCBnZXQgYWRkcmVzcyB1c2luZyBzZXJ2aWNlTmFtZSBhbmQgcG9ydE5hbWUKKyAgICAgICAgICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gQ29udGFpbmVyUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICBNb2R1bGUgbW9kdWxlID0gY29udGFpbmVyLmdldFNQSShNb2R1bGUuY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMaXN0PEJvdW5kRW5kcG9pbnQ+IGJlTGlzdCA9IG1vZHVsZS5nZXRCb3VuZEVuZHBvaW50cygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKEJvdW5kRW5kcG9pbnQgYmUgOiBiZUxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdTRW5kcG9pbnQgd3NlID0gYmUuZ2V0RW5kcG9pbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c2UuZ2V0U2VydmljZU5hbWUoKS5lcXVhbHMoc2VydmljZU5hbWUpICYmIHdzZS5nZXRQb3J0TmFtZSgpLmVxdWFscyhwb3J0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gYmUuZ2V0QWRkcmVzcygpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heSBiZSB0aGUgY29udGFpbmVyIGRvZXMgbid0IHN1cHBvcnQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2p1c3QgaWdub3JlIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9hZGRyZXNzIGlzIHN0aWxsIG51bGw/IG1heSBiZSBpdHMgbm90IHJ1biBpbiBhIEphdmFFRSBDb250YWluZXIKKyAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3ZpZGVyQXBpTWVzc2FnZXMuTlVMTF9BRERSRVNTKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKChzZXJ2aWNlTmFtZT09bnVsbCkgJiYgKHBvcnROYW1lICE9IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3ZpZGVyQXBpTWVzc2FnZXMuTlVMTF9TRVJWSUNFKCkpOworICAgICAgICB9CisgICAgICAgIC8vVmFsaWRhdGUgU2VydmljZSBhbmQgUG9ydCBpbiBXU0RMCisgICAgICAgIGlmICh3c2RsRG9jdW1lbnRMb2NhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEVudGl0eVJlc29sdmVyIGVyID0gWG1sVXRpbC5jcmVhdGVEZWZhdWx0Q2F0YWxvZ1Jlc29sdmVyKCk7CisKKyAgICAgICAgICAgICAgICBVUkwgd3NkbExvYyA9IG5ldyBVUkwod3NkbERvY3VtZW50TG9jYXRpb24pOworICAgICAgICAgICAgICAgIFdTRExNb2RlbEltcGwgd3NkbERvYyA9IFJ1bnRpbWVXU0RMUGFyc2VyLnBhcnNlKHdzZGxMb2MsIG5ldyBTdHJlYW1Tb3VyY2Uod3NkbExvYy50b0V4dGVybmFsRm9ybSgpKSwgZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgU2VydmljZUZpbmRlci5maW5kKFdTRExQYXJzZXJFeHRlbnNpb24uY2xhc3MpLnRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgV1NETFNlcnZpY2Ugd3NkbFNlcnZpY2UgPSB3c2RsRG9jLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAod3NkbFNlcnZpY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oUHJvdmlkZXJBcGlNZXNzYWdlcy5OT1RGT1VORF9TRVJWSUNFX0lOX1dTREwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lLHdzZGxEb2N1bWVudExvY2F0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXU0RMUG9ydCB3c2RsUG9ydCA9IHdzZGxTZXJ2aWNlLmdldChwb3J0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NkbFBvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3ZpZGVyQXBpTWVzc2FnZXMuTk9URk9VTkRfUE9SVF9JTl9XU0RMKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUsc2VydmljZU5hbWUsd3NkbERvY3VtZW50TG9jYXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihQcm92aWRlckFwaU1lc3NhZ2VzLkVSUk9SX1dTREwod3NkbERvY3VtZW50TG9jYXRpb24pLGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFN1cHJlc3Mgd3JpdGluZyBTZXJ2aWNlTmFtZSBhbmQgRW5kcG9pbnROYW1lIGluIFczQyBFUFIsCisgICAgICAgIC8vIFVudGlsIHRoZSBucyBmb3IgdGhvc2UgbWV0YWRhdGEgZWxlbWVudHMgaXMgcmVzb2x2ZWQuCisgICAgICAgIHJldHVybiBuZXcgV1NFbmRwb2ludFJlZmVyZW5jZSgKKyAgICAgICAgICAgIEFkZHJlc3NpbmdWZXJzaW9uLmZyb21TcGVjQ2xhc3MoVzNDRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MpLAorICAgICAgICAgICAgYWRkcmVzcywgbnVsbCAvKnNlcnZpY2VOYW1lKi8sIG51bGwgLypwb3J0TmFtZSovLCBudWxsLCBtZXRhZGF0YSwgbnVsbCAvKndzZGxEb2N1bWVudExvY2F0aW9uKi8sIHJlZmVyZW5jZVBhcmFtZXRlcnMpLnRvU3BlYyhXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvbnRleHQgZ2V0RVBSSmF4YkNvbnRleHQoKSB7CisgICAgICAgIC8vIEVQUnMgaGF2ZSBwYWNrYWdlIGFuZCBwcml2YXRlIGZpZWxkcywgc28gd2UgbmVlZCBwcml2aWxlZ2UgZXNjYWxhdGlvbi4KKyAgICAgICAgLy8gdGhpcyBhY2Nlc3Mgb25seSBmaXhlZCwga25vd24gc2V0IG9mIGNsYXNzZXMsIHNvIGRvaW5nIHRoYXQKKyAgICAgICAgLy8gc2hvdWxkbid0IGludHJvZHVjZSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LgorICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248SkFYQkNvbnRleHQ+KCkgeworICAgICAgICAgICAgcHVibGljIEpBWEJDb250ZXh0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoTWVtYmVyU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmNsYXNzLCBXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBKQVhCQ29udGV4dCBmb3IgVzNDRW5kcG9pbnRSZWZlcmVuY2UuICIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvQmluZGluZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNlMmQwLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL0JpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7Ci0KLS8qKiBUaGUgPGNvZGU+QmluZGluZzwvY29kZT4gaXMgdGhlIHNwaSBpbnRlcmZhY2UgdGhhdCBleHRlbmRzIHRoZSBiYXNlIGludGVyZmFjZQotICogIGZvciBKQVgtV1MgcHJvdG9jb2wgYmluZGluZ3MuCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZy4KLSoqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nIGV4dGVuZHMgamF2YXgueG1sLndzLkJpbmRpbmcgewotCi0gIHB1YmxpYyBTeXN0ZW1IYW5kbGVyRGVsZWdhdGUgZ2V0U3lzdGVtSGFuZGxlckRlbGVnYXRlKCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0U3lzdGVtSGFuZGxlckRlbGVnYXRlKFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSk7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9DbGllbnRUcmFuc3BvcnRGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9DbGllbnRUcmFuc3BvcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmQ0MjcuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvQ2xpZW50VHJhbnNwb3J0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaW1wbGVtZW50ZWQgYnkKLSAqIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5DbGllbnRUcmFuc3BvcnRGYWN0b3J5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7Ci0gICAgcHVibGljIFdTQ29ubmVjdGlvbiBjcmVhdGUoTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL0NsaWVudFRyYW5zcG9ydEZhY3RvcnlUeXBlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGQzNjQuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZTsKLQotLyoqCi0gKiBUaGlzIGRlZmluZXMgdGhlIHR5cGVzIG9mIENsaWVudFRyYW5zcG9ydEZhY3RvcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBDbGllbnRUcmFuc3BvcnRGYWN0b3J5VHlwZXMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFAgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IDE7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9JbnRlcm5hbFNvYXBFbmNvZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9JbnRlcm5hbFNvYXBFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZGIzNzAuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvSW50ZXJuYWxTb2FwRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIFNPQVBFbmNvZGVyIHRvIGVuY29kZSBKQVhXUyBydW50aW1lIG9iamVjdHMuIFVzaW5nIHRoaXMgY2FsbGVyIGNvdWxkIG9wdGltaXplCi0gKiBTT0FQTWVzc2FnZSBjcmVhdGlvbiBhbmQgbm90IHVzZSBKQVhXUyBkZWZhdWx0IGVuY29kaW5nIG9mIFNPQVBNZXNzYWdlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJuYWxTb2FwRW5jb2RlciB7Ci0gICAgLyoqCi0gICAgICogIFdyaXRlcyBhbiBvYmplY3QgdG8gb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBvYmogcGF5bG9hZCB0byBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VJbmZvIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9ucyB0byBoZWxwIEpBWFdTIHdyaXRlIHRoZSBvYmplY3RzLiBHZXQKLSAgICAgKiAgICAgICAgdGhpcyBvYmplY3QgZnJvbSBTT0FQTWVzc2FnZUNvbnRleHQuZ2V0TWVzc2FnZUluZm8oKQotICAgICAqIEBwYXJhbSBvdXQgc3RyZWFtIHRvIHdyaXRlIHRvCi0gICAgICogQHBhcmFtIG10b21DYWxsYmFjayBjYWxsYmFjayBpcyBjYWxsZWQgaWYgdGhlcmUgYW55IGF0dGFjaG1lbnRzIHdoaWxlCi0gICAgICogICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyB0aGUgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0IG9iaiwgT2JqZWN0IG1lc3NhZ2VJbmZvLCBPdXRwdXRTdHJlYW0gb3V0LCBNdG9tQ2FsbGJhY2sgbXRvbUNhbGxiYWNrKTsKLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBvYmplY3QgdG8gb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBvYmogcGF5bG9hZCB0byBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VJbmZvIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9ucyB0byBoZWxwIEpBWFdTIHdyaXRlIHRoZSBvYmplY3RzLiBHZXQKLSAgICAgKiAgICAgICAgdGhpcyBvYmplY3QgZnJvbSBTT0FQTWVzc2FnZUNvbnRleHQuZ2V0TWVzc2FnZUluZm8oKQotICAgICAqIEBwYXJhbSBvdXQgc3RyZWFtIHdyaXRlciB0byB3cml0ZSB0bwotICAgICAqIEBwYXJhbSBtdG9tQ2FsbGJhY2sgY2FsbGJhY2sgaXMgY2FsbGVkIGlmIHRoZXJlIGFueSBhdHRhY2htZW50cyB3aGlsZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgdGhlIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKE9iamVjdCBvYmosIE9iamVjdCBtZXNzYWdlSW5mbywgWE1MU3RyZWFtV3JpdGVyIG91dCwgTXRvbUNhbGxiYWNrIG10b21DYWxsYmFjayk7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9JbnZva2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9JbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNmE0M2MuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvSW52b2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBDb21wbGV0ZSBpbnZvY2F0aW9uIG9mIHdlYnNlcnZpY2UgY2FuIGJlIGRvbmUgdXNpbmcgdGhpcyBvYmplY3QuIFNvIHRoaXMKLSAqIG9iamVjdCBjYW4gYmUgd3JhcHBlZCBpbiBvdGhlciBibG9ja3MgdG8gcHJvdmlkZSBjZXJ0YWluIGNvbnRleHQoZm9yIGUuZy4KLSAqIGNhbiBiZSB3cmFwcGVkIGluIGRvQXNQcml2aWxlZ2VkKCkpCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW52b2tlciB7Ci0gICAgLyoqCi0gICAgICogSW52b2tlcyByZXF1ZXN0IGhhbmRsZXIgY2hhaW4sIGVuZHBvaW50LCByZXNwb25zZSBoYW5kbGVyIGNoYWluCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEl0IGdpdmVzIGphdmEgbWV0aG9kcyBmb3IgYSBnaXZlIG9wZXJhdGlvbiBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgamF2YSBtZXRob2QgZm9yIG9wZXJhdGlvbiBuYW1lLCBvdGhlcndpc2UgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKFFOYW1lIG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvTWVzc2FnZUNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL01lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMzE1OGUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvTWVzc2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIEVuaGFuY2VkIEFQSScgTWVzc2FnZUNvbnRleHQgd2l0aCBzb21lIGV4dHJhIHByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlQ29udGV4dCBleHRlbmRzIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGJpbmRpbmcgaWQgZGVmaW5lZCBpbiBBUEkKLSAgICAgKiBAcmV0dXJuIGJpbmRpbmdJZCBpcyBvbmUgb2YgdGhlc2UgdmFsdWVzOgotICAgICAqIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywKLSAgICAgKiBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsCi0gICAgICogamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludm9jYXRpb24gbWV0aG9kLgotICAgICAqCi0gICAgICogQHJldHVybiBpbnZvY2F0aW9uIG1ldGhvZCwgbnVsbCBpZiB0aGUgbW9kZWwgZG9lc24ndCBrbm93Ci0gICAgICovCi0gICAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgY2Fubm9uaWNhbGl6YXRpb24gYWxnb3JpdGhtIHRoYXQgaXMgdXNlZCB3aGlsZSB3cml0aW5nIEpBWEIgb2JqZWN0cwotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2Fub25pY2FsaXphdGlvbihTdHJpbmcgYWxnb3JpdGhtKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEludm9rZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gSW52b2tlcgotICAgICAqLwotICAgIHB1YmxpYyBJbnZva2VyIGdldEludm9rZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgTVRPTSBpcyBhbmJsZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgTVRPTSBpcyBlbmFibGVkIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlOwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTXRvbUVuYWJsZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL010b21DYWxsYmFjay5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvTXRvbUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDIwOTUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvTXRvbUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogTVRPTSBjYWxsYmFjayBjbGFzcyB0aGF0IGlzIHBhc3NlZCB0byBJbnRlcm5hbFNvYXBFbmNvZGVyLndyaXRlKCkgdG8gZ2V0IG5vdGlmaWNhdGlvbiB3aGVuCi0gKiBtdG9tIGF0dGFjaG1lbnQgaXMgYWRkZWQgb3IgdGhlIG1lc3NhZ2UgaXMgeG9wcGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE10b21DYWxsYmFjayB7Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgdGhlIGNvbnRlbnQtaWQgdGhhdCB3aWxsIGJlIHNldCB0byBDb250ZW50LUlEIE1JTUUgaGVhZGVyLCB0aGUKLSAgICAgKiBlbGVtZW50IHdoaWNoIHdpbGwgYmUgeG9wIGVuY29kZWQgYnkgSkFYQi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50SWQKLSAgICAgKiBAcGFyYW0gYXR0YWNobWVudAotICAgICAqIEBwYXJhbSBlbGVtZW50VGFyZ2V0TmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGVsZW1lbnRMb2NhbE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRlZE10b21BdHRhY2htZW50KFN0cmluZyBjb250ZW50SWQsIERhdGFIYW5kbGVyIGF0dGFjaG1lbnQsIFN0cmluZyBlbGVtZW50VGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgZWxlbWVudExvY2FsTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9SdW50aW1lRW5kcG9pbnRJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9SdW50aW1lRW5kcG9pbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmFkMDEuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvUnVudGltZUVuZHBvaW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLS8qKgotICogVGhpcyBjYXB0dXJlcyBhbGwgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIChlLmc6IGhhbmRsZXJzLCBiaW5kaW5nLCBlbmRwb2ludAotICogb2JqZWN0LCBwcm94eSBmb3IgZW5kcG9pbnQgb2JqZWN0IGV0Yy4pIGFib3V0IHRoZSBlbmRwb2ludC4KLSAqLwotcHVibGljIGludGVyZmFjZSBSdW50aW1lRW5kcG9pbnRJbmZvIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVuZHBvaW50Ci0gICAgICogQHJldHVybiBuYW1lIG9mIHRoZSBlbmRwb2ludAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogc2V0cyB0aGUgbmFtZSBvZiB0aGUgZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBydW50aW1lIG1vZGVsIGZyb20gaW1wbGVtZW50b3Igb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKTsKLQotICAgIC8qKgotICAgICAqIERlc3Ryb3lzIGFueSBzdGF0ZSBpbiB0aGlzIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgb2JqZWN0IGlzIHVzZWQgZm9yIG1ldGhvZCBpbnZvY2F0aW9ucy4gSXQgY291bGQgYmUgYWN0dWFsCi0gICAgICogaW1wbGVtZW50b3Igb3IgYSBwcm94eSBvYmplY3QuIFRoaXMgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgZGVwbG95KCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50b3IoT2JqZWN0IGltcGxlbWVudG9yKTsKLQotICAgIC8qKgotICAgICAqIGltcGxlbWVudG9yQ2xhc3Mgc2hvdWxkIGhhdmUgPGNvZGU+QFdlYlNlcnZpY2U8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+QFdlYlNlcnZpY2VQcm92aWRlcjwvY29kZT4gYW5ub3RhdGlvbi4KLSAgICAgKiBEeW5hbWljIG1vZGVsIGlzIGNyZWF0ZWQgdXNpbmcgdGhpcyBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNldCwgaW1wbGVtZW50b3IncwotICAgICAqIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRvckNsYXNzKENsYXNzIGltcGxlbWVudG9yQ2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhY3R1YWwgRW5kcG9pbnQgT2JqZWN0IHdoZXJlIG1ldGhvZCBpbnZvY2F0aW9uIGlzIGRvbmUKLSAgICAgKgotICAgICAqIEByZXR1cm4gT2JqZWN0IEdldHMgdGhlIGVuZHBvaW50IGltcGxlbWVudGF0aW9uIG9iamVjdCBvciBhIHByb3h5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRJbXBsZW1lbnRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IGltcGxlbWVudG9yQ2xhc3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gaW1wbGVtZW50b3IncyBjbGFzcyB0aGF0IGhhcyB0aGUgYW5ub3RhdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SW1wbGVtZW50b3JDbGFzcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhpcyBlbmRwb2ludAotICAgICAqCi0gICAgICogQHJldHVybiBCaW5kaW5nIFJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoaXMgZW5kcG9pbnQuCi0gICAgICovCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0QmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogc2V0cyB0aGUgYmluZGluZyBmb3IgdGhpcyBlbmRwb2ludC4gSWYgdGhlcmUgYXJlIGhhbmRsZXJzLCBzZXQgdGhlbSBvbgotICAgICAqIHRoZSBiaW5kaW5nIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBXZWJTZXJ2aWNlQ29udGV4dCBvZiB0aGlzIGVuZHBvaW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFdlYlNlcnZpY2VDb250ZXh0IFJldHVybnMgdGhlIFdlYlNlcnZpY2VDb250ZXh0IG9mIHRoaXMgZW5kcG9pbnQuCi0gICAgICovCi0gICAgcHVibGljIFdlYlNlcnZpY2VDb250ZXh0IGdldFdlYlNlcnZpY2VDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBzZXRzIHRoZSBXZWJTZXJ2aWNlQ29udGV4dCBmb3IgdGhpcyBlbmRwb2ludC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlQ29udGV4dChXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogc2V0IHRoZSBVUkwgZm9yIHByaW1hcnkgV1NETCwgYW5kIGEgcmVzb2x2ZXIgdG8gcmVzb2x2ZSBlbnRpdGllcyBsaWtlCi0gICAgICogV1NETCwgaW1wb3J0cy9yZWZlcmVuY2VzLiBBIHJlc29sdmVyIGZvciBYTUwgY2F0YWxvZyBjYW4gYmUgY3JlYXRlZCB1c2luZwotICAgICAqIFdTUnRPYmplY3RGYWN0b3J5LmNyZWF0ZVJlc29sdmVyKFVSTCBjYXRhbG9nVVJMKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsSW5mbyhVUkwgd3NkbFVybCwgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHNlcnZpY2UgbmFtZSBmcm9tIERELiBJZiBpdCBpcyBudWxsLCBAV2ViU2VydmljZSwgQFdlYlNlcnZpY2VQcm92aWRlcgotICAgICAqIGFubm90YXRpb25zIGFyZSB1c2VkIHRvIGdldCBzZXJ2aWNlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShRTmFtZSBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFNldCBwb3J0IG5hbWUgZnJvbSBERC4gSWYgaXQgaXMgbnVsbCwgQFdlYlNlcnZpY2UsIEBXZWJTZXJ2aWNlUHJvdmlkZXIKLSAgICAgKiBhbm5vdGF0aW9ucyBhcmUgdXNlZCB0byBnZXQgcG9ydCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoUU5hbWUgbmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL1NPQVBNZXNzYWdlQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvU09BUE1lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmMxNzMuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvU09BUE1lc3NhZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGVuaGFuY2VzIEFQSSdzIFNPQVBNZXNzYWdlQ29udGV4dCBhbmQgcHJvdmlkZXMgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KLSAqIG9mIFNPQVBNZXNzYWdlIHNvIHRoYXQgaXQgY2FuIGJlIGVuY29kZWQgb3B0aW1hbGx5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUE1lc3NhZ2VDb250ZXh0Ci0gICAgZXh0ZW5kcyBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dCwgTWVzc2FnZUNvbnRleHQgewotCi0gICAgLyoqCi0gICAgICogSWYgdGhlcmUgaXMgYSBTT0FQTWVzc2FnZSBhbHJlYWR5LCB1c2UgZ2V0U09BUE1lc3NhZ2UoKS4gSWdub3JlIGFsbCBvdGhlciBtZXRob2RzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWxyZWFkeVNvYXAoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgSW50ZXJuYWxNZXNzYWdlJ3MgQm9keUJsb2NrIHZhbHVlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Qm9keSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBJbnRlcm5hbE1lc3NhZ2UncyBIZWFkZXJCbG9jayB2YWx1ZXMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0SGVhZGVycygpOwotCi0gICAgLyoqCi0gICAgICogVXNlIHRoaXMgb2JqZWN0IHRvIHBhc3MgdG8gSW50ZXJuYWxTb2FwRW5jb2RlciB3cml0ZSBtZXRob2RzCi0gICAgICogQHJldHVybiBvYmplY3QgY29udGFpbmcgaW5mb3JtYXRpb24gdGhhdHMgdXNlZCBieSBJbnRlcm5hbEVuY29kZXJEZWNvZGVyIHdyaXRlIG1ldGhvZHMuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE1lc3NhZ2VJbmZvKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRvIG1hcnNoYWxsIGFsbCBKQVhXUyBvYmplY3RzOiBScGNMaXRQYXlsb2FkLCBKQVhCQnJpZGdlSW5mbyBldGMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIEludGVybmFsU29hcEVuY29kZXIgZ2V0RW5jb2RlcigpOwotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9TdHViQmFzZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvU3R1YkJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjMmE0Yy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9TdHViQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGltcGxlbWVudGVkIGJ5Ci0gKiBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuU3R1YkJhc2UKLSAqLwotcHVibGljIGludGVyZmFjZSBTdHViQmFzZSB7Ci0gICAgcHVibGljIHZvaWQgX3NldFRyYW5zcG9ydEZhY3RvcnkoQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBmKTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL1N5c3RlbUhhbmRsZXJEZWxlZ2F0ZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvU3lzdGVtSGFuZGxlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOGEzYWIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvU3lzdGVtSGFuZGxlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7Ci0KLQotLyoqCi0gKiBBIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBpcyB1c2VkIHRvIGluamVjdCBzeXN0ZW0gbGV2ZWwgZnVuY3Rpb25hbGl0eSBpbnRvIGEKLSAqIG1lc3NhZ2UgcHJvY2Vzc2luZyBydW50aW1lLiBUaGUgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSBhcmUgaW52b2tlZCBieQotICogdGhlIGNsaWVudCBhbmQgZW5wb2ludCBtZXNzYWdlIGRpc3BhdGNoZXJzIG9mIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcKLSAqIHJ1bnRpbWUuCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBTeXN0ZW1IYW5kbGVyRGVsZWdhdGUgewotCi0gICAvKioKLSAgICAqIENhbGxlZCBieSBib3RoIGNsaWVudCBhbmQgZW5kcG9pbnQgbWVzc2FnZSBkaXNwYXRjaGVycyB0byBhY3RpdmF0ZQotICAgICogaW5qZWN0ZWQgcmVxdWVzdCBtZXNzYWdlIHByb2Nlc3NpbmcuCi0gICAgKiBXaGVuIGNhbGxlZCBieSBhIGNsaWVudCBzaWRlIG1lc3NhZ2UgZGlzcGF0Y2hlciwgdGhpcyBtZXRob2QgbXVzdCBiZQotICAgICogY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBtZXNzYWdlIChhc3NvY2lhdGVkIHdpdGggdGhlIE1lc3NhZ2VDb250ZXh0KQotICAgICogaXMgc2VudC4gV2hlbiBjYWxsZWQgYnkgdGhlIG1lc3NhZ2UgZGlzcGF0Y2hlciBhdCBhbiBlbmRwb2ludCwgdGhpcwotICAgICogbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBNdXN0VW5kZXJzdGFuZCBwcm9jZXNzaW5nIG9uIHRoZQotICAgICogYXNzb2NpYXRlZCBtZXNzYWdlLgotICAgICoKLSAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCB3aGVuIGNhbGxlZCBieSBhIFNPQVBCaW5kaW5nIHRoZSBhcmd1bWVudAotICAgICogbXVzdCBiZSBhbiBpbnN0YW5jZW9mIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLlNPQVBNZXNzYWdlQ29udGV4dCwgYW5kCi0gICAgKiB3aGVuIGNhbGxlZCBieSBhIFNPQVBCaW5kaW5nIGF0IGFuIGVuZHBvaW50LCB0aGUgYXJndW1lbnQgbXVzdAotICAgICogYmUgYW4gaW5zdGFuY2VvZiBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5TT0FQTWVzc2FnZUNvbnRleHQgYW5kIHRoZQotICAgICogSW52b2tlciAob24gdGhlIGNvbnRleHQpIG11c3QgYmUgYXZhaWxhYmxlIGZvciB1c2Ugb24gdGhlIHNlcnZlciBieSB0aGUKLSAgICAqIGRlbGVnYXRlLiBBbiBhcmd1bWVudCBTT0FQTWVzc2FnZUNvbnRleHQgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIGJ5IGFuIGVuZHBvaW50Ci0gICAgKiBkaXNwYXRjaGVyLCBtdXN0IGhhdmUgdmFsdWVzIGFzc2lnbmVkIGZvciB0aGUgZm9sbG93aW5nIE1lc3NhZ2VDb250ZXh0Ci0gICAgKiBwcm9wZXJ0aWVzLgotICAgICogPHVsPgotICAgICogPGxpPk1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVRVUVTVAotICAgICogPGxpPk1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVTUE9OU0UKLSAgICAqIDxsaT5NZXNzYWdlQ29udGV4dC5TRVJWTEVUX1NFU1NJT04KLSAgICAqIDxsaT5NZXNzYWdlQ29udGV4dC5TRVJWTEVUX0NPTlRFWFQKLSAgICAqIDwvdWw+Ci0gICAgKiBAcmV0dXJuIHRydWUgaWYgcHJvY2Vzc2luZyBieSB0aGUgZGVsZWdhdGUgd2FzIHN1Y2ggdGhhdCB0aGUgY2FsbGVyCi0gICAgKiBzaG91bGQgY29udGludWUgd2l0aCBpdHMgbm9ybWFsIG1lc3NhZ2UgcHJvY2Vzc2luZy4gUmV0dXJucyBmYWxzZSB3aGVuCi0gICAgKiB0aGUgZGVsZWdhdGUgaGFzIGVzdGFibGlzaGVkLCBpbiB0aGUgTWVzc2FnZUNvbnRleHQsCi0gICAgKiB0aGUgcmVzcG9uc2UgbWVzc2FnZSB0byBiZSBzZW50LiBXaGVuIHRoaXMgbWV0aG9kIHJldHVybnMKLSAgICAqIGZhbHNlLCB0aGUgY2FsbGluZyBtZXNzYWdlIGRpc3BhdGNoZXIgbXVzdCByZXR1cm4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UKLSAgICAqIHdpdGhvdXQgcGVyZm9ybWluZyBNdXN0VW5kZXJzdGFuZCBwcm9jZXNzaW5nIGFuZCB3aXRob3V0IGludm9raW5nIHRoZQotICAgICogZW5kcG9pbnQuIE9ubHkgZGVsZWdhdGVzIGNhbGxlZCBieSBlbmRwb2ludCBzaWRlIG1lc3NhZ2UgZGlzcGF0Y2hlcnMKLSAgICAqIG1heSByZXR1cm4gZmFsc2UKLSAgICAqCi0gICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gd2hlbiB0aGUgcHJvY2Vzc2luZyBieSB0aGUgZGVsZWdhdGUgZmFpbGVkCi0gICAgKiB3aXRob3V0IHlpZWxkaW5nIGEgcmVzcG9uc2UgbWVzc2FnZTsgaW4gd2hpY2ggY2FzZSwgdGhlIGNhbGxlciBzaGFsbAotICAgICogZGV0ZXJtaW5lIGhvdyB0byBwcm9jZXNzIHRoZSBlcnJvci4KLSAgICAqCi0gICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUmVxdWVzdChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgLyoqCi0gICAgKiBDYWxsZWQgYnkgYm90aCBjbGllbnQgYW5kIGVuZHBvaW50IG1lc3NhZ2UgZGlzcGF0Y2hlcnMgdG8gYWN0aXZhdGUKLSAgICAqIGluamVjdGVkIHJlc3BvbnNlIG1lc3NhZ2UgcHJvY2Vzc2luZy4KLSAgICAqIFdoZW4gY2FsbGVkIGJ5IHRoZSBtZXNzYWdlIGRpc3BhdGNoZXIgYXQgdGhlIGNsaWVudCwgdGhpcyBtZXRob2QgbXVzdCBiZQotICAgICogY2FsbGVkIGJlZm9yZSBNdXN0VW5kZXJzdGFuZCBwcm9jZXNzaW5nIG9uIHRoZSByZWNlaXZlZCBtZXNzYWdlCi0gICAgKiAoYXNzb2NpYXRlZCB3aXRoIHRoZSBNZXNzYWdlQ29udGV4dCkuIFdoZW4gY2FsbGVkIGJ5IHRoZSBtZXNzYWdlCi0gICAgKiBkaXNwYXRjaGVyIGF0IGFuIGVuZHBvaW50LCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUKLSAgICAqIGVuZHBvaW50IGhhcyBiZWVuIGludm9rZWQsIGFuZCBqdXN0IGJlZm9yZSB0aGUgYXNzb2NpYXRlZCByZXNwb25zZQotICAgICogbWVzc2FnZSBpcyBzZW50LiBJbiB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIGludm9jYXRpb24gb2YgdGhlIGVuZHBvaW50Ci0gICAgKiBjYXVzZWQgYW4gRXhjZXB0aW9uIHRvIGJlIHRocm93biwgdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkLgotICAgICoKLSAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCB3aGVuIGNhbGxlZCBieSBhIFNPQVBCaW5kaW5nIHRoZSBhcmd1bWVudAotICAgICogbXVzdCBiZSBhbiBpbnN0YW5jZW9mIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLlNPQVBNZXNzYWdlQ29udGV4dC4KLSAgICAqCi0gICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gd2hlbiB0aGUgcHJvY2Vzc2luZyBieSB0aGUgZGVsZWdhdGUgZmFpbGVkLgotICAgICogSW4gdGhpcyBjYXNlLCB0aGUgY2FsbGVyIG11c3Qgbm90IHNlbmQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgYnV0IHNoYWxsCi0gICAgKiBvdGhlcndpc2UgZGV0ZXJtaW5lIGhvdyB0byBwcm9jZXNzIHRoZSBlcnJvci4KLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NSZXNwb25zZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBieSBhbiBlbmRwb2ludCBtZXNzYWdlIGRpc3BhdGNoZXIgYWZ0ZXIKLSAgICAqIE11c3RVbmRlcnN0YW5kIHByb2Nlc3NpbmcgYW5kIGJlZm9yZSBlbmRwb2ludCBpbnZvY2F0aW9uLgotICAgICoKLSAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCB3aGVuIGNhbGxlZCBieSBhIFNPQVBCaW5kaW5nIHRoZSBhcmd1bWVudAotICAgICogbXVzdCBiZSBhbiBpbnN0YW5jZW9mIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLlNPQVBNZXNzYWdlQ29udGV4dCwgYW5kCi0gICAgKiBtdXN0IGhhdmUgdmFsdWVzIGFzc2lnbmVkIGZvciB0aGUgZm9sbG93aW5nIE1lc3NhZ2VDb250ZXh0Ci0gICAgKiBwcm9wZXJ0aWVzLgotICAgICogPHVsPgotICAgICogPGxpPk1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVRVUVTVAotICAgICogPGxpPk1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVTUE9OU0UKLSAgICAqIDxsaT5NZXNzYWdlQ29udGV4dC5TRVJWTEVUX1NFU1NJT04KLSAgICAqIDxsaT5NZXNzYWdlQ29udGV4dC5TRVJWTEVUX0NPTlRFWFQKLSAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlSW52b2tlRW5kcG9pbnRIb29rKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL1N5c3RlbUhhbmRsZXJEZWxlZ2F0ZUZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL1N5c3RlbUhhbmRsZXJEZWxlZ2F0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3Yjg0MC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9TeXN0ZW1IYW5kbGVyRGVsZWdhdGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlRocmVhZC5jdXJyZW50VGhyZWFkOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3lzdGVtSGFuZGxlckRlbGVnYXRlRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9GQUNUT1JZX05BTUUgPQotICAgICAgICAiY29tLnN1bi54bWwuaW50ZXJuYWwueHdzcy5TeXN0ZW1IYW5kbGVyRGVsZWdhdGVGYWN0b3J5IjsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmYWN0b3J5TmFtZTsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgZmFjdG9yeU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0KCkgewotICAgICAgICBmYWN0b3J5TmFtZSA9IERFRkFVTFRfRkFDVE9SWV9OQU1FOwotICAgICAgICBmYWN0b3J5TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9OwotCi0gICAgLy8gZm9jdG9yeSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBtYWludGFpbiBhIG1hcCBvZiBzZXJ2aWNlTmFtZSB0bwotICAgIC8vIHdvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gICAgLyoqCi0gICAgKiBVc2VkIGJ5IHRoZSBBcHBzZXJ2ZXIgb24gY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMKLSAgICAqIGZhY3RvcnkgaW1wbGVtZW50YXRpb25zIHRoYXQgbWFpbnRhaW4gYSBtYXAgb2Ygc2VydmljZU5hbWUgdG8KLSAgICAqIGZhY3RvcnkKLSAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSB3aGVuIGNhbGxlZCBieSB0aGUgU09BUEJpbmRpbmdJbXBsIHRvCi0gICAgKiBjcmVhdGUgdGhlIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZS4gc2VydmljZU5hbWUgbXVzdCBiZQotICAgICogYSBRTmFtZQotICAgICogQHJldHVybiBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5TeXN0ZW1IYW5kbGVyRGVsZWdhdGUKLSAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB3aGVuIHRoZSBjcmVhdGUgZmFpbGVkLgotICAgICovCi0gICAgcHVibGljIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICByZXR1cm4gY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVc2VkIGJ5IHRoZSBBcHBzZXJ2ZXIgYW5kIHh3cy1zZWN1cml0eSBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlcwotICAgICogZmFjdG9yeSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBtYWludGFpbiBhIG1hcCBvZiBzZXJ2aWNlTmFtZSB0bwotICAgICogZmFjdG9yeQotICAgICogQHJldHVybiBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5TeXN0ZW1IYW5kbGVyRGVsZWdhdGUKLSAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB3aGVuIHRoZSBjcmVhdGUgZmFpbGVkLgotICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZSBjcmVhdGUoKTsKLQotICAgIC8vY3VycmVudGx5IG5vdCB1c2VkCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KTsKLQotICAgIC8vIGZhY3RvcnkgbmFtZSBjYW4gYmUgc2V0IHRvIG51bGwsIGluIHdoaWNoIGNhc2UsCi0gICAgLy8gdGhlIGRlZmF1bHQgZmFjdG9yeSB3aWxsIGJlIGRpc2FibGVkLgotICAgIC8qKgotICAgICogVXNlZCBieSB0aGUgQXBwc2VydmVyIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCi0gICAgKiBmYWN0b3J5TmFtZSBjYW4gYmUgc2V0IHRvIG51bGwsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHRGYWN0b3J5IHdpbGwgYmUKLSAgICAqIGRpc2FibGVkCi0gICAgKiBAcGFyYW0gbmFtZSB3aGVuIGNhbGxlZCBieSB0aGUgU09BUEJpbmRpbmdJbXBsIHRvCi0gICAgKiBjcmVhdGUgdGhlIFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZS4gc2VydmljZU5hbWUgbXVzdCBiZQotICAgICogYSBTdHJpbmcKLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0RmFjdG9yeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZmFjdG9yeU5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICogVXNlZCBieSB0aGUgQXBwc2VydmVyIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCi0gICAgKiBmYWN0b3J5TmFtZSBjYW4gYmUgc2V0IHRvIG51bGwsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHRGYWN0b3J5IHdpbGwgYmUKLSAgICAqIGRpc2FibGVkIGFuZCB3aWxsIGJlIG51bGwgb24gcmV0dXJuCi0gICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgLSBuYW1lIG9mIGZhY3RvcnkKLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRGYWN0b3J5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnlOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAqIFVzZWQgYnkgdGhlIEpBWC1XUyBpbXBsZW1lbnRhdGlvbiBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlcwotICAgICogdG8gbG9hZCB0aGUgU3lzdGVtSGFuZGxlckRlbGVnYXRlRmFjdG9yeQotICAgICogQHJldHVybiBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5TeXN0ZW1IYW5kbGVyRGVsZWdhdGVGYWN0b3J5Ci0gICAgKiBAdGhyb3dzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uIHdoZW4gdGhlIGxvYWQgZmFpbHMuCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTeXN0ZW1IYW5kbGVyRGVsZWdhdGVGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0KLSAgICAgICAgU3lzdGVtSGFuZGxlckRlbGVnYXRlRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgIChTeXN0ZW1IYW5kbGVyRGVsZWdhdGVGYWN0b3J5KSBmYWN0b3J5TWFwLmdldChmYWN0b3J5TmFtZSk7Ci0KLSAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCB8fCBmYWN0b3J5TWFwLmNvbnRhaW5zS2V5KGZhY3RvcnlOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gZm9yTmFtZShmYWN0b3J5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2xhenogPSBsb2FkZXIubG9hZENsYXNzKGZhY3RvcnlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gKFN5c3RlbUhhbmRsZXJEZWxlZ2F0ZUZhY3RvcnkpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsgLy90b2RvOm5lZWQgdG8gYWRkIGxvZwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbih4KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RvcmVzIG51bGwgZmFjdG9yeSB2YWx1ZXMgaW4gbWFwIHRvIHByZXZlbnQKLSAgICAgICAgICAgICAgICAvLyByZXBlYXRlZCBjbGFzcyBsb2FkaW5nIGFuZCBpbnN0YW50aWF0aW9uIGVycm9ycy4KLSAgICAgICAgICAgICAgICBmYWN0b3J5TWFwLnB1dChmYWN0b3J5TmFtZSwgZmFjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvVGllLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9UaWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0OWQ4MC4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9UaWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lOwotCi0vKioKLSAqIEVudHJ5IHBvaW50IHRvIEpBWFdTIHNlcnZlciBzaWRlIHJ1bnRpbWUKLSAqLwotcHVibGljIGludGVyZmFjZSBUaWUgewotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBXZWIgU2VydmljZSByZXF1ZXN0IGZvciBSdW50aW1lRW5kcG9pbnRJbmZvIGZyb20gV1NDb25uZWN0aW9uCi0gICAgICogYW5kIHNlbmRzIGEgcmVzcG9uc2UuIFNldCA8Y29kZT5XZWJTZXJ2aWNlQ29udGV4dDwvY29kZT4gd2l0aCBhIGZpbGxlZC1pbgotICAgICAqIDwvY29kZT5NZXNzYWdlQ29udGV4dDwvY29kZT4gb24gPGNvZGU+UnVudGltZUVuZHBvaW50SW5mbzwvY29kZT4gYmVmb3JlCi0gICAgICogY2FsbGluZyB0aGlzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZShXU0Nvbm5lY3Rpb24gY29uLCBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50KQotICAgIHRocm93cyBFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL1dTQ29ubmVjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvV1NDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDNlMjYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvV1NDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogQ2FwdHVyZXMgbWFueSB0cmFuc3BvcnRzIHRoYXQgYXJlIHVzZWQgdG8gdGFsayB3aXRoIFdTIGVuZHBvaW50cy4KLSAqCi0gKiBGb3IgZW5kcG9pbnRzIGRlcGxveWVkIGluIGxpZ2h0IHdlaWdodCBodHRwIHNlcnZlciBpbiBKMlNFLCB0aGUgaW1wbGVtZW5hdGlvbgotICogb2YgdGhpcyBjbGFzcyB1c2VzIEh0dHBUcmFuc2FjdGlvbiB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8gc3RyZWFtLgotICoKLSAqIEZvciBlbmRwb2ludHMgZGVwbG95ZWQgaW4gc2VydmxldCBjb250YWluZXIsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gKiBjbGFzcyB1c2VzIEh0dHBTZXJ2bGV0UmVxdWVzdCB0byByZWFkIGEgcmVxdWVzdCwgYW5kIHVzZXMgSHR0cFNlcnZsZXRSZXNwb25zZQotICogdG8gd3JpdGUgcmVzcG9uc2UuCi0gKgotICogVGhpcyBhbHNvIHdvcmtzIGZvciBsb2NhbCB0cmFuc3BvcnQsIEpNUyB0cmFuc3BvcnQuCi0gKgotICogUnVudGltZSBjYW4gYWNjZXNzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB1c2luZwotICogbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpCi0gKgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgV1NDb25uZWN0aW9uIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LPTIwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkVXQVk9MjAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEX01FRElBPTQxNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUxGT1JNRURfWE1MPTQwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlI9NTAwOwotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0cmFuc3BvcnQgaGVhZGVycwotICAgICAqIEByZXR1cm4gdHJhbnNwb3J0IGhlYWRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+IGdldEhlYWRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIHNldHMgdHJhbnNwb3J0IGhlYWRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJzKE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiBoZWFkZXJzKTsKLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIHRyYW5zcG9ydCBzdGF0dXMgY29kZSBsaWtlIDxjb2RlPk9LPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJuIHRoZSBzdGF0dXMgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc3BvcnQncyB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbQotICAgICAqIEByZXR1cm4gVHJhbnNwb3J0J3MgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXQoKTsKLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0cmFuc3BvcnQncyBpbnB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZUlucHV0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc3BvcnQncyB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAcmV0dXJuIFRyYW5zcG9ydCdzIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdHJhbnNwb3J0J3Mgb3V0cHV0IHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlT3V0cHV0KCk7Ci0KLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldERlYnVnKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdHJhbnNwb3J0IGNvbm5lY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9XZWJTZXJ2aWNlQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvV2ViU2VydmljZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkZWM0OS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zcGkvcnVudGltZS9XZWJTZXJ2aWNlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLQotLyoqCi0gKiBFbmhhbmNlZCBBUEkgV2ViU2VydmljZUNvbnRleHQgdGhhdCBjb250YWlucyBhIG1ldGhvZCB0byBzZXQgTWVzc2FnZUNvbnRleHQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlQ29udGV4dCBleHRlbmRzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dCB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIFNQSSdzIE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgY3R4dCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3NwaS9ydW50aW1lL3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjJkYmYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3BpL3J1bnRpbWUvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi0vKioKLSAqCi0gKiA8UD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgU1BJIGZvciB0aGUgSkFYLVdTIDIuMCBydW50aW1lLgotICogIEFwcGxpY2F0aW9ucyBjYW4gdXNlIHRoaXMgU1BJIHRvIGludGVyYWN0IHdpdGggdGhlIHJ1bnRpbWUgYXQKLSAqICB2YXJpb3VzIHBvaW50cyB0byBnZXQgYWNjZXNzIHRvIGluZm9ybWF0aW9uIGFuZCB0byBwZXJmb3JtCi0gKiAgdmFyaW91cyBvcGVyYXRpb25zIHN1Y2ggYXMgc2VjdXJpdHkgZXRjLgotKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvQXR0cmlidXRlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL0F0dHJpYnV0ZXMuamF2YQppbmRleCA0MTI4YWNiLi4yNWQ3N2U4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvQXR0cmlidXRlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9BdHRyaWJ1dGVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL0RPTVN0cmVhbVJlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL0RPTVN0cmVhbVJlYWRlci5qYXZhCmluZGV4IDNmZDJjODUuLjdiYTk1NDIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9ET01TdHJlYW1SZWFkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvRE9NU3RyZWFtUmVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNTcgKzI1LDk4IEBACiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5GaW5hbEFycmF5TGlzdDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLlhNTFN0cmVhbUV4Y2VwdGlvbjI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuRHVtbXlMb2NhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBzdGF0aWMgb3JnLnczYy5kb20uTm9kZS4qOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAogLyoqCisgKiBDcmVhdGUgYW4ge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gb24gdG9wIG9mIGEgRE9NIHRyZWUuCiAgKgotICogQ3JlYXRlIGFuIFhNTFN0cmVhbVJlYWRlciBvbiB0b3Agb2YgYSBET00gbGV2ZWwgMiB0cmVlLiBJdCBhIERPTSBsZXZlbAorICogPHA+CisgKiBTaW5jZSB2YXJpb3VzIGxpYnJhcmllcyBhcyB3ZWxsIGFzIHVzZXJzIG9mdGVuIGNyZWF0ZSAiaW5jb3JyZWN0IiBET00gbm9kZSwKKyAqIHRoaXMgY2xhc3Mgc3BlbmRzIGEgbG90IG9mIGVmZm9ydHMgbWFraW5nIHN1cmUgdGhhdCBicm9rZW4gRE9NIHRyZWVzIGFyZQorICogbmV2ZXJ0aGVsZXNzIGludGVycHJldGVkIGNvcnJlY3RseS4KKyAqCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCBpZiBhIERPTSBsZXZlbAogICogMSB0cmVlIGlzIHBhc3NlZCwgZWFjaCBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZQotICogYnkgdXNpbmcgPGNvZGU+Z2V0Tm9kZU5hbWUoKTwvY29kZT4uCisgKiBieSB1c2luZyB7QGxpbmsgTm9kZSNnZXROb2RlTmFtZSgpfS4KKyAqCisgKiA8cD4KKyAqIFNpbWlsYXJseSwgaWYgRE9NIGlzIG1pc3NpbmcgZXhwbGljaXQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywKKyAqIHRoaXMgY2xhc3MgYXR0ZW1wdHMgdG8gZW11bGF0ZSBuZWNlc3NhcnkgZGVjbGFyYXRpb25zLgorICoKICAqCiAgKiBAYXV0aG9yIFNhbnRpYWdvLlBlcmljYXNHZWVydHNlbkBzdW4uY29tCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCiAgKi8KLXB1YmxpYyBjbGFzcyBET01TdHJlYW1SZWFkZXIgaW1wbGVtZW50cyBYTUxTdHJlYW1SZWFkZXIsIE5hbWVzcGFjZUNvbnRleHQgeworcHVibGljIGZpbmFsIGNsYXNzIERPTVN0cmVhbVJlYWRlciBpbXBsZW1lbnRzIFhNTFN0cmVhbVJlYWRlciwgTmFtZXNwYWNlQ29udGV4dCB7CiAKICAgICAvKioKICAgICAgKiBDdXJyZW50IERPTSBub2RlIGJlaW5nIHRyYXZlcnNlZC4KICAgICAgKi8KLSAgICBOb2RlIF9jdXJyZW50OworICAgIHByaXZhdGUgTm9kZSBfY3VycmVudDsKIAogICAgIC8qKgogICAgICAqIFN0YXJ0aW5nIG5vZGUgb2YgdGhlIHN1YnRyZWUgYmVpbmcgdHJhdmVyc2VkLgogICAgICAqLwotICAgIE5vZGUgX3N0YXJ0OworICAgIHByaXZhdGUgTm9kZSBfc3RhcnQ7CiAKICAgICAvKioKICAgICAgKiBOYW1lZCBtYXBwaW5nIGZvciBhdHRyaWJ1dGVzIGFuZCBOUyBkZWNscyBmb3IgdGhlIGN1cnJlbnQgbm9kZS4KICAgICAgKi8KLSAgICBOYW1lZE5vZGVNYXAgX25hbWVkTm9kZU1hcDsKKyAgICBwcml2YXRlIE5hbWVkTm9kZU1hcCBfbmFtZWROb2RlTWFwOworCisgICAgLyoqCisgICAgICogSWYgdGhlIHJlYWRlciBwb2ludHMgYXQge0BsaW5rICNDSEFSQUNURVJTIHRoZSB0ZXh0IG5vZGV9LAorICAgICAqIGl0cyB3aG9sZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgc2ltcGx5IGEgY2FjaGUgb2Yge0BsaW5rIFRleHQjZ2V0V2hvbGVUZXh0KCl9IG9mIHtAbGluayAjX2N1cnJlbnR9LAorICAgICAqIGJ1dCB3aGVuIGEgbGFyZ2UgYmluYXJ5IGRhdGEgc2VudCBhcyBiYXNlNjQgdGV4dCwgdGhpcyBjb3VsZCBnZXQgdmVyeSBtdWNoCisgICAgICogbm9uLXRyaXZpYWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgd2hvbGVUZXh0OwogCiAgICAgLyoqCiAgICAgICogTGlzdCBvZiBhdHRyaWJ1dGVzIGV4dHJhY3RlZCBmcm9tIDxjb2RlPl9uYW1lZE5vZGVNYXA8L2NvZGU+LgogICAgICAqLwotICAgIExpc3Q8QXR0cj4gX2N1cnJlbnRBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxBdHRyPigpOworICAgIHByaXZhdGUgZmluYWwgRmluYWxBcnJheUxpc3Q8QXR0cj4gX2N1cnJlbnRBdHRyaWJ1dGVzID0gbmV3IEZpbmFsQXJyYXlMaXN0PEF0dHI+KCk7CiAKICAgICAvKioKLSAgICAgKiBMaXN0IG9mIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgZXh0cmFjdGVkIGZyb20gPGNvZGU+X25hbWVkTm9kZU1hcDwvY29kZT4KKyAgICAgKiB7QGxpbmsgU2NvcGV9IGJ1ZmZlci4KICAgICAgKi8KLSAgICBMaXN0PEF0dHI+IF9jdXJyZW50TmFtZXNwYWNlcyA9IG5ldyBBcnJheUxpc3Q8QXR0cj4oKTsKKyAgICBwcml2YXRlIFNjb3BlW10gc2NvcGVzID0gbmV3IFNjb3BlWzhdOwogCiAgICAgLyoqCi0gICAgICogRmxhZyBpbmRpY2F0aW5nIGlmIDxjb2RlPl9uYW1lZE5vZGVNYXA8L2NvZGU+IGlzIGFscmVhZHkgc3BsaXQgaW50bwotICAgICAqIDxjb2RlPl9jdXJyZW50QXR0cmlidXRlczwvY29kZT4gYW5kIDxjb2RlPl9jdXJyZW50TmFtZXNwYWNlczwvY29kZT4KKyAgICAgKiBEZXB0aCBvZiB0aGUgY3VycmVudCBlbGVtZW50LiBUaGUgZmlyc3QgZWxlbWVudCBnZXRzIGRlcHRoPT0wLgorICAgICAqIEFsc28gdXNlZCBhcyB0aGUgaW5kZXggdG8ge0BsaW5rICNzY29wZXN9LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlcHRoID0gMDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyBpZiB7QGxpbmsgI19uYW1lZE5vZGVNYXB9IGlzIGFscmVhZHkgc3BsaXQgaW50bworICAgICAqIHtAbGluayAjX2N1cnJlbnRBdHRyaWJ1dGVzfSBhbmQge0BsaW5rIFNjb3BlI2N1cnJlbnROYW1lc3BhY2VzfS4KICAgICAgKi8KICAgICBib29sZWFuIF9uZWVkQXR0cmlidXRlc1NwbGl0OwogCkBAIC04NiwyNSArMTI3LDEwNiBAQAogICAgIGludCBfc3RhdGU7CiAKICAgICAvKioKLSAgICAgKiBEdW1teSBMb2NhdGlvbiBpbnN0YW5jZSByZXR1cm5lZCBpbiA8Y29kZT5nZXRMb2NhdGlvbjwvY29kZT4uCisgICAgICogTmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBvbiBvbmUgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEluc3RhbmNlcyBhcmUgcmV1c2VkLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExvY2F0aW9uIGR1bW15TG9jYXRpb24gPSBuZXcgTG9jYXRpb24oKSB7Ci0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcmFjdGVyT2Zmc2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNjb3BlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNjb3BlIGZvciB0aGUgcGFyZW50IGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBTY29wZSBwYXJlbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExpc3Qgb2YgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBleHRyYWN0ZWQgZnJvbSA8Y29kZT5fbmFtZWROb2RlTWFwPC9jb2RlPgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgRmluYWxBcnJheUxpc3Q8QXR0cj4gY3VycmVudE5hbWVzcGFjZXMgPSBuZXcgRmluYWxBcnJheUxpc3Q8QXR0cj4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkaXRpb25hbCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIG9idGFpbmVkIGFzIGEgcmVzdWx0IG9mICJmaXhpbmciIERPTSB0cmVlLAorICAgICAgICAgKiB3aGljaCB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBET00gdHJlZS4KKyAgICAgICAgICoKKyAgICAgICAgICogT25lIGVudHJ5IG9jY3VwaWVzIHR3byBzcGFjZXMgKHByZWZpeCBmb2xsb3dlZCBieSBVUkkuKQorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgRmluYWxBcnJheUxpc3Q8U3RyaW5nPiBhZGRpdGlvbmFsTmFtZXNwYWNlcyA9IG5ldyBGaW5hbEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgU2NvcGUoU2NvcGUgcGFyZW50KSB7CisgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgfQotICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgY3VycmVudE5hbWVzcGFjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGFkZGl0aW9uYWxOYW1lc3BhY2VzLmNsZWFyKCk7CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50TmFtZXNwYWNlcy5zaXplKCkrYWRkaXRpb25hbE5hbWVzcGFjZXMuc2l6ZSgpLzI7CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKKworICAgICAgICBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpbmRleCkgeworICAgICAgICAgICAgaW50IHN6ID0gY3VycmVudE5hbWVzcGFjZXMuc2l6ZSgpOworICAgICAgICAgICAgaWYoaW5kZXg8IHN6KSB7CisgICAgICAgICAgICAgICAgQXR0ciBhdHRyID0gY3VycmVudE5hbWVzcGFjZXMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUU5hbWUudmFsdWVPZihhdHRyLmdldE5vZGVOYW1lKCkpLmdldExvY2FsUGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmVxdWFscygieG1sbnMiKSA/IG51bGwgOiByZXN1bHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbmFsTmFtZXNwYWNlcy5nZXQoKGluZGV4LXN6KSoyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpbnQgc3ogPSBjdXJyZW50TmFtZXNwYWNlcy5zaXplKCk7CisgICAgICAgICAgICBpZihpbmRleDwgc3opIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE5hbWVzcGFjZXMuZ2V0KGluZGV4KS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbE5hbWVzcGFjZXMuZ2V0KChpbmRleC1zeikqMisxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBwcmVmaXggYm91bmQgdG8gdGhlIGdpdmVuIFVSSSwgb3IgbnVsbC4KKyAgICAgICAgICogVGhpcyBtZXRob2QgcmVjdXJzZXMgdG8gdGhlIHBhcmVudC4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zVXJpKSB7CisgICAgICAgICAgICBmb3IoIFNjb3BlIHNwPXRoaXM7IHNwIT1udWxsOyBzcD1zcC5wYXJlbnQgKSB7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaT1zcC5jdXJyZW50TmFtZXNwYWNlcy5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRQcmVmaXhGb3JBdHRyKHNwLmN1cnJlbnROYW1lc3BhY2VzLmdldChpKSxuc1VyaSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJlc3VsdCE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciggaW50IGk9c3AuYWRkaXRpb25hbE5hbWVzcGFjZXMuc2l6ZSgpLTI7IGk+PTA7IGktPTIgKQorICAgICAgICAgICAgICAgICAgICBpZihzcC5hZGRpdGlvbmFsTmFtZXNwYWNlcy5nZXQoaSsxKS5lcXVhbHMobnNVcmkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwLmFkZGl0aW9uYWxOYW1lc3BhY2VzLmdldChpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBVUkkgYm91bmQgYnkgdGhlIGdpdmVuIHByZWZpeC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByZWZpeAorICAgICAgICAgKiAgICAgIFByZWZpeCB0byBsb29rIHVwLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShATm90TnVsbCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICBTdHJpbmcgbnNEZWNsTmFtZSA9IHByZWZpeC5sZW5ndGgoKT09MCA/ICJ4bWxucyIgOiAieG1sbnM6IitwcmVmaXg7CisKKyAgICAgICAgICAgIGZvciggU2NvcGUgc3A9dGhpczsgc3AhPW51bGw7IHNwPXNwLnBhcmVudCApIHsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBpPXNwLmN1cnJlbnROYW1lc3BhY2VzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0ciBhID0gc3AuY3VycmVudE5hbWVzcGFjZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZihhLmdldE5vZGVOYW1lKCkuZXF1YWxzKG5zRGVjbE5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaT1zcC5hZGRpdGlvbmFsTmFtZXNwYWNlcy5zaXplKCktMjsgaT49MDsgaS09MiApCisgICAgICAgICAgICAgICAgICAgIGlmKHNwLmFkZGl0aW9uYWxOYW1lc3BhY2VzLmdldChpKS5lcXVhbHMocHJlZml4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcC5hZGRpdGlvbmFsTmFtZXNwYWNlcy5nZXQoaSsxKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgfTsKKyAgICB9CisKIAogICAgIHB1YmxpYyBET01TdHJlYW1SZWFkZXIoKSB7CiAgICAgfQpAQCAtMTE0LDIyICsyMzYsMzEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Tm9kZShOb2RlIG5vZGUpIHsKKyAgICAgICAgc2NvcGVzWzBdID0gbmV3IFNjb3BlKG51bGwpOworICAgICAgICBkZXB0aD0wOworCiAgICAgICAgIF9zdGFydCA9IF9jdXJyZW50ID0gbm9kZTsKICAgICAgICAgX3N0YXRlID0gU1RBUlRfRE9DVU1FTlQ7CiAgICAgICAgIC8vIHZlcmlmeURPTUludGVncml0eShub2RlKTsKICAgICAgICAgLy8gZGlzcGxheURPTShub2RlLCBTeXN0ZW0ub3V0KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKICAgICB9CiAKLQorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBjdXJyZW50IG5vZGUgaXMge0BsaW5rIEVsZW1lbnR9IHRvIGxvb2sgYXQgYXR0cmlidXRlIGxpc3QKKyAgICAgKiAod2hpY2ggY29udGFpbnMgYm90aCBucyBkZWNsIGFuZCBhdHRyaWJ1dGVzIGluIERPTSkgYW5kIHNwbGl0IHRoZW0KKyAgICAgKiB0byBhdHRyaWJ1dGVzLXByb3BlciBhbmQgbmFtZXNwYWNlIGRlY2xzLgorICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzcGxpdEF0dHJpYnV0ZXMoKSB7CiAgICAgICAgIGlmICghX25lZWRBdHRyaWJ1dGVzU3BsaXQpIHJldHVybjsKKyAgICAgICAgX25lZWRBdHRyaWJ1dGVzU3BsaXQgPSBmYWxzZTsKIAogICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYW5kIG5hbWVzcGFjZSBsaXN0cwogICAgICAgICBfY3VycmVudEF0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICAgICAgX2N1cnJlbnROYW1lc3BhY2VzLmNsZWFyKCk7CisKKyAgICAgICAgU2NvcGUgc2NvcGUgPSBhbGxvY2F0ZVNjb3BlKCk7CiAKICAgICAgICAgX25hbWVkTm9kZU1hcCA9IF9jdXJyZW50LmdldEF0dHJpYnV0ZXMoKTsKICAgICAgICAgaWYgKF9uYW1lZE5vZGVNYXAgIT0gbnVsbCkgewpAQCAtMTM4LDE0ICsyNjksNzEgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyIGF0dHIgPSAoQXR0cikgX25hbWVkTm9kZU1hcC5pdGVtKGkpOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikgfHwgYXR0ck5hbWUuZXF1YWxzKCJ4bWxucyIpKSB7ICAgICAvLyBOUyBkZWNsPwotICAgICAgICAgICAgICAgICAgICBfY3VycmVudE5hbWVzcGFjZXMuYWRkKGF0dHIpOworICAgICAgICAgICAgICAgICAgICBzY29wZS5jdXJyZW50TmFtZXNwYWNlcy5hZGQoYXR0cik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBfY3VycmVudEF0dHJpYnV0ZXMuYWRkKGF0dHIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBfbmVlZEF0dHJpYnV0ZXNTcGxpdCA9IGZhbHNlOworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IGFsbCB0aGUgbmFtZXNwYWNlcyB1c2VkIGluIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZXMgYXJlIGluZGVlZCBhdmFpbGFibGUKKyAgICAgICAgZW5zdXJlTnMoX2N1cnJlbnQpOworICAgICAgICBmb3IoIGludCBpPV9jdXJyZW50QXR0cmlidXRlcy5zaXplKCktMTsgaT49MDsgaS0tICkgeworICAgICAgICAgICAgQXR0ciBhID0gX2N1cnJlbnRBdHRyaWJ1dGVzLmdldChpKTsKKyAgICAgICAgICAgIGVuc3VyZU5zKGEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViLXJvdXRpbmUgb2Yge0BsaW5rICNzcGxpdEF0dHJpYnV0ZXMoKX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBNYWtlcyBzdXJlIHRoYXQgdGhlIG5hbWVzcGFjZSBVUkkvcHJlZml4IHVzZWQgaW4gdGhlIGdpdmVuIG5vZGUgaXMgYXZhaWxhYmxlLAorICAgICAqIGFuZCBpZiBub3QsIGRlY2xhcmUgaXQgb24gdGhlIGN1cnJlbnQgc2NvcGUgdG8gImZpeCIgaXQuCisgICAgICoKKyAgICAgKiBJdCdzIG9mdGVuIGNvbW1vbiB0byBjcmVhdGUgRE9NIHRyZWVzIHdpdGhvdXQgcHV0dGluZyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLAorICAgICAqIGFuZCB0aGlzIG1ha2VzIHN1cmUgdGhhdCBzdWNoIERPTSB0cmVlIHdpbGwgYmUgcHJvcGVybHkgbWFyc2hhbGxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTnMoTm9kZSBuKSB7CisgICAgICAgIFN0cmluZyBwcmVmaXggPSBmaXhOdWxsKG4uZ2V0UHJlZml4KCkpOworICAgICAgICBTdHJpbmcgdXJpID0gZml4TnVsbChuLmdldE5hbWVzcGFjZVVSSSgpKTsKKworICAgICAgICBTY29wZSBzY29wZSA9IHNjb3Blc1tkZXB0aF07CisKKyAgICAgICAgU3RyaW5nIGN1cnJlbnRVcmkgPSBzY29wZS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKKworICAgICAgICBpZihwcmVmaXgubGVuZ3RoKCk9PTApIHsKKyAgICAgICAgICAgIGN1cnJlbnRVcmkgPSBmaXhOdWxsKGN1cnJlbnRVcmkpOworICAgICAgICAgICAgaWYoY3VycmVudFVyaS5lcXVhbHModXJpKSkKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIGRlY2xhcmVkIGNvcnJlY3RseQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYoY3VycmVudFVyaSE9bnVsbCAmJiBjdXJyZW50VXJpLmVxdWFscyh1cmkpKQorICAgICAgICAgICAgICAgIHJldHVybjsgLy8gZGVjbGFyZWQgY29ycmVjdGx5CisgICAgICAgIH0KKworICAgICAgICAvLyBuZWVkcyB0byBiZSBkZWNsYXJlZAorCisgICAgICAgIHNjb3BlLmFkZGl0aW9uYWxOYW1lc3BhY2VzLmFkZChwcmVmaXgpOworICAgICAgICBzY29wZS5hZGRpdGlvbmFsTmFtZXNwYWNlcy5hZGQodXJpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBuZXcge0BsaW5rIFNjb3BlfSBmb3Ige0BsaW5rICNzcGxpdEF0dHJpYnV0ZXMoKX0uCisgICAgICovCisgICAgcHJpdmF0ZSBTY29wZSBhbGxvY2F0ZVNjb3BlKCkgeworICAgICAgICBpZihzY29wZXMubGVuZ3RoPT1kZXB0aCkgeworICAgICAgICAgICAgU2NvcGVbXSBuZXdCdWYgPSBuZXcgU2NvcGVbc2NvcGVzLmxlbmd0aCoyXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2NvcGVzLDAsbmV3QnVmLDAsc2NvcGVzLmxlbmd0aCk7CisgICAgICAgICAgICBzY29wZXMgPSBuZXdCdWY7CisgICAgICAgIH0KKyAgICAgICAgU2NvcGUgc2NvcGUgPSBzY29wZXNbZGVwdGhdOworICAgICAgICBpZihzY29wZT09bnVsbCkgeworICAgICAgICAgICAgc2NvcGUgPSBzY29wZXNbZGVwdGhdID0gbmV3IFNjb3BlKHNjb3Blc1tkZXB0aC0xXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzY29wZS5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY29wZTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewpAQCAtMTgyLDggKzM3MCw3IEBACiAgICAgICAgICAgICBpZiAobG9jYWxOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYXR0ci5nZXRQcmVmaXgoKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSAhPSBudWxsID8gdXJpIDogIiIsIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShmaXhOdWxsKHVyaSksIGxvY2FsTmFtZSwgZml4TnVsbChwcmVmaXgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZS52YWx1ZU9mKGF0dHIuZ2V0Tm9kZU5hbWUoKSk7CkBAIC0xOTYsNyArMzgzLDcgQEAKICAgICAgICAgaWYgKF9zdGF0ZSA9PSBTVEFSVF9FTEVNRU5UKSB7CiAgICAgICAgICAgICBzcGxpdEF0dHJpYnV0ZXMoKTsKICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBfY3VycmVudEF0dHJpYnV0ZXMuZ2V0KGluZGV4KS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIHJldHVybiB1cmkgIT0gbnVsbCA/IHVyaSA6ICIiOworICAgICAgICAgICAgcmV0dXJuIGZpeE51bGwodXJpKTsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJET01TdHJlYW1SZWFkZXI6IGdldEF0dHJpYnV0ZU5hbWVzcGFjZSgpIGNhbGxlZCBpbiBpbGxlZ2FsIHN0YXRlIik7CiAgICAgfQpAQCAtMjA1LDcgKzM5Miw3IEBACiAgICAgICAgIGlmIChfc3RhdGUgPT0gU1RBUlRfRUxFTUVOVCkgewogICAgICAgICAgICAgc3BsaXRBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gX2N1cnJlbnRBdHRyaWJ1dGVzLmdldChpbmRleCkuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIjsKKyAgICAgICAgICAgIHJldHVybiBmaXhOdWxsKHByZWZpeCk7CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRE9NU3RyZWFtUmVhZGVyOiBnZXRBdHRyaWJ1dGVQcmVmaXgoKSBjYWxsZWQgaW4gaWxsZWdhbCBzdGF0ZSIpOwogICAgIH0KQEAgLTI2OCw4ICs0NTUsOCBAQAogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJET01TdHJlYW1SZWFkZXI6IGdldEF0dHJpYnV0ZVZhbHVlKCkgY2FsbGVkIGluIGlsbGVnYWwgc3RhdGUiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGR1bW15TG9jYXRpb247CisgICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gRHVtbXlMb2NhdGlvbi5JTlNUQU5DRTsKICAgICB9CiAKICAgICAvKioKQEAgLTI4MSw4ICs0NjgsNyBAQAogICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IF9jdXJyZW50LmdldFByZWZpeCgpOwogICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBfY3VycmVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSAhPSBudWxsID8gdXJpIDogIiIsIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShmaXhOdWxsKHVyaSksIGxvY2FsTmFtZSwgZml4TnVsbChwcmVmaXgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZS52YWx1ZU9mKF9jdXJyZW50LmdldE5vZGVOYW1lKCkpOwpAQCAtMjk1LDQ0ICs0ODEsNDAgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGUgY3VycmVudCBzdGF0ZSB0byBzZWUgaWYgd2UgY2FuIHJldHVybiB0aGUgc2NvcGUsIGFuZCBkbyBzbworICAgICAqIGlmIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogVXNlZCB0byBpbXBsZW1lbnQgYSBidW5jaCBvZiBTdEFYIEFQSSBtZXRob2RzIHRoYXQgaGF2ZSB0aGUgc2FtZSB1c2FnZSByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNjb3BlIGdldENoZWNrZWRTY29wZSgpIHsKICAgICAgICAgaWYgKF9zdGF0ZSA9PSBTVEFSVF9FTEVNRU5UIHx8IF9zdGF0ZSA9PSBFTkRfRUxFTUVOVCkgewogICAgICAgICAgICAgc3BsaXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gX2N1cnJlbnROYW1lc3BhY2VzLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZXNbZGVwdGhdOwogICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRPTVN0cmVhbVJlYWRlcjogZ2V0TmFtZXNwYWNlQ291bnQoKSBjYWxsZWQgaW4gaWxsZWdhbCBzdGF0ZSIpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJET01TdHJlYW1SZWFkZXI6IG5laXRoZXIgb24gU1RBUlRfRUxFTUVOVCBub3IgRU5EX0VMRU1FTlQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFNjb3BlKCkuZ2V0TmFtZXNwYWNlQ291bnQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKF9zdGF0ZSA9PSBTVEFSVF9FTEVNRU5UIHx8IF9zdGF0ZSA9PSBFTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgc3BsaXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkU2NvcGUoKS5nZXROYW1lc3BhY2VQcmVmaXgoaW5kZXgpOworICAgIH0KIAotICAgICAgICAgICAgQXR0ciBhdHRyID0gX2N1cnJlbnROYW1lc3BhY2VzLmdldChpbmRleCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFFOYW1lLnZhbHVlT2YoYXR0ci5nZXROb2RlTmFtZSgpKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuZXF1YWxzKCJ4bWxucyIpID8gbnVsbCA6IHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJET01TdHJlYW1SZWFkZXI6IGdldE5hbWVzcGFjZVByZWZpeCgpIGNhbGxlZCBpbiBpbGxlZ2FsIHN0YXRlIik7CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkU2NvcGUoKS5nZXROYW1lc3BhY2VVUkkoaW5kZXgpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewogICAgICAgICBpZiAoX3N0YXRlID09IFNUQVJUX0VMRU1FTlQgfHwgX3N0YXRlID09IEVORF9FTEVNRU5UKSB7CiAgICAgICAgICAgICBTdHJpbmcgdXJpID0gX2N1cnJlbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICByZXR1cm4gdXJpICE9IG51bGwgPyB1cmkgOiAiIjsKKyAgICAgICAgICAgIHJldHVybiBmaXhOdWxsKHVyaSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChfc3RhdGUgPT0gU1RBUlRfRUxFTUVOVCB8fCBfc3RhdGUgPT0gRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgIHNwbGl0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50TmFtZXNwYWNlcy5nZXQoaW5kZXgpLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRE9NU3RyZWFtUmVhZGVyOiBnZXROYW1lc3BhY2VVUkkoaW50KSBjYWxsZWQgaW4gaWxsZWdhbCBzdGF0ZSIpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBwYXJ0aWN1bGFybHkgZmFzdCwgYnV0IHNob3VsZG4ndCBiZSBjYWxsZWQgdmVyeQogICAgICAqIG9mdGVuLiBJZiB3ZSBzdGFydCB0byB1c2UgaXQgbW9yZSwgd2Ugc2hvdWxkIGtlZXAgdHJhY2sgb2YgdGhlCkBAIC0zNDgsMzAgKzUzMCwyNCBAQAogICAgICAgICBlbHNlIGlmIChwcmVmaXguZXF1YWxzKCJ4bWxucyIpKSB7CiAgICAgICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGludCB0eXBlOwogCi0gICAgICAgICAgICAvLyBGaW5kIG5lYXJlc3QgZWxlbWVudCBub2RlCi0gICAgICAgICAgICBOb2RlIG5vZGUgPSBfY3VycmVudDsKLSAgICAgICAgICAgIHdoaWxlICgodHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKSkgIT0gRE9DVU1FTlRfTk9ERQotICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IEVMRU1FTlRfTk9ERSkgewotICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgc2NvcGVzCisgICAgICAgIHNwbGl0QXR0cmlidXRlcygpOworICAgICAgICBTdHJpbmcgbnNVcmkgPSBzY29wZXNbZGVwdGhdLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOworICAgICAgICBpZihuc1VyaSE9bnVsbCkgICAgcmV0dXJuIG5zVXJpOwogCi0gICAgICAgICAgICBib29sZWFuIGlzRGVmYXVsdCA9IChwcmVmaXgubGVuZ3RoKCkgPT0gMCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRE9DVU1FTlRfTk9ERSkgewotICAgICAgICAgICAgICAgIC8vIElzIG5zIGRlY2xhcmF0aW9uIG9uIHRoaXMgZWxlbWVudD8KLSAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgbmFtZWROb2RlTWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyID0gaXNEZWZhdWx0ID8gKEF0dHIpIG5hbWVkTm9kZU1hcC5nZXROYW1lZEl0ZW0oInhtbG5zIikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdHRyKSBuYW1lZE5vZGVNYXAuZ2V0TmFtZWRJdGVtKCJ4bWxuczoiICsgcHJlZml4KTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAvLyB0aGVuIGFuY2VzdG9ycyBhYm92ZSBzdGFydCBub2RlCisgICAgICAgIE5vZGUgbm9kZSA9IGZpbmRSb290RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgbnNEZWNsTmFtZSA9IHByZWZpeC5sZW5ndGgoKT09MCA/ICJ4bWxucyIgOiAieG1sbnM6IitwcmVmaXg7CisgICAgICAgIHdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRE9DVU1FTlRfTk9ERSkgeworICAgICAgICAgICAgLy8gSXMgbnMgZGVjbGFyYXRpb24gb24gdGhpcyBlbGVtZW50PworICAgICAgICAgICAgTmFtZWROb2RlTWFwIG5hbWVkTm9kZU1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIG5hbWVkTm9kZU1hcC5nZXROYW1lZEl0ZW0obnNEZWNsTmFtZSk7CisgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLmdldFZhbHVlKCk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zVXJpKSB7CkBAIC0zODQsMzcgKzU2MCw2MSBAQAogICAgICAgICBlbHNlIGlmIChuc1VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIikpIHsKICAgICAgICAgICAgIHJldHVybiAieG1sbnMiOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaW50IHR5cGU7CiAKLSAgICAgICAgICAgIC8vIEZpbmQgbmVhcmVzdCBlbGVtZW50IG5vZGUKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IF9jdXJyZW50OwotICAgICAgICAgICAgd2hpbGUgKCh0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpKSAhPSBET0NVTUVOVF9OT0RFCi0gICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gRUxFTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOworICAgICAgICAvLyBjaGVjayBzY29wZXMKKyAgICAgICAgc3BsaXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIFN0cmluZyBwcmVmaXggPSBzY29wZXNbZGVwdGhdLmdldFByZWZpeChuc1VyaSk7CisgICAgICAgIGlmKHByZWZpeCE9bnVsbCkgICAgcmV0dXJuIHByZWZpeDsKKworICAgICAgICAvLyB0aGVuIGFuY2VzdG9ycyBhYm92ZSBzdGFydCBub2RlCisgICAgICAgIE5vZGUgbm9kZSA9IGZpbmRSb290RWxlbWVudCgpOworCisgICAgICAgIHdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRE9DVU1FTlRfTk9ERSkgeworICAgICAgICAgICAgLy8gSXMgbnMgZGVjbGFyYXRpb24gb24gdGhpcyBlbGVtZW50PworICAgICAgICAgICAgTmFtZWROb2RlTWFwIG5hbWVkTm9kZU1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgZm9yKCBpbnQgaT1uYW1lZE5vZGVNYXAuZ2V0TGVuZ3RoKCktMTsgaT49MDsgaS0tICkgeworICAgICAgICAgICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKW5hbWVkTm9kZU1hcC5pdGVtKGkpOworICAgICAgICAgICAgICAgIHByZWZpeCA9IGdldFByZWZpeEZvckF0dHIoYXR0cixuc1VyaSk7CisgICAgICAgICAgICAgICAgaWYocHJlZml4IT1udWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAobm9kZS5nZXROb2RlVHlwZSgpICE9IERPQ1VNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICAvLyBJcyBucyBkZWNsYXJhdGlvbiBvbiB0aGlzIGVsZW1lbnQ/Ci0gICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIG5hbWVkTm9kZU1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGk9bmFtZWROb2RlTWFwLmdldExlbmd0aCgpLTE7IGk+PTA7IGktLSApIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpbmFtZWROb2RlTWFwLml0ZW0oaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikgfHwgYXR0ck5hbWUuZXF1YWxzKCJ4bWxucyIpKSB7ICAgICAvLyBOUyBkZWNsPwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXR0ci5nZXRWYWx1ZSgpLmVxdWFscyhuc1VyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdHRyTmFtZS5lcXVhbHMoInhtbG5zIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGxvY2FsTmFtZSAhPSBudWxsKSA/IGxvY2FsTmFtZSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lLnZhbHVlT2YoYXR0ck5hbWUpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwogICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIHRoZSByb290IGVsZW1lbnQgbm9kZSBvZiB0aGUgdHJhdmVyc2FsLgorICAgICAqLworICAgIHByaXZhdGUgTm9kZSBmaW5kUm9vdEVsZW1lbnQoKSB7CisgICAgICAgIGludCB0eXBlOworCisgICAgICAgIE5vZGUgbm9kZSA9IF9zdGFydDsKKyAgICAgICAgd2hpbGUgKCh0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpKSAhPSBET0NVTUVOVF9OT0RFCisgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBFTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIFVSSSwKKyAgICAgKiByZXR1cm4gaXRzIHByZWZpeC4gT3RoZXJ3aXNlIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByZWZpeEZvckF0dHIoQXR0ciBhdHRyLCBTdHJpbmcgbnNVcmkpIHsKKyAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOworICAgICAgICBpZiAoIWF0dHJOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpICYmICFhdHRyTmFtZS5lcXVhbHMoInhtbG5zIikpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgLy8gbm90IG5zZGVjbAorCisgICAgICAgIGlmKGF0dHIuZ2V0VmFsdWUoKS5lcXVhbHMobnNVcmkpKSB7CisgICAgICAgICAgICBpZihhdHRyTmFtZS5lcXVhbHMoInhtbG5zIikpCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gKGxvY2FsTmFtZSAhPSBudWxsKSA/IGxvY2FsTmFtZSA6CisgICAgICAgICAgICAgICAgUU5hbWUudmFsdWVPZihhdHRyTmFtZSkuZ2V0TG9jYWxQYXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJlZml4ZXMoU3RyaW5nIG5zVXJpKSB7CkBAIC00NDIsNyArNjQyLDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKICAgICAgICAgaWYgKF9zdGF0ZSA9PSBTVEFSVF9FTEVNRU5UIHx8IF9zdGF0ZSA9PSBFTkRfRUxFTUVOVCkgewogICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IF9jdXJyZW50LmdldFByZWZpeCgpOwotICAgICAgICAgICAgcmV0dXJuIHByZWZpeCAhPSBudWxsID8gcHJlZml4IDogIiI7CisgICAgICAgICAgICByZXR1cm4gZml4TnVsbChwcmVmaXgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTQ1MiwxMCArNjUyLDEwIEBACiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoX3N0YXRlID09IENIQVJBQ1RFUlMgfHwgX3N0YXRlID09IENEQVRBIHx8IF9zdGF0ZSA9PSBDT01NRU5UIHx8Ci0gICAgICAgICAgICAgICAgX3N0YXRlID09IEVOVElUWV9SRUZFUkVOQ0UpIHsKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBDSEFSQUNURVJTKQorICAgICAgICAgICAgcmV0dXJuIHdob2xlVGV4dDsKKyAgICAgICAgaWYoX3N0YXRlID09IENEQVRBIHx8IF9zdGF0ZSA9PSBDT01NRU5UIHx8IF9zdGF0ZSA9PSBFTlRJVFlfUkVGRVJFTkNFKQogICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50LmdldE5vZGVWYWx1ZSgpOwotICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRPTVN0cmVhbVJlYWRlcjogZ2V0VGV4dExlbmd0aCgpIGNhbGxlZCBpbiBpbGxlZ2FsIHN0YXRlIik7CiAgICAgfQogCkBAIC00NjQsMjQgKzY2NCwyMCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IHNvdXJjZVN0YXJ0LCBjaGFyW10gdGFyZ2V0LCBpbnQgdGFyZ2V0U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0TGVuZ3RoKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNoYXJbXSB0ZXh0ID0gZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0ZXh0LCBzb3VyY2VTdGFydCwgdGFyZ2V0LCB0YXJnZXRTdGFydCwgdGFyZ2V0TGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIE1hdGgubWluKHRhcmdldExlbmd0aCwgdGV4dC5sZW5ndGggLSBzb3VyY2VTdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0TGVuZ3RoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRUZXh0KCk7CisgICAgICAgIGludCBjb3BpZWRTaXplID0gTWF0aC5taW4odGFyZ2V0TGVuZ3RoLCB0ZXh0Lmxlbmd0aCgpIC0gc291cmNlU3RhcnQpOworICAgICAgICB0ZXh0LmdldENoYXJzKHNvdXJjZVN0YXJ0LCBzb3VyY2VTdGFydCArIGNvcGllZFNpemUsIHRhcmdldCwgdGFyZ2V0U3RhcnQpOworCisgICAgICAgIHJldHVybiBjb3BpZWRTaXplOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgaWYgKF9zdGF0ZSA9PSBDSEFSQUNURVJTIHx8IF9zdGF0ZSA9PSBDREFUQSB8fCBfc3RhdGUgPT0gQ09NTUVOVCB8fAotICAgICAgICAgICAgICAgIF9zdGF0ZSA9PSBFTlRJVFlfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICByZXR1cm4gX2N1cnJlbnQuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRE9NU3RyZWFtUmVhZGVyOiBnZXRUZXh0TGVuZ3RoKCkgY2FsbGVkIGluIGlsbGVnYWwgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIGdldFRleHQoKS5sZW5ndGgoKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgaWYgKF9zdGF0ZSA9PSBDSEFSQUNURVJTIHx8IF9zdGF0ZSA9PSBDREFUQSB8fCBfc3RhdGUgPT0gQ09NTUVOVCB8fAotICAgICAgICAgICAgICAgIF9zdGF0ZSA9PSBFTlRJVFlfUkVGRVJFTkNFKSB7CisgICAgICAgIGlmIChfc3RhdGUgPT0gQ0hBUkFDVEVSUyB8fCBfc3RhdGUgPT0gQ0RBVEEgfHwgX3N0YXRlID09IENPTU1FTlQgfHwgX3N0YXRlID09IEVOVElUWV9SRUZFUkVOQ0UpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRPTVN0cmVhbVJlYWRlcjogZ2V0VGV4dFN0YXJ0KCkgY2FsbGVkIGluIGlsbGVnYWwgc3RhdGUiKTsKQEAgLTUwMCw5ICs2OTYsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIGlmIChfc3RhdGUgPT0gQ0hBUkFDVEVSUyB8fCBfc3RhdGUgPT0gQ0RBVEEgfHwgX3N0YXRlID09IENPTU1FTlQgfHwKLSAgICAgICAgICAgICAgICBfc3RhdGUgPT0gRU5USVRZX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgcmV0dXJuIChfY3VycmVudC5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBDSEFSQUNURVJTIHx8IF9zdGF0ZSA9PSBDREFUQSB8fCBfc3RhdGUgPT0gQ09NTUVOVCB8fCBfc3RhdGUgPT0gRU5USVRZX1JFRkVSRU5DRSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC01MjgsMTAgKzcyMyw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICBmaW5hbCBpbnQgbm9kZVR5cGUgPSBfY3VycmVudC5nZXROb2RlVHlwZSgpOwotICAgICAgICBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUgfHwgbm9kZVR5cGUgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKLSAgICAgICAgICAgIHJldHVybiAoX2N1cnJlbnQuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApOwotICAgICAgICB9CisgICAgICAgIGlmIChfc3RhdGUgPT0gQ0hBUkFDVEVSUyB8fCBfc3RhdGUgPT0gQ0RBVEEpCisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKT09MDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNTU4LDcgKzc1MSwyNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgaW50IHIgPSBfbmV4dCgpOworICAgICAgICAgICAgaWYociE9Q0hBUkFDVEVSUykgICByZXR1cm4gcjsKKworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGN1cnJlbnRseSBhdCB0ZXh0IG5vZGUsIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgYSBtZWFuaW5nZnVsIHRleHQgbm9kZS4KKyAgICAgICAgICAgIE5vZGUgcHJldiA9IF9jdXJyZW50LmdldFByZXZpb3VzU2libGluZygpOworICAgICAgICAgICAgaWYocHJldiE9bnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCk9PU5vZGUuVEVYVF9OT0RFKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIG5vcGUuIHRoaXMgaXMganVzdCBhIGNvbnRpbnVhdGlvbiBvZiBwcmV2aW91cyB0ZXh0IHRoYXQgc2hvdWxkIGJlIGludmlzaWJsZQorCisgICAgICAgICAgICBUZXh0IHQgPSAoVGV4dClfY3VycmVudDsKKyAgICAgICAgICAgIHdob2xlVGV4dCA9IHQuZ2V0V2hvbGVUZXh0KCk7CisgICAgICAgICAgICBpZih3aG9sZVRleHQubGVuZ3RoKCk9PTApCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgLy8gbm9wZS4gdGhpcyBpcyBlbXB0eSB0ZXh0LgorICAgICAgICAgICAgcmV0dXJuIENIQVJBQ1RFUlM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBfbmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewogICAgICAgICBOb2RlIGNoaWxkOwogCiAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgYXR0cmlidXRlcyBzdGlsbCBuZWVkIHByb2Nlc3NpbmcKQEAgLTU4MiwxMSArNzkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfc3RhdGUgPSBtYXBOb2RlVHlwZVRvU3RhdGUoX2N1cnJlbnQuZ2V0Tm9kZVR5cGUoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFNBQUogdHJlZSBtYXkgY29udGFpbiBtdWx0aXBsZSBhZGphY2VudCB0ZXh0IG5vZGVzLiAgTm9ybWFsaXphdGlvbgotICAgICAgICAgICAgICAgICAqIGlzIHZlcnkgZXhwZW5zaXZlLCBzbyB3ZSBzaG91bGQgdGhpbmsgYWJvdXQgY2hhbmdpbmcgU0FBSiBpbnN0ZWFkIQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIF9jdXJyZW50Lm5vcm1hbGl6ZSgpOworICAgICAgICAgICAgICAgIGRlcHRoKys7CiAKICAgICAgICAgICAgICAgICBjaGlsZCA9IF9jdXJyZW50LmdldEZpcnN0Q2hpbGQoKTsKICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgewpAQCAtNTk2LDEyICs4MDMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnQgPSBjaGlsZDsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfc3RhdGUgPSBtYXBOb2RlVHlwZVRvU3RhdGUoX2N1cnJlbnQuZ2V0Tm9kZVR5cGUoKSkpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlQ6CisgICAgICAgICAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggbmV4dAogICAgICAgICAgICAgY2FzZSBDSEFSQUNURVJTOgogICAgICAgICAgICAgY2FzZSBDT01NRU5UOgogICAgICAgICAgICAgY2FzZSBDREFUQToKICAgICAgICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRToKICAgICAgICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKLSAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlQ6CiAgICAgICAgICAgICAgICAgLy8gSWYgYXQgdGhlIGVuZCBvZiB0aGlzIGZyYWdtZW50LCB0aGVuIHRlcm1pbmF0ZSB0cmF2ZXJzYWwKICAgICAgICAgICAgICAgICBpZiAoX2N1cnJlbnQgPT0gX3N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX3N0YXRlID0gRU5EX0RPQ1VNRU5UKTsKQEAgLTYzOCw3ICs4NDcsNyBAQAogICAgICAgICAgICAgZXZlbnRUeXBlID0gbmV4dCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChldmVudFR5cGUgIT0gU1RBUlRfRUxFTUVOVCAmJiBldmVudFR5cGUgIT0gRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIkRPTVN0cmVhbVJlYWRlcjogRXhwZWN0ZWQgc3RhcnQgb3IgZW5kIHRhZyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbjIoIkRPTVN0cmVhbVJlYWRlcjogRXhwZWN0ZWQgc3RhcnQgb3IgZW5kIHRhZyIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBldmVudFR5cGU7CiAgICAgfQpAQCAtNjQ3LDEzICs4NTYsMTMgQEAKICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAodHlwZSAhPSBfc3RhdGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIkRPTVN0cmVhbVJlYWRlcjogUmVxdWlyZWQgZXZlbnQgdHlwZSBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24yKCJET01TdHJlYW1SZWFkZXI6IFJlcXVpcmVkIGV2ZW50IHR5cGUgbm90IGZvdW5kIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmICFuYW1lc3BhY2VVUkkuZXF1YWxzKGdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiRE9NU3RyZWFtUmVhZGVyOiBSZXF1aXJlZCBuYW1lc3BhY2VVUkkgbm90IGZvdW5kIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uMigiRE9NU3RyZWFtUmVhZGVyOiBSZXF1aXJlZCBuYW1lc3BhY2VVUkkgbm90IGZvdW5kIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmICFsb2NhbE5hbWUuZXF1YWxzKGdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiRE9NU3RyZWFtUmVhZGVyOiBSZXF1aXJlZCBsb2NhbE5hbWUgbm90IGZvdW5kIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uMigiRE9NU3RyZWFtUmVhZGVyOiBSZXF1aXJlZCBsb2NhbE5hbWUgbm90IGZvdW5kIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY2OCw5ICs4NzcsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGlzcGxheURPTShOb2RlIG5vZGUsIGphdmEuaW8uT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09XG4iKTsKLSAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0oCi0gICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZShub2RlKSwKLSAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0KG9zdHJlYW0pKTsKKyAgICAgICAgICAgIFhtbFV0aWwubmV3VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgbmV3IERPTVNvdXJjZShub2RlKSwgbmV3IFN0cmVhbVJlc3VsdChvc3RyZWFtKSk7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuPT09PVxuIik7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CkBAIC02OTQsNyArOTAyLDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQVRUUklCVVRFX05PREUpIHJldHVybjsKIAotICAgICAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICB2ZXJpZnlET01JbnRlZ3JpdHkoYXR0cnMuaXRlbShpKSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzA2LDIxICs5MTQsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzYW1wbGUgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48ZW52OkVudmVsb3BlIHhtbG5zOmVudj0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nPjxlbnY6Qm9keT48ZW52OkZhdWx0PjxmYXVsdGNvZGU+ZW52OlNlcnZlcjwvZmF1bHRjb2RlPjxmYXVsdHN0cmluZz5JbnRlcm5hbCBzZXJ2ZXIgZXJyb3I8L2ZhdWx0c3RyaW5nPjwvZW52OkZhdWx0PjwvZW52OkJvZHk+PC9lbnY6RW52ZWxvcGU+IjsKLSAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBkZCA9IGRiLnBhcnNlKG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKHNhbXBsZS5nZXRCeXRlcygiVVRGLTgiKSkpOwogCi0gICAgICAgIERPTVN0cmVhbVJlYWRlciBkc3IgPSBuZXcgRE9NU3RyZWFtUmVhZGVyKGRkKTsKLSAgICAgICAgd2hpbGUgKGRzci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZHNyLm5leHQoKSA9ICIgKyBkc3IubmV4dCgpKTsKLSAgICAgICAgICAgIGlmIChkc3IuZ2V0RXZlbnRUeXBlKCkgPT0gU1RBUlRfRUxFTUVOVCB8fCBkc3IuZ2V0RXZlbnRUeXBlKCkgPT0gRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRzci5nZXROYW1lID0gIiArIGRzci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChkc3IuZ2V0RXZlbnRUeXBlKCkgPT0gU1RBUlRfRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkc3IuZ2V0QXR0cmlidXRlQ291bnQoKSA9ICIgKyBkc3IuZ2V0QXR0cmlidXRlQ291bnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZml4TnVsbChTdHJpbmcgcykgeworICAgICAgICBpZihzPT1udWxsKSByZXR1cm4gIiI7CisgICAgICAgIGVsc2UgICAgICAgIHJldHVybiBzOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9QcmVmaXhGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvUHJlZml4RmFjdG9yeS5qYXZhCmluZGV4IGNhZmNjNjMuLjI5ZDllYTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9QcmVmaXhGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1ByZWZpeEZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvUHJlZml4RmFjdG9yeUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9QcmVmaXhGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDMxMTAzYjMuLjEzOGViZTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9QcmVmaXhGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9QcmVmaXhGYWN0b3J5SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9Tb3VyY2VSZWFkZXJGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvU291cmNlUmVhZGVyRmFjdG9yeS5qYXZhCmluZGV4IDQ5YWY1ODYuLjQwYjAyYjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9Tb3VyY2VSZWFkZXJGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1NvdXJjZVJlYWRlckZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyMCArMjUsMjIgQEAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmc7CiAKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkZhc3RJbmZvc2V0UmVmbGVjdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5GYXN0SW5mb3NldFV0aWw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKIAotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLQoraW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmV0LlVSTDsKIAogLyoqCiAgKiBAYXV0aG9yIFNhbnRpYWdvLlBlcmljYXNHZWVydHNlbkBzdW4uY29tCkBAIC00NiwyMCArNDgsMzMgQEAKIHB1YmxpYyBjbGFzcyBTb3VyY2VSZWFkZXJGYWN0b3J5IHsKIAogICAgIC8qKgotICAgICAqIFRocmVhZCB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIERPTVN0cmVhbVJlYWRlciBmb3IgY3VycmVudCB0aHJlYWQuCisgICAgICogRkkgRmFzdEluZm9zZXRTb3VyY2UgY2xhc3MuCiAgICAgICovCi0gICAgc3RhdGljIFRocmVhZExvY2FsPERPTVN0cmVhbVJlYWRlcj4gZG9tU3RyZWFtUmVhZGVyID0KLSAgICAgICAgbmV3IFRocmVhZExvY2FsPERPTVN0cmVhbVJlYWRlcj4oKTsKKyAgICBzdGF0aWMgQ2xhc3MgZmFzdEluZm9zZXRTb3VyY2VDbGFzczsKIAotICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIGNyZWF0ZVNvdXJjZVJlYWRlcihTb3VyY2Ugc291cmNlLAotICAgICAgICBib29sZWFuIHJlamVjdERURHMpCi0gICAgeworICAgIC8qKgorICAgICAqIEZJIDxjb2RlPlN0QVhEb2N1bWVudFNlcmlhbGl6ZXIuc2V0RW5jb2RpbmcoKTwvY29kZT4gbWV0aG9kIHZpYSByZWZsZWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBNZXRob2QgZmFzdEluZm9zZXRTb3VyY2VfZ2V0SW5wdXRTdHJlYW07CisKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBVc2UgcmVmbGVjdGlvbiB0byBhdm9pZCBzdGF0aWMgZGVwZW5kZW5jeSB3aXRoIEZJIGphcgorICAgICAgICB0cnkgeworICAgICAgICAgICAgZmFzdEluZm9zZXRTb3VyY2VDbGFzcyA9CisgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0U291cmNlIik7CisgICAgICAgICAgICBmYXN0SW5mb3NldFNvdXJjZV9nZXRJbnB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgZmFzdEluZm9zZXRTb3VyY2VDbGFzcy5nZXRNZXRob2QoImdldElucHV0U3RyZWFtIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYXN0SW5mb3NldFNvdXJjZUNsYXNzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIGNyZWF0ZVNvdXJjZVJlYWRlcihTb3VyY2Ugc291cmNlLCBib29sZWFuIHJlamVjdERURHMpIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZVNvdXJjZVJlYWRlcihzb3VyY2UsIHJlamVjdERURHMsIG51bGwpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIGNyZWF0ZVNvdXJjZVJlYWRlcihTb3VyY2Ugc291cmNlLAotICAgICAgICBib29sZWFuIHJlamVjdERURHMsIFN0cmluZyBjaGFyc2V0TmFtZSkKLSAgICB7CisgICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlU291cmNlUmVhZGVyKFNvdXJjZSBzb3VyY2UsIGJvb2xlYW4gcmVqZWN0RFREcywgU3RyaW5nIGNoYXJzZXROYW1lKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3RyZWFtU291cmNlKSB7CiAgICAgICAgICAgICAgICAgU3RyZWFtU291cmNlIHN0cmVhbVNvdXJjZSA9IChTdHJlYW1Tb3VyY2UpIHNvdXJjZTsKQEAgLTY4LDM1ICs4MywzMiBAQAogICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdyYXAgaW5wdXQgc3RyZWFtIGluIFJlYWRlciBpZiBjaGFyc2V0IGlzIHNwZWNpZmllZAogICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnNldE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgY2hhcnNldE5hbWUpLCByZWplY3REVERzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0U3lzdGVtSWQoKSwgbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBjaGFyc2V0TmFtZSksIHJlamVjdERURHMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdERURHMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRTeXN0ZW1JZCgpLCBpcywgcmVqZWN0RFREcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBzdHJlYW1Tb3VyY2UuZ2V0UmVhZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3REVERzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0U3lzdGVtSWQoKSwgcmVhZGVyLCByZWplY3REVERzKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInNvdXJjZVJlYWRlci5pbnZhbGlkU291cmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBzb3VyY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFN5c3RlbUlkKCksIG5ldyBVUkwoc291cmNlLmdldFN5c3RlbUlkKCkpLm9wZW5TdHJlYW0oKSwgcmVqZWN0RFREcyApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoRmFzdEluZm9zZXRSZWZsZWN0aW9uLmlzRmFzdEluZm9zZXRTb3VyY2Uoc291cmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZUZJU3RyZWFtUmVhZGVyKChJbnB1dFN0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgRmFzdEluZm9zZXRSZWZsZWN0aW9uLkZhc3RJbmZvc2V0U291cmNlX2dldElucHV0U3RyZWFtKHNvdXJjZSkpOworICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlLmdldENsYXNzKCkgPT0gZmFzdEluZm9zZXRTb3VyY2VDbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBGYXN0SW5mb3NldFV0aWwuY3JlYXRlRklTdHJlYW1SZWFkZXIoKElucHV0U3RyZWFtKQorICAgICAgICAgICAgICAgICAgICBmYXN0SW5mb3NldFNvdXJjZV9nZXRJbnB1dFN0cmVhbS5pbnZva2Uoc291cmNlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBET01Tb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBET01TdHJlYW1SZWFkZXIgZHNyID0gZG9tU3RyZWFtUmVhZGVyLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChkc3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkb21TdHJlYW1SZWFkZXIuc2V0KGRzciA9IG5ldyBET01TdHJlYW1SZWFkZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERPTVN0cmVhbVJlYWRlciBkc3IgPSAgbmV3IERPTVN0cmVhbVJlYWRlcigpOwogICAgICAgICAgICAgICAgIGRzci5zZXRDdXJyZW50Tm9kZSgoKERPTVNvdXJjZSkgc291cmNlKS5nZXROb2RlKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBkc3I7CiAgICAgICAgICAgICB9CkBAIC0xMTEsNyArMTIzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInNvdXJjZVJlYWRlci5pbnZhbGlkU291cmNlIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgc291cmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9UaWR5WE1MU3RyZWFtUmVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvVGlkeVhNTFN0cmVhbVJlYWRlci5qYXZhCmluZGV4IGJmNjM4YzguLjAxZWUxZTEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9UaWR5WE1MU3RyZWFtUmVhZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1RpZHlYTUxTdHJlYW1SZWFkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyMTMgKzI1LDM3IEBACiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nOwogCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YTUxTdHJlYW1SZWFkZXJGaWx0ZXI7CisKIGltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogV3JhcHBlciBvdmVyIFhNTFN0cmVhbVJlYWRlci4gSXQgd2lsbCBiZSB1c2VkIHByaW1hcmlseSB0byBjbGVhdXAgdGhlIHJlc291cmNlcyBzdWNoIGFzIGNsb3N1cmUgb24gSW5wdXRTdHJlYW0vUmVhZGVyLgorICogV3JhcHBlciBvdmVyIFhNTFN0cmVhbVJlYWRlci4gSXQgd2lsbCBiZSB1c2VkIHByaW1hcmlseSB0bworICogY2xlYW4gdXAgdGhlIHJlc291cmNlcyBzdWNoIGFzIGNsb3N1cmUgb24gSW5wdXRTdHJlYW0vUmVhZGVyLgogICoKICAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CiAgKi8KLXB1YmxpYyBjbGFzcyBUaWR5WE1MU3RyZWFtUmVhZGVyIGltcGxlbWVudHMgWE1MU3RyZWFtUmVhZGVyewotICAgIHByaXZhdGUgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcjsKK3B1YmxpYyBjbGFzcyBUaWR5WE1MU3RyZWFtUmVhZGVyIGV4dGVuZHMgWE1MU3RyZWFtUmVhZGVyRmlsdGVyIHsKICAgICBwcml2YXRlIGZpbmFsIENsb3NlYWJsZSBjbG9zZWFibGVTb3VyY2U7CiAKLSAgICBwdWJsaWMgVGlkeVhNTFN0cmVhbVJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBDbG9zZWFibGUgY2xvc2VhYmxlU291cmNlKSB7Ci0gICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOworICAgIHB1YmxpYyBUaWR5WE1MU3RyZWFtUmVhZGVyKEBOb3ROdWxsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEBOdWxsYWJsZSBDbG9zZWFibGUgY2xvc2VhYmxlU291cmNlKSB7CisgICAgICAgIHN1cGVyKHJlYWRlcik7CiAgICAgICAgIHRoaXMuY2xvc2VhYmxlU291cmNlID0gY2xvc2VhYmxlU291cmNlOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHRMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkZXIubmV4dFRhZygpOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICBzdXBlci5jbG9zZSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xvc2VhYmxlU291cmNlLmNsb3NlKCk7CisgICAgICAgICAgICBpZihjbG9zZWFibGVTb3VyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbG9zZWFibGVTb3VyY2UuY2xvc2UoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmhhc05hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuaGFzVGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5pc0NoYXJhY3RlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuaXNFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzU3RhbmRhbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzU3RhcnRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzV2hpdGVTcGFjZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuc3RhbmRhbG9uZVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzQXR0cmlidXRlU3BlY2lmaWVkKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGksIGNoYXJbXSBjaGFycywgaW50IGkxLCBpbnQgaTIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHRDaGFyYWN0ZXJzKGksIGNoYXJzLCBpMSwgaTIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEVuY29kaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0UElEYXRhKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRQSVRhcmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFByZWZpeCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeChpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVUeXBlKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZU5hbWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFByb3BlcnR5KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IGksIFN0cmluZyBzLCBTdHJpbmcgczEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZWFkZXIucmVxdWlyZShpLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXROYW1lc3BhY2VVUkkocyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUocywgczEpOwotICAgIH0KLQotCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MUmVhZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MUmVhZGVyLmphdmEKaW5kZXggYWEyNGI3Ni4uNGNkZDNhYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFJlYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxSZWFkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw2ICsyNSw4IEBACiAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nOwogCitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5OworCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxSZWFkZXJFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxSZWFkZXJFeGNlcHRpb24uamF2YQppbmRleCA0NDlhZTEzLi5lMDc3ZGRhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MUmVhZGVyRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFJlYWRlckV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgc3VwZXIoInhtbHJlYWRlci5uZXN0ZWRFcnJvciIsIGFyZyk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICByZXR1cm4gImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5zdHJlYW1pbmciOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxTdHJlYW1SZWFkZXJFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxTdHJlYW1SZWFkZXJFeGNlcHRpb24uamF2YQppbmRleCBjZTUxNDIzLi5mMzdmOTVkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MU3RyZWFtUmVhZGVyRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFN0cmVhbVJlYWRlckV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgc3VwZXIoInhtbHJlYWRlci5uZXN0ZWRFcnJvciIsIGFyZyk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICByZXR1cm4gImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5zdHJlYW1pbmciOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTNhZjYyLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmc7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU3VuU3RBWFJlZmxlY3Rpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5GYXN0SW5mb3NldFJlZmxlY3Rpb247Ci0KLS8qKgotICogPHA+QSBmYWN0b3J5IHRvIGNyZWF0ZSBYTUwgYW5kIEZJIHBhcnNlcnMuPC9wPgotICoKLSAqIEBhdXRob3IgU2FudGlhZ28uUGVyaWNhc0dlZXJ0c2VuQHN1bi5jb20KLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogU3RBWCBpbnB1dCBmYWN0b3J5IHNoYXJlZCBieSBhbGwgdGhyZWFkcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IHhtbElucHV0RmFjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEZJIHN0cmVhbSByZWFkZXIgZm9yIGVhY2ggdGhyZWFkLgotICAgICAqLwotICAgIHN0YXRpYyBUaHJlYWRMb2NhbCBmaVN0cmVhbVJlYWRlciA9IG5ldyBUaHJlYWRMb2NhbCgpOwotCi0gICAgLyoqCi0gICAgICogWmVwaHlyJ3Mgc3RyZWFtIHJlYWRlciBmb3IgZWFjaCB0aHJlYWQuCi0gICAgICovCi0gICAgc3RhdGljIFRocmVhZExvY2FsIHhtbFN0cmVhbVJlYWRlciA9IG5ldyBUaHJlYWRMb2NhbCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVXNlIFN0QVggcGx1Z2dhYmlsaXR5IGxheWVyIHRvIGdldCBmYWN0b3J5IGluc3RhbmNlCi0gICAgICAgIHhtbElucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB4bWxJbnB1dEZhY3Rvcnkuc2V0UHJvcGVydHkoWE1MSW5wdXRGYWN0b3J5LklTX05BTUVTUEFDRV9BV0FSRSwgQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVHVybiBPRkYgaW50ZXJuYWwgZmFjdG9yeSBjYWNoaW5nIGluIFplcGh5ciAtLSBub3QgdGhyZWFkIHNhZmUKLSAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5zZXRQcm9wZXJ0eSgicmV1c2UtaW5zdGFuY2UiLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGZhbGxzIHRocm91Z2gKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tIFhNTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBmcmVzaCBTdEFYIHBhcnNlciBjcmVhdGVkIGZyb20gYW4gSW5wdXRTb3VyY2UuIFVzZSB0aGlzCi0gICAgICogbWV0aG9kIHdoZW4gY29uY3VycmVudCBpbnN0YW5jZXMgYXJlIG5lZWRlZCB3aXRoaW4gYSBzaW5nbGUgdGhyZWFkLgotICAgICAqCi0gICAgICogVE9ETzogUmVqZWN0IERURHM/Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlRnJlc2hYTUxTdHJlYW1SZWFkZXIoSW5wdXRTb3VyY2Ugc291cmNlLAotICAgICAgICBib29sZWFuIHJlamVjdERURHMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoeG1sSW5wdXRGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hhciBzdHJlYW0gYXZhaWxhYmxlPwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0Q2hhcmFjdGVyU3RyZWFtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRTeXN0ZW1JZCgpLCBzb3VyY2UuZ2V0Q2hhcmFjdGVyU3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEJ5dGUgc3RyZWFtIGF2YWlsYWJsZT8KLSAgICAgICAgICAgICAgICBpZiAoc291cmNlLmdldEJ5dGVTdHJlYW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFN5c3RlbUlkKCksIHNvdXJjZS5nZXRCeXRlU3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgb3BlbiBVUkkKLSAgICAgICAgICAgICAgICByZXR1cm4geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzb3VyY2UuZ2V0U3lzdGVtSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFVSTChzb3VyY2UuZ2V0U3lzdGVtSWQoKSkub3BlblN0cmVhbSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInN0YXguY2FudENyZWF0ZSIsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGZhY3RvcnkgbWV0aG9kIHdvdWxkIGJlIHVzZWQgZm9yIGV4YW1wbGUgd2hlbiBjYWxsZXIgd2FudHMgdG8gY2xvc2UgdGhlIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBjcmVhdGVGcmVzaFhNTFN0cmVhbVJlYWRlcihTdHJpbmcgc3lzdGVtSWQsIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh4bWxJbnB1dEZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIG9wZW4gVVJJCi0gICAgICAgICAgICAgICAgcmV0dXJuIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3lzdGVtSWQsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MUmVhZGVyRXhjZXB0aW9uKCJzdGF4LmNhbnRDcmVhdGUiLGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBmYWN0b3J5IG1ldGhvZCB3b3VsZCBiZSB1c2VkIGZvciBleGFtcGxlIHdoZW4gY2FsbGVyIHdhbnRzIHRvIGNsb3NlIHRoZSBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlRnJlc2hYTUxTdHJlYW1SZWFkZXIoU3RyaW5nIHN5c3RlbUlkLCBSZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbElucHV0RmFjdG9yeSkgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgb3BlbiBVUkkKLSAgICAgICAgICAgICAgICByZXR1cm4geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzeXN0ZW1JZCwKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInN0YXguY2FudENyZWF0ZSIsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFN0QVggcGFyc2VyIGZyb20gYW4gSW5wdXRTdHJlYW0uCi0gICAgICoKLSAgICAgKiBUT0RPOiBSZWplY3QgRFREcz8KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBjcmVhdGVYTUxTdHJlYW1SZWFkZXIoSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgIGJvb2xlYW4gcmVqZWN0RFREcykgewotICAgICAgICByZXR1cm4gY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG51bGwsIGluLCByZWplY3REVERzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU3RBWCBwYXJzZXIgZnJvbSBhbiBJbnB1dFN0cmVhbS4gQXR0ZW1wcyB0byByZS11c2UgcGFyc2VycyBpZgotICAgICAqIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24gaXMgWmVwaHlyLgotICAgICAqCi0gICAgICogVE9ETzogUmVqZWN0IERURHM/Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlWE1MU3RyZWFtUmVhZGVyKFN0cmluZyBzeXN0ZW1JZCwKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gcmVqZWN0RFREcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSWYgdXNpbmcgWmVwaHlyLCB0cnkgcmUtdXNpbmcgdGhlIGxhc3QgaW5zdGFuY2UKLSAgICAgICAgICAgIGlmIChTdW5TdEFYUmVmbGVjdGlvbi5YTUxSZWFkZXJJbXBsX3NldElucHV0U291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgeHNyID0geG1sU3RyZWFtUmVhZGVyLmdldCgpOwotICAgICAgICAgICAgICAgIGlmICh4c3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbElucHV0RmFjdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyLnNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3IgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHN5c3RlbUlkLCBpbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdW5TdEFYUmVmbGVjdGlvbi5YTUxSZWFkZXJJbXBsX3Jlc2V0Lmludm9rZSh4c3IpOwotICAgICAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbik7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0U291cmNlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgU3VuU3RBWFJlZmxlY3Rpb24uWE1MUmVhZGVySW1wbF9zZXRJbnB1dFNvdXJjZS5pbnZva2UoeHNyLCBpbnB1dFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAoWE1MU3RyZWFtUmVhZGVyKSB4c3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbElucHV0RmFjdG9yeSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzeXN0ZW1JZCwgaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInN0YXguY2FudENyZWF0ZSIsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU3RBWCBwYXJzZXIgZnJvbSBhIFJlYWRlci4gQXR0ZW1wcyB0byByZS11c2UgcGFyc2VycyBpZgotICAgICAqIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24gaXMgWmVwaHlyLgotICAgICAqCi0gICAgICogVE9ETzogUmVqZWN0IERURHM/Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlWE1MU3RyZWFtUmVhZGVyKFJlYWRlciByZWFkZXIsCi0gICAgICAgIGJvb2xlYW4gcmVqZWN0RFREcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSWYgdXNpbmcgWmVwaHlyLCB0cnkgcmUtdXNpbmcgdGhlIGxhc3QgaW5zdGFuY2UKLSAgICAgICAgICAgIGlmIChTdW5TdEFYUmVmbGVjdGlvbi5YTUxSZWFkZXJJbXBsX3NldElucHV0U291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgeHNyID0geG1sU3RyZWFtUmVhZGVyLmdldCgpOwotICAgICAgICAgICAgICAgIGlmICh4c3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbElucHV0RmFjdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyLnNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3IgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlYWRlcikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdW5TdEFYUmVmbGVjdGlvbi5YTUxSZWFkZXJJbXBsX3Jlc2V0Lmludm9rZSh4c3IpOwotICAgICAgICAgICAgICAgICAgICBTdW5TdEFYUmVmbGVjdGlvbi5YTUxSZWFkZXJJbXBsX3NldElucHV0U291cmNlLmludm9rZSh4c3IsIG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChYTUxTdHJlYW1SZWFkZXIpIHhzcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoeG1sSW5wdXRGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFJlYWRlckV4Y2VwdGlvbigic3RheC5jYW50Q3JlYXRlIixlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tIEZhc3QgSW5mb3NldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIGNyZWF0ZUZJU3RyZWFtUmVhZGVyKElucHV0U291cmNlIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gY3JlYXRlRklTdHJlYW1SZWFkZXIoc291cmNlLmdldEJ5dGVTdHJlYW0oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRkkgcGFyc2VyIGFsbG9jYXRlZCBmb3IgdGhpcyB0aHJlYWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlRklTdHJlYW1SZWFkZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBGSSB3YXMgZm91bmQKLSAgICAgICAgaWYgKEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5maVN0QVhEb2N1bWVudFBhcnNlcl9uZXcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFJlYWRlckV4Y2VwdGlvbigiZmFzdGluZm9zZXQubm9JbXBsZW1lbnRhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCBzZHAgPSBmaVN0cmVhbVJlYWRlci5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZHAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgU3RBWCBwbHVnZ2FibGUgbGF5ZXIgZm9yIEZJCi0gICAgICAgICAgICAgICAgZmlTdHJlYW1SZWFkZXIuc2V0KHNkcCA9IEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5maVN0QVhEb2N1bWVudFBhcnNlcl9uZXcubmV3SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgICAgICAgRmFzdEluZm9zZXRSZWZsZWN0aW9uLmZpU3RBWERvY3VtZW50UGFyc2VyX3NldFN0cmluZ0ludGVybmluZy5pbnZva2Uoc2RwLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmFzdEluZm9zZXRSZWZsZWN0aW9uLmZpU3RBWERvY3VtZW50UGFyc2VyX3NldElucHV0U3RyZWFtLmludm9rZShzZHAsIGluKTsKLSAgICAgICAgICAgIHJldHVybiAoWE1MU3RyZWFtUmVhZGVyKSBzZHA7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtUmVhZGVyRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MU3RyZWFtUmVhZGVyVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFN0cmVhbVJlYWRlclV0aWwuamF2YQppbmRleCBkNjc3NjVkLi5jZjc3ODg1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MU3RyZWFtUmVhZGVyVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxTdHJlYW1SZWFkZXJVdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsMTggKzI2LDkgQEAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLnN0cmVhbWluZy5TT0FQTmFtZXNwYWNlQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUENvbnN0YW50czsKLQogaW1wb3J0IHN0YXRpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy4qOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CiAKIC8qKgogICogPHA+IFhNTFN0cmVhbVJlYWRlclV0aWwgcHJvdmlkZXMgc29tZSB1dGlsaXR5IG1ldGhvZHMgaW50ZW5kZWQgdG8gYmUgdXNlZApAQCAtNTMsOCArNDQsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IHdyYXBFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjQsMTQgKzE1NCwxNCBAQAogICAgICovCiAgICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRFbGVtZW50UU5hbWUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0LmluZGV4T2YoJzonKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKS50cmltKCk7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gdGV4dC5zdWJzdHJpbmcoMCx0ZXh0LmluZGV4T2YoJzonKSk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9ICIiOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHRleHQuc3Vic3RyaW5nKAotICAgICAgICAgICAgICAgIHRleHQuaW5kZXhPZignOicpICsgMSwgIHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICB0ZXh0LmluZGV4T2YoJzonKSArIDEsIHRleHQubGVuZ3RoKCkpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCk7CiAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyB3cmFwRXhjZXB0aW9uKGUpOwpAQCAtMTgzLDggKzE3Myw4IEBACiAgICAgICogYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIGdldCB0aGUgc2FtZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICByZXR1cm4gKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSByZWFkZXIuU1RBUlRfRUxFTUVOVCB8fAotICAgICAgICAgICAgICAgIHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSByZWFkZXIuQVRUUklCVVRFKSA/CisgICAgICAgIHJldHVybiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFNUQVJUX0VMRU1FTlQgfHwKKyAgICAgICAgICAgICAgICByZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gQVRUUklCVVRFKSA/CiAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZXNJbXBsKHJlYWRlcikgOiBudWxsOwogICAgIH0KIApAQCAtMTkzLDE4ICsxODMsMjEgQEAKICAgICAgICAgaWYgKHN0YXRlICE9IGV4cGVjdGVkU3RhdGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1SZWFkZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgInhtbHJlYWRlci51bmV4cGVjdGVkU3RhdGUiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldFN0YXRlTmFtZShleHBlY3RlZFN0YXRlKSwgZ2V0U3RhdGVOYW1lKHN0YXRlKSB9KTsKKyAgICAgICAgICAgICAgICBnZXRTdGF0ZU5hbWUoZXhwZWN0ZWRTdGF0ZSksIGdldFN0YXRlTmFtZShzdGF0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVRhZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIGlmICghbG9jYWxOYW1lLmVxdWFscyhyZWFkZXIuZ2V0TG9jYWxOYW1lKCkpIHx8ICFuYW1lc3BhY2VVUkkuZXF1YWxzKHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1SZWFkZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInhtbHJlYWRlci51bmV4cGVjdGVkU3RhdGUudGFnIiwKKyAgICAgICAgICAgICAgICAgICAgInsiICsgbmFtZXNwYWNlVVJJICsgIn0iICsgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAieyIgKyByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkgKyAifSIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVRhZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmICghbmFtZS5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1SZWFkZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgInhtbHJlYWRlci51bmV4cGVjdGVkU3RhdGUudGFnIiwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5VGFnKHJlYWRlciwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RhdGVOYW1lKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKQEAgLTMyMCwxMiArMzEzLDExIEBACiAKICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBub3JtYWwgY2FzZQogICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IG51bGw7CiAgICAgICAgICAgICAgICAgaW50IG5hbWVzcGFjZUNvdW50ID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7CiAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZUNvdW50ID0gcmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCk7CiAgICAgICAgICAgICAgICAgYXRJbmZvcyA9IG5ldyBBdHRyaWJ1dGVJbmZvW25hbWVzcGFjZUNvdW50ICsgYXR0cmlidXRlQ291bnRdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxuYW1lc3BhY2VDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCA9IHJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgbnVsbCBpZiBkZWZhdWx0IHByZWZpeC4gUU5hbWUgY2FuJ3QgdGFrZSBudWxsCiAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VQcmVmaXggPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFN0cmVhbVdyaXRlckV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFN0cmVhbVdyaXRlckV4Y2VwdGlvbi5qYXZhCmluZGV4IDMyZjkzODMuLjI4NDFmNGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxTdHJlYW1Xcml0ZXJFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MU3RyZWFtV3JpdGVyRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICBzdXBlcigieG1sd3JpdGVyLm5lc3RlZEVycm9yIiwgYXJnKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLnN0cmVhbWluZyI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFN0cmVhbVdyaXRlckZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxTdHJlYW1Xcml0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODY0MTguLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFN0cmVhbVdyaXRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZzsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuRmFzdEluZm9zZXRSZWZsZWN0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLQotLyoqCi0gKiA8cD5BIGZhY3RvcnkgdG8gY3JlYXRlIFhNTCBhbmQgRkkgc2VyaWFsaXplcnMuPC9wPgotICoKLSAqIEBhdXRob3IgU2FudGlhZ28uUGVyaWNhc0dlZXJ0c2VuQHN1bi5jb20KLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cmVhbVdyaXRlckZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogU3RBWCBpbnB1dCBmYWN0b3J5IHNoYXJlZCBieSBhbGwgdGhyZWFkcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgWE1MT3V0cHV0RmFjdG9yeSB4bWxPdXRwdXRGYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogRkkgc3RyZWFtIHdyaXRlciBmb3IgZWFjaCB0aHJlYWQuCi0gICAgICovCi0gICAgc3RhdGljIFRocmVhZExvY2FsIGZpU3RyZWFtV3JpdGVyID0gbmV3IFRocmVhZExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBVc2UgU3RBWCBwbHVnZ2FiaWxpdHkgbGF5ZXIgdG8gZ2V0IGZhY3RvcnkgaW5zdGFuY2UKLSAgICAgICAgeG1sT3V0cHV0RmFjdG9yeSA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICAvLyAtLSBYTUwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVYTUxTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgewotICAgICAgICByZXR1cm4gY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCwgIlVURi04Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1Xcml0ZXIgY3JlYXRlWE1MU3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICByZXR1cm4gY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCwgZW5jb2RpbmcsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRPRE86IGRlY2xhcmU/Ci0gICAgICogVE9ETzogVXNlIHRocmVhZCBsb2NhbHMgYW5kIHJlc2V0KCkgd2hlbiB1c2luZyBaZXBoeXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVYTUxTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nLCBib29sZWFuIGRlY2xhcmUpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQXNzdW1lIFN0QVggZmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoeG1sT3V0cHV0RmFjdG9yeSkgewotICAgICAgICAgICAgICAgIHJldHVybiB4bWxPdXRwdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQsIGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxSZWFkZXJFeGNlcHRpb24oInN0YXguY2FudENyZWF0ZSIsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLSBGYXN0IEluZm9zZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVGSVN0cmVhbVdyaXRlcihPdXRwdXRTdHJlYW0gb3V0KSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVGSVN0cmVhbVdyaXRlcihvdXQsICJVVEYtOCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtV3JpdGVyIGNyZWF0ZUZJU3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICByZXR1cm4gY3JlYXRlRklTdHJlYW1Xcml0ZXIob3V0LCBlbmNvZGluZywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1Xcml0ZXIgY3JlYXRlRklTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nLCBib29sZWFuIGRlY2xhcmUpCi0gICAgewotICAgICAgICAvLyBDaGVjayBpZiBjb21wYXRpYmxlIGltcGxlbWVudGF0aW9uIG9mIEZJIHdhcyBmb3VuZAotICAgICAgICBpZiAoRmFzdEluZm9zZXRSZWZsZWN0aW9uLmZpU3RBWERvY3VtZW50U2VyaWFsaXplcl9uZXcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFJlYWRlckV4Y2VwdGlvbigiZmFzdGluZm9zZXQubm9JbXBsZW1lbnRhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCBzZHMgPSBmaVN0cmVhbVdyaXRlci5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgU3RBWCBwbHVnZ2FibGUgbGF5ZXIgZm9yIEZJCi0gICAgICAgICAgICAgICAgZmlTdHJlYW1Xcml0ZXIuc2V0KHNkcyA9IEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5maVN0QVhEb2N1bWVudFNlcmlhbGl6ZXJfbmV3Lm5ld0luc3RhbmNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmFzdEluZm9zZXRSZWZsZWN0aW9uLmZpU3RBWERvY3VtZW50U2VyaWFsaXplcl9zZXRPdXRwdXRTdHJlYW0uaW52b2tlKHNkcywgb3V0KTsKLSAgICAgICAgICAgIEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5maVN0QVhEb2N1bWVudFNlcmlhbGl6ZXJfc2V0RW5jb2RpbmcuaW52b2tlKHNkcywgZW5jb2RpbmcpOwotICAgICAgICAgICAgcmV0dXJuIChYTUxTdHJlYW1Xcml0ZXIpIHNkczsKLSAgICAgICAgfSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtV3JpdGVyRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MU3RyZWFtV3JpdGVyVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvc3RyZWFtaW5nL1hNTFN0cmVhbVdyaXRlclV0aWwuamF2YQppbmRleCA0MDUwNTIyLi4zNDUyNGEyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy9zdHJlYW1pbmcvWE1MU3RyZWFtV3JpdGVyVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3N0cmVhbWluZy9YTUxTdHJlYW1Xcml0ZXJVdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsOSArMjUsMTMgQEAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmc7CiAKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIAogLyoqCiAgKiA8cD5YTUxTdHJlYW1Xcml0ZXJVdGlsIHByb3ZpZGVzIHNvbWUgdXRpbGl0eSBtZXRob2RzIGludGVuZGVkIHRvIGJlIHVzZWQKQEAgLTQwLDYgKzQ0LDQwIEBACiAgICAgcHJpdmF0ZSBYTUxTdHJlYW1Xcml0ZXJVdGlsKCkgewogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBmb3IgWE1MU3RyZWFtV3JpdGVyLiBJdCBjbG9zZXMgYW55IHN0YXJ0IGVsZW1lbnRzLCBhbmQgcmV0dXJucyB0aGUgc3RyZWFtIHNvCisgICAgICogdGhhdCBKQVhCIGNhbiB3cml0ZSBpbmZvc2V0IGRpcmVjdGx5IHRvIHRoZSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFhNTFN0cmVhbVdyaXRlciBmb3Igd2hpY2ggc3RyZWFtIGlzIHJlcXVpcmVkCisgICAgICogQHJldHVybiAgdW5kZXJseWluZyBPdXRwdXRTdHJlYW0sIG51bGwgaWYgd3JpdGVyIGRvZXNuJ3QgcHJvdmlkZSBhIHdheSB0byBnZXQgaXQKKyAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiBpZiBhbnkgb2Ygd3JpdGVyIG9wZXJhdGlvbnMgdGhyb3cgdGhlIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQE51bGxhYmxlIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNKU1hQCisgICAgICAgIGlmICh3cml0ZXIgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSAoKE1hcCkgd3JpdGVyKS5nZXQoInNqc3hwLW91dHB1dHN0cmVhbSIpOworICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycygiIik7ICAvLyBGb3JjZSBjb21wbGV0aW9uIG9mIG9wZW4gZWxlbXMKKyAgICAgICAgICAgICAgICByZXR1cm4gKE91dHB1dFN0cmVhbSlvYmo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gd29vZHN0b3gKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSB3cml0ZXIuZ2V0UHJvcGVydHkoImNvbS5jdGMud3N0eC5vdXRwdXRVbmRlcmx5aW5nU3RyZWFtIik7CisgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKCIiKTsgIC8vIEZvcmNlIGNvbXBsZXRpb24gb2Ygb3BlbiBlbGVtcworICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgICAgIHJldHVybiAoT3V0cHV0U3RyZWFtKW9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIC8vQWJvdmUgcHJvcGVydHkgbG9va3VwIGNhdXNlcyBOUEUgb24gSkRLNnUxLCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgZmFpbCBkdWUgdG8gc3VjaCBsb29rdXBzLgorCisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVFOYW1lKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIFFOYW1lIHFuYW1lLAogICAgICAgICBQcmVmaXhGYWN0b3J5IHByZWZpeEZhY3RvcnkpCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvRGVmZXJyZWRUcmFuc3BvcnRQaXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvRGVmZXJyZWRUcmFuc3BvcnRQaXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzYjNjOAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9EZWZlcnJlZFRyYW5zcG9ydFBpcGUuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLio7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuaGVscGVyLkFic3RyYWN0VHViZUltcGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7CisKKy8qKgorICogUHJveHkgdHJhbnNwb3J0IHtAbGluayBUdWJlfSBhbmQge0BsaW5rIFBpcGV9IHRoYXQgbGF6aWx5IGRldGVybWluZXMgdGhlCisgKiBhY3R1YWwgdHJhbnNwb3J0IHBpcGUgYnkgbG9va2luZyBhdCB7QGxpbmsgUGFja2V0I2VuZHBvaW50QWRkcmVzc30uCisgKgorICogPHA+CisgKiBUaGlzIHBzZXVkbyB0cmFuc3BvcnQgaXMgdXNlZCB3aGVuIHRoZXJlJ3Mgbm8gc3RhdGljYWxseSBrbm93biBlbmRwb2ludCBhZGRyZXNzLAorICogYW5kIHRodXMgaXQncyBleHBlY3RlZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNvbmZpZ3VyZSB7QGxpbmsgQmluZGluZ1Byb3ZpZGVyfQorICogYXQgcnVudGltZSBiZWZvcmUgbWFraW5nIGludm9jYXRpb24uCisgKgorICogPHA+CisgKiBTaW5jZSBhIHR5cGljYWwgYXBwbGljYXRpb24gbWFrZXMgbXVsdGlwbGUgaW52b2NhdGlvbnMgd2l0aCB0aGUgc2FtZSBlbmRwb2ludAorICogYWRkcmVzcywgdGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc2ltcGxlIGNhY2hlIHN0cmF0ZWd5IHRvIGF2b2lkIHJlLWNyZWF0aW5nCisgKiB0cmFuc3BvcnQgcGlwZXMgZXhjZXNzaXZlbHkuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGVmZXJyZWRUcmFuc3BvcnRQaXBlIGV4dGVuZHMgQWJzdHJhY3RUdWJlSW1wbCB7CisKKyAgICBwcml2YXRlIFR1YmUgdHJhbnNwb3J0OworICAgIHByaXZhdGUgRW5kcG9pbnRBZGRyZXNzIGFkZHJlc3M7CisKKyAgICAvLyBwYXJhbWV0ZXIgdG8gVHJhbnNwb3J0UGlwZUZhY3RvcnkKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOworICAgIHByaXZhdGUgZmluYWwgQ2xpZW50VHViZUFzc2VtYmxlckNvbnRleHQgY29udGV4dDsKKworICAgIHB1YmxpYyBEZWZlcnJlZFRyYW5zcG9ydFBpcGUoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIENsaWVudFBpcGVBc3NlbWJsZXJDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjbGFzc0xvYWRlciwgbmV3IENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0KGNvbnRleHQuZ2V0QWRkcmVzcygpLCBjb250ZXh0LmdldFdzZGxNb2RlbCgpLAorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U2VydmljZSgpLCBjb250ZXh0LmdldEJpbmRpbmcoKSwgY29udGV4dC5nZXRDb250YWluZXIoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBEZWZlcnJlZFRyYW5zcG9ydFBpcGUoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBOZXh0QWN0aW9uIHByb2Nlc3NFeGNlcHRpb24oQE5vdE51bGwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5wcm9jZXNzRXhjZXB0aW9uKHQpOworICAgIH0KKworICAgIHB1YmxpYyBOZXh0QWN0aW9uIHByb2Nlc3NSZXF1ZXN0KEBOb3ROdWxsIFBhY2tldCByZXF1ZXN0KSB7CisgICAgICAgIGlmKHJlcXVlc3QuZW5kcG9pbnRBZGRyZXNzPT1hZGRyZXNzKQorICAgICAgICAgICAgLy8gY2FjaGUgaGl0CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LnByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpOworCisgICAgICAgIC8vIGNhY2hlIG1pc3MKKworICAgICAgICBpZih0cmFuc3BvcnQhPW51bGwpIHsKKyAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgY3VycmVudCBlbnRyeQorICAgICAgICAgICAgdHJhbnNwb3J0LnByZURlc3Ryb3koKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBhZGRyZXNzID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG90aGVyd2lzZSBmaW5kIG91dCB3aGF0IHRyYW5zcG9ydCB3aWxsIHByb2Nlc3MgdGhpcy4KKworICAgICAgICBDbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dCBuZXdDb250ZXh0ID0gbmV3IENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0KAorICAgICAgICAgICAgcmVxdWVzdC5lbmRwb2ludEFkZHJlc3MsCisgICAgICAgICAgICBjb250ZXh0LmdldFdzZGxNb2RlbCgpLAorICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2aWNlKCksCisgICAgICAgICAgICBjb250ZXh0LmdldEJpbmRpbmcoKSwKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0Q29udGFpbmVyKCksCisgICAgICAgICAgICBjb250ZXh0LmdldENvZGVjKCkuY29weSgpCisgICAgICAgICk7CisKKyAgICAgICAgYWRkcmVzcyA9IHJlcXVlc3QuZW5kcG9pbnRBZGRyZXNzOworICAgICAgICB0cmFuc3BvcnQgPSBUcmFuc3BvcnRUdWJlRmFjdG9yeS5jcmVhdGUoY2xhc3NMb2FkZXIsIG5ld0NvbnRleHQpOworICAgICAgICAvLyBzdWNjZXNzZnVsIHJldHVybiBmcm9tIHRoZSBhYm92ZSBtZXRob2QgaW5kaWNhdGVzIGEgc3VjY2Vzc2Z1bCBwaXBlIGNyZWF0aW9uCisgICAgICAgIGFzc2VydCB0cmFuc3BvcnQhPW51bGw7CisKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5wcm9jZXNzUmVxdWVzdChyZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzUmVzcG9uc2UoQE5vdE51bGwgUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybiB0cmFuc3BvcnQucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBpZih0cmFuc3BvcnQhPW51bGwpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5wcmVEZXN0cm95KCk7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgYWRkcmVzcyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGVmZXJyZWRUcmFuc3BvcnRQaXBlIGNvcHkoVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgRGVmZXJyZWRUcmFuc3BvcnRQaXBlIGNvcHkgPSBuZXcgRGVmZXJyZWRUcmFuc3BvcnRQaXBlKGNsYXNzTG9hZGVyLGNvbnRleHQpOworICAgICAgICBjbG9uZXIuYWRkKHRoaXMsY29weSk7CisKKyAgICAgICAgLy8gVE9ETyBJcyB0aGUgZm9sbG93aW5nIHRocmVhZC1zYWZlID8/CisgICAgICAgIC8vIGNvcGllZCBwaXBlbGluZSBpcyBzdGlsbCBsaWtlbHkgdG8gd29yayB3aXRoIHRoZSBzYW1lIGVuZHBvaW50IGFkZHJlc3MsCisgICAgICAgIC8vIHNvIGFsc28gY29weSB0aGUgY2FjaGVkIHRyYW5zcG9ydCBwaXBlLCBpZiBhbnkKKyAgICAgICAgaWYodHJhbnNwb3J0IT1udWxsKSB7CisgICAgICAgICAgICBjb3B5LnRyYW5zcG9ydCA9ICgoUGlwZUNsb25lciljbG9uZXIpLmNvcHkodGhpcy50cmFuc3BvcnQpOworICAgICAgICAgICAgY29weS5hZGRyZXNzID0gdGhpcy5hZGRyZXNzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L0hlYWRlcnMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9IZWFkZXJzLmphdmEKaW5kZXggZmNhZDAzMi4uZDdlOWFlOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L0hlYWRlcnMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvSGVhZGVycy5qYXZhCkBAIC0xLDYgKzEsNSBAQAotCiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsNiArMjMsNyBAQAogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCiAKKwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTE4MCw3ICsxODAsOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXA8PyBleHRlbmRzIFN0cmluZyw/IGV4dGVuZHMgTGlzdDxTdHJpbmc+PiB0KSAgewotICAgICAgICBtYXAucHV0QWxsICh0KTsKKyAgICAgICAgZm9yKE1hcC5FbnRyeTw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IHQuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewpAQCAtMjA2LDggKzIwOCw0IEBACiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgcmV0dXJuIG1hcC5oYXNoQ29kZSgpOwogICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtYXAudG9TdHJpbmcoKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvV1NDb25uZWN0aW9uSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L1dTQ29ubmVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczMzRhMy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvV1NDb25uZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuRVBURmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldTQ29ubmVjdGlvbjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgV1NDb25uZWN0aW9uLiBBbGwgY2xpZW50LXNpZGUgYW5kIHNlcnZlci1zaWRlCi0gKiB0cmFuc3BvcnRzIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyBhbmQgb3ZlcnJpZGUgYXBwcm9wcmlhdGUgbWV0aG9kcy4KLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTQ29ubmVjdGlvbkltcGwgaW1wbGVtZW50cyBXU0Nvbm5lY3Rpb24gewotICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycyA9IG51bGw7Ci0gICAgcHVibGljIE91dHB1dFN0cmVhbSBkZWJ1Z1N0cmVhbSA9IG51bGw7Ci0gICAgcHVibGljIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgaW50IHN0YXR1c0NvZGU7Ci0KLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBXU0Nvbm5lY3Rpb25JbXBsICovCi0gICAgcHVibGljIFdTQ29ubmVjdGlvbkltcGwgKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzICgpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzIChpbnQgc3RhdHVzQ29kZSkgewotICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0RGVidWcgKCkgewotICAgICAgICByZXR1cm4gZGVidWdTdHJlYW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBvdXRwdXRTdHJlYW0KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIE91dHB1dFN0cmVhbSBvbiB3aGljaCB0aGUgb3V0Ym91bmQgbWVzc2FnZSBpcyB3cml0dGVuLgotICAgICAqIEFueSBzdHJlYW0gb3IgY29ubmVjdGlvbiBpbml0aWFsaXphdGlvbiwgcHJlLXByb2Nlc3NpbmcgaXMgZG9uZSBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0KCkgewotICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaW5wdXRTdHJlYW0KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIElucHV0U3RyZWFtIG9uIHdoaWNoIHRoZSBpbmJvdW5kIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCi0gICAgICogQW55IHBvc3QtcHJvY2Vzc2luZyBvZiBtZXNzYWdlIGlzIGRvbmUgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXQoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dFN0cmVhbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRIZWFkZXJzICgpIHsKLSAgICAgICAgcmV0dXJuIGhlYWRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVycyAoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7Ci0gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgY29ubmVjdGlvbiBoZWFkZXJzIGluIEhUVFAgc3ludGF4IHVzaW5nIFxyXG4gYXMgYQotICAgICAqIHNlcGFyYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUhlYWRlcnMoT3V0cHV0U3RyZWFtIG9zKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gbmV3TGluZSA9ICJcclxuIi5nZXRCeXRlcygidXMtYXNjaWkiKTsKLQotICAgICAgICAgICAgLy8gV3JpdGUgYWxsIGhlYWRlcnMgYWxhIEhUVFAgKG9ubHkgZmlyc3QgbGlzdCBlbnRyeSBzZXJpYWxpemVkKQotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gZ2V0SGVhZGVycygpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgaGVhZGVyIDogaGVhZGVycy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIG9zLndyaXRlKChoZWFkZXIgKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLmdldChoZWFkZXIpLmdldCgwKSkuZ2V0Qnl0ZXMoInVzLWFzY2lpIikpOwotICAgICAgICAgICAgICAgIG9zLndyaXRlKG5ld0xpbmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXcml0ZSBlbXB0eSBsaW5lIGFzIGluIEhUVFAKLSAgICAgICAgICAgIG9zLndyaXRlKG5ld0xpbmUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oImxvY2FsLmNsaWVudC5mYWlsZWQiLGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYW5kIGNvbnN1bWUgY29ubmVjdGlvbiBoZWFkZXJzIGluIEhUVFAgc3ludGF4IHVzaW5nCi0gICAgICogXHJcbiBhcyBhIHNlcGFyYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkSGVhZGVycyhJbnB1dFN0cmVhbSBpcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGMxLCBjMjsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBsaW5lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICBpZiAoaGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVycy5jbGVhcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZWFkIGhlYWRlcnMgdW50aWwgZmluZGluZyBhIFxyXG4gbGluZQotICAgICAgICAgICAgd2hpbGUgKChjMSA9IGlzLnJlYWQoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoYzEgPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICBjMiA9IGlzLnJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGMyICE9IC0xOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjMiA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGxpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGZvdW5kIFxyXG4gbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGsgID0gcy5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGsgPiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHZhbHVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYWRkKHMuc3Vic3RyaW5nKGsgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXQocy5zdWJzdHJpbmcoMCwgayksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnNldExlbmd0aCgwKTsgICAgICAvLyBjbGVhciBsaW5lIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoKGNoYXIpIGMxKS5hcHBlbmQoKGNoYXIpIGMyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoKGNoYXIpIGMxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudFRyYW5zcG9ydEV4Y2VwdGlvbigibG9jYWwuY2xpZW50LmZhaWxlZCIsZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2VPdXRwdXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2VJbnB1dCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL0RlcGxveW1lbnREZXNjcmlwdG9yUGFyc2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9EZXBsb3ltZW50RGVzY3JpcHRvclBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTllNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9EZXBsb3ltZW50RGVzY3JpcHRvclBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNTY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHA7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5CaW5kaW5nSUQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkluc3RhbmNlUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5TRERvY3VtZW50U291cmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuV1NFbmRwb2ludDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5XZWJTZXJ2aWNlRmVhdHVyZUxpc3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5zTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLlNlcnZlck1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5Xc3NlcnZsZXRNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuRW5kcG9pbnRGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TZXJ2ZXJSdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuQXR0cmlidXRlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuVGlkeVhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyVXRpbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkhhbmRsZXJBbm5vdGF0aW9uSW5mbzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmV4Y2VwdGlvbi5Mb2NhdGFibGVXZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogUGFyc2VzIHtAY29kZSBzdW4tamF4d3MueG1sfSBpbnRvIHtAbGluayBXU0VuZHBvaW50fS4KKyAqCisgKiA8cD4KKyAqIFNpbmNlIHtAY29kZSBzdW4tamF4d3MueG1sfSBjYXB0dXJlcyBtb3JlIGluZm9ybWF0aW9uIHRoYXQgd2hhdCB7QGxpbmsgV1NFbmRwb2ludH0KKyAqIHJlcHJlc2VudHMgKGluIHBhcnRpY3VsYXIgVVJMIHBhdHRlcm4gYW5kIG5hbWUpLCB0aGlzIGNsYXNzCisgKiB0YWtlcyBhIHBhcmFtZXRlcml6YXRpb24gJ0EnIHNvIHRoYXQgdGhlIHVzZXIgb2YgdGhpcyBwYXJzZXIgY2FuIGNob29zZSB0bworICogY3JlYXRlIGFub3RoZXIgdHlwZSB0aGF0IHdyYXBzIHtAbGluayBXU0VuZHBvaW50fS4KKyAqCisgKiB7QGxpbmsgSHR0cEFkYXB0ZXJ9IGFuZCBpdHMgZGVyaXZlZCB0eXBlIGlzIHVzZWQgZm9yIHRoaXMgb2Z0ZW4sCisgKiBidXQgaXQgY2FuIGJlIGFueXRoaW5nLgorICoKKyAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgRGVwbG95bWVudERlc2NyaXB0b3JQYXJzZXI8QT4geworICAgIHByaXZhdGUgZmluYWwgQ29udGFpbmVyIGNvbnRhaW5lcjsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOworICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VMb2FkZXIgbG9hZGVyOworICAgIHByaXZhdGUgZmluYWwgQWRhcHRlckZhY3Rvcnk8QT4gYWRhcHRlckZhY3Rvcnk7CisKKyAgICAvKioKKyAgICAgKiBFbmRwb2ludCBuYW1lcyB0aGF0IGFyZSBkZWNsYXJlZC4KKyAgICAgKiBVc2VkIHRvIGNhdGNoIGRvdWJsZSBkZWZpbml0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgLyoqCisgICAgICogV1NETC9zY2hlbWEgZG9jdW1lbnRzIGNvbGxlY3RlZCBmcm9tIC9XRUItSU5GL3dzZGwuIEtleWVkIGJ5IHRoZSBzeXN0ZW0gSUQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFNERG9jdW1lbnRTb3VyY2U+IGRvY3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU0REb2N1bWVudFNvdXJjZT4oKTsKKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIGNsCisgICAgICogICAgICBVc2VkIHRvIGxvYWQgc2VydmljZSBpbXBsZW1lbnRhdGlvbnMuCisgICAgICogQHBhcmFtIGxvYWRlcgorICAgICAqICAgICAgVXNlZCB0byBsb2NhdGUgcmVzb3VyY2VzLCBpbiBwYXJ0aWN1bGFyIFdTREwuCisgICAgICogQHBhcmFtIGNvbnRhaW5lcgorICAgICAqICAgICAgT3B0aW9uYWwge0BsaW5rIENvbnRhaW5lcn0gdGhhdCB7QGxpbmsgV1NFbmRwb2ludH1zIHJlY2VpdmUuCisgICAgICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisgICAgICogICAgICBDcmVhdGVzIHtAbGluayBIdHRwQWRhcHRlcn0gKG9yIGl0cyBkZXJpdmVkIGNsYXNzLikKKyAgICAgKi8KKyAgICBwdWJsaWMgRGVwbG95bWVudERlc2NyaXB0b3JQYXJzZXIoQ2xhc3NMb2FkZXIgY2wsIFJlc291cmNlTG9hZGVyIGxvYWRlciwgQ29udGFpbmVyIGNvbnRhaW5lciwgQWRhcHRlckZhY3Rvcnk8QT4gYWRhcHRlckZhY3RvcnkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICBjbGFzc0xvYWRlciA9IGNsOworICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIHRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKKworICAgICAgICBjb2xsZWN0RG9jcygiL1dFQi1JTkYvd3NkbC8iKTsKKyAgICAgICAgbG9nZ2VyLmZpbmUoIndhciBtZXRhZGF0YT0iK2RvY3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUge0Bjb2RlIHN1bi1qYXh3cy54bWx9IGZpbGUgYW5kIGNvbmZpZ3VyZXMKKyAgICAgKiBhIHNldCBvZiB7QGxpbmsgSHR0cEFkYXB0ZXJ9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgTGlzdDxBPiBwYXJzZShTdHJpbmcgc3lzdGVtSWQsIElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyID0gbmV3IFRpZHlYTUxTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5jcmVhdGUoc3lzdGVtSWQsaXMsdHJ1ZSksIGlzKTsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VBZGFwdGVycyhyZWFkZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJydW50aW1lLnBhcnNlci54bWxSZWFkZXIiLGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUge0Bjb2RlIHN1bi1qYXh3cy54bWx9IGZpbGUgYW5kIGNvbmZpZ3VyZXMKKyAgICAgKiBhIHNldCBvZiB7QGxpbmsgSHR0cEFkYXB0ZXJ9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vdE51bGwgTGlzdDxBPiBwYXJzZShGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2UoZi5nZXRQYXRoKCksIGluKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHRoZSBXU0RMICYgc2NoZW1hIGRvY3VtZW50cyByZWN1cnNpdmVseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY29sbGVjdERvY3MoU3RyaW5nIGRpclBhdGgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICBTZXQ8U3RyaW5nPiBwYXRocyA9IGxvYWRlci5nZXRSZXNvdXJjZVBhdGhzKGRpclBhdGgpOworICAgICAgICBpZiAocGF0aHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgcGF0aCA6IHBhdGhzKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICBjb2xsZWN0RG9jcyhwYXRoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBVUkwgcmVzID0gbG9hZGVyLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgICAgICAgICBkb2NzLnB1dChyZXMudG9TdHJpbmcoKSxTRERvY3VtZW50U291cmNlLmNyZWF0ZShyZXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgTGlzdDxBPiBwYXJzZUFkYXB0ZXJzKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgaWYgKCFyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhRTkFNRV9FTkRQT0lOVFMpKSB7CisgICAgICAgICAgICBmYWlsV2l0aEZ1bGxOYW1lKCJydW50aW1lLnBhcnNlci5pbnZhbGlkRWxlbWVudCIsIHJlYWRlcik7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PEE+IGFkYXB0ZXJzID0gbmV3IEFycmF5TGlzdDxBPigpOworCisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBYTUxTdHJlYW1SZWFkZXJVdGlsLmdldEF0dHJpYnV0ZXMocmVhZGVyKTsKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBnZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsIGF0dHJzLCBBVFRSX1ZFUlNJT04pOworICAgICAgICBpZiAoIXZlcnNpb24uZXF1YWxzKEFUVFJWQUxVRV9WRVJTSU9OXzFfMCkpIHsKKyAgICAgICAgICAgIGZhaWxXaXRoTG9jYWxOYW1lKCJydW50aW1lLnBhcnNlci5pbnZhbGlkVmVyc2lvbk51bWJlciIsCisgICAgICAgICAgICAgICAgcmVhZGVyLCB2ZXJzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpICE9CisgICAgICAgICAgICBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIGlmIChyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhRTkFNRV9FTkRQT0lOVCkpIHsKKworICAgICAgICAgICAgYXR0cnMgPSBYTUxTdHJlYW1SZWFkZXJVdGlsLmdldEF0dHJpYnV0ZXMocmVhZGVyKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCBhdHRycywgQVRUUl9OQU1FKTsKKyAgICAgICAgICAgIGlmICghbmFtZXMuYWRkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBXc3NlcnZsZXRNZXNzYWdlcy5TRVJWTEVUX1dBUk5JTkdfRFVQTElDQVRFX0VORFBPSU5UX05BTUUoLypuYW1lKi8pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGltcGxlbWVudGF0aW9uTmFtZSA9CisgICAgICAgICAgICAgICAgICAgIGdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgYXR0cnMsIEFUVFJfSU1QTEVNRU5UQVRJT04pOworICAgICAgICAgICAgQ2xhc3M8Pz4gaW1wbGVtZW50b3JDbGFzcyA9IGdldEltcGxlbWVudG9yQ2xhc3MoaW1wbGVtZW50YXRpb25OYW1lLHJlYWRlcik7CisgICAgICAgICAgICBFbmRwb2ludEZhY3RvcnkudmVyaWZ5SW1wbGVtZW50b3JDbGFzcyhpbXBsZW1lbnRvckNsYXNzKTsKKworICAgICAgICAgICAgU0REb2N1bWVudFNvdXJjZSBwcmltYXJ5V1NETCA9IGdldFByaW1hcnlXU0RMKHJlYWRlciwgYXR0cnMsIGltcGxlbWVudG9yQ2xhc3MpOworCisgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9IGdldFFOYW1lQXR0cmlidXRlKGF0dHJzLCBBVFRSX1NFUlZJQ0UpOworICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBFbmRwb2ludEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKGltcGxlbWVudG9yQ2xhc3MpOworCisgICAgICAgICAgICBRTmFtZSBwb3J0TmFtZSA9IGdldFFOYW1lQXR0cmlidXRlKGF0dHJzLCBBVFRSX1BPUlQpOworICAgICAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgcG9ydE5hbWUgPSBFbmRwb2ludEZhY3RvcnkuZ2V0RGVmYXVsdFBvcnROYW1lKHNlcnZpY2VOYW1lLCBpbXBsZW1lbnRvckNsYXNzKTsKKworICAgICAgICAgICAgLy9nZXQgZW5hYmxlLW10b20gYXR0cmlidXRlIHZhbHVlCisgICAgICAgICAgICBTdHJpbmcgZW5hYmxlX210b20gPSBnZXRBdHRyaWJ1dGUoYXR0cnMsIEFUVFJfRU5BQkxFX01UT00pOworICAgICAgICAgICAgU3RyaW5nIG10b21UaHJlc2hvbGQgPSBnZXRBdHRyaWJ1dGUoYXR0cnMsIEFUVFJfTVRPTV9USFJFU0hPTERfVkFMVUUpOworICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCA9IGdldEF0dHJpYnV0ZShhdHRycywgQVRUUl9CSU5ESU5HKTsKKyAgICAgICAgICAgIGlmIChiaW5kaW5nSWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHNob3J0LWZvcm0gdG9rZW5zIHRvIEFQSSdzIGJpbmRpbmcgaWRzCisgICAgICAgICAgICAgICAgYmluZGluZ0lkID0gZ2V0QmluZGluZ0lkRm9yVG9rZW4oYmluZGluZ0lkKTsKKyAgICAgICAgICAgIFdTQmluZGluZyBiaW5kaW5nID0gY3JlYXRlQmluZGluZyhiaW5kaW5nSWQsaW1wbGVtZW50b3JDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlX210b20sbXRvbVRocmVzaG9sZCk7CisgICAgICAgICAgICBTdHJpbmcgdXJsUGF0dGVybiA9CisgICAgICAgICAgICAgICAgICAgIGdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgYXR0cnMsIEFUVFJfVVJMX1BBVFRFUk4pOworCisgICAgICAgICAgICAvLyBUT0RPIHVzZSAnZG9jcycgYXMgdGhlIG1ldGFkYXRhLiBJZiB3c2RsIGlzIG5vbi1udWxsIGl0J3MgdGhlIHByaW1hcnkuCisKKyAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlcnNTZXRJbkREID0gc2V0SGFuZGxlcnNBbmRSb2xlcyhiaW5kaW5nLCByZWFkZXIsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7CisKKyAgICAgICAgICAgIGVuc3VyZU5vQ29udGVudChyZWFkZXIpOworICAgICAgICAgICAgV1NFbmRwb2ludDw/PiBlbmRwb2ludCA9IFdTRW5kcG9pbnQuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRvckNsYXNzLCAhaGFuZGxlcnNTZXRJbkRELAorICAgICAgICAgICAgICAgICAgICBJbnN0YW5jZVJlc29sdmVyLmNyZWF0ZURlZmF1bHQoaW1wbGVtZW50b3JDbGFzcykuY3JlYXRlSW52b2tlcigpLAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwgcG9ydE5hbWUsIGNvbnRhaW5lciwgYmluZGluZywKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVdTREwsIGRvY3MudmFsdWVzKCksIGNyZWF0ZUVudGl0eVJlc29sdmVyKCksZmFsc2UKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBhZGFwdGVycy5hZGQoYWRhcHRlckZhY3RvcnkuY3JlYXRlQWRhcHRlcihuYW1lLCB1cmxQYXR0ZXJuLCBlbmRwb2ludCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFpbFdpdGhMb2NhbE5hbWUoInJ1bnRpbWUucGFyc2VyLmludmFsaWRFbGVtZW50IiwgcmVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRhcHRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGRkQmluZGluZ0lkCisgICAgICogICAgICBiaW5kaW5nIGlkIGV4cGxpY2l0bHlzcGVjaWZpZWQgaW4gdGhlIERlcGxveW1lbnREZXNjcmlwdG9yIG9yIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBpbXBsQ2xhc3MKKyAgICAgKiAgICAgIEVuZHBvaW50IEltcGxlbWVudGF0aW9uIGNsYXNzCisgICAgICogQHBhcmFtIG10b21FbmFibGVkCisgICAgICogICAgICByZXByZXNlbnRzIG10b20tZW5hYmxlZCBhdHRyaWJ1dGUgaW4gREQKKyAgICAgKiBAcGFyYW0gbXRvbVRocmVzaG9sZAorICAgICAqICAgICAgdGhyZXNob2xkIHZhbHVlIHNwZWNpZmllZCBpbiBERAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGlzIHJldHVybmVkIHdpdGggb25seSBNVE9NRmVhdHVyZSBzZXQgcmVzb2x2aW5nIHRoZSB2YXJpb3VzIHByZWNlbmRlY2UgcnVsZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBXU0JpbmRpbmcgY3JlYXRlQmluZGluZyhTdHJpbmcgZGRCaW5kaW5nSWQsQ2xhc3MgaW1wbENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG10b21FbmFibGVkLCBTdHJpbmcgbXRvbVRocmVzaG9sZCkgeworICAgICAgICAvLyBGZWF0dXJlcyBzcGVjaWZpZWQgdGhyb3VnaCBERAorICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZUxpc3QgZmVhdHVyZXM7CisKKyAgICAgICAgTVRPTUZlYXR1cmUgbXRvbWZlYXR1cmUgPSBudWxsOworICAgICAgICBpZiAobXRvbUVuYWJsZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG10b21UaHJlc2hvbGQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtdG9tZmVhdHVyZSA9IG5ldyBNVE9NRmVhdHVyZShCb29sZWFuLnZhbHVlT2YobXRvbUVuYWJsZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci52YWx1ZU9mKG10b21UaHJlc2hvbGQpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtdG9tZmVhdHVyZSA9IG5ldyBNVE9NRmVhdHVyZShCb29sZWFuLnZhbHVlT2YobXRvbUVuYWJsZWQpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQmluZGluZ0lEIGJpbmRpbmdJRDsKKyAgICAgICAgaWYgKGRkQmluZGluZ0lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJpbmRpbmdJRCA9IEJpbmRpbmdJRC5wYXJzZShkZEJpbmRpbmdJZCk7CisgICAgICAgICAgICBmZWF0dXJlcyA9IGJpbmRpbmdJRC5jcmVhdGVCdWlsdGluRmVhdHVyZUxpc3QoKTsKKworICAgICAgICAgICAgaWYoY2hlY2tNdG9tQ29uZmxpY3QoZmVhdHVyZXMuZ2V0KE1UT01GZWF0dXJlLmNsYXNzKSxtdG9tZmVhdHVyZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oU2VydmVyTWVzc2FnZXMuRERfTVRPTV9DT05GTElDVChkZEJpbmRpbmdJZCwgbXRvbUVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpbmRpbmdJRCA9IEJpbmRpbmdJRC5wYXJzZShpbXBsQ2xhc3MpOworICAgICAgICAgICAgLy8gU2luY2UgYmluZGluZ0lEIGlzIGNvbWluZyBmcm9tIGltcGxjbGFzcywKKyAgICAgICAgICAgIC8vIG10b20gdGhyb3VnaCBGZWF0dXJlIGFubm90YXRpb24gb3IgREQgdGFrZXMgcHJlY2VuZGVjZQorCisgICAgICAgICAgICBmZWF0dXJlcyA9IG5ldyBXZWJTZXJ2aWNlRmVhdHVyZUxpc3QoKTsKKyAgICAgICAgICAgIGlmKG10b21mZWF0dXJlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmVhdHVyZXMuYWRkKG10b21mZWF0dXJlKTsgLy8gdGhpcyB3aW5zIG92ZXIgTVRPTSBzZXR0aW5nIGluIGJpbmRpbmdJRAorICAgICAgICAgICAgZmVhdHVyZXMuYWRkQWxsKGJpbmRpbmdJRC5jcmVhdGVCdWlsdGluRmVhdHVyZUxpc3QoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmluZGluZ0lELmNyZWF0ZUJpbmRpbmcoZmVhdHVyZXMudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrTXRvbUNvbmZsaWN0KE1UT01GZWF0dXJlIGxocywgTVRPTUZlYXR1cmUgcmhzKSB7CisgICAgICAgIGlmKGxocz09bnVsbCB8fCByaHM9PW51bGwpICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBsaHMuaXNFbmFibGVkKCkgXiByaHMuaXNFbmFibGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSlNSLTEwOSBkZWZpbmVzIHNob3J0LWZvcm0gdG9rZW5zIGZvciBzdGFuZGFyZCBiaW5kaW5nIElkcy4gVGhlc2UgYXJlCisgICAgICogdXNlZCBvbmx5IGluIERELiBTbyBzdGFuZCBhbG9uZSBkZXBsb3ltZW50IGRlc2NpcnB0b3Igc2hvdWxkIGFsc28gaG9ub3IKKyAgICAgKiB0aGVzZSB0b2tlbnMuIFRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSB0b2tlbnMgdG8gQVBJJ3Mgc3RhbmRhcmQKKyAgICAgKiBiaW5kaW5nIGlkcworICAgICAqCisgICAgICogQHBhcmFtIGxleGljYWwgYmluZGluZyBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBERC4gQWx3YXlzIG5vdCBudWxsCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgY29ycmVzcG9uZGluZyBBUEkncyBiaW5kaW5nIElEIG9yIHRoZSBzYW1lIGxleGljYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsIFN0cmluZyBnZXRCaW5kaW5nSWRGb3JUb2tlbihATm90TnVsbCBTdHJpbmcgbGV4aWNhbCkgeworICAgICAgICBpZiAobGV4aWNhbC5lcXVhbHMoIiMjU09BUDExX0hUVFAiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsKKyAgICAgICAgfSBlbHNlIGlmIChsZXhpY2FsLmVxdWFscygiIyNTT0FQMTFfSFRUUF9NVE9NIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORzsKKyAgICAgICAgfSBlbHNlIGlmIChsZXhpY2FsLmVxdWFscygiIyNTT0FQMTJfSFRUUCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HOworICAgICAgICB9IGVsc2UgaWYgKGxleGljYWwuZXF1YWxzKCIjI1NPQVAxMl9IVFRQX01UT00iKSkgeworICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HOworICAgICAgICB9IGVsc2UgaWYgKGxleGljYWwuZXF1YWxzKCIjI1hNTF9IVFRQIikpIHsKKyAgICAgICAgICAgIHJldHVybiBIVFRQQmluZGluZy5IVFRQX0JJTkRJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxleGljYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyAiQWRhcHRlciIuCisgICAgICoKKyAgICAgKiA8UD4KKyAgICAgKiBOb3JtYWxseSAnQScgd291bGQgYmUge0BsaW5rIEh0dHBBZGFwdGVyfSBvciBzb21lIGRlcml2ZWQgY2xhc3MuCisgICAgICogQnV0IHRoZSBwYXJzZXIgZG9lc24ndCByZXF1aXJlIHRoYXQgdG8gYmUgb2YgYW55IHBhcnRpY3VsYXIgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBZGFwdGVyRmFjdG9yeTxBPiB7CisgICAgICAgIEEgY3JlYXRlQWRhcHRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHVybFBhdHRlcm4sIFdTRW5kcG9pbnQ8Pz4gZW5kcG9pbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9yIHtAbGluayBAV2ViU2VydmljZVByb3ZpZGVyfSBhbm5vdGF0aW9uCisgICAgICogdG8gc2VlIGlmIGl0IHBvaW50cyB0byBhbnkgV1NETC4gSWYgc28sIHJldHVybnMgdGhlIHtAbGluayBTRERvY3VtZW50U291cmNlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIFRoZSBwb2ludGVkIFdTREwsIGlmIGFueS4gT3RoZXJ3aXNlIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBTRERvY3VtZW50U291cmNlIGdldFByaW1hcnlXU0RMKFhNTFN0cmVhbVJlYWRlciB4c3IsIEF0dHJpYnV0ZXMgYXR0cnMsIENsYXNzPD8+IGltcGxlbWVudG9yQ2xhc3MpIHsKKworICAgICAgICBTdHJpbmcgd3NkbEZpbGUgPSBnZXRBdHRyaWJ1dGUoYXR0cnMsIEFUVFJfV1NETCk7CisgICAgICAgIGlmICh3c2RsRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB3c2RsRmlsZSA9IEVuZHBvaW50RmFjdG9yeS5nZXRXc2RsTG9jYXRpb24oaW1wbGVtZW50b3JDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod3NkbEZpbGUhPW51bGwpIHsKKyAgICAgICAgICAgIGlmICghd3NkbEZpbGUuc3RhcnRzV2l0aChKQVhXU19XU0RMX0REX0RJUikpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiSWdub3Jpbmcgd3Jvbmcgd3NkbD0iK3dzZGxGaWxlKyIuIEl0IHNob3VsZCBzdGFydCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICtKQVhXU19XU0RMX0REX0RJUgorICAgICAgICAgICAgICAgICAgICAgICAgKyIuIEdvaW5nIHRvIGdlbmVyYXRlIGFuZCBwdWJsaXNoIGEgbmV3IFdTREwuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFVSTCB3c2RsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3c2RsID0gbG9hZGVyLmdldFJlc291cmNlKCcvJyt3c2RsRmlsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NhdGFibGVXZWJTZXJ2aWNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJNZXNzYWdlcy5SVU5USU1FX1BBUlNFUl9XU0RMX05PVF9GT1VORCh3c2RsRmlsZSksIGUsIHhzciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdzZGwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NhdGFibGVXZWJTZXJ2aWNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJNZXNzYWdlcy5SVU5USU1FX1BBUlNFUl9XU0RMX05PVF9GT1VORCh3c2RsRmlsZSksIHhzciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0REb2N1bWVudFNvdXJjZSBkb2NJbmZvID0gZG9jcy5nZXQod3NkbC50b0V4dGVybmFsRm9ybSgpKTsKKyAgICAgICAgICAgIGFzc2VydCBkb2NJbmZvICE9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZG9jSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEVudGl0eVJlc29sdmVyfSB0aGF0IGNvbnN1bHRzIHtAY29kZSAvV0VCLUlORi9qYXgtd3MtY2F0YWxvZy54bWx9LgorICAgICAqLworICAgIHByaXZhdGUgRW50aXR5UmVzb2x2ZXIgY3JlYXRlRW50aXR5UmVzb2x2ZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gWG1sVXRpbC5jcmVhdGVFbnRpdHlSZXNvbHZlcihsb2FkZXIuZ2V0Q2F0YWxvZ0ZpbGUoKSk7CisgICAgICAgIH0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGUoQXR0cmlidXRlcyBhdHRycywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUobmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFFOYW1lIGdldFFOYW1lQXR0cmlidXRlKEF0dHJpYnV0ZXMgYXR0cnMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEF0dHJpYnV0ZShhdHRycywgbmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFFOYW1lLnZhbHVlT2YodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb25FbXB0eUF0dHJpYnV0ZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBBdHRyaWJ1dGVzIGF0dHJzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRBdHRyaWJ1dGUoYXR0cnMsIG5hbWUpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBmYWlsV2l0aExvY2FsTmFtZSgKKyAgICAgICAgICAgICAgICAicnVudGltZS5wYXJzZXIuaW52YWxpZEF0dHJpYnV0ZVZhbHVlIiwKKyAgICAgICAgICAgICAgICByZWFkZXIsCisgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWFuZGF0b3J5QXR0cmlidXRlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEF0dHJpYnV0ZXMgYXR0cnMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEF0dHJpYnV0ZShhdHRycywgbmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsV2l0aExvY2FsTmFtZSgicnVudGltZS5wYXJzZXIubWlzc2luZy5hdHRyaWJ1dGUiLCByZWFkZXIsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWxXaXRoTG9jYWxOYW1lKCJydW50aW1lLnBhcnNlci5taXNzaW5nLmF0dHJpYnV0ZSIsIHJlYWRlciwgbmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgZmFpbFdpdGhMb2NhbE5hbWUoCisgICAgICAgICAgICAgICAgInJ1bnRpbWUucGFyc2VyLmludmFsaWRBdHRyaWJ1dGVWYWx1ZSIsCisgICAgICAgICAgICAgICAgcmVhZGVyLAorICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGhhbmRsZXIgYW5kIHJvbGUgaW5mb3JtYXRpb24gYW5kIHNldHMgaXQKKyAgICAgKiBvbiB0aGUge0BsaW5rIFdTQmluZGluZ30uCisgICAgICogQHJldHVybiB0cnVlIGlmIDxoYW5kbGVyLWNoYWlucz4gZWxlbWVudCBwcmVzZW50IGluIERECisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2V0SGFuZGxlcnNBbmRSb2xlcyhXU0JpbmRpbmcgYmluZGluZywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnROYW1lKSB7CisKKyAgICAgICAgaWYgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgPT0KKyAgICAgICAgICAgIFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCB8fAorICAgICAgICAgICAgIXJlYWRlci5nZXROYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgSGFuZGxlckNoYWluc01vZGVsLlFOQU1FX0hBTkRMRVJfQ0hBSU5TKSkgeworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBIYW5kbGVyQW5ub3RhdGlvbkluZm8gaGFuZGxlckluZm8gPSBIYW5kbGVyQ2hhaW5zTW9kZWwucGFyc2VIYW5kbGVyRmlsZSgKKyAgICAgICAgICAgIHJlYWRlciwgY2xhc3NMb2FkZXIsc2VydmljZU5hbWUsIHBvcnROYW1lLCBiaW5kaW5nKTsKKworICAgICAgICBiaW5kaW5nLnNldEhhbmRsZXJDaGFpbihoYW5kbGVySW5mby5nZXRIYW5kbGVycygpKTsKKyAgICAgICAgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgeworICAgICAgICAgICAgKChTT0FQQmluZGluZyliaW5kaW5nKS5zZXRSb2xlcyhoYW5kbGVySW5mby5nZXRSb2xlcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1vdmUgcGFzdCA8L2hhbmRsZXItY2hhaW5zPgorICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRDb250ZW50KHJlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBlbnN1cmVOb0NvbnRlbnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgeworICAgICAgICAgICAgZmFpbCgicnVudGltZS5wYXJzZXIudW5leHBlY3RlZENvbnRlbnQiLCByZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZhaWwoU3RyaW5nIGtleSwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwga2V5ICsgcmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpKTsKKyAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKAorICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhyZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRMaW5lTnVtYmVyKCkpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmFpbFdpdGhGdWxsTmFtZShTdHJpbmcga2V5LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigKKyAgICAgICAgICAgIGtleSwKKyAgICAgICAgICAgIHJlYWRlci5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgIHJlYWRlci5nZXROYW1lKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBmYWlsV2l0aExvY2FsTmFtZShTdHJpbmcga2V5LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigKKyAgICAgICAgICAgIGtleSwKKyAgICAgICAgICAgIHJlYWRlci5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZhaWxXaXRoTG9jYWxOYW1lKAorICAgICAgICBTdHJpbmcga2V5LAorICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLAorICAgICAgICBTdHJpbmcgYXJnKSB7CisgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigKKyAgICAgICAgICAgIGtleSwKKyAgICAgICAgICAgIHJlYWRlci5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgIHJlYWRlci5nZXRMb2NhbE5hbWUoKSwKKyAgICAgICAgICAgIGFyZyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgdHJ1ZSwgY2xhc3NMb2FkZXIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInJ1bnRpbWUucGFyc2VyLmNsYXNzTm90Rm91bmQiLAorICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGNsYXNzIG9mIHRoZSBnaXZlbiBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHhzcgorICAgICAqICAgICAgVXNlZCB0byByZXBvcnQgdGhlIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpZiB0aGVyZSdzIGFueSBlcnJvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzIGdldEltcGxlbWVudG9yQ2xhc3MoU3RyaW5nIG5hbWUsIFhNTFN0cmVhbVJlYWRlciB4c3IpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIHRydWUsIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IExvY2F0YWJsZVdlYlNlcnZpY2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgU2VydmVyTWVzc2FnZXMuUlVOVElNRV9QQVJTRVJfQ0xBU1NfTk9UX0ZPVU5EKG5hbWUpLCBlLCB4c3IgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1JVTlRJTUUgPQorICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4LXdzL3JpL3J1bnRpbWUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfV1NETF9ERF9ESVIgPSAiV0VCLUlORi93c2RsIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRU5EUE9JTlRTID0KKyAgICAgICAgbmV3IFFOYW1lKE5TX1JVTlRJTUUsICJlbmRwb2ludHMiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0VORFBPSU5UID0KKyAgICAgICAgbmV3IFFOYW1lKE5TX1JVTlRJTUUsICJlbmRwb2ludCIpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJTSU9OID0gInZlcnNpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lNUExFTUVOVEFUSU9OID0gImltcGxlbWVudGF0aW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1dTREwgPSAid3NkbCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRVJWSUNFID0gInNlcnZpY2UiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUE9SVCA9ICJwb3J0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VSTF9QQVRURVJOID0gInVybC1wYXR0ZXJuIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VOQUJMRV9NVE9NID0gImVuYWJsZS1tdG9tIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01UT01fVEhSRVNIT0xEX1ZBTFVFID0gIm10b20tdGhyZXNob2xkLXZhbHVlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0JJTkRJTkcgPSAiYmluZGluZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMVUVfVkVSU0lPTl8xXzAgPSAiMi4wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigKKyAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4gKyAiLnNlcnZlci5odHRwIik7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9IdHRwQWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvSHR0cEFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAyNTBjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvSHR0cEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDU0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwOworCisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5Qcm9wZXJ0eVNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5FeGNlcHRpb25IYXNNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvZGVjOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuQWJzdHJhY3RTZXJ2ZXJBc3luY1RyYW5zcG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkFkYXB0ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5Eb2N1bWVudEFkZHJlc3NSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlBvcnRBZGRyZXNzUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5TRERvY3VtZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuU2VydmljZURlZmluaXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5UcmFuc3BvcnRCYWNrQ2hhbm5lbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5Xc3NlcnZsZXRNZXNzYWdlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuU2VydmVyUnRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlVuc3VwcG9ydGVkTWVkaWFFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CeXRlQXJyYXlCdWZmZXI7CisKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiB7QGxpbmsgQWRhcHRlcn0gdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBpbiBIVFRQLgorICoKKyAqIDxwPgorICogVGhpcyBvYmplY3QgYWxzbyBhc3NpZ25zIHVuaXF1ZSBxdWVyeSBzdHJpbmcgKHN1Y2ggYXMgInhzZD0xIikgdG8KKyAqIGVhY2gge0BsaW5rIFNERG9jdW1lbnR9IHNvIHRoYXQgdGhleSBjYW4gYmUgc2VydmVkIGJ5IEhUVFAgR0VUIHJlcXVlc3RzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8SHR0cEFkYXB0ZXIuSHR0cFRvb2xraXQ+IHsKKworICAgIC8qKgorICAgICAqIHtAbGluayBTRERvY3VtZW50fXMga2V5ZWQgYnkgdGhlIHF1ZXJ5IHN0cmluZyBsaWtlICI/YWJjIi4KKyAgICAgKiBVc2VkIGZvciBzZXJ2aW5nIGRvY3VtZW50cyB2aWEgSFRUUCBHRVQuCisgICAgICoKKyAgICAgKiBFbXB0eSBpZiB0aGUgZW5kcG9pbnQgZG9lc24ndCBoYXZlIHtAbGluayBTZXJ2aWNlRGVmaW5pdGlvbn0uCisgICAgICogUmVhZC1vbmx5LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNYXA8U3RyaW5nLFNERG9jdW1lbnQ+IHdzZGxzOworCisgICAgLyoqCisgICAgICogUmV2ZXJzZSBtYXAgb2Yge0BsaW5rICN3c2Rsc30uIFJlYWQtb25seS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWFwPFNERG9jdW1lbnQsU3RyaW5nPiByZXZXc2RsczsKKworICAgIHB1YmxpYyBmaW5hbCBIdHRwQWRhcHRlckxpc3Q8PyBleHRlbmRzIEh0dHBBZGFwdGVyPiBvd25lcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb25lIHtAbGluayBIdHRwQWRhcHRlcn0gdGhhdCBkb2VzIG5vdCBrbm93IG9mIGFueSBvdGhlcgorICAgICAqIHtAbGluayBIdHRwQWRhcHRlcn1zLgorICAgICAqCisgICAgICogVGhpcyBpcyBjb252ZW5pZW50IGZvciBjcmVhdGluZyBhbiB7QGxpbmsgSHR0cEFkYXB0ZXJ9IGZvciBhbiBlbnZpcm9ubWVudAorICAgICAqIHdoZXJlIHRoZXkgZG9uJ3Qga25vdyBlYWNoIG90aGVyIChzdWNoIGFzIEphdmFTRSBkZXBsb3ltZW50LikKKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmRwb2ludCB3ZWIgc2VydmljZSBlbmRwb2ludAorICAgICAqIEByZXR1cm4gc2luZ2UgYWRhcHRlciB0byBwcm9jZXNzIEhUVFAgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBBZGFwdGVyIGNyZWF0ZUFsb25lKFdTRW5kcG9pbnQgZW5kcG9pbnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUxpc3QoKS5jcmVhdGVBZGFwdGVyKCIiLCIiLGVuZHBvaW50KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSHR0cEFkYXB0ZXIoV1NFbmRwb2ludCBlbmRwb2ludCwgSHR0cEFkYXB0ZXJMaXN0PD8gZXh0ZW5kcyBIdHRwQWRhcHRlcj4gb3duZXIpIHsKKyAgICAgICAgc3VwZXIoZW5kcG9pbnQpOworICAgICAgICB0aGlzLm93bmVyID0gb3duZXI7CisKKyAgICAgICAgLy8gZmlsbCBpbiBXU0RMIG1hcAorICAgICAgICBTZXJ2aWNlRGVmaW5pdGlvbiBzZGVmID0gdGhpcy5lbmRwb2ludC5nZXRTZXJ2aWNlRGVmaW5pdGlvbigpOworICAgICAgICBpZihzZGVmPT1udWxsKSB7CisgICAgICAgICAgICB3c2RscyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgICAgICAgICByZXZXc2RscyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3c2RscyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU0REb2N1bWVudD4oKTsgIC8vIHdzZGw9MSAtLT4gRG9jCisgICAgICAgICAgICAvLyBTb3J0IFdTREwsIFNjaGVtYSBkb2N1bWVudHMgYmFzZWQgb24gU3lzdGVtSWQgc28gdGhhdCB0aGUgc2FtZQorICAgICAgICAgICAgLy8gZG9jdW1lbnQgZ2V0cyB3c2RsPXggbWFwcGluZworICAgICAgICAgICAgTWFwPFN0cmluZywgU0REb2N1bWVudD4gc3lzdGVtSWRzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTRERvY3VtZW50PigpOworICAgICAgICAgICAgZm9yIChTRERvY3VtZW50IHNkZCA6IHNkZWYpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2RkID09IHNkZWYuZ2V0UHJpbWFyeSgpKSB7IC8vIE5vIHNvcnRpbmcgZm9yIFByaW1hcnkgV1NETAorICAgICAgICAgICAgICAgICAgICB3c2Rscy5wdXQoIndzZGwiLCBzZGQpOworICAgICAgICAgICAgICAgICAgICB3c2Rscy5wdXQoIldTREwiLCBzZGQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkcy5wdXQoc2RkLmdldFVSTCgpLnRvU3RyaW5nKCksIHNkZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgd3NkbG51bSA9IDE7CisgICAgICAgICAgICBpbnQgeHNkbnVtID0gMTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU0REb2N1bWVudD4gZSA6IHN5c3RlbUlkcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgU0REb2N1bWVudCBzZGQgPSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHNkZC5pc1dTREwoKSkgeworICAgICAgICAgICAgICAgICAgICB3c2Rscy5wdXQoIndzZGw9Iisod3NkbG51bSsrKSxzZGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2RkLmlzU2NoZW1hKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3NkbHMucHV0KCJ4c2Q9IisoeHNkbnVtKyspLHNkZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXZXc2RscyA9IG5ldyBIYXNoTWFwPFNERG9jdW1lbnQsU3RyaW5nPigpOyAgICAvLyBEb2MgLS0+IHdzZGw9MQorICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsU0REb2N1bWVudD4gZSA6IHdzZGxzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWUuZ2V0S2V5KCkuZXF1YWxzKCJXU0RMIikpIHsgICAgICAgICAgIC8vIG1hcCBEb2MgLS0+IHdzZGwsIG5vdCBXU0RMCisgICAgICAgICAgICAgICAgICAgIHJldldzZGxzLnB1dChlLmdldFZhbHVlKCksZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIEh0dHBUb29sa2l0IGNyZWF0ZVRvb2xraXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSHR0cFRvb2xraXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyB0aGUgaW5jb21pbmcgSFRUUCBjb25uZWN0aW9uIGFuZCBkaXNwYXRjaGVzCisgICAgICogaXQgdG8gSkFYLVdTLiBUaGlzIG1ldGhvZCByZXR1cm5zIHdoZW4gSkFYLVdTIGNvbXBsZXRlcworICAgICAqIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgYW5kIHRoZSB3aG9sZSByZXBseSBpcyB3cml0dGVuCisgICAgICogdG8ge0BsaW5rIFdTSFRUUENvbm5lY3Rpb259LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgbG93ZXItbGV2ZWwgSFRUUCBzdGFjaywKKyAgICAgKiBhbmQgImNvbm5lY3Rpb24iIGhlcmUgaXMgYW4gSFRUUCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVG8gcG9wdWxhdGUgYSByZXF1ZXN0IHtAbGluayBQYWNrZXR9IHdpdGggbW9yZSBpbmZvLAorICAgICAqIGRlZmluZSB7QGxpbmsgUHJvcGVydHlTZXQuUHJvcGVydHkgcHJvcGVydGllc30gb24KKyAgICAgKiB7QGxpbmsgV1NIVFRQQ29ubmVjdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB0byByZWNlaXZlL3NlbmQgSFRUUCBtZXNzYWdlcyBmb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnRzCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIEkvTyBlcnJvcnMgaGFwcGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlKEBOb3ROdWxsIFdTSFRUUENvbm5lY3Rpb24gY29ubmVjdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFRvb2xraXQgdGsgPSBwb29sLnRha2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRrLmhhbmRsZShjb25uZWN0aW9uKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHBvb2wucmVjeWNsZSh0ayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb24KKyAgICAgKiBAcGFyYW0gY29kZWMKKyAgICAgKiBAcmV0dXJuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgRXhjZXB0aW9uSGFzTWVzc2FnZSBleGNlcHRpb24gdGhhdCBjb250YWlucyBwYXJ0aWN1bGFyIGZhdWx0IG1lc3NhZ2UKKyAgICAgKiAgICAgICAgIFVuc3VwcG9ydGVkTWVkaWFFeGNlcHRpb24gdG8gaW5kaWNhdGUgdG8gc2VuZCA0MTUgZXJyb3IgY29kZQorICAgICAqLworICAgIHByaXZhdGUgUGFja2V0IGRlY29kZVBhY2tldChATm90TnVsbCBXU0hUVFBDb25uZWN0aW9uIGNvbiwgQE5vdE51bGwgQ29kZWMgY29kZWMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdCA9IGNvbi5nZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjb24uZ2V0SW5wdXQoKTsKKyAgICAgICAgUGFja2V0IHBhY2tldCA9IG5ldyBQYWNrZXQoKTsKKyAgICAgICAgcGFja2V0LnNvYXBBY3Rpb24gPSBjb24uZ2V0UmVxdWVzdEhlYWRlcigiU09BUEFjdGlvbiIpOworICAgICAgICBwYWNrZXQud2FzVHJhbnNwb3J0U2VjdXJlID0gY29uLmlzU2VjdXJlKCk7CisgICAgICAgIHBhY2tldC5hY2NlcHRhYmxlTWltZVR5cGVzID0gY29uLmdldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIpOworICAgICAgICBwYWNrZXQuYWRkU2F0ZWxsaXRlKGNvbik7CisgICAgICAgIHBhY2tldC50cmFuc3BvcnRCYWNrQ2hhbm5lbCA9IG5ldyBPbmV3YXkoY29uKTsKKyAgICAgICAgcGFja2V0LndlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUgPSBjb24uZ2V0V2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZSgpOworCisgICAgICAgIGlmIChkdW1wKSB7CisgICAgICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYnVmID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigpOworICAgICAgICAgICAgYnVmLndyaXRlKGluKTsKKyAgICAgICAgICAgIGR1bXAoYnVmLCAiSFRUUCByZXF1ZXN0IiwgY29uLmdldFJlcXVlc3RIZWFkZXJzKCkpOworICAgICAgICAgICAgaW4gPSBidWYubmV3SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy5kZWNvZGUoaW4sIGN0LCBwYWNrZXQpOworICAgICAgICByZXR1cm4gcGFja2V0OworICAgIH0KKworCisKKworICAgIHByaXZhdGUgdm9pZCBlbmNvZGVQYWNrZXQoQE5vdE51bGwgUGFja2V0IHBhY2tldCwgQE5vdE51bGwgV1NIVFRQQ29ubmVjdGlvbiBjb24sIEBOb3ROdWxsIENvZGVjIGNvZGVjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY29uLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gaXMgYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlIHJlc3BvbnNlTWVzc2FnZSA9IHBhY2tldC5nZXRNZXNzYWdlKCk7CisgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFjb24uaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgcmVzcG9uc2UgY29kZSBpZiBub3QgYWxyZWFkeSBzZXQKKyAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgNDE1IG1heSBoYXZlIGJlZW4gc2V0IGVhcmxpZXIgZm9yIFVuc3VwcG9ydGVkIENvbnRlbnQtVHlwZQorICAgICAgICAgICAgICAgIGlmIChjb24uZ2V0U3RhdHVzKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29uLnNldFN0YXR1cyhXU0hUVFBDb25uZWN0aW9uLk9ORVdBWSk7CisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHJlc3BvbnNlIGNoYW5uZWwgbm93CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29uLmdldE91dHB1dCgpLmNsb3NlKCk7IC8vIG5vIHBheWxvYWQKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb24uZ2V0U3RhdHVzKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhcHBsaWF0aW9uIGRpZG4ndCBzZXQgdGhlIHN0YXR1cyBjb2RlLAorICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCBvbmUuCisgICAgICAgICAgICAgICAgY29uLnNldFN0YXR1cyhyZXNwb25zZU1lc3NhZ2UuaXNGYXVsdCgpCisgICAgICAgICAgICAgICAgICAgICAgICA/IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfSU5URVJOQUxfRVJST1IKKyAgICAgICAgICAgICAgICAgICAgICAgIDogSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9PSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29kZWMuZ2V0U3RhdGljQ29udGVudFR5cGUocGFja2V0KTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29uLnNldENvbnRlbnRUeXBlUmVzcG9uc2VIZWFkZXIoY29udGVudFR5cGUuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gY29uLmdldFByb3RvY29sKCkuY29udGFpbnMoIjEuMSIpID8gY29uLmdldE91dHB1dCgpIDogbmV3IEh0dHAxME91dHB1dFN0cmVhbShjb24pOworICAgICAgICAgICAgICAgIGlmIChkdW1wKSB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBidWYgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGVjLmVuY29kZShwYWNrZXQsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGR1bXAoYnVmLCAiSFRUUCByZXNwb25zZSAiICsgY29uLmdldFN0YXR1cygpLCBjb24uZ2V0UmVzcG9uc2VIZWFkZXJzKCkpOworICAgICAgICAgICAgICAgICAgICBidWYud3JpdGVUbyhvcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZWMuZW5jb2RlKHBhY2tldCwgb3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYnVmID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29kZWMuZW5jb2RlKHBhY2tldCwgYnVmKTsKKyAgICAgICAgICAgICAgICBjb24uc2V0Q29udGVudFR5cGVSZXNwb25zZUhlYWRlcihjb250ZW50VHlwZS5nZXRDb250ZW50VHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVtcCkgeworICAgICAgICAgICAgICAgICAgICBkdW1wKGJ1ZiwgIkhUVFAgcmVzcG9uc2UgIiArIGNvbi5nZXRTdGF0dXMoKSwgY29uLmdldFJlc3BvbnNlSGVhZGVycygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gY29uLmdldE91dHB1dCgpOworICAgICAgICAgICAgICAgIGJ1Zi53cml0ZVRvKG9zKTsKKyAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW52b2tlQXN5bmMoZmluYWwgV1NIVFRQQ29ubmVjdGlvbiBjb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEh0dHBUb29sa2l0IHRrID0gcG9vbC50YWtlKCk7CisgICAgICAgIGZpbmFsIFBhY2tldCByZXF1ZXN0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVxdWVzdCA9IGRlY29kZVBhY2tldChjb24sIHRrLmNvZGVjKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb25IYXNNZXNzYWdlIGUpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICBQYWNrZXQgcmVzcG9uc2UgPSBuZXcgUGFja2V0KCk7CisgICAgICAgICAgICByZXNwb25zZS5zZXRNZXNzYWdlKGUuZ2V0RmF1bHRNZXNzYWdlKCkpOworICAgICAgICAgICAgZW5jb2RlUGFja2V0KHJlc3BvbnNlLCBjb24sIHRrLmNvZGVjKTsKKyAgICAgICAgICAgIHBvb2wucmVjeWNsZSh0ayk7CisgICAgICAgICAgICBjb24uY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaChVbnN1cHBvcnRlZE1lZGlhRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICBQYWNrZXQgcmVzcG9uc2UgPSBuZXcgUGFja2V0KCk7CisgICAgICAgICAgICBjb24uc2V0U3RhdHVzKFdTSFRUUENvbm5lY3Rpb24uVU5TVVBQT1JURURfTUVESUEpOworICAgICAgICAgICAgZW5jb2RlUGFja2V0KHJlc3BvbnNlLCBjb24sIHRrLmNvZGVjKTsKKyAgICAgICAgICAgIHBvb2wucmVjeWNsZSh0ayk7CisgICAgICAgICAgICBjb24uY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVuZHBvaW50LnNjaGVkdWxlKHJlcXVlc3QsIG5ldyBXU0VuZHBvaW50LkNvbXBsZXRpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGlvbihATm90TnVsbCBQYWNrZXQgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlUGFja2V0KHJlc3BvbnNlLCBjb24sIHRrLmNvZGVjKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBpb2UuZ2V0TWVzc2FnZSgpLCBpb2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBvb2wucmVjeWNsZSh0ayk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5eworICAgICAgICAgICAgICAgICAgICBjb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIGNsYXNzIEFzeW5jVHJhbnNwb3J0IGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBc3luY1RyYW5zcG9ydDxXU0hUVFBDb25uZWN0aW9uPiB7CisKKyAgICAgICAgcHVibGljIEFzeW5jVHJhbnNwb3J0KCkgeworICAgICAgICAgICAgc3VwZXIoZW5kcG9pbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlQXN5bmMoV1NIVFRQQ29ubmVjdGlvbiBjb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGUoY29uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVuY29kZVBhY2tldChXU0hUVFBDb25uZWN0aW9uIGNvbiwgQE5vdE51bGwgUGFja2V0IHBhY2tldCwgQE5vdE51bGwgQ29kZWMgY29kZWMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBIdHRwQWRhcHRlci50aGlzLmVuY29kZVBhY2tldChwYWNrZXQsIGNvbiwgY29kZWMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEBOdWxsYWJsZSBTdHJpbmcgZ2V0QWNjZXB0YWJsZU1pbWVUeXBlcyhXU0hUVFBDb25uZWN0aW9uIGNvbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgQE51bGxhYmxlIFRyYW5zcG9ydEJhY2tDaGFubmVsIGdldFRyYW5zcG9ydEJhY2tDaGFubmVsKFdTSFRUUENvbm5lY3Rpb24gY29uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9uZXdheShjb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEBOb3ROdWxsCisgICAgICAgIFByb3BlcnR5U2V0IGdldFByb3BlcnR5U2V0KFdTSFRUUENvbm5lY3Rpb24gY29uKSB7CisgICAgICAgICAgICByZXR1cm4gY29uOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEBOb3ROdWxsIFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUgZ2V0V2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZShXU0hUVFBDb25uZWN0aW9uIGNvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbi5nZXRXZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBjbGFzcyBPbmV3YXkgaW1wbGVtZW50cyBUcmFuc3BvcnRCYWNrQ2hhbm5lbCB7CisgICAgICAgIFdTSFRUUENvbm5lY3Rpb24gY29uOworICAgICAgICBPbmV3YXkoV1NIVFRQQ29ubmVjdGlvbiBjb24pIHsKKyAgICAgICAgICAgIHRoaXMuY29uID0gY29uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgaWYoIWNvbi5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHJlc3BvbnNlIGNoYW5uZWwgbm93CisgICAgICAgICAgICAgICAgY29uLnNldFN0YXR1cyhXU0hUVFBDb25uZWN0aW9uLk9ORVdBWSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29uLmdldE91dHB1dCgpLmNsb3NlKCk7IC8vIG5vIHBheWxvYWQKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb24uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGNsYXNzIEh0dHBUb29sa2l0IGV4dGVuZHMgQWRhcHRlci5Ub29sa2l0IHsKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlKFdTSFRUUENvbm5lY3Rpb24gY29uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQYWNrZXQgcGFja2V0ID0gbmV3IFBhY2tldCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHBhY2tldCA9IGRlY29kZVBhY2tldChjb24sIGNvZGVjKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbkhhc01lc3NhZ2UgZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgICAgICBwYWNrZXQuc2V0TWVzc2FnZShlLmdldEZhdWx0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKFVuc3VwcG9ydGVkTWVkaWFFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgICAgICBjb24uc2V0U3RhdHVzKFdTSFRUUENvbm5lY3Rpb24uVU5TVVBQT1JURURfTUVESUEpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goU2VydmVyUnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFja2V0LmdldE1lc3NhZ2UoKSAhPSBudWxsICYmICFwYWNrZXQuZ2V0TWVzc2FnZSgpLmlzRmF1bHQoKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0ID0gaGVhZC5wcm9jZXNzKHBhY2tldCwgY29uLmdldFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LnRyYW5zcG9ydEJhY2tDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUludGVybmFsU2VydmVyRXJyb3IoY29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGNvbiwgY29kZWMpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbi5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcXVlcnkgc3RyaW5nIGlzIGZvciBtZXRhZGF0YSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXJ5CisgICAgICogICAgICBTdHJpbmcgbGlrZSAieHNkPTEiIG9yICJwZXJoYXBzPXNvbWUmYW1wO3VucmVsYXRlZD1xdWVyeSIuCisgICAgICogICAgICBDYW4gYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRydWUgZm9yIG1ldGFkYXRhIHJlcXVlc3RzCisgICAgICogICAgICAgICBmYWxzZSBmb3Igd2ViIHNlcnZpY2UgcmVxdWVzdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc01ldGFkYXRhUXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICAgIC8vIHdlIGludGVudGlvbmFsbHkgcmV0dXJuIHRydWUgZXZlbiBpZiBkb2N1bWVudHMgZG9uJ3QgZXhpc3QsCisgICAgICAgIC8vIHNvIHRoYXQgdGhleSBnZXQgNDA0LgorICAgICAgICByZXR1cm4gcXVlcnkgIT0gbnVsbCAmJiAocXVlcnkuZXF1YWxzKCJXU0RMIikgfHwgcXVlcnkuc3RhcnRzV2l0aCgid3NkbCIpIHx8IHF1ZXJ5LnN0YXJ0c1dpdGgoInhzZD0iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgb3V0IHRoZSBXU0RMIChhbmQgb3RoZXIgcmVmZXJlbmNlZCBkb2N1bWVudHMpCisgICAgICogaW4gcmVzcG9uc2UgdG8gdGhlIEdFVCByZXF1ZXN0cyB0byBVUkxzIGxpa2UgIj93c2RsIiBvciAiP3hzZD0yIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb24KKyAgICAgKiAgICAgIFRoZSBjb25uZWN0aW9uIHRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgc2VudC4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gYmFzZUFkZHJlc3MKKyAgICAgKiAgICAgIFRoZSByZXF1ZXN0ZWQgYmFzZSBVUkwgKHN1Y2ggYXMgImh0dHA6Ly9teWhvc3Q6MjA0NS9mb28vYmFyIikuCisgICAgICogICAgICBVc2VkIHRvIHJlZmVyZW5jZSBvdGhlciByZXNvdXJlcy4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gcXVlcnlTdHJpbmcKKyAgICAgKiAgICAgIFRoZSBxdWVyeSBzdHJpbmcgZ2l2ZW4gYnkgdGhlIGNsaWVudCAod2hpY2ggaW5kaWNhdGVzCisgICAgICogICAgICB3aGF0IGRvY3VtZW50IHRvIHNlcnZlLikgQ2FuIGJlIG51bGwgKGJ1dCBpdCBjYXVzZXMgYW4gNDA0IG5vdCBmb3VuZC4pCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gSS9PIGVycm9ycyBoYXBwZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdWJsaXNoV1NETChXU0hUVFBDb25uZWN0aW9uIGNvbiwgZmluYWwgU3RyaW5nIGJhc2VBZGRyZXNzLCBTdHJpbmcgcXVlcnlTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGEgYnVnIGluIGh0dHAgc2VydmVyLiBSZWFkIGFuZCBjbG9zZSBJbnB1dFN0cmVhbQorICAgICAgICAvLyBUT0RPIHJlbW92ZSBvbmNlIHRoZSBidWcgaXMgZml4ZWQgaW4gaHR0cCBzZXJ2ZXIKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjb24uZ2V0SW5wdXQoKTsKKyAgICAgICAgd2hpbGUoaW4ucmVhZCgpICE9IC0xKTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKworICAgICAgICBTRERvY3VtZW50IGRvYyA9IHdzZGxzLmdldChxdWVyeVN0cmluZyk7CisgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVOb3RGb3VuZEVycm9yUGFnZShjb24sIkludmFsaWQgUmVxdWVzdCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uLnNldFN0YXR1cyhIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX09LKTsKKyAgICAgICAgY29uLnNldENvbnRlbnRUeXBlUmVzcG9uc2VIZWFkZXIoInRleHQveG1sO2NoYXJzZXQ9dXRmLTgiKTsKKworICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBjb24uZ2V0UHJvdG9jb2woKS5jb250YWlucygiMS4xIikgPyBjb24uZ2V0T3V0cHV0KCkgOiBuZXcgSHR0cDEwT3V0cHV0U3RyZWFtKGNvbik7CisKKyAgICAgICAgZmluYWwgUG9ydEFkZHJlc3NSZXNvbHZlciBwb3J0QWRkcmVzc1Jlc29sdmVyID0gb3duZXIuY3JlYXRlUG9ydEFkZHJlc3NSZXNvbHZlcihiYXNlQWRkcmVzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzID0gcG9ydEFkZHJlc3NSZXNvbHZlci5nZXRBZGRyZXNzRm9yKGVuZHBvaW50LmdldFNlcnZpY2VOYW1lKCksIGVuZHBvaW50LmdldFBvcnROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICBhc3NlcnQgYWRkcmVzcyAhPSBudWxsOworICAgICAgICBEb2N1bWVudEFkZHJlc3NSZXNvbHZlciByZXNvbHZlciA9IG5ldyBEb2N1bWVudEFkZHJlc3NSZXNvbHZlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVBZGRyZXNzRm9yKEBOb3ROdWxsIFNERG9jdW1lbnQgY3VycmVudCwgQE5vdE51bGwgU0REb2N1bWVudCByZWZlcmVuY2VkKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIG1hcCBvbiBlbmRwb2ludCBzaG91bGQgYWNjb3VudCBmb3IgYWxsIFNERG9jdW1lbnQKKyAgICAgICAgICAgICAgICBhc3NlcnQgcmV2V3NkbHMuY29udGFpbnNLZXkocmVmZXJlbmNlZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MrJz8nKyByZXZXc2Rscy5nZXQocmVmZXJlbmNlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZG9jLndyaXRlVG8ocG9ydEFkZHJlc3NSZXNvbHZlciwgcmVzb2x2ZXIsIG9zKTsKKyAgICAgICAgb3MuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIVFRQLzEuMCBjb25uZWN0aW9ucyByZXF1aXJlIENvbnRlbnQtTGVuZ3RoLiBTbyBqdXN0IGJ1ZmZlciB0byBmaW5kIG91dAorICAgICAqIHRoZSBsZW5ndGguCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgSHR0cDEwT3V0cHV0U3RyZWFtIGV4dGVuZHMgQnl0ZUFycmF5QnVmZmVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXU0hUVFBDb25uZWN0aW9uIGNvbjsKKworICAgICAgICBIdHRwMTBPdXRwdXRTdHJlYW0oV1NIVFRQQ29ubmVjdGlvbiBjb24pIHsKKyAgICAgICAgICAgIHRoaXMuY29uID0gY29uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICBjb24uc2V0Q29udGVudExlbmd0aFJlc3BvbnNlSGVhZGVyKHNpemUoKSk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBjb24uZ2V0T3V0cHV0KCk7CisgICAgICAgICAgICB3cml0ZVRvKG9zKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVOb3RGb3VuZEVycm9yUGFnZShXU0hUVFBDb25uZWN0aW9uIGNvbiwgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbi5zZXRTdGF0dXMoSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9OT1RfRk9VTkQpOworICAgICAgICBjb24uc2V0Q29udGVudFR5cGVSZXNwb25zZUhlYWRlcigidGV4dC9odG1sOyBjaGFyc2V0PVVURi04Iik7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoY29uLmdldE91dHB1dCgpLCJVVEYtOCIpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxodG1sPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhlYWQ+PHRpdGxlPiIpOworICAgICAgICBvdXQucHJpbnRsbihXc3NlcnZsZXRNZXNzYWdlcy5TRVJWTEVUX0hUTUxfVElUTEUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RpdGxlPjwvaGVhZD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbihXc3NlcnZsZXRNZXNzYWdlcy5TRVJWTEVUX0hUTUxfTk9UX0ZPVU5EKG1lc3NhZ2UpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvYm9keT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvaHRtbD4iKTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlSW50ZXJuYWxTZXJ2ZXJFcnJvcihXU0hUVFBDb25uZWN0aW9uIGNvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uLnNldFN0YXR1cyhIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgY29uLmdldE91dHB1dCgpLmNsb3NlKCk7ICAgICAgICAvLyBTZXRzIHRoZSBzdGF0dXMgY29kZQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIER1bW15TGlzdCBleHRlbmRzIEh0dHBBZGFwdGVyTGlzdDxIdHRwQWRhcHRlcj4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEh0dHBBZGFwdGVyIGNyZWF0ZUh0dHBBZGFwdGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsUGF0dGVybiwgV1NFbmRwb2ludDw/PiBlbmRwb2ludCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwQWRhcHRlcihlbmRwb2ludCwgdGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcChCeXRlQXJyYXlCdWZmZXIgYnVmLCBTdHJpbmcgY2FwdGlvbiwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLVsiK2NhcHRpb24gKyJdLS0tIik7CisgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlciA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSSBkb24ndCB0aGluayB0aGlzIGlzIGxlZ2FsLCBidXQgbGV0J3MganVzdCBkdW1wIGl0LAorICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgcG9pbnQgb2YgdGhlIGR1bXAgaXMgdG8gdW5jb3ZlciBwcm9ibGVtcy4KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGhlYWRlci5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaGVhZGVyLmdldEtleSgpICsgIjogIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBidWYud3JpdGVUbyhTeXN0ZW0ub3V0KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIER1bXBzIHdoYXQgZ29lcyBhY3Jvc3MgSFRUUCB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGR1bXA7CisKKyAgICBzdGF0aWMgeworICAgICAgICBib29sZWFuIGI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiID0gQm9vbGVhbi5nZXRCb29sZWFuKEh0dHBBZGFwdGVyLmNsYXNzLmdldE5hbWUoKSsiLmR1bXAiKTsKKyAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICBiID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZHVtcCA9IGI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSHR0cEFkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvSHR0cEFkYXB0ZXJMaXN0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9IdHRwQWRhcHRlckxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUzMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvSHR0cEFkYXB0ZXJMaXN0LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLkRlcGxveW1lbnREZXNjcmlwdG9yUGFyc2VyLkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuV1NFbmRwb2ludDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlBvcnRBZGRyZXNzUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CisKKy8qKgorICogTGlzdCBvZiB7QGxpbmsgSHR0cEFkYXB0ZXJ9cyBjcmVhdGVkIHRvZ2V0aGVyLgorICoKKyAqIDxwPgorICogU29tZSBjYXNlcyBXQVIgZmlsZSBtYXkgY29udGFpbiBtdWx0aXBsZSBlbmRwb2ludHMgZm9yIHBvcnRzIGluIGEgV1NETC4KKyAqIElmIHRoZSBydW50aW1lIGtub3dzIHRoZXNlIHBvcnRzLCB0aGVpciBwb3J0IGFkZHJlc3NlcyBjYW4gYmUgcGF0Y2hlZC4KKyAqIFRoaXMgY2xhc3Mga2VlcHMgYSBsaXN0IG9mIHtAbGluayBIdHRwQWRhcHRlcn1zIGFuZCB1c2UgdGhhdCBpbmZvcm1hdGlvbiB0byBwYXRjaAorICogbXVsdGlwbGUgcG9ydCBhZGRyZXNzZXMuCisgKgorICogPHA+CisgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcyBuZWVkIHRvIG92ZXJyaWRlIHtAbGluayAjY3JlYXRlSHR0cEFkYXB0ZXJ9CisgKiBtZXRob2QgdG8gY3JlYXRlIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgSHR0cEFkYXB0ZXJ9LgorICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBIdHRwQWRhcHRlckxpc3Q8VCBleHRlbmRzIEh0dHBBZGFwdGVyPiBleHRlbmRzIEFic3RyYWN0TGlzdDxUPiBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5PFQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8VD4gYWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UG9ydEluZm8sIFN0cmluZz4gYWRkcmVzc01hcCA9IG5ldyBIYXNoTWFwPFBvcnRJbmZvLCBTdHJpbmc+KCk7CisKKyAgICAvLyBUT0RPOiBkb2N1bWVudGVkIGJlY2F1c2UgaXQncyB1c2VkIGJ5IEFTCisgICAgcHVibGljIFQgY3JlYXRlQWRhcHRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHVybFBhdHRlcm4sIFdTRW5kcG9pbnQ8Pz4gZW5kcG9pbnQpIHsKKyAgICAgICAgVCB0ID0gY3JlYXRlSHR0cEFkYXB0ZXIobmFtZSwgdXJsUGF0dGVybiwgZW5kcG9pbnQpOworICAgICAgICBhZGFwdGVycy5hZGQodCk7CisgICAgICAgIFdTRExQb3J0IHBvcnQgPSBlbmRwb2ludC5nZXRQb3J0KCk7CisgICAgICAgIGlmIChwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gbmV3IFBvcnRJbmZvKHBvcnQuZ2V0T3duZXIoKS5nZXROYW1lKCkscG9ydC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgYWRkcmVzc01hcC5wdXQocG9ydEluZm8sIGdldFZhbGlkUGF0aCh1cmxQYXR0ZXJuKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb25zIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBvbmUgdG8gY3JlYXRlIGEgY29uY3JldGUgY2xhc3MKKyAgICAgKiBvZiBIdHRwQWRhcHRlcgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUIGNyZWF0ZUh0dHBBZGFwdGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsUGF0dGVybiwgV1NFbmRwb2ludDw/PiBlbmRwb2ludCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHVybFBhdHRlcm4gd2l0aG91dCAiLyoiCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsaWRQYXRoKEBOb3ROdWxsIFN0cmluZyB1cmxQYXR0ZXJuKSB7CisgICAgICAgIGlmICh1cmxQYXR0ZXJuLmVuZHNXaXRoKCIvKiIpKSB7CisgICAgICAgICAgICByZXR1cm4gdXJsUGF0dGVybi5zdWJzdHJpbmcoMCwgdXJsUGF0dGVybi5sZW5ndGgoKSAtIDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHVybFBhdHRlcm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgUG9ydEFkZHJlc3NSZXNvbHZlciB0aGF0IG1hcHMgcG9ydG5hbWUgdG8gaXRzIGFkZHJlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgUG9ydEFkZHJlc3NSZXNvbHZlciBjcmVhdGVQb3J0QWRkcmVzc1Jlc29sdmVyKGZpbmFsIFN0cmluZyBiYXNlQWRkcmVzcykgeworICAgICAgICByZXR1cm4gbmV3IFBvcnRBZGRyZXNzUmVzb2x2ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3NGb3IoQE5vdE51bGwgUU5hbWUgc2VydmljZU5hbWUsIEBOb3ROdWxsIFN0cmluZyBwb3J0TmFtZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB1cmxQYXR0ZXJuID0gYWRkcmVzc01hcC5nZXQobmV3IFBvcnRJbmZvKHNlcnZpY2VOYW1lLHBvcnROYW1lKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh1cmxQYXR0ZXJuID09IG51bGwpID8gbnVsbCA6IGJhc2VBZGRyZXNzK3VybFBhdHRlcm47CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisKKyAgICBwdWJsaWMgVCBnZXQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBhZGFwdGVycy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXJzLnNpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3J0SW5mbyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUU5hbWUgc2VydmljZU5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBvcnROYW1lOworCisgICAgICAgIFBvcnRJbmZvKEBOb3ROdWxsIFFOYW1lIHNlcnZpY2VOYW1lLCBATm90TnVsbCBTdHJpbmcgcG9ydE5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHBvcnRJbmZvKSB7CisgICAgICAgICAgICBpZiAocG9ydEluZm8gaW5zdGFuY2VvZiBQb3J0SW5mbykgeworICAgICAgICAgICAgICAgIFBvcnRJbmZvIHRoYXQgPSAoUG9ydEluZm8pcG9ydEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZU5hbWUuZXF1YWxzKHRoYXQuc2VydmljZU5hbWUpICYmIHRoaXMucG9ydE5hbWUuZXF1YWxzKHRoYXQucG9ydE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VydmljZU5hbWUuaGFzaENvZGUoKStwb3J0TmFtZS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvUmVzb3VyY2VMb2FkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL1Jlc291cmNlTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5NTFiMgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL1Jlc291cmNlTG9hZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFVzZWQgdG8gbG9jYXRlIHJlc291cmNlcyBmb3Ige0BsaW5rIERlcGxveW1lbnREZXNjcmlwdG9yUGFyc2VyfS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgYWxsb3dzIHtAbGluayBEZXBsb3ltZW50RGVzY3JpcHRvclBhcnNlcn0gdG8gYmUgdXNlZCBvdXRzaWRlIGEgc2VydmxldCBjb250YWluZXIsCisgKiBidXQgaXQgc3RpbGwgbmVlZHMgdG8gd29yayB3aXRoIGEgbGF5b3V0IHNpbWlsYXIgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAqIElmIHRoaXMgY2FuIGJlIGFic3RyYWN0ZWQgYXdheSBiZXR0ZXIsIHRoYXQgd291bGQgYmUgbmljZS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VMb2FkZXIgeworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgJ3BhdGgnCisgICAgICogdGhhdCByZXByZXNlbnRzIGEgdmlydHVhbCBsb2NhaW9uIG9mIGEgZmlsZSBpbnNpZGUgYSB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqICAgICAgRGVzaWdhbmF0ZXMgYW4gYWJzb2x1dGUgcGF0aCB3aXRoaW4gYW4gd2ViIGFwcGxpY2F0aW9uLCBzdWNoIGFzOgorICAgICAqICAgICAgJy9XRUItSU5GL3dlYi54bWwnIG9yIHNvbWUgc3VjaC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBhY3R1YWwgbG9jYXRpb24sIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjYXRhbG9nIFhNTCBmaWxlIHRoYXQgc2hvdWxkIGJlIGNvbnN1bHRlZCB3aGVuCisgICAgICogbG9hZGluZyByZXNvdXJjZXMgZnJvbSB0aGlzIHtAbGluayBSZXNvdXJjZUxvYWRlcn0uCisgICAgICovCisgICAgVVJMIGdldENhdGFsb2dGaWxlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG51bGwgaWYgdGhlIHBhdGggaXMgaW52YWxpZC4gZW1wdHkgaWYgdGhlIHBhdGggZGlkbid0IGNvbnRhaW4KKyAgICAgKiAgICAgIGFueSBlbnRyeSBpbiBpdC4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YXguc2VydmxldC5odHRwLlNlcnZsZXRDb250ZXh0I2dldFJlc291cmNlUGF0aHMoU3RyaW5nKQorICAgICAqLworICAgIFNldDxTdHJpbmc+IGdldFJlc291cmNlUGF0aHMoU3RyaW5nIHBhdGgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvV1NIVFRQQ29ubmVjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvV1NIVFRQQ29ubmVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODllMGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9XU0hUVFBDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHA7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5Qcm9wZXJ0eVNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlOworCitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogVGhlIHZpZXcgb2YgYW4gSFRUUCBleGNoYW5nZSBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIEpBWC1XUy4KKyAqCisgKiA8cD4KKyAqIERpZmZlcmVudCBIVFRQIHNlcnZlciBsYXllciB1c2VzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcworICogc28gdGhhdCBKQVgtV1MgY2FuIGJlIHNoaWVsZGVkIGZyb20gaW5kaXZpZHVhbGl0eSBvZiBzdWNoIGxheWVycy4KKyAqIFRoaXMgaXMgYW4gaW50ZXJmYWNlIGltcGxlbWVudGVkIGFzIGFuIGFic3RyYWN0IGNsYXNzLCBzbyB0aGF0CisgKiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEpBWC1XUyBSSSBjYW4gYWRkIG5ldyBtZXRob2RzLgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBleHRlbmRzIHtAbGluayBQcm9wZXJ0eVNldH0gc28gdGhhdCBhIHRyYW5zcG9ydCBjYW4KKyAqIGV4cG9zZSBpdHMgcHJvcGVydGllcyB0byB0aGUgYXBwbGlhdGlvbiBhbmQgcGlwZXMuIChUaGlzIG9iamVjdAorICogd2lsbCBiZSBhZGRlZCB0byB7QGxpbmsgUGFja2V0I2FkZFNhdGVsbGl0ZShQcm9wZXJ0eVNldCl9LikKKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NIVFRQQ29ubmVjdGlvbiBleHRlbmRzIFByb3BlcnR5U2V0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LPTIwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkVXQVk9MjAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEX01FRElBPTQxNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUxGT1JNRURfWE1MPTQwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlI9NTAwOworCisgICAgLyoqCisgICAgICogT3ZlcndyaXRlcyBhbGwgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyB3cml0dGVuIHRodXMgZmFyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUge0BsaW5rIE1hcH0sCisgICAgICogcmF0aGVyIHRoYW4gcmV0YWluaW5nIGEgcmVmZXJlbmNlLiBUaGUge0BsaW5rIE1hcH0gcGFzc2VkIGFzIGEKKyAgICAgKiBwYXJhbWV0ZXIgbWF5IGNoYW5nZSBhZnRlciB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCByZXBlYXRlZGx5LCBhbHRob3VnaCBpbiBub3JtYWwgdXNlCisgICAgICogY2FzZSB0aGF0J3MgcmFyZSAoc28gdGhlIGltcGxlbWVudGF0aW9uIGlzIGVuY291cmFnZSB0byB0YWtlCisgICAgICogYWR2YW50YWdlIG9mIHRoaXMgdXNhZ2UgcGF0dGVybiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLCBpZiBwb3NzaWJsZS4pCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJbml0aWFsbHksIG5vIGhlYWRlciBpcyBzZXQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyB1c3VhbGx5IGV4cG9zZWQgdG8ge0BsaW5rIFdlYlNlcnZpY2VDb250ZXh0fQorICAgICAqIGFzIHtAbGluayBQYWNrZXQjT1VUQk9VTkRfVFJBTlNQT1JUX0hFQURFUlN9LCBhbmQgdGh1cyBpdAorICAgICAqIHNob3VsZCBpZ25vcmUgPHR0PkNvbnRlbnQtVHlwZTwvdHQ+IGFuZCA8dHQ+Q29udGVudC1MZW5ndGg8L3R0PiBoZWFkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlcnMKKyAgICAgKiAgICAgIFNlZSB7QGxpbmsgSHR0cFVSTENvbm5lY3Rpb24jZ2V0SGVhZGVyRmllbGRzKCl9IGZvciB0aGUgZm9ybWF0LgorICAgICAqICAgICAgVGhpcyBwYXJhbWV0ZXIgbWF5IG5vdCBiZSBudWxsLCBidXQgc2luY2UgdGhlIHVzZXIgYXBwbGljYXRpb24KKyAgICAgKiAgICAgIGNvZGUgbWF5IGludm9rZSB0aGlzIG1ldGhvZCwgYSBncmFjZWZ1bCBlcnJvciBjaGVja2luZyB3aXRoCisgICAgICogICAgICBhbiBoZWxwZnVsIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHByb3ZpZGVkIGlmIGl0J3MgYWN0dWFsbHkgbnVsbC4KKyAgICAgKiBAc2VlICNzZXRDb250ZW50VHlwZVJlc3BvbnNlSGVhZGVyKFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZXNwb25zZUhlYWRlcnMoQE5vdE51bGwgTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+IGhlYWRlcnMpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPHR0PiJDb250ZW50LVR5cGUiPC90dD4gaGVhZGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBzZXQsIHRoaXMgbWV0aG9kIHdpbGwgb3ZlcndyaXRlCisgICAgICogdGhlIHByZXZpb3VzbHkgc2V0IHZhbHVlLiBJZiBub3QsIHRoaXMgbWV0aG9kIGFkZHMgaXQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgYW5kIHtAbGluayAjc2V0UmVzcG9uc2VIZWFkZXJzKE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+Pil9CisgICAgICogbWF5IGJlIGludm9rZWQgaW4gYW55IGFyYml0cmFyeSBvcmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgc3RyaW5ncyBsaWtlIDx0dD4iYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PVVURi04IjwvdHQ+IG9yCisgICAgICogICAgICA8dHQ+ImltYWdlL2pwZWciPC90dD4uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29udGVudFR5cGVSZXNwb25zZUhlYWRlcihATm90TnVsbCBTdHJpbmcgdmFsdWUpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgSFRUUCByZXNwb25zZSBjb2RlIGxpa2Uge0BsaW5rICNPS30uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBXaGlsZSBKQVgtV1MgcHJvY2Vzc2VzIGEge0BsaW5rIFdTSFRUUENvbm5lY3Rpb259LCBpdAorICAgICAqIHdpbGwgYXQgbGVhc3QgY2FsbCB0aGlzIG1ldGhvZCBvbmNlIHRvIHNldCBhIHZhbGlkIEhUVFAgcmVzcG9uc2UgY29kZS4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXMgKGZyb20gdXNlciBjb2RlKSwKKyAgICAgKiBzbyBkbyBub3QgY29uc2lkZXIgdGhlIHZhbHVlIHRvIGJlIGZpbmFsIHVudGlsIHtAbGluayAjZ2V0T3V0cHV0KCl9CisgICAgICogaXMgaW52b2tlZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxhc3QgdmFsdWUgc2V0IGJ5IHtAbGluayAjc2V0U3RhdHVzKGludCl9LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgaWYge0BsaW5rICNzZXRTdGF0dXMoaW50KX0gaGFzIG5vdCBiZWVuIGludm9rZWQgeWV0LAorICAgICAqICAgICAgcmV0dXJuIDAuCisgICAgICovCisgICAgLy8gSSBrbm93IHRoaXMgaXMgdWdseSBtZXRob2QhCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTdGF0dXMoKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zcG9ydCdzIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGF0IG1vc3Qgb25jZSBieSB0aGUgSkFYLVdTIFJJIHRvCisgICAgICogcmVhZCB0aGUgcmVxdWVzdCBib2R5LiBJZiB0aGVyZSdzIG5vIHJlcXVlc3QgYm9keSwgdGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IHtAbGluayBJbnB1dFN0cmVhbX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgc3RyZWFtIGZyb20gd2hpY2ggdGhlIHJlcXVlc3QgYm9keSB3aWxsIGJlIHJlYWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOb3ROdWxsIElucHV0U3RyZWFtIGdldElucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogVHJhbnNwb3J0J3MgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgZXhhY3RseSBvbmNlIGJ5IHRoZSBKQVgtV1MgUkkKKyAgICAgKiB0byBzdGFydCB3cml0aW5nIHRoZSByZXNwb25zZSBib2R5ICh1bmxlc3MgdGhlIHByb2Nlc3NpbmcgYWJvcnRzIGFibm9ybWFsbHkuKQorICAgICAqIEV2ZW4gaWYgdGhlcmUncyBubyByZXNwb25zZSBib2R5IHRvIHdyaXRlLCB0aGlzIG1ldGhvZCB3aWxsCisgICAgICogc3RpbGwgYmUgaW52b2tlZCBvbmx5IHRvIGJlIGNsb3NlZCBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9uY2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdHVzIGNvZGUgYW5kIHJlc3BvbnNlCisgICAgICogaGVhZGVycyB3aWxsIG5ldmVyIGNoYW5nZSAoSU9XIHtAbGluayAjc2V0U3RhdHVzKGludCl9LAorICAgICAqIHtAbGluayAjc2V0UmVzcG9uc2VIZWFkZXJzfSwgYW5kIHtAbGluayAjc2V0Q29udGVudFR5cGVSZXNwb25zZUhlYWRlcihTdHJpbmcpfQorICAgICAqIHdpbGwgbmV2ZXIgYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE5vdE51bGwgT3V0cHV0U3RyZWFtIGdldE91dHB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBXZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlfSBmb3IgdGhpcyBjb25uZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBXZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlIGdldFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUoKTsKKworICAgIC8qKgorICAgICAqIEhUVFAgcmVxdWVzdCBtZXRob2QsIHN1Y2ggYXMgIkdFVCIgb3IgIlBPU1QiLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATm90TnVsbCBTdHJpbmcgZ2V0UmVxdWVzdE1ldGhvZCgpOworCisgICAgLyoqCisgICAgICogSFRUUCByZXF1ZXN0IGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqICAgICAgVGhpcyBpcyBhIHBvdGVudGlhbGx5IGV4cGVuc2l2ZSBvcGVyYXRpb24uCisgICAgICogICAgICBQcm9ncmFtcyB0aGF0IHdhbnQgdG8gYWNjZXNzIEhUVFAgaGVhZGVycyBzaG91bGQgY29uc2lkZXIgdXNpbmcKKyAgICAgKiAgICAgIG90aGVyIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgI2dldFJlcXVlc3RIZWFkZXIoU3RyaW5nKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBjYW4gYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOb3ROdWxsIE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiBnZXRSZXF1ZXN0SGVhZGVycygpOworCisgICAgLyoqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgSFRUUCByZXNwb25zZSBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLExpc3Q8U3RyaW5nPj4gZ2V0UmVzcG9uc2VIZWFkZXJzKCk7CisgICAgLyoqCisgICAgICogR2V0cyBhbiBIVFRQIHJlcXVlc3QgaGVhZGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogaWYgbXVsdGlwbGUgaGVhZGVycyBhcmUgcHJlc2VudCwgdGhpcyBtZXRob2QgcmV0dXJucyBvbmUgb2YgdGhlbS4KKyAgICAgKiAoVGhlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gY2hvb3NlIHdoaWNoIG9uZSBpdCByZXR1cm5zLikKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG51bGwgaWYgbm8gaGVhZGVyIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE51bGxhYmxlIFN0cmluZyBnZXRSZXF1ZXN0SGVhZGVyKEBOb3ROdWxsIFN0cmluZyBoZWFkZXJOYW1lKTsKKworICAgIC8qKgorICAgICAqIEhUVFAgUXVlcnkgc3RyaW5nLCBzdWNoIGFzICJmb289YmFyIiwgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE51bGxhYmxlIFN0cmluZyBnZXRRdWVyeVN0cmluZygpOworCisgICAgLyoqCisgICAgICogUmVxdWVzdGVkIHBhdGguIEEgc3RyaW5nIGxpa2UgIi9mb28vYmFyL2JheiIKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE51bGxhYmxlIFN0cmluZyBnZXRQYXRoSW5mbygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBjb25uZWN0aW9uIGlzIEhUVFBTIG9yIG5vdAorICAgICAqCisgICAgICogQHJldHVybiBpZiB0aGUgcmVjZWl2ZWQgcmVxdWVzdCBpcyBvbiBIVFRQUywgcmV0dXJuIHRydWUKKyAgICAgKiAgICAgICAgIGVsc2UgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1NlY3VyZSgpOworCisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZDsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBjb25uZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1bnMgd2hldGhlciBjb25uZWN0aW9uIGlzIGNsb3NlZCBvciBub3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgIHJldHVybiBjbG9zZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gb3ZlcnJpZGUKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgICAgICByZXR1cm4gIkhUVFAvMS4xIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGFyZSBleHBlY3RlZCB0byBvdmVycmlkZQorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGhSZXNwb25zZUhlYWRlcihpbnQgdmFsdWUpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9Db29raWVKYXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9Db29raWVKYXIuamF2YQppbmRleCAxMDNlNjlkLi41OTA4MDg2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9jbGllbnQvQ29va2llSmFyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L0Nvb2tpZUphci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9IdHRwQ2xpZW50VHJhbnNwb3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9jbGllbnQvSHR0cENsaWVudFRyYW5zcG9ydC5qYXZhCmluZGV4IDA5NzI3MjMuLmE3MTQxZGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9IdHRwQ2xpZW50VHJhbnNwb3J0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L0h0dHBDbGllbnRUcmFuc3BvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyNDIgKzI1LDE1NyBAQAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLmNsaWVudDsKIAoraW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuUGFja2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5CaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5jbGllbnQuQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy4qOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5DbGllbnRUcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0LldTQ29ubmVjdGlvbkltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CeXRlQXJyYXlCdWZmZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLkNsaWVudE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5IZWFkZXJzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5KQVhXU1Byb3BlcnRpZXM7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKIAotaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbjsKK2ltcG9ydCBzdGF0aWMgamF2YXgueG1sLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXIucHJpbnRCYXNlNjRCaW5hcnk7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBzdGF0aWMgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZOwogaW1wb3J0IHN0YXRpYyBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyLlNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFk7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07CiAKIC8qKgorICogVE9ETzogdGhpcyBjbGFzcyBzZWVtcyB0byBiZSBwb2ludGxlc3MuIEp1c3QgbWVyZ2UgaXQgd2l0aCB7QGxpbmsgSHR0cFRyYW5zcG9ydFBpcGV9LgorICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgSHR0cENsaWVudFRyYW5zcG9ydCBleHRlbmRzIFdTQ29ubmVjdGlvbkltcGwgeworZmluYWwgY2xhc3MgSHR0cENsaWVudFRyYW5zcG9ydCB7CiAKKyAgICAvLyBOZWVkIHRvIHVzZSBKQVhCIGZpcnN0IHRvIHJlZ2lzdGVyIERhdGF0eXBlQ29udmVydGVyCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCkuY3JlYXRlVW5tYXJzaGFsbGVyKCk7CisgICAgICAgIH0gY2F0Y2goSkFYQkV4Y2VwdGlvbiBqZSkgeworICAgICAgICAgICAgLy8gTm90aGluZyBtdWNoIGNhbiBiZSBkb25lLiBJbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkKKyAgICAgICAgfQorICAgIH0KICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFTVF9FTkRQT0lOVCA9ICIiOwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVkaXJlY3QgPSB0cnVlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9SRURJUkVDVF9DT1VOVCA9IDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlZGlyZWN0Q291bnQgPSBTVEFSVF9SRURJUkVDVF9DT1VOVDsKLSAgICBpbnQgc3RhdHVzQ29kZTsKKworICAgIC8qcGFja2FnZSovIGludCBzdGF0dXNDb2RlOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXFIZWFkZXJzOwogICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXNwSGVhZGVycyA9IG51bGw7CiAKLSAgICBwdWJsaWMgSHR0cENsaWVudFRyYW5zcG9ydCgpIHsKLSAgICAgICAgdGhpcyhudWxsLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSk7Ci0gICAgfQorICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaHR0cHM7CisgICAgcHJpdmF0ZSBIdHRwVVJMQ29ubmVjdGlvbiBodHRwQ29ubmVjdGlvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBFbmRwb2ludEFkZHJlc3MgZW5kcG9pbnQgPSBudWxsOworICAgIHByaXZhdGUgUGFja2V0IGNvbnRleHQgPSBudWxsOworICAgIHByaXZhdGUgQ29va2llSmFyIGNvb2tpZUphciA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzRmFpbHVyZSA9IGZhbHNlOworICAgIHByaXZhdGUgZmluYWwgSW50ZWdlciBjaHVua1NpemU7CiAKLSAgICBwdWJsaWMgSHR0cENsaWVudFRyYW5zcG9ydChPdXRwdXRTdHJlYW0gbG9nU3RyZWFtLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgX2xvZ1N0cmVhbSA9IGxvZ1N0cmVhbTsKIAotICAgICAgICBTdHJpbmcgYmluZGluZ0lkID0gKFN0cmluZykgY29udGV4dC5nZXQoQklORElOR19JRF9QUk9QRVJUWSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYmluZGluZ0lkID09IG51bGwpCi0gICAgICAgICAgICAgICAgYmluZGluZ0lkID0gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotCi0gICAgICAgICAgICBpZiAoYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKQotICAgICAgICAgICAgICAgIF9tZXNzYWdlRmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIF9tZXNzYWdlRmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzFfUFJPVE9DT0wpOwotCi0gICAgICAgICAgICBlbmRwb2ludCA9IChTdHJpbmcpIGNvbnRleHQuZ2V0KEVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudFRyYW5zcG9ydEV4Y2VwdGlvbigiaHR0cC5jbGllbnQuY2Fubm90Q3JlYXRlTWVzc2FnZUZhY3RvcnkiKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyBIdHRwQ2xpZW50VHJhbnNwb3J0KEBOb3ROdWxsIFBhY2tldCBwYWNrZXQsIEBOb3ROdWxsIE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiByZXFIZWFkZXJzKSB7CisgICAgICAgIGVuZHBvaW50ID0gcGFja2V0LmVuZHBvaW50QWRkcmVzczsKKyAgICAgICAgY29udGV4dCA9IHBhY2tldDsKKyAgICAgICAgdGhpcy5yZXFIZWFkZXJzID0gcmVxSGVhZGVyczsKKyAgICAgICAgY2h1bmtTaXplID0gKEludGVnZXIpY29udGV4dC5pbnZvY2F0aW9uUHJvcGVydGllcy5nZXQoSkFYV1NQcm9wZXJ0aWVzLkhUVFBfQ0xJRU5UX1NUUkVBTUlOR19DSFVOS19TSVpFKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBQcmVwYXJlIHRoZSBzdHJlYW0gZm9yIEhUVFAgcmVxdWVzdAogICAgICAqLwotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0KCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgaHR0cENvbm5lY3Rpb24gPSBjcmVhdGVIdHRwQ29ubmVjdGlvbihlbmRwb2ludCwgY29udGV4dCk7Ci0gICAgICAgICAgICBjb29raWVKYXIgPSBzZW5kQ29va2llQXNOZWVkZWQoKTsKLQotICAgICAgICAgICAgLy8gaG93IHRvIGluY29ycG9yYXRlIHJlZGlyZWN0IHByb2Nlc3Npbmc6IG1lc3NhZ2UgZGlzcGF0Y2hlciBkb2VzIG5vdCBzZWVtIHRvIHRiZSByaWdodCBwbGFjZQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RNZXRob2QgPSBodHRwQ29ubmVjdGlvbi5nZXRSZXF1ZXN0TWV0aG9kKCk7Ci0gICAgICAgICAgICBib29sZWFuIHNraXBPdXQgPSAoIkdFVCIuZXF1YWxzSWdub3JlQ2FzZShyZXF1ZXN0TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICJIRUFEIi5lcXVhbHNJZ25vcmVDYXNlKHJlcXVlc3RNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgIkRFTEVURSIuZXF1YWxzSWdub3JlQ2FzZShyZXF1ZXN0TWV0aG9kKSk7Ci0gICAgICAgICAgICBpZiAoIXNraXBPdXQpCisgICAgICAgICAgICBjcmVhdGVIdHRwQ29ubmVjdGlvbigpOworICAgICAgICAgICAgc2VuZENvb2tpZUFzTmVlZGVkKCk7CisgICAgICAgICAgICAvLyBmb3IgIkdFVCIgcmVxdWVzdCBubyBuZWVkIHRvIGdldCBvdXRwdXRTdHJlYW0KKyAgICAgICAgICAgIGlmIChyZXF1aXJlc091dHB1dFN0cmVhbSgpKSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gaHR0cENvbm5lY3Rpb24uZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAvL2lmIHVzZSBnZXRPdXRwdXRTdHJlYW0gbWV0aG9kIHNldCBhcyAiUE9TVCIKLSAgICAgICAgICAgIC8vYnV0IGZvciAiR2V0IiByZXF1ZXN0IG5vIG5lZWQgdG8gZ2V0IG91dHB1dFN0cmVhbQotICAgICAgICAgICAgY29ubmVjdEZvclJlc3BvbnNlKCk7Ci0KKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtTaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IFdTQ2h1bmtlZE91cHV0U3RyZWFtKG91dHB1dFN0cmVhbSwgY2h1bmtTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNvbnRlbnRFbmNvZGluZyA9IHJlcUhlYWRlcnMuZ2V0KCJDb250ZW50LUVuY29kaW5nIik7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBuZWVkIHRvIGZpbmQgb3V0IGNvcnJlY3QgZW5jb2RpbmcgYmFzZWQgb24gcSB2YWx1ZSAtIFJGQyAyNjE2CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPSBudWxsICYmIGNvbnRlbnRFbmNvZGluZy5nZXQoMCkuY29udGFpbnMoImd6aXAiKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgR1pJUE91dHB1dFN0cmVhbShvdXRwdXRTdHJlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh0dHBDb25uZWN0aW9uLmNvbm5lY3QoKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKCJodHRwLmNsaWVudC5mYWlsZWQiLCBleCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIENsaWVudE1lc3NhZ2VzLmxvY2FsaXphYmxlSFRUUF9DTElFTlRfRkFJTEVEKGV4KSxleCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGNsb3NlT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZyb20gSFRUUCBjb25uZWN0aW9uIGFuZCBwcmVwYXJlIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHJlc3BvbnNlCiAgICAgICovCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0KCkgewogICAgICAgICAvLyByZXNwb25zZSBwcm9jZXNzaW5nCiAKICAgICAgICAgSW5wdXRTdHJlYW0gaW47CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbiA9IHJlYWRSZXNwb25zZSgpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRFbmNvZGluZyA9IGh0dHBDb25uZWN0aW9uLmdldENvbnRlbnRFbmNvZGluZygpOworICAgICAgICAgICAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPSBudWxsICYmIGNvbnRlbnRFbmNvZGluZy5jb250YWlucygiZ3ppcCIpKSB7CisgICAgICAgICAgICAgICAgaW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9OT19DT05URU5UCiAgICAgICAgICAgICAgICAgfHwgKGlzRmFpbHVyZQogICAgICAgICAgICAgICAgICYmIHN0YXR1c0NvZGUgIT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9JTlRFUk5BTF9FUlJPUikpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKCJodHRwLnN0YXR1cy5jb2RlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsIGh0dHBDb25uZWN0aW9uLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudFRyYW5zcG9ydEV4Y2VwdGlvbihDbGllbnRNZXNzYWdlcy5sb2NhbGl6YWJsZUhUVFBfU1RBVFVTX0NPREUoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlLCBodHRwQ29ubmVjdGlvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKSkpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oImh0dHAuc3RhdHVzLmNvZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSwgZXgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKENsaWVudE1lc3NhZ2VzLmxvY2FsaXphYmxlSFRUUF9TVEFUVVNfQ09ERSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsIGV4KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudFRyYW5zcG9ydEV4Y2VwdGlvbigiaHR0cC5jbGllbnQuZmFpbGVkIiwKLSAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKENsaWVudE1lc3NhZ2VzLmxvY2FsaXphYmxlSFRUUF9DTElFTlRfRkFJTEVEKGUpLGUpOwogICAgICAgICB9Ci0gICAgICAgIGh0dHBDb25uZWN0aW9uID0gbnVsbDsKLQogICAgICAgICByZXR1cm4gaW47CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXREZWJ1ZygpIHsKLSAgICAgICAgcmV0dXJuIF9sb2dTdHJlYW07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SGVhZGVycygpIHsKICAgICAgICAgaWYgKHJlc3BIZWFkZXJzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXNwSGVhZGVyczsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXNGYWlsdXJlID0gY2hlY2tSZXNwb25zZUNvZGUoKTsKLQotICAgICAgICAgICAgcmVzcEhlYWRlcnMgPSBjb2xsZWN0UmVzcG9uc2VNaW1lSGVhZGVycygpOwotCi0gICAgICAgICAgICBzYXZlQ29va2llQXNOZWVkZWQoY29va2llSmFyKTsKLSAgICAgICAgICAgIHNldEhlYWRlcnMocmVzcEhlYWRlcnMpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzcEhlYWRlcnM7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfTk9fQ09OVEVOVAotICAgICAgICAgICAgICAgIHx8IChpc0ZhaWx1cmUKLSAgICAgICAgICAgICAgICAmJiBzdGF0dXNDb2RlICE9IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfSU5URVJOQUxfRVJST1IpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudFRyYW5zcG9ydEV4Y2VwdGlvbigiaHR0cC5zdGF0dXMuY29kZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwQ29ubmVjdGlvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKX0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oImh0dHAuc3RhdHVzLmNvZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKCJodHRwLmNsaWVudC5mYWlsZWQiLAotICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCisgICAgICAgIHJlc3BIZWFkZXJzID0gbmV3IEhlYWRlcnMoKTsKKyAgICAgICAgcmVzcEhlYWRlcnMucHV0QWxsKGh0dHBDb25uZWN0aW9uLmdldEhlYWRlckZpZWxkcygpKTsKKyAgICAgICAgcmV0dXJuIHJlc3BIZWFkZXJzOwogICAgIH0KIAotLy8gICAgcHVibGljIHZvaWQgaW52b2tlKFN0cmluZyBlbmRwb2ludCwgU09BUE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpCi0vLyAgICAgICAgICAgIHRocm93cyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24gewotCi0vLyAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSBodHRwQ29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKTsKLS8vCi0vLyAgICAgICAgICAgIC8vaHR0cCBVUkwgcmVkaXJlY3Rpb24gZG9lcyBub3QgcmVkaXJlY3QgaHR0cCByZXF1ZXN0cwotLy8gICAgICAgICAgICAvL3RvIGFuIGh0dHBzIGVuZHBvaW50IHByb2JhYmx5IGR1ZSB0byBhIGJ1ZyBpbiB0aGUgamRrCi0vLyAgICAgICAgICAgIC8vb3IgYnkgaW50ZW50IC0gdG8gd29ya2Fyb3VuZCB0aGlzIGlmIGFuIGVycm9yIGNvZGUKLS8vICAgICAgICAgICAgLy9vZiBIVFRQX01PVkVEX1RFTVAgb3IgSFRUUF9NT1ZFRF9QRVJNIGlzIHJlY2VpdmVkIHRoZW4KLS8vICAgICAgICAgICAgLy90aGUgamF4d3MgY2xpZW50IHdpbGwgcmVpbnZva2UgdGhlIG9yaWdpbmFsIHJlcXVlc3QKLS8vICAgICAgICAgICAgLy90byB0aGUgbmV3IGVuZHBvaW50IC0ga3cgYnVnIDQ4OTAxMTgKLS8vICAgICAgICAgICAgaWYgKGNoZWNrRm9yUmVkaXJlY3Qoc3RhdHVzQ29kZSkpIHsKLS8vICAgICAgICAgICAgICAgIHJlZGlyZWN0UmVxdWVzdChodHRwQ29ubmVjdGlvbiwgY29udGV4dCk7Ci0vLyAgICAgICAgICAgICAgICByZXR1cm47Ci0vLyAgICAgICAgICAgIH0KLS8vICAgIH0KLQotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSByZWFkUmVzcG9uc2UoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBjb250ZW50SW4gPQotICAgICAgICAgICAgKGlzRmFpbHVyZQorICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSByZWFkUmVzcG9uc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKGlzRmFpbHVyZQogICAgICAgICAgICAgICAgID8gaHR0cENvbm5lY3Rpb24uZ2V0RXJyb3JTdHJlYW0oKQogICAgICAgICAgICAgICAgIDogaHR0cENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJhYiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRJbiAhPSBudWxsKSB7IC8vIGlzIHRoaXMgcmVhbGx5IHBvc3NpYmxlPwotICAgICAgICAgICAgYmFiLndyaXRlKGNvbnRlbnRJbik7Ci0gICAgICAgICAgICBiYWIuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW5ndGggPQotICAgICAgICAgICAgaHR0cENvbm5lY3Rpb24uZ2V0Q29udGVudExlbmd0aCgpID09IC0xCi0gICAgICAgICAgICAgICAgPyBiYWIuc2l6ZSgpCi0gICAgICAgICAgICAgICAgOiBodHRwQ29ubmVjdGlvbi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0KLSAgICAgICAgcmV0dXJuIGJhYi5uZXdJbnB1dFN0cmVhbSgwLCBsZW5ndGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGNvbGxlY3RSZXNwb25zZU1pbWVIZWFkZXJzKCkgewotICAgICAgICAvKgotICAgICAgICBNaW1lSGVhZGVycyBtaW1lSGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBodHRwQ29ubmVjdGlvbi5nZXRIZWFkZXJGaWVsZEtleShpKTsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaHR0cENvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGQoaSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1pbWVIZWFkZXJzLmFkZEhlYWRlcihrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIGhlYWRlcnMgdGhhdCBhcmUgaWxsZWdhbCBpbiBNSU1FCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbWltZUhlYWRlcnMuZ2V0QWxsSGVhZGVycygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1pbWVIZWFkZXIgaGVhZGVyID0gKE1pbWVIZWFkZXIpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gaCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgaC5hZGQoaGVhZGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgaGVhZGVycy5wdXQgKGhlYWRlci5nZXROYW1lICgpLCBoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyczsKLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiBodHRwQ29ubmVjdGlvbi5nZXRIZWFkZXJGaWVsZHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25uZWN0Rm9yUmVzcG9uc2UoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGh0dHBDb25uZWN0aW9uLmNvbm5lY3QoKTsKICAgICB9CiAKICAgICAvKgpAQCAtMjY4LDEzICsxODMsMTAgQEAKICAgICAgKiByZXR1cm4gbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQgKGkuZS4sIGluIHRoZSBjYXNlIG9mIGFuIFVOQVVUSE9SSVpFRAogICAgICAqIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZsZXQgb3IgNDA0IG5vdCBmb3VuZCkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1Jlc3BvbnNlQ29kZSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gaXNGYWlsdXJlID0gZmFsc2U7CisgICAgLypwYWNrYWdlKi92b2lkIGNoZWNrUmVzcG9uc2VDb2RlKCkgewogICAgICAgICB0cnkgewogCiAgICAgICAgICAgICBzdGF0dXNDb2RlID0gaHR0cENvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0gICAgICAgICAgICBzZXRTdGF0dXMoc3RhdHVzQ29kZSk7CiAKICAgICAgICAgICAgIGlmICgoaHR0cENvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCkKICAgICAgICAgICAgICAgICA9PSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0lOVEVSTkFMX0VSUk9SKSkgewpAQCAtMjg1LDUxICsxOTcsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9VTkFVVEhPUklaRUQpIHsKIAogICAgICAgICAgICAgICAgIC8vIG5vIHNvYXAgbWVzc2FnZSByZXR1cm5lZCwgc28gc2tpcCByZWFkaW5nIG1lc3NhZ2UgYW5kIHRocm93IGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oImh0dHAuY2xpZW50LnVuYXV0aG9yaXplZCIsCi0gICAgICAgICAgICAgICAgICAgIGh0dHBDb25uZWN0aW9uLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBDbGllbnRNZXNzYWdlcy5sb2NhbGl6YWJsZUhUVFBfQ0xJRU5UX1VOQVVUSE9SSVpFRChodHRwQ29ubmVjdGlvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKSkpOwogICAgICAgICAgICAgfSBlbHNlIGlmICgKICAgICAgICAgICAgICAgICBodHRwQ29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKQogICAgICAgICAgICAgICAgICAgICA9PSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX05PVF9GT1VORCkgewogCiAgICAgICAgICAgICAgICAgLy8gbm8gbWVzc2FnZSByZXR1cm5lZCwgc28gc2tpcCByZWFkaW5nIG1lc3NhZ2UgYW5kIHRocm93IGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oImh0dHAubm90LmZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgaHR0cENvbm5lY3Rpb24uZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIENsaWVudE1lc3NhZ2VzLmxvY2FsaXphYmxlSFRUUF9OT1RfRk9VTkQoaHR0cENvbm5lY3Rpb24uZ2V0UmVzcG9uc2VNZXNzYWdlKCkpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICAgICAgICAgKHN0YXR1c0NvZGUgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9NT1ZFRF9URU1QKSB8fAogICAgICAgICAgICAgICAgICAgICAoc3RhdHVzQ29kZSA9PSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX01PVkVEX1BFUk0pKSB7CiAgICAgICAgICAgICAgICAgaXNGYWlsdXJlID0gdHJ1ZTsKIAogICAgICAgICAgICAgICAgIGlmICghcmVkaXJlY3QgfHwgKHJlZGlyZWN0Q291bnQgPD0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudFRyYW5zcG9ydEV4Y2VwdGlvbigiaHR0cC5zdGF0dXMuY29kZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdGF0dXNNZXNzYWdlKGh0dHBDb25uZWN0aW9uKX0pOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50TWVzc2FnZXMubG9jYWxpemFibGVIVFRQX1NUQVRVU19DT0RFKHN0YXR1c0NvZGUsZ2V0U3RhdHVzTWVzc2FnZSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICgKICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlIDwgMjAwIHx8IChzdGF0dXNDb2RlID49IDMwMyAmJiBzdGF0dXNDb2RlIDwgNTAwKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oImh0dHAuc3RhdHVzLmNvZGUiLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdHVzTWVzc2FnZShodHRwQ29ubmVjdGlvbil9KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50VHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBDbGllbnRNZXNzYWdlcy5sb2NhbGl6YWJsZUhUVFBfU1RBVFVTX0NPREUoc3RhdHVzQ29kZSxnZXRTdGF0dXNNZXNzYWdlKCkpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA+PSA1MDApIHsKICAgICAgICAgICAgICAgICBpc0ZhaWx1cmUgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIC8vIG9uIEpESzEuMy4xXzAxLCB3ZSBlbmQgdXAgaGVyZSwgYnV0IHRoZW4gZ2V0UmVzcG9uc2VDb2RlKCkgc3VjY2VlZHMhCi0vLyAgICAgICAgICAgIGlmIChodHRwQ29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKQotLy8gICAgICAgICAgICAgICAgICAgID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfSU5URVJOQUxfRVJST1IpIHsKLS8vICAgICAgICAgICAgICAgIGlzRmFpbHVyZSA9IHRydWU7Ci0vLyAgICAgICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyBlOwotLy8gICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXNGYWlsdXJlOworICAgICAgICAvLyBIYWNrIGZvciBub3cKKyAgICAgICAgc2F2ZUNvb2tpZUFzTmVlZGVkKCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdGF0dXNNZXNzYWdlKEh0dHBVUkxDb25uZWN0aW9uIGh0dHBDb25uZWN0aW9uKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IGh0dHBDb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOwogICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGh0dHBDb25uZWN0aW9uLmdldFJlc3BvbnNlTWVzc2FnZSgpOwogICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0NSRUFURUQKQEAgLTM0MywxMDggKzI0MywxMTcgQEAKICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIENvb2tpZUphciBzZW5kQ29va2llQXNOZWVkZWQoKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZENvb2tpZUFzTmVlZGVkKCkgewogICAgICAgICBCb29sZWFuIHNob3VsZE1haW50YWluU2Vzc2lvblByb3BlcnR5ID0KLSAgICAgICAgICAgIChCb29sZWFuKSBjb250ZXh0LmdldChTRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZKTsKLSAgICAgICAgaWYgKHNob3VsZE1haW50YWluU2Vzc2lvblByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaG91bGRNYWludGFpblNlc3Npb25Qcm9wZXJ0eS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgQ29va2llSmFyIGNvb2tpZUphciA9IChDb29raWVKYXIpIGNvbnRleHQuZ2V0KEhUVFBfQ09PS0lFX0pBUik7CisgICAgICAgICAgICAoQm9vbGVhbikgY29udGV4dC5pbnZvY2F0aW9uUHJvcGVydGllcy5nZXQoU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSk7CisgICAgICAgIGlmIChzaG91bGRNYWludGFpblNlc3Npb25Qcm9wZXJ0eSAhPSBudWxsICYmIHNob3VsZE1haW50YWluU2Vzc2lvblByb3BlcnR5KSB7CisgICAgICAgICAgICBjb29raWVKYXIgPSAoQ29va2llSmFyKSBjb250ZXh0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLmdldChIVFRQX0NPT0tJRV9KQVIpOwogICAgICAgICAgICAgaWYgKGNvb2tpZUphciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY29va2llSmFyID0gbmV3IENvb2tpZUphcigpOwogCiAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdG9yZSBpbiBiaW5kaW5nJ3MgY29udGV4dCBzbyBpdCBpcyBub3QgbG9zdAotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9Ci0gICAgICAgICAgICAgICAgICAgIChCaW5kaW5nUHJvdmlkZXIpIGNvbnRleHQuZ2V0KEpBWFdTX0NMSUVOVF9IQU5ETEVfUFJPUEVSVFkpOwotICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEhUVFBfQ09PS0lFX0pBUiwgY29va2llSmFyKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnByb3h5LmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEhUVFBfQ09PS0lFX0pBUiwgY29va2llSmFyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvb2tpZUphci5hcHBseVJlbGV2YW50Q29va2llcyhodHRwQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gY29va2llSmFyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlQ29va2llQXNOZWVkZWQoQ29va2llSmFyIGNvb2tpZUphcikgeworICAgIHByaXZhdGUgdm9pZCBzYXZlQ29va2llQXNOZWVkZWQoKSB7CiAgICAgICAgIGlmIChjb29raWVKYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgY29va2llSmFyLnJlY29yZEFueUNvb2tpZXMoaHR0cENvbm5lY3Rpb24pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIEh0dHBVUkxDb25uZWN0aW9uIGNyZWF0ZUh0dHBDb25uZWN0aW9uKFN0cmluZyBlbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogCi0gICAgICAgIGJvb2xlYW4gdmVyaWZpY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgIC8vIGRvZXMgdGhlIGNsaWVudCB3YW50IGNsaWVudCBob3N0bmFtZSB2ZXJpZmljYXRpb24gYnkgdGhlIHNlcnZpY2UKLSAgICAgICAgU3RyaW5nIHZlcmlmaWNhdGlvblByb3BlcnR5ID0KLSAgICAgICAgICAgIChTdHJpbmcpIGNvbnRleHQuZ2V0KEhPU1ROQU1FX1ZFUklGSUNBVElPTl9QUk9QRVJUWSk7Ci0gICAgICAgIGlmICh2ZXJpZmljYXRpb25Qcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodmVyaWZpY2F0aW9uUHJvcGVydHkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQotICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbiA9IHRydWU7Ci0gICAgICAgIH0KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlSHR0cENvbm5lY3Rpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAgICAgICAgIC8vIGRvZXMgdGhlIGNsaWVudCB3YW50IHJlcXVlc3QgcmVkaXJlY3Rpb24gdG8gb2NjdXIKICAgICAgICAgU3RyaW5nIHJlZGlyZWN0UHJvcGVydHkgPQotICAgICAgICAgICAgKFN0cmluZykgY29udGV4dC5nZXQoUkVESVJFQ1RfUkVRVUVTVF9QUk9QRVJUWSk7CisgICAgICAgICAgICAoU3RyaW5nKSBjb250ZXh0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLmdldChSRURJUkVDVF9SRVFVRVNUX1BST1BFUlRZKTsKICAgICAgICAgaWYgKHJlZGlyZWN0UHJvcGVydHkgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHJlZGlyZWN0UHJvcGVydHkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKICAgICAgICAgICAgICAgICByZWRpcmVjdCA9IGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgY2hlY2tFbmRwb2ludHMoZW5kcG9pbnQpOworICAgICAgICBjaGVja0VuZHBvaW50cygpOwogCi0gICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGh0dHBDb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbihlbmRwb2ludCk7CisgICAgICAgIGh0dHBDb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSBlbmRwb2ludC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICBpZiAoaHR0cENvbm5lY3Rpb24gaW5zdGFuY2VvZiBIdHRwc1VSTENvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIGh0dHBzID0gdHJ1ZTsKIAotICAgICAgICBpZiAoIXZlcmlmaWNhdGlvbikgewotICAgICAgICAgICAgLy8gZm9yIGh0dHBzIGhvc3RuYW1lIHZlcmlmaWNhdGlvbiAgLSB0dXJuIG9mZiBieSBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAoaHR0cENvbm5lY3Rpb24gaW5zdGFuY2VvZiBIdHRwc1VSTENvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIGJvb2xlYW4gdmVyaWZpY2F0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAvLyBkb2VzIHRoZSBjbGllbnQgd2FudCBjbGllbnQgaG9zdG5hbWUgdmVyaWZpY2F0aW9uIGJ5IHRoZSBzZXJ2aWNlCisgICAgICAgICAgICBTdHJpbmcgdmVyaWZpY2F0aW9uUHJvcGVydHkgPQorICAgICAgICAgICAgICAgIChTdHJpbmcpIGNvbnRleHQuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KEhPU1ROQU1FX1ZFUklGSUNBVElPTl9QUk9QRVJUWSk7CisgICAgICAgICAgICBpZiAodmVyaWZpY2F0aW9uUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh2ZXJpZmljYXRpb25Qcm9wZXJ0eS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpCisgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXZlcmlmaWNhdGlvbikgewogICAgICAgICAgICAgICAgICgoSHR0cHNVUkxDb25uZWN0aW9uKSBodHRwQ29ubmVjdGlvbikuc2V0SG9zdG5hbWVWZXJpZmllcihuZXcgSHR0cENsaWVudFZlcmlmaWVyKCkpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXQgYXBwbGljYXRpb24ncyBIb3N0TmFtZVZlcmlmaWVyIGZvciB0aGlzIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIEhvc3RuYW1lVmVyaWZpZXIgdmVyaWZpZXIgPQorICAgICAgICAgICAgICAgIChIb3N0bmFtZVZlcmlmaWVyKSBjb250ZXh0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLmdldChKQVhXU1Byb3BlcnRpZXMuSE9TVE5BTUVfVkVSSUZJRVIpOworICAgICAgICAgICAgaWYgKHZlcmlmaWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAoKEh0dHBzVVJMQ29ubmVjdGlvbikgaHR0cENvbm5lY3Rpb24pLnNldEhvc3RuYW1lVmVyaWZpZXIodmVyaWZpZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXQgYXBwbGljYXRpb24ncyBTb2NrZXRGYWN0b3J5IGZvciB0aGlzIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc3NsU29ja2V0RmFjdG9yeSA9CisgICAgICAgICAgICAgICAgKFNTTFNvY2tldEZhY3RvcnkpIGNvbnRleHQuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KEpBWFdTUHJvcGVydGllcy5TU0xfU09DS0VUX0ZBQ1RPUlkpOworICAgICAgICAgICAgaWYgKHNzbFNvY2tldEZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICgoSHR0cHNVUkxDb25uZWN0aW9uKSBodHRwQ29ubmVjdGlvbikuc2V0U1NMU29ja2V0RmFjdG9yeShzc2xTb2NrZXRGYWN0b3J5KTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICB9CiAKKworICAgICAgICB3cml0ZUJhc2ljQXV0aEFzTmVlZGVkKGNvbnRleHQsIHJlcUhlYWRlcnMpOworCiAgICAgICAgIC8vIGFsbG93IGludGVyYWN0aW9uIHdpdGggdGhlIHdlYiBwYWdlIC0gdXNlciBtYXkgaGF2ZSB0byBzdXBwbHkKICAgICAgICAgLy8gdXNlcm5hbWUsIHBhc3N3b3JkIGlkIHdlYiBwYWdlIGlzIGFjY2Vzc2VkIGZyb20gd2ViIGJyb3dzZXIKICAgICAgICAgaHR0cENvbm5lY3Rpb24uc2V0QWxsb3dVc2VySW50ZXJhY3Rpb24odHJ1ZSk7CisKICAgICAgICAgLy8gZW5hYmxlIGlucHV0LCBvdXRwdXQgc3RyZWFtcwogICAgICAgICBodHRwQ29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKICAgICAgICAgaHR0cENvbm5lY3Rpb24uc2V0RG9JbnB1dCh0cnVlKTsKLSAgICAgICAgLy8gdGhlIHNvYXAgbWVzc2FnZSBpcyBhbHdheXMgc2VudCBhcyBhIEh0dHAgUE9TVAotICAgICAgICAvLyBIVFRQIEdldCBpcyBkaXNhbGxvd2VkIGJ5IEJQIDEuMAotICAgICAgICAvLyBuZWVkZWQgZm9yIFhNTC9IVFRQQmluZGluZyBhbmQgU09BUDEyQmluZGluZwotICAgICAgICAvLyBmb3IgeG1sL2h0dHAgYmluZGluZyBvdGhlciBtZXRob2RzIGFyZSBhbGxvd2VkLgotICAgICAgICAvLyBmb3IgU29hcCAxLjIgIkdFVCIgaXMgYWxsb3dlZC4KLSAgICAgICAgU3RyaW5nIG1ldGhvZCA9ICJQT1NUIjsKLSAgICAgICAgU3RyaW5nIHJlcXVlc3RNZXRob2QgPSAoU3RyaW5nKSBjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9EKTsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQklORElOR19JRF9QUk9QRVJUWSkuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpeworCisgICAgICAgIFN0cmluZyByZXF1ZXN0TWV0aG9kID0gKFN0cmluZykgY29udGV4dC5pbnZvY2F0aW9uUHJvcGVydGllcy5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX01FVEhPRCk7CisgICAgICAgIFN0cmluZyBtZXRob2QgPSAocmVxdWVzdE1ldGhvZCAhPSBudWxsKSA/IHJlcXVlc3RNZXRob2QgOiAiUE9TVCI7CisgICAgICAgIGh0dHBDb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QobWV0aG9kKTsKKworICAgICAgICAvL3RoaXMgY29kZSBvciBzb21ldGhpbmcgc2ltaWxpYXIgbmVlZHMgdCBiZSBtb3ZlZCBlbHNld2hlcmUgZm9yIGVycm9yIGNoZWNraW5nCisgICAgICAgIC8qaWYgKGNvbnRleHQuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQklORElOR19JRF9QUk9QRVJUWSkuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpewogICAgICAgICAgICAgbWV0aG9kID0gKHJlcXVlc3RNZXRob2QgIT0gbnVsbCk/cmVxdWVzdE1ldGhvZDptZXRob2Q7CiAgICAgICAgIH0gZWxzZSBpZgotICAgICAgICAgICAgKGNvbnRleHQuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQklORElOR19JRF9QUk9QRVJUWSkuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgJiYKKyAgICAgICAgICAgIChjb250ZXh0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLmdldChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkJJTkRJTkdfSURfUFJPUEVSVFkpLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpICYmCiAgICAgICAgICAgICAiR0VUIi5lcXVhbHNJZ25vcmVDYXNlKHJlcXVlc3RNZXRob2QpKSB7Ci0gICAgICAgICAgICBtZXRob2QgPSAocmVxdWVzdE1ldGhvZCAhPSBudWxsKT9yZXF1ZXN0TWV0aG9kOm1ldGhvZDsKICAgICAgICAgfQotICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKWh0dHBDb25uZWN0aW9uKS5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgKi8KIAotICAgICAgICBJbnRlZ2VyIHJlcVRpbWVvdXQgPSAoSW50ZWdlciljb250ZXh0LmdldChCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLlJFUVVFU1RfVElNRU9VVCk7CisgICAgICAgIEludGVnZXIgcmVxVGltZW91dCA9IChJbnRlZ2VyKWNvbnRleHQuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuUkVRVUVTVF9USU1FT1VUKTsKICAgICAgICAgaWYgKHJlcVRpbWVvdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgaHR0cENvbm5lY3Rpb24uc2V0UmVhZFRpbWVvdXQocmVxVGltZW91dCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBzZXQgdGhlIHByb3BlcnRpZXMgb24gSHR0cFVSTENvbm5lY3Rpb24KLSAgICAgICAgZm9yIChNYXAuRW50cnkgZW50cnkgOiBzdXBlci5nZXRIZWFkZXJzKCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaHR0cENvbm5lY3Rpb24uYWRkUmVxdWVzdFByb3BlcnR5KChTdHJpbmcpIGVudHJ5LmdldEtleSgpLCAoKExpc3Q8U3RyaW5nPikgZW50cnkuZ2V0VmFsdWUoKSkuZ2V0KDApKTsKKyAgICAgICAgSW50ZWdlciBjaHVua1NpemUgPSAoSW50ZWdlciljb250ZXh0Lmludm9jYXRpb25Qcm9wZXJ0aWVzLmdldChKQVhXU1Byb3BlcnRpZXMuSFRUUF9DTElFTlRfU1RSRUFNSU5HX0NIVU5LX1NJWkUpOworICAgICAgICBpZiAoY2h1bmtTaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgIGh0dHBDb25uZWN0aW9uLnNldENodW5rZWRTdHJlYW1pbmdNb2RlKGNodW5rU2l6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gaHR0cENvbm5lY3Rpb247CisgICAgICAgIC8vIHNldCB0aGUgcHJvcGVydGllcyBvbiBIdHRwVVJMQ29ubmVjdGlvbgorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiByZXFIZWFkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGh0dHBDb25uZWN0aW9uLmFkZFJlcXVlc3RQcm9wZXJ0eShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKS5nZXQoMCkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uKFN0cmluZyBlbmRwb2ludCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChIdHRwVVJMQ29ubmVjdGlvbikgbmV3IFVSTChlbmRwb2ludCkub3BlbkNvbm5lY3Rpb24oKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIGh0dHBzOwogICAgIH0KIAotLy8gICAgcHJpdmF0ZSB2b2lkIHJlZGlyZWN0UmVxdWVzdChIdHRwVVJMQ29ubmVjdGlvbiBodHRwQ29ubmVjdGlvbiwgU09BUE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsKKyAgICAvLyAgICBwcml2YXRlIHZvaWQgcmVkaXJlY3RSZXF1ZXN0KEh0dHBVUkxDb25uZWN0aW9uIGh0dHBDb25uZWN0aW9uLCBTT0FQTWVzc2FnZUNvbnRleHQgY29udGV4dCkgewogLy8gICAgICAgIFN0cmluZyByZWRpcmVjdEVuZHBvaW50ID0gaHR0cENvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGQoIkxvY2F0aW9uIik7CiAvLyAgICAgICAgaWYgKHJlZGlyZWN0RW5kcG9pbnQgIT0gbnVsbCkgewogLy8gICAgICAgICAgICBodHRwQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7CkBAIC00NTcsMjYgKzM2Niw5NCBAQAogICAgICAgICByZXR1cm4gKCgoc3RhdHVzQ29kZSA9PSAzMDEpIHx8IChzdGF0dXNDb2RlID09IDMwMikpICYmIHJlZGlyZWN0ICYmIChyZWRpcmVjdENvdW50LS0gPiAwKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRW5kcG9pbnRzKFN0cmluZyBjdXJyZW50RW5kcG9pbnQpIHsKLSAgICAgICAgaWYgKCFMQVNUX0VORFBPSU5ULmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudEVuZHBvaW50KSkgeworICAgIHByaXZhdGUgdm9pZCBjaGVja0VuZHBvaW50cygpIHsKKyAgICAgICAgaWYgKCFMQVNUX0VORFBPSU5ULmVxdWFsc0lnbm9yZUNhc2UoZW5kcG9pbnQudG9TdHJpbmcoKSkpIHsKICAgICAgICAgICAgIHJlZGlyZWN0Q291bnQgPSBTVEFSVF9SRURJUkVDVF9DT1VOVDsKLSAgICAgICAgICAgIExBU1RfRU5EUE9JTlQgPSBjdXJyZW50RW5kcG9pbnQ7CisgICAgICAgICAgICBMQVNUX0VORFBPSU5UID0gZW5kcG9pbnQudG9TdHJpbmcoKTsKICAgICAgICAgfQogICAgIH0KIAorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQmFzaWNBdXRoQXNOZWVkZWQoUGFja2V0IGNvbnRleHQsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVxSGVhZGVycykgeworICAgICAgICBTdHJpbmcgdXNlciA9IChTdHJpbmcpIGNvbnRleHQuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KEJpbmRpbmdQcm92aWRlci5VU0VSTkFNRV9QUk9QRVJUWSk7CisgICAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBwdyA9IChTdHJpbmcpIGNvbnRleHQuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KEJpbmRpbmdQcm92aWRlci5QQVNTV09SRF9QUk9QRVJUWSk7CisgICAgICAgICAgICBpZiAocHcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHVzZXIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHB3KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY3JlZHMgPSBwcmludEJhc2U2NEJpbmFyeShidWYudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICByZXFIZWFkZXJzLnB1dCgiQXV0aG9yaXphdGlvbiIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIkJhc2ljICIrY3JlZHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlc091dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuICEoaHR0cENvbm5lY3Rpb24uZ2V0UmVxdWVzdE1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoIkdFVCIpIHx8CisgICAgICAgICAgICAgICAgaHR0cENvbm5lY3Rpb24uZ2V0UmVxdWVzdE1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoIkhFQUQiKSB8fAorICAgICAgICAgICAgICAgIGh0dHBDb25uZWN0aW9uLmdldFJlcXVlc3RNZXRob2QoKS5lcXVhbHNJZ25vcmVDYXNlKCJERUxFVEUiKSk7CisgICAgfQorCisgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBodHRwQ29ubmVjdGlvbi5nZXRDb250ZW50VHlwZSgpOworICAgIH0KKwogICAgIC8vIG92ZXJpZGUgZGVmYXVsdCBTU0wgSHR0cENsaWVudFZlcmlmaWVyIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZQogICAgIC8vIGVmZmVjdGl2ZWx5IG92ZXJpZGluZyBIb3N0bmFtZSBjbGllbnQgdmVyaWZpY2F0aW9uIHdoZW4gdXNpbmcgU1NMCi0gICAgc3RhdGljIGNsYXNzIEh0dHBDbGllbnRWZXJpZmllciBpbXBsZW1lbnRzIEhvc3RuYW1lVmVyaWZpZXIgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEh0dHBDbGllbnRWZXJpZmllciBpbXBsZW1lbnRzIEhvc3RuYW1lVmVyaWZpZXIgewogICAgICAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoU3RyaW5nIHMsIFNTTFNlc3Npb24gc3NsU2Vzc2lvbikgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIE1lc3NhZ2VGYWN0b3J5IF9tZXNzYWdlRmFjdG9yeTsKLSAgICBIdHRwVVJMQ29ubmVjdGlvbiBodHRwQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgU3RyaW5nIGVuZHBvaW50ID0gbnVsbDsKLSAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnRleHQgPSBudWxsOwotICAgIENvb2tpZUphciBjb29raWVKYXIgPSBudWxsOwotICAgIGJvb2xlYW4gaXNGYWlsdXJlID0gZmFsc2U7Ci0gICAgT3V0cHV0U3RyZWFtIF9sb2dTdHJlYW0gPSBudWxsOworICAgIC8qKgorICAgICAqIEh0dHBVUkxDb25uZWN0aW9uLmdldE91cHV0U3RyZWFtKCkgcmV0dXJucyBzdW4ubmV0Lnd3dy5odHRwLkNodW5rZWRPdXB1dFN0cmVhbSBpbiBjaHVua2VkCisgICAgICogc3RyZWFtaW5nIG1vZGUuIElmIHlvdSBjYWxsIENodW5rZWRPdXB1dFN0cmVhbS53cml0ZShieXRlWzIwTUJdLCBpbnQsIGludCksIHRoZW4gdGhlIHdob2xlIGRhdGEKKyAgICAgKiBpcyBrZXB0IGluIG1lbW9yeS4gVGhpcyB3cmFwcyB0aGUgQ2h1bmtlZE91cHV0U3RyZWFtIHNvIHRoYXQgaXQgd3JpdGVzIG9ubHkgc21hbGwKKyAgICAgKiBjaHVua3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgV1NDaHVua2VkT3VwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gYWN0dWFsOworICAgICAgICBmaW5hbCBpbnQgY2h1bmtTaXplOworCisgICAgICAgIFdTQ2h1bmtlZE91cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBhY3R1YWwsIGludCBjaHVua1NpemUpIHsKKyAgICAgICAgICAgIHRoaXMuYWN0dWFsID0gYWN0dWFsOworICAgICAgICAgICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgc2VudCA9IDA7CisgICAgICAgICAgICB3aGlsZShzZW50IDwgbGVuKSB7CisgICAgICAgICAgICAgICAgaW50IGNodW5rID0gbGVuLXNlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rID4gY2h1bmtTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmtTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY3R1YWwud3JpdGUoYiwgb2ZmLCBjaHVuayk7CisgICAgICAgICAgICAgICAgb2ZmICs9IGNodW5rOworICAgICAgICAgICAgICAgIHNlbnQgKz0gY2h1bms7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB3cml0ZShiLCAwLCBiLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBhY3R1YWwud3JpdGUoYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYWN0dWFsLmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYWN0dWFsLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9IdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L0h0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMjA5ZWMuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L0h0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLmNsaWVudDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldTQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBzdGF0aWMgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuQklORElOR19JRF9QUk9QRVJUWTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5DbGllbnRUcmFuc3BvcnRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgaW1wbGVtZW50cyBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKLQotCi0gICAgcHVibGljIEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KCkgewotICAgICAgICB0aGlzKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeShPdXRwdXRTdHJlYW0gbG9nU3RyZWFtKSB7Ci0gICAgICAgIF9sb2dTdHJlYW0gPSBsb2dTdHJlYW07Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgV1NDb25uZWN0aW9uIGNyZWF0ZSgpIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIGNvbnRleHQucHV0KEJJTkRJTkdfSURfUFJPUEVSVFksIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50VHJhbnNwb3J0KF9sb2dTdHJlYW0sIGNvbnRleHQpOwotICAgIH0KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIEJpbmRpbmcgSWQsIEVuZHBvaW50IGFkZHJlc3MgYW5kIG90aGVyIG1ldGFkYXRhIGlzIGluIHRoZSBwcm9wZXJ0eSBiYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NDb25uZWN0aW9uIGNyZWF0ZShNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50VHJhbnNwb3J0KF9sb2dTdHJlYW0sIGNvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIF9sb2dTdHJlYW07Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9jbGllbnQvSHR0cENvb2tpZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L0h0dHBDb29raWUuamF2YQppbmRleCA4Njg4NzkxLi5jN2FhNGI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9jbGllbnQvSHR0cENvb2tpZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9IdHRwQ29va2llLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L0h0dHBSZXNwb25zZVByb3BlcnRpZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9IdHRwUmVzcG9uc2VQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhOTU3NAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9IdHRwUmVzcG9uc2VQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLmNsaWVudDsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLlByb3BlcnR5U2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5SZXNwb25zZUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFByb3BlcnRpZXMgZXhwb3NlZCBmcm9tIHtAbGluayBIdHRwVHJhbnNwb3J0UGlwZX0gZm9yIHtAbGluayBSZXNwb25zZUNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZmluYWwgY2xhc3MgSHR0cFJlc3BvbnNlUHJvcGVydGllcyBleHRlbmRzIFByb3BlcnR5U2V0IHsKKworICAgIHByaXZhdGUgZmluYWwgSHR0cENsaWVudFRyYW5zcG9ydCBkZWZlcmVkQ29uOworCisgICAgcHVibGljIEh0dHBSZXNwb25zZVByb3BlcnRpZXMoQE5vdE51bGwgSHR0cENsaWVudFRyYW5zcG9ydCBjb24pIHsKKyAgICAgICAgdGhpcy5kZWZlcmVkQ29uID0gY29uOworICAgIH0KKworICAgIEBQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5IVFRQX1JFU1BPTlNFX0hFQURFUlMpCisgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0UmVzcG9uc2VIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gZGVmZXJlZENvbi5nZXRIZWFkZXJzKCk7CisgICAgfQorCisgICAgQFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSkKKyAgICBwdWJsaWMgaW50IGdldFJlc3BvbnNlQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmVyZWRDb24uc3RhdHVzQ29kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlNYXAgZ2V0UHJvcGVydHlNYXAoKSB7CisgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eU1hcCBtb2RlbDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIG1vZGVsID0gcGFyc2UoSHR0cFJlc3BvbnNlUHJvcGVydGllcy5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L0h0dHBUcmFuc3BvcnRQaXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9jbGllbnQvSHR0cFRyYW5zcG9ydFBpcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ4ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L0h0dHBUcmFuc3BvcnRQaXBlLmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuY2xpZW50OworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29kZWM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuQ29udGVudFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZUNsb25lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RUdWJlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5XU0hUVFBDb25uZWN0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOworCitpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworLyoqCisgKiB7QGxpbmsgUGlwZX0gYW5kIHtAbGluayBUdWJlfSB0aGF0IHNlbmRzIGEgcmVxdWVzdCB0byBhIHJlbW90ZSBIVFRQIHNlcnZlci4KKyAqCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICovCitwdWJsaWMgY2xhc3MgSHR0cFRyYW5zcG9ydFBpcGUgZXh0ZW5kcyBBYnN0cmFjdFR1YmVJbXBsIHsKKworICAgIHByaXZhdGUgZmluYWwgQ29kZWMgY29kZWM7CisKKyAgICBwdWJsaWMgSHR0cFRyYW5zcG9ydFBpcGUoQ29kZWMgY29kZWMpIHsKKyAgICAgICAgdGhpcy5jb2RlYyA9IGNvZGVjOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgY29uc3RydWN0b3IgZm9yIHtAbGluayBUdWJlI2NvcHkoVHViZUNsb25lcil9LgorICAgICAqLworICAgIHByaXZhdGUgSHR0cFRyYW5zcG9ydFBpcGUoSHR0cFRyYW5zcG9ydFBpcGUgdGhhdCwgVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgdGhpcyggdGhhdC5jb2RlYy5jb3B5KCkgKTsKKyAgICAgICAgY2xvbmVyLmFkZCh0aGF0LHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBOZXh0QWN0aW9uIHByb2Nlc3NFeGNlcHRpb24oQE5vdE51bGwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSHR0cFRyYW5zcG9ydFBpcGUncyBwcm9jZXNzRXhjZXB0aW9uIHNob3VsZG4ndCBiZSBjYWxsZWQuIik7CisgICAgfQorCisgICAgcHVibGljIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoQE5vdE51bGwgUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIGRvUmV0dXJuV2l0aChwcm9jZXNzKHJlcXVlc3QpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzUmVzcG9uc2UoQE5vdE51bGwgUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkh0dHBUcmFuc3BvcnRQaXBlJ3MgcHJvY2Vzc1Jlc3BvbnNlIHNob3VsZG4ndCBiZSBjYWxsZWQuIik7CisgICAgfQorCisgICAgcHVibGljIFBhY2tldCBwcm9jZXNzKFBhY2tldCByZXF1ZXN0KSB7CisgICAgICAgIEh0dHBDbGllbnRUcmFuc3BvcnQgY29uOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZ2V0IHRyYW5zcG9ydCBoZWFkZXJzIGZyb20gbWVzc2FnZQorICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXFIZWFkZXJzID0gKE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4pIHJlcXVlc3QuaW52b2NhdGlvblByb3BlcnRpZXMuZ2V0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9IRUFERVJTKTsKKyAgICAgICAgICAgIC8vYXNzaWduIGVtcHR5IG1hcCBpZiBpdHMgbnVsbAorICAgICAgICAgICAgaWYocmVxSGVhZGVycyA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICByZXFIZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbiA9IG5ldyBIdHRwQ2xpZW50VHJhbnNwb3J0KHJlcXVlc3QscmVxSGVhZGVycyk7CisgICAgICAgICAgICByZXF1ZXN0LmFkZFNhdGVsbGl0ZShuZXcgSHR0cFJlc3BvbnNlUHJvcGVydGllcyhjb24pKTsKKworICAgICAgICAgICAgQ29udGVudFR5cGUgY3QgPSBjb2RlYy5nZXRTdGF0aWNDb250ZW50VHlwZShyZXF1ZXN0KTsKKyAgICAgICAgICAgIGlmIChjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJ1ZiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKKworICAgICAgICAgICAgICAgIGN0ID0gY29kZWMuZW5jb2RlKHJlcXVlc3QsIGJ1Zik7CisgICAgICAgICAgICAgICAgLy8gZGF0YSBzaXplIGlzIGF2YWlsYWJsZSwgc2V0IGl0IGFzIENvbnRlbnQtTGVuZ3RoCisgICAgICAgICAgICAgICAgcmVxSGVhZGVycy5wdXQoIkNvbnRlbnQtTGVuZ3RoIiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChJbnRlZ2VyLnRvU3RyaW5nKGJ1Zi5zaXplKCkpKSk7CisgICAgICAgICAgICAgICAgcmVxSGVhZGVycy5wdXQoIkNvbnRlbnQtVHlwZSIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY3QuZ2V0Q29udGVudFR5cGUoKSkpOworICAgICAgICAgICAgICAgIGlmIChjdC5nZXRBY2NlcHRIZWFkZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcUhlYWRlcnMucHV0KCJBY2NlcHQiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGN0LmdldEFjY2VwdEhlYWRlcigpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlU09BUEFjdGlvbihyZXFIZWFkZXJzLCBjdC5nZXRTT0FQQWN0aW9uSGVhZGVyKCkscmVxdWVzdCk7CisKKyAgICAgICAgICAgICAgICBpZihkdW1wKQorICAgICAgICAgICAgICAgICAgICBkdW1wKGJ1ZiwgIkhUVFAgcmVxdWVzdCIsIHJlcUhlYWRlcnMpOworCisgICAgICAgICAgICAgICAgYnVmLndyaXRlVG8oY29uLmdldE91dHB1dCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2V0IHN0YXRpYyBDb250ZW50LVR5cGUKKyAgICAgICAgICAgICAgICByZXFIZWFkZXJzLnB1dCgiQ29udGVudC1UeXBlIiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjdC5nZXRDb250ZW50VHlwZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKGN0LmdldEFjY2VwdEhlYWRlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxSGVhZGVycy5wdXQoIkFjY2VwdCIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY3QuZ2V0QWNjZXB0SGVhZGVyKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVTT0FQQWN0aW9uKHJlcUhlYWRlcnMsIGN0LmdldFNPQVBBY3Rpb25IZWFkZXIoKSwgcmVxdWVzdCk7CisKKyAgICAgICAgICAgICAgICBpZihkdW1wKSB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBidWYgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGVjLmVuY29kZShyZXF1ZXN0LCBidWYpOworICAgICAgICAgICAgICAgICAgICBkdW1wKGJ1ZiwgIkhUVFAgcmVxdWVzdCIsIHJlcUhlYWRlcnMpOworICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gY29uLmdldE91dHB1dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi53cml0ZVRvKG91dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBjb24uZ2V0T3V0cHV0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy5lbmNvZGUocmVxdWVzdCwgb3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb24uY2xvc2VPdXRwdXQoKTsKKworICAgICAgICAgICAgY29uLmNoZWNrUmVzcG9uc2VDb2RlKCk7CisgICAgICAgICAgICBpZiAoY29uLnN0YXR1c0NvZGU9PSBXU0hUVFBDb25uZWN0aW9uLk9ORVdBWSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmNyZWF0ZUNsaWVudFJlc3BvbnNlKG51bGwpOyAgICAvLyBvbmUgd2F5LiBubyByZXNwb25zZSBnaXZlbi4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IGNvbi5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTm8gQ29udGVudC10eXBlIGluIHRoZSBoZWFkZXIhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgaWYgcmV0dXJuZWQgTUlNRSB0eXBlIGlzIHRoZSBzYW1lIGFzIHRoYXQgd2hpY2ggd2FzIHNlbnQKKyAgICAgICAgICAgIC8vIG9yIGlzIGFjY2VwdGFibGUgaWYgYW4gQWNjZXB0IGhlYWRlciB3YXMgdXNlZAorICAgICAgICAgICAgUGFja2V0IHJlcGx5ID0gcmVxdWVzdC5jcmVhdGVDbGllbnRSZXNwb25zZShudWxsKTsKKyAgICAgICAgICAgIC8vcmVwbHkuYWRkU2F0ZWxsaXRlKG5ldyBIdHRwUmVzcG9uc2VQcm9wZXJ0aWVzKGNvbikpOworICAgICAgICAgICAgcmVwbHkud2FzVHJhbnNwb3J0U2VjdXJlID0gY29uLmlzU2VjdXJlKCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSByZXNwb25zZSA9IGNvbi5nZXRJbnB1dCgpOworICAgICAgICAgICAgaWYoZHVtcCkgeworICAgICAgICAgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBidWYgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgYnVmLndyaXRlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBkdW1wKGJ1ZiwiSFRUUCByZXNwb25zZSAiK2Nvbi5zdGF0dXNDb2RlLCBjb24uZ2V0SGVhZGVycygpKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IGJ1Zi5uZXdJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWMuZGVjb2RlKHJlc3BvbnNlLCBjb250ZW50VHlwZSwgcmVwbHkpOworICAgICAgICAgICAgcmV0dXJuIHJlcGx5OworICAgICAgICB9IGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gd2V4KSB7CisgICAgICAgICAgICB0aHJvdyB3ZXg7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3cml0ZSBTT0FQQWN0aW9uIGhlYWRlciBpZiB0aGUgc29hcEFjdGlvbiBwYXJhbWV0ZXIgaXMgbm9uLW51bGwgb3IgQmluZGluZ1Byb3ZpZGVyIHByb3BlcnRpZXMgc2V0LgorICAgICAqIEJpbmRpbmdQcm92aWRlciBwcm9wZXJ0aWVzIHRha2UgcHJlY2VkZW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVTT0FQQWN0aW9uKE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVxSGVhZGVycywgU3RyaW5nIHNvYXBBY3Rpb24sIFBhY2tldCBwYWNrZXQpIHsKKyAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHJlcUhlYWRlcnMucHV0KCJTT0FQQWN0aW9uIiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzb2FwQWN0aW9uKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcUhlYWRlcnMucHV0KCJTT0FQQWN0aW9uIiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiXCJcIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvLiBJbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkuCisgICAgfQorCisgICAgcHVibGljIEh0dHBUcmFuc3BvcnRQaXBlIGNvcHkoVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIdHRwVHJhbnNwb3J0UGlwZSh0aGlzLGNsb25lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXAoQnl0ZUFycmF5QnVmZmVyIGJ1ZiwgU3RyaW5nIGNhcHRpb24sIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS1bIitjYXB0aW9uICsiXS0tLSIpOworICAgICAgICBmb3IgKEVudHJ5PFN0cmluZyxMaXN0PFN0cmluZz4+IGhlYWRlciA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYoaGVhZGVyLmdldFZhbHVlKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gSSBkb24ndCB0aGluayB0aGlzIGlzIGxlZ2FsLCBidXQgbGV0J3MganVzdCBkdW1wIGl0LAorICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBwb2ludCBvZiB0aGUgZHVtcCBpcyB0byB1bmNvdmVyIHByb2JsZW1zLgorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihoZWFkZXIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogaGVhZGVyLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGhlYWRlci5nZXRLZXkoKSsiOiAiK3ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWYud3JpdGVUbyhTeXN0ZW0ub3V0KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIER1bXBzIHdoYXQgZ29lcyBhY3Jvc3MgSFRUUCB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGR1bXA7CisKKyAgICBzdGF0aWMgeworICAgICAgICBib29sZWFuIGI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiID0gQm9vbGVhbi5nZXRCb29sZWFuKEh0dHBUcmFuc3BvcnRQaXBlLmNsYXNzLmdldE5hbWUoKSsiLmR1bXAiKTsKKyAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICBiID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZHVtcCA9IGI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L1JmY0RhdGVQYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL2NsaWVudC9SZmNEYXRlUGFyc2VyLmphdmEKaW5kZXggMTE3MGVkNS4uNmRlOWY5NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvY2xpZW50L1JmY0RhdGVQYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9jbGllbnQvUmZjRGF0ZVBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDYgKzI2LDcgQEAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuY2xpZW50OwogCiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwpAQCAtMzgsOSArMzksNyBAQAogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCi1wdWJsaWMgY2xhc3MgUmZjRGF0ZVBhcnNlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVidWdQcm9wID0gImhvdGphdmEuZGVidWcuUmZjRGF0ZVBhcnNlciI7CitmaW5hbCBjbGFzcyBSZmNEYXRlUGFyc2VyIHsKICAgICBwcml2YXRlIGJvb2xlYW4gaXNHTVQgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhbmRhcmRGb3JtYXRzID0KICAgICAgICAgeyAiRUVFRScsICdkZC1NTU0teXkgSEg6bW06c3MgeiIsIC8vIFJGQyA4NTAgKG9ic29sZXRlZCBieSAxMDM2KQpAQCAtMTA4LDcgKzEwNyw3IEBACiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBkZi5wYXJzZShkYXRlU3RyaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRW5kcG9pbnREb2NJbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRW5kcG9pbnREb2NJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWI5Y2EuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0VuZHBvaW50RG9jSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5Eb2NJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLlNlcnZpY2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CeXRlQXJyYXlCdWZmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnREb2NJbmZvIGltcGxlbWVudHMgRG9jSW5mbyB7Ci0gICAgcHJpdmF0ZSBVUkwgcmVzb3VyY2VVcmw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlTdHJpbmc7Ci0gICAgcHJpdmF0ZSBCeXRlQXJyYXlCdWZmZXIgYnVmOwotICAgIHByaXZhdGUgRE9DX1RZUEUgZG9jVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyB0bnM7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBvcnRUeXBlOwotCi0gICAgcHVibGljIEVuZHBvaW50RG9jSW5mbyhVUkwgcmVzb3VyY2VVcmwsIEJ5dGVBcnJheUJ1ZmZlciBidWYpIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZVVybCA9IHJlc291cmNlVXJsOwotICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RG9jKCkgewotICAgICAgICByZXR1cm4gYnVmLm5ld0lucHV0U3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gcXVlcnlTdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyaW5nKSB7Ci0gICAgICAgIHRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2NUeXBlKERPQ19UWVBFIGRvY1R5cGUpIHsKLSAgICAgICAgdGhpcy5kb2NUeXBlID0gZG9jVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRE9DX1RZUEUgZ2V0RG9jVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGRvY1R5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0bnMpIHsKLSAgICAgICAgdGhpcy50bnMgPSB0bnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0bnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYXZpbmdQb3J0VHlwZShib29sZWFuIHBvcnRUeXBlKSB7Ci0gICAgICAgIHRoaXMucG9ydFR5cGUgPSBwb3J0VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hhdmluZ1BvcnRUeXBlKCkgewotICAgICAgICByZXR1cm4gcG9ydFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRVcmwoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZVVybDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9FbmRwb2ludEVudGl0eVJlc29sdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRW5kcG9pbnRFbnRpdHlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGFkNDhiLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9FbmRwb2ludEVudGl0eVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnV0aWwuQnl0ZUlucHV0U3RyZWFtOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5Eb2NJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BlbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludEVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewotCi0gICAgcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBjYXRhbG9nUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBEb2NJbmZvPiBtZXRhZGF0YTsKLQotICAgIC8qCi0gICAgICogQXNzdW1lcyBTb3VyY2Ugb2JqZWN0cyBjYW4gYmUgcmV1c2VkIG11bHRpcGxlIHRpbWVzCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50RW50aXR5UmVzb2x2ZXIoTWFwPFN0cmluZywgRG9jSW5mbz4gbWV0YWRhdGEpIHsKLSAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICBjYXRhbG9nUmVzb2x2ZXIgPSBYbWxVdGlsLmNyZWF0ZURlZmF1bHRDYXRhbG9nUmVzb2x2ZXIoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEl0IHJlc29sdmVzIHRoZSBzeXN0ZW1JZCBpbiB0aGUgbWV0YWRhdGEgZmlyc3QuIElmIGl0IGlzIG5vdCBmb3VuZCwgdGhlbgotICAgICAqIGl0IHRyaWVzIHRvIHJlc29sdmUgaW4gY2F0YWxvZwotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5IChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgRG9jSW5mbyBkb2NJbmZvID0gbWV0YWRhdGEuZ2V0KHN5c3RlbUlkKTsKLSAgICAgICAgICAgIGlmIChkb2NJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGRvY0luZm8uZ2V0RG9jKCk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoaW4pOwotICAgICAgICAgICAgICAgIGlzLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhdGFsb2dSZXNvbHZlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRW5kcG9pbnRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRW5kcG9pbnRJbXBsLmphdmEKaW5kZXggMWM2NjE1YS4uYjdiMWMzZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0VuZHBvaW50SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9FbmRwb2ludEltcGwuamF2YQpAQCAtMSw2ICsxLDUgQEAKLQogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDM5ICsyNSw5NCBAQAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKIAoraW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnN0cmVhbS5idWZmZXIuWE1MU3RyZWFtQnVmZmVyUmVzdWx0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5XU0JpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUVuZHBvaW50SW5mbzsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zZXJ2ZXIuSW5zdGFuY2VSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLlNERG9jdW1lbnRTb3VyY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLkVuZHBvaW50RmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuU2VydmVyUnRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOwogCi1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy4qOworaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUGVybWlzc2lvbjsKKworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiAKIAogLyoqCisgKiBJbXBsZW1lbnRzIHtAbGluayBFbmRwb2ludH0uCisgKiA8cC8+CisgKiA8cC8+CisgKiBUaGlzIGNsYXNzIGFjY3VtdWxhdGVzIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gY3JlYXRlCisgKiB7QGxpbmsgV1NFbmRwb2ludH0sIGFuZCB0aGVuIHdoZW4ge0BsaW5rICNwdWJsaXNofSBtZXRob2QKKyAqIGlzIGNhbGxlZCBpdCB3aWxsIGJlIGNyZWF0ZWQuCisgKiA8cC8+CisgKiA8cC8+CisgKiBUaGlzIG9iamVjdCBhbHNvIGFsbG93cyBhY2N1bXVsYXRlZCBpbmZvcm1hdGlvbiB0byBiZSByZXRyaWV2ZWQuCiAgKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQogICovCiBwdWJsaWMgY2xhc3MgRW5kcG9pbnRJbXBsIGV4dGVuZHMgRW5kcG9pbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2ViU2VydmljZVBlcm1pc3Npb24gRU5EUE9JTlRfUFVCTElTSF9QRVJNSVNTSU9OID0KLSAgICAgICAgbmV3IFdlYlNlcnZpY2VQZXJtaXNzaW9uKCJwdWJsaXNoRW5kcG9pbnQiKTsKLSAgICBwcml2YXRlIE9iamVjdCBhY3R1YWxFbmRwb2ludDsgICAgICAgIC8vIERvbid0IGRlY2xhcmUgYXMgSHR0cEVuZHBvaW50IHR5cGUKLSAgICBwcml2YXRlIEV4ZWN1dG9yIGV4ZWN1dG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBwdWJsaXNoZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN0b3BwZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5CaW5kaW5nIGJpbmRpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgaW1wbGVtZW50b3I7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxTb3VyY2U+IG1ldGFkYXRhOworICAgICAgICAgICAgbmV3IFdlYlNlcnZpY2VQZXJtaXNzaW9uKCJwdWJsaXNoRW5kcG9pbnQiKTsKIAotICAgIHB1YmxpYyBFbmRwb2ludEltcGwoU3RyaW5nIGJpbmRpbmdJZCwgT2JqZWN0IGltcGwpIHsKLSAgICAgICAgdGhpcy5pbXBsZW1lbnRvciA9IGltcGw7Ci0gICAgICAgIHRoaXMuYmluZGluZyA9IEJpbmRpbmdJbXBsLmdldEJpbmRpbmcoYmluZGluZ0lkLCBpbXBsLmdldENsYXNzKCksIG51bGwsIGZhbHNlKTsKKyAgICAvKioKKyAgICAgKiBPbmNlIHRoZSBzZXJ2aWNlIGlzIHB1Ymxpc2hlZCwgdGhpcyBmaWVsZCB3aWxsCisgICAgICogYmUgc2V0IHRvIHRoZSB7QGxpbmsgSHR0cEVuZHBvaW50fSBpbnN0YW5jZS4KKyAgICAgKiA8cC8+CisgICAgICogQnV0IGRvbid0IGRlY2xhcmUgdGhlIHR5cGUgYXMge0BsaW5rIEh0dHBFbmRwb2ludH0KKyAgICAgKiB0byBhdm9pZCBzdGF0aWMgdHlwZSBkZXBlbmRlbmN5IHRoYXQgY2F1c2UgdGhlIGNsYXNzIGxvYWRpbmcgdG8KKyAgICAgKiBmYWlsIGlmIHRoZSBMVyBIVFRQIHNlcnZlciBkb2Vzbid0IGV4aXN0LgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGFjdHVhbEVuZHBvaW50OworCisgICAgLy8gaW5mb3JtYXRpb24gYWNjdW11bGF0ZWQgZm9yIGNyZWF0aW5nIFdTRW5kcG9pbnQKKyAgICBwcml2YXRlIGZpbmFsIFdTQmluZGluZyBiaW5kaW5nOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGltcGxlbWVudG9yOworICAgIHByaXZhdGUgTGlzdDxTb3VyY2U+IG1ldGFkYXRhOworICAgIHByaXZhdGUgRXhlY3V0b3IgZXhlY3V0b3I7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOyAvLyBhbHdheXMgbm9uLW51bGwKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RvcHBlZDsKKworCisgICAgcHVibGljIEVuZHBvaW50SW1wbChATm90TnVsbCBCaW5kaW5nSUQgYmluZGluZ0lkLCBATm90TnVsbCBPYmplY3QgaW1wbCkgeworICAgICAgICBiaW5kaW5nID0gQmluZGluZ0ltcGwuY3JlYXRlKGJpbmRpbmdJZCk7CisgICAgICAgIGltcGxlbWVudG9yID0gaW1wbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwcyBhbiBhbHJlYWR5IGNyZWF0ZWQge0BsaW5rIFdTRW5kcG9pbnR9IGludG8gYW4ge0BsaW5rIEVuZHBvaW50SW1wbH0sCisgICAgICogYW5kIGltbWVkaWF0ZWx5IHB1Ymxpc2hlcyBpdCB3aXRoIHRoZSBnaXZlbiBjb250ZXh0LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBhIGJhY2tkb29yIG1ldGhvZC4gRG9uJ3QgdXNlIGl0IHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisgICAgICovCisgICAgcHVibGljIEVuZHBvaW50SW1wbChXU0VuZHBvaW50IHdzZSwgT2JqZWN0IHNlcnZlckNvbnRleHQpIHsKKyAgICAgICAgYWN0dWFsRW5kcG9pbnQgPSBuZXcgSHR0cEVuZHBvaW50KHdzZSwgZXhlY3V0b3IpOworICAgICAgICAoKEh0dHBFbmRwb2ludCkgYWN0dWFsRW5kcG9pbnQpLnB1Ymxpc2goc2VydmVyQ29udGV4dCk7CisgICAgICAgIGJpbmRpbmcgPSB3c2UuZ2V0QmluZGluZygpOworICAgICAgICBpbXBsZW1lbnRvciA9IG51bGw7IC8vIHRoaXMgdmlvbGF0ZXMgdGhlIHNlbWFudGljcywgYnV0IGhleSwgdGhpcyBpcyBhIGJhY2tkb29yLgogICAgIH0KIAogICAgIHB1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoKSB7CkBAIC03NSw2MyArMTI5LDQ2IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGFkZHJlc3MpOwogICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMIGZvciB0aGlzIGFkZHJlc3MgIithZGRyZXNzKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMIGZvciB0aGlzIGFkZHJlc3MgIiArIGFkZHJlc3MpOwogICAgICAgICB9CiAgICAgICAgIGlmICghdXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJodHRwIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXJsLmdldFByb3RvY29sKCkrIiBwcm90b2NvbCBiYXNlZCBhZGRyZXNzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXJsLmdldFByb3RvY29sKCkgKyAiIHByb3RvY29sIGJhc2VkIGFkZHJlc3MgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CiAgICAgICAgIGlmICghdXJsLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluY29ycmVjdCBXZWJTZXJ2aWNlIGFkZHJlc3M9IithZGRyZXNzKworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb3JyZWN0IFdlYlNlcnZpY2UgYWRkcmVzcz0iICsgYWRkcmVzcyArCiAgICAgICAgICAgICAgICAgICAgICIuIFRoZSBhZGRyZXNzJ3MgcGF0aCBzaG91bGQgc3RhcnQgd2l0aCAvIik7CiAgICAgICAgIH0KLSAgICAgICAgY2hlY2tQbGF0Zm9ybSgpOwotICAgICAgICAvLyBEb24ndCBsb2FkIEh0dHBFbmRwb2ludCBjbGFzcyBiZWZvcmUgYXMgaXQgbWF5IGxvYWQgSHR0cFNlcnZlciBjbGFzc2VzCi0gICAgICAgIGFjdHVhbEVuZHBvaW50ID0gbmV3IEh0dHBFbmRwb2ludChpbXBsZW1lbnRvciwgYmluZGluZywgbWV0YWRhdGEsIHByb3BlcnRpZXMsIGV4ZWN1dG9yKTsKLSAgICAgICAgKChIdHRwRW5kcG9pbnQpYWN0dWFsRW5kcG9pbnQpLnB1Ymxpc2goYWRkcmVzcyk7Ci0gICAgICAgIHB1Ymxpc2hlZCA9IHRydWU7CisgICAgICAgIGNyZWF0ZUVuZHBvaW50KCk7CisgICAgICAgICgoSHR0cEVuZHBvaW50KSBhY3R1YWxFbmRwb2ludCkucHVibGlzaChhZGRyZXNzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBwdWJsaXNoKE9iamVjdCBzZXJ2ZXJDb250ZXh0KSB7CiAgICAgICAgIGNhblB1Ymxpc2goKTsKLSAgICAgICAgY2hlY2tQbGF0Zm9ybSgpOwogICAgICAgICBpZiAoIWNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cENvbnRleHQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzZXJ2ZXJDb250ZXh0LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNlcnZlckNvbnRleHQuZ2V0Q2xhc3MoKSsiIGlzIG5vdCBhIHN1cHBvcnRlZCBjb250ZXh0LiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzZXJ2ZXJDb250ZXh0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhIHN1cHBvcnRlZCBjb250ZXh0LiIpOwogICAgICAgICB9Ci0gICAgICAgIC8vIERvbid0IGxvYWQgSHR0cEVuZHBvaW50IGNsYXNzIGJlZm9yZSBhcyBpdCBtYXkgbG9hZCBIdHRwU2VydmVyIGNsYXNzZXMKLSAgICAgICAgYWN0dWFsRW5kcG9pbnQgPSBuZXcgSHR0cEVuZHBvaW50KGltcGxlbWVudG9yLCBiaW5kaW5nLCBtZXRhZGF0YSwgcHJvcGVydGllcywgZXhlY3V0b3IpOwotICAgICAgICAoKEh0dHBFbmRwb2ludClhY3R1YWxFbmRwb2ludCkucHVibGlzaChzZXJ2ZXJDb250ZXh0KTsKLSAgICAgICAgcHVibGlzaGVkID0gdHJ1ZTsKKyAgICAgICAgY3JlYXRlRW5kcG9pbnQoKTsKKyAgICAgICAgKChIdHRwRW5kcG9pbnQpIGFjdHVhbEVuZHBvaW50KS5wdWJsaXNoKHNlcnZlckNvbnRleHQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChwdWJsaXNoZWQpIHsKLSAgICAgICAgICAgICgoSHR0cEVuZHBvaW50KWFjdHVhbEVuZHBvaW50KS5zdG9wKCk7Ci0gICAgICAgICAgICBwdWJsaXNoZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGlzUHVibGlzaGVkKCkpIHsKKyAgICAgICAgICAgICgoSHR0cEVuZHBvaW50KSBhY3R1YWxFbmRwb2ludCkuc3RvcCgpOworICAgICAgICAgICAgYWN0dWFsRW5kcG9pbnQgPSBudWxsOwogICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIHB1Ymxpc2hlZDsKKyAgICAgICAgcmV0dXJuIGFjdHVhbEVuZHBvaW50ICE9IG51bGw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNhblB1Ymxpc2goKSB7Ci0gICAgICAgIGlmIChwdWJsaXNoZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNhbm5vdCBwdWJsaXNoIHRoaXMgZW5kcG9pbnQuIEVuZHBvaW50IGhhcyBiZWVuIGFscmVhZHkgcHVibGlzaGVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdG9wcGVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDYW5ub3QgcHVibGlzaCB0aGlzIGVuZHBvaW50LiBFbmRwb2ludCBoYXMgYmVlbiBhbHJlYWR5IHN0b3BwZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8U291cmNlPiBnZXRNZXRhZGF0YSgpIHsKKyAgICBwdWJsaWMgTGlzdDxTb3VyY2U+IGdldE1ldGFkYXRhKCkgewogICAgICAgICByZXR1cm4gbWV0YWRhdGE7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGEoamF2YS51dGlsLkxpc3Q8U291cmNlPiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocHVibGlzaGVkKSB7CisgICAgICAgIGlmIChpc1B1Ymxpc2hlZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IE1ldGFkYXRhLiBFbmRwb2ludCBpcyBhbHJlYWR5IHB1Ymxpc2hlZCIpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKQEAgLTE0NiwxOSArMTgzLDE4IEBACiAgICAgfQogCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4ocHJvcGVydGllcyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBtYXA7CisgICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PihtYXApOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgcGVybWlzc2lvbiBvZiAicHVibGlzaEVuZHBvaW50IiBiZWZvcmUgYWNjZXNzaW5nIEhUVFAgY2xhc3Nlcy4KLSAgICAgKiBBbHNvIGl0IGNoZWNrcyBpZiB0aGVyZSBpcyBhbiBhdmFpbGFibGUgSFRUUCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGxhdGZvcm0oKSB7Ci0KKyAgICAvKgorICAgICogQ2hlY2tzIHRoZSBwZXJtaXNzaW9uIG9mICJwdWJsaXNoRW5kcG9pbnQiIGJlZm9yZSBhY2Nlc3NpbmcgSFRUUCBjbGFzc2VzLgorICAgICogQWxzbyBpdCBjaGVja3MgaWYgdGhlcmUgaXMgYW4gYXZhaWxhYmxlIEhUVFAgc2VydmVyIGltcGxlbWVudGF0aW9uLgorICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuZHBvaW50KCkgewogICAgICAgICAvLyBDaGVja3MgcGVybWlzc2lvbiBmb3IgInB1Ymxpc2hFbmRwb2ludCIKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc20gIT0gbnVsbCkgewpAQCAtMTY4LDEwICsyMDQsOTggQEAKICAgICAgICAgLy8gU2VlIGlmIEh0dHBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBTZXJ2ZXIiKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOT1QgU1VQUE9SVEVEIik7CiAgICAgICAgIH0KIAorICAgICAgICBXU0VuZHBvaW50IHdzZSA9IFdTRW5kcG9pbnQuY3JlYXRlKAorICAgICAgICAgICAgICAgIChDbGFzczw/PikgaW1wbGVtZW50b3IuZ2V0Q2xhc3MoKSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICBJbnN0YW5jZVJlc29sdmVyLmNyZWF0ZVNpbmdsZXRvbihpbXBsZW1lbnRvcikuY3JlYXRlSW52b2tlcigpLAorICAgICAgICAgICAgICAgIGdldFByb3BlcnR5KFFOYW1lLmNsYXNzLCBFbmRwb2ludC5XU0RMX1NFUlZJQ0UpLAorICAgICAgICAgICAgICAgIGdldFByb3BlcnR5KFFOYW1lLmNsYXNzLCBFbmRwb2ludC5XU0RMX1BPUlQpLAorICAgICAgICAgICAgICAgIG51bGwgLyogbm8gY29udGFpbmVyICovLAorICAgICAgICAgICAgICAgIGJpbmRpbmcsCisgICAgICAgICAgICAgICAgZ2V0UHJpbWFyeVdzZGwoKSwKKyAgICAgICAgICAgICAgICBidWlsZERvY0xpc3QoKSwKKyAgICAgICAgICAgICAgICAoRW50aXR5UmVzb2x2ZXIpIG51bGwKKyAgICAgICAgKTsKKyAgICAgICAgLy8gRG9uJ3QgbG9hZCBIdHRwRW5kcG9pbnQgY2xhc3MgYmVmb3JlIGFzIGl0IG1heSBsb2FkIEh0dHBTZXJ2ZXIgY2xhc3NlcworICAgICAgICBhY3R1YWxFbmRwb2ludCA9IG5ldyBIdHRwRW5kcG9pbnQod3NlLCBleGVjdXRvcik7CiAgICAgfQogCisgICAgcHJpdmF0ZSA8VD4gVCBnZXRQcm9wZXJ0eShDbGFzczxUPiB0eXBlLCBTdHJpbmcga2V5KSB7CisgICAgICAgIE9iamVjdCBvID0gcHJvcGVydGllcy5nZXQoa2V5KTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh0eXBlLmlzSW5zdGFuY2UobykpCisgICAgICAgICAgICByZXR1cm4gdHlwZS5jYXN0KG8pOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsga2V5ICsgIiBoYXMgdG8gYmUgb2YgdHlwZSAiICsgdHlwZSk7ICAgLy8gaTE4bgorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgbWV0YWRhdGEgc291cmNlcyB1c2luZyBpZGVudGl0eSB0cmFuc2Zvcm0uIFNvIHRoYXQgd2UgY2FuCisgICAgICogcmV1c2UgdGhlIFNvdXJjZSBvYmplY3QgbXVsdGlwbGUgdGltZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PFNERG9jdW1lbnRTb3VyY2U+IGJ1aWxkRG9jTGlzdCgpIHsKKyAgICAgICAgTGlzdDxTRERvY3VtZW50U291cmNlPiByID0gbmV3IEFycmF5TGlzdDxTRERvY3VtZW50U291cmNlPigpOworCisgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFhtbFV0aWwubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgICAgICAgIGZvciAoU291cmNlIHNvdXJjZSA6IG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtQnVmZmVyUmVzdWx0IHhzYnIgPSBuZXcgWE1MU3RyZWFtQnVmZmVyUmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHhzYnIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQgPSBzb3VyY2UuZ2V0U3lzdGVtSWQoKTsKKworICAgICAgICAgICAgICAgICAgICByLmFkZChTRERvY3VtZW50U291cmNlLmNyZWF0ZShuZXcgVVJMKHN5c3RlbUlkKSwgeHNici5nZXRYTUxTdHJlYW1CdWZmZXIoKSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigic2VydmVyLnJ0LmVyciIsIHRlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB0ZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNlcnZlci5ydC5lcnIiLCB0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3c2RsIGZyb20gQFdlYlNlcnZpY2Ugb3IgQFdlYlNlcnZpY2VQcm92aWRlcgorICAgICAqLworICAgIHByaXZhdGUgQE51bGxhYmxlIFNERG9jdW1lbnRTb3VyY2UgZ2V0UHJpbWFyeVdzZGwoKSB7CisgICAgICAgIENsYXNzIGltcGxUeXBlID0gaW1wbGVtZW50b3IuZ2V0Q2xhc3MoKTsKKyAgICAgICAgLy8gVGFrZXMgY2FyZSBvZiBAV2ViU2VydmljZSwgQFdlYlNlcnZpY2VQcm92aWRlcidzIHdzZGxMb2NhdGlvbgorICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gRW5kcG9pbnRGYWN0b3J5LmdldFdzZGxMb2NhdGlvbihpbXBsVHlwZSk7CisgICAgICAgIGlmICh3c2RsTG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBpbXBsVHlwZS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgVVJMIHVybCA9IGNsLmdldFJlc291cmNlKHdzZGxMb2NhdGlvbik7CisgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0REb2N1bWVudFNvdXJjZS5jcmVhdGUodXJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigiY2Fubm90LmxvYWQud3NkbCIsIHdzZGxMb2NhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNhblB1Ymxpc2goKSB7CisgICAgICAgIGlmIChpc1B1Ymxpc2hlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHB1Ymxpc2ggdGhpcyBlbmRwb2ludC4gRW5kcG9pbnQgaGFzIGJlZW4gYWxyZWFkeSBwdWJsaXNoZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0b3BwZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcHVibGlzaCB0aGlzIGVuZHBvaW50LiBFbmRwb2ludCBoYXMgYmVlbiBhbHJlYWR5IHN0b3BwZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoRWxlbWVudC4uLnJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIGdldEVuZHBvaW50UmVmZXJlbmNlKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzLCByZWZlcmVuY2VQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gVCBnZXRFbmRwb2ludFJlZmVyZW5jZShDbGFzczxUPiBjbGF6eiwgRWxlbWVudC4uLnJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgaWYgKCFpc1B1Ymxpc2hlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRW5kcG9pbnQgaXMgbm90IHB1Ymxpc2hlZCB5ZXQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChIdHRwRW5kcG9pbnQpYWN0dWFsRW5kcG9pbnQpLmdldEVuZHBvaW50UmVmZXJlbmNlKGNsYXp6LHJlZmVyZW5jZVBhcmFtZXRlcnMpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwRW5kcG9pbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwRW5kcG9pbnQuamF2YQppbmRleCA2ZjJkODcyLi40NDRhYzQ0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSHR0cEVuZHBvaW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0h0dHBFbmRwb2ludC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDI2NSArMjYsNzMgQEAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwogCiBpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuRG9jSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUVuZHBvaW50SW5mbzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuSHR0cEFkYXB0ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuSHR0cEFkYXB0ZXJMaXN0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TZXJ2ZXJSdEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuVGllOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwueG1sLlhtbFV0aWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuV1NFbmRwb2ludEltcGw7CiAKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5CaW5kaW5nOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIAogLyoqCisgKiBIaWRlcyB7QGxpbmsgSHR0cENvbnRleHR9IHNvIHRoYXQge0BsaW5rIEVuZHBvaW50SW1wbH0KKyAqIG1heSBsb2FkIGV2ZW4gd2l0aG91dCB7QGxpbmsgSHR0cENvbnRleHR9LgogICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQorICogVE9ETzogQnV0IHdoYXQncyB0aGUgcG9pbnQ/IElmIExpZ2h0LXdlaWdodCBIVFRQIHNlcnZlciBpc24ndCBwcmVzZW50LAorICogYWxsIHRoZSBwdWJsaXNoIG9wZXJhdGlvbnMgd2lsbCBmYWlsIHdheS4gV2h5IGlzIGl0IGJldHRlciB0byBkZWZlcgorICogdGhlIGZhaWx1cmUsIGFzIG9wcG9zZWQgdG8gY2F1c2UgdGhlIGZhaWx1cmUgYXMgZWFyeWwgYXMgcG9zc2libGU/IC1LSworICoKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CiAgKi8KLXB1YmxpYyBjbGFzcyBIdHRwRW5kcG9pbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9Ci0gICAgICAgIExvZ2dlci5nZXRMb2dnZXIoCi0gICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5zZXJ2ZXIuaHR0cCIpOwotCitmaW5hbCBjbGFzcyBIdHRwRW5kcG9pbnQgewogICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3M7CiAgICAgcHJpdmF0ZSBIdHRwQ29udGV4dCBodHRwQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvOwotICAgIHByaXZhdGUgU3RyaW5nIHByaW1hcnlXc2RsOwotICAgIHByaXZhdGUgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwQWRhcHRlciBhZGFwdGVyOworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RIUkVBRFMgPSA1OwotCi0gICAgcHVibGljIEh0dHBFbmRwb2ludChPYmplY3QgaW1wbGVtZW50b3IsIEJpbmRpbmcgYmluZGluZywgTGlzdDxTb3VyY2U+bWV0YWRhdGEsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcywgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgZW5kcG9pbnRJbmZvID0gbmV3IFJ1bnRpbWVFbmRwb2ludEluZm8oKTsKLSAgICAgICAgZW5kcG9pbnRJbmZvLnNldEltcGxlbWVudG9yKGltcGxlbWVudG9yKTsKLSAgICAgICAgZW5kcG9pbnRJbmZvLnNldEltcGxlbWVudG9yQ2xhc3MoaW1wbGVtZW50b3IuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGVuZHBvaW50SW5mby5zZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICBlbmRwb2ludEluZm8uc2V0VXJsUGF0dGVybigiIik7Ci0gICAgICAgIGVuZHBvaW50SW5mby5zZXRNZXRhZGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisgICAgcHVibGljIEh0dHBFbmRwb2ludChXU0VuZHBvaW50IGVuZHBvaW50LCBFeGVjdXRvciBleGVjdXRvcikgewogICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgU2VydmljZSBOYW1lIGlzIGluIHByb3BlcnRpZXMsIHNldCBpdCBvbiBSdW50aW1lRW5kcG9pbnRJbmZvCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFNlcnZpY2VOYW1lKCkgewotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9IChRTmFtZSlwcm9wZXJ0aWVzLmdldChFbmRwb2ludC5XU0RMX1NFUlZJQ0UpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludEluZm8uc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgUG9ydCBOYW1lIGlzIGluIHByb3BlcnRpZXMsIHNldCBpdCBvbiBSdW50aW1lRW5kcG9pbnRJbmZvCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFBvcnROYW1lKCkgewotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBwb3J0TmFtZSA9IChRTmFtZSlwcm9wZXJ0aWVzLmdldChFbmRwb2ludC5XU0RMX1BPUlQpOwotICAgICAgICAgICAgaWYgKHBvcnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludEluZm8uc2V0UG9ydE5hbWUocG9ydE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBtZXRhZGF0YSBzb3VyY2VzIHVzaW5nIGlkZW50aXR5IHRyYW5zZm9ybS4gU28gdGhhdCB3ZSBjYW4KLSAgICAgKiByZXVzZSB0aGUgU291cmNlIG9iamVjdCBtdWx0aXBsZSB0aW1lcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0RG9jSW5mbygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBMaXN0PFNvdXJjZT4gbWV0YWRhdGEgPSBlbmRwb2ludEluZm8uZ2V0TWV0YWRhdGEoKTsKLQotICAgICAgICAvLyBUYWtlcyBjYXJlIG9mIEBXZWJTZXJ2aWNlLCBAV2ViU2VydmljZVByb3ZpZGVyJ3Mgd3NkbExvY2F0aW9uCi0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBlbmRwb2ludEluZm8uZ2V0V3NkbExvY2F0aW9uKCk7Ci0gICAgICAgIGlmICh3c2RsTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBlbmRwb2ludEluZm8uZ2V0SW1wbGVtZW50b3JDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBVUkwgdXJsID0gY2wuZ2V0UmVzb3VyY2Uod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigiY2Fubm90LmxvYWQud3NkbCIsIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UodXJsLm9wZW5TdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJzZXJ2ZXIucnQuZXJyIiwgaW9lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpbWFyeVdzZGwgPSB1cmwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgICAgICAgICBzb3VyY2Uuc2V0U3lzdGVtSWQocHJpbWFyeVdzZGwpOwotICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gbmV3IEFycmF5TGlzdDxTb3VyY2U+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW5mby5zZXRNZXRhZGF0YShtZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGFkYXRhLmFkZChzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlcyBEb2NJbmZvIGZvciBlYWNoIG1ldGRhdGEgU291cmNlCi0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEb2NJbmZvPiBuZXdNZXRhZGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgRG9jSW5mbz4oKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgZm9yKFNvdXJjZSBzb3VyY2U6IG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJhb3MgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiB0ZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNlcnZlci5ydC5lcnIiLHRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkID0gc291cmNlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgICAgICAgICAgVVJMIHVybDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHN5c3RlbUlkKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuc2V2ZXJlKCJNZXRhZGF0YSBTb3VyY2UncyBzeXN0ZW1JZD0iK3N5c3RlbUlkKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgaW5jb3JyZWN0LiBQcm92aWRlIGEgY29ycmVjdCBvbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEVuZHBvaW50RG9jSW5mbyBkb2NJbmZvID0gbmV3IEVuZHBvaW50RG9jSW5mbyh1cmwsIGJhb3MpOwotICAgICAgICAgICAgICAgIERvY0luZm8gb2xkID0gbmV3TWV0YWRhdGEucHV0KHN5c3RlbUlkLCBkb2NJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkR1cGxpY2F0ZSBTb3VyY2Ugb2JqZWN0cyBmb3Igc3lzdGVtSWQ9IitzeXN0ZW1JZCsiIGluIG1ldGFkYXRhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5kcG9pbnRJbmZvLnNldE1ldGFkYXRhKG5ld01ldGFkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHByaW1hcnkgV1NETAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaW5kUHJpbWFyeVdTREwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwPFN0cmluZywgRG9jSW5mbz4gbWV0YWRhdGEgPSBlbmRwb2ludEluZm8uZ2V0RG9jTWV0YWRhdGEoKTsKLSAgICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIHdzZGxMb2NhdGlvbiByZXNvdXJjZSBpcyBhIHByaW1hcnkgd3NkbAotICAgICAgICBpZiAocHJpbWFyeVdzZGwgIT0gbnVsbCkgewotICAgICAgICAgICAgRG9jSW5mbyBkb2NJbmZvID0gbWV0YWRhdGEuZ2V0KHByaW1hcnlXc2RsKTsKLSAgICAgICAgICAgIGlmIChkb2NJbmZvLmdldFNlcnZpY2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJub3QucHJpbWFyeS53c2RsIiwgcHJpbWFyeVdzZGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrcyB3aGV0aGVyIG1ldGFkYXRhIGNvbnRhaW5zIGR1cGxpY2F0ZSBwcmltYXJ5IHdzZGxzIG9yIGFic3RyYWN0IHdzZHNsCi0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGNvbmNyZXRlV3NkbCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBhYnN0cmFjdFdzZGwgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcihFbnRyeTxTdHJpbmcsIERvY0luZm8+IGVudHJ5OiBtZXRhZGF0YS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgRG9jSW5mbyBkb2NJbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZG9jSW5mby5nZXRTZXJ2aWNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmNyZXRlV3NkbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uY3JldGVXc2RsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdEV4Y2VwdGlvbigiZHVwbGljYXRlLnByaW1hcnkud3NkbCIsIGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZG9jSW5mby5pc0hhdmluZ1BvcnRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhYnN0cmFjdFdzZGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0V3NkbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oImR1cGxpY2F0ZS5hYnN0cmFjdC53c2RsIiwgZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IoRW50cnk8U3RyaW5nLCBEb2NJbmZvPiBlbnRyeTogbWV0YWRhdGEuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIERvY0luZm8gZG9jSW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvY0luZm8uZ2V0U2VydmljZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9ub3QgZ2VuZXJhdGUgYW55IFdTREwgb3IgU2NoZW1hIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gbmV3IFVSTChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEVudGl0eVJlc29sdmVyIHJlc29sdmVyID0gbmV3IEVuZHBvaW50RW50aXR5UmVzb2x2ZXIobWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEluZm8uc2V0V3NkbEluZm8od3NkbFVybCwgcmVzb2x2ZXIpOwotICAgICAgICAgICAgICAgICAgICBkb2NJbmZvLnNldFF1ZXJ5U3RyaW5nKCJ3c2RsIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGxzIFJ1bnRpbWVFbmRwb2ludEluZm8gd2l0aCBTZXJ2aWNlTmFtZSwgYW5kIFBvcnROYW1lIGZyb20gcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxFbmRwb2ludEluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc2V0IFNlcnZpY2UgTmFtZSBmcm9tIHByb3BlcnRpZXMgb24gUnVudGltZUVuZHBvaW50SW5mbwotICAgICAgICBzZXRTZXJ2aWNlTmFtZSgpOwotCi0gICAgICAgIC8vIHNldCBQb3J0IE5hbWUgZnJvbSBwcm9wZXJ0aWVzIG9uIFJ1bnRpbWVFbmRwb2ludEluZm8KLSAgICAgICAgc2V0UG9ydE5hbWUoKTsKLQotICAgICAgICAvLyBTZXRzIHRoZSBjb3JyZWN0IFNlcnZpY2UgTmFtZQotICAgICAgICBlbmRwb2ludEluZm8uZG9TZXJ2aWNlTmFtZVByb2Nlc3NpbmcoKTsKLQotICAgICAgICAvLyBTZXRzIHRoZSBjb3JyZWN0IFBvcnQgTmFtZQotICAgICAgICBlbmRwb2ludEluZm8uZG9Qb3J0TmFtZVByb2Nlc3NpbmcoKTsKLQotICAgICAgICAvLyBTZXRzIHRoZSBQb3J0VHlwZSBOYW1lCi0gICAgICAgIGVuZHBvaW50SW5mby5kb1BvcnRUeXBlTmFtZVByb2Nlc3NpbmcoKTsKLQotICAgICAgICAvLyBDcmVhdGVzIERvY0luZm8gZnJvbSBtZXRhZGF0YSBhbmQgc2V0cyBpdCBvbiBSdW50aW1lRW5kcG9pbnRpbmZvCi0gICAgICAgIHNldERvY0luZm8oKTsKLQotICAgICAgICAvLyBGaWxsIERvY0luZm8gd2l0aCBkb2N1ZW50IGluZm8gOiBXU0RMIG9yIFNjaGVtYSwgdGFyZ2V0TlMgZXRjLgotICAgICAgICBSdW50aW1lRW5kcG9pbnRJbmZvLmZpbGxEb2NJbmZvKGVuZHBvaW50SW5mbyk7Ci0KLSAgICAgICAgLy8gRmluZHMgcHJpbWFyeSBXU0RMIGZyb20gbWV0YWRhdGEgZG9jdW1lbnRzCi0gICAgICAgIGZpbmRQcmltYXJ5V1NETCgpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIG5lY2Vzc2FyeSBXU0RMIGFuZCBTY2hlbWEgZG9jdW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVXU0RMRG9jcygpIHsKLSAgICAgICAgaWYgKGVuZHBvaW50SW5mby5uZWVkV1NETEdlbmVyYXRpb24oKSkgewotICAgICAgICAgICAgZW5kcG9pbnRJbmZvLmdlbmVyYXRlV1NETCgpOwotICAgICAgICB9CisgICAgICAgIHRoaXMuYWRhcHRlciA9IEh0dHBBZGFwdGVyLmNyZWF0ZUFsb25lKGVuZHBvaW50KTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBwdWJsaXNoKFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgICAgICAgaHR0cENvbnRleHQgPSBTZXJ2ZXJNZ3IuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb250ZXh0KGFkZHJlc3MpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoKGh0dHBDb250ZXh0KTsKLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTZXJ2ZXJNZ3IuZ2V0SW5zdGFuY2UoKS5yZW1vdmVDb250ZXh0KGh0dHBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNlcnZlci5ydC5lcnIiLCBlICk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgaHR0cENvbnRleHQgPSBTZXJ2ZXJNZ3IuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb250ZXh0KGFkZHJlc3MpOworICAgICAgICBwdWJsaXNoKGh0dHBDb250ZXh0KTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBwdWJsaXNoKE9iamVjdCBzZXJ2ZXJDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuaHR0cENvbnRleHQgPSAoSHR0cENvbnRleHQpc2VydmVyQ29udGV4dDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHB1Ymxpc2goaHR0cENvbnRleHQpOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyUnRFeGNlcHRpb24oInNlcnZlci5ydC5lcnIiLCBuZXcgT2JqZWN0W10geyBlIH0gKTsKKyAgICAgICAgaWYgKCEoc2VydmVyQ29udGV4dCBpbnN0YW5jZW9mIEh0dHBDb250ZXh0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlclJ0RXhjZXB0aW9uKCJub3QuSHR0cENvbnRleHQudHlwZSIsIHNlcnZlckNvbnRleHQuZ2V0Q2xhc3MoKSk7CiAgICAgICAgIH0KKworICAgICAgICB0aGlzLmh0dHBDb250ZXh0ID0gKEh0dHBDb250ZXh0KXNlcnZlckNvbnRleHQ7CisgICAgICAgIHB1Ymxpc2goaHR0cENvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2FuIGJlIGNhbGxlZCBvbmx5IGFmdGVyIHB1Ymxpc2gKKyAgICAgKiBAcmV0dXJuIGFkZHJlc3Mgb2YgdGhlIEVuZHBvaW50CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RVBSQWRkcmVzcygpIHsKKyAgICAgICAgaWYoYWRkcmVzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBBcHBsaWNhdGlvbiBjcmVhdGVkIGl0cyBvd24gSHR0cENvbnRleHQKKyAgICAgICAgICAgIHJldHVybiBodHRwQ29udGV4dC5nZXRTZXJ2ZXIoKS5nZXRBZGRyZXNzKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewogICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBBcHBsaWNhdGlvbiBjcmVhdGVkIGl0cyBvd24gSHR0cENvbnRleHQKKyAgICAgICAgICAgIC8vIGh0dHBDb250ZXh0LnNldEhhbmRsZXIobnVsbCk7CiAgICAgICAgICAgICBodHRwQ29udGV4dC5nZXRTZXJ2ZXIoKS5yZW1vdmVDb250ZXh0KGh0dHBDb250ZXh0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFJlbW92ZSBIdHRwQ29udGV4dCBjcmVhdGVkIGJ5IEpBWFdTIHJ1bnRpbWUKQEAgLTI5MiwyMiArMTAwLDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBJbnZva2UgV2ViU2VydmljZSBMaWZlIGN5Y2xlIG1ldGhvZAotICAgICAgICBlbmRwb2ludEluZm8uZW5kU2VydmljZSgpOworICAgICAgICBhZGFwdGVyLmdldEVuZHBvaW50KCkuZGlzcG9zZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBwdWJsaXNoIChIdHRwQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZW5kcG9pbnRJbmZvLnZlcmlmeUltcGxlbWVudG9yQ2xhc3MoKTsKLSAgICAgICAgZmlsbEVuZHBvaW50SW5mbygpOwotICAgICAgICBlbmRwb2ludEluZm8uaW5pdCgpOwotICAgICAgICBnZW5lcmF0ZVdTRExEb2NzKCk7Ci0gICAgICAgIFJ1bnRpbWVFbmRwb2ludEluZm8ucHVibGlzaFdTRExEb2NzKGVuZHBvaW50SW5mbyk7Ci0gICAgICAgIGxvZ2dlci5maW5lKCJEb2MgTWV0YWRhdGE9IitlbmRwb2ludEluZm8uZ2V0RG9jTWV0YWRhdGEoKSk7Ci0gICAgICAgIFdlYlNlcnZpY2VDb250ZXh0IHdzQ29udGV4dCA9IG5ldyBXZWJTZXJ2aWNlQ29udGV4dEltcGwoKTsKLSAgICAgICAgZW5kcG9pbnRJbmZvLnNldFdlYlNlcnZpY2VDb250ZXh0KHdzQ29udGV4dCk7Ci0gICAgICAgIGVuZHBvaW50SW5mby5pbmplY3RDb250ZXh0KCk7Ci0gICAgICAgIGVuZHBvaW50SW5mby5iZWdpblNlcnZpY2UoKTsKLSAgICAgICAgVGllIHRpZSA9IG5ldyBUaWUoKTsKLSAgICAgICAgY29udGV4dC5zZXRIYW5kbGVyKG5ldyBXU0h0dHBIYW5kbGVyKHRpZSwgZW5kcG9pbnRJbmZvLCBleGVjdXRvcikpOworICAgIHByaXZhdGUgdm9pZCBwdWJsaXNoIChIdHRwQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQuc2V0SGFuZGxlcihuZXcgV1NIdHRwSGFuZGxlcihhZGFwdGVyLCBleGVjdXRvcikpOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBUIGdldEVuZHBvaW50UmVmZXJlbmNlKENsYXNzPFQ+IGNsYXp6LCBFbGVtZW50Li4ucmVmZXJlbmNlUGFyYW1ldGVycykgeworICAgICAgICBXU0VuZHBvaW50SW1wbCBlbmRwb2ludEltcGwgPSAoV1NFbmRwb2ludEltcGwpIGFkYXB0ZXIuZ2V0RW5kcG9pbnQoKTsKKyAgICAgICAgU3RyaW5nIGVwckFkZHJlc3MgPSBnZXRFUFJBZGRyZXNzKCk7CisgICAgICAgIHJldHVybiBjbGF6ei5jYXN0KGVuZHBvaW50SW1wbC5nZXRFbmRwb2ludFJlZmVyZW5jZShjbGF6eiwgZXByQWRkcmVzcyxlcHJBZGRyZXNzKyI/d3NkbCIsIHJlZmVyZW5jZVBhcmFtZXRlcnMpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9TZXJ2ZXJDb25uZWN0aW9uSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1NlcnZlckNvbm5lY3Rpb25JbXBsLmphdmEKaW5kZXggOTYwZDMxMi4uM2U1ZmQwNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1NlcnZlckNvbm5lY3Rpb25JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1NlcnZlckNvbm5lY3Rpb25JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjMxICsyNSwyMDQgQEAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0LkVQVEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0LldTQ29ubmVjdGlvbkltcGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkhlYWRlcnM7CiBpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwRXhjaGFuZ2U7CitpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwc0V4Y2hhbmdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tZXNzYWdlLlBhY2tldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLldTRW5kcG9pbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5XZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLkh0dHBBZGFwdGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5odHRwLldTSFRUUENvbm5lY3Rpb247CiAKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIAogLyoqCi0gKiA8Y29kZT5jb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5XU0Nvbm5lY3Rpb248L2NvZGU+IHVzZWQgd2l0aCBKYXZhIFNFIGVuZHBvaW50cworICoge0BsaW5rIFdTSFRUUENvbm5lY3Rpb259IHVzZWQgd2l0aCBKYXZhIFNFIGVuZHBvaW50cy4gSXQgcHJvdmlkZXMgY29ubmVjdGlvbgorICogaW1wbGVtZW50YXRpb24gdXNpbmcge0BsaW5rIEh0dHBFeGNoYW5nZX0gb2JqZWN0LgogICoKLSAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKICAqLwotcHVibGljIGNsYXNzIFNlcnZlckNvbm5lY3Rpb25JbXBsIGV4dGVuZHMgV1NDb25uZWN0aW9uSW1wbCB7CitmaW5hbCBjbGFzcyBTZXJ2ZXJDb25uZWN0aW9uSW1wbCBleHRlbmRzIFdTSFRUUENvbm5lY3Rpb24gaW1wbGVtZW50cyBXZWJTZXJ2aWNlQ29udGV4dERlbGVnYXRlIHsKIAotICAgIHByaXZhdGUgSHR0cEV4Y2hhbmdlIGh0dHBFeGNoYW5nZTsKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBFeGNoYW5nZSBodHRwRXhjaGFuZ2U7CiAgICAgcHJpdmF0ZSBpbnQgc3RhdHVzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+IHJlcXVlc3RIZWFkZXJzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+IHJlc3BvbnNlSGVhZGVyczsKLSAgICBwcml2YXRlIE5vQ2xvc2VJbnB1dFN0cmVhbSBpczsKLSAgICBwcml2YXRlIE5vQ2xvc2VPdXRwdXRTdHJlYW0gb3V0OwotICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWRJbnB1dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkT3V0cHV0OworICAgIHByaXZhdGUgZmluYWwgSHR0cEFkYXB0ZXIgYWRhcHRlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gb3V0cHV0V3JpdHRlbjsKIAotICAgIHB1YmxpYyBTZXJ2ZXJDb25uZWN0aW9uSW1wbChIdHRwRXhjaGFuZ2UgaHR0cFRyYW5zYWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuaHR0cEV4Y2hhbmdlID0gaHR0cFRyYW5zYWN0aW9uOworCisgICAgcHVibGljIFNlcnZlckNvbm5lY3Rpb25JbXBsKEBOb3ROdWxsIEh0dHBBZGFwdGVyIGFkYXB0ZXIsIEBOb3ROdWxsIEh0dHBFeGNoYW5nZSBodHRwRXhjaGFuZ2UpIHsKKyAgICAgICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgdGhpcy5odHRwRXhjaGFuZ2UgPSBodHRwRXhjaGFuZ2U7CiAgICAgfQogCi0gICAgcHVibGljIE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiBnZXRIZWFkZXJzKCkgeworICAgIEBPdmVycmlkZQorICAgIEBQcm9wZXJ0eSh2YWx1ZSA9IHtNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUywgUGFja2V0LklOQk9VTkRfVFJBTlNQT1JUX0hFQURFUlN9KQorICAgIHB1YmxpYyBATm90TnVsbCBNYXA8U3RyaW5nLExpc3Q8U3RyaW5nPj4gZ2V0UmVxdWVzdEhlYWRlcnMoKSB7CiAgICAgICAgIHJldHVybiBodHRwRXhjaGFuZ2UuZ2V0UmVxdWVzdEhlYWRlcnMoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBzZXRzIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVycyhNYXA8U3RyaW5nLExpc3Q8U3RyaW5nPj4gaGVhZGVycykgewotICAgICAgICByZXNwb25zZUhlYWRlcnMgPSBoZWFkZXJzOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdEhlYWRlcihTdHJpbmcgaGVhZGVyTmFtZSkgeworICAgICAgICByZXR1cm4gaHR0cEV4Y2hhbmdlLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0Rmlyc3QoaGVhZGVyTmFtZSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VIZWFkZXJzKE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7CisgICAgICAgIEhlYWRlcnMgciA9IGh0dHBFeGNoYW5nZS5nZXRSZXNwb25zZUhlYWRlcnMoKTsKKyAgICAgICAgci5jbGVhcigpOworICAgICAgICBmb3IoTWFwLkVudHJ5IDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtTGVuZ3RoIikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LVR5cGUiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgLy8gaWdub3JlIGhlYWRlcnMgdGhhdCBpbnRlcmZlcmUgd2l0aCBvdXIgY29ycmVjdCBvcGVyYXRpb25zCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHIucHV0KG5hbWUsbmV3IEFycmF5TGlzdDxTdHJpbmc+KHZhbHVlcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIEBQcm9wZXJ0eSh7TWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTLFBhY2tldC5PVVRCT1VORF9UUkFOU1BPUlRfSEVBREVSU30pCisgICAgcHVibGljIE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiBnZXRSZXNwb25zZUhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBodHRwRXhjaGFuZ2UuZ2V0UmVzcG9uc2VIZWFkZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGVSZXNwb25zZUhlYWRlcihATm90TnVsbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaHR0cEV4Y2hhbmdlLmdldFJlc3BvbnNlSGVhZGVycygpLnNldCgiQ29udGVudC1UeXBlIix2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMpIHsKICAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogc2V0cyBIVFRQIHN0YXR1cyBjb2RlCi0gICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSkKICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0lOVEVSTkFMX0VSUk9SOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0KCkgewotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgaXMgPSBuZXcgTm9DbG9zZUlucHV0U3RyZWFtKGh0dHBFeGNoYW5nZS5nZXRSZXF1ZXN0Qm9keSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXM7Ci0gICAgfQotCi0gICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXQoKSB7Ci0gICAgICAgIGlmIChvdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbG9zZUlucHV0KCk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlSGVhZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihNYXAuRW50cnkgPFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IHJlc3BvbnNlSGVhZGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIkNvbnRlbnQtTGVuZ3RoIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGFkZCB0aGlzIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IEludGVnZXIudmFsdWVPZih2YWx1ZXMuZ2V0KDApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwRXhjaGFuZ2UuZ2V0UmVzcG9uc2VIZWFkZXJzKCkuYWRkKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICBwdWJsaWMgQE5vdE51bGwgSW5wdXRTdHJlYW0gZ2V0SW5wdXQoKSB7CisgICAgICAgIC8vIExpZ2h0IHdlaWdodCBodHRwIHNlcnZlcidzIElucHV0U3RyZWFtLmNsb3NlKCkgdGhyb3dzIGV4Y2VwdGlvbiBpZgorICAgICAgICAvLyBhbGwgdGhlIGJ5dGVzIGFyZSBub3QgcmVhZC4gV29yayBhcm91bmQgdW50aWwgaXQgaXMgZml4ZWQuCisgICAgICAgIHJldHVybiBuZXcgRmlsdGVySW5wdXRTdHJlYW0oaHR0cEV4Y2hhbmdlLmdldFJlcXVlc3RCb2R5KCkpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkKCkgIT0gLTEpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvL0lnbm9yZQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHdyaXRlIEhUVFAgc3RhdHVzIGNvZGUsIGFuZCBoZWFkZXJzCi0gICAgICAgICAgICAgICAgaHR0cEV4Y2hhbmdlLnNlbmRSZXNwb25zZUhlYWRlcnMoZ2V0U3RhdHVzKCksIGxlbik7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IE5vQ2xvc2VPdXRwdXRTdHJlYW0oaHR0cEV4Y2hhbmdlLmdldFJlc3BvbnNlQm9keSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZU91dHB1dCgpIHsKLSAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dC5nZXRPdXRwdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGNsb3NlZE91dHB1dCA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG91dCA9IG51bGw7Ci0gICAgfQorICAgIHB1YmxpYyBATm90TnVsbCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0ICFvdXRwdXRXcml0dGVuOworICAgICAgICBvdXRwdXRXcml0dGVuID0gdHJ1ZTsKIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlSW5wdXQoKSB7Ci0gICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFJlYWQgZXZlcnl0aGluZyBmcm9tIHJlcXVlc3QgYW5kIGNsb3NlIGl0Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgICAgIHdoaWxlIChpcy5yZWFkKGJ1ZikgIT0gLTEpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxlbkhlYWRlciA9IGh0dHBFeGNoYW5nZS5nZXRSZXNwb25zZUhlYWRlcnMoKS5nZXQoIkNvbnRlbnQtTGVuZ3RoIik7CisgICAgICAgIGludCBsZW5ndGggPSAobGVuSGVhZGVyICE9IG51bGwpID8gSW50ZWdlci5wYXJzZUludChsZW5IZWFkZXIuZ2V0KDApKSA6IDA7CisgICAgICAgIGh0dHBFeGNoYW5nZS5zZW5kUmVzcG9uc2VIZWFkZXJzKGdldFN0YXR1cygpLCBsZW5ndGgpOworCisgICAgICAgIC8vIExpZ2h0IHdlaWdodCBodHRwIHNlcnZlcidzIE91dHB1dFN0cmVhbS5jbG9zZSgpIHRocm93cyBleGNlcHRpb24gaWYKKyAgICAgICAgLy8gYWxsIHRoZSBieXRlcyBhcmUgbm90IHJlYWQgb24gdGhlIGNsaWVudCBzaWRlKFN0cmVhbU1lc3NhZ2Ugb24gdGhlIGNsaWVudAorICAgICAgICAvLyBzaWRlIGRvZXNuJ3QgcmVhZCBhbGwgYnl0ZXMuCisgICAgICAgIHJldHVybiBuZXcgRmlsdGVyT3V0cHV0U3RyZWFtKGh0dHBFeGNoYW5nZS5nZXRSZXNwb25zZUJvZHkoKSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmluZyBwdXJwb3NlZnVsbHkuCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlzLmdldElucHV0U3RyZWFtKCkuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBjbG9zZWRJbnB1dCA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlzID0gbnVsbDsKKyAgICAgICAgfTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaHR0cEV4Y2hhbmdlLmNsb3NlKCk7CisgICAgcHVibGljIEBOb3ROdWxsIFdlYlNlcnZpY2VDb250ZXh0RGVsZWdhdGUgZ2V0V2ViU2VydmljZUNvbnRleHREZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9DbG9zZUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIGlzOwotCi0gICAgICAgIHB1YmxpYyBOb0Nsb3NlSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgICAgIHRoaXMuaXMgPSBpczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIGlzLnJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkuIHVzZSBjbG9zZUlucHV0KCkgdG8gY2xvc2UKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBpczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gaXMucmVhZChiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gaXMucmVhZChiLCBvZmYsIGxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gaXMuc2tpcChuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gaXMuYXZhaWxhYmxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0gICAgICAgICAgICBpcy5tYXJrKHJlYWRsaW1pdCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpcy5yZXNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXMubWFya1N1cHBvcnRlZCgpOwotICAgICAgICB9CisgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKFBhY2tldCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBodHRwRXhjaGFuZ2UuZ2V0UHJpbmNpcGFsKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9DbG9zZU91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0gICAgICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKLQotICAgICAgICBwdWJsaWMgTm9DbG9zZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7Ci0gICAgICAgICAgICB0aGlzLm91dCA9IG91dDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoY2gpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbGVmdCBlbXB0eS4gdXNlIGNsb3NlT3V0cHV0KCkgdG8gY2xvc2UKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIG91dC53cml0ZShiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIG91dC53cml0ZShiLCBvZmYsIGxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoUGFja2V0IHJlcXVlc3QsIFN0cmluZyByb2xlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBwdWJsaWMgQE5vdE51bGwgU3RyaW5nIGdldEVQUkFkZHJlc3MoUGFja2V0IHJlcXVlc3QsIFdTRW5kcG9pbnQgZW5kcG9pbnQpIHsKKyAgICAgICAgcmV0dXJuIFdTSHR0cEhhbmRsZXIuZ2V0UmVxdWVzdEFkZHJlc3MoaHR0cEV4Y2hhbmdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExBZGRyZXNzKEBOb3ROdWxsIFBhY2tldCByZXF1ZXN0LCBATm90TnVsbCBXU0VuZHBvaW50IGVuZHBvaW50KSB7CisgICAgICAgIFN0cmluZyBlcHJBZGRyZXNzID0gZ2V0RVBSQWRkcmVzcyhyZXF1ZXN0LGVuZHBvaW50KTsKKyAgICAgICAgaWYoYWRhcHRlci5nZXRFbmRwb2ludCgpLmdldFBvcnQoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGVwckFkZHJlc3MrIj93c2RsIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgIHJldHVybiAoaHR0cEV4Y2hhbmdlIGluc3RhbmNlb2YgSHR0cHNFeGNoYW5nZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9NRVRIT0QpCisgICAgcHVibGljIEBOb3ROdWxsIFN0cmluZyBnZXRSZXF1ZXN0TWV0aG9kKCkgeworICAgICAgICByZXR1cm4gaHR0cEV4Y2hhbmdlLmdldFJlcXVlc3RNZXRob2QoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAUHJvcGVydHkoTWVzc2FnZUNvbnRleHQuUVVFUllfU1RSSU5HKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgICAgIFVSSSByZXF1ZXN0VXJpID0gaHR0cEV4Y2hhbmdlLmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gcmVxdWVzdFVyaS5nZXRRdWVyeSgpOworICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBxdWVyeTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlBBVEhfSU5GTykKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworICAgICAgICBVUkkgcmVxdWVzdFVyaSA9IGh0dHBFeGNoYW5nZS5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgIFN0cmluZyByZXFQYXRoID0gcmVxdWVzdFVyaS5nZXRQYXRoKCk7CisgICAgICAgIFN0cmluZyBjdHh0UGF0aCA9IGh0dHBFeGNoYW5nZS5nZXRIdHRwQ29udGV4dCgpLmdldFBhdGgoKTsKKyAgICAgICAgaWYgKHJlcVBhdGgubGVuZ3RoKCkgPiBjdHh0UGF0aC5sZW5ndGgoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlcVBhdGguc3Vic3RyaW5nKGN0eHRQYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgICAgICByZXR1cm4gaHR0cEV4Y2hhbmdlLmdldFByb3RvY29sKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aFJlc3BvbnNlSGVhZGVyKGludCB2YWx1ZSkgeworICAgICAgICBodHRwRXhjaGFuZ2UuZ2V0UmVzcG9uc2VIZWFkZXJzKCkuc2V0KCJDb250ZW50LUxlbmd0aCIsICIiK3ZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlNYXAgZ2V0UHJvcGVydHlNYXAoKSB7CisgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eU1hcCBtb2RlbDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIG1vZGVsID0gcGFyc2UoU2VydmVyQ29ubmVjdGlvbkltcGwuY2xhc3MpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9TZXJ2ZXJNZ3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9TZXJ2ZXJNZ3IuamF2YQppbmRleCA1Yzg3MWJhLi5jM2M3NWEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvU2VydmVyTWdyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1NlcnZlck1nci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDM0ICsyNiwzNSBAQAogCiBpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwQ29udGV4dDsKIGltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBzU2VydmVyOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5TZXJ2ZXJSdEV4Y2VwdGlvbjsKKwogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CiAKIC8qKgogICogTWFuYWdlcyBhbGwgdGhlIFdlYlNlcnZpY2UgSFRUUCBzZXJ2ZXJzIGNyZWF0ZWQgYnkgSkFYV1MgcnVudGltZS4KICAqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CiAgKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJNZ3IgeworZmluYWwgY2xhc3MgU2VydmVyTWdyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlcnZlck1nciBzZXJ2ZXJNZ3IgPSBuZXcgU2VydmVyTWdyKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CiAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoCiAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkNvbnN0YW50cy5Mb2dnaW5nRG9tYWluICsgIi5zZXJ2ZXIuaHR0cCIpOwotICAgIHByaXZhdGUgTWFwPEluZXRTb2NrZXRBZGRyZXNzLCBTZXJ2ZXJTdGF0ZT4gc2VydmVycyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8SW5ldFNvY2tldEFkZHJlc3MsU2VydmVyU3RhdGU+IHNlcnZlcnMgPSBuZXcgSGFzaE1hcDxJbmV0U29ja2V0QWRkcmVzcyxTZXJ2ZXJTdGF0ZT4oKTsKIAotICAgIHByb3RlY3RlZCBTZXJ2ZXJNZ3IoKSB7Ci0gICAgfQorICAgIHByaXZhdGUgU2VydmVyTWdyKCkge30KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNlcnZlck1nciBnZXRJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIHNlcnZlck1ncjsKICAgICB9CkBAIC02NSwyNCArNjYsMjQgQEAKICAgICAgKi8KICAgICBwdWJsaWMgSHR0cENvbnRleHQgY3JlYXRlQ29udGV4dChTdHJpbmcgYWRkcmVzcykgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgSHR0cFNlcnZlciBzZXJ2ZXIgPSBudWxsOwotICAgICAgICAgICAgU2VydmVyU3RhdGUgc3RhdGUgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBIdHRwU2VydmVyIHNlcnZlcjsKKyAgICAgICAgICAgIFNlcnZlclN0YXRlIHN0YXRlOwogICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoYWRkcmVzcyk7CiAgICAgICAgICAgICBpbnQgcG9ydCA9IHVybC5nZXRQb3J0KCk7CiAgICAgICAgICAgICBpZiAocG9ydCA9PSAtMSkgewogICAgICAgICAgICAgICAgIHBvcnQgPSB1cmwuZ2V0RGVmYXVsdFBvcnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKHVybC5nZXRIb3N0KCksCi0gICAgICAgICAgICAgICAgICAgIHVybC5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgIHBvcnQpOwogICAgICAgICAgICAgc3luY2hyb25pemVkKHNlcnZlcnMpIHsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNlcnZlcnMuZ2V0KGluZXRBZGRyZXNzKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZSgiQ3JlYXRpbmcgbmV3IEhUVFAgU2VydmVyIGF0ICIraW5ldEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBIdHRwU2VydmVyLmNyZWF0ZShpbmV0QWRkcmVzcywgNSk7CiAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zZXRFeGVjdXRvcihFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDUpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmUoIkNyZWF0aW5nIEhUVFAgQ29udGV4dCBhdCA9ICIrdXJsLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEh0dHBDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXIuY3JlYXRlQ29udGV4dCh1cmwuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB1cmwudG9VUkkoKS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKCJDcmVhdGluZyBIVFRQIENvbnRleHQgYXQgPSAiK3BhdGgpOworICAgICAgICAgICAgICAgICAgICBIdHRwQ29udGV4dCBjb250ZXh0ID0gc2VydmVyLmNyZWF0ZUNvbnRleHQocGF0aCk7CiAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZSgiSFRUUCBzZXJ2ZXIgc3RhcnRlZCA9ICIraW5ldEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ldyBTZXJ2ZXJTdGF0ZShzZXJ2ZXIpOwpAQCAtMTIwLDggKzEyMSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2ZXJTdGF0ZSB7Ci0gICAgICAgIHByaXZhdGUgSHR0cFNlcnZlciBzZXJ2ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2VydmVyU3RhdGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyOwogICAgICAgICBwcml2YXRlIGludCBpbnN0YW5jZXM7CiAKICAgICAgICAgU2VydmVyU3RhdGUoSHR0cFNlcnZlciBzZXJ2ZXIpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9XU0h0dHBIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvV1NIdHRwSGFuZGxlci5qYXZhCmluZGV4IGU2NmJiNWUuLmM0ZWIyZjggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9odHRwL3NlcnZlci9XU0h0dHBIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1dTSHR0cEhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw2NiArMjUsNDQgQEAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7CiAKLWltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBIYW5kbGVyOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTnVsbGFibGU7CiBpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwRXhjaGFuZ2U7CitpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwSGFuZGxlcjsKIGltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBzRXhjaGFuZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dEltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dFV0aWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLkRvY0luZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLldTRExQYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5SdW50aW1lRW5kcG9pbnRJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5UaWU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5IZWFkZXJzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXphYmxlTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5IdHRwc2VydmVyTWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuSHR0cEFkYXB0ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuV1NIVFRQQ29ubmVjdGlvbjsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwogCiAvKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIEh0dHBDb250ZXh0J3MgSHR0cEhhbmRsZXIuIEh0dHBTZXJ2ZXIgY2FsbHMgdGhpcyB3aGVuIHRoZXJlCi0gKiBpcyByZXF1ZXN0IHRoYXQgbWF0Y2hlcyB0aGUgY29udGV4dCBwYXRoLiBUaGVuIHRoZSBoYW5kbGVyIHByb2Nlc3NlcwotICogSHR0cEV4Y2hhbmdlIGFuZCBzZW5kcyBhcHByb3ByaWF0ZSByZXNwb25zZQorICoge0BsaW5rIEh0dHBIYW5kbGVyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNlcnZlcyB0aGUgYWN0dWFsIHJlcXVlc3QuCiAgKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCisgKiBAYXV0aG9yIEppdGVuZHJhIEtvdGFtcmFqdQorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWhpCiAgKi8KLXB1YmxpYyBjbGFzcyBXU0h0dHBIYW5kbGVyIGltcGxlbWVudHMgSHR0cEhhbmRsZXIgeworZmluYWwgY2xhc3MgV1NIdHRwSGFuZGxlciBpbXBsZW1lbnRzIEh0dHBIYW5kbGVyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfTUVUSE9EID0gIkdFVCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RfTUVUSE9EID0gIlBPU1QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFEX01FVEhPRCA9ICJIRUFEIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVUX01FVEhPRCA9ICJQVVQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfTUVUSE9EID0gIkRFTEVURSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfQ09OVEVOVF9UWVBFID0gInRleHQvaHRtbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT05URU5UX1RZUEUgPSAidGV4dC94bWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfSEVBREVSID0gIkNvbnRlbnQtVHlwZSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigKICAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQ29uc3RhbnRzLkxvZ2dpbmdEb21haW4gKyAiLnNlcnZlci5odHRwIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemVyIGxvY2FsaXplciA9IG5ldyBMb2NhbGl6ZXIoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0KLSAgICAgICAgbmV3IExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkoImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5odHRwc2VydmVyIik7CiAKLSAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvOwotICAgIHByaXZhdGUgZmluYWwgVGllIHRpZTsKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBBZGFwdGVyIGFkYXB0ZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBleGVjdXRvcjsKIAotICAgIHB1YmxpYyBXU0h0dHBIYW5kbGVyKFRpZSB0aWUsIFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvLCBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICB0aGlzLnRpZSA9IHRpZTsKLSAgICAgICAgdGhpcy5lbmRwb2ludEluZm8gPSBlbmRwb2ludEluZm87CisgICAgcHVibGljIFdTSHR0cEhhbmRsZXIoQE5vdE51bGwgSHR0cEFkYXB0ZXIgYWRhcHRlciwgQE51bGxhYmxlIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgIGFzc2VydCBhZGFwdGVyIT1udWxsOworICAgICAgICB0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwogICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7CiAgICAgfQogCkBAIC05Miw0NSArNzAsNDIgQEAKICAgICAgKiBDYWxsZWQgYnkgSHR0cFNlcnZlciB3aGVuIHRoZXJlIGlzIGEgbWF0Y2hpbmcgcmVxdWVzdCBmb3IgdGhlIGNvbnRleHQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBoYW5kbGUoSHR0cEV4Y2hhbmdlIG1zZykgewotICAgICAgICBsb2dnZXIuZmluZSgiUmVjZWl2ZWQgSFRUUCByZXF1ZXN0OiIrbXNnLmdldFJlcXVlc3RVUkkoKSk7Ci0gICAgICAgIGlmIChleGVjdXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBVc2UgZW5kcG9pbnQncyBFeGVjdXRvciB0byBoYW5kbGUgcmVxdWVzdAotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgSHR0cEhhbmRsZXJSdW5uYWJsZShtc2cpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZUV4Y2hhbmdlKG1zZyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2dnZXIuZmluZSgiUmVjZWl2ZWQgSFRUUCByZXF1ZXN0OiIrbXNnLmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICBpZiAoZXhlY3V0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFVzZSBhcHBsaWNhdGlvbidzIEV4ZWN1dG9yIHRvIGhhbmRsZSByZXF1ZXN0LiBBcHBsaWNhdGlvbiBtYXkKKyAgICAgICAgICAgICAgICAvLyBoYXZlIHNldCBhbiBleGVjdXRvciB1c2luZyBFbmRwb2ludC5zZXRFeGVjdXRvcigpLgorICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUobmV3IEh0dHBIYW5kbGVyUnVubmFibGUobXNnKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2hhbmdlKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIC8vIERvbnQndCBwcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbiBvdGhlcndpc2UgaXQga2lsbHMgdGhlIGh0dHBzZXJ2ZXIKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBIVFRQIHJlcXVlc3QgZm9yIEdFVCwgUE9TVAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2hhbmdlKEh0dHBFeGNoYW5nZSBtc2cpIHsKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVFeGNoYW5nZShIdHRwRXhjaGFuZ2UgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBXU0hUVFBDb25uZWN0aW9uIGNvbiA9IG5ldyBTZXJ2ZXJDb25uZWN0aW9uSW1wbChhZGFwdGVyLG1zZyk7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2dnZXIuZmluZSgiUmVjZWl2ZWQgSFRUUCByZXF1ZXN0OiIrbXNnLmdldFJlcXVlc3RVUkkoKSk7CiAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kID0gbXNnLmdldFJlcXVlc3RNZXRob2QoKTsKICAgICAgICAgICAgIGlmIChtZXRob2QuZXF1YWxzKEdFVF9NRVRIT0QpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbXNnLmdldFJlcXVlc3RVUkkoKS5nZXRRdWVyeSgpOwogICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKCJRdWVyeSBTdHJpbmcgZm9yIHJlcXVlc3QgPSIrcXVlcnlTdHJpbmcpOwotICAgICAgICAgICAgICAgIGlmIChxdWVyeVN0cmluZyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIChxdWVyeVN0cmluZy5lcXVhbHMoIldTREwiKSB8fCBxdWVyeVN0cmluZy5lcXVhbHMoIndzZGwiKQotICAgICAgICAgICAgICAgICAgICB8fCBxdWVyeVN0cmluZy5zdGFydHNXaXRoKCJ3c2RsPSIpIHx8IHF1ZXJ5U3RyaW5nLnN0YXJ0c1dpdGgoInhzZD0iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBXU0RMLCBTY2hlbWEgZG9jdW1lbnRzCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEb2NSZXF1ZXN0KG1zZyk7CisgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIuaXNNZXRhZGF0YVF1ZXJ5KHF1ZXJ5U3RyaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLnB1Ymxpc2hXU0RMKGNvbixnZXRSZXF1ZXN0QWRkcmVzcyhtc2cpLCBtc2cuZ2V0UmVxdWVzdFVSSSgpLmdldFF1ZXJ5KCkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5oYW5kbGUoY29uKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoUE9TVF9NRVRIT0QpIHx8IG1ldGhvZC5lcXVhbHMoSEVBRF9NRVRIT0QpCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtZXRob2QuZXF1YWxzKFBVVF9NRVRIT0QpIHx8IG1ldGhvZC5lcXVhbHMoREVMRVRFX01FVEhPRCkpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzKG1zZyk7CisgICAgICAgICAgICAgICAgYWRhcHRlci5oYW5kbGUoY29uKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsaXplci5sb2NhbGl6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQuaHR0cC5tZXRob2QiLCBtZXRob2QpKSk7Ci0gICAgICAgICAgICAgICAgbXNnLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoSHR0cHNlcnZlck1lc3NhZ2VzLlVORVhQRUNURURfSFRUUF9NRVRIT0QobWV0aG9kKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtc2cuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ2LDE0MiArMTIxLDM5IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBoYW5kbGVFeGNoYW5nZShtc2cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBQT1NUIHJlcXVlc3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoSHR0cEV4Y2hhbmdlIG1zZykgewotICAgICAgICBXU0Nvbm5lY3Rpb24gY29uID0gbmV3IFNlcnZlckNvbm5lY3Rpb25JbXBsKG1zZyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0SW1wbCgpOwotICAgICAgICAgICAgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0ID0gZW5kcG9pbnRJbmZvLmdldFdlYlNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICB3c0NvbnRleHQuc2V0TWVzc2FnZUNvbnRleHQobXNnQ3R4dCk7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dFV0aWwuc2V0SHR0cFJlcXVlc3RNZXRob2QobXNnQ3R4dCwgbXNnLmdldFJlcXVlc3RNZXRob2QoKSk7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dFV0aWwuc2V0SHR0cFJlcXVlc3RIZWFkZXJzKG1zZ0N0eHQsIGNvbi5nZXRIZWFkZXJzKCkpOwotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlsLnNldEh0dHBFeGNoYW5nZShtc2dDdHh0LCBtc2cpOwotICAgICAgICAgICAgVVJJIHJlcXVlc3RVcmkgPSBtc2cuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gcmVxdWVzdFVyaS5nZXRRdWVyeSgpOwotICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dFV0aWwuc2V0UXVlcnlTdHJpbmcobXNnQ3R4dCwgcXVlcnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHJlcVBhdGggPSByZXF1ZXN0VXJpLmdldFBhdGgoKTsKLSAgICAgICAgICAgIFN0cmluZyBjdHh0UGF0aCA9IG1zZy5nZXRIdHRwQ29udGV4dCgpLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGlmIChyZXFQYXRoLmxlbmd0aCgpID4gY3R4dFBhdGgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXh0cmFQYXRoID0gcmVxUGF0aC5zdWJzdHJpbmcoY3R4dFBhdGgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0VXRpbC5zZXRQYXRoSW5mbyhtc2dDdHh0LCBleHRyYVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGllLmhhbmRsZShjb24sIGVuZHBvaW50SW5mbyk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjb24uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgR0VUIHJlcXVlc3RzIGZvciBXU0RMIGFuZCBTY2hlbWEgZG9jdWVtbnRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0RvY1JlcXVlc3QoSHR0cEV4Y2hhbmdlIG1zZykgewotICAgICAgICBXU0Nvbm5lY3Rpb24gY29uID0gbmV3IFNlcnZlckNvbm5lY3Rpb25JbXBsKG1zZyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb24uZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IG1zZy5nZXRSZXF1ZXN0VVJJKCkuZ2V0UXVlcnkoKTsKLSAgICAgICAgICAgIFN0cmluZyBpblBhdGggPSBlbmRwb2ludEluZm8uZ2V0UGF0aChxdWVyeVN0cmluZyk7Ci0gICAgICAgICAgICBpZiAoaW5QYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsaXplci5sb2NhbGl6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImh0bWwubm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFJlcXVlc3QgPSIrbXNnLmdldFJlcXVlc3RVUkkoKSkpOwotICAgICAgICAgICAgICAgIHdyaXRlRXJyb3JQYWdlKGNvbiwgSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9OT1RfRk9VTkQsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERvY0luZm8gZG9jSW5mbyA9IGVuZHBvaW50SW5mby5nZXREb2NNZXRhZGF0YSgpLmdldChpblBhdGgpOwotICAgICAgICAgICAgaWYgKGRvY0luZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgbG9jYWxpemVyLmxvY2FsaXplKAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgiaHRtbC5ub3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUmVxdWVzdCA9Iittc2cuZ2V0UmVxdWVzdFVSSSgpKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVFcnJvclBhZ2UoY29uLCBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX05PVF9GT1VORCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBkb2NTdHJlYW0gPSBudWxsOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlcUhlYWRlcnMgPSBjb24uZ2V0SGVhZGVycygpOwotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBob3N0SGVhZGVyID0gcmVxSGVhZGVycy5nZXQoIkhvc3QiKTsKLQotICAgICAgICAgICAgICAgIEhlYWRlcnMgcmVzcEhlYWRlcnMgPSBuZXcgSGVhZGVycygpOwotICAgICAgICAgICAgICAgIHJlc3BIZWFkZXJzLmFkZChDT05URU5UX1RZUEVfSEVBREVSLCBYTUxfQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICBjb24uc2V0SGVhZGVycyhyZXNwSGVhZGVycyk7Ci0gICAgICAgICAgICAgICAgY29uLnNldFN0YXR1cyhIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX09LKTsKLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBjb24uZ2V0T3V0cHV0KCk7Ci0KLSAgICAgICAgICAgICAgICBMaXN0PFJ1bnRpbWVFbmRwb2ludEluZm8+IGVuZHBvaW50cyA9IG5ldyBBcnJheUxpc3Q8UnVudGltZUVuZHBvaW50SW5mbz4oKTsKLSAgICAgICAgICAgICAgICBlbmRwb2ludHMuYWRkKGVuZHBvaW50SW5mbyk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoKG1zZyBpbnN0YW5jZW9mIEh0dHBzRXhjaGFuZ2UpID8gImh0dHBzIiA6ICJodHRwIik7Ci0gICAgICAgICAgICAgICAgc3RyQnVmLmFwcGVuZCgiOi8vIik7Ci0gICAgICAgICAgICAgICAgaWYgKGhvc3RIZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKGhvc3RIZWFkZXIuZ2V0KDApKTsgICAvLyBVc2VzIEhvc3QgaGVhZGVyCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChtc2cuZ2V0TG9jYWxBZGRyZXNzKCkuZ2V0SG9zdE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChtc2cuZ2V0TG9jYWxBZGRyZXNzKCkuZ2V0UG9ydCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChtc2cuZ2V0UmVxdWVzdFVSSSgpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBzdHJCdWYudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZSgiQWRkcmVzcyA9IithZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBXU0RMUGF0Y2hlciBwYXRjaGVyID0gbmV3IFdTRExQYXRjaGVyKGRvY0luZm8sIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEluZm8sIGVuZHBvaW50cyk7Ci0gICAgICAgICAgICAgICAgZG9jU3RyZWFtID0gZG9jSW5mby5nZXREb2MoKTsKLSAgICAgICAgICAgICAgICBwYXRjaGVyLnBhdGNoRG9jKGRvY1N0cmVhbSwgb3MpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBjbG9zZUlucHV0U3RyZWFtKGRvY1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY29uLmNsb3NlT3V0cHV0KCk7CisgICAgICAgICAgICAgICAgaGFuZGxlRXhjaGFuZ2UobXNnKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgLy8gRG9lcyBhcHBsaWNhdGlvbidzIGV4ZWN1dG9yIGhhbmRsZSB0aGlzIGV4Y2VwdGlvbiA/CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvbi5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCisKICAgICAvKioKLSAgICAgKiB3cml0ZXMgZXJyb3IgaHRtbCBwYWdlCisgICAgICogQ29tcHV0ZXMgdGhlIEVuZHBvaW50J3MgYWRkcmVzcyBmcm9tIHRoZSByZXF1ZXN0LiBVc2UgIkhvc3QiIGhlYWRlcgorICAgICAqIHNvIHRoYXQgaXQgaGFzIGNvcnJlY3QgYWRkcmVzcyhJUCBhZGRyZXNzIG9yIHNvbWVvdGhlciBob3N0bmFtZSkgdGhyb3VnaAorICAgICAqIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiByZWFjaGVkIHRoZSBlbmRwb2ludC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGEgc3RyaW5nIGxpa2UgImh0dHA6Ly9mb28uYmFyOjEyMzQvYWJjL2RlZiIKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVFcnJvclBhZ2UoV1NDb25uZWN0aW9uIGNvbiwgaW50IHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gY3RIZWFkZXIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGN0SGVhZGVyLmFkZChIVE1MX0NPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICBoZWFkZXJzLnB1dChDT05URU5UX1RZUEVfSEVBREVSLCBjdEhlYWRlcik7Ci0gICAgICAgICAgICBjb24uc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICAgICAgICAgIGNvbi5zZXRTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjb24uZ2V0T3V0cHV0KCk7Ci0gICAgICAgICAgICBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCI8aHRtbD48aGVhZD48dGl0bGU+Iik7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICBsb2NhbGl6ZXIubG9jYWxpemUoCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VGYWN0b3J5LmdldE1lc3NhZ2UoImh0bWwudGl0bGUiKSkpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdGl0bGU+PC9oZWFkPjxib2R5PiIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PjwvaHRtbD4iKTsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY29uLmNsb3NlT3V0cHV0KCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgc3RhdGljIEBOb3ROdWxsIFN0cmluZyBnZXRSZXF1ZXN0QWRkcmVzcyhIdHRwRXhjaGFuZ2UgbXNnKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc3RyQnVmLmFwcGVuZCgobXNnIGluc3RhbmNlb2YgSHR0cHNFeGNoYW5nZSkgPyAiaHR0cHMiIDogImh0dHAiKTsKKyAgICAgICAgc3RyQnVmLmFwcGVuZCgiOi8vIik7CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQorICAgICAgICBMaXN0PFN0cmluZz4gaG9zdEhlYWRlciA9IG1zZy5nZXRSZXF1ZXN0SGVhZGVycygpLmdldCgiSG9zdCIpOworICAgICAgICBpZiAoaG9zdEhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKGhvc3RIZWFkZXIuZ2V0KDApKTsgICAvLyBVc2VzIEhvc3QgaGVhZGVyCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKG1zZy5nZXRMb2NhbEFkZHJlc3MoKS5nZXRIb3N0TmFtZSgpKTsKKyAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQobXNnLmdldExvY2FsQWRkcmVzcygpLmdldFBvcnQoKSk7CiAgICAgICAgIH0KLSAgICB9CisgICAgICAgIHN0ckJ1Zi5hcHBlbmQobXNnLmdldFJlcXVlc3RVUkkoKS5nZXRQYXRoKCkpOwogCisgICAgICAgIHJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvV2ViU2VydmljZUNvbnRleHRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvV2ViU2VydmljZUNvbnRleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTJlNjUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1dlYlNlcnZpY2VDb250ZXh0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotaW1wb3J0IGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cEV4Y2hhbmdlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHRVdGlsOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ29udGV4dEltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlQ29udGV4dCAgewotCi0gICAgcHVibGljIFRocmVhZExvY2FsIG1zZ0NvbnRleHQgPSBuZXcgVGhyZWFkTG9jYWwoKTsKLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3R4dCA9IChNZXNzYWdlQ29udGV4dCltc2dDb250ZXh0LmdldCgpOwotICAgICAgICBpZiAoY3R4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN0eHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgY3R4dCkgewotICAgICAgICBtc2dDb250ZXh0LnNldChjdHh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGN0eHQgPSAoTWVzc2FnZUNvbnRleHQpbXNnQ29udGV4dC5nZXQoKTsKLSAgICAgICAgaWYgKGN0eHQgIT0gbnVsbCkgewotICAgICAgICAgICAgSHR0cEV4Y2hhbmdlIHJlcSA9IE1lc3NhZ2VDb250ZXh0VXRpbC5nZXRIdHRwRXhjaGFuZ2UoY3R4dCk7Ci0gICAgICAgICAgICByZXR1cm4gKHJlcSAhPSBudWxsKSA/IHJlcS5nZXRQcmluY2lwYWwoKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbE1lc3NhZ2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NzlhYy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvbG9jYWwvTG9jYWxNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5sb2NhbDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIExvY2FsTWVzc2FnZSB7Ci0gICAgQnl0ZUFycmF5QnVmZmVyIGJhb3M7Ci0gICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzOwotCi0gICAgcHVibGljIExvY2FsTWVzc2FnZSAoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEJ5dGVBcnJheUJ1ZmZlciBnZXRPdXRwdXQoKSB7Ci0gICAgICAgIHJldHVybiBiYW9zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChCeXRlQXJyYXlCdWZmZXIgYmFvcykgewotICAgICAgICB0aGlzLmJhb3MgPSBiYW9zOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBoZWFkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcnMoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7Ci0gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvbG9jYWwvY2xpZW50L0xvY2FsQ2xpZW50VHJhbnNwb3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvbG9jYWwvY2xpZW50L0xvY2FsQ2xpZW50VHJhbnNwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MTc4ZjAuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2xvY2FsL2NsaWVudC9Mb2NhbENsaWVudFRyYW5zcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0LmxvY2FsLmNsaWVudDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5DbGllbnRUcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dEltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVFbmRwb2ludEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlRpZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5XU0Nvbm5lY3Rpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0LldTQ29ubmVjdGlvbkltcGw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CeXRlQXJyYXlCdWZmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5sb2NhbC5zZXJ2ZXIuTG9jYWxDb25uZWN0aW9uSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy50cmFuc3BvcnQubG9jYWwuTG9jYWxNZXNzYWdlOwotCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5KQVhXU1Byb3BlcnRpZXMuQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbENsaWVudFRyYW5zcG9ydCBleHRlbmRzIFdTQ29ubmVjdGlvbkltcGwgewotCi0gICAgcHJpdmF0ZSBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbzsKLSAgICBwcml2YXRlIFRpZSB0aWUgPSBuZXcgVGllKCk7Ci0gICAgTG9jYWxNZXNzYWdlIGxtID0gbmV3IExvY2FsTWVzc2FnZSgpOwotCi0gICAgLy90aGlzIGNsYXNzIGlzIHVzZWQgcHJpbWFyaWx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKLSAgICBwdWJsaWMgTG9jYWxDbGllbnRUcmFuc3BvcnQoUnVudGltZUVuZHBvaW50SW5mbyBlbmRwb2ludEluZm8pIHsKLSAgICAgICAgdGhpcyhlbmRwb2ludEluZm8sIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhbENsaWVudFRyYW5zcG9ydChSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGxvZ1N0cmVhbSkgewotICAgICAgICB0aGlzLmVuZHBvaW50SW5mbyA9IGVuZHBvaW50SW5mbzsKLSAgICAgICAgZGVidWdTdHJlYW0gPSBsb2dTdHJlYW07Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxtLnNldE91dHB1dChuZXcgQnl0ZUFycmF5QnVmZmVyKCkpOwotICAgICAgICAgICAgcmV0dXJuIGxtLmdldE91dHB1dCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oImxvY2FsLmNsaWVudC5mYWlsZWQiLGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tNZXNzYWdlQ29udGVudFR5cGUoV1NDb25uZWN0aW9uIGNvbiwgYm9vbGVhbiByZXNwb25zZSkgewotICAgICAgICBTdHJpbmcgbmVnb3RpYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSwgIm5vbmUiKS5pbnRlcm4oKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gY29uLmdldEhlYWRlcnMoKS5nZXQoIkNvbnRlbnQtVHlwZSIpLmdldCgwKTsKLQotICAgICAgICAvLyBVc2UgaW5kZXhPZigpIHRvIGhhbmRsZSBNdWx0aXBhcnQvcmVsYXRlZCB0eXBlcwotICAgICAgICBpZiAobmVnb3RpYXRpb24gPT0gIm5vbmUiKSB7Ci0gICAgICAgICAgICAvLyBPSyBvbmx5IGlmIFhNTAotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoInRleHQveG1sIikgPCAwICYmCi0gICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vc29hcCt4bWwiKSA8IDAgJiYKLSAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94b3AreG1sIikgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIGNvbnRlbnQgdHlwZSAnIiArIGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIicgd2l0aCBjb250ZW50IG5lZ290aWF0aW9uIHNldCB0byAnIiArIG5lZ290aWF0aW9uICsgIicuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmVnb3RpYXRpb24gPT0gIm9wdGltaXN0aWMiKSB7Ci0gICAgICAgICAgICAvLyBPSyBvbmx5IGlmIEZJCi0gICAgICAgICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSA8IDAgJiYKLSAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9zb2FwK2Zhc3RpbmZvc2V0IikgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIGNvbnRlbnQgdHlwZSAnIiArIGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIicgd2l0aCBjb250ZW50IG5lZ290aWF0aW9uIHNldCB0byAnIiArIG5lZ290aWF0aW9uICsgIicuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmVnb3RpYXRpb24gPT0gInBlc3NpbWlzdGljIikgewotICAgICAgICAgICAgLy8gT0sgaWYgRkkgcmVxdWVzdCBpcyBhbnl0aGluZyBhbmQgcmVzcG9uc2UgaXMgRkkKLSAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJgotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpIDwgMCAmJgotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9zb2FwK2Zhc3RpbmZvc2V0IikgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIGNvbnRlbnQgdHlwZSAnIiArIGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIicgd2l0aCBjb250ZW50IG5lZ290aWF0aW9uIHNldCB0byAnIiArIG5lZ290aWF0aW9uICsgIicuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZU91dHB1dCgpIHsKLSAgICAgICAgc3VwZXIuY2xvc2VPdXRwdXQoKTsKLSAgICAgICAgV1NDb25uZWN0aW9uIGNvbiA9IG5ldyBMb2NhbENvbm5lY3Rpb25JbXBsKGxtKTsKLQotICAgICAgICAvLyBDb3B5IGhlYWRlcnMgZm9yIGNvbnRlbnQgbmVnb3RpYXRpb24KLSAgICAgICAgY29uLnNldEhlYWRlcnMoZ2V0SGVhZGVycygpKTsKLQotICAgICAgICAvLyBDaGVjayByZXF1ZXN0IGNvbnRlbnQgdHlwZSBiYXNlZCBvbiBuZWdvdGlhdGlvbiBwcm9wZXJ0eQotICAgICAgICBjaGVja01lc3NhZ2VDb250ZW50VHlwZSh0aGlzLCBmYWxzZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNldCBhIE1lc3NhZ2VDb250ZXh0IHBlciBpbnZvY2F0aW9uCi0gICAgICAgICAgICBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQgPSBlbmRwb2ludEluZm8uZ2V0V2ViU2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgICAgIHdzQ29udGV4dC5zZXRNZXNzYWdlQ29udGV4dChuZXcgTWVzc2FnZUNvbnRleHRJbXBsKCkpOwotICAgICAgICAgICAgdGllLmhhbmRsZShjb24sIGVuZHBvaW50SW5mbyk7Ci0KLSAgICAgICAgICAgIGNoZWNrTWVzc2FnZUNvbnRlbnRUeXBlKGNvbiwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJTZXJ2ZXIgc2lkZSBFeGNlcHRpb246IiArIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBsbS5nZXRPdXRwdXQoKS5uZXdJbnB1dFN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRUcmFuc3BvcnRFeGNlcHRpb24oImxvY2FsLmNsaWVudC5mYWlsZWQiLGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcnMoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7Ci0gICAgICAgIGxtLnNldEhlYWRlcnMoaGVhZGVycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIGxtLmdldEhlYWRlcnMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9sb2NhbC9jbGllbnQvTG9jYWxDbGllbnRUcmFuc3BvcnRGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvbG9jYWwvY2xpZW50L0xvY2FsQ2xpZW50VHJhbnNwb3J0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWViNTJmLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9sb2NhbC9jbGllbnQvTG9jYWxDbGllbnRUcmFuc3BvcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5sb2NhbC5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUVuZHBvaW50SW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkucnVudGltZS5DbGllbnRUcmFuc3BvcnRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5ydW50aW1lLldTQ29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbENsaWVudFRyYW5zcG9ydEZhY3RvcnkgaW1wbGVtZW50cyBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgICBwcml2YXRlIFJ1bnRpbWVFbmRwb2ludEluZm8gZW5kcG9pbnRJbmZvOwotICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIGxvZ1N0cmVhbTsKLQotICAgIC8vdGhpcyBjbGFzcyBpcyB1c2VkIHByaW1hcmlseSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCi0gICAgcHVibGljIExvY2FsQ2xpZW50VHJhbnNwb3J0RmFjdG9yeShSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbykgewotICAgICAgICB0aGlzKGVuZHBvaW50SW5mbywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2FsQ2xpZW50VHJhbnNwb3J0RmFjdG9yeShSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbywKLSAgICAgICAgT3V0cHV0U3RyZWFtIGxvZ1N0cmVhbSkgewotICAgICAgICB0aGlzLmVuZHBvaW50SW5mbyA9IGVuZHBvaW50SW5mbzsKLSAgICAgICAgdGhpcy5sb2dTdHJlYW0gPSBsb2dTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIFdTQ29ubmVjdGlvbiBjcmVhdGUoKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGUobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdTQ29ubmVjdGlvbiBjcmVhdGUoTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9jYWxDbGllbnRUcmFuc3BvcnQoZW5kcG9pbnRJbmZvLCBsb2dTdHJlYW0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2xvY2FsL3NlcnZlci9Mb2NhbENvbm5lY3Rpb25JbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvbG9jYWwvc2VydmVyL0xvY2FsQ29ubmVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0MTFjMi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy90cmFuc3BvcnQvbG9jYWwvc2VydmVyL0xvY2FsQ29ubmVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudHJhbnNwb3J0LmxvY2FsLnNlcnZlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5XU0Nvbm5lY3Rpb25JbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbE1lc3NhZ2U7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5CeXRlQXJyYXlCdWZmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKgotICogU2VydmVyLXNpZGUgTG9jYWwgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbENvbm5lY3Rpb25JbXBsIGV4dGVuZHMgV1NDb25uZWN0aW9uSW1wbCB7Ci0gICAgcHJpdmF0ZSBpbnQgc3RhdHVzOwotICAgIHByaXZhdGUgTG9jYWxNZXNzYWdlIGxtOwotCi0gICAgcHVibGljIExvY2FsQ29ubmVjdGlvbkltcGwgKExvY2FsTWVzc2FnZSBsb2NhbE1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5sbSA9IGxvY2FsTWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+IGdldEhlYWRlcnMgKCkgewotICAgICAgICByZXR1cm4gbG0uZ2V0SGVhZGVycyAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXRzIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVycyAoTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+IGhlYWRlcnMpIHsKLSAgICAgICAgbG0uc2V0SGVhZGVycyAoaGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzIChpbnQgc3RhdHVzKSB7Ci0gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dCAoKSB7Ci0gICAgICAgIHJldHVybiBsbS5nZXRPdXRwdXQoKS5uZXdJbnB1dFN0cmVhbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0ICgpIHsKLSAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJhYiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKLSAgICAgICAgbG0uc2V0T3V0cHV0KGJhYik7Ci0gICAgICAgIHJldHVybiBiYWI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2xvY2FsL3NlcnZlci9Mb2NhbFdTQ29udGV4dEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3RyYW5zcG9ydC9sb2NhbC9zZXJ2ZXIvTG9jYWxXU0NvbnRleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTIyNzcuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdHJhbnNwb3J0L2xvY2FsL3NlcnZlci9Mb2NhbFdTQ29udGV4dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnRyYW5zcG9ydC5sb2NhbC5zZXJ2ZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIExvY2FsV1NDb250ZXh0SW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VDb250ZXh0ICB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRocmVhZExvY2FsIG1zZ0NvbnRleHQgPSBuZXcgVGhyZWFkTG9jYWwoKTsKLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3R4dCA9IChNZXNzYWdlQ29udGV4dCltc2dDb250ZXh0LmdldCgpOwotICAgICAgICBpZiAoY3R4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN0eHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgY3R4dCkgewotICAgICAgICBtc2dDb250ZXh0LnNldChjdHh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvQVNDSUlVdGlsaXR5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0FTQ0lJVXRpbGl0eS5qYXZhCmluZGV4IGRlZGJmMWYuLmEyMTEwNjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvQVNDSUlVdGlsaXR5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9BU0NJSVV0aWxpdHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0Jhc2U2NFV0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvQmFzZTY0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzcyODc4Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvQmFzZTY0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7Ci0KLS8qKgotICoKLSAqIEBhdXRob3Igaml0dQotICovCi1wdWJsaWMgY2xhc3MgQmFzZTY0VXRpbCB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgZW5jb2RlQmFzZTY0W10gPSB7Ci0gICAgICAgICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywKLSAgICAgICAgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLAotICAgICAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsCi0gICAgICAgICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywKLSAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnKycsICcvJwotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBkZWNvZGVCYXNlNjRbXSA9IHsKLSAgICAgICAgLyonKycqLyA2MiwKLSAgICAgICAgLTEsIC0xLCAtMSwKLSAgICAgICAgLyonLycqLyA2MywKLSAgICAgICAgLyonMCcqLyA1MiwKLSAgICAgICAgLyonMScqLyA1MywKLSAgICAgICAgLyonMicqLyA1NCwKLSAgICAgICAgLyonMycqLyA1NSwKLSAgICAgICAgLyonNCcqLyA1NiwKLSAgICAgICAgLyonNScqLyA1NywKLSAgICAgICAgLyonNicqLyA1OCwKLSAgICAgICAgLyonNycqLyA1OSwKLSAgICAgICAgLyonOCcqLyA2MCwKLSAgICAgICAgLyonOScqLyA2MSwKLSAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgIC8qJ0EnKi8gMCwKLSAgICAgICAgLyonQicqLyAxLAotICAgICAgICAvKidDJyovIDIsCi0gICAgICAgIC8qJ0QnKi8gMywKLSAgICAgICAgLyonRScqLyA0LAotICAgICAgICAvKidGJyovIDUsCi0gICAgICAgIC8qJ0cnKi8gNiwKLSAgICAgICAgLyonSCcqLyA3LAotICAgICAgICAvKidJJyovIDgsCi0gICAgICAgIC8qJ0onKi8gOSwKLSAgICAgICAgLyonSycqLyAxMCwKLSAgICAgICAgLyonTCcqLyAxMSwKLSAgICAgICAgLyonTScqLyAxMiwKLSAgICAgICAgLyonTicqLyAxMywKLSAgICAgICAgLyonTycqLyAxNCwKLSAgICAgICAgLyonUCcqLyAxNSwKLSAgICAgICAgLyonUScqLyAxNiwKLSAgICAgICAgLyonUicqLyAxNywKLSAgICAgICAgLyonUycqLyAxOCwKLSAgICAgICAgLyonVCcqLyAxOSwKLSAgICAgICAgLyonVScqLyAyMCwKLSAgICAgICAgLyonVicqLyAyMSwKLSAgICAgICAgLyonVycqLyAyMiwKLSAgICAgICAgLyonWCcqLyAyMywKLSAgICAgICAgLyonWScqLyAyNCwKLSAgICAgICAgLyonWicqLyAyNSwKLSAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgLyonYScqLyAyNiwKLSAgICAgICAgLyonYicqLyAyNywKLSAgICAgICAgLyonYycqLyAyOCwKLSAgICAgICAgLyonZCcqLyAyOSwKLSAgICAgICAgLyonZScqLyAzMCwKLSAgICAgICAgLyonZicqLyAzMSwKLSAgICAgICAgLyonZycqLyAzMiwKLSAgICAgICAgLyonaCcqLyAzMywKLSAgICAgICAgLyonaScqLyAzNCwKLSAgICAgICAgLyonaicqLyAzNSwKLSAgICAgICAgLyonaycqLyAzNiwKLSAgICAgICAgLyonbCcqLyAzNywKLSAgICAgICAgLyonbScqLyAzOCwKLSAgICAgICAgLyonbicqLyAzOSwKLSAgICAgICAgLyonbycqLyA0MCwKLSAgICAgICAgLyoncCcqLyA0MSwKLSAgICAgICAgLyoncScqLyA0MiwKLSAgICAgICAgLyoncicqLyA0MywKLSAgICAgICAgLyoncycqLyA0NCwKLSAgICAgICAgLyondCcqLyA0NSwKLSAgICAgICAgLyondScqLyA0NiwKLSAgICAgICAgLyondicqLyA0NywKLSAgICAgICAgLyondycqLyA0OCwKLSAgICAgICAgLyoneCcqLyA0OSwKLSAgICAgICAgLyoneScqLyA1MCwKLSAgICAgICAgLyoneicqLyA1MQotICAgIH07Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoYnl0ZVtdIHZhbHVlKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGJsb2NrQ291bnQgPSB2YWx1ZS5sZW5ndGggLyAzOwotICAgICAgICBpbnQgcGFydGlhbEJsb2NrTGVuZ3RoID0gdmFsdWUubGVuZ3RoICUgMzsKLQotICAgICAgICBpZiAocGFydGlhbEJsb2NrTGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICsrYmxvY2tDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBlbmNvZGVkTGVuZ3RoID0gYmxvY2tDb3VudCAqIDQ7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBlbmNvZGVkVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKGVuY29kZWRMZW5ndGgpOwotCi0gICAgICAgIGludCBpZHggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrQ291bnQ7ICsraSkgewotICAgICAgICAgICAgaW50IGIxID0gdmFsdWVbaWR4KytdOwotICAgICAgICAgICAgaW50IGIyID0gKGlkeCA8IHZhbHVlLmxlbmd0aCkgPyB2YWx1ZVtpZHgrK10gOiAwOwotICAgICAgICAgICAgaW50IGIzID0gKGlkeCA8IHZhbHVlLmxlbmd0aCkgPyB2YWx1ZVtpZHgrK10gOiAwOwotCi0gICAgICAgICAgICBpZiAoYjEgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYjEgKz0gMjU2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGIyIDwgMCkgewotICAgICAgICAgICAgICAgIGIyICs9IDI1NjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiMyA8IDApIHsKLSAgICAgICAgICAgICAgICBiMyArPSAyNTY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoYXIgZW5jb2RlZENoYXI7Ci0KLSAgICAgICAgICAgIGVuY29kZWRDaGFyID0gZW5jb2RlQmFzZTY0W2IxID4+IDJdOwotICAgICAgICAgICAgZW5jb2RlZFZhbHVlLmFwcGVuZChlbmNvZGVkQ2hhcik7Ci0KLSAgICAgICAgICAgIGVuY29kZWRDaGFyID0gZW5jb2RlQmFzZTY0WygoYjEgJiAweDAzKSA8PCA0KSB8IChiMiA+PiA0KV07Ci0gICAgICAgICAgICBlbmNvZGVkVmFsdWUuYXBwZW5kKGVuY29kZWRDaGFyKTsKLQotICAgICAgICAgICAgZW5jb2RlZENoYXIgPSBlbmNvZGVCYXNlNjRbKChiMiAmIDB4MGYpIDw8IDIpIHwgKGIzID4+IDYpXTsKLSAgICAgICAgICAgIGVuY29kZWRWYWx1ZS5hcHBlbmQoZW5jb2RlZENoYXIpOwotCi0gICAgICAgICAgICBlbmNvZGVkQ2hhciA9IGVuY29kZUJhc2U2NFtiMyAmIDB4M2ZdOwotICAgICAgICAgICAgZW5jb2RlZFZhbHVlLmFwcGVuZChlbmNvZGVkQ2hhcik7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHBhcnRpYWxCbG9ja0xlbmd0aCkgewotICAgICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZS5zZXRDaGFyQXQoZW5jb2RlZExlbmd0aCAtIDEsICc9Jyk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlLnNldENoYXJBdChlbmNvZGVkTGVuZ3RoIC0gMiwgJz0nKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlLnNldENoYXJBdChlbmNvZGVkTGVuZ3RoIC0gMSwgJz0nKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbmNvZGVkVmFsdWUudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvQnl0ZUFycmF5QnVmZmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0J5dGVBcnJheUJ1ZmZlci5qYXZhCmluZGV4IDM1ZGZlNDMuLjA1ZTllODAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvQnl0ZUFycmF5QnVmZmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9CeXRlQXJyYXlCdWZmZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00OSwxMSArNDksMTEgQEAKICAqCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCeXRlQXJyYXlCdWZmZXIgZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworcHVibGljIGNsYXNzIEJ5dGVBcnJheUJ1ZmZlciBleHRlbmRzIE91dHB1dFN0cmVhbSB7CiAgICAgLyoqCiAgICAgICogVGhlIGJ1ZmZlciB3aGVyZSBkYXRhIGlzIHN0b3JlZC4KICAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGUgYnVmW107CisgICAgcHJvdGVjdGVkIGJ5dGVbXSBidWY7CiAKICAgICAvKioKICAgICAgKiBUaGUgbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIHRoZSBidWZmZXIuCkBAIC05Miw3ICs5Miw3IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgaWYgdGhlIHJlYWQgb3BlcmF0aW9uIGZhaWxzIHdpdGggYW4ge0BsaW5rIElPRXhjZXB0aW9ufS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgd2hpbGUodHJ1ZSkgewogICAgICAgICAgICAgaW50IGNhcCA9IGJ1Zi5sZW5ndGgtY291bnQ7ICAgICAvLyB0aGUgcmVtYWluaW5nIGJ1ZmZlciBzcGFjZQogICAgICAgICAgICAgaW50IHN6ID0gaW4ucmVhZChidWYsY291bnQsY2FwKTsKQEAgLTEwNSwxNCArMTA1LDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgeworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGludCBiKSB7CiAgICAgICAgIGludCBuZXdjb3VudCA9IGNvdW50ICsgMTsKICAgICAgICAgZW5zdXJlQ2FwYWNpdHkobmV3Y291bnQpOwogICAgICAgICBidWZbY291bnRdID0gKGJ5dGUpIGI7CiAgICAgICAgIGNvdW50ID0gbmV3Y291bnQ7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgbmV3Y291bnQgPSBjb3VudCArIGxlbjsKICAgICAgICAgZW5zdXJlQ2FwYWNpdHkobmV3Y291bnQpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgYnVmLCBjb3VudCwgbGVuKTsKQEAgLTEyNywxMSArMTI3LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBjb3VudCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIGNvdW50ID0gMDsKICAgICB9CiAKQEAgLTE0NSwzMCArMTQ1LDUxIEBACiAgICAgICogICAgICB0aGlzIG1ldGhvZCBjYXVzZXMgYSBidWZmZXIgcmVhbGxvY2F0aW9uLiBVc2UgaXQgb25seSB3aGVuCiAgICAgICogICAgICB5b3UgaGF2ZSB0by4KICAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZSB0b0J5dGVBcnJheSgpW10geworICAgIHB1YmxpYyBmaW5hbCBieXRlW10gdG9CeXRlQXJyYXkoKSB7CiAgICAgICAgIGJ5dGUgbmV3YnVmW10gPSBuZXcgYnl0ZVtjb3VudF07CiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBuZXdidWYsIDAsIGNvdW50KTsKICAgICAgICAgcmV0dXJuIG5ld2J1ZjsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgcHVibGljIGZpbmFsIGludCBzaXplKCkgewogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdW5kZXJseWluZyBidWZmZXIgdGhhdCB0aGlzIHtAbGluayBCeXRlQXJyYXlCdWZmZXJ9IHVzZXMuCisgICAgICogSXQncyBuZXZlciBzbWFsbCB0aGFuIGl0cyB7QGxpbmsgI3NpemUoKX0uCisgICAgICoKKyAgICAgKiBVc2Ugd2l0aCBjYXV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBieXRlW10gZ2V0UmF3RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSW5wdXRTdHJlYW19IHRoYXQgcmVhZHMgZnJvbSB0aGlzIGJ1ZmZlci4KICAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0oKSB7CisgICAgcHVibGljIGZpbmFsIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKCkgewogICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZiwwLGNvdW50KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBJbnB1dFN0cmVhbX0gdGhhdCByZWFkcyBhIHBhcnQgb2YgdGhpcyBiZnVmZXIuCiAgICAgICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgIHB1YmxpYyBmaW5hbCBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWYsc3RhcnQsbGVuZ3RoKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBieSB0aGUgZGVmYXVsdCBlbmNvZGluZworICAgICAqIGFuZCByZXR1cm5zIGl0IGFzIGEgc3RyaW5nLgorICAgICAqCisgICAgICogPHA+CisgICAgICogTWVhbnQgdG8gYWlkIGRlYnVnZ2luZywgYnV0IG5vIG1vcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAwLCBjb3VudCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9CeXRlQXJyYXlEYXRhU291cmNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0J5dGVBcnJheURhdGFTb3VyY2UuamF2YQppbmRleCA5NDYzZTYzLi4xODRiOTIwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0J5dGVBcnJheURhdGFTb3VyY2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0J5dGVBcnJheURhdGFTb3VyY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0NvbXBsZXRlZEZ1dHVyZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9Db21wbGV0ZWRGdXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI4NDdhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9Db21wbGV0ZWRGdXR1cmUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICoge0BsaW5rIEZ1dHVyZX0gaW1wbGVtZW50YXRpb24gdGhhdCBvYnRhaW5zIGFuIGFscmVhZHkgYXZhaWxhYmxlIHZhbHVlLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgSml0ZW5kcmEgS290YW1yYWp1CisgKi8KK3B1YmxpYyBjbGFzcyBDb21wbGV0ZWRGdXR1cmU8VD4gaW1wbGVtZW50cyBGdXR1cmU8VD4geworICAgIHByaXZhdGUgZmluYWwgVCB2OworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIHJlOworCisgICAgcHVibGljIENvbXBsZXRlZEZ1dHVyZShUIHYsIFRocm93YWJsZSByZSkgeworICAgICAgICB0aGlzLnYgPSB2OworICAgICAgICB0aGlzLnJlID0gcmU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsKGJvb2xlYW4gbWF5SW50ZXJydXB0SWZSdW5uaW5nKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIFQgZ2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKHJlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBnZXQobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0NvbnN0YW50cy5qYXZhCmluZGV4IDdjNDQxMTkuLmQ5ZTIwZjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9Db25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0RPTVV0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvRE9NVXRpbC5qYXZhCmluZGV4IGE5ZGU5NDEuLmQwYjJkY2QgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvRE9NVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvRE9NVXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDIwICsyNSwyOSBAQAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7CiAKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKIAogLyoqCiAgKiAkYXV0aG9yOiBKQVhXUyBEZXZlbG9wbWVudCBUZWFtCkBAIC04Niw0ICs5NSwxNjcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmF2ZXJzZXMgYSBET00gbm9kZSBhbmQgd3JpdGVzIG91dCBvbiBhIHN0cmVhbWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZQorICAgICAqIEBwYXJhbSB3cml0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplTm9kZShFbGVtZW50IG5vZGUsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZVRhZ1dpdGhBdHRyaWJ1dGVzKG5vZGUsIHdyaXRlcik7CisKKyAgICAgICAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7CisgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDRGF0YShjaGlsZC5nZXROb2RlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKGNoaWxkLmdldE5vZGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplTm9kZSgoRWxlbWVudCkgY2hpbGQsIHdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVRhZ1dpdGhBdHRyaWJ1dGVzKEVsZW1lbnQgbm9kZSwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBub2RlUHJlZml4ID0gZml4TnVsbChub2RlLmdldFByZWZpeCgpKTsKKyAgICAgICAgU3RyaW5nIG5vZGVOUyA9IGZpeE51bGwobm9kZS5nZXROYW1lc3BhY2VVUkkoKSk7CisKKyAgICAgICAgLy8gU2VlIGlmIG5vZGVQcmVmaXg6bm9kZU5TIGlzIGRlY2xhcmVkIGluIHdyaXRlcidzIE5hbWVzcGFjZUNvbnRleHQgYmVmb3JlIHdyaXRpbmcgc3RhcnQgZWxlbWVudAorICAgICAgICAvLyBXcml0aW5nIHN0YXJ0IGVsZW1lbnQgcHV0cyBub2RlTlMgaW4gTmFtZXNwYWNlQ29udGV4dCBldmVuIHRob3VnaCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gbm90IHdyaXR0ZW4KKyAgICAgICAgYm9vbGVhbiBwcmVmaXhEZWNsID0gaXNQcmVmaXhEZWNsYXJlZCh3cml0ZXIsIG5vZGVOUywgbm9kZVByZWZpeCk7CisgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChub2RlUHJlZml4LCBub2RlLmdldExvY2FsTmFtZSgpLCBub2RlTlMpOworCisgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBpbnQgbnVtT2ZBdHRyaWJ1dGVzID0gYXR0cnMuZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICAvLyB3cml0ZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGZpcnN0LgorICAgICAgICAgICAgLy8gaWYgd2UgaW50ZXJsZWF2ZSB0aGlzIHdpdGggYXR0cmlidWUgd3JpdGluZywKKyAgICAgICAgICAgIC8vIFplcGh5ciB3aWxsIHRyeSB0byBmaXggaXQgYW5kIHdlIGVuZCB1cCBnZXR0aW5nIGluY29uc2lzdGVudCBuYW1lc3BhY2UgYmluZGluZ3MuCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9mQXR0cmlidXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBhdHRyID0gYXR0cnMuaXRlbShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbnNVcmkgPSBmaXhOdWxsKGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICAgICAgICAgIGlmIChuc1VyaS5lcXVhbHMoWE1MQ29uc3RhbnRzLlhNTE5TX0FUVFJJQlVURV9OU19VUkkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBkZWZhdWx0IG5zIGRlY2xhcmF0aW9ucworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBhdHRyLmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxDb25zdGFudHMuWE1MTlNfQVRUUklCVVRFKSA/ICIiIDogYXR0ci5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyhub2RlUHJlZml4KSAmJiBhdHRyLmdldE5vZGVWYWx1ZSgpLmVxdWFscyhub2RlTlMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhEZWNsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWwuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRGVmYXVsdE5hbWVzcGFjZShhdHRyLmdldE5vZGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24sIG5vdCBhbiBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgoYXR0ci5nZXRMb2NhbE5hbWUoKSwgYXR0ci5nZXROb2RlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoYXR0ci5nZXRMb2NhbE5hbWUoKSwgYXR0ci5nZXROb2RlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbm9kZSdzIG5hbWVzcGFjZSBpcyBub3QgZGVjbGFyZWQgYXMgYXR0cmlidXRlLCBidXQgZGVjbGFyZWQgb24gYW5jZXN0b3IKKyAgICAgICAgaWYgKCFwcmVmaXhEZWNsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2Uobm9kZVByZWZpeCwgbm9kZU5TKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdyaXRlIGFsbCBvdGhlciBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBub3QgbmFtZXNwYWNlIGRlY2wuCisgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBpbnQgbnVtT2ZBdHRyaWJ1dGVzID0gYXR0cnMuZ2V0TGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtT2ZBdHRyaWJ1dGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIGF0dHIgPSBhdHRycy5pdGVtKGkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyUHJlZml4ID0gZml4TnVsbChhdHRyLmdldFByZWZpeCgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ck5TID0gZml4TnVsbChhdHRyLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWF0dHJOUy5lcXVhbHMoWE1MQ29uc3RhbnRzLlhNTE5TX0FUVFJJQlVURV9OU19VUkkpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBhdHRyLmdldExvY2FsTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgcmVhbGx5IGEgYnVnIGluIHRoZSBjYWxsZXIgZm9yIG5vdCBjcmVhdGluZyBwcm9wZXIgRE9NIHRyZWUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHJlbW92ZSB0aGlzIHdvcmthcm91bmQgYWZ0ZXIgcGx1Z2Zlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF0dHJQcmVmaXhEZWNsID0gaXNQcmVmaXhEZWNsYXJlZCh3cml0ZXIsIGF0dHJOUywgYXR0clByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXR0clByZWZpeC5lcXVhbHMoIiIpICYmICFhdHRyUHJlZml4RGVjbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ciBoYXMgbmFtZXNwYWNlIGJ1dCBuYW1lc3BhY2UgZGVjbCBpcyB0aGVyZSBpbiBhbmNlc3RvciBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbyB3cml0ZSB0aGUgbmFtZXNwYWNlIGRlY2wgYmVmb3JlIHdyaXRpbmcgdGhlIGF0dHIKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgoYXR0ci5nZXRMb2NhbE5hbWUoKSwgYXR0ci5nZXROb2RlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoYXR0clByZWZpeCwgYXR0ck5TKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0clByZWZpeCwgYXR0ck5TLCBsb2NhbE5hbWUsIGF0dHIuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcmVmaXhEZWNsYXJlZChYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBTdHJpbmcgbnNVcmksIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgYm9vbGVhbiBwcmVmaXhEZWNsID0gZmFsc2U7CisgICAgICAgIE5hbWVzcGFjZUNvbnRleHQgbnNjb250ZXh0ID0gd3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKKyAgICAgICAgSXRlcmF0b3IgcHJlZml4SXRyID0gbnNjb250ZXh0LmdldFByZWZpeGVzKG5zVXJpKTsKKyAgICAgICAgd2hpbGUgKHByZWZpeEl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKHByZWZpeEl0ci5uZXh0KCkpKSB7CisgICAgICAgICAgICAgICAgcHJlZml4RGVjbCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByZWZpeERlY2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEZpcnN0Q2hpbGQoRWxlbWVudCBlLCBTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbCkgeworICAgICAgICBmb3IgKE5vZGUgbiA9IGUuZ2V0Rmlyc3RDaGlsZCgpOyBuICE9IG51bGw7IG4gPSBuLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGMgPSAoRWxlbWVudCkgbjsKKyAgICAgICAgICAgICAgICBpZiAoYy5nZXRMb2NhbE5hbWUoKS5lcXVhbHMobG9jYWwpICYmIGMuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5zVXJpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMKKyAgICBATm90TnVsbAorICAgIFN0cmluZyBmaXhOdWxsKEBOdWxsYWJsZSBTdHJpbmcgcykgeworICAgICAgICBpZiAocyA9PSBudWxsKSByZXR1cm4gIiI7CisgICAgICAgIGVsc2UgcmV0dXJuIHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBjaGlsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljCisgICAgQE51bGxhYmxlCisgICAgRWxlbWVudCBnZXRGaXJzdEVsZW1lbnRDaGlsZChOb2RlIHBhcmVudCkgeworICAgICAgICBmb3IgKE5vZGUgbiA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IG4gIT0gbnVsbDsgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoRWxlbWVudCkgbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEBOb3ROdWxsCisgICAgTGlzdDxFbGVtZW50PiBnZXRDaGlsZEVsZW1lbnRzKE5vZGUgcGFyZW50KXsKKyAgICAgICAgTGlzdDxFbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKKyAgICAgICAgZm9yIChOb2RlIG4gPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBuICE9IG51bGw7IG4gPSBuLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoKEVsZW1lbnQpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvRmFzdEluZm9zZXRSZWZsZWN0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0Zhc3RJbmZvc2V0UmVmbGVjdGlvbi5qYXZhCmluZGV4IGM5MzhkZWIuLmE2OTNhZjUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvRmFzdEluZm9zZXRSZWZsZWN0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9GYXN0SW5mb3NldFJlZmxlY3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNCArMjUsOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogCiAKIC8qKgpAQCAtNDIsMjQ4ICszNiw0MCBAQAogICovCiBwdWJsaWMgY2xhc3MgRmFzdEluZm9zZXRSZWZsZWN0aW9uIHsKICAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZmlDbGFzc0xvYWRlcjsKLQotICAgIC8qKgogICAgICAqIEZJIFN0QVhEb2N1bWVudFBhcnNlciBjb25zdHJ1Y3RvciB1c2luZyByZWZsZWN0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uc3RydWN0b3IgZmlTdEFYRG9jdW1lbnRQYXJzZXJfbmV3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RydWN0b3IgZmlTdEFYRG9jdW1lbnRQYXJzZXJfbmV3OwogCiAgICAgLyoqCiAgICAgICogRkkgPGNvZGU+U3RBWERvY3VtZW50UGFyc2VyLnNldElucHV0U3RyZWFtKCk8L2NvZGU+IG1ldGhvZCB2aWEgcmVmbGVjdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBmaVN0QVhEb2N1bWVudFBhcnNlcl9zZXRJbnB1dFN0cmVhbTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZCBmaVN0QVhEb2N1bWVudFBhcnNlcl9zZXRJbnB1dFN0cmVhbTsKIAogICAgIC8qKgogICAgICAqIEZJIDxjb2RlPlN0QVhEb2N1bWVudFBhcnNlci5zZXRTdHJpbmdJbnRlcm5pbmcoKTwvY29kZT4gbWV0aG9kIHZpYSByZWZsZWN0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpU3RBWERvY3VtZW50UGFyc2VyX3NldFN0cmluZ0ludGVybmluZzsKLQotICAgIC8qKgotICAgICAqIEZJIFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIgY29uc3RydWN0b3IgdXNpbmcgcmVmbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbnN0cnVjdG9yIGZpU3RBWERvY3VtZW50U2VyaWFsaXplcl9uZXc7Ci0KLSAgICAvKioKLSAgICAgKiBGSSA8Y29kZT5TdEFYRG9jdW1lbnRTZXJpYWxpemVyLnNldE91dHB1dFN0cmVhbSgpPC9jb2RlPiBtZXRob2QgdmlhIHJlZmxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZmlTdEFYRG9jdW1lbnRTZXJpYWxpemVyX3NldE91dHB1dFN0cmVhbTsKLQotICAgIC8qKgotICAgICAqIEZJIDxjb2RlPlN0QVhEb2N1bWVudFNlcmlhbGl6ZXIuc2V0RW5jb2RpbmcoKTwvY29kZT4gbWV0aG9kIHZpYSByZWZsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpU3RBWERvY3VtZW50U2VyaWFsaXplcl9zZXRFbmNvZGluZzsKLQotICAgIC8qKgotICAgICAqIEZJIERPTURvY3VtZW50UGFyc2VyIGNvbnN0cnVjdG9yIHVzaW5nIHJlZmxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb25zdHJ1Y3RvciBmaURPTURvY3VtZW50UGFyc2VyX25ldzsKLQotICAgIC8qKgotICAgICAqIEZJIDxjb2RlPkRPTURvY3VtZW50UGFyc2VyLnBhcnNlKCk8L2NvZGU+IG1ldGhvZCB2aWEgcmVmbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBmaURPTURvY3VtZW50UGFyc2VyX3BhcnNlOwotCi0gICAgLyoqCi0gICAgICogRkkgRE9NRG9jdW1lbnRTZXJpYWxpemVyIGNvbnN0cnVjdG9yIHVzaW5nIHJlZmxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb25zdHJ1Y3RvciBmaURPTURvY3VtZW50U2VyaWFsaXplcl9uZXc7Ci0KLSAgICAvKioKLSAgICAgKiBGSSA8Y29kZT5GYXN0SW5mb3NldFNvdXJjZS5zZXJpYWxpemUoRG9jdW1lbnQpPC9jb2RlPiBtZXRob2QgdmlhIHJlZmxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZmlET01Eb2N1bWVudFNlcmlhbGl6ZXJfc2VyaWFsaXplOwotCi0gICAgLyoqCi0gICAgICogRkkgPGNvZGU+RmFzdEluZm9zZXRTb3VyY2Uuc2V0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSk8L2NvZGU+IG1ldGhvZCB2aWEgcmVmbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBmaURPTURvY3VtZW50U2VyaWFsaXplcl9zZXRPdXRwdXRTdHJlYW07Ci0KLSAgICAvKioKLSAgICAgKiBGSSBGYXN0SW5mb3NldFNvdXJjZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGZpRmFzdEluZm9zZXRTb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiBGSSBGYXN0SW5mb3NldFNvdXJjZSBjb25zdHJ1Y3RvciB1c2luZyByZWZsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uc3RydWN0b3IgZmlGYXN0SW5mb3NldFNvdXJjZV9uZXc7Ci0KLSAgICAvKioKLSAgICAgKiBGSSA8Y29kZT5GYXN0SW5mb3NldFNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpPC9jb2RlPiBtZXRob2QgdmlhIHJlZmxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZmlGYXN0SW5mb3NldFNvdXJjZV9nZXRJbnB1dFN0cmVhbTsKLQotICAgIC8qKgotICAgICAqIEZJIDxjb2RlPkZhc3RJbmZvc2V0U291cmNlLnNldElucHV0U1RyZWFtKCk8L2NvZGU+IG1ldGhvZCB2aWEgcmVmbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBmaUZhc3RJbmZvc2V0U291cmNlX3NldElucHV0U3RyZWFtOwotCi0gICAgLyoqCi0gICAgICogRkkgRmFzdEluZm9zZXRSZXN1bHQgY2xhc3MgdXNpbmcgcmVmbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGZpRmFzdEluZm9zZXRSZXN1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBGSSBGYXN0SW5mb3NldFJlc3VsdCBjb25zdHJ1Y3RvciB1c2luZyByZWZsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uc3RydWN0b3IgZmlGYXN0SW5mb3NldFJlc3VsdF9uZXc7Ci0KLSAgICAvKioKLSAgICAgKiBGSSA8Y29kZT5GYXN0SW5mb3NldFJlc3VsdC5nZXRPdXRwdXRTVHJlYW0oKTwvY29kZT4gbWV0aG9kIHZpYSByZWZsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGZpRmFzdEluZm9zZXRSZXN1bHRfZ2V0T3V0cHV0U3RyZWFtOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kIGZpU3RBWERvY3VtZW50UGFyc2VyX3NldFN0cmluZ0ludGVybmluZzsKIAogICAgIHN0YXRpYyB7CisgICAgICAgIENvbnN0cnVjdG9yIHRtcF9uZXcgPSBudWxsOworICAgICAgICBNZXRob2QgdG1wX3NldElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgTWV0aG9kIHRtcF9zZXRTdHJpbmdJbnRlcm5pbmcgPSBudWxsOworCiAgICAgICAgIC8vIFVzZSByZWZsZWN0aW9uIHRvIGF2b2lkIHN0YXRpYyBkZXBlbmRlbmN5IHdpdGggRkkgamFyCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7Ci0gICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoImNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50UGFyc2VyIik7Ci0gICAgICAgICAgICBmaVN0QVhEb2N1bWVudFBhcnNlcl9uZXcgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcigpOwotICAgICAgICAgICAgZmlTdEFYRG9jdW1lbnRQYXJzZXJfc2V0SW5wdXRTdHJlYW0gPQorICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnhtbC5pbnRlcm5hbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFBhcnNlciIpOworICAgICAgICAgICAgdG1wX25ldyA9IGNsYXp6LmdldENvbnN0cnVjdG9yKCk7CisgICAgICAgICAgICB0bXBfc2V0SW5wdXRTdHJlYW0gPQogICAgICAgICAgICAgICAgIGNsYXp6LmdldE1ldGhvZCgic2V0SW5wdXRTdHJlYW0iLCBqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzKTsKLSAgICAgICAgICAgIGZpU3RBWERvY3VtZW50UGFyc2VyX3NldFN0cmluZ0ludGVybmluZyA9CisgICAgICAgICAgICB0bXBfc2V0U3RyaW5nSW50ZXJuaW5nID0KICAgICAgICAgICAgICAgICBjbGF6ei5nZXRNZXRob2QoInNldFN0cmluZ0ludGVybmluZyIsIGJvb2xlYW4uY2xhc3MpOwotCi0gICAgICAgICAgICBjbGF6eiA9Ci0gICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5TdEFYRG9jdW1lbnRTZXJpYWxpemVyIik7Ci0gICAgICAgICAgICBmaVN0QVhEb2N1bWVudFNlcmlhbGl6ZXJfbmV3ID0gY2xhenouZ2V0Q29uc3RydWN0b3IoKTsKLSAgICAgICAgICAgIGZpU3RBWERvY3VtZW50U2VyaWFsaXplcl9zZXRPdXRwdXRTdHJlYW0gPQotICAgICAgICAgICAgICAgIGNsYXp6LmdldE1ldGhvZCgic2V0T3V0cHV0U3RyZWFtIiwgamF2YS5pby5PdXRwdXRTdHJlYW0uY2xhc3MpOwotICAgICAgICAgICAgZmlTdEFYRG9jdW1lbnRTZXJpYWxpemVyX3NldEVuY29kaW5nID0KLSAgICAgICAgICAgICAgICBjbGF6ei5nZXRNZXRob2QoInNldEVuY29kaW5nIiwgU3RyaW5nLmNsYXNzKTsKLQotICAgICAgICAgICAgY2xhenogPQotICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LmRvbS5ET01Eb2N1bWVudFBhcnNlciIpOwotICAgICAgICAgICAgZmlET01Eb2N1bWVudFBhcnNlcl9uZXcgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcigpOwotICAgICAgICAgICAgZmlET01Eb2N1bWVudFBhcnNlcl9wYXJzZSA9IGNsYXp6LmdldE1ldGhvZCgicGFyc2UiLAotICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgb3JnLnczYy5kb20uRG9jdW1lbnQuY2xhc3MsIGphdmEuaW8uSW5wdXRTdHJlYW0uY2xhc3MgfSk7Ci0KLSAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgiY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuZG9tLkRPTURvY3VtZW50U2VyaWFsaXplciIpOwotICAgICAgICAgICAgZmlET01Eb2N1bWVudFNlcmlhbGl6ZXJfbmV3ID0gY2xhenouZ2V0Q29uc3RydWN0b3IoKTsKLSAgICAgICAgICAgIGZpRE9NRG9jdW1lbnRTZXJpYWxpemVyX3NlcmlhbGl6ZSA9IGNsYXp6LmdldE1ldGhvZCgic2VyaWFsaXplIiwKLSAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IG9yZy53M2MuZG9tLk5vZGUuY2xhc3MgfSk7Ci0gICAgICAgICAgICBmaURPTURvY3VtZW50U2VyaWFsaXplcl9zZXRPdXRwdXRTdHJlYW0gPSBjbGF6ei5nZXRNZXRob2QoInNldE91dHB1dFN0cmVhbSIsCi0gICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcyB9KTsKLQotICAgICAgICAgICAgZmlGYXN0SW5mb3NldFNvdXJjZSA9IGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgiY29tLnN1bi54bWwuaW50ZXJuYWwub3JnLmp2bmV0LmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0U291cmNlIik7Ci0gICAgICAgICAgICBmaUZhc3RJbmZvc2V0U291cmNlX25ldyA9IGNsYXp6LmdldENvbnN0cnVjdG9yKAotICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgamF2YS5pby5JbnB1dFN0cmVhbS5jbGFzcyB9KTsKLSAgICAgICAgICAgIGZpRmFzdEluZm9zZXRTb3VyY2VfZ2V0SW5wdXRTdHJlYW0gPSBjbGF6ei5nZXRNZXRob2QoImdldElucHV0U3RyZWFtIik7Ci0gICAgICAgICAgICBmaUZhc3RJbmZvc2V0U291cmNlX3NldElucHV0U3RyZWFtID0gY2xhenouZ2V0TWV0aG9kKCJzZXRJbnB1dFN0cmVhbSIsCi0gICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBqYXZhLmlvLklucHV0U3RyZWFtLmNsYXNzIH0pOwotCi0gICAgICAgICAgICBmaUZhc3RJbmZvc2V0UmVzdWx0ID0gY2xhenogPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuZmFzdGluZm9zZXQuRmFzdEluZm9zZXRSZXN1bHQiKTsKLSAgICAgICAgICAgIGZpRmFzdEluZm9zZXRSZXN1bHRfbmV3ID0gY2xhenouZ2V0Q29uc3RydWN0b3IoCi0gICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBqYXZhLmlvLk91dHB1dFN0cmVhbS5jbGFzcyB9KTsKLSAgICAgICAgICAgIGZpRmFzdEluZm9zZXRSZXN1bHRfZ2V0T3V0cHV0U3RyZWFtID0gY2xhenouZ2V0TWV0aG9kKCJnZXRPdXRwdXRTdHJlYW0iKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGZhbGxzIHRocm91Z2gKICAgICAgICAgfQorICAgICAgICBmaVN0QVhEb2N1bWVudFBhcnNlcl9uZXcgPSB0bXBfbmV3OworICAgICAgICBmaVN0QVhEb2N1bWVudFBhcnNlcl9zZXRJbnB1dFN0cmVhbSA9IHRtcF9zZXRJbnB1dFN0cmVhbTsKKyAgICAgICAgZmlTdEFYRG9jdW1lbnRQYXJzZXJfc2V0U3RyaW5nSW50ZXJuaW5nID0gdG1wX3NldFN0cmluZ0ludGVybmluZzsKICAgICB9CiAKLSAgICAvLyAtLSBET01Eb2N1bWVudFBhcnNlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBET01Eb2N1bWVudFBhcnNlcl9uZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpRE9NRG9jdW1lbnRQYXJzZXJfbmV3ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9jYXRlIEZhc3QgSW5mb3NldCBpbXBsZW1lbnRhdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaURPTURvY3VtZW50UGFyc2VyX25ldy5uZXdJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBET01Eb2N1bWVudFBhcnNlcl9wYXJzZShPYmplY3QgcGFyc2VyLAotICAgICAgICBEb2N1bWVudCBkLCBJbnB1dFN0cmVhbSBzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoZmlET01Eb2N1bWVudFBhcnNlcl9wYXJzZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBGYXN0IEluZm9zZXQgaW1wbGVtZW50YXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBmaURPTURvY3VtZW50UGFyc2VyX3BhcnNlLmludm9rZShwYXJzZXIsIGQsIHMpOwotICAgIH0KLQotICAgIC8vIC0tIERPTURvY3VtZW50U2VyaWFsaXplci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IERPTURvY3VtZW50U2VyaWFsaXplcl9uZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpRE9NRG9jdW1lbnRTZXJpYWxpemVyX25ldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBGYXN0IEluZm9zZXQgaW1wbGVtZW50YXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlET01Eb2N1bWVudFNlcmlhbGl6ZXJfbmV3Lm5ld0luc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIERPTURvY3VtZW50U2VyaWFsaXplcl9zZXJpYWxpemUoT2JqZWN0IHNlcmlhbGl6ZXIsIE5vZGUgbm9kZSkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGZpRE9NRG9jdW1lbnRTZXJpYWxpemVyX3NlcmlhbGl6ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBGYXN0IEluZm9zZXQgaW1wbGVtZW50YXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBmaURPTURvY3VtZW50U2VyaWFsaXplcl9zZXJpYWxpemUuaW52b2tlKHNlcmlhbGl6ZXIsIG5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBET01Eb2N1bWVudFNlcmlhbGl6ZXJfc2V0T3V0cHV0U3RyZWFtKE9iamVjdCBzZXJpYWxpemVyLAotICAgICAgICBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChmaURPTURvY3VtZW50U2VyaWFsaXplcl9zZXRPdXRwdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBsb2NhdGUgRmFzdCBJbmZvc2V0IGltcGxlbWVudGF0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmlET01Eb2N1bWVudFNlcmlhbGl6ZXJfc2V0T3V0cHV0U3RyZWFtLmludm9rZShzZXJpYWxpemVyLCBvcyk7Ci0gICAgfQotCi0gICAgLy8gLS0gRmFzdEluZm9zZXRTb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFzdEluZm9zZXRTb3VyY2UoU291cmNlIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gc291cmNlLmdldENsYXNzKCkgPT0gZmlGYXN0SW5mb3NldFNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNvdXJjZSBGYXN0SW5mb3NldFNvdXJjZV9uZXcoSW5wdXRTdHJlYW0gaXMpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChmaUZhc3RJbmZvc2V0U291cmNlX25ldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBGYXN0IEluZm9zZXQgaW1wbGVtZW50YXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFNvdXJjZSkgZmlGYXN0SW5mb3NldFNvdXJjZV9uZXcubmV3SW5zdGFuY2UoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gRmFzdEluZm9zZXRTb3VyY2VfZ2V0SW5wdXRTdHJlYW0oU291cmNlIHNvdXJjZSkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGZpRmFzdEluZm9zZXRTb3VyY2VfZ2V0SW5wdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBsb2NhdGUgRmFzdCBJbmZvc2V0IGltcGxlbWVudGF0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChJbnB1dFN0cmVhbSkgZmlGYXN0SW5mb3NldFNvdXJjZV9nZXRJbnB1dFN0cmVhbS5pbnZva2Uoc291cmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgRmFzdEluZm9zZXRTb3VyY2Vfc2V0SW5wdXRTdHJlYW0oU291cmNlIHNvdXJjZSwKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChmaUZhc3RJbmZvc2V0U291cmNlX3NldElucHV0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9jYXRlIEZhc3QgSW5mb3NldCBpbXBsZW1lbnRhdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGZpRmFzdEluZm9zZXRTb3VyY2Vfc2V0SW5wdXRTdHJlYW0uaW52b2tlKHNvdXJjZSwgaXMpOwotICAgIH0KLQotICAgIC8vIC0tIEZhc3RJbmZvc2V0UmVzdWx0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0UmVzdWx0KFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRDbGFzcygpID09IGZpRmFzdEluZm9zZXRSZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXN1bHQgRmFzdEluZm9zZXRSZXN1bHRfbmV3KE91dHB1dFN0cmVhbSBvcykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGZpRmFzdEluZm9zZXRSZXN1bHRfbmV3ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9jYXRlIEZhc3QgSW5mb3NldCBpbXBsZW1lbnRhdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoUmVzdWx0KSBmaUZhc3RJbmZvc2V0UmVzdWx0X25ldy5uZXdJbnN0YW5jZShvcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPdXRwdXRTdHJlYW0gRmFzdEluZm9zZXRSZXN1bHRfZ2V0T3V0cHV0U3RyZWFtKFJlc3VsdCByZXN1bHQpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChmaUZhc3RJbmZvc2V0UmVzdWx0X2dldE91dHB1dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBGYXN0IEluZm9zZXQgaW1wbGVtZW50YXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE91dHB1dFN0cmVhbSkgZmlGYXN0SW5mb3NldFJlc3VsdF9nZXRPdXRwdXRTdHJlYW0uaW52b2tlKHJlc3VsdCk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9GYXN0SW5mb3NldFV0aWwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvRmFzdEluZm9zZXRVdGlsLmphdmEKaW5kZXggN2M5NWEwOC4uMTE2NWI2YiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9GYXN0SW5mb3NldFV0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0Zhc3RJbmZvc2V0VXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDc4ICsyNSwzMSBAQAogCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFJlYWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRXhjZXB0aW9uOwogCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWouc29hcC5NZXNzYWdlSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwotCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5KQVhXU1Byb3BlcnRpZXMuQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiBwdWJsaWMgY2xhc3MgRmFzdEluZm9zZXRVdGlsIHsKIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0QWNjZXB0ZWQoU3RyaW5nW10gYWNjZXB0cykgewotICAgICAgICBpZiAoYWNjZXB0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBhY2NlcHQgOiBhY2NlcHRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmFzdEluZm9zZXRBY2NlcHRlZChhY2NlcHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBGSSBwYXJzZXIgYWxsb2NhdGVkIGZvciB0aGlzIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBjcmVhdGVGSVN0cmVhbVJlYWRlcihJbnB1dFN0cmVhbSBpbikgeworICAgICAgICAvLyBDaGVjayBpZiBjb21wYXRpYmxlIGltcGxlbWVudGF0aW9uIG9mIEZJIHdhcyBmb3VuZAorICAgICAgICBpZiAoRmFzdEluZm9zZXRSZWZsZWN0aW9uLmZpU3RBWERvY3VtZW50UGFyc2VyX25ldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWE1MUmVhZGVyRXhjZXB0aW9uKCJmYXN0aW5mb3NldC5ub0ltcGxlbWVudGF0aW9uIik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Zhc3RJbmZvc2V0QWNjZXB0ZWQoU3RyaW5nIGFjY2VwdCkgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFjY2VwdCwgIiwiKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKHRva2VuLmVxdWFsc0lnbm9yZUNhc2UoImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmFzdEluZm9zZXRGcm9tQWNjZXB0KExpc3Q8U3RyaW5nPiBhY2NlcHRzKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFjY2VwdCA6IGFjY2VwdHMpIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYWNjZXB0LCAiLCIpOwotICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZSgiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuLmVxdWFsc0lnbm9yZUNhc2UoImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXQiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNjb2RlWE1MU3RyaW5nVG9GSShTdHJpbmcgeG1sLCBPdXRwdXRTdHJlYW0gb3V0KSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYbWxVdGlsLm5ld1RyYW5zZm9ybWVyKCkudHJhbnNmb3JtKAotICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1Tb3VyY2UobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHhtbCkpLAotICAgICAgICAgICAgICAgIEZhc3RJbmZvc2V0UmVmbGVjdGlvbi5GYXN0SW5mb3NldFJlc3VsdF9uZXcob3V0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVDb3JyZWN0RW5jb2RpbmcoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UpCi0gICAgewotICAgICAgICBTdHJpbmcgY29ubmVnID0gKFN0cmluZykgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWSk7Ci0gICAgICAgIGlmIChjb25uZWcgPT0gIm9wdGltaXN0aWMiKSB7Ci0gICAgICAgICAgICAoKE1lc3NhZ2VJbXBsKSBtZXNzYWdlKS5zZXRJc0Zhc3RJbmZvc2V0KHRydWUpOworICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBTdEFYIHBsdWdnYWJsZSBsYXllciBmb3IgRkkKKyAgICAgICAgICAgIE9iamVjdCBzZHAgPSBGYXN0SW5mb3NldFJlZmxlY3Rpb24uZmlTdEFYRG9jdW1lbnRQYXJzZXJfbmV3Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBGYXN0SW5mb3NldFJlZmxlY3Rpb24uZmlTdEFYRG9jdW1lbnRQYXJzZXJfc2V0U3RyaW5nSW50ZXJuaW5nLmludm9rZShzZHAsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICBGYXN0SW5mb3NldFJlZmxlY3Rpb24uZmlTdEFYRG9jdW1lbnRQYXJzZXJfc2V0SW5wdXRTdHJlYW0uaW52b2tlKHNkcCwgaW4pOworICAgICAgICAgICAgcmV0dXJuIChYTUxTdHJlYW1SZWFkZXIpIHNkcDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1SZWFkZXJFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvSGFuZGxlckFubm90YXRpb25JbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0hhbmRsZXJBbm5vdGF0aW9uSW5mby5qYXZhCmluZGV4IDE2N2JmZDkuLjVjMDI2YTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvSGFuZGxlckFubm90YXRpb25JbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9IYW5kbGVyQW5ub3RhdGlvbkluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0hhbmRsZXJBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0hhbmRsZXJBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEKaW5kZXggOGI3MWYwYy4uZWE3ZTEwOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9IYW5kbGVyQW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvSGFuZGxlckFubm90YXRpb25Qcm9jZXNzb3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNCwxNCArMjQsMTggQEAKICAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsOwogCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkFzeW5jUHJvdmlkZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmhhbmRsZXIuSGFuZGxlckNoYWluc01vZGVsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5FbmRwb2ludEZhY3Rvcnk7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlclV0aWw7CiAKIGltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOwogaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwogaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBNZXNzYWdlSGFuZGxlcnM7CiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7CiBpbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7CkBAIC01Miw5ICs1Niw3IEBACiAgKiBTbyB0aGlzIGNsYXNzIGlzIHVzZWQgZm9yIGFsbCBoYW5kbGVyIHhtbCBpbmZvcm1hdGlvbi4gVGhlCiAgKiB0d28gcHVibGljIGVudHJ5IHBvaW50cyBhcmUKICAqIHtAbGluayBIYW5kbGVyQW5ub3RhdGlvblByb2Nlc3NvciNidWlsZEhhbmRsZXJJbmZvfSwgY2FsbGVkCi0gKiB3aGVuIHlvdSBoYXZlIGFuIGFubm90YXRlZCBjbGFzcyB0aGF0IHBvaW50cyB0byBhIGZpbGUsIGFuZAotICoge0BsaW5rIEhhbmRsZXJBbm5vdGF0aW9uUHJvY2Vzc29yI3BhcnNlSGFuZGxlckZpbGV9LCBjYWxsZWQKLSAqIHdoZW4gdGhlIGZpbGUgcmVhZGVyIGFscmVhZHkgZXhpc3RzLgorICogd2hlbiB5b3UgaGF2ZSBhbiBhbm5vdGF0ZWQgY2xhc3MgdGhhdCBwb2ludHMgdG8gYSBmaWxlLgogICoKICAqIDxwPlRoZSBtZXRob2RzIGluIHRoZSBjbGFzcyBhcmUgc3RhdGljIHNvIHRoYXQgaXQgbWF5IGNhbGxlZAogICogZnJvbSB0aGUgcnVudGltZSBzdGF0aWNhbGx5LgpAQCAtNzAsOCArNzIsNyBAQAogCiAgICAgLyoqCiAgICAgICogPHA+VGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5Ci0gICAgICoge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmNsaWVudC5TZXJ2aWNlQ29udGV4dEJ1aWxkZXJ9IGFuZAotICAgICAqIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUVuZHBvaW50SW5mb30gd2hlbgorICAgICAqIHtAbGluayBFbmRwb2ludEZhY3Rvcnl9IHdoZW4KICAgICAgKiB0aGV5IGhhdmUgYW4gYW5ub3RhdGVkIGNsYXNzLgogICAgICAqCiAgICAgICogPHA+SWYgdGhlcmUgaXMgbm8gaGFuZGxlciBjaGFpbiBhbm5vdGF0aW9uIG9uIHRoZSBjbGFzcywKQEAgLTgzLDE3ICs4NCwxNyBAQAogICAgICAqIGhhbmRsZXJzIGFuZCByb2xlcy4gV2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgY2xhc3MgcGFzc2VkCiAgICAgICogaW4gaGFzIG5vIGhhbmRsZXIgY2hhaW4gYW5ub3RhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEhhbmRsZXJBbm5vdGF0aW9uSW5mbyBidWlsZEhhbmRsZXJJbmZvKENsYXNzIGNsYXp6LAotICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydE5hbWUsIFN0cmluZyBiaW5kaW5nSWQpIHsKKyAgICBwdWJsaWMgc3RhdGljIEhhbmRsZXJBbm5vdGF0aW9uSW5mbyBidWlsZEhhbmRsZXJJbmZvKAorICAgICAgICBDbGFzczw/PiBjbGF6eiwgUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnROYW1lLCBXU0JpbmRpbmcgYmluZGluZykgewogCiAvLyAgICAgICAgY2xhenogPSBjaGVja0NsYXNzKGNsYXp6KTsKICAgICAgICAgSGFuZGxlckNoYWluIGhhbmRsZXJDaGFpbiA9Ci0gICAgICAgICAgICAoSGFuZGxlckNoYWluKSBjbGF6ei5nZXRBbm5vdGF0aW9uKEhhbmRsZXJDaGFpbi5jbGFzcyk7CisgICAgICAgICAgICBjbGF6ei5nZXRBbm5vdGF0aW9uKEhhbmRsZXJDaGFpbi5jbGFzcyk7CiAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW4gPT0gbnVsbCkgewogICAgICAgICAgICAgY2xhenogPSBnZXRTRUkoY2xhenopOwogICAgICAgICAgICAgaWYgKGNsYXp6ICE9IG51bGwpCiAgICAgICAgICAgICBoYW5kbGVyQ2hhaW4gPQotICAgICAgICAgICAgICAgIChIYW5kbGVyQ2hhaW4pIGNsYXp6LmdldEFubm90YXRpb24oSGFuZGxlckNoYWluLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjbGF6ei5nZXRBbm5vdGF0aW9uKEhhbmRsZXJDaGFpbi5jbGFzcyk7CiAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluID09IG51bGwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KQEAgLTEwNCwyNSArMTA1LDQ3IEBACiAgICAgICAgIH0KICAgICAgICAgSW5wdXRTdHJlYW0gaVN0cmVhbSA9IGdldEZpbGVBc1N0cmVhbShjbGF6eiwgaGFuZGxlckNoYWluKTsKICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpU3RyZWFtLCB0cnVlKTsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkuY3JlYXRlKG51bGwsaVN0cmVhbSwgdHJ1ZSk7CiAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7Ci0gICAgICAgIHJldHVybiBIYW5kbGVyQ2hhaW5zTW9kZWwucGFyc2VIYW5kbGVyRmlsZShyZWFkZXIsIGNsYXp6LmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSwgcG9ydE5hbWUsIGJpbmRpbmdJZCk7CisgICAgICAgIEhhbmRsZXJBbm5vdGF0aW9uSW5mbyBoYW5kbGVyQW5uSW5mbyA9IEhhbmRsZXJDaGFpbnNNb2RlbC5wYXJzZUhhbmRsZXJGaWxlKHJlYWRlciwgY2xhenouZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSwgYmluZGluZyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIGlTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXRpbEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXRpbEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhbmRsZXJBbm5JbmZvOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgSGFuZGxlckNoYWluc01vZGVsIGJ1aWxkSGFuZGxlckNoYWluc01vZGVsKGZpbmFsIENsYXNzIGNsYXp6KSB7CisgICAgcHVibGljIHN0YXRpYyBIYW5kbGVyQ2hhaW5zTW9kZWwgYnVpbGRIYW5kbGVyQ2hhaW5zTW9kZWwoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKICAgICAgICAgaWYoY2xhenogPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgSGFuZGxlckNoYWluIGhhbmRsZXJDaGFpbiA9Ci0gICAgICAgICAgICAoSGFuZGxlckNoYWluKSBjbGF6ei5nZXRBbm5vdGF0aW9uKEhhbmRsZXJDaGFpbi5jbGFzcyk7CisgICAgICAgICAgICBjbGF6ei5nZXRBbm5vdGF0aW9uKEhhbmRsZXJDaGFpbi5jbGFzcyk7CiAgICAgICAgIGlmKGhhbmRsZXJDaGFpbiA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIElucHV0U3RyZWFtIGlTdHJlYW0gPSBnZXRGaWxlQXNTdHJlYW0oY2xhenosIGhhbmRsZXJDaGFpbik7CiAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaVN0cmVhbSwgdHJ1ZSk7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZShudWxsLGlTdHJlYW0sIHRydWUpOwogICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotICAgICAgICByZXR1cm4gSGFuZGxlckNoYWluc01vZGVsLnBhcnNlSGFuZGxlckNvbmZpZ0ZpbGUoY2xhenosIHJlYWRlcik7CisgICAgICAgIEhhbmRsZXJDaGFpbnNNb2RlbCBoYW5kbGVyQ2hhaW5zTW9kZWwgPSBIYW5kbGVyQ2hhaW5zTW9kZWwucGFyc2VIYW5kbGVyQ29uZmlnRmlsZShjbGF6eiwgcmVhZGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgaVN0cmVhbS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBVdGlsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBVdGlsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluc01vZGVsOwogICAgIH0KIAogICAgIHN0YXRpYyBDbGFzcyBnZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7CkBAIC0xMzEsMTIgKzE1NCwxMiBAQAogICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFV0aWxFeGNlcHRpb24oInV0aWwuaGFuZGxlci5jbGFzcy5ub3QuZm91bmQiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y2xhc3NOYW1lfSk7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXRpYyBDbGFzcyBnZXRTRUkoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgaWYgKFByb3ZpZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgc3RhdGljIENsYXNzIGdldFNFSShDbGFzczw/PiBjbGF6eikgeworICAgICAgICBpZiAoUHJvdmlkZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikgfHwgQXN5bmNQcm92aWRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewogICAgICAgICAgICAgLy9ObyBTRUkgZm9yIFByb3ZpZGVyIEltcGxlbWVudGF0aW9uCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQpAQCAtMTQ2LDI1ICsxNjksMjQgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoIWNsYXp6LmlzQW5ub3RhdGlvblByZXNlbnQoV2ViU2VydmljZS5jbGFzcykpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBVdGlsRXhjZXB0aW9uKCJ1dGlsLmhhbmRsZXIubm8ud2Vic2VydmljZS5hbm5vdGF0aW9uIiwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NsYXp6LmdldENhbm9uaWNhbE5hbWUoKX0pOworICAgICAgICAgICAgICAgIGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgPQotICAgICAgICAgICAgKFdlYlNlcnZpY2UpIGNsYXp6LmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7CisgICAgICAgIFdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGNsYXp6LmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7CiAKICAgICAgICAgU3RyaW5nIGVpID0gd2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpOwogICAgICAgICBpZiAoZWkubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICBjbGF6eiA9IGdldENsYXNzKHdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UoKSk7CiAgICAgICAgICAgICBpZiAoIWNsYXp6LmlzQW5ub3RhdGlvblByZXNlbnQoV2ViU2VydmljZS5jbGFzcykpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXRpbEV4Y2VwdGlvbigidXRpbC5oYW5kbGVyLmVuZHBvaW50LmludGVyZmFjZS5uby53ZWJzZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7d2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpfSk7CisgICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gY2xheno7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgc3RhdGljIElucHV0U3RyZWFtIGdldEZpbGVBc1N0cmVhbShDbGFzcyBjbGF6eiwgSGFuZGxlckNoYWluIGNoYWluKSB7CisgICBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0RmlsZUFzU3RyZWFtKENsYXNzIGNsYXp6LCBIYW5kbGVyQ2hhaW4gY2hhaW4pIHsKICAgICAgICAgVVJMIHVybCA9IGNsYXp6LmdldFJlc291cmNlKGNoYWluLmZpbGUoKSk7CiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICAgICAgICAgdXJsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS4KQEAgLTE3OSwxNSArMjAxLDEzIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVXRpbEV4Y2VwdGlvbigidXRpbC5mYWlsZWQudG8uZmluZC5oYW5kbGVyY2hhaW4uZmlsZSIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjbGF6ei5nZXROYW1lKCksIGNoYWluLmZpbGUoKX0pOworICAgICAgICAgICAgICAgIGNsYXp6LmdldE5hbWUoKSwgY2hhaW4uZmlsZSgpKTsKICAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIHVybC5vcGVuU3RyZWFtKCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBVdGlsRXhjZXB0aW9uKCJ1dGlsLmZhaWxlZC50by5wYXJzZS5oYW5kbGVyY2hhaW4uZmlsZSIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjbGF6ei5nZXROYW1lKCksIGNoYWluLmZpbGUoKX0pOworICAgICAgICAgICAgICAgIGNsYXp6LmdldE5hbWUoKSwgY2hhaW4uZmlsZSgpKTsKICAgICAgICAgfQogICAgIH0KLQotCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL0pBWFdTVXRpbHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvSkFYV1NVdGlscy5qYXZhCmluZGV4IGE0ZTJhMWQuLjc3YWJjY2IgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvSkFYV1NVdGlscy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvSkFYV1NVdGlscy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvTWVzc2FnZUluZm9VdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL01lc3NhZ2VJbmZvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDM2ZGY5Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvTWVzc2FnZUluZm9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuYXBpLkJyaWRnZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuY2xpZW50LkJpbmRpbmdQcm92aWRlclByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2RpbmcuSkFYV1NBdHRhY2htZW50TWFyc2hhbGxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLlNPQVBEZWNvZGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuaW50ZXJuYWwuSGVhZGVyQmxvY2s7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5DYWxsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuaGFuZGxlci5IYW5kbGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5wZXB0LmVwdC5NZXNzYWdlSW5mbzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBXUyBSSSBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlSW5mb1V0aWwgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFJ1bnRpbWVDb250ZXh0KE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dCBydW50aW1lQ29udGV4dCkgewotICAgICAgICBtZXNzYWdlSW5mby5zZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX1JVTlRJTUVfQ09OVEVYVCwgcnVudGltZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUnVudGltZUNvbnRleHQgZ2V0UnVudGltZUNvbnRleHQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgcmV0dXJuIChSdW50aW1lQ29udGV4dCkgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5KQVhXU19SVU5USU1FX0NPTlRFWFQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgUnVudGltZUNvbnRleHQgcnRDdHh0ID0gZ2V0UnVudGltZUNvbnRleHQobWVzc2FnZUluZm8pOwotICAgICAgICBIYW5kbGVyQ29udGV4dCBoZEN0eHQgPSBudWxsOwotICAgICAgICBpZiAocnRDdHh0ICE9IG51bGwpCi0gICAgICAgICAgICBoZEN0eHQgPSBydEN0eHQuZ2V0SGFuZGxlckNvbnRleHQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGRDdHh0ID0gKEhhbmRsZXJDb250ZXh0KQotICAgICAgICAgICAgICAgIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKEJpbmRpbmdQcm92aWRlclByb3BlcnRpZXMuSkFYV1NfSEFORExFUl9DT05URVhUX1BST1BFUlRZKTsKLSAgICAgICAgcmV0dXJuIChoZEN0eHQgPT0gbnVsbCkgPyBudWxsIDogaGRDdHh0LmdldE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBIYW5kbGVyQ2hhaW5DYWxsZXIgZ2V0SGFuZGxlckNoYWluQ2FsbGVyKAotICAgICAgICBNZXNzYWdlSW5mbyBtZXNzYWdlSW5mbykgewotICAgICAgICByZXR1cm4gKEhhbmRsZXJDaGFpbkNhbGxlcikgbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIuSEFORExFUl9DSEFJTl9DQUxMRVIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW5DYWxsZXIoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5DYWxsZXIgY2FsbGVyKSB7Ci0gICAgICAgIG1lc3NhZ2VJbmZvLnNldE1ldGFEYXRhKEhhbmRsZXJDaGFpbkNhbGxlci5IQU5ETEVSX0NIQUlOX0NBTExFUiwKLSAgICAgICAgICAgIGNhbGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBKQVhXU0F0dGFjaG1lbnRNYXJzaGFsbGVyIGdldEF0dGFjaG1lbnRNYXJzaGFsbGVyKE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIE9iamVjdCBydGMgPSBtZXNzYWdlSW5mby5nZXRNZXRhRGF0YShCaW5kaW5nUHJvdmlkZXJQcm9wZXJ0aWVzLkpBWFdTX1JVTlRJTUVfQ09OVEVYVCk7Ci0gICAgICAgIGlmIChydGMgIT0gbnVsbCkgewotICAgICAgICAgICAgQnJpZGdlQ29udGV4dCBiYyA9ICgoUnVudGltZUNvbnRleHQpIHJ0YykuZ2V0QnJpZGdlQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKGJjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIpIGJjLmdldEF0dGFjaG1lbnRNYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgTWFyc2hhbGxlciBtID0gKE1hcnNoYWxsZXIpbWVzc2FnZUluZm8uZ2V0TWV0YURhdGEoQmluZGluZ1Byb3ZpZGVyUHJvcGVydGllcy5ESVNQQVRDSF9NQVJTSEFMTEVSKTsKLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEpBWFdTQXR0YWNobWVudE1hcnNoYWxsZXIpIG0uZ2V0QXR0YWNobWVudE1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Tm90VW5kZXJzdG9vZEhlYWRlcnMoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxIZWFkZXJCbG9jaz4gaGVhZGVycykgewotCi0gICAgICAgIG1lc3NhZ2VJbmZvLnNldE1ldGFEYXRhKFNPQVBEZWNvZGVyLk5PVF9VTkRFUlNUT09EX0hFQURFUlMsIGhlYWRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2V0PEhlYWRlckJsb2NrPiBnZXROb3RVbmRlcnN0b29kSGVhZGVycygKLSAgICAgICAgTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLQotICAgICAgICByZXR1cm4gKFNldDxIZWFkZXJCbG9jaz4pIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKAotICAgICAgICAgICAgU09BUERlY29kZXIuTk9UX1VOREVSU1RPT0RfSEVBREVSUyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9OYW1lc3BhY2VTdXBwb3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL05hbWVzcGFjZVN1cHBvcnQuamF2YQppbmRleCBiYjhkZTQ2Li40ZWI0NDU5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL05hbWVzcGFjZVN1cHBvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL05hbWVzcGFjZVN1cHBvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMDMsOCArMTAzLDggQEAKICAgICAvKioKICAgICAgKiBBbiBlbXB0eSBlbnVtZXJhdGlvbi4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBJdGVyYXRvciBFTVBUWV9FTlVNRVJBVElPTiA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3QoKS5pdGVyYXRvcigpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gRU1QVFlfRU5VTUVSQVRJT04gPQorICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ29uc3RydWN0b3IuCkBAIC0zNjcsNyArMzY3LDcgQEAKICAgICAgKiBAc2VlICNnZXREZWNsYXJlZFByZWZpeGVzCiAgICAgICogQHNlZSAjZ2V0VVJJCiAgICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFByZWZpeGVzKCkgeworICAgIHB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFByZWZpeGVzKCkgewogICAgICAgICByZXR1cm4gY3VycmVudENvbnRleHQuZ2V0UHJlZml4ZXMoKTsKICAgICB9CiAKQEAgLTQxNyw5ICs0MTcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVmaXhlcyhTdHJpbmcgdXJpKSB7CiAgICAgICAgIExpc3QgcHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGFsbFByZWZpeGVzID0gZ2V0UHJlZml4ZXMoKTsKLSAgICAgICAgd2hpbGUgKGFsbFByZWZpeGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGFsbFByZWZpeGVzLm5leHQoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJlZml4OiBnZXRQcmVmaXhlcygpKSB7CiAgICAgICAgICAgICBpZiAodXJpLmVxdWFscyhnZXRVUkkocHJlZml4KSkpIHsKICAgICAgICAgICAgICAgICBwcmVmaXhlcy5hZGQocHJlZml4KTsKICAgICAgICAgICAgIH0KQEAgLTQzOSw3ICs0MzcsNyBAQAogICAgICAqIEBzZWUgI2dldFByZWZpeGVzCiAgICAgICogQHNlZSAjZ2V0VVJJCiAgICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldERlY2xhcmVkUHJlZml4ZXMoKSB7CisgICAgcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RGVjbGFyZWRQcmVmaXhlcygpIHsKICAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0LmdldERlY2xhcmVkUHJlZml4ZXMoKTsKICAgICB9CiAKQEAgLTY3NCwxMSArNjcyLDExIEBACiAgICAgICAgICAqIEByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgcHJlZml4ZXMgKHBvc3NpYmx5IGVtcHR5KS4KICAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLk5hbWVzcGFjZVN1cHBvcnQjZ2V0RGVjbGFyZWRQcmVmaXhlcwogICAgICAgICAgKi8KLSAgICAgICAgSXRlcmF0b3IgZ2V0RGVjbGFyZWRQcmVmaXhlcygpIHsKKyAgICAgICAgSXRlcmFibGU8U3RyaW5nPiBnZXREZWNsYXJlZFByZWZpeGVzKCkgewogICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9ucyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0VOVU1FUkFUSU9OOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVjbGFyYXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uczsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02OTEsMTEgKzY4OSwxMSBAQAogICAgICAgICAgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIHByZWZpeGVzIChuZXZlciBlbXB0eSkuCiAgICAgICAgICAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5OYW1lc3BhY2VTdXBwb3J0I2dldFByZWZpeGVzCiAgICAgICAgICAqLwotICAgICAgICBJdGVyYXRvciBnZXRQcmVmaXhlcygpIHsKKyAgICAgICAgSXRlcmFibGU8U3RyaW5nPiBnZXRQcmVmaXhlcygpIHsKICAgICAgICAgICAgIGlmIChwcmVmaXhUYWJsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0VOVU1FUkFUSU9OOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4VGFibGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4VGFibGUua2V5U2V0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9Ob0Nsb3NlSW5wdXRTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvTm9DbG9zZUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2OTIwOQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvTm9DbG9zZUlucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiB7QGxpbmsgSW5wdXRTdHJlYW19IHRoYXQgY2Fubm90IGJlIGNsb3NlZC4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBjbGFzcyBOb0Nsb3NlSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7CisgICAgcHVibGljIE5vQ2xvc2VJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgeworICAgICAgICBzdXBlcihpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkuIHVzZSBjbG9zZUlucHV0KCkgdG8gY2xvc2UKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb0Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL05vQ2xvc2VPdXRwdXRTdHJlYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvTm9DbG9zZU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTM4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL05vQ2xvc2VPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICoge0BsaW5rIE91dHB1dFN0cmVhbX0gdGhhdCBjYW5ub3QgYmUgY2xvc2VkLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGNsYXNzIE5vQ2xvc2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0geworICAgIHB1YmxpYyBOb0Nsb3NlT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgc3VwZXIob3V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgbGVmdCBlbXB0eS4gdXNlIGNsb3NlT3V0cHV0KCkgdG8gY2xvc2UKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb0Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL051bGxJdGVyYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9OdWxsSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxYzViNi4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL051bGxJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIEl0ZXJhdG9yIG9uIGFuIGVtcHR5IGNvbGxlY3Rpb24uCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE51bGxJdGVyYXRvciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsSXRlcmF0b3IgX2luc3RhbmNlID0gbmV3IE51bGxJdGVyYXRvcigpOwotCi0gICAgcHJpdmF0ZSBOdWxsSXRlcmF0b3IoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvUG9vbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9Qb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1ZWM5OAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvUG9vbC5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZUNsb25lcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworCisvKioKKyAqIEdlbmVyYWwtcHVycG9zZSBvYmplY3QgcG9vbC4KKyAqCisgKiA8cD4KKyAqIEluIG1hbnkgcGFydHMgb2YgdGhlIHJ1bnRpbWUsIHdlIG5lZWQgdG8gcG9vbCBpbnN0YW5jZXMgb2Ygb2JqZWN0cyB0aGF0CisgKiBhcmUgZXhwZW5zaXZlIHRvIGNyZWF0ZSAoc3VjaCBhcyBKQVhCIG9iamVjdHMsIFN0QVggcGFyc2Vycywge0BsaW5rIFR1YmV9IGluc3RhbmNlcy4pCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBzdWNoIGEgcG9vbC4KKyAqCisgKiBUT0RPOiBpbXByb3ZlIHRoZSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFBvb2w8VD4geworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudExpbmtlZFF1ZXVlPFQ+IHF1ZXVlID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTxUPigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIG5ldyBvYmplY3QgZnJvbSB0aGUgcG9vbC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIG5vIG9iamVjdCBpcyBhdmFpbGFibGUgaW4gdGhlIHBvb2wsIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgb25lLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBUIHRha2UoKSB7CisgICAgICAgIFQgdCA9IHF1ZXVlLnBvbGwoKTsKKyAgICAgICAgaWYodD09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGUoKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBvYmplY3QgYmFjayB0byB0aGUgcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWN5Y2xlKFQgdCkgeworICAgICAgICBxdWV1ZS5vZmZlcih0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIG9iamVjdC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBzb21lb25lIHdhbnRzIHRvCisgICAgICoge0BsaW5rICN0YWtlKCkgdGFrZX0gYW4gb2JqZWN0IGZyb20gYW4gZW1wdHkgcG9vbC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEFsc28gbm90ZSB0aGF0IG11bHRpcGxlIHRocmVhZHMgbWF5IGNhbGwgdGhpcyBtZXRob2QKKyAgICAgKiBjb25jdXJyZW50bHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFQgY3JlYXRlKCk7CisKKworICAgIC8qKgorICAgICAqIEpBWEIge0BsaW5rIGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXJ9IHBvb2wuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNYXJzaGFsbGVyIGV4dGVuZHMgUG9vbDxqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSkFYQkNvbnRleHQgY29udGV4dDsKKworICAgICAgICBwdWJsaWMgTWFyc2hhbGxlcihKQVhCQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXIgY3JlYXRlKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpbXBvc3NpYmxlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSkFYQiB7QGxpbmsgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcn0gcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVubWFyc2hhbGxlciBleHRlbmRzIFBvb2w8amF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSkFYQkNvbnRleHQgY29udGV4dDsKKworICAgICAgICBwdWJsaWMgVW5tYXJzaGFsbGVyKEpBWEJDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyIGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7CisgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpbXBvc3NpYmxlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIFR1YmV9IHBvb2wuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUdWJlUG9vbCBleHRlbmRzIFBvb2w8VHViZT4geworICAgICAgICBwcml2YXRlIGZpbmFsIFR1YmUgbWFzdGVyOworCisgICAgICAgIHB1YmxpYyBUdWJlUG9vbChUdWJlIG1hc3RlcikgeworICAgICAgICAgICAgdGhpcy5tYXN0ZXIgPSBtYXN0ZXI7CisgICAgICAgICAgICByZWN5Y2xlKG1hc3Rlcik7ICAgIC8vIHdlJ2xsIHVzZSBtYXN0ZXIgYXMgYSBwYXJ0IG9mIHRoZSBwb29sLCB0b28uCisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVHViZSBjcmVhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gVHViZUNsb25lci5jbG9uZShtYXN0ZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9RTmFtZU1hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9RTmFtZU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWU3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1FOYW1lTWFwLmphdmEKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBNYXAga2V5ZWQgYnkge0BsaW5rIFFOYW1lfS4KKyAqCisgKiBUaGlzIHNwZWNpYWxpemVkIG1hcCBhbGxvd3MgYSBsb29rIHVwIG9wZXJhdGlvbiB3aXRob3V0IGNvbnN0cnVjdGluZworICogYSBuZXcgUU5hbWUgaW5zdGFuY2UsIGZvciBhIHBlcmZvcm1hbmNlIHJlYXNvbi4gVGhpcyB7QGxpbmsgTWFwfSBhc3N1bWVzCisgKiB0aGF0IGJvdGggbmFtZXNwYWNlIFVSSSBhbmQgbG9jYWwgbmFtZSBhcmUge0BsaW5rIFN0cmluZyNpbnRlcm4oKSBpbnRlcm59ZWQuCisgKgorICogQHNpbmNlIEpBWEIgMi4wCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBRTmFtZU1hcDxWPiB7CisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgaW5pdGlhbCBjYXBhY2l0eSAtIE1VU1QgYmUgYSBwb3dlciBvZiB0d28uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSA9IDE2OworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gY2FwYWNpdHksIHVzZWQgaWYgYSBoaWdoZXIgdmFsdWUgaXMgaW1wbGljaXRseSBzcGVjaWZpZWQKKyAgICAgKiBieSBlaXRoZXIgb2YgdGhlIGNvbnN0cnVjdG9ycyB3aXRoIGFyZ3VtZW50cy4KKyAgICAgKiBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvIDw9IDE8PDMwLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0YWJsZSwgcmVzaXplZCBhcyBuZWNlc3NhcnkuIExlbmd0aCBNVVNUIEFsd2F5cyBiZSBhIHBvd2VyIG9mIHR3by4KKyAgICAgKi8KKyAgICB0cmFuc2llbnQgRW50cnk8Vj5bXSB0YWJsZSA9IG5ldyBFbnRyeVtERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFldOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBrZXktdmFsdWUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgaWRlbnRpdHkgaGFzaCBtYXAuCisgICAgICovCisgICAgdHJhbnNpZW50IGludCBzaXplOworCisgICAgLyoqCisgICAgICogVGhlIG5leHQgc2l6ZSB2YWx1ZSBhdCB3aGljaCB0byByZXNpemUgLiBUYWtpbmcgaXQgYXMKKyAgICAgKiBNQVhJTVVNX0NBUEFDSVRZCisgICAgICogQHNlcmlhbAorICAgICAqLworICAgIHByaXZhdGUgaW50IHRocmVzaG9sZDsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2FkIGZhY3RvciB1c2VkIHdoZW4gbm9uZSBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3IuCisgICAgICoqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTE9BRF9GQUNUT1IgPSAwLjc1ZjsKKworCisKKyAgICAvKioKKyAgICAgKiBHaXZlcyBhbiBlbnRyeVNldCB2aWV3IG9mIHRoaXMgbWFwCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8RW50cnk8Vj4+IGVudHJ5U2V0ID0gbnVsbDsKKworICAgIHB1YmxpYyBRTmFtZU1hcCgpIHsKKyAgICAgICAgdGhyZXNob2xkID0gKGludCkoREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZICogREVGQVVMVF9MT0FEX0ZBQ1RPUik7CisgICAgICAgIHRhYmxlID0gbmV3IEVudHJ5W0RFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWV07CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleXMgaW4gdGhpcyBtYXAuCisgICAgICogSWYgdGhlIG1hcCBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yIHRoaXMga2V5LCB0aGUgb2xkCisgICAgICogdmFsdWUgaXMgcmVwbGFjZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIEZpcnN0IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmUgYXNzb2NpYXRlZC4KKyAgICAgKiBAcGFyYW0gbG9jYWxuYW1lIFNlY29uZCBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlIGFzc29jaWF0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgbmFtZXNwYWNlVXJpLFN0cmluZyBsb2NhbG5hbWUsIFYgdmFsdWUgKSB7CisgICAgICAgIC8va2V5cyBjYW5ub3QgYmUgbnVsbAorICAgICAgICBhc3NlcnQgbG9jYWxuYW1lICE9bnVsbDsKKyAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZVVyaSAhPW51bGw7CisKKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGxvY2FsbmFtZSk7CisgICAgICAgIGludCBpID0gaW5kZXhGb3IoaGFzaCwgdGFibGUubGVuZ3RoKTsKKworICAgICAgICBmb3IgKEVudHJ5PFY+IGUgPSB0YWJsZVtpXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7CisgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYgbG9jYWxuYW1lLmVxdWFscyhlLmxvY2FsTmFtZSkgJiYgbmFtZXNwYWNlVXJpLmVxdWFscyhlLm5zVXJpKSkgeworICAgICAgICAgICAgICAgIGUudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhZGRFbnRyeShoYXNoLCBuYW1lc3BhY2VVcmksbG9jYWxuYW1lLCB2YWx1ZSwgaSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXQoUU5hbWUgbmFtZSwgViB2YWx1ZSApIHsKKyAgICAgICAgcHV0KG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksbmFtZS5nZXRMb2NhbFBhcnQoKSx2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIHNwZWNpZmllZCBrZXlzIGFyZSBtYXBwZWQgaW4gdGhpcyBRTmFtZU1hcCwKKyAgICAgKiBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICBuc1VyaSB0aGUgbmFtZXNwYWNlVXJpIGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLgorICAgICAqIEBwYXJhbSAgIGxvY2FsUGFydCB0aGUgbG9jYWxQYXJ0IGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gIHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIG1hcCBtYXBzIHRoZSBzcGVjaWZpZWQgc2V0IG9mIGtleWEsIG9yCisgICAgICogICAgICAgICAgPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMgc2V0IG9mIGtleXMuCisgICAgICogQHNlZSAjcHV0KFN0cmluZyxTdHJpbmcsIE9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgViBnZXQoIFN0cmluZyBuc1VyaSwgU3RyaW5nIGxvY2FsUGFydCApIHsKKyAgICAgICAgRW50cnk8Vj4gZSA9IGdldEVudHJ5KG5zVXJpLGxvY2FsUGFydCk7CisgICAgICAgIGlmKGU9PW51bGwpIHJldHVybiBudWxsOworICAgICAgICBlbHNlICAgICAgICByZXR1cm4gZS52YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgViBnZXQoIFFOYW1lIG5hbWUgKSB7CisgICAgICAgIHJldHVybiBnZXQobmFtZS5nZXROYW1lc3BhY2VVUkkoKSxuYW1lLmdldExvY2FsUGFydCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cy12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBrZXlzLXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIGFsbCBvZiB0aGUgbWFwcGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcCB0byB0aGlzIG1hcAorICAgICAqIFRoZXNlIG1hcHBpbmdzIHdpbGwgcmVwbGFjZSBhbnkgbWFwcGluZ3MgdGhhdAorICAgICAqIHRoaXMgbWFwIGhhZCBmb3IgYW55IG9mIHRoZSBrZXlzIGN1cnJlbnRseSBpbiB0aGUgc3BlY2lmaWVkIG1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXAgbWFwcGluZ3MgdG8gYmUgc3RvcmVkIGluIHRoaXMgbWFwLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFFOYW1lTWFwPFY+IHB1dEFsbChRTmFtZU1hcDw/IGV4dGVuZHMgVj4gbWFwKSB7CisgICAgICAgIGludCBudW1LZXlzVG9CZUFkZGVkID0gbWFwLnNpemUoKTsKKyAgICAgICAgaWYgKG51bUtleXNUb0JlQWRkZWQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisKKyAgICAgICAgaWYgKG51bUtleXNUb0JlQWRkZWQgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgIGludCB0YXJnZXRDYXBhY2l0eSA9IG51bUtleXNUb0JlQWRkZWQ7CisgICAgICAgICAgICBpZiAodGFyZ2V0Q2FwYWNpdHkgPiBNQVhJTVVNX0NBUEFDSVRZKQorICAgICAgICAgICAgICAgIHRhcmdldENhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKKyAgICAgICAgICAgIGludCBuZXdDYXBhY2l0eSA9IHRhYmxlLmxlbmd0aDsKKyAgICAgICAgICAgIHdoaWxlIChuZXdDYXBhY2l0eSA8IHRhcmdldENhcGFjaXR5KQorICAgICAgICAgICAgICAgIG5ld0NhcGFjaXR5IDw8PSAxOworICAgICAgICAgICAgaWYgKG5ld0NhcGFjaXR5ID4gdGFibGUubGVuZ3RoKQorICAgICAgICAgICAgICAgIHJlc2l6ZShuZXdDYXBhY2l0eSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIEVudHJ5PD8gZXh0ZW5kcyBWPiBlIDogbWFwLmVudHJ5U2V0KCkgKQorICAgICAgICAgICAgcHV0KGUubnNVcmksZS5sb2NhbE5hbWUsZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lTWFwPFY+IHB1dEFsbChNYXA8UU5hbWUsPyBleHRlbmRzIFY+IG1hcCkgeworICAgICAgICBmb3IgKE1hcC5FbnRyeTxRTmFtZSwgPyBleHRlbmRzIFY+IGUgOiBtYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgUU5hbWUgcW4gPSBlLmdldEtleSgpOworICAgICAgICAgICAgcHV0KHFuLmdldE5hbWVzcGFjZVVSSSgpLHFuLmdldExvY2FsUGFydCgpLGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuVGhlIGhhc2ggdmFsdWUgaXMgY29tcHV0ZWQKKyAgICAgKiBmb3IgdGhlIGxvY2FsTmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFzaChTdHJpbmcgeCkgeworICAgICAgICBpbnQgaCA9IHguaGFzaENvZGUoKTsKKworICAgICAgICBoICs9IH4oaCA8PCA5KTsKKyAgICAgICAgaCBePSAgKGggPj4+IDE0KTsKKyAgICAgICAgaCArPSAgKGggPDwgNCk7CisgICAgICAgIGggXj0gIChoID4+PiAxMCk7CisgICAgICAgIHJldHVybiBoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5kZXggZm9yIGhhc2ggY29kZSBoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBpbmRleEZvcihpbnQgaCwgaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gaCAmIChsZW5ndGgtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBrZXlzLCB2YWx1ZSBhbmQgaGFzaCBjb2RlIHRvCisgICAgICogdGhlIHNwZWNpZmllZCBidWNrZXQuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcworICAgICAqIG1ldGhvZCB0byByZXNpemUgdGhlIHRhYmxlIGlmIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEVudHJ5KGludCBoYXNoLCBTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUsIFYgdmFsdWUsIGludCBidWNrZXRJbmRleCkgeworICAgICAgICBFbnRyeTxWPiBlID0gdGFibGVbYnVja2V0SW5kZXhdOworICAgICAgICB0YWJsZVtidWNrZXRJbmRleF0gPSBuZXcgRW50cnk8Vj4oaGFzaCwgbnNVcmksIGxvY2FsTmFtZSwgdmFsdWUsIGUpOworICAgICAgICBpZiAoc2l6ZSsrID49IHRocmVzaG9sZCkKKyAgICAgICAgICAgIHJlc2l6ZSgyICogdGFibGUubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlaGFzaGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIG1hcCBpbnRvIGEgbmV3IGFycmF5IHdpdGggYQorICAgICAqIGxhcmdlciBjYXBhY2l0eS4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlCisgICAgICogbnVtYmVyIG9mIGtleXMgaW4gdGhpcyBtYXAgcmVhY2hlcyBpdHMgdGhyZXNob2xkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNpemUoaW50IG5ld0NhcGFjaXR5KSB7CisgICAgICAgIEVudHJ5W10gb2xkVGFibGUgPSB0YWJsZTsKKyAgICAgICAgaW50IG9sZENhcGFjaXR5ID0gb2xkVGFibGUubGVuZ3RoOworICAgICAgICBpZiAob2xkQ2FwYWNpdHkgPT0gTUFYSU1VTV9DQVBBQ0lUWSkgeworICAgICAgICAgICAgdGhyZXNob2xkID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBFbnRyeVtdIG5ld1RhYmxlID0gbmV3IEVudHJ5W25ld0NhcGFjaXR5XTsKKyAgICAgICAgdHJhbnNmZXIobmV3VGFibGUpOworICAgICAgICB0YWJsZSA9IG5ld1RhYmxlOworICAgICAgICB0aHJlc2hvbGQgPSBuZXdDYXBhY2l0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlciBhbGwgZW50cmllcyBmcm9tIGN1cnJlbnQgdGFibGUgdG8gbmV3VGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRyYW5zZmVyKEVudHJ5PFY+W10gbmV3VGFibGUpIHsKKyAgICAgICAgRW50cnk8Vj5bXSBzcmMgPSB0YWJsZTsKKyAgICAgICAgaW50IG5ld0NhcGFjaXR5ID0gbmV3VGFibGUubGVuZ3RoOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNyYy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgRW50cnk8Vj4gZSA9IHNyY1tqXTsKKyAgICAgICAgICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzcmNbal0gPSBudWxsOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgRW50cnk8Vj4gbmV4dCA9IGUubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBpbmRleEZvcihlLmhhc2gsIG5ld0NhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gbmV3VGFibGVbaV07CisgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlW2ldID0gZTsKKyAgICAgICAgICAgICAgICAgICAgZSA9IG5leHQ7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoZSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgb25lIHJhbmRvbSBpdGVtIGluIHRoZSBtYXAuCisgICAgICogSWYgdGhpcyBtYXAgaXMgZW1wdHksIHJldHVybiBudWxsLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIG9idGFpbiB0aGUgdmFsdWUgZnJvbSBhIG1hcCB0aGF0IG9ubHkgY29udGFpbnMgb25lIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIEVudHJ5PFY+IGdldE9uZSgpIHsKKyAgICAgICAgZm9yKCBFbnRyeTxWPiBlIDogdGFibGUgKSB7CisgICAgICAgICAgICBpZihlIT1udWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFFOYW1lPiBrZXlTZXQoKSB7CisgICAgICAgIFNldDxRTmFtZT4gciA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOworICAgICAgICBmb3IgKEVudHJ5PFY+IGUgOiBlbnRyeVNldCgpKSB7CisgICAgICAgICAgICByLmFkZChlLmNyZWF0ZVFOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYWJsZTxWPiB2YWx1ZXMoKSB7CisgICAgICAgIHJldHVybiB2aWV3czsKKyAgICB9CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBJdGVyYWJsZTxWPiB2aWV3cyA9IG5ldyBJdGVyYWJsZTxWPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFY+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUl0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBIYXNoSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CisgICAgICAgIEVudHJ5PFY+IG5leHQ7ICAvLyBuZXh0IGVudHJ5IHRvIHJldHVybgorICAgICAgICBpbnQgaW5kZXg7ICAgICAgICAgICAgICAvLyBjdXJyZW50IHNsb3QKKworICAgICAgICBIYXNoSXRlcmF0b3IoKSB7CisgICAgICAgICAgICBFbnRyeTxWPltdIHQgPSB0YWJsZTsKKyAgICAgICAgICAgIGludCBpID0gdC5sZW5ndGg7CisgICAgICAgICAgICBFbnRyeTxWPiBuID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChzaXplICE9IDApIHsgLy8gYWR2YW5jZSB0byBmaXJzdCBlbnRyeQorICAgICAgICAgICAgICAgIHdoaWxlIChpID4gMCAmJiAobiA9IHRbLS1pXSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCA9IG47CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEVudHJ5PFY+IG5leHRFbnRyeSgpIHsKKyAgICAgICAgICAgIEVudHJ5PFY+IGUgPSBuZXh0OworICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBFbnRyeTxWPiBuID0gZS5uZXh0OworICAgICAgICAgICAgRW50cnk8Vj5bXSB0ID0gdGFibGU7CisgICAgICAgICAgICBpbnQgaSA9IGluZGV4OworICAgICAgICAgICAgd2hpbGUgKG4gPT0gbnVsbCAmJiBpID4gMCkKKyAgICAgICAgICAgICAgICBuID0gdFstLWldOworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgbmV4dCA9IG47CisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBWYWx1ZUl0ZXJhdG9yIGV4dGVuZHMgSGFzaEl0ZXJhdG9yPFY+IHsKKyAgICAgICAgcHVibGljIFYgbmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RW50cnkoKS52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KFN0cmluZyBuc1VyaSxTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRFbnRyeShuc1VyaSxsb2NhbE5hbWUpIT1udWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWFwIGlzIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBzaXplID09IDA7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVudHJ5PFY+ICB7CisgICAgICAgIC8qKiBUaGUgbmFtZXNwYWNlIFVSSS4gKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuc1VyaTsKKworICAgICAgICAvKiogVGhlIGxvY2FsUGFydC4gKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsb2NhbE5hbWU7CisKKyAgICAgICAgViB2YWx1ZTsKKyAgICAgICAgZmluYWwgaW50IGhhc2g7CisgICAgICAgIEVudHJ5PFY+IG5leHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgZW50cnkuCisgICAgICAgICAqLworICAgICAgICBFbnRyeShpbnQgaCwgU3RyaW5nIG5zVXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBWIHYsIEVudHJ5PFY+IG4pIHsKKyAgICAgICAgICAgIHZhbHVlID0gdjsKKyAgICAgICAgICAgIG5leHQgPSBuOworICAgICAgICAgICAgdGhpcy5uc1VyaSA9IG5zVXJpOworICAgICAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgICAgICBoYXNoID0gaDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IFFOYW1lIG9iamVjdCBmcm9tIHtAbGluayAjbnNVcml9IGFuZCB7QGxpbmsgI2xvY2FsTmFtZX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKG5zVXJpLGxvY2FsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgViBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWIHNldFZhbHVlKFYgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgIFYgb2xkVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7CisgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFbnRyeSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgRW50cnkgZSA9IChFbnRyeSlvOworICAgICAgICAgICAgU3RyaW5nIGsxID0gbnNVcmk7CisgICAgICAgICAgICBTdHJpbmcgazIgPSBlLm5zVXJpOworICAgICAgICAgICAgU3RyaW5nIGszID0gbG9jYWxOYW1lOworICAgICAgICAgICAgU3RyaW5nIGs0ID0gZS5sb2NhbE5hbWU7CisgICAgICAgICAgICBpZiAoazEuZXF1YWxzKGsyKSAmJiBrMy5lcXVhbHMoazQpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHYxID0gZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdjIgPSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHYxID09IHYyIHx8ICh2MSAhPSBudWxsICYmIHYxLmVxdWFscyh2MikpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKCBsb2NhbE5hbWUuaGFzaENvZGUoKSkgXgorICAgICAgICAgICAgICAgICAgICAodmFsdWU9PW51bGwgICA/IDAgOiB2YWx1ZS5oYXNoQ29kZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gJyInK25zVXJpICsiXCIsXCIiICtsb2NhbE5hbWUgKyAiXCI9IiArIGdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PEVudHJ5PFY+PiBlbnRyeVNldCgpIHsKKyAgICAgICAgU2V0PEVudHJ5PFY+PiBlcyA9IGVudHJ5U2V0OworICAgICAgICByZXR1cm4gZXMgIT0gbnVsbCA/IGVzIDogKGVudHJ5U2V0ID0gbmV3IEVudHJ5U2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgSXRlcmF0b3I8RW50cnk8Vj4+IG5ld0VudHJ5SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcigpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRW50cnlJdGVyYXRvciBleHRlbmRzIEhhc2hJdGVyYXRvcjxFbnRyeTxWPj4geworICAgICAgICBwdWJsaWMgRW50cnk8Vj4gbmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RW50cnkoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIGNsYXNzIEVudHJ5U2V0IGV4dGVuZHMgQWJzdHJhY3RTZXQ8RW50cnk8Vj4+IHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPEVudHJ5PFY+PiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdFbnRyeUl0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFbnRyeSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgRW50cnk8Vj4gZSA9IChFbnRyeTxWPikgbzsKKyAgICAgICAgICAgIEVudHJ5PFY+IGNhbmRpZGF0ZSA9IGdldEVudHJ5KGUubnNVcmksZS5sb2NhbE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPSBudWxsICYmIGNhbmRpZGF0ZS5lcXVhbHMoZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRW50cnk8Vj4gZ2V0RW50cnkoU3RyaW5nIG5zVXJpLFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGxvY2FsTmFtZSk7CisgICAgICAgIGludCBpID0gaW5kZXhGb3IoaGFzaCwgdGFibGUubGVuZ3RoKTsKKyAgICAgICAgRW50cnk8Vj4gZSA9IHRhYmxlW2ldOworICAgICAgICB3aGlsZSAoZSAhPSBudWxsICYmICEobG9jYWxOYW1lLmVxdWFscyhlLmxvY2FsTmFtZSkgJiYgbnNVcmkuZXF1YWxzKGUubnNVcmkpKSkKKyAgICAgICAgICAgIGUgPSBlLm5leHQ7CisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgneycpOworCisgICAgICAgIGZvciggRW50cnk8Vj4gZSA6IGVudHJ5U2V0KCkgKSB7CisgICAgICAgICAgICBpZihidWYubGVuZ3RoKCk+MSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisgICAgICAgICAgICBidWYuYXBwZW5kKGUpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnXScpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9SZWFkT25seVByb3BlcnR5RXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1JlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWYyMWQyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9SZWFkT25seVByb3BlcnR5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuUHJvcGVydHlTZXQ7CisKKy8qKgorICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHtAbGluayBQcm9wZXJ0eVNldCNwdXQoU3RyaW5nLCBPYmplY3QpfSBmYWlsZWQKKyAqIGJlY2F1c2UgYSBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgUmVhZE9ubHlQcm9wZXJ0eUV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lOworCisgICAgcHVibGljIFJlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24oU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICBzdXBlcihwcm9wZXJ0eU5hbWUrIiBpcyBhIHJlYWQtb25seSBwcm9wZXJ0eS4iKTsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3YXMgcmVhZC1vbmx5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvUnVudGltZVZlcnNpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvUnVudGltZVZlcnNpb24uamF2YQppbmRleCAzOGI0N2ZmLi44NGZlZWU5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1J1bnRpbWVWZXJzaW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9SdW50aW1lVmVyc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvU09BUENvbm5lY3Rpb25VdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1NPQVBDb25uZWN0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI4MDFiLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvU09BUENvbm5lY3Rpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucGVwdC5lcHQuTWVzc2FnZUluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwubWVzc2FnaW5nLnNhYWoudXRpbC5CeXRlSW5wdXRTdHJlYW07Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYmluZGluZy5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zZXJ2ZXIuUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlJ1bnRpbWVFbmRwb2ludEluZm87Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuSkFYV1NQcm9wZXJ0aWVzLkNPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFk7Ci0KLS8qKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQ29ubmVjdGlvblV0aWwgewotCi0gICAgcHVibGljIHN0YXRpYyBTT0FQTWVzc2FnZSBnZXRTT0FQTWVzc2FnZShXU0Nvbm5lY3Rpb24gY29uLCBNZXNzYWdlSW5mbyBtaSwgU3RyaW5nIGJpbmRpbmdJZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gY29uLmdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgIE1pbWVIZWFkZXJzIG1oID0gbmV3IE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWguYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGEgbWltZSBoZWFkZXIuIElnbm9yZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0IHJ0Q3R4dCA9IE1lc3NhZ2VJbmZvVXRpbC5nZXRSdW50aW1lQ29udGV4dChtaSk7Ci0gICAgICAgICAgICBpZiAocnRDdHh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBSdW50aW1lRW5kcG9pbnRJbmZvIGVuZHBvaW50SW5mbyA9IHJ0Q3R4dC5nZXRSdW50aW1lRW5kcG9pbnRJbmZvKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSWQgPSAoKEJpbmRpbmdJbXBsKSBlbmRwb2ludEluZm8uZ2V0QmluZGluZygpKS5nZXRCaW5kaW5nSWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gU09BUFV0aWwuY3JlYXRlTWVzc2FnZShtaCwKLSAgICAgICAgICAgICAgICBjb24uZ2V0SW5wdXQoKSwgYmluZGluZ0lkKTsKLSAgICAgICAgICAgIHJldHVybiBzb2FwTWVzc2FnZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kKFdTQ29ubmVjdGlvbiBjb24sIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc29hcE1lc3NhZ2Uuc2F2ZVJlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgICAgICBNaW1lSGVhZGVycyBtaHMgPSBzb2FwTWVzc2FnZS5nZXRNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IG1ocy5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNaW1lSGVhZGVyIG1oID0gKE1pbWVIZWFkZXIpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWguZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBoZWFkZXJzLmdldChuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0KG5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQobWguZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb24uc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICAgICAgICAgIHNvYXBNZXNzYWdlLndyaXRlVG8oY29uLmdldE91dHB1dCgpKTsKLSAgICAgICAgICAgIGNvbi5jbG9zZU91dHB1dCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFJlc3BvbnNlKFdTQ29ubmVjdGlvbiBjb24sIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlKSB7Ci0gICAgICAgIC8vc2V0U3RhdHVzKGNvbiwgV1NDb25uZWN0aW9uLk9LKTsKLSAgICAgICAgc2VuZChjb24sIHNvYXBNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEtub3duRXJyb3IoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8sIGludCBzdGF0dXMpIHsKLSAgICAgICAgV1NDb25uZWN0aW9uIGNvbiA9IChXU0Nvbm5lY3Rpb24pbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICBzZXRTdGF0dXMoY29uLCBzdGF0dXMpOwotICAgICAgICBjb24uZ2V0T3V0cHV0KCk7Ci0gICAgICAgIGNvbi5jbG9zZU91dHB1dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kUmVzcG9uc2VPbmV3YXkoTWVzc2FnZUluZm8gbWVzc2FnZUluZm8pIHsKLSAgICAgICAgV1NDb25uZWN0aW9uIGNvbiA9IChXU0Nvbm5lY3Rpb24pbWVzc2FnZUluZm8uZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICBzZXRTdGF0dXMoY29uLCBXU0Nvbm5lY3Rpb24uT05FV0FZKTsKLSAgICAgICAgY29uLmdldE91dHB1dCgpOwotCi0gICAgICAgIC8vIEVuc3VyZSBjb25uZWcgaXMgY29tcGxldGVkIGV2ZW4gaWYgbm8gZGF0YSBpcyBzZW50IGJhY2sKLSAgICAgICAgaWYgKG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFkpID09ICJvcHRpbWlzdGljIikgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFjY2VwdExpc3QgPSBudWxsOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNvbnRlbnRUeXBlTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBjb24uZ2V0SGVhZGVycygpOwotCi0gICAgICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBlbnRyaWVzIGJlY2F1c2UgYSBnZXRzIGFyZSBjYXNlIHNlbnNpdGl2ZQotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogaGVhZGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmVxdWFsc0lnbm9yZUNhc2UoImNvbnRlbnQtdHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlTGlzdCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5LmdldEtleSgpLmVxdWFsc0lnbm9yZUNhc2UoImFjY2VwdCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjY2VwdExpc3QgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgY29udGVudC10eXBlIGlzIEZJLCBGSSBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgYWNjZXB0IGhlYWRlcgotICAgICAgICAgICAgYXNzZXJ0IGNvbnRlbnRUeXBlTGlzdCAhPSBudWxsICYmIGFjY2VwdExpc3QgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gVXNlIEZJIE1JTUUgdHlwZSBiYXNlZCBvbiBBY2NlcHQgaGVhZGVyCi0gICAgICAgICAgICBjb250ZW50VHlwZUxpc3Quc2V0KDAsCi0gICAgICAgICAgICAgICAgRmFzdEluZm9zZXRVdGlsLmdldEZhc3RJbmZvc2V0RnJvbUFjY2VwdChhY2NlcHRMaXN0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb24uY2xvc2VPdXRwdXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFJlc3BvbnNlRXJyb3IoV1NDb25uZWN0aW9uIGNvbiwgU3RyaW5nIGJpbmRpbmdJZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IFNPQVBVdGlsLmNyZWF0ZU1lc3NhZ2UoYmluZGluZ0lkKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBidWZmZXJlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoKTsKLSAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1ZmZlcmVkU3RyZWFtLCAiVVRGLTgiKTsKLSAgICAgICAgICAgIGlmKGJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKSkKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoREVGQVVMVF9TRVJWRVJfRVJST1JfU09BUDEyX0VOVkVMT1BFKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoREVGQVVMVF9TRVJWRVJfRVJST1JfRU5WRUxPUEUpOwotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICBtZXNzYWdlLmdldFNPQVBQYXJ0KCkuc2V0Q29udGVudChuZXcgU3RyZWFtU291cmNlKGJ1ZmZlcmVkU3RyZWFtLm5ld0lucHV0U3RyZWFtKCkpKTsKLSAgICAgICAgICAgIHNldFN0YXR1cyhjb24sIFdTQ29ubmVjdGlvbi5JTlRFUk5BTF9FUlIpOwotICAgICAgICAgICAgc2VuZChjb24sIG1lc3NhZ2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SGVhZGVycyhXU0Nvbm5lY3Rpb24gY29uKSB7Ci0gICAgICAgIHJldHVybiBjb24uZ2V0SGVhZGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgcmVzcG9uc2UgaGVhZGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVhZGVycyhXU0Nvbm5lY3Rpb24gY29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycykgewotICAgICAgICBjb24uc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKFdTQ29ubmVjdGlvbiBjb24sIGludCBzdGF0dXMpIHsKLSAgICAgICAgY29uLnNldFN0YXR1cyhzdGF0dXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1NFUlZFUl9FUlJPUl9FTlZFTE9QRSA9Ci0gICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PiIKLSAgICAgICAgKyAiPGVudjpFbnZlbG9wZSB4bWxuczplbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIKLSAgICAgICAgKyAiPGVudjpCb2R5PiIKLSAgICAgICAgKyAiPGVudjpGYXVsdD4iCi0gICAgICAgICsgIjxmYXVsdGNvZGU+ZW52OlNlcnZlcjwvZmF1bHRjb2RlPiIKLSAgICAgICAgKyAiPGZhdWx0c3RyaW5nPkludGVybmFsIHNlcnZlciBlcnJvcjwvZmF1bHRzdHJpbmc+IgotICAgICAgICArICI8L2VudjpGYXVsdD4iCi0gICAgICAgICsgIjwvZW52OkJvZHk+IgotICAgICAgICArICI8L2VudjpFbnZlbG9wZT4iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfU0VSVkVSX0VSUk9SX1NPQVAxMl9FTlZFTE9QRSA9Ci0gICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PiIKLSAgICAgICAgKyAiPGVudjpFbnZlbG9wZSB4bWxuczplbnY9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGVcIj4iCi0gICAgICAgICsgIjxlbnY6Qm9keT4iCi0gICAgICAgICsgIjxlbnY6RmF1bHQ+IgotICAgICAgICArICI8ZW52OkNvZGU+PGVudjpWYWx1ZT5lbnY6UmVjZWl2ZXI8L2VudjpWYWx1ZT48L2VudjpDb2RlPiIKLSAgICAgICAgKyAiPGVudjpSZWFzb24+PGVudjpUZXh0IGxhbmc9XCIiKyBMb2NhbGUuZ2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkgKyJcIj4iCi0gICAgICAgICsgIkludGVybmFsIHNlcnZlciBlcnJvcjwvZW52OlRleHQ+PC9lbnY6UmVhc29uPiIKLSAgICAgICAgKyAiPC9lbnY6RmF1bHQ+IgotICAgICAgICArICI8L2VudjpCb2R5PiIKLSAgICAgICAgKyAiPC9lbnY6RW52ZWxvcGU+IjsKLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9TT0FQVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9TT0FQVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzg3YTY2Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvU09BUFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2UuU09BUE1zZ0NyZWF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5lbmNvZGluZy5zb2FwLm1lc3NhZ2UuU09BUE1zZ0ZhY3RvcnlDcmVhdGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLio7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiAkYXV0aG9yOiBKQVhXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLQotLyoqCi0gKiBIYXMgdXRpbGl0eSBtZXRob2RzIHRvIGNyZWF0ZSBTT0FQTWVzc2FnZQotICovCi1wdWJsaWMgY2xhc3MgU09BUFV0aWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZUZhY3Rvcnkgc29hcDExbWVzc2FnZUZhY3RvcnkgPQotICAgICAgICAgICAgY3JlYXRlTWVzc2FnZUZhY3RvcnkoU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZUZhY3Rvcnkgc29hcDEybWVzc2FnZUZhY3RvcnkgPQotICAgICAgICAgICAgY3JlYXRlTWVzc2FnZUZhY3RvcnkoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU09BUEZhY3Rvcnkgc29hcDExRmFjdG9yeSA9IGNyZWF0ZVNPQVBGYWN0b3J5KFNPQVBDb25zdGFudHMuU09BUF8xXzFfUFJPVE9DT0wpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNPQVBGYWN0b3J5IHNvYXAxMkZhY3RvcnkgPSBjcmVhdGVTT0FQRmFjdG9yeShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFNPQVBGYWN0b3J5IGNyZWF0ZVNPQVBGYWN0b3J5KFN0cmluZyBzb2FwUHJvdG9jb2wpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShzb2FwUHJvdG9jb2wpOwotICAgICAgICB9IGNhdGNoKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBNc2dGYWN0b3J5Q3JlYXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJzb2FwLmZhY3RvcnkuY3JlYXRlLmVyciIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgZSB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIGJpbmRpbmdJZAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgICAgICByZXR1cm5zIFNPQVBGYWN0b3IgZm9yIFNPQVAgMS4yIGlmIGJpbmRpbmdJRCBlcXVhbHMgU09BUDEuMiBIVFRQIGJpbmRpbmcgZWxzZQotICAgICAqICAgICAgICAgIFNPQVBGYWN0b3J5IGZvciBTT0FQIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoU3RyaW5nIGJpbmRpbmdJZCl7Ci0gICAgICAgIGlmKGJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKSl7Ci0gICAgICAgICAgICByZXR1cm4gc29hcDEyRmFjdG9yeTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcDExRmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBGYXVsdCBjcmVhdGVTT0FQRmF1bHQoU3RyaW5nIGJpbmRpbmdJZCl7Ci0gICAgICAgIGlmKGJpbmRpbmdJZCA9PSBudWxsKQotICAgICAgICAgICAgYmluZGluZ0lkID0gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmKGJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gc29hcDEyRmFjdG9yeS5jcmVhdGVGYXVsdCgpOwotICAgICAgICAgICAgcmV0dXJuIHNvYXAxMUZhY3RvcnkuY3JlYXRlRmF1bHQoKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUE1zZ0ZhY3RvcnlDcmVhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgInNvYXAuZmF1bHQuY3JlYXRlLmVyciIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgZSB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgU09BUCAxLjEgb3IgU09BUCAxLjIgU09BUEZhdWx0IGJhc2VkIG9uIHRoZSBiaW5kaW5nSWQKLSAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiBAcGFyYW0gYWN0b3IKLSAgICAgKiBAcGFyYW0gZGV0YWlsCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBTT0FQRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBGYXVsdCBjcmVhdGVTT0FQRmF1bHQoU3RyaW5nIG1zZywgUU5hbWUgY29kZSwgU3RyaW5nIGFjdG9yLCBEZXRhaWwgZGV0YWlsLCBTdHJpbmcgYmluZGluZ0lkKXsKLSAgICAgICAgaWYoYmluZGluZ0lkID09IG51bGwpCi0gICAgICAgICAgICBiaW5kaW5nSWQgPSBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBudWxsOwotICAgICAgICAgICAgaWYoYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKQotICAgICAgICAgICAgICAgIGZhdWx0ID0gc29hcDEyRmFjdG9yeS5jcmVhdGVGYXVsdChtc2csIGNvZGUpOwotICAgICAgICAgICAgZWxzZSBpZihiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykpCi0gICAgICAgICAgICAgICAgZmF1bHQgPSBzb2FwMTFGYWN0b3J5LmNyZWF0ZUZhdWx0KG1zZywgY29kZSk7Ci0gICAgICAgICAgICBpZihhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0QWN0b3IoYWN0b3IpOwotICAgICAgICAgICAgaWYoZGV0YWlsICE9IG51bGwpewotICAgICAgICAgICAgICAgIE5vZGUgbiA9IGZhdWx0LmdldE93bmVyRG9jdW1lbnQoKS5pbXBvcnROb2RlKGRldGFpbCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZmF1bHQuYXBwZW5kQ2hpbGQobik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmF1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBNc2dGYWN0b3J5Q3JlYXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJzb2FwLmZhdWx0LmNyZWF0ZS5lcnIiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGUgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluZGluZwotICAgICAqIEByZXR1cm4gYSA8Y29kZT5TT0FQTWVzc2FnZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmJpbmRpbmc8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTT0FQTWVzc2FnZSBjcmVhdGVNZXNzYWdlKFN0cmluZyBiaW5kaW5nKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZUZhY3RvcnkoYmluZGluZykuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQTXNnQ3JlYXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAic29hcC5tc2cuY3JlYXRlLmVyciIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGUgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBiaW5kaW5nCi0gICAgICogQHBhcmFtIGhlYWRlcnMKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPiB3aXRoIDxjb2RlPk1pbWVIZWFkZXJzPC9jb2RlPiBmcm9tIGFuCi0gICAgICogICAgICAgICA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gYW5kIGJpbmRpbmcuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU09BUE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShNaW1lSGVhZGVycyBoZWFkZXJzLCBJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2VGYWN0b3J5KGJpbmRpbmcpLmNyZWF0ZU1lc3NhZ2UoaGVhZGVycywgaW4pOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQTXNnQ3JlYXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAic29hcC5tc2cuY3JlYXRlLmVyciIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGUgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoTWltZUhlYWRlcnMgaGVhZGVycywgSW5wdXRTdHJlYW0gaW4pCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2UoaGVhZGVycywgaW4sIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRmFjdG9yeSBnZXRNZXNzYWdlRmFjdG9yeShTdHJpbmcgYmluZGluZykgewotICAgICAgICBpZiAoYmluZGluZy5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKSkgewotICAgICAgICAgICAgcmV0dXJuIHNvYXAxMW1lc3NhZ2VGYWN0b3J5OwotICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmcuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykpIHsKLSAgICAgICAgICAgIHJldHVybiBzb2FwMTJtZXNzYWdlRmFjdG9yeTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcDExbWVzc2FnZUZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUZhY3RvcnkgY3JlYXRlTWVzc2FnZUZhY3RvcnkoU3RyaW5nIGJpbmRpbmdJZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKGJpbmRpbmdJZCk7Ci0gICAgICAgIH0gY2F0Y2goU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUE1zZ0ZhY3RvcnlDcmVhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgInNvYXAubXNnLmZhY3RvcnkuY3JlYXRlLmVyciIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgZSB9KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9TZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1NlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQ0NzY4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9TZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7CisKKy8qKgorICogRXJyb3IgdGhyb3duIHdoZW4gc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2hpbGUgbG9va2luZyB1cCBzZXJ2aWNlIHByb3ZpZGVycy4KKyAqIEluIHBhcnRpY3VsYXIsIHRoaXMgZXJyb3Igd2lsbCBiZSB0aHJvd24gaW4gdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgorICoKKyAqICAgPHVsPgorICogICA8bGk+IEEgY29uY3JldGUgcHJvdmlkZXIgY2xhc3MgY2Fubm90IGJlIGZvdW5kLAorICogICA8bGk+IEEgY29uY3JldGUgcHJvdmlkZXIgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKKyAqICAgPGxpPiBUaGUgZm9ybWF0IG9mIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlIGlzIGlsbGVnYWwsIG9yCisgKiAgIDxsaT4gQW4gSU9FeGNlcHRpb24gb2NjdXJzIHdoaWxlIHJlYWRpbmcgYSBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGUuCisgKiAgIDwvdWw+CisgKgorICogQGF1dGhvciBNYXJrIFJlaW5ob2xkCisgKiBAdmVyc2lvbiAxLjcsIDAzLzEyLzE5CisgKiBAc2luY2UgMS4zCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3IgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvcihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQgdGhyb3dhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yKFRocm93YWJsZSB4KSB7CisgICAgICAgIHN1cGVyKHgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9TZXJ2aWNlRmluZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1NlcnZpY2VGaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRhMzJhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9TZXJ2aWNlRmluZGVyLmphdmEKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCisKKy8qKgorICogQSBzaW1wbGUgc2VydmljZS1wcm92aWRlciBsb29rdXAgbWVjaGFuaXNtLiAgQSA8aT5zZXJ2aWNlPC9pPiBpcyBhCisgKiB3ZWxsLWtub3duIHNldCBvZiBpbnRlcmZhY2VzIGFuZCAodXN1YWxseSBhYnN0cmFjdCkgY2xhc3Nlcy4gIEEgPGk+c2VydmljZQorICogcHJvdmlkZXI8L2k+IGlzIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLiAgVGhlIGNsYXNzZXMgaW4gYQorICogcHJvdmlkZXIgdHlwaWNhbGx5IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlcyBhbmQgc3ViY2xhc3MgdGhlIGNsYXNzZXMgZGVmaW5lZAorICogaW4gdGhlIHNlcnZpY2UgaXRzZWxmLiAgU2VydmljZSBwcm92aWRlcnMgbWF5IGJlIGluc3RhbGxlZCBpbiBhbgorICogaW1wbGVtZW50YXRpb24gb2YgdGhlIEphdmEgcGxhdGZvcm0gaW4gdGhlIGZvcm0gb2YgZXh0ZW5zaW9ucywgdGhhdCBpcywgamFyCisgKiBmaWxlcyBwbGFjZWQgaW50byBhbnkgb2YgdGhlIHVzdWFsIGV4dGVuc2lvbiBkaXJlY3Rvcmllcy4gIFByb3ZpZGVycyBtYXkKKyAqIGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYnkgYWRkaW5nIHRoZW0gdG8gdGhlIGFwcGxldCBvciBhcHBsaWNhdGlvbiBjbGFzcworICogcGF0aCBvciBieSBzb21lIG90aGVyIHBsYXRmb3JtLXNwZWNpZmljIG1lYW5zLgorICogPHAvPgorICogPHA+IEluIHRoaXMgbG9va3VwIG1lY2hhbmlzbSBhIHNlcnZpY2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gaW50ZXJmYWNlIG9yIGFuCisgKiBhYnN0cmFjdCBjbGFzcy4gIChBIGNvbmNyZXRlIGNsYXNzIG1heSBiZSB1c2VkLCBidXQgdGhpcyBpcyBub3QKKyAqIHJlY29tbWVuZGVkLikgIEEgcHJvdmlkZXIgb2YgYSBnaXZlbiBzZXJ2aWNlIGNvbnRhaW5zIG9uZSBvciBtb3JlIGNvbmNyZXRlCisgKiBjbGFzc2VzIHRoYXQgZXh0ZW5kIHRoaXMgPGk+c2VydmljZSBjbGFzczwvaT4gd2l0aCBkYXRhIGFuZCBjb2RlIHNwZWNpZmljIHRvCisgKiB0aGUgcHJvdmlkZXIuICBUaGlzIDxpPnByb3ZpZGVyIGNsYXNzPC9pPiB3aWxsIHR5cGljYWxseSBub3QgYmUgdGhlIGVudGlyZQorICogcHJvdmlkZXIgaXRzZWxmIGJ1dCByYXRoZXIgYSBwcm94eSB0aGF0IGNvbnRhaW5zIGVub3VnaCBpbmZvcm1hdGlvbiB0bworICogZGVjaWRlIHdoZXRoZXIgdGhlIHByb3ZpZGVyIGlzIGFibGUgdG8gc2F0aXNmeSBhIHBhcnRpY3VsYXIgcmVxdWVzdCB0b2dldGhlcgorICogd2l0aCBjb2RlIHRoYXQgY2FuIGNyZWF0ZSB0aGUgYWN0dWFsIHByb3ZpZGVyIG9uIGRlbWFuZC4gIFRoZSBkZXRhaWxzIG9mCisgKiBwcm92aWRlciBjbGFzc2VzIHRlbmQgdG8gYmUgaGlnaGx5IHNlcnZpY2Utc3BlY2lmaWM7IG5vIHNpbmdsZSBjbGFzcyBvcgorICogaW50ZXJmYWNlIGNvdWxkIHBvc3NpYmx5IHVuaWZ5IHRoZW0sIHNvIG5vIHN1Y2ggY2xhc3MgaGFzIGJlZW4gZGVmaW5lZC4gIFRoZQorICogb25seSByZXF1aXJlbWVudCBlbmZvcmNlZCBoZXJlIGlzIHRoYXQgcHJvdmlkZXIgY2xhc3NlcyBtdXN0IGhhdmUgYQorICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvciBzbyB0aGF0IHRoZXkgbWF5IGJlIGluc3RhbnRpYXRlZCBkdXJpbmcgbG9va3VwLgorICogPHAvPgorICogPHA+IEEgc2VydmljZSBwcm92aWRlciBpZGVudGlmaWVzIGl0c2VsZiBieSBwbGFjaW5nIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbgorICogZmlsZSBpbiB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IDx0dD5NRVRBLUlORi9zZXJ2aWNlczwvdHQ+LiAgVGhlIGZpbGUncyBuYW1lCisgKiBzaG91bGQgY29uc2lzdCBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFic3RyYWN0IHNlcnZpY2UgY2xhc3MuCisgKiBUaGUgZmlsZSBzaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgZnVsbHktcXVhbGlmaWVkIGNvbmNyZXRlIHByb3ZpZGVyLWNsYXNzCisgKiBuYW1lcywgb25lIHBlciBsaW5lLiAgU3BhY2UgYW5kIHRhYiBjaGFyYWN0ZXJzIHN1cnJvdW5kaW5nIGVhY2ggbmFtZSwgYXMKKyAqIHdlbGwgYXMgYmxhbmsgbGluZXMsIGFyZSBpZ25vcmVkLiAgVGhlIGNvbW1lbnQgY2hhcmFjdGVyIGlzIDx0dD4nIyc8L3R0PgorICogKDx0dD4weDIzPC90dD4pOyBvbiBlYWNoIGxpbmUgYWxsIGNoYXJhY3RlcnMgZm9sbG93aW5nIHRoZSBmaXJzdCBjb21tZW50CisgKiBjaGFyYWN0ZXIgYXJlIGlnbm9yZWQuICBUaGUgZmlsZSBtdXN0IGJlIGVuY29kZWQgaW4gVVRGLTguCisgKiA8cC8+CisgKiA8cD4gSWYgYSBwYXJ0aWN1bGFyIGNvbmNyZXRlIHByb3ZpZGVyIGNsYXNzIGlzIG5hbWVkIGluIG1vcmUgdGhhbiBvbmUKKyAqIGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgaXMgbmFtZWQgaW4gdGhlIHNhbWUgY29uZmlndXJhdGlvbiBmaWxlIG1vcmUgdGhhbgorICogb25jZSwgdGhlbiB0aGUgZHVwbGljYXRlcyB3aWxsIGJlIGlnbm9yZWQuICBUaGUgY29uZmlndXJhdGlvbiBmaWxlIG5hbWluZyBhCisgKiBwYXJ0aWN1bGFyIHByb3ZpZGVyIG5lZWQgbm90IGJlIGluIHRoZSBzYW1lIGphciBmaWxlIG9yIG90aGVyIGRpc3RyaWJ1dGlvbgorICogdW5pdCBhcyB0aGUgcHJvdmlkZXIgaXRzZWxmLiAgVGhlIHByb3ZpZGVyIG11c3QgYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBzYW1lCisgKiBjbGFzcyBsb2FkZXIgdGhhdCB3YXMgaW5pdGlhbGx5IHF1ZXJpZWQgdG8gbG9jYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGU7CisgKiBub3RlIHRoYXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGNsYXNzIGxvYWRlciB0aGF0IGZvdW5kIHRoZSBmaWxlLgorICogPHAvPgorICogPHA+IDxiPkV4YW1wbGU6PC9iPiBTdXBwb3NlIHdlIGhhdmUgYSBzZXJ2aWNlIGNsYXNzIG5hbWVkCisgKiA8dHQ+amF2YS5pby5zcGkuQ2hhckNvZGVjPC90dD4uICBJdCBoYXMgdHdvIGFic3RyYWN0IG1ldGhvZHM6CisgKiA8cC8+CisgKiA8cHJlPgorICogICBwdWJsaWMgYWJzdHJhY3QgQ2hhckVuY29kZXIgZ2V0RW5jb2RlcihTdHJpbmcgZW5jb2RpbmdOYW1lKTsKKyAqICAgcHVibGljIGFic3RyYWN0IENoYXJEZWNvZGVyIGdldERlY29kZXIoU3RyaW5nIGVuY29kaW5nTmFtZSk7CisgKiA8L3ByZT4KKyAqIDxwLz4KKyAqIEVhY2ggbWV0aG9kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgb2JqZWN0IG9yIDx0dD5udWxsPC90dD4gaWYgaXQgY2Fubm90CisgKiB0cmFuc2xhdGUgdGhlIGdpdmVuIGVuY29kaW5nLiAgVHlwaWNhbCA8dHQ+Q2hhckNvZGVjPC90dD4gcHJvdmlkZXJzIHdpbGwKKyAqIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBlbmNvZGluZy4KKyAqIDxwLz4KKyAqIDxwPiBJZiA8dHQ+c3VuLmlvLlN0YW5kYXJkQ29kZWM8L3R0PiBpcyBhIHByb3ZpZGVyIG9mIHRoZSA8dHQ+Q2hhckNvZGVjPC90dD4KKyAqIHNlcnZpY2UgdGhlbiBpdHMgamFyIGZpbGUgd291bGQgY29udGFpbiB0aGUgZmlsZQorICogPHR0Pk1FVEEtSU5GL3NlcnZpY2VzL2phdmEuaW8uc3BpLkNoYXJDb2RlYzwvdHQ+LiAgVGhpcyBmaWxlIHdvdWxkIGNvbnRhaW4KKyAqIHRoZSBzaW5nbGUgbGluZToKKyAqIDxwLz4KKyAqIDxwcmU+CisgKiAgIHN1bi5pby5TdGFuZGFyZENvZGVjICAgICMgU3RhbmRhcmQgY29kZWNzIGZvciB0aGUgcGxhdGZvcm0KKyAqIDwvcHJlPgorICogPHAvPgorICogVG8gbG9jYXRlIGFuIGNvZGVjIGZvciBhIGdpdmVuIGVuY29kaW5nIG5hbWUsIHRoZSBpbnRlcm5hbCBJL08gY29kZSB3b3VsZAorICogZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqIDxwLz4KKyAqIDxwcmU+CisgKiAgIENoYXJFbmNvZGVyIGdldEVuY29kZXIoU3RyaW5nIGVuY29kaW5nTmFtZSkgeworICogICAgICAgZm9yKCBDaGFyQ29kZWMgY2MgOiBTZXJ2aWNlRmluZGVyLmZpbmQoQ2hhckNvZGVjLmNsYXNzKSApIHsKKyAqICAgICAgICAgICBDaGFyRW5jb2RlciBjZSA9IGNjLmdldEVuY29kZXIoZW5jb2RpbmdOYW1lKTsKKyAqICAgICAgICAgICBpZiAoY2UgIT0gbnVsbCkKKyAqICAgICAgICAgICAgICAgcmV0dXJuIGNlOworICogICAgICAgfQorICogICAgICAgcmV0dXJuIG51bGw7CisgKiAgIH0KKyAqIDwvcHJlPgorICogPHAvPgorICogVGhlIHByb3ZpZGVyLWxvb2t1cCBtZWNoYW5pc20gYWx3YXlzIGV4ZWN1dGVzIGluIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZQorICogY2FsbGVyLiAgVHJ1c3RlZCBzeXN0ZW0gY29kZSBzaG91bGQgdHlwaWNhbGx5IGludm9rZSB0aGUgbWV0aG9kcyBpbiB0aGlzCisgKiBjbGFzcyBmcm9tIHdpdGhpbiBhIHByaXZpbGVnZWQgc2VjdXJpdHkgY29udGV4dC4KKyAqCisgKiBAYXV0aG9yIE1hcmsgUmVpbmhvbGQKKyAqIEB2ZXJzaW9uIDEuMTEsIDAzLzEyLzE5CisgKiBAc2luY2UgMS4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlRmluZGVyPFQ+IGltcGxlbWVudHMgSXRlcmFibGU8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByZWZpeCA9ICJNRVRBLUlORi9zZXJ2aWNlcy8iOworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiBzZXJ2aWNlQ2xhc3M7CisgICAgcHJpdmF0ZSBmaW5hbCBATnVsbGFibGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIGFuZCBpbmNyZW1lbnRhbGx5IGluc3RhbnRpYXRlcyB0aGUgYXZhaWxhYmxlIHByb3ZpZGVycyBvZiBhCisgICAgICogZ2l2ZW4gc2VydmljZSB1c2luZyB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyLgorICAgICAqIDxwLz4KKyAgICAgKiA8cD4gVGhpcyBtZXRob2QgdHJhbnNmb3JtcyB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gc2VydmljZSBjbGFzcyBpbnRvIGEKKyAgICAgKiBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGVuYW1lIGFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgdGhlbiB1c2VzIHRoZQorICAgICAqIDx0dD5nZXRSZXNvdXJjZXM8L3R0PiBtZXRob2Qgb2YgdGhlIGdpdmVuIGNsYXNzIGxvYWRlciB0byBmaW5kIGFsbAorICAgICAqIGF2YWlsYWJsZSBmaWxlcyB3aXRoIHRoYXQgbmFtZS4gIFRoZXNlIGZpbGVzIGFyZSB0aGVuIHJlYWQgYW5kIHBhcnNlZCB0bworICAgICAqIHByb2R1Y2UgYSBsaXN0IG9mIHByb3ZpZGVyLWNsYXNzIG5hbWVzLiAgVGhlIGl0ZXJhdG9yIHRoYXQgaXMgcmV0dXJuZWQKKyAgICAgKiB1c2VzIHRoZSBnaXZlbiBjbGFzcyBsb2FkZXIgdG8gbG9va3VwIGFuZCB0aGVuIGluc3RhbnRpYXRlIGVhY2ggZWxlbWVudAorICAgICAqIG9mIHRoZSBsaXN0LgorICAgICAqIDxwLz4KKyAgICAgKiA8cD4gQmVjYXVzZSBpdCBpcyBwb3NzaWJsZSBmb3IgZXh0ZW5zaW9ucyB0byBiZSBpbnN0YWxsZWQgaW50byBhIHJ1bm5pbmcKKyAgICAgKiBKYXZhIHZpcnR1YWwgbWFjaGluZSwgdGhpcyBtZXRob2QgbWF5IHJldHVybiBkaWZmZXJlbnQgcmVzdWx0cyBlYWNoIHRpbWUKKyAgICAgKiBpdCBpcyBpbnZva2VkLiA8cD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlJ3MgYWJzdHJhY3Qgc2VydmljZSBjbGFzcworICAgICAqIEBwYXJhbSBsb2FkZXIgIFRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCB0byBsb2FkIHByb3ZpZGVyLWNvbmZpZ3VyYXRpb24gZmlsZXMKKyAgICAgKiAgICAgICAgICAgICAgICBhbmQgaW5zdGFudGlhdGUgcHJvdmlkZXIgY2xhc3Nlcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUgc3lzdGVtCisgICAgICogICAgICAgICAgICAgICAgY2xhc3MgbG9hZGVyIChvciwgZmFpbGluZyB0aGF0IHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyKSBpcyB0bworICAgICAqICAgICAgICAgICAgICAgIGJlIHVzZWQKKyAgICAgKiBAdGhyb3dzIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IgSWYgYSBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGUgdmlvbGF0ZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbmFtZXMgYSBwcm92aWRlciBjbGFzcyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBhbmQgaW5zdGFudGlhdGVkCisgICAgICogQHNlZSAjZmluZChDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBTZXJ2aWNlRmluZGVyPFQ+IGZpbmQoQE5vdE51bGwgQ2xhc3M8VD4gc2VydmljZSwgQE51bGxhYmxlIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VGaW5kZXI8VD4oc2VydmljZSxsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgYW5kIGluY3JlbWVudGFsbHkgaW5zdGFudGlhdGVzIHRoZSBhdmFpbGFibGUgcHJvdmlkZXJzIG9mIGEKKyAgICAgKiBnaXZlbiBzZXJ2aWNlIHVzaW5nIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlci4gIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kCisgICAgICogaXMgZXF1aXZhbGVudCB0bworICAgICAqIDxwLz4KKyAgICAgKiA8cHJlPgorICAgICAqICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAqICAgcmV0dXJuIFNlcnZpY2UucHJvdmlkZXJzKHNlcnZpY2UsIGNsKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlJ3MgYWJzdHJhY3Qgc2VydmljZSBjbGFzcworICAgICAqCisgICAgICogQHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIElmIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlIHZpb2xhdGVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5hbWVzIGEgcHJvdmlkZXIgY2xhc3MgdGhhdCBjYW5ub3QgYmUgZm91bmQgYW5kIGluc3RhbnRpYXRlZAorICAgICAqIEBzZWUgI2ZpbmQoQ2xhc3MsIENsYXNzTG9hZGVyKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFNlcnZpY2VGaW5kZXI8VD4gZmluZChDbGFzczxUPiBzZXJ2aWNlKSB7CisgICAgICAgIHJldHVybiBmaW5kKHNlcnZpY2UsVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXJ2aWNlRmluZGVyKENsYXNzPFQ+IHNlcnZpY2UsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IHNlcnZpY2U7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBsb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBkaXNjb3ZlcmVkIG9iamVjdHMgaW5jcmVtZW50YWxseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gPHR0Pkl0ZXJhdG9yPC90dD4gdGhhdCB5aWVsZHMgcHJvdmlkZXIgb2JqZWN0cyBmb3IgdGhlIGdpdmVuCisgICAgICogICAgICAgICBzZXJ2aWNlLCBpbiBzb21lIGFyYml0cmFyeSBvcmRlci4gIFRoZSBpdGVyYXRvciB3aWxsIHRocm93IGEKKyAgICAgKiAgICAgICAgIDx0dD5TZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yPC90dD4gaWYgYSBwcm92aWRlci1jb25maWd1cmF0aW9uCisgICAgICogICAgICAgICBmaWxlIHZpb2xhdGVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0IG9yIGlmIGEgcHJvdmlkZXIgY2xhc3MgY2Fubm90CisgICAgICogICAgICAgICBiZSBmb3VuZCBhbmQgaW5zdGFudGlhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvcjxUPiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMYXp5SXRlcmF0b3I8VD4oc2VydmljZUNsYXNzLGNsYXNzTG9hZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRpc2NvdmVyZWQgb2JqZWN0cyBhbGwgYXQgb25jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGNhbiBiZSBlbXB0eSBidXQgbmV2ZXIgbnVsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvcgorICAgICAqLworICAgIHB1YmxpYyBUW10gdG9BcnJheSgpIHsKKyAgICAgICAgTGlzdDxUPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisgICAgICAgIGZvciAoVCB0IDogdGhpcykgeworICAgICAgICAgICAgcmVzdWx0LmFkZCh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkoKFRbXSlBcnJheS5uZXdJbnN0YW5jZShzZXJ2aWNlQ2xhc3MscmVzdWx0LnNpemUoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmFpbChDbGFzcyBzZXJ2aWNlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpCisgICAgICAgIHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciBzY2UKKyAgICAgICAgICAgID0gbmV3IFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3Ioc2VydmljZS5nZXROYW1lKCkgKyAiOiAiICsgbXNnKTsKKyAgICAgICAgc2NlLmluaXRDYXVzZShjYXVzZSk7CisgICAgICAgIHRocm93IHNjZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZhaWwoQ2xhc3Mgc2VydmljZSwgU3RyaW5nIG1zZykKKyAgICAgICAgdGhyb3dzIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IgeworICAgICAgICB0aHJvdyBuZXcgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvcihzZXJ2aWNlLmdldE5hbWUoKSArICI6ICIgKyBtc2cpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmFpbChDbGFzcyBzZXJ2aWNlLCBVUkwgdSwgaW50IGxpbmUsIFN0cmluZyBtc2cpCisgICAgICAgIHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgZmFpbChzZXJ2aWNlLCB1ICsgIjoiICsgbGluZSArICI6ICIgKyBtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgc2luZ2xlIGxpbmUgZnJvbSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlLCBhZGRpbmcgdGhlIG5hbWUKKyAgICAgKiBvbiB0aGUgbGluZSB0byBib3RoIHRoZSBuYW1lcyBsaXN0IGFuZCB0aGUgcmV0dXJuZWQgc2V0IGlmZiB0aGUgbmFtZSBpcworICAgICAqIG5vdCBhbHJlYWR5IGEgbWVtYmVyIG9mIHRoZSByZXR1cm5lZCBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlTGluZShDbGFzcyBzZXJ2aWNlLCBVUkwgdSwgQnVmZmVyZWRSZWFkZXIgciwgaW50IGxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzLCBTZXQ8U3RyaW5nPiByZXR1cm5lZCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgU3RyaW5nIGxuID0gci5yZWFkTGluZSgpOworICAgICAgICBpZiAobG4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGludCBjaSA9IGxuLmluZGV4T2YoJyMnKTsKKyAgICAgICAgaWYgKGNpID49IDApIGxuID0gbG4uc3Vic3RyaW5nKDAsIGNpKTsKKyAgICAgICAgbG4gPSBsbi50cmltKCk7CisgICAgICAgIGludCBuID0gbG4ubGVuZ3RoKCk7CisgICAgICAgIGlmIChuICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobG4uaW5kZXhPZignICcpID49IDApIHx8IChsbi5pbmRleE9mKCdcdCcpID49IDApKQorICAgICAgICAgICAgICAgIGZhaWwoc2VydmljZSwgdSwgbGMsICJJbGxlZ2FsIGNvbmZpZ3VyYXRpb24tZmlsZSBzeW50YXgiKTsKKyAgICAgICAgICAgIGludCBjcCA9IGxuLmNvZGVQb2ludEF0KDApOworICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNwKSkKKyAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2UsIHUsIGxjLCAiSWxsZWdhbCBwcm92aWRlci1jbGFzcyBuYW1lOiAiICsgbG4pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IENoYXJhY3Rlci5jaGFyQ291bnQoY3ApOyBpIDwgbjsgaSArPSBDaGFyYWN0ZXIuY2hhckNvdW50KGNwKSkgeworICAgICAgICAgICAgICAgIGNwID0gbG4uY29kZVBvaW50QXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3ApICYmIChjcCAhPSAnLicpKQorICAgICAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2UsIHUsIGxjLCAiSWxsZWdhbCBwcm92aWRlci1jbGFzcyBuYW1lOiAiICsgbG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyZXR1cm5lZC5jb250YWlucyhsbikpIHsKKyAgICAgICAgICAgICAgICBuYW1lcy5hZGQobG4pOworICAgICAgICAgICAgICAgIHJldHVybmVkLmFkZChsbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxjICsgMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gVVJMIGFzIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgIFRoZSBzZXJ2aWNlIGNsYXNzIGZvciB3aGljaCBwcm92aWRlcnMgYXJlIGJlaW5nIHNvdWdodDsKKyAgICAgKiAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25zdHJ1Y3QgZXJyb3IgZGV0YWlsIHN0cmluZ3MKKyAgICAgKiBAcGFyYW0gdSAgICAgICAgVGhlIFVSTCBuYW1pbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSBwYXJzZWQKKyAgICAgKiBAcGFyYW0gcmV0dXJuZWQgQSBTZXQgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgcHJvdmlkZXIgY2xhc3NlcyB0aGF0IGhhdmUgYWxyZWFkeQorICAgICAqICAgICAgICAgICAgICAgICBiZWVuIHJldHVybmVkLiAgVGhpcyBzZXQgd2lsbCBiZSB1cGRhdGVkIHRvIGNvbnRhaW4gdGhlIG5hbWVzCisgICAgICogICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB5aWVsZGVkIGZyb20gdGhlIHJldHVybmVkIDx0dD5JdGVyYXRvcjwvdHQ+LgorICAgICAqIEByZXR1cm4gQSAocG9zc2libHkgZW1wdHkpIDx0dD5JdGVyYXRvcjwvdHQ+IHRoYXQgd2lsbCB5aWVsZCB0aGUKKyAgICAgKiAgICAgICAgIHByb3ZpZGVyLWNsYXNzIG5hbWVzIGluIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCBhcmUKKyAgICAgKiAgICAgICAgIG5vdCB5ZXQgbWVtYmVycyBvZiB0aGUgcmV0dXJuZWQgc2V0CisgICAgICogQHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIElmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwsIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGEgY29uZmlndXJhdGlvbi1maWxlIGZvcm1hdCBlcnJvciBpcyBkZXRlY3RlZAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiU3RhdGVtZW50V2l0aEVtcHR5Qm9keSJ9KQorICAgIHByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gcGFyc2UoQ2xhc3Mgc2VydmljZSwgVVJMIHUsIFNldDxTdHJpbmc+IHJldHVybmVkKQorICAgICAgICB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgciA9IG51bGw7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IHUub3BlblN0cmVhbSgpOworICAgICAgICAgICAgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJ1dGYtOCIpKTsKKyAgICAgICAgICAgIGludCBsYyA9IDE7CisgICAgICAgICAgICB3aGlsZSAoKGxjID0gcGFyc2VMaW5lKHNlcnZpY2UsIHUsIHIsIGxjLCBuYW1lcywgcmV0dXJuZWQpKSA+PSAwKSA7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGZhaWwoc2VydmljZSwgIjogIiArIHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSByLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIGluLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB5KSB7CisgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlLCAiOiAiICsgeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWVzLml0ZXJhdG9yKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGlubmVyIGNsYXNzIGltcGxlbWVudGluZyBmdWxseS1sYXp5IHByb3ZpZGVyIGxvb2t1cAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExhenlJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKKyAgICAgICAgQ2xhc3M8VD4gc2VydmljZTsKKyAgICAgICAgQE51bGxhYmxlIENsYXNzTG9hZGVyIGxvYWRlcjsKKyAgICAgICAgRW51bWVyYXRpb248VVJMPiBjb25maWdzID0gbnVsbDsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBwZW5kaW5nID0gbnVsbDsKKyAgICAgICAgU2V0PFN0cmluZz4gcmV0dXJuZWQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7CisgICAgICAgIFN0cmluZyBuZXh0TmFtZSA9IG51bGw7CisgICAgICAgIFVSTCBjdXJyZW50Q29uZmlnID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIExhenlJdGVyYXRvcihDbGFzczxUPiBzZXJ2aWNlLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7CisgICAgICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgICAgICBpZiAobmV4dE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbmZpZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IHByZWZpeCArIHNlcnZpY2UuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdzID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VzKGZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlncyA9IGxvYWRlci5nZXRSZXNvdXJjZXMoZnVsbE5hbWUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlLCAiOiAiICsgeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKChwZW5kaW5nID09IG51bGwpIHx8ICFwZW5kaW5nLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmICghY29uZmlncy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJlbnRDb25maWcgPSBjb25maWdzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgcGVuZGluZyA9IHBhcnNlKHNlcnZpY2UsIGN1cnJlbnRDb25maWcsIHJldHVybmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHROYW1lID0gcGVuZGluZy5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIG5leHQoKSB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY24gPSBuZXh0TmFtZTsKKyAgICAgICAgICAgIG5leHROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuY2FzdChDbGFzcy5mb3JOYW1lKGNuLCB0cnVlLCBsb2FkZXIpLm5ld0luc3RhbmNlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZXIgIiArIGNuICsgIiBpcyBzcGVjaWZpZWQgaW4gIitjdXJyZW50Q29uZmlnKyIgYnV0IG5vdCBmb3VuZCIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICJQcm92aWRlciAiICsgY24gKyAiIGlzIHNwZWNpZmllZCBpbiAiK2N1cnJlbnRDb25maWcrImJ1dCBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkOiAiICsgeCwgeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgLyogVGhpcyBjYW5ub3QgaGFwcGVuICovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvU3RyaW5nVXRpbHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvU3RyaW5nVXRpbHMuamF2YQppbmRleCA4YThmYTZmLi4yNDdiNmY3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1N0cmluZ1V0aWxzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9TdHJpbmdVdGlscy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvU3VuU3RBWFJlZmxlY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvU3VuU3RBWFJlZmxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxM2U2YS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1N1blN0QVhSZWZsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBTdW5TdEFYUmVmbGVjdGlvbiB7Ci0gICAgLyoqCi0gICAgICogU3VuIFN0QVggaW1wbCA8Y29kZT5YTUxSZWFkZXJJbXBsLnNldElucHV0U291cmNlKCk8L2NvZGU+IG1ldGhvZCB2aWEgcmVmbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBYTUxSZWFkZXJJbXBsX3NldElucHV0U291cmNlOwotCi0gICAgLyoqCi0gICAgICogU3VuIFN0QVggaW1wbCA8Y29kZT5YTUxSZWFkZXJJbXBsLnJlc2V0KCk8L2NvZGU+IG1ldGhvZCB2aWEgcmVmbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBYTUxSZWFkZXJJbXBsX3Jlc2V0OwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgiY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLlhNTFJlYWRlckltcGwiKTsKLSAgICAgICAgICAgIC8vIEFyZSB3ZSBydW5uaW5nIG9uIHRvcCBvZiBKQVhQIDEuND8KLSAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVySW1wbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgWE1MUmVhZGVySW1wbF9zZXRJbnB1dFNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgY2xhenouZ2V0TWV0aG9kKCJzZXRJbnB1dFNvdXJjZSIsIG9yZy54bWwuc2F4LklucHV0U291cmNlLmNsYXNzKTsKLSAgICAgICAgICAgIFhNTFJlYWRlckltcGxfcmVzZXQgPSBjbGF6ei5nZXRNZXRob2QoInJlc2V0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBmYWxscyB0aHJvdWdoCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1V0aWxFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvVXRpbEV4Y2VwdGlvbi5qYXZhCmluZGV4IGYwNDQzMTUuLjIzYTllZjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvVXRpbEV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvVXRpbEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICAgICAgc3VwZXIoIm5lc3RlZFV0aWxFcnJvciIsIGFyZyk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCkgewogICAgICAgICByZXR1cm4gImNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy51dGlsIjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvVmVyc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9WZXJzaW9uLmphdmEKaW5kZXggNmZjNzAwNS4uMjkwNzFlNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9WZXJzaW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9WZXJzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjAsNyArNjAsMTAgQEAKICAgICAgICAgICAgIHByb3BzLmxvYWQoaXMpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBpZ25vcmUgZXZlbiBpZiB0aGUgcHJvcGVydHkgd2FzIG5vdCBmb3VuZC4gd2UnbGwgdHJlYXQgZXZlcnl0aGluZyBhcyB1bmtub3duCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2lnbm9yZSBldmVuIGlmIHByb3BlcnR5IG5vdCBmb3VuZAogICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIG5ldyBWZXJzaW9uKAogICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoImJ1aWxkLWlkIiksCiAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgiYnVpbGQtdmVyc2lvbiIpLApAQCAtNzEsNCArNzQsOCBAQAogICAgICAgICBpZih2PT1udWxsKSByZXR1cm4gInVua25vd24iOwogICAgICAgICByZXR1cm4gdjsKICAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gQlVJTERfVkVSU0lPTjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1ZlcnNpb25VdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1ZlcnNpb25VdGlsLmphdmEKaW5kZXggYTkzY2EyOWMuLmE1NGQ1MGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvVmVyc2lvblV0aWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL1ZlcnNpb25VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9YTUxDb25uZWN0aW9uVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9YTUxDb25uZWN0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBhNzhiLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvWE1MQ29ubmVjdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLnJ1bnRpbWUuV1NDb25uZWN0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQuZXB0Lk1lc3NhZ2VJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnhtbC5YTUxNZXNzYWdlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5KQVhXU1Byb3BlcnRpZXMuQ09OVEVOVF9ORUdPVElBVElPTl9QUk9QRVJUWTsKLQotLyoqCi0gKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KLSAqLwotcHVibGljIGNsYXNzIFhNTENvbm5lY3Rpb25VdGlsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgWE1MTWVzc2FnZSBnZXRYTUxNZXNzYWdlKFdTQ29ubmVjdGlvbiBjb24sIE1lc3NhZ2VJbmZvIG1pKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBjb24uZ2V0SGVhZGVycygpOwotICAgICAgICAgICAgTWltZUhlYWRlcnMgbWggPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWguYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhIG1pbWUgaGVhZGVyLiBJZ25vcmUgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhNTE1lc3NhZ2UobWgsIGNvbi5nZXRJbnB1dCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IChIVFRQRXhjZXB0aW9uKW5ldyBIVFRQRXhjZXB0aW9uKEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfSU5URVJOQUxfRVJST1IpLmluaXRDYXVzZShlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZChXU0Nvbm5lY3Rpb24gY29uLCBYTUxNZXNzYWdlIHhtbE1lc3NhZ2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOwotICAgICAgICAgICAgTWltZUhlYWRlcnMgbWhzID0geG1sTWVzc2FnZS5nZXRNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IG1ocy5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNaW1lSGVhZGVyIG1oID0gKE1pbWVIZWFkZXIpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWguZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBoZWFkZXJzLmdldChuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0KG5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQobWguZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb24uc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICAgICAgICAgIHhtbE1lc3NhZ2Uud3JpdGVUbyhjb24uZ2V0T3V0cHV0KCkpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoSFRUUEV4Y2VwdGlvbiluZXcgSFRUUEV4Y2VwdGlvbihIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0lOVEVSTkFMX0VSUk9SKS5pbml0Q2F1c2UoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbi5jbG9zZU91dHB1dCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgKEhUVFBFeGNlcHRpb24pbmV3IEhUVFBFeGNlcHRpb24oSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9JTlRFUk5BTF9FUlJPUikuaW5pdENhdXNlKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRSZXNwb25zZShXU0Nvbm5lY3Rpb24gY29uLCBYTUxNZXNzYWdlIHhtbE1lc3NhZ2UpIHsKLSAgICAgICAgc2V0U3RhdHVzKGNvbiwgeG1sTWVzc2FnZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIHNlbmQoY29uLCB4bWxNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFJlc3BvbnNlT25ld2F5KFdTQ29ubmVjdGlvbiBjb24pIHsKLSAgICAgICAgc2V0U3RhdHVzKGNvbiwgV1NDb25uZWN0aW9uLk9ORVdBWSk7Ci0gICAgICAgIGNvbi5nZXRPdXRwdXQoKTsKLSAgICAgICAgY29uLmNsb3NlT3V0cHV0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRSZXNwb25zZUVycm9yKFdTQ29ubmVjdGlvbiBjb24sIE1lc3NhZ2VJbmZvIG1lc3NhZ2VJbmZvKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJlYW1Tb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oREVGQVVMVF9TRVJWRVJfRVJST1IuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lZyA9IChTdHJpbmcpIG1lc3NhZ2VJbmZvLmdldE1ldGFEYXRhKENPTlRFTlRfTkVHT1RJQVRJT05fUFJPUEVSVFkpOwotICAgICAgICAgICAgWE1MTWVzc2FnZSBtZXNzYWdlID0gbmV3IFhNTE1lc3NhZ2Uoc291cmNlLCBjb25uZWcgPT0gIm9wdGltaXN0aWMiKTsKLSAgICAgICAgICAgIHNldFN0YXR1cyhjb24sIFdTQ29ubmVjdGlvbi5JTlRFUk5BTF9FUlIpOwotICAgICAgICAgICAgc2VuZChjb24sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SGVhZGVycyhXU0Nvbm5lY3Rpb24gY29uKSB7Ci0gICAgICAgIHJldHVybiBjb24uZ2V0SGVhZGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgcmVzcG9uc2UgaGVhZGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVhZGVycyhXU0Nvbm5lY3Rpb24gY29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycykgewotICAgICAgICBjb24uc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKFdTQ29ubmVjdGlvbiBjb24sIGludCBzdGF0dXMpIHsKLSAgICAgICAgY29uLnNldFN0YXR1cyhzdGF0dXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1NFUlZFUl9FUlJPUiA9Ci0gICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PiIKLSAgICAgICAgICAgICsgIjxlcnI+SW50ZXJuYWwgU2VydmVyIEVycm9yPC9lcnI+IjsKLQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9leGNlcHRpb24vSkFYV1NFeGNlcHRpb25CYXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2V4Y2VwdGlvbi9KQVhXU0V4Y2VwdGlvbkJhc2UuamF2YQppbmRleCBjZjA2OTZlLi45ZjQyNTM4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2V4Y2VwdGlvbi9KQVhXU0V4Y2VwdGlvbkJhc2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2V4Y2VwdGlvbi9KQVhXU0V4Y2VwdGlvbkJhc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw3ICsyNiw5IEBACiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuZXhjZXB0aW9uOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5sb2NhbGl6YXRpb24uTG9jYWxpemFibGVJbXBsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwubG9jYWxpemF0aW9uLkxvY2FsaXplcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbi5OdWxsTG9jYWxpemFibGU7CiAKIGltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKIApAQCAtMzksMjMgKzQxLDQyIEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSkFYV1NFeGNlcHRpb25CYXNlCiAgICAgZXh0ZW5kcyBXZWJTZXJ2aWNlRXhjZXB0aW9uIGltcGxlbWVudHMgTG9jYWxpemFibGUgewogCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJnczsKKyAgICBwcml2YXRlIGZpbmFsIExvY2FsaXphYmxlIG1zZzsKIAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogICAgICBTaG91bGQgdXNlIHRoZSBsb2NhbGl6YWJsZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLgorICAgICAqLwogICAgIHByb3RlY3RlZCBKQVhXU0V4Y2VwdGlvbkJhc2UoU3RyaW5nIGtleSwgT2JqZWN0Li4uIGFyZ3MpIHsKICAgICAgICAgc3VwZXIoZmluZE5lc3RlZEV4Y2VwdGlvbihhcmdzKSk7Ci0gICAgICAgIGlmKGFyZ3M9PW51bGwpICBhcmdzID0gbmV3IE9iamVjdFswXTsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgICAgIHRoaXMubXNnID0gbmV3IExvY2FsaXphYmxlSW1wbChrZXksZml4TnVsbChhcmdzKSxnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCkpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIEpBWFdTRXhjZXB0aW9uQmFzZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgbXNnPW51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZml4TnVsbChPYmplY3RbXSB4KSB7CisgICAgICAgIGlmKHg9PW51bGwpICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgIHJldHVybiB4OwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEpBWFdTRXhjZXB0aW9uQmFzZShUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKHRocm93YWJsZSk7Ci0gICAgICAgIHRoaXMua2V5ID0gTG9jYWxpemFibGUuTk9UX0xPQ0FMSVpBQkxFOwotICAgICAgICB0aGlzLmFyZ3MgPSBuZXcgT2JqZWN0W117dGhyb3dhYmxlLnRvU3RyaW5nKCl9OworICAgICAgICB0aGlzKG5ldyBOdWxsTG9jYWxpemFibGUodGhyb3dhYmxlLnRvU3RyaW5nKCkpLHRocm93YWJsZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEpBWFdTRXhjZXB0aW9uQmFzZShMb2NhbGl6YWJsZSBtc2cpIHsKKyAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEpBWFdTRXhjZXB0aW9uQmFzZShMb2NhbGl6YWJsZSBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgICAgIHRoaXMubXNnID0gbXNnOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSBmaW5kTmVzdGVkRXhjZXB0aW9uKE9iamVjdFtdIGFyZ3MpIHsKQEAgLTY4LDIyICs4OSwyOSBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXJndW1lbnRzKCkgewotICAgICAgICByZXR1cm4gYXJnczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyBmb3IgZGVidWcgcHVycG9zZXMgb25seQotICAgICAgICAvL3JldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgKCIgKyBnZXRLZXkoKSArICIpIjsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CiAgICAgICAgIExvY2FsaXplciBsb2NhbGl6ZXIgPSBuZXcgTG9jYWxpemVyKCk7CiAgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUodGhpcyk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCByZXNvdXJjZSBidW5kbGUgbmFtZSBmb3IgdGhpcyBraW5kIG9mIGV4Y2VwdGlvbi4KKyAgICAgKiBVc2VkIGZvciB7QGxpbmsgI0pBWFdTRXhjZXB0aW9uQmFzZShTdHJpbmcsIE9iamVjdFtdKX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVOYW1lKCk7CisKKy8vCisvLyBMb2NhbGl6YWJsZSBkZWxlZ2F0aW9uCisvLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4gbXNnLmdldEtleSgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXRBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBtc2cuZ2V0QXJndW1lbnRzKCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtc2cuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9leGNlcHRpb24vTG9jYXRhYmxlV2ViU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9leGNlcHRpb24vTG9jYXRhYmxlV2ViU2VydmljZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjdiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2V4Y2VwdGlvbi9Mb2NhdGFibGVXZWJTZXJ2aWNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmV4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLlV0aWxNZXNzYWdlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTG9jYXRvckltcGw7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICoge0BsaW5rIFdlYlNlcnZpY2VFeGNlcHRpb259IHdpdGggc291cmNlIGxvY2F0aW9uIGluZm9ybWFpdG9uLgorICoKKyAqIDxwPgorICogVGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHVzZWQgd2hlcmV2ZXIgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwKKyAqIHNvIHRoYXQgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIGNhcnJpZWQgZm9yd2FyZCB0byB1c2VycyAodG8gYXNzaXN0CisgKiBlcnJvciBkaWFnbm9zdGljcy4pCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgTG9jYXRhYmxlV2ViU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIFdlYlNlcnZpY2VFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIExvY2F0aW9ucyByZWxhdGVkIHRvIGVycm9yLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTG9jYXRvcltdIGxvY2F0aW9uOworCisgICAgcHVibGljIExvY2F0YWJsZVdlYlNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIExvY2F0b3IuLi4gbG9jYXRpb24pIHsKKyAgICAgICAgdGhpcyhtZXNzYWdlLG51bGwsbG9jYXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBMb2NhdGFibGVXZWJTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UsIExvY2F0b3IuLi4gbG9jYXRpb24pIHsKKyAgICAgICAgc3VwZXIoYXBwZW5kTG9jYXRpb25JbmZvKG1lc3NhZ2UsbG9jYXRpb24pLCBjYXVzZSk7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYXRhYmxlV2ViU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UsIExvY2F0b3IuLi4gbG9jYXRpb24pIHsKKyAgICAgICAgdGhpcyhjYXVzZS50b1N0cmluZygpLGNhdXNlLGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYXRhYmxlV2ViU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgWE1MU3RyZWFtUmVhZGVyIGxvY2F0aW9uU291cmNlKSB7CisgICAgICAgIHRoaXMobWVzc2FnZSx0b0xvY2F0aW9uKGxvY2F0aW9uU291cmNlKSk7CisgICAgfQorCisgICAgcHVibGljIExvY2F0YWJsZVdlYlNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSwgWE1MU3RyZWFtUmVhZGVyIGxvY2F0aW9uU291cmNlKSB7CisgICAgICAgIHRoaXMobWVzc2FnZSxjYXVzZSx0b0xvY2F0aW9uKGxvY2F0aW9uU291cmNlKSk7CisgICAgfQorCisgICAgcHVibGljIExvY2F0YWJsZVdlYlNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBYTUxTdHJlYW1SZWFkZXIgbG9jYXRpb25Tb3VyY2UpIHsKKyAgICAgICAgdGhpcyhjYXVzZSx0b0xvY2F0aW9uKGxvY2F0aW9uU291cmNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9jYXRpb25zIHJlbGF0ZWQgdG8gdGhpcyBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBDYW4gYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOb3ROdWxsIExpc3Q8TG9jYXRvcj4gZ2V0TG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwZW5kTG9jYXRpb25JbmZvKFN0cmluZyBtZXNzYWdlLCBMb2NhdG9yW10gbG9jYXRpb24pIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcihtZXNzYWdlKTsKKyAgICAgICAgZm9yKCBMb2NhdG9yIGxvYyA6IGxvY2F0aW9uICkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKFV0aWxNZXNzYWdlcy5VVElMX0xPQ0FUSU9OKCBsb2MuZ2V0TGluZU51bWJlcigpLCBsb2MuZ2V0U3lzdGVtSWQoKSApKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExvY2F0b3IgdG9Mb2NhdGlvbihYTUxTdHJlYW1SZWFkZXIgeHNyKSB7CisgICAgICAgIExvY2F0b3JJbXBsIGxvYyA9IG5ldyBMb2NhdG9ySW1wbCgpOworICAgICAgICBMb2NhdGlvbiBpbiA9IHhzci5nZXRMb2NhdGlvbigpOworICAgICAgICBsb2Muc2V0U3lzdGVtSWQoaW4uZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIGxvYy5zZXRQdWJsaWNJZChpbi5nZXRQdWJsaWNJZCgpKTsKKyAgICAgICAgbG9jLnNldExpbmVOdW1iZXIoaW4uZ2V0TGluZU51bWJlcigpKTsKKyAgICAgICAgbG9jLnNldENvbHVtbk51bWJlcihpbi5nZXRDb2x1bW5OdW1iZXIoKSk7CisgICAgICAgIHJldHVybiBsb2M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9sb2NhbGl6YXRpb24vTG9jYWxpemFibGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvbG9jYWxpemF0aW9uL0xvY2FsaXphYmxlLmphdmEKaW5kZXggZjQ3MDEyMi4uYmQ4ZGQ3YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9sb2NhbGl6YXRpb24vTG9jYWxpemFibGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2xvY2FsaXphdGlvbi9Mb2NhbGl6YWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvbG9jYWxpemF0aW9uL0xvY2FsaXphYmxlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9sb2NhbGl6YXRpb24vTG9jYWxpemFibGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwYTgyZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvbG9jYWxpemF0aW9uL0xvY2FsaXphYmxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLmxvY2FsaXphdGlvbjsKKworLyoqCisgKiBTdHJhaWdodC1mb3J3YXJkIHtAbGluayBMb2NhbGl6YWJsZX0gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTG9jYWxpemFibGVJbXBsIGltcGxlbWVudHMgTG9jYWxpemFibGUgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGtleTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50czsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWU7CisKKyAgICBwdWJsaWMgTG9jYWxpemFibGVJbXBsKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3VtZW50cywgU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkgeworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisgICAgICAgIHRoaXMucmVzb3VyY2VCdW5kbGVOYW1lID0gcmVzb3VyY2VCdW5kbGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBhcmd1bWVudHM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZUJ1bmRsZU5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9sb2NhbGl6YXRpb24vTG9jYWxpemFibGVNZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2xvY2FsaXphdGlvbi9Mb2NhbGl6YWJsZU1lc3NhZ2UuamF2YQppbmRleCAzZmU5YmUzLi41NzZjYjNmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2xvY2FsaXphdGlvbi9Mb2NhbGl6YWJsZU1lc3NhZ2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2xvY2FsaXphdGlvbi9Mb2NhbGl6YWJsZU1lc3NhZ2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2xvY2FsaXphdGlvbi9Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2xvY2FsaXphdGlvbi9Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5LmphdmEKaW5kZXggNTUzM2FiMC4uYWE4ZTQxNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9sb2NhbGl6YXRpb24vTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvbG9jYWxpemF0aW9uL0xvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL2xvY2FsaXphdGlvbi9Mb2NhbGl6ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvbG9jYWxpemF0aW9uL0xvY2FsaXplci5qYXZhCmluZGV4IGM2NzFhNDEuLmNiYmZhYmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvbG9jYWxpemF0aW9uL0xvY2FsaXplci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvbG9jYWxpemF0aW9uL0xvY2FsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTU2LDYgKzU2LDExIEBACiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBsb2NhbGl6ZShMb2NhbGl6YWJsZSBsKSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBsLmdldEtleSgpOworICAgICAgICBpZiAoa2V5ID09IExvY2FsaXphYmxlLk5PVF9MT0NBTElaQUJMRSkgeworICAgICAgICAgICAgLy8gdGhpcyBtZXNzYWdlIGlzIG5vdCBsb2NhbGl6YWJsZQorICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGwuZ2V0QXJndW1lbnRzKClbMF07CisgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGJ1bmRsZW5hbWUgPSBsLmdldFJlc291cmNlQnVuZGxlTmFtZSgpOwogCiAgICAgICAgIHRyeSB7CkBAIC05NiwxMyArMTAxLDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdE1lc3NhZ2UobCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBsLmdldEtleSgpOwotICAgICAgICAgICAgaWYoa2V5PT1Mb2NhbGl6YWJsZS5OT1RfTE9DQUxJWkFCTEUpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIG1lc3NhZ2UgaXMgbm90IGxvY2FsaXphYmxlCi0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpbC5nZXRBcmd1bWVudHMoKVswXTsKLSAgICAgICAgICAgIH0KLQotCiAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCiAgICAgICAgICAgICAgICAga2V5ID0gInVuZGVmaW5lZCI7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvbG9jYWxpemF0aW9uL051bGxMb2NhbGl6YWJsZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9sb2NhbGl6YXRpb24vTnVsbExvY2FsaXphYmxlLmphdmEKaW5kZXggZThmNTdmMi4uODA0ZmI2MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9sb2NhbGl6YXRpb24vTnVsbExvY2FsaXphYmxlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9sb2NhbGl6YXRpb24vTnVsbExvY2FsaXphYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9waXBlL0R1bXBUdWJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3BpcGUvRHVtcFR1YmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjIwY2MzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9waXBlL0R1bXBUdWJlLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnBpcGU7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZUNsb25lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5oZWxwZXIuQWJzdHJhY3RUdWJlSW1wbDsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworCisvKioKKyAqIHtAbGluayBQaXBlfSB0aGF0IGR1bXBzIG1lc3NhZ2VzIHRoYXQgcGFzcyB0aHJvdWdoLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGNsYXNzIER1bXBUdWJlIGV4dGVuZHMgQWJzdHJhY3RGaWx0ZXJUdWJlSW1wbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBvdXQ7CisKKyAgICBwcml2YXRlIGZpbmFsIFhNTE91dHB1dEZhY3Rvcnkgc3RheE91dDsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICBTcGVjaWZ5IHRoZSBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGlzIHtAbGluayBEdW1wVHViZX0KKyAgICAgKiAgICAgIGluc3RhbmNlLiBUaGlzIHN0cmluZyB3aWxsIGJlIHByaW50ZWQgd2hlbiB0aGlzIHBpcGUKKyAgICAgKiAgICAgIGR1bXBzIG1lc3NhZ2VzLCBhbmQgYWxsb3dzIHBlb3BsZSB0byBkaXN0aW5ndWlzaCB3aGljaAorICAgICAqICAgICAgcGlwZSBpbnN0YW5jZSBpcyBkdW1waW5nIGEgbWVzc2FnZSB3aGVuIG11bHRpcGxlCisgICAgICogICAgICB7QGxpbmsgRHVtcFR1YmV9cyBwcmludCBtZXNzYWdlcyBvdXQuCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgVGhlIG91dHB1dCB0byBzZW5kIGR1bXBzIHRvLgorICAgICAqIEBwYXJhbSBuZXh0CisgICAgICogICAgICBUaGUgbmV4dCB7QGxpbmsgVHViZX0gaW4gdGhlIHBpcGVsaW5lLgorICAgICAqLworICAgIHB1YmxpYyBEdW1wVHViZShTdHJpbmcgbmFtZSwgUHJpbnRTdHJlYW0gb3V0LCBUdWJlIG5leHQpIHsKKyAgICAgICAgc3VwZXIobmV4dCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICB0aGlzLnN0YXhPdXQgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIC8vc3RheE91dC5zZXRQcm9wZXJ0eShYTUxPdXRwdXRGYWN0b3J5LklTX1JFUEFJUklOR19OQU1FU1BBQ0VTLHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIER1bXBUdWJlKER1bXBUdWJlIHRoYXQsIFR1YmVDbG9uZXIgY2xvbmVyKSB7CisgICAgICAgIHN1cGVyKHRoYXQsY2xvbmVyKTsKKyAgICAgICAgdGhpcy5uYW1lID0gdGhhdC5uYW1lOworICAgICAgICB0aGlzLm91dCA9IHRoYXQub3V0OworICAgICAgICB0aGlzLnN0YXhPdXQgPSB0aGF0LnN0YXhPdXQ7CisgICAgfQorCisgICAgcHVibGljIE5leHRBY3Rpb24gcHJvY2Vzc1JlcXVlc3QoUGFja2V0IHJlcXVlc3QpIHsKKyAgICAgICAgZHVtcCgicmVxdWVzdCIscmVxdWVzdCk7CisgICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzUmVxdWVzdChyZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzUmVzcG9uc2UoUGFja2V0IHJlc3BvbnNlKSB7CisgICAgICAgIGR1bXAoInJlc3BvbnNlIixyZXNwb25zZSk7CisgICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoU3RyaW5nIGhlYWRlciwgUGFja2V0IHBhY2tldCkgeworICAgICAgICBvdXQucHJpbnRsbigiPT09PVsiK25hbWUrIjoiK2hlYWRlcisiXT09PT0iKTsKKyAgICAgICAgaWYocGFja2V0LmdldE1lc3NhZ2UoKT09bnVsbCkKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIobm9uZSkiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gc3RheE91dC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIobmV3IFByaW50U3RyZWFtKG91dCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vb3AKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHdyaXRlciA9IGNyZWF0ZUluZGVudGVyKHdyaXRlcik7CisgICAgICAgICAgICAgICAgcGFja2V0LmdldE1lc3NhZ2UoKS5jb3B5KCkud3JpdGVUbyh3cml0ZXIpOworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiPT09PT09PT09PT09Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JhcHMge0BsaW5rIFhNTFN0cmVhbVdyaXRlcn0gYnkgYW4gaW5kZW50YXRpb24gZW5naW5lIGlmIHBvc3NpYmxlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2UgY2FuIGRvIHRoaXMgb25seSB3aGVuIHdlIGhhdmUgPHR0PnN0YXgtdXRpbHMuamFyPC90dD4gaW4gdGhlIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVJbmRlbnRlcihYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoImphdmFuZXQuc3RheHV0aWxzLkluZGVudGluZ1hNTFN0cmVhbVdyaXRlciIpOworICAgICAgICAgICAgQ29uc3RydWN0b3IgYyA9IGNsYXp6LmdldENvbnN0cnVjdG9yKFhNTFN0cmVhbVdyaXRlci5jbGFzcyk7CisgICAgICAgICAgICB3cml0ZXIgPSAoWE1MU3RyZWFtV3JpdGVyKWMubmV3SW5zdGFuY2Uod3JpdGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlmIHN0YXgtdXRpbHMuamFyIGlzIG5vdCBpbiB0aGUgY2xhc3NwYXRoLCB0aGlzIHdpbGwgZmFpbAorICAgICAgICAgICAgLy8gc28sIHdlJ2xsIGp1c3QgaGF2ZSB0byBkbyB3aXRob3V0IGluZGVudGF0aW9uCisgICAgICAgICAgICBpZighd2FyblN0YXhVdGlscykgeworICAgICAgICAgICAgICAgIHdhcm5TdGF4VXRpbHMgPSB0cnVlOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJXQVJOSU5HOiBwdXQgc3RheC11dGlscy5qYXIgdG8gdGhlIGNsYXNzcGF0aCB0byBpbmRlbnQgdGhlIGR1bXAgb3V0cHV0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdyaXRlcjsKKyAgICB9CisKKworICAgIHB1YmxpYyBBYnN0cmFjdFR1YmVJbXBsIGNvcHkoVHViZUNsb25lciBjbG9uZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1wVHViZSh0aGlzLGNsb25lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB3YXJuU3RheFV0aWxzOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9waXBlL1N0YW5kYWxvbmVQaXBlQXNzZW1ibGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3BpcGUvU3RhbmRhbG9uZVBpcGVBc3NlbWJsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjBhMjJiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9waXBlL1N0YW5kYWxvbmVQaXBlQXNzZW1ibGVyLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFlvdXIgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5waXBlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5DbGllbnRQaXBlQXNzZW1ibGVyQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5QaXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlBpcGVsaW5lQXNzZW1ibGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlNlcnZlclBpcGVBc3NlbWJsZXJDb250ZXh0OworCisvKioKKyAqIERlZmF1bHQgUGlwZWxpbmUgYXNzZW1ibGVyIGZvciBKQVgtV1MgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZSBydW50aW1lcy4gSXQKKyAqIGFzc2VtYmxlcyB2YXJpb3VzIHBpcGVzIGludG8gYSBwaXBlbGluZSB0aGF0IGEgbWVzc2FnZSBuZWVkcyB0byBiZSBwYXNzZWQKKyAqIHRocm91Z2guCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYWxvbmVQaXBlQXNzZW1ibGVyIGltcGxlbWVudHMgUGlwZWxpbmVBc3NlbWJsZXIgeworCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgUGlwZSBjcmVhdGVDbGllbnQoQ2xpZW50UGlwZUFzc2VtYmxlckNvbnRleHQgY29udGV4dCkgeworICAgICAgICBQaXBlIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVRyYW5zcG9ydFBpcGUoKTsKKyAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlU2VjdXJpdHlQaXBlKGhlYWQpOworCisgICAgICAgIGlmIChkdW1wKSB7CisgICAgICAgICAgICAvLyBmb3IgZGVidWdnaW5nIGluamVjdCBhIGR1bXAgcGlwZS4gdGhpcyBpcyBsZWZ0IGluIHRoZSBwcm9kdWN0aW9uIGNvZGUsCisgICAgICAgICAgICAvLyBhcyBpdCB3b3VsZCBiZSB2ZXJ5IGhhbmR5IGZvciBhIHRyb3VibGUtc2hvb3RpbmcgYXQgdGhlIHByb2R1Y3Rpb24gc2l0ZS4KKyAgICAgICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZUR1bXBQaXBlKCJjbGllbnQiLCBTeXN0ZW0ub3V0LCBoZWFkKTsKKyAgICAgICAgfQorICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVXc2FQaXBlKGhlYWQpOworICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVDbGllbnRNVVBpcGUoaGVhZCk7CisgICAgICAgIHJldHVybiBjb250ZXh0LmNyZWF0ZUhhbmRsZXJQaXBlKGhlYWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9uIFNlcnZlci1zaWRlLCBIYW5kbGVyQ2hhaW5zIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGlzIGRlcGxveWVkLgorICAgICAqIER1cmluZyBhc3NlbWJsaW5nIHRoZSBQaXBlbGluZXMsIHdlIGNhbiBkZWNpZGUgaWYgd2UgcmVhbGx5IG5lZWQgYQorICAgICAqIFNPQVBIYW5kbGVyUGlwZSBhbmQgTG9naWNhbEhhbmRsZXJQaXBlIGZvciBhIHBhcnRpY3VsYXIgRW5kcG9pbnQuCisgICAgICovCisgICAgcHVibGljIFBpcGUgY3JlYXRlU2VydmVyKFNlcnZlclBpcGVBc3NlbWJsZXJDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgUGlwZSBoZWFkID0gY29udGV4dC5nZXRUZXJtaW5hbFBpcGUoKTsKKyAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlSGFuZGxlclBpcGUoaGVhZCk7CisgICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZU1vbml0b3JpbmdQaXBlKGhlYWQpOworICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVTZXJ2ZXJNVVBpcGUoaGVhZCk7CisgICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVdzYVBpcGUoaGVhZCk7CisgICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVNlY3VyaXR5UGlwZShoZWFkKTsKKyAgICAgICAgcmV0dXJuIGhlYWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJlIHdlIGdvaW5nIHRvIGR1bXAgdGhlIG1lc3NhZ2UgdG8gU3lzdGVtLm91dD8KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGR1bXA7CisKKyAgICBzdGF0aWMgeworICAgICAgICBib29sZWFuIGIgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGIgPSBCb29sZWFuLmdldEJvb2xlYW4oU3RhbmRhbG9uZVBpcGVBc3NlbWJsZXIuY2xhc3MuZ2V0TmFtZSgpKyIuZHVtcCIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gdHJlYXQgaXQgYXMgZmFsc2UKKyAgICAgICAgfQorICAgICAgICBkdW1wID0gYjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3BpcGUvU3RhbmRhbG9uZVR1YmVBc3NlbWJsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvcGlwZS9TdGFuZGFsb25lVHViZUFzc2VtYmxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZWYyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3BpcGUvU3RhbmRhbG9uZVR1YmVBc3NlbWJsZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC5waXBlOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5DbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5TZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVsaW5lQXNzZW1ibGVyOworCisvKioKKyAqIERlZmF1bHQgUGlwZWxpbmUgYXNzZW1ibGVyIGZvciBKQVgtV1MgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZSBydW50aW1lcy4gSXQKKyAqIGFzc2VtYmxlcyB2YXJpb3VzIHBpcGVzIGludG8gYSBwaXBlbGluZSB0aGF0IGEgbWVzc2FnZSBuZWVkcyB0byBiZSBwYXNzZWQKKyAqIHRocm91Z2guCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYWxvbmVUdWJlQXNzZW1ibGVyIGltcGxlbWVudHMgVHViZWxpbmVBc3NlbWJsZXIgeworCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgVHViZSBjcmVhdGVDbGllbnQoQ2xpZW50VHViZUFzc2VtYmxlckNvbnRleHQgY29udGV4dCkgeworICAgICAgICBUdWJlIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVRyYW5zcG9ydFR1YmUoKTsKKyAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlU2VjdXJpdHlUdWJlKGhlYWQpOworICAgICAgICBpZiAoZHVtcCkgeworICAgICAgICAgICAgLy8gZm9yIGRlYnVnZ2luZyBpbmplY3QgYSBkdW1wIHBpcGUuIHRoaXMgaXMgbGVmdCBpbiB0aGUgcHJvZHVjdGlvbiBjb2RlLAorICAgICAgICAgICAgLy8gYXMgaXQgd291bGQgYmUgdmVyeSBoYW5keSBmb3IgYSB0cm91YmxlLXNob290aW5nIGF0IHRoZSBwcm9kdWN0aW9uIHNpdGUuCisgICAgICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVEdW1wVHViZSgiY2xpZW50IiwgU3lzdGVtLm91dCwgaGVhZCk7CisgICAgICAgIH0KKyAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlV3NhVHViZShoZWFkKTsKKyAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlQ2xpZW50TVVUdWJlKGhlYWQpOworICAgICAgICByZXR1cm4gY29udGV4dC5jcmVhdGVIYW5kbGVyVHViZShoZWFkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbiBTZXJ2ZXItc2lkZSwgSGFuZGxlckNoYWlucyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBpdCBpcyBkZXBsb3llZC4KKyAgICAgKiBEdXJpbmcgYXNzZW1ibGluZyB0aGUgUGlwZWxpbmVzLCB3ZSBjYW4gZGVjaWRlIGlmIHdlIHJlYWxseSBuZWVkIGEKKyAgICAgKiBTT0FQSGFuZGxlclBpcGUgYW5kIExvZ2ljYWxIYW5kbGVyUGlwZSBmb3IgYSBwYXJ0aWN1bGFyIEVuZHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBUdWJlIGNyZWF0ZVNlcnZlcihTZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIFR1YmUgaGVhZCA9IGNvbnRleHQuZ2V0VGVybWluYWxUdWJlKCk7CisgICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZUhhbmRsZXJUdWJlKGhlYWQpOworICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVNb25pdG9yaW5nVHViZShoZWFkKTsKKyAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlU2VydmVyTVVUdWJlKGhlYWQpOworICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVXc2FUdWJlKGhlYWQpOworICAgICAgICBpZiAoZHVtcCkgeworICAgICAgICAgICAgLy8gZm9yIGRlYnVnZ2luZyBpbmplY3QgYSBkdW1wIHBpcGUuIHRoaXMgaXMgbGVmdCBpbiB0aGUgcHJvZHVjdGlvbiBjb2RlLAorICAgICAgICAgICAgLy8gYXMgaXQgd291bGQgYmUgdmVyeSBoYW5keSBmb3IgYSB0cm91YmxlLXNob290aW5nIGF0IHRoZSBwcm9kdWN0aW9uIHNpdGUuCisgICAgICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVEdW1wVHViZSgic2VydmVyIiwgU3lzdGVtLm91dCwgaGVhZCk7CisgICAgICAgIH0KKyAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlU2VjdXJpdHlUdWJlKGhlYWQpOworICAgICAgICByZXR1cm4gaGVhZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcmUgd2UgZ29pbmcgdG8gZHVtcCB0aGUgbWVzc2FnZSB0byBTeXN0ZW0ub3V0PworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkdW1wOworCisgICAgc3RhdGljIHsKKyAgICAgICAgYm9vbGVhbiBiID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiID0gQm9vbGVhbi5nZXRCb29sZWFuKFN0YW5kYWxvbmVUdWJlQXNzZW1ibGVyLmNsYXNzLmdldE5hbWUoKSsiLmR1bXAiKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIHRyZWF0IGl0IGFzIGZhbHNlCisgICAgICAgIH0KKyAgICAgICAgZHVtcCA9IGI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9yZXNvdXJjZXMvTWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvcmVzb3VyY2VzL01lc3NhZ2VzX2VuLnByb3BlcnRpZXMKaW5kZXggNjdkODRhNC4uMmJkZDlmOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC9yZXNvdXJjZXMvTWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3Jlc291cmNlcy9NZXNzYWdlc19lbi5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDcgKzIxLDcgQEAKICMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCiAjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAjIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSMgCisjCiAKICMKICMgRW5nbGlzaCBkaWFnbm9zdGljIG1lc3NhZ2VzIChhbmQgZnJhZ21lbnRzKSBmb3IgU3VuJ3MgWE1MIHBhcnNlci4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwvdmVyc2lvbi5wcm9wZXJ0aWVzIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC92ZXJzaW9uLnByb3BlcnRpZXMKaW5kZXggMTA2ZmJhNC4uMjdmMGY3MCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC92ZXJzaW9uLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC92ZXJzaW9uLnByb3BlcnRpZXMKQEAgLTEsNCArMSwyOSBAQAotYnVpbGQtaWQ9YjA4Ci1idWlsZC12ZXJzaW9uPUpBWC1XUyBSSSAyLjBfMDMtYjA4LWZjcwotbWFqb3ItdmVyc2lvbj0yLjBfMDMKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCitidWlsZC1pZD1KQVgtV1MgUkkgMi4xLjEKK2J1aWxkLXZlcnNpb249SkFYLVdTIFJJIDIuMS4xCittYWpvci12ZXJzaW9uPTIuMS4xCiAgCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9DREFUQS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvQ0RBVEEuamF2YQppbmRleCAwOWNlYTQ4Li4xNjVhNTdjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9DREFUQS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL0NEQVRBLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvQ29udGVudEhhbmRsZXJUb1hNTFN0cmVhbVdyaXRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvQ29udGVudEhhbmRsZXJUb1hNTFN0cmVhbVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNjdiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9Db250ZW50SGFuZGxlclRvWE1MU3RyZWFtV3JpdGVyLmphdmEKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbDsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxlIHV0aWxpdHkgY2xhc3MgdGhhdCBhZGFwdHMgU0FYIGV2ZW50cyBpbnRvIFN0QVgKKyAqIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9IGV2ZW50cywgYnJpZGdpbmcgYmV0d2VlbgorICogdGhlIHR3byBwYXJzZXIgdGVjaG5vbG9naWVzLgorICoKKyAqIFRoaXMgQ29udGVudEhhbmRsZXIgZG9lcyBub3Qgb3duIHRoZSBYTUxTdHJlYW1Xcml0ZXIuICBUaGVyZWZvcmUsIGl0IHdpbGwKKyAqIG5vdCBjbG9zZSBvciBmbHVzaCB0aGUgd3JpdGVyIGF0IGFueSBwb2ludC4KKyAqCisgKiBAYXV0aG9yIFJ5YW4uU2hvZW1ha2VyQFN1bi5DT00KKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgQ29udGVudEhhbmRsZXJUb1hNTFN0cmVhbVdyaXRlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKKworICAgIC8vIFNBWCBldmVudHMgd2lsbCBiZSBzZW50IHRvIHRoaXMgWE1MU3RyZWFtV3JpdGVyCisgICAgcHJpdmF0ZSBmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgc3RheFdyaXRlcjsKKworICAgIC8vIHN0b3JhZ2UgZm9yIHByZWZpeCBiaW5kaW5ncworICAgIHByaXZhdGUgZmluYWwgU3RhY2sgcHJlZml4QmluZGluZ3M7CisKKyAgICBwdWJsaWMgQ29udGVudEhhbmRsZXJUb1hNTFN0cmVhbVdyaXRlcihYTUxTdHJlYW1Xcml0ZXIgc3RheENvcmUpIHsKKyAgICAgICAgdGhpcy5zdGF4V3JpdGVyID0gc3RheENvcmU7CisgICAgICAgIHByZWZpeEJpbmRpbmdzID0gbmV3IFN0YWNrKCk7IC8vIGRlZmF1bHQgb2YgMTAgc2VlbXMgcmVhc29uYWJsZQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmREb2N1bWVudCgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0YXhXcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOworICAgICAgICAgICAgc3RheFdyaXRlci5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydERvY3VtZW50KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGF4V3JpdGVyLndyaXRlU3RhcnREb2N1bWVudCgpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0YXhXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJbXSwgaW50LCBpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgY2hhcmFjdGVycyhjaCxzdGFydCxsZW5ndGgpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETzogbm8tb3A/CisKKyAgICAgICAgLy8gSSB0aGluayB3ZSBjYW4gaWdub3JlIHRoZXNlIFNBWCBldmVudHMgYmVjYXVzZSBTdEFYCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgc2NvcGVzIHRoZSBwcmVmaXggYmluZGluZ3MuCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3NraXBwZWRFbnRpdHkoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0YXhXcml0ZXIud3JpdGVFbnRpdHlSZWYobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3NldERvY3VtZW50TG9jYXRvcihvcmcueG1sLnNheC5Mb2NhdG9yKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgLy8gVE9ETzogbm8tb3A/CisgICAgICAgIC8vIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgd2F5IHRvIHBhc3MgbG9jYXRpb24gaW5mbworICAgICAgICAvLyBhbG9uZyB0byB0aGUgWE1MU3RyZWFtV3JpdGVyLiBPbiB0aGUgWE1MRXZlbnRXcml0ZXIgc2lkZSwgeW91CisgICAgICAgIC8vIGNhbiBzZXQgdGhlIGxvY2F0aW9uIGluZm8gb24gdGhlIGV2ZW50IG9iamVjdHMuCisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3Byb2Nlc3NpbmdJbnN0cnVjdGlvbihqYXZhLmxhbmcuU3RyaW5nLAorICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGF4V3JpdGVyLndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7CisgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKgorICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocHJlZml4LmVxdWFscygieG1sIikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlZmVuZCBhZ2FpbnN0IHBhcnNlcnMgdGhhdCBwYXNzIG51bGwgaW4gZm9yICJ4bWxucyIgcHJlZml4CisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgeworICAgICAgICAgICAgcHJlZml4ID0gIiI7CisgICAgICAgIH0KKworICAgICAgICBwcmVmaXhCaW5kaW5ncy5hZGQocHJlZml4KTsKKyAgICAgICAgcHJlZml4QmluZGluZ3MuYWRkKHVyaSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpcyB0aGlzIGFsbCB3ZSBoYXZlIHRvIGRvPworICAgICAgICAgICAgc3RheFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKgorICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKKyAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKKyAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgU3RyaW5nIHFOYW1lLAorICAgICAgICBBdHRyaWJ1dGVzIGF0dHMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGF4V3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KAorICAgICAgICAgICAgICAgIGdldFByZWZpeChxTmFtZSksCisgICAgICAgICAgICAgICAgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSk7CisKKyAgICAgICAgICAgIFN0cmluZyB1cmksIHByZWZpeDsKKyAgICAgICAgICAgIHdoaWxlIChwcmVmaXhCaW5kaW5ncy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHVyaSA9IChTdHJpbmcpcHJlZml4QmluZGluZ3MucG9wKCk7CisgICAgICAgICAgICAgICAgcHJlZml4ID0gKFN0cmluZylwcmVmaXhCaW5kaW5ncy5wb3AoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RheFdyaXRlci5zZXREZWZhdWx0TmFtZXNwYWNlKHVyaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RheFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCB1cmkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRoaXMgbWV0aG9kIGhhbmRsZXMgIiIsIG51bGwsIGFuZCAieG1sbnMiIHByZWZpeGVzIHByb3Blcmx5CisgICAgICAgICAgICAgICAgc3RheFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIHVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlcyhhdHRzKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgU3RBWCB3cml0ZUF0dHJpYnV0ZSBldmVudCBmb3IgZWFjaCBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRzCisgICAgICogICAgICAgICAgICAgICAgYXR0cmlidXRlcyBmcm9tIHRoZSBTQVggZXZlbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KGF0dHMuZ2V0UU5hbWUoaSkpOworICAgICAgICAgICAgaWYoIXByZWZpeC5lcXVhbHMoInhtbG5zIikpIHsgLy8gZGVmZW5kIGFnYWludHMgYnJva2VuIHRyYW5zZm9ybWVycyB0aGF0IHJlcG9ydCB4bWxucyBkZWNscyBhcyBhdHRycworICAgICAgICAgICAgICAgIHN0YXhXcml0ZXIud3JpdGVBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgYXR0cy5nZXRVUkkoaSksCisgICAgICAgICAgICAgICAgICAgIGF0dHMuZ2V0TG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICBhdHRzLmdldFZhbHVlKGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdWxsIHRoZSBwcmVmaXggb2ZmIG9mIHRoZSBzcGVjaWZpZWQgUU5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcU5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgUU5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmVmaXggb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgaW50IGlkeCA9IHFOYW1lLmluZGV4T2YoJzonKTsKKyAgICAgICAgaWYgKGlkeCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHFOYW1lLnN1YnN0cmluZygwLCBpZHgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9EdW1teUxvY2F0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9EdW1teUxvY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzMDA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL0R1bW15TG9jYXRpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWw7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOworCisvKioKKyAqIHtAbGluayBMb2NhdGlvbn0gdGhhdCByZXR1cm5zIG5vIGluZm8uCisgKgorICogQGF1dGhvciBTYW50aWFnby5QZXJpY2FzR2VlcnRzZW5Ac3VuLmNvbQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRHVtbXlMb2NhdGlvbiBpbXBsZW1lbnRzIExvY2F0aW9uIHsKKyAgICBwcml2YXRlIER1bW15TG9jYXRpb24oKSB7fQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2NhdGlvbiBJTlNUQU5DRSA9IG5ldyBEdW1teUxvY2F0aW9uKCk7CisKKyAgICBwdWJsaWMgaW50IGdldENoYXJhY3Rlck9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL05hbWVkTm9kZU1hcEl0ZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9OYW1lZE5vZGVNYXBJdGVyYXRvci5qYXZhCmluZGV4IDlkM2ZjZjMuLjcyNmE2ZDQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL05hbWVkTm9kZU1hcEl0ZXJhdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvTmFtZWROb2RlTWFwSXRlcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9Ob2RlTGlzdEl0ZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9Ob2RlTGlzdEl0ZXJhdG9yLmphdmEKaW5kZXggYzc0N2E5NC4uYmVhMGFmOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvTm9kZUxpc3RJdGVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL05vZGVMaXN0SXRlcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9TdEFYUmVzdWx0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9TdEFYUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMzM2MQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1N0QVhSZXN1bHQuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWw7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7CisKKy8qKgorICogQSBKQVhQIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdH0gaW1wbGVtZW50YXRpb24gdGhhdCBwcm9kdWNlcworICogYSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCB7QGxpbmsgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXJ9IG9yCisgKiB7QGxpbmsgamF2YXgueG1sLnN0cmVhbS5YTUxFdmVudFdyaXRlcn0uCisgKgorICogPHA+CisgKiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBtYXkgbmVlZCB0byBjYWxsIGZsdXNoKCkgb24gdGhlIHVuZGVybHlpbmcKKyAqIFhNTFN0cmVhbVdyaXRlciBvciBYTUxFdmVudFdyaXRlciBhZnRlciB0aGUgdHJhbnNmb3JtIGlzIGNvbXBsZXRlLgorICogPHA+CisgKgorICogVGhlIGZhY3QgdGhhdCBKQVhCUmVzdWx0IGRlcml2ZXMgZnJvbSBTQVhSZXN1bHQgaXMgYW4gaW1wbGVtZW50YXRpb24KKyAqIGRldGFpbC4gVGh1cyBpbiBnZW5lcmFsIGFwcGxpY2F0aW9ucyBhcmUgc3Ryb25nbHkgZGlzY291cmFnZWQgZnJvbQorICogYWNjZXNzaW5nIG1ldGhvZHMgZGVmaW5lZCBvbiBTQVhSZXN1bHQuCisgKgorICogPHA+CisgKiBJbiBwYXJ0aWN1bGFyIGl0IHNoYWxsIG5ldmVyIGF0dGVtcHQgdG8gY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisgKgorICogPHVsPgorICogICAgPGxpPnNldEhhbmRsZXI8L2xpPgorICogICAgPGxpPnNldExleGljYWxIYW5kbGVyPC9saT4KKyAqICAgIDxsaT5zZXRTeXN0ZW1JZDwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPgorICogRXhhbXBsZToKKyAqCisgKiA8cHJlPgorICAgIC8vIGNyZWF0ZSBhIERPTVNvdXJjZQorICAgIERvY3VtZW50IGRvYyA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZSguLi4pOworICAgIFNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7CisKKyAgICAvLyBjcmVhdGUgYSBTdEFYUmVzdWx0CisgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCk7CisgICAgUmVzdWx0IHN0YXhSZXN1bHQgPSBuZXcgU3RBWFJlc3VsdCh3cml0ZXIpOworCisgICAgLy8gcnVuIHRoZSB0cmFuc2Zvcm0KKyAgICBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShkb21Tb3VyY2UsIHN0YXhSZXN1bHQpOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBSeWFuLlNob2VtYWtlckBTdW4uQ09NCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFN0QVhSZXN1bHQgZXh0ZW5kcyBTQVhSZXN1bHQgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdH0gdGhhdCBwcm9kdWNlcworICAgICAqIGEgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQge0BsaW5rIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyfQorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciB0aGUgWE1MU3RyZWFtV3JpdGVyCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWZmIHRoZSB3cml0ZXIgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBTdEFYUmVzdWx0KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgaWYoIHdyaXRlciA9PSBudWxsICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuc2V0SGFuZGxlcihuZXcgQ29udGVudEhhbmRsZXJUb1hNTFN0cmVhbVdyaXRlciggd3JpdGVyICkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1N0QVhTb3VyY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1N0QVhTb3VyY2UuamF2YQppbmRleCBlY2NjZTIzLi45NTQzOThiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9TdEFYU291cmNlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvU3RBWFNvdXJjZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDYgKzI1LDcgQEAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbDsKIAoraW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLlhNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguRFRESGFuZGxlcjsKIGltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKQEAgLTc5LDYgKzgwLDcgQEAKICAqIDwvcHJlPgogICoKICAqIEBhdXRob3IgUnlhbi5TaG9lbWFrZXJAU3VuLkNPTQorICogQHZlcnNpb24gMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTdEFYU291cmNlIGV4dGVuZHMgU0FYU291cmNlIHsKIApAQCAtMjEzLDcgKzIxNSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAotICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBYTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyKHJlYWRlcixyZXBlYXRlcixlYWdlclF1aXQpOworICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBYTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyKHJlYWRlcixyZXBlYXRlcixlYWdlclF1aXQsZmFsc2UpOwogCiAgICAgICAgIHN1cGVyLnNldFhNTFJlYWRlcihwc2V1ZG9QYXJzZXIpOwogICAgICAgICAvLyBwYXNzIGEgZHVtbXkgSW5wdXRTb3VyY2UuIFdlIGRvbid0IGNhcmUKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1hNTFN0cmVhbVJlYWRlckZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvWE1MU3RyZWFtUmVhZGVyRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2YzYxNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1hNTFN0cmVhbVJlYWRlckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWw7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworCisvKioKKyAqIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IHRoYXQgZGVsZWdhdGVzIHRvIGFub3RoZXIge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0uCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzbid0IHZlcnkgdXNlZnVsIGJ5IGl0c2VsZiwgYnV0IHdvcmtzIGFzIGEgYmFzZSBjbGFzcworICogZm9yIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IGZpbHRlcmluZy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxTdHJlYW1SZWFkZXJGaWx0ZXIgaW1wbGVtZW50cyBYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LlJlY3ljbGVBd2FyZSwgWE1MU3RyZWFtUmVhZGVyIHsKKyAgICAvKioKKyAgICAgKiBUaGUgdW5kZXJseWluZyB7QGxpbmsgWE1MU3RyZWFtUmVhZGVyfSB0aGF0IGRvZXMgdGhlIHBhcnNpbmcgb2YgdGhlIHJvb3QgcGFydC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcjsKKworICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXJGaWx0ZXIoWE1MU3RyZWFtUmVhZGVyIGNvcmUpIHsKKyAgICAgICAgdGhpcy5yZWFkZXIgPSBjb3JlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uUmVjeWNsZWQoKSB7CisgICAgICAgIFhNTFN0cmVhbVJlYWRlckZhY3RvcnkucmVjeWNsZShyZWFkZXIpOworICAgICAgICByZWFkZXIgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRFdmVudFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHRMZW5ndGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5uZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkZXIubmV4dFRhZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuaGFzTmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5oYXNOZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5oYXNUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJzKCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmlzQ2hhcmFjdGVycygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5pc0VuZEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuaXNTdGFuZGFsb25lKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuaXNTdGFydEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuaXNXaGl0ZVNwYWNlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5zdGFuZGFsb25lU2V0KCk7CisgICAgfQorCisgICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmlzQXR0cmlidXRlU3BlY2lmaWVkKGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBzb3VyY2VTdGFydCwgY2hhcltdIHRhcmdldCwgaW50IHRhcmdldFN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycyhzb3VyY2VTdGFydCwgdGFyZ2V0LCB0YXJnZXRTdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRFbmNvZGluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldExvY2FsTmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElEYXRhKCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldFBJRGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0UElUYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRQcmVmaXgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRWZXJzaW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZVR5cGUoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZU5hbWUoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZShpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldExvY2F0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgdHlwZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5yZXF1aXJlKHR5cGUsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1hNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1hNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1NDRmYy4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9YTUxTdHJlYW1SZWFkZXJUb0NvbnRlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IGNsYXNzIHRoYXQgYWRhcHRzIFN0QVggZXZlbnRzIGZyb20gYW4KLSAqIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IHRvIFNBWCBldmVudHMgb24gYQotICoge0BsaW5rIENvbnRlbnRIYW5kbGVyfSwgYnJpZGdpbmcgYmV0d2VlbiB0aGUgdHdvCi0gKiBwYXJzZXIgdGVjaG5vbG9naWVzLgotICoKLSAqIEBhdXRob3IgUnlhbi5TaG9lbWFrZXJAU3VuLkNPTQotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RyZWFtUmVhZGVyVG9Db250ZW50SGFuZGxlciB7Ci0KLSAgICAvLyBTdEFYIGV2ZW50IHNvdXJjZQotICAgIHByaXZhdGUgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHN0YXhTdHJlYW1SZWFkZXI7Ci0KLSAgICAvLyBTQVggZXZlbnQgc2luawotICAgIHByaXZhdGUgZmluYWwgQ29udGVudEhhbmRsZXIgc2F4SGFuZGxlcjsKLQotICAgIC8vIGlmIHRydWUsIHdoZW4gdGhlIGNvbnZlcnNpb24gaXMgY29tcGxldGVkLCBsZWF2ZSB0aGUgY3Vyc29yIHRvIHRoZSBsYXN0Ci0gICAgLy8gZXZlbnQgdGhhdCB3YXMgZmlyZWQgKHN1Y2ggYXMgZW5kIGVsZW1lbnQpCi0gICAgcHJpdmF0ZSBib29sZWFuIGVhZ2VyUXVpdDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBTdEFYIHRvIFNBWCBhZGFwdGVyIHRoYXQgd2lsbCBjb252ZXJ0IGEgU3RBWCBldmVudAotICAgICAqIHN0cmVhbSBpbnRvIGEgU0FYIGV2ZW50IHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGF4Q29yZQotICAgICAqICAgICAgICAgICAgICAgIFN0QVggZXZlbnQgc291cmNlCi0gICAgICogQHBhcmFtIHNheENvcmUKLSAgICAgKiAgICAgICAgICAgICAgICBTQVhldmVudCBzaW5rCi0gICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlclRvQ29udGVudEhhbmRsZXIoWE1MU3RyZWFtUmVhZGVyIHN0YXhDb3JlLCBDb250ZW50SGFuZGxlciBzYXhDb3JlLCBib29sZWFuIGVhZ2VyUXVpdCkgewotICAgICAgICB0aGlzLnN0YXhTdHJlYW1SZWFkZXIgPSBzdGF4Q29yZTsKLSAgICAgICAgdGhpcy5zYXhIYW5kbGVyID0gc2F4Q29yZTsKLSAgICAgICAgdGhpcy5lYWdlclF1aXQgPSBlYWdlclF1aXQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFN0QVhSZWFkZXJUb0NvbnRlbnRIYW5kbGVyI2JyaWRnZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnJpZGdlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHJlbWVtYmVycyB0aGUgbmVzdCBsZXZlbCBvZiBlbGVtZW50cyB0byBrbm93IHdoZW4gd2UgYXJlIGRvbmUuCi0gICAgICAgICAgICBpbnQgZGVwdGg9MDsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIHBhcnNlciBpcyBhdCB0aGUgc3RhcnQgdGFnLCBwcm9jZWVkIHRvIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICBpbnQgZXZlbnQgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgaWYoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gbmV4dFRhZyBkb2Vzbid0IGNvcnJlY3RseSBoYW5kbGUgRFREcwotICAgICAgICAgICAgICAgIHdoaWxlKCAhc3RheFN0cmVhbVJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICkKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBzdGF4U3RyZWFtUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBpZiggZXZlbnQhPVhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBjdXJyZW50IGV2ZW50IGlzIG5vdCBTVEFSVF9FTEVNRU5UXG4gYnV0ICIgKyBldmVudCk7Ci0KLSAgICAgICAgICAgIGhhbmRsZVN0YXJ0RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgT1VURVI6Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGFsbCBvZiB0aGUgZXZlbnRzIGxpc3RlZCBpbiB0aGUgamF2YWRvYyBmb3IKLSAgICAgICAgICAgICAgICAvLyBYTUxFdmVudC4KLSAgICAgICAgICAgICAgICAvLyBUaGUgc3BlYyBvbmx5IHJlYWxseSBkZXNjcmliZXMgMTEgb2YgdGhlbS4KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgOgotICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0YXJ0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihkZXB0aD09MCAmJiBlYWdlclF1aXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgT1VURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuQ0hBUkFDVEVSUyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGFyYWN0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5USVRZX1JFRkVSRU5DRSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFbnRpdHlSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBJKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuQ09NTUVOVCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb21tZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRFREIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURURCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkFUVFJJQlVURSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVBdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5OQU1FU1BBQ0UgOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuQ0RBVEEgOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ0RBVEEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5FTlRJVFlfREVDTEFSQVRJT04gOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRW50aXR5RGVjbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLk5PVEFUSU9OX0RFQ0xBUkFUSU9OIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vdGF0aW9uRGVjbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNQQUNFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigicHJvY2Vzc2luZyBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBldmVudD1zdGF4U3RyZWFtUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKGRlcHRoIT0wKTsKLQotICAgICAgICAgICAgaGFuZGxlRW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgc2F4SGFuZGxlci5lbmREb2N1bWVudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNheEhhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKG5ldyBMb2NhdG9yKCkgewotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXhTdHJlYW1SZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRDb2x1bW5OdW1iZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RheFN0cmVhbVJlYWRlci5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXhTdHJlYW1SZWFkZXIuZ2V0TG9jYXRpb24oKS5nZXRQdWJsaWNJZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RheFN0cmVhbVJlYWRlci5nZXRMb2NhdGlvbigpLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBzYXhIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUEkoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNheEhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKAotICAgICAgICAgICAgICAgIHN0YXhTdHJlYW1SZWFkZXIuZ2V0UElUYXJnZXQoKSwKLSAgICAgICAgICAgICAgICBzdGF4U3RyZWFtUmVhZGVyLmdldFBJRGF0YSgpKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ2hhcmFjdGVycygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2F4SGFuZGxlci5jaGFyYWN0ZXJzKAotICAgICAgICAgICAgICAgIHN0YXhTdHJlYW1SZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKSwKLSAgICAgICAgICAgICAgICBzdGF4U3RyZWFtUmVhZGVyLmdldFRleHRTdGFydCgpLAotICAgICAgICAgICAgICAgIHN0YXhTdHJlYW1SZWFkZXIuZ2V0VGV4dExlbmd0aCgpICk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUVuZEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBzdGF4U3RyZWFtUmVhZGVyLmdldE5hbWUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyZSBlbmRFbGVtZW50Ci0gICAgICAgICAgICBzYXhIYW5kbGVyLmVuZEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgcU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgcU5hbWUudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vIGVuZCBuYW1lc3BhY2UgYmluZGluZ3MKLSAgICAgICAgICAgIGludCBuc0NvdW50ID0gc3RheFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5zQ291bnQgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBzdGF4U3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsgLy8gdHJ1ZSBmb3IgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNheEhhbmRsZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTdGFydEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gc3RhcnQgbmFtZXNwYWNlIGJpbmRpbmdzCi0gICAgICAgICAgICBpbnQgbnNDb3VudCA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2F4SGFuZGxlci5zdGFydFByZWZpeE1hcHBpbmcoCi0gICAgICAgICAgICAgICAgICAgIGZpeE51bGwoc3RheFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSkpLAotICAgICAgICAgICAgICAgICAgICBmaXhOdWxsKHN0YXhTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGkpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZpcmUgc3RhcnRFbGVtZW50Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgU3RyaW5nIHJhd25hbWU7Ci0gICAgICAgICAgICBpZihwcmVmaXg9PW51bGwgfHwgcHJlZml4Lmxlbmd0aCgpPT0wKQotICAgICAgICAgICAgICAgIHJhd25hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByYXduYW1lID0gcHJlZml4ICsgJzonICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgc2F4SGFuZGxlci5zdGFydEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgcU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgcmF3bmFtZSwKLSAgICAgICAgICAgICAgICBhdHRycyk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYocz09bnVsbCkgICAgIHJldHVybiAiIjsKLSAgICAgICAgZWxzZSAgICAgICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFNUQVJUX0VMRU1FTlQgb3IgQVRUUklCVVRFCi0gICAgICogU3RBWGV2ZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgU3RBWCBhdHRyaWJ1dGVzIGNvbnZlcnRlZCB0byBhbiBvcmcueG1sLnNheC5BdHRyaWJ1dGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0KLSAgICAgICAgaW50IGV2ZW50VHlwZSA9IHN0YXhTdHJlYW1SZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgIGlmIChldmVudFR5cGUgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkFUVFJJQlVURQotICAgICAgICAgICAgJiYgZXZlbnRUeXBlICE9IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigKLSAgICAgICAgICAgICAgICAiZ2V0QXR0cmlidXRlcygpIGF0dGVtcHRpbmcgdG8gcHJvY2VzczogIiArIGV2ZW50VHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbiBTQVgsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIGF0dHJpYnV0ZXMgYnkgZGVmYXVsdC4KLSAgICAgICAgLy8gKHRoZXJlJ3MgYSBwcm9wZXJ0eSB0byBjb250cm9sIHRoYXQsIGJ1dCBhcyBmYXIgYXMgd2UgYXJlIGNvbmNlcm5lZAotICAgICAgICAvLyB3ZSBkb24ndCB1c2UgaXQuKSBTbyBkb24ndCBhZGQgeG1sbnM6KiB0byBhdHRyaWJ1dGVzLgotCi0gICAgICAgIC8vIGdhdGhlciBub24tbmFtZXNwYWNlIGF0dHJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKLSAgICAgICAgICAgIGlmKHVyaT09bnVsbCkgICB1cmk9IiI7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3RheFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcU5hbWU7Ci0gICAgICAgICAgICBpZihwcmVmaXg9PW51bGwgfHwgcHJlZml4Lmxlbmd0aCgpPT0wKQotICAgICAgICAgICAgICAgIHFOYW1lID0gbG9jYWxOYW1lOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHFOYW1lID0gcHJlZml4ICsgJzonICsgbG9jYWxOYW1lOwotICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEF0dHJpYnV0ZVR5cGUoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzdGF4U3RyZWFtUmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGkpOwotCi0gICAgICAgICAgICBhdHRycy5hZGRBdHRyaWJ1dGUodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYXR0cnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5hbWVzcGFjZSgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgICAgIC8vIG5hbWVzcGFjZSBldmVudHMgZG9uJ3Qgbm9ybWFsbHkgb2NjdXIgb3V0c2lkZSBvZiBhIHN0YXJ0RWxlbWVudAotICAgICAgICAvLyBvciBlbmRFbGVtZW50Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUF0dHJpYnV0ZSgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgICAgIC8vIGF0dHJpYnV0ZSBldmVudHMgZG9uJ3Qgbm9ybWFsbHkgb2NjdXIgb3V0c2lkZSBvZiBhIHN0YXJ0RWxlbWVudAotICAgICAgICAvLyBvciBlbmRFbGVtZW50Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURURCgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgICAgIC8vIGl0IHNlZW1zIGxpa2Ugd2UgbmVlZCB0byBwYXNzIHRoaXMgaW5mbyBhbG9uZywgYnV0IGhvdz8KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29tbWVudCgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUVudGl0eVJlZmVyZW5jZSgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNwYWNlKCkgewotICAgICAgICAvLyBuby1vcCA/Pz8KLSAgICAgICAgLy8gdGhpcyBldmVudCBpcyBsaXN0ZWQgaW4gdGhlIGphdmFkb2MsIGJ1dCBub3QgaW4gdGhlIHNwZWMuCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5vdGF0aW9uRGVjbCgpIHsKLSAgICAgICAgLy8gbm8tb3AgPz8/Ci0gICAgICAgIC8vIHRoaXMgZXZlbnQgaXMgbGlzdGVkIGluIHRoZSBqYXZhZG9jLCBidXQgbm90IGluIHRoZSBzcGVjLgotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFbnRpdHlEZWNsKCkgewotICAgICAgICAvLyBuby1vcCA/Pz8KLSAgICAgICAgLy8gdGhpcyBldmVudCBpcyBsaXN0ZWQgaW4gdGhlIGphdmFkb2MsIGJ1dCBub3QgaW4gdGhlIHNwZWMuCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNEQVRBKCkgewotICAgICAgICAvLyBuby1vcCA/Pz8KLSAgICAgICAgLy8gdGhpcyBldmVudCBpcyBsaXN0ZWQgaW4gdGhlIGphdmFkb2MsIGJ1dCBub3QgaW4gdGhlIHNwZWMuCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvWE1MU3RyZWFtUmVhZGVyVG9YTUxTdHJlYW1Xcml0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1hNTFN0cmVhbVJlYWRlclRvWE1MU3RyZWFtV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjMWRlNwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1hNTFN0cmVhbVJlYWRlclRvWE1MU3RyZWFtV3JpdGVyLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbDsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmF4LnhtbC5YTUxDb25zdGFudHM7CisKKy8qKgorICogUmVhZHMgYSBzdWItdHJlZSBmcm9tIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IGFuZCB3cml0ZXMgdG8ge0BsaW5rIFhNTFN0cmVhbVdyaXRlcn0KKyAqIGFzLWlzLgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBjYW4gYmUgc3ViLWNsYXNzZWQgdG8gaW1wbGVtZW50IGEgc2ltcGxlIHRyYW5zZm9ybWF0aW9uIGxvZ2ljLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgUnlhbiBTaG9lbWFrZXIKKyAqLworcHVibGljIGNsYXNzIFhNTFN0cmVhbVJlYWRlclRvWE1MU3RyZWFtV3JpdGVyIHsKKworICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgaW47CisgICAgcHJvdGVjdGVkIFhNTFN0cmVhbVdyaXRlciBvdXQ7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBvbmUgc3VidHJlZSBhbmQgd3JpdGVzIGl0IG91dC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfSBuZXZlciByZWNlaXZlcyBhIHN0YXJ0L2VuZCBkb2N1bWVudCBldmVudC4KKyAgICAgKiBUaG9zZSBuZWVkIHRvIGJlIHdyaXR0ZW4gc2VwYXJhdGVseSBieSB0aGUgY2FsbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJyaWRnZShYTUxTdHJlYW1SZWFkZXIgaW4sIFhNTFN0cmVhbVdyaXRlciBvdXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBhc3NlcnQgaW4hPW51bGwgJiYgb3V0IT1udWxsOworICAgICAgICB0aGlzLmluID0gaW47CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworCisgICAgICAgIC8vIHJlbWVtYmVycyB0aGUgbmVzdCBsZXZlbCBvZiBlbGVtZW50cyB0byBrbm93IHdoZW4gd2UgYXJlIGRvbmUuCisgICAgICAgIGludCBkZXB0aD0wOworCisgICAgICAgIC8vIGlmIHRoZSBwYXJzZXIgaXMgYXQgdGhlIHN0YXJ0IHRhZywgcHJvY2VlZCB0byB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICBpbnQgZXZlbnQgPSBpbi5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgaWYoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAvLyBuZXh0VGFnIGRvZXNuJ3QgY29ycmVjdGx5IGhhbmRsZSBEVERzCisgICAgICAgICAgICB3aGlsZSggIWluLmlzU3RhcnRFbGVtZW50KCkgKSB7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBpbi5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5DT01NRU5UKQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb21tZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmKCBldmVudCE9WE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgY3VycmVudCBldmVudCBpcyBub3QgU1RBUlRfRUxFTUVOVFxuIGJ1dCAiICsgZXZlbnQpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBhbGwgb2YgdGhlIGV2ZW50cyBsaXN0ZWQgaW4gdGhlIGphdmFkb2MgZm9yCisgICAgICAgICAgICAvLyBYTUxFdmVudC4KKyAgICAgICAgICAgIC8vIFRoZSBzcGVjIG9ubHkgcmVhbGx5IGRlc2NyaWJlcyAxMSBvZiB0aGVtLgorICAgICAgICAgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgOgorICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdGFydEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQgOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVFbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoLS07CisgICAgICAgICAgICAgICAgICAgIGlmKGRlcHRoPT0wKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTIDoKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hhcmFjdGVycygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5FTlRJVFlfUkVGRVJFTkNFIDoKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRW50aXR5UmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT04gOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVQSSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DT01NRU5UIDoKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29tbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5EVEQgOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVEVEQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuQ0RBVEEgOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVDREFUQSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TUEFDRSA6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNwYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigicHJvY2Vzc2luZyBldmVudDogIiArIGV2ZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXZlbnQ9aW4ubmV4dCgpOworICAgICAgICB9IHdoaWxlIChkZXB0aCE9MCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUEkoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKAorICAgICAgICAgICAgaW4uZ2V0UElUYXJnZXQoKSwKKyAgICAgICAgICAgIGluLmdldFBJRGF0YSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFyYWN0ZXJzKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUNoYXJhY3RlcnMoCisgICAgICAgICAgICBpbi5nZXRUZXh0Q2hhcmFjdGVycygpLAorICAgICAgICAgICAgaW4uZ2V0VGV4dFN0YXJ0KCksCisgICAgICAgICAgICBpbi5nZXRUZXh0TGVuZ3RoKCkgKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbmRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdGFydEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5zVXJpID0gaW4uZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIGlmKG5zVXJpPT1udWxsKQorICAgICAgICAgICAgb3V0LndyaXRlU3RhcnRFbGVtZW50KGluLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LndyaXRlU3RhcnRFbGVtZW50KAorICAgICAgICAgICAgICAgIGZpeE51bGwoaW4uZ2V0UHJlZml4KCkpLAorICAgICAgICAgICAgICAgIGluLmdldExvY2FsTmFtZSgpLAorICAgICAgICAgICAgICAgIG5zVXJpCisgICAgICAgICAgICApOworCisgICAgICAgIC8vIHN0YXJ0IG5hbWVzcGFjZSBiaW5kaW5ncworICAgICAgICBpbnQgbnNDb3VudCA9IGluLmdldE5hbWVzcGFjZUNvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBvdXQud3JpdGVOYW1lc3BhY2UoCisgICAgICAgICAgICAgICAgaW4uZ2V0TmFtZXNwYWNlUHJlZml4KGkpLAorICAgICAgICAgICAgICAgIGZpeE51bGwoaW4uZ2V0TmFtZXNwYWNlVVJJKGkpKSk7ICAgIC8vIHplcGh5ciBkb2Vzbid0IGxpa2UgbnVsbCwgSSBkb24ndCBrbm93IHdoYXQgaXMgY29ycmVjdCwgc28ganVzdCBmaXggbnVsbCB0byAiIiBmb3Igbm93CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSBhdHRyaWJ1dGVzCisgICAgICAgIGludCBhdHRDb3VudCA9IGluLmdldEF0dHJpYnV0ZUNvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0Q291bnQ7IGkrKykgeworICAgICAgICAgICAgaGFuZGxlQXR0cmlidXRlKGkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIG91dCB0aGUge0Bjb2RlIGl9LXRoIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCBlbGVtZW50LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVXNlZCBmcm9tIHtAbGluayAjaGFuZGxlU3RhcnRFbGVtZW50KCl9LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUF0dHJpYnV0ZShpbnQgaSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuc1VyaSA9IGluLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9IGluLmdldEF0dHJpYnV0ZVByZWZpeChpKTsKKyAgICAgICAgIGlmIChmaXhOdWxsKG5zVXJpKS5lcXVhbHMoWE1MQ29uc3RhbnRzLlhNTE5TX0FUVFJJQlVURV9OU19VUkkpKSB7CisgICAgICAgICAgICAgLy9JdHMgYSBuYW1lc3BhY2UgZGVjbCwgaWdub3JlIGFzIGl0IGlzIGFscmVhZHkgd3JpdHRlbi4KKyAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisKKyAgICAgICAgaWYobnNVcmk9PW51bGwgfHwgcHJlZml4ID09IG51bGwgfHwgcHJlZml4LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICBpbi5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSksCisgICAgICAgICAgICAgICAgaW4uZ2V0QXR0cmlidXRlVmFsdWUoaSkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQud3JpdGVBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgIG5zVXJpLAorICAgICAgICAgICAgICAgIGluLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKSwKKyAgICAgICAgICAgICAgICBpbi5nZXRBdHRyaWJ1dGVWYWx1ZShpKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURURCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVEVEQoaW4uZ2V0VGV4dCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDb21tZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUNvbW1lbnQoaW4uZ2V0VGV4dCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbnRpdHlSZWZlcmVuY2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlRW50aXR5UmVmKGluLmdldFRleHQoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3BhY2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgaGFuZGxlQ2hhcmFjdGVycygpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUNEQVRBKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUNEYXRhKGluLmdldFRleHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpeE51bGwoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYocz09bnVsbCkgICAgIHJldHVybiAiIjsKKyAgICAgICAgZWxzZSAgICAgICAgICAgIHJldHVybiBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1hNTFN0cmVhbVdyaXRlckZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvWE1MU3RyZWFtV3JpdGVyRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjYWRiNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1hNTFN0cmVhbVdyaXRlckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWw7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc3RyZWFtaW5nLlhNTFN0cmVhbVdyaXRlckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnN0cmVhbWluZy5YTUxTdHJlYW1Xcml0ZXJGYWN0b3J5LlJlY3ljbGVBd2FyZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKKworLyoqCisgKiB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfSB0aGF0IGRlbGVnYXRlcyB0byBhbm90aGVyIHtAbGluayBYTUxTdHJlYW1Xcml0ZXJ9LgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBpc24ndCB2ZXJ5IHVzZWZ1bCBieSBpdHNlbGYsIGJ1dCB3b3JrcyBhcyBhIGJhc2UgY2xhc3MKKyAqIGZvciB7QGxpbmsgWE1MU3RyZWFtV3JpdGVyfSBmaWx0ZXJpbmcuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgY2xhc3MgWE1MU3RyZWFtV3JpdGVyRmlsdGVyIGltcGxlbWVudHMgWE1MU3RyZWFtV3JpdGVyLCBSZWN5Y2xlQXdhcmUgeworICAgIHByb3RlY3RlZCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyOworCisgICAgcHVibGljIFhNTFN0cmVhbVdyaXRlckZpbHRlcihYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKGNoYXJbXSB0ZXh0LCBpbnQgc3RhcnQsIGludCBsZW4pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHRleHQsIHN0YXJ0LCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2UoU3RyaW5nIHVyaSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci5zZXREZWZhdWx0TmFtZXNwYWNlKHVyaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVDRGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUNEYXRhKGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhTdHJpbmcgdGV4dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnModGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVDb21tZW50KFN0cmluZyBkYXRhKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlQ29tbWVudChkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZURURChTdHJpbmcgZHRkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlRFREKGR0ZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZUVtcHR5RWxlbWVudChsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRW50aXR5UmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlRW50aXR5UmVmKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIHZlcnNpb24pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KHZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gd3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci5zZXROYW1lc3BhY2VDb250ZXh0KGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gd3JpdGVyLmdldFByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyB1cmkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4gd3JpdGVyLmdldFByZWZpeCh1cmkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIHVyaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGxvY2FsTmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVFbXB0eUVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBlbmNvZGluZywgU3RyaW5nIHZlcnNpb24pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KGVuY29kaW5nLCB2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlRW1wdHlFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKHByZWZpeCwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJlY3ljbGVkKCkgeworICAgICAgICBYTUxTdHJlYW1Xcml0ZXJGYWN0b3J5LnJlY3ljbGUod3JpdGVyKTsKKyAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9YbWxVdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy91dGlsL3htbC9YbWxVdGlsLmphdmEKaW5kZXggNjAxOWViYS4uY2IwMGU1YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3MvdXRpbC94bWwvWG1sVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3V0aWwveG1sL1htbFV0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwzNSArMjUsMzcgQEAKIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQoraW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54bWwuaW50ZXJuYWwucmVzb2x2ZXIuQ2F0YWxvZ01hbmFnZXI7CitpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhtbC5pbnRlcm5hbC5yZXNvbHZlci50b29scy5DYXRhbG9nUmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlNlcnZlclJ0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOwogaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKIGltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc2VydmVyLlNlcnZlclJ0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuQnl0ZUFycmF5QnVmZmVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueG1sLmludGVybmFsLnJlc29sdmVyLkNhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54bWwuaW50ZXJuYWwucmVzb2x2ZXIudG9vbHMuQ2F0YWxvZ1Jlc29sdmVyOwogaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIAogLyoqCiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KQEAgLTkzLDYgKzk1LDE1IEBACiAgICAgICAgIHJldHVybiBhLmdldFZhbHVlKCk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTlNPck51bGwoCisgICAgICAgIEVsZW1lbnQgZSwKKyAgICAgICAgUU5hbWUgbmFtZSkgeworICAgICAgICBBdHRyIGEgPSBlLmdldEF0dHJpYnV0ZU5vZGVOUyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gYS5nZXRWYWx1ZSgpOworICAgIH0KKwogLyogICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXNUYWdOUyhFbGVtZW50IGUsIFN0cmluZyB0YWcsIFN0cmluZyBuc1VSSSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIGUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKHRhZykKQEAgLTE3Nyw2ICsxODgsOSBAQAogCiAgICAgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgdHJhbnNmb3JtZXIuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBuZXdUcmFuc2Zvcm1lcigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKQEAgLTE4Niw5ICsyMDAsOSBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogR2V0cyBhbiBFbnRpdHlSZXNvbHZlciB1c2luZyBYTUwgY2F0YWxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgY3JlYXRlRW50aXR5UmVzb2x2ZXIoVVJMIGNhdGFsb2dVcmwpIHsKKyAgICAqIEdldHMgYW4gRW50aXR5UmVzb2x2ZXIgdXNpbmcgWE1MIGNhdGFsb2cKKyAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgY3JlYXRlRW50aXR5UmVzb2x2ZXIoQE51bGxhYmxlIFVSTCBjYXRhbG9nVXJsKSB7CiAgICAgICAgIC8vIHNldCB1cCBhIG1hbmFnZXIKICAgICAgICAgQ2F0YWxvZ01hbmFnZXIgbWFuYWdlciA9IG5ldyBDYXRhbG9nTWFuYWdlcigpOwogICAgICAgICBtYW5hZ2VyLnNldElnbm9yZU1pc3NpbmdQcm9wZXJ0aWVzKHRydWUpOwpAQCAtMjMxLDQgKzI0NSwyMCBAQAogCiAgICAgICAgIHJldHVybiBuZXcgQ2F0YWxvZ1Jlc29sdmVyKG1hbmFnZXIpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBFcnJvckhhbmRsZXJ9IHRoYXQgYWx3YXlzIHRyZWF0IHRoZSBlcnJvciBhcyBmYXRhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVycm9ySGFuZGxlciBEUkFDT05JQU5fRVJST1JfSEFORExFUiA9IG5ldyBFcnJvckhhbmRsZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworICAgICAgICB9CisgICAgfTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvV1NETENvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvV1NETENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlYWM3MS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL1dTRExDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogJGF1dGhvcjogSkFYV1MgRGV2ZWxvcG1lbnQgVGVhbQotICovCi1wdWJsaWMgY2xhc3MgV1NETENvbnRleHQgewotICAgIHByaXZhdGUgZmluYWwgVVJMIG9yZ1dzZGxMb2NhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXU0RMRG9jdW1lbnQgd3NkbERvYzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgV1NETENvbnRleHR9IGJ5IHBhcnNpbmcgdGhlIGdpdmVuIHdzZGwgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETENvbnRleHQoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvL211c3QgZ2V0IGJpbmRpbmcgaW5mb3JtYXRpb24KLSAgICAgICAgYXNzZXJ0IGVudGl0eVJlc29sdmVyICE9IG51bGw7Ci0KLSAgICAgICAgaWYgKHdzZGxEb2N1bWVudExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTm8gV1NETCBsb2NhdGlvbiBJbmZvcm1hdGlvbiBwcmVzZW50LCBlcnJvciIpOwotCi0gICAgICAgIG9yZ1dzZGxMb2NhdGlvbiA9IHdzZGxEb2N1bWVudExvY2F0aW9uOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3NkbERvYyA9IFJ1bnRpbWVXU0RMUGFyc2VyLnBhcnNlKHdzZGxEb2N1bWVudExvY2F0aW9uLCBlbnRpdHlSZXNvbHZlcik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0V3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gb3JnV3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ1VSTFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBvcmdXc2RsTG9jYXRpb24uZ2V0UGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRG9jLmdldEZpcnN0U2VydmljZU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICByZXR1cm4gKHdzZGxEb2MuZ2V0U2VydmljZXMoKS5jb250YWluc0tleShzZXJ2aWNlTmFtZSkpOwotICAgIH0KLQotICAgIC8vanVzdCBnZXQgdGhlIGZpcnN0IG9uZSBmb3Igbm93Ci0gICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludChRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJTZXJ2aWNlIHVua25vd24sIGNhbiBub3QgaWRlbnRpZnkgcG9ydHMgZm9yIGFuIHVua25vd24gU2VydmljZS4iKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gd3NkbERvYy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgU3RyaW5nIGVuZHBvaW50ID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFFOYW1lLCBQb3J0Pj4gaXRlciA9IHNlcnZpY2UuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gaXRlci5uZXh0KCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBlbmRwb2ludCA9IHBvcnQuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmRwb2ludCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkVuZHBvaW50IG5vdCBmb3VuZC4gQ2hlY2sgV1NETCBmaWxlIHRvIHZlcmlmeSBlbmRwb2ludCB3YXMgcHJvdmlkZWQuIik7Ci0gICAgICAgIHJldHVybiBlbmRwb2ludDsKLSAgICB9Ci0KLSAgICAvL2p1c3QgZ2V0IHRoZSBmaXJzdCBvbmUgZm9yIG5vdwotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxEb2MuZ2V0Rmlyc3RQb3J0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lEKFFOYW1lIHNlcnZpY2VOYW1lLCBRTmFtZSBwb3J0TmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0V3NkbERvY3VtZW50KCkuZ2V0QmluZGluZ0lkKHNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0bnMpIHsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gdG5zOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGdldFBvcnRzQXNTZXQoUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gd3NkbERvYy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uua2V5U2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydE5hbWUpIHsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gd3NkbERvYy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8UU5hbWUsIFBvcnQ+PiBpdGVyID0gc2VydmljZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSBpdGVyLm5leHQoKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChwb3J0LmdldE5hbWUoKS5lcXVhbHMocG9ydE5hbWUpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEZpcnN0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRG9jLmdldEZpcnN0U2VydmljZU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRBbGxTZXJ2aWNlTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRG9jLmdldFNlcnZpY2VzKCkua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdTRExEb2N1bWVudCBnZXRXc2RsRG9jdW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRG9jOwotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nIGdldFdzZGxCaW5kaW5nKFFOYW1lIHNlcnZpY2UsIFFOYW1lIHBvcnQpIHsKLSAgICAgICAgaWYgKHdzZGxEb2MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gd3NkbERvYy5nZXRCaW5kaW5nKHNlcnZpY2UsIHBvcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnRRTmFtZSkgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSB3c2RsRG9jLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQb3J0IHAgPSBzZXJ2aWNlLmdldChwb3J0UU5hbWUpOwotICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcC5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIk5vIHBvcnRzIGZvdW5kIGZvciBzZXJ2aWNlICIgKyBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiU2VydmljZSB1bmtub3duLCBjYW4gbm90IGlkZW50aWZ5IHBvcnRzIGZvciBhbiB1bmtub3duIFNlcnZpY2UuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0JpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0JpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5NWVjOS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9CaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5Nb2RlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZyBleHRlbmRzIEhhc2hNYXA8U3RyaW5nLCBCaW5kaW5nT3BlcmF0aW9uPiB7Ci0gICAgcHJpdmF0ZSBRTmFtZSBuYW1lOwotICAgIHByaXZhdGUgUU5hbWUgcG9ydFR5cGVOYW1lOwotICAgIHByaXZhdGUgUG9ydFR5cGUgcG9ydFR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYmluZGluZ0lkOwotICAgIHByaXZhdGUgV1NETERvY3VtZW50IHdzZGxEb2M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZpbmFsaXplZCA9IGZhbHNlOwotCi0gICAgcHVibGljIEJpbmRpbmcoUU5hbWUgbmFtZSwgUU5hbWUgcG9ydFR5cGVOYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMucG9ydFR5cGVOYW1lID0gcG9ydFR5cGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UG9ydFR5cGVOYW1lKCl7Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFBvcnRUeXBlIGdldFBvcnRUeXBlKCkgewotICAgICAgICByZXR1cm4gcG9ydFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpIHsKLSAgICAgICAgdGhpcy5wb3J0VHlwZSA9IHBvcnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lkKCkgewotICAgICAgICByZXR1cm4gYmluZGluZ0lkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdJZChTdHJpbmcgYmluZGluZ0lkKSB7Ci0gICAgICAgIHRoaXMuYmluZGluZ0lkID0gYmluZGluZ0lkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxEb2N1bWVudChXU0RMRG9jdW1lbnQgd3NkbERvYykgewotICAgICAgICB0aGlzLndzZGxEb2MgPSB3c2RsRG9jOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJCaW5kaW5nIGdldEJpbmRpbmcoU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIHBhcnQsIE1vZGUgbW9kZSl7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3AgPSBnZXQob3BlcmF0aW9uKTsKLSAgICAgICAgaWYob3AgPT0gbnVsbCl7Ci0gICAgICAgICAgICAvL1RPRE8gdGhyb3cgZXhjZXB0aW9uCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZigoTW9kZS5JTiA9PSBtb2RlKXx8KE1vZGUuSU5PVVQgPT0gbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4gb3AuZ2V0SW5wdXRCaW5kaW5nKHBhcnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gb3AuZ2V0T3V0cHV0QmluZGluZyhwYXJ0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyBiaW5kaW5nIGZvciBhIGdpdmVuIHtAbGluayBCaW5kaW5nT3BlcmF0aW9ufSBhIHdzZGwgcGFydCBhbmQge0BsaW5rIE1vZGV9Ci0gICAgICogQHBhcmFtIG9wICBtdXN0IGJlIG5vbi1udWxsCi0gICAgICogQHBhcmFtIHBhcnQgbXVzdCBiZSBub24tbnVsbAotICAgICAqIEBwYXJhbSBtb2RlIG11c3QgYmUgbm9uLW51bGwKLSAgICAgKiBAcmV0dXJuICBwYXJhbWV0ZXIgQmluZGluZywgbnVsbCB0aGUgYmluZGluZyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyQmluZGluZyBnZXRCaW5kaW5nKEJpbmRpbmdPcGVyYXRpb24gb3AsIFN0cmluZyBwYXJ0LCBNb2RlIG1vZGUpewotICAgICAgICBpZigoTW9kZS5JTiA9PSBtb2RlKXx8KE1vZGUuSU5PVVQgPT0gbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4gb3AuZ2V0SW5wdXRCaW5kaW5nKHBhcnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gb3AuZ2V0T3V0cHV0QmluZGluZyhwYXJ0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKFN0cmluZyBvcGVyYXRpb24sIFN0cmluZyBwYXJ0LCBNb2RlIG1vZGUpewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIG9wID0gZ2V0KG9wZXJhdGlvbik7Ci0gICAgICAgIGlmKE1vZGUuSU4gPT0gbW9kZSkKLSAgICAgICAgICAgIHJldHVybiBvcC5nZXRNaW1lVHlwZUZvcklucHV0UGFydChwYXJ0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG9wLmdldE1pbWVUeXBlRm9yT3V0cHV0UGFydChwYXJ0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZUJpbmRpbmcoKXsKLSAgICAgICAgaWYoIWZpbmFsaXplZCl7Ci0gICAgICAgICAgICB3c2RsRG9jLmZpbmFsaXplQmluZGluZyh0aGlzKTsKLSAgICAgICAgICAgIGZpbmFsaXplZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0JpbmRpbmdPcGVyYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0JpbmRpbmdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwMWFkOS4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9CaW5kaW5nT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLk1vZGU7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEJpbmRpbmdPcGVyYXRpb24gewotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvLyBtYXAgb2Ygd3NkbDpwYXJ0IHRvIHRoZSBiaW5kaW5nCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQYXJhbWV0ZXJCaW5kaW5nPiBpbnB1dFBhcnRzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUGFyYW1ldGVyQmluZGluZz4gb3V0cHV0UGFydHM7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGlucHV0TWltZVR5cGVzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBvdXRwdXRNaW1lVHlwZXM7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhwbGljaXRJbnB1dFNPQVBCb2R5UGFydHMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZXhwbGljaXRPdXRwdXRTT0FQQm9keVBhcnRzID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIEJvb2xlYW4gZW1wdHlJbnB1dEJvZHk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGVtcHR5T3V0cHV0Qm9keTsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUGFydD4gaW5QYXJ0czsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFBhcnQ+IG91dFBhcnRzOwotCi0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHdzZGw6b3BlcmF0aW9uIG5hbWUgcXVhbGlmaWVkIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgaW5wdXRQYXJ0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGFyYW1ldGVyQmluZGluZz4oKTsKLSAgICAgICAgb3V0cHV0UGFydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBhcmFtZXRlckJpbmRpbmc+KCk7Ci0gICAgICAgIGlucHV0TWltZVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIG91dHB1dE1pbWVUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBpblBhcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXJ0PigpOwotICAgICAgICBvdXRQYXJ0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGFydD4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKXsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcnQgZ2V0UGFydChTdHJpbmcgcGFydE5hbWUsIE1vZGUgbW9kZSl7Ci0gICAgICAgIGlmKG1vZGUuZXF1YWxzKE1vZGUuSU4pKXsKLSAgICAgICAgICAgIHJldHVybiBpblBhcnRzLmdldChwYXJ0TmFtZSk7Ci0gICAgICAgIH1lbHNlIGlmKG1vZGUuZXF1YWxzKE1vZGUuT1VUKSl7Ci0gICAgICAgICAgICByZXR1cm4gb3V0UGFydHMuZ2V0KHBhcnROYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJ0KFBhcnQgcGFydCwgTW9kZSBtb2RlKXsKLSAgICAgICAgaWYobW9kZS5lcXVhbHMoTW9kZS5JTikpCi0gICAgICAgICAgICBpblBhcnRzLnB1dChwYXJ0LmdldE5hbWUoKSwgcGFydCk7Ci0gICAgICAgIGVsc2UgaWYobW9kZS5lcXVhbHMoTW9kZS5PVVQpKQotICAgICAgICAgICAgb3V0UGFydHMucHV0KHBhcnQuZ2V0TmFtZSgpLCBwYXJ0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgUGFyYW1ldGVyQmluZGluZz4gZ2V0SW5wdXRQYXJ0cygpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0UGFydHM7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFBhcmFtZXRlckJpbmRpbmc+IGdldE91dHB1dFBhcnRzKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0UGFydHM7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SW5wdXRNaW1lVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dE1pbWVUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRPdXRwdXRNaW1lVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRNaW1lVHlwZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlckJpbmRpbmcgZ2V0SW5wdXRCaW5kaW5nKFN0cmluZyBwYXJ0KXsKLSAgICAgICAgaWYoZW1wdHlJbnB1dEJvZHkgPT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihpbnB1dFBhcnRzLmdldCgiICIpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZW1wdHlJbnB1dEJvZHkgPSB0cnVlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVtcHR5SW5wdXRCb2R5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyYW1ldGVyQmluZGluZyBibG9jayA9IGlucHV0UGFydHMuZ2V0KHBhcnQpOwotICAgICAgICBpZihibG9jayA9PSBudWxsKXsKLSAgICAgICAgICAgIGlmKGV4cGxpY2l0SW5wdXRTT0FQQm9keVBhcnRzIHx8IGVtcHR5SW5wdXRCb2R5KQotICAgICAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXJCaW5kaW5nLlVOQk9VTkQ7Ci0gICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyQmluZGluZy5CT0RZOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJCaW5kaW5nIGdldE91dHB1dEJpbmRpbmcoU3RyaW5nIHBhcnQpewotICAgICAgICBpZihlbXB0eU91dHB1dEJvZHkgPT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihvdXRwdXRQYXJ0cy5nZXQoIiAiKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGVtcHR5T3V0cHV0Qm9keSA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW1wdHlPdXRwdXRCb2R5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyYW1ldGVyQmluZGluZyBibG9jayA9IG91dHB1dFBhcnRzLmdldChwYXJ0KTsKLSAgICAgICAgaWYoYmxvY2sgPT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihleHBsaWNpdE91dHB1dFNPQVBCb2R5UGFydHMgfHwgZW1wdHlPdXRwdXRCb2R5KQotICAgICAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXJCaW5kaW5nLlVOQk9VTkQ7Ci0gICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyQmluZGluZy5CT0RZOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGVGb3JJbnB1dFBhcnQoU3RyaW5nIHBhcnQpewotICAgICAgICByZXR1cm4gaW5wdXRNaW1lVHlwZXMuZ2V0KHBhcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGVGb3JPdXRwdXRQYXJ0KFN0cmluZyBwYXJ0KXsKLSAgICAgICAgcmV0dXJuIG91dHB1dE1pbWVUeXBlcy5nZXQocGFydCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXRFeHBsaWNpdEJvZHlQYXJ0cyhib29sZWFuIGIpIHsKLSAgICAgICAgZXhwbGljaXRJbnB1dFNPQVBCb2R5UGFydHMgPSBiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEV4cGxpY2l0Qm9keVBhcnRzKGJvb2xlYW4gYikgewotICAgICAgICBleHBsaWNpdE91dHB1dFNPQVBCb2R5UGFydHMgPSBiOwotICAgIH0KLQotICAgIFN0cmluZyByZXFOYW1lc3BhY2U7Ci0gICAgU3RyaW5nIHJlc3BOYW1lc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgcnBjbGl0IGdpdmVzIG5hbWVzcGFjZSB2YWx1ZSBvbiBzb2FwYmluZGluZzpib2R5QG5hbWVzcGFjZQotICAgICAqCi0gICAgICogQHJldHVybiAgIG5vbi1udWxsIGZvciBycGNsaXQgYW5kIG51bGwgZm9yIGRvY2xpdAotICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWxlci5SdW50aW1lTW9kZWxlciNwcm9jZXNzUnBjTWV0aG9kKGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkphdmFNZXRob2QsIFN0cmluZywgamF2YXguandzLldlYk1ldGhvZCwgU3RyaW5nLCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QsIGphdmF4Lmp3cy5XZWJTZXJ2aWNlKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE5hbWVzcGFjZSgpewotICAgICAgICByZXR1cm4gcmVxTmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBycGNsaXQgZ2l2ZXMgbmFtZXNwYWNlIHZhbHVlIG9uIHNvYXBiaW5kaW5nOmJvZHlAbmFtZXNwYWNlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgbm9uLW51bGwgZm9yIHJwY2xpdCBhbmQgbnVsbCBmb3IgZG9jbGl0Ci0gICAgICogICAgICAqIEBzZWUgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWxlci5SdW50aW1lTW9kZWxlciNwcm9jZXNzUnBjTWV0aG9kKGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkphdmFNZXRob2QsIFN0cmluZywgamF2YXguandzLldlYk1ldGhvZCwgU3RyaW5nLCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QsIGphdmF4Lmp3cy5XZWJTZXJ2aWNlKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VOYW1lc3BhY2UoKXsKLSAgICAgICAgcmV0dXJuIHJlc3BOYW1lc3BhY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRGVsZWdhdGluZ1BhcnNlckV4dGVuc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRGVsZWdhdGluZ1BhcnNlckV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMTYwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9EZWxlZ2F0aW5nUGFyc2VyRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExCb3VuZE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMQm91bmRQb3J0VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMRmF1bHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETElucHV0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNZXNzYWdlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExPcGVyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE91dHB1dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFNlcnZpY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0OworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICogRGVsZWdhdGUgdG8gYW5vdGhlciB7QGxpbmsgV1NETFBhcnNlckV4dGVuc2lvbn0KKyAqIHVzZWZ1bCBmb3IgdGhlIGJhc2UgY2xhc3MgZm9yIGZpbHRlcmluZy4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2NsYXNzIERlbGVnYXRpbmdQYXJzZXJFeHRlbnNpb24gZXh0ZW5kcyBXU0RMUGFyc2VyRXh0ZW5zaW9uIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgV1NETFBhcnNlckV4dGVuc2lvbiBjb3JlOworCisgICAgcHVibGljIERlbGVnYXRpbmdQYXJzZXJFeHRlbnNpb24oV1NETFBhcnNlckV4dGVuc2lvbiBjb3JlKSB7CisgICAgICAgIHRoaXMuY29yZSA9IGNvcmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb3JlLnN0YXJ0KGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2VBdHRyaWJ1dGVzKFdTRExTZXJ2aWNlIHNlcnZpY2UsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgY29yZS5zZXJ2aWNlQXR0cmlidXRlcyhzZXJ2aWNlLCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNlcnZpY2VFbGVtZW50cyhXU0RMU2VydmljZSBzZXJ2aWNlLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBjb3JlLnNlcnZpY2VFbGVtZW50cyhzZXJ2aWNlLCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcnRBdHRyaWJ1dGVzKFdTRExQb3J0IHBvcnQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgY29yZS5wb3J0QXR0cmlidXRlcyhwb3J0LCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRFbGVtZW50cyhXU0RMUG9ydCBwb3J0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBjb3JlLnBvcnRFbGVtZW50cyhwb3J0LCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uSW5wdXQoV1NETE9wZXJhdGlvbiBvcCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gY29yZS5wb3J0VHlwZU9wZXJhdGlvbklucHV0KG9wLCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uT3V0cHV0KFdTRExPcGVyYXRpb24gb3AsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGNvcmUucG9ydFR5cGVPcGVyYXRpb25PdXRwdXQob3AsIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25GYXVsdChXU0RMT3BlcmF0aW9uIG9wLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBjb3JlLnBvcnRUeXBlT3BlcmF0aW9uRmF1bHQob3AsIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGVmaW5pdGlvbnNFbGVtZW50cyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBjb3JlLmRlZmluaXRpb25zRWxlbWVudHMocmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kaW5nRWxlbWVudHMoV1NETEJvdW5kUG9ydFR5cGUgYmluZGluZywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gY29yZS5iaW5kaW5nRWxlbWVudHMoYmluZGluZywgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiaW5kaW5nQXR0cmlidXRlcyhXU0RMQm91bmRQb3J0VHlwZSBiaW5kaW5nLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGNvcmUuYmluZGluZ0F0dHJpYnV0ZXMoYmluZGluZywgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3J0VHlwZUVsZW1lbnRzKFdTRExQb3J0VHlwZSBwb3J0VHlwZSwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gY29yZS5wb3J0VHlwZUVsZW1lbnRzKHBvcnRUeXBlLCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcnRUeXBlQXR0cmlidXRlcyhXU0RMUG9ydFR5cGUgcG9ydFR5cGUsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgY29yZS5wb3J0VHlwZUF0dHJpYnV0ZXMocG9ydFR5cGUsIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25FbGVtZW50cyhXU0RMT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gY29yZS5wb3J0VHlwZU9wZXJhdGlvbkVsZW1lbnRzKG9wZXJhdGlvbiwgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3J0VHlwZU9wZXJhdGlvbkF0dHJpYnV0ZXMoV1NETE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgY29yZS5wb3J0VHlwZU9wZXJhdGlvbkF0dHJpYnV0ZXMob3BlcmF0aW9uLCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdPcGVyYXRpb25FbGVtZW50cyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBjb3JlLmJpbmRpbmdPcGVyYXRpb25FbGVtZW50cyhvcGVyYXRpb24sIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmluZGluZ09wZXJhdGlvbkF0dHJpYnV0ZXMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBjb3JlLmJpbmRpbmdPcGVyYXRpb25BdHRyaWJ1dGVzKG9wZXJhdGlvbiwgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtZXNzYWdlRWxlbWVudHMoV1NETE1lc3NhZ2UgbXNnLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBjb3JlLm1lc3NhZ2VFbGVtZW50cyhtc2csIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWVzc2FnZUF0dHJpYnV0ZXMoV1NETE1lc3NhZ2UgbXNnLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGNvcmUubWVzc2FnZUF0dHJpYnV0ZXMobXNnLCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uSW5wdXRFbGVtZW50cyhXU0RMSW5wdXQgaW5wdXQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGNvcmUucG9ydFR5cGVPcGVyYXRpb25JbnB1dEVsZW1lbnRzKGlucHV0LCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcnRUeXBlT3BlcmF0aW9uSW5wdXRBdHRyaWJ1dGVzKFdTRExJbnB1dCBpbnB1dCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBjb3JlLnBvcnRUeXBlT3BlcmF0aW9uSW5wdXRBdHRyaWJ1dGVzKGlucHV0LCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uT3V0cHV0RWxlbWVudHMoV1NETE91dHB1dCBvdXRwdXQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGNvcmUucG9ydFR5cGVPcGVyYXRpb25PdXRwdXRFbGVtZW50cyhvdXRwdXQsIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9ydFR5cGVPcGVyYXRpb25PdXRwdXRBdHRyaWJ1dGVzKFdTRExPdXRwdXQgb3V0cHV0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGNvcmUucG9ydFR5cGVPcGVyYXRpb25PdXRwdXRBdHRyaWJ1dGVzKG91dHB1dCwgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3J0VHlwZU9wZXJhdGlvbkZhdWx0RWxlbWVudHMoV1NETEZhdWx0IGZhdWx0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBjb3JlLnBvcnRUeXBlT3BlcmF0aW9uRmF1bHRFbGVtZW50cyhmYXVsdCwgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3J0VHlwZU9wZXJhdGlvbkZhdWx0QXR0cmlidXRlcyhXU0RMRmF1bHQgZmF1bHQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgY29yZS5wb3J0VHlwZU9wZXJhdGlvbkZhdWx0QXR0cmlidXRlcyhmYXVsdCwgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kaW5nT3BlcmF0aW9uSW5wdXRFbGVtZW50cyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBjb3JlLmJpbmRpbmdPcGVyYXRpb25JbnB1dEVsZW1lbnRzKG9wZXJhdGlvbiwgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiaW5kaW5nT3BlcmF0aW9uSW5wdXRBdHRyaWJ1dGVzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgY29yZS5iaW5kaW5nT3BlcmF0aW9uSW5wdXRBdHRyaWJ1dGVzKG9wZXJhdGlvbiwgcmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kaW5nT3BlcmF0aW9uT3V0cHV0RWxlbWVudHMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gY29yZS5iaW5kaW5nT3BlcmF0aW9uT3V0cHV0RWxlbWVudHMob3BlcmF0aW9uLCByZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJpbmRpbmdPcGVyYXRpb25PdXRwdXRBdHRyaWJ1dGVzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgY29yZS5iaW5kaW5nT3BlcmF0aW9uT3V0cHV0QXR0cmlidXRlcyhvcGVyYXRpb24sIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmluZGluZ09wZXJhdGlvbkZhdWx0RWxlbWVudHMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gY29yZS5iaW5kaW5nT3BlcmF0aW9uRmF1bHRFbGVtZW50cyhvcGVyYXRpb24sIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmluZGluZ09wZXJhdGlvbkZhdWx0QXR0cmlidXRlcyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGNvcmUuYmluZGluZ09wZXJhdGlvbkZhdWx0QXR0cmlidXRlcyhvcGVyYXRpb24sIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluaXNoZWQoV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb3JlLmZpbmlzaGVkKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RGaW5pc2hlZChXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGNvcmUucG9zdEZpbmlzaGVkKGNvbnRleHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0VudGl0eVJlc29sdmVyV3JhcHBlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRW50aXR5UmVzb2x2ZXJXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5NmYzMgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0VudGl0eVJlc29sdmVyV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5zdHJlYW1pbmcuWE1MU3RyZWFtUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlRpZHlYTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBXcmFwcyB7QGxpbmsgRW50aXR5UmVzb2x2ZXJ9IGludG8ge0BsaW5rIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcn0uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitmaW5hbCBjbGFzcyBFbnRpdHlSZXNvbHZlcldyYXBwZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBFbnRpdHlSZXNvbHZlciBjb3JlOworCisgICAgcHVibGljIEVudGl0eVJlc29sdmVyV3JhcHBlcihFbnRpdHlSZXNvbHZlciBjb3JlKSB7CisgICAgICAgIHRoaXMuY29yZSA9IGNvcmU7CisgICAgfQorCisgICAgcHVibGljIFBhcnNlciByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IGNvcmUucmVzb2x2ZUVudGl0eShwdWJsaWNJZCxzeXN0ZW1JZCk7CisgICAgICAgIGlmKHNvdXJjZT09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAvLyBkZWZhdWx0CisKKyAgICAgICAgLy8gaWRlYWxseSBlbnRpdHkgcmVzb2x2ZXJzIHNob3VsZCBiZSBnaXZpbmcgdXMgdGhlIHN5c3RlbSBJRCBmb3IgdGhlIHJlc291cmNlCisgICAgICAgIC8vIChvciBvdGhlcndpc2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byByZXNvbHZlIHJlZmVyZW5jZXMgd2l0aGluIHRoaXMgaW1wb3J0ZWQgV1NETCBjb3JyZWN0bHkpLAorICAgICAgICAvLyBidXQgaWYgbm9uZSBpcyBnaXZlbiwgdGhlIHN5c3RlbSBJRCBiZWZvcmUgdGhlIGVudGl0eSByZXNvbHV0aW9uIGlzIGJldHRlciB0aGFuIG5vdGhpbmcuCisgICAgICAgIGlmKHNvdXJjZS5nZXRTeXN0ZW1JZCgpIT1udWxsKQorICAgICAgICAgICAgc3lzdGVtSWQgPSBzb3VyY2UuZ2V0U3lzdGVtSWQoKTsKKworICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChzeXN0ZW1JZCk7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgIHJldHVybiBuZXcgUGFyc2VyKHVybCwKKyAgICAgICAgICAgICAgICBuZXcgVGlkeVhNTFN0cmVhbVJlYWRlcihYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZSh1cmwudG9FeHRlcm5hbEZvcm0oKSwgc3RyZWFtLCB0cnVlKSwgc3RyZWFtKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRXJyb3JIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9FcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY5ZjgyCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworCisKKy8qKgorICogbGlzdGVuIHRvIHN0YXRpYyBlcnJvcnMgZm91bmQgZHVyaW5nIGJ1aWxkaW5nIGEgdGhlIFdTREwgTW9kZWwuCisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGludGVyZmFjZSBFcnJvckhhbmRsZXIgeworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIGEgbm90aWZpY2F0aW9uIGZvciBhbiBlcnJvciBpbiB0aGUgYW5ub3RhdGVkIGNvZGUuCisgICAgICovCisgICAgdm9pZCBlcnJvciggVGhyb3dhYmxlIGUgKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0Zvb2xQcm9vZlBhcnNlckV4dGVuc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvRm9vbFByb29mUGFyc2VyRXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwMmNkMgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL0Zvb2xQcm9vZlBhcnNlckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyOworCisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMQm91bmRPcGVyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kUG9ydFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEZhdWx0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExJbnB1dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMTWVzc2FnZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMT3BlcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExPdXRwdXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETFBvcnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExTZXJ2aWNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlci5XU0RMUGFyc2VyRXh0ZW5zaW9uOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKKworLyoqCisgKiB7QGxpbmsgV1NETFBhcnNlckV4dGVuc2lvbn0gZmlsdGVyIHRoYXQgY2hlY2tzIGlmCisgKiBhbm90aGVyIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufSBpcyBmb2xsb3dpbmcgdGhlIGNvbnRyYWN0LgorICoKKyAqIDxwPgorICogVGhpcyBjb2RlIHByb3RlY3RzIHRoZSBKQVgtV1MgUkkgZnJvbSBicm9rZW4gZXh0ZW5zaW9ucy4KKyAqCisgKiA8cD4KKyAqIEZvciBub3cgaXQganVzdCBjaGVja3MgaWYge0BsaW5rIFhNTFN0cmVhbVJlYWRlcn0gaXMgcGxhY2VkCisgKiBhdCB0aGUgZXhwZWN0ZWQgc3RhcnQvZW5kIGVsZW1lbnQuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitmaW5hbCBjbGFzcyBGb29sUHJvb2ZQYXJzZXJFeHRlbnNpb24gZXh0ZW5kcyBEZWxlZ2F0aW5nUGFyc2VyRXh0ZW5zaW9uIHsKKworICAgIHB1YmxpYyBGb29sUHJvb2ZQYXJzZXJFeHRlbnNpb24oV1NETFBhcnNlckV4dGVuc2lvbiBjb3JlKSB7CisgICAgICAgIHN1cGVyKGNvcmUpOworICAgIH0KKworICAgIHByaXZhdGUgUU5hbWUgcHJlKFhNTFN0cmVhbVJlYWRlciB4c3IpIHsKKyAgICAgICAgcmV0dXJuIHhzci5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHBvc3QoUU5hbWUgdGFnTmFtZSwgWE1MU3RyZWFtUmVhZGVyIHhzciwgYm9vbGVhbiByZXN1bHQpIHsKKyAgICAgICAgaWYoIXRhZ05hbWUuZXF1YWxzKHhzci5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZvdW5kRm9vbCgpOworICAgICAgICBpZihyZXN1bHQpIHsKKyAgICAgICAgICAgIGlmKHhzci5nZXRFdmVudFR5cGUoKSE9WE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKQorICAgICAgICAgICAgICAgIGZvdW5kRm9vbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYoeHNyLmdldEV2ZW50VHlwZSgpIT1YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkKKyAgICAgICAgICAgICAgICBmb3VuZEZvb2woKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBmb3VuZEZvb2woKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiWE1MU3RyZWFtUmVhZGVyIGlzIHBsYWNlZCBhdCB0aGUgd3JvbmcgcGxhY2UgYWZ0ZXIgaW52b2tpbmcgIitjb3JlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXJ2aWNlRWxlbWVudHMoV1NETFNlcnZpY2Ugc2VydmljZSwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gcG9zdChwcmUocmVhZGVyKSxyZWFkZXIsc3VwZXIuc2VydmljZUVsZW1lbnRzKHNlcnZpY2UsIHJlYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRFbGVtZW50cyhXU0RMUG9ydCBwb3J0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBwb3N0KHByZShyZWFkZXIpLHJlYWRlcixzdXBlci5wb3J0RWxlbWVudHMocG9ydCwgcmVhZGVyKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGVmaW5pdGlvbnNFbGVtZW50cyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBwb3N0KHByZShyZWFkZXIpLHJlYWRlcixzdXBlci5kZWZpbml0aW9uc0VsZW1lbnRzKHJlYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdFbGVtZW50cyhXU0RMQm91bmRQb3J0VHlwZSBiaW5kaW5nLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBwb3N0KHByZShyZWFkZXIpLHJlYWRlcixzdXBlci5iaW5kaW5nRWxlbWVudHMoYmluZGluZywgcmVhZGVyKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVFbGVtZW50cyhXU0RMUG9ydFR5cGUgcG9ydFR5cGUsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIHBvc3QocHJlKHJlYWRlcikscmVhZGVyLHN1cGVyLnBvcnRUeXBlRWxlbWVudHMocG9ydFR5cGUsIHJlYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uRWxlbWVudHMoV1NETE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIHBvc3QocHJlKHJlYWRlcikscmVhZGVyLHN1cGVyLnBvcnRUeXBlT3BlcmF0aW9uRWxlbWVudHMob3BlcmF0aW9uLCByZWFkZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudHMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gcG9zdChwcmUocmVhZGVyKSxyZWFkZXIsc3VwZXIuYmluZGluZ09wZXJhdGlvbkVsZW1lbnRzKG9wZXJhdGlvbiwgcmVhZGVyKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWVzc2FnZUVsZW1lbnRzKFdTRExNZXNzYWdlIG1zZywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gcG9zdChwcmUocmVhZGVyKSxyZWFkZXIsc3VwZXIubWVzc2FnZUVsZW1lbnRzKG1zZywgcmVhZGVyKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25JbnB1dEVsZW1lbnRzKFdTRExJbnB1dCBpbnB1dCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gcG9zdChwcmUocmVhZGVyKSxyZWFkZXIsc3VwZXIucG9ydFR5cGVPcGVyYXRpb25JbnB1dEVsZW1lbnRzKGlucHV0LCByZWFkZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3J0VHlwZU9wZXJhdGlvbk91dHB1dEVsZW1lbnRzKFdTRExPdXRwdXQgb3V0cHV0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBwb3N0KHByZShyZWFkZXIpLHJlYWRlcixzdXBlci5wb3J0VHlwZU9wZXJhdGlvbk91dHB1dEVsZW1lbnRzKG91dHB1dCwgcmVhZGVyKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25GYXVsdEVsZW1lbnRzKFdTRExGYXVsdCBmYXVsdCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gcG9zdChwcmUocmVhZGVyKSxyZWFkZXIsc3VwZXIucG9ydFR5cGVPcGVyYXRpb25GYXVsdEVsZW1lbnRzKGZhdWx0LCByZWFkZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kaW5nT3BlcmF0aW9uSW5wdXRFbGVtZW50cyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBzdXBlci5iaW5kaW5nT3BlcmF0aW9uSW5wdXRFbGVtZW50cyhvcGVyYXRpb24sIHJlYWRlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmluZGluZ09wZXJhdGlvbk91dHB1dEVsZW1lbnRzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIHBvc3QocHJlKHJlYWRlcikscmVhZGVyLHN1cGVyLmJpbmRpbmdPcGVyYXRpb25PdXRwdXRFbGVtZW50cyhvcGVyYXRpb24sIHJlYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdPcGVyYXRpb25GYXVsdEVsZW1lbnRzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIHBvc3QocHJlKHJlYWRlcikscmVhZGVyLHN1cGVyLmJpbmRpbmdPcGVyYXRpb25GYXVsdEVsZW1lbnRzKG9wZXJhdGlvbiwgcmVhZGVyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvSW5hY2Nlc3NpYmxlV1NETEV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvSW5hY2Nlc3NpYmxlV1NETEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDgyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9JbmFjY2Vzc2libGVXU0RMRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKKworCisKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIGxpc3Qgb2Yge0BsaW5rIEluYWNjZXNzaWJsZVdTRExFeGNlcHRpb259IHdyYXBwZWQgaW4gb25lIGV4Y2VwdGlvbi4KKyAqCisgKiA8cD4KKyAqIFRoaXMgZXhjZXB0aW9uIGlzIHVzZWQgdG8gcmVwb3J0IGFsbCB0aGUgZXJyb3JzIGR1cmluZyBXU0RMIHBhcnNpbmcgZnJvbSB7QGxpbmsgUnVudGltZVdTRExQYXJzZXIjcGFyc2UoamF2YS5uZXQuVVJMLCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciwgYm9vbGVhbiwgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb25bXSl9CisgKgorICogQGF1dGhvciBWaXZlayBQYW5kZXkKKyAqLworcHVibGljIGNsYXNzIEluYWNjZXNzaWJsZVdTRExFeGNlcHRpb24gZXh0ZW5kcyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUaHJvd2FibGU+IGVycm9yczsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHVibGljIEluYWNjZXNzaWJsZVdTRExFeGNlcHRpb24oTGlzdDxUaHJvd2FibGU+IGVycm9ycykgeworICAgICAgICBzdXBlcihlcnJvcnMuc2l6ZSgpKyIgY291bnRzIG9mIEluYWNjZXNzaWJsZVdTRExFeGNlcHRpb24uXG4iKTsKKyAgICAgICAgYXNzZXJ0ICFlcnJvcnMuaXNFbXB0eSgpIDogInRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGVycm9yIjsKKyAgICAgICAgdGhpcy5lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8VGhyb3dhYmxlPihlcnJvcnMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKKworICAgICAgICBmb3IoIFRocm93YWJsZSBlcnJvciA6IGVycm9ycyApCisgICAgICAgICAgICBzYi5hcHBlbmQoZXJyb3IudG9TdHJpbmcoKSkuYXBwZW5kKCdcbicpOworCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSByZWFkLW9ubHkgbGlzdCBvZiB7QGxpbmsgSW5hY2Nlc3NpYmxlV1NETEV4Y2VwdGlvbn1zCisgICAgICogd3JhcHBlZCBpbiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGEgbm9uLW51bGwgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUaHJvd2FibGU+IGdldEVycm9ycygpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8VGhyb3dhYmxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUaHJvd2FibGU+KCk7CisgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsaXN0LmFkZChlKTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogSWYgYW4gZXJyb3Igd2FzIHJlcG9ydGVkLCB0aHJvdyB0aGUgZXhjZXB0aW9uLgorICAgICAgICAgKiBPdGhlcndpc2UgZXhpdCBub3JtYWxseS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrKCkgdGhyb3dzIEluYWNjZXNzaWJsZVdTRExFeGNlcHRpb24geworICAgICAgICAgICAgaWYobGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgdGhyb3cgbmV3IEluYWNjZXNzaWJsZVdTRExFeGNlcHRpb24obGlzdCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01JTUVDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01JTUVDb25zdGFudHMuamF2YQppbmRleCAxMmUxMjIwLi42N2ZlMjAwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9NSU1FQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTUlNRUNvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDcgKzI3LDcgQEAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiAKLXB1YmxpYyBpbnRlcmZhY2UgTUlNRUNvbnN0YW50cyB7CitpbnRlcmZhY2UgTUlNRUNvbnN0YW50cyB7CiAgICAgLy8gbmFtZXNwYWNlIFVSSXMKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOU19XU0RMX01JTUUgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nV1NETFBhcnNlckV4dGVuc2lvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdXU0RMUGFyc2VyRXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhNGVmZAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01lbWJlclN1Ym1pc3Npb25BZGRyZXNzaW5nV1NETFBhcnNlckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExCb3VuZE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMQm91bmRQb3J0VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMRmVhdHVyZWRPYmplY3Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsLldTRExCb3VuZFBvcnRUeXBlSW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC53c2RsLldTRExPcGVyYXRpb25JbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKKworLyoqCisgKiBNZW1iZXIgU3VibWlzc2lvbiBXUy1BZGRyZXNzaW5nIFJ1bnRpbWUgV1NETCBwYXJzZXIgZXh0ZW5zaW9uCisgKgorICogQGF1dGhvciBBcnVuIEd1cHRhCisgKi8KK3B1YmxpYyBjbGFzcyBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ1dTRExQYXJzZXJFeHRlbnNpb24gZXh0ZW5kcyBXM0NBZGRyZXNzaW5nV1NETFBhcnNlckV4dGVuc2lvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYmluZGluZ0VsZW1lbnRzKFdTRExCb3VuZFBvcnRUeXBlIGJpbmRpbmcsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3NpYmxlRWxlbWVudChyZWFkZXIsIGJpbmRpbmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBvcnRFbGVtZW50cyhXU0RMUG9ydCBwb3J0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzaWJsZUVsZW1lbnQocmVhZGVyLCBwb3J0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkcmVzc2libGVFbGVtZW50KFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFdTRExGZWF0dXJlZE9iamVjdCBiaW5kaW5nKSB7CisgICAgICAgIFFOYW1lIHVhID0gcmVhZGVyLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHVhLmVxdWFscyhBZGRyZXNzaW5nVmVyc2lvbi5NRU1CRVIud3NkbEV4dGVuc2lvblRhZykpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1aXJlZCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShXU0RMQ29uc3RhbnRzLk5TX1dTREwsICJyZXF1aXJlZCIpOworICAgICAgICAgICAgYmluZGluZy5hZGRGZWF0dXJlKG5ldyBNZW1iZXJTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocmVxdWlyZWQpKSk7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgIC8vIFVzaW5nQWRkcmVzc2luZyBpcyBjb25zdW1lZAorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdPcGVyYXRpb25FbGVtZW50cyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3J0VHlwZU9wZXJhdGlvbklucHV0KFdTRExPcGVyYXRpb24gbywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBXU0RMT3BlcmF0aW9uSW1wbCBpbXBsID0gKFdTRExPcGVyYXRpb25JbXBsKW87CisKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IFBhcnNlclV0aWwuZ2V0QXR0cmlidXRlKHJlYWRlciwgQWRkcmVzc2luZ1ZlcnNpb24uTUVNQkVSLndzZGxBY3Rpb25UYWcpOworICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGltcGwuZ2V0SW5wdXQoKS5zZXRBY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgICAgIGltcGwuZ2V0SW5wdXQoKS5zZXREZWZhdWx0QWN0aW9uKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3J0VHlwZU9wZXJhdGlvbk91dHB1dChXU0RMT3BlcmF0aW9uIG8sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgV1NETE9wZXJhdGlvbkltcGwgaW1wbCA9IChXU0RMT3BlcmF0aW9uSW1wbClvOworCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBQYXJzZXJVdGlsLmdldEF0dHJpYnV0ZShyZWFkZXIsIEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUi53c2RsQWN0aW9uVGFnKTsKKyAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpbXBsLmdldE91dHB1dCgpLnNldEFjdGlvbihhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uRmF1bHQoV1NETE9wZXJhdGlvbiBvLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIFdTRExPcGVyYXRpb25JbXBsIGltcGwgPSAoV1NETE9wZXJhdGlvbkltcGwpbzsKKworICAgICAgICBTdHJpbmcgYWN0aW9uID0gUGFyc2VyVXRpbC5nZXRBdHRyaWJ1dGUocmVhZGVyLCBBZGRyZXNzaW5nVmVyc2lvbi5NRU1CRVIud3NkbEFjdGlvblRhZyk7CisgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBQYXJzZXJVdGlsLmdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgIm5hbWUiKTsKKyAgICAgICAgICAgIGltcGwuZ2V0RmF1bHRBY3Rpb25NYXAoKS5wdXQobmFtZSwgYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXRjaEFub255bW91c0RlZmF1bHQoV1NETEJvdW5kUG9ydFR5cGVJbXBsIGJpbmRpbmcpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIEFkZHJlc3NpbmdWZXJzaW9uLk1FTUJFUi53c2RsTnNVcmk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTWVzc2FnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDFmYjM0Li4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL01lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2UgZXh0ZW5kcyBMaW5rZWRIYXNoU2V0PFN0cmluZz57Ci0gICAgcHJpdmF0ZSBRTmFtZSBuYW1lOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgd3NkbDptZXNzYWdlIG5hbWUgYXR0cmlidXRlIHF1YWxpZmllZCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UoUU5hbWUgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9NZXhFbnRpdHlSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTWV4RW50aXR5UmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTVhZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvTWV4RW50aXR5UmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmJ1ZmZlci5YTUxTdHJlYW1CdWZmZXJSZXN1bHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnNlcnZlci5TRERvY3VtZW50U291cmNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS53c2RsLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLkpBWFdTVXRpbHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MudXRpbC54bWwuWG1sVXRpbDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEVudGl0eSByZXNvbHZlciB0aGF0IHdvcmtzIG9uIE1FWCBNZXRhZGF0YQorICoKKyAqIEBhdXRob3IgVml2ZWsgUGFuZGV5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZXhFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFNERG9jdW1lbnRTb3VyY2U+IHdzZGxzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTRERvY3VtZW50U291cmNlPigpOworCisgICAgcHVibGljIE1leEVudGl0eVJlc29sdmVyKExpc3Q8PyBleHRlbmRzIFNvdXJjZT4gd3NkbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gWG1sVXRpbC5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICBmb3IgKFNvdXJjZSBzb3VyY2UgOiB3c2RscykgeworICAgICAgICAgICAgWE1MU3RyZWFtQnVmZmVyUmVzdWx0IHhzYnIgPSBuZXcgWE1MU3RyZWFtQnVmZmVyUmVzdWx0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHhzYnIpOworICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkID0gc291cmNlLmdldFN5c3RlbUlkKCk7CisKKyAgICAgICAgICAgIC8vVE9ETzogY2FuIHdlIGRvIGFueXRoaW5nIGlmIHRoZSBnaXZlbiBtZXggU291cmNlIGhhcyBubyBzeXN0ZW1JZD8KKyAgICAgICAgICAgIGlmKHN5c3RlbUlkICE9IG51bGwpeworICAgICAgICAgICAgICAgIFNERG9jdW1lbnRTb3VyY2UgZG9jID0gU0REb2N1bWVudFNvdXJjZS5jcmVhdGUoSkFYV1NVdGlscy5nZXRGaWxlT3JVUkwoc3lzdGVtSWQpLCB4c2JyLmdldFhNTFN0cmVhbUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICB0aGlzLndzZGxzLnB1dChzeXN0ZW1JZCwgZG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBQYXJzZXIgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKSB7CisgICAgICAgICAgICBTRERvY3VtZW50U291cmNlIHNyYyA9IHdzZGxzLmdldChzeXN0ZW1JZCk7CisgICAgICAgICAgICBpZiAoc3JjICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZXIoc3JjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9QYXJzZXJVdGlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9QYXJzZXJVdGlsLmphdmEKaW5kZXggY2I1ZDE0Mi4uODcxYTEzZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvUGFyc2VyVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1BhcnNlclV0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zOSw2ICszOSw4IEBACiAKIAogLyoqCisgKgorICogVE9ETzogbWFkZSBwdWJsaWMganVzdCBmb3Igbm93CiAgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KICAqLwogcHVibGljIGNsYXNzIFBhcnNlclV0aWwgewpAQCAtNDYsNiArNDgsMTQgQEAKICAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBuYW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgU3RyaW5nIG5zVXJpLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG5zVXJpLCBuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgUU5hbWUgbmFtZSkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlUYWcoWE1MUmVhZGVyIHJlYWRlciwgUU5hbWUgbmFtZSkgewogICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MUmVhZGVyRXhjZXB0aW9uKCJ4bWxyZWFkZXIudW5leHBlY3RlZFN0YXRlLnRhZyIsCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9QYXJ0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9QYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiY2EzZDMuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOwotCi1wdWJsaWMgY2xhc3MgUGFydCB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFBhcmFtZXRlckJpbmRpbmcgYmluZGluZzsKLSAgICBwcml2YXRlIGludCBpbmRleDsKLQotICAgIHB1YmxpYyBQYXJ0KFN0cmluZyBuYW1lLCBQYXJhbWV0ZXJCaW5kaW5nIGJpbmRpbmcsIGludCBpbmRleCkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgewotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvUG9ydC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDNhNWRlLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFBvcnQgewotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzOwotICAgIHByaXZhdGUgUU5hbWUgYmluZGluZ05hbWU7Ci0gICAgcHJpdmF0ZSBCaW5kaW5nIGJpbmRpbmc7Ci0KLSAgICBwdWJsaWMgUG9ydChRTmFtZSBuYW1lLCBRTmFtZSBiaW5kaW5nLCBTdHJpbmcgYWRkcmVzcykgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmJpbmRpbmdOYW1lID0gYmluZGluZzsKLSAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEJpbmRpbmdOYW1lKCkgewotICAgICAgICByZXR1cm4gYmluZGluZ05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgewotICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9Qb3J0VHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NDU1Ny4uMDAwMDAwMAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9Qb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGUgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZywgUG9ydFR5cGVPcGVyYXRpb24+ewotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKLQotICAgIHB1YmxpYyBQb3J0VHlwZShRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1BvcnRUeXBlT3BlcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9Qb3J0VHlwZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODlkZDRiLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1BvcnRUeXBlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBQb3J0VHlwZU9wZXJhdGlvbnsKLSAgICBwcml2YXRlIFFOYW1lIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW1ldGVyT3JkZXI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBpbnB1dE1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvdXRwdXRNZXNzYWdlOwotICAgIHByaXZhdGUgUU5hbWUgZmF1bHRNZXNzYWdlOwotCi0gICAgcHVibGljIFBvcnRUeXBlT3BlcmF0aW9uKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJPcmRlcigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlck9yZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlck9yZGVyKFN0cmluZyBwYXJhbWV0ZXJPcmRlcikgewotICAgICAgICB0aGlzLnBhcmFtZXRlck9yZGVyID0gcGFyYW1ldGVyT3JkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldElucHV0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0TWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dE1lc3NhZ2UoUU5hbWUgaW5wdXRNZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMuaW5wdXRNZXNzYWdlID0gaW5wdXRNZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRPdXRwdXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0TWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRNZXNzYWdlKFFOYW1lIG91dHB1dE1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRNZXNzYWdlID0gb3V0cHV0TWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RmF1bHRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gZmF1bHRNZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0TWVzc2FnZShRTmFtZSBmYXVsdE1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5mYXVsdE1lc3NhZ2UgPSBmYXVsdE1lc3NhZ2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9SdW50aW1lV1NETFBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvUnVudGltZVdTRExQYXJzZXIuamF2YQppbmRleCA3NTg5MDE2Li4xNDAzY2VjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9SdW50aW1lV1NETFBhcnNlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1J1bnRpbWVXU0RMUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMzQgKzI0LDUzIEBACiAgKi8KIAogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5Eb2NJbmZvOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnNlcnZlci5Eb2NJbmZvLkRPQ19UWVBFOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOworCitpbXBvcnQgY29tLnN1bi5pc3RhY2suaW50ZXJuYWwuTm90TnVsbDsKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5OdWxsYWJsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuQmluZGluZ0lEOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5FbmRwb2ludEFkZHJlc3M7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLldTRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETERlc2NyaXB0b3JLaW5kOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuKjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIuUGFyc2VyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuKjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5yZXNvdXJjZXMuQ2xpZW50TWVzc2FnZXM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MucmVzb3VyY2VzLldzZGxtb2RlbE1lc3NhZ2VzOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5Tb3VyY2VSZWFkZXJGYWN0b3J5OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5UaWR5WE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnV0aWwuU2VydmljZUZpbmRlcjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLnhtbC5YbWxVdGlsOwogaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIAoraW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7CiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CiBpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwogaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CiAKKy8qKgorICogUGFyc2VzIFdTREwgYW5kIGJ1aWxkcyB7QGxpbmsgV1NETE1vZGVsfS4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCiBwdWJsaWMgY2xhc3MgUnVudGltZVdTRExQYXJzZXIgewotICAgIHByaXZhdGUgZmluYWwgV1NETERvY3VtZW50IHdzZGxEb2MgPSBuZXcgV1NETERvY3VtZW50KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFdTRExNb2RlbEltcGwgd3NkbERvYzsKICAgICAvKioKICAgICAgKiBUYXJnZXQgbmFtZXNwYWNlIFVSSSBvZiB0aGUgV1NETCB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZy4KICAgICAgKi8KQEAgLTYzLDMxOSArODIsNDgwIEBACiAgICAgLyoqCiAgICAgICogTXVzdCBub3QgYmUgbnVsbC4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEVudGl0eVJlc29sdmVyIHJlc29sdmVyOworICAgIHByaXZhdGUgZmluYWwgWE1MRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXI7CisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufS4gQWx3YXlzIG5vbi1udWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgV1NETFBhcnNlckV4dGVuc2lvbiBleHRlbnNpb25GYWNhZGU7CiAKLSAgICBwdWJsaWMgc3RhdGljIFdTRExEb2N1bWVudCBwYXJzZShVUkwgd3NkbExvYywgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcmVzb2x2ZXIhPW51bGw7Ci0gICAgICAgIFJ1bnRpbWVXU0RMUGFyc2VyIHBhcnNlciA9IG5ldyBSdW50aW1lV1NETFBhcnNlcihyZXNvbHZlcik7Ci0gICAgICAgIHBhcnNlci5wYXJzZVdTREwod3NkbExvYyk7CisgICAgcHJpdmF0ZSBmaW5hbCBXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dEltcGwgY29udGV4dDsKKworICAgIExpc3Q8V1NETFBhcnNlckV4dGVuc2lvbj4gZXh0ZW5zaW9uczsKKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgV1NETCBhbmQgZ2l2ZXMgV1NETE1vZGVsLiBJZiB3c2RsIHBhcmFtZXRlciBpcyBudWxsLCB0aGVuIHdzZGxMb2MgaXMgdXNlZCB0byBnZXQgdGhlIFdTREwuIElmIHRoZSBXU0RMCisgICAgICogZG9jdW1lbnQgY291bGQgbm90IGJlIG9idGFpbmVkIHRoZW4ge0BsaW5rIE1ldGFkYXRhUmVzb2x2ZXJGYWN0b3J5fSBpcyB0cmllZCB0byBnZXQgdGhlIFdTREwgZG9jdW1lbnQsIGlmIG5vdCBmb3VuZAorICAgICAqIHRoZW4gYXMgbGFzdCBvcHRpb24sIGlmIHRoZSB3c2RsTG9jIGhhcyBubyAnP3dzZGwnIGFzIHF1ZXJ5IHBhcmFtZXRlciB0aGVuIGl0IGlzIHRyaWVkIGJ5IGFwcGVuZGluZyAnP3dzZGwnLgorICAgICAqCisgICAgICogQHBhcmFtIHdzZGxMb2MKKyAgICAgKiAgICAgIEVpdGhlciB0aGlzIG9yIDx0dD53c2RsPC90dD4gcGFyYW1ldGVyIG11c3QgYmUgZ2l2ZW4uCisgICAgICogICAgICBOdWxsIGxvY2F0aW9uIG1lYW5zIHRoZSBzeXN0ZW0gd29uJ3QgYmUgYWJsZSB0byByZXNvbHZlIHJlbGF0aXZlIHJlZmVyZW5jZXMgaW4gdGhlIFdTREwsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXU0RMTW9kZWxJbXBsIHBhcnNlKEBOdWxsYWJsZSBVUkwgd3NkbExvYywgQE5vdE51bGwgU291cmNlIHdzZGxTb3VyY2UsIEBOb3ROdWxsIEVudGl0eVJlc29sdmVyIHJlc29sdmVyLCBib29sZWFuIGlzQ2xpZW50U2lkZSwgV1NETFBhcnNlckV4dGVuc2lvbi4uLiBleHRlbnNpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0IHJlc29sdmVyICE9IG51bGw7CisKKyAgICAgICAgUnVudGltZVdTRExQYXJzZXIgd3NkbFBhcnNlciA9IG5ldyBSdW50aW1lV1NETFBhcnNlcih3c2RsU291cmNlLmdldFN5c3RlbUlkKCksIG5ldyBFbnRpdHlSZXNvbHZlcldyYXBwZXIocmVzb2x2ZXIpLCBpc0NsaWVudFNpZGUsIGV4dGVuc2lvbnMpOworICAgICAgICBQYXJzZXIgcGFyc2VyOworICAgICAgICB0cnl7CisgICAgICAgICAgICBwYXJzZXIgPSB3c2RsUGFyc2VyLnJlc29sdmVXU0RMKHdzZGxMb2MsIHdzZGxTb3VyY2UpOworICAgICAgICAgICAgaWYoIWhhc1dTRExEZWZpbml0aW9ucyhwYXJzZXIucGFyc2VyKSl7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihDbGllbnRNZXNzYWdlcy5SVU5USU1FX1dTRExQQVJTRVJfSU5WQUxJRF9XU0RMKHBhcnNlci5zeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuUU5BTUVfREVGSU5JVElPTlMsIHBhcnNlci5wYXJzZXIuZ2V0TmFtZSgpLCBwYXJzZXIucGFyc2VyLmdldExvY2F0aW9uKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWNhdGNoKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIC8vVHJ5IE1FWCBpZiB0aGVyZSBpcyBXU0RMTG9jIGF2YWlsYWJsZQorICAgICAgICAgICAgaWYod3NkbExvYyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICByZXR1cm4gdHJ5V2l0aE1leCh3c2RsUGFyc2VyLCB3c2RsTG9jLCByZXNvbHZlciwgaXNDbGllbnRTaWRlLCBlLCBleHRlbnNpb25zKTsKKworICAgICAgICB9Y2F0Y2goSU9FeGNlcHRpb24gZSl7CisgICAgICAgICAgICAvL1RyeSBNRVggaWYgdGhlcmUgaXMgV1NETExvYyBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmKHdzZGxMb2MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgcmV0dXJuIHRyeVdpdGhNZXgod3NkbFBhcnNlciwgd3NkbExvYywgcmVzb2x2ZXIsIGlzQ2xpZW50U2lkZSwgZSwgZXh0ZW5zaW9ucyk7CisgICAgICAgIH0KKyAgICAgICAgd3NkbFBhcnNlci5wYXJzZVdTREwocGFyc2VyLCBmYWxzZSk7CisgICAgICAgIHdzZGxQYXJzZXIud3NkbERvYy5mcmVlemUoKTsKKyAgICAgICAgd3NkbFBhcnNlci5leHRlbnNpb25GYWNhZGUuZmluaXNoZWQod3NkbFBhcnNlci5jb250ZXh0KTsKKyAgICAgICAgd3NkbFBhcnNlci5leHRlbnNpb25GYWNhZGUucG9zdEZpbmlzaGVkKHdzZGxQYXJzZXIuY29udGV4dCk7CisgICAgICAgIHJldHVybiB3c2RsUGFyc2VyLndzZGxEb2M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgV1NETE1vZGVsSW1wbCB0cnlXaXRoTWV4KEBOb3ROdWxsIFJ1bnRpbWVXU0RMUGFyc2VyIHdzZGxQYXJzZXIsIEBOb3ROdWxsIFVSTCB3c2RsTG9jLCBATm90TnVsbCBFbnRpdHlSZXNvbHZlciByZXNvbHZlciwgYm9vbGVhbiBpc0NsaWVudFNpZGUsIFRocm93YWJsZSBlLCBXU0RMUGFyc2VyRXh0ZW5zaW9uLi4uIGV4dGVuc2lvbnMpIHRocm93cyBTQVhFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5TGlzdDxUaHJvd2FibGU+IGV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFRocm93YWJsZT4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFdTRExNb2RlbEltcGwgd3NkbE1vZGVsID0gIHdzZGxQYXJzZXIucGFyc2VVc2luZ01leCh3c2RsTG9jLCByZXNvbHZlciwgaXNDbGllbnRTaWRlLCBleHRlbnNpb25zKTsKKyAgICAgICAgICAgIGlmKHdzZGxNb2RlbCA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihDbGllbnRNZXNzYWdlcy5GQUlMRURfVE9fUEFSU0Uod3NkbExvYy50b0V4dGVybmFsRm9ybSgpLCBlLmdldE1lc3NhZ2UoKSksIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdzZGxNb2RlbDsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBleGNlcHRpb25zLmFkZChlKTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbnMuYWRkKGUxKTsKKyAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlMSl7CisgICAgICAgICAgICBleGNlcHRpb25zLmFkZChlKTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbnMuYWRkKGUxKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSW5hY2Nlc3NpYmxlV1NETEV4Y2VwdGlvbihleGNlcHRpb25zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFdTRExNb2RlbEltcGwgcGFyc2VVc2luZ01leChATm90TnVsbCBVUkwgd3NkbExvYywgQE5vdE51bGwgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIsIGJvb2xlYW4gaXNDbGllbnRTaWRlLCBXU0RMUGFyc2VyRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucykgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgLy90cnkgTUVYCisgICAgICAgIE1ldGFEYXRhUmVzb2x2ZXIgbWRSZXNvbHZlciA9IG51bGw7CisgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2VEZXNjcmlwdG9yID0gbnVsbDsKKyAgICAgICAgUnVudGltZVdTRExQYXJzZXIgd3NkbFBhcnNlciA9IG51bGw7CisKKyAgICAgICAgLy9DdXJyZW50bHkgd2UgdHJ5IHRoZSBmaXJzdCBhdmFpbGFibGUgTWV0YWRhdGFSZXNvbHZlckZhY3RvcnkgdGhhdCBnaXZlcyB1cyBhIFdTREwgZG9jdW1lbnQKKyAgICAgICAgZm9yIChNZXRhZGF0YVJlc29sdmVyRmFjdG9yeSByZXNvbHZlckZhY3RvcnkgOiBTZXJ2aWNlRmluZGVyLmZpbmQoTWV0YWRhdGFSZXNvbHZlckZhY3RvcnkuY2xhc3MpKSB7CisgICAgICAgICAgICBtZFJlc29sdmVyID0gcmVzb2x2ZXJGYWN0b3J5Lm1ldGFkYXRhUmVzb2x2ZXIocmVzb2x2ZXIpOworICAgICAgICAgICAgc2VydmljZURlc2NyaXB0b3IgPSBtZFJlc29sdmVyLnJlc29sdmUod3NkbExvYy50b1VSSSgpKTsKKyAgICAgICAgICAgIC8vd2UgZ290IHRoZSBTZXJ2aWNlRGVzY3JpcHRvciwgbm93IGJyZWFrCisgICAgICAgICAgICBpZiAoc2VydmljZURlc2NyaXB0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VydmljZURlc2NyaXB0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgU291cmNlPiB3c2RscyA9IHNlcnZpY2VEZXNjcmlwdG9yLmdldFdTRExzKCk7CisgICAgICAgICAgICB3c2RsUGFyc2VyID0gbmV3IFJ1bnRpbWVXU0RMUGFyc2VyKHdzZGxMb2MudG9FeHRlcm5hbEZvcm0oKSwgbmV3IE1leEVudGl0eVJlc29sdmVyKHdzZGxzKSwgaXNDbGllbnRTaWRlLCBleHRlbnNpb25zKTsKKworICAgICAgICAgICAgLy9ub3cgcGFyc2UgdGhlIGZpcnN0IFdTREwgaW4gdGhlIGxpc3QKKyAgICAgICAgICAgIGlmKHdzZGxzLnNpemUoKSA+IDApeworICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IHdzZGxzLmdldCgwKS5nZXRTeXN0ZW1JZCgpOworICAgICAgICAgICAgICAgIFBhcnNlciBwYXJzZXIgPSB3c2RsUGFyc2VyLnJlc29sdmVyLnJlc29sdmVFbnRpdHkobnVsbCwgc3lzdGVtSWQpOworICAgICAgICAgICAgICAgIHdzZGxQYXJzZXIucGFyc2VXU0RMKHBhcnNlciwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vSW5jYXNlIHRoYXQgbWV4IGlzIG5vdCBwcmVzZW50IG9yIGl0IGNvdWxkbid0IGdldCB0aGUgbWV0YWRhdGEsIHRyeSBieSBhcHBlbmRpbmcgP3dzZGwgYW5kIGdpdmUKKyAgICAgICAgLy8gaXQgYSBsYXN0IHNob3QgZWxzZSBmYWlsCisgICAgICAgIGlmIChtZFJlc29sdmVyID09IG51bGwgJiYgKHdzZGxMb2MuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImh0dHAiKSB8fCB3c2RsTG9jLmdldFByb3RvY29sKCkuZXF1YWxzKCJodHRwcyIpKSAmJiAod3NkbExvYy5nZXRRdWVyeSgpID09IG51bGwpKSB7CisgICAgICAgICAgICBTdHJpbmcgdXJsU3RyaW5nID0gd3NkbExvYy50b0V4dGVybmFsRm9ybSgpOworICAgICAgICAgICAgdXJsU3RyaW5nICs9ICI/d3NkbCI7CisgICAgICAgICAgICB3c2RsTG9jID0gbmV3IFVSTCh1cmxTdHJpbmcpOworICAgICAgICAgICAgd3NkbFBhcnNlciA9IG5ldyBSdW50aW1lV1NETFBhcnNlcih3c2RsTG9jLnRvRXh0ZXJuYWxGb3JtKCksbmV3IEVudGl0eVJlc29sdmVyV3JhcHBlcihyZXNvbHZlciksIGlzQ2xpZW50U2lkZSwgZXh0ZW5zaW9ucyk7CisgICAgICAgICAgICBQYXJzZXIgcGFyc2VyID0gcmVzb2x2ZVdTREwod3NkbExvYywgbmV3IFN0cmVhbVNvdXJjZSh3c2RsTG9jLnRvRXh0ZXJuYWxGb3JtKCkpKTsKKyAgICAgICAgICAgIHdzZGxQYXJzZXIucGFyc2VXU0RMKHBhcnNlciwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYod3NkbFBhcnNlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgd3NkbFBhcnNlci53c2RsRG9jLmZyZWV6ZSgpOworICAgICAgICB3c2RsUGFyc2VyLmV4dGVuc2lvbkZhY2FkZS5maW5pc2hlZCh3c2RsUGFyc2VyLmNvbnRleHQpOworICAgICAgICB3c2RsUGFyc2VyLmV4dGVuc2lvbkZhY2FkZS5wb3N0RmluaXNoZWQod3NkbFBhcnNlci5jb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIHdzZGxQYXJzZXIud3NkbERvYzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1dTRExEZWZpbml0aW9ucyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX0RFRklOSVRJT05TKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFdTRExNb2RlbEltcGwgcGFyc2UoWE1MRW50aXR5UmVzb2x2ZXIuUGFyc2VyIHdzZGwsIFhNTEVudGl0eVJlc29sdmVyIHJlc29sdmVyLCBib29sZWFuIGlzQ2xpZW50U2lkZSwgV1NETFBhcnNlckV4dGVuc2lvbi4uLiBleHRlbnNpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0IHJlc29sdmVyICE9IG51bGw7CisgICAgICAgIFJ1bnRpbWVXU0RMUGFyc2VyIHBhcnNlciA9IG5ldyBSdW50aW1lV1NETFBhcnNlciggd3NkbC5zeXN0ZW1JZC50b0V4dGVybmFsRm9ybSgpLCByZXNvbHZlciwgaXNDbGllbnRTaWRlLCBleHRlbnNpb25zKTsKKyAgICAgICAgcGFyc2VyLnBhcnNlV1NETCh3c2RsLCBmYWxzZSk7CisgICAgICAgIHBhcnNlci53c2RsRG9jLmZyZWV6ZSgpOworICAgICAgICBwYXJzZXIuZXh0ZW5zaW9uRmFjYWRlLmZpbmlzaGVkKHBhcnNlci5jb250ZXh0KTsKKyAgICAgICAgcGFyc2VyLmV4dGVuc2lvbkZhY2FkZS5wb3N0RmluaXNoZWQocGFyc2VyLmNvbnRleHQpOwogICAgICAgICByZXR1cm4gcGFyc2VyLndzZGxEb2M7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBGaWxscyBEb2NJbmZvIHdpdGggRG9jdW1lbnQgdHlwZShXU0RMLCBvciBzY2hlbWEpLAotICAgICAqIFNlcnZpY2UgTmFtZSwgUG9ydCBUeXBlIG5hbWUsIHRhcmdldE5hbWVzcGFjZSBmb3IgdGhlIGRvY3VtZW50LgotICAgICAqCi0gICAgICogRG9uJ3QgZm9sbG93IGltcG9ydHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsbERvY0luZm8oRG9jSW5mbyBkb2NJbmZvLCBRTmFtZSBzZXJ2aWNlTmFtZSwKLSAgICAgICAgUU5hbWUgcG9ydFR5cGVOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIFJ1bnRpbWVXU0RMUGFyc2VyKEBOb3ROdWxsIFN0cmluZyBzb3VyY2VMb2NhdGlvbiwgWE1MRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIsIGJvb2xlYW4gaXNDbGllbnRTaWRlLCBXU0RMUGFyc2VyRXh0ZW5zaW9uLi4uIGV4dGVuc2lvbnMpIHsKKyAgICAgICAgdGhpcy53c2RsRG9jID0gc291cmNlTG9jYXRpb24hPW51bGwgPyBuZXcgV1NETE1vZGVsSW1wbChzb3VyY2VMb2NhdGlvbikgOiBuZXcgV1NETE1vZGVsSW1wbCgpOworICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CiAKLSAgICAgICAgUnVudGltZVdTRExQYXJzZXIgcGFyc2VyID0gbmV3IFJ1bnRpbWVXU0RMUGFyc2VyKG51bGwpOwotICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoZG9jSW5mby5nZXREb2MoKSk7CisgICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Q8V1NETFBhcnNlckV4dGVuc2lvbj4oKTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IFdTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0SW1wbCh3c2RsRG9jLCBpc0NsaWVudFNpZGUpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBjcmVhdGVSZWFkZXIoc291cmNlKTsKKyAgICAgICAgLy8gcmVnaXN0ZXIgaGFuZGxlcnMgZm9yIGRlZmF1bHQgZXh0ZW5zaW9ucworICAgICAgICByZWdpc3RlcihuZXcgTWVtYmVyU3VibWlzc2lvbkFkZHJlc3NpbmdXU0RMUGFyc2VyRXh0ZW5zaW9uKCkpOworICAgICAgICByZWdpc3RlcihuZXcgVzNDQWRkcmVzc2luZ1dTRExQYXJzZXJFeHRlbnNpb24oKSk7CisKKyAgICAgICAgZm9yIChXU0RMUGFyc2VyRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKQorICAgICAgICAgICAgcmVnaXN0ZXIoZSk7CisKKyAgICAgICAgdGhpcy5leHRlbnNpb25GYWNhZGUgPSAgbmV3IFdTRExQYXJzZXJFeHRlbnNpb25GYWNhZGUodGhpcy5leHRlbnNpb25zLnRvQXJyYXkobmV3IFdTRExQYXJzZXJFeHRlbnNpb25bMF0pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhcnNlciByZXNvbHZlV1NETChATnVsbGFibGUgVVJMIHdzZGxMb2MsIEBOb3ROdWxsIFNvdXJjZSB3c2RsU291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHN5c3RlbUlkID0gd3NkbFNvdXJjZS5nZXRTeXN0ZW1JZCgpOworCisgICAgICAgIFhNTEVudGl0eVJlc29sdmVyLlBhcnNlciBwYXJzZXIgPSByZXNvbHZlci5yZXNvbHZlRW50aXR5KG51bGwsIHN5c3RlbUlkKTsKKyAgICAgICAgaWYgKHBhcnNlciA9PSBudWxsICYmIHdzZGxMb2MgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyc2VyID0gcmVzb2x2ZXIucmVzb2x2ZUVudGl0eShudWxsLCB3c2RsTG9jLnRvRXh0ZXJuYWxGb3JtKCkpOworCisgICAgICAgIH0KKyAgICAgICAgaWYocGFyc2VyID09IG51bGwpeworICAgICAgICAgICAgaWYod3NkbExvYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBQYXJzZXIod3NkbExvYywgY3JlYXRlUmVhZGVyKHdzZGxMb2MpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBuZXcgUGFyc2VyKHdzZGxMb2MsIGNyZWF0ZVJlYWRlcih3c2RsU291cmNlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKworICAgIHByaXZhdGUgWE1MU3RyZWFtUmVhZGVyIGNyZWF0ZVJlYWRlcihATm90TnVsbCBTb3VyY2Ugc3JjKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUaWR5WE1MU3RyZWFtUmVhZGVyKFNvdXJjZVJlYWRlckZhY3RvcnkuY3JlYXRlU291cmNlUmVhZGVyKHNyYywgdHJ1ZSksIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZUltcG9ydChATm90TnVsbCBVUkwgd3NkbExvYykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IHdzZGxMb2MudG9FeHRlcm5hbEZvcm0oKTsKKyAgICAgICAgWE1MRW50aXR5UmVzb2x2ZXIuUGFyc2VyIHBhcnNlciA9IHJlc29sdmVyLnJlc29sdmVFbnRpdHkobnVsbCwgc3lzdGVtSWQpOworICAgICAgICBpZiAocGFyc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBQYXJzZXIod3NkbExvYywgY3JlYXRlUmVhZGVyKHdzZGxMb2MpKTsKKyAgICAgICAgfQorICAgICAgICBwYXJzZVdTREwocGFyc2VyLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VXU0RMKFBhcnNlciBwYXJzZXIsIGJvb2xlYW4gaW1wb3J0ZWQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gcGFyc2VyLnBhcnNlcjsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcik7CisgICAgICAgICAgICAvLyBhdm9pZCBwcm9jZXNzaW5nIHRoZSBzYW1lIFdTREwgdHdpY2UuCisgICAgICAgICAgICAvLyBpZiBubyBzeXN0ZW0gSUQgaXMgZ2l2ZW4sIHRoZSBjaGVjayB3b24ndCB3b3JrCisgICAgICAgICAgICBpZiAocGFyc2VyLnN5c3RlbUlkICE9IG51bGwgJiYgIWltcG9ydGVkV1NETHMuYWRkKHBhcnNlci5zeXN0ZW1JZC50b0V4dGVybmFsRm9ybSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgICAgIGlmKHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfU0NIRU1BKSl7Ci0gICAgICAgICAgICAgICAgZG9jSW5mby5zZXREb2NUeXBlKERPQ19UWVBFLlNDSEVNQSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRucyA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCBXU0RMQ29uc3RhbnRzLkFUVFJfVE5TKTsKLSAgICAgICAgICAgICAgICBkb2NJbmZvLnNldFRhcmdldE5hbWVzcGFjZSh0bnMpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH1lbHNlIGlmIChyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX0RFRklOSVRJT05TKSkgewotICAgICAgICAgICAgICAgIGRvY0luZm8uc2V0RG9jVHlwZShET0NfVFlQRS5XU0RMKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG5zID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsIFdTRExDb25zdGFudHMuQVRUUl9UTlMpOwotICAgICAgICAgICAgICAgIHBhcnNlci50YXJnZXROYW1lc3BhY2UgPSB0bnM7Ci0gICAgICAgICAgICAgICAgZG9jSW5mby5zZXRUYXJnZXROYW1lc3BhY2UodG5zKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGRvY0luZm8uc2V0RG9jVHlwZShET0NfVFlQRS5PVEhFUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9ET0NVTUVOVCkKKyAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOworCisgICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9ET0NVTUVOVCAmJiByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX1NDSEVNQSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3NkbDppbXBvcnQgY291bGQgYmUgYSBzY2hlbWEuIFJlbGF4aW5nIEJQIFIyMDAxIHJlcXVpcmVtZW50LgorICAgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZyhXc2RsbW9kZWxNZXNzYWdlcy5XU0RMX0lNUE9SVF9TSE9VTERfQkVfV1NETChwYXJzZXIuc3lzdGVtSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy9nZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgc2VydmljZQorICAgICAgICAgICAgU3RyaW5nIHRucyA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCBXU0RMQ29uc3RhbnRzLkFUVFJfVE5TKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IHRuczsKKwogICAgICAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgIT0KICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgIGlmKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UKQorICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9ET0NVTUVOVCkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5RTkFNRV9QT1JUX1RZUEUuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwbiA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCBXU0RMQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0VHlwZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocG9ydFR5cGVOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhwbikgJiYgcG9ydFR5cGVOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhkb2NJbmZvLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY0luZm8uc2V0SGF2aW5nUG9ydFR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOworICAgICAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLlFOQU1FX0lNUE9SVC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VJbXBvcnQocGFyc2VyLnN5c3RlbUlkLCByZWFkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5RTkFNRV9NRVNTQUdFLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZU1lc3NhZ2UocmVhZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuUU5BTUVfUE9SVF9UWVBFLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZVBvcnRUeXBlKHJlYWRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLlFOQU1FX0JJTkRJTkcuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlQmluZGluZyhyZWFkZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5RTkFNRV9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc24gPSBQYXJzZXJVdGlsLmdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgV1NETENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBzcW4gPSBuZXcgUU5hbWUoZG9jSW5mby5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc24pOwotICAgICAgICAgICAgICAgICAgICBpZihzZXJ2aWNlTmFtZS5lcXVhbHMoc3FuKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlU2VydmljZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG9jSW5mby5zZXRTZXJ2aWNlKHBhcnNlci53c2RsRG9jLmdldFNlcnZpY2Uoc3FuKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dChyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlewotICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlU2VydmljZShyZWFkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5kZWZpbml0aW9uc0VsZW1lbnRzKHJlYWRlcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gb2xkVGFyZ2V0TmFtZXNwYWNlOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIFJ1bnRpbWVXU0RMUGFyc2VyKEVudGl0eVJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIHN1cmUgdG8gcmV0dXJuIGEgImZyZXNoIiByZWFkZXIgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCBiZWNhdXNlCi0gICAgICogbW9yZSB0aGFuIG9uZSBhY3RpdmUgcmVhZGVyIG1heSBiZSBuZWVkZWQgd2l0aGluIGEgc2luZ2xlIHRocmVhZAotICAgICAqIHRvIHBhcnNlIGEgV1NETCBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBjcmVhdGVSZWFkZXIoSW5wdXRTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIC8vIENoYXIgc3RyZWFtIGF2YWlsYWJsZT8KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRDaGFyYWN0ZXJTdHJlYW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gc291cmNlLmdldENoYXJhY3RlclN0cmVhbSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBUaWR5WE1MU3RyZWFtUmVhZGVyKFhNTFN0cmVhbVJlYWRlckZhY3RvcnkuY3JlYXRlRnJlc2hYTUxTdHJlYW1SZWFkZXIoc291cmNlLmdldFN5c3RlbUlkKCksIHJlYWRlciksIHJlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCeXRlIHN0cmVhbSBhdmFpbGFibGU/Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0Qnl0ZVN0cmVhbSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IHNvdXJjZS5nZXRCeXRlU3RyZWFtKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRpZHlYTUxTdHJlYW1SZWFkZXIoWE1MU3RyZWFtUmVhZGVyRmFjdG9yeS5jcmVhdGVGcmVzaFhNTFN0cmVhbVJlYWRlcihzb3VyY2UuZ2V0U3lzdGVtSWQoKSwgc3RyZWFtKSwgc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE90aGVyd2lzZSwgb3BlbiBVUkkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBVUkwoc291cmNlLmdldFN5c3RlbUlkKCkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGlkeVhNTFN0cmVhbVJlYWRlcihYTUxTdHJlYW1SZWFkZXJGYWN0b3J5LmNyZWF0ZUZyZXNoWE1MU3RyZWFtUmVhZGVyKHNvdXJjZS5nZXRTeXN0ZW1JZCgpLCBzdHJlYW0pLCBzdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwYXJzZVdTREwoVVJMIHdzZGxMb2MpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCi0vLyAgICAgICAgU3RyaW5nIHN5c3RlbUlkID0gd3NkbExvYy50b0V4dGVybmFsRm9ybSgpOwotLy8gICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVFbnRpdHkobnVsbCxzeXN0ZW1JZCk7Ci0vLyAgICAgICAgaWYoc291cmNlPT1udWxsKQotLy8gICAgICAgICAgICBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOwotCi0gICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IHJlc29sdmVyLnJlc29sdmVFbnRpdHkobnVsbCx3c2RsTG9jLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICBpZihzb3VyY2U9PW51bGwpCi0gICAgICAgICAgICBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2Uod3NkbExvYy50b0V4dGVybmFsRm9ybSgpKTsgIC8vIGRlZmF1bHQgcmVzb2x1dGlvbgotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZihzb3VyY2UuZ2V0U3lzdGVtSWQoKT09bnVsbCkKLSAgICAgICAgICAgICAgICAvLyBpZGVhbGx5IGVudGl0eSByZXNvbHZlcnMgc2hvdWxkIGJlIGdpdmluZyB1cyB0aGUgc3lzdGVtIElEIGZvciB0aGUgcmVzb3VyY2UKLSAgICAgICAgICAgICAgICAvLyAob3Igb3RoZXJ3aXNlIHdlIHdvbid0IGJlIGFibGUgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIHdpdGhpbiB0aGlzIGltcG9ydGVkIFdTREwgY29ycmVjdGx5KSwKLSAgICAgICAgICAgICAgICAvLyBidXQgaWYgbm9uZSBpcyBnaXZlbiwgdGhlIHN5c3RlbSBJRCBiZWZvcmUgdGhlIGVudGl0eSByZXNvbHV0aW9uIGlzIGJldHRlciB0aGFuIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKHdzZGxMb2MudG9FeHRlcm5hbEZvcm0oKSk7Ci0KLSAgICAgICAgLy8gYXZvaWQgcHJvY2Vzc2luZyB0aGUgc2FtZSBXU0RMIHR3aWNlLgotICAgICAgICBpZighaW1wb3J0ZWRXU0RMcy5hZGQoc291cmNlLmdldFN5c3RlbUlkKCkpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGNyZWF0ZVJlYWRlcihzb3VyY2UpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpOwotCi0gICAgICAgIC8vd3NkbDpkZWZpbml0aW9uCi0gICAgICAgIGlmICghcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9ERUZJTklUSU9OUykpIHsKLSAgICAgICAgICAgIFBhcnNlclV0aWwuZmFpbFdpdGhGdWxsTmFtZSgicnVudGltZS5wYXJzZXIud3NkbC5pbnZhbGlkRWxlbWVudCIsIHJlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2dldCB0aGUgdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBzZXJ2aWNlCi0gICAgICAgIFN0cmluZyB0bnMgPSBQYXJzZXJVdGlsLmdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgV1NETENvbnN0YW50cy5BVFRSX1ROUyk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gdG5zOwotCi0gICAgICAgIHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpICE9Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgaWYocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuUU5BTUVfSU1QT1JULmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHBhcnNlSW1wb3J0KHdzZGxMb2MsIHJlYWRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoV1NETENvbnN0YW50cy5RTkFNRV9NRVNTQUdFLmVxdWFscyhuYW1lKSl7Ci0gICAgICAgICAgICAgICAgcGFyc2VNZXNzYWdlKHJlYWRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoV1NETENvbnN0YW50cy5RTkFNRV9QT1JUX1RZUEUuZXF1YWxzKG5hbWUpKXsKLSAgICAgICAgICAgICAgICBwYXJzZVBvcnRUeXBlKHJlYWRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuUU5BTUVfQklORElORy5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJzZUJpbmRpbmcocmVhZGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5RTkFNRV9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHBhcnNlU2VydmljZShyZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlewotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBvbGRUYXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBwYXJzZVNlcnZpY2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewogICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBQYXJzZXJVdGlsLmdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgV1NETENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZShuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBzZXJ2aWNlTmFtZSkpOworICAgICAgICBXU0RMU2VydmljZUltcGwgc2VydmljZSA9IG5ldyBXU0RMU2VydmljZUltcGwocmVhZGVyLHdzZGxEb2MsbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgc2VydmljZU5hbWUpKTsKKyAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLnNlcnZpY2VBdHRyaWJ1dGVzKHNlcnZpY2UsIHJlYWRlcik7CiAgICAgICAgIHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewogICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZihXU0RMQ29uc3RhbnRzLlFOQU1FX1BPUlQuZXF1YWxzKG5hbWUpKXsKKyAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLlFOQU1FX1BPUlQuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcGFyc2VQb3J0KHJlYWRlciwgc2VydmljZSk7Ci0gICAgICAgICAgICAgICAgaWYocmVhZGVyLmdldEV2ZW50VHlwZSgpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewogICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5zZXJ2aWNlRWxlbWVudHMoc2VydmljZSwgcmVhZGVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICB3c2RsRG9jLmFkZFNlcnZpY2Uoc2VydmljZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJzZVBvcnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgU2VydmljZSBzZXJ2aWNlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUG9ydChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBXU0RMU2VydmljZUltcGwgc2VydmljZSkgewogICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBQYXJzZXJVdGlsLmdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgV1NETENvbnN0YW50cy5BVFRSX05BTUUpOwogICAgICAgICBTdHJpbmcgYmluZGluZyA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCAiYmluZGluZyIpOworCiAgICAgICAgIFFOYW1lIGJpbmRpbmdOYW1lID0gUGFyc2VyVXRpbC5nZXRRTmFtZShyZWFkZXIsIGJpbmRpbmcpOwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBudWxsOworICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoc2VydmljZS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIHBvcnROYW1lKTsKKyAgICAgICAgV1NETFBvcnRJbXBsIHBvcnQgPSBuZXcgV1NETFBvcnRJbXBsKHJlYWRlcixzZXJ2aWNlLCBwb3J0UU5hbWUsIGJpbmRpbmdOYW1lKTsKKworICAgICAgICBleHRlbnNpb25GYWNhZGUucG9ydEF0dHJpYnV0ZXMocG9ydCwgcmVhZGVyKTsKKworICAgICAgICBTdHJpbmcgbG9jYXRpb247CiAgICAgICAgIHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewogICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZihTT0FQQ29uc3RhbnRzLlFOQU1FX0FERFJFU1MuZXF1YWxzKG5hbWUpfHxTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVAxMkFERFJFU1MuZXF1YWxzKG5hbWUpKXsKKyAgICAgICAgICAgIGlmIChTT0FQQ29uc3RhbnRzLlFOQU1FX0FERFJFU1MuZXF1YWxzKG5hbWUpIHx8IFNPQVBDb25zdGFudHMuUU5BTUVfU09BUDEyQUREUkVTUy5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCBXU0RMQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04pOworICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LnNldEFkZHJlc3MobmV3IEVuZHBvaW50QWRkcmVzcyhsb2NhdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9MZXRzIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9uLCBsYXR0ZXIgb24gaXQgc2hvdWxkIGJlIHRocm93biB3aGVuIGludm9jYXRpb24gaGFwcGVucy4gQXQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZSB1c2VyIGhhcyBvcHRpb24gdG8gc2V0IHRoZSBlbmRvcGludCBhZGRyZXNzIHVzaW5nIHJlcXVlc3QgY29udGV4eHQgcHJvcGVydHkuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0KHJlYWRlcik7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFkZHJlc3NpbmdWZXJzaW9uLlczQy5uc1VyaS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIkVuZHBvaW50UmVmZXJlbmNlIi5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBXU0VuZHBvaW50UmVmZXJlbmNlIHdzZXByID0gbmV3IFdTRW5kcG9pbnRSZWZlcmVuY2UocmVhZGVyLCBBZGRyZXNzaW5nVmVyc2lvbi5XM0MpOworICAgICAgICAgICAgICAgICAgICBwb3J0LnNldEVQUih3c2Vwcik7CisgICAgICAgICAgICAgICAgICAgIC8qKiBYTUxTdHJlYW1CdWZmZXIuY3JlYXRlTmV3QnVmZmVyRnJvbVhNTFN0cmVhbVJlYWRlcihyZWFkZXIpIGNhbGxlZCBmcm9tIGluc2lkZSBXU0VuZHBvaW50UmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICogIGNvbnN1bWVzIHRoZSBjb21wbGV0ZSBFUFIgaW5mb3NldCBhbmQgbW92ZXMgdG8gdGhlIG5leHQgZWxlbWVudC4gVGhpcyBicmVha3MgdGhlIG5vcm1hbCB3c2RsIHBhcnNlcgorICAgICAgICAgICAgICAgICAgICAgKiAgcHJvY2Vzc2luZyB3aGVyZSBpdCBleHBlY3RzIGFueW9uZSByZWFkaW5nIHRoZSBpbmZvc2V0IHRvIG1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudCB0aGF0IGl0cyByZWFkaW5nCisgICAgICAgICAgICAgICAgICAgICAqICBhbmQgbm90IHRvIHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZihyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UICYmIHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfUE9SVCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLnBvcnRFbGVtZW50cyhwb3J0LCByZWFkZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShzZXJ2aWNlLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgcG9ydE5hbWUpOwotICAgICAgICBzZXJ2aWNlLnB1dChwb3J0UU5hbWUsIG5ldyBQb3J0KHBvcnRRTmFtZSwgYmluZGluZ05hbWUsIGxvY2F0aW9uKSk7CisgICAgICAgIGlmIChwb3J0LmdldEFkZHJlc3MoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBvcnQuc2V0QWRkcmVzcyhuZXcgRW5kcG9pbnRBZGRyZXNzKCIiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vTGV0cyBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbiwgbGF0dGVyIG9uIGl0IHNob3VsZCBiZSB0aHJvd24gd2hlbiBpbnZvY2F0aW9uIGhhcHBlbnMuIEF0IHRoaXMKKyAgICAgICAgICAgICAgICAvL3RpbWUgdXNlciBoYXMgb3B0aW9uIHRvIHNldCB0aGUgZW5kb3BpbnQgYWRkcmVzcyB1c2luZyByZXF1ZXN0IGNvbnRleHh0IHByb3BlcnR5LgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNlcnZpY2UucHV0KHBvcnRRTmFtZSwgcG9ydCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQmluZGluZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CiAgICAgICAgIFN0cmluZyBiaW5kaW5nTmFtZSA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCAibmFtZSIpOwogICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsICJ0eXBlIik7Ci0gICAgICAgIGlmKChiaW5kaW5nTmFtZSA9PSBudWxsKSB8fCAocG9ydFR5cGVOYW1lID09IG51bGwpKXsKKyAgICAgICAgaWYgKChiaW5kaW5nTmFtZSA9PSBudWxsKSB8fCAocG9ydFR5cGVOYW1lID09IG51bGwpKSB7CiAgICAgICAgICAgICAvL1RPRE86IHRocm93IGV4Y2VwdGlvbj8KLSAgICAgICAgICAgIC8vc2tpcCB3c2RsOmJpbmRpbmcgZWxlbWVudCBmb3Igbm93CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gIHdzZGw6YmluZGluZyBlbGVtZW50IGZvciBub3cKICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBuZXcgQmluZGluZyhuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBiaW5kaW5nTmFtZSksCisgICAgICAgIFdTRExCb3VuZFBvcnRUeXBlSW1wbCBiaW5kaW5nID0gbmV3IFdTRExCb3VuZFBvcnRUeXBlSW1wbChyZWFkZXIsd3NkbERvYywgbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgYmluZGluZ05hbWUpLAogICAgICAgICAgICAgICAgIFBhcnNlclV0aWwuZ2V0UU5hbWUocmVhZGVyLCBwb3J0VHlwZU5hbWUpKTsKLSAgICAgICAgYmluZGluZy5zZXRXc2RsRG9jdW1lbnQod3NkbERvYyk7Ci0gICAgICAgIHdzZGxEb2MuYWRkQmluZGluZyhiaW5kaW5nKTsKKyAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLmJpbmRpbmdBdHRyaWJ1dGVzKGJpbmRpbmcsIHJlYWRlcik7CiAKICAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7CiAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUoKTsKICAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLk5TX1NPQVBfQklORElORy5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nLnNldEJpbmRpbmdJZChTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpOworICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0QmluZGluZ0lkKEJpbmRpbmdJRC5TT0FQMTFfSFRUUCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJzdHlsZSIpOworCisgICAgICAgICAgICAgICAgaWYgKChzdHlsZSAhPSBudWxsKSAmJiAoc3R5bGUuZXF1YWxzKCJycGMiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmluZGluZy5zZXRTdHlsZShTdHlsZS5SUEMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0U3R5bGUoU3R5bGUuRE9DVU1FTlQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5OU19TT0FQMTJfQklORElORy5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nLnNldEJpbmRpbmdJZChTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpOworICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0QmluZGluZ0lkKEJpbmRpbmdJRC5TT0FQMTJfSFRUUCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJzdHlsZSIpOworICAgICAgICAgICAgICAgIGlmICgoc3R5bGUgIT0gbnVsbCkgJiYgKHN0eWxlLmVxdWFscygicnBjIikpKSB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0U3R5bGUoU3R5bGUuUlBDKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLnNldFN0eWxlKFN0eWxlLkRPQ1VNRU5UKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0KHJlYWRlcik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuUU5BTUVfT1BFUkFUSU9OLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgICAgIHBhcnNlQmluZGluZ09wZXJhdGlvbihyZWFkZXIsIGJpbmRpbmcpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5iaW5kaW5nRWxlbWVudHMoYmluZGluZywgcmVhZGVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGFyc2VCaW5kaW5nT3BlcmF0aW9uKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIEJpbmRpbmcgYmluZGluZykgeworCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQmluZGluZ09wZXJhdGlvbihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBXU0RMQm91bmRQb3J0VHlwZUltcGwgYmluZGluZykgewogICAgICAgICBTdHJpbmcgYmluZGluZ09wTmFtZSA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCAibmFtZSIpOwotICAgICAgICBpZihiaW5kaW5nT3BOYW1lID09IG51bGwpeworICAgICAgICBpZiAoYmluZGluZ09wTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvL1RPRE86IHRocm93IGV4Y2VwdGlvbj8KICAgICAgICAgICAgIC8vc2tpcCB3c2RsOmJpbmRpbmcgZWxlbWVudCBmb3Igbm93CiAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9IG5ldyBCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcE5hbWUpOwotICAgICAgICBiaW5kaW5nLnB1dChiaW5kaW5nT3BOYW1lLCBiaW5kaW5nT3ApOworICAgICAgICBRTmFtZSBvcE5hbWUgPSBuZXcgUU5hbWUoYmluZGluZy5nZXRQb3J0VHlwZU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgYmluZGluZ09wTmFtZSk7CisgICAgICAgIFdTRExCb3VuZE9wZXJhdGlvbkltcGwgYmluZGluZ09wID0gbmV3IFdTRExCb3VuZE9wZXJhdGlvbkltcGwocmVhZGVyLGJpbmRpbmcsIG9wTmFtZSk7CisgICAgICAgIGJpbmRpbmcucHV0KG9wTmFtZSwgYmluZGluZ09wKTsKKyAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLmJpbmRpbmdPcGVyYXRpb25BdHRyaWJ1dGVzKGJpbmRpbmdPcCwgcmVhZGVyKTsKIAogICAgICAgICB3aGlsZSAoWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwogICAgICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuUU5BTUVfSU5QVVQuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcGFyc2VJbnB1dEJpbmRpbmcocmVhZGVyLCBiaW5kaW5nT3ApOwotICAgICAgICAgICAgfWVsc2UgaWYoV1NETENvbnN0YW50cy5RTkFNRV9PVVRQVVQuZXF1YWxzKG5hbWUpKXsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5RTkFNRV9PVVRQVVQuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcGFyc2VPdXRwdXRCaW5kaW5nKHJlYWRlciwgYmluZGluZ09wKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5RTkFNRV9GQVVMVC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwYXJzZUZhdWx0QmluZGluZyhyZWFkZXIsIGJpbmRpbmdPcCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFNPQVBDb25zdGFudHMuUU5BTUVfT1BFUkFUSU9OLmVxdWFscyhuYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVAxMk9QRVJBVElPTi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInN0eWxlIik7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogIElmIHN0eWxlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IHNldCBpdCBvdGhlcndpc2Ugc2V0IHRoZSBzdHlsZSBhcyBkZWZpbmVkCisgICAgICAgICAgICAgICAgICogIG9uIHRoZSA8c29hcDpiaW5kaW5nPiBlbGVtZW50CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHN0eWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLmVxdWFscygicnBjIikpCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3Auc2V0U3R5bGUoU3R5bGUuUlBDKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ09wLnNldFN0eWxlKFN0eWxlLkRPQ1VNRU5UKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3Auc2V0U3R5bGUoYmluZGluZy5nZXRTdHlsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24gPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInNvYXBBY3Rpb24iKTsKKworICAgICAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcC5zZXRTb2FwQWN0aW9uKHNvYXBBY3Rpb24pOworCisgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0KHJlYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5iaW5kaW5nT3BlcmF0aW9uRWxlbWVudHMoYmluZGluZ09wLCByZWFkZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJzZUlucHV0QmluZGluZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCkgeworICAgIHByaXZhdGUgdm9pZCBwYXJzZUlucHV0QmluZGluZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBXU0RMQm91bmRPcGVyYXRpb25JbXBsIGJpbmRpbmdPcCkgewogICAgICAgICBib29sZWFuIGJvZHlGb3VuZCA9IGZhbHNlOworICAgICAgICBleHRlbnNpb25GYWNhZGUuYmluZGluZ09wZXJhdGlvbklucHV0QXR0cmlidXRlcyhiaW5kaW5nT3AsIHJlYWRlcik7CiAgICAgICAgIHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewogICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZigoU09BUENvbnN0YW50cy5RTkFNRV9CT0RZLmVxdWFscyhuYW1lKSB8fCBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVAxMkJPRFkuZXF1YWxzKG5hbWUpKSAmJiAhYm9keUZvdW5kKXsKKyAgICAgICAgICAgIGlmICgoU09BUENvbnN0YW50cy5RTkFNRV9CT0RZLmVxdWFscyhuYW1lKSB8fCBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVAxMkJPRFkuZXF1YWxzKG5hbWUpKSAmJiAhYm9keUZvdW5kKSB7CiAgICAgICAgICAgICAgICAgYm9keUZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBiaW5kaW5nT3Auc2V0SW5wdXRFeHBsaWNpdEJvZHlQYXJ0cyhwYXJzZVNPQVBCb2R5QmluZGluZyhyZWFkZXIsIGJpbmRpbmdPcCwgQmluZGluZ01vZGUuSU5QVVQpKTsKICAgICAgICAgICAgICAgICBnb1RvRW5kKHJlYWRlcik7Ci0gICAgICAgICAgICB9ZWxzZSBpZigoU09BUENvbnN0YW50cy5RTkFNRV9IRUFERVIuZXF1YWxzKG5hbWUpIHx8IFNPQVBDb25zdGFudHMuUU5BTUVfU09BUDEySEVBREVSLmVxdWFscyhuYW1lKSkpeworICAgICAgICAgICAgfSBlbHNlIGlmICgoU09BUENvbnN0YW50cy5RTkFNRV9IRUFERVIuZXF1YWxzKG5hbWUpIHx8IFNPQVBDb25zdGFudHMuUU5BTUVfU09BUDEySEVBREVSLmVxdWFscyhuYW1lKSkpIHsKICAgICAgICAgICAgICAgICBwYXJzZVNPQVBIZWFkZXJCaW5kaW5nKHJlYWRlciwgYmluZGluZ09wLmdldElucHV0UGFydHMoKSk7Ci0gICAgICAgICAgICB9ZWxzZSBpZihNSU1FQ29uc3RhbnRzLlFOQU1FX01VTFRJUEFSVF9SRUxBVEVELmVxdWFscyhuYW1lKSl7CisgICAgICAgICAgICB9IGVsc2UgaWYgKE1JTUVDb25zdGFudHMuUU5BTUVfTVVMVElQQVJUX1JFTEFURUQuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcGFyc2VNaW1lTXVsdGlwYXJ0QmluZGluZyhyZWFkZXIsIGJpbmRpbmdPcCwgQmluZGluZ01vZGUuSU5QVVQpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25GYWNhZGUuYmluZGluZ09wZXJhdGlvbklucHV0RWxlbWVudHMoYmluZGluZ09wLCByZWFkZXIpOwogICAgICAgICAgICAgfQotCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlT3V0cHV0QmluZGluZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCkgeworICAgIHByaXZhdGUgdm9pZCBwYXJzZU91dHB1dEJpbmRpbmcoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBiaW5kaW5nT3ApIHsKICAgICAgICAgYm9vbGVhbiBib2R5Rm91bmQgPSBmYWxzZTsKKyAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLmJpbmRpbmdPcGVyYXRpb25PdXRwdXRBdHRyaWJ1dGVzKGJpbmRpbmdPcCwgcmVhZGVyKTsKICAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7CiAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmKChTT0FQQ29uc3RhbnRzLlFOQU1FX0JPRFkuZXF1YWxzKG5hbWUpIHx8IFNPQVBDb25zdGFudHMuUU5BTUVfU09BUDEyQk9EWS5lcXVhbHMobmFtZSkpICYmICFib2R5Rm91bmQpeworICAgICAgICAgICAgaWYgKChTT0FQQ29uc3RhbnRzLlFOQU1FX0JPRFkuZXF1YWxzKG5hbWUpIHx8IFNPQVBDb25zdGFudHMuUU5BTUVfU09BUDEyQk9EWS5lcXVhbHMobmFtZSkpICYmICFib2R5Rm91bmQpIHsKICAgICAgICAgICAgICAgICBib2R5Rm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJpbmRpbmdPcC5zZXRPdXRwdXRFeHBsaWNpdEJvZHlQYXJ0cyhwYXJzZVNPQVBCb2R5QmluZGluZyhyZWFkZXIsIGJpbmRpbmdPcCwgQmluZGluZ01vZGUuT1VUUFVUKSk7CiAgICAgICAgICAgICAgICAgZ29Ub0VuZChyZWFkZXIpOwotICAgICAgICAgICAgfWVsc2UgaWYoKFNPQVBDb25zdGFudHMuUU5BTUVfSEVBREVSLmVxdWFscyhuYW1lKSB8fCBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVAxMkhFQURFUi5lcXVhbHMobmFtZSkpKXsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKFNPQVBDb25zdGFudHMuUU5BTUVfSEVBREVSLmVxdWFscyhuYW1lKSB8fCBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVAxMkhFQURFUi5lcXVhbHMobmFtZSkpKSB7CiAgICAgICAgICAgICAgICAgcGFyc2VTT0FQSGVhZGVyQmluZGluZyhyZWFkZXIsIGJpbmRpbmdPcC5nZXRPdXRwdXRQYXJ0cygpKTsKLSAgICAgICAgICAgIH1lbHNlIGlmKE1JTUVDb25zdGFudHMuUU5BTUVfTVVMVElQQVJUX1JFTEFURUQuZXF1YWxzKG5hbWUpKXsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTUlNRUNvbnN0YW50cy5RTkFNRV9NVUxUSVBBUlRfUkVMQVRFRC5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgICAgICBwYXJzZU1pbWVNdWx0aXBhcnRCaW5kaW5nKHJlYWRlciwgYmluZGluZ09wLCBCaW5kaW5nTW9kZS5PVVRQVVQpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25GYWNhZGUuYmluZGluZ09wZXJhdGlvbk91dHB1dEVsZW1lbnRzKGJpbmRpbmdPcCwgcmVhZGVyKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYXJzZVNPQVBCb2R5QmluZGluZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBCaW5kaW5nT3BlcmF0aW9uIG9wLCBCaW5kaW5nTW9kZSBtb2RlKXsKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VGYXVsdEJpbmRpbmcoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBiaW5kaW5nT3ApIHsKKyAgICAgICAgYm9vbGVhbiBib2R5Rm91bmQgPSBmYWxzZTsKKyAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLmJpbmRpbmdPcGVyYXRpb25GYXVsdEF0dHJpYnV0ZXMoYmluZGluZ09wLCByZWFkZXIpOworICAgICAgICB3aGlsZSAoWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKChTT0FQQ29uc3RhbnRzLlFOQU1FX0JPRFkuZXF1YWxzKG5hbWUpIHx8IFNPQVBDb25zdGFudHMuUU5BTUVfU09BUDEyQk9EWS5lcXVhbHMobmFtZSkpICYmICFib2R5Rm91bmQpIHsKKyAgICAgICAgICAgICAgICBib2R5Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJpbmRpbmdPcC5zZXRGYXVsdEV4cGxpY2l0Qm9keVBhcnRzKHBhcnNlU09BUEJvZHlCaW5kaW5nKHJlYWRlciwgYmluZGluZ09wLmdldEZhdWx0UGFydHMoKSkpOworICAgICAgICAgICAgICAgIGdvVG9FbmQocmVhZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKFNPQVBDb25zdGFudHMuUU5BTUVfSEVBREVSLmVxdWFscyhuYW1lKSB8fCBTT0FQQ29uc3RhbnRzLlFOQU1FX1NPQVAxMkhFQURFUi5lcXVhbHMobmFtZSkpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VTT0FQSGVhZGVyQmluZGluZyhyZWFkZXIsIGJpbmRpbmdPcC5nZXRGYXVsdFBhcnRzKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChNSU1FQ29uc3RhbnRzLlFOQU1FX01VTFRJUEFSVF9SRUxBVEVELmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHBhcnNlTWltZU11bHRpcGFydEJpbmRpbmcocmVhZGVyLCBiaW5kaW5nT3AsIEJpbmRpbmdNb2RlLkZBVUxUKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLmJpbmRpbmdPcGVyYXRpb25GYXVsdEVsZW1lbnRzKGJpbmRpbmdPcCwgcmVhZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZW51bSBCaW5kaW5nTW9kZSB7CisgICAgICAgIElOUFVULCBPVVRQVVQsIEZBVUxUfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYXJzZVNPQVBCb2R5QmluZGluZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBXU0RMQm91bmRPcGVyYXRpb25JbXBsIG9wLCBCaW5kaW5nTW9kZSBtb2RlKSB7CiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgIm5hbWVzcGFjZSIpOwotICAgICAgICBpZihtb2RlID09IEJpbmRpbmdNb2RlLklOUFVUKXsKLSAgICAgICAgICAgIG9wLnJlcU5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKyAgICAgICAgaWYgKG1vZGUgPT0gQmluZGluZ01vZGUuSU5QVVQpIHsKKyAgICAgICAgICAgIG9wLnNldFJlcXVlc3ROYW1lc3BhY2UobmFtZXNwYWNlKTsKICAgICAgICAgICAgIHJldHVybiBwYXJzZVNPQVBCb2R5QmluZGluZyhyZWFkZXIsIG9wLmdldElucHV0UGFydHMoKSk7CiAgICAgICAgIH0KICAgICAgICAgLy9yZXNwCi0gICAgICAgIG9wLnJlc3BOYW1lc3BhY2UgPSBuYW1lc3BhY2U7CisgICAgICAgIG9wLnNldFJlc3BvbnNlTmFtZXNwYWNlKG5hbWVzcGFjZSk7CiAgICAgICAgIHJldHVybiBwYXJzZVNPQVBCb2R5QmluZGluZyhyZWFkZXIsIG9wLmdldE91dHB1dFBhcnRzKCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiBib2R5IGhhcyBleHBsaWNpdCBwYXJ0cyBkZWNsYXJhdGlvbgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFyc2VTT0FQQm9keUJpbmRpbmcoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgTWFwPFN0cmluZywgUGFyYW1ldGVyQmluZGluZz4gcGFydHMpeworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFyc2VTT0FQQm9keUJpbmRpbmcoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgTWFwPFN0cmluZywgUGFyYW1ldGVyQmluZGluZz4gcGFydHMpIHsKICAgICAgICAgU3RyaW5nIHBhcnRzU3RyaW5nID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJwYXJ0cyIpOwotICAgICAgICBpZihwYXJ0c1N0cmluZyAhPSBudWxsKXsKKyAgICAgICAgaWYgKHBhcnRzU3RyaW5nICE9IG51bGwpIHsKICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXJ0c0xpc3QgPSBYbWxVdGlsLnBhcnNlVG9rZW5MaXN0KHBhcnRzU3RyaW5nKTsKLSAgICAgICAgICAgIGlmKHBhcnRzTGlzdC5pc0VtcHR5KCkpeworICAgICAgICAgICAgaWYgKHBhcnRzTGlzdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBwYXJ0cy5wdXQoIiAiLCBQYXJhbWV0ZXJCaW5kaW5nLkJPRFkpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgZm9yKFN0cmluZyBwYXJ0OnBhcnRzTGlzdCl7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhcnQgOiBwYXJ0c0xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgcGFydHMucHV0KHBhcnQsIFBhcmFtZXRlckJpbmRpbmcuQk9EWSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzg0LDEwICs1NjQsMTAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGFyc2VTT0FQSGVhZGVyQmluZGluZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBNYXA8U3RyaW5nLFBhcmFtZXRlckJpbmRpbmc+IHBhcnRzKXsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlU09BUEhlYWRlckJpbmRpbmcoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgTWFwPFN0cmluZywgUGFyYW1ldGVyQmluZGluZz4gcGFydHMpIHsKICAgICAgICAgU3RyaW5nIHBhcnQgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInBhcnQiKTsKICAgICAgICAgLy9pZihwYXJ0ID09IG51bGx8IHBhcnQuZXF1YWxzKCIiKXx8bWVzc2FnZSA9PSBudWxsIHx8IG1lc3NhZ2UuZXF1YWxzKCIiKSl7Ci0gICAgICAgIGlmKHBhcnQgPT0gbnVsbHwgcGFydC5lcXVhbHMoIiIpKXsKKyAgICAgICAgaWYgKHBhcnQgPT0gbnVsbCB8fCBwYXJ0LmVxdWFscygiIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0zOTksOTMgKzU3OSw5NCBAQAogICAgIH0KIAogCi0gICAgcHJpdmF0ZSBlbnVtIEJpbmRpbmdNb2RlIHtJTlBVVCwgT1VUUFVUfTsKLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGFyc2VNaW1lTXVsdGlwYXJ0QmluZGluZyhYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBCaW5kaW5nT3BlcmF0aW9uIG9wLCBCaW5kaW5nTW9kZSBtb2RlKXsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlTWltZU11bHRpcGFydEJpbmRpbmcoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBvcCwgQmluZGluZ01vZGUgbW9kZSkgewogICAgICAgICB3aGlsZSAoWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYoTUlNRUNvbnN0YW50cy5RTkFNRV9QQVJULmVxdWFscyhuYW1lKSl7CisgICAgICAgICAgICBpZiAoTUlNRUNvbnN0YW50cy5RTkFNRV9QQVJULmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgICAgIHBhcnNlTUlNRVBhcnQocmVhZGVyLCBvcCwgbW9kZSk7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlTUlNRVBhcnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgQmluZGluZ09wZXJhdGlvbiBvcCwgQmluZGluZ01vZGUgbW9kZSkgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGFyc2VNSU1FUGFydChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBXU0RMQm91bmRPcGVyYXRpb25JbXBsIG9wLCBCaW5kaW5nTW9kZSBtb2RlKSB7CiAgICAgICAgIGJvb2xlYW4gYm9keUZvdW5kID0gZmFsc2U7Ci0gICAgICAgIE1hcDxTdHJpbmcsUGFyYW1ldGVyQmluZGluZz4gcGFydHMgPSBudWxsOwotICAgICAgICBNYXA8U3RyaW5nLFN0cmluZz4gbWltZVR5cGVzID0gbnVsbDsKLSAgICAgICAgaWYobW9kZSA9PSBCaW5kaW5nTW9kZS5JTlBVVCl7CisgICAgICAgIE1hcDxTdHJpbmcsIFBhcmFtZXRlckJpbmRpbmc+IHBhcnRzID0gbnVsbDsKKyAgICAgICAgaWYgKG1vZGUgPT0gQmluZGluZ01vZGUuSU5QVVQpIHsKICAgICAgICAgICAgIHBhcnRzID0gb3AuZ2V0SW5wdXRQYXJ0cygpOwotICAgICAgICAgICAgbWltZVR5cGVzID0gb3AuZ2V0SW5wdXRNaW1lVHlwZXMoKTsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBCaW5kaW5nTW9kZS5PVVRQVVQpIHsKICAgICAgICAgICAgIHBhcnRzID0gb3AuZ2V0T3V0cHV0UGFydHMoKTsKLSAgICAgICAgICAgIG1pbWVUeXBlcyA9IG9wLmdldE91dHB1dE1pbWVUeXBlcygpOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQmluZGluZ01vZGUuRkFVTFQpIHsKKyAgICAgICAgICAgIHBhcnRzID0gb3AuZ2V0RmF1bHRQYXJ0cygpOwogICAgICAgICB9Ci0KICAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7CiAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmKFNPQVBDb25zdGFudHMuUU5BTUVfQk9EWS5lcXVhbHMobmFtZSkgJiYgIWJvZHlGb3VuZCl7CisgICAgICAgICAgICBpZiAoU09BUENvbnN0YW50cy5RTkFNRV9CT0RZLmVxdWFscyhuYW1lKSAmJiAhYm9keUZvdW5kKSB7CiAgICAgICAgICAgICAgICAgYm9keUZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBwYXJzZVNPQVBCb2R5QmluZGluZyhyZWFkZXIsIG9wLCBtb2RlKTsKICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgICAgIH1lbHNlIGlmKFNPQVBDb25zdGFudHMuUU5BTUVfSEVBREVSLmVxdWFscyhuYW1lKSl7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFNPQVBDb25zdGFudHMuUU5BTUVfSEVBREVSLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgICAgIGJvZHlGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcGFyc2VTT0FQSGVhZGVyQmluZGluZyhyZWFkZXIsIHBhcnRzKTsKICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgICAgIH1lbHNlIGlmKE1JTUVDb25zdGFudHMuUU5BTUVfQ09OVEVOVC5lcXVhbHMobmFtZSkpeworICAgICAgICAgICAgfSBlbHNlIGlmIChNSU1FQ29uc3RhbnRzLlFOQU1FX0NPTlRFTlQuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInBhcnQiKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidHlwZSIpOwotICAgICAgICAgICAgICAgIGlmKChwYXJ0ID09IG51bGwpIHx8ICh0eXBlID09IG51bGwpKXsKKyAgICAgICAgICAgICAgICBpZiAoKHBhcnQgPT0gbnVsbCkgfHwgKHR5cGUgPT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQmluZGluZyBzYiA9IFBhcmFtZXRlckJpbmRpbmcuY3JlYXRlQXR0YWNobWVudCh0eXBlKTsKLSAgICAgICAgICAgICAgICBwYXJ0cy5wdXQocGFydCwgc2IpOwotICAgICAgICAgICAgICAgIC8vbWltZVR5cGVzLnB1dChwYXJ0LCB0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocGFydHMgIT0gbnVsbCAmJiBzYiAhPSBudWxsICYmIHBhcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcGFydHMucHV0KHBhcnQsIHNiKTsKICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHQocmVhZGVyKTsKLSAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUltcG9ydChVUkwgYmFzZVVSTCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VJbXBvcnQoQE51bGxhYmxlIFVSTCBiYXNlVVJMLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgLy8gZXhwYW5kIHRvIHRoZSBhYnNvbHV0ZSBVUkwgb2YgdGhlIGltcG9ydGVkIFdTREwuCiAgICAgICAgIFN0cmluZyBpbXBvcnRMb2NhdGlvbiA9CiAgICAgICAgICAgICAgICAgUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsIFdTRExDb25zdGFudHMuQVRUUl9MT0NBVElPTik7Ci0gICAgICAgIFVSTCBpbXBvcnRVUkwgPSBuZXcgVVJMKGJhc2VVUkwsaW1wb3J0TG9jYXRpb24pOwotICAgICAgICBwYXJzZVdTREwoaW1wb3J0VVJMKTsKLSAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKXsKKyAgICAgICAgVVJMIGltcG9ydFVSTDsKKyAgICAgICAgaWYoYmFzZVVSTCE9bnVsbCkKKyAgICAgICAgICAgIGltcG9ydFVSTCA9IG5ldyBVUkwoYmFzZVVSTCwgaW1wb3J0TG9jYXRpb24pOworICAgICAgICBlbHNlIC8vIG5vIGJhc2UgVVJMLiB0aGlzIGJldHRlciBiZSBhYnNvbHV0ZQorICAgICAgICAgICAgaW1wb3J0VVJMID0gbmV3IFVSTChpbXBvcnRMb2NhdGlvbik7CisgICAgICAgIHBhcnNlSW1wb3J0KGltcG9ydFVSTCk7CisgICAgICAgIHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewogICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUG9ydFR5cGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewogICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsIFdTRExDb25zdGFudHMuQVRUUl9OQU1FKTsKLSAgICAgICAgaWYocG9ydFR5cGVOYW1lID09IG51bGwpeworICAgICAgICBpZiAocG9ydFR5cGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIC8vVE9ETzogdGhyb3cgZXhjZXB0aW9uPwogICAgICAgICAgICAgLy9za2lwIHdzZGw6cG9ydFR5cGUgZWxlbWVudCBmb3Igbm93CiAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBuZXcgUG9ydFR5cGUobmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgcG9ydFR5cGVOYW1lKSk7CisgICAgICAgIFdTRExQb3J0VHlwZUltcGwgcG9ydFR5cGUgPSBuZXcgV1NETFBvcnRUeXBlSW1wbChyZWFkZXIsd3NkbERvYywgbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgcG9ydFR5cGVOYW1lKSk7CisgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5wb3J0VHlwZUF0dHJpYnV0ZXMocG9ydFR5cGUsIHJlYWRlcik7CiAgICAgICAgIHdzZGxEb2MuYWRkUG9ydFR5cGUocG9ydFR5cGUpOwogICAgICAgICB3aGlsZSAoWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYoV1NETENvbnN0YW50cy5RTkFNRV9PUEVSQVRJT04uZXF1YWxzKG5hbWUpKXsKKyAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLlFOQU1FX09QRVJBVElPTi5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgICAgICBwYXJzZVBvcnRUeXBlT3BlcmF0aW9uKHJlYWRlciwgcG9ydFR5cGUpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25GYWNhZGUucG9ydFR5cGVFbGVtZW50cyhwb3J0VHlwZSwgcmVhZGVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBwYXJzZVBvcnRUeXBlT3BlcmF0aW9uKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFBvcnRUeXBlIHBvcnRUeXBlKSB7CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQb3J0VHlwZU9wZXJhdGlvbihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBXU0RMUG9ydFR5cGVJbXBsIHBvcnRUeXBlKSB7CiAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsIFdTRExDb25zdGFudHMuQVRUUl9OQU1FKTsKLSAgICAgICAgaWYob3BlcmF0aW9uTmFtZSA9PSBudWxsKXsKKyAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgLy9UT0RPOiB0aHJvdyBleGNlcHRpb24/CiAgICAgICAgICAgICAvL3NraXAgd3NkbDpwb3J0VHlwZSBlbGVtZW50IGZvciBub3cKICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKQEAgLTQ5Myw2OSArNjc0LDEyNSBAQAogICAgICAgICB9CiAKICAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUocG9ydFR5cGUuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgUG9ydFR5cGVPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFBvcnRUeXBlT3BlcmF0aW9uKG9wZXJhdGlvblFOYW1lKTsKKyAgICAgICAgV1NETE9wZXJhdGlvbkltcGwgb3BlcmF0aW9uID0gbmV3IFdTRExPcGVyYXRpb25JbXBsKHJlYWRlcixwb3J0VHlwZSwgb3BlcmF0aW9uUU5hbWUpOworICAgICAgICBleHRlbnNpb25GYWNhZGUucG9ydFR5cGVPcGVyYXRpb25BdHRyaWJ1dGVzKG9wZXJhdGlvbiwgcmVhZGVyKTsKICAgICAgICAgU3RyaW5nIHBhcmFtZXRlck9yZGVyID0gUGFyc2VyVXRpbC5nZXRBdHRyaWJ1dGUocmVhZGVyLCAicGFyYW1ldGVyT3JkZXIiKTsKICAgICAgICAgb3BlcmF0aW9uLnNldFBhcmFtZXRlck9yZGVyKHBhcmFtZXRlck9yZGVyKTsKICAgICAgICAgcG9ydFR5cGUucHV0KG9wZXJhdGlvbk5hbWUsIG9wZXJhdGlvbik7CiAgICAgICAgIHdoaWxlIChYTUxTdHJlYW1SZWFkZXJVdGlsLm5leHRFbGVtZW50Q29udGVudChyZWFkZXIpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewogICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZihuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLlFOQU1FX0lOUFVUKSl7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9JTlBVVCkpIHsKICAgICAgICAgICAgICAgICBwYXJzZVBvcnRUeXBlT3BlcmF0aW9uSW5wdXQocmVhZGVyLCBvcGVyYXRpb24pOwotICAgICAgICAgICAgfWVsc2UgaWYobmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9PVVRQVVQpKXsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV1NETENvbnN0YW50cy5RTkFNRV9PVVRQVVQpKSB7CiAgICAgICAgICAgICAgICAgcGFyc2VQb3J0VHlwZU9wZXJhdGlvbk91dHB1dChyZWFkZXIsIG9wZXJhdGlvbik7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdTRExDb25zdGFudHMuUU5BTUVfRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VQb3J0VHlwZU9wZXJhdGlvbkZhdWx0KHJlYWRlciwgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLnBvcnRUeXBlT3BlcmF0aW9uRWxlbWVudHMob3BlcmF0aW9uLCByZWFkZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlUG9ydFR5cGVPcGVyYXRpb25JbnB1dChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBQb3J0VHlwZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG1zZyA9IFBhcnNlclV0aWwuZ2V0QXR0cmlidXRlKHJlYWRlciwgIm1lc3NhZ2UiKTsKKworICAgIHByaXZhdGUgdm9pZCBwYXJzZVBvcnRUeXBlT3BlcmF0aW9uRmF1bHQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgV1NETE9wZXJhdGlvbkltcGwgb3BlcmF0aW9uKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBQYXJzZXJVdGlsLmdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgIm1lc3NhZ2UiKTsKICAgICAgICAgUU5hbWUgbXNnTmFtZSA9IFBhcnNlclV0aWwuZ2V0UU5hbWUocmVhZGVyLCBtc2cpOwotICAgICAgICBvcGVyYXRpb24uc2V0SW5wdXRNZXNzYWdlKG1zZ05hbWUpOwotICAgICAgICBnb1RvRW5kKHJlYWRlcik7CisgICAgICAgIFN0cmluZyBuYW1lID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsICJuYW1lIik7CisgICAgICAgIFdTRExGYXVsdEltcGwgZmF1bHQgPSBuZXcgV1NETEZhdWx0SW1wbChyZWFkZXIsbmFtZSwgbXNnTmFtZSk7CisgICAgICAgIG9wZXJhdGlvbi5hZGRGYXVsdChmYXVsdCk7CisgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5wb3J0VHlwZU9wZXJhdGlvbkZhdWx0QXR0cmlidXRlcyhmYXVsdCwgcmVhZGVyKTsKKyAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLnBvcnRUeXBlT3BlcmF0aW9uRmF1bHQob3BlcmF0aW9uLCByZWFkZXIpOworICAgICAgICB3aGlsZSAoWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5wb3J0VHlwZU9wZXJhdGlvbkZhdWx0RWxlbWVudHMoZmF1bHQsIHJlYWRlcik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcGFyc2VQb3J0VHlwZU9wZXJhdGlvbk91dHB1dChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBQb3J0VHlwZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQb3J0VHlwZU9wZXJhdGlvbklucHV0KFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFdTRExPcGVyYXRpb25JbXBsIG9wZXJhdGlvbikgeworICAgICAgICBTdHJpbmcgbXNnID0gUGFyc2VyVXRpbC5nZXRNYW5kYXRvcnlOb25FbXB0eUF0dHJpYnV0ZShyZWFkZXIsICJtZXNzYWdlIik7CisgICAgICAgIFFOYW1lIG1zZ05hbWUgPSBQYXJzZXJVdGlsLmdldFFOYW1lKHJlYWRlciwgbXNnKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBQYXJzZXJVdGlsLmdldEF0dHJpYnV0ZShyZWFkZXIsICJuYW1lIik7CisgICAgICAgIFdTRExJbnB1dEltcGwgaW5wdXQgPSBuZXcgV1NETElucHV0SW1wbChyZWFkZXIsIG5hbWUsIG1zZ05hbWUsIG9wZXJhdGlvbik7CisgICAgICAgIG9wZXJhdGlvbi5zZXRJbnB1dChpbnB1dCk7CisgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5wb3J0VHlwZU9wZXJhdGlvbklucHV0QXR0cmlidXRlcyhpbnB1dCwgcmVhZGVyKTsKKyAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLnBvcnRUeXBlT3BlcmF0aW9uSW5wdXQob3BlcmF0aW9uLCByZWFkZXIpOworICAgICAgICB3aGlsZSAoWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5wb3J0VHlwZU9wZXJhdGlvbklucHV0RWxlbWVudHMoaW5wdXQsIHJlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQb3J0VHlwZU9wZXJhdGlvbk91dHB1dChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBXU0RMT3BlcmF0aW9uSW1wbCBvcGVyYXRpb24pIHsKICAgICAgICAgU3RyaW5nIG1zZyA9IFBhcnNlclV0aWwuZ2V0QXR0cmlidXRlKHJlYWRlciwgIm1lc3NhZ2UiKTsKICAgICAgICAgUU5hbWUgbXNnTmFtZSA9IFBhcnNlclV0aWwuZ2V0UU5hbWUocmVhZGVyLCBtc2cpOwotICAgICAgICBvcGVyYXRpb24uc2V0T3V0cHV0TWVzc2FnZShtc2dOYW1lKTsKLSAgICAgICAgZ29Ub0VuZChyZWFkZXIpOworICAgICAgICBTdHJpbmcgbmFtZSA9IFBhcnNlclV0aWwuZ2V0QXR0cmlidXRlKHJlYWRlciwgIm5hbWUiKTsKKyAgICAgICAgV1NETE91dHB1dEltcGwgb3V0cHV0ID0gbmV3IFdTRExPdXRwdXRJbXBsKHJlYWRlcixuYW1lLCBtc2dOYW1lLCBvcGVyYXRpb24pOworICAgICAgICBvcGVyYXRpb24uc2V0T3V0cHV0KG91dHB1dCk7CisgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5wb3J0VHlwZU9wZXJhdGlvbk91dHB1dEF0dHJpYnV0ZXMob3V0cHV0LCByZWFkZXIpOworICAgICAgICBleHRlbnNpb25GYWNhZGUucG9ydFR5cGVPcGVyYXRpb25PdXRwdXQob3BlcmF0aW9uLCByZWFkZXIpOworICAgICAgICB3aGlsZSAoWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKKyAgICAgICAgICAgIGV4dGVuc2lvbkZhY2FkZS5wb3J0VHlwZU9wZXJhdGlvbk91dHB1dEVsZW1lbnRzKG91dHB1dCwgcmVhZGVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwYXJzZU1lc3NhZ2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewogICAgICAgICBTdHJpbmcgbXNnTmFtZSA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCBXU0RMQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UobmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbXNnTmFtZSkpOworICAgICAgICBXU0RMTWVzc2FnZUltcGwgbXNnID0gbmV3IFdTRExNZXNzYWdlSW1wbChyZWFkZXIsbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbXNnTmFtZSkpOworICAgICAgICBleHRlbnNpb25GYWNhZGUubWVzc2FnZUF0dHJpYnV0ZXMobXNnLCByZWFkZXIpOworICAgICAgICBpbnQgcGFydEluZGV4ID0gMDsKICAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7CiAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcmVhZGVyLmdldE5hbWUoKTsKICAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLlFOQU1FX1BBUlQuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSBQYXJzZXJVdGlsLmdldE1hbmRhdG9yeU5vbkVtcHR5QXR0cmlidXRlKHJlYWRlciwgV1NETENvbnN0YW50cy5BVFRSX05BTUUpOwotLy8gICAgICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSBudWxsOwotLy8gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gcmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCk7Ci0vLyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZU5hbWUoaSkuZXF1YWxzKCJlbGVtZW50IikgfHwgcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWUoaSkuZXF1YWxzKCJ0eXBlIikpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgaWYgKGRlc2MgPT0gbnVsbCkKLS8vICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBtc2cuYWRkKHBhcnQpOwotICAgICAgICAgICAgICAgIGlmKHJlYWRlci5nZXRFdmVudFR5cGUoKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpCisgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSBudWxsOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOworICAgICAgICAgICAgICAgIFdTRExEZXNjcmlwdG9yS2luZCBraW5kID0gV1NETERlc2NyaXB0b3JLaW5kLkVMRU1FTlQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFFOYW1lIGRlc2NOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWUoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoImVsZW1lbnQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSBXU0RMRGVzY3JpcHRvcktpbmQuRUxFTUVOVDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVzY05hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCJUWVBFIikpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gV1NETERlc2NyaXB0b3JLaW5kLlRZUEU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscygiZWxlbWVudCIpIHx8IGRlc2NOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscygidHlwZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBXU0RMUGFydEltcGwgd3NkbFBhcnQgPSBuZXcgV1NETFBhcnRJbXBsKHJlYWRlciwgcGFydCwgcGFydEluZGV4LCBuZXcgV1NETFBhcnREZXNjcmlwdG9ySW1wbChyZWFkZXIsUGFyc2VyVXRpbC5nZXRRTmFtZShyZWFkZXIsIGRlc2MpLCBraW5kKSk7CisgICAgICAgICAgICAgICAgbXNnLmFkZCh3c2RsUGFydCk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpCiAgICAgICAgICAgICAgICAgICAgIGdvVG9FbmQocmVhZGVyKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmFjYWRlLm1lc3NhZ2VFbGVtZW50cyhtc2csIHJlYWRlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgd3NkbERvYy5hZGRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIGlmKHJlYWRlci5nZXRFdmVudFR5cGUoKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpCisgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKQogICAgICAgICAgICAgZ29Ub0VuZChyZWFkZXIpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ29Ub0VuZChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKXsKLSAgICAgICAgd2hpbGUgKFhNTFN0cmVhbVJlYWRlclV0aWwubmV4dEVsZW1lbnRDb250ZW50KHJlYWRlcikgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKXsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdvVG9FbmQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICB3aGlsZSAoWE1MU3RyZWFtUmVhZGVyVXRpbC5uZXh0RWxlbWVudENvbnRlbnQocmVhZGVyKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIE1ha2Ugc3VyZSB0byByZXR1cm4gYSAiZnJlc2giIHJlYWRlciBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkIGJlY2F1c2UKKyAgICAgKiBtb3JlIHRoYW4gb25lIGFjdGl2ZSByZWFkZXIgbWF5IGJlIG5lZWRlZCB3aXRoaW4gYSBzaW5nbGUgdGhyZWFkCisgICAgICogdG8gcGFyc2UgYSBXU0RMIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIGNyZWF0ZVJlYWRlcihVUkwgd3NkbExvYykgdGhyb3dzIElPRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSB3c2RsTG9jLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUaWR5WE1MU3RyZWFtUmVhZGVyKFhNTFN0cmVhbVJlYWRlckZhY3RvcnkuY3JlYXRlKHdzZGxMb2MudG9FeHRlcm5hbEZvcm0oKSwgc3RyZWFtLCBmYWxzZSksIHN0cmVhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyKFdTRExQYXJzZXJFeHRlbnNpb24gZSkgeworICAgICAgICAvLyBwcm90ZWN0IEpBWC1XUyBSSSBmcm9tIGJyb2tlbiBwYXJzZXIgZXh0ZW5zaW9uCisgICAgICAgIGV4dGVuc2lvbnMuYWRkKG5ldyBGb29sUHJvb2ZQYXJzZXJFeHRlbnNpb24oZSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJ1bnRpbWVXU0RMUGFyc2VyLmNsYXNzLmdldE5hbWUoKSk7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TT0FQQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TT0FQQ29uc3RhbnRzLmphdmEKaW5kZXggOTkxZWJlZi4uMGMxOTJkZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvU09BUENvbnN0YW50cy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1NPQVBDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02Myw2ICs2Myw4IEBACiAgICAgICAgIG5ldyBRTmFtZShOU19XU0RMX1NPQVAsICJoZWFkZXJmYXVsdCIpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfT1BFUkFUSU9OID0KICAgICAgICAgbmV3IFFOYW1lKE5TX1dTRExfU09BUCwgIm9wZXJhdGlvbiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfU09BUDEyT1BFUkFUSU9OID0KKyAgICAgICAgbmV3IFFOYW1lKE5TX1dTRExfU09BUDEyLCAib3BlcmF0aW9uIik7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9NVVNUVU5ERVJTVEFORCA9CiAgICAgICAgIG5ldyBRTmFtZShVUklfRU5WRUxPUEUsICJtdXN0VW5kZXJzdGFuZCIpOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TZXJ2aWNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTU3YmUuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZSBleHRlbmRzIExpbmtlZEhhc2hNYXA8UU5hbWUsIFBvcnQ+IHsKLSAgICBwcml2YXRlIFFOYW1lIG5hbWU7Ci0KLSAgICBwdWJsaWMgU2VydmljZShRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1czQ0FkZHJlc3NpbmdXU0RMUGFyc2VyRXh0ZW5zaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XM0NBZGRyZXNzaW5nV1NETFBhcnNlckV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWRmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XM0NBZGRyZXNzaW5nV1NETFBhcnNlckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuYWRkcmVzc2luZy5BZGRyZXNzaW5nVmVyc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMQm91bmRPcGVyYXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEJvdW5kUG9ydFR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETEZhdWx0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLldTRExGZWF0dXJlZE9iamVjdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLndzZGwuV1NETE9wZXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMUG9ydDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMU2VydmljZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuV1NETFBhcnNlckV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC5wYXJzZXIuV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMQm91bmRPcGVyYXRpb25JbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETEJvdW5kUG9ydFR5cGVJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLndzZGwuV1NETE9wZXJhdGlvbkltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMUG9ydEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMUG9ydFR5cGVJbXBsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnN0cmVhbWluZy5YTUxTdHJlYW1SZWFkZXJVdGlsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnJlc291cmNlcy5BZGRyZXNzaW5nTWVzc2FnZXM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVzNDIFdTLUFkZHJlc3NpbmcgUnVudGltZSBXU0RMIHBhcnNlciBleHRlbnNpb24KKyAqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworcHVibGljIGNsYXNzIFczQ0FkZHJlc3NpbmdXU0RMUGFyc2VyRXh0ZW5zaW9uIGV4dGVuZHMgV1NETFBhcnNlckV4dGVuc2lvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYmluZGluZ0VsZW1lbnRzKFdTRExCb3VuZFBvcnRUeXBlIGJpbmRpbmcsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3NpYmxlRWxlbWVudChyZWFkZXIsIGJpbmRpbmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBvcnRFbGVtZW50cyhXU0RMUG9ydCBwb3J0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzaWJsZUVsZW1lbnQocmVhZGVyLCBwb3J0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkcmVzc2libGVFbGVtZW50KFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFdTRExGZWF0dXJlZE9iamVjdCBiaW5kaW5nKSB7CisgICAgICAgIFFOYW1lIHVhID0gcmVhZGVyLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHVhLmVxdWFscyhBZGRyZXNzaW5nVmVyc2lvbi5XM0Mud3NkbEV4dGVuc2lvblRhZykpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1aXJlZCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShXU0RMQ29uc3RhbnRzLk5TX1dTREwsICJyZXF1aXJlZCIpOworICAgICAgICAgICAgYmluZGluZy5hZGRGZWF0dXJlKG5ldyBBZGRyZXNzaW5nRmVhdHVyZSh0cnVlLCBCb29sZWFuLnBhcnNlQm9vbGVhbihyZXF1aXJlZCkpKTsKKyAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgLy8gVXNpbmdBZGRyZXNzaW5nIGlzIGNvbnN1bWVkCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYmluZGluZ09wZXJhdGlvbkVsZW1lbnRzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgV1NETEJvdW5kT3BlcmF0aW9uSW1wbCBpbXBsID0gKFdTRExCb3VuZE9wZXJhdGlvbkltcGwpb3BlcmF0aW9uOworCisgICAgICAgIFFOYW1lIGFub24gPSByZWFkZXIuZ2V0TmFtZSgpOworICAgICAgICBpZiAoYW5vbi5lcXVhbHMoQWRkcmVzc2luZ1ZlcnNpb24uVzNDLndzZGxBbm9ueW1vdXNUYWcpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRyaW0oKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJOdWxsIHZhbHVlcyBub3QgcGVybWl0dGVkIGluIHdzYXc6QW5vbnltb3VzLiIpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBleGNlcHRpb24gb25seSBpZiB3c2RsOnJlcXVpcmVkPXRydWUKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaXMgdGhpcyB0aGUgcmlnaHQgZXhjZXB0aW9uID8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmVxdWFscygib3B0aW9uYWwiKSkgeworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEFub255bW91cyhXU0RMQm91bmRPcGVyYXRpb24uQU5PTllNT1VTLm9wdGlvbmFsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmVxdWFscygicmVxdWlyZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEFub255bW91cyhXU0RMQm91bmRPcGVyYXRpb24uQU5PTllNT1VTLnJlcXVpcmVkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmVxdWFscygicHJvaGliaXRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0QW5vbnltb3VzKFdTRExCb3VuZE9wZXJhdGlvbi5BTk9OWU1PVVMucHJvaGliaXRlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIndzYXc6QW5vbnltb3VzIHZhbHVlIFwiIiArIHZhbHVlICsgIlwiIG5vdCB1bmRlcnN0b29kLiIpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBleGNlcHRpb24gb25seSBpZiB3c2RsOnJlcXVpcmVkPXRydWUKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaXMgdGhpcyB0aGUgcmlnaHQgZXhjZXB0aW9uID8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOyAgICAgICAvLyBUT0RPOiBpcyB0aGlzIHRoZSBjb3JyZWN0IGJlaGF2aW9yID8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAvLyBjb25zdW1lZCB0aGUgZWxlbWVudAorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uSW5wdXQoV1NETE9wZXJhdGlvbiBvLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIFdTRExPcGVyYXRpb25JbXBsIGltcGwgPSAoV1NETE9wZXJhdGlvbkltcGwpbzsKKworICAgICAgICBTdHJpbmcgYWN0aW9uID0gUGFyc2VyVXRpbC5nZXRBdHRyaWJ1dGUocmVhZGVyLCBBZGRyZXNzaW5nVmVyc2lvbi5XM0Mud3NkbEFjdGlvblRhZyk7CisgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaW1wbC5nZXRJbnB1dCgpLnNldEFjdGlvbihhY3Rpb24pOworICAgICAgICAgICAgaW1wbC5nZXRJbnB1dCgpLnNldERlZmF1bHRBY3Rpb24oZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uT3V0cHV0KFdTRExPcGVyYXRpb24gbywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBXU0RMT3BlcmF0aW9uSW1wbCBpbXBsID0gKFdTRExPcGVyYXRpb25JbXBsKW87CisKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IFBhcnNlclV0aWwuZ2V0QXR0cmlidXRlKHJlYWRlciwgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLndzZGxBY3Rpb25UYWcpOworICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGltcGwuZ2V0T3V0cHV0KCkuc2V0QWN0aW9uKGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25GYXVsdChXU0RMT3BlcmF0aW9uIG8sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgV1NETE9wZXJhdGlvbkltcGwgaW1wbCA9IChXU0RMT3BlcmF0aW9uSW1wbClvOworCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBQYXJzZXJVdGlsLmdldEF0dHJpYnV0ZShyZWFkZXIsIEFkZHJlc3NpbmdWZXJzaW9uLlczQy53c2RsQWN0aW9uVGFnKTsKKyAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IFBhcnNlclV0aWwuZ2V0TWFuZGF0b3J5Tm9uRW1wdHlBdHRyaWJ1dGUocmVhZGVyLCAibmFtZSIpOworICAgICAgICAgICAgaW1wbC5nZXRGYXVsdEFjdGlvbk1hcCgpLnB1dChuYW1lLCBhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3Mgd3NkbDpwb3J0VHlwZSBvcGVyYXRpb24gYWZ0ZXIgdGhlIGVudGlyZSBXU0RMIG1vZGVsIGhhcyBiZWVuIHBvcHVsYXRlZC4KKyAgICAgKiBUaGUgdGFzayBsaXN0IGluY2x1ZGVzOiA8cD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlBhdGNoIHRoZSB2YWx1ZSBvZiBVc2luZ0FkZHJlc3NpbmcgaW4gd3NkbDpwb3J0IGFuZCB3c2RsOmJpbmRpbmc8L2xpPgorICAgICAqIDxsaT5Qb3B1bGF0ZSBhY3Rpb25zIGZvciB0aGUgbWVzc2FnZXMgdGhhdCBkbyBub3QgaGF2ZSBhbiBleHBsaWNpdCB3c2F3OkFjdGlvbjwvbGk+CisgICAgICogPGxpPlBhdGNoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHdzYXc6QW5vbnltb3VzPW9wdGlvbmFsIGlmIG5vbmUgaXMgc3BlY2lmaWVkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoZWQoV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgICBXU0RMTW9kZWwgbW9kZWwgPSBjb250ZXh0LmdldFdTRExNb2RlbCgpOworICAgICAgICBmb3IgKFdTRExTZXJ2aWNlIHNlcnZpY2UgOiBtb2RlbC5nZXRTZXJ2aWNlcygpLnZhbHVlcygpKSB7CisgICAgICAgICAgICBmb3IgKFdTRExQb3J0IHdwIDogc2VydmljZS5nZXRQb3J0cygpKSB7CisgICAgICAgICAgICAgICAgV1NETFBvcnRJbXBsIHBvcnQgPSAoV1NETFBvcnRJbXBsKXdwOworICAgICAgICAgICAgICAgIFdTRExCb3VuZFBvcnRUeXBlSW1wbCBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7CisKKyAgICAgICAgICAgICAgICAvLyBwb3B1bGF0ZSBhY3Rpb25zIGZvciB0aGUgbWVzc2FnZXMgdGhhdCBkbyBub3QgaGF2ZSBhbiBleHBsaWNpdCB3c2F3OkFjdGlvbgorICAgICAgICAgICAgICAgIHBvcHVsYXRlQWN0aW9ucyhiaW5kaW5nKTsKKworICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHdzYXc6QW5vbnltb3VzPW9wdGlvbmFsIGlmIG5vbmUgaXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgcGF0Y2hBbm9ueW1vdXNEZWZhdWx0KGJpbmRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7CisgICAgICAgIHJldHVybiBBZGRyZXNzaW5nVmVyc2lvbi5XM0Mud3NkbE5zVXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIGFsbCB0aGUgQWN0aW9ucworICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmcgc29hcGJpbmRpbmc6b3BlcmF0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQWN0aW9ucyhXU0RMQm91bmRQb3J0VHlwZUltcGwgYmluZGluZykgeworICAgICAgICBXU0RMUG9ydFR5cGVJbXBsIHBvcnR0eXBlID0gYmluZGluZy5nZXRQb3J0VHlwZSgpOworICAgICAgICBmb3IgKFdTRExPcGVyYXRpb25JbXBsIG8gOiBwb3J0dHlwZS5nZXRPcGVyYXRpb25zKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbWF5IGJlIHBlcmZvcm1hbmNlIGludGVuc2l2ZS4gQWx0ZXJuYXRpdmVseSBkZWZhdWx0IGFjdGlvbgorICAgICAgICAgICAgLy8gVE9ETzogY2FuIGJlIGNhbGN1bGF0ZWQgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGFjdHVhbGx5IGludm9rZWQuCisgICAgICAgICAgICBXU0RMQm91bmRPcGVyYXRpb25JbXBsIHdib2kgPSBiaW5kaW5nLmdldChvLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmICh3Ym9pID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvL0lmIHRoaXMgb3BlcmF0aW9uIGlzIHVuYm91bmQgc2V0IHRoZSBhY3Rpb24gdG8gZGVmYXVsdAorICAgICAgICAgICAgICAgIG8uZ2V0SW5wdXQoKS5zZXRBY3Rpb24oZGVmYXVsdElucHV0QWN0aW9uKG8pKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IHdib2kuZ2V0U09BUEFjdGlvbigpOworICAgICAgICAgICAgaWYgKG8uZ2V0SW5wdXQoKS5nZXRBY3Rpb24oKSA9PSBudWxsIHx8IG8uZ2V0SW5wdXQoKS5nZXRBY3Rpb24oKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgd3NhdzpBY3Rpb24gaXMgbm90IHNwZWNpZmllZAorCisgICAgICAgICAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCAmJiAhc29hcEFjdGlvbi5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNvYXBBY3Rpb24gaXMgbm9uLWVtcHR5LCB1c2UgdGhhdAorICAgICAgICAgICAgICAgICAgICBvLmdldElucHV0KCkuc2V0QWN0aW9uKHNvYXBBY3Rpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBnZW5lcmF0ZSBkZWZhdWx0IEFjdGlvbgorICAgICAgICAgICAgICAgICAgICBvLmdldElucHV0KCkuc2V0QWN0aW9uKGRlZmF1bHRJbnB1dEFjdGlvbihvKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBhbmQgZmF1bHQgcHJvY2Vzc2luZyBmb3Igb25lLXdheSBtZXRob2RzCisgICAgICAgICAgICBpZiAoby5nZXRPdXRwdXQoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoby5nZXRPdXRwdXQoKS5nZXRBY3Rpb24oKSA9PSBudWxsIHx8IG8uZ2V0T3V0cHV0KCkuZ2V0QWN0aW9uKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIG8uZ2V0T3V0cHV0KCkuc2V0QWN0aW9uKGRlZmF1bHRPdXRwdXRBY3Rpb24obykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoby5nZXRGYXVsdHMoKSA9PSBudWxsIHx8ICFvLmdldEZhdWx0cygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBNYXA8U3RyaW5nLFN0cmluZz4gbWFwID0gby5nZXRGYXVsdEFjdGlvbk1hcCgpOworICAgICAgICAgICAgZm9yIChXU0RMRmF1bHQgZiA6IG8uZ2V0RmF1bHRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFwLmdldChmLmdldE5hbWUoKSkgPT0gbnVsbCB8fCBtYXAuZ2V0KGYuZ2V0TmFtZSgpKS5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGYuZ2V0TmFtZSgpLCBkZWZhdWx0RmF1bHRBY3Rpb24oZi5nZXROYW1lKCksIG8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhdGNoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHdzYXc6QW5vbnltb3VzPW9wdGlvbmFsIGlmIG5vbmUgaXMgc3BlY2lmaWVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyBXU0RMQm91bmRQb3J0VHlwZUltcGwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXRjaEFub255bW91c0RlZmF1bHQoV1NETEJvdW5kUG9ydFR5cGVJbXBsIGJpbmRpbmcpIHsKKyAgICAgICAgZm9yIChXU0RMQm91bmRPcGVyYXRpb25JbXBsIHdibyA6IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKSkgeworICAgICAgICAgICAgaWYgKHdiby5nZXRBbm9ueW1vdXMoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdiby5zZXRBbm9ueW1vdXMoV1NETEJvdW5kT3BlcmF0aW9uLkFOT05ZTU9VUy5vcHRpb25hbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0SW5wdXRBY3Rpb24oV1NETE9wZXJhdGlvbiBvKSB7CisgICAgICAgIHJldHVybiBidWlsZEFjdGlvbihvLmdldElucHV0KCkuZ2V0TmFtZSgpLCBvLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE91dHB1dEFjdGlvbihXU0RMT3BlcmF0aW9uIG8pIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkQWN0aW9uKG8uZ2V0T3V0cHV0KCkuZ2V0TmFtZSgpLCBvLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEZhdWx0QWN0aW9uKFN0cmluZyBuYW1lLCBXU0RMT3BlcmF0aW9uIG8pIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkQWN0aW9uKG5hbWUsIG8sIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGJ1aWxkQWN0aW9uKFN0cmluZyBuYW1lLCBXU0RMT3BlcmF0aW9uIG8sIGJvb2xlYW4gaXNGYXVsdCkgeworICAgICAgICBTdHJpbmcgdG5zID0gby5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisKKyAgICAgICAgU3RyaW5nIGRlbGltID0gU0xBU0hfREVMSU1JVEVSOworCisgICAgICAgIC8vIFRPRE86IGlzIHRoaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIGZpbmQgdGhlIHNlcGFyYXRvciA/CisgICAgICAgIGlmICghdG5zLnN0YXJ0c1dpdGgoImh0dHAiKSkKKyAgICAgICAgICAgIGRlbGltID0gQ09MT05fREVMSU1JVEVSOworCisgICAgICAgIGlmICh0bnMuZW5kc1dpdGgoZGVsaW0pKQorICAgICAgICAgICAgdG5zID0gdG5zLnN1YnN0cmluZygwLCB0bnMubGVuZ3RoKCktMSk7CisKKyAgICAgICAgaWYgKG8uZ2V0UG9ydFR5cGVOYW1lKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJcIiIgKyBvLmdldE5hbWUoKSArICJcIiBvcGVyYXRpb24ncyBvd25pbmcgcG9ydFR5cGUgbmFtZSBpcyBudWxsLiIpOworCisgICAgICAgIHJldHVybiB0bnMgKworICAgICAgICAgICAgZGVsaW0gKworICAgICAgICAgICAgby5nZXRQb3J0VHlwZU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArCisgICAgICAgICAgICBkZWxpbSArCisgICAgICAgICAgICAoaXNGYXVsdCA/IG8uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgZGVsaW0gKyAiRmF1bHQiICsgZGVsaW0gOiAiIikgKworICAgICAgICAgICAgbmFtZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPTl9ERUxJTUlURVIgPSAiOiI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0hfREVMSU1JVEVSID0gIi8iOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETENvbnN0YW50cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETENvbnN0YW50cy5qYXZhCmluZGV4IDExNWY2ZjMuLjZlM2MwNmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1dTRExDb25zdGFudHMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XU0RMQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzQsNiArMzQsNyBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFdTRExDb25zdGFudHMgewogICAgIC8vIG5hbWVzcGFjZSBVUklzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX05TX1dTREwgPSAid3NkbCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfWE1MTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1dTREwgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1NPQVAxMV9IVFRQX0JJTkRJTkcgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1dTRExEb2N1bWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMmZmZTcuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlcjsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuTW9kZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgV1NETERvY3VtZW50IHsKLSAgICBwcm90ZWN0ZWQgTWFwPFFOYW1lLCBNZXNzYWdlPiBtZXNzYWdlczsKLSAgICBwcm90ZWN0ZWQgTWFwPFFOYW1lLCBQb3J0VHlwZT4gcG9ydFR5cGVzOwotICAgIHByb3RlY3RlZCBNYXA8UU5hbWUsIEJpbmRpbmc+IGJpbmRpbmdzOwotICAgIHByb3RlY3RlZCBNYXA8UU5hbWUsIFNlcnZpY2U+IHNlcnZpY2VzOwotCi0gICAgcHVibGljIFdTRExEb2N1bWVudCgpIHsKLSAgICAgICAgbWVzc2FnZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgTWVzc2FnZT4oKTsKLSAgICAgICAgcG9ydFR5cGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFBvcnRUeXBlPigpOwotICAgICAgICBiaW5kaW5ncyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBCaW5kaW5nPigpOwotICAgICAgICBzZXJ2aWNlcyA9IG5ldyBMaW5rZWRIYXNoTWFwPFFOYW1lLCBTZXJ2aWNlPigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoTWVzc2FnZSBtc2cpewotICAgICAgICBtZXNzYWdlcy5wdXQobXNnLmdldE5hbWUoKSwgbXNnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKFFOYW1lIG5hbWUpewotICAgICAgICByZXR1cm4gbWVzc2FnZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBvcnRUeXBlKFBvcnRUeXBlIHB0KXsKLSAgICAgICAgcG9ydFR5cGVzLnB1dChwdC5nZXROYW1lKCksIHB0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9ydFR5cGUgZ2V0UG9ydFR5cGUoUU5hbWUgbmFtZSl7Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKXsKLSAgICAgICAgYmluZGluZ3MucHV0KGJpbmRpbmcuZ2V0TmFtZSgpLCBiaW5kaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKFFOYW1lIG5hbWUpewotICAgICAgICByZXR1cm4gYmluZGluZ3MuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzdmMpewotICAgICAgICBzZXJ2aWNlcy5wdXQoc3ZjLmdldE5hbWUoKSwgc3ZjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKFFOYW1lIG5hbWUpewotICAgICAgICByZXR1cm4gc2VydmljZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8UU5hbWUsIFNlcnZpY2U+IGdldFNlcnZpY2VzKCl7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBzZXJ2aWNlIFFOYW1lIGZyb20gaW5zZXJ0aW9uIG9yZGVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRGaXJzdFNlcnZpY2VOYW1lKCl7Ci0gICAgICAgIGlmKHNlcnZpY2VzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZmlyc3QgcG9ydCBRTmFtZSBmcm9tIGZpcnN0IHNlcnZpY2UgYXMgcGVyIHRoZSBpbnNlcnRpb24gb3JkZXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldEZpcnN0UG9ydE5hbWUoKXsKLSAgICAgICAgaWYoc2VydmljZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBJdGVyYXRvcjxRTmFtZT4gaXRlciA9IHNlcnZpY2Uua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgUU5hbWUgcG9ydCA9IChpdGVyLmhhc05leHQoKSk/aXRlci5uZXh0KCk6bnVsbDsKLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQb3J0IGdldEZpcnN0UG9ydCgpewotICAgICAgICBpZihzZXJ2aWNlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIENvbGxlY3Rpb248UG9ydD4gY29sbCA9IHNlcnZpY2UudmFsdWVzKCk7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChjb2xsICE9IG51bGwpPygoY29sbC5pdGVyYXRvcigpLmhhc05leHQoKSk/Y29sbC5pdGVyYXRvcigpLm5leHQoKTpudWxsKTpudWxsOwotICAgICAgICByZXR1cm4gcG9ydDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYmluaW5nSWQgb2YgdGhlIGZpcnN0IHBvcnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSWQoKXsKLSAgICAgICAgUG9ydCBwb3J0ID0gZ2V0Rmlyc3RQb3J0KCk7Ci0gICAgICAgIGlmKHBvcnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBiaW5kaW5ncy5nZXQocG9ydC5nZXRCaW5kaW5nTmFtZSgpKTsKLSAgICAgICAgaWYoYmluZGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nLmdldEJpbmRpbmdJZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBiaW5kaW5nIElkIG9mIHRoZSBnaXZlbiBzZXJ2aWNlIGFuZCBwb3J0Ci0gICAgICogQHBhcmFtIHNlcnZpY2UKLSAgICAgKiBAcGFyYW0gcG9ydAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdJZChRTmFtZSBzZXJ2aWNlLCBRTmFtZSBwb3J0KXsKLSAgICAgICAgU2VydmljZSBzID0gc2VydmljZXMuZ2V0KHNlcnZpY2UpOwotICAgICAgICBpZihzICE9IG51bGwpewotICAgICAgICAgICAgUG9ydCBwID0gcy5nZXQocG9ydCk7Ci0gICAgICAgICAgICBpZihwICE9IG51bGwpewotICAgICAgICAgICAgICAgIEJpbmRpbmcgYiA9IGJpbmRpbmdzLmdldChwLmdldEJpbmRpbmdOYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmKGIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIuZ2V0QmluZGluZ0lkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgbm9uLW51bGwgc2VydmljZSBRTmFtZQotICAgICAqIEBwYXJhbSBwb3J0TmFtZSAgICBub24tbnVsbCBwb3J0IFFOYW1lCi0gICAgICogQHJldHVybgotICAgICAqICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb24gc3VjY2VzcyBvdGhlcndpc2UgbnVsbC4gdGhyb3dzIE5QRSBpZiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnROYW1lKXsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gc2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKXsKLSAgICAgICAgICAgIFBvcnQgcG9ydCA9IHNlcnZpY2UuZ2V0KHBvcnROYW1lKTsKLSAgICAgICAgICAgIGlmKHBvcnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgUU5hbWUgYmluZGluZ05hbWUgPSBwb3J0LmdldEJpbmRpbmdOYW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzLmdldChiaW5kaW5nTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZ3MgZm9yIHRoZSBnaXZlbiBiaW5kaW5nSWQKLSAgICAgKiBAcGFyYW0gc2VydmljZSAgbm9uLW51bGwgc2VydmljZQotICAgICAqIEBwYXJhbSBiaW5kaW5nSWQgIG5vbi1udWxsIGJpbmRpbmcgaWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8QmluZGluZz4gZ2V0QmluZGluZ3MoU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgYmluZGluZ0lkKXsKLSAgICAgICAgTGlzdDxCaW5kaW5nPiBicyA9IG5ldyBBcnJheUxpc3Q8QmluZGluZz4oKTsKLSAgICAgICAgQ29sbGVjdGlvbjxQb3J0PiBwb3J0cyA9IHNlcnZpY2UudmFsdWVzKCk7Ci0gICAgICAgIGlmKHBvcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBiczsKLSAgICAgICAgZm9yKFBvcnQgcG9ydDpwb3J0cyl7Ci0gICAgICAgICAgICBCaW5kaW5nIGIgPSBiaW5kaW5ncy5nZXQocG9ydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYoYiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBiczsKLSAgICAgICAgICAgIGlmKGIuZXF1YWxzKGJpbmRpbmdJZCkpCi0gICAgICAgICAgICAgICAgYnMuYWRkKGIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UG9ydE5hbWUoUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnRUeXBlKXsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gc2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgZm9yKFBvcnQgcG9ydDpzZXJ2aWNlLnZhbHVlcygpKXsKLSAgICAgICAgICAgIFFOYW1lIGJpbmRpbmdOYW1lID0gcG9ydC5nZXRCaW5kaW5nTmFtZSgpOwotICAgICAgICAgICAgYXNzZXJ0IChiaW5kaW5nTmFtZSAhPSBudWxsKTsKLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzLmdldChiaW5kaW5nTmFtZSk7Ci0gICAgICAgICAgICBRTmFtZSBwdE5hbWUgPSBiaW5kaW5nLmdldFBvcnRUeXBlTmFtZSgpOwotICAgICAgICAgICAgYXNzZXJ0IChwdE5hbWUgIT0gbnVsbCk7Ci0gICAgICAgICAgICBpZihwdE5hbWUuZXF1YWxzKHBvcnRUeXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9ydC5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluYWxpemVCaW5kaW5nKEJpbmRpbmcgYmluZGluZyl7Ci0gICAgICAgIGFzc2VydChiaW5kaW5nICE9IG51bGwpOwotICAgICAgICBRTmFtZSBwb3J0VHlwZU5hbWUgPSBiaW5kaW5nLmdldFBvcnRUeXBlTmFtZSgpOwotICAgICAgICBpZihwb3J0VHlwZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBwb3J0VHlwZXMuZ2V0KHBvcnRUeXBlTmFtZSk7Ci0gICAgICAgIGlmKHB0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvcihTdHJpbmcgb3A6YmluZGluZy5rZXlTZXQoKSl7Ci0gICAgICAgICAgICBQb3J0VHlwZU9wZXJhdGlvbiBwdG8gPSBwdC5nZXQob3ApOwotICAgICAgICAgICAgaWYocHRvID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgUU5hbWUgaW5Nc2dOYW1lID0gcHRvLmdldElucHV0TWVzc2FnZSgpOwotICAgICAgICAgICAgaWYoaW5Nc2dOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBNZXNzYWdlIGluTXNnID0gbWVzc2FnZXMuZ2V0KGluTXNnTmFtZSk7Ci0gICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvID0gYmluZGluZy5nZXQob3ApOwotICAgICAgICAgICAgaW50IGJvZHlpbmRleCA9IDA7Ci0gICAgICAgICAgICBpZihpbk1zZyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBmb3IoU3RyaW5nIG5hbWU6aW5Nc2cpewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBiID0gYm8uZ2V0SW5wdXRCaW5kaW5nKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZihwYi5pc0JvZHkoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiby5hZGRQYXJ0KG5ldyBQYXJ0KG5hbWUsIHBiLCBib2R5aW5kZXgrKyksIE1vZGUuSU4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9keWluZGV4PTA7Ci0gICAgICAgICAgICBRTmFtZSBvdXRNc2dOYW1lID0gcHRvLmdldE91dHB1dE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmKG91dE1zZ05hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIE1lc3NhZ2Ugb3V0TXNnID0gbWVzc2FnZXMuZ2V0KG91dE1zZ05hbWUpOwotICAgICAgICAgICAgaWYob3V0TXNnIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgZm9yKFN0cmluZyBuYW1lOm91dE1zZyl7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgcGIgPSBiby5nZXRPdXRwdXRCaW5kaW5nKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZihwYi5pc0JvZHkoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiby5hZGRQYXJ0KG5ldyBQYXJ0KG5hbWUsIHBiLCBib2R5aW5kZXgrKyksIE1vZGUuT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1dTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC9wYXJzZXIvV1NETFBhcnNlckV4dGVuc2lvbkNvbnRleHRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4Mzk5OQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1dTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC5wYXJzZXI7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwud3NkbC5XU0RMTW9kZWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0OworCisvKioKKyAqIFByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dH0KKyAqCisgKiBAYXV0aG9yIFZpdmVrIFBhbmRleQorICovCitmaW5hbCBjbGFzcyBXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dEltcGwgaW1wbGVtZW50cyBXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dCB7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQ2xpZW50U2lkZTsKKyAgICBwcml2YXRlIGZpbmFsIFdTRExNb2RlbCB3c2RsTW9kZWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Qge0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0SW1wbH0gd2l0aCBpbmZvcm1hdGlvbiB0aGF0IHdoZXRoZXIgaXRzIG9uIGNsaWVudCBzaWRlCisgICAgICogb3Igc2VydmVyIHNpZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFdTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0SW1wbChXU0RMTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNDbGllbnRTaWRlKSB7CisgICAgICAgIHRoaXMud3NkbE1vZGVsID0gbW9kZWw7CisgICAgICAgIHRoaXMuaXNDbGllbnRTaWRlID0gaXNDbGllbnRTaWRlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xpZW50U2lkZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzQ2xpZW50U2lkZTsKKyAgICB9CisKKyAgICBwdWJsaWMgV1NETE1vZGVsIGdldFdTRExNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHdzZGxNb2RlbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XU0RMUGFyc2VyRXh0ZW5zaW9uRmFjYWRlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3BhcnNlci9XU0RMUGFyc2VyRXh0ZW5zaW9uRmFjYWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkNThiMgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvcGFyc2VyL1dTRExQYXJzZXJFeHRlbnNpb25GYWNhZGUuamF2YQpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwucGFyc2VyLldTRExQYXJzZXJFeHRlbnNpb25Db250ZXh0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC53c2RsLio7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3RyZWFtaW5nLlhNTFN0cmVhbVJlYWRlclV0aWw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMUG9ydEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwud3NkbC5XU0RMQm91bmRQb3J0VHlwZUltcGw7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOworCitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkxvY2F0b3JJbXBsOworCisvKioKKyAqIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufSB0aGF0IGRlbGVnYXRlcyB0bworICogbXVsdGlwbGUge0BsaW5rIFdTRExQYXJzZXJFeHRlbnNpb259cy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgc2ltcGxpZmllcyB7QGxpbmsgUnVudGltZVdTRExQYXJzZXJ9IHNpbmNlIGl0IG5vdworICogb25seSBuZWVkcyB0byB3b3JrIHdpdGggb25lIHtAbGluayBXU0RMUGFyc2VyRXh0ZW5zaW9ufS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdHJ1ZSBmcm9tCisgKiBhbGwgdGhlIGV4dGVuc2lvbiBjYWxsYmFjayBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworZmluYWwgY2xhc3MgV1NETFBhcnNlckV4dGVuc2lvbkZhY2FkZSBleHRlbmRzIFdTRExQYXJzZXJFeHRlbnNpb24geworICAgIHByaXZhdGUgZmluYWwgV1NETFBhcnNlckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7CisKKyAgICBXU0RMUGFyc2VyRXh0ZW5zaW9uRmFjYWRlKFdTRExQYXJzZXJFeHRlbnNpb24uLi4gZXh0ZW5zaW9ucykgeworICAgICAgICBhc3NlcnQgZXh0ZW5zaW9ucyE9bnVsbDsKKyAgICAgICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydChXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgZS5zdGFydChjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNlcnZpY2VFbGVtZW50cyhXU0RMU2VydmljZSBzZXJ2aWNlLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgaWYoZS5zZXJ2aWNlRWxlbWVudHMoc2VydmljZSxyZWFkZXIpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VydmljZUF0dHJpYnV0ZXMoV1NETFNlcnZpY2Ugc2VydmljZSwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLnNlcnZpY2VBdHRyaWJ1dGVzKHNlcnZpY2UscmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3J0RWxlbWVudHMoV1NETFBvcnQgcG9ydCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmKGUucG9ydEVsZW1lbnRzKHBvcnQscmVhZGVyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvL2V4dGVuc2lvbiBpcyBub3QgdW5kZXJzdG9vZCBieSBhbnkgV1NEbFBhcnNlckV4dGVuc2lvbgorICAgICAgICAvL0NoZWNrIGlmIGl0IG11c3QgYmUgdW5kZXJzdG9vZC4KKyAgICAgICAgaWYoaXNSZXF1aXJlZEV4dGVuc2lvbihyZWFkZXIpKSB7CisgICAgICAgICAgICAoKFdTRExQb3J0SW1wbClwb3J0KS5hZGROb3RVbmRlcnN0b29kRXh0ZW5zaW9uKHJlYWRlci5nZXROYW1lKCksZ2V0TG9jYXRvcihyZWFkZXIpKTsKKyAgICAgICAgfQorICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uSW5wdXQoV1NETE9wZXJhdGlvbiBvcCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLnBvcnRUeXBlT3BlcmF0aW9uSW5wdXQob3AscmVhZGVyKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25PdXRwdXQoV1NETE9wZXJhdGlvbiBvcCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLnBvcnRUeXBlT3BlcmF0aW9uT3V0cHV0KG9wLHJlYWRlcik7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uRmF1bHQoV1NETE9wZXJhdGlvbiBvcCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLnBvcnRUeXBlT3BlcmF0aW9uRmF1bHQob3AscmVhZGVyKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9ydEF0dHJpYnV0ZXMoV1NETFBvcnQgcG9ydCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLnBvcnRBdHRyaWJ1dGVzKHBvcnQscmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkZWZpbml0aW9uc0VsZW1lbnRzKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChlLmRlZmluaXRpb25zRWxlbWVudHMocmVhZGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmluZGluZ0VsZW1lbnRzKFdTRExCb3VuZFBvcnRUeXBlIGJpbmRpbmcsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChlLmJpbmRpbmdFbGVtZW50cyhiaW5kaW5nLCByZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9leHRlbnNpb24gaXMgbm90IHVuZGVyc3Rvb2QgYnkgYW55IFdTRGxQYXJzZXJFeHRlbnNpb24KKyAgICAgICAgLy9DaGVjayBpZiBpdCBtdXN0IGJlIHVuZGVyc3Rvb2QuCisgICAgICAgIGlmIChpc1JlcXVpcmVkRXh0ZW5zaW9uKHJlYWRlcikpIHsKKyAgICAgICAgICAgICgoV1NETEJvdW5kUG9ydFR5cGVJbXBsKSBiaW5kaW5nKS5hZGROb3RVbmRlcnN0b29kRXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0TmFtZSgpLCBnZXRMb2NhdG9yKHJlYWRlcikpOworICAgICAgICB9CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmluZGluZ0F0dHJpYnV0ZXMoV1NETEJvdW5kUG9ydFR5cGUgYmluZGluZywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcil7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgZS5iaW5kaW5nQXR0cmlidXRlcyhiaW5kaW5nLCByZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVFbGVtZW50cyhXU0RMUG9ydFR5cGUgcG9ydFR5cGUsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgZm9yIChXU0RMUGFyc2VyRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKSB7CisgICAgICAgICAgICBpZiAoZS5wb3J0VHlwZUVsZW1lbnRzKHBvcnRUeXBlLCByZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyVXRpbC5za2lwRWxlbWVudChyZWFkZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3J0VHlwZUF0dHJpYnV0ZXMoV1NETFBvcnRUeXBlIHBvcnRUeXBlLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgZS5wb3J0VHlwZUF0dHJpYnV0ZXMocG9ydFR5cGUsIHJlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3J0VHlwZU9wZXJhdGlvbkVsZW1lbnRzKFdTRExPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgaWYgKGUucG9ydFR5cGVPcGVyYXRpb25FbGVtZW50cyhvcGVyYXRpb24sIHJlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcnRUeXBlT3BlcmF0aW9uQXR0cmlidXRlcyhXU0RMT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGUucG9ydFR5cGVPcGVyYXRpb25BdHRyaWJ1dGVzKG9wZXJhdGlvbiwgcmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdPcGVyYXRpb25FbGVtZW50cyhXU0RMQm91bmRPcGVyYXRpb24gb3BlcmF0aW9uLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgaWYgKGUuYmluZGluZ09wZXJhdGlvbkVsZW1lbnRzKG9wZXJhdGlvbiwgcmVhZGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmluZGluZ09wZXJhdGlvbkF0dHJpYnV0ZXMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGUuYmluZGluZ09wZXJhdGlvbkF0dHJpYnV0ZXMob3BlcmF0aW9uLCByZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWVzc2FnZUVsZW1lbnRzKFdTRExNZXNzYWdlIG1zZywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChlLm1lc3NhZ2VFbGVtZW50cyhtc2csIHJlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VBdHRyaWJ1dGVzKFdTRExNZXNzYWdlIG1zZywgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGUubWVzc2FnZUF0dHJpYnV0ZXMobXNnLCByZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25JbnB1dEVsZW1lbnRzKFdTRExJbnB1dCBpbnB1dCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChlLnBvcnRUeXBlT3BlcmF0aW9uSW5wdXRFbGVtZW50cyhpbnB1dCwgcmVhZGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9ydFR5cGVPcGVyYXRpb25JbnB1dEF0dHJpYnV0ZXMoV1NETElucHV0IGlucHV0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgZS5wb3J0VHlwZU9wZXJhdGlvbklucHV0QXR0cmlidXRlcyhpbnB1dCwgcmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcnRUeXBlT3BlcmF0aW9uT3V0cHV0RWxlbWVudHMoV1NETE91dHB1dCBvdXRwdXQsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgZm9yIChXU0RMUGFyc2VyRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKSB7CisgICAgICAgICAgICBpZiAoZS5wb3J0VHlwZU9wZXJhdGlvbk91dHB1dEVsZW1lbnRzKG91dHB1dCwgcmVhZGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9ydFR5cGVPcGVyYXRpb25PdXRwdXRBdHRyaWJ1dGVzKFdTRExPdXRwdXQgb3V0cHV0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgZS5wb3J0VHlwZU9wZXJhdGlvbk91dHB1dEF0dHJpYnV0ZXMob3V0cHV0LCByZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9ydFR5cGVPcGVyYXRpb25GYXVsdEVsZW1lbnRzKFdTRExGYXVsdCBmYXVsdCwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChlLnBvcnRUeXBlT3BlcmF0aW9uRmF1bHRFbGVtZW50cyhmYXVsdCwgcmVhZGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFhNTFN0cmVhbVJlYWRlclV0aWwuc2tpcEVsZW1lbnQocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9ydFR5cGVPcGVyYXRpb25GYXVsdEF0dHJpYnV0ZXMoV1NETEZhdWx0IGZhdWx0LCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgZS5wb3J0VHlwZU9wZXJhdGlvbkZhdWx0QXR0cmlidXRlcyhmYXVsdCwgcmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdPcGVyYXRpb25JbnB1dEVsZW1lbnRzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgZm9yIChXU0RMUGFyc2VyRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKSB7CisgICAgICAgICAgICBpZiAoZS5iaW5kaW5nT3BlcmF0aW9uSW5wdXRFbGVtZW50cyhvcGVyYXRpb24sIHJlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJpbmRpbmdPcGVyYXRpb25JbnB1dEF0dHJpYnV0ZXMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGUuYmluZGluZ09wZXJhdGlvbklucHV0QXR0cmlidXRlcyhvcGVyYXRpb24sIHJlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kaW5nT3BlcmF0aW9uT3V0cHV0RWxlbWVudHMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChlLmJpbmRpbmdPcGVyYXRpb25PdXRwdXRFbGVtZW50cyhvcGVyYXRpb24sIHJlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJpbmRpbmdPcGVyYXRpb25PdXRwdXRBdHRyaWJ1dGVzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgZm9yIChXU0RMUGFyc2VyRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKSB7CisgICAgICAgICAgICBlLmJpbmRpbmdPcGVyYXRpb25PdXRwdXRBdHRyaWJ1dGVzKG9wZXJhdGlvbiwgcmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJpbmRpbmdPcGVyYXRpb25GYXVsdEVsZW1lbnRzKFdTRExCb3VuZE9wZXJhdGlvbiBvcGVyYXRpb24sIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgZm9yIChXU0RMUGFyc2VyRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKSB7CisgICAgICAgICAgICBpZiAoZS5iaW5kaW5nT3BlcmF0aW9uRmF1bHRFbGVtZW50cyhvcGVyYXRpb24sIHJlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYTUxTdHJlYW1SZWFkZXJVdGlsLnNraXBFbGVtZW50KHJlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJpbmRpbmdPcGVyYXRpb25GYXVsdEF0dHJpYnV0ZXMoV1NETEJvdW5kT3BlcmF0aW9uIG9wZXJhdGlvbiwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmb3IgKFdTRExQYXJzZXJFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGUuYmluZGluZ09wZXJhdGlvbkZhdWx0QXR0cmlidXRlcyhvcGVyYXRpb24sIHJlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZChXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgZS5maW5pc2hlZChjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RGaW5pc2hlZChXU0RMUGFyc2VyRXh0ZW5zaW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZvciAoV1NETFBhcnNlckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgZS5wb3N0RmluaXNoZWQoY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICogQHJldHVybiBJZiB0aGUgZWxlbWVudCBoYXMgd3NkbDpyZXF1aXJlZCBhdHRyaWJ1dGUgc2V0IHRvIHRydWUKKyAgICAgKi8KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlcXVpcmVkRXh0ZW5zaW9uKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKFdTRExDb25zdGFudHMuTlNfV1NETCwgInJlcXVpcmVkIik7CisgICAgICAgIGlmKHJlcXVpcmVkICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocmVxdWlyZWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBMb2NhdG9yIGdldExvY2F0b3IoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgeworICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IHJlYWRlci5nZXRMb2NhdGlvbigpOworICAgICAgICAgICAgTG9jYXRvckltcGwgbG9jID0gbmV3IExvY2F0b3JJbXBsKCk7CisgICAgICAgICAgICBsb2Muc2V0U3lzdGVtSWQobG9jYXRpb24uZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgICAgICBsb2Muc2V0TGluZU51bWJlcihsb2NhdGlvbi5nZXRMaW5lTnVtYmVyKCkpOworICAgICAgICByZXR1cm4gbG9jOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvVXNpbmdBZGRyZXNzaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9Vc2luZ0FkZHJlc3NpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmViYTExCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvVXNpbmdBZGRyZXNzaW5nLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworLyoKKyAqICRJZDogVXNpbmdBZGRyZXNzaW5nLmphdmEsdiAxLjEuMi4zIDIwMDYvMDkvMjYgMjI6MTc6MTUgcmFtYXB1bGF2YXJ0aGkgRXhwICQKKyAqLworCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwud3JpdGVyOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFkZHJlc3NpbmcuVzNDQWRkcmVzc2luZ0NvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5kb2N1bWVudC5TdGFydFdpdGhFeHRlbnNpb25zVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIEFydW4gR3VwdGEKKyAqLworQFhtbEVsZW1lbnQodmFsdWUgPSBXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9OQU1FU1BBQ0VfV1NETF9OQU1FLAorICAgICAgICAgICAgbnMgPSBXM0NBZGRyZXNzaW5nQ29uc3RhbnRzLldTQVdfVVNJTkdfQUREUkVTU0lOR19OQU1FKQorcHVibGljIGludGVyZmFjZSBVc2luZ0FkZHJlc3NpbmcgZXh0ZW5kcyBUeXBlZFhtbFdyaXRlciwgU3RhcnRXaXRoRXh0ZW5zaW9uc1R5cGUgeworICAgIEBYbWxBdHRyaWJ1dGUodmFsdWUgPSAicmVxdWlyZWQiLCBucyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIpCisgICAgcHVibGljIHZvaWQgcmVxdWlyZWQoYm9vbGVhbiBiKTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL1czQ0FkZHJlc3NpbmdXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9XM0NBZGRyZXNzaW5nV1NETEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNTY3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9XM0NBZGRyZXNzaW5nV1NETEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisvKgorICogJElkOiBXM0NBZGRyZXNzaW5nV1NETEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhLHYgMS4xLjIuMTQgMjAwNy8wMy8xNSAwNzoyMjoxMyByYW1hcHVsYXZhcnRoaSBFeHAgJAorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXI7CisKK2ltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5GYXVsdEFjdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKKworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk5vdE51bGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5UeXBlZFhtbFdyaXRlcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuV1NCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWZXJzaW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5DaGVja2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5KYXZhTWV0aG9kOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC53cml0ZXIuV1NETEdlbmVyYXRvckV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC53cml0ZXIuV1NETEdlbkV4dG5Db250ZXh0OworCisvKioKKyAqIEBhdXRob3IgQXJ1biBHdXB0YQorICovCitwdWJsaWMgY2xhc3MgVzNDQWRkcmVzc2luZ1dTRExHZW5lcmF0b3JFeHRlbnNpb24gZXh0ZW5kcyBXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQgPSBmYWxzZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KFdTRExHZW5FeHRuQ29udGV4dCBjdHh0KSB7CisgICAgICAgIFdTQmluZGluZyBiaW5kaW5nID0gY3R4dC5nZXRCaW5kaW5nKCk7CisgICAgICAgIFR5cGVkWG1sV3JpdGVyIHJvb3QgPSBjdHh0LmdldFJvb3QoKTsKKyAgICAgICAgZW5hYmxlZCA9IGJpbmRpbmcuaXNGZWF0dXJlRW5hYmxlZChBZGRyZXNzaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGlmICghZW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZnRyID0gYmluZGluZy5nZXRGZWF0dXJlKEFkZHJlc3NpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmVxdWlyZWQgPSBmdHIuaXNSZXF1aXJlZCgpOworICAgICAgICByb290Ll9uYW1lc3BhY2UoQWRkcmVzc2luZ1ZlcnNpb24uVzNDLndzZGxOc1VyaSwgQWRkcmVzc2luZ1ZlcnNpb24uVzNDLmdldFdzZGxQcmVmaXgoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uSW5wdXRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgaW5wdXQsIEphdmFNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGlmICghZW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBBY3Rpb24gYSA9IG1ldGhvZC5nZXRTRUlNZXRob2QoKS5nZXRBbm5vdGF0aW9uKEFjdGlvbi5jbGFzcyk7CisgICAgICAgIGlmIChhICE9IG51bGwgJiYgIWEuaW5wdXQoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoaW5wdXQsIGEuaW5wdXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25PdXRwdXRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgb3V0cHV0LCBKYXZhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpZiAoIWVuYWJsZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQWN0aW9uIGEgPSBtZXRob2QuZ2V0U0VJTWV0aG9kKCkuZ2V0QW5ub3RhdGlvbihBY3Rpb24uY2xhc3MpOworICAgICAgICBpZiAoYSAhPSBudWxsICYmICFhLm91dHB1dCgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShvdXRwdXQsIGEub3V0cHV0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uRmF1bHRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgZmF1bHQsIEphdmFNZXRob2QgbWV0aG9kLCBDaGVja2VkRXhjZXB0aW9uIGNlKSB7CisgICAgICAgIGlmICghZW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBBY3Rpb24gYSA9IG1ldGhvZC5nZXRTRUlNZXRob2QoKS5nZXRBbm5vdGF0aW9uKEFjdGlvbi5jbGFzcyk7CisgICAgICAgIENsYXNzW10gZXhzID0gbWV0aG9kLmdldFNFSU1ldGhvZCgpLmdldEV4Y2VwdGlvblR5cGVzKCk7CisKKyAgICAgICAgaWYgKGV4cyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChhICE9IG51bGwgJiYgYS5mYXVsdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoRmF1bHRBY3Rpb24gZmEgOiBhLmZhdWx0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmEuY2xhc3NOYW1lKCkuZ2V0TmFtZSgpLmVxdWFscyhjZS5nZXRFeGNlcHRpb25DbGFzcygpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhLnZhbHVlKCkuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZmF1bHQsIGZhLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZShUeXBlZFhtbFdyaXRlciB3cml0ZXIsIFN0cmluZyBhdHRyVmFsdWUpIHsKKyAgICAgICAgd3JpdGVyLl9hdHRyaWJ1dGUoQWRkcmVzc2luZ1ZlcnNpb24uVzNDLndzZGxBY3Rpb25UYWcsIGF0dHJWYWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQmluZGluZ0V4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBiaW5kaW5nKSB7CisgICAgICAgIGlmICghZW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgVXNpbmdBZGRyZXNzaW5nIHVhID0gYmluZGluZy5fZWxlbWVudChBZGRyZXNzaW5nVmVyc2lvbi5XM0Mud3NkbEV4dGVuc2lvblRhZywgVXNpbmdBZGRyZXNzaW5nLmNsYXNzKTsKKyAgICAgICAgLyoKKyAgICAgICAgRG8gbm90IGdlbmVyYXRlIHdzZGw6cmVxdWlyZWQ9dHJ1ZQorICAgICAgICBpZihyZXF1aXJlZCkgeworICAgICAgICAgICAgdWEucmVxdWlyZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9XU0RMR2VuZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9XU0RMR2VuZXJhdG9yLmphdmEKaW5kZXggMDQ1ZDA4NS4uN2UwODVhMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvV1NETEdlbmVyYXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL1dTRExHZW5lcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwyNSArMjUsMjkgQEAKIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXI7CiAKIAotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLnBlcHQucHJlc2VudGF0aW9uLk1lc3NhZ2VTdHJ1Y3Q7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5hcGkuSkFYQlJJQ29udGV4dDsKIGltcG9ydCBzdGF0aWMgY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5zY2hlbWFnZW4uVXRpbC4qOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVFhXOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwudHh3Mi5vdXRwdXQuUmVzdWx0RmFjdG9yeTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC50eHcyLm91dHB1dC5YbWxTZXJpYWxpemVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuU09BUFZlcnNpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZW5jb2Rpbmcuc29hcC5zdHJlYW1pbmcuU09BUE5hbWVzcGFjZUNvbnN0YW50czsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuSmF2YU1ldGhvZDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuTUVQOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5QYXJhbWV0ZXJCaW5kaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5TRUlNb2RlbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuc29hcC5TT0FQQmluZGluZzsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuc2VydmVyLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC53cml0ZXIuV1NETEdlbmVyYXRvckV4dGVuc2lvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC53cml0ZXIuV1NETEdlbkV4dG5Db250ZXh0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVAxMk5hbWVzcGFjZUNvbnN0YW50czsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5DaGVja2VkRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLkphdmFNZXRob2Q7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLlBhcmFtZXRlckJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUnVudGltZU1vZGVsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmVuY29kaW5nLnNvYXAuc3RyZWFtaW5nLlNPQVBOYW1lc3BhY2VDb25zdGFudHM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuQWJzdHJhY3RTRUlNb2RlbEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuQ2hlY2tlZEV4Y2VwdGlvbkltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuSmF2YU1ldGhvZEltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuUGFyYW1ldGVySW1wbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5XcmFwcGVyUGFyYW1ldGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLm1vZGVsLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MubW9kZWwuc29hcC5TdHlsZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5tb2RlbC5zb2FwLlVzZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLnBhcnNlci5TT0FQQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwucGFyc2VyLldTRExDb25zdGFudHM7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuQmluZGluZzsKQEAgLTY0LDcgKzY4LDEwIEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcC5IZWFkZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcC5TT0FQQWRkcmVzczsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5kb2N1bWVudC5zb2FwLlNPQVBGYXVsdDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy51dGlsLlJ1bnRpbWVWZXJzaW9uOwogCitpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7CitpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLlNjaGVtYU91dHB1dFJlc29sdmVyOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7CkBAIC04MSw2MiArODgsMTUzIEBACiAKIAogLyoqCi0gKiBDbGFzcyB1c2VkIHRvIGdlbmVyYXRlIFdTRExzIGZyb20gYSA8Y29kZT5SdW5UaW1lTW9kZWw8L2NvZGU+CisgKiBDbGFzcyB1c2VkIHRvIGdlbmVyYXRlIFdTRExzIGZyb20gYSB7QGxpbmsgU0VJTW9kZWx9LgogICoKICAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQogICovCiBwdWJsaWMgY2xhc3MgV1NETEdlbmVyYXRvciB7CiAgICAgcHJpdmF0ZSBKQVhXU091dHB1dFNjaGVtYVJlc29sdmVyIHJlc29sdmVyOwotICAgIHByaXZhdGUgV1NETE91dHB1dFJlc29sdmVyIHdzZGxSZXNvbHZlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBSdW50aW1lTW9kZWwgbW9kZWw7CisgICAgcHJpdmF0ZSBXU0RMUmVzb2x2ZXIgd3NkbFJlc29sdmVyID0gbnVsbDsKKyAgICBwcml2YXRlIEFic3RyYWN0U0VJTW9kZWxJbXBsIG1vZGVsOwogICAgIHByaXZhdGUgRGVmaW5pdGlvbnMgc2VydmljZURlZmluaXRpb25zOwogICAgIHByaXZhdGUgRGVmaW5pdGlvbnMgcG9ydERlZmluaXRpb25zOwogICAgIHByaXZhdGUgVHlwZXMgdHlwZXM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1dTREwgICAgICAgICA9ICIud3NkbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgICAgICAgICA9ICJSZXNwb25zZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSUyAgICAgICA9ICJwYXJhbWV0ZXJzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFQgICAgICAgICAgID0gInBhcmFtZXRlcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOV1JBUFBBQkxFX1JFU1VMVCAgPSAicmVzdWx0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRSAgID0gV1NETENvbnN0YW50cy5OU19XU0RMOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfUFJFRklYICAgICAgPSAid3NkbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX05BTUVTUEFDRSAgICA9IFNPQVBOYW1lc3BhY2VDb25zdGFudHMuWFNEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9QUkVGSVggICAgICAgPSAieHNkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfTkFNRVNQQUNFID0gU09BUENvbnN0YW50cy5OU19XU0RMX1NPQVA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX05BTUVTUEFDRSA9IFNPQVBDb25zdGFudHMuTlNfV1NETF9TT0FQMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9QUkVGSVggICAgICA9ICJzb2FwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfUFJFRklYICAgID0gInNvYXAxMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE5TX1BSRUZJWCAgICAgICA9ICJ0bnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkcgICAgICAgICAgPSAiQmluZGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9IVFRQX1RSQU5TUE9SVCA9IFNPQVBOYW1lc3BhY2VDb25zdGFudHMuVFJBTlNQT1JUX0hUVFA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0hUVFBfVFJBTlNQT1JUID0gU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UICAgICAgICAgPSAiZG9jdW1lbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJQQyAgICAgICAgICAgICAgPSAicnBjIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVRFUkFMICAgICAgICAgID0gImxpdGVyYWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfV0lUSF9BQ1RVQUxfVVJMID0gIlJFUExBQ0VfV0lUSF9BQ1RVQUxfVVJMIjsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBTdHJpbmcgZm9yICIud3NkbCIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1dTREwgICAgICAgICA9ICIud3NkbCI7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgU3RyaW5nIGFwcGVuZGVkIHRvIHJlc3BvbnNlIG1lc3NhZ2UgbmFtZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgICAgICAgICA9ICJSZXNwb25zZSI7CisgICAgLyoqCisgICAgICogY29uc3RhbnQgU3RyaW5nIHVzZWQgZm9yIHBhcnQgbmFtZSBmb3Igd3JhcHBlZCByZXF1ZXN0IG1lc3NhZ2VzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUlMgICAgICAgPSAicGFyYW1ldGVycyI7CisgICAgLyoqCisgICAgICogdGhlIHBhcnQgbmFtZSBmb3IgdW53cmFwcGFibGUgcmVzcG9uc2UgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUICAgICAgICAgICA9ICJwYXJhbWV0ZXJzIjsKKyAgICAvKioKKyAgICAgKiB0aGUgcGFydCBuYW1lIGZvciByZXNwb25zZSBtZXNzYWdlcyB0aGF0IGFyZSBub3QgdW53cmFwcGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5XUkFQUEFCTEVfUkVTVUxUICA9ICJyZXN1bHQiOworICAgIC8qKgorICAgICAqIFRoZSBXU0RMIG5hbWVzcGFjZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRSAgID0gV1NETENvbnN0YW50cy5OU19XU0RMOworCisgICAgLyoqCisgICAgICogdGhlIFhTRCBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX05BTUVTUEFDRSAgICA9IFNPQVBOYW1lc3BhY2VDb25zdGFudHMuWFNEOworICAgIC8qKgorICAgICAqIHRoZSBuYW1lc3BhY2UgcHJlZml4IHRvIHVzZSBmb3IgdGhlIFhTRCBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX1BSRUZJWCAgICAgICA9ICJ4c2QiOworICAgIC8qKgorICAgICAqIFRoZSBTT0FQIDEuMSBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX05BTUVTUEFDRSA9IFNPQVBDb25zdGFudHMuTlNfV1NETF9TT0FQOworICAgIC8qKgorICAgICAqIFRoZSBTT0FQIDEuMiBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX05BTUVTUEFDRSA9IFNPQVBDb25zdGFudHMuTlNfV1NETF9TT0FQMTI7CisgICAgLyoqCisgICAgICogVGhlIG5hbWVzcGFjZSBwcmVmaXggdG8gdXNlIGZvciB0aGUgU09BUCAxLjEgbmFtZXNwYWNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUFJFRklYICAgICAgPSAic29hcCI7CisgICAgLyoqCisgICAgICogVGhlIG5hbWVzcGFjZSBwcmVmaXggdG8gdXNlIGZvciB0aGUgU09BUCAxLjIgbmFtZXNwYWNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9QUkVGSVggICAgPSAic29hcDEyIjsKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZXNwYWNlIHByZWZpeCB0byB1c2UgZm9yIHRoZSB0YXJnZXROYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE5TX1BSRUZJWCAgICAgICA9ICJ0bnMiOworICAgIC8qKgorICAgICAqIFRoZSBVUkkgZm9yIHRoZSBTT0FQIDEuMSBIVFRQIFRyYW5zcG9ydC4gIFVzZWQgdG8gY3JlYXRlIHNvYXBCaW5kaW5ncworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0hUVFBfVFJBTlNQT1JUID0gU09BUE5hbWVzcGFjZUNvbnN0YW50cy5UUkFOU1BPUlRfSFRUUDsKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIGZvciB0aGUgU09BUCAxLjIgSFRUUCBUcmFuc3BvcnQuICBVc2VkIHRvIGNyZWF0ZSBzb2FwQmluZGluZ3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0hUVFBfVFJBTlNQT1JUID0gU09BUDEyTmFtZXNwYWNlQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQOworICAgIC8qKgorICAgICAqIENvbnN0YW50IFN0cmluZyAiZG9jdW1lbnQiIHVzZWQgdG8gc3BlY2lmeSA8Y29kZT5kb2N1bWVudDwvY29kZT4gc3R5bGUKKyAgICAgKiBzb2FwQmluZGluZ3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlQgICAgICAgICA9ICJkb2N1bWVudCI7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgU3RyaW5nICJycGMiIHVzZWQgdG8gc3BlY2lmeSA8Y29kZT5ycGM8L2NvZGU+IHN0eWxlCisgICAgICogc29hcEJpbmRpbmdzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJQQyAgICAgICAgICAgICAgPSAicnBjIjsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBTdHJpbmcgImxpdGVyYWwiIHVzZWQgdG8gY3JlYXRlIDxjb2RlPmxpdGVyYWw8L2NvZGU+IHVzZSBiaW5kZGluZ3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElURVJBTCAgICAgICAgICA9ICJsaXRlcmFsIjsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBTdHJpbmcgdG8gZmxhZyB0aGUgVVJMIHRvIHJlcGxhY2UgYXQgcnVudGltZSBmb3IgdGhlIGVuZHBvaW50CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfV0lUSF9BQ1RVQUxfVVJMID0gIlJFUExBQ0VfV0lUSF9BQ1RVQUxfVVJMIjsKICAgICBwcml2YXRlIFNldDxRTmFtZT4gcHJvY2Vzc2VkRXhjZXB0aW9ucyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOwotICAgIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdJZDsKKyAgICBwcml2YXRlIFdTQmluZGluZyBiaW5kaW5nOwogICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbjsKICAgICBwcml2YXRlIFN0cmluZyBwb3J0V1NETElEOwogICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYVByZWZpeDsKKyAgICBwcml2YXRlIFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZXh0ZW5zaW9uOworICAgIExpc3Q8V1NETEdlbmVyYXRvckV4dGVuc2lvbj4gZXh0ZW5zaW9uSGFuZGxlcnM7CiAKKyAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludEFkZHJlc3MgPSBSRVBMQUNFX1dJVEhfQUNUVUFMX1VSTDsKKyAgICBwcml2YXRlIENvbnRhaW5lciBjb250YWluZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBpbXBsVHlwZTsKIAotICAgIHB1YmxpYyBXU0RMR2VuZXJhdG9yKFJ1bnRpbWVNb2RlbCBtb2RlbCwgV1NETE91dHB1dFJlc29sdmVyIHdzZGxSZXNvbHZlciwgU3RyaW5nIGJpbmRpbmdJZCkgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIFdTRExHZW5lcmF0b3IKKyAgICAgKiBAcGFyYW0gbW9kZWwgVGhlIHtAbGluayBBYnN0cmFjdFNFSU1vZGVsSW1wbH0gdXNlZCB0byBnZW5lcmF0ZSB0aGUgV1NETAorICAgICAqIEBwYXJhbSB3c2RsUmVzb2x2ZXIgVGhlIHtAbGluayBXU0RMUmVzb2x2ZXJ9IHRvIHVzZSByZXNvdmxlIG5hbWVzIHdoaWxlIGdlbmVyYXRpbmcgdGhlIFdTREwKKyAgICAgKiBAcGFyYW0gYmluZGluZyBzcGVjaWZpZXMgd2hpY2gge0BsaW5rIGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZX0gdG8gZ2VuZXJhdGUKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9ucyBhbiBhcnJheSB7QGxpbmsgV1NETEdlbmVyYXRvckV4dGVuc2lvbn0gdGhhdCB3aWxsCisgICAgICogYmUgaW52b2tlZCB0byBnZW5lcmF0ZSBXU0RMIGV4dGVuc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgV1NETEdlbmVyYXRvcihBYnN0cmFjdFNFSU1vZGVsSW1wbCBtb2RlbCwgV1NETFJlc29sdmVyIHdzZGxSZXNvbHZlciwgV1NCaW5kaW5nIGJpbmRpbmcsIENvbnRhaW5lciBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaW1wbFR5cGUsIFdTRExHZW5lcmF0b3JFeHRlbnNpb24uLi4gZXh0ZW5zaW9ucykgewogICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7CiAgICAgICAgIHJlc29sdmVyID0gbmV3IEpBWFdTT3V0cHV0U2NoZW1hUmVzb2x2ZXIoKTsKICAgICAgICAgdGhpcy53c2RsUmVzb2x2ZXIgPSB3c2RsUmVzb2x2ZXI7Ci0gICAgICAgIHRoaXMuYmluZGluZ0lkID0gYmluZGluZ0lkOworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgdGhpcy5pbXBsVHlwZSA9IGltcGxUeXBlOworICAgICAgICBleHRlbnNpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8V1NETEdlbmVyYXRvckV4dGVuc2lvbj4oKTsKKworICAgICAgICAvLyByZWdpc3RlciBoYW5kbGVycyBmb3IgZGVmYXVsdCBleHRlbnNpb25zCisgICAgICAgIHJlZ2lzdGVyKG5ldyBXM0NBZGRyZXNzaW5nV1NETEdlbmVyYXRvckV4dGVuc2lvbigpKTsKKworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gdyA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICByZWdpc3Rlcih3KTsKKworICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IG5ldyBXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uRmFjYWRlKGV4dGVuc2lvbkhhbmRsZXJzLnRvQXJyYXkobmV3IFdTRExHZW5lcmF0b3JFeHRlbnNpb25bMF0pKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBlbmRwb2ludCBhZGRyZXNzIHN0cmluZyB0byBiZSB3cml0dGVuLgorICAgICAqIERlZmF1bHRzIHRvIHtAbGluayAjUkVQTEFDRV9XSVRIX0FDVFVBTF9VUkx9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50QWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgeworICAgICAgICB0aGlzLmVuZHBvaW50QWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybWVzIHRoZSBhY3R1YWwgV1NETCBnZW5lcmF0aW9uCisgICAgICovCiAgICAgcHVibGljIHZvaWQgZG9HZW5lcmF0aW9uKCkgewogICAgICAgICBYbWxTZXJpYWxpemVyIHNlcnZpY2VXcml0ZXI7CiAgICAgICAgIFhtbFNlcmlhbGl6ZXIgcG9ydFdyaXRlciA9IG51bGw7CiAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvQ2xhc3NOYW1lKG1vZGVsLmdldFNlcnZpY2VRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvbmNyZXRlIG5hbWU6ICIrIGZpbGVOYW1lKTsKLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHdzZGxSZXNvbHZlci5nZXRXU0RMT3V0cHV0KGZpbGVOYW1lK0RPVF9XU0RMKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBSZXN1bHQgcmVzdWx0ID0gd3NkbFJlc29sdmVyLmdldFdTREwoZmlsZU5hbWUrRE9UX1dTREwpOwogICAgICAgICB3c2RsTG9jYXRpb24gPSByZXN1bHQuZ2V0U3lzdGVtSWQoKTsKLSAgICAgICAgc2VydmljZVdyaXRlciA9IFJlc3VsdEZhY3RvcnkuY3JlYXRlU2VyaWFsaXplcihyZXN1bHQpOworICAgICAgICBzZXJ2aWNlV3JpdGVyID0gbmV3IENvbW1lbnRGaWx0ZXIoUmVzdWx0RmFjdG9yeS5jcmVhdGVTZXJpYWxpemVyKHJlc3VsdCkpOwogICAgICAgICBpZiAobW9kZWwuZ2V0U2VydmljZVFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgewogICAgICAgICAgICAgcG9ydFdyaXRlciA9IHNlcnZpY2VXcml0ZXI7CiAgICAgICAgICAgICBzY2hlbWFQcmVmaXggPSBmaWxlTmFtZSsiXyI7CkBAIC0xNDQsMjAgKzI0MiwxNiBAQAogICAgICAgICAgICAgU3RyaW5nIHdzZGxOYW1lID0gSkFYQlJJQ29udGV4dC5tYW5nbGVOYW1lVG9DbGFzc05hbWUobW9kZWwuZ2V0UG9ydFR5cGVOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICAgICAgaWYgKHdzZGxOYW1lLmVxdWFscyhmaWxlTmFtZSkpCiAgICAgICAgICAgICAgICAgd3NkbE5hbWUgKz0gIlBvcnRUeXBlIjsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYnN0cmFjdCBuYW1lOiAiKyB3c2RsTmFtZSk7CiAgICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBhYnNXU0RMTmFtZSA9IG5ldyBIb2xkZXI8U3RyaW5nPigpOwogICAgICAgICAgICAgYWJzV1NETE5hbWUudmFsdWUgPSB3c2RsTmFtZStET1RfV1NETDsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYnNXU0RMTmFtZS52YWx1ZTogIisgYWJzV1NETE5hbWUudmFsdWUpOwotICAgICAgICAgICAgcmVzdWx0ID0gd3NkbFJlc29sdmVyLmdldEFic3RyYWN0V1NETE91dHB1dChhYnNXU0RMTmFtZSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWJzV1NETE5hbWUudmFsdWU6ICIrIGFic1dTRExOYW1lLnZhbHVlKTsKLS8vICAgICAgICAgICAgIHNjaGVtYVByZWZpeCA9IG1vZGVsLmdldEpBWEJDb250ZXh0KCkubWFuZ2xlTmFtZVRvQ2xhc3NOYW1lKHBvcnRXU0RMSUQpKyJfIjsKKyAgICAgICAgICAgIHJlc3VsdCA9IHdzZGxSZXNvbHZlci5nZXRBYnN0cmFjdFdTREwoYWJzV1NETE5hbWUpOwogCiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBwb3J0V1NETElEID0gcmVzdWx0LmdldFN5c3RlbUlkKCk7CiAgICAgICAgICAgICAgICAgaWYgKHBvcnRXU0RMSUQuZXF1YWxzKHdzZGxMb2NhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgcG9ydFdyaXRlciA9IHNlcnZpY2VXcml0ZXI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcG9ydFdyaXRlciA9IFJlc3VsdEZhY3RvcnkuY3JlYXRlU2VyaWFsaXplcihyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBwb3J0V3JpdGVyID0gbmV3IENvbW1lbnRGaWx0ZXIoUmVzdWx0RmFjdG9yeS5jcmVhdGVTZXJpYWxpemVyKHJlc3VsdCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcG9ydFdTRExJRCA9IGFic1dTRExOYW1lLnZhbHVlOwpAQCAtMTY3LDI0ICsyNjEsODUgQEAKICAgICAgICAgICAgIGlmIChpZHggPiAwKQogICAgICAgICAgICAgICAgIHNjaGVtYVByZWZpeCA9IHNjaGVtYVByZWZpeC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgIHNjaGVtYVByZWZpeCA9IEpBWEJSSUNvbnRleHQubWFuZ2xlTmFtZVRvQ2xhc3NOYW1lKHNjaGVtYVByZWZpeCkrIl8iOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBvcnRXU0RMSUQ6ICIrIHBvcnRXU0RMSUQpOwotLy8gICAgICAgICAgICBzY2hlbWFQcmVmaXggPSBtb2RlbC5nZXRKQVhCQ29udGV4dCgpLm1hbmdsZU5hbWVUb0NsYXNzTmFtZShwb3J0V1NETElEKSsiXyI7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2NoZW1hUHJlZml4OiAiKyBzY2hlbWFQcmVmaXgpOwogICAgICAgICB9CiAgICAgICAgIGdlbmVyYXRlRG9jdW1lbnQoc2VydmljZVdyaXRlciwgcG9ydFdyaXRlcik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogV3JpdGluZyBkaXJlY3RseSB0byBYbWxTZXJpYWxpemVyIGlzIGEgcHJvYmxlbSwgc2luY2UgaXQgZG9lc24ndCBzdXBwcmVzcworICAgICAqIHhtbCBkZWNsYXJhdGlvbi4gQ3JlYXRpbmcgZmlsdGVyIHNvIHRoYXQgY29tbWVudCBpcyB3cml0dGVuIGJlZm9yZSBUWFcgd3JpdGVzCisgICAgICogYW55dGhpbmcgaW4gdGhlIFdTREwuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tbWVudEZpbHRlciBpbXBsZW1lbnRzIFhtbFNlcmlhbGl6ZXIgeworICAgICAgICBmaW5hbCBYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0NPTU1FTlQgPQorICAgICAgICAgICAgIiBHZW5lcmF0ZWQgYnkgSkFYLVdTIFJJIGF0IGh0dHA6Ly9qYXgtd3MuZGV2LmphdmEubmV0LiBSSSdzIHZlcnNpb24gaXMgIitSdW50aW1lVmVyc2lvbi5WRVJTSU9OKyIuICI7CisKKyAgICAgICAgQ29tbWVudEZpbHRlcihYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgeworICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICBjb21tZW50KG5ldyBTdHJpbmdCdWlsZGVyKFZFUlNJT05fQ09NTUVOVCkpOworICAgICAgICAgICAgdGV4dChuZXcgU3RyaW5nQnVpbGRlcigiXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiZWdpblN0YXJ0VGFnKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYmVnaW5TdGFydFRhZyh1cmksIGxvY2FsTmFtZSwgcHJlZml4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZ0J1aWxkZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIud3JpdGVBdHRyaWJ1dGUodXJpLCBsb2NhbE5hbWUsIHByZWZpeCwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVYbWxucyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBzZXJpYWxpemVyLndyaXRlWG1sbnMocHJlZml4LCB1cmkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZW5kU3RhcnRUYWcoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCkgeworICAgICAgICAgICAgc2VyaWFsaXplci5lbmRTdGFydFRhZyh1cmksIGxvY2FsTmFtZSwgcHJlZml4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZFRhZygpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0ZXh0KFN0cmluZ0J1aWxkZXIgdGV4dCkgeworICAgICAgICAgICAgc2VyaWFsaXplci50ZXh0KHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2RhdGEoU3RyaW5nQnVpbGRlciB0ZXh0KSB7CisgICAgICAgICAgICBzZXJpYWxpemVyLmNkYXRhKHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY29tbWVudChTdHJpbmdCdWlsZGVyIGNvbW1lbnQpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuY29tbWVudChjb21tZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgeworICAgICAgICAgICAgc2VyaWFsaXplci5lbmREb2N1bWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7CisgICAgICAgICAgICBzZXJpYWxpemVyLmZsdXNoKCk7CisgICAgICAgIH0KKworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZURvY3VtZW50KFhtbFNlcmlhbGl6ZXIgc2VydmljZVN0cmVhbSwgWG1sU2VyaWFsaXplciBwb3J0U3RyZWFtKSB7CiAgICAgICAgIHNlcnZpY2VEZWZpbml0aW9ucyA9IFRYVy5jcmVhdGUoRGVmaW5pdGlvbnMuY2xhc3MsIHNlcnZpY2VTdHJlYW0pOwogICAgICAgICBzZXJ2aWNlRGVmaW5pdGlvbnMuX25hbWVzcGFjZShXU0RMX05BTUVTUEFDRSwgIiIpOy8vV1NETF9QUkVGSVgpOwogICAgICAgICBzZXJ2aWNlRGVmaW5pdGlvbnMuX25hbWVzcGFjZShYU0RfTkFNRVNQQUNFLCBYU0RfUFJFRklYKTsKICAgICAgICAgc2VydmljZURlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZShtb2RlbC5nZXRTZXJ2aWNlUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7CiAgICAgICAgIHNlcnZpY2VEZWZpbml0aW9ucy5fbmFtZXNwYWNlKG1vZGVsLmdldFNlcnZpY2VRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBUTlNfUFJFRklYKTsKLSAgICAgICAgaWYoYmluZGluZ0lkLmVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKQorICAgICAgICBpZihiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCk9PSBTT0FQVmVyc2lvbi5TT0FQXzEyKQogICAgICAgICAgICAgc2VydmljZURlZmluaXRpb25zLl9uYW1lc3BhY2UoU09BUDEyX05BTUVTUEFDRSwgU09BUDEyX1BSRUZJWCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHNlcnZpY2VEZWZpbml0aW9ucy5fbmFtZXNwYWNlKFNPQVAxMV9OQU1FU1BBQ0UsIFNPQVBfUFJFRklYKTsKICAgICAgICAgc2VydmljZURlZmluaXRpb25zLm5hbWUobW9kZWwuZ2V0U2VydmljZVFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICBXU0RMR2VuRXh0bkNvbnRleHQgc2VydmljZUN0eCA9IG5ldyBXU0RMR2VuRXh0bkNvbnRleHQoc2VydmljZURlZmluaXRpb25zLCBtb2RlbCwgYmluZGluZywgY29udGFpbmVyLCBpbXBsVHlwZSk7CisgICAgICAgIGV4dGVuc2lvbi5zdGFydChzZXJ2aWNlQ3R4KTsKICAgICAgICAgaWYgKHNlcnZpY2VTdHJlYW0gIT0gcG9ydFN0cmVhbSAmJiBwb3J0U3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIGdlbmVyYXRlIGFuIGFic3RyYWN0IGFuZCBjb25jcmV0ZSB3c2RsCiAgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbnMgPSBUWFcuY3JlYXRlKERlZmluaXRpb25zLmNsYXNzLCBwb3J0U3RyZWFtKTsKQEAgLTIwNyw2ICszNjIsNyBAQAogICAgICAgICAgICAgSW1wb3J0IF9pbXBvcnQgPSBzZXJ2aWNlRGVmaW5pdGlvbnMuX2ltcG9ydCgpLm5hbWVzcGFjZShtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7CiAgICAgICAgICAgICBfaW1wb3J0LmxvY2F0aW9uKHNjaGVtYUxvYyk7CiAgICAgICAgIH0KKyAgICAgICAgZXh0ZW5zaW9uLmFkZERlZmluaXRpb25zRXh0ZW5zaW9uKHNlcnZpY2VEZWZpbml0aW9ucyk7CiAKICAgICAgICAgaWYgKHBvcnREZWZpbml0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgICAgICBnZW5lcmF0ZVR5cGVzKCk7CkBAIC0yMTUsMTMgKzM3MSwxNyBAQAogICAgICAgICB9CiAgICAgICAgIGdlbmVyYXRlQmluZGluZygpOwogICAgICAgICBnZW5lcmF0ZVNlcnZpY2UoKTsKKyAgICAgICAgLy9HaXZlIGEgY2hhbmNlIHRvIFdTRExHZW5lcmF0b3JFeHRlbnNpb25zIHRvIHdyaXRlIHN0dWZmIGJlZm9yZSBjbG9zaW5nIDwvd3NkbDpkZWZpbnRpb25zPgorICAgICAgICBleHRlbnNpb24uZW5kKHNlcnZpY2VDdHgpOwogICAgICAgICBzZXJ2aWNlRGVmaW5pdGlvbnMuY29tbWl0KCk7CiAgICAgICAgIGlmIChwb3J0RGVmaW5pdGlvbnMgIT0gbnVsbCAmJiBwb3J0RGVmaW5pdGlvbnMgIT0gc2VydmljZURlZmluaXRpb25zKQogICAgICAgICAgICAgcG9ydERlZmluaXRpb25zLmNvbW1pdCgpOwogICAgIH0KIAogCi0KKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHR5cGVzIHNlY3Rpb24gb2YgdGhlIFdTREwKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVR5cGVzKCkgewogICAgICAgICB0eXBlcyA9IHBvcnREZWZpbml0aW9ucy50eXBlcygpOwogICAgICAgICBpZiAobW9kZWwuZ2V0SkFYQkNvbnRleHQoKSAhPSBudWxsKSB7CkBAIC0yMzUsMjAgKzM5NSwyOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBXU0RMIG1lc3NhZ2VzCisgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVNZXNzYWdlcygpIHsKLSAgICAgICAgZm9yIChKYXZhTWV0aG9kIG1ldGhvZCA6IG1vZGVsLmdldEphdmFNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0QmluZGluZygpIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICAgICAgICAgICAgZ2VuZXJhdGVTT0FQTWVzc2FnZXMobWV0aG9kLCAoU09BUEJpbmRpbmcpbWV0aG9kLmdldEJpbmRpbmcoKSk7CisgICAgICAgIGZvciAoSmF2YU1ldGhvZEltcGwgbWV0aG9kIDogbW9kZWwuZ2V0SmF2YU1ldGhvZHMoKSkgeworICAgICAgICAgICAgZ2VuZXJhdGVTT0FQTWVzc2FnZXMobWV0aG9kLCBtZXRob2QuZ2V0QmluZGluZygpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU09BUE1lc3NhZ2VzKEphdmFNZXRob2QgbWV0aG9kLCBTT0FQQmluZGluZyBiaW5kaW5nKSB7CisgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgbWVzc2FnZXMgZm9yIGEgU09BUEJpbmRpbmcKKyAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSB7QGxpbmsgSmF2YU1ldGhvZH0gdG8gZ2VuZXJhdGUgbWVzc2FnZXMgZm9yCisgICAgICogQHBhcmFtIGJpbmRpbmcgVGhlIHtAbGluayBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubW9kZWwuc29hcC5TT0FQQmluZGluZ30gdG8gYWRkIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZXMgdG8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNPQVBNZXNzYWdlcyhKYXZhTWV0aG9kSW1wbCBtZXRob2QsIGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5tb2RlbC5zb2FwLlNPQVBCaW5kaW5nIGJpbmRpbmcpIHsKICAgICAgICAgYm9vbGVhbiBpc0RvY2xpdCA9IGJpbmRpbmcuaXNEb2NMaXQoKTsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gcG9ydERlZmluaXRpb25zLm1lc3NhZ2UoKS5uYW1lKG1ldGhvZC5nZXRPcGVyYXRpb25OYW1lKCkpOworLy8gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHBvcnREZWZpbml0aW9ucy5tZXNzYWdlKCkubmFtZShtZXRob2QuZ2V0T3BlcmF0aW9uKCkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gcG9ydERlZmluaXRpb25zLm1lc3NhZ2UoKS5uYW1lKG1ldGhvZC5nZXRSZXF1ZXN0TWVzc2FnZU5hbWUoKSk7CisgICAgICAgIGV4dGVuc2lvbi5hZGRJbnB1dE1lc3NhZ2VFeHRlbnNpb24obWVzc2FnZSwgbWV0aG9kKTsKICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuUGFydCBwYXJ0OwogICAgICAgICBKQVhCUklDb250ZXh0IGpheGJDb250ZXh0ID0gbW9kZWwuZ2V0SkFYQkNvbnRleHQoKTsKICAgICAgICAgYm9vbGVhbiB1bndyYXBwYWJsZSA9IHRydWU7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogbWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHBhcmFtIDogbWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkpIHsKICAgICAgICAgICAgIGlmIChpc0RvY2xpdCkgewogICAgICAgICAgICAgICAgIGlmIChpc0hlYWRlclBhcmFtZXRlcihwYXJhbSkpCiAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBhYmxlID0gZmFsc2U7CkBAIC0yNjEsOSArNDMwLDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIGNoaWxkUGFyYW0gOiAoKFdyYXBwZXJQYXJhbWV0ZXIpcGFyYW0pLmdldFdyYXBwZXJDaGlsZHJlbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVySW1wbCBjaGlsZFBhcmFtIDogKChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtKS5nZXRXcmFwcGVyQ2hpbGRyZW4oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IG1lc3NhZ2UucGFydCgpLm5hbWUoY2hpbGRQYXJhbS5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQudHlwZShqYXhiQ29udGV4dC5nZXRUeXBlTmFtZShjaGlsZFBhcmFtLmdldFR5cGVSZWZlcmVuY2UoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydC50eXBlKGpheGJDb250ZXh0LmdldFR5cGVOYW1lKGNoaWxkUGFyYW0uZ2V0QnJpZGdlKCkuZ2V0VHlwZVJlZmVyZW5jZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbWVzc2FnZS5wYXJ0KCkubmFtZShwYXJhbS5nZXRQYXJ0TmFtZSgpKTsKQEAgLTI3MSwxNiArNDQwLDE4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TUVQKCkgIT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCkgewotICAgICAgICAgICAgbWVzc2FnZSA9IHBvcnREZWZpbml0aW9ucy5tZXNzYWdlKCkubmFtZShtZXRob2QuZ2V0T3BlcmF0aW9uTmFtZSgpK1JFU1BPTlNFKTsKKyAgICAgICAgaWYgKG1ldGhvZC5nZXRNRVAoKSAhPSBNRVAuT05FX1dBWSkgeworLy8gICAgICAgICAgICBtZXNzYWdlID0gcG9ydERlZmluaXRpb25zLm1lc3NhZ2UoKS5uYW1lKG1ldGhvZC5nZXRPcGVyYXRpb24oKS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkrUkVTUE9OU0UpOworICAgICAgICAgICAgbWVzc2FnZSA9IHBvcnREZWZpbml0aW9ucy5tZXNzYWdlKCkubmFtZShtZXRob2QuZ2V0UmVzcG9uc2VNZXNzYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbi5hZGRPdXRwdXRNZXNzYWdlRXh0ZW5zaW9uKG1lc3NhZ2UsIG1ldGhvZCk7CiAgICAgICAgICAgICBpZiAodW53cmFwcGFibGUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IG1ldGhvZC5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVySW1wbCBwYXJhbSA6IG1ldGhvZC5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0hlYWRlclBhcmFtZXRlcihwYXJhbSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBhYmxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IG1ldGhvZC5nZXRSZXNwb25zZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHBhcmFtIDogbWV0aG9kLmdldFJlc3BvbnNlUGFyYW1ldGVycygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzRG9jbGl0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdHMgbm90IHJlYWxseSB3cmFwcGVyIHN0eWxlIGRvbnQgdXNlIHRoZSBzYW1lIG5hbWUgYXMgaW5wdXQgbWVzc2FnZQpAQCAtMjk1LDkgKzQ2Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uaXNXcmFwcGVyU3R5bGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgY2hpbGRQYXJhbSA6ICgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkuZ2V0V3JhcHBlckNoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVySW1wbCBjaGlsZFBhcmFtIDogKChXcmFwcGVyUGFyYW1ldGVyKXBhcmFtKS5nZXRXcmFwcGVyQ2hpbGRyZW4oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBtZXNzYWdlLnBhcnQoKS5uYW1lKGNoaWxkUGFyYW0uZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydC50eXBlKGpheGJDb250ZXh0LmdldFR5cGVOYW1lKGNoaWxkUGFyYW0uZ2V0VHlwZVJlZmVyZW5jZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydC50eXBlKGpheGJDb250ZXh0LmdldFR5cGVOYW1lKGNoaWxkUGFyYW0uZ2V0QnJpZGdlKCkuZ2V0VHlwZVJlZmVyZW5jZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbWVzc2FnZS5wYXJ0KCkubmFtZShwYXJhbS5nZXRQYXJ0TmFtZSgpKTsKQEAgLTMwNiw3MCArNDc3LDgxIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbiBleGNlcHRpb24gOiBtZXRob2QuZ2V0Q2hlY2tlZEV4Y2VwdGlvbnMoKSkgeworICAgICAgICBmb3IgKENoZWNrZWRFeGNlcHRpb25JbXBsIGV4Y2VwdGlvbiA6IG1ldGhvZC5nZXRDaGVja2VkRXhjZXB0aW9ucygpKSB7CiAgICAgICAgICAgICBRTmFtZSB0YWdOYW1lID0gZXhjZXB0aW9uLmdldERldGFpbFR5cGUoKS50YWdOYW1lOwotLy8gICAgICAgICAgICBpZiAocHJvY2Vzc2VkRXhjZXB0aW9ucy5jb250YWlucyh0YWdOYW1lKSkKLS8vICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotLy8gICAgICAgICAgICBtZXNzYWdlID0gcG9ydERlZmluaXRpb25zLm1lc3NhZ2UoKS5uYW1lKHRhZ05hbWUuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VOYW1lID0gZXhjZXB0aW9uLmdldE1lc3NhZ2VOYW1lKCk7CiAgICAgICAgICAgICBRTmFtZSBtZXNzYWdlUU5hbWUgPSBuZXcgUU5hbWUobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG1lc3NhZ2VOYW1lKTsKICAgICAgICAgICAgIGlmIChwcm9jZXNzZWRFeGNlcHRpb25zLmNvbnRhaW5zKG1lc3NhZ2VRTmFtZSkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBtZXNzYWdlID0gcG9ydERlZmluaXRpb25zLm1lc3NhZ2UoKS5uYW1lKG1lc3NhZ2VOYW1lKTsKIAorICAgICAgICAgICAgZXh0ZW5zaW9uLmFkZEZhdWx0TWVzc2FnZUV4dGVuc2lvbihtZXNzYWdlLCBtZXRob2QsIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICBwYXJ0ID0gbWVzc2FnZS5wYXJ0KCkubmFtZSgiZmF1bHQiKTsvL3RhZ05hbWUuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICAgICAgcGFydC5lbGVtZW50KHRhZ05hbWUpOwotLy8gICAgICAgICAgICBwcm9jZXNzZWRFeGNlcHRpb25zLmFkZCh0YWdOYW1lKTsKICAgICAgICAgICAgIHByb2Nlc3NlZEV4Y2VwdGlvbnMuYWRkKG1lc3NhZ2VRTmFtZSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIFdTREwgcG9ydFR5cGUKKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVBvcnRUeXBlKCkgewogCiAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gcG9ydERlZmluaXRpb25zLnBvcnRUeXBlKCkubmFtZShtb2RlbC5nZXRQb3J0VHlwZU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGZvciAoSmF2YU1ldGhvZCBtZXRob2QgOiBtb2RlbC5nZXRKYXZhTWV0aG9kcygpKSB7CisgICAgICAgIGV4dGVuc2lvbi5hZGRQb3J0VHlwZUV4dGVuc2lvbihwb3J0VHlwZSk7CisgICAgICAgIGZvciAoSmF2YU1ldGhvZEltcGwgbWV0aG9kIDogbW9kZWwuZ2V0SmF2YU1ldGhvZHMoKSkgeworLy8gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gcG9ydFR5cGUub3BlcmF0aW9uKCkubmFtZShtZXRob2QuZ2V0T3BlcmF0aW9uKCkuZ2V0TG9jYWxOYW1lKCkpOwogICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHBvcnRUeXBlLm9wZXJhdGlvbigpLm5hbWUobWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKSk7CiAgICAgICAgICAgICBnZW5lcmF0ZVBhcmFtZXRlck9yZGVyKG9wZXJhdGlvbiwgbWV0aG9kKTsKICAgICAgICAgICAgIHN3aXRjaCAobWV0aG9kLmdldE1FUCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlU3RydWN0LlJFUVVFU1RfUkVTUE9OU0VfTUVQOgorICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9SRVNQT05TRToKICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUlucHV0TWVzc2FnZShvcGVyYXRpb24sIG1ldGhvZCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlT3V0cHV0TWVzc2FnZShvcGVyYXRpb24sIG1ldGhvZCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9ORV9XQVk6CiAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlSW5wdXRNZXNzYWdlKG9wZXJhdGlvbiwgbWV0aG9kKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBmYXVsdHMKLSAgICAgICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbiBleGNlcHRpb24gOiBtZXRob2QuZ2V0Q2hlY2tlZEV4Y2VwdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIFFOYW1lIHRhZ05hbWUgPSBleGNlcHRpb24uZ2V0RGV0YWlsVHlwZSgpLnRhZ05hbWU7Ci0vLyAgICAgICAgICAgICAgICBRTmFtZSBtZXNzYWdlTmFtZSA9IG5ldyBRTmFtZShtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgdGFnTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0vLyAgICAgICAgICAgICAgICBGYXVsdFR5cGUgcGFyYW1UeXBlID0gb3BlcmF0aW9uLmZhdWx0KCkubmFtZSh0YWdOYW1lLmdldExvY2FsUGFydCgpKS5tZXNzYWdlKG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbkltcGwgZXhjZXB0aW9uIDogbWV0aG9kLmdldENoZWNrZWRFeGNlcHRpb25zKCkpIHsKICAgICAgICAgICAgICAgICBRTmFtZSBtZXNzYWdlTmFtZSA9IG5ldyBRTmFtZShtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZXhjZXB0aW9uLmdldE1lc3NhZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIEZhdWx0VHlwZSBwYXJhbVR5cGUgPSBvcGVyYXRpb24uZmF1bHQoKS5uYW1lKGV4Y2VwdGlvbi5nZXRNZXNzYWdlTmFtZSgpKS5tZXNzYWdlKG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICBGYXVsdFR5cGUgcGFyYW1UeXBlID0gb3BlcmF0aW9uLmZhdWx0KCkubWVzc2FnZShtZXNzYWdlTmFtZSkubmFtZShleGNlcHRpb24uZ2V0TWVzc2FnZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmFkZE9wZXJhdGlvbkZhdWx0RXh0ZW5zaW9uKHBhcmFtVHlwZSwgbWV0aG9kLCBleGNlcHRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGVyU3R5bGUoSmF2YU1ldGhvZCBtZXRob2QpIHsKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSA8Q09ERT5tZXRob2Q8L0NPREU+IGlzIHdyYXBwZXIgc3R5bGUKKyAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSB7QGxpbmsgSmF2YU1ldGhvZH0gdG8gY2hlY2sgaWYgaXQgaXMgd3JhcHBlciBzdHlsZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHdyYXBwZXIgc3R5bGUsIG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGVyU3R5bGUoSmF2YU1ldGhvZEltcGwgbWV0aG9kKSB7CiAgICAgICAgIGlmIChtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgIFBhcmFtZXRlckltcGwgcGFyYW0gPSBtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgICAgIHJldHVybiBwYXJhbS5pc1dyYXBwZXJTdHlsZSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JwY0xpdChKYXZhTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBpZiAobWV0aG9kLmdldEJpbmRpbmcoKSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICBpZiAoKChTT0FQQmluZGluZyltZXRob2QuZ2V0QmluZGluZygpKS5nZXRTdHlsZSgpLmVxdWFscyhTdHlsZS5SUEMpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGEge0BsaW5rIEphdmFNZXRob2R9IGlzIHJwYy9saXRlcmFsCisgICAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIG1ldGhvZCBpcyBycGMvbGl0ZXJhbCwgb3RoZXJ3aXNlLCBmYWxzZQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzUnBjTGl0KEphdmFNZXRob2RJbXBsIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gbWV0aG9kLmdldEJpbmRpbmcoKS5nZXRTdHlsZSgpID09IFN0eWxlLlJQQzsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVBhcmFtZXRlck9yZGVyKE9wZXJhdGlvbiBvcGVyYXRpb24sIEphdmFNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TUVQKCkgPT0gTWVzc2FnZVN0cnVjdC5PTkVfV0FZX01FUCkKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHBhcmFtZXRlck9yZGVyIGZvciBhIFBvcnRUeXBlIG9wZXJhdGlvbgorICAgICAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiB0byBnZW5lcmF0ZSB0aGUgcGFyYW1ldGVyT3JkZXIgZm9yCisgICAgICogQHBhcmFtIG1ldGhvZCBUaGUge0BsaW5rIEphdmFNZXRob2R9IHRvIGdlbmVyYXRlIHRoZSBwYXJhbWV0ZXJPcmRlciBmcm9tCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQYXJhbWV0ZXJPcmRlcihPcGVyYXRpb24gb3BlcmF0aW9uLCBKYXZhTWV0aG9kSW1wbCBtZXRob2QpIHsKKyAgICAgICAgaWYgKG1ldGhvZC5nZXRNRVAoKSA9PSBNRVAuT05FX1dBWSkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgaWYgKGlzUnBjTGl0KG1ldGhvZCkpCiAgICAgICAgICAgICBnZW5lcmF0ZVJwY1BhcmFtZXRlck9yZGVyKG9wZXJhdGlvbiwgbWV0aG9kKTsKQEAgLTM3NywxMyArNTU5LDE4IEBACiAgICAgICAgICAgICBnZW5lcmF0ZURvY3VtZW50UGFyYW1ldGVyT3JkZXIob3BlcmF0aW9uLCBtZXRob2QpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUnBjUGFyYW1ldGVyT3JkZXIoT3BlcmF0aW9uIG9wZXJhdGlvbiwgSmF2YU1ldGhvZCBtZXRob2QpIHsKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHBhcmFtZXRlck9yZGVyIGZvciBhIFBvcnRUeXBlIG9wZXJhdGlvbgorICAgICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0byBnZW5lcmF0ZSB0aGUgcGFyYW1ldGVyT3JkZXIgZm9yCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUge0BsaW5rIEphdmFNZXRob2R9IHRvIGdlbmVyYXRlIHRoZSBwYXJhbWV0ZXJPcmRlciBmcm9tCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVScGNQYXJhbWV0ZXJPcmRlcihPcGVyYXRpb24gb3BlcmF0aW9uLCBKYXZhTWV0aG9kSW1wbCBtZXRob2QpIHsKICAgICAgICAgU3RyaW5nIHBhcnROYW1lOwogICAgICAgICBTdHJpbmdCdWZmZXIgcGFyYW1PcmRlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgU2V0PFN0cmluZz4gcGFydE5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBMaXN0PFBhcmFtZXRlcj4gc29ydGVkUGFyYW1zID0gc29ydE1ldGhvZFBhcmFtZXRlcnMobWV0aG9kKTsKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiBzb3J0ZWRQYXJhbXMgPSBzb3J0TWV0aG9kUGFyYW1ldGVycyhtZXRob2QpOwogICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IHNvcnRlZFBhcmFtcykgeworICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcGFyYW1ldGVyIDogc29ydGVkUGFyYW1zKSB7CiAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldEluZGV4KCkgPj0gMCkgewogICAgICAgICAgICAgICAgcGFydE5hbWUgPSBwYXJhbWV0ZXIuZ2V0UGFydE5hbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoIXBhcnROYW1lcy5jb250YWlucyhwYXJ0TmFtZSkpIHsKQEAgLTM5OCwxNCArNTg1LDE5IEBACiAgICAgfQogCiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZURvY3VtZW50UGFyYW1ldGVyT3JkZXIoT3BlcmF0aW9uIG9wZXJhdGlvbiwgSmF2YU1ldGhvZCBtZXRob2QpIHsKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHBhcmFtZXRlck9yZGVyIGZvciBhIFBvcnRUeXBlIG9wZXJhdGlvbgorICAgICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0byBnZW5lcmF0ZSB0aGUgcGFyYW1ldGVyT3JkZXIgZm9yCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUge0BsaW5rIEphdmFNZXRob2R9IHRvIGdlbmVyYXRlIHRoZSBwYXJhbWV0ZXJPcmRlciBmcm9tCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVEb2N1bWVudFBhcmFtZXRlck9yZGVyKE9wZXJhdGlvbiBvcGVyYXRpb24sIEphdmFNZXRob2RJbXBsIG1ldGhvZCkgewogICAgICAgICBTdHJpbmcgcGFydE5hbWU7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbU9yZGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICBTZXQ8U3RyaW5nPiBwYXJ0TmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIExpc3Q8UGFyYW1ldGVyPiBzb3J0ZWRQYXJhbXMgPSBzb3J0TWV0aG9kUGFyYW1ldGVycyhtZXRob2QpOworICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IHNvcnRlZFBhcmFtcyA9IHNvcnRNZXRob2RQYXJhbWV0ZXJzKG1ldGhvZCk7CiAgICAgICAgIGJvb2xlYW4gaXNXcmFwcGVyU3R5bGUgPSBpc1dyYXBwZXJTdHlsZShtZXRob2QpOwogICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IHNvcnRlZFBhcmFtcykgeworICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcGFyYW1ldGVyIDogc29ydGVkUGFyYW1zKSB7CiAvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGFyYW06ICIrcGFyYW1ldGVyLmdldEluZGV4KCkrIiBuYW1lOiAiK3BhcmFtZXRlci5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5nZXRJbmRleCgpIDwgMCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQzMiwxOCArNjI0LDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgTGlzdDxQYXJhbWV0ZXI+IHNvcnRNZXRob2RQYXJhbWV0ZXJzKEphdmFNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIFNldDxQYXJhbWV0ZXI+IHBhcmFtU2V0ID0gbmV3IEhhc2hTZXQ8UGFyYW1ldGVyPigpOwotICAgICAgICBMaXN0PFBhcmFtZXRlcj4gc29ydGVkUGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7CisgICAgLyoqCisgICAgICogU29ydHMgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXRob2QgYnkgdGhlaXIgcG9zaXRpb24KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSB7QGxpbmsgSmF2YU1ldGhvZH0gdXNlZCB0byBzb3J0IHRoZSBwYXJhbWV0ZXJzCisgICAgICogQHJldHVybiB0aGUgc29ydGVkIHtAbGluayBMaXN0fSBvZiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIExpc3Q8UGFyYW1ldGVySW1wbD4gc29ydE1ldGhvZFBhcmFtZXRlcnMoSmF2YU1ldGhvZEltcGwgbWV0aG9kKSB7CisgICAgICAgIFNldDxQYXJhbWV0ZXJJbXBsPiBwYXJhbVNldCA9IG5ldyBIYXNoU2V0PFBhcmFtZXRlckltcGw+KCk7CisgICAgICAgIExpc3Q8UGFyYW1ldGVySW1wbD4gc29ydGVkUGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXJJbXBsPigpOwogICAgICAgICBpZiAoaXNScGNMaXQobWV0aG9kKSkgewotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHBhcmFtIDogbWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkpIHsKICAgICAgICAgICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBXcmFwcGVyUGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtU2V0LmFkZEFsbCgoKFdyYXBwZXJQYXJhbWV0ZXIpcGFyYW0pLmdldFdyYXBwZXJDaGlsZHJlbigpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwYXJhbVNldC5hZGQocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogbWV0aG9kLmdldFJlc3BvbnNlUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcGFyYW0gOiBtZXRob2QuZ2V0UmVzcG9uc2VQYXJhbWV0ZXJzKCkpIHsKICAgICAgICAgICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBXcmFwcGVyUGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtU2V0LmFkZEFsbCgoKFdyYXBwZXJQYXJhbWV0ZXIpcGFyYW0pLmdldFdyYXBwZXJDaGlsZHJlbigpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNDU0LDEyICs2NTEsMTIgQEAKICAgICAgICAgICAgIHBhcmFtU2V0LmFkZEFsbChtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSk7CiAgICAgICAgICAgICBwYXJhbVNldC5hZGRBbGwobWV0aG9kLmdldFJlc3BvbnNlUGFyYW1ldGVycygpKTsKICAgICAgICAgfQotICAgICAgICBJdGVyYXRvcjxQYXJhbWV0ZXI+cGFyYW1zID0gcGFyYW1TZXQuaXRlcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3I8UGFyYW1ldGVySW1wbD5wYXJhbXMgPSBwYXJhbVNldC5pdGVyYXRvcigpOwogICAgICAgICBpZiAocGFyYW1TZXQuc2l6ZSgpID09IDApCiAgICAgICAgICAgICByZXR1cm4gc29ydGVkUGFyYW1zOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBwYXJhbXMubmV4dCgpOworICAgICAgICBQYXJhbWV0ZXJJbXBsIHBhcmFtID0gcGFyYW1zLm5leHQoKTsKICAgICAgICAgc29ydGVkUGFyYW1zLmFkZChwYXJhbSk7Ci0gICAgICAgIFBhcmFtZXRlciBzb3J0ZWRQYXJhbTsKKyAgICAgICAgUGFyYW1ldGVySW1wbCBzb3J0ZWRQYXJhbTsKICAgICAgICAgaW50IHBvczsKICAgICAgICAgZm9yIChpbnQgaT0xOyBpPHBhcmFtU2V0LnNpemUoKTtpKyspIHsKICAgICAgICAgICAgIHBhcmFtID0gcGFyYW1zLm5leHQoKTsKQEAgLTQ3NywyNjAgKzY3NCwyNjYgQEAKICAgICAgICAgcmV0dXJuIHNvcnRlZFBhcmFtczsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0JvZHlQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYSBwYXJhbWV0ZXIgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlIEJvZHkKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyIHRoZSBwYXJhbWV0ZXIgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmFtZXRlciBpcyBhIDxjb2RlPmJvZHk8L2NvZGU+IHBhcmFtZXRlcgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQm9keVBhcmFtZXRlcihQYXJhbWV0ZXJJbXBsIHBhcmFtZXRlcikgewogICAgICAgICBQYXJhbWV0ZXJCaW5kaW5nIHBhcmFtQmluZGluZyA9IHBhcmFtZXRlci5nZXRCaW5kaW5nKCk7CiAgICAgICAgIHJldHVybiBwYXJhbUJpbmRpbmcuaXNCb2R5KCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNIZWFkZXJQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgIHByb3RlY3RlZCBib29sZWFuIGlzSGVhZGVyUGFyYW1ldGVyKFBhcmFtZXRlckltcGwgcGFyYW1ldGVyKSB7CiAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgcGFyYW1CaW5kaW5nID0gcGFyYW1ldGVyLmdldEJpbmRpbmcoKTsKICAgICAgICAgcmV0dXJuIHBhcmFtQmluZGluZy5pc0hlYWRlcigpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXR0YWNobWVudFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBdHRhY2htZW50UGFyYW1ldGVyKFBhcmFtZXRlckltcGwgcGFyYW1ldGVyKSB7CiAgICAgICAgIFBhcmFtZXRlckJpbmRpbmcgcGFyYW1CaW5kaW5nID0gcGFyYW1ldGVyLmdldEJpbmRpbmcoKTsKICAgICAgICAgcmV0dXJuIHBhcmFtQmluZGluZy5pc0F0dGFjaG1lbnQoKTsKICAgICB9CiAKIAorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgQmluZGluZyBzZWN0aW9uIG9mIHRoZSBXU0RMCisgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVCaW5kaW5nKCkgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBzZXJ2aWNlRGVmaW5pdGlvbnMuYmluZGluZygpLm5hbWUobW9kZWwuZ2V0UG9ydE5hbWUoKS5nZXRMb2NhbFBhcnQoKStCSU5ESU5HKTsKKyAgICAgICAgQmluZGluZyBiaW5kaW5nID0gc2VydmljZURlZmluaXRpb25zLmJpbmRpbmcoKS5uYW1lKG1vZGVsLmdldEJvdW5kUG9ydFR5cGVOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICBleHRlbnNpb24uYWRkQmluZGluZ0V4dGVuc2lvbihiaW5kaW5nKTsKICAgICAgICAgYmluZGluZy50eXBlKG1vZGVsLmdldFBvcnRUeXBlTmFtZSgpKTsKICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoSmF2YU1ldGhvZCBtZXRob2QgOiBtb2RlbC5nZXRKYXZhTWV0aG9kcygpKSB7CisgICAgICAgIGZvciAoSmF2YU1ldGhvZEltcGwgbWV0aG9kIDogbW9kZWwuZ2V0SmF2YU1ldGhvZHMoKSkgewogICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRCaW5kaW5nKCkgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgewotICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZyBzQmluZGluZyA9IChTT0FQQmluZGluZyltZXRob2QuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgICAgICAgICBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbiA9IHNCaW5kaW5nLmdldFNPQVBWZXJzaW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoc29hcFZlcnNpb24uZXF1YWxzKGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykpewotICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcDEyLlNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gYmluZGluZy5zb2FwMTJCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZy50cmFuc3BvcnQoU09BUDEyX0hUVFBfVFJBTlNQT1JUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQmluZGluZy5nZXRTdHlsZSgpLmVxdWFscyhTdHlsZS5ET0NVTUVOVCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmcuc3R5bGUoRE9DVU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nLnN0eWxlKFJQQyk7Ci0gICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcC5TT0FQQmluZGluZyBzb2FwQmluZGluZyA9IGJpbmRpbmcuc29hcEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nLnRyYW5zcG9ydChTT0FQX0hUVFBfVFJBTlNQT1JUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQmluZGluZy5nZXRTdHlsZSgpLmVxdWFscyhTdHlsZS5ET0NVTUVOVCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmcuc3R5bGUoRE9DVU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nLnN0eWxlKFJQQyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTT0FQQmluZGluZyBzQmluZGluZyA9IG1ldGhvZC5nZXRCaW5kaW5nKCk7CisgICAgICAgICAgICAgICAgU09BUFZlcnNpb24gc29hcFZlcnNpb24gPSBzQmluZGluZy5nZXRTT0FQVmVyc2lvbigpOworICAgICAgICAgICAgICAgIGlmIChzb2FwVmVyc2lvbiA9PSBTT0FQVmVyc2lvbi5TT0FQXzEyKXsKKyAgICAgICAgICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcDEyLlNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gYmluZGluZy5zb2FwMTJCaW5kaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nLnRyYW5zcG9ydChTT0FQMTJfSFRUUF9UUkFOU1BPUlQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc0JpbmRpbmcuZ2V0U3R5bGUoKS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmcuc3R5bGUoRE9DVU1FTlQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZy5zdHlsZShSUEMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcC5TT0FQQmluZGluZyBzb2FwQmluZGluZyA9IGJpbmRpbmcuc29hcEJpbmRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmcudHJhbnNwb3J0KFNPQVBfSFRUUF9UUkFOU1BPUlQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc0JpbmRpbmcuZ2V0U3R5bGUoKS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmcuc3R5bGUoRE9DVU1FTlQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZy5zdHlsZShSUEMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoYmluZGluZ0lkLmVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKQorICAgICAgICAgICAgaWYodGhpcy5iaW5kaW5nLmdldEJpbmRpbmdJZCgpLmdldFNPQVBWZXJzaW9uKCk9PVNPQVBWZXJzaW9uLlNPQVBfMTIpCiAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTT0FQMTJCaW5kaW5nT3BlcmF0aW9uKG1ldGhvZCwgYmluZGluZyk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uKG1ldGhvZCwgYmluZGluZyk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb24oSmF2YU1ldGhvZCBtZXRob2QsIEJpbmRpbmcgYmluZGluZykgeworICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQmluZGluZ09wZXJhdGlvbihKYXZhTWV0aG9kSW1wbCBtZXRob2QsIEJpbmRpbmcgYmluZGluZykgewogICAgICAgICBCaW5kaW5nT3BlcmF0aW9uVHlwZSBvcGVyYXRpb24gPSBiaW5kaW5nLm9wZXJhdGlvbigpLm5hbWUobWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKSk7CisgICAgICAgIGV4dGVuc2lvbi5hZGRCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9uKG9wZXJhdGlvbiwgbWV0aG9kKTsKICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpOwogICAgICAgICBRTmFtZSByZXF1ZXN0TWVzc2FnZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIG1ldGhvZC5nZXRPcGVyYXRpb25OYW1lKCkpOwotICAgICAgICBRTmFtZSByZXNwb25zZU1lc3NhZ2UgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBtZXRob2QuZ2V0T3BlcmF0aW9uTmFtZSgpK1JFU1BPTlNFKTsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXRCaW5kaW5nKCkgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgewotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IGJvZHlQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBoZWFkZXJQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLSAgICAgICAgICAgIHNwbGl0UGFyYW1ldGVycyhib2R5UGFyYW1zLCBoZWFkZXJQYXJhbXMsIG1ldGhvZC5nZXRSZXF1ZXN0UGFyYW1ldGVycygpKTsKLSAgICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKW1ldGhvZC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb24uc29hcE9wZXJhdGlvbigpLnNvYXBBY3Rpb24oc29hcEJpbmRpbmcuZ2V0U09BUEFjdGlvbigpKTsKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXJJbXBsPiBib2R5UGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXJJbXBsPigpOworICAgICAgICBMaXN0PFBhcmFtZXRlckltcGw+IGhlYWRlclBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVySW1wbD4oKTsKKyAgICAgICAgc3BsaXRQYXJhbWV0ZXJzKGJvZHlQYXJhbXMsIGhlYWRlclBhcmFtcywgbWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkpOworICAgICAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IG1ldGhvZC5nZXRCaW5kaW5nKCk7CisgICAgICAgIG9wZXJhdGlvbi5zb2FwT3BlcmF0aW9uKCkuc29hcEFjdGlvbihzb2FwQmluZGluZy5nZXRTT0FQQWN0aW9uKCkpOwogCi0gICAgICAgICAgICAvLyBpbnB1dAotICAgICAgICAgICAgVHlwZWRYbWxXcml0ZXIgaW5wdXQgPSBvcGVyYXRpb24uaW5wdXQoKTsKLSAgICAgICAgICAgIEJvZHlUeXBlIGJvZHkgPSBpbnB1dC5fZWxlbWVudChCb2R5LmNsYXNzKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNScGMgPSBzb2FwQmluZGluZy5nZXRTdHlsZSgpLmVxdWFscyhTdHlsZS5SUEMpOwotICAgICAgICAgICAgaWYgKHNvYXBCaW5kaW5nLmdldFVzZSgpLmVxdWFscyhVc2UuTElURVJBTCkpIHsKLSAgICAgICAgICAgICAgICBib2R5LnVzZShMSVRFUkFMKTsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyUGFyYW1zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlQYXJhbXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYm9keVBhcmFtcy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JwYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBwYXJ0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6ICgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkuZ2V0V3JhcHBlckNoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkrKz4wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJhbWV0ZXIuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMocGFydHMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LnBhcnRzKFBBUkFNRVRFUlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMocGFyYW0uZ2V0UGFydE5hbWUoKSk7CisgICAgICAgIC8vIGlucHV0CisgICAgICAgIFR5cGVkWG1sV3JpdGVyIGlucHV0ID0gb3BlcmF0aW9uLmlucHV0KCk7CisgICAgICAgIGV4dGVuc2lvbi5hZGRCaW5kaW5nT3BlcmF0aW9uSW5wdXRFeHRlbnNpb24oaW5wdXQsIG1ldGhvZCk7CisgICAgICAgIEJvZHlUeXBlIGJvZHkgPSBpbnB1dC5fZWxlbWVudChCb2R5LmNsYXNzKTsKKyAgICAgICAgYm9vbGVhbiBpc1JwYyA9IHNvYXBCaW5kaW5nLmdldFN0eWxlKCkuZXF1YWxzKFN0eWxlLlJQQyk7CisgICAgICAgIGlmIChzb2FwQmluZGluZy5nZXRVc2UoKT09VXNlLkxJVEVSQUwpIHsKKyAgICAgICAgICAgIGJvZHkudXNlKExJVEVSQUwpOworICAgICAgICAgICAgaWYgKGhlYWRlclBhcmFtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJvZHlQYXJhbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHBhcmFtID0gYm9keVBhcmFtcy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnBjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcGFydHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaT0wOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHBhcmFtZXRlciA6ICgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkuZ2V0V3JhcHBlckNoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSsrPjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJhbWV0ZXIuZ2V0UGFydE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5LnBhcnRzKHBhcnRzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMoUEFSQU1FVEVSUyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib2R5LnBhcnRzKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgYm9keS5wYXJ0cyhwYXJhbS5nZXRQYXJ0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNPQVBIZWFkZXJzKGlucHV0LCBoZWFkZXJQYXJhbXMsIHJlcXVlc3RNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBib2R5LnBhcnRzKCIiKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzUnBjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHkubmFtZXNwYWNlKG1ldGhvZC5nZXRSZXF1ZXN0UGFyYW1ldGVycygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIGxvY2FsaXplIHRoaXMKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiZW5jb2RlZCB1c2UgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlU09BUEhlYWRlcnMoaW5wdXQsIGhlYWRlclBhcmFtcywgcmVxdWVzdE1lc3NhZ2UpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzUnBjKSB7CisgICAgICAgICAgICAgICAgYm9keS5uYW1lc3BhY2UobWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE8gbG9jYWxpemUgdGhpcworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oImVuY29kZWQgdXNlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobWV0aG9kLmdldE1FUCgpICE9IE1lc3NhZ2VTdHJ1Y3QuT05FX1dBWV9NRVApIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHVud3JhcHBhYmxlID0gaGVhZGVyUGFyYW1zLnNpemUoKSA9PSAwOwotICAgICAgICAgICAgICAgIC8vIG91dHB1dAotICAgICAgICAgICAgICAgIGJvZHlQYXJhbXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJQYXJhbXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBzcGxpdFBhcmFtZXRlcnMoYm9keVBhcmFtcywgaGVhZGVyUGFyYW1zLCBtZXRob2QuZ2V0UmVzcG9uc2VQYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgICAgIHVud3JhcHBhYmxlID0gdW53cmFwcGFibGUgPyBoZWFkZXJQYXJhbXMuc2l6ZSgpID09IDAgOiB1bndyYXBwYWJsZTsKLSAgICAgICAgICAgICAgICBUeXBlZFhtbFdyaXRlciBvdXRwdXQgPSBvcGVyYXRpb24ub3V0cHV0KCk7Ci0gICAgICAgICAgICAgICAgYm9keSA9IG91dHB1dC5fZWxlbWVudChCb2R5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBib2R5LnVzZShMSVRFUkFMKTsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyUGFyYW1zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnRzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChib2R5UGFyYW1zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGJvZHlQYXJhbXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGlmIChtZXRob2QuZ2V0TUVQKCkgIT0gTUVQLk9ORV9XQVkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gdW53cmFwcGFibGUgPSBoZWFkZXJQYXJhbXMuc2l6ZSgpID09IDA7CisgICAgICAgICAgICAvLyBvdXRwdXQKKyAgICAgICAgICAgIGJvZHlQYXJhbXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGhlYWRlclBhcmFtcy5jbGVhcigpOworICAgICAgICAgICAgc3BsaXRQYXJhbWV0ZXJzKGJvZHlQYXJhbXMsIGhlYWRlclBhcmFtcywgbWV0aG9kLmdldFJlc3BvbnNlUGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgIHVud3JhcHBhYmxlID0gdW53cmFwcGFibGUgPyBoZWFkZXJQYXJhbXMuc2l6ZSgpID09IDAgOiB1bndyYXBwYWJsZTsKKyAgICAgICAgICAgIFR5cGVkWG1sV3JpdGVyIG91dHB1dCA9IG9wZXJhdGlvbi5vdXRwdXQoKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbi5hZGRCaW5kaW5nT3BlcmF0aW9uT3V0cHV0RXh0ZW5zaW9uKG91dHB1dCwgbWV0aG9kKTsKKyAgICAgICAgICAgIGJvZHkgPSBvdXRwdXQuX2VsZW1lbnQoQm9keS5jbGFzcyk7CisgICAgICAgICAgICBib2R5LnVzZShMSVRFUkFMKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXJQYXJhbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0cyA9ICIiOworICAgICAgICAgICAgICAgIGlmIChib2R5UGFyYW1zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVySW1wbCBwYXJhbSA9IGJvZHlQYXJhbXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkgPyBib2R5UGFyYW1zLml0ZXJhdG9yKCkubmV4dCgpIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYocGFyYW0hPW51bGwpewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbWV0ZXIgOiAoKFdyYXBwZXJQYXJhbWV0ZXIpcGFyYW0pLmdldFdyYXBwZXJDaGlsZHJlbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHBhcmFtZXRlciA6ICgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkuZ2V0V3JhcHBlckNoaWxkcmVuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkrKz4wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgKz0gIiAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cyArPSBwYXJhbWV0ZXIuZ2V0UGFydE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdHMgbm90IHJlYWxseSB3cmFwcGVyIHN0eWxlIGRvbnQgdXNlIHRoZSBzYW1lIG5hbWUgYXMgaW5wdXQgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVud3JhcHBhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gUkVTVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gVU5XUkFQUEFCTEVfUkVTVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBwYXJhbS5nZXRQYXJ0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXRzIG5vdCByZWFsbHkgd3JhcHBlciBzdHlsZSBkb250IHVzZSB0aGUgc2FtZSBuYW1lIGFzIGlucHV0IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVud3JhcHBhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBSRVNVTFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gVU5XUkFQUEFCTEVfUkVTVUxUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gcGFyYW0uZ2V0UGFydE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYm9keS5wYXJ0cyhwYXJ0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU09BUEhlYWRlcnMob3V0cHV0LCBoZWFkZXJQYXJhbXMsIHJlc3BvbnNlTWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc1JwYykgewotICAgICAgICAgICAgICAgICAgICBib2R5Lm5hbWVzcGFjZShtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib2R5LnBhcnRzKHBhcnRzKTsKKyAgICAgICAgICAgICAgICBRTmFtZSByZXNwb25zZU1lc3NhZ2UgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBtZXRob2QuZ2V0UmVzcG9uc2VNZXNzYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZVNPQVBIZWFkZXJzKG91dHB1dCwgaGVhZGVyUGFyYW1zLCByZXNwb25zZU1lc3NhZ2UpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChDaGVja2VkRXhjZXB0aW9uIGV4Y2VwdGlvbiA6IG1ldGhvZC5nZXRDaGVja2VkRXhjZXB0aW9ucygpKSB7Ci0vLyAgICAgICAgICAgICAgICBRTmFtZSB0YWdOYW1lID0gZXhjZXB0aW9uLmdldERldGFpbFR5cGUoKS50YWdOYW1lOwotLy8gICAgICAgICAgICAgICAgRmF1bHQgZmF1bHQgPSBvcGVyYXRpb24uZmF1bHQoKS5uYW1lKHRhZ05hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotLy8gICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IGZhdWx0Ll9lbGVtZW50KFNPQVBGYXVsdC5jbGFzcykubmFtZSh0YWdOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICBGYXVsdCBmYXVsdCA9IG9wZXJhdGlvbi5mYXVsdCgpLm5hbWUoZXhjZXB0aW9uLmdldE1lc3NhZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBmYXVsdC5fZWxlbWVudChTT0FQRmF1bHQuY2xhc3MpLm5hbWUoZXhjZXB0aW9uLmdldE1lc3NhZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC51c2UoTElURVJBTCk7CisgICAgICAgICAgICBpZiAoaXNScGMpIHsKKyAgICAgICAgICAgICAgICBib2R5Lm5hbWVzcGFjZShtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbkltcGwgZXhjZXB0aW9uIDogbWV0aG9kLmdldENoZWNrZWRFeGNlcHRpb25zKCkpIHsKKyAgICAgICAgICAgIEZhdWx0IGZhdWx0ID0gb3BlcmF0aW9uLmZhdWx0KCkubmFtZShleGNlcHRpb24uZ2V0TWVzc2FnZU5hbWUoKSk7CisgICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gZmF1bHQuX2VsZW1lbnQoU09BUEZhdWx0LmNsYXNzKS5uYW1lKGV4Y2VwdGlvbi5nZXRNZXNzYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIHNvYXBGYXVsdC51c2UoTElURVJBTCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNPQVAxMkJpbmRpbmdPcGVyYXRpb24oSmF2YU1ldGhvZCBtZXRob2QsIEJpbmRpbmcgYmluZGluZykgeworICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU09BUDEyQmluZGluZ09wZXJhdGlvbihKYXZhTWV0aG9kSW1wbCBtZXRob2QsIEJpbmRpbmcgYmluZGluZykgewogICAgICAgICBCaW5kaW5nT3BlcmF0aW9uVHlwZSBvcGVyYXRpb24gPSBiaW5kaW5nLm9wZXJhdGlvbigpLm5hbWUobWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKSk7CiAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKICAgICAgICAgUU5hbWUgcmVxdWVzdE1lc3NhZ2UgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBtZXRob2QuZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgUU5hbWUgcmVzcG9uc2VNZXNzYWdlID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKStSRVNQT05TRSk7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0QmluZGluZygpIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBib2R5UGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlcj4gaGVhZGVyUGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7Ci0gICAgICAgICAgICBzcGxpdFBhcmFtZXRlcnMoYm9keVBhcmFtcywgaGVhZGVyUGFyYW1zLCBtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZyltZXRob2QuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgb3BlcmF0aW9uLnNvYXAxMk9wZXJhdGlvbigpLnNvYXBBY3Rpb24oc29hcEJpbmRpbmcuZ2V0U09BUEFjdGlvbigpKTsKIAotICAgICAgICAgICAgLy8gaW5wdXQKLSAgICAgICAgICAgIFR5cGVkWG1sV3JpdGVyIGlucHV0ID0gb3BlcmF0aW9uLmlucHV0KCk7CisgICAgICAgIEFycmF5TGlzdDxQYXJhbWV0ZXJJbXBsPiBib2R5UGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXJJbXBsPigpOworICAgICAgICBBcnJheUxpc3Q8UGFyYW1ldGVySW1wbD4gaGVhZGVyUGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXJJbXBsPigpOworICAgICAgICBzcGxpdFBhcmFtZXRlcnMoYm9keVBhcmFtcywgaGVhZGVyUGFyYW1zLCBtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSk7CisgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gbWV0aG9kLmdldEJpbmRpbmcoKTsKKyAgICAgICAgb3BlcmF0aW9uLnNvYXAxMk9wZXJhdGlvbigpLnNvYXBBY3Rpb24oc29hcEJpbmRpbmcuZ2V0U09BUEFjdGlvbigpKTsKIAotICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcDEyLkJvZHlUeXBlIGJvZHkgPSBpbnB1dC5fZWxlbWVudChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5kb2N1bWVudC5zb2FwMTIuQm9keS5jbGFzcyk7Ci0gICAgICAgICAgICBib29sZWFuIGlzUnBjID0gc29hcEJpbmRpbmcuZ2V0U3R5bGUoKS5lcXVhbHMoU3R5bGUuUlBDKTsKLSAgICAgICAgICAgIGlmIChzb2FwQmluZGluZy5nZXRVc2UoKS5lcXVhbHMoVXNlLkxJVEVSQUwpKSB7Ci0gICAgICAgICAgICAgICAgYm9keS51c2UoTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlclBhcmFtcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChib2R5UGFyYW1zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGJvZHlQYXJhbXMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNScGMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcGFydHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbWV0ZXIgOiAoKFdyYXBwZXJQYXJhbWV0ZXIpcGFyYW0pLmdldFdyYXBwZXJDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKys+MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQocGFyYW1ldGVyLmdldFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LnBhcnRzKHBhcnRzLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5wYXJ0cyhQQVJBTUVURVJTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LnBhcnRzKHBhcmFtLmdldFBhcnROYW1lKCkpOworICAgICAgICAvLyBpbnB1dAorICAgICAgICBUeXBlZFhtbFdyaXRlciBpbnB1dCA9IG9wZXJhdGlvbi5pbnB1dCgpOworCisgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwud3JpdGVyLmRvY3VtZW50LnNvYXAxMi5Cb2R5VHlwZSBib2R5ID0gaW5wdXQuX2VsZW1lbnQoY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcDEyLkJvZHkuY2xhc3MpOworICAgICAgICBib29sZWFuIGlzUnBjID0gc29hcEJpbmRpbmcuZ2V0U3R5bGUoKS5lcXVhbHMoU3R5bGUuUlBDKTsKKyAgICAgICAgaWYgKHNvYXBCaW5kaW5nLmdldFVzZSgpLmVxdWFscyhVc2UuTElURVJBTCkpIHsKKyAgICAgICAgICAgIGJvZHkudXNlKExJVEVSQUwpOworICAgICAgICAgICAgaWYgKGhlYWRlclBhcmFtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJvZHlQYXJhbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbXBsIHBhcmFtID0gYm9keVBhcmFtcy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnBjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcGFydHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaT0wOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHBhcmFtZXRlciA6ICgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkuZ2V0V3JhcHBlckNoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSsrPjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJhbWV0ZXIuZ2V0UGFydE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5LnBhcnRzKHBhcnRzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMoUEFSQU1FVEVSUyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib2R5LnBhcnRzKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgYm9keS5wYXJ0cyhwYXJhbS5nZXRQYXJ0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNPQVAxMkhlYWRlcnMoaW5wdXQsIGhlYWRlclBhcmFtcywgcmVxdWVzdE1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMoIiIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaXNScGMpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9keS5uYW1lc3BhY2UobWV0aG9kLmdldFJlcXVlc3RQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gbG9jYWxpemUgdGhpcwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJlbmNvZGVkIHVzZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVTT0FQMTJIZWFkZXJzKGlucHV0LCBoZWFkZXJQYXJhbXMsIHJlcXVlc3RNZXNzYWdlKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc1JwYykgeworICAgICAgICAgICAgICAgIGJvZHkubmFtZXNwYWNlKG1ldGhvZC5nZXRSZXF1ZXN0UGFyYW1ldGVycygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPIGxvY2FsaXplIHRoaXMKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJlbmNvZGVkIHVzZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRNRVAoKSAhPSBNZXNzYWdlU3RydWN0Lk9ORV9XQVlfTUVQKSB7Ci0gICAgICAgICAgICAgICAgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB1bndyYXBwYWJsZSA9IGhlYWRlclBhcmFtcy5zaXplKCkgPT0gMDsKLSAgICAgICAgICAgICAgICBib2R5UGFyYW1zLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgaGVhZGVyUGFyYW1zLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgc3BsaXRQYXJhbWV0ZXJzKGJvZHlQYXJhbXMsIGhlYWRlclBhcmFtcywgbWV0aG9kLmdldFJlc3BvbnNlUGFyYW1ldGVycygpKTsKLSAgICAgICAgICAgICAgICB1bndyYXBwYWJsZSA9IHVud3JhcHBhYmxlID8gaGVhZGVyUGFyYW1zLnNpemUoKSA9PSAwIDogdW53cmFwcGFibGU7Ci0gICAgICAgICAgICAgICAgVHlwZWRYbWxXcml0ZXIgb3V0cHV0ID0gb3BlcmF0aW9uLm91dHB1dCgpOwotICAgICAgICAgICAgICAgIGJvZHkgPSBvdXRwdXQuX2VsZW1lbnQoY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcDEyLkJvZHkuY2xhc3MpOwotICAgICAgICAgICAgICAgIGJvZHkudXNlKExJVEVSQUwpOwotICAgICAgICAgICAgICAgIGlmIChoZWFkZXJQYXJhbXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYm9keVBhcmFtcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBib2R5UGFyYW1zLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnBjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnRzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbWV0ZXIgOiAoKFdyYXBwZXJQYXJhbWV0ZXIpcGFyYW0pLmdldFdyYXBwZXJDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKys+MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzICs9ICIgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgKz0gcGFyYW1ldGVyLmdldFBhcnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMocGFydHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5pc1dyYXBwZXJTdHlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXRzIG5vdCByZWFsbHkgd3JhcHBlciBzdHlsZSBkb250IHVzZSB0aGUgc2FtZSBuYW1lIGFzIGlucHV0IG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW53cmFwcGFibGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMoUkVTVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMoVU5XUkFQUEFCTEVfUkVTVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5wYXJ0cyhwYXJhbS5nZXRQYXJ0TmFtZSgpKTsKKyAgICAgICAgaWYgKG1ldGhvZC5nZXRNRVAoKSAhPSBNRVAuT05FX1dBWSkgeworICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICBib29sZWFuIHVud3JhcHBhYmxlID0gaGVhZGVyUGFyYW1zLnNpemUoKSA9PSAwOworICAgICAgICAgICAgYm9keVBhcmFtcy5jbGVhcigpOworICAgICAgICAgICAgaGVhZGVyUGFyYW1zLmNsZWFyKCk7CisgICAgICAgICAgICBzcGxpdFBhcmFtZXRlcnMoYm9keVBhcmFtcywgaGVhZGVyUGFyYW1zLCBtZXRob2QuZ2V0UmVzcG9uc2VQYXJhbWV0ZXJzKCkpOworICAgICAgICAgICAgdW53cmFwcGFibGUgPSB1bndyYXBwYWJsZSA/IGhlYWRlclBhcmFtcy5zaXplKCkgPT0gMCA6IHVud3JhcHBhYmxlOworICAgICAgICAgICAgVHlwZWRYbWxXcml0ZXIgb3V0cHV0ID0gb3BlcmF0aW9uLm91dHB1dCgpOworICAgICAgICAgICAgYm9keSA9IG91dHB1dC5fZWxlbWVudChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5kb2N1bWVudC5zb2FwMTIuQm9keS5jbGFzcyk7CisgICAgICAgICAgICBib2R5LnVzZShMSVRFUkFMKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXJQYXJhbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChib2R5UGFyYW1zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVySW1wbCBwYXJhbSA9IGJvZHlQYXJhbXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1JwYykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnRzID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaT0wOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIHBhcmFtZXRlciA6ICgoV3JhcHBlclBhcmFtZXRlcilwYXJhbSkuZ2V0V3JhcHBlckNoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSsrPjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzICs9ICIgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cyArPSBwYXJhbWV0ZXIuZ2V0UGFydE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMocGFydHMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmlzV3JhcHBlclN0eWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0cyBub3QgcmVhbGx5IHdyYXBwZXIgc3R5bGUgZG9udCB1c2UgdGhlIHNhbWUgbmFtZSBhcyBpbnB1dCBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW53cmFwcGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5wYXJ0cyhSRVNVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMoVU5XUkFQUEFCTEVfUkVTVUxUKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkucGFydHMoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5wYXJ0cyhwYXJhbS5nZXRQYXJ0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNPQVAxMkhlYWRlcnMob3V0cHV0LCBoZWFkZXJQYXJhbXMsIHJlc3BvbnNlTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5wYXJ0cygiIik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc1JwYykgewotICAgICAgICAgICAgICAgICAgICBib2R5Lm5hbWVzcGFjZShtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBRTmFtZSByZXNwb25zZU1lc3NhZ2UgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBtZXRob2QuZ2V0UmVzcG9uc2VNZXNzYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZVNPQVAxMkhlYWRlcnMob3V0cHV0LCBoZWFkZXJQYXJhbXMsIHJlc3BvbnNlTWVzc2FnZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKENoZWNrZWRFeGNlcHRpb24gZXhjZXB0aW9uIDogbWV0aG9kLmdldENoZWNrZWRFeGNlcHRpb25zKCkpIHsKLS8vICAgICAgICAgICAgICAgIFFOYW1lIHRhZ05hbWUgPSBleGNlcHRpb24uZ2V0RGV0YWlsVHlwZSgpLnRhZ05hbWU7Ci0vLyAgICAgICAgICAgICAgICBGYXVsdCBmYXVsdCA9IG9wZXJhdGlvbi5mYXVsdCgpLm5hbWUodGFnTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0vLyAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5kb2N1bWVudC5zb2FwMTIuU09BUEZhdWx0IHNvYXBGYXVsdCA9IGZhdWx0Ll9lbGVtZW50KGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwud3JpdGVyLmRvY3VtZW50LnNvYXAxMi5TT0FQRmF1bHQuY2xhc3MpLm5hbWUodGFnTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgRmF1bHQgZmF1bHQgPSBvcGVyYXRpb24uZmF1bHQoKS5uYW1lKGV4Y2VwdGlvbi5nZXRNZXNzYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5kb2N1bWVudC5zb2FwMTIuU09BUEZhdWx0IHNvYXBGYXVsdCA9IGZhdWx0Ll9lbGVtZW50KGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwud3JpdGVyLmRvY3VtZW50LnNvYXAxMi5TT0FQRmF1bHQuY2xhc3MpLm5hbWUoZXhjZXB0aW9uLmdldE1lc3NhZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC51c2UoTElURVJBTCk7CisgICAgICAgICAgICBpZiAoaXNScGMpIHsKKyAgICAgICAgICAgICAgICBib2R5Lm5hbWVzcGFjZShtZXRob2QuZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGZvciAoQ2hlY2tlZEV4Y2VwdGlvbkltcGwgZXhjZXB0aW9uIDogbWV0aG9kLmdldENoZWNrZWRFeGNlcHRpb25zKCkpIHsKKyAgICAgICAgICAgIEZhdWx0IGZhdWx0ID0gb3BlcmF0aW9uLmZhdWx0KCkubmFtZShleGNlcHRpb24uZ2V0TWVzc2FnZU5hbWUoKSk7CisgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5kb2N1bWVudC5zb2FwMTIuU09BUEZhdWx0IHNvYXBGYXVsdCA9IGZhdWx0Ll9lbGVtZW50KGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwud3JpdGVyLmRvY3VtZW50LnNvYXAxMi5TT0FQRmF1bHQuY2xhc3MpLm5hbWUoZXhjZXB0aW9uLmdldE1lc3NhZ2VOYW1lKCkpOworICAgICAgICAgICAgc29hcEZhdWx0LnVzZShMSVRFUkFMKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHNwbGl0UGFyYW1ldGVycyhMaXN0PFBhcmFtZXRlcj4gYm9keVBhcmFtcywgTGlzdDxQYXJhbWV0ZXI+aGVhZGVyUGFyYW1zLCBMaXN0PFBhcmFtZXRlcj5wYXJhbXMpIHsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcGFyYW1zKSB7CisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9keVBhcmFtcworICAgICAqIEBwYXJhbSBoZWFkZXJQYXJhbXMKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3BsaXRQYXJhbWV0ZXJzKExpc3Q8UGFyYW1ldGVySW1wbD4gYm9keVBhcmFtcywgTGlzdDxQYXJhbWV0ZXJJbXBsPmhlYWRlclBhcmFtcywgTGlzdDxQYXJhbWV0ZXJJbXBsPnBhcmFtcykgeworICAgICAgICBmb3IgKFBhcmFtZXRlckltcGwgcGFyYW1ldGVyIDogcGFyYW1zKSB7CiAgICAgICAgICAgICBpZiAoaXNCb2R5UGFyYW1ldGVyKHBhcmFtZXRlcikpIHsKICAgICAgICAgICAgICAgICBib2R5UGFyYW1zLmFkZChwYXJhbWV0ZXIpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTczOSw5ICs5NDIsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU09BUEhlYWRlcnMoVHlwZWRYbWxXcml0ZXIgd3JpdGVyLCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgUU5hbWUgbWVzc2FnZSkgeworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNPQVBIZWFkZXJzKFR5cGVkWG1sV3JpdGVyIHdyaXRlciwgTGlzdDxQYXJhbWV0ZXJJbXBsPiBwYXJhbWV0ZXJzLCBRTmFtZSBtZXNzYWdlKSB7CiAKLSAgICAgICAgZm9yIChQYXJhbWV0ZXIgaGVhZGVyUGFyYW0gOiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGZvciAoUGFyYW1ldGVySW1wbCBoZWFkZXJQYXJhbSA6IHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSB3cml0ZXIuX2VsZW1lbnQoSGVhZGVyLmNsYXNzKTsKICAgICAgICAgICAgIGhlYWRlci5tZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgICAgICAgaGVhZGVyLnBhcnQoaGVhZGVyUGFyYW0uZ2V0UGFydE5hbWUoKSk7CkBAIC03NDksOSArOTU4LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNPQVAxMkhlYWRlcnMoVHlwZWRYbWxXcml0ZXIgd3JpdGVyLCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgUU5hbWUgbWVzc2FnZSkgeworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNPQVAxMkhlYWRlcnMoVHlwZWRYbWxXcml0ZXIgd3JpdGVyLCBMaXN0PFBhcmFtZXRlckltcGw+IHBhcmFtZXRlcnMsIFFOYW1lIG1lc3NhZ2UpIHsKIAotICAgICAgICBmb3IgKFBhcmFtZXRlciBoZWFkZXJQYXJhbSA6IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXJJbXBsIGhlYWRlclBhcmFtIDogcGFyYW1ldGVycykgewogICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcDEyLkhlYWRlciBoZWFkZXIgPSB3cml0ZXIuX2VsZW1lbnQoY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcDEyLkhlYWRlci5jbGFzcyk7CiAgICAgICAgICAgICBoZWFkZXIubWVzc2FnZShtZXNzYWdlKTsKIApAQCAtNzYxLDM1ICs5NzYsNjEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgU2VydmljZSBzZWN0aW9uIG9mIHRoZSBXU0RMCisgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVTZXJ2aWNlKCkgewogICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBtb2RlbC5nZXRQb3J0TmFtZSgpOwogICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBtb2RlbC5nZXRTZXJ2aWNlUU5hbWUoKTsKICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gc2VydmljZURlZmluaXRpb25zLnNlcnZpY2UoKS5uYW1lKHNlcnZpY2VRTmFtZS5nZXRMb2NhbFBhcnQoKSk7CisgICAgICAgIGV4dGVuc2lvbi5hZGRTZXJ2aWNlRXh0ZW5zaW9uKHNlcnZpY2UpOwogICAgICAgICBQb3J0IHBvcnQgPSBzZXJ2aWNlLnBvcnQoKS5uYW1lKHBvcnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHBvcnQuYmluZGluZyhuZXcgUU5hbWUoc2VydmljZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwb3J0UU5hbWUuZ2V0TG9jYWxQYXJ0KCkrQklORElORykpOworICAgICAgICBwb3J0LmJpbmRpbmcobW9kZWwuZ2V0Qm91bmRQb3J0VHlwZU5hbWUoKSk7CisgICAgICAgIGV4dGVuc2lvbi5hZGRQb3J0RXh0ZW5zaW9uKHBvcnQpOwogICAgICAgICBpZiAobW9kZWwuZ2V0SmF2YU1ldGhvZHMoKS5zaXplKCkgPT0gMCkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKG1vZGVsLmdldEphdmFNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0QmluZGluZygpIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKLSAgICAgICAgICAgIGlmKGJpbmRpbmdJZC5lcXVhbHMoamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKSl7Ci0gICAgICAgICAgICAgICAgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXIuZG9jdW1lbnQuc29hcDEyLlNPQVBBZGRyZXNzIGFkZHJlc3MgPSBwb3J0Ll9lbGVtZW50KGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwud3JpdGVyLmRvY3VtZW50LnNvYXAxMi5TT0FQQWRkcmVzcy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcy5sb2NhdGlvbihSRVBMQUNFX1dJVEhfQUNUVUFMX1VSTCk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBTT0FQQWRkcmVzcyBhZGRyZXNzID0gcG9ydC5fZWxlbWVudChTT0FQQWRkcmVzcy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcy5sb2NhdGlvbihSRVBMQUNFX1dJVEhfQUNUVUFMX1VSTCk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgaWYodGhpcy5iaW5kaW5nLmdldEJpbmRpbmdJZCgpLmdldFNPQVBWZXJzaW9uKCk9PSBTT0FQVmVyc2lvbi5TT0FQXzEyKXsKKyAgICAgICAgICAgIGNvbS5zdW4ueG1sLmludGVybmFsLndzLndzZGwud3JpdGVyLmRvY3VtZW50LnNvYXAxMi5TT0FQQWRkcmVzcyBhZGRyZXNzID0gcG9ydC5fZWxlbWVudChjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlci5kb2N1bWVudC5zb2FwMTIuU09BUEFkZHJlc3MuY2xhc3MpOworICAgICAgICAgICAgYWRkcmVzcy5sb2NhdGlvbihlbmRwb2ludEFkZHJlc3MpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIFNPQVBBZGRyZXNzIGFkZHJlc3MgPSBwb3J0Ll9lbGVtZW50KFNPQVBBZGRyZXNzLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZHJlc3MubG9jYXRpb24oZW5kcG9pbnRBZGRyZXNzKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSW5wdXRNZXNzYWdlKE9wZXJhdGlvbiBvcGVyYXRpb24sIEphdmFNZXRob2QgbWV0aG9kKSB7CisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3BlcmF0aW9uCisgICAgICogQHBhcmFtIG1ldGhvZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSW5wdXRNZXNzYWdlKE9wZXJhdGlvbiBvcGVyYXRpb24sIEphdmFNZXRob2RJbXBsIG1ldGhvZCkgewogICAgICAgICBQYXJhbVR5cGUgcGFyYW1UeXBlID0gb3BlcmF0aW9uLmlucHV0KCk7Ci0gICAgICAgIHBhcmFtVHlwZS5tZXNzYWdlKG5ldyBRTmFtZShtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKSkpOworICAgICAgICBleHRlbnNpb24uYWRkT3BlcmF0aW9uSW5wdXRFeHRlbnNpb24ocGFyYW1UeXBlLCBtZXRob2QpOworLy8gICAgICAgIHBhcmFtVHlwZS5tZXNzYWdlKG1ldGhvZC5nZXRPcGVyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICBwYXJhbVR5cGUubWVzc2FnZShuZXcgUU5hbWUobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG1ldGhvZC5nZXRSZXF1ZXN0TWVzc2FnZU5hbWUoKSkpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlT3V0cHV0TWVzc2FnZShPcGVyYXRpb24gb3BlcmF0aW9uLCBKYXZhTWV0aG9kIG1ldGhvZCkgeworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIG9wZXJhdGlvbgorICAgICAqIEBwYXJhbSBtZXRob2QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU91dHB1dE1lc3NhZ2UoT3BlcmF0aW9uIG9wZXJhdGlvbiwgSmF2YU1ldGhvZEltcGwgbWV0aG9kKSB7CiAgICAgICAgIFBhcmFtVHlwZSBwYXJhbVR5cGUgPSBvcGVyYXRpb24ub3V0cHV0KCk7Ci0gICAgICAgIHBhcmFtVHlwZS5tZXNzYWdlKG5ldyBRTmFtZShtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbWV0aG9kLmdldE9wZXJhdGlvbk5hbWUoKStSRVNQT05TRSkpOworICAgICAgICBleHRlbnNpb24uYWRkT3BlcmF0aW9uT3V0cHV0RXh0ZW5zaW9uKHBhcmFtVHlwZSwgbWV0aG9kKTsKKy8vICAgICAgICBwYXJhbVR5cGUubWVzc2FnZShuZXcgUU5hbWUobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG1ldGhvZC5nZXRPcGVyYXRpb24oKS5nZXRMb2NhbE5hbWUoKStSRVNQT05TRSkpOworICAgICAgICBwYXJhbVR5cGUubWVzc2FnZShuZXcgUU5hbWUobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG1ldGhvZC5nZXRSZXNwb25zZU1lc3NhZ2VOYW1lKCkpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSB7QGxpbmsgUmVzdWx0fSBvYmplY3QgdXNlZCBieSBKQVhCIHRvIGdlbmVyYXRlIGEgc2NoZW1hIGZvciB0aGUKKyAgICAgKiBuYW1lc2FwY2VVcmkgbmFtZXNwYWNlLgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVcmkgVGhlIG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYSBiZWluZyBnZW5lcmF0ZWQKKyAgICAgKiBAcGFyYW0gc3VnZ2VzdGVkRmlsZU5hbWUgdGhlIEpBWEIgc3VnZ2VzdGVkIGZpbGUgbmFtZSBmb3IgdGhlIHNjaGVtYSBmaWxlCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIFJlc3VsdH0gZm9yIEpBWEIgdG8gZ2VuZXJhdGUgdGhlIHNjaGVtYSBpbnRvCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHRocm93biBpZiBvbiBJTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KICAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZU91dHB1dEZpbGUoU3RyaW5nIG5hbWVzcGFjZVVyaSwgU3RyaW5nIHN1Z2dlc3RlZEZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBSZXN1bHQgcmVzdWx0OwogICAgICAgICBpZiAobmFtZXNwYWNlVXJpLmVxdWFscygiIikpIHsKQEAgLTgyNSw3ICsxMDY2LDEwIEBACiAgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBub3JtYWxpemUgdGhlIHJlbGF0aXZlIFVSSS4KKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gcmVsYXRpdml6ZQogICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSB0aGUgYmFzZSBVUkkgdG8gdXNlIGZvciB0aGUgcmVsYXRpdml6YXRpb24KICAgICAgKiBAcmV0dXJuIHRoZSByZWxhdGl2ZSBVUkkgb3IgdGhlIG9yaWdpbmFsIFVSSSBpZiBhIHJlbGF0aXZlIG9uZSBjb3VsZCBub3QgYmUgY29tcHV0ZWQKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyB1cmksIFN0cmluZyBiYXNlVXJpKSB7CkBAIC04ODQsOSArMTEyOCwyNSBAQAogICAgIH0KIAogCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyB0aGUgU2NoZW1hT3V0cHV0UmVzb2x2ZXIgdXNlZCBieSBKQVhCIHRvCisgICAgICovCiAgICAgcHJvdGVjdGVkIGNsYXNzIEpBWFdTT3V0cHV0U2NoZW1hUmVzb2x2ZXIgZXh0ZW5kcyBTY2hlbWFPdXRwdXRSZXNvbHZlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBSZXN1bHR9IG9iamVjdCB1c2VkIGJ5IEpBWEIgdG8gZ2VuZXJhdGUgYSBzY2hlbWEgZm9yIHRoZQorICAgICAgICAgKiBuYW1lc2FwY2VVcmkgbmFtZXNwYWNlLgorICAgICAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVXJpIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBzY2hlbWEgYmVpbmcgZ2VuZXJhdGVkCisgICAgICAgICAqIEBwYXJhbSBzdWdnZXN0ZWRGaWxlTmFtZSB0aGUgSkFYQiBzdWdnZXN0ZWQgZmlsZSBuYW1lIGZvciB0aGUgc2NoZW1hIGZpbGUKKyAgICAgICAgICogQHJldHVybiB0aGUge0BsaW5rIFJlc3VsdH0gZm9yIEpBWEIgdG8gZ2VuZXJhdGUgdGhlIHNjaGVtYSBpbnRvCisgICAgICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB0aHJvd24gaWYgb24gSU8gZXJyb3Igb2NjdXJzCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZU91dHB1dChTdHJpbmcgbmFtZXNwYWNlVXJpLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICByZXR1cm4gY3JlYXRlT3V0cHV0RmlsZShuYW1lc3BhY2VVcmksIHN1Z2dlc3RlZEZpbGVOYW1lKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlcihXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uIGgpIHsKKyAgICAgICAgZXh0ZW5zaW9uSGFuZGxlcnMuYWRkKGgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL1dTRExHZW5lcmF0b3JFeHRlbnNpb25GYWNhZGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL1dTRExHZW5lcmF0b3JFeHRlbnNpb25GYWNhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI4MGI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvV1NETEdlbmVyYXRvckV4dGVuc2lvbkZhY2FkZS5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnR4dzIuVHlwZWRYbWxXcml0ZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLkNoZWNrZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1vZGVsLkphdmFNZXRob2Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLndzZGwud3JpdGVyLldTRExHZW5FeHRuQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkud3NkbC53cml0ZXIuV1NETEdlbmVyYXRvckV4dGVuc2lvbjsKKworLyoqCisgKiB7QGxpbmsgV1NETEdlbmVyYXRvckV4dGVuc2lvbn0gdGhhdCBkZWxlZ2F0ZXMgdG8KKyAqIG11bHRpcGxlIHtAbGluayBXU0RMR2VuZXJhdG9yRXh0ZW5zaW9ufXMuCisgKgorICogPHA+CisgKiBUaGlzIHNpbXBsaWZpZXMge0BsaW5rIFdTRExHZW5lcmF0b3J9IHNpbmNlIGl0IG5vdworICogb25seSBuZWVkcyB0byB3b3JrIHdpdGggb25lIHtAbGluayBXU0RMR2VuZXJhdG9yRXh0ZW5zaW9ufS4KKyAqCisgKgorICogQGF1dGhvciBEb3VnIEtvaGxlcnQKKyAqLworZmluYWwgY2xhc3MgV1NETEdlbmVyYXRvckV4dGVuc2lvbkZhY2FkZSBleHRlbmRzIFdTRExHZW5lcmF0b3JFeHRlbnNpb24geworICAgIHByaXZhdGUgZmluYWwgV1NETEdlbmVyYXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7CisKKyAgICBXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uRmFjYWRlKFdTRExHZW5lcmF0b3JFeHRlbnNpb24uLi4gZXh0ZW5zaW9ucykgeworICAgICAgICBhc3NlcnQgZXh0ZW5zaW9ucyE9bnVsbDsKKyAgICAgICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydChXU0RMR2VuRXh0bkNvbnRleHQgY3R4dCkgeworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLnN0YXJ0KGN0eHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZChATm90TnVsbCBXU0RMR2VuRXh0bkNvbnRleHQgY3R4dCkgeworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLmVuZChjdHh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGREZWZpbml0aW9uc0V4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBkZWZpbml0aW9ucykgeworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLmFkZERlZmluaXRpb25zRXh0ZW5zaW9uKGRlZmluaXRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlRXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIHNlcnZpY2UpIHsKKyAgICAgICAgZm9yIChXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKQorICAgICAgICAgICAgZS5hZGRTZXJ2aWNlRXh0ZW5zaW9uKHNlcnZpY2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFBvcnRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgcG9ydCkgeworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLmFkZFBvcnRFeHRlbnNpb24ocG9ydCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUG9ydFR5cGVFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgcG9ydFR5cGUpIHsKKyAgICAgICAgZm9yIChXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKQorICAgICAgICAgICAgZS5hZGRQb3J0VHlwZUV4dGVuc2lvbihwb3J0VHlwZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmluZGluZ0V4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBiaW5kaW5nKSB7CisgICAgICAgIGZvciAoV1NETEdlbmVyYXRvckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykKKyAgICAgICAgICAgIGUuYWRkQmluZGluZ0V4dGVuc2lvbihiaW5kaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25FeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgb3BlcmF0aW9uLCBKYXZhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLmFkZE9wZXJhdGlvbkV4dGVuc2lvbihvcGVyYXRpb24sIG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBvcGVyYXRpb24sIEphdmFNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGZvciAoV1NETEdlbmVyYXRvckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykKKyAgICAgICAgICAgIGUuYWRkQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbihvcGVyYXRpb24sIG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXRNZXNzYWdlRXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIG1lc3NhZ2UsIEphdmFNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGZvciAoV1NETEdlbmVyYXRvckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykKKyAgICAgICAgICAgIGUuYWRkSW5wdXRNZXNzYWdlRXh0ZW5zaW9uKG1lc3NhZ2UsIG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkT3V0cHV0TWVzc2FnZUV4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBtZXNzYWdlLCBKYXZhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLmFkZE91dHB1dE1lc3NhZ2VFeHRlbnNpb24obWVzc2FnZSwgbWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25JbnB1dEV4dGVuc2lvbihUeXBlZFhtbFdyaXRlciBpbnB1dCwgSmF2YU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgZm9yIChXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKQorICAgICAgICAgICAgZS5hZGRPcGVyYXRpb25JbnB1dEV4dGVuc2lvbihpbnB1dCwgbWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25PdXRwdXRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgb3V0cHV0LCBKYXZhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLmFkZE9wZXJhdGlvbk91dHB1dEV4dGVuc2lvbihvdXRwdXQsIG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmluZGluZ09wZXJhdGlvbklucHV0RXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIGlucHV0LCBKYXZhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBmb3IgKFdTRExHZW5lcmF0b3JFeHRlbnNpb24gZSA6IGV4dGVuc2lvbnMpCisgICAgICAgICAgICBlLmFkZEJpbmRpbmdPcGVyYXRpb25JbnB1dEV4dGVuc2lvbihpbnB1dCwgbWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nT3BlcmF0aW9uT3V0cHV0RXh0ZW5zaW9uKFR5cGVkWG1sV3JpdGVyIG91dHB1dCwgSmF2YU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgZm9yIChXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKQorICAgICAgICAgICAgZS5hZGRCaW5kaW5nT3BlcmF0aW9uT3V0cHV0RXh0ZW5zaW9uKG91dHB1dCwgbWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nT3BlcmF0aW9uRmF1bHRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgZmF1bHQsIEphdmFNZXRob2QgbWV0aG9kLCBDaGVja2VkRXhjZXB0aW9uIGNlKSB7CisgICAgICAgIGZvciAoV1NETEdlbmVyYXRvckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykKKyAgICAgICAgICAgIGUuYWRkQmluZGluZ09wZXJhdGlvbkZhdWx0RXh0ZW5zaW9uKGZhdWx0LCBtZXRob2QsIGNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGYXVsdE1lc3NhZ2VFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgbWVzc2FnZSwgSmF2YU1ldGhvZCBtZXRob2QsIENoZWNrZWRFeGNlcHRpb24gY2UpIHsKKyAgICAgICAgZm9yIChXU0RMR2VuZXJhdG9yRXh0ZW5zaW9uIGUgOiBleHRlbnNpb25zKQorICAgICAgICAgICAgZS5hZGRGYXVsdE1lc3NhZ2VFeHRlbnNpb24obWVzc2FnZSwgbWV0aG9kLCBjZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uRmF1bHRFeHRlbnNpb24oVHlwZWRYbWxXcml0ZXIgZmF1bHQsIEphdmFNZXRob2QgbWV0aG9kLCBDaGVja2VkRXhjZXB0aW9uIGNlKSB7CisgICAgICAgIGZvciAoV1NETEdlbmVyYXRvckV4dGVuc2lvbiBlIDogZXh0ZW5zaW9ucykKKyAgICAgICAgICAgIGUuYWRkT3BlcmF0aW9uRmF1bHRFeHRlbnNpb24oZmF1bHQsIG1ldGhvZCwgY2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL1dTRExPdXRwdXRSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvV1NETE91dHB1dFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDdmMTIuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvV1NETE91dHB1dFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy53c2RsLndyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci0KLQotLyoqCi0gKgotICogQGF1dGhvciBXUyBEZXZlbG9wbWVudCBUZWFtCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETE91dHB1dFJlc29sdmVyIHsKLSAgICBwdWJsaWMgUmVzdWx0IGdldFdTRExPdXRwdXQoU3RyaW5nIHN1Z2dlc3RlZEZpbGVuYW1lKTsKLQotICAgIC8qCi0gICAgICogVXBkYXRlcyBmaWxlbmFtZSBpZiB0aGUgc3VnZ2VzdGVkIGZpbGVuYW1lIG5lZWQgdG8gYmUgY2hhbmdlZCBpbgotICAgICAqIHdzZGw6aW1wb3J0Ci0gICAgICoKLSAgICAgKiByZXR1cm4gbnVsbCBpZiBhYnN0cmFjdCBXU0RMIG5lZWQgbm90IGJlIGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBSZXN1bHQgZ2V0QWJzdHJhY3RXU0RMT3V0cHV0KEhvbGRlcjxTdHJpbmc+IGZpbGVuYW1lKTsKLQotICAgIC8qCi0gICAgICogVXBkYXRlcyBmaWxlbmFtZSBpZiB0aGUgc3VnZ2VzdGVkIGZpbGVuYW1lIG5lZWQgdG8gYmUgY2hhbmdlZCBpbgotICAgICAqIHhzZDppbXBvcnQKLSAgICAgKgotICAgICAqIHJldHVybiBudWxsIGlmIHNjaGVtYSBuZWVkIG5vdCBiZSBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzdWx0IGdldFNjaGVtYU91dHB1dChTdHJpbmcgbmFtZXNwYWNlLCBIb2xkZXI8U3RyaW5nPiBmaWxlbmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL1dTRExSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvV1NETFJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzMjAwYgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL1dTRExSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwud3Mud3NkbC53cml0ZXI7CisKK2ltcG9ydCBjb20uc3VuLmlzdGFjay5pbnRlcm5hbC5Ob3ROdWxsOworaW1wb3J0IGNvbS5zdW4uaXN0YWNrLmludGVybmFsLk51bGxhYmxlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7CisKKworLyoqCisgKiBXU0RMUmVzb2x2ZXIgaXMgdXNlZCBieSBXU0RMR2VuZXJhdG9yIHdoaWxlIGdlbmVyYXRpbmcgV1NETCBhbmQgaXRzIGFzc29jaWF0ZWQKKyAqIGRvY3VtZW50cy4gSXQgaXMgdXNlZCB0byBjb250cm9sIHdoYXQgZG9jdW1lbnRzIG5lZWQgdG8gYmUgZ2VuZXJhdGVkIGFuZCB3aGF0CisgKiBkb2N1bWVudHMgbmVlZCB0byBiZSBwaWNrZWQgZnJvbSBtZXRhZGF0YS4gSWYgZW5kcG9udCdzIGRvY3VtZW50IG1ldGFkYXRhCisgKiBhbHJlYWR5IGNvbnRhaW5zIHNvbWUgZG9jdW1lbnRzLCB0aGVpciBzeXN0ZW1pZHMgbWF5IGJlIHVzZWQgZm9yIHdzZGw6aW1wb3J0LAorICogYW5kIHNjaGVtYTppbXBvcnQuIFRoZSBzdWdnZXN0ZWQgZmlsZW5hbWVzIGFyZSByZWxhdGl2ZSB1cmxzKGZvciBlLmc6IEVjaG9TY2hlbWExLnhzZCkKKyAqIFRoZSBSZXN1bHQgb2JqZWN0IHN5c3RlbWlkcyBhcmUgYWxzbyByZWxhdGl2ZSB1cmxzKGZvciBlLmc6IEFic1dzZGwud3NkbCkuCisgKgorICogQGF1dGhvciBKaXRlbmRyYSBLb3RhbXJhanUKKyAqLworcHVibGljIGludGVyZmFjZSBXU0RMUmVzb2x2ZXIgeworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFJlc3VsdCBvYmplY3QgaW50byB3aGljaCBjb25jcmV0ZSBXU0RMIGlzIHRvIGJlIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVzdWx0IGZvciB0aGUgY29uY3JldGUgV1NETAorICAgICAqLworICAgIHB1YmxpYyBATm90TnVsbCBSZXN1bHQgZ2V0V1NETChATm90TnVsbCBTdHJpbmcgc3VnZ2VzdGVkRmlsZW5hbWUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgUmVzdWx0IG9iamVjdCBpbnRvIHdoaWNoIGFic3RyYWN0IFdTREwgaXMgdG8gYmUgZ2VuZXJhdGVkLiBJZiB0aGUgdGhlCisgICAgICogYWJzdHJhY3QgV1NETCBpcyBhbHJlYWR5IGluIG1ldGFkYXRhLCBpdCBpcyBub3QgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogVXBkYXRlIGZpbGVuYW1lIGlmIHRoZSBzdWdnZXN0ZWQgZmlsZW5hbWUgbmVlZCB0byBiZSBjaGFuZ2VkIGluIHdzZGw6aW1wb3J0LgorICAgICAqIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpZiB0aGUgbWV0YWRhdGEgY29udGFpbnMgYWJzdHJhY3QgV1NETCwgYW5kIHRoYXQgc3lzdGVtaWQKKyAgICAgKiBuZWVkcyB0byBiZSByZWZsZWN0ZWQgaW4gY29uY3JldGUgV1NETCdzIHdzZGw6aW1wb3J0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgYWJzdHJhY3QgV1NETCBuZWVkIG5vdCBiZSBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFJlc3VsdCBnZXRBYnN0cmFjdFdTREwoQE5vdE51bGwgSG9sZGVyPFN0cmluZz4gZmlsZW5hbWUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgUmVzdWx0IG9iamVjdCBpbnRvIHdoaWNoIHNjaGVtYSBkb2MgaXMgdG8gYmUgZ2VuZXJhdGVkLiBUeXBpY2FsbHkgaWYKKyAgICAgKiB0aGVyZSBpcyBhIHNjaGVtYSBkb2MgZm9yIG5hbWVzcGFjZSBpbiBtZXRhZGF0YSwgdGhlbiBpdCBpcyBub3QgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogVXBkYXRlIGZpbGVuYW1lIGlmIHRoZSBzdWdnZXN0ZWQgZmlsZW5hbWUgbmVlZCB0byBiZSBjaGFuZ2VkIGluIHhzZDppbXBvcnQuIFRoaXMKKyAgICAgKiBuZWVkcyB0byBiZSBkb25lIGlmIHRoZSBtZXRhZGF0YSBjb250YWlucyB0aGUgZG9jdW1lbnQsIGFuZCB0aGF0IHN5c3RlbWlkCisgICAgICogbmVlZHMgdG8gYmUgcmVmbGVjdGVkIGluIHNvbWUgb3RoZXIgZG9jdW1lbnQncyB4c2Q6aW1wb3J0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgc2NoZW1hIG5lZWQgbm90IGJlIGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgUmVzdWx0IGdldFNjaGVtYU91dHB1dChATm90TnVsbCBTdHJpbmcgbmFtZXNwYWNlLCBATm90TnVsbCBIb2xkZXI8U3RyaW5nPiBmaWxlbmFtZSk7CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L0JpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L0JpbmRpbmcuamF2YQppbmRleCBmZDJmMDdkLi5lODk3NTI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9CaW5kaW5nLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L0JpbmRpbmdPcGVyYXRpb25UeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9CaW5kaW5nT3BlcmF0aW9uVHlwZS5qYXZhCmluZGV4IDQ3YzRiMzIuLmUwYjdjOTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L0JpbmRpbmdPcGVyYXRpb25UeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvQmluZGluZ09wZXJhdGlvblR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9EZWZpbml0aW9ucy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvRGVmaW5pdGlvbnMuamF2YQppbmRleCBiZmU2OWQxLi5kODAzN2IwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9EZWZpbml0aW9ucy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L0RlZmluaXRpb25zLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvRG9jdW1lbnRlZC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvRG9jdW1lbnRlZC5qYXZhCmluZGV4IDViYjVkZTMuLjFkOGI4YjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L0RvY3VtZW50ZWQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9Eb2N1bWVudGVkLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvRmF1bHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L0ZhdWx0LmphdmEKaW5kZXggY2JlZTUzNy4uNWViZGJkYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvRmF1bHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9GYXVsdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L0ZhdWx0VHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvRmF1bHRUeXBlLmphdmEKaW5kZXggNTMwYjZiYy4uNjQwNWQ5ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvRmF1bHRUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvRmF1bHRUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvSW1wb3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9JbXBvcnQuamF2YQppbmRleCA1MjdhYzhhLi4xNmViMGI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9JbXBvcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9JbXBvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9NZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9NZXNzYWdlLmphdmEKaW5kZXggMDIxMzExMy4uNGM3NTVkOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvTWVzc2FnZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L01lc3NhZ2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9PcGVuQXR0cy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvT3BlbkF0dHMuamF2YQppbmRleCA2YjE5MjNhLi43MzQyNzM1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9PcGVuQXR0cy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L09wZW5BdHRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvT3BlcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9PcGVyYXRpb24uamF2YQppbmRleCA4NWFiODgyLi4yNzc3Mzk1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9PcGVyYXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9PcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9QYXJhbVR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BhcmFtVHlwZS5qYXZhCmluZGV4IDFkYTE4MTIuLjUxMWUwNDggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BhcmFtVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BhcmFtVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BhcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BhcnQuamF2YQppbmRleCBlMDJiODUxLi5lYTYzZDEyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9QYXJ0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvUGFydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BvcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BvcnQuamF2YQppbmRleCAyZmNhMGExLi4yMjg2NGVkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9Qb3J0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvUG9ydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BvcnRUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9Qb3J0VHlwZS5qYXZhCmluZGV4IGIyNmM3ZGUuLjUyZWNlY2EgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1BvcnRUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvUG9ydFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9TZXJ2aWNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9TZXJ2aWNlLmphdmEKaW5kZXggZGQwNjdlOS4uOWEyZGY5NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvU2VydmljZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1NlcnZpY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9TdGFydFdpdGhFeHRlbnNpb25zVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvU3RhcnRXaXRoRXh0ZW5zaW9uc1R5cGUuamF2YQppbmRleCBhYjY2NGM5Li4yNzQxYjEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9TdGFydFdpdGhFeHRlbnNpb25zVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1N0YXJ0V2l0aEV4dGVuc2lvbnNUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvVHlwZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L1R5cGVzLmphdmEKaW5kZXggMzg3MjE5OS4uNzNjYzg5NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvVHlwZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9UeXBlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L2h0dHAvQWRkcmVzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvaHR0cC9BZGRyZXNzLmphdmEKaW5kZXggZjgwMzQxMC4uYTExM2IxNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvaHR0cC9BZGRyZXNzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvaHR0cC9BZGRyZXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvaHR0cC9CaW5kaW5nLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9odHRwL0JpbmRpbmcuamF2YQppbmRleCA0MDFlYzc1Li4yZmQ1NTI3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9odHRwL0JpbmRpbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9odHRwL0JpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9odHRwL09wZXJhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvaHR0cC9PcGVyYXRpb24uamF2YQppbmRleCAxYmE3YzBiLi42YWNlMWViIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9odHRwL09wZXJhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L2h0dHAvT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvaHR0cC9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L2h0dHAvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggYTNmNjExZi4uZGYwZDU4YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvaHR0cC9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9odHRwL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3BhY2thZ2UtaW5mby5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggZTg2ODE4Ny4uYTUxNDc2MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvcGFja2FnZS1pbmZvLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvcGFja2FnZS1pbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9Cb2R5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL0JvZHkuamF2YQppbmRleCBlY2U5OTU1Li43NDBlM2YzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL0JvZHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL0JvZHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL0JvZHlUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL0JvZHlUeXBlLmphdmEKaW5kZXggYjMwMTNjYS4uMThmYmEyYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9Cb2R5VHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAvQm9keVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL0hlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9IZWFkZXIuamF2YQppbmRleCA1NjNiYTI3Li4yZWFjZjI0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL0hlYWRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAvSGVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9IZWFkZXJGYXVsdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9IZWFkZXJGYXVsdC5qYXZhCmluZGV4IDE3M2U2ZWYuLmQ5NmZjZTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAvSGVhZGVyRmF1bHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL0hlYWRlckZhdWx0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQQWRkcmVzcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQQWRkcmVzcy5qYXZhCmluZGV4IDMyZjRhZmUuLjJlMjEzMTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAvU09BUEFkZHJlc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL1NPQVBBZGRyZXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQQmluZGluZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQQmluZGluZy5qYXZhCmluZGV4IGU5NDk3NjYuLjQ4NTliYmMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAvU09BUEJpbmRpbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL1NPQVBCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQRmF1bHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAvU09BUEZhdWx0LmphdmEKaW5kZXggNzVkMzY1Mi4uYzM5ZTVkOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQRmF1bHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL1NPQVBGYXVsdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQT3BlcmF0aW9uLmphdmEKaW5kZXggZmM5NGZlNi4uODQyNjJiYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQT3BlcmF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9TT0FQT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggY2M4Nzk0ZS4uODhhYzMzNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcC9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9Cb2R5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvQm9keS5qYXZhCmluZGV4IDkxM2MyNWUuLmU1OWI3MWIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9Cb2R5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL0JvZHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvQm9keVR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9Cb2R5VHlwZS5qYXZhCmluZGV4IDk4NDA2NDguLmY2ZmU5NTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9Cb2R5VHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9Cb2R5VHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9IZWFkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9IZWFkZXIuamF2YQppbmRleCA0OGQ0Y2RhLi43MTI5YzM0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvSGVhZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL0hlYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9IZWFkZXJGYXVsdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL0hlYWRlckZhdWx0LmphdmEKaW5kZXggMDU4N2Y2Ny4uMzExZWRjNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL0hlYWRlckZhdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL0hlYWRlckZhdWx0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL1NPQVBBZGRyZXNzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvU09BUEFkZHJlc3MuamF2YQppbmRleCA1MWFkZmFiLi44OTIzZmI2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvU09BUEFkZHJlc3MuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvU09BUEFkZHJlc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvU09BUEJpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9TT0FQQmluZGluZy5qYXZhCmluZGV4IDZmMzlmNzYuLjZiODYxMTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9TT0FQQmluZGluZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9TT0FQQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9TT0FQRmF1bHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9TT0FQRmF1bHQuamF2YQppbmRleCAzMGYyZTNmLi5jNjRkY2FlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvU09BUEZhdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL1NPQVBGYXVsdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9TT0FQT3BlcmF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvU09BUE9wZXJhdGlvbi5qYXZhCmluZGV4IDUzOWRiYzMuLjQzYzk2OWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9TT0FQT3BlcmF0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL1NPQVBPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC9zb2FwMTIvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggOTMyYTUyYS4uNmUyY2U2NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQvc29hcDEyL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3NvYXAxMi9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC94c2QvSW1wb3J0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC94c2QvSW1wb3J0LmphdmEKaW5kZXggNGQxYThiMS4uNmJmNDRmMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQveHNkL0ltcG9ydC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3hzZC9JbXBvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC94c2QvU2NoZW1hLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC94c2QvU2NoZW1hLmphdmEKaW5kZXggODJiYWUyYi4uNTdmMTUwYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQveHNkL1NjaGVtYS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3hzZC9TY2hlbWEuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC94c2QvcGFja2FnZS1pbmZvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC93cy93c2RsL3dyaXRlci9kb2N1bWVudC94c2QvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggNzM5YjQ2OS4uMDI1NjVjNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwvd3Mvd3NkbC93cml0ZXIvZG9jdW1lbnQveHNkL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3dzL3dzZGwvd3JpdGVyL2RvY3VtZW50L3hzZC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL0ZvcmVpZ25BdHRyaWJ1dGVzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL0ZvcmVpZ25BdHRyaWJ1dGVzLmphdmEKaW5kZXggMWEzMzEzYy4uMTQ1MmE4ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9Gb3JlaWduQXR0cmlidXRlcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vRm9yZWlnbkF0dHJpYnV0ZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1NDRC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9TQ0QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTU3MTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9TQ0QuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnNjZC5JdGVyYXRvcnM7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnNjZC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuc2NkLlNDREltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnNjZC5TQ0RQYXJzZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnNjZC5TdGVwOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5zY2QuVG9rZW5NZ3JFcnJvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnV0aWwuRGVmZXJlZENvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFNjaGVtYSBDb21wb25lbnQgRGVzaWduYXRvciAoU0NEKS4KKyAqCisgKiA8cD4KKyAqIFNDRCBmb3Igc2NoZW1hIGlzIHdoYXQgWFBhdGggaXMgZm9yIFhNTC4gU0NEIGFsbG93cyB5b3UgdG8gc2VsZWN0IGEgc2NoZW1hIGNvbXBvbmVudChzKQorICogZnJvbSBhIHNjaGVtYSBjb21wb25lbnQocykuCisgKgorICogPHA+CisgKiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNS9XRC14bWxzY2hlbWEtcmVmLTIwMDUwMzI5LyI+WE1MIFNjaGVtYTogQ29tcG9uZW50IERlc2lnbmF0b3JzPC9hPi4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gMDMvMjkvMjAwNSB3b3JraW5nIGRyYWZ0LgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNDRCB7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBTQ0QuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpbnZvbHZlcyBwYXJzaW5nIHRoZSBwYXRoIGV4cHJlc3Npb24gYW5kIHByZXBhcmluZyB0aGUgaW4tbWVtb3J5CisgICAgICogc3RydWN0dXJlLCBzbyB0aGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBwbGFuIHRvIHVzZSB0aGUgc2FtZSBTQ0QgYWdhaW5zdAorICAgICAqIGRpZmZlcmVudCBjb250ZXh0IG5vZGUgbXVsdGlwbGUgdGltZXMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB5b3Ugd2FudCB0byBldmFsdWF0ZSBTQ0QganVzdCBvbmNlLCB1c2Uge0BsaW5rIFhTQ29tcG9uZW50I3NlbGVjdH0gbWV0aG9kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFNDRCwgc3VjaCBhcyAiL2Zvby9iYXIiLgorICAgICAqIEBwYXJhbSBuc0NvbnRleHQKKyAgICAgKiAgICAgIEl0cyB7QGxpbmsgTmFtZXNwYWNlQ29udGV4dCNnZXROYW1lc3BhY2VVUkkoU3RyaW5nKX0gaXMgdXNlZAorICAgICAqICAgICAgdG8gcmVzb2x2ZSBwcmVmaXhlcyBpbiB0aGUgU0NEIHRvIHRoZSBuYW1lc3BhY2UgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU0NEIGNyZWF0ZShTdHJpbmcgcGF0aCwgTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHRocm93cyBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgU0NEUGFyc2VyIHAgPSBuZXcgU0NEUGFyc2VyKHBhdGgsbnNDb250ZXh0KTsKKyAgICAgICAgICAgIExpc3Q8Pz4gbGlzdCA9IHAuUmVsYXRpdmVTY2hlbWFDb21wb25lbnRQYXRoKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNDREltcGwocGF0aCxsaXN0LnRvQXJyYXkobmV3IFN0ZXBbbGlzdC5zaXplKCldKSk7CisgICAgICAgIH0gY2F0Y2ggKFRva2VuTWdyRXJyb3IgZSkgeworICAgICAgICAgICAgdGhyb3cgc2V0Q2F1c2UobmV3IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgLTEgKSxlKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgc2V0Q2F1c2UobmV3IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZS5jdXJyZW50VG9rZW4uYmVnaW5Db2x1bW4gKSxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiBzZXRDYXVzZShqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24gZSwgVGhyb3dhYmxlIHgpIHsKKyAgICAgICAgZS5pbml0Q2F1c2UoeCk7CisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0aGUgU0NEIGFnYWluc3QgdGhlIGdpdmVuIGNvbnRleHQgbm9kZSBhbmQKKyAgICAgKiByZXR1cm5zIHRoZSBtYXRjaGVkIG5vZGVzLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgY291bGQgYmUgZW1wdHkgYnV0IG5ldmVyIGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248WFNDb21wb25lbnQ+IHNlbGVjdChYU0NvbXBvbmVudCBjb250ZXh0Tm9kZSkgeworICAgICAgICByZXR1cm4gbmV3IERlZmVyZWRDb2xsZWN0aW9uPFhTQ29tcG9uZW50PihzZWxlY3QoSXRlcmF0b3JzLnNpbmdsZXRvbihjb250ZXh0Tm9kZSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgdGhlIFNDRCBhZ2FpbnN0IHRoZSB3aG9sZSBzY2hlbWEgYW5kCisgICAgICogcmV0dXJucyB0aGUgbWF0Y2hlZCBub2Rlcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGhlcmUgYmVjYXVzZSB7QGxpbmsgWFNTY2hlbWFTZXR9CisgICAgICogZG9lc24ndCBpbXBsZW1lbnQge0BsaW5rIFhTQ29tcG9uZW50fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGNvdWxkIGJlIGVtcHR5IGJ1dCBuZXZlciBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFhTQ29tcG9uZW50PiBzZWxlY3QoWFNTY2hlbWFTZXQgY29udGV4dE5vZGUpIHsKKyAgICAgICAgcmV0dXJuIHNlbGVjdChjb250ZXh0Tm9kZS5nZXRTY2hlbWFzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0aGUgU0NEIGFnYWluc3QgdGhlIGdpdmVuIGNvbnRleHQgbm9kZSBhbmQKKyAgICAgKiByZXR1cm5zIHRoZSBtYXRjaGVkIG5vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIGlmIHRoZSBTQ0QgZGlkbid0IG1hdGNoIGFueXRoaW5nLiBJZiB0aGUgU0NEIG1hdGNoZWQgbW9yZSB0aGFuIG9uZSBub2RlLAorICAgICAqICAgICAgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBYU0NvbXBvbmVudCBzZWxlY3RTaW5nbGUoWFNDb21wb25lbnQgY29udGV4dE5vZGUpIHsKKyAgICAgICAgSXRlcmF0b3I8WFNDb21wb25lbnQ+IHIgPSBzZWxlY3QoSXRlcmF0b3JzLnNpbmdsZXRvbihjb250ZXh0Tm9kZSkpOworICAgICAgICBpZihyLmhhc05leHQoKSkgICAgIHJldHVybiByLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGVzIHRoZSBTQ0QgYWdhaW5zdCB0aGUgd2hvbGUgc2NoZW1hIHNldCBhbmQKKyAgICAgKiByZXR1cm5zIHRoZSBtYXRjaGVkIG5vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIGlmIHRoZSBTQ0QgZGlkbid0IG1hdGNoIGFueXRoaW5nLiBJZiB0aGUgU0NEIG1hdGNoZWQgbW9yZSB0aGFuIG9uZSBub2RlLAorICAgICAqICAgICAgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBYU0NvbXBvbmVudCBzZWxlY3RTaW5nbGUoWFNTY2hlbWFTZXQgY29udGV4dE5vZGUpIHsKKyAgICAgICAgSXRlcmF0b3I8WFNDb21wb25lbnQ+IHIgPSBzZWxlY3QoY29udGV4dE5vZGUuaXRlcmF0ZVNjaGVtYSgpKTsKKyAgICAgICAgaWYoci5oYXNOZXh0KCkpICAgICByZXR1cm4gci5uZXh0KCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0aGUgU0NEIGFnYWluc3QgdGhlIGdpdmVuIHNldCBvZiBjb250ZXh0IG5vZGVzIGFuZAorICAgICAqIHJldHVybnMgdGhlIG1hdGNoZWQgbm9kZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dE5vZGVzCisgICAgICogICAgICB7QGxpbmsgWFNDb21wb25lbnR9cyB0aGF0IHJlcHJlc2VudCB0aGUgY29udGV4dCBub2RlIGFnYWluc3QKKyAgICAgKiAgICAgIHdoaWNoIHtAbGluayBTQ0R9IGlzIGV2YWx1YXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGNvdWxkIGJlIGVtcHR5IGJ1dCBuZXZlciBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBJdGVyYXRvcjxYU0NvbXBvbmVudD4gc2VsZWN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBYU0NvbXBvbmVudD4gY29udGV4dE5vZGVzKTsKKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0aGUgU0NEIGFnYWluc3QgdGhlIGdpdmVuIHNldCBvZiBjb250ZXh0IG5vZGVzIGFuZAorICAgICAqIHJldHVybnMgdGhlIG1hdGNoZWQgbm9kZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dE5vZGVzCisgICAgICogICAgICB7QGxpbmsgWFNDb21wb25lbnR9cyB0aGF0IHJlcHJlc2VudCB0aGUgY29udGV4dCBub2RlIGFnYWluc3QKKyAgICAgKiAgICAgIHdoaWNoIHtAbGluayBTQ0R9IGlzIGV2YWx1YXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGNvdWxkIGJlIGVtcHR5IGJ1dCBuZXZlciBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFhTQ29tcG9uZW50PiBzZWxlY3QoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWFNDb21wb25lbnQ+IGNvbnRleHROb2RlcykgeworICAgICAgICByZXR1cm4gbmV3IERlZmVyZWRDb2xsZWN0aW9uPFhTQ29tcG9uZW50PihzZWxlY3QoY29udGV4dE5vZGVzLml0ZXJhdG9yKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dWFsIFNDRCByZXByZXNlbnRhdGlvbiBhcyBnaXZlbiB0byB7QGxpbmsgU0NEI2NyZWF0ZShTdHJpbmcsIE5hbWVzcGFjZUNvbnRleHQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvU3RyaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQW5ub3RhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0Fubm90YXRpb24uamF2YQppbmRleCBjOTc5MDIyLi45OTIzN2IzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIGltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwpAQCAtNDcsNiArNDYsMTYgQEAKICAgICBPYmplY3QgZ2V0QW5ub3RhdGlvbigpOwogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRBbm5vdGF0aW9uKCl9LgorICAgICAqCisgICAgICogQHBhcmFtIG8KKyAgICAgKiAgICAgIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIG9sZCB2YWx1ZSB0aGF0IHdhcyByZXBsYWNlZCBieSB0aGUgPHR0Pm88L3R0Pi4KKyAgICAgKi8KKyAgICBPYmplY3Qgc2V0QW5ub3RhdGlvbihPYmplY3Qgbyk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbG9jYXRpb24gaW5mb3JtYXRpb24gb2YgdGhlIGFubm90YXRpb24uCiAgICAgICovCiAgICAgTG9jYXRvciBnZXRMb2NhdG9yKCk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQXR0Q29udGFpbmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQXR0Q29udGFpbmVyLmphdmEKaW5kZXggY2U2YmRmYS4uMjcxZDU5ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0F0dENvbnRhaW5lci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNBdHRDb250YWluZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNBdHRHcm91cERlY2wuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNBdHRHcm91cERlY2wuamF2YQppbmRleCBlODVhMDk4Li5hOGVkMzM2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQXR0R3JvdXBEZWNsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0F0dEdyb3VwRGVjbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNBdHRyaWJ1dGVEZWNsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQXR0cmlidXRlRGVjbC5qYXZhCmluZGV4IGU0OTMyN2QuLmQxYzVlY2YgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNBdHRyaWJ1dGVEZWNsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0F0dHJpYnV0ZURlY2wuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQXR0cmlidXRlVXNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQXR0cmlidXRlVXNlLmphdmEKaW5kZXggNzM2M2FiNy4uMWNmODkzMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0F0dHJpYnV0ZVVzZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNBdHRyaWJ1dGVVc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogaW1wb3J0IG9yZy5yZWxheG5nLmRhdGF0eXBlLlZhbGlkYXRpb25Db250ZXh0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0NvbXBsZXhUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQ29tcGxleFR5cGUuamF2YQppbmRleCAzNDc0NWJhLi5lMzNiYzQ1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQ29tcGxleFR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQ29tcGxleFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQ29tcG9uZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQ29tcG9uZW50LmphdmEKaW5kZXggNGI3MDJjMy4uY2Q5N2ZlMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0NvbXBvbmVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNDb21wb25lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyLlNjaGVtYURvY3VtZW50OwpAQCAtMzAsNyArMjksOSBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvci5YU1Zpc2l0b3I7CiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIAoraW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAogLyoqCiAgKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIHRoZSBzY2hlbWEgY29tcG9uZW50cy4KQEAgLTQ0LDYgKzQ1LDIwIEBACiAgICAgWFNBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKIAogICAgIC8qKgorICAgICAqIFdvcmtzIGxpa2Uge0BsaW5rICNnZXRBbm5vdGF0aW9uKCl9LCBidXQgYWxsb3cgYSBuZXcgZW1wdHkge0BsaW5rIFhTQW5ub3RhdGlvbn0gdG8gYmUgY3JlYXRlZAorICAgICAqIGlmIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcmVhdGVJZk5vdEV4aXN0CisgICAgICogICAgICB0cnVlIHRvIGNyZWF0ZSBhIG5ldyB7QGxpbmsgWFNBbm5vdGF0aW9ufSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFscmVhZHkuCisgICAgICogICAgICBmYWxzZSB0byBtYWtlIHRoaXMgbWV0aG9kIGJlaGF2ZWwgbGlrZSB7QGxpbmsgI2dldEFubm90YXRpb24oKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIGlmIDx0dD5jcmVhdGVJZk5vdEV4aXN0PT1mYWxzZTwvdHQ+IGFuZCBhbm5vdGF0aW9uIGRpZG4ndCBleGlzdC4KKyAgICAgKiAgICAgIE90aGVyd2lzZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBYU0Fubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTm90RXhpc3QpOworCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZm9yZWlnbiBhdHRyaWJ1dGVzIG9uIHRoaXMgc2NoZW1hIGNvbXBvbmVudC4KICAgICAgKgogICAgICAqIDxwPgpAQCAtODksNiArMTA0LDE1IEBACiAgICAgWFNTY2hlbWEgZ2V0T3duZXJTY2hlbWEoKTsKIAogICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvb3Qgc2NoZW1hIHNldCB0aGF0IGluY2x1ZGVzIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogPHA+CisgICAgICogSW4gY2FzZSBvZiA8Y29kZT5YU0VtcHR5PC9jb2RlPiBjb21wb25lbnQsIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJucyBudWxsIHNpbmNlIHRoZXJlIGlzIG5vIG93bmVyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBYU1NjaGVtYVNldCBnZXRSb290KCk7CisKKyAgICAvKioKICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgU2NoZW1hRG9jdW1lbnR9IHRoYXQgaW5kaWNhdGVzIHdoaWNoIGRvY3VtZW50IHRoaXMgY29tcG9uZW50CiAgICAgICogd2FzIGRlZmluZWQgaW4uCiAgICAgICoKQEAgLTEwMiw2ICsxMjYsMzkgQEAKICAgICBTY2hlbWFEb2N1bWVudCBnZXRTb3VyY2VEb2N1bWVudCgpOwogCiAgICAgLyoqCisgICAgICogRXZhbHVhdGVzIGEgc2NoZW1hIGNvbXBvbmVudCBkZXNpZ25hdG9yIGFnYWluc3QgdGhpcyBzY2hlbWEgY29tcG9uZW50CisgICAgICogYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBzY2hlbWEgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICBpZiBTQ0QgaXMgc3ludGFjdGljYWxseSBpbmNvcnJlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NkCisgICAgICogICAgICBTY2hlbWEgY29tcG9uZW50IGRlc2lnbmF0b3IuIFNlZSB7QGxpbmsgU0NEfSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqIEBwYXJhbSBuc0NvbnRleHQKKyAgICAgKiAgICAgIFRoZSBuYW1lc3BhY2UgY29udGV4dCBpbiB3aGljaCBTQ0QgaXMgZXZhbHVhdGVkLiBDYW5ub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBDYW4gYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgQ29sbGVjdGlvbjxYU0NvbXBvbmVudD4gc2VsZWN0KFN0cmluZyBzY2QsIE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KTsKKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyBhIHNjaGVtYSBjb21wb25lbnQgZGVzaWduYXRvciBhZ2FpbnN0IHRoaXMgc2NoZW1hIGNvbXBvbmVudAorICAgICAqIGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHRpbmcgc2NoZW1hIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICBpZiBTQ0QgaXMgc3ludGFjdGljYWxseSBpbmNvcnJlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NkCisgICAgICogICAgICBTY2hlbWEgY29tcG9uZW50IGRlc2lnbmF0b3IuIFNlZSB7QGxpbmsgU0NEfSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqIEBwYXJhbSBuc0NvbnRleHQKKyAgICAgKiAgICAgIFRoZSBuYW1lc3BhY2UgY29udGV4dCBpbiB3aGljaCBTQ0QgaXMgZXZhbHVhdGVkLiBDYW5ub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIGlmIHRoZSBTQ0QgZGlkbid0IG1hdGNoIGFueXRoaW5nLiBJZiB0aGUgU0NEIG1hdGNoZWQgbW9yZSB0aGFuIG9uZSBub2RlLAorICAgICAqICAgICAgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIFhTQ29tcG9uZW50IHNlbGVjdFNpbmdsZShTdHJpbmcgc2NkLCBOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCk7CisKKyAgICAvKioKICAgICAgKiBBY2NlcHRzIGEgdmlzaXRvci4KICAgICAgKi8KICAgICB2b2lkIHZpc2l0KCBYU1Zpc2l0b3IgdmlzaXRvciApOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0NvbnRlbnRUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQ29udGVudFR5cGUuamF2YQppbmRleCAwNDU4NDRlLi4xOTdmODkyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQ29udGVudFR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTQ29udGVudFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvci5YU0NvbnRlbnRUeXBlRnVuY3Rpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTRGVjbGFyYXRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDlkMTdmNDguLmZjN2Y1YTAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNEZWNsYXJhdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tOwogCiAvKioKQEAgLTQxLDYgKzQwLDggQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIChsb2NhbCkgbmFtZSBvZiB0aGUgZGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhpcyBjb21wb25lbnQgaXMgYW5vbnltb3VzLgogICAgICAqLwogICAgIFN0cmluZyBnZXROYW1lKCk7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNFbGVtZW50RGVjbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0VsZW1lbnREZWNsLmphdmEKaW5kZXggY2VjZDFhZC4uZmIyZWJkMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0VsZW1lbnREZWNsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0VsZW1lbnREZWNsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTM2LDEwICszNSwxOSBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFhTRWxlbWVudERlY2wgZXh0ZW5kcyBYU0RlY2xhcmF0aW9uLCBYU1Rlcm0KIHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoaXMgZWxlbWVudCBkZWNsYXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhbHdheXMgbm9uLW51bGwuCisgICAgICovCiAgICAgWFNUeXBlIGdldFR5cGUoKTsKIAogICAgIGJvb2xlYW4gaXNOaWxsYWJsZSgpOwogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3Vic3RpdHV0aW9uIGhlYWQgb2YgdGhpcyBlbGVtZW50LCBpZiBhbnkuCisgICAgICogT3RoZXJ3aXNlIG51bGwuCisgICAgICovCiAgICAgWFNFbGVtZW50RGVjbCBnZXRTdWJzdEFmZmlsaWF0aW9uKCk7CiAKICAgICAvKioKQEAgLTU3LDcgKzY1LDcgQEAKICAgICAgKiAocGx1cyA8Y29kZT5maW5hbERlZmF1bHQ8L2NvZGU+KS4KICAgICAgKgogICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKiAgICAgIFBvc3NpYmxlIHZhbHVlcyBhcmUge0BsaW5rIFhTVHlwZS5FWFRFTlNJT059IG9yCisgICAgICogICAgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHtAbGluayBYU1R5cGUjRVhURU5TSU9OfSBvcgogICAgICAqICAgICAgPGNvZGU+WFNUeXBlLlJFU1RSSUNUSU9OPC9jb2RlPi4KICAgICAgKi8KICAgICBib29sZWFuIGlzU3Vic3RpdHV0aW9uRXhjbHVkZWQoaW50IG1ldGhvZCk7CkBAIC02OSw3ICs3Nyw3IEBACiAgICAgICogKHBsdXMgPGNvZGU+YmxvY2tEZWZhdWx0PC9jb2RlPikuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogICAgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHtAbGluayBYU1R5cGUuRVhURU5TSU9OfSwKKyAgICAgKiAgICAgIFBvc3NpYmxlIHZhbHVlcyBhcmUge0BsaW5rIFhTVHlwZSNFWFRFTlNJT059LAogICAgICAqICAgICAgPGNvZGU+WFNUeXBlLlJFU1RSSUNUSU9OPC9jb2RlPiwgb3IgPGNvZGU+WFNUeXBlLlNVQlNUSVRVVElPTjwvY29kZT4KICAgICAgKi8KICAgICBib29sZWFuIGlzU3Vic3RpdHV0aW9uRGlzYWxsb3dlZChpbnQgbWV0aG9kKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNGYWNldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0ZhY2V0LmphdmEKaW5kZXggYzhjODM0Yi4uNWZlMmQwYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0ZhY2V0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0ZhY2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0lkZW50aXR5Q29uc3RyYWludC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0lkZW50aXR5Q29uc3RyYWludC5qYXZhCmluZGV4IDNmODY2MjkuLjEyYWIyZTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNJZGVudGl0eUNvbnN0cmFpbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTSWRlbnRpdHlDb25zdHJhaW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNMaXN0U2ltcGxlVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0xpc3RTaW1wbGVUeXBlLmphdmEKaW5kZXggOGRlNTQ5Ni4uYjgwZGE2YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0xpc3RTaW1wbGVUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU0xpc3RTaW1wbGVUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU01vZGVsR3JvdXAuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNNb2RlbEdyb3VwLmphdmEKaW5kZXggM2I2YTJmOC4uNjJlMDc3NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU01vZGVsR3JvdXAuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTTW9kZWxHcm91cC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNNb2RlbEdyb3VwRGVjbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU01vZGVsR3JvdXBEZWNsLmphdmEKaW5kZXggYjI3YjZkOS4uNzMxMGNhMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU01vZGVsR3JvdXBEZWNsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU01vZGVsR3JvdXBEZWNsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU05vdGF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTTm90YXRpb24uamF2YQppbmRleCA3ZmY2NjAxLi5hNDU2OGQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTTm90YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTTm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTUGFydGljbGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNQYXJ0aWNsZS5qYXZhCmluZGV4IGY2YzUyMjkuLjI1NTEwN2QgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNQYXJ0aWNsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNQYXJ0aWNsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNSZXN0cmljdGlvblNpbXBsZVR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNSZXN0cmljdGlvblNpbXBsZVR5cGUuamF2YQppbmRleCAwNmUxYmRjLi44NDQ2MTBlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTUmVzdHJpY3Rpb25TaW1wbGVUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1Jlc3RyaWN0aW9uU2ltcGxlVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1NjaGVtYS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1NjaGVtYS5qYXZhCmluZGV4IGYyMWQwZDguLjk4MDA2NGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNTY2hlbWEuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTU2NoZW1hLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnBhcnNlci5TY2hlbWFEb2N1bWVudDsKQEAgLTEyOSw0ICsxMjgsMTEgQEAKICAgICAgKiAgICAgIHRoZXJlJ3Mgc29tZXRoaW5nIHdyb25nIHdpdGggeW91ciBjb2RlLgogICAgICAqLwogICAgIFNjaGVtYURvY3VtZW50IGdldFNvdXJjZURvY3VtZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb290IHNjaGVtYSBzZXQgdGhhdCBpbmNsdWRlcyB0aGlzIHNjaGVtYS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBYU1NjaGVtYVNldCBnZXRSb290KCk7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTU2NoZW1hU2V0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTU2NoZW1hU2V0LmphdmEKaW5kZXggOWQ5NDRmNC4uYjgwMTI4ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1NjaGVtYVNldC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNTY2hlbWFTZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw5ICsyMiw5IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAoraW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKQEAgLTgxLDQgKzgxLDM0IEBACiAgICAgWFNTaW1wbGVUeXBlIGdldEFueVNpbXBsZVR5cGUoKTsKICAgICBYU0NvbnRlbnRUeXBlIGdldEVtcHR5KCk7CiAKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgYSBzY2hlbWEgY29tcG9uZW50IGRlc2lnbmF0b3IgYWdhaW5zdCB0aGlzIHNjaGVtYSBjb21wb25lbnQKKyAgICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHNjaGVtYSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgIGlmIFNDRCBpcyBzeW50YWN0aWNhbGx5IGluY29ycmVjdC4KKyAgICAgKiBAcGFyYW0gc2NkCisgICAgICogICAgICBTY2hlbWEgY29tcG9uZW50IGRlc2lnbmF0b3IuIFNlZSB7QGxpbmsgU0NEfSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqIEBwYXJhbSBuc0NvbnRleHQKKyAgICAgKiAgICAgIFRoZSBuYW1lc3BhY2UgY29udGV4dCBpbiB3aGljaCBTQ0QgaXMgZXZhbHVhdGVkLiBDYW5ub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBDYW4gYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgQ29sbGVjdGlvbjxYU0NvbXBvbmVudD4gc2VsZWN0KFN0cmluZyBzY2QsIE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KTsKKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyBhIHNjaGVtYSBjb21wb25lbnQgZGVzaWduYXRvciBhZ2FpbnN0IHRoaXMgc2NoZW1hIGNvbXBvbmVudAorICAgICAqIGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHRpbmcgc2NoZW1hIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICBpZiBTQ0QgaXMgc3ludGFjdGljYWxseSBpbmNvcnJlY3QuCisgICAgICogQHBhcmFtIHNjZAorICAgICAqICAgICAgU2NoZW1hIGNvbXBvbmVudCBkZXNpZ25hdG9yLiBTZWUge0BsaW5rIFNDRH0gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgKiBAcGFyYW0gbnNDb250ZXh0CisgICAgICogICAgICBUaGUgbmFtZXNwYWNlIGNvbnRleHQgaW4gd2hpY2ggU0NEIGlzIGV2YWx1YXRlZC4gQ2Fubm90IGJlIG51bGwuCisgICAgICogQHJldHVybgorICAgICAqICAgICAgbnVsbCBpZiB0aGUgU0NEIGRpZG4ndCBtYXRjaCBhbnl0aGluZy4gSWYgdGhlIFNDRCBtYXRjaGVkIG1vcmUgdGhhbiBvbmUgbm9kZSwKKyAgICAgKiAgICAgIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBYU0NvbXBvbmVudCBzZWxlY3RTaW5nbGUoU3RyaW5nIHNjZCwgTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1NpbXBsZVR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNTaW1wbGVUeXBlLmphdmEKaW5kZXggNDBiMzdmOS4uODFiMTQ5NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1NpbXBsZVR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTU2ltcGxlVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS52aXNpdG9yLlhTU2ltcGxlVHlwZUZ1bmN0aW9uOwpAQCAtNjAsNiArNTksMzcgQEAKICAgICBYU1ZhcmlldHkgZ2V0VmFyaWV0eSgpOwogCiAgICAgLyoqCisgICAgICogR2V0cyB0aGUgYW5jZXN0b3IgcHJpbWl0aXZlIHtAbGluayBYU1NpbXBsZVR5cGV9IGlmCisgICAgICogdGhpcyB0eXBlIGlzIHtAbGluayBYU1ZhcmlldHkjQVRPTUlDIGF0b21pY30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBudWxsIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBYU1NpbXBsZVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBwcmltaXRpdmUgYnVpbHQtaW4gc2ltcGxlIHR5cGUKKyAgICAgKiAodGhhdCBkaXJlY3RseSBkZXJpdmVzIGZyb20geHM6YW55U2ltcGxlVHlwZSwgYnkgZGVmaW5pdGlvbi4pCisgICAgICovCisgICAgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmVhcmVzdCBhbmNlc3RvciB7QGxpbmsgWFNMaXN0U2ltcGxlVHlwZX0gKGluY2x1ZGluZyBpdHNlbGYpCisgICAgICogaWYgdGhlIHZhcmlldHkgb2YgdGhpcyB0eXBlIGlzIHtAbGluayBYU1ZhcmlldHkjTElTVCBsaXN0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gb3RoZXJ3aXNlIHJldHVybiBudWxsCisgICAgICovCisgICAgWFNMaXN0U2ltcGxlVHlwZSBnZXRCYXNlTGlzdFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5lYXJlc3QgYW5jZXN0b3Ige0BsaW5rIFhTVW5pb25TaW1wbGVUeXBlfSAoaW5jbHVkaW5nIGl0c2VsZikKKyAgICAgKiBpZiB0aGUgdmFyaWV0eSBvZiB0aGlzIHR5cGUgaXMge0BsaW5rIFhTVmFyaWV0eSNVTklPTiB1bmlvbn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG90aGVyd2lzZSByZXR1cm4gbnVsbAorICAgICAqLworICAgIFhTVW5pb25TaW1wbGVUeXBlIGdldEJhc2VVbmlvblR5cGUoKTsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHR5cGUgZGVmaW5pdGlvbiBpcyBtYXJrZWQgYXMgJ2ZpbmFsJwogICAgICAqIHdpdGggcmVzcGVjdCB0byB0aGUgZ2l2ZW4ge0BsaW5rIFhTVmFyaWV0eX0uCiAgICAgICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNUZXJtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTVGVybS5qYXZhCmluZGV4IDBlYTMyNWQuLjQzMjkxOGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNUZXJtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1Rlcm0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvci5YU1Rlcm1GdW5jdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTVHlwZS5qYXZhCmluZGV4IGY3ODJhZTIuLjgwNTJmMTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1R5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTVW5pb25TaW1wbGVUeXBlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTVW5pb25TaW1wbGVUeXBlLmphdmEKaW5kZXggNmQwYzEwZS4uMzkyMDYzZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1VuaW9uU2ltcGxlVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNVbmlvblNpbXBsZVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTVmFyaWV0eS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1ZhcmlldHkuamF2YQppbmRleCA5ZWViNDFjLi5jMzU5MGY1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTVmFyaWV0eS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNWYXJpZXR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1dpbGRjYXJkLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTV2lsZGNhcmQuamF2YQppbmRleCA0OWYzMGJiLi4yMTlkZDYwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTV2lsZGNhcmQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1hTV2lsZGNhcmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWFNYUGF0aC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1hQYXRoLmphdmEKaW5kZXggZDU4YWY0MC4uNzc0ZDVjMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1hQYXRoLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YU1hQYXRoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb207CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YbWxTdHJpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vWG1sU3RyaW5nLmphdmEKaW5kZXggZjExOGY2YS4uY2RlNGM2ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9YbWxTdHJpbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL1htbFN0cmluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tOwogCiBpbXBvcnQgb3JnLnJlbGF4bmcuZGF0YXR5cGUuVmFsaWRhdGlvbkNvbnRleHQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQW5ub3RhdGlvbkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Bbm5vdGF0aW9uSW1wbC5qYXZhCmluZGV4IDJjZGQzOTQuLjQwYTQ5YmMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Bbm5vdGF0aW9uSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Bbm5vdGF0aW9uSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDEyICsyNiwxOSBAQAogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0Fubm90YXRpb247CiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkxvY2F0b3JJbXBsOwogCiBwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkltcGwgaW1wbGVtZW50cyBYU0Fubm90YXRpb24KIHsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBhbm5vdGF0aW9uOworICAgIHByaXZhdGUgT2JqZWN0IGFubm90YXRpb247CiAgICAgcHVibGljIE9iamVjdCBnZXRBbm5vdGF0aW9uKCkgeyByZXR1cm4gYW5ub3RhdGlvbjsgfQogCisgICAgcHVibGljIE9iamVjdCBzZXRBbm5vdGF0aW9uKE9iamVjdCBvKSB7CisgICAgICAgIE9iamVjdCByID0gdGhpcy5hbm5vdGF0aW9uOworICAgICAgICB0aGlzLmFubm90YXRpb24gPSBvOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIExvY2F0b3IgbG9jYXRvcjsKICAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdG9yKCkgeyByZXR1cm4gbG9jYXRvcjsgfQogCkBAIC0zOSw0ICs0NiwxMSBAQAogICAgICAgICB0aGlzLmFubm90YXRpb24gPSBvOwogICAgICAgICB0aGlzLmxvY2F0b3IgPSBfbG9jOwogICAgIH0KKworICAgIHB1YmxpYyBBbm5vdGF0aW9uSW1wbCgpIHsKKyAgICAgICAgbG9jYXRvciA9IE5VTExfTE9DQVRJT047CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhdG9ySW1wbCBOVUxMX0xPQ0FUSU9OID0gbmV3IExvY2F0b3JJbXBsKCk7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQXR0R3JvdXBEZWNsSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0F0dEdyb3VwRGVjbEltcGwuamF2YQppbmRleCA1YmNlZGZmLi4zMGE3OTlmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQXR0R3JvdXBEZWNsSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9BdHRHcm91cERlY2xJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0F0dHJpYnV0ZURlY2xJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQXR0cmlidXRlRGVjbEltcGwuamF2YQppbmRleCAxYjc4NmIzLi4wMGVjMmJiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQXR0cmlidXRlRGVjbEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQXR0cmlidXRlRGVjbEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dHJpYnV0ZURlY2w7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQXR0cmlidXRlVXNlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0F0dHJpYnV0ZVVzZUltcGwuamF2YQppbmRleCBhNWFhZDU2Li5mMDlmOTcxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQXR0cmlidXRlVXNlSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9BdHRyaWJ1dGVVc2VJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0F0dHJpYnV0ZXNIb2xkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9BdHRyaWJ1dGVzSG9sZGVyLmphdmEKaW5kZXggNjExNmM3Ni4uOWQyMTA3ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0F0dHJpYnV0ZXNIb2xkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQXR0cmlidXRlc0hvbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEyICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBdHRHcm91cERlY2w7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dHJpYnV0ZVVzZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLlNjaGVtYURvY3VtZW50SW1wbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuc2NkLkl0ZXJhdG9yczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuUmVmLkF0dEdyb3VwOwogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKIGltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CkBAIC0zOSwxMSArNDAsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdHRyaWJ1dGVzSG9sZGVyIGV4dGVuZHMgRGVjbGFyYXRpb25JbXBsIHsKIAogICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVzSG9sZGVyKCBTY2hlbWFEb2N1bWVudEltcGwgX3BhcmVudCwgQW5ub3RhdGlvbkltcGwgX2Fubm9uLAotICAgICAgICBMb2NhdG9yIGxvYywgRm9yZWlnbkF0dHJpYnV0ZXNJbXBsIF9mYSwgU3RyaW5nIF9uYW1lLCBib29sZWFuIF9hbm9ueW1vdXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0b3IgbG9jLCBGb3JlaWduQXR0cmlidXRlc0ltcGwgX2ZhLCBTdHJpbmcgX25hbWUsIGJvb2xlYW4gX2Fub255bW91cyApIHsKIAogICAgICAgICBzdXBlcihfcGFyZW50LF9hbm5vbixsb2MsX2ZhLF9wYXJlbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksX25hbWUsX2Fub255bW91cyk7CiAgICAgfQpAQCAtNTMsMTAgKzU1LDEwIEBACiAKICAgICAvKioKICAgICAgKiBMb2NhbCBhdHRyaWJ1dGUgdXNlLgotICAgICAqIEl0IGhhcyB0byBiZSB7QGxpbmsgVHJlZU1hcH0gb3Igb3RoZXJ3aXNlIHdlIGNhbm5vdCBndWFyYW50ZWUKLSAgICAgKiB0aGUgb3JkZXIgb2YgaXRlcmF0aW9uLgorICAgICAqIFVzZSBsaW5rZWQgaGFzaCBtYXAgdG8gZ3VhcmFudGVlIHRoZSBpdGVyYXRpb24gb3JkZXIsIGFuZCBtYWtlIGl0IGNsb3NlIHRvCisgICAgICogd2hhdCB3YXMgaW4gdGhlIHNjaGVtYSBkb2N1bWVudC4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPFVOYW1lLEF0dHJpYnV0ZVVzZUltcGw+IGF0dHJpYnV0ZXMgPSBuZXcgVHJlZU1hcDxVTmFtZSxBdHRyaWJ1dGVVc2VJbXBsPihVTmFtZS5jb21wYXJhdG9yKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPFVOYW1lLEF0dHJpYnV0ZVVzZUltcGw+IGF0dHJpYnV0ZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxVTmFtZSxBdHRyaWJ1dGVVc2VJbXBsPigpOwogICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZVVzZSggVU5hbWUgbmFtZSwgQXR0cmlidXRlVXNlSW1wbCBhICkgewogICAgICAgICBhdHRyaWJ1dGVzLnB1dCggbmFtZSwgYSApOwogICAgIH0KQEAgLTEwMCwxMyArMTAyLDEwIEBACiAgICAgLy8gSXRlcmF0ZXMgYWxsIEF0dEdyb3VwcyB3aGljaCBhcmUgZGlyZWN0bHkgcmVmZXJlbmNlZCBmcm9tIHRoaXMgY29tcG9uZW50CiAgICAgLy8gdGhpcyBkb2VzIG5vdCBpdGVyYXRlIGF0dCBncm91cHMgcmVmZXJlbmNlZCBmcm9tIHRoZSBiYXNlIHR5cGUKICAgICBwdWJsaWMgSXRlcmF0b3I8WFNBdHRHcm91cERlY2w+IGl0ZXJhdGVBdHRHcm91cHMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8WFNBdHRHcm91cERlY2w+KCkgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxSZWYuQXR0R3JvdXA+IGl0ciA9IGF0dEdyb3Vwcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsgcmV0dXJuIGl0ci5oYXNOZXh0KCk7IH0KLSAgICAgICAgICAgIHB1YmxpYyBYU0F0dEdyb3VwRGVjbCBuZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdHIubmV4dCgpLmdldCgpOworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5BZGFwdGVyPFhTQXR0R3JvdXBEZWNsLFJlZi5BdHRHcm91cD4oYXR0R3JvdXBzLml0ZXJhdG9yKCkpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBYU0F0dEdyb3VwRGVjbCBmaWx0ZXIoQXR0R3JvdXAgdSkgeworICAgICAgICAgICAgICAgIHJldHVybiB1LmdldCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeyBpdHIucmVtb3ZlKCk7IH0KICAgICAgICAgfTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Db21wbGV4VHlwZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Db21wbGV4VHlwZUltcGwuamF2YQppbmRleCA4MWU5MGM0Li4zMWMzNzE0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQ29tcGxleFR5cGVJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0NvbXBsZXhUeXBlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM1LDggKzM1LDcgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTV2lsZGNhcmQ7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5EZWxheWVkUmVmOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuU2NoZW1hRG9jdW1lbnRJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC51dGlsLkNvbmNhdEl0ZXJhdG9yOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC51dGlsLkZpbHRlckl0ZXJhdG9yOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5zY2QuSXRlcmF0b3JzOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvci5YU0Z1bmN0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvci5YU1Zpc2l0b3I7CiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKQEAgLTIxNCwxNiArMjEzLDE2IEBACiAgICAgICAgIHJldHVybiBvOwogICAgIH0KIAotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRlQXR0cmlidXRlVXNlcygpIHsKKyAgICBwdWJsaWMgSXRlcmF0b3I8WFNBdHRyaWJ1dGVVc2U+IGl0ZXJhdGVBdHRyaWJ1dGVVc2VzKCkgewogCiAgICAgICAgIFhTQ29tcGxleFR5cGUgYmFzZVR5cGUgPSBnZXRCYXNlVHlwZSgpLmFzQ29tcGxleFR5cGUoKTsKIAogICAgICAgICBpZiggYmFzZVR5cGU9PW51bGwgKSAgICByZXR1cm4gc3VwZXIuaXRlcmF0ZUF0dHJpYnV0ZVVzZXMoKTsKIAotICAgICAgICByZXR1cm4gbmV3IENvbmNhdEl0ZXJhdG9yKAotICAgICAgICAgICAgbmV3IEZpbHRlckl0ZXJhdG9yKGJhc2VUeXBlLml0ZXJhdGVBdHRyaWJ1dGVVc2VzKCkpIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd3MoIE9iamVjdCBvICkgewotICAgICAgICAgICAgICAgICAgICBYU0F0dHJpYnV0ZURlY2wgdSA9ICgoWFNBdHRyaWJ1dGVVc2UpbykuZ2V0RGVjbCgpOworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5VbmlvbjxYU0F0dHJpYnV0ZVVzZT4oCisgICAgICAgICAgICBuZXcgSXRlcmF0b3JzLkZpbHRlcjxYU0F0dHJpYnV0ZVVzZT4oYmFzZVR5cGUuaXRlcmF0ZUF0dHJpYnV0ZVVzZXMoKSkgeworICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoZXMoWFNBdHRyaWJ1dGVVc2UgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgWFNBdHRyaWJ1dGVEZWNsIHUgPSB2YWx1ZS5nZXREZWNsKCk7CiAgICAgICAgICAgICAgICAgICAgIFVOYW1lIG4gPSBuZXcgVU5hbWUodS5nZXRUYXJnZXROYW1lc3BhY2UoKSx1LmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhcHJvaGliaXRlZEF0dHMuY29udGFpbnMobik7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0NvbXBvbmVudEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Db21wb25lbnRJbXBsLmphdmEKaW5kZXggNTQ2Y2I4NS4uMTgwZmRjMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0NvbXBvbmVudEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQ29tcG9uZW50SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0LDEzICsyNCwyMCBAQAogICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAoraW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uU0NEOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBbm5vdGF0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wb25lbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1NjaGVtYVNldDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnV0aWwuQ29tcG9uZW50TmFtZUZ1bmN0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuU2NoZW1hRG9jdW1lbnRJbXBsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyLlNjaGVtYURvY3VtZW50OwogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5Mb2NhdG9ySW1wbDsKIAoraW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTUxLDEzICs1OCwyNyBAQAogICAgICAgICAgICAgcmV0dXJuIG93bmVyRG9jdW1lbnQuZ2V0U2NoZW1hKCk7CiAgICAgfQogCisgICAgcHVibGljIFhTU2NoZW1hU2V0IGdldFJvb3QoKSB7CisgICAgICAgIGlmKG93bmVyRG9jdW1lbnQ9PW51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGdldE93bmVyU2NoZW1hKCkuZ2V0Um9vdCgpOworICAgIH0KKwogICAgIHB1YmxpYyBTY2hlbWFEb2N1bWVudCBnZXRTb3VyY2VEb2N1bWVudCgpIHsKICAgICAgICAgcmV0dXJuIG93bmVyRG9jdW1lbnQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uSW1wbCBhbm5vdGF0aW9uOworICAgIHByaXZhdGUgQW5ub3RhdGlvbkltcGwgYW5ub3RhdGlvbjsKICAgICBwdWJsaWMgZmluYWwgWFNBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7IHJldHVybiBhbm5vdGF0aW9uOyB9CiAKKyAgICBwdWJsaWMgWFNBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk5vdEV4aXN0KSB7CisgICAgICAgIGlmKGNyZWF0ZUlmTm90RXhpc3QgJiYgYW5ub3RhdGlvbj09bnVsbCkgeworICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uOworICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgTG9jYXRvciBsb2NhdG9yOwogICAgIHB1YmxpYyBmaW5hbCBMb2NhdG9yIGdldExvY2F0b3IoKSB7IHJldHVybiBsb2NhdG9yOyB9CiAKQEAgLTY5LDcgKzkwLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIE9iamVjdCBmb3JlaWduQXR0cmlidXRlczsKIAotICAgIHB1YmxpYyBMaXN0IGdldEZvcmVpZ25BdHRyaWJ1dGVzKCkgeworICAgIHB1YmxpYyBMaXN0PEZvcmVpZ25BdHRyaWJ1dGVzSW1wbD4gZ2V0Rm9yZWlnbkF0dHJpYnV0ZXMoKSB7CiAgICAgICAgIE9iamVjdCB0ID0gZm9yZWlnbkF0dHJpYnV0ZXM7CiAKICAgICAgICAgaWYodD09bnVsbCkKQEAgLTgzLDE5ICsxMDQsMzkgQEAKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcmVpZ25BdHRyaWJ1dGUoU3RyaW5nIG5zVXJpLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIGZvciggRm9yZWlnbkF0dHJpYnV0ZXNJbXBsIGZhIDogKExpc3Q8Rm9yZWlnbkF0dHJpYnV0ZXNJbXBsPilnZXRGb3JlaWduQXR0cmlidXRlcygpICkgeworICAgICAgICBmb3IoIEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCBmYSA6IGdldEZvcmVpZ25BdHRyaWJ1dGVzKCkgKSB7CiAgICAgICAgICAgICBTdHJpbmcgdiA9IGZhLmdldFZhbHVlKG5zVXJpLGxvY2FsTmFtZSk7CiAgICAgICAgICAgICBpZih2IT1udWxsKSByZXR1cm4gdjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwcml2YXRlIExpc3QgY29udmVydFRvTGlzdChGb3JlaWduQXR0cmlidXRlc0ltcGwgZmEpIHsKLSAgICAgICAgTGlzdCBsc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0PEZvcmVpZ25BdHRyaWJ1dGVzSW1wbD4gY29udmVydFRvTGlzdChGb3JlaWduQXR0cmlidXRlc0ltcGwgZmEpIHsKKyAgICAgICAgTGlzdDxGb3JlaWduQXR0cmlidXRlc0ltcGw+IGxzdCA9IG5ldyBBcnJheUxpc3Q8Rm9yZWlnbkF0dHJpYnV0ZXNJbXBsPigpOwogICAgICAgICB3aGlsZShmYSE9bnVsbCkgewogICAgICAgICAgICAgbHN0LmFkZChmYSk7CiAgICAgICAgICAgICBmYSA9IGZhLm5leHQ7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobHN0KTsKICAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxYU0NvbXBvbmVudD4gc2VsZWN0KFN0cmluZyBzY2QsIE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gU0NELmNyZWF0ZShzY2QsbnNDb250ZXh0KS5zZWxlY3QodGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgWFNDb21wb25lbnQgc2VsZWN0U2luZ2xlKFN0cmluZyBzY2QsIE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gU0NELmNyZWF0ZShzY2QsbnNDb250ZXh0KS5zZWxlY3RTaW5nbGUodGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gYXBwbHkobmV3IENvbXBvbmVudE5hbWVGdW5jdGlvbigpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQ29uc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Db25zdC5qYXZhCmluZGV4IDQ5Y2M3YjcuLjFhNDljOTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Db25zdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Db25zdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGw7CiAKIHB1YmxpYyBjbGFzcyBDb25zdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0NvbnRlbnRUeXBlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0NvbnRlbnRUeXBlSW1wbC5qYXZhCmluZGV4IDU2MjVlYmIuLjM5OGJjNGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Db250ZW50VHlwZUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvQ29udGVudFR5cGVJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb250ZW50VHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9EZWNsYXJhdGlvbkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9EZWNsYXJhdGlvbkltcGwuamF2YQppbmRleCA3YjZlZTQ2Li5hZmVmYmFlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvRGVjbGFyYXRpb25JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0RlY2xhcmF0aW9uSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGw7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRGVjbGFyYXRpb247CkBAIC01NCw5ICs1Myw0IEBACiAKICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0dsb2JhbCgpIHsgcmV0dXJuICFpc0Fub255bW91cygpOyB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNMb2NhbCgpIHsgcmV0dXJuIGlzQW5vbnltb3VzKCk7IH0KLQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIE5hbWVHZXR0ZXIuZ2V0KHRoaXMpKyIgIitnZXROYW1lKCk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0VsZW1lbnREZWNsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvRWxlbWVudERlY2wuamF2YQppbmRleCA2MjEzNzI2Li4wYWY4MWM5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvRWxlbWVudERlY2wuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvRWxlbWVudERlY2wuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0VsZW1lbnREZWNsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0VtcHR5SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0VtcHR5SW1wbC5qYXZhCmluZGV4IDAxODAzOTAuLjFlOThmM2IgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9FbXB0eUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvRW1wdHlJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb250ZW50VHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9GYWNldEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9GYWNldEltcGwuamF2YQppbmRleCA0MDk5N2JhLi5iNDE2YjBkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvRmFjZXRJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0ZhY2V0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGw7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRmFjZXQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvRm9yZWlnbkF0dHJpYnV0ZXNJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvRm9yZWlnbkF0dHJpYnV0ZXNJbXBsLmphdmEKaW5kZXggYTZmMzQ2ZC4uNGZmMmZjZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0ZvcmVpZ25BdHRyaWJ1dGVzSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Gb3JlaWduQXR0cmlidXRlc0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5Gb3JlaWduQXR0cmlidXRlczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9JZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvSWRlbnRpdHlDb25zdHJhaW50SW1wbC5qYXZhCmluZGV4IDNlMjdkMzAuLjc5MDFmNDViIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvSWRlbnRpdHlDb25zdHJhaW50SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9JZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNFbGVtZW50RGVjbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9MaXN0U2ltcGxlVHlwZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9MaXN0U2ltcGxlVHlwZUltcGwuamF2YQppbmRleCAyMmEwMzk5Li4wMWJiNjUzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvTGlzdFNpbXBsZVR5cGVJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL0xpc3RTaW1wbGVUeXBlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGw7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRmFjZXQ7CkBAIC02NCw2ICs2MywxMCBAQAogCiAgICAgcHVibGljIFhTVmFyaWV0eSBnZXRWYXJpZXR5KCkgeyByZXR1cm4gWFNWYXJpZXR5LkxJU1Q7IH0KIAorICAgIHB1YmxpYyBYU1NpbXBsZVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpIHsgcmV0dXJuIG51bGw7IH0KKworICAgIHB1YmxpYyBYU0xpc3RTaW1wbGVUeXBlIGdldEJhc2VMaXN0VHlwZSgpIHtyZXR1cm4gdGhpczt9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3QoKSB7IHJldHVybiB0cnVlOyB9CiAgICAgcHVibGljIFhTTGlzdFNpbXBsZVR5cGUgYXNMaXN0KCkgeyByZXR1cm4gdGhpczsgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL01vZGVsR3JvdXBEZWNsSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL01vZGVsR3JvdXBEZWNsSW1wbC5qYXZhCmluZGV4IDAyZWNlODkuLmFhYTlkOGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Nb2RlbEdyb3VwRGVjbEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvTW9kZWxHcm91cERlY2xJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNFbGVtZW50RGVjbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Nb2RlbEdyb3VwSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL01vZGVsR3JvdXBJbXBsLmphdmEKaW5kZXggMWU4YmI3NS4uNDAyNzRhYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL01vZGVsR3JvdXBJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL01vZGVsR3JvdXBJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNFbGVtZW50RGVjbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Ob3RhdGlvbkltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9Ob3RhdGlvbkltcGwuamF2YQppbmRleCBkNmQ4ZDc1Li4wNzk0NGFmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvTm90YXRpb25JbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL05vdGF0aW9uSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGw7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTTm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvUGFydGljbGVJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvUGFydGljbGVJbXBsLmphdmEKaW5kZXggN2JlYmMyMC4uOTIyZTJiZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1BhcnRpY2xlSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9QYXJ0aWNsZUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbnRlbnRUeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1JlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1JlZi5qYXZhCmluZGV4IDZmOTYzYWUuLjNmMzQ3YjQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9SZWYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1Jlc3RyaWN0aW9uU2ltcGxlVHlwZUltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9SZXN0cmljdGlvblNpbXBsZVR5cGVJbXBsLmphdmEKaW5kZXggM2JjNTM4YS4uZGEyOGRiMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1Jlc3RyaWN0aW9uU2ltcGxlVHlwZUltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvUmVzdHJpY3Rpb25TaW1wbGVUeXBlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDEyICsyMiwxMiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNGYWNldDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTUmVzdHJpY3Rpb25TaW1wbGVUeXBlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNWYXJpZXR5OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNTaW1wbGVUeXBlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuU2NoZW1hRG9jdW1lbnRJbXBsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvci5YU1NpbXBsZVR5cGVGdW5jdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3IuWFNTaW1wbGVUeXBlVmlzaXRvcjsKQEAgLTkwLDYgKzkwLDE1IEBACiAKICAgICBwdWJsaWMgWFNWYXJpZXR5IGdldFZhcmlldHkoKSB7IHJldHVybiBnZXRTaW1wbGVCYXNlVHlwZSgpLmdldFZhcmlldHkoKTsgfQogCisgICAgcHVibGljIFhTU2ltcGxlVHlwZSBnZXRQcmltaXRpdmVUeXBlKCkgeworICAgICAgICBpZihpc1ByaW1pdGl2ZSgpKSAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgcmV0dXJuIGdldFNpbXBsZUJhc2VUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgeworICAgICAgICByZXR1cm4gZ2V0U2ltcGxlQmFzZVR5cGUoKT09Z2V0T3duZXJTY2hlbWEoKS5nZXRSb290KCkuYW55U2ltcGxlVHlwZTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB2aXNpdCggWFNTaW1wbGVUeXBlVmlzaXRvciB2aXNpdG9yICkgewogICAgICAgICB2aXNpdG9yLnJlc3RyaWN0aW9uU2ltcGxlVHlwZSh0aGlzKTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvU2NoZW1hSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1NjaGVtYUltcGwuamF2YQppbmRleCBmMWY2MGQ5Li5iY2I3OGM2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvU2NoZW1hSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9TY2hlbWFJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTQgKzIyLDE1IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5Gb3JlaWduQXR0cmlidXRlczsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlNDRDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQW5ub3RhdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0R3JvdXBEZWNsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBdHRyaWJ1dGVEZWNsOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNFbGVtZW50RGVjbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTSWRlbnRpdHlDb25zdHJhaW50OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNNb2RlbEdyb3VwRGVjbDsKQEAgLTQyLDcgKzQzLDEwIEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS52aXNpdG9yLlhTVmlzaXRvcjsKIGltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwogCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC02NCwxMSArNjgsMTIgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGZpbmFsIFNjaGVtYVNldEltcGwgcGFyZW50OwotICAgIHB1YmxpYyBTY2hlbWFTZXRJbXBsIGdldFBhcmVudCgpIHsKKyAgICBwdWJsaWMgU2NoZW1hU2V0SW1wbCBnZXRSb290KCkgewogICAgICAgICByZXR1cm4gcGFyZW50OwogICAgIH0KIAorICAgIHByb3RlY3RlZCBmaW5hbCBTY2hlbWFTZXRJbXBsIHBhcmVudDsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKICAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKICAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKQEAgLTg2LDYgKzkxLDEyIEBACiAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwogICAgIH0KIAorICAgIHB1YmxpYyBYU0Fubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTm90RXhpc3QpIHsKKyAgICAgICAgaWYoY3JlYXRlSWZOb3RFeGlzdCAmJiBhbm5vdGF0aW9uPT1udWxsKQorICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbCgpOworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKKyAgICB9CisKICAgICAvLyBpdCdzIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgdGhlIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIHNjaGVtYQogICAgIC8vIGNvbXBvbmVudCBhcyBvbmUgc2NoZW1hIGNhbiBiZSBkZWZpbmVkIGFjcm9zcyBtdWx0aXBsZSBmaWxlcy4KICAgICAvLyBzbyB0aGlzIGxvY2F0b3IgbWlnaHQgbm90IGNvcnJlY3RseSByZWZsZWN0IGFsbCB0aGUgbG9jYXRpb25zCkBAIC0xMzAsOCArMTQxLDkgQEAKIAogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxYU0F0dEdyb3VwRGVjbD4gYXR0R3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFhTQXR0R3JvdXBEZWNsPigpOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxYU0F0dEdyb3VwRGVjbD4gYXR0R3JvdXBzVmlldyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChhdHRHcm91cHMpOwotICAgIHB1YmxpYyB2b2lkIGFkZEF0dEdyb3VwRGVjbChYU0F0dEdyb3VwRGVjbCBuZXdEZWNsKSB7Ci0gICAgICAgIGF0dEdyb3Vwcy5wdXQobmV3RGVjbC5nZXROYW1lKCksIG5ld0RlY2wpOworICAgIHB1YmxpYyB2b2lkIGFkZEF0dEdyb3VwRGVjbChYU0F0dEdyb3VwRGVjbCBuZXdEZWNsLCBib29sZWFuIG92ZXJ3cml0ZSkgeworICAgICAgICBpZihvdmVyd3JpdGUgfHwgIWF0dEdyb3Vwcy5jb250YWluc0tleShuZXdEZWNsLmdldE5hbWUoKSkpCisgICAgICAgICAgICBhdHRHcm91cHMucHV0KG5ld0RlY2wuZ2V0TmFtZSgpLCBuZXdEZWNsKTsKICAgICB9CiAgICAgcHVibGljIE1hcDxTdHJpbmcsWFNBdHRHcm91cERlY2w+IGdldEF0dEdyb3VwRGVjbHMoKSB7CiAgICAgICAgIHJldHVybiBhdHRHcm91cHNWaWV3OwpAQCAtMTYxLDggKzE3Myw5IEBACiAKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsWFNNb2RlbEdyb3VwRGVjbD4gbW9kZWxHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsWFNNb2RlbEdyb3VwRGVjbD4oKTsKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsWFNNb2RlbEdyb3VwRGVjbD4gbW9kZWxHcm91cHNWaWV3ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG1vZGVsR3JvdXBzKTsKLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RlbEdyb3VwRGVjbChYU01vZGVsR3JvdXBEZWNsIG5ld0RlY2wpIHsKLSAgICAgICAgbW9kZWxHcm91cHMucHV0KG5ld0RlY2wuZ2V0TmFtZSgpLCBuZXdEZWNsKTsKKyAgICBwdWJsaWMgdm9pZCBhZGRNb2RlbEdyb3VwRGVjbChYU01vZGVsR3JvdXBEZWNsIG5ld0RlY2wsIGJvb2xlYW4gb3ZlcndyaXRlKSB7CisgICAgICAgIGlmKG92ZXJ3cml0ZSB8fCAhbW9kZWxHcm91cHMuY29udGFpbnNLZXkobmV3RGVjbC5nZXROYW1lKCkpKQorICAgICAgICAgICAgbW9kZWxHcm91cHMucHV0KG5ld0RlY2wuZ2V0TmFtZSgpLCBuZXdEZWNsKTsKICAgICB9CiAgICAgcHVibGljIE1hcDxTdHJpbmcsWFNNb2RlbEdyb3VwRGVjbD4gZ2V0TW9kZWxHcm91cERlY2xzKCkgewogICAgICAgICByZXR1cm4gbW9kZWxHcm91cHNWaWV3OwpAQCAtMTk1LDkgKzIwOCwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFhTU2ltcGxlVHlwZT4gc2ltcGxlVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsWFNTaW1wbGVUeXBlPigpOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxYU1NpbXBsZVR5cGU+IHNpbXBsZVR5cGVzVmlldyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChzaW1wbGVUeXBlcyk7Ci0gICAgcHVibGljIHZvaWQgYWRkU2ltcGxlVHlwZShYU1NpbXBsZVR5cGUgbmV3RGVjbCkgewotICAgICAgICBzaW1wbGVUeXBlcy5wdXQobmV3RGVjbC5nZXROYW1lKCksIG5ld0RlY2wpOwotICAgICAgICBhbGxUeXBlcy5wdXQobmV3RGVjbC5nZXROYW1lKCksIG5ld0RlY2wpOworICAgIHB1YmxpYyB2b2lkIGFkZFNpbXBsZVR5cGUoWFNTaW1wbGVUeXBlIG5ld0RlY2wsIGJvb2xlYW4gb3ZlcndyaXRlKSB7CisgICAgICAgIGlmKG92ZXJ3cml0ZSB8fCAhc2ltcGxlVHlwZXMuY29udGFpbnNLZXkobmV3RGVjbC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBzaW1wbGVUeXBlcy5wdXQobmV3RGVjbC5nZXROYW1lKCksIG5ld0RlY2wpOworICAgICAgICAgICAgYWxsVHlwZXMucHV0KG5ld0RlY2wuZ2V0TmFtZSgpLCBuZXdEZWNsKTsKKyAgICAgICAgfQogICAgIH0KICAgICBwdWJsaWMgTWFwPFN0cmluZyxYU1NpbXBsZVR5cGU+IGdldFNpbXBsZVR5cGVzKCkgewogICAgICAgICByZXR1cm4gc2ltcGxlVHlwZXNWaWV3OwpAQCAtMjExLDkgKzIyNiwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFhTQ29tcGxleFR5cGU+IGNvbXBsZXhUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxYU0NvbXBsZXhUeXBlPigpOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxYU0NvbXBsZXhUeXBlPiBjb21wbGV4VHlwZXNWaWV3ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGNvbXBsZXhUeXBlcyk7Ci0gICAgcHVibGljIHZvaWQgYWRkQ29tcGxleFR5cGUoWFNDb21wbGV4VHlwZSBuZXdEZWNsKSB7Ci0gICAgICAgIGNvbXBsZXhUeXBlcy5wdXQobmV3RGVjbC5nZXROYW1lKCksIG5ld0RlY2wpOwotICAgICAgICBhbGxUeXBlcy5wdXQobmV3RGVjbC5nZXROYW1lKCksIG5ld0RlY2wpOworICAgIHB1YmxpYyB2b2lkIGFkZENvbXBsZXhUeXBlKFhTQ29tcGxleFR5cGUgbmV3RGVjbCwgYm9vbGVhbiBvdmVyd3JpdGUpIHsKKyAgICAgICAgaWYob3ZlcndyaXRlIHx8ICFjb21wbGV4VHlwZXMuY29udGFpbnNLZXkobmV3RGVjbC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBjb21wbGV4VHlwZXMucHV0KG5ld0RlY2wuZ2V0TmFtZSgpLCBuZXdEZWNsKTsKKyAgICAgICAgICAgIGFsbFR5cGVzLnB1dChuZXdEZWNsLmdldE5hbWUoKSwgbmV3RGVjbCk7CisgICAgICAgIH0KICAgICB9CiAgICAgcHVibGljIE1hcDxTdHJpbmcsWFNDb21wbGV4VHlwZT4gZ2V0Q29tcGxleFR5cGVzKCkgewogICAgICAgICByZXR1cm4gY29tcGxleFR5cGVzVmlldzsKQEAgLTI3Miw0ICsyODksMjAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxYU0NvbXBvbmVudD4gc2VsZWN0KFN0cmluZyBzY2QsIE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gU0NELmNyZWF0ZShzY2QsbnNDb250ZXh0KS5zZWxlY3QodGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgWFNDb21wb25lbnQgc2VsZWN0U2luZ2xlKFN0cmluZyBzY2QsIE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gU0NELmNyZWF0ZShzY2QsbnNDb250ZXh0KS5zZWxlY3RTaW5nbGUodGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvU2NoZW1hU2V0SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1NjaGVtYVNldEltcGwuamF2YQppbmRleCA0MjEyYmM2Li41MTg0MzljIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvU2NoZW1hU2V0SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9TY2hlbWFTZXRJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTMgKzIyLDE0IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsOwogCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5TQ0Q7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dEdyb3VwRGVjbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlRGVjbDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlVXNlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb250ZW50VHlwZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRWxlbWVudERlY2w7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0ZhY2V0OwpAQCAtMzYsNiArMzcsNyBAQAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNMaXN0U2ltcGxlVHlwZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTTW9kZWxHcm91cDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTTW9kZWxHcm91cERlY2w7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU05vdGF0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNQYXJ0aWNsZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTUmVzdHJpY3Rpb25TaW1wbGVUeXBlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNTY2hlbWE7CkBAIC00NSw2ICs0Nyw3IEBACiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1VuaW9uU2ltcGxlVHlwZTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTVmFyaWV0eTsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTV2lsZGNhcmQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnNjZC5JdGVyYXRvcnM7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS52aXNpdG9yLlhTQ29udGVudFR5cGVGdW5jdGlvbjsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3IuWFNDb250ZW50VHlwZVZpc2l0b3I7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS52aXNpdG9yLlhTRnVuY3Rpb247CkBAIC01MywxMyArNTYsMTQgQEAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3IuWFNWaXNpdG9yOwogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CiAKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBwdWJsaWMgY2xhc3MgU2NoZW1hU2V0SW1wbCBpbXBsZW1lbnRzIFhTU2NoZW1hU2V0CkBAIC0xNTUsMTA5ICsxNTksODkgQEAKICAgICAgICAgcmV0dXJuIHNjaGVtYS5nZXRJZGVudGl0eUNvbnN0cmFpbnQobG9jYWxOYW1lKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIE11bHRpU2NoZW1hSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7Ci0gICAgICAgIHByaXZhdGUgSXRlcmF0b3I8WFNTY2hlbWE+IHNpdHIgPSBpdGVyYXRlU2NoZW1hKCk7Ci0gICAgICAgIHByaXZhdGUgSXRlcmF0b3I8VD4gY2l0ciA9IG51bGw7Ci0gICAgICAgIC8qKiBUaGUgb2JqZWN0IHRvIGJlIHJldHVybmVkIGZyb20gdGhlIG5leHQgbWV0aG9kLiAqLwotICAgICAgICBwcml2YXRlIFQgbmV4dDsKLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICBnZXROZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dCE9bnVsbDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgVCBuZXh0KCkgewotICAgICAgICAgICAgZ2V0TmV4dCgpOwotICAgICAgICAgICAgVCByID0gbmV4dDsKLSAgICAgICAgICAgIG5leHQgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGdldE5leHQoKSB7Ci0gICAgICAgICAgICBpZihuZXh0IT1udWxsKSAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZihjaXRyIT1udWxsICYmIGNpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IGNpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNpdHIgaXMgZW1wdHkKLSAgICAgICAgICAgIGlmKHNpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgY2l0ciA9IG5leHRJdGVyYXRvcihzaXRyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgZ2V0TmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZWxzZQotICAgICAgICAgICAgLy8gICAgICBubyBtb3JlIG9iamVjdAotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPFQ+IG5leHRJdGVyYXRvciggWFNTY2hlbWEgcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRlRWxlbWVudERlY2xzKCkgewotICAgICAgICByZXR1cm4gbmV3IE11bHRpU2NoZW1hSXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgbmV4dEl0ZXJhdG9yKCBYU1NjaGVtYSB4cyApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4geHMuaXRlcmF0ZUVsZW1lbnREZWNscygpOworICAgIHB1YmxpYyBJdGVyYXRvcjxYU0VsZW1lbnREZWNsPiBpdGVyYXRlRWxlbWVudERlY2xzKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5NYXA8WFNFbGVtZW50RGVjbCxYU1NjaGVtYT4oaXRlcmF0ZVNjaGVtYSgpKSB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8WFNFbGVtZW50RGVjbD4gYXBwbHkoWFNTY2hlbWEgdSkgeworICAgICAgICAgICAgICAgIHJldHVybiB1Lml0ZXJhdGVFbGVtZW50RGVjbHMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9CiAKLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0ZVR5cGVzKCkgewotICAgICAgICByZXR1cm4gbmV3IE11bHRpU2NoZW1hSXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgbmV4dEl0ZXJhdG9yKCBYU1NjaGVtYSB4cyApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4geHMuaXRlcmF0ZVR5cGVzKCk7CisgICAgcHVibGljIEl0ZXJhdG9yPFhTVHlwZT4gaXRlcmF0ZVR5cGVzKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5NYXA8WFNUeXBlLFhTU2NoZW1hPihpdGVyYXRlU2NoZW1hKCkpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjxYU1R5cGU+IGFwcGx5KFhTU2NoZW1hIHUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdS5pdGVyYXRlVHlwZXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9CiAKLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0ZUF0dHJpYnV0ZURlY2xzKCkgewotICAgICAgICByZXR1cm4gbmV3IE11bHRpU2NoZW1hSXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgbmV4dEl0ZXJhdG9yKCBYU1NjaGVtYSB4cyApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4geHMuaXRlcmF0ZUF0dHJpYnV0ZURlY2xzKCk7CisgICAgcHVibGljIEl0ZXJhdG9yPFhTQXR0cmlidXRlRGVjbD4gaXRlcmF0ZUF0dHJpYnV0ZURlY2xzKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5NYXA8WFNBdHRyaWJ1dGVEZWNsLFhTU2NoZW1hPihpdGVyYXRlU2NoZW1hKCkpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjxYU0F0dHJpYnV0ZURlY2w+IGFwcGx5KFhTU2NoZW1hIHUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdS5pdGVyYXRlQXR0cmlidXRlRGVjbHMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9Ci0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdGVBdHRHcm91cERlY2xzKCkgewotICAgICAgICByZXR1cm4gbmV3IE11bHRpU2NoZW1hSXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgbmV4dEl0ZXJhdG9yKCBYU1NjaGVtYSB4cyApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4geHMuaXRlcmF0ZUF0dEdyb3VwRGVjbHMoKTsKKyAgICBwdWJsaWMgSXRlcmF0b3I8WFNBdHRHcm91cERlY2w+IGl0ZXJhdGVBdHRHcm91cERlY2xzKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5NYXA8WFNBdHRHcm91cERlY2wsWFNTY2hlbWE+KGl0ZXJhdGVTY2hlbWEoKSkgeworICAgICAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yPFhTQXR0R3JvdXBEZWNsPiBhcHBseShYU1NjaGVtYSB1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHUuaXRlcmF0ZUF0dEdyb3VwRGVjbHMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9Ci0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdGVNb2RlbEdyb3VwRGVjbHMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlTY2hlbWFJdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvciBuZXh0SXRlcmF0b3IoIFhTU2NoZW1hIHhzICkgewotICAgICAgICAgICAgICAgIHJldHVybiB4cy5pdGVyYXRlTW9kZWxHcm91cERlY2xzKCk7CisgICAgcHVibGljIEl0ZXJhdG9yPFhTTW9kZWxHcm91cERlY2w+IGl0ZXJhdGVNb2RlbEdyb3VwRGVjbHMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3JzLk1hcDxYU01vZGVsR3JvdXBEZWNsLFhTU2NoZW1hPihpdGVyYXRlU2NoZW1hKCkpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjxYU01vZGVsR3JvdXBEZWNsPiBhcHBseShYU1NjaGVtYSB1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHUuaXRlcmF0ZU1vZGVsR3JvdXBEZWNscygpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgIH0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0ZVNpbXBsZVR5cGVzKCkgewotICAgICAgICByZXR1cm4gbmV3IE11bHRpU2NoZW1hSXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgbmV4dEl0ZXJhdG9yKCBYU1NjaGVtYSB4cyApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4geHMuaXRlcmF0ZVNpbXBsZVR5cGVzKCk7CisgICAgcHVibGljIEl0ZXJhdG9yPFhTU2ltcGxlVHlwZT4gaXRlcmF0ZVNpbXBsZVR5cGVzKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5NYXA8WFNTaW1wbGVUeXBlLFhTU2NoZW1hPihpdGVyYXRlU2NoZW1hKCkpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjxYU1NpbXBsZVR5cGU+IGFwcGx5KFhTU2NoZW1hIHUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdS5pdGVyYXRlU2ltcGxlVHlwZXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9Ci0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdGVDb21wbGV4VHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlTY2hlbWFJdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvciBuZXh0SXRlcmF0b3IoIFhTU2NoZW1hIHhzICkgewotICAgICAgICAgICAgICAgIHJldHVybiB4cy5pdGVyYXRlQ29tcGxleFR5cGVzKCk7CisgICAgcHVibGljIEl0ZXJhdG9yPFhTQ29tcGxleFR5cGU+IGl0ZXJhdGVDb21wbGV4VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3JzLk1hcDxYU0NvbXBsZXhUeXBlLFhTU2NoZW1hPihpdGVyYXRlU2NoZW1hKCkpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjxYU0NvbXBsZXhUeXBlPiBhcHBseShYU1NjaGVtYSB1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHUuaXRlcmF0ZUNvbXBsZXhUeXBlcygpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgIH0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0ZU5vdGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVNjaGVtYUl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yIG5leHRJdGVyYXRvciggWFNTY2hlbWEgeHMgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhzLml0ZXJhdGVOb3RhdGlvbnMoKTsKKyAgICBwdWJsaWMgSXRlcmF0b3I8WFNOb3RhdGlvbj4gaXRlcmF0ZU5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcnMuTWFwPFhTTm90YXRpb24sWFNTY2hlbWE+KGl0ZXJhdGVTY2hlbWEoKSkgeworICAgICAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yPFhTTm90YXRpb24+IGFwcGx5KFhTU2NoZW1hIHUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdS5pdGVyYXRlTm90YXRpb25zKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQogCiAgICAgcHVibGljIEl0ZXJhdG9yPFhTSWRlbnRpdHlDb25zdHJhaW50PiBpdGVyYXRlSWRlbnRpdHlDb25zdHJhaW50cygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVNjaGVtYUl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yIG5leHRJdGVyYXRvciggWFNTY2hlbWEgeHMgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhzLmdldElkZW50aXR5Q29uc3RyYWludHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5NYXA8WFNJZGVudGl0eUNvbnN0cmFpbnQsWFNTY2hlbWE+KGl0ZXJhdGVTY2hlbWEoKSkgeworICAgICAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yPFhTSWRlbnRpdHlDb25zdHJhaW50PiBhcHBseShYU1NjaGVtYSB1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHUuZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQogCisgICAgcHVibGljIENvbGxlY3Rpb248WFNDb21wb25lbnQ+IHNlbGVjdChTdHJpbmcgc2NkLCBOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFNDRC5jcmVhdGUoc2NkLG5zQ29udGV4dCkuc2VsZWN0KHRoaXMpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFhTQ29tcG9uZW50IHNlbGVjdFNpbmdsZShTdHJpbmcgc2NkLCBOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFNDRC5jcmVhdGUoc2NkLG5zQ29udGV4dCkuc2VsZWN0U2luZ2xlKHRoaXMpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCiAKICAgICBwdWJsaWMgZmluYWwgRW1wdHlJbXBsIGVtcHR5ID0gbmV3IEVtcHR5SW1wbCgpOwogICAgIHB1YmxpYyBYU0NvbnRlbnRUeXBlIGdldEVtcHR5KCkgeyByZXR1cm4gZW1wdHk7IH0KQEAgLTI4Nyw3ICsyNzEsNyBAQAogICAgICAgICBwdWJsaWMgWFNUeXBlIGdldEJhc2VUeXBlKCkgeyByZXR1cm4gYW55VHlwZTsgfQogICAgICAgICBwdWJsaWMgWFNTaW1wbGVUeXBlIGdldFNpbXBsZUJhc2VUeXBlKCkgeyByZXR1cm4gbnVsbDsgfQogICAgICAgICBwdWJsaWMgaW50IGdldERlcml2YXRpb25NZXRob2QoKSB7IHJldHVybiBSRVNUUklDVElPTjsgfQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0ZURlY2xhcmVkRmFjZXRzKCkgeyByZXR1cm4gZW1wdHlJdGVyYXRvcjsgfQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNGYWNldD4gaXRlcmF0ZURlY2xhcmVkRmFjZXRzKCkgeyByZXR1cm4gSXRlcmF0b3JzLmVtcHR5KCk7IH0KICAgICAgICAgcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIFhTRmFjZXQ+IGdldERlY2xhcmVkRmFjZXRzKCkgeyByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsgfQogICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdCggWFNTaW1wbGVUeXBlVmlzaXRvciB2aXNpdG9yICkge3Zpc2l0b3IucmVzdHJpY3Rpb25TaW1wbGVUeXBlKHRoaXMpOyB9CiAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KCBYU0NvbnRlbnRUeXBlVmlzaXRvciB2aXNpdG9yICkge3Zpc2l0b3Iuc2ltcGxlVHlwZSh0aGlzKTsgfQpAQCAtMjk2LDYgKzI4MCwxMCBAQAogICAgICAgICBwdWJsaWMgPFQ+IFQgYXBwbHkoIFhTQ29udGVudFR5cGVGdW5jdGlvbjxUPiBmICkgeyByZXR1cm4gZi5zaW1wbGVUeXBlKHRoaXMpOyB9CiAgICAgICAgIHB1YmxpYyA8VD4gVCBhcHBseSggWFNGdW5jdGlvbjxUPiBmICkgeyByZXR1cm4gZi5zaW1wbGVUeXBlKHRoaXMpOyB9CiAgICAgICAgIHB1YmxpYyBYU1ZhcmlldHkgZ2V0VmFyaWV0eSgpIHsgcmV0dXJuIFhTVmFyaWV0eS5BVE9NSUM7IH0KKyAgICAgICAgcHVibGljIFhTU2ltcGxlVHlwZSBnZXRQcmltaXRpdmVUeXBlKCkge3JldHVybiB0aGlzO30KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7cmV0dXJuIHRydWU7fQorICAgICAgICBwdWJsaWMgWFNMaXN0U2ltcGxlVHlwZSBnZXRCYXNlTGlzdFR5cGUoKSB7cmV0dXJuIG51bGw7fQorICAgICAgICBwdWJsaWMgWFNVbmlvblNpbXBsZVR5cGUgZ2V0QmFzZVVuaW9uVHlwZSgpIHtyZXR1cm4gbnVsbDt9CiAgICAgICAgIHB1YmxpYyBYU0ZhY2V0IGdldEZhY2V0KFN0cmluZyBuYW1lKSB7IHJldHVybiBudWxsOyB9CiAgICAgICAgIHB1YmxpYyBYU0ZhY2V0IGdldERlY2xhcmVkRmFjZXQoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KICAgICAgICAgcHVibGljIExpc3Q8WFNGYWNldD4gZ2V0RGVjbGFyZWRGYWNldHMoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7IH0KQEAgLTMxNCw3ICszMDIsNyBAQAogICAgICAgICBwdWJsaWMgWFNUeXBlW10gbGlzdFN1YnN0aXR1dGFibGVzKCkgewogICAgICAgICAgICAgcmV0dXJuIFV0aWwubGlzdFN1YnN0aXR1dGFibGVzKHRoaXMpOwogICAgICAgICB9Ci0gICAgfTsKKyAgICB9CiAKICAgICBwdWJsaWMgWFNDb21wbGV4VHlwZSBnZXRBbnlUeXBlKCkgeyByZXR1cm4gYW55VHlwZTsgfQogICAgIHB1YmxpYyBmaW5hbCBBbnlUeXBlIGFueVR5cGUgPSBuZXcgQW55VHlwZSgpOwpAQCAtMzI4LDEwICszMTYsMTAgQEAKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgIHB1YmxpYyBYU1dpbGRjYXJkIGdldEF0dHJpYnV0ZVdpbGRjYXJkKCkgeyByZXR1cm4gYW55V2lsZGNhcmQ7IH0KICAgICAgICAgcHVibGljIFhTQXR0cmlidXRlVXNlIGdldEF0dHJpYnV0ZVVzZSggU3RyaW5nIG5zVVJJLCBTdHJpbmcgbG9jYWxOYW1lICkgeyByZXR1cm4gbnVsbDsgfQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0ZUF0dHJpYnV0ZVVzZXMoKSB7IHJldHVybiBlbXB0eUl0ZXJhdG9yOyB9CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0F0dHJpYnV0ZVVzZT4gaXRlcmF0ZUF0dHJpYnV0ZVVzZXMoKSB7IHJldHVybiBJdGVyYXRvcnMuZW1wdHkoKTsgfQogICAgICAgICBwdWJsaWMgWFNBdHRyaWJ1dGVVc2UgZ2V0RGVjbGFyZWRBdHRyaWJ1dGVVc2UoIFN0cmluZyBuc1VSSSwgU3RyaW5nIGxvY2FsTmFtZSApIHsgcmV0dXJuIG51bGw7IH0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdGVEZWNsYXJlZEF0dHJpYnV0ZVVzZXMoKSB7IHJldHVybiBlbXB0eUl0ZXJhdG9yOyB9Ci0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRlQXR0R3JvdXBzKCkgeyByZXR1cm4gZW1wdHlJdGVyYXRvcjsgfQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNBdHRyaWJ1dGVVc2U+IGl0ZXJhdGVEZWNsYXJlZEF0dHJpYnV0ZVVzZXMoKSB7IHJldHVybiBJdGVyYXRvcnMuZW1wdHkoKTsgfQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNBdHRHcm91cERlY2w+IGl0ZXJhdGVBdHRHcm91cHMoKSB7IHJldHVybiBJdGVyYXRvcnMuZW1wdHkoKTsgfQogICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxYU0F0dHJpYnV0ZVVzZT4gZ2V0QXR0cmlidXRlVXNlcygpIHsgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7IH0KICAgICAgICAgcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIFhTQXR0cmlidXRlVXNlPiBnZXREZWNsYXJlZEF0dHJpYnV0ZVVzZXMoKSB7IHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOyB9CiAgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYU0F0dEdyb3VwRGVjbD4gZ2V0QXR0R3JvdXBzKCkgeyByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsgfQpAQCAtMzc0LDEyICszNjIsNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgWFNQYXJ0aWNsZS5VTkJPVU5ERUQsIDAgKQogICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgLG51bGwsMSwxKTsKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3IgZW1wdHlJdGVyYXRvciA9IG5ldyBJdGVyYXRvcigpIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsgfQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9Ci0gICAgfTsKLQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9TaW1wbGVUeXBlSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1NpbXBsZVR5cGVJbXBsLmphdmEKaW5kZXggZjI2N2JkYy4uYWEwMWVkZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1NpbXBsZVR5cGVJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1NpbXBsZVR5cGVJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKQEAgLTk0LDYgKzkzLDE1IEBACiAKICAgICBwdWJsaWMgWFNUeXBlIGdldEJhc2VUeXBlKCkgeyByZXR1cm4gYmFzZVR5cGUuZ2V0VHlwZSgpOyB9CiAgICAgcHVibGljIFhTU2ltcGxlVHlwZSBnZXRTaW1wbGVCYXNlVHlwZSgpIHsgcmV0dXJuIGJhc2VUeXBlLmdldFR5cGUoKTsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHB1YmxpYyBYU0xpc3RTaW1wbGVUeXBlIGdldEJhc2VMaXN0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFNpbXBsZUJhc2VUeXBlKCkuZ2V0QmFzZUxpc3RUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIFhTVW5pb25TaW1wbGVUeXBlIGdldEJhc2VVbmlvblR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRTaW1wbGVCYXNlVHlwZSgpLmdldEJhc2VVbmlvblR5cGUoKTsKKyAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIFNldDxYU1ZhcmlldHk+IGZpbmFsU2V0OwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvVU5hbWUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9VTmFtZS5qYXZhCmluZGV4IGY3OTkwNWMuLjMyNmQyYTYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9VTmFtZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9VTmFtZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9VbmlvblNpbXBsZVR5cGVJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvVW5pb25TaW1wbGVUeXBlSW1wbC5qYXZhCmluZGV4IGFmZThiZDYuLmQ2NGEyNDYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9VbmlvblNpbXBsZVR5cGVJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1VuaW9uU2ltcGxlVHlwZUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0ZhY2V0OwpAQCAtNzgsMTEgKzc3LDE3IEBACiAgICAgICAgIHJldHVybiBmdW5jdGlvbi51bmlvblNpbXBsZVR5cGUodGhpcyk7CiAgICAgfQogCisgICAgcHVibGljIFhTVW5pb25TaW1wbGVUeXBlIGdldEJhc2VVbmlvblR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIC8vIHVuaW9uIHR5cGUgYnkgaXRzZWxmIGRvZXNuJ3QgaGF2ZSBhbnkgZmFjZXQuICovCiAgICAgcHVibGljIFhTRmFjZXQgZ2V0RmFjZXQoIFN0cmluZyBuYW1lICkgeyByZXR1cm4gbnVsbDsgfQogCiAgICAgcHVibGljIFhTVmFyaWV0eSBnZXRWYXJpZXR5KCkgeyByZXR1cm4gWFNWYXJpZXR5LkxJU1Q7IH0KIAorICAgIHB1YmxpYyBYU1NpbXBsZVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpIHsgcmV0dXJuIG51bGw7IH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzVW5pb24oKSB7IHJldHVybiB0cnVlOyB9CiAgICAgcHVibGljIFhTVW5pb25TaW1wbGVUeXBlIGFzVW5pb24oKSB7IHJldHVybiB0aGlzOyB9CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvVXRpbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1V0aWwuamF2YQppbmRleCAxNWE2ZjVhLi5kZWUzZThjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvVXRpbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9XaWxkY2FyZEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9XaWxkY2FyZEltcGwuamF2YQppbmRleCBiMDE5ODAzLi44ZTMwYjc4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvV2lsZGNhcmRJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1dpbGRjYXJkSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGw7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRWxlbWVudERlY2w7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvWFBhdGhJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvWFBhdGhJbXBsLmphdmEKaW5kZXggYzFmZGY1MC4uOTgxNDlhYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL1hQYXRoSW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9YUGF0aEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0lkZW50aXR5Q29uc3RyYWludDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFja2FnZS5odG1sCmluZGV4IGJiODc3ZWQuLmM3MzRhMTMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD48Ym9keT4KIEltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5jb20uc3VuLnhtbC54c29tPC9jb2RlPiBwYWNrYWdlLgogPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvQmFzZUNvbnRlbnRSZWYuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvQmFzZUNvbnRlbnRSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGM0YWZjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9CYXNlQ29udGVudFJlZi5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlcjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5SZWY7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNUeXBlOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgQmFzZUNvbnRlbnRSZWYgaW1wbGVtZW50cyBSZWYuQ29udGVudFR5cGUsIFBhdGNoIHsKKyAgICBwcml2YXRlIGZpbmFsIFJlZi5UeXBlIGJhc2VUeXBlOworICAgIHByaXZhdGUgZmluYWwgTG9jYXRvciBsb2M7CisKKyAgICBwdWJsaWMgQmFzZUNvbnRlbnRSZWYoZmluYWwgTkdDQ1J1bnRpbWVFeCAkcnVudGltZSwgUmVmLlR5cGUgX2Jhc2VUeXBlKSB7CisgICAgICAgIHRoaXMuYmFzZVR5cGUgPSBfYmFzZVR5cGU7CisgICAgICAgICRydW50aW1lLmFkZFBhdGNoZXIodGhpcyk7CisgICAgICAgICRydW50aW1lLmFkZEVycm9yQ2hlY2tlcihuZXcgUGF0Y2goKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBYU1R5cGUgdCA9IGJhc2VUeXBlLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAodC5pc0NvbXBsZXhUeXBlKCkgJiYgdC5hc0NvbXBsZXhUeXBlKCkuZ2V0Q29udGVudFR5cGUoKS5hc1BhcnRpY2xlKCkhPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUucmVwb3J0RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX1NJTVBMRV9DT05URU5UX0VYUEVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHQuZ2V0TmFtZSgpKSwgbG9jKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmxvYyA9ICRydW50aW1lLmNvcHlMb2NhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIFhTQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIFhTVHlwZSB0ID0gYmFzZVR5cGUuZ2V0VHlwZSgpOworICAgICAgICBpZih0LmFzQ29tcGxleFR5cGUoKSE9bnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0LmFzQ29tcGxleFR5cGUoKS5nZXRDb250ZW50VHlwZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdC5hc1NpbXBsZVR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGJhc2VUeXBlIGluc3RhbmNlb2YgUGF0Y2gpCisgICAgICAgICAgICAoKFBhdGNoKSBiYXNlVHlwZSkucnVuKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9EZWZhdWx0QW5ub3RhdGlvblBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9EZWZhdWx0QW5ub3RhdGlvblBhcnNlci5qYXZhCmluZGV4IDFiMDAwMjIuLmExYTk5MjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvRGVmYXVsdEFubm90YXRpb25QYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL0RlZmF1bHRBbm5vdGF0aW9uUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9EZWxheWVkUmVmLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL0RlbGF5ZWRSZWYuamF2YQppbmRleCBlYzJmMWRiLi41ZmFlYTI2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL0RlbGF5ZWRSZWYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL0RlbGF5ZWRSZWYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00OCwxMCArNDgsOSBAQAogICogYWZ0ZXIgYWxsIHRoZSBzY2hlbWFzIGFyZSBwYXJzZWQuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWxheWVkUmVmIGltcGxlbWVudHMgUGF0Y2ggewotICAgIERlbGF5ZWRSZWYoIFBhdGNoZXJNYW5hZ2VyIF9tYW5hZ2VyLCBMb2NhdG9yIF9zb3VyY2UsCi0gICAgICAgIFNjaGVtYUltcGwgX3NjaGVtYSwgVU5hbWUgX25hbWUgKSB7CisgICAgRGVsYXllZFJlZiggUGF0Y2hlck1hbmFnZXIgX21hbmFnZXIsIExvY2F0b3IgX3NvdXJjZSwgU2NoZW1hSW1wbCBfc2NoZW1hLCBVTmFtZSBfbmFtZSApIHsKIAotICAgICAgICB0aGlzLnNjaGVtYSA9IF9zY2hlbWEuZ2V0UGFyZW50KCk7CisgICAgICAgIHRoaXMuc2NoZW1hID0gX3NjaGVtYS5nZXRSb290KCk7CiAgICAgICAgIHRoaXMubWFuYWdlciA9IF9tYW5hZ2VyOwogICAgICAgICB0aGlzLm5hbWUgPSBfbmFtZTsKICAgICAgICAgdGhpcy5zb3VyY2UgPSBfc291cmNlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9NZXNzYWdlcy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9NZXNzYWdlcy5qYXZhCmluZGV4IGE3MDM4OWYuLmUwY2I5OTcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvTWVzc2FnZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNzMsNCArNzMsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX0VOVElUWV9SRVNPTFVUSU9OX0ZBSUxVUkUgPQogICAgICAgICAiRW50aXR5UmVzb2x1dGlvbkZhaWx1cmUiOyAvLyBhcmc6MgorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX1NJTVBMRV9DT05URU5UX0VYUEVDVEVEID0KKyAgICAgICAgIlNpbXBsZUNvbnRlbnRFeHBlY3RlZCI7IC8vIGFyZzoyCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggYTI4OGY0Zi4uNjY3M2MyZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogVW5kZWZpbmVkU2ltcGxlVHlwZSA9IFwKIAl1bmRlZmluZWQgc2ltcGxlIHR5cGUgJyd7MH0nJwogCkBAIC00Miw1ICs2Nyw3IEBACiAKIEVudGl0eVJlc29sdXRpb25GYWlsdXJlID0gXAogCWZhaWxlZCB0byByZXRyaWV2ZSAnJ3swfScnOiB7MX0KLQkKKworU2ltcGxlQ29udGVudEV4cGVjdGVkID0gXAorICBBIGNvbXBsZXggdHlwZSB3aXRoIGEgc2ltcGxlIGNvbnRlbnQgb3IgYSBzaW1wbGUgdHlwZSBpcyBleHBlY3RlZCBidXQgZm91bmQgJyd7MH0nJzp7MX0KICAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvTWVzc2FnZXNfamEucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvTWVzc2FnZXNfamEucHJvcGVydGllcwppbmRleCA0NDQzMjc0Li5hYWQ4NWI5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL01lc3NhZ2VzX2phLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9NZXNzYWdlc19qYS5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBVbmRlZmluZWRTaW1wbGVUeXBlID0gXAogCVx1NjcyQVx1NUI5QVx1N0ZBOVx1MzA2RVx1MzBCN1x1MzBGM1x1MzBEN1x1MzBFQlx1MzBCRlx1MzBBNFx1MzBENycnezB9JydcdTMwNENcdTRGN0ZcdTMwOEZcdTMwOENcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTkKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9OR0NDUnVudGltZUV4LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL05HQ0NSdW50aW1lRXguamF2YQppbmRleCAzMzkzODNjLi5jMGVhZjNlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL05HQ0NSdW50aW1lRXguamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL05HQ0NSdW50aW1lRXguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiwxNCArMjIsMTUgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0RlY2xhcmF0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWG1sU3RyaW5nOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNTaW1wbGVUeXBlOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5Gb3JlaWduQXR0cmlidXRlc0ltcGw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLlNjaGVtYUltcGw7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLlVOYW1lOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5Db25zdDsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlLk5HQ0NSdW50aW1lOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGUuU2NoZW1hOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC51dGlsLlVyaTsKQEAgLTEyNywxNyArMTI4LDMyIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2hlY2tEb3VibGVEZWZFcnJvciggWFNEZWNsYXJhdGlvbiBjICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGM9PW51bGwpIHJldHVybjsKKyAgICAgICAgaWYoYz09bnVsbCB8fCBpZ25vcmFibGVEdXBsaWNhdGVDb21wb25lbnQoYykpIHJldHVybjsKKwogICAgICAgICByZXBvcnRFcnJvciggTWVzc2FnZXMuZm9ybWF0KE1lc3NhZ2VzLkVSUl9ET1VCTEVfREVGSU5JVElPTixjLmdldE5hbWUoKSkgKTsKICAgICAgICAgcmVwb3J0RXJyb3IoIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5FUlJfRE9VQkxFX0RFRklOSVRJT05fT1JJR0lOQUwpLCBjLmdldExvY2F0b3IoKSApOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZ25vcmFibGVEdXBsaWNhdGVDb21wb25lbnQoWFNEZWNsYXJhdGlvbiBjKSB7CisgICAgICAgIGlmKGMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKENvbnN0LnNjaGVtYU5hbWVzcGFjZSkpIHsKKyAgICAgICAgICAgIGlmKGMgaW5zdGFuY2VvZiBYU1NpbXBsZVR5cGUpCisgICAgICAgICAgICAgICAgLy8gaGlkZSBhcnRpZmljaWFsICJkb3VibGUgZGVmaW5pdGlvbnMiIG9uIHNpbXBsZSB0eXBlcworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYoYy5pc0dsb2JhbCgpICYmIGMuZ2V0TmFtZSgpLmVxdWFscygiYW55VHlwZSIpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBkaXR0byBmb3IgYW55VHlwZQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKIAogCiAgICAgLyogcmVnaXN0ZXJzIGEgcGF0Y2hlciB0aGF0IHdpbGwgcnVuIGFmdGVyIGFsbCB0aGUgcGFyc2luZyBoYXMgZmluaXNoZWQuICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0Y2hlciggUGF0Y2ggcGF0Y2hlciApIHsKICAgICAgICAgcGFyc2VyLnBhdGNoZXJNYW5hZ2VyLmFkZFBhdGNoZXIocGF0Y2hlcik7CiAgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yQ2hlY2tlciggUGF0Y2ggcGF0Y2hlciApIHsKKyAgICAgICAgcGFyc2VyLnBhdGNoZXJNYW5hZ2VyLmFkZEVycm9yQ2hlY2tlcihwYXRjaGVyKTsKKyAgICB9CiAgICAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoIFN0cmluZyBtc2csIExvY2F0b3IgbG9jICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHBhcnNlci5wYXRjaGVyTWFuYWdlci5yZXBvcnRFcnJvcihtc2csbG9jKTsKICAgICB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL1BhcnNlckNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvUGFyc2VyQ29udGV4dC5qYXZhCmluZGV4IDk5Zjk4NGQuLmJkNmMwMWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvUGFyc2VyQ29udGV4dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvUGFyc2VyQ29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1NjaGVtYVNldDsKQEAgLTY1LDYgKzY0LDcgQEAKIAogCiAgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8UGF0Y2g+IHBhdGNoZXJzID0gbmV3IFZlY3RvcjxQYXRjaD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxQYXRjaD4gZXJyb3JDaGVja2VycyA9IG5ldyBWZWN0b3I8UGF0Y2g+KCk7CiAKICAgICAvKioKICAgICAgKiBEb2N1bWVudHMgdGhhdCBhcmUgcGFyc2VkIGFscmVhZHkuIFVzZWQgdG8gYXZvaWQgY3ljbGljIGluY2x1c2lvbi9kb3VibGUKQEAgLTg1LDggKzg1LDggQEAKIAogICAgICAgICAgICAgU2NoZW1hSW1wbCB4cyA9IChTY2hlbWFJbXBsKQogICAgICAgICAgICAgICAgIHNjaGVtYVNldC5nZXRTY2hlbWEoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICB4cy5hZGRTaW1wbGVUeXBlKHNjaGVtYVNldC5hbnlTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgIHhzLmFkZENvbXBsZXhUeXBlKHNjaGVtYVNldC5hbnlUeXBlKTsKKyAgICAgICAgICAgIHhzLmFkZFNpbXBsZVR5cGUoc2NoZW1hU2V0LmFueVNpbXBsZVR5cGUsdHJ1ZSk7CisgICAgICAgICAgICB4cy5hZGRDb21wbGV4VHlwZShzY2hlbWFTZXQuYW55VHlwZSx0cnVlKTsKICAgICAgICAgfSBjYXRjaCggU0FYRXhjZXB0aW9uIGUgKSB7CiAgICAgICAgICAgICAvLyB0aGlzIG11c3QgYmUgYSBidWcgb2YgWFNPTQogICAgICAgICAgICAgaWYoZS5nZXRFeGNlcHRpb24oKSE9bnVsbCkKQEAgLTEyNCw2ICsxMjQsMTIgQEAKICAgICAgICAgd2hpbGUoaXRyLmhhc05leHQoKSkKICAgICAgICAgICAgICgoRWxlbWVudERlY2wpaXRyLm5leHQoKSkudXBkYXRlU3Vic3RpdHV0YWJpbGl0eU1hcCgpOwogCisgICAgICAgIC8vIHJ1biBhbGwgdGhlIGVycm9yIGNoZWNrZXJzCisgICAgICAgIGZvciAoUGF0Y2ggcGF0Y2hlciA6IGVycm9yQ2hlY2tlcnMpCisgICAgICAgICAgICBwYXRjaGVyLnJ1bigpOworICAgICAgICBlcnJvckNoZWNrZXJzLmNsZWFyKCk7CisKKwogICAgICAgICBpZihoYWRFcnJvcikgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIGVsc2UgICAgICAgICAgICByZXR1cm4gc2NoZW1hU2V0OwogICAgIH0KQEAgLTE0OCw2ICsxNTQsOSBAQAogICAgICAgICBwdWJsaWMgdm9pZCBhZGRQYXRjaGVyKCBQYXRjaCBwYXRjaCApIHsKICAgICAgICAgICAgIHBhdGNoZXJzLmFkZChwYXRjaCk7CiAgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRXJyb3JDaGVja2VyKCBQYXRjaCBwYXRjaCApIHsKKyAgICAgICAgICAgIGVycm9yQ2hlY2tlcnMuYWRkKHBhdGNoKTsKKyAgICAgICAgfQogICAgICAgICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvciggU3RyaW5nIG1zZywgTG9jYXRvciBzcmMgKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgICAgIC8vIHNldCBhIGZsYWcgdG8gdHJ1ZSB0byBhdm9pZCByZXR1cm5pbmcgYSBjb3JydXB0ZWQgb2JqZWN0LgogICAgICAgICAgICAgc2V0RXJyb3JGbGFnKCk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL1BhdGNoLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL1BhdGNoLmphdmEKaW5kZXggOTgyMjVlZS4uNTkwNzEzOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9QYXRjaC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvUGF0Y2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL1BhdGNoZXJNYW5hZ2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL1BhdGNoZXJNYW5hZ2VyLmphdmEKaW5kZXggMzQ1OGQ5NS4uNTVjYTlkOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9QYXRjaGVyTWFuYWdlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvUGF0Y2hlck1hbmFnZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNCw2ICszNCw3IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUGF0Y2hlck1hbmFnZXIgewogICAgIHZvaWQgYWRkUGF0Y2hlciggUGF0Y2ggcCApOworICAgIHZvaWQgYWRkRXJyb3JDaGVja2VyKCBQYXRjaCBwICk7CiAgICAgLyoqCiAgICAgICogUmVwb3J0cyBhbiBlcnJvciBkdXJpbmcgdGhlIHBhcnNpbmcuCiAgICAgICoKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvU0FYUGFyc2VyRmFjdG9yeUFkYXB0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvU0FYUGFyc2VyRmFjdG9yeUFkYXB0b3IuamF2YQppbmRleCA5M2FjYmE5Li4wNmIyYjk4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL1NBWFBhcnNlckZhY3RvcnlBZGFwdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9TQVhQYXJzZXJGYWN0b3J5QWRhcHRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvU2NoZW1hRG9jdW1lbnRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL1NjaGVtYURvY3VtZW50SW1wbC5qYXZhCmluZGV4IGNlYTJhYjkuLmFiNzFlMmYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvU2NoZW1hRG9jdW1lbnRJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9TY2hlbWFEb2N1bWVudEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5TY2hlbWFJbXBsOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9TdWJzdEdyb3VwQmFzZVR5cGVSZWYuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvU3Vic3RHcm91cEJhc2VUeXBlUmVmLmphdmEKaW5kZXggYWRjOTA0Ny4uYTdlYThhNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9TdWJzdEdyb3VwQmFzZVR5cGVSZWYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL1N1YnN0R3JvdXBCYXNlVHlwZVJlZi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvZGF0YXR5cGVzLnhzZCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvZGF0YXR5cGVzLnhzZAppbmRleCBiYTgxY2VkLi5kNzBhZWI1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL2RhdGF0eXBlcy54c2QKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9kYXRhdHlwZXMueHNkCkBAIC0xLDcgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci0KIDwhLS0KLSBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAKICBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsNyArMjMsNiBAQAogIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgaGF2ZSBhbnkgcXVlc3Rpb25zLgogLS0+Ci0KIDwhLS0gWE1MIFNjaGVtYSBzY2hlbWEgZm9yIFhNTCBTY2hlbWFzOiBQYXJ0IDI6IERhdGF0eXBlcyAtLT4KIDwhLS0KIAlUaGlzIGZpbGUgaXMgZmVkIHRvIFhTT00gdG8gYnVpbGQgc2NoZW1hIGNvbXBvbmVudHMgZm9yIGJ1aWx0LWluIGRhdGF0eXBlcy4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9wYWNrYWdlLmh0bWwKaW5kZXggOTU0MDVjYi4uZWFhZWQ1NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGh0bWw+PGJvZHk+CiBQYXJzZXIgdGhhdCByZWFkcyBYTUwgU2NoZW1hIGRvY3VtZW50cyBhbmQgYnVpbGRzIGFuIDxjb2RlPlhTU2NoZW1hU2V0PC9jb2RlPiBvYmplY3QuCiA8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9BdHRyaWJ1dGVzSW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9BdHRyaWJ1dGVzSW1wbC5qYXZhCmluZGV4IGYwYWI2NjcuLmJlZTU2ZDMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvQXR0cmlidXRlc0ltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL0F0dHJpYnV0ZXNJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvLyBBdHRyaWJ1dGVzSW1wbC5qYXZhIC0gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBBdHRyaWJ1dGVzLgogLy8gV3JpdHRlbiBieSBEYXZpZCBNZWdnaW5zb24sIHNheEBtZWdnaW5zb24uY29tCiAvLyBOTyBXQVJSQU5UWSEgIFRoaXMgY2xhc3MgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCkBAIC02Nyw2ICs2Niw3IEBACiAgKiBAc2luY2UgU0FYIDIuMAogICogQGF1dGhvciBEYXZpZCBNZWdnaW5zb24sCiAgKiAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpzYXhAbWVnZ2luc29uLmNvbSI+c2F4QG1lZ2dpbnNvbi5jb208L2E+CisgKiBAdmVyc2lvbiAyLjAKICAqLwogcHVibGljIGNsYXNzIEF0dHJpYnV0ZXNJbXBsIGltcGxlbWVudHMgQXR0cmlidXRlcwogewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDRXZlbnRSZWNlaXZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDRXZlbnRSZWNlaXZlci5qYXZhCmluZGV4IGFlMmM0OGIuLjEzNDhlNjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvTkdDQ0V2ZW50UmVjZWl2ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL05HQ0NFdmVudFJlY2VpdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiAKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDRXZlbnRTb3VyY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvTkdDQ0V2ZW50U291cmNlLmphdmEKaW5kZXggMmZlOWI1Ny4uZmY3Zjk0YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDRXZlbnRTb3VyY2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL05HQ0NFdmVudFNvdXJjZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvTkdDQ0hhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvTkdDQ0hhbmRsZXIuamF2YQppbmRleCA0MmJmMjYyLi5iOWE0NTcxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL05HQ0NIYW5kbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDSGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKQEAgLTMxLDYgKzMwLDcgQEAKIC8qKgogICoKICAqCisgKiBAdmVyc2lvbiAkSWQ6IE5HQ0NIYW5kbGVyLmphdmEsdiAxLjkgMjAwMi8wOS8yOSAwMjo1NTo0OCBva2FqaW1hIEV4cCAkCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpIChra0Brb2hzdWtlLm9yZykKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE5HQ0NIYW5kbGVyIGltcGxlbWVudHMgTkdDQ0V2ZW50UmVjZWl2ZXIgewpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDSW50ZXJsZWF2ZUZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDSW50ZXJsZWF2ZUZpbHRlci5qYXZhCmluZGV4IDc3NGFjN2IuLmEwMWI2ZGUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvTkdDQ0ludGVybGVhdmVGaWx0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL05HQ0NJbnRlcmxlYXZlRmlsdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiAKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDUnVudGltZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9OR0NDUnVudGltZS5qYXZhCmluZGV4IGI4NjI3ZGIuLjY0ODQ4MDYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvTkdDQ1J1bnRpbWUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL05HQ0NSdW50aW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTUxLDYgKzUwLDcgQEAKICAqCiAgKiAgPGxpPlRPRE86IHByb3ZpZGUgc3VwcG9ydCBmb3IgaW50ZXJsZWF2aW5nLgogICoKKyAqIEB2ZXJzaW9uICRJZDogTkdDQ1J1bnRpbWUuamF2YSx2IDEuMTUgMjAwMi8wOS8yOSAwMjo1NTo0OCBva2FqaW1hIEV4cCAkCiAgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpIChra0Brb2hzdWtlLm9yZykKICAqLwogcHVibGljIGNsYXNzIE5HQ0NSdW50aW1lIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIsIE5HQ0NFdmVudFNvdXJjZSB7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL1NjaGVtYS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9TY2hlbWEuamF2YQppbmRleCBhYzUwNjI5Li43NWFjYmY0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL1NjaGVtYS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvU2NoZW1hLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTg1LDcgKzg0LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBhY3Rpb24wKCl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgJHJ1bnRpbWUuY2hlY2tEb3VibGVEZWZFcnJvciggJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5nZXRBdHRHcm91cERlY2woYWcuZ2V0TmFtZSgpKSApOwotICAgICAgICAgICAgJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5hZGRBdHRHcm91cERlY2woYWcpOworICAgICAgICAgICAgJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5hZGRBdHRHcm91cERlY2woYWcsZmFsc2UpOwogfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFjdGlvbjEoKXRocm93cyBTQVhFeGNlcHRpb24gewpAQCAtOTQsNyArOTMsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGFjdGlvbjIoKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICAkcnVudGltZS5jaGVja0RvdWJsZURlZkVycm9yKCAkcnVudGltZS5jdXJyZW50U2NoZW1hLmdldE1vZGVsR3JvdXBEZWNsKGdyb3VwLmdldE5hbWUoKSkgKTsKLSAgICAgICAgICAgICRydW50aW1lLmN1cnJlbnRTY2hlbWEuYWRkTW9kZWxHcm91cERlY2woZ3JvdXApOworICAgICAgICAgICAgJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5hZGRNb2RlbEdyb3VwRGVjbChncm91cCxmYWxzZSk7CiB9CiAKICAgICBwcml2YXRlIHZvaWQgYWN0aW9uMygpdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CkBAIC0xMTAsMTIgKzEwOSwxMiBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGFjdGlvbjUoKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICAkcnVudGltZS5jaGVja0RvdWJsZURlZkVycm9yKCAkcnVudGltZS5jdXJyZW50U2NoZW1hLmdldFR5cGUoY3QuZ2V0TmFtZSgpKSApOwotICAgICAgICAgICAgJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5hZGRDb21wbGV4VHlwZShjdCk7CisgICAgICAgICAgICAkcnVudGltZS5jdXJyZW50U2NoZW1hLmFkZENvbXBsZXhUeXBlKGN0LGZhbHNlKTsKIH0KIAogICAgIHByaXZhdGUgdm9pZCBhY3Rpb242KCl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgJHJ1bnRpbWUuY2hlY2tEb3VibGVEZWZFcnJvciggJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5nZXRUeXBlKHN0LmdldE5hbWUoKSkgKTsKLSAgICAgICAgICAgICRydW50aW1lLmN1cnJlbnRTY2hlbWEuYWRkU2ltcGxlVHlwZShzdCk7CisgICAgICAgICAgICAkcnVudGltZS5jdXJyZW50U2NoZW1hLmFkZFNpbXBsZVR5cGUoc3QsZmFsc2UpOwogfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFjdGlvbjcoKXRocm93cyBTQVhFeGNlcHRpb24gewpAQCAtMTk1LDYgKzE5NCwzMCBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrRGVmYXVsdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM3OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEyOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZWxlbWVudEZvcm1EZWZhdWx0IikpPj0wKSB7CkBAIC0yMDcsMTYgKzIzMCw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNjaGVtYSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICBhY3Rpb24xNSgpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudCh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEyOgpAQCAtMjMxLDI1ICsyNDcsMzcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInRhcmdldE5hbWVzcGFjZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ5OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTc0LCBhbm5vLEFubm90YXRpb25Db250ZXh0LlNDSEVNQSk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzc2LCBhbm5vLEFubm90YXRpb25Db250ZXh0LlNDSEVNQSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJpbmNsdWRlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGluY2x1ZGVEZWNsKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNzUpOworICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBpbmNsdWRlRGVjbCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzc3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJpbXBvcnQiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGltcG9ydERlY2wodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE3Nik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBpbXBvcnREZWNsKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNzgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZWRlZmluZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHJlZGVmaW5lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNzcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHJlZGVmaW5lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNzkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0yNjAsMTIgKzI4OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBzaW1wbGVUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNzkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgc2ltcGxlVHlwZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBjb21wbGV4VHlwZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBjb21wbGV4VHlwZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzgyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMjc2LDE3ICszMDQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGdyb3VwKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxODIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZ3JvdXAodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM4NCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgbm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE4Myk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgbm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM4NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVHcm91cERlY2wodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE4NCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZUdyb3VwRGVjbCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzg2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMzA1LDEwICszMzMsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMToKKyAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wIHx8ICgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgODAsIGxvY2F0b3IsZmFsc2UsZGVmYXVsdFZhbHVlLGZpeGVkVmFsdWUpOworICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wIHx8ICgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTApKSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlbGVtZW50RGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMwMCwgbG9jYXRvcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMzE2LDEwICszNDQsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTAgfHwgKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA5OCwgbG9jYXRvcix0cnVlKTsKKyAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wIHx8ICgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjgyLCBsb2NhdG9yLGZhbHNlLGRlZmF1bHRWYWx1ZSxmaXhlZFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMzI3LDI1ICszNTUsMzcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1NzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNjaGVtYSIpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBhY3Rpb24xNSgpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNjMsIGFubm8sQW5ub3RhdGlvbkNvbnRleHQuU0NIRU1BKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNjUsIGFubm8sQW5ub3RhdGlvbkNvbnRleHQuU0NIRU1BKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImluY2x1ZGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgaW5jbHVkZURlY2wodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGluY2x1ZGVEZWNsKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNjYpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImltcG9ydCIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgaW1wb3J0RGVjbCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTY1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGltcG9ydERlY2wodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM2Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlZGVmaW5lIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcmVkZWZpbmUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE2Nik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcmVkZWZpbmUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM2OCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTM1NiwxMiArMzk2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE2OCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBzaW1wbGVUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNzApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNjkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0zNzIsMTcgKzQxMiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZ3JvdXAodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE3MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBncm91cCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzczKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzc0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZUdyb3VwRGVjbCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTczKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlR3JvdXBEZWNsKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNzUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC00MDAsMjkgKzQ0MCw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9ja0RlZmF1bHQiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNzsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlZGVmaW5lIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImltcG9ydCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJpbmNsdWRlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSkpKSkpKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTg2LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImF0dHJpYnV0ZUZvcm1EZWZhdWx0IikpPj0wKSB7CkBAIC00MzUsMjMgKzQ1MiwxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgorICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiaW1wb3J0IikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImluY2x1ZGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJub3RhdGlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZWRlZmluZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpKSkpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM4OCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMjsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsRGVmYXVsdCIpKT49MCkgewpAQCAtNDY0LDE4ICs0NzUsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwidGFyZ2V0TmFtZXNwYWNlIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC00OTAsNiArNDg5LDMwIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2tEZWZhdWx0IikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM3OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTI7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZWxlbWVudEZvcm1EZWZhdWx0IikpPj0wKSB7CkBAIC01MDIsNiArNTI1LDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUVsZW1lbnQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCkgewpAQCAtNTE0LDE3ICs1NDIsMjkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInRhcmdldE5hbWVzcGFjZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMDAsIGxvY2F0b3IsdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtNTMzLDUzICs1NzMsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkpIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZURlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA4MCwgbG9jYXRvcixmYWxzZSxkZWZhdWx0VmFsdWUsZml4ZWRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkpKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlbGVtZW50RGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDk4LCBsb2NhdG9yLHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2NoZW1hIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrRGVmYXVsdCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNzsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzY2hlbWEiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTg2LCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSkgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlRGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI4MiwgbG9jYXRvcixmYWxzZSxkZWZhdWx0VmFsdWUsZml4ZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC01OTgsNiArNTkzLDE3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNjaGVtYSIpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIpKT49MCkgewpAQCAtNjEwLDIzICs2MTYsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNjaGVtYSIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzODgsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEyOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUVsZW1lbnQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbERlZmF1bHQiKSk+PTApIHsKQEAgLTYzOSwxNSArNjM5LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6CisgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJ0YXJnZXROYW1lc3BhY2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTY2NSwxNyArNjY0LDYgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudEZvcm1EZWZhdWx0IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQxOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImJsb2NrRGVmYXVsdCIpKSkgewpAQCAtNjg3LDI0ICs2NzUsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgY2FzZSA0NToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaXhlZCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE0OworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnRGb3JtRGVmYXVsdCIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ3OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0MTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC03MjAsMTAgKzY5NywxNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZml4ZWQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMDoKQEAgLTczMSwxNyArNzEzLDYgQEAKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZSh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaW5hbERlZmF1bHQiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzY7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNTM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidGFyZ2V0TmFtZXNwYWNlIikpKSB7CkBAIC03NTMsMTAgKzcyNCwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgorICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgODAsIGxvY2F0b3IsZmFsc2UsZGVmYXVsdFZhbHVlLGZpeGVkVmFsdWUpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImRlZmF1bHQiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImJsb2NrIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaXhlZCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYWJzdHJhY3QiKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZmluYWwiKSkpKSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlbGVtZW50RGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMwMCwgbG9jYXRvcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtNzY0LDEwICs3NDEsMzIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZGVmYXVsdCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZmluYWwiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFic3RyYWN0IikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaXhlZCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmxvY2siKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgOTgsIGxvY2F0b3IsdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlRm9ybURlZmF1bHQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDU7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZmluYWxEZWZhdWx0IikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM2OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmb3JtIikpIHx8ICgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlRGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI4MiwgbG9jYXRvcixmYWxzZSxkZWZhdWx0VmFsdWUsZml4ZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTc4OSwyNiArNzg4LDM5IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzc7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTI7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDE7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVBdHRyaWJ1dGUodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6CisgICAgICAgIGNhc2UgNTM6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudEZvcm1EZWZhdWx0IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ5OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgpAQCAtODE3LDIwICs4MjksMjAgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6CisgICAgICAgIGNhc2UgNTA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmxvY2tEZWZhdWx0IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzc7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlRm9ybURlZmF1bHQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6CisgICAgICAgIGNhc2UgNTQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZml4ZWQiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ0YXJnZXROYW1lc3BhY2UiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CkBAIC04NDcsMTAgKzg1OSwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQxOgorICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzc7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJibG9ja0RlZmF1bHQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTc6CkBAIC04NjksNDMgKzg4NSwyNiBAQAogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEyOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzY7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUzOgorICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDk7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInRhcmdldE5hbWVzcGFjZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ5OworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpeGVkIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUwOgorICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUZvcm1EZWZhdWx0IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDU7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudEZvcm1EZWZhdWx0IikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtOTIzLDExMiArOTIyLDYgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXh0KFN0cmluZyAkdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBpbnQgJGFpOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaXhlZFZhbHVlID0gJHZhbHVlOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImVsZW1lbnRGb3JtRGVmYXVsdCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQxOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlcnNTZXQodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE5Myk7Ci0gICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgODAsIGxvY2F0b3IsZmFsc2UsZGVmYXVsdFZhbHVlLGZpeGVkVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgODAsIGxvY2F0b3IsZmFsc2UsZGVmYXVsdFZhbHVlLGZpeGVkVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVyU2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxODgpOwotICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA5OCwgbG9jYXRvcix0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgOTgsIGxvY2F0b3IsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgOTgsIGxvY2F0b3IsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA5OCwgbG9jYXRvcix0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgOTgsIGxvY2F0b3IsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA5OCwgbG9jYXRvcix0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgOTgsIGxvY2F0b3IsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2tEZWZhdWx0IikpPj0wKSB7CkBAIC0xMDQxLDQ0ICs5MzQsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0NzoKKyAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigkdmFsdWUuZXF1YWxzKCJ1bnF1YWxpZmllZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcXVhbGlmaWNhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTk4KTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigkdmFsdWUuZXF1YWxzKCJxdWFsaWZpZWQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxdWFsaWZpY2F0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxOTgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigkdmFsdWUuZXF1YWxzKCJ1bnF1YWxpZmllZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcXVhbGlmaWNhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjAzKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigkdmFsdWUuZXF1YWxzKCJxdWFsaWZpZWQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxdWFsaWZpY2F0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImF0dHJpYnV0ZUZvcm1EZWZhdWx0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDU7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZXJTZXQodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM5MCk7CisgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxNjoKQEAgLTEwOTMsNiArOTUyLDMyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJlbGVtZW50Rm9ybURlZmF1bHQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0MTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigkdmFsdWUuZXF1YWxzKCJ1bnF1YWxpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcXVhbGlmaWNhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDA1KTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZigkdmFsdWUuZXF1YWxzKCJxdWFsaWZpZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxdWFsaWZpY2F0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MDUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSAkdmFsdWU7CkBAIC0xMTA0LDE0ICs5ODksMTQgQEAKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHRoaXMsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsRGVmYXVsdCIpKT49MCkgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNjsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMTI4LDE3OSArMTAxMywyOTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzAwLCBsb2NhdG9yLHRydWUpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMDAsIGxvY2F0b3IsdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMDAsIGxvY2F0b3IsdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlbGVtZW50RGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMwMCwgbG9jYXRvcix0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzAwLCBsb2NhdG9yLHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlbGVtZW50RGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMwMCwgbG9jYXRvcix0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzAwLCBsb2NhdG9yLHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjgyLCBsb2NhdG9yLGZhbHNlLGRlZmF1bHRWYWx1ZSxmaXhlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlRGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI4MiwgbG9jYXRvcixmYWxzZSxkZWZhdWx0VmFsdWUsZml4ZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCR2YWx1ZS5lcXVhbHMoInVucXVhbGlmaWVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxdWFsaWZpY2F0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MDApOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCR2YWx1ZS5lcXVhbHMoInF1YWxpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHF1YWxpZmljYXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZXJzU2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzOTUpOworICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNTU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1NDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpeGVkVmFsdWUgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYXR0cmlidXRlRm9ybURlZmF1bHQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsRGVmYXVsdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM2OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgODA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWQgPSAoKEF0dHJpYnV0ZURlY2xJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24zKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGUgPSAoKEVsZW1lbnREZWNsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb243KCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2MzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbm5vID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uOSgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2ODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdCA9ICgoU2ltcGxlVHlwZUltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgIGFjdGlvbjYoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3QgPSAoKENvbXBsZXhUeXBlSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uNSgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3MToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBncm91cCA9ICgoTW9kZWxHcm91cERlY2xJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24yKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTcyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5vdGF0aW9uID0gKChYU05vdGF0aW9uKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24xKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTczOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFnID0gKChBdHRHcm91cERlY2xJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24wKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVmZCA9ICgoQm9vbGVhbikkX19yZXN1bHRfXykuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMTMoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFmZCA9ICgoQm9vbGVhbikkX19yZXN1bHRfXykuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMTQoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgIGFjdGlvbjEwKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFubm8gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb245KCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc1OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3NjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNzc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0ID0gKChTaW1wbGVUeXBlSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uNigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdCA9ICgoQ29tcGxleFR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb241KCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdyb3VwID0gKChNb2RlbEdyb3VwRGVjbEltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxODM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm90YXRpb24gPSAoKFhTTm90YXRpb24pJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxODQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWcgPSAoKEF0dEdyb3VwRGVjbEltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOTM6CisgICAgICAgIGNhc2UgMzk1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJsb2NrRGVmYXVsdCA9ICgoSW50ZWdlcikkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgYWN0aW9uMTIoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg4OgorICAgICAgICBjYXNlIDM4ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICBhY3Rpb24xMCgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM5MDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmaW5hbERlZmF1bHQgPSAoKEludGVnZXIpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjExKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzODsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQwNToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZmQgPSAoKEJvb2xlYW4pJF9fcmVzdWx0X18pLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgICAgIGFjdGlvbjE0KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMwMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlID0gKChFbGVtZW50RGVjbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uNygpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNzY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYW5ubyA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjkoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNzc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzc4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM3OToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzODE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3QgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICBhY3Rpb242KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzgyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0ID0gKChDb21wbGV4VHlwZUltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjUoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzODQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ3JvdXAgPSAoKE1vZGVsR3JvdXBEZWNsSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMigpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM4NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub3RhdGlvbiA9ICgoWFNOb3RhdGlvbikkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMSgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM4NjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZyA9ICgoQXR0R3JvdXBEZWNsSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMCgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZCA9ICgoQXR0cmlidXRlRGVjbEltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjMoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVmZCA9ICgoQm9vbGVhbikkX19yZXN1bHRfXykuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgYWN0aW9uMTMoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzY1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFubm8gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICBhY3Rpb245KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM2NzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNjg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzcwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ID0gKChTaW1wbGVUeXBlSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uNigpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM3MToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdCA9ICgoQ29tcGxleFR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICBhY3Rpb241KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzczOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdyb3VwID0gKChNb2RlbEdyb3VwRGVjbEltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm90YXRpb24gPSAoKFhTTm90YXRpb24pJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNzU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWcgPSAoKEF0dEdyb3VwRGVjbEltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9TaW1wbGVUeXBlX0xpc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvU2ltcGxlVHlwZV9MaXN0LmphdmEKaW5kZXggZThhZjlmNS4uNTE2Mzg1NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9TaW1wbGVUeXBlX0xpc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL1NpbXBsZVR5cGVfTGlzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC05OCw2ICs5NywxNyBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIml0ZW1UeXBlIikpPj0wICYmICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTEsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiaXRlbVR5cGUiKSk+PTApIHsKQEAgLTEwNiw3ICsxMTYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIxOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0xMTUsMTEgKzEyNSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGlzdCIpKSkgewpAQCAtMTM1LDcgKzE0MCw3IEBACiAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMjUsIGFubm90YXRpb24sQW5ub3RhdGlvbkNvbnRleHQuU0lNUExFVFlQRV9ERUNMKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA5LCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LlNJTVBMRVRZUEVfREVDTCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTE0NCwxNSArMTQ5LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiaXRlbVR5cGUiKSk+PTAgJiYgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMjcsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTE2OSw2ICsxNjgsMTcgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJpdGVtVHlwZSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxpc3QiKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDExLCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJpdGVtVHlwZSIpKT49MCkgewpAQCAtMTgwLDExICsxOTAsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxpc3QiKSkpIHsKQEAgLTIwMywxNSArMjA4LDkgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJpdGVtVHlwZSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxpc3QiKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIyNywgZmEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0yMjgsNiArMjI3LDE3IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiaXRlbVR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTEsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiaXRlbVR5cGUiKSkpIHsKQEAgLTIzOCwyNiArMjQ4LDE1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiaXRlbVR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjI3LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJBdHRyaWJ1dGUocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTI3NCwxNyArMjczLDE3IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVBdHRyaWJ1dGUocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiaXRlbVR5cGUiKSkpIHsKQEAgLTMwOCwxMCArMzA3LDE4IEBACiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewogICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjIxKTsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1KTsKICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJpdGVtVHlwZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMSwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiaXRlbVR5cGUiKSk+PTApIHsKQEAgLTMyMCwyMyArMzI3LDE1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJpdGVtVHlwZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMjcsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQocmVzdWx0LCBzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM0NCwyNiArMzQzLDI2IEBACiAKICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkQ29tcGxldGVkKE9iamVjdCAkX19yZXN1bHRfXywgaW50ICRfX2Nvb2tpZV9fLCBib29sZWFuICRfX25lZWRBdHRDaGVja19fKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBzd2l0Y2goJF9fY29va2llX18pIHsKLSAgICAgICAgY2FzZSAyMjE6CisgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpdGVtVHlwZU5hbWUgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE5OgorICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaXRlbVR5cGUgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMjc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI1OgorICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvU2ltcGxlVHlwZV9SZXN0cmljdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9TaW1wbGVUeXBlX1Jlc3RyaWN0aW9uLmphdmEKaW5kZXggNGI5YmI2NS4uZTllZGQ2ZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9TaW1wbGVUeXBlX1Jlc3RyaWN0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9TaW1wbGVUeXBlX1Jlc3RyaWN0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTEwNCwxNSArMTAzLDE0IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDEwOgorICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjA0LCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LlNJTVBMRVRZUEVfREVDTCk7CisgICAgICAgICAgICAgICAgaWYoKCgoKCgoKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkV4Y2x1c2l2ZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEV4Y2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4SW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInRvdGFsRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZyYWN0aW9uRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhMZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluTGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVudW1lcmF0aW9uIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIndoaXRlU3BhY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicGF0dGVybiIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmYWNldCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDApOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzMsNDcgKzEzMSwxOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMSgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgoKCgoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluRXhjbHVzaXZlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4RXhjbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhJbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidG90YWxEaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heExlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5MZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZW51bWVyYXRpb24iKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygid2hpdGVTcGFjZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwYXR0ZXJuIikpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZhY2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1OTMpOworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUxLCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LlNJTVBMRVRZUEVfREVDTCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgoKCgoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluRXhjbHVzaXZlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4RXhjbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhJbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidG90YWxEaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heExlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5MZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZW51bWVyYXRpb24iKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygid2hpdGVTcGFjZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwYXR0ZXJuIikpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZhY2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1OTQpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wICYmICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgoKCgoKCgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhFeGNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluSW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ0b3RhbERpZ2l0cyIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJsZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4TGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbnVtZXJhdGlvbiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInBhdHRlcm4iKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYwNiwgZmEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wKSB7CkBAIC0xODIsNyArMTUxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBzaW1wbGVUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1OTgpOworICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBzaW1wbGVUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTE5MSw2ICsxNjAsMzYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wICYmICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgoKCgoKCgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhFeGNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluSW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ0b3RhbERpZ2l0cyIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJsZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4TGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbnVtZXJhdGlvbiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInBhdHRlcm4iKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MywgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0aW9uMSgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCgoKCgoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluRXhjbHVzaXZlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4RXhjbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhJbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidG90YWxEaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heExlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5MZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZW51bWVyYXRpb24iKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygid2hpdGVTcGFjZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwYXR0ZXJuIikpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZhY2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMjA1LDI0ICsyMDQsNiBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMSgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkgewpAQCAtMjM0LDIxICsyMTUsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgorICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJhc2UiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjA2LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA1OgpAQCAtMjYyLDYgKzIzNywzMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJhc2UiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTMsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTI3NiwxNSArMjc1LDM2IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJBdHRyaWJ1dGUocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJiYXNlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmFzZSIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MywgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDoKQEAgLTMwMCwyNyArMzIwLDYgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmFzZSIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MDYsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmFzZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CkBAIC0zMzUsMjcgKzMzNCwxNCBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVBdHRyaWJ1dGUocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0zNjksNiArMzU1LDE5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTM4MCwxNSArMzc5LDM3IEBACiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgaW50ICRhaTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQocmVzdWx0LCBzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmFzZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUzLCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDcpOworICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDoKQEAgLTQwNCw3MiArNDI1LDUwIEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjAwKTsKLSAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmFzZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MDYsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJhc2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgNjA0OgorICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZhY2V0ID0gKChYU0ZhY2V0KSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICBhY3Rpb24wKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU5MzoKKyAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWNldCA9ICgoWFNGYWNldCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMCgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICBiYXNlVHlwZU5hbWUgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICBhY3Rpb24yKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA2OgorICAgICAgICBjYXNlIDUzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OTg6CisgICAgICAgIGNhc2UgNDU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYmFzZVR5cGUgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OTQ6CisgICAgICAgIGNhc2UgNDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZmFjZXQgPSAoKFhTRmFjZXQpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2MDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGVOYW1lID0gKChVTmFtZSkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL1NpbXBsZVR5cGVfVW5pb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvU2ltcGxlVHlwZV9Vbmlvbi5qYXZhCmluZGV4IDlmZTJlMGUuLmVhZDMxMzEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvU2ltcGxlVHlwZV9Vbmlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvU2ltcGxlVHlwZV9Vbmlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC0xMTAsMzMgKzEwOSw2IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYzMSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjM3LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1lbWJlclR5cGVzIikpPj0wKSB7CkBAIC0xNjEsMTAgKzEzMywyNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY4Mik7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBzaW1wbGVUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MzIpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY4Myk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTE3Niw3ICsxNjQsNyBAQAogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjM1LCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LlNJTVBMRVRZUEVfREVDTCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjg2LCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LlNJTVBMRVRZUEVfREVDTCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTE4NSw2ICsxNzMsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2ODgsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTE5OSw2ICsxOTgsMTggQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1lbWJlclR5cGVzIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwpAQCAtMjE2LDI5ICsyMjcsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MzcsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1lbWJlclR5cGVzIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwpAQCAtMjUxLDYgKzIzOSwxNyBAQAogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY4OCwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTI2NSwxMSArMjY0LDYgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWVtYmVyVHlwZXMiKSkpIHsKQEAgLTI4MSw2ICsyNzUsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CkBAIC0zMDcsMjcgKzMwNiwxNyBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtZW1iZXJUeXBlcyIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CkBAIC0zNDAsNiArMzI5LDE2IEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWVtYmVyVHlwZXMiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtMzUxLDIzICszNTAsNiBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChyZXN1bHQsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcW5hbWUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYzOSk7Ci0gICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcW5hbWUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY0MCk7Ci0gICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWVtYmVyVHlwZXMiKSk+PTApIHsKQEAgLTM4MCw2ICszNjIsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQocmVzdWx0LCBzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CkBAIC0zOTksNTEgKzM4Niw2MyBAQAogICAgICAgICAgICAgICAgIGFjdGlvbjMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjkwKTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjkxKTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgNjM3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY0MDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1iZXJUeXBlTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2MzE6CisgICAgICAgIGNhc2UgNjgyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFub255bW91c01lbWJlclR5cGUgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjM5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWJlclR5cGVOYW1lID0gKChVTmFtZSkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDYzMjoKKyAgICAgICAgY2FzZSA2ODM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYW5vbnltb3VzTWVtYmVyVHlwZSA9ICgoU2ltcGxlVHlwZUltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2MzU6CisgICAgICAgIGNhc2UgNjkxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbWJlclR5cGVOYW1lID0gKChVTmFtZSkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMigpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY5MDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJUeXBlTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2ODY6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY4ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9hbm5vdGF0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2Fubm90YXRpb24uamF2YQppbmRleCA3NDIzYTIzLi40ZDI2OWRiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2Fubm90YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2Fubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUmVsYXhOR0NDICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtODYsMTEgKzg1LDYgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7CkBAIC0xMDMsNiArOTcsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC0xMTcsNiArMTE2LDExIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKQEAgLTEyOCwxMSArMTMyLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9hdHRyaWJ1dGVEZWNsQm9keS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9hdHRyaWJ1dGVEZWNsQm9keS5qYXZhCmluZGV4IGQ0NDU1NzMuLjcxZDFkZDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvYXR0cmlidXRlRGVjbEJvZHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2F0dHJpYnV0ZURlY2xCb2R5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTkxLDEwICs5MCwyMiBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTAgJiYgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMTgsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMTgsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2ODYsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuQVRUUklCVVRFX0RFQ0wpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIxNiwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5BVFRSSUJVVEVfREVDTCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTEwMyw2ICsxMTQsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTApIHsKQEAgLTExMSw3ICsxMjcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY3Nyk7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIwNyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTEyMSwyOSArMTM3LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTAgJiYgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2ODgsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2ODgsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkgewpAQCAtMTU2LDkgKzE0OSwxNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMTc1LDEyICsxNzQsMjkgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjE4LCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIxOCwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJ0eXBlIikpPj0wKSB7CkBAIC0xOTMsMjkgKzIwOSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjg4LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY4OCwgZmEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTApIHsKQEAgLTIyOCw5ICsyMjEsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMjQ3LDEyICsyNDYsMjkgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ0eXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIxOCwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIxOCwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidHlwZSIpKSkgewpAQCAtMjY0LDI4ICsyODAsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2ODgsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2ODgsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmb3JtIikpKSB7CkBAIC0yOTcsOSArMjkxLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMzE2LDYgKzMxNSwyOCBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMTgsIGZhKTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmb3JtIikpKSB7CkBAIC0zMjYsOSArMzQ3LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKKyAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTM0MiwzOSArMzY4LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY4OCwgZmEpOwotICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMjsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CkBAIC0zODYsMTIgKzM4NSw1NSBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCR2YWx1ZS5lcXVhbHMoInVucXVhbGlmaWVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxdWFsaWZpY2F0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMjMpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCR2YWx1ZS5lcXVhbHMoInF1YWxpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHF1YWxpZmljYXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIyMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjA5KTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJ0eXBlIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIxOCwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIxOCwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJ0eXBlIikpPj0wKSB7CkBAIC00MDQsNTIgKzQ0Niw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjg4LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjg4LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NzkpOwotICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoJHZhbHVlLmVxdWFscygidW5xdWFsaWZpZWQiKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHF1YWxpZmljYXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY5Myk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoJHZhbHVlLmVxdWFscygicXVhbGlmaWVkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcXVhbGlmaWNhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjkzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wKSB7CkBAIC00NjIsOSArNDU4LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC00NzIsNDMgKzQ3MSw0MyBAQAogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgNjc3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGUgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2ODg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjkzOgorICAgICAgICBjYXNlIDIyMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmb3JtID0gKChCb29sZWFuKSRfX3Jlc3VsdF9fKS5ib29sZWFuVmFsdWUoKTsKICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY3OToKKyAgICAgICAgY2FzZSAyMTY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMDc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9ICgoU2ltcGxlVHlwZUltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIwOToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0eXBlTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2ODY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0ZWQoKSB7Ci0gICAgICAgIHJldHVybigoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDcpIHx8ICgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMCkgfHwgKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDEpKSkpOworICAgICAgICByZXR1cm4oKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAwKSB8fCAoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDEpIHx8ICgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSA3KSkpKTsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9hdHRyaWJ1dGVHcm91cERlY2wuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvYXR0cmlidXRlR3JvdXBEZWNsLmphdmEKaW5kZXggYTdjNDM5NS4uN2Q3ODFhYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9hdHRyaWJ1dGVHcm91cERlY2wuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2F0dHJpYnV0ZUdyb3VwRGVjbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC04MiwzNCArODEsNiBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM2MCwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5BVFRSSUJVVEVfR1JPVVApOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNjIsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiaWQiKSk+PTApIHsKQEAgLTEyMiwxMiArOTMsMjQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTcsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuQVRUUklCVVRFX0dST1VQKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxOSwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE0NSw2ICsxMjgsMjIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwpAQCAtMTU1LDcgKzE1NCw3IEBACiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM1NywgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNCwgcmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMTc3LDI4ICsxNzYsNiBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM2MiwgZmEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiaWQiKSk+PTApIHsKQEAgLTIxMSw2ICsxODgsMjggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxOSwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewpAQCAtMjIyLDYgKzIyMSwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0aW9uMCgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSkgewpAQCAtMjMzLDE3ICsyMzksMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNTcsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlVXNlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTQsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0yNjUsMTcgKzI2NCw2IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJpZCIpKSkgewpAQCAtMjg3LDYgKzI3NSwxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkgewpAQCAtMzI4LDYgKzMyNywxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKQEAgLTMzOSwxMiArMzQ0LDYgQEAKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKQEAgLTM3MywyMyArMzcyLDYgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXh0KFN0cmluZyAkdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBpbnQgJGFpOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJpZCIpKT49MCkgewpAQCAtNDAyLDYgKzM4NCwyOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hbWUgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChyZXN1bHQsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKQEAgLTQxMCwxMSArNDE0LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwpAQCAtNDI3LDE5ICs0MjYsMTkgQEAKIAogICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRDb21wbGV0ZWQoT2JqZWN0ICRfX3Jlc3VsdF9fLCBpbnQgJF9fY29va2llX18sIGJvb2xlYW4gJF9fbmVlZEF0dENoZWNrX18pdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCgkX19jb29raWVfXykgewotICAgICAgICBjYXNlIDM2MDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzYyOgorICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9hdHRyaWJ1dGVVc2VzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2F0dHJpYnV0ZVVzZXMuamF2YQppbmRleCBmMDcwYjZmLi4zZTQzMjQyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2F0dHJpYnV0ZVVzZXMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2F0dHJpYnV0ZVVzZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUmVsYXhOR0NDICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtMTQyLDYgKzE0MSwzMCBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInVzZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYyMSwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5BVFRSSUJVVEVfVVNFKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE4OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKQEAgLTE1NCw2ICsxNzcsMTA4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBhY3Rpb243KCk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uMygpOworICAgICAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwcm9jZXNzQ29udGVudHMiKSk+PTApKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHdpbGRjYXJkQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjAzLCB3bG9jKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3Rpb240KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MTAsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuQVRUUklCVVRFX1VTRSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI1OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTAgfHwgKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZURlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MjgsIGxvY2F0b3IsdHJ1ZSxkZWZhdWx0VmFsdWUsZml4ZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSkgewpAQCAtMTgxLDEzMiArMzA2LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjQoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE1OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wIHx8ICgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIsIGxvY2F0b3IsdHJ1ZSxkZWZhdWx0VmFsdWUsZml4ZWRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjQsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuQVRUUklCVVRFX1VTRSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjU7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzUsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuQVRUUklCVVRFX1VTRSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxODsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInVzZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25FbnRlckVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uNygpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25FbnRlckVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCB8fCAoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInByb2Nlc3NDb250ZW50cyIpKT49MCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNywgd2xvYyk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC0zMjEsNiArMzIwLDI0IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwidXNlIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE4OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCkgewpAQCAtMzMzLDEwNiArMzUwLDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6CisgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjQoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE1OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSkgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlRGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQyLCBsb2NhdG9yLHRydWUsZGVmYXVsdFZhbHVlLGZpeGVkVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUVsZW1lbnQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI1OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE4OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJ1c2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkpIHsKQEAgLTQ1NSwxMCArMzc4LDE3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24yKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55QXR0cmlidXRlIikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHJvY2Vzc0NvbnRlbnRzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55QXR0cmlidXRlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNywgd2xvYyk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MDMsIHdsb2MpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtNDY2LDEyICszOTYsNzUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgorICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICBhY3Rpb240KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI1OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjI4LCBsb2NhdG9yLHRydWUsZGVmYXVsdFZhbHVlLGZpeGVkVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYxOSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicmVmIikpPj0wKSB7CkBAIC00ODMsNiArNDc2LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTQ5Nyw2ICs0OTYsMjMgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidXNlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTg7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpeGVkIikpKSB7CkBAIC01MDgsOSArNTI0LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC01MjEsNiArNTM3LDE3IEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWVzcGFjZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwcm9jZXNzQ29udGVudHMiKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MDMsIHdsb2MpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uNCgpOwpAQCAtNTI4LDMzICs1NTUsMTIgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIsIGxvY2F0b3IsdHJ1ZSxkZWZhdWx0VmFsdWUsZml4ZWRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygicmVmIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDIyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImRlZmF1bHQiKSkpIHsKQEAgLTU2Niw0MCArNTcyLDI3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6CisgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxODsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidXNlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lc3BhY2UiKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygicHJvY2Vzc0NvbnRlbnRzIikpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHdpbGRjYXJkQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTcsIHdsb2MpOworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmb3JtIikpIHx8ICgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlRGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYyOCwgbG9jYXRvcix0cnVlLGRlZmF1bHRWYWx1ZSxmaXhlZFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZWYiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZSh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZWYiKSkpIHsKQEAgLTYxMCw2ICs2MDMsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTYyNCwyOCArNjIzLDQwIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjk7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTg7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTc7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM0OgorICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidXNlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJkZWZhdWx0IikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKQEAgLTY2MCwxNyArNjcxLDIyIEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpeGVkIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlZiIpKSkgewpAQCAtNjg3LDIyICs3MDMsMjEgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE4OworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJkZWZhdWx0IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjU7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidXNlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtNzE5LDIyICs3MzQsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpeGVkIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtNzQ2LDYgKzc0NSwzMCBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwidXNlIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxODsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjEzKTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKQEAgLTc1OCw0MSArNzgxLDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcW5hbWUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI3KTsKLSAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcW5hbWUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM4KTsKLSAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uNCgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTgwMiwzNyArNzkzLDUyIEBACiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3OgorICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlRGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQyLCBsb2NhdG9yLHRydWUsZGVmYXVsdFZhbHVlLGZpeGVkVmFsdWUpOworICAgICAgICAgICAgICAgIGFjdGlvbjIoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwcm9jZXNzQ29udGVudHMiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB3aWxkY2FyZEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYwMywgd2xvYyk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZURlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MiwgbG9jYXRvcix0cnVlLGRlZmF1bHRWYWx1ZSxmaXhlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MDMsIHdsb2MpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0aW9uNCgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTU7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpeGVkVmFsdWUgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dCh0aGlzLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wKSB7CkBAIC04NDUsNDggKzg1MSwzNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE5OgorICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTg7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwidXNlIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInByb2Nlc3NDb250ZW50cyIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHdpbGRjYXJkQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTcsIHdsb2MpOworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZURlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MjgsIGxvY2F0b3IsdHJ1ZSxkZWZhdWx0VmFsdWUsZml4ZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNywgd2xvYyk7CisgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVEZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjI4LCBsb2NhdG9yLHRydWUsZGVmYXVsdFZhbHVlLGZpeGVkVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3OgorICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpeGVkVmFsdWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNjsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MjQpOworICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTM6CkBAIC04OTcsNjAgKzg5MCw2NiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRDb21wbGV0ZWQoT2JqZWN0ICRfX3Jlc3VsdF9fLCBpbnQgJF9fY29va2llX18sIGJvb2xlYW4gJF9fbmVlZEF0dENoZWNrX18pdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCgkX19jb29raWVfXykgewotICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBncm91cE5hbWUgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXR0RGVjbE5hbWUgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb241KCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFub255bW91c0RlY2wgPSAoKEF0dHJpYnV0ZURlY2xJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb242KCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM1OgorICAgICAgICBjYXNlIDYyMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxODsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3OgorICAgICAgICBjYXNlIDYwMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB3aWxkY2FyZCA9ICgoV2lsZGNhcmRJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24wKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjEwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDYyODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbm9ueW1vdXNEZWNsID0gKChBdHRyaWJ1dGVEZWNsSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uNigpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2MTk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDYxMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBncm91cE5hbWUgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjI0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF0dERlY2xOYW1lID0gKChVTmFtZSkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uNSgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdGVkKCkgewotICAgICAgICByZXR1cm4oKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSA1KSB8fCAoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDApIHx8ICgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAxKSkpKTsKKyAgICAgICAgcmV0dXJuKCgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMSkgfHwgKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAwKSB8fCAoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gNSkpKSk7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvY29tcGxleFR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvY29tcGxleFR5cGUuamF2YQppbmRleCBjZjc1ZWYwLi45NDI4ZTNkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2NvbXBsZXhUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9jb21wbGV4VHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC0xMjUsNyArMTI0LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBhY3Rpb244KCl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKIAotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gbmV3IEJhc2VDb250ZW50UmVmKGJhc2VUeXBlKTsKKyAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IG5ldyBCYXNlQ29udGVudFJlZigkcnVudGltZSxiYXNlVHlwZSk7CiAgICAgICAgICAgICAgICAgbWFrZVJlc3VsdChYU1R5cGUuRVhURU5TSU9OKTsKICAgICAgICAgICAgICAgICByZXN1bHQuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwogCkBAIC0xODgsMTQgKzE4Nyw1OSBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSA0OToKKyAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgoKCgoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluRXhjbHVzaXZlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4RXhjbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhJbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidG90YWxEaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heExlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5MZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZW51bWVyYXRpb24iKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygid2hpdGVTcGFjZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwYXR0ZXJuIikpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZhY2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MzgpOworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZXh0ZW5zaW9uIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMTMsIGZhKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ4OworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3MjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1peGVkIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjg7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55QXR0cmlidXRlIikpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMzUsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSB8fCAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSkpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDEwMCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBzaW1wbGVUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNDMpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTE7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjA3LDEwNiArMjUxLDM0IEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJhc2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM5OgorICAgICAgICBjYXNlIDYxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUyNSwgYW5ub3RhdGlvbixBbm5vdGF0aW9uQ29udGV4dC5DT01QTEVYVFlQRV9ERUNMKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNTUsIGFubm90YXRpb24sQW5ub3RhdGlvbkNvbnRleHQuQ09NUExFWFRZUEVfREVDTCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzODsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlc3RyaWN0aW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbjE1KCk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDgwOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ4OCwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBzaW1wbGVUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NDIpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTE7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMTMoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ5OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkpKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUwMywgZmEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZXh0ZW5zaW9uIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MTIsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJleHRlbnNpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24xMCgpOworICAgICAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0zMjIsNiArMjk0LDkwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgoKCgoKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkV4Y2x1c2l2ZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEV4Y2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4SW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInRvdGFsRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZyYWN0aW9uRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhMZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluTGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVudW1lcmF0aW9uIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIndoaXRlU3BhY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicGF0dGVybiIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmYWNldCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTM4KTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhY3Rpb24xMSgpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ3OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoKCgoKCgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhFeGNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluSW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ0b3RhbERpZ2l0cyIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJsZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4TGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbnVtZXJhdGlvbiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInBhdHRlcm4iKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZmFjZXQodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDEzOSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0ODsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJhc2UiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTI2LCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LkNPTVBMRVhUWVBFX0RFQ0wpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzg7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZUNvbnRlbnQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25FbnRlckVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleENvbnRlbnQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSB8fCAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSkpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDg2LCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNjMsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuQ09NUExFWFRZUEVfREVDTCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewpAQCAtMzM0LDgyICszOTAsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0NzoKKyAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUzNCwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wKSB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wKSB7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzY7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTU0LCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LkNPTVBMRVhUWVBFX0RFQ0wpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzU7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55QXR0cmlidXRlIikpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MjIsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoKCgoKCgoKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkV4Y2x1c2l2ZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEV4Y2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4SW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInRvdGFsRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZyYWN0aW9uRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhMZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluTGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVudW1lcmF0aW9uIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIndoaXRlU3BhY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicGF0dGVybiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NDcsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzI7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhDb250ZW50IikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZUNvbnRlbnQiKSkpKSkpKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTY0LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDMzLDk3ICs0MjAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVDb250ZW50IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhDb250ZW50IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkpKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBjb21wbGV4VHlwZV9jb21wbGV4Q29udGVudF9ib2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0ODUsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSkpKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDkyLCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTI3LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTAxLCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LkNPTVBMRVhUWVBFX0RFQ0wpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTg7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICBhY3Rpb24xNSgpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJleHRlbnNpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24xMCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoKCgoKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkV4Y2x1c2l2ZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEV4Y2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4SW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInRvdGFsRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZyYWN0aW9uRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhMZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluTGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVudW1lcmF0aW9uIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIndoaXRlU3BhY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicGF0dGVybiIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmYWNldCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTM3KTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhY3Rpb24xMSgpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ3OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE1OgorICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmFzZSIpKT49MCkgewogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CkBAIC01MzQsMjIgKzQzMSwxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY1OgorICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU2MiwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5DT01QTEVYVFlQRV9ERUNMKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ5OSwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55QXR0cmlidXRlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDEwNCwgZmEpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC01NTcsMTAgKzQ0Miw1MiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDYzOgorICAgICAgICBjYXNlIDU0OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZXh0ZW5zaW9uIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NTYsIGZhKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNDYsIGFubm90YXRpb24sQW5ub3RhdGlvbkNvbnRleHQuQ09NUExFWFRZUEVfREVDTCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MjsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4MDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzY7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpIHx8ICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgY29tcGxleFR5cGVfY29tcGxleENvbnRlbnRfYm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgODksIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0aW9uMTMoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ5OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55QXR0cmlidXRlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDkzLCBmYSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTU3MSw3ICs0OTgsNyBAQAogICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUxMCwgYW5ub3RhdGlvbixBbm5vdGF0aW9uQ29udGV4dC5DT01QTEVYVFlQRV9ERUNMKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMTEsIGFubm90YXRpb24sQW5ub3RhdGlvbkNvbnRleHQuQ09NUExFWFRZUEVfREVDTCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTU4MCw2ICs1MDcsMjkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2NzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4Q29udGVudCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlQ29udGVudCIpKSB8fCAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSkpKSkpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNjUsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA5MSwgYW5ub3RhdGlvbixBbm5vdGF0aW9uQ29udGV4dC5DT01QTEVYVFlQRV9ERUNMKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaXhlZCIpKT49MCkgewpAQCAtNTkyLDM4ICs1NDIsMzEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgY2FzZSA4NDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NDUsIGFubm90YXRpb24sQW5ub3RhdGlvbkNvbnRleHQuQ09NUExFWFRZUEVfREVDTCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MjsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3MjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1peGVkIikpPj0wKSB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCkgewogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY4OworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDgwOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDkwLCBhbm5vdGF0aW9uLEFubm90YXRpb25Db250ZXh0LkNPTVBMRVhUWVBFX0RFQ0wpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDcyOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTYzOSw2ICs1ODIsNjIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMDIsIGFubm90YXRpb24sQW5ub3RhdGlvbkNvbnRleHQuQ09NUExFWFRZUEVfREVDTCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxODsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnlBdHRyaWJ1dGUiKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDEyMywgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMjgsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgoKCgoKCgoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluRXhjbHVzaXZlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4RXhjbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhJbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidG90YWxEaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heExlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5MZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZW51bWVyYXRpb24iKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygid2hpdGVTcGFjZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwYXR0ZXJuIikpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueUF0dHJpYnV0ZSIpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE0OCwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDYzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlc3RyaWN0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJleHRlbnNpb24iKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNTcsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTY1Myw5ICs2NTIsNzYgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNDk6CisgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ4OworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJleHRlbnNpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDcyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWl4ZWQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjg7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMzUsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBjb21wbGV4VHlwZV9jb21wbGV4Q29udGVudF9ib2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMDAsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUxOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC02NjYsOSArNzMyLDIzIEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDYxOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM1OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0aW9uMTEoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ3OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0ODsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDU5OgpAQCAtNjgyLDYgKzc2Miw1MyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzg7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uMSgpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDg2LCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjc7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmFzZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wKSB7CkBAIC02OTMsNzQgKzgyMCwxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzg7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDgwOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImV4dGVuc2lvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJleHRlbnNpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBjb21wbGV4VHlwZV9jb21wbGV4Q29udGVudF9ib2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0ODgsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTE7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24xMygpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDk7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZUNvbnRlbnQiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTAzLCBmYSk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDEwNCwgZmEpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtNzY4LDIxICs4MzEsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY4OgorICAgICAgICBjYXNlIDU0OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2NzsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUyOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC03OTgsMTAgKzg0OSwxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ3OgorICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUzNCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImV4dGVuc2lvbiIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDg5LCByZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtODA5LDYgKzg2MCwzMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjdGlvbjEzKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZXh0ZW5zaW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDkzLCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpIHsKQEAgLTgyMCwxMCArODk1LDEwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc6CisgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJleHRlbnNpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MjIsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNjUsIGZhKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTgzMSw5ICs5MDYsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgorICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleENvbnRlbnQiKSkpIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZUNvbnRlbnQiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25MZWF2ZUVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICB9CkBAIC04NDIsMTU0ICs5MjMsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NDcsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3MjsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NjQsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBjb21wbGV4VHlwZV9jb21wbGV4Q29udGVudF9ib2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0ODUsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZXh0ZW5zaW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ5MiwgZmEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZXh0ZW5zaW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE4OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJleHRlbnNpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTI3LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjExKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmFzZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ5OSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWl4ZWQiKSk+PTApIHsKQEAgLTEwMDIsMjggKzkzNSw0NCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU0OgorICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MjsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhDb250ZW50IikpKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3MjoKKyAgICAgICAgY2FzZSA4NDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1peGVkIikpPj0wKSB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCkgewogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2ODsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4MDsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3MjsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDQ6CkBAIC0xMDM3LDYgKzk4Niw1NiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTg7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImV4dGVuc2lvbiIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDEyMywgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJleHRlbnNpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTI4LCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTQ4LCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZXh0ZW5zaW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CkBAIC0xMDUxLDM1ICsxMDUwLDYgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZmluYWwiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3ODsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzI7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0ODsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uOCgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzc7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJBdHRyaWJ1dGUocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJiYXNlIikpKSB7CkBAIC0xMDkwLDY5ICsxMDYwLDE4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6CisgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxODsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ4OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJiYXNlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzg7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjExKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYWJzdHJhY3QiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4NjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODA7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmFzZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24xMygpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDk7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDY1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKQEAgLTExNzAsOSArMTA4OSwyOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDYxOgorICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzU7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmFzZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJiYXNlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTI7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE4NywyNiArMTEyNiwyMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjdGlvbjEzKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOToKKyAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaXhlZCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyODsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUyOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjIxLDkgKzExNTYsNDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWl4ZWQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjg7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYWJzdHJhY3QiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODA7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpbmFsIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDcyOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTE7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIzNyw2ICsxMjEwLDMyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0aW9uOCgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzc7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDYxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzU7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTg7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjdGlvbjExKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTEyNTEsMjIgKzEyNTAsMzggQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMTM6CisgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmFzZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEyOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OToKKyAgICAgICAgY2FzZSA3MjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ4OworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjg7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTE7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2NzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uOCgpOwpAQCAtMTI3NCwyMSArMTI4OSwyMCBAQAogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDYxOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzODsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM1OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDgwOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmxvY2siKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzM6CkBAIC0xMzAxLDkgKzEzMTUsNTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUxOworICAgICAgICAgICAgICAgIGFjdGlvbjExKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0ODsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzODsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY3OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1NzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJiYXNlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDgwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzY7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTI7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTMxNCw2ICsxMzc1LDQwIEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI4OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJiYXNlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODA7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpbmFsIikpKSB7CkBAIC0xMzI0LDIyICsxNDE5LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2ODoKKyAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjc7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzY7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzU7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc2OgpAQCAtMTM1OCw1NSArMTQ0MCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImJhc2UiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1NjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxODsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMTEoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ3OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY1OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmFzZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA4NToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhYnN0cmFjdCIpKSkgewpAQCAtMTQxNyw1NiArMTQ1NiwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIyOgorICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImJhc2UiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyMTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI4OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUyOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3MjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY4OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJibG9jayIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CkBAIC0xNDc4LDkgKzE0NzcsNTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXh0KFN0cmluZyAkdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBpbnQgJGFpOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSA0OToKKyAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ4OworICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZXJTZXQodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDE4Mik7CisgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxMDYpOworICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMTMwKTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDcyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWl4ZWQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2ODsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNTApOworICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWl4ZWRWYWx1ZSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNDkxLDkgKzE1MzIsMjkgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSA2MToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM1OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3MDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24xMSgpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDc7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDg7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDU5OgpAQCAtMTUwNCwyNiArMTU2NSwxMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MjkpOwotICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM4OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY3OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1peGVkVmFsdWUgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3MzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmFzZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4NjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhYnN0cmFjdFZhbHVlID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUyOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4MDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzY7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0aW9uMTMoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ5OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVyU2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAxNzcpOworICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWl4ZWQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyODsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA4NDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7CkBAIC0xNTM4LDgxICsxNjg2LDEzIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0OTQpOworICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcW5hbWUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDk1KTsKICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc0OgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWl4ZWRWYWx1ZSA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDczOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMTMoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ5OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gJHZhbHVlOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVyU2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1ODEpOwotICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjc7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc2OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzU7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZXJTZXQodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU3Nik7Ci0gICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NDkpOwotICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQocmVzdWx0LCBzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzY6CkBAIC0xNjI3LDkzICsxNzA3LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE4OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24xMSgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDc7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcW5hbWUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUwNSk7Ci0gICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaXhlZFZhbHVlID0gJHZhbHVlOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJhc2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY1OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZSA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1peGVkIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjg7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1MjsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaXhlZCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY4OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJiYXNlIikpPj0wKSB7CkBAIC0xNzIyLDE4NiArMTcxNSwxOTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE4OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRDb21wbGV0ZWQoT2JqZWN0ICRfX3Jlc3VsdF9fLCBpbnQgJF9fY29va2llX18sIGJvb2xlYW4gJF9fbmVlZEF0dENoZWNrX18pdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCgkX19jb29raWVfXykgewotICAgICAgICBjYXNlIDUyOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZU5hbWUgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb245KCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ4ODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBsaWNpdENvbnRlbnQgPSAoKENvbnRlbnRUeXBlSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUzNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDkyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1Mjc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ5OToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBsaWNpdENvbnRlbnQgPSAoKENvbnRlbnRUeXBlSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uNSgpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1NDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1Mzg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXQgPSAoKFhTRmFjZXQpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgIGFjdGlvbjEyKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0ODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUyNToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ5NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZU5hbWUgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24zKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU0MjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlQ29udGVudFR5cGUgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTAzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU4MToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBibG9ja1ZhbHVlID0gKChJbnRlZ2VyKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDgxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSAoKEludGVnZXIpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1NDk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGVOYW1lID0gKChVTmFtZSkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMTQoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTIyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1NDc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1NDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU2NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg1OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cGxpY2l0Q29udGVudCA9ICgoQ29udGVudFR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24wKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2V0ID0gKChYU0ZhY2V0KSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24xMigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MDU6CisgICAgICAgIGNhc2UgMTA2OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJhc2VUeXBlTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjYoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDIyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTYyOgorICAgICAgICBjYXNlIDE0MzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlQ29udGVudFR5cGUgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU1NjoKKyAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2MTsKKyAgICAgICAgICAgICAgICBmYWNldCA9ICgoWFNGYWNldCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMTIoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ4OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTEwOgorICAgICAgICBjYXNlIDEzOToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYWNldCA9ICgoWFNGYWNldCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMTIoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhwbGljaXRDb250ZW50ID0gKChDb250ZW50VHlwZUltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleHBsaWNpdENvbnRlbnQgPSAoKENvbnRlbnRUeXBlSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMigpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3NzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID0gKChJbnRlZ2VyKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTExOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OTA6CisgICAgICAgIGNhc2UgOTE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2VUeXBlTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjMoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMTM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4MjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBibG9ja1ZhbHVlID0gKChJbnRlZ2VyKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDgxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTMwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2VUeXBlTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjkoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2VUeXBlTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgIGFjdGlvbjE0KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1NzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzNToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4cGxpY2l0Q29udGVudCA9ICgoQ29udGVudFR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICBhY3Rpb241KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2MzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDUyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5MzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTU3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTkyNiwyNyArMTkyNSwxNiBAQAogICAgICAgICBwdWJsaWMgWFNTaW1wbGVUeXBlIGdldFR5cGUoKSB7CiAgICAgICAgICAgcmV0dXJuIChYU1NpbXBsZVR5cGUpKChYU0NvbXBsZXhUeXBlKWJhc2VUeXBlLmdldFR5cGUoKSkuZ2V0Q29udGVudFR5cGUoKTsKICAgICAgICAgfQotICAgICAgfTsKLSAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJhc2VDb250ZW50UmVmIGltcGxlbWVudHMgUmVmLkNvbnRlbnRUeXBlIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWYuVHlwZSBiYXNlVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBCYXNlQ29udGVudFJlZihSZWYuVHlwZSBfYmFzZVR5cGUgKSB7IHRoaXMuYmFzZVR5cGUgPSBfYmFzZVR5cGU7IH0KLSAgICAgICAgcHVibGljIFhTQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgICAgICBYU1R5cGUgdCA9IGJhc2VUeXBlLmdldFR5cGUoKTsKLSAgICAgICAgICAgIGlmKHQuYXNDb21wbGV4VHlwZSgpIT1udWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0LmFzQ29tcGxleFR5cGUoKS5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiB0LmFzU2ltcGxlVHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9OworICAgICAgfQogCiAKICAgICAgIC8vIGJhc2VUeXBlIGFuZCBjb250ZW50VHlwZSBtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAgcHJpdmF0ZSB2b2lkIG1ha2VSZXN1bHQoIGludCBkZXJpdmF0aW9uTWV0aG9kICkgewogCiAgICAgICAgIGlmKGZpbmFsVmFsdWU9PW51bGwpCi0gICAgICAgICAgZmluYWxWYWx1ZSA9IG5ldyBJbnRlZ2VyKCRydW50aW1lLmZpbmFsRGVmYXVsdCk7CisgICAgICAgICAgZmluYWxWYWx1ZSA9ICRydW50aW1lLmZpbmFsRGVmYXVsdDsKICAgICAgICAgaWYoYmxvY2tWYWx1ZT09bnVsbCkKLSAgICAgICAgICBibG9ja1ZhbHVlID0gbmV3IEludGVnZXIoJHJ1bnRpbWUuYmxvY2tEZWZhdWx0KTsKKyAgICAgICAgICBibG9ja1ZhbHVlID0gJHJ1bnRpbWUuYmxvY2tEZWZhdWx0OwogCiAgICAgICAgIHJlc3VsdCA9IG5ldyBDb21wbGV4VHlwZUltcGwoCiAgICAgICAgICAgICAkcnVudGltZS5kb2N1bWVudCwKQEAgLTE5NTgsOCArMTk0Niw4IEBACiAgICAgICAgICAgICAkcnVudGltZS5wYXJzZUJvb2xlYW4oYWJzdHJhY3RWYWx1ZSksCiAgICAgICAgICAgICBkZXJpdmF0aW9uTWV0aG9kLAogICAgICAgICAgICAgYmFzZVR5cGUsCi0gICAgICAgICAgICBmaW5hbFZhbHVlLmludFZhbHVlKCksCi0gICAgICAgICAgICBibG9ja1ZhbHVlLmludFZhbHVlKCksCisgICAgICAgICAgICBmaW5hbFZhbHVlLAorICAgICAgICAgICAgYmxvY2tWYWx1ZSwKICAgICAgICAgICAgICRydW50aW1lLnBhcnNlQm9vbGVhbihtaXhlZFZhbHVlKQogICAgICAgICApOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9jb21wbGV4VHlwZV9jb21wbGV4Q29udGVudF9ib2R5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2NvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkuamF2YQppbmRleCA4YWRlMjA4Li5hM2U5YmQyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2NvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2NvbXBsZXhUeXBlX2NvbXBsZXhDb250ZW50X2JvZHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUmVsYXhOR0NDICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtNzUsMjIgKzc0LDI3IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHBhcnRpY2xlLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55QXR0cmlidXRlIikpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2MDgsIG93bmVyKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NzYsIG93bmVyKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYwOCwgb3duZXIpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY3Niwgb3duZXIpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcGFydGljbGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYxMCk7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpIHx8ICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBwYXJ0aWNsZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjc4KTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtOTksMTEgKzEwMyw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQocGFydGljbGUsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC0xMTgsOSArMTE3LDE0IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHBhcnRpY2xlLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlVXNlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjA4LCBvd25lcik7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NzYsIG93bmVyKTsKICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTEzMCwxMSArMTM0LDYgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHBhcnRpY2xlLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTE0OSw5ICsxNDgsMTQgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShwYXJ0aWNsZSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYwOCwgb3duZXIpOworICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlVXNlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjc2LCBvd25lcik7CiAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTE2MSwxMSArMTY1LDYgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShwYXJ0aWNsZSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTE4MCw5ICsxNzksMTQgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShwYXJ0aWNsZSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZVVzZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYwOCwgb3duZXIpOworICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlVXNlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjc2LCBvd25lcik7CiAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTE5MiwxMSArMTk2LDYgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShwYXJ0aWNsZSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTIwOCw5ICsyMDcsMTQgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXh0KFN0cmluZyAkdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBpbnQgJGFpOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQocGFydGljbGUsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlVXNlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjA4LCBvd25lcik7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVVc2VzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NzYsIG93bmVyKTsKICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjIwLDIzICsyMjQsMTggQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHBhcnRpY2xlLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkQ29tcGxldGVkKE9iamVjdCAkX19yZXN1bHRfXywgaW50ICRfX2Nvb2tpZV9fLCBib29sZWFuICRfX25lZWRBdHRDaGVja19fKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBzd2l0Y2goJF9fY29va2llX18pIHsKLSAgICAgICAgY2FzZSA2MDg6CisgICAgICAgIGNhc2UgNjc2OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2MTA6CisgICAgICAgIGNhc2UgNjc4OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHBhcnRpY2xlID0gKChQYXJ0aWNsZUltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvZWxlbWVudERlY2xCb2R5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2VsZW1lbnREZWNsQm9keS5qYXZhCmluZGV4IDM3ZWVlNTguLjBkNmQ4ODggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvZWxlbWVudERlY2xCb2R5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9lbGVtZW50RGVjbEJvZHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUmVsYXhOR0NDICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtMTA2LDk3ICsxMDUsMTQgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMzoKKyAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQxMik7CisgICAgICAgICAgICAgICAgaWYoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleXJlZiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlxdWUiKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgaWRlbnRpdHlDb25zdHJhaW50KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0OTIpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgY29tcGxleFR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQxMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwidHlwZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMyOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wICYmICgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wICYmICgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCAmJiAoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTAgJiYgKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleXJlZiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlxdWUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wICYmICgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCAmJiAoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ2MiwgZmEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNDsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInN1YnN0aXR1dGlvbkdyb3VwIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQwOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTIxMiwxNCArMTI4LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6CisgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCkgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTApIHsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNjsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzMjsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMzYsMTAgKzE1MiwzNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0MDsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjQ7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDE3LCBudWxsLEFubm90YXRpb25Db250ZXh0LkVMRU1FTlRfREVDTCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTEwLCBudWxsLEFubm90YXRpb25Db250ZXh0LkVMRU1FTlRfREVDTCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTI0OCw2ICsxODgsODggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGlkZW50aXR5Q29uc3RyYWludCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDkzKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgc2ltcGxlVHlwZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTA1KTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MDYpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTAgJiYgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wICYmICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCAmJiAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgfHwgKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleXJlZiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlxdWUiKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgJiYgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTAgJiYgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTAgJiYgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTAgJiYgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkpKSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTU1LCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJzdWJzdGl0dXRpb25Hcm91cCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNjsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTApIHsKQEAgLTI2MCwyOSArMjgyLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGlkZW50aXR5Q29uc3RyYWludCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDAwKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBpZGVudGl0eUNvbnN0cmFpbnQodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM5OSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC0yOTcsODYgKzI5Niw5IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMyOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTAgfHwgKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ2MiwgZmEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI0OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInN1YnN0aXR1dGlvbkdyb3VwIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQwOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTc6CkBAIC0zOTEsMTQgKzMxMywxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQwOgorICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTApIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM2OworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMyOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00MTUsMTIgKzMzNywxMDAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQwOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI0OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInR5cGUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTAgfHwgKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCkpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NTUsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJzdWJzdGl0dXRpb25Hcm91cCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzNjsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wKSB7CkBAIC00MzMsMTcgKzQ0Myw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtNDU4LDgwICs0NTcsOSBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAzOgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDIyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaW5hbCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzMjsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZGVmYXVsdCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYWJzdHJhY3QiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpbmFsIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaXhlZCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmxvY2siKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NjIsIGZhKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpeGVkIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI0OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInN1YnN0aXR1dGlvbkdyb3VwIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFic3RyYWN0IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQwOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE3OgpAQCAtNTQ1LDEzICs0NzMsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJibG9jayIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQyOworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpbmFsIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzg7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM2OworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMyOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU2NywxMiArNDk1LDk0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYWJzdHJhY3QiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDA7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZml4ZWQiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjQ7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDIyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJkZWZhdWx0IikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJibG9jayIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZml4ZWQiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFic3RyYWN0IikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmb3JtIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpIHx8ICgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpbmFsIikpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU1NSwgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygic3Vic3RpdHV0aW9uR3JvdXAiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYmxvY2siKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzY7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSkgewpAQCAtNTg0LDE3ICs1OTQsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTYwOSwzMCArNjA4LDE1IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTM7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE0OgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygic3Vic3RpdHV0aW9uR3JvdXAiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYWJzdHJhY3QiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0MDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzY6CkBAIC02NDEsMjIgKzYyNSw2IEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjQ7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImRlZmF1bHQiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyODsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSkgewpAQCAtNjY3LDEwICs2MzUsNDAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOToKKyAgICAgICAgY2FzZSA0NDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaXhlZCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI0OworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDA7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjg7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjQ7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5pbGxhYmxlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtNjg3LDMxICs2ODUsODIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQwOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuaWxsYWJsZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEzOworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6CisgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEzOworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpeGVkIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJkZWZhdWx0IikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInN1YnN0aXR1dGlvbkdyb3VwIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFic3RyYWN0IikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjM7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzMxLDU2ICs3ODAsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygidHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyODsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyMzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTc5Miw5ICs3OTEsMTQ0IEBACiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgaW50ICRhaTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuaWxsYWJsZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEzOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzI7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQwOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI4OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFic3RyYWN0VmFsdWUgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpeGVkVmFsdWUgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDk2KTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNDsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCR2YWx1ZS5lcXVhbHMoInVucXVhbGlmaWVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxdWFsaWZpY2F0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MjYpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCR2YWx1ZS5lcXVhbHMoInF1YWxpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHF1YWxpZmljYXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDUyNik7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5pbGxhYmxlID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVyU2V0KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NDgpOworICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZXJTZXQodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU0MSk7CisgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1MTMpOwogICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC04MTAsODAgKzk0NCw0NiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6CisgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDAzKTsKLSAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFic3RyYWN0VmFsdWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCR2YWx1ZS5lcXVhbHMoInVucXVhbGlmaWVkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxdWFsaWZpY2F0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MzMpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCR2YWx1ZS5lcXVhbHMoInF1YWxpZmllZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHF1YWxpZmljYXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQzMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIwKTsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVyc1NldCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTQ2KTsKICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ4OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NjIsIGZhKTsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU1NSwgZmEpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ2MiwgZmEpOworICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU1NSwgZmEpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDYyLCBmYSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NTUsIGZhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDYyLCBmYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NTUsIGZhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NjIsIGZhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTU1LCBmYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ2MiwgZmEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU1NSwgZmEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ2MiwgZmEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NTUsIGZhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODk0LDI4ICs5OTQsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzI7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI0OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzMzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEzOgpAQCAtOTMwLDQ0ICsxMDEyLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6CisgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmlsbGFibGUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDMzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCkgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkgewogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQwOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmlsbGFibGUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyMzsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05ODQsMTM5ICsxMDM2LDg2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZml4ZWRWYWx1ZSA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjg7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlcnNTZXQodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ1Myk7Ci0gICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyMzsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkQ29tcGxldGVkKE9iamVjdCAkX19yZXN1bHRfXywgaW50ICRfX2Nvb2tpZV9fLCBib29sZWFuICRfX25lZWRBdHRDaGVja19fKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBzd2l0Y2goJF9fY29va2llX18pIHsKLSAgICAgICAgY2FzZSA0MTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9ICgoU2ltcGxlVHlwZUltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQxMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gKChDb21wbGV4VHlwZUltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ1MzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBibG9ja1ZhbHVlID0gKChJbnRlZ2VyKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE3OgorICAgICAgICBjYXNlIDUxMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDAwOgorICAgICAgICBjYXNlIDU0NjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBibG9ja1ZhbHVlID0gKChJbnRlZ2VyKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDk2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gKChVTmFtZSkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDkyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlkYyA9ICgoSWRlbnRpdHlDb25zdHJhaW50SW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ0ODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID0gKChJbnRlZ2VyKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDAzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gKChVTmFtZSkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDMzOgorICAgICAgICBjYXNlIDUyNjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmb3JtID0gKChCb29sZWFuKSRfX3Jlc3VsdF9fKS5ib29sZWFuVmFsdWUoKTsKICAgICAgICAgICAgICAgICBhY3Rpb24zKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ2MjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDIwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1YnN0UmVmID0gKChVTmFtZSkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOTk6CisgICAgICAgIGNhc2UgNDkzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlkYyA9ICgoSWRlbnRpdHlDb25zdHJhaW50SW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU0MToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID0gKChJbnRlZ2VyKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTEzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1YnN0UmVmID0gKChVTmFtZSkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMigpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MDU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9ICgoU2ltcGxlVHlwZUltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUwNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gKChDb21wbGV4VHlwZUltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRlZCgpIHsKLSAgICAgICAgcmV0dXJuKCgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMCkgfHwgKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAxNykgfHwgKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAxMykgfHwgKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAxKSB8fCAoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDExKSB8fCAoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMykpKSkpKSk7CisgICAgICAgIHJldHVybigoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDEzKSB8fCAoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDE3KSB8fCAoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDMpIHx8ICgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMSkgfHwgKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAwKSB8fCAoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMTEpKSkpKSkpOwogICAgIH0KIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2VyU2V0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2VyU2V0LmphdmEKaW5kZXggZDg3NDQxNC4uNWY5MzFhZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9lclNldC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvZXJTZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUmVsYXhOR0NDICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtMTQyLDE3ICsxNDEsMTcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXh0KFN0cmluZyAkdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBpbnQgJGFpOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2ID0gJHZhbHVlOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9lcnNTZXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvZXJzU2V0LmphdmEKaW5kZXggNGJlMDAwMS4uZGY4OWQxYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9lcnNTZXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2Vyc1NldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC0xNDIsMTcgKzE0MSwxNyBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHYgPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2ZhY2V0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2ZhY2V0LmphdmEKaW5kZXggZjRlOGJiMi4uMzRlZjBjYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9mYWNldC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvZmFjZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUmVsYXhOR0NDICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtODQsMTcgKzgzLDYgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjc2LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wKSB7CkBAIC0xMDcsMTIgKzk1LDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6CisgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgoKCgoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluRXhjbHVzaXZlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4RXhjbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhJbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidG90YWxEaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heExlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5MZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZW51bWVyYXRpb24iKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygid2hpdGVTcGFjZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwYXR0ZXJuIikpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU3NywgZmEpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMTMzLDcgKzEyMCw3IEBACiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNzQsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuU0lNUExFVFlQRV9ERUNMKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NzUsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuU0lNUExFVFlQRV9ERUNMKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMTQyLDYgKzEyOSwxOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoKCgoKCgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhFeGNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluSW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ0b3RhbERpZ2l0cyIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJsZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4TGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbnVtZXJhdGlvbiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInBhdHRlcm4iKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CkBAIC0xNjEsMTcgKzE2MCw2IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoKCgoKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkV4Y2x1c2l2ZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEV4Y2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4SW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInRvdGFsRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZyYWN0aW9uRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhMZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluTGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVudW1lcmF0aW9uIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIndoaXRlU3BhY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicGF0dGVybiIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjc2LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCkgewpAQCAtMTg0LDYgKzE3MiwxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgoKCgoKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbkV4Y2x1c2l2ZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heEV4Y2x1c2l2ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWF4SW5jbHVzaXZlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInRvdGFsRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZyYWN0aW9uRGlnaXRzIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxlbmd0aCIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhMZW5ndGgiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibWluTGVuZ3RoIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVudW1lcmF0aW9uIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoIndoaXRlU3BhY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicGF0dGVybiIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTc3LCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwidmFsdWUiKSk+PTApIHsKQEAgLTM1Miw2ICszNTEsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpeGVkID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwpAQCAtMzYzLDI0ICszNjgsMTggQEAKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZml4ZWQgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkQ29tcGxldGVkKE9iamVjdCAkX19yZXN1bHRfXywgaW50ICRfX2Nvb2tpZV9fLCBib29sZWFuICRfX25lZWRBdHRDaGVja19fKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBzd2l0Y2goJF9fY29va2llX18pIHsKLSAgICAgICAgY2FzZSAyNzY6CisgICAgICAgIGNhc2UgNTc3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3NDoKKyAgICAgICAgY2FzZSA1NzU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvZm9yZWlnbkF0dHJpYnV0ZXMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvZm9yZWlnbkF0dHJpYnV0ZXMuamF2YQppbmRleCA2OWMzZGQ3Li5mNWExMTY1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2ZvcmVpZ25BdHRyaWJ1dGVzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9mb3JlaWduQXR0cmlidXRlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2dyb3VwLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2dyb3VwLmphdmEKaW5kZXggYzEwN2NlMS4uYmZlNDdmOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9ncm91cC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvZ3JvdXAuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUmVsYXhOR0NDICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtOTQsNDUgKzkzLDExIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDY3LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG1vZGVsR3JvdXBCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NjUsIG1sb2MsY29tcG9zaXRvck5hbWUpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDY5LCBudWxsLEFubm90YXRpb25Db250ZXh0Lk1PREVMR1JPVVBfREVDTCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewpAQCAtMTQ0LDExICsxMDksMjMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25FbnRlckVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIzMywgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5NT0RFTEdST1VQX0RFQ0wpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpIHx8ICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgbW9kZWxHcm91cEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIyOSwgbWxvYyxjb21wb3NpdG9yTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC0xNjcsNiArMTQ0LDI4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMzEsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25FbnRlckVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJJRCIpKT49MCkgewpAQCAtMTkzLDQwICsxOTIsMTEgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG1vZGVsR3JvdXBCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NjUsIG1sb2MsY29tcG9zaXRvck5hbWUpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewpAQCAtMjM4LDYgKzIwOCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSkgewpAQCAtMjQ5LDYgKzIyNSwyOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBtb2RlbEdyb3VwQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjI5LCBtbG9jLGNvbXBvc2l0b3JOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiSUQiKSk+PTApIHsKQEAgLTI4MCwxMiArMjc5LDYgQEAKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpKSB7CkBAIC0yOTYsNiArMjg5LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIklEIikpKSB7CkBAIC0zMjEsMjcgKzMyMCwxMSBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIklEIikpKSB7CkBAIC0zNTIsNiArMzM1LDIyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTA7CkBAIC0zNzQsMTIgKzM3Myw2IEBACiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChyZXN1bHQsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMjsKQEAgLTM5Myw2ICszODYsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJJRCIpKT49MCkgewpAQCAtNDE2LDIzICs0MTUsMjMgQEAKIAogICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRDb21wbGV0ZWQoT2JqZWN0ICRfX3Jlc3VsdF9fLCBpbnQgJF9fY29va2llX18sIGJvb2xlYW4gJF9fbmVlZEF0dENoZWNrX18pdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCgkX19jb29raWVfXykgewotICAgICAgICBjYXNlIDQ2NToKKyAgICAgICAgY2FzZSAyMzM6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVybSA9ICgoTW9kZWxHcm91cEltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY3OgorICAgICAgICBjYXNlIDIzMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY5OgorICAgICAgICBjYXNlIDIyOToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OworICAgICAgICAgICAgICAgIHRlcm0gPSAoKE1vZGVsR3JvdXBJbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9pZGVudGl0eUNvbnN0cmFpbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvaWRlbnRpdHlDb25zdHJhaW50LmphdmEKaW5kZXggNGVkMzVhNy4uNjNjZjk5NCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9pZGVudGl0eUNvbnN0cmFpbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2lkZW50aXR5Q29uc3RyYWludC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC05NSwxMCArOTQsMjEgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMTc6CisgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlbGVjdG9yIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY2NSwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZWxlY3RvciIpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwieHBhdGgiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB4cGF0aCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjUxKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMTE4LDIxICsxMjgsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaWVsZCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgorICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJ4cGF0aCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHhwYXRoKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NTIpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHhwYXRoKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNDcpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0xNDAsMTEgKzE0NCwxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaWVsZCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMTU0LDcgKzE1OCw3IEBACiAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NTUsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuSURFTlRJVFlfQ09OU1RSQUlOVCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjU0LCBudWxsLEFubm90YXRpb25Db250ZXh0LklERU5USVRZX0NPTlNUUkFJTlQpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0xNjMsMjcgKzE2NywxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgeHBhdGgodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY0OCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaWVsZCIpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTIwMiwxMSArMTkwLDIyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKKyAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlbGVjdG9yIikpKSB7CisgICAgICAgICAgICAgICAgaWYoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCAmJiAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZWxlY3RvciIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNjQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaWVsZCIpKSkgewogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMjI3LDEwICsyMjYsMTAgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMTc6CisgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjY1LCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJ4cGF0aCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlbGVjdG9yIikpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHhwYXRoKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNTEpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMjM4LDYgKzIzNywxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaWVsZCIpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWZlciIpKT49MCkgewpAQCAtMjUwLDM4ICsyNjAsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleXJlZiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlxdWUiKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VsZWN0b3IiKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgeHBhdGgodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY1Mik7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwieHBhdGgiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaWVsZCIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB4cGF0aCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjQ4KTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB4cGF0aCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjQ3KTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTI4OSwxMSArMjc2LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewpAQCAtMzA1LDExICsyODcsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaWVsZCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNjQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTMyNyw2ICszMTUsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CkBAIC0zNDEsMTAgKzM0MCwxMCBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjY1LCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ4cGF0aCIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHhwYXRoKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNTEpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0zNjMsMTAgKzM2MiwxNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygieHBhdGgiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB4cGF0aCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjUyKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB4cGF0aCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjQ3KTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMzc0LDMyICszNzgsMjcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInhwYXRoIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgeHBhdGgodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY0OCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6CisgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE1OworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNjQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CkBAIC00MjYsMzEgKzQyNSwzMSBAQAogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVBdHRyaWJ1dGUobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTA7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygicmVmZXIiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMToKKyAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZWZlciIpKSkgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTQ2OCwxMCArNDY3LDEwIEBACiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgaW50ICRhaTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMTc6CisgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjY1LCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgeHBhdGgodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI1MSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQ4OCwzNyArNDg3LDI5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NTgpOwotICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKKyAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgeHBhdGgodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY1Mik7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgbmFtZSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgeHBhdGgodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY0OCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgeHBhdGgodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI0Nyk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjU3KTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE2OgpAQCAtNTI5LDEwICs1MjAsMTggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNToKKyAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNDsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNjQsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNTQwLDMzICs1MzksMzMgQEAKIAogICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRDb21wbGV0ZWQoT2JqZWN0ICRfX3Jlc3VsdF9fLCBpbnQgJF9fY29va2llX18sIGJvb2xlYW4gJF9fbmVlZEF0dENoZWNrX18pdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCgkX19jb29raWVfXykgewotICAgICAgICBjYXNlIDY1MjoKKyAgICAgICAgY2FzZSAyNTE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSAoKFhQYXRoSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjU4OgorICAgICAgICBjYXNlIDI1NzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZWYgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY0ODoKKyAgICAgICAgY2FzZSAyNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI0NzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmaWVsZCA9ICgoWFBhdGhJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24wKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjY1OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2NTU6CisgICAgICAgIGNhc2UgMjU0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFubiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvaW1wb3J0RGVjbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9pbXBvcnREZWNsLmphdmEKaW5kZXggY2MwNTI5Ni4uMWVhMzEzMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9pbXBvcnREZWNsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9pbXBvcnREZWNsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTc3LDYgKzc2LDMwIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTg5LCBudWxsLEFubm90YXRpb25Db250ZXh0LlNDSEVNQSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJzY2hlbWFMb2NhdGlvbiIpKT49MCkgewpAQCAtODksNiArMTEyLDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImltcG9ydCIpKSkgewpAQCAtMTAwLDM1ICsxMjgsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMywgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5TQ0hFTUEpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudCh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMTQzLDE0ICsxNDIsMTQgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwic2NoZW1hTG9jYXRpb24iKSk+PTApIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCkgewogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE3MywyMyArMTcyLDIzIEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInNjaGVtYUxvY2F0aW9uIikpPj0wKSB7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUVsZW1lbnQodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CkBAIC0yMDQsNiArMjAzLDIzIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZXNwYWNlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygic2NoZW1hTG9jYXRpb24iKSkpIHsKQEAgLTIxNSwyOCArMjMxLDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJBdHRyaWJ1dGUodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lc3BhY2UiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtMjUxLDIwICsyNTAsMjcgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNjaGVtYUxvY2F0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDk6CkBAIC0yNzcsMjEgKzI4MywxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVBdHRyaWJ1dGUodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDQ7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzY2hlbWFMb2NhdGlvbiIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMzA1LDYgKzMwNCwyNCBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwic2NoZW1hTG9jYXRpb24iKSk+PTApIHsKQEAgLTMxNywzMyArMzM0LDE1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbiA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHRoaXMsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgorICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA0OwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbiA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMDoKQEAgLTM1Nyw3ICszNTYsNyBAQAogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgMzoKKyAgICAgICAgY2FzZSA1ODk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9pbmNsdWRlRGVjbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9pbmNsdWRlRGVjbC5qYXZhCmluZGV4IGIzYmFjNmIuLjAxODcwNDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvaW5jbHVkZURlY2wuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL2luY2x1ZGVEZWNsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTc4LDIxICs3NywxMCBAQAogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudCh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJpbmNsdWRlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjMxLCBudWxsLEFubm90YXRpb25Db250ZXh0LlNDSEVNQSk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjY4LCBudWxsLEFubm90YXRpb25Db250ZXh0LlNDSEVNQSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTExMiw2ICsxMDAsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiaW5jbHVkZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkVudGVyRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTEzNywxNyArMTM2LDYgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJzY2hlbWFMb2NhdGlvbiIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImluY2x1ZGUiKSkpIHsKQEAgLTE2MCw2ICsxNDgsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwic2NoZW1hTG9jYXRpb24iKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMjcxLDcgKzI3MCw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkQ29tcGxldGVkKE9iamVjdCAkX19yZXN1bHRfXywgaW50ICRfX2Nvb2tpZV9fLCBib29sZWFuICRfX25lZWRBdHRDaGVja19fKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBzd2l0Y2goJF9fY29va2llX18pIHsKLSAgICAgICAgY2FzZSAyMzE6CisgICAgICAgIGNhc2UgMjY4OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvbW9kZWxHcm91cEJvZHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvbW9kZWxHcm91cEJvZHkuamF2YQppbmRleCA1MDNmOTIxLi4yMjQzZGQ1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL21vZGVsR3JvdXBCb2R5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9tb2RlbEdyb3VwQm9keS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC05NiwxMCArOTUsMTUgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBwYXJ0aWNsZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjY5KTsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHBhcnRpY2xlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTExMSw4ICsxMTUsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHBhcnRpY2xlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NzApOworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSB8fCAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgcGFydGljbGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMTI0LDcgKzEyOCw3IEBACiAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NzMsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuTU9ERUxHUk9VUCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzUsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuTU9ERUxHUk9VUCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTEzNSwyMSArMTM5LDE2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY3NSwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzcsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY3NSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM3LCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMTY0LDYgKzE2MywxMSBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwpAQCAtMTg1LDE1ICsxODksMTAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjc1LCBudWxsKTsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNywgbnVsbCk7CiAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUVsZW1lbnQocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTIwOCw2ICsyMDcsMTEgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwpAQCAtMjI5LDE1ICsyMzMsMTAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjc1LCBudWxsKTsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNywgbnVsbCk7CiAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTI1Miw2ICsyNTEsMTEgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwpAQCAtMjczLDE1ICsyNzcsMTAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjc1LCBudWxsKTsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNywgbnVsbCk7CiAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTI5Myw2ICsyOTIsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXh0KFN0cmluZyAkdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBpbnQgJGFpOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQocmVzdWx0LCBzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhY3Rpb24wKCk7CkBAIC0zMTQsNDEgKzMxOCwzNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NzUsIG51bGwpOworICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM3LCBudWxsKTsKICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChyZXN1bHQsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRDb21wbGV0ZWQoT2JqZWN0ICRfX3Jlc3VsdF9fLCBpbnQgJF9fY29va2llX18sIGJvb2xlYW4gJF9fbmVlZEF0dENoZWNrX18pdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCgkX19jb29raWVfXykgewotICAgICAgICBjYXNlIDY2OToKKyAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjaGlsZFBhcnRpY2xlID0gKChQYXJ0aWNsZUltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2NzA6CisgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2hpbGRQYXJ0aWNsZSA9ICgoUGFydGljbGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24xKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc1OgorICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY3MzoKKyAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOwpAQCAtMzU4LDcgKzM1Nyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0ZWQoKSB7Ci0gICAgICAgIHJldHVybigoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDApIHx8ICgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gNCkgfHwgKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAyKSB8fCAoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMSkpKSkpOworICAgICAgICByZXR1cm4oKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSA0KSB8fCAoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDIpIHx8ICgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMSkgfHwgKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDApKSkpKTsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9ub3RhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9ub3RhdGlvbi5qYXZhCmluZGV4IGJlODJkODIuLmZmOGZlOTkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvbm90YXRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL25vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTc3LDYgKzc2LDM0IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTcxLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU1OCwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5OT1RBVElPTik7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJzeXN0ZW0iKSk+PTApIHsKQEAgLTg5LDM0ICsxMTYsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYxNCwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5OT1RBVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHVibGljIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjI3LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJub3RhdGlvbiIpKSkgewpAQCAtMTQwLDE3ICsxNTAsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHVibGljIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMTY1LDI4ICsxNjQsMTUgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwic3lzdGVtIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJub3RhdGlvbiIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjI3LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNTcxLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTIwNSwxNCArMTkxLDI3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwic3lzdGVtIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHVibGljIikpPj0wKSB7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjIxLDkgKzIyMCw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6CisgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwdWJsaWMiKSk+PTApIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNDYsNiArMjQ1LDI4IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJBdHRyaWJ1dGUobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDU3MSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzeXN0ZW0iKSkpIHsKQEAgLTI1NywyOCArMjc4LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjI3LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygicHVibGljIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKQEAgLTI4OSwxNiArMjk4LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwdWJsaWMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtMzEzLDYgKzMxMiwyNyBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzeXN0ZW0iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CkBAIC0zMjksMjcgKzM0OSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygic3lzdGVtIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygicHVibGljIikpKSB7CkBAIC0zNzEsNiArMzcwLDMxIEBACiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgaW50ICRhaTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA1NzEsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5cyA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInN5c3RlbSIpKT49MCkgewpAQCAtMzgzLDQ1ICs0MDcsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YiA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYyNywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5hbWUgPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHVibGljIikpPj0wKSB7CkBAIC00MzAsMTAgKzQyMSwxOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6CisgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzeXMgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OworICAgICAgICAgICAgICAgIHB1YiA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC00NDEsMTggKzQ0MCwxOCBAQAogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgNjE0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFubiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDYyNzoKKyAgICAgICAgY2FzZSA1NzE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU1ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbm4gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9vY2N1cnMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvb2NjdXJzLmphdmEKaW5kZXggOTc5NmVjYS4uYTJlNGFkMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9vY2N1cnMuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL29jY3Vycy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC04MSwxNCArODAsMTQgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wKSB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTApIHsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtOTgsMTQgKzk3LDE0IEBACiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wKSB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtYXhPY2N1cnMiKSk+PTApIHsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTI0LDE0ICsxMjMsMTQgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wKSB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTApIHsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNDEsMTQgKzE0MCwxNCBAQAogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudCh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTApIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1heE9jY3VycyIpKT49MCkgewogICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE2NywxMyArMTY2LDEzIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDU6CisgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhPY2N1cnMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbk9jY3VycyIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xODMsMTMgKzE4MiwxMyBAQAogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5PY2N1cnMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heE9jY3VycyIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMDgsMTIgKzIwNyw2IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1pbk9jY3VycyIpKSkgewpAQCAtMjM0LDE0ICsyMjcsMjAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZSh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTYsMTggKzI1NSw2IEBACiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgaW50ICRhaTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1heE9jY3VycyIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigkdmFsdWUuZXF1YWxzKCJ1bmJvdW5kZWQiKSkgewpAQCAtMjgxLDE4ICsyNjgsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdiA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHRoaXMsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wKSB7CkBAIC0zMDUsNiArMjgwLDMwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHRoaXMsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHYgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtYXhPY2N1cnMiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMTQsNyArMzEzLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRlZCgpIHsKLSAgICAgICAgcmV0dXJuKCgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMSkgfHwgKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAwKSB8fCAoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gNSkpKSk7CisgICAgICAgIHJldHVybigoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDUpIHx8ICgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMCkgfHwgKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDEpKSkpOwogICAgIH0KIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL3BhcnRpY2xlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL3BhcnRpY2xlLmphdmEKaW5kZXggZDIyMzIwNy4uNWI1NDQ0MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9wYXJ0aWNsZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvcGFydGljbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIC8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUmVsYXhOR0NDICovCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5wYXJzZXIuc3RhdGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtMTMwLDYgKzEyOSwxNyBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHJvY2Vzc0NvbnRlbnRzIikpPj0wKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB3aWxkY2FyZEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQxNiwgd2xvYyk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uMygpOwpAQCAtMTM3LDE1ICsxNDcsMTYgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCAmJiAoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wICYmICgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wICYmICgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCAmJiAoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgJiYgKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleXJlZiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlxdWUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wICYmICgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCAmJiAoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicmVmIikpPj0wICYmICgoKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtYXhPY2N1cnMiKSk+PTAgJiYgKCgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleXJlZiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlxdWUiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCAmJiAoKCgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSkpKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzI5KTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3Rpb241KCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKQEAgLTE4MSwxMCArMTkyLDIxIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1pbk9jY3VycyIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInByb2Nlc3NDb250ZW50cyIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDE3KTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjMsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuUEFSVElDTEUpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQyNSwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5QQVJUSUNMRSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTE5Niw3ICsyMTgsNyBAQAogICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGFubm90YXRpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMzNSwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5QQVJUSUNMRSk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDM3LCBudWxsLEFubm90YXRpb25Db250ZXh0LlBBUlRJQ0xFKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMjA1LDE1ICsyMjcsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInByb2Nlc3NDb250ZW50cyIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1heE9jY3VycyIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzE1KTsKKyAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTAgJiYgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTAgJiYgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wICYmICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTAgJiYgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHx8ICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJrZXlyZWYiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pcXVlIikpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wICYmICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wICYmICgoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNvbXBsZXhUeXBlIikpKSB8fCAoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5IikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygia2V5cmVmIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaXF1ZSIpKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCAmJiAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgfHwgKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleXJlZiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlxdWUiKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCAmJiAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgfHwgKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImtleXJlZiIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlxdWUiKSkpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSkpKSkpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDMxKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMjI4LDggKzI0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTAgfHwgKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzIwLCBsb2MsZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTAgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCB8fCAoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIyLCBsb2MsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0yMzgsMTAgKzI1NSwyMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTAgfHwgKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwcm9jZXNzQ29udGVudHMiKSk+PTApKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHdpbGRjYXJkQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzE0LCB3bG9jKTsKKyAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSB8fCAoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG1vZGVsR3JvdXBCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NDYsIGxvYyxjb21wb3NpdG9yTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1heE9jY3VycyIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NDIpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0yNTEsMjYgKzI3OSw4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wICYmICgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgfHwgKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgfHwgKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNDUpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjUoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE5OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG1vZGVsR3JvdXBCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNDQsIGxvYyxjb21wb3NpdG9yTmFtZSk7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkgfHwgKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wICYmICgoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkgfHwgKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkgfHwgKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDQ3KTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMjg5LDE3ICsyOTksNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicmVmIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzQwKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTMxNCw2ICszMTMsMjggQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHJvY2Vzc0NvbnRlbnRzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MTYsIHdsb2MpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhY3Rpb24zKCk7CkBAIC0zMjEsMTAgKzM0MiwyMiBAQAogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpKSkpKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjkpOworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlRWxlbWVudChyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjdGlvbjUoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE5OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHJvY2Vzc0NvbnRlbnRzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQxNyk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0zNDQsMTQgKzM3Nyw5IEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSkgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB7CiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzYwLDEwICszODgsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwcm9jZXNzQ29udGVudHMiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkpIHx8ICgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtYXhPY2N1cnMiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbnkiKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzE1KTsKKyAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1pbk9jY3VycyIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpKSkpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MzEpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMzcxLDYgKzM5OSwxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicmVmIikpPj0wKSB7CkBAIC0zNzgsOCArNDE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpKSkpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzIwLCBsb2MsZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaXhlZCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpIHx8ICgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYWJzdHJhY3QiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJlbGVtZW50IikpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmaW5hbCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImVsZW1lbnQiKSkpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIyLCBsb2MsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtMzg4LDExICs0MjcsMjIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3OgorICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZWxlbWVudCIpKSkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5vbkxlYXZlRWxlbWVudENvbnN1bWVkKCRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgIGlmKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgbW9kZWxHcm91cEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ0NiwgbG9jLGNvbXBvc2l0b3JOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1heE9jY3VycyIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkpIHx8ICgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NDIpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTQxMCw1MCArNDYwLDEwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHJvY2Vzc0NvbnRlbnRzIikpPj0wICYmICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFueSIpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMTQsIHdsb2MpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wICYmICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpKSB8fCAoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wICYmICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpKSB8fCAoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNDUpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW55IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uTGVhdmVFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVFbGVtZW50KCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhY3Rpb241KCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgbW9kZWxHcm91cEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM0NCwgbG9jLGNvbXBvc2l0b3JOYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFsbCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImNob2ljZSIpKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzZXF1ZW5jZSIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1heE9jY3VycyIpKT49MCAmJiAoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYWxsIikpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY2hvaWNlIikpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNlcXVlbmNlIikpKSkgfHwgKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wICYmICgoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbGwiKSkgfHwgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjaG9pY2UiKSkpIHx8ICgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2VxdWVuY2UiKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NDcpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtNDcyLDE3ICs0ODIsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSkgfHwgKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpKSB8fCAoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtYXhPY2N1cnMiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzQwKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CkBAIC00OTcsMTcgKzQ5NiwxMCBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjMoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWVzcGFjZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwcm9jZXNzQ29udGVudHMiKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMTQsIHdsb2MpOworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lc3BhY2UiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heE9jY3VycyIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWluT2NjdXJzIikpIHx8ICgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInByb2Nlc3NDb250ZW50cyIpKSkpKSkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDE3KTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtNTE1LDY2ICs1MDcsMjIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWluT2NjdXJzIikpIHx8ICgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heE9jY3VycyIpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM0NSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWluT2NjdXJzIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJkZWZhdWx0IikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaW5hbCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYWJzdHJhY3QiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpeGVkIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJibG9jayIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygicmVmIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhPY2N1cnMiKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkpKSkpKSkpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzI5KTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjA7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTA7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIwOgorICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjUoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE5OworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjA7CiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJBdHRyaWJ1dGUocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZWYiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZXNwYWNlIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5PY2N1cnMiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInByb2Nlc3NDb250ZW50cyIpKSB8fCAoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtYXhPY2N1cnMiKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMxNSk7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heE9jY3VycyIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWluT2NjdXJzIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJkZWZhdWx0IikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJibG9jayIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygicmVmIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaXhlZCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZm9ybSIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiYWJzdHJhY3QiKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZmluYWwiKSkpKSkpKSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQzMSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKQEAgLTU4OCw4ICs1MzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZvcm0iKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImRlZmF1bHQiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpbmFsIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhYnN0cmFjdCIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZml4ZWQiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImJsb2NrIikpIHx8ICgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjAsIGxvYyxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJkZWZhdWx0IikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJibG9jayIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygiZml4ZWQiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZvcm0iKSkgfHwgKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFic3RyYWN0IikpIHx8ICgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpbmFsIikpKSkpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIyLCBsb2MsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC01OTgsMTAgKzU0Niw0MCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWVzcGFjZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwcm9jZXNzQ29udGVudHMiKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MTYsIHdsb2MpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWN0aW9uMygpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjdGlvbjUoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE5OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWluT2NjdXJzIikpIHx8ICgoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZWYiKSkgfHwgKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWF4T2NjdXJzIikpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM0MCk7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heE9jY3VycyIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibWluT2NjdXJzIikpIHx8ICgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlZiIpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NDIpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC02MDksNiArNTg3LDI3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm1heE9jY3VycyIpKSB8fCAoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJtaW5PY2N1cnMiKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NDcpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygicmVmIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckF0dHJpYnV0ZSgkX19xbmFtZSk7CkBAIC02MjMsMTAgKzYyMiwyNSBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24zKCk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlZiIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEwOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDIwOwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTY0MCwxNiArNjU0LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6CisgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyMDsKKyAgICAgICAgICAgICAgICBhY3Rpb24zKCk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMToKKyAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTA7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDIwOgpAQCAtNjU5LDIxICs2NzMsNiBAQAogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZWYiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUF0dHJpYnV0ZSgkX19xbmFtZSk7CkBAIC02ODUsNiArNjg0LDI2IEBACiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgaW50ICRhaTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDQwKTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwcm9jZXNzQ29udGVudHMiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB3aWxkY2FyZEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQxNiwgd2xvYyk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MTYsIHdsb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhY3Rpb24zKCk7CkBAIC02OTIsNjMgKzcxMSw0NSBAQAogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzI5KTsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjdGlvbjUoKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE5OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHFuYW1lKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MjgpOworICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInByb2Nlc3NDb250ZW50cyIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDE3KTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1heE9jY3VycyIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyOSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDE3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzI5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQxNyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImJsb2NrIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MTcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyOSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZGVmYXVsdCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyOSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWluT2NjdXJzIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyOSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZvcm0iKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyOSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTc2NiwzMiArNzY3LDYzIEBACiAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dChyZXN1bHQsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMTUpOworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQzMSk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwcm9jZXNzQ29udGVudHMiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMTUpOworICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImFic3RyYWN0IikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDMxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzE1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMxNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDMxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImRlZmF1bHQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1pbk9jY3VycyIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtYXhPY2N1cnMiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQzMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTgwNCwzOCArODM2LDM4IEBACiAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWUiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjAsIGxvYyxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MjIsIGxvYyxmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiYmxvY2siKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzIwLCBsb2MsZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MjIsIGxvYyxmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpeGVkIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjAsIGxvYyxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJmb3JtIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0MjIsIGxvYyxmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJhYnN0cmFjdCIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlbGVtZW50RGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyMCwgbG9jLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIyLCBsb2MsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlbGVtZW50RGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyMCwgbG9jLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZml4ZWQiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIyLCBsb2MsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZWxlbWVudERlY2xCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMjAsIGxvYyxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJibG9jayIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIyLCBsb2MsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZm9ybSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBlbGVtZW50RGVjbEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMyMCwgbG9jLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJkZWZhdWx0IikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGVsZW1lbnREZWNsQm9keSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDIyLCBsb2MsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC04NDcsNDcgKzg3OSw0MCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwcm9jZXNzQ29udGVudHMiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyB3aWxkY2FyZEJvZHkodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDMxNCwgd2xvYyk7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJyZWYiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ0Mik7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgd2lsZGNhcmRCb2R5KHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzMTQsIHdsb2MpOworICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1pbk9jY3VycyIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ0Mik7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ0Mik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1heE9jY3VycyIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzQ1KTsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1pbk9jY3VycyIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDQ3KTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm1pbk9jY3VycyIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBvY2N1cnModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM0NSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDQ3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzM4KTsKLSAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbjUoKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE5OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInJlZiIpKT49MCkgewpAQCAtODk2LDEwNCArOTIxLDc4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBxbmFtZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzI2KTsKLSAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibWF4T2NjdXJzIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgb2NjdXJzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNDApOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicmVmIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzQwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJtaW5PY2N1cnMiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IG9jY3Vycyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzQwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgMzIzOgorICAgICAgICBjYXNlIDQ0MDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMDsKKyAgICAgICAgICAgICAgICBncm91cE5hbWUgPSAoKFVOYW1lKSRfX3Jlc3VsdF9fKTsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDIzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzIwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFub255bW91c0VsZW1lbnREZWNsID0gKChFbGVtZW50RGVjbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uMigpOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMxNDoKKyAgICAgICAgY2FzZSA0MTY6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgd2NCb2R5ID0gKChXaWxkY2FyZEltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNDU6CisgICAgICAgIGNhc2UgNDI4OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9jY3VycyA9ICgob2NjdXJzKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI5OworICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMzg6CisgICAgICAgIGNhc2UgNDI1OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdyb3VwTmFtZSA9ICgoVU5hbWUpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjM7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgIGNhc2UgNDIyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFub255bW91c0VsZW1lbnREZWNsID0gKChFbGVtZW50RGVjbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgYWN0aW9uMigpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ0NjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0ZXJtID0gKChNb2RlbEdyb3VwSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgYWN0aW9uNygpOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudFR5cGVOYW1lID0gKChVTmFtZSkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgY2FzZSA0NDI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgb2NjdXJzID0gKChvY2N1cnMpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI1OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM1OgorICAgICAgICBjYXNlIDQ0NzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyMDsKKyAgICAgICAgICAgICAgICBvY2N1cnMgPSAoKG9jY3VycykkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgY2FzZSA0MTc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgb2NjdXJzID0gKChvY2N1cnMpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM0MDoKKyAgICAgICAgY2FzZSA0Mzc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MzE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgb2NjdXJzID0gKChvY2N1cnMpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMjU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA4OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvcW5hbWUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvcW5hbWUuamF2YQppbmRleCAwNTNiYmQ2Li5mMzk5ODI2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL3FuYW1lLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9xbmFtZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC0xNDIsMTcgKzE0MSwxNyBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dCgkcnVudGltZS5wYXJzZVVOYW1lKHF2YWx1ZSksIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHF2YWx1ZSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQoJHJ1bnRpbWUucGFyc2VVTmFtZShxdmFsdWUpLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvcXVhbGlmaWNhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9xdWFsaWZpY2F0aW9uLmphdmEKaW5kZXggOWY0YTA1NC4uM2Y4MjRhZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9xdWFsaWZpY2F0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9xdWFsaWZpY2F0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvcmVkZWZpbmUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvcmVkZWZpbmUuamF2YQppbmRleCA0ODU2MDk1Li5jYWVhMDA5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL3JlZGVmaW5lLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9yZWRlZmluZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC03Myw3ICs3Miw3IEBACiAgICAgICAgICAgICAgICRydW50aW1lLnJlcG9ydEVycm9yKCBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX1VOREVGSU5FRF9BVFRSSUJVVEVHUk9VUCxuZXdBZy5nZXROYW1lKCkpICk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBuZXdBZy5yZWRlZmluZSgoQXR0R3JvdXBEZWNsSW1wbClvbGRBZyk7Ci0gICAgICAgICAgICAgICRydW50aW1lLmN1cnJlbnRTY2hlbWEuYWRkQXR0R3JvdXBEZWNsKG5ld0FnKTsKKyAgICAgICAgICAgICAgJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5hZGRBdHRHcm91cERlY2wobmV3QWcsdHJ1ZSk7CiAgICAgICAgICAgICB9CiB9CiAKQEAgLTgzLDcgKzgyLDcgQEAKICAgICAgICAgICAgICAgJHJ1bnRpbWUucmVwb3J0RXJyb3IoIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5FUlJfVU5ERUZJTkVEX01PREVMR1JPVVAsbmV3R3JwLmdldE5hbWUoKSkgKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIG5ld0dycC5yZWRlZmluZSgoTW9kZWxHcm91cERlY2xJbXBsKW9sZEdycCk7Ci0gICAgICAgICAgICAgICRydW50aW1lLmN1cnJlbnRTY2hlbWEuYWRkTW9kZWxHcm91cERlY2wobmV3R3JwKTsKKyAgICAgICAgICAgICAgJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5hZGRNb2RlbEdyb3VwRGVjbChuZXdHcnAsdHJ1ZSk7CiAgICAgICAgICAgICB9CiB9CiAKQEAgLTkzLDcgKzkyLDcgQEAKICAgICAgICAgICAgICAgJHJ1bnRpbWUucmVwb3J0RXJyb3IoIE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5FUlJfVU5ERUZJTkVEX0NPTVBMRVhUWVBFLG5ld0N0LmdldE5hbWUoKSkgKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIG5ld0N0LnJlZGVmaW5lKChDb21wbGV4VHlwZUltcGwpb2xkQ3QpOwotICAgICAgICAgICAgICAkcnVudGltZS5jdXJyZW50U2NoZW1hLmFkZENvbXBsZXhUeXBlKG5ld0N0KTsKKyAgICAgICAgICAgICAgJHJ1bnRpbWUuY3VycmVudFNjaGVtYS5hZGRDb21wbGV4VHlwZShuZXdDdCx0cnVlKTsKICAgICAgICAgICAgIH0KIH0KIApAQCAtMTAzLDcgKzEwMiw3IEBACiAgICAgICAgICAgICAgICRydW50aW1lLnJlcG9ydEVycm9yKCBNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuRVJSX1VOREVGSU5FRF9TSU1QTEVUWVBFLG5ld1N0LmdldE5hbWUoKSkgKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIG5ld1N0LnJlZGVmaW5lKChTaW1wbGVUeXBlSW1wbClvbGRTdCk7Ci0gICAgICAgICAgICAgICRydW50aW1lLmN1cnJlbnRTY2hlbWEuYWRkU2ltcGxlVHlwZShuZXdTdCk7CisgICAgICAgICAgICAgICRydW50aW1lLmN1cnJlbnRTY2hlbWEuYWRkU2ltcGxlVHlwZShuZXdTdCx0cnVlKTsKICAgICAgICAgICAgIH0KIH0KIApAQCAtMTE3LDQ3ICsxMTYsMTEgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNjIsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuU0NIRU1BKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgc2ltcGxlVHlwZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjYzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgY29tcGxleFR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI2NCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImdyb3VwIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZ3JvdXAodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI2NSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhdHRyaWJ1dGVHcm91cCIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhdHRyaWJ1dGVHcm91cERlY2wodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI2Nik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInNjaGVtYUxvY2F0aW9uIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlZGVmaW5lIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKQEAgLTE2NywyNyArMTMwLDI3IEBACiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyNTcsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuU0NIRU1BKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0NzYsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuU0NIRU1BKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInNpbXBsZVR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgc2ltcGxlVHlwZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjU4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgc2ltcGxlVHlwZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDc3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJjb21wbGV4VHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgY29tcGxleFR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI1OSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBjb21wbGV4VHlwZSh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDc4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiZ3JvdXAiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBncm91cCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjYwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBncm91cCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDc5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImF0dHJpYnV0ZUdyb3VwIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGF0dHJpYnV0ZUdyb3VwRGVjbCh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjYxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlR3JvdXBEZWNsKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0ODApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CkBAIC0yMDQsMTcgKzE2Nyw1MyBAQAogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudCh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE1OgorICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVkZWZpbmUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUub25FbnRlckVsZW1lbnRDb25zdW1lZCgkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNDsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInNjaGVtYUxvY2F0aW9uIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNDgxLCBudWxsLEFubm90YXRpb25Db250ZXh0LlNDSEVNQSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IHNpbXBsZVR5cGUodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDQ4Mik7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiY29tcGxleFR5cGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGNvbXBsZXhUeXBlKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0ODMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJncm91cCIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGdyb3VwKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0ODQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYXR0cmlidXRlR3JvdXAiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYXR0cmlidXRlR3JvdXBEZWNsKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA0ODUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC0yMjksMjMgKzIyOCw2IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJzY2hlbWFMb2NhdGlvbiIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInJlZGVmaW5lIikpKSB7CkBAIC0yNjIsNiArMjQ0LDIzIEBACiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KHRoaXMsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwic2NoZW1hTG9jYXRpb24iKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CkBAIC0yNzYsMTAgKzI3NSw5IEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckF0dHJpYnV0ZSh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxNDoKQEAgLTI5Miw5ICsyOTAsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJBdHRyaWJ1dGUodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zMTEsNiArMzEwLDExIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVBdHRyaWJ1dGUodGhpcywgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CkBAIC0zMjcsMTEgKzMzMSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZSh0aGlzLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtMzQzLDEwICszNDIsOSBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHRoaXMsIHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxNDoKQEAgLTM1Nyw2ICszNTUsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb24gPSAkdmFsdWU7CkBAIC0zNjQsNzYgKzM2OCw3MSBAQAogICAgICAgICAgICAgICAgIGFjdGlvbjQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tVGV4dCh0aGlzLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkQ29tcGxldGVkKE9iamVjdCAkX19yZXN1bHRfXywgaW50ICRfX2Nvb2tpZV9fLCBib29sZWFuICRfX25lZWRBdHRDaGVja19fKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBzd2l0Y2goJF9fY29va2llX18pIHsKLSAgICAgICAgY2FzZSAyNjI6CisgICAgICAgIGNhc2UgNDc2OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2MzoKKyAgICAgICAgY2FzZSA0Nzc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmV3U3QgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24zKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY0OgorICAgICAgICBjYXNlIDQ3ODoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBuZXdDdCA9ICgoQ29tcGxleFR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24yKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY1OgorICAgICAgICBjYXNlIDQ3OToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBuZXdHcnAgPSAoKE1vZGVsR3JvdXBEZWNsSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgYWN0aW9uMSgpOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2NjoKKyAgICAgICAgY2FzZSA0ODA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmV3QWcgPSAoKEF0dEdyb3VwRGVjbEltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNTc6CisgICAgICAgIGNhc2UgNDgxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI1ODoKKyAgICAgICAgY2FzZSA0ODI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmV3U3QgPSAoKFNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24zKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU5OgorICAgICAgICBjYXNlIDQ4MzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBuZXdDdCA9ICgoQ29tcGxleFR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICBhY3Rpb24yKCk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYwOgorICAgICAgICBjYXNlIDQ4NDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBuZXdHcnAgPSAoKE1vZGVsR3JvdXBEZWNsSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgYWN0aW9uMSgpOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgY2FzZSA0ODU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmV3QWcgPSAoKEF0dEdyb3VwRGVjbEltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvc2ltcGxlVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9zaW1wbGVUeXBlLmphdmEKaW5kZXggZjI4ZDU0MC4uNWM0ZDhmYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9zaW1wbGVUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS9zaW1wbGVUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTkyLDYgKzkxLDY0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkgfHwgKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGlzdCIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaW9uIikpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDcxLCBmYSk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2OSwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5TSU1QTEVUWVBFX0RFQ0wpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygicmVzdHJpY3Rpb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBTaW1wbGVUeXBlX1Jlc3RyaWN0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NSwgYW5ub3RhdGlvbixsb2NhdG9yLGZhLG5hbWUsZmluYWxTZXQpOworICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGlzdCIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBTaW1wbGVUeXBlX0xpc3QodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY2LCBhbm5vdGF0aW9uLGxvY2F0b3IsZmEsbmFtZSxmaW5hbFNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygidW5pb24iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IFNpbXBsZVR5cGVfVW5pb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDYwLCBhbm5vdGF0aW9uLGxvY2F0b3IsZmEsbmFtZSxmaW5hbFNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJFbGVtZW50KCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJFbGVtZW50KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CkBAIC0xMDksNjQgKzE2Niw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJzaW1wbGVUeXBlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLm9uRW50ZXJFbGVtZW50Q29uc3VtZWQoJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbjEoKTsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IFNpbXBsZVR5cGVfUmVzdHJpY3Rpb24odGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM3OSwgYW5ub3RhdGlvbixsb2NhdG9yLGZhLG5hbWUsZmluYWxTZXQpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygibGlzdCIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBTaW1wbGVUeXBlX0xpc3QodGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDM4MCwgYW5ub3RhdGlvbixsb2NhdG9yLGZhLG5hbWUsZmluYWxTZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoInVuaW9uIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBTaW1wbGVUeXBlX1VuaW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzNzQsIGFubm90YXRpb24sbG9jYXRvcixmYSxuYW1lLGZpbmFsU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFbnRlckVsZW1lbnQoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygiYW5ub3RhdGlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ1bmlvbiIpKSB8fCAoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJyZXN0cmljdGlvbiIpKSB8fCAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImxpc3QiKSkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMzg1LCBmYSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAzODMsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuU0lNUExFVFlQRV9ERUNMKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhY3Rpb24wKCk7CkBAIC0yMDAsMjMgKzE5OSwxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUVsZW1lbnQocmVzdWx0LCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpICYmICRfX2xvY2FsLmVxdWFscygic2ltcGxlVHlwZSIpKSkgewpAQCAtMjI4LDEwICsyMjEsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgorICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsImZpbmFsIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgpAQCAtMjY2LDYgKzI2NSwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwpAQCAtMjgyLDEyICsyODcsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA3OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFjdGlvbjAoKTsKQEAgLTMwOSwxMCArMzA4LDEwIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDEyOgorICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMDsKKyAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJmaW5hbCIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDExOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTMyNSw2ICszMjQsMjIgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShyZXN1bHQsIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKQEAgLTMzNiwyMiArMzUxLDYgQEAKICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoImZpbmFsIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTGVhdmVBdHRyaWJ1dGUoJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWN0aW9uMCgpOwpAQCAtMzcwLDE4ICszNjksNiBAQAogICAgIHB1YmxpYyB2b2lkIHRleHQoU3RyaW5nICR2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCAkYWk7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgewotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSAkdmFsdWU7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZSIpKT49MCkgewpAQCAtMzk0LDExICszODEsMjkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21UZXh0KHJlc3VsdCwgc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hbWUgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwiZmluYWwiKSk+PTApIHsKQEAgLTQxMSwxMiArNDE2LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNzsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhY3Rpb24wKCk7CkBAIC00MjksMzYgKzQyOCwzNiBAQAogCiAgICAgcHVibGljIHZvaWQgb25DaGlsZENvbXBsZXRlZChPYmplY3QgJF9fcmVzdWx0X18sIGludCAkX19jb29raWVfXywgYm9vbGVhbiAkX19uZWVkQXR0Q2hlY2tfXyl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoKCRfX2Nvb2tpZV9fKSB7Ci0gICAgICAgIGNhc2UgMzgzOgorICAgICAgICBjYXNlIDcxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY5OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSAoKEFubm90YXRpb25JbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDc7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzNzk6CisgICAgICAgIGNhc2UgNjU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKChSZXN0cmljdGlvblNpbXBsZVR5cGVJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzODA6CisgICAgICAgIGNhc2UgNjY6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKChMaXN0U2ltcGxlVHlwZUltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgY2FzZSA2MDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSAoKFVuaW9uU2ltcGxlVHlwZUltcGwpJF9fcmVzdWx0X18pOwogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM4NToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS93aWxkY2FyZEJvZHkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUvd2lsZGNhcmRCb2R5LmphdmEKaW5kZXggZjMwYjBkNC4uNGJiZDM5ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS93aWxkY2FyZEJvZHkuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL3dpbGRjYXJkQm9keS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogLyogdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBSZWxheE5HQ0MgKi8KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnBhcnNlci5zdGF0ZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CkBAIC03NiwxNCArNzUsMTQgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCkgewotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjA0LCBudWxsLEFubm90YXRpb25Db250ZXh0LldJTERDQVJEKTsKKyAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKICAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05NiwyNyArOTUsMTUgQEAKICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCB8fCAoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInByb2Nlc3NDb250ZW50cyIpKT49MCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjk2LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjAyLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyOTYsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMDIsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyOTgsIG51bGwsQW5ub3RhdGlvbkNvbnRleHQuV0lMRENBUkQpOwotICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUVudGVyRWxlbWVudChoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHJvY2Vzc0NvbnRlbnRzIikpPj0wKSB7CkBAIC0xMjksNiArMTE2LDE4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCkgeworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5jb25zdW1lQXR0cmlidXRlKCRhaSk7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC0xNDMsMTYgKzE0MiwxMCBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAwOgpAQCAtMTYzLDIxICsxNTYsMTUgQEAKICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsIm5hbWVzcGFjZSIpKT49MCB8fCAoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInByb2Nlc3NDb250ZW50cyIpKT49MCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjk2LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjAyLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjk2LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjAyLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVFbGVtZW50KHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJwcm9jZXNzQ29udGVudHMiKSk+PTApIHsKQEAgLTE5MCw2ICsxNzcsMTggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZExlYXZlRWxlbWVudChzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUVsZW1lbnQoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOwpAQCAtMjA0LDE1ICsyMDMsMTAgQEAKICAgICAgICAgJGxvY2FsTmFtZSA9ICRfX2xvY2FsOwogICAgICAgICAkcW5hbWUgPSAkX19xbmFtZTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJuYW1lc3BhY2UiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kRW50ZXJBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDk7CisgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CkBAIC0yMjMsMjEgKzIxNywxNSBAQAogICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYoKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWVzcGFjZSIpKSB8fCAoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJwcm9jZXNzQ29udGVudHMiKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI5NiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIwMiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjk2LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjAyLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckF0dHJpYnV0ZShoLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRFbnRlckF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInByb2Nlc3NDb250ZW50cyIpKSkgewpAQCAtMjQ5LDYgKzIzNywxNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRfX3VyaS5lcXVhbHMoIiIpICYmICRfX2xvY2FsLmVxdWFscygibmFtZXNwYWNlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZEVudGVyQXR0cmlidXRlKHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtMjczLDYgKzI3MiwyOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gOTsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjAyLCBudWxsKTsKKyAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbUxlYXZlQXR0cmlidXRlKGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoIm5hbWVzcGFjZSIpKSkgewpAQCAtMjg5LDI5ICszMTEsNiBAQAogICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUxlYXZlQXR0cmlidXRlKG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyOTYsIG51bGwpOwotICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRMZWF2ZUF0dHJpYnV0ZShzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTMyMywyOCArMzIyLDE2IEBACiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgaW50ICRhaTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBucyA9ICR2YWx1ZTsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1vZGVWYWx1ZSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDY7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwibmFtZXNwYWNlIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OworICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAwOgpAQCAtMzU1LDI3ICszNDIsMjEgQEAKICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHJvY2Vzc0NvbnRlbnRzIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI5NiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDIwMiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDI5NiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyMDIsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21UZXh0KGgsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCAyOTYsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgMjAyLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tVGV4dChoLCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OwotICAgICAgICAgICAgICAgICRydW50aW1lLnNlbmRUZXh0KHN1cGVyLl9jb29raWUsICR2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwicHJvY2Vzc0NvbnRlbnRzIikpPj0wKSB7CkBAIC0zODgsMjggKzM2OSw0NiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJuYW1lc3BhY2UiKSk+PTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuY29uc3VtZUF0dHJpYnV0ZSgkYWkpOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbnMgPSAkdmFsdWU7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkQ29tcGxldGVkKE9iamVjdCAkX19yZXN1bHRfXywgaW50ICRfX2Nvb2tpZV9fLCBib29sZWFuICRfX25lZWRBdHRDaGVja19fKXRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBzd2l0Y2goJF9fY29va2llX18pIHsKLSAgICAgICAgY2FzZSAyOTY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEgPSAoKEZvcmVpZ25BdHRyaWJ1dGVzSW1wbCkkX19yZXN1bHRfXyk7Ci0gICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk4OgorICAgICAgICBjYXNlIDIwNDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSA5OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjAyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZhID0gKChGb3JlaWduQXR0cmlidXRlc0ltcGwpJF9fcmVzdWx0X18pOworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0ZWQoKSB7Ci0gICAgICAgIHJldHVybigoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDUpIHx8ICgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMCkgfHwgKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDEpKSkpOworICAgICAgICByZXR1cm4oKCgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAxKSB8fCAoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDUpIHx8ICgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAwKSkpKTsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS94cGF0aC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3BhcnNlci9zdGF0ZS94cGF0aC5qYXZhCmluZGV4IDY2ZTQ3ZmEuLmM4ZTc4ZDAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9wYXJzZXIvc3RhdGUveHBhdGguamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvcGFyc2VyL3N0YXRlL3hwYXRoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiAvKiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IFJlbGF4TkdDQyAqLwogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwucGFyc2VyLnN0YXRlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTcxLDEwICs3MCwyNiBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyRWxlbWVudChtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoKCRhaSA9ICRydW50aW1lLmdldEF0dHJpYnV0ZUluZGV4KCIiLCJ4cGF0aCIpKT49MCAmJiAoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY1NywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSAmJiAkX19sb2NhbC5lcXVhbHMoImFubm90YXRpb24iKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBhbm5vdGF0aW9uKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NiwgbnVsbCxBbm5vdGF0aW9uQ29udGV4dC5YUEFUSCk7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgYW5ub3RhdGlvbih0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNjUyLCBudWxsLEFubm90YXRpb25Db250ZXh0LlhQQVRIKTsKICAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21FbnRlckVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewpAQCAtOTQsMjIgKzEwOSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21FbnRlckVsZW1lbnQobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSwgJGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwieHBhdGgiKSk+PTAgJiYgKCRfX3VyaS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJhbm5vdGF0aW9uIikpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA3MSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lLCAkYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyRWxlbWVudCgkX19xbmFtZSk7CkBAIC0xMjQsNiArMTIzLDIyIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY1NywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tTGVhdmVFbGVtZW50KGgsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRMZWF2ZUVsZW1lbnQoJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOwpAQCAtMTQxLDIyICsxNTYsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tTGVhdmVFbGVtZW50KG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDcxLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgc3Bhd25DaGlsZEZyb21MZWF2ZUVsZW1lbnQoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlRWxlbWVudCgkX19xbmFtZSk7CkBAIC0xNzEsNiArMTcwLDIyIEBACiAgICAgICAgICRsb2NhbE5hbWUgPSAkX19sb2NhbDsKICAgICAgICAgJHFuYW1lID0gJF9fcW5hbWU7CiAgICAgICAgIHN3aXRjaCgkX25nY2NfY3VycmVudF9zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV2ZXJ0VG9QYXJlbnRGcm9tRW50ZXJBdHRyaWJ1dGUobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkX191cmksICRfX2xvY2FsLCAkX19xbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCgkX191cmkuZXF1YWxzKCIiKSAmJiAkX19sb2NhbC5lcXVhbHMoInhwYXRoIikpKSB7CisgICAgICAgICAgICAgICAgICAgIE5HQ0NIYW5kbGVyIGggPSBuZXcgZm9yZWlnbkF0dHJpYnV0ZXModGhpcywgc3VwZXIuX3NvdXJjZSwgJHJ1bnRpbWUsIDY1NywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKQEAgLTE4NywyMiArMjAyLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbUVudGVyQXR0cmlidXRlKG1ha2VSZXN1bHQoKSwgc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJF9fdXJpLmVxdWFscygiIikgJiYgJF9fbG9jYWwuZXF1YWxzKCJ4cGF0aCIpKSkgewotICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA3MSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwYXduQ2hpbGRGcm9tRW50ZXJBdHRyaWJ1dGUoaCwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZEVudGVyQXR0cmlidXRlKCRfX3FuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRW50ZXJBdHRyaWJ1dGUoJF9fcW5hbWUpOwpAQCAtMjE3LDEyICsyMTYsNiBAQAogICAgICAgICAkbG9jYWxOYW1lID0gJF9fbG9jYWw7CiAgICAgICAgICRxbmFtZSA9ICRfX3FuYW1lOwogICAgICAgICBzd2l0Y2goJF9uZ2NjX2N1cnJlbnRfc3RhdGUpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKLSAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXZlcnRUb1BhcmVudEZyb21MZWF2ZUF0dHJpYnV0ZShtYWtlUmVzdWx0KCksIHN1cGVyLl9jb29raWUsICRfX3VyaSwgJF9fbG9jYWwsICRfX3FuYW1lKTsKQEAgLTIzOCw2ICsyMzEsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kTGVhdmVBdHRyaWJ1dGUoc3VwZXIuX2Nvb2tpZSwgJF9fdXJpLCAkX19sb2NhbCwgJF9fcW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdW5leHBlY3RlZExlYXZlQXR0cmlidXRlKCRfX3FuYW1lKTsKQEAgLTI0OSwyNiArMjQ4LDEyIEBACiAgICAgcHVibGljIHZvaWQgdGV4dChTdHJpbmcgJHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgaW50ICRhaTsKICAgICAgICAgc3dpdGNoKCRfbmdjY19jdXJyZW50X3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgeHBhdGggPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKLSAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldmVydFRvUGFyZW50RnJvbVRleHQobWFrZVJlc3VsdCgpLCBzdXBlci5fY29va2llLCAkdmFsdWUpOwpAQCAtMjc3LDMzICsyNjIsNDcgQEAKICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCgkYWkgPSAkcnVudGltZS5nZXRBdHRyaWJ1dGVJbmRleCgiIiwieHBhdGgiKSk+PTApIHsKLSAgICAgICAgICAgICAgICAgICAgTkdDQ0hhbmRsZXIgaCA9IG5ldyBmb3JlaWduQXR0cmlidXRlcyh0aGlzLCBzdXBlci5fc291cmNlLCAkcnVudGltZSwgNzEsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBOR0NDSGFuZGxlciBoID0gbmV3IGZvcmVpZ25BdHRyaWJ1dGVzKHRoaXMsIHN1cGVyLl9zb3VyY2UsICRydW50aW1lLCA2NTcsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICBzcGF3bkNoaWxkRnJvbVRleHQoaCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAkcnVudGltZS5zZW5kVGV4dChzdXBlci5fY29va2llLCAkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoJGFpID0gJHJ1bnRpbWUuZ2V0QXR0cmlidXRlSW5kZXgoIiIsInhwYXRoIikpPj0wKSB7CisgICAgICAgICAgICAgICAgICAgICRydW50aW1lLmNvbnN1bWVBdHRyaWJ1dGUoJGFpKTsKKyAgICAgICAgICAgICAgICAgICAgJHJ1bnRpbWUuc2VuZFRleHQoc3VwZXIuX2Nvb2tpZSwgJHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRDb21wbGV0ZWQoT2JqZWN0ICRfX3Jlc3VsdF9fLCBpbnQgJF9fY29va2llX18sIGJvb2xlYW4gJF9fbmVlZEF0dENoZWNrX18pdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN3aXRjaCgkX19jb29raWVfXykgewotICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFubiA9ICgoQW5ub3RhdGlvbkltcGwpJF9fcmVzdWx0X18pOwotICAgICAgICAgICAgICAgICRfbmdjY19jdXJyZW50X3N0YXRlID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDcxOgorICAgICAgICBjYXNlIDY1NzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmYSA9ICgoRm9yZWlnbkF0dHJpYnV0ZXNJbXBsKSRfX3Jlc3VsdF9fKTsKICAgICAgICAgICAgICAgICAkX25nY2NfY3VycmVudF9zdGF0ZSA9IDU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2NTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYW5uID0gKChBbm5vdGF0aW9uSW1wbCkkX19yZXN1bHRfXyk7CisgICAgICAgICAgICAgICAgJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRlZCgpIHsKLSAgICAgICAgcmV0dXJuKCgoJF9uZ2NjX2N1cnJlbnRfc3RhdGUgPT0gMCkgfHwgKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDEpKSk7CisgICAgICAgIHJldHVybigoKCRfbmdjY19jdXJyZW50X3N0YXRlID09IDEpIHx8ICgkX25nY2NfY3VycmVudF9zdGF0ZSA9PSAwKSkpOwogICAgIH0KIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL0Fic3RyYWN0QXhpc0ltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9zY2QvQWJzdHJhY3RBeGlzSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NGE2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL0Fic3RyYWN0QXhpc0ltcGwuamF2YQpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuc2NkOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0Fubm90YXRpb247CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dEdyb3VwRGVjbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlRGVjbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlVXNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb250ZW50VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRWxlbWVudERlY2w7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0ZhY2V0OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNJZGVudGl0eUNvbnN0cmFpbnQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU01vZGVsR3JvdXA7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU01vZGVsR3JvdXBEZWNsOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNOb3RhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTUGFydGljbGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1NjaGVtYTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTU2ltcGxlVHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTV2lsZGNhcmQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1hQYXRoOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvci5YU0Z1bmN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFBhcnRpYWwgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQXhpc30uCisgKgorICogPHA+CisgKiB7QGxpbmsgWFNQYXJ0aWNsZX1zIGFyZSBza2lwcGVkIGluIFNDRCwgc28gdGhpcyBjbGFzcyBjb21wZW5zYXRlcyB0aGF0LgorICogRm9yIGV4YW1wbGUsIHdoZW4gd2UgYXJlIGNvbnNpZGVyaW5nIGEgcGF0aCBmcm9tIHtAbGluayBYU0NvbXBsZXhUeXBlfSwKKyAqIHdlIG5lZWQgdG8gYWxzbyBjb25zaWRlciBhIHBhdGggZnJvbSBpdHMgY29udGVudCB0eXBlIHBhcnRpY2xlIChpZiBhbnkuKQorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBeGlzSW1wbDxUIGV4dGVuZHMgWFNDb21wb25lbnQ+IGltcGxlbWVudHMgQXhpczxUPiwgWFNGdW5jdGlvbjxJdGVyYXRvcjxUPj4geworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzaW5nbGV0b24gbGlzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgSXRlcmF0b3I8VD4gc2luZ2xldG9uKFQgdCkgeworICAgICAgICByZXR1cm4gSXRlcmF0b3JzLnNpbmdsZXRvbih0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgSXRlcmF0b3I8VD4gdW5pb24oVC4uLiBpdGVtcykgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5BcnJheTxUPihpdGVtcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIEl0ZXJhdG9yPFQ+IHVuaW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBmaXJzdCwgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IHNlY29uZCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5VbmlvbjxUPihmaXJzdCxzZWNvbmQpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxUPiBpdGVyYXRvcihYU0NvbXBvbmVudCBjb250ZXh0Tm9kZSkgeworICAgICAgICByZXR1cm4gY29udGV4dE5vZGUuYXBwbHkodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcHJlZml4IG9mIHRoZSBheGlzLCBsaWtlICJmb286OiIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgc2ltcGx5IGRlbGVnYXRlIHN0byB7QGxpbmsgI2l0ZXJhdG9yKFhTQ29tcG9uZW50KX0KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIFhTQ29tcG9uZW50PiBjb250ZXh0Tm9kZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcnMuTWFwPFQsWFNDb21wb25lbnQ+KGNvbnRleHROb2RlcykgeworICAgICAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBhcHBseShYU0NvbXBvbmVudCB1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKHUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTW9kZWxHcm91cCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxUPiBhbm5vdGF0aW9uKFhTQW5ub3RhdGlvbiBhbm4pIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IGF0dEdyb3VwRGVjbChYU0F0dEdyb3VwRGVjbCBkZWNsKSB7CisgICAgICAgIHJldHVybiBlbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxUPiBhdHRyaWJ1dGVEZWNsKFhTQXR0cmlidXRlRGVjbCBkZWNsKSB7CisgICAgICAgIHJldHVybiBlbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxUPiBhdHRyaWJ1dGVVc2UoWFNBdHRyaWJ1dGVVc2UgdXNlKSB7CisgICAgICAgIHJldHVybiBlbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxUPiBjb21wbGV4VHlwZShYU0NvbXBsZXhUeXBlIHR5cGUpIHsKKyAgICAgICAgLy8gY29tcGVuc2F0ZSBwYXJ0aWNsZQorICAgICAgICBYU1BhcnRpY2xlIHAgPSB0eXBlLmdldENvbnRlbnRUeXBlKCkuYXNQYXJ0aWNsZSgpOworICAgICAgICBpZihwIT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIHBhcnRpY2xlKHApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gc2NoZW1hKFhTU2NoZW1hIHNjaGVtYSkgeworICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gZmFjZXQoWFNGYWNldCBmYWNldCkgeworICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gbm90YXRpb24oWFNOb3RhdGlvbiBub3RhdGlvbikgeworICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaWRlbnRpdHlDb25zdHJhaW50KFhTSWRlbnRpdHlDb25zdHJhaW50IGRlY2wpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IHhwYXRoKFhTWFBhdGggeHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IHNpbXBsZVR5cGUoWFNTaW1wbGVUeXBlIHNpbXBsZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IHBhcnRpY2xlKFhTUGFydGljbGUgcGFydGljbGUpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IGVtcHR5KFhTQ29udGVudFR5cGUgZW1wdHkpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IHdpbGRjYXJkKFhTV2lsZGNhcmQgd2MpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IG1vZGVsR3JvdXBEZWNsKFhTTW9kZWxHcm91cERlY2wgZGVjbCkgeworICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gbW9kZWxHcm91cChYU01vZGVsR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgLy8gY29tcGVuc2F0ZSBmb3IgcGFydGljbGVzIHRoYXQgYXJlIGlnbm9yZWQgaW4gU0NECisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3JzLk1hcDxULFhTUGFydGljbGU+KGdyb3VwLml0ZXJhdG9yKCkpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgVD4gYXBwbHkoWFNQYXJ0aWNsZSBwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpY2xlKHApOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxUPiBlbGVtZW50RGVjbChYU0VsZW1lbnREZWNsIGRlY2wpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbXB0eSBsaXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBJdGVyYXRvcjxUPiBlbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5lbXB0eSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9BeGlzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL0F4aXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M2YTRiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9BeGlzLmphdmEKQEAgLTAsMCArMSw1NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnNjZDsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBdHRDb250YWluZXI7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0F0dEdyb3VwRGVjbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlRGVjbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQXR0cmlidXRlVXNlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb21wbGV4VHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNFbGVtZW50RGVjbDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRmFjZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0lkZW50aXR5Q29uc3RyYWludDsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTTGlzdFNpbXBsZVR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU01vZGVsR3JvdXA7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU01vZGVsR3JvdXAuQ29tcG9zaXRvcjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTTW9kZWxHcm91cERlY2w7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU05vdGF0aW9uOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNQYXJ0aWNsZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTUmVzdHJpY3Rpb25TaW1wbGVUeXBlOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNTY2hlbWE7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1NpbXBsZVR5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1R5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1VuaW9uU2ltcGxlVHlwZTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTV2lsZGNhcmQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEF4aXMgb2YgdHJhdmVyc2FsLgorICoKKyAqIEBwYXJhbSA8VD4KKyAqICAgICAgVGhlIGtpbmQgb2YgY29tcG9uZW50cyB0aGF0IHRoaXMgYXhpcyBtYXkgcmV0dXJuLgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGludGVyZmFjZSBBeGlzPFQgZXh0ZW5kcyBYU0NvbXBvbmVudD4geworICAgIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKFhTQ29tcG9uZW50IGNvbnRleHROb2RlKTsKKworICAgIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBYU0NvbXBvbmVudD4gY29udGV4dE5vZGVzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgbW9kZWwgZ3JvdXAgYXhpcy4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzTW9kZWxHcm91cCgpOworCisKKyAgICAvKioKKyAgICAgKiBQc2V1ZG8tYXhpcyB0aGF0IHNlbGVjdHMgYWxsIHRoZSB7QGxpbmsgWFNTY2hlbWF9cyBpbiB0aGUgY3VycmVudCBzZXQuCisgICAgICogVXNlZCB0byBpbXBsZW1lbnQgdGhlIGFic29sdXRlIHBhdGggZXhwcmVzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXhpczxYU1NjaGVtYT4gUk9PVCA9IG5ldyBBeGlzPFhTU2NoZW1hPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTU2NoZW1hPiBpdGVyYXRvcihYU0NvbXBvbmVudCBjb250ZXh0Tm9kZSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHROb2RlLmdldFJvb3QoKS5pdGVyYXRlU2NoZW1hKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNTY2hlbWE+IGl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBYU0NvbXBvbmVudD4gY29udGV4dE5vZGVzKSB7CisgICAgICAgICAgICBpZighY29udGV4dE5vZGVzLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gSXRlcmF0b3JzLmVtcHR5KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLy8gdGhpcyBhc3N1bWVzIHRoYXQgYWxsIGN1cnJlbnQgbm9kZXMgYmVsb25nIHRvIHRoZSBzYW1lIG93bmVyLgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcihjb250ZXh0Tm9kZXMubmV4dCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTW9kZWxHcm91cCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gInJvb3Q6OiI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUHNldWRvLWF4aXMgdGhhdCB2aXNpdHMgYWxsIHNraXBwZWQgaW50ZXJtZWRpYXRlIHN0ZXBzLgorICAgICAqIFRob3NlIGFyZToKKyAgICAgKiA8b2w+CisgICAgICogIDxsaT5jb21wbGV4IHR5cGUgcmVhY2hhYmxlIGZyb20gZWxlbWVudAorICAgICAqICA8bGk+bW9kZWwgZ3JvdXBzCisgICAgICogIDxsaT5jb21iaW5hdGlvbiBvZiBhYm92ZS4KKyAgICAgKiA8L29sPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXhpczxYU0NvbXBvbmVudD4gSU5URVJNRURJQVRFX1NLSVAgPSBuZXcgQWJzdHJhY3RBeGlzSW1wbDxYU0NvbXBvbmVudD4oKSB7CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0NvbXBvbmVudD4gZWxlbWVudERlY2woWFNFbGVtZW50RGVjbCBkZWNsKSB7CisgICAgICAgICAgICBYU0NvbXBsZXhUeXBlIGN0ID0gZGVjbC5nZXRUeXBlKCkuYXNDb21wbGV4VHlwZSgpOworICAgICAgICAgICAgaWYoY3Q9PW51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBhbHNvIHBpY2sgdXAgbW9kZWwgZ3JvdXBzIGluc2lkZSB0aGlzIGNvbXBsZXggdHlwZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3JzLlVuaW9uPFhTQ29tcG9uZW50PihzaW5nbGV0b24oY3QpLGNvbXBsZXhUeXBlKGN0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNDb21wb25lbnQ+IG1vZGVsR3JvdXBEZWNsKFhTTW9kZWxHcm91cERlY2wgZGVjbCkgeworICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzKGRlY2wuZ2V0TW9kZWxHcm91cCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0NvbXBvbmVudD4gcGFydGljbGUoWFNQYXJ0aWNsZSBwYXJ0aWNsZSkgeworICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzKHBhcnRpY2xlLmdldFRlcm0oKS5hc01vZGVsR3JvdXAoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSXRlcmF0ZSBhbGwgZGVzY2VuZGFudCBtb2RlbCBncm91cHMgb2YgdGhlIGdpdmVuIG1vZGVsIGdyb3VwLCBpbmNsdWRpbmcgaXRzZWxmLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxYU0NvbXBvbmVudD4gZGVzY2VuZGFudHMoWFNNb2RlbEdyb3VwIG1nKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB3cml0ZSBhIHRyZWUgaXRlcmF0b3IKKyAgICAgICAgICAgIC8vIGZvciBub3csIHdlIGRvIGl0IGVhZ2VybHkgYmVjYXVzZSBJJ20gbGF6eQorICAgICAgICAgICAgTGlzdDxYU0NvbXBvbmVudD4gciA9IG5ldyBBcnJheUxpc3Q8WFNDb21wb25lbnQ+KCk7CisgICAgICAgICAgICB2aXNpdChtZyxyKTsKKyAgICAgICAgICAgIHJldHVybiByLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdmlzaXQoWFNNb2RlbEdyb3VwIG1nLCBMaXN0PFhTQ29tcG9uZW50PiByKSB7CisgICAgICAgICAgICAvLyBzaW5jZSBtb2RlbCBncm91cHMgbmV2ZXIgZm9ybSBhIGN5Y2xlLCBubyBjeWNsZSBjaGVjayBpcyBuZWVkZWQKKyAgICAgICAgICAgIHIuYWRkKG1nKTsKKyAgICAgICAgICAgIGZvciAoWFNQYXJ0aWNsZSBwIDogbWcpIHsKKyAgICAgICAgICAgICAgICBYU01vZGVsR3JvdXAgY2hpbGQgPSBwLmdldFRlcm0oKS5hc01vZGVsR3JvdXAoKTsKKyAgICAgICAgICAgICAgICBpZihjaGlsZCE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdmlzaXQoY2hpbGQscik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICIoaW50ZXJtZWRpYXRlU2tpcCkiOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFsbCBkZXNjZW5kYW50cyByZWFjaGFibGUgdmlhIGRlZmF1bHQgYXhlcy4gVXNlZCB0byBpbXBsZW1lbnQgdGhlICIvLyIgc2VtYW50aWNzLgorICAgICAqCisgICAgICogU28gZmFyIHRoZSBkZWZhdWx0IGF4ZXMgdG9nZXRoZXIgYXJlIGd1YXJhbnRlZWQgbm90IHRvIGNhdXNlIGFueSBjeWNsZSwgc28KKyAgICAgKiBubyBjeWNsZSBjaGVjayBpcyBuZWVkZWQgKGlmIGl0J3MgbmVlZGVkLCB0aGUgbGlmZSB3b3VsZCBiZSBtdWNoIGhhcmRlciEpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTQ29tcG9uZW50PiBERVNDRU5EQU5UUyA9IG5ldyBBeGlzPFhTQ29tcG9uZW50PigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBpdGVyYXRvcihYU0NvbXBvbmVudCBjb250ZXh0Tm9kZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaXNpdG9yKCkuaXRlcmF0b3IoY29udGV4dE5vZGUpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0NvbXBvbmVudD4gaXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIFhTQ29tcG9uZW50PiBjb250ZXh0Tm9kZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlzaXRvcigpLml0ZXJhdG9yKGNvbnRleHROb2Rlcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGVsR3JvdXAoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RhdGVmdWwgdmlzaXRvciB0aGF0IHJlbWVtYmVycyB3aGF0J3MgYWxyZWFkeSB0cmF2ZXJzZWQsIHRvIHJlZHVjZSB0aGUgc2VhcmNoIHNwYWNlLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgY2xhc3MgVmlzaXRvciBleHRlbmRzIEFic3RyYWN0QXhpc0ltcGw8WFNDb21wb25lbnQ+IHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PFhTQ29tcG9uZW50PiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8WFNDb21wb25lbnQ+KCk7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmVjdXJzaXZlbHkgYXBwbHkgdGhlIHtAbGluayBBeGlzI0RFU0NFTkRBTlRTfSBheGlzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmaW5hbCBjbGFzcyBSZWN1cnNpb24gZXh0ZW5kcyBJdGVyYXRvcnMuTWFwPFhTQ29tcG9uZW50LFhTQ29tcG9uZW50PiB7CisgICAgICAgICAgICAgICAgcHVibGljIFJlY3Vyc2lvbihJdGVyYXRvcjw/IGV4dGVuZHMgWFNDb21wb25lbnQ+IGNvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIoY29yZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBhcHBseShYU0NvbXBvbmVudCB1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBERVNDRU5EQU5UUy5pdGVyYXRvcih1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNDb21wb25lbnQ+IHNjaGVtYShYU1NjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgICAgICAgICBpZih2aXNpdGVkLmFkZChzY2hlbWEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0KCBzY2hlbWEsIG5ldyBSZWN1cnNpb24oc2NoZW1hLml0ZXJhdGVFbGVtZW50RGVjbHMoKSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0NvbXBvbmVudD4gZWxlbWVudERlY2woWFNFbGVtZW50RGVjbCBkZWNsKSB7CisgICAgICAgICAgICAgICAgaWYodmlzaXRlZC5hZGQoZGVjbCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQoZGVjbCwgaXRlcmF0b3IoZGVjbC5nZXRUeXBlKCkpICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBzaW1wbGVUeXBlKFhTU2ltcGxlVHlwZSB0eXBlKSB7CisgICAgICAgICAgICAgICAgaWYodmlzaXRlZC5hZGQodHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQodHlwZSwgRkFDRVQuaXRlcmF0b3IodHlwZSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0NvbXBvbmVudD4gY29tcGxleFR5cGUoWFNDb21wbGV4VHlwZSB0eXBlKSB7CisgICAgICAgICAgICAgICAgaWYodmlzaXRlZC5hZGQodHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQodHlwZSwgaXRlcmF0b3IodHlwZS5nZXRDb250ZW50VHlwZSgpKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBwYXJ0aWNsZShYU1BhcnRpY2xlIHBhcnRpY2xlKSB7CisgICAgICAgICAgICAgICAgaWYodmlzaXRlZC5hZGQocGFydGljbGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0KHBhcnRpY2xlLCBpdGVyYXRvcihwYXJ0aWNsZS5nZXRUZXJtKCkpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNDb21wb25lbnQ+IG1vZGVsR3JvdXBEZWNsKFhTTW9kZWxHcm91cERlY2wgZGVjbCkgeworICAgICAgICAgICAgICAgIGlmKHZpc2l0ZWQuYWRkKGRlY2wpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0KGRlY2wsIGl0ZXJhdG9yKGRlY2wuZ2V0TW9kZWxHcm91cCgpKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBtb2RlbEdyb3VwKFhTTW9kZWxHcm91cCBncm91cCkgeworICAgICAgICAgICAgICAgIGlmKHZpc2l0ZWQuYWRkKGdyb3VwKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldChncm91cCwgbmV3IFJlY3Vyc2lvbihncm91cC5pdGVyYXRvcigpKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBhdHRHcm91cERlY2woWFNBdHRHcm91cERlY2wgZGVjbCkgeworICAgICAgICAgICAgICAgIGlmKHZpc2l0ZWQuYWRkKGRlY2wpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0KGRlY2wsIG5ldyBSZWN1cnNpb24oZGVjbC5pdGVyYXRlQXR0cmlidXRlVXNlcygpKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBhdHRyaWJ1dGVVc2UoWFNBdHRyaWJ1dGVVc2UgdXNlKSB7CisgICAgICAgICAgICAgICAgaWYodmlzaXRlZC5hZGQodXNlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCh1c2UsIGl0ZXJhdG9yKHVzZS5nZXREZWNsKCkpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNDb21wb25lbnQ+IGF0dHJpYnV0ZURlY2woWFNBdHRyaWJ1dGVEZWNsIGRlY2wpIHsKKyAgICAgICAgICAgICAgICBpZih2aXNpdGVkLmFkZChkZWNsKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldChkZWNsLCBpdGVyYXRvcihkZWNsLmdldFR5cGUoKSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8WFNDb21wb25lbnQ+IHJldCggWFNDb21wb25lbnQgb25lLCBJdGVyYXRvcjw/IGV4dGVuZHMgWFNDb21wb25lbnQ+IHJlc3QgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuaW9uKHNpbmdsZXRvbihvbmUpLHJlc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiLyI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTU2NoZW1hPiBYX1NDSEVNQSA9IG5ldyBBeGlzPFhTU2NoZW1hPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTU2NoZW1hPiBpdGVyYXRvcihYU0NvbXBvbmVudCBjb250ZXh0Tm9kZSkgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5zaW5nbGV0b24oY29udGV4dE5vZGUuZ2V0T3duZXJTY2hlbWEoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNTY2hlbWE+IGl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBYU0NvbXBvbmVudD4gY29udGV4dE5vZGVzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5BZGFwdGVyPFhTU2NoZW1hLFhTQ29tcG9uZW50Pihjb250ZXh0Tm9kZXMpIHsKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgWFNTY2hlbWEgZmlsdGVyKFhTQ29tcG9uZW50IHUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUuZ2V0T3duZXJTY2hlbWEoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNb2RlbEdyb3VwKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAieC1zY2hlbWE6OiI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTRWxlbWVudERlY2w+IFNVQlNUSVRVVElPTl9HUk9VUCA9IG5ldyBBYnN0cmFjdEF4aXNJbXBsPFhTRWxlbWVudERlY2w+KCkgeworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNFbGVtZW50RGVjbD4gZWxlbWVudERlY2woWFNFbGVtZW50RGVjbCBkZWNsKSB7CisgICAgICAgICAgICByZXR1cm4gc2luZ2xldG9uKGRlY2wuZ2V0U3Vic3RBZmZpbGlhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gInN1YnN0aXR1dGlvbkdyb3VwOjoiOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXhpczxYU0F0dHJpYnV0ZURlY2w+IEFUVFJJQlVURSA9IG5ldyBBYnN0cmFjdEF4aXNJbXBsPFhTQXR0cmlidXRlRGVjbD4oKSB7CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0F0dHJpYnV0ZURlY2w+IGNvbXBsZXhUeXBlKFhTQ29tcGxleFR5cGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZUhvbGRlcih0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0F0dHJpYnV0ZURlY2w+IGF0dEdyb3VwRGVjbChYU0F0dEdyb3VwRGVjbCBkZWNsKSB7CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlSG9sZGVyKGRlY2wpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxYU0F0dHJpYnV0ZURlY2w+IGF0dHJpYnV0ZUhvbGRlcihmaW5hbCBYU0F0dENvbnRhaW5lciBhdHRzKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBzcGVjLiBpcyB0aGlzIGNvcnJlY3Q/CisgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5BZGFwdGVyPFhTQXR0cmlidXRlRGVjbCxYU0F0dHJpYnV0ZVVzZT4oYXR0cy5pdGVyYXRlQXR0cmlidXRlVXNlcygpKSB7CisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFhTQXR0cmlidXRlRGVjbCBmaWx0ZXIoWFNBdHRyaWJ1dGVVc2UgdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5nZXREZWNsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0F0dHJpYnV0ZURlY2w+IHNjaGVtYShYU1NjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgICAgIHJldHVybiBzY2hlbWEuaXRlcmF0ZUF0dHJpYnV0ZURlY2xzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJAIjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXM8WFNFbGVtZW50RGVjbD4gRUxFTUVOVCA9IG5ldyBBYnN0cmFjdEF4aXNJbXBsPFhTRWxlbWVudERlY2w+KCkgeworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNFbGVtZW50RGVjbD4gcGFydGljbGUoWFNQYXJ0aWNsZSBwYXJ0aWNsZSkgeworICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbihwYXJ0aWNsZS5nZXRUZXJtKCkuYXNFbGVtZW50RGVjbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0VsZW1lbnREZWNsPiBzY2hlbWEoWFNTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgICAgICByZXR1cm4gc2NoZW1hLml0ZXJhdGVFbGVtZW50RGVjbHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0VsZW1lbnREZWNsPiBtb2RlbEdyb3VwRGVjbChYU01vZGVsR3JvdXBEZWNsIGRlY2wpIHsKKyAgICAgICAgICAgIHJldHVybiBtb2RlbEdyb3VwKGRlY2wuZ2V0TW9kZWxHcm91cCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vcHVibGljIEl0ZXJhdG9yPFhTRWxlbWVudERlY2w+IG1vZGVsR3JvdXAoWFNNb2RlbEdyb3VwIGdyb3VwKSB7CisgICAgICAgIC8vICAgIHJldHVybiBuZXcgSXRlcmF0b3JzLk1hcDxYU0VsZW1lbnREZWNsLFhTUGFydGljbGU+KGdyb3VwLml0ZXJhdG9yKCkpIHsKKyAgICAgICAgLy8gICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjxYU0VsZW1lbnREZWNsPiBhcHBseShYU1BhcnRpY2xlIHApIHsKKyAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gcGFydGljbGUocCk7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgIH07CisgICAgICAgIC8vfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJlbGVtZW50OjoiOworICAgICAgICB9CisgICAgfTsKKworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTVHlwZT4gVFlQRV9ERUZJTklUSU9OID0gbmV3IEFic3RyYWN0QXhpc0ltcGw8WFNUeXBlPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTVHlwZT4gc2NoZW1hKFhTU2NoZW1hIHNjaGVtYSkgeworICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5pdGVyYXRlVHlwZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU1R5cGU+IGF0dHJpYnV0ZURlY2woWFNBdHRyaWJ1dGVEZWNsIGRlY2wpIHsKKyAgICAgICAgICAgIHJldHVybiBzaW5nbGV0b24oZGVjbC5nZXRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTVHlwZT4gZWxlbWVudERlY2woWFNFbGVtZW50RGVjbCBkZWNsKSB7CisgICAgICAgICAgICByZXR1cm4gc2luZ2xldG9uKGRlY2wuZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIn4iOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXhpczxYU1R5cGU+IEJBU0VUWVBFID0gbmV3IEFic3RyYWN0QXhpc0ltcGw8WFNUeXBlPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTVHlwZT4gc2ltcGxlVHlwZShYU1NpbXBsZVR5cGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbih0eXBlLmdldEJhc2VUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTVHlwZT4gY29tcGxleFR5cGUoWFNDb21wbGV4VHlwZSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gc2luZ2xldG9uKHR5cGUuZ2V0QmFzZVR5cGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJiYXNlVHlwZTo6IjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXM8WFNTaW1wbGVUeXBlPiBQUklNSVRJVkVfVFlQRSA9IG5ldyBBYnN0cmFjdEF4aXNJbXBsPFhTU2ltcGxlVHlwZT4oKSB7CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU1NpbXBsZVR5cGU+IHNpbXBsZVR5cGUoWFNTaW1wbGVUeXBlIHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBzaW5nbGV0b24odHlwZS5nZXRQcmltaXRpdmVUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAicHJpbWl0aXZlVHlwZTo6IjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXM8WFNTaW1wbGVUeXBlPiBJVEVNX1RZUEUgPSBuZXcgQWJzdHJhY3RBeGlzSW1wbDxYU1NpbXBsZVR5cGU+KCkgeworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNTaW1wbGVUeXBlPiBzaW1wbGVUeXBlKFhTU2ltcGxlVHlwZSB0eXBlKSB7CisgICAgICAgICAgICBYU0xpc3RTaW1wbGVUeXBlIGJhc2VMaXN0ID0gdHlwZS5nZXRCYXNlTGlzdFR5cGUoKTsKKyAgICAgICAgICAgIGlmKGJhc2VMaXN0PT1udWxsKSAgICAgIHJldHVybiBlbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbihiYXNlTGlzdC5nZXRJdGVtVHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIml0ZW1UeXBlOjoiOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXhpczxYU1NpbXBsZVR5cGU+IE1FTUJFUl9UWVBFID0gbmV3IEFic3RyYWN0QXhpc0ltcGw8WFNTaW1wbGVUeXBlPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTU2ltcGxlVHlwZT4gc2ltcGxlVHlwZShYU1NpbXBsZVR5cGUgdHlwZSkgeworICAgICAgICAgICAgWFNVbmlvblNpbXBsZVR5cGUgYmFzZVVuaW9uID0gdHlwZS5nZXRCYXNlVW5pb25UeXBlKCk7CisgICAgICAgICAgICBpZihiYXNlVW5pb24gPT1udWxsKSAgICAgIHJldHVybiBlbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIGJhc2VVbmlvbi5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAibWVtYmVyVHlwZTo6IjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXM8WFNDb21wb25lbnQ+IFNDT1BFID0gbmV3IEFic3RyYWN0QXhpc0ltcGw8WFNDb21wb25lbnQ+KCkgeworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNDb21wb25lbnQ+IGNvbXBsZXhUeXBlKFhTQ29tcGxleFR5cGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbih0eXBlLmdldFNjb3BlKCkpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMgYSBzY29wZSwgdG9vLgorICAgICAgICAvLyBUT0RPOiBlbGVtZW50IGRlY2xhcmF0aW9uIGhhcyBhIHNjb3BlCisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAic2NvcGU6OiI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTQXR0R3JvdXBEZWNsPiBBVFRSSUJVVEVfR1JPVVAgPSBuZXcgQWJzdHJhY3RBeGlzSW1wbDxYU0F0dEdyb3VwRGVjbD4oKSB7CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0F0dEdyb3VwRGVjbD4gc2NoZW1hKFhTU2NoZW1hIHNjaGVtYSkgeworICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5pdGVyYXRlQXR0R3JvdXBEZWNscygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiYXR0cmlidXRlR3JvdXA6OiI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTTW9kZWxHcm91cERlY2w+IE1PREVMX0dST1VQX0RFQ0wgPSBuZXcgQWJzdHJhY3RBeGlzSW1wbDxYU01vZGVsR3JvdXBEZWNsPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTTW9kZWxHcm91cERlY2w+IHNjaGVtYShYU1NjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgICAgIHJldHVybiBzY2hlbWEuaXRlcmF0ZU1vZGVsR3JvdXBEZWNscygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTTW9kZWxHcm91cERlY2w+IHBhcnRpY2xlKFhTUGFydGljbGUgcGFydGljbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBzaW5nbGV0b24ocGFydGljbGUuZ2V0VGVybSgpLmFzTW9kZWxHcm91cERlY2woKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJncm91cDo6IjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXM8WFNJZGVudGl0eUNvbnN0cmFpbnQ+IElERU5USVRZX0NPTlNUUkFJTlQgPSBuZXcgQWJzdHJhY3RBeGlzSW1wbDxYU0lkZW50aXR5Q29uc3RyYWludD4oKSB7CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0lkZW50aXR5Q29uc3RyYWludD4gZWxlbWVudERlY2woWFNFbGVtZW50RGVjbCBkZWNsKSB7CisgICAgICAgICAgICByZXR1cm4gZGVjbC5nZXRJZGVudGl0eUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0lkZW50aXR5Q29uc3RyYWludD4gc2NoZW1hKFhTU2NoZW1hIHNjaGVtYSkgeworICAgICAgICAgICAgLy8gVE9ETzogaXRlcmF0ZSBhbGwgZWxlbWVudHMgaW4gdGhpcyBzY2hlbWEgKGxvY2FsIG9yIGdsb2JhbCEpIGFuZCBpdHMgaWRlbnRpdHkgY29uc3RyYWludHMKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5zY2hlbWEoc2NoZW1hKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gImlkZW50aXR5Q29uc3RyYWludDo6IjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXM8WFNJZGVudGl0eUNvbnN0cmFpbnQ+IFJFRkVSRU5DRURfS0VZID0gbmV3IEFic3RyYWN0QXhpc0ltcGw8WFNJZGVudGl0eUNvbnN0cmFpbnQ+KCkgeworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WFNJZGVudGl0eUNvbnN0cmFpbnQ+IGlkZW50aXR5Q29uc3RyYWludChYU0lkZW50aXR5Q29uc3RyYWludCBkZWNsKSB7CisgICAgICAgICAgICByZXR1cm4gc2luZ2xldG9uKGRlY2wuZ2V0UmVmZXJlbmNlZEtleSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gImtleTo6IjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXM8WFNOb3RhdGlvbj4gTk9UQVRJT04gPSBuZXcgQWJzdHJhY3RBeGlzSW1wbDxYU05vdGF0aW9uPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTTm90YXRpb24+IHNjaGVtYShYU1NjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgICAgIHJldHVybiBzY2hlbWEuaXRlcmF0ZU5vdGF0aW9ucygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAibm90YXRpb246OiI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTV2lsZGNhcmQ+IFdJTERDQVJEID0gbmV3IEFic3RyYWN0QXhpc0ltcGw8WFNXaWxkY2FyZD4oKSB7CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU1dpbGRjYXJkPiBwYXJ0aWNsZShYU1BhcnRpY2xlIHBhcnRpY2xlKSB7CisgICAgICAgICAgICByZXR1cm4gc2luZ2xldG9uKHBhcnRpY2xlLmdldFRlcm0oKS5hc1dpbGRjYXJkKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiYW55OjoiOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXhpczxYU1dpbGRjYXJkPiBBVFRSSUJVVEVfV0lMRENBUkQgPSBuZXcgQWJzdHJhY3RBeGlzSW1wbDxYU1dpbGRjYXJkPigpIHsKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTV2lsZGNhcmQ+IGNvbXBsZXhUeXBlKFhTQ29tcGxleFR5cGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbih0eXBlLmdldEF0dHJpYnV0ZVdpbGRjYXJkKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFhTV2lsZGNhcmQ+IGF0dEdyb3VwRGVjbChYU0F0dEdyb3VwRGVjbCBkZWNsKSB7CisgICAgICAgICAgICByZXR1cm4gc2luZ2xldG9uKGRlY2wuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJhbnlBdHRyaWJ1dGU6OiI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTRmFjZXQ+IEZBQ0VUID0gbmV3IEFic3RyYWN0QXhpc0ltcGw8WFNGYWNldD4oKSB7CisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU0ZhY2V0PiBzaW1wbGVUeXBlKFhTU2ltcGxlVHlwZSB0eXBlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpdCdzIG5vdCBjbGVhciBpZiAiZmFjZXRzIiBtZWFuIGFsbCBpbmhlcml0ZWQgZmFjZXRzIG9yIGp1c3QgZGVjbGFyZWQgZmFjZXRzCisgICAgICAgICAgICBYU1Jlc3RyaWN0aW9uU2ltcGxlVHlwZSByID0gdHlwZS5hc1Jlc3RyaWN0aW9uKCk7CisgICAgICAgICAgICBpZihyIT1udWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByLml0ZXJhdGVEZWNsYXJlZEZhY2V0cygpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiZmFjZXQ6OiI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzPFhTTW9kZWxHcm91cD4gTU9ERUxHUk9VUF9BTEwgPSBuZXcgTW9kZWxHcm91cEF4aXMoQ29tcG9zaXRvci5BTEwpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXhpczxYU01vZGVsR3JvdXA+IE1PREVMR1JPVVBfQ0hPSUNFID0gbmV3IE1vZGVsR3JvdXBBeGlzKENvbXBvc2l0b3IuQ0hPSUNFKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXM8WFNNb2RlbEdyb3VwPiBNT0RFTEdST1VQX1NFUVVFTkNFID0gbmV3IE1vZGVsR3JvdXBBeGlzKENvbXBvc2l0b3IuU0VRVUVOQ0UpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXhpczxYU01vZGVsR3JvdXA+IE1PREVMR1JPVVBfQU5ZID0gbmV3IE1vZGVsR3JvdXBBeGlzKG51bGwpOworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE1vZGVsR3JvdXBBeGlzIGV4dGVuZHMgQWJzdHJhY3RBeGlzSW1wbDxYU01vZGVsR3JvdXA+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBYU01vZGVsR3JvdXAuQ29tcG9zaXRvciBjb21wb3NpdG9yOworCisgICAgICAgIE1vZGVsR3JvdXBBeGlzKENvbXBvc2l0b3IgY29tcG9zaXRvcikgeworICAgICAgICAgICAgdGhpcy5jb21wb3NpdG9yID0gY29tcG9zaXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGVsR3JvdXAoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU01vZGVsR3JvdXA+IHBhcnRpY2xlKFhTUGFydGljbGUgcGFydGljbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXIocGFydGljbGUuZ2V0VGVybSgpLmFzTW9kZWxHcm91cCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxYU01vZGVsR3JvdXA+IG1vZGVsR3JvdXBEZWNsKFhTTW9kZWxHcm91cERlY2wgZGVjbCkgeworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcihkZWNsLmdldE1vZGVsR3JvdXAoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPFhTTW9kZWxHcm91cD4gZmlsdGVyKFhTTW9kZWxHcm91cCBtZykgeworICAgICAgICAgICAgaWYobWc9PW51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgICAgICAgICBpZihtZy5nZXRDb21wb3NpdG9yKCkgPT0gY29tcG9zaXRvciB8fCBjb21wb3NpdG9yID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbihtZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgaWYoY29tcG9zaXRvcj09bnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIm1vZGVsOjoqIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gIm1vZGVsOjoiK2NvbXBvc2l0b3I7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL0l0ZXJhdG9ycy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9JdGVyYXRvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzlmODVmCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9JdGVyYXRvcnMuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuc2NkOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvKioKKyAqIFZhcmlvdXMgY29udmVuaWVudCB7QGxpbmsgSXRlcmF0b3J9IGltcGxlbWVudGF0aW9ucy4KKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqLworcHVibGljIGNsYXNzIEl0ZXJhdG9ycyB7CisKKyAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVhZE9ubHk8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2UgbmVlZCB0byBydW4gb24gSkRLIDEuNAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOworCisgICAgcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gZW1wdHkoKSB7CisgICAgICAgIHJldHVybiBFTVBUWTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiBzaW5nbGV0b24oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IFNpbmdsZXRvbjxUPih2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIEl0ZXJhdG9yfSB0aGF0IHJldHVybnMgYSBzaW5nbGUgKG9yIG5vKSB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ2xldG9uPFQ+IGV4dGVuZHMgUmVhZE9ubHk8VD4geworICAgICAgICBwcml2YXRlIFQgbmV4dDsKKworICAgICAgICBTaW5nbGV0b24oVCBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0IT1udWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgbmV4dCgpIHsKKyAgICAgICAgICAgIFQgciA9IG5leHQ7CisgICAgICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIEl0ZXJhdG9yfSB0aGF0IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfSBhbmQgY2hhbmdlcyBpdHMgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFkYXB0ZXI8VCxVPiBleHRlbmRzIFJlYWRPbmx5PFQ+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgVT4gY29yZTsKKworICAgICAgICBwdWJsaWMgQWRhcHRlcihJdGVyYXRvcjw/IGV4dGVuZHMgVT4gY29yZSkgeworICAgICAgICAgICAgdGhpcy5jb3JlID0gY29yZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29yZS5oYXNOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcihjb3JlLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBmaWx0ZXIoVSB1KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgZWFjaCBVLCBhcHBseSBVLT5JdGVyYXRvciZsdDtUPiBmdW5jdGlvbiBhbmQgdGhlbiBpdGVyYXRlIGFsbAorICAgICAqIHRoZSByZXN1bHRpbmcgVC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIE1hcDxULFU+IGV4dGVuZHMgUmVhZE9ubHk8VD4geworICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBVPiBjb3JlOworCisgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGN1cnJlbnQ7CisKKyAgICAgICAgcHJvdGVjdGVkIE1hcChJdGVyYXRvcjw/IGV4dGVuZHMgVT4gY29yZSkgeworICAgICAgICAgICAgdGhpcy5jb3JlID0gY29yZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICB3aGlsZShjdXJyZW50PT1udWxsIHx8ICFjdXJyZW50Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmKCFjb3JlLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIG5vdGhpbmcgbW9yZSB0byBlbnVtZXJhdGUKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gYXBwbHkoY29yZS5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQubmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBhcHBseShVIHUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBvdXQgb2JqZWN0cyBmcm9tIGFub3RoZXIgaXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaWx0ZXI8VD4gZXh0ZW5kcyBSZWFkT25seTxUPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGNvcmU7CisgICAgICAgIHByaXZhdGUgVCBuZXh0OworCisgICAgICAgIHByb3RlY3RlZCBGaWx0ZXIoSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGNvcmUpIHsKKyAgICAgICAgICAgIHRoaXMuY29yZSA9IGNvcmU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRydWUgdG8gcmV0YWluIHRoZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIG1hdGNoZXMoVCB2YWx1ZSk7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHdoaWxlKGNvcmUuaGFzTmV4dCgpICYmIG5leHQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gY29yZS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYoIW1hdGNoZXMobmV4dCkpCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV4dCE9bnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIG5leHQoKSB7CisgICAgICAgICAgICBpZihuZXh0PT1udWxsKSAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBUIHIgPSBuZXh0OworICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9ubHkgcmV0dXJuIHVuaXF1ZSBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgVW5pcXVlPFQ+IGV4dGVuZHMgRmlsdGVyPFQ+IHsKKyAgICAgICAgcHJpdmF0ZSBTZXQ8VD4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8VD4oKTsKKyAgICAgICAgcHVibGljIFVuaXF1ZShJdGVyYXRvcjw/IGV4dGVuZHMgVD4gY29yZSkgeworICAgICAgICAgICAgc3VwZXIoY29yZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKFQgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuYWRkKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVuaW9uIG9mIHR3byBpdGVyYXRvcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVbmlvbjxUPiBleHRlbmRzIFJlYWRPbmx5PFQ+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgVD4gZmlyc3Qsc2Vjb25kOworCisgICAgICAgIHB1YmxpYyBVbmlvbihJdGVyYXRvcjw/IGV4dGVuZHMgVD4gZmlyc3QsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBzZWNvbmQpIHsKKyAgICAgICAgICAgIHRoaXMuZmlyc3QgPSBmaXJzdDsKKyAgICAgICAgICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmaXJzdC5oYXNOZXh0KCkgfHwgc2Vjb25kLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIG5leHQoKSB7CisgICAgICAgICAgICBpZihmaXJzdC5oYXNOZXh0KCkpICAgICByZXR1cm4gZmlyc3QubmV4dCgpOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlY29uZC5uZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcnJheSBpdGVyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFycmF5PFQ+IGV4dGVuZHMgUmVhZE9ubHk8VD4geworICAgICAgICBwcml2YXRlIGZpbmFsIFRbXSBpdGVtczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW5kZXg9MDsKKyAgICAgICAgcHVibGljIEFycmF5KFRbXSBpdGVtcykgeworICAgICAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDxpdGVtcy5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1zW2luZGV4KytdOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9QYXJzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzU2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuc2NkOworCisvKioKKyAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCisgKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQorICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAorICogcGFyc2VyLgorICoKKyAqIFlvdSBjYW4gbW9kaWZ5IHRoaXMgY2xhc3MgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgcmVwb3J0aW5nCisgKiBtZWNoYW5pc21zIHNvIGxvbmcgYXMgeW91IHJldGFpbiB0aGUgcHVibGljIGZpZWxkcy4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcworICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4gIFRoZSBib29sZWFuCisgICAqIGZsYWcgInNwZWNpYWxDb25zdHJ1Y3RvciIgaXMgYWxzbyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0CisgICAqIHRoaXMgY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0LgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGl0cyBzdXBlciBjbGFzcyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKKyAgICogdG8gZm9yY2UgdGhlICJ0b1N0cmluZyIgbWV0aG9kIG9mIHBhcmVudCBjbGFzcyAiVGhyb3dhYmxlIiB0bworICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKKyAgICogICAgIFBhcnNlRXhjZXB0aW9uOiA8cmVzdWx0IG9mIGdldE1lc3NhZ2U+CisgICAqLworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAorICAgICAgICAgICAgICAgICAgICAgICApCisgIHsKKyAgICBzdXBlcigiIik7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7CisgICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7CisgICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgorICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCisgICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCisgICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCisgICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgorICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCisgICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KKyAgICovCisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCk7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hpY2ggY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlCisgICAqIHRoaXMgb2JqZWN0IGFuZCB0aGVyZWJ5IGFmZmVjdHMgdGhlIHNlbWFudGljcyBvZiB0aGUKKyAgICogImdldE1lc3NhZ2UiIG1ldGhvZCAoc2VlIGJlbG93KS4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHNwZWNpYWxDb25zdHJ1Y3RvcjsKKworICAvKioKKyAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCisgICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgorICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgorICAgKi8KKyAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKKworICAvKioKKyAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQorICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCisgICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KKyAgICovCisgIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCisgICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcworICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIHdoZW4gdGhpcyBvYmplY3QgaGFzIGJlZW4KKyAgICogY3JlYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3JzLiAgT3RoZXJ3aXNlLCBpdCB1c2VzCisgICAqICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQorICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAorICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCisgICAqIGZyb20gdGhlIHBhcnNlciksIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJpbnRpbmcKKyAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQorICAgKiBnZXRzIGRpc3BsYXllZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikgeworICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICB9CisgICAgU3RyaW5nQnVmZmVyIGV4cGVjdGVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGludCBtYXhTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKKyAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCh0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dKS5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKyAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQoIi4uLiIpOworICAgICAgfQorICAgICAgZXhwZWN0ZWQuYXBwZW5kKGVvbCkuYXBwZW5kKCIgICAgIik7CisgICAgfQorICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOworICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOworICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7CisgICAgICB0b2sgPSB0b2submV4dDsKKyAgICB9CisgICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOworICAgIHJldHZhbCArPSAiLiIgKyBlb2w7CisgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKKyAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOworICAgIH0gZWxzZSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7CisgICAgfQorICAgIHJldHZhbCArPSBleHBlY3RlZC50b1N0cmluZygpOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisKKyAgLyoqCisgICAqIFVzZWQgdG8gY29udmVydCByYXcgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIHZlcnNpb24KKyAgICogd2hlbiB0aGVzZSByYXcgdmVyc2lvbiBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGFuIEFTQ0lJCisgICAqIHN0cmluZyBsaXRlcmFsLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBhZGRfZXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgY2hhciBjaDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgICB7CisgICAgICAgICAgIGNhc2UgMCA6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9TQ0RJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1NDREltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjNhYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9TQ0RJbXBsLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuc2NkOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5TQ0Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0NvbXBvbmVudDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBTY2hlbWEgY29tcG9uZW50IGRlc2lnbmF0b3IuCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU0NESW1wbCBleHRlbmRzIFNDRCB7CisgICAgLyoqCisgICAgICogU0NEIGlzIGZ1bmRhbWVudGFsbHkgYSBsaXN0IG9mIHN0ZXBzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RlcFtdIHN0ZXBzOworCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbmFsIHRleHR1YWwgU0NEIHJlcHJlc2VudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRleHQ7CisKKyAgICBwdWJsaWMgU0NESW1wbChTdHJpbmcgdGV4dCwgU3RlcFtdIHN0ZXBzKSB7CisgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgIHRoaXMuc3RlcHMgPSBzdGVwczsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8WFNDb21wb25lbnQ+IHNlbGVjdChJdGVyYXRvcjw/IGV4dGVuZHMgWFNDb21wb25lbnQ+IGNvbnRleHROb2RlKSB7CisgICAgICAgIEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBub2RlU2V0ID0gKEl0ZXJhdG9yKWNvbnRleHROb2RlOworCisgICAgICAgIGludCBsZW4gPSBzdGVwcy5sZW5ndGg7CisgICAgICAgIGZvciggaW50IGk9MDsgaTxsZW47IGkrKyApIHsKKyAgICAgICAgICAgIGlmKGkhPTAgJiYgaSE9bGVuLTEgJiYgIXN0ZXBzW2ktMV0uYXhpcy5pc01vZGVsR3JvdXAoKSAmJiBzdGVwc1tpXS5heGlzLmlzTW9kZWxHcm91cCgpKSB7CisgICAgICAgICAgICAgICAgLy8gZXhwYW5kIHRoZSBjdXJyZW50IG5vZGVzZXQgYnkgYWRkaW5nIGFiYnJldmlhdGFibGUgY29tcGxleCB0eXBlIGFuZCBtb2RlbCBncm91cHMuCisgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHN1Y2ggZXhwYW5zaW9uIGlzIG5vdCBhbGxvd2VkIHRvIG9jY3VyZSBpbiBpbiBiZXR3ZWVuIG1vZGVsIGdyb3VwIGF4ZXMuCisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHN0ZXAgaXMgbm90IG5lZWRlZCBpZiB0aGUgbmV4dCBzdGVwIGlzIGtub3duIG5vdCB0byByZWFjdCB0bworICAgICAgICAgICAgICAgIC8vIGNvbXBsZXggdHlwZSBub3IgbW9kZWwgZ3JvdXBzLCBzdWNoIGFzLCBzYXkgQXhpcy5GQUNFVAorICAgICAgICAgICAgICAgIG5vZGVTZXQgPSBuZXcgSXRlcmF0b3JzLlVuaXF1ZTxYU0NvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgICAgIG5ldyBJdGVyYXRvcnMuTWFwPFhTQ29tcG9uZW50LFhTQ29tcG9uZW50Pihub2RlU2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8WFNDb21wb25lbnQ+IGFwcGx5KFhTQ29tcG9uZW50IHUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5VbmlvbjxYU0NvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9ycy5zaW5nbGV0b24odSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXMuSU5URVJNRURJQVRFX1NLSVAuaXRlcmF0b3IodSkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlU2V0ID0gc3RlcHNbaV0uZXZhbHVhdGUobm9kZVNldCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbm9kZVNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1NDRFBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9TQ0RQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzk3YWIzCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9TQ0RQYXJzZXIuamF2YQpAQCAtMCwwICsxLDU2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTQ0RQYXJzZXIuamF2YSAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuc2NkOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5VTmFtZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLio7CisKK3B1YmxpYyBjbGFzcyBTQ0RQYXJzZXIgaW1wbGVtZW50cyBTQ0RQYXJzZXJDb25zdGFudHMgeworICBwcml2YXRlIE5hbWVzcGFjZUNvbnRleHQgbnNjOworICBwdWJsaWMgU0NEUGFyc2VyKFN0cmluZyB0ZXh0LE5hbWVzcGFjZUNvbnRleHQgbnNjKSB7CisgICAgdGhpcyhuZXcgU3RyaW5nUmVhZGVyKHRleHQpKTsKKyAgICB0aGlzLm5zYyA9IG5zYzsKKyAgfQorICBwcml2YXRlIFN0cmluZyB0cmltKFN0cmluZyBzKSB7CisgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDEscy5sZW5ndGgoKS0xKTsKKyAgfQorICBwcml2YXRlIFN0cmluZyByZXNvbHZlUHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFN0cmluZyByPW5zYy5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKKyAgICAgIC8vIGdycnIhIQorICAgICAgaWYocHJlZml4LmVxdWFscygiIikpCisgICAgICAgIHJldHVybiByOworICAgICAgaWYoIXIuZXF1YWxzKCIiKSkKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSBjYXRjaCggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKSB7CisgICAgICA7IC8vIHJlcG9ydCBhbiBlcnJvcgorICAgIH0KKyAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlVuYm91bmQgcHJlZml4OiAiK3ByZWZpeCk7CisgIH0KKworICAvLyAiW146XSsiCisgIGZpbmFsIHB1YmxpYyBVTmFtZSBRTmFtZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICBUb2tlbiBwLGw9bnVsbDsKKyAgICBwID0gampfY29uc3VtZV90b2tlbihOQ05BTUUpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgMTU6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDE1KTsKKyAgICAgIGwgPSBqal9jb25zdW1lX3Rva2VuKE5DTkFNRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzBdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBpZihsPT1udWxsKQorICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFVOYW1lKHJlc29sdmVQcmVmaXgoIiIpLHAuaW1hZ2UpO30KKyAgICBlbHNlCisgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgVU5hbWUocmVzb2x2ZVByZWZpeChwLmltYWdlKSxsLmltYWdlKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBTdHJpbmcgUHJlZml4KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gcDsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIE5DTkFNRToKKyAgICAgIHAgPSBqal9jb25zdW1lX3Rva2VuKE5DTkFNRSk7CisgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJlc29sdmVQcmVmaXgocC5pbWFnZSk7fQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxXSA9IGpqX2dlbjsKKyAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJlc29sdmVQcmVmaXgoIiIpO30KKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IFJlbGF0aXZlU2NoZW1hQ29tcG9uZW50UGF0aCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIExpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgIFN0ZXAgczsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMTc6CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMTYpOworICAgICAgICAgIHN0ZXBzLmFkZChuZXcgU3RlcC5BbnkoQXhpcy5ST09UKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNzoKKyAgICAgICAgampfY29uc3VtZV90b2tlbigxNyk7CisgICAgICAgICAgc3RlcHMuYWRkKG5ldyBTdGVwLkFueShBeGlzLkRFU0NFTkRBTlRTKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzJdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzNdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBzID0gU3RlcCgpOworICAgICAgICAgICAgc3RlcHMuYWRkKHMpOworICAgIGxhYmVsXzE6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSAxNjoKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzE7CisgICAgICB9CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMTYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMTcpOworICAgICAgICAgICAgc3RlcHMuYWRkKG5ldyBTdGVwLkFueShBeGlzLkRFU0NFTkRBTlRTKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzVdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICBzID0gU3RlcCgpOworICAgICAgICAgICAgICBzdGVwcy5hZGQocyk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHN0ZXBzO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN0ZXAgU3RlcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFN0ZXAgczsgU3RyaW5nIHA7IFRva2VuIG47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSAxODoKKyAgICBjYXNlIDE5OgorICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIDE4OgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKDE4KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE5OgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKDE5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNl0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHMgPSBOYW1lT3JXaWxkY2FyZChBeGlzLkFUVFJJQlVURSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5DTkFNRToKKyAgICBjYXNlIDIwOgorICAgIGNhc2UgNDU6CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgMjA6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMjApOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs3XSA9IGpqX2dlbjsKKyAgICAgICAgOworICAgICAgfQorICAgICAgcyA9IE5hbWVPcldpbGRjYXJkKEF4aXMuRUxFTUVOVCk7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgTlVNQkVSOgorICAgICAgICBQcmVkaWNhdGUocyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzhdID0gampfZ2VuOworICAgICAgICA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDIxOgorICAgICAgampfY29uc3VtZV90b2tlbigyMSk7CisgICAgICBzID0gTmFtZU9yV2lsZGNhcmQoQXhpcy5TVUJTVElUVVRJT05fR1JPVVApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjoKKyAgICBjYXNlIDIzOgorICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIDIyOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKDIyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIzOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKDIzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOV0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHMgPSBOYW1lT3JXaWxkY2FyZE9yQW5vbnltb3VzKEF4aXMuVFlQRV9ERUZJTklUSU9OKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDI0KTsKKyAgICAgIHMgPSBOYW1lT3JXaWxkY2FyZChBeGlzLkJBU0VUWVBFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjU6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDI1KTsKKyAgICAgIHMgPSBOYW1lT3JXaWxkY2FyZChBeGlzLlBSSU1JVElWRV9UWVBFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjY6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDI2KTsKKyAgICAgIHMgPSBOYW1lT3JXaWxkY2FyZE9yQW5vbnltb3VzKEF4aXMuSVRFTV9UWVBFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjc6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDI3KTsKKyAgICAgIHMgPSBOYW1lT3JXaWxkY2FyZE9yQW5vbnltb3VzKEF4aXMuTUVNQkVSX1RZUEUpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgUHJlZGljYXRlKHMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMF0gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjg6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDI4KTsKKyAgICAgIHMgPSBOYW1lT3JXaWxkY2FyZE9yQW5vbnltb3VzKEF4aXMuU0NPUEUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOToKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMjkpOworICAgICAgcyA9IE5hbWVPcldpbGRjYXJkKEF4aXMuQVRUUklCVVRFX0dST1VQKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzA6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDMwKTsKKyAgICAgIHMgPSBOYW1lT3JXaWxkY2FyZChBeGlzLk1PREVMX0dST1VQX0RFQ0wpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMToKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzEpOworICAgICAgcyA9IE5hbWVPcldpbGRjYXJkKEF4aXMuSURFTlRJVFlfQ09OU1RSQUlOVCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgampfY29uc3VtZV90b2tlbigzMik7CisgICAgICBzID0gTmFtZU9yV2lsZGNhcmQoQXhpcy5SRUZFUkVOQ0VEX0tFWSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMzOgorICAgICAgampfY29uc3VtZV90b2tlbigzMyk7CisgICAgICBzID0gTmFtZU9yV2lsZGNhcmQoQXhpcy5OT1RBVElPTik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM0OgorICAgICAgampfY29uc3VtZV90b2tlbigzNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzPW5ldyBTdGVwLkFueShBeGlzLk1PREVMR1JPVVBfU0VRVUVOQ0UpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgUHJlZGljYXRlKHMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMV0gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzU6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDM1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuQW55KEF4aXMuTU9ERUxHUk9VUF9DSE9JQ0UpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgUHJlZGljYXRlKHMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMl0gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzY6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDM2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuQW55KEF4aXMuTU9ERUxHUk9VUF9BTEwpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgUHJlZGljYXRlKHMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxM10gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzc6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDM3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuQW55KEF4aXMuTU9ERUxHUk9VUF9BTlkpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgUHJlZGljYXRlKHMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNF0gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzg6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDM4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuQW55KEF4aXMuV0lMRENBUkQpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgUHJlZGljYXRlKHMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNV0gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzk6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDM5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuQW55KEF4aXMuQVRUUklCVVRFX1dJTERDQVJEKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDA6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDQwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuQW55KEF4aXMuRkFDRVQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0MToKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oNDEpOworICAgICAgbiA9IGpqX2NvbnN1bWVfdG9rZW4oRkFDRVROQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuRmFjZXQoQXhpcy5GQUNFVCxuLmltYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDI6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDQyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuQW55KEF4aXMuREVTQ0VOREFOVFMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0MzoKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oNDMpOworICAgICAgcCA9IFByZWZpeCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcz1uZXcgU3RlcC5TY2hlbWEoQXhpcy5YX1NDSEVNQSxwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDQ6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDQ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHM9bmV3IFN0ZXAuQW55KEF4aXMuWF9TQ0hFTUEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNl0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgIHtpZiAodHJ1ZSkgcmV0dXJuIHM7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgU3RlcCBOYW1lT3JXaWxkY2FyZChBeGlzIGEpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5hbWUgdW47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBOQ05BTUU6CisgICAgICB1biA9IFFOYW1lKCk7CisgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgU3RlcC5OYW1lZChhLHVuKTt9CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ1OgorICAgICAgampfY29uc3VtZV90b2tlbig0NSk7CisgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgU3RlcC5BbnkoYSk7fQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxN10gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN0ZXAgTmFtZU9yV2lsZGNhcmRPckFub255bW91cyhBeGlzIGEpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTmFtZSB1bjsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIE5DTkFNRToKKyAgICAgIHVuID0gUU5hbWUoKTsKKyAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBTdGVwLk5hbWVkKGEsdW4pO30KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDU6CisgICAgICBqal9jb25zdW1lX3Rva2VuKDQ1KTsKKyAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBTdGVwLkFueShhKTt9CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ2OgorICAgICAgampfY29uc3VtZV90b2tlbig0Nik7CisgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBTdGVwLkFub255bW91c1R5cGUoYSk7fQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxOF0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIGludCBQcmVkaWNhdGUoU3RlcCBzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUb2tlbiB0OworICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE5VTUJFUik7CisgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBzLnByZWRpY2F0ZT1JbnRlZ2VyLnBhcnNlSW50KHRyaW0odC5pbWFnZSkpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgcHVibGljIFNDRFBhcnNlclRva2VuTWFuYWdlciB0b2tlbl9zb3VyY2U7CisgIFNpbXBsZUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOworICBwdWJsaWMgVG9rZW4gdG9rZW4sIGpqX250OworICBwcml2YXRlIGludCBqal9udGs7CisgIHByaXZhdGUgaW50IGpqX2dlbjsKKyAgZmluYWwgcHJpdmF0ZSBpbnRbXSBqal9sYTEgPSBuZXcgaW50WzE5XTsKKyAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzA7CisgIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8xOworICBzdGF0aWMgeworICAgICAgampfbGExXzAoKTsKKyAgICAgIGpqX2xhMV8xKCk7CisgICB9CisgICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8wKCkgeworICAgICAgampfbGExXzAgPSBuZXcgaW50W10gezB4ODAwMCwweDEwMDAsMHgzMDAwMCwweDMwMDAwLDB4MzAwMDAsMHgzMDAwMCwweGMwMDAwLDB4MTAwMDAwLDB4MjAwMCwweGMwMDAwMCwweDIwMDAsMHgyMDAwLDB4MjAwMCwweDIwMDAsMHgyMDAwLDB4MjAwMCwweGZmZmMxMDAwLDB4MTAwMCwweDEwMDAsfTsKKyAgIH0KKyAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzEoKSB7CisgICAgICBqal9sYTFfMSA9IG5ldyBpbnRbXSB7MHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4M2ZmZiwweDIwMDAsMHg2MDAwLH07CisgICB9CisKKyAgcHVibGljIFNDRFBhcnNlcihqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICB0aGlzKHN0cmVhbSwgbnVsbCk7CisgIH0KKyAgcHVibGljIFNDRFBhcnNlcihqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgdHJ5IHsgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KKyAgICB0b2tlbl9zb3VyY2UgPSBuZXcgU0NEUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTk7IGkrKykgampfbGExW2ldID0gLTE7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgUmVJbml0KHN0cmVhbSwgbnVsbCk7CisgIH0KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICB0cnkgeyBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgZW5jb2RpbmcsIDEsIDEpOyB9IGNhdGNoKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOyB9CisgICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE5OyBpKyspIGpqX2xhMVtpXSA9IC0xOworICB9CisKKyAgcHVibGljIFNDRFBhcnNlcihqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKKyAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOworICAgIHRva2VuX3NvdXJjZSA9IG5ldyBTQ0RQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOTsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKKyAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7CisgICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE5OyBpKyspIGpqX2xhMVtpXSA9IC0xOworICB9CisKKyAgcHVibGljIFNDRFBhcnNlcihTQ0RQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKKyAgICB0b2tlbl9zb3VyY2UgPSB0bTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOTsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChTQ0RQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKKyAgICB0b2tlbl9zb3VyY2UgPSB0bTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOTsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgVG9rZW4gampfY29uc3VtZV90b2tlbihpbnQga2luZCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICBUb2tlbiBvbGRUb2tlbjsKKyAgICBpZiAoKG9sZFRva2VuID0gdG9rZW4pLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGlmICh0b2tlbi5raW5kID09IGtpbmQpIHsKKyAgICAgIGpqX2dlbisrOworICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICB0b2tlbiA9IG9sZFRva2VuOworICAgIGpqX2tpbmQgPSBraW5kOworICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSB7CisgICAgaWYgKHRva2VuLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbisrOworICAgIHJldHVybiB0b2tlbjsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKKyAgICBUb2tlbiB0ID0gdG9rZW47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7CisgICAgICBpZiAodC5uZXh0ICE9IG51bGwpIHQgPSB0Lm5leHQ7CisgICAgICBlbHNlIHQgPSB0Lm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7CisgICAgfQorICAgIHJldHVybiB0OworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBpbnQgampfbnRrKCkgeworICAgIGlmICgoampfbnQ9dG9rZW4ubmV4dCkgPT0gbnVsbCkKKyAgICAgIHJldHVybiAoampfbnRrID0gKHRva2VuLm5leHQ9dG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpKS5raW5kKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKGpqX250ayA9IGpqX250LmtpbmQpOworICB9CisKKyAgcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGpqX2V4cGVudHJpZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOworICBwcml2YXRlIGludFtdIGpqX2V4cGVudHJ5OworICBwcml2YXRlIGludCBqal9raW5kID0gLTE7CisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKSB7CisgICAgampfZXhwZW50cmllcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgIGJvb2xlYW5bXSBsYTF0b2tlbnMgPSBuZXcgYm9vbGVhbls0N107CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0NzsgaSsrKSB7CisgICAgICBsYTF0b2tlbnNbaV0gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGpqX2tpbmQgPj0gMCkgeworICAgICAgbGExdG9rZW5zW2pqX2tpbmRdID0gdHJ1ZTsKKyAgICAgIGpqX2tpbmQgPSAtMTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOTsgaSsrKSB7CisgICAgICBpZiAoampfbGExW2ldID09IGpqX2dlbikgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyBqKyspIHsKKyAgICAgICAgICBpZiAoKGpqX2xhMV8wW2ldICYgKDE8PGopKSAhPSAwKSB7CisgICAgICAgICAgICBsYTF0b2tlbnNbal0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGpqX2xhMV8xW2ldICYgKDE8PGopKSAhPSAwKSB7CisgICAgICAgICAgICBsYTF0b2tlbnNbMzIral0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ3OyBpKyspIHsKKyAgICAgIGlmIChsYTF0b2tlbnNbaV0pIHsKKyAgICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50WzFdOworICAgICAgICBqal9leHBlbnRyeVswXSA9IGk7CisgICAgICAgIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7CisgICAgICB9CisgICAgfQorICAgIGludFtdW10gZXhwdG9rc2VxID0gbmV3IGludFtqal9leHBlbnRyaWVzLnNpemUoKV1bXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGV4cHRva3NlcVtpXSA9IChpbnRbXSlqal9leHBlbnRyaWVzLmVsZW1lbnRBdChpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBQYXJzZUV4Y2VwdGlvbih0b2tlbiwgZXhwdG9rc2VxLCB0b2tlbkltYWdlKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyB2b2lkIGVuYWJsZV90cmFjaW5nKCkgeworICB9CisKKyAgZmluYWwgcHVibGljIHZvaWQgZGlzYWJsZV90cmFjaW5nKCkgeworICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9zY2QvU0NEUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1NDRFBhcnNlckNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDAzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1NDRFBhcnNlckNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU0NEUGFyc2VyQ29uc3RhbnRzLmphdmEgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnNjZDsKKworcHVibGljIGludGVyZmFjZSBTQ0RQYXJzZXJDb25zdGFudHMgeworCisgIGludCBFT0YgPSAwOworICBpbnQgTGV0dGVyID0gNjsKKyAgaW50IEJhc2VDaGFyID0gNzsKKyAgaW50IElkZW9ncmFwaGljID0gODsKKyAgaW50IENvbWJpbmluZ0NoYXIgPSA5OworICBpbnQgVW5pY29kZURpZ2l0ID0gMTA7CisgIGludCBFeHRlbmRlciA9IDExOworICBpbnQgTkNOQU1FID0gMTI7CisgIGludCBOVU1CRVIgPSAxMzsKKyAgaW50IEZBQ0VUTkFNRSA9IDE0OworCisgIGludCBERUZBVUxUID0gMDsKKworICBTdHJpbmdbXSB0b2tlbkltYWdlID0geworICAgICI8RU9GPiIsCisgICAgIlwiIFwiIiwKKyAgICAiXCJcXHRcIiIsCisgICAgIlwiXFxuXCIiLAorICAgICJcIlxcclwiIiwKKyAgICAiXCJcXGZcIiIsCisgICAgIjxMZXR0ZXI+IiwKKyAgICAiPEJhc2VDaGFyPiIsCisgICAgIjxJZGVvZ3JhcGhpYz4iLAorICAgICI8Q29tYmluaW5nQ2hhcj4iLAorICAgICI8VW5pY29kZURpZ2l0PiIsCisgICAgIjxFeHRlbmRlcj4iLAorICAgICI8TkNOQU1FPiIsCisgICAgIjxOVU1CRVI+IiwKKyAgICAiPEZBQ0VUTkFNRT4iLAorICAgICJcIjpcIiIsCisgICAgIlwiL1wiIiwKKyAgICAiXCIvL1wiIiwKKyAgICAiXCJhdHRyaWJ1dGU6OlwiIiwKKyAgICAiXCJAXCIiLAorICAgICJcImVsZW1lbnQ6OlwiIiwKKyAgICAiXCJzdWJzdGl0dXRpb25Hcm91cDo6XCIiLAorICAgICJcInR5cGU6OlwiIiwKKyAgICAiXCJ+XCIiLAorICAgICJcImJhc2VUeXBlOjpcIiIsCisgICAgIlwicHJpbWl0aXZlVHlwZTo6XCIiLAorICAgICJcIml0ZW1UeXBlOjpcIiIsCisgICAgIlwibWVtYmVyVHlwZTo6XCIiLAorICAgICJcInNjb3BlOjpcIiIsCisgICAgIlwiYXR0cmlidXRlR3JvdXA6OlwiIiwKKyAgICAiXCJncm91cDo6XCIiLAorICAgICJcImlkZW50aXR5Q29udHJhaW50OjpcIiIsCisgICAgIlwia2V5OjpcIiIsCisgICAgIlwibm90YXRpb246OlwiIiwKKyAgICAiXCJtb2RlbDo6c2VxdWVuY2VcIiIsCisgICAgIlwibW9kZWw6OmNob2ljZVwiIiwKKyAgICAiXCJtb2RlbDo6YWxsXCIiLAorICAgICJcIm1vZGVsOjoqXCIiLAorICAgICJcImFueTo6KlwiIiwKKyAgICAiXCJhbnlBdHRyaWJ1dGU6OipcIiIsCisgICAgIlwiZmFjZXQ6OipcIiIsCisgICAgIlwiZmFjZXQ6OlwiIiwKKyAgICAiXCJjb21wb25lbnQ6OipcIiIsCisgICAgIlwieC1zY2hlbWE6OlwiIiwKKyAgICAiXCJ4LXNjaGVtYTo6KlwiIiwKKyAgICAiXCIqXCIiLAorICAgICJcIjBcIiIsCisgIH07CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9zY2QvU0NEUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1NDRFBhcnNlclRva2VuTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzlhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1NDRFBhcnNlclRva2VuTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjQ1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTQ0RQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSAqLworcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuc2NkOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuVU5hbWU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS4qOworCitwdWJsaWMgY2xhc3MgU0NEUGFyc2VyVG9rZW5NYW5hZ2VyIGltcGxlbWVudHMgU0NEUGFyc2VyQ29uc3RhbnRzCit7CisgIHB1YmxpYyAgamF2YS5pby5QcmludFN0cmVhbSBkZWJ1Z1N0cmVhbSA9IFN5c3RlbS5vdXQ7CisgIHB1YmxpYyAgdm9pZCBzZXREZWJ1Z1N0cmVhbShqYXZhLmlvLlByaW50U3RyZWFtIGRzKSB7IGRlYnVnU3RyZWFtID0gZHM7IH0KK3ByaXZhdGUgZmluYWwgaW50IGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTApCit7CisgICBzd2l0Y2ggKHBvcykKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4M2MwODAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgcmV0dXJuIDEwMzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICByZXR1cm4gNTU7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDMwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICByZXR1cm4gNjg7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgIHJldHVybiA4MTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICByZXR1cm4gMjM7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICByZXR1cm4gMzQ7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgcmV0dXJuIDkxOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxOGMxZjQyNDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICByZXR1cm4gMTY7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFmZmZmZjc0MDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxZmZmZmY3NDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDEwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxZmJlZmY3NDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDEwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MWZiZWZmMzQwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MzNjNTAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFjODJhZjM0MDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgzM2M1MDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxYzgyYWYzNDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgIT0gNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEzYzAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFjODJhZjI0MDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNzsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA4OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0ODBhYTI0MDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gODsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxODAyMDUwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCA3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFjMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgOToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODBhYTIwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyAhPSA5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxODAyMDUwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCA3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwNDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MWMwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAxMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCA5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwNDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODBhMjIwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTA7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4YzAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDExOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgOSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGMwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MGEyMjAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxMTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDExKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGMwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhhMjIwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTI7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgMTM6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPCAxMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgMTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGEwMjAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxMzsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAxNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDExKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgMTMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDIwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTQ7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgMTMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAyMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE1OworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDE2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDIwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTY7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMjAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIC0xOworICAgfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIHJldHVybiBqak1vdmVOZmFfMChqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAocG9zLCBhY3RpdmUwKSwgcG9zICsgMSk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqalN0b3BBdFBvcyhpbnQgcG9zLCBpbnQga2luZCkKK3sKKyAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOworICAgamptYXRjaGVkUG9zID0gcG9zOworICAgcmV0dXJuIHBvcyArIDE7Cit9Citwcml2YXRlIGZpbmFsIGludCBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKGludCBwb3MsIGludCBraW5kLCBpbnQgc3RhdGUpCit7CisgICBqam1hdGNoZWRLaW5kID0ga2luZDsKKyAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBwb3MgKyAxOyB9CisgICByZXR1cm4gampNb3ZlTmZhXzAoc3RhdGUsIHBvcyArIDEpOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpCit7CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNDUpOworICAgICAgY2FzZSA0NzoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNjsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDBMKTsKKyAgICAgIGNhc2UgNDg6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNDYpOworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxNSk7CisgICAgICBjYXNlIDY0OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDE5KTsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweGMwMjAwNDAwMDBMKTsKKyAgICAgIGNhc2UgOTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDBMKTsKKyAgICAgIGNhc2UgOTk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwTCk7CisgICAgICBjYXNlIDEwMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MzAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAzOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDAwMDAwMEwpOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDg0MDAwMDAwTCk7CisgICAgICBjYXNlIDEwNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwMDAwTCk7CisgICAgICBjYXNlIDEwOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4M2MwODAwMDAwMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDIwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMEwpOworICAgICAgY2FzZSAxMjA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDE4MDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMjY6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjMpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoMCwgMCk7CisgICB9Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCkKK3sKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMCwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0NToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTgwMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDQ3OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDE3KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MzAwMDEwMDAwMDBMKTsKKyAgICAgIGNhc2UgOTk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwMDAwTCk7CisgICAgICBjYXNlIDEwMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDgwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTA4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHhjMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDNlMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MjAwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDI0MDQwMDAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMDAwTCk7CisgICAgICBjYXNlIDEyMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgb2xkMCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDEsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDI7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDAwMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MzAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgzYzAwMDAwMDAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODQxMDAwMDBMKTsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwMDAwTCk7CisgICAgICBjYXNlIDEwOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4NDAwMDgwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg1MDAwMDAwMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQwMDAwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDE4MDAwMTAwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIyMDA0MDAwMEwpOworICAgICAgY2FzZSAxMjE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweGMxMDAwMDAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDEsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBvbGQwKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMiwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gMzsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDEwMDAwMDAwMEwpOworICAgICAgY2FzZSA2NToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMEwpOworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwTCk7CisgICAgICBjYXNlIDk4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDAwMDAwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxODAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgzM2MwMTQwMDAwMEwpOworICAgICAgY2FzZSAxMDk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDYxMDAwMDBMKTsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDAwMDAwMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDQwMDEwMDAwMDAwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwNDAwMDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg0MDAwMDAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDIsIG9sZDApOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgzLCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA0OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDU4OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcyg0LCAzMik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwMDA0MDAwMDBMKTsKKyAgICAgIGNhc2UgODQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDUwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxODEwMDAwMEwpOworICAgICAgY2FzZSAxMDQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDE4MDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDIyMDQwMDAwTCk7CisgICAgICBjYXNlIDEwODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4M2MwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4NDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgzODI4MDIwMDAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMywgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDMsIG9sZDApOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg0LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA1OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDQyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoNSwgMzgpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU4OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcyg1LCAyMik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDMzYzUwMDAwMDAwTCk7CisgICAgICBjYXNlIDk4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgyMDA0MDAwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDE4MDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDI4MDIwMDAwMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDQwMDAwMTAwMDAwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODAwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMDIwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTIxOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg1MDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg0LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNCwgb2xkMCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDUsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDY7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNTg6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoNiwgMjgpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoNiwgMzApOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDE7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA2OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHgxM2MwMDAwMDAwMEwpOworICAgICAgY2FzZSA4NDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4ODAwMDAwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4MjAwMDAwMEwpOworICAgICAgY2FzZSAxMDk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDE4MDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDIwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDUwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4ODAzMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHgyMDA0MDAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoNSwgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDUsIG9sZDApOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg2LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA3OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDQyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoNywgMzcpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoNywgNDApOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDE4MTAwMDAwMDAwMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4NTAwMDAwMEwpOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDgwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAoYWN0aXZlMCwgMHg0MDIwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDQwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDIwMDQwMDAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4MjAwMDAwTCk7CisgICAgICBjYXNlIDExODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4MjAwMDAwMEwpOworICAgICAgY2FzZSAxMjE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDg4MDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNiwgb2xkMCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDcsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDg7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNTg6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDgsIDIwKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4MTgwMjA1MDAwMDAwTCk7CisgICAgICBjYXNlIDY3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAoYWN0aXZlMCwgMHg4MDAwMDAwMEwpOworICAgICAgY2FzZSA5ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChhY3RpdmUwLCAweDQyMjA0MDAwMEwpOworICAgICAgY2FzZSAxMDQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChhY3RpdmUwLCAweDgwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChhY3RpdmUwLCAweDEwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTEyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAoYWN0aXZlMCwgMHg4MDAwMDAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4NDAwMDAyMDAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDcsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg3LCBvbGQwKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoOCwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gOTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDksIDI0KTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoOSwgMjYpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDksIDMzKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gOTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChhY3RpdmUwLCAweDE0MDAwMDA0MDAwMEwpOworICAgICAgY2FzZSA3MToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChhY3RpdmUwLCAweDIwMDAwMDAwTCk7CisgICAgICBjYXNlIDg0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMF8wKGFjdGl2ZTAsIDB4MjAwMDAwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEwXzAoYWN0aXZlMCwgMHg4MDAwMDAwTCk7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChhY3RpdmUwLCAweDIwMDAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcyg5LCAzNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMF8wKGFjdGl2ZTAsIDB4ODgwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChhY3RpdmUwLCAweDQwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEwXzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg4LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMF8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDgsIG9sZDApOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg5LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAxMDsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0MjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMTAsIDQ0KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxMCwgMTgpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMV8wKGFjdGl2ZTAsIDB4NDAwMDgwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMV8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTFfMChhY3RpdmUwLCAweDgwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTFfMChhY3RpdmUwLCAweDIwMDAwMEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAoYWN0aXZlMCwgMHgyMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTFfMChhY3RpdmUwLCAweDQwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMjE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAoYWN0aXZlMCwgMHgyMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg5LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMV8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDksIG9sZDApOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgxMCwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gMTE7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMTEsIDQyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDExLCAyNyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOTk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEyXzAoYWN0aXZlMCwgMHg4MDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMl8wKGFjdGl2ZTAsIDB4ODQwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEyXzAoYWN0aXZlMCwgMHgyMDAwMDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMl8wKGFjdGl2ZTAsIDB4MjAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTEyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMl8wKGFjdGl2ZTAsIDB4MjAwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEyXzAoYWN0aXZlMCwgMHg4MDAwMDAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMTAsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEyXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMTAsIG9sZDApOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgxMSwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gMTI7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEzXzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDcxOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExM18wKGFjdGl2ZTAsIDB4MjAwMDAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMTIsIDM1KTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTNfMChhY3RpdmUwLCAweDIwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExM18wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTNfMChhY3RpdmUwLCAweDgwMDAwMDAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTNfMChhY3RpdmUwLCAweDIwMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxMSwgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTNfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxMSwgb2xkMCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDEyLCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAxMzsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTRfMChhY3RpdmUwLCAweDgwMDIwMDAwMDBMKTsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTE0XzAoYWN0aXZlMCwgMHg4MDAwMDAwMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTRfMChhY3RpdmUwLCAweDQwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTE0XzAoYWN0aXZlMCwgMHgyMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTE0XzAoYWN0aXZlMCwgMHgyMDAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDEyLCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExNF8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDEyLCBvbGQwKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMTMsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDE0OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDQyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMTQsIDM5KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDE0LCAyNSk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTE1XzAoYWN0aXZlMCwgMHgyMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDE0LCAzNCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExNV8wKGFjdGl2ZTAsIDB4ODAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExNV8wKGFjdGl2ZTAsIDB4MjAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxMywgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTVfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxMywgb2xkMCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDE0LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAxNTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxNSwgMjkpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTZfMChhY3RpdmUwLCAweDgwMDAwMDAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTZfMChhY3RpdmUwLCAweDIwMDAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMTQsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTE2XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMTQsIG9sZDApOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgxNSwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gMTY7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMTEyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExN18wKGFjdGl2ZTAsIDB4MjAwMDAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTdfMChhY3RpdmUwLCAweDgwMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxNSwgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTdfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxNSwgb2xkMCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDE2LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAxNzsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMThfMChhY3RpdmUwLCAweDgwMjAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxNiwgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMThfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxNiwgb2xkMCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDE3LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAxODsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMTgsIDIxKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDE4LCAzMSk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDE3LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZChpbnQgc3RhdGUpCit7CisgICBpZiAoampyb3VuZHNbc3RhdGVdICE9IGpqcm91bmQpCisgICB7CisgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBzdGF0ZTsKKyAgICAgIGpqcm91bmRzW3N0YXRlXSA9IGpqcm91bmQ7CisgICB9Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampBZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgZG8geworICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gampuZXh0U3RhdGVzW3N0YXJ0XTsKKyAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFR3b1N0YXRlcyhpbnQgc3RhdGUxLCBpbnQgc3RhdGUyKQoreworICAgampDaGVja05BZGQoc3RhdGUxKTsKKyAgIGpqQ2hlY2tOQWRkKHN0YXRlMik7Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgZG8geworICAgICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7CisgICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0KQoreworICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7CisgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnQgKyAxXSk7Cit9CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMCA9IHsKKyAgIDB4MEwsIDB4ZmZmZmZmZmZmZmZmYzAwMEwsIDB4ZmZmZmYwMDA3ZmZmZmZmZkwsIDB4N2ZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyID0geworICAgMHgwTCwgMHgwTCwgMHgwTCwgMHhmZjdmZmZmZmZmN2ZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzID0geworICAgMHg3ZmYzZmZmZmZmZmZmZmZmTCwgMHg3ZmZmZmZmZmZmZmZmZGZlTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmYzMxZmZmZmZmZmZlMDBmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0ID0geworICAgMHhmZmZmZmZMLCAweGZmZmZmZmZmZmZmZjAwMDBMLCAweGY4MDAwMWZmZmZmZmZmZmZMLCAweDNMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzUgPSB7CisgICAweDBMLCAweDBMLCAweGZmZmZmZmZiZmZmZmQ3NDBMLCAweGZmZmZkNTQ3ZjdmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzYgPSB7CisgICAweGZmZmZmZmZmZmZmZmRmZmVMLCAweGZmZmZmZmZmZGZmZWZmZmZMLCAweGZmZmZmZmZmZmZmZjAwMDNMLCAweDMzZmNmZmZmZmZmMTk5ZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNyA9IHsKKyAgIDB4ZmZmZTAwMDAwMDAwMDAwMEwsIDB4ZmZmZmZmZmUwMjdmZmZmZkwsIDB4N2ZMLCAweDcwN2ZmZmZmZjAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzggPSB7CisgICAweDdmZmZmZmUwMDAwMDAwMEwsIDB4ZmZmZTAwMDAwMDAwMDdmZUwsIDB4N2NmZmZmZmZmZmZmZmZmZkwsIDB4NjAwMDJmN2ZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjOSA9IHsKKyAgIDB4MjNmZmZmZmZmZmZmZmZlMEwsIDB4M2ZmMDAwMDAwTCwgMHgzYzVmZGZmZmZmOTlmZTBMLCAweDMwMDAzYjAwMDAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzEwID0geworICAgMHgzNmRmZGZmZmZmOTg3ZTBMLCAweDFjMDAwMDVlMDAwMDAwTCwgMHgyM2VkZmRmZmZmZmJhZmUwTCwgMHgxMDAwMDAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzExID0geworICAgMHgyM2NkZmRmZmZmZjk5ZmUwTCwgMHgzYjAwMDAwMDBMLCAweDNiZmM3MThkNjNkYzdlMEwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTIgPSB7CisgICAweDNlZmZkZmZmZmZkZGZlMEwsIDB4MzAwMDAwMDAwTCwgMHgzZWZmZGZmZmZmZGRmZTBMLCAweDM0MDAwMDAwMEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTMgPSB7CisgICAweDNmZmZkZmZmZmZkZGZlMEwsIDB4MzAwMDAwMDAwTCwgMHgwTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMxNCA9IHsKKyAgIDB4ZDdmZmZmZmZmZmZmZUwsIDB4M2ZMLCAweDIwMGQ2Y2FlZmVmMDI1OTZMLCAweDFmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMxNSA9IHsKKyAgIDB4MEwsIDB4M2ZmZmZmZmZlZmZMLCAweDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzE2ID0geworICAgMHgwTCwgMHgwTCwgMHhmZmZmZmZmZjAwMDAwMDAwTCwgMHg3ZmZmZmZmZmZmMDAzZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTcgPSB7CisgICAweDUwMDAwMDAwMDAwN2RhZWRMLCAweDJjNjJhYjgyMzE1MDAxTCwgMHhmNTgwYzkwMDQwMDAwMDAwTCwgMHgyMDEwODAwMDAwMDAwMDdMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzE4ID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZjBmZmZmZmZmTCwgMHgzZmZmZmZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzE5ID0geworICAgMHhmZmZmZmZmZjNmM2ZmZmZmTCwgMHgzZmZmZmZmZmFhZmYzZjNmTCwgMHg1ZmRmZmZmZmZmZmZmZmZmTCwgMHgxZmRjMWZmZjBmY2YxZmRjTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyMCA9IHsKKyAgIDB4NGM0MDAwMDAwMDAwTCwgMHgwTCwgMHg3TCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyMSA9IHsKKyAgIDB4M2ZlMDAwMDAwODBMLCAweGZmZmZmZmZmZmZmZmZmZmVMLCAweGZmZmZmZmZlMDAxZmZmZmZMLCAweDdmZmZmZmZmZmZmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjIgPSB7CisgICAweDFmZmZmZmZmZmZlMEwsIDB4MEwsIDB4MEwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjMgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDNmZmZmZmZmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI0ID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI1ID0geworICAgMHgwTCwgMHgwTCwgMHg4MDAwMDAwMDAwMDAwMEwsIDB4ZmY3ZmZmZmZmZjdmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjYgPSB7CisgICAweGZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmMDAwMEwsIDB4ZjgwMDAxZmZmZmZmZmZmZkwsIDB4MzAwMDNMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI3ID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHgzMDAwMDAwM2ZMLCAweGZmZmZmZmZiZmZmZmQ3YzBMLCAweGZmZmZkNTQ3ZjdmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI4ID0geworICAgMHhmZmZmZmZmZmZmZmZkZmZlTCwgMHhmZmZmZmZmZmRmZmVmZmZmTCwgMHhmZmZmZmZmZmZmZmYwMDdiTCwgMHgzM2ZjZmZmZmZmZjE5OWZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI5ID0geworICAgMHhmZmZlMDAwMDAwMDAwMDAwTCwgMHhmZmZmZmZmZTAyN2ZmZmZmTCwgMHhiYmZmZmZmYmZmZmUwMDdmTCwgMHg3MDdmZmZmZmYwMDE2TAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzMCA9IHsKKyAgIDB4N2ZmZmZmZTAwMDAwMDAwTCwgMHhmZmZmMDNmZjAwMDdmZmZmTCwgMHg3Y2ZmZmZmZmZmZmZmZmZmTCwgMHgzZmYzZGZmZmZlZjdmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzMxID0geworICAgMHhmM2ZmZmZmZmZmZmZmZmVlTCwgMHhmZmNmZmYxZTNmZmZMLCAweGQzYzVmZGZmZmZmOTlmZWVMLCAweDNmZmNmYjA4MDM5OWZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzMyID0geworICAgMHhkMzZkZmRmZmZmZjk4N2U0TCwgMHgxZmZmYzA1ZTAwMzk4N0wsIDB4ZjNlZGZkZmZmZmZiYWZlZUwsIDB4ZmZjMTAwMDAzYmJmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzMyA9IHsKKyAgIDB4ZjNjZGZkZmZmZmY5OWZlZUwsIDB4ZmZjM2IwYzAzOThmTCwgMHhjM2JmYzcxOGQ2M2RjN2VjTCwgMHhmZjgwMDA4MDNkYzdMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzM0ID0geworICAgMHhjM2VmZmRmZmZmZmRkZmVlTCwgMHhmZmMzMDA2MDNkZGZMLCAweGMzZWZmZGZmZmZmZGRmZWNMLCAweGZmYzM0MDYwM2RkZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzUgPSB7CisgICAweGMzZmZmZGZmZmZmZGRmZWNMLCAweGZmYzMwMDgwM2RjZkwsIDB4MEwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzYgPSB7CisgICAweDdmZjdmZmZmZmZmZmZmZUwsIDB4M2ZmN2ZmZkwsIDB4M2JmZjZjYWVmZWYwMjU5NkwsIDB4M2ZmM2Y1ZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzcgPSB7CisgICAweGMyYTAwM2ZmMDMwMDAwMDBMLCAweGZmZmUwM2ZmZmZmZmZlZmZMLCAweDJmZTNmZmZmZWJmMGZkZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzggPSB7CisgICAweDBMLCAweDBMLCAweDBMLCAweDIxZmZmMDAwMEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzkgPSB7CisgICAweDNlZmZmZTAwMDAwMGEwTCwgMHhmZmZmZmZmZmZmZmZmZmZlTCwgMHhmZmZmZmZmZTY2MWZmZmZmTCwgMHg3N2ZmZmZmZmZmZmZmZmZmTAorfTsKK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZU5mYV8wKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKQoreworICAgaW50W10gbmV4dFN0YXRlczsKKyAgIGludCBzdGFydHNBdCA9IDA7CisgICBqam5ld1N0YXRlQ250ID0gMTQ4OworICAgaW50IGkgPSAxOworICAgampzdGF0ZVNldFswXSA9IHN0YXJ0U3RhdGU7CisgICBpbnQgaiwga2luZCA9IDB4N2ZmZmZmZmY7CisgICBmb3IgKDs7KQorICAgeworICAgICAgaWYgKCsrampyb3VuZCA9PSAweDdmZmZmZmZmKQorICAgICAgICAgUmVJbml0Um91bmRzKCk7CisgICAgICBpZiAoY3VyQ2hhciA8IDY0KQorICAgICAgeworICAgICAgICAgbG9uZyBsID0gMUwgPDwgY3VyQ2hhcjsKKyAgICAgICAgIE1hdGNoTG9vcDogZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjYwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDkxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjYwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjYwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjYwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjYwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmY2MDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTIpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTI7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4MToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmY2MDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTIpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTI7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmY2MDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTIpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTI7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDAsIDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoY3VyQ2hhciA8IDEyOCkKKyAgICAgIHsKKyAgICAgICAgIGxvbmcgbCA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKKyAgICAgICAgIE1hdGNoTG9vcDogZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTIpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTI7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk3KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTEwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTExKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTExKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNTQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE0KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTAzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTIpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTI7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk3KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTQ2OworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAxMDUpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMzk7CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEzMjsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMTA1KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTIyOworICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMTI7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDEwNSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTIpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTI7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gOTEpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzOworICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA5KQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMiwgNyk7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDEwMSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDkxOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAxMTIpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA4MTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMTA4KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzQ7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDEwMikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDY4OworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAxMTYpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1NTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMTE5KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNDQ7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDk5KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzQ7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDExMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIzOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA5OCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDE2OworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAxMTEpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4MToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDEyKQorICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDEyOworICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDgwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTIpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTI7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDEyKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDEyOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkxKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTMpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwMCAmJiBraW5kID4gMTQpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDEpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE0KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAxKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gODsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTEpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTEwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk4KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5OSAmJiBraW5kID4gMTQpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxODsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDE5OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAxKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDkpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTIxICYmIGtpbmQgPiAxNCkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDgpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk3KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTApCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyOTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDMwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTQpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk5KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDEgJiYga2luZCA+IDE0KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDE0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTkpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzNik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM3OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTEyKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA4MykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM5OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAxKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTYpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA0MTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDQyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA0KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNDM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTkpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA0NDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNSAmJiBraW5kID4gMTQpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICAgICBjYXNlIDU3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE2KQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNDc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDk6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDMpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA0ODsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDQ5OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNjgpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1MDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwOCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDUxOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDUzOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1MjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDUzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU2OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE2KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNTU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1NzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwMykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDU4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDYwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNTk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA2OCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDYwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDYyOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTEwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjM6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTEpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2MjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDYzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE2KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjY6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5OSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDY1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2NjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2OToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwMikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDY4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDcwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA0ICYmIGtpbmQgPiAxNCkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3MToKKyAgICAgICAgICAgICAgIGNhc2UgMTM0OgorICAgICAgICAgICAgICAgY2FzZSAxNDE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTYpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg3MCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDMpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA3MTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3MzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDcyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDc0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAxKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDgpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA3NDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3NjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMCAmJiBraW5kID4gMTQpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzc6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTQpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg3Nik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDEpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA3NzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3OToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDc4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDgwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE2KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTIpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA4MTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4MzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMSkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDc2KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDgzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE2KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gODQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODY6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDg1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE0KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gODY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDEpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA4NzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4OToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwOSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDg4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE3KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gODk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDEpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA5MTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5MzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwOSkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDIsIDcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk0OgorICAgICAgICAgICAgICAgY2FzZSAxMDQ6CisgICAgICAgICAgICAgICBjYXNlIDExNDoKKyAgICAgICAgICAgICAgIGNhc2UgMTI0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE4KQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTY6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTUpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA5NTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5NzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDk2OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk4OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA4KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTk6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5OSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDk4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDk5OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDczKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTAwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA2OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE1KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTA1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwNzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwNjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDgpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTkpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTEwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTEwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTA5OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDExMToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDczKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTEwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDExMjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEyMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDExMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTM6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDExMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMTQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE2OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE1KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTE1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDExNzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDExNjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDgpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMTc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTkpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMTg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTIwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTIwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTE5OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyMToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDY5KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTIwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyMjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjM6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMjI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTI1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTI0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyNjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjc6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMjY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA4KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTI3OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyOToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk5KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTI4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEzMDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEyMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyOTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMzE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA2OSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEzMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMzI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMzE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTMzOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMzI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTM1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAzKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTM0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEzNjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExMCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEzNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMzc6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDEpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMzY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTM4OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNzYpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMzc7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTM5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTEwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTM4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE0MDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEzOTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNDI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDMpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxNDE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTQzOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTEwKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTQyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE0NDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwMSkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDE0MzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNDU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA3NikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDE0NDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNDY6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxNDU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTQ3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxNDY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpbnQgaGlCeXRlID0gKGludCkoY3VyQ2hhciA+PiA4KTsKKyAgICAgICAgIGludCBpMSA9IGhpQnl0ZSA+PiA2OworICAgICAgICAgbG9uZyBsMSA9IDFMIDw8IChoaUJ5dGUgJiAwNzcpOworICAgICAgICAgaW50IGkyID0gKGN1ckNoYXIgJiAweGZmKSA+PiA2OworICAgICAgICAgbG9uZyBsMiA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKKyAgICAgICAgIE1hdGNoTG9vcDogZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDkxOgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU1OgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY4OgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMzoKKyAgICAgICAgICAgICAgICAgIGlmICghampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTIpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTI7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDgxOgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOworICAgICAgfQorICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKKyAgICAgIHsKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOworICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOworICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICB9CisgICAgICArK2N1clBvczsKKyAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDE0OCAtIChqam5ld1N0YXRlQ250ID0gc3RhcnRzQXQpKSkKKyAgICAgICAgIHJldHVybiBjdXJQb3M7CisgICAgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gY3VyUG9zOyB9CisgICB9Cit9CitzdGF0aWMgZmluYWwgaW50W10gampuZXh0U3RhdGVzID0geworICAgMywgNCwgMTAzLCAxMTMsIDEyMywgMTMzLCAxNDAsIDE0NywKK307Citwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8wKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQoreworICAgc3dpdGNoKGhpQnl0ZSkKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzRbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjOFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM5W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDEwOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxMFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTFbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTI6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzEyW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDEzOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxM1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTRbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzE1W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE2OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxNltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzE4W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDMxOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxOVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNDg6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzIxW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDQ5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyMltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNTk6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzIzW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIxNToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjRbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgaWYgKChqamJpdFZlYzBbaTFdICYgbDEpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9Citwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8xKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQoreworICAgc3dpdGNoKGhpQnl0ZSkKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjVbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjM1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyNltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyN1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyOFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyOVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA2OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzMFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzMVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzJbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTE6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzMzW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDEyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzNFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzVbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTQ6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzM2W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzN1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTZbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzE3W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDMwOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxOFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzMToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTlbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzM4W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDMzOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyMFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA0ODoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzlbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNDk6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzIyW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE1OToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjNbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjE1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyNFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMV0gJiBsMSkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gampzdHJMaXRlcmFsSW1hZ2VzID0geworIiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCitudWxsLCBudWxsLCAiXDcyIiwgIlw1NyIsICJcNTdcNTciLCAiXDE0MVwxNjRcMTY0XDE2MlwxNTFcMTQyXDE2NVwxNjRcMTQ1XDcyXDcyIiwKKyJcMTAwIiwgIlwxNDVcMTU0XDE0NVwxNTVcMTQ1XDE1NlwxNjRcNzJcNzIiLAorIlwxNjNcMTY1XDE0MlwxNjNcMTY0XDE1MVwxNjRcMTY1XDE2NFwxNTFcMTU3XDE1NlwxMDdcMTYyXDE1N1wxNjVcMTYwXDcyXDcyIiwgIlwxNjRcMTcxXDE2MFwxNDVcNzJcNzIiLCAiXDE3NiIsICJcMTQyXDE0MVwxNjNcMTQ1XDEyNFwxNzFcMTYwXDE0NVw3Mlw3MiIsCisiXDE2MFwxNjJcMTUxXDE1NVwxNTFcMTY0XDE1MVwxNjZcMTQ1XDEyNFwxNzFcMTYwXDE0NVw3Mlw3MiIsICJcMTUxXDE2NFwxNDVcMTU1XDEyNFwxNzFcMTYwXDE0NVw3Mlw3MiIsCisiXDE1NVwxNDVcMTU1XDE0MlwxNDVcMTYyXDEyNFwxNzFcMTYwXDE0NVw3Mlw3MiIsICJcMTYzXDE0M1wxNTdcMTYwXDE0NVw3Mlw3MiIsCisiXDE0MVwxNjRcMTY0XDE2MlwxNTFcMTQyXDE2NVwxNjRcMTQ1XDEwN1wxNjJcMTU3XDE2NVwxNjBcNzJcNzIiLCAiXDE0N1wxNjJcMTU3XDE2NVwxNjBcNzJcNzIiLAorIlwxNTFcMTQ0XDE0NVwxNTZcMTY0XDE1MVwxNjRcMTcxXDEwM1wxNTdcMTU2XDE2NFwxNjJcMTQxXDE1MVwxNTZcMTY0XDcyXDcyIiwgIlwxNTNcMTQ1XDE3MVw3Mlw3MiIsICJcMTU2XDE1N1wxNjRcMTQxXDE2NFwxNTFcMTU3XDE1Nlw3Mlw3MiIsCisiXDE1NVwxNTdcMTQ0XDE0NVwxNTRcNzJcNzJcMTYzXDE0NVwxNjFcMTY1XDE0NVwxNTZcMTQzXDE0NSIsICJcMTU1XDE1N1wxNDRcMTQ1XDE1NFw3Mlw3MlwxNDNcMTUwXDE1N1wxNTFcMTQzXDE0NSIsCisiXDE1NVwxNTdcMTQ0XDE0NVwxNTRcNzJcNzJcMTQxXDE1NFwxNTQiLCAiXDE1NVwxNTdcMTQ0XDE0NVwxNTRcNzJcNzJcNTIiLCAiXDE0MVwxNTZcMTcxXDcyXDcyXDUyIiwKKyJcMTQxXDE1NlwxNzFcMTAxXDE2NFwxNjRcMTYyXDE1MVwxNDJcMTY1XDE2NFwxNDVcNzJcNzJcNTIiLCAiXDE0NlwxNDFcMTQzXDE0NVwxNjRcNzJcNzJcNTIiLCAiXDE0NlwxNDFcMTQzXDE0NVwxNjRcNzJcNzIiLAorIlwxNDNcMTU3XDE1NVwxNjBcMTU3XDE1NlwxNDVcMTU2XDE2NFw3Mlw3Mlw1MiIsICJcMTcwXDU1XDE2M1wxNDNcMTUwXDE0NVwxNTVcMTQxXDcyXDcyIiwKKyJcMTcwXDU1XDE2M1wxNDNcMTUwXDE0NVwxNTVcMTQxXDcyXDcyXDUyIiwgIlw1MiIsICJcNjAiLCB9OworcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXhTdGF0ZU5hbWVzID0geworICAgIkRFRkFVTFQiLAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gamp0b1Rva2VuID0geworICAgMHg3ZmZmZmZmZmYwMDFMLAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gamp0b1NraXAgPSB7CisgICAweDNlTCwKK307Citwcm90ZWN0ZWQgU2ltcGxlQ2hhclN0cmVhbSBpbnB1dF9zdHJlYW07Citwcml2YXRlIGZpbmFsIGludFtdIGpqcm91bmRzID0gbmV3IGludFsxNDhdOworcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanN0YXRlU2V0ID0gbmV3IGludFsyOTZdOworcHJvdGVjdGVkIGNoYXIgY3VyQ2hhcjsKK3B1YmxpYyBTQ0RQYXJzZXJUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0peworICAgaWYgKFNpbXBsZUNoYXJTdHJlYW0uc3RhdGljRmxhZykKKyAgICAgIHRocm93IG5ldyBFcnJvcigiRVJST1I6IENhbm5vdCB1c2UgYSBzdGF0aWMgQ2hhclN0cmVhbSBjbGFzcyB3aXRoIGEgbm9uLXN0YXRpYyBsZXhpY2FsIGFuYWx5emVyLiIpOworICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOworfQorcHVibGljIFNDRFBhcnNlclRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKXsKKyAgIHRoaXMoc3RyZWFtKTsKKyAgIFN3aXRjaFRvKGxleFN0YXRlKTsKK30KK3B1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKK3sKKyAgIGpqbWF0Y2hlZFBvcyA9IGpqbmV3U3RhdGVDbnQgPSAwOworICAgY3VyTGV4U3RhdGUgPSBkZWZhdWx0TGV4U3RhdGU7CisgICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07CisgICBSZUluaXRSb3VuZHMoKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBSZUluaXRSb3VuZHMoKQoreworICAgaW50IGk7CisgICBqanJvdW5kID0gMHg4MDAwMDAwMTsKKyAgIGZvciAoaSA9IDE0ODsgaS0tID4gMDspCisgICAgICBqanJvdW5kc1tpXSA9IDB4ODAwMDAwMDA7Cit9CitwdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKK3sKKyAgIFJlSW5pdChzdHJlYW0pOworICAgU3dpdGNoVG8obGV4U3RhdGUpOworfQorcHVibGljIHZvaWQgU3dpdGNoVG8oaW50IGxleFN0YXRlKQoreworICAgaWYgKGxleFN0YXRlID49IDEgfHwgbGV4U3RhdGUgPCAwKQorICAgICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoIkVycm9yOiBJZ25vcmluZyBpbnZhbGlkIGxleGljYWwgc3RhdGUgOiAiICsgbGV4U3RhdGUgKyAiLiBTdGF0ZSB1bmNoYW5nZWQuIiwgVG9rZW5NZ3JFcnJvci5JTlZBTElEX0xFWElDQUxfU1RBVEUpOworICAgZWxzZQorICAgICAgY3VyTGV4U3RhdGUgPSBsZXhTdGF0ZTsKK30KKworcHJvdGVjdGVkIFRva2VuIGpqRmlsbFRva2VuKCkKK3sKKyAgIFRva2VuIHQgPSBUb2tlbi5uZXdUb2tlbihqam1hdGNoZWRLaW5kKTsKKyAgIHQua2luZCA9IGpqbWF0Y2hlZEtpbmQ7CisgICBTdHJpbmcgaW0gPSBqanN0ckxpdGVyYWxJbWFnZXNbamptYXRjaGVkS2luZF07CisgICB0LmltYWdlID0gKGltID09IG51bGwpID8gaW5wdXRfc3RyZWFtLkdldEltYWdlKCkgOiBpbTsKKyAgIHQuYmVnaW5MaW5lID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luTGluZSgpOworICAgdC5iZWdpbkNvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkNvbHVtbigpOworICAgdC5lbmRMaW5lID0gaW5wdXRfc3RyZWFtLmdldEVuZExpbmUoKTsKKyAgIHQuZW5kQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOworICAgcmV0dXJuIHQ7Cit9CisKK2ludCBjdXJMZXhTdGF0ZSA9IDA7CitpbnQgZGVmYXVsdExleFN0YXRlID0gMDsKK2ludCBqam5ld1N0YXRlQ250OworaW50IGpqcm91bmQ7CitpbnQgamptYXRjaGVkUG9zOworaW50IGpqbWF0Y2hlZEtpbmQ7CisKK3B1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKQoreworICBpbnQga2luZDsKKyAgVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsKKyAgVG9rZW4gbWF0Y2hlZFRva2VuOworICBpbnQgY3VyUG9zID0gMDsKKworICBFT0ZMb29wIDoKKyAgZm9yICg7OykKKyAgeworICAgdHJ5CisgICB7CisgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLkJlZ2luVG9rZW4oKTsKKyAgIH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKKyAgIHsKKyAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOworICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKKyAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47CisgICB9CisKKyAgIHRyeSB7IGlucHV0X3N0cmVhbS5iYWNrdXAoMCk7CisgICAgICB3aGlsZSAoY3VyQ2hhciA8PSAzMiAmJiAoMHgxMDAwMDM2MDBMICYgKDFMIDw8IGN1ckNoYXIpKSAhPSAwTCkKKyAgICAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOworICAgfQorICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsgY29udGludWUgRU9GTG9vcDsgfQorICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7CisgICBqam1hdGNoZWRQb3MgPSAwOworICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOworICAgaWYgKGpqbWF0Y2hlZEtpbmQgIT0gMHg3ZmZmZmZmZikKKyAgIHsKKyAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQorICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChjdXJQb3MgLSBqam1hdGNoZWRQb3MgLSAxKTsKKyAgICAgIGlmICgoamp0b1Rva2VuW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCisgICAgICB7CisgICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOworICAgICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGNvbnRpbnVlIEVPRkxvb3A7CisgICAgICB9CisgICB9CisgICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7CisgICBpbnQgZXJyb3JfY29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOworICAgU3RyaW5nIGVycm9yX2FmdGVyID0gbnVsbDsKKyAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOworICAgdHJ5IHsgaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7IH0KKyAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7CisgICAgICBFT0ZTZWVuID0gdHJ1ZTsKKyAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOworICAgICAgaWYgKGN1ckNoYXIgPT0gJ1xuJyB8fCBjdXJDaGFyID09ICdccicpIHsKKyAgICAgICAgIGVycm9yX2xpbmUrKzsKKyAgICAgICAgIGVycm9yX2NvbHVtbiA9IDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICBlcnJvcl9jb2x1bW4rKzsKKyAgIH0KKyAgIGlmICghRU9GU2VlbikgeworICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKKyAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOworICAgfQorICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoRU9GU2VlbiwgY3VyTGV4U3RhdGUsIGVycm9yX2xpbmUsIGVycm9yX2NvbHVtbiwgZXJyb3JfYWZ0ZXIsIGN1ckNoYXIsIFRva2VuTWdyRXJyb3IuTEVYSUNBTF9FUlJPUik7CisgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9TaW1wbGVDaGFyU3RyZWFtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1NpbXBsZUNoYXJTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGZhNjczCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9TaW1wbGVDaGFyU3RyZWFtLmphdmEKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlQ2hhclN0cmVhbS5qYXZhIFZlcnNpb24gNC4wICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5zY2Q7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIENoYXJTdHJlYW0sIHdoZXJlIHRoZSBzdHJlYW0gaXMgYXNzdW1lZCB0bworICogY29udGFpbiBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgKHdpdGhvdXQgdW5pY29kZSBwcm9jZXNzaW5nKS4KKyAqLworCitwdWJsaWMgY2xhc3MgU2ltcGxlQ2hhclN0cmVhbQoreworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOworICBpbnQgYnVmc2l6ZTsKKyAgaW50IGF2YWlsYWJsZTsKKyAgaW50IHRva2VuQmVnaW47CisgIHB1YmxpYyBpbnQgYnVmcG9zID0gLTE7CisgIHByb3RlY3RlZCBpbnQgYnVmbGluZVtdOworICBwcm90ZWN0ZWQgaW50IGJ1ZmNvbHVtbltdOworCisgIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKKyAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKKworICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7CisKKyAgcHJvdGVjdGVkIGphdmEuaW8uUmVhZGVyIGlucHV0U3RyZWFtOworCisgIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOworICBwcm90ZWN0ZWQgaW50IG1heE5leHRDaGFySW5kID0gMDsKKyAgcHJvdGVjdGVkIGludCBpbkJ1ZiA9IDA7CisgIHByb3RlY3RlZCBpbnQgdGFiU2l6ZSA9IDg7CisKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VGFiU2l6ZShpbnQgaSkgeyB0YWJTaXplID0gaTsgfQorICBwcm90ZWN0ZWQgaW50IGdldFRhYlNpemUoaW50IGkpIHsgcmV0dXJuIHRhYlNpemU7IH0KKworCisgIHByb3RlY3RlZCB2b2lkIEV4cGFuZEJ1ZmYoYm9vbGVhbiB3cmFwQXJvdW5kKQorICB7CisgICAgIGNoYXJbXSBuZXdidWZmZXIgPSBuZXcgY2hhcltidWZzaXplICsgMjA0OF07CisgICAgIGludCBuZXdidWZsaW5lW10gPSBuZXcgaW50W2J1ZnNpemUgKyAyMDQ4XTsKKyAgICAgaW50IG5ld2J1ZmNvbHVtbltdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07CisKKyAgICAgdHJ5CisgICAgIHsKKyAgICAgICAgaWYgKHdyYXBBcm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgbmV3YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7CisgICAgICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKKworICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCAwLCBuZXdidWZsaW5lLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKKyAgICAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7CisKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgMCwgbmV3YnVmY29sdW1uLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKKyAgICAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOworCisgICAgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyArPSAoYnVmc2l6ZSAtIHRva2VuQmVnaW4pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7CisKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOworCisgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOworCisgICAgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyAtPSB0b2tlbkJlZ2luKTsKKyAgICAgICAgfQorICAgICB9CisgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IodC5nZXRNZXNzYWdlKCkpOworICAgICB9CisKKworICAgICBidWZzaXplICs9IDIwNDg7CisgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7CisgICAgIHRva2VuQmVnaW4gPSAwOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgRmlsbEJ1ZmYoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICB7CisgICAgIGlmIChtYXhOZXh0Q2hhckluZCA9PSBhdmFpbGFibGUpCisgICAgIHsKKyAgICAgICAgaWYgKGF2YWlsYWJsZSA9PSBidWZzaXplKQorICAgICAgICB7CisgICAgICAgICAgIGlmICh0b2tlbkJlZ2luID4gMjA0OCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7CisgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSBpZiAodG9rZW5CZWdpbiA8IDApCisgICAgICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBFeHBhbmRCdWZmKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhdmFpbGFibGUgPiB0b2tlbkJlZ2luKQorICAgICAgICAgICBhdmFpbGFibGUgPSBidWZzaXplOworICAgICAgICBlbHNlIGlmICgodG9rZW5CZWdpbiAtIGF2YWlsYWJsZSkgPCAyMDQ4KQorICAgICAgICAgICBFeHBhbmRCdWZmKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47CisgICAgIH0KKworICAgICBpbnQgaTsKKyAgICAgdHJ5IHsKKyAgICAgICAgaWYgKChpID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIG1heE5leHRDaGFySW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIC0gbWF4TmV4dENoYXJJbmQpKSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgKz0gaTsKKyAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAtLWJ1ZnBvczsKKyAgICAgICAgYmFja3VwKDApOworICAgICAgICBpZiAodG9rZW5CZWdpbiA9PSAtMSkKKyAgICAgICAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgfQorICB9CisKKyAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICAgdG9rZW5CZWdpbiA9IC0xOworICAgICBjaGFyIGMgPSByZWFkQ2hhcigpOworICAgICB0b2tlbkJlZ2luID0gYnVmcG9zOworCisgICAgIHJldHVybiBjOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgVXBkYXRlTGluZUNvbHVtbihjaGFyIGMpCisgIHsKKyAgICAgY29sdW1uKys7CisKKyAgICAgaWYgKHByZXZDaGFySXNMRikKKyAgICAgeworICAgICAgICBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKKyAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7CisgICAgIH0KKyAgICAgZWxzZSBpZiAocHJldkNoYXJJc0NSKQorICAgICB7CisgICAgICAgIHByZXZDaGFySXNDUiA9IGZhbHNlOworICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICB7CisgICAgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKKyAgICAgfQorCisgICAgIHN3aXRjaCAoYykKKyAgICAgeworICAgICAgICBjYXNlICdccicgOgorICAgICAgICAgICBwcmV2Q2hhcklzQ1IgPSB0cnVlOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXG4nIDoKKyAgICAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1x0JyA6CisgICAgICAgICAgIGNvbHVtbi0tOworICAgICAgICAgICBjb2x1bW4gKz0gKHRhYlNpemUgLSAoY29sdW1uICUgdGFiU2l6ZSkpOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKKyAgICAgYnVmY29sdW1uW2J1ZnBvc10gPSBjb2x1bW47CisgIH0KKworICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICAgaWYgKGluQnVmID4gMCkKKyAgICAgeworICAgICAgICAtLWluQnVmOworCisgICAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQorICAgICAgICAgICBidWZwb3MgPSAwOworCisgICAgICAgIHJldHVybiBidWZmZXJbYnVmcG9zXTsKKyAgICAgfQorCisgICAgIGlmICgrK2J1ZnBvcyA+PSBtYXhOZXh0Q2hhckluZCkKKyAgICAgICAgRmlsbEJ1ZmYoKTsKKworICAgICBjaGFyIGMgPSBidWZmZXJbYnVmcG9zXTsKKworICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOworICAgICByZXR1cm4gKGMpOworICB9CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkCisgICAqIEBzZWUgI2dldEVuZENvbHVtbgorICAgKi8KKworICBwdWJsaWMgaW50IGdldENvbHVtbigpIHsKKyAgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOworICB9CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkCisgICAqIEBzZWUgI2dldEVuZExpbmUKKyAgICovCisKKyAgcHVibGljIGludCBnZXRMaW5lKCkgeworICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOworICB9CisKKyAgcHVibGljIGludCBnZXRFbmRDb2x1bW4oKSB7CisgICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0RW5kTGluZSgpIHsKKyAgICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0QmVnaW5Db2x1bW4oKSB7CisgICAgIHJldHVybiBidWZjb2x1bW5bdG9rZW5CZWdpbl07CisgIH0KKworICBwdWJsaWMgaW50IGdldEJlZ2luTGluZSgpIHsKKyAgICAgcmV0dXJuIGJ1ZmxpbmVbdG9rZW5CZWdpbl07CisgIH0KKworICBwdWJsaWMgdm9pZCBiYWNrdXAoaW50IGFtb3VudCkgeworCisgICAgaW5CdWYgKz0gYW1vdW50OworICAgIGlmICgoYnVmcG9zIC09IGFtb3VudCkgPCAwKQorICAgICAgIGJ1ZnBvcyArPSBidWZzaXplOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKKyAgICBsaW5lID0gc3RhcnRsaW5lOworICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKKworICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOworICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOworICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOworICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKKyAgfQorICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKKyAgICBsaW5lID0gc3RhcnRsaW5lOworICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKKworICAgIGlmIChidWZmZXIgPT0gbnVsbCB8fCBidWZmZXJzaXplICE9IGJ1ZmZlci5sZW5ndGgpCisgICAgeworICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7CisgICAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJzaXplXTsKKyAgICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOworICAgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKKyAgICB9CisgICAgcHJldkNoYXJJc0xGID0gcHJldkNoYXJJc0NSID0gZmFsc2U7CisgICAgdG9rZW5CZWdpbiA9IGluQnVmID0gbWF4TmV4dENoYXJJbmQgPSAwOworICAgIGJ1ZnBvcyA9IC0xOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOworICB9CisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgdGhpcyhlbmNvZGluZyA9PSBudWxsID8gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSkgOiBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtLCBlbmNvZGluZyksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICB7CisgICAgIHRoaXMoZHN0cmVhbSwgZW5jb2RpbmcsIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7CisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICB7CisgICAgIFJlSW5pdChlbmNvZGluZyA9PSBudWxsID8gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSkgOiBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtLCBlbmNvZGluZyksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgICBSZUluaXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIGVuY29kaW5nLCAxLCAxLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOworICB9CisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICB7CisgICAgIFJlSW5pdChkc3RyZWFtLCBlbmNvZGluZywgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKKyAgeworICAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKyAgcHVibGljIFN0cmluZyBHZXRJbWFnZSgpCisgIHsKKyAgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyAxKTsKKyAgICAgZWxzZQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgYnVmcG9zICsgMSk7CisgIH0KKworICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQorICB7CisgICAgIGNoYXJbXSByZXQgPSBuZXcgY2hhcltsZW5dOworCisgICAgIGlmICgoYnVmcG9zICsgMSkgPj0gbGVuKQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmcG9zIC0gbGVuICsgMSwgcmV0LCAwLCBsZW4pOworICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnNpemUgLSAobGVuIC0gYnVmcG9zIC0gMSksIHJldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWZwb3MgLSAxKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJldCwgbGVuIC0gYnVmcG9zIC0gMSwgYnVmcG9zICsgMSk7CisgICAgIH0KKworICAgICByZXR1cm4gcmV0OworICB9CisKKyAgcHVibGljIHZvaWQgRG9uZSgpCisgIHsKKyAgICAgYnVmZmVyID0gbnVsbDsKKyAgICAgYnVmbGluZSA9IG51bGw7CisgICAgIGJ1ZmNvbHVtbiA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGFkanVzdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBmb3IgdGhlIHN0YXJ0IG9mIGEgdG9rZW4uCisgICAqLworICBwdWJsaWMgdm9pZCBhZGp1c3RCZWdpbkxpbmVDb2x1bW4oaW50IG5ld0xpbmUsIGludCBuZXdDb2wpCisgIHsKKyAgICAgaW50IHN0YXJ0ID0gdG9rZW5CZWdpbjsKKyAgICAgaW50IGxlbjsKKworICAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCisgICAgIHsKKyAgICAgICAgbGVuID0gYnVmcG9zIC0gdG9rZW5CZWdpbiArIGluQnVmICsgMTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgbGVuID0gYnVmc2l6ZSAtIHRva2VuQmVnaW4gKyBidWZwb3MgKyAxICsgaW5CdWY7CisgICAgIH0KKworICAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKKyAgICAgaW50IG5leHRDb2xEaWZmID0gMCwgY29sdW1uRGlmZiA9IDA7CisKKyAgICAgd2hpbGUgKGkgPCBsZW4gJiYKKyAgICAgICAgICAgIGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gPT0gYnVmbGluZVtrID0gKytzdGFydCAlIGJ1ZnNpemVdKQorICAgICB7CisgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOworICAgICAgICBuZXh0Q29sRGlmZiA9IGNvbHVtbkRpZmYgKyBidWZjb2x1bW5ba10gLSBidWZjb2x1bW5bal07CisgICAgICAgIGJ1ZmNvbHVtbltqXSA9IG5ld0NvbCArIGNvbHVtbkRpZmY7CisgICAgICAgIGNvbHVtbkRpZmYgPSBuZXh0Q29sRGlmZjsKKyAgICAgICAgaSsrOworICAgICB9CisKKyAgICAgaWYgKGkgPCBsZW4pCisgICAgIHsKKyAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKKyAgICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKKworICAgICAgICB3aGlsZSAoaSsrIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgIGlmIChidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdICE9IGJ1ZmxpbmVbKytzdGFydCAlIGJ1ZnNpemVdKQorICAgICAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOworICAgICAgICB9CisgICAgIH0KKworICAgICBsaW5lID0gYnVmbGluZVtqXTsKKyAgICAgY29sdW1uID0gYnVmY29sdW1uW2pdOworICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9zY2QvU3RlcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3NjZC9TdGVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5Y2I2MAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9zY2QvU3RlcC5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5zY2Q7CisKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQ29tcG9uZW50OworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRmFjZXQ7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1R5cGU7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5TQ0Q7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1NjaGVtYTsKK2ltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwuVU5hbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQnVpbGRpbmcgYmxvY2sgb2Yge0BsaW5rIFNDRH0uCisgKgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RlcDxUIGV4dGVuZHMgWFNDb21wb25lbnQ+IHsKKyAgICBwdWJsaWMgZmluYWwgQXhpczw/IGV4dGVuZHMgVD4gYXhpczsKKworICAgIC8qKgorICAgICAqICdQcmVkaWNhdGUnIGluIFNDRCBkZXNpZ25hdGVzIHRoZSBpbmRleCBvZiB0aGUgaXRlbS4gLTEgaWYgdGhlcmUncyBubyBwcmVkaWNhdGUuCisgICAgICogUHJlZGljYXRlIHN0YXJ0cyBmcm9tIDEuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBCZWNhdXNlIG9mIHRoZSBwYXJzaW5nIG9yZGVyIHRoaXMgcGFyYW1ldGVyIGNhbm5vdCBiZSBtYXJrZWQKKyAgICAgKiBmaW5hbCwgZXZlbiB0aG91Z2ggaXQncyBpbW11dGFibGUgb25jZSBpdCdzIHBhcnNlZC4KKyAgICAgKi8KKyAgICBpbnQgcHJlZGljYXRlID0gLTE7CisKKyAgICBwcm90ZWN0ZWQgU3RlcChBeGlzPD8gZXh0ZW5kcyBUPiBheGlzKSB7CisgICAgICAgIHRoaXMuYXhpcyA9IGF4aXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBmaWx0ZXJpbmcgKHdoaWNoIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIGtpbmQgb2Ygc3RlcC4pCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBmaWx0ZXIoIEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBiYXNlICk7CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSB0aGlzIHN0ZXAgYWdhaW5zdCB0aGUgY3VycmVudCBub2RlIHNldAorICAgICAqIGFuZCByZXR1cm5zIG1hdGNoZWQgbm9kZXMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEl0ZXJhdG9yPFQ+IGV2YWx1YXRlKEl0ZXJhdG9yPFhTQ29tcG9uZW50PiBub2RlU2V0KSB7CisgICAgICAgIC8vIGxpc3QgdXAgdGhlIHdob2xlIHRoaW5nCisgICAgICAgIEl0ZXJhdG9yPFQ+IHIgPSBuZXcgSXRlcmF0b3JzLk1hcDxULFhTQ29tcG9uZW50Pihub2RlU2V0KSB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGFwcGx5KFhTQ29tcG9uZW50IGNvbnRleHROb2RlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcihheGlzLml0ZXJhdG9yKGNvbnRleHROb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gYXZvaWQgZHVwbGljYXRlcworICAgICAgICByID0gbmV3IEl0ZXJhdG9ycy5VbmlxdWU8VD4ocik7CisKKyAgICAgICAgaWYocHJlZGljYXRlPj0wKSB7CisgICAgICAgICAgICBUIGl0ZW09bnVsbDsKKyAgICAgICAgICAgIGZvciggaW50IGk9cHJlZGljYXRlOyBpPjA7IGktLSApIHsKKyAgICAgICAgICAgICAgICBpZighci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYXRvcnMuZW1wdHkoKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gci5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9ycy5TaW5nbGV0b248VD4oaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVzIGFueSBuYW1lLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBbnkgZXh0ZW5kcyBTdGVwPFhTQ29tcG9uZW50PiB7CisgICAgICAgIHB1YmxpYyBBbnkoQXhpczw/IGV4dGVuZHMgWFNDb21wb25lbnQ+IGF4aXMpIHsKKyAgICAgICAgICAgIHN1cGVyKGF4aXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gZmlsdGVyaW5nLgorICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIFhTQ29tcG9uZW50PiBmaWx0ZXIoSXRlcmF0b3I8PyBleHRlbmRzIFhTQ29tcG9uZW50PiBiYXNlKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZpbHRlcmVkPFQgZXh0ZW5kcyBYU0NvbXBvbmVudD4gZXh0ZW5kcyBTdGVwPFQ+IHsKKyAgICAgICAgcHJvdGVjdGVkIEZpbHRlcmVkKEF4aXM8PyBleHRlbmRzIFQ+IGF4aXMpIHsKKyAgICAgICAgICAgIHN1cGVyKGF4aXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yPFQ+IGZpbHRlcihJdGVyYXRvcjw/IGV4dGVuZHMgVD4gYmFzZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcnMuRmlsdGVyPFQ+KGJhc2UpIHsKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKFQgZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2goZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIG1hdGNoKFQgZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF0Y2hlcyBhIHBhcnRpY3VsYXIgbmFtZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTmFtZWQgZXh0ZW5kcyBGaWx0ZXJlZDxYU0RlY2xhcmF0aW9uPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5zVXJpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbE5hbWU7CisKKyAgICAgICAgcHVibGljIE5hbWVkKEF4aXM8PyBleHRlbmRzIFhTRGVjbGFyYXRpb24+IGF4aXMsIFVOYW1lIG4pIHsKKyAgICAgICAgICAgIHRoaXMoYXhpcyxuLmdldE5hbWVzcGFjZVVSSSgpLG4uZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOYW1lZChBeGlzPD8gZXh0ZW5kcyBYU0RlY2xhcmF0aW9uPiBheGlzLCBTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgICAgIHN1cGVyKGF4aXMpOworICAgICAgICAgICAgdGhpcy5uc1VyaSA9IG5zVXJpOworICAgICAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaChYU0RlY2xhcmF0aW9uIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkLmdldE5hbWUoKS5lcXVhbHMobG9jYWxOYW1lKSAmJiBkLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhuc1VyaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVzIGFub255bW91cyB0eXBlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQW5vbnltb3VzVHlwZSBleHRlbmRzIEZpbHRlcmVkPFhTVHlwZT4geworICAgICAgICBwdWJsaWMgQW5vbnltb3VzVHlwZShBeGlzPD8gZXh0ZW5kcyBYU1R5cGU+IGF4aXMpIHsKKyAgICAgICAgICAgIHN1cGVyKGF4aXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2goWFNUeXBlIG5vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBub2RlLmlzTG9jYWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXMgYSBwYXJ0aWN1bGFyIGtpbmQgb2YgZmFjZXRzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWNldCBleHRlbmRzIEZpbHRlcmVkPFhTRmFjZXQ+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHVibGljIEZhY2V0KEF4aXM8WFNGYWNldD4gYXhpcywgU3RyaW5nIGZhY2V0TmFtZSkgeworICAgICAgICAgICAgc3VwZXIoYXhpcyk7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBmYWNldE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaChYU0ZhY2V0IGYpIHsKKyAgICAgICAgICAgIHJldHVybiBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVzIGEgc2NoZW1hIGluIGEgcGFydGljdWxhciBuYW1lc3BhY2UuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFNjaGVtYSBleHRlbmRzIEZpbHRlcmVkPFhTU2NoZW1hPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVyaTsKKyAgICAgICAgcHVibGljIFNjaGVtYShBeGlzPFhTU2NoZW1hPiBheGlzLCBTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBzdXBlcihheGlzKTsKKyAgICAgICAgICAgIHRoaXMudXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2goWFNTY2hlbWEgZCkgeworICAgICAgICAgICAgcmV0dXJuIGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKHVyaSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1Rva2VuLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1Rva2VuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4NWFhNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9zY2QvVG9rZW4uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbi5qYXZhIFZlcnNpb24gMy4wICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC5zY2Q7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0uCisgKi8KKworcHVibGljIGNsYXNzIFRva2VuIHsKKworICAvKioKKyAgICogQW4gaW50ZWdlciB0aGF0IGRlc2NyaWJlcyB0aGUga2luZCBvZiB0aGlzIHRva2VuLiAgVGhpcyBudW1iZXJpbmcKKyAgICogc3lzdGVtIGlzIGRldGVybWluZWQgYnkgSmF2YUNDUGFyc2VyLCBhbmQgYSB0YWJsZSBvZiB0aGVzZSBudW1iZXJzIGlzCisgICAqIHN0b3JlZCBpbiB0aGUgZmlsZSAuLi5Db25zdGFudHMuamF2YS4KKyAgICovCisgIHB1YmxpYyBpbnQga2luZDsKKworICAvKioKKyAgICogYmVnaW5MaW5lIGFuZCBiZWdpbkNvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgKiBvZiB0aGlzIHRva2VuOyBlbmRMaW5lIGFuZCBlbmRDb2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZQorICAgKiBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIHRva2VuLgorICAgKi8KKyAgcHVibGljIGludCBiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW47CisKKyAgLyoqCisgICAqIFRoZSBzdHJpbmcgaW1hZ2Ugb2YgdGhlIHRva2VuLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBpbWFnZTsKKworICAvKioKKyAgICogQSByZWZlcmVuY2UgdG8gdGhlIG5leHQgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuIGZyb20gdGhlIGlucHV0CisgICAqIHN0cmVhbS4gIElmIHRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBpZiB0aGUKKyAgICogdG9rZW4gbWFuYWdlciBoYXMgbm90IHJlYWQgdG9rZW5zIGJleW9uZCB0aGlzIG9uZSwgdGhpcyBmaWVsZCBpcworICAgKiBzZXQgdG8gbnVsbC4gIFRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoaXMgdG9rZW4gaXMgYWxzbyBhIHJlZ3VsYXIKKyAgICogdG9rZW4uICBPdGhlcndpc2UsIHNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGVudHMgb2YKKyAgICogdGhpcyBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBuZXh0OworCisgIC8qKgorICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gYWNjZXNzIHNwZWNpYWwgdG9rZW5zIHRoYXQgb2NjdXIgcHJpb3IgdG8gdGhpcworICAgKiB0b2tlbiwgYnV0IGFmdGVyIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuLgorICAgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBzcGVjaWFsIHRva2VucywgdGhpcyBmaWVsZCBpcyBzZXQgdG8gbnVsbC4KKyAgICogV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzdWNoIHNwZWNpYWwgdG9rZW4sIHRoaXMgZmllbGQgcmVmZXJzCisgICAqIHRvIHRoZSBsYXN0IG9mIHRoZXNlIHNwZWNpYWwgdG9rZW5zLCB3aGljaCBpbiB0dXJuIHJlZmVycyB0byB0aGUgbmV4dAorICAgKiBwcmV2aW91cyBzcGVjaWFsIHRva2VuIHRocm91Z2ggaXRzIHNwZWNpYWxUb2tlbiBmaWVsZCwgYW5kIHNvIG9uCisgICAqIHVudGlsIHRoZSBmaXJzdCBzcGVjaWFsIHRva2VuICh3aG9zZSBzcGVjaWFsVG9rZW4gZmllbGQgaXMgbnVsbCkuCisgICAqIFRoZSBuZXh0IGZpZWxkcyBvZiBzcGVjaWFsIHRva2VucyByZWZlciB0byBvdGhlciBzcGVjaWFsIHRva2VucyB0aGF0CisgICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBpdCAod2l0aG91dCBhbiBpbnRlcnZlbmluZyByZWd1bGFyIHRva2VuKS4gIElmIHRoZXJlCisgICAqIGlzIG5vIHN1Y2ggdG9rZW4sIHRoaXMgZmllbGQgaXMgbnVsbC4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBzcGVjaWFsVG9rZW47CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGltYWdlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgIHsKKyAgICAgcmV0dXJuIGltYWdlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiBIb3dldmVyLCBpZiB5b3Ugd2FudCwgeW91CisgICAqIGNhbiBjcmVhdGUgYW5kIHJldHVybiBzdWJjbGFzcyBvYmplY3RzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBvZktpbmQuCisgICAqIFNpbXBseSBhZGQgdGhlIGNhc2VzIHRvIHRoZSBzd2l0Y2ggZm9yIGFsbCB0aG9zZSBzcGVjaWFsIGNhc2VzLgorICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzdWJjbGFzcyBvZiBUb2tlbiBjYWxsZWQgSURUb2tlbiB0aGF0CisgICAqIHlvdSB3YW50IHRvIGNyZWF0ZSBpZiBvZktpbmQgaXMgSUQsIHNpbWxweSBhZGQgc29tZXRoaW5nIGxpa2UgOgorICAgKgorICAgKiAgICBjYXNlIE15UGFyc2VyQ29uc3RhbnRzLklEIDogcmV0dXJuIG5ldyBJRFRva2VuKCk7CisgICAqCisgICAqIHRvIHRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudC4gVGhlbiB5b3UgY2FuIGNhc3QgbWF0Y2hlZFRva2VuCisgICAqIHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGFuZCB1c2UgaXQgaW4geW91ciBsZXhpY2FsIGFjdGlvbnMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQpCisgIHsKKyAgICAgc3dpdGNoKG9mS2luZCkKKyAgICAgeworICAgICAgIGRlZmF1bHQgOiByZXR1cm4gbmV3IFRva2VuKCk7CisgICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1Rva2VuTWdyRXJyb3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC9zY2QvVG9rZW5NZ3JFcnJvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZWI3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvc2NkL1Rva2VuTWdyRXJyb3IuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbk1nckVycm9yLmphdmEgVmVyc2lvbiAzLjAgKi8KK3BhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5pbXBsLnNjZDsKKworcHVibGljIGNsYXNzIFRva2VuTWdyRXJyb3IgZXh0ZW5kcyBFcnJvcgoreworICAgLyoKKyAgICAqIE9yZGluYWxzIGZvciB2YXJpb3VzIHJlYXNvbnMgd2h5IGFuIEVycm9yIG9mIHRoaXMgdHlwZSBjYW4gYmUgdGhyb3duLgorICAgICovCisKKyAgIC8qKgorICAgICogTGV4aWNhbCBlcnJvciBvY2N1cmVkLgorICAgICovCisgICBzdGF0aWMgZmluYWwgaW50IExFWElDQUxfRVJST1IgPSAwOworCisgICAvKioKKyAgICAqIEFuIGF0dGVtcHQgd2FzcyBtYWRlIHRvIGNyZWF0ZSBhIHNlY29uZCBpbnN0YW5jZSBvZiBhIHN0YXRpYyB0b2tlbiBtYW5hZ2VyLgorICAgICovCisgICBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19MRVhFUl9FUlJPUiA9IDE7CisKKyAgIC8qKgorICAgICogVHJpZWQgdG8gY2hhbmdlIHRvIGFuIGludmFsaWQgbGV4aWNhbCBzdGF0ZS4KKyAgICAqLworICAgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0xFWElDQUxfU1RBVEUgPSAyOworCisgICAvKioKKyAgICAqIERldGVjdGVkIChhbmQgYmFpbGVkIG91dCBvZikgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgdG9rZW4gbWFuYWdlci4KKyAgICAqLworICAgc3RhdGljIGZpbmFsIGludCBMT09QX0RFVEVDVEVEID0gMzsKKworICAgLyoqCisgICAgKiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB3aHkgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEl0IHdpbGwgaGF2ZQorICAgICogb25lIG9mIHRoZSBhYm92ZSA0IHZhbHVlcy4KKyAgICAqLworICAgaW50IGVycm9yQ29kZTsKKworICAgLyoqCisgICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzcGFjZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKKyAgICAqIGVxdWl2YWxlbnRzIGluIHRoZSBnaXZlbiBzdHJpbmcKKyAgICAqLworICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgY2hhciBjaDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgICB7CisgICAgICAgICAgIGNhc2UgMCA6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZXR1cm5zIGEgZGV0YWlsZWQgbWVzc2FnZSBmb3IgdGhlIEVycm9yIHdoZW4gaXQgaXMgdGhyb3duIGJ5IHRoZQorICAgICogdG9rZW4gbWFuYWdlciB0byBpbmRpY2F0ZSBhIGxleGljYWwgZXJyb3IuCisgICAgKiBQYXJhbWV0ZXJzIDoKKyAgICAqICAgIEVPRlNlZW4gICAgIDogaW5kaWNhdGVzIGlmIEVPRiBjYXVzZWQgdGhlIGxleGljbCBlcnJvcgorICAgICogICAgY3VyTGV4U3RhdGUgOiBsZXhpY2FsIHN0YXRlIGluIHdoaWNoIHRoaXMgZXJyb3Igb2NjdXJlZAorICAgICogICAgZXJyb3JMaW5lICAgOiBsaW5lIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCisgICAgKiAgICBlcnJvckNvbHVtbiA6IGNvbHVtbiBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJlZAorICAgICogICAgZXJyb3JBZnRlciAgOiBwcmVmaXggdGhhdCB3YXMgc2VlbiBiZWZvcmUgdGhpcyBlcnJvciBvY2N1cmVkCisgICAgKiAgICBjdXJjaGFyICAgICA6IHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVyCisgICAgKiBOb3RlOiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgbGV4aWNhbCBlcnJvciBtZXNzYWdlIGJ5IG1vZGlmeWluZyB0aGlzIG1ldGhvZC4KKyAgICAqLworICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgTGV4aWNhbEVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLCBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBjaGFyIGN1ckNoYXIpIHsKKyAgICAgIHJldHVybigiTGV4aWNhbCBlcnJvciBhdCBsaW5lICIgKworICAgICAgICAgICBlcnJvckxpbmUgKyAiLCBjb2x1bW4gIiArCisgICAgICAgICAgIGVycm9yQ29sdW1uICsgIi4gIEVuY291bnRlcmVkOiAiICsKKyAgICAgICAgICAgKEVPRlNlZW4gPyAiPEVPRj4gIiA6ICgiXCIiICsgYWRkRXNjYXBlcyhTdHJpbmcudmFsdWVPZihjdXJDaGFyKSkgKyAiXCIiKSArICIgKCIgKyAoaW50KWN1ckNoYXIgKyAiKSwgIikgKworICAgICAgICAgICAiYWZ0ZXIgOiBcIiIgKyBhZGRFc2NhcGVzKGVycm9yQWZ0ZXIpICsgIlwiIik7CisgICB9CisKKyAgIC8qKgorICAgICogWW91IGNhbiBhbHNvIG1vZGlmeSB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgeW91ciBlcnJvciBtZXNzYWdlcy4KKyAgICAqIEZvciBleGFtcGxlLCBjYXNlcyBsaWtlIExPT1BfREVURUNURUQgYW5kIElOVkFMSURfTEVYSUNBTF9TVEFURSBhcmUgbm90CisgICAgKiBvZiBlbmQtdXNlcnMgY29uY2Vybiwgc28geW91IGNhbiByZXR1cm4gc29tZXRoaW5nIGxpa2UgOgorICAgICoKKyAgICAqICAgICAiSW50ZXJuYWwgRXJyb3IgOiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgLi4uLiAiCisgICAgKgorICAgICogZnJvbSB0aGlzIG1ldGhvZCBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgcGFyc2VyLgorICAgICovCisgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgfQorCisgICAvKgorICAgICogQ29uc3RydWN0b3JzIG9mIHZhcmlvdXMgZmxhdm9ycyBmb2xsb3cuCisgICAgKi8KKworICAgcHVibGljIFRva2VuTWdyRXJyb3IoKSB7CisgICB9CisKKyAgIHB1YmxpYyBUb2tlbk1nckVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgcmVhc29uKSB7CisgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKKyAgIH0KKworICAgcHVibGljIFRva2VuTWdyRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhciwgaW50IHJlYXNvbikgeworICAgICAgdGhpcyhMZXhpY2FsRXJyb3IoRU9GU2VlbiwgbGV4U3RhdGUsIGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIGVycm9yQWZ0ZXIsIGN1ckNoYXIpLCByZWFzb24pOworICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3V0aWwvQ29uY2F0SXRlcmF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL0NvbmNhdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDllNzYuLjAwMDAwMDAKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3V0aWwvQ29uY2F0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uaW1wbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqCi0gKgotICogQGF1dGhvcgotICogICAgIEtvaHN1a2UgS2F3YWd1Y2hpIChrb2hzdWtlLmthd2FndWNoaUBzdW4uY29tKQotICovCi1wdWJsaWMgY2xhc3MgQ29uY2F0SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGxocyxyaHM7Ci0KLSAgICBwdWJsaWMgQ29uY2F0SXRlcmF0b3IoSXRlcmF0b3IgX2xocywgSXRlcmF0b3IgX3JocykgewotICAgICAgICB0aGlzLmxocyA9IF9saHM7Ci0gICAgICAgIHRoaXMucmhzID0gX3JoczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICBpZiggbGhzIT1udWxsICkgewotICAgICAgICAgICAgaWYoIGxocy5oYXNOZXh0KCkgKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGxocyA9IG51bGw7IC8vIG5vIG1vcmUgaXRlbSBpbiBsaHMKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmhzLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIGlmKCBsaHMhPW51bGwgKSAgICAgcmV0dXJuIGxocy5uZXh0KCk7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgcmV0dXJuIHJocy5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICBpZiggbGhzIT1udWxsICkgICAgIGxocy5yZW1vdmUoKTsKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICByaHMucmVtb3ZlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvdXRpbC9EcmFjb25pYW5FcnJvckhhbmRsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL0RyYWNvbmlhbkVycm9ySGFuZGxlci5qYXZhCmluZGV4IDNiYTc0YjAuLjRmYWFkMzUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL0RyYWNvbmlhbkVycm9ySGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL0RyYWNvbmlhbkVycm9ySGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL0ZpbHRlckl0ZXJhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvdXRpbC9GaWx0ZXJJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkxOTcwLi4wMDAwMDAwCi0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL0ZpbHRlckl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiB7QGxpbmsgSXRlcmF0b3J9IHRoYXQgd29ya3MgYXMgYSBmaWx0ZXIgdG8gYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9LgotICoKLSAqIEBhdXRob3IKLSAqICAgICBLb2hzdWtlIEthd2FndWNoaSAoa29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbHRlckl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBjb3JlOwotICAgIHByaXZhdGUgT2JqZWN0IG5leHQ7Ci0KLSAgICBwcm90ZWN0ZWQgRmlsdGVySXRlcmF0b3IoIEl0ZXJhdG9yIGNvcmUgKSB7Ci0gICAgICAgIHRoaXMuY29yZSA9IGNvcmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MgdG8gZmlsdGVyIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUKLSAgICAgKiAgICAgIHRvIGxldCB0aGUgaXRlcmF0b3IgcmV0dXJuIHRoZSBvYmplY3QgdG8gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBhbGxvd3MoIE9iamVjdCBvICk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICB3aGlsZShuZXh0PT1udWxsICYmIGNvcmUuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvLyBmZXRjaCBuZXh0Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGNvcmUubmV4dCgpOwotICAgICAgICAgICAgaWYoIGFsbG93cyhvKSApCi0gICAgICAgICAgICAgICAgbmV4dCA9IG87Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5leHQhPW51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICBPYmplY3QgciA9IG5leHQ7Ci0gICAgICAgIG5leHQgPSBudWxsOwotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL1Jlc291cmNlRW50aXR5UmVzb2x2ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL1Jlc291cmNlRW50aXR5UmVzb2x2ZXIuamF2YQppbmRleCBkMGJmMTQ5Li4xNDIyYWU3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvdXRpbC9SZXNvdXJjZUVudGl0eVJlc29sdmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3V0aWwvUmVzb3VyY2VFbnRpdHlSZXNvbHZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL1NjaGVtYVRyZWVUcmF2ZXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL1NjaGVtYVRyZWVUcmF2ZXJzZXIuamF2YQppbmRleCBlZmVlNmU1Li4zZmFkNTQwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvdXRpbC9TY2hlbWFUcmVlVHJhdmVyc2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3V0aWwvU2NoZW1hVHJlZVRyYXZlcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLmltcGwudXRpbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9pbXBsL3V0aWwvU2NoZW1hV3JpdGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvdXRpbC9TY2hlbWFXcml0ZXIuamF2YQppbmRleCAyYjEwMmFlLi5iODBiMTZjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvdXRpbC9TY2hlbWFXcml0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvdXRpbC9TY2hlbWFXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL2ltcGwvdXRpbC9VcmkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL1VyaS5qYXZhCmluZGV4IDZjMzhhY2EuLjA3Mzg5NmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL1VyaS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vaW1wbC91dGlsL1VyaS5qYXZhCkBAIC0xLDQgKzEsMjggQEAKIC8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKy8qCiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFja2FnZS5odG1sCmluZGV4IDAzMzhhNmIuLjc0ZTYwOWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPjxib2R5PgogSW50ZXJmYWNlcyB0aGF0IHRoZSBjbGllbnQgc2hvdWxkIHVzZSB0byBhY2Nlc3Mgc2NoZW1hIGluZm9ybWF0aW9uLgogPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL0Fubm90YXRpb25Db250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9Bbm5vdGF0aW9uQ29udGV4dC5qYXZhCmluZGV4IDMxMDliMzUuLmFjNTYxNmUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL0Fubm90YXRpb25Db250ZXh0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvQW5ub3RhdGlvbkNvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5wYXJzZXI7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvQW5ub3RhdGlvblBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvQW5ub3RhdGlvblBhcnNlci5qYXZhCmluZGV4IDRmNzUyMTkuLjQwNGRjZWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL0Fubm90YXRpb25QYXJzZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9Bbm5vdGF0aW9uUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9Bbm5vdGF0aW9uUGFyc2VyRmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvQW5ub3RhdGlvblBhcnNlckZhY3RvcnkuamF2YQppbmRleCBhNDRiNjgxLi5hY2Q5MDE1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9Bbm5vdGF0aW9uUGFyc2VyRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL0Fubm90YXRpb25QYXJzZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL0pBWFBQYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL0pBWFBQYXJzZXIuamF2YQppbmRleCA5NTU4MjIwLi40M2NhZTIxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9KQVhQUGFyc2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvSkFYUFBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnBhcnNlcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9TY2hlbWFEb2N1bWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvU2NoZW1hRG9jdW1lbnQuamF2YQppbmRleCBjYWUxYWVhLi4xYjk5YjY1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9TY2hlbWFEb2N1bWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL1NjaGVtYURvY3VtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1NjaGVtYTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL1hNTFBhcnNlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvWE1MUGFyc2VyLmphdmEKaW5kZXggMTk5Nzc4ZC4uNWRiYWVkYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvWE1MUGFyc2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvWE1MUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL1hTT01QYXJzZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL1hTT01QYXJzZXIuamF2YQppbmRleCBhY2UxY2VhLi5hMzEzZWE2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9YU09NUGFyc2VyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvWFNPTVBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnBhcnNlcjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vcGFyc2VyL3BhY2thZ2UuaHRtbAppbmRleCBlY2NkYzdmLi40Mjk4OTM0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3BhcnNlci9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS9wYXJzZXIvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPjxib2R5PgogQ2xhc3NlcyB0byBwYXJzZSBYTUwgU2NoZW1hIGRvY3VtZW50cyBpbnRvIG9iamVjdHMgb2YgPGNvZGU+Y29tLnN1bi54bWwueHNvbTwvY29kZT4gcGFja2FnZS4KIDwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvQ29tcG9uZW50TmFtZUZ1bmN0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvQ29tcG9uZW50TmFtZUZ1bmN0aW9uLmphdmEKaW5kZXggOWM0MmUyMi4uYjg1NTM2MiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL0NvbXBvbmVudE5hbWVGdW5jdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9Db21wb25lbnROYW1lRnVuY3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS51dGlsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0Fubm90YXRpb247CkBAIC00OCw2ICs0Nyw3IEBACiAgKiBFeHRyYWN0IHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnRzLgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKICAqLwogcHVibGljIGNsYXNzIENvbXBvbmVudE5hbWVGdW5jdGlvbiBpbXBsZW1lbnRzIFhTRnVuY3Rpb248U3RyaW5nPiB7CiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9EZWZlcmVkQ29sbGVjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL0RlZmVyZWRDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4YTg4YgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9EZWZlcmVkQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCisvKioKKyAqIHtAbGluayBDb2xsZWN0aW9ufSB0aGF0IHJldHVybnMgdGhlIHZpZXcgb2Ygb2JqZWN0cyB3aGljaCBhcmUgYWN0dWFsbHkgZmV0Y2hlZAorICogbGF6aWx5IGZyb20gYW4ge0BsaW5rIEl0ZXJhdG9yfS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZlcmVkQ29sbGVjdGlvbjxUPiBpbXBsZW1lbnRzIENvbGxlY3Rpb248VD4geworICAgIC8qKgorICAgICAqIFRoZSBpdGVyYXRvciB0aGF0IGxhemlseSBldmFsdWF0ZXMgU0NEIHF1ZXJ5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8VD4gcmVzdWx0OworCisgICAgLyoqCisgICAgICogU3RvcmVzIHZhbHVlcyB0aGF0IGFyZSBhbHJlYWR5IGZldGNoZWQgZnJvbSB7QGxpbmsgI3Jlc3VsdH0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFQ+IGFyY2hpdmUgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisKKyAgICBwdWJsaWMgRGVmZXJlZENvbGxlY3Rpb24oSXRlcmF0b3I8VD4gcmVzdWx0KSB7CisgICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIGlmKGFyY2hpdmUuaXNFbXB0eSgpKQorICAgICAgICAgICAgZmV0Y2goKTsKKyAgICAgICAgcmV0dXJuIGFyY2hpdmUuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgZmV0Y2hBbGwoKTsKKyAgICAgICAgcmV0dXJuIGFyY2hpdmUuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgIGlmKGFyY2hpdmUuY29udGFpbnMobykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgd2hpbGUocmVzdWx0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVCB2YWx1ZSA9IHJlc3VsdC5uZXh0KCk7CisgICAgICAgICAgICBhcmNoaXZlLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICBpZih2YWx1ZS5lcXVhbHMobykpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICBmb3IgKE9iamVjdCBvIDogYykgeworICAgICAgICAgICAgaWYoIWNvbnRhaW5zKG8pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8VD4oKSB7CisgICAgICAgICAgICBpbnQgaWR4PTA7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIGlmKGlkeDxhcmNoaXZlLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5oYXNOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUIG5leHQoKSB7CisgICAgICAgICAgICAgICAgaWYoaWR4PT1hcmNoaXZlLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2goKTsKKyAgICAgICAgICAgICAgICBpZihpZHg9PWFyY2hpdmUuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiBhcmNoaXZlLmdldChpZHgrKyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CisgICAgICAgIGZldGNoQWxsKCk7CisgICAgICAgIHJldHVybiBhcmNoaXZlLnRvQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+VFtdIHRvQXJyYXkoVFtdIGEpIHsKKyAgICAgICAgZmV0Y2hBbGwoKTsKKyAgICAgICAgcmV0dXJuIGFyY2hpdmUudG9BcnJheShhKTsKKyAgICB9CisKKworCisgICAgcHJpdmF0ZSB2b2lkIGZldGNoQWxsKCkgeworICAgICAgICB3aGlsZShyZXN1bHQuaGFzTmV4dCgpKQorICAgICAgICAgICAgYXJjaGl2ZS5hZGQocmVzdWx0Lm5leHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhbm90aGVyIGl0ZW0gZnJvbSB7QGxpbmsKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmV0Y2goKSB7CisgICAgICAgIGlmKHJlc3VsdC5oYXNOZXh0KCkpCisgICAgICAgICAgICBhcmNoaXZlLmFkZChyZXN1bHQubmV4dCgpKTsKKyAgICB9CisKKy8vIG11dGF0aW9uIG1ldGhvZHMgYXJlIHVuc3VwcG9ydGVkCisgICAgcHVibGljIGJvb2xlYW4gYWRkKFQgbykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvRG9tQW5ub3RhdGlvblBhcnNlckZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9Eb21Bbm5vdGF0aW9uUGFyc2VyRmFjdG9yeS5qYXZhCmluZGV4IDY2NWExMjUuLjJjYWMwM2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9Eb21Bbm5vdGF0aW9uUGFyc2VyRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9Eb21Bbm5vdGF0aW9uUGFyc2VyRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDI0ICsyMiwyMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udXRpbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBbm5vdGF0aW9uOwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyLkFubm90YXRpb25Db250ZXh0OwogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20ucGFyc2VyLkFubm90YXRpb25QYXJzZXI7CiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5wYXJzZXIuQW5ub3RhdGlvblBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwogCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKIAogLyoqCiAgKiB7QGxpbmsgQW5ub3RhdGlvblBhcnNlckZhY3Rvcnl9IHRoYXQgcGFyc2VzIGFubm90YXRpb25zIGludG8gYSBXM0MgRE9NLgpAQCAtOTEsOCArOTAsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGwgdGhlIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgRWxlbWVudCBwcmV2ID0gKEVsZW1lbnQpIGV4aXN0aW5nOwogICAgICAgICAgICAgICAgIE5vZGUgYW5jaG9yID0gZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUocHJldi5nZXRGaXJzdENoaWxkKCkhPW51bGwpCi0gICAgICAgICAgICAgICAgICAgIGUuaW5zZXJ0QmVmb3JlKHByZXYuZ2V0Rmlyc3RDaGlsZCgpLCBhbmNob3IgKTsKKyAgICAgICAgICAgICAgICB3aGlsZShwcmV2LmdldEZpcnN0Q2hpbGQoKSE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBOb2RlIG1vdmUgPSBwcmV2LmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgZS5pbnNlcnRCZWZvcmUoZS5nZXRPd25lckRvY3VtZW50KCkuYWRvcHROb2RlKG1vdmUpLCBhbmNob3IgKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL05hbWVHZXR0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9OYW1lR2V0dGVyLmphdmEKaW5kZXggMmM1MDZiZC4uYmVhMTJhZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL05hbWVHZXR0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvTmFtZUdldHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL05hbWVHZXR0ZXIucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9OYW1lR2V0dGVyLnByb3BlcnRpZXMKaW5kZXggZDU4MzhjNy4uMWQ0NGIyMyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL05hbWVHZXR0ZXIucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvTmFtZUdldHRlci5wcm9wZXJ0aWVzCkBAIC0xLDYgKzEsMzEgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBhbm5vdGF0aW9uCQk9IGFubm90YXRpb24KIGF0dEdyb3VwRGVjbAk9IGF0dHJpYnV0ZSBncm91cCBkZWNsYXJhdGlvbgotYXR0cmlidXRlRGVjbAk9IGF0dHJpYnR1ZSBkZWNsYXJhdGlvbgorYXR0cmlidXRlRGVjbAk9IGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgogYXR0cmlidXRlVXNlCT0gYXR0cmlidXRlIHVzZQogY29tcGxleFR5cGUJCT0gY29tcGxleCB0eXBlCiBzY2hlbWEJCQk9IHNjaGVtYQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL1NpbXBsZVR5cGVTZXQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9TaW1wbGVUeXBlU2V0LmphdmEKaW5kZXggODhjNWJiMC4uMjQ2NGQwNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL1NpbXBsZVR5cGVTZXQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvU2ltcGxlVHlwZVNldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL1R5cGVDbG9zdXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvVHlwZUNsb3N1cmUuamF2YQppbmRleCAzYTRjYjgyLi43YjVmMmEwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvVHlwZUNsb3N1cmUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvVHlwZUNsb3N1cmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS51dGlsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU1R5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvVHlwZVNldC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL1R5cGVTZXQuamF2YQppbmRleCBlYTAyZjE5Li5jOTA0MWIyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvVHlwZVNldC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9UeXBlU2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udXRpbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNUeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL1hTRmluZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvWFNGaW5kZXIuamF2YQppbmRleCA2Njc4ZjE3Li40NmE1MmQ1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvWFNGaW5kZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvWFNGaW5kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS51dGlsOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0Fubm90YXRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvWFNGdW5jdGlvbkZpbHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS91dGlsL1hTRnVuY3Rpb25GaWx0ZXIuamF2YQppbmRleCA0NzA0NjdiLi4yYmE2OWQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3V0aWwvWFNGdW5jdGlvbkZpbHRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdXRpbC9YU0Z1bmN0aW9uRmlsdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udXRpbDsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTQ29udGVudFR5cGVGdW5jdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTQ29udGVudFR5cGVGdW5jdGlvbi5qYXZhCmluZGV4IDgwZTMyNmMuLmVjY2ZmMjMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU0NvbnRlbnRUeXBlRnVuY3Rpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNDb250ZW50VHlwZUZ1bmN0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb250ZW50VHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU0NvbnRlbnRUeXBlVmlzaXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTQ29udGVudFR5cGVWaXNpdG9yLmphdmEKaW5kZXggM2M5ZGFiMS4uNTlhNzBiMiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTQ29udGVudFR5cGVWaXNpdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTQ29udGVudFR5cGVWaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNDb250ZW50VHlwZTsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU0Z1bmN0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNGdW5jdGlvbi5qYXZhCmluZGV4IDY0MGNjODc4Li5mMzlmMjVjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNGdW5jdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU0Z1bmN0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNBbm5vdGF0aW9uOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTU2ltcGxlVHlwZUZ1bmN0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNTaW1wbGVUeXBlRnVuY3Rpb24uamF2YQppbmRleCA4N2ZkNzUwLi44N2E0ZTc0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNTaW1wbGVUeXBlRnVuY3Rpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNTaW1wbGVUeXBlRnVuY3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS52aXNpdG9yOwogCiBpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwueHNvbS5YU0xpc3RTaW1wbGVUeXBlOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTU2ltcGxlVHlwZVZpc2l0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1NpbXBsZVR5cGVWaXNpdG9yLmphdmEKaW5kZXggZjc0NmQ5Yy4uMDg0YjZkMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTU2ltcGxlVHlwZVZpc2l0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNTaW1wbGVUeXBlVmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3I7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTTGlzdFNpbXBsZVR5cGU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNUZXJtRnVuY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Rlcm1GdW5jdGlvbi5qYXZhCmluZGV4IDI3YjgzOTAuLjA2Zjg4MDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Rlcm1GdW5jdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Rlcm1GdW5jdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3I7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTRWxlbWVudERlY2w7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNUZXJtRnVuY3Rpb25XaXRoUGFyYW0uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Rlcm1GdW5jdGlvbldpdGhQYXJhbS5qYXZhCmluZGV4IDJlMzMyNTguLmYwODJmMDYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Rlcm1GdW5jdGlvbldpdGhQYXJhbS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Rlcm1GdW5jdGlvbldpdGhQYXJhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3I7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTV2lsZGNhcmQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNUZXJtVmlzaXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTVGVybVZpc2l0b3IuamF2YQppbmRleCA1YjA2NWE2Li44ZDM5OTc1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNUZXJtVmlzaXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Rlcm1WaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20udmlzaXRvcjsKIAogaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLnhzb20uWFNFbGVtZW50RGVjbDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Zpc2l0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1Zpc2l0b3IuamF2YQppbmRleCBiOTI4NzRjLi4zM2Q3YmE0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNWaXNpdG9yLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTVmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3I7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTQW5ub3RhdGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1dpbGRjYXJkRnVuY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1dpbGRjYXJkRnVuY3Rpb24uamF2YQppbmRleCA4OTJkN2IzLi5mMDNlNzAzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNXaWxkY2FyZEZ1bmN0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL1hTV2lsZGNhcmRGdW5jdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3I7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTV2lsZGNhcmQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvWFNXaWxkY2FyZFZpc2l0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1dpbGRjYXJkVmlzaXRvci5qYXZhCmluZGV4IDJkY2E2MTUuLjY5OTUxM2UgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1dpbGRjYXJkVmlzaXRvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9YU1dpbGRjYXJkVmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLnZpc2l0b3I7CiAKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC54c29tLlhTV2lsZGNhcmQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi94bWwvaW50ZXJuYWwveHNvbS92aXNpdG9yL3BhY2thZ2UuaHRtbAppbmRleCA5ZDFhMTVmLi5hMDc2ZWQ0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3htbC9pbnRlcm5hbC94c29tL3Zpc2l0b3IvcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4veG1sL2ludGVybmFsL3hzb20vdmlzaXRvci9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGh0bWw+PGJvZHk+CiBWaXNpdG9yIHBhdHRlcm4gc3VwcG9ydCBmb3IgdGhlIDxjb2RlPmNvbS5zdW4ueG1sLnhzb208L2NvZGU+IGludGVyZmFjZXMuCiA8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYWN0aXZhdGlvbi9BY3RpdmF0aW9uRGF0YUZsYXZvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYWN0aXZhdGlvbi9BY3RpdmF0aW9uRGF0YUZsYXZvci5qYXZhCmluZGV4IDM1MDE0MzUuLjdiOWNiYWYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2FjdGl2YXRpb24vQWN0aXZhdGlvbkRhdGFGbGF2b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hY3RpdmF0aW9uL0FjdGl2YXRpb25EYXRhRmxhdm9yLmphdmEKQEAgLTIwNCw3ICsyMDQsMTAgQEAKICAgICAgICAgICAgIGlmIChtaW1lT2JqZWN0ID09IG51bGwpCiAgICAgICAgICAgICAgICAgbWltZU9iamVjdCA9IG5ldyBNaW1lVHlwZSh0aGlzLm1pbWVUeXBlKTsKICAgICAgICAgICAgIG10ID0gbmV3IE1pbWVUeXBlKG1pbWVUeXBlKTsKLSAgICAgICAgfSBjYXRjaCAoTWltZVR5cGVQYXJzZUV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB9IGNhdGNoIChNaW1lVHlwZVBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHNvbWV0aGluZyBkaWRuJ3QgcGFyc2UsIGRvIGEgY3J1ZGUgY29tcGFyaXNvbgorICAgICAgICAgICAgcmV0dXJuIHRoaXMubWltZVR5cGUuZXF1YWxzSWdub3JlQ2FzZShtaW1lVHlwZSk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gbWltZU9iamVjdC5tYXRjaChtdCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYWN0aXZhdGlvbi9NYWlsY2FwQ29tbWFuZE1hcC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYWN0aXZhdGlvbi9NYWlsY2FwQ29tbWFuZE1hcC5qYXZhCmluZGV4IGYzMTIzMjYuLjhiNmZjMzEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2FjdGl2YXRpb24vTWFpbGNhcENvbW1hbmRNYXAuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hY3RpdmF0aW9uL01haWxjYXBDb21tYW5kTWFwLmphdmEKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29tbWFuZEluZm9bXSBnZXRQcmVmZXJyZWRDb21tYW5kcyhTdHJpbmcgbWltZVR5cGUpIHsKICAgICAgICAgTGlzdCBjbWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIG1pbWVUeXBlID0gbWltZVR5cGUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIG1pbWVUeXBlID0gbWltZVR5cGUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGlmIChEQltpXSA9PSBudWxsKQpAQCAtNDE0LDcgKzQxNCw3IEBACiAgICAgcHVibGljIHN5bmNocm9uaXplZCBDb21tYW5kSW5mb1tdIGdldEFsbENvbW1hbmRzKFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICBMaXN0IGNtZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsKQotICAgICAgICAgICAgbWltZVR5cGUgPSBtaW1lVHlwZS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgbWltZVR5cGUgPSBtaW1lVHlwZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBEQi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgaWYgKERCW2ldID09IG51bGwpCkBAIC00NjgsNyArNDY4LDcgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIENvbW1hbmRJbmZvIGdldENvbW1hbmQoU3RyaW5nIG1pbWVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY21kTmFtZSkgewogICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgIG1pbWVUeXBlID0gbWltZVR5cGUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIG1pbWVUeXBlID0gbWltZVR5cGUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGlmIChEQltpXSA9PSBudWxsKQpAQCAtNTM1LDcgKzUzNSw3IEBACiAgICAgICAgICAgICBMb2dTdXBwb3J0LmxvZygKICAgICAgICAgICAgICAgICAiTWFpbGNhcENvbW1hbmRNYXA6IGNyZWF0ZURhdGFDb250ZW50SGFuZGxlciBmb3IgIiArIG1pbWVUeXBlKTsKICAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwpCi0gICAgICAgICAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IERCLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoREJbaV0gPT0gbnVsbCkKQEAgLTY1Miw3ICs2NTIsNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0TmF0aXZlQ29tbWFuZHMoU3RyaW5nIG1pbWVUeXBlKSB7CiAgICAgICAgIExpc3QgY21kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwpCi0gICAgICAgICAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IERCLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoREJbaV0gPT0gbnVsbCkKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2FjdGl2YXRpb24vTWltZVR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2FjdGl2YXRpb24vTWltZVR5cGUuamF2YQppbmRleCAzZTMwOWZkLi4wYjBmNzg4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hY3RpdmF0aW9uL01pbWVUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYWN0aXZhdGlvbi9NaW1lVHlwZS5qYXZhCkBAIC0yNSwxMCArMjUsOCBAQAogCiBwYWNrYWdlIGphdmF4LmFjdGl2YXRpb247CiAKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgogICogQSBNdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb24gKE1JTUUpIHR5cGUsIGFzIGRlZmluZWQKQEAgLTc3LDE0ICs3NSwxNCBAQAogICAgIHB1YmxpYyBNaW1lVHlwZShTdHJpbmcgcHJpbWFyeSwgU3RyaW5nIHN1YikgdGhyb3dzIE1pbWVUeXBlUGFyc2VFeGNlcHRpb24gewogICAgICAgICAvLyAgICBjaGVjayB0byBzZWUgaWYgcHJpbWFyeSBpcyB2YWxpZAogICAgICAgICBpZiAoaXNWYWxpZFRva2VuKHByaW1hcnkpKSB7Ci0gICAgICAgICAgICBwcmltYXJ5VHlwZSA9IHByaW1hcnkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIHByaW1hcnlUeXBlID0gcHJpbWFyeS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTWltZVR5cGVQYXJzZUV4Y2VwdGlvbigiUHJpbWFyeSB0eXBlIGlzIGludmFsaWQuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyAgICBjaGVjayB0byBzZWUgaWYgc3ViIGlzIHZhbGlkCiAgICAgICAgIGlmIChpc1ZhbGlkVG9rZW4oc3ViKSkgewotICAgICAgICAgICAgc3ViVHlwZSA9IHN1Yi50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgc3ViVHlwZSA9IHN1Yi50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTWltZVR5cGVQYXJzZUV4Y2VwdGlvbigiU3ViIHR5cGUgaXMgaW52YWxpZC4iKTsKICAgICAgICAgfQpAQCAtMTA4LDE0ICsxMDYsMTcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBNaW1lVHlwZVBhcnNlRXhjZXB0aW9uKCJVbmFibGUgdG8gZmluZCBhIHN1YiB0eXBlLiIpOwogICAgICAgICB9IGVsc2UgaWYgKChzbGFzaEluZGV4ID49IDApICYmIChzZW1JbmRleCA8IDApKSB7CiAgICAgICAgICAgICAvLyAgICB3ZSBoYXZlIGEgcHJpbWFyeSBhbmQgc3ViIHR5cGUgYnV0IG5vIHBhcmFtZXRlciBsaXN0Ci0gICAgICAgICAgICBwcmltYXJ5VHlwZSA9IHJhd2RhdGEuc3Vic3RyaW5nKDAsIHNsYXNoSW5kZXgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgc3ViVHlwZSA9IHJhd2RhdGEuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKS50cmltKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIHByaW1hcnlUeXBlID0gcmF3ZGF0YS5zdWJzdHJpbmcoMCwgc2xhc2hJbmRleCkudHJpbSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICAgICAgc3ViVHlwZSA9IHJhd2RhdGEuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKS50cmltKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IE1pbWVUeXBlUGFyYW1ldGVyTGlzdCgpOwogICAgICAgICB9IGVsc2UgaWYgKHNsYXNoSW5kZXggPCBzZW1JbmRleCkgewogICAgICAgICAgICAgLy8gICAgd2UgaGF2ZSBhbGwgdGhyZWUgaXRlbXMgaW4gdGhlIHByb3BlciBzZXF1ZW5jZQotICAgICAgICAgICAgcHJpbWFyeVR5cGUgPSByYXdkYXRhLnN1YnN0cmluZygwLCBzbGFzaEluZGV4KS50cmltKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIHN1YlR5cGUgPSByYXdkYXRhLnN1YnN0cmluZyhzbGFzaEluZGV4ICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbUluZGV4KS50cmltKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIHByaW1hcnlUeXBlID0gcmF3ZGF0YS5zdWJzdHJpbmcoMCwgc2xhc2hJbmRleCkudHJpbSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICAgICAgc3ViVHlwZSA9IHJhd2RhdGEuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxLCBzZW1JbmRleCkudHJpbSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwogICAgICAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBNaW1lVHlwZVBhcmFtZXRlckxpc3QocmF3ZGF0YS5zdWJzdHJpbmcoc2VtSW5kZXgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSAnOycgbGV4aWNhbGx5IGJlZm9yZSBhICcvJyB3aGljaCBtZWFucyB3ZQpAQCAtMTU0LDcgKzE1NSw3IEBACiAgICAgICAgIC8vICAgIGNoZWNrIHRvIHNlZSBpZiBwcmltYXJ5IGlzIHZhbGlkCiAgICAgICAgIGlmICghaXNWYWxpZFRva2VuKHByaW1hcnlUeXBlKSkKICAgICAgICAgICAgIHRocm93IG5ldyBNaW1lVHlwZVBhcnNlRXhjZXB0aW9uKCJQcmltYXJ5IHR5cGUgaXMgaW52YWxpZC4iKTsKLSAgICAgICAgcHJpbWFyeVR5cGUgPSBwcmltYXJ5LnRvTG93ZXJDYXNlKCk7CisgICAgICAgIHByaW1hcnlUeXBlID0gcHJpbWFyeS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzcsNyArMTc4LDcgQEAKICAgICAgICAgLy8gICAgY2hlY2sgdG8gc2VlIGlmIHN1YiBpcyB2YWxpZAogICAgICAgICBpZiAoIWlzVmFsaWRUb2tlbihzdWJUeXBlKSkKICAgICAgICAgICAgIHRocm93IG5ldyBNaW1lVHlwZVBhcnNlRXhjZXB0aW9uKCJTdWIgdHlwZSBpcyBpbnZhbGlkLiIpOwotICAgICAgICBzdWJUeXBlID0gc3ViLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIHN1YlR5cGUgPSBzdWIudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYWN0aXZhdGlvbi9NaW1lVHlwZVBhcmFtZXRlckxpc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2FjdGl2YXRpb24vTWltZVR5cGVQYXJhbWV0ZXJMaXN0LmphdmEKaW5kZXggZTQwMzNkYy4uNWM0NDllZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYWN0aXZhdGlvbi9NaW1lVHlwZVBhcmFtZXRlckxpc3QuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hY3RpdmF0aW9uL01pbWVUeXBlUGFyYW1ldGVyTGlzdC5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKICAqIEEgcGFyYW1ldGVyIGxpc3Qgb2YgYSBNaW1lVHlwZQpAQCAtMTA1LDcgKzEwNiw4IEBACiAgICAgICAgICAgICB3aGlsZSAoKGkgPCBsZW5ndGgpICYmIGlzVG9rZW5DaGFyKHBhcmFtZXRlckxpc3QuY2hhckF0KGkpKSkKICAgICAgICAgICAgICAgICBpKys7CiAKLSAgICAgICAgICAgIG5hbWUgPSBwYXJhbWV0ZXJMaXN0LnN1YnN0cmluZyhsYXN0SW5kZXgsIGkpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBuYW1lID0gcGFyYW1ldGVyTGlzdC5zdWJzdHJpbmcobGFzdEluZGV4LCBpKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKIAogICAgICAgICAgICAgLy8gICAgbm93IHBhcnNlIHRoZSAnPScgdGhhdCBzZXBhcmF0ZXMgdGhlIG5hbWUgZnJvbSB0aGUgdmFsdWUKICAgICAgICAgICAgIGkgPSBza2lwV2hpdGVTcGFjZShwYXJhbWV0ZXJMaXN0LCBpKTsKQEAgLTIwMiw3ICsyMDQsNyBAQAogICAgICAqIEByZXR1cm4gICAgICAgICAgdGhlIHBhcmFtZXRlcidzIHZhbHVlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpcGFyYW1ldGVycy5nZXQobmFtZS50cmltKCkudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIHJldHVybiAoU3RyaW5nKXBhcmFtZXRlcnMuZ2V0KG5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTMsNyArMjE1LDcgQEAKICAgICAgKiBAcGFyYW0gdmFsdWUgICAgIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCksIHZhbHVlKTsKKyAgICAgICAgcGFyYW1ldGVycy5wdXQobmFtZS50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMjIsNyArMjI0LDcgQEAKICAgICAgKiBAcGFyYW0gbmFtZSAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgbmFtZSkgewotICAgICAgICBwYXJhbWV0ZXJzLnJlbW92ZShuYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUobmFtZS50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0NvbnRleHRGaW5kZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0NvbnRleHRGaW5kZXIuamF2YQppbmRleCAzMzViNTFlMGIuLjRkMGVlZTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0NvbnRleHRGaW5kZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9Db250ZXh0RmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zOSw2ICszOSw4IEBACiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXI7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CiAKIGltcG9ydCBzdGF0aWMgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQuSkFYQl9DT05URVhUX0ZBQ1RPUlk7CiAKQEAgLTUxLDYgKzUzLDcgQEAKICAqIFRoaXMgY29kZSBpcyBkZXNpZ25lZCB0byBpbXBsZW1lbnQgdGhlIEpBWEIgMS4wIHNwZWMgcGx1Z2dhYmlsaXR5IGZlYXR1cmUKICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKiBAc2VlIEpBWEJDb250ZXh0CiAgKi8KIGNsYXNzIENvbnRleHRGaW5kZXIgewpAQCAtNTgsNyArNjEsNyBAQAogICAgIHN0YXRpYyB7CiAgICAgICAgIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoImphdmF4LnhtbC5iaW5kIik7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXhiLmRlYnVnIiwgbnVsbCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigiamF4Yi5kZWJ1ZyIpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gZGlzY29ubmVjdCB0aGUgbG9nZ2VyIGZyb20gYSBiaWdnZXIgZnJhbWV3b3JrIChpZiBhbnkpCiAgICAgICAgICAgICAgICAgLy8gYW5kIHRha2UgdGhlIG1hdHRlcnMgaW50byBvdXIgb3duIGhhbmRzCiAgICAgICAgICAgICAgICAgbG9nZ2VyLnNldFVzZVBhcmVudEhhbmRsZXJzKGZhbHNlKTsKQEAgLTEwNSwxNyArMTA4LDE2IEBACiAgICAgICogICAgICAgICAgVGhlIENsYXNzIG9iamVjdCBvZiB0aGUgdHlwZSBiZWluZyBjYXN0CiAgICAgICogQHBhcmFtIHRhcmdldFR5cGUKICAgICAgKiAgICAgICAgICBUaGUgQ2xhc3Mgb2JqZWN0IG9mIHRoZSB0eXBlIHRoYXQgaXMgYmVpbmcgY2FzdCB0bwotICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIElmIHRoZSBjYXN0IHdvdWxkIGZhaWwKKyAgICAgKiBAcmV0dXJuIEpBWEJFeGNlcHRpb24gdG8gYmUgdGhyb3duLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlQ2xhc3NDYXN0RXhjZXB0aW9uKENsYXNzIG9yaWdpbmFsVHlwZSwgQ2xhc3MgdGFyZ2V0VHlwZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIEpBWEJFeGNlcHRpb24gaGFuZGxlQ2xhc3NDYXN0RXhjZXB0aW9uKENsYXNzIG9yaWdpbmFsVHlwZSwgQ2xhc3MgdGFyZ2V0VHlwZSkgewogICAgICAgICBmaW5hbCBVUkwgdGFyZ2V0VHlwZVVSTCA9IHdoaWNoKHRhcmdldFR5cGUpOwogCi0gICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKE1lc3NhZ2VzLmZvcm1hdChNZXNzYWdlcy5JTExFR0FMX0NBU1QsCisgICAgICAgIHJldHVybiBuZXcgSkFYQkV4Y2VwdGlvbihNZXNzYWdlcy5mb3JtYXQoTWVzc2FnZXMuSUxMRUdBTF9DQVNULAogICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGNhcmUgd2hlcmUgdGhlIGltcGwgY2xhc3MgaXMsIHdlIHdhbnQgdG8ga25vdyB3aGVyZSBKQVhCQ29udGV4dCBsaXZlcyBpbiB0aGUgaW1wbAogICAgICAgICAgICAgICAgIC8vIGNsYXNzJyBDbGFzc0xvYWRlcgotICAgICAgICAgICAgICAgIG9yaWdpbmFsVHlwZS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImphdmF4L3htbC9iaW5kL0pBWEJDb250ZXh0LmNsYXNzIikudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICB0YXJnZXRUeXBlVVJMLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICBvcmlnaW5hbFR5cGUuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiamF2YXgveG1sL2JpbmQvSkFYQkNvbnRleHQuY2xhc3MiKSwKKyAgICAgICAgICAgICAgICB0YXJnZXRUeXBlVVJMKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjgsMTIgKzEzMCw3IEBACiAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uCiAgICAgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3Mgc3BpQ2xhc3M7Ci0gICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNwaUNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcGlDbGFzcyA9IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2xhc3Mgc3BpQ2xhc3MgPSBzYWZlTG9hZENsYXNzKGNsYXNzTmFtZSxjbGFzc0xvYWRlcik7CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBqYXZheC54bWwuYmluZC5jb250ZXh0LmZhY3RvcnkgcG9pbnRzIHRvIGEgY2xhc3Mgd2hpY2ggaGFzIGEKQEAgLTE1MCw3ICsxNDcsNyBAQAogICAgICAgICAgICAgICAgIC8vIGFueSBmYWlsdXJlIGluIGludm9raW5nIHRoaXMgbWV0aG9kIHdvdWxkIGJlIGNvbnNpZGVyZWQgZmF0YWwKICAgICAgICAgICAgICAgICBjb250ZXh0ID0gbS5pbnZva2UobnVsbCxjb250ZXh0UGF0aCxjbGFzc0xvYWRlcixwcm9wZXJ0aWVzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgOyAvLyBpdCdzIG5vdCBhbiBlcnJvciBmb3IgdGhlIHByb3ZpZGVyIG5vdCB0byBoYXZlIHRoaXMgbWV0aG9kLgorICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IGFuIGVycm9yIGZvciB0aGUgcHJvdmlkZXIgbm90IHRvIGhhdmUgdGhpcyBtZXRob2QuCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmKGNvbnRleHQ9PW51bGwpIHsKQEAgLTIwNSwxMSArMjAyLDcgQEAKICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwogICAgICAgICBDbGFzcyBzcGk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2dnZXIuZmluZSgiVHJ5aW5nIHRvIGxvYWQgIitjbGFzc05hbWUpOwotICAgICAgICAgICAgaWYgKGNsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3BpID0gY2wubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3BpID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgICAgICAgc3BpID0gc2FmZUxvYWRDbGFzcyhjbGFzc05hbWUsY2wpOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOwogICAgICAgICB9CkBAIC0yMjksNyArMjIyLDcgQEAKICAgICAgICAgICAgIE9iamVjdCBjb250ZXh0ID0gbS5pbnZva2UobnVsbCwgY2xhc3NlcywgcHJvcGVydGllcyk7CiAgICAgICAgICAgICBpZighKGNvbnRleHQgaW5zdGFuY2VvZiBKQVhCQ29udGV4dCkpIHsKICAgICAgICAgICAgICAgICAvLyB0aGUgY2FzdCB3b3VsZCBmYWlsLCBzbyBnZW5lcmF0ZSBhbiBleGNlcHRpb24gd2l0aCBhIG5pY2UgbWVzc2FnZQotICAgICAgICAgICAgICAgIGhhbmRsZUNsYXNzQ2FzdEV4Y2VwdGlvbihjb250ZXh0LmdldENsYXNzKCksIEpBWEJDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBoYW5kbGVDbGFzc0Nhc3RFeGNlcHRpb24oY29udGV4dC5nZXRDbGFzcygpLCBKQVhCQ29udGV4dC5jbGFzcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gKEpBWEJDb250ZXh0KWNvbnRleHQ7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewpAQCAtMjcwLDkgKzI2Myw3IEBACiAgICAgICAgICAgICAgcHJvcEZpbGVOYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQocGFja2FnZU5hbWUpLmFwcGVuZCgiL2pheGIucHJvcGVydGllcyIpOwogCiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbG9hZEpBWEJQcm9wZXJ0aWVzKCBjbGFzc0xvYWRlciwgcHJvcEZpbGVOYW1lLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIGlmIChwcm9wcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHByb3BzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAocHJvcHMuY29udGFpbnNLZXkoZmFjdG9yeUlkKSkgewogICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3NOYW1lID0gcHJvcHMuZ2V0UHJvcGVydHkoZmFjdG9yeUlkKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKCBjb250ZXh0UGF0aCwgZmFjdG9yeUNsYXNzTmFtZSwgY2xhc3NMb2FkZXIsIHByb3BlcnRpZXMgKTsKQEAgLTI4NSw3ICsyNzYsNyBAQAogICAgICAgICBsb2dnZXIuZmluZSgiU2VhcmNoaW5nIHRoZSBzeXN0ZW0gcHJvcGVydHkiKTsKIAogICAgICAgICAvLyBzZWFyY2ggZm9yIGEgc3lzdGVtIHByb3BlcnR5IHNlY29uZCAoamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQpCi0gICAgICAgIGZhY3RvcnlDbGFzc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoamF4YkNvbnRleHRGUUNOLCBudWxsKTsKKyAgICAgICAgZmFjdG9yeUNsYXNzTmFtZSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBHZXRQcm9wZXJ0eUFjdGlvbihqYXhiQ29udGV4dEZRQ04pKTsKICAgICAgICAgaWYoICBmYWN0b3J5Q2xhc3NOYW1lICE9IG51bGwgKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UoIGNvbnRleHRQYXRoLCBmYWN0b3J5Q2xhc3NOYW1lLCBjbGFzc0xvYWRlciwgcHJvcGVydGllcyApOwogICAgICAgICB9CkBAIC0zMDIsNiArMjkzLDcgQEAKICAgICAgICAgICAgIGlmIChyZXNvdXJjZVN0cmVhbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2VTdHJlYW0sICJVVEYtOCIpKTsKICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3NOYW1lID0gci5yZWFkTGluZSgpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICByLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGNvbnRleHRQYXRoLCBmYWN0b3J5Q2xhc3NOYW1lLCBjbGFzc0xvYWRlciwgcHJvcGVydGllcyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lKCJVbmFibGUgdG8gbG9hZDoiICsgcmVzb3VyY2UudG9TdHJpbmcoKSk7CkBAIC0zMjcsOCArMzE5LDEzIEBACiAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lOwogCiAgICAgICAgIC8vIHNlYXJjaCBmb3IgamF4Yi5wcm9wZXJ0aWVzIGluIHRoZSBjbGFzcyBsb2FkZXIgb2YgZWFjaCBjbGFzcyBmaXJzdAotICAgICAgICBmb3IgKENsYXNzIGMgOiBjbGFzc2VzKSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGMuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzcyBjIDogY2xhc3NlcykgeworICAgICAgICAgICAgLy8gdGhpcyBjbGFzc2xvYWRlciBpcyB1c2VkIG9ubHkgdG8gbG9hZCBqYXhiLnByb3BlcnRpZXMsIHNvIGRvaW5nIHRoaXMgc2hvdWxkIGJlIHNhZmUuCisgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgUGFja2FnZSBwa2cgPSBjLmdldFBhY2thZ2UoKTsKICAgICAgICAgICAgIGlmKHBrZz09bnVsbCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgLy8gdGhpcyBpcyBwb3NzaWJsZSBmb3IgcHJpbWl0aXZlcywgYXJyYXlzLCBhbmQgY2xhc3NlcyB0aGF0IGFyZSBsb2FkZWQgYnkgcG9vcmx5IGltcGxlbWVudGVkIENsYXNzTG9hZGVycwpAQCAtMzQ2LDcgKzM0Myw2IEBACiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbG9hZEpBWEJQcm9wZXJ0aWVzKGNsYXNzTG9hZGVyLCByZXNvdXJjZU5hbWUpOwogICAgICAgICAgICAgaWYgKHByb3BzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZSgiICBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmUoIiAgZm91bmQiKTsKICAgICAgICAgICAgICAgICBpZiAocHJvcHMuY29udGFpbnNLZXkoSkFYQl9DT05URVhUX0ZBQ1RPUlkpKSB7CkBAIC0zNjEsNyArMzU3LDcgQEAKIAogICAgICAgICAvLyBzZWFyY2ggZm9yIGEgc3lzdGVtIHByb3BlcnR5IHNlY29uZCAoamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQpCiAgICAgICAgIGxvZ2dlci5maW5lKCJDaGVja2luZyBzeXN0ZW0gcHJvcGVydHkgIitqYXhiQ29udGV4dEZRQ04pOwotICAgICAgICBmYWN0b3J5Q2xhc3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KGpheGJDb250ZXh0RlFDTiwgbnVsbCk7CisgICAgICAgIGZhY3RvcnlDbGFzc05hbWUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgR2V0UHJvcGVydHlBY3Rpb24oamF4YkNvbnRleHRGUUNOKSk7CiAgICAgICAgIGlmKCAgZmFjdG9yeUNsYXNzTmFtZSAhPSBudWxsICkgewogICAgICAgICAgICAgbG9nZ2VyLmZpbmUoIiAgZm91bmQgIitmYWN0b3J5Q2xhc3NOYW1lKTsKICAgICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZSggY2xhc3NlcywgcHJvcGVydGllcywgZmFjdG9yeUNsYXNzTmFtZSApOwpAQCAtNDgzLDQgKzQ3OSwzMSBAQAogICAgICAqIEZvciB0aGlzIHJlYXNvbiwgd2UgaGF2ZSB0byBoYXJkLWNvZGUgdGhlIGNsYXNzIG5hbWUgaW50byB0aGUgQVBJLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9ERUZBVUxUX0ZBQ1RPUllfQ0xBU1MgPSAiY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC52Mi5Db250ZXh0RmFjdG9yeSI7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgY2xhc3MsIHByb3ZpZGVkIHRoYXQgdGhlIGNhbGxpbmcgdGhyZWFkIGhhcyBhbiBhY2Nlc3MgdG8gdGhlIGNsYXNzIGJlaW5nIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBzYWZlTG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZ2dlci5maW5lKCJUcnlpbmcgdG8gbG9hZCAiK2NsYXNzTmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaGFzIGFuIGFjY2VzcyB0byB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBpID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcy5jaGVja1BhY2thZ2VBY2Nlc3MoY2xhc3NOYW1lLnN1YnN0cmluZygwLGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgLy8gYW55b25lIGNhbiBhY2Nlc3MgdGhlIHBsYXRmb3JtIGRlZmF1bHQgZmFjdG9yeSBjbGFzcyB3aXRob3V0IHBlcm1pc3Npb24KKyAgICAgICAgICAgIGlmIChQTEFURk9STV9ERUZBVUxUX0ZBQ1RPUllfQ0xBU1MuZXF1YWxzKGNsYXNzTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIHRocm93IHNlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvRGF0YUJpbmRpbmdFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0RhdGFCaW5kaW5nRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwNjU2MwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0RhdGFCaW5kaW5nRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBqYXZheC54bWwuYmluZDsKKworLyoqCisgKiBFeGNlcHRpb24gdGhhdCByZXByZXNlbnRzIGEgZmFpbHVyZSBpbiBhIEpBWEIgb3BlcmF0aW9uLgorICoKKyAqIDxwPgorICogVGhpcyBleGNlcHRpb24gZGlmZmVycyBmcm9tIHtAbGluayBKQVhCRXhjZXB0aW9ufSBpbiB0aGF0CisgKiB0aGlzIGlzIGFuIHVuY2hlY2tlZCBleGNlcHRpb24sIHdoaWxlIDx0dD5KQVhCRXhjZXB0aW9uPC90dD4KKyAqIGlzIGEgY2hlY2tlZCBleGNlcHRpb24uCisgKgorICogQHNlZSBKQVhCCisgKiBAc2luY2UgSkFYQjIuMQorICovCitwdWJsaWMgY2xhc3MgRGF0YUJpbmRpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgRGF0YUJpbmRpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIERhdGFCaW5kaW5nRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvRGF0YXR5cGVDb252ZXJ0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0RhdGF0eXBlQ29udmVydGVyLmphdmEKaW5kZXggM2U1ZWE5MC4uOTdiMDA0MSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvRGF0YXR5cGVDb252ZXJ0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9EYXRhdHlwZUNvbnZlcnRlci5qYXZhCkBAIC04NSw2ICs4NSw3IEBACiAgKiA8L3A+CiAgKgogICogQGF1dGhvciA8dWw+PGxpPlNla2hhciBWYWpqaGFsYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPkpvZSBGaWFsbGksIFN1biBNaWNyb3N5c3RlbXMgSW5jLjwvbGk+PGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+UnlhbiBTaG9lbWFrZXIsU3VuIE1pY3Jvc3lzdGVtcyBJbmMuPC9saT48L3VsPgorICogQHZlcnNpb24gJFJldmlzaW9uJAogICogQHNlZSBEYXRhdHlwZUNvbnZlcnRlckludGVyZmFjZQogICogQHNlZSBQYXJzZUNvbnZlcnNpb25FdmVudAogICogQHNlZSBQcmludENvbnZlcnNpb25FdmVudApAQCAtOTQsNyArOTUsNyBAQAogZmluYWwgcHVibGljIGNsYXNzIERhdGF0eXBlQ29udmVydGVyIHsKIAogICAgIC8vIGRlbGVnYXRlIHRvIHRoaXMgaW5zdGFuY2Ugb2YgRGF0YXR5cGVDb252ZXJ0ZXIKLSAgICBwcml2YXRlIHN0YXRpYyBEYXRhdHlwZUNvbnZlcnRlckludGVyZmFjZSB0aGVDb252ZXJ0ZXIgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIERhdGF0eXBlQ29udmVydGVySW50ZXJmYWNlIHRoZUNvbnZlcnRlciA9IG5ldyBEYXRhdHlwZUNvbnZlcnRlckltcGwoKTsKIAogICAgIHByaXZhdGUgRGF0YXR5cGVDb252ZXJ0ZXIoKSB7CiAgICAgICAgIC8vIHByaXZhdGUgY29uc3RydWN0b3IKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0RhdGF0eXBlQ29udmVydGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvRGF0YXR5cGVDb252ZXJ0ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0YjUxNAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0RhdGF0eXBlQ29udmVydGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsOTE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnhtbC5iaW5kOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIEpBWEIgUkkncyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZQorICoge0BsaW5rIERhdGF0eXBlQ29udmVydGVySW50ZXJmYWNlfS4KKyAqCisgKiA8cD4KKyAqIFdoZW4gY2xpZW50IGFwcHMgc3BlY2lmeSB0aGUgdXNlIG9mIHRoZSBzdGF0aWMgcHJpbnQvcGFyc2UKKyAqIG1ldGhvZHMgaW4ge0BsaW5rIERhdGF0eXBlQ29udmVydGVyfSwgaXQgd2lsbCBkZWxlZ2F0ZQorICogdG8gdGhpcyBjbGFzcy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHdoaXRlc3BhY2Ugbm9ybWFsaXphdGlvbi4KKyAqCisgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiBAc2luY2UgSkFYQjIuMQorICovCitmaW5hbCBjbGFzcyBEYXRhdHlwZUNvbnZlcnRlckltcGwgaW1wbGVtZW50cyBEYXRhdHlwZUNvbnZlcnRlckludGVyZmFjZSB7CisKKyAgICAvKioKKyAgICAgKiBUbyBhdm9pZCByZS1jcmVhdGluZyBpbnN0YW5jZXMsIHdlIGNhY2hlIG9uZSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERhdGF0eXBlQ29udmVydGVySW50ZXJmYWNlIHRoZUluc3RhbmNlID0gbmV3IERhdGF0eXBlQ29udmVydGVySW1wbCgpOworCisgICAgcHJvdGVjdGVkIERhdGF0eXBlQ29udmVydGVySW1wbCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHBhcnNlU3RyaW5nKFN0cmluZyBsZXhpY2FsWFNEU3RyaW5nKSB7CisgICAgICAgIHJldHVybiBsZXhpY2FsWFNEU3RyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHBhcnNlSW50ZWdlcihTdHJpbmcgbGV4aWNhbFhTREludGVnZXIpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZUludGVnZXIobGV4aWNhbFhTREludGVnZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBfcGFyc2VJbnRlZ2VyKENoYXJTZXF1ZW5jZSBzKSB7CisgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihyZW1vdmVPcHRpb25hbFBsdXMoV2hpdGVTcGFjZVByb2Nlc3Nvci50cmltKHMpKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHByaW50SW50ZWdlcihCaWdJbnRlZ2VyIHZhbCkgeworICAgICAgICByZXR1cm4gX3ByaW50SW50ZWdlcih2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9wcmludEludGVnZXIoQmlnSW50ZWdlciB2YWwpIHsKKyAgICAgICAgcmV0dXJuIHZhbC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcGFyc2VJbnQoU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZUludChzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYXN0ZXIgYnV0IGxlc3Mgcm9idXN0IFN0cmluZy0+aW50IGNvbnZlcnNpb24uCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQ6CisgICAgICogPG9sPgorICAgICAqICA8bGk+WE1MIFNjaGVtYSBhbGxvd3MgJysnLCBidXQge0BsaW5rIEludGVnZXIjdmFsdWVPZihTdHJpbmcpfSBpcyBub3QuCisgICAgICogIDxsaT5YTUwgU2NoZW1hIGFsbG93cyBsZWFkaW5nIGFuZCB0cmFpbGluZyAoYnV0IG5vdCBpbi1iZXR3ZWVuKSB3aGl0ZXNwYWNlcy4uCisgICAgICogICAgICB7QGxpbmsgSW50ZWdlciN2YWx1ZU9mKFN0cmluZyl9IGRvZXNuJ3QgYWxsb3cgYW55LgorICAgICAqIDwvb2w+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgX3BhcnNlSW50KENoYXJTZXF1ZW5jZSBzKSB7CisgICAgICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgICAgICBpbnQgc2lnbiA9IDE7CisKKyAgICAgICAgaW50IHIgPSAwOworCisgICAgICAgIGZvciggaW50IGk9MDsgaTxsZW47IGkrKyApIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmKFdoaXRlU3BhY2VQcm9jZXNzb3IuaXNXaGl0ZVNwYWNlKGNoKSkgeworICAgICAgICAgICAgICAgIC8vIHNraXAgd2hpdGVzcGFjZQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpZignMCc8PWNoICYmIGNoPD0nOScpIHsKKyAgICAgICAgICAgICAgICByID0gcioxMCArIChjaC0nMCcpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpZihjaD09Jy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpZihjaD09JysnKSB7CisgICAgICAgICAgICAgICAgLy8gbm9vcAorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiTm90IGEgbnVtYmVyOiAiK3MpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHIqc2lnbjsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBwYXJzZUxvbmcoU3RyaW5nIGxleGljYWxYU0xvbmcpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZUxvbmcobGV4aWNhbFhTTG9uZyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIF9wYXJzZUxvbmcoQ2hhclNlcXVlbmNlIHMpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudmFsdWVPZihyZW1vdmVPcHRpb25hbFBsdXMoV2hpdGVTcGFjZVByb2Nlc3Nvci50cmltKHMpKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgcGFyc2VTaG9ydChTdHJpbmcgbGV4aWNhbFhTRFNob3J0KSB7CisgICAgICAgIHJldHVybiBfcGFyc2VTaG9ydChsZXhpY2FsWFNEU2hvcnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgc2hvcnQgX3BhcnNlU2hvcnQoQ2hhclNlcXVlbmNlIHMpIHsKKyAgICAgICAgcmV0dXJuIChzaG9ydClfcGFyc2VJbnQocyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludFNob3J0KHNob3J0IHZhbCkgeworICAgICAgICByZXR1cm4gX3ByaW50U2hvcnQodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBfcHJpbnRTaG9ydChzaG9ydCB2YWwpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZhbCk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgcGFyc2VEZWNpbWFsKFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHJldHVybiBfcGFyc2VEZWNpbWFsKGNvbnRlbnQpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgX3BhcnNlRGVjaW1hbChDaGFyU2VxdWVuY2UgY29udGVudCkgeworICAgICAgICBjb250ZW50ID0gV2hpdGVTcGFjZVByb2Nlc3Nvci50cmltKGNvbnRlbnQpOworCisgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbChjb250ZW50LnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIGZyb20gcHVyZWx5IFhNTCBTY2hlbWEgcGVyc3BlY3RpdmUsCisgICAgICAgIC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGEgcHJvYmxlbSwgc2luY2UKKyAgICAgICAgLy8gaW4geHM6ZGVjaW1hbCAiMS4wIiBhbmQgIjEiIGlzIGVxdWFsIHdoZXJlYXMgdGhlIGFib3ZlCisgICAgICAgIC8vIGNvZGUgd2lsbCByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhvc2UgdHdvIGZvcm1zLgorICAgICAgICAvLworICAgICAgICAvLyB0aGUgY29kZSB3YXMgb3JpZ2luYWxseSB1c2luZyBjb20uc3VuLm1zdi5kYXRhdHlwZS54c2QuTnVtYmVyVHlwZS5sb2FkLAorICAgICAgICAvLyBidXQgYSBwcm9maWxpbmcgc2hvd2VkIHRoYXQgdGhlIHByb2Nlc3Mgb2Ygbm9ybWFsaXppbmcgIjEuMCIgaW50byAiMSIKKyAgICAgICAgLy8gY291bGQgdGFrZSBub24tdHJpdmlhbCB0aW1lLgorICAgICAgICAvLworICAgICAgICAvLyBhbHNvLCBmcm9tIHRoZSB1c2VyJ3MgcG9pbnQgb2Ygdmlldywgb25lIG1pZ2h0IGJlIHN1cnByaXNlZCBpZgorICAgICAgICAvLyAxIChub3QgMS4wKSBpcyByZXR1cm5lZCBmcm9tICIxLjAwMCIKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgcGFyc2VGbG9hdChTdHJpbmcgbGV4aWNhbFhTREZsb2F0KSB7CisgICAgICAgIHJldHVybiBfcGFyc2VGbG9hdChsZXhpY2FsWFNERmxvYXQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgX3BhcnNlRmxvYXQoIENoYXJTZXF1ZW5jZSBfdmFsICkgeworICAgICAgICBTdHJpbmcgcyA9IFdoaXRlU3BhY2VQcm9jZXNzb3IudHJpbShfdmFsKS50b1N0cmluZygpOworICAgICAgICAvKiBJbmNvbXBhdGliaWxpdGllcyBvZiBYTUwgU2NoZW1hJ3MgZmxvYXQgInhmbG9hdCIgYW5kIEphdmEncyBmbG9hdCAiamZsb2F0IgorCisgICAgICAgICAgICAqIGpmbG9hdC52YWx1ZU9mIGlnbm9yZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZXMsCisgICAgICAgICAgICAgIHdoZXJlYXMgdGhpcyBpcyBub3QgYWxsb3dlZCBpbiB4ZmxvYXQuCisgICAgICAgICAgICAqIGpmbG9hdC52YWx1ZU9mIGFsbG93cyAiZmxvYXQgdHlwZSBzdWZmaXgiIChmLCBGKSB0byBiZQorICAgICAgICAgICAgICBhcHBlbmRlZCBhZnRlciBmbG9hdCBsaXRlcmFsIChlLmcuLCAxLjUyZS0yZiksIHdoZXJlYXJlCisgICAgICAgICAgICAgIHRoaXMgaXMgbm90IHRoZSBjYXNlIG9mIHhmbG9hdC4KKworICAgICAgICAgICAgZ3JheSB6b25lCisgICAgICAgICAgICAtLS0tLS0tLS0KKyAgICAgICAgICAgICogamZsb2F0IGFsbG93cyAiLjUyMyIuIEFuZCB0aGVyZSBpcyBubyBjbGVhciBzdGF0ZW1lbnQgdGhhdCBtZW50aW9ucworICAgICAgICAgICAgICB0aGlzIGNhc2UgaW4geGZsb2F0LiBBbHRob3VnaCBwcm9iYWJseSB0aGlzIGlzIGFsbG93ZWQuCisgICAgICAgICAgICAqCisgICAgICAgICovCisKKyAgICAgICAgaWYocy5lcXVhbHMoIk5hTiIpKSAgICAgICAgIHJldHVybiBGbG9hdC5OYU47CisgICAgICAgIGlmKHMuZXF1YWxzKCJJTkYiKSkgICAgICAgICByZXR1cm4gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7CisgICAgICAgIGlmKHMuZXF1YWxzKCItSU5GIikpICAgICAgICByZXR1cm4gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFk7CisKKyAgICAgICAgaWYocy5sZW5ndGgoKT09MAorICAgICAgICB8fCAhaXNEaWdpdE9yUGVyaW9kT3JTaWduKHMuY2hhckF0KDApKQorICAgICAgICB8fCAhaXNEaWdpdE9yUGVyaW9kT3JTaWduKHMuY2hhckF0KHMubGVuZ3RoKCktMSkpICkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKKworICAgICAgICAvLyB0aGVzZSBzY3JlZW5pbmcgcHJvY2VzcyBpcyBuZWNlc3NhcnkgZHVlIHRvIHRoZSB3b2JibGUgb2YgRmxvYXQudmFsdWVPZiBtZXRob2QKKyAgICAgICAgcmV0dXJuIEZsb2F0LnBhcnNlRmxvYXQocyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludEZsb2F0KGZsb2F0IHYpIHsKKyAgICAgICAgcmV0dXJuIF9wcmludEZsb2F0KHYpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9wcmludEZsb2F0KGZsb2F0IHYpIHsKKyAgICAgICAgaWYoIHY9PUZsb2F0Lk5hTiApICAgICAgICAgICAgICAgICAgcmV0dXJuICJOYU4iOworICAgICAgICBpZiggdj09RmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkgKSAgICByZXR1cm4gIklORiI7CisgICAgICAgIGlmKCB2PT1GbG9hdC5ORUdBVElWRV9JTkZJTklUWSApICAgIHJldHVybiAiLUlORiI7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2KTsKKyAgICB9CisKKworCisgICAgcHVibGljIGRvdWJsZSBwYXJzZURvdWJsZShTdHJpbmcgbGV4aWNhbFhTRERvdWJsZSkgeworICAgICAgICByZXR1cm4gX3BhcnNlRG91YmxlKGxleGljYWxYU0REb3VibGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIF9wYXJzZURvdWJsZSggQ2hhclNlcXVlbmNlIF92YWwgKSB7CisgICAgICAgIFN0cmluZyB2YWwgPSBXaGl0ZVNwYWNlUHJvY2Vzc29yLnRyaW0oX3ZhbCkudG9TdHJpbmcoKTsKKworICAgICAgICBpZih2YWwuZXF1YWxzKCJOYU4iKSkgICAgcmV0dXJuIERvdWJsZS5OYU47CisgICAgICAgIGlmKHZhbC5lcXVhbHMoIklORiIpKSAgICByZXR1cm4gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOworICAgICAgICBpZih2YWwuZXF1YWxzKCItSU5GIikpICAgIHJldHVybiBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFk7CisKKyAgICAgICAgaWYodmFsLmxlbmd0aCgpPT0wCisgICAgICAgIHx8ICFpc0RpZ2l0T3JQZXJpb2RPclNpZ24odmFsLmNoYXJBdCgwKSkKKyAgICAgICAgfHwgIWlzRGlnaXRPclBlcmlvZE9yU2lnbih2YWwuY2hhckF0KHZhbC5sZW5ndGgoKS0xKSkgKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbih2YWwpOworCisKKyAgICAgICAgLy8gdGhlc2Ugc2NyZWVuaW5nIHByb2Nlc3MgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGUgd29iYmxlIG9mIEZsb2F0LnZhbHVlT2YgbWV0aG9kCisgICAgICAgIHJldHVybiBEb3VibGUucGFyc2VEb3VibGUodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwYXJzZUJvb2xlYW4oU3RyaW5nIGxleGljYWxYU0RCb29sZWFuKSB7CisgICAgICAgIHJldHVybiBfcGFyc2VCb29sZWFuKGxleGljYWxYU0RCb29sZWFuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gX3BhcnNlQm9vbGVhbihDaGFyU2VxdWVuY2UgbGl0ZXJhbCkgeworICAgICAgICBpbnQgaT0wOworICAgICAgICBpbnQgbGVuID0gbGl0ZXJhbC5sZW5ndGgoKTsKKyAgICAgICAgY2hhciBjaDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2ggPSBsaXRlcmFsLmNoYXJBdChpKyspOworICAgICAgICB9IHdoaWxlKFdoaXRlU3BhY2VQcm9jZXNzb3IuaXNXaGl0ZVNwYWNlKGNoKSAmJiBpPGxlbik7CisKKyAgICAgICAgLy8gaWYgd2UgYXJlIHN0cmljdCBhYm91dCBlcnJvcnMsIGNoZWNrIGk9PWxlbi4gYW5kIHJlcG9ydCBhbiBlcnJvcgorCisgICAgICAgIGlmKCBjaD09J3QnIHx8IGNoPT0nMScgKSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmKCBjaD09J2YnIHx8IGNoPT0nMCcgKSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludEJvb2xlYW4oYm9vbGVhbiB2YWwpIHsKKyAgICAgICAgcmV0dXJuIHZhbD8idHJ1ZSI6ImZhbHNlIjsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX3ByaW50Qm9vbGVhbihib29sZWFuIHZhbCkgeworICAgICAgICByZXR1cm4gdmFsPyJ0cnVlIjoiZmFsc2UiOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHBhcnNlQnl0ZShTdHJpbmcgbGV4aWNhbFhTREJ5dGUpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZUJ5dGUobGV4aWNhbFhTREJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBfcGFyc2VCeXRlKENoYXJTZXF1ZW5jZSBsaXRlcmFsKSB7CisgICAgICAgIHJldHVybiAoYnl0ZSlfcGFyc2VJbnQobGl0ZXJhbCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludEJ5dGUoYnl0ZSB2YWwpIHsKKyAgICAgICAgcmV0dXJuIF9wcmludEJ5dGUodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBfcHJpbnRCeXRlKGJ5dGUgdmFsKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBwYXJzZVFOYW1lKFN0cmluZyBsZXhpY2FsWFNEUU5hbWUsIE5hbWVzcGFjZUNvbnRleHQgbnNjKSB7CisgICAgICAgIHJldHVybiBfcGFyc2VRTmFtZShsZXhpY2FsWFNEUU5hbWUsbnNjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgZmFpbHMgdG8gY29udmVydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lIF9wYXJzZVFOYW1lKENoYXJTZXF1ZW5jZSB0ZXh0LCBOYW1lc3BhY2VDb250ZXh0IG5zYykgeworICAgICAgICBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKKworICAgICAgICAvLyB0cmltIHdoaXRlc3BhY2UKKyAgICAgICAgaW50IHN0YXJ0PTA7CisgICAgICAgIHdoaWxlKHN0YXJ0PGxlbmd0aCAmJiBXaGl0ZVNwYWNlUHJvY2Vzc29yLmlzV2hpdGVTcGFjZSh0ZXh0LmNoYXJBdChzdGFydCkpKQorICAgICAgICAgICAgc3RhcnQrKzsKKworICAgICAgICBpbnQgZW5kID0gbGVuZ3RoOworICAgICAgICB3aGlsZShlbmQ+c3RhcnQgJiYgV2hpdGVTcGFjZVByb2Nlc3Nvci5pc1doaXRlU3BhY2UodGV4dC5jaGFyQXQoZW5kLTEpKSkKKyAgICAgICAgICAgIGVuZC0tOworCisgICAgICAgIGlmKGVuZD09c3RhcnQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnB1dCBpcyBlbXB0eSIpOworCisKKyAgICAgICAgU3RyaW5nIHVyaTsKKyAgICAgICAgU3RyaW5nIGxvY2FsUGFydDsKKyAgICAgICAgU3RyaW5nIHByZWZpeDsKKworICAgICAgICAvLyBzZWFyY2ggJzonCisgICAgICAgIGludCBpZHg9c3RhcnQrMTsgICAgLy8gbm8gcG9pbnQgaW4gc2VhcmNoaW5nIHRoZSBmaXJzdCBjaGFyLiB0aGF0J3Mgbm90IHZhbGlkLgorICAgICAgICB3aGlsZShpZHg8ZW5kICYmIHRleHQuY2hhckF0KGlkeCkhPSc6JyApCisgICAgICAgICAgICBpZHgrKzsKKworICAgICAgICBpZiggaWR4PT1lbmQgKSB7CisgICAgICAgICAgICB1cmkgPSBuc2MuZ2V0TmFtZXNwYWNlVVJJKCIiKTsKKyAgICAgICAgICAgIGxvY2FsUGFydCA9IHRleHQuc3ViU2VxdWVuY2Uoc3RhcnQsZW5kKS50b1N0cmluZygpOworICAgICAgICAgICAgcHJlZml4ID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQcmVmaXggZXhpc3RzLCBjaGVjayBldmVyeXRoaW5nCisgICAgICAgICAgICBwcmVmaXggPSB0ZXh0LnN1YlNlcXVlbmNlKHN0YXJ0LGlkeCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGxvY2FsUGFydCA9IHRleHQuc3ViU2VxdWVuY2UoaWR4KzEsZW5kKS50b1N0cmluZygpOworICAgICAgICAgICAgdXJpID0gbnNjLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOworICAgICAgICAgICAgLy8gdXJpIGNhbiBuZXZlciBiZSBudWxsIGFjY29yZGluZyB0byBqYXZhZG9jLAorICAgICAgICAgICAgLy8gYnV0IHNvbWUgdXNlcnMgcmVwb3J0ZWQgdGhhdCB0aGVyZSBhcmUgaW1wbGVtZW50YXRpb25zIHRoYXQgcmV0dXJuIG51bGwuCisgICAgICAgICAgICBpZih1cmk9PW51bGwgfHwgdXJpLmxlbmd0aCgpPT0wKSAvLyBjcmFwLiB0aGUgTmFtZXNwYWNlQ29udGV4dCBpbnRlcmZhY2UgaXMgYnJva2VuLgorICAgICAgICAgICAgICAgIC8vIGVycm9yOiB1bmJvdW5kIHByZWZpeAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByZWZpeCAiK3ByZWZpeCsiIGlzIG5vdCBib3VuZCB0byBhIG5hbWVzcGFjZSIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh1cmksbG9jYWxQYXJ0LHByZWZpeCk7CisgICAgfQorCisgICAgcHVibGljIENhbGVuZGFyIHBhcnNlRGF0ZVRpbWUoU3RyaW5nIGxleGljYWxYU0REYXRlVGltZSkgeworICAgICAgICByZXR1cm4gX3BhcnNlRGF0ZVRpbWUobGV4aWNhbFhTRERhdGVUaW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdyZWdvcmlhbkNhbGVuZGFyIF9wYXJzZURhdGVUaW1lKENoYXJTZXF1ZW5jZSBzKSB7CisgICAgICAgIFN0cmluZyB2YWwgPSBXaGl0ZVNwYWNlUHJvY2Vzc29yLnRyaW0ocykudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGRhdGF0eXBlRmFjdG9yeS5uZXdYTUxHcmVnb3JpYW5DYWxlbmRhcih2YWwpLnRvR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHByaW50RGF0ZVRpbWUoQ2FsZW5kYXIgdmFsKSB7CisgICAgICAgIHJldHVybiBfcHJpbnREYXRlVGltZSh2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9wcmludERhdGVUaW1lKENhbGVuZGFyIHZhbCkgeworICAgICAgICByZXR1cm4gQ2FsZW5kYXJGb3JtYXR0ZXIuZG9Gb3JtYXQoIiVZLSVNLSVEVCVoOiVtOiVzJXoiLHZhbCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBwYXJzZUJhc2U2NEJpbmFyeShTdHJpbmcgbGV4aWNhbFhTREJhc2U2NEJpbmFyeSkgeworICAgICAgICByZXR1cm4gX3BhcnNlQmFzZTY0QmluYXJ5KGxleGljYWxYU0RCYXNlNjRCaW5hcnkpOworICAgIH0KKworCisgICAgcHVibGljIGJ5dGVbXSBwYXJzZUhleEJpbmFyeShTdHJpbmcgcykgeworICAgICAgICBmaW5hbCBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKworICAgICAgICAvLyAiMTExIiBpcyBub3QgYSB2YWxpZCBoZXggZW5jb2RpbmcuCisgICAgICAgIGlmKCBsZW4lMiAhPSAwICkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhleEJpbmFyeSBuZWVkcyB0byBiZSBldmVuLWxlbmd0aDogIitzKTsKKworICAgICAgICBieXRlW10gb3V0ID0gbmV3IGJ5dGVbbGVuLzJdOworCisgICAgICAgIGZvciggaW50IGk9MDsgaTxsZW47IGkrPTIgKSB7CisgICAgICAgICAgICBpbnQgaCA9IGhleFRvQmluKHMuY2hhckF0KGkgICkpOworICAgICAgICAgICAgaW50IGwgPSBoZXhUb0JpbihzLmNoYXJBdChpKzEpKTsKKyAgICAgICAgICAgIGlmKCBoPT0tMSB8fCBsPT0tMSApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXIgZm9yIGhleEJpbmFyeTogIitzKTsKKworICAgICAgICAgICAgb3V0W2kvMl0gPSAoYnl0ZSkoaCoxNitsKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGhleFRvQmluKCBjaGFyIGNoICkgeworICAgICAgICBpZiggJzAnPD1jaCAmJiBjaDw9JzknICkgICAgcmV0dXJuIGNoLScwJzsKKyAgICAgICAgaWYoICdBJzw9Y2ggJiYgY2g8PSdGJyApICAgIHJldHVybiBjaC0nQScrMTA7CisgICAgICAgIGlmKCAnYSc8PWNoICYmIGNoPD0nZicgKSAgICByZXR1cm4gY2gtJ2EnKzEwOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleENvZGUgPSAiMDEyMzQ1Njc4OUFCQ0RFRiIudG9DaGFyQXJyYXkoKTsKKworICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRIZXhCaW5hcnkoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoZGF0YS5sZW5ndGgqMik7CisgICAgICAgIGZvciAoIGJ5dGUgYiA6IGRhdGEpIHsKKyAgICAgICAgICAgIHIuYXBwZW5kKGhleENvZGVbKGIgPj4gNCkgJiAweEZdKTsKKyAgICAgICAgICAgIHIuYXBwZW5kKGhleENvZGVbKGIgJiAweEYpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHIudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIHBhcnNlVW5zaWduZWRJbnQoU3RyaW5nIGxleGljYWxYU0RVbnNpZ25lZEludCkgeworICAgICAgICByZXR1cm4gX3BhcnNlTG9uZyhsZXhpY2FsWFNEVW5zaWduZWRJbnQpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRVbnNpZ25lZEludChsb25nIHZhbCkgeworICAgICAgICByZXR1cm4gX3ByaW50TG9uZyh2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcGFyc2VVbnNpZ25lZFNob3J0KFN0cmluZyBsZXhpY2FsWFNEVW5zaWduZWRTaG9ydCkgeworICAgICAgICByZXR1cm4gX3BhcnNlSW50KGxleGljYWxYU0RVbnNpZ25lZFNob3J0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FsZW5kYXIgcGFyc2VUaW1lKFN0cmluZyBsZXhpY2FsWFNEVGltZSkgeworICAgICAgICByZXR1cm4gZGF0YXR5cGVGYWN0b3J5Lm5ld1hNTEdyZWdvcmlhbkNhbGVuZGFyKGxleGljYWxYU0RUaW1lKS50b0dyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludFRpbWUoQ2FsZW5kYXIgdmFsKSB7CisgICAgICAgIHJldHVybiBDYWxlbmRhckZvcm1hdHRlci5kb0Zvcm1hdCgiJWg6JW06JXMleiIsdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FsZW5kYXIgcGFyc2VEYXRlKFN0cmluZyBsZXhpY2FsWFNERGF0ZSkgeworICAgICAgICByZXR1cm4gZGF0YXR5cGVGYWN0b3J5Lm5ld1hNTEdyZWdvcmlhbkNhbGVuZGFyKGxleGljYWxYU0REYXRlKS50b0dyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludERhdGUoQ2FsZW5kYXIgdmFsKSB7CisKKyAgICAgICAgcmV0dXJuIENhbGVuZGFyRm9ybWF0dGVyLmRvRm9ybWF0KChuZXcgU3RyaW5nQnVpbGRlcigiJVktJU0tJUQiKS5hcHBlbmQoIiV6IikpLnRvU3RyaW5nKCksdmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHBhcnNlQW55U2ltcGxlVHlwZShTdHJpbmcgbGV4aWNhbFhTREFueVNpbXBsZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGxleGljYWxYU0RBbnlTaW1wbGVUeXBlOworLy8gICAgICAgIHJldHVybiAoU3RyaW5nKVNpbXBsZVVSVHlwZS50aGVJbnN0YW5jZS5fY3JlYXRlVmFsdWUoIGxleGljYWxYU0RBbnlTaW1wbGVUeXBlLCBudWxsICk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludFN0cmluZyhTdHJpbmcgdmFsKSB7CisvLyAgICAgICAgcmV0dXJuIFN0cmluZ1R5cGUudGhlSW5zdGFuY2UuY29udmVydFRvTGV4aWNhbFZhbHVlKCB2YWwsIG51bGwgKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRJbnQoaW50IHZhbCkgeworICAgICAgICByZXR1cm4gX3ByaW50SW50KHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX3ByaW50SW50KGludCB2YWwpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludExvbmcobG9uZyB2YWwpIHsKKyAgICAgICAgcmV0dXJuIF9wcmludExvbmcodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBfcHJpbnRMb25nKGxvbmcgdmFsKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcHJpbnREZWNpbWFsKEJpZ0RlY2ltYWwgdmFsKSB7CisgICAgICAgIHJldHVybiBfcHJpbnREZWNpbWFsKHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX3ByaW50RGVjaW1hbChCaWdEZWNpbWFsIHZhbCkgeworICAgICAgICByZXR1cm4gdmFsLnRvUGxhaW5TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHByaW50RG91YmxlKGRvdWJsZSB2KSB7CisgICAgICAgIHJldHVybiBfcHJpbnREb3VibGUodik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX3ByaW50RG91YmxlKGRvdWJsZSB2KSB7CisgICAgICAgIGlmKCB2PT1Eb3VibGUuTmFOICkgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTmFOIjsKKyAgICAgICAgaWYoIHY9PURvdWJsZS5QT1NJVElWRV9JTkZJTklUWSApICAgIHJldHVybiAiSU5GIjsKKyAgICAgICAgaWYoIHY9PURvdWJsZS5ORUdBVElWRV9JTkZJTklUWSApICAgIHJldHVybiAiLUlORiI7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHByaW50UU5hbWUoUU5hbWUgdmFsLCBOYW1lc3BhY2VDb250ZXh0IG5zYykgeworICAgICAgICByZXR1cm4gX3ByaW50UU5hbWUodmFsLG5zYyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX3ByaW50UU5hbWUoUU5hbWUgdmFsLCBOYW1lc3BhY2VDb250ZXh0IG5zYykgeworICAgICAgICAvLyBEb3VibGUtY2hlY2sKKyAgICAgICAgU3RyaW5nIHFuYW1lOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnNjLmdldFByZWZpeCggdmFsLmdldE5hbWVzcGFjZVVSSSgpICk7CisgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSB2YWwuZ2V0TG9jYWxQYXJ0KCk7CisKKyAgICAgICAgaWYoIHByZWZpeCA9PSBudWxsIHx8IHByZWZpeC5sZW5ndGgoKT09MCApIHsgLy8gYmUgZGVmZW5zaXZlCisgICAgICAgICAgICBxbmFtZSA9IGxvY2FsUGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHFuYW1lID0gcHJlZml4ICsgJzonICsgbG9jYWxQYXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHFuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRCYXNlNjRCaW5hcnkoYnl0ZVtdIHZhbCkgeworICAgICAgICByZXR1cm4gX3ByaW50QmFzZTY0QmluYXJ5KHZhbCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmludFVuc2lnbmVkU2hvcnQoaW50IHZhbCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHByaW50QW55U2ltcGxlVHlwZShTdHJpbmcgdmFsKSB7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBKdXN0IHJldHVybiB0aGUgc3RyaW5nIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBidXQKKyAgICAgKiBpbnN0YWxscyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFzIHRoZSBEYXRhdHlwZUNvbnZlcnRlcgorICAgICAqIGltcGxlbWVudGF0aW9uLiBVc2VkIGZyb20gc3RhdGljIGZpeGVkIHZhbHVlIGluaXRpYWxpemVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsSG9vayggU3RyaW5nIHMgKSB7CisgICAgICAgIERhdGF0eXBlQ29udmVydGVyLnNldERhdGF0eXBlQ29udmVydGVyKHRoZUluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisKKworCisvLyBiYXNlNjQgZGVjb2RlcgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBkZWNvZGVNYXAgPSBpbml0RGVjb2RlTWFwKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBQQURESU5HID0gMTI3OworCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGluaXREZWNvZGVNYXAoKSB7CisgICAgICAgIGJ5dGVbXSBtYXAgPSBuZXcgYnl0ZVsxMjhdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKCBpPTA7IGk8MTI4OyBpKysgKSAgICAgICAgbWFwW2ldID0gLTE7CisKKyAgICAgICAgZm9yKCBpPSdBJzsgaTw9J1onOyBpKysgKSAgICBtYXBbaV0gPSAoYnl0ZSkoaS0nQScpOworICAgICAgICBmb3IoIGk9J2EnOyBpPD0neic7IGkrKyApICAgIG1hcFtpXSA9IChieXRlKShpLSdhJysyNik7CisgICAgICAgIGZvciggaT0nMCc7IGk8PSc5JzsgaSsrICkgICAgbWFwW2ldID0gKGJ5dGUpKGktJzAnKzUyKTsKKyAgICAgICAgbWFwWycrJ10gPSA2MjsKKyAgICAgICAgbWFwWycvJ10gPSA2MzsKKyAgICAgICAgbWFwWyc9J10gPSBQQURESU5HOworCisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcHV0ZXMgdGhlIGxlbmd0aCBvZiBiaW5hcnkgZGF0YSBzcGVjdWxhdGl2ZWx5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogT3VyIHJlcXVpcmVtZW50IGlzIHRvIGNyZWF0ZSBieXRlW10gb2YgdGhlIGV4YWN0IGxlbmd0aCB0byBzdG9yZSB0aGUgYmluYXJ5IGRhdGEuCisgICAgICogSWYgd2UgZG8gdGhpcyBpbiBhIHN0cmFpZ2h0LWZvcndhcmQgd2F5LCBpdCB0YWtlcyB0d28gcGFzc2VzIG92ZXIgdGhlIGRhdGEuCisgICAgICogRXhwZXJpbWVudHMgc2hvdyB0aGF0IHRoaXMgaXMgYSBub24tdHJpdmlhbCBvdmVyaGVhZCAoMzUlIG9yIHNvIGlzIHNwZW50IG9uCisgICAgICogdGhlIGZpcnN0IHBhc3MgaW4gY2FsY3VsYXRpbmcgdGhlIGxlbmd0aC4pCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBTbyB0aGUgYXBwcm9hY2ggaGVyZSBpcyB0aGF0IHdlIGNvbXB1dGUgdGhlIGxlbmd0aCBzcGVjdWxhdGl2ZWx5LCB3aXRob3V0IGxvb2tpbmcKKyAgICAgKiBhdCB0aGUgd2hvbGUgY29udGVudHMuIFRoZSBvYnRhaW5lZCBzcGVjdWxhdGl2ZSB2YWx1ZSBpcyBuZXZlciBsZXNzIHRoYW4gdGhlCisgICAgICogYWN0dWFsIGxlbmd0aCBvZiB0aGUgYmluYXJ5IGRhdGEsIGJ1dCBpdCBtYXkgYmUgYmlnZ2VyLiBTbyBpZiB0aGUgc3BlY3VsYXRpb24KKyAgICAgKiBnb2VzIHdyb25nLCB3ZSdsbCBwYXkgdGhlIGNvc3Qgb2YgcmVhbGxvY2F0aW9uIGFuZCBidWZmZXIgY29weWluZy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBiYXNlNjQgdGV4dCBpcyB0aWdodGx5IHBhY2tlZCB3aXRoIG5vIGluZGVudGF0aW9uIG5vciBpbGxlZ2FsIGNoYXIKKyAgICAgKiAobGlrZSB3aGF0IG1vc3Qgd2ViIHNlcnZpY2VzIHByb2R1Y2UpLCB0aGVuIHRoZSBzcGVjdWxhdGlvbiBvZiB0aGlzIG1ldGhvZAorICAgICAqIHdpbGwgYmUgY29ycmVjdCwgc28gd2UgZ2V0IHRoZSBwZXJmb3JtYW5jZSBiZW5lZml0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBndWVzc0xlbmd0aCggU3RyaW5nIHRleHQgKSB7CisgICAgICAgIGZpbmFsIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworCisgICAgICAgIC8vIGNvbXB1dGUgdGhlIHRhaWwgJz0nIGNoYXJzCisgICAgICAgIGludCBqPWxlbi0xOworICAgICAgICBmb3IoOyBqPj0wOyBqLS0gKSB7CisgICAgICAgICAgICBieXRlIGNvZGUgPSBkZWNvZGVNYXBbdGV4dC5jaGFyQXQoaildOworICAgICAgICAgICAgaWYoY29kZT09UEFERElORykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmKGNvZGU9PS0xKQorICAgICAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IHRoaXMgYmFzZTY0IHRleHQgaXMgaW5kZW50ZWQuIGdvIHdpdGggdGhlIHVwcGVyIGJvdW5kCisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoKCkvNCozOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBqKys7ICAgIC8vIHRleHQuY2hhckF0KGopIGlzIG5vdyBhdCBzb21lIGJhc2U2NCBjaGFyLCBzbyArMSB0byBtYWtlIGl0IHRoZSBzaXplCisgICAgICAgIGludCBwYWRTaXplID0gbGVuLWo7CisgICAgICAgIGlmKHBhZFNpemUgPjIpIC8vIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGJhc2U2NC4gYmUgc2FmZSBhbmQgZ28gd2l0aCB0aGUgdXBwZXIgYm91bmQKKyAgICAgICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCgpLzQqMzsKKworICAgICAgICAvLyBzbyBmYXIgdGhpcyBiYXNlNjQgbG9va3MgbGlrZSBpdCdzIHVuaW5kZW50ZWQgdGlnaHRseSBwYWNrZWQgYmFzZTY0LgorICAgICAgICAvLyB0YWtlIGEgY2hhbmNlIGFuZCBjcmVhdGUgYW4gYXJyYXkgd2l0aCB0aGUgZXhwZWN0ZWQgc2l6ZQorICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGgoKS80KjMtcGFkU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdGV4dAorICAgICAqICAgICAgYmFzZTY0QmluYXJ5IGRhdGEgaXMgbGlrZWx5IHRvIGJlIGxvbmcsIGFuZCBkZWNvZGluZyByZXF1aXJlcworICAgICAqICAgICAgZWFjaCBjaGFyYWN0ZXIgdG8gYmUgYWNjZXNzZWQgdHdpY2UgKG9uY2UgZm9yIGNvdW50aW5nIGxlbmd0aCwgYW5vdGhlcgorICAgICAqICAgICAgZm9yIGRlY29kaW5nLikKKyAgICAgKgorICAgICAqICAgICAgQSBiZW5jaG1hcmsgc2hvd2VkIHRoYXQgdGFraW5nIHtAbGluayBTdHJpbmd9IGlzIGZhc3RlciwgcHJlc3VtYWJseQorICAgICAqICAgICAgYmVjYXVzZSBKSVQgY2FuIGlubGluZSBhIGxvdCBvZiBzdHJpbmcgYWNjZXNzICh3aXRoIGRhdGEgb2YgMUsgY2hhcnMsIGl0IHdhcyB0d2ljZSBhcyBmYXN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIF9wYXJzZUJhc2U2NEJpbmFyeShTdHJpbmcgdGV4dCkgeworICAgICAgICBmaW5hbCBpbnQgYnVmbGVuID0gZ3Vlc3NMZW5ndGgodGV4dCk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBvdXQgPSBuZXcgYnl0ZVtidWZsZW5dOworICAgICAgICBpbnQgbz0wOworCisgICAgICAgIGZpbmFsIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmaW5hbCBieXRlW10gcXVhZHJ1cGxldCA9IG5ldyBieXRlWzRdOworICAgICAgICBpbnQgcT0wOworCisgICAgICAgIC8vIGNvbnZlcnQgZWFjaCBxdWFkcnVwbGV0IHRvIHRocmVlIGJ5dGVzLgorICAgICAgICBmb3IoIGk9MDsgaTxsZW47IGkrKyApIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKKyAgICAgICAgICAgIGJ5dGUgdiA9IGRlY29kZU1hcFtjaF07CisKKyAgICAgICAgICAgIGlmKCB2IT0tMSApCisgICAgICAgICAgICAgICAgcXVhZHJ1cGxldFtxKytdID0gdjsKKworICAgICAgICAgICAgaWYocT09NCkgeworICAgICAgICAgICAgICAgIC8vIHF1YWRydXBsZXQgaXMgbm93IGZpbGxlZC4KKyAgICAgICAgICAgICAgICBvdXRbbysrXSA9IChieXRlKSgocXVhZHJ1cGxldFswXTw8Mil8KHF1YWRydXBsZXRbMV0+PjQpKTsKKyAgICAgICAgICAgICAgICBpZiggcXVhZHJ1cGxldFsyXSE9UEFERElORyApCisgICAgICAgICAgICAgICAgICAgIG91dFtvKytdID0gKGJ5dGUpKChxdWFkcnVwbGV0WzFdPDw0KXwocXVhZHJ1cGxldFsyXT4+MikpOworICAgICAgICAgICAgICAgIGlmKCBxdWFkcnVwbGV0WzNdIT1QQURESU5HICkKKyAgICAgICAgICAgICAgICAgICAgb3V0W28rK10gPSAoYnl0ZSkoKHF1YWRydXBsZXRbMl08PDYpfChxdWFkcnVwbGV0WzNdKSk7CisgICAgICAgICAgICAgICAgcT0wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoYnVmbGVuPT1vKSAvLyBzcGVjdWxhdGlvbiB3b3JrZWQgb3V0IHRvIGJlIE9LCisgICAgICAgICAgICByZXR1cm4gb3V0OworCisgICAgICAgIC8vIHdlIG92ZXJlc3RpbWF0ZWQsIHNvIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlcgorICAgICAgICBieXRlW10gbmIgPSBuZXcgYnl0ZVtvXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvdXQsMCxuYiwwLG8pOworICAgICAgICByZXR1cm4gbmI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGVuY29kZU1hcCA9IGluaXRFbmNvZGVNYXAoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBpbml0RW5jb2RlTWFwKCkgeworICAgICAgICBjaGFyW10gbWFwID0gbmV3IGNoYXJbNjRdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKCBpPSAwOyBpPDI2OyBpKysgKSAgICAgICAgbWFwW2ldID0gKGNoYXIpKCdBJytpKTsKKyAgICAgICAgZm9yKCBpPTI2OyBpPDUyOyBpKysgKSAgICAgICAgbWFwW2ldID0gKGNoYXIpKCdhJysoaS0yNikpOworICAgICAgICBmb3IoIGk9NTI7IGk8NjI7IGkrKyApICAgICAgICBtYXBbaV0gPSAoY2hhcikoJzAnKyhpLTUyKSk7CisgICAgICAgIG1hcFs2Ml0gPSAnKyc7CisgICAgICAgIG1hcFs2M10gPSAnLyc7CisKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNoYXIgZW5jb2RlKCBpbnQgaSApIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZU1hcFtpJjB4M0ZdOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBlbmNvZGVCeXRlKCBpbnQgaSApIHsKKyAgICAgICAgcmV0dXJuIChieXRlKWVuY29kZU1hcFtpJjB4M0ZdOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9wcmludEJhc2U2NEJpbmFyeShieXRlW10gaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIF9wcmludEJhc2U2NEJpbmFyeShpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX3ByaW50QmFzZTY0QmluYXJ5KGJ5dGVbXSBpbnB1dCwgaW50IG9mZnNldCwgaW50IGxlbikgeworICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbKChsZW4rMikvMykqNF07CisgICAgICAgIGludCBwdHIgPSBfcHJpbnRCYXNlNjRCaW5hcnkoaW5wdXQsb2Zmc2V0LGxlbixidWYsMCk7CisgICAgICAgIGFzc2VydCBwdHI9PWJ1Zi5sZW5ndGg7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1Zik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBhIGJ5dGUgYXJyYXkgaW50byBhIGNoYXIgYXJyYXkgYnkgZG9pbmcgYmFzZTY0IGVuY29kaW5nLgorICAgICAqCisgICAgICogVGhlIGNhbGxlciBtdXN0IHN1cHBseSBhIGJpZyBlbm91Z2ggYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgdGhlIHZhbHVlIG9mIHtAY29kZSBwdHIrKChsZW4rMikvMykqNH0sIHdoaWNoIGlzIHRoZSBuZXcgb2Zmc2V0CisgICAgICogICAgICBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgZnVydGhlciBieXRlcyBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IF9wcmludEJhc2U2NEJpbmFyeShieXRlW10gaW5wdXQsIGludCBvZmZzZXQsIGludCBsZW4sIGNoYXJbXSBidWYsIGludCBwdHIpIHsKKyAgICAgICAgZm9yKCBpbnQgaT1vZmZzZXQ7IGk8bGVuOyBpKz0zICkgeworICAgICAgICAgICAgc3dpdGNoKCBsZW4taSApIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKGlucHV0W2ldPj4yKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKCgoaW5wdXRbaV0pJjB4Myk8PDQpOworICAgICAgICAgICAgICAgIGJ1ZltwdHIrK10gPSAnPSc7CisgICAgICAgICAgICAgICAgYnVmW3B0cisrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKGlucHV0W2ldPj4yKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaV0mMHgzKTw8NCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaSsxXT4+NCkmMHhGKSk7CisgICAgICAgICAgICAgICAgYnVmW3B0cisrXSA9IGVuY29kZSgoaW5wdXRbaSsxXSYweEYpPDwyKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gJz0nOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKGlucHV0W2ldPj4yKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaV0mMHgzKTw8NCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaSsxXT4+NCkmMHhGKSk7CisgICAgICAgICAgICAgICAgYnVmW3B0cisrXSA9IGVuY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlucHV0W2krMV0mMHhGKTw8Mil8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnB1dFtpKzJdPj42KSYweDMpKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlKGlucHV0W2krMl0mMHgzRik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHB0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSBpbnRvIGFub3RoZXIgYnl0ZSBhcnJheSBieSBmaXJzdCBkb2luZyBiYXNlNjQgZW5jb2RpbmcKKyAgICAgKiB0aGVuIGVuY29kaW5nIHRoZSByZXN1bHQgaW4gQVNDSUkuCisgICAgICoKKyAgICAgKiBUaGUgY2FsbGVyIG11c3Qgc3VwcGx5IGEgYmlnIGVub3VnaCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgdmFsdWUgb2Yge0Bjb2RlIHB0cisoKGxlbisyKS8zKSo0fSwgd2hpY2ggaXMgdGhlIG5ldyBvZmZzZXQKKyAgICAgKiAgICAgIGluIHRoZSBvdXRwdXQgYnVmZmVyIHdoZXJlIHRoZSBmdXJ0aGVyIGJ5dGVzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgX3ByaW50QmFzZTY0QmluYXJ5KGJ5dGVbXSBpbnB1dCwgaW50IG9mZnNldCwgaW50IGxlbiwgYnl0ZVtdIG91dCwgaW50IHB0cikgeworICAgICAgICBieXRlW10gYnVmID0gb3V0OworICAgICAgICBpbnQgbWF4ID0gbGVuK29mZnNldDsKKyAgICAgICAgZm9yKCBpbnQgaT1vZmZzZXQ7IGk8bWF4OyBpKz0zICkgeworICAgICAgICAgICAgc3dpdGNoKCBtYXgtaSApIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlQnl0ZShpbnB1dFtpXT4+Mik7CisgICAgICAgICAgICAgICAgYnVmW3B0cisrXSA9IGVuY29kZUJ5dGUoKChpbnB1dFtpXSkmMHgzKTw8NCk7CisgICAgICAgICAgICAgICAgYnVmW3B0cisrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gJz0nOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGJ1ZltwdHIrK10gPSBlbmNvZGVCeXRlKGlucHV0W2ldPj4yKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlQnl0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlucHV0W2ldJjB4Myk8PDQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlucHV0W2krMV0+PjQpJjB4RikpOworICAgICAgICAgICAgICAgIGJ1ZltwdHIrK10gPSBlbmNvZGVCeXRlKChpbnB1dFtpKzFdJjB4Rik8PDIpOworICAgICAgICAgICAgICAgIGJ1ZltwdHIrK10gPSAnPSc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJ1ZltwdHIrK10gPSBlbmNvZGVCeXRlKGlucHV0W2ldPj4yKTsKKyAgICAgICAgICAgICAgICBidWZbcHRyKytdID0gZW5jb2RlQnl0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlucHV0W2ldJjB4Myk8PDQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlucHV0W2krMV0+PjQpJjB4RikpOworICAgICAgICAgICAgICAgIGJ1ZltwdHIrK10gPSBlbmNvZGVCeXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRbaSsxXSYweEYpPDwyKXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlucHV0W2krMl0+PjYpJjB4MykpOworICAgICAgICAgICAgICAgIGJ1ZltwdHIrK10gPSBlbmNvZGVCeXRlKGlucHV0W2krMl0mMHgzRik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHRyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENoYXJTZXF1ZW5jZSByZW1vdmVPcHRpb25hbFBsdXMoQ2hhclNlcXVlbmNlIHMpIHsKKyAgICAgICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7CisKKyAgICAgICAgaWYobGVuPD0xIHx8IHMuY2hhckF0KDApIT0nKycpICAgIHJldHVybiBzOworCisgICAgICAgIHMgPSBzLnN1YlNlcXVlbmNlKDEsbGVuKTsKKyAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KDApOworICAgICAgICBpZignMCc8PWNoICYmIGNoPD0nOScpICAgIHJldHVybiBzOworICAgICAgICBpZignLic9PWNoICkgICAgcmV0dXJuIHM7CisKKyAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWdpdE9yUGVyaW9kT3JTaWduKCBjaGFyIGNoICkgeworICAgICAgICBpZiggJzAnPD1jaCAmJiBjaDw9JzknICkgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmKCBjaD09JysnIHx8IGNoPT0nLScgfHwgY2g9PScuJyApICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0YXR5cGVGYWN0b3J5IGRhdGF0eXBlRmFjdG9yeTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkYXRhdHlwZUZhY3RvcnkgPSBEYXRhdHlwZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsZW5kYXJGb3JtYXR0ZXIgeworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkb0Zvcm1hdCggU3RyaW5nIGZvcm1hdCwgQ2FsZW5kYXIgY2FsICkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgZmlkeCA9IDA7CisgICAgICAgICAgICBpbnQgZmxlbiA9IGZvcm1hdC5sZW5ndGgoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgd2hpbGUoZmlkeDxmbGVuKSB7CisgICAgICAgICAgICAgICAgY2hhciBmY2ggPSBmb3JtYXQuY2hhckF0KGZpZHgrKyk7CisKKyAgICAgICAgICAgICAgICBpZihmY2ghPSclJykgeyAgLy8gbm90IGEgbWV0YSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChmY2gpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzZWVuIG1ldGEgY2hhcmFjdGVyLiB3ZSBkb24ndCBkbyBlcnJvciBjaGVjayBhZ2FpbnN0IHRoZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdC5jaGFyQXQoZmlkeCsrKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ1knIDogLy8geWVhcgorICAgICAgICAgICAgICAgICAgICBmb3JtYXRZZWFyKGNhbCwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdNJyA6IC8vIG1vbnRoCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdE1vbnRoKGNhbCwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdEJyA6IC8vIGRheXMKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0RGF5cyhjYWwsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnaCcgOiAvLyBob3VycworICAgICAgICAgICAgICAgICAgICBmb3JtYXRIb3VycyhjYWwsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnbScgOiAvLyBtaW51dGVzCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdE1pbnV0ZXMoY2FsLCBidWYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ3MnIDogLy8gcGFyc2Ugc2Vjb25kcy4KKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0U2Vjb25kcyhjYWwsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAneicgOiAvLyB0aW1lIHpvbmUKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0VGltZVpvbmUoY2FsLGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIC8vIGlsbGVnYWwgbWV0YSBjaGFyYWN0ZXIuIGltcG9zc2libGUuCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0WWVhcihDYWxlbmRhciBjYWwsIFN0cmluZ0J1aWxkZXIgYnVmKSB7CisgICAgICAgICAgICBpbnQgeWVhciA9IGNhbC5nZXQoQ2FsZW5kYXIuWUVBUik7CisKKyAgICAgICAgICAgIFN0cmluZyBzOworICAgICAgICAgICAgaWYgKHllYXIgPD0gMCkgLy8gbmVnYXRpdmUgdmFsdWUKKyAgICAgICAgICAgICAgICBzID0gSW50ZWdlci50b1N0cmluZygxIC0geWVhcik7CisgICAgICAgICAgICBlbHNlIC8vIHBvc2l0aXZlIHZhbHVlCisgICAgICAgICAgICAgICAgcyA9IEludGVnZXIudG9TdHJpbmcoeWVhcik7CisKKyAgICAgICAgICAgIHdoaWxlIChzLmxlbmd0aCgpIDwgNCkKKyAgICAgICAgICAgICAgICBzID0gJzAnICsgczsKKyAgICAgICAgICAgIGlmICh5ZWFyIDw9IDApCisgICAgICAgICAgICAgICAgcyA9ICctJyArIHM7CisKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdE1vbnRoKENhbGVuZGFyIGNhbCwgU3RyaW5nQnVpbGRlciBidWYpIHsKKyAgICAgICAgICAgIGZvcm1hdFR3b0RpZ2l0cyhjYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSsxLGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdERheXMoQ2FsZW5kYXIgY2FsLCBTdHJpbmdCdWlsZGVyIGJ1ZikgeworICAgICAgICAgICAgZm9ybWF0VHdvRGlnaXRzKGNhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSxidWYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIb3VycyhDYWxlbmRhciBjYWwsIFN0cmluZ0J1aWxkZXIgYnVmKSB7CisgICAgICAgICAgICBmb3JtYXRUd29EaWdpdHMoY2FsLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSksYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0TWludXRlcyhDYWxlbmRhciBjYWwsIFN0cmluZ0J1aWxkZXIgYnVmKSB7CisgICAgICAgICAgICBmb3JtYXRUd29EaWdpdHMoY2FsLmdldChDYWxlbmRhci5NSU5VVEUpLGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdFNlY29uZHMoQ2FsZW5kYXIgY2FsLCBTdHJpbmdCdWlsZGVyIGJ1ZikgeworICAgICAgICAgICAgZm9ybWF0VHdvRGlnaXRzKGNhbC5nZXQoQ2FsZW5kYXIuU0VDT05EKSxidWYpOworICAgICAgICAgICAgaWYgKGNhbC5pc1NldChDYWxlbmRhci5NSUxMSVNFQ09ORCkpIHsgLy8gbWlsbGlzZWNvbmRzCisgICAgICAgICAgICAgICAgaW50IG4gPSBjYWwuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKTsKKyAgICAgICAgICAgICAgICBpZihuIT0wKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtcyA9IEludGVnZXIudG9TdHJpbmcobik7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtcy5sZW5ndGgoKSA8IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBtcyA9ICcwJyArIG1zOyAvLyBsZWZ0IDAgcGFkZGluZ3MuCisKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnLicpOworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKG1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogZm9ybWF0cyB0aW1lIHpvbmUgc3BlY2lmaWVyLiAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdFRpbWVab25lKENhbGVuZGFyIGNhbCxTdHJpbmdCdWlsZGVyIGJ1ZikgeworICAgICAgICAgICAgVGltZVpvbmUgdHogPSBjYWwuZ2V0VGltZVpvbmUoKTsKKworICAgICAgICAgICAgaWYgKHR6ID09IG51bGwpICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgcHJpbnQgb3V0IG5vcm1hbGx5LgorICAgICAgICAgICAgaW50IG9mZnNldDsKKyAgICAgICAgICAgIGlmICh0ei5pbkRheWxpZ2h0VGltZShjYWwuZ2V0VGltZSgpKSkgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHR6LmdldFJhd09mZnNldCgpICsgKHR6LnVzZURheWxpZ2h0VGltZSgpPzM2MDAwMDA6MCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHR6LmdldFJhd09mZnNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihvZmZzZXQ9PTApIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdaJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2Zmc2V0ID49IDApCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnKycpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnLScpOworICAgICAgICAgICAgICAgIG9mZnNldCAqPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0IC89IDYwICogMTAwMDsgLy8gb2Zmc2V0IGlzIGluIG1pbGxpLXNlY29uZHMKKworICAgICAgICAgICAgZm9ybWF0VHdvRGlnaXRzKG9mZnNldCAvIDYwLCBidWYpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnOicpOworICAgICAgICAgICAgZm9ybWF0VHdvRGlnaXRzKG9mZnNldCAlIDYwLCBidWYpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIGZvcm1hdHMgSW50ZWdlciBpbnRvIHR3by1jaGFyYWN0ZXItd2lkZSBzdHJpbmcuICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0VHdvRGlnaXRzKGludCBuLFN0cmluZ0J1aWxkZXIgYnVmKSB7CisgICAgICAgICAgICAvLyBuIGlzIGFsd2F5cyBub24tbmVnYXRpdmUuCisgICAgICAgICAgICBpZiAobiA8IDEwKSBidWYuYXBwZW5kKCcwJyk7CisgICAgICAgICAgICBidWYuYXBwZW5kKG4pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvRGF0YXR5cGVDb252ZXJ0ZXJJbnRlcmZhY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0RhdGF0eXBlQ29udmVydGVySW50ZXJmYWNlLmphdmEKaW5kZXggNDRkOTUwYi4uZTY3ZDI2NSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvRGF0YXR5cGVDb252ZXJ0ZXJJbnRlcmZhY2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9EYXRhdHlwZUNvbnZlcnRlckludGVyZmFjZS5qYXZhCkBAIC03NSw2ICs3NSw3IEBACiAgKgogICogPHA+CiAgKiBAYXV0aG9yIDx1bD48bGk+U2VraGFyIFZhampoYWxhLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+Sm9lIEZpYWxsaSwgU3VuIE1pY3Jvc3lzdGVtcyBJbmMuPC9saT48bGk+S29oc3VrZSBLYXdhZ3VjaGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5SeWFuIFNob2VtYWtlcixTdW4gTWljcm9zeXN0ZW1zIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCiAgKiBAc2VlIERhdGF0eXBlQ29udmVydGVyCiAgKiBAc2VlIFBhcnNlQ29udmVyc2lvbkV2ZW50CiAgKiBAc2VlIFByaW50Q29udmVyc2lvbkV2ZW50CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9FbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9FbGVtZW50LmphdmEKaW5kZXggZTUwNjM1YS4uYjBlNjk5NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvRWxlbWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0VsZW1lbnQuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogICogYW5kIDUuNy4xICJCaW5kIHRvIEphdmEgRWxlbWVudCBJbnRlcmZhY2UiIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+Sm9lIEZpYWxsaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqIEBzaW5jZSBKQVhCMS4wCiAgKi8KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvR2V0UHJvcGVydHlBY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0dldFByb3BlcnR5QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3YmEyNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0dldFByb3BlcnR5QWN0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBqYXZheC54bWwuYmluZDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKKworLyoqCisgKiB7QGxpbmsgUHJpdmlsZWdlZEFjdGlvbn0gdGhhdCBnZXRzIHRoZSBzeXN0ZW0gcHJvcGVydHkgdmFsdWUuCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKi8KK2ZpbmFsIGNsYXNzIEdldFByb3BlcnR5QWN0aW9uIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+IHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWU7CisKKyAgICBwdWJsaWMgR2V0UHJvcGVydHlBY3Rpb24oU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHJ1bigpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0pBWEIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0pBWEIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzQ1NWUwCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvSkFYQi5qYXZhCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnhtbC5iaW5kOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKKworLyoqCisgKiBDbGFzcyB0aGF0IGRlZmluZXMgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29tbW9uLCBzaW1wbGUgdXNlIG9mIEpBWEIuCisgKgorICogPHA+CisgKiBNZXRob2RzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBhcmUgY29udmVuaWVuY2UgbWV0aG9kcyB0aGF0IGNvbWJpbmUgc2V2ZXJhbCBiYXNpYyBvcGVyYXRpb25zCisgKiBpbiB0aGUge0BsaW5rIEpBWEJDb250ZXh0fSwge0BsaW5rIFVubWFyc2hhbGxlcn0sIGFuZCB7QGxpbmsgTWFyc2hhbGxlcn0uCisgKgorICogVGhleSBhcmUgZGVzaWduZWQKKyAqIHRvIGJlIHRoZSBwcmVmZXJlZCBtZXRob2RzIGZvciBkZXZlbG9wZXJzIG5ldyB0byBKQVhCLiBUaGV5IGhhdmUKKyAqIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyc3RpY3M6CisgKgorICogPG9sPgorICogIDxsaT5HZW5lcmFsbHkgc3BlYWtpbmcsIHRoZSBwZXJmb3JtYW5jZSBpcyBub3QgbmVjZXNzYXJpbHkgb3B0aW1hbC4KKyAqICAgICAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBwZW9wbGUgd2hvIG5lZWQgdG8gd3JpdGUgcGVyZm9ybWFuY2UKKyAqICAgICAgY3JpdGljYWwgY29kZSB3aWxsIHVzZSB0aGUgcmVzdCBvZiB0aGUgSkFYQiBBUEkgZGlyZWN0bHkuCisgKiAgPGxpPkVycm9ycyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIHByb2Nlc3NpbmcgaXMgd3JhcHBlZCBpbnRvCisgKiAgICAgIHtAbGluayBEYXRhQmluZGluZ0V4Y2VwdGlvbn0gKHdoaWNoIHdpbGwgaGF2ZSB7QGxpbmsgSkFYQkV4Y2VwdGlvbn0KKyAqICAgICAgYXMgaXRzIHtAbGluayBUaHJvd2FibGUjZ2V0Q2F1c2UoKSBjYXVzZX0uIEl0IGlzIGV4cGVjdGVkIHRoYXQKKyAqICAgICAgcGVvcGxlIHdobyBwcmVmZXIgdGhlIGNoZWNrZWQgZXhjZXB0aW9uIHdvdWxkIHVzZQorICogICAgICB0aGUgcmVzdCBvZiB0aGUgSkFYQiBBUEkgZGlyZWN0bHkuCisgKiA8L29sPgorICoKKyAqIDxwPgorICogSW4gYWRkaXRpb24sIHRoZSA8dHQ+dW5tYXJzaGFsPC90dD4gbWV0aG9kcyBoYXZlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWM6CisgKgorICogPG9sPgorICogIDxsaT5TY2hlbWEgdmFsaWRhdGlvbiBpcyBub3QgcGVyZm9ybWVkIG9uIHRoZSBpbnB1dCBYTUwuCisgKiAgICAgIFRoZSBwcm9jZXNzaW5nIHdpbGwgdHJ5IHRvIGNvbnRpbnVlIGV2ZW4gaWYgdGhlcmUKKyAqICAgICAgYXJlIGVycm9ycyBpbiB0aGUgWE1MLCBhcyBtdWNoIGFzIHBvc3NpYmxlLiBPbmx5IGFzCisgKiAgICAgIHRoZSBsYXN0IHJlc29ydCwgdGhpcyBtZXRob2QgZmFpbHMgd2l0aCB7QGxpbmsgRGF0YUJpbmRpbmdFeGNlcHRpb259LgorICogPC9vbD4KKyAqCisgKiA8cD4KKyAqIFNpbWlsYXJseSwgdGhlIDx0dD5tYXJzaGFsPC90dD4gbWV0aG9kcyBoYXZlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWM6CisgKiA8b2w+CisgKiAgPGxpPlRoZSBwcm9jZXNzaW5nIHdpbGwgdHJ5IHRvIGNvbnRpbnVlIGV2ZW4gaWYgdGhlIEphdmEgb2JqZWN0IHRyZWUKKyAqICAgICAgZG9lcyBub3QgbWVldCB0aGUgdmFsaWRpdHkgcmVxdWlyZW1lbnQuIE9ubHkgYXMKKyAqICAgICAgdGhlIGxhc3QgcmVzb3J0LCB0aGlzIG1ldGhvZCBmYWlscyB3aXRoIHtAbGluayBEYXRhQmluZGluZ0V4Y2VwdGlvbn0uCisgKiA8L29sPgorICoKKyAqCisgKiA8cD4KKyAqIEFsbCB0aGUgbWV0aG9kcyBvbiB0aGlzIGNsYXNzIHJlcXVpcmUgbm9uLW51bGwgYXJndW1lbnRzIHRvIGFsbCBwYXJhbWV0ZXJzLgorICogVGhlIDx0dD51bm1hcnNoYWw8L3R0PiBtZXRob2RzIGVpdGhlciBmYWlsIHdpdGggYW4gZXhjZXB0aW9uIG9yIHJldHVybgorICogYSBub24tbnVsbCB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKQVhCIHsKKyAgICAvKioKKyAgICAgKiBObyBpbnN0YW5jaWF0aW9uIGlzIGFsbG93ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBKQVhCKCkge30KKworICAgIC8qKgorICAgICAqIFRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlLCB3ZSdsbCBjYWNoZSB0aGUgbGFzdCB7QGxpbmsgSkFYQkNvbnRleHR9IHVzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ2FjaGUgeworICAgICAgICBmaW5hbCBDbGFzcyB0eXBlOworICAgICAgICBmaW5hbCBKQVhCQ29udGV4dCBjb250ZXh0OworCisgICAgICAgIHB1YmxpYyBDYWNoZShDbGFzcyB0eXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UodHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZS4gV2UgZG9uJ3Qgd2FudCB0byBwcmV2ZW50IHRoZSB7QGxpbmsgQ2FjaGUjdHlwZX0gZnJvbSBHQy1lZCwKKyAgICAgKiBoZW5jZSB7QGxpbmsgV2Vha1JlZmVyZW5jZX0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgV2Vha1JlZmVyZW5jZTxDYWNoZT4gY2FjaGU7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIHRoZSB7QGxpbmsgSkFYQkNvbnRleHR9IGZyb20gdGhlIGdpdmVuIHR5cGUsCisgICAgICogYnkgdXNpbmcgdGhlIGNhY2hlIGlmIHBvc3NpYmxlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2UgZG9uJ3QgdXNlIGxvY2tzIHRvIGNvbnRyb2wgYWNjZXNzIHRvIHtAbGluayAjY2FjaGV9LCBidXQgdGhpcyBjb2RlCisgICAgICogc2hvdWxkIGJlIHRocmVhZC1zYWZlIHRoYW5rcyB0byB0aGUgaW1tdXRhYmxlIHtAbGluayBDYWNoZX0gYW5kIHtAY29kZSB2b2xhdGlsZX0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IEpBWEJDb250ZXh0IGdldENvbnRleHQoQ2xhc3M8VD4gdHlwZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBXZWFrUmVmZXJlbmNlPENhY2hlPiBjID0gY2FjaGU7CisgICAgICAgIGlmKGMhPW51bGwpIHsKKyAgICAgICAgICAgIENhY2hlIGQgPSBjLmdldCgpOworICAgICAgICAgICAgaWYoZCE9bnVsbCAmJiBkLnR5cGU9PXR5cGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGQuY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG92ZXJ3cml0ZSB0aGUgY2FjaGUKKyAgICAgICAgQ2FjaGUgZCA9IG5ldyBDYWNoZSh0eXBlKTsKKyAgICAgICAgY2FjaGUgPSBuZXcgV2Vha1JlZmVyZW5jZTxDYWNoZT4oZCk7CisKKyAgICAgICAgcmV0dXJuIGQuY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBpbiBhIEphdmEgb2JqZWN0IHRyZWUgZnJvbSB0aGUgZ2l2ZW4gWE1MIGlucHV0LgorICAgICAqCisgICAgICogQHBhcmFtIHhtbAorICAgICAqICAgICAgUmVhZHMgdGhlIGVudGlyZSBmaWxlIGFzIFhNTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIHVubWFyc2hhbCggRmlsZSB4bWwsIENsYXNzPFQ+IHR5cGUgKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKQVhCRWxlbWVudDxUPiBpdGVtID0gZ2V0Q29udGV4dCh0eXBlKS5jcmVhdGVVbm1hcnNoYWxsZXIoKS51bm1hcnNoYWwobmV3IFN0cmVhbVNvdXJjZSh4bWwpLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtLmdldFZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFCaW5kaW5nRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgaW4gYSBKYXZhIG9iamVjdCB0cmVlIGZyb20gdGhlIGdpdmVuIFhNTCBpbnB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWwKKyAgICAgKiAgICAgIFRoZSByZXNvdXJjZSBwb2ludGVkIGJ5IHRoZSBVUkwgaXMgcmVhZCBpbiBpdHMgZW50aXJldHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCB1bm1hcnNoYWwoIFVSTCB4bWwsIENsYXNzPFQ+IHR5cGUgKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKQVhCRWxlbWVudDxUPiBpdGVtID0gZ2V0Q29udGV4dCh0eXBlKS5jcmVhdGVVbm1hcnNoYWxsZXIoKS51bm1hcnNoYWwodG9Tb3VyY2UoeG1sKSwgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhQmluZGluZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFCaW5kaW5nRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgaW4gYSBKYXZhIG9iamVjdCB0cmVlIGZyb20gdGhlIGdpdmVuIFhNTCBpbnB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWwKKyAgICAgKiAgICAgIFRoZSBVUkkgaXMge0BsaW5rIFVSSSN0b1VSTCgpIHR1cm5lZCBpbnRvIFVSTH0gYW5kIHRoZW4KKyAgICAgKiAgICAgIGZvbGxvd3MgdGhlIGhhbmRsaW5nIG9mIDx0dD5VUkw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIHVubWFyc2hhbCggVVJJIHhtbCwgQ2xhc3M8VD4gdHlwZSApIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpBWEJFbGVtZW50PFQ+IGl0ZW0gPSBnZXRDb250ZXh0KHR5cGUpLmNyZWF0ZVVubWFyc2hhbGxlcigpLnVubWFyc2hhbCh0b1NvdXJjZSh4bWwpLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtLmdldFZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFCaW5kaW5nRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUJpbmRpbmdFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBpbiBhIEphdmEgb2JqZWN0IHRyZWUgZnJvbSB0aGUgZ2l2ZW4gWE1MIGlucHV0LgorICAgICAqCisgICAgICogQHBhcmFtIHhtbAorICAgICAqICAgICAgVGhlIHN0cmluZyBpcyBmaXJzdCBpbnRlcnByZXRlZCBhcyBhbiBhYnNvbHV0ZSA8dHQ+VVJJPC90dD4uCisgICAgICogICAgICBJZiBpdCdzIG5vdCB7QGxpbmsgVVJJI2lzQWJzb2x1dGUoKSBhIHZhbGlkIGFic29sdXRlIFVSSX0sCisgICAgICogICAgICB0aGVuIGl0J3MgaW50ZXJwcmV0ZWQgYXMgYSA8dHQ+RmlsZTwvdHQ+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCB1bm1hcnNoYWwoIFN0cmluZyB4bWwsIENsYXNzPFQ+IHR5cGUgKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKQVhCRWxlbWVudDxUPiBpdGVtID0gZ2V0Q29udGV4dCh0eXBlKS5jcmVhdGVVbm1hcnNoYWxsZXIoKS51bm1hcnNoYWwodG9Tb3VyY2UoeG1sKSwgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhQmluZGluZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFCaW5kaW5nRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgaW4gYSBKYXZhIG9iamVjdCB0cmVlIGZyb20gdGhlIGdpdmVuIFhNTCBpbnB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWwKKyAgICAgKiAgICAgIFRoZSBlbnRpcmUgc3RyZWFtIGlzIHJlYWQgYXMgYW4gWE1MIGluZm9zZXQuCisgICAgICogICAgICBVcG9uIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLCB0aGUgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgdW5tYXJzaGFsKCBJbnB1dFN0cmVhbSB4bWwsIENsYXNzPFQ+IHR5cGUgKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKQVhCRWxlbWVudDxUPiBpdGVtID0gZ2V0Q29udGV4dCh0eXBlKS5jcmVhdGVVbm1hcnNoYWxsZXIoKS51bm1hcnNoYWwodG9Tb3VyY2UoeG1sKSwgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhQmluZGluZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFCaW5kaW5nRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgaW4gYSBKYXZhIG9iamVjdCB0cmVlIGZyb20gdGhlIGdpdmVuIFhNTCBpbnB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWwKKyAgICAgKiAgICAgIFRoZSBjaGFyYWN0ZXIgc3RyZWFtIGlzIHJlYWQgYXMgYW4gWE1MIGluZm9zZXQuCisgICAgICogICAgICBUaGUgZW5jb2RpbmcgZGVjbGFyYXRpb24gaW4gdGhlIFhNTCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogICAgICBVcG9uIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLCB0aGUgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgdW5tYXJzaGFsKCBSZWFkZXIgeG1sLCBDbGFzczxUPiB0eXBlICkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSkFYQkVsZW1lbnQ8VD4gaXRlbSA9IGdldENvbnRleHQodHlwZSkuY3JlYXRlVW5tYXJzaGFsbGVyKCkudW5tYXJzaGFsKHRvU291cmNlKHhtbCksIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUJpbmRpbmdFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhQmluZGluZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGluIGEgSmF2YSBvYmplY3QgdHJlZSBmcm9tIHRoZSBnaXZlbiBYTUwgaW5wdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sCisgICAgICogICAgICBUaGUgWE1MIGluZm9zZXQgdGhhdCB0aGUge0BsaW5rIFNvdXJjZX0gcmVwcmVzZW50cyBpcyByZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgdW5tYXJzaGFsKCBTb3VyY2UgeG1sLCBDbGFzczxUPiB0eXBlICkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSkFYQkVsZW1lbnQ8VD4gaXRlbSA9IGdldENvbnRleHQodHlwZSkuY3JlYXRlVW5tYXJzaGFsbGVyKCkudW5tYXJzaGFsKHRvU291cmNlKHhtbCksIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUJpbmRpbmdFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhQmluZGluZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHtAbGluayBTb3VyY2V9IGZyb20gdmFyaW91cyBYTUwgcmVwcmVzZW50YXRpb24uCisgICAgICogU2VlIHtAbGluayAjdW5tYXJzaGFsfSBmb3IgdGhlIGNvbnZlcnNpb24gcnVsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU291cmNlIHRvU291cmNlKE9iamVjdCB4bWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmKHhtbD09bnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIFhNTCBpcyBnaXZlbiIpOworCisgICAgICAgIGlmICh4bWwgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgeG1sPW5ldyBVUkkoKFN0cmluZyl4bWwpOworICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB4bWw9bmV3IEZpbGUoKFN0cmluZyl4bWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh4bWwgaW5zdGFuY2VvZiBGaWxlKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSkgeG1sOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UoZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhtbCBpbnN0YW5jZW9mIFVSSSkgeworICAgICAgICAgICAgVVJJIHVyaSA9IChVUkkpIHhtbDsKKyAgICAgICAgICAgIHhtbD11cmkudG9VUkwoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeG1sIGluc3RhbmNlb2YgVVJMKSB7CisgICAgICAgICAgICBVUkwgdXJsID0gKFVSTCkgeG1sOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh4bWwgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSAoSW5wdXRTdHJlYW0pIHhtbDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKGluKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeG1sIGluc3RhbmNlb2YgUmVhZGVyKSB7CisgICAgICAgICAgICBSZWFkZXIgciA9IChSZWFkZXIpIHhtbDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKHIpOworICAgICAgICB9CisgICAgICAgIGlmICh4bWwgaW5zdGFuY2VvZiBTb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiAoU291cmNlKSB4bWw7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSSBkb24ndCB1bmRlcnN0YW5kIGhvdyB0byBoYW5kbGUgIit4bWwuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgSmF2YSBvYmplY3QgdHJlZSB0byBYTUwgYW5kIHN0b3JlIGl0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF4Yk9iamVjdAorICAgICAqICAgICAgVGhlIEphdmEgb2JqZWN0IHRvIGJlIG1hcnNoYWxsZWQgaW50byBYTUwuIElmIHRoaXMgb2JqZWN0IGlzCisgICAgICogICAgICBhIHtAbGluayBKQVhCRWxlbWVudH0sIGl0IHdpbGwgcHJvdmlkZSB0aGUgcm9vdCB0YWcgbmFtZSBhbmQKKyAgICAgKiAgICAgIHRoZSBib2R5LiBJZiB0aGlzIG9iamVjdCBoYXMge0BsaW5rIFhtbFJvb3RFbGVtZW50fQorICAgICAqICAgICAgb24gaXRzIGNsYXNzIGRlZmluaXRpb24sIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByb290IHRhZyBuYW1lCisgICAgICogICAgICBhbmQgdGhlIGdpdmVuIG9iamVjdCB3aWxsIHByb3ZpZGUgdGhlIGJvZHkuIE90aGVyd2lzZSwKKyAgICAgKiAgICAgIHRoZSByb290IHRhZyBuYW1lIGlzIHtAbGluayBJbnRyb3NwZWN0b3IjZGVjYXBpdGFsaXplKFN0cmluZykgaW5mZXJlZH0gZnJvbQorICAgICAqICAgICAge0BsaW5rIENsYXNzI2dldFNpbXBsZU5hbWUoKSB0aGUgc2hvcnQgY2xhc3MgbmFtZX0uCisgICAgICogICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHhtbAorICAgICAqICAgICAgWE1MIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZpbGUuIElmIGl0IGFscmVhZHkgZXhpc3RzLAorICAgICAqICAgICAgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRGF0YUJpbmRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIHRoZSBvcGVyYXRpb24gZmFpbHMsIHN1Y2ggYXMgZHVlIHRvIEkvTyBlcnJvciwgdW5iaW5kYWJsZSBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJzaGFsKCBPYmplY3QgamF4Yk9iamVjdCwgRmlsZSB4bWwgKSB7CisgICAgICAgIF9tYXJzaGFsKGpheGJPYmplY3QseG1sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBKYXZhIG9iamVjdCB0cmVlIHRvIFhNTCBhbmQgc3RvcmUgaXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXhiT2JqZWN0CisgICAgICogICAgICBUaGUgSmF2YSBvYmplY3QgdG8gYmUgbWFyc2hhbGxlZCBpbnRvIFhNTC4gSWYgdGhpcyBvYmplY3QgaXMKKyAgICAgKiAgICAgIGEge0BsaW5rIEpBWEJFbGVtZW50fSwgaXQgd2lsbCBwcm92aWRlIHRoZSByb290IHRhZyBuYW1lIGFuZAorICAgICAqICAgICAgdGhlIGJvZHkuIElmIHRoaXMgb2JqZWN0IGhhcyB7QGxpbmsgWG1sUm9vdEVsZW1lbnR9CisgICAgICogICAgICBvbiBpdHMgY2xhc3MgZGVmaW5pdGlvbiwgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3QgdGFnIG5hbWUKKyAgICAgKiAgICAgIGFuZCB0aGUgZ2l2ZW4gb2JqZWN0IHdpbGwgcHJvdmlkZSB0aGUgYm9keS4gT3RoZXJ3aXNlLAorICAgICAqICAgICAgdGhlIHJvb3QgdGFnIG5hbWUgaXMge0BsaW5rIEludHJvc3BlY3RvciNkZWNhcGl0YWxpemUoU3RyaW5nKSBpbmZlcmVkfSBmcm9tCisgICAgICogICAgICB7QGxpbmsgQ2xhc3MjZ2V0U2ltcGxlTmFtZSgpIHRoZSBzaG9ydCBjbGFzcyBuYW1lfS4KKyAgICAgKiAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sCisgICAgICogICAgICBUaGUgWE1MIHdpbGwgYmUge0BsaW5rIFVSTENvbm5lY3Rpb24jZ2V0T3V0cHV0U3RyZWFtKCkgc2VudH0gdG8gdGhlCisgICAgICogICAgICByZXNvdXJjZSBwb2ludGVkIGJ5IHRoaXMgVVJMLiBOb3RlIHRoYXQgbm90IGFsbCA8dHQ+VVJMPC90dD5zIHN1cHBvcnQKKyAgICAgKiAgICAgIHN1Y2ggb3BlcmF0aW9uLCBhbmQgZXhhY3Qgc2VtYW50aWNzIGRlcGVuZHMgb24gdGhlIDx0dD5VUkw8L3R0PgorICAgICAqICAgICAgaW1wbGVtZW50YXRpb25zLiBJbiBjYXNlIG9mIHtAbGluayBIdHRwVVJMQ29ubmVjdGlvbiBIVFRQIFVSTHN9LAorICAgICAqICAgICAgdGhpcyB3aWxsIHBlcmZvcm0gSFRUUCBQT1NULgorICAgICAqCisgICAgICogQHRocm93cyBEYXRhQmluZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgSWYgdGhlIG9wZXJhdGlvbiBmYWlscywgc3VjaCBhcyBkdWUgdG8gSS9PIGVycm9yLCB1bmJpbmRhYmxlIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcnNoYWwoIE9iamVjdCBqYXhiT2JqZWN0LCBVUkwgeG1sICkgeworICAgICAgICBfbWFyc2hhbChqYXhiT2JqZWN0LHhtbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgSmF2YSBvYmplY3QgdHJlZSB0byBYTUwgYW5kIHN0b3JlIGl0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF4Yk9iamVjdAorICAgICAqICAgICAgVGhlIEphdmEgb2JqZWN0IHRvIGJlIG1hcnNoYWxsZWQgaW50byBYTUwuIElmIHRoaXMgb2JqZWN0IGlzCisgICAgICogICAgICBhIHtAbGluayBKQVhCRWxlbWVudH0sIGl0IHdpbGwgcHJvdmlkZSB0aGUgcm9vdCB0YWcgbmFtZSBhbmQKKyAgICAgKiAgICAgIHRoZSBib2R5LiBJZiB0aGlzIG9iamVjdCBoYXMge0BsaW5rIFhtbFJvb3RFbGVtZW50fQorICAgICAqICAgICAgb24gaXRzIGNsYXNzIGRlZmluaXRpb24sIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByb290IHRhZyBuYW1lCisgICAgICogICAgICBhbmQgdGhlIGdpdmVuIG9iamVjdCB3aWxsIHByb3ZpZGUgdGhlIGJvZHkuIE90aGVyd2lzZSwKKyAgICAgKiAgICAgIHRoZSByb290IHRhZyBuYW1lIGlzIHtAbGluayBJbnRyb3NwZWN0b3IjZGVjYXBpdGFsaXplKFN0cmluZykgaW5mZXJlZH0gZnJvbQorICAgICAqICAgICAge0BsaW5rIENsYXNzI2dldFNpbXBsZU5hbWUoKSB0aGUgc2hvcnQgY2xhc3MgbmFtZX0uCisgICAgICogICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHhtbAorICAgICAqICAgICAgVGhlIFVSSSBpcyB7QGxpbmsgVVJJI3RvVVJMKCkgdHVybmVkIGludG8gVVJMfSBhbmQgdGhlbgorICAgICAqICAgICAgZm9sbG93cyB0aGUgaGFuZGxpbmcgb2YgPHR0PlVSTDwvdHQ+LiBTZWUgYWJvdmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIERhdGFCaW5kaW5nRXhjZXB0aW9uCisgICAgICogICAgICBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzLCBzdWNoIGFzIGR1ZSB0byBJL08gZXJyb3IsIHVuYmluZGFibGUgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFyc2hhbCggT2JqZWN0IGpheGJPYmplY3QsIFVSSSB4bWwgKSB7CisgICAgICAgIF9tYXJzaGFsKGpheGJPYmplY3QseG1sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBKYXZhIG9iamVjdCB0cmVlIHRvIFhNTCBhbmQgc3RvcmUgaXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXhiT2JqZWN0CisgICAgICogICAgICBUaGUgSmF2YSBvYmplY3QgdG8gYmUgbWFyc2hhbGxlZCBpbnRvIFhNTC4gSWYgdGhpcyBvYmplY3QgaXMKKyAgICAgKiAgICAgIGEge0BsaW5rIEpBWEJFbGVtZW50fSwgaXQgd2lsbCBwcm92aWRlIHRoZSByb290IHRhZyBuYW1lIGFuZAorICAgICAqICAgICAgdGhlIGJvZHkuIElmIHRoaXMgb2JqZWN0IGhhcyB7QGxpbmsgWG1sUm9vdEVsZW1lbnR9CisgICAgICogICAgICBvbiBpdHMgY2xhc3MgZGVmaW5pdGlvbiwgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3QgdGFnIG5hbWUKKyAgICAgKiAgICAgIGFuZCB0aGUgZ2l2ZW4gb2JqZWN0IHdpbGwgcHJvdmlkZSB0aGUgYm9keS4gT3RoZXJ3aXNlLAorICAgICAqICAgICAgdGhlIHJvb3QgdGFnIG5hbWUgaXMge0BsaW5rIEludHJvc3BlY3RvciNkZWNhcGl0YWxpemUoU3RyaW5nKSBpbmZlcmVkfSBmcm9tCisgICAgICogICAgICB7QGxpbmsgQ2xhc3MjZ2V0U2ltcGxlTmFtZSgpIHRoZSBzaG9ydCBjbGFzcyBuYW1lfS4KKyAgICAgKiAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sCisgICAgICogICAgICBUaGUgc3RyaW5nIGlzIGZpcnN0IGludGVycHJldGVkIGFzIGFuIGFic29sdXRlIDx0dD5VUkk8L3R0Pi4KKyAgICAgKiAgICAgIElmIGl0J3Mgbm90IHtAbGluayBVUkkjaXNBYnNvbHV0ZSgpIGEgdmFsaWQgYWJzb2x1dGUgVVJJfSwKKyAgICAgKiAgICAgIHRoZW4gaXQncyBpbnRlcnByZXRlZCBhcyBhIDx0dD5GaWxlPC90dD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRGF0YUJpbmRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIHRoZSBvcGVyYXRpb24gZmFpbHMsIHN1Y2ggYXMgZHVlIHRvIEkvTyBlcnJvciwgdW5iaW5kYWJsZSBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJzaGFsKCBPYmplY3QgamF4Yk9iamVjdCwgU3RyaW5nIHhtbCApIHsKKyAgICAgICAgX21hcnNoYWwoamF4Yk9iamVjdCx4bWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIEphdmEgb2JqZWN0IHRyZWUgdG8gWE1MIGFuZCBzdG9yZSBpdCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGpheGJPYmplY3QKKyAgICAgKiAgICAgIFRoZSBKYXZhIG9iamVjdCB0byBiZSBtYXJzaGFsbGVkIGludG8gWE1MLiBJZiB0aGlzIG9iamVjdCBpcworICAgICAqICAgICAgYSB7QGxpbmsgSkFYQkVsZW1lbnR9LCBpdCB3aWxsIHByb3ZpZGUgdGhlIHJvb3QgdGFnIG5hbWUgYW5kCisgICAgICogICAgICB0aGUgYm9keS4gSWYgdGhpcyBvYmplY3QgaGFzIHtAbGluayBYbWxSb290RWxlbWVudH0KKyAgICAgKiAgICAgIG9uIGl0cyBjbGFzcyBkZWZpbml0aW9uLCB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCB0YWcgbmFtZQorICAgICAqICAgICAgYW5kIHRoZSBnaXZlbiBvYmplY3Qgd2lsbCBwcm92aWRlIHRoZSBib2R5LiBPdGhlcndpc2UsCisgICAgICogICAgICB0aGUgcm9vdCB0YWcgbmFtZSBpcyB7QGxpbmsgSW50cm9zcGVjdG9yI2RlY2FwaXRhbGl6ZShTdHJpbmcpIGluZmVyZWR9IGZyb20KKyAgICAgKiAgICAgIHtAbGluayBDbGFzcyNnZXRTaW1wbGVOYW1lKCkgdGhlIHNob3J0IGNsYXNzIG5hbWV9LgorICAgICAqICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWwKKyAgICAgKiAgICAgIFRoZSBYTUwgd2lsbCBiZSBzZW50IHRvIHRoZSBnaXZlbiB7QGxpbmsgT3V0cHV0U3RyZWFtfS4KKyAgICAgKiAgICAgIFVwb24gYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24sIHRoZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIERhdGFCaW5kaW5nRXhjZXB0aW9uCisgICAgICogICAgICBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzLCBzdWNoIGFzIGR1ZSB0byBJL08gZXJyb3IsIHVuYmluZGFibGUgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFyc2hhbCggT2JqZWN0IGpheGJPYmplY3QsIE91dHB1dFN0cmVhbSB4bWwgKSB7CisgICAgICAgIF9tYXJzaGFsKGpheGJPYmplY3QseG1sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBKYXZhIG9iamVjdCB0cmVlIHRvIFhNTCBhbmQgc3RvcmUgaXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXhiT2JqZWN0CisgICAgICogICAgICBUaGUgSmF2YSBvYmplY3QgdG8gYmUgbWFyc2hhbGxlZCBpbnRvIFhNTC4gSWYgdGhpcyBvYmplY3QgaXMKKyAgICAgKiAgICAgIGEge0BsaW5rIEpBWEJFbGVtZW50fSwgaXQgd2lsbCBwcm92aWRlIHRoZSByb290IHRhZyBuYW1lIGFuZAorICAgICAqICAgICAgdGhlIGJvZHkuIElmIHRoaXMgb2JqZWN0IGhhcyB7QGxpbmsgWG1sUm9vdEVsZW1lbnR9CisgICAgICogICAgICBvbiBpdHMgY2xhc3MgZGVmaW5pdGlvbiwgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3QgdGFnIG5hbWUKKyAgICAgKiAgICAgIGFuZCB0aGUgZ2l2ZW4gb2JqZWN0IHdpbGwgcHJvdmlkZSB0aGUgYm9keS4gT3RoZXJ3aXNlLAorICAgICAqICAgICAgdGhlIHJvb3QgdGFnIG5hbWUgaXMge0BsaW5rIEludHJvc3BlY3RvciNkZWNhcGl0YWxpemUoU3RyaW5nKSBpbmZlcmVkfSBmcm9tCisgICAgICogICAgICB7QGxpbmsgQ2xhc3MjZ2V0U2ltcGxlTmFtZSgpIHRoZSBzaG9ydCBjbGFzcyBuYW1lfS4KKyAgICAgKiAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sCisgICAgICogICAgICBUaGUgWE1MIHdpbGwgYmUgc2VudCBhcyBhIGNoYXJhY3RlciBzdHJlYW0gdG8gdGhlIGdpdmVuIHtAbGluayBXcml0ZXJ9LgorICAgICAqICAgICAgVXBvbiBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgdGhlIHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRGF0YUJpbmRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIHRoZSBvcGVyYXRpb24gZmFpbHMsIHN1Y2ggYXMgZHVlIHRvIEkvTyBlcnJvciwgdW5iaW5kYWJsZSBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJzaGFsKCBPYmplY3QgamF4Yk9iamVjdCwgV3JpdGVyIHhtbCApIHsKKyAgICAgICAgX21hcnNoYWwoamF4Yk9iamVjdCx4bWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIEphdmEgb2JqZWN0IHRyZWUgdG8gWE1MIGFuZCBzdG9yZSBpdCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGpheGJPYmplY3QKKyAgICAgKiAgICAgIFRoZSBKYXZhIG9iamVjdCB0byBiZSBtYXJzaGFsbGVkIGludG8gWE1MLiBJZiB0aGlzIG9iamVjdCBpcworICAgICAqICAgICAgYSB7QGxpbmsgSkFYQkVsZW1lbnR9LCBpdCB3aWxsIHByb3ZpZGUgdGhlIHJvb3QgdGFnIG5hbWUgYW5kCisgICAgICogICAgICB0aGUgYm9keS4gSWYgdGhpcyBvYmplY3QgaGFzIHtAbGluayBYbWxSb290RWxlbWVudH0KKyAgICAgKiAgICAgIG9uIGl0cyBjbGFzcyBkZWZpbml0aW9uLCB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCB0YWcgbmFtZQorICAgICAqICAgICAgYW5kIHRoZSBnaXZlbiBvYmplY3Qgd2lsbCBwcm92aWRlIHRoZSBib2R5LiBPdGhlcndpc2UsCisgICAgICogICAgICB0aGUgcm9vdCB0YWcgbmFtZSBpcyB7QGxpbmsgSW50cm9zcGVjdG9yI2RlY2FwaXRhbGl6ZShTdHJpbmcpIGluZmVyZWR9IGZyb20KKyAgICAgKiAgICAgIHtAbGluayBDbGFzcyNnZXRTaW1wbGVOYW1lKCkgdGhlIHNob3J0IGNsYXNzIG5hbWV9LgorICAgICAqICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWwKKyAgICAgKiAgICAgIFRoZSBYTUwgd2lsbCBiZSBzZW50IHRvIHRoZSB7QGxpbmsgUmVzdWx0fSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIERhdGFCaW5kaW5nRXhjZXB0aW9uCisgICAgICogICAgICBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzLCBzdWNoIGFzIGR1ZSB0byBJL08gZXJyb3IsIHVuYmluZGFibGUgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFyc2hhbCggT2JqZWN0IGpheGJPYmplY3QsIFJlc3VsdCB4bWwgKSB7CisgICAgICAgIF9tYXJzaGFsKGpheGJPYmplY3QseG1sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBKYXZhIG9iamVjdCB0cmVlIHRvIFhNTCBhbmQgc3RvcmUgaXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY29tYmluZXMgc2V2ZXJhbCBiYXNpYyBvcGVyYXRpb25zCisgICAgICogaW4gdGhlIHtAbGluayBKQVhCQ29udGV4dH0gYW5kIHtAbGluayBNYXJzaGFsbGVyfS4gVGhpcyBtZXRob2QgaXMgZGVzaWduZWQKKyAgICAgKiB0byBiZSB0aGUgcHJlZmVyZWQgbWV0aG9kIGZvciBkZXZlbG9wZXJzIG5ldyB0byBKQVhCLiBUaGlzIG1ldGhvZAorICAgICAqIGhhcyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnN0aWNzOgorICAgICAqCisgICAgICogPG9sPgorICAgICAqICA8bGk+R2VuZXJhbGx5IHNwZWFraW5nLCB0aGUgcGVyZm9ybWFuY2UgaXMgbm90IG5lY2Vzc2FyaWx5IG9wdGltYWwuCisgICAgICogICAgICBJdCBpcyBleHBlY3RlZCB0aGF0IHRob3NlIHBlb3BsZSB3aG8gbmVlZCB0byB3cml0ZSBwZXJmb3JtYW5jZQorICAgICAqICAgICAgY3JpdGljYWwgY29kZSB3aWxsIHVzZSB0aGUgcmVzdCBvZiB0aGUgSkFYQiBBUEkgZGlyZWN0bHkuCisgICAgICogIDxsaT5FcnJvcnMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBwcm9jZXNzaW5nIGlzIHdyYXBwZWQgaW50bworICAgICAqICAgICAge0BsaW5rIERhdGFCaW5kaW5nRXhjZXB0aW9ufSAod2hpY2ggd2lsbCBoYXZlIHtAbGluayBKQVhCRXhjZXB0aW9ufQorICAgICAqICAgICAgYXMgaXRzIHtAbGluayBUaHJvd2FibGUjZ2V0Q2F1c2UoKSBjYXVzZX0uIEl0IGlzIGV4cGVjdGVkIHRoYXQKKyAgICAgKiAgICAgIHRob3NlIHBlb3BsZSB3aG8gcHJlZmVyIHRoZSBjaGVja2VkIGV4Y2VwdGlvbiB3b3VsZCB1c2UKKyAgICAgKiAgICAgIHRoZSByZXN0IG9mIHRoZSBKQVhCIEFQSSBkaXJlY3RseS4KKyAgICAgKiA8L29sPgorICAgICAqCisgICAgICogQHBhcmFtIGpheGJPYmplY3QKKyAgICAgKiAgICAgIFRoZSBKYXZhIG9iamVjdCB0byBiZSBtYXJzaGFsbGVkIGludG8gWE1MLiBJZiB0aGlzIG9iamVjdCBpcworICAgICAqICAgICAgYSB7QGxpbmsgSkFYQkVsZW1lbnR9LCBpdCB3aWxsIHByb3ZpZGUgdGhlIHJvb3QgdGFnIG5hbWUgYW5kCisgICAgICogICAgICB0aGUgYm9keS4gSWYgdGhpcyBvYmplY3QgaGFzIHtAbGluayBYbWxSb290RWxlbWVudH0KKyAgICAgKiAgICAgIG9uIGl0cyBjbGFzcyBkZWZpbml0aW9uLCB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCB0YWcgbmFtZQorICAgICAqICAgICAgYW5kIHRoZSBnaXZlbiBvYmplY3Qgd2lsbCBwcm92aWRlIHRoZSBib2R5LiBPdGhlcndpc2UsCisgICAgICogICAgICB0aGUgcm9vdCB0YWcgbmFtZSBpcyB7QGxpbmsgSW50cm9zcGVjdG9yI2RlY2FwaXRhbGl6ZShTdHJpbmcpIGluZmVyZWR9IGZyb20KKyAgICAgKiAgICAgIHtAbGluayBDbGFzcyNnZXRTaW1wbGVOYW1lKCkgdGhlIHNob3J0IGNsYXNzIG5hbWV9LgorICAgICAqICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWwKKyAgICAgKiAgICAgIFJlcHJlc2VudHMgdGhlIHJlY2VpdmVyIG9mIFhNTC4gT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIGFyZSBhbGxvd2VkLgorICAgICAqCisgICAgICogICAgICA8dGFibGU+PHRyPgorICAgICAqICAgICAgICAgIDx0aD5UeXBlPC90aD4KKyAgICAgKiAgICAgICAgICA8dGg+T3BlcmF0aW9uPC90aD4KKyAgICAgKiAgICAgIDwvdHI+PHRyPgorICAgICAqICAgICAgICAgIDx0ZD57QGxpbmsgRmlsZX08L3RkPgorICAgICAqICAgICAgICAgIDx0ZD5YTUwgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZS4gSWYgaXQgYWxyZWFkeSBleGlzdHMsCisgICAgICogICAgICAgICAgICAgIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uPC90ZD4KKyAgICAgKiAgICAgIDwvdHI+PHRyPgorICAgICAqICAgICAgICAgIDx0ZD57QGxpbmsgVVJMfTwvdGQ+CisgICAgICogICAgICAgICAgPHRkPlRoZSBYTUwgd2lsbCBiZSB7QGxpbmsgVVJMQ29ubmVjdGlvbiNnZXRPdXRwdXRTdHJlYW0oKSBzZW50fSB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICAgcmVzb3VyY2UgcG9pbnRlZCBieSB0aGlzIFVSTC4gTm90ZSB0aGF0IG5vdCBhbGwgPHR0PlVSTDwvdHQ+cyBzdXBwb3J0CisgICAgICogICAgICAgICAgICAgIHN1Y2ggb3BlcmF0aW9uLCBhbmQgZXhhY3Qgc2VtYW50aWNzIGRlcGVuZHMgb24gdGhlIDx0dD5VUkw8L3R0PgorICAgICAqICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMuIEluIGNhc2Ugb2Yge0BsaW5rIEh0dHBVUkxDb25uZWN0aW9uIEhUVFAgVVJMc30sCisgICAgICogICAgICAgICAgICAgIHRoaXMgd2lsbCBwZXJmb3JtIEhUVFAgUE9TVC48L3RkPgorICAgICAqICAgICAgPC90cj48dHI+CisgICAgICogICAgICAgICAgPHRkPntAbGluayBVUkl9PC90ZD4KKyAgICAgKiAgICAgICAgICA8dGQ+VGhlIFVSSSBpcyB7QGxpbmsgVVJJI3RvVVJMKCkgdHVybmVkIGludG8gVVJMfSBhbmQgdGhlbgorICAgICAqICAgICAgICAgICAgICBmb2xsb3dzIHRoZSBoYW5kbGluZyBvZiA8dHQ+VVJMPC90dD4uIFNlZSBhYm92ZS48L3RkPgorICAgICAqICAgICAgPC90cj48dHI+CisgICAgICogICAgICAgICAgPHRkPntAbGluayBTdHJpbmd9PC90ZD4KKyAgICAgKiAgICAgICAgICA8dGQ+VGhlIHN0cmluZyBpcyBmaXJzdCBpbnRlcnByZXRlZCBhcyBhbiBhYnNvbHV0ZSA8dHQ+VVJJPC90dD4uCisgICAgICogICAgICAgICAgICAgIElmIGl0J3Mgbm90IHtAbGluayBVUkkjaXNBYnNvbHV0ZSgpIGEgdmFsaWQgYWJzb2x1dGUgVVJJfSwKKyAgICAgKiAgICAgICAgICAgICAgdGhlbiBpdCdzIGludGVycHJldGVkIGFzIGEgPHR0PkZpbGU8L3R0PjwvdGQ+CisgICAgICogICAgICA8L3RyPjx0cj4KKyAgICAgKiAgICAgICAgICA8dGQ+e0BsaW5rIE91dHB1dFN0cmVhbX08L3RkPgorICAgICAqICAgICAgICAgIDx0ZD5UaGUgWE1MIHdpbGwgYmUgc2VudCB0byB0aGUgZ2l2ZW4ge0BsaW5rIE91dHB1dFN0cmVhbX0uCisgICAgICogICAgICAgICAgICAgIFVwb24gYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24sIHRoZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYnkgdGhpcyBtZXRob2QuPC90ZD4KKyAgICAgKiAgICAgIDwvdHI+PHRyPgorICAgICAqICAgICAgICAgIDx0ZD57QGxpbmsgV3JpdGVyfTwvdGQ+CisgICAgICogICAgICAgICAgPHRkPlRoZSBYTUwgd2lsbCBiZSBzZW50IGFzIGEgY2hhcmFjdGVyIHN0cmVhbSB0byB0aGUgZ2l2ZW4ge0BsaW5rIFdyaXRlcn0uCisgICAgICogICAgICAgICAgICAgIFVwb24gYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24sIHRoZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYnkgdGhpcyBtZXRob2QuPC90ZD4KKyAgICAgKiAgICAgIDwvdHI+PHRyPgorICAgICAqICAgICAgICAgIDx0ZD57QGxpbmsgUmVzdWx0fTwvdGQ+CisgICAgICogICAgICAgICAgPHRkPlRoZSBYTUwgd2lsbCBiZSBzZW50IHRvIHRoZSB7QGxpbmsgUmVzdWx0fSBvYmplY3QuPC90ZD4KKyAgICAgKiAgICAgIDwvdHI+PC90YWJsZT4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRGF0YUJpbmRpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIHRoZSBvcGVyYXRpb24gZmFpbHMsIHN1Y2ggYXMgZHVlIHRvIEkvTyBlcnJvciwgdW5iaW5kYWJsZSBjbGFzc2VzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgX21hcnNoYWwoIE9iamVjdCBqYXhiT2JqZWN0LCBPYmplY3QgeG1sICkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dDsKKworICAgICAgICAgICAgaWYoamF4Yk9iamVjdCBpbnN0YW5jZW9mIEpBWEJFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKChKQVhCRWxlbWVudDw/PilqYXhiT2JqZWN0KS5nZXREZWNsYXJlZFR5cGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gamF4Yk9iamVjdC5nZXRDbGFzcygpOworICAgICAgICAgICAgICAgIFhtbFJvb3RFbGVtZW50IHIgPSBjbGF6ei5nZXRBbm5vdGF0aW9uKFhtbFJvb3RFbGVtZW50LmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dChjbGF6eik7CisgICAgICAgICAgICAgICAgaWYocj09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGluZmVyIHRoZSBuYW1lCisgICAgICAgICAgICAgICAgICAgIGpheGJPYmplY3QgPSBuZXcgSkFYQkVsZW1lbnQobmV3IFFOYW1lKGluZmVyTmFtZShjbGF6eikpLGNsYXp6LGpheGJPYmplY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWFyc2hhbGxlciBtID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgICAgICAgICBtLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GT1JNQVRURURfT1VUUFVULHRydWUpOworICAgICAgICAgICAgbS5tYXJzaGFsKGpheGJPYmplY3QsIHRvUmVzdWx0KHhtbCkpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhQmluZGluZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFCaW5kaW5nRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGluZmVyTmFtZShDbGFzcyBjbGF6eikgeworICAgICAgICByZXR1cm4gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShjbGF6ei5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMge0BsaW5rIFJlc3VsdH0gZnJvbSB2YXJpb3VzIFhNTCByZXByZXNlbnRhdGlvbi4KKyAgICAgKiBTZWUge0BsaW5rICNfbWFyc2hhbChPYmplY3QsT2JqZWN0KX0gZm9yIHRoZSBjb252ZXJzaW9uIHJ1bGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFJlc3VsdCB0b1Jlc3VsdChPYmplY3QgeG1sKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZih4bWw9PW51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBYTUwgaXMgZ2l2ZW4iKTsKKworICAgICAgICBpZiAoeG1sIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHhtbD1uZXcgVVJJKChTdHJpbmcpeG1sKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgeG1sPW5ldyBGaWxlKChTdHJpbmcpeG1sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoeG1sIGluc3RhbmNlb2YgRmlsZSkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpIHhtbDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtUmVzdWx0KGZpbGUpOworICAgICAgICB9CisgICAgICAgIGlmICh4bWwgaW5zdGFuY2VvZiBVUkkpIHsKKyAgICAgICAgICAgIFVSSSB1cmkgPSAoVVJJKSB4bWw7CisgICAgICAgICAgICB4bWw9dXJpLnRvVVJMKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhtbCBpbnN0YW5jZW9mIFVSTCkgeworICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIHhtbDsKKyAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICBjb24uc2V0RG9JbnB1dChmYWxzZSk7CisgICAgICAgICAgICBjb24uY29ubmVjdCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1SZXN1bHQoY29uLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeG1sIGluc3RhbmNlb2YgT3V0cHV0U3RyZWFtKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSAoT3V0cHV0U3RyZWFtKSB4bWw7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVJlc3VsdChvcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhtbCBpbnN0YW5jZW9mIFdyaXRlcikgeworICAgICAgICAgICAgV3JpdGVyIHcgPSAoV3JpdGVyKXhtbDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtUmVzdWx0KHcpOworICAgICAgICB9CisgICAgICAgIGlmICh4bWwgaW5zdGFuY2VvZiBSZXN1bHQpIHsKKyAgICAgICAgICAgIHJldHVybiAoUmVzdWx0KSB4bWw7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSSBkb24ndCB1bmRlcnN0YW5kIGhvdyB0byBoYW5kbGUgIit4bWwuZ2V0Q2xhc3MoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9KQVhCQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvSkFYQkNvbnRleHQuamF2YQppbmRleCBjZTJiYTMwLi5iNTU2YzNiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9KQVhCQ29udGV4dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0pBWEJDb250ZXh0LmphdmEKQEAgLTIxNyw2ICsyMTcsNyBAQAogICogPC9ibG9ja3F1b3RlPgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+Sm9lIEZpYWxsaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yMyAkICREYXRlOiAyMDA1LzA4LzMxIDIwOjU3OjU3ICQKICAqIEBzZWUgTWFyc2hhbGxlcgogICogQHNlZSBVbm1hcnNoYWxsZXIKICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscyI+UyA3LjQuMS4xICJQYWNrYWdlIEFubm90YXRpb25zIiBpbiBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDNyZCBFZGl0aW9uPC9hPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvSkFYQkVsZW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0pBWEJFbGVtZW50LmphdmEKaW5kZXggYzhkYjc4OC4uNWM5MTViMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvSkFYQkVsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9KQVhCRWxlbWVudC5qYXZhCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgKiA8cD5TZXQgdGhlIGNvbnRlbnQgbW9kZWwgYW5kIGF0dHJpYnV0ZXMgb2YgdGhpcyB4bWwgZWxlbWVudC48L3A+CiAgICAgICoKICAgICAgKiA8cD5XaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIDx0dD5udWxsPC90dD4sIDx0dD5pc05pbCgpPC90dD4gbXVzdCBieSA8dHQ+dHJ1ZTwvdHQ+LgotICAgICAqICAgIERldGFpbHMgb2YgY29uc3RyYWludCBhcmUgZGVzY3JpYmVkIGF0IHtAbGluayAjaXNOaWwoKX0uPC9wPgorICAgICAqICAgIERldGFpbHMgb2YgY29uc3RyYWludCBhcmUgZGVzY3JpYmVkIGF0IHtAbGluayAjaXNOaWwoKX0uPC9wcD4KICAgICAgKgogICAgICAqIEBzZWUgI2lzVHlwZVN1YnN0aXR1dGVkKCkKICAgICAgKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0pBWEJFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL0pBWEJFeGNlcHRpb24uamF2YQppbmRleCA1NWFhNTg3Li5hZjI3NWU2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9KQVhCRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvSkFYQkV4Y2VwdGlvbi5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAgKiBUaGlzIGlzIHRoZSByb290IGV4Y2VwdGlvbiBjbGFzcyBmb3IgYWxsIEpBWEIgZXhjZXB0aW9ucy4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA0LzEwLzIyIDE1OjQ2OjAyICQKICAqIEBzZWUgSkFYQkNvbnRleHQKICAqIEBzZWUgTWFyc2hhbGxlcgogICogQHNlZSBVbm1hcnNoYWxsZXIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL01hcnNoYWxFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL01hcnNoYWxFeGNlcHRpb24uamF2YQppbmRleCBmMzEwMWNlLi5mMGM2YWNmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9NYXJzaGFsRXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvTWFyc2hhbEV4Y2VwdGlvbi5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiAgKiBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZUV2ZW50KFZhbGlkYXRpb25FdmVudCl9LgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqIEBzZWUgSkFYQkV4Y2VwdGlvbgogICogQHNlZSBNYXJzaGFsbGVyCiAgKiBAc2luY2UgSkFYQjEuMApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvTWFyc2hhbGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvTWFyc2hhbGxlci5qYXZhCmluZGV4IDIyZjlhN2UuLjAyZGZlOGQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL01hcnNoYWxsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9NYXJzaGFsbGVyLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEFkYXB0ZXI7CiBpbXBvcnQgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50TWFyc2hhbGxlcjsKIGltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWE7CitpbXBvcnQgamF2YS5pby5GaWxlOwogCiAvKioKICAqIDxwPgpAQCAtMjg4LDEwICsyODksMTAgQEAKICAqIDxibG9ja3F1b3RlPgogICogPHByZT4KICAqICAgLy8gSW52b2tlZCBieSBNYXJzaGFsbGVyIGFmdGVyIGl0IGhhcyBjcmVhdGVkIGFuIGluc3RhbmNlIG9mIHRoaXMgb2JqZWN0LgotICogICBib29sZWFuIGJlZm9yZU1hcnNoYWwoTWFyc2hhbGxlciwgT2JqZWN0IHBhcmVudCk7CisgKiAgIGJvb2xlYW4gYmVmb3JlTWFyc2hhbChNYXJzaGFsbGVyKTsKICAqCiAgKiAgIC8vIEludm9rZWQgYnkgTWFyc2hhbGxlciBhZnRlciBpdCBoYXMgbWFyc2hhbGxlZCBhbGwgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC4KLSAqICAgdm9pZCBhZnRlck1tYXJzaGFsKE1hcnNoYWxsZXIsIE9iamVjdCBwYXJlbnQpOworICogICB2b2lkIGFmdGVyTW1hcnNoYWwoTWFyc2hhbGxlcik7CiAgKiA8L3ByZT4KICAqIDwvYmxvY2txdW90ZT4KICAqIFRoZSBjbGFzcyBkZWZpbmVkIGV2ZW50IGNhbGxiYWNrIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHJlcXVpcmVzCkBAIC0zMDksNiArMzEwLDcgQEAKICAqIDwvYmxvY2txdW90ZT4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+S29oc3VrZSBLYXdhZ3VjaGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPkpvZSBGaWFsbGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAogICogQHNlZSBKQVhCQ29udGV4dAogICogQHNlZSBWYWxpZGF0b3IKICAqIEBzZWUgVW5tYXJzaGFsbGVyCkBAIC00MDUsNiArNDA3LDI5IEBACiAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uOwogCiAgICAgLyoqCisgICAgICogTWFyc2hhbCB0aGUgY29udGVudCB0cmVlIHJvb3RlZCBhdCA8dHQ+amF4YkVsZW1lbnQ8L3R0PiBpbnRvIGEgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXhiRWxlbWVudAorICAgICAqICAgICAgVGhlIHJvb3Qgb2YgY29udGVudCB0cmVlIHRvIGJlIG1hcnNoYWxsZWQuCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgRmlsZSB0byBiZSB3cml0dGVuLiBJZiB0aGlzIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIGFueSB1bmV4cGVjdGVkIHByb2JsZW0gb2NjdXJzIGR1cmluZyB0aGUgbWFyc2hhbGxpbmcuCisgICAgICogQHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCisgICAgICogICAgICBJZiB0aGUge0BsaW5rIFZhbGlkYXRpb25FdmVudEhhbmRsZXIgVmFsaWRhdGlvbkV2ZW50SGFuZGxlcn0KKyAgICAgKiAgICAgIHJldHVybnMgZmFsc2UgZnJvbSBpdHMgPHR0PmhhbmRsZUV2ZW50PC90dD4gbWV0aG9kIG9yIHRoZQorICAgICAqICAgICAgPHR0Pk1hcnNoYWxsZXI8L3R0PiBpcyB1bmFibGUgdG8gbWFyc2hhbCA8dHQ+b2JqPC90dD4gKG9yIGFueQorICAgICAqICAgICAgb2JqZWN0IHJlYWNoYWJsZSBmcm9tIDx0dD5vYmo8L3R0PikuICBTZWUgPGEgaHJlZj0iI2VsZW1lbnRNYXJzaGFsbGluZyI+CisgICAgICogICAgICBNYXJzaGFsbGluZyBhIEpBWEIgZWxlbWVudDwvYT4uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgIElmIGFueSBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgYXJlIG51bGwKKyAgICAgKiBAc2luY2UgSkFYQjIuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoIE9iamVjdCBqYXhiRWxlbWVudCwgRmlsZSBvdXRwdXQgKQorICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsKKworICAgIC8qKgogICAgICAqIE1hcnNoYWwgdGhlIGNvbnRlbnQgdHJlZSByb290ZWQgYXQgPHR0PmpheGJFbGVtZW50PC90dD4gaW50byBhIFdyaXRlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBqYXhiRWxlbWVudApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvTWVzc2FnZXMucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggMzc5N2NmZC4uNmZiMjliZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBDb250ZXh0RmluZGVyLlByb3ZpZGVyTm90Rm91bmQgPSBcCiAJUHJvdmlkZXIgezB9IG5vdCBmb3VuZAogCQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvTm90SWRlbnRpZmlhYmxlRXZlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL05vdElkZW50aWZpYWJsZUV2ZW50LmphdmEKaW5kZXggMzg1Y2E1MS4uNjZlZDJiYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvTm90SWRlbnRpZmlhYmxlRXZlbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9Ob3RJZGVudGlmaWFibGVFdmVudC5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiAgKgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+Sm9lIEZpYWxsaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqIEBzZWUgVmFsaWRhdG9yCiAgKiBAc2VlIFZhbGlkYXRpb25FdmVudEhhbmRsZXIKICAqIEBzaW5jZSBKQVhCMS4wCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9QYXJzZUNvbnZlcnNpb25FdmVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvUGFyc2VDb252ZXJzaW9uRXZlbnQuamF2YQppbmRleCAwOTUxNTJmLi5iYmRkYTk0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9QYXJzZUNvbnZlcnNpb25FdmVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1BhcnNlQ29udmVyc2lvbkV2ZW50LmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKICAqIHN0cmluZyBmcm9tIHRoZSBYTUwgZGF0YSBpbnRvIGEgdmFsdWUgb2YgdGhlIHRhcmdldCBKYXZhIGRhdGEgdHlwZS4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5Lb2hzdWtlIEthd2FndWNoaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPkpvZSBGaWFsbGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKiBAc2VlIFZhbGlkYXRpb25FdmVudAogICogQHNlZSBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyCiAgKiBAc2VlIFVubWFyc2hhbGxlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvUHJpbnRDb252ZXJzaW9uRXZlbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1ByaW50Q29udmVyc2lvbkV2ZW50LmphdmEKaW5kZXggNjBjN2RmZS4uMWM2ZjllYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvUHJpbnRDb252ZXJzaW9uRXZlbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9QcmludENvbnZlcnNpb25FdmVudC5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiAgKiBmcm9tIHRoZSBKYXZhIGNvbnRlbnQgdHJlZSBpbnRvIGl0cyBsZXhpY2FsIHJlcHJlc2VudGF0aW9uLgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+Sm9lIEZpYWxsaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqIEBzZWUgVmFsaWRhdGlvbkV2ZW50CiAgKiBAc2VlIFZhbGlkYXRpb25FdmVudEhhbmRsZXIKICAqIEBzZWUgTWFyc2hhbGxlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvUHJvcGVydHlFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1Byb3BlcnR5RXhjZXB0aW9uLmphdmEKaW5kZXggNWM1NDhiNy4uM2Y1ZjczNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvUHJvcGVydHlFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9Qcm9wZXJ0eUV4Y2VwdGlvbi5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAgKiBzZXR0aW5nIGEgcHJvcGVydHkuCiAgKgogICogQGF1dGhvciA8dWw+PGxpPlJ5YW4gU2hvZW1ha2VyLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+S29oc3VrZSBLYXdhZ3VjaGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5Kb2UgRmlhbGxpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48L3VsPgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAwNC8wNi8xNCAyMToyMzowNCAkCiAgKiBAc2VlIEpBWEJDb250ZXh0CiAgKiBAc2VlIFZhbGlkYXRvcgogICogQHNlZSBVbm1hcnNoYWxsZXIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1NjaGVtYU91dHB1dFJlc29sdmVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9TY2hlbWFPdXRwdXRSZXNvbHZlci5qYXZhCmluZGV4IGU4NjU4OWMuLmM1MWJlMGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1NjaGVtYU91dHB1dFJlc29sdmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvU2NoZW1hT3V0cHV0UmVzb2x2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgamF2YXgueG1sLmJpbmQ7CiAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1R5cGVDb25zdHJhaW50RXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9UeXBlQ29uc3RyYWludEV4Y2VwdGlvbi5qYXZhCmluZGV4IGM0ZDE5MTcuLjY3NjU3NzggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1R5cGVDb25zdHJhaW50RXhjZXB0aW9uLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVHlwZUNvbnN0cmFpbnRFeGNlcHRpb24uamF2YQpAQCAtNDEsNiArNDEsNyBAQAogICogY2FsbGVkLgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPkpvZSBGaWFsbGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKiBAc2VlIFZhbGlkYXRpb25FdmVudAogICogQHNpbmNlIEpBWEIxLjAKICAqLwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVW5tYXJzaGFsRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9Vbm1hcnNoYWxFeGNlcHRpb24uamF2YQppbmRleCBjNzNlYzVjLi5iZGQ5NDQ0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9Vbm1hcnNoYWxFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9Vbm1hcnNoYWxFeGNlcHRpb24uamF2YQpAQCAtMzcsNiArMzcsNyBAQAogICogVmFsaWRhdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudChWYWxpZGF0aW9uRXZlbnQpfS4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKiBAc2VlIEpBWEJFeGNlcHRpb24KICAqIEBzZWUgVW5tYXJzaGFsbGVyCiAgKiBAc2VlIFZhbGlkYXRpb25FdmVudEhhbmRsZXIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1VubWFyc2hhbGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVW5tYXJzaGFsbGVyLmphdmEKaW5kZXggMmU2MzljYS4uZTEzMzkwZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVW5tYXJzaGFsbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVW5tYXJzaGFsbGVyLmphdmEKQEAgLTI3MSw3ICsyNzEsNyBAQAogICogICAgIDwvdHI+CiAgKiAgICAgPHRyPgogICogICAgICAgPHRkPnNjb3BlPC90ZD4KLSAqICAgICAgIDx0ZD48Y29kZT5udWxsPC9jb2RlPiA8aT4oYWN0dWFsIHNjb3BlIGlzIHVua25vd24pPC9pPjwvdGQ+CisgKiAgICAgICA8dGQ+PGNvZGU+bnVsbDwvY29kZT4gPGk+KGFjdHVhbCBzY29wZSBpcyB1bmtub3duKTwvdGQ+CiAgKiAgICAgPC90cj4KICAqICAgPC90Ym9keT4KICAqICA8L3RhYmxlPgpAQCAtNDAyLDYgKzQwMiw3IEBACiAgKiA8L2Jsb2NrcXVvdGU+CiAgKgogICogQGF1dGhvciA8dWw+PGxpPlJ5YW4gU2hvZW1ha2VyLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+S29oc3VrZSBLYXdhZ3VjaGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5Kb2UgRmlhbGxpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48L3VsPgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMxICQgJERhdGU6IDIwMDUvMDgvMTUgMjA6NTQ6NDIgJAogICogQHNlZSBKQVhCQ29udGV4dAogICogQHNlZSBNYXJzaGFsbGVyCiAgKiBAc2VlIFZhbGlkYXRvcgpAQCAtNzA4LDcgKzcwOSw3IEBACiAgICAgICogYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGNvbnRlbnQgdHJlZS4KICAgICAgKgogICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgPGEgaHJlZj0iI3VubWFyc2hhbEJ5RGVjbGFyZWRUeXBlIj51bm1hcnNoYWwgYnkgZGVjbGFyZWRUeXBlPC9hPi4KKyAgICAgKiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIDxhIGhyZWY9InVubWFyc2hhbEJ5RGVjbGFyZWRUeXBlIj51bm1hcnNoYWwgYnkgZGVjbGFyZWRUeXBlPC9hPi4KICAgICAgKiA8cD4KICAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIHBhcnNlciBpcyBvbiBhIFNUQVJUX0RPQ1VNRU5UIG9yCiAgICAgICogU1RBUlRfRUxFTUVOVCBldmVudC4gVW5tYXJzaGFsbGluZyB3aWxsIGJlIGRvbmUgZnJvbSB0aGlzCkBAIC03NzgsNyArNzc5LDcgQEAKICAgICAgKiBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgY29udGVudCB0cmVlLgogICAgICAqCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyA8YSBocmVmPSIjdW5tYXJzaGFsQnlEZWNsYXJlZFR5cGUiPnVubWFyc2hhbCBieSBkZWNsYXJlZFR5cGU8L2E+LgorICAgICAqIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgPGEgaHJlZj0idW5tYXJzaGFsQnlEZWNsYXJlZFR5cGUiPnVubWFyc2hhbCBieSBkZWNsYXJlZFR5cGU8L2E+LgogICAgICAqCiAgICAgICogPHA+CiAgICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBwYXJzZXIgaXMgb24gYSBTVEFSVF9ET0NVTUVOVCBvcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVW5tYXJzaGFsbGVySGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVW5tYXJzaGFsbGVySGFuZGxlci5qYXZhCmluZGV4IDQyMTkzYjMuLmI4YjkzMjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1VubWFyc2hhbGxlckhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9Vbm1hcnNoYWxsZXJIYW5kbGVyLmphdmEKQEAgLTU1LDYgKzU1LDcgQEAKICAqIGFuIG9iamVjdCwgcy9oZSBjYW4gc3RpbGwgc3RhcnQgYSBuZXcgcm91bmQgb2YgdW5tYXJzaGFsbGluZy4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+S29oc3VrZSBLQVdBR1VDSEksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA0LzEyLzE0IDIxOjUwOjQxICQKICAqIEBzZWUgVW5tYXJzaGFsbGVyI2dldFVubWFyc2hhbGxlckhhbmRsZXIoKQogICogQHNpbmNlIEpBWEIxLjAKICAqLwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVmFsaWRhdGlvbkV2ZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0aW9uRXZlbnQuamF2YQppbmRleCA3OTRlYmZiLi4zZGQ0NWM4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0aW9uRXZlbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0aW9uRXZlbnQuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogICogSmF2YSBjb250ZW50IHRyZWUgYmFjayB0byBYTUwgZGF0YS4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5Lb2hzdWtlIEthd2FndWNoaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPkpvZSBGaWFsbGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKiBAc2VlIFZhbGlkYXRvcgogICogQHNlZSBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyCiAgKiBAc2luY2UgSkFYQjEuMApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVmFsaWRhdGlvbkV2ZW50SGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVmFsaWRhdGlvbkV2ZW50SGFuZGxlci5qYXZhCmluZGV4IGFkMTg0ZTAuLjdjNzgzNTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1ZhbGlkYXRpb25FdmVudEhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0aW9uRXZlbnRIYW5kbGVyLmphdmEKQEAgLTYwLDYgKzYwLDcgQEAKICAqIDwvYmxvY2txdW90ZT4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5Lb2hzdWtlIEthd2FndWNoaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPkpvZSBGaWFsbGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKiBAc2VlIFVubWFyc2hhbGxlcgogICogQHNlZSBWYWxpZGF0b3IKICAqIEBzZWUgTWFyc2hhbGxlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVmFsaWRhdGlvbkV2ZW50TG9jYXRvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVmFsaWRhdGlvbkV2ZW50TG9jYXRvci5qYXZhCmluZGV4IGU5MzQ2NWEuLmI5MTYzMGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1ZhbGlkYXRpb25FdmVudExvY2F0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0aW9uRXZlbnRMb2NhdG9yLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKICAqIHNvdXJjZSBvZiB0aGUgWE1MIGRhdGEgKGZpbGUsIHVybCwgTm9kZSwgZXRjKS4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5Lb2hzdWtlIEthd2FndWNoaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPkpvZSBGaWFsbGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKiBAc2VlIFZhbGlkYXRvcgogICogQHNlZSBWYWxpZGF0aW9uRXZlbnQKICAqIEBzaW5jZSBKQVhCMS4wCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggMzFkOTMwOC4uMWRjZDRhNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL1ZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMzYsNiArMzYsNyBAQAogICogVmFsaWRhdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudChWYWxpZGF0aW9uRXZlbnQpfS4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKiBAc2VlIEpBWEJFeGNlcHRpb24KICAqIEBzZWUgVmFsaWRhdG9yCiAgKiBAc2luY2UgSkFYQjEuMApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvVmFsaWRhdG9yLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0b3IuamF2YQppbmRleCAwNmRkOGQwLi42N2RkN2VjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0b3IuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9WYWxpZGF0b3IuamF2YQpAQCAtMTQ5LDYgKzE0OSw3IEBACiAgKgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48bGk+Sm9lIEZpYWxsaSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDUvMDYvMDYgMTU6MDQ6MDMgJAogICogQHNlZSBKQVhCQ29udGV4dAogICogQHNlZSBVbm1hcnNoYWxsZXIKICAqIEBzZWUgVmFsaWRhdGlvbkV2ZW50SGFuZGxlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvV2hpdGVTcGFjZVByb2Nlc3Nvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvV2hpdGVTcGFjZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGE0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9XaGl0ZVNwYWNlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgamF2YXgueG1sLmJpbmQ7CisKKy8qKgorICogUHJvY2Vzc2VzIHdoaXRlIHNwYWNlIG5vcm1hbGl6YXRpb24uCisgKgorICogQHNpbmNlIDEuMAorICovCithYnN0cmFjdCBjbGFzcyBXaGl0ZVNwYWNlUHJvY2Vzc29yIHsKKworLy8gYmVuY2htYXJraW5nIChzZWUgdGVzdC9zcmMvUmVwbGFjZVRlc3QuamF2YSBpbiB0aGUgQ1ZTIEF0dGljKQorLy8gc2hvd2VkIHRoYXQgdGhpcyBjb2RlIGlzIHNsb3dlciB0aGFuIHRoZSBjdXJyZW50IGNvZGUuCisvLworLy8gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgdGV4dCkgeworLy8gICAgICAgIGZpbmFsIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworLy8gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7CisvLworLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKy8vICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOworLy8gICAgICAgICAgICBpZiAoaXNXaGl0ZVNwYWNlKGNoKSkKKy8vICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyAnKTsKKy8vICAgICAgICAgICAgZWxzZQorLy8gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisvLyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiByZXBsYWNlKCAoQ2hhclNlcXVlbmNlKXRleHQgKS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSByZXBsYWNlKENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIGludCBpPXRleHQubGVuZ3RoKCktMTsKKworICAgICAgICAvLyBsb29rIGZvciB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyLgorICAgICAgICB3aGlsZSggaT49MCAmJiAhaXNXaGl0ZVNwYWNlRXhjZXB0U3BhY2UodGV4dC5jaGFyQXQoaSkpICkKKyAgICAgICAgICAgIGktLTsKKworICAgICAgICBpZiggaTwwICkKKyAgICAgICAgICAgIC8vIG5vIHN1Y2ggd2hpdGVzcGFjZS4gcmVwbGFjZSh0ZXh0KT09dGV4dC4KKyAgICAgICAgICAgIHJldHVybiB0ZXh0OworCisgICAgICAgIC8vIHdlIG5vdyBrbm93IHRoYXQgd2UgbmVlZCB0byBtb2RpZnkgdGhlIHRleHQuCisgICAgICAgIC8vIGFsbG9jYXRlIGEgY2hhciBhcnJheSB0byBkbyBpdC4KKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcih0ZXh0KTsKKworICAgICAgICBidWYuc2V0Q2hhckF0KGktLSwnICcpOworICAgICAgICBmb3IoIDsgaT49MDsgaS0tICkKKyAgICAgICAgICAgIGlmKCBpc1doaXRlU3BhY2VFeGNlcHRTcGFjZShidWYuY2hhckF0KGkpKSkKKyAgICAgICAgICAgICAgICBidWYuc2V0Q2hhckF0KGksJyAnKTsKKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgb2Yge0BsaW5rIFN0cmluZyN0cmltKCl9LgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSB0cmltKENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICBpbnQgc3RhcnQgPSAwOworCisgICAgICAgIHdoaWxlKCBzdGFydDxsZW4gJiYgaXNXaGl0ZVNwYWNlKHRleHQuY2hhckF0KHN0YXJ0KSkgKQorICAgICAgICAgICAgc3RhcnQrKzsKKworICAgICAgICBpbnQgZW5kID0gbGVuLTE7CisKKyAgICAgICAgd2hpbGUoIGVuZD5zdGFydCAmJiBpc1doaXRlU3BhY2UodGV4dC5jaGFyQXQoZW5kKSkgKQorICAgICAgICAgICAgZW5kLS07CisKKyAgICAgICAgaWYoc3RhcnQ9PTAgJiYgZW5kPT1sZW4tMSkKKyAgICAgICAgICAgIHJldHVybiB0ZXh0OyAgICAvLyBubyBjaGFuZ2UKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHRleHQuc3ViU2VxdWVuY2Uoc3RhcnQsZW5kKzEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbGxhcHNlKFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiBjb2xsYXBzZSggKENoYXJTZXF1ZW5jZSl0ZXh0ICkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIGJpZ2dlc3QgcHJvY2Vzc2luZyBib3R0bGVuZWNrLgorICAgICAqCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGNvbGxhcHNlKENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworCisgICAgICAgIC8vIG1vc3Qgb2YgdGhlIHRleHRzIGFyZSBhbHJlYWR5IGluIHRoZSBjb2xsYXBzZWQgZm9ybS4KKyAgICAgICAgLy8gc28gbG9vayBmb3IgdGhlIGZpcnN0IHdoaXRlc3BhY2UgaW4gdGhlIGhvcGUgdGhhdCB3ZSB3aWxsCisgICAgICAgIC8vIG5ldmVyIHNlZSBpdC4KKyAgICAgICAgaW50IHM9MDsKKyAgICAgICAgd2hpbGUoczxsZW4pIHsKKyAgICAgICAgICAgIGlmKGlzV2hpdGVTcGFjZSh0ZXh0LmNoYXJBdChzKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYocz09bGVuKQorICAgICAgICAgICAgLy8gdGhlIGlucHV0IGhhcHBlbnMgdG8gYmUgYWxyZWFkeSBjb2xsYXBzZWQuCisgICAgICAgICAgICByZXR1cm4gdGV4dDsKKworICAgICAgICAvLyB3ZSBub3cga25vdyB0aGF0IHRoZSBpbnB1dCBjb250YWlucyBzcGFjZXMuCisgICAgICAgIC8vIGxldCdzIHNpdCBkb3duIGFuZCBkbyB0aGUgY29sbGFwc2luZyBub3JtYWxseS4KKworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiAvKmFsbG9jYXRlIGVub3VnaCBzaXplIHRvIGF2b2lkIHJlLWFsbG9jYXRpb24qLyApOworCisgICAgICAgIGlmKHMhPTApIHsKKyAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxzOyBpKysgKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodGV4dC5jaGFyQXQoaSkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpblN0cmlwTW9kZSA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSBzKzE7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOworICAgICAgICAgICAgYm9vbGVhbiBiID0gaXNXaGl0ZVNwYWNlKGNoKTsKKyAgICAgICAgICAgIGlmIChpblN0cmlwTW9kZSAmJiBiKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHRoaXMgY2hhcmFjdGVyCisKKyAgICAgICAgICAgIGluU3RyaXBNb2RlID0gYjsKKyAgICAgICAgICAgIGlmIChpblN0cmlwTW9kZSkKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZXMKKyAgICAgICAgbGVuID0gcmVzdWx0Lmxlbmd0aCgpOworICAgICAgICBpZiAobGVuID4gMCAmJiByZXN1bHQuY2hhckF0KGxlbiAtIDEpID09ICcgJykKKyAgICAgICAgICAgIHJlc3VsdC5zZXRMZW5ndGgobGVuIC0gMSk7CisgICAgICAgIC8vIHdoaXRlc3BhY2VzIGFyZSBhbHJlYWR5IGNvbGxhcHNlZCwKKyAgICAgICAgLy8gc28gYWxsIHdlIGhhdmUgdG8gZG8gaXMgdG8gcmVtb3ZlIHRoZSBsYXN0IG9uZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8gaWYgaXQncyBhIHdoaXRlc3BhY2UuCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYWxsIHdoaXRlc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV2hpdGVTcGFjZShDaGFyU2VxdWVuY2UgcykgeworICAgICAgICBmb3IoIGludCBpPXMubGVuZ3RoKCktMTsgaT49MDsgaS0tICkKKyAgICAgICAgICAgIGlmKCFpc1doaXRlU3BhY2Uocy5jaGFyQXQoaSkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXIgaXMgYSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXIuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV2hpdGVTcGFjZShjaGFyIGNoKSB7CisgICAgICAgIC8vIG1vc3Qgb2YgdGhlIGNoYXJhY3RlcnMgYXJlIG5vbi1jb250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIC8vIHNvIGNoZWNrIHRoYXQgZmlyc3QgdG8gcXVpY2tseSByZXR1cm4gZmFsc2UgZm9yIG1vc3Qgb2YgdGhlIGNhc2VzLgorICAgICAgICBpZiggY2g+MHgyMCApICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIG90aGVyIHRoYW4gd2UgaGF2ZSB0byBkbyBmb3VyIGNvbXBhcmlzb25zLgorICAgICAgICByZXR1cm4gY2ggPT0gMHg5IHx8IGNoID09IDB4QSB8fCBjaCA9PSAweEQgfHwgY2ggPT0gMHgyMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyIGlzIGEgd2hpdGUgc3BhY2UgY2hhcmFjdGVyCisgICAgICogYnV0IG5vdCAweDIwLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1doaXRlU3BhY2VFeGNlcHRTcGFjZShjaGFyIGNoKSB7CisgICAgICAgIC8vIG1vc3Qgb2YgdGhlIGNoYXJhY3RlcnMgYXJlIG5vbi1jb250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIC8vIHNvIGNoZWNrIHRoYXQgZmlyc3QgdG8gcXVpY2tseSByZXR1cm4gZmFsc2UgZm9yIG1vc3Qgb2YgdGhlIGNhc2VzLgorICAgICAgICBpZiggY2g+PTB4MjAgKSAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBvdGhlciB0aGFuIHdlIGhhdmUgdG8gZG8gZm91ciBjb21wYXJpc29ucy4KKyAgICAgICAgcmV0dXJuIGNoID09IDB4OSB8fCBjaCA9PSAweEEgfHwgY2ggPT0gMHhEOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sQWNjZXNzT3JkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sQWNjZXNzT3JkZXIuamF2YQppbmRleCA4OGVlYTYxLi5jYTU3YjBkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEFjY2Vzc09yZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxBY2Nlc3NPcmRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMxLDYgKzMxLDcgQEAKICAqCiAgKiBAYXV0aG9yIFNla2hhciBWYWpqaGFsYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogQHNpbmNlIEpBWEIyLjAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqIEBzZWUgWG1sQWNjZXNzb3JPcmRlcgogICovCiAKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sQWNjZXNzVHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxBY2Nlc3NUeXBlLmphdmEKaW5kZXggZDg4Y2NjZi4uNWE0Y2VjZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxBY2Nlc3NUeXBlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxBY2Nlc3NUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzMsNiArMzMsNyBAQAogICoKICAqIEBhdXRob3IgU2VraGFyIFZhampoYWxhLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAgKiBAc2luY2UgSkFYQjIuMAorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEwICQKICAqIEBzZWUgWG1sQWNjZXNzb3JUeXBlCiAgKi8KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxBY2Nlc3Nvck9yZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEFjY2Vzc29yT3JkZXIuamF2YQppbmRleCBhYTY3ZDNiLi42N2YwYzExIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEFjY2Vzc29yT3JkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEFjY2Vzc29yT3JkZXIuamF2YQpAQCAtMzYsNyArMzYsNyBAQAogLyoqCiAgKiA8cD4gQ29udHJvbHMgdGhlIG9yZGVyaW5nIG9mIGZpZWxkcyBhbmQgcHJvcGVydGllcyBpbiBhIGNsYXNzLiA8L3A+CiAgKgotICogPHA+IDxiPiBVc2FnZSA8L2I+IDwvcD4KKyAqIDxoMz5Vc2FnZSA8L2gzPgogICoKICAqIDxwPiA8dHQ+IEBYbWxBY2Nlc3Nvck9yZGVyIDwvdHQ+IGFubm90YXRpb24gY2FuIGJlIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nCiAgKiBwcm9ncmFtIGVsZW1lbnRzOjwvcD4KQEAgLTQ2LDMzICs0NiwyMyBAQAogICogICA8bGk+IGEgdG9wIGxldmVsIGNsYXNzIDwvbGk+CiAgKiA8L3VsPgogICoKLSAqIDxwPiBTZWUgIlBhY2thZ2UgU3BlY2lmaWNhdGlvbiIgaW4gamF2YXgueG1sLmJpbmQucGFja2FnZSBqYXZhZG9jIGZvcgorICogPHA+IFNlZSAiUGFja2FnZSBTcGVjaWZpY2F0aW9uIiBpbiA8dHQ+amF2YXgueG1sLmJpbmQ8L3R0PiBwYWNrYWdlIGphdmFkb2MgZm9yCiAgKiBhZGRpdGlvbmFsIGNvbW1vbiBpbmZvcm1hdGlvbi48L3A+CiAgKgotICogPHA+VGhlIGFubm90YXRpb24gPHR0PiBAWG1sQWNjZXNzb3JPcmRlciA8L3R0PiBvbiBhIHBhY2thZ2UgYXBwbGllcyB0bwotICogYWxsIGNsYXNzZXMgaW4gYSBwYWNrYWdlLiBUaGUgZm9sbG93aW5nIGluaGVyaXRhbmNlIHNlbWFudGljcyBhcHBseToKKyAqIDxwPlRoZSBlZmZlY3RpdmUge0BsaW5rIFhtbEFjY2Vzc09yZGVyfSBvbiBhIGNsYXNzIGlzIGRldGVybWluZWQKKyAqIGFzIGZvbGxvd3M6CiAgKgogICogPHVsPgogICogICA8bGk+IElmIHRoZXJlIGlzIGEgPHR0PkBYbWxBY2Nlc3Nvck9yZGVyPC90dD4gb24gYSBjbGFzcywgdGhlbgogICogICAgICAgIGl0IGlzIHVzZWQuIDwvbGk+CiAgKiAgIDxsaT4gT3RoZXJ3aXNlLCBpZiBhIDx0dD5AWG1sQWNjZXNzb3JPcmRlciA8L3R0PiBleGlzdHMgb24gb25lIG9mCi0gKiAgICAgICAgaXRzIHN1cGVyIGNsYXNzZXMsIHRoZW4gaXQgaXMgaW5oZXJpdGVkLgotICogICA8bGk+IE90aGVyd2lzZSwgdGhlIDx0dD5AWG1sQWNjZXNzb3JPcmRlciA8L3R0PiBvbiBhIHBhY2thZ2UgaXMKLSAqICAgICAgICBpbmhlcml0ZWQuCisgKiAgICAgICAgaXRzIHN1cGVyIGNsYXNzZXMsIHRoZW4gaXQgaXMgaW5oZXJpdGVkIChieSB0aGUgdmlydHVlIG9mCisgKiAgICAgICAge0BsaW5rIEluaGVyaXRlZH0pCisgKiAgIDxsaT4gT3RoZXJ3aXNlLCB0aGUgPHR0PkBYbWxBY2Nlc3Nvck9yZGVyPC90dD4gb24gdGhlIHBhY2thZ2UKKyAqICAgICAgICBvZiB0aGUgY2xhc3MgaXMgdXNlZCwgaWYgaXQncyB0aGVyZS4KKyAqICAgPGxpPiBPdGhlcndpc2Uge0BsaW5rIFhtbEFjY2Vzc09yZGVyI1VOREVGSU5FRH0uCiAgKiA8L3VsPgotICogPHA+IDxiPiBEZWZhdWx0aW5nIFJ1bGVzOiA8L2I+IDwvcD4KICAqCi0gKiA8cD5CeSBkZWZhdWx0LCBpZiA8dHQ+QFhtbEFjY2Vzc29yT3JkZXIgPC90dD4gb24gYSBwYWNrYWdlIGlzIGFic2VudCwKLSAqIHRoZW4gdGhlIGZvbGxvd2luZyBwYWNrYWdlIGxldmVsIGFubm90YXRpb24gaXMgYXNzdW1lZC48L3A+Ci0gKjxwcmU+Ci0gKiAgICAmIzY0O1htbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQpCi0gKjwvcHJlPgotICogPHA+IEJ5IGRlZmF1bHQsIGlmIDx0dD5AWG1sQWNjZXNzb3JPcmRlcjwvdHQ+IG9uIGEgY2xhc3MgaXMgYWJzZW50Ci0gKiBhbmQgbm9uZSBvZiBzdXBlciBjbGFzc2VzIGlzIGFubm90YXRlZCB3aXRoIDx0dD4gWG1sQWNjZXNzb3JPcmRlcgotICogPC90dD4sIHRoZW4gdGhlIGZvbGxvd2luZyBkZWZhdWx0IG9uIHRoZSBjbGFzcyBpcyBhc3N1bWVkOiA8L3A+Ci0gKjxwcmU+Ci0gKiAgICAmIzY0O1htbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQpCi0gKjwvcHJlPgogICogPHA+VGhpcyBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIHdpdGggdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9uczoKICAqICAgIHtAbGluayBYbWxUeXBlfSwge0BsaW5rIFhtbFJvb3RFbGVtZW50fSwge0BsaW5rIFhtbEFjY2Vzc29yVHlwZX0sCiAgKiAgICB7QGxpbmsgWG1sU2NoZW1hfSwge0BsaW5rIFhtbFNjaGVtYVR5cGV9LCB7QGxpbmsgWG1sU2NoZW1hVHlwZXN9LApAQCAtODEsNiArNzEsNyBAQAogICoKICAqIEBhdXRob3IgU2VraGFyIFZhampoYWxhLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAgKiBAc2luY2UgSkFYQjIuMAorICogQHZlcnNpb24gICRSZXZpc2lvbjogMS4xMSAkCiAgKiBAc2VlIFhtbEFjY2Vzc09yZGVyCiAgKi8KIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxBY2Nlc3NvclR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sQWNjZXNzb3JUeXBlLmphdmEKaW5kZXggYTE0ZDJjOC4uYmMyYmJkYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxBY2Nlc3NvclR5cGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEFjY2Vzc29yVHlwZS5qYXZhCkBAIC04Niw2ICs4Niw3IEBACiAgKiBAYXV0aG9yIFNla2hhciBWYWpqaGFsYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogQHNpbmNlIEpBWEIyLjAKICAqIEBzZWUgWG1sQWNjZXNzVHlwZQorICogQHZlcnNpb24gICRSZXZpc2lvbjogMS44ICQKICAqLwogCiBASW5oZXJpdGVkIEBSZXRlbnRpb24oUlVOVElNRSkgQFRhcmdldCh7UEFDS0FHRSwgVFlQRX0pCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEF0dHJpYnV0ZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxBdHRyaWJ1dGUuamF2YQppbmRleCAyYTAzYzExLi5kYWY4ZTVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEF0dHJpYnV0ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sQXR0cmlidXRlLmphdmEKQEAgLTEyMSw2ICsxMjEsNyBAQAogICoKICAqIDwvcHJlPgogICogQGF1dGhvciBTZWtoYXIgVmFqamhhbGEsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMyAkCiAgKiBAc2VlIFhtbFR5cGUKICAqIEBzaW5jZSBKQVhCMi4wCiAgKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxFbGVtZW50LmphdmEKaW5kZXggNjFlMmY2Yi4uMzlmZmJkNiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxFbGVtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxFbGVtZW50LmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKICAqCiAgKiA8cD4gPGI+VXNhZ2U8L2I+IDwvcD4KICAqIDxwPgotICogPHR0PkBYbWxFbGVtZW50PC90dD4gYW5ub3RhdGlvbiBjYW4gYmUgdXNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbQorICogPC90dD5AWG1sRWxlbWVudDwvdHQ+IGFubm90YXRpb24gY2FuIGJlIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb2dyYW0KICAqIGVsZW1lbnRzOgogICogPHVsPgogICogICA8bGk+IGEgSmF2YUJlYW4gcHJvcGVydHkgPC9saT4KQEAgLTEzNCw2ICsxMzQsNyBAQAogICogPHA+CiAgKiBAYXV0aG9yIFNla2hhciBWYWpqaGFsYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogQHNpbmNlIEpBWEIyLjAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xOCAkCiAgKi8KIAogQFJldGVudGlvbihSVU5USU1FKSBAVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sRWxlbWVudFJlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxFbGVtZW50UmVmLmphdmEKaW5kZXggMTlhODA3Yy4uY2FkM2M2YSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxFbGVtZW50UmVmLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxFbGVtZW50UmVmLmphdmEKQEAgLTk0LDcgKzk0LDcgQEAKICAqIDxwPlNlZSAiUGFja2FnZSBTcGVjaWZpY2F0aW9uIiBpbiBqYXZheC54bWwuYmluZC5wYWNrYWdlIGphdmFkb2MgZm9yCiAgKiBhZGRpdGlvbmFsIGNvbW1vbiBpbmZvcm1hdGlvbi48L3A+CiAgKgotICogPHA+PGI+RXhhbXBsZSAxOiBBbnQgVGFzayBFeGFtcGxlPC9iPjwvcD4KKyAqIDxwPjxiPkV4YW1wbGUgMTogPC9iPkFudCBUYXNrIEV4YW1wbGU8L2I+PC9wPgogICogVGhlIGZvbGxvd2luZyBKYXZhIGNsYXNzIGhpZXJhcmNoeSBtb2RlbHMgYW4gQW50IGJ1aWxkCiAgKiBzY3JpcHQuICBBbiBBbnQgdGFzayBjb3JyZXNwb25kcyB0byBhIGNsYXNzIGluIHRoZSBjbGFzcwogICogaGllcmFyY2h5LiBUaGUgWE1MIGVsZW1lbnQgbmFtZSBvZiBhbiBBbnQgdGFzayBpcyBpbmRpY2F0ZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEVsZW1lbnRXcmFwcGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbEVsZW1lbnRXcmFwcGVyLmphdmEKaW5kZXggOTE2M2YwNi4uYmNhZTEyYiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxFbGVtZW50V3JhcHBlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sRWxlbWVudFdyYXBwZXIuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLwotCiBwYWNrYWdlIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247CiAKIGltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKQEAgLTEyNCw0ICsxMjMsMjIgQEAKICAgICAgKiB0aGUgYWJzZW5jZSBvZiB0aGUgZWxlbWVudC4KICAgICAgKi8KICAgICBib29sZWFuIG5pbGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEN1c3RvbWl6ZSB0aGUgd3JhcHBlciBlbGVtZW50IGRlY2xhcmF0aW9uIHRvIGJlIHJlcXVpcmVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSWYgcmVxdWlyZWQoKSBpcyB0cnVlLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGdlbmVyYXRlZAorICAgICAqIFhNTCBzY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbiB3aWxsIGhhdmUgPHR0Pm1pbk9jY3Vycz0iMSI8L3R0PiwKKyAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3cmFwcGVyIGVsZW1lbnQgaXMgYWx3YXlzIGV4cGVjdGVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoaXMgb25seSBhZmZlY3RzIHRoZSBzY2hlbWEgZ2VuZXJhdGlvbiwgYW5kCisgICAgICogbm90IHRoZSB1bm1hcnNoYWxsaW5nIG9yIG1hcnNoYWxsaW5nIGNhcGFiaWxpdHkuIFRoaXMgaXMKKyAgICAgKiBzaW1wbHkgYSBtZWNoYW5pc20gdG8gbGV0IHVzZXJzIGV4cHJlc3MgdGhlaXIgYXBwbGljYXRpb24gY29uc3RyYWludHMKKyAgICAgKiBiZXR0ZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgSkFYQiAyLjEKKyAgICAgKi8KKyAgICBib29sZWFuIHJlcXVpcmVkKCkgZGVmYXVsdCBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sSUQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sSUQuamF2YQppbmRleCAxNDhmODBjLi5mZGEzNjkxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbElELmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxJRC5qYXZhCkBAIC04OCw2ICs4OCw3IEBACiAgKiBAYXV0aG9yIFNla2hhciBWYWpqaGFsYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogQHNlZSBYbWxJRFJFRgogICogQHNpbmNlIEpBWEIyLjAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKICAqLwogCiBAUmV0ZW50aW9uKFJVTlRJTUUpIEBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxJRFJFRi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxJRFJFRi5qYXZhCmluZGV4IGRiNmY0ZTcuLmRmMGEzMWEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sSURSRUYuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbElEUkVGLmphdmEKQEAgLTI0NCw2ICsyNDQsNyBAQAogICogQGF1dGhvciBTZWtoYXIgVmFqamhhbGEsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KICAqIEBzZWUgWG1sSUQKICAqIEBzaW5jZSBKQVhCMi4wCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTEgJAogICovCiAKIEBSZXRlbnRpb24oUlVOVElNRSkgQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbExpc3QuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sTGlzdC5qYXZhCmluZGV4IDUzMzg3MzIuLmU5MjRiOGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sTGlzdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sTGlzdC5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbjsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sTnMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sTnMuamF2YQppbmRleCBmODE0Y2YyLi43ZmZmNjA3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbE5zLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxOcy5qYXZhCkBAIC00Myw2ICs0Myw3IEBACiAgKiA8cD48Yj5FeGFtcGxlOjwvYj5TZWUgPHR0PlhtbFNjaGVtYTwvdHQ+IGFubm90YXRpb24gdHlwZSBmb3IgYW4gZXhhbXBsZS4KICAqIEBhdXRob3IgU2VraGFyIFZhampoYWxhLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAgKiBAc2luY2UgSkFYQjIuMAorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICovCiAKIEBSZXRlbnRpb24oUlVOVElNRSkgQFRhcmdldCh7fSkKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sTnNGb3JtLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbE5zRm9ybS5qYXZhCmluZGV4IGY5MmZiYTQuLjNmMGIzNjEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sTnNGb3JtLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxOc0Zvcm0uamF2YQpAQCAtNDAsOCArNDAsOCBAQAogICogPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIzIj4KICAqICAgPHRib2R5PgogICogICAgIDx0cj4KLSAqICAgICAgIDx0ZD48Yj5FbnVtIFZhbHVlPC9iPjwvdGQ+Ci0gKiAgICAgICA8dGQ+PGI+WE1MIFNjaGVtYSBWYWx1ZTwvYj48L3RkPgorICogICAgICAgPHRkPjxiPkVudW0gVmFsdWU8Yj48L3RkPgorICogICAgICAgPHRkPjxiPlhNTCBTY2hlbWEgVmFsdWU8Yj48L3RkPgogICogICAgIDwvdHI+CiAgKgogICogICAgIDx0ciB2YWxpZ249InRvcCI+CkBAIC02Miw1ICs2Miw2IEBACiAgKgogICogQGF1dGhvciBTZWtoYXIgVmFqamhhbGEsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KICAqIEBzaW5jZSBKQVhCMi4wCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCiAgKi8KIHB1YmxpYyBlbnVtIFhtbE5zRm9ybSB7VU5RVUFMSUZJRUQsIFFVQUxJRklFRCwgVU5TRVR9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbFNjaGVtYS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxTY2hlbWEuamF2YQppbmRleCBhNmE5NTgwLi45MmI1Mzg2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbFNjaGVtYS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sU2NoZW1hLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKIC8qKgogICogPHA+IE1hcHMgYSBwYWNrYWdlIG5hbWUgdG8gYSBYTUwgbmFtZXNwYWNlLiA8L3A+CiAgKgotICogPHA+PGI+VXNhZ2U8L2I+IDwvcD4KKyAqIDxoMz5Vc2FnZTwvaDM+CiAgKiA8cD4KICAqIFRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbiBjYW4gYmUgdXNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbQogICogZWxlbWVudHM6CkBAIC00Miw2ICs0Miw3IEBACiAgKiAgIDxsaT5wYWNrYWdlPC9saT4KICAqIDwvdWw+CiAgKgorICogPHA+CiAgKiBUaGlzIGlzIGEgcGFja2FnZSBsZXZlbCBhbm5vdGF0aW9uIGFuZCBmb2xsb3dzIHRoZSByZWNvbW1lbmRhdGlvbnMKICAqIGFuZCByZXN0cmljdGlvbnMgY29udGFpbmVkIGluIEpTUiAxNzUsIHNlY3Rpb24gSUlJLCAiQW5ub3RhdGlvbnMiLgogICogVGh1cyB0aGUgdXNhZ2UgaXMgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFuZApAQCAtMTE0LDkgKzExNSwxMCBAQAogCiAgKiBAYXV0aG9yIFNla2hhciBWYWpqaGFsYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogQHNpbmNlIEpBWEIyLjAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICAqLwogCi1AUmV0ZW50aW9uKFJVTlRJTUUpIEBUYXJnZXQoe1BBQ0tBR0V9KQorQFJldGVudGlvbihSVU5USU1FKSBAVGFyZ2V0KFBBQ0tBR0UpCiBwdWJsaWMgQGludGVyZmFjZSBYbWxTY2hlbWEgewogCiAgICAgLyoqCkBAIC0xNDIsNCArMTQ0LDY0IEBACiAgICAgICogYXR0cmlidXRlc0Zvcm1EZWZhdWx0IHdpbGwgYmUgYWJzZW50IGZyb20gdGhlIFhNTCBTY2hlbWEgZnJhZ21lbnQuCiAgICAgICovCiAgICAgWG1sTnNGb3JtIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgZGVmYXVsdCBYbWxOc0Zvcm0uVU5TRVQ7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIG5hbWVzcGFjZSAoc3BlY2lmaWVkIGJ5IHtAbGluayAjbmFtZXNwYWNlKCl9KQorICAgICAqIGhhcyBhIHNjaGVtYSBhbHJlYWR5IGF2YWlsYWJsZSBleGV0ZXJuYWxseSwgYXZhaWxhYmxlIGF0IHRoaXMgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGluc3RydWN0cyB0aGUgSkFYQiBzY2hlbWEgZ2VuZXJhdG9ycyB0byBzaW1wbHkgcmVmZXIgdG8KKyAgICAgKiB0aGUgcG9pbnRlZCBzY2hlbWEsIGFzIG9wcG9zZWQgdG8gZ2VuZXJhdGluZyBjb21wb25lbnRzIGludG8gdGhlIHNjaGVtYS4KKyAgICAgKiBUaGlzIHNjaGVtYSBpcyBhc3N1bWVkIHRvIG1hdGNoIHdoYXQgd291bGQgYmUgb3RoZXJ3aXNlIHByb2R1Y2VkCisgICAgICogYnkgdGhlIHNjaGVtYSBnZW5lcmF0b3IgKHNhbWUgZWxlbWVudCBuYW1lcywgc2FtZSB0eXBlIG5hbWVzLi4uKQorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBmZWF0dXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiBhIHNldCBvZiB0aGUgSmF2YSBjbGFzc2VzCisgICAgICogaXMgb3JpZ2luYWxseSBnZW5lcmF0ZWQgZnJvbSBhbiBleGlzdGluZyBzY2hlbWEsIGhhbmQtd3JpdHRlbiB0bworICAgICAqIG1hdGNoIGV4dGVybmFsbHkgZGVmaW5lZCBzY2hlbWEsIG9yIHRoZSBnZW5lcmF0ZWQgc2NoZW1hIGlzIG1vZGlmaWVkCisgICAgICogbWFudWFsbHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBWYWx1ZSBjb3VsZCBiZSBhbnkgYWJzb2x1dGUgVVJJLCBsaWtlIDx0dD5odHRwOi8vZXhhbXBsZS5vcmcvc29tZS54c2Q8L3R0Pi4KKyAgICAgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgdGhlIGVtcHR5IHN0cmluZywgdG8gaW5kaWNhdGUKKyAgICAgKiB0aGF0IHRoZSBzY2hlbWEgaXMgZXh0ZXJuYWxseSBhdmFpbGFibGUgYnV0IHRoZSBsb2NhdGlvbiBpcworICAgICAqIHVuc3BlY2lmaWVkIChhbmQgdGh1cyBpdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcmVhZGVyIG9mIHRoZSBnZW5lcmF0ZQorICAgICAqIHNjaGVtYSB0byBsb2NhdGUgaXQuKSBGaW5hbGx5LCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5CisgICAgICogPHR0PiIjI2dlbmVyYXRlIjwvdHQ+IGluZGljYXRlcyB0aGF0IHRoZSBzY2hlbWEgZ2VuZXJhdG9yIGlzIGdvaW5nCisgICAgICogdG8gZ2VuZXJhdGUgY29tcG9uZW50cyBmb3IgdGhpcyBuYW1lc3BhY2UgKGFzIGl0IGRpZCBpbiBKQVhCIDIuMC4pCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBNdWx0aXBsZSB7QGxpbmsgWG1sU2NoZW1hfSBhbm5vdGF0aW9ucyBvbiBtdWx0aXBsZSBwYWNrYWdlcyBhcmUgYWxsb3dlZAorICAgICAqIHRvIGdvdmVybiB0aGUgc2FtZSB7QGxpbmsgI25hbWVzcGFjZSgpfS4gSW4gc3VjaCBjYXNlLCBhbGwgb2YgdGhlbQorICAgICAqIG11c3QgaGF2ZSB0aGUgc2FtZSB7QGxpbmsgI2xvY2F0aW9uKCl9IHZhbHVlcy4KKyAgICAgKgorICAgICAqCisgICAgICogPGgzPk5vdGUgdG8gaW1wbGVtZW50b3I8L2gzPgorICAgICAqIDxwPgorICAgICAqIE1vcmUgcHJlY2lzZWx5LCB0aGUgdmFsdWUgbXVzdCBiZSBlaXRoZXIgPHR0PiIiPC90dD4sIDx0dD4iIyNnZW5lcmF0ZSI8L3R0Piwgb3IKKyAgICAgKiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYW55VVJJIj4KKyAgICAgKiBhIHZhbGlkIGxleGljYWwgcmVwcmVzZW50YXRpb24gb2YgPHR0PnhzOmFueVVSSTwvdHQ+PC9hPiB0aGF0IGJlZ2lucworICAgICAqIHdpdGggPHR0PiZsdDtzY2hlbWU+OjwvdHQ+LgorICAgICAqCisgICAgICogPHA+CisgICAgICogQSBzY2hlbWEgZ2VuZXJhdG9yIGlzIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGEgY29ycmVzcG9uZGluZworICAgICAqIDx0dD4mbHQ7eHM6aW1wb3J0IG5hbWVzcGFjZT0iLi4uIiBzY2hlbWFMb2NhdGlvbj0iLi4uIi8+PC90dD4gKG9yCisgICAgICogbm8gPHR0PnNjaGVtYUxvY2F0aW9uPC90dD4gYXR0cmlidXRlIGF0IGFsbCBpZiB0aGUgZW1wdHkgc3RyaW5nIGlzIHNwZWNpZmllZC4pCisgICAgICogSG93ZXZlciwgdGhlIHNjaGVtYSBnZW5lcmF0b3IgaXMgYWxsb3dlZCB0byB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgaW4KKyAgICAgKiB0aGUgPHR0PnNjaGVtYUxvY2F0aW9uPC90dD4gYXR0cmlidXRlIChpbmNsdWRpbmcgbm90IGdlbmVyYXRpbmcKKyAgICAgKiBzdWNoIGF0dHJpYnV0ZSksIGZvciBleGFtcGxlIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBsb2NhbAorICAgICAqIGNvcHkgb2YgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAc2luY2UgSkFYQjIuMQorICAgICAqLworICAgIFN0cmluZyBsb2NhdGlvbigpIGRlZmF1bHQgTk9fTE9DQVRJT047CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUge0BsaW5rICNsb2NhdGlvbigpfSBhdHRyaWJ1dGUsCisgICAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHNjaGVtYSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZQorICAgICAqIGNvbXBvbmVudHMgaW4gdGhpcyBuYW1lc3BhY2UuCisgICAgICovCisgICAgLy8gdGhlIGFjdHVhbCB2YWx1ZSBpcyBjaG9zZW4gYmVjYXVzZSAjIyBpcyBub3QgYSB2YWxpZAorICAgIC8vIHNlcXVlbmNlIGluIHhzOmFueVVSSS4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0xPQ0FUSU9OID0gIiMjZ2VuZXJhdGUiOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxTZWVBbHNvLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbFNlZUFsc28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWZlNTFlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxTZWVBbHNvLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogSW5zdHJ1Y3RzIEpBWEIgdG8gYWxzbyBiaW5kIG90aGVyIGNsYXNzZXMgd2hlbiBiaW5kaW5nIHRoaXMgY2xhc3MuCisgKgorICogPHA+CisgKiBKYXZhIG1ha2VzIGl0IGltcHJhY3RpY2FsL2ltcG9zc2libGUgdG8gbGlzdCBhbGwgc3ViLWNsYXNzZXMgb2YKKyAqIGEgZ2l2ZW4gY2xhc3MuIFRoaXMgb2Z0ZW4gZ2V0cyBpbiBhIHdheSBvZiBKQVhCIHVzZXJzLCBhcyBpdCBKQVhCCisgKiBjYW5ub3QgYXV0b21hdGljYWxseSBsaXN0IHVwIHRoZSBjbGFzc2VzIHRoYXQgbmVlZCB0byBiZSBrbm93bgorICogdG8ge0BsaW5rIEpBWEJDb250ZXh0fS4KKyAqCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCB3aXRoIHRoZSBmb2xsb3dpbmcgY2xhc3MgZGVmaW5pdGlvbnM6CisgKgorICogPHByZT4KKyAqIGNsYXNzIEFuaW1hbCB7fQorICogY2xhc3MgRG9nIGV4dGVuZHMgQW5pbWFsIHt9CisgKiBjbGFzcyBDYXQgZXh0ZW5kcyBBbmltYWwge30KKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogVGhlIHVzZXIgd291bGQgYmUgcmVxdWlyZWQgdG8gY3JlYXRlIHtAbGluayBKQVhCQ29udGV4dH0gYXMKKyAqIDx0dD5KQVhCQ29udGV4dC5uZXdJbnN0YW5jZShEb2cuY2xhc3MsQ2F0LmNsYXNzKTwvdHQ+CisgKiAoPHR0PkFuaW1hbDwvdHQ+IHdpbGwgYmUgYXV0b21hdGljYWxseSBwaWNrZWQgdXAgc2luY2UgPHR0PkRvZzwvdHQ+CisgKiBhbmQgPHR0PkNhdDwvdHQ+IHJlZmVycyB0byBpdC4pCisgKgorICogPHA+CisgKiB7QGxpbmsgWG1sU2VlQWxzb30gYW5ub3RhdGlvbiB3b3VsZCBhbGxvdyB5b3UgdG8gd3JpdGU6CisgKiA8cHJlPgorICogJiM2NDtYbWxTZWVBbHNvKHtEb2cuY2xhc3MsQ2F0LmNsYXNzfSkKKyAqIGNsYXNzIEFuaW1hbCB7fQorICogY2xhc3MgRG9nIGV4dGVuZHMgQW5pbWFsIHt9CisgKiBjbGFzcyBDYXQgZXh0ZW5kcyBBbmltYWwge30KKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogVGhpcyB3b3VsZCBhbGxvdyB5b3UgdG8gZG8gPHR0PkpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKEFuaW1hbC5jbGFzcyk8L3R0Pi4KKyAqIEJ5IHRoZSBoZWxwIG9mIHRoaXMgYW5ub3RhdGlvbiwgSkFYQiBpbXBsZW1lbnRhdGlvbnMgd2lsbCBiZSBhYmxlIHRvCisgKiBjb3JyZWN0bHkgYmluZCA8dHQ+RG9nPC90dD4gYW5kIDx0dD5DYXQ8L3R0Pi4KKyAqCisgKiBAYXV0aG9yIEtvaHN1a2UgS2F3YWd1Y2hpCisgKiBAc2luY2UgSkFYQjIuMQorICogQHZlcnNpb24gJFJldmlzaW9uOiAkCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEV9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgWG1sU2VlQWxzbyB7CisgICAgQ2xhc3NbXSB2YWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxUcmFuc2llbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sVHJhbnNpZW50LmphdmEKaW5kZXggYzk3YmYwZS4uNWNjMjM4ZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxUcmFuc2llbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbFRyYW5zaWVudC5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAKIC8qKgogICogPHA+Ci0gKiBQcmV2ZW50cyB0aGUgbWFwcGluZyBvZiBhIEphdmFCZWFuIHByb3BlcnR5IHRvIFhNTCByZXByZXNlbnRhdGlvbi4KKyAqIFByZXZlbnRzIHRoZSBtYXBwaW5nIG9mIGEgSmF2YUJlYW4gcHJvcGVydHkvdHlwZSB0byBYTUwgcmVwcmVzZW50YXRpb24uCiAgKiA8cD4KICAqIFRoZSA8dHQ+QFhtbFRyYW5zaWVudDwvdHQ+IGFubm90YXRpb24gaXMgdXNlZnVsIGZvciByZXNvbHZpbmcgbmFtZQogICogY29sbGlzaW9ucyBiZXR3ZWVuIGEgSmF2YUJlYW4gcHJvcGVydHkgbmFtZSBhbmQgYSBmaWVsZCBuYW1lIG9yCkBAIC00MiwxMiArNDIsMTkgQEAKICAqIHRoZW4gdGhlIG5hbWUgY29sbGlzaW9uIGNhbiBiZSByZXNvbHZlZCBieSBwcmV2ZW50aW5nIHRoZQogICogbWFwcGluZyBvZiBlaXRoZXIgdGhlIGZpZWxkIG9yIHRoZSBKYXZhQmVhbiBwcm9wZXJ0eSB1c2luZyB0aGUKICAqIDx0dD5AWG1sVHJhbnNpZW50PC90dD4gYW5ub3RhdGlvbi4KKyAqCisgKiA8cD4KKyAqIFdoZW4gcGxhY2VkIG9uIGEgY2xhc3MsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBjbGFzcyBzaG91bGRuJ3QgYmUgbWFwcGVkCisgKiB0byBYTUwgYnkgaXRzZWxmLiBQcm9wZXJ0aWVzIG9uIHN1Y2ggY2xhc3Mgd2lsbCBiZSBtYXBwZWQgdG8gWE1MIGFsb25nCisgKiB3aXRoIGl0cyBkZXJpdmVkIGNsYXNzZXMsIGFzIGlmIHRoZSBjbGFzcyBpcyBpbmxpbmVkLgorICoKICAqIDxwPjxiPlVzYWdlPC9iPjwvcD4KICAqIDxwPiBUaGUgPHR0PkBYbWxUcmFuc2llbnQ8L3R0PiBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIHdpdGggdGhlIGZvbGxvd2luZwogICogICAgIHByb2dyYW0gZWxlbWVudHM6CiAgKiA8dWw+CiAgKiAgIDxsaT4gYSBKYXZhQmVhbiBwcm9wZXJ0eSA8L2xpPgogICogICA8bGk+IGZpZWxkIDwvbGk+CisgKiAgIDxsaT4gY2xhc3MgPC9saT4KICAqIDwvdWw+CiAgKgogICogPHA+PHR0PkBYbWxUcmFuc2llbnQ8L3R0PmlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGFsbCBvdGhlcgpAQCAtODIsNyArODksOCBAQAogICoKICAqIEBhdXRob3IgU2VraGFyIFZhampoYWxhLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAgKiBAc2luY2UgSkFYQjIuMAorICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCiAKLUBSZXRlbnRpb24oUlVOVElNRSkgQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpIEBUYXJnZXQoe0ZJRUxELCBNRVRIT0QsIFRZUEV9KQogcHVibGljIEBpbnRlcmZhY2UgWG1sVHJhbnNpZW50IHt9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbFR5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sVHlwZS5qYXZhCmluZGV4IGIwNzZmM2UuLjFlMzVhZTUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sVHlwZS5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAKICAqICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIzIj4KICAqICAgICA8dGJvZHk+CiAgKiAgICAgICA8dHI+Ci0gKiAgICAgICAgIDx0ZD48Yj5UYXJnZXQ8L2I+PC90ZD4KKyAqICAgICAgICAgPHRkPjxiPlRhcmdldDwvdGQ+CiAgKiAgICAgICAgIDx0ZD48Yj5wcm9wT3JkZXI8L2I+PC90ZD4KICAqICAgICAgICAgPHRkPjxiPkNsYXNzQm9keTwvYj48L3RkPgogICogICAgICAgICA8dGQ+PGI+Q29tcGxleFR5cGU8L2I+PC90ZD4KQEAgLTM4MCw2ICszODAsNyBAQAogICogQHNlZSBYbWxWYWx1ZQogICogQHNlZSBYbWxTY2hlbWEKICAqIEBzaW5jZSBKQVhCMi4wCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTkgJAogICovCiAKIEBSZXRlbnRpb24oUlVOVElNRSkgQFRhcmdldCh7VFlQRX0pCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbFZhbHVlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbFZhbHVlLmphdmEKaW5kZXggOWRiY2Q1Mi4uNDQxNjBkZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxWYWx1ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sVmFsdWUuamF2YQpAQCAtMTI1LDYgKzEyNSw3IEBACiAgKiBAYXV0aG9yIFNla2hhciBWYWpqaGFsYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogQHNlZSBYbWxUeXBlCiAgKiBAc2luY2UgSkFYQjIuMAorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAogICovCiAKIEBSZXRlbnRpb24oUlVOVElNRSkgQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL2FkYXB0ZXJzL0hleEJpbmFyeUFkYXB0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvSGV4QmluYXJ5QWRhcHRlci5qYXZhCmluZGV4IDgzZGY1NzcuLjg1Y2UxYzcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvSGV4QmluYXJ5QWRhcHRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvSGV4QmluYXJ5QWRhcHRlci5qYXZhCkBAIC0zOCwxMCArMzgsMTIgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEhleEJpbmFyeUFkYXB0ZXIgZXh0ZW5kcyBYbWxBZGFwdGVyPFN0cmluZyxieXRlW10+IHsKICAgICBwdWJsaWMgYnl0ZVtdIHVubWFyc2hhbChTdHJpbmcgcykgeworICAgICAgICBpZihzPT1udWxsKSAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIHJldHVybiBEYXRhdHlwZUNvbnZlcnRlci5wYXJzZUhleEJpbmFyeShzKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIG1hcnNoYWwoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgIGlmKGJ5dGVzPT1udWxsKSAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIHJldHVybiBEYXRhdHlwZUNvbnZlcnRlci5wcmludEhleEJpbmFyeShieXRlcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9hZGFwdGVycy9Ob3JtYWxpemVkU3RyaW5nQWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9hZGFwdGVycy9Ob3JtYWxpemVkU3RyaW5nQWRhcHRlci5qYXZhCmluZGV4IGFhM2QwNWQuLjYzMGZjMzYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvTm9ybWFsaXplZFN0cmluZ0FkYXB0ZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL2FkYXB0ZXJzL05vcm1hbGl6ZWRTdHJpbmdBZGFwdGVyLmphdmEKQEAgLTM5LDkgKzM5LDggQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5vcm1hbGl6ZWRTdHJpbmdBZGFwdGVyIGV4dGVuZHMgWG1sQWRhcHRlcjxTdHJpbmcsU3RyaW5nPiB7CiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlcyBvZiB0aGUgc3RyaW5nCi0gICAgICogZ2l2ZW4gYXMgdGhlIHBhcmFtZXRlciwgdGhlbiByZXBsYWNlCi0gICAgICogYW55IHRhYiwgQ1IsIGFuZCBMRiBieSBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyICcgJy4KKyAgICAgKiBSZXBsYWNlIGFueSB0YWIsIENSLCBhbmQgTEYgYnkgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciAnICcsCisgICAgICogYXMgc3BlY2lmaWVkIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNyZi13aGl0ZVNwYWNlIj50aGUgd2hpdGVzcGFjZSBmYWNldCAncmVwbGFjZSc8L2E+CiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB1bm1hcnNoYWwoU3RyaW5nIHRleHQpIHsKICAgICAgICAgaWYodGV4dD09bnVsbCkgICAgICByZXR1cm4gbnVsbDsgICAgLy8gYmUgZGVmZW5zaXZlCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL2FkYXB0ZXJzL1htbEFkYXB0ZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvWG1sQWRhcHRlci5qYXZhCmluZGV4IDNmYzNlMDkuLjQzYjQxMzMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvWG1sQWRhcHRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvWG1sQWRhcHRlci5qYXZhCkBAIC0yNSw5ICsyNSw2IEBACiAKIHBhY2thZ2UgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVyczsKIAotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOwotCiAvKioKICAqIEFkYXB0cyBhIEphdmEgdHlwZSBmb3IgY3VzdG9tIG1hcnNoYWxpbmcuCiAgKgpAQCAtNzEsNyArNjgsNyBAQAogICogICAgICAgIFhtbEphdmFUeXBlQWRhcHRlcn0gPC9saT4KICAqIDwvdWw+CiAgKgotICogPHA+PGI+RXhhbXBsZTo8L2I+IEN1c3RvbWl6ZWQgbWFwcGluZyBvZiA8dHQ+SGFzaE1hcDwvdHQ+PC9wPgorICogPHA+PGI+RXhhbXBsZTo8L2I+IEN1c3RvbWl6ZWQgbWFwcGluZyBvZiA8L3R0Pkhhc2hNYXA8L3R0PjwvcD4KICAqIDxwPiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZgogICogPHR0PiYjNjQ7WG1sQWRhcHRlcjwvdHQ+IGFuZCA8dHQ+JiM2NDtYbWxKYXZhVHlwZUFkYXB0ZXI8L3R0PiB0bwogICogY3VzdG9taXplIHRoZSBtYXBwaW5nIG9mIGEgPHR0Pkhhc2hNYXA8L3R0Pi4KQEAgLTEzMCw3ICsxMjcsNyBAQAogICoKICAqIDxwcmU+CiAgKiAgICAgcHVibGljIGZpbmFsIGNsYXNzIE15SGFzaE1hcEFkYXB0ZXIgZXh0ZW5kcwotICogICAgICAgICAgICAgICAgICAgICAgICBYbWxBZGFwdGVyJmx0O0hhc2hNYXAsIE15SGFzaE1hcFR5cGU+IHsgLi4uIH0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgWG1sQWRhcHRlciZsdDtNeUhhc2hNYXBUeXBlLEhhc2hNYXA+IHsgLi4uIH0KICAqCiAgKiA8L3ByZT4KICAqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL2FkYXB0ZXJzL1htbEphdmFUeXBlQWRhcHRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9hZGFwdGVycy9YbWxKYXZhVHlwZUFkYXB0ZXIuamF2YQppbmRleCAwNDRjYjBkLi5hM2YxMmJlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL2FkYXB0ZXJzL1htbEphdmFUeXBlQWRhcHRlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKQEAgLTg4LDYgKzg4LDcgQEAKICAqIEBhdXRob3IgPHVsPjxsaT5TZWtoYXIgVmFqamhhbGEsIFN1biBNaWNyb3N5c3RlbXMgSW5jLjwvbGk+IDxsaT4gS29oc3VrZSBLYXdhZ3VjaGksIFN1biBNaWNyb3N5c3RlbXMgSW5jLjwvbGk+PC91bD4KICAqIEBzaW5jZSBKQVhCMi4wCiAgKiBAc2VlIFhtbEFkYXB0ZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICAqLwogCiBAUmV0ZW50aW9uKFJVTlRJTUUpIEBUYXJnZXQoe1BBQ0tBR0UsRklFTEQsTUVUSE9ELFRZUEUsUEFSQU1FVEVSfSkKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vYWRhcHRlcnMvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9hZGFwdGVycy9wYWNrYWdlLmh0bWwKaW5kZXggYzI2NDY2OC4uMTUxNWRlOSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9hZGFwdGVycy9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9hZGFwdGVycy9wYWNrYWdlLmh0bWwKQEAgLTEsMzAgKzEsMzEgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KIDxodG1sPgogICAgIDxoZWFkPgotICAgICAgICA8IS0tCi1Db3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotCi1UaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLVRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci1hY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0yIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi1JbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0KLVBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLWhhdmUgYW55IHF1ZXN0aW9ucy4KLSAgICAgICAgLS0+CisgICAgICAgIAogICAgIDwvaGVhZD4KIAogICAgIDxib2R5PgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL3BhY2thZ2UuaHRtbAppbmRleCBlYTAyMmE3Li4zYzk1MTE2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL3BhY2thZ2UuaHRtbApAQCAtMSwzMSArMSwzMSBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgogPGh0bWw+CiAgICAgPGhlYWQ+Ci0gICAgICAgIDwhLS0KLUNvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLURPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLQotVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLXBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLWJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotCi1UaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLUFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi12ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotCi1QbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLUNBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi1oYXZlIGFueSBxdWVzdGlvbnMuCi0KLSAgICAgICAgLS0+CisgICAgICAgIAogICAgIDwvaGVhZD4KIAogICAgIDxib2R5IGJnY29sb3I9IndoaXRlIj4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2F0dGFjaG1lbnQvQXR0YWNobWVudE1hcnNoYWxsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2F0dGFjaG1lbnQvQXR0YWNobWVudE1hcnNoYWxsZXIuamF2YQppbmRleCBhNDE1YjM5Li4xOTFhNDMxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hdHRhY2htZW50L0F0dGFjaG1lbnRNYXJzaGFsbGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvYXR0YWNobWVudC9BdHRhY2htZW50TWFyc2hhbGxlci5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudDsKIAogaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hdHRhY2htZW50L0F0dGFjaG1lbnRVbm1hcnNoYWxsZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2F0dGFjaG1lbnQvQXR0YWNobWVudFVubWFyc2hhbGxlci5qYXZhCmluZGV4IGRkM2JiMTMuLmY1MGYyNmIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2F0dGFjaG1lbnQvQXR0YWNobWVudFVubWFyc2hhbGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2F0dGFjaG1lbnQvQXR0YWNobWVudFVubWFyc2hhbGxlci5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCi0KIHBhY2thZ2UgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudDsKIAogaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9hdHRhY2htZW50L3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2F0dGFjaG1lbnQvcGFja2FnZS5odG1sCmluZGV4IDFiODgxYzYuLmUzMDBkYjcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2F0dGFjaG1lbnQvcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2F0dGFjaG1lbnQvcGFja2FnZS5odG1sCkBAIC0xLDMwICsxLDMxIEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+CiA8aHRtbD4KICAgICA8aGVhZD4KLSAgICAgICAgPCEtLQotQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotCi1UaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLVRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci1hY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0yIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi1JbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0KLVBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLWhhdmUgYW55IHF1ZXN0aW9ucy4KLSAgICAgICAgLS0+CisgICAgICAgIAogICAgIDwvaGVhZD4KIAogICAgIDxib2R5IGJnY29sb3I9IndoaXRlIj4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvQWJzdHJhY3RNYXJzaGFsbGVySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9BYnN0cmFjdE1hcnNoYWxsZXJJbXBsLmphdmEKaW5kZXggYTQxNGNmYS4uMjBhYzZjYSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9BYnN0cmFjdE1hcnNoYWxsZXJJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9BYnN0cmFjdE1hcnNoYWxsZXJJbXBsLmphdmEKQEAgLTM3LDYgKzM3LDExIEBACiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwogaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYTsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAvLyBKMlNFMS40IGZlYXR1cmUKIC8vIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAvLyBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CkBAIC01NSw2ICs2MCw3IEBACiAgKiB7QGxpbmsgTWFyc2hhbGxlciNtYXJzaGFsKE9iamVjdCwgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQpIG1hcnNoYWwoT2JqZWN0LCBqYXZheC54bWwuc3RyZWFtLlhNTEV2ZW50V3JpdGVyKX0uCiAgKgogICogQGF1dGhvciA8dWw+PGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48L3VsPgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKICAqIEBzZWUgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcgogICogQHNpbmNlIEpBWEIxLjAKICAqLwpAQCAtODksNiArOTUsMjAgQEAKICAgICAgICAgbWFyc2hhbCggb2JqLCBuZXcgU3RyZWFtUmVzdWx0KG9zKSApOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IGpheGJFbGVtZW50LCBGaWxlIG91dHB1dCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBjaGVja05vdE51bGwoamF4YkVsZW1lbnQsICJqYXhiRWxlbWVudCIsIG91dHB1dCwgIm91dHB1dCIgKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXQpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFyc2hhbCggamF4YkVsZW1lbnQsIG5ldyBTdHJlYW1SZXN1bHQob3MpICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKQVhCRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIHZvaWQgbWFyc2hhbCggT2JqZWN0IG9iaiwgamF2YS5pby5Xcml0ZXIgdyApCiAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKIApAQCAtNDIyLDE4ICs0NDIsMTMgQEAKICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoIE1lc3NhZ2VzLk1VU1RfTk9UX0JFX05VTEwsIG8yTmFtZSApICk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlciNtYXJzaGFsKGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5zdHJlYW0uWE1MRXZlbnRXcml0ZXIpCi0gICAgICovCisKICAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmosIFhNTEV2ZW50V3JpdGVyIHdyaXRlcikKICAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24gewogCiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXIjbWFyc2hhbChqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcikKLSAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmosIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCiAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9BYnN0cmFjdFVubWFyc2hhbGxlckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvQWJzdHJhY3RVbm1hcnNoYWxsZXJJbXBsLmphdmEKaW5kZXggY2VkYzY0MS4uNGYyZjZhMSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9BYnN0cmFjdFVubWFyc2hhbGxlckltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL0Fic3RyYWN0VW5tYXJzaGFsbGVySW1wbC5qYXZhCkBAIC02Niw2ICs2Niw3IEBACiAgKiBAYXV0aG9yIDx1bD4KICAqICAgICAgICAgPGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT4KICAqICAgICAgICAgPC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMyAkICREYXRlOiAyMDA1LzA3LzI4IDIyOjE4OjEyICQKICAqIEBzZWUgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyCiAgKiBAc2luY2UgSkFYQjEuMAogICovCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL0RlZmF1bHRWYWxpZGF0aW9uRXZlbnRIYW5kbGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL0RlZmF1bHRWYWxpZGF0aW9uRXZlbnRIYW5kbGVyLmphdmEKaW5kZXggMGNmYWE4OC4uNGI0ODRlZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9EZWZhdWx0VmFsaWRhdGlvbkV2ZW50SGFuZGxlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvRGVmYXVsdFZhbGlkYXRpb25FdmVudEhhbmRsZXIuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICoge0BsaW5rIGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXJ9LgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40ICQKICAqIEBzZWUgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyCiAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRvcgogICogQHNlZSBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL01lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggNjUxNWM4Ni4uODQwN2MzNCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDI4IEBACisjCisjIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKwogQWJzdHJhY3RVbm1hcnNoYWxsZXJJbXBsLklTTm90TnVsbCA9IFwKIAlJbnB1dFN0cmVhbSBjYW4gbm90IGJlIG51bGwKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9Ob3RJZGVudGlmaWFibGVFdmVudEltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvTm90SWRlbnRpZmlhYmxlRXZlbnRJbXBsLmphdmEKaW5kZXggYjFmMzAwNS4uOTRiZWU3MyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9Ob3RJZGVudGlmaWFibGVFdmVudEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL05vdElkZW50aWZpYWJsZUV2ZW50SW1wbC5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiAgKiBjb252ZW5pZW5jZS4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+UnlhbiBTaG9lbWFrZXIsIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLk5vdElkZW50aWZpYWJsZUV2ZW50CiAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRvcgogICogQHNlZSBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL1BhcnNlQ29udmVyc2lvbkV2ZW50SW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9QYXJzZUNvbnZlcnNpb25FdmVudEltcGwuamF2YQppbmRleCAyYmMwYWIwLi42ZWUyMGU0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL1BhcnNlQ29udmVyc2lvbkV2ZW50SW1wbC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvUGFyc2VDb252ZXJzaW9uRXZlbnRJbXBsLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKICAqIGNvbnZlbmllbmNlLgogICoKICAqIEBhdXRob3IgPHVsPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PC91bD4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqIEBzZWUgamF2YXgueG1sLmJpbmQuUGFyc2VDb252ZXJzaW9uRXZlbnQKICAqIEBzZWUgamF2YXgueG1sLmJpbmQuVmFsaWRhdG9yCiAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXIKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvUHJpbnRDb252ZXJzaW9uRXZlbnRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL1ByaW50Q29udmVyc2lvbkV2ZW50SW1wbC5qYXZhCmluZGV4IDEyNmU3MjUuLjgzMTY5MzQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvUHJpbnRDb252ZXJzaW9uRXZlbnRJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9QcmludENvbnZlcnNpb25FdmVudEltcGwuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogICogY29udmVuaWVuY2UuCiAgKgogICogQGF1dGhvciA8dWw+PGxpPlJ5YW4gU2hvZW1ha2VyLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48L3VsPgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICogQHNlZSBqYXZheC54bWwuYmluZC5QcmludENvbnZlcnNpb25FdmVudAogICogQHNlZSBqYXZheC54bWwuYmluZC5WYWxpZGF0b3IKICAqIEBzZWUgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50SGFuZGxlcgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9WYWxpZGF0aW9uRXZlbnRJbXBsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL1ZhbGlkYXRpb25FdmVudEltcGwuamF2YQppbmRleCAyY2NjMDY5Li43YWQ2Y2RjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL1ZhbGlkYXRpb25FdmVudEltcGwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL1ZhbGlkYXRpb25FdmVudEltcGwuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogICogY29udmVuaWVuY2UuCiAgKgogICogQGF1dGhvciA8dWw+PGxpPktvaHN1a2UgS2F3YWd1Y2hpLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9saT48L3VsPgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICogQHNlZSBqYXZheC54bWwuYmluZC5WYWxpZGF0b3IKICAqIEBzZWUgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50SGFuZGxlcgogICogQHNlZSBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvVmFsaWRhdGlvbkV2ZW50TG9jYXRvckltcGwuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL2hlbHBlcnMvVmFsaWRhdGlvbkV2ZW50TG9jYXRvckltcGwuamF2YQppbmRleCAyMTRiYmFiLi4wOWQ5MTllIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL1ZhbGlkYXRpb25FdmVudExvY2F0b3JJbXBsLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9WYWxpZGF0aW9uRXZlbnRMb2NhdG9ySW1wbC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgKiBjb252ZW5pZW5jZS4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+S29oc3VrZSBLYXdhZ3VjaGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkCiAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRvcgogICogQHNlZSBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyCiAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvaGVscGVycy9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL3BhY2thZ2UuaHRtbAppbmRleCBkOTIzNzVlLi5mNDY3NDljIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9oZWxwZXJzL3BhY2thZ2UuaHRtbApAQCAtMSwzMCArMSwzMSBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgogPGh0bWw+CiAgICAgPGhlYWQ+Ci0gICAgICAgIDwhLS0KLUNvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1ETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0KLVRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi1wYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi1ieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLQotVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi1BTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLWFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLTIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLUluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLQotUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi1DQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotaGF2ZSBhbnkgcXVlc3Rpb25zLgotICAgICAgICAtLT4KKyAgICAgICAgCiAgICAgPC9oZWFkPgogCiAgICAgPGJvZHkgYmdjb2xvcj0id2hpdGUiPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvcGFja2FnZS5odG1sCmluZGV4IDQ4YTY5N2EuLjJkMWY1NjYgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC9wYWNrYWdlLmh0bWwKQEAgLTEsMzAgKzEsMzEgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KIDxodG1sPgogICAgIDxoZWFkPgotICAgICAgICA8IS0tCi1Db3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotCi1UaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLVRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci1hY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0yIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi1JbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0KLVBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLWhhdmUgYW55IHF1ZXN0aW9ucy4KLSAgICAgICAgLS0+CisgICAgICAgIAogICAgIDwvaGVhZD4KIAogICAgIDxib2R5IGJnY29sb3I9IndoaXRlIj4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL3V0aWwvTWVzc2FnZXMucHJvcGVydGllcyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL3V0aWwvTWVzc2FnZXMucHJvcGVydGllcwppbmRleCAwOWI4MTYzLi5iN2I0MDljIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC91dGlsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvdXRpbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworCiBWYWxpZGF0aW9uRXZlbnRDb2xsZWN0b3IuVW5yZWNvZ25pemVkU2V2ZXJpdHkgPSBcCiAJVW5yZWNvZ25pemVkIGV2ZW50IHNldmVyaXR5IGZpZWxkICJ7MH0iCiAJCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC91dGlsL1ZhbGlkYXRpb25FdmVudENvbGxlY3Rvci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvdXRpbC9WYWxpZGF0aW9uRXZlbnRDb2xsZWN0b3IuamF2YQppbmRleCA3MDAyNmIwLi4yN2UyMmI0IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC91dGlsL1ZhbGlkYXRpb25FdmVudENvbGxlY3Rvci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9iaW5kL3V0aWwvVmFsaWRhdGlvbkV2ZW50Q29sbGVjdG9yLmphdmEKQEAgLTI0LDkgKzI0LDEwIEBACiAgKi8KIHBhY2thZ2UgamF2YXgueG1sLmJpbmQudXRpbDsKIAotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50SGFuZGxlcjsKIGltcG9ydCBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdGlvbkV2ZW50SGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqIHtAbGluayBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyIFZhbGlkYXRpb25FdmVudEhhbmRsZXJ9CkBAIC0zOSw2ICs0MCw3IEBACiAgKiB0aGUgcmVwb3J0ZWQgZXJyb3JzIGFuZCB3YXJuaW5ncy4KICAqCiAgKiBAYXV0aG9yIDx1bD48bGk+S29oc3VrZSBLYXdhZ3VjaGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjxsaT5SeWFuIFNob2VtYWtlciwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvbGk+PGxpPkpvZSBGaWFsbGksIFN1biBNaWNyb3N5c3RlbXMsIEluYy48L2xpPjwvdWw+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRvcgogICogQHNlZSBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyCiAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudApAQCAtNDcsNyArNDksNyBAQAogICovCiBwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkV2ZW50Q29sbGVjdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV2ZW50SGFuZGxlcgogewotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFZhbGlkYXRpb25FdmVudD4gZXZlbnRzID0gbmV3IFZlY3RvcjxWYWxpZGF0aW9uRXZlbnQ+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFZhbGlkYXRpb25FdmVudD4gZXZlbnRzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uRXZlbnQ+KCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgVmFsaWRhdGlvbkV2ZW50IG9iamVjdHMgY29udGFpbmluZyBhIGNvcHkgb2YgZWFjaCBvZgpAQCAtNjUsNyArNjcsNyBAQAogICAgICAqIENsZWFyIGFsbCBjb2xsZWN0ZWQgZXJyb3JzIGFuZCB3YXJuaW5ncy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgZXZlbnRzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIGV2ZW50cy5jbGVhcigpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL2JpbmQvdXRpbC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC91dGlsL3BhY2thZ2UuaHRtbAppbmRleCAyYTZlMjA5Li5mY2ZmYTIwIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC91dGlsL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvYmluZC91dGlsL3BhY2thZ2UuaHRtbApAQCAtMSwzMCArMSwzMSBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgogPGh0bWw+CiAgICAgPGhlYWQ+Ci0gICAgICAgIDwhLS0KLUNvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1ETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0KLVRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi1wYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi1ieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLQotVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi1BTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLWFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLTIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLUluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLQotUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi1DQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotaGF2ZSBhbnkgcXVlc3Rpb25zLgotICAgICAgICAtLT4KKyAgICAgICAgCiAgICAgPC9oZWFkPgogCiAgICAgPGJvZHkgYmdjb2xvcj0id2hpdGUiPgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvQXR0YWNobWVudFBhcnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL0F0dGFjaG1lbnRQYXJ0LmphdmEKaW5kZXggOThmZTI3Ny4uYWIxYTg5OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvQXR0YWNobWVudFBhcnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9BdHRhY2htZW50UGFydC5qYXZhCkBAIC0xLDEwICsxLDQgQEAKIC8qCi0gKiAkSWQ6IEF0dGFjaG1lbnRQYXJ0LmphdmEsdiAxLjExIDIwMDUvMDgvMTcgMDg6MTM6MDEgdmoxMzUwNjIgRXhwICQKLSAqICRSZXZpc2lvbjogMS4xMSAkCi0gKiAkRGF0ZTogMjAwNS8wOC8xNyAwODoxMzowMSAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogQXR0YWNobWVudFBhcnQuamF2YSx2IDEuMTIgMjAwNS8wOS8wOCAxNDoxOTo1MCB2ajEzNTA2MiBFeHAgJAorICogJFJldmlzaW9uOiAxLjEyICQKKyAqICREYXRlOiAyMDA1LzA5LzA4IDE0OjE5OjUwICQKKyAqLworCisKIHBhY2thZ2UgamF2YXgueG1sLnNvYXA7CiAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvRGV0YWlsLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9EZXRhaWwuamF2YQppbmRleCAzMzE3NmExLi42M2VlY2VjIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9EZXRhaWwuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9EZXRhaWwuamF2YQpAQCAtMSwxMCArMSw0IEBACiAvKgotICogJElkOiBEZXRhaWwuamF2YSx2IDEuNyAyMDA0LzA0LzAyIDAxOjI0OjE3IG9mdW5nIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNyAkCi0gKiAkRGF0ZTogMjAwNC8wNC8wMiAwMToyNDoxNyAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogRGV0YWlsLmphdmEsdiAxLjggMjAwNS8wNC8wNSAyMDozNDoxNiBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjggJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjA6MzQ6MTYgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL0RldGFpbEVudHJ5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9EZXRhaWxFbnRyeS5qYXZhCmluZGV4IGVhYzM3M2UuLjRmNGFhMWMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL0RldGFpbEVudHJ5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvRGV0YWlsRW50cnkuamF2YQpAQCAtMSwxMCArMSw0IEBACiAvKgotICogJElkOiBEZXRhaWxFbnRyeS5qYXZhLHYgMS4yIDIwMDQvMDQvMDIgMDE6MjQ6MTcgb2Z1bmcgRXhwICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAyMDA0LzA0LzAyIDAxOjI0OjE3ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBEZXRhaWxFbnRyeS5qYXZhLHYgMS4zIDIwMDUvMDQvMDUgMjA6MzQ6MTYgbWsxMjUwOTAgRXhwICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAyMDA1LzA0LzA1IDIwOjM0OjE2ICQKKyAqLworCisKIHBhY2thZ2UgamF2YXgueG1sLnNvYXA7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvRmFjdG9yeUZpbmRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvRmFjdG9yeUZpbmRlci5qYXZhCmluZGV4IDY3YWM2MWIuLmRmM2MzZDEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL0ZhY3RvcnlGaW5kZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9GYWN0b3J5RmluZGVyLmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogRmFjdG9yeUZpbmRlci5qYXZhLHYgMS41IDIwMDQvMDQvMDIgMDE6MjQ6MTcgb2Z1bmcgRXhwICQKLSAqICRSZXZpc2lvbjogMS41ICQKLSAqICREYXRlOiAyMDA0LzA0LzAyIDAxOjI0OjE3ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBGYWN0b3J5RmluZGVyLmphdmEsdiAxLjYgMjAwNS8wNC8wNSAyMjoyODoxMiBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjYgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjI6Mjg6MTIgJAorICovCisKKwogCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9NZXNzYWdlRmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvTWVzc2FnZUZhY3RvcnkuamF2YQppbmRleCBmZWUzNzhjLi5lNmVlNGZmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9NZXNzYWdlRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL01lc3NhZ2VGYWN0b3J5LmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogTWVzc2FnZUZhY3RvcnkuamF2YSx2IDEuOSAyMDA0LzA0LzAyIDAxOjI0OjE3IG9mdW5nIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuOSAkCi0gKiAkRGF0ZTogMjAwNC8wNC8wMiAwMToyNDoxNyAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogTWVzc2FnZUZhY3RvcnkuamF2YSx2IDEuMTAgMjAwNS8wNC8wNSAyMjoyODoxMyBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjEwICQKKyAqICREYXRlOiAyMDA1LzA0LzA1IDIyOjI4OjEzICQKKyAqLworCisKIHBhY2thZ2UgamF2YXgueG1sLnNvYXA7CiAKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvTWltZUhlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvTWltZUhlYWRlci5qYXZhCmluZGV4IGM0YmRhNTguLjQyN2IzNDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL01pbWVIZWFkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9NaW1lSGVhZGVyLmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogTWltZUhlYWRlci5qYXZhLHYgMS4yIDIwMDQvMDQvMDIgMDE6MjQ6MTcgb2Z1bmcgRXhwICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAyMDA0LzA0LzAyIDAxOjI0OjE3ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBNaW1lSGVhZGVyLmphdmEsdiAxLjMgMjAwNS8wNC8wNSAyMDo0OTo0OCBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjMgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjA6NDk6NDggJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9NaW1lSGVhZGVycy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvTWltZUhlYWRlcnMuamF2YQppbmRleCAyMDkxMzFmLi5iMWE5MzgyIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9NaW1lSGVhZGVycy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL01pbWVIZWFkZXJzLmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogTWltZUhlYWRlcnMuamF2YSx2IDEuNCAyMDA0LzA0LzAyIDAxOjI0OjE3IG9mdW5nIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNCAkCi0gKiAkRGF0ZTogMjAwNC8wNC8wMiAwMToyNDoxNyAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogTWltZUhlYWRlcnMuamF2YSx2IDEuNSAyMDA1LzA0LzA1IDIwOjQ5OjQ5IG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNSAkCisgKiAkRGF0ZTogMjAwNS8wNC8wNSAyMDo0OTo0OSAkCisgKi8KKworCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvTmFtZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvTmFtZS5qYXZhCmluZGV4IGU1Njk5YmQuLmEyNDdiYjMgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL05hbWUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9OYW1lLmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogTmFtZS5qYXZhLHYgMS4zIDIwMDQvMDQvMDIgMDE6MjQ6MTcgb2Z1bmcgRXhwICQKLSAqICRSZXZpc2lvbjogMS4zICQKLSAqICREYXRlOiAyMDA0LzA0LzAyIDAxOjI0OjE3ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBOYW1lLmphdmEsdiAxLjQgMjAwNS8wNC8wNSAyMDo0OTo0OSBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjQgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjA6NDk6NDkgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogLyoqCkBAIC03NSw3ICs3Niw3IEBACiAgKiA8L1BSRT4KICAqIDxQPgogICogVGhlIDxjb2RlPk5hbWU8L2NvZGU+IGludGVyZmFjZSBtYXkgYmUgZGVwcmVjYXRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlIG9mIFNBQUoKLSAqIGluIGZhdm9yIG9mIDxjb2RlPmphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU8L2NvZGU+CisgKiBpbiBmYXZvciBvZiA8Y29kZT5qYXZheC54bWwubmFtZXNwYWNlLlFOYW1lPGNvZGU+CiAgKiBAc2VlIFNPQVBFbnZlbG9wZSNjcmVhdGVOYW1lKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpIFNPQVBFbnZlbG9wZS5jcmVhdGVOYW1lCiAgKiBAc2VlIFNPQVBGYWN0b3J5I2NyZWF0ZU5hbWUoU3RyaW5nLCBTdHJpbmcsIFN0cmluZykgU09BUEZhY3RvcnkuY3JlYXRlTmFtZQogICovCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9Ob2RlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9Ob2RlLmphdmEKaW5kZXggNDY5NWQyOS4uODUwN2IzZSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvTm9kZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL05vZGUuamF2YQpAQCAtMSwxMCArMSw0IEBACiAvKgotICogJElkOiBOb2RlLmphdmEsdiAxLjEyIDIwMDQvMDQvMDIgMDE6MjQ6MTcgb2Z1bmcgRXhwICQKLSAqICRSZXZpc2lvbjogMS4xMiAkCi0gKiAkRGF0ZTogMjAwNC8wNC8wMiAwMToyNDoxNyAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogTm9kZS5qYXZhLHYgMS4xMyAyMDA1LzA0LzA1IDIwOjQ5OjQ5IG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTMgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjA6NDk6NDkgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TQUFKTWV0YUZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NBQUpNZXRhRmFjdG9yeS5qYXZhCmluZGV4IDQyZmNiODQuLjNhYWQ4MjAgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NBQUpNZXRhRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NBQUpNZXRhRmFjdG9yeS5qYXZhCkBAIC0xLDEwICsxLDQgQEAKIC8qCi0gKiAkSWQ6IFNBQUpNZXRhRmFjdG9yeS5qYXZhLHYgMS4yLjIuMTUgMjAwNS8wMi8xMSAwNzoyNjoxNSB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjIuMi4xNSAkCi0gKiAkRGF0ZTogMjAwNS8wMi8xMSAwNzoyNjoxNSAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU0FBSk1ldGFGYWN0b3J5LmphdmEsdiAxLjQgMjAwNi8wMy8zMCAwMDo1OTozOSBvZnVuZyBFeHAgJAorICogJFJldmlzaW9uOiAxLjQgJAorICogJERhdGU6IDIwMDYvMDMvMzAgMDA6NTk6MzkgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogLyoqCkBAIC01Miw4ICs1Myw2IEBACiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfTUVUQV9GQUNUT1JZX0NMQVNTID0KICAgICAgICAgImNvbS5zdW4ueG1sLmludGVybmFsLm1lc3NhZ2luZy5zYWFqLnNvYXAuU0FBSk1ldGFGYWN0b3J5SW1wbCI7CiAKLSAgICBzdGF0aWMgcHJpdmF0ZSBTQUFKTWV0YUZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIGNvbmNyZXRlIDxjb2RlPlNBQUpNZXRhRmFjdG9yeTwvY29kZT4gb2JqZWN0LgogICAgICAqIFRoZSBTQUFKTWV0YUZhY3RvcnkgaXMgYW4gU1BJLCBpdCBwdWxscyB0aGUgY3JlYXRpb24gb2YgdGhlIG90aGVyIGZhY3RvcmllcyB0b2dldGhlciBpbnRvIGEKQEAgLTc1LDIwICs3NCwxNyBAQAogICAgICAqIEByZXR1cm4gYSBjb25jcmV0ZSA8Y29kZT5TQUFKTWV0YUZhY3Rvcnk8L2NvZGU+IG9iamVjdAogICAgICAqIEBleGNlcHRpb24gU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjcmVhdGluZyB0aGUgPGNvZGU+U0FBSk1ldGFGYWN0b3J5PC9jb2RlPgogICAgICAqLwotICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgU0FBSk1ldGFGYWN0b3J5IGdldEluc3RhbmNlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworICAgIHN0YXRpYyBTQUFKTWV0YUZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluc3RhbmNlID0KKyAgICAgICAgICAgICAgICBTQUFKTWV0YUZhY3RvcnkgaW5zdGFuY2UgPQogICAgICAgICAgICAgICAgICAgICAoU0FBSk1ldGFGYWN0b3J5KSBGYWN0b3J5RmluZGVyLmZpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICBNRVRBX0ZBQ1RPUllfQ0xBU1NfUFJPUEVSVFksCiAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01FVEFfRkFDVE9SWV9DTEFTUyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgU0FBSiBtZXRhLWZhY3RvcnkiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBTQUFKTWV0YUZhY3RvcnkoKSB7IH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NBQUpSZXN1bHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NBQUpSZXN1bHQuamF2YQppbmRleCBmNDZiMDZlLi5lYmFjYjIxIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TQUFKUmVzdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU0FBSlJlc3VsdC5qYXZhCkBAIC0xLDggKzEsNCBAQAogLyoKLSAqICRJZDogU0FBSlJlc3VsdC5qYXZhLHYgMS4zIDIwMDYvMDMvMDkgMTY6MDk6NDIgdmoxMzUwNjIgRXhwICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI2LDYgKzIyLDExIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTQUFKUmVzdWx0LmphdmEsdiAxLjQgMjAwNi8wMy8yNCAxMzowNTo0MyB2ajEzNTA2MiBFeHAgJAorICovCisKKwogCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQm9keS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEJvZHkuamF2YQppbmRleCA4NmNhYjBmLi5mMTdmMDczIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQm9keS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBCb2R5LmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogU09BUEJvZHkuamF2YSx2IDEuMTYgMjAwNS8wNC8wNSAyMjoyODoxMyBtazEyNTA5MCBFeHAgJAotICogJFJldmlzaW9uOiAxLjE2ICQKLSAqICREYXRlOiAyMDA1LzA0LzA1IDIyOjI4OjEzICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQQm9keS5qYXZhLHYgMS4xNyAyMDA1LzA2LzIyIDEwOjI0OjExIHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTcgJAorICogJERhdGU6IDIwMDUvMDYvMjIgMTA6MjQ6MTEgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CkBAIC0yOTIsNyArMjkzLDcgQEAKICAgICAgKiAgICAgICAgIG9mIHRoZSA8Y29kZT5TT0FQQm9keTwvY29kZT4gY29udGVudC4KICAgICAgKgogICAgICAqIEBleGNlcHRpb24gU09BUEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vdCBleGFjdGx5IG9uZSBjaGlsZCA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4gb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm90IGV4YWN0bHkgb25lIGNoaWxkIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvZiB0aGUgPGNvZGU+CiAgICAgICogICAgICAgICAgICAgIDxjb2RlPlNPQVBCb2R5PC9jb2RlPi4KICAgICAgKgogICAgICAqIEBzaW5jZSBTQUFKIDEuMwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEJvZHlFbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQm9keUVsZW1lbnQuamF2YQppbmRleCBmMWI0OTI2Li5hM2Q4MjRkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQm9keUVsZW1lbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQm9keUVsZW1lbnQuamF2YQpAQCAtMSwxMCArMSw0IEBACiAvKgotICogJElkOiBTT0FQQm9keUVsZW1lbnQuamF2YSx2IDEuMiAyMDA0LzA0LzAyIDAxOjI0OjE3IG9mdW5nIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMjAwNC8wNC8wMiAwMToyNDoxNyAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUEJvZHlFbGVtZW50LmphdmEsdiAxLjMgMjAwNS8wNC8wNSAyMjoyODoxMyBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjMgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjI6Mjg6MTMgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQ29ubmVjdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUENvbm5lY3Rpb24uamF2YQppbmRleCA2NzBhZjIxLi4wYzliNWFkIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQ29ubmVjdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBDb25uZWN0aW9uLmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogU09BUENvbm5lY3Rpb24uamF2YSx2IDEuMTEgMjAwNC8wNC8wMiAwMToyNDoxNyBvZnVuZyBFeHAgJAotICogJFJldmlzaW9uOiAxLjExICQKLSAqICREYXRlOiAyMDA0LzA0LzAyIDAxOjI0OjE3ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQQ29ubmVjdGlvbi5qYXZhLHYgMS4xMiAyMDA1LzA0LzA1IDIxOjAzOjIzIG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTIgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjE6MDM6MjMgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBDb25uZWN0aW9uRmFjdG9yeS5qYXZhCmluZGV4IDI5YmNlOTcuLmVkM2I5MDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBDb25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC0xLDEwICsxLDQgQEAKIC8qCi0gKiAkSWQ6IFNPQVBDb25uZWN0aW9uRmFjdG9yeS5qYXZhLHYgMS40IDIwMDQvMDQvMDIgMDE6MjQ6MTcgb2Z1bmcgRXhwICQKLSAqICRSZXZpc2lvbjogMS40ICQKLSAqICREYXRlOiAyMDA0LzA0LzAyIDAxOjI0OjE3ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQQ29ubmVjdGlvbkZhY3RvcnkuamF2YSx2IDEuNSAyMDA1LzA0LzA1IDIxOjAzOjIzIG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNSAkCisgKiAkRGF0ZTogMjAwNS8wNC8wNSAyMTowMzoyMyAkCisgKi8KKworCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBDb25zdGFudHMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBDb25zdGFudHMuamF2YQppbmRleCBjZmJiOWFhLi5iNDZkMTQzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQQ29uc3RhbnRzLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUENvbnN0YW50cy5qYXZhCkBAIC0xLDEwICsxLDQgQEAKIC8qCi0gKiAkSWQ6ICQKLSAqICRSZXZpc2lvbjogMS4xMSAkCi0gKiAkRGF0ZTogMjAwNC8wNC8wMiAwMToyNDoxOCAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUENvbnN0YW50cy5qYXZhLHYgMS4xMiAyMDA1LzA0LzA1IDIyOjI4OjEzIG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTIgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjI6Mjg6MTMgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRWxlbWVudC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEVsZW1lbnQuamF2YQppbmRleCBjMDdjYWNkLi5jNGZkNzEzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRWxlbWVudC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBFbGVtZW50LmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogU09BUEVsZW1lbnQuamF2YSx2IDEuMTggMjAwNS8xMi8wNyAwNzoyNTozNyB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjE4ICQKLSAqICREYXRlOiAyMDA1LzEyLzA3IDA3OjI1OjM3ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQRWxlbWVudC5qYXZhLHYgMS4xOSAyMDA1LzEyLzEzIDA5OjIwOjI1IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTkgJAorICogJERhdGU6IDIwMDUvMTIvMTMgMDk6MjA6MjUgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBFbGVtZW50RmFjdG9yeS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEVsZW1lbnRGYWN0b3J5LmphdmEKaW5kZXggZDFhNTgzNy4uMGZiNmM1OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEVsZW1lbnRGYWN0b3J5LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEVsZW1lbnRGYWN0b3J5LmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogU09BUEVsZW1lbnRGYWN0b3J5LmphdmEsdiAxLjQuMi43IDIwMDQvMDgvMjcgMTk6MDA6MzYgZ29vZHdpbiBFeHAgJAotICogJFJldmlzaW9uOiAxLjQuMi43ICQKLSAqICREYXRlOiAyMDA0LzA4LzI3IDE5OjAwOjM2ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQRWxlbWVudEZhY3RvcnkuamF2YSx2IDEuMTEgMjAwNS8wNC8wNSAyMjo0MjowNSBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjExICQKKyAqICREYXRlOiAyMDA1LzA0LzA1IDIyOjQyOjA1ICQKKyAqLworCisKIAogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEVudmVsb3BlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRW52ZWxvcGUuamF2YQppbmRleCA5NmVkMmI0Li41NDE5ZGU1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRW52ZWxvcGUuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRW52ZWxvcGUuamF2YQpAQCAtMSwxMCArMSw0IEBACiAvKgotICogJElkOiBTT0FQRW52ZWxvcGUuamF2YSx2IDEuNSAyMDA0LzA0LzAyIDAxOjI0OjE4IG9mdW5nIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNSAkCi0gKiAkRGF0ZTogMjAwNC8wNC8wMiAwMToyNDoxOCAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUEVudmVsb3BlLmphdmEsdiAxLjYgMjAwNS8wNC8wNSAyMjo0MjowNSBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjYgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjI6NDI6MDUgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRXhjZXB0aW9uLmphdmEKaW5kZXggZWY4MDMzNS4uZjRhZTRlOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBFeGNlcHRpb24uamF2YQpAQCAtMSwxMCArMSw0IEBACiAvKgotICogJElkOiBTT0FQRXhjZXB0aW9uLmphdmEsdiAxLjUgMjAwNC8wNC8wMiAwMToyNDoxOCBvZnVuZyBFeHAgJAotICogJFJldmlzaW9uOiAxLjUgJAotICogJERhdGU6IDIwMDQvMDQvMDIgMDE6MjQ6MTggJAotICovCi0KLS8qCiAgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgpAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFNPQVBFeGNlcHRpb24uamF2YSx2IDEuNiAyMDA1LzA0LzA1IDIxOjAzOjIzIG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNiAkCisgKiAkRGF0ZTogMjAwNS8wNC8wNSAyMTowMzoyMyAkCisgKi8KKworCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRmFjdG9yeS5qYXZhCmluZGV4IDNlMjllOTg0Li5kZmYwN2Q4IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRmFjdG9yeS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBGYWN0b3J5LmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogU09BUEZhY3RvcnkuamF2YSx2IDEuMTIgMjAwNS8wNC8wNSAyMjo0NjoyNiBtazEyNTA5MCBFeHAgJAotICogJFJldmlzaW9uOiAxLjEyICQKLSAqICREYXRhZSQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBTT0FQRmFjdG9yeS5qYXZhLHYgMS4xMyAyMDA1LzA2LzIyIDEwOjI0OjExIHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTMgJAorICogJERhdGFlJAorICovCisKKwogCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRmF1bHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBGYXVsdC5qYXZhCmluZGV4IGE1MGRlMTYuLjFkMjA4N2IgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBGYXVsdC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBGYXVsdC5qYXZhCkBAIC0xLDEwICsxLDQgQEAKIC8qCi0gKiAkSWQ6IFNPQVBGYXVsdC5qYXZhLHYgMS4xOSAyMDA1LzA5LzI2IDIxOjA5OjA0IG1rMTI1MDkwIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMTkgJAotICogJERhdGU6IDIwMDUvMDkvMjYgMjE6MDk6MDQgJAotICovCi0KLS8qCiAgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgpAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFNPQVBGYXVsdC5qYXZhLHYgMS4yMCAyMDA2LzAyLzE0IDA0OjQwOjU3IHZqMTM1MDYyIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMjAgJAorICogJERhdGU6IDIwMDYvMDIvMTQgMDQ6NDA6NTcgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBGYXVsdEVsZW1lbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBGYXVsdEVsZW1lbnQuamF2YQppbmRleCA3MzIzZjY0Li41ZWQwM2NmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQRmF1bHRFbGVtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEZhdWx0RWxlbWVudC5qYXZhCkBAIC0xLDEwICsxLDQgQEAKIC8qCi0gKiAkSWQ6IFNPQVBGYXVsdEVsZW1lbnQuamF2YSx2IDEuMyAyMDA0LzA0LzAyIDAxOjI0OjE4IG9mdW5nIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMyAkCi0gKiAkRGF0ZTogMjAwNC8wNC8wMiAwMToyNDoxOCAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUEZhdWx0RWxlbWVudC5qYXZhLHYgMS40IDIwMDUvMDQvMDUgMjA6NTM6MjAgbWsxMjUwOTAgRXhwICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqICREYXRlOiAyMDA1LzA0LzA1IDIwOjUzOjIwICQKKyAqLworCisKIHBhY2thZ2UgamF2YXgueG1sLnNvYXA7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEhlYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEhlYWRlci5qYXZhCmluZGV4IDI3ODFlMDEuLjM1Yzk4NmEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBIZWFkZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQSGVhZGVyLmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogU09BUEhlYWRlci5qYXZhLHYgMS41LjIuMTIgMjAwNC8xMS8xNyAxMzo1OToyOCB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjUuMi4xMiAkCi0gKiAkRGF0ZTogMjAwNC8xMS8xNyAxMzo1OToyOCAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUEhlYWRlci5qYXZhLHYgMS4xNCAyMDA1LzA0LzA1IDIyOjQ2OjI3IG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTQgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjI6NDY6MjcgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBIZWFkZXJFbGVtZW50LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQSGVhZGVyRWxlbWVudC5qYXZhCmluZGV4IGNkMzYyM2IuLmY4ZGNjZTQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBIZWFkZXJFbGVtZW50LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUEhlYWRlckVsZW1lbnQuamF2YQpAQCAtMSwxMCArMSw0IEBACiAvKgotICogJElkOiBTT0FQSGVhZGVyRWxlbWVudC5qYXZhLHYgMS41LjIuMTEgMjAwNS8wMi8wOSAwNzozOTowMyB2ajEzNTA2MiBFeHAgJAotICogJFJldmlzaW9uOiAxLjUuMi4xMSAkCi0gKiAkRGF0ZTogMjAwNS8wMi8wOSAwNzozOTowMyAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUEhlYWRlckVsZW1lbnQuamF2YSx2IDEuOSAyMDA1LzA0LzA1IDIyOjQ2OjI3IG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuOSAkCisgKiAkRGF0ZTogMjAwNS8wNC8wNSAyMjo0NjoyNyAkCisgKi8KKworCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogCiAvKioKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBNZXNzYWdlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQTWVzc2FnZS5qYXZhCmluZGV4IDZiYzk5YTcuLjhmZTg0OTEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBNZXNzYWdlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUE1lc3NhZ2UuamF2YQpAQCAtMSwxMCArMSw0IEBACiAvKgotICogJElkOiBTT0FQTWVzc2FnZS5qYXZhLHYgMS4yMSAyMDA1LzA2LzIxIDE3OjQ5OjEyIG1rMTI1MDkwIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMjEgJAotICogJERhdGU6IDIwMDUvMDYvMjEgMTc6NDk6MTIgJAotICovCi0KLS8qCiAgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgpAQCAtMjgsNiArMjIsMTMgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KKy8qCisgKiAkSWQ6IFNPQVBNZXNzYWdlLmphdmEsdiAxLjIyIDIwMDUvMDgvMTcgMDg6MTM6MDEgdmoxMzUwNjIgRXhwICQKKyAqICRSZXZpc2lvbjogMS4yMiAkCisgKiAkRGF0ZTogMjAwNS8wOC8xNyAwODoxMzowMSAkCisgKi8KKworCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQUGFydC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvU09BUFBhcnQuamF2YQppbmRleCAyNjE5M2RlLi4zMzY3Y2ViIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9TT0FQUGFydC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1NPQVBQYXJ0LmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogU09BUFBhcnQuamF2YSx2IDEuOCAyMDA1LzA2LzIwIDEyOjA3OjA1IHZqMTM1MDYyIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuOCAkCi0gKiAkRGF0ZTogMjAwNS8wNi8yMCAxMjowNzowNSAkCi0gKi8KLQotLyoKICAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCkBAIC0yOCw2ICsyMiwxMyBAQAogICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKICAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICAqLworLyoKKyAqICRJZDogU09BUFBhcnQuamF2YSx2IDEuOSAyMDA1LzA2LzIxIDE3OjMyOjQ1IG1rMTI1MDkwIEV4cCAkCisgKiAkUmV2aXNpb246IDEuOSAkCisgKiAkRGF0ZTogMjAwNS8wNi8yMSAxNzozMjo0NSAkCisgKi8KKworCiBwYWNrYWdlIGphdmF4LnhtbC5zb2FwOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvVGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvVGV4dC5qYXZhCmluZGV4IGU3NDkyYjEuLjM0NjFkZGEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL1RleHQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9UZXh0LmphdmEKQEAgLTEsMTAgKzEsNCBAQAogLyoKLSAqICRJZDogVGV4dC5qYXZhLHYgMS4yIDIwMDQvMDQvMDIgMDE6MjQ6MTkgb2Z1bmcgRXhwICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAyMDA0LzA0LzAyIDAxOjI0OjE5ICQKLSAqLwotCi0vKgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKQEAgLTI4LDYgKzIyLDEzIEBACiAgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogICogaGF2ZSBhbnkgcXVlc3Rpb25zLgogICovCisvKgorICogJElkOiBUZXh0LmphdmEsdiAxLjMgMjAwNS8wNC8wNSAyMDozNDoxNiBtazEyNTA5MCBFeHAgJAorICogJFJldmlzaW9uOiAxLjMgJAorICogJERhdGU6IDIwMDUvMDQvMDUgMjA6MzQ6MTYgJAorICovCisKKwogcGFja2FnZSBqYXZheC54bWwuc29hcDsKIAogLyoqCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvc29hcC9wYWNrYWdlLmh0bWwKaW5kZXggOTAyODgxNS4uOWZiYjA1ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3NvYXAvcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC9zb2FwL3BhY2thZ2UuaHRtbApAQCAtMSwzMSArMSwzMSBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgogPGh0bWw+CiA8aGVhZD4KLSAgIDwhLS0KLQotQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotCi1UaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLVRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci1hY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0yIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi1JbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0KLVBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLWhhdmUgYW55IHF1ZXN0aW9ucy4KLS0tPgorICAgCiAgIDx0aXRsZT48L3RpdGxlPgogCiA8L2hlYWQ+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvQWN0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4ZGEyMwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9BY3Rpb24uamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YXgueG1sLndzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3Npbmc7CisKKy8qKgorCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiBhbm5vdGF0aW9uIGFsbG93cyBleHBsaWNpdCBhc3NvY2lhdGlvbiBvZiBhCisgKiBXUy1BZGRyZXNzaW5nIDxjb2RlPkFjdGlvbjwvY29kZT4gbWVzc2FnZSBhZGRyZXNzaW5nIHByb3BlcnR5IHdpdGgKKyAqIDxjb2RlPmlucHV0PC9jb2RlPiwgPGNvZGU+b3V0cHV0PC9jb2RlPiwgYW5kCisgKiA8Y29kZT5mYXVsdDwvY29kZT4gbWVzc2FnZXMgb2YgdGhlIG1hcHBlZCBXU0RMIG9wZXJhdGlvbi4KKyAqIDxwPgorICogSW4gdGhpcyB2ZXJzaW9uIG9mIEpBWC1XUyB0aGVyZSBpcyBubyBzdGFuZGFyZCB3YXkgdG8gc3BlY2lmeQorICogPGNvZGU+QWN0aW9uPC9jb2RlPiB2YWx1ZXMgaW4gYSBXU0RMIGFuZCB0aGVyZSBpcyBubyBzdGFuZGFyZCBkZWZhdWx0IHZhbHVlLiAgSXQgaXMgaW50ZW5kZWQgdGhhdCwKKyAqIGFmdGVyIHRoZSBXM0MgV0cgb24gV1MtQWRkcmVzc2luZyBoYXMgZGVmaW5lZCB0aGVzZSBpdGVtcyBpbiBhIHJlY29tbWVuZGF0aW9uLAorICogYSBmdXR1cmUgdmVyc2lvbiBvZiBKQVgtV1Mgd2lsbCByZXF1aXJlIHRoZSBuZXcgc3RhbmRhcmRzLgorICoKKyAqIEBzZWUgQWRkcmVzc2luZworICogQHNlZSBGYXVsdEFjdGlvbgorICoKKyAqIEBzaW5jZSBKQVgtV1MgMi4xCisgKi8KKworQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKK3B1YmxpYyBAaW50ZXJmYWNlIEFjdGlvbiB7CisgICAgLyoqCisgICAgICogRXhwbGljaXQgdmFsdWUgb2YgdGhlIFdTLUFkZHJlc3NpbmcgPGNvZGU+QWN0aW9uPC9jb2RlPiBtZXNzYWdlIGFkZHJlc3NpbmcgcHJvcGVydHkgZm9yIHRoZSA8Y29kZT5pbnB1dDwvY29kZT4KKyAgICAgKiBtZXNzYWdlIG9mIHRoZSBvcGVyYXRpb24uCisgICAgICovCisgICAgU3RyaW5nIGlucHV0KCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIEV4cGxpY2l0IHZhbHVlIG9mIHRoZSBXUy1BZGRyZXNzaW5nIDxjb2RlPkFjdGlvbjwvY29kZT4gbWVzc2FnZSBhZGRyZXNzaW5nIHByb3BlcnR5IGZvciB0aGUgPGNvZGU+b3V0cHV0PC9jb2RlPgorICAgICAqIG1lc3NhZ2Ugb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBTdHJpbmcgb3V0cHV0KCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIEV4cGxpY2l0IHZhbHVlIG9mIHRoZSBXUy1BZGRyZXNzaW5nIDxjb2RlPkFjdGlvbjwvY29kZT4gbWVzc2FnZSBhZGRyZXNzaW5nIHByb3BlcnR5IGZvciB0aGUgPGNvZGU+ZmF1bHQ8L2NvZGU+CisgICAgICogbWVzc2FnZShzKSBvZiB0aGUgb3BlcmF0aW9uLiBFYWNoIGV4Y2VwdGlvbiB0aGF0IGlzIG1hcHBlZCB0byBhIGZhdWx0IGFuZCByZXF1aXJlcyBhbiBleHBsaWNpdCBXUy1BZGRyZXNzaW5nCisgICAgICogPGNvZGU+QWN0aW9uPC9jb2RlPiBtZXNzYWdlIGFkZHJlc3NpbmcgcHJvcGVydHksIG5lZWRzIHRvIGJlIHNwZWNpZmllZCBhcyBhIHZhbHVlIGluIHRoaXMgcHJvcGVydHkKKyAgICAgKiB1c2luZyB7QGxpbmsgRmF1bHRBY3Rpb259IGFubm90YXRpb24uCisgICAgICovCisgICAgRmF1bHRBY3Rpb25bXSBmYXVsdCgpIGRlZmF1bHQgeyB9OworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0FzeW5jSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0FzeW5jSGFuZGxlci5qYXZhCmluZGV4IGIxZmYzZGMuLmNjZDI1YzcgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9Bc3luY0hhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvQXN5bmNIYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0JpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9CaW5kaW5nLmphdmEKaW5kZXggMGM5OThlOS4uMGVhNjU4ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0JpbmRpbmcuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDYgKzI1LDcgQEAKIAogcGFja2FnZSBqYXZheC54bWwud3M7CiAKKwogLyoqIFRoZSA8Y29kZT5CaW5kaW5nPC9jb2RlPiBpbnRlcmZhY2UgaXMgdGhlIGJhc2UgaW50ZXJmYWNlCiAgKiAgZm9yIEpBWC1XUyBwcm90b2NvbCBiaW5kaW5ncy4KICAqCkBAIC0zMiwyMyArMzMsMzUgQEAKICoqLwogcHVibGljIGludGVyZmFjZSBCaW5kaW5nIHsKIAotICAvKiogR2V0cyBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgY2hhaW4gZm9yIGEgcHJvdG9jb2wgYmluZGluZyBpbnN0YW5jZS4KLSAgICogIElmIHRoZSByZXR1cm5lZCBjaGFpbiBpcyBtb2RpZmllZCBhIGNhbGwgdG8gPGNvZGU+c2V0SGFuZGxlckNoYWluPC9jb2RlPgotICAgKiBpcyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIGJpbmRpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgbmV3IGNoYWluLgotICAgKgotICAgKiAgQHJldHVybiBqYXZhLnV0aWwuTGlzdDxqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVySW5mbz4gSGFuZGxlciBjaGFpbgotICAqKi8KLSAgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbigpOworICAgLyoqCisgICAgKiBHZXRzIGEgY29weSBvZiB0aGUgaGFuZGxlciBjaGFpbiBmb3IgYSBwcm90b2NvbCBiaW5kaW5nIGluc3RhbmNlLgorICAgICogSWYgdGhlIHJldHVybmVkIGNoYWluIGlzIG1vZGlmaWVkIGEgY2FsbCB0byA8Y29kZT5zZXRIYW5kbGVyQ2hhaW48L2NvZGU+CisgICAgKiBpcyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIGJpbmRpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgbmV3IGNoYWluLgorICAgICoKKyAgICAqICBAcmV0dXJuIGphdmEudXRpbC5MaXN0Jmx0O0hhbmRsZXI+IEhhbmRsZXIgY2hhaW4KKyAgICAqLworICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyPiBnZXRIYW5kbGVyQ2hhaW4oKTsKIAotICAvKiogU2V0cyB0aGUgaGFuZGxlciBjaGFpbiBmb3IgdGhlIHByb3RvY29sIGJpbmRpbmcgaW5zdGFuY2UuCi0gICAqCi0gICAqICBAcGFyYW0gY2hhaW4gICAgQSBMaXN0IG9mIGhhbmRsZXIgY29uZmlndXJhdGlvbiBlbnRyaWVzCi0gICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gT24gYW4gZXJyb3IgaW4gdGhlIGNvbmZpZ3VyYXRpb24gb2YKLSAgICogICAgICAgICAgICAgICAgICB0aGUgaGFuZGxlciBjaGFpbgotICAgKiAgQHRocm93cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgdGhpcwotICAgKiAgICAgICAgICBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gVGhpcyBtYXkgYmUgZG9uZSB0bwotICAgKiAgICAgICAgICBhdm9pZCBhbnkgb3ZlcnJpZGluZyBvZiBhIHByZS1jb25maWd1cmVkIGhhbmRsZXIKLSAgICogICAgICAgICAgY2hhaW4uCi0gICoqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW4oamF2YS51dGlsLkxpc3Q8amF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcj4gY2hhaW4pOworICAgLyoqCisgICAgKiBTZXRzIHRoZSBoYW5kbGVyIGNoYWluIGZvciB0aGUgcHJvdG9jb2wgYmluZGluZyBpbnN0YW5jZS4KKyAgICAqCisgICAgKiAgQHBhcmFtIGNoYWluICAgIEEgTGlzdCBvZiBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gZW50cmllcworICAgICogIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBPbiBhbiBlcnJvciBpbiB0aGUgY29uZmlndXJhdGlvbiBvZgorICAgICogICAgICAgICAgICAgICAgICB0aGUgaGFuZGxlciBjaGFpbgorICAgICogIEB0aHJvd3MgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIElmIHRoaXMKKyAgICAqICAgICAgICAgIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIG1heSBiZSBkb25lIHRvCisgICAgKiAgICAgICAgICBhdm9pZCBhbnkgb3ZlcnJpZGluZyBvZiBhIHByZS1jb25maWd1cmVkIGhhbmRsZXIKKyAgICAqICAgICAgICAgIGNoYWluLgorICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluKGphdmEudXRpbC5MaXN0PGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI+IGNoYWluKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgVVJJIGZvciB0aGlzIGJpbmRpbmcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgYmluZGluZyBpZGVudGlmaWVyIGZvciB0aGUgcG9ydC4KKyAgICAgKiAgICBOZXZlciByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2luY2UgSkFYLVdTIDIuMQorICAgICAqLworICAgIFN0cmluZyBnZXRCaW5kaW5nSUQoKTsKIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9CaW5kaW5nUHJvdmlkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9CaW5kaW5nUHJvdmlkZXIuamF2YQppbmRleCA1ZDM1NTdmLi5kNmViNmExIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvQmluZGluZ1Byb3ZpZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0JpbmRpbmdQcm92aWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDc3ICsyNiw5OSBAQAogcGFja2FnZSBqYXZheC54bWwud3M7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIAotLyoqIFRoZSA8Y29kZT5CaW5kaW5nUHJvdmlkZXI8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCi0gKiAgcHJvdG9jb2wgYmluZGluZyBhbmQgYXNzb2NpYXRlZCBjb250ZXh0IG9iamVjdHMgZm9yIHJlcXVlc3QgYW5kCi0gKiAgcmVzcG9uc2UgbWVzc2FnZSBwcm9jZXNzaW5nLgorLyoqCisgKiBUaGUgPGNvZGU+QmluZGluZ1Byb3ZpZGVyPC9jb2RlPiBpbnRlcmZhY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorICogcHJvdG9jb2wgYmluZGluZyBhbmQgYXNzb2NpYXRlZCBjb250ZXh0IG9iamVjdHMgZm9yIHJlcXVlc3QgYW5kCisgKiByZXNwb25zZSBtZXNzYWdlIHByb2Nlc3NpbmcuCiAgKgotICogIEBzaW5jZSBKQVgtV1MgMi4wCisgKiBAc2luY2UgSkFYLVdTIDIuMAogICoKLSAqICBAc2VlIGphdmF4LnhtbC53cy5CaW5kaW5nCi0qKi8KKyAqIEBzZWUgamF2YXgueG1sLndzLkJpbmRpbmcKKyAqKi8KIHB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ1Byb3ZpZGVyIHsKLSAgICAvKiogU3RhbmRhcmQgcHJvcGVydHk6IFVzZXIgbmFtZSBmb3IgYXV0aGVudGljYXRpb24uCi0gICAgICogIDxwPlR5cGU6IGphdmEubGFuZy5TdHJpbmcKLSAgICAqKi8KKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBwcm9wZXJ0eTogVXNlciBuYW1lIGZvciBhdXRoZW50aWNhdGlvbi4KKyAgICAgKiA8cD5UeXBlOiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPgorICAgICAqKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSTkFNRV9QUk9QRVJUWSA9Ci0gICAgICAgICAgICAgICAgICAgICAgImphdmF4LnhtbC53cy5zZWN1cml0eS5hdXRoLnVzZXJuYW1lIjsKKyAgICAgICAgICAgICJqYXZheC54bWwud3Muc2VjdXJpdHkuYXV0aC51c2VybmFtZSI7CiAKLSAgICAvKiogU3RhbmRhcmQgcHJvcGVydHk6IFBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi4KLSAgICAgKiAgPHA+VHlwZTogamF2YS5sYW5nLlN0cmluZwotICAgICoqLworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBQYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb24uCisgICAgICogPHA+VHlwZTogPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4KKyAgICAgKiovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfUFJPUEVSVFkgPQotICAgICAgICAgICAgICAgICAgICAgICJqYXZheC54bWwud3Muc2VjdXJpdHkuYXV0aC5wYXNzd29yZCI7CisgICAgICAgICAgICAiamF2YXgueG1sLndzLnNlY3VyaXR5LmF1dGgucGFzc3dvcmQiOwogCi0gICAgLyoqIFN0YW5kYXJkIHByb3BlcnR5OiBUYXJnZXQgc2VydmljZSBlbmRwb2ludCBhZGRyZXNzLiBUaGUKLSAgICAgKiAgVVJJIHNjaGVtZSBmb3IgdGhlIGVuZHBvaW50IGFkZHJlc3Mgc3BlY2lmaWNhdGlvbiBtdXN0Ci0gICAgICogIGNvcnJlc3BvbmQgdG8gdGhlIHByb3RvY29sL3RyYW5zcG9ydCBiaW5kaW5nIGZvciB0aGUKLSAgICAgKiAgYmluZGluZyBpbiB1c2UuCi0gICAgICogIDxwPlR5cGU6IGphdmEubGFuZy5TdHJpbmcKLSAgICAqKi8KKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBwcm9wZXJ0eTogVGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQgYWRkcmVzcy4gVGhlCisgICAgICogVVJJIHNjaGVtZSBmb3IgdGhlIGVuZHBvaW50IGFkZHJlc3Mgc3BlY2lmaWNhdGlvbiBNVVNUCisgICAgICogY29ycmVzcG9uZCB0byB0aGUgcHJvdG9jb2wvdHJhbnNwb3J0IGJpbmRpbmcgZm9yIHRoZQorICAgICAqIGJpbmRpbmcgaW4gdXNlLgorICAgICAqIDxwPlR5cGU6IDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+CisgICAgICoqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkgPQotICAgICAgICAgICAgICAgICAgICAgICJqYXZheC54bWwud3Muc2VydmljZS5lbmRwb2ludC5hZGRyZXNzIjsKKyAgICAgICAgICAgICJqYXZheC54bWwud3Muc2VydmljZS5lbmRwb2ludC5hZGRyZXNzIjsKIAotICAgIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogVGhpcyBib29sZWFuIHByb3BlcnR5IGlzIHVzZWQgYnkgYSBzZXJ2aWNlCi0gICAgICogIGNsaWVudCB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCBpdCB3YW50cyB0byBwYXJ0aWNpcGF0ZSBpbgotICAgICAqICBhIHNlc3Npb24gd2l0aCBhIHNlcnZpY2UgZW5kcG9pbnQuIElmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvCi0gICAgICogIHRydWUsIHRoZSBzZXJ2aWNlIGNsaWVudCBpbmRpY2F0ZXMgdGhhdCBpdCB3YW50cyB0aGUgc2Vzc2lvbgotICAgICAqICB0byBiZSBtYWludGFpbmVkLiBJZiBzZXQgdG8gZmFsc2UsIHRoZSBzZXNzaW9uIGlzIG5vdCBtYWludGFpbmVkLgotICAgICAqICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSBpcyBmYWxzZS4KLSAgICAgKiAgPHA+VHlwZTogamF2YS5sYW5nLkJvb2xlYW4KLSAgICAqKi8KKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBwcm9wZXJ0eTogVGhpcyBib29sZWFuIHByb3BlcnR5IGlzIHVzZWQgYnkgYSBzZXJ2aWNlCisgICAgICogY2xpZW50IHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IGl0IHdhbnRzIHRvIHBhcnRpY2lwYXRlIGluCisgICAgICogYSBzZXNzaW9uIHdpdGggYSBzZXJ2aWNlIGVuZHBvaW50LiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0bworICAgICAqIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgc2VydmljZSBjbGllbnQgaW5kaWNhdGVzIHRoYXQgaXQgd2FudHMgdGhlIHNlc3Npb24KKyAgICAgKiB0byBiZSBtYWludGFpbmVkLiBJZiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgc2Vzc2lvbiBpcyBub3QgbWFpbnRhaW5lZC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogPHA+VHlwZTogPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+CisgICAgICoqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFkgPQotICAgICAgICAgICAgICAgICAgICAgICJqYXZheC54bWwud3Muc2Vzc2lvbi5tYWludGFpbiI7CisgICAgICAgICAgICAiamF2YXgueG1sLndzLnNlc3Npb24ubWFpbnRhaW4iOwogCi0gICAgLyoqIFN0YW5kYXJkIHByb3BlcnR5IGZvciBTT0FQQWN0aW9uLiBUaGlzIGJvb2xlYW4gcHJvcGVydHkKLSAgICAgKiAgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IFNPQVBBY3Rpb24gaXMgdG8gYmUgdXNlZC4gVGhlCi0gICAgICogIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyBmYWxzZSBpbmRpY2F0aW5nIHRoYXQKLSAgICAgKiAgdGhlIFNPQVBBY3Rpb24gaXMgbm90IHVzZWQuCi0gICAgICogIDxwPlR5cGU6IDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPgotICAgICoqLworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5IGZvciBTT0FQQWN0aW9uLiBUaGlzIGJvb2xlYW4gcHJvcGVydHkKKyAgICAgKiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqIDxjb2RlPmphdmF4LnhtbC53cy5zb2FwLmh0dHAuc29hcGFjdGlvbi51cmk8L2NvZGU+IHByb3BlcnR5CisgICAgICogaXMgdXNlZCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBTT0FQQWN0aW9uLiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGluZGljYXRpbmcKKyAgICAgKiB0aGF0IHRoZQorICAgICAqIDxjb2RlPmphdmF4LnhtbC53cy5zb2FwLmh0dHAuc29hcGFjdGlvbi51cmk8L2NvZGU+IHByb3BlcnR5CisgICAgICogaXMgbm90IHVzZWQgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgU09BUEFjdGlvbiwgaG93ZXZlciwKKyAgICAgKiBpZiBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiA8Y29kZT5qYXZhLmxhbmcuQm9vbGVhbjwvY29kZT4KKyAgICAgKiovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUEFDVElPTl9VU0VfUFJPUEVSVFkgPQotICAgICAgICAgICAgICAgICAgICAgICJqYXZheC54bWwud3Muc29hcC5odHRwLnNvYXBhY3Rpb24udXNlIjsKKyAgICAgICAgICAgICJqYXZheC54bWwud3Muc29hcC5odHRwLnNvYXBhY3Rpb24udXNlIjsKIAotICAgIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eSBmb3IgU09BUEFjdGlvbi4gSW5kaWNhdGVzIHRoZSBTT0FQQWN0aW9uCi0gICAgICogIFVSSSBpZiB0aGUgPGNvZGU+amF2YXgueG1sLndzLnNvYXAuaHR0cC5zb2FwYWN0aW9uLnVzZTwvY29kZT4KLSAgICAgKiAgcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqICA8cD5UeXBlOiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPgotICAgICoqLworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5IGZvciBTT0FQQWN0aW9uLiBJbmRpY2F0ZXMgdGhlIFNPQVBBY3Rpb24KKyAgICAgKiBVUkkgaWYgdGhlIDxjb2RlPmphdmF4LnhtbC53cy5zb2FwLmh0dHAuc29hcGFjdGlvbi51c2U8L2NvZGU+CisgICAgICogcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LiBJZiBXUy1BZGRyZXNzaW5nCisgICAgICogaXMgZW5hYmxlZCwgdGhpcyB2YWx1ZSB3aWxsIGFsc28gYmUgdXNlZCBmb3IgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqIFdTLUFkZHJlc3NpbmcgQWN0aW9uIGhlYWRlci4gIElmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNldCwKKyAgICAgKiB0aGUgZGVmYXVsdCBTT0FQQWN0aW9uIGFuZCBXUy1BZGRyZXNzaW5nIEFjdGlvbiB3aWxsIGJlIHNlbnQuCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPgorICAgICAqKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSA9Ci0gICAgICAgICAgICAgICAgICAgICAgImphdmF4LnhtbC53cy5zb2FwLmh0dHAuc29hcGFjdGlvbi51cmkiOworICAgICAgICAgICAgImphdmF4LnhtbC53cy5zb2FwLmh0dHAuc29hcGFjdGlvbi51cmkiOwogCi0gICAgLyoqIEdldCB0aGUgY29udGV4dCB0aGF0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogIGZvciByZXF1ZXN0IG1lc3NhZ2VzLgorICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGV4dCB0aGF0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjb250ZXh0CisgICAgICogZm9yIHJlcXVlc3QgbWVzc2FnZXMuCiAgICAgICoKICAgICAgKiBNb2RpZmljYXRpb25zIHRvIHRoZSByZXF1ZXN0IGNvbnRleHQgZG8gbm90IGFmZmVjdCB0aGUgbWVzc2FnZSBjb250ZXh0IG9mCiAgICAgICogZWl0aGVyIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4KICAgICAgKiBzdGFydGVkLgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgY29udGV4dCB0aGF0IGlzIHVzZWQgaW4gcHJvY2Vzc2luZyByZXF1ZXN0IG1lc3NhZ2VzLgotICAgICoqLworICAgICAqKi8KICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFJlcXVlc3RDb250ZXh0KCk7CiAKLSAgICAvKiogR2V0IHRoZSBjb250ZXh0IHRoYXQgcmVzdWx0ZWQgZnJvbSBwcm9jZXNzaW5nIGEgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRleHQgdGhhdCByZXN1bHRlZCBmcm9tIHByb2Nlc3NpbmcgYSByZXNwb25zZSBtZXNzYWdlLgogICAgICAqCiAgICAgICogVGhlIHJldHVybmVkIGNvbnRleHQgaXMgZm9yIHRoZSBtb3N0IHJlY2VudGx5IGNvbXBsZXRlZCBzeW5jaHJvbm91cwogICAgICAqIG9wZXJhdGlvbi4gU3Vic2VxdWVudCBzeW5jaHJvbm91cyBvcGVyYXRpb24gaW52b2NhdGlvbnMgb3ZlcndyaXRlIHRoZQpAQCAtMTA1LDEyICsxMjcsNTcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIGNvbnRleHQgdGhhdCByZXN1bHRlZCBmcm9tIHByb2Nlc3NpbmcgdGhlIGxhdGVzdAogICAgICAqIHJlc3BvbnNlIG1lc3NhZ2VzLgotICAgICoqLworICAgICAqKi8KICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFJlc3BvbnNlQ29udGV4dCgpOwogCi0gICAgLyoqIEdldCB0aGUgQmluZGluZyBmb3IgdGhpcyBiaW5kaW5nIHByb3ZpZGVyLgorICAgIC8qKgorICAgICAqIEdldCB0aGUgQmluZGluZyBmb3IgdGhpcyBiaW5kaW5nIHByb3ZpZGVyLgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgQmluZGluZyBmb3IgdGhpcyBiaW5kaW5nIHByb3ZpZGVyLgotICAgICoqLworICAgICAqKi8KICAgICBCaW5kaW5nIGdldEJpbmRpbmcoKTsKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyA8Y29kZT5CaW5kaW5nUHJvdmlkZXI8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBCaW5kaW5nIGZvciB0aGlzIDxjb2RlPmJpbmRpbmdQcm92aWRlcjwvY29kZT4gaXMKKyAgICAgKiBlaXRoZXIgU09BUDEuMS9IVFRQIG9yIFNPQVAxLjIvSFRUUCwgdGhlbiBhCisgICAgICogPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IE1VU1QgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEVuZHBvaW50UmVmZXJlbmNlIG9mIHRoZSB0YXJnZXQgZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiA8Y29kZT5CaW5kaW5nUHJvdmlkZXI8L2NvZGU+IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgdGhpcworICAgICAqIDxjb2RlPkJpbmRpbmdQcm92aWRlcjwvY29kZT4gdXNlcyB0aGUgWE1ML0hUVFAgYmluZGluZy4KKyAgICAgKgorICAgICAqIEBzZWUgVzNDRW5kcG9pbnRSZWZlcmVuY2UKKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgICovCisgICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVuZHBvaW50UmVmZXJlbmNlKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIDxjb2RlPkJpbmRpbmdQcm92aWRlcjwvY29kZT4gaW5zdGFuY2UuICBUaGUgaW5zdGFuY2UKKyAgICAgKiByZXR1cm5lZCB3aWxsIGJlIG9mIHR5cGUgPGNvZGU+Y2xheno8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IFNwZWNpZmllcyB0aGUgdHlwZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4KKyAgICAgKiB0aGF0IE1VU1QgYmUgcmV0dXJuZWQuCisKKyAgICAgKiBAcmV0dXJuIEVuZHBvaW50UmVmZXJlbmNlIG9mIHRoZSB0YXJnZXQgZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiA8Y29kZT5CaW5kaW5nUHJvdmlkZXI8L2NvZGU+IGluc3RhbmNlLiBNVVNUIGJlIG9mIHR5cGUKKyAgICAgKiA8Y29kZT5jbGF6ejwvY29kZT4uCisKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgdGhlIENsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPgorICAgICAqIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiB0aGlzCisgICAgICogPGNvZGU+QmluZGluZ1Byb3ZpZGVyPC9jb2RlPiB1c2VzIHRoZSBYTUwvSFRUUCBiaW5kaW5nLgorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gVCBnZXRFbmRwb2ludFJlZmVyZW5jZShDbGFzczxUPiBjbGF6eik7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvQmluZGluZ1R5cGUuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9CaW5kaW5nVHlwZS5qYXZhCmluZGV4IGRhMWYyM2MuLjA0YzkzNTIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9CaW5kaW5nVHlwZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9CaW5kaW5nVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9EaXNwYXRjaC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0Rpc3BhdGNoLmphdmEKaW5kZXggMTJjZTZkMy4uNTZlNjkzYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0Rpc3BhdGNoLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0Rpc3BhdGNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTgsNyArNTgsNyBAQAogICAgICAqICBtZXRob2QgcmV0dXJucyB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0byB0aGUgb3BlcmF0aW9uCiAgICAgICogIGludm9jYXRpb24sIHRoZSByZXN1bHRzIG9mIHRoZSBvcGVyYXRpb24gYXJlIG9idGFpbmVkIGJ5IHBvbGxpbmcgdGhlCiAgICAgICogIHJldHVybmVkIDxjb2RlPlJlc3BvbnNlPC9jb2RlPi4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIDxjb2RlPm1zZzwvY29kZT4gb2JqZWN0CiAgICAgICogd2hlbiBtYXJzaGFsbGVkIGlzIGZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgcHJvdG9jb2wKICAgICAgKiBiaW5kaW5nIGluIHVzZS4KQEAgLTc1LDggKzc1LDggQEAKICAgICAvKiogSW52b2tlIGEgc2VydmljZSBvcGVyYXRpb24gYXN5bmNocm9ub3VzbHkuIFRoZQogICAgICAqICBtZXRob2QgcmV0dXJucyB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0byB0aGUgb3BlcmF0aW9uCiAgICAgICogIGludm9jYXRpb24sIHRoZSByZXN1bHRzIG9mIHRoZSBvcGVyYXRpb24gYXJlIGNvbW11bmljYXRlZCB0byB0aGUgY2xpZW50Ci0gICAgICogIHZpYSB0aGUgcGFzc2VkIGluIGhhbmRsZXIuCi0gICAgICoKKyAgICAgKiAgdmlhIHRoZSBwYXNzZWQgaW4gPGNvZGU+aGFuZGxlcjwvY29kZT4uCisgICAgICogPHA+CiAgICAgICogVGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgPGNvZGU+bXNnPC9jb2RlPiBvYmplY3QKICAgICAgKiB3aGVuIG1hcnNoYWxsZWQgaXMgZm9ybWVkIGFjY29yZGluZyB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBwcm90b2NvbAogICAgICAqIGJpbmRpbmcgaW4gdXNlLgpAQCAtODYsOSArODYsOSBAQAogICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUKICAgICAgKiAgICAgcmVzcG9uc2UgdG8gdGhlIG9wZXJhdGlvbiBpbnZvY2F0aW9uLgogICAgICAqIEByZXR1cm4gQSA8Y29kZT5GdXR1cmU8L2NvZGU+IG9iamVjdCB0aGF0IG1heSBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMKLSAgICAgKiAgICAgb2YgdGhlIG9wZXJhdGlvbiBpbnZvY2F0aW9uLiBUaGlzIG9iamVjdCBtdXN0IG5vdCBiZSB1c2VkIHRvIHRyeSB0bworICAgICAqICAgICBvZiB0aGUgb3BlcmF0aW9uIGludm9jYXRpb24uIFRoaXMgb2JqZWN0IE1VU1QgTk9UIGJlIHVzZWQgdG8gdHJ5IHRvCiAgICAgICogICAgIG9idGFpbiB0aGUgcmVzdWx0cyBvZiB0aGUgb3BlcmF0aW9uIC0gdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tCi0gICAgICogICAgIDxjb2RlPkZ1dHVyZTw/Pi5nZXQoKTwvY29kZT4gaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50CisgICAgICogICAgIDxjb2RlPkZ1dHVyZSZsdDs/Pi5nZXQoKTwvY29kZT4gaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50CiAgICAgICogICAgIGFuZCBhbnkgdXNlIG9mIGl0IHdpbGwgcmVzdWx0IGluIG5vbi1wb3J0YWJsZSBiZWhhdmlvdXIuCiAgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFueSBlcnJvciBpbiB0aGUgY29uZmlndXJhdGlvbiBvZgogICAgICAqICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IGluc3RhbmNlCkBAIC05OSw5ICs5OSw5IEBACiAgICAgICogIGludGVyYWN0aW9uIG1vZGUuIFRoZSBvcGVyYXRpb24gaW52b2NhdGlvbiBpcyBsb2dpY2FsbHkgbm9uLWJsb2NraW5nLAogICAgICAqICBzdWJqZWN0IHRvIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wsIG5vIHJlc3VsdHMKICAgICAgKiAgYXJlIHJldHVybmVkLiBXaGVuCi0gICAgICogIHRoZSBwcm90b2NvbCBpbiB1c2UgaXMgU09BUC9IVFRQLCB0aGlzIG1ldGhvZCBtdXN0IGJsb2NrIHVudGlsCisgICAgICogIHRoZSBwcm90b2NvbCBpbiB1c2UgaXMgU09BUC9IVFRQLCB0aGlzIG1ldGhvZCBNVVNUIGJsb2NrIHVudGlsCiAgICAgICogIGFuIEhUVFAgcmVzcG9uc2UgY29kZSBoYXMgYmVlbiByZWNlaXZlZCBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSA8Y29kZT5tc2c8L2NvZGU+IG9iamVjdAogICAgICAqIHdoZW4gbWFyc2hhbGxlZCBpcyBmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHByb3RvY29sCiAgICAgICogYmluZGluZyBpbiB1c2UuCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvRW5kcG9pbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9FbmRwb2ludC5qYXZhCmluZGV4IDdiNzlmY2UuLjY3MDE1MjIgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9FbmRwb2ludC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9FbmRwb2ludC5qYXZhCkBAIC0yOCw2ICsyOCw5IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZheC54bWwud3Muc3BpLlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKwogCiAvKioKICAqIEEgV2ViIHNlcnZpY2UgZW5kcG9pbnQuCkBAIC01NCw3ICs1Nyw3IEBACiAgKiA8cD5BbiBlbmRwb2ludCBtYXkgaGF2ZSBhIGxpc3Qgb2YgbWV0YWRhdGEgZG9jdW1lbnRzLCBzdWNoIGFzIFdTREwKICAqIGFuZCBYTUxTY2hlbWEgZG9jdW1lbnRzLCBib3VuZCB0byBpdC4gQXQgcHVibGlzaGluZyB0aW1lLCB0aGUKICAqIEpBWC1XUyBpbXBsZW1lbnRhdGlvbiB3aWxsIHRyeSB0byByZXVzZSBhcyBtdWNoIG9mIHRoYXQgbWV0YWRhdGEKLSAqIGFzIHBvc3NpYmxlIGluc3RlYWQgb2YgZ2VuZXJhdGluZyBuZXcgb25lIGJhc2VkIG9uIHRoZSBhbm5vdGF0aW9ucworICogYXMgcG9zc2libGUgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIG5ldyBvbmVzIGJhc2VkIG9uIHRoZSBhbm5vdGF0aW9ucwogICogcHJlc2VudCBvbiB0aGUgaW1wbGVtZW50b3IuCiAgKgogICogQHNpbmNlIEpBWC1XUyAyLjAKQEAgLTY0LDIwOSArNjcsMjI1IEBACiAgKiBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nCiAgKiBAc2VlIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yCiAgKgotKiovCisgKiovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW5kcG9pbnQgewogCi0gIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogbmFtZSBvZiBXU0RMIHNlcnZpY2UuCi0gICAqICA8cD5UeXBlOiBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lCi0gICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9TRVJWSUNFID0gImphdmF4LnhtbC53cy53c2RsLnNlcnZpY2UiOworICAgIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogbmFtZSBvZiBXU0RMIHNlcnZpY2UuCisgICAgICogIDxwPlR5cGU6IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9TRVJWSUNFID0gImphdmF4LnhtbC53cy53c2RsLnNlcnZpY2UiOwogCi0gIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogbmFtZSBvZiBXU0RMIHBvcnQuCi0gICAqICA8cD5UeXBlOiBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lCi0gICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9QT1JUID0gImphdmF4LnhtbC53cy53c2RsLnBvcnQiOworICAgIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogbmFtZSBvZiBXU0RMIHBvcnQuCisgICAgICogIDxwPlR5cGU6IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9QT1JUID0gImphdmF4LnhtbC53cy53c2RsLnBvcnQiOwogCiAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZW5kcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGltcGxlbWVudG9yIG9iamVjdC4gSWYgdGhlcmUgaXMKLSAgICogYSBiaW5kaW5nIHNwZWNpZmllZCB2aWEgYSBCaW5kaW5nVHlwZSBhbm5vdGF0aW9uIHRoZW4gaXQgTVVTVCBiZSB1c2VkIGVsc2UKLSAgICogYSBkZWZhdWx0IG9mIFNPQVAgMS4xIC8gSFRUUCBiaW5kaW5nIE1VU1QgYmUgdXNlZC4KLSAgICogPHA+Ci0gICAqIFRoZSBuZXdseSBjcmVhdGVkIGVuZHBvaW50IG1heSBiZSBwdWJsaXNoZWQgYnkgY2FsbGluZwotICAgKiBvbmUgb2YgdGhlIGphdmF4LnhtbC53cy5FbmRwb2ludCNwdWJsaXNoKFN0cmluZykgYW5kCi0gICAqIGphdmF4LnhtbC53cy5FbmRwb2ludCNwdWJsaXNoKE9iamVjdCkgbWV0aG9kcy4KLSAgICoKLSAgICoKLSAgICogQHBhcmFtIGltcGxlbWVudG9yIFRoZSBlbmRwb2ludCBpbXBsZW1lbnRvci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBlbmRwb2ludC4KLSAgICoKLSAgICoqLwotICBwdWJsaWMgc3RhdGljIEVuZHBvaW50IGNyZWF0ZShPYmplY3QgaW1wbGVtZW50b3IpIHsKLSAgICByZXR1cm4gY3JlYXRlKG51bGwsIGltcGxlbWVudG9yKTsKLSAgfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gZW5kcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGltcGxlbWVudG9yIG9iamVjdC4gSWYgdGhlcmUgaXMKKyAgICAgKiBhIGJpbmRpbmcgc3BlY2lmaWVkIHZpYSBhIEJpbmRpbmdUeXBlIGFubm90YXRpb24gdGhlbiBpdCBNVVNUIGJlIHVzZWQgZWxzZQorICAgICAqIGEgZGVmYXVsdCBvZiBTT0FQIDEuMSAvIEhUVFAgYmluZGluZyBNVVNUIGJlIHVzZWQuCisgICAgICogPHA+CisgICAgICogVGhlIG5ld2x5IGNyZWF0ZWQgZW5kcG9pbnQgbWF5IGJlIHB1Ymxpc2hlZCBieSBjYWxsaW5nCisgICAgICogb25lIG9mIHRoZSB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50I3B1Ymxpc2goU3RyaW5nKX0gYW5kCisgICAgICoge0BsaW5rIGphdmF4LnhtbC53cy5FbmRwb2ludCNwdWJsaXNoKE9iamVjdCl9IG1ldGhvZHMuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbXBsZW1lbnRvciBUaGUgZW5kcG9pbnQgaW1wbGVtZW50b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGVuZHBvaW50LgorICAgICAqCisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnQgY3JlYXRlKE9iamVjdCBpbXBsZW1lbnRvcikgeworICAgICAgICByZXR1cm4gY3JlYXRlKG51bGwsIGltcGxlbWVudG9yKTsKKyAgICB9CiAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZW5kcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGJpbmRpbmcgdHlwZSBhbmQKLSAgICogaW1wbGVtZW50b3Igb2JqZWN0LgotICAgKiA8cD4KLSAgICogVGhlIG5ld2x5IGNyZWF0ZWQgZW5kcG9pbnQgbWF5IGJlIHB1Ymxpc2hlZCBieSBjYWxsaW5nCi0gICAqIG9uZSBvZiB0aGUgamF2YXgueG1sLndzLkVuZHBvaW50I3B1Ymxpc2goU3RyaW5nKSBhbmQKLSAgICogamF2YXgueG1sLndzLkVuZHBvaW50I3B1Ymxpc2goT2JqZWN0KSBtZXRob2RzLgotICAgKgotICAgKiBAcGFyYW0gYmluZGluZ0lkIEEgVVJJIHNwZWNpZnlpbmcgdGhlIGJpbmRpbmcgdG8gdXNlLiBJZiB0aGUgYmluZGluZ0lEIGlzCi0gICAqIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBubyBiaW5kaW5nIGlzIHNwZWNpZmllZCB2aWEgYSBCaW5kaW5nVHlwZQotICAgKiBhbm5vdGF0aW9uIHRoZW4gYSBkZWZhdWx0IFNPQVAgMS4xIC8gSFRUUCBiaW5kaW5nIE1VU1QgYmUgdXNlZC4KLSAgICoKLSAgICogQHBhcmFtIGltcGxlbWVudG9yIFRoZSBlbmRwb2ludCBpbXBsZW1lbnRvci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBlbmRwb2ludC4KLSAgICoKLSAgICoqLwotICBwdWJsaWMgc3RhdGljIEVuZHBvaW50IGNyZWF0ZShTdHJpbmcgYmluZGluZ0lkLCBPYmplY3QgaW1wbGVtZW50b3IpIHsKLSAgICByZXR1cm4gUHJvdmlkZXIucHJvdmlkZXIoKS5jcmVhdGVFbmRwb2ludChiaW5kaW5nSWQsIGltcGxlbWVudG9yKTsKLSAgfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gZW5kcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGJpbmRpbmcgdHlwZSBhbmQKKyAgICAgKiBpbXBsZW1lbnRvciBvYmplY3QuCisgICAgICogPHA+CisgICAgICogVGhlIG5ld2x5IGNyZWF0ZWQgZW5kcG9pbnQgbWF5IGJlIHB1Ymxpc2hlZCBieSBjYWxsaW5nCisgICAgICogb25lIG9mIHRoZSB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50I3B1Ymxpc2goU3RyaW5nKX0gYW5kCisgICAgICoge0BsaW5rIGphdmF4LnhtbC53cy5FbmRwb2ludCNwdWJsaXNoKE9iamVjdCl9IG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZ0lkIEEgVVJJIHNwZWNpZnlpbmcgdGhlIGJpbmRpbmcgdG8gdXNlLiBJZiB0aGUgYmluZGluZ0lEIGlzCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gYW5kIG5vIGJpbmRpbmcgaXMgc3BlY2lmaWVkIHZpYSBhIEJpbmRpbmdUeXBlCisgICAgICogYW5ub3RhdGlvbiB0aGVuIGEgZGVmYXVsdCBTT0FQIDEuMSAvIEhUVFAgYmluZGluZyBNVVNUIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50b3IgVGhlIGVuZHBvaW50IGltcGxlbWVudG9yLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBlbmRwb2ludC4KKyAgICAgKgorICAgICAqKi8KKyAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50IGNyZWF0ZShTdHJpbmcgYmluZGluZ0lkLCBPYmplY3QgaW1wbGVtZW50b3IpIHsKKyAgICAgICAgcmV0dXJuIFByb3ZpZGVyLnByb3ZpZGVyKCkuY3JlYXRlRW5kcG9pbnQoYmluZGluZ0lkLCBpbXBsZW1lbnRvcik7CisgICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGlzIGVuZHBvaW50LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBiaW5kaW5nIGZvciB0aGlzIGVuZHBvaW50Ci0gICoqLwotICBwdWJsaWMgYWJzdHJhY3QgQmluZGluZyBnZXRCaW5kaW5nKCk7CiAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdCBmb3IgdGhpcyBlbmRwb2ludC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgaW1wbGVtZW50b3IgZm9yIHRoaXMgZW5kcG9pbnQKLSAgKiovCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0SW1wbGVtZW50b3IoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGlzIGVuZHBvaW50LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgYmluZGluZyBmb3IgdGhpcyBlbmRwb2ludAorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQmluZGluZyBnZXRCaW5kaW5nKCk7CiAKLSAgLyoqCi0gICAqIFB1Ymxpc2hlcyB0aGlzIGVuZHBvaW50IGF0IHRoZSBnaXZlbiBhZGRyZXNzLgotICAgKiBUaGUgbmVjZXNzYXJ5IHNlcnZlciBpbmZyYXN0cnVjdHVyZSB3aWxsIGJlIGNyZWF0ZWQgYW5kCi0gICAqIGNvbmZpZ3VyZWQgYnkgdGhlIEpBWC1XUyBpbXBsZW1lbnRhdGlvbiB1c2luZyBzb21lIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KLSAgICogSW4gb3JkZXIgdG8gZ2V0IG1vcmUgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiwgcGxlYXNlCi0gICAqIHVzZSB0aGUgamF2YXgueG1sLndzLkVuZHBvaW50I3B1Ymxpc2goT2JqZWN0KSBtZXRob2QgaW5zdGVhZC4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgQSBVUkkgc3BlY2lmeWluZyB0aGUgYWRkcmVzcyB0byB1c2UuIFRoZSBhZGRyZXNzCi0gICAqICAgICAgICBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgYmluZGluZyBzcGVjaWZpZWQgYXQgdGhlCi0gICAqICAgICAgICB0aW1lIHRoZSBlbmRwb2ludCB3YXMgY3JlYXRlZC4KLSAgICoKLSAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAqICAgICAgICAgICAgICBJZiB0aGUgcHJvdmlkZWQgYWRkcmVzcyBVUkkgaXMgbm90IHVzYWJsZQotICAgKiAgICAgICAgICAgICAgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZW5kcG9pbnQncyBiaW5kaW5nLgotICAgKgotICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICogICAgICAgICBJZiB0aGUgZW5kcG9pbnQgaGFzIGJlZW4gcHVibGlzaGVkIGFscmVhZHkgb3IgaXQgaGFzIGJlZW4gc3RvcHBlZC4KLSAgKiovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1Ymxpc2goU3RyaW5nIGFkZHJlc3MpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdCBmb3IgdGhpcyBlbmRwb2ludC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGltcGxlbWVudG9yIGZvciB0aGlzIGVuZHBvaW50CisgICAgICoqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0SW1wbGVtZW50b3IoKTsKIAotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcHVibGlzaGVzIGFuIGVuZHBvaW50IGZvciB0aGUgc3BlY2lmaWVkIGltcGxlbWVudG9yCi0gICAqIG9iamVjdCBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4KLSAgICogPHA+Ci0gICAqIFRoZSBuZWNlc3Nhcnkgc2VydmVyIGluZnJhc3RydWN0dXJlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgICogY29uZmlndXJlZCBieSB0aGUgSkFYLVdTIGltcGxlbWVudGF0aW9uIHVzaW5nIHNvbWUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgotICAgKgotICAgKiBJbiBvcmRlciB0byBnZXQgbW9yZSBjb250cm9sIG92ZXIgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLCBwbGVhc2UKLSAgICogdXNlIHRoZSBqYXZheC54bWwud3MuRW5kcG9pbnQjY3JlYXRlKFN0cmluZyxPYmplY3QpIGFuZAotICAgKiBqYXZheC54bWwud3MuRW5kcG9pbnQjcHVibGlzaChPYmplY3QpIG1ldGhvZCBpbnN0ZWFkLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBBIFVSSSBzcGVjaWZ5aW5nIHRoZSBhZGRyZXNzIGFuZCB0cmFuc3BvcnQvcHJvdG9jb2wKLSAgICogICAgICAgIHRvIHVzZS4gQSBodHRwOiBVUkkgbXVzdCByZXN1bHQgaW4gdGhlIFNPQVAgMS4xL0hUVFAKLSAgICogICAgICAgIGJpbmRpbmcgYmVpbmcgdXNlZC4gSW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0IG90aGVyCi0gICAqICAgICAgICBVUkkgc2NoZW1lcy4KLSAgICogQHBhcmFtIGltcGxlbWVudG9yIFRoZSBlbmRwb2ludCBpbXBsZW1lbnRvci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBlbmRwb2ludC4KLSAgICoKLSAgICoqLwotICBwdWJsaWMgc3RhdGljIEVuZHBvaW50IHB1Ymxpc2ggKFN0cmluZyBhZGRyZXNzLCBPYmplY3QgaW1wbGVtZW50b3IpIHsKLSAgICByZXR1cm4gUHJvdmlkZXIucHJvdmlkZXIoKS5jcmVhdGVBbmRQdWJsaXNoRW5kcG9pbnQoYWRkcmVzcywgaW1wbGVtZW50b3IpOwotICB9CisgICAgLyoqCisgICAgICogUHVibGlzaGVzIHRoaXMgZW5kcG9pbnQgYXQgdGhlIGdpdmVuIGFkZHJlc3MuCisgICAgICogVGhlIG5lY2Vzc2FyeSBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUgd2lsbCBiZSBjcmVhdGVkIGFuZAorICAgICAqIGNvbmZpZ3VyZWQgYnkgdGhlIEpBWC1XUyBpbXBsZW1lbnRhdGlvbiB1c2luZyBzb21lIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAgICAgKiBJbiBvcmRlciB0byBnZXQgbW9yZSBjb250cm9sIG92ZXIgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLCBwbGVhc2UKKyAgICAgKiB1c2UgdGhlIHtAbGluayBqYXZheC54bWwud3MuRW5kcG9pbnQjcHVibGlzaChPYmplY3QpfSBtZXRob2QgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIEEgVVJJIHNwZWNpZnlpbmcgdGhlIGFkZHJlc3MgdG8gdXNlLiBUaGUgYWRkcmVzcworICAgICAqICAgICAgICBNVVNUIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgYmluZGluZyBzcGVjaWZpZWQgYXQgdGhlCisgICAgICogICAgICAgIHRpbWUgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgSWYgdGhlIHByb3ZpZGVkIGFkZHJlc3MgVVJJIGlzIG5vdCB1c2FibGUKKyAgICAgKiAgICAgICAgICBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBlbmRwb2ludCdzIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICBJZiB0aGUgZW5kcG9pbnQgaGFzIGJlZW4gcHVibGlzaGVkIGFscmVhZHkgb3IgaXQgaGFzIGJlZW4gc3RvcHBlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICAgSWYgYSA8Y29kZT5qYXZhLmxhbmcuU2VjdXJpdHlNYW5nZXI8L2NvZGU+CisgICAgICogICAgICAgICAgaXMgYmVpbmcgdXNlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIGRvZXNuJ3QgaGF2ZSB0aGUKKyAgICAgKiAgICAgICAgICA8Y29kZT5XZWJTZXJ2aWNlUGVybWlzc2lvbigicHVibGlzaEVuZHBvaW50Iik8L2NvZGU+IHBlcm1pc3Npb24uCisgICAgICoqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1Ymxpc2goU3RyaW5nIGFkZHJlc3MpOwogCi0gIC8qKgotICAgKiBQdWJsaXNoZXMgdGhpcyBlbmRwb2ludCBhdCB0aGUgcHJvdmlkZWQgc2VydmVyIGNvbnRleHQuCi0gICAqIEEgc2VydmVyIGNvbnRleHQgZW5jYXBzdWxhdGVzIHRoZSBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUKLSAgICogYW5kIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciB0cmFuc3BvcnQuCi0gICAqIEZvciBhIGNhbGwgdG8gdGhpcyBtZXRob2QgdG8gc3VjY2VlZCwgdGhlIHNlcnZlciBjb250ZXh0Ci0gICAqIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBpdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKLSAgICogZW5kcG9pbnQncyBiaW5kaW5nLgotICAgKgotICAgKiBAcGFyYW0gc2VydmVyQ29udGV4dCBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgc2VydmVyCi0gICAqICAgICAgICAgICBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHB1Ymxpc2hpbmcgdGhlIGVuZHBvaW50LgotICAgKgotICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICogICAgICAgICAgICAgIElmIHRoZSBwcm92aWRlZCBzZXJ2ZXIgY29udGV4dCBpcyBub3QKLSAgICogICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb3IgdHVybnMKLSAgICogICAgICAgICAgICAgIG91dCB0byBiZSB1bnVzYWJsZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kcG9pbnQncyBiaW5kaW5nLgotICAgKgotICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICogICAgICAgICBJZiB0aGUgZW5kcG9pbnQgaGFzIGJlZW4gcHVibGlzaGVkIGFscmVhZHkgb3IgaXQgaGFzIGJlZW4gc3RvcHBlZC4KLSAgKiovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1Ymxpc2goT2JqZWN0IHNlcnZlckNvbnRleHQpOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIHB1Ymxpc2hlcyBhbiBlbmRwb2ludCBmb3IgdGhlIHNwZWNpZmllZCBpbXBsZW1lbnRvcgorICAgICAqIG9iamVjdCBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmVjZXNzYXJ5IHNlcnZlciBpbmZyYXN0cnVjdHVyZSB3aWxsIGJlIGNyZWF0ZWQgYW5kCisgICAgICogY29uZmlndXJlZCBieSB0aGUgSkFYLVdTIGltcGxlbWVudGF0aW9uIHVzaW5nIHNvbWUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogSW4gb3JkZXIgdG8gZ2V0IG1vcmUgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiwgcGxlYXNlCisgICAgICogdXNlIHRoZSB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50I2NyZWF0ZShTdHJpbmcsT2JqZWN0KX0gYW5kCisgICAgICoge0BsaW5rIGphdmF4LnhtbC53cy5FbmRwb2ludCNwdWJsaXNoKE9iamVjdCl9IG1ldGhvZHMgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIEEgVVJJIHNwZWNpZnlpbmcgdGhlIGFkZHJlc3MgYW5kIHRyYW5zcG9ydC9wcm90b2NvbAorICAgICAqICAgICAgICB0byB1c2UuIEEgaHR0cDogVVJJIE1VU1QgcmVzdWx0IGluIHRoZSBTT0FQIDEuMS9IVFRQCisgICAgICogICAgICAgIGJpbmRpbmcgYmVpbmcgdXNlZC4gSW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0IG90aGVyCisgICAgICogICAgICAgIFVSSSBzY2hlbWVzLgorICAgICAqIEBwYXJhbSBpbXBsZW1lbnRvciBUaGUgZW5kcG9pbnQgaW1wbGVtZW50b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGVuZHBvaW50LgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICBJZiBhIDxjb2RlPmphdmEubGFuZy5TZWN1cml0eU1hbmdlcjwvY29kZT4KKyAgICAgKiAgICAgICAgICBpcyBiZWluZyB1c2VkIGFuZCB0aGUgYXBwbGljYXRpb24gZG9lc24ndCBoYXZlIHRoZQorICAgICAqICAgICAgICAgIDxjb2RlPldlYlNlcnZpY2VQZXJtaXNzaW9uKCJwdWJsaXNoRW5kcG9pbnQiKTwvY29kZT4gcGVybWlzc2lvbi4KKyAgICAgKgorICAgICAqKi8KKyAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50IHB1Ymxpc2goU3RyaW5nIGFkZHJlc3MsIE9iamVjdCBpbXBsZW1lbnRvcikgeworICAgICAgICByZXR1cm4gUHJvdmlkZXIucHJvdmlkZXIoKS5jcmVhdGVBbmRQdWJsaXNoRW5kcG9pbnQoYWRkcmVzcywgaW1wbGVtZW50b3IpOworICAgIH0KIAotICAvKioKLSAgICogU3RvcHMgcHVibGlzaGluZyB0aGlzIGVuZHBvaW50LgotICAgKgotICAgKiBJZiB0aGUgZW5kcG9pbnQgaXMgbm90IGluIGEgcHVibGlzaGVkIHN0YXRlLCB0aGlzIG1ldGhvZAotICAgKiBoYXMgbm90IGVmZmVjdC4KLSAgICoKLSAgKiovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3AoKTsKKyAgICAvKioKKyAgICAgKiBQdWJsaXNoZXMgdGhpcyBlbmRwb2ludCBhdCB0aGUgcHJvdmlkZWQgc2VydmVyIGNvbnRleHQuCisgICAgICogQSBzZXJ2ZXIgY29udGV4dCBlbmNhcHN1bGF0ZXMgdGhlIHNlcnZlciBpbmZyYXN0cnVjdHVyZQorICAgICAqIGFuZCBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0LgorICAgICAqIEZvciBhIGNhbGwgdG8gdGhpcyBtZXRob2QgdG8gc3VjY2VlZCwgdGhlIHNlcnZlciBjb250ZXh0CisgICAgICogcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIGl0IE1VU1QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAqIGVuZHBvaW50J3MgYmluZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXJDb250ZXh0IEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBzZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgY29udGV4dCB0byBiZSB1c2VkIGZvciBwdWJsaXNoaW5nIHRoZSBlbmRwb2ludC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICBJZiB0aGUgcHJvdmlkZWQgc2VydmVyIGNvbnRleHQgaXMgbm90CisgICAgICogICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb3IgdHVybnMKKyAgICAgKiAgICAgICAgICAgICAgb3V0IHRvIGJlIHVudXNhYmxlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgIGVuZHBvaW50J3MgYmluZGluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgSWYgdGhlIGVuZHBvaW50IGhhcyBiZWVuIHB1Ymxpc2hlZCBhbHJlYWR5IG9yIGl0IGhhcyBiZWVuIHN0b3BwZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgIElmIGEgPGNvZGU+amF2YS5sYW5nLlNlY3VyaXR5TWFuZ2VyPC9jb2RlPgorICAgICAqICAgICAgICAgIGlzIGJlaW5nIHVzZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBkb2Vzbid0IGhhdmUgdGhlCisgICAgICogICAgICAgICAgPGNvZGU+V2ViU2VydmljZVBlcm1pc3Npb24oInB1Ymxpc2hFbmRwb2ludCIpPC9jb2RlPiBwZXJtaXNzaW9uLgorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdWJsaXNoKE9iamVjdCBzZXJ2ZXJDb250ZXh0KTsKIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBpbiB0aGUgcHVibGlzaGVkIHN0YXRlLgotICAgKgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbmRwb2ludCBpcyBpbiB0aGUgcHVibGlzaGVkIHN0YXRlLgotICAqKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNQdWJsaXNoZWQoKTsKKyAgICAvKioKKyAgICAgKiBTdG9wcyBwdWJsaXNoaW5nIHRoaXMgZW5kcG9pbnQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZW5kcG9pbnQgaXMgbm90IGluIGEgcHVibGlzaGVkIHN0YXRlLCB0aGlzIG1ldGhvZAorICAgICAqIGhhcyBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcCgpOwogCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBtZXRhZGF0YSBkb2N1bWVudHMgZm9yIHRoZSBzZXJ2aWNlLgotICAgKgotICAgKiBAcmV0dXJuIDxjb2RlPkxpc3QmbHQ7amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UmZ3Q7PC9jb2RlPiBBIGxpc3Qgb2YgbWV0YWRhdGEgZG9jdW1lbnRzIGZvciB0aGUgc2VydmljZQotICAqKi8KLSAgcHVibGljIGFic3RyYWN0IExpc3Q8amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U+IGdldE1ldGFkYXRhKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBpbiB0aGUgcHVibGlzaGVkIHN0YXRlLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW5kcG9pbnQgaXMgaW4gdGhlIHB1Ymxpc2hlZCBzdGF0ZS4KKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNQdWJsaXNoZWQoKTsKIAotICAvKioKLSAgICogU2V0cyB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgZW5kcG9pbnQuCi0gICAqCi0gICAqIEBwYXJhbSBtZXRhZGF0YSBBIGxpc3Qgb2YgWE1MIGRvY3VtZW50IHNvdXJjZXMgY29udGFpbmluZwotICAgKiAgICAgICAgICAgbWV0YWRhdGEgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmRwb2ludCAoZS5nLgotICAgKiAgICAgICAgICAgV1NETCBvciBYTUwgU2NoZW1hIGRvY3VtZW50cykKLSAgICoKLSAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHRoZSBlbmRwb2ludAotICAgKiAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gcHVibGlzaGVkLgotICAqKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TWV0YWRhdGEoTGlzdDxqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZT4gbWV0YWRhdGEpOworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG1ldGFkYXRhIGRvY3VtZW50cyBmb3IgdGhlIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPkxpc3QmbHQ7amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UmZ3Q7PC9jb2RlPiBBIGxpc3Qgb2YgbWV0YWRhdGEgZG9jdW1lbnRzIGZvciB0aGUgc2VydmljZQorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZT4gZ2V0TWV0YWRhdGEoKTsKIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXhlY3V0b3IgZm9yIHRoaXMgPGNvZGU+RW5kcG9pbnQ8L2NvZGU+aW5zdGFuY2UuCi0gICAqCi0gICAqIFRoZSBleGVjdXRvciBpcyB1c2VkIHRvIGRpc3BhdGNoIGFuIGluY29taW5nIHJlcXVlc3QgdG8KLSAgICogdGhlIGltcGxlbWVudG9yIG9iamVjdC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgPGNvZGU+amF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I8L2NvZGU+IHRvIGJlCi0gICAqICAgICAgICAgdXNlZCB0byBkaXNwYXRjaCBhIHJlcXVlc3QuCi0gICAqCi0gICAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKLSAgICoqLwotICAgcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIGdldEV4ZWN1dG9yKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgZW5kcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEgQSBsaXN0IG9mIFhNTCBkb2N1bWVudCBzb3VyY2VzIGNvbnRhaW5pbmcKKyAgICAgKiAgICAgICAgICAgbWV0YWRhdGEgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmRwb2ludCAoZS5nLgorICAgICAqICAgICAgICAgICBXU0RMIG9yIFhNTCBTY2hlbWEgZG9jdW1lbnRzKQorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uICBJZiB0aGUgZW5kcG9pbnQKKyAgICAgKiAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gcHVibGlzaGVkLgorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRNZXRhZGF0YShMaXN0PGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPiBtZXRhZGF0YSk7CiAKLSAgLyoqCi0gICAqIFNldHMgdGhlIGV4ZWN1dG9yIGZvciB0aGlzIDxjb2RlPkVuZHBvaW50PC9jb2RlPiBpbnN0YW5jZS4KLSAgICoKLSAgICogVGhlIGV4ZWN1dG9yIGlzIHVzZWQgdG8gZGlzcGF0Y2ggYW4gaW5jb21pbmcgcmVxdWVzdCB0bwotICAgKiB0aGUgaW1wbGVtZW50b3Igb2JqZWN0LgotICAgKgotICAgKiBJZiB0aGlzIDxjb2RlPkVuZHBvaW50PC9jb2RlPiBpcyBwdWJsaXNoZWQgdXNpbmcgdGhlCi0gICAqIDxjb2RlPnB1Ymxpc2goT2JqZWN0KTwvY29kZT4gbWV0aG9kIGFuZCB0aGUgc3BlY2lmaWVkIHNlcnZlcgotICAgKiBjb250ZXh0IGRlZmluZXMgaXRzIG93biB0aHJlYWRpbmcgYmVoYXZpb3IsIHRoZSBleGVjdXRvcgotICAgKiBtYXkgYmUgaWdub3JlZC4KLSAgICoKLSAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSA8Y29kZT5qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjwvY29kZT4KLSAgICogICAgICAgIHRvIGJlIHVzZWQgdG8gZGlzcGF0Y2ggYSByZXF1ZXN0LgotICAgKgotICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBzdXBwb3J0Ci0gICAqICAgICAgICAgc2V0dGluZyBhbiBleGVjdXRvciBmb3Igc2VjdXJpdHkgcmVhc29ucyAoZS5nLiB0aGUKLSAgICogICAgICAgICBuZWNlc3NhcnkgcGVybWlzc2lvbnMgYXJlIG1pc3NpbmcpLgotICAgKgotICAgKiBAc2VlIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yCi0gICAqKi8KLSAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEV4ZWN1dG9yKGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIGV4ZWN1dG9yKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBleGVjdXRvciBmb3IgdGhpcyA8Y29kZT5FbmRwb2ludDwvY29kZT5pbnN0YW5jZS4KKyAgICAgKgorICAgICAqIFRoZSBleGVjdXRvciBpcyB1c2VkIHRvIGRpc3BhdGNoIGFuIGluY29taW5nIHJlcXVlc3QgdG8KKyAgICAgKiB0aGUgaW1wbGVtZW50b3Igb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgPGNvZGU+amF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I8L2NvZGU+IHRvIGJlCisgICAgICogICAgICAgICB1c2VkIHRvIGRpc3BhdGNoIGEgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIGdldEV4ZWN1dG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBleGVjdXRvciBmb3IgdGhpcyA8Y29kZT5FbmRwb2ludDwvY29kZT4gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUaGUgZXhlY3V0b3IgaXMgdXNlZCB0byBkaXNwYXRjaCBhbiBpbmNvbWluZyByZXF1ZXN0IHRvCisgICAgICogdGhlIGltcGxlbWVudG9yIG9iamVjdC4KKyAgICAgKgorICAgICAqIElmIHRoaXMgPGNvZGU+RW5kcG9pbnQ8L2NvZGU+IGlzIHB1Ymxpc2hlZCB1c2luZyB0aGUKKyAgICAgKiA8Y29kZT5wdWJsaXNoKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBhbmQgdGhlIHNwZWNpZmllZCBzZXJ2ZXIKKyAgICAgKiBjb250ZXh0IGRlZmluZXMgaXRzIG93biB0aHJlYWRpbmcgYmVoYXZpb3IsIHRoZSBleGVjdXRvcgorICAgICAqIG1heSBiZSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSA8Y29kZT5qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjwvY29kZT4KKyAgICAgKiAgICAgICAgdG8gYmUgdXNlZCB0byBkaXNwYXRjaCBhIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uICBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgc2V0dGluZyBhbiBleGVjdXRvciBmb3Igc2VjdXJpdHkgcmVhc29ucyAoZS5nLiB0aGUKKyAgICAgKiAgICAgICAgIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyBhcmUgbWlzc2luZykuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yCisgICAgICoqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEV4ZWN1dG9yKGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIGV4ZWN1dG9yKTsKIAogCiAgICAgLyoqCkBAIC0yNzUsNyArMjk0LDcgQEAKICAgICAgKiBAcmV0dXJuIE1hcCZsdDtTdHJpbmcsT2JqZWN0Jmd0OyBUaGUgcHJvcGVydHkgYmFnCiAgICAgICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZS4KICAgICAgKiovCi0gICAgIHB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UHJvcGVydGllcygpOworICAgIHB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UHJvcGVydGllcygpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcHJvcGVydHkgYmFnIGZvciB0aGlzIDxjb2RlPkVuZHBvaW50PC9jb2RlPiBpbnN0YW5jZS4KQEAgLTI4Myw1ICszMDIsNTkgQEAKICAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydHkgYmFnIGFzc29jaWF0ZWQgd2l0aAogICAgICAqICAgICAgICB0aGlzIGluc3RhbmNlLgogICAgICAqKi8KLSAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLE9iamVjdD4gcHJvcGVydGllcyk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLE9iamVjdD4gcHJvcGVydGllcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyA8Y29kZT5FbmRwb2ludDwvY29kZT4gaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIEJpbmRpbmcgZm9yIHRoaXMgPGNvZGU+YmluZGluZ1Byb3ZpZGVyPC9jb2RlPiBpcworICAgICAqIGVpdGhlciBTT0FQMS4xL0hUVFAgb3IgU09BUDEuMi9IVFRQLCB0aGVuIGEKKyAgICAgKiA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gTVVTVCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWZlcmVuY2VQYXJhbWV0ZXJzIFJlZmVyZW5jZSBwYXJhbWV0ZXJzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiByZXR1cm5lZCA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQHJldHVybiBFbmRwb2ludFJlZmVyZW5jZSBvZiB0aGlzIDxjb2RlPkVuZHBvaW50PC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBJZiB0aGUgcmV0dXJuZWQgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGlzIG9mIHR5cGUKKyAgICAgKiA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gdGhlbiBpdCBNVVNUIGNvbnRhaW4gdGhlCisgICAgICogdGhlIHNwZWNpZmllZCA8Y29kZT5yZWZlcmVuY2VQYXJhbWV0ZXJzPC9jb2RlPi4KKworICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCisgICAgICogdGhlIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBvciBpZiB0aGUgPGNvZGU+RW5kcG9pbnQ8L2NvZGU+IGlzCisgICAgICogbm90IGluIHRoZSBwdWJsaXNoZWQgc3RhdGUuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiB0aGlzIDxjb2RlPkJpbmRpbmdQcm92aWRlcjwvY29kZT4KKyAgICAgKiB1c2VzIHRoZSBYTUwvSFRUUCBiaW5kaW5nLgorICAgICAqCisgICAgICogQHNlZSBXM0NFbmRwb2ludFJlZmVyZW5jZQorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IEVuZHBvaW50UmVmZXJlbmNlIGdldEVuZHBvaW50UmVmZXJlbmNlKEVsZW1lbnQuLi4gcmVmZXJlbmNlUGFyYW1ldGVycyk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIDxjb2RlPkVuZHBvaW50PC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgRW5kcG9pbnRSZWZlcmVuY2UgIHRoYXQgTVVTVCBiZSByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlUGFyYW1ldGVycyBSZWZlcmVuY2UgcGFyYW1ldGVycyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogcmV0dXJuZWQgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gRW5kcG9pbnRSZWZlcmVuY2Ugb2YgdHlwZSA8Y29kZT5jbGF6ejwvY29kZT4gb2YgdGhpcworICAgICAqIDxjb2RlPkVuZHBvaW50PGNvZGU+IGluc3RhbmNlLgorICAgICAqIElmIHRoZSByZXR1cm5lZCA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gaXMgb2YgdHlwZQorICAgICAqIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiB0aGVuIGl0IE1VU1QgY29udGFpbiB0aGUKKyAgICAgKiB0aGUgc3BlY2lmaWVkIDxjb2RlPnJlZmVyZW5jZVBhcmFtZXRlcnM8L2NvZGU+LgorCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIGFueSBlcnJvciBpbiB0aGUgY3JlYXRpb24gb2YKKyAgICAgKiB0aGUgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG9yIGlmIHRoZSA8Y29kZT5FbmRwb2ludDwvY29kZT4gaXMKKyAgICAgKiBub3QgaW4gdGhlIHB1Ymxpc2hlZCBzdGF0ZSBvciBpZiB0aGUgPGNvZGU+Y2xheno8L2NvZGU+IGlzIG5vdCBhIHN1cHBvcnRlZAorICAgICAqIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiB0eXBlLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgdGhpcyA8Y29kZT5CaW5kaW5nUHJvdmlkZXI8L2NvZGU+CisgICAgICogdXNlcyB0aGUgWE1ML0hUVFAgYmluZGluZy4KKyAgICAgKgorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IDxUIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IFQgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoQ2xhc3M8VD4gY2xhenosCisgICAgICAgICAgICBFbGVtZW50Li4uIHJlZmVyZW5jZVBhcmFtZXRlcnMpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0VuZHBvaW50UmVmZXJlbmNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvRW5kcG9pbnRSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmZkNmRhCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0VuZHBvaW50UmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZheC54bWwud3M7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLndzLnNwaS5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBXUy1BZGRyZXNzaW5nIEVuZHBvaW50UmVmZXJlbmNlCisgKiB3aGljaCBpcyBhIHJlbW90ZSByZWZlcmVuY2UgdG8gYSB3ZWIgc2VydmljZSBlbmRwb2ludC4KKyAqIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy13cy1hZGRyLWNvcmUtMjAwNjA1MDkvIj4KKyAqIFdlYiBTZXJ2aWNlcyBBZGRyZXNzaW5nIDEuMCAtIENvcmU8L2E+CisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBXUy1BZGRyZXNzaW5nIEVuZHBvaW50UmVmZXJlbmNlcy4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBpcyBpbW11dGFibGUgYXMgdGhlIHR5cGljYWwgd2ViIHNlcnZpY2UgZGV2ZWxvcGVyCisgKiBuZWVkIG5vdCBiZSBjb25jZXJuZWQgd2l0aCBpdHMgY29udGVudHMuICBUaGUgd2ViIHNlcnZpY2UKKyAqIGRldmVsb3BlciBzaG91bGQgdXNlIHRoaXMgY2xhc3Mgc3RyaWN0bHkgYXMgYSBtZWNoYW5pc20gdG8KKyAqIHJlZmVyZW5jZSBhIHJlbW90ZSB3ZWIgc2VydmljZSBlbmRwb2ludC4gU2VlIHRoZSB7QGxpbmsgU2VydmljZX0gQVBJcworICogdGhhdCBjbGllbnRzIGNhbiB1c2UgdG8gdGhhdCB1dGlsaXplIGFuIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4KKyAqIFNlZSB0aGUge0BsaW5rIGphdmF4LnhtbC53cy5FbmRwb2ludH0sIGFuZAorICoge0BsaW5rIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXJ9IEFQSXMgb24gaG93CisgKiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZXM8L2NvZGU+IGNhbiBiZSBjcmVhdGVkIGZvciBwdWJsaXNoZWQKKyAqIGVuZHBvaW50cy4KKyAqIDxwPgorICogQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3Mgd2lsbCByZXByZXNlbnQKKyAqIGFuIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBmb3IgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgQWRkcmVzc2luZy4KKyAqIEZvciBleGFtcGxlIHRoZSB7QGxpbmsgVzNDRW5kcG9pbnRSZWZlcmVuY2V9IGlzIGZvciB1c2UKKyAqIHdpdGggVzNDIFdlYiBTZXJ2aWNlcyBBZGRyZXNzaW5nIDEuMCAtIENvcmUgUmVjb21tZW5kYXRpb24uCisgKiBJZiBKQVgtV1MgaW1wbGVtZW50b3JzIG5lZWQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgdmVyc2lvbnMKKyAqIG9mIGFkZHJlc3NpbmcsIHRoZXkgc2hvdWxkIHdyaXRlIHRoZWlyIG93bgorICogPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IHN1YmNsYXNzIGZvciB0aGF0IHZlcnNpb24uCisgKiBUaGlzIHdpbGwgYWxsb3cgYSBKQVgtV1MgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlCisgKiB2ZW5kb3Igc3BlY2lmaWMgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2VzPC9jb2RlPiB0aGF0IHRoYXQKKyAqIHZlbmRvciBjYW4gdXNlIHRvIGZsYWcgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZgorICogYWRkcmVzc2luZy4KKyAqIDxwPgorICogV2ViIHNlcnZpY2UgZGV2ZWxvcGVycyB0aGF0IHdpc2ggdG8gcGFzcyBvciByZXR1cm4KKyAqIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlczwvY29kZT4gaW4gSmF2YSBtZXRob2RzIGluIGFuCisgKiBTRUkgc2hvdWxkIHVzZQorICogY29uY3JldGUgaW5zdGFuY2VzIG9mIGFuIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBzdWNoCisgKiBhcyB0aGUgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+LiAgVGhpcyB3YXkgdGhlCisgKiBzY2hlbWEgbWFwcGVkIGZyb20gdGhlIFNFSSB3aWxsIGJlIG1vcmUgZGVzY3JpcHRpdmUgb2YgdGhlCisgKiB0eXBlIG9mIGVuZHBvaW50IHJlZmVyZW5jZSBiZWluZyBwYXNzZWQuCisgKiA8cD4KKyAqIEpBWC1XUyBpbXBsZW1lbnRvcnMgYXJlIGV4cGVjdGVkIHRvIGV4dHJhY3QgdGhlIFhNTCBpbmZvc2V0CisgKiBmcm9tIGFuIDxDT0RFPkVuZHBvaW50UmVmZXJlY2U8L0NPREU+IHVzaW5nIHRoZQorICogPGNvZGU+e0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlI3dyaXRlVG99PC9jb2RlPgorICogbWV0aG9kLgorICogPHA+CisgKiBKQVhCIHdpbGwgYmluZCB0aGlzIGNsYXNzIHRvIHhzOmFueVR5cGUuIElmIGEgYmV0dGVyIGJpbmRpbmcKKyAqIGlzIGRlc2lyZWQsIHdlYiBzZXJ2aWNlcyBkZXZlbG9wZXJzIHNob3VsZCB1c2UgYSBjb25jcmV0ZQorICogc3ViY2xhc3Mgc3VjaCBhcyB7QGxpbmsgVzNDRW5kcG9pbnRSZWZlcmVuY2V9LgorICoKKyAqIEBzZWUgVzNDRW5kcG9pbnRSZWZlcmVuY2UKKyAqIEBzZWUgU2VydmljZQorICogQHNpbmNlIEpBWC1XUyAyLjEKKyAqLworQFhtbFRyYW5zaWVudCAvLyB0byB0cmVhdCB0aGlzIGNsYXNzIGxpa2UgT2JqZWN0IGFzIGZhciBhcyBkYXRhYmluZGluZyBpcyBjb25jZXJuZWQgKHByb3Bvc2VkIEpBWEIgMi4xIGZlYXR1cmUpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW5kcG9pbnRSZWZlcmVuY2UgeworICAgIC8vCisgICAgLy9EZWZhdWx0IGNvbnN0cnVjdG9yIHRvIGJlIG9ubHkgY2FsbGVkIGJ5IGRlcml2ZWQgdHlwZXMuCisgICAgLy8KKyAgICBwcm90ZWN0ZWQgRW5kcG9pbnRSZWZlcmVuY2UoKXt9OworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgdG8gcmVhZCBhbiBFbmRwb2ludFJlZmVyZW5jZSBmcm9tIHRoZSBpbmZvc2V0IGNvbnRhaW5lZCBpbgorICAgICAqIDxjb2RlPmVwckluZm9zZXQ8L2NvZGU+LiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIHZlbmRvciBzcGVjaWZpYworICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgamF2YXgueG1sLndzLnNwaS5Qcm92aWRlciNyZWFkRW5kcG9pbnRSZWZlcmVuY2V9IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcHJJbmZvc2V0IFRoZSA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTxjb2RlPiBpbmZvc2V0IHRvIGJlIHVubWFyc2hhbGxlZAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgRW5kcG9pbnRSZWZlcmVuY2UgdW5tYXJzaGFsbGVkIGZyb20gPGNvZGU+ZXBySW5mb3NldDwvY29kZT4KKyAgICAgKiAgICBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiAgICA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gZnJvbSB0aGUgPENPREU+ZXBySW5mb3NldDwvQ09ERT4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgaWYgdGhlIDxjb2RlPm51bGw8L2NvZGU+IDxjb2RlPmVwckluZm9zZXQ8L3R0PiB2YWx1ZSBpcyBnaXZlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHJlYWRGcm9tKFNvdXJjZSBlcHJJbmZvc2V0KSB7CisgICAgICAgIHJldHVybiBQcm92aWRlci5wcm92aWRlcigpLnJlYWRFbmRwb2ludFJlZmVyZW5jZShlcHJJbmZvc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3cml0ZSB0aGlzIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiB0byB0aGUgc3BlY2lmaWVkIGluZm9zZXQgZm9ybWF0CisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICBpZiB0aGVyZSBpcyBhbiBlcnJvciB3cml0aW5nIHRoZQorICAgICAqICAgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IHRvIHRoZSBzcGVjaWZpZWQgPGNvZGU+cmVzdWx0PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgSWYgdGhlIDxjb2RlPm51bGw8L2NvZGU+IDxjb2RlPnJlc3VsdDwvdHQ+IHZhbHVlIGlzIGdpdmVuLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlVG8oUmVzdWx0IHJlc3VsdCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5nZXRQb3J0PC9jb2RlPiBtZXRob2QgcmV0dXJucyBhIHByb3h5LiBJZiB0aGVyZQorICAgICAqIGFyZSBhbnkgcmVmZXJlbmNlIHBhcmFtZXRlcnMgaW4gdGhlCisgICAgICogPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGluc3RhbmNlLCB0aGVuIHRob3NlIHJlZmVyZW5jZQorICAgICAqIHBhcmFtZXRlcnMgTVVTVCBhcHBlYXIgYXMgU09BUCBoZWFkZXJzLCBpbmRpY2F0aW5nIHRoZW0gdG8gYmUKKyAgICAgKiByZWZlcmVuY2UgcGFyYW1ldGVycywgb24gYWxsIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIGVuZHBvaW50LgorICAgICAqIFRoZSBwYXJhbWV0ZXIgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4gc3BlY2lmaWVzCisgICAgICogdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIHJldHVybmVkIHByb3h5LgorICAgICAqIFRoZSA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gaW5zdGFuY2Ugc3BlY2lmaWVzIHRoZQorICAgICAqIGVuZHBvaW50IHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSByZXR1cm5lZCBwcm94eS4KKyAgICAgKiBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIHRoZSBKQVgtV1MKKyAgICAgKiBydW50aW1lIHN5c3RlbSB0YWtlcyB0aGUgcmVzcG9uc2liaWxpdHkgb2Ygc2VsZWN0aW5nIGEgcHJvdG9jb2wKKyAgICAgKiBiaW5kaW5nIChhbmQgYSBwb3J0KSBhbmQgY29uZmlndXJpbmcgdGhlIHByb3h5IGFjY29yZGluZ2x5IGZyb20KKyAgICAgKiB0aGUgV1NETCBNZXRhZGF0YSBmcm9tIHRoaXMgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG9yIGZyb20KKyAgICAgKiBhbm5vdGF0aW9ucyBvbiB0aGUgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPi4gIEZvciB0aGlzIG1ldGhvZAorICAgICAqIHRvIHN1Y2Nlc3NmdWxseSByZXR1cm4gYSBwcm94eSwgV1NETCBtZXRhZGF0YSBNVVNUIGJlIGF2YWlsYWJsZSBhbmQgdGhlCisgICAgICogPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGluc3RhbmNlIE1VU1QgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbiB1bmRlcnN0b29kCisgICAgICogPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IG1ldGFkYXRhLgorICAgICAqIDxwPgorICAgICAqIEJlY2F1c2UgdGhpcyBwb3J0IGlzIG5vdCBjcmVhdGVkIGZyb20gYSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBvYmplY3QsIGhhbmRsZXJzCisgICAgICogd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSBjb25maWd1cmVkLCBhbmQgdGhlIDxjb2RlPkhhbmRsZXJSZXNvbHZlcjwvY29kZT4KKyAgICAgKiBhbmQgPGNvZGU+RXhlY3V0b3I8L2NvZGU+IGNhbm5vdCBiZSBnZXQgb3Igc2V0IGZvciB0aGlzIHBvcnQuIFRoZQorICAgICAqIDxjb2RlPkJpbmRpbmdQcm92aWRlcigpLmdldEJpbmRpbmcoKS5zZXRIYW5kbGVyQ2hhaW4oKTwvY29kZT4KKyAgICAgKiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbWFudWFsbHkgY29uZmlndXJlIGhhbmRsZXJzIGZvciB0aGlzIHBvcnQuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgU2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKKyAgICAgKiBAcGFyYW0gZmVhdHVyZXMgIEFuIGFycmF5IG9mIDxjb2RlPldlYlNlcnZpY2VGZWF0dXJlczwvY29kZT4gdG8gY29uZmlndXJlIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHByb3h5LiAgU3VwcG9ydGVkIGZlYXR1cmVzIG5vdCBpbiB0aGUgPGNvZGU+ZmVhdHVyZXMKKyAgICAgKiAgICAgICAgICAgICAgICA8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICogQHJldHVybiBPYmplY3QgUHJveHkgaW5zdGFuY2UgdGhhdCBzdXBwb3J0cyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgPFVMPgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBjcmVhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcm94eQorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFueSBtaXNzaW5nIFdTREwgbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyByZXF1aXJlZCBieSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYW4gaWxsZWdhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiBhIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgPC9VTD4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuUHJveHkKKyAgICAgKiBAc2VlIFdlYlNlcnZpY2VGZWF0dXJlCisgICAgICoqLworICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KENsYXNzPFQ+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgeworICAgICAgICByZXR1cm4gUHJvdmlkZXIucHJvdmlkZXIoKS5nZXRQb3J0KHRoaXMsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGxheXMgRVBSIGluZm9zZXQgZm9yIGRlYnVnZ2luZyBjb252ZW5pZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVUbyhuZXcgU3RyZWFtUmVzdWx0KHcpKTsKKyAgICAgICAgcmV0dXJuIHcudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvRmF1bHRBY3Rpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9GYXVsdEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3M2VkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvRmF1bHRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YXgueG1sLndzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBUaGUgPGNvZGU+RmF1bHRBY3Rpb248L2NvZGU+IGFubm90YXRpb24gaXMgdXNlZCBpbnNpZGUgYW4ge0BsaW5rIEFjdGlvbn0KKyAqIGFubm90YXRpb24gdG8gYWxsb3cgYW4gZXhwbGljaXQgYXNzb2NpYXRpb24gb2YgYSBXUy1BZGRyZXNzaW5nCisgKiA8Y29kZT5BY3Rpb248L2NvZGU+IG1lc3NhZ2UgYWRkcmVzc2luZyBwcm9wZXJ0eSB3aXRoIHRoZSA8Y29kZT5mYXVsdDwvY29kZT4KKyAqIG1lc3NhZ2VzIG9mIHRoZSBXU0RMIG9wZXJhdGlvbiBtYXBwZWQgZnJvbSB0aGUgZXhjZXB0aW9uIGNsYXNzLgorICogPHA+CisgKiBJbiB0aGlzIHZlcnNpb24gb2YgSkFYLVdTIHRoZXJlIGlzIG5vIHN0YW5kYXJkIHdheSB0byBzcGVjaWZ5CisgKiA8Y29kZT5BY3Rpb248L2NvZGU+IHZhbHVlcyBpbiBhIFdTREwgYW5kIHRoZXJlIGlzIG5vIHN0YW5kYXJkIGRlZmF1bHQgdmFsdWUuICBJdCBpcyBpbnRlbmRlZCB0aGF0LAorICogYWZ0ZXIgdGhlIFczQyBXRyBvbiBXUy1BZGRyZXNzaW5nIGhhcyBkZWZpbmVkIHRoZXNlIGl0ZW1zIGluIGEgcmVjb21tZW5kYXRpb24sCisgKiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEpBWC1XUyB3aWxsIHJlcXVpcmUgdGhlIG5ldyBzdGFuZGFyZHMuCisgKgorICogQHNlZSBBY3Rpb24KKyAqCisgKiBAc2luY2UgSkFYLVdTIDIuMQorICovCisKK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCitwdWJsaWMgQGludGVyZmFjZSBGYXVsdEFjdGlvbiB7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgZXhjZXB0aW9uIGNsYXNzCisgICAgICovCisgICAgQ2xhc3MgY2xhc3NOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiBXUy1BZGRyZXNzaW5nIDxjb2RlPkFjdGlvbjwvY29kZT4gbWVzc2FnZSBhZGRyZXNzaW5nIHByb3BlcnR5IGZvciB0aGUgZXhjZXB0aW9uCisgICAgICovCisgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9Ib2xkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9Ib2xkZXIuamF2YQppbmRleCAwOTFkYWM0Li44OTExOTIzIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvSG9sZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0hvbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9Mb2dpY2FsTWVzc2FnZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0xvZ2ljYWxNZXNzYWdlLmphdmEKaW5kZXggYjE2NmE1OS4uZGU0ZDE4OSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0xvZ2ljYWxNZXNzYWdlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL0xvZ2ljYWxNZXNzYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzgsMTYgKzM4LDE3IEBACiAKICAgLyoqIEdldHMgdGhlIG1lc3NhZ2UgcGF5bG9hZCBhcyBhbiBYTUwgc291cmNlLCBtYXkgYmUgY2FsbGVkCiAgICAqICBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBMb2dpY2FsTWVzc2FnZSBpbnN0YW5jZSwgYWx3YXlzCi0gICAqICByZXR1cm5zIGEgbmV3IFNvdXJjZSB0aGF0IG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBlbnRpcmUKKyAgICogIHJldHVybnMgYSBuZXcgPGNvZGU+U291cmNlPC9jb2RlPiB0aGF0IG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBlbnRpcmUKICAgICogIG1lc3NhZ2UgcGF5bG9hZC4KICAgICoKLSAgICogIDxwPklmIHRoZSByZXR1cm5lZCBTb3VyY2UgaXMgYW4gaW5zdGFuY2Ugb2YgRE9NU291cmNlLCB0aGVuCisgICAqICA8cD5JZiB0aGUgcmV0dXJuZWQgPGNvZGU+U291cmNlPC9jb2RlPiBpcyBhbiBpbnN0YW5jZSBvZgorICAgKiAgPGNvZGU+RE9NU291cmNlPC9jb2RlPiwgdGhlbgogICAgKiAgbW9kaWZpY2F0aW9ucyB0byB0aGUgZW5jYXBzdWxhdGVkIERPTSB0cmVlIGNoYW5nZSB0aGUgbWVzc2FnZQogICAgKiAgcGF5bG9hZCBpbi1wbGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXNlcXVlbnRseSBjYWxsCi0gICAqICA8Y29kZT5zZXRQYXlsb2FkPC9jb2RlPi4gT3RoZXIgdHlwZXMgb2YgU291cmNlIHByb3ZpZGUgb25seQorICAgKiAgPGNvZGU+c2V0UGF5bG9hZDwvY29kZT4uIE90aGVyIHR5cGVzIG9mIDxjb2RlPlNvdXJjZTwvY29kZT4gcHJvdmlkZSBvbmx5CiAgICAqICByZWFkIGFjY2VzcyB0byB0aGUgbWVzc2FnZSBwYXlsb2FkLgogICAgKgotICAgKiAgQHJldHVybiBUaGUgY29udGFpbmVkIG1lc3NhZ2UgcGF5bG9hZDsgcmV0dXJucyBudWxsIGlmIG5vCisgICAqICBAcmV0dXJuIFRoZSBjb250YWluZWQgbWVzc2FnZSBwYXlsb2FkOyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCiAgICAqICAgICAgICAgIHBheWxvYWQgaXMgcHJlc2VudCBpbiB0aGlzIG1lc3NhZ2UuCiAgICoqLwogICBwdWJsaWMgU291cmNlIGdldFBheWxvYWQoKTsKQEAgLTY4LDcgKzY5LDcgQEAKICAgICoKICAgICogIEBwYXJhbSAgY29udGV4dCBUaGUgSkFYQkNvbnRleHQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byB1bm1hcnNoYWxsCiAgICAqICAgICAgICAgIHRoZSBtZXNzYWdlIHBheWxvYWQKLSAgICogIEByZXR1cm4gVGhlIGNvbnRhaW5lZCBtZXNzYWdlIHBheWxvYWQ7IHJldHVybnMgbnVsbCBpZiBubworICAgKiAgQHJldHVybiBUaGUgY29udGFpbmVkIG1lc3NhZ2UgcGF5bG9hZDsgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwogICAgKiAgICAgICAgICBwYXlsb2FkIGlzIHByZXNlbnQgaW4gdGhpcyBtZXNzYWdlCiAgICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gdXNpbmcgYSBzdXBwbGllZAogICAgKiAgICAgSkFYQkNvbnRleHQgdG8gdW5tYXJzaGFsbCB0aGUgcGF5bG9hZC4gVGhlIGNhdXNlIG9mCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUHJvdG9jb2xFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9Qcm90b2NvbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDdkNTg4M2QuLjI0NzllYzQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9Qcm90b2NvbEV4Y2VwdGlvbi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9Qcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDkgKzM0LDkgQEAKICoqLwogcHVibGljIGNsYXNzIFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgV2ViU2VydmljZUV4Y2VwdGlvbiB7CiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBwcm90b2NvbCBleGNlcHRpb24gd2l0aCBudWxsIGFzIGl0cyBkZXRhaWwgbWVzc2FnZS4gVGhlCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBwcm90b2NvbCBleGNlcHRpb24gd2l0aCA8Y29kZT5udWxsPC9jb2RlPiBhcyBpdHMgZGV0YWlsIG1lc3NhZ2UuIFRoZQogICAgICAqIGNhdXNlIGlzIG5vdCBpbml0aWFsaXplZCwgYW5kIG1heSBzdWJzZXF1ZW50bHkgYmUgaW5pdGlhbGl6ZWQgYnkgYSBjYWxsCi0gICAgICogdG8gVGhyb3dhYmxlLmluaXRDYXVzZShqYXZhLmxhbmcuVGhyb3dhYmxlKS4KKyAgICAgKiB0byA8Y29kZT5UaHJvd2FibGUuaW5pdENhdXNlKGphdmEubGFuZy5UaHJvd2FibGUpPC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgUHJvdG9jb2xFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKCk7CkBAIC00NSw3ICs0NSw3IEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBwcm90b2NvbCBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgogICAgICAqIFRoZSBjYXVzZSBpcyBub3QgaW5pdGlhbGl6ZWQsIGFuZCBtYXkgc3Vic2VxdWVudGx5IGJlIGluaXRpYWxpemVkIGJ5IGEKLSAgICAgKiBjYWxsIHRvIFRocm93YWJsZS5pbml0Q2F1c2UoamF2YS5sYW5nLlRocm93YWJsZSkuCisgICAgICogY2FsbCB0byA8Y29kZT5UaHJvd2FibGUuaW5pdENhdXNlKGphdmEubGFuZy5UaHJvd2FibGUpPC9jb2RlPi4KICAgICAgKgogICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWwgbWVzc2FnZS4gVGhlIGRldGFpbCBtZXNzYWdlIGlzIHNhdmVkIGZvciBsYXRlcgogICAgICAqICAgcmV0cmlldmFsIGJ5IHRoZSBUaHJvd2FibGUuZ2V0TWVzc2FnZSgpIG1ldGhvZC4KQEAgLTY0LDcgKzY0LDcgQEAKICAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgIGJ5CiAgICAgICogICB0aGUgVGhyb3dhYmxlLmdldE1lc3NhZ2UoKSBtZXRob2QpLgogICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlCi0gICAgICogVGhyb3dhYmxlLmdldENhdXNlKCkgbWV0aG9kKS4gKEEgbnVsbCB2YWx1ZSBpcyAgcGVybWl0dGVkLCBhbmQgaW5kaWNhdGVzCisgICAgICogPGNvZGU+VGhyb3dhYmxlLmdldENhdXNlKCk8L2NvZGU+IG1ldGhvZCkuIChBIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGlzICBwZXJtaXR0ZWQsIGFuZCBpbmRpY2F0ZXMKICAgICAgKiB0aGF0IHRoZSBjYXVzZSBpcyBub25leGlzdGVudCBvciAgdW5rbm93bi4pCiAgICAgICovCiAgICAgcHVibGljIFByb3RvY29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCAgVGhyb3dhYmxlIGNhdXNlKSB7CkBAIC03MywxMyArNzMsMTMgQEAKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBuZXcgcnVudGltZSBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGNhdXNlIGFuZCBhICBkZXRhaWwKLSAgICAgKiBtZXNzYWdlIG9mIChjYXVzZT09bnVsbCA/IG51bGwgOiBjYXVzZS50b1N0cmluZygpKSAgKHdoaWNoIHR5cGljYWxseQorICAgICAqIG1lc3NhZ2Ugb2YgPGNvZGU+KGNhdXNlPT1udWxsID8gbnVsbCA6IGNhdXNlLnRvU3RyaW5nKCkpPC9jb2RlPiAgKHdoaWNoIHR5cGljYWxseQogICAgICAqIGNvbnRhaW5zIHRoZSBjbGFzcyBhbmQgZGV0YWlsIG1lc3NhZ2Ugb2YgIGNhdXNlKS4gVGhpcyBjb25zdHJ1Y3RvciBpcwogICAgICAqIHVzZWZ1bCBmb3IgcnVudGltZSBleGNlcHRpb25zICB0aGF0IGFyZSBsaXR0bGUgbW9yZSB0aGFuIHdyYXBwZXJzIGZvcgogICAgICAqIG90aGVyIHRocm93YWJsZXMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2F1c2UgdGhlIGNhdXNlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsIGJ5IHRoZQotICAgICAqIFRocm93YWJsZS5nZXRDYXVzZSgpIG1ldGhvZCkuIChBIG51bGwgdmFsdWUgaXMgIHBlcm1pdHRlZCwgYW5kIGluZGljYXRlcworICAgICAqIDxjb2RlPlRocm93YWJsZS5nZXRDYXVzZSgpPC9jb2RlPiBtZXRob2QpLiAoQSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBpcyAgcGVybWl0dGVkLCBhbmQgaW5kaWNhdGVzCiAgICAgICogdGhhdCB0aGUgY2F1c2UgaXMgbm9uZXhpc3RlbnQgb3IgIHVua25vd24uKQogICAgICAqLwogICAgIHB1YmxpYyBQcm90b2NvbEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9Qcm92aWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1Byb3ZpZGVyLmphdmEKaW5kZXggZmZiOWUwOC4uZGMwYzBiNSAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1Byb3ZpZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1Byb3ZpZGVyLmphdmEKQEAgLTUwLDExICs1MCwxMSBAQAogICAgKiAgbWVzc2FnZS4KICAgICoKICAgICogIEBwYXJhbSAgcmVxdWVzdCBUaGUgcmVxdWVzdCBtZXNzYWdlIG9yIG1lc3NhZ2UgcGF5bG9hZC4KLSAgICogIEByZXR1cm4gVGhlIHJlc3BvbnNlIG1lc3NhZ2Ugb3IgbWVzc2FnZSBwYXlsb2FkLiBNYXkgYmUgbnVsbCBpZgorICAgKiAgQHJldHVybiBUaGUgcmVzcG9uc2UgbWVzc2FnZSBvciBtZXNzYWdlIHBheWxvYWQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZgogICAgICAgICAgICAgICB0aGVyZSBpcyBubyByZXNwb25zZS4KLSAgICogIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBwcm9jZXNzaW5nIHJlcXVlc3QuCi0gICAqICAgICAgICAgIFRoZSBjYXVzZSBvZiB0aGUgV2ViU2VydmljZUV4Y2VwdGlvbiBtYXkgYmUgc2V0IHRvIGEgc3ViY2xhc3MKLSAgICogICAgICAgICAgb2YgUHJvdG9jb2xFeGNlcHRpb24gdG8gY29udHJvbCB0aGUgcHJvdG9jb2wgbGV2ZWwKKyAgICogIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhbiBlcnJvciBwcm9jZXNzaW5nIHJlcXVlc3QuCisgICAqICAgICAgICAgIFRoZSBjYXVzZSBvZiB0aGUgPGNvZGU+V2ViU2VydmljZUV4Y2VwdGlvbjwvY29kZT4gbWF5IGJlIHNldCB0byBhIHN1YmNsYXNzCisgICAqICAgICAgICAgIG9mIDxjb2RlPlByb3RvY29sRXhjZXB0aW9uPC9jb2RlPiB0byBjb250cm9sIHRoZSBwcm90b2NvbCBsZXZlbAogICAgKiAgICAgICAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhjZXB0aW9uLgogICAgKiAgQHNlZSBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dAogICAgKiAgQHNlZSBqYXZheC54bWwud3MuUHJvdG9jb2xFeGNlcHRpb24KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9SZXF1ZXN0V3JhcHBlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1JlcXVlc3RXcmFwcGVyLmphdmEKaW5kZXggNjVlZmZmN2EuLjRkOTE3NDUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9SZXF1ZXN0V3JhcHBlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9SZXF1ZXN0V3JhcHBlci5qYXZhCkBAIC0zNCwxMSArMzQsMTEgQEAKIC8qKgogCiAgKiBVc2VkIHRvIGFubm90YXRlIG1ldGhvZHMgaW4gdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIHdpdGggdGhlIHJlcXVlc3QKLSAqIHdyYXBwZXIgYmVhbiB0byBiZSB1c2VkIGF0IHJ1bnRpbWUuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBsb2NhbE5hbWUgaXMKLSAqIHRoZSBvcGVyYXRpb25OYW1lLCBhcyBkZWZpbmVkIGluIFdlYk1ldGhvZCBhbm5vdGF0aW9uIGFuZCB0aGUKLSAqIHRhcmdldE5hbWVzcGFjZSBpcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgU0VJLgorICogd3JhcHBlciBiZWFuIHRvIGJlIHVzZWQgYXQgcnVudGltZS4gVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIDxjb2RlPmxvY2FsTmFtZTwvY29kZT4gaXMKKyAqIHRoZSA8Y29kZT5vcGVyYXRpb25OYW1lPC9jb2RlPiwgYXMgZGVmaW5lZCBpbiA8Y29kZT5XZWJNZXRob2Q8L2NvZGU+IGFubm90YXRpb24gYW5kIHRoZQorICogPGNvZGU+dGFyZ2V0TmFtZXNwYWNlPC9jb2RlPiBpcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgU0VJLgogICogPHA+IFdoZW4gc3RhcnRpbmcgZnJvbSBKYXZhIHRoaXMgYW5ub3RhdGlvbiBpcyB1c2VkIHJlc29sdmUKLSAqIG92ZXJsb2FkaW5nIGNvbmZsaWN0cyBpbiBkb2N1bWVudCBsaXRlcmFsIG1vZGUuIE9ubHkgdGhlIGNsYXNzTmFtZQorICogb3ZlcmxvYWRpbmcgY29uZmxpY3RzIGluIGRvY3VtZW50IGxpdGVyYWwgbW9kZS4gT25seSB0aGUgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPgogICogaXMgcmVxdWlyZWQgaW4gdGhpcyBjYXNlLgogICoKICAqICBAc2luY2UgSkFYLVdTIDIuMApAQCAtNDksMTIgKzQ5LDEyIEBACiBARG9jdW1lbnRlZAogcHVibGljIEBpbnRlcmZhY2UgUmVxdWVzdFdyYXBwZXIgewogICAvKioKLSAgICogIEVsZW1lbnRzIGxvY2FsIG5hbWUuCisgICAqICBFbGVtZW50J3MgbG9jYWwgbmFtZS4KICAgKiovCiAgIHB1YmxpYyBTdHJpbmcgbG9jYWxOYW1lKCkgZGVmYXVsdCAiIjsKIAogICAvKioKLSAgICogIEVsZW1lbnRzIG5hbWVzcGFjZSBuYW1lLgorICAgKiAgRWxlbWVudCdzIG5hbWVzcGFjZSBuYW1lLgogICAqKi8KICAgcHVibGljIFN0cmluZyB0YXJnZXROYW1lc3BhY2UoKSBkZWZhdWx0ICIiOwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcGVjdEJpbmRpbmcuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9SZXNwZWN0QmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWVkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcGVjdEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGphdmF4LnhtbC53czsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbjsKKworCisvKioKKyAqIFRoaXMgZmVhdHVyZSBjbGFyaWZpZXMgdGhlIHVzZSBvZiB0aGUgPGNvZGU+d3NkbDpiaW5kaW5nPC9jb2RlPgorICogaW4gYSBKQVgtV1MgcnVudGltZS4KKyAqIDxwPgorICogVGhpcyBmZWF0dXJlIGlzIG9ubHkgdXNlZnVsIHdpdGggd2ViIHNlcnZpY2VzIHRoYXQgaGF2ZSBhbgorICogYXNzb2NpYXRlZCBXU0RMLiBFbmFibGluZyB0aGlzIGZlYXR1cmUgcmVxdWlyZXMgdGhhdCBhIEpBWC1XUworICogaW1wbGVtZW50YXRpb24gaW5zcGVjdCB0aGUgPGNvZGU+d3NkbDpiaW5kaW5nPC9jb2RlPiBmb3IgYW4KKyAqIGVuZHBvaW50IGF0IHJ1bnRpbWUgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIDxjb2RlPndzZGw6ZXh0ZW5zaW9uczwvY29kZT4KKyAqIHRoYXQgaGF2ZSB0aGUgPGNvZGU+cmVxdWlyZWQ8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4KKyAqIGFyZSB1bmRlcnN0b29kIGFuZCBhcmUgYmVpbmcgdXNlZC4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgdGhlIGFmZmVjdHMgb2YgdGhpcyBmZWF0dXJlIHdpdGggcmVzcGVjdAorICogdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZDoKKyAqIDx1bD4KKyAqICA8bGk+IEVOQUJMRUQ6IEluIHRoaXMgTW9kZSwgYSBKQVgtV1MgcnVudGltZSBNVVNUIGFzc3VyZSB0aGF0IGFsbAorICogIHJlcXVpcmVkIDxjb2RlPndzZGw6YmluZGluZzwvY29kZT4gZXh0ZW5zaW9ucyBhcmUgZWl0aGVyIHVuZGVyc3Rvb2QKKyAqICBhbmQgdXNlZCBieSB0aGUgcnVudGltZSwgb3IgZXhwbGljaXRseSBkaXNhYmxlZCBieSB0aGUgd2ViIHNlcnZpY2UKKyAqICBhcHBsaWNhdGlvbi4gIEEgd2ViIHNlcnZpY2UgYXBwbGljYXRpb24gY2FuIGRpc2FibGUgYSBwYXJ0aWN1bGFyCisgKiAgZXh0ZW5zaW9uIHRoYXQgaGFzIGEga25vd24gV2ViU2VydmljZUZlYXR1cmUgdXNpbmcgZWl0aGVyIHRoZSBhcHByb3ByaWF0ZQorICogIGFubm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgV2ViU2VydmljZUZlYXR1cmUgb24gdGhlIHNlcnZlciwgb3Igb25lIG9mCisgKiAgdGhlIGZvbGxvd2luZyBtZXRob2RzIG9uIHRoZSBjbGllbnQ6CisgKiAgICA8dWw+CisgKiAgICAgIDxsaT57QGxpbmsgU2VydmljZSNnZXRQb3J0KFFOYW1lLENsYXNzLFdlYlNlcnZpY2VGZWF0dXJlLi4uKX0KKyAqICAgICAgPGxpPntAbGluayBTZXJ2aWNlI2dldFBvcnQoQ2xhc3MsV2ViU2VydmljZUZlYXR1cmUuLi4pfQorICogICAgICA8bGk+e0BsaW5rIFNlcnZpY2UjZ2V0UG9ydChFbmRwb2ludFJlZmVyZW5jZSxDbGFzcyxXZWJTZXJ2aWNlRmVhdHVyZS4uLil9CisgKiAgICAgIDxsaT57QGxpbmsgU2VydmljZSNjcmVhdGVEaXNwYXRjaChRTmFtZSxDbGFzcyxTZXJ2aWNlLk1vZGUgbW9kZSxXZWJTZXJ2aWNlRmVhdHVyZS4uLil9CisgKiAgICAgIDxsaT57QGxpbmsgU2VydmljZSNjcmVhdGVEaXNwYXRjaChFbmRwb2ludFJlZmVyZW5jZSxDbGFzcyxTZXJ2aWNlLk1vZGUsV2ViU2VydmljZUZlYXR1cmUuLi4pfQorICogICAgICA8bGk+e0BsaW5rIFNlcnZpY2UjY3JlYXRlRGlzcGF0Y2goUU5hbWUsSkFYQkNvbnRleHQsU2VydmljZS5Nb2RlLFdlYlNlcnZpY2VGZWF0dXJlLi4uKX0KKyAqICAgICAgPGxpPntAbGluayBTZXJ2aWNlI2NyZWF0ZURpc3BhdGNoKEVuZHBvaW50UmVmZXJlbmNlLEpBWEJDb250ZXh0LFNlcnZpY2UuTW9kZSxXZWJTZXJ2aWNlRmVhdHVyZS4uLil9CisgKiAgICAgIDxsaT57QGxpbmsgRW5kcG9pbnRSZWZlcmVuY2UjZ2V0UG9ydChDbGFzcyxXZWJTZXJ2aWNlRmVhdHVyZS4uLil9CisgKiAgICAgIDxsaT5PbmUgb2YgdGhlIDxjb2RlPmdldFhYWFBvcnQoV2ViU2VydmljZUZlYXR1cmVzLi4uKTwvY29kZT4gbWV0aG9kcyBvbiBhCisgKiAgICAgICAgICBnZW5lcmF0ZWQgPGNvZGU+U2VydmljZTwvY29kZT4uCisgKiAgICA8L3VsPgorICogICAgVGhlIHJ1bnRpbWUgTVVTVCBhbHNvIG1ha2Ugc3VyZSB0aGF0IGJpbmRpbmcgb2YKKyAqICAgIFNFSSBwYXJhbWV0ZXJzL3JldHVybiB2YWx1ZXMgcmVzcGVjdCB0aGUgPGNvZGU+d3NkbDpiaW5kaW5nPC9jb2RlPi4KKyAqICAgIFdpdGggdGhpcyBmZWF0dXJlIGVuYWJsZWQsIGlmIGEgcmVxdWlyZWQgKDxjb2RlPndzZGw6cmVxdWlyZWQ9InRydWUiPC9jb2RlPikKKyAqICAgIDxjb2RlPndzZGw6YmluZGluZzwvY29kZT4gZXh0ZW5zaW9uIGlzIGluIHRoZSBXU0RMIGFuZCBpdCBpcyBub3QKKyAqICAgIHN1cHBvcnRlZCBieSBhIEpBWC1XUyBydW50aW1lIGFuZCBpdCBoYXMgbm90CisgKiAgICBiZWVuIGV4cGxpY2l0bHkgdHVybmVkIG9mZiBieSB0aGUgd2ViIHNlcnZpY2UgZGV2ZWxvcGVyLCB0aGVuCisgKiAgICB0aGF0IEpBWC1XUyBydW50aW1lIE1VU1QgYmVoYXZlIGFwcHJvcHJpYXRlbHkgYmFzZWQgb24gd2hldGhlciBpdCBpcworICogICAgb24gdGhlIGNsaWVudCBvciBzZXJ2ZXI6CisgKiAgICA8VUw+CisgKiAgICAgIDxsaT5DbGllbnQ6IHJ1bnRpbWUgTVVTVCB0aHJvdyBhCisgKiAgICAgIDxjb2RlPldlYlNlcnZpY2VFeGNlcHRpb248L2NvZGU+IG5vIHNvb25lciB0aGFuIHdoZW4gb25lIG9mIHRoZSBtZXRob2RzCisgKiAgICAgIGFib3ZlIGlzIGludm9rZWQgYnV0IG5vIGxhdGVyIHRoYW4gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgYW4gZW5kcG9pbnQKKyAqICAgICAgb3BlcmF0aW9uLgorICogICAgICA8bGk+U2VydmVyOiB0aHJvdyBhIFdlYlNlcnZpY2VFeGNlcHRpb24gYW5kIHRoZSBlbmRwb2ludCBNVVNUIGZhaWwgdG8gZGVwbG95CisgKiAgICA8L3VsPgorICogIDxsaT4gRElTQUJMRUQ6IEluIHRoaXMgTW9kZSwgYW4gaW1wbGVtZW50YXRpb24gbWF5IGNob29zZSB3aGV0aGVyCisgKiAgdG8gaW5zcGVjdCB0aGUgPGNvZGU+d3NkbDpiaW5kaW5nPGNvZGU+IG9yIG5vdCBhbmQgdG8gd2hhdCBkZWdyZWUKKyAqICB0aGUgPGNvZGU+d3NkbDpiaW5kaW5nPC9jb2RlPiB3aWxsIGJlIGluc3BlY3RlZC4gIEZvciBleGFtcGxlLAorICogIG9uZSBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIGJlaGF2ZSBhcyBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICBhbm90aGVyIGltcGxlbWVudGF0aW9uIG1heSBvbmx5IGNob29zZSB0byB2ZXJpZnkgdGhlIFNFSSdzCisgKiAgcGFyYW1ldGVyL3JldHVybiB0eXBlIGJpbmRpbmdzLgorICogPC91bD4KKyAqCisgKiBAc2VlIGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZ0ZlYXR1cmUKKyAqCisgKiBAc2luY2UgSkFYLVdTIDIuMQorICovCitAVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK0BXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24oaWQ9UmVzcGVjdEJpbmRpbmdGZWF0dXJlLklELGJlYW49UmVzcGVjdEJpbmRpbmdGZWF0dXJlLmNsYXNzKQorcHVibGljIEBpbnRlcmZhY2UgUmVzcGVjdEJpbmRpbmcgeworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcGVjdEJpbmRpbmdGZWF0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcGVjdEJpbmRpbmdGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwNTUzZgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9SZXNwZWN0QmluZGluZ0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGphdmF4LnhtbC53czsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5zcGkuUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBmZWF0dXJlIGNsYXJpZmllcyB0aGUgdXNlIG9mIHRoZSA8Y29kZT53c2RsOmJpbmRpbmc8L2NvZGU+CisgKiBpbiBhIEpBWC1XUyBydW50aW1lLgorICogPHA+CisgKiBUaGlzIGZlYXR1cmUgaXMgb25seSB1c2VmdWwgd2l0aCB3ZWIgc2VydmljZXMgdGhhdCBoYXZlIGFuCisgKiBhc3NvY2lhdGVkIFdTREwuIEVuYWJsaW5nIHRoaXMgZmVhdHVyZSByZXF1aXJlcyB0aGF0IGEgSkFYLVdTCisgKiBpbXBsZW1lbnRhdGlvbiBpbnNwZWN0IHRoZSA8Y29kZT53c2RsOmJpbmRpbmc8L2NvZGU+IGZvciBhbgorICogZW5kcG9pbnQgYXQgcnVudGltZSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgPGNvZGU+d3NkbDpleHRlbnNpb25zPC9jb2RlPgorICogdGhhdCBoYXZlIHRoZSA8Y29kZT5yZXF1aXJlZDwvY29kZT4gYXR0cmlidXRlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPgorICogYXJlIHVuZGVyc3Rvb2QgYW5kIGFyZSBiZWluZyB1c2VkLgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGRlc2NyaWJlcyB0aGUgYWZmZWN0cyBvZiB0aGlzIGZlYXR1cmUgd2l0aCByZXNwZWN0CisgKiB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkOgorICogPHVsPgorICogIDxsaT4gRU5BQkxFRDogSW4gdGhpcyBNb2RlLCBhIEpBWC1XUyBydW50aW1lIE1VU1QgYXNzdXJlIHRoYXQgYWxsCisgKiAgcmVxdWlyZWQgPGNvZGU+d3NkbDpiaW5kaW5nPC9jb2RlPiBleHRlbnNpb25zIGFyZSBlaXRoZXIgdW5kZXJzdG9vZAorICAgIGFuZCB1c2VkIGJ5IHRoZSBydW50aW1lLCBvciBleHBsaWNpdGx5IGRpc2FibGVkIGJ5IHRoZSB3ZWIgc2VydmljZQorICogIGFwcGxpY2F0aW9uLiAgQSB3ZWIgc2VydmljZSBhcHBsaWNhdGlvbiBjYW4gZGlzYWJsZSBhIHBhcnRpY3VsYXIKKyAqICBleHRlbnNpb24gdGhhdCBoYXMgYSBrbm93biBXZWJTZXJ2aWNlRmVhdHVyZSB1c2luZyBlaXRoZXIgdGhlIGFwcHJvcHJpYXRlCisgKiAgYW5ub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhhdCBXZWJTZXJ2aWNlRmVhdHVyZSBvbiB0aGUgc2VydmVyLCBvciBvbmUgb2YKKyAqICB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gdGhlIGNsaWVudDoKKyAqICAgIDx1bD4KKyAqICAgICAgPGxpPntAbGluayBTZXJ2aWNlI2dldFBvcnQoUU5hbWUsQ2xhc3MsV2ViU2VydmljZUZlYXR1cmUuLi4pfQorICogICAgICA8bGk+e0BsaW5rIFNlcnZpY2UjZ2V0UG9ydChDbGFzcyxXZWJTZXJ2aWNlRmVhdHVyZS4uLil9CisgKiAgICAgIDxsaT57QGxpbmsgU2VydmljZSNnZXRQb3J0KEVuZHBvaW50UmVmZXJlbmNlLENsYXNzLFdlYlNlcnZpY2VGZWF0dXJlLi4uKX0KKyAqICAgICAgPGxpPntAbGluayBTZXJ2aWNlI2NyZWF0ZURpc3BhdGNoKFFOYW1lLENsYXNzLFNlcnZpY2UuTW9kZSBtb2RlLFdlYlNlcnZpY2VGZWF0dXJlLi4uKX0KKyAqICAgICAgPGxpPntAbGluayBTZXJ2aWNlI2NyZWF0ZURpc3BhdGNoKEVuZHBvaW50UmVmZXJlbmNlLENsYXNzLFNlcnZpY2UuTW9kZSxXZWJTZXJ2aWNlRmVhdHVyZS4uLil9CisgKiAgICAgIDxsaT57QGxpbmsgU2VydmljZSNjcmVhdGVEaXNwYXRjaChRTmFtZSxKQVhCQ29udGV4dCxTZXJ2aWNlLk1vZGUsV2ViU2VydmljZUZlYXR1cmUuLi4pfQorICogICAgICA8bGk+e0BsaW5rIFNlcnZpY2UjY3JlYXRlRGlzcGF0Y2goRW5kcG9pbnRSZWZlcmVuY2UsSkFYQkNvbnRleHQsU2VydmljZS5Nb2RlLFdlYlNlcnZpY2VGZWF0dXJlLi4uKX0KKyAqICAgICAgPGxpPntAbGluayBFbmRwb2ludFJlZmVyZW5jZSNnZXRQb3J0KENsYXNzLFdlYlNlcnZpY2VGZWF0dXJlLi4uKX0KKyAqICAgICAgPGxpPk9uZSBvZiB0aGUgPGNvZGU+Z2V0WFhYUG9ydChXZWJTZXJ2aWNlRmVhdHVyZXMuLi4pPC9jb2RlPiBtZXRob2RzIG9uIGEKKyAqICAgICAgICAgIGdlbmVyYXRlZCA8Y29kZT5TZXJ2aWNlPC9jb2RlPi4KKyAqICAgIDwvdWw+CisgKiAgVGhlIHJ1bnRpbWUgTVVTVCBhbHNvIG1ha2Ugc3VyZSB0aGF0IGJpbmRpbmcgb2YKKyAqICBTRUkgcGFyYW1ldGVycy9yZXR1cm4gdmFsdWVzIHJlc3BlY3QgdGhlIDxjb2RlPndzZGw6YmluZGluZzwvY29kZT4uCisgKiAgV2l0aCB0aGlzIGZlYXR1cmUgZW5hYmxlZCwgaWYgYSByZXF1aXJlZCAoPGNvZGU+d3NkbDpyZXF1aXJlZD0idHJ1ZSI8L2NvZGU+KQorICogIDxjb2RlPndzZGw6YmluZGluZzwvY29kZT4gZXh0ZW5zaW9uIGlzIGluIHRoZSBXU0RMIGFuZCBpdCBpcyBub3QKKyAqICBzdXBwb3J0ZWQgYnkgYSBKQVgtV1MgcnVudGltZSBhbmQgaXQgaGFzIG5vdAorICogIGJlZW4gZXhwbGljaXRseSB0dXJuZWQgb2ZmIGJ5IHRoZSB3ZWIgc2VydmljZSBkZXZlbG9wZXIsIHRoZW4KKyAqICB0aGF0IEpBWC1XUyBydW50aW1lIE1VU1QgYmVoYXZlIGFwcHJvcHJpYXRlbHkgYmFzZWQgb24gd2hldGhlciBpdCBpcworICogIG9uIHRoZSBjbGllbnQgb3Igc2VydmVyOgorICogIDxVTD4KKyAqICAgIDxsaT5DbGllbnQ6IHJ1bnRpbWUgTVVTVCB0aHJvdyBhCisgKiAgPGNvZGU+V2ViU2VydmljZUV4Y2VwdGlvbjwvY29kZT4gbm8gc29vbmVyIHRoYW4gd2hlbiBvbmUgb2YgdGhlIG1ldGhvZHMKKyAqICBhYm92ZSBpcyBpbnZva2VkIGJ1dCBubyBsYXRlciB0aGFuIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIGFuIGVuZHBvaW50CisgKiAgb3BlcmF0aW9uLgorICogICAgPGxpPlNlcnZlcjogdGhyb3cgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIGFuZCB0aGUgZW5kcG9pbnQgTVVTVCBmYWlsIHRvIGRlcGxveQorICogIDwvdWw+CisgKiAgPGxpPiBESVNBQkxFRDogSW4gdGhpcyBNb2RlLCBhbiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHdoZXRoZXIKKyAqICB0byBpbnNwZWN0IHRoZSA8Y29kZT53c2RsOmJpbmRpbmc8Y29kZT4gb3Igbm90IGFuZCB0byB3aGF0IGRlZ3JlZQorICogIHRoZSA8Y29kZT53c2RsOmJpbmRpbmc8L2NvZGU+IHdpbGwgYmUgaW5zcGVjdGVkLiAgRm9yIGV4YW1wbGUsCisgKiAgb25lIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gYmVoYXZlIGFzIGlmIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLAorICogIGFub3RoZXIgaW1wbGVtZW50YXRpb24gbWF5IG9ubHkgY2hvb3NlIHRvIHZlcmlmeSB0aGUgU0VJJ3MKKyAqICBwYXJhbWV0ZXIvcmV0dXJuIHR5cGUgYmluZGluZ3MuCisgKiA8L3VsPgorICoKKyAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmUKKyAqCisgKiBAc2luY2UgSkFYLVdTIDIuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVzcGVjdEJpbmRpbmdGZWF0dXJlIGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmUgeworICAgIC8qKgorICAgICAqCisgICAgICogQ29uc3RhbnQgdmFsdWUgaWRlbnRpZnlpbmcgdGhlIFJlc3BlY3RCaW5kaW5nRmVhdHVyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZ0ZlYXR1cmUiOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIDxjb2RlPlJlc3BlY3RCaW5kaW5nRmVhdHVyZTwvY29kZT4uCisgICAgICogVGhlIGluc3RhbmNlIGNyZWF0ZWQgd2lsbCBiZSBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBSZXNwZWN0QmluZGluZ0ZlYXR1cmUoKSB7CisgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBSZXNwZWN0QmluZGluZ0ZlYXR1cmUKKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgZmVhdHVyZSBzaG91bGQKKyAgICAgKiBiZSBlbmFibGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzcGVjdEJpbmRpbmdGZWF0dXJlKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gSUQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1Jlc3BvbnNlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcG9uc2UuamF2YQppbmRleCBlMGRjM2FjLi40MjlhNzQ2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcG9uc2UuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcG9uc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNSw4ICszNSw4IEBACiAgKiAgPHA+Rm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaW52b2NhdGlvbnMgaXQgcHJvdmlkZXMgYWRkaXRpb25hbCBtZXRob2RzCiAgKiAgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgcmVxdWVzdC4gVGhlIDxjb2RlPmdldCguLi4pPC9jb2RlPiBtZXRob2RzIG1heQogICogIHRocm93IHRoZSBzdGFuZGFyZAotICogIHNldCBvZiBleGNlcHRpb25zIGFuZCB0aGVpciBjYXVzZSBtYXkgYmUgYSBSZW1vdGVFeGNlcHRpb24gb3IgYQotICogIFdlYlNlcnZpY2VFeGNlcHRpb24gdGhhdCByZXByZXNlbnRzIHRoZSBlcnJvciB0aGF0IG9jY3VyZWQgZHVyaW5nIHRoZQorICogIHNldCBvZiBleGNlcHRpb25zIGFuZCB0aGVpciBjYXVzZSBtYXkgYmUgYSA8Y29kZT5SZW1vdGVFeGNlcHRpb248L2NvZGU+IG9yIGEKKyAqICB7QGxpbmsgV2ViU2VydmljZUV4Y2VwdGlvbn0gdGhhdCByZXByZXNlbnRzIHRoZSBlcnJvciB0aGF0IG9jY3VyZWQgZHVyaW5nIHRoZQogICogIGFzeW5jaHJvbm91cyBtZXRob2QgaW52b2NhdGlvbi48L3A+CiAgKgogICogIEBzaW5jZSBKQVgtV1MgMi4wCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcG9uc2VXcmFwcGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvUmVzcG9uc2VXcmFwcGVyLmphdmEKaW5kZXggOTUyOGYwNy4uODM5NThmOCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1Jlc3BvbnNlV3JhcHBlci5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9SZXNwb25zZVdyYXBwZXIuamF2YQpAQCAtMzEsMTEgKzMxLDExIEBACiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwogLyoqCiAgKiBVc2VkIHRvIGFubm90YXRlIG1ldGhvZHMgaW4gdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIHdpdGggdGhlIHJlc3BvbnNlCi0gKiB3cmFwcGVyIGJlYW4gdG8gYmUgdXNlZCBhdCBydW50aW1lLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbG9jYWxOYW1lIGlzCi0gKiB0aGUgb3BlcmF0aW9uTmFtZSBhcyBkZWZpbmVkIGluIFdlYk1ldGhvZCBhbm5vdGF0aW9uIGFwcGVuZGVkIHdpdGgKLSAqIFJlc3BvbnNlIGFuZCB0aGUgdGFyZ2V0TmFtZXNwYWNlIGlzIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBTRUkuCisgKiB3cmFwcGVyIGJlYW4gdG8gYmUgdXNlZCBhdCBydW50aW1lLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgPGNvZGU+bG9jYWxOYW1lPC9jb2RlPiBpcworICogdGhlIDxjb2RlPm9wZXJhdGlvbk5hbWU8L2NvZGU+IGFzIGRlZmluZWQgaW4gPGNvZGU+V2ViTWV0aG9kPC9jb2RlPiBhbm5vdGF0aW9uIGFwcGVuZGVkIHdpdGgKKyAqIDxjb2RlPlJlc3BvbnNlPC9jb2RlPiBhbmQgdGhlIDxjb2RlPnRhcmdldE5hbWVzcGFjZTwvY29kZT4gaXMgdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFNFSS4KICAqIDxwPiBXaGVuIHN0YXJ0aW5nIGZyb20gSmF2YSB0aGlzIGFubm90YXRpb24gaXMgdXNlZCByZXNvbHZlCi0gKiBvdmVybG9hZGluZyBjb25mbGljdHMgaW4gZG9jdW1lbnQgbGl0ZXJhbCBtb2RlLiBPbmx5IHRoZSBjbGFzc05hbWUKKyAqIG92ZXJsb2FkaW5nIGNvbmZsaWN0cyBpbiBkb2N1bWVudCBsaXRlcmFsIG1vZGUuIE9ubHkgdGhlIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4KICAqIGlzIHJlcXVpcmVkIGluIHRoaXMgY2FzZS4KICAqCiAgKiAgQHNpbmNlIEpBWC1XUyAyLjAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogICAvKioKIAotICAgKiAgRWxlbWVudHMgbG9jYWwgbmFtZS4KKyAgICogIEVsZW1lbnQncyBsb2NhbCBuYW1lLgogCiAgICoqLwogCkBAIC01OCw3ICs1OCw3IEBACiAKICAgLyoqCiAKLSAgICogIEVsZW1lbnRzIG5hbWVzcGFjZSBuYW1lLgorICAgKiAgRWxlbWVudCdzIG5hbWVzcGFjZSBuYW1lLgogCiAgICoqLwogCmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvU2VydmljZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1NlcnZpY2UuamF2YQppbmRleCA4MmIzZjVlLi5hZTA0OTE2IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvU2VydmljZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9TZXJ2aWNlLmphdmEKQEAgLTMzLDE0ICszMywxNCBAQAogaW1wb3J0IGphdmF4LnhtbC53cy5zcGkuUHJvdmlkZXI7CiAKIC8qKgotICogIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdHMgcHJvdmlkZSB0aGUgY2xpZW50IHZpZXcgb2YgYSBXZWIgc2VydmljZS4KLSAqICA8cD48Y29kZT5TZXJ2aWNlPC9jb2RlPiBhY3RzIGFzIGEgZmFjdG9yeSBvZiB0aGUgZm9sbG93aW5nOgotICogIDx1bD4KLSAqICA8bGk+UHJveGllcyBmb3IgYSB0YXJnZXQgc2VydmljZSBlbmRwb2ludC4KLSAqICA8bGk+SW5zdGFuY2VzIG9mIDxjb2RlPmphdmF4LnhtbC53cy5EaXNwYXRjaDwvY29kZT4gZm9yCi0gKiAgICAgIGR5bmFtaWMgbWVzc2FnZS1vcmllbnRlZCBpbnZvY2F0aW9uIG9mIGEgcmVtb3RlCi0gKiAgICAgIG9wZXJhdGlvbi4KLSAqICA8L2xpPgorICogPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0cyBwcm92aWRlIHRoZSBjbGllbnQgdmlldyBvZiBhIFdlYiBzZXJ2aWNlLgorICogPHA+PGNvZGU+U2VydmljZTwvY29kZT4gYWN0cyBhcyBhIGZhY3Rvcnkgb2YgdGhlIGZvbGxvd2luZzoKKyAqIDx1bD4KKyAqIDxsaT5Qcm94aWVzIGZvciBhIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50LgorICogPGxpPkluc3RhbmNlcyBvZiB7QGxpbmsgamF2YXgueG1sLndzLkRpc3BhdGNofSBmb3IKKyAqICAgICBkeW5hbWljIG1lc3NhZ2Utb3JpZW50ZWQgaW52b2NhdGlvbiBvZiBhIHJlbW90ZQorICogICAgIG9wZXJhdGlvbi4KKyAqIDwvbGk+CiAgKgogICogPHA+VGhlIHBvcnRzIGF2YWlsYWJsZSBvbiBhIHNlcnZpY2UgY2FuIGJlIGVudW1lcmF0ZWQgdXNpbmcgdGhlCiAgKiA8Y29kZT5nZXRQb3J0czwvY29kZT4gbWV0aG9kLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHBhc3MgYQpAQCAtNTYsMjgwICs1Niw2NTggQEAKICAqIGNhbiBiZSBlbmFibGVkIGJ5IGNyZWF0aW5nIGEgPGNvZGU+VGhyZWFkUG9vbEV4ZWN1dG9yPC9jb2RlPiBhbmQKICAqIHJlZ2lzdGVyaW5nIGl0IHdpdGggdGhlIHNlcnZpY2UuCiAgKgotICogIEBzaW5jZSBKQVgtV1MgMi4wCisgKiBAc2luY2UgSkFYLVdTIDIuMAogICoKLSAqICBAc2VlIGphdmF4LnhtbC53cy5zcGkuUHJvdmlkZXIKLSAqICBAc2VlIGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlcgotICogIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKLSoqLworICogQHNlZSBqYXZheC54bWwud3Muc3BpLlByb3ZpZGVyCisgKiBAc2VlIGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlcgorICogQHNlZSBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcgorICoqLwogcHVibGljIGNsYXNzIFNlcnZpY2UgewogCi0gIHByaXZhdGUgU2VydmljZURlbGVnYXRlIGRlbGVnYXRlOwotICAvKioKLSAgICogVGhlIG9yaWVudGF0aW9uIG9mIGEgZHluYW1pYyBjbGllbnQgb3Igc2VydmljZS4gTUVTU0FHRSBwcm92aWRlcwotICAgKiBhY2Nlc3MgdG8gZW50aXJlIHByb3RvY29sIG1lc3NhZ2UsIFBBWUxPQUQgdG8gcHJvdG9jb2wgbWVzc2FnZQotICAgKiBwYXlsb2FkIG9ubHkuCi0gICoqLwotICBwdWJsaWMgZW51bSBNb2RlIHsgTUVTU0FHRSwgUEFZTE9BRCB9OworICAgIHByaXZhdGUgU2VydmljZURlbGVnYXRlIGRlbGVnYXRlOworICAgIC8qKgorICAgICAqIFRoZSBvcmllbnRhdGlvbiBvZiBhIGR5bmFtaWMgY2xpZW50IG9yIHNlcnZpY2UuIDxjb2RlPk1FU1NBR0U8L2NvZGU+IHByb3ZpZGVzCisgICAgICogYWNjZXNzIHRvIGVudGlyZSBwcm90b2NvbCBtZXNzYWdlLCA8Y29kZT5QQVlMT0FEPC9jb2RlPiB0byBwcm90b2NvbCBtZXNzYWdlCisgICAgICogcGF5bG9hZCBvbmx5LgorICAgICAqKi8KKyAgICBwdWJsaWMgZW51bSBNb2RlIHsgTUVTU0FHRSwgUEFZTE9BRCB9OwogCi0gIHByb3RlY3RlZCBTZXJ2aWNlKGphdmEubmV0LlVSTCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpCi0gIHsKLSAgICAgIGRlbGVnYXRlID0gUHJvdmlkZXIucHJvdmlkZXIoKS5jcmVhdGVTZXJ2aWNlRGVsZWdhdGUod3NkbERvY3VtZW50TG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkpOwotICB9CisgICAgcHJvdGVjdGVkIFNlcnZpY2UoamF2YS5uZXQuVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgeworICAgICAgICBkZWxlZ2F0ZSA9IFByb3ZpZGVyLnByb3ZpZGVyKCkuY3JlYXRlU2VydmljZURlbGVnYXRlKHdzZGxEb2N1bWVudExvY2F0aW9uLAorICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgfQogCiAKLSAgLyoqIFRoZSBnZXRQb3J0IG1ldGhvZCByZXR1cm5zIGEgc3R1Yi4gQSBzZXJ2aWNlIGNsaWVudAotICAgKiAgdXNlcyB0aGlzIHN0dWIgdG8gaW52b2tlIG9wZXJhdGlvbnMgb24gdGhlIHRhcmdldAotICAgKiAgc2VydmljZSBlbmRwb2ludC4gVGhlIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KLSAgICogIHNwZWNpZmllcyB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkKLSAgICogIHRoZSBjcmVhdGVkIGR5bmFtaWMgcHJveHkgb3Igc3R1YiBpbnN0YW5jZS4KLSAgICoKLSAgICogIEBwYXJhbSBwb3J0TmFtZSAgUXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW4KLSAgICogICAgICAgICAgICAgICAgICAgdGhlIFdTREwgc2VydmljZSBkZXNjcmlwdGlvbgotICAgKiAgQHBhcmFtIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBTZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQotICAgKiAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIGR5bmFtaWMgcHJveHkgb3Igc3R1YgotICAgKiAgICAgICAgICAgICAgICAgICBpbnN0YW5jZQotICAgKiAgQHJldHVybiBPYmplY3QgUHJveHkgaW5zdGFuY2UgdGhhdAotICAgKiAgICAgICAgICAgICAgICAgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50Ci0gICAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UKLSAgICogIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gdGhlCi0gICAqICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBjYXNlczoKLSAgICogICAgICAgICAgICAgICAgICAgPFVMPgotICAgKiAgICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gY3JlYXRpb24gb2YKLSAgICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm94eQotICAgKiAgICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW55IG1pc3NpbmcgV1NETCBtZXRhZGF0YQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgYXMgcmVxdWlyZWQgYnkgdGhpcyBtZXRob2QKLSAgICogICAgICAgICAgICAgICAgICAgPExJPk9wdGlvbmFsbHksIGlmIGFuIGlsbGVnYWwKLSAgICogICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIG9yIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBpcyBzcGVjaWZpZWQKLSAgICogICAgICAgICAgICAgICAgICAgPC9VTD4KLSAgICogIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuUHJveHkKLSAgICogIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXIKLSAgKiovCi0gIHB1YmxpYyA8VD4gVCBnZXRQb3J0KFFOYW1lIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8VD4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQotICB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UG9ydChwb3J0TmFtZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLSAgfQorICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5nZXRQb3J0PC9jb2RlPiBtZXRob2QgcmV0dXJucyBhIHByb3h5LiBBIHNlcnZpY2UgY2xpZW50CisgICAgICogdXNlcyB0aGlzIHByb3h5IHRvIGludm9rZSBvcGVyYXRpb25zIG9uIHRoZSB0YXJnZXQKKyAgICAgKiBzZXJ2aWNlIGVuZHBvaW50LiBUaGUgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgorICAgICAqIHNwZWNpZmllcyB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkKKyAgICAgKiB0aGUgY3JlYXRlZCBkeW5hbWljIHByb3h5IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSBlbmRwb2ludCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgdGhlIFdTREwgc2VydmljZSBkZXNjcmlwdGlvbi4KKyAgICAgKiBAcGFyYW0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIFNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIGR5bmFtaWMgcHJveHkgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBPYmplY3QgUHJveHkgaW5zdGFuY2UgdGhhdAorICAgICAqICAgICAgICAgICAgICAgIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgc2VydmljZSBlbmRwb2ludAorICAgICAqICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIGNhc2VzOgorICAgICAqICAgICAgICAgICAgICAgICAgPFVMPgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFuIGVycm9yIGluIGNyZWF0aW9uIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3h5LgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFueSBtaXNzaW5nIFdTREwgbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyByZXF1aXJlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiBhbiBpbGxlZ2FsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9yIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgICAgICA8L1VMPgorICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuUHJveHkKKyAgICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyCisgICAgICoqLworICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KFFOYW1lIHBvcnROYW1lLAorICAgICAgICAgICAgQ2xhc3M8VD4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQb3J0KHBvcnROYW1lLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOworICAgIH0KIAotICAvKiogVGhlIGdldFBvcnQgbWV0aG9kIHJldHVybnMgYSBzdHViLiBUaGUgcGFyYW1ldGVyCi0gICAqICA8Y29kZT5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L2NvZGU+IHNwZWNpZmllcyB0aGUgc2VydmljZQotICAgKiAgZW5kcG9pbnQgaW50ZXJmYWNlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSByZXR1cm5lZCBwcm94eS4KLSAgICogIEluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgdGhlIEpBWC1XUwotICAgKiAgcnVudGltZSBzeXN0ZW0gdGFrZXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHNlbGVjdGluZyBhIHByb3RvY29sCi0gICAqICBiaW5kaW5nIChhbmQgYSBwb3J0KSBhbmQgY29uZmlndXJpbmcgdGhlIHByb3h5IGFjY29yZGluZ2x5LgotICAgKiAgVGhlIHJldHVybmVkIHByb3h5IHNob3VsZCBub3QgYmUgcmVjb25maWd1cmVkIGJ5IHRoZSBjbGllbnQuCi0gICAqCi0gICAqICBAcGFyYW0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIFNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlCi0gICAqICBAcmV0dXJuIE9iamVjdCBpbnN0YW5jZSB0aGF0IHN1cHBvcnRzIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKLSAgICogIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgKiAgICAgICAgICAgICAgICAgICA8VUw+Ci0gICAqICAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgY3JlYXRpb24KLSAgICogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcm94eQotICAgKiAgICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW55IG1pc3NpbmcgV1NETCBtZXRhZGF0YQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgYXMgcmVxdWlyZWQgYnkgdGhpcyBtZXRob2QKLSAgICogICAgICAgICAgICAgICAgICAgPExJPk9wdGlvbmFsbHksIGlmIGFuIGlsbGVnYWwKLSAgICogICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIGlzIHNwZWNpZmllZAotICAgKiAgICAgICAgICAgICAgICAgICA8L1VMPgotICAqKi8KLSAgcHVibGljIDxUPiBUIGdldFBvcnQoQ2xhc3M8VD4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UG9ydChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotICB9Ci0KLSAgLyoqIENyZWF0ZXMgYSBuZXcgcG9ydCBmb3IgdGhlIHNlcnZpY2UuIFBvcnRzIGNyZWF0ZWQgaW4gdGhpcyB3YXkgY29udGFpbgotICAgKiAgbm8gV1NETCBwb3J0IHR5cGUgaW5mb3JtYXRpb24gYW5kIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nCi0gICAqICA8Y29kZT5EaXNwYXRjaDwvY29kZT5pbnN0YW5jZXMuCi0gICAqCi0gICAqICBAcGFyYW0gcG9ydE5hbWUgIFF1YWxpZmllZCBuYW1lIGZvciB0aGUgdGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQKLSAgICogIEBwYXJhbSBiaW5kaW5nSWQgQSBTdHJpbmcgaWRlbnRpZmllciBvZiBhIGJpbmRpbmcuCi0gICAqICBAcGFyYW0gZW5kcG9pbnRBZGRyZXNzIEFkZHJlc3Mgb2YgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50IGFzIGEgVVJJCi0gICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgYW55IGVycm9yIGluIHRoZSBjcmVhdGlvbiBvZgotICAgKiAgdGhlIHBvcnQKLSAgICoKLSAgICogIEBzZWUgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcjU09BUDExSFRUUF9CSU5ESU5HCi0gICAqICBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI1NPQVAxMkhUVFBfQklORElORwotICAgKiAgQHNlZSBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZyNIVFRQX0JJTkRJTkcKLSAgICoqLwotICBwdWJsaWMgdm9pZCBhZGRQb3J0KFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKQotICB7Ci0gICAgICBkZWxlZ2F0ZS5hZGRQb3J0KHBvcnROYW1lLCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gIH0KLQotICAvKiogQ3JlYXRlcyBhIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBpbnN0YW5jZSBmb3IgdXNlIHdpdGggb2JqZWN0cyBvZgotICAgKiAgdGhlIHVzZXJzIGNob29zaW5nLgotICAgKgotICAgKiAgQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50Ci0gICAqICBAcGFyYW0gdHlwZSBUaGUgY2xhc3Mgb2Ygb2JqZWN0IHVzZWQgdG8gbWVzc2FnZXMgb3IgbWVzc2FnZQotICAgKiAgcGF5bG9hZHMuIEltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydAotICAgKiAgPGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U8L2NvZGU+LCA8Y29kZT5qYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTwvY29kZT4KLSAgICogIGFuZCA8Y29kZT5qYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U8L2NvZGU+LCBkZXBlbmRpbmcgb24KLSAgICogIHRoZSBiaW5kaW5nIGluIHVzZS4KLSAgICogIEBwYXJhbSBtb2RlIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNyZWF0ZWQgZGlzcGF0Y2ggaW5zdGFuY2UgaXMgbWVzc2FnZQotICAgKiAgb3IgcGF5bG9hZCBvcmllbnRlZCwgaS5lLiB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoIGNvbXBsZXRlCi0gICAqICBwcm90b2NvbCBtZXNzYWdlcyBvciBtZXNzYWdlIHBheWxvYWRzLiBFLmcuIHdoZW4gdXNpbmcgdGhlIFNPQVAKLSAgICogIHByb3RvY29sLCB0aGlzIHBhcmFtZXRlciBjb250cm9scyB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoCi0gICAqICBTT0FQIG1lc3NhZ2VzIG9yIHRoZSBjb250ZW50cyBvZiBhIFNPQVAgYm9keS4gTW9kZSBtdXN0IGJlIE1FU1NBR0UKLSAgICogIHdoZW4gdHlwZSBpcyBTT0FQTWVzc2FnZS4KLSAgICoKLSAgICogIEByZXR1cm4gRGlzcGF0Y2ggaW5zdGFuY2UKLSAgICogIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCi0gICAqICAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gb2JqZWN0Ci0gICAqICBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlCi0gICAqICBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlCi0gICAqKi8KLSAgcHVibGljIDxUPiBEaXNwYXRjaDxUPiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgQ2xhc3M8VD4gdHlwZSwgTW9kZSBtb2RlKQotICB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIHR5cGUsIG1vZGUpOwotICB9Ci0KLSAgLyoqIENyZWF0ZXMgYSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gaW5zdGFuY2UgZm9yIHVzZSB3aXRoIEpBWEIKLSAgICogIGdlbmVyYXRlZCBvYmplY3RzLgotICAgKgotICAgKiAgQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50Ci0gICAqICBAcGFyYW0gY29udGV4dCBUaGUgSkFYQiBjb250ZXh0IHVzZWQgdG8gbWFyc2hhbGwgYW5kIHVubWFyc2hhbGwKLSAgICogIG1lc3NhZ2VzIG9yIG1lc3NhZ2UgcGF5bG9hZHMuCi0gICAqICBAcGFyYW0gbW9kZSBDb250cm9scyB3aGV0aGVyIHRoZSBjcmVhdGVkIGRpc3BhdGNoIGluc3RhbmNlIGlzIG1lc3NhZ2UKLSAgICogIG9yIHBheWxvYWQgb3JpZW50ZWQsIGkuZS4gd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aCBjb21wbGV0ZQotICAgKiAgcHJvdG9jb2wgbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4gRS5nLiB3aGVuIHVzaW5nIHRoZSBTT0FQCi0gICAqICBwcm90b2NvbCwgdGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aAotICAgKiAgU09BUCBtZXNzYWdlcyBvciB0aGUgY29udGVudHMgb2YgYSBTT0FQIGJvZHkuCi0gICAqCi0gICAqICBAcmV0dXJuIERpc3BhdGNoIGluc3RhbmNlCi0gICAqICBAdGhyb3dzIFNlcnZpY2VFeGNlcHRpb24gSWYgYW55IGVycm9yIGluIHRoZSBjcmVhdGlvbiBvZgotICAgKiAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdAotICAgKgotICAgKiAgQHNlZSBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dAotICAgKiovCi0gIHB1YmxpYyBEaXNwYXRjaDxPYmplY3Q+IGNyZWF0ZURpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBKQVhCQ29udGV4dCBjb250ZXh0LAotICAgICAgTW9kZSBtb2RlKQotICB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIGNvbnRleHQsICBtb2RlKTsKLSAgfQorICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5nZXRQb3J0PC9jb2RlPiBtZXRob2QgcmV0dXJucyBhIHByb3h5LiBBIHNlcnZpY2UgY2xpZW50CisgICAgICogdXNlcyB0aGlzIHByb3h5IHRvIGludm9rZSBvcGVyYXRpb25zIG9uIHRoZSB0YXJnZXQKKyAgICAgKiBzZXJ2aWNlIGVuZHBvaW50LiBUaGUgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgorICAgICAqIHNwZWNpZmllcyB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkKKyAgICAgKiB0aGUgY3JlYXRlZCBkeW5hbWljIHByb3h5IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSBlbmRwb2ludCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgdGhlIFdTREwgc2VydmljZSBkZXNjcmlwdGlvbi4KKyAgICAgKiBAcGFyYW0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIFNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIGR5bmFtaWMgcHJveHkgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIGZlYXR1cmVzICBBIGxpc3Qgb2YgV2ViU2VydmljZUZlYXR1cmVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBwcm94eS4gIFN1cHBvcnRlZCBmZWF0dXJlcyBub3QgaW4gdGhlIDxjb2RlPmZlYXR1cmVzCisgICAgICogICAgICAgICAgICAgICAgPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIEByZXR1cm4gT2JqZWN0IFByb3h5IGluc3RhbmNlIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgZW5kcG9pbnQKKyAgICAgKiAgICAgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBjYXNlczoKKyAgICAgKiAgICAgICAgICAgICAgICAgIDxVTD4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjcmVhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm94eS4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbnkgbWlzc2luZyBXU0RMIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXMgcmVxdWlyZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYW4gaWxsZWdhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciA8Y29kZT5wb3J0TmFtZTwvY29kZT4gaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIGEgZmVhdHVyZSBpcyBlbmFibGVkIHRoYXQgaXMgbm90IGNvbXBhdGlibGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoaXMgcG9ydCBvciBpcyB1bnN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDwvVUw+CisgICAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eQorICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXIKKyAgICAgKiBAc2VlIFdlYlNlcnZpY2VGZWF0dXJlCisgICAgICoKKyAgICAgKiBAc2luY2UgSkFYLVdTIDIuMQorICAgICAqKi8KKyAgICBwdWJsaWMgPFQ+IFQgZ2V0UG9ydChRTmFtZSBwb3J0TmFtZSwKKyAgICAgICAgICAgIENsYXNzPFQ+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFBvcnQocG9ydE5hbWUsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgZmVhdHVyZXMpOworICAgIH0KIAogCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPmdldFBvcnQ8L2NvZGU+IG1ldGhvZCByZXR1cm5zIGEgcHJveHkuIFRoZSBwYXJhbWV0ZXIKKyAgICAgKiA8Y29kZT5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L2NvZGU+IHNwZWNpZmllcyB0aGUgc2VydmljZQorICAgICAqIGVuZHBvaW50IGludGVyZmFjZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUgcmV0dXJuZWQgcHJveHkuCisgICAgICogSW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLCB0aGUgSkFYLVdTCisgICAgICogcnVudGltZSBzeXN0ZW0gdGFrZXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHNlbGVjdGluZyBhIHByb3RvY29sCisgICAgICogYmluZGluZyAoYW5kIGEgcG9ydCkgYW5kIGNvbmZpZ3VyaW5nIHRoZSBwcm94eSBhY2NvcmRpbmdseS4KKyAgICAgKiBUaGUgcmV0dXJuZWQgcHJveHkgc2hvdWxkIG5vdCBiZSByZWNvbmZpZ3VyZWQgYnkgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgU2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiBPYmplY3QgaW5zdGFuY2UgdGhhdCBzdXBwb3J0cyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4KKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxVTD4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgY3JlYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJveHkuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW55IG1pc3NpbmcgV1NETCBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIGFuIGlsbGVnYWwuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDwvVUw+CisgICAgICoqLworICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KENsYXNzPFQ+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UG9ydChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOworICAgIH0KIAotICAvKiogR2V0cyB0aGUgbmFtZSBvZiB0aGlzIHNlcnZpY2UuCi0gICAqICBAcmV0dXJuIFF1YWxpZmllZCBuYW1lIG9mIHRoaXMgc2VydmljZQotICAqKi8KLSAgcHVibGljIFFOYW1lIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFNlcnZpY2VOYW1lKCk7Ci0gIH0KIAotICAvKiogUmV0dXJucyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gZm9yIHRoZSBsaXN0IG9mCi0gICAqICA8Y29kZT5RTmFtZTwvY29kZT5zIG9mIHNlcnZpY2UgZW5kcG9pbnRzIGdyb3VwZWQgYnkgdGhpcwotICAgKiAgc2VydmljZQotICAgKgotICAgKiAgQHJldHVybiBSZXR1cm5zIDxjb2RlPmphdmEudXRpbC5JdGVyYXRvcjwvY29kZT4gd2l0aCBlbGVtZW50cwotICAgKiAgICAgICAgICBvZiB0eXBlIDxjb2RlPmphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU8L2NvZGU+Ci0gICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgdGhpcyBTZXJ2aWNlIGNsYXNzIGRvZXMgbm90Ci0gICAqICAgICAgICAgIGhhdmUgYWNjZXNzIHRvIHRoZSByZXF1aXJlZCBXU0RMIG1ldGFkYXRhCi0gICoqLwotICBwdWJsaWMgSXRlcmF0b3I8amF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZT4gZ2V0UG9ydHMoKSB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UG9ydHMoKTsKLSAgfQorICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5nZXRQb3J0PC9jb2RlPiBtZXRob2QgcmV0dXJucyBhIHByb3h5LiBUaGUgcGFyYW1ldGVyCisgICAgICogPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPiBzcGVjaWZpZXMgdGhlIHNlcnZpY2UKKyAgICAgKiBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJldHVybmVkIHByb3h5LgorICAgICAqIEluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgdGhlIEpBWC1XUworICAgICAqIHJ1bnRpbWUgc3lzdGVtIHRha2VzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBzZWxlY3RpbmcgYSBwcm90b2NvbAorICAgICAqIGJpbmRpbmcgKGFuZCBhIHBvcnQpIGFuZCBjb25maWd1cmluZyB0aGUgcHJveHkgYWNjb3JkaW5nbHkuCisgICAgICogVGhlIHJldHVybmVkIHByb3h5IHNob3VsZCBub3QgYmUgcmVjb25maWd1cmVkIGJ5IHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIFNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgorICAgICAqIEBwYXJhbSBmZWF0dXJlcyAgQSBsaXN0IG9mIFdlYlNlcnZpY2VGZWF0dXJlcyB0byBjb25maWd1cmUgb24gdGhlCisgICAgICogICAgICAgICAgICAgICAgcHJveHkuICBTdXBwb3J0ZWQgZmVhdHVyZXMgbm90IGluIHRoZSA8Y29kZT5mZWF0dXJlcworICAgICAqICAgICAgICAgICAgICAgIDwvY29kZT4gcGFyYW1ldGVyIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIE9iamVjdCBpbnN0YW5jZSB0aGF0IHN1cHBvcnRzIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgPFVMPgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBjcmVhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcm94eS4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbnkgbWlzc2luZyBXU0RMIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXMgcmVxdWlyZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYW4gaWxsZWdhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYSBmZWF0dXJlIGlzIGVuYWJsZWQgdGhhdCBpcyBub3QgY29tcGF0aWJsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhpcyBwb3J0IG9yIGlzIHVuc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgICAgICAgICAgPC9VTD4KKyAgICAgKgorICAgICAqIEBzZWUgV2ViU2VydmljZUZlYXR1cmUKKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgICoqLworICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KENsYXNzPFQ+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwKKyAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQb3J0KHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgZmVhdHVyZXMpOworICAgIH0KIAotICAvKiogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIFdTREwgZG9jdW1lbnQgZm9yIHRoaXMgU2VydmljZS4KLSAgICoKLSAgICogIEByZXR1cm4gVVJMIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlIFdTREwgZG9jdW1lbnQgZm9yCi0gICAqICAgICAgICAgIHRoaXMgc2VydmljZQotICAqKi8KLSAgcHVibGljIGphdmEubmV0LlVSTCBnZXRXU0RMRG9jdW1lbnRMb2NhdGlvbigpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRXU0RMRG9jdW1lbnRMb2NhdGlvbigpOwotICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyZWQgaGFuZGxlciByZXNvbHZlci4KLSAgICoKLSAgICogIEByZXR1cm4gSGFuZGxlclJlc29sdmVyIFRoZSA8Y29kZT5IYW5kbGVyUmVzb2x2ZXI8L2NvZGU+IGJlaW5nCi0gICAqICAgICAgICAgIHVzZWQgYnkgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogICAgICAgICAgaWYgdGhlcmUgaXNuJ3Qgb25lLgotICAqKi8KKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+Z2V0UG9ydDwvY29kZT4gbWV0aG9kIHJldHVybnMgYSBwcm94eS4KKyAgICAgKiBUaGUgcGFyYW1ldGVyIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBzcGVjaWZpZXMgdGhlCisgICAgICogZW5kcG9pbnQgdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlIHJldHVybmVkIHByb3h5LiAgSWYgdGhlcmUKKyAgICAgKiBhcmUgYW55IHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGluIHRoZQorICAgICAqIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiwgdGhlbiB0aG9zZSByZWZlcmVuY2UKKyAgICAgKiBwYXJhbWV0ZXJzIE1VU1QgYXBwZWFyIGFzIFNPQVAgaGVhZGVycywgaW5kaWNhdGluZyB0aGVtIHRvIGJlCisgICAgICogcmVmZXJlbmNlIHBhcmFtZXRlcnMsIG9uIGFsbCBtZXNzYWdlcyBzZW50IHRvIHRoZSBlbmRwb2ludC4KKyAgICAgKiBUaGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2UnczwvY29kZT4gYWRkcmVzcyBNVVNUIGJlIHVzZWQKKyAgICAgKiBmb3IgaW52b2NhdGlvbnMgb24gdGhlIGVuZHBvaW50LgorICAgICAqIFRoZSBwYXJhbWV0ZXIgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPiBzcGVjaWZpZXMKKyAgICAgKiB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogcmV0dXJuZWQgcHJveHkuCisgICAgICogSW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLCB0aGUgSkFYLVdTCisgICAgICogcnVudGltZSBzeXN0ZW0gdGFrZXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHNlbGVjdGluZyBhIHByb3RvY29sCisgICAgICogYmluZGluZyAoYW5kIGEgcG9ydCkgYW5kIGNvbmZpZ3VyaW5nIHRoZSBwcm94eSBhY2NvcmRpbmdseSBmcm9tCisgICAgICogdGhlIFdTREwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2Ugb3IKKyAgICAgKiBmcm9tIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uCisgICAgICogSWYgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZSBoYXMgYSBXU0RMIGFuZAorICAgICAqIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gbWV0YWRhdGEKKyAgICAgKiBhbHNvIGhhcyBhIFdTREwsIHRoZW4gdGhlIFdTREwgZnJvbSB0aGlzIGluc3RhbmNlIE1VU1QgYmUgdXNlZC4KKyAgICAgKiBJZiB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgYSBXU0RMIGFuZAorICAgICAqIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gZG9lcyBoYXZlIGEgV1NETCwgdGhlbiB0aGUKKyAgICAgKiBXU0RMIGZyb20gdGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBNQVkgYmUgdXNlZC4KKyAgICAgKiBUaGUgcmV0dXJuZWQgcHJveHkgc2hvdWxkIG5vdCBiZSByZWNvbmZpZ3VyZWQgYnkgdGhlIGNsaWVudC4KKyAgICAgKiBJZiB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlIGhhcyBhIGtub3duIHByb3h5CisgICAgICogcG9ydCB0aGF0IG1hdGNoZXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbgorICAgICAqIHRoZSBXU0RMLAorICAgICAqIHRoZW4gdGhhdCBwcm94eSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIGEgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqIGlzIHRocm93bi4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgZm9sbG93aW5nCisgICAgICogPHByZT4KKyAgICAgKiA8Y29kZT5wb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnROYW1lLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOzwvY29kZT4KKyAgICAgKiA8L3ByZT4KKyAgICAgKiB3aGVyZSB0aGUgPGNvZGU+cG9ydE5hbWU8L2NvZGU+IGlzIHJldHJpZXZlZCBmcm9tIHRoZQorICAgICAqIG1ldGFkYXRhIG9mIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gb3IgZnJvbSB0aGUKKyAgICAgKiA8Y29kZT5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L2NvZGU+IGFuZCB0aGUgV1NETAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZHBvaW50UmVmZXJlbmNlICBUaGUgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+CisgICAgICogZm9yIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludCB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUKKyAgICAgKiByZXR1cm5lZCBwcm94eS4KKyAgICAgKiBAcGFyYW0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIFNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgorICAgICAqIEBwYXJhbSBmZWF0dXJlcyAgQSBsaXN0IG9mIDxjb2RlPldlYlNlcnZpY2VGZWF0dXJlczwvY29kZT4gdG8gY29uZmlndXJlIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHByb3h5LiAgU3VwcG9ydGVkIGZlYXR1cmVzIG5vdCBpbiB0aGUgPGNvZGU+ZmVhdHVyZXMKKyAgICAgKiAgICAgICAgICAgICAgICA8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICogQHJldHVybiBPYmplY3QgUHJveHkgaW5zdGFuY2UgdGhhdCBzdXBwb3J0cyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4KKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxVTD4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgY3JlYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJveHkuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW55IG1pc3NpbmcgV1NETCBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gbWV0YWRhdGEgZG9lcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRjaCB0aGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiBhIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBjYW5ub3QgYmUgZXh0cmFjdGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgV1NETCBvciA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gbWV0YWRhdGEuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYW4gaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiBhbiBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiBhIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGF0IGlzIG5vdCBjb21wYXRpYmxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgICAgICA8L1VMPgorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIDxUPiBUIGdldFBvcnQoRW5kcG9pbnRSZWZlcmVuY2UgZW5kcG9pbnRSZWZlcmVuY2UsCisgICAgICAgICAgIENsYXNzPFQ+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFBvcnQoZW5kcG9pbnRSZWZlcmVuY2UsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgZmVhdHVyZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgcG9ydCBmb3IgdGhlIHNlcnZpY2UuIFBvcnRzIGNyZWF0ZWQgaW4gdGhpcyB3YXkgY29udGFpbgorICAgICAqIG5vIFdTREwgcG9ydCB0eXBlIGluZm9ybWF0aW9uIGFuZCBjYW4gb25seSBiZSB1c2VkIGZvciBjcmVhdGluZworICAgICAqIDxjb2RlPkRpc3BhdGNoPC9jb2RlPmluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0TmFtZSAgUXVhbGlmaWVkIG5hbWUgZm9yIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludC4KKyAgICAgKiBAcGFyYW0gYmluZGluZ0lkIEEgU3RyaW5nIGlkZW50aWZpZXIgb2YgYSBiaW5kaW5nLgorICAgICAqIEBwYXJhbSBlbmRwb2ludEFkZHJlc3MgQWRkcmVzcyBvZiB0aGUgdGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQgYXMgYSBVUkkuCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIGFueSBlcnJvciBpbiB0aGUgY3JlYXRpb24gb2YKKyAgICAgKiB0aGUgcG9ydC4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcjU09BUDExSFRUUF9CSU5ESU5HCisgICAgICogQHNlZSBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZyNTT0FQMTJIVFRQX0JJTkRJTkcKKyAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nI0hUVFBfQklORElORworICAgICAqKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3J0KFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7CisgICAgICAgIGRlbGVnYXRlLmFkZFBvcnQocG9ydE5hbWUsIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gaW5zdGFuY2UgZm9yIHVzZSB3aXRoIG9iamVjdHMgb2YKKyAgICAgKiB0aGUgdXNlcidzIGNob29zaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50CisgICAgICogQHBhcmFtIHR5cGUgVGhlIGNsYXNzIG9mIG9iamVjdCB1c2VkIGZvciBtZXNzYWdlcyBvciBtZXNzYWdlCisgICAgICogcGF5bG9hZHMuIEltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydAorICAgICAqIDxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPC9jb2RlPiwgPGNvZGU+amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U8L2NvZGU+CisgICAgICogYW5kIDxjb2RlPmphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTwvY29kZT4sIGRlcGVuZGluZyBvbgorICAgICAqIHRoZSBiaW5kaW5nIGluIHVzZS4KKyAgICAgKiBAcGFyYW0gbW9kZSBDb250cm9scyB3aGV0aGVyIHRoZSBjcmVhdGVkIGRpc3BhdGNoIGluc3RhbmNlIGlzIG1lc3NhZ2UKKyAgICAgKiBvciBwYXlsb2FkIG9yaWVudGVkLCBpLmUuIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGggY29tcGxldGUKKyAgICAgKiBwcm90b2NvbCBtZXNzYWdlcyBvciBtZXNzYWdlIHBheWxvYWRzLiBFLmcuIHdoZW4gdXNpbmcgdGhlIFNPQVAKKyAgICAgKiBwcm90b2NvbCwgdGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aAorICAgICAqIFNPQVAgbWVzc2FnZXMgb3IgdGhlIGNvbnRlbnRzIG9mIGEgU09BUCBib2R5LiBNb2RlIE1VU1QgYmUgTUVTU0FHRQorICAgICAqIHdoZW4gdHlwZSBpcyBTT0FQTWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRGlzcGF0Y2ggaW5zdGFuY2UuCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIGFueSBlcnJvciBpbiB0aGUgY3JlYXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHNlZSBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZQorICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UKKyAgICAgKiovCisgICAgcHVibGljIDxUPiBEaXNwYXRjaDxUPiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgQ2xhc3M8VD4gdHlwZSwgTW9kZSBtb2RlKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgdHlwZSwgbW9kZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IGluc3RhbmNlIGZvciB1c2Ugd2l0aCBvYmplY3RzIG9mCisgICAgICogdGhlIHVzZXIncyBjaG9vc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0TmFtZSAgUXVhbGlmaWVkIG5hbWUgZm9yIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludAorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBjbGFzcyBvZiBvYmplY3QgdXNlZCBmb3IgbWVzc2FnZXMgb3IgbWVzc2FnZQorICAgICAqIHBheWxvYWRzLiBJbXBsZW1lbnRhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQKKyAgICAgKiA8Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvY29kZT4gYW5kIDxjb2RlPmphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbW9kZSBDb250cm9scyB3aGV0aGVyIHRoZSBjcmVhdGVkIGRpc3BhdGNoIGluc3RhbmNlIGlzIG1lc3NhZ2UKKyAgICAgKiBvciBwYXlsb2FkIG9yaWVudGVkLCBpLmUuIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGggY29tcGxldGUKKyAgICAgKiBwcm90b2NvbCBtZXNzYWdlcyBvciBtZXNzYWdlIHBheWxvYWRzLiBFLmcuIHdoZW4gdXNpbmcgdGhlIFNPQVAKKyAgICAgKiBwcm90b2NvbCwgdGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aAorICAgICAqIFNPQVAgbWVzc2FnZXMgb3IgdGhlIGNvbnRlbnRzIG9mIGEgU09BUCBib2R5LiBNb2RlIE1VU1QgYmUgPGNvZGU+TUVTU0FHRTwvY29kZT4KKyAgICAgKiB3aGVuIHR5cGUgaXMgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmZWF0dXJlcyAgQSBsaXN0IG9mIDxjb2RlPldlYlNlcnZpY2VGZWF0dXJlczwvY29kZT4gdG8gY29uZmlndXJlIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHByb3h5LiAgU3VwcG9ydGVkIGZlYXR1cmVzIG5vdCBpbiB0aGUgPGNvZGU+ZmVhdHVyZXMKKyAgICAgKiAgICAgICAgICAgICAgICA8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3BhdGNoIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdCBvciBpZiBhCisgICAgICogICAgICAgICAgICAgICAgICBmZWF0dXJlIGlzIGVuYWJsZWQgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICogICAgICAgICAgICAgICAgICB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlCisgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZQorICAgICAqIEBzZWUgV2ViU2VydmljZUZlYXR1cmUKKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgICoqLworICAgIHB1YmxpYyA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIENsYXNzPFQ+IHR5cGUsCisgICAgICAgICAgICBTZXJ2aWNlLk1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCB0eXBlLCBtb2RlLCBmZWF0dXJlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IGluc3RhbmNlIGZvciB1c2Ugd2l0aCBvYmplY3RzIG9mCisgICAgICogdGhlIHVzZXIncyBjaG9vc2luZy4gSWYgdGhlcmUKKyAgICAgKiBhcmUgYW55IHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGluIHRoZQorICAgICAqIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiwgdGhlbiB0aG9zZSByZWZlcmVuY2UKKyAgICAgKiBwYXJhbWV0ZXJzIE1VU1QgYXBwZWFyIGFzIFNPQVAgaGVhZGVycywgaW5kaWNhdGluZyB0aGVtIHRvIGJlCisgICAgICogcmVmZXJlbmNlIHBhcmFtZXRlcnMsIG9uIGFsbCBtZXNzYWdlcyBzZW50IHRvIHRoZSBlbmRwb2ludC4KKyAgICAgKiBUaGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2UnczwvY29kZT4gYWRkcmVzcyBNVVNUIGJlIHVzZWQKKyAgICAgKiBmb3IgaW52b2NhdGlvbnMgb24gdGhlIGVuZHBvaW50LgorICAgICAqIEluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgdGhlIEpBWC1XUworICAgICAqIHJ1bnRpbWUgc3lzdGVtIHRha2VzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBzZWxlY3RpbmcgYSBwcm90b2NvbAorICAgICAqIGJpbmRpbmcgKGFuZCBhIHBvcnQpIGFuZCBjb25maWd1cmluZyB0aGUgZGlzcGF0Y2ggYWNjb3JkaW5nbHkgZnJvbQorICAgICAqIHRoZSBXU0RMIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlIG9yCisgICAgICogZnJvbSB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+LgorICAgICAqIElmIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UgaGFzIGEgV1NETCBhbmQKKyAgICAgKiB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+CisgICAgICogYWxzbyBoYXMgYSBXU0RMIGluIGl0cyBtZXRhZGF0YSwgdGhlbiB0aGUgV1NETCBmcm9tIHRoaXMgaW5zdGFuY2UgTVVTVCBiZSB1c2VkLgorICAgICAqIElmIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBhIFdTREwgYW5kCisgICAgICogdGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBkb2VzIGhhdmUgYSBXU0RMLCB0aGVuIHRoZQorICAgICAqIFdTREwgZnJvbSB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IE1BWSBiZSB1c2VkLgorICAgICAqIEFuIGltcGxlbWVudGF0aW9uIE1VU1QgYmUgYWJsZSB0byByZXRyaWV2ZSB0aGUgPGNvZGU+cG9ydE5hbWU8L2NvZGU+IGZyb20gdGhlCisgICAgICogPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGJlaGF2ZXMgdGhlIHNhbWUgYXMgY2FsbGluZworICAgICAqIDxwcmU+CisgICAgICogPGNvZGU+ZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCB0eXBlLCBtb2RlLCBmZWF0dXJlcyk7PC9jb2RlPgorICAgICAqIDwvcHJlPgorICAgICAqIHdoZXJlIHRoZSA8Y29kZT5wb3J0TmFtZTwvY29kZT4gaXMgcmV0cmlldmVkIGZyb20gdGhlCisgICAgICogV1NETCBvciA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gbWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kcG9pbnRSZWZlcmVuY2UgIFRoZSA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4KKyAgICAgKiBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50IHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZQorICAgICAqIHJldHVybmVkIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBvYmplY3QuCisgICAgICogQHBhcmFtIHR5cGUgVGhlIGNsYXNzIG9mIG9iamVjdCB1c2VkIHRvIG1lc3NhZ2VzIG9yIG1lc3NhZ2UKKyAgICAgKiBwYXlsb2Fkcy4gSW1wbGVtZW50YXRpb25zIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0CisgICAgICogPGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5qYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTwvY29kZT4uCisgICAgICogQHBhcmFtIG1vZGUgQ29udHJvbHMgd2hldGhlciB0aGUgY3JlYXRlZCBkaXNwYXRjaCBpbnN0YW5jZSBpcyBtZXNzYWdlCisgICAgICogb3IgcGF5bG9hZCBvcmllbnRlZCwgaS5lLiB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoIGNvbXBsZXRlCisgICAgICogcHJvdG9jb2wgbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4gRS5nLiB3aGVuIHVzaW5nIHRoZSBTT0FQCisgICAgICogcHJvdG9jb2wsIHRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGgKKyAgICAgKiBTT0FQIG1lc3NhZ2VzIG9yIHRoZSBjb250ZW50cyBvZiBhIFNPQVAgYm9keS4gTW9kZSBNVVNUIGJlIDxjb2RlPk1FU1NBR0U8L2NvZGU+CisgICAgICogd2hlbiB0eXBlIGlzIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZXMgIEFuIGFycmF5IG9mIDxjb2RlPldlYlNlcnZpY2VGZWF0dXJlczwvY29kZT4gdG8gY29uZmlndXJlIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHByb3h5LiAgU3VwcG9ydGVkIGZlYXR1cmVzIG5vdCBpbiB0aGUgPGNvZGU+ZmVhdHVyZXMKKyAgICAgKiAgICAgICAgICAgICAgICA8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3BhdGNoIGluc3RhbmNlCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICA8VUw+CisgICAgICogICAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbnkgbWlzc2luZyBXU0RMIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXMgcmVxdWlyZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT5JZiB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhIGRvZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QgbWF0Y2ggdGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBvciA8Y29kZT5wb3J0TmFtZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvZiBhIFdTREwgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPklmIHRoZSA8Y29kZT5wb3J0TmFtZTwvY29kZT4gY2Fubm90IGJlIGRldGVybWluZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhLgorICAgICAqICAgICAgICAgICAgICAgICAgICA8bGk+SWYgYW55IGVycm9yIGluIHRoZSBjcmVhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBvYmplY3QuCisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT5JZiBhIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGF0IGlzIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhpcyBwb3J0IG9yIGlzIHVuc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgICAgICAgICAgPC9VTD4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UKKyAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlCisgICAgICogQHNlZSBXZWJTZXJ2aWNlRmVhdHVyZQorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIDxUPiBEaXNwYXRjaDxUPiBjcmVhdGVEaXNwYXRjaChFbmRwb2ludFJlZmVyZW5jZSBlbmRwb2ludFJlZmVyZW5jZSwKKyAgICAgICAgICAgIENsYXNzPFQ+IHR5cGUsIFNlcnZpY2UuTW9kZSBtb2RlLAorICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZURpc3BhdGNoKGVuZHBvaW50UmVmZXJlbmNlLCB0eXBlLCBtb2RlLCBmZWF0dXJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBpbnN0YW5jZSBmb3IgdXNlIHdpdGggSkFYQgorICAgICAqIGdlbmVyYXRlZCBvYmplY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50CisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIEpBWEIgY29udGV4dCB1c2VkIHRvIG1hcnNoYWxsIGFuZCB1bm1hcnNoYWxsCisgICAgICogbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4KKyAgICAgKiBAcGFyYW0gbW9kZSBDb250cm9scyB3aGV0aGVyIHRoZSBjcmVhdGVkIGRpc3BhdGNoIGluc3RhbmNlIGlzIG1lc3NhZ2UKKyAgICAgKiBvciBwYXlsb2FkIG9yaWVudGVkLCBpLmUuIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGggY29tcGxldGUKKyAgICAgKiBwcm90b2NvbCBtZXNzYWdlcyBvciBtZXNzYWdlIHBheWxvYWRzLiBFLmcuIHdoZW4gdXNpbmcgdGhlIFNPQVAKKyAgICAgKiBwcm90b2NvbCwgdGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aAorICAgICAqIFNPQVAgbWVzc2FnZXMgb3IgdGhlIGNvbnRlbnRzIG9mIGEgU09BUCBib2R5LgorICAgICAqCisgICAgICogQHJldHVybiBEaXNwYXRjaCBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgYW55IGVycm9yIGluIHRoZSBjcmVhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgICAgICAgdGhlIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0CisgICAgICoqLworICAgIHB1YmxpYyBEaXNwYXRjaDxPYmplY3Q+IGNyZWF0ZURpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBKQVhCQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgTW9kZSBtb2RlKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgY29udGV4dCwgIG1vZGUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBpbnN0YW5jZSBmb3IgdXNlIHdpdGggSkFYQgorICAgICAqIGdlbmVyYXRlZCBvYmplY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50CisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIEpBWEIgY29udGV4dCB1c2VkIHRvIG1hcnNoYWxsIGFuZCB1bm1hcnNoYWxsCisgICAgICogbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4KKyAgICAgKiBAcGFyYW0gbW9kZSBDb250cm9scyB3aGV0aGVyIHRoZSBjcmVhdGVkIGRpc3BhdGNoIGluc3RhbmNlIGlzIG1lc3NhZ2UKKyAgICAgKiBvciBwYXlsb2FkIG9yaWVudGVkLCBpLmUuIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGggY29tcGxldGUKKyAgICAgKiBwcm90b2NvbCBtZXNzYWdlcyBvciBtZXNzYWdlIHBheWxvYWRzLiBFLmcuIHdoZW4gdXNpbmcgdGhlIFNPQVAKKyAgICAgKiBwcm90b2NvbCwgdGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aAorICAgICAqIFNPQVAgbWVzc2FnZXMgb3IgdGhlIGNvbnRlbnRzIG9mIGEgU09BUCBib2R5LgorICAgICAqIEBwYXJhbSBmZWF0dXJlcyAgQSBsaXN0IG9mIDxjb2RlPldlYlNlcnZpY2VGZWF0dXJlczwvY29kZT4gdG8gY29uZmlndXJlIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHByb3h5LiAgU3VwcG9ydGVkIGZlYXR1cmVzIG5vdCBpbiB0aGUgPGNvZGU+ZmVhdHVyZXMKKyAgICAgKiAgICAgICAgICAgICAgICA8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3BhdGNoIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdCBvciBpZiBhCisgICAgICogICAgICAgICAgICAgICAgICBmZWF0dXJlIGlzIGVuYWJsZWQgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICogICAgICAgICAgICAgICAgICB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0CisgICAgICogQHNlZSBXZWJTZXJ2aWNlRmVhdHVyZQorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIERpc3BhdGNoPE9iamVjdD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsCisgICAgICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0LCBTZXJ2aWNlLk1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBjb250ZXh0LCBtb2RlLCBmZWF0dXJlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IGluc3RhbmNlIGZvciB1c2Ugd2l0aCBKQVhCCisgICAgICogZ2VuZXJhdGVkIG9iamVjdHMuIElmIHRoZXJlCisgICAgICogYXJlIGFueSByZWZlcmVuY2UgcGFyYW1ldGVycyBpbiB0aGUKKyAgICAgKiA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4sIHRoZW4gdGhvc2UgcmVmZXJlbmNlCisgICAgICogcGFyYW1ldGVycyBNVVNUIGFwcGVhciBhcyBTT0FQIGhlYWRlcnMsIGluZGljYXRpbmcgdGhlbSB0byBiZQorICAgICAqIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLCBvbiBhbGwgbWVzc2FnZXMgc2VudCB0byB0aGUgZW5kcG9pbnQuCisgICAgICogVGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlJ3M8L2NvZGU+IGFkZHJlc3MgTVVTVCBiZSB1c2VkCisgICAgICogZm9yIGludm9jYXRpb25zIG9uIHRoZSBlbmRwb2ludC4KKyAgICAgKiBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIHRoZSBKQVgtV1MKKyAgICAgKiBydW50aW1lIHN5c3RlbSB0YWtlcyB0aGUgcmVzcG9uc2liaWxpdHkgb2Ygc2VsZWN0aW5nIGEgcHJvdG9jb2wKKyAgICAgKiBiaW5kaW5nIChhbmQgYSBwb3J0KSBhbmQgY29uZmlndXJpbmcgdGhlIGRpc3BhdGNoIGFjY29yZGluZ2x5IGZyb20KKyAgICAgKiB0aGUgV1NETCBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZSBvcgorICAgICAqIGZyb20gdGhlIG1ldGFkYXRhIGZyb20gdGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4KKyAgICAgKiBJZiB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlIGhhcyBhIFdTREwgYW5kCisgICAgICogdGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPgorICAgICAqIGFsc28gaGFzIGEgV1NETCBpbiBpdHMgbWV0YWRhdGEsIHRoZW4gdGhlIFdTREwgZnJvbSB0aGlzIGluc3RhbmNlCisgICAgICogTVVTVCBiZSB1c2VkLgorICAgICAqIElmIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBhIFdTREwgYW5kCisgICAgICogdGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBkb2VzIGhhdmUgYSBXU0RMLCB0aGVuIHRoZQorICAgICAqIFdTREwgZnJvbSB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IE1BWSBiZSB1c2VkLgorICAgICAqIEFuIGltcGxlbWVudGF0aW9uIE1VU1QgYmUgYWJsZSB0byByZXRyaWV2ZSB0aGUgPGNvZGU+cG9ydE5hbWU8L2NvZGU+IGZyb20gdGhlCisgICAgICogPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGJlaGF2aWVzIHRoZSBzYW1lIGFzIGNhbGxpbmcKKyAgICAgKiA8cHJlPgorICAgICAqIDxjb2RlPmRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgY29udGV4dCwgbW9kZSwgZmVhdHVyZXMpOzwvY29kZT4KKyAgICAgKiA8L3ByZT4KKyAgICAgKiB3aGVyZSB0aGUgPGNvZGU+cG9ydE5hbWU8L2NvZGU+IGlzIHJldHJpZXZlZCBmcm9tIHRoZQorICAgICAqIFdTREwgb3IgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZHBvaW50UmVmZXJlbmNlICBUaGUgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+CisgICAgICogZm9yIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludCB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUKKyAgICAgKiByZXR1cm5lZCA8Y29kZT5EaXNwYXRjaDwvY29kZT4gb2JqZWN0LgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBKQVhCIGNvbnRleHQgdXNlZCB0byBtYXJzaGFsbCBhbmQgdW5tYXJzaGFsbAorICAgICAqIG1lc3NhZ2VzIG9yIG1lc3NhZ2UgcGF5bG9hZHMuCisgICAgICogQHBhcmFtIG1vZGUgQ29udHJvbHMgd2hldGhlciB0aGUgY3JlYXRlZCBkaXNwYXRjaCBpbnN0YW5jZSBpcyBtZXNzYWdlCisgICAgICogb3IgcGF5bG9hZCBvcmllbnRlZCwgaS5lLiB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoIGNvbXBsZXRlCisgICAgICogcHJvdG9jb2wgbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4gRS5nLiB3aGVuIHVzaW5nIHRoZSBTT0FQCisgICAgICogcHJvdG9jb2wsIHRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGgKKyAgICAgKiBTT0FQIG1lc3NhZ2VzIG9yIHRoZSBjb250ZW50cyBvZiBhIFNPQVAgYm9keS4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZXMgIEFuIGFycmF5IG9mIDxjb2RlPldlYlNlcnZpY2VGZWF0dXJlczwvY29kZT4gdG8gY29uZmlndXJlIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHByb3h5LiAgU3VwcG9ydGVkIGZlYXR1cmVzIG5vdCBpbiB0aGUgPGNvZGU+ZmVhdHVyZXMKKyAgICAgKiAgICAgICAgICAgICAgICA8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3BhdGNoIGluc3RhbmNlCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICA8VUw+CisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT5JZiB0aGVyZSBpcyBhbnkgbWlzc2luZyBXU0RMIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXMgcmVxdWlyZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT5JZiB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhIGRvZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgbm90IG1hdGNoIHRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gb3IgPGNvZGU+cG9ydE5hbWU8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgICAgIG9mIGEgV1NETCBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICAgICAgICAgIHdpdGggdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPklmIHRoZSA8Y29kZT5wb3J0TmFtZTwvY29kZT4gY2Fubm90IGJlIGRldGVybWluZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhLgorICAgICAqICAgICAgICAgICAgICAgICAgICA8bGk+SWYgYW55IGVycm9yIGluIHRoZSBjcmVhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPmlmIGEgZmVhdHVyZSBpcyBlbmFibGVkIHRoYXQgaXMgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgICAgICA8L1VMPgorICAgICAqCisgICAgICogQHNlZSBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dAorICAgICAqIEBzZWUgV2ViU2VydmljZUZlYXR1cmUKKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgKiovCisgICAgcHVibGljIERpc3BhdGNoPE9iamVjdD4gY3JlYXRlRGlzcGF0Y2goRW5kcG9pbnRSZWZlcmVuY2UgZW5kcG9pbnRSZWZlcmVuY2UsCisgICAgICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0LCBTZXJ2aWNlLk1vZGUgbW9kZSwKKyAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVEaXNwYXRjaChlbmRwb2ludFJlZmVyZW5jZSwgY29udGV4dCwgbW9kZSwgZmVhdHVyZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBzZXJ2aWNlLgorICAgICAqIEByZXR1cm4gUXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBzZXJ2aWNlCisgICAgICoqLworICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFNlcnZpY2VOYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gZm9yIHRoZSBsaXN0IG9mCisgICAgICogPGNvZGU+UU5hbWU8L2NvZGU+cyBvZiBzZXJ2aWNlIGVuZHBvaW50cyBncm91cGVkIGJ5IHRoaXMKKyAgICAgKiBzZXJ2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+amF2YS51dGlsLkl0ZXJhdG9yPC9jb2RlPiB3aXRoIGVsZW1lbnRzCisgICAgICogICAgICAgICBvZiB0eXBlIDxjb2RlPmphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU8L2NvZGU+LgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiB0aGlzIFNlcnZpY2UgY2xhc3MgZG9lcyBub3QKKyAgICAgKiAgICAgICAgIGhhdmUgYWNjZXNzIHRvIHRoZSByZXF1aXJlZCBXU0RMIG1ldGFkYXRhLgorICAgICAqKi8KKyAgICBwdWJsaWMgSXRlcmF0b3I8amF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZT4gZ2V0UG9ydHMoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQb3J0cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50IGZvciB0aGlzIFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVSTCBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50IGZvcgorICAgICAqICAgICAgICAgdGhpcyBzZXJ2aWNlLgorICAgICAqKi8KKyAgICBwdWJsaWMgamF2YS5uZXQuVVJMIGdldFdTRExEb2N1bWVudExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0V1NETERvY3VtZW50TG9jYXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIGhhbmRsZXIgcmVzb2x2ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhhbmRsZXJSZXNvbHZlciBUaGUgPGNvZGU+SGFuZGxlclJlc29sdmVyPC9jb2RlPiBiZWluZworICAgICAqICAgICAgICAgdXNlZCBieSB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgaWYgdGhlcmUgaXNuJ3Qgb25lLgorICAgICAqKi8KICAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVyIGdldEhhbmRsZXJSZXNvbHZlcigpIHsKICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEhhbmRsZXJSZXNvbHZlcigpOwogICAgIH0KIAotICAvKioKLSAgICogIFNldHMgdGhlIDxjb2RlPkhhbmRsZXJSZXNvbHZlcjwvY29kZT4gZm9yIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4KLSAgICogIGluc3RhbmNlLgotICAgKiAgPHA+Ci0gICAqICBUaGUgaGFuZGxlciByZXNvbHZlciwgaWYgcHJlc2VudCwgd2lsbCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaAotICAgKiAgcHJveHkgb3IgZGlzcGF0Y2ggaW5zdGFuY2UgdGhhdCBpcyBjcmVhdGVkLCBhbmQgdGhlIGhhbmRsZXIgY2hhaW4KLSAgICogIHJldHVybmVkIGJ5IHRoZSByZXNvbHZlciB3aWxsIGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCi0gICAqCi0gICAqICBAcGFyYW0gaGFuZGxlclJlc29sdmVyIFRoZSA8Y29kZT5IYW5kbGVyUmVzb2x2ZXI8L2NvZGU+IHRvIHVzZQotICAgKiAgICAgICAgIGZvciBhbGwgc3Vic2VxdWVudGx5IGNyZWF0ZWQgcHJveHkvZGlzcGF0Y2ggb2JqZWN0cy4KLSAgICoKLSAgICogIEBzZWUgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyCi0gICoqLwotICAgcHVibGljIHZvaWQgc2V0SGFuZGxlclJlc29sdmVyKEhhbmRsZXJSZXNvbHZlciBoYW5kbGVyUmVzb2x2ZXIpIHsKLSAgICAgICBkZWxlZ2F0ZS5zZXRIYW5kbGVyUmVzb2x2ZXIoaGFuZGxlclJlc29sdmVyKTsKLSAgIH0KKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5IYW5kbGVyUmVzb2x2ZXI8L2NvZGU+IGZvciB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+CisgICAgICogaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhlIGhhbmRsZXIgcmVzb2x2ZXIsIGlmIHByZXNlbnQsIHdpbGwgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2gKKyAgICAgKiBwcm94eSBvciBkaXNwYXRjaCBpbnN0YW5jZSB0aGF0IGlzIGNyZWF0ZWQsIGFuZCB0aGUgaGFuZGxlciBjaGFpbgorICAgICAqIHJldHVybmVkIGJ5IHRoZSByZXNvbHZlciB3aWxsIGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlclJlc29sdmVyIFRoZSA8Y29kZT5IYW5kbGVyUmVzb2x2ZXI8L2NvZGU+IHRvIHVzZQorICAgICAqICAgICAgICBmb3IgYWxsIHN1YnNlcXVlbnRseSBjcmVhdGVkIHByb3h5L2Rpc3BhdGNoIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlcgorICAgICAqKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyUmVzb2x2ZXIoSGFuZGxlclJlc29sdmVyIGhhbmRsZXJSZXNvbHZlcikgeworICAgICAgICBkZWxlZ2F0ZS5zZXRIYW5kbGVyUmVzb2x2ZXIoaGFuZGxlclJlc29sdmVyKTsKKyAgICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV4ZWN1dG9yIGZvciB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+aW5zdGFuY2UuCi0gICAqCi0gICAqIFRoZSBleGVjdXRvciBpcyB1c2VkIGZvciBhbGwgYXN5bmNocm9ub3VzIGludm9jYXRpb25zIHRoYXQKLSAgICogcmVxdWlyZSBjYWxsYmFja3MuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIDxjb2RlPmphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yPC9jb2RlPiB0byBiZQotICAgKiAgICAgICAgIHVzZWQgdG8gaW52b2tlIGEgY2FsbGJhY2suCi0gICAqCi0gICAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKLSAgICoqLwotICAgcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIGdldEV4ZWN1dG9yKCkgewotICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRFeGVjdXRvcigpOwotICAgfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGV4ZWN1dG9yIGZvciB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+aW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUaGUgZXhlY3V0b3IgaXMgdXNlZCBmb3IgYWxsIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucyB0aGF0CisgICAgICogcmVxdWlyZSBjYWxsYmFja3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjwvY29kZT4gdG8gYmUKKyAgICAgKiAgICAgICAgIHVzZWQgdG8gaW52b2tlIGEgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBAc2VlIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yCisgICAgICoqLworICAgIHB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvciBnZXRFeGVjdXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEV4ZWN1dG9yKCk7CisgICAgfQogCi0gIC8qKgotICAgKiBTZXRzIHRoZSBleGVjdXRvciBmb3IgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KLSAgICoKLSAgICogVGhlIGV4ZWN1dG9yIGlzIHVzZWQgZm9yIGFsbCBhc3luY2hyb25vdXMgaW52b2NhdGlvbnMgdGhhdAotICAgKiByZXF1aXJlIGNhbGxiYWNrcy4KLSAgICoKLSAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSA8Y29kZT5qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjwvY29kZT4KLSAgICogICAgICAgIHRvIGJlIHVzZWQgdG8gaW52b2tlIGEgY2FsbGJhY2suCi0gICAqCi0gICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90IHN1cHBvcnQKLSAgICogICAgICAgICBzZXR0aW5nIGFuIGV4ZWN1dG9yIGZvciBzZWN1cml0eSByZWFzb25zIChlLmcuIHRoZQotICAgKiAgICAgICAgIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyBhcmUgbWlzc2luZykuCi0gICAqCi0gICAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKLSAgICoqLwotICAgcHVibGljIHZvaWQgc2V0RXhlY3V0b3IoamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICBkZWxlZ2F0ZS5zZXRFeGVjdXRvcihleGVjdXRvcik7Ci0gICB9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZXhlY3V0b3IgZm9yIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUaGUgZXhlY3V0b3IgaXMgdXNlZCBmb3IgYWxsIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucyB0aGF0CisgICAgICogcmVxdWlyZSBjYWxsYmFja3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlY3V0b3IgVGhlIDxjb2RlPmphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yPC9jb2RlPgorICAgICAqICAgICAgICB0byBiZSB1c2VkIHRvIGludm9rZSBhIGNhbGxiYWNrLgorICAgICAqCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgc2V0dGluZyBhbiBleGVjdXRvciBmb3Igc2VjdXJpdHkgcmVhc29ucyAoZS5nLiB0aGUKKyAgICAgKiAgICAgICAgIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyBhcmUgbWlzc2luZykuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yCisgICAgICoqLworICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgIGRlbGVnYXRlLnNldEV4ZWN1dG9yKGV4ZWN1dG9yKTsKKyAgICB9CiAKLSAgLyoqCi0gICAqICBDcmVhdGUgYSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KLSAgICoKLSAgICogIFRoZSBzcGVjaWZpZWQgV1NETCBkb2N1bWVudCBsb2NhdGlvbiBhbmQgc2VydmljZSBxdWFsaWZpZWQgbmFtZSBtdXN0Ci0gICAqICB1bmlxdWVseSBpZGVudGlmeSBhIDxjb2RlPndzZGw6c2VydmljZTwvY29kZT4gZWxlbWVudC4KLSAgICoKLSAgICogIEBwYXJhbSB3c2RsRG9jdW1lbnRMb2NhdGlvbiBVUkwgZm9yIHRoZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBzZXJ2aWNlCi0gICAqICBAcGFyYW0gc2VydmljZU5hbWUgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlCi0gICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgYW55IGVycm9yIGluIGNyZWF0aW9uIG9mIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzZXJ2aWNlCi0gICoqLwotICBwdWJsaWMgc3RhdGljIFNlcnZpY2UgY3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LlVSTCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSkKLSAgewotICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlKHdzZGxEb2N1bWVudExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gIH0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUaGUgc3BlY2lmaWVkIFdTREwgZG9jdW1lbnQgbG9jYXRpb24gYW5kIHNlcnZpY2UgcXVhbGlmaWVkIG5hbWUgTVVTVAorICAgICAqIHVuaXF1ZWx5IGlkZW50aWZ5IGEgPGNvZGU+d3NkbDpzZXJ2aWNlPC9jb2RlPiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHdzZGxEb2N1bWVudExvY2F0aW9uIDxjb2RlPlVSTDwvY29kZT4gZm9yIHRoZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgc2VydmljZQorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSA8Y29kZT5RTmFtZTwvY29kZT4gZm9yIHRoZSBzZXJ2aWNlCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIGFueSBlcnJvciBpbiBjcmVhdGlvbiBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHNlcnZpY2UuCisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZSBjcmVhdGUoCisgICAgICAgICAgICBqYXZhLm5ldC5VUkwgd3NkbERvY3VtZW50TG9jYXRpb24sCisgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2Uod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKKyAgICB9CiAKLSAgLyoqCi0gICAqICBDcmVhdGUgYSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KLSAgICoKLSAgICogIEBwYXJhbSBzZXJ2aWNlTmFtZSBRTmFtZSBmb3IgdGhlIHNlcnZpY2UKLSAgICogIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gY3JlYXRpb24gb2YgdGhlCi0gICAqICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHNlcnZpY2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU2VydmljZSBjcmVhdGUoUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgIHJldHVybiBuZXcgU2VydmljZShudWxsLCBzZXJ2aWNlTmFtZSk7Ci0gIH0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgPGNvZGU+UU5hbWU8L2NvZGU+IGZvciB0aGUgc2VydmljZQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gY3JlYXRpb24gb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlIGNyZWF0ZShRTmFtZSBzZXJ2aWNlTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2UobnVsbCwgc2VydmljZU5hbWUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9TZXJ2aWNlTW9kZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1NlcnZpY2VNb2RlLmphdmEKaW5kZXggYWJhYTM4Yi4uNTc0NGEyYyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1NlcnZpY2VNb2RlLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1NlcnZpY2VNb2RlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzMsNyArMzMsNyBAQAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkluaGVyaXRlZDsKIAogLyoqCi0gKiBVc2VkIHRvIGluZGljYXRlIHdoZXRoZXIgYSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbiB3aXNoZXMgdG8gd29yaworICogVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGEge0BsaW5rIFByb3ZpZGVyfSBpbXBsZW1lbnRhdGlvbiB3aXNoZXMgdG8gd29yawogICogd2l0aCBlbnRpcmUgcHJvdG9jb2wgbWVzc2FnZXMgb3IganVzdCB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcGF5bG9hZHMuCiAgKgogICogIEBzaW5jZSBKQVgtV1MgMi4wCkBAIC00NCw5ICs0NCw5IEBACiBARG9jdW1lbnRlZAogcHVibGljIEBpbnRlcmZhY2UgU2VydmljZU1vZGUgewogICAvKioKLSAgICogU2VydmljZSBtb2RlLiBQQVlMT0FEIGluZGljYXRlcyB0aGF0IHRoZSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbgotICAgKiB3aXNoZXMgdG8gd29yayB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcGF5bG9hZHMgb25seS4gTUVTU0FHRSBpbmRpY2F0ZXMKLSAgICogdGhhdCB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gd2lzaGVzIHRvIHdvcmsgd2l0aCBlbnRpcmUgcHJvdG9jb2wKKyAgICogU2VydmljZSBtb2RlLiA8Y29kZT5QQVlMT0FEPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgPGNvZGU+UHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uCisgICAqIHdpc2hlcyB0byB3b3JrIHdpdGggcHJvdG9jb2wgbWVzc2FnZSBwYXlsb2FkcyBvbmx5LiA8Y29kZT5NRVNTQUdFPC9jb2RlPiBpbmRpY2F0ZXMKKyAgICogdGhhdCB0aGUgPGNvZGU+UHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIHdpc2hlcyB0byB3b3JrIHdpdGggZW50aXJlIHByb3RvY29sCiAgICAqIG1lc3NhZ2VzLgogICAqKi8KICAgcHVibGljIFNlcnZpY2UuTW9kZSB2YWx1ZSgpIGRlZmF1bHQgU2VydmljZS5Nb2RlLlBBWUxPQUQ7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViRW5kcG9pbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJFbmRwb2ludC5qYXZhCmluZGV4IDc3ODE2N2IuLjYzNjA2MWUgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJFbmRwb2ludC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJFbmRwb2ludC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJGYXVsdC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYkZhdWx0LmphdmEKaW5kZXggN2ZhMmE1Yy4uYWM2NzY2YyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYkZhdWx0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYkZhdWx0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDMsMTIgKzQzLDEyIEBACiBARG9jdW1lbnRlZAogcHVibGljIEBpbnRlcmZhY2UgV2ViRmF1bHQgewogICAvKioKLSAgICogIEVsZW1lbnRzIGxvY2FsIG5hbWUuCisgICAqICBFbGVtZW50J3MgbG9jYWwgbmFtZS4KICAgKiovCiAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CiAKICAgLyoqCi0gICAqICBFbGVtZW50cyBuYW1lc3BhY2UgbmFtZS4KKyAgICogIEVsZW1lbnQncyBuYW1lc3BhY2UgbmFtZS4KICAgKiovCiAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKCkgZGVmYXVsdCAiIjsKIApkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VDbGllbnQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlQ2xpZW50LmphdmEKaW5kZXggNDMxZWNjZS4uMjMzNDU5ZiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VDbGllbnQuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViU2VydmljZUNsaWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VDb250ZXh0LmphdmEKaW5kZXggMzk2MzFmZS4uY2M4ZGY4NiAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VDb250ZXh0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VDb250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsNiArMjcsOSBAQAogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CiBpbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCiAKIC8qKgogICogIEEgPGNvZGU+V2ViU2VydmljZUNvbnRleHQ8L2NvZGU+IG1ha2VzIGl0IHBvc3NpYmxlIGZvcgpAQCAtNDEsNTcgKzQ0LDEwOCBAQAogICogIEBzaW5jZSBKQVgtV1MgMi4wCiAgKgogICogIEBzZWUgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQotKiovCisgKiovCiBwdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VDb250ZXh0IHsKIAotICAvKioKLSAgICogIFJldHVybnMgdGhlIE1lc3NhZ2VDb250ZXh0IGZvciB0aGUgcmVxdWVzdCBiZWluZyBzZXJ2ZWQKLSAgICogIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4gT25seSBwcm9wZXJ0aWVzIHdpdGgKLSAgICogIEFQUExJQ0FUSU9OIHNjb3BlIHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24uCi0gICAqCi0gICAqICBAcmV0dXJuIE1lc3NhZ2VDb250ZXh0IFRoZSBtZXNzYWdlIGNvbnRleHQuCi0gICAqCi0gICAqICBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICogICAgICAgICAgaWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgbm8gcmVxdWVzdCBpcwotICAgKiAgICAgICAgICBiZWluZyBzZXJ2aWNlZC4KLSAgICoKLSAgICogIEBzZWUgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQKLSAgICogIEBzZWUgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuU2NvcGUKLSAgICogIEBzZWUgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAqKi8KLSAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldE1lc3NhZ2VDb250ZXh0KCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+IGZvciB0aGUgcmVxdWVzdCBiZWluZyBzZXJ2ZWQKKyAgICAgKiBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuIE9ubHkgcHJvcGVydGllcyB3aXRoCisgICAgICogQVBQTElDQVRJT04gc2NvcGUgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWVzc2FnZUNvbnRleHQgVGhlIG1lc3NhZ2UgY29udGV4dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAqICAgICAgICAgaWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgbm8gcmVxdWVzdCBpcworICAgICAqICAgICAgICAgYmVpbmcgc2VydmljZWQuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0CisgICAgICogQHNlZSBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TY29wZQorICAgICAqIEBzZWUgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqKi8KKyAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoKTsKIAotICAvKioKLSAgICogIFJldHVybnMgdGhlIFByaW5jaXBhbCB0aGF0IGlkZW50aWZpZXMgdGhlIHNlbmRlcgotICAgKiAgb2YgdGhlIHJlcXVlc3QgY3VycmVudGx5IGJlaW5nIHNlcnZpY2VkLiBJZiB0aGUKLSAgICogIHNlbmRlciBoYXMgbm90IGJlZW4gYXV0aGVudGljYXRlZCwgdGhlIG1ldGhvZAotICAgKiAgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICoKLSAgICogIEByZXR1cm4gUHJpbmNpcGFsIFRoZSBwcmluY2lwYWwgb2JqZWN0LgotICAgKgotICAgKiAgQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhpcyBleGNlcHRpb24gaXMgdGhyb3duCi0gICAqICAgICAgICAgIGlmIHRoZSBtZXRob2QgaXMgY2FsbGVkIHdoaWxlIG5vIHJlcXVlc3QgaXMKLSAgICogICAgICAgICAgYmVpbmcgc2VydmljZWQuCi0gICAqCi0gICAqICBAc2VlIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsCi0gICAqICBAc2VlIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgKiovCi0gIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFByaW5jaXBhbCB0aGF0IGlkZW50aWZpZXMgdGhlIHNlbmRlcgorICAgICAqIG9mIHRoZSByZXF1ZXN0IGN1cnJlbnRseSBiZWluZyBzZXJ2aWNlZC4gSWYgdGhlCisgICAgICogc2VuZGVyIGhhcyBub3QgYmVlbiBhdXRoZW50aWNhdGVkLCB0aGUgbWV0aG9kCisgICAgICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUHJpbmNpcGFsIFRoZSBwcmluY2lwYWwgb2JqZWN0LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhpcyBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICogICAgICAgICBpZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCB3aGlsZSBubyByZXF1ZXN0IGlzCisgICAgICogICAgICAgICBiZWluZyBzZXJ2aWNlZC4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YS5zZWN1cml0eS5QcmluY2lwYWwKKyAgICAgKiBAc2VlIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiovCisgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCk7CiAKLSAgLyoqCi0gICAqICBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCi0gICAqICBhdXRoZW50aWNhdGVkIHVzZXIgaXMgaW5jbHVkZWQgaW4gdGhlIHNwZWNpZmllZAotICAgKiAgbG9naWNhbCByb2xlLiBJZiB0aGUgdXNlciBoYXMgbm90IGJlZW4KLSAgICogIGF1dGhlbnRpY2F0ZWQsIHRoZSBtZXRob2QgcmV0dXJucyA8L2NvZGU+ZmFsc2U8L2NvZGU+LgotICAgKgotICAgKiAgQHBhcmFtIHJvbGUgIEEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSByb2xlCi0gICAqCi0gICAqICBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyCi0gICAqICB0aGUgc2VuZGVyIG9mIHRoZSByZXF1ZXN0IGJlbG9uZ3MgdG8gYSBnaXZlbiByb2xlCi0gICAqCi0gICAqICBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICogICAgICAgICAgaWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgbm8gcmVxdWVzdCBpcwotICAgKiAgICAgICAgICBiZWluZyBzZXJ2aWNlZC4KLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICAgICAqIGF1dGhlbnRpY2F0ZWQgdXNlciBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogbG9naWNhbCByb2xlLiBJZiB0aGUgdXNlciBoYXMgbm90IGJlZW4KKyAgICAgKiBhdXRoZW50aWNhdGVkLCB0aGUgbWV0aG9kIHJldHVybnMgPC9jb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlICBBIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcm9sZQorICAgICAqCisgICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlcgorICAgICAqIHRoZSBzZW5kZXIgb2YgdGhlIHJlcXVlc3QgYmVsb25ncyB0byBhIGdpdmVuIHJvbGUKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAqICAgICAgICAgaWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgbm8gcmVxdWVzdCBpcworICAgICAqICAgICAgICAgYmVpbmcgc2VydmljZWQuCisgICAgICoqLworICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiBlbmRwb2ludC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUge0BsaW5rIEJpbmRpbmd9IGZvciB0aGlzIDxjb2RlPmJpbmRpbmdQcm92aWRlcjwvY29kZT4gaXMKKyAgICAgKiBlaXRoZXIgU09BUDEuMS9IVFRQIG9yIFNPQVAxLjIvSFRUUCwgdGhlbiBhCisgICAgICogPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IE1VU1QgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlUGFyYW1ldGVycyBSZWZlcmVuY2UgcGFyYW1ldGVycyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogcmV0dXJuZWQgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gRW5kcG9pbnRSZWZlcmVuY2Ugb2YgdGhlIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogPGNvZGU+V2ViU2VydmljZUNvbnRleHQ8L2NvZGU+LgorICAgICAqIElmIHRoZSByZXR1cm5lZCA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gaXMgb2YgdHlwZQorICAgICAqIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiB0aGVuIGl0IE1VU1QgY29udGFpbiB0aGUKKyAgICAgKiB0aGUgc3BlY2lmaWVkIDxjb2RlPnJlZmVyZW5jZVBhcmFtZXRlcnM8L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhpcyBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICogICAgICAgICBpZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCB3aGlsZSBubyByZXF1ZXN0IGlzCisgICAgICogICAgICAgICBiZWluZyBzZXJ2aWNlZC4KKyAgICAgKgorICAgICAqIEBzZWUgVzNDRW5kcG9pbnRSZWZlcmVuY2UKKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgICovCisgICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVuZHBvaW50UmVmZXJlbmNlKEVsZW1lbnQuLi4gcmVmZXJlbmNlUGFyYW1ldGVycyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBlbmRwb2ludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBUaGUgdHlwZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gdGhhdAorICAgICAqIE1VU1QgYmUgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHJlZmVyZW5jZVBhcmFtZXRlcnMgUmVmZXJlbmNlIHBhcmFtZXRlcnMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIHJldHVybmVkIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIEVuZHBvaW50UmVmZXJlbmNlIG9mIHR5cGUgPGNvZGU+Y2xheno8L2NvZGU+IG9mIHRoZSBlbmRwb2ludAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxjb2RlPldlYlNlcnZpY2VDb250ZXh0PC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBJZiB0aGUgcmV0dXJuZWQgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGlzIG9mIHR5cGUKKyAgICAgKiA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gdGhlbiBpdCBNVVNUIGNvbnRhaW4gdGhlCisgICAgICogdGhlIHNwZWNpZmllZCA8Y29kZT5yZWZlcmVuY2VQYXJhbWV0ZXJzPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAqICAgICAgICAgaWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgbm8gcmVxdWVzdCBpcworICAgICAqICAgICAgICAgYmVpbmcgc2VydmljZWQuCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIHRoZSA8Y29kZT5jbGF6ejwvY29kZT4gdHlwZSBvZgorICAgICAqIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIDxUIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IFQgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoQ2xhc3M8VD4gY2xhenosCisgICAgICAgICAgICBFbGVtZW50Li4uIHJlZmVyZW5jZVBhcmFtZXRlcnMpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VFeGNlcHRpb24uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlRXhjZXB0aW9uLmphdmEKaW5kZXggM2NjNWEwOC4uOTYzN2RiZCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViU2VydmljZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlRmVhdHVyZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5YTk1NgotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZheC54bWwud3M7CisKKworLyoqCisgKiBBIFdlYlNlcnZpY2VGZWF0dXJlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgZmVhdHVyZSB0aGF0IGNhbiBiZQorICogZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgYSB3ZWIgc2VydmljZS4KKyAqIDxwPgorICogVGhlIEpBWC1XUyBzcGVjaWZpY2F0aW9uIHdpbGwgZGVmaW5lIHNvbWUgc3RhbmRhcmQgZmVhdHVyZXMgYW5kCisgKiBKQVgtV1MgaW1wbGVtZW50b3JzIGFyZSBmcmVlIHRvIGRlZmluZSBhZGRpdGlvbmFsIGZlYXR1cmVzIGlmCisgKiBuZWNlc3NhcnkuICBWZW5kb3Igc3BlY2lmaWMgZmVhdHVyZXMgbWF5IG5vdCBiZSBwb3J0YWJsZSBzbworICogY2F1dGlvbiBzaG91bGQgYmUgdXNlZCB3aGVuIHVzaW5nIHRoZW0uIEVhY2ggRmVhdHVyZSBkZWZpbml0aW9uCisgKiBNVVNUIGRlZmluZSBhIDxjb2RlPnB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEPC9jb2RlPgorICogdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgRmVhdHVyZSBhbm5vdGF0aW9uIHRvIHJlZmVyCisgKiB0byB0aGUgZmVhdHVyZS4gVGhpcyBJRCBNVVNUIGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIGZlYXR1cmVzCisgKiBvZiBhbGwgdmVuZG9ycy4gIFdoZW4gZGVmaW5pbmcgYSB2ZW5kb3Igc3BlY2lmaWMgZmVhdHVyZSBJRCwKKyAqIHVzZSBhIHZlbmRvciBzcGVjaWZpYyBuYW1lc3BhY2UgaW4gdGhlIElEIHN0cmluZy4KKyAqCisgKiBAc2VlIGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZ0ZlYXR1cmUKKyAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmUKKyAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuTVRPTUZlYXR1cmUKKyAqCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXZWJTZXJ2aWNlRmVhdHVyZSB7CisgICAvKioKKyAgICAqIEVhY2ggRmVhdHVyZSBkZWZpbml0aW9uIE1VU1QgZGVmaW5lIGEgcHVibGljIHN0YXRpYyBmaW5hbAorICAgICogU3RyaW5nIElEIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIEZlYXR1cmUgYW5ub3RhdGlvbiB0byByZWZlcgorICAgICogdG8gdGhlIGZlYXR1cmUuCisgICAgKi8KKyAgIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInNvbWUgdW5pcXVlIGZlYXR1cmUgSWRlbnRpZmllciI7CisKKyAgIC8qKgorICAgICogR2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBXZWJTZXJ2aWNlRmVhdHVyZS4KKyAgICAqCisgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBmZWF0dXJlLgorICAgICovCisgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElEKCk7CisKKyAgIC8qKgorICAgICogU3BlY2lmaWVzIGlmIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgICAqLworICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOworCisKKyAgIHByb3RlY3RlZCBXZWJTZXJ2aWNlRmVhdHVyZSgpe30KKworCisgICAvKioKKyAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQuCisgICAgKgorICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkIC4KKyAgICAqLworICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgIHJldHVybiBlbmFibGVkOworICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VQZXJtaXNzaW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViU2VydmljZVBlcm1pc3Npb24uamF2YQppbmRleCAzZmM1MTM0Li41ZGU3MmZlIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViU2VydmljZVBlcm1pc3Npb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViU2VydmljZVBlcm1pc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViU2VydmljZVJlZi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL1dlYlNlcnZpY2VSZWYuamF2YQppbmRleCA5OGNhMjA2Li41MWQ5Nzg1IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViU2VydmljZVJlZi5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTMsNyArNTMsNyBAQAogICAgICAgKiB0aGUgZGVmYXVsdCBpcyB0aGUgZmllbGQgbmFtZS4gIEZvciBtZXRob2QgYW5ub3RhdGlvbnMsCiAgICAgICAqIHRoZSBkZWZhdWx0IGlzIHRoZSBKYXZhQmVhbnMgcHJvcGVydHkgbmFtZSBjb3JyZXNwb25kaW5nCiAgICAgICAqIHRvIHRoZSBtZXRob2QuICBGb3IgY2xhc3MgYW5ub3RhdGlvbnMsIHRoZXJlIGlzIG5vIGRlZmF1bHQKLSAgICAgICogYW5kIHRoaXMgbXVzdCBiZSBzcGVjaWZpZWQuCisgICAgICAqIGFuZCB0aGlzIE1VU1QgYmUgc3BlY2lmaWVkLgogICAgICAgKi8KICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwogCkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAqIFRoZSBKYXZhIHR5cGUgb2YgdGhlIHJlc291cmNlLiAgRm9yIGZpZWxkIGFubm90YXRpb25zLAogICAgICAgKiB0aGUgZGVmYXVsdCBpcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQuICBGb3IgbWV0aG9kIGFubm90YXRpb25zLAogICAgICAgKiB0aGUgZGVmYXVsdCBpcyB0aGUgdHlwZSBvZiB0aGUgSmF2YUJlYW5zIHByb3BlcnR5LgotICAgICAgKiBGb3IgY2xhc3MgYW5ub3RhdGlvbnMsIHRoZXJlIGlzIG5vIGRlZmF1bHQgYW5kIHRoaXMgbXVzdCBiZQorICAgICAgKiBGb3IgY2xhc3MgYW5ub3RhdGlvbnMsIHRoZXJlIGlzIG5vIGRlZmF1bHQgYW5kIHRoaXMgTVVTVCBiZQogICAgICAgKiBzcGVjaWZpZWQuCiAgICAgICAqLwogICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCBPYmplY3QuY2xhc3MgOwpAQCAtODUsNyArODUsNyBAQAogCiAgICAgIC8qKgogICAgICAgKiBUaGUgc2VydmljZSBjbGFzcywgYWx3YXlzIGEgdHlwZSBleHRlbmRpbmcKLSAgICAgICogPGNvZGU+amF2YXgueG1sLndzLlNlcnZpY2U8L2NvZGU+LiBUaGlzIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICAgICogPGNvZGU+amF2YXgueG1sLndzLlNlcnZpY2U8L2NvZGU+LiBUaGlzIGVsZW1lbnQgTVVTVCBiZSBzcGVjaWZpZWQKICAgICAgICogd2hlbmV2ZXIgdGhlIHR5cGUgb2YgdGhlIHJlZmVyZW5jZSBpcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgogICAgICAgKi8KICAgICAgQ2xhc3MgdmFsdWUoKSBkZWZhdWx0IE9iamVjdC5jbGFzcyA7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvV2ViU2VydmljZVJlZnMuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlUmVmcy5qYXZhCmluZGV4IDNjYmQzNjAuLjIxMjUyNDEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlUmVmcy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9XZWJTZXJ2aWNlUmVmcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvSGFuZGxlclJlc29sdmVyLmphdmEKaW5kZXggMGYxODA1Mi4uNGY5MWY3NyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvSGFuZGxlclJlc29sdmVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvSGFuZGxlclJlc29sdmVyLmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICogIEdldHMgdGhlIGhhbmRsZXIgY2hhaW4gZm9yIHRoZSBzcGVjaWZpZWQgcG9ydC4KICAgICoKICAgICogIEBwYXJhbSBwb3J0SW5mbyBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9ydCBiZWluZyBhY2Nlc3NlZC4KLSAgICogIEByZXR1cm4gamF2YS51dGlsLkxpc3QgSGFuZGxlciBjaGFpbgorICAgKiAgQHJldHVybiBqYXZhLnV0aWwuTGlzdCZsdDtIYW5kbGVyPiBjaGFpbgogICAqKi8KICAgcHVibGljIGphdmEudXRpbC5MaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbihQb3J0SW5mbyBwb3J0SW5mbyk7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9Mb2dpY2FsTWVzc2FnZUNvbnRleHQuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlQ29udGV4dC5qYXZhCmluZGV4IGViZjM1NmQuLjhiNDliMDQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlQ29udGV4dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlQ29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM5LDcgKzM5LDcgQEAKIAogICAvKiogR2V0cyB0aGUgbWVzc2FnZSBmcm9tIHRoaXMgbWVzc2FnZSBjb250ZXh0CiAgICAqCi0gICAqICBAcmV0dXJuIFRoZSBjb250YWluZWQgbWVzc2FnZTsgcmV0dXJucyBudWxsIGlmIG5vCisgICAqICBAcmV0dXJuIFRoZSBjb250YWluZWQgbWVzc2FnZTsgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwogICAgKiAgICAgICAgICBtZXNzYWdlIGlzIHByZXNlbnQgaW4gdGhpcyBtZXNzYWdlIGNvbnRleHQKICAgKiovCiAgIHB1YmxpYyBMb2dpY2FsTWVzc2FnZSBnZXRNZXNzYWdlKCk7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9NZXNzYWdlQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvTWVzc2FnZUNvbnRleHQuamF2YQppbmRleCBiOGJlNzQ0Li5mODI3ZDllIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9NZXNzYWdlQ29udGV4dC5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL01lc3NhZ2VDb250ZXh0LmphdmEKQEAgLTI2LDE1MSArMjYsMTgwIEBACiBwYWNrYWdlIGphdmF4LnhtbC53cy5oYW5kbGVyOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLS8qKiBUaGUgaW50ZXJmYWNlIDxjb2RlPk1lc3NhZ2VDb250ZXh0PC9jb2RlPiBhYnN0cmFjdHMgdGhlIG1lc3NhZ2UKLSAqICBjb250ZXh0IHRoYXQgaXMgcHJvY2Vzc2VkIGJ5IGEgaGFuZGxlciBpbiB0aGUgPGNvZGU+aGFuZGxlPC9jb2RlPgotICogIG1ldGhvZC4KKy8qKgorICogVGhlIGludGVyZmFjZSA8Y29kZT5NZXNzYWdlQ29udGV4dDwvY29kZT4gYWJzdHJhY3RzIHRoZSBtZXNzYWdlCisgKiBjb250ZXh0IHRoYXQgaXMgcHJvY2Vzc2VkIGJ5IGEgaGFuZGxlciBpbiB0aGUgPGNvZGU+aGFuZGxlPC9jb2RlPgorICogbWV0aG9kLgogICoKLSAqICA8cD5UaGUgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIHRvCi0gKiAgbWFuYWdlIGEgcHJvcGVydHkgc2V0LiA8Y29kZT5NZXNzYWdlQ29udGV4dDwvY29kZT4gcHJvcGVydGllcwotICogIGVuYWJsZSBoYW5kbGVycyBpbiBhIGhhbmRsZXIgY2hhaW4gdG8gc2hhcmUgcHJvY2Vzc2luZyByZWxhdGVkCi0gKiAgc3RhdGUuCisgKiA8cD5UaGUgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIHRvCisgKiBtYW5hZ2UgYSBwcm9wZXJ0eSBzZXQuIDxjb2RlPk1lc3NhZ2VDb250ZXh0PC9jb2RlPiBwcm9wZXJ0aWVzCisgKiBlbmFibGUgaGFuZGxlcnMgaW4gYSBoYW5kbGVyIGNoYWluIHRvIHNoYXJlIHByb2Nlc3NpbmcgcmVsYXRlZAorICogc3RhdGUuCiAgKgotICogIEBzaW5jZSBKQVgtV1MgMi4wCi0qKi8KKyAqIEBzaW5jZSBKQVgtV1MgMi4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUNvbnRleHQgZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+IHsKIAotICAvKiogU3RhbmRhcmQgcHJvcGVydHk6IG1lc3NhZ2UgZGlyZWN0aW9uLCA8Y29kZT50cnVlPC9jb2RlPiBmb3IKLSAgICogIG91dGJvdW5kIG1lc3NhZ2VzLCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGluYm91bmQuCi0gICAqICA8cD5UeXBlOiBib29sZWFuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZID0KLSAgICAgICAgICAgICAgICAgICAgICAiamF2YXgueG1sLndzLmhhbmRsZXIubWVzc2FnZS5vdXRib3VuZCI7CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgcHJvcGVydHk6IG1lc3NhZ2UgZGlyZWN0aW9uLCA8Y29kZT50cnVlPC9jb2RlPiBmb3IKKyAgICAgKiBvdXRib3VuZCBtZXNzYWdlcywgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBpbmJvdW5kLgorICAgICAqIDxwPlR5cGU6IGJvb2xlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZID0KKyAgICAgICAgICAgICJqYXZheC54bWwud3MuaGFuZGxlci5tZXNzYWdlLm91dGJvdW5kIjsKIAotICAvKiogU3RhbmRhcmQgcHJvcGVydHk6IE1hcCBvZiBhdHRhY2htZW50cyB0byBhIG1lc3NhZ2UgZm9yIHRoZSBpbmJvdW5kCi0gICAqIG1lc3NhZ2UsIGtleSBpcyAgdGhlIE1JTUUgQ29udGVudC1JRCwgdmFsdWUgaXMgYSBEYXRhSGFuZGxlci4KLSAgICogIDxwPlR5cGU6IGphdmEudXRpbC5NYXA8U3RyaW5nLERhdGFIYW5kbGVyPgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5CT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTID0KLSAgICAgICAgImphdmF4LnhtbC53cy5iaW5kaW5nLmF0dGFjaG1lbnRzLmluYm91bmQiOworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBNYXAgb2YgYXR0YWNobWVudHMgdG8gYSBtZXNzYWdlIGZvciB0aGUgaW5ib3VuZAorICAgICAqIG1lc3NhZ2UsIGtleSBpcyAgdGhlIE1JTUUgQ29udGVudC1JRCwgdmFsdWUgaXMgYSBEYXRhSGFuZGxlci4KKyAgICAgKiA8cD5UeXBlOiBqYXZhLnV0aWwuTWFwPFN0cmluZyxEYXRhSGFuZGxlcj4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMgPQorICAgICAgICAgICAgImphdmF4LnhtbC53cy5iaW5kaW5nLmF0dGFjaG1lbnRzLmluYm91bmQiOwogCi0gIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogTWFwIG9mIGF0dGFjaG1lbnRzIHRvIGEgbWVzc2FnZSBmb3IgdGhlIG91dGJvdW5kCi0gICAqIG1lc3NhZ2UsIGtleSBpcyB0aGUgTUlNRSBDb250ZW50LUlELCB2YWx1ZSBpcyBhIERhdGFIYW5kbGVyLgotICAgKiAgPHA+VHlwZTogamF2YS51dGlsLk1hcDxTdHJpbmcsRGF0YUhhbmRsZXI+Ci0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRCT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTID0KLSAgICAgICAgImphdmF4LnhtbC53cy5iaW5kaW5nLmF0dGFjaG1lbnRzLm91dGJvdW5kIjsKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBwcm9wZXJ0eTogTWFwIG9mIGF0dGFjaG1lbnRzIHRvIGEgbWVzc2FnZSBmb3IgdGhlIG91dGJvdW5kCisgICAgICogbWVzc2FnZSwga2V5IGlzIHRoZSBNSU1FIENvbnRlbnQtSUQsIHZhbHVlIGlzIGEgRGF0YUhhbmRsZXIuCisgICAgICogPHA+VHlwZTogamF2YS51dGlsLk1hcDxTdHJpbmcsRGF0YUhhbmRsZXI+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyA9CisgICAgICAgICAgICAiamF2YXgueG1sLndzLmJpbmRpbmcuYXR0YWNobWVudHMub3V0Ym91bmQiOwogCi0gIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogaW5wdXQgc291cmNlIGZvciBXU0RMIGRvY3VtZW50LgotICAgKiAgPHA+VHlwZTogb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfREVTQ1JJUFRJT04gPQotICAgICAgICAiamF2YXgueG1sLndzLndzZGwuZGVzY3JpcHRpb24iOworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBpbnB1dCBzb3VyY2UgZm9yIFdTREwgZG9jdW1lbnQuCisgICAgICogPHA+VHlwZTogb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0RFU0NSSVBUSU9OID0KKyAgICAgICAgICAgICJqYXZheC54bWwud3Mud3NkbC5kZXNjcmlwdGlvbiI7CiAKLSAgLyoqIFN0YW5kYXJkIHByb3BlcnR5OiBuYW1lIG9mIFdTREwgc2VydmljZS4KLSAgICogIDxwPlR5cGU6IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfU0VSVklDRSA9Ci0gICAgICAgICJqYXZheC54bWwud3Mud3NkbC5zZXJ2aWNlIjsKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBwcm9wZXJ0eTogbmFtZSBvZiBXU0RMIHNlcnZpY2UuCisgICAgICogPHA+VHlwZTogamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfU0VSVklDRSA9CisgICAgICAgICAgICAiamF2YXgueG1sLndzLndzZGwuc2VydmljZSI7CiAKLSAgLyoqIFN0YW5kYXJkIHByb3BlcnR5OiBuYW1lIG9mIFdTREwgcG9ydC4KLSAgICogIDxwPlR5cGU6IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfUE9SVCA9Ci0gICAgICAgICJqYXZheC54bWwud3Mud3NkbC5wb3J0IjsKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBwcm9wZXJ0eTogbmFtZSBvZiBXU0RMIHBvcnQuCisgICAgICogPHA+VHlwZTogamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfUE9SVCA9CisgICAgICAgICAgICAiamF2YXgueG1sLndzLndzZGwucG9ydCI7CiAKLSAgLyoqIFN0YW5kYXJkIHByb3BlcnR5OiBuYW1lIG9mIHdzZGwgaW50ZXJmYWNlICgyLjApIG9yIHBvcnQgdHlwZSAoMS4xKS4KLSAgICogIDxwPlR5cGU6IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfSU5URVJGQUNFID0KLSAgICAgICAgImphdmF4LnhtbC53cy53c2RsLmludGVyZmFjZSI7CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgcHJvcGVydHk6IG5hbWUgb2Ygd3NkbCBpbnRlcmZhY2UgKDIuMCkgb3IgcG9ydCB0eXBlICgxLjEpLgorICAgICAqIDxwPlR5cGU6IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0lOVEVSRkFDRSA9CisgICAgICAgICAgICAiamF2YXgueG1sLndzLndzZGwuaW50ZXJmYWNlIjsKIAotICAvKiogU3RhbmRhcmQgcHJvcGVydHk6IG5hbWUgb2YgV1NETCBvcGVyYXRpb24uCi0gICAqICA8cD5UeXBlOiBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX09QRVJBVElPTiA9Ci0gICAgICAgICJqYXZheC54bWwud3Mud3NkbC5vcGVyYXRpb24iOworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBuYW1lIG9mIFdTREwgb3BlcmF0aW9uLgorICAgICAqIDxwPlR5cGU6IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX09QRVJBVElPTiA9CisgICAgICAgICAgICAiamF2YXgueG1sLndzLndzZGwub3BlcmF0aW9uIjsKIAotICAvKiogU3RhbmRhcmQgcHJvcGVydHk6IEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuCi0gICAqICA8cD5UeXBlOiBqYXZhLmxhbmcuSW50ZWdlcgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVNQT05TRV9DT0RFID0KLSAgICAgICAgImphdmF4LnhtbC53cy5odHRwLnJlc3BvbnNlLmNvZGUiOworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLgorICAgICAqIDxwPlR5cGU6IGphdmEubGFuZy5JbnRlZ2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVNQT05TRV9DT0RFID0KKyAgICAgICAgICAgICJqYXZheC54bWwud3MuaHR0cC5yZXNwb25zZS5jb2RlIjsKIAotICAvKiogU3RhbmRhcmQgcHJvcGVydHk6IEhUVFAgcmVxdWVzdCBoZWFkZXJzLgotICAgKiAgPHA+VHlwZTogamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPj4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUkVRVUVTVF9IRUFERVJTID0KLSAgICAgICAgImphdmF4LnhtbC53cy5odHRwLnJlcXVlc3QuaGVhZGVycyI7CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgcHJvcGVydHk6IEhUVFAgcmVxdWVzdCBoZWFkZXJzLgorICAgICAqIDxwPlR5cGU6IGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZz4+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFVRVNUX0hFQURFUlMgPQorICAgICAgICAgICAgImphdmF4LnhtbC53cy5odHRwLnJlcXVlc3QuaGVhZGVycyI7CiAKLSAgLyoqIFN0YW5kYXJkIHByb3BlcnR5OiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAqICA8cD5UeXBlOiBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+PgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVNQT05TRV9IRUFERVJTID0KLSAgICAgICAgImphdmF4LnhtbC53cy5odHRwLnJlc3BvbnNlLmhlYWRlcnMiOworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCisgICAgICogPHA+VHlwZTogamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nPj4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0hFQURFUlMgPQorICAgICAgICAgICAgImphdmF4LnhtbC53cy5odHRwLnJlc3BvbnNlLmhlYWRlcnMiOwogCi0gIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogSFRUUCByZXF1ZXN0IG1ldGhvZC4KLSAgICogIDxwPlR5cGU6IGphdmEubGFuZy5TdHJpbmcKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUkVRVUVTVF9NRVRIT0QgPQotICAgICAgICAiamF2YXgueG1sLndzLmh0dHAucmVxdWVzdC5tZXRob2QiOworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBIVFRQIHJlcXVlc3QgbWV0aG9kLgorICAgICAqIDxwPlR5cGU6IGphdmEubGFuZy5TdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFUVVFU1RfTUVUSE9EID0KKyAgICAgICAgICAgICJqYXZheC54bWwud3MuaHR0cC5yZXF1ZXN0Lm1ldGhvZCI7CiAKLSAgLyoqIFN0YW5kYXJkIHByb3BlcnR5OiBzZXJ2bGV0IHJlcXVlc3Qgb2JqZWN0LgotICAgKiAgPHA+VHlwZTogamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdAotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9SRVFVRVNUID0KLSAgICAgICAgImphdmF4LnhtbC53cy5zZXJ2bGV0LnJlcXVlc3QiOworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBzZXJ2bGV0IHJlcXVlc3Qgb2JqZWN0LgorICAgICAqIDxwPlR5cGU6IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX1JFUVVFU1QgPQorICAgICAgICAgICAgImphdmF4LnhtbC53cy5zZXJ2bGV0LnJlcXVlc3QiOwogCi0gIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogc2VydmxldCByZXNwb25zZSBvYmplY3QuCi0gICAqICA8cD5UeXBlOiBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZQotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9SRVNQT05TRSA9Ci0gICAgICAgICJqYXZheC54bWwud3Muc2VydmxldC5yZXNwb25zZSI7CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgcHJvcGVydHk6IHNlcnZsZXQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqIDxwPlR5cGU6IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9SRVNQT05TRSA9CisgICAgICAgICAgICAiamF2YXgueG1sLndzLnNlcnZsZXQucmVzcG9uc2UiOwogCi0gIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eTogc2VydmxldCBjb250ZXh0IG9iamVjdC4KLSAgICogIDxwPlR5cGU6IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfQ09OVEVYVCA9Ci0gICAgICAgICJqYXZheC54bWwud3Muc2VydmxldC5jb250ZXh0IjsKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBwcm9wZXJ0eTogc2VydmxldCBjb250ZXh0IG9iamVjdC4KKyAgICAgKiA8cD5UeXBlOiBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9DT05URVhUID0KKyAgICAgICAgICAgICJqYXZheC54bWwud3Muc2VydmxldC5jb250ZXh0IjsKIAotICAvKiogU3RhbmRhcmQgcHJvcGVydHk6IFF1ZXJ5IHN0cmluZyBmb3IgcmVxdWVzdC4KLSAgICogIDxwPlR5cGU6IFN0cmluZwotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfU1RSSU5HID0KLSAgICAgICAgImphdmF4LnhtbC53cy5odHRwLnJlcXVlc3QucXVlcnlzdHJpbmciOworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBRdWVyeSBzdHJpbmcgZm9yIHJlcXVlc3QuCisgICAgICogPHA+VHlwZTogU3RyaW5nCisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1NUUklORyA9CisgICAgICAgICAgICAiamF2YXgueG1sLndzLmh0dHAucmVxdWVzdC5xdWVyeXN0cmluZyI7CiAKLSAgLyoqIFN0YW5kYXJkIHByb3BlcnR5OiBSZXF1ZXN0IFBhdGggSW5mbwotICAgKiAgPHA+VHlwZTogU3RyaW5nCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0lORk8gPQotICAgICAgICAiamF2YXgueG1sLndzLmh0dHAucmVxdWVzdC5wYXRoaW5mbyI7CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgcHJvcGVydHk6IFJlcXVlc3QgUGF0aCBJbmZvCisgICAgICogPHA+VHlwZTogU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9JTkZPID0KKyAgICAgICAgICAgICJqYXZheC54bWwud3MuaHR0cC5yZXF1ZXN0LnBhdGhpbmZvIjsKIAotICAvKioKLSAgICogUHJvcGVydHkgc2NvcGUuIFByb3BlcnRpZXMgc2NvcGVkIGFzIDxjb2RlPkFQUExJQ0FUSU9OPC9jb2RlPiBhcmUKLSAgICogdmlzaWJsZSB0byBoYW5kbGVycywKLSAgICogY2xpZW50IGFwcGxpY2F0aW9ucyBhbmQgc2VydmljZSBlbmRwb2ludHM7IHByb3BlcnRpZXMgc2NvcGVkIGFzCi0gICAqIDxjb2RlPkhBTkRMRVI8L2NvZGU+Ci0gICAqIGFyZSBvbmx5IG5vcm1hbGx5IHZpc2libGUgdG8gaGFuZGxlcnMuCi0gICoqLwotICBwdWJsaWMgZW51bSBTY29wZSB7QVBQTElDQVRJT04sIEhBTkRMRVJ9OworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb3BlcnR5OiBXUyBBZGRyZXNzaW5nIFJlZmVyZW5jZSBQYXJhbWV0ZXJzLgorICAgICAqIFRoZSBsaXN0IE1VU1QgaW5jbHVkZSBhbGwgU09BUCBoZWFkZXJzIG1hcmtlZCB3aXRoIHRoZQorICAgICAqIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0idHJ1ZSIgYXR0cmlidXRlLgorICAgICAqIDxwPlR5cGU6IExpc3Q8RWxlbWVudD4KKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFX1BBUkFNRVRFUlMgPQorICAgICAgICAgICAgImphdmF4LnhtbC53cy5yZWZlcmVuY2UucGFyYW1ldGVycyI7CiAKLSAgLyoqIFNldHMgdGhlIHNjb3BlIG9mIGEgcHJvcGVydHkuCi0gICAqCi0gICAqICBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAqICAgICAgICAgICAgICA8Y29kZT5NZXNzYWdlQ29udGV4dDwvY29kZT4KLSAgICogIEBwYXJhbSBzY29wZSBEZXNpcmVkIHNjb3BlIG9mIHRoZSBwcm9wZXJ0eQotICAgKiAgQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGlsbGVnYWwKLSAgICogICAgICAgICAgICAgIHByb3BlcnR5IG5hbWUgaXMgc3BlY2lmaWVkCi0gICAqCi0gICoqLwotICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgbmFtZSwgIFNjb3BlIHNjb3BlKTsKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSBzY29wZS4gUHJvcGVydGllcyBzY29wZWQgYXMgPGNvZGU+QVBQTElDQVRJT048L2NvZGU+IGFyZQorICAgICAqIHZpc2libGUgdG8gaGFuZGxlcnMsCisgICAgICogY2xpZW50IGFwcGxpY2F0aW9ucyBhbmQgc2VydmljZSBlbmRwb2ludHM7IHByb3BlcnRpZXMgc2NvcGVkIGFzCisgICAgICogPGNvZGU+SEFORExFUjwvY29kZT4KKyAgICAgKiBhcmUgb25seSBub3JtYWxseSB2aXNpYmxlIHRvIGhhbmRsZXJzLgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIFNjb3BlIHtBUFBMSUNBVElPTiwgSEFORExFUn07CiAKLSAgLyoqIEdldHMgdGhlIHNjb3BlIG9mIGEgcHJvcGVydHkuCi0gICAqCi0gICAqICBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgKiAgQHJldHVybiBTY29wZSBvZiB0aGUgcHJvcGVydHkKLSAgICogIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhIG5vbi1leGlzdGFudAotICAgKiAgICAgICAgICAgICAgcHJvcGVydHkgbmFtZSBpcyBzcGVjaWZpZWQKLSAgICoKLSAgKiovCi0gIHB1YmxpYyBTY29wZSBnZXRTY29wZShTdHJpbmcgIG5hbWUpOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNjb3BlIG9mIGEgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+CisgICAgICogQHBhcmFtIHNjb3BlIERlc2lyZWQgc2NvcGUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGlsbGVnYWwKKyAgICAgKiAgICAgICAgICAgICBwcm9wZXJ0eSBuYW1lIGlzIHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBuYW1lLCAgU2NvcGUgc2NvcGUpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2NvcGUgb2YgYSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHJldHVybiBTY29wZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSBub24tZXhpc3RhbnQKKyAgICAgKiAgICAgICAgICAgICBwcm9wZXJ0eSBuYW1lIGlzIHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyBTY29wZSBnZXRTY29wZShTdHJpbmcgIG5hbWUpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvUG9ydEluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL1BvcnRJbmZvLmphdmEKaW5kZXggNDY5YmFhZC4uZjZmMzNiMCAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvUG9ydEluZm8uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9Qb3J0SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL3BhY2thZ2UuaHRtbAppbmRleCBkMzdkY2FiLi4zZjJmOTk5IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsMjcgQEAKKzwhLS0KKyBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorCisgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKworIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyBoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KIDxodG1sPgogPGJvZHk+CiBUaGlzIHBhY2thZ2UgZGVmaW5lcyBBUElzIGZvciBtZXNzYWdlIGhhbmRsZXJzLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvc29hcC9TT0FQSGFuZGxlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvc29hcC9TT0FQSGFuZGxlci5qYXZhCmluZGV4IDlkYTQxZWIuLmU5NDMxZWQgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL3NvYXAvU09BUEhhbmRsZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9zb2FwL1NPQVBIYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDEsNyArNDEsNyBAQAogICAvKiogR2V0cyB0aGUgaGVhZGVyIGJsb2NrcyB0aGF0IGNhbiBiZSBwcm9jZXNzZWQgYnkgdGhpcyBIYW5kbGVyCiAgICAqICBpbnN0YW5jZS4KICAgICoKLSAgICogIEByZXR1cm4gU2V0IG9mIFFOYW1lcyBvZiBoZWFkZXIgYmxvY2tzIHByb2Nlc3NlZCBieSB0aGlzCisgICAqICBAcmV0dXJuIFNldCBvZiA8Y29kZT5RTmFtZXM8L2NvZGU+IG9mIGhlYWRlciBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoaXMKICAgICogICAgICAgICAgIGhhbmRsZXIgaW5zdGFuY2UuIDxjb2RlPlFOYW1lPC9jb2RlPiBpcyB0aGUgcXVhbGlmaWVkCiAgICAqICAgICAgICAgICBuYW1lIG9mIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBvZiB0aGUgSGVhZGVyIGJsb2NrLgogICAqKi8KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL3NvYXAvU09BUE1lc3NhZ2VDb250ZXh0LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9zb2FwL1NPQVBNZXNzYWdlQ29udGV4dC5qYXZhCmluZGV4IGE1YjBhM2UuLmJhMDgyMDkgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9oYW5kbGVyL3NvYXAvU09BUE1lc3NhZ2VDb250ZXh0LmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvc29hcC9TT0FQTWVzc2FnZUNvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00MywxMiArNDMsMTIgQEAKIHB1YmxpYyBpbnRlcmZhY2UgU09BUE1lc3NhZ2VDb250ZXh0CiAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHMgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgewogCi0gIC8qKiBHZXRzIHRoZSBTT0FQTWVzc2FnZSBmcm9tIHRoaXMgbWVzc2FnZSBjb250ZXh0LiBNb2RpZmljYXRpb25zCi0gICAqICB0byB0aGUgcmV0dXJuZWQgU09BUE1lc3NhZ2UgY2hhbmdlIHRoZSBtZXNzYWdlIGluLXBsYWNlLCB0aGVyZQorICAvKiogR2V0cyB0aGUgPGNvZGU+U09BUE1lc3NhZ2U8Y29kZT4gZnJvbSB0aGlzIG1lc3NhZ2UgY29udGV4dC4gTW9kaWZpY2F0aW9ucworICAgKiAgdG8gdGhlIHJldHVybmVkIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPiBjaGFuZ2UgdGhlIG1lc3NhZ2UgaW4tcGxhY2UsIHRoZXJlCiAgICAqICBpcyBubyBuZWVkIHRvIHN1c2VxdWVudGx5IGNhbGwgPGNvZGU+c2V0TWVzc2FnZTwvY29kZT4uCiAgICAqCi0gICAqICBAcmV0dXJuIFJldHVybnMgdGhlIFNPQVBNZXNzYWdlOyByZXR1cm5zIG51bGwgaWYgbm8KLSAgICogICAgICAgICAgU09BUE1lc3NhZ2UgaXMgcHJlc2VudCBpbiB0aGlzIG1lc3NhZ2UgY29udGV4dAorICAgKiAgQHJldHVybiBSZXR1cm5zIHRoZSA8Y29kZT5TT0FQTWVzc2FnZTwvY29kZT47IHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KKyAgICogICAgICAgICAgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+IGlzIHByZXNlbnQgaW4gdGhpcyBtZXNzYWdlIGNvbnRleHQKICAgKiovCiAgIHB1YmxpYyBTT0FQTWVzc2FnZSBnZXRNZXNzYWdlKCk7CiAKQEAgLTU2LDcgKzU2LDcgQEAKICAgICoKICAgICogIEBwYXJhbSAgbWVzc2FnZSBTT0FQIG1lc3NhZ2UKICAgICogIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgZHVyaW5nIHRoZSBzZXR0aW5nCi0gICAqICAgICAgICAgIG9mIHRoZSBTT0FQTWVzc2FnZSBpbiB0aGlzIG1lc3NhZ2UgY29udGV4dAorICAgKiAgICAgICAgICBvZiB0aGUgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+IGluIHRoaXMgbWVzc2FnZSBjb250ZXh0CiAgICAqICBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiB0aGlzCiAgICAqICAgICAgICAgIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCiAgICoqLwpAQCAtNzcsOCArNzcsOCBAQAogICAgKiAgICAgICAgICBtZXNzYWdlIGlzIHByZXNlbnQgaW4gdGhpcyBtZXNzYWdlIGNvbnRleHQgb3Igbm8gaGVhZGVycyBtYXRjaAogICAgKiAgICAgICAgICB0aGUgc3VwcGxpZWQgcXVhbGlmaWVkIG5hbWUuCiAgICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gdXNpbmcgdGhlIHN1cHBsaWVkCi0gICAqICAgICBKQVhCQ29udGV4dCB0byB1bm1hcnNoYWxsLiBUaGUgY2F1c2Ugb2YKLSAgICogICAgIHRoZSBXZWJTZXJ2aWNlRXhjZXB0aW9uIGlzIHRoZSBvcmlnaW5hbCBKQVhCRXhjZXB0aW9uLgorICAgKiAgICAgPGNvZGU+SkFYQkNvbnRleHQ8L2NvZGU+IHRvIHVubWFyc2hhbGwuIFRoZSBjYXVzZSBvZgorICAgKiAgICAgdGhlIDxjb2RlPldlYlNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlzIHRoZSBvcmlnaW5hbCA8Y29kZT5KQVhCRXhjZXB0aW9uPC9jb2RlPi4KICAgKiovCiAgIHB1YmxpYyBPYmplY3RbXSBnZXRIZWFkZXJzKFFOYW1lIGhlYWRlciwgSkFYQkNvbnRleHQgY29udGV4dCwKICAgICBib29sZWFuIGFsbFJvbGVzKTsKQEAgLTg2LDE0ICs4NiwxNCBAQAogICAvKiogR2V0cyB0aGUgU09BUCBhY3RvciByb2xlcyBhc3NvY2lhdGVkIHdpdGggYW4gZXhlY3V0aW9uCiAgICAqICBvZiB0aGUgaGFuZGxlciBjaGFpbi4KICAgICogIE5vdGUgdGhhdCBTT0FQIGFjdG9yIHJvbGVzIGFwcGx5IHRvIHRoZSBTT0FQIG5vZGUgYW5kCi0gICAqICBhcmUgbWFuYWdlZCB1c2luZyA8Y29kZT5TT0FQQmluZGluZy5zZXRSb2xlczwvY29kZT4gYW5kCi0gICAqICA8Y29kZT5TT0FQQmluZGluZy5nZXRSb2xlczwvY29kZT4uIEhhbmRsZXIgaW5zdGFuY2VzIGluCisgICAqICBhcmUgbWFuYWdlZCB1c2luZyB7QGxpbmsgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcjc2V0Um9sZXN9IGFuZAorICAgKiAge0BsaW5rIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI2dldFJvbGVzfS4gPGNvZGU+SGFuZGxlcjwvY29kZT4gaW5zdGFuY2VzIGluCiAgICAqICB0aGUgaGFuZGxlciBjaGFpbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU09BUCBhY3RvcgogICAgKiAgcm9sZXMgdG8gcHJvY2VzcyB0aGUgU09BUCBoZWFkZXIgYmxvY2tzLiBOb3RlIHRoYXQgdGhlCiAgICAqICBTT0FQIGFjdG9yIHJvbGVzIGFyZSBpbnZhcmlhbnQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mCiAgICAqICBTT0FQIG1lc3NhZ2UgdGhyb3VnaCB0aGUgaGFuZGxlciBjaGFpbi4KICAgICoKLSAgICogIEByZXR1cm4gQXJyYXkgb2YgU3RyaW5nIGZvciBTT0FQIGFjdG9yIHJvbGVzCisgICAqICBAcmV0dXJuIEFycmF5IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gZm9yIFNPQVAgYWN0b3Igcm9sZXMKICAgKiovCiAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRSb2xlcygpOwogfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2hhbmRsZXIvc29hcC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9zb2FwL3BhY2thZ2UuaHRtbAppbmRleCBlZDRmYjA0Li5hMGMyZDNiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9zb2FwL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaGFuZGxlci9zb2FwL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgogVGhpcyBwYWNrYWdlIGRlZmluZXMgQVBJcyBmb3IgU09BUCBtZXNzYWdlIGhhbmRsZXJzLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2h0dHAvcGFja2FnZS5odG1sIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL2h0dHAvcGFja2FnZS5odG1sCmluZGV4IDQxYjVmODcuLmI2MTJmMjggMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9odHRwL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvaHR0cC9wYWNrYWdlLmh0bWwKQEAgLTEsMyArMSwyNyBAQAorPCEtLQorIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgogPGh0bWw+CiA8Ym9keT4KIFRoaXMgcGFja2FnZSBkZWZpbmVzIEFQSXMgc3BlY2lmaWMgdG8gdGhlIEhUVFAgYmluZGluZy4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3MvcGFja2FnZS5odG1sCmluZGV4IDQ5ZjY5YmIuLmRhMjk5ZDEgMTAwNjQ0Ci0tLSBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9wYWNrYWdlLmh0bWwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgogVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBjb3JlIEpBWC1XUyBBUElzLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NvYXAvQWRkcmVzc2luZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NvYXAvQWRkcmVzc2luZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzA3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9BZGRyZXNzaW5nLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZheC54bWwud3Muc29hcDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKKworaW1wb3J0IGphdmF4LnhtbC53cy5BY3Rpb247CitpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwud3MuRmF1bHRBY3Rpb247CitpbXBvcnQgamF2YXgueG1sLndzLnNwaS5XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb247CisKKworLyoqCisgKiA8cD4KKyAqIFRoaXMgZmVhdHVyZSByZXByZXNlbnRzIHRoZSB1c2Ugb2YgV1MtQWRkcmVzc2luZyB3aXRoIGVpdGhlcgorICogdGhlIFNPQVAgMS4xL0hUVFAgb3IgU09BUCAxLjIvSFRUUCBiaW5kaW5nLiAgVXNpbmcgdGhpcyBmZWF0dXJlCisgKiB3aXRoIGFueSBvdGhlciBiaW5kaW5nIGlzIE5PVCByZXF1aXJlZC4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgdGhlIGVmZmVjdHMgb2YgdGhpcyBmZWF0dXJlIHdpdGggcmVzcGVjdAorICogdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZDoKKyAqIDx1bD4KKyAqICA8bGk+IEVOQUJMRUQ6IEluIHRoaXMgTW9kZSwgV1MtQWRkcmVzc2luZyB3aWxsIGJlIGVuYWJsZWQuCisgKiAgICAgICBBdCBydW50aW1lLCBXUy1BZGRyZXNzaW5nIGhlYWRlcnMKKyAqICAgICAgIE1VU1QgYmUgY29uc3VtZWQgYnkgdGhlIHJlY2VpdmVyIGFuZCBwcm9kdWNlZCBieSB0aGUKKyAqICAgICAgIHNlbmRlciBldmVuIGlmIHRoZSBXU0RMIGRlY2xhcmVzIG90aGVyd2lzZS4gVGhlCisgKiAgICAgICBtdXN0VW5kZXJzdGFuZD0iMCIgYXR0cmlidXRlIE1VU1QgYmUgdXNlZCBvbiB0aGUgcmVzcG9uc2UgV1MtQWRkcmVzc2luZworICogICAgICAgaGVhZGVycy4KKyAqICA8bGk+IERJU0FCTEVEOiBJbiB0aGlzIE1vZGUsIFdTLUFkZHJlc3Npbmcgd2lsbCBiZSBkaXNhYmxlZAorICogICAgICAgZXZlbiBpZiBhbiBhc3NvY2lhdGVkIFdTREwgc3BlY2lmaWVzIG90aGVyd2lzZS4gQXQgcnVudGltZSwKKyAqICAgICAgIFdTLUFkZHJlc3NpbmcgaGVhZGVycyBNVVNUIE5PVCBiZSB1c2VkLiBXUy1BZGRyZXNzaW5nIG1heSBiZSBleHBsaWNpdGx5CisgKiAgICAgICBkaXNhYmxlZCB0byBwcmV2ZW50IGEgSkFYLVdTIGltcGxlbWVudGF0aW9uIGZyb20gY29uc3VtaW5nIGFuZCBwcm9kdWNpbmcKKyAqICAgICAgIFdTLUFkZHJlc3NpbmcgaGVhZGVycy4gSWYgYW4gYXBwbGljYXRpb24KKyAqICAgICAgIGhhcyBpbXBsZW1lbnRlZCBXUy1BZGRyZXNzaW5nIGl0c2VsZiwgaXQgTVVTVCBleHBsaWNpdGx5IGRpc2FibGUgdGhpcyBmZWF0dXJlLgorKiAgICAgICAgTm90IGRvaW5nIHNvIG1heSBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIEpBWC1XUy4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoZSA8Y29kZT5yZXF1aXJlZDwvY29kZT4gcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8KKyAqIHNwZWNpZnkgaWYgV1MtQWRkcmVzc2luZyBoZWFkZXJzIE1VU1QKKyAqIGJlIHByZXNlbnQgb24gaW5jb21pbmcgbWVzc2FnZXMuICBCeSBkZWZhdWx0IHRoZQorICogPGNvZGU+cmVxdWlyZWQ8L2NvZGU+IHByb3BlcnR5IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAqIDxwPgorICogVGhlIGRlZmluaXRpb24gb2YgdGhpcyBhbm5vdGF0aW9uIGlzIGluY29tcGxldGUgaW4gdGhpcyByZWxlYXNlIG9mIEpBWC1XUyBhcworICogdGhlcmUgaXMgbm8gc3RhbmRhcmQgd2F5IHRvIGNvbnZleSB0aGUgdXNlIG9mIFdTLUFkZHJlc3NpbmcgdmlhIGEgV1NETCBhbmQgdGhlcmUgaXMgbm8KKyAqIHN0YW5kYXJkIGRlZmluaXRpb24gZm9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFdTLUFkZHJlc3NpbmcgPGNvZGU+QWN0aW9uPC9jb2RlPiBoZWFkZXJzOworICogaG93ZXZlciwgdGhlIHJ1bnRpbWUgYmVoYXZpb3Igb2YgdGhpcyBhbm5vdGF0aW9uIGlzIHdlbGwtZGVmaW5lZC4KKyAqIEl0IGlzIGludGVuZGVkIHRoYXQgYSBmdXR1cmUgdmVyc2lvbiBvZgorICogSkFYLVdTIHdpbGwgcmVxdWlyZSB0aGUgdXNlIG9mIHRoZSBzdGFuZGFyZCBtZWNoYW5pc20gdG8gY29udmV5IHRoZSB1c2UKKyAqIG9mIFdTLUFkZHJlc3NpbmcgdmlhIFdTREwgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciBXUy1BZGRyZXNzaW5nIDxjb2RlPkFjdGlvbjwvY29kZT4gaGVhZGVycworICogYXMgZGVmaW5lZCBieSB0aGUgVzNDIFdHIG9uIFdTLUFkZHJlc3NpbmcuCisgKiA8cD4KKyAqIFRvIHdyaXRlIGEgcG9ydGFibGUgZW5kcG9pbnQgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGNsaWVudCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBKQVgtV1MsCisgKiBhbiBlbmRwb2ludCBNVVNUIGV4cGxpY2l0bHkgc3BlY2lmeSB3aGF0IFdTLUFkZHJlc3NpbmcgPGNvZGU+QWN0aW9uczwvY29kZT4gYXJlIHRvIGJlIHVzZWQKKyAqIHZpYSB0aGUge0BsaW5rIEFjdGlvbn0gYW5kIHtAbGluayBGYXVsdEFjdGlvbn0gYW5ub3RhdGlvbnMuICBUaGUgY2xpZW50IE1VU1QgZXhwbGljaXRseQorICogZW5hYmxlIGFkZHJlc3NzaW5nIHZpYSB0aGUge0BsaW5rIEFkZHJlc3NpbmdGZWF0dXJlfSwgYW5kIGZvciBlYWNoIGludm9jYXRpb24sIHRoZSBjbGllbnQKKyAqIE1VU1QgZXhwbGljaXRseSBzZXQgdGhlIHtAbGluayBCaW5kaW5nUHJvdmlkZXIjU09BUEFDVElPTl9VUklfUFJPUEVSVFl9LgorICogQWZ0ZXIgdGhlIFczQyBXRyBvbiBXUy1BZGRyZXNzaW5nIGhhcyBzcGVjaWZpZWQgaG93IHRoZSB1c2Ugb2YgV1MtQWRkcmVzc2luZyBpcyBzcGVjaWZpZWQgaW4gdGhlIFdTREwsCisgKiBhbmQgd2hhdCB0aGUgZGVmYXVsdCB2YWx1ZSBtdXN0IGJlIGZvciBBY3Rpb24gaGVhZGVycywgYSBmdXR1cmUgdmVyc2lvbiBvZiBKQVgtV1Mgd2lsbCByZW1vdmUgdGhlc2UgcmVxdWlyZW1lbnRzLgorICogPHA+CisgKiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9SRUMtd3MtYWRkci1jb3JlLTIwMDYwNTA5LyI+V2ViIFNlcnZpY2VzIEFkZHJlc3NpbmcgLSBDb3JlPC9hPgorICogYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvUkVDLXdzLWFkZHItc29hcC0yMDA2MDUwOS8iPldlYiBTZXJ2aWNlcyBBZGRyZXNzaW5nIDEuMCAtIFNPQVAgQmluZGluZzwvYT4KKyAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFdTLUFkZHJlc3NpbmcuCisgKgorICogQHNpbmNlIEpBWC1XUyAyLjEKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitAV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uKGlkPUFkZHJlc3NpbmdGZWF0dXJlLklELGJlYW49QWRkcmVzc2luZ0ZlYXR1cmUuY2xhc3MpCitwdWJsaWMgQGludGVyZmFjZSBBZGRyZXNzaW5nIHsKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgaWYgdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICovCisgICAgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgdG8gZGV0ZXJtaW5lIGlmIFdTLUFkZHJlc3NpbmcgaGVhZGVycyBNVVNUCisgICAgICogYmUgcHJlc2VudCBvbiBpbmNvbWluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICBib29sZWFuIHJlcXVpcmVkKCkgZGVmYXVsdCBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zb2FwL0FkZHJlc3NpbmdGZWF0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9BZGRyZXNzaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MGMzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9BZGRyZXNzaW5nRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YXgueG1sLndzLnNvYXA7CisKK2ltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLndzLkZhdWx0QWN0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwud3Muc3BpLlByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgZmVhdHVyZSByZXByZXNlbnRzIHRoZSB1c2Ugb2YgV1MtQWRkcmVzc2luZyB3aXRoIGVpdGhlcgorICogdGhlIFNPQVAgMS4xL0hUVFAgb3IgU09BUCAxLjIvSFRUUCBiaW5kaW5nLiAgVXNpbmcgdGhpcyBmZWF0dXJlCisgKiB3aXRoIGFueSBvdGhlciBiaW5kaW5nIGlzIE5PVCByZXF1aXJlZC4KKyAqIDxwPgorICogRW5hYmxpbmcgdGhpcyBmZWF0dXJlIG9uIHRoZSBjbGllbnQgd2lsbCBjYXVzZSB0aGUgSkFYLVdTIHJ1bnRpbWUKKyAqIHRvIGluY2x1ZGUgV1MtQWRkcmVzc2luZyBoZWFkZXJzIGluIFNPQVAgbWVzc2FnZXMuCisgKiA8cD4KKyAqIElmIHRoZSB3ZWIgc2VydmljZSBkZXZlbG9wZXIgaGFzIG5vdCBleHBsaWNpdGx5IGVuYWJsZWQgdGhpcyBmZWF0dXJlLAorICogaXQgTUFZIGJlIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBpZiB0aGUgYXNzb2NpYXRlZCBXU0RMIGVuYWJsZXMKKyAqIFdTLUFkZHJlc3Npbmcgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiByZWNvZ25pemVkIFdTREwgZXh0ZW5zaW9uIGVsZW1lbnQuCisgKiBIb3dldmVyLCBpbiB0aGlzIHZlcnNpb24gb2YgSkFYLVdTLCB0aGVyZSBpcyBubyBzdGFuZGFyZCBXU0RMCisgKiBleHRlbnNpb24gdGhhdCBhIGNsaWVudCBjYW4gcmVseSBvbiB0byBhdXRvbWF0aWNhbGx5IGVuYWJsZSBXUy1BZGRyZXNzaW5nLAorICogbm9yIGlzIHRoZXJlIGEgc3RhbmRhcmQgZGVmYXVsdCB2YWx1ZSBzcGVjaWZpZWQgZm9yIFdTLUFkZHJlc3NpbmcKKyAqIDxjb2RlPkFjdGlvbjwvY29kZT4gaGVhZGVycy4KKyAqIDxwPgorICogVG8gd3JpdGUgYSBwb3J0YWJsZSBlbmRwb2ludCBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgY2xpZW50IHdpdGggdGhpcworICogdmVyc2lvbiBvZiBKQVgtV1MsIGFuIGVuZHBvaW50IE1VU1QgZXhwbGljaXRseSBzcGVjaWZ5IHdoYXQgV1MtQWRkcmVzc2luZworICogPGNvZGU+QWN0aW9uczwvY29kZT4gYXJlIHRvIGJlIHVzZWQgdmlhIHRoZSB7QGxpbmsgQWN0aW9ufSBhbmQKKyAqIHtAbGluayBGYXVsdEFjdGlvbn0gYW5ub3RhdGlvbnMuICBUaGUgY2xpZW50IE1VU1QgZXhwbGljaXRseSBlbmFibGUKKyAqIGFkZHJlc3NzaW5nIHZpYSB0aGlzIDxjb2RlPkFkZHJlc3NpbmdGZWF0dXJlPC9jb2RlPiwgYW5kIGZvciBlYWNoIGludm9jYXRpb24sCisgKiB0aGUgY2xpZW50IE1VU1QgZXhwbGljaXRseSBzZXQgdGhlIHtAbGluayBCaW5kaW5nUHJvdmlkZXIjU09BUEFDVElPTl9VUklfUFJPUEVSVFl9LgorICogQWZ0ZXIgdGhlIFczQyBXRyBvbiBXUy1BZGRyZXNzaW5nIGhhcyBzcGVjaWZpZWQgaG93IHRoZSB1c2Ugb2YgV1MtQWRkcmVzc2luZworICogaXMgc3BlY2lmaWVkIGluIHRoZSBXU0RMLCBhbmQgd2hhdCB0aGUgZGVmYXVsdCB2YWx1ZSBtdXN0IGJlIGZvciBBY3Rpb24gaGVhZGVycywKKyAqIGEgZnV0dXJlIHZlcnNpb24gb2YgSkFYLVdTIHdpbGwgcmVtb3ZlIHRoZXNlIHJlcXVpcmVtZW50cy4KKyAqIDxwPgorICogU2VlIHtAbGluayBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICogb24gcmVxdWlyZWQgV1NETCBleHRlbnNpb25zLgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGRlc2NyaWJlcyB0aGUgZWZmZWN0cyBvZiB0aGlzIGZlYXR1cmUgd2l0aCByZXNwZWN0CisgKiB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkOgorICogPHVsPgorICogIDxsaT4gRU5BQkxFRDogSW4gdGhpcyBNb2RlLCBXUy1BZGRyZXNzaW5nIHdpbGwgYmUgZW5hYmxlZC4KKyAqICAgICAgIEF0IHJ1bnRpbWUsIFdTLUFkZHJlc3NpbmcgaGVhZGVycworICogICAgICAgTVVTVCBiZSBjb25zdW1lZCBieSB0aGUgcmVjZWl2ZXIgYW5kIHByb2R1Y2VkIGJ5IHRoZQorICogICAgICAgc2VuZGVyIGV2ZW4gaWYgdGhlIFdTREwgZGVjbGFyZXMgb3RoZXJ3aXNlLiBUaGUKKyAqICAgICAgIG11c3RVbmRlcnN0YW5kPSIwIiBhdHRyaWJ1dGUgTVVTVCBiZSB1c2VkIG9uIHRoZSBXUy1BZGRyZXNzaW5nCisgKiAgICAgICBoZWFkZXJzLgorICogIDxsaT4gRElTQUJMRUQ6IEluIHRoaXMgTW9kZSwgV1MtQWRkcmVzc2luZyB3aWxsIGJlIGRpc2FibGVkCisgKiAgICAgICBldmVuIGlmIGFuIGFzc29jaWF0ZWQgV1NETCBzcGVjaWZpZXMgb3RoZXJ3aXNlLiBBdCBydW50aW1lLAorICogICAgICAgV1MtQWRkcmVzc2luZyBoZWFkZXJzIE1VU1QgTk9UIGJlIHVzZWQuICBXUy1BZGRyZXNzaW5nIG1heSBiZSBleHBsaWNpdGx5CisgKiAgICAgICBkaXNhYmxlZCB0byBwcmV2ZW50IGEgSkFYLVdTIGltcGxlbWVudGF0aW9uIGZyb20gY29uc3VtaW5nIGFuZCBwcm9kdWNpbmcKKyAqICAgICAgIFdTLUFkZHJlc3NpbmcgaGVhZGVycy4gSWYgYW4gYXBwbGljYXRpb24KKyAqICAgICAgIGhhcyBpbXBsZW1lbnRlZCBXUy1BZGRyZXNzaW5nIGl0c2VsZiwgaXQgTVVTVCBleHBsaWNpdGx5IGRpc2FibGUgdGhpcyBmZWF0dXJlLgorKiAgICAgICAgTm90IGRvaW5nIHNvIG1heSBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIEpBWC1XUy4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoZSB7QGxpbmsgI3JlcXVpcmVkfSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0bworICogc3BlY2lmeSBpZiBXUy1BZGRyZXNzaW5nIGhlYWRlcnMgTVVTVCBiZSBwcmVzZW50CisgKiBvbiBpbmNvbWluZyBtZXNzYWdlcy4gIFRoaXMgcHJvcGVydHkgb25seSBoYXMgbWVhbmluZyB3aGVuIHVzZWQgb24gdGhlCisgKiBlbmRwb2ludCBhbmQgaGFzIG5vIGFmZmVjdCB3aGVuIHVzZWQgb24gdGhlIGNsaWVudC4KKyAqIEJ5IGRlZmF1bHQgdGhlCisgKiA8Y29kZT5yZXF1aXJlZDwvY29kZT4gcHJvcGVydHkgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICA8cD4KKworICogU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvUkVDLXdzLWFkZHItY29yZS0yMDA2MDUwOS8iPldlYiBTZXJ2aWNlcyBBZGRyZXNzaW5nIC0gQ29yZTwvYT4KKyAqIGFuZCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy13cy1hZGRyLXNvYXAtMjAwNjA1MDkvIj5XZWIgU2VydmljZXMgQWRkcmVzc2luZyAxLjAgLSBTT0FQIEJpbmRpbmc8L2E+CisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBXUy1BZGRyZXNzaW5nLgorICoKKyAqIEBzaW5jZSBKQVgtV1MgMi4xCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBZGRyZXNzaW5nRmVhdHVyZSBleHRlbmRzIFdlYlNlcnZpY2VGZWF0dXJlIHsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB2YWx1ZSBpZGVudGlmeWluZyB0aGUgQWRkcmVzc2luZ0ZlYXR1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvbW9kdWxlIjsKKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IGZvciB0aGUgPGNvZGU+cmVxdWlyZWQ8L2NvZGU+IGZlYXR1cmUgcGFyYW1ldGVyLiBXaGVuIFdTLUFkZHJlc3NpbmcKKyAgICAgKiBpcyBlbmFibGVkLCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQKKyAgICAgKiB0byBzcGVjaWZ5IGlmIFdTLUFkZHJlc3NpbmcgaGVhZGVycyBNVVNUIGJlIHByZXNlbnQgb24gaW5jb21pbmcgbWVzc2FnZXMuICBUaGlzCisgICAgICogcHJvcGVydHkgb25seSBoYXMgbWVhbmluZyBvbiB0aGUgZW5kcG9pbnQgYW5kIGhhcyBubworICAgICAqIGFmZmVjdCB3aGVuIHVzZWQgb24gdGhlIGNsaWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPkFkZHJlc3NpbmdGZWF0dXJlPC9jb2RlPi4KKyAgICAgKiBUaGUgaW5zdGFuY2UgY3JlYXRlZCB3aWxsIGJlIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIEFkZHJlc3NpbmdGZWF0dXJlKCkgeworICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5BZGRyZXNzaW5nRmVhdHVyZTwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgZmVhdHVyZSBzaG91bGQKKyAgICAgKiBiZSBlbmFibGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWRkcmVzc2luZ0ZlYXR1cmUoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPkFkZHJlc3NpbmdGZWF0dXJlPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBmZWF0dXJlIHNob3VsZAorICAgICAqIGJlIGVuYWJsZWQgb3Igbm90LgorICAgICAqIEBwYXJhbSByZXF1aXJlZCBzcGVjaWZpZXMgd2hldGhlcgorICAgICAqIFdTLUFkZHJlc3NpbmcgaGVhZGVycyBNVVNUIGJlIHByZXNlbnQgb24gaW5jb21pbmcgbWVzc2FnZXMuIFRoaXMgcHJvcGVydHkKKyAgICAgKiBvbmx5IGhhcyBtZWFuaW5nIG9uIHRoZSBlbmRwb2ludCBhbmQgaGFzIG5vIGFmZmVjdCB3aGVuCisgICAgICogdXNlZCBvbiB0aGUgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyBBZGRyZXNzaW5nRmVhdHVyZShib29sZWFuIGVuYWJsZWQsIGJvb2xlYW4gcmVxdWlyZWQpIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKyAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSB1c2VkIHRvIGRldGVybWluZSBpZiBXUy1BZGRyZXNzaW5nCisgICAgICogaGVhZGVycyBNVVNUIGJlIHByZXNlbnQgb24gaW5jb21pbmcgbWVzc2FnZXMuICBUaGlzIHByb3BlcnR5CisgICAgICogb25seSBoYXMgbWVhbmluZyBvbiB0aGUgZW5kcG9pbnQsIGFuZCBoYXMgbm8gYWZmZWN0CisgICAgICogd2hlbiB1c2VkIG9uIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJlcXVpcmVkIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVpcmVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zb2FwL01UT00uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zb2FwL01UT00uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGYxMmRlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NvYXAvTVRPTS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZheC54bWwud3Muc29hcDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKK2ltcG9ydCBqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbjsKKworLyoqCisgKiBUaGlzIGZlYXR1cmUgcmVwcmVzZW50cyB0aGUgdXNlIG9mIE1UT00gd2l0aCBhCisgKiB3ZWIgc2VydmljZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBhZmZlY3RzIG9mIHRoaXMgZmVhdHVyZSB3aXRoIHJlc3BlY3QKKyAqIHRvIGJlaW5nIGVuYWJsZWQgb3IgZGlzYWJsZWQ6CisgKiA8dWw+CisgKiAgPGxpPiBFTkFCTEVEOiBJbiB0aGlzIE1vZGUsIE1UT00gd2lsbCBiZSBlbmFibGVkLgorICogIDxsaT4gRElTQUJMRUQ6IEluIHRoaXMgTW9kZSwgTVRPTSB3aWxsIGJlIGRpc2FibGVkCisgKiA8L3VsPgorICogPHA+CisgKiBUaGUge0BsaW5rICN0aHJlc2hvbGR9IHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgdGhyZXNob2xkCisgKiB2YWx1ZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIGJpbmFyeSBkYXRhIHNob3VsZCBiZSBYT1AgZW5jb2RlZC4KKyAqCisgKiBAc2luY2UgSkFYLVdTIDIuMQorICovCitAVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK0BXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24oaWQ9TVRPTUZlYXR1cmUuSUQsYmVhbj1NVE9NRmVhdHVyZS5jbGFzcykKK3B1YmxpYyBAaW50ZXJmYWNlIE1UT00geworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSBmb3IgTVRPTSB0aHJlc2hvbGQgdmFsdWUuIFdoZW4gTVRPTSBpcyBlbmFibGVkLCBiaW5hcnkgZGF0YSBhYm92ZSB0aGlzCisgICAgICogc2l6ZSBpbiBieXRlcyB3aWxsIGJlIFhPUCBlbmNvZGVkIG9yIHNlbnQgYXMgYXR0YWNobWVudC4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkKKyAgICAgKiBNVVNUIGFsd2F5cyBiZSA+PSAwLiBEZWZhdWx0IHZhbHVlIGlzIDAuCisgICAgICovCisgICAgaW50IHRocmVzaG9sZCgpIGRlZmF1bHQgMDsKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zb2FwL01UT01GZWF0dXJlLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9NVE9NRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTFjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9NVE9NRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YXgueG1sLndzLnNvYXA7CisKK2ltcG9ydCBqYXZheC54bWwud3MuQmluZGluZzsKK2ltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5zcGkuUHJvdmlkZXI7CisKKworLyoqCisgKiBUaGlzIGZlYXR1cmUgcmVwcmVzZW50cyB0aGUgdXNlIG9mIE1UT00gd2l0aCBhCisgKiB3ZWIgc2VydmljZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBhZmZlY3RzIG9mIHRoaXMgZmVhdHVyZSB3aXRoIHJlc3BlY3QKKyAqIHRvIGJlaW5nIGVuYWJsZWQgb3IgZGlzYWJsZWQ6CisgKiA8dWw+CisgKiAgPGxpPiBFTkFCTEVEOiBJbiB0aGlzIE1vZGUsIE1UT00gd2lsbCBiZSBlbmFibGVkLgorICogIDxsaT4gRElTQUJMRUQ6IEluIHRoaXMgTW9kZSwgTVRPTSB3aWxsIGJlIGRpc2FibGVkCisgKiA8L3VsPgorICogPHA+CisgKiBUaGUge0BsaW5rICN0aHJlc2hvbGR9IHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgdGhyZXNob2xkCisgKiB2YWx1ZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIGJpbmFyeSBkYXRhIHNob3VsZCBiZSBYT1AgZW5jb2RlZC4KKyAqCisgKiBAc2luY2UgSkFYLVdTIDIuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTVRPTUZlYXR1cmUgZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZSB7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdmFsdWUgaWRlbnRpZnlpbmcgdGhlIE1UT01GZWF0dXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC9zb2FwL2ZlYXR1cmVzL2h0dHAtb3B0aW1pemF0aW9uIjsKKworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgZm9yIE1UT00gdGhyZXNob2xkIHZhbHVlLiBUaGlzIHByb3BlcnR5IHNlcnZlcyBhcyBhIGhpbnQgd2hlbgorICAgICAqIE1UT00gaXMgZW5hYmxlZCwgYmluYXJ5IGRhdGEgYWJvdmUgdGhpcyBzaXplIGluIGJ5dGVzIFNIT1VMRCBiZSBzZW50CisgICAgICogYXMgYXR0YWNobWVudC4KKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBNVVNUIGFsd2F5cyBiZSA+PSAwLiBEZWZhdWx0IHZhbHVlIGlzIDAuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCB0aHJlc2hvbGQgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+TVRPTUZlYXR1cmU8L2NvZGU+LgorICAgICAqIFRoZSBpbnN0YW5jZSBjcmVhdGVkIHdpbGwgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTVRPTUZlYXR1cmUoKSB7CisgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiA8Y29kZT5NVE9NRmVhdHVyZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBzcGVjaWZpZXMgaWYgdGhpcyBmZWF0dXJlIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBNVE9NRmVhdHVyZShib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gPGNvZGU+TVRPTUZlYXR1cmU8L2NvZGU+LgorICAgICAqIFRoZSBpbnN0YW5jZSBjcmVhdGVkIHdpbGwgYmUgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgdGhlIHNpemUgaW4gYnl0ZXMgdGhhdCBiaW5hcnkgZGF0YSBTSE9VTEQgYmUgYmVmb3JlCisgICAgICogYmVpbmcgc2VudCBhcyBhbiBhdHRhY2htZW50LgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIGlmIHRocmVzaG9sZCBpcyA8IDAKKyAgICAgKi8KKyAgICBwdWJsaWMgTVRPTUZlYXR1cmUoaW50IHRocmVzaG9sZCkgeworICAgICAgICBpZiAodGhyZXNob2xkIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJNVE9NRmVhdHVyZS50aHJlc2hvbGQgbXVzdCBiZSA+PSAwLCBhY3R1YWwgdmFsdWU6ICIrdGhyZXNob2xkKTsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgdGhpcy50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiA8Y29kZT5NVE9NRmVhdHVyZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBzcGVjaWZpZXMgaWYgdGhpcyBmZWF0dXJlIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdAorICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgdGhlIHNpemUgaW4gYnl0ZXMgdGhhdCBiaW5hcnkgZGF0YSBTSE9VTEQgYmUgYmVmb3JlCisgICAgICogYmVpbmcgc2VudCBhcyBhbiBhdHRhY2htZW50LgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIGlmIHRocmVzaG9sZCBpcyA8IDAKKyAgICAgKi8KKyAgICBwdWJsaWMgTVRPTUZlYXR1cmUoYm9vbGVhbiBlbmFibGVkLCBpbnQgdGhyZXNob2xkKSB7CisgICAgICAgIGlmICh0aHJlc2hvbGQgPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIk1UT01GZWF0dXJlLnRocmVzaG9sZCBtdXN0IGJlID49IDAsIGFjdHVhbCB2YWx1ZTogIit0aHJlc2hvbGQpOworICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKyAgICAgICAgcmV0dXJuIElEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRocmVzaG9sZCB2YWx1ZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIGJpbmFyeSBkYXRhCisgICAgICogc2hvdWxkIGJlIHNlbnQgYXMgYW4gYXR0YWNobWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdGhyZXNob2xkIHNpemUgaW4gYnl0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRocmVzaG9sZCgpIHsKKyAgICAgICAgcmV0dXJuIHRocmVzaG9sZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9TT0FQQmluZGluZy5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NvYXAvU09BUEJpbmRpbmcuamF2YQppbmRleCAxNjZmMmNlLi4xNTJmZTA3IDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9TT0FQQmluZGluZy5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zb2FwL1NPQVBCaW5kaW5nLmphdmEKQEAgLTYwLDYgKzYwLDcgQEAKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLz9tdG9tPXRydWUiOwogCisKICAgLyoqIEdldHMgdGhlIHJvbGVzIHBsYXllZCBieSB0aGUgU09BUCBiaW5kaW5nIGluc3RhbmNlLgogICAgKgogICAgKiAgQHJldHVybiBTZXQ8U3RyaW5nPiBUaGUgc2V0IG9mIHJvbGVzIHBsYXllZCBieSB0aGUgYmluZGluZyBpbnN0YW5jZS4KQEAgLTg3LDkgKzg4LDEwIEBACiAgICAqCiAgICAqIEBwYXJhbSBmbGFnICAgQSA8Y29kZT5ib29sZWFuPC9jb2RlPiBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHVzZSBvZiBNVE9NIHNob3VsZAogICAgKiAgICAgICAgICAgICAgIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCi0gICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgdGhlIHNwZWNpZmllZCBzZXR0aW5nIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIHRoZSBzcGVjaWZpZWQgc2V0dGluZyBpcyBub3Qgc3VwcG9ydGVkCiAgICAqICAgICAgICAgICAgICAgICAgYnkgdGhpcyBiaW5kaW5nIGluc3RhbmNlLgotICAqKi8KKyAgICoKKyAgICoqLwogICBwdWJsaWMgdm9pZCBzZXRNVE9NRW5hYmxlZChib29sZWFuIGZsYWcpOwogCiAgIC8qKgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NvYXAvU09BUEZhdWx0RXhjZXB0aW9uLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9TT0FQRmF1bHRFeGNlcHRpb24uamF2YQppbmRleCBhNDJkZTFkLi5hYjAzZTBmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9TT0FQRmF1bHRFeGNlcHRpb24uamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9TT0FQRmF1bHRFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc29hcC9wYWNrYWdlLmh0bWwKaW5kZXggN2U0NmNkYi4uMmNlN2IxNyAxMDA2NDQKLS0tIGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NvYXAvcGFja2FnZS5odG1sCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zb2FwL3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDI3IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgogVGhpcyBwYWNrYWdlIGRlZmluZXMgQVBJcyBzcGVjaWZpYyB0byB0aGUgU09BUCBiaW5kaW5nLgpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NwaS9GYWN0b3J5RmluZGVyLmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL0ZhY3RvcnlGaW5kZXIuamF2YQppbmRleCA1Y2QyNjY2Li43N2M0YmRiIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL0ZhY3RvcnlGaW5kZXIuamF2YQorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL0ZhY3RvcnlGaW5kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ3LDEyICs0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQogICAgIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHNwaUNsYXNzOwotICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzcGlDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3BpQ2xhc3MgPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsYXNzIHNwaUNsYXNzID0gc2FmZUxvYWRDbGFzcyhjbGFzc05hbWUsIGNsYXNzTG9hZGVyKTsKICAgICAgICAgICAgIHJldHVybiBzcGlDbGFzcy5uZXdJbnN0YW5jZSgpOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKApAQCAtNjcsNyArNjIsNyBAQAogICAgIC8qKgogICAgICAqIEZpbmRzIHRoZSBpbXBsZW1lbnRhdGlvbiA8Y29kZT5DbGFzczwvY29kZT4gb2JqZWN0IGZvciB0aGUgZ2l2ZW4KICAgICAgKiBmYWN0b3J5IG5hbWUsIG9yIGlmIHRoYXQgZmFpbHMsIGZpbmRzIHRoZSA8Y29kZT5DbGFzczwvY29kZT4gb2JqZWN0Ci0gICAgICogZm9yIHRoZSBnaXZlbiBmYWxsYmFjayBjbGFzcyBuYW1lLiBUaGUgYXJndW1lbnRzIHN1cHBsaWVkIG11c3QgYmUKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGZhbGxiYWNrIGNsYXNzIG5hbWUuIFRoZSBhcmd1bWVudHMgc3VwcGxpZWQgTVVTVCBiZQogICAgICAqIHVzZWQgaW4gb3JkZXIuIElmIHVzaW5nIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBzdWNjZXNzZnVsLCB0aGUgc2Vjb25kCiAgICAgICogb25lIHdpbGwgbm90IGJlIHVzZWQuCiAgICAgICogPFA+CkBAIC0xNTIsNCArMTQ3LDMzIEBACiAKICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGZhbGxiYWNrQ2xhc3NOYW1lLCBjbGFzc0xvYWRlcik7CiAgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fREVGQVVMVF9GQUNUT1JZX0NMQVNTID0gImNvbS5zdW4ueG1sLmludGVybmFsLndzLnNwaS5Qcm92aWRlckltcGwiOworCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGNsYXNzLCBwcm92aWRlZCB0aGF0IHRoZSBjYWxsaW5nIHRocmVhZCBoYXMgYW4gYWNjZXNzIHRvIHRoZSBjbGFzcyBiZWluZyBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2FmZUxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGhhcyBhbiBhY2Nlc3MgdG8gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgcyA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgICAgIGlmIChzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgICAgIGlmIChpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHMuY2hlY2tQYWNrYWdlQWNjZXNzKGNsYXNzTmFtZS5zdWJzdHJpbmcoMCxpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIC8vIGFueW9uZSBjYW4gYWNjZXNzIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGZhY3RvcnkgY2xhc3Mgd2l0aG91dCBwZXJtaXNzaW9uCisgICAgICAgICAgICBpZiAoUExBVEZPUk1fREVGQVVMVF9GQUNUT1JZX0NMQVNTLmVxdWFscyhjbGFzc05hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgICAgICB0aHJvdyBzZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zcGkvUHJvdmlkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zcGkvUHJvdmlkZXIuamF2YQppbmRleCBlMTdjNzcxLi4xZDY0ODViIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL1Byb3ZpZGVyLmphdmEKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NwaS9Qcm92aWRlci5qYXZhCkBAIC0yNSw5ICsyNSwxNiBAQAogCiBwYWNrYWdlIGphdmF4LnhtbC53cy5zcGk7CiAKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50OwogaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIAogLyoqCiAgKiBTZXJ2aWNlIHByb3ZpZGVyIGZvciA8Y29kZT5TZXJ2aWNlRGVsZWdhdGU8L2NvZGU+IGFuZApAQCAtMzgsMjAgKzQ1LDIwIEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm92aWRlciB7CiAKLSAgLyoqCi0gICAqIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eSB1c2VkIHRvIGxvb2t1cCB0aGUKLSAgICogbmFtZSBvZiBhIDxjb2RlPlByb3ZpZGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbgotICAgKiBjbGFzcy4KLSAgICovCi0gIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEpBWFdTUFJPVklERVJfUFJPUEVSVFkKLSAgICAgICAgPSAiamF2YXgueG1sLndzLnNwaS5Qcm92aWRlciI7CisgICAgLyoqCisgICAgICogQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5IHVzZWQgdG8gbG9va3VwIHRoZQorICAgICAqIG5hbWUgb2YgYSA8Y29kZT5Qcm92aWRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24KKyAgICAgKiBjbGFzcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBKQVhXU1BST1ZJREVSX1BST1BFUlRZCisgICAgICAgICAgICA9ICJqYXZheC54bWwud3Muc3BpLlByb3ZpZGVyIjsKIAotICAvKioKLSAgICogQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQKLSAgICogPGNvZGU+UHJvdmlkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAqKi8KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfSkFYV1NQUk9WSURFUgotICAgICAgICA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5zcGkuUHJvdmlkZXJJbXBsIjsKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdAorICAgICAqIDxjb2RlPlByb3ZpZGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKiovCisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfSkFYV1NQUk9WSURFUgorICAgICAgICAgICAgPSAiY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpLlByb3ZpZGVySW1wbCI7CiAKIAogICAgIC8qKgpAQCAtOTIsMTYgKzk5LDI3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQcm92aWRlciBwcm92aWRlcigpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoUHJvdmlkZXIpCi0gICAgICAgICAgICBGYWN0b3J5RmluZGVyLmZpbmQoSkFYV1NQUk9WSURFUl9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0pBWFdTUFJPVklERVIpOworICAgICAgICAgICAgT2JqZWN0IHByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5maW5kKEpBWFdTUFJPVklERVJfUFJPUEVSVFksCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfSkFYV1NQUk9WSURFUik7CisgICAgICAgICAgICBpZiAoIShwcm92aWRlciBpbnN0YW5jZW9mIFByb3ZpZGVyKSkgeworICAgICAgICAgICAgICAgIENsYXNzIHBDbGFzcyA9IFByb3ZpZGVyLmNsYXNzOworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWVBc1Jlc291cmNlID0gcENsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOworICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IHBDbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIGlmKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlciA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFVSTCB0YXJnZXRUeXBlVVJMICA9IGxvYWRlci5nZXRSZXNvdXJjZShjbGFzc25hbWVBc1Jlc291cmNlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTGlua2FnZUVycm9yKCJDbGFzc0Nhc3RFeGNlcHRpb246IGF0dGVtcHRpbmcgdG8gY2FzdCIgKworICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoY2xhc3NuYW1lQXNSZXNvdXJjZSkgKworICAgICAgICAgICAgICAgICAgICAgICAidG8iICsgdGFyZ2V0VHlwZVVSTC50b1N0cmluZygpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKFByb3ZpZGVyKSBwcm92aWRlcjsKICAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgUHJvdmlkZXI6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlIFByb3ZpZGVyIiwgZXgpOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKioKQEAgLTExMCwxMyArMTI4LDEzIEBACiAgICAgICogQHBhcmFtIHdzZGxEb2N1bWVudExvY2F0aW9uIEEgVVJMIHBvaW50aW5nIHRvIHRoZSBXU0RMIGRvY3VtZW50CiAgICAgICogICAgICAgIGZvciB0aGUgc2VydmljZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXNuJ3Qgb25lLgogICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UuCi0gICAgICogQHBhcmFtIHNlcnZpY2VDbGFzcyBUaGUgc2VydmljZSBjbGFzcywgd2hpY2ggbXVzdCBiZSBlaXRoZXIKKyAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzIFRoZSBzZXJ2aWNlIGNsYXNzLCB3aGljaCBNVVNUIGJlIGVpdGhlcgogICAgICAqICAgICAgICA8Y29kZT5qYXZheC54bWwud3MuU2VydmljZTwvY29kZT4gb3IgYSBzdWJjbGFzcyB0aGVyZW9mLgogICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgc2VydmljZSBkZWxlZ2F0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU2VydmljZURlbGVnYXRlIGNyZWF0ZVNlcnZpY2VEZWxlZ2F0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LlVSTCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VOYW1lLCBDbGFzcyBzZXJ2aWNlQ2xhc3MpOworICAgICAgICAgICAgamF2YS5uZXQuVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLAorICAgICAgICAgICAgUU5hbWUgc2VydmljZU5hbWUsIENsYXNzIHNlcnZpY2VDbGFzcyk7CiAKIAogICAgIC8qKgpAQCAtMTI3LDI3ICsxNDUsMTYwIEBACiAgICAgICogQHBhcmFtIGJpbmRpbmdJZCBBIFVSSSBzcGVjaWZ5aW5nIHRoZSBkZXNpcmVkIGJpbmRpbmcgKGUuZy4gU09BUC9IVFRQKQogICAgICAqIEBwYXJhbSBpbXBsZW1lbnRvciBBIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gb2JqZWN0IHRvIHdoaWNoCiAgICAgICogICAgICAgIGluY29taW5nIHJlcXVlc3RzIHdpbGwgYmUgZGlzcGF0Y2hlZC4gVGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiAgICAgICAgY2xhc3MgbXVzdCBiZSBhbm5vdGF0ZWQgd2l0aCBhbGwgdGhlIG5lY2Vzc2FyeSBXZWIgc2VydmljZQorICAgICAqICAgICAgICBjbGFzcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IFdlYiBzZXJ2aWNlCiAgICAgICogICAgICAgIGFubm90YXRpb25zLgogICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgZW5kcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEVuZHBvaW50IGNyZWF0ZUVuZHBvaW50KFN0cmluZyBiaW5kaW5nSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbXBsZW1lbnRvcik7CisgICAgICAgICAgICBPYmplY3QgaW1wbGVtZW50b3IpOworCiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGFuZCBwdWJsaXNoZXMgYW4gZW5kcG9pbnQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZAogICAgICAqIGFkZHJlc3MgYW5kIGltcGxlbWVudGF0aW9uIG9iamVjdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBhZGRyZXNzIEEgVVJJIHNwZWNpZnlpbmcgdGhlIGFkZHJlc3MgYW5kIHRyYW5zcG9ydC9wcm90b2NvbAotICAgICAqICAgICAgICB0byB1c2UuIEEgaHR0cDogVVJJIG11c3QgcmVzdWx0IGluIHRoZSBTT0FQIDEuMS9IVFRQCisgICAgICogICAgICAgIHRvIHVzZS4gQSBodHRwOiBVUkkgTVVTVCByZXN1bHQgaW4gdGhlIFNPQVAgMS4xL0hUVFAKICAgICAgKiAgICAgICAgYmluZGluZyBiZWluZyB1c2VkLiBJbXBsZW1lbnRhdGlvbnMgbWF5IHN1cHBvcnQgb3RoZXIKICAgICAgKiAgICAgICAgVVJJIHNjaGVtZXMuCiAgICAgICogQHBhcmFtIGltcGxlbWVudG9yIEEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgdG8gd2hpY2gKICAgICAgKiAgICAgICAgaW5jb21pbmcgcmVxdWVzdHMgd2lsbCBiZSBkaXNwYXRjaGVkLiBUaGUgY29ycmVzcG9uZGluZwotICAgICAqICAgICAgICBjbGFzcyBtdXN0IGJlIGFubm90YXRlZCB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IFdlYiBzZXJ2aWNlCisgICAgICogICAgICAgIGNsYXNzIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgV2ViIHNlcnZpY2UKICAgICAgKiAgICAgICAgYW5ub3RhdGlvbnMuCiAgICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBlbmRwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgRW5kcG9pbnQgY3JlYXRlQW5kUHVibGlzaEVuZHBvaW50KFN0cmluZyBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGltcGxlbWVudG9yKTsKKyAgICAgICAgICAgIE9iamVjdCBpbXBsZW1lbnRvcik7CisgICAgLyoqCisgICAgICogcmVhZCBhbiBFbmRwb2ludFJlZmVyZW5jZSBmcm9tIHRoZSBpbmZvc2V0IGNvbnRhaW5lZCBpbgorICAgICAqIDxjb2RlPmVwckluZm9zZXQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IHVubWFyc2hhbGxlZCBmcm9tCisgICAgICogPGNvZGU+ZXBySW5mb3NldDwvY29kZT4uICBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZQorICAgICAqIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+ZXBySW5mb3NldDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIElmIHRoZSA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIDxjb2RlPmVwckluZm9zZXQ8L2NvZGU+IHZhbHVlIGlzIGdpdmVuLgorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IEVuZHBvaW50UmVmZXJlbmNlIHJlYWRFbmRwb2ludFJlZmVyZW5jZShqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSBlcHJJbmZvc2V0KTsKKworCisgICAgLyoqCisgICAgICogVGhlIGdldFBvcnQgbWV0aG9kIHJldHVybnMgYSBwcm94eS4gIElmIHRoZXJlCisgICAgICogYXJlIGFueSByZWZlcmVuY2UgcGFyYW1ldGVycyBpbiB0aGUKKyAgICAgKiA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4sIHRoZW4gdGhvc2UgcmVmZXJlbmNlCisgICAgICogcGFyYW1ldGVycyBNVVNUIGFwcGVhciBhcyBTT0FQIGhlYWRlcnMsIGluZGljYXRpbmcgdGhlbSB0byBiZQorICAgICAqIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLCBvbiBhbGwgbWVzc2FnZXMgc2VudCB0byB0aGUgZW5kcG9pbnQuCisgICAgICogVGhlIHBhcmFtZXRlciAgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPiBzcGVjaWZpZXMKKyAgICAgKiB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogcmV0dXJuZWQgcHJveHkuCisgICAgICogVGhlIHBhcmFtZXRlciA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gc3BlY2lmaWVzIHRoZQorICAgICAqIGVuZHBvaW50IHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSByZXR1cm5lZCBwcm94eS4KKyAgICAgKiBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIHRoZSBKQVgtV1MKKyAgICAgKiBydW50aW1lIHN5c3RlbSB0YWtlcyB0aGUgcmVzcG9uc2liaWxpdHkgb2Ygc2VsZWN0aW5nIGEgcHJvdG9jb2wKKyAgICAgKiBiaW5kaW5nIChhbmQgYSBwb3J0KSBhbmQgY29uZmlndXJpbmcgdGhlIHByb3h5IGFjY29yZGluZ2x5IGZyb20KKyAgICAgKiB0aGUgV1NETCBtZXRhZGF0YSBvZiB0aGUKKyAgICAgKiA8Y29kZT5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L2NvZGU+IGFuZCB0aGUgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+LgorICAgICAqIEZvciB0aGlzIG1ldGhvZAorICAgICAqIHRvIHN1Y2Nlc3NmdWxseSByZXR1cm4gYSBwcm94eSwgV1NETCBtZXRhZGF0YSBNVVNUIGJlIGF2YWlsYWJsZSBhbmQgdGhlCisgICAgICogPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IE1VU1QgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbiB1bmRlcnN0b29kCisgICAgICogPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IG1ldGFkYXRhLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kcG9pbnRSZWZlcmVuY2UgdGhlIEVuZHBvaW50UmVmZXJlbmNlIHRoYXQgd2lsbAorICAgICAqIGJlIGludm9rZWQgYnkgdGhlIHJldHVybmVkIHByb3h5LgorICAgICAqIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgU2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKKyAgICAgKiBAcGFyYW0gZmVhdHVyZXMgIEEgbGlzdCBvZiBXZWJTZXJ2aWNlRmVhdHVyZXMgdG8gY29uZmlndXJlIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHByb3h5LiAgU3VwcG9ydGVkIGZlYXR1cmVzIG5vdCBpbiB0aGUgPGNvZGU+ZmVhdHVyZXMKKyAgICAgKiAgICAgICAgICAgICAgICA8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICogQHJldHVybiBPYmplY3QgUHJveHkgaW5zdGFuY2UgdGhhdCBzdXBwb3J0cyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgPFVMPgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBjcmVhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcm94eQorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFueSBtaXNzaW5nIFdTREwgbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyByZXF1aXJlZCBieSB0aGlzIG1ldGhvZH0KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgaWxsZWdhbAorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIGFuIGlsbGVnYWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYSBmZWF0dXJlIGlzIGVuYWJsZWQgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhpcyBwb3J0IG9yIGlzIHVuc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgICAgICAgICAgIDwvVUw+CisgICAgICoKKyAgICAgKiBAc2VlIFdlYlNlcnZpY2VGZWF0dXJlCisgICAgICoKKyAgICAgKiBAc2luY2UgSkFYLVdTIDIuMQorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgPFQ+IFQgZ2V0UG9ydChFbmRwb2ludFJlZmVyZW5jZSBlbmRwb2ludFJlZmVyZW5jZSwKKyAgICAgICAgICAgIENsYXNzPFQ+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwKKyAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKTsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPgorICAgICAqIGZvciBhbnkgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyB0aGUgPGNvZGU+YWRkcmVzczwvY29kZT4gcHJvcGVydHkgYWxvbmcKKyAgICAgKiB3aXRoIGFueSBvdGhlciBkZXNpcmVkIHByb3BlcnRpZXMuICBUaGlzIG1ldGhvZAorICAgICAqIGNhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlIGEgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGZvcgorICAgICAqIGFuIGVuZHBvaW50IHRoYXQgaXMgcHVibGlzaGVkIGJ5IHRoZSBzYW1lIEphdmEgRUUgYXBwbGljYXRpb24uCisgICAgICogVG8gZG8gc28gdGhlIDxjb2RlPmFkZHJlc3M8L2NvZGU+IHByb3BlcnR5IGNhbiBiZSBwcm92aWRlZCBvciB0aGlzCisgICAgICogbWV0aG9kIGNhbiBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUgPGNvZGU+YWRkcmVzczwvY29kZT4gb2YKKyAgICAgKiBhbiBlbmRwb2ludCB0aGF0IGlzIHB1Ymxpc2hlZCBieSB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uIGFuZCBpcworICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBhbmQKKyAgICAgKiA8Y29kZT5wb3J0TmFtZTwvY29kZT4gcHJvcGV0aWVzLiAgSWYgdGhlIDxjb2RlPmFkZHJlc3M8L2NvZGU+IGlzCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gYW5kCisgICAgICogPGNvZGU+cG9ydE5hbWU8L2NvZGU+IGRvIG5vdCBpZGVudGlmeSBhbiBlbmRwb2ludCBwdWJsaXNoZWQgYnkgdGhlCisgICAgICogc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uLCBhCisgICAgICogPGNvZGU+amF2YXgubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+IE1VU1QgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MgU3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgZW5kcG9pbnQKKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgUXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW4gdGhlIFdTREwuCisgICAgICogQHBhcmFtIHBvcnROYW1lIFF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbmRwb2ludCBpbiB0aGUgV1NETC4KKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEgQSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBpbnN0YW5jZXMgPGNvZGU+d3NhOm1ldGFkYXRhPC9jb2RlPgorICAgICAqIGVsZW1lbnQuCisgICAgICogQHBhcmFtIHdzZGxEb2N1bWVudExvY2F0aW9uIFVSTCBmb3IgdGhlIFdTREwgZG9jdW1lbnQgbG9jYXRpb24gZm9yCisgICAgICogdGhlIHNlcnZpY2UuCisgICAgICogQHBhcmFtIHJlZmVyZW5jZVBhcmFtZXRlcnMgUmVmZXJlbmNlIHBhcmFtZXRlcnMgdG8gYmUgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlIHJldHVybmVkIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPGNvZGU+IGNyZWF0ZWQgZnJvbQorICAgICAqICAgICAgICAgIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiwgPGNvZGU+cG9ydE5hbWU8L2NvZGU+LAorICAgICAqICAgICAgICAgIDxjb2RlPm1ldGFkYXRhPC9jb2RlPiwgPGNvZGU+d3NkbERvY3VtZW50TG9jYXRpb248L2NvZGU+CisgICAgICogICAgICAgICAgYW5kIDxjb2RlPnJlZmVyZW5jZVBhcmFtZXRlcnM8L2NvZGU+LiBUaGlzIG1ldGhvZAorICAgICAqICAgICAgICAgIG5ldmVyIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgPHVsPgorICAgICAqICAgICAgICA8bGk+SWYgdGhlIDxjb2RlPmFkZHJlc3M8L2NvZGU+LCA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gYW5kCisgICAgICogICAgICAgICAgICA8Y29kZT5wb3J0TmFtZTwvY29kZT4gYXJlIGFsbCA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAgICAgICAgPGxpPklmIHRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gc2VydmljZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBhbmQgdGhlCisgICAgICogICAgICAgICAgICA8Y29kZT5wb3J0TmFtZT4gaXMgTk9UIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICA8bGk+SWYgdGhlIDxjb2RlPmFkZHJlc3M8L2NvZGU+IHByb3BlcnR5IGlzIDxjb2RlPm51bGw8L2NvZGU+IGFuZAorICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBhbmQgPGNvZGU+cG9ydE5hbWU8L2NvZGU+IGRvIG5vdAorICAgICAqICAgICAgICAgICAgc3BlY2lmeSBhIHZhbGlkIGVuZHBvaW50IHB1Ymxpc2hlZCBieSB0aGUgc2FtZSBKYXZhIEVFCisgICAgICogICAgICAgICAgICBhcHBsaWNhdGlvbi4KKyAgICAgKiAgICAgICAgPGxpPklmIHRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT5pcyBOT1QgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICBhbmQgaXMgbm90IHByZXNlbnQgaW4gdGhlIHNwZWNpZmllZCBXU0RMLgorICAgICAqICAgICAgICA8bGk+SWYgdGhlIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBwb3J0IGlzIG5vdCA8Y29kZT5udWxsPGNvZGU+IGFuZCBpdAorICAgICAqICAgICAgICAgICAgIGlzIG5vdCBwcmVzZW50IGluIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBzZXJ2aWNlIGluIHRoZSBXU0RMLgorICAgICAqICAgICAgICA8bGk+SWYgdGhlIDxjb2RlPndzZGxEb2N1bWVudExvY2F0aW9uPC9jb2RlPiBpcyBOT1QgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIGFuZCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBXU0RMLgorICAgICAqICAgICA8L3VsPgorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFczQ0VuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZVczQ0VuZHBvaW50UmVmZXJlbmNlKFN0cmluZyBhZGRyZXNzLCBRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydE5hbWUsCisgICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IG1ldGFkYXRhLCBTdHJpbmcgd3NkbERvY3VtZW50TG9jYXRpb24sIExpc3Q8RWxlbWVudD4gcmVmZXJlbmNlUGFyYW1ldGVycyk7CiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL1NlcnZpY2VEZWxlZ2F0ZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NwaS9TZXJ2aWNlRGVsZWdhdGUuamF2YQppbmRleCBkYWEyMWEzLi4wNzQyZTdmIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL1NlcnZpY2VEZWxlZ2F0ZS5qYXZhCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy9zcGkvU2VydmljZURlbGVnYXRlLmphdmEKQEAgLTMwLDE0ICszMCwxOCBAQAogaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKIGltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKIGltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOwogaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKKwogCiAvKioKICAqIFNlcnZpY2UgZGVsZWdhdGVzIGFyZSB1c2VkIGludGVybmFsbHkgYnkgPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0cwogICogdG8gYWxsb3cgcGx1Z2dhYmlsaXR5IG9mIEpBWC1XUyBpbXBsZW1lbnRhdGlvbnMuCiAgKiA8cD4KICAqIEV2ZXJ5IDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdCBoYXMgaXRzIG93biBkZWxlZ2F0ZSwgY3JlYXRlZCB1c2luZwotICogdGhlIGphdmF4LnhtbC53cy5Qcm92aWRlciNjcmVhdGVTZXJ2aWNlRGVsZWdhdGUgbWV0aG9kLiBBIDxjb2RlPlNlcnZpY2U8L2NvZGU+CisgKiB0aGUge0BsaW5rIGphdmF4LnhtbC53cy5zcGkuUHJvdmlkZXIjY3JlYXRlU2VydmljZURlbGVnYXRlfSBtZXRob2QuIEEgPGNvZGU+U2VydmljZTwvY29kZT4KICAqIG9iamVjdCBkZWxlZ2F0ZXMgYWxsIG9mIGl0cyBpbnN0YW5jZSBtZXRob2RzIHRvIGl0cyBkZWxlZ2F0ZS4KICAqCiAgKiBAc2VlIGphdmF4LnhtbC53cy5TZXJ2aWNlCkBAIC01MCwyMDAgKzU0LDU2OSBAQAogICAgIHByb3RlY3RlZCBTZXJ2aWNlRGVsZWdhdGUoKSB7CiAgICAgfQogCi0gIC8qKiBUaGUgZ2V0UG9ydCBtZXRob2QgcmV0dXJucyBhIHN0dWIuIEEgc2VydmljZSBjbGllbnQKLSAgICogIHVzZXMgdGhpcyBzdHViIHRvIGludm9rZSBvcGVyYXRpb25zIG9uIHRoZSB0YXJnZXQKLSAgICogIHNlcnZpY2UgZW5kcG9pbnQuIFRoZSA8Y29kZT5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L2NvZGU+Ci0gICAqICBzcGVjaWZpZXMgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5Ci0gICAqICB0aGUgY3JlYXRlZCBkeW5hbWljIHByb3h5IG9yIHN0dWIgaW5zdGFuY2UuCi0gICAqCi0gICAqICBAcGFyYW0gcG9ydE5hbWUgIFF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGluCi0gICAqICAgICAgICAgICAgICAgICAgIHRoZSBXU0RMIHNlcnZpY2UgZGVzY3JpcHRpb24KLSAgICogIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgU2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKLSAgICogICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBkeW5hbWljIHByb3h5IG9yIHN0dWIKLSAgICogICAgICAgICAgICAgICAgICAgaW5zdGFuY2UKLSAgICogIEByZXR1cm4gT2JqZWN0IFByb3h5IGluc3RhbmNlIHRoYXQKLSAgICogICAgICAgICAgICAgICAgIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgc2VydmljZSBlbmRwb2ludAotICAgKiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlCi0gICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgY2FzZXM6Ci0gICAqICAgICAgICAgICAgICAgICAgIDxVTD4KLSAgICogICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFuIGVycm9yIGluIGNyZWF0aW9uIG9mCi0gICAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJveHkKLSAgICogICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFueSBtaXNzaW5nIFdTREwgbWV0YWRhdGEKLSAgICogICAgICAgICAgICAgICAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IHRoaXMgbWV0aG9kCi0gICAqICAgICAgICAgICAgICAgICAgIDxMST5PcHRpb25hbGx5LCBpZiBhbiBpbGxlZ2FsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L2NvZGU+Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICBvciA8Y29kZT5wb3J0TmFtZTwvY29kZT4gaXMgc3BlY2lmaWVkCi0gICAqICAgICAgICAgICAgICAgICAgIDwvVUw+Ci0gICAqICBAc2VlIGphdmEubGFuZy5yZWZsZWN0LlByb3h5Ci0gICAqICBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyCi0gICoqLworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5nZXRQb3J0PC9jb2RlPiBtZXRob2QgcmV0dXJucyBhIHByb3h5LiBBIHNlcnZpY2UgY2xpZW50CisgICAgICogdXNlcyB0aGlzIHByb3h5IHRvIGludm9rZSBvcGVyYXRpb25zIG9uIHRoZSB0YXJnZXQKKyAgICAgKiBzZXJ2aWNlIGVuZHBvaW50LiBUaGUgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgorICAgICAqIHNwZWNpZmllcyB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkKKyAgICAgKiB0aGUgY3JlYXRlZCBkeW5hbWljIHByb3h5IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSBlbmRwb2ludCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgdGhlIFdTREwgc2VydmljZSBkZXNjcmlwdGlvbgorICAgICAqIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgU2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgZHluYW1pYyBwcm94eQorICAgICAqIEByZXR1cm4gT2JqZWN0IFByb3h5IGluc3RhbmNlIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgZW5kcG9pbnQKKyAgICAgKiAgICAgICAgICAgICAgICBpbnRlcmZhY2UKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIGNhc2VzOgorICAgICAqICAgICAgICAgICAgICAgICAgPFVMPgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFuIGVycm9yIGluIGNyZWF0aW9uIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3h5CisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW55IG1pc3NpbmcgV1NETCBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYW4gaWxsZWdhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciA8Y29kZT5wb3J0TmFtZTwvY29kZT4gaXMgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgICAgICA8L1VMPgorICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuUHJveHkKKyAgICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyCisgICAgICoqLworICAgIHB1YmxpYyBhYnN0cmFjdCA8VD4gVCBnZXRQb3J0KFFOYW1lIHBvcnROYW1lLAorICAgICAgICAgICAgQ2xhc3M8VD4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5nZXRQb3J0PC9jb2RlPiBtZXRob2QgcmV0dXJucyBhIHByb3h5LiBBIHNlcnZpY2UgY2xpZW50CisgICAgICogdXNlcyB0aGlzIHByb3h5IHRvIGludm9rZSBvcGVyYXRpb25zIG9uIHRoZSB0YXJnZXQKKyAgICAgKiBzZXJ2aWNlIGVuZHBvaW50LiBUaGUgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgorICAgICAqIHNwZWNpZmllcyB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkKKyAgICAgKiB0aGUgY3JlYXRlZCBkeW5hbWljIHByb3h5IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSBlbmRwb2ludCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgdGhlIFdTREwgc2VydmljZSBkZXNjcmlwdGlvbgorICAgICAqIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgU2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgZHluYW1pYyBwcm94eSBvciBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBmZWF0dXJlcyAgQSBsaXN0IG9mIFdlYlNlcnZpY2VGZWF0dXJlcyB0byBjb25maWd1cmUgb24gdGhlCisgICAgICogICAgICAgICAgICAgICAgcHJveHkuICBTdXBwb3J0ZWQgZmVhdHVyZXMgbm90IGluIHRoZSA8Y29kZT5mZWF0dXJlcworICAgICAqICAgICAgICAgICAgICAgIDwvY29kZT4gcGFyYW1ldGVyIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIE9iamVjdCBQcm94eSBpbnN0YW5jZSB0aGF0CisgICAgICogICAgICAgICAgICAgICAgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50CisgICAgICogICAgICAgICAgICAgICAgaW50ZXJmYWNlCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBjYXNlczoKKyAgICAgKiAgICAgICAgICAgICAgICAgIDxVTD4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjcmVhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm94eQorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFueSBtaXNzaW5nIFdTREwgbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyByZXF1aXJlZCBieSB0aGlzIG1ldGhvZAorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIGFuIGlsbGVnYWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgb3IgPGNvZGU+cG9ydE5hbWU8L2NvZGU+IGlzIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIGEgZmVhdHVyZSBpcyBlbmFibGVkIHRoYXQgaXMgbm90IGNvbXBhdGlibGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoaXMgcG9ydCBvciBpcyB1bnN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDwvVUw+CisgICAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eQorICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXIKKyAgICAgKiBAc2VlIFdlYlNlcnZpY2VGZWF0dXJlCisgICAgICoKKyAgICAgKiBAc2luY2UgSkFYLVdTIDIuMQorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgPFQ+IFQgZ2V0UG9ydChRTmFtZSBwb3J0TmFtZSwKKyAgICAgICAgICAgIENsYXNzPFQ+IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpOworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPmdldFBvcnQ8L2NvZGU+IG1ldGhvZCByZXR1cm5zIGEgcHJveHkuCisgICAgICogVGhlIHBhcmFtZXRlciA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gc3BlY2lmaWVzIHRoZQorICAgICAqIGVuZHBvaW50IHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSByZXR1cm5lZCBwcm94eS4gIElmIHRoZXJlCisgICAgICogYXJlIGFueSByZWZlcmVuY2UgcGFyYW1ldGVycyBpbiB0aGUKKyAgICAgKiA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4sIHRoZW4gdGhvc2UgcmVmZXJlbmNlCisgICAgICogcGFyYW1ldGVycyBNVVNUIGFwcGVhciBhcyBTT0FQIGhlYWRlcnMsIGluZGljYXRpbmcgdGhlbSB0byBiZQorICAgICAqIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLCBvbiBhbGwgbWVzc2FnZXMgc2VudCB0byB0aGUgZW5kcG9pbnQuCisgICAgICogVGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlJ3M8L2NvZGU+IGFkZHJlc3MgTVVTVCBiZSB1c2VkCisgICAgICogZm9yIGludm9jYXRpb25zIG9uIHRoZSBlbmRwb2ludC4KKyAgICAgKiBUaGUgcGFyYW1ldGVyIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4gc3BlY2lmaWVzCisgICAgICogdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIHJldHVybmVkIHByb3h5LgorICAgICAqIEluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgdGhlIEpBWC1XUworICAgICAqIHJ1bnRpbWUgc3lzdGVtIHRha2VzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBzZWxlY3RpbmcgYSBwcm90b2NvbAorICAgICAqIGJpbmRpbmcgKGFuZCBhIHBvcnQpIGFuZCBjb25maWd1cmluZyB0aGUgcHJveHkgYWNjb3JkaW5nbHkgZnJvbQorICAgICAqIHRoZSBXU0RMIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlIG9yCisgICAgICogZnJvbSB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+LgorICAgICAqIElmIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UgaGFzIGEgV1NETCBhbmQKKyAgICAgKiB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhCisgICAgICogYWxzbyBoYXMgYSBXU0RMLCB0aGVuIHRoZSBXU0RMIGZyb20gdGhpcyBpbnN0YW5jZSBNVVNUIGJlIHVzZWQuCisgICAgICogSWYgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIGEgV1NETCBhbmQKKyAgICAgKiB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGRvZXMgaGF2ZSBhIFdTREwsIHRoZW4gdGhlCisgICAgICogV1NETCBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gTUFZIGJlIHVzZWQuCisgICAgICogVGhlIHJldHVybmVkIHByb3h5IHNob3VsZCBub3QgYmUgcmVjb25maWd1cmVkIGJ5IHRoZSBjbGllbnQuCisgICAgICogSWYgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZSBoYXMgYSBrbm93biBwcm94eQorICAgICAqIHBvcnQgdGhhdCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4KKyAgICAgKiB0aGUgV1NETCwKKyAgICAgKiB0aGVuIHRoYXQgcHJveHkgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBhIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiBpcyB0aHJvd24uCisgICAgICogPHA+CisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIGZvbGxvd2luZworICAgICAqIDxwcmU+CisgICAgICogPGNvZGU+cG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTs8L2NvZGU+CisgICAgICogPC9wcmU+CisgICAgICogd2hlcmUgdGhlIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUKKyAgICAgKiBtZXRhZGF0YSBvZiB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG9yIGZyb20gdGhlCisgICAgICogPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPiBhbmQgdGhlIFdTREwKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmRwb2ludFJlZmVyZW5jZSAgVGhlIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPgorICAgICAqIGZvciB0aGUgdGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQgdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlCisgICAgICogcmV0dXJuZWQgcHJveHkuCisgICAgICogQHBhcmFtIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBTZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZXMgIEEgbGlzdCBvZiA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZXM8L2NvZGU+IHRvIGNvbmZpZ3VyZSBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBwcm94eS4gIFN1cHBvcnRlZCBmZWF0dXJlcyBub3QgaW4gdGhlIDxjb2RlPmZlYXR1cmVzCisgICAgICogICAgICAgICAgICAgICAgPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIEByZXR1cm4gT2JqZWN0IFByb3h5IGluc3RhbmNlIHRoYXQgc3VwcG9ydHMgdGhlCisgICAgICogICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICA8VUw+CisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIGNyZWF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByb3h5LgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFueSBtaXNzaW5nIFdTREwgbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyByZXF1aXJlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhIGRvZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QgbWF0Y2ggdGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYSA8Y29kZT5wb3J0TmFtZTwvY29kZT4gY2Fubm90IGJlIGV4dHJhY3RlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIFdTREwgb3IgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IG1ldGFkYXRhLgorICAgICAqICAgICAgICAgICAgICAgICAgPExJPklmIGFuIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYW4gaW52YWxpZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYSBmZWF0dXJlIGlzIGVuYWJsZWQgdGhhdCBpcyBub3QgY29tcGF0aWJsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhpcyBwb3J0IG9yIGlzIHVuc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgICAgICAgICAgPC9VTD4KKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgICoqLworICAgIHB1YmxpYyBhYnN0cmFjdCA8VD4gVCBnZXRQb3J0KEVuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50UmVmZXJlbmNlLAorICAgICAgICAgICBDbGFzczxUPiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKTsKIAogCi0gIHB1YmxpYyBhYnN0cmFjdCA8VD4gVCBnZXRQb3J0KFFOYW1lIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8VD4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+Z2V0UG9ydDwvY29kZT4gbWV0aG9kIHJldHVybnMgYSBwcm94eS4gVGhlIHBhcmFtZXRlcgorICAgICAqIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4gc3BlY2lmaWVzIHRoZSBzZXJ2aWNlCisgICAgICogZW5kcG9pbnQgaW50ZXJmYWNlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSByZXR1cm5lZCBwcm94eS4KKyAgICAgKiBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIHRoZSBKQVgtV1MKKyAgICAgKiBydW50aW1lIHN5c3RlbSB0YWtlcyB0aGUgcmVzcG9uc2liaWxpdHkgb2Ygc2VsZWN0aW5nIGEgcHJvdG9jb2wKKyAgICAgKiBiaW5kaW5nIChhbmQgYSBwb3J0KSBhbmQgY29uZmlndXJpbmcgdGhlIHByb3h5IGFjY29yZGluZ2x5LgorICAgICAqIFRoZSByZXR1cm5lZCBwcm94eSBzaG91bGQgbm90IGJlIHJlY29uZmlndXJlZCBieSB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBTZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQorICAgICAqIEByZXR1cm4gT2JqZWN0IGluc3RhbmNlIHRoYXQgc3VwcG9ydHMgdGhlCisgICAgICogICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxVTD4KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgY3JlYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJveHkKKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbnkgbWlzc2luZyBXU0RMIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXMgcmVxdWlyZWQgYnkgdGhpcyBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiBhbiBpbGxlZ2FsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgPC9VTD4KKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IDxUPiBUIGdldFBvcnQoQ2xhc3M8VD4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKIAogCi0gIC8qKiBUaGUgZ2V0UG9ydCBtZXRob2QgcmV0dXJucyBhIHN0dWIuIFRoZSBwYXJhbWV0ZXIKLSAgICogIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4gc3BlY2lmaWVzIHRoZSBzZXJ2aWNlCi0gICAqICBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJldHVybmVkIHByb3h5LgotICAgKiAgSW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLCB0aGUgSkFYLVdTCi0gICAqICBydW50aW1lIHN5c3RlbSB0YWtlcyB0aGUgcmVzcG9uc2liaWxpdHkgb2Ygc2VsZWN0aW5nIGEgcHJvdG9jb2wKLSAgICogIGJpbmRpbmcgKGFuZCBhIHBvcnQpIGFuZCBjb25maWd1cmluZyB0aGUgcHJveHkgYWNjb3JkaW5nbHkuCi0gICAqICBUaGUgcmV0dXJuZWQgcHJveHkgc2hvdWxkIG5vdCBiZSByZWNvbmZpZ3VyZWQgYnkgdGhlIGNsaWVudC4KLSAgICoKLSAgICogIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgU2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKLSAgICogIEByZXR1cm4gT2JqZWN0IGluc3RhbmNlIHRoYXQgc3VwcG9ydHMgdGhlCi0gICAqICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQotICAgKiAgQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAqICAgICAgICAgICAgICAgICAgIDxVTD4KLSAgICogICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBjcmVhdGlvbgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByb3h5Ci0gICAqICAgICAgICAgICAgICAgICAgIDxMST5JZiB0aGVyZSBpcyBhbnkgbWlzc2luZyBXU0RMIG1ldGFkYXRhCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBhcyByZXF1aXJlZCBieSB0aGlzIG1ldGhvZAotICAgKiAgICAgICAgICAgICAgICAgICA8TEk+T3B0aW9uYWxseSwgaWYgYW4gaWxsZWdhbAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+c2VydmljZUVuZHBvaW50SW50ZXJmYWNlPC9jb2RlPgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgaXMgc3BlY2lmaWVkCi0gICAqICAgICAgICAgICAgICAgICAgIDwvVUw+Ci0gICoqLwotICBwdWJsaWMgYWJzdHJhY3QgPFQ+IFQgZ2V0UG9ydChDbGFzczxUPiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCi0gIC8qKiBDcmVhdGVzIGEgbmV3IHBvcnQgZm9yIHRoZSBzZXJ2aWNlLiBQb3J0cyBjcmVhdGVkIGluIHRoaXMgd2F5IGNvbnRhaW4KLSAgICogIG5vIFdTREwgcG9ydCB0eXBlIGluZm9ybWF0aW9uIGFuZCBjYW4gb25seSBiZSB1c2VkIGZvciBjcmVhdGluZwotICAgKiAgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+aW5zdGFuY2VzLgotICAgKgotICAgKiAgQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50Ci0gICAqICBAcGFyYW0gYmluZGluZ0lkIEEgVVJJIGlkZW50aWZpZXIgb2YgYSBiaW5kaW5nLgotICAgKiAgQHBhcmFtIGVuZHBvaW50QWRkcmVzcyBBZGRyZXNzIG9mIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludCBhcyBhIFVSSQotICAgKiAgQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIGFueSBlcnJvciBpbiB0aGUgY3JlYXRpb24gb2YKLSAgICogIHRoZSBwb3J0Ci0gICAqCi0gICAqICBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI1NPQVAxMUhUVFBfQklORElORwotICAgKiAgQHNlZSBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZyNTT0FQMTJIVFRQX0JJTkRJTkcKLSAgICogIEBzZWUgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmcjSFRUUF9CSU5ESU5HCi0gICAqKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUG9ydChRTmFtZSBwb3J0TmFtZSwgU3RyaW5nIGJpbmRpbmdJZCwKLSAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpOwotCi0gIC8qKiBDcmVhdGVzIGEgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IGluc3RhbmNlIGZvciB1c2Ugd2l0aCBvYmplY3RzIG9mCi0gICAqICB0aGUgdXNlcnMgY2hvb3NpbmcuCi0gICAqCi0gICAqICBAcGFyYW0gcG9ydE5hbWUgIFF1YWxpZmllZCBuYW1lIGZvciB0aGUgdGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQKLSAgICogIEBwYXJhbSB0eXBlIFRoZSBjbGFzcyBvZiBvYmplY3QgdXNlZCB0byBtZXNzYWdlcyBvciBtZXNzYWdlCi0gICAqICBwYXlsb2Fkcy4gSW1wbGVtZW50YXRpb25zIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0Ci0gICAqICBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSBhbmQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UuCi0gICAqICBAcGFyYW0gbW9kZSBDb250cm9scyB3aGV0aGVyIHRoZSBjcmVhdGVkIGRpc3BhdGNoIGluc3RhbmNlIGlzIG1lc3NhZ2UKLSAgICogIG9yIHBheWxvYWQgb3JpZW50ZWQsIGkuZS4gd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aCBjb21wbGV0ZQotICAgKiAgcHJvdG9jb2wgbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4gRS5nLiB3aGVuIHVzaW5nIHRoZSBTT0FQCi0gICAqICBwcm90b2NvbCwgdGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aAotICAgKiAgU09BUCBtZXNzYWdlcyBvciB0aGUgY29udGVudHMgb2YgYSBTT0FQIGJvZHkuIE1vZGUgbXVzdCBiZSBNRVNTQUdFCi0gICAqICB3aGVuIHR5cGUgaXMgU09BUE1lc3NhZ2UuCi0gICAqCi0gICAqICBAcmV0dXJuIERpc3BhdGNoIGluc3RhbmNlCi0gICAqICBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgYW55IGVycm9yIGluIHRoZSBjcmVhdGlvbiBvZgotICAgKiAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdAotICAgKiAgQHNlZSBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZQotICAgKiAgQHNlZSBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZQotICAgKiovCi0gIHB1YmxpYyBhYnN0cmFjdCA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIENsYXNzPFQ+IHR5cGUsIFNlcnZpY2UuTW9kZSBtb2RlKTsKLQotICAvKiogQ3JlYXRlcyBhIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBpbnN0YW5jZSBmb3IgdXNlIHdpdGggSkFYQgotICAgKiAgZ2VuZXJhdGVkIG9iamVjdHMuCi0gICAqCi0gICAqICBAcGFyYW0gcG9ydE5hbWUgIFF1YWxpZmllZCBuYW1lIGZvciB0aGUgdGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQKLSAgICogIEBwYXJhbSBjb250ZXh0IFRoZSBKQVhCIGNvbnRleHQgdXNlZCB0byBtYXJzaGFsbCBhbmQgdW5tYXJzaGFsbAotICAgKiAgbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4KLSAgICogIEBwYXJhbSBtb2RlIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNyZWF0ZWQgZGlzcGF0Y2ggaW5zdGFuY2UgaXMgbWVzc2FnZQotICAgKiAgb3IgcGF5bG9hZCBvcmllbnRlZCwgaS5lLiB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoIGNvbXBsZXRlCi0gICAqICBwcm90b2NvbCBtZXNzYWdlcyBvciBtZXNzYWdlIHBheWxvYWRzLiBFLmcuIHdoZW4gdXNpbmcgdGhlIFNPQVAKLSAgICogIHByb3RvY29sLCB0aGlzIHBhcmFtZXRlciBjb250cm9scyB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoCi0gICAqICBTT0FQIG1lc3NhZ2VzIG9yIHRoZSBjb250ZW50cyBvZiBhIFNPQVAgYm9keS4KLSAgICoKLSAgICogIEByZXR1cm4gRGlzcGF0Y2ggaW5zdGFuY2UKLSAgICogIEB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCi0gICAqICAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gb2JqZWN0Ci0gICAqCi0gICAqICBAc2VlIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ci0gICAqKi8KLSAgcHVibGljIGFic3RyYWN0IERpc3BhdGNoPE9iamVjdD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsCi0gICAgICAgICAgICAgIEpBWEJDb250ZXh0IGNvbnRleHQsIFNlcnZpY2UuTW9kZSBtb2RlKTsKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+Z2V0UG9ydDwvY29kZT4gbWV0aG9kIHJldHVybnMgYSBwcm94eS4gVGhlIHBhcmFtZXRlcgorICAgICAqIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4gc3BlY2lmaWVzIHRoZSBzZXJ2aWNlCisgICAgICogZW5kcG9pbnQgaW50ZXJmYWNlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSByZXR1cm5lZCBwcm94eS4KKyAgICAgKiBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIHRoZSBKQVgtV1MKKyAgICAgKiBydW50aW1lIHN5c3RlbSB0YWtlcyB0aGUgcmVzcG9uc2liaWxpdHkgb2Ygc2VsZWN0aW5nIGEgcHJvdG9jb2wKKyAgICAgKiBiaW5kaW5nIChhbmQgYSBwb3J0KSBhbmQgY29uZmlndXJpbmcgdGhlIHByb3h5IGFjY29yZGluZ2x5LgorICAgICAqIFRoZSByZXR1cm5lZCBwcm94eSBzaG91bGQgbm90IGJlIHJlY29uZmlndXJlZCBieSB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBTZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQorICAgICAqIEBwYXJhbSBmZWF0dXJlcyAgQW4gYXJyYXkgb2YgPGNvZGU+V2ViU2VydmljZUZlYXR1cmVzPC9jb2RlPiB0byBjb25maWd1cmUgb24gdGhlCisgICAgICogICAgICAgICAgICAgICAgcHJveHkuICBTdXBwb3J0ZWQgZmVhdHVyZXMgbm90IGluIHRoZSA8Y29kZT5mZWF0dXJlcworICAgICAqICAgICAgICAgICAgICAgIDwvY29kZT4gcGFyYW1ldGVyIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIE9iamVjdCBpbnN0YW5jZSB0aGF0IHN1cHBvcnRzIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICA8VUw+CisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIGNyZWF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByb3h5CisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgdGhlcmUgaXMgYW55IG1pc3NpbmcgV1NETCBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IHRoaXMgbWV0aG9kCisgICAgICogICAgICAgICAgICAgICAgICA8TEk+SWYgYW4gaWxsZWdhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlcnZpY2VFbmRwb2ludEludGVyZmFjZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIDxMST5JZiBhIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGF0IGlzIG5vdCBjb21wYXRpYmxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgICAgICA8L1VMPgorICAgICAqCisgICAgICogQHNlZSBXZWJTZXJ2aWNlRmVhdHVyZQorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IDxUPiBUIGdldFBvcnQoQ2xhc3M8VD4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlLAorICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpOwogCiAKLSAgLyoqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBzZXJ2aWNlLgotICAgKiAgQHJldHVybiBRdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHNlcnZpY2UKLSAgKiovCi0gIHB1YmxpYyBhYnN0cmFjdCBRTmFtZSBnZXRTZXJ2aWNlTmFtZSgpOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgcG9ydCBmb3IgdGhlIHNlcnZpY2UuIFBvcnRzIGNyZWF0ZWQgaW4gdGhpcyB3YXkgY29udGFpbgorICAgICAqIG5vIFdTREwgcG9ydCB0eXBlIGluZm9ybWF0aW9uIGFuZCBjYW4gb25seSBiZSB1c2VkIGZvciBjcmVhdGluZworICAgICAqIDxjb2RlPkRpc3BhdGNoPC9jb2RlPmluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0TmFtZSAgUXVhbGlmaWVkIG5hbWUgZm9yIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludAorICAgICAqIEBwYXJhbSBiaW5kaW5nSWQgQSBVUkkgaWRlbnRpZmllciBvZiBhIGJpbmRpbmcuCisgICAgICogQHBhcmFtIGVuZHBvaW50QWRkcmVzcyBBZGRyZXNzIG9mIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludCBhcyBhIFVSSQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCisgICAgICogdGhlIHBvcnQKKyAgICAgKgorICAgICAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcjU09BUDExSFRUUF9CSU5ESU5HCisgICAgICogQHNlZSBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZyNTT0FQMTJIVFRQX0JJTkRJTkcKKyAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nI0hUVFBfQklORElORworICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRQb3J0KFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgYmluZGluZ0lkLAorICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzcyk7CiAKLSAgLyoqIFJldHVybnMgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IGZvciB0aGUgbGlzdCBvZgotICAgKiAgPGNvZGU+UU5hbWU8L2NvZGU+cyBvZiBzZXJ2aWNlIGVuZHBvaW50cyBncm91cGVkIGJ5IHRoaXMKLSAgICogIHNlcnZpY2UKLSAgICoKLSAgICogIEByZXR1cm4gUmV0dXJucyA8Y29kZT5qYXZhLnV0aWwuSXRlcmF0b3I8L2NvZGU+IHdpdGggZWxlbWVudHMKLSAgICogICAgICAgICAgb2YgdHlwZSA8Y29kZT5qYXZheC54bWwubmFtZXNwYWNlLlFOYW1lPC9jb2RlPgotICAgKiAgQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIHRoaXMgU2VydmljZSBjbGFzcyBkb2VzIG5vdAotICAgKiAgICAgICAgICBoYXZlIGFjY2VzcyB0byB0aGUgcmVxdWlyZWQgV1NETCBtZXRhZGF0YQotICAqKi8KLSAgcHVibGljIGFic3RyYWN0IEl0ZXJhdG9yPGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU+IGdldFBvcnRzKCk7CiAKLSAgLyoqIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50IGZvciB0aGlzIFNlcnZpY2UuCi0gICAqCi0gICAqICBAcmV0dXJuIFVSTCBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50IGZvcgotICAgKiAgICAgICAgICB0aGlzIHNlcnZpY2UKLSAgKiovCi0gIHB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5VUkwgZ2V0V1NETERvY3VtZW50TG9jYXRpb24oKTsKIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmlndXJlZCBoYW5kbGVyIHJlc29sdmVyLgotICAgKgotICAgKiAgQHJldHVybiBIYW5kbGVyUmVzb2x2ZXIgVGhlIDxjb2RlPkhhbmRsZXJSZXNvbHZlcjwvY29kZT4gYmVpbmcKLSAgICogICAgICAgICAgdXNlZCBieSB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgKiAgICAgICAgICBpZiB0aGVyZSBpc24ndCBvbmUuCi0gICoqLwotICBwdWJsaWMgYWJzdHJhY3QgSGFuZGxlclJlc29sdmVyIGdldEhhbmRsZXJSZXNvbHZlcigpOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gaW5zdGFuY2UgZm9yIHVzZSB3aXRoIG9iamVjdHMgb2YKKyAgICAgKiB0aGUgdXNlcidzIGNob29zaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnROYW1lICBRdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHRhcmdldCBzZXJ2aWNlIGVuZHBvaW50CisgICAgICogQHBhcmFtIHR5cGUgVGhlIGNsYXNzIG9mIG9iamVjdCB1c2VkIGZvciBtZXNzYWdlcyBvciBtZXNzYWdlCisgICAgICogcGF5bG9hZHMuIEltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydAorICAgICAqIDxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPC9jb2RlPiBhbmQgPGNvZGU+amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtb2RlIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNyZWF0ZWQgZGlzcGF0Y2ggaW5zdGFuY2UgaXMgbWVzc2FnZQorICAgICAqIG9yIHBheWxvYWQgb3JpZW50ZWQsIGkuZS4gd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aCBjb21wbGV0ZQorICAgICAqIHByb3RvY29sIG1lc3NhZ2VzIG9yIG1lc3NhZ2UgcGF5bG9hZHMuIEUuZy4gd2hlbiB1c2luZyB0aGUgU09BUAorICAgICAqIHByb3RvY29sLCB0aGlzIHBhcmFtZXRlciBjb250cm9scyB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoCisgICAgICogU09BUCBtZXNzYWdlcyBvciB0aGUgY29udGVudHMgb2YgYSBTT0FQIGJvZHkuIE1vZGUgTVVTVCBiZSA8Y29kZT5NRVNTQUdFPC9jb2RlPgorICAgICAqIHdoZW4gdHlwZSBpcyA8Y29kZT5TT0FQTWVzc2FnZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3BhdGNoIGluc3RhbmNlCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIGFueSBlcnJvciBpbiB0aGUgY3JlYXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gb2JqZWN0CisgICAgICogQHNlZSBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZQorICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IDxUPiBEaXNwYXRjaDxUPiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgQ2xhc3M8VD4gdHlwZSwKKyAgICAgICAgICAgIFNlcnZpY2UuTW9kZSBtb2RlKTsKIAotICAvKioKLSAgICogIFNldHMgdGhlIDxjb2RlPkhhbmRsZXJSZXNvbHZlcjwvY29kZT4gZm9yIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4KLSAgICogIGluc3RhbmNlLgotICAgKiAgPHA+Ci0gICAqICBUaGUgaGFuZGxlciByZXNvbHZlciwgaWYgcHJlc2VudCwgd2lsbCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaAotICAgKiAgcHJveHkgb3IgZGlzcGF0Y2ggaW5zdGFuY2UgdGhhdCBpcyBjcmVhdGVkLCBhbmQgdGhlIGhhbmRsZXIgY2hhaW4KLSAgICogIHJldHVybmVkIGJ5IHRoZSByZXNvbHZlciB3aWxsIGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCi0gICAqCi0gICAqICBAcGFyYW0gaGFuZGxlclJlc29sdmVyIFRoZSA8Y29kZT5IYW5kbGVyUmVzb2x2ZXI8L2NvZGU+IHRvIHVzZQotICAgKiAgICAgICAgIGZvciBhbGwgc3Vic2VxdWVudGx5IGNyZWF0ZWQgcHJveHkvZGlzcGF0Y2ggb2JqZWN0cy4KLSAgICoKLSAgICogIEBzZWUgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyCi0gICoqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRIYW5kbGVyUmVzb2x2ZXIoSGFuZGxlclJlc29sdmVyIGhhbmRsZXJSZXNvbHZlcik7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBpbnN0YW5jZSBmb3IgdXNlIHdpdGggb2JqZWN0cyBvZgorICAgICAqIHRoZSB1c2VyJ3MgY2hvb3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydE5hbWUgIFF1YWxpZmllZCBuYW1lIGZvciB0aGUgdGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQKKyAgICAgKiBAcGFyYW0gdHlwZSBUaGUgY2xhc3Mgb2Ygb2JqZWN0IHVzZWQgZm9yIG1lc3NhZ2VzIG9yIG1lc3NhZ2UKKyAgICAgKiBwYXlsb2Fkcy4gSW1wbGVtZW50YXRpb25zIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0CisgICAgICogPGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5qYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTwvY29kZT4uCisgICAgICogQHBhcmFtIG1vZGUgQ29udHJvbHMgd2hldGhlciB0aGUgY3JlYXRlZCBkaXNwYXRjaCBpbnN0YW5jZSBpcyBtZXNzYWdlCisgICAgICogb3IgcGF5bG9hZCBvcmllbnRlZCwgaS5lLiB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoIGNvbXBsZXRlCisgICAgICogcHJvdG9jb2wgbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4gRS5nLiB3aGVuIHVzaW5nIHRoZSBTT0FQCisgICAgICogcHJvdG9jb2wsIHRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGgKKyAgICAgKiBTT0FQIG1lc3NhZ2VzIG9yIHRoZSBjb250ZW50cyBvZiBhIFNPQVAgYm9keS4gTW9kZSBNVVNUIGJlIDxjb2RlPk1FU1NBR0U8L2NvZGU+CisgICAgICogd2hlbiB0eXBlIGlzIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZXMgIEEgbGlzdCBvZiA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZXM8L2NvZGU+IHRvIGNvbmZpZ3VyZSBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBwcm94eS4gIFN1cHBvcnRlZCBmZWF0dXJlcyBub3QgaW4gdGhlIDxjb2RlPmZlYXR1cmVzCisgICAgICogICAgICAgICAgICAgICAgPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHJldHVybiBEaXNwYXRjaCBpbnN0YW5jZQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdCBvciBpZiBhCisgICAgICogICAgICAgICAgICAgICAgICBmZWF0dXJlIGlzIGVuYWJsZWQgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICogICAgICAgICAgICAgICAgICB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlCisgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZQorICAgICAqIEBzZWUgV2ViU2VydmljZUZlYXR1cmUKKyAgICAgKgorICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCisgICAgICoqLworICAgIHB1YmxpYyBhYnN0cmFjdCA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIENsYXNzPFQ+IHR5cGUsCisgICAgICAgICAgICBTZXJ2aWNlLk1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpOwogCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBleGVjdXRvciBmb3IgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPmluc3RhbmNlLgotICAgKgotICAgKiBUaGUgZXhlY3V0b3IgaXMgdXNlZCBmb3IgYWxsIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucyB0aGF0Ci0gICAqIHJlcXVpcmUgY2FsbGJhY2tzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjwvY29kZT4gdG8gYmUKLSAgICogICAgICAgICB1c2VkIHRvIGludm9rZSBhIGNhbGxiYWNrLgotICAgKgotICAgKiBAc2VlIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yCi0gICAqKi8KLSAgIHB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvciBnZXRFeGVjdXRvcigpOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gaW5zdGFuY2UgZm9yIHVzZSB3aXRoIG9iamVjdHMgb2YKKyAgICAgKiB0aGUgdXNlcidzIGNob29zaW5nLiBJZiB0aGVyZQorICAgICAqIGFyZSBhbnkgcmVmZXJlbmNlIHBhcmFtZXRlcnMgaW4gdGhlCisgICAgICogPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+LCB0aGVuIHRob3NlIHJlZmVyZW5jZQorICAgICAqIHBhcmFtZXRlcnMgTVVTVCBhcHBlYXIgYXMgU09BUCBoZWFkZXJzLCBpbmRpY2F0aW5nIHRoZW0gdG8gYmUKKyAgICAgKiByZWZlcmVuY2UgcGFyYW1ldGVycywgb24gYWxsIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIGVuZHBvaW50LgorICAgICAqIFRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZSdzPC9jb2RlPiBhZGRyZXNzIE1VU1QgYmUgdXNlZAorICAgICAqIGZvciBpbnZvY2F0aW9ucyBvbiB0aGUgZW5kcG9pbnQuCisgICAgICogSW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLCB0aGUgSkFYLVdTCisgICAgICogcnVudGltZSBzeXN0ZW0gdGFrZXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHNlbGVjdGluZyBhIHByb3RvY29sCisgICAgICogYmluZGluZyAoYW5kIGEgcG9ydCkgYW5kIGNvbmZpZ3VyaW5nIHRoZSBkaXNwYXRjaCBhY2NvcmRpbmdseSBmcm9tCisgICAgICogdGhlIFdTREwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2Ugb3IKKyAgICAgKiBmcm9tIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uCisgICAgICogSWYgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZSBoYXMgYSBXU0RMIGFuZAorICAgICAqIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4KKyAgICAgKiBhbHNvIGhhcyBhIFdTREwgaW4gaXRzIG1ldGFkYXRhLCB0aGVuIHRoZSBXU0RMIGZyb20gdGhpcyBpbnN0YW5jZSBNVVNUIGJlIHVzZWQuCisgICAgICogSWYgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIGEgV1NETCBhbmQKKyAgICAgKiB0aGUgPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGRvZXMgaGF2ZSBhIFdTREwsIHRoZW4gdGhlCisgICAgICogV1NETCBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gTUFZIGJlIHVzZWQuCisgICAgICogQW4gaW1wbGVtZW50YXRpb24gTVVTVCBiZSBhYmxlIHRvIHJldHJpZXZlIHRoZSA8Y29kZT5wb3J0TmFtZTwvY29kZT4gZnJvbSB0aGUKKyAgICAgKiA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gbWV0YWRhdGEuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgYmVoYXZlcyB0aGUgc2FtZSBhcyBjYWxsaW5nCisgICAgICogPHByZT4KKyAgICAgKiA8Y29kZT5kaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIHR5cGUsIG1vZGUsIGZlYXR1cmVzKTs8L2NvZGU+CisgICAgICogPC9wcmU+CisgICAgICogd2hlcmUgdGhlIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUKKyAgICAgKiBXU0RMIG9yIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBtZXRhZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmRwb2ludFJlZmVyZW5jZSAgVGhlIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPgorICAgICAqIGZvciB0aGUgdGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQgdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlCisgICAgICogcmV0dXJuZWQgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdHlwZSBUaGUgY2xhc3Mgb2Ygb2JqZWN0IHVzZWQgdG8gbWVzc2FnZXMgb3IgbWVzc2FnZQorICAgICAqIHBheWxvYWRzLiBJbXBsZW1lbnRhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQKKyAgICAgKiA8Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvY29kZT4gYW5kIDxjb2RlPmphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbW9kZSBDb250cm9scyB3aGV0aGVyIHRoZSBjcmVhdGVkIGRpc3BhdGNoIGluc3RhbmNlIGlzIG1lc3NhZ2UKKyAgICAgKiBvciBwYXlsb2FkIG9yaWVudGVkLCBpLmUuIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGggY29tcGxldGUKKyAgICAgKiBwcm90b2NvbCBtZXNzYWdlcyBvciBtZXNzYWdlIHBheWxvYWRzLiBFLmcuIHdoZW4gdXNpbmcgdGhlIFNPQVAKKyAgICAgKiBwcm90b2NvbCwgdGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aAorICAgICAqIFNPQVAgbWVzc2FnZXMgb3IgdGhlIGNvbnRlbnRzIG9mIGEgU09BUCBib2R5LiBNb2RlIE1VU1QgYmUgPGNvZGU+TUVTU0FHRTwvY29kZT4KKyAgICAgKiB3aGVuIHR5cGUgaXMgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmZWF0dXJlcyAgQW4gYXJyYXkgb2YgPGNvZGU+V2ViU2VydmljZUZlYXR1cmVzPC9jb2RlPiB0byBjb25maWd1cmUgb24gdGhlCisgICAgICogICAgICAgICAgICAgICAgcHJveHkuICBTdXBwb3J0ZWQgZmVhdHVyZXMgbm90IGluIHRoZSA8Y29kZT5mZWF0dXJlcworICAgICAqICAgICAgICAgICAgICAgIDwvY29kZT4gcGFyYW1ldGVyIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRGlzcGF0Y2ggaW5zdGFuY2UKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIDxVTD4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPExJPklmIHRoZXJlIGlzIGFueSBtaXNzaW5nIFdTREwgbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyByZXF1aXJlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPklmIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gbWV0YWRhdGEgZG9lcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRjaCB0aGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IG9yIDxjb2RlPnBvcnROYW1lPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9mIGEgV1NETCBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlLgorICAgICAqICAgICAgICAgICAgICAgICAgICA8bGk+SWYgdGhlIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBjYW5ub3QgYmUgZGV0ZXJtaW5lZAorICAgICAqICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gbWV0YWRhdGEuCisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT5JZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPklmIGEgZmVhdHVyZSBpcyBlbmFibGVkIHRoYXQgaXMgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICogICAgICAgICAgICAgICAgICA8L1VMPgorICAgICAqCisgICAgICogQHNlZSBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZQorICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UKKyAgICAgKiBAc2VlIFdlYlNlcnZpY2VGZWF0dXJlCisgICAgICoKKyAgICAgKiBAc2luY2UgSkFYLVdTIDIuMQorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgPFQ+IERpc3BhdGNoPFQ+IGNyZWF0ZURpc3BhdGNoKEVuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50UmVmZXJlbmNlLAorICAgICAgICAgICAgQ2xhc3M8VD4gdHlwZSwgU2VydmljZS5Nb2RlIG1vZGUsCisgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcyk7CiAKLSAgLyoqCi0gICAqIFNldHMgdGhlIGV4ZWN1dG9yIGZvciB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlLgotICAgKgotICAgKiBUaGUgZXhlY3V0b3IgaXMgdXNlZCBmb3IgYWxsIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucyB0aGF0Ci0gICAqIHJlcXVpcmUgY2FsbGJhY2tzLgotICAgKgotICAgKiBAcGFyYW0gZXhlY3V0b3IgVGhlIDxjb2RlPmphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yPC9jb2RlPgotICAgKiAgICAgICAgdG8gYmUgdXNlZCB0byBpbnZva2UgYSBjYWxsYmFjay4KLSAgICoKLSAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3Qgc3VwcG9ydAotICAgKiAgICAgICAgIHNldHRpbmcgYW4gZXhlY3V0b3IgZm9yIHNlY3VyaXR5IHJlYXNvbnMgKGUuZy4gdGhlCi0gICAqICAgICAgICAgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIGFyZSBtaXNzaW5nKS4KLSAgICoKLSAgICogQHNlZSBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcgotICAgKiovCi0gICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFeGVjdXRvcihqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvciBleGVjdXRvcik7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gaW5zdGFuY2UgZm9yIHVzZSB3aXRoIEpBWEIKKyAgICAgKiBnZW5lcmF0ZWQgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0TmFtZSAgUXVhbGlmaWVkIG5hbWUgZm9yIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBKQVhCIGNvbnRleHQgdXNlZCB0byBtYXJzaGFsbCBhbmQgdW5tYXJzaGFsbAorICAgICAqIG1lc3NhZ2VzIG9yIG1lc3NhZ2UgcGF5bG9hZHMuCisgICAgICogQHBhcmFtIG1vZGUgQ29udHJvbHMgd2hldGhlciB0aGUgY3JlYXRlZCBkaXNwYXRjaCBpbnN0YW5jZSBpcyBtZXNzYWdlCisgICAgICogb3IgcGF5bG9hZCBvcmllbnRlZCwgaS5lLiB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoIGNvbXBsZXRlCisgICAgICogcHJvdG9jb2wgbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4gRS5nLiB3aGVuIHVzaW5nIHRoZSBTT0FQCisgICAgICogcHJvdG9jb2wsIHRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGgKKyAgICAgKiBTT0FQIG1lc3NhZ2VzIG9yIHRoZSBjb250ZW50cyBvZiBhIFNPQVAgYm9keS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRGlzcGF0Y2ggaW5zdGFuY2UKKyAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gSWYgYW55IGVycm9yIGluIHRoZSBjcmVhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgICAgICAgdGhlIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBvYmplY3QKKyAgICAgKgorICAgICAqIEBzZWUgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IERpc3BhdGNoPE9iamVjdD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsCisgICAgICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0LCBTZXJ2aWNlLk1vZGUgbW9kZSk7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8Y29kZT5EaXNwYXRjaDwvY29kZT4gaW5zdGFuY2UgZm9yIHVzZSB3aXRoIEpBWEIKKyAgICAgKiBnZW5lcmF0ZWQgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0TmFtZSAgUXVhbGlmaWVkIG5hbWUgZm9yIHRoZSB0YXJnZXQgc2VydmljZSBlbmRwb2ludAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBKQVhCIGNvbnRleHQgdXNlZCB0byBtYXJzaGFsbCBhbmQgdW5tYXJzaGFsbAorICAgICAqIG1lc3NhZ2VzIG9yIG1lc3NhZ2UgcGF5bG9hZHMuCisgICAgICogQHBhcmFtIG1vZGUgQ29udHJvbHMgd2hldGhlciB0aGUgY3JlYXRlZCBkaXNwYXRjaCBpbnN0YW5jZSBpcyBtZXNzYWdlCisgICAgICogb3IgcGF5bG9hZCBvcmllbnRlZCwgaS5lLiB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoIGNvbXBsZXRlCisgICAgICogcHJvdG9jb2wgbWVzc2FnZXMgb3IgbWVzc2FnZSBwYXlsb2Fkcy4gRS5nLiB3aGVuIHVzaW5nIHRoZSBTT0FQCisgICAgICogcHJvdG9jb2wsIHRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHVzZXIgd2lsbCB3b3JrIHdpdGgKKyAgICAgKiBTT0FQIG1lc3NhZ2VzIG9yIHRoZSBjb250ZW50cyBvZiBhIFNPQVAgYm9keS4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZXMgIEEgbGlzdCBvZiA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZXM8L2NvZGU+IHRvIGNvbmZpZ3VyZSBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBwcm94eS4gIFN1cHBvcnRlZCBmZWF0dXJlcyBub3QgaW4gdGhlIDxjb2RlPmZlYXR1cmVzCisgICAgICogICAgICAgICAgICAgICAgPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHJldHVybiBEaXNwYXRjaCBpbnN0YW5jZQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBJZiBhbnkgZXJyb3IgaW4gdGhlIGNyZWF0aW9uIG9mCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdCBvciBpZiBhCisgICAgICogICAgICAgICAgICAgICAgICBmZWF0dXJlIGlzIGVuYWJsZWQgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICogICAgICAgICAgICAgICAgICB0aGlzIHBvcnQgb3IgaXMgdW5zdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0CisgICAgICogQHNlZSBXZWJTZXJ2aWNlRmVhdHVyZQorICAgICAqCisgICAgICogQHNpbmNlIEpBWC1XUyAyLjEKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IERpc3BhdGNoPE9iamVjdD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsCisgICAgICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0LCBTZXJ2aWNlLk1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBpbnN0YW5jZSBmb3IgdXNlIHdpdGggSkFYQgorICAgICAqIGdlbmVyYXRlZCBvYmplY3RzLiBJZiB0aGVyZQorICAgICAqIGFyZSBhbnkgcmVmZXJlbmNlIHBhcmFtZXRlcnMgaW4gdGhlCisgICAgICogPGNvZGU+ZW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+LCB0aGVuIHRob3NlIHJlZmVyZW5jZQorICAgICAqIHBhcmFtZXRlcnMgTVVTVCBhcHBlYXIgYXMgU09BUCBoZWFkZXJzLCBpbmRpY2F0aW5nIHRoZW0gdG8gYmUKKyAgICAgKiByZWZlcmVuY2UgcGFyYW1ldGVycywgb24gYWxsIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIGVuZHBvaW50LgorICAgICAqIFRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZSdzPC9jb2RlPiBhZGRyZXNzIE1VU1QgYmUgdXNlZAorICAgICAqIGZvciBpbnZvY2F0aW9ucyBvbiB0aGUgZW5kcG9pbnQuCisgICAgICogSW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLCB0aGUgSkFYLVdTCisgICAgICogcnVudGltZSBzeXN0ZW0gdGFrZXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHNlbGVjdGluZyBhIHByb3RvY29sCisgICAgICogYmluZGluZyAoYW5kIGEgcG9ydCkgYW5kIGNvbmZpZ3VyaW5nIHRoZSBkaXNwYXRjaCBhY2NvcmRpbmdseSBmcm9tCisgICAgICogdGhlIFdTREwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2Ugb3IKKyAgICAgKiBmcm9tIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uCisgICAgICogSWYgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZSBoYXMgYSBXU0RMIGFuZAorICAgICAqIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4KKyAgICAgKiBhbHNvIGhhcyBhIFdTREwgaW4gaXRzIG1ldGFkYXRhLCB0aGVuIHRoZSBXU0RMIGZyb20gdGhpcyBpbnN0YW5jZQorICAgICAqIE1VU1QgYmUgdXNlZC4KKyAgICAgKiBJZiB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgYSBXU0RMIGFuZAorICAgICAqIHRoZSA8Y29kZT5lbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gZG9lcyBoYXZlIGEgV1NETCwgdGhlbiB0aGUKKyAgICAgKiBXU0RMIGZyb20gdGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBNQVkgYmUgdXNlZC4KKyAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBNVVNUIGJlIGFibGUgdG8gcmV0cmlldmUgdGhlIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBmcm9tIHRoZQorICAgICAqIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBtZXRhZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBiZWhhdmllcyB0aGUgc2FtZSBhcyBjYWxsaW5nCisgICAgICogPHByZT4KKyAgICAgKiA8Y29kZT5kaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIGNvbnRleHQsIG1vZGUsIGZlYXR1cmVzKTs8L2NvZGU+CisgICAgICogPC9wcmU+CisgICAgICogd2hlcmUgdGhlIDxjb2RlPnBvcnROYW1lPC9jb2RlPiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUKKyAgICAgKiBXU0RMIG9yIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBtZXRhZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmRwb2ludFJlZmVyZW5jZSAgVGhlIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPgorICAgICAqIGZvciB0aGUgdGFyZ2V0IHNlcnZpY2UgZW5kcG9pbnQgdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlCisgICAgICogcmV0dXJuZWQgPGNvZGU+RGlzcGF0Y2g8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgSkFYQiBjb250ZXh0IHVzZWQgdG8gbWFyc2hhbGwgYW5kIHVubWFyc2hhbGwKKyAgICAgKiBtZXNzYWdlcyBvciBtZXNzYWdlIHBheWxvYWRzLgorICAgICAqIEBwYXJhbSBtb2RlIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNyZWF0ZWQgZGlzcGF0Y2ggaW5zdGFuY2UgaXMgbWVzc2FnZQorICAgICAqIG9yIHBheWxvYWQgb3JpZW50ZWQsIGkuZS4gd2hldGhlciB0aGUgdXNlciB3aWxsIHdvcmsgd2l0aCBjb21wbGV0ZQorICAgICAqIHByb3RvY29sIG1lc3NhZ2VzIG9yIG1lc3NhZ2UgcGF5bG9hZHMuIEUuZy4gd2hlbiB1c2luZyB0aGUgU09BUAorICAgICAqIHByb3RvY29sLCB0aGlzIHBhcmFtZXRlciBjb250cm9scyB3aGV0aGVyIHRoZSB1c2VyIHdpbGwgd29yayB3aXRoCisgICAgICogU09BUCBtZXNzYWdlcyBvciB0aGUgY29udGVudHMgb2YgYSBTT0FQIGJvZHkuCisgICAgICogQHBhcmFtIGZlYXR1cmVzICBBbiBhcnJheSBvZiA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZXM8L2NvZGU+IHRvIGNvbmZpZ3VyZSBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBwcm94eS4gIFN1cHBvcnRlZCBmZWF0dXJlcyBub3QgaW4gdGhlIDxjb2RlPmZlYXR1cmVzCisgICAgICogICAgICAgICAgICAgICAgPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHJldHVybiBEaXNwYXRjaCBpbnN0YW5jZQorICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgPFVMPgorICAgICAqICAgICAgICAgICAgICAgICAgICA8bGk+SWYgdGhlcmUgaXMgYW55IG1pc3NpbmcgV1NETCBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqICAgICAgICAgICAgICAgICAgICA8bGk+SWYgdGhlIDxjb2RlPmVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBtZXRhZGF0YSBkb2VzCisgICAgICogICAgICAgICAgICAgICAgICAgIG5vdCBtYXRjaCB0aGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IG9yIDxjb2RlPnBvcnROYW1lPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICBvZiBhIFdTREwgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgICB3aXRoIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT5JZiB0aGUgPGNvZGU+cG9ydE5hbWU8L2NvZGU+IGNhbm5vdCBiZSBkZXRlcm1pbmVkCisgICAgICogICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBtZXRhZGF0YS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGxpPklmIGFueSBlcnJvciBpbiB0aGUgY3JlYXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIDxjb2RlPkRpc3BhdGNoPC9jb2RlPiBvYmplY3QuCisgICAgICogICAgICAgICAgICAgICAgICAgIDxsaT5pZiBhIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGF0IGlzIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhpcyBwb3J0IG9yIGlzIHVuc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgICAgICAgICAgPC9VTD4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQKKyAgICAgKiBAc2VlIFdlYlNlcnZpY2VGZWF0dXJlCisgICAgICoKKyAgICAgKiBAc2luY2UgSkFYLVdTIDIuMQorICAgICoqLworICAgIHB1YmxpYyBhYnN0cmFjdCBEaXNwYXRjaDxPYmplY3Q+IGNyZWF0ZURpc3BhdGNoKEVuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50UmVmZXJlbmNlLAorICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCwgU2VydmljZS5Nb2RlIG1vZGUsCisgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcyk7CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBzZXJ2aWNlLgorICAgICAqIEByZXR1cm4gUXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBzZXJ2aWNlCisgICAgICoqLworICAgIHB1YmxpYyBhYnN0cmFjdCBRTmFtZSBnZXRTZXJ2aWNlTmFtZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gZm9yIHRoZSBsaXN0IG9mCisgICAgICogPGNvZGU+UU5hbWU8L2NvZGU+cyBvZiBzZXJ2aWNlIGVuZHBvaW50cyBncm91cGVkIGJ5IHRoaXMKKyAgICAgKiBzZXJ2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+amF2YS51dGlsLkl0ZXJhdG9yPC9jb2RlPiB3aXRoIGVsZW1lbnRzCisgICAgICogICAgICAgICBvZiB0eXBlIDxjb2RlPmphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU8L2NvZGU+CisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIHRoaXMgU2VydmljZSBjbGFzcyBkb2VzIG5vdAorICAgICAqICAgICAgICAgaGF2ZSBhY2Nlc3MgdG8gdGhlIHJlcXVpcmVkIFdTREwgbWV0YWRhdGEKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IEl0ZXJhdG9yPGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU+IGdldFBvcnRzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudCBmb3IgdGhpcyBTZXJ2aWNlLgorICAgICAqCisgICAgICogQHJldHVybiBVUkwgZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudCBmb3IKKyAgICAgKiAgICAgICAgIHRoaXMgc2VydmljZQorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuVVJMIGdldFdTRExEb2N1bWVudExvY2F0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIGhhbmRsZXIgcmVzb2x2ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhhbmRsZXJSZXNvbHZlciBUaGUgPGNvZGU+SGFuZGxlclJlc29sdmVyPC9jb2RlPiBiZWluZworICAgICAqICAgICAgICAgdXNlZCBieSB0aGlzIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgaWYgdGhlcmUgaXNuJ3Qgb25lLgorICAgICAqKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgSGFuZGxlclJlc29sdmVyIGdldEhhbmRsZXJSZXNvbHZlcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+SGFuZGxlclJlc29sdmVyPC9jb2RlPiBmb3IgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPgorICAgICAqIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBoYW5kbGVyIHJlc29sdmVyLCBpZiBwcmVzZW50LCB3aWxsIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoCisgICAgICogcHJveHkgb3IgZGlzcGF0Y2ggaW5zdGFuY2UgdGhhdCBpcyBjcmVhdGVkLCBhbmQgdGhlIGhhbmRsZXIgY2hhaW4KKyAgICAgKiByZXR1cm5lZCBieSB0aGUgcmVzb2x2ZXIgd2lsbCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXJSZXNvbHZlciBUaGUgPGNvZGU+SGFuZGxlclJlc29sdmVyPC9jb2RlPiB0byB1c2UKKyAgICAgKiAgICAgICAgZm9yIGFsbCBzdWJzZXF1ZW50bHkgY3JlYXRlZCBwcm94eS9kaXNwYXRjaCBvYmplY3RzLgorICAgICAqCisgICAgICogQHNlZSBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXIKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SGFuZGxlclJlc29sdmVyKEhhbmRsZXJSZXNvbHZlciBoYW5kbGVyUmVzb2x2ZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZXhlY3V0b3IgZm9yIHRoaXMgPGNvZGU+U2VydmljZTwvY29kZT5pbnN0YW5jZS4KKyAgICAgKgorICAgICAqIFRoZSBleGVjdXRvciBpcyB1c2VkIGZvciBhbGwgYXN5bmNocm9ub3VzIGludm9jYXRpb25zIHRoYXQKKyAgICAgKiByZXF1aXJlIGNhbGxiYWNrcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIDxjb2RlPmphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yPC9jb2RlPiB0byBiZQorICAgICAqICAgICAgICAgdXNlZCB0byBpbnZva2UgYSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIGdldEV4ZWN1dG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBleGVjdXRvciBmb3IgdGhpcyA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIFRoZSBleGVjdXRvciBpcyB1c2VkIGZvciBhbGwgYXN5bmNocm9ub3VzIGludm9jYXRpb25zIHRoYXQKKyAgICAgKiByZXF1aXJlIGNhbGxiYWNrcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgPGNvZGU+amF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I8L2NvZGU+CisgICAgICogICAgICAgIHRvIGJlIHVzZWQgdG8gaW52b2tlIGEgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogICAgICAgICBzZXR0aW5nIGFuIGV4ZWN1dG9yIGZvciBzZWN1cml0eSByZWFzb25zIChlLmcuIHRoZQorICAgICAqICAgICAgICAgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIGFyZSBtaXNzaW5nKS4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKKyAgICAgKiovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhlY3V0b3IoamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IgZXhlY3V0b3IpOwogCiB9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL1dlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NwaS9XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGE0ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NwaS9XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YXgueG1sLndzLnNwaTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOworCisvKioKKyAqIEFubm90YXRpb24gdXNlZCB0byBpZGVudGlmeSBvdGhlciBhbm5vdGF0aW9ucworICogYXMgYSA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZTwvY29kZT4uCisgKgorICogRWFjaCA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZTwvY29kZT4gYW5ub3RhdGlvbiBhbm5vdGF0ZWQgd2l0aAorICogdGhpcyBhbm5vdGF0aW9uIE1VU1QgY29udGFpbiBhbgorICogPGNvZGU+ZW5hYmxlZDwvY29kZT4gcHJvcGVydHkgb2YgdHlwZQorICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4uCisgKiBKQVgtV1MgZGVmaW5lcyB0aGUgZm9sbG93aW5nCisgKiA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZTwvY29kZT4gYW5ub3RhdGlvbnMgKDxjb2RlPkFkZHJlc3Npbmc8L2NvZGU+LAorICogPGNvZGU+TVRPTTwvY29kZT4sIDxjb2RlPlJlc3BlY3RCaW5kaW5nPC9jb2RlPiksIGhvd2V2ZXIsIGFuIGltcGxlbWVudGF0aW9uCisgKiBtYXkgZGVmaW5lIHZlbmRvcnMgc3BlY2lmaWMgYW5ub3RhdGlvbnMgZm9yIG90aGVyIGZlYXR1cmVzLgorICogSWYgYSBKQVgtV1MgaW1wbGVtZW50YXRpb24gZW5jb3VudGVycyBhbiBhbm5vdGF0aW9uIGFubm90YXRlZAorICogd2l0aCB0aGUgPGNvZGU+V2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uPC9jb2RlPiB0aGF0IGl0IGRvZXMgbm90CisgKiByZWNvZ25pemUvc3VwcG9ydCBhbiBlcnJvciBNVVNUIGJlIGdpdmVuLgorICoKKyAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZworICogQHNlZSBqYXZheC54bWwud3Muc29hcC5NVE9NCisgKiBAc2VlIGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZworICoKKyAqIEBzaW5jZSBKQVgtV1MgMi4xCisgKi8KK0BUYXJnZXQoRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24geworICAgIC8qKgorICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgV2ViU2VydmljZUZlYXR1cmUuICBUaGlzCisgICAgICogaWRlbnRpZmllciBNVVNUIGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIGltcGxlbWVudGF0aW9ucworICAgICAqIG9mIEpBWC1XUy4KKyAgICAgKi8KKyAgICBTdHJpbmcgaWQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZTwvY29kZT4gYmVhbiB0aGF0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoZSA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZTwvY29kZT4gYW5ub3RhdGlvbgorICAgICAqLworICAgIENsYXNzPD8gZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZT4gYmVhbigpOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3NwaS9wYWNrYWdlLmh0bWwgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL3BhY2thZ2UuaHRtbAppbmRleCAzODY2MTI2Li4wMGJjMTVhIDEwMDY0NAotLS0gYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL3BhY2thZ2UuaHRtbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvc3BpL3BhY2thZ2UuaHRtbApAQCAtMSw1ICsxLDI5IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CiA8aHRtbD4KIDxib2R5PgotVGhpcyBwYWNrYWdlIGRlZmluZXMgU1BJcyBmb3IgSkFYLVdTIDIuMC4KK1RoaXMgcGFja2FnZSBkZWZpbmVzIFNQSXMgZm9yIEpBWC1XUy4KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy93c2FkZHJlc3NpbmcvVzNDRW5kcG9pbnRSZWZlcmVuY2UuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy93c2FkZHJlc3NpbmcvVzNDRW5kcG9pbnRSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY1MjBjCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3dzYWRkcmVzc2luZy9XM0NFbmRwb2ludFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YXgueG1sLndzLndzYWRkcmVzc2luZzsKKworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7CitpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFczQyBBZGRyZXNzaW5nIEVuZHBvaW50UmVmZXJlY2Ugd2hpY2ggaXMKKyAqIGEgcmVtb3RlIHJlZmVyZW5jZSB0byBhIHdlYiBzZXJ2aWNlIGVuZHBvaW50IHRoYXQgc3VwcG9ydHMgdGhlCisgKiBXM0MgV1MtQWRkcmVzc2luZyAxLjAgLSBDb3JlIFJlY29tbWVuZGF0aW9uLgorICogPHA+CisgKiBEZXZlbG9wZXJzIHNob3VsZCB1c2UgdGhpcyBjbGFzcyBpbiB0aGVpciBTRUlzIGlmIHRoZXkgd2FudCB0bworICogcGFzcy9yZXR1cm4gZW5kcG9pbnQgcmVmZXJlbmNlcyB0aGF0IHJlcHJlc2VudCB0aGUgVzNDIFdTLUFkZHJlc3NpbmcKKyAqIHJlY29tbWVuZGF0aW9uLgorICogPHA+CisgKiBKQVhCIHdpbGwgdXNlIHRoZSBKQVhCIGFubm90YXRpb25zIGFuZCBiaW5kIHRoaXMgY2xhc3MgdG8gWE1MIGluZm9zZXQKKyAqIHRoYXQgaXMgY29uc2lzdGVudCB3aXRoIHRoYXQgZGVmaW5lZCBieSBXUy1BZGRyZXNzaW5nLiAgU2VlCisgKiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy13cy1hZGRyLWNvcmUtMjAwNjA1MDkvIj4KKyAqIFdTLUFkZHJlc3Npbmc8L2E+CisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBXUy1BZGRyZXNzaW5nIEVuZHBvaW50UmVmZXJlbmNlcy4KKyAqCisgKiBAc2luY2UgSkFYLVdTIDIuMQorICovCisKKy8vIFhtbFJvb3RFbGVtZW50IGFsbG93cyB0aGlzIGNsYXNzIHRvIGJlIG1hcnNoYWxsZWQgb24gaXRzIG93bgorQFhtbFJvb3RFbGVtZW50KG5hbWU9IkVuZHBvaW50UmVmZXJlbmNlIixuYW1lc3BhY2U9VzNDRW5kcG9pbnRSZWZlcmVuY2UuTlMpCitAWG1sVHlwZShuYW1lPSJFbmRwb2ludFJlZmVyZW5jZVR5cGUiLG5hbWVzcGFjZT1XM0NFbmRwb2ludFJlZmVyZW5jZS5OUykKK3B1YmxpYyBmaW5hbCBjbGFzcyBXM0NFbmRwb2ludFJlZmVyZW5jZSBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEpBWEJDb250ZXh0IHczY2pjID0gZ2V0VzNDSmF4YkNvbnRleHQoKTsKKworICAgIHByb3RlY3RlZCBXM0NFbmRwb2ludFJlZmVyZW5jZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIEVQUiBmcm9tIGluZm9zZXQgcmVwcmVzZW50YXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgQSBzb3VyY2Ugb2JqZWN0IGNvbnRhaW5pbmcgdmFsaWQgWG1sSW5mb3NldAorICAgICAqIGluc3RhbmNlIGNvbnNpc3RlbnQgd2l0aCB0aGUgVzNDIFdTLUFkZHJlc3NpbmcgQ29yZQorICAgICAqIHJlY29tbWVuZGF0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCisgICAgICogICBJZiB0aGUgc291cmNlIGRvZXMgTk9UIGNvbnRhaW4gYSB2YWxpZCBXM0MgV1MtQWRkcmVzc2luZworICAgICAqICAgRW5kcG9pbnRSZWZlcmVuY2UuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgSWYgdGhlIDxjb2RlPm51bGw8L2NvZGU+IDxjb2RlPnNvdXJjZTwvY29kZT4gdmFsdWUgaXMgZ2l2ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgVzNDRW5kcG9pbnRSZWZlcmVuY2UoU291cmNlIHNvdXJjZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gdzNjamMuY3JlYXRlVW5tYXJzaGFsbGVyKCkudW5tYXJzaGFsKHNvdXJjZSxXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcykuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHRoaXMuYWRkcmVzcyA9IGVwci5hZGRyZXNzOworICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IGVwci5tZXRhZGF0YTsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9IGVwci5yZWZlcmVuY2VQYXJhbWV0ZXJzOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJFcnJvciB1bm1hcnNoYWxsaW5nIFczQ0VuZHBvaW50UmVmZXJlbmNlICIgLGUpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlNvdXJjZSBkaWQgbm90IGNvbnRhaW4gVzNDRW5kcG9pbnRSZWZlcmVuY2UiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFJlc3VsdCByZXN1bHQpeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gdzNjamMuY3JlYXRlTWFyc2hhbGxlcigpOworICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsIHRydWUpOworICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKHRoaXMsIHJlc3VsdCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkVycm9yIG1hcnNoYWxsaW5nIFczQ0VuZHBvaW50UmVmZXJlbmNlLiAiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0IGdldFczQ0pheGJDb250ZXh0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgSkFYQkNvbnRleHQgZm9yIFczQ0VuZHBvaW50UmVmZXJlbmNlLiAiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHByaXZhdGUgYnV0IG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIGZvciBkYXRhYmluZGluZworICAgIEBYbWxFbGVtZW50KG5hbWU9IkFkZHJlc3MiLG5hbWVzcGFjZT1OUykKKyAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsKKyAgICBAWG1sRWxlbWVudChuYW1lPSJSZWZlcmVuY2VQYXJhbWV0ZXJzIixuYW1lc3BhY2U9TlMpCisgICAgcHJpdmF0ZSBFbGVtZW50cyByZWZlcmVuY2VQYXJhbWV0ZXJzOworICAgIEBYbWxFbGVtZW50KG5hbWU9Ik1ldGFkYXRhIixuYW1lc3BhY2U9TlMpCisgICAgcHJpdmF0ZSBFbGVtZW50cyBtZXRhZGF0YTsKKyAgICBAWG1sQW55QXR0cmlidXRlCisgICAgTWFwPFFOYW1lLFN0cmluZz4gYXR0cmlidXRlczsKKyAgICBAWG1sQW55RWxlbWVudAorICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHM7CisKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFkZHJlc3MgeworICAgICAgICBwcm90ZWN0ZWQgQWRkcmVzcygpIHt9CisgICAgICAgIEBYbWxWYWx1ZQorICAgICAgICBTdHJpbmcgdXJpOworICAgICAgICBAWG1sQW55QXR0cmlidXRlCisgICAgICAgIE1hcDxRTmFtZSxTdHJpbmc+IGF0dHJpYnV0ZXM7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbGVtZW50cyB7CisgICAgICAgIHByb3RlY3RlZCBFbGVtZW50cygpIHt9CisgICAgICAgIEBYbWxBbnlFbGVtZW50CisgICAgICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHM7CisgICAgICAgIEBYbWxBbnlBdHRyaWJ1dGUKKyAgICAgICAgTWFwPFFOYW1lLFN0cmluZz4gYXR0cmlidXRlczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3dzYWRkcmVzc2luZy9XM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy93c2FkZHJlc3NpbmcvVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViOTY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy93c2FkZHJlc3NpbmcvVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nOworCisKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC53cy5zcGkuUHJvdmlkZXI7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYnVpbGQgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+CisgKiBpbnN0YW5jZXMuIFRoZSBpbnRlbmRlZCB1c2Ugb2YgdGhpcyBjbHNzcyBpcyBmb3IKKyAqIGFuIGFwcGxpY2F0aW9uIGNvbXBvbmVudCwgZm9yIGV4YW1wbGUgYSBmYWN0b3J5IGNvbXBvbmVudCwKKyAqIHRvIGNyZWF0ZSBhbiA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gZm9yIGEKKyAqIHdlYiBzZXJ2aWNlIGVuZHBvaW50IHB1Ymxpc2hlZCBieSB0aGUgc2FtZQorICogSmF2YSBFRSBhcHBsaWNhdGlvbi4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUKKyAqIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlczwvY29kZT4gZm9yIGFuIEphdmEgU0UgYmFzZWQKKyAqIGVuZHBvaW50IGJ5IHByb3ZpZGluZyB0aGUgPGNvZGU+YWRkcmVzczwvY29kZT4gcHJvcGVydHkuCisgKiA8cD4KKyAqIFdoZW4gY3JlYXRpbmcgYSA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gZm9yIGFuCisgKiBlbmRwb2ludCB0aGF0IGlzIG5vdCBwdWJsaXNoZWQgYnkgdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiwKKyAqIHRoZSA8Y29kZT5hZGRyZXNzPC9jb2RlPiBwcm9wZXJ0eSBNVVNUIGJlIHNwZWNpZmllZC4KKyAqIDxwPgorICogV2hlbiBjcmVhdGluZyBhIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBmb3IgYW4gZW5kcG9pbnQKKyAqIHB1Ymxpc2hlZCBieSB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uLCB0aGUgPGNvZGU+YWRkcmVzczwvY29kZT4KKyAqIHByb3BlcnR5IE1BWSBiZSA8Y29kZT5udWxsPC9jb2RlPiBidXQgdGhlbiB0aGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+CisgKiBhbmQgPGNvZGU+ZW5kcG9pbnROYW1lPC9jb2RlPiBNVVNUIHNwZWNpZnkgYW4gZW5kcG9pbnQgcHVibGlzaGVkIGJ5CisgKiB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uLgorICogPHA+CisgKiBXaGVuIHRoZSA8Y29kZT53c2RsRG9jdW1lbnRMb2NhdGlvbjwvY29kZT4gaXMgc3BlY2lmaWVkIGl0IE1VU1QgcmVmZXIKKyAqIHRvIGEgdmFsaWQgV1NETCBkb2N1bWVudCBhbmQgdGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBhbmQKKyAqIDxjb2RlPmVuZHBvaW50TmFtZTwvY29kZT4gKGlmIHNwZWNpZmllZCkgTVVTVCBtYXRjaCBhIHNlcnZpY2UgYW5kIHBvcnQKKyAqIGluIHRoZSBXU0RMIGRvY3VtZW50LgorICoKKyAqIEBzaW5jZSBKQVgtV1MgMi4xCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCkgeworICAgICAgICByZWZlcmVuY2VQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOworICAgICAgICBtZXRhZGF0YSA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5hZGRyZXNzPC9jb2RlPiB0byB0aGUKKyAgICAgKiA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gaW5zdGFuY2UncworICAgICAqIDxjb2RlPndzYTpBZGRyZXNzPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgPGNvZGU+YWRkcmVzczwvY29kZT4gTVVTVCBiZSBzZXQgdG8gYSBub24tPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiB2YWx1ZSB3aGVuIGJ1aWxkaW5nIGEgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGZvciBhCisgICAgICogd2ViIHNlcnZpY2UgZW5kcG9pbnQgdGhhdCBpcyBub3QgcHVibGlzaGVkIGJ5IHRoZSBzYW1lCisgICAgICogSmF2YSBFRSBhcHBsaWNhdGlvbiBvciB3aGVuIHJ1bm5pbmcgb24gSmF2YSBTRS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIG9mIHRoZSBlbmRwb2ludCB0byBiZSB0YXJnZXRlZAorICAgICAqICAgICAgYnkgdGhlIHJldHVybmVkIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPGNvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBBIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjwvY29kZT4gaW5zdGFuY2Ugd2l0aAorICAgICAqICAgdGhlIDxjb2RlPmFkZHJlc3M8L2NvZGU+IHNldCB0byB0aGUgPGNvZGU+d3NhOkFkZHJlc3M8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgYWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gb2YgdGhlIGVuZHBvaW50IHRvIGJlIHRhcmdldGVkCisgICAgICogICAgICBieSB0aGUgcmV0dXJuZWQgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIGVuZHBvaW50IHRvIGJlIHRhcmdldGVkCisgICAgICogICAgICBieSB0aGUgcmV0dXJuZWQgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8Y29kZT4uICBUaGlzIHByb3BlcnR5CisgICAgICogICAgICBtYXkgYWxzbyBiZSB1c2VkIHdpdGggdGhlIDxjb2RlPmVuZHBvaW50TmFtZTwvY29kZT4gKHBvcnROYW1lKQorICAgICAqICAgICAgcHJvcGVydHkgdG8gbG9va3VwIHRoZSA8Y29kZT5hZGRyZXNzPC9jb2RlPiBvZiBhIHdlYiBzZXJ2aWNlCisgICAgICogICAgICBlbmRwb2ludCB0aGF0IGlzIHB1Ymxpc2hlZCBieSB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjwvY29kZT4gaW5zdGFuY2Ugd2l0aAorICAgICAqICAgdGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBwcm9wZXJ0eSBzZXQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHNlcnZpY2VOYW1lKFFOYW1lIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+ZW5kcG9pbnROYW1lPC9jb2RlPiBvZiB0aGUgZW5kcG9pbnQgdG8KKyAgICAgKiBiZSB0YXJnZXRlZCBieSB0aGUgcmV0dXJuZWQgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcm5jZTwvY29kZT4uCisgICAgICogVGhpcyBtZXRob2QgY2FuIG9ubHkKKyAgICAgKiBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHtAbGluayAjc2VydmljZU5hbWV9IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kcG9pbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludCB0byBiZSB0YXJnZXRlZAorICAgICAqICAgICAgYnkgdGhlIHJldHVybmVkIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPGNvZGU+LiBUaGUKKyAgICAgKiAgICAgIDxjb2RlPmVuZHBvaW50TmFtZTwvY29kZT4gKHBvcnROYW1lKSBwcm9wZXJ0eSBtYXkgYWxzbyBiZQorICAgICAqICAgICAgdXNlZCB3aXRoIHRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gcHJvcGVydHkgdG8gbG9va3VwCisgICAgICogICAgICB0aGUgPGNvZGU+YWRkcmVzczwvY29kZT4gb2YgYSB3ZWIgc2VydmljZQorICAgICAqICAgICAgZW5kcG9pbnQgcHVibGlzaGVkIGJ5IHRoZSBzYW1lIEphdmEgRUUgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyPC9jb2RlPiBpbnN0YW5jZSB3aXRoCisgICAgICogICB0aGUgPGNvZGU+ZW5kcG9pbnROYW1lPC9jb2RlPiBwcm9wZXJ0eSBzZXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBoYXMgbm90CisgICAgICogIGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgZW5kcG9pbnROYW1lKFFOYW1lIGVuZHBvaW50TmFtZSkgeworICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIFczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcidzIHNlcnZpY2VOYW1lIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIHRoZSBlbmRwb2ludE5hbWU6ICIrZW5kcG9pbnROYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZW5kcG9pbnROYW1lID0gZW5kcG9pbnROYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT53c2RsRG9jdW1lbnRMb2NhdGlvbjwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXJnZXRlZAorICAgICAqIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3c2RsRG9jdW1lbnRMb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIFdTREwgZG9jdW1lbnQgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlIHRhcmdldGVkIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI8L2NvZGU+IGluc3RhbmNlIHdpdGgKKyAgICAgKiAgIHRoZSA8Y29kZT53c2RsRG9jdW1lbnRMb2NhdGlvbjwvY29kZT4gcHJvcGVydHkgc2V0LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlciB3c2RsRG9jdW1lbnRMb2NhdGlvbihTdHJpbmcgd3NkbERvY3VtZW50TG9jYXRpb24pIHsKKyAgICAgICAgdGhpcy53c2RsRG9jdW1lbnRMb2NhdGlvbiA9IHdzZGxEb2N1bWVudExvY2F0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSA8Y29kZT5yZWZlcmVuY2VQYXJhbWV0ZXI8L2NvZGU+IHRvIHRoZQorICAgICAqIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBpbnN0YW5jZQorICAgICAqIDxjb2RlPndzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPC9jb2RlPiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJlZmVyZW5jZVBhcmFtZXRlciBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiAgICAgIDxjb2RlPndzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPC9jb2RlPiBlbGVtZW50LgorICAgICAqCisgICAgICogQHJldHVybiBBIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjwvY29kZT4gaW5zdGFuY2Ugd2l0aAorICAgICAqICAgdGhlIDxjb2RlPnJlZmVyZW5jZVBhcmFtZXRlcjwvY29kZT4gYWRkZWQgdG8gdGhlCisgICAgICogICA8Y29kZT53c2E6UmVmZXJlbmNlUGFyYW1ldGVyczwvY29kZT4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5yZWZlcmVuY2VQYXJhbWV0ZXI8L2NvZGU+CisgICAgICogaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlciByZWZlcmVuY2VQYXJhbWV0ZXIoRWxlbWVudCByZWZlcmVuY2VQYXJhbWV0ZXIpIHsKKyAgICAgICAgaWYgKHJlZmVyZW5jZVBhcmFtZXRlciA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSByZWZlcmVuY2VQYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIHJlZmVyZW5jZVBhcmFtZXRlcnMuYWRkKHJlZmVyZW5jZVBhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIDxjb2RlPm1ldGFkYXRhRWxlbWVudDwvY29kZT4gdG8gdGhlCisgICAgICogPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGluc3RhbmNlJ3MKKyAgICAgKiA8Y29kZT53c2E6TWV0YWRhdGE8L2NvZGU+IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0YWRhdGFFbGVtZW50IFRoZSBlbGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqICAgICAgPGNvZGU+d3NhOk1ldGFkYXRhPC9jb2RlPiBlbGVtZW50LgorICAgICAqCisgICAgICogQHJldHVybiBBIDxjb2RlPlczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjwvY29kZT4gaW5zdGFuY2Ugd2l0aAorICAgICAqICAgdGhlIDxjb2RlPm1ldGFkYXRhRWxlbWVudDwvY29kZT4gYWRkZWQgdG8gdGhlCisgICAgICogICAgPGNvZGU+d3NhOk1ldGFkYXRhPC9jb2RlPiBlbGVtZW50LgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPm1ldGFkYXRhRWxlbWVudDwvY29kZT4KKyAgICAgKiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIG1ldGFkYXRhKEVsZW1lbnQgbWV0YWRhdGFFbGVtZW50KSB7CisgICAgICAgIGlmIChtZXRhZGF0YUVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbWV0YWRhdGFFbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICBtZXRhZGF0YS5hZGQobWV0YWRhdGFFbGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGZyb20gdGhlIGFjY3VtdWxhdGVkCisgICAgICogcHJvcGVydGllcyBzZXQgb24gdGhpcyA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI8L2NvZGU+CisgICAgICogaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+CisgICAgICogZm9yIGFueSBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIHRoZSA8Y29kZT5hZGRyZXNzPC9jb2RlPiBwcm9wZXJ0eSBhbG9uZworICAgICAqIHdpdGggYW55IG90aGVyIGRlc2lyZWQgcHJvcGVydGllcy4gIFRoaXMgbWV0aG9kCisgICAgICogY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gZm9yCisgICAgICogYW4gZW5kcG9pbnQgdGhhdCBpcyBwdWJsaXNoZWQgYnkgdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbi4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIDxjb2RlPmFkZHJlc3M8L2NvZGU+IG9mCisgICAgICogYW4gZW5kcG9pbnQgcHVibGlzaGVkIGJ5IHRoZSBzYW1lIEphdmEgRUUgYXBwbGljYXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGJ5IHRoZQorICAgICAqIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBhbmQKKyAgICAgKiA8Y29kZT5lbmRwb2ludE5hbWU8L2NvZGU+IHByb3BlcnRpZXMuICBJZiB0aGUgPGNvZGU+YWRkcmVzczwvY29kZT4gaXMKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBhbmQgdGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBhbmQKKyAgICAgKiA8Y29kZT5lbmRwb2ludE5hbWU8L2NvZGU+CisgICAgICogZG8gbm90IGlkZW50aWZ5IGFuIGVuZHBvaW50IHB1Ymxpc2hlZCBieSB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uLCBhCisgICAgICogPGNvZGU+amF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4gTVVTVCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+IGZyb20gdGhlIGFjY3VtdWxhdGVkCisgICAgICogcHJvcGVydGllcyBzZXQgb24gdGhpcyA8Y29kZT5XM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI8L2NvZGU+CisgICAgICogaW5zdGFuY2UuIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgPHVsPgorICAgICAqICAgICAgICA8bGk+SWYgdGhlIDxjb2RlPmFkZHJlc3M8L2NvZGU+LCA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gYW5kCisgICAgICogICAgICAgICAgICA8Y29kZT5lbmRwb2ludE5hbWU8L2NvZGU+IGFyZSBhbGwgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogICAgICAgIDxsaT5JZiB0aGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IHNlcnZpY2UgaXMgPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZQorICAgICAqICAgICAgICAgICAgPGNvZGU+ZW5kcG9pbnROYW1lPC9jb2RlPiBpcyBOT1QgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogICAgICAgIDxsaT5JZiB0aGUgPGNvZGU+YWRkcmVzczwvY29kZT4gcHJvcGVydHkgaXMgPGNvZGU+bnVsbDwvY29kZT4gYW5kCisgICAgICogICAgICAgICAgICB0aGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGFuZCA8Y29kZT5lbmRwb2ludE5hbWU8L2NvZGU+IGRvIG5vdAorICAgICAqICAgICAgICAgICAgc3BlY2lmeSBhIHZhbGlkIGVuZHBvaW50IHB1Ymxpc2hlZCBieSB0aGUgc2FtZSBKYXZhIEVFCisgICAgICogICAgICAgICAgICBhcHBsaWNhdGlvbi4KKyAgICAgKiAgICAgICAgPGxpPklmIHRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgTk9UIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogICAgICAgICAgICAgYW5kIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzcGVjaWZpZWQgV1NETC4KKyAgICAgKiAgICAgICAgPGxpPklmIHRoZSA8Y29kZT5lbmRwb2ludE5hbWU8L2NvZGU+IHBvcnQgaXMgbm90IDxjb2RlPm51bGw8Y29kZT4gYW5kIGl0CisgICAgICogICAgICAgICAgICAgaXMgbm90IHByZXNlbnQgaW4gPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IHNlcnZpY2UgaW4gdGhlIFdTREwuCisgICAgICogICAgICAgIDxsaT5JZiB0aGUgPGNvZGU+d3NkbERvY3VtZW50TG9jYXRpb248L2NvZGU+IGlzIE5PVCA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgICAgYW5kIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIFdTREwuCisgICAgICogICAgIDwvdWw+CisgICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+VzNDRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFczQ0VuZHBvaW50UmVmZXJlbmNlIGJ1aWxkKCkgeworICAgICAgICByZXR1cm4gUHJvdmlkZXIucHJvdmlkZXIoKS5jcmVhdGVXM0NFbmRwb2ludFJlZmVyZW5jZShhZGRyZXNzLAorICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lLCBlbmRwb2ludE5hbWUsIG1ldGFkYXRhLCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICByZWZlcmVuY2VQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzOworICAgIHByaXZhdGUgTGlzdDxFbGVtZW50PiByZWZlcmVuY2VQYXJhbWV0ZXJzOworICAgIHByaXZhdGUgTGlzdDxFbGVtZW50PiBtZXRhZGF0YTsKKyAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lOworICAgIHByaXZhdGUgUU5hbWUgZW5kcG9pbnROYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHdzZGxEb2N1bWVudExvY2F0aW9uOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgveG1sL3dzL3dzYWRkcmVzc2luZy9wYWNrYWdlLWluZm8uamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy93c2FkZHJlc3NpbmcvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NDg4YwotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy93c2FkZHJlc3NpbmcvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisKK0BqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2U9VzNDRW5kcG9pbnRSZWZlcmVuY2UuTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDMvYWRkcmVzc2luZy93cy1hZGRyLnhzZCIpCitwYWNrYWdlIGphdmF4LnhtbC53cy53c2FkZHJlc3Npbmc7CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvd3NhZGRyZXNzaW5nL3BhY2thZ2UuaHRtbCBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3htbC93cy93c2FkZHJlc3NpbmcvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjQ2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC94bWwvd3Mvd3NhZGRyZXNzaW5nL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI5IEBACis8IS0tCisgQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+Cis8aHRtbD4KKzxib2R5PgorVGhpcyBwYWNrYWdlIGRlZmluZXMgQVBJcyByZWxhdGVkIHRvIFdTLUFkZHJlc3NpbmcuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9EYXRhdHlwZS5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvRGF0YXR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZiNTJlCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvRGF0YXR5cGUuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBvcmcucmVsYXhuZy5kYXRhdHlwZTsKKworLyoqCisgKiBEYXRhdHlwZSBvYmplY3QuCisgKgorICogVGhpcyBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25hbGl0eToKKyAqCisgKiA8b2w+CisgKiAgPGxpPiBmdW5jdGlvbmFsaXR5IHRvIGlkZW50aWZ5IGEgY2xhc3Mgb2YgY2hhcmFjdGVyIHNlcXVlbmNlcy4gVGhpcyBpcworICogICAgICAgZG9uZSB0aHJvdWdoIHRoZSBpc1ZhbGlkIG1ldGhvZC4KKyAqCisgKiAgPGxpPiBmdW5jdGlvbmFsaXR5IHRvIHByb2R1Y2UgYSAidmFsdWUgb2JqZWN0IiBmcm9tIGEgY2hhcmFjdGVyIHNlcXVlbmNlIGFuZAorICogICAgICAgICAgICAgICBjb250ZXh0IGluZm9ybWF0aW9uLgorICoKKyAqICA8bGk+IGZ1bmN0aW9uYWxpdHkgdG8gdGVzdCB0aGUgZXF1YWxpdHkgb2YgdHdvIHZhbHVlIG9iamVjdHMuCisgKiA8L29sPgorICoKKyAqIFRoaXMgaW50ZXJmYWNlIGFsc28gZGVmaW5lcyB0aGUgY3JlYXRlU3RyZWFtaW5nVmFsaWRhdG9yIG1ldGhvZCwKKyAqIHdoaWNoIGlzIGludGVuZGVkIHRvIGVmZmljaWVudGx5IHN1cHBvcnQgdGhlIHZhbGlkYXRpb24gb2YKKyAqIGxhcmdlIGNoYXJhY3RlciBzZXF1ZW5jZXMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ampjQGpjbGFyay5jb20iPkphbWVzIENsYXJrPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSI+S29oc3VrZSBLQVdBR1VDSEk8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YXR5cGUgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCAnbGl0ZXJhbCcgbWF0Y2hlcyB0aGlzIERhdGF0eXBlCisgICAgICAgICAqIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbGl0ZXJhbAorICAgICAgICAgKiAgICAgICAgICAgICAgdGhlIGxleGljYWwgcmVwcmVzZW50YXRpb24gdG8gYmUgY2hlY2tlZC4KKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgICAgICogICAgICAgICAgICAgIElmIHRoaXMgZGF0YXR5cGUgaXMgY29udGV4dC1kZXBlbmRlbnQKKyAgICAgICAgICogICAgICAgICAgICAgIChpLmUuIHRoZSB7QGxpbmsgI2lzQ29udGV4dERlcGVuZGVudH0gbWV0aG9kIHJldHVybnMgdHJ1ZSksCisgICAgICAgICAqICAgICAgICAgICAgICB0aGVuIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgbm9uLW51bGwgdmFsaWQgY29udGV4dCBvYmplY3QuCisgICAgICAgICAqICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBjYWxsZXIgY2FuIHBhc3MgbnVsbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKiAgICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgJ2xpdGVyYWwnIGlzIGEgbWVtYmVyIG9mIHRoaXMgRGF0YXR5cGU7CisgICAgICAgICAqICAgICAgICAgICAgICBmYWxzZSBpZiBpdCdzIG5vdCBhIG1lbWJlciBvZiB0aGlzIERhdGF0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc1ZhbGlkKCBTdHJpbmcgbGl0ZXJhbCwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBpc1ZhbGlkIG1ldGhvZCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aXRoIGRpYWdub3NpcworICAgICAgICAgKiBpbiBjYXNlIG9mIGVycm9ycy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHRoZSBzcGVjaWZpZWQgJ2xpdGVyYWwnIGlzIGEgdmFsaWQgbGV4aWNhbCByZXByZXNlbnRhdGlvbiBmb3IgdGhpcworICAgICAgICAgKiBkYXRhdHlwZSwgdGhlbiB0aGlzIG1ldGhvZCBtdXN0IHJldHVybiB3aXRob3V0IHRocm93aW5nIGFueSBleGNlcHRpb24uCisgICAgICAgICAqIElmIG5vdCwgdGhlIGNhbGxlZSBtdXN0IHRocm93IGFuIGV4Y2VwdGlvbiAod2l0aCBkaWFnbm9zaXMgbWVzc2FnZSwKKyAgICAgICAgICogaWYgcG9zc2libGUuKQorICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlCisgICAgICAgICAqIHRvIHVzZXJzLiBUaGlzIG1ldGhvZCBpcyBrZXB0IHNlcGFyYXRlIGZyb20gdGhlIGlzVmFsaWQgbWV0aG9kIHRvCisgICAgICAgICAqIGFjaGlldmUgaGlnaGVyIHBlcmZvcm1hbmNlIGR1cmluZyBub3JtYWwgdmFsaWRhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBEYXRhdHlwZUV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICAgSWYgdGhlIGdpdmVuIGxpdGVyYWwgaXMgaW52YWxpZCwgdGhlbiB0aGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICAqICAgICAgICAgICAgICBJZiB0aGUgY2FsbGVlIHN1cHBvcnRzIGVycm9yIGRpYWdub3NpcywgdGhlbiB0aGUgZXhjZXB0aW9uIHNob3VsZAorICAgICAgICAgKiAgICAgICAgICAgICAgY29udGFpbiBhIGRpYWdub3NpcyBtZXNzYWdlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjaGVja1ZhbGlkKCBTdHJpbmcgbGl0ZXJhbCwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCApCisgICAgICAgICAgICAgICAgdGhyb3dzIERhdGF0eXBlRXhjZXB0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgc3RyZWFtaW5nIHZhbGlkYXRvciBmb3IgdGhpcyB0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQnkgdXNpbmcgc3RyZWFtaW5nIHZhbGlkYXRvcnMgaW5zdGVhZCBvZiB0aGUgaXNWYWxpZCBtZXRob2QsCisgICAgICAgICAqIHRoZSBjYWxsZXIgY2FuIGF2b2lkIGtlZXBpbmcgdGhlIGVudGlyZSBzdHJpbmcsIHdoaWNoIGlzCisgICAgICAgICAqIHNvbWV0aW1lcyBxdWl0ZSBiaWcsIGluIG1lbW9yeS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgICAgICogICAgICAgICAgICAgIElmIHRoaXMgZGF0YXR5cGUgaXMgY29udGV4dC1kZXBlbmRlbnQKKyAgICAgICAgICogICAgICAgICAgICAgIChpLmUuIHRoZSB7QGxpbmsgI2lzQ29udGV4dERlcGVuZGVudH0gbWV0aG9kIHJldHVybnMgdHJ1ZSksCisgICAgICAgICAqICAgICAgICAgICAgICB0aGVuIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgbm9uLW51bGwgdmFsaWQgY29udGV4dCBvYmplY3QuCisgICAgICAgICAqICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBjYWxsZXIgY2FuIHBhc3MgbnVsbC4KKyAgICAgICAgICogICAgICAgICAgICAgIFRoZSBjYWxsZWUgbWF5IGtlZXAgYSByZWZlcmVuY2UgdG8gdGhpcyBjb250ZXh0IG9iamVjdAorICAgICAgICAgKiAgICAgICAgICAgICAgb25seSB3aGlsZSB0aGUgcmV0dXJuZWQgc3RyZWFtaW5nIHZhbGlkYXRvciBpcyBiZWluZyB1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgRGF0YXR5cGVTdHJlYW1pbmdWYWxpZGF0b3IgY3JlYXRlU3RyZWFtaW5nVmFsaWRhdG9yKCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0ICk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIGxleGNpYWwgdmFsdWUgYW5kIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICogdmFsdWUgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGNhbGxlciBjYW5ub3QgZ2VuZXJhbGx5IGFzc3VtZSB0aGF0IHRoZSB2YWx1ZSBvYmplY3QgaXMKKyAgICAgICAgICogYSBtZWFuaW5nZnVsIEphdmEgb2JqZWN0LiBGb3IgZXhhbXBsZSwgdGhlIGNhbGxlciBjYW5ub3QgZXhwZWN0CisgICAgICAgICAqIHRoaXMgbWV0aG9kIHRvIHJldHVybiA8Y29kZT5qYXZhLmxhbmcuTnVtYmVyPC9jb2RlPiB0eXBlIGZvcgorICAgICAgICAgKiB0aGUgImludGVnZXIiIHR5cGUgb2YgWE1MIFNjaGVtYSBQYXJ0IDIuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBbHNvLCB0aGUgY2FsbGVyIGNhbm5vdCBhc3N1bWUgdGhhdCB0aGUgZXF1YWxzIG1ldGhvZCBhbmQKKyAgICAgICAgICogdGhlIGhhc2hDb2RlIG1ldGhvZCBvZiB0aGUgdmFsdWUgb2JqZWN0IGFyZSBjb25zaXN0ZW50IHdpdGgKKyAgICAgICAgICogdGhlIHNlbWFudGljcyBvZiB0aGUgZGF0YXR5cGUuIEZvciB0aGF0IHB1cnBvc2UsIHRoZSBzYW1lVmFsdWUKKyAgICAgICAgICogbWV0aG9kIGFuZCB0aGUgdmFsdWVIYXNoQ29kZSBtZXRob2QgaGF2ZSB0byBiZSB1c2VkLiBOb3RlIHRoYXQKKyAgICAgICAgICogdGhpcyBtZWFucyB5b3UgY2Fubm90IHVzZSBjbGFzc2VzIGxpa2UKKyAgICAgICAgICogPGNvZGU+amF2YS51dGlsLkhhc2h0YWJsZTwvY29kZT4gdG8gc3RvcmUgdGhlIHZhbHVlIG9iamVjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgb2JqZWN0IHNob3VsZCBiZSB1c2VkIHNvbGVseSBmb3IgdGhlIHNhbWVWYWx1ZQorICAgICAgICAgKiBhbmQgdmFsdWVIYXNoQ29kZSBtZXRob2RzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAgICAgKiAgICAgICAgICAgICAgSWYgdGhpcyBkYXRhdHlwZSBpcyBjb250ZXh0LWRlcGVuZGVudAorICAgICAgICAgKiAgICAgICAgICAgICAgKHdoZW4gdGhlIHtAbGluayAjaXNDb250ZXh0RGVwZW5kZW50fSBtZXRob2QgcmV0dXJucyB0cnVlKSwKKyAgICAgICAgICogICAgICAgICAgICAgIHRoZW4gdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYSBub24tbnVsbCB2YWxpZCBjb250ZXh0IG9iamVjdC4KKyAgICAgICAgICogICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGNhbGxlciBjYW4gcGFzcyBudWxsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgICAgbnVsbAorICAgICAgICAgKiAgICAgICAgICAgICAgd2hlbiB0aGUgZ2l2ZW4gbGV4aWNhbCB2YWx1ZSBpcyBub3QgYSB2YWxpZCBsZXhpY2FsCisgICAgICAgICAqICAgICAgICAgICAgICB2YWx1ZSBmb3IgdGhpcyB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgT2JqZWN0IGNyZWF0ZVZhbHVlKCBTdHJpbmcgbGl0ZXJhbCwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0cyB0aGUgZXF1YWxpdHkgb2YgdHdvIHZhbHVlIG9iamVjdHMgd2hpY2ggd2VyZSBvcmlnaW5hbGx5CisgICAgICAgICAqIGNyZWF0ZWQgYnkgdGhlIGNyZWF0ZVZhbHVlIG1ldGhvZCBvZiB0aGlzIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBvYmplY3RzIG5vdCBjcmVhdGVkIGJ5IHRoaXMgdHlwZQorICAgICAgICAgKiBhcmUgcGFzc2VkLiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQKKyAgICAgICAgICogdmFsdWUgb2JqZWN0cyBiZWxvbmcgdG8gdGhpcyB0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqICAgICAgICAgICAgICB0cnVlIGlmIHR3byB2YWx1ZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGFjY29yZGluZyB0bworICAgICAgICAgKiAgICAgICAgICAgICAgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBkYXRhdHlwZTsgZmFsc2UgaWYgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBzYW1lVmFsdWUoIE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIgKTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIGZvciBhIHZhbHVlIG9iamVjdCwKKyAgICAgICAgICogd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoIHRoZSBzYW1lVmFsdWUgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqICAgICAgICAgICAgICBoYXNoIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgaW50IHZhbHVlSGFzaENvZGUoIE9iamVjdCB2YWx1ZSApOworCisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YXR5cGUgZG9lc24ndCBoYXZlIElEL0lEUkVGIHNlbWFudGljcy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBvbmUgb2YgdGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgb2YgdGhlCisgICAgICAgICAqIHtAbGluayAjZ2V0SWRUeXBlfSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UWVBFX05VTEwgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCBSRUxBWCBORyBjb21wYXRpYmlsaXR5IHByb2Nlc3NvcnMgc2hvdWxkCisgICAgICAgICAqIHRyZWF0IHRoaXMgZGF0YXR5cGUgYXMgaGF2aW5nIElEIHNlbWFudGljcy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBvbmUgb2YgdGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgb2YgdGhlCisgICAgICAgICAqIHtAbGluayAjZ2V0SWRUeXBlfSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UWVBFX0lEID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgUkVMQVggTkcgY29tcGF0aWJpbGl0eSBwcm9jZXNzb3JzIHNob3VsZAorICAgICAgICAgKiB0cmVhdCB0aGlzIGRhdGF0eXBlIGFzIGhhdmluZyBJRFJFRiBzZW1hbnRpY3MuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdmFsdWUgaXMgb25lIG9mIHRoZSBwb3NzaWJsZSByZXR1cm4gdmFsdWVzIG9mIHRoZQorICAgICAgICAgKiB7QGxpbmsgI2dldElkVHlwZX0gbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVFlQRV9JRFJFRiA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IFJFTEFYIE5HIGNvbXBhdGliaWxpdHkgcHJvY2Vzc29ycyBzaG91bGQKKyAgICAgICAgICogdHJlYXQgdGhpcyBkYXRhdHlwZSBhcyBoYXZpbmcgSURSRUZTIHNlbWFudGljcy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBvbmUgb2YgdGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgb2YgdGhlCisgICAgICAgICAqIHtAbGluayAjZ2V0SWRUeXBlfSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UWVBFX0lEUkVGUyA9IDM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB0aGUgSUQvSURSRUYgc2VtYW50aWNzIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICAgICAqIGRhdGF0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgaW50cm9kdWNlZCB0byBzdXBwb3J0IHRoZSBSRUxBWCBORyBEVEQKKyAgICAgICAgICogY29tcGF0aWJpbGl0eSBzcGVjLiAoT2YgY291cnNlIGl0J3MgYWx3YXlzIGZyZWUgdG8gdXNlCisgICAgICAgICAqIHRoaXMgbWV0aG9kIGZvciBvdGhlciBwdXJwb3Nlcy4pCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhIGRhdGF0eXBlIGxpYnJhcnkgYW5kIGhhdmUgbm8gaWRlYSBhYm91dAorICAgICAgICAgKiB0aGUgIlJFTEFYIE5HIERURCBjb21wYXRpYmlsaXR5IiB0aGluZywganVzdCByZXR1cm4KKyAgICAgICAgICogPGNvZGU+SURfVFlQRV9OVUxMPC9jb2RlPiBpcyBmaW5lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqICAgICAgICAgICAgICBJZiB0aGlzIGRhdGF0eXBlIGRvZXNuJ3QgaGF2ZSBhbnkgSUQvSURSRUYgc2VtYW50aWNzLAorICAgICAgICAgKiAgICAgICAgICAgICAgaXQgcmV0dXJucyB7QGxpbmsgI0lEX1RZUEVfTlVMTH0uIElmIGl0IGhhcyBzdWNoIGEgc2VtYW50aWNzCisgICAgICAgICAqICAgICAgICAgICAgICAoZm9yIGV4YW1wbGUsIFhTRDpJRCwgWFNEOklEUkVGIGFuZCBjb21wOklEIHR5cGUpLCB0aGVuCisgICAgICAgICAqICAgICAgICAgICAgICBpdCByZXR1cm5zIHtAbGluayAjSURfVFlQRV9JRH0sIHtAbGluayAjSURfVFlQRV9JRFJFRn0gb3IKKyAgICAgICAgICogICAgICAgICAgICAgIHtAbGluayAjSURfVFlQRV9JRFJFRlN9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJZFR5cGUoKTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyBkYXRhdHlwZSBtYXkgbmVlZCBhIGNvbnRleHQgb2JqZWN0IGZvcgorICAgICAgICAgKiB0aGUgdmFsaWRhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBjYWxsZWUgbXVzdCByZXR1cm4gdHJ1ZSBldmVuIHdoZW4gdGhlIGNvbnRleHQKKyAgICAgICAgICogaXMgbm90IGFsd2F5cyBuZWNlc3NhcnkuIChGb3IgZXhhbXBsZSwgdGhlICJRTmFtZSIgdHlwZQorICAgICAgICAgKiBkb2Vzbid0IG5lZWQgYSBjb250ZXh0IG9iamVjdCB3aGVuIHZhbGlkYXRpbmcgdW5wcmVmaXhlZAorICAgICAgICAgKiBzdHJpbmcuIEJ1dCBub25ldGhlbGVzcyBRTmFtZSBtdXN0IHJldHVybiB0cnVlLikKKyAgICAgICAgICoKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFhTRCdzIDxjb2RlPnN0cmluZzwvY29kZT4gYW5kIDxjb2RlPnNob3J0PC9jb2RlPiB0eXBlcworICAgICAgICAgKiBhcmUgZXhhbXBsZXMgb2YgY29udGV4dC1pbmRlcGVuZGVudCBkYXRhdHlwZXMuCisgICAgICAgICAqIEl0cyA8Y29kZT5RTmFtZTwvY29kZT4gYW5kIDxjb2RlPkVOVElUWTwvY29kZT4gdHlwZXMKKyAgICAgICAgICogYXJlIGV4YW1wbGVzIG9mIGNvbnRleHQtZGVwZW5kZW50IGRhdGF0eXBlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFdoZW4gYSBkYXRhdHlwZSBpcyBjb250ZXh0LWluZGVwZW5kZW50LCB0aGVuCisgICAgICAgICAqIHRoZSB7QGxpbmsgI2lzVmFsaWR9IG1ldGhvZCwgdGhlIHtAbGluayAjY2hlY2tWYWxpZH0gbWV0aG9kLAorICAgICAgICAgKiB0aGUge0BsaW5rICNjcmVhdGVTdHJlYW1pbmdWYWxpZGF0b3J9IG1ldGhvZCBhbmQKKyAgICAgICAgICogdGhlIHtAbGluayAjY3JlYXRlVmFsdWV9IG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGhvdXQKKyAgICAgICAgICogcHJvdmlkaW5nIGEgY29udGV4dCBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICogICAgICAgICAgICAgIDxiPnRydWU8L2I+IGlmIHRoaXMgZGF0YXR5cGUgaXMgY29udGV4dC1kZXBlbmRlbnQKKyAgICAgICAgICogICAgICAgICAgICAgIChpdCBuZWVkcyBhIGNvbnRleHQgb2JqZWN0IHNvbWV0aW1lcyk7CisgICAgICAgICAqCisgICAgICAgICAqICAgICAgICAgICAgICA8Yj5mYWxzZTwvYj4gaWYgdGhpcyBkYXRhdHlwZSBpcyBjb250ZXh0LTxiPmluPC9iPmRlcGVuZGVudAorICAgICAgICAgKiAgICAgICAgICAgICAgKGl0IG5ldmVyIG5lZWRzIGEgY29udGV4dCBvYmplY3QpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb250ZXh0RGVwZW5kZW50KCk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9EYXRhdHlwZUJ1aWxkZXIuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9yZWxheG5nL2RhdGF0eXBlL0RhdGF0eXBlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZDFiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9EYXRhdHlwZUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIG9yZy5yZWxheG5nLmRhdGF0eXBlOworCisvKioKKyAqIENyZWF0ZXMgYSB1c2VyLWRlZmluZWQgdHlwZSBieSBhZGRpbmcgcGFyYW1ldGVycyB0bworICogdGhlIHByZS1kZWZpbmVkIHR5cGUuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ampjQGpjbGFyay5jb20iPkphbWVzIENsYXJrPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSI+S29oc3VrZSBLQVdBR1VDSEk8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YXR5cGVCdWlsZGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIG5ldyBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIGFkZGVkLgorICAgICAgICAgKiBAcGFyYW0gc3RyVmFsdWUKKyAgICAgICAgICogICAgICAgICAgICAgIFRoZSByYXcgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4gQ2FsbGVyIG1heSBub3Qgbm9ybWFsaXplCisgICAgICAgICAqICAgICAgICAgICAgICB0aGlzIHZhbHVlIGJlY2F1c2UgYW55IHdoaXRlIHNwYWNlIGlzIHBvdGVudGlhbGx5IHNpZ25pZmljYW50LgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAgICAgKiAgICAgICAgICAgICAgVGhlIGNvbnRleHQgaW5mb3JtYXRpb24gd2hpY2ggY2FuIGJlIHVzZWQgYnkgdGhlIGNhbGxlZSB0bworICAgICAgICAgKiAgICAgICAgICAgICAgYWNxdWlyZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiBUaGlzIGNvbnRleHQgb2JqZWN0IGlzCisgICAgICAgICAqICAgICAgICAgICAgICB2YWxpZCBvbmx5IGR1cmluZyB0aGlzIG1ldGhvZCBjYWxsLiBUaGUgY2FsbGVlIG1heSBub3QKKyAgICAgICAgICogICAgICAgICAgICAgIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCisgICAgICAgICAqIEBleGNlcHRpb24gICBEYXRhdHlwZUV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICAgV2hlbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyIGlzIGluYXBwcm9wcmlhdGUgZm9yIHNvbWUgcmVhc29uLgorICAgICAgICAgKiAgICAgICAgICAgICAgVGhlIGNhbGxlZSBpcyByZXNwb25zaWJsZSB0byByZWNvdmVyIGZyb20gdGhpcyBlcnJvci4KKyAgICAgICAgICogICAgICAgICAgICAgIFRoYXQgaXMsIHRoZSBvYmplY3Qgc2hvdWxkIGJlaGF2ZSBhcyBpZiBubyBzdWNoIGVycm9yCisgICAgICAgICAqICAgICAgICAgICAgICB3YXMgb2NjdXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkUGFyYW1ldGVyKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN0clZhbHVlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0ICkKKyAgICAgICAgICAgICAgICB0aHJvd3MgRGF0YXR5cGVFeGNlcHRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlcml2ZXMgYSBuZXcgRGF0YXR5cGUgZnJvbSBhIERhdGF0eXBlIGJ5IHBhcmFtZXRlcnMgdGhhdAorICAgICAgICAgKiB3ZXJlIGFscmVhZHkgc2V0IHRocm91Z2ggdGhlIGFkZFBhcmFtZXRlciBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gRGF0YXR5cGVFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgIERhdGF0eXBlRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGlmIHRoZSBkZXJpdmF0aW9uIGlzCisgICAgICAgICAqICAgICAgICAgICAgICBzb21laG93IGludmFsaWQuIEZvciBleGFtcGxlLCBhIHJlcXVpcmVkIHBhcmFtZXRlciBpcyBtaXNzaW5nLAorICAgICAgICAgKiAgICAgICAgICAgICAgZXRjLiBUaGUgZXhjZXB0aW9uIHNob3VsZCBjb250YWluIGEgZGlhZ25vc2lzIG1lc3NhZ2UKKyAgICAgICAgICogICAgICAgICAgICAgIGlmIHBvc3NpYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgRGF0YXR5cGUgY3JlYXRlRGF0YXR5cGUoKSB0aHJvd3MgRGF0YXR5cGVFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9EYXRhdHlwZUV4Y2VwdGlvbi5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvRGF0YXR5cGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTAxMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvRGF0YXR5cGVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIG9yZy5yZWxheG5nLmRhdGF0eXBlOworCisvKioKKyAqIFNpZ25hbHMgRGF0YXR5cGUgcmVsYXRlZCBleGNlcHRpb25zLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpqY0BqY2xhcmsuY29tIj5KYW1lcyBDbGFyazwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20iPktvaHN1a2UgS0FXQUdVQ0hJPC9hPgorICovCitwdWJsaWMgY2xhc3MgRGF0YXR5cGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBEYXRhdHlwZUV4Y2VwdGlvbiggaW50IGluZGV4LCBTdHJpbmcgbXNnICkgeworICAgICAgICAgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBEYXRhdHlwZUV4Y2VwdGlvbiggU3RyaW5nIG1zZyApIHsKKyAgICAgICAgICAgICAgICB0aGlzKFVOS05PV04sbXNnKTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogQSBjb25zdHJ1Y3RvciBmb3IgdGhvc2UgZGF0YXR5cGUgbGlicmFyaWVzIHdoaWNoIGRvbid0IHN1cHBvcnQgYW55CisgICAgICAgICAqIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYXQgYWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERhdGF0eXBlRXhjZXB0aW9uKCkgeworICAgICAgICAgICAgICAgIHRoaXMoVU5LTk9XTixudWxsKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IC0xOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgY29udGVudCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KKyAgICAgICAgICogVU5LTk9XTiBjYW4gYmUgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBpbmRleCBpbmZvcm1hdGlvbgorICAgICAgICAgKiBpcyBhdmFpbGFibGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvRGF0YXR5cGVMaWJyYXJ5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9EYXRhdHlwZUxpYnJhcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2I4MWNiCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvRGF0YXR5cGVMaWJyYXJ5LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBvcmcucmVsYXhuZy5kYXRhdHlwZTsKKworLyoqCisgKiBBIERhdGF0eXBlIGxpYnJhcnkKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqamNAamNsYXJrLmNvbSI+SmFtZXMgQ2xhcms8L2E+CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb2hzdWtlLmthd2FndWNoaUBzdW4uY29tIj5Lb2hzdWtlIEtBV0FHVUNISTwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhdHlwZUxpYnJhcnkgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIERhdGF0eXBlQnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGNhbGxlZSBzaG91bGQgdGhyb3cgYSBEYXRhdHlwZUV4Y2VwdGlvbiBpbiBjYXNlIG9mIGFuIGVycm9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYmFzZVR5cGVMb2NhbE5hbWUKKyAgICAgICAgICogICAgICAgICAgICAgIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBiYXNlIHR5cGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICogICAgICAgICAgICAgIEEgbm9uLW51bGwgdmFsaWQgZGF0YXR5cGUgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgRGF0YXR5cGVCdWlsZGVyIGNyZWF0ZURhdGF0eXBlQnVpbGRlciggU3RyaW5nIGJhc2VUeXBlTG9jYWxOYW1lICkKKyAgICAgICAgICAgICAgICB0aHJvd3MgRGF0YXR5cGVFeGNlcHRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgb3IgY3JlYXRlcyBhIHByZS1kZWZpbmVkIHR5cGUuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgaXMganVzdCBhIHNob3J0LWN1dCBvZgorICAgICAgICAgKiA8Y29kZT5jcmVhdGVEYXRhdHlwZUJ1aWxkZXIodHlwZUxvY2FsTmFtZSkuY3JlYXRlRGF0YXR5cGUoKTs8L2NvZGU+CisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBjYWxsZWUgc2hvdWxkIHRocm93IGEgRGF0YXR5cGVFeGNlcHRpb24gaW4gY2FzZSBvZiBhbiBlcnJvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKiAgICAgICAgICAgICAgQSBub24tbnVsbCB2YWxpZCBkYXRhdHlwZSBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBEYXRhdHlwZSBjcmVhdGVEYXRhdHlwZSggU3RyaW5nIHR5cGVMb2NhbE5hbWUgKSB0aHJvd3MgRGF0YXR5cGVFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9EYXRhdHlwZUxpYnJhcnlGYWN0b3J5LmphdmEgYi9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9EYXRhdHlwZUxpYnJhcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzNmUwMAotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9yZWxheG5nL2RhdGF0eXBlL0RhdGF0eXBlTGlicmFyeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIG9yZy5yZWxheG5nLmRhdGF0eXBlOworCisvKioKKyAqIEZhY3RvcnkgY2xhc3MgZm9yIHRoZSBEYXRhdHlwZUxpYnJhcnkgY2xhc3MuCisgKgorICogPHA+CisgKiBUaGUgZGF0YXR5cGUgbGlicmFyeSBzaG91bGQgcHJvdmlkZSB0aGUgaW1wbGVtZW50YXRpb24gb2YKKyAqIHRoaXMgaW50ZXJmYWNlIGlmIGl0IHdhbnRzIHRvIGJlIGZvdW5kIGJ5IHRoZSBzY2hlbWEgcHJvY2Vzc29ycy4KKyAqIFRoZSBpbXBsZW1lbnRvciBhbHNvIGhhdmUgdG8gcGxhY2UgYSBmaWxlIGluIHlvdXIgamFyIGZpbGUuCisgKiBTZWUgdGhlIHJlZmVyZW5jZSBkYXRhdHlwZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIGZvciBkZXRhaWwuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ampjQGpjbGFyay5jb20iPkphbWVzIENsYXJrPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSI+S29oc3VrZSBLQVdBR1VDSEk8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YXR5cGVMaWJyYXJ5RmFjdG9yeQoreworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIERhdGF0eXBlTGlicmFyeSB0aGF0IHN1cHBvcnRzCisgICAgICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIFVSSS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKiAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UgVVJJIGlzIG5vdAorICAgICAgICAgKiAgICAgICAgICAgICAgc3VwcG9ydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgRGF0YXR5cGVMaWJyYXJ5IGNyZWF0ZURhdGF0eXBlTGlicmFyeSggU3RyaW5nIG5hbWVzcGFjZVVSSSApOworfQpkaWZmIC0tZ2l0IGEvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvRGF0YXR5cGVTdHJlYW1pbmdWYWxpZGF0b3IuamF2YSBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9yZWxheG5nL2RhdGF0eXBlL0RhdGF0eXBlU3RyZWFtaW5nVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNzlkNQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9yZWxheG5nL2RhdGF0eXBlL0RhdGF0eXBlU3RyZWFtaW5nVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBvcmcucmVsYXhuZy5kYXRhdHlwZTsKKworLyoqCisgKiBEYXRhdHlwZSBzdHJlYW1pbmcgdmFsaWRhdG9yLgorICoKKyAqIDxwPgorICogVGhlIHN0cmVhbWluZyB2YWxpZGF0b3IgaXMgYW4gb3B0aW9uYWwgZmVhdHVyZSB0aGF0IGlzIHVzZWZ1bCBmb3IKKyAqIGNlcnRhaW4gRGF0YXR5cGVzLiBJdCBhbGxvd3MgdGhlIGNhbGxlciB0byBpbmNyZW1lbnRhbGx5IHByb3ZpZGUKKyAqIHRoZSBsaXRlcmFsLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpqY0BqY2xhcmsuY29tIj5KYW1lcyBDbGFyazwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvaHN1a2Uua2F3YWd1Y2hpQHN1bi5jb20iPktvaHN1a2UgS0FXQUdVQ0hJPC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGF0eXBlU3RyZWFtaW5nVmFsaWRhdG9yIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGFzc2VzIGFuIGFkZGl0aW9uYWwgZnJhZ21lbnQgb2YgdGhlIGxpdGVyYWwuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgYXBwbGljYXRpb24gY2FuIGNhbGwgdGhpcyBtZXRob2Qgc2V2ZXJhbCB0aW1lcywgdGhlbiBjYWxsCisgICAgICAgICAqIHRoZSBpc1ZhbGlkIG1ldGhvZCAob3IgdGhlIGNoZWNrVmFsaWQgbWV0aG9kKSB0byBjaGVjayB0aGUgdmFsaWRpdHkKKyAgICAgICAgICogb2YgdGhlIGFjY3VtdWxhdGVkIGNoYXJhY3RlcnMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGFkZENoYXJhY3RlcnMoIGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGxlbiApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZWxscyBpZiB0aGUgYWNjdW11bGF0ZWQgbGl0ZXJhbCBpcyB2YWxpZCB3aXRoIHJlc3BlY3QgdG8KKyAgICAgICAgICogdGhlIHVuZGVybHlpbmcgRGF0YXR5cGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICogICAgICAgICAgICAgIFRydWUgaWYgaXQgaXMgdmFsaWQuIEZhbHNlIGlmIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaXNWYWxpZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBpc1ZhbGlkIG1ldGhvZCwgYnV0IHRoaXMgbWV0aG9kIHRocm93cworICAgICAgICAgKiBFeGNlcHRpb24gKHdpdGggcG9zc2libHkgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiksIGluc3RlYWQgb2YKKyAgICAgICAgICogcmV0dXJuaW5nIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIERhdGF0eXBlRXhjZXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgICBJZiB0aGUgY2FsbGVlIHN1cHBvcnRzIHRoZSBkaWFnbm9zaXMgYW5kIHRoZSBhY2N1bXVsYXRlZAorICAgICAgICAgKiAgICAgICAgICAgICAgbGl0ZXJhbCBpcyBpbnZhbGlkLCB0aGVuIHRoaXMgZXhjZXB0aW9uIHRoYXQgcG9zc2libHkKKyAgICAgICAgICogICAgICAgICAgICAgIGNvbnRhaW5zIGRpYWdub3NpcyBpbmZvcm1hdGlvbiBpcyB0aHJvd24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrVmFsaWQoKSB0aHJvd3MgRGF0YXR5cGVFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9WYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvVmFsaWRhdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYyZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvVmFsaWRhdGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIG9yZy5yZWxheG5nLmRhdGF0eXBlOworCisvKioKKyAqIEFuIGludGVyZmFjZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY2FsbGVyIHRvCisgKiBwcm92aWRlIGNvbnRleHQgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWNlc3NhcnkgdG8KKyAqIHBlcmZvcm0gdmFsaWRhdGlvbiBvZiBzb21lIERhdGF0eXBlcy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqamNAamNsYXJrLmNvbSI+SmFtZXMgQ2xhcms8L2E+CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb2hzdWtlLmthd2FndWNoaUBzdW4uY29tIj5Lb2hzdWtlIEtBV0FHVUNISTwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uQ29udGV4dCB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc29sdmVzIGEgbmFtZXNwYWNlIHByZWZpeCB0byB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgVVJJLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciB2YWxpZGF0aW5nIHRoZSBRTmFtZSB0eXBlLCBmb3IgZXhhbXBsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHRoZSBwcmVmaXggaXMgIiIgKGVtcHR5IHN0cmluZyksIGl0IGluZGljYXRlcworICAgICAgICAgKiBhbiB1bnByZWZpeGVkIHZhbHVlLiBUaGUgY2FsbGVlCisgICAgICAgICAqIHNob3VsZCByZXNvbHZlIGl0IGFzIGZvciBhbiB1bnByZWZpeGVkCisgICAgICAgICAqIGVsZW1lbnQsIHJhdGhlciB0aGFuIGZvciBhbiB1bnByZWZpeGVkIGF0dHJpYnV0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHRoZSBwcmVmaXggaXMgInhtbCIsIHRoZW4gdGhlIGNhbGxlZSBtdXN0IHJlc29sdmUKKyAgICAgICAgICogdGhpcyBwcmVmaXggaW50byAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKKyAgICAgICAgICogYXMgZGVmaW5lZCBpbiB0aGUgWE1MIE5hbWVzcGFjZXMgUmVjb21tZW5kYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICogICAgICAgICAgICAgIG5hbWVzcGFjZSBVUkkgb2YgdGhpcyBwcmVmaXguCisgICAgICAgICAqICAgICAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIHByZWZpeCBpcyBub3QgZGVjbGFyZWQsCisgICAgICAgICAqICAgICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCByZXR1cm4gbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyByZXNvbHZlTmFtZXNwYWNlUHJlZml4KCBTdHJpbmcgcHJlZml4ICk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGJhc2UgVVJJIG9mIHRoZSBjb250ZXh0LiAgVGhlIG51bGwgc3RyaW5nIG1heSBiZSByZXR1cm5lZAorICAgICAgICAgKiBpZiBubyBiYXNlIFVSSSBpcyBrbm93bi4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBnZXRCYXNlVXJpKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBhbiB1bnBhcnNlZCBlbnRpdHkgaXMgZGVjbGFyZWQgd2l0aCB0aGUKKyAgICAgICAgICogc3BlY2lmaWVkIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICogIHRydWUKKyAgICAgICAgICogICAgICAgICAgICAgIGlmIHRoZSBEVEQgaGFzIGFuIHVucGFyc2VkIGVudGl0eSBkZWNsYXJhdGlvbiBmb3IKKyAgICAgICAgICogICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgICAgICogIGZhbHNlCisgICAgICAgICAqICAgICAgICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGlzVW5wYXJzZWRFbnRpdHkoIFN0cmluZyBlbnRpdHlOYW1lICk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBhIG5vdGF0aW9uIGlzIGRlY2xhcmVkIHdpdGggdGhlCisgICAgICAgICAqIHNwZWNpZmllZCBuYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqICB0cnVlCisgICAgICAgICAqICAgICAgICAgICAgICBpZiB0aGUgRFREIGhhcyBhIG5vdGF0aW9uIGRlY2xhcmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICAgICAqICBmYWxzZQorICAgICAgICAgKiAgICAgICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc05vdGF0aW9uKCBTdHJpbmcgbm90YXRpb25OYW1lICk7Cit9CmRpZmYgLS1naXQgYS9qYXh3cy9zcmMvc2hhcmUvY2xhc3Nlcy9vcmcvcmVsYXhuZy9kYXRhdHlwZS9oZWxwZXJzL0RhdGF0eXBlTGlicmFyeUxvYWRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvaGVscGVycy9EYXRhdHlwZUxpYnJhcnlMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA5MWIwCi0tLSAvZGV2L251bGwKKysrIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvaGVscGVycy9EYXRhdHlwZUxpYnJhcnlMb2FkZXIuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkIG5vcgorICogICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLnJlbGF4bmcuZGF0YXR5cGUuaGVscGVyczsKKworaW1wb3J0IG9yZy5yZWxheG5nLmRhdGF0eXBlLkRhdGF0eXBlTGlicmFyeUZhY3Rvcnk7CitpbXBvcnQgb3JnLnJlbGF4bmcuZGF0YXR5cGUuRGF0YXR5cGVMaWJyYXJ5OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBEaXNjb3ZlcnMgdGhlIGRhdGF0eXBlIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgY2xhc3NwYXRoLgorICoKKyAqIDxwPgorICogVGhlIGNhbGwgb2YgdGhlIGNyZWF0ZURhdGF0eXBlTGlicmFyeSBtZXRob2QgZmluZHMgYW4gaW1wbGVtZW50YXRpb24KKyAqIGZyb20gYSBnaXZlbiBkYXRhdHlwZSBsaWJyYXJ5IFVSSSBhdCBydW4tdGltZS4KKyAqLworcHVibGljIGNsYXNzIERhdGF0eXBlTGlicmFyeUxvYWRlciBpbXBsZW1lbnRzIERhdGF0eXBlTGlicmFyeUZhY3RvcnkgeworICBwcml2YXRlIGZpbmFsIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlKERhdGF0eXBlTGlicmFyeUZhY3RvcnkuY2xhc3MpOworCisgIHB1YmxpYyBEYXRhdHlwZUxpYnJhcnkgY3JlYXRlRGF0YXR5cGVMaWJyYXJ5KFN0cmluZyB1cmkpIHsKKyAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBzZXJ2aWNlLmdldFByb3ZpZGVycygpOworICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgIERhdGF0eXBlTGlicmFyeUZhY3RvcnkgZmFjdG9yeQorICAgICAgICA9IChEYXRhdHlwZUxpYnJhcnlGYWN0b3J5KWUubmV4dEVsZW1lbnQoKTsKKyAgICAgIERhdGF0eXBlTGlicmFyeSBsaWJyYXJ5ID0gZmFjdG9yeS5jcmVhdGVEYXRhdHlwZUxpYnJhcnkodXJpKTsKKyAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpCisgICAgICAgIHJldHVybiBsaWJyYXJ5OworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcnZpY2UgeworICAgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3Mgc2VydmljZUNsYXNzOworICAgICAgICAgIHByaXZhdGUgZmluYWwgRW51bWVyYXRpb24gY29uZmlnRmlsZXM7CisgICAgICAgICAgcHJpdmF0ZSBFbnVtZXJhdGlvbiBjbGFzc05hbWVzID0gbnVsbDsKKyAgICAgICAgICBwcml2YXRlIGZpbmFsIFZlY3RvciBwcm92aWRlcnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgcHJpdmF0ZSBMb2FkZXIgbG9hZGVyOworCisgICAgICAgICAgcHJpdmF0ZSBjbGFzcyBQcm92aWRlckVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24geworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbmV4dEluZGV4ID0gMDsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4IDwgcHJvdmlkZXJzLnNpemUoKSB8fCBtb3JlUHJvdmlkZXJzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5lbGVtZW50QXQobmV4dEluZGV4KyspOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW5nbGV0b24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CisgICAgICAgICAgICBwcml2YXRlIE9iamVjdCBvYmo7CisgICAgICAgICAgICBwcml2YXRlIFNpbmdsZXRvbihPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAgIHRoaXMub2JqID0gb2JqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CisgICAgICAgICAgICAgIHJldHVybiBvYmogIT0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgIE9iamVjdCB0ZW0gPSBvYmo7CisgICAgICAgICAgICAgIG9iaiA9IG51bGw7CisgICAgICAgICAgICAgIHJldHVybiB0ZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gSkRLIDEuMQorICAgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvYWRlciB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBnZXRSZXNvdXJjZXMoU3RyaW5nIHJlc05hbWUpIHsKKyAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBMb2FkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgVVJMIHVybDsKKyAgICAgICAgICAgICAgaWYgKGNsID09IG51bGwpCisgICAgICAgICAgICAgICAgdXJsID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UocmVzTmFtZSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1cmwgPSBjbC5nZXRSZXNvdXJjZShyZXNOYW1lKTsKKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b24odXJsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEpESyAxLjIrCisgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9hZGVyMiBleHRlbmRzIExvYWRlciB7CisgICAgICAgICAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsOworCisgICAgICAgICAgICBMb2FkZXIyKCkgeworICAgICAgICAgICAgICBjbCA9IExvYWRlcjIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlciBoYXMgdGhlIGNsYXNzIGxvYWRlcgorICAgICAgICAgICAgICAvLyBvZiB0aGlzIGNsYXNzIGFzIGFuIGFuY2VzdG9yLCB1c2UgdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzCisgICAgICAgICAgICAgIC8vIGxvYWRlci4gIE90aGVyd2lzZSwgdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlcgorICAgICAgICAgICAgICAvLyBwcm9iYWJseSBoYXNuJ3QgYmVlbiBzZXQgdXAgcHJvcGVybHksIHNvIGRvbid0IHVzZSBpdC4KKyAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2x0ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgZm9yIChDbGFzc0xvYWRlciB0ZW0gPSBjbHQ7IHRlbSAhPSBudWxsOyB0ZW0gPSB0ZW0uZ2V0UGFyZW50KCkpCisgICAgICAgICAgICAgICAgaWYgKHRlbSA9PSBjbCkgeworICAgICAgICAgICAgICAgICAgY2wgPSBjbHQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGdldFJlc291cmNlcyhTdHJpbmcgcmVzTmFtZSkgeworICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2wuZ2V0UmVzb3VyY2VzKHJlc05hbWUpOworCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZXRvbihudWxsKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgdHJ1ZSwgY2wpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHB1YmxpYyBTZXJ2aWNlKENsYXNzIGNscykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgbG9hZGVyID0gbmV3IExvYWRlcjIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlKSB7CisgICAgICAgICAgICAgIGxvYWRlciA9IG5ldyBMb2FkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZpY2VDbGFzcyA9IGNsczsKKyAgICAgICAgICAgIFN0cmluZyByZXNOYW1lID0gIk1FVEEtSU5GL3NlcnZpY2VzLyIgKyBzZXJ2aWNlQ2xhc3MuZ2V0TmFtZSgpOworICAgICAgICAgICAgY29uZmlnRmlsZXMgPSBsb2FkZXIuZ2V0UmVzb3VyY2VzKHJlc05hbWUpOworICAgICAgICAgIH0KKworICAgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQcm92aWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByb3ZpZGVyRW51bWVyYXRpb24oKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzeW5jaHJvbml6ZWQgcHJpdmF0ZSBib29sZWFuIG1vcmVQcm92aWRlcnMoKSB7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgIHdoaWxlIChjbGFzc05hbWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ0ZpbGVzLmhhc01vcmVFbGVtZW50cygpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMgPSBwYXJzZUNvbmZpZ0ZpbGUoKFVSTCljb25maWdGaWxlcy5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB3aGlsZSAoY2xhc3NOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWNsYXNzTmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gbG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGNscy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VDbGFzcy5pc0luc3RhbmNlKG9iaikpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmFkZEVsZW1lbnQob2JqKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgeyB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2xhc3NOYW1lcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUID0gMDsKKyAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5fTkFNRSA9IDE7CisgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOX0NPTU1FTlQgPSAyOworCisgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRW51bWVyYXRpb24gcGFyc2VDb25maWdGaWxlKFVSTCB1cmwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgICAgUmVhZGVyIHI7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgIlVURi04Iik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEY4Iik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyKTsKKyAgICAgICAgICAgICAgVmVjdG9yIHRva2VucyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHRva2VuQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBTVEFSVDsKKyAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGludCBuID0gci5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpbjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFSVDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTl9DT01NRU5UOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBJTl9DT01NRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fTkFNRTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5CdWYuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0b2tlbkJ1Zi5sZW5ndGgoKSAhPSAwICYmIHN0YXRlICE9IElOX05BTUUpIHsKKyAgICAgICAgICAgICAgICAgIHRva2Vucy5hZGRFbGVtZW50KHRva2VuQnVmLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgdG9rZW5CdWYuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAodG9rZW5CdWYubGVuZ3RoKCkgIT0gMCkKKyAgICAgICAgICAgICAgICB0b2tlbnMuYWRkRWxlbWVudCh0b2tlbkJ1Zi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucy5lbGVtZW50cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9yZWxheG5nL2RhdGF0eXBlL2hlbHBlcnMvUGFyYW1ldGVybGVzc0RhdGF0eXBlQnVpbGRlci5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvaGVscGVycy9QYXJhbWV0ZXJsZXNzRGF0YXR5cGVCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5NDI3MQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9yZWxheG5nL2RhdGF0eXBlL2hlbHBlcnMvUGFyYW1ldGVybGVzc0RhdGF0eXBlQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugb3JnLnJlbGF4bmcuZGF0YXR5cGUuaGVscGVyczsKKworaW1wb3J0IG9yZy5yZWxheG5nLmRhdGF0eXBlLio7CisKKy8qKgorICogRHVtbXkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIERhdGF0eXBlQnVpbGRlcn0uCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBmb3IgRGF0YXR5cGVzIHdoaWNoIGhhdmUgbm8gcGFyYW1ldGVycy4KKyAqIEFueSBhdHRlbXB0IHRvIGFkZCBwYXJhbWV0ZXJzIHdpbGwgYmUgcmVqZWN0ZWQuCisgKgorICogPHA+CisgKiBUeXBpY2FsIHVzYWdlIHdvdWxkIGJlOgorICogPFBSRT48WE1QPgorICogY2xhc3MgTXlEYXRhdHlwZUxpYnJhcnkgaW1wbGVtZW50cyBEYXRhdHlwZUxpYnJhcnkgeworICogICAgIC4uLi4KKyAqICAgICBEYXRhdHlwZUJ1aWxkZXIgY3JlYXRlRGF0YXR5cGVCdWlsZGVyKCBTdHJpbmcgdHlwZU5hbWUgKSB7CisgKiAgICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVybGVlc3NEYXRhdHlwZUJ1aWxkZXIoY3JlYXRlRGF0YXR5cGUodHlwZU5hbWUpKTsKKyAqICAgICB9CisgKiAgICAgLi4uLgorICogfQorICogPC9YTVA+PC9QUkU+CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29oc3VrZS5rYXdhZ3VjaGlAc3VuLmNvbSI+S29oc3VrZSBLQVdBR1VDSEk8L2E+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXJsZXNzRGF0YXR5cGVCdWlsZGVyIGltcGxlbWVudHMgRGF0YXR5cGVCdWlsZGVyIHsKKworICAgICAgICAvKiogVGhpcyB0eXBlIG9iamVjdCBpcyByZXR1cm5lZCBmb3IgdGhlIGRlcml2ZSBtZXRob2QuICovCisgICAgICAgIHByaXZhdGUgZmluYWwgRGF0YXR5cGUgYmFzZVR5cGU7CisKKyAgICAgICAgcHVibGljIFBhcmFtZXRlcmxlc3NEYXRhdHlwZUJ1aWxkZXIoIERhdGF0eXBlIGJhc2VUeXBlICkgeworICAgICAgICAgICAgICAgIHRoaXMuYmFzZVR5cGUgPSBiYXNlVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlciggU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJWYWx1ZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCApCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGF0YXR5cGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhdHlwZUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERhdGF0eXBlIGNyZWF0ZURhdGF0eXBlKCkgdGhyb3dzIERhdGF0eXBlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVR5cGU7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9yZWxheG5nL2RhdGF0eXBlL2hlbHBlcnMvU3RyZWFtaW5nVmFsaWRhdG9ySW1wbC5qYXZhIGIvamF4d3Mvc3JjL3NoYXJlL2NsYXNzZXMvb3JnL3JlbGF4bmcvZGF0YXR5cGUvaGVscGVycy9TdHJlYW1pbmdWYWxpZGF0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxNGYyYQotLS0gL2Rldi9udWxsCisrKyBiL2pheHdzL3NyYy9zaGFyZS9jbGFzc2VzL29yZy9yZWxheG5nL2RhdGF0eXBlL2hlbHBlcnMvU3RyZWFtaW5nVmFsaWRhdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugb3JnLnJlbGF4bmcuZGF0YXR5cGUuaGVscGVyczsKKworaW1wb3J0IG9yZy5yZWxheG5nLmRhdGF0eXBlLio7CisKKy8qKgorICogRHVtbXkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIERhdGF0eXBlU3RyZWFtaW5nVmFsaWRhdG9yfS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIHVzZWQgYXMgYSBxdWljayBoYWNrIHdoZW4gdGhlIHBlcmZvcm1hbmNlCisgKiBvZiBzdHJlYW1pbmcgdmFsaWRhdGlvbiBpcyBub3QgaW1wb3J0YW50LiBBbmQgdGhpcyBpbXBsZW1lbnRhdGlvbgorICogYWxzbyBzaG93cyB5b3UgaG93IHRvIGltcGxlbWVudCB0aGUgRGF0YXR5cGVTdHJlYW1pbmdWYWxpZGF0b3IgaW50ZXJmYWNlLgorICoKKyAqIDxwPgorICogVHlwaWNhbCB1c2FnZSB3b3VsZCBiZToKKyAqIDxQUkU+PFhNUD4KKyAqIGNsYXNzIE15RGF0YXR5cGUgaW1wbGVtZW50cyBEYXRhdHlwZSB7CisgKiAgICAgLi4uLgorICogICAgIHB1YmxpYyBEYXRhdHlwZVN0cmVhbWluZ1ZhbGlkYXRvciBjcmVhdGVTdHJlYW1pbmdWYWxpZGF0b3IoIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQgKSB7CisgKiAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtaW5nVmFsaWRhdG9ySW1wbCh0aGlzLGNvbnRleHQpOworICogICAgIH0KKyAqICAgICAuLi4uCisgKiB9CisgKiA8L1hNUD48L1BSRT4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb2hzdWtlLmthd2FndWNoaUBzdW4uY29tIj5Lb2hzdWtlIEtBV0FHVUNISTwvYT4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN0cmVhbWluZ1ZhbGlkYXRvckltcGwgaW1wbGVtZW50cyBEYXRhdHlwZVN0cmVhbWluZ1ZhbGlkYXRvciB7CisKKyAgICAgICAgLyoqIFRoaXMgYnVmZmVyIGFjY3VtdWxhdGVzIGNoYXJhY3RlcnMuICovCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAvKiogRGF0YXR5cGUgb2JlamN0IHRoYXQgY3JlYXRlcyB0aGlzIHN0cmVhbWluZyB2YWxpZGF0b3IuICovCisgICAgICAgIHByaXZhdGUgZmluYWwgRGF0YXR5cGUgYmFzZVR5cGU7CisKKyAgICAgICAgLyoqIFRoZSBjdXJyZW50IGNvbnRleHQuICovCisgICAgICAgIHByaXZhdGUgZmluYWwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dDsKKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRDaGFyYWN0ZXJzKCBjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBsZW4gKSB7CisgICAgICAgICAgICAgICAgLy8gYXBwZW5kIGNoYXJhY3RlcnMgdG8gdGhlIGN1cnJlbnQgYnVmZmVyLgorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYnVmLHN0YXJ0LGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBiYXNlVHlwZS5pc1ZhbGlkKGJ1ZmZlci50b1N0cmluZygpLGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2hlY2tWYWxpZCgpIHRocm93cyBEYXRhdHlwZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgYmFzZVR5cGUuY2hlY2tWYWxpZChidWZmZXIudG9TdHJpbmcoKSxjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJlYW1pbmdWYWxpZGF0b3JJbXBsKCBEYXRhdHlwZSBiYXNlVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCApIHsKKyAgICAgICAgICAgICAgICB0aGlzLmJhc2VUeXBlID0gYmFzZVR5cGU7CisgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrLy5oZ3RhZ3MgYi9qZGsvLmhndGFncwppbmRleCBmM2FkNDE5Li5iMzNlNTNiIDEwMDY0NAotLS0gYS9qZGsvLmhndGFncworKysgYi9qZGsvLmhndGFncwpAQCAtMzAsMyArMzAsNCBAQAogYTIwMzNhZGRjYTY3OGY5ZTRjMGQ5MmZmYTFlMzg5MTcxY2M5MzIxZCBqZGs3LWI1MwogZDFjNDNkMWY1Njc2YTI0YmE4NjIyMWFjN2NhZDU2OTRmM2E5YWZkYSBqZGs3LWI1NAogNTIyYmI1YWExN2UwYzBjZmYwMGIxZWQ3ZDFiNTFiYzRkYjJjZmVmOSBqZGs3LWI1NQorN2ZkM2JjMzdhZmUzNmY4ZjYxNjViYTY3OWRiMTIyOTcxNmRiODIyYSBqZGs3LWI1NgpkaWZmIC0tZ2l0IGEvamRrL1JFQURNRSBiL2pkay9SRUFETUUKaW5kZXggZDc3NGFiOC4uZTNjYzYzZSAxMDA2NDQKLS0tIGEvamRrL1JFQURNRQorKysgYi9qZGsvUkVBRE1FCkBAIC05LDI1ICs5LDM1IEBACiAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlL2Rvd25sb2Fkcy9pbmRleC5qc3AKICAgICAgU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBBTFRfQk9PVERJUiB0byB0aGUgbG9jYXRpb24gb2YgdGhpcyBKREsgNi4KIAotICAyLiBEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgQmluYXJ5IFBsdWdzIGZvciB0aGUgbW9zdCByZWNlbnQgSkRLNyBmcm9tCisgIDIuIERvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBKSUJYIGxpYnJhcmllcywgdmVyc2lvbiAxLjEuNSBmcm9tCisgICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTY5MzU4JnBhY2thZ2VfaWQ9NjgyOTAKKyAgICAgWW91J2xsIG5lZWQgdGhlIGZvbGxvd2luZyBmb3VyIEpBUiBmaWxlczoKKyAgICAgICAgIGJjZWwuamFyCisgICAgICAgICBqaWJ4LWJpbmQuamFyCisgICAgICAgICBqaWJ4LXJ1bi5qYXIKKyAgICAgICAgIHhwcDMuamFyCisgICAgIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQUxUX0pJQlhfTElCU19QQVRIIHRvIHRoZSBsb2NhdGlvbiBvZgorICAgICB0aGVzZSBKQVIgZmlsZXMuCisgICAgIAorICAzLiBEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgQmluYXJ5IFBsdWdzIGZvciB0aGUgbW9zdCByZWNlbnQgSkRLNyBmcm9tCiAgICAgIGh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9vcGVuamRrL2pkazcvCiAgICAgIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQUxUX0JJTkFSWV9QTFVHU19QQVRIIHRvIHRoZSBsb2NhdGlvbiBvZgogICAgICB0aGVzZSBiaW5hcnkgcGx1Z3MuCiAgICAgIAotICAzLiBFaXRoZXIgZG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIGxhdGVzdCBKREs3IGZyb20KKyAgNC4gRWl0aGVyIGRvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBsYXRlc3QgSkRLNyBmcm9tCiAgICAgIGh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9vcGVuamRrL2pkazcvLCBvciBidWlsZCB5b3VyIG93biBjb21wbGV0ZQogICAgICBPcGVuSkRLNyBieSB1c2luZyB0aGUgdG9wIGxldmVsIE1ha2VmaWxlIGluIHRoZSBPcGVuSkRLIE1lcmN1cmlhbCBmb3Jlc3QuCiAgICAgIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQUxUX0pES19JTVBPUlRfUEFUSCB0byB0aGUgbG9jYXRpb24gb2YKICAgICAgdGhpcyBsYXRlc3QgSkRLNyBvciBPcGVuSkRLNyBidWlsZC4KICAgICAgCi0gIDQuIENoZWNrIHRoZSBzYW5pdHkgb2YgZG9pbmcgYSBidWlsZCB3aXRoIHRoZSBjdXJyZW50IG1hY2hpbmU6CisgIDUuIENoZWNrIHRoZSBzYW5pdHkgb2YgZG9pbmcgYSBidWlsZCB3aXRoIHRoZSBjdXJyZW50IG1hY2hpbmU6CiAgICAgICAgY2QgbWFrZSAmJiBnbnVtYWtlIHNhbml0eQogICAgICBTZWUgUkVBRE1FLWJ1aWxkcy5odG1sIGlmIHlvdSBydW4gaW50byBwcm9ibGVtcy4KICAgCi0gIDUuIERvIGEgcGFydGlhbCBidWlsZCBvZiB0aGUgamRrOgorICA2LiBEbyBhIHBhcnRpYWwgYnVpbGQgb2YgdGhlIGpkazoKICAgICAgICBjZCBtYWtlICYmIGdudW1ha2UgYWxsCiAgIAotICA2LiBDb25zdHJ1Y3QgdGhlIGltYWdlczoKKyAgNy4gQ29uc3RydWN0IHRoZSBpbWFnZXM6CiAgICAgICAgY2QgbWFrZSAmJiBnbnVtYWtlIGltYWdlcwogICAgICBUaGUgcmVzdWx0aW5nIEpESyBpbWFnZSBzaG91bGQgYmUgZm91bmQgaW4gYnVpbGQvKi9qMnNkay1pbWFnZQogCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9jb21tb24vU2FuaXR5LmdtayBiL2pkay9tYWtlL2NvbW1vbi9TYW5pdHkuZ21rCmluZGV4IDMzODhiZTAuLmViNGYwMGUgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2NvbW1vbi9TYW5pdHkuZ21rCisrKyBiL2pkay9tYWtlL2NvbW1vbi9TYW5pdHkuZ21rCkBAIC05Miw3ICs5Miw4IEBACiAgICAgc2FuZS1sZF9ydW5fcGF0aCBcCiAgICAgc2FuZS1hbHRfYm9vdGRpciBcCiAgICAgc2FuZS1ib290ZGlyIFwKLSAgICBzYW5lLWFsc2EtaGVhZGVycworICAgIHNhbmUtYWxzYS1oZWFkZXJzIFwKKyAgICBzYW5lLWppYngKIAogaWZkZWYgT1BFTkpESwogc2FuaXR5LWFsbDo6IHNhbmUtZnJlZXR5cGUgCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9jb21tb24vc2hhcmVkL0RlZnMuZ21rIGIvamRrL21ha2UvY29tbW9uL3NoYXJlZC9EZWZzLmdtawppbmRleCA1ZGE0YTI5Li5kYzYyZjFlIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9jb21tb24vc2hhcmVkL0RlZnMuZ21rCisrKyBiL2pkay9tYWtlL2NvbW1vbi9zaGFyZWQvRGVmcy5nbWsKQEAgLTUxNSw2ICs1MTUsMTUgQEAKICMgICBOT1RFOiBJU0FfRElSIGlzIHVzdWFsbHkgZW1wdHksIG9uIFNvbGFyaXMgaXQgbWlnaHQgYmUgL3NwYXJjdjkgb3IgL2FtZDY0CiBCSU5ESVIgICAgICA9ICQoT1VUUFVURElSKS9iaW4kKElTQV9ESVIpCiAgIAorIyBKSUJYX0xJQlNfUEFUSDogcGF0aCB0byBKSUJYIGxpYnJhcmllcywgbmVlZGVkIGZvciBOaW1idXNMb29rQW5kRmVlbAoraWZkZWYgQUxUX0pJQlhfTElCU19QQVRICisgIEpJQlhfTElCU19QQVRIOj0kKGNhbGwgRnVsbFBhdGgsJChBTFRfSklCWF9MSUJTX1BBVEgpKQorICBKSUJYX0xJQlNfUEFUSDo9JChjYWxsIEFsdENoZWNrU3BhY2VzLEpJQlhfTElCU19QQVRIKQorICBKSUJYX0xJQlNfUEFUSDo9JChjYWxsIEFsdENoZWNrVmFsdWUsSklCWF9MSUJTX1BBVEgpCitlbHNlCisgIEpJQlhfTElCU19QQVRIPSQoSkRLX0RFVlRPT0xTX0RJUikvc2hhcmUvamlieC9saWIKK2VuZGlmCisKICMgTU9aSUxMQV9IRUFERVJTX1BBVEg6IHBhdGggdG8gbW96aWxsYSBoZWFkZXIgZmlsZXMgZm9yIHBsdWdpbgogaWZkZWYgQUxUX01PWklMTEFfSEVBREVSU19QQVRICiAgIE1PWklMTEFfSEVBREVSU19QQVRIIDo9JChjYWxsIEZ1bGxQYXRoLCQoQUxUX01PWklMTEFfSEVBREVSU19QQVRIKSkKQEAgLTUyOSw3ICs1MzgsNyBAQAogSkRLX0NVUFNfSEVBREVSU19QQVRIPSQoSkRLX0RFVlRPT0xTX0RJUikvc2hhcmUvY3Vwcy9pbmNsdWRlCiAgIGlmZGVmIEFMVF9DVVBTX0hFQURFUlNfUEFUSAogICAgICBDVVBTX0hFQURFUlNfUEFUSDo9JChjYWxsIEZ1bGxQYXRoLCQoQUxUX0NVUFNfSEVBREVSU19QQVRIKSkKLSAgICAgQ1VQX0hFQURFUlNfUEFUSDo9JChjYWxsIEFsdENoZWNrVmFsdWUsQ1VQU19IRUFERVJTX1BBVEgpCisgICAgIENVUFNfSEVBREVSU19QQVRIOj0kKGNhbGwgQWx0Q2hlY2tWYWx1ZSxDVVBTX0hFQURFUlNfUEFUSCkKICAgZWxzZSAKICAgICBDVVBTX0hFQURFUlNfUEFUSDo9IFwKICAgICAgICQoc2hlbGwgaWYgWyAtZCAiJChKREtfQ1VQU19IRUFERVJTX1BBVEgpIiBdOyB0aGVuIFwKZGlmZiAtLWdpdCBhL2pkay9tYWtlL2NvbW1vbi9zaGFyZWQvU2FuaXR5LVNldHRpbmdzLmdtayBiL2pkay9tYWtlL2NvbW1vbi9zaGFyZWQvU2FuaXR5LVNldHRpbmdzLmdtawppbmRleCBiNjRlM2I1Li4yODM1OThlIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9jb21tb24vc2hhcmVkL1Nhbml0eS1TZXR0aW5ncy5nbWsKKysrIGIvamRrL21ha2UvY29tbW9uL3NoYXJlZC9TYW5pdHktU2V0dGluZ3MuZ21rCkBAIC0yMzMsNiArMjMzLDcgQEAKICAgZW5kaWYKIGVuZGlmCiBBTExfU0VUVElOR1MrPSQoY2FsbCBhZGRBbHRTZXR0aW5nLENBQ0VSVFNfRklMRSkKK0FMTF9TRVRUSU5HUys9JChjYWxsIGFkZEFsdFNldHRpbmcsSklCWF9MSUJTX1BBVEgpCiBpZm5kZWYgT1BFTkpESwogICBBTExfU0VUVElOR1MrPSQoY2FsbCBhZGRBbHRTZXR0aW5nLE1PWklMTEFfSEVBREVSU19QQVRIKQogZW5kaWYKZGlmZiAtLWdpdCBhL2pkay9tYWtlL2NvbW1vbi9zaGFyZWQvU2FuaXR5LmdtayBiL2pkay9tYWtlL2NvbW1vbi9zaGFyZWQvU2FuaXR5LmdtawppbmRleCAxODBlNTIxLi44NGQ1ZTIyIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9jb21tb24vc2hhcmVkL1Nhbml0eS5nbWsKKysrIGIvamRrL21ha2UvY29tbW9uL3NoYXJlZC9TYW5pdHkuZ21rCkBAIC0yMTMsNiArMjEzLDcgQEAKIAlzYW5lLWxpbmsgXAogCXNhbmUtY2FjZXJ0cyBcCiAJc2FuZS1hbHNhLWhlYWRlcnMgXAorCXNhbmUtamlieCBcCiAJc2FuZS1hbnRfdmVyc2lvbiBcCiAJc2FuZS16aXBfdmVyc2lvbiBcCiAJc2FuZS11bnppcF92ZXJzaW9uIFwKQEAgLTE0OTgsNiArMTQ5OSwxOCBAQAogCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBKSUJYX0xJQlNfUEFUSCBtdXN0IGJlIHZhbGlkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3NhbmUtamlieDoKKwlAaWYgWyAhIC1yICQoc3Vic3QgXCwvLCQoSklCWF9MSUJTX1BBVEgpKS9qaWJ4LXJ1bi5qYXIgXTsgdGhlbiBcCisJICAkKEVDSE8pICJFUlJPUjogWW91IGRvIG5vdCBoYXZlIGFjY2VzcyB0byB2YWxpZCBKSUJYIGxpYnJhcnkgZmlsZXMuIFxuIiBcCisJICAgICIgICAgICBQbGVhc2UgY2hlY2sgeW91ciBhY2Nlc3MgdG8gXG4iIFwKKwkgICAgIiAgICAgICAgICAkKHN1YnN0IFwsLywkKEpJQlhfTElCU19QQVRIKSkvamlieC1ydW4uamFyIFxuIiBcCisJICAgICIgICAgICBhbmQvb3IgY2hlY2sgeW91ciB2YWx1ZSBvZiBBTFRfSkRLX0RFVlRPT0xTX0RJUiwgQUxUX0pJQlhfTElCU19QQVRIIFxuIiBcCisJICAgICIiID4+ICQoRVJST1JfRklMRSkgOyBcCisJZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIE1PWklMTEFfSEVBREVSU19QQVRIIG11c3QgYmUgdmFsaWQKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogc2FuZS1tb3ppbGxhOgpkaWZmIC0tZ2l0IGEvamRrL21ha2UvZG9jcy9DT1JFX1BLR1MuZ21rIGIvamRrL21ha2UvZG9jcy9DT1JFX1BLR1MuZ21rCmluZGV4IGY5YjllZTUuLjllYTZmMGMgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2RvY3MvQ09SRV9QS0dTLmdtaworKysgYi9qZGsvbWFrZS9kb2NzL0NPUkVfUEtHUy5nbWsKQEAgLTIzMyw2ICsyMzMsNyBAQAogICBqYXZheC54bWwud3MuaHR0cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgamF2YXgueG1sLndzLnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGphdmF4LnhtbC53cy5zcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nICAgICAgICAgICAgICAgICAgICAgIFwKICAgamF2YXgueG1sLnRyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4ICAgICAgICAgICAgICAgICAgICAgICAgXAogICBqYXZheC54bWwudHJhbnNmb3JtLmRvbSAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2pkay9tYWtlL2phdmEvemlwL0ZJTEVTX2MuZ21rIGIvamRrL21ha2UvamF2YS96aXAvRklMRVNfYy5nbWsKaW5kZXggNjQyNmNlYS4uZjg4Mzg2YyAxMDA2NDQKLS0tIGEvamRrL21ha2UvamF2YS96aXAvRklMRVNfYy5nbWsKKysrIGIvamRrL21ha2UvamF2YS96aXAvRklMRVNfYy5nbWsKQEAgLTI5LDcgKzI5LDYgQEAKIAlEZWZsYXRlci5jIFwKIAlJbmZsYXRlci5jIFwKIAlaaXBGaWxlLmMgXAotCVppcEVudHJ5LmMgXAogCXphZGxlcjMyLmMgXAogCXpjcmMzMi5jIFwKIAlkZWZsYXRlLmMgXApkaWZmIC0tZ2l0IGEvamRrL21ha2UvamF2YS96aXAvbWFwZmlsZS12ZXJzIGIvamRrL21ha2UvamF2YS96aXAvbWFwZmlsZS12ZXJzCmluZGV4IDQ0M2VhNjcuLjA5NmZhMzUgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2phdmEvemlwL21hcGZpbGUtdmVycworKysgYi9qZGsvbWFrZS9qYXZhL3ppcC9tYXBmaWxlLXZlcnMKQEAgLTUwLDE1ICs1MCwxNyBAQAogCQlKYXZhX2phdmFfdXRpbF96aXBfSW5mbGF0ZXJfaW5pdElEczsKIAkJSmF2YV9qYXZhX3V0aWxfemlwX0luZmxhdGVyX3Jlc2V0OwogCQlKYXZhX2phdmFfdXRpbF96aXBfSW5mbGF0ZXJfc2V0RGljdGlvbmFyeTsKLQkJSmF2YV9qYXZhX3V0aWxfemlwX1ppcEVudHJ5X2luaXRGaWVsZHM7Ci0JCUphdmFfamF2YV91dGlsX3ppcF9aaXBFbnRyeV9pbml0SURzOwogCQlKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9jbG9zZTsKIAkJSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZnJlZUVudHJ5OwotCQlKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRDU2l6ZTsKIAkJSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnk7Ci0JCUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldE1ldGhvZDsKKwkJSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlCeXRlczsKKwkJSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlDcmM7CisJCUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5Q1NpemU7CisJCUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5RmxhZzsKKwkJSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlNZXRob2Q7CisJCUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5U2l6ZTsKKwkJSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlUaW1lOwogCQlKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXROZXh0RW50cnk7Ci0JCUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldFNpemU7CiAJCUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldFppcE1lc3NhZ2U7CiAJCUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldFRvdGFsOwogCQlKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9pbml0SURzOwpkaWZmIC0tZ2l0IGEvamRrL21ha2UvamF2YS96aXAvcmVvcmRlci1pNTg2IGIvamRrL21ha2UvamF2YS96aXAvcmVvcmRlci1pNTg2CmluZGV4IGQxYWY4MWMuLmQ5ZTkwZWEgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2phdmEvemlwL3Jlb3JkZXItaTU4NgorKysgYi9qZGsvbWFrZS9qYXZhL3ppcC9yZW9yZGVyLWk1ODYKQEAgLTIwLDEyICsyMCwxNCBAQAogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfb3BlbjsKIHRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldFRvdGFsOwogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnk7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRW50cnlfaW5pdElEczsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBFbnRyeV9pbml0RmllbGRzOwogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZnJlZUVudHJ5OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0Q1NpemU7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRTaXplOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0TWV0aG9kOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlUaW1lOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlDcmM7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUNTaXplOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlTaXplOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlGbGFnOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlNZXRob2Q7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUJ5dGVzOwogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX0luZmxhdGVyX2luaXRJRHM7CiB0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfSW5mbGF0ZXJfaW5pdDsKIHRleHQ6IC50ZXh0JWluZmxhdGVJbml0Ml87CmRpZmYgLS1naXQgYS9qZGsvbWFrZS9qYXZhL3ppcC9yZW9yZGVyLXNwYXJjIGIvamRrL21ha2UvamF2YS96aXAvcmVvcmRlci1zcGFyYwppbmRleCBiMDA0YjNjLi44MmNjODFiIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9qYXZhL3ppcC9yZW9yZGVyLXNwYXJjCisrKyBiL2pkay9tYWtlL2phdmEvemlwL3Jlb3JkZXItc3BhcmMKQEAgLTE5LDEyICsxOSwxNCBAQAogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfb3BlbjsKIHRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldFRvdGFsOwogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnk7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRW50cnlfaW5pdElEczsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBFbnRyeV9pbml0RmllbGRzOwogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZnJlZUVudHJ5OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0Q1NpemU7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRTaXplOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0TWV0aG9kOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlUaW1lOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlDcmM7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUNTaXplOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlTaXplOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlGbGFnOwordGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlNZXRob2Q7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUJ5dGVzOwogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX0luZmxhdGVyX2luaXRJRHM7CiB0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfSW5mbGF0ZXJfaW5pdDsKIHRleHQ6IC50ZXh0JWluZmxhdGVJbml0Ml87CmRpZmYgLS1naXQgYS9qZGsvbWFrZS9qYXZhL3ppcC9yZW9yZGVyLXNwYXJjdjkgYi9qZGsvbWFrZS9qYXZhL3ppcC9yZW9yZGVyLXNwYXJjdjkKaW5kZXggZTEwNjFmOC4uYTJiMGY0NiAxMDA2NDQKLS0tIGEvamRrL21ha2UvamF2YS96aXAvcmVvcmRlci1zcGFyY3Y5CisrKyBiL2pkay9tYWtlL2phdmEvemlwL3Jlb3JkZXItc3BhcmN2OQpAQCAtMjAsMTIgKzIwLDE0IEBACiB0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9vcGVuOwogdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0VG90YWw7CiB0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeTsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBFbnRyeV9pbml0SURzOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEVudHJ5X2luaXRGaWVsZHM7CiB0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9mcmVlRW50cnk7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRDU2l6ZTsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldFNpemU7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRNZXRob2Q7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeVRpbWU7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUNyYzsKK3RleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5Q1NpemU7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeVNpemU7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUZsYWc7Cit0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeU1ldGhvZDsKK3RleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5Qnl0ZXM7CiB0ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfSW5mbGF0ZXJfaW5pdElEczsKIHRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9JbmZsYXRlcl9pbml0OwogdGV4dDogLnRleHQlaW5mbGF0ZUluaXQyXzsKZGlmZiAtLWdpdCBhL2pkay9tYWtlL2phdmF4L3N3aW5nL3BsYWYvTWFrZWZpbGUgYi9qZGsvbWFrZS9qYXZheC9zd2luZy9wbGFmL01ha2VmaWxlCmluZGV4IGY4ZTVlMGMuLmFlYTg4ZjIgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2phdmF4L3N3aW5nL3BsYWYvTWFrZWZpbGUKKysrIGIvamRrL21ha2UvamF2YXgvc3dpbmcvcGxhZi9NYWtlZmlsZQpAQCAtMzQsOSArMzQsMTQgQEAKICMKIGluY2x1ZGUgRklMRVMuZ21rCiBBVVRPX0ZJTEVTX0pBVkFfRElSUyA9IGphdmF4L3N3aW5nL3BsYWYgc3VuL3N3aW5nIGNvbS9zdW4vamF2YS9zd2luZy9wbGFmCitTVUJESVJTID0gbmltYnVzCisKKyMgTmltYnVzIGlzIGhhbmRsZWQgaW4gaXRzIG93biBkaXJlY3RvcnkKK0FVVE9fSkFWQV9QUlVORSA9IG5pbWJ1cworCiBpZmVxICgkKFBMQVRGT1JNKSwgd2luZG93cykKICAgICAjIERvbid0IGJ1aWxkIEdUSyBMJkYgb24gV2luZG93cwotICAgIEFVVE9fSkFWQV9QUlVORSA9IGd0aworICAgIEFVVE9fSkFWQV9QUlVORSArPSBndGsKIGVuZGlmCiAKIE1JU0NfRklMRVMgPSAkKE1JU0NfU1dJTkdfRklMRVMpCkBAIC02OCw4ICs3MywxMCBAQAogIyBQcm9jZXNzIExPR09fSUNPTlMgYW5kIE1vdGlmIEljb25zIGZpcnN0LgogIwogYnVpbGQ6ICQoTE9HT19JQ09OUykgJChNSVNDX1NXSU5HX0ZJTEVTX01PVElGX0dJRikgJChNSVNDX1NXSU5HX0ZJTEVTX01PVElGX1BORykgb3RoZXJfZmlsZXMKKwkkKFNVQkRJUlMtbG9vcCkKIAotY2xlYW46OiBjbGFzc2VzLmNsZWFuCitjbGVhbiBjbG9iYmVyOjoKKwkkKFNVQkRJUlMtbG9vcCkKIAogIwogIyBJbmNsdWRlCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9NYWtlZmlsZSBiL2pkay9tYWtlL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTlmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDYwIEBACisjCisjIENvcHlyaWdodCAxOTk4LTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKworQlVJTERESVIgID0gLi4vLi4vLi4vLi4KK1BBQ0tBR0UgICA9IGphdmF4LnN3aW5nLnBsYWYubmltYnVzCitQUk9EVUNUICAgPSBjb20KK1NXSU5HX1NSQyA9ICQoU0hBUkVfU1JDKS9jbGFzc2VzL2phdmF4L3N3aW5nCitpbmNsdWRlICQoQlVJTERESVIpL2NvbW1vbi9EZWZzLmdtaworCisjCisjIEZpbGVzCisjCitOSU1CVVNfUEtHID0gamF2YXgvc3dpbmcvcGxhZi9uaW1idXMKK05JTUJVU19DT01QQVRfUEtHID0gY29tL3N1bi9qYXZhL3N3aW5nL3BsYWYvbmltYnVzCitOSU1CVVNfR0VOU1JDX0RJUiA9ICQoR0VOU1JDRElSKS8kKE5JTUJVU19QS0cpCitOSU1CVVNfU0tJTl9GSUxFID0gJChTSEFSRV9TUkMpL2NsYXNzZXMvJChOSU1CVVNfUEtHKS9za2luLmxhZgorTklNQlVTX0dFTkVSQVRPUl9KQVIgPSAkKEJVSUxEVE9PTEpBUkRJUikvbmltYnVzX2dlbmVyYXRvci5qYXIKKworQVVUT19GSUxFU19KQVZBX0RJUlMgPSAkKE5JTUJVU19QS0cpICQoTklNQlVTX0NPTVBBVF9QS0cpCisKKworIworIyBSdWxlcworIworQ0xBU1NFU19JTklUID0gJChOSU1CVVNfR0VOU1JDX0RJUikKKworaW5jbHVkZSAkKEJVSUxERElSKS9jb21tb24vQ2xhc3Nlcy5nbWsKKworJChOSU1CVVNfR0VOU1JDX0RJUik6ICQoTklNQlVTX1NLSU5fRklMRSkgJChOSU1CVVNfR0VORVJBVE9SX0pBUikKKwlAJChFQ0hPKSAiR2VuZXJhdGluZyBOaW1idXMgc291cmNlIGZpbGVzOiIKKwkkKEJPT1RfSkFWQV9DTUQpIC1qYXIgJChOSU1CVVNfR0VORVJBVE9SX0pBUikgXAorCSAgICAtc2tpbkZpbGUgJChOSU1CVVNfU0tJTl9GSUxFKSBcCisJICAgIC1idWlsZERpciAkKEdFTlNSQ0RJUikgLXNyY0RpciAkKEdFTlNSQ0RJUikgXAorCSAgICAtcGFja2FnZVByZWZpeCAkKFBBQ0tBR0UpIC1sYWZOYW1lIE5pbWJ1cworCUAkKEVDSE8pICJGaW5pc2hlZCBnZW5lcmF0aW5nIE5pbWJ1cyBzb3VyY2UgZmlsZXMiCisKK2NsZWFuIGNsb2JiZXI6OgorCSQoUk0pIC1yICQoTklNQlVTX0dFTlNSQ19ESVIpCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9qcHJ0LnByb3BlcnRpZXMgYi9qZGsvbWFrZS9qcHJ0LnByb3BlcnRpZXMKaW5kZXggYTFlN2U1MS4uNWUyMWRiYSAxMDA2NDQKLS0tIGEvamRrL21ha2UvanBydC5wcm9wZXJ0aWVzCisrKyBiL2pkay9tYWtlL2pwcnQucHJvcGVydGllcwpAQCAtMzIsOCArMzIsOCBAQAogc29sYXJpc19zcGFyY3Y5XzUuMTAsXAogc29sYXJpc19pNTg2XzUuMTAsXAogc29sYXJpc194NjRfNS4xMCxcCi1saW51eF9pNTg2LFwKLWxpbnV4X3g2NCxcCitsaW51eF9pNTg2XzIuNixcCitsaW51eF94NjRfMi42LFwKIHdpbmRvd3NfaTU4NixcCiB3aW5kb3dzX3g2NAogCmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9NYWtlZmlsZSBiL2pkay9tYWtlL3Rvb2xzL01ha2VmaWxlCmluZGV4IDM4MDNmYmMuLmE5MjcyMDkgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL3Rvb2xzL01ha2VmaWxlCisrKyBiL2pkay9tYWtlL3Rvb2xzL01ha2VmaWxlCkBAIC01MSw2ICs1MSw3IEBACiAgIG1ha2VjbGFzc2xpc3QgICAgICAgICAgICAgXAogICBzdHJpcF9wcm9wZXJ0aWVzICAgICAgICAgIFwKICAgc3BwICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN3aW5nLW5pbWJ1cyAgICAgICAgICAgICAgXAogICBDaGFyc2V0TWFwcGluZwogCiBhbGwgYnVpbGQgY2xlYW4gY2xvYmJlcjo6CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvTWFrZWZpbGUgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkZjU3MQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDkxIEBACisjCisjIENvcHlyaWdodCAxOTk4LTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisjIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisjIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyMKKworIworIyBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgdGhlIE5pbWJ1cyBnZW5lcmF0b3IKKyMKKworQlVJTERESVIgPSAuLi8uLgorUEFDS0FHRSA9IG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvcgorUFJPRFVDVCA9IHRvb2xzCitQUk9HUkFNID0gbmltYnVzX2dlbmVyYXRvcgoraW5jbHVkZSAkKEJVSUxERElSKS9jb21tb24vRGVmcy5nbWsKKworQlVJTERUT09MX1NPVVJDRV9ST09UID0gY2xhc3NlcworQlVJTERUT09MX01BSU4gICAgICAgID0gJChQS0dESVIpL0dlbmVyYXRvci5qYXZhCisKKyMKKyMgRmlsZXMKKyMKKworTUFJTl9DTEFTU19GSUxFID0gJChCVUlMRFRPT0xDTEFTU0RJUikvJChCVUlMRFRPT0xfTUFJTjolLmphdmE9JS5jbGFzcykKK1NPVVJDRV9GSUxFUyAgICA9ICQoc2hlbGwgJChGSU5EKSAkKEJVSUxEVE9PTF9TT1VSQ0VfUk9PVCkgLW5hbWUgJyouamF2YScgLXByaW50KQorCitURU1QTEFURV9GSUxFUyAgPSAkKFNIQVJFX1NSQykvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9EZWZhdWx0cy50ZW1wbGF0ZSBcCisgICAgICAgICAgICAgICAgICAkKFNIQVJFX1NSQykvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9QYWludGVySW1wbC50ZW1wbGF0ZSBcCisgICAgICAgICAgICAgICAgICAkKFNIQVJFX1NSQykvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9TdGF0ZUltcGwudGVtcGxhdGUKK1RFTVBMQVRFX0RFU1QgICA9ICQoQlVJTERUT09MQ0xBU1NESVIpL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9yZXNvdXJjZXMKKworSklCWF9GSUxFUyAgICAgID0gJChCVUlMRFRPT0xfU09VUkNFX1JPT1QpL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvRGVzaWduZXIuamlieC54bWwgXAorICAgICAgICAgICAgICAgICAgJChCVUlMRFRPT0xfU09VUkNFX1JPT1QpL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvU3ludGhNb2RlbC5qaWJ4LnhtbAorSklCWF9MSUJTX0NQICAgID0gJChKSUJYX0xJQlNfUEFUSCkvYmNlbC5qYXIkKENMQVNTUEFUSF9TRVBBUkFUT1IpJChKSUJYX0xJQlNfUEFUSCkveHBwMy5qYXIkKENMQVNTUEFUSF9TRVBBUkFUT1IpJChKSUJYX0xJQlNfUEFUSCkvamlieC1iaW5kLmphciQoQ0xBU1NQQVRIX1NFUEFSQVRPUikkKEpJQlhfTElCU19QQVRIKS9qaWJ4LXJ1bi5qYXIKK0pJQlhfTElCU19MSVNUICA9ICQoc3Vic3QgJChDTEFTU1BBVEhfU0VQQVJBVE9SKSwgLCQoSklCWF9MSUJTX0NQKSkKKworCisjCisjIFJ1bGVzCisjCisKK2luY2x1ZGUgJChCVUlMRERJUikvY29tbW9uL0J1aWxkVG9vbEphci5nbWsKKworJChNQUlOX0NMQVNTX0ZJTEUpOiAkKFNPVVJDRV9GSUxFUykgJChKSUJYX0xJQlNfTElTVCkKKwlAJChNS0RJUikgLXAgJChCVUlMRFRPT0xDTEFTU0RJUikKKwkkKEJPT1RfSkFWQUNfQ01EKSAtY2xhc3NwYXRoICIkKEpJQlhfTElCU19DUCkiIFwKKwkgICAgLWQgJChCVUlMRFRPT0xDTEFTU0RJUikgLXNvdXJjZXBhdGggJChCVUlMRFRPT0xfU09VUkNFX1JPT1QpIFwKKwkgICAgJChTT1VSQ0VfRklMRVMpCisKKyQoVEVNUExBVEVfREVTVCk6ICQoVEVNUExBVEVfRklMRVMpCisJJChNS0RJUikgLXAgJChURU1QTEFURV9ERVNUKQorCSQoUk0pICQoVEVNUExBVEVfREVTVCkvKi50ZW1wbGF0ZQorCSQoQ1ApICQoVEVNUExBVEVfRklMRVMpICQoVEVNUExBVEVfREVTVCkKKworJChCVUlMRFRPT0xfTUFOSUZFU1RfRklMRSk6ICQoTUFJTl9DTEFTU19GSUxFKQorCSQoRUNITykgIk1haW4tQ2xhc3M6ICQoQlVJTFRUT09MX01BSU5DTEFTUykiID4gJEAKKwkkKEVDSE8pICJDbGFzcy1QYXRoOiAkKEpJQlhfTElCU19MSVNUOiQoSklCWF9MSUJTX1BBVEgpLyU9JSkiID4+ICRACisJJChDUCkgJChKSUJYX0xJQlNfTElTVCkgJChCVUlMRFRPT0xKQVJESVIpCisKKyQoQlVJTERUT09MX0pBUl9GSUxFKTogJChNQUlOX0NMQVNTX0ZJTEUpICQoVEVNUExBVEVfREVTVCkgXAorICAgICQoSklCWF9GSUxFUykgJChCVUlMRFRPT0xfTUFOSUZFU1RfRklMRSkKKwlAJChwcmVwLXRhcmdldCkKKwkkKEJPT1RfSkFWQV9DTUQpIFwKKwkgIC1jbGFzc3BhdGggIiQoSklCWF9MSUJTX0NQKSQoQ0xBU1NQQVRIX1NFUEFSQVRPUikkKEJVSUxEVE9PTENMQVNTRElSKSIgXAorCSAgb3JnLmppYnguYmluZGluZy5Db21waWxlICQoSklCWF9GSUxFUykKKwkkKEJPT1RfSkFSX0NNRCkgY2ZtICRAICQoQlVJTERUT09MX01BTklGRVNUX0ZJTEUpIFwKKwkgICAgLUMgJChCVUlMRFRPT0xDTEFTU0RJUikgb3JnIFwKKwkgICAgJChCT09UX0pBUl9KRkxBR1MpIHx8ICQoUk0pICRACisJQCQoamF2YS12bS1jbGVhbnVwKQorCitjbGVhbiBjbG9iYmVyOjoKKwkkKFJNKSAtciAkKFRFTVBMQVRFX0RFU1QpCmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3AvYmVhbnMvQWJzdHJhY3RCZWFuLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3AvYmVhbnMvQWJzdHJhY3RCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzMjUzMQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9iZWFucy9BYnN0cmFjdEJlYW4uamF2YQpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3AuYmVhbnM7CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlWZXRvRXhjZXB0aW9uOworaW1wb3J0IGphdmEuYmVhbnMuVmV0b2FibGVDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlZldG9hYmxlQ2hhbmdlU3VwcG9ydDsKKworLyoqCisgKiA8cD5BIGNvbnZlbmllbmNlIGNsYXNzIGZyb20gd2hpY2ggdG8gZXh0ZW5kIGFsbCBub24tdmlzdWFsIEFic3RyYWN0QmVhbnMuIEl0CisgKiBtYW5hZ2VzIHRoZSBQcm9wZXJ0eUNoYW5nZSBub3RpZmljYXRpb24gc3lzdGVtLCBtYWtpbmcgaXQgcmVsYXRpdmVseSB0cml2aWFsCisgKiB0byBhZGQgc3VwcG9ydCBmb3IgcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBpbiBnZXR0ZXJzL3NldHRlcnMuPC9wPgorICoKKyAqIDxwPkEgbm9uLXZpc3VhbCBqYXZhIGJlYW4gaXMgYSBKYXZhIGNsYXNzIHRoYXQgY29uZm9ybXMgdG8gdGhlIEFic3RyYWN0QmVhbgorICogcGF0dGVybnMgdG8gYWxsb3cgdmlzdWFsIG1hbmlwdWxhdGlvbiBvZiB0aGUgYmVhbidzIHByb3BlcnRpZXMgYW5kIGV2ZW50CisgKiBoYW5kbGVycyBhdCBkZXNpZ24tdGltZS48L3A+CisgKgorICogPHA+SGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIGJlYW4gdGhhdCBjb250YWlucyBvbmUgcHJvcGVydHksIGZvbywgYW5kIHRoZQorICogcHJvcGVyIHBhdHRlcm4gZm9yIGltcGxlbWVudGluZyBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uOgorICogPHByZT48Y29kZT4KKyAqICBwdWJsaWMgY2xhc3MgQUJlYW4gZXh0ZW5kcyBBYnN0cmFjdEJlYW4geworICogICAgcHJpdmF0ZSBTdHJpbmcgZm9vOworICoKKyAqICAgIHB1YmxpYyB2b2lkIHNldEZvbyhTdHJpbmcgbmV3Rm9vKSB7CisgKiAgICAgIFN0cmluZyBvbGQgPSBnZXRGb28oKTsKKyAqICAgICAgdGhpcy5mb28gPSBuZXdGb287CisgKiAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZm9vIiwgb2xkLCBnZXRGb28oKSk7CisgKiAgICB9CisgKgorICogICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgKiAgICAgIHJldHVybiBmb287CisgKiAgICB9CisgKiAgfQorICogPC9jb2RlPjwvcHJlPjwvcD4KKyAqCisgKiA8cD5Zb3Ugd2lsbCBub3RpY2UgdGhhdCAiZ2V0Rm9vKCkiIGlzIHVzZWQgaW4gdGhlIHNldEZvbyBtZXRob2QgcmF0aGVyIHRoYW4KKyAqIGFjY2Vzc2luZyAiZm9vIiBkaXJlY3RseSBmb3IgdGhlIGdldHMuIFRoaXMgaXMgZG9uZSBpbnRlbnRpb25hbGx5IHNvIHRoYXQgaWYKKyAqIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIGdldEZvbygpIHRvIHJldHVybiwgZm9yIGluc3RhbmNlLCBhIGNvbnN0YW50IHZhbHVlIHRoZQorICogcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0gd2lsbCBjb250aW51ZSB0byB3b3JrIHByb3Blcmx5LjwvcD4KKyAqCisgKiA8cD5UaGUgZmlyZVByb3BlcnR5Q2hhbmdlIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIG9sZCB2YWx1ZSBhbmQgdGhlIG5ldworICogdmFsdWUuIE9ubHkgaWYgdGhlIHR3byBkaWZmZXIgd2lsbCBpdCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LiBTbyB5b3UgY2FuCisgKiBiZSBhc3N1cmVkIGZyb20gdGhlIGFib3ZlIGNvZGUgZnJhZ21lbnQgdGhhdCBhIHByb3BlcnR5IGNoYW5nZSBldmVudCB3aWxsIG9ubHkKKyAqIG9jY3VyIGlmIG9sZCBpcyBpbmRlZWQgZGlmZmVyZW50IGZyb20gZ2V0Rm9vKCk8L3A+CisgKgorICogPHA+PGNvZGU+QWJzdHJhY3RCZWFuPC9jb2RlPiBhbHNvIHN1cHBvcnRzIHtAbGluayBWZXRvYWJsZVByb3BlcnR5Q2hhbmdlfSBldmVudHMuCisgKiBUaGVzZSBldmVudHMgYXJlIHNpbWlsYXIgdG8gPGNvZGU+UHJvcGVydHlDaGFuZ2U8L2NvZGU+IGV2ZW50cywgZXhjZXB0IGEgc3BlY2lhbAorICogZXhjZXB0aW9uIGNhbiBiZSB1c2VkIHRvIHZldG8gY2hhbmdpbmcgdGhlIHByb3BlcnR5LiBGb3IgZXhhbXBsZSwgcGVyaGFwcyB0aGUKKyAqIHByb3BlcnR5IGlzIGNoYW5naW5nIGZyb20gImZyZWQiIHRvICJyZWQiLCBidXQgYSBsaXN0ZW5lciBkZWVtcyB0aGF0ICJyZWQiIGlzCisgKiB1bmV4Y2VwdGFibGUuIEluIHRoaXMgY2FzZSwgdGhlIGxpc3RlbmVyIGNhbiBmaXJlIGEgdmV0byBleGNlcHRpb24gYW5kIHRoZSBwcm9wZXJ0eSBtdXN0CisgKiByZW1haW4gImZyZWQiLiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+PGNvZGU+CisgKiAgcHVibGljIGNsYXNzIEFCZWFuIGV4dGVuZHMgQWJzdHJhY3RCZWFuIHsKKyAqICAgIHByaXZhdGUgU3RyaW5nIGZvbzsKKyAqCisgKiAgICBwdWJsaWMgdm9pZCBzZXRGb28oU3RyaW5nIG5ld0ZvbykgdGhyb3dzIFByb3BlcnR5VmV0b0V4Y2VwdGlvbiB7CisgKiAgICAgIFN0cmluZyBvbGQgPSBnZXRGb28oKTsKKyAqICAgICAgdGhpcy5mb28gPSBuZXdGb287CisgKiAgICAgIGZpcmVWZXRvYWJsZUNoYW5nZSgiZm9vIiwgb2xkLCBnZXRGb28oKSk7CisgKiAgICB9CisgKgorICogICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgKiAgICAgIHJldHVybiBmb287CisgKiAgICB9CisgKiAgfQorICoKKyAqICBwdWJsaWMgY2xhc3MgVGVzdGVyIHsKKyAqICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmdzKSB7CisgKiAgICAgIHRyeSB7CisgKiAgICAgICAgQUJlYW4gYSA9IG5ldyBBQmVhbigpOworICogICAgICAgIGEuc2V0Rm9vKCJmcmVkIik7CisgKiAgICAgICAgYS5hZGRWZXRvYWJsZUNoYW5nZUxpc3RlbmVyKG5ldyBWZXRvYWJsZUNoYW5nZUxpc3RlbmVyKCkgeworICogICAgICAgICAgcHVibGljIHZvaWQgdmV0b2FibGVDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHRocm93cyBQcm9wZXJ0eVZldG9FeGNlcHRpb24geworICogICAgICAgICAgICBpZiAoInJlZCIuZXF1YWxzKGV2dC5nZXROZXdWYWx1ZSgpKSB7CisgKiAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3BlcnR5VmV0b0V4Y2VwdGlvbigiQ2Fubm90IGJlIHJlZCEiLCBldnQpOworICogICAgICAgICAgICB9CisgKiAgICAgICAgICB9CisgKiAgICAgICAgfQorICogICAgICAgIGEuc2V0Rm9vKCJyZWQiKTsKKyAqICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAqICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAvLyB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQKKyAqICAgICAgfQorICogICAgfQorICogIH0KKyAqIDwvY29kZT48L3ByZT48L3A+CisgKgorICogQHN0YXR1cyBSRVZJRVdFRAorICogQGF1dGhvciByYmFpcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCZWFuIHsKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIGFsbCB0aGUgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbiBtYWNoaW5lcnkuCisgICAgICogUHJvcGVydHlDaGFuZ2VTdXBwb3J0IGNhbm5vdCBiZSBleHRlbmRlZCBkaXJlY3RseSBiZWNhdXNlIGl0IHJlcXVpcmVzCisgICAgICogYSBiZWFuIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHRoZSAidGhpcyIgYXJndW1lbnQgaXMgbm90IHZhbGlkIHVudGlsCisgICAgICogYWZ0ZXIgc3VwZXIgY29uc3RydWN0aW9uLiBIZW5jZSwgZGVsZWdhdGlvbiBpbnN0ZWFkIG9mIGV4dGVuc2lvbgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBwY3M7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIGFsbCB0aGUgdmV0byBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1hY2hpbmVyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBWZXRvYWJsZUNoYW5nZVN1cHBvcnQgdmNzOworCisgICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQWJzdHJhY3RCZWFuICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0QmVhbigpIHsKKyAgICAgICAgcGNzID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKyAgICAgICAgdmNzID0gbmV3IFZldG9hYmxlQ2hhbmdlU3VwcG9ydCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEFic3RyYWN0QmVhbiwgdXNpbmcgdGhlIHN1cHBsaWVkIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBhbmQKKyAgICAgKiBWZXRvYWJsZUNoYW5nZVN1cHBvcnQgZGVsZWdhdGVzLiBOZWl0aGVyIG9mIHRoZXNlIG1heSBiZSBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdEJlYW4oUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHBjcywgVmV0b2FibGVDaGFuZ2VTdXBwb3J0IHZjcykgeworICAgICAgICBpZiAocGNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiUHJvcGVydHlDaGFuZ2VTdXBwb3J0IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVmV0b2FibGVDaGFuZ2VTdXBwb3J0IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucGNzID0gcGNzOworICAgICAgICB0aGlzLnZjcyA9IHZjczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRvIHRoZSBsaXN0ZW5lciBsaXN0LgorICAgICAqIFRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkIGZvciBhbGwgcHJvcGVydGllcy4KKyAgICAgKiBUaGUgc2FtZSBsaXN0ZW5lciBvYmplY3QgbWF5IGJlIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCBhbmQgd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBhcyBtYW55IHRpbWVzIGFzIGl0IGlzIGFkZGVkLgorICAgICAqIElmIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiBpcyBudWxsLCBubyBleGNlcHRpb24gaXMgdGhyb3duIGFuZCBubyBhY3Rpb24KKyAgICAgKiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciAgVGhlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgcGNzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KKyAgICAgKiBUaGlzIHJlbW92ZXMgYSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQKKyAgICAgKiBmb3IgYWxsIHByb3BlcnRpZXMuCisgICAgICogSWYgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IHdhcyBhZGRlZCBtb3JlIHRoYW4gb25jZSB0byB0aGUgc2FtZSBldmVudAorICAgICAqIHNvdXJjZSwgaXQgd2lsbCBiZSBub3RpZmllZCBvbmUgbGVzcyB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuCisgICAgICogSWYgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IGlzIG51bGwsIG9yIHdhcyBuZXZlciBhZGRlZCwgbm8gZXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duIGFuZCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgIFRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgcGNzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZQorICAgICAqIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBvYmplY3Qgd2l0aCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkuCisgICAgICogPHA+CisgICAgICogSWYgc29tZSBsaXN0ZW5lcnMgaGF2ZSBiZWVuIGFkZGVkIHdpdGggYSBuYW1lZCBwcm9wZXJ0eSwgdGhlbgorICAgICAqIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIGEgbWl4dHVyZSBvZiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycworICAgICAqIGFuZCA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHk8L2NvZGU+cy4gSWYgdGhlIGNhbGxpbmcKKyAgICAgKiBtZXRob2QgaXMgaW50ZXJlc3RlZCBpbiBkaXN0aW5ndWlzaGluZyB0aGUgbGlzdGVuZXJzIHRoZW4gaXQgbXVzdAorICAgICAqIHRlc3QgZWFjaCBlbGVtZW50IHRvIHNlZSBpZiBpdCdzIGEKKyAgICAgKiA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHk8L2NvZGU+LCBwZXJmb3JtIHRoZSBjYXN0LCBhbmQgZXhhbWluZQorICAgICAqIHRoZSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBiZWFuLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCk7CisgICAgICogZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgKiAgIGlmIChsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIHsKKyAgICAgKiAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5IHByb3h5ID0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSlsaXN0ZW5lcnNbaV07CisgICAgICogICAgIGlmIChwcm94eS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImZvbyIpKSB7CisgICAgICogICAgICAgLy8gcHJveHkgaXMgYSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHdoaWNoIHdhcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgLy8gd2l0aCB0aGUgcHJvcGVydHkgbmFtZWQgImZvbyIKKyAgICAgKiAgICAgfQorICAgICAqICAgfQorICAgICAqIH0KKyAgICAgKjwvcHJlPgorICAgICAqCisgICAgICogQHNlZSBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eQorICAgICAqIEByZXR1cm4gYWxsIG9mIHRoZSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyczwvY29kZT4gYWRkZWQgb3IgYW4KKyAgICAgKiAgICAgICAgIGVtcHR5IGFycmF5IGlmIG5vIGxpc3RlbmVycyBoYXZlIGJlZW4gYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gcGNzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS4gIFRoZSBsaXN0ZW5lcgorICAgICAqIHdpbGwgYmUgaW52b2tlZCBvbmx5IHdoZW4gYSBjYWxsIG9uIGZpcmVQcm9wZXJ0eUNoYW5nZSBuYW1lcyB0aGF0CisgICAgICogc3BlY2lmaWMgcHJvcGVydHkuCisgICAgICogVGhlIHNhbWUgbGlzdGVuZXIgb2JqZWN0IG1heSBiZSBhZGRlZCBtb3JlIHRoYW4gb25jZS4gIEZvciBlYWNoCisgICAgICogcHJvcGVydHksICB0aGUgbGlzdGVuZXIgd2lsbCBiZSBpbnZva2VkIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGFkZGVkCisgICAgICogZm9yIHRoYXQgcHJvcGVydHkuCisgICAgICogSWYgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvciA8Y29kZT5saXN0ZW5lcjwvY29kZT4gaXMgbnVsbCwgbm8KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duIGFuZCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gbGlzdGVuIG9uLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciAgVGhlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgcGNzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS4KKyAgICAgKiBJZiA8Y29kZT5saXN0ZW5lcjwvY29kZT4gd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlIHRvIHRoZSBzYW1lIGV2ZW50CisgICAgICogc291cmNlIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBpdCB3aWxsIGJlIG5vdGlmaWVkIG9uZSBsZXNzIHRpbWUKKyAgICAgKiBhZnRlciBiZWluZyByZW1vdmVkLgorICAgICAqIElmIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gaXMgbnVsbCwgIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIG5vCisgICAgICogYWN0aW9uIGlzIHRha2VuLgorICAgICAqIElmIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiBpcyBudWxsLCBvciB3YXMgbmV2ZXIgYWRkZWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwcm9wZXJ0eSwgbm8gZXhjZXB0aW9uIGlzIHRocm93biBhbmQgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2FzIGxpc3RlbmVkIG9uLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciAgVGhlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBwY3MucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbGlzdGVuZXJzIHdoaWNoIGhhdmUgYmVlbiBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgbmFtZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgbGlzdGVuZWQgdG8KKyAgICAgKiBAcmV0dXJuIGFsbCBvZiB0aGUgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnM8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aAorICAgICAqICAgICAgICAgdGhlIG5hbWVkIHByb3BlcnR5LiAgSWYgbm8gc3VjaCBsaXN0ZW5lcnMgaGF2ZSBiZWVuIGFkZGVkLAorICAgICAqICAgICAgICAgb3IgaWYgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBpcyBudWxsLCBhbiBlbXB0eSBhcnJheSBpcworICAgICAqICAgICAgICAgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gcGNzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBObyBldmVudCBpcyBmaXJlZCBpZiBvbGQgYW5kIG5ldyBhcmUgZXF1YWwgYW5kIG5vbi1udWxsLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBtZXJlbHkgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbW9yZSBnZW5lcmFsCisgICAgICogZmlyZVByb3BlcnR5Q2hhbmdlIG1ldGhvZCB0aGF0IHRha2VzIHtAY29kZQorICAgICAqIFByb3BlcnR5Q2hhbmdlRXZlbnR9IHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2FzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG9sZFZhbHVlICBUaGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBwY3MuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlIGFuIGV4aXN0aW5nIFByb3BlcnR5Q2hhbmdlRXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIHRoZSBnaXZlbiBldmVudCdzIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUKKyAgICAgKiBlcXVhbCBhbmQgbm9uLW51bGwuCisgICAgICogQHBhcmFtIGV2dCAgVGhlIFByb3BlcnR5Q2hhbmdlRXZlbnQgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICBwY3MuZmlyZVByb3BlcnR5Q2hhbmdlKGV2dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXBvcnQgYSBib3VuZCBpbmRleGVkIHByb3BlcnR5IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZAorICAgICAqIGxpc3RlbmVycy4KKyAgICAgKiA8cD4KKyAgICAgKiBObyBldmVudCBpcyBmaXJlZCBpZiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGVxdWFsCisgICAgICogYW5kIG5vbi1udWxsLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBtZXJlbHkgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbW9yZSBnZW5lcmFsCisgICAgICogZmlyZVByb3BlcnR5Q2hhbmdlIG1ldGhvZCB0aGF0IHRha2VzIHtAY29kZSBQcm9wZXJ0eUNoYW5nZUV2ZW50fSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0CisgICAgICogICAgICAgICAgICAgICAgICAgICB3YXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gaW5kZXggICAgICAgIGluZGV4IG9mIHRoZSBwcm9wZXJ0eSBlbGVtZW50IHRoYXQgd2FzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG9sZFZhbHVlICAgICBUaGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgIGludCBpbmRleCwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgcGNzLmZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBpbmRleCwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eSwgaW5jbHVkaW5nCisgICAgICogdGhvc2UgcmVnaXN0ZXJlZCBvbiBhbGwgcHJvcGVydGllcy4gIElmIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4KKyAgICAgKiBpcyBudWxsLCBvbmx5IGNoZWNrIGZvciBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBvbiBhbGwgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgb25lIG9yIG1vcmUgbGlzdGVuZXJzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIHJldHVybiBwY3MuaGFzTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHksIGluY2x1ZGluZworICAgICAqIHRob3NlIHJlZ2lzdGVyZWQgb24gYWxsIHByb3BlcnRpZXMuICBJZiA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+CisgICAgICogaXMgbnVsbCwgb25seSBjaGVjayBmb3IgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgb24gYWxsIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICB0aGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIHByb3BlcnR5CisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzVmV0b2FibGVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICByZXR1cm4gdmNzLmhhc0xpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFZldG9hYmxlTGlzdGVuZXIgdG8gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICogVGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgZm9yIGFsbCBwcm9wZXJ0aWVzLgorICAgICAqIFRoZSBzYW1lIGxpc3RlbmVyIG9iamVjdCBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGFuZCB3aWxsIGJlIGNhbGxlZAorICAgICAqIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgYWRkZWQuCisgICAgICogSWYgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IGlzIG51bGwsIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIG5vIGFjdGlvbgorICAgICAqIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyICBUaGUgVmV0b2FibGVDaGFuZ2VMaXN0ZW5lciB0byBiZSBhZGRlZAorICAgICAqLworCisgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkVmV0b2FibGVDaGFuZ2VMaXN0ZW5lcihWZXRvYWJsZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHZjcy5hZGRWZXRvYWJsZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBWZXRvYWJsZUNoYW5nZUxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICogVGhpcyByZW1vdmVzIGEgVmV0b2FibGVDaGFuZ2VMaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkCisgICAgICogZm9yIGFsbCBwcm9wZXJ0aWVzLgorICAgICAqIElmIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UgdG8gdGhlIHNhbWUgZXZlbnQKKyAgICAgKiBzb3VyY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MgdGltZSBhZnRlciBiZWluZyByZW1vdmVkLgorICAgICAqIElmIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiBpcyBudWxsLCBvciB3YXMgbmV2ZXIgYWRkZWQsIG5vIGV4Y2VwdGlvbiBpcworICAgICAqIHRocm93biBhbmQgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyICBUaGUgVmV0b2FibGVDaGFuZ2VMaXN0ZW5lciB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlVmV0b2FibGVDaGFuZ2VMaXN0ZW5lcihWZXRvYWJsZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHZjcy5yZW1vdmVWZXRvYWJsZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIFZldG9hYmxlQ2hhbmdlTGlzdGVuZXJzLiBJZiBuYW1lZCB2ZXRvYWJsZSBjaGFuZ2UgbGlzdGVuZXJzCisgICAgICogd2VyZSBhZGRlZCwgdGhlbiBWZXRvYWJsZUNoYW5nZUxpc3RlbmVyUHJveHkgd3JhcHBlcnMgd2lsbCByZXR1cm5lZAorICAgICAqIDxwPgorICAgICAqIEByZXR1cm4gTGlzdCBvZiBWZXRvYWJsZUNoYW5nZUxpc3RlbmVycyBhbmQgVmV0b2FibGVDaGFuZ2VMaXN0ZW5lclByb3h5cworICAgICAqICAgICAgICAgaWYgbmFtZWQgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyB3ZXJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBWZXRvYWJsZUNoYW5nZUxpc3RlbmVyW10gZ2V0VmV0b2FibGVDaGFuZ2VMaXN0ZW5lcnMoKXsKKyAgICAgICAgcmV0dXJuIHZjcy5nZXRWZXRvYWJsZUNoYW5nZUxpc3RlbmVycygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFZldG9hYmxlQ2hhbmdlTGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuICBUaGUgbGlzdGVuZXIKKyAgICAgKiB3aWxsIGJlIGludm9rZWQgb25seSB3aGVuIGEgY2FsbCBvbiBmaXJlVmV0b2FibGVDaGFuZ2UgbmFtZXMgdGhhdAorICAgICAqIHNwZWNpZmljIHByb3BlcnR5LgorICAgICAqIFRoZSBzYW1lIGxpc3RlbmVyIG9iamVjdCBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UuICBGb3IgZWFjaAorICAgICAqIHByb3BlcnR5LCAgdGhlIGxpc3RlbmVyIHdpbGwgYmUgaW52b2tlZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyBhZGRlZAorICAgICAqIGZvciB0aGF0IHByb3BlcnR5LgorICAgICAqIElmIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gb3IgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IGlzIG51bGwsIG5vCisgICAgICogZXhjZXB0aW9uIGlzIHRocm93biBhbmQgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGxpc3RlbiBvbi4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgIFRoZSBWZXRvYWJsZUNoYW5nZUxpc3RlbmVyIHRvIGJlIGFkZGVkCisgICAgICovCisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRWZXRvYWJsZUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgVmV0b2FibGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB2Y3MuYWRkVmV0b2FibGVDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBWZXRvYWJsZUNoYW5nZUxpc3RlbmVyIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LgorICAgICAqIElmIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UgdG8gdGhlIHNhbWUgZXZlbnQKKyAgICAgKiBzb3VyY2UgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHksIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MgdGltZQorICAgICAqIGFmdGVyIGJlaW5nIHJlbW92ZWQuCisgICAgICogSWYgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBpcyBudWxsLCBubyBleGNlcHRpb24gaXMgdGhyb3duIGFuZCBubworICAgICAqIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKiBJZiA8Y29kZT5saXN0ZW5lcjwvY29kZT4gaXMgbnVsbCwgb3Igd2FzIG5ldmVyIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogcHJvcGVydHksIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBsaXN0ZW5lZCBvbi4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgIFRoZSBWZXRvYWJsZUNoYW5nZUxpc3RlbmVyIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZVZldG9hYmxlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICBWZXRvYWJsZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHZjcy5yZW1vdmVWZXRvYWJsZUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBsaXN0ZW5lcnMgd2hpY2ggaGF2ZSBiZWVuIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoZSBuYW1lZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBsaXN0ZW5lZCB0bworICAgICAqIEByZXR1cm4gYWxsIHRoZSA8Y29kZT5WZXRvYWJsZUNoYW5nZUxpc3RlbmVyczwvY29kZT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICogICAgICAgICB0aGUgbmFtZWQgcHJvcGVydHkuICBJZiBubyBzdWNoIGxpc3RlbmVycyBoYXZlIGJlZW4gYWRkZWQsCisgICAgICogICAgICAgICBvciBpZiA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IGlzIG51bGwsIGFuIGVtcHR5IGFycmF5IGlzCisgICAgICogICAgICAgICByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgVmV0b2FibGVDaGFuZ2VMaXN0ZW5lcltdIGdldFZldG9hYmxlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHZjcy5nZXRWZXRvYWJsZUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcG9ydCBhIHZldG9hYmxlIHByb3BlcnR5IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuICBJZgorICAgICAqIGFueW9uZSB2ZXRvcyB0aGUgY2hhbmdlLCB0aGVuIGZpcmUgYSBuZXcgZXZlbnQgcmV2ZXJ0aW5nIGV2ZXJ5b25lIHRvCisgICAgICogdGhlIG9sZCB2YWx1ZSBhbmQgdGhlbiByZXRocm93IHRoZSBQcm9wZXJ0eVZldG9FeGNlcHRpb24uCisgICAgICogPHA+CisgICAgICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgb2xkIGFuZCBuZXcgYXJlIGVxdWFsIGFuZCBub24tbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGFib3V0IHRvIGNoYW5nZS4uCisgICAgICogQHBhcmFtIG9sZFZhbHVlICBUaGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBleGNlcHRpb24gUHJvcGVydHlWZXRvRXhjZXB0aW9uIGlmIHRoZSByZWNpcGllbnQgd2lzaGVzIHRoZSBwcm9wZXJ0eQorICAgICAqICAgICAgICAgICAgICBjaGFuZ2UgdG8gYmUgcm9sbGVkIGJhY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVZldG9hYmxlQ2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUHJvcGVydHlWZXRvRXhjZXB0aW9uIHsKKyAgICAgICAgIHZjcy5maXJlVmV0b2FibGVDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmUgYSB2ZXRvYWJsZSBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLiAgSWYKKyAgICAgKiBhbnlvbmUgdmV0b3MgdGhlIGNoYW5nZSwgdGhlbiBmaXJlIGEgbmV3IGV2ZW50IHJldmVydGluZyBldmVyeW9uZSB0bworICAgICAqIHRoZSBvbGQgdmFsdWUgYW5kIHRoZW4gcmV0aHJvdyB0aGUgUHJvcGVydHlWZXRvRXhjZXB0aW9uLgorICAgICAqIDxwPgorICAgICAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIG9sZCBhbmQgbmV3IGFyZSBlcXVhbCBhbmQgbm9uLW51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZ0ICBUaGUgUHJvcGVydHlDaGFuZ2VFdmVudCB0byBiZSBmaXJlZC4KKyAgICAgKiBAZXhjZXB0aW9uIFByb3BlcnR5VmV0b0V4Y2VwdGlvbiBpZiB0aGUgcmVjaXBpZW50IHdpc2hlcyB0aGUgcHJvcGVydHkKKyAgICAgKiAgICAgICAgICAgICAgY2hhbmdlIHRvIGJlIHJvbGxlZCBiYWNrLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVWZXRvYWJsZUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFByb3BlcnR5VmV0b0V4Y2VwdGlvbiB7CisgICAgICAgIHZjcy5maXJlVmV0b2FibGVDaGFuZ2UoZXZ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBBYnN0cmFjdEJlYW4gcmVzdWx0ID0gKEFic3RyYWN0QmVhbikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgcmVzdWx0LnBjcyA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0LnZjcyA9IG5ldyBWZXRvYWJsZUNoYW5nZVN1cHBvcnQocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0JlemllckNvbnRyb2xQb2ludC5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9CZXppZXJDb250cm9sUG9pbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTJiYzRlCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9CZXppZXJDb250cm9sUG9pbnQuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyOworCitpbXBvcnQgamF2YS5hd3QuQmFzaWNTdHJva2U7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5TaGFwZTsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLkVsbGlwc2UyRDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLkdlbmVyYWxQYXRoOworaW1wb3J0IGphdmEuYXd0Lmdlb20uTGluZTJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQmV6aWVyQ29udHJvbFBvaW50CisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoTWF5IDI5LCAyMDA3KQorICovCitwdWJsaWMgY2xhc3MgQmV6aWVyQ29udHJvbFBvaW50IGV4dGVuZHMgQ29udHJvbFBvaW50IHsKKyAgICBwcml2YXRlIEhhbmRsZUNvbnRyb2xQb2ludCBjcDEgPSBuZXcgSGFuZGxlQ29udHJvbFBvaW50KCk7CisgICAgcHJpdmF0ZSBIYW5kbGVDb250cm9sUG9pbnQgY3AyID0gbmV3IEhhbmRsZUNvbnRyb2xQb2ludCgpOworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gbWFraW5nQ2hhbmdlID0gZmFsc2U7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjcExpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisvLyAgICAgICAgICAgIGlmICghbWFraW5nQ2hhbmdlKSB7CisvLyAgICAgICAgICAgICAgICBtYWtpbmdDaGFuZ2UgPSB0cnVlOworLy8gICAgICAgICAgICAgICAgaWYgKGV2dC5nZXRTb3VyY2UoKSA9PSBjcDEpIHsKKy8vICAgICAgICAgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBNYXRoLnRhbigoY3AxLmdldFkoKSAtIGdldFkoKSkvKGNwMS5nZXRYKCkgLSBnZXRYKCkpKTsKKy8vICAgICAgICAgICAgICAgICAgICBkb3VibGUgY3AybGVuID0gTWF0aC5zcXJ0KAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5wb3coY3AyLmdldFgoKSAtIGdldFgoKSwyKSArCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyhjcDIuZ2V0WSgpIC0gZ2V0WSgpLDIpCisvLyAgICAgICAgICAgICAgICAgICAgKTsKKy8vICAgICAgICAgICAgICAgICAgICBkb3VibGUgb2Zmc2V0WCA9IGNwMmxlbiAqIE1hdGguc2luKGFuZ2xlKTsKKy8vICAgICAgICAgICAgICAgICAgICBkb3VibGUgb2Zmc2V0WSA9IGNwMmxlbiAqIE1hdGguY29zKGFuZ2xlKTsKKy8vICAgICAgICAgICAgICAgICAgICBjcDIuc2V0UG9zaXRpb24oZ2V0WCgpIC0gb2Zmc2V0WCwgZ2V0WSgpIC0gb2Zmc2V0WSk7CisvLyAgICAgICAgICAgICAgICB9IGVsc2UgeworLy8gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IE1hdGgudGFuKChjcDIuZ2V0WSgpIC0gZ2V0WSgpKS8oY3AyLmdldFgoKSAtIGdldFgoKSkpOworLy8gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjcDFsZW4gPSBNYXRoLnNxcnQoCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyhjcDEuZ2V0WCgpIC0gZ2V0WCgpLDIpICsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucG93KGNwMS5nZXRZKCkgLSBnZXRZKCksMikKKy8vICAgICAgICAgICAgICAgICAgICApOworLy8gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gY3AxbGVuICogTWF0aC5zaW4oYW5nbGUpOworLy8gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRZID0gY3AxbGVuICogTWF0aC5jb3MoYW5nbGUpOworLy8gICAgICAgICAgICAgICAgICAgIGNwMS5zZXRQb3NpdGlvbihnZXRYKCkgLSBvZmZzZXRYLCBnZXRZKCkgLSBvZmZzZXRZKTsKKy8vICAgICAgICAgICAgICAgIH0KKy8vLy8gICAgICAgICAgICAgICAgaWYgKGV2dC5nZXRTb3VyY2UoKSA9PSBjcDEpIHsKKy8vLy8gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gY3AxLmdldFgoKSAtIGdldFgoKTsKKy8vLy8gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRZID0gY3AxLmdldFkoKSAtIGdldFkoKTsKKy8vLy8gICAgICAgICAgICAgICAgICAgIGNwMi5zZXRQb3NpdGlvbihnZXRYKCkgLSBvZmZzZXRYLCBnZXRZKCkgLSBvZmZzZXRZKTsKKy8vLy8gICAgICAgICAgICAgICAgfSBlbHNlIHsKKy8vLy8gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gY3AyLmdldFgoKSAtIGdldFgoKTsKKy8vLy8gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRZID0gY3AyLmdldFkoKSAtIGdldFkoKTsKKy8vLy8gICAgICAgICAgICAgICAgICAgIGNwMS5zZXRQb3NpdGlvbihnZXRYKCkgLSBvZmZzZXRYLCBnZXRZKCkgLSBvZmZzZXRZKTsKKy8vLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgbWFraW5nQ2hhbmdlID0gZmFsc2U7CisvLyAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImNwMSIsIG51bGwsIGNwMSk7CisvLyAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImNwMiIsIG51bGwsIGNwMSk7CisvLyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgic2hhcGUiLG51bGwsZ2V0U2hhcGUoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIEJlemllckNvbnRyb2xQb2ludCgpIHsKKyAgICAgICAgY3AxLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY3BMaXN0ZW5lcik7CisgICAgICAgIGNwMi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGNwTGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyBCZXppZXJDb250cm9sUG9pbnQoZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgICAgICAgIHN1cGVyKHgsIHkpOworICAgICAgICBjcDEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihjcExpc3RlbmVyKTsKKyAgICAgICAgY3AyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY3BMaXN0ZW5lcik7CisgICAgICAgIGNwMS5zZXRQb3NpdGlvbih4LCB5KTsKKyAgICAgICAgY3AyLnNldFBvc2l0aW9uKHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hhcnBDb3JuZXIoKSB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIChjcDEuZ2V0WCgpID09IHguZ2V0VmFsdWUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjcDEuZ2V0WSgpID09IHkuZ2V0VmFsdWUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjcDIuZ2V0WCgpID09IHguZ2V0VmFsdWUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjcDIuZ2V0WSgpID09IHkuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmxpcChpbnQgd2lkdGgsIGludCBoZWlnaHQpeworICAgICAgICBtYWtpbmdDaGFuZ2UgPSB0cnVlOworICAgICAgICBpZiAod2lkdGggPiAwKXsKKyAgICAgICAgICAgIHguc2V0VmFsdWUod2lkdGggLSB4LmdldFZhbHVlKCkpOworICAgICAgICAgICAgY3AxLnguc2V0VmFsdWUod2lkdGggLSBjcDEueC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGNwMi54LnNldFZhbHVlKHdpZHRoIC0gY3AyLnguZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlaWdodCA+IDApeworICAgICAgICAgICAgeS5zZXRWYWx1ZShoZWlnaHQgLSB5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgY3AxLnkuc2V0VmFsdWUoaGVpZ2h0IC0gY3AxLnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBjcDIueS5zZXRWYWx1ZShoZWlnaHQgLSBjcDIueS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBtYWtpbmdDaGFuZ2UgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb252ZXJ0VG9TaGFycENvcm5lcigpIHsKKyAgICAgICAgY3AxLnNldFBvc2l0aW9uKHguZ2V0VmFsdWUoKSwgeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgY3AyLnNldFBvc2l0aW9uKHguZ2V0VmFsdWUoKSwgeS5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxDb250cm9sUG9pbnQ+IGdldENvbnRyb2xQb2ludHMoKSB7CisgICAgICAgIGlmIChpc1NoYXJwQ29ybmVyKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExpc3Q8Q29udHJvbFBvaW50PiBwb2ludHMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xQb2ludD4oKTsKKyAgICAgICAgICAgIHBvaW50cy5hZGQoY3AxKTsKKyAgICAgICAgICAgIHBvaW50cy5hZGQoY3AyKTsKKyAgICAgICAgICAgIHJldHVybiBwb2ludHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSGFuZGxlQ29udHJvbFBvaW50IGdldENwMSgpIHsKKyAgICAgICAgcmV0dXJuIGNwMTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGFuZGxlQ29udHJvbFBvaW50IGdldENwMigpIHsKKyAgICAgICAgcmV0dXJuIGNwMjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2xzKEdyYXBoaWNzMkQgZzIsIGRvdWJsZSBwaXhlbFNpemUsIGJvb2xlYW4gcGFpbnRDb250cm9sTGluZXMpIHsKKyAgICAgICAgZzIuc2V0U3Ryb2tlKG5ldyBCYXNpY1N0cm9rZSgoZmxvYXQpIHBpeGVsU2l6ZSkpOworICAgICAgICAvLyBwYWludCBjb250cm9sIGxpbmUKKyAgICAgICAgZzIuc2V0Q29sb3IoR3JhcGhpY3NIZWxwZXIuQkVaSUVSX0NPTlRST0xfTElORSk7CisgICAgICAgIGcyLmRyYXcobmV3IExpbmUyRC5Eb3VibGUoY3AxLmdldFgoKSwgY3AxLmdldFkoKSwgZ2V0WCgpLCBnZXRZKCkpKTsKKyAgICAgICAgZzIuZHJhdyhuZXcgTGluZTJELkRvdWJsZShnZXRYKCksIGdldFkoKSwgY3AyLmdldFgoKSwgY3AyLmdldFkoKSkpOworICAgICAgICAvLyBwYWludCB0aGlzIGNvbnRyb2wgcG9pbnQKKyAgICAgICAgU2hhcGUgczsKKyAgICAgICAgaWYgKGlzU2hhcnBDb3JuZXIoKSkgeworICAgICAgICAgICAgZG91YmxlIHNpemUgPSBwaXhlbFNpemUgKiA0ZDsKKyAgICAgICAgICAgIEdlbmVyYWxQYXRoIHBhdGggPSBuZXcgR2VuZXJhbFBhdGgoKTsKKyAgICAgICAgICAgIHBhdGgubW92ZVRvKGdldFgoKSAtIHNpemUsIGdldFkoKSk7CisgICAgICAgICAgICBwYXRoLmxpbmVUbyhnZXRYKCksIGdldFkoKSArIHNpemUpOworICAgICAgICAgICAgcGF0aC5saW5lVG8oZ2V0WCgpICsgc2l6ZSwgZ2V0WSgpKTsKKyAgICAgICAgICAgIHBhdGgubGluZVRvKGdldFgoKSwgZ2V0WSgpIC0gc2l6ZSk7CisgICAgICAgICAgICBwYXRoLmNsb3NlUGF0aCgpOworICAgICAgICAgICAgcyA9IHBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgc2l6ZSA9IHBpeGVsU2l6ZSAqIDNkOworICAgICAgICAgICAgcyA9IG5ldyBFbGxpcHNlMkQuRG91YmxlKGdldFgoKSAtIHNpemUsIGdldFkoKSAtIHNpemUsCisgICAgICAgICAgICAgICAgICAgIHNpemUgKiAyLCBzaXplICogMik7CisgICAgICAgIH0KKyAgICAgICAgZzIuc2V0Q29sb3IoR3JhcGhpY3NIZWxwZXIuQkVaSUVSX0NPTlRST0xfUE9JTlRfRklMTCk7CisgICAgICAgIGcyLmZpbGwocyk7CisgICAgICAgIGcyLnNldENvbG9yKEdyYXBoaWNzSGVscGVyLkJFWklFUl9DT05UUk9MX1BPSU5UX0xJTkUpOworICAgICAgICBnMi5kcmF3KHMpOworICAgICAgICAvLyBwYWludCBjaGlsZCBjb250cm9sIHBvaW50cworICAgICAgICBpZiAoIWlzU2hhcnBDb3JuZXIoKSkgeworICAgICAgICAgICAgY3AxLnBhaW50Q29udHJvbHMoZzIsIHBpeGVsU2l6ZSwgdHJ1ZSk7CisgICAgICAgICAgICBjcDIucGFpbnRDb250cm9scyhnMiwgcGl4ZWxTaXplLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgbW92ZShkb3VibGUgbW92ZVgsIGRvdWJsZSBtb3ZlWSwgYm9vbGVhbiBzbmFwUGl4ZWxzKSB7CisgICAgICAgIG1ha2luZ0NoYW5nZSA9IHRydWU7CisgICAgICAgIHN1cGVyLm1vdmUobW92ZVgsIG1vdmVZLCBzbmFwUGl4ZWxzKTsKKyAgICAgICAgY3AxLm1vdmUobW92ZVgsIG1vdmVZLCBzbmFwUGl4ZWxzKTsKKyAgICAgICAgY3AyLm1vdmUobW92ZVgsIG1vdmVZLCBzbmFwUGl4ZWxzKTsKKyAgICAgICAgbWFraW5nQ2hhbmdlID0gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRDcDFYKCkgeworICAgICAgICByZXR1cm4gY3AxLmdldFgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDcDFYKGRvdWJsZSB2KSB7CisgICAgICAgIGNwMS5zZXRYKHYpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0Q3AxWSgpIHsKKyAgICAgICAgcmV0dXJuIGNwMS5nZXRZKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3AxWShkb3VibGUgdikgeworICAgICAgICBjcDEuc2V0WSh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldENwMlgoKSB7CisgICAgICAgIHJldHVybiBjcDIuZ2V0WCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENwMlgoZG91YmxlIHYpIHsKKyAgICAgICAgY3AyLnNldFgodik7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRDcDJZKCkgeworICAgICAgICByZXR1cm4gY3AyLmdldFkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDcDJZKGRvdWJsZSB2KSB7CisgICAgICAgIGNwMi5zZXRZKHYpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQmV6aWVyIGhhbmRsZSBjb250cm9sIHBvaW50CisKKyAgICBwdWJsaWMgY2xhc3MgSGFuZGxlQ29udHJvbFBvaW50IGV4dGVuZHMgQ29udHJvbFBvaW50IHsKKworICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2xzKEdyYXBoaWNzMkQgZzIsIGRvdWJsZSBwaXhlbFNpemUsIGJvb2xlYW4gcGFpbnRDb250cm9sTGluZXMpIHsKKyAgICAgICAgICAgIGlmICghaXNTaGFycCgpKXsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2l6ZSA9IHBpeGVsU2l6ZSAqIDNkOworICAgICAgICAgICAgICAgIFNoYXBlIHMgPSBuZXcgRWxsaXBzZTJELkRvdWJsZShnZXRYKCkgLSBzaXplLCBnZXRZKCkgLSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAqIDIsIHNpemUgKiAyKTsKKyAgICAgICAgICAgICAgICBnMi5zZXRDb2xvcihHcmFwaGljc0hlbHBlci5CRVpJRVJfQ09OVFJPTF9QT0lOVF9GSUxMKTsKKyAgICAgICAgICAgICAgICBnMi5maWxsKHMpOworICAgICAgICAgICAgICAgIGcyLnNldENvbG9yKEdyYXBoaWNzSGVscGVyLkJFWklFUl9DT05UUk9MX1BPSU5UX0xJTkUpOworICAgICAgICAgICAgICAgIGcyLmRyYXcocyk7CisgICAgICAgICAgICAgICAgZzIuZHJhdyhuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKGdldFgoKSAtIChwaXhlbFNpemUgLyAyKSwgZ2V0WSgpIC0gKHBpeGVsU2l6ZSAvIDIpLCBwaXhlbFNpemUsIHBpeGVsU2l6ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNIaXQoUG9pbnQyRCBwLCBkb3VibGUgcGl4ZWxTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gIWlzU2hhcnAoKSAmJiBzdXBlci5pc0hpdChwLCBwaXhlbFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElzIHRoZSBsaW5lIGNvbnRyb2xlZCBieSB0aGlzIGhhbmRsZSBpbiBvciBvdXQgb2YgdGhlIHBhcmVudCBCZXppZXJDb250cm9sUG9pbnQgc2hhcnAuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gSWYgdGhpcyBpcyB0aGUgZXhhY3Qgc2FtZSBwb2ludCBhcyB0aGUgcGFyZW50IEJlemllckNvbnRyb2xQb2ludC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hhcnAoKXsKKyAgICAgICAgICAgIHJldHVybiB4LmdldFZhbHVlKCkgPT0gQmV6aWVyQ29udHJvbFBvaW50LnRoaXMueC5nZXRWYWx1ZSgpICYmCisgICAgICAgICAgICAgICAgeS5nZXRWYWx1ZSgpID09IEJlemllckNvbnRyb2xQb2ludC50aGlzLnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnZlcnRUb1NoYXJwKCl7CisgICAgICAgICAgICBzZXRQb3NpdGlvbihCZXppZXJDb250cm9sUG9pbnQudGhpcy54LmdldFZhbHVlKCksQmV6aWVyQ29udHJvbFBvaW50LnRoaXMueS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCZXppZXJDb250cm9sUG9pbnQgZ2V0UGFyZW50Q29udHJvbFBvaW50KCl7CisgICAgICAgICAgICByZXR1cm4gQmV6aWVyQ29udHJvbFBvaW50LnRoaXM7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvQmxlbmRpbmdNb2RlLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0JsZW5kaW5nTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTdkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0JsZW5kaW5nTW9kZS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXI7CisKKworLyoqCisgKiBCbGVuZGluZ01vZGUgLSBFbnVtIG9mIGNvbXBvc2l0ZSBibGVuZGluZyBtb2Rlcywgc2V0dXAgdG8gbWF0Y2ggcGhvdG9zaG9wIGFzIGNsb3NlbHkgYXMgcG9zc2libGUKKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChNYXkgMzEsIDIwMDcpCisgKi8KK3B1YmxpYyBlbnVtIEJsZW5kaW5nTW9kZSB7CisgICAgTk9STUFMLAorICAgIC8vIERJU1NPTFZFLCBtaXNzaW5nCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBEQVJLRU4sCisgICAgTVVMVElQTFksCisgICAgQ09MT1JfQlVSTiwKKyAgICBMSU5FQVJfQlVSTiwgLy8gKFNVQlRSQUNUKQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTElHSFRFTiwKKyAgICBTQ1JFRU4sCisgICAgQ09MT1JfRE9ER0UsCisgICAgTElORUFSX0RPREdFLCAvLyAoQUREKQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgT1ZFUkxBWSwKKyAgICBTT0ZUX0xJR0hULAorICAgIEhBUkRfTElHSFQsCisgICAgVklWSURfTElHSFQsIC8vIChIRUFUKSBpcyBjbG9zZQorICAgIExJTkVBUl9MSUdIVCwgLy8gKEdMT1cpIGlzIGNsb3NlCisgICAgLy9QSU5fTElHSFQsIG1pc3NpbmcKKyAgICAvL0hBUkRfTUlYLCBtaXNzaW5nCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBESUZGRVJFTkNFLAorICAgIEVYQ0xVU0lPTiwKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEhVRSwgLy8gbm93aGVyZSBjbG9zZQorICAgIFNBVFVSQVRJT04sCisgICAgQ09MT1IsCisgICAgTFVNSU5PU0lUWSwgLy8gY2xvc2UgYnV0IG5vdCBleGFjdAorICAgIC8vTElHSFRFUl9DT0xPUiwgbWlzc2luZworICAgIC8vREFSS0VSX0NPTE9SLCBtaXNzaW5nCisgICAgOworCisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEhlbHBlciBtZXRob2RzIGZvciBjcmVhdGluZyBCbGVuZGluZyBNb2RlIENvbWJvIEJveAorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBCTEVORElOR19NT0RFUyA9IG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5OT1JNQUwsCisgICAgICAgICAgICAvLyBESVNTT0xWRSwgbWlzc2luZworICAgICAgICAgICAgIi0iLAorICAgICAgICAgICAgQmxlbmRpbmdNb2RlLkRBUktFTiwKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5NVUxUSVBMWSwKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5DT0xPUl9CVVJOLAorICAgICAgICAgICAgQmxlbmRpbmdNb2RlLkxJTkVBUl9CVVJOLCAvLyAoU1VCVFJBQ1QpCisgICAgICAgICAgICAiLSIsCisgICAgICAgICAgICBCbGVuZGluZ01vZGUuTElHSFRFTiwKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5TQ1JFRU4sCisgICAgICAgICAgICBCbGVuZGluZ01vZGUuQ09MT1JfRE9ER0UsCisgICAgICAgICAgICBCbGVuZGluZ01vZGUuTElORUFSX0RPREdFLCAvLyAoQUREKQorICAgICAgICAgICAgIi0iLAorICAgICAgICAgICAgQmxlbmRpbmdNb2RlLk9WRVJMQVksCisgICAgICAgICAgICBCbGVuZGluZ01vZGUuU09GVF9MSUdIVCwKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5IQVJEX0xJR0hULAorICAgICAgICAgICAgQmxlbmRpbmdNb2RlLlZJVklEX0xJR0hULCAvLyAoSEVBVCkgaXMgY2xvc2UKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5MSU5FQVJfTElHSFQsIC8vIChHTE9XKSBpcyBjbG9zZQorICAgICAgICAgICAgLy9QSU5fTElHSFQsIG1pc3NpbmcKKyAgICAgICAgICAgIC8vSEFSRF9NSVgsIG1pc3NpbmcKKyAgICAgICAgICAgICItIiwKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5ESUZGRVJFTkNFLAorICAgICAgICAgICAgQmxlbmRpbmdNb2RlLkVYQ0xVU0lPTiwKKyAgICAgICAgICAgICItIiwKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5IVUUsIC8vIG5vd2hlcmUgY2xvc2UKKyAgICAgICAgICAgIEJsZW5kaW5nTW9kZS5TQVRVUkFUSU9OLAorICAgICAgICAgICAgQmxlbmRpbmdNb2RlLkNPTE9SLAorICAgICAgICAgICAgQmxlbmRpbmdNb2RlLkxVTUlOT1NJVFksIC8vIGNsb3NlIGJ1dCBub3QgZXhhY3QKKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9DYW52YXMuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvQ2FudmFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmOWNjNgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvQ2FudmFzLmphdmEKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lcjsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5iZWFucy5BYnN0cmFjdEJlYW47CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlscy5IYXNSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlscy5IYXNVSURlZmF1bHRzOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxpbmdDb250ZXh0OworCitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKK2ltcG9ydCBqYXZhLmF3dC5BbHBoYUNvbXBvc2l0ZTsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5JbnNldHM7CitpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQ29tcG9uZW50UmVnaW9uCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoTWF5IDIyLCAyMDA3KQorICovCitwdWJsaWMgY2xhc3MgQ2FudmFzIGV4dGVuZHMgQWJzdHJhY3RCZWFuIGltcGxlbWVudHMgTGF5ZXJDb250YWluZXIsIEhhc1VJRGVmYXVsdHMsIEhhc1Jlc291cmNlcyB7CisgICAgcHJpdmF0ZSBEaW1lbnNpb24gc2l6ZTsKKyAgICAvKiogbGlzdCBvZiBhbGwgbGF5ZXJzIGluIHRoZSBjYW52YXMsIHRoZSBmaXJzdCBsYXllciBpcyBwYWludGVkIG9uIHRvcCAqLworICAgIHByaXZhdGUgTGlzdDxMYXllcj4gbGF5ZXJzOworICAgIHByaXZhdGUgaW50IG5leHRMYXllck5hbWVJbmRleCA9IDE7CisgICAgcHJpdmF0ZSBCdWZmZXJlZEltYWdlIGJ1ZmZlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOworICAgIHByaXZhdGUgSW5zZXRzIHN0cmV0Y2hpbmdJbnNldHMgPSBudWxsOworICAgIHByaXZhdGUgTGF5ZXIgd29ya2luZ0xheWVyID0gbnVsbDsKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGF5ZXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKyAgICBwcml2YXRlIFVJRGVmYXVsdHMgY2FudmFzVUlEZWZhdWx0cyA9IG51bGw7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRmlsZSByZXNvdXJjZXNEaXI7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRmlsZSBpbWFnZXNEaXI7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRmlsZSB0ZW1wbGF0ZXNEaXI7CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIENvbnN0cnVjdG9yCisKKyAgICAvKiogUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgSklCWCAqLworICAgIHByb3RlY3RlZCBDYW52YXMoKSB7CisgICAgICAgIGxheWVyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vIHBhc3Mgb24gbGF5ZXIgY2hhbmdlCisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbGF5ZXJzLmluZGV4T2YoKExheWVyKSBldnQuZ2V0U291cmNlKCkpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImxheWVyc1siICsgaW5kZXggKyAiXS4iICsgZXZ0LmdldFByb3BlcnR5TmFtZSgpLCBldnQuZ2V0T2xkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBDYW52YXMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIHRoaXMoKTsKKyAgICAgICAgc3RyZXRjaGluZ0luc2V0cyA9IG5ldyBJbnNldHMoMSwgMSwgMSwgMSk7CisgICAgICAgIGxheWVycyA9IG5ldyBBcnJheUxpc3Q8TGF5ZXI+KCk7CisgICAgICAgIHNldFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIGFkZExheWVyKG5ldyBMYXllcigpKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEpJQlggTWV0aG9kcworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpJQlggYmVmb3JlIGFsbCBmaWVsZHMgaGF2ZSBiZWVuIHNldAorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIEpJQlggVW5tYXJzaGFsbGluZyBDb250ZXh0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZVNldChJVW5tYXJzaGFsbGluZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICBjYW52YXNVSURlZmF1bHRzID0gKFVJRGVmYXVsdHMpIGNvbnRleHQuZ2V0VXNlckNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEJlYW4gTWV0aG9kcworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBVSURlZmF1bHRzIGZvciB0aGlzIGNhbnZhcy4gVGhlIFVJRGVmYXVsdHMgaXMgdXNlZCB0byBzdG9yZSBkZWZhdWx0IHBhbGxldCBvZiBjb2xvcnMsIGZvbnRzIGV0Yy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ2FudmFzIFVJRGVmYXVsdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgVUlEZWZhdWx0cyBnZXRVaURlZmF1bHRzKCkgeworICAgICAgICByZXR1cm4gY2FudmFzVUlEZWZhdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVJRGVmYXVsdHMgZm9yIHRoaXMgY2FudmFzLiBUaGUgVUlEZWZhdWx0cyBpcyB1c2VkIHRvIHN0b3JlIGRlZmF1bHQgcGFsbGV0IG9mIGNvbG9ycywgZm9udHMgZXRjLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbnZhc1VJRGVmYXVsdHMgQ2FudmFzIFVJRGVmYXVsdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVaURlZmF1bHRzKFVJRGVmYXVsdHMgY2FudmFzVUlEZWZhdWx0cykgeworICAgICAgICB0aGlzLmNhbnZhc1VJRGVmYXVsdHMgPSBjYW52YXNVSURlZmF1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCB3b3JraW5nIGxheWVyLCBpcyBpcyB0aGUgbGF5ZXIgdGhhdCBuZXcgc2hhcGVzIHdpbGwgYmUgZHJhd24gaW50bworICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCB3b3JraW5nIGxheWVyLCBtYXkgYmUgbnVsbCBpZiB0aGVyZSBpcyBubyB3b3JraW5nIGxheWVyCisgICAgICovCisgICAgcHVibGljIExheWVyIGdldFdvcmtpbmdMYXllcigpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtpbmdMYXllcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgd29ya2luZyBsYXllciwgaXMgaXMgdGhlIGxheWVyIHRoYXQgbmV3IHNoYXBlcyB3aWxsIGJlIGRyYXduIGludG8KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JraW5nTGF5ZXIgdGhlIG5ldyB3b3JraW5nIGxheWVyLCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhpcyBjYW52YXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JraW5nTGF5ZXIoTGF5ZXIgd29ya2luZ0xheWVyKSB7CisgICAgICAgIExheWVyIG9sZCA9IGdldFdvcmtpbmdMYXllcigpOworICAgICAgICB0aGlzLndvcmtpbmdMYXllciA9IHdvcmtpbmdMYXllcjsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ3b3JraW5nTGF5ZXIiLCBvbGQsIGdldFdvcmtpbmdMYXllcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE5leHRMYXllck5hbWVJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIG5leHRMYXllck5hbWVJbmRleCsrOworICAgIH0KKworICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gc2l6ZSkgeworICAgICAgICBEaW1lbnNpb24gb2xkID0gZ2V0U2l6ZSgpOworICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgICBidWZmZXIgPSBuZXcgQnVmZmVyZWRJbWFnZSh0aGlzLnNpemUud2lkdGgsIHRoaXMuc2l6ZS5oZWlnaHQsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQik7CisgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzaXplIiwgb2xkLCBnZXRTaXplKCkpOworICAgIH0KKworCisgICAgcHVibGljIEluc2V0cyBnZXRTdHJldGNoaW5nSW5zZXRzKCkgeworICAgICAgICByZXR1cm4gc3RyZXRjaGluZ0luc2V0czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJldGNoaW5nSW5zZXRzKEluc2V0cyBzdHJldGNoaW5nSW5zZXRzKSB7CisgICAgICAgIEluc2V0cyBvbGQgPSBnZXRTdHJldGNoaW5nSW5zZXRzKCk7CisgICAgICAgIHRoaXMuc3RyZXRjaGluZ0luc2V0cyA9IHN0cmV0Y2hpbmdJbnNldHM7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgic3RyZXRjaGluZ0luc2V0cyIsIG9sZCwgZ2V0U3RyZXRjaGluZ0luc2V0cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBnZXRSZW5kZXJlZEltYWdlKCkgeworICAgICAgICBpZiAoIWlzVmFsaWQpIHsKKyAgICAgICAgICAgIEdyYXBoaWNzMkQgZzIgPSBidWZmZXIuY3JlYXRlR3JhcGhpY3MoKTsKKyAgICAgICAgICAgIC8vIGNsZWFyCisgICAgICAgICAgICBnMi5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOworICAgICAgICAgICAgZzIuZmlsbFJlY3QoMCwgMCwgYnVmZmVyLmdldFdpZHRoKCksIGJ1ZmZlci5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAvLyBwYWludAorICAgICAgICAgICAgZzIuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfQU5USUFMSUFTSU5HLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9BTlRJQUxJQVNfT04pOworICAgICAgICAgICAgZzIuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLlNyY092ZXIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxheWVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGxheWVycy5nZXQoaSkucGFpbnQoZzIsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZzIuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgQ2FudmFzIGhhcyBub3QgYmVlbiBlZGl0ZWQuCisgICAgICogICAgICAgICA8cC8+CisgICAgICogICAgICAgICBUT0RPIEN1cnJlbnRseSB0aGlzIGlzIG5vdCBhIGJvdW5kIHByb3BlcnR5LCBidXQgc2hvdWxkIGJlLiBUaGF0IGlzLCB3aGVuIHRoZSBDYW52YXMgYmVjb21lcyBlZGl0ZWQKKyAgICAgKiAgICAgICAgICh1c3VhbGx5IGR1ZSB0byB0aGUgTGF5ZXIgaGF2aW5nIGEgc2hhcGUgYWRkZWQgdG8gaXQpLCB0aGVuIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHNob3VsZCBiZSBmaXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JsYW5rKCkgeworICAgICAgICByZXR1cm4gbGF5ZXJzLnNpemUoKSA9PSAwIHx8IChsYXllcnMuc2l6ZSgpID09IDEgJiYgbGF5ZXJzLmdldCgwKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldFJlc291cmNlc0RpcigpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlc0RpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXNEaXIoRmlsZSByZXNvdXJjZXNEaXIpIHsKKyAgICAgICAgRmlsZSBvbGQgPSBnZXRSZXNvdXJjZXNEaXIoKTsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXNEaXIgPSByZXNvdXJjZXNEaXI7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicmVzb3VyY2VzRGlyIiwgb2xkLCBnZXRSZXNvdXJjZXNEaXIoKSk7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0SW1hZ2VzRGlyKCkgeworICAgICAgICByZXR1cm4gaW1hZ2VzRGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlc0RpcihGaWxlIGltYWdlc0RpcikgeworICAgICAgICBGaWxlIG9sZCA9IGdldEltYWdlc0RpcigpOworICAgICAgICB0aGlzLmltYWdlc0RpciA9IGltYWdlc0RpcjsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJpbWFnZXNEaXIiLCBvbGQsIGdldEltYWdlc0RpcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRUZW1wbGF0ZXNEaXIoKSB7CisgICAgICAgIHJldHVybiB0ZW1wbGF0ZXNEaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVtcGxhdGVzRGlyKEZpbGUgdGVtcGxhdGVzRGlyKSB7CisgICAgICAgIEZpbGUgb2xkID0gZ2V0VGVtcGxhdGVzRGlyKCk7CisgICAgICAgIHRoaXMudGVtcGxhdGVzRGlyID0gdGVtcGxhdGVzRGlyOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInRlbXBsYXRlc0RpciIsIG9sZCwgZ2V0VGVtcGxhdGVzRGlyKCkpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gTGF5ZXJDb250YWluZXIgTWV0aG9kcworCisgICAgcHVibGljIExheWVyQ29udGFpbmVyIGdldFBhcmVudCgpIHsKKyAgICAgICAgLy8gd2UgYXJlIHJvb3Qgc28gbnVsbAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRMYXllclRvQm90dG9tKExheWVyIGxheWVyKSB7CisgICAgICAgIGxheWVycy5hZGQobGF5ZXIpOworICAgICAgICBsYXllci5zZXRQYXJlbnQodGhpcyk7CisgICAgICAgIGxheWVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGF5ZXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIC8vIG5vIHNpbmdsZSBsYXllciBjaGFuZ2VzIHNvIGZpcmUgYWxsIGNoYW5nZWQgZXZlbnQKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJsYXllcnMiLCBudWxsLCBsYXllcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZExheWVyKGludCBpLCBMYXllciBsYXllcikgeworICAgICAgICBsYXllcnMuYWRkKGksIGxheWVyKTsKKyAgICAgICAgbGF5ZXIuc2V0UGFyZW50KHRoaXMpOworICAgICAgICBsYXllci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxheWVyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworICAgICAgICAvLyBubyBzaW5nbGUgbGF5ZXIgY2hhbmdlcyBzbyBmaXJlIGFsbCBjaGFuZ2VkIGV2ZW50CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgibGF5ZXJzIiwgbnVsbCwgbGF5ZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRMYXllcihMYXllciBsYXllcikgeworICAgICAgICBsYXllcnMuYWRkKDAsIGxheWVyKTsKKyAgICAgICAgbGF5ZXIuc2V0UGFyZW50KHRoaXMpOworICAgICAgICBsYXllci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxheWVyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworICAgICAgICAvLyBubyBzaW5nbGUgbGF5ZXIgY2hhbmdlcyBzbyBmaXJlIGFsbCBjaGFuZ2VkIGV2ZW50CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgibGF5ZXJzIiwgbnVsbCwgbGF5ZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGF5ZXIgZ2V0TGF5ZXIoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBsYXllcnMuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExheWVyQ291bnQoKSB7CisgICAgICAgIHJldHVybiBsYXllcnMuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxMYXllcj4gZ2V0TGF5ZXJJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobGF5ZXJzKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPExheWVyPiBnZXRMYXllcnMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGxheWVycyk7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmRleE9mTGF5ZXIoTGF5ZXIgbGF5ZXIpIHsKKyAgICAgICAgcmV0dXJuIGxheWVycy5pbmRleE9mKGxheWVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMYXllcihMYXllciBsYXllcikgeworICAgICAgICBpbnQgaW5kZXggPSBsYXllcnMuaW5kZXhPZihsYXllcik7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSkgeworICAgICAgICAgICAgbGF5ZXJzLnJlbW92ZShsYXllcik7CisgICAgICAgICAgICBsYXllci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxheWVyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworICAgICAgICAgICAgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZSgibGF5ZXJzIiwgaW5kZXgsIGxheWVyLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0Um9vdFNpemUoKSB7CisgICAgICAgIHJldHVybiBnZXRTaXplKCk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBKSUJYIEhlbHBlciBNZXRob2RzCisKKyAgICAvKiogQ2FsbGVkIGJ5IEpJQlggYWZ0ZXIgImxheWVycyIgaGFzIGJlZW4gZmlsbGVkIHNvIHdlIGNhbiBzZXQgcGFyZW50cyBhbmQgbGlzdGVuZXJzICovCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwTGF5ZXJzKCkgeworICAgICAgICBmb3IgKExheWVyIGxheWVyIDogbGF5ZXJzKSB7CisgICAgICAgICAgICBsYXllci5zZXRQYXJlbnQodGhpcyk7CisgICAgICAgICAgICBsYXllci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxheWVyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIC8vIG5vIHNpbmdsZSBsYXllciBjaGFuZ2VzIHNvIGZpcmUgYWxsIGNoYW5nZWQgZXZlbnQKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJsYXllcnMiLCBudWxsLCBsYXllcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvQ29udHJvbFBvaW50LmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0NvbnRyb2xQb2ludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDIzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0NvbnRyb2xQb2ludC5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXI7CisKK2ltcG9ydCBqYXZhLmF3dC5CYXNpY1N0cm9rZTsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0LlNoYXBlOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIENvbnRyb2xQb2ludAorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKE1heSAyNCwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIENvbnRyb2xQb2ludCBleHRlbmRzIFNpbXBsZVNoYXBlIHsKKyAgICBwcm90ZWN0ZWQgQ29sb3IgZmlsbENvbG9yOworICAgIHByb3RlY3RlZCBDb2xvciBsaW5lQ29sb3I7CisgICAgcHJvdGVjdGVkIERvdWJsZUJlYW4geCwgeTsKKworICAgIHB1YmxpYyBDb250cm9sUG9pbnQoKSB7CisgICAgICAgIHRoaXMobmV3IERvdWJsZUJlYW4oKSwgbmV3IERvdWJsZUJlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIENvbnRyb2xQb2ludChDb2xvciBmaWxsQ29sb3IsIENvbG9yIGxpbmVDb2xvcikgeworICAgICAgICB0aGlzKG5ldyBEb3VibGVCZWFuKCksIG5ldyBEb3VibGVCZWFuKCksIGZpbGxDb2xvciwgbGluZUNvbG9yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udHJvbFBvaW50KGRvdWJsZSB4LCBkb3VibGUgeSkgeworICAgICAgICB0aGlzKG5ldyBEb3VibGVCZWFuKHgpLCBuZXcgRG91YmxlQmVhbih5KSk7CisgICAgfQorCisgICAgcHVibGljIENvbnRyb2xQb2ludChEb3VibGVCZWFuIHgsIERvdWJsZUJlYW4geSkgeworICAgICAgICB0aGlzKHgsIHksIEdyYXBoaWNzSGVscGVyLkNPTlRST0xfUE9JTlRfRklMTCwgR3JhcGhpY3NIZWxwZXIuQ09OVFJPTF9QT0lOVF9MSU5FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udHJvbFBvaW50KERvdWJsZUJlYW4geCwgRG91YmxlQmVhbiB5LCBDb2xvciBmaWxsQ29sb3IsIENvbG9yIGxpbmVDb2xvcikgeworICAgICAgICB0aGlzLnggPSB4OworICAgICAgICB0aGlzLnkgPSB5OworICAgICAgICB0aGlzLmZpbGxDb2xvciA9IGZpbGxDb2xvcjsKKyAgICAgICAgdGhpcy5saW5lQ29sb3IgPSBsaW5lQ29sb3I7CisgICAgICAgIHguYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoKERvdWJsZSkgZXZ0LmdldE9sZFZhbHVlKCksIGdldFkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQyRC5Eb3VibGUoZ2V0WCgpLCAoRG91YmxlKSBldnQuZ2V0T2xkVmFsdWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRYKCkgeworICAgICAgICByZXR1cm4geC5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0WSgpIHsKKyAgICAgICAgcmV0dXJuIHkuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYKGRvdWJsZSB4KSB7CisgICAgICAgIHRoaXMueC5zZXRWYWx1ZSh4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRZKGRvdWJsZSB5KSB7CisgICAgICAgIHRoaXMueS5zZXRWYWx1ZSh5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihQb2ludDJEIHBvc2l0aW9uKSB7CisgICAgICAgIHguc2V0VmFsdWUocG9zaXRpb24uZ2V0WCgpKTsKKyAgICAgICAgeS5zZXRWYWx1ZShwb3NpdGlvbi5nZXRZKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKGRvdWJsZSB4LCBkb3VibGUgeSkgeworICAgICAgICBzZXRQb3NpdGlvbihuZXcgUG9pbnQyRC5Eb3VibGUoeCwgeSkpOworICAgIH0KKworICAgIHB1YmxpYyBQb2ludDJEIGdldFBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IFBvaW50MkQuRG91YmxlKGdldFgoKSwgZ2V0WSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKGRvdWJsZSBwaXhlbFNpemUpIHsKKyAgICAgICAgZG91YmxlIHNpemUgPSBwaXhlbFNpemUgKiA0ZDsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUoZ2V0WCgpIC0gc2l6ZSwgZ2V0WSgpIC0gc2l6ZSwKKyAgICAgICAgICAgICAgICBzaXplICogMiwgc2l6ZSAqIDIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSGl0KFBvaW50MkQgcCwgZG91YmxlIHBpeGVsU2l6ZSkgeworICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKHBpeGVsU2l6ZSkuY29udGFpbnMocCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU2hhcGUgZ2V0U2hhcGUoKSB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZHMoMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MyRCBnMiwgZG91YmxlIHBpeGVsU2l6ZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbHMoR3JhcGhpY3MyRCBnMiwgZG91YmxlIHBpeGVsU2l6ZSwgYm9vbGVhbiBwYWludENvbnRyb2xMaW5lcykgeworICAgICAgICBnMi5zZXRTdHJva2UobmV3IEJhc2ljU3Ryb2tlKChmbG9hdCkgcGl4ZWxTaXplKSk7CisgICAgICAgIFNoYXBlIHMgPSBnZXRCb3VuZHMocGl4ZWxTaXplKTsKKyAgICAgICAgZzIuc2V0Q29sb3IoZmlsbENvbG9yKTsKKyAgICAgICAgZzIuZmlsbChzKTsKKyAgICAgICAgZzIuc2V0Q29sb3IobGluZUNvbG9yKTsKKyAgICAgICAgZzIuZHJhdyhzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxDb250cm9sUG9pbnQ+IGdldENvbnRyb2xQb2ludHMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIG1vdmUoZG91YmxlIG1vdmVYLCBkb3VibGUgbW92ZVksIGJvb2xlYW4gc25hcFBpeGVscykgeworICAgICAgICBpZiAoc25hcFBpeGVscykgeworICAgICAgICAgICAgc2V0UG9zaXRpb24oCisgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoeC5nZXRWYWx1ZSgpICsgbW92ZVgpLAorICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHkuZ2V0VmFsdWUoKSArIG1vdmVZKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRQb3NpdGlvbih4LmdldFZhbHVlKCkgKyBtb3ZlWCwgeS5nZXRWYWx1ZSgpICsgbW92ZVkpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvRGVzaWduZXIuamlieC54bWwgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0Rlc2lnbmVyLmppYngueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODBiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0Rlc2lnbmVyLmppYngueG1sCkBAIC0wLDAgKzEsMTczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tCisgQ29weXJpZ2h0IDE5OTgtMjAwNCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorLS0+CisKKzwhRE9DVFlQRSBiaW5kaW5nIFNZU1RFTSAiaHR0cDovL2ppYnguc291cmNlZm9yZ2UubmV0Ij4KKzxiaW5kaW5nPgorICAgIDwhLS0gPT0gUEFJTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPG1hcHBpbmcgY2xhc3M9ImphdmEuYXd0LkNvbG9yIgorICAgICAgICAgICAgIG1hcnNoYWxsZXI9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnMuQ29sb3JNYXBwZXIiCisgICAgICAgICAgICAgdW5tYXJzaGFsbGVyPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzLkNvbG9yTWFwcGVyIi8+CisgICAgPG1hcHBpbmcgbmFtZT0ibWF0dGUiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50Lk1hdHRlIiBwb3N0LXNldD0icG9zdFNldCI+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJyZWQiIGZpZWxkPSJyZWQiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImdyZWVuIiBmaWVsZD0iZ3JlZW4iIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImJsdWUiIGZpZWxkPSJibHVlIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJhbHBoYSIgZmllbGQ9ImFscGhhIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJ1aURlZmF1bHRQYXJlbnROYW1lIiBmaWVsZD0idWlEZWZhdWx0UGFyZW50TmFtZSIgc3R5bGU9ImF0dHJpYnV0ZSIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJjb21wb25lbnRQcm9wZXJ0eU5hbWUiIGZpZWxkPSJjb21wb25lbnRQcm9wZXJ0eU5hbWUiIHN0eWxlPSJhdHRyaWJ1dGUiIHVzYWdlPSJvcHRpb25hbCIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iaHVlT2Zmc2V0IiBmaWVsZD0iaHVlT2Zmc2V0IiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJzYXR1cmF0aW9uT2Zmc2V0IiBmaWVsZD0ic2F0dXJhdGlvbk9mZnNldCIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iYnJpZ2h0bmVzc09mZnNldCIgZmllbGQ9ImJyaWdodG5lc3NPZmZzZXQiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImFscGhhT2Zmc2V0IiBmaWVsZD0iYWxwaGFPZmZzZXQiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9InVpUmVzb3VyY2UiIGZpZWxkPSJ1aVJlc291cmNlIiBzdHlsZT0iYXR0cmlidXRlIiB1c2FnZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InRydWUiLz4KKyAgICA8L21hcHBpbmc+CisgICAgPG1hcHBpbmcgY2xhc3M9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuQWJzdHJhY3RHcmFkaWVudCIgYWJzdHJhY3Q9InRydWUiPgorICAgICAgICA8dmFsdWUgbmFtZT0iY3ljbGVNZXRob2QiIGZpZWxkPSJjeWNsZU1ldGhvZCIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8Y29sbGVjdGlvbiBmaWVsZD0ic3RvcHMiIHNldC1tZXRob2Q9InNldFN0b3BzIiBwcmUtc2V0PSJjbGVhciIgY3JlYXRlLXR5cGU9ImphdmEudXRpbC5BcnJheUxpc3QiPgorICAgICAgICAgICAgPHN0cnVjdHVyZSBuYW1lPSJzdG9wIiB0eXBlPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50LkdyYWRpZW50U3RvcCI+CisgICAgICAgICAgICAgICAgPHZhbHVlIG5hbWU9InBvc2l0aW9uIiBmaWVsZD0icG9zaXRpb24iIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgICAgICAgICA8dmFsdWUgbmFtZT0ibWlkcG9pbnQiIGZpZWxkPSJtaWRwb2ludCIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICAgICAgICAgIDxzdHJ1Y3R1cmUgZmllbGQ9ImNvbG9yIiBzZXQtbWV0aG9kPSJzZXRDb2xvciIvPgorICAgICAgICAgICAgPC9zdHJ1Y3R1cmU+CisgICAgICAgIDwvY29sbGVjdGlvbj4KKyAgICA8L21hcHBpbmc+CisgICAgPG1hcHBpbmcgbmFtZT0iZ3JhZGllbnQiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50LkdyYWRpZW50IgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuQWJzdHJhY3RHcmFkaWVudCI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50LkFic3RyYWN0R3JhZGllbnQiLz4KKyAgICA8L21hcHBpbmc+CisgICAgPG1hcHBpbmcgbmFtZT0icmFkaWFsR3JhZGllbnQiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50LlJhZGlhbEdyYWRpZW50IgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuQWJzdHJhY3RHcmFkaWVudCI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50LkFic3RyYWN0R3JhZGllbnQiLz4KKyAgICA8L21hcHBpbmc+CisgICAgPCEtLSA9PSBTSEFQRVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8bWFwcGluZyBjbGFzcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5TaW1wbGVTaGFwZSIgYWJzdHJhY3Q9InRydWUiPgorICAgICAgICA8IS0tcHJvdGVjdGVkIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7LS0+CisgICAgPC9tYXBwaW5nPgorICAgIDxtYXBwaW5nIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlBhaW50ZWRTaGFwZSIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgICAgICAgZXh0ZW5kcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5TaW1wbGVTaGFwZSI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlNpbXBsZVNoYXBlIi8+CisgICAgICAgIDxzdHJ1Y3R1cmUgZmllbGQ9InBhaW50Ii8+CisgICAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0icGFpbnRQb2ludHMiPgorICAgICAgICAgICAgPHZhbHVlIG5hbWU9IngxIiBnZXQtbWV0aG9kPSJnZXRQYWludFgxIiBzZXQtbWV0aG9kPSJzZXRQYWludFgxIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgICAgICA8dmFsdWUgbmFtZT0ieTEiIGdldC1tZXRob2Q9ImdldFBhaW50WTEiIHNldC1tZXRob2Q9InNldFBhaW50WTEiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBuYW1lPSJ4MiIgZ2V0LW1ldGhvZD0iZ2V0UGFpbnRYMiIgc2V0LW1ldGhvZD0ic2V0UGFpbnRYMiIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICAgICAgPHZhbHVlIG5hbWU9InkyIiBnZXQtbWV0aG9kPSJnZXRQYWludFkyIiBzZXQtbWV0aG9kPSJzZXRQYWludFkyIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDwvc3RydWN0dXJlPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJyZWN0YW5nbGUiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlJlY3RhbmdsZVNoYXBlIgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuUGFpbnRlZFNoYXBlIj4KKyAgICAgICAgPHN0cnVjdHVyZSBtYXAtYXM9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuUGFpbnRlZFNoYXBlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJ4MSIgZ2V0LW1ldGhvZD0iZ2V0WDEiIHNldC1tZXRob2Q9InNldFgxIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJ4MiIgZ2V0LW1ldGhvZD0iZ2V0WDIiIHNldC1tZXRob2Q9InNldFgyIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJ5MSIgZ2V0LW1ldGhvZD0iZ2V0WTEiIHNldC1tZXRob2Q9InNldFkxIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJ5MiIgZ2V0LW1ldGhvZD0iZ2V0WTIiIHNldC1tZXRob2Q9InNldFkyIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJyb3VuZGluZyIgZ2V0LW1ldGhvZD0iZ2V0Um91bmRpbmciIHNldC1tZXRob2Q9InNldFJvdW5kaW5nIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgPC9tYXBwaW5nPgorICAgIDxtYXBwaW5nIG5hbWU9ImVsbGlwc2UiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLkVsbGlwc2VTaGFwZSIKKyAgICAgICAgICAgICBleHRlbmRzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlBhaW50ZWRTaGFwZSI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlBhaW50ZWRTaGFwZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ieDEiIGdldC1tZXRob2Q9ImdldFgxIiBzZXQtbWV0aG9kPSJzZXRYMSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ieDIiIGdldC1tZXRob2Q9ImdldFgyIiBzZXQtbWV0aG9kPSJzZXRYMiIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ieTEiIGdldC1tZXRob2Q9ImdldFkxIiBzZXQtbWV0aG9kPSJzZXRZMSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ieTIiIGdldC1tZXRob2Q9ImdldFkyIiBzZXQtbWV0aG9kPSJzZXRZMiIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJwYXRoIiBjbGFzcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5QYXRoU2hhcGUiCisgICAgICAgICAgICAgZXh0ZW5kcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5QYWludGVkU2hhcGUiPgorICAgICAgICA8c3RydWN0dXJlIG1hcC1hcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5QYWludGVkU2hhcGUiLz4KKyAgICAgICAgPGNvbGxlY3Rpb24gbmFtZT0icG9pbnRzIiBnZXQtbWV0aG9kPSJnZXRCZXppZXJDb250cm9sUG9pbnRzIgorICAgICAgICAgICAgICAgICAgICBzZXQtbWV0aG9kPSJzZXRDb250cm9sUG9pbnRzIiBjcmVhdGUtdHlwZT0iamF2YS51dGlsLkFycmF5TGlzdCI+CisgICAgICAgICAgICA8c3RydWN0dXJlIG5hbWU9InBvaW50IiB0eXBlPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLkJlemllckNvbnRyb2xQb2ludCI+CisgICAgICAgICAgICAgICAgPHZhbHVlIG5hbWU9IngiIGdldC1tZXRob2Q9ImdldFgiIHNldC1tZXRob2Q9InNldFgiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgICAgICAgICA8dmFsdWUgbmFtZT0ieSIgZ2V0LW1ldGhvZD0iZ2V0WSIgc2V0LW1ldGhvZD0ic2V0WSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICAgICAgICAgIDx2YWx1ZSBuYW1lPSJjcDF4IiBnZXQtbWV0aG9kPSJnZXRDcDFYIiBzZXQtbWV0aG9kPSJzZXRDcDFYIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgICAgICAgICAgPHZhbHVlIG5hbWU9ImNwMXkiIGdldC1tZXRob2Q9ImdldENwMVkiIHNldC1tZXRob2Q9InNldENwMVkiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgICAgICAgICA8dmFsdWUgbmFtZT0iY3AyeCIgZ2V0LW1ldGhvZD0iZ2V0Q3AyWCIgc2V0LW1ldGhvZD0ic2V0Q3AyWCIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICAgICAgICAgIDx2YWx1ZSBuYW1lPSJjcDJ5IiBnZXQtbWV0aG9kPSJnZXRDcDJZIiBzZXQtbWV0aG9kPSJzZXRDcDJZIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgICAgICA8L3N0cnVjdHVyZT4KKyAgICAgICAgPC9jb2xsZWN0aW9uPgorICAgIDwvbWFwcGluZz4KKyAgICA8IS0tID09IEVGRkVDVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8bWFwcGluZyBjbGFzcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5lZmZlY3RzLlNoYWRvd0VmZmVjdCIgYWJzdHJhY3Q9InRydWUiPgorICAgICAgICA8c3RydWN0dXJlIGZpZWxkPSJjb2xvciIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iYmxlbmRpbmdNb2RlIiBmaWVsZD0iYmxlbmRpbmdNb2RlIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJvcGFjaXR5IiBmaWVsZD0ib3BhY2l0eSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iYW5nbGUiIGZpZWxkPSJhbmdsZSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iZGlzdGFuY2UiIGZpZWxkPSJkaXN0YW5jZSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ic3ByZWFkIiBmaWVsZD0ic3ByZWFkIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJzaXplIiBmaWVsZD0ic2l6ZSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJkcm9wU2hhZG93IiBjbGFzcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5lZmZlY3RzLkRyb3BTaGFkb3dFZmZlY3QiCisgICAgICAgICAgICAgZXh0ZW5kcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5lZmZlY3RzLlNoYWRvd0VmZmVjdCI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmVmZmVjdHMuU2hhZG93RWZmZWN0Ii8+CisgICAgPC9tYXBwaW5nPgorICAgIDxtYXBwaW5nIG5hbWU9ImlubmVyU2hhZG93IiBjbGFzcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5lZmZlY3RzLklubmVyU2hhZG93RWZmZWN0IgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZWZmZWN0cy5TaGFkb3dFZmZlY3QiPgorICAgICAgICA8c3RydWN0dXJlIG1hcC1hcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5lZmZlY3RzLlNoYWRvd0VmZmVjdCIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJpbm5lckdsb3ciIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmVmZmVjdHMuSW5uZXJHbG93RWZmZWN0IgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZWZmZWN0cy5TaGFkb3dFZmZlY3QiPgorICAgICAgICA8c3RydWN0dXJlIG1hcC1hcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5lZmZlY3RzLlNoYWRvd0VmZmVjdCIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJvdXRlckdsb3ciIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmVmZmVjdHMuT3V0ZXJHbG93RWZmZWN0IgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZWZmZWN0cy5TaGFkb3dFZmZlY3QiPgorICAgICAgICA8c3RydWN0dXJlIG1hcC1hcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5lZmZlY3RzLlNoYWRvd0VmZmVjdCIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8IS0tID09IFRFTVBMQVRFIExBWUVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPG1hcHBpbmcgbmFtZT0idGVtcGxhdGVMYXllciIgY2xhc3M9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuVGVtcGxhdGVMYXllciIKKyAgICAgICAgICAgICBleHRlbmRzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLkxheWVyIiBwb3N0LXNldD0icG9zdEluaXQiPgorICAgICAgICA8c3RydWN0dXJlIG1hcC1hcz0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5MYXllciIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iZmlsZU5hbWUiIGZpZWxkPSJmaWxlTmFtZSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8IS0tID09IExBWUVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPG1hcHBpbmcgbmFtZT0ibGF5ZXIiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLkxheWVyIgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuU2ltcGxlU2hhcGUiIHBvc3Qtc2V0PSJwb3N0SW5pdCI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlNpbXBsZVNoYXBlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJuYW1lIiBmaWVsZD0ibmFtZSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0idHlwZSIgZmllbGQ9InR5cGUiIHN0eWxlPSJhdHRyaWJ1dGUiIGRlZmF1bHQ9InN0YW5kYXJkIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJvcGFjaXR5IiBmaWVsZD0ib3BhY2l0eSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iZmlsbE9wYWNpdHkiIGZpZWxkPSJmaWxsT3BhY2l0eSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iYmxlbmRpbmdNb2RlIiBmaWVsZD0iYmxlbmRpbmdNb2RlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJsb2NrZWQiIGZpZWxkPSJsb2NrZWQiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9InZpc2libGUiIGZpZWxkPSJ2aXNpYmxlIi8+CisgICAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0ic2hhcGVzIj4KKyAgICAgICAgICAgIDxjb2xsZWN0aW9uIGZpZWxkPSJzaGFwZXMiIGNyZWF0ZS10eXBlPSJqYXZhLnV0aWwuQXJyYXlMaXN0Ii8+CisgICAgICAgIDwvc3RydWN0dXJlPgorICAgICAgICA8c3RydWN0dXJlIG5hbWU9ImVmZmVjdHMiPgorICAgICAgICAgICAgPGNvbGxlY3Rpb24gZmllbGQ9ImVmZmVjdHMiIGNyZWF0ZS10eXBlPSJqYXZhLnV0aWwuQXJyYXlMaXN0Ii8+CisgICAgICAgIDwvc3RydWN0dXJlPgorICAgIDwvbWFwcGluZz4KKyAgICA8IS0tID09IENBTlZBUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxtYXBwaW5nIG5hbWU9ImNhbnZhcyIgY2xhc3M9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuQ2FudmFzIiBwcmUtc2V0PSJwcmVTZXQiIHBvc3Qtc2V0PSJzZXR1cExheWVycyI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0ic2l6ZSIgZ2V0LW1ldGhvZD0iZ2V0U2l6ZSIgc2V0LW1ldGhvZD0ic2V0U2l6ZSIKKyAgICAgICAgICAgICAgICAgICBtYXJzaGFsbGVyPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzLkRpbWVuc2lvbk1hcHBlciIKKyAgICAgICAgICAgICAgICAgICB1bm1hcnNoYWxsZXI9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnMuRGltZW5zaW9uTWFwcGVyIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJuZXh0TGF5ZXJOYW1lSW5kZXgiIGZpZWxkPSJuZXh0TGF5ZXJOYW1lSW5kZXgiLz4KKyAgICAgICAgPHN0cnVjdHVyZSBuYW1lPSJzdHJldGNoaW5nSW5zZXRzIiBmaWVsZD0ic3RyZXRjaGluZ0luc2V0cyIKKyAgICAgICAgICAgICAgICAgICBtYXJzaGFsbGVyPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzLkluc2V0c01hcHBlciIKKyAgICAgICAgICAgICAgICAgICB1bm1hcnNoYWxsZXI9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnMuSW5zZXRzTWFwcGVyIi8+CisgICAgICAgIDxjb2xsZWN0aW9uIGZpZWxkPSJsYXllcnMiIGNyZWF0ZS10eXBlPSJqYXZhLnV0aWwuQXJyYXlMaXN0Ii8+CisgICAgPC9tYXBwaW5nPgorPC9iaW5kaW5nPgpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9Eb3VibGVCZWFuLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0RvdWJsZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjk3YjgwCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9Eb3VibGVCZWFuLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyOworCitpbXBvcnQgb3JnLmpkZXNrdG9wLmJlYW5zLkFic3RyYWN0QmVhbjsKKworLyoqCisgKiBEb3VibGVCZWFuIC0gU2ltcGxlIGJlYW4gZm9yIGEgb2JzZXJ2YWJsZSBkb3VibGUgdmFsdWUKKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChNYXkgMjUsIDIwMDcpCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVCZWFuIGV4dGVuZHMgQWJzdHJhY3RCZWFuIHsKKyAgICBwcml2YXRlIGRvdWJsZSB2YWx1ZSA9IDA7CisKKyAgICBwdWJsaWMgRG91YmxlQmVhbigpIHt9CisKKyAgICBwdWJsaWMgRG91YmxlQmVhbihkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgZG91YmxlIG9sZCA9IHRoaXMudmFsdWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ2YWx1ZSIsIG9sZCwgdGhpcy52YWx1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBEb3VibGVCZWFuIHRoYXQgPSAoRG91YmxlQmVhbikgbzsKKworICAgICAgICBpZiAoRG91YmxlLmNvbXBhcmUodGhhdC52YWx1ZSwgdmFsdWUpICE9IDApIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBsb25nIHRlbXAgPSB2YWx1ZSAhPSArMC4wZCA/IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHZhbHVlKSA6IDBMOworICAgICAgICByZXR1cm4gKGludCkgKHRlbXAgXiAodGVtcCA+Pj4gMzIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0VsbGlwc2VTaGFwZS5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9FbGxpcHNlU2hhcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQxMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9FbGxpcHNlU2hhcGUuamF2YQpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0Lmdlb20uRWxsaXBzZTJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBFbGxpcHNlU2hhcGUKKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChNYXkgMjIsIDIwMDcpCisgKi8KK3B1YmxpYyBjbGFzcyBFbGxpcHNlU2hhcGUgZXh0ZW5kcyBQYWludGVkU2hhcGUgeworCisgICAgcHJpdmF0ZSBEb3VibGVCZWFuIHgxID0gbmV3IERvdWJsZUJlYW4oKTsKKyAgICBwcml2YXRlIERvdWJsZUJlYW4geDIgPSBuZXcgRG91YmxlQmVhbigpOworICAgIHByaXZhdGUgRG91YmxlQmVhbiB5MSA9IG5ldyBEb3VibGVCZWFuKCk7CisgICAgcHJpdmF0ZSBEb3VibGVCZWFuIHkyID0gbmV3IERvdWJsZUJlYW4oKTsKKyAgICBwcml2YXRlIENvbnRyb2xQb2ludCB0bCA9IG5ldyBDb250cm9sUG9pbnQoeDEsIHkxKTsKKyAgICBwcml2YXRlIENvbnRyb2xQb2ludCB0ciA9IG5ldyBDb250cm9sUG9pbnQoeDIsIHkxKTsKKyAgICBwcml2YXRlIENvbnRyb2xQb2ludCBibCA9IG5ldyBDb250cm9sUG9pbnQoeDEsIHkyKTsKKyAgICBwcml2YXRlIENvbnRyb2xQb2ludCBiciA9IG5ldyBDb250cm9sUG9pbnQoeDIsIHkyKTsKKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQ29uc3RydWN0b3JzCisKKyAgICAvKiogcHJpdmF0ZSBub2FyZ3MgY29uc3RydWN0b3IgZm9yIEpJQlggKi8KKyAgICBwcml2YXRlIEVsbGlwc2VTaGFwZSgpIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRWxsaXBzZVNoYXBlKFVJRGVmYXVsdHMgY2FudmFzVWlEZWZhdWx0cykgeworICAgICAgICBzdXBlcihjYW52YXNVaURlZmF1bHRzKTsKKyAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImJvdW5kcyIsIG51bGwsIGdldEJvdW5kcygwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHgxLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB5MS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgeDIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIHkyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyBFbGxpcHNlU2hhcGUoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgdywgZG91YmxlIGgpIHsKKyAgICAgICAgdGhpcygpOworICAgICAgICB4MS5zZXRWYWx1ZSh4KTsKKyAgICAgICAgeTEuc2V0VmFsdWUoeSk7CisgICAgICAgIHgyLnNldFZhbHVlKHggKyB3KTsKKyAgICAgICAgeTIuc2V0VmFsdWUoeSArIGgpOworICAgIH0KKworICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoZG91YmxlIHBpeGVsU2l6ZSkgeworICAgICAgICBkb3VibGUgbGVmdCA9IE1hdGgubWluKHgxLmdldFZhbHVlKCksIHgyLmdldFZhbHVlKCkpOworICAgICAgICBkb3VibGUgcmlnaHQgPSBNYXRoLm1heCh4MS5nZXRWYWx1ZSgpLCB4Mi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgZG91YmxlIHRvcCA9IE1hdGgubWluKHkxLmdldFZhbHVlKCksIHkyLmdldFZhbHVlKCkpOworICAgICAgICBkb3VibGUgYm90dG9tID0gTWF0aC5tYXgoeTEuZ2V0VmFsdWUoKSwgeTIuZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworICAgIH0KKworICAgIHB1YmxpYyBFbGxpcHNlMkQgZ2V0U2hhcGUoKSB7CisgICAgICAgIGRvdWJsZSBsZWZ0ID0gTWF0aC5taW4oeDEuZ2V0VmFsdWUoKSwgeDIuZ2V0VmFsdWUoKSk7CisgICAgICAgIGRvdWJsZSByaWdodCA9IE1hdGgubWF4KHgxLmdldFZhbHVlKCksIHgyLmdldFZhbHVlKCkpOworICAgICAgICBkb3VibGUgdG9wID0gTWF0aC5taW4oeTEuZ2V0VmFsdWUoKSwgeTIuZ2V0VmFsdWUoKSk7CisgICAgICAgIGRvdWJsZSBib3R0b20gPSBNYXRoLm1heCh5MS5nZXRWYWx1ZSgpLCB5Mi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFbGxpcHNlMkQuRG91YmxlKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSGl0KFBvaW50MkQgcCwgZG91YmxlIHBpeGVsU2l6ZSkgeworICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKHBpeGVsU2l6ZSkuY29udGFpbnMocCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MyRCBnMiwgZG91YmxlIHBpeGVsU2l6ZSkgeworICAgICAgICBnMi5zZXRQYWludChnZXRQYWludCgpKTsKKyAgICAgICAgZzIuZmlsbChnZXRTaGFwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFtZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKKyAgICAgICAgdGhpcy54MS5zZXRWYWx1ZSh4MSk7CisgICAgICAgIHRoaXMueTEuc2V0VmFsdWUoeTEpOworICAgICAgICB0aGlzLngyLnNldFZhbHVlKHgyKTsKKyAgICAgICAgdGhpcy55Mi5zZXRWYWx1ZSh5Mik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgUmVjdGFuZ2xlMkQgYm91bmRzID0gZ2V0Qm91bmRzKDApOworICAgICAgICByZXR1cm4gIkVMTElQU0UgeyB4PSIgKyAgYm91bmRzLmdldFgoKSArICIsIHk9IiArIGJvdW5kcy5nZXRZKCkgKyAiLCB3PSIgKyBib3VuZHMuZ2V0V2lkdGgoKSArICIsIGg9IiArIGJvdW5kcy5nZXRIZWlnaHQoKSArICIgfSI7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8Q29udHJvbFBvaW50PiBnZXRDb250cm9sUG9pbnRzKCkgeworICAgICAgICBMaXN0PENvbnRyb2xQb2ludD4gcG9pbnRzID0gbmV3IEFycmF5TGlzdDxDb250cm9sUG9pbnQ+KCk7CisgICAgICAgIHBvaW50cy5hZGRBbGwoc3VwZXIuZ2V0Q29udHJvbFBvaW50cygpKTsKKyAgICAgICAgcG9pbnRzLmFkZCh0bCk7CisgICAgICAgIHBvaW50cy5hZGQodHIpOworICAgICAgICBwb2ludHMuYWRkKGJsKTsKKyAgICAgICAgcG9pbnRzLmFkZChicik7CisgICAgICAgIHJldHVybiBwb2ludHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9scyhHcmFwaGljczJEIGcyLCBkb3VibGUgcGl4ZWxTaXplLCBib29sZWFuIHBhaW50Q29udHJvbExpbmVzKSB7CisgICAgICAgIGlmIChwYWludENvbnRyb2xMaW5lcykgeworICAgICAgICAgICAgZzIuc2V0U3Ryb2tlKG5ldyBCYXNpY1N0cm9rZSgoZmxvYXQpIHBpeGVsU2l6ZSkpOworICAgICAgICAgICAgZzIuc2V0Q29sb3IoR3JhcGhpY3NIZWxwZXIuQ09OVFJPTF9MSU5FKTsKKyAgICAgICAgICAgIGcyLmRyYXcoZ2V0U2hhcGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGwucGFpbnRDb250cm9scyhnMiwgcGl4ZWxTaXplLCB0cnVlKTsKKyAgICAgICAgdHIucGFpbnRDb250cm9scyhnMiwgcGl4ZWxTaXplLCB0cnVlKTsKKyAgICAgICAgYmwucGFpbnRDb250cm9scyhnMiwgcGl4ZWxTaXplLCB0cnVlKTsKKyAgICAgICAgYnIucGFpbnRDb250cm9scyhnMiwgcGl4ZWxTaXplLCB0cnVlKTsKKy8vICAgICAgICBzdXBlci5wYWludENvbnRyb2xzKGcyLCBwaXhlbFNpemUsIHBhaW50Q29udHJvbExpbmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3ZlKGRvdWJsZSBtb3ZlWCwgZG91YmxlIG1vdmVZLCBib29sZWFuIHNuYXBQaXhlbHMpIHsKKyAgICAgICAgaWYgKHNuYXBQaXhlbHMpIHsKKyAgICAgICAgICAgIHgxLnNldFZhbHVlKE1hdGgucm91bmQoeDEuZ2V0VmFsdWUoKSArIG1vdmVYKSk7CisgICAgICAgICAgICB4Mi5zZXRWYWx1ZShNYXRoLnJvdW5kKHgyLmdldFZhbHVlKCkgKyBtb3ZlWCkpOworICAgICAgICAgICAgeTEuc2V0VmFsdWUoTWF0aC5yb3VuZCh5MS5nZXRWYWx1ZSgpICsgbW92ZVkpKTsKKyAgICAgICAgICAgIHkyLnNldFZhbHVlKE1hdGgucm91bmQoeTIuZ2V0VmFsdWUoKSArIG1vdmVZKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4MS5zZXRWYWx1ZSh4MS5nZXRWYWx1ZSgpICsgbW92ZVgpOworICAgICAgICAgICAgeDIuc2V0VmFsdWUoeDIuZ2V0VmFsdWUoKSArIG1vdmVYKTsKKyAgICAgICAgICAgIHkxLnNldFZhbHVlKHkxLmdldFZhbHVlKCkgKyBtb3ZlWSk7CisgICAgICAgICAgICB5Mi5zZXRWYWx1ZSh5Mi5nZXRWYWx1ZSgpICsgbW92ZVkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRYMSgpIHsKKyAgICAgICAgcmV0dXJuIHgxLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WDEoZG91YmxlIHgxKSB7CisgICAgICAgIHRoaXMueDEuc2V0VmFsdWUoeDEpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0WDIoKSB7CisgICAgICAgIHJldHVybiB4Mi5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFgyKGRvdWJsZSB4MikgeworICAgICAgICB0aGlzLngyLnNldFZhbHVlKHgyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFkxKCkgeworICAgICAgICByZXR1cm4geTEuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRZMShkb3VibGUgeTEpIHsKKyAgICAgICAgdGhpcy55MS5zZXRWYWx1ZSh5MSk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRZMigpIHsKKyAgICAgICAgcmV0dXJuIHkyLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WTIoZG91YmxlIHkyKSB7CisgICAgICAgIHRoaXMueTIuc2V0VmFsdWUoeTIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9HcmFwaGljc0hlbHBlci5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9HcmFwaGljc0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWM0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL0dyYXBoaWNzSGVscGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyOworCitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CisKKy8qKgorICogR3JhcGhpY3NIZWxwZXIKKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChNYXkgMjksIDIwMDcpCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFwaGljc0hlbHBlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBGSUxMX0xJTkUgPSBDb2xvci5CTFVFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgRklMTF9DUF9MSU5FID0gQ29sb3IuQkxVRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEZJTExfQ1BfRklMTCA9IENvbG9yLldISVRFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQ09OVFJPTF9MSU5FID0gQ29sb3IuUkVEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQ09OVFJPTF9QT0lOVF9MSU5FID0gQ29sb3IuUkVEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQ09OVFJPTF9QT0lOVF9GSUxMID0gQ29sb3IuV0hJVEU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBCRVpJRVJfQ09OVFJPTF9QT0lOVF9MSU5FID0gQ09OVFJPTF9QT0lOVF9MSU5FOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQkVaSUVSX0NPTlRST0xfUE9JTlRfRklMTCA9IENPTlRST0xfUE9JTlRfRklMTDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEJFWklFUl9DT05UUk9MX0xJTkUgPSBDb2xvci5EQVJLX0dSQVk7CisKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvTGF5ZXIuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvTGF5ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjExMmFlCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9MYXllci5qYXZhCkBAIC0wLDAgKzEsNDQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXI7CisKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmVmZmVjdHMuRWZmZWN0OworCitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuU2hhcGU7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5Qb2ludDJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBMYXllcgorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKE1heSAyMiwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIExheWVyIGV4dGVuZHMgU2ltcGxlU2hhcGUgaW1wbGVtZW50cyBJdGVyYWJsZTxTaW1wbGVTaGFwZT4sIExheWVyQ29udGFpbmVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGVudW0gTGF5ZXJUeXBlIHsKKyAgICAgICAgc3RhbmRhcmQsIHRlbXBsYXRlCisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcm90ZWN0ZWQgTGF5ZXJUeXBlIHR5cGUgPSBMYXllclR5cGUuc3RhbmRhcmQ7CisgICAgLyoqIExpc3Qgb2Ygc2hhcGVzIGluIHRoaXMgbGF5ZXIsIGZpcnN0IHNoYXBlIGlzIHBhaW50ZWQgb24gdG9wICovCisgICAgcHJpdmF0ZSBMaXN0PFNpbXBsZVNoYXBlPiBzaGFwZXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZVNoYXBlPigpOworICAgIHByaXZhdGUgTGlzdDxFZmZlY3Q+IGVmZmVjdHMgPSBuZXcgQXJyYXlMaXN0PEVmZmVjdD4oKTsKKyAgICBwcml2YXRlIGRvdWJsZSBvcGFjaXR5ID0gMTsKKyAgICBwcml2YXRlIGRvdWJsZSBmaWxsT3BhY2l0eSA9IDE7CisgICAgcHJpdmF0ZSBCbGVuZGluZ01vZGUgYmxlbmRpbmdNb2RlID0gQmxlbmRpbmdNb2RlLk5PUk1BTDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbG9ja2VkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHZpc2libGUgPSB0cnVlOworICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzaGFwZUNoYW5nZUxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBzaGFwZXMuaW5kZXhPZigoU2ltcGxlU2hhcGUpIGV2dC5nZXRTb3VyY2UoKSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNoYXBlc1siICsgaW5kZXggKyAiXS4iICsgZXZ0LmdldFByb3BlcnR5TmFtZSgpLCBldnQuZ2V0T2xkVmFsdWUoKSwgZXZ0LmdldE5ld1ZhbHVlKCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZWZmZWN0Q2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGVmZmVjdHMuaW5kZXhPZigoRWZmZWN0KSBldnQuZ2V0U291cmNlKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAiTGF5ZXIucHJvcGVydHlDaGFuZ2UgRUZGRUNUIFBST1BFUlRZIENIQU5HRUQgIiArIGV2dC5nZXRTb3VyY2UoKSArICIgLS0gIiArIGV2dC5nZXRQcm9wZXJ0eU5hbWUoKSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImVmZmVjdHNbIiArIGluZGV4ICsgIl0uIiArIGV2dC5nZXRQcm9wZXJ0eU5hbWUoKSwgZXZ0LmdldE9sZFZhbHVlKCksIGV2dC5nZXROZXdWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH07CisgICAgcHJpdmF0ZSBCdWZmZXJlZEltYWdlIGJ1ZmZlciA9IG51bGw7CisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKworICAgIHB1YmxpYyBMYXllcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTGF5ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcygpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKiBDYWxsZWQgYnkgSklCWCBhZnRlciBwb3B1bGF0aW5nIHRoaXMgbGF5ZXIgc28gd2UgY2FuIGFkZCBsaXN0ZW5lcnMgdG8gY2hpbGRyZW4gKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0SW5pdCgpIHsKKyAgICAgICAgZm9yIChTaW1wbGVTaGFwZSBzaGFwZSA6IHNoYXBlcykgeworICAgICAgICAgICAgc2hhcGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzaGFwZUNoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgICAgIHNoYXBlLnNldFBhcmVudCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEVmZmVjdCBlZmZlY3QgOiBlZmZlY3RzKSB7CisgICAgICAgICAgICBlZmZlY3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihlZmZlY3RDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEJlYW4gTWV0aG9kcworCisgICAgcHVibGljIExheWVyVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2tlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NrZWQoYm9vbGVhbiBsb2NrZWQpIHsKKyAgICAgICAgYm9vbGVhbiBvbGQgPSBpc0xvY2tlZCgpOworICAgICAgICB0aGlzLmxvY2tlZCA9IGxvY2tlZDsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2NrZWQiLCBvbGQsIGlzTG9ja2VkKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHZpc2libGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgYm9vbGVhbiBvbGQgPSBpc1Zpc2libGUoKTsKKyAgICAgICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ2aXNpYmxlIiwgb2xkLCBpc1Zpc2libGUoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0cmluZyBvbGQgPSBnZXROYW1lKCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgibmFtZSIsIG9sZCwgZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTGF5ZXJDb250YWluZXIgcGFyZW50KSB7CisgICAgICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpOworICAgICAgICAvLyBnZW5lcmF0ZSBhIG5hbWUgaWYgbnVsbAorICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBDYW52YXMgYyA9IG51bGw7CisgICAgICAgICAgICBMYXllckNvbnRhaW5lciBwID0gcGFyZW50OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIENhbnZhcykgeworICAgICAgICAgICAgICAgICAgICBjID0gKENhbnZhcykgcDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAgPSBwLmdldFBhcmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldE5hbWUoIkxheWVyICIgKyBjLmdldE5leHRMYXllck5hbWVJbmRleCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBzaGFwZSB0byB0b3Agb2YgbGF5ZXIgc28gaXQgcGFpbnRzIGFib3ZlIGFsbCBvdGhlciBzaGFwZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKFNpbXBsZVNoYXBlIHNoYXBlKSB7CisgICAgICAgIHNoYXBlcy5hZGQoMCwgc2hhcGUpOworICAgICAgICBzaGFwZS5zZXRQYXJlbnQodGhpcyk7CisgICAgICAgIHNoYXBlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoc2hhcGVDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UoInNoYXBlcyIsIDAsIG51bGwsIHNoYXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU2ltcGxlU2hhcGUgc2hhcGUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gc2hhcGVzLmluZGV4T2Yoc2hhcGUpOworICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIHNoYXBlcy5yZW1vdmUoc2hhcGUpOworICAgICAgICAgICAgc2hhcGUuc2V0UGFyZW50KG51bGwpOworICAgICAgICAgICAgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZSgic2hhcGVzIiwgaW5kZXgsIHNoYXBlLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhbmxlIGl0ZXJhdG9yIG92ZXIgYSBzZXQgb2YgZWxlbWVudHMgb2YgdHlwZSBTaW1wbGVTaGFwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yPFNpbXBsZVNoYXBlPiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoc2hhcGVzKS5pdGVyYXRvcigpOworICAgIH0KKworCisgICAgcHVibGljIExpc3Q8RWZmZWN0PiBnZXRFZmZlY3RzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChlZmZlY3RzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRFZmZlY3QoRWZmZWN0IGVmZmVjdCkgeworICAgICAgICBpbnQgaW5kZXggPSBlZmZlY3RzLnNpemUoKTsKKyAgICAgICAgZWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAgICAgZWZmZWN0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZWZmZWN0Q2hhbmdlTGlzdGVuZXIpOworICAgICAgICBmaXJlSW5kZXhlZFByb3BlcnR5Q2hhbmdlKCJlZmZlY3RzIiwgaW5kZXgsIG51bGwsIGVmZmVjdHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVmZmVjdChFZmZlY3QgZWZmZWN0KSB7CisgICAgICAgIGludCBpbmRleCA9IGVmZmVjdHMuaW5kZXhPZihlZmZlY3QpOworICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIGVmZmVjdHMucmVtb3ZlKGVmZmVjdCk7CisgICAgICAgICAgICBlZmZlY3QucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihlZmZlY3RDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgICAgICBmaXJlSW5kZXhlZFByb3BlcnR5Q2hhbmdlKCJlZmZlY3RzIiwgaW5kZXgsIGVmZmVjdCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldE9wYWNpdHkoKSB7CisgICAgICAgIHJldHVybiBvcGFjaXR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wYWNpdHkoZG91YmxlIG9wYWNpdHkpIHsKKyAgICAgICAgaWYgKG9wYWNpdHkgPCAwIHx8IG9wYWNpdHkgPiAxKSByZXR1cm47CisgICAgICAgIGRvdWJsZSBvbGQgPSBnZXRPcGFjaXR5KCk7CisgICAgICAgIHRoaXMub3BhY2l0eSA9IG9wYWNpdHk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgib3BhY2l0eSIsIG9sZCwgZ2V0T3BhY2l0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldEZpbGxPcGFjaXR5KCkgeworICAgICAgICByZXR1cm4gZmlsbE9wYWNpdHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlsbE9wYWNpdHkoZG91YmxlIGZpbGxPcGFjaXR5KSB7CisgICAgICAgIGlmIChmaWxsT3BhY2l0eSA8IDAgfHwgZmlsbE9wYWNpdHkgPiAxKSByZXR1cm47CisgICAgICAgIGRvdWJsZSBvbGQgPSBnZXRGaWxsT3BhY2l0eSgpOworICAgICAgICB0aGlzLmZpbGxPcGFjaXR5ID0gZmlsbE9wYWNpdHk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZmlsbE9wYWNpdHkiLCBvbGQsIGdldEZpbGxPcGFjaXR5KCkpOworICAgIH0KKworICAgIHB1YmxpYyBCbGVuZGluZ01vZGUgZ2V0QmxlbmRpbmdNb2RlKCkgeworICAgICAgICByZXR1cm4gYmxlbmRpbmdNb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJsZW5kaW5nTW9kZShCbGVuZGluZ01vZGUgYmxlbmRpbmdNb2RlKSB7CisgICAgICAgIEJsZW5kaW5nTW9kZSBvbGQgPSBnZXRCbGVuZGluZ01vZGUoKTsKKyAgICAgICAgdGhpcy5ibGVuZGluZ01vZGUgPSBibGVuZGluZ01vZGU7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYmxlbmRpbmdNb2RlIiwgb2xkLCBnZXRCbGVuZGluZ01vZGUoKSk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBMYXllciBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhcmVudCBjYW52YXMgdGhhdCBjb250YWlucyB0aGlzIGxheWVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBhcmFudCBjYW52YXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGlzIG5vdCBpbiBhIGNhbnZhcworICAgICAqLworICAgIHB1YmxpYyBDYW52YXMgZ2V0Q2FudmFzKCkgeworICAgICAgICBMYXllckNvbnRhaW5lciBsYyA9IHRoaXM7CisgICAgICAgIHdoaWxlIChsYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobGMgaW5zdGFuY2VvZiBDYW52YXMpIHJldHVybiAoQ2FudmFzKSBsYzsKKyAgICAgICAgICAgIGxjID0gbGMuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U2ltcGxlU2hhcGU+IGdldFNoYXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U2ltcGxlU2hhcGU+KHNoYXBlcyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U2ltcGxlU2hhcGU+IGdldEludGVyc2VjdGluZ1NoYXBlcyhQb2ludDJEIHAsIGRvdWJsZSBwaXhlbFNpemUpIHsKKyAgICAgICAgaWYgKGlzTG9ja2VkKCkgfHwgIWlzVmlzaWJsZSgpKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIExpc3Q8U2ltcGxlU2hhcGU+IGludGVyc2VjdGluZ1NoYXBlcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlU2hhcGU+KCk7CisgICAgICAgIGZvciAoU2ltcGxlU2hhcGUgc2hhcGUgOiBzaGFwZXMpIHsKKyAgICAgICAgICAgIGlmIChzaGFwZSBpbnN0YW5jZW9mIExheWVyKSB7CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW5nU2hhcGVzLmFkZEFsbCgoKExheWVyKSBzaGFwZSkuZ2V0SW50ZXJzZWN0aW5nU2hhcGVzKHAsIHBpeGVsU2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc2hhcGUuaXNIaXQocCwgcGl4ZWxTaXplKSkgaW50ZXJzZWN0aW5nU2hhcGVzLmFkZChzaGFwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludGVyc2VjdGluZ1NoYXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxTaW1wbGVTaGFwZT4gZ2V0SW50ZXJzZWN0aW5nU2hhcGVzKFJlY3RhbmdsZTJEIHJlY3QsIGRvdWJsZSBwaXhlbFNpemUpIHsKKyAgICAgICAgaWYgKGlzTG9ja2VkKCkgfHwgIWlzVmlzaWJsZSgpKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIExpc3Q8U2ltcGxlU2hhcGU+IGludGVyc2VjdGluZ1NoYXBlcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlU2hhcGU+KCk7CisgICAgICAgIGZvciAoU2ltcGxlU2hhcGUgc2hhcGUgOiBzaGFwZXMpIHsKKyAgICAgICAgICAgIGlmIChzaGFwZSBpbnN0YW5jZW9mIExheWVyKSB7CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW5nU2hhcGVzLmFkZEFsbCgoKExheWVyKSBzaGFwZSkuZ2V0SW50ZXJzZWN0aW5nU2hhcGVzKHJlY3QsIHBpeGVsU2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc2hhcGUuaW50ZXJzZWN0cyhyZWN0LCBwaXhlbFNpemUpKSBpbnRlcnNlY3RpbmdTaGFwZXMuYWRkKHNoYXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW5nU2hhcGVzOworCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHNoYXBlcy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBTaW1wbGVTaGFwZSBNZXRob2RzCisKKyAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKGRvdWJsZSBwaXhlbFNpemUpIHsKKyAgICAgICAgUmVjdGFuZ2xlMkQuRG91YmxlIHJlY3QgPSBuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKCk7CisgICAgICAgIGZvciAoU2ltcGxlU2hhcGUgc2hhcGUgOiBzaGFwZXMpIHsKKyAgICAgICAgICAgIHJlY3QuYWRkKHNoYXBlLmdldEJvdW5kcyhwaXhlbFNpemUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVjdDsKKyAgICB9CisKKworICAgIHB1YmxpYyBTaGFwZSBnZXRTaGFwZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kcygwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hpdChQb2ludDJEIHAsIGRvdWJsZSBwaXhlbFNpemUpIHsKKyAgICAgICAgaWYgKGlzTG9ja2VkKCkgfHwgIWlzVmlzaWJsZSgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoU2ltcGxlU2hhcGUgc2hhcGUgOiBzaGFwZXMpIHsKKyAgICAgICAgICAgIGlmIChzaGFwZS5pc0hpdChwLCBwaXhlbFNpemUpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhSZWN0YW5nbGUyRCByZWN0LCBkb3VibGUgcGl4ZWxTaXplKSB7CisgICAgICAgIGlmIChpc0xvY2tlZCgpIHx8ICFpc1Zpc2libGUoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKFNpbXBsZVNoYXBlIHNoYXBlIDogc2hhcGVzKSB7CisgICAgICAgICAgICBpZiAoc2hhcGUuaW50ZXJzZWN0cyhyZWN0LCBwaXhlbFNpemUpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8Q29udHJvbFBvaW50PiBnZXRDb250cm9sUG9pbnRzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MyRCBnMiwgZG91YmxlIHBpeGVsU2l6ZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbHMoR3JhcGhpY3MyRCBnMiwgZG91YmxlIHBpeGVsU2l6ZSwgYm9vbGVhbiBwYWludENvbnRyb2xMaW5lcykgeworCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIExheWVyQ29udGFpbmVyIE1ldGhvZHMKKworICAgIHB1YmxpYyB2b2lkIGFkZExheWVyKGludCBpLCBMYXllciBsYXllcikgeworICAgICAgICAvLyBnZXQgZXhpc3RpbmcgbGF5ZXIgYXQgaW5kZXggaQorICAgICAgICBMYXllciBleGlzdGluZ0xheWVyID0gZ2V0TGF5ZXIoaSk7CisgICAgICAgIGlmIChleGlzdGluZ0xheWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFkZExheWVyKGxheWVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGluZGV4T2ZMYXllcihleGlzdGluZ0xheWVyKTsKKyAgICAgICAgICAgIHNoYXBlcy5hZGQoaW5kZXgsIGxheWVyKTsKKyAgICAgICAgICAgIGxheWVyLnNldFBhcmVudCh0aGlzKTsKKyAgICAgICAgICAgIGxheWVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoc2hhcGVDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgICAgICBmaXJlSW5kZXhlZFByb3BlcnR5Q2hhbmdlKCJsYXllcnMiLCBpbmRleCwgbnVsbCwgbGF5ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTGF5ZXIoTGF5ZXIgbGF5ZXIpIHsKKyAgICAgICAgc2hhcGVzLmFkZChsYXllcik7CisgICAgICAgIGxheWVyLnNldFBhcmVudCh0aGlzKTsKKyAgICAgICAgbGF5ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzaGFwZUNoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgaW50IGluZGV4ID0gaW5kZXhPZkxheWVyKGxheWVyKTsKKyAgICAgICAgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZSgibGF5ZXJzIiwgaW5kZXgsIG51bGwsIGxheWVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGF5ZXIgZ2V0TGF5ZXIoaW50IGluZGV4KSB7CisgICAgICAgIGludCBpID0gLTE7CisgICAgICAgIGZvciAoU2ltcGxlU2hhcGUgc2hhcGUgOiBzaGFwZXMpIHsKKyAgICAgICAgICAgIGlmIChzaGFwZSBpbnN0YW5jZW9mIExheWVyKSBpKys7CisgICAgICAgICAgICBpZiAoaSA9PSBpbmRleCkgcmV0dXJuIChMYXllcikgc2hhcGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRMYXllckNvdW50KCkgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKFNpbXBsZVNoYXBlIHNoYXBlIDogc2hhcGVzKSB7CisgICAgICAgICAgICBpZiAoc2hhcGUgaW5zdGFuY2VvZiBMYXllcikgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxMYXllcj4gZ2V0TGF5ZXJzKCkgeworICAgICAgICBMaXN0PExheWVyPiBsYXllcnMgPSBuZXcgQXJyYXlMaXN0PExheWVyPigpOworICAgICAgICBmb3IgKFNpbXBsZVNoYXBlIHNoYXBlIDogc2hhcGVzKSB7CisgICAgICAgICAgICBpZiAoc2hhcGUgaW5zdGFuY2VvZiBMYXllcikgbGF5ZXJzLmFkZCgoTGF5ZXIpIHNoYXBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChsYXllcnMpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvcjxMYXllcj4gZ2V0TGF5ZXJJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxMYXllcj4oKSB7CisgICAgICAgICAgICBwcml2YXRlIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgc2hhcGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaGFwZXMuZ2V0KGkpIGluc3RhbmNlb2YgTGF5ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExheWVyIG5leHQoKSB7CisgICAgICAgICAgICAgICAgZm9yICg7IGluZGV4IDwgc2hhcGVzLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGVzLmdldChpbmRleCkgaW5zdGFuY2VvZiBMYXllcikgeworICAgICAgICAgICAgICAgICAgICAgICAgTGF5ZXIgbmV4dExheWVyID0gKExheWVyKSBzaGFwZXMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7IC8vIGluY3JlbWVudCBpbmRleCBzbyB3ZSBkb24ndCBmaW5kIHRoZSBzYW1lIG9uZSBhZ2FpbgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRMYXllcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaW5kZXhPZkxheWVyKExheWVyIGxheWVyKSB7CisgICAgICAgIGludCBpID0gLTE7CisgICAgICAgIGZvciAoU2ltcGxlU2hhcGUgcyA6IHNoYXBlcykgeworICAgICAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBMYXllcikgaSsrOworICAgICAgICAgICAgaWYgKHMgPT0gbGF5ZXIpIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMYXllcihMYXllciBsYXllcikgeworICAgICAgICBpbnQgaW5kZXggPSBpbmRleE9mTGF5ZXIobGF5ZXIpOworICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIHNoYXBlcy5yZW1vdmUobGF5ZXIpOworICAgICAgICAgICAgbGF5ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzaGFwZUNoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgICAgIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UoImxheWVycyIsIGluZGV4LCBsYXllciwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0Um9vdFNpemUoKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5nZXRSb290U2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvTGF5ZXJDb250YWluZXIuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvTGF5ZXJDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFmNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9MYXllckNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lcjsKKworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIExheWVyQ29udGFpbmVyCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoTWF5IDMxLCAyMDA3KQorICovCitwdWJsaWMgaW50ZXJmYWNlIExheWVyQ29udGFpbmVyIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIHB1YmxpYyBMYXllckNvbnRhaW5lciBnZXRQYXJlbnQoKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZExheWVyKExheWVyIGxheWVyKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZExheWVyKGludCBpLCBMYXllciBsYXllcik7CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMYXllcihMYXllciBsYXllcik7CisKKyAgICBwdWJsaWMgaW50IGdldExheWVyQ291bnQoKTsKKworICAgIHB1YmxpYyBMYXllciBnZXRMYXllcihpbnQgaW5kZXgpOworCisgICAgcHVibGljIGludCBpbmRleE9mTGF5ZXIoTGF5ZXIgbGF5ZXIpOworCisgICAgcHVibGljIEl0ZXJhdG9yPExheWVyPiBnZXRMYXllckl0ZXJhdG9yKCk7CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxMYXllcj4gZ2V0TGF5ZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNpemUgaW4gcGl4ZWxzIG9mIHRoZSByb290IG9mIHRoZSBsYXllciB0cmVlLCB0aGlzIGlzIHVzdWFseSBhIGNhbnZhcworICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2l6ZSBvZiB0aGUgd2hvbGUgbGF5ZXIgdHJlZQorICAgICAqLworICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0Um9vdFNpemUoKTsKKworfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9QYWludGVkU2hhcGUuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvUGFpbnRlZFNoYXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2ZDNjYgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvUGFpbnRlZFNoYXBlLmphdmEKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lcjsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuTWF0dGU7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5wYWludC5QYWludE1vZGVsOworCitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKK2ltcG9ydCBqYXZhLmF3dC5CYXNpY1N0cm9rZTsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFkaWVudFBhaW50OworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuTGluZWFyR3JhZGllbnRQYWludDsKK2ltcG9ydCBqYXZhLmF3dC5QYWludDsKK2ltcG9ydCBqYXZhLmF3dC5SYWRpYWxHcmFkaWVudFBhaW50OworaW1wb3J0IGphdmEuYXd0LlNoYXBlOworaW1wb3J0IGphdmEuYXd0Lmdlb20uRWxsaXBzZTJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uTGluZTJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUGFpbnRlZFNoYXBlCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoTWF5IDIyLCAyMDA3KQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFpbnRlZFNoYXBlIGV4dGVuZHMgU2ltcGxlU2hhcGUgeworCisgICAgcHJpdmF0ZSBQYWludE1vZGVsIHBhaW50OworICAgIC8vIGNvbnRyb2wgcG9pbnRzIGZvciBwYWludCBjb250cm9sIHR5cGVzCisgICAgcHJpdmF0ZSBEb3VibGVCZWFuIHB4MSA9IG5ldyBEb3VibGVCZWFuKDAuMjUpOworICAgIHByaXZhdGUgRG91YmxlQmVhbiBweDIgPSBuZXcgRG91YmxlQmVhbigwLjc1KTsKKyAgICBwcml2YXRlIERvdWJsZUJlYW4gcHkxID0gbmV3IERvdWJsZUJlYW4oMCk7CisgICAgcHJpdmF0ZSBEb3VibGVCZWFuIHB5MiA9IG5ldyBEb3VibGVCZWFuKDEpOworICAgIHByaXZhdGUgQ29udHJvbFBvaW50IHB0bCA9IG5ldyBQYWludENvbnRyb2xQb2ludChweDEsIHB5MSk7CisgICAgcHJpdmF0ZSBDb250cm9sUG9pbnQgcHRyID0gbmV3IFBhaW50Q29udHJvbFBvaW50KHB4MiwgcHkxKTsKKyAgICBwcml2YXRlIENvbnRyb2xQb2ludCBwYmwgPSBuZXcgUGFpbnRDb250cm9sUG9pbnQocHgxLCBweTIpOworICAgIHByaXZhdGUgQ29udHJvbFBvaW50IHBiciA9IG5ldyBQYWludENvbnRyb2xQb2ludChweDIsIHB5Mik7CisgICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnQuIiArIGV2dC5nZXRQcm9wZXJ0eU5hbWUoKSwgZXZ0LmdldE9sZFZhbHVlKCksIGV2dC5nZXROZXdWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcm90ZWN0ZWQgUGFpbnRlZFNoYXBlKCkgeworICAgICAgICBweDEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ4MSIsIGV2dC5nZXRPbGRWYWx1ZSgpLCBldnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBweTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ5MSIsIGV2dC5nZXRPbGRWYWx1ZSgpLCBldnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBweDIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ4MiIsIGV2dC5nZXRPbGRWYWx1ZSgpLCBldnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBweTIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ5MiIsIGV2dC5nZXRPbGRWYWx1ZSgpLCBldnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYWludGVkU2hhcGUoVUlEZWZhdWx0cyBjYW52YXNVaURlZmF1bHRzKSB7CisgICAgICAgIHRoaXMoKTsKKyAgICAgICAgc2V0UGFpbnRNb2RlbChuZXcgTWF0dGUoQ29sb3IuT1JBTkdFLCBjYW52YXNVaURlZmF1bHRzKSk7CisgICAgfQorCisgICAgcHVibGljIFBhaW50TW9kZWwgZ2V0UGFpbnRNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHBhaW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhaW50TW9kZWwoUGFpbnRNb2RlbCBwYWludCkgeworICAgICAgICBQYWludE1vZGVsIG9sZCA9IGdldFBhaW50TW9kZWwoKTsKKyAgICAgICAgaWYgKG9sZCAhPSBudWxsKSBvbGQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwYWludExpc3RlbmVyKTsKKyAgICAgICAgdGhpcy5wYWludCA9IHBhaW50OworICAgICAgICB0aGlzLnBhaW50LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGFpbnRMaXN0ZW5lcik7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnRNb2RlbCIsIG9sZCwgZ2V0UGFpbnRNb2RlbCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFpbnQgZ2V0UGFpbnQoKSB7CisgICAgICAgIFBhaW50IHAgPSBnZXRQYWludE1vZGVsKCkuZ2V0UGFpbnQoKTsKKyAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBDb2xvcikgeworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgLy9yZXNpemUgcCBhcyBuZWNlc3NhcnkgdG8gZml0IHRoZSBib3VuZHMgb2YgdGhpcyBQYWludGVkU2hhcGUKKyAgICAgICAgUmVjdGFuZ2xlMkQgYm91bmRzID0gZ2V0Qm91bmRzKDApOworICAgICAgICBpZiAocCBpbnN0YW5jZW9mIExpbmVhckdyYWRpZW50UGFpbnQpIHsKKyAgICAgICAgICAgIExpbmVhckdyYWRpZW50UGFpbnQgbGdwID0gKExpbmVhckdyYWRpZW50UGFpbnQpIHA7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpbmVhckdyYWRpZW50UGFpbnQoCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRMb2NhbFBvaW50KHB0bC5nZXRQb3NpdGlvbigpLCBib3VuZHMpLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0TG9jYWxQb2ludChwYnIuZ2V0UG9zaXRpb24oKSwgYm91bmRzKSwKKyAgICAgICAgICAgICAgICAgICAgbGdwLmdldEZyYWN0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICBsZ3AuZ2V0Q29sb3JzKCkpOworICAgICAgICB9IGVsc2UgaWYgKHAgaW5zdGFuY2VvZiBSYWRpYWxHcmFkaWVudFBhaW50KSB7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudFBhaW50IHJncCA9IChSYWRpYWxHcmFkaWVudFBhaW50KSBwOworICAgICAgICAgICAgUG9pbnQyRCBvdXRlciA9IGNvbnZlcnRMb2NhbFBvaW50KHB0bC5nZXRQb3NpdGlvbigpLCBib3VuZHMpOworICAgICAgICAgICAgUG9pbnQyRCBjZW50ZXIgPSBjb252ZXJ0TG9jYWxQb2ludChwYnIuZ2V0UG9zaXRpb24oKSwgYm91bmRzKTsKKyAgICAgICAgICAgIGRvdWJsZSBkZWx0YVggPSBNYXRoLmFicyhjZW50ZXIuZ2V0WCgpIC0gb3V0ZXIuZ2V0WCgpKTsKKyAgICAgICAgICAgIGRvdWJsZSBkZWx0YVkgPSBNYXRoLmFicyhjZW50ZXIuZ2V0WSgpIC0gb3V0ZXIuZ2V0WSgpKTsKKyAgICAgICAgICAgIGZsb2F0IHJhZGl1cyA9IChmbG9hdCkgTWF0aC5zcXJ0KChkZWx0YVggKiBkZWx0YVgpICsgKGRlbHRhWSAqIGRlbHRhWSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSYWRpYWxHcmFkaWVudFBhaW50KAorICAgICAgICAgICAgICAgICAgICBjZW50ZXIsCisgICAgICAgICAgICAgICAgICAgIHJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgcmdwLmdldEZyYWN0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICByZ3AuZ2V0Q29sb3JzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgQ29udHJvbFBvaW50PiBnZXRDb250cm9sUG9pbnRzKCkgeworICAgICAgICBzd2l0Y2ggKHBhaW50LmdldFBhaW50Q29udHJvbFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBjb250cm9sX2xpbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QocHRsLCBwYnIpOworICAgICAgICAgICAgY2FzZSBjb250cm9sX3JlY3Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QocHRsLCBwdHIsIHBibCwgcGJyKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFpbnRGaWxsQ29udHJvbHMoR3JhcGhpY3MyRCBnMiwgZG91YmxlIHBpeGVsU2l6ZSwgYm9vbGVhbiBwYWludENvbnRyb2xMaW5lcykgeworICAgICAgICBzd2l0Y2ggKHBhaW50LmdldFBhaW50Q29udHJvbFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBjb250cm9sX2xpbmU6CisgICAgICAgICAgICAgICAgUG9pbnQyRCBwMSA9IGNvbnZlcnRMb2NhbFBvaW50KHB0bC5nZXRQb3NpdGlvbigpLCBQYWludGVkU2hhcGUudGhpcy5nZXRCb3VuZHMoMCkpOworICAgICAgICAgICAgICAgIFBvaW50MkQgcDIgPSBjb252ZXJ0TG9jYWxQb2ludChwYnIuZ2V0UG9zaXRpb24oKSwgUGFpbnRlZFNoYXBlLnRoaXMuZ2V0Qm91bmRzKDApKTsKKyAgICAgICAgICAgICAgICBnMi5zZXRTdHJva2UobmV3IEJhc2ljU3Ryb2tlKChmbG9hdCkgcGl4ZWxTaXplKSk7CisgICAgICAgICAgICAgICAgZzIuc2V0Q29sb3IoR3JhcGhpY3NIZWxwZXIuRklMTF9MSU5FKTsKKyAgICAgICAgICAgICAgICBnMi5kcmF3KG5ldyBMaW5lMkQuRG91YmxlKHAxLmdldFgoKSwgcDEuZ2V0WSgpLCBwMi5nZXRYKCksIHAyLmdldFkoKSkpOworICAgICAgICAgICAgICAgIHB0bC5wYWludENvbnRyb2xzKGcyLCBwaXhlbFNpemUsIHRydWUpOworICAgICAgICAgICAgICAgIHBici5wYWludENvbnRyb2xzKGcyLCBwaXhlbFNpemUsIHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjb250cm9sX3JlY3Q6CisgICAgICAgICAgICAgICAgZzIuc2V0U3Ryb2tlKG5ldyBCYXNpY1N0cm9rZSgoZmxvYXQpIHBpeGVsU2l6ZSkpOworICAgICAgICAgICAgICAgIGcyLnNldENvbG9yKEdyYXBoaWNzSGVscGVyLkZJTExfTElORSk7CisgICAgICAgICAgICAgICAgZzIuZHJhdyhuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgcHgxLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBweTEuZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB4Mi5nZXRWYWx1ZSgpIC0gcHgxLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBweTIuZ2V0VmFsdWUoKSAtIHB5MS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgcHRsLnBhaW50Q29udHJvbHMoZzIsIHBpeGVsU2l6ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcHRyLnBhaW50Q29udHJvbHMoZzIsIHBpeGVsU2l6ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcGJsLnBhaW50Q29udHJvbHMoZzIsIHBpeGVsU2l6ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcGJyLnBhaW50Q29udHJvbHMoZzIsIHBpeGVsU2l6ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3ZlKGRvdWJsZSBtb3ZlWCwgZG91YmxlIG1vdmVZLCBib29sZWFuIHNuYXBQaXhlbHMpIHsKKyAgICAgICAgZm9yIChDb250cm9sUG9pbnQgY29udHJvbFBvaW50IDogZ2V0Q29udHJvbFBvaW50cygpKSB7CisgICAgICAgICAgICBpZiAoIShjb250cm9sUG9pbnQgaW5zdGFuY2VvZiBQYWludENvbnRyb2xQb2ludCkpIGNvbnRyb2xQb2ludC5tb3ZlKG1vdmVYLCBtb3ZlWSwgc25hcFBpeGVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFBhaW50WDEoKSB7CisgICAgICAgIHJldHVybiBweDEuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWludFgxKGRvdWJsZSB4MSkgeworICAgICAgICB0aGlzLnB4MS5zZXRWYWx1ZSh4MSk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRQYWludFgyKCkgeworICAgICAgICByZXR1cm4gcHgyLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFpbnRYMihkb3VibGUgeDIpIHsKKyAgICAgICAgdGhpcy5weDIuc2V0VmFsdWUoeDIpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0UGFpbnRZMSgpIHsKKyAgICAgICAgcmV0dXJuIHB5MS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhaW50WTEoZG91YmxlIHkxKSB7CisgICAgICAgIHRoaXMucHkxLnNldFZhbHVlKHkxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFBhaW50WTIoKSB7CisgICAgICAgIHJldHVybiBweTIuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWludFkyKGRvdWJsZSB5MikgeworICAgICAgICB0aGlzLnB5Mi5zZXRWYWx1ZSh5Mik7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBQcml2YXRlIGhlbHBlciBtZXRob2RzCisKKyAgICBwcml2YXRlIFBvaW50MkQgY29udmVydExvY2FsUG9pbnQoUG9pbnQyRCBwb2ludCwgUmVjdGFuZ2xlMkQgYm91bmRzKSB7CisgICAgICAgIHBvaW50LnNldExvY2F0aW9uKAorICAgICAgICAgICAgICAgIGJvdW5kcy5nZXRYKCkgKyAocG9pbnQuZ2V0WCgpICogYm91bmRzLmdldFdpZHRoKCkpLAorICAgICAgICAgICAgICAgIGJvdW5kcy5nZXRZKCkgKyAocG9pbnQuZ2V0WSgpICogYm91bmRzLmdldEhlaWdodCgpKQorICAgICAgICApOworICAgICAgICByZXR1cm4gcG9pbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBQb2ludDJEIGNvbnZlcnRTY3JlZW5Qb2ludChQb2ludDJEIHBvaW50LCBSZWN0YW5nbGUyRCBib3VuZHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludDJELkRvdWJsZSgKKyAgICAgICAgICAgICAgICAocG9pbnQuZ2V0WCgpIC0gYm91bmRzLmdldFgoKSkgLyBib3VuZHMuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAocG9pbnQuZ2V0WSgpIC0gYm91bmRzLmdldFkoKSkgLyBib3VuZHMuZ2V0SGVpZ2h0KCkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEdyYWRpZW50IENvbnRyb2xQb2ludAorCisgICAgLyoqCisgICAgICogQSBTcGVjaWFsIENvbnRyb2xQb2ludCB0aGF0cyBpbnRlcm5hbCB2YWx1ZXMgYXJlIGluIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSBzaGFwZXMgYm91bmRzLiBXaXRoIDAsMCBiZWluZyB0aGUKKyAgICAgKiB0b3AgbGVmdCBvZiB0aGUgc2hhcGUgYW5kIDEuMFggPT0gc2hhcGUgd2lkdGggYW5kIDEuMFkgPT0gc2hhcGVzIGhlaWdodC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUGFpbnRDb250cm9sUG9pbnQgZXh0ZW5kcyBDb250cm9sUG9pbnQgeworICAgICAgICBwdWJsaWMgUGFpbnRDb250cm9sUG9pbnQoKSB7CisgICAgICAgICAgICBzdXBlcihHcmFwaGljc0hlbHBlci5GSUxMX0NQX0ZJTEwsIEdyYXBoaWNzSGVscGVyLkZJTExfQ1BfTElORSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFpbnRDb250cm9sUG9pbnQoRG91YmxlQmVhbiB4LCBEb3VibGVCZWFuIHkpIHsKKyAgICAgICAgICAgIHN1cGVyKHgsIHksIEdyYXBoaWNzSGVscGVyLkZJTExfQ1BfRklMTCwgR3JhcGhpY3NIZWxwZXIuRklMTF9DUF9MSU5FKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbHMoR3JhcGhpY3MyRCBnMiwgZG91YmxlIHBpeGVsU2l6ZSwgYm9vbGVhbiBwYWludENvbnRyb2xMaW5lcykgeworICAgICAgICAgICAgUG9pbnQyRCBwID0gY29udmVydExvY2FsUG9pbnQoZ2V0UG9zaXRpb24oKSwgUGFpbnRlZFNoYXBlLnRoaXMuZ2V0Qm91bmRzKDApKTsKKyAgICAgICAgICAgIGcyLnNldFN0cm9rZShuZXcgQmFzaWNTdHJva2UoKGZsb2F0KSBwaXhlbFNpemUpKTsKKyAgICAgICAgICAgIGRvdWJsZSBzaXplID0gcGl4ZWxTaXplICogNGQ7CisgICAgICAgICAgICBTaGFwZSBzID0gbmV3IEVsbGlwc2UyRC5Eb3VibGUocC5nZXRYKCkgLSBzaXplLCBwLmdldFkoKSAtIHNpemUsCisgICAgICAgICAgICAgICAgICAgIHNpemUgKiAyLCBzaXplICogMik7CisgICAgICAgICAgICBnMi5zZXRQYWludChuZXcgR3JhZGllbnRQYWludCgKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBwLmdldFgoKSwgKGZsb2F0KSAocC5nZXRZKCkgLSBzaXplKSwgQ29sb3IuQ1lBTiwKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBwLmdldFgoKSwgKGZsb2F0KSAocC5nZXRZKCkgKyBzaXplKSwgQ29sb3IuV0hJVEUKKyAgICAgICAgICAgICkpOworICAgICAgICAgICAgZzIuZmlsbChzKTsKKyAgICAgICAgICAgIGcyLnNldENvbG9yKEdyYXBoaWNzSGVscGVyLkZJTExfQ1BfTElORSk7CisgICAgICAgICAgICBnMi5kcmF3KHMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbW92ZShkb3VibGUgbW92ZVgsIGRvdWJsZSBtb3ZlWSwgYm9vbGVhbiBzbmFwUGl4ZWxzKSB7CisgICAgICAgICAgICBSZWN0YW5nbGUyRCBib3VuZHMgPSBQYWludGVkU2hhcGUudGhpcy5nZXRCb3VuZHMoMCk7CisgICAgICAgICAgICBtb3ZlWCA9IG1vdmVYIC8gYm91bmRzLmdldFdpZHRoKCk7CisgICAgICAgICAgICBtb3ZlWSA9IG1vdmVZIC8gYm91bmRzLmdldEhlaWdodCgpOworICAgICAgICAgICAgaWYgKHNuYXBQaXhlbHMpIHsKKyAgICAgICAgICAgICAgICAvLyBzbmFwIHRvIG5lYXJlYXN0IDAuNQorICAgICAgICAgICAgICAgIGRvdWJsZSBuZXdYID0gTWF0aC5yb3VuZCgoeC5nZXRWYWx1ZSgpICsgbW92ZVgpICogMmQpIC8gMmQ7CisgICAgICAgICAgICAgICAgZG91YmxlIG5ld1kgPSBNYXRoLnJvdW5kKCh5LmdldFZhbHVlKCkgKyBtb3ZlWSkgKiAyZCkgLyAyZDsKKyAgICAgICAgICAgICAgICBzZXRQb3NpdGlvbihuZXdYLCBuZXdZKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0UG9zaXRpb24oeC5nZXRWYWx1ZSgpICsgbW92ZVgsIHkuZ2V0VmFsdWUoKSArIG1vdmVZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoZG91YmxlIHBpeGVsU2l6ZSkgeworICAgICAgICAgICAgUG9pbnQyRCBwID0gY29udmVydExvY2FsUG9pbnQoZ2V0UG9zaXRpb24oKSwgUGFpbnRlZFNoYXBlLnRoaXMuZ2V0Qm91bmRzKDApKTsKKyAgICAgICAgICAgIGRvdWJsZSBzaXplID0gcGl4ZWxTaXplICogNGQ7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZShwLmdldFgoKSAtIHNpemUsIHAuZ2V0WSgpIC0gc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSAqIDIsIHNpemUgKiAyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvUGF0aFNoYXBlLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL1BhdGhTaGFwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTk3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL1BhdGhTaGFwZS5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5HZW5lcmFsUGF0aDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLlBvaW50MkQ7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUGF0aFNoYXBlCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoTWF5IDI5LCAyMDA3KQorICovCitwdWJsaWMgY2xhc3MgUGF0aFNoYXBlIGV4dGVuZHMgUGFpbnRlZFNoYXBlIHsKKworICAgIHByaXZhdGUgU2hhcGUgY2FjaGVkU2hhcGUgPSBudWxsOworICAgIHByaXZhdGUgTGlzdDxCZXppZXJDb250cm9sUG9pbnQ+IGNvbnRyb2xQb2ludHMgPSBuZXcgQXJyYXlMaXN0PEJlemllckNvbnRyb2xQb2ludD4oKTsKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY3BMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgcmVidWlsZFNoYXBlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKworICAgIC8qKiBwcml2YXRlIG5vYXJncyBjb25zdHJ1Y3RvciBmb3IgSklCWCAqLworICAgIHByaXZhdGUgUGF0aFNoYXBlKCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBQYXRoU2hhcGUoVUlEZWZhdWx0cyBjYW52YXNVaURlZmF1bHRzKSB7CisgICAgICAgIHN1cGVyKGNhbnZhc1VpRGVmYXVsdHMpOworICAgIH0KKworICAgIHB1YmxpYyBCZXppZXJDb250cm9sUG9pbnQgYWRkUG9pbnQoZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgICAgICAgIEJlemllckNvbnRyb2xQb2ludCBjcCA9IG5ldyBCZXppZXJDb250cm9sUG9pbnQoeCwgeSk7CisgICAgICAgIGNvbnRyb2xQb2ludHMuYWRkKGNwKTsKKyAgICAgICAgY3AuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihjcExpc3RlbmVyKTsKKyAgICAgICAgLy8gdXBkYXRlIHNoYXBlCisgICAgICAgIHJlYnVpbGRTaGFwZSgpOworICAgICAgICAvLyByZXR1cm4gbmV3IGNvbnRyb2wgcG9pbnQKKyAgICAgICAgcmV0dXJuIGNwOworICAgIH0KKworICAgIHB1YmxpYyBTaGFwZSBnZXRTaGFwZSgpIHsKKyAgICAgICAgaWYgKGNhY2hlZFNoYXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYnVpbGRTaGFwZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjYWNoZWRTaGFwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVidWlsZFNoYXBlKCkgeworICAgICAgICBHZW5lcmFsUGF0aCBwYXRoID0gbmV3IEdlbmVyYWxQYXRoKCk7CisgICAgICAgIEJlemllckNvbnRyb2xQb2ludCBmaXJzdCwgbGFzdDsKKyAgICAgICAgZmlyc3QgPSBsYXN0ID0gY29udHJvbFBvaW50cy5nZXQoMCk7CisgICAgICAgIHBhdGgubW92ZVRvKChmbG9hdCkgZmlyc3QuZ2V0WCgpLCAoZmxvYXQpIGZpcnN0LmdldFkoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbFBvaW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQmV6aWVyQ29udHJvbFBvaW50IGNvbnRyb2xQb2ludCA9IGNvbnRyb2xQb2ludHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGxhc3QuZ2V0Q3AyKCkuaXNTaGFycCgpICYmIGNvbnRyb2xQb2ludC5nZXRDcDEoKS5pc1NoYXJwKCkpIHsKKyAgICAgICAgICAgICAgICBwYXRoLmxpbmVUbyhjb250cm9sUG9pbnQuZ2V0WCgpLCBjb250cm9sUG9pbnQuZ2V0WSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF0aC5jdXJ2ZVRvKAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBsYXN0LmdldENwMigpLmdldFgoKSwgKGZsb2F0KSBsYXN0LmdldENwMigpLmdldFkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgY29udHJvbFBvaW50LmdldENwMSgpLmdldFgoKSwgKGZsb2F0KSBjb250cm9sUG9pbnQuZ2V0Q3AxKCkuZ2V0WSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBjb250cm9sUG9pbnQuZ2V0WCgpLCAoZmxvYXQpIGNvbnRyb2xQb2ludC5nZXRZKCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IGNvbnRyb2xQb2ludDsKKyAgICAgICAgfQorICAgICAgICAvLyBjbG9zZSBwYXRoCisgICAgICAgIGlmIChsYXN0LmdldENwMigpLmlzU2hhcnAoKSAmJiBmaXJzdC5nZXRDcDEoKS5pc1NoYXJwKCkpIHsKKyAgICAgICAgICAgIHBhdGgubGluZVRvKGZpcnN0LmdldFgoKSwgZmlyc3QuZ2V0WSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhdGguY3VydmVUbygKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBsYXN0LmdldENwMigpLmdldFgoKSwgKGZsb2F0KSBsYXN0LmdldENwMigpLmdldFkoKSwKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBmaXJzdC5nZXRDcDEoKS5nZXRYKCksIChmbG9hdCkgZmlyc3QuZ2V0Q3AxKCkuZ2V0WSgpLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIGZpcnN0LmdldFgoKSwgKGZsb2F0KSBmaXJzdC5nZXRZKCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgcGF0aC5jbG9zZVBhdGgoKTsKKyAgICAgICAgLy8gZmlyZSBjaGFuZ2UKKyAgICAgICAgY2FjaGVkU2hhcGUgPSBwYXRoOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNoYXBlIiwgbnVsbCwgY2FjaGVkU2hhcGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBwID0gIlBBVEgge1xuIjsKKyAgICAgICAgQmV6aWVyQ29udHJvbFBvaW50IGZpcnN0LCBsYXN0OworICAgICAgICBmaXJzdCA9IGxhc3QgPSBjb250cm9sUG9pbnRzLmdldCgwKTsKKyAgICAgICAgcCArPSAiICAgcGF0aC5tb3ZlVG8oIiArIGZpcnN0LmdldFgoKSArICIsIiArIGZpcnN0LmdldFkoKSArICIpOyI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbFBvaW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQmV6aWVyQ29udHJvbFBvaW50IGNvbnRyb2xQb2ludCA9IGNvbnRyb2xQb2ludHMuZ2V0KGkpOworICAgICAgICAgICAgcCArPSAiICAgcGF0aC5jdXJ2ZVRvKCIgKworICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIGxhc3QuZ2V0Q3AyKCkuZ2V0WCgpICsgIiwiICsgKGZsb2F0KSBsYXN0LmdldENwMigpLmdldFkoKSArICIsIiArCisgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgY29udHJvbFBvaW50LmdldENwMSgpLmdldFgoKSArICIsIiArIChmbG9hdCkgY29udHJvbFBvaW50LmdldENwMSgpLmdldFkoKSArICIsIiArCisgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgY29udHJvbFBvaW50LmdldFgoKSArICIsIiArIChmbG9hdCkgY29udHJvbFBvaW50LmdldFkoKSArCisgICAgICAgICAgICAgICAgICAgICIpO1xuIjsKKyAgICAgICAgICAgIGxhc3QgPSBjb250cm9sUG9pbnQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2xvc2UgcGF0aAorICAgICAgICBwICs9ICIgICBwYXRoLmN1cnZlVG8oIiArCisgICAgICAgICAgICAgICAgKGZsb2F0KSBsYXN0LmdldENwMigpLmdldFgoKSArICIsIiArIChmbG9hdCkgbGFzdC5nZXRDcDIoKS5nZXRZKCkgKyAiLCIgKworICAgICAgICAgICAgICAgIChmbG9hdCkgZmlyc3QuZ2V0Q3AxKCkuZ2V0WCgpICsgIiwiICsgKGZsb2F0KSBmaXJzdC5nZXRDcDEoKS5nZXRZKCkgKyAiLCIgKworICAgICAgICAgICAgICAgIChmbG9hdCkgZmlyc3QuZ2V0WCgpICsgIiwiICsgKGZsb2F0KSBmaXJzdC5nZXRZKCkgKworICAgICAgICAgICAgICAgICIpO1xuIjsKKyAgICAgICAgcCArPSAifVxuIjsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBTaGFwZSBNZXRob2RzCisKKyAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKGRvdWJsZSBwaXhlbFNpemUpIHsKKyAgICAgICAgcmV0dXJuIGdldFNoYXBlKCkuZ2V0Qm91bmRzMkQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgQ29udHJvbFBvaW50PiBnZXRDb250cm9sUG9pbnRzKCkgeworICAgICAgICBMaXN0PENvbnRyb2xQb2ludD4gcHRzID0gbmV3IEFycmF5TGlzdDxDb250cm9sUG9pbnQ+KCk7CisgICAgICAgIGZvciAoQmV6aWVyQ29udHJvbFBvaW50IGNvbnRyb2xQb2ludCA6IGNvbnRyb2xQb2ludHMpIHsKKyAgICAgICAgICAgIHB0cy5hZGQoY29udHJvbFBvaW50KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKENvbnRyb2xQb2ludCBjb250cm9sUG9pbnQgOiBzdXBlci5nZXRDb250cm9sUG9pbnRzKCkpIHsKKyAgICAgICAgICAgIHB0cy5hZGQoY29udHJvbFBvaW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xQb2ludHMoTGlzdDxCZXppZXJDb250cm9sUG9pbnQ+IGNvbnRyb2xQb2ludHMpIHsKKyAgICAgICAgTGlzdDxCZXppZXJDb250cm9sUG9pbnQ+IG9sZCA9IHRoaXMuY29udHJvbFBvaW50czsKKyAgICAgICAgZm9yIChCZXppZXJDb250cm9sUG9pbnQgY3AgOiBvbGQpIHsKKyAgICAgICAgICAgIGNwLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY3BMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jb250cm9sUG9pbnRzID0gY29udHJvbFBvaW50czsKKyAgICAgICAgZm9yIChCZXppZXJDb250cm9sUG9pbnQgY3AgOiB0aGlzLmNvbnRyb2xQb2ludHMpIHsKKyAgICAgICAgICAgIGNwLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoY3BMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlIHNoYXBlCisgICAgICAgIHJlYnVpbGRTaGFwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSGl0KFBvaW50MkQgcCwgZG91YmxlIHBpeGVsU2l6ZSkgeworICAgICAgICByZXR1cm4gZ2V0U2hhcGUoKS5jb250YWlucyhwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljczJEIGcyLCBkb3VibGUgcGl4ZWxTaXplKSB7CisgICAgICAgIGcyLnNldFBhaW50KGdldFBhaW50KCkpOworICAgICAgICBnMi5maWxsKGdldFNoYXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbHMoR3JhcGhpY3MyRCBnMiwgZG91YmxlIHBpeGVsU2l6ZSwgYm9vbGVhbiBwYWludENvbnRyb2xMaW5lcykgeworICAgICAgICBpZiAocGFpbnRDb250cm9sTGluZXMpIHsKKyAgICAgICAgICAgIGcyLnNldFN0cm9rZShuZXcgQmFzaWNTdHJva2UoKGZsb2F0KSBwaXhlbFNpemUpKTsKKyAgICAgICAgICAgIGcyLnNldENvbG9yKEdyYXBoaWNzSGVscGVyLkNPTlRST0xfTElORSk7CisgICAgICAgICAgICBnMi5kcmF3KGdldFNoYXBlKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoQmV6aWVyQ29udHJvbFBvaW50IGNvbnRyb2xQb2ludCA6IGNvbnRyb2xQb2ludHMpIHsKKyAgICAgICAgICAgIGlmICghY29udHJvbFBvaW50LmlzU2hhcnBDb3JuZXIoKSkgY29udHJvbFBvaW50LnBhaW50Q29udHJvbHMoZzIsIHBpeGVsU2l6ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxCZXppZXJDb250cm9sUG9pbnQ+IGdldEJlemllckNvbnRyb2xQb2ludHMoKSB7CisgICAgICAgIHJldHVybiBjb250cm9sUG9pbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvUmVjdGFuZ2xlU2hhcGUuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvUmVjdGFuZ2xlU2hhcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNlZjNmCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9SZWN0YW5nbGVTaGFwZS5qYXZhCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5FbGxpcHNlMkQ7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5Qb2ludDJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5Sb3VuZFJlY3RhbmdsZTJEOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZWN0YW5nbGVTaGFwZQorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKE1heSAyMiwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIFJlY3RhbmdsZVNoYXBlIGV4dGVuZHMgUGFpbnRlZFNoYXBlIHsKKworICAgIHByaXZhdGUgRG91YmxlQmVhbiB4MSA9IG5ldyBEb3VibGVCZWFuKCk7CisgICAgcHJpdmF0ZSBEb3VibGVCZWFuIHgyID0gbmV3IERvdWJsZUJlYW4oKTsKKyAgICBwcml2YXRlIERvdWJsZUJlYW4geTEgPSBuZXcgRG91YmxlQmVhbigpOworICAgIHByaXZhdGUgRG91YmxlQmVhbiB5MiA9IG5ldyBEb3VibGVCZWFuKCk7CisgICAgcHJpdmF0ZSBDb250cm9sUG9pbnQgdGwgPSBuZXcgQ29udHJvbFBvaW50KHgxLCB5MSk7CisgICAgcHJpdmF0ZSBDb250cm9sUG9pbnQgdHIgPSBuZXcgQ29udHJvbFBvaW50KHgyLCB5MSk7CisgICAgcHJpdmF0ZSBDb250cm9sUG9pbnQgYmwgPSBuZXcgQ29udHJvbFBvaW50KHgxLCB5Mik7CisgICAgcHJpdmF0ZSBDb250cm9sUG9pbnQgYnIgPSBuZXcgQ29udHJvbFBvaW50KHgyLCB5Mik7CisgICAgcHJpdmF0ZSBEb3VibGVCZWFuIHJvdW5kaW5nWCA9IG5ldyBEb3VibGVCZWFuKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgICAgIC8vIGNvbnRyYWluIHkgPSB5MSBhbmQgeCBpcyBiZXR3ZWVuIHgxKzEgYW5kICh4Mi14MSkvMgorICAgICAgICAgICAgYm9vbGVhbiB4MWlzTGVzcyA9IHgxLmdldFZhbHVlKCkgPCB4Mi5nZXRWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIG1pbiA9IHgxaXNMZXNzID8geDEuZ2V0VmFsdWUoKSArIDEgOiB4MS5nZXRWYWx1ZSgpIC0gMTsKKyAgICAgICAgICAgIGRvdWJsZSBtYXggPSB4MWlzTGVzcyA/IHgxLmdldFZhbHVlKCkgKyAoKHgyLmdldFZhbHVlKCkgLSB4MS5nZXRWYWx1ZSgpKSAvIDIpIDoKKyAgICAgICAgICAgICAgICAgICAgeDIuZ2V0VmFsdWUoKSArICgoeDEuZ2V0VmFsdWUoKSAtIHgyLmdldFZhbHVlKCkpIC8gMik7CisgICAgICAgICAgICBkb3VibGUgbmV3WCA9IHZhbHVlOworICAgICAgICAgICAgaWYgKG5ld1ggPCBtaW4pIG5ld1ggPSBtaW47CisgICAgICAgICAgICBpZiAobmV3WCA+IG1heCkgbmV3WCA9IG1heDsKKyAgICAgICAgICAgIHN1cGVyLnNldFZhbHVlKG5ld1gpOworICAgICAgICB9CisgICAgfTsKKyAgICBwcml2YXRlIENvbnRyb2xQb2ludCByb3VuZGluZyA9IG5ldyBDb250cm9sUG9pbnQocm91bmRpbmdYLCB5MSkgeworICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2xzKEdyYXBoaWNzMkQgZzIsIGRvdWJsZSBwaXhlbFNpemUsIGJvb2xlYW4gcGFpbnRDb250cm9sTGluZXMpIHsKKyAgICAgICAgICAgIGRvdWJsZSBzaXplID0gcGl4ZWxTaXplICogM2Q7CisgICAgICAgICAgICBTaGFwZSBzID0gbmV3IEVsbGlwc2UyRC5Eb3VibGUoZ2V0WCgpIC0gc2l6ZSwgZ2V0WSgpIC0gc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSAqIDIsIHNpemUgKiAyKTsKKyAgICAgICAgICAgIGcyLnNldENvbG9yKEdyYXBoaWNzSGVscGVyLkJFWklFUl9DT05UUk9MX1BPSU5UX0ZJTEwpOworICAgICAgICAgICAgZzIuZmlsbChzKTsKKyAgICAgICAgICAgIGcyLnNldENvbG9yKEdyYXBoaWNzSGVscGVyLkJFWklFUl9DT05UUk9MX1BPSU5UX0xJTkUpOworICAgICAgICAgICAgZzIuZHJhdyhzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKFBvaW50MkQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIG9ubHkgYWxvdyBYIHRvIGNoYW5nZQorICAgICAgICAgICAgeC5zZXRWYWx1ZShwb3NpdGlvbi5nZXRYKCkpOworICAgICAgICB9CisKKyAgICB9OworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKworICAgIC8qKiBwcml2YXRlIG5vYXJncyBjb25zdHJ1Y3RvciBmb3IgSklCWCAqLworICAgIHByaXZhdGUgUmVjdGFuZ2xlU2hhcGUoKSB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFJlY3RhbmdsZVNoYXBlKFVJRGVmYXVsdHMgY2FudmFzVWlEZWZhdWx0cykgeworICAgICAgICBzdXBlcihjYW52YXNVaURlZmF1bHRzKTsKKyAgICAgICAgeDEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgLy8ga2VlcCByb3VuZGluZyBwb2ludCBpbiBzeW5jCisgICAgICAgICAgICAgICAgcm91bmRpbmdYLnNldFZhbHVlKHJvdW5kaW5nWC5nZXRWYWx1ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoRG91YmxlKSBldnQuZ2V0TmV3VmFsdWUoKSAtIChEb3VibGUpIGV2dC5nZXRPbGRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJib3VuZHMiLCBudWxsLCBnZXRCb3VuZHMoMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgeDIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgLy8ga2VlcCByb3VuZGluZyBwb2ludCBpbiBzeW5jCisgICAgICAgICAgICAgICAgZG91YmxlIGRpc3RhbmNlRnJvbVgxID0gTWF0aC5hYnMocm91bmRpbmdYLmdldFZhbHVlKCkgLSB4MS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICByb3VuZGluZ1guc2V0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAoeDEuZ2V0VmFsdWUoKSA8IHgyLmdldFZhbHVlKCkpID8geDEuZ2V0VmFsdWUoKSArIGRpc3RhbmNlRnJvbVgxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEuZ2V0VmFsdWUoKSAtIGRpc3RhbmNlRnJvbVgxCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImJvdW5kcyIsIG51bGwsIGdldEJvdW5kcygwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYm91bmRzIiwgbnVsbCwgZ2V0Qm91bmRzKDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgeTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIHkyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICByb3VuZGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVjdGFuZ2xlU2hhcGUoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgdywgZG91YmxlIGgpIHsKKyAgICAgICAgdGhpcygpOworICAgICAgICB4MS5zZXRWYWx1ZSh4KTsKKyAgICAgICAgeTEuc2V0VmFsdWUoeSk7CisgICAgICAgIHgyLnNldFZhbHVlKHggKyB3KTsKKyAgICAgICAgeTIuc2V0VmFsdWUoeSArIGgpOworICAgIH0KKworICAgIHB1YmxpYyBTaGFwZSBnZXRTaGFwZSgpIHsKKyAgICAgICAgZG91YmxlIHJvdW5kaW5nID0gZ2V0Um91bmRpbmcoKTsKKyAgICAgICAgZG91YmxlIGxlZnQgPSBNYXRoLm1pbih4MS5nZXRWYWx1ZSgpLCB4Mi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgZG91YmxlIHJpZ2h0ID0gTWF0aC5tYXgoeDEuZ2V0VmFsdWUoKSwgeDIuZ2V0VmFsdWUoKSk7CisgICAgICAgIGRvdWJsZSB0b3AgPSBNYXRoLm1pbih5MS5nZXRWYWx1ZSgpLCB5Mi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgZG91YmxlIGJvdHRvbSA9IE1hdGgubWF4KHkxLmdldFZhbHVlKCksIHkyLmdldFZhbHVlKCkpOworICAgICAgICBpZiAocm91bmRpbmcgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJvdW5kUmVjdGFuZ2xlMkQuRG91YmxlKAorICAgICAgICAgICAgICAgICAgICBsZWZ0LCB0b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCByb3VuZGluZywgcm91bmRpbmcKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZShsZWZ0LCB0b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0Um91bmRpbmcoKSB7CisgICAgICAgIGRvdWJsZSByb3VuZGluZyA9IE1hdGguYWJzKHJvdW5kaW5nWC5nZXRWYWx1ZSgpIC0geDEuZ2V0VmFsdWUoKSkgKiAyOworICAgICAgICByZXR1cm4gcm91bmRpbmcgPiAyID8gcm91bmRpbmcgOiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvdW5kaW5nKGRvdWJsZSByb3VuZGluZykgeworICAgICAgICBpZiAocm91bmRpbmcgPiAwICYmIHJvdW5kaW5nIDwgMikgcm91bmRpbmcgPSAwOworICAgICAgICByb3VuZGluZ1guc2V0VmFsdWUoKHJvdW5kaW5nIC8gMmQpICsgeDEuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSb3VuZGVkKCkgeworICAgICAgICByZXR1cm4gZ2V0Um91bmRpbmcoKSA+IDA7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRYMSgpIHsKKyAgICAgICAgcmV0dXJuIHgxLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WDEoZG91YmxlIHgxKSB7CisgICAgICAgIHRoaXMueDEuc2V0VmFsdWUoeDEpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0WDIoKSB7CisgICAgICAgIHJldHVybiB4Mi5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFgyKGRvdWJsZSB4MikgeworICAgICAgICB0aGlzLngyLnNldFZhbHVlKHgyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFkxKCkgeworICAgICAgICByZXR1cm4geTEuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRZMShkb3VibGUgeTEpIHsKKyAgICAgICAgdGhpcy55MS5zZXRWYWx1ZSh5MSk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRZMigpIHsKKyAgICAgICAgcmV0dXJuIHkyLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WTIoZG91YmxlIHkyKSB7CisgICAgICAgIHRoaXMueTIuc2V0VmFsdWUoeTIpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gU2ltcGxlU2hhcGUgTWV0aG9kcworCisgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhkb3VibGUgcGl4ZWxTaXplKSB7CisgICAgICAgIGRvdWJsZSBsZWZ0ID0gTWF0aC5taW4oeDEuZ2V0VmFsdWUoKSwgeDIuZ2V0VmFsdWUoKSk7CisgICAgICAgIGRvdWJsZSByaWdodCA9IE1hdGgubWF4KHgxLmdldFZhbHVlKCksIHgyLmdldFZhbHVlKCkpOworICAgICAgICBkb3VibGUgdG9wID0gTWF0aC5taW4oeTEuZ2V0VmFsdWUoKSwgeTIuZ2V0VmFsdWUoKSk7CisgICAgICAgIGRvdWJsZSBib3R0b20gPSBNYXRoLm1heCh5MS5nZXRWYWx1ZSgpLCB5Mi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNIaXQoUG9pbnQyRCBwLCBkb3VibGUgcGl4ZWxTaXplKSB7CisgICAgICAgIHJldHVybiBnZXRTaGFwZSgpLmNvbnRhaW5zKHApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzMkQgZzIsIGRvdWJsZSBwaXhlbFNpemUpIHsKKyAgICAgICAgZzIuc2V0UGFpbnQoZ2V0UGFpbnQoKSk7CisgICAgICAgIGcyLmZpbGwoZ2V0U2hhcGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RnJhbWUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CisgICAgICAgIHRoaXMueDEuc2V0VmFsdWUoeDEpOworICAgICAgICB0aGlzLnkxLnNldFZhbHVlKHkxKTsKKyAgICAgICAgdGhpcy54Mi5zZXRWYWx1ZSh4Mik7CisgICAgICAgIHRoaXMueTIuc2V0VmFsdWUoeTIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFJlY3RhbmdsZTJEIGJvdW5kcyA9IGdldEJvdW5kcygwKTsKKyAgICAgICAgaWYgKGlzUm91bmRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIlJPVU5EIFJFQ1QgeyB4PSIgKyAgYm91bmRzLmdldFgoKSArICIsIHk9IiArIGJvdW5kcy5nZXRZKCkgKyAiLCB3PSIgKyBib3VuZHMuZ2V0V2lkdGgoKSArICIsIGg9IiArIGJvdW5kcy5nZXRIZWlnaHQoKSArICIsIHJvdW5kaW5nPSIgKyBnZXRSb3VuZGluZygpICsgIiB9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiUk9VTkQgUkVDVCB7IHg9IiArICBib3VuZHMuZ2V0WCgpICsgIiwgeT0iICsgYm91bmRzLmdldFkoKSArICIsIHc9IiArIGJvdW5kcy5nZXRXaWR0aCgpICsgIiwgaD0iICsgYm91bmRzLmdldEhlaWdodCgpICsgIiB9IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaXN0PENvbnRyb2xQb2ludD4gZ2V0Q29udHJvbFBvaW50cygpIHsKKyAgICAgICAgTGlzdDxDb250cm9sUG9pbnQ+IHBvaW50cyA9IG5ldyBBcnJheUxpc3Q8Q29udHJvbFBvaW50PigpOworICAgICAgICBwb2ludHMuYWRkQWxsKHN1cGVyLmdldENvbnRyb2xQb2ludHMoKSk7CisgICAgICAgIHBvaW50cy5hZGQodGwpOworICAgICAgICBwb2ludHMuYWRkKHRyKTsKKyAgICAgICAgcG9pbnRzLmFkZChibCk7CisgICAgICAgIHBvaW50cy5hZGQoYnIpOworICAgICAgICBwb2ludHMuYWRkKHJvdW5kaW5nKTsKKyAgICAgICAgcmV0dXJuIHBvaW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2xzKEdyYXBoaWNzMkQgZzIsIGRvdWJsZSBwaXhlbFNpemUsIGJvb2xlYW4gcGFpbnRDb250cm9sTGluZXMpIHsKKyAgICAgICAgaWYgKHBhaW50Q29udHJvbExpbmVzKSB7CisgICAgICAgICAgICBnMi5zZXRTdHJva2UobmV3IEJhc2ljU3Ryb2tlKChmbG9hdCkgcGl4ZWxTaXplKSk7CisgICAgICAgICAgICBnMi5zZXRDb2xvcihHcmFwaGljc0hlbHBlci5DT05UUk9MX0xJTkUpOworICAgICAgICAgICAgZzIuZHJhdyhnZXRTaGFwZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0bC5wYWludENvbnRyb2xzKGcyLCBwaXhlbFNpemUsIHRydWUpOworICAgICAgICB0ci5wYWludENvbnRyb2xzKGcyLCBwaXhlbFNpemUsIHRydWUpOworICAgICAgICBibC5wYWludENvbnRyb2xzKGcyLCBwaXhlbFNpemUsIHRydWUpOworICAgICAgICBici5wYWludENvbnRyb2xzKGcyLCBwaXhlbFNpemUsIHRydWUpOworICAgICAgICByb3VuZGluZy5wYWludENvbnRyb2xzKGcyLCBwaXhlbFNpemUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdmUoZG91YmxlIG1vdmVYLCBkb3VibGUgbW92ZVksIGJvb2xlYW4gc25hcFBpeGVscykgeworICAgICAgICBpZiAoc25hcFBpeGVscykgeworICAgICAgICAgICAgeDEuc2V0VmFsdWUoTWF0aC5yb3VuZCh4MS5nZXRWYWx1ZSgpICsgbW92ZVgpKTsKKyAgICAgICAgICAgIHgyLnNldFZhbHVlKE1hdGgucm91bmQoeDIuZ2V0VmFsdWUoKSArIG1vdmVYKSk7CisgICAgICAgICAgICB5MS5zZXRWYWx1ZShNYXRoLnJvdW5kKHkxLmdldFZhbHVlKCkgKyBtb3ZlWSkpOworICAgICAgICAgICAgeTIuc2V0VmFsdWUoTWF0aC5yb3VuZCh5Mi5nZXRWYWx1ZSgpICsgbW92ZVkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHgxLnNldFZhbHVlKHgxLmdldFZhbHVlKCkgKyBtb3ZlWCk7CisgICAgICAgICAgICB4Mi5zZXRWYWx1ZSh4Mi5nZXRWYWx1ZSgpICsgbW92ZVgpOworICAgICAgICAgICAgeTEuc2V0VmFsdWUoeTEuZ2V0VmFsdWUoKSArIG1vdmVZKTsKKyAgICAgICAgICAgIHkyLnNldFZhbHVlKHkyLmdldFZhbHVlKCkgKyBtb3ZlWSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL1NpbXBsZVNoYXBlLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL1NpbXBsZVNoYXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMWMwZgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvU2ltcGxlU2hhcGUuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXI7CisKK2ltcG9ydCBvcmcuamRlc2t0b3AuYmVhbnMuQWJzdHJhY3RCZWFuOworCitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5TaGFwZTsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybTsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLlBvaW50MkQ7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBTaW1wbGVTaGFwZQorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKE1heSAyMiwgMjAwNykKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZVNoYXBlIGV4dGVuZHMgQWJzdHJhY3RCZWFuIHsKKworICAgIHByb3RlY3RlZCBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgIHByb3RlY3RlZCBMYXllckNvbnRhaW5lciBwYXJlbnQgPSBudWxsOworCisgICAgcHVibGljIHZvaWQgYXBwbHlUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIHQpIHsKKyAgICAgICAgdHJhbnNmb3JtLmNvbmNhdGVuYXRlKHQpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoZG91YmxlIHBpeGVsU2l6ZSk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYWludChHcmFwaGljczJEIGcyLCBkb3VibGUgcGl4ZWxTaXplKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSGl0KFBvaW50MkQgcCwgZG91YmxlIHBpeGVsU2l6ZSk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKFJlY3RhbmdsZTJEIHJlY3QsIGRvdWJsZSBwaXhlbFNpemUpIHsKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kcyhwaXhlbFNpemUpLmludGVyc2VjdHMocmVjdCk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IExpc3Q8PyBleHRlbmRzIENvbnRyb2xQb2ludD4gZ2V0Q29udHJvbFBvaW50cygpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcGFpbnRDb250cm9scyhHcmFwaGljczJEIGcyLCBkb3VibGUgcGl4ZWxTaXplLCBib29sZWFuIHBhaW50Q29udHJvbExpbmVzKTsKKworICAgIHB1YmxpYyB2b2lkIG1vdmUoZG91YmxlIG1vdmVYLCBkb3VibGUgbW92ZVksIGJvb2xlYW4gc25hcFBpeGVscykgeworICAgICAgICBmb3IgKENvbnRyb2xQb2ludCBjb250cm9sUG9pbnQgOiBnZXRDb250cm9sUG9pbnRzKCkpIHsKKyAgICAgICAgICAgIGNvbnRyb2xQb2ludC5tb3ZlKG1vdmVYLCBtb3ZlWSwgc25hcFBpeGVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGF5ZXJDb250YWluZXIgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChMYXllckNvbnRhaW5lciBwYXJlbnQpIHsKKyAgICAgICAgTGF5ZXJDb250YWluZXIgb2xkID0gZ2V0UGFyZW50KCk7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInBhcmVudCIsIG9sZCwgZ2V0UGFyZW50KCkpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBTaGFwZSBnZXRTaGFwZSgpOworfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9UZW1wbGF0ZUxheWVyLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL1RlbXBsYXRlTGF5ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGU1MWMyCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9UZW1wbGF0ZUxheWVyLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lcjsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZWZmZWN0cy5FZmZlY3Q7CisKK2ltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87CitpbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRm9udE1ldHJpY3M7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0NvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKKworLyoqCisgKiBUZW1wbGF0ZUxheWVyCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVsIDIsIDIwMDcpCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wbGF0ZUxheWVyIGV4dGVuZHMgTGF5ZXIgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU29mdFJlZmVyZW5jZTxCdWZmZXJlZEltYWdlPiBpbWdSZWYgPSBudWxsOworCisgICAgcHVibGljIFRlbXBsYXRlTGF5ZXIoKSB7CisgICAgICAgIHR5cGUgPSBMYXllclR5cGUudGVtcGxhdGU7CisgICAgfQorCisgICAgcHVibGljIFRlbXBsYXRlTGF5ZXIoU3RyaW5nIGZpbGVOYW1lLCBCdWZmZXJlZEltYWdlIHRlbXBsYXRlSW1hZ2UpIHsKKyAgICAgICAgc3VwZXIoIlRlbXBsYXRlIik7CisgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgdHlwZSA9IExheWVyVHlwZS50ZW1wbGF0ZTsKKyAgICAgICAgaWYgKHRlbXBsYXRlSW1hZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaW1nUmVmID0gbmV3IFNvZnRSZWZlcmVuY2U8QnVmZmVyZWRJbWFnZT4odGVtcGxhdGVJbWFnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIE1ldGhvZHMKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZW1wbGF0ZSBsYXllcnMgYXJlIGFsd2F5cyBsb2NrZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKFNpbXBsZVNoYXBlIHNoYXBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRlbXBsYXRlIGxheWVycyBjYW4ndCBjb250YWluIHNoYXBlcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEVmZmVjdChFZmZlY3QgZWZmZWN0KSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRlbXBsYXRlIGxheWVycyBjYW4ndCBjb250YWluIGVmZmVjdHMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRMYXllcihpbnQgaSwgTGF5ZXIgbGF5ZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVtcGxhdGUgbGF5ZXJzIGNhbid0IGNvbnRhaW4gc3ViIGxheWVycyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZExheWVyKExheWVyIGxheWVyKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRlbXBsYXRlIGxheWVycyBjYW4ndCBjb250YWluIHN1YiBsYXllcnMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljczJEIGcyLCBkb3VibGUgcGl4ZWxTaXplKSB7CisgICAgICAgIGlmIChpc1Zpc2libGUoKSkgeworICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWcgPSBnZXRUZW1wbGF0ZUltYWdlKCk7CisgICAgICAgICAgICBpZiAoaW1nICE9IG51bGwpIGcyLmRyYXdJbWFnZShpbWcsIDAsIDAsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgSW1hZ2UgZ2V0QnVmZmVyKEdyYXBoaWNzQ29uZmlndXJhdGlvbiBncmFwaGljc0NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIGdldFRlbXBsYXRlSW1hZ2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBnZXRUZW1wbGF0ZUltYWdlKCkgeworICAgICAgICBCdWZmZXJlZEltYWdlIGltZyA9IG51bGw7CisgICAgICAgIGlmIChpbWdSZWYgPT0gbnVsbCB8fCAoaW1nID0gaW1nUmVmLmdldCgpKSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIGNhbiBub3QgYWNjZXNzIGNhbnZhcworICAgICAgICAgICAgZmluYWwgRmlsZSB0ZW1wbGF0ZUltZ0ZpbGUgPSBuZXcgRmlsZShnZXRDYW52YXMoKS5nZXRUZW1wbGF0ZXNEaXIoKSwgZmlsZU5hbWUpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZW1wbGF0ZUltZ0ZpbGUgPSAiICsgdGVtcGxhdGVJbWdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVtcGxhdGVJbWdGaWxlLmV4aXN0cyA9ICIgKyB0ZW1wbGF0ZUltZ0ZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbWcgPSBJbWFnZUlPLnJlYWQodGVtcGxhdGVJbWdGaWxlKTsKKyAgICAgICAgICAgICAgICBpbWdSZWYgPSBuZXcgU29mdFJlZmVyZW5jZTxCdWZmZXJlZEltYWdlPihpbWcpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGVycm9yIGltYWdlCisgICAgICAgICAgICAgICAgaW1nID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoZ2V0Q2FudmFzKCkuZ2V0U2l6ZSgpLndpZHRoLCBnZXRDYW52YXMoKS5nZXRTaXplKCkuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IpOworICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZzIgPSBpbWcuY3JlYXRlR3JhcGhpY3MoKTsKKyAgICAgICAgICAgICAgICBnMi5zZXRDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgIGcyLmZpbGxSZWN0KDAsIDAsIGltZy5nZXRXaWR0aCgpLCBpbWcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGcyLnNldENvbG9yKENvbG9yLldISVRFKTsKKyAgICAgICAgICAgICAgICBnMi5zZXRGb250KGcyLmdldEZvbnQoKS5kZXJpdmVGb250KDhmKSk7CisgICAgICAgICAgICAgICAgRm9udE1ldHJpY3MgZm9udE1ldHJpY3MgPSBnMi5nZXRGb250TWV0cmljcygpOworICAgICAgICAgICAgICAgIFJlY3RhbmdsZTJEIHN0cmluZ0JvdW5kcyA9IGZvbnRNZXRyaWNzLmdldFN0cmluZ0JvdW5kcygiTWlzc2luZyBJbWFnZSIsIGcyKTsKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0WCA9IChpbnQpICgoaW1nLmdldFdpZHRoKCkgLSBzdHJpbmdCb3VuZHMuZ2V0V2lkdGgoKSkgLyAyZCk7CisgICAgICAgICAgICAgICAgaW50IG9mZnNldFkgPSAoaW50KSAoKChpbWcuZ2V0SGVpZ2h0KCkgLSBzdHJpbmdCb3VuZHMuZ2V0SGVpZ2h0KCkpIC8gMmQpIC0gc3RyaW5nQm91bmRzLmdldFkoKSk7CisgICAgICAgICAgICAgICAgZzIuZHJhd1N0cmluZygiTWlzc2luZyBJbWFnZSIsIG9mZnNldFgsIG9mZnNldFkpOworICAgICAgICAgICAgICAgIGcyLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBpbWdSZWYgPSBuZXcgU29mdFJlZmVyZW5jZTxCdWZmZXJlZEltYWdlPihpbWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbWc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9lZmZlY3RzL0Ryb3BTaGFkb3dFZmZlY3QuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9Ecm9wU2hhZG93RWZmZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5NWVhNQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9Ecm9wU2hhZG93RWZmZWN0LmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5lZmZlY3RzOworCitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5wYWludC5NYXR0ZTsKKworaW1wb3J0IGphdmF4LnN3aW5nLlVJRGVmYXVsdHM7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5SYXN0ZXI7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuV3JpdGFibGVSYXN0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBEcm9wU2hhZG93RWZmZWN0CisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDE4LCAyMDA3KQorICovCitwdWJsaWMgY2xhc3MgRHJvcFNoYWRvd0VmZmVjdCBleHRlbmRzIFNoYWRvd0VmZmVjdCB7CisKKyAgICBwcm90ZWN0ZWQgRHJvcFNoYWRvd0VmZmVjdCgpIHt9CisKKyAgICA7CisKKyAgICBwdWJsaWMgRHJvcFNoYWRvd0VmZmVjdChVSURlZmF1bHRzIHVpRGVmYXVsdHMpIHsKKyAgICAgICAgY29sb3IgPSBuZXcgTWF0dGUoQ29sb3IuQkxBQ0ssIHVpRGVmYXVsdHMpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gRWZmZWN0IE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIGVmZmVjdAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdXNlciBkaXNwbGF5YWJsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJEcm9wIFNoYWRvdyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlIG9mIHRoaXMgZWZmZWN0LCBvbmUgb2YgVU5ERVIsQkxFTkRFRCxPVkVSLiBVTkRFUiBtZWFucyB0aGUgcmVzdWx0IG9mIGFwcGx5IGVmZmVjdCBzaG91bGQgYmUgcGFpbnRlZAorICAgICAqIHVuZGVyIHRoZSBzcmMgaW1hZ2UuIEJMRU5ERUQgbWVhbnMgdGhlIHJlc3VsdCBvZiBhcHBseSBzZmZlY3QgY29udGFpbnMgYSBtb2RpZmllZCBzcmMgaW1hZ2Ugc28ganVzdCBpdCBzaG91bGQgYmUKKyAgICAgKiBwYWludGVkLiBPVkVSIG1lYW5zIHRoZSByZXN1bHQgb2YgYXBwbHkgZWZmZWN0IHNob3VsZCBiZSBwYWludGVkIG92ZXIgdGhlIHNyYyBpbWFnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGVmZmVjdCB0eXBlCisgICAgICovCisgICAgcHVibGljIEVmZmVjdFR5cGUgZ2V0RWZmZWN0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEVmZmVjdFR5cGUuVU5ERVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIGVmZmVjdCB0byB0aGUgc3JjIGltYWdlIGdlbmVyYXRpbmcgdGhlIHJlc3VsdCAuIFRoZSByZXN1bHQgaW1hZ2UgbWF5IG9yIG1heSBub3QgY29udGFpbiB0aGUgc291cmNlCisgICAgICogaW1hZ2UgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGVmZmVjdCB0eXBlIGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGltYWdlIGZvciBhcHBseWluZyB0aGUgZWZmZWN0IHRvCisgICAgICogQHBhcmFtIGRzdCBUaGUgZHN0aW5hdGlvbiBpbWFnZSB0byBwYWludCBlZmZlY3QgcmVzdWx0IGludG8uIElmIHRoaXMgaXMgbnVsbCB0aGVuIGEgbmV3IGltYWdlIHdpbGwgYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSB3ICAgVGhlIHdpZHRoIG9mIHRoZSBzcmMgaW1hZ2UgdG8gYXBwbHkgZWZmZWN0IHRvLCB0aGlzIGFsbG93IHRoZSBzcmMgYW5kIGRzdCBidWZmZXJzIHRvIGJlIGJpZ2dlciB0aGFuCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSB0aGUgbmVlZCBlZmZlY3QgYXBwbGllZCB0byBpdAorICAgICAqIEBwYXJhbSBoICAgVGhlIGhlaWdodCBvZiB0aGUgc3JjIGltYWdlIHRvIGFwcGx5IGVmZmVjdCB0bywgdGhpcyBhbGxvdyB0aGUgc3JjIGFuZCBkc3QgYnVmZmVycyB0byBiZSBiaWdnZXIgdGhhbgorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgdGhlIG5lZWQgZWZmZWN0IGFwcGxpZWQgdG8gaXQKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgYXBwbAorICAgICAqLworICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGFwcGx5RWZmZWN0KEJ1ZmZlcmVkSW1hZ2Ugc3JjLCBCdWZmZXJlZEltYWdlIGRzdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIC8vIGNhbGN1bGF0ZSBvZmZzZXQKKyAgICAgICAgZG91YmxlIHRyYW5nbGVBbmdsZSA9IE1hdGgudG9SYWRpYW5zKGFuZ2xlIC0gOTApOworICAgICAgICBpbnQgb2Zmc2V0WCA9IChpbnQpIChNYXRoLnNpbih0cmFuZ2xlQW5nbGUpICogZGlzdGFuY2UpOworICAgICAgICBpbnQgb2Zmc2V0WSA9IChpbnQpIChNYXRoLmNvcyh0cmFuZ2xlQW5nbGUpICogZGlzdGFuY2UpOworICAgICAgICAvLyBjbGFjIGV4cGFuZGVkIHNpemUKKyAgICAgICAgaW50IHRtcE9mZlggPSBvZmZzZXRYICsgc2l6ZTsKKyAgICAgICAgaW50IHRtcE9mZlkgPSBvZmZzZXRZICsgc2l6ZTsKKyAgICAgICAgaW50IHRtcFcgPSB3ICsgb2Zmc2V0WCArIHNpemUgKyBzaXplOworICAgICAgICBpbnQgdG1wSCA9IGggKyBvZmZzZXRZICsgc2l6ZSArIHNpemU7CisgICAgICAgIC8vIGNyZWF0ZSB0bXAgYnVmZmVycworICAgICAgICBpbnRbXSBsaW5lQnVmID0gZ2V0VG1wSW50QXJyYXkodyk7CisgICAgICAgIGJ5dGVbXSB0bXBCdWYxID0gZ2V0VG1wQnl0ZUFycmF5MSh0bXBXICogdG1wSCk7CisgICAgICAgIEFycmF5cy5maWxsKHRtcEJ1ZjEsIChieXRlKSAweDAwKTsKKyAgICAgICAgYnl0ZVtdIHRtcEJ1ZjIgPSBnZXRUbXBCeXRlQXJyYXkyKHRtcFcgKiB0bXBIKTsKKyAgICAgICAgLy8gZXh0cmFjdCBzcmMgaW1hZ2UgYWxwaGEgY2hhbm5lbCBhbmQgaW52ZXJzZSBhbmQgb2Zmc2V0CisgICAgICAgIFJhc3RlciBzcmNSYXN0ZXIgPSBzcmMuZ2V0UmFzdGVyKCk7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBpbnQgZHkgPSAoeSArIHRtcE9mZlkpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IGR5ICogdG1wVzsKKyAgICAgICAgICAgIHNyY1Jhc3Rlci5nZXREYXRhRWxlbWVudHMoMCwgeSwgdywgMSwgbGluZUJ1Zik7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBkeCA9IHggKyB0bXBPZmZYOworICAgICAgICAgICAgICAgIHRtcEJ1ZjFbb2Zmc2V0ICsgZHhdID0gKGJ5dGUpICgobGluZUJ1Zlt4XSAmIDB4RkYwMDAwMDApID4+PiAyNCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYmx1cgorICAgICAgICBmbG9hdFtdIGtlcm5lbCA9IEVmZmVjdFV0aWxzLmNyZWF0ZUdhdXNzaWFuS2VybmVsKHNpemUpOworICAgICAgICBFZmZlY3RVdGlscy5ibHVyKHRtcEJ1ZjEsIHRtcEJ1ZjIsIHRtcFcsIHRtcEgsIGtlcm5lbCwgc2l6ZSk7IC8vIGhvcml6b250YWwgcGFzcworICAgICAgICBFZmZlY3RVdGlscy5ibHVyKHRtcEJ1ZjIsIHRtcEJ1ZjEsIHRtcEgsIHRtcFcsIGtlcm5lbCwgc2l6ZSk7Ly8gdmVydGljYWwgcGFzcworICAgICAgICAvL3Jlc2NhbGUKKyAgICAgICAgZmxvYXQgc3ByZWFkID0gTWF0aC5taW4oMSAvICgxIC0gKDAuMDFmICogdGhpcy5zcHJlYWQpKSwgMjU1KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBCdWYxLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gKGludCkgKCgoaW50KSB0bXBCdWYxW2ldICYgMHhGRikgKiBzcHJlYWQpOworICAgICAgICAgICAgdG1wQnVmMVtpXSA9ICh2YWwgPiAyNTUpID8gKGJ5dGUpIDB4RkYgOiAoYnl0ZSkgdmFsOworICAgICAgICB9CisgICAgICAgIC8vIGNyZWF0ZSBjb2xvciBpbWFnZSB3aXRoIHNoYWRvdyBjb2xvciBhbmQgZ3JleXNjYWxlIGltYWdlIGFzIGFscGhhCisgICAgICAgIGlmIChkc3QgPT0gbnVsbCkgZHN0ID0gbmV3IEJ1ZmZlcmVkSW1hZ2UodywgaCwgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKKyAgICAgICAgV3JpdGFibGVSYXN0ZXIgc2hhZG93UmFzdGVyID0gZHN0LmdldFJhc3RlcigpOworICAgICAgICBpbnQgcmVkID0gY29sb3IuZ2V0UmVkKCksIGdyZWVuID0gY29sb3IuZ2V0R3JlZW4oKSwgYmx1ZSA9IGNvbG9yLmdldEJsdWUoKTsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGludCBzcmNZID0geSArIHRtcE9mZlk7CisgICAgICAgICAgICBpbnQgc2hhZG93T2Zmc2V0ID0gKHNyY1kgLSBvZmZzZXRZKSAqIHRtcFc7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBzcmNYID0geCArIHRtcE9mZlg7CisgICAgICAgICAgICAgICAgbGluZUJ1Zlt4XSA9IHRtcEJ1ZjFbc2hhZG93T2Zmc2V0ICsgKHNyY1ggLSBvZmZzZXRYKV0gPDwgMjQgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoYWRvd1Jhc3Rlci5zZXREYXRhRWxlbWVudHMoMCwgeSwgdywgMSwgbGluZUJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvRWZmZWN0LmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvRWZmZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4YjY5NwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9FZmZlY3QuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmVmZmVjdHM7CisKK2ltcG9ydCBvcmcuamRlc2t0b3AuYmVhbnMuQWJzdHJhY3RCZWFuOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuQmxlbmRpbmdNb2RlOworCitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CisKKy8qKgorICogRWZmZWN0CisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDE4LCAyMDA3KQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWZmZWN0IGV4dGVuZHMgQWJzdHJhY3RCZWFuIHsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBlbnVtIEVmZmVjdFR5cGUgeworICAgICAgICBVTkRFUiwgQkxFTkRFRCwgT1ZFUgorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHZpc2libGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgYm9vbGVhbiBvbGQgPSBpc1Zpc2libGUoKTsKKyAgICAgICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ2aXNpYmxlIiwgb2xkLCBpc1Zpc2libGUoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBBYnN0cmFjdCBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyBlZmZlY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHVzZXIgZGlzcGxheWFibGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHlwZSBvZiB0aGlzIGVmZmVjdCwgb25lIG9mIFVOREVSLEJMRU5ERUQsT1ZFUi4gVU5ERVIgbWVhbnMgdGhlIHJlc3VsdCBvZiBhcHBseSBlZmZlY3Qgc2hvdWxkIGJlIHBhaW50ZWQKKyAgICAgKiB1bmRlciB0aGUgc3JjIGltYWdlLiBCTEVOREVEIG1lYW5zIHRoZSByZXN1bHQgb2YgYXBwbHkgc2ZmZWN0IGNvbnRhaW5zIGEgbW9kaWZpZWQgc3JjIGltYWdlIHNvIGp1c3QgaXQgc2hvdWxkIGJlCisgICAgICogcGFpbnRlZC4gT1ZFUiBtZWFucyB0aGUgcmVzdWx0IG9mIGFwcGx5IGVmZmVjdCBzaG91bGQgYmUgcGFpbnRlZCBvdmVyIHRoZSBzcmMgaW1hZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlZmZlY3QgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBFZmZlY3RUeXBlIGdldEVmZmVjdFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYmxlbmRpbmcgbW9kZSB0byB1c2UgdG8gcGFpbnQgdGhlIHJlc3VsdCBlZmZlY3RlZCBpbWFnZSBpZiB0aGUgRWZmZWN0VHlwZSBpcyBVTkRFUiBvciBPVkVSLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgYmxlbmRpbmcgbW9kZSBmb3IgdGhlIGVmZmVjdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCbGVuZGluZ01vZGUgZ2V0QmxlbmRpbmdNb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG9wYWNpdHkgdG8gdXNlIHRvIHBhaW50IHRoZSByZXN1bHQgZWZmZWN0ZWQgaW1hZ2UgaWYgdGhlIEVmZmVjdFR5cGUgaXMgVU5ERVIgb3IgT1ZFUi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG9wYWN0aXR5IGZvciB0aGUgZWZmZWN0LCAwLjBmIC0+IDEuMGYKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0T3BhY2l0eSgpOworCisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIGVmZmVjdCB0byB0aGUgc3JjIGltYWdlIGdlbmVyYXRpbmcgdGhlIHJlc3VsdCAuIFRoZSByZXN1bHQgaW1hZ2UgbWF5IG9yIG1heSBub3QgY29udGFpbiB0aGUgc291cmNlCisgICAgICogaW1hZ2UgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGVmZmVjdCB0eXBlIGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGltYWdlIGZvciBhcHBseWluZyB0aGUgZWZmZWN0IHRvCisgICAgICogQHBhcmFtIGRzdCBUaGUgZHN0aW5hdGlvbiBpbWFnZSB0byBwYWludCBlZmZlY3QgcmVzdWx0IGludG8uIElmIHRoaXMgaXMgbnVsbCB0aGVuIGEgbmV3IGltYWdlIHdpbGwgYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSB3ICAgVGhlIHdpZHRoIG9mIHRoZSBzcmMgaW1hZ2UgdG8gYXBwbHkgZWZmZWN0IHRvLCB0aGlzIGFsbG93IHRoZSBzcmMgYW5kIGRzdCBidWZmZXJzIHRvIGJlIGJpZ2dlciB0aGFuCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSB0aGUgbmVlZCBlZmZlY3QgYXBwbGllZCB0byBpdAorICAgICAqIEBwYXJhbSBoICAgVGhlIGhlaWdodCBvZiB0aGUgc3JjIGltYWdlIHRvIGFwcGx5IGVmZmVjdCB0bywgdGhpcyBhbGxvdyB0aGUgc3JjIGFuZCBkc3QgYnVmZmVycyB0byBiZSBiaWdnZXIgdGhhbgorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgdGhlIG5lZWQgZWZmZWN0IGFwcGxpZWQgdG8gaXQKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgYXBwbAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCdWZmZXJlZEltYWdlIGFwcGx5RWZmZWN0KEJ1ZmZlcmVkSW1hZ2Ugc3JjLCBCdWZmZXJlZEltYWdlIGRzdCwgaW50IHcsIGludCBoKTsKKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gU3RhdGljIGRhdGEgY2FjaGUKKworICAgIHByaXZhdGUgc3RhdGljIFNvZnRSZWZlcmVuY2U8aW50W10+IHRtcEludEFycmF5ID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBTb2Z0UmVmZXJlbmNlPGJ5dGVbXT4gdG1wQnl0ZUFycmF5MSA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgU29mdFJlZmVyZW5jZTxieXRlW10+IHRtcEJ5dGVBcnJheTIgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIFNvZnRSZWZlcmVuY2U8Ynl0ZVtdPiB0bXBCeXRlQXJyYXkzID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgaW50W10gZ2V0VG1wSW50QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgaW50W10gdG1wOworICAgICAgICBpZiAodG1wSW50QXJyYXkgPT0gbnVsbCB8fCAodG1wID0gdG1wSW50QXJyYXkuZ2V0KCkpID09IG51bGwgfHwgdG1wLmxlbmd0aCA8IHNpemUpIHsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgYXJyYXkKKyAgICAgICAgICAgIHRtcCA9IG5ldyBpbnRbc2l6ZV07CisgICAgICAgICAgICB0bXBJbnRBcnJheSA9IG5ldyBTb2Z0UmVmZXJlbmNlPGludFtdPih0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gZ2V0VG1wQnl0ZUFycmF5MShpbnQgc2l6ZSkgeworICAgICAgICBieXRlW10gdG1wOworICAgICAgICBpZiAodG1wQnl0ZUFycmF5MSA9PSBudWxsIHx8ICh0bXAgPSB0bXBCeXRlQXJyYXkxLmdldCgpKSA9PSBudWxsIHx8IHRtcC5sZW5ndGggPCBzaXplKSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGFycmF5CisgICAgICAgICAgICB0bXAgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIHRtcEJ5dGVBcnJheTEgPSBuZXcgU29mdFJlZmVyZW5jZTxieXRlW10+KHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBnZXRUbXBCeXRlQXJyYXkyKGludCBzaXplKSB7CisgICAgICAgIGJ5dGVbXSB0bXA7CisgICAgICAgIGlmICh0bXBCeXRlQXJyYXkyID09IG51bGwgfHwgKHRtcCA9IHRtcEJ5dGVBcnJheTIuZ2V0KCkpID09IG51bGwgfHwgdG1wLmxlbmd0aCA8IHNpemUpIHsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgYXJyYXkKKyAgICAgICAgICAgIHRtcCA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgdG1wQnl0ZUFycmF5MiA9IG5ldyBTb2Z0UmVmZXJlbmNlPGJ5dGVbXT4odG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIGdldFRtcEJ5dGVBcnJheTMoaW50IHNpemUpIHsKKyAgICAgICAgYnl0ZVtdIHRtcDsKKyAgICAgICAgaWYgKHRtcEJ5dGVBcnJheTMgPT0gbnVsbCB8fCAodG1wID0gdG1wQnl0ZUFycmF5My5nZXQoKSkgPT0gbnVsbCB8fCB0bXAubGVuZ3RoIDwgc2l6ZSkgeworICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBhcnJheQorICAgICAgICAgICAgdG1wID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICB0bXBCeXRlQXJyYXkzID0gbmV3IFNvZnRSZWZlcmVuY2U8Ynl0ZVtdPih0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9lZmZlY3RzL0VmZmVjdFV0aWxzLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvRWZmZWN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTY4NzZiCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9lZmZlY3RzL0VmZmVjdFV0aWxzLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmVmZmVjdHM7CisKKworLyoqCisgKiBFZmZlY3RVdGlscworICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biAxOCwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIEVmZmVjdFV0aWxzIHsKKworICAgIC8qKgorICAgICAqIDxwPkJsdXJzIHRoZSBzb3VyY2UgcGl4ZWxzIGludG8gdGhlIGRlc3RpbmF0aW9uIHBpeGVscy4gVGhlIGZvcmNlIG9mIHRoZSBibHVyIGlzIHNwZWNpZmllZCBieSB0aGUgcmFkaXVzIHdoaWNoCisgICAgICogbXVzdCBiZSBncmVhdGVyIHRoYW4gMC48L3A+IDxwPlRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBpeGVscyBhcnJheXMgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBCWVRFX0dSRVkKKyAgICAgKiBmb3JtYXQuPC9wPiA8cD5BZnRlciB0aGlzIG1ldGhvZCBpcyBleGVjdXRlZCwgZHN0UGl4ZWxzIGNvbnRhaW5zIGEgdHJhbnNwb3NlZCBhbmQgZmlsdGVyZWQgY29weSBvZgorICAgICAqIHNyY1BpeGVscy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjUGl4ZWxzIHRoZSBzb3VyY2UgcGl4ZWxzCisgICAgICogQHBhcmFtIGRzdFBpeGVscyB0aGUgZGVzdGluYXRpb24gcGl4ZWxzCisgICAgICogQHBhcmFtIHdpZHRoICAgICB0aGUgd2lkdGggb2YgdGhlIHNvdXJjZSBwaWN0dXJlCisgICAgICogQHBhcmFtIGhlaWdodCAgICB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgcGljdHVyZQorICAgICAqIEBwYXJhbSBrZXJuZWwgICAgdGhlIGtlcm5lbCBvZiB0aGUgYmx1ciBlZmZlY3QKKyAgICAgKiBAcGFyYW0gcmFkaXVzICAgIHRoZSByYWRpdXMgb2YgdGhlIGJsdXIgZWZmZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJsdXIoYnl0ZVtdIHNyY1BpeGVscywgYnl0ZVtdIGRzdFBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBrZXJuZWwsIGludCByYWRpdXMpIHsKKyAgICAgICAgZmxvYXQgcDsKKyAgICAgICAgaW50IGNwOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSB5OworICAgICAgICAgICAgaW50IG9mZnNldCA9IHkgKiB3aWR0aDsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIHAgPSAwLjBmOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAtcmFkaXVzOyBpIDw9IHJhZGl1czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdWJPZmZzZXQgPSB4ICsgaTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk9mZnNldCA8IDAgfHwgc3ViT2Zmc2V0ID49IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJPZmZzZXQgPSAoeCArIHdpZHRoKSAlIHdpZHRoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbCA9IHNyY1BpeGVsc1tvZmZzZXQgKyBzdWJPZmZzZXRdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmx1ckZhY3RvciA9IGtlcm5lbFtyYWRpdXMgKyBpXTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBibHVyRmFjdG9yICogcGl4ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNwID0gKGludCkgKHAgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBkc3RQaXhlbHNbaW5kZXhdID0gKGJ5dGUpIChjcCA+IDI1NSA/IDI1NSA6IGNwKTsKKyAgICAgICAgICAgICAgICBpbmRleCArPSBoZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZsb2F0W10gY3JlYXRlR2F1c3NpYW5LZXJuZWwoaW50IHJhZGl1cykgeworICAgICAgICBpZiAocmFkaXVzIDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmFkaXVzIG11c3QgYmUgPj0gMSIpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXRbXSBkYXRhID0gbmV3IGZsb2F0W3JhZGl1cyAqIDIgKyAxXTsKKworICAgICAgICBmbG9hdCBzaWdtYSA9IHJhZGl1cyAvIDMuMGY7CisgICAgICAgIGZsb2F0IHR3b1NpZ21hU3F1YXJlID0gMi4wZiAqIHNpZ21hICogc2lnbWE7CisgICAgICAgIGZsb2F0IHNpZ21hUm9vdCA9IChmbG9hdCkgTWF0aC5zcXJ0KHR3b1NpZ21hU3F1YXJlICogTWF0aC5QSSk7CisgICAgICAgIGZsb2F0IHRvdGFsID0gMC4wZjsKKworICAgICAgICBmb3IgKGludCBpID0gLXJhZGl1czsgaSA8PSByYWRpdXM7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgZGlzdGFuY2UgPSBpICogaTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGkgKyByYWRpdXM7CisgICAgICAgICAgICBkYXRhW2luZGV4XSA9IChmbG9hdCkgTWF0aC5leHAoLWRpc3RhbmNlIC8gdHdvU2lnbWFTcXVhcmUpIC8gc2lnbWFSb290OworICAgICAgICAgICAgdG90YWwgKz0gZGF0YVtpbmRleF07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFbaV0gLz0gdG90YWw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvRWZmZWN0VXRpbHNUZW1wLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvRWZmZWN0VXRpbHNUZW1wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiZmQzMwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9FZmZlY3RVdGlsc1RlbXAuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZWZmZWN0czsKKworaW1wb3J0IGphdmEuYXd0LkNvbXBvc2l0ZTsKK2ltcG9ydCBqYXZhLmF3dC5Db21wb3NpdGVDb250ZXh0OworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOworaW1wb3J0IGphdmEuYXd0LmltYWdlLlJhc3RlcjsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5Xcml0YWJsZVJhc3RlcjsKKworLyoqCisgKiBFZmZlY3RVdGlsc1RlbXAgLSBlZmZlY3QgdXRpbHMgbWV0aG9kcyB0aGF0IGFyZSBub3QgYmVpbmcgdXNlZCBmb3Igbm93IGJ1dCB3ZSBtaWdodCB3YW50IGxhdGVyCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDE4LCAyMDA3KQorICovCitwdWJsaWMgY2xhc3MgRWZmZWN0VXRpbHNUZW1wIHsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgdGhlIGFscGhhIGNoYW5uZWwgb2YgYSBpbWFnZSBpbnRvIG5ldyBncmV5c2NhbGUgYnVmZmVyZWQgaW1hZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmMgTXVzdCBidXQgSU5UX0FSR0IgYnVmZmVyZWQgaW1hZ2UKKyAgICAgKiBAcmV0dXJuIG5ldyBUWVBFX0JZVEVfR1JBWSBpbWFnZSBvZiBqdXN0IHRoZSBhbHBoYSBjaGFubmVsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIGV4dHJhY3RBbHBoYShCdWZmZXJlZEltYWdlIHNyYykgeworICAgICAgICBpbnQgdyA9IHNyYy5nZXRXaWR0aCgpOworICAgICAgICBpbnQgaCA9IHNyYy5nZXRIZWlnaHQoKTsKKyAgICAgICAgLy8gZXh0cmFjdCBpbWFnZSBhbHBoYSBjaGFubmVsIGFzIGdyZXlzY2FsZSBpbWFnZQorICAgICAgICBmaW5hbCBCdWZmZXJlZEltYWdlIGdyZXlJbWcgPSBuZXcgQnVmZmVyZWRJbWFnZSh3LCBoLCBCdWZmZXJlZEltYWdlLlRZUEVfQllURV9HUkFZKTsKKyAgICAgICAgR3JhcGhpY3MyRCBnMiA9IGdyZXlJbWcuY3JlYXRlR3JhcGhpY3MoKTsKKyAgICAgICAgZzIuc2V0Q29tcG9zaXRlKG5ldyBDb21wb3NpdGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgQ29tcG9zaXRlQ29udGV4dCBjcmVhdGVDb250ZXh0KENvbG9yTW9kZWwgc3JjQ29sb3JNb2RlbCwgQ29sb3JNb2RlbCBkc3RDb2xvck1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJpbmdIaW50cyBoaW50cykgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQ29udGV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9CisKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcG9zZShSYXN0ZXIgc3JjLCBSYXN0ZXIgZHN0SW4sIFdyaXRhYmxlUmFzdGVyIGRzdE91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoID0gTWF0aC5taW4oc3JjLmdldFdpZHRoKCksIGRzdEluLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IE1hdGgubWluKHNyYy5nZXRIZWlnaHQoKSwgZHN0SW4uZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gc3JjUGl4ZWxzID0gbmV3IGludFt3aWR0aF07CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZHN0UGl4ZWxzID0gbmV3IGJ5dGVbd2lkdGhdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXREYXRhRWxlbWVudHMoMCwgeSwgd2lkdGgsIDEsIHNyY1BpeGVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpeGVsc1t4XSA9IChieXRlKSAoKHNyY1BpeGVsc1t4XSAmIDB4RkYwMDAwMDApID4+PiAyNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE91dC5zZXREYXRhRWxlbWVudHMoMCwgeSwgd2lkdGgsIDEsIGRzdFBpeGVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgZzIuZHJhd0ltYWdlKHNyYywgMCwgMCwgbnVsbCk7CisgICAgICAgIGcyLmRpc3Bvc2UoKTsKKyAgICAgICAgcmV0dXJuIGdyZXlJbWc7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvSW5uZXJHbG93RWZmZWN0LmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvSW5uZXJHbG93RWZmZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwYjJkMQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9Jbm5lckdsb3dFZmZlY3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZWZmZWN0czsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuTWF0dGU7CisKK2ltcG9ydCBqYXZheC5zd2luZy5VSURlZmF1bHRzOworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworCisvKioKKyAqIElubmVyR2xvd0VmZmVjdAorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biAyMSwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIElubmVyR2xvd0VmZmVjdCBleHRlbmRzIElubmVyU2hhZG93RWZmZWN0IHsKKworICAgIHByb3RlY3RlZCBJbm5lckdsb3dFZmZlY3QoKSB7CisgICAgICAgIGRpc3RhbmNlID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5uZXJHbG93RWZmZWN0KFVJRGVmYXVsdHMgdWlEZWZhdWx0cykgeworICAgICAgICBjb2xvciA9IG5ldyBNYXR0ZShuZXcgQ29sb3IoMjU1LCAyNTUsIDIxMSksIHVpRGVmYXVsdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIGVmZmVjdAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdXNlciBkaXNwbGF5YWJsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJJbm5lciBHbG93IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvSW5uZXJTaGFkb3dFZmZlY3QuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9Jbm5lclNoYWRvd0VmZmVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmM0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvSW5uZXJTaGFkb3dFZmZlY3QuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmVmZmVjdHM7CisKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50Lk1hdHRlOworCitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEuYXd0LmltYWdlLlJhc3RlcjsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5Xcml0YWJsZVJhc3RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIElubmVyU2hhZG93RWZmZWN0CisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDE4LCAyMDA3KQorICovCitwdWJsaWMgY2xhc3MgSW5uZXJTaGFkb3dFZmZlY3QgZXh0ZW5kcyBTaGFkb3dFZmZlY3QgeworCisgICAgcHJvdGVjdGVkIElubmVyU2hhZG93RWZmZWN0KCkge30KKworICAgIDsKKworICAgIHB1YmxpYyBJbm5lclNoYWRvd0VmZmVjdChVSURlZmF1bHRzIHVpRGVmYXVsdHMpIHsKKyAgICAgICAgY29sb3IgPSBuZXcgTWF0dGUoQ29sb3IuQkxBQ0ssIHVpRGVmYXVsdHMpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gRWZmZWN0IE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIGVmZmVjdAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdXNlciBkaXNwbGF5YWJsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJJbm5lciBTaGFkb3ciOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHlwZSBvZiB0aGlzIGVmZmVjdCwgb25lIG9mIFVOREVSLEJMRU5ERUQsT1ZFUi4gVU5ERVIgbWVhbnMgdGhlIHJlc3VsdCBvZiBhcHBseSBlZmZlY3Qgc2hvdWxkIGJlIHBhaW50ZWQKKyAgICAgKiB1bmRlciB0aGUgc3JjIGltYWdlLiBCTEVOREVEIG1lYW5zIHRoZSByZXN1bHQgb2YgYXBwbHkgc2ZmZWN0IGNvbnRhaW5zIGEgbW9kaWZpZWQgc3JjIGltYWdlIHNvIGp1c3QgaXQgc2hvdWxkIGJlCisgICAgICogcGFpbnRlZC4gT1ZFUiBtZWFucyB0aGUgcmVzdWx0IG9mIGFwcGx5IGVmZmVjdCBzaG91bGQgYmUgcGFpbnRlZCBvdmVyIHRoZSBzcmMgaW1hZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlZmZlY3QgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBFZmZlY3QuRWZmZWN0VHlwZSBnZXRFZmZlY3RUeXBlKCkgeworICAgICAgICByZXR1cm4gRWZmZWN0LkVmZmVjdFR5cGUuT1ZFUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBseSB0aGUgZWZmZWN0IHRvIHRoZSBzcmMgaW1hZ2UgZ2VuZXJhdGluZyB0aGUgcmVzdWx0IC4gVGhlIHJlc3VsdCBpbWFnZSBtYXkgb3IgbWF5IG5vdCBjb250YWluIHRoZSBzb3VyY2UKKyAgICAgKiBpbWFnZSBkZXBlbmRpbmcgb24gd2hhdCB0aGUgZWZmZWN0IHR5cGUgaXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2UgaW1hZ2UgZm9yIGFwcGx5aW5nIHRoZSBlZmZlY3QgdG8KKyAgICAgKiBAcGFyYW0gZHN0IFRoZSBkc3RpbmF0aW9uIGltYWdlIHRvIHBhaW50IGVmZmVjdCByZXN1bHQgaW50by4gSWYgdGhpcyBpcyBudWxsIHRoZW4gYSBuZXcgaW1hZ2Ugd2lsbCBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHcgICBUaGUgd2lkdGggb2YgdGhlIHNyYyBpbWFnZSB0byBhcHBseSBlZmZlY3QgdG8sIHRoaXMgYWxsb3cgdGhlIHNyYyBhbmQgZHN0IGJ1ZmZlcnMgdG8gYmUgYmlnZ2VyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmVhIHRoZSBuZWVkIGVmZmVjdCBhcHBsaWVkIHRvIGl0CisgICAgICogQHBhcmFtIGggICBUaGUgaGVpZ2h0IG9mIHRoZSBzcmMgaW1hZ2UgdG8gYXBwbHkgZWZmZWN0IHRvLCB0aGlzIGFsbG93IHRoZSBzcmMgYW5kIGRzdCBidWZmZXJzIHRvIGJlIGJpZ2dlciB0aGFuCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSB0aGUgbmVlZCBlZmZlY3QgYXBwbGllZCB0byBpdAorICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiBhcHBsCisgICAgICovCisgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgYXBwbHlFZmZlY3QoQnVmZmVyZWRJbWFnZSBzcmMsIEJ1ZmZlcmVkSW1hZ2UgZHN0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgLy8gY2FsY3VsYXRlIG9mZnNldAorICAgICAgICBkb3VibGUgdHJhbmdsZUFuZ2xlID0gTWF0aC50b1JhZGlhbnMoYW5nbGUgLSA5MCk7CisgICAgICAgIGludCBvZmZzZXRYID0gKGludCkgKE1hdGguc2luKHRyYW5nbGVBbmdsZSkgKiBkaXN0YW5jZSk7CisgICAgICAgIGludCBvZmZzZXRZID0gKGludCkgKE1hdGguY29zKHRyYW5nbGVBbmdsZSkgKiBkaXN0YW5jZSk7CisgICAgICAgIC8vIGNsYWMgZXhwYW5kZWQgc2l6ZQorICAgICAgICBpbnQgdG1wT2ZmWCA9IG9mZnNldFggKyBzaXplOworICAgICAgICBpbnQgdG1wT2ZmWSA9IG9mZnNldFkgKyBzaXplOworICAgICAgICBpbnQgdG1wVyA9IHcgKyBvZmZzZXRYICsgc2l6ZSArIHNpemU7CisgICAgICAgIGludCB0bXBIID0gaCArIG9mZnNldFkgKyBzaXplICsgc2l6ZTsKKyAgICAgICAgLy8gY3JlYXRlIHRtcCBidWZmZXJzCisgICAgICAgIGludFtdIGxpbmVCdWYgPSBnZXRUbXBJbnRBcnJheSh3KTsKKyAgICAgICAgYnl0ZVtdIHNyY0FscGhhQnVmID0gZ2V0VG1wQnl0ZUFycmF5MSh0bXBXICogdG1wSCk7CisgICAgICAgIEFycmF5cy5maWxsKHNyY0FscGhhQnVmLCAoYnl0ZSkgMHhGRik7CisgICAgICAgIGJ5dGVbXSB0bXBCdWYxID0gZ2V0VG1wQnl0ZUFycmF5Mih0bXBXICogdG1wSCk7CisgICAgICAgIGJ5dGVbXSB0bXBCdWYyID0gZ2V0VG1wQnl0ZUFycmF5Myh0bXBXICogdG1wSCk7CisgICAgICAgIC8vIGV4dHJhY3Qgc3JjIGltYWdlIGFscGhhIGNoYW5uZWwgYW5kIGludmVyc2UgYW5kIG9mZnNldAorICAgICAgICBSYXN0ZXIgc3JjUmFzdGVyID0gc3JjLmdldFJhc3RlcigpOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgaW50IGR5ID0gKHkgKyB0bXBPZmZZKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBkeSAqIHRtcFc7CisgICAgICAgICAgICBzcmNSYXN0ZXIuZ2V0RGF0YUVsZW1lbnRzKDAsIHksIHcsIDEsIGxpbmVCdWYpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgZHggPSB4ICsgdG1wT2ZmWDsKKyAgICAgICAgICAgICAgICBzcmNBbHBoYUJ1ZltvZmZzZXQgKyBkeF0gPSAoYnl0ZSkgKCgyNTUgLSAoKGxpbmVCdWZbeF0gJiAweEZGMDAwMDAwKSA+Pj4gMjQpKSAmIDB4RkYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGJsdXIKKyAgICAgICAgZmxvYXRbXSBrZXJuZWwgPSBFZmZlY3RVdGlscy5jcmVhdGVHYXVzc2lhbktlcm5lbChzaXplICogMik7CisgICAgICAgIEVmZmVjdFV0aWxzLmJsdXIoc3JjQWxwaGFCdWYsIHRtcEJ1ZjIsIHRtcFcsIHRtcEgsIGtlcm5lbCwgc2l6ZSAqIDIpOyAvLyBob3Jpem9udGFsIHBhc3MKKyAgICAgICAgRWZmZWN0VXRpbHMuYmx1cih0bXBCdWYyLCB0bXBCdWYxLCB0bXBILCB0bXBXLCBrZXJuZWwsIHNpemUgKiAyKTsvLyB2ZXJ0aWNhbCBwYXNzCisgICAgICAgIC8vcmVzY2FsZQorICAgICAgICBmbG9hdCBzcHJlYWQgPSBNYXRoLm1pbigxIC8gKDEgLSAoMC4wMWYgKiB0aGlzLnNwcmVhZCkpLCAyNTUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRtcEJ1ZjEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoaW50KSAoKChpbnQpIHRtcEJ1ZjFbaV0gJiAweEZGKSAqIHNwcmVhZCk7CisgICAgICAgICAgICB0bXBCdWYxW2ldID0gKHZhbCA+IDI1NSkgPyAoYnl0ZSkgMHhGRiA6IChieXRlKSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIGNvbG9yIGltYWdlIHdpdGggc2hhZG93IGNvbG9yIGFuZCBncmV5c2NhbGUgaW1hZ2UgYXMgYWxwaGEKKyAgICAgICAgaWYgKGRzdCA9PSBudWxsKSBkc3QgPSBuZXcgQnVmZmVyZWRJbWFnZSh3LCBoLCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOworICAgICAgICBXcml0YWJsZVJhc3RlciBzaGFkb3dSYXN0ZXIgPSBkc3QuZ2V0UmFzdGVyKCk7CisgICAgICAgIGludCByZWQgPSBjb2xvci5nZXRSZWQoKSwgZ3JlZW4gPSBjb2xvci5nZXRHcmVlbigpLCBibHVlID0gY29sb3IuZ2V0Qmx1ZSgpOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgaW50IHNyY1kgPSB5ICsgdG1wT2ZmWTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzcmNZICogdG1wVzsKKyAgICAgICAgICAgIGludCBzaGFkb3dPZmZzZXQgPSAoc3JjWSAtIG9mZnNldFkpICogdG1wVzsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgaW50IHNyY1ggPSB4ICsgdG1wT2ZmWDsKKyAgICAgICAgICAgICAgICBpbnQgb3JpZ2lhbmxBbHBoYVZhbCA9IDI1NSAtICgoaW50KSBzcmNBbHBoYUJ1ZltvZmZzZXQgKyBzcmNYXSAmIDB4RkYpOworICAgICAgICAgICAgICAgIGludCBzaGFkb3dWYWwgPSAoaW50KSB0bXBCdWYxW3NoYWRvd09mZnNldCArIChzcmNYIC0gb2Zmc2V0WCldICYgMHhGRjsKKyAgICAgICAgICAgICAgICBpbnQgYWxwaGFWYWwgPSBNYXRoLm1pbihvcmlnaWFubEFscGhhVmFsLCBzaGFkb3dWYWwpOworICAgICAgICAgICAgICAgIGxpbmVCdWZbeF0gPSAoKGJ5dGUpIGFscGhhVmFsICYgMHhGRikgPDwgMjQgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoYWRvd1Jhc3Rlci5zZXREYXRhRWxlbWVudHMoMCwgeSwgdywgMSwgbGluZUJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvT3V0ZXJHbG93RWZmZWN0LmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2VmZmVjdHMvT3V0ZXJHbG93RWZmZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzMWVkNwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9PdXRlckdsb3dFZmZlY3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZWZmZWN0czsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuTWF0dGU7CisKK2ltcG9ydCBqYXZheC5zd2luZy5VSURlZmF1bHRzOworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworCisvKioKKyAqIE91dGVyR2xvd0VmZmVjdAorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biAyMSwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIE91dGVyR2xvd0VmZmVjdCBleHRlbmRzIERyb3BTaGFkb3dFZmZlY3QgeworCisgICAgcHJvdGVjdGVkIE91dGVyR2xvd0VmZmVjdCgpIHsKKyAgICAgICAgZGlzdGFuY2UgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBPdXRlckdsb3dFZmZlY3QoVUlEZWZhdWx0cyB1aURlZmF1bHRzKSB7CisgICAgICAgIGNvbG9yID0gbmV3IE1hdHRlKG5ldyBDb2xvcigyNTUsIDI1NSwgMjExKSwgdWlEZWZhdWx0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgZWZmZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB1c2VyIGRpc3BsYXlhYmxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworICAgICAgICByZXR1cm4gIk91dGVyIEdsb3ciOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9TaGFkb3dFZmZlY3QuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZWZmZWN0cy9TaGFkb3dFZmZlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTYyMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9lZmZlY3RzL1NoYWRvd0VmZmVjdC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZWZmZWN0czsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuQmxlbmRpbmdNb2RlOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuTWF0dGU7CisKK2ltcG9ydCBqYXZheC5zd2luZy5VSURlZmF1bHRzOworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworCisvKioKKyAqIFNoYWRvd0VmZmVjdCAtIGJhc2UgY2xhc3Mgd2l0aCBhbGwgdGhlIHN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIHNoYWRvdyBlZmZlY3RzCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDE4LCAyMDA3KQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2hhZG93RWZmZWN0IGV4dGVuZHMgRWZmZWN0IHsKKyAgICBwcm90ZWN0ZWQgTWF0dGUgY29sb3I7CisgICAgcHJvdGVjdGVkIEJsZW5kaW5nTW9kZSBibGVuZGluZ01vZGUgPSBCbGVuZGluZ01vZGUuTk9STUFMOworICAgIC8qKiBPcGFjaXR5IGEgZmxvYXQgMC0xIGZvciBwZXJjZW50YWdlICovCisgICAgcHJvdGVjdGVkIGZsb2F0IG9wYWNpdHkgPSAwLjc1ZjsKKyAgICAvKiogQW5nbGUgaW4gZGVncmVlcyBiZXR3ZWVuIDAtMzYwICovCisgICAgcHJvdGVjdGVkIGludCBhbmdsZSA9IDEzNTsKKyAgICAvKiogRGlzdGFuY2UgaW4gcGl4ZWxzICovCisgICAgcHJvdGVjdGVkIGludCBkaXN0YW5jZSA9IDU7CisgICAgLyoqIFRoZSBzaGFkb3cgc3ByZWFkIGJldHdlZW4gMC0xMDAgJSAqLworICAgIHByb3RlY3RlZCBpbnQgc3ByZWFkID0gMDsKKyAgICAvKiogU2l6ZSBpbiBwaXhlbHMgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHNpemUgPSA1OworCisgICAgcHJvdGVjdGVkIFNoYWRvd0VmZmVjdCgpIHt9CisKKyAgICA7CisKKyAgICBwdWJsaWMgU2hhZG93RWZmZWN0KFVJRGVmYXVsdHMgdWlEZWZhdWx0cykgeworICAgICAgICBjb2xvciA9IG5ldyBNYXR0ZShDb2xvci5CTEFDSywgdWlEZWZhdWx0cyk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBCZWFuIG1ldGhvZHMKKworICAgIHB1YmxpYyBNYXR0ZSBnZXRDb2xvcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbG9yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKE1hdHRlIGNvbG9yKSB7CisgICAgICAgIE1hdHRlIG9sZCA9IGdldENvbG9yKCk7CisgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJjb2xvciIsIG9sZCwgZ2V0Q29sb3IoKSk7CisgICAgfQorCisgICAgcHVibGljIEJsZW5kaW5nTW9kZSBnZXRCbGVuZGluZ01vZGUoKSB7CisgICAgICAgIHJldHVybiBibGVuZGluZ01vZGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmxlbmRpbmdNb2RlKEJsZW5kaW5nTW9kZSBibGVuZGluZ01vZGUpIHsKKyAgICAgICAgQmxlbmRpbmdNb2RlIG9sZCA9IGdldEJsZW5kaW5nTW9kZSgpOworICAgICAgICB0aGlzLmJsZW5kaW5nTW9kZSA9IGJsZW5kaW5nTW9kZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJibGVuZGluZ01vZGUiLCBvbGQsIGdldEJsZW5kaW5nTW9kZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0T3BhY2l0eSgpIHsKKyAgICAgICAgcmV0dXJuIG9wYWNpdHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5KSB7CisgICAgICAgIGZsb2F0IG9sZCA9IGdldE9wYWNpdHkoKTsKKyAgICAgICAgdGhpcy5vcGFjaXR5ID0gb3BhY2l0eTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJvcGFjaXR5Iiwgb2xkLCBnZXRPcGFjaXR5KCkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QW5nbGUoKSB7CisgICAgICAgIHJldHVybiBhbmdsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBbmdsZShpbnQgYW5nbGUpIHsKKyAgICAgICAgaW50IG9sZCA9IGdldEFuZ2xlKCk7CisgICAgICAgIHRoaXMuYW5nbGUgPSBhbmdsZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJhbmdsZSIsIG9sZCwgZ2V0QW5nbGUoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREaXN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3RhbmNlKGludCBkaXN0YW5jZSkgeworICAgICAgICBpbnQgb2xkID0gZ2V0RGlzdGFuY2UoKTsKKyAgICAgICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImRpc3RhbmNlIiwgb2xkLCBnZXREaXN0YW5jZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNwcmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIHNwcmVhZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTcHJlYWQoaW50IHNwcmVhZCkgeworICAgICAgICBpbnQgb2xkID0gZ2V0U3ByZWFkKCk7CisgICAgICAgIHRoaXMuc3ByZWFkID0gc3ByZWFkOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNwcmVhZCIsIG9sZCwgZ2V0U3ByZWFkKCkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBpbnQgb2xkID0gZ2V0U2l6ZSgpOworICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNpemUiLCBvbGQsIGdldFNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9mb250L1R5cGVmYWNlLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2ZvbnQvVHlwZWZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ0Njc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvZm9udC9UeXBlZmFjZS5qYXZhCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZm9udDsKKworaW1wb3J0IGphdmEuYXd0LkZvbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zd2luZy5VSURlZmF1bHRzOworaW1wb3J0IG9yZy5qZGVza3RvcC5iZWFucy5BYnN0cmFjdEJlYW47CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlscy5IYXNVSURlZmF1bHRzOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxpbmdDb250ZXh0OworCisvKioKKyAqIEkgZG9uJ3QgdGhpbmsgdGhlIG5hbWUgaXMgdGVjaG5pY2FsbHkgY29ycmVjdCAoaWU6IGEgdHlwZWZhY2UgaXMgbm90IGEgZm9udCksCisgKiBidXQgSSB3YW50ZWQgc29tZXRoaW5nIGJlc2lkZXMgImZvbnQiIHNvLCBoZXJlIGl0IGlzLgorICoKKyAqIFRoaXMgaXMgYSBtdXRhYmxlIGZvbnQsIG11Y2ggbGlrZSBNYXR0ZSBpcyBhIG11dGFibGUgY29sb3IuIEFsc28gbGlrZSBNYXR0ZSwKKyAqIFR5cGVmYWNlIGNhbiBiZSBkZXJpdmVkLgorICoKKyAqIEBhdXRob3IgcmJhaXIKKyAqLworcHVibGljIGNsYXNzIFR5cGVmYWNlIGV4dGVuZHMgQWJzdHJhY3RCZWFuIHsKKyAgICAvL3NwZWNpZmllcyB3aGV0aGVyIHRvIGRlcml2ZSBib2xkLCBvciBpdGFsaWMuCisgICAgLy9EZWZhdWx0IG1lYW5zLCBnZXQgbXkgdmFsdWUgZnJvbSBteSBwYXJlbnQuCisgICAgLy9PZmYgbWVhbnMsIGxlYXZlIGJvbGQvaXRhbGljIG9mZi4KKyAgICAvL09uIG1lYW5zLCBtYWtlIGJvbGQvaXRhbGljIG9uLgorICAgIHB1YmxpYyBlbnVtIERlcml2ZVN0eWxlIHsgRGVmYXVsdCwgT2ZmLCBPbiB9CisKKyAgICBwcml2YXRlIFN0cmluZyB1aURlZmF1bHRQYXJlbnROYW1lOworICAgIC8qKiBUaGlzIGlzIGEgbG9jYWwgVUlEZWZhdWx0cyB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgVUlEZWZhdWx0cyBpbiB0aGUgTW9kZWwuICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgVUlEZWZhdWx0cyB1aURlZmF1bHRzID0gbmV3IFVJRGVmYXVsdHMoKTsKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdWlEZWZhdWx0c0NoYW5nZUxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICBpZiAodWlEZWZhdWx0UGFyZW50TmFtZSAhPSBudWxsICYmIHVpRGVmYXVsdFBhcmVudE5hbWUuZXF1YWxzKGV2dC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVGb250RnJvbU9mZnNldHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZm9udC4gSWYgdWlEZWZhdWx0UGFyZW50TmFtZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhpcyBuYW1lCisgICAgICogd2lsbCBiZSBzZXQgdG8gYmUgZXF1YWwgdG8gdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBmb250LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgLyoqCisgICAgICogVGhlIHNpemUgb2YgdGhlIGZvbnQuIElmIHVpRGVmYXVsdFBhcmVudE5hbWUgaXMgc2V0LCB0aGVuIHRoaXMgdmFsdWUgaXMKKyAgICAgKiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIHNpemUgb2YgdGhlIHBhcmVudCBmb250ICogdGhlIHNpemVPZmZzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2l6ZTsKKworICAgIC8vdGhpcyBmaWVsZCBpcyBub3QgcHVibGljYWxseSBhY2Nlc3NpYmxlLiBSYXRoZXIsIGl0IGlzIHVwZGF0ZWQgYmFzZWQgb24KKyAgICAvLyJib2xkIiBhbmQgIml0YWxpYyIgYXMgbmVjZXNzYXJ5LgorICAgIHByaXZhdGUgaW50IHN0eWxlID0gRm9udC5QTEFJTjsKKyAgICBwcml2YXRlIERlcml2ZVN0eWxlIGJvbGQgPSBEZXJpdmVTdHlsZS5EZWZhdWx0OworICAgIHByaXZhdGUgRGVyaXZlU3R5bGUgaXRhbGljID0gRGVyaXZlU3R5bGUuRGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mZnNldC4gT25seSB1c2VkIGlmIHVpRGVmYXVsdFBhcmVudE5hbWUgaXMgc3BlY2lmaWVkLiBUaGlzIG9mZnNldAorICAgICAqIHdpbGwgYmUgbXVsdGlwbGllZCB3aXRoIHRoZSBwYXJlbnQgZm9udCdzIHNpemUgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoaXMKKyAgICAgKiB0eXBlZmFjZS4gVGhlIG9mZnNldCBpcyBzcGVjaWZpZWQgYXMgYSBwZXJjZW50YWdlLCBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisgICAgICoKKyAgICAgKiBUaGUgcmVhc29uIGEgcGVyY2VudGFnZSB3YXMgdXNlZCwgd2FzIHNvIHRoYXQgdGhpbmdzIHdvdWxkIGxvb2sgY29ycmVjdGx5CisgICAgICogd2hlbiBzY2FsZWQsIHN1Y2ggYXMgd2l0aCBoaWdoIERQSSBzaXR1YXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgc2l6ZU9mZnNldDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBUeXBlZmFjZS4gTm90ZSB0aGF0LCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIHVpRGVmYXVsdHMsCisgICAgICogeW91IGNhbm5vdCBoYXZlIGZvbnQgZGVyaXZhdGlvbi4gVGh1cywgdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbmV2ZXIKKyAgICAgKiBiZSBjYWxsZWQsIGV4Y2VwdCBmb3IgdGhlIFhNTCBiaW5kaW5nIHN0dWZmLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlZmFjZSgpIHsgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBUeXBlZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIFRoZSBmb250IGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBmb250IG5hbWUsIHNpemUsIGFuZCBzdHlsZSB0byB1c2UKKyAgICAgKiB0byBpbml0aWFsaXplIHRoaXMgdHlwZWZhY2UuIE5vdGUgdGhhdCB0aGlzIGZvbnQgaXMgbm90IHVzZWQgYXMgYSBwYXJlbnQKKyAgICAgKiBmb250IGZvciBkZXJpdmF0aW9uIHB1cnBvc2VzLiBSYXRoZXIsIGl0IGlzIHVzZWQgYXMgYSBzb3VyY2UgZnJvbSB3aGljaCB0bworICAgICAqIGNvcHkgaW5pdGlhbCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1aURlZmF1bHRzIFRoZSB1aURlZmF1bHRzIHRvIHVzZSBmb3IgZm9udCBkZXJpdmF0aW9uIHB1cnBvc2VzLgorICAgICAqIFdoZW4gdGhlIHVpRGVmYXVsdFBhcmVudE5hbWUgaXMgc3BlY2lmaWVkLCB0aGVuIHRoaXMgVHlwZWZhY2Ugd2lsbCBpbnNwZWN0CisgICAgICogdGhlIGdpdmVuIFVJRGVmYXVsdHMgZm9yIHRoYXQgcGFyZW50IDxlbT5mb250PC9lbT4uIE5vdGUgdGhhdCB0aGUgVUlEZWZhdWx0cworICAgICAqIHNob3VsZCBiZSBwb3B1bGF0ZWQgd2l0aCBhIGZvbnQsIGFuZCBub3Qgd2l0aCBhIHR5cGVmYWNlLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlZmFjZShGb250IGYsIFVJRGVmYXVsdHMgdWlEZWZhdWx0cykgeworICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBmLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHRoaXMuc2l6ZSA9IGYuZ2V0U2l6ZSgpOworICAgICAgICAgICAgdGhpcy5zdHlsZSA9IGYuZ2V0U3R5bGUoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRVaURlZmF1bHRzKHVpRGVmYXVsdHMpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gSklCWCBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSklCWCBhZnRlciBhbGwgZmllbGRzIGhhdmUgYmVlbiBzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBKSUJYIFVubWFyc2hhbGxpbmcgQ29udGV4dAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBvc3RTZXQoSVVubWFyc2hhbGxpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gd2FsayB1cCB0aWxsIHdlIGdldCBzeW50aCBtb2RlbAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHQuZ2V0U3RhY2tEZXB0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFN0YWNrT2JqZWN0KGkpIGluc3RhbmNlb2YgSGFzVUlEZWZhdWx0cykgeworICAgICAgICAgICAgICAgIFVJRGVmYXVsdHMgdWlEZWZhdWx0cyA9ICgoSGFzVUlEZWZhdWx0cykgY29udGV4dC5nZXRTdGFja09iamVjdChpKSkuZ2V0VWlEZWZhdWx0cygpOworICAgICAgICAgICAgICAgIGlmICh1aURlZmF1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0VWlEZWZhdWx0cyh1aURlZmF1bHRzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBUeXBlZmFjZSBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgVHlwZWZhY2UgYW4gYWJzb2x1dGUgRm9udCBub3QgZGVyaXZlZCBmcm9tIGEgcGFyZW50IHVpIGRlZmF1bHQKKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGFic29sdXRlIG5vdCB1aWRlZmF1bHQgZGVyaXZlZCBmb250CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHVpRGVmYXVsdFBhcmVudE5hbWUgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYWxsIHByb3BlcnRpZXMgb2YgdGhpcyBUeXBlZmFjZSB0byBiZSB0aGUgc2FtZSBhcyA8Y29kZT5zcmM8L2NvZGU+IGFuZCBmaXJlIGFsbCB0aGUgY2hhbmdlIGV2ZW50cworICAgICAqCisgICAgICogQHBhcmFtIHNyYyB0aGUgVHlwZWZhY2UgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5KFR5cGVmYWNlIHNyYykgeworICAgICAgICAvLyBrZWVwIG9sZCB2YWx1ZXMKKyAgICAgICAgRm9udCBvbGRGb250ID0gZ2V0Rm9udCgpOworICAgICAgICBTdHJpbmcgb2xkUGFyZW50TmFtZSA9IHVpRGVmYXVsdFBhcmVudE5hbWU7CisgICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKKyAgICAgICAgaW50IG9sZFNpemUgPSBzaXplOworICAgICAgICBmbG9hdCBvbGRTaXplT2Zmc2V0ID0gc2l6ZU9mZnNldDsKKyAgICAgICAgRGVyaXZlU3R5bGUgb2xkQm9sZCA9IGJvbGQsIG9sZEl0YWxpYyA9IGl0YWxpYzsKKworICAgICAgICBzdHlsZSA9IHNyYy5zdHlsZTsKKworICAgICAgICAvL05vdGUsIEkgZG9uJ3QganVzdCBjYWxsIHRoZSBzZXR0ZXJzIGhlcmUsIGJlY2F1c2UgSSB3YW50IHRvIG1ha2UKKyAgICAgICAgLy9zdXJlIHRoZSAiZm9udCIgUENFIGlzIG9ubHkgZmlyZWQgb25jZSwgYXQgdGhlIGVuZC4KKyAgICAgICAgbmFtZSA9IHNyYy5uYW1lOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoIm5hbWUiLCBvbGROYW1lLCBuYW1lKTsKKyAgICAgICAgc2l6ZSA9IHNyYy5zaXplOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNpemUiLCBvbGRTaXplLCBzaXplKTsKKyAgICAgICAgYm9sZCA9IHNyYy5ib2xkOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImJvbGQiLCBvbGRCb2xkLCBib2xkKTsKKyAgICAgICAgaXRhbGljID0gc3JjLml0YWxpYzsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJpdGFsaWMiLCBvbGRJdGFsaWMsIGl0YWxpYyk7CisgICAgICAgIHNpemVPZmZzZXQgPSBzcmMuc2l6ZU9mZnNldDsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzaXplT2Zmc2V0Iiwgb2xkU2l6ZU9mZnNldCwgc2l6ZU9mZnNldCk7CisgICAgICAgIHVpRGVmYXVsdFBhcmVudE5hbWUgPSBzcmMudWlEZWZhdWx0UGFyZW50TmFtZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ1aURlZmF1bHRQYXJlbnROYW1lIiwgb2xkUGFyZW50TmFtZSwgdWlEZWZhdWx0UGFyZW50TmFtZSk7CisgICAgICAgIHNldFVpRGVmYXVsdHMoc3JjLnVpRGVmYXVsdHMpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImZvbnQiLCBvbGRGb250LCBnZXRGb250KCkpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQmVhbiBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxvY2FsIFVJRGVmYXVsdHMgdGhhdCBjb250YWlucyBhbGwgdGhlIFVJRGVmYXVsdHMgaW4gdGhlIE1vZGVsLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVUlEZWZhdWx0cyBmb3IgdGhlIG1vZGVsIHRoYXQgY29udGFpbnMgdGhpcyBUeXBlZmFjZSwgY2FuIGJlIG51bGwgaWYgdGhpcyBUeXBlZmFjZSBpcyBub3QgcGFydCBvZiBhIGJpZ2dlcgorICAgICAqICAgICAgICAgbW9kZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgVUlEZWZhdWx0cyBnZXRVaURlZmF1bHRzKCkgeworICAgICAgICByZXR1cm4gdWlEZWZhdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2FsIFVJRGVmYXVsdHMgdGhhdCBjb250YWlucyBhbGwgdGhlIFVJRGVmYXVsdHMgaW4gdGhlIE1vZGVsLgorICAgICAqCisgICAgICogQHBhcmFtIHVpRGVmYXVsdHMgVGhlIFVJRGVmYXVsdHMgZm9yIHRoZSBtb2RlbCB0aGF0IGNvbnRhaW5zIHRoaXMgVHlwZWZhY2UsIGNhbiBiZSBudWxsIGlmIHRoaXMgVHlwZWZhY2UgaXMgbm90IHBhcnQgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICBhIGJpZ2dlciBtb2RlbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVpRGVmYXVsdHMoVUlEZWZhdWx0cyB1aURlZmF1bHRzKSB7CisgICAgICAgIGlmICh1aURlZmF1bHRzICE9IHRoaXMudWlEZWZhdWx0cykgeworICAgICAgICAgICAgVUlEZWZhdWx0cyBvbGQgPSBnZXRVaURlZmF1bHRzKCk7CisgICAgICAgICAgICBpZiAob2xkICE9IG51bGwpIG9sZC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHVpRGVmYXVsdHNDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgICAgICB0aGlzLnVpRGVmYXVsdHMgPSB1aURlZmF1bHRzOworICAgICAgICAgICAgaWYgKHVpRGVmYXVsdHMgIT0gbnVsbCkgdGhpcy51aURlZmF1bHRzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodWlEZWZhdWx0c0NoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgidWlEZWZhdWx0cyIsIG9sZCwgZ2V0VWlEZWZhdWx0cygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBpZiB0aGUgdWlkZWZhdWx0IGZvbnQgdGhhdCBpcyB0aGUgcGFyZW50IHRoYXQgdGhpcyBUeXBlZmFjZSBpcyBkZXJpdmVkIGZyb20uIElmIG51bGwgdGhlbiB0aGlzIGlzIGEKKyAgICAgKiBhYnNvbHV0ZSBmb250LgorICAgICAqCisgICAgICogQHJldHVybiBQYXJlbnQgZm9udCB1aSBkZWZhdWx0IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVpRGVmYXVsdFBhcmVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiB1aURlZmF1bHRQYXJlbnROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBpZiB0aGUgdWlkZWZhdWx0IGZvbnQgdGhhdCBpcyB0aGUgcGFyZW50IHRoYXQgdGhpcyBUeXBlZmFjZSBpcyBkZXJpdmVkIGZyb20uIElmIG51bGwgdGhlbiB0aGlzIGlzIGEKKyAgICAgKiBhYnNvbHV0ZSBmb250LgorICAgICAqCisgICAgICogQHBhcmFtIHVpRGVmYXVsdFBhcmVudE5hbWUgUGFyZW50IGZvbnQgdWkgZGVmYXVsdCBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VWlEZWZhdWx0UGFyZW50TmFtZShTdHJpbmcgdWlEZWZhdWx0UGFyZW50TmFtZSkgeworICAgICAgICBTdHJpbmcgb2xkID0gZ2V0VWlEZWZhdWx0UGFyZW50TmFtZSgpOworICAgICAgICB0aGlzLnVpRGVmYXVsdFBhcmVudE5hbWUgPSB1aURlZmF1bHRQYXJlbnROYW1lOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInVpRGVmYXVsdFBhcmVudE5hbWUiLCBvbGQsIGdldFVpRGVmYXVsdFBhcmVudE5hbWUoKSk7CisgICAgICAgIGlmIChpc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIC8vIHJlc2V0IG9mZnNldHMKKyAgICAgICAgICAgIGZsb2F0IG9sZFNpemVPZmZzZXQgPSBzaXplT2Zmc2V0OworICAgICAgICAgICAgc2l6ZU9mZnNldCA9IDA7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNpemVPZmZzZXQiLCBvbGRTaXplT2Zmc2V0LCBzaXplT2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwZGF0ZUZvbnRGcm9tT2Zmc2V0cygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBmb250CisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmb250LiBUaGlzIG1ldGhvZCBjYWxsIDxlbT5vbmx5PC9lbT4gd29ya3MgaWYKKyAgICAgKiA8Y29kZT5pc0Fic29sdXRlPC9jb2RlPiByZXR1cm5zIHRydWUuIE90aGVyd2lzZSwgaXQgaXMgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZm9udAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKyAgICAgICAgICAgIEZvbnQgb2xkRiA9IGdldEZvbnQoKTsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoIm5hbWUiLCBvbGQsIHRoaXMubmFtZSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImZvbnQiLCBvbGRGLCBnZXRGb250KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBnZXRzIHRoZSBzaXplIG9mIHRoZSBmb250LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+U2V0cyB0aGUgc2l6ZSBvZiB0aGUgZm9udC4gVEhpcyBtZXRob2QgY2FsbCB3aWxsIHdvcmsgd2hldGhlcgorICAgICAqIDxjb2RlPmlzQWJzb2x1dGU8L2NvZGU+IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZQorICAgICAqIHR5cGVmYWNlLCB0aGVuIHRoZSBzaXplIGlzIHNldCBkaXJlY3RseS4gT3RoZXJ3aXNlLCBpZiB0aGlzIGlzIGEKKyAgICAgKiBkZXJpdmVkIHR5cGVmYWNlLCB0aGVuIHRoZSBzaXplT2Zmc2V0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZQorICAgICAqIHByb3BlciBvZmZzZXQgYmFzZWQgb24gdGhpcyBzaXplLCBhbmQgdGhlIHNpemUgb2YgdGhlIHBhcmVudCBmb250LjwvcD4KKyAgICAgKgorICAgICAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgcGFyZW50IGZvbnQncyBzaXplIHdhcyAxMiwgYW5kIHRoZSBzaXplT2Zmc2V0IHdhcworICAgICAqIC0yICh0aHVzIHlpZWxkaW5nIGFzIHNpemUgb24gdGhpcyB0eXBlZmFjZSBvZiAxMCksIGFuZCB5b3UgY2FsbCBzZXRTaXplCisgICAgICogcGFzc2luZyBpbiAiMTQiIGFzIHRoZSBzaXplLCB0aGVuIHRoZSBzaXplT2Zmc2V0IHdpbGwgYmUgdXBkYXRlZCB0byBiZQorICAgICAqIGVxdWFsIHRvICIyIi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbmV3IHNpemUgZm9yIHRoaXMgdHlwZWZhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBpbnQgb2xkID0gdGhpcy5zaXplOworICAgICAgICBGb250IG9sZEYgPSBnZXRGb250KCk7CisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgic2l6ZSIsIG9sZCwgdGhpcy5zaXplKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJmb250Iiwgb2xkRiwgZ2V0Rm9udCgpKTsKKyAgICAgICAgdXBkYXRlT2Zmc2V0c0Zyb21Gb250KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZmZzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0U2l6ZU9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIHNpemVPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGVyY2VudGFnZSBieSB3aGljaCB0aGUgc2l6ZSBvZiB0aGlzIGZvbnQgc2hvdWxkIGJlIGRpZmZlcmVudAorICAgICAqIGZyb20gaXRzIHBhcmVudCBmb250LiBUaGlzIHByb3BlcnR5IGlzIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgc2l6ZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplT2Zmc2V0IHRoZSBzaXplIG9mZnNldC4gTWF5IGJlIGFueSBmbG9hdC4gVGhlIHZhbHVlICIxIiBtZWFucywKKyAgICAgKiAxMDAlLiAtMSBtZWFucyAiLTEwMCUiLiAyIG1lYW5zICIyMDAlIiwgYW5kIHNvIG9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNpemVPZmZzZXQoZmxvYXQgc2l6ZU9mZnNldCkgeworICAgICAgICBmbG9hdCBvbGQgPSB0aGlzLnNpemVPZmZzZXQ7CisgICAgICAgIEZvbnQgb2xkRiA9IGdldEZvbnQoKTsKKyAgICAgICAgdGhpcy5zaXplT2Zmc2V0ID0gc2l6ZU9mZnNldDsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzaXplT2Zmc2V0Iiwgb2xkLCB0aGlzLnNpemVPZmZzZXQpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImZvbnQiLCBvbGRGLCBnZXRGb250KCkpOworICAgICAgICB1cGRhdGVGb250RnJvbU9mZnNldHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGVyaXZlU3R5bGUgZ2V0Qm9sZCgpIHsKKyAgICAgICAgcmV0dXJuIGJvbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qm9sZChEZXJpdmVTdHlsZSBib2xkKSB7CisgICAgICAgIERlcml2ZVN0eWxlIG9sZCA9IHRoaXMuYm9sZDsKKyAgICAgICAgdGhpcy5ib2xkID0gYm9sZCA9PSBudWxsID8gRGVyaXZlU3R5bGUuRGVmYXVsdCA6IGJvbGQ7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYm9sZCIsIG9sZCwgdGhpcy5ib2xkKTsKKyAgICAgICAgdXBkYXRlRm9udEZyb21PZmZzZXRzKCk7CisgICAgfQorCisgICAgcHVibGljIERlcml2ZVN0eWxlIGdldEl0YWxpYygpIHsKKyAgICAgICAgcmV0dXJuIGl0YWxpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJdGFsaWMoRGVyaXZlU3R5bGUgaXRhbGljKSB7CisgICAgICAgIERlcml2ZVN0eWxlIG9sZCA9IHRoaXMuaXRhbGljOworICAgICAgICB0aGlzLml0YWxpYyA9IGl0YWxpYyA9PSBudWxsID8gRGVyaXZlU3R5bGUuRGVmYXVsdCA6IGl0YWxpYzsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJpdGFsaWMiLCBvbGQsIHRoaXMuaXRhbGljKTsKKyAgICAgICAgdXBkYXRlRm9udEZyb21PZmZzZXRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgZm9udCByZXByZXNlbnRlZCBieSB0aGlzIHR5cGVmYWNlIGlzIHN1cHBvcnRlZAorICAgICAqIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbSBwbGF0Zm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvbnRTdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOy8vRm9udC5nZXRGb250KG5hbWUpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBHZXRzIHRoZSBmb250IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFR5cGVmYWNlLiBJZiBmb250IGRlcml2YXRpb24gaXMKKyAgICAgKiBiZWluZyB1c2VkLCB0aGVuIHRoZSBGb250IHJldHVybmVkIGlzIHRoZSByZXN1bHQgb2YgdGhhdCBkZXJpdmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgRm9udChuYW1lLCBzdHlsZSwgc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZm9udCBmcm9tIHdoaWNoIHRoaXMgVHlwZWZhY2Ugc2hvdWxkIGV4dHJhY3QgdGhlIGZvbnQgbmFtZSwgc3R5bGUsCisgICAgICogYW5kIHNpemUuIElmIGZvbnQgZGVyaXZhdGlvbiBpcyBiZWluZyB1c2VkLCB0aGVuIHRoZSBmb250IG5hbWUgd2lsbCBiZSBpZ25vcmVkLAorICAgICAqIHRoZSBzdHlsZSB3aWxsIGJlIHVzZWQgKGFuZCBhbHdheXMgb3ZlcnJpZGUgdGhlIHBhcmVudCBmb250KSwgYW5kIHRoZSBzaXplCisgICAgICogd2lsbCBiZSBzZXQgYW5kIHRoZSBzaXplT2Zmc2V0IHVwZGF0ZWQgYXBwcm9wcmlhdGVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIHRoZSBGb250CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9udChGb250IGYpIHsKKyAgICAgICAgRm9udCBvbGRGb250ID0gZ2V0Rm9udCgpOworICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7CisgICAgICAgIGludCBvbGRTaXplID0gc2l6ZTsKKyAgICAgICAgRGVyaXZlU3R5bGUgb2xkQm9sZCA9IGJvbGQsIG9sZEl0YWxpYyA9IGl0YWxpYzsKKyAgICAgICAgbmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICBzaXplID0gZi5nZXRTaXplKCk7CisgICAgICAgIHN0eWxlID0gZi5nZXRTdHlsZSgpOworICAgICAgICB1cGRhdGVPZmZzZXRzRnJvbUZvbnQoKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJuYW1lIiwgb2xkTmFtZSwgbmFtZSk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgic2l6ZSIsIG9sZFNpemUsIHNpemUpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImJvbGQiLCBvbGRCb2xkLCBib2xkKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJpdGFsaWMiLCBvbGRJdGFsaWMsIGl0YWxpYyk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZm9udCIsIG9sZEZvbnQsIGdldEZvbnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIFR5cGVmYWNlLiBUaGlzIFN0cmluZyBzaG91bGQKKyAgICAgKiBub3QgYmUgY29uc2lkZXJlZCBwdWJsaWMgQVBJLCBhcyBpdCBtYXkgY2hhbmdlIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIEZvbnQgZiA9IGdldEZvbnQoKTsKKyAgICAgICAgU3RyaW5nICBzdHJTdHlsZTsKKyAgICAgICAgaWYgKGYuaXNCb2xkKCkpIHsKKyAgICAgICAgICAgIHN0clN0eWxlID0gZi5pc0l0YWxpYygpID8gImJvbGRpdGFsaWMiIDogImJvbGQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyU3R5bGUgPSBmLmlzSXRhbGljKCkgPyAiaXRhbGljIiA6ICJwbGFpbiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gVHlwZWZhY2UuY2xhc3MuZ2V0TmFtZSgpICsgIltuYW1lPSIgKyBuYW1lICsgIiwgc2l6ZT0iICsgc2l6ZSArICIsIHN0eWxlPSIgKyBzdHJTdHlsZSArICJdIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBUeXBlZmFjZS5jbGFzcy5nZXROYW1lKCkgKyAiW2Jhc2U9IiArIHVpRGVmYXVsdFBhcmVudE5hbWUgKworICAgICAgICAgICAgICAgICAgICAiLCBuYW1lPSIgKyBuYW1lICsgIiwgc2l6ZT0iICsgc2l6ZSArICIob2Zmc2V0ICIgKyBzaXplT2Zmc2V0ICsgIikiICsKKyAgICAgICAgICAgICAgICAgICAgIiwgc3R5bGU9IiArIHN0clN0eWxlICsgIl0iOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBUeXBlZmFjZSB0eXBlZmFjZSA9IChUeXBlZmFjZSkgbzsKKyAgICAgICAgaWYgKCF0eXBlZmFjZS5uYW1lLmVxdWFscyhuYW1lKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoc2l6ZSAhPSB0eXBlZmFjZS5zaXplKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChib2xkICE9IHR5cGVmYWNlLmJvbGQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGl0YWxpYyAhPSB0eXBlZmFjZS5pdGFsaWMpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHNpemVPZmZzZXQgIT0gdHlwZWZhY2Uuc2l6ZU9mZnNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodWlEZWZhdWx0UGFyZW50TmFtZSAhPSBudWxsID8gIXVpRGVmYXVsdFBhcmVudE5hbWUuZXF1YWxzKHR5cGVmYWNlLnVpRGVmYXVsdFBhcmVudE5hbWUpIDoKKyAgICAgICAgICAgICAgICB0eXBlZmFjZS51aURlZmF1bHRQYXJlbnROYW1lICE9IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IG5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBzaXplOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGJvbGQub3JkaW5hbCgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGl0YWxpYy5vcmRpbmFsKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGludCkoc2l6ZU9mZnNldCoxMDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICh1aURlZmF1bHRQYXJlbnROYW1lICE9IG51bGwgPyB1aURlZmF1bHRQYXJlbnROYW1lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFR5cGVmYWNlIGNsb25lKCkgeworICAgICAgICBUeXBlZmFjZSBjbG9uZSA9IG5ldyBUeXBlZmFjZSgpOworICAgICAgICBjbG9uZS5uYW1lID0gbmFtZTsKKyAgICAgICAgY2xvbmUuc2l6ZSA9IHNpemU7CisgICAgICAgIGNsb25lLnN0eWxlID0gc3R5bGU7CisgICAgICAgIGNsb25lLmJvbGQgPSBib2xkOworICAgICAgICBjbG9uZS5pdGFsaWMgPSBpdGFsaWM7CisgICAgICAgIGNsb25lLnNpemVPZmZzZXQgPSBzaXplT2Zmc2V0OworICAgICAgICBjbG9uZS51aURlZmF1bHRQYXJlbnROYW1lID0gdWlEZWZhdWx0UGFyZW50TmFtZTsKKyAgICAgICAgY2xvbmUuc2V0VWlEZWZhdWx0cyh1aURlZmF1bHRzKTsKKyAgICAgICAgcmV0dXJuIGNsb25lOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gUHJpdmF0ZSBIZWxwZXIgTWV0aG9kcworCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU9mZnNldHNGcm9tRm9udCgpIHsKKyAgICAgICAgaWYgKCFpc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNpemVPZmZzZXQgPSBzaXplT2Zmc2V0OworICAgICAgICAgICAgRm9udCBwYXJlbnRGb250ID0gdWlEZWZhdWx0cy5nZXRGb250KHVpRGVmYXVsdFBhcmVudE5hbWUpOworICAgICAgICAgICAgaWYgKHBhcmVudEZvbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZsb2F0IHMgPSBzaXplOworICAgICAgICAgICAgICAgIGZsb2F0IHAgPSBwYXJlbnRGb250LmdldFNpemUoKTsKKyAgICAgICAgICAgICAgICBzaXplT2Zmc2V0ID0gKHMvcCkgLSAxZjsKKyAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNpemVPZmZzZXQiLCBvbGRTaXplT2Zmc2V0LCBzaXplT2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGb250RnJvbU9mZnNldHMoKSB7CisgICAgICAgIGlmICghaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBGb250IG9sZEZvbnQgPSBnZXRGb250KCk7CisgICAgICAgICAgICAvLyBnZXQgcGFyZW50IGZvbnQgZGF0YQorICAgICAgICAgICAgRm9udCBwYXJlbnRGb250ID0gdWlEZWZhdWx0cy5nZXRGb250KHVpRGVmYXVsdFBhcmVudE5hbWUpOworICAgICAgICAgICAgaWYgKHBhcmVudEZvbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKKyAgICAgICAgICAgICAgICBpbnQgb2xkU2l6ZSA9IHNpemU7CisKKyAgICAgICAgICAgICAgICBuYW1lID0gcGFyZW50Rm9udC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IE1hdGgucm91bmQocGFyZW50Rm9udC5nZXRTaXplKCkgKiAoMWYgKyBzaXplT2Zmc2V0KSk7CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzQm9sZCA9IChib2xkID09IERlcml2ZVN0eWxlLkRlZmF1bHQgJiYgcGFyZW50Rm9udC5pc0JvbGQoKSkgfHwgYm9sZCA9PSBEZXJpdmVTdHlsZS5PbjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzSXRhbGljID0gKGl0YWxpYyA9PSBEZXJpdmVTdHlsZS5EZWZhdWx0ICYmIHBhcmVudEZvbnQuaXNJdGFsaWMoKSkgfHwgaXRhbGljID09IERlcml2ZVN0eWxlLk9uOworICAgICAgICAgICAgICAgIHN0eWxlID0gRm9udC5QTEFJTjsKKyAgICAgICAgICAgICAgICBpZiAoaXNCb2xkKSBzdHlsZSA9IHN0eWxlIHwgRm9udC5CT0xEOworICAgICAgICAgICAgICAgIGlmIChpc0l0YWxpYykgc3R5bGUgPSBzdHlsZSB8IEZvbnQuSVRBTElDOworCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGZpcmUgZXZlbnRzCisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJuYW1lIiwgb2xkTmFtZSwgbmFtZSk7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzaXplIiwgb2xkU2l6ZSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJmb250Iiwgb2xkRm9udCwgZ2V0Rm9udCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvamlieGhlbHBlcnMvQ2FudmFzTWFwcGVyLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2ppYnhoZWxwZXJzL0NhbnZhc01hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjAxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2ppYnhoZWxwZXJzL0NhbnZhc01hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnM7CisKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLkNhbnZhczsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnV0aWxzLkhhc1BhdGg7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlscy5IYXNSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlscy5IYXNVSURlZmF1bHRzOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuQmluZGluZ0RpcmVjdG9yeTsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklCaW5kaW5nRmFjdG9yeTsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGFibGU7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxlcjsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JVW5tYXJzaGFsbGVyOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSmlCWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLmltcGwuTWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5Vbm1hcnNoYWxsaW5nQ29udGV4dDsKKworaW1wb3J0IGphdmF4LnN3aW5nLlVJRGVmYXVsdHM7CitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIENhbnZhc01hcHBlcgorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biAxMiwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIENhbnZhc01hcHBlciBpbXBsZW1lbnRzIElNYXJzaGFsbGVyLCBJVW5tYXJzaGFsbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OQU1FID0gImNhbnZhcyI7CisgICAgcHJpdmF0ZSBJQmluZGluZ0ZhY3RvcnkgYmluZGluZ0ZhY3Rvcnk7CisKKworICAgIHB1YmxpYyBDYW52YXNNYXBwZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiaW5kaW5nRmFjdG9yeSA9IEJpbmRpbmdEaXJlY3RvcnkuZ2V0RmFjdG9yeShDYW52YXMuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChKaUJYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVuc2lvbihpbnQgaSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KElVbm1hcnNoYWxsaW5nQ29udGV4dCBpVW5tYXJzaGFsbGluZ0NvbnRleHQpIHRocm93cyBKaUJYRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGlVbm1hcnNoYWxsaW5nQ29udGV4dC5pc0F0KG51bGwsIEVMRU1FTlRfTkFNRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3Qgb2JqZWN0LCBJTWFyc2hhbGxpbmdDb250ZXh0IGlNYXJzaGFsbGluZ0NvbnRleHQpIHRocm93cyBKaUJYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQ2FudmFzKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEppQlhFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IHR5cGUgZm9yIG1hcnNoYWxsZXIiKTsKKyAgICAgICAgfSBlbHNlIGlmICghKGlNYXJzaGFsbGluZ0NvbnRleHQgaW5zdGFuY2VvZiBNYXJzaGFsbGluZ0NvbnRleHQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmlCWEV4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgdHlwZSBmb3IgbWFyc2hhbGxlciIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdmVyc2lvbiBmb3VuZCwgY3JlYXRlIG1hcnNoYWxsZXIgZm9yIHRoZSBhc3NvY2lhdGVkIGJpbmRpbmcKKy8vICAgICAgICAgICAgSUJpbmRpbmdGYWN0b3J5IGJpbmRpbmdGYWN0b3J5ID0gQmluZGluZ0RpcmVjdG9yeS5nZXRGYWN0b3J5KG9iamVjdC5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIE1hcnNoYWxsaW5nQ29udGV4dCBjb250ZXh0ID0gKE1hcnNoYWxsaW5nQ29udGV4dCkgYmluZGluZ0ZhY3RvcnkuY3JlYXRlTWFyc2hhbGxpbmdDb250ZXh0KCk7CisgICAgICAgICAgICAvLyBjb25maWd1cmUgbWFyc2hhbGxlciBmb3Igd3JpdGluZyBkb2N1bWVudAorICAgICAgICAgICAgY29udGV4dC5zZXRYbWxXcml0ZXIoaU1hcnNoYWxsaW5nQ29udGV4dC5nZXRYbWxXcml0ZXIoKSk7CisgICAgICAgICAgICAvLyBvdXRwdXQgb2JqZWN0IGFzIGRvY3VtZW50CisgICAgICAgICAgICAoKElNYXJzaGFsbGFibGUpIG9iamVjdCkubWFyc2hhbChjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKE9iamVjdCBvYmplY3QsIElVbm1hcnNoYWxsaW5nQ29udGV4dCBpVW5tYXJzaGFsbGluZ0NvbnRleHQpIHRocm93cyBKaUJYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlJ3JlIGF0IHRoZSBhcHByb3ByaWF0ZSBzdGFydCB0YWcKKyAgICAgICAgVW5tYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gKFVubWFyc2hhbGxpbmdDb250ZXh0KSBpVW5tYXJzaGFsbGluZ0NvbnRleHQ7CisgICAgICAgIGlmICghY3R4LmlzQXQobnVsbCwgRUxFTUVOVF9OQU1FKSkgeworICAgICAgICAgICAgY3R4LnRocm93U3RhcnRUYWdOYW1lRXJyb3IobnVsbCwgRUxFTUVOVF9OQU1FKTsKKyAgICAgICAgfQorCisvLyAgICAgICAgSUJpbmRpbmdGYWN0b3J5IGJpbmRpbmdGYWN0b3J5ID0gQmluZGluZ0RpcmVjdG9yeS5nZXRGYWN0b3J5KENhbnZhcy5jbGFzcyk7CisgICAgICAgIFVubWFyc2hhbGxpbmdDb250ZXh0IHVjdHggPSAoVW5tYXJzaGFsbGluZ0NvbnRleHQpIGJpbmRpbmdGYWN0b3J5LmNyZWF0ZVVubWFyc2hhbGxpbmdDb250ZXh0KCk7CisgICAgICAgIHVjdHguc2V0RnJvbUNvbnRleHQoY3R4KTsKKyAgICAgICAgLy8gZ2V0IHRoZSB1aURlZmF1bHRzIGZyb20gU3ludGhNb2RlbCBhbmQgc2V0IHRoZW0gYXMgdXNlciBjb250ZXh0CisgICAgICAgIFVJRGVmYXVsdHMgdWlEZWZhdWx0cyA9ICgoSGFzVUlEZWZhdWx0cykgY3R4LmdldFN0YWNrT2JqZWN0KGN0eC5nZXRTdGFja0RlcHRoKCkgLSAxKSkuZ2V0VWlEZWZhdWx0cygpOworICAgICAgICB1Y3R4LnNldFVzZXJDb250ZXh0KHVpRGVmYXVsdHMpOworICAgICAgICAvLyBnZXQgaGFzIHJlc291cmNlcworICAgICAgICBIYXNSZXNvdXJjZXMgaGFzUmVzb3VyY2VzID0gKEhhc1Jlc291cmNlcykgY3R4LmdldFN0YWNrT2JqZWN0KGN0eC5nZXRTdGFja0RlcHRoKCkgLSAxKTsKKyAgICAgICAgLy8gZ2V0IHBhdGgKKyAgICAgICAgSGFzUGF0aCBoYXNQYXRoID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdHguZ2V0U3RhY2tEZXB0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdHguZ2V0U3RhY2tPYmplY3QoaSkgaW5zdGFuY2VvZiBIYXNQYXRoKSB7CisgICAgICAgICAgICAgICAgaGFzUGF0aCA9IChIYXNQYXRoKSBjdHguZ2V0U3RhY2tPYmplY3QoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVW5tYXJzaGFsIHRoZSBDYW52YXMKKyAgICAgICAgQ2FudmFzIGNhbnZhcyA9IChDYW52YXMpIHVjdHgudW5tYXJzaGFsRWxlbWVudCgpOworICAgICAgICAvLyBzZXQgY2FudmFzJ3MgdWkgZGVmYXVsdHMKKyAgICAgICAgY2FudmFzLnNldFVpRGVmYXVsdHModWlEZWZhdWx0cyk7CisgICAgICAgIC8vIGdldCBjYW52YXMgcGF0aAorICAgICAgICBTdHJpbmcgY2FudmFzUGF0aCA9IGhhc1BhdGguZ2V0UGF0aCgpOworICAgICAgICAvLyBjYWxjIGFuZCBzZXQgcmVzb3VyY2VzCisgICAgICAgIGNhbnZhcy5zZXRSZXNvdXJjZXNEaXIobmV3IEZpbGUoaGFzUmVzb3VyY2VzLmdldFJlc291cmNlc0RpcigpLCBjYW52YXNQYXRoKSk7CisgICAgICAgIGNhbnZhcy5zZXRUZW1wbGF0ZXNEaXIobmV3IEZpbGUoaGFzUmVzb3VyY2VzLmdldFRlbXBsYXRlc0RpcigpLCBjYW52YXNQYXRoKSk7CisgICAgICAgIGNhbnZhcy5zZXRJbWFnZXNEaXIobmV3IEZpbGUoaGFzUmVzb3VyY2VzLmdldEltYWdlc0RpcigpLCBjYW52YXNQYXRoKSk7CisgICAgICAgIC8vIHJldHVybiBjYW52YXMKKyAgICAgICAgcmV0dXJuIGNhbnZhczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2ppYnhoZWxwZXJzL0NvbG9yTWFwcGVyLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2ppYnhoZWxwZXJzL0NvbG9yTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjYzczOAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvamlieGhlbHBlcnMvQ29sb3JNYXBwZXIuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnM7CisKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGVyOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSU1hcnNoYWxsaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklVbm1hcnNoYWxsZXI7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JVW5tYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5KaUJYRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5NYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5pbXBsLlVubWFyc2hhbGxpbmdDb250ZXh0OworCitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CisKKy8qKgorICogQ29sb3JNYXBwZXIKKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChKdW4gOCwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIENvbG9yTWFwcGVyIGltcGxlbWVudHMgSU1hcnNoYWxsZXIsIElVbm1hcnNoYWxsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05BTUUgPSAiY29sb3IiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRURfTkFNRSA9ICJyZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFTl9OQU1FID0gImdyZWVuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRV9OQU1FID0gImJsdWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTFBIQV9OQU1FID0gImFscGhhIjsKKworICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uKGludCBpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoSVVubWFyc2hhbGxpbmdDb250ZXh0IGlVbm1hcnNoYWxsaW5nQ29udGV4dCkgdGhyb3dzIEppQlhFeGNlcHRpb24geworICAgICAgICByZXR1cm4gaVVubWFyc2hhbGxpbmdDb250ZXh0LmlzQXQobnVsbCwgRUxFTUVOVF9OQU1FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmplY3QsIElNYXJzaGFsbGluZ0NvbnRleHQgaU1hcnNoYWxsaW5nQ29udGV4dCkgdGhyb3dzIEppQlhFeGNlcHRpb24geworICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb2xvcikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKaUJYRXhjZXB0aW9uKCJJbnZhbGlkIG9iamVjdCB0eXBlIGZvciBtYXJzaGFsbGVyIik7CisgICAgICAgIH0gZWxzZSBpZiAoIShpTWFyc2hhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgTWFyc2hhbGxpbmdDb250ZXh0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEppQlhFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IHR5cGUgZm9yIG1hcnNoYWxsZXIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1hcnNoYWxsaW5nQ29udGV4dCBjdHggPSAoTWFyc2hhbGxpbmdDb250ZXh0KSBpTWFyc2hhbGxpbmdDb250ZXh0OworICAgICAgICAgICAgQ29sb3IgY29sb3IgPSAoQ29sb3IpIG9iamVjdDsKKyAgICAgICAgICAgIGN0eC5zdGFydFRhZ0F0dHJpYnV0ZXMoMCwgRUxFTUVOVF9OQU1FKS4KKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKDAsIFJFRF9OQU1FLCBjb2xvci5nZXRSZWQoKSkuCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSgwLCBHUkVFTl9OQU1FLCBjb2xvci5nZXRHcmVlbigpKS4KKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKDAsIEJMVUVfTkFNRSwgY29sb3IuZ2V0Qmx1ZSgpKS4KKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKDAsIEFMUEhBX05BTUUsIGNvbG9yLmdldEFscGhhKCkpLgorICAgICAgICAgICAgICAgICAgICBjbG9zZVN0YXJ0RW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKE9iamVjdCBvYmplY3QsIElVbm1hcnNoYWxsaW5nQ29udGV4dCBpVW5tYXJzaGFsbGluZ0NvbnRleHQpIHRocm93cyBKaUJYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlJ3JlIGF0IHRoZSBhcHByb3ByaWF0ZSBzdGFydCB0YWcKKyAgICAgICAgVW5tYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gKFVubWFyc2hhbGxpbmdDb250ZXh0KSBpVW5tYXJzaGFsbGluZ0NvbnRleHQ7CisgICAgICAgIGlmICghY3R4LmlzQXQobnVsbCwgRUxFTUVOVF9OQU1FKSkgeworICAgICAgICAgICAgY3R4LnRocm93U3RhcnRUYWdOYW1lRXJyb3IobnVsbCwgRUxFTUVOVF9OQU1FKTsKKyAgICAgICAgfQorICAgICAgICAvLyBnZXQgdmFsdWVzCisgICAgICAgIGludCByZWQgPSBjdHguYXR0cmlidXRlSW50KG51bGwsIFJFRF9OQU1FLCAwKTsKKyAgICAgICAgaW50IGdyZWVuID0gY3R4LmF0dHJpYnV0ZUludChudWxsLCBHUkVFTl9OQU1FLCAwKTsKKyAgICAgICAgaW50IGJsdWUgPSBjdHguYXR0cmlidXRlSW50KG51bGwsIEJMVUVfTkFNRSwgMCk7CisgICAgICAgIGludCBhbHBoYSA9IGN0eC5hdHRyaWJ1dGVJbnQobnVsbCwgQUxQSEFfTkFNRSwgMCk7CisgICAgICAgIGN0eC5wYXJzZVBhc3RFbmRUYWcobnVsbCwgRUxFTUVOVF9OQU1FKTsKKyAgICAgICAgLy8gY3JlYXRlCisgICAgICAgIHJldHVybiBuZXcgQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvamlieGhlbHBlcnMvRGltZW5zaW9uTWFwcGVyLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2ppYnhoZWxwZXJzL0RpbWVuc2lvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YTBmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2ppYnhoZWxwZXJzL0RpbWVuc2lvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnM7CisKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklBbGlhc2FibGU7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxlcjsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JVW5tYXJzaGFsbGVyOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSmlCWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLmltcGwuTWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5Vbm1hcnNoYWxsaW5nQ29udGV4dDsKKworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKKworLyoqCisgKiBEaW1lbnNpb25NYXBwZXIKKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChKdW4gMTIsIDIwMDcpCisgKi8KK3B1YmxpYyBjbGFzcyBEaW1lbnNpb25NYXBwZXIgaW1wbGVtZW50cyBJTWFyc2hhbGxlciwgSVVubWFyc2hhbGxlciwgSUFsaWFzYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTkFNRSA9ICJkaW1lbnNpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSURUSF9OQU1FID0gIndpZHRoIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVJR0hUX05BTUUgPSAiaGVpZ2h0IjsKKworICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKKyAgICBwcml2YXRlIGludCBpbmRleDsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIERpbWVuc2lvbk1hcHBlcigpIHsKKyAgICAgICAgdXJpID0gbnVsbDsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICBuYW1lID0gRUxFTUVOVF9OQU1FOworICAgIH0KKworICAgIHB1YmxpYyBEaW1lbnNpb25NYXBwZXIoU3RyaW5nIHVyaSwgaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uKGludCBpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoSVVubWFyc2hhbGxpbmdDb250ZXh0IGlVbm1hcnNoYWxsaW5nQ29udGV4dCkgdGhyb3dzIEppQlhFeGNlcHRpb24geworICAgICAgICByZXR1cm4gaVVubWFyc2hhbGxpbmdDb250ZXh0LmlzQXQodXJpLCBFTEVNRU5UX05BTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iamVjdCwgSU1hcnNoYWxsaW5nQ29udGV4dCBpTWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIERpbWVuc2lvbikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKaUJYRXhjZXB0aW9uKCJJbnZhbGlkIG9iamVjdCB0eXBlIGZvciBtYXJzaGFsbGVyIik7CisgICAgICAgIH0gZWxzZSBpZiAoIShpTWFyc2hhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgTWFyc2hhbGxpbmdDb250ZXh0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEppQlhFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IHR5cGUgZm9yIG1hcnNoYWxsZXIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1hcnNoYWxsaW5nQ29udGV4dCBjdHggPSAoTWFyc2hhbGxpbmdDb250ZXh0KSBpTWFyc2hhbGxpbmdDb250ZXh0OworICAgICAgICAgICAgRGltZW5zaW9uIGRpbWVuc2lvbiA9IChEaW1lbnNpb24pIG9iamVjdDsKKyAgICAgICAgICAgIGN0eC5zdGFydFRhZ0F0dHJpYnV0ZXMoaW5kZXgsIG5hbWUpLgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUoaW5kZXgsIFdJRFRIX05BTUUsIGRpbWVuc2lvbi53aWR0aCkuCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZShpbmRleCwgSEVJR0hUX05BTUUsIGRpbWVuc2lvbi5oZWlnaHQpLgorICAgICAgICAgICAgICAgICAgICBjbG9zZVN0YXJ0RW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKE9iamVjdCBvYmplY3QsIElVbm1hcnNoYWxsaW5nQ29udGV4dCBpVW5tYXJzaGFsbGluZ0NvbnRleHQpIHRocm93cyBKaUJYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlJ3JlIGF0IHRoZSBhcHByb3ByaWF0ZSBzdGFydCB0YWcKKyAgICAgICAgVW5tYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gKFVubWFyc2hhbGxpbmdDb250ZXh0KSBpVW5tYXJzaGFsbGluZ0NvbnRleHQ7CisgICAgICAgIGlmICghY3R4LmlzQXQodXJpLCBuYW1lKSkgeworICAgICAgICAgICAgY3R4LnRocm93U3RhcnRUYWdOYW1lRXJyb3IodXJpLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAvLyBnZXQgdmFsdWVzCisgICAgICAgIGludCB3aWR0aCA9IGN0eC5hdHRyaWJ1dGVJbnQodXJpLCBXSURUSF9OQU1FLCBpbmRleCk7CisgICAgICAgIGludCBoZWlnaHQgPSBjdHguYXR0cmlidXRlSW50KHVyaSwgSEVJR0hUX05BTUUsIGluZGV4KTsKKyAgICAgICAgLy8gc3RhdGUgZmluaXNoZWQgcGFyc2luZworICAgICAgICBjdHgucGFyc2VQYXN0RW5kVGFnKHVyaSwgbmFtZSk7CisgICAgICAgIC8vIGNyZWF0ZQorICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL2ppYnhoZWxwZXJzL0luc2V0c01hcHBlci5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9qaWJ4aGVscGVycy9JbnNldHNNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBjYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9qaWJ4aGVscGVycy9JbnNldHNNYXBwZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzOworCitpbXBvcnQgb3JnLmppYngucnVudGltZS5JQWxpYXNhYmxlOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSU1hcnNoYWxsZXI7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxlcjsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklVbm1hcnNoYWxsaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLkppQlhFeGNlcHRpb247CitpbXBvcnQgb3JnLmppYngucnVudGltZS5pbXBsLk1hcnNoYWxsaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLmltcGwuVW5tYXJzaGFsbGluZ0NvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmF3dC5JbnNldHM7CisKKy8qKgorICogSW5zZXRzTWFwcGVyCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDgsIDIwMDcpCisgKi8KK3B1YmxpYyBjbGFzcyBJbnNldHNNYXBwZXIgaW1wbGVtZW50cyBJTWFyc2hhbGxlciwgSVVubWFyc2hhbGxlciwgSUFsaWFzYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTkFNRSA9ICJpbnNldHMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BfTkFNRSA9ICJ0b3AiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT1RUT01fTkFNRSA9ICJib3R0b20iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRUZUX05BTUUgPSAibGVmdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJJR0hUX05BTUUgPSAicmlnaHQiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOworICAgIHByaXZhdGUgaW50IGluZGV4OworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgSW5zZXRzTWFwcGVyKCkgeworICAgICAgICB1cmkgPSBudWxsOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIG5hbWUgPSBFTEVNRU5UX05BTUU7CisgICAgfQorCisgICAgcHVibGljIEluc2V0c01hcHBlcihTdHJpbmcgdXJpLCBpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMudXJpID0gdXJpOworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnNldHNNYXBwZXIuQ09OU1RSQ1VURUQgd2l0aCB1cmk9Iit1cmkrIiBpbmRleD0iK2luZGV4KyIgbmFtZT0iK25hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uKGludCBpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoSVVubWFyc2hhbGxpbmdDb250ZXh0IGlVbm1hcnNoYWxsaW5nQ29udGV4dCkgdGhyb3dzIEppQlhFeGNlcHRpb24geworICAgICAgICByZXR1cm4gaVVubWFyc2hhbGxpbmdDb250ZXh0LmlzQXQodXJpLCBFTEVNRU5UX05BTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iamVjdCwgSU1hcnNoYWxsaW5nQ29udGV4dCBpTWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEluc2V0cykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKaUJYRXhjZXB0aW9uKCJJbnZhbGlkIG9iamVjdCB0eXBlIGZvciBtYXJzaGFsbGVyIik7CisgICAgICAgIH0gZWxzZSBpZiAoIShpTWFyc2hhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgTWFyc2hhbGxpbmdDb250ZXh0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEppQlhFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IHR5cGUgZm9yIG1hcnNoYWxsZXIiKTsKKyAgICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnNldHNNYXBwZXIubWFyc2hhbCBuYW1lPSIrbmFtZSk7CisgICAgICAgICAgICBNYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gKE1hcnNoYWxsaW5nQ29udGV4dCkgaU1hcnNoYWxsaW5nQ29udGV4dDsKKyAgICAgICAgICAgIEluc2V0cyBpbnNldHMgPSAoSW5zZXRzKSBvYmplY3Q7CisgICAgICAgICAgICBjdHguc3RhcnRUYWdBdHRyaWJ1dGVzKGluZGV4LCBuYW1lKS4KKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKGluZGV4LCBUT1BfTkFNRSwgaW5zZXRzLnRvcCkuCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZShpbmRleCwgQk9UVE9NX05BTUUsIGluc2V0cy5ib3R0b20pLgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUoaW5kZXgsIExFRlRfTkFNRSwgaW5zZXRzLmxlZnQpLgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUoaW5kZXgsIFJJR0hUX05BTUUsIGluc2V0cy5yaWdodCkuCisgICAgICAgICAgICAgICAgICAgIGNsb3NlU3RhcnRFbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoT2JqZWN0IG9iamVjdCwgSVVubWFyc2hhbGxpbmdDb250ZXh0IGlVbm1hcnNoYWxsaW5nQ29udGV4dCkgdGhyb3dzIEppQlhFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgYXQgdGhlIGFwcHJvcHJpYXRlIHN0YXJ0IHRhZworICAgICAgICBVbm1hcnNoYWxsaW5nQ29udGV4dCBjdHggPSAoVW5tYXJzaGFsbGluZ0NvbnRleHQpIGlVbm1hcnNoYWxsaW5nQ29udGV4dDsKKyAgICAgICAgaWYgKCFjdHguaXNBdCh1cmksIG5hbWUpKSB7CisvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zZXRzTWFwcGVyLnVubWFyc2hhbCBuYW1lPSIrbmFtZSsiIHVyaT0iK3VyaSsiIGN1cnJlbnROb2RlPSIrY3R4LmdldE5hbWUoKSk7CisgICAgICAgICAgICBjdHgudGhyb3dTdGFydFRhZ05hbWVFcnJvcih1cmksIG5hbWUpOworICAgICAgICB9IGVsc2UgeworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zZXRzTWFwcGVyLnVubWFyc2hhbCBuYW1lPSIrbmFtZSsiIHVyaT0iK3VyaSsiIGN1cnJlbnROb2RlPSIrY3R4LmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZ2V0IHZhbHVlcworICAgICAgICBpbnQgdG9wID0gY3R4LmF0dHJpYnV0ZUludCh1cmksIFRPUF9OQU1FLCBpbmRleCk7CisgICAgICAgIGludCBib3R0b20gPSBjdHguYXR0cmlidXRlSW50KHVyaSwgQk9UVE9NX05BTUUsIGluZGV4KTsKKyAgICAgICAgaW50IGxlZnQgPSBjdHguYXR0cmlidXRlSW50KHVyaSwgTEVGVF9OQU1FLCBpbmRleCk7CisgICAgICAgIGludCByaWdodCA9IGN0eC5hdHRyaWJ1dGVJbnQodXJpLCBSSUdIVF9OQU1FLCBpbmRleCk7CisgICAgICAgIC8vIGNyZWF0ZSBuZXcgaGFzaG1hcCBpZiBuZWVkZWQKKyAgICAgICAgSW5zZXRzIGluc2V0cyA9IChJbnNldHMpIG9iamVjdDsKKyAgICAgICAgaWYgKGluc2V0cyA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnNldHMgPSBuZXcgSW5zZXRzKHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnNldHMuc2V0KHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgY3R4LnBhcnNlUGFzdEVuZFRhZyh1cmksIG5hbWUpOworICAgICAgICByZXR1cm4gaW5zZXRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvQWJzdHJhY3RHcmFkaWVudC5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9wYWludC9BYnN0cmFjdEdyYWRpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5NGFiYwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvQWJzdHJhY3RHcmFkaWVudC5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQ7CisKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5NdWx0aXBsZUdyYWRpZW50UGFpbnQuQ3ljbGVNZXRob2Q7CitpbXBvcnQgamF2YS5hd3QuUGFpbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIEBhdXRob3IgcmJhaXIgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEdyYWRpZW50IGV4dGVuZHMgUGFpbnRNb2RlbCB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPEdyYWRpZW50U3RvcD4gc29ydGVyID0gbmV3IENvbXBhcmF0b3I8R3JhZGllbnRTdG9wPigpIHsKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKEdyYWRpZW50U3RvcCBzMSwgR3JhZGllbnRTdG9wIHMyKSB7CisgICAgICAgICAgICAvL3NpbmNlIGEgZmxvYXQgdmFsdWUgbWF5IGJlIC0uMDAxIG9yIC4wMDEsIGFuZCBzaW5jZSBjYXN0aW5nCisgICAgICAgICAgICAvL3RoaXMgdG8gYW4gaW50IHdpbGwgcm91bmQgb2ZmIHRvIDAsIEkgaGF2ZSB0byBkbyBhIG1vcmUgZGlyZWN0CisgICAgICAgICAgICAvL2NvbXBhcmlzb24KKyAgICAgICAgICAgIGZsb2F0IHYgPSBzMS5nZXRQb3NpdGlvbigpIC0gczIuZ2V0UG9zaXRpb24oKTsKKworICAgICAgICAgICAgaWYgKHYgPCAwKSByZXR1cm4gLTE7CisgICAgICAgICAgICBlbHNlIGlmICh2ID09IDApIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH07CisgICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN0b3BMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgaWYgKGV2dC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoInBvc2l0aW9uIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RvcHMuY29udGFpbnMoKEdyYWRpZW50U3RvcCkgZXZ0LmdldFNvdXJjZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXNvcnRNb2RlbCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIltXQVJOSU5HXSBUaGUgcG9zaXRpb24gb2YgYW4gb3JwaGFuZWQgc3RvcCB3YXMgY2hhbmdlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnQiLCBudWxsLCBnZXRQYWludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIExpc3Q8R3JhZGllbnRTdG9wPiBzdG9wcyA9IG5ldyBBcnJheUxpc3Q8R3JhZGllbnRTdG9wPigpOworICAgIHByaXZhdGUgTGlzdDxHcmFkaWVudFN0b3A+IHVubW9kaWZpYWJsZTsKKyAgICBwcml2YXRlIEN5Y2xlTWV0aG9kIGN5Y2xlTWV0aG9kOworCisgICAgcHJvdGVjdGVkIEFic3RyYWN0R3JhZGllbnQoKSB7CisgICAgICAgIHVubW9kaWZpYWJsZSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoc3RvcHMpOworICAgICAgICBjeWNsZU1ldGhvZCA9IEN5Y2xlTWV0aG9kLk5PX0NZQ0xFOworICAgICAgICBzZXRTdG9wcyhuZXcgR3JhZGllbnRTdG9wKDAsIG5ldyBNYXR0ZShDb2xvci5CTFVFLCBudWxsKSksCisgICAgICAgICAgICAgICAgbmV3IEdyYWRpZW50U3RvcCgxLCBuZXcgTWF0dGUoQ29sb3IuV0hJVEUsIG51bGwpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBzdG9wcyBhbmQgY3ljbGVNZXRob2QgZnJvbSBzcmMgdG8gZHN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZHN0IFRoZSBncmFkaWVudCB0byB1cGRhdGUgdG8gc2FtZSBzdG9wcyBhbmQgY3ljbGUgbWV0aG9kIGFzIHRoaXMgZ3JhZGllbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5VG8oQWJzdHJhY3RHcmFkaWVudCBkc3QpIHsKKyAgICAgICAgZHN0LnN0b3BzLmNsZWFyKCk7CisgICAgICAgIExpc3Q8R3JhZGllbnRTdG9wPiBzdG9wcyA9IG5ldyBBcnJheUxpc3Q8R3JhZGllbnRTdG9wPigpOworICAgICAgICBmb3IgKEdyYWRpZW50U3RvcCBzdG9wIDogdGhpcy5zdG9wcykgeworICAgICAgICAgICAgc3RvcHMuYWRkKHN0b3AuY2xvbmUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LnNldFN0b3BzKHN0b3BzKTsKKyAgICAgICAgZHN0LmN5Y2xlTWV0aG9kID0gdGhpcy5jeWNsZU1ldGhvZDsKKyAgICB9CisKKworICAgIHB1YmxpYyBQYWludENvbnRyb2xUeXBlIGdldFBhaW50Q29udHJvbFR5cGUoKSB7CisgICAgICAgIHJldHVybiBQYWludENvbnRyb2xUeXBlLmNvbnRyb2xfbGluZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDeWNsZU1ldGhvZChDeWNsZU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgQ3ljbGVNZXRob2Qgb2xkID0gY3ljbGVNZXRob2Q7CisgICAgICAgIFBhaW50IG9sZHAgPSBnZXRQYWludCgpOworICAgICAgICBjeWNsZU1ldGhvZCA9IG1ldGhvZCA9PSBudWxsID8gQ3ljbGVNZXRob2QuTk9fQ1lDTEUgOiBtZXRob2Q7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiY3ljbGVNZXRob2QiLCBvbGQsIGN5Y2xlTWV0aG9kKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwYWludCIsIG9sZHAsIGdldFBhaW50KCkpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBDeWNsZU1ldGhvZCBnZXRDeWNsZU1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIGN5Y2xlTWV0aG9kOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0b3BzKEdyYWRpZW50U3RvcC4uLiBzdG9wcykgeworICAgICAgICBpZiAoc3RvcHMgPT0gbnVsbCB8fCBzdG9wcy5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IGhhdmUgbW9yZSB0aGFuIG9uZSBzdG9wIik7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxHcmFkaWVudFN0b3A+IG9sZCA9IG5ldyBBcnJheUxpc3Q8R3JhZGllbnRTdG9wPih0aGlzLnN0b3BzKTsKKyAgICAgICAgZm9yIChHcmFkaWVudFN0b3Agc3RvcCA6IG9sZCkgeworICAgICAgICAgICAgc3RvcC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHN0b3BMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgUGFpbnQgb2xkcCA9IGdldFBhaW50KCk7CisgICAgICAgIHRoaXMuc3RvcHMuY2xlYXIoKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKHRoaXMuc3RvcHMsIHN0b3BzKTsKKyAgICAgICAgZm9yIChHcmFkaWVudFN0b3Agc3RvcCA6IHRoaXMuc3RvcHMpIHsKKyAgICAgICAgICAgIHN0b3AuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzdG9wTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIHJlc29ydE1vZGVsKGZhbHNlKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzdG9wcyIsIG9sZCwgZ2V0U3RvcHMoKSk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnQiLCBvbGRwLCBnZXRQYWludCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTdG9wcyhMaXN0PEdyYWRpZW50U3RvcD4gc3RvcHMpIHsKKyAgICAgICAgc2V0U3RvcHMoc3RvcHMgPT0gbnVsbCA/IG51bGwgOiBzdG9wcy50b0FycmF5KG5ldyBHcmFkaWVudFN0b3BbMF0pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgTGlzdDxHcmFkaWVudFN0b3A+IGdldFN0b3BzKCkgeworICAgICAgICByZXR1cm4gdW5tb2RpZmlhYmxlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNvcnRNb2RlbChib29sZWFuIGZpcmVFdmVudCkgeworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMuc3RvcHMsIHNvcnRlcik7CisgICAgICAgIGlmIChmaXJlRXZlbnQpIHsKKyAgICAgICAgICAgIFBhaW50IG9sZHAgPSBnZXRQYWludCgpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzdG9wcyIsIG51bGwsIGdldFN0b3BzKCkpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwYWludCIsIG9sZHAsIGdldFBhaW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9hZGRzIGEgbmV3IHN0b3AsIGFuZCBpbnRlcm9wbGF0ZXMgdGhlIHByb3BlciBjb2xvciB0byB1c2UgYmFzZWQgb24KKyAgICAvL2l0cyBwb3NpdGlvbgorICAgIHB1YmxpYyBHcmFkaWVudFN0b3AgYWRkU3RvcChmbG9hdCBwb3NpdGlvbikgeworICAgICAgICBHcmFkaWVudFN0b3AgcHJldlN0b3AgPSBudWxsOworICAgICAgICBHcmFkaWVudFN0b3AgbmV4dFN0b3AgPSBudWxsOworICAgICAgICBmb3IgKEdyYWRpZW50U3RvcCBzdG9wIDogc3RvcHMpIHsKKyAgICAgICAgICAgIGlmIChzdG9wLmdldFBvc2l0aW9uKCkgPD0gcG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBwcmV2U3RvcCA9IHN0b3A7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3AuZ2V0UG9zaXRpb24oKSA+PSBwb3NpdGlvbikgeworICAgICAgICAgICAgICAgIG5leHRTdG9wID0gc3RvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE1hdHRlIGMgPSBudWxsOworICAgICAgICBpZiAocHJldlN0b3AgIT0gbnVsbCAmJiBuZXh0U3RvcCAhPSBudWxsKSB7CisgICAgICAgICAgICAvL2ludGVycG9sYXRlIHRoZSB2YWx1ZSBvZiBjCisgICAgICAgICAgICBjID0gaW50ZXJwb2xhdGUocHJldlN0b3AuZ2V0Q29sb3IoKSwgbmV4dFN0b3AuZ2V0Q29sb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gLyAobmV4dFN0b3AuZ2V0UG9zaXRpb24oKSAtIHByZXZTdG9wLmdldFBvc2l0aW9uKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmV2U3RvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBjID0gcHJldlN0b3AuZ2V0Q29sb3IoKS5jbG9uZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5leHRTdG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIGMgPSBuZXh0U3RvcC5nZXRDb2xvcigpLmNsb25lKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRkU3RvcChwb3NpdGlvbiwgYyk7CisgICAgfQorCisgICAgcHVibGljIEdyYWRpZW50U3RvcCBhZGRTdG9wKGZsb2F0IHBvc2l0aW9uLCBNYXR0ZSBjb2xvcikgeworICAgICAgICBHcmFkaWVudFN0b3AgcyA9IG5ldyBHcmFkaWVudFN0b3AocG9zaXRpb24sIGNvbG9yKTsKKyAgICAgICAgcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHN0b3BMaXN0ZW5lcik7CisgICAgICAgIExpc3Q8R3JhZGllbnRTdG9wPiBvbGQgPSBuZXcgQXJyYXlMaXN0PEdyYWRpZW50U3RvcD4oc3RvcHMpOworICAgICAgICBQYWludCBvbGRwID0gZ2V0UGFpbnQoKTsKKyAgICAgICAgc3RvcHMuYWRkKHMpOworICAgICAgICByZXNvcnRNb2RlbChmYWxzZSk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgic3RvcHMiLCBvbGQsIGdldFN0b3BzKCkpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInBhaW50Iiwgb2xkcCwgZ2V0UGFpbnQoKSk7CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIEdyYWRpZW50U3RvcCByZW1vdmVTdG9wKEdyYWRpZW50U3RvcCBzKSB7CisgICAgICAgIExpc3Q8R3JhZGllbnRTdG9wPiBvbGQgPSBuZXcgQXJyYXlMaXN0PEdyYWRpZW50U3RvcD4oc3RvcHMpOworICAgICAgICBQYWludCBvbGRwID0gZ2V0UGFpbnQoKTsKKyAgICAgICAgc3RvcHMucmVtb3ZlKHMpOworICAgICAgICBzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoc3RvcExpc3RlbmVyKTsKKyAgICAgICAgcmVzb3J0TW9kZWwoZmFsc2UpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInN0b3BzIiwgb2xkLCBnZXRTdG9wcygpKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwYWludCIsIG9sZHAsIGdldFBhaW50KCkpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFBhaW50IGdldFBhaW50KCkgeworICAgICAgICBpZiAoc3RvcHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy90aGVyZSBhcmUgc3RvcHMuc2l6ZSgpIG51bWJlciBvZiBtYWluIHN0b3BzLiBCZXR3ZWVuIGVhY2ggaXMKKyAgICAgICAgLy9hIGZyYWN0aW9uYWwgc3RvcC4gVGh1cywgdGhlcmUgYXJlOgorICAgICAgICAvL3N0b3BzLnNpemUoKSArIHN0b3BzLnNpemUoKSAtIDEKKyAgICAgICAgLy9udW1iZXIgb2YgZnJhY3Rpb25zIGFuZCBjb2xvcnMuCisKKyAgICAgICAgZmxvYXRbXSBmcmFjdGlvbnMgPSBuZXcgZmxvYXRbc3RvcHMuc2l6ZSgpICsgc3RvcHMuc2l6ZSgpIC0gMV07CisgICAgICAgIE1hdHRlW10gY29sb3JzID0gbmV3IE1hdHRlW2ZyYWN0aW9ucy5sZW5ndGhdOworCisgICAgICAgIC8vZm9yIGVhY2ggc3RvcCwgY3JlYXRlIHRoZSBzdG9wIGFuZCBpdCdzIGFzc29jaWF0ZWQgZnJhY3Rpb24KKyAgICAgICAgaW50IGluZGV4ID0gMDsgLy8gdGhlIGluZGV4IGludG8gZnJhY3Rpb25zIGFuZCBjb2xvcnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9wcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgR3JhZGllbnRTdG9wIHMgPSBzdG9wcy5nZXQoaSk7CisgICAgICAgICAgICAvL2NvcHkgb3ZlciB0aGUgc3RvcCdzIGRhdGEKKyAgICAgICAgICAgIGNvbG9yc1tpbmRleF0gPSBzLmdldENvbG9yKCk7CisgICAgICAgICAgICBmcmFjdGlvbnNbaW5kZXhdID0gcy5nZXRQb3NpdGlvbigpOworCisgICAgICAgICAgICAvL0lmIHRoaXMgaXNuJ3QgdGhlIGxhc3Qgc3RvcCwgdGhlbiBhZGQgaW4gdGhlIGZyYWN0aW9uCisgICAgICAgICAgICBpZiAoaW5kZXggPCBmcmFjdGlvbnMubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAgIGZsb2F0IGYxID0gcy5nZXRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIGZsb2F0IGYyID0gc3RvcHMuZ2V0KGkgKyAxKS5nZXRQb3NpdGlvbigpOworCisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbnNbaW5kZXhdID0gZjEgKyAoZjIgLSBmMSkgKiBzLmdldE1pZHBvaW50KCk7CisgICAgICAgICAgICAgICAgY29sb3JzW2luZGV4XSA9IGludGVycG9sYXRlKGNvbG9yc1tpbmRleCAtIDFdLCBzdG9wcy5nZXQoaSArIDEpLmdldENvbG9yKCksIC41Zik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGZyYWN0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy90byBhdm9pZCBhbiBlcnJvciB3aXRoIExpbmVhckdyYWRpZW50UGFpbnQgd2hlcmUgdHdvIGZyYWN0aW9ucworICAgICAgICAgICAgLy9hcmUgaWRlbnRpY2FsLCBidW1wIHVwIHRoZSBmcmFjdGlvbiB2YWx1ZSBieSBhIG1pbmlzY3VsZSBhbW91bnQKKyAgICAgICAgICAgIC8vaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91cyBvbmUKKyAgICAgICAgICAgIC8vTk9URTogVGhlIDw9IGlzIGNyaXRpY2FsIGJlY2F1c2UgdGhlIHByZXZpb3VzIHZhbHVlIG1heSBhbHJlYWR5CisgICAgICAgICAgICAvL2hhdmUgYmVlbiBidW1wZWQgdXAKKyAgICAgICAgICAgIGlmIChmcmFjdGlvbnNbaV0gPD0gZnJhY3Rpb25zW2kgLSAxXSkgeworICAgICAgICAgICAgICAgIGZyYWN0aW9uc1tpXSA9IGZyYWN0aW9uc1tpIC0gMV0gKyAuMDAwMDAxZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vYW5vdGhlciBib3VuZGFyeSBjb25kaXRpb24gd2hlcmUgbXVsdGlwbGUgc3RvcHMgYXJlIGFsbCBhdCB0aGUgZW5kLiBUaGUKKyAgICAgICAgLy9wcmV2aW91cyBsb29wIGJ1bXBlZCBhbGwgYnV0IG9uZSBvZiB0aGVzZSBwYXN0IDEuMCwgd2hpY2ggaXMgYmFkLgorICAgICAgICAvL3NvIHJlbW92ZSBhbnkgZnJhY3Rpb25zIChhbmQgdGhlaXIgY29sb3JzISkgdGhhdCBhcmUgYmV5b25kIDEuMAorICAgICAgICBpbnQgb3V0T2ZCb3VuZHNJbmRleCA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWN0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZyYWN0aW9uc1tpXSA+IDEpIHsKKyAgICAgICAgICAgICAgICBvdXRPZkJvdW5kc0luZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRPZkJvdW5kc0luZGV4ID49IDApIHsKKyAgICAgICAgICAgIGZsb2F0W10gZiA9IGZyYWN0aW9uczsKKyAgICAgICAgICAgIE1hdHRlW10gYyA9IGNvbG9yczsKKyAgICAgICAgICAgIGZyYWN0aW9ucyA9IG5ldyBmbG9hdFtvdXRPZkJvdW5kc0luZGV4XTsKKyAgICAgICAgICAgIGNvbG9ycyA9IG5ldyBNYXR0ZVtvdXRPZkJvdW5kc0luZGV4XTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZiwgMCwgZnJhY3Rpb25zLCAwLCBvdXRPZkJvdW5kc0luZGV4KTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYywgMCwgY29sb3JzLCAwLCBvdXRPZkJvdW5kc0luZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjcmVhdGVQYWludChmcmFjdGlvbnMsIGNvbG9ycywgY3ljbGVNZXRob2QpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQYWludCBjcmVhdGVQYWludChmbG9hdFtdIGZyYWN0aW9ucywgTWF0dGVbXSBjb2xvcnMsIEN5Y2xlTWV0aG9kIG1ldGhvZCk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIE1hdHRlIGludGVycG9sYXRlKE1hdHRlIHYwLCBNYXR0ZSB2MSwgZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXR0ZShpbnRlcnBvbGF0ZSh2MC5nZXRDb2xvcigpLCB2MS5nZXRDb2xvcigpLCBmcmFjdGlvbiksIHYwLmdldFVpRGVmYXVsdHMoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBDb2xvciBpbnRlcnBvbGF0ZShDb2xvciB2MCwgQ29sb3IgdjEsIGZsb2F0IGZyYWN0aW9uKSB7CisgICAgICAgIGludCByID0gdjAuZ2V0UmVkKCkgKworICAgICAgICAgICAgICAgIChpbnQpICgodjEuZ2V0UmVkKCkgLSB2MC5nZXRSZWQoKSkgKiBmcmFjdGlvbiArIDAuNWYpOworICAgICAgICBpbnQgZyA9IHYwLmdldEdyZWVuKCkgKworICAgICAgICAgICAgICAgIChpbnQpICgodjEuZ2V0R3JlZW4oKSAtIHYwLmdldEdyZWVuKCkpICogZnJhY3Rpb24gKyAwLjVmKTsKKyAgICAgICAgaW50IGIgPSB2MC5nZXRCbHVlKCkgKworICAgICAgICAgICAgICAgIChpbnQpICgodjEuZ2V0Qmx1ZSgpIC0gdjAuZ2V0Qmx1ZSgpKSAqIGZyYWN0aW9uICsgMC41Zik7CisgICAgICAgIGludCBhID0gdjAuZ2V0QWxwaGEoKSArCisgICAgICAgICAgICAgICAgKGludCkgKCh2MS5nZXRBbHBoYSgpIC0gdjAuZ2V0QWxwaGEoKSkgKiBmcmFjdGlvbiArIDAuNWYpOworICAgICAgICByZXR1cm4gbmV3IENvbG9yKHIsIGcsIGIsIGEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvR3JhZGllbnQuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvR3JhZGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIzOWVkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9wYWludC9HcmFkaWVudC5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5wYWludDsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkxpbmVhckdyYWRpZW50UGFpbnQ7CitpbXBvcnQgamF2YS5hd3QuTXVsdGlwbGVHcmFkaWVudFBhaW50LkN5Y2xlTWV0aG9kOworaW1wb3J0IGphdmEuYXd0LlBhaW50OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBHcmFkaWVudFBhaW50IG9yIExpbmVhckdyYWRpZW50UGFpbnQuCisgKgorICogQGF1dGhvciByYmFpcgorICovCitwdWJsaWMgY2xhc3MgR3JhZGllbnQgZXh0ZW5kcyBBYnN0cmFjdEdyYWRpZW50IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKyAgICBwcm90ZWN0ZWQgUGFpbnQgY3JlYXRlUGFpbnQoZmxvYXRbXSBmcmFjdGlvbnMsIE1hdHRlW10gbWF0dGVzLCBDeWNsZU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgQ29sb3JbXSBjb2xvcnMgPSBuZXcgQ29sb3JbbWF0dGVzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2xvcnNbaV0gPSBtYXR0ZXNbaV0uZ2V0Q29sb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IExpbmVhckdyYWRpZW50UGFpbnQoMCwgMCwgMSwgMCwgZnJhY3Rpb25zLCBjb2xvcnMsIG1ldGhvZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBHcmFkaWVudCBjbG9uZSgpIHsKKyAgICAgICAgR3JhZGllbnQgZ3JhZGllbnQgPSBuZXcgR3JhZGllbnQoKTsKKyAgICAgICAgY29weVRvKGdyYWRpZW50KTsKKyAgICAgICAgcmV0dXJuIGdyYWRpZW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvR3JhZGllbnRTdG9wLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL3BhaW50L0dyYWRpZW50U3RvcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NjJmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL3BhaW50L0dyYWRpZW50U3RvcC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQ7CisKK2ltcG9ydCBvcmcuamRlc2t0b3AuYmVhbnMuQWJzdHJhY3RCZWFuOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworLyoqIEVhY2ggc3RvcCBpcyBkZWZpbmVkIGxpbmVhcmx5LCBhdCBwb3NpdGlvbnMgYmV0d2VlbiAwIGFuZCAxLiAqLworcHVibGljIGZpbmFsIGNsYXNzIEdyYWRpZW50U3RvcCBleHRlbmRzIEFic3RyYWN0QmVhbiBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgcHJpdmF0ZSBmbG9hdCBwb3NpdGlvbjsKKyAgICBwcml2YXRlIE1hdHRlIGNvbG9yOworICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBtYXR0ZUxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImNvbG9yIiwgbnVsbCwgY29sb3IpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBtaWRwb2ludCB0byB0aGUgcmlnaHQgb2YgdGhlIHN0b3AuIE11c3QgYmUgMCAmbHQ7PSBtaWRwb2ludCAmbHQ7PSAxLiBUaGUgbWlkcG9pbnQgdmFsdWUgb2YgdGhlIGxhc3QgU3RvcCBpcworICAgICAqIGlnbm9yZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtaWRwb2ludDsKKworICAgIHB1YmxpYyBHcmFkaWVudFN0b3AoKSB7fQorCisgICAgcHVibGljIEdyYWRpZW50U3RvcChmbG9hdCBwb3NpdGlvbiwgTWF0dGUgY29sb3IpIHsKKyAgICAgICAgaWYgKGNvbG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbG9yIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucG9zaXRpb24gPSBjbGFtcCgwLCAxLCBwb3NpdGlvbik7CisgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjsKKyAgICAgICAgdGhpcy5taWRwb2ludCA9IC41ZjsKKworICAgICAgICBpZiAodGhpcy5jb2xvciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvbG9yLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImNvbG9yIiwgbWF0dGVMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBHcmFkaWVudFN0b3AgY2xvbmUoKSB7CisgICAgICAgIEdyYWRpZW50U3RvcCBjbG9uZSA9IG5ldyBHcmFkaWVudFN0b3AodGhpcy5wb3NpdGlvbiwgdGhpcy5jb2xvci5jbG9uZSgpKTsKKyAgICAgICAgY2xvbmUubWlkcG9pbnQgPSBtaWRwb2ludDsKKyAgICAgICAgcmV0dXJuIGNsb25lOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFBvc2l0aW9uKGZsb2F0IHBvc2l0aW9uKSB7CisgICAgICAgIGZsb2F0IG9sZCA9IHRoaXMucG9zaXRpb247CisgICAgICAgIHRoaXMucG9zaXRpb24gPSBjbGFtcCgwLCAxLCBwb3NpdGlvbik7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicG9zaXRpb24iLCBvbGQsIHRoaXMucG9zaXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBNYXR0ZSBnZXRDb2xvcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbG9yOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENvbG9yKE1hdHRlIGMpIHsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29sb3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICBNYXR0ZSBvbGQgPSB0aGlzLmNvbG9yOworICAgICAgICBpZiAob2xkICE9IG51bGwpIG9sZC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG1hdHRlTGlzdGVuZXIpOworICAgICAgICB0aGlzLmNvbG9yID0gYzsKKyAgICAgICAgaWYgKHRoaXMuY29sb3IgIT0gbnVsbCkgdGhpcy5jb2xvci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG1hdHRlTGlzdGVuZXIpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImNvbG9yIiwgb2xkLCBjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRPcGFjaXR5KGludCBvcGFjaXR5KSB7CisgICAgICAgIGludCBvbGQgPSBnZXRPcGFjaXR5KCk7CisgICAgICAgIGNvbG9yLnNldEFscGhhKG9wYWNpdHkpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoIm9wYWNpdHkiLCBvbGQsIGdldE9wYWNpdHkoKSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXRPcGFjaXR5KCkgeworICAgICAgICByZXR1cm4gY29sb3IuZ2V0QWxwaGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0TWlkcG9pbnQoKSB7CisgICAgICAgIHJldHVybiBtaWRwb2ludDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRNaWRwb2ludChmbG9hdCBtaWRwb2ludCkgeworICAgICAgICBmbG9hdCBvbGQgPSB0aGlzLm1pZHBvaW50OworICAgICAgICB0aGlzLm1pZHBvaW50ID0gY2xhbXAoMCwgMSwgbWlkcG9pbnQpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoIm1pZHBvaW50Iiwgb2xkLCB0aGlzLm1pZHBvaW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGNsYW1wKGZsb2F0IGxvLCBmbG9hdCBoaSwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlIDwgbG8pIHsKKyAgICAgICAgICAgIHJldHVybiBsbzsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IGhpKSB7CisgICAgICAgICAgICByZXR1cm4gaGk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL3BhaW50L01hdHRlLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL3BhaW50L01hdHRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0OTA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvTWF0dGUuamF2YQpAQCAtMCwwICsxLDYxMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50OworCitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlscy5IYXNVSURlZmF1bHRzOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxpbmdDb250ZXh0OworCitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5QYWludDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworCisvKioKKyAqIFJlcHJlc2VudGluZyBhIHNpbmdsZSB1bmlmb3JtIGNvbG9yLiBCYXNpY2FsbHksIGl0IHJlcHJlc2VudHMgdGhlIGphdmEuYXd0LkNvbG9yLiBJdCBjYW4gZWl0aGVyIGJlIGFic29sdXRlIG9yCisgKiBkZXJpdmVkIGZyb20gYSBVSURlZmF1bHQgY29sb3IuCisgKgorICogQGF1dGhvciByYmFpciAmIGphc3BlciBwb3R0cworICovCitwdWJsaWMgY2xhc3MgTWF0dGUgZXh0ZW5kcyBQYWludE1vZGVsIGltcGxlbWVudHMgSGFzVUlEZWZhdWx0cyB7CisgICAgcHJpdmF0ZSBmbG9hdFtdIHRtcGYxID0gbmV3IGZsb2F0WzNdOworICAgIHByaXZhdGUgZmxvYXRbXSB0bXBmMiA9IG5ldyBmbG9hdFszXTsKKworICAgIHByaXZhdGUgaW50IHJlZDsKKyAgICBwcml2YXRlIGludCBncmVlbjsKKyAgICBwcml2YXRlIGludCBibHVlOworICAgIHByaXZhdGUgaW50IGFscGhhOworICAgIHByaXZhdGUgQ29sb3IgY2FjaGVkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSB1aSBkZWZhdWx0IGtleSB0byBkZXJpdmUgdGhpcyBjb2xvciBmcm9tLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVpRGVmYXVsdFBhcmVudE5hbWUgPSBudWxsOworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiZWFuIHByb3BlcnR5LCBvciBjbGllbnQgcHJvcGVydHksIG9uIHRoaXMgY29tcG9uZW50CisgICAgICogZnJvbSB3aGljaCB0byBleHRyYWN0IGEgY29sb3IgdXNlZCBmb3IgcGFpbnRpbmcuIFNvIGZvciBleGFtcGxlIHRoZSBjb2xvcgorICAgICAqIHVzZWQgaW4gYSBwYWludGVyIGNvdWxkIGJlIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50UHJvcGVydHlOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIGZsb2F0IGh1ZU9mZnNldCA9IDAsIHNhdHVyYXRpb25PZmZzZXQgPSAwLCBicmlnaHRuZXNzT2Zmc2V0ID0gMDsKKyAgICBwcml2YXRlIGludCBhbHBoYU9mZnNldCA9IDA7CisgICAgLyoqCisgICAgICogV2hlbiB0cnVlIHRoaXMgY29sb3Igd2lsbCBiZWNvbWUgYSBVSVJlc291cmNlIGluIHRoZSBVSU1hbmFnZXIgZGVmYXVsdHMKKyAgICAgKiB0YWJsZS4gSWYgZmFsc2UsIHRoZW4gaXQgd2lsbCBub3QgYmUgYSBVSVJlc291cmNlLiBUaGlzIGlzIHNvbWV0aW1lcworICAgICAqIHJlcXVpcmVkLCBzdWNoIGFzIHdpdGggY29sb3JzIGluc3RhbGxlZCBvbiByZW5kZXJlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVpUmVzb3VyY2UgPSB0cnVlOworCisgICAgLyoqIFRoaXMgaXMgYSBsb2NhbCBVSURlZmF1bHRzIHRoYXQgY29udGFpbnMgYWxsIHRoZSBVSURlZmF1bHRzIGluIHRoZSBNb2RlbC4gKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBVSURlZmF1bHRzIHVpRGVmYXVsdHMgPSBuZXcgVUlEZWZhdWx0cygpOworICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB1aURlZmF1bHRzQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgIGlmICh1aURlZmF1bHRQYXJlbnROYW1lICE9IG51bGwgJiYgdWlEZWZhdWx0UGFyZW50TmFtZS5lcXVhbHMoZXZ0LmdldFByb3BlcnR5TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUFSR0JGcm9tT2Zmc2V0cygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQ29uc3RydWN0b3JzCisKKyAgICAvKiogcHJvcGVjdGVkIGNvbnN0cnVjdG9yIGZvciBKSUJYICovCisgICAgcHJvdGVjdGVkIE1hdHRlKCkge30KKworICAgIHB1YmxpYyBNYXR0ZShDb2xvciBjLCBVSURlZmF1bHRzIHVpRGVmYXVsdHMpIHsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5yZWQgPSBjLmdldFJlZCgpOworICAgICAgICAgICAgdGhpcy5ncmVlbiA9IGMuZ2V0R3JlZW4oKTsKKyAgICAgICAgICAgIHRoaXMuYmx1ZSA9IGMuZ2V0Qmx1ZSgpOworICAgICAgICAgICAgdGhpcy5hbHBoYSA9IGMuZ2V0QWxwaGEoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRVaURlZmF1bHRzKHVpRGVmYXVsdHMpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gSklCWCBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSklCWCBhZnRlciBhbGwgZmllbGRzIGhhdmUgYmVlbiBzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBKSUJYIFVubWFyc2hhbGxpbmcgQ29udGV4dAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBvc3RTZXQoSVVubWFyc2hhbGxpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gd2FsayB1cCB0aWxsIHdlIGdldCBzeW50aCBtb2RlbAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHQuZ2V0U3RhY2tEZXB0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFN0YWNrT2JqZWN0KGkpIGluc3RhbmNlb2YgSGFzVUlEZWZhdWx0cykgeworICAgICAgICAgICAgICAgIFVJRGVmYXVsdHMgdWlEZWZhdWx0cyA9ICgoSGFzVUlEZWZhdWx0cykgY29udGV4dC5nZXRTdGFja09iamVjdChpKSkuZ2V0VWlEZWZhdWx0cygpOworICAgICAgICAgICAgICAgIGlmICh1aURlZmF1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0VWlEZWZhdWx0cyh1aURlZmF1bHRzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBNYXR0ZSBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgbWF0dGUgYW4gYWJzb2x1dGUgY29sb3Igb3QgZGVyaXZlZCBmcm9tIGEgcGFyZW50IHVpIGRlZmF1bHQKKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGFic29sdXRlIG5vdCB1aWRlZmF1bHQgZGVyaXZlZCBjb2xvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWJzb2x1dGUoKSB7CisgICAgICAgIHJldHVybiB1aURlZmF1bHRQYXJlbnROYW1lID09IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgbWF0dGUgdG8gYmUgdGhlIHNhbWUgYXMgPGNvZGU+c3JjTWF0dGU8L2NvZGU+IGFuZCBmaXJlIGFsbCB0aGUgY2hhbmdlIGV2ZW50cworICAgICAqCisgICAgICogQHBhcmFtIHNyY01hdHRlIHRoZSBtYXR0ZSB0byBjb3B5IHByb3BlcnRpZXMgZnJvbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHkoTWF0dGUgc3JjTWF0dGUpIHsKKyAgICAgICAgLy8ga2VlcCBvbGQgdmFsdWVzCisgICAgICAgIENvbG9yIG9sZENvbG9yID0gZ2V0Q29sb3IoKTsKKyAgICAgICAgU3RyaW5nIG9sZFBhcmVudE5hbWUgPSB1aURlZmF1bHRQYXJlbnROYW1lOworICAgICAgICBTdHJpbmcgb2xkQ29tcG9uZW50UHJvcGVydHlOYW1lID0gY29tcG9uZW50UHJvcGVydHlOYW1lOworICAgICAgICBib29sZWFuIG9sZFVpUmVzb3VyY2UgPSB1aVJlc291cmNlOworICAgICAgICBpbnQgb2xkUiA9IHJlZCwgb2xkRyA9IGdyZWVuLCBvbGRCID0gYmx1ZSwgb2xkQSA9IGFscGhhOworICAgICAgICBmbG9hdCBvbGRIID0gaHVlT2Zmc2V0LCBvbGRTID0gc2F0dXJhdGlvbk9mZnNldCwgb2xkQnIgPSBicmlnaHRuZXNzT2Zmc2V0OworICAgICAgICAvLyBzZXQgcHJvcGVydGllcworICAgICAgICBpZiAodWlSZXNvdXJjZSAhPSBzcmNNYXR0ZS51aVJlc291cmNlKSB7CisgICAgICAgICAgICB1aVJlc291cmNlID0gc3JjTWF0dGUudWlSZXNvdXJjZTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgidWlSZXNvdXJjZSIsIG9sZFVpUmVzb3VyY2UsIGlzVWlSZXNvdXJjZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVkICE9IHNyY01hdHRlLnJlZCkgeworICAgICAgICAgICAgcmVkID0gc3JjTWF0dGUucmVkOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJyZWQiLCBvbGRSLCBnZXRSZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdyZWVuICE9IHNyY01hdHRlLmdyZWVuKSB7CisgICAgICAgICAgICBncmVlbiA9IHNyY01hdHRlLmdyZWVuOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJncmVlbiIsIG9sZEcsIGdldEdyZWVuKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChibHVlICE9IHNyY01hdHRlLmJsdWUpIHsKKyAgICAgICAgICAgIGJsdWUgPSBzcmNNYXR0ZS5ibHVlOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJibHVlIiwgb2xkQiwgZ2V0Qmx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWxwaGEgIT0gc3JjTWF0dGUuYWxwaGEpIHsKKyAgICAgICAgICAgIGFscGhhID0gc3JjTWF0dGUuYWxwaGE7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImFscGhhIiwgb2xkQSwgZ2V0QWxwaGEoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGh1ZU9mZnNldCAhPSBzcmNNYXR0ZS5odWVPZmZzZXQpIHsKKyAgICAgICAgICAgIGh1ZU9mZnNldCA9IHNyY01hdHRlLmh1ZU9mZnNldDsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiaHVlT2Zmc2V0Iiwgb2xkSCwgZ2V0SHVlT2Zmc2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChzYXR1cmF0aW9uT2Zmc2V0ICE9IHNyY01hdHRlLnNhdHVyYXRpb25PZmZzZXQpIHsKKyAgICAgICAgICAgIHNhdHVyYXRpb25PZmZzZXQgPSBzcmNNYXR0ZS5zYXR1cmF0aW9uT2Zmc2V0OworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzYXR1cmF0aW9uT2Zmc2V0Iiwgb2xkUywgZ2V0U2F0dXJhdGlvbk9mZnNldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnJpZ2h0bmVzc09mZnNldCAhPSBzcmNNYXR0ZS5icmlnaHRuZXNzT2Zmc2V0KSB7CisgICAgICAgICAgICBicmlnaHRuZXNzT2Zmc2V0ID0gc3JjTWF0dGUuYnJpZ2h0bmVzc09mZnNldDsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYnJpZ2h0bmVzc09mZnNldCIsIG9sZEJyLCBnZXRCcmlnaHRuZXNzT2Zmc2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChhbHBoYU9mZnNldCAhPSBzcmNNYXR0ZS5hbHBoYU9mZnNldCkgeworICAgICAgICAgICAgYWxwaGFPZmZzZXQgPSBzcmNNYXR0ZS5hbHBoYU9mZnNldDsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYWxwaGFPZmZzZXQiLCBvbGRBLCBnZXRBbHBoYU9mZnNldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodWlEZWZhdWx0UGFyZW50TmFtZSAhPSBzcmNNYXR0ZS51aURlZmF1bHRQYXJlbnROYW1lKSB7CisgICAgICAgICAgICB1aURlZmF1bHRQYXJlbnROYW1lID0gc3JjTWF0dGUudWlEZWZhdWx0UGFyZW50TmFtZTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgidWlEZWZhdWx0UGFyZW50TmFtZSIsIG9sZFBhcmVudE5hbWUsIGdldFVpRGVmYXVsdFBhcmVudE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBvbmVudFByb3BlcnR5TmFtZSAhPSBzcmNNYXR0ZS5jb21wb25lbnRQcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudFByb3BlcnR5TmFtZSA9IHNyY01hdHRlLmNvbXBvbmVudFByb3BlcnR5TmFtZTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiY29tcG9uZW50UHJvcGVydHlOYW1lIiwgb2xkQ29tcG9uZW50UHJvcGVydHlOYW1lLCBnZXRDb21wb25lbnRQcm9wZXJ0eU5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVpRGVmYXVsdHMgIT0gc3JjTWF0dGUudWlEZWZhdWx0cykgeworICAgICAgICAgICAgc2V0VWlEZWZhdWx0cyhzcmNNYXR0ZS51aURlZmF1bHRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9sZENvbG9yLmVxdWFscyhzcmNNYXR0ZS5nZXRDb2xvcigpKSkgeworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwYWludCIsIG9sZENvbG9yLCBnZXRDb2xvcigpKTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiY29sb3IiLCBvbGRDb2xvciwgZ2V0Q29sb3IoKSk7CisgICAgICAgICAgICBmaXJlSFNCQ2hhbmdlKG9sZFIsIG9sZEcsIG9sZEIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBQYWludE1vZGVsIG1ldGhvZHMKKworICAgIHB1YmxpYyBQYWludENvbnRyb2xUeXBlIGdldFBhaW50Q29udHJvbFR5cGUoKSB7CisgICAgICAgIHJldHVybiBQYWludENvbnRyb2xUeXBlLm5vbmU7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBCZWFuIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbG9jYWwgVUlEZWZhdWx0cyB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgVUlEZWZhdWx0cyBpbiB0aGUgTW9kZWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBVSURlZmF1bHRzIGZvciB0aGUgbW9kZWwgdGhhdCBjb250YWlucyB0aGlzIE1hdHRlLCBjYW4gYmUgbnVsbCBpZiB0aGlzIE1hdHRlIGlzIG5vdCBwYXJ0IG9mIGEgYmlnZ2VyCisgICAgICogICAgICAgICBtb2RlbAorICAgICAqLworICAgIHB1YmxpYyBVSURlZmF1bHRzIGdldFVpRGVmYXVsdHMoKSB7CisgICAgICAgIHJldHVybiB1aURlZmF1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYWwgVUlEZWZhdWx0cyB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgVUlEZWZhdWx0cyBpbiB0aGUgTW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdWlEZWZhdWx0cyBUaGUgVUlEZWZhdWx0cyBmb3IgdGhlIG1vZGVsIHRoYXQgY29udGFpbnMgdGhpcyBNYXR0ZSwgY2FuIGJlIG51bGwgaWYgdGhpcyBNYXR0ZSBpcyBub3QgcGFydCBvZgorICAgICAqICAgICAgICAgICAgICAgICAgIGEgYmlnZ2VyIG1vZGVsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VWlEZWZhdWx0cyhVSURlZmF1bHRzIHVpRGVmYXVsdHMpIHsKKyAgICAgICAgaWYgKHVpRGVmYXVsdHMgIT0gdGhpcy51aURlZmF1bHRzKSB7CisgICAgICAgICAgICBVSURlZmF1bHRzIG9sZCA9IGdldFVpRGVmYXVsdHMoKTsKKyAgICAgICAgICAgIGlmIChvbGQgIT0gbnVsbCkgb2xkLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodWlEZWZhdWx0c0NoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgICAgIHRoaXMudWlEZWZhdWx0cyA9IHVpRGVmYXVsdHM7CisgICAgICAgICAgICBpZiAodWlEZWZhdWx0cyAhPSBudWxsKSB0aGlzLnVpRGVmYXVsdHMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih1aURlZmF1bHRzQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ1aURlZmF1bHRzIiwgb2xkLCBnZXRVaURlZmF1bHRzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIGlmIHRoZSB1aWRlZmF1bHQgY29sb3IgdGhhdCBpcyB0aGUgcGFyZW50IHRoYXQgdGhpcyBtYXR0ZSBpcyBkZXJpdmVkIGZyb20uIElmIG51bGwgdGhlbiB0aGlzIGlzIGEKKyAgICAgKiBhYnNvbHV0ZSBjb2xvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUGFyZW50IGNvbG9yIHVpIGRlZmF1bHQgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VWlEZWZhdWx0UGFyZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHVpRGVmYXVsdFBhcmVudE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIGlmIHRoZSB1aWRlZmF1bHQgY29sb3IgdGhhdCBpcyB0aGUgcGFyZW50IHRoYXQgdGhpcyBtYXR0ZSBpcyBkZXJpdmVkIGZyb20uIElmIG51bGwgdGhlbiB0aGlzIGlzIGEKKyAgICAgKiBhYnNvbHV0ZSBjb2xvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1aURlZmF1bHRQYXJlbnROYW1lIFBhcmVudCBjb2xvciB1aSBkZWZhdWx0IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVaURlZmF1bHRQYXJlbnROYW1lKFN0cmluZyB1aURlZmF1bHRQYXJlbnROYW1lKSB7CisgICAgICAgIFN0cmluZyBvbGQgPSBnZXRVaURlZmF1bHRQYXJlbnROYW1lKCk7CisgICAgICAgIHRoaXMudWlEZWZhdWx0UGFyZW50TmFtZSA9IHVpRGVmYXVsdFBhcmVudE5hbWU7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgidWlEZWZhdWx0UGFyZW50TmFtZSIsIG9sZCwgZ2V0VWlEZWZhdWx0UGFyZW50TmFtZSgpKTsKKyAgICAgICAgaWYgKGlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgLy8gcmVzZXQgb2Zmc2V0cworICAgICAgICAgICAgZmxvYXQgb2xkSCA9IGh1ZU9mZnNldCwgb2xkUyA9IHNhdHVyYXRpb25PZmZzZXQsIG9sZEIgPSBicmlnaHRuZXNzT2Zmc2V0OworICAgICAgICAgICAgaW50IG9sZEEgPSBhbHBoYU9mZnNldDsKKyAgICAgICAgICAgIGh1ZU9mZnNldCA9IDA7CisgICAgICAgICAgICBzYXR1cmF0aW9uT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJyaWdodG5lc3NPZmZzZXQgPSAwOworICAgICAgICAgICAgYWxwaGFPZmZzZXQgPSAwOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJodWVPZmZzZXQiLCBvbGRILCBnZXRIdWVPZmZzZXQoKSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNhdHVyYXRpb25PZmZzZXQiLCBvbGRTLCBnZXRTYXR1cmF0aW9uT2Zmc2V0KCkpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJicmlnaHRuZXNzT2Zmc2V0Iiwgb2xkQiwgZ2V0QnJpZ2h0bmVzc09mZnNldCgpKTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYWxwaGFPZmZzZXQiLCBvbGRBLCBnZXRBbHBoYU9mZnNldCgpKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVBUkdCRnJvbU9mZnNldHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSB0byB1c2UgZm9yIGV4dHJhY3RpbmcgdGhlIGNvbG9yIGZvciB3aGF0ZXZlciBjb21wb25lbnQKKyAgICAgKiBpcyBwYXNzZWQgdG8gdGhlIHBhaW50ZXIuIENhbiBiZSBhIGtleSBpbiBjbGllbnQgcHJvcGVydGllcy4gQ2FuIGJlIG51bGwuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRQcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIG9sZCA9IGNvbXBvbmVudFByb3BlcnR5TmFtZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJjb21wb25lbnRQcm9wZXJ0eU5hbWUiLCBvbGQsIGNvbXBvbmVudFByb3BlcnR5TmFtZSA9IG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGJlYW4gcHJvcGVydHksIG9yIGNsaWVudCBwcm9wZXJ0eSwgb24gdGhpcyBjb21wb25lbnQKKyAgICAgKiBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgYSBjb2xvciB1c2VkIGZvciBwYWludGluZy4gU28gZm9yIGV4YW1wbGUgdGhlIGNvbG9yCisgICAgICogdXNlZCBpbiBhIHBhaW50ZXIgY291bGQgYmUgdGhlIGJhY2tncm91bmQgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudFByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBjb2xvciBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYXMgYSBVSVJlc291cmNlIGluIFVJRGVmYXVsdHMKKyAgICAgKiBAcGFyYW0gYiB0cnVlIGlmIHRoZSBjb2xvciBzaG91bGQgYmUgYSB1aSByZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVpUmVzb3VyY2UoYm9vbGVhbiBiKSB7CisgICAgICAgIGJvb2xlYW4gb2xkID0gdWlSZXNvdXJjZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ1aVJlc291cmNlIiwgb2xkLCB1aVJlc291cmNlID0gYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBmYWxzZSB0aGlzIGNvbG9yIHdpbGwgYmVjb21lIGEgbm9uLVVJUmVzb3VyY2UgaW4gdGhlIFVJTWFuYWdlciBkZWZhdWx0cworICAgICAqIHRhYmxlLiBUaGlzIGlzIHNvbWV0aW1lcyByZXF1aXJlZCB0byBmb3JjZSBzd2luZyB0byB1c2UgdGhlIGdpdmVuIGNvbG9yLAorICAgICAqIHN1Y2ggYXMgd2l0aCByZW5kZXJlcnMuCisgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgY29sb3Igc2hvdWxkIG5vdCBiZSBhIHVpcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VpUmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiB1aVJlc291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRIdWVPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBodWVPZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SHVlT2Zmc2V0KGZsb2F0IGh1ZU9mZnNldCkgeworICAgICAgICBmbG9hdCBvbGQgPSBnZXRIdWVPZmZzZXQoKTsKKyAgICAgICAgdGhpcy5odWVPZmZzZXQgPSBodWVPZmZzZXQ7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiaHVlT2Zmc2V0Iiwgb2xkLCBnZXRIdWVPZmZzZXQoKSk7CisgICAgICAgIHVwZGF0ZUFSR0JGcm9tT2Zmc2V0cygpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRTYXR1cmF0aW9uT2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gc2F0dXJhdGlvbk9mZnNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTYXR1cmF0aW9uT2Zmc2V0KGZsb2F0IHNhdE9mZnNldCkgeworICAgICAgICBmbG9hdCBvbGQgPSBnZXRTYXR1cmF0aW9uT2Zmc2V0KCk7CisgICAgICAgIHRoaXMuc2F0dXJhdGlvbk9mZnNldCA9IHNhdE9mZnNldDsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzYXR1cmF0aW9uT2Zmc2V0Iiwgb2xkLCBnZXRTYXR1cmF0aW9uT2Zmc2V0KCkpOworICAgICAgICB1cGRhdGVBUkdCRnJvbU9mZnNldHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0QnJpZ2h0bmVzc09mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIGJyaWdodG5lc3NPZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QnJpZ2h0bmVzc09mZnNldChmbG9hdCBicmlnaHRPZmZzZXQpIHsKKyAgICAgICAgZmxvYXQgb2xkID0gZ2V0QnJpZ2h0bmVzc09mZnNldCgpOworICAgICAgICB0aGlzLmJyaWdodG5lc3NPZmZzZXQgPSBicmlnaHRPZmZzZXQ7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYnJpZ2h0bmVzc09mZnNldCIsIG9sZCwgZ2V0QnJpZ2h0bmVzc09mZnNldCgpKTsKKyAgICAgICAgdXBkYXRlQVJHQkZyb21PZmZzZXRzKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRBbHBoYU9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIGFscGhhT2Zmc2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFscGhhT2Zmc2V0KGludCBhbHBoYU9mZnNldCkgeworICAgICAgICBpbnQgb2xkID0gZ2V0QWxwaGFPZmZzZXQoKTsKKyAgICAgICAgdGhpcy5hbHBoYU9mZnNldCA9IGFscGhhT2Zmc2V0OworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImFscGhhT2Zmc2V0Iiwgb2xkLCBhbHBoYU9mZnNldCk7CisgICAgICAgIHVwZGF0ZUFSR0JGcm9tT2Zmc2V0cygpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0UmVkKGludCByZWQpIHsKKyAgICAgICAgcmVkID0gY2xhbXAocmVkKTsKKyAgICAgICAgaWYgKHRoaXMucmVkICE9IHJlZCkgeworICAgICAgICAgICAgQ29sb3Igb2xkID0gZ2V0Q29sb3IoKTsKKyAgICAgICAgICAgIGludCBvbGRyID0gdGhpcy5yZWQ7CisgICAgICAgICAgICB0aGlzLnJlZCA9IHJlZDsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnQiLCBvbGQsIGdldENvbG9yKCkpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJjb2xvciIsIG9sZCwgZ2V0Q29sb3IoKSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInJlZCIsIG9sZHIsIHJlZCk7CisgICAgICAgICAgICBmaXJlSFNCQ2hhbmdlKG9sZHIsIGdyZWVuLCBibHVlKTsKKyAgICAgICAgICAgIHVwZGF0ZU9mZnNldHNGcm9tQVJHQigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXRSZWQoKSB7CisgICAgICAgIHJldHVybiByZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JlZW4oaW50IGdyZWVuKSB7CisgICAgICAgIGdyZWVuID0gY2xhbXAoZ3JlZW4pOworICAgICAgICBpZiAodGhpcy5ncmVlbiAhPSBncmVlbikgeworICAgICAgICAgICAgQ29sb3Igb2xkID0gZ2V0Q29sb3IoKTsKKyAgICAgICAgICAgIGludCBvbGRnID0gdGhpcy5ncmVlbjsKKyAgICAgICAgICAgIHRoaXMuZ3JlZW4gPSBncmVlbjsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnQiLCBvbGQsIGdldENvbG9yKCkpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJjb2xvciIsIG9sZCwgZ2V0Q29sb3IoKSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImdyZWVuIiwgb2xkZywgZ3JlZW4pOworICAgICAgICAgICAgZmlyZUhTQkNoYW5nZShyZWQsIG9sZGcsIGJsdWUpOworICAgICAgICAgICAgdXBkYXRlT2Zmc2V0c0Zyb21BUkdCKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEdyZWVuKCkgeworICAgICAgICByZXR1cm4gZ3JlZW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZShpbnQgYmx1ZSkgeworICAgICAgICBibHVlID0gY2xhbXAoYmx1ZSk7CisgICAgICAgIGlmICh0aGlzLmJsdWUgIT0gYmx1ZSkgeworICAgICAgICAgICAgQ29sb3Igb2xkID0gZ2V0Q29sb3IoKTsKKyAgICAgICAgICAgIGludCBvbGRiID0gdGhpcy5ibHVlOworICAgICAgICAgICAgdGhpcy5ibHVlID0gYmx1ZTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnQiLCBvbGQsIGdldENvbG9yKCkpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJjb2xvciIsIG9sZCwgZ2V0Q29sb3IoKSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImJsdWUiLCBvbGRiLCBibHVlKTsKKyAgICAgICAgICAgIGZpcmVIU0JDaGFuZ2UocmVkLCBncmVlbiwgb2xkYik7CisgICAgICAgICAgICB1cGRhdGVPZmZzZXRzRnJvbUFSR0IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Qmx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGJsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWxwaGEoaW50IGFscGhhKSB7CisgICAgICAgIGFscGhhID0gY2xhbXAoYWxwaGEpOworICAgICAgICBpZiAodGhpcy5hbHBoYSAhPSBhbHBoYSkgeworICAgICAgICAgICAgaW50IG9sZCA9IGdldEFscGhhKCk7CisgICAgICAgICAgICB0aGlzLmFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImFscGhhIiwgb2xkLCBhbHBoYSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInBhaW50Iiwgb2xkLCBnZXRDb2xvcigpKTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiY29sb3IiLCBvbGQsIGdldENvbG9yKCkpOworICAgICAgICAgICAgdXBkYXRlT2Zmc2V0c0Zyb21BUkdCKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEFscGhhKCkgeworICAgICAgICByZXR1cm4gYWxwaGE7CisgICAgfQorCisgICAgcHVibGljIENvbG9yIGdldENvbG9yKCkgeworICAgICAgICBpZiAoY2FjaGVkID09IG51bGwgfHwgcmVkICE9IGNhY2hlZC5nZXRSZWQoKSB8fCBncmVlbiAhPSBjYWNoZWQuZ2V0R3JlZW4oKSB8fAorICAgICAgICAgICAgICAgIGJsdWUgIT0gY2FjaGVkLmdldEJsdWUoKSB8fCBhbHBoYSAhPSBjYWNoZWQuZ2V0QWxwaGEoKSkgeworICAgICAgICAgICAgY2FjaGVkID0gbmV3IENvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FjaGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKENvbG9yIGMpIHsKKyAgICAgICAgc2V0Q29sb3IoYywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKENvbG9yIGMsIGJvb2xlYW4gZG9udFNldEFscGhhKSB7CisgICAgICAgIENvbG9yIG9sZENvbG9yID0gZ2V0Q29sb3IoKTsKKyAgICAgICAgaW50IG9sZFIgPSByZWQsIG9sZEcgPSBncmVlbiwgb2xkQiA9IGJsdWUsIG9sZEEgPSBhbHBoYTsKKyAgICAgICAgY2FjaGVkID0gYzsKKyAgICAgICAgcmVkID0gYy5nZXRSZWQoKTsKKyAgICAgICAgZ3JlZW4gPSBjLmdldEdyZWVuKCk7CisgICAgICAgIGJsdWUgPSBjLmdldEJsdWUoKTsKKyAgICAgICAgaWYgKCFkb250U2V0QWxwaGEpIGFscGhhID0gYy5nZXRBbHBoYSgpOworICAgICAgICB1cGRhdGVPZmZzZXRzRnJvbUFSR0IoKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJyZWQiLCBvbGRSLCBnZXRSZWQoKSk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZ3JlZW4iLCBvbGRHLCBnZXRHcmVlbigpKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJibHVlIiwgb2xkQiwgZ2V0Qmx1ZSgpKTsKKyAgICAgICAgZmlyZUhTQkNoYW5nZShvbGRSLCBvbGRHLCBvbGRCKTsKKyAgICAgICAgaWYgKCFkb250U2V0QWxwaGEpIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYWxwaGEiLCBvbGRBLCBnZXRBbHBoYSgpKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwYWludCIsIG9sZENvbG9yLCBnZXRDb2xvcigpKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJjb2xvciIsIG9sZENvbG9yLCBnZXRDb2xvcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFBhaW50IGdldFBhaW50KCkgeworICAgICAgICByZXR1cm4gZ2V0Q29sb3IoKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBpZiAoaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTWF0dGUuY2xhc3MuZ2V0TmFtZSgpICsgIltyPSIgKyByZWQgKyAiLCBnPSIgKyBncmVlbiArICIsIGI9IiArIGJsdWUgKyAiLCBhPSIgKyBhbHBoYSArICJdIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBNYXR0ZS5jbGFzcy5nZXROYW1lKCkgKyAiW2Jhc2U9IiArIHVpRGVmYXVsdFBhcmVudE5hbWUgKyAiLCBIKyIgKyBodWVPZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAiLCBTKyIgKyBzYXR1cmF0aW9uT2Zmc2V0ICsgIiwgQisiICsgYnJpZ2h0bmVzc09mZnNldCArICIsIEErIiArIGFscGhhT2Zmc2V0ICsgIl0iOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIE1hdHRlIG1hdHRlID0gKE1hdHRlKSBvOworICAgICAgICBpZiAoYWxwaGEgIT0gbWF0dGUuYWxwaGEpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGFscGhhT2Zmc2V0ICE9IG1hdHRlLmFscGhhT2Zmc2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGbG9hdC5jb21wYXJlKG1hdHRlLmFscGhhLCBhbHBoYSkgIT0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoYmx1ZSAhPSBtYXR0ZS5ibHVlKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGbG9hdC5jb21wYXJlKG1hdHRlLmJyaWdodG5lc3NPZmZzZXQsIGJyaWdodG5lc3NPZmZzZXQpICE9IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChncmVlbiAhPSBtYXR0ZS5ncmVlbikgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmxvYXQuY29tcGFyZShtYXR0ZS5odWVPZmZzZXQsIGh1ZU9mZnNldCkgIT0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocmVkICE9IG1hdHRlLnJlZCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodWlSZXNvdXJjZSAhPSBtYXR0ZS51aVJlc291cmNlKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGbG9hdC5jb21wYXJlKG1hdHRlLnNhdHVyYXRpb25PZmZzZXQsIHNhdHVyYXRpb25PZmZzZXQpICE9IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjb21wb25lbnRQcm9wZXJ0eU5hbWUgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgIWNvbXBvbmVudFByb3BlcnR5TmFtZS5lcXVhbHMoY29tcG9uZW50UHJvcGVydHlOYW1lKSA6CisgICAgICAgICAgICAgICAgbWF0dGUuY29tcG9uZW50UHJvcGVydHlOYW1lICE9IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAodWlEZWZhdWx0UGFyZW50TmFtZSAhPSBudWxsID8KKyAgICAgICAgICAgICAgICAhdWlEZWZhdWx0UGFyZW50TmFtZS5lcXVhbHMobWF0dGUudWlEZWZhdWx0UGFyZW50TmFtZSkgOgorICAgICAgICAgICAgICAgIG1hdHRlLnVpRGVmYXVsdFBhcmVudE5hbWUgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICByZXN1bHQgPSByZWQ7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZ3JlZW47CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgYmx1ZTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBhbHBoYTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAodWlEZWZhdWx0UGFyZW50TmFtZSAhPSBudWxsID8KKyAgICAgICAgICAgIHVpRGVmYXVsdFBhcmVudE5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChjb21wb25lbnRQcm9wZXJ0eU5hbWUgIT0gbnVsbCA/CisgICAgICAgICAgICBjb21wb25lbnRQcm9wZXJ0eU5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGh1ZU9mZnNldCAhPSArMC4wZiA/CisgICAgICAgICAgICBGbG9hdC5mbG9hdFRvSW50Qml0cyhodWVPZmZzZXQpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBzYXR1cmF0aW9uT2Zmc2V0ICE9ICswLjBmID8KKyAgICAgICAgICAgIEZsb2F0LmZsb2F0VG9JbnRCaXRzKHNhdHVyYXRpb25PZmZzZXQpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBicmlnaHRuZXNzT2Zmc2V0ICE9ICswLjBmID8KKyAgICAgICAgICAgIEZsb2F0LmZsb2F0VG9JbnRCaXRzKGJyaWdodG5lc3NPZmZzZXQpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAodWlSZXNvdXJjZSA/IDEgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIE1hdHRlIGNsb25lKCkgeworICAgICAgICBNYXR0ZSBtID0gbmV3IE1hdHRlKCk7CisgICAgICAgIG0ucmVkID0gcmVkOworICAgICAgICBtLmdyZWVuID0gZ3JlZW47CisgICAgICAgIG0uYmx1ZSA9IGJsdWU7CisgICAgICAgIG0uYWxwaGEgPSBhbHBoYTsKKyAgICAgICAgbS5icmlnaHRuZXNzT2Zmc2V0ID0gYnJpZ2h0bmVzc09mZnNldDsKKyAgICAgICAgbS5odWVPZmZzZXQgPSBodWVPZmZzZXQ7CisgICAgICAgIG0uc2F0dXJhdGlvbk9mZnNldCA9IHNhdHVyYXRpb25PZmZzZXQ7CisgICAgICAgIG0uYWxwaGFPZmZzZXQgPSBhbHBoYU9mZnNldDsKKyAgICAgICAgbS51aURlZmF1bHRQYXJlbnROYW1lID0gdWlEZWZhdWx0UGFyZW50TmFtZTsKKyAgICAgICAgbS5jb21wb25lbnRQcm9wZXJ0eU5hbWUgPSBjb21wb25lbnRQcm9wZXJ0eU5hbWU7CisgICAgICAgIG0udWlSZXNvdXJjZSA9IHVpUmVzb3VyY2U7CisgICAgICAgIG0uc2V0VWlEZWZhdWx0cyh1aURlZmF1bHRzKTsKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzCisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlT2Zmc2V0c0Zyb21BUkdCKCkgeworICAgICAgICBpZiAoIWlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgdG1wZjEgPSBDb2xvci5SR0J0b0hTQihyZWQsIGdyZWVuLCBibHVlLCB0bXBmMSk7CisgICAgICAgICAgICBDb2xvciBwYXJlbnRDb2xvciA9IHVpRGVmYXVsdHMuZ2V0Q29sb3IodWlEZWZhdWx0UGFyZW50TmFtZSk7CisgICAgICAgICAgICB0bXBmMiA9IENvbG9yLlJHQnRvSFNCKHBhcmVudENvbG9yLmdldFJlZCgpLCBwYXJlbnRDb2xvci5nZXRHcmVlbigpLCBwYXJlbnRDb2xvci5nZXRCbHVlKCksIHRtcGYyKTsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBvZmZzZXQgcHJvcGVydGllcyBhbmQgZmlyZSBldmVudHMKKyAgICAgICAgICAgIGZsb2F0IG9sZEggPSBodWVPZmZzZXQsIG9sZFMgPSBzYXR1cmF0aW9uT2Zmc2V0LCBvbGRCID0gYnJpZ2h0bmVzc09mZnNldDsKKyAgICAgICAgICAgIGludCBvbGRBID0gYWxwaGFPZmZzZXQ7CisgICAgICAgICAgICBodWVPZmZzZXQgPSB0bXBmMVswXSAtIHRtcGYyWzBdOworICAgICAgICAgICAgc2F0dXJhdGlvbk9mZnNldCA9IHRtcGYxWzFdIC0gdG1wZjJbMV07CisgICAgICAgICAgICBicmlnaHRuZXNzT2Zmc2V0ID0gdG1wZjFbMl0gLSB0bXBmMlsyXTsKKyAgICAgICAgICAgIGFscGhhT2Zmc2V0ID0gYWxwaGEgLSBwYXJlbnRDb2xvci5nZXRBbHBoYSgpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJodWVPZmZzZXQiLCBvbGRILCBnZXRIdWVPZmZzZXQoKSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInNhdHVyYXRpb25PZmZzZXQiLCBvbGRTLCBnZXRTYXR1cmF0aW9uT2Zmc2V0KCkpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJicmlnaHRuZXNzT2Zmc2V0Iiwgb2xkQiwgZ2V0QnJpZ2h0bmVzc09mZnNldCgpKTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYWxwaGFPZmZzZXQiLCBvbGRBLCBnZXRBbHBoYU9mZnNldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBUkdCRnJvbU9mZnNldHMoKSB7CisgICAgICAgIGlmICghaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBDb2xvciBvbGRDb2xvciA9IGdldENvbG9yKCk7CisgICAgICAgICAgICAvLyBnZXQgcGFyZW50IGNvbG9yIEhTQgorICAgICAgICAgICAgQ29sb3IgcGFyZW50Q29sb3IgPSB1aURlZmF1bHRzLmdldENvbG9yKHVpRGVmYXVsdFBhcmVudE5hbWUpOworICAgICAgICAgICAgdG1wZjEgPSBDb2xvci5SR0J0b0hTQihwYXJlbnRDb2xvci5nZXRSZWQoKSwgcGFyZW50Q29sb3IuZ2V0R3JlZW4oKSwgcGFyZW50Q29sb3IuZ2V0Qmx1ZSgpLCB0bXBmMSk7CisgICAgICAgICAgICAvLyBhcHBseSBvZmZzZXRzCisgICAgICAgICAgICB0bXBmMVswXSA9IGNsYW1wKHRtcGYxWzBdICsgaHVlT2Zmc2V0KTsKKyAgICAgICAgICAgIHRtcGYxWzFdID0gY2xhbXAodG1wZjFbMV0gKyBzYXR1cmF0aW9uT2Zmc2V0KTsKKyAgICAgICAgICAgIHRtcGYxWzJdID0gY2xhbXAodG1wZjFbMl0gKyBicmlnaHRuZXNzT2Zmc2V0KTsKKyAgICAgICAgICAgIGludCBvbGRBID0gZ2V0QWxwaGEoKTsKKyAgICAgICAgICAgIGFscGhhID0gY2xhbXAocGFyZW50Q29sb3IuZ2V0QWxwaGEoKSArIGFscGhhT2Zmc2V0KTsKKyAgICAgICAgICAgIHVwZGF0ZVJHQih0bXBmMSk7CisgICAgICAgICAgICAvLyB1cGRhdGUgZmlyZSBldmVudHMKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYWxwaGEiLCBvbGRBLCBnZXRBbHBoYSgpKTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnQiLCBvbGRDb2xvciwgZ2V0Q29sb3IoKSk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImNvbG9yIiwgb2xkQ29sb3IsIGdldENvbG9yKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJHQihmbG9hdFtdIGhzYikgeworICAgICAgICBpbnQgb2xkUiA9IHJlZCwgb2xkRyA9IGdyZWVuLCBvbGRCID0gYmx1ZTsKKyAgICAgICAgaW50IHJnYiA9IENvbG9yLkhTQnRvUkdCKGhzYlswXSwgaHNiWzFdLCBoc2JbMl0pOworICAgICAgICByZWQgPSAocmdiID4+IDE2KSAmIDB4RkY7CisgICAgICAgIGdyZWVuID0gKHJnYiA+PiA4KSAmIDB4RkY7CisgICAgICAgIGJsdWUgPSByZ2IgJiAweEZGOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInJlZCIsIG9sZFIsIGdldFJlZCgpKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJncmVlbiIsIG9sZEcsIGdldEdyZWVuKCkpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImJsdWUiLCBvbGRCLCBnZXRCbHVlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaXJlSFNCQ2hhbmdlKGludCBvbGRSLCBpbnQgb2xkRywgaW50IG9sZEIpIHsKKyAgICAgICAgdG1wZjEgPSBDb2xvci5SR0J0b0hTQihvbGRSLCBvbGRHLCBvbGRCLCB0bXBmMSk7CisgICAgICAgIHRtcGYyID0gQ29sb3IuUkdCdG9IU0IocmVkLCBncmVlbiwgYmx1ZSwgdG1wZjIpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImh1ZSIsIHRtcGYxWzBdLCB0bXBmMlswXSk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgic2F0dXJhdGlvbiIsIHRtcGYxWzFdLCB0bXBmMlsxXSk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYnJpZ2h0bmVzcyIsIHRtcGYxWzJdLCB0bXBmMlsyXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmbG9hdCBjbGFtcChmbG9hdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiAxKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNsYW1wKGludCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiAyNTUpIHsKKyAgICAgICAgICAgIHZhbHVlID0gMjU1OworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL3BhaW50L1BhaW50TW9kZWwuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvUGFpbnRNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjY3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL3BhaW50L1BhaW50TW9kZWwuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQ7CisKK2ltcG9ydCBvcmcuamRlc2t0b3AuYmVhbnMuQWJzdHJhY3RCZWFuOworCitpbXBvcnQgamF2YS5hd3QuUGFpbnQ7CisKKy8qKgorICogSSdkIGhhdmUganVzdCBjYWxsZWQgaXQgUGFpbnQsIGJ1dCBzYWRseSwgdGhhdCBuYW1lIHdhcyBhbHJlYWR5IHRha2VuLCBhbmQgd291bGQgaGF2ZSBiZWVuIHRvbyBjb25mdXNpbmcuCisgKiA8cC8+CisgKiBXaGVuZXZlciBzaXplIG9yIHBvc2l0aW9uIHZhbHVlcyBhcmUgcmVxdWlyZWQgKGZvciBleGFtcGxlIHdpdGggVGV4dHVyZSBvciBHcmFkaWVudCksIHRoZXkgYXJlIHNwZWNpZmllZCBpbiB0aGUgdW5pdAorICogc3F1YXJlOiB0aGF0IGlzLCBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlLiBUaGV5IGNhbiB0aGVuIGxhdGVyIGJlIHNjYWxlZCBhcyBuZWNlc3NhcnkgYnkgYW55IHBhaW50aW5nIGNvZGUuCisgKgorICogQGF1dGhvciByYmFpcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFpbnRNb2RlbCBleHRlbmRzIEFic3RyYWN0QmVhbiBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgcHVibGljIHN0YXRpYyBlbnVtIFBhaW50Q29udHJvbFR5cGUgeworICAgICAgICBub25lLCBjb250cm9sX2xpbmUsIGNvbnRyb2xfcmVjdAorICAgIH0KKworICAgIHByb3RlY3RlZCBQYWludE1vZGVsKCkgeyB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIFBhaW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBQYWludE1vZGVsLiBUaGlzIGlzIG9mdGVuIG5vdCBhIHJldmVyc2FibGUgb3BlcmF0aW9uLAorICAgICAqICAgICAgICAgYW5kIGhlbmNlIHRoZXJlIGlzIG5vICJzZXRQYWludCIgbWV0aG9kLiBSYXRoZXIsIHR3ZWFraW5nIHRoZSBleHBvc2VkIHByb3BlcnRpZXMgb2YgdGhlIFBhaW50TW9kZWwgZmlyZXMsCisgICAgICogICAgICAgICB3aGVuIG5lY2Vzc2FyeSwgcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBmb3IgdGhlICJwYWludCIgcHJvcGVydHksIGFuZCByZXN1bHRzIGluIGRpZmZlcmVudCB2YWx1ZXMgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgIGZyb20gdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFBhaW50IGdldFBhaW50KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUgb2YgY29udHJvbHMgZm9yIHRoaXMgcGFpbnQgbW9kZWwKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGFpbnQgY29udHJvbHMsIG9uZSBvZiBQYWludENvbnRyb2xUeXBlLm5vbmUsIFBhaW50Q29udHJvbFR5cGUuY29udHJvbF9saW5lIG9yCisgICAgICogICAgICAgICBQYWludENvbnRyb2xUeXBlLmNvbnRyb2xfcmVjdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBQYWludENvbnRyb2xUeXBlIGdldFBhaW50Q29udHJvbFR5cGUoKTsKKworCisgICAgcHVibGljIGFic3RyYWN0IFBhaW50TW9kZWwgY2xvbmUoKTsKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvUmFkaWFsR3JhZGllbnQuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvcGFpbnQvUmFkaWFsR3JhZGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTY2MDkyCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9wYWludC9SYWRpYWxHcmFkaWVudC5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5wYWludDsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0Lk11bHRpcGxlR3JhZGllbnRQYWludC5DeWNsZU1ldGhvZDsKK2ltcG9ydCBqYXZhLmF3dC5QYWludDsKK2ltcG9ydCBqYXZhLmF3dC5SYWRpYWxHcmFkaWVudFBhaW50OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBSYWRpYWxHcmFkaWVudFBhaW50LgorICoKKyAqIEBhdXRob3IgcmJhaXIKKyAqLworcHVibGljIGNsYXNzIFJhZGlhbEdyYWRpZW50IGV4dGVuZHMgQWJzdHJhY3RHcmFkaWVudCB7CisgICAgcHJvdGVjdGVkIFBhaW50IGNyZWF0ZVBhaW50KGZsb2F0W10gZnJhY3Rpb25zLCBNYXR0ZVtdIG1hdHRlcywgQ3ljbGVNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIENvbG9yW10gY29sb3JzID0gbmV3IENvbG9yW21hdHRlcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29sb3JzW2ldID0gbWF0dGVzW2ldLmdldENvbG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSYWRpYWxHcmFkaWVudFBhaW50KC41ZiwgLjVmLCAxLCBmcmFjdGlvbnMsIGNvbG9ycywgbWV0aG9kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFJhZGlhbEdyYWRpZW50IGNsb25lKCkgeworICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgpOworICAgICAgICBjb3B5VG8oZ3JhZGllbnQpOworICAgICAgICByZXR1cm4gZ3JhZGllbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9wYWludC9UZXh0dXJlLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL3BhaW50L1RleHR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmQ0YjJhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci9wYWludC9UZXh0dXJlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50OworCitpbXBvcnQgamF2YS5hd3QuUGFpbnQ7CitpbXBvcnQgamF2YS5hd3QuVGV4dHVyZVBhaW50OworaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgVGV4dHVyZVBhaW50LgorICoKKyAqIEBhdXRob3IgcmJhaXIKKyAqLworcHVibGljIGNsYXNzIFRleHR1cmUgZXh0ZW5kcyBQYWludE1vZGVsIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0YW5nbGUyRCBSRUNUID0gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgwLCAwLCAxLCAxKTsKKyAgICBwcml2YXRlIEJ1ZmZlcmVkSW1hZ2UgaW1nOworCisgICAgcHVibGljIFRleHR1cmUoKSB7CisgICAgfQorCisgICAgcHVibGljIFBhaW50Q29udHJvbFR5cGUgZ2V0UGFpbnRDb250cm9sVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFBhaW50Q29udHJvbFR5cGUuY29udHJvbF9yZWN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlKEJ1ZmZlcmVkSW1hZ2UgaW1nKSB7CisgICAgICAgIEJ1ZmZlcmVkSW1hZ2Ugb2xkID0gdGhpcy5pbWc7CisgICAgICAgIHRoaXMuaW1nID0gaW1nOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInBhaW50Iiwgb2xkLCB0aGlzLmltZyk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiaW1hZ2UiLCBvbGQsIHRoaXMuaW1nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgQnVmZmVyZWRJbWFnZSBnZXRJbWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIGltZzsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFpbnQgZ2V0UGFpbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGV4dHVyZVBhaW50KGltZywgUkVDVCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgVGV4dHVyZSBjbG9uZSgpIHsKKyAgICAgICAgVGV4dHVyZSBuZXdUZXh0dXJlID0gbmV3IFRleHR1cmUoKTsKKyAgICAgICAgbmV3VGV4dHVyZS5pbWcgPSB0aGlzLmltZzsKKyAgICAgICAgcmV0dXJuIG5ld1RleHR1cmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci91dGlscy9IYXNQYXRoLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3dpbmd4L2Rlc2lnbmVyL3V0aWxzL0hhc1BhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQ1OWUxCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci91dGlscy9IYXNQYXRoLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnV0aWxzOworCisvKioKKyAqIEhhc1BhdGggLSBpbnRlcmZhY2UgZm9yIG1vZGVsIG5vZGVzIHRoYXQgY2FuIHByb3ZpZGUgdGhlcmUgcGF0aCBpbiB0aGUgdHJlZQorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1bCAyLCAyMDA3KQorICovCitwdWJsaWMgaW50ZXJmYWNlIEhhc1BhdGggeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpOworfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci91dGlscy9IYXNSZXNvdXJjZXMuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvdXRpbHMvSGFzUmVzb3VyY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmOWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvdXRpbHMvSGFzUmVzb3VyY2VzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnV0aWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIEhhc1Jlc291cmNlcyAtIGludGVyZmFjZSBmb3IgbW9kZWwgbm9kZXMgdGhhdCBoYXZlIHJlc291cmNlcworICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1bCAyLCAyMDA3KQorICovCitwdWJsaWMgaW50ZXJmYWNlIEhhc1Jlc291cmNlcyB7CisKKyAgICBwdWJsaWMgRmlsZSBnZXRSZXNvdXJjZXNEaXIoKTsKKworICAgIHB1YmxpYyBGaWxlIGdldEltYWdlc0RpcigpOworCisgICAgcHVibGljIEZpbGUgZ2V0VGVtcGxhdGVzRGlyKCk7CisKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvdXRpbHMvSGFzVUlEZWZhdWx0cy5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N3aW5neC9kZXNpZ25lci91dGlscy9IYXNVSURlZmF1bHRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3NGQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zd2luZ3gvZGVzaWduZXIvdXRpbHMvSGFzVUlEZWZhdWx0cy5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlsczsKKworaW1wb3J0IGphdmF4LnN3aW5nLlVJRGVmYXVsdHM7CisKKy8qKgorICogSGFzVUlEZWZhdWx0cyAtIEEgdGFnZ2luZyBpbnRlcmZhY2UgZm9yIGFueSBjbGFzcyB0aGF0IGhhcyBVSURlZmF1bHRzCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDIyLCAyMDA3KQorICovCitwdWJsaWMgaW50ZXJmYWNlIEhhc1VJRGVmYXVsdHMgeworICAgIHB1YmxpYyBVSURlZmF1bHRzIGdldFVpRGVmYXVsdHMoKTsKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9EZWZhdWx0c0dlbmVyYXRvci5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvZ2VuZXJhdG9yL0RlZmF1bHRzR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4Njg2YwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9EZWZhdWx0c0dlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvcjsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuQ2FudmFzOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZm9udC5UeXBlZmFjZTsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50Lk1hdHRlOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuUGFpbnRNb2RlbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuZ2VuZXJhdG9yLkdlbmVyYXRvclV0aWxzLm1ha2VQcmV0dHk7CitpbXBvcnQgc3RhdGljIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvci5HZW5lcmF0b3JVdGlscy50b0NvbnN0YW50TmFtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuZ2VuZXJhdG9yLk9iamVjdENvZGVDb252ZXJ0b3JzLmNvbnZlcnQ7CitpbXBvcnQgc3RhdGljIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvci5UZW1wbGF0ZVdyaXRlci5yZWFkOworaW1wb3J0IHN0YXRpYyBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5nZW5lcmF0b3IuVGVtcGxhdGVXcml0ZXIud3JpdGVTcmNGaWxlOworaW1wb3J0IG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuU3ludGhNb2RlbDsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJQ29tcG9uZW50OworaW1wb3J0IG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlGb250OworaW1wb3J0IG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlJY29uUmVnaW9uOworaW1wb3J0IG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlQYWludDsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJUHJvcGVydHk7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVJlZ2lvbjsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJU3RhdGU7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVN0YXRlVHlwZTsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJU3R5bGU7CisKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FdGNoZWRCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkxpbmVCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLk1hdHRlQm9yZGVyOworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuUGFpbnRlckJvcmRlcjsKKworLyoqCisgKiBEZWZhdWx0c0dlbmVyYXRvcgorICogPHAvPgorICogVGhlcmUgYXJlIHR3byBtYWluIHNldHMgb2YgZGVmYXVsdHMgdGhhdCBtdXN0IGJlIGNvbmZpZ3VyZWQuIFRoZSBmaXJzdCBpcworICogdGhlIGFjdHVhbCBVSSBkZWZhdWx0cyB0cmVlLiBUaGUgc2Vjb25kIGlzIGEgbWFwIG9mIGNvbXBvbmVudHMgKyByZWdpb25zLCB3aGljaAorICogYXJlIHVzZWQgdG8gZGVjaWRlIHdoYXQgU3ludGhTdHlsZSB0byB1c2UuCisgKgorICogQGF1dGhvciBKYXNwZXIgUG90dHMKKyAqIEBhdXRob3IgUmljaGFyZCBCYWlyCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0c0dlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRlVHlwZUltcGxUZW1wbGF0ZTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdGF0ZVR5cGVUZW1wbGF0ZSgpIHsKKyAgICAgICAgaWYgKHN0YXRlVHlwZUltcGxUZW1wbGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvL2xvYWQgdGhlIHBhaW50ZXIgdGVtcGxhdGUgZmlsZSBpbnRvIGFuIGluLW1lbW9yeSBzdHJpbmcgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQorICAgICAgICAgICAgLy93aGVuIGdlbmVyYXRpbmcgYSBsb3Qgb2YgY2xhc3NlcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdGF0ZVR5cGVJbXBsVGVtcGxhdGUgPSByZWFkKCJyZXNvdXJjZXMvU3RhdGVJbXBsLnRlbXBsYXRlIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gcmVhZCB0ZW1wbGF0ZSBmaWxlcy4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGVUeXBlSW1wbFRlbXBsYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBkZWZhdWx0cyBmaWxlIGFuZCBhbGwgcGFpbnRlciBmaWxlcyBmb3IgYSBTeW50aE1vZGVsLiBUaGlzIG1ldGhvZAorICAgICAqIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50LCBjYWxsZWQgYnkgdGhlIEdlbmVyYXRvciBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1aURlZmF1bHRJbml0ICAgICAgVGhlIGJ1ZmZlciB0byB3cml0ZSB1aSBkZWZhdWx0IHB1dCBtZXRob2RzIG9mIHRoZSBmb3JtIDxjb2RlPmQucHV0KCJhY3RpdmVDYXB0aW9uIiwgbmV3CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclVJUmVzb3VyY2UoMTIzLCA0NSwgMjAwKSk7PC9jb2RlPgorICAgICAqIEBwYXJhbSBzdHlsZUluaXQgICAgICAgICAgVGhlIGJ1ZmZlciB0byB3cml0ZSBvdXQgY29kZSB0byBnZW5lcmF0ZSBTeW50aCBTdHlsZSBwb3B1bGF0aW5nIHRoZSBzdHlsZXMgbWFwIDxjb2RlPm0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8S2V5LCBMYXp5U3R5bGU+KCk8L2NvZGU+CisgICAgICogQHBhcmFtIG1vZGVsICAgICAgICAgICAgICBUaGUgU3ludGggTW9kZWwgd2UgYXJlIHdyaXRpbmcgb3V0IGRlZmF1bHRzIGNsYXNzIGZvcgorICAgICAqIEBwYXJhbSB2YXJpYWJsZXMgICAgICAgICAgVGhlIHZhcmlhYmxlcyBtYXAgcHJlIHBvcHVsYXRlZCB3aXRoICJQQUNLQUdFIiBhbmQgIkxBRl9OQU1FIgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZVByZWZpeCAgVGhlIHBhY2thZ2UgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW50aCBsb29rIGFuZCBmZWVsLiBGb3IgZXhhbXBsZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5teXBhY2thZ2UubXlsYWYKKyAgICAgKiBAcGFyYW0gcGFpbnRlclBhY2thZ2VSb290IFRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgcGFpbnRlcnMgb3V0IHRvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRGVmYXVsdHMoU3RyaW5nQnVpbGRlciB1aURlZmF1bHRJbml0LCBTdHJpbmdCdWlsZGVyIHN0eWxlSW5pdCwgU3ludGhNb2RlbCBtb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcmlhYmxlcywgU3RyaW5nIHBhY2thZ2VOYW1lUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcGFpbnRlclBhY2thZ2VSb290KSB7CisgICAgICAgIC8vIHdyaXRlIGNvbG9yIHBhbGV0dGUKKyAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIiAgICAgICAgLy9Db2xvciBwYWxldHRlXG4iKTsKKyAgICAgICAgd3JpdGVDb2xvclBhbGV0dGUodWlEZWZhdWx0SW5pdCwgbW9kZWwuZ2V0Q29sb3JQYWxldHRlKCkpOworICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgLy8gd3JpdGUgZm9udHMgcGFsZXR0ZQorICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICAvL0ZvbnQgcGFsZXR0ZVxuIik7CisgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIGQucHV0KFwiZGVmYXVsdEZvbnRcIiwgbmV3IEZvbnRVSVJlc291cmNlKGRlZmF1bHRGb250KSk7XG4iKTsKKyAgICAgICAgd3JpdGVGb250UGFsZXR0ZSh1aURlZmF1bHRJbml0LCBtb2RlbC5nZXRGb250UGFsZXR0ZSgpKTsKKyAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIlxuIik7CisgICAgICAgIC8vIFRPRE86IE90aGVyIHBhbGV0dGVzCisgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIC8vQm9yZGVyIHBhbGV0dGVcbiIpOworICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgLy8gd3JpdGUgZ2xvYmFsIHN0eWxlCisgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIC8vVGhlIGdsb2JhbCBzdHlsZSBkZWZpbml0aW9uXG4iKTsKKyAgICAgICAgd3JpdGVTdHlsZShtb2RlbC5nZXRTdHlsZSgpLCB1aURlZmF1bHRJbml0LCAiIik7CisgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCJcbiIpOworICAgICAgICAvLyB3cml0ZSBjb21wb25lbnRzCisgICAgICAgIGZvciAoVUlDb21wb25lbnQgYyA6IG1vZGVsLmdldENvbXBvbmVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGVzY2FwZShjLmdldEtleSgpKTsKKyAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIC8vSW5pdGlhbGl6ZSAiKS5hcHBlbmQocHJlZml4KQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgd3JpdGVSZWdpb24oYywgYywgcHJlZml4LCB1aURlZmF1bHRJbml0LAorICAgICAgICAgICAgICAgICAgICBzdHlsZUluaXQsIHZhcmlhYmxlcywgcGFja2FnZU5hbWVQcmVmaXgsIHBhaW50ZXJQYWNrYWdlUm9vdCk7CisgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDb2xvclBhbGV0dGUoU3RyaW5nQnVpbGRlciB1aURlZmF1bHRJbml0LCBMaXN0PFVJUGFpbnQ+IGNvbG9ycykgeworICAgICAgICBmb3IgKFVJUGFpbnQgY29sb3IgOiBjb2xvcnMpIHsKKyAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIGQucHV0KFwiIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb2xvci5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiLCIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY29udmVydFBhaW50KGNvbG9yLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRm9udFBhbGV0dGUoU3RyaW5nQnVpbGRlciB1aURlZmF1bHRJbml0LCBMaXN0PFVJRm9udD4gZm9udHMpIHsKKyAgICAgICAgZm9yIChVSUZvbnQgZm9udCA6IGZvbnRzKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIG5vIHdheSBvZiBkb2luZyBDU1Mgc3R5bGUgZm9udCBsaXN0cyB5ZXQgc28gd2lsbCBqdXN0CisgICAgICAgICAgICAvLyBqdXN0IHRoZSBmaXJzdCBmb250CisgICAgICAgICAgICBpZiAoIWZvbnQuZ2V0Rm9udHMoKS5pc0VtcHR5KCkpeworICAgICAgICAgICAgICAgIFR5cGVmYWNlIHQgPSBmb250LmdldEZvbnRzKCkuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmICh0LmlzQWJzb2x1dGUoKSl7CisgICAgICAgICAgICAgICAgICAgIEZvbnQgZiA9IHQuZ2V0Rm9udCgpOworICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGZvbnQuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIG5ldyBqYXZheC5zd2luZy5wbGFmLkZvbnRVSVJlc291cmNlKFwiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZi5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiwgIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZi5nZXRTdHlsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChmLmdldFNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIikpO1xuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIiAgICAgICAgZC5wdXQoXCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChmb250LmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiLCBuZXcgRGVyaXZlZEZvbnQoXCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh0LmdldFVpRGVmYXVsdFBhcmVudE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiLCAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh0LmdldFNpemVPZmZzZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoImYsICIpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuZ2V0Qm9sZCgpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgidHJ1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPZmY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoImZhbHNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC5nZXRJdGFsaWMoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIm51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoInRydWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT2ZmOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCJmYWxzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIpKTtcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIG91dCB0aGUgVUlEZWZhdWx0cyBlbnRyaWVzIGZvciBhIHN0eWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3R5bGUgICAgICAgICBUaGUgc3R5bGUgdG8gd3JpdGUgZGVmYXVsdHMgZW50cmllcyBmb3IKKyAgICAgKiBAcGFyYW0gdWlEZWZhdWx0SW5pdCBUaGUgYnVmZmVyIHRvIHdyaXRlIHVpIGRlZmF1bHQgcHV0IG1ldGhvZHMgb2YgdGhlIGZvcm0gPGNvZGU+ZC5wdXQoImFjdGl2ZUNhcHRpb24iLCBuZXcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBDb2xvclVJUmVzb3VyY2UoMTIzLCA0NSwgMjAwKSk7PC9jb2RlPgorICAgICAqIEBwYXJhbSBwcmVmaXggICAgICAgIFRoZSBwcmVmaXggZm9yIHRoZSBzdHlsZSBwcm9wZXJ0eSBuYW1lcywgZm9yIHRoZSBtb2RlbCBwYXRoIHdoZXJlIHRoZSBzdHlsZSBpcyBmcm9tLCBzaG91bGQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBlbmQgd2l0aCBhICIuIgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHlsZShVSVN0eWxlIHN0eWxlLCBTdHJpbmdCdWlsZGVyIHVpRGVmYXVsdEluaXQsIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgaWYgKCFzdHlsZS5pc1RleHRGb3JlZ3JvdW5kSW5oZXJpdGVkKCkpIHdyaXRlTWF0dGUocHJlZml4ICsgInRleHRGb3JlZ3JvdW5kIiwgc3R5bGUuZ2V0VGV4dEZvcmVncm91bmQoKSwgdWlEZWZhdWx0SW5pdCk7CisgICAgICAgIGlmICghc3R5bGUuaXNUZXh0QmFja2dyb3VuZEluaGVyaXRlZCgpKSB3cml0ZU1hdHRlKHByZWZpeCArICJ0ZXh0QmFja2dyb3VuZCIsIHN0eWxlLmdldFRleHRCYWNrZ3JvdW5kKCksIHVpRGVmYXVsdEluaXQpOworICAgICAgICBpZiAoIXN0eWxlLmlzQmFja2dyb3VuZEluaGVyaXRlZCgpKSB3cml0ZU1hdHRlKHByZWZpeCArICJiYWNrZ3JvdW5kIiwgc3R5bGUuZ2V0QmFja2dyb3VuZCgpLCB1aURlZmF1bHRJbml0KTsKKyAgICAgICAgaWYgKCFzdHlsZS5pc0ZvbnRJbmhlcml0ZWQoKSkgd3JpdGVUeXBlRmFjZShwcmVmaXggKyAiZm9udCIsIHN0eWxlLmdldEZvbnQoKSwgdWlEZWZhdWx0SW5pdCk7CisgICAgICAgIGZvciAoVUlQcm9wZXJ0eSBwcm9wZXJ0eSA6IHN0eWxlLmdldFVpUHJvcGVydGllcygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBiID0gKChCb29sZWFuKXByb3BlcnR5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocHJlZml4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByb3BlcnR5LmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoYiA/ICJCb29sZWFuLlRSVUUiIDogIkJvb2xlYW4uRkFMU0UiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIpO1xuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIGQucHV0KFwiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByb3BlcnR5LmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiwgXCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocHJvcGVydHkuZ2V0VmFsdWUoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiKTtcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIiAgICAgICAgZC5wdXQoXCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocHJlZml4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocHJvcGVydHkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiLCBuZXcgSW50ZWdlcigiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoKChJbnRlZ2VyKSBwcm9wZXJ0eS5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIikpO1xuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIGQucHV0KFwiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByb3BlcnR5LmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiwgbmV3IEZsb2F0KCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgoKEZsb2F0KSBwcm9wZXJ0eS5nZXRWYWx1ZSgpKS5mbG9hdFZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiZikpO1xuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcm9wZXJ0eS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIG5ldyBEb3VibGUoIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCgoRG91YmxlKSBwcm9wZXJ0eS5nZXRWYWx1ZSgpKS5kb3VibGVWYWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIikpO1xuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09MT1I6CisgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIGQucHV0KFwiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByb3BlcnR5LmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiwgIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbnZlcnRQYWludCgoTWF0dGUpcHJvcGVydHkuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiKTtcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPTlQ6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZUZhY2UocHJlZml4LnJlcGxhY2UoIlwiIiwgIlxcXCIiKSArIHByb3BlcnR5LmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHlwZWZhY2UpIHByb3BlcnR5LmdldFZhbHVlKCksIHVpRGVmYXVsdEluaXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOU0VUUzoKKyAgICAgICAgICAgICAgICAgICAgSW5zZXRzIGkgPSAoSW5zZXRzKSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcm9wZXJ0eS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIG5ldyBJbnNldHNVSVJlc291cmNlKCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChpLnRvcCkuYXBwZW5kKCIsICIpLmFwcGVuZChpLmxlZnQpLmFwcGVuZCgiLCAiKS5hcHBlbmQoaS5ib3R0b20pLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaS5yaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIpKTtcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJTUVOU0lPTjoKKyAgICAgICAgICAgICAgICAgICAgRGltZW5zaW9uIGQgPSAoRGltZW5zaW9uKSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcm9wZXJ0eS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIG5ldyBEaW1lbnNpb25VSVJlc291cmNlKCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChkLndpZHRoKS5hcHBlbmQoIiwgIikuYXBwZW5kKGQuaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIikpO1xuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQk9SREVSOgorICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcm9wZXJ0eS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIG5ldyBCb3JkZXJVSVJlc291cmNlKCIpOworICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZChjb252ZXJ0Qm9yZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCb3JkZXIpcHJvcGVydHkuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiKSk7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTWF0dGUoU3RyaW5nIHByb3BlcnR5TmFtZSwgTWF0dGUgbWF0dGUsIFN0cmluZ0J1aWxkZXIgdWlEZWZhdWx0SW5pdCkgeworICAgICAgICBpZiAobWF0dGU9PW51bGwpIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgbWF0dGUgaXMgTlVMTCBmb3IgWyIrcHJvcGVydHlOYW1lKyJdIik7CisgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIGQucHV0KFwiIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwcm9wZXJ0eU5hbWUpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbnZlcnRQYWludChtYXR0ZSkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIik7XG4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlVHlwZUZhY2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgVHlwZWZhY2UgdHlwZWZhY2UsIFN0cmluZ0J1aWxkZXIgdWlEZWZhdWx0SW5pdCkgeworICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChwcm9wZXJ0eU5hbWUpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIG5ldyBEZXJpdmVkRm9udChcIiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCh0eXBlZmFjZS5nZXRVaURlZmF1bHRQYXJlbnROYW1lKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCh0eXBlZmFjZS5nZXRTaXplT2Zmc2V0KCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiZiwgIik7CisgICAgICAgIHN3aXRjaCAodHlwZWZhY2UuZ2V0Qm9sZCgpKSB7CisgICAgICAgICAgICBjYXNlIERlZmF1bHQ6CisgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIm51bGwsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9mZjoKKyAgICAgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiQm9vbGVhbi5GQUxTRSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT246CisgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIkJvb2xlYW4uVFJVRSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHR5cGVmYWNlLmdldEl0YWxpYygpKSB7CisgICAgICAgICAgICBjYXNlIERlZmF1bHQ6CisgICAgICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIm51bGwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT2ZmOgorICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCJCb29sZWFuLkZBTFNFIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9uOgorICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCJCb29sZWFuLlRSVUUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiKSk7XG4iKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIG91dCBjb2RlIGZvciBhIENvbXBvbmVudCBvciBSZWdpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wICAgICAgICAgICAgICAgVGhpcyBtYXkgYmUgdGhlIHNhbWUgYXMgdGhlIHJlZ2lvbiA8Y29kZT5yZWc8L2NvZGU+IG9yIGlzIHRoZSBwYXJlbnQgY29tcG9uZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSByZWdpb24KKyAgICAgKiBAcGFyYW0gcmVnaW9uICAgICAgICAgICAgIFRoZSByZWdpb24gd2UgYXJlIHdyaXRpbmcgb3V0CisgICAgICogQHBhcmFtIHByZWZpeCAgICAgICAgICAgICBUaGlzIGlzIGRvdCBzcGVyYXRlZCBwYXRoIG9mIGNvbXBvbmVudCBhbmQgc3ViIHJlZ2lvbnMgdG8gYW5kIGluY2x1ZGluZyB0aGUgcmVnaW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5yZWc8L2NvZGU+IG9mIHRoZSBmb3JtIFtDb21wXS5bUmVnaW9uXS4uLi4uLltSZWdpb25dIHBhdGgKKyAgICAgKiBAcGFyYW0gdWlEZWZhdWx0SW5pdCAgICAgIFRoaXMgaXMgZm9yIGluc2VydGluZyBpbnRvIG9yZy5teXBhY2thZ2UubXlsYWYuTXlEZWZhdWx0cyNnZXREZWZhdWx0cygpIG1ldGhvZAorICAgICAqIEBwYXJhbSBzdHlsZUluaXQgICAgICAgICAgVGhpcyBpcyBmb3IgaW5zZXJ0aW5nIGludG8gb3JnLm15cGFja2FnZS5teWxhZi5NeURlZmF1bHRzI2luaXRpYWxpemUoKSBtZXRob2QKKyAgICAgKiBAcGFyYW0gdmFyaWFibGVzICAgICAgICAgIFRoZSB2YXJpYWJsZXMgbWFwIHByZSBwb3B1bGF0ZWQgd2l0aCAiUEFDS0FHRSIgYW5kICJMQUZfTkFNRSIKKyAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWVQcmVmaXggIFRoZSBwYWNrYWdlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3ludGggbG9vayBhbmQgZmVlbC4gRm9yIGV4YW1wbGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcubXlwYWNrYWdlLm15bGFmCisgICAgICogQHBhcmFtIHBhaW50ZXJQYWNrYWdlUm9vdCBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHBhaW50ZXJzIG91dCB0bworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVSZWdpb24oVUlDb21wb25lbnQgY29tcCwgVUlSZWdpb24gcmVnaW9uLCBTdHJpbmcgcHJlZml4LCBTdHJpbmdCdWlsZGVyIHVpRGVmYXVsdEluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0eWxlSW5pdCwgTWFwPFN0cmluZywgU3RyaW5nPiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWVQcmVmaXgsIEZpbGUgcGFpbnRlclBhY2thZ2VSb290KSB7CisgICAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCB3aXRoIExBRgorICAgICAgICBTdHJpbmcgcmVnaW9uQ29kZSA9IEdlbmVyYXRvclV0aWxzLmdldFJlZ2lvbk5hbWVDYXBzKHJlZ2lvbi5nZXROYW1lKCkpOworICAgICAgICBpZiAocmVnaW9uQ29kZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJXZSB3ZXJlIGFza2VkIHRvIGVuY29kZSBhIHJlZ2lvbiB3ZSBrbm93IG5vdGhpbmcgYWJvdXQ6ICIgKyByZWdpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlZ2lvbkNvZGUgPSAiUmVnaW9uLiIgKyByZWdpb25Db2RlOworICAgICAgICB9CisKKyAgICAgICAgLy9jb25zdHJ1Y3QgdGhlIGxpc3Qgb2YgU3RhdGVzIHRoYXQgYWNjb21wYW55IHRoaXMgcmVnaXN0cmF0aW9uLgorICAgICAgICBTdHJpbmdCdWZmZXIgcmVnU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOyAvL2xpa2U6IEVuYWJsZWQsRGlzYWJsZWQsRm9vLERlZmF1bHQsRXRjCisgICAgICAgIExpc3Q8VUlTdGF0ZVR5cGU+IHR5cGVzID0gY29tcC5nZXRTdGF0ZVR5cGVzKCk7IC8vc3RhdGUgdHlwZXMgYXJlIG9ubHkgZGVmaW5lZCBvbiB0aGUgVUlDb21wb25lbnQgbGV2ZWwKKyAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChVSVN0YXRlVHlwZSB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgICAgICByZWdTdHJpbmcuYXBwZW5kKHR5cGUuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIHJlZ1N0cmluZy5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vcmVtb3ZlIHRoZSBsYXN0ICIsIgorICAgICAgICAgICAgcmVnU3RyaW5nLmRlbGV0ZUNoYXJBdChyZWdTdHJpbmcubGVuZ3RoKCktMSk7CisgICAgICAgIH0KKworICAgICAgICBzdHlsZUluaXQuYXBwZW5kKCIgICAgICAgIHJlZ2lzdGVyKCIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChyZWdpb25Db2RlKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgXCIiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgc3R5bGVJbml0LmFwcGVuZCgiXCIiKTsKKyAgICAgICAgc3R5bGVJbml0LmFwcGVuZCgiKTtcbiIpOworCisgICAgICAgIC8vIHdyaXRlIGNvbnRlbnQgbWFyZ2lucworICAgICAgICBJbnNldHMgaSA9IChJbnNldHMpIHJlZ2lvbi5nZXRDb250ZW50TWFyZ2lucygpOworICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChwcmVmaXgpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiLmNvbnRlbnRNYXJnaW5zIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiwgbmV3IEluc2V0c1VJUmVzb3VyY2UoIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGkudG9wKS5hcHBlbmQoIiwgIikuYXBwZW5kKGkubGVmdCkuYXBwZW5kKCIsICIpLmFwcGVuZChpLmJvdHRvbSkuYXBwZW5kKCIsICIpLmFwcGVuZChpLnJpZ2h0KQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIikpO1xuIik7CisgICAgICAgIC8vIHdyaXRlIG9wYXF1ZSBpZiB0cnVlCisgICAgICAgIGlmIChyZWdpb24gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCAmJiAoKFVJQ29tcG9uZW50KXJlZ2lvbikuaXNPcGFxdWUoKSkgeworICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIiAgICAgICAgZC5wdXQoXCIiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLm9wYXF1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiLCBCb29sZWFuLlRSVUUpO1xuIik7CisgICAgICAgIH0KKyAgICAgICAgLy93cml0ZSB0aGUgU3RhdGUsIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoIXJlZ1N0cmluZy5lcXVhbHMoIkVuYWJsZWQsTW91c2VPdmVyLFByZXNzZWQsRGlzYWJsZWQsRm9jdXNlZCxTZWxlY3RlZCxEZWZhdWx0IikgJiYgdHlwZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgLy90aGVyZSB3ZXJlIGVpdGhlciBjdXN0b20gc3RhdGVzLCBvciB0aGUgbm9ybWFsIHN0YXRlcyB3ZXJlIGluIGEgY3VzdG9tIG9yZGVyCisgICAgICAgICAgICAvL3NvIGdvIGFoZWFkIGFuZCB3cml0ZSBvdXQgcHJlZml4LlN0YXRlCisgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiICAgICAgICBkLnB1dChcIiIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocHJlZml4KQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuU3RhdGVzIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIFwiIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZWdTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiKTtcbiIpOworICAgICAgICB9CisgICAgICAgIC8vd3JpdGUgb3V0IGFueSBjdXN0b20gc3RhdGVzLCBpZiBuZWNlc3NhcnkKKyAgICAgICAgZm9yIChVSVN0YXRlVHlwZSB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyBzeW50aFN0YXRlID0gdHlwZS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGlmICghIkVuYWJsZWQiLmVxdWFscyhzeW50aFN0YXRlKSAmJgorICAgICAgICAgICAgICAgICEiTW91c2VPdmVyIi5lcXVhbHMoc3ludGhTdGF0ZSkgJiYKKyAgICAgICAgICAgICAgICAhIlByZXNzZWQiLmVxdWFscyhzeW50aFN0YXRlKSAmJgorICAgICAgICAgICAgICAgICEiRGlzYWJsZWQiLmVxdWFscyhzeW50aFN0YXRlKSAmJgorICAgICAgICAgICAgICAgICEiRm9jdXNlZCIuZXF1YWxzKHN5bnRoU3RhdGUpICYmCisgICAgICAgICAgICAgICAgISJTZWxlY3RlZCIuZXF1YWxzKHN5bnRoU3RhdGUpICYmCisgICAgICAgICAgICAgICAgISJEZWZhdWx0Ii5lcXVhbHMoc3ludGhTdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAvL3doYXQgd2UgaGF2ZSBoZXJlLCBnZW50bGVtZW4sIGlzIGEgYm9uYS1maWRlIGN1c3RvbSBzdGF0ZS4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlIHN0YW5kYXJkIHR5cGVzLCB0aGVuIGNvbnN0cnVjdCBhIG5hbWUgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vdGhlIG5ldyB0eXBlLCBhbmQgd3JpdGUgb3V0IGEgbmV3IHN1YmNsYXNzIG9mIFN0YXRlLgorICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzTmFtZSA9IG1ha2VQcmV0dHkocHJlZml4KSArIHN5bnRoU3RhdGUgKyAiU3RhdGUiOworICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGJvZHkgPSB0eXBlLmdldENvZGVTbmlwcGV0KCk7CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcy5wdXQoIlNUQVRFX05BTUUiLCBjbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMucHV0KCJTVEFURV9LRVkiLCBzeW50aFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLnB1dCgiQk9EWSIsIGJvZHkpOworCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU3JjRmlsZShnZXRTdGF0ZVR5cGVUZW1wbGF0ZSgpLCB2YXJpYWJsZXMsIG5ldyBqYXZhLmlvLkZpbGUocGFpbnRlclBhY2thZ2VSb290LCBjbGFzc05hbWUgKyAiLmphdmEiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLnJlbW92ZSgiU1RBVEVfTkFNRSIpOworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMucmVtb3ZlKCJTVEFURV9LRVkiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLnJlbW92ZSgiQk9EWSIpOworCisgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCIgICAgICAgIGQucHV0KFwiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN5bnRoU3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIG5ldyAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2xhc3NOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIigpKTtcbiIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB3cml0ZSByZWdpb24gc3R5bGUKKyAgICAgICAgd3JpdGVTdHlsZShyZWdpb24uZ2V0U3R5bGUoKSwgdWlEZWZhdWx0SW5pdCwgcHJlZml4ICsgIi4iKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbiBoYXNDYW52YXMgPSBoYXNDYW52YXMocmVnaW9uKTsKKyAgICAgICAgICAgIGlmIChoYXNDYW52YXMpIHsKKyAgICAgICAgICAgICAgICBQYWludGVyR2VuZXJhdG9yLndyaXRlUGFpbnRlcihyZWdpb24sIHZhcmlhYmxlcywgcGFpbnRlclBhY2thZ2VSb290LCBwcmVmaXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lUHJlZml4ID0gbWFrZVByZXR0eShwcmVmaXgpICsgIlBhaW50ZXIiOworICAgICAgICAgICAgLy8gd3JpdGUgc3RhdGVzIHVpIGRlZmF1bHRzCisgICAgICAgICAgICBmb3IgKFVJU3RhdGUgc3RhdGUgOiByZWdpb24uZ2V0QmFja2dyb3VuZFN0YXRlcygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlUHJlZml4ID0gcHJlZml4ICsgIlsiICsgc3RhdGUuZ2V0TmFtZSgpICsgIl0iOworICAgICAgICAgICAgICAgIC8vIHdyaXRlIHN0YXRlIHN0eWxlCisgICAgICAgICAgICAgICAgd3JpdGVTdHlsZShzdGF0ZS5nZXRTdHlsZSgpLCB1aURlZmF1bHRJbml0LCBzdGF0ZVByZWZpeCArICIuIik7CisgICAgICAgICAgICAgICAgLy8gd3JpdGUgcGFpbnRlcgorICAgICAgICAgICAgICAgIGlmIChoYXNDYW52YXMpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVMYXp5UGFpbnRlcihzdGF0ZSwgdWlEZWZhdWx0SW5pdCwgc3RhdGVQcmVmaXgsIHBhY2thZ2VOYW1lUHJlZml4LCBmaWxlTmFtZVByZWZpeCwgImJhY2tncm91bmQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKFVJU3RhdGUgc3RhdGUgOiByZWdpb24uZ2V0Rm9yZWdyb3VuZFN0YXRlcygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlUHJlZml4ID0gcHJlZml4ICsgIlsiICsgc3RhdGUuZ2V0TmFtZSgpICsgIl0iOworICAgICAgICAgICAgICAgIC8vIHdyaXRlIHN0YXRlIHN0eWxlCisgICAgICAgICAgICAgICAgd3JpdGVTdHlsZShzdGF0ZS5nZXRTdHlsZSgpLCB1aURlZmF1bHRJbml0LCBzdGF0ZVByZWZpeCArICIuIik7CisgICAgICAgICAgICAgICAgLy8gd3JpdGUgcGFpbnRlcgorICAgICAgICAgICAgICAgIGlmIChoYXNDYW52YXMpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVMYXp5UGFpbnRlcihzdGF0ZSwgdWlEZWZhdWx0SW5pdCwgc3RhdGVQcmVmaXgsIHBhY2thZ2VOYW1lUHJlZml4LCBmaWxlTmFtZVByZWZpeCwgImZvcmVncm91bmQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKFVJU3RhdGUgc3RhdGUgOiByZWdpb24uZ2V0Qm9yZGVyU3RhdGVzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RhdGVQcmVmaXggPSBwcmVmaXggKyAiWyIgKyBzdGF0ZS5nZXROYW1lKCkgKyAiXSI7CisgICAgICAgICAgICAgICAgLy8gd3JpdGUgc3RhdGUgc3R5bGUKKyAgICAgICAgICAgICAgICB3cml0ZVN0eWxlKHN0YXRlLmdldFN0eWxlKCksIHVpRGVmYXVsdEluaXQsIHN0YXRlUHJlZml4ICsgIi4iKTsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZSBwYWludGVyCisgICAgICAgICAgICAgICAgaWYgKGhhc0NhbnZhcykgeworICAgICAgICAgICAgICAgICAgICB3cml0ZUxhenlQYWludGVyKHN0YXRlLCB1aURlZmF1bHRJbml0LCBzdGF0ZVByZWZpeCwgcGFja2FnZU5hbWVQcmVmaXgsIGZpbGVOYW1lUHJlZml4LCAiYm9yZGVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBzdWIgcmVnaW9ucworICAgICAgICBmb3IgKFVJUmVnaW9uIHN1YlJlZ2lvbiA6IHJlZ2lvbi5nZXRTdWJSZWdpb25zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzdWJyZWdpb25OYW1lID0gcHJlZml4ICsgIjoiICsgZXNjYXBlKHN1YlJlZ2lvbi5nZXRLZXkoKSk7CisgICAgICAgICAgICBpZiAoc3ViUmVnaW9uIGluc3RhbmNlb2YgVUlJY29uUmVnaW9uKSB7CisgICAgICAgICAgICAgICAgd3JpdGVJY29uUmVnaW9uKGNvbXAsIChVSUljb25SZWdpb24pIHN1YlJlZ2lvbiwgcHJlZml4LCB1aURlZmF1bHRJbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLCBwYWNrYWdlTmFtZVByZWZpeCwgcGFpbnRlclBhY2thZ2VSb290KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViUmVnaW9uIGluc3RhbmNlb2YgVUlDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBpbm5lciBuYW1lZCBjb21wb25lbnQKKyAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCBzdWJDb21wb25lbnQgPSAoVUlDb21wb25lbnQpIHN1YlJlZ2lvbjsKKyAgICAgICAgICAgICAgICB3cml0ZVJlZ2lvbihzdWJDb21wb25lbnQsIHN1YlJlZ2lvbiwgc3VicmVnaW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdEluaXQsIHN0eWxlSW5pdCwgdmFyaWFibGVzLCBwYWNrYWdlTmFtZVByZWZpeCwgcGFpbnRlclBhY2thZ2VSb290KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd3JpdGVSZWdpb24oY29tcCwgc3ViUmVnaW9uLCBzdWJyZWdpb25OYW1lLCB1aURlZmF1bHRJbml0LCBzdHlsZUluaXQsIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lUHJlZml4LCBwYWludGVyUGFja2FnZVJvb3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUxhenlQYWludGVyKFVJU3RhdGUgc3RhdGUsIFN0cmluZ0J1aWxkZXIgdWlEZWZhdWx0SW5pdCwgU3RyaW5nIHN0YXRlUHJlZml4LCBTdHJpbmcgcGFja2FnZU5hbWVQcmVmaXgsIFN0cmluZyBmaWxlTmFtZVByZWZpeCwgU3RyaW5nIHBhaW50ZXJTdWZmaXgpIHsKKyAgICAgICAgQ2FudmFzIGNhbnZhcyA9IHN0YXRlLmdldENhbnZhcygpOworICAgICAgICBpZiAoIWNhbnZhcy5pc0JsYW5rKCkpIHsKKyAgICAgICAgICAgIEluc2V0cyBzaSA9IGNhbnZhcy5nZXRTdHJldGNoaW5nSW5zZXRzKCk7CisgICAgICAgICAgICBib29sZWFuIGludmVydGVkID0gc3RhdGUuaXNJbnZlcnRlZCgpOworICAgICAgICAgICAgVUlTdHlsZS5DYWNoZU1vZGUgY2FjaGUgPSBzdGF0ZS5nZXRTdHlsZSgpLmdldENhY2hlTW9kZSgpOworICAgICAgICAgICAgU3RyaW5nIGNhY2hlTW9kZVN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2ggKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT19DQUNISU5HOiBjYWNoZU1vZGVTdHJpbmcgPSAiQWJzdHJhY3RSZWdpb25QYWludGVyLlBhaW50Q29udGV4dC5DYWNoZU1vZGUuTk9fQ0FDSElORyI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRklYRURfU0laRVM6IGNhY2hlTW9kZVN0cmluZyA9ICJBYnN0cmFjdFJlZ2lvblBhaW50ZXIuUGFpbnRDb250ZXh0LkNhY2hlTW9kZS5GSVhFRF9TSVpFUyI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTklORV9TUVVBUkVfU0NBTEU6IGNhY2hlTW9kZVN0cmluZyA9ICJBYnN0cmFjdFJlZ2lvblBhaW50ZXIuUGFpbnRDb250ZXh0LkNhY2hlTW9kZS5OSU5FX1NRVUFSRV9TQ0FMRSI7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIG1heEggPSBzdGF0ZS5nZXRTdHlsZSgpLmdldE1heEhvekNhY2hlZEltZ1NjYWxpbmcoKTsKKyAgICAgICAgICAgIGRvdWJsZSBtYXhWID0gc3RhdGUuZ2V0U3R5bGUoKS5nZXRNYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZygpOworICAgICAgICAgICAgU3RyaW5nIHN0YXRlQ29uc3RhbnQgPSB0b0NvbnN0YW50TmFtZShwYWludGVyU3VmZml4ICsgIl8iICsgVUlTdGF0ZS5rZXlzVG9TdHJpbmcoc3RhdGUuZ2V0U3RhdGVLZXlzKCkpKTsKKworICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIiAgICAgICAgZC5wdXQoXCIiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN0YXRlUHJlZml4KQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuIikuYXBwZW5kKHBhaW50ZXJTdWZmaXgpLmFwcGVuZCgiUGFpbnRlclwiLCBuZXcgTGF6eVBhaW50ZXIoXCIiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHBhY2thZ2VOYW1lUHJlZml4KS5hcHBlbmQoIi4iKS5hcHBlbmQoZmlsZU5hbWVQcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGZpbGVOYW1lUHJlZml4KS5hcHBlbmQoIi4iKS5hcHBlbmQoc3RhdGVDb25zdGFudCkuYXBwZW5kKCIsICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY29udmVydChzaSkpLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbnZlcnQoY2FudmFzLmdldFNpemUoKSkpLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGludmVydGVkKS5hcHBlbmQoIiwgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWNoZU1vZGVTdHJpbmcpLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG1heEggPT0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZID8gIkRvdWJsZS5QT1NJVElWRV9JTkZJTklUWSIgOiBtYXhIKS5hcHBlbmQoIiwgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChtYXhWID09IERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSA/ICJEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkiIDogbWF4VikuYXBwZW5kKCIpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBvdXQgY29kZSBmb3IgYSBJY29uUmVnaW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcCAgICAgICAgICAgICAgIFRoaXMgbWF5IGJlIHRoZSBzYW1lIGFzIHRoZSByZWdpb24gPGNvZGU+cmVnaW9uPC9jb2RlPiBvciBpcyB0aGUgcGFyZW50IGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZyB0aGUgcmVnaW9uCisgICAgICogQHBhcmFtIHJlZ2lvbiAgICAgICAgICAgICBUaGUgcmVnaW9uIHdlIGFyZSB3cml0aW5nIG91dAorICAgICAqIEBwYXJhbSBwcmVmaXggICAgICAgICAgICAgVGhpcyBpcyBbQ29tcF1bUmVnaW9uXS4uLi4uLltSZWdpb25dIHBhdGgKKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgIFRoZSBrZXkgZm9yIHRoaXMgaWNvbi4KKyAgICAgKiBAcGFyYW0gdWlEZWZhdWx0SW5pdCAgICAgIFRoaXMgaXMgZm9yIGluc2VydGluZyBpbnRvIG9yZy5teXBhY2thZ2UubXlsYWYuTXlEZWZhdWx0cyNnZXREZWZhdWx0cygpIG1ldGhvZAorICAgICAqIEBwYXJhbSB2YXJpYWJsZXMgICAgICAgICAgVGhlIHZhcmlhYmxlcyBtYXAgcHJlIHBvcHVsYXRlZCB3aXRoICJQQUNLQUdFIiBhbmQgIkxBRl9OQU1FIgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZVByZWZpeCAgVGhlIHBhY2thZ2UgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW50aCBsb29rIGFuZCBmZWVsLiBGb3IgZXhhbXBsZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5teXBhY2thZ2UubXlsYWYKKyAgICAgKiBAcGFyYW0gcGFpbnRlclBhY2thZ2VSb290IFRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgcGFpbnRlcnMgb3V0IHRvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUljb25SZWdpb24oVUlDb21wb25lbnQgY29tcCwgVUlJY29uUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHVpRGVmYXVsdEluaXQsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZVByZWZpeCwgRmlsZSBwYWludGVyUGFja2FnZVJvb3QpIHsKKworICAgICAgICBEaW1lbnNpb24gc2l6ZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBmaWxlTmFtZVByZWZpeCA9IG1ha2VQcmV0dHkocHJlZml4KSArICJQYWludGVyIjsKKyAgICAgICAgLy8gd3JpdGUgc3RhdGVzIHVpIGRlZmF1bHRzCisgICAgICAgIGZvciAoVUlTdGF0ZSBzdGF0ZSA6IHJlZ2lvbi5nZXRCYWNrZ3JvdW5kU3RhdGVzKCkpIHsvLyBUT0RPOiBIYW5kbGUgQmFja2dyb3VuZCxGb3JlZ3JvdW5kIGFuZCBCb3JkZXJzIFN0YXRlcyBMaXN0cz8gQWN0dWFsbHkgbm90IHN1cmUgdGhhdCBJY29uUmVnaW9ucyBuZWVkIHN1cHBvcnQgYm9yZGVycyBvciBmb3JlZ3JvdW5kcworICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IHN0YXRlLmdldENhbnZhcygpOworICAgICAgICAgICAgaWYgKCFjYW52YXMuaXNCbGFuaygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlUHJlZml4ID0gcHJlZml4ICsgIlsiICsgc3RhdGUuZ2V0TmFtZSgpICsgIl0iOworICAgICAgICAgICAgICAgIC8vIFB1dCBQYWludGVyIGluIFVpRGVmYXVsdHMKKyAgICAgICAgICAgICAgICB3cml0ZUxhenlQYWludGVyKHN0YXRlLCB1aURlZmF1bHRJbml0LCBzdGF0ZVByZWZpeCwgcGFja2FnZU5hbWVQcmVmaXgsIGZpbGVOYW1lUHJlZml4LCByZWdpb24uZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIHNpemUgPSBjYW52YXMuZ2V0U2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNpemUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gUHV0IFN5bnRoSWNvbkltcGwgd3JhcHBlciBpbiBVaURlZmF1bHRzCisgICAgICAgICAgICBTdHJpbmcga2V5ID0gcmVnaW9uLmdldEJhc2ljS2V5KCkgPT0gbnVsbCA/IHByZWZpeCArICIuIiArIHJlZ2lvbi5nZXRLZXkoKSA6IHJlZ2lvbi5nZXRCYXNpY0tleSgpOworICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIiAgICAgICAgZC5wdXQoXCIiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGtleSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIsIG5ldyBOaW1idXNJY29uKFwiIikgLy9UT0RPIHNob3VsZCB0aGlzIGJlIHdyYXBwZWQgaW4gYW4gSWNvblVJUmVzb3VyY2U/CisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocHJlZml4KQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiwgXCIiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJlZ2lvbi5nZXRLZXkoKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiUGFpbnRlciIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHNpemUud2lkdGgpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChzaXplLmhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiKSk7XG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBzdWIgcmVnaW9ucworICAgICAgICBpZiAocmVnaW9uLmdldFN1YlJlZ2lvbnMoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBtZWFuaW5nIHRvIGEgc3ViIHJlZ2lvbiBpbnNpZGUgYSBJY29uUmVnaW9uCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgY2FuIG5vdCBoYXZlIHN1YiByZWdpb25zIGluc2lkZSBVaUljb25SZWdpb25zLiBcIiIgKworICAgICAgICAgICAgICAgICAgICBjb21wLmdldFN1YlJlZ2lvbnMoKVswXS5nZXROYW1lKCkgKyAiXCIgaXMgaW5zaWRlIFwiIgorICAgICAgICAgICAgICAgICAgICArIHByZWZpeC5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCgpIC0gMSkgKyAiXCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciBlc2NhcGluZyBhbGwgZG91YmxlIHF1b3RlcyB3aXRoIGJhY2tzbGFzaCBkb3VibGUtcXVvdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gcy5yZXBsYWNlKCJcIiIsICJcXFwiIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRQYWludChQYWludE1vZGVsIHBhaW50KXsKKyAgICAgICAgaWYgKHBhaW50IGluc3RhbmNlb2YgTWF0dGUpeworICAgICAgICAgICAgTWF0dGUgbWF0dGUgPSAoTWF0dGUpcGFpbnQ7CisgICAgICAgICAgICBpZiAobWF0dGUuaXNBYnNvbHV0ZSgpKXsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29sb3JQYXJhbXMgPSBjb252ZXJ0KG1hdHRlLmdldENvbG9yKCkpOworICAgICAgICAgICAgICAgIGlmIChtYXR0ZS5pc1VpUmVzb3VyY2UoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5ldyBDb2xvclVJUmVzb3VyY2UoIiArIGNvbG9yUGFyYW1zICsgIikiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvclBhcmFtczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gImdldERlcml2ZWRDb2xvcihcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHRlLmdldFVpRGVmYXVsdFBhcmVudE5hbWUoKSsiXCIsIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXR0ZS5nZXRIdWVPZmZzZXQoKSsiZiwiK21hdHRlLmdldFNhdHVyYXRpb25PZmZzZXQoKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZiwiK21hdHRlLmdldEJyaWdodG5lc3NPZmZzZXQoKSsiZiwiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHRlLmdldEFscGhhT2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1hdHRlLmlzVWlSZXNvdXJjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzICsgIikiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzICsgIixmYWxzZSkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vVE9ETzogV2hhdCBhYm91dCBncmFkaWVudHMgZXRjIGhlcmU/CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBDb3VsZCBub3Qgd3JpdGUgcGFpbnQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0c0dlbmVyYXRvciBhcyBpdCB3YXMgbm90IGEgTWF0dGUuID0gIisKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRCb3JkZXIoQm9yZGVyIHZhbCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHVpRGVmYXVsdEluaXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBJbnNldHMgaTsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFBhaW50ZXJCb3JkZXIpIHsKKyAgICAgICAgICAgIFBhaW50ZXJCb3JkZXIgcGIgPSAoUGFpbnRlckJvcmRlcikgdmFsOworICAgICAgICAgICAgaSA9IHBiLmdldEJvcmRlckluc2V0cygpOworICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIm5ldyBQYWludGVyQm9yZGVyKFwiIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwYi5nZXRQYWludGVyTmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiwgbmV3IEluc2V0cygiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGkudG9wKS5hcHBlbmQoIiwgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChpLmxlZnQpLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGkuYm90dG9tKS5hcHBlbmQoIiwgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChpLnJpZ2h0KQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIpKSIpOworICAgICAgICB9IGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEVtcHR5Qm9yZGVyKSB7CisgICAgICAgICAgICBpID0gKChFbXB0eUJvcmRlcikgdmFsKS5nZXRCb3JkZXJJbnNldHMoKTsKKyAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCJCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaS50b3ApLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGkubGVmdCkuYXBwZW5kKCIsICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaS5ib3R0b20pLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGkucmlnaHQpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIikiKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBMaW5lQm9yZGVyKSB7CisgICAgICAgICAgICBMaW5lQm9yZGVyIGJvcmRlciA9IChMaW5lQm9yZGVyKSB2YWw7CisgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKCIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY29udmVydChib3JkZXIuZ2V0TGluZUNvbG9yKCkpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChib3JkZXIuZ2V0VGhpY2tuZXNzKCkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIikiKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBFdGNoZWRCb3JkZXIpIHsKKyAgICAgICAgICAgIEV0Y2hlZEJvcmRlciBib3JkZXIgPSAoRXRjaGVkQm9yZGVyKSB2YWw7CisgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChib3JkZXIuZ2V0RXRjaFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY29udmVydChib3JkZXIuZ2V0SGlnaGxpZ2h0Q29sb3IoKSkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbnZlcnQoYm9yZGVyLmdldFNoYWRvd0NvbG9yKCkpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIpIik7CisgICAgICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQmV2ZWxCb3JkZXIpIHsKKyAgICAgICAgICAgIEJldmVsQm9yZGVyIGJvcmRlciA9IChCZXZlbEJvcmRlcikgdmFsOworICAgICAgICAgICAgdWlEZWZhdWx0SW5pdC5hcHBlbmQoIkJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoYm9yZGVyLmdldEJldmVsVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb252ZXJ0KGJvcmRlci5nZXRIaWdobGlnaHRPdXRlckNvbG9yKCkpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb252ZXJ0KGJvcmRlci5nZXRIaWdobGlnaHRJbm5lckNvbG9yKCkpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb252ZXJ0KGJvcmRlci5nZXRTaGFkb3dPdXRlckNvbG9yKCkpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb252ZXJ0KGJvcmRlci5nZXRTaGFkb3dJbm5lckNvbG9yKCkpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIpIik7CisgICAgICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgTWF0dGVCb3JkZXIpIHsKKyAgICAgICAgICAgIE1hdHRlQm9yZGVyIGJvcmRlciA9IChNYXR0ZUJvcmRlcikgdmFsOworICAgICAgICAgICAgaSA9IGJvcmRlci5nZXRCb3JkZXJJbnNldHMoKTsKKyAgICAgICAgICAgIHVpRGVmYXVsdEluaXQuYXBwZW5kKCJCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaS50b3ApLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGkubGVmdCkuYXBwZW5kKCIsICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaS5ib3R0b20pLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGkucmlnaHQpLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbnZlcnQoYm9yZGVyLmdldE1hdHRlQ29sb3IoKSkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIikiKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBDb21wb3VuZEJvcmRlcikgeworICAgICAgICAgICAgQ29tcG91bmRCb3JkZXIgYm9yZGVyID0gKENvbXBvdW5kQm9yZGVyKSB2YWw7CisgICAgICAgICAgICB1aURlZmF1bHRJbml0LmFwcGVuZCgiQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbnZlcnRCb3JkZXIoYm9yZGVyLmdldE91dHNpZGVCb3JkZXIoKSkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbnZlcnRCb3JkZXIoYm9yZGVyLmdldEluc2lkZUJvcmRlcigpKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiKSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1aURlZmF1bHRJbml0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNDYW52YXMoVUlSZWdpb24gcmVnaW9uKSB7CisgICAgICAgIGZvciAoVUlTdGF0ZSBzIDogcmVnaW9uLmdldEJhY2tncm91bmRTdGF0ZXMoKSkgeworICAgICAgICAgICAgaWYgKCFzLmdldENhbnZhcygpLmlzQmxhbmsoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChVSVN0YXRlIHMgOiByZWdpb24uZ2V0Qm9yZGVyU3RhdGVzKCkpIHsKKyAgICAgICAgICAgIGlmICghcy5nZXRDYW52YXMoKS5pc0JsYW5rKCkpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoVUlTdGF0ZSBzIDogcmVnaW9uLmdldEZvcmVncm91bmRTdGF0ZXMoKSkgeworICAgICAgICAgICAgaWYgKCFzLmdldENhbnZhcygpLmlzQmxhbmsoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChVSVJlZ2lvbiBzdWJyZWdpb24gOiByZWdpb24uZ2V0U3ViUmVnaW9ucygpKSB7CisgICAgICAgICAgICBpZiAoaGFzQ2FudmFzKHN1YnJlZ2lvbikpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9nZW5lcmF0b3IvR2VuZXJhdG9yLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9nZW5lcmF0b3IvR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiNGI4NwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9HZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5nZW5lcmF0b3I7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuZ2VuZXJhdG9yLlRlbXBsYXRlV3JpdGVyLnJlYWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvci5UZW1wbGF0ZVdyaXRlci53cml0ZVNyY0ZpbGU7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5TeW50aE1vZGVsOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuQmluZGluZ0RpcmVjdG9yeTsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklCaW5kaW5nRmFjdG9yeTsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklVbm1hcnNoYWxsaW5nQ29udGV4dDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB2YXJpb3VzIEphdmEgYXJ0aWZhY3RzIGJhc2VkIG9uIGEgU3ludGhNb2RlbC4KKyAqIDxwLz4KKyAqIEdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgYXJlIHNwbGl0IHVwIGFtb25nIHR3byBkaWZmZXJlbnQgbG9jYXRpb25zLiBUaGVyZSBhcmUgdGhvc2Ugc291cmNlIGZpbGVzIHRoYXQgYXJlIG1lYW50IHRvIGJlCisgKiBlZGl0ZWQgKGdlbmVyYWxseSwgb25seSB0aGUgTG9va0FuZEZlZWwgY2xhc3MgaXRzZWxmKSBhbmQgdGhvc2UgdGhhdCBhcmUgYXV0b2dlbmVyYXRlZCAoZXZlcnl0aGluZyBlbHNlKS4KKyAqIDxwLz4KKyAqIEFsbCBhdXRvZ2VuZXJhdGVkIGZpbGVzIGFyZSBwbGFjZWQgaW4gImJ1aWxkUGFja2FnZVJvb3QiIGFuZCBhcmUgcGFja2FnZSBwcml2YXRlLiBBIExBRiBhdXRob3IgKG9uZSB3aG8gaGFzIGFjY2VzcyB0bworICogdGhlIGdlbmVyYXRlZCBzb3VyY2VzKSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIGFueSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuIFRob3NlIHJlZmVyZW5jaW5nIHRoZSBsaWJyYXJ5LCBob3dldmVyLAorICogd2lsbCBvbmx5IGJlIGFibGUgdG8gYWNjZXNzIHRoZSBtYWluIExvb2tBbmRGZWVsIGNsYXNzIGl0c2VsZiAoc2luY2UgZXZlcnl0aGluZyBlbHNlIGlzIHBhY2thZ2UgcHJpdmF0ZSkuCisgKgorICogQGF1dGhvciAgUmljaGFyZCBCYWlyCisgKiBAYXV0aG9yICBKYXNwZXIgUG90dHMKKyAqLworcHVibGljIGNsYXNzIEdlbmVyYXRvciB7CisgICAgLyoqIEEgbWFwIG9mIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIGZvciB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaW4gdGhlIHRlbXBsYXRlIGZpbGVzLiAqLworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiB2YXJpYWJsZXM7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZnVsbCA9IGZhbHNlOworICAgIHByaXZhdGUgRmlsZSBidWlsZFBhY2thZ2VSb290OworICAgIHByaXZhdGUgRmlsZSBzcmNQYWNrYWdlUm9vdDsKKyAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZVByZWZpeDsKKyAgICBwcml2YXRlIFN0cmluZyBsYWZOYW1lOworICAgIHByaXZhdGUgU3ludGhNb2RlbCBtb2RlbDsKKworICAgIC8qKgorICAgICAqIE1BSU4gQVBQTElDQVRJT04KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBpcyBmb3IgdXNpbmcgdGhlIGdlbmVyYXRvciBhcyBwYXJ0IG9mIHRoZSBqYXZhIGJ1aWxkIHByb2Nlc3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBjb21tYW5kbGluZSBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwIHx8IChhcmdzLmxlbmd0aCAlIDIpICE9IDApIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGdlbmVyYXRvciBbLW9wdGlvbnNdXG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgICAtZnVsbCA8dHJ1ZXxmYWxzZT4gICAgIFRydWUgaWYgd2Ugc2hvdWxkIGJ1aWxkIHRoZSB3aG9sZSBMQUYgb3IgZmFsc2UgZm9yIGJ1aWxkaW5nIGp1c3Qgc3RhdGVzIGFuZCBwYWludGVycy5cbiIgKworICAgICAgICAgICAgICAgICAgICAiICAgIC1za2luRmlsZSA8dmFsdWU+ICAgICAgUGF0aCB0byB0aGUgc2tpbi5sYWYgZmlsZSBmb3IgdGhlIExBRiB0byBiZSBnZW5lcmF0ZWQgZnJvbS5cbiIgKworICAgICAgICAgICAgICAgICAgICAiICAgIC1idWlsZERpciA8dmFsdWU+ICAgICAgVGhlIGRpcmVjdG9yeSBiZW5lYXRoIHdoaWNoIHRoZSBidWlsZC1jb250cm9sbGVkIGFydGlmYWN0cyAoc3VjaCBhcyB0aGUgUGFpbnRlcnMpIHNob3VsZFxuIiArCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBwbGFjZWQuIFRoaXMgaXMgdGhlIHJvb3QgZGlyZWN0b3J5IGJlbmVhdGggd2hpY2ggdGhlIG5lY2Vzc2FyeSBwYWNrYWdlcyBhbmQgc291cmNlXG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHdpbGwgYmUgY3JlYXRlZC5cbiIgKworICAgICAgICAgICAgICAgICAgICAiICAgIC1zcmNEaXIgPHZhbHVlPiAgICAgICAgVGhlIGRpcmVjdG9yeSBiZW5lYXRoIHdoaWNoIHRoZSBub3JtYWwgdXNlci1jb250cm9sbGVkIGFydGlmYWN0cyAoc3VjaCBhcyB0aGUgY29yZVxuIiArCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rQW5kRmVlbCBmaWxlKSBzaG91bGQgYmUgcGxhY2VkLiBUaGVzZSBhcmUgb25lLXRpbWUgZ2VuZXJhdGVkIGZpbGVzLiBUaGlzIGlzIHRoZSByb290XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBiZW5lYXRoIHdoaWNoIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQuXG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgICAtcmVzb3VyY2VzRGlyIDx2YWx1ZT4gIFRoZSByZXNvdXJjZXMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGVtcGxhdGVzIGFuZCBpbWFnZXMuXG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgICAtcGFja2FnZVByZWZpeCA8dmFsdWU+IFRoZSBwYWNrYWdlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3ludGggbG9vayBhbmQgZmVlbC4gRm9yIGV4YW1wbGUsXG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JnLm15cGFja2FnZS5teWxhZlwiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgICAtbGFmTmFtZSA8dmFsdWU+ICAgICAgIFRoZSBuYW1lIG9mIHRoZSBsYWYsIHN1Y2ggYXMgXCJNeUxBRlwiLlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sZWFuIGZ1bGwgPSBmYWxzZTsKKyAgICAgICAgICAgIEZpbGUgc2tpbkZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgICAgICAgICAgRmlsZSBidWlsZERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgICAgICAgICBGaWxlIHNyY0RpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgICAgICAgICBGaWxlIHJlc291cmNlc0RpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZVByZWZpeCA9ICJvcmcubXlwYWNrYWdlLm15bGFmIjsKKyAgICAgICAgICAgIFN0cmluZyBsYWZOYW1lID0gIk15TEFGIjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhcmdzW2ldLnRyaW0oKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGFyZ3NbaSArIDFdLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpZiAoIi1mdWxsIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBmdWxsID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1za2luZmlsZSIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpbkZpbGUgPSBuZXcgRmlsZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLWJ1aWxkZGlyIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBidWlsZERpciA9IG5ldyBGaWxlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItc3JjZGlyIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBzcmNEaXIgPSBuZXcgRmlsZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLXJlc291cmNlc2RpciIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzRGlyID0gbmV3IEZpbGUodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1wYWNrYWdlcHJlZml4Ii5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlUHJlZml4ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLWxhZm5hbWUiLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIGxhZk5hbWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyBHRU5FUkFUSU5HIExBRiBDT0RFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIGZ1bGwgICAgICAgICAgOiIgKyBmdWxsKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgc2tpbkZpbGUgICAgICA6IiArIHNraW5GaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgYnVpbGREaXIgICAgICA6IiArIGJ1aWxkRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgc3JjRGlyICAgICAgICA6IiArIHNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIHJlc291cmNlc0RpciAgOiIgKyByZXNvdXJjZXNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBwYWNrYWdlUHJlZml4IDoiICtwYWNrYWdlUHJlZml4KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgbGFmTmFtZSAgICAgICA6IiArbGFmTmFtZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIExPQUQgU0tJTiBNT0RFTAorICAgICAgICAgICAgICAgIElCaW5kaW5nRmFjdG9yeSBiaW5kaW5nRmFjdG9yeSA9IEJpbmRpbmdEaXJlY3RvcnkuZ2V0RmFjdG9yeShTeW50aE1vZGVsLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBJVW5tYXJzaGFsbGluZ0NvbnRleHQgbWN0eCA9IGJpbmRpbmdGYWN0b3J5LmNyZWF0ZVVubWFyc2hhbGxpbmdDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgbWN0eC5zZXREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHNraW5GaWxlKSwgIlVURi04Iik7CisgICAgICAgICAgICAgICAgLy8gcGFzcyByZXNvdXJjZXMgZGlyZWN0b3J5IGluIGFzIHVzZXIgY29udGV4dCBzbyBpdCBjYW4gYmUgdXNlZCBpbiBTeW50aE1vZGVsIHByZVNldAorICAgICAgICAgICAgICAgIG1jdHguc2V0VXNlckNvbnRleHQocmVzb3VyY2VzRGlyKTsKKyAgICAgICAgICAgICAgICBTeW50aE1vZGVsIG1vZGVsID0gKFN5bnRoTW9kZWwpIG1jdHgudW5tYXJzaGFsRWxlbWVudCgpOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbmQgcnVuIGdlbmVyYXRvcgorICAgICAgICAgICAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgR2VuZXJhdG9yKGZ1bGwsIGJ1aWxkRGlyLCBzcmNEaXIsIHBhY2thZ2VQcmVmaXgsIGxhZk5hbWUsIG1vZGVsKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuZ2VuZXJhdGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBsb2FkaW5nIHNraW4gYW5kIGdlbmVyYXRpbmcgamF2YSBzcmM6Iik7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgR2VuZXJhdG9yLCBjYXBhYmxlIG9mIG91dHB1dHRpbmcgdGhlIHNvdXJjZSBjb2RlIGFydGlmYWN0cyByZWxhdGVkIHRvIGEgZ2l2ZW4gU3ludGhNb2RlbC4gSXQgaXMKKyAgICAgKiBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgdGhlIG9uZS10aW1lIGFydGlmYWN0cyBpbiBhZGRpdGlvbiB0byB0aGUgcmVnZW5lcmF0aW9uIG9mIGJ1aWxkLWNvbnRyb2xsZWQgYXJ0aWZhY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGZ1bGwgICAgICAgICAgICAgIFRydWUgaWYgd2Ugc2hvdWxkIGJ1aWxkIHRoZSB3aG9sZSBMQUYgb3IgZmFsc2UgZm9yIGJ1aWxkaW5nIGp1c3Qgc3RhdGVzIGFuZCBwYWludGVycy4KKyAgICAgKiBAcGFyYW0gYnVpbGREaXIgICAgICAgICAgVGhlIGRpcmVjdG9yeSBiZW5lYXRoIHdoaWNoIHRoZSBidWlsZC1jb250cm9sbGVkIGFydGlmYWN0cyAoc3VjaCBhcyB0aGUgUGFpbnRlcnMpIHNob3VsZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBwbGFjZWQuIFRoaXMgaXMgdGhlIHJvb3QgZGlyZWN0b3J5IGJlbmVhdGggd2hpY2ggdGhlIG5lY2Vzc2FyeSBwYWNrYWdlcyBhbmQgc291cmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gc3JjRGlyICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBiZW5lYXRoIHdoaWNoIHRoZSBub3JtYWwgdXNlci1jb250cm9sbGVkIGFydGlmYWN0cyAoc3VjaCBhcyB0aGUgY29yZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rQW5kRmVlbCBmaWxlKSBzaG91bGQgYmUgcGxhY2VkLiBUaGVzZSBhcmUgb25lLXRpbWUgZ2VuZXJhdGVkIGZpbGVzLiBUaGlzIGlzIHRoZSByb290CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBiZW5lYXRoIHdoaWNoIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lUHJlZml4IFRoZSBwYWNrYWdlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3ludGggbG9vayBhbmQgZmVlbC4gRm9yIGV4YW1wbGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5teXBhY2thZ2UubXlsYWYKKyAgICAgKiBAcGFyYW0gbGFmTmFtZSAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGxhZiwgc3VjaCBhcyBNeUxBRi4KKyAgICAgKiBAcGFyYW0gbW9kZWwgICAgICAgICAgICAgVGhlIGFjdHVhbCBTeW50aE1vZGVsIHRvIGJhc2UgdGhlc2UgZ2VuZXJhdGVkIGZpbGVzIG9uLgorICAgICAqLworICAgIHB1YmxpYyBHZW5lcmF0b3IoYm9vbGVhbiBmdWxsLCBGaWxlIGJ1aWxkRGlyLCBGaWxlIHNyY0RpciwgU3RyaW5nIHBhY2thZ2VOYW1lUHJlZml4LCBTdHJpbmcgbGFmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFN5bnRoTW9kZWwgbW9kZWwpIHsKKyAgICAgICAgdGhpcy5mdWxsID0gZnVsbDsKKyAgICAgICAgLy92YWxpZGF0ZSB0aGUgaW5wdXQgdmFyaWFibGVzCisgICAgICAgIGlmIChwYWNrYWdlTmFtZVByZWZpeCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IGEgcGFja2FnZSBuYW1lIHByZWZpeCIpOworICAgICAgICB9CisgICAgICAgIGlmIChidWlsZERpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IHRoZSBidWlsZCBkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIllvdSBtdXN0IHNwZWNpZnkgdGhlIHNvdXJjZSBkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmeSB0aGUgU3ludGhNb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChsYWZOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIllvdSBtdXN0IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGxvb2sgYW5kIGZlZWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vY29uc3RydWN0IHRoZSBtYXAgd2hpY2ggaXMgdXNlZCB0byBkbyB2YXJpYWJsZSBzdWJzdGl0dXRpb24gb2YgdGhlIHRlbXBsYXRlCisgICAgICAgIC8vZmlsZXMKKyAgICAgICAgdmFyaWFibGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHZhcmlhYmxlcy5wdXQoIlBBQ0tBR0UiLCBwYWNrYWdlTmFtZVByZWZpeCk7CisgICAgICAgIHZhcmlhYmxlcy5wdXQoIkxBRl9OQU1FIiwgbGFmTmFtZSk7CisKKyAgICAgICAgLy9nZW5lcmF0ZSBhbmQgc2F2ZSByZWZlcmVuY2VzIHRvIHRoZSBwYWNrYWdlLXJvb3QgZGlyZWN0b3JpZXMuCisgICAgICAgIC8vKFRoYXQgaXMsIGdpdmVuIHRoZSBidWlsZERpciBhbmQgc3JjRGlyLCBnZW5lcmF0ZSByZWZlcmVuY2VzIHRvIHRoZQorICAgICAgICAvL29yZy5teXBhY2thZ2UubXlsYWYgc3ViZGlyZWN0b3JpZXMpCisgICAgICAgIGJ1aWxkUGFja2FnZVJvb3QgPSBuZXcgRmlsZShidWlsZERpciwgcGFja2FnZU5hbWVQcmVmaXgucmVwbGFjZUFsbCgiXFwuIiwgIlxcLyIpKTsKKyAgICAgICAgYnVpbGRQYWNrYWdlUm9vdC5ta2RpcnMoKTsKKyAgICAgICAgc3JjUGFja2FnZVJvb3QgPSBuZXcgRmlsZShzcmNEaXIsIHBhY2thZ2VOYW1lUHJlZml4LnJlcGxhY2VBbGwoIlxcLiIsICJcXC8iKSk7CisgICAgICAgIHNyY1BhY2thZ2VSb290Lm1rZGlycygpOworCisgICAgICAgIC8vc2F2ZSB0aGUgdmFyaWFibGVzCisgICAgICAgIHRoaXMucGFja2FnZU5hbWVQcmVmaXggPSBwYWNrYWdlTmFtZVByZWZpeDsKKyAgICAgICAgdGhpcy5sYWZOYW1lID0gbGFmTmFtZTsKKyAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgeworICAgICAgICAvL0dlbmVyYXRlIHRoZSBvbmUtdGltZSBmaWxlcy4gSWYgdGhlc2UgZmlsZXMgYWxyZWFkeSBleGlzdCwgc2tpcCB0aGUKKyAgICAgICAgLy9vbmVzIHRoYXQgZXhpc3QgYW5kIGNyZWF0ZSB0aGUgbWlzc2luZyBvbmVzLiBSZWdpc3RlciB3YXJuaW5ncyBmb3IgdGhlCisgICAgICAgIC8vYWxyZWFkeSBleGlzdGluZyBmaWxlcy4KKworICAgICAgICAvL1RPRE8gU2tpcCBleGlzdGluZyBmaWxlcywgc2VuZCB3YXJuaW5ncywgZXRjLgorICAgICAgICBpZiAoZnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvL2NyZWF0ZSB0aGUgTG9va0FuZEZlZWwgZmlsZQorICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9Mb29rQW5kRmVlbC50ZW1wbGF0ZSIpOworICAgICAgICAgICAgICAgIHdyaXRlU3JjRmlsZSh0ZW1wbGF0ZSwgdmFyaWFibGVzLCBuZXcgRmlsZShzcmNQYWNrYWdlUm9vdCwgbGFmTmFtZSArICJMb29rQW5kRmVlbC5qYXZhIikpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9jcmVhdGUgdGhlIHBhaW50ZXJzIGFuZCBzdWNoLgorICAgICAgICByZWdlbmVyYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnZW5lcmF0ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmdWxsKSB7CisgICAgICAgICAgICAgICAgLy9maXJzdCwgY3JlYXRlIHRoZSBBYnN0cmFjdFJlZ2lvblBhaW50ZXIuamF2YSBmaWxlLgorICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9BYnN0cmFjdFJlZ2lvblBhaW50ZXIudGVtcGxhdGUiKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNyY0ZpbGUodGVtcGxhdGUsIHZhcmlhYmxlcywgbmV3IEZpbGUoYnVpbGRQYWNrYWdlUm9vdCwgIkFic3RyYWN0UmVnaW9uUGFpbnRlci5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgQmxlbmRpbmdNb2RlLmphdmEKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9CbGVuZGluZ01vZGUudGVtcGxhdGUiKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNyY0ZpbGUodGVtcGxhdGUsIHZhcmlhYmxlcywgbmV3IEZpbGUoYnVpbGRQYWNrYWdlUm9vdCwgIkJsZW5kaW5nTW9kZS5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy9jcmVhdGUgdGhlIFN5bnRoUGFpbnRlckltcGwgY2xhc3MKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9TeW50aFBhaW50ZXJJbXBsLnRlbXBsYXRlIik7CisgICAgICAgICAgICAgICAgd3JpdGVTcmNGaWxlKHRlbXBsYXRlLCB2YXJpYWJsZXMsIG5ldyBGaWxlKGJ1aWxkUGFja2FnZVJvb3QsICJTeW50aFBhaW50ZXJJbXBsLmphdmEiKSk7CisKKyAgICAgICAgICAgICAgICAvL2NyZWF0ZSB0aGUgSWNvbkltcGwgY2xhc3MKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9JY29uSW1wbC50ZW1wbGF0ZSIpOworICAgICAgICAgICAgICAgIHdyaXRlU3JjRmlsZSh0ZW1wbGF0ZSwgdmFyaWFibGVzLCBuZXcgRmlsZShidWlsZFBhY2thZ2VSb290LCBsYWZOYW1lICsgIkljb24uamF2YSIpKTsKKworICAgICAgICAgICAgICAgIC8vY3JlYXRlIHRoZSBTdHlsZUltcGwgY2xhc3MKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9TdHlsZUltcGwudGVtcGxhdGUiKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNyY0ZpbGUodGVtcGxhdGUsIHZhcmlhYmxlcywgbmV3IEZpbGUoYnVpbGRQYWNrYWdlUm9vdCwgbGFmTmFtZSArICJTdHlsZS5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgRWZmZWN0LmphdmEKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9FZmZlY3QudGVtcGxhdGUiKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNyY0ZpbGUodGVtcGxhdGUsIHZhcmlhYmxlcywgbmV3IEZpbGUoYnVpbGRQYWNrYWdlUm9vdCwgIkVmZmVjdC5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgRWZmZWN0VXRpbHMuamF2YQorICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gcmVhZCgicmVzb3VyY2VzL0VmZmVjdFV0aWxzLnRlbXBsYXRlIik7CisgICAgICAgICAgICAgICAgd3JpdGVTcmNGaWxlKHRlbXBsYXRlLCB2YXJpYWJsZXMsIG5ldyBGaWxlKGJ1aWxkUGFja2FnZVJvb3QsICJFZmZlY3RVdGlscy5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgU2hhZG93RWZmZWN0LmphdmEKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9TaGFkb3dFZmZlY3QudGVtcGxhdGUiKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNyY0ZpbGUodGVtcGxhdGUsIHZhcmlhYmxlcywgbmV3IEZpbGUoYnVpbGRQYWNrYWdlUm9vdCwgIlNoYWRvd0VmZmVjdC5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgRHJvcFNoYWRvd0VmZmVjdC5qYXZhCisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSByZWFkKCJyZXNvdXJjZXMvRHJvcFNoYWRvd0VmZmVjdC50ZW1wbGF0ZSIpOworICAgICAgICAgICAgICAgIHdyaXRlU3JjRmlsZSh0ZW1wbGF0ZSwgdmFyaWFibGVzLCBuZXcgRmlsZShidWlsZFBhY2thZ2VSb290LCAiRHJvcFNoYWRvd0VmZmVjdC5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgSW5uZXJTaGFkb3dFZmZlY3QuamF2YQorICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gcmVhZCgicmVzb3VyY2VzL0lubmVyU2hhZG93RWZmZWN0LnRlbXBsYXRlIik7CisgICAgICAgICAgICAgICAgd3JpdGVTcmNGaWxlKHRlbXBsYXRlLCB2YXJpYWJsZXMsIG5ldyBGaWxlKGJ1aWxkUGFja2FnZVJvb3QsICJJbm5lclNoYWRvd0VmZmVjdC5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgSW5uZXJHbG93RWZmZWN0LmphdmEKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9Jbm5lckdsb3dFZmZlY3QudGVtcGxhdGUiKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNyY0ZpbGUodGVtcGxhdGUsIHZhcmlhYmxlcywgbmV3IEZpbGUoYnVpbGRQYWNrYWdlUm9vdCwgIklubmVyR2xvd0VmZmVjdC5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgT3V0ZXJHbG93RWZmZWN0LmphdmEKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9PdXRlckdsb3dFZmZlY3QudGVtcGxhdGUiKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNyY0ZpbGUodGVtcGxhdGUsIHZhcmlhYmxlcywgbmV3IEZpbGUoYnVpbGRQYWNrYWdlUm9vdCwgIk91dGVyR2xvd0VmZmVjdC5qYXZhIikpOworCisgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgU3RhdGUuamF2YQorICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gcmVhZCgicmVzb3VyY2VzL1N0YXRlLnRlbXBsYXRlIik7CisgICAgICAgICAgICAgICAgd3JpdGVTcmNGaWxlKHRlbXBsYXRlLCB2YXJpYWJsZXMsIG5ldyBGaWxlKGJ1aWxkUGFja2FnZVJvb3QsICJTdGF0ZS5qYXZhIikpOworCisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSByZWFkKCJyZXNvdXJjZXMvSW1hZ2VDYWNoZS50ZW1wbGF0ZSIpOworICAgICAgICAgICAgICAgIHdyaXRlU3JjRmlsZSh0ZW1wbGF0ZSwgdmFyaWFibGVzLCBuZXcgRmlsZShidWlsZFBhY2thZ2VSb290LCAiSW1hZ2VDYWNoZS5qYXZhIikpOworCisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSByZWFkKCJyZXNvdXJjZXMvSW1hZ2VTY2FsaW5nSGVscGVyLnRlbXBsYXRlIik7CisgICAgICAgICAgICAgICAgd3JpdGVTcmNGaWxlKHRlbXBsYXRlLCB2YXJpYWJsZXMsIG5ldyBGaWxlKGJ1aWxkUGFja2FnZVJvb3QsICJJbWFnZVNjYWxpbmdIZWxwZXIuamF2YSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vbmV4dCwgcG9wdWxhdGUgdGhlIGZpcnN0IHNldCBvZiB1aSBkZWZhdWx0cyBiYXNlZCBvbiB3aGF0IGlzIGluIHRoZQorICAgICAgICAgICAgLy92YXJpb3VzIHBhbGV0dGVzIG9mIHRoZSBzeW50aCBtb2RlbAorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB1aURlZmF1bHRJbml0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3R5bGVJbml0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIERlZmF1bHRzR2VuZXJhdG9yLmdlbmVyYXRlRGVmYXVsdHModWlEZWZhdWx0SW5pdCwgc3R5bGVJbml0LCBtb2RlbCwgdmFyaWFibGVzLCBwYWNrYWdlTmFtZVByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRQYWNrYWdlUm9vdCk7CisgICAgICAgICAgICB2YXJpYWJsZXMucHV0KCJVSV9ERUZBVUxUX0lOSVQiLCB1aURlZmF1bHRJbml0LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdmFyaWFibGVzLnB1dCgiU1RZTEVfSU5JVCIsIHN0eWxlSW5pdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdyaXRlU3JjRmlsZShyZWFkKCJyZXNvdXJjZXMvRGVmYXVsdHMudGVtcGxhdGUiKSwgdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShidWlsZFBhY2thZ2VSb290LCBsYWZOYW1lICsgIkRlZmF1bHRzLmphdmEiKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9nZW5lcmF0b3IvR2VuZXJhdG9yVXRpbHMuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9HZW5lcmF0b3JVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMGZiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9nZW5lcmF0b3IvR2VuZXJhdG9yVXRpbHMuamF2YQpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5nZW5lcmF0b3I7CisKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLlJlZ2lvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoQ29uc3RhbnRzOworCisvKioKKyAqIEdlbmVyYXRvclV0aWxzCisgKgorICogQGF1dGhvciAgUmljaGFyZCBCYWlyCisgKiBAYXV0aG9yICBKYXNwZXIgUG90dHMKKyAqLworY2xhc3MgR2VuZXJhdG9yVXRpbHMgeworICAgIHByaXZhdGUgR2VuZXJhdG9yVXRpbHMoKSB7fQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBzeW50aCBzdGF0ZSwgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBuYW1lIGFzIGl0IHdvdWxkIGJlIHVzZWQgZm9yIGEgdWkgZGVmYXVsdCBrZXkuCisgICAgICogPHAvPgorICAgICAqIEZvciBleGFtcGxlOgorICAgICAqIDxwLz4KKyAgICAgKiBlbmFibGVkIGVuYWJsZWQrb3ZlciBlbmFibGVkK292ZXIrc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIHRvVUlEZWZhdWx0S2V5KGludCBzdGF0ZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAoKHN0YXRlICYgU3ludGhDb25zdGFudHMuREVGQVVMVCkgPT0gU3ludGhDb25zdGFudHMuREVGQVVMVCkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiZGVmYXVsdCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5ESVNBQkxFRCkgPT0gU3ludGhDb25zdGFudHMuRElTQUJMRUQpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSBidWZmZXIuYXBwZW5kKCIrIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJkaXNhYmxlZCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5FTkFCTEVEKSA9PSBTeW50aENvbnN0YW50cy5FTkFCTEVEKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgYnVmZmVyLmFwcGVuZCgiKyIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiZW5hYmxlZCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5GT0NVU0VEKSA9PSBTeW50aENvbnN0YW50cy5GT0NVU0VEKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgYnVmZmVyLmFwcGVuZCgiKyIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiZm9jdXNlZCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5NT1VTRV9PVkVSKSA9PSBTeW50aENvbnN0YW50cy5NT1VTRV9PVkVSKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgYnVmZmVyLmFwcGVuZCgiKyIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgib3ZlciIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5QUkVTU0VEKSA9PSBTeW50aENvbnN0YW50cy5QUkVTU0VEKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgYnVmZmVyLmFwcGVuZCgiKyIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiZG93biIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5TRUxFQ1RFRCkgPT0gU3ludGhDb25zdGFudHMuU0VMRUNURUQpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSBidWZmZXIuYXBwZW5kKCIrIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJzZWxlY3RlZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvL3Rha2VzIGEgc3RhdGVzIHN0cmluZyBvZiB0aGUgZm9ybSBFbmFibGVkK0ZvbytCYXIuCisgICAgLy9yZW1vdmVzIGFueSB3aGl0ZXNwYWNlLiBSZXBsYWNlcyB0aGUgKyBzaWducyB3aXRoIEFuZC4KKyAgICBzdGF0aWMgU3RyaW5nIHRvQ2xhc3NOYW1lKFN0cmluZyBzdGF0ZXMpIHsKKyAgICAgICAgU3RyaW5nIHMgPSBzdGF0ZXMucmVwbGFjZSgiICIsICIiKTsKKyAgICAgICAgcyA9IHN0YXRlcy5yZXBsYWNlKCIrIiwgIkFuZCIpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICAvL3Rha2VzIGEgc3RhdGVzIHN0cmluZyBvZiB0aGUgZm9ybSBFbmFibGVkK0ZvbytCYXIuCisgICAgLy9yZW1vdmVzIGFueSB3aGl0ZXNwYWNlLiBSZXBsYWNlcyB0aGUgKyBzaWducyB3aXRoIF8uCisgICAgLy9jYXBpdGFsaXplcyB0aGUgd2hvbGUgbG90CisgICAgc3RhdGljIFN0cmluZyB0b0NvbnN0YW50TmFtZShTdHJpbmcgc3RhdGVzKSB7CisgICAgICAgIFN0cmluZyBzID0gc3RhdGVzLnJlcGxhY2UoIiAiLCAiIik7CisgICAgICAgIHMgPSBzdGF0ZXMucmVwbGFjZSgiKyIsICJfIik7CisgICAgICAgIHJldHVybiBzLnRvVXBwZXJDYXNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBzdHJpbmcgInMiIG9mIHRoZSBmb3JtOgorICAgICAqCisgICAgICogQS5cIkEuYVwiLkIKKyAgICAgKgorICAgICAqIE1ha2UgaXQgc3VjaCB0aGF0OgorICAgICAqCisgICAgICogQUFBQgorICAgICAqCisgICAgICogRm9yIGV4YW1wbGUsIENvbWJvQm94LlwiQ29tYm9Cb3guYXJyb3dCdXR0b25cIiB3b3VsZCBiZWNvbWUKKyAgICAgKiBDb21ib0JveENvbWJvQm94QXJyb3dCdXR0b24KKyAgICAgKgorICAgICAqIEBwYXJhbSBzCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgbWFrZVByZXR0eShTdHJpbmcgcykgeworICAgICAgICBjaGFyW10gc3JjID0gcy50b0NoYXJBcnJheSgpOworICAgICAgICBjaGFyW10gZHN0ID0gbmV3IGNoYXJbc3JjLmxlbmd0aF07CisgICAgICAgIGludCBkc3RJbmRleCA9IDA7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxzcmMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vaWYgdGhlIHNyYyBjaGFyIGlzIGEgcGVyaW9kIGFuZCB0aGVyZSBpcyBhIGZvbGxvd2luZyBjaGFyYWN0ZXIsCisgICAgICAgICAgICAvL21ha2Ugc3VyZSB0aGUgY2hhcmFjdGVyIGlzIGNhcGl0YWxpemVkLgorICAgICAgICAgICAgaWYgKChzcmNbaV0gPT0gJy4nIHx8IHNyY1tpXSA9PSAnOicpICYmIGkgPCBzcmMubGVuZ3RoIC0xKSB7CisgICAgICAgICAgICAgICAgc3JjW2krMV0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3JjW2krMV0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9pZiB0aGUgc3JjIGNoYXIgaXMgb25lIHRoYXQgaXMgdG8gYmUgcmVtb3ZlZCwgc2tpcCBpdC4KKyAgICAgICAgICAgIGlmIChzcmNbaV0gPT0gJy4nIHx8IHNyY1tpXSA9PSAnOicgfHwgc3JjW2ldID09ICdcXCcgfHwgc3JjW2ldID09ICciJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9jb3B5IG92ZXIgdGhlIGN1cnJlbnQgY2hhci4KKyAgICAgICAgICAgIGRzdFtkc3RJbmRleCsrXSA9IHNyY1tpXTsKKyAgICAgICAgfQorICAgICAgICAvL2F0IHRoaXMgcG9pbnQsIGRzdEluZGV4IGlzIDEgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IHZhbGlkIGluZGV4IHBvc2l0aW9uIGluIGRzdAorICAgICAgICAvL29yIGluIG90aGVyIHdvcmRzIGl0IHJlcHJlc2VudHMgdGhlIGNvdW50LgorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkc3QsIDAsIGRzdEluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBnaXZlbiBzeW50aCBzdGF0ZSBhcyBpZiBpdCB3ZXJlIHNwZWNpZmllZCBpbiBqYXZhIGNvZGUsIHN1Y2ggYXMKKyAgICAgKiA8cC8+CisgICAgICogU3ludGhDb25zdGFudHMuRU5BQkxFRCB8IFN5bnRoQ29uc3RhbnRzLk1PVVNFX09WRVIKKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIHRvSmF2YUxpc3QoaW50IHN0YXRlKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5ERUZBVUxUKSA9PSBTeW50aENvbnN0YW50cy5ERUZBVUxUKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJTeW50aENvbnN0YW50cy5ERUZBVUxUIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGF0ZSAmIFN5bnRoQ29uc3RhbnRzLkRJU0FCTEVEKSA9PSBTeW50aENvbnN0YW50cy5ESVNBQkxFRCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIGJ1ZmZlci5hcHBlbmQoIiB8ICIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiU3ludGhDb25zdGFudHMuRElTQUJMRUQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXRlICYgU3ludGhDb25zdGFudHMuRU5BQkxFRCkgPT0gU3ludGhDb25zdGFudHMuRU5BQkxFRCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIGJ1ZmZlci5hcHBlbmQoIiB8ICIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiU3ludGhDb25zdGFudHMuRU5BQkxFRCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5GT0NVU0VEKSA9PSBTeW50aENvbnN0YW50cy5GT0NVU0VEKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgYnVmZmVyLmFwcGVuZCgiIHwgIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJTeW50aENvbnN0YW50cy5GT0NVU0VEIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGF0ZSAmIFN5bnRoQ29uc3RhbnRzLk1PVVNFX09WRVIpID09IFN5bnRoQ29uc3RhbnRzLk1PVVNFX09WRVIpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSBidWZmZXIuYXBwZW5kKCIgfCAiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlN5bnRoQ29uc3RhbnRzLk1PVVNFX09WRVIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXRlICYgU3ludGhDb25zdGFudHMuUFJFU1NFRCkgPT0gU3ludGhDb25zdGFudHMuUFJFU1NFRCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIGJ1ZmZlci5hcHBlbmQoIiB8ICIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiU3ludGhDb25zdGFudHMuUFJFU1NFRCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5TRUxFQ1RFRCkgPT0gU3ludGhDb25zdGFudHMuU0VMRUNURUQpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSBidWZmZXIuYXBwZW5kKCIgfCAiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlN5bnRoQ29uc3RhbnRzLlNFTEVDVEVEIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgZ2l2ZW4gcmVnaW9uIG5hbWUgdG8gZGlzY292ZXIgaWYgaXQgaXMgb25lIG9mIHRoZSBzdGFuZGFyZCBzeW50aCByZWdpb25zLiBJZiBzbywgcmV0dXJuIHRoZSBuYW1lIGluCisgICAgICogY2FwcyBhbmQgc3VjaC4gT3RoZXJ3aXNlLCByZXR1cm4gYSBiaWcgZmF0IG51bGwuCisgICAgICogPHAvPgorICAgICAqIEkgaGF2ZSB0byBkbyB0aGlzIGJlY2F1c2UsIHVuZm9ydHVuYXRlbHksIHN5bnRoJ3MgUmVnaW9uIGRvZXNuJ3QgaW1wbGVtZW50IGVxdWFscy4KKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIGdldFJlZ2lvbk5hbWVDYXBzKFN0cmluZyByZWdpb25OYW1lKSB7CisgICAgICAgIGlmIChSZWdpb24uQVJST1dfQlVUVE9OLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiQVJST1dfQlVUVE9OIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uQlVUVE9OLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiQlVUVE9OIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uQ0hFQ0tfQk9YLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiQ0hFQ0tfQk9YIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uQ0hFQ0tfQk9YX01FTlVfSVRFTS5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIkNIRUNLX0JPWF9NRU5VX0lURU0iOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5DT0xPUl9DSE9PU0VSLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfQ0hPT1NFUiI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLkNPTUJPX0JPWC5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIkNPTUJPX0JPWCI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLkRFU0tUT1BfSUNPTi5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIkRFU0tUT1BfSUNPTiI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLkRFU0tUT1BfUEFORS5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIkRFU0tUT1BfUEFORSI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLkVESVRPUl9QQU5FLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiRURJVE9SX1BBTkUiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5GSUxFX0NIT09TRVIuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJGSUxFX0NIT09TRVIiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5GT1JNQVRURURfVEVYVF9GSUVMRC5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIkZPUk1BVFRFRF9URVhUX0ZJRUxEIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uSU5URVJOQUxfRlJBTUUuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJJTlRFUk5BTF9GUkFNRSI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLklOVEVSTkFMX0ZSQU1FX1RJVExFX1BBTkUuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJJTlRFUk5BTF9GUkFNRV9USVRMRV9QQU5FIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uTEFCRUwuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJMQUJFTCI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLkxJU1QuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJMSVNUIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uTUVOVS5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIk1FTlUiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5NRU5VX0JBUi5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIk1FTlVfQkFSIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uTUVOVV9JVEVNLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiTUVOVV9JVEVNIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uTUVOVV9JVEVNX0FDQ0VMRVJBVE9SLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiTUVOVV9JVEVNX0FDQ0VMRVJBVE9SIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uT1BUSU9OX1BBTkUuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJPUFRJT05fUEFORSI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLlBBTkVMLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiUEFORUwiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5QQVNTV09SRF9GSUVMRC5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlBBU1NXT1JEX0ZJRUxEIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uUE9QVVBfTUVOVS5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlBPUFVQX01FTlUiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5QT1BVUF9NRU5VX1NFUEFSQVRPUi5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlBPUFVQX01FTlVfU0VQQVJBVE9SIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uUFJPR1JFU1NfQkFSLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiUFJPR1JFU1NfQkFSIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uUkFESU9fQlVUVE9OLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiUkFESU9fQlVUVE9OIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uUkFESU9fQlVUVE9OX01FTlVfSVRFTS5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlJBRElPX0JVVFRPTl9NRU5VX0lURU0iOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5ST09UX1BBTkUuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJST09UX1BBTkUiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5TQ1JPTExfQkFSLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiU0NST0xMX0JBUiI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLlNDUk9MTF9CQVJfVEhVTUIuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJTQ1JPTExfQkFSX1RIVU1CIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uU0NST0xMX0JBUl9UUkFDSy5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlNDUk9MTF9CQVJfVFJBQ0siOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5TQ1JPTExfUEFORS5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlNDUk9MTF9QQU5FIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uU0VQQVJBVE9SLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiU0VQQVJBVE9SIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uU0xJREVSLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiU0xJREVSIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uU0xJREVSX1RIVU1CLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiU0xJREVSX1RIVU1CIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uU0xJREVSX1RSQUNLLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiU0xJREVSX1RSQUNLIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uU1BJTk5FUi5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlNQSU5ORVIiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5TUExJVF9QQU5FLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiU1BMSVRfUEFORSI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLlNQTElUX1BBTkVfRElWSURFUi5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlNQTElUX1BBTkVfRElWSURFUiI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLlRBQkJFRF9QQU5FLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVEFCQkVEX1BBTkUiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5UQUJCRURfUEFORV9DT05URU5ULmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVEFCQkVEX1BBTkVfQ09OVEVOVCI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLlRBQkJFRF9QQU5FX1RBQi5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRBQkJFRF9QQU5FX1RBQiI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLlRBQkJFRF9QQU5FX1RBQl9BUkVBLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVEFCQkVEX1BBTkVfVEFCX0FSRUEiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5UQUJMRS5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRBQkxFIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uVEFCTEVfSEVBREVSLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVEFCTEVfSEVBREVSIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uVEVYVF9BUkVBLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVEVYVF9BUkVBIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uVEVYVF9GSUVMRC5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRFWFRfRklFTEQiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5URVhUX1BBTkUuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJURVhUX1BBTkUiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5UT0dHTEVfQlVUVE9OLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVE9HR0xFX0JVVFRPTiI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLlRPT0xfQkFSLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVE9PTF9CQVIiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5UT09MX0JBUl9DT05URU5ULmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVE9PTF9CQVJfQ09OVEVOVCI7CisgICAgICAgIH0gZWxzZSBpZiAoUmVnaW9uLlRPT0xfQkFSX0RSQUdfV0lORE9XLmdldE5hbWUoKS5lcXVhbHMocmVnaW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVE9PTF9CQVJfRFJBR19XSU5ET1ciOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5UT09MX0JBUl9TRVBBUkFUT1IuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJUT09MX0JBUl9TRVBBUkFUT1IiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5UT09MX1RJUC5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRPT0xfVElQIjsKKyAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uVFJFRS5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRSRUUiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5UUkVFX0NFTEwuZ2V0TmFtZSgpLmVxdWFscyhyZWdpb25OYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJUUkVFX0NFTEwiOworICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5WSUVXUE9SVC5nZXROYW1lKCkuZXF1YWxzKHJlZ2lvbk5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIlZJRVdQT1JUIjsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIltJbmZvXSBDb3VsZG4ndCBmaW5kIGEgUmVnaW9uIGZvciAiICsgcmVnaW9uTmFtZSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9PYmplY3RDb2RlQ29udmVydG9ycy5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvZ2VuZXJhdG9yL09iamVjdENvZGVDb252ZXJ0b3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiMWU5YgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9PYmplY3RDb2RlQ29udmVydG9ycy5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvcjsKKworaW1wb3J0IGphdmEuYXd0Lio7CisKKy8qKgorICogT2JqZWN0Q29kZUNvbnZlcnRvcnMKKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgT2JqZWN0Q29kZUNvbnZlcnRvcnMgeworICAgIHN0YXRpYyBqYXZhLm1hdGguTWF0aENvbnRleHQgY3R4ID0gbmV3IGphdmEubWF0aC5NYXRoQ29udGV4dCgzKTsKKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgdmFsdWUgKHgpLCBlbmNvZGUgaXQgc3VjaCB0aGF0IDAgLT4gMSBpcyB0byB0aGUgbGVmdCBvZiBhLCAxIC0+IDIgaXMgYmV0d2VlbiBhIGFuZCBiLCBhbmQgMiAtPiAzCisgICAgICogaXMgdG8gdGhlIHJpZ2h0IG9mIGIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdyB3aWR0aCBpbiB0aGUgY2FzZSBvZiB0aGUgeCBheGlzLCBoZWlnaHQgaW4gdGhlIGNhc2Ugb2YgdGhlIHkgYXhpcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmxvYXQgZW5jb2RlKGZsb2F0IHgsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IHcpIHsKKyAgICAgICAgZmxvYXQgciA9IDA7CisgICAgICAgIGlmICh4IDwgYSkgeworICAgICAgICAgICAgciA9ICh4IC8gYSk7CisgICAgICAgIH0gZWxzZSBpZiAoeCA+IGIpIHsKKyAgICAgICAgICAgIHIgPSAyICsgKCh4IC0gYikgLyAodyAtIGIpKTsKKyAgICAgICAgfSBlbHNlIGlmICh4ID09IGEgJiYgeCA9PSBiKSB7CisgICAgICAgICAgICByZXR1cm4gMS41ZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIgPSAxICsgKCh4IC0gYSkgLyAoYiAtIGEpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGbG9hdC5pc05hTihyKSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbRXJyb3JdIEVuY291bnRlcmVkIE5hTjogZW5jb2RlKCIgKyB4ICsgIiwgIiArIGEgKyAiLCAiICsgYiArICIsICIgKyB3ICsgIikiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKEZsb2F0LmlzSW5maW5pdGUocikpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW0Vycm9yXSBFbmNvdW50ZXJlZCBJbmZpbml0eTogZW5jb2RlKCIgKyB4ICsgIiwgIiArIGEgKyAiLCAiICsgYiArICIsICIgKyB3ICsgIikiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKHIgPCAwKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIltFcnJvcl0gZW5jb2RlZCB2YWx1ZSB3YXMgbGVzcyB0aGFuIDA6IGVuY29kZSgiICsgeCArICIsICIgKyBhICsgIiwgIiArIGIgKyAiLCAiICsgdyArICIpIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmIChyID4gMykgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbRXJyb3JdIGVuY29kZWQgdmFsdWUgd2FzIGdyZWF0ZXIgdGhhbiAzOiBlbmNvZGUoIiArIHggKyAiLCAiICsgYSArICIsICIgKyBiICsgIiwgIiArIHcgKyAiKSIpOworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL2ZvciBwcmV0dHluZXNzIHNha2UgKGFuZCBzaW5jZSB3ZSBhcmVuJ3QgcmVhbGx5IGdvaW5nIHRvIG1pc3MKKyAgICAgICAgICAgIC8vYW55IGFjY3VyYWN5IGhlcmUpIEknbSByb3VuZGluZyB0aGlzIHRvIDMgZGVjaW1hbCBwbGFjZXMKKy8vICAgICAgICAgICAgICAgIHJldHVybiBqYXZhLm1hdGguQmlnRGVjaW1hbC52YWx1ZU9mKHIpLnJvdW5kKGN0eCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBjb252ZXJ0KFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vVE9ETyBuZWVkIHRvIHN1cHBvcnQgd3JpdGluZyBvdXQgb3RoZXIgUGFpbnRzLCBzdWNoIGFzIGdyYWRpZW50cworICAgICAgICBpZiAocGFpbnQgaW5zdGFuY2VvZiBDb2xvcikgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoKENvbG9yKSBwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIltXQVJOSU5HXSBVbmFibGUgdG8gZW5jb2RlIGEgcGFpbnQgaW4gdGhlIGVuY29kZShQYWludCkgbWV0aG9kOiAiICsgcGFpbnQpOworICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgQ29sb3IsIHdyaXRlIG91dCB0aGUgamF2YSBjb2RlIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIG5ldyBDb2xvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xvciBUaGUgY29sb3IgdG8gY29udmVydAorICAgICAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBjb2RlIGZvciB0aGUgY29sb3IKKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIGNvbnZlcnQoQ29sb3IgY29sb3IpIHsKKyAgICAgICAgcmV0dXJuICJuZXcgQ29sb3IoIiArCisgICAgICAgICAgICAgICAgY29sb3IuZ2V0UmVkKCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICBjb2xvci5nZXRHcmVlbigpICsgIiwgIiArCisgICAgICAgICAgICAgICAgY29sb3IuZ2V0Qmx1ZSgpICsgIiwgIiArCisgICAgICAgICAgICAgICAgY29sb3IuZ2V0QWxwaGEoKSArICIpIjsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGNvbnZlcnQoSW5zZXRzIGkpIHsKKyAgICAgICAgcmV0dXJuICJuZXcgSW5zZXRzKCIgKyBpLnRvcCArICIsICIgKyBpLmxlZnQgKyAiLCAiICsgaS5ib3R0b20gKyAiLCAiICsgaS5yaWdodCArICIpIjsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGNvbnZlcnQoRGltZW5zaW9uIGQpIHsKKyAgICAgICAgcmV0dXJuICJuZXcgRGltZW5zaW9uKCIgKyBkLndpZHRoICsgIiwgIiArIGQuaGVpZ2h0ICsgIikiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvZ2VuZXJhdG9yL1BhaW50ZXJHZW5lcmF0b3IuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9QYWludGVyR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxZmIyMQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL2dlbmVyYXRvci9QYWludGVyR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw3NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuZ2VuZXJhdG9yOworCitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5CZXppZXJDb250cm9sUG9pbnQ7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5DYW52YXM7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5FbGxpcHNlU2hhcGU7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5MYXllcjsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlBhaW50ZWRTaGFwZTsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlBhdGhTaGFwZTsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLlJlY3RhbmdsZVNoYXBlOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuU2ltcGxlU2hhcGU7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5UZW1wbGF0ZUxheWVyOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuR3JhZGllbnQ7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5wYWludC5NYXR0ZTsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50LlBhaW50TW9kZWw7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5wYWludC5SYWRpYWxHcmFkaWVudDsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50LkdyYWRpZW50U3RvcDsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50LkFic3RyYWN0R3JhZGllbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvci5HZW5lcmF0b3JVdGlscy5tYWtlUHJldHR5OworaW1wb3J0IHN0YXRpYyBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5nZW5lcmF0b3IuR2VuZXJhdG9yVXRpbHMudG9DbGFzc05hbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvci5HZW5lcmF0b3JVdGlscy50b0NvbnN0YW50TmFtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuZ2VuZXJhdG9yLlRlbXBsYXRlV3JpdGVyLnJlYWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLmdlbmVyYXRvci5UZW1wbGF0ZVdyaXRlci53cml0ZVNyY0ZpbGU7CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSUljb25SZWdpb247CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVJlZ2lvbjsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJU3RhdGU7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKK2ltcG9ydCBqYXZhLmJlYW5zLkJlYW5zOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OworaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOworaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OworaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkpUZXh0Q29tcG9uZW50OworCisvKioKKyAqIFBhaW50ZXJHZW5lcmF0b3IgLSBDbGFzcyBmb3IgZ2VuZXJhdGluZyBQYWludGVyIGNsYXNzIGphdmEgc291cmNlIGZyb20gYSBDYW52YXMKKyAqCisgKiBGb2xsb3dpbmcgaW4gdGhlIGdlbmVyYWwgdGhlb3J5IHRoYXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIFBhaW50ZXIgZmlsZS4KKyAqCisgKiBFYWNoIFBhaW50ZXIgZmlsZSByZXByZXNlbnRzIGEgUmVnaW9uLiBTbyB0aGVyZSBpcyBvbmUgcGFpbnRlciBmaWxlIHBlciByZWdpb24uIEluCisgKiBza2luLmxhZiB3ZSBzdXBwb3J0IEljb24gc3VicmVnaW9ucywgd2hpY2ggYXJlIHJlYWxseSBqdXN0IGhhY2tlZCB2ZXJzaW9ucyBvZiB0aGUKKyAqIHBhcmVudCByZWdpb24uCisgKgorICogSW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIG1vc3QgY29tcGFjdCBhbmQgZWZmaWNpZW50IGJ5dGVjb2RlIHBvc3NpYmxlIGZvciB0aGUKKyAqIFBhaW50ZXJzLCB3ZSBhY3R1YWxseSBwZXJmb3JtIHRoZSBnZW5lcmF0aW9uIHNlcXVlbmNlIGluIHR3byBzdGVwcy4gVGhlIGZpcnN0CisgKiBzdGVwIGlzIHRoZSBhbmFseXNpcyBwaGFzZSwgd2hlcmUgd2Ugd2FsayB0aHJvdWdoIHRoZSBTeW50aE1vZGVsIGZvciB0aGUgcmVnaW9uCisgKiBhbmQgZGlzY292ZXIgY29tbW9uYWxpdHkgYW1vbmcgdGhlIGRpZmZlcmVudCBzdGF0ZXMgaW4gdGhlIHJlZ2lvbi4gRm9yIGV4YW1wbGUsCisgKiBkbyB0aGV5IGhhdmUgY29tbW9uIHBhdGhzPyBEbyB0aGV5IGhhdmUgY29tbW9uIGNvbG9ycz8gR3JhZGllbnRzPyBJcyB0aGUgcGFpbnRpbmcKKyAqIGNvZGUgZm9yIHRoZSBkaWZmZXJlbnQgc3RhdGVzIGlkZW50aWNhbCBvdGhlciB0aGFuIGZvciBjb2xvcnM/CisgKgorICogV2UgZ2F0aGVyIHRoaXMgaW5mb3JtYXRpb24gdXAuIE9uIHRoZSBzZWNvbmQgcGFzcywgd2UgdXNlIHRoaXMgZGF0YSB0byBkZXRlcm1pbmUgdGhlCisgKiBtZXRob2RzIHRoYXQgbmVlZCB0byBiZSBnZW5lcmF0ZWQsIGFuZCB0aGUgY2xhc3MgdmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBnZW5lcmF0ZWQuCisgKiBXZSB0cnkgdG8ga2VlcCB0aGUgYWN0dWFsIGJ5dGVjb2RlIGNvdW50IGFzIHNtYWxsIGFzIHBvc3NpYmxlIHNvIHRoYXQgd2UgbWF5IHJlZHVjZQorICogdGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgbG9vayBhbmQgZmVlbCBzaWduaWZpY2FudGx5LgorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBQYWludGVyR2VuZXJhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFpbnRlckltcGxUZW1wbGF0ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFpbnRlckltcGxUZW1wbGF0ZSgpIHsKKyAgICAgICAgaWYgKHBhaW50ZXJJbXBsVGVtcGxhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy9sb2FkIHRoZSBwYWludGVyIHRlbXBsYXRlIGZpbGUgaW50byBhbiBpbi1tZW1vcnkgc3RyaW5nIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKKyAgICAgICAgICAgIC8vd2hlbiBnZW5lcmF0aW5nIGEgbG90IG9mIGNsYXNzZXMKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGFpbnRlckltcGxUZW1wbGF0ZSA9IHJlYWQoInJlc291cmNlcy9QYWludGVySW1wbC50ZW1wbGF0ZSIpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRmFpbGVkIHRvIHJlYWQgdGVtcGxhdGUgZmlsZXMuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhaW50ZXJJbXBsVGVtcGxhdGU7CisgICAgfQorCisKKyAgICAvL2EgaGFuZGZ1bCBvZiBjb3VudGVycywgaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGFzc29jaWF0ZWQgb2JqZWN0IHR5cGUgaXMgZW5jb3VudGVkLgorICAgIC8vVGhlc2UgY291bnRlcnMgZm9ybSB0aGUgYmFzaXMgb2YgdGhlIGZpZWxkIGFuZCBtZXRob2Qgc3VmZml4ZXMuCisgICAgLy9UaGVzZSBhcmUgYWxsIDEgYmFzZWQsIGJlY2F1c2UgSSBmZWx0IGxpa2UgaXQgOi0pCisgICAgcHJpdmF0ZSBpbnQgY29sb3JDb3VudGVyID0gMTsKKyAgICBwcml2YXRlIGludCBncmFkaWVudENvdW50ZXIgPSAxOworICAgIHByaXZhdGUgaW50IHJhZGlhbENvdW50ZXIgPSAxOworICAgIHByaXZhdGUgaW50IHBhdGhDb3VudGVyID0gMTsKKyAgICBwcml2YXRlIGludCByZWN0Q291bnRlciA9IDE7CisgICAgcHJpdmF0ZSBpbnQgcm91bmRSZWN0Q291bnRlciA9IDE7CisgICAgcHJpdmF0ZSBpbnQgZWxsaXBzZUNvdW50ZXIgPSAxOworCisgICAgcHJpdmF0ZSBpbnQgc3RhdGVUeXBlQ291bnRlciA9IDE7CisKKyAgICAvL2R1cmluZyB0aGUgZmlyc3QgcGFzcywgd2Ugd2lsbCBjb25zdHJ1Y3QgdGhlc2UgbWFwcworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBjb2xvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAvKioKKyAgICAgKiBDb2RlPT5tZXRob2QgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0aG9kcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgLy90aGVzZSB2YXJpYWJsZXMgaG9sZCB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIGNvZGUgaW4gdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSB2YXJpb3VzIHN0YXRlIHR5cGVzCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHN0YXRlVHlwZUNvZGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgY29kZSBpbiB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgdXNlZCB0byBkZWZpbmUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgZm9yIHBhaW50aW5nCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHN3aXRjaENvZGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgY29kZSBpbiB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgdXNlZCB0byBkZWZpbmUgdGhlIG1ldGhvZHMgZm9yIHBhaW50aW5nIGVhY2ggc3RhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgcGFpbnRpbmdDb2RlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIGNvZGUgaW4gdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHVzZWQgdG8gYWRkIGdldEV4dGVuZGVkQ2FjaGVLZXlzCisgICAgICogaW1wbGVtZW50YXRpb24gaWYgbmVlZGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBnZXRFeHRlbmRlZENhY2hlS2V5c0NvZGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgY29kZSBpbiB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgdXNlZCB0byBkZWZpbmUgdGhlIG1ldGhvZHMgZm9yIGRlY29kaW5nIGdyYWRpZW50cworICAgICAqIGFuZCBzaGFwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGdyYWRpZW50c0NvZGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBjb2xvckNvZGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBzaGFwZXNDb2RlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAvKioKKyAgICAgKiBNYXAgb2YgY29tcG9uZW50IGNvbG9ycyBrZXllZCBieSBzdGF0ZSBjb25zdGFudCBuYW1lCisgICAgICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudENvbG9yPj4gY29tcG9uZW50Q29sb3JzTWFwID0KKyAgICAgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRDb2xvcj4+KCk7CisgICAgLyoqCisgICAgICogRm9yIHRoZSBjdXJyZW50IHN0YXRlIHRoZSBsaXN0IG9mIGFsbCBjb21wb25lbnQgY29sb3JzIHVzZWQgYnkgdGhpcworICAgICAqIHBhaW50ZXIsIHRoZSBpbmRleCBpbiB0aGlzIGxpc3QgaXMgYWxzbyB0aGUgaW5kZXggaW4gdGhlIHJ1bnRpbWUgYXJyYXkKKyAgICAgKiBvZiBkZWZhdWx0cyBhbmQga2V5cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8Q29tcG9uZW50Q29sb3I+IGNvbXBvbmVudENvbG9ycyA9IG51bGw7CisKKyAgICBQYWludGVyR2VuZXJhdG9yKFVJUmVnaW9uIHIpIHsKKyAgICAgICAgZ2VuZXJhdGUocik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKFVJUmVnaW9uIHIpIHsKKyAgICAgICAgZm9yIChVSVN0YXRlIHN0YXRlIDogci5nZXRCYWNrZ3JvdW5kU3RhdGVzKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tPiIgKyBzdGF0ZS5nZXROYW1lKCkpOworCisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gc3RhdGUuZ2V0Q2FudmFzKCk7CisgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHIgaW5zdGFuY2VvZiBVSUljb25SZWdpb24gPyAoKFVJSWNvblJlZ2lvbilyKS5nZXRLZXkoKSA6ICJCYWNrZ3JvdW5kIjsKKyAgICAgICAgICAgIGdlbmVyYXRlKHN0YXRlLCBjYW52YXMsIHR5cGUpOworICAgICAgICB9CisgICAgICAgIGZvciAoVUlTdGF0ZSBzdGF0ZSA6IHIuZ2V0Rm9yZWdyb3VuZFN0YXRlcygpKSB7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gc3RhdGUuZ2V0Q2FudmFzKCk7CisgICAgICAgICAgICBnZW5lcmF0ZShzdGF0ZSwgY2FudmFzLCAiRm9yZWdyb3VuZCIpOworICAgICAgICB9CisgICAgICAgIGZvciAoVUlTdGF0ZSBzdGF0ZSA6IHIuZ2V0Qm9yZGVyU3RhdGVzKCkpIHsKKyAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBzdGF0ZS5nZXRDYW52YXMoKTsKKyAgICAgICAgICAgIGdlbmVyYXRlKHN0YXRlLCBjYW52YXMsICJCb3JkZXIiKTsKKyAgICAgICAgfQorICAgICAgICAvL25vdyBjaGVjayBmb3IgYW55IHVpSWNvblJlZ2lvbnMsIHNpbmNlIHRoZXNlIGFyZSBjb2xsYXBzZWQgdG9nZXRoZXIuCisgICAgICAgIGZvciAoVUlSZWdpb24gc3ViIDogci5nZXRTdWJSZWdpb25zKCkpIHsKKyAgICAgICAgICAgIGlmIChzdWIgaW5zdGFuY2VvZiBVSUljb25SZWdpb24pIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZShzdWIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vZ2VuZXJhdGUgYWxsIHRoZSBjb2RlIGZvciBjb21wb25lbnQgY29sb3JzCisgICAgICAgIGlmICghY29tcG9uZW50Q29sb3JzTWFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZ2V0RXh0ZW5kZWRDYWNoZUtleXNDb2RlCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgICBwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RXh0ZW5kZWRDYWNoZUtleXMoSkNvbXBvbmVudCBjKSB7XG4iKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgICAgIE9iamVjdFtdIGV4dGVuZGVkQ2FjaGVLZXlzID0gbnVsbDtcbiIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgICAgICAgc3dpdGNoKHN0YXRlKSB7XG4iKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxDb21wb25lbnRDb2xvcj4+IGVudHJ5IDogY29tcG9uZW50Q29sb3JzTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBnZXRFeHRlbmRlZENhY2hlS2V5c0NvZGUKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICAgICAgICAgICAgY2FzZSAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVudHJ5LmdldEtleSgpKS5hcHBlbmQoIjpcbiIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgICAgICAgICAgICAgICBleHRlbmRlZENhY2hlS2V5cyA9IG5ldyBPYmplY3RbXSB7XG4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZW50cnkuZ2V0VmFsdWUoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRDb2xvciBjYyA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBnZXRFeHRlbmRlZENhY2hlS2V5c0NvZGUKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcG9uZW50Q29sb3IoYywgXCIiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNjLnByb3BlcnR5TmFtZSkuYXBwZW5kKCJcIiwgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYy5kZWZhdWx0Q29sb3JWYXJpYWJsZU5hbWUpLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNjLnNhdHVyYXRpb25PZmZzZXQpLmFwcGVuZCgiZiwgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYy5icmlnaHRuZXNzT2Zmc2V0KS5hcHBlbmQoImYsICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2MuYWxwaGFPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXh0ZW5kZWRDYWNoZUtleXNDb2RlLmFwcGVuZCgiKSxcbiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXh0ZW5kZWRDYWNoZUtleXNDb2RlLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdldEV4dGVuZGVkQ2FjaGVLZXlzQ29kZS5hcHBlbmQoIn07XG4iKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgICAgICAgICAgICAgYnJlYWs7XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEV4dGVuZGVkQ2FjaGVLZXlzQ29kZQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgICAgIH1cbiIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgICAgICAgcmV0dXJuIGV4dGVuZGVkQ2FjaGVLZXlzO1xuIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICAgIH0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vdHlwZSBpcyBiYWNrZ3JvdW5kLCBmb3JlZ3JvdW5kLCBib3JkZXIsIHVwQXJyb3dJY29uLCBldGMuCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKFVJU3RhdGUgc3RhdGUsIENhbnZhcyBjYW52YXMsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIFN0cmluZyBzdGF0ZXMgPSBVSVN0YXRlLmtleXNUb1N0cmluZyhzdGF0ZS5nZXRTdGF0ZUtleXMoKSk7CisgICAgICAgIFN0cmluZyBzdGF0ZVR5cGUgPSB0b0NvbnN0YW50TmFtZSh0eXBlICsgIl8iICsgc3RhdGVzKTsKKyAgICAgICAgU3RyaW5nIHBhaW50TWV0aG9kTmFtZSA9ICJwYWludCIgKyB0eXBlICsgdG9DbGFzc05hbWUoc3RhdGVzKTsKKyAgICAgICAgLy9jcmVhdGUgbmV3IGFycmF5IGZvciBjb21wb25lbnQgY29sb3JzIGZvciB0aGlzIHN0YXRlCisgICAgICAgIGNvbXBvbmVudENvbG9ycyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50Q29sb3I+KCk7CisKKyAgICAgICAgc3RhdGVUeXBlQ29kZS5hcHBlbmQoIiAgICBzdGF0aWMgZmluYWwgaW50ICIpLmFwcGVuZChzdGF0ZVR5cGUpLmFwcGVuZCgiID0gIikuYXBwZW5kKHN0YXRlVHlwZUNvdW50ZXIrKykuYXBwZW5kKCI7XG4iKTsKKworICAgICAgICBpZiAoY2FudmFzLmlzQmxhbmsoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoQ29kZS5hcHBlbmQoIiAgICAgICAgICAgIGNhc2UgIikuYXBwZW5kKHN0YXRlVHlwZSkuYXBwZW5kKCI6ICIpLmFwcGVuZChwYWludE1ldGhvZE5hbWUpLmFwcGVuZCgiKGcpOyBicmVhaztcbiIpOworICAgICAgICBwYWludGluZ0NvZGUuYXBwZW5kKCIgICAgcHJpdmF0ZSB2b2lkICIpLmFwcGVuZChwYWludE1ldGhvZE5hbWUpLmFwcGVuZCgiKEdyYXBoaWNzMkQgZykge1xuIik7CisKKyAgICAgICAgLy9zdGFydCBieSBzZXR0aW5nIHVwIGNvbW1vbiBpbmZvIG5lZWRlZCB0byBlbmNvZGUgdGhlIGNvbnRyb2wgcG9pbnRzCisgICAgICAgIEluc2V0cyBpbiA9IGNhbnZhcy5nZXRTdHJldGNoaW5nSW5zZXRzKCk7CisgICAgICAgIGZsb2F0IGEgPSBpbi5sZWZ0OworICAgICAgICBmbG9hdCBiID0gY2FudmFzLmdldFNpemUoKS53aWR0aCAtIGluLnJpZ2h0OworICAgICAgICBmbG9hdCBjID0gaW4udG9wOworICAgICAgICBmbG9hdCBkID0gY2FudmFzLmdldFNpemUoKS5oZWlnaHQgLSBpbi5ib3R0b207CisgICAgICAgIGZsb2F0IHdpZHRoID0gY2FudmFzLmdldFNpemUoKS53aWR0aDsKKyAgICAgICAgZmxvYXQgaGVpZ2h0ID0gY2FudmFzLmdldFNpemUoKS5oZWlnaHQ7CisgICAgICAgIGZsb2F0IGN3ID0gYiAtIGE7CisgICAgICAgIGZsb2F0IGNoID0gZCAtIGM7CisKKyAgICAgICAgTGF5ZXJbXSBsYXllcnMgPSBjYW52YXMuZ2V0TGF5ZXJzKCkudG9BcnJheShuZXcgTGF5ZXJbMF0pOworICAgICAgICBmb3IgKGludCBpbmRleD1sYXllcnMubGVuZ3RoLTE7IGluZGV4ID49IDA7IGluZGV4LS0pIHsKKyAgICAgICAgICAgIExheWVyIGxheWVyID0gbGF5ZXJzW2luZGV4XTsKKyAgICAgICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIFRlbXBsYXRlTGF5ZXIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc2hhcGVzIG11c3QgYmUgcGFpbnRlZCBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICBMaXN0PFNpbXBsZVNoYXBlPiBzaGFwZXMgPSBsYXllci5nZXRTaGFwZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9c2hhcGVzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBTaW1wbGVTaGFwZSBzID0gc2hhcGVzLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAocyBpbnN0YW5jZW9mIFBhaW50ZWRTaGFwZSkgeworICAgICAgICAgICAgICAgICAgICBQYWludGVkU2hhcGUgc2hhcGUgPSAoUGFpbnRlZFNoYXBlKXM7CisgICAgICAgICAgICAgICAgICAgIFBhaW50TW9kZWwgcGFpbnQgPSBzaGFwZS5nZXRQYWludE1vZGVsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFdlIGF0dGVtcHQgdG8gd3JpdGUgdGhlIG1pbmltYWwgbnVtYmVyIG9mIGJ5dGVjb2RlcyBhcyBwb3NzaWJsZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIGNvZGUuIER1ZSB0byB0aGUgaW5oZXJpdCBjb21wbGV4aXRpZXMgaW4gZGV0ZXJtaW5pbmcgd2hhdAorICAgICAgICAgICAgICAgICAgICAgICAgaXMgZXh0cmFuZW91cywgd2UgdXNlIHRoZSBmb2xsb3dpbmcgc3lzdGVtOgorCisgICAgICAgICAgICAgICAgICAgICAgICBXZSBmaXJzdCBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgdGhlIHNoYXBlLiBUaGVuLCB3ZSBjaGVjayB0byBzZWUgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2hhcGUgaGFzIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQuIElmIHNvLCB0aGVuIHdlIGRlZmVyIHRvIGFuCisgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyBtZXRob2QuIElmIG5vdCwgdGhlbiB3ZSB3aWxsIGNyZWF0ZSBhIG5ldyBtZXRob2RzLCBzdGljaworICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGUgaW4gaXQsIGFuZCByZWZlciB0byB0aGF0IG1ldGhvZC4KKyAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2hhcGVNZXRob2ROYW1lID0gbnVsbDsgLy8gd2lsbCBjb250YWluIHRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hpY2ggY3JlYXRlcyB0aGUgc2hhcGUKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNoYXBlVmFyaWFibGUgPSBudWxsOyAvLyB3aWxsIGJlIG9uZSBvZiByZWN0LCByb3VuZFJlY3QsIGVsbGlwc2UsIG9yIHBhdGguCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaGFwZU1ldGhvZEJvZHkgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzaGFwZSBpbnN0YW5jZW9mIFJlY3RhbmdsZVNoYXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGVTaGFwZSByc2hhcGUgPSAoUmVjdGFuZ2xlU2hhcGUpIHNoYXBlOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDEgPSBlbmNvZGUoKGZsb2F0KXJzaGFwZS5nZXRYMSgpLCBhLCBiLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MSA9IGVuY29kZSgoZmxvYXQpcnNoYXBlLmdldFkxKCksIGMsIGQsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiA9IGVuY29kZSgoZmxvYXQpcnNoYXBlLmdldFgyKCksIGEsIGIsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkyID0gZW5jb2RlKChmbG9hdClyc2hhcGUuZ2V0WTIoKSwgYywgZCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyc2hhcGUuaXNSb3VuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2l0IGlzIGEgcm91bmRlZCByZWN0YW5nbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByb3VuZGluZyA9IChmbG9hdClyc2hhcGUuZ2V0Um91bmRpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlTWV0aG9kQm9keSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByb3VuZFJlY3Quc2V0Um91bmRSZWN0KCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVEZWNvZGVYKHgxKSArICIsIC8veFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKyB3cml0ZURlY29kZVkoeTEpICsgIiwgLy95XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArIHdyaXRlRGVjb2RlWCh4MikgKyAiIC0gIiArIHdyaXRlRGVjb2RlWCh4MSkgKyAiLCAvL3dpZHRoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArIHdyaXRlRGVjb2RlWSh5MikgKyAiIC0gIiArIHdyaXRlRGVjb2RlWSh5MSkgKyAiLCAvL2hlaWdodFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKyByb3VuZGluZyArICJmLCAiICsgcm91bmRpbmcgKyAiZik7IC8vcm91bmRpbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlVmFyaWFibGUgPSAicm91bmRSZWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVNZXRob2RCb2R5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICByZWN0LnNldFJlY3QoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZURlY29kZVgoeDEpICsgIiwgLy94XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgIiArIHdyaXRlRGVjb2RlWSh5MSkgKyAiLCAvL3lcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAiICsgd3JpdGVEZWNvZGVYKHgyKSArICIgLSAiICsgd3JpdGVEZWNvZGVYKHgxKSArICIsIC8vd2lkdGhcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAiICsgd3JpdGVEZWNvZGVZKHkyKSArICIgLSAiICsgd3JpdGVEZWNvZGVZKHkxKSArICIpOyAvL2hlaWdodCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVWYXJpYWJsZSA9ICJyZWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSBpbnN0YW5jZW9mIEVsbGlwc2VTaGFwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRWxsaXBzZVNoYXBlIGVzaGFwZSA9IChFbGxpcHNlU2hhcGUpIHNoYXBlOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDEgPSBlbmNvZGUoKGZsb2F0KWVzaGFwZS5nZXRYMSgpLCBhLCBiLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MSA9IGVuY29kZSgoZmxvYXQpZXNoYXBlLmdldFkxKCksIGMsIGQsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiA9IGVuY29kZSgoZmxvYXQpZXNoYXBlLmdldFgyKCksIGEsIGIsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkyID0gZW5jb2RlKChmbG9hdCllc2hhcGUuZ2V0WTIoKSwgYywgZCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlTWV0aG9kQm9keSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIGVsbGlwc2Uuc2V0RnJhbWUoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRGVjb2RlWCh4MSkgKyAiLCAvL3hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICIgKyB3cml0ZURlY29kZVkoeTEpICsgIiwgLy95XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAiICsgd3JpdGVEZWNvZGVYKHgyKSArICIgLSAiICsgd3JpdGVEZWNvZGVYKHgxKSArICIsIC8vd2lkdGhcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICIgKyB3cml0ZURlY29kZVkoeTIpICsgIiAtICIgKyB3cml0ZURlY29kZVkoeTEpICsgIik7IC8vaGVpZ2h0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlVmFyaWFibGUgPSAiZWxsaXBzZSI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgaW5zdGFuY2VvZiBQYXRoU2hhcGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhTaGFwZSBwc2hhcGUgPSAoUGF0aFNoYXBlKSBzaGFwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QmV6aWVyQ29udHJvbFBvaW50PiBjb250cm9sUG9pbnRzID0gcHNoYXBlLmdldEJlemllckNvbnRyb2xQb2ludHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJlemllckNvbnRyb2xQb2ludCBmaXJzdCwgbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gbGFzdCA9IGNvbnRyb2xQb2ludHMuZ2V0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgICAgICBwYXRoLnJlc2V0KCk7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAgICAgICAgcGF0aC5tb3ZlVG8oIiArIHdyaXRlRGVjb2RlWChlbmNvZGUoKGZsb2F0KWZpcnN0LmdldFgoKSwgYSwgYiwgd2lkdGgpKSArICIsICIgKyB3cml0ZURlY29kZVkoZW5jb2RlKChmbG9hdClmaXJzdC5nZXRZKCksIGMsIGQsIGhlaWdodCkpICsgIik7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MTsgajxjb250cm9sUG9pbnRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmV6aWVyQ29udHJvbFBvaW50IGNwID0gY29udHJvbFBvaW50cy5nZXQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QuZ2V0Q3AyKCkuaXNTaGFycCgpICYmIGNwLmdldENwMSgpLmlzU2hhcnAoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4ID0gZW5jb2RlKChmbG9hdCljcC5nZXRYKCksIGEsIGIsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSA9IGVuY29kZSgoZmxvYXQpY3AuZ2V0WSgpLCBjLCBkLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgICAgIHBhdGgubGluZVRvKCIgKyB3cml0ZURlY29kZVgoeCkgKyAiLCAiICsgd3JpdGVEZWNvZGVZKHkpICsgIik7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MSA9IGVuY29kZSgoZmxvYXQpbGFzdC5nZXRYKCksIGEsIGIsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTEgPSBlbmNvZGUoKGZsb2F0KWxhc3QuZ2V0WSgpLCBjLCBkLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiA9IGVuY29kZSgoZmxvYXQpY3AuZ2V0WCgpLCBhLCBiLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkyID0gZW5jb2RlKChmbG9hdCljcC5nZXRZKCksIGMsIGQsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcGF0aC5jdXJ2ZVRvKCIgKyB3cml0ZURlY29kZUJlemllclgoeDEsIGxhc3QuZ2V0WCgpLCBsYXN0LmdldENwMlgoKSkgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3cml0ZURlY29kZUJlemllclkoeTEsIGxhc3QuZ2V0WSgpLCBsYXN0LmdldENwMlkoKSkgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3cml0ZURlY29kZUJlemllclgoeDIsIGNwLmdldFgoKSwgY3AuZ2V0Q3AxWCgpKSArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHdyaXRlRGVjb2RlQmV6aWVyWSh5MiwgY3AuZ2V0WSgpLCBjcC5nZXRDcDFZKCkpICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3JpdGVEZWNvZGVYKHgyKSArICIsICIgKyB3cml0ZURlY29kZVkoeTIpICsgIik7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGNwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QuZ2V0Q3AyKCkuaXNTaGFycCgpICYmIGZpcnN0LmdldENwMSgpLmlzU2hhcnAoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHggPSBlbmNvZGUoKGZsb2F0KWZpcnN0LmdldFgoKSwgYSwgYiwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkgPSBlbmNvZGUoKGZsb2F0KWZpcnN0LmdldFkoKSwgYywgZCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgICAgIHBhdGgubGluZVRvKCIgKyB3cml0ZURlY29kZVgoeCkgKyAiLCAiICsgd3JpdGVEZWNvZGVZKHkpICsgIik7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDEgPSBlbmNvZGUoKGZsb2F0KWxhc3QuZ2V0WCgpLCBhLCBiLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTEgPSBlbmNvZGUoKGZsb2F0KWxhc3QuZ2V0WSgpLCBjLCBkLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyID0gZW5jb2RlKChmbG9hdClmaXJzdC5nZXRYKCksIGEsIGIsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MiA9IGVuY29kZSgoZmxvYXQpZmlyc3QuZ2V0WSgpLCBjLCBkLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBwYXRoLmN1cnZlVG8oIiArIHdyaXRlRGVjb2RlQmV6aWVyWCh4MSwgbGFzdC5nZXRYKCksIGxhc3QuZ2V0Q3AyWCgpKSArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3JpdGVEZWNvZGVCZXppZXJZKHkxLCBsYXN0LmdldFkoKSwgbGFzdC5nZXRDcDJZKCkpICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3cml0ZURlY29kZUJlemllclgoeDIsIGZpcnN0LmdldFgoKSwgZmlyc3QuZ2V0Q3AxWCgpKSArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3JpdGVEZWNvZGVCZXppZXJZKHkyLCBmaXJzdC5nZXRZKCksIGZpcnN0LmdldENwMVkoKSkgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHdyaXRlRGVjb2RlWCh4MikgKyAiLCAiICsgd3JpdGVEZWNvZGVZKHkyKSArICIpO1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgICAgIHBhdGguY2xvc2VQYXRoKCk7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZU1ldGhvZEJvZHkgPSBidWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlVmFyaWFibGUgPSAicGF0aCI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGhhcHBlbiB1bmxlc3MgYSBuZXcgU2hhcGUgaGFzIGJlZW4gZGVmaW5lZCIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9ub3cgdGhhdCB3ZSBoYXZlIHRoZSBzaGFwZSBkZWZpbmVkIGluIHNoYXBlTWV0aG9kQm9keSwgYW5kIGEgc2hhcGVWYXJpYWJsZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAvL2xvb2sgdG8gc2VlIGlmIHN1Y2ggYSBib2R5IGhhcyBiZWVuIHByZXZpb3VzbHkgZGVmaW5lZC4KKyAgICAgICAgICAgICAgICAgICAgc2hhcGVNZXRob2ROYW1lID0gbWV0aG9kcy5nZXQoc2hhcGVNZXRob2RCb2R5KTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldHVyblR5cGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGVNZXRob2ROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgicmVjdCIuZXF1YWxzKHNoYXBlVmFyaWFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVNZXRob2ROYW1lID0gImRlY29kZVJlY3QiICsgcmVjdENvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gIlJlY3RhbmdsZTJEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInJvdW5kUmVjdCIuZXF1YWxzKHNoYXBlVmFyaWFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVNZXRob2ROYW1lID0gImRlY29kZVJvdW5kUmVjdCIgKyByb3VuZFJlY3RDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9ICJSb3VuZFJlY3RhbmdsZTJEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImVsbGlwc2UiLmVxdWFscyhzaGFwZVZhcmlhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlTWV0aG9kTmFtZSA9ICJkZWNvZGVFbGxpcHNlIiArIGVsbGlwc2VDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9ICJFbGxpcHNlMkQiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZU1ldGhvZE5hbWUgPSAiZGVjb2RlUGF0aCIgKyBwYXRoQ291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSAiUGF0aDJEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMucHV0KHNoYXBlTWV0aG9kQm9keSwgc2hhcGVNZXRob2ROYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9zaW5jZSB0aGUgbWV0aG9kIHdhc24ndCBwcmV2aW91c2x5IGRlZmluZWQsIHRpbWUgdG8gZGVmaW5lIGl0CisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZXNDb2RlLmFwcGVuZCgiICAgIHByaXZhdGUgIikuYXBwZW5kKHJldHVyblR5cGUpLmFwcGVuZCgiICIpLmFwcGVuZChzaGFwZU1ldGhvZE5hbWUpLmFwcGVuZCgiKCkge1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZXNDb2RlLmFwcGVuZChzaGFwZU1ldGhvZEJvZHkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVzQ29kZS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZXNDb2RlLmFwcGVuZCgiICAgICAgICByZXR1cm4gIiArIHNoYXBlVmFyaWFibGUgKyAiO1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZXNDb2RlLmFwcGVuZCgiICAgIH1cblxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL25vdyB0aGF0IHRoZSBtZXRob2QgaGFzIGJlZW4gZGVmaW5lZCwgSSBjYW4gZ28gb24gYW5kIGRlY29kZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy9wYWludC4gQWZ0ZXIgdGhlIHBhaW50IGlzIGRlY29kZWQsIEkgY2FuIHdyaXRlIHRoZSBnLmZpbGwoKSBtZXRob2QgY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgLy91c2luZyB0aGUgcmVzdWx0IG9mIHRoZSBzaGFwZU1ldGhvZE5hbWUuIFlheSEKKworLy8gICAgICAgICAgICBpZiAoc2hhcGVWYXJpYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy9maXJzdCwgY2FsY3VsYXRlIHRoZSBib3VuZHMgb2YgdGhlIHNoYXBlIGJlaW5nIHBhaW50ZWQgYW5kIHN0b3JlIGluIHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICBwYWludGluZ0NvZGUuYXBwZW5kKCIgICAgICAgICIpLmFwcGVuZChzaGFwZVZhcmlhYmxlKS5hcHBlbmQoIiA9ICIpLmFwcGVuZChzaGFwZU1ldGhvZE5hbWUpLmFwcGVuZCgiKCk7XG4iKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocGFpbnQgaW5zdGFuY2VvZiBNYXR0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbG9yVmFyaWFibGUgPSBlbmNvZGVNYXR0ZSgoTWF0dGUpcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRpbmdDb2RlLmFwcGVuZCgiICAgICAgICBnLnNldFBhaW50KCIpLmFwcGVuZChjb2xvclZhcmlhYmxlKS5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYWludCBpbnN0YW5jZW9mIEdyYWRpZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JhZGllbnRNZXRob2ROYW1lID0gZW5jb2RlR3JhZGllbnQoc2hhcGUsIChHcmFkaWVudClwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWludGluZ0NvZGUuYXBwZW5kKCIgICAgICAgIGcuc2V0UGFpbnQoIikuYXBwZW5kKGdyYWRpZW50TWV0aG9kTmFtZSkuYXBwZW5kKCIoIikuYXBwZW5kKHNoYXBlVmFyaWFibGUpLmFwcGVuZCgiKSk7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYWludCBpbnN0YW5jZW9mIFJhZGlhbEdyYWRpZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmFkaWFsTWV0aG9kTmFtZSA9IGVuY29kZVJhZGlhbChzaGFwZSwgKFJhZGlhbEdyYWRpZW50KXBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50aW5nQ29kZS5hcHBlbmQoIiAgICAgICAgZy5zZXRQYWludCgiKS5hcHBlbmQocmFkaWFsTWV0aG9kTmFtZSkuYXBwZW5kKCIoIikuYXBwZW5kKHNoYXBlVmFyaWFibGUpLmFwcGVuZCgiKSk7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYWludGluZ0NvZGUuYXBwZW5kKCIgICAgICAgIGcuZmlsbCgiKS5hcHBlbmQoc2hhcGVWYXJpYWJsZSkuYXBwZW5kKCIpO1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGFpbnRpbmdDb2RlLmFwcGVuZCgiXG4gICAgfVxuXG4iKTsKKworICAgICAgICAvL2NvbGxlY3QgY29tcG9uZW50IGNvbG9ycworICAgICAgICBpZiAoIWNvbXBvbmVudENvbG9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudENvbG9yc01hcC5wdXQoc3RhdGVUeXBlLCBjb21wb25lbnRDb2xvcnMpOworICAgICAgICAgICAgY29tcG9uZW50Q29sb3JzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmxvYXQgZW5jb2RlKGZsb2F0IHgsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IHdpZHRoKSB7CisgICAgICAgIHJldHVybiBPYmplY3RDb2RlQ29udmVydG9ycy5lbmNvZGUoeCwgYSwgYiwgd2lkdGgpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHdyaXRlRGVjb2RlWChmbG9hdCBlbmNvZGVkWCkgeworICAgICAgICByZXR1cm4gImRlY29kZVgoIiArIGVuY29kZWRYICsgImYpIjsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB3cml0ZURlY29kZVkoZmxvYXQgZW5jb2RlZFkpIHsKKyAgICAgICAgcmV0dXJuICJkZWNvZGVZKCIgKyBlbmNvZGVkWSArICJmKSI7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXggZW5jb2RlZCB4IHZhbHVlCisgICAgICogQHBhcmFtIHggdW5lbmNvZGVkIHggdmFsdWUKKyAgICAgKiBAcGFyYW0gY3B4IHVuZW5jb2RlZCBjcHggdmFsdWUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdyaXRlRGVjb2RlQmV6aWVyWChkb3VibGUgZXgsIGRvdWJsZSB4LCBkb3VibGUgY3B4KSB7CisgICAgICAgIHJldHVybiAiZGVjb2RlQW5jaG9yWCgiICsgZXggKyAiZiwgIiArIChjcHggLSB4KSArICJmKSI7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXkgZW5jb2RlZCB5IHZhbHVlCisgICAgICogQHBhcmFtIHkgdW5lbmNvZGVkIHkgdmFsdWUKKyAgICAgKiBAcGFyYW0gY3B5IHVuZW5jb2RlZCBjcHkgdmFsdWUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdyaXRlRGVjb2RlQmV6aWVyWShkb3VibGUgZXksIGRvdWJsZSB5LCBkb3VibGUgY3B5KSB7CisgICAgICAgIHJldHVybiAiZGVjb2RlQW5jaG9yWSgiICsgZXkgKyAiZiwgIiArIChjcHkgLSB5KSArICJmKSI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlTWF0dGUoTWF0dGUgbSkgeworICAgICAgICBTdHJpbmcgZGVjbGFyYXRpb24gPSBudWxsOworICAgICAgICBpZiAobS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIENvbG9yIGMgPSBtLmdldENvbG9yKCk7CisgICAgICAgICAgICBkZWNsYXJhdGlvbiA9IE9iamVjdENvZGVDb252ZXJ0b3JzLmNvbnZlcnQoYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWNsYXJhdGlvbiA9ICJkZWNvZGVDb2xvcihcIiIgKyBtLmdldFVpRGVmYXVsdFBhcmVudE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgIiArIG0uZ2V0SHVlT2Zmc2V0KCkgKyAiZiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG0uZ2V0U2F0dXJhdGlvbk9mZnNldCgpICsgImYsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBtLmdldEJyaWdodG5lc3NPZmZzZXQoKSArICJmLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbS5nZXRBbHBoYU9mZnNldCgpICsgIikiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHZhcmlhYmxlTmFtZSA9IGNvbG9ycy5nZXQoZGVjbGFyYXRpb24pOworICAgICAgICBpZiAodmFyaWFibGVOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhcmlhYmxlTmFtZSA9ICJjb2xvciIgKyBjb2xvckNvdW50ZXIrKzsKKyAgICAgICAgICAgIGNvbG9ycy5wdXQoZGVjbGFyYXRpb24sIHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgICBjb2xvckNvZGUuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xvciAiKS5hcHBlbmQodmFyaWFibGVOYW1lKS5hcHBlbmQoIiA9ICIpOworICAgICAgICAgICAgY29sb3JDb2RlLmFwcGVuZChkZWNsYXJhdGlvbikuYXBwZW5kKCI7XG4iKTsKKyAgICAgICAgfQorICAgICAgICAvLyBoYW5kbGUgY29tcG9uZW50IGNvbG9ycworICAgICAgICBpZiAobS5nZXRDb21wb25lbnRQcm9wZXJ0eU5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBDb21wb25lbnRDb2xvciBjYyA9IG5ldyBDb21wb25lbnRDb2xvcihtLmdldENvbXBvbmVudFByb3BlcnR5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWUsIG0uZ2V0U2F0dXJhdGlvbk9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICBtLmdldEJyaWdodG5lc3NPZmZzZXQoKSwgbS5nZXRBbHBoYU9mZnNldCgpKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGNvbXBvbmVudENvbG9ycy5pbmRleE9mKGNjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gY29tcG9uZW50Q29sb3JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRDb2xvcnMuYWRkKGNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiKENvbG9yKWNvbXBvbmVudENvbG9yc1siICsgaW5kZXggKyAiXSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdmFyaWFibGVOYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlQ29sb3IoQ29sb3IgYykgeworICAgICAgICBTdHJpbmcgZGVjbGFyYXRpb24gPSBPYmplY3RDb2RlQ29udmVydG9ycy5jb252ZXJ0KGMpOworICAgICAgICBTdHJpbmcgdmFyaWFibGVOYW1lID0gY29sb3JzLmdldChkZWNsYXJhdGlvbik7CisgICAgICAgIGlmICh2YXJpYWJsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFyaWFibGVOYW1lID0gImNvbG9yIiArIGNvbG9yQ291bnRlcisrOworICAgICAgICAgICAgY29sb3JzLnB1dChkZWNsYXJhdGlvbiwgdmFyaWFibGVOYW1lKTsKKyAgICAgICAgICAgIGNvbG9yQ29kZS5hcHBlbmQoIiAgICBwcml2YXRlIENvbG9yICIpLmFwcGVuZCh2YXJpYWJsZU5hbWUpLmFwcGVuZCgiID0gIik7CisgICAgICAgICAgICBjb2xvckNvZGUuYXBwZW5kKGRlY2xhcmF0aW9uKS5hcHBlbmQoIjtcbiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlTmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVHcmFkaWVudChQYWludGVkU2hhcGUgcHMsIEdyYWRpZW50IGcpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZmxvYXQgeDEgPSAoZmxvYXQpcHMuZ2V0UGFpbnRYMSgpOworICAgICAgICBmbG9hdCB5MSA9IChmbG9hdClwcy5nZXRQYWludFkxKCk7CisgICAgICAgIGZsb2F0IHgyID0gKGZsb2F0KXBzLmdldFBhaW50WDIoKTsKKyAgICAgICAgZmxvYXQgeTIgPSAoZmxvYXQpcHMuZ2V0UGFpbnRZMigpOworICAgICAgICBiLmFwcGVuZCgiICAgICAgICByZXR1cm4gZGVjb2RlR3JhZGllbnQoKCIpOworICAgICAgICBiLmFwcGVuZCh4MSk7CisgICAgICAgIGIuYXBwZW5kKCJmICogdykgKyB4LCAoIik7CisgICAgICAgIGIuYXBwZW5kKHkxKTsKKyAgICAgICAgYi5hcHBlbmQoImYgKiBoKSArIHksICgiKTsKKyAgICAgICAgYi5hcHBlbmQoeDIpOworICAgICAgICBiLmFwcGVuZCgiZiAqIHcpICsgeCwgKCIpOworICAgICAgICBiLmFwcGVuZCh5Mik7CisgICAgICAgIGIuYXBwZW5kKCJmICogaCkgKyB5LFxuIik7CisgICAgICAgIGVuY29kZUdyYWRpZW50Q29sb3JzQW5kRnJhY3Rpb25zKGcsYik7CisgICAgICAgIGIuYXBwZW5kKCIpOyIpOworCisgICAgICAgIFN0cmluZyBtZXRob2RCb2R5ID0gYi50b1N0cmluZygpOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZHMuZ2V0KG1ldGhvZEJvZHkpOworICAgICAgICBpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gImRlY29kZUdyYWRpZW50IiArIGdyYWRpZW50Q291bnRlcisrOworICAgICAgICAgICAgZ3JhZGllbnRzQ29kZS5hcHBlbmQoIiAgICBwcml2YXRlIFBhaW50ICIpLmFwcGVuZChtZXRob2ROYW1lKS5hcHBlbmQoIihTaGFwZSBzKSB7XG4iKTsKKyAgICAgICAgICAgIGdyYWRpZW50c0NvZGUuYXBwZW5kKCIgICAgICAgIFJlY3RhbmdsZTJEIGJvdW5kcyA9IHMuZ2V0Qm91bmRzMkQoKTtcbiIpOworICAgICAgICAgICAgZ3JhZGllbnRzQ29kZS5hcHBlbmQoIiAgICAgICAgZmxvYXQgeCA9IChmbG9hdClib3VuZHMuZ2V0WCgpO1xuIik7CisgICAgICAgICAgICBncmFkaWVudHNDb2RlLmFwcGVuZCgiICAgICAgICBmbG9hdCB5ID0gKGZsb2F0KWJvdW5kcy5nZXRZKCk7XG4iKTsKKyAgICAgICAgICAgIGdyYWRpZW50c0NvZGUuYXBwZW5kKCIgICAgICAgIGZsb2F0IHcgPSAoZmxvYXQpYm91bmRzLmdldFdpZHRoKCk7XG4iKTsKKyAgICAgICAgICAgIGdyYWRpZW50c0NvZGUuYXBwZW5kKCIgICAgICAgIGZsb2F0IGggPSAoZmxvYXQpYm91bmRzLmdldEhlaWdodCgpO1xuIik7CisgICAgICAgICAgICBncmFkaWVudHNDb2RlLmFwcGVuZChtZXRob2RCb2R5KTsKKyAgICAgICAgICAgIGdyYWRpZW50c0NvZGUuYXBwZW5kKCJcbiAgICB9XG5cbiIpOworICAgICAgICAgICAgbWV0aG9kcy5wdXQobWV0aG9kQm9keSwgbWV0aG9kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZXMgYSBhYnN0cmFjdCBncmFkaWVudCBhbmQgY3JlYXRlcyB0aGUgY29kZSBmb3IgdGhlIGZyYWN0aW9ucyBmbG9hdAorICAgICAqIGFycmF5IGFuZCB0aGUgY29sb3JzIGFycmF5IHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIGNvbnN0cnVjdG9ycyBvZiBsaW5lYXIKKyAgICAgKiBhbmQgcmFkaWFsIGdyYWRpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnIFRoZSBhYnN0cmFjdCBncmFkaWVudCB0byBnZXQgc3RvcHMgZnJvbQorICAgICAqIEBwYXJhbSBiIEFwcGVuZCBjb2RlIHN0cmluZyBvZiB0aGUgZm9ybSAibmV3IGZsb2F0W117Li4ufSwKKyAgICAgKiAgICAgICAgICBuZXcgQ29sb3JbXXsuLi59IiB0byB0aGlzIFN0cmluZ0J1aWxkZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlR3JhZGllbnRDb2xvcnNBbmRGcmFjdGlvbnMoQWJzdHJhY3RHcmFkaWVudCBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYikgeworICAgICAgICBMaXN0PEdyYWRpZW50U3RvcD4gc3RvcHMgPSBnLmdldFN0b3BzKCk7CisgICAgICAgIC8vIHRoZXJlIGFyZSBzdG9wcy5zaXplKCkgbnVtYmVyIG9mIG1haW4gc3RvcHMuIEJldHdlZW4gZWFjaCBpcyBhCisgICAgICAgIC8vIGZyYWN0aW9uYWwgc3RvcC4gVGh1cywgdGhlcmUgYXJlOiBzdG9wcy5zaXplKCkgKyBzdG9wcy5zaXplKCkgLSAxCisgICAgICAgIC8vIG51bWJlciBvZiBmcmFjdGlvbnMgYW5kIGNvbG9ycy4KKyAgICAgICAgZmxvYXRbXSBmcmFjdGlvbnMgPSBuZXcgZmxvYXRbc3RvcHMuc2l6ZSgpICsgc3RvcHMuc2l6ZSgpIC0gMV07CisgICAgICAgIFN0cmluZ1tdIGNvbG9ycyA9IG5ldyBTdHJpbmdbZnJhY3Rpb25zLmxlbmd0aF07CisgICAgICAgIC8vZm9yIGVhY2ggc3RvcCwgY3JlYXRlIHRoZSBzdG9wIGFuZCBpdCdzIGFzc29jaWF0ZWQgZnJhY3Rpb24KKyAgICAgICAgaW50IGluZGV4ID0gMDsgLy8gdGhlIGluZGV4IGludG8gZnJhY3Rpb25zIGFuZCBjb2xvcnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9wcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgR3JhZGllbnRTdG9wIHMgPSBzdG9wcy5nZXQoaSk7CisgICAgICAgICAgICAvL2NvcHkgb3ZlciB0aGUgc3RvcCdzIGRhdGEKKyAgICAgICAgICAgIGNvbG9yc1tpbmRleF0gPSBlbmNvZGVNYXR0ZShzLmdldENvbG9yKCkpOworICAgICAgICAgICAgZnJhY3Rpb25zW2luZGV4XSA9IHMuZ2V0UG9zaXRpb24oKTsKKworICAgICAgICAgICAgLy9JZiB0aGlzIGlzbid0IHRoZSBsYXN0IHN0b3AsIHRoZW4gYWRkIGluIHRoZSBmcmFjdGlvbgorICAgICAgICAgICAgaWYgKGluZGV4IDwgZnJhY3Rpb25zLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmMSA9IHMuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBmMiA9IHN0b3BzLmdldChpICsgMSkuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIGZyYWN0aW9uc1tpbmRleF0gPSBmMSArIChmMiAtIGYxKSAqIHMuZ2V0TWlkcG9pbnQoKTsKKyAgICAgICAgICAgICAgICBjb2xvcnNbaW5kZXhdID0gImRlY29kZUNvbG9yKCIrCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnNbaW5kZXggLSAxXSsiLCIrCisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVNYXR0ZShzdG9wcy5nZXQoaSArIDEpLmdldENvbG9yKCkpKyIsMC41ZikiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayBib3VuZHJ5IGNvbmRpdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBmcmFjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vdG8gYXZvaWQgYW4gZXJyb3Igd2l0aCBMaW5lYXJHcmFkaWVudFBhaW50IHdoZXJlIHR3byBmcmFjdGlvbnMKKyAgICAgICAgICAgIC8vYXJlIGlkZW50aWNhbCwgYnVtcCB1cCB0aGUgZnJhY3Rpb24gdmFsdWUgYnkgYSBtaW5pc2N1bGUgYW1vdW50CisgICAgICAgICAgICAvL2lmIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgb25lCisgICAgICAgICAgICAvL05PVEU6IFRoZSA8PSBpcyBjcml0aWNhbCBiZWNhdXNlIHRoZSBwcmV2aW91cyB2YWx1ZSBtYXkgYWxyZWFkeQorICAgICAgICAgICAgLy9oYXZlIGJlZW4gYnVtcGVkIHVwCisgICAgICAgICAgICBpZiAoZnJhY3Rpb25zW2ldIDw9IGZyYWN0aW9uc1tpIC0gMV0pIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbnNbaV0gPSBmcmFjdGlvbnNbaSAtIDFdICsgLjAwMDAwMWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9hbm90aGVyIGJvdW5kYXJ5IGNvbmRpdGlvbiB3aGVyZSBtdWx0aXBsZSBzdG9wcyBhcmUgYWxsIGF0IHRoZSBlbmQuIFRoZQorICAgICAgICAvL3ByZXZpb3VzIGxvb3AgYnVtcGVkIGFsbCBidXQgb25lIG9mIHRoZXNlIHBhc3QgMS4wLCB3aGljaCBpcyBiYWQuCisgICAgICAgIC8vc28gcmVtb3ZlIGFueSBmcmFjdGlvbnMgKGFuZCB0aGVpciBjb2xvcnMhKSB0aGF0IGFyZSBiZXlvbmQgMS4wCisgICAgICAgIGludCBvdXRPZkJvdW5kc0luZGV4ID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnJhY3Rpb25zW2ldID4gMSkgeworICAgICAgICAgICAgICAgIG91dE9mQm91bmRzSW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvdXRPZkJvdW5kc0luZGV4ID49IDApIHsKKyAgICAgICAgICAgIGZsb2F0W10gZiA9IGZyYWN0aW9uczsKKyAgICAgICAgICAgIFN0cmluZ1tdIGMgPSBjb2xvcnM7CisgICAgICAgICAgICBmcmFjdGlvbnMgPSBuZXcgZmxvYXRbb3V0T2ZCb3VuZHNJbmRleF07CisgICAgICAgICAgICBjb2xvcnMgPSBuZXcgU3RyaW5nW291dE9mQm91bmRzSW5kZXhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmLCAwLCBmcmFjdGlvbnMsIDAsIG91dE9mQm91bmRzSW5kZXgpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjLCAwLCBjb2xvcnMsIDAsIG91dE9mQm91bmRzSW5kZXgpOworICAgICAgICB9CisgICAgICAgIC8vIGJ1aWxkIHN0cmluZworICAgICAgICBiLmFwcGVuZCgiICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdIHsgIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaT4wKWIuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICBiLmFwcGVuZChmcmFjdGlvbnNbaV0pOworICAgICAgICAgICAgYi5hcHBlbmQoJ2YnKTsKKyAgICAgICAgfQorICAgICAgICBiLmFwcGVuZCgiIH0sXG4gICAgICAgICAgICAgICAgbmV3IENvbG9yW10geyAiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpPjApIGIuYXBwZW5kKCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisgICAgICAgICAgICBiLmFwcGVuZChjb2xvcnNbaV0pOworICAgICAgICB9CisgICAgICAgIGIuYXBwZW5kKCJ9Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlUmFkaWFsKFBhaW50ZWRTaGFwZSBwcywgUmFkaWFsR3JhZGllbnQgZykgeworICAgICAgICBmbG9hdCBjZW50ZXJYMSA9IChmbG9hdClwcy5nZXRQYWludFgxKCk7CisgICAgICAgIGZsb2F0IGNlbnRlclkxID0gKGZsb2F0KXBzLmdldFBhaW50WTEoKTsKKyAgICAgICAgZmxvYXQgeDIgPSAoZmxvYXQpcHMuZ2V0UGFpbnRYMigpOworICAgICAgICBmbG9hdCB5MiA9IChmbG9hdClwcy5nZXRQYWludFkyKCk7CisgICAgICAgIGZsb2F0IHJhZGl1cyA9IChmbG9hdClQb2ludDJELmRpc3RhbmNlKGNlbnRlclgxLCBjZW50ZXJZMSwgeDIsIHkyKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBiLmFwcGVuZCgiICAgICAgICByZXR1cm4gZGVjb2RlUmFkaWFsR3JhZGllbnQoKCIpOworICAgICAgICBiLmFwcGVuZChjZW50ZXJYMSk7CisgICAgICAgIGIuYXBwZW5kKCJmICogdykgKyB4LCAoIik7CisgICAgICAgIGIuYXBwZW5kKGNlbnRlclkxKTsKKyAgICAgICAgYi5hcHBlbmQoImYgKiBoKSArIHksICIpOworICAgICAgICBiLmFwcGVuZChyYWRpdXMpOworICAgICAgICBiLmFwcGVuZCgiZixcbiIpOworICAgICAgICBlbmNvZGVHcmFkaWVudENvbG9yc0FuZEZyYWN0aW9ucyhnLGIpOworICAgICAgICBiLmFwcGVuZCgiKTsiKTsKKworICAgICAgICBTdHJpbmcgbWV0aG9kQm9keSA9IGIudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2RzLmdldChtZXRob2RCb2R5KTsKKyAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICJkZWNvZGVSYWRpYWwiICsgcmFkaWFsQ291bnRlcisrOworICAgICAgICAgICAgZ3JhZGllbnRzQ29kZS5hcHBlbmQoIiAgICBwcml2YXRlIFBhaW50ICIpLmFwcGVuZChtZXRob2ROYW1lKS5hcHBlbmQoIihTaGFwZSBzKSB7XG4iKTsKKyAgICAgICAgICAgIGdyYWRpZW50c0NvZGUuYXBwZW5kKCIgICAgICAgIFJlY3RhbmdsZTJEIGJvdW5kcyA9IHMuZ2V0Qm91bmRzMkQoKTtcbiIpOworICAgICAgICAgICAgZ3JhZGllbnRzQ29kZS5hcHBlbmQoIiAgICAgICAgZmxvYXQgeCA9IChmbG9hdClib3VuZHMuZ2V0WCgpO1xuIik7CisgICAgICAgICAgICBncmFkaWVudHNDb2RlLmFwcGVuZCgiICAgICAgICBmbG9hdCB5ID0gKGZsb2F0KWJvdW5kcy5nZXRZKCk7XG4iKTsKKyAgICAgICAgICAgIGdyYWRpZW50c0NvZGUuYXBwZW5kKCIgICAgICAgIGZsb2F0IHcgPSAoZmxvYXQpYm91bmRzLmdldFdpZHRoKCk7XG4iKTsKKyAgICAgICAgICAgIGdyYWRpZW50c0NvZGUuYXBwZW5kKCIgICAgICAgIGZsb2F0IGggPSAoZmxvYXQpYm91bmRzLmdldEhlaWdodCgpO1xuIik7CisgICAgICAgICAgICBncmFkaWVudHNDb2RlLmFwcGVuZChtZXRob2RCb2R5KTsKKyAgICAgICAgICAgIGdyYWRpZW50c0NvZGUuYXBwZW5kKCJcbiAgICB9XG5cbiIpOworICAgICAgICAgICAgbWV0aG9kcy5wdXQobWV0aG9kQm9keSwgbWV0aG9kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICAgfQorCisgICAgLy9ub3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgbm90IHRocmVhZC1zYWZlLiBJbiBmYWN0LCBub25lIG9mIHRoaXMgY2xhc3MgaXMuCisgICAgc3RhdGljIHZvaWQgd3JpdGVQYWludGVyKFVJUmVnaW9uIHIsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFyaWFibGVzLCBGaWxlIHBhaW50ZXJQYWNrYWdlUm9vdCwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9OZWVkIG9ubHkgd3JpdGUgb3V0IHRoZSBzdHVmZiBmb3IgdGhpcyByZWdpb24sIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgc3VicmVnaW9ucworICAgICAgICAvL3NpbmNlIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHRob3NlIChhbmQgdGhleSBnbyBpbiB0aGVpciBvd24gZmlsZSwgYW55d2F5KS4KKyAgICAgICAgLy9UaGUgb25seSBzdWJyZWdpb24gdGhhdCB3ZSBjb21wb3VuZCBpbnRvIHRoaXMgaXMgdGhlIG9uZSBmb3IgaWNvbnMuCisKKyAgICAgICAgU3RyaW5nIHBhaW50ZXJOYW1lID0gbWFrZVByZXR0eShwcmVmaXgpICsgIlBhaW50ZXIiOworICAgICAgICBQYWludGVyR2VuZXJhdG9yIGdlbiA9IG5ldyBQYWludGVyR2VuZXJhdG9yKHIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRpbmcgc291cmNlIGZpbGU6ICIgKyBwYWludGVyTmFtZSArICIuamF2YSIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2VuLnN0YXRlVHlwZUNvZGUudG9TdHJpbmcoKSk7CisgICAgICAgIHZhcmlhYmxlcy5wdXQoIlBBSU5URVJfTkFNRSIsIHBhaW50ZXJOYW1lKTsKKyAgICAgICAgdmFyaWFibGVzLnB1dCgiU1RBVElDX0RFQ0wiLCBnZW4uc3RhdGVUeXBlQ29kZS50b1N0cmluZygpKTsKKyAgICAgICAgdmFyaWFibGVzLnB1dCgiQ09MT1JTX0RFQ0wiLCBnZW4uY29sb3JDb2RlLnRvU3RyaW5nKCkpOworICAgICAgICB2YXJpYWJsZXMucHV0KCJET19QQUlOVF9TV0lUQ0hfQk9EWSIsIGdlbi5zd2l0Y2hDb2RlLnRvU3RyaW5nKCkpOworICAgICAgICB2YXJpYWJsZXMucHV0KCJQQUlOVElOR19ERUNMIiwgZ2VuLnBhaW50aW5nQ29kZS50b1N0cmluZygpKTsKKyAgICAgICAgdmFyaWFibGVzLnB1dCgiR0VUX0VYVEVOREVEX0NBQ0hFX0tFWVMiLCBnZW4uZ2V0RXh0ZW5kZWRDYWNoZUtleXNDb2RlLnRvU3RyaW5nKCkpOworICAgICAgICB2YXJpYWJsZXMucHV0KCJTSEFQRVNfREVDTCIsIGdlbi5zaGFwZXNDb2RlLnRvU3RyaW5nKCkpOworICAgICAgICB2YXJpYWJsZXMucHV0KCJHUkFESUVOVFNfREVDTCIsIGdlbi5ncmFkaWVudHNDb2RlLnRvU3RyaW5nKCkpOworCisgICAgICAgIHdyaXRlU3JjRmlsZShnZXRQYWludGVySW1wbFRlbXBsYXRlKCksIHZhcmlhYmxlcywgbmV3IEZpbGUocGFpbnRlclBhY2thZ2VSb290LCBwYWludGVyTmFtZSArICIuamF2YSIpKTsKKworICAgICAgICB2YXJpYWJsZXMucmVtb3ZlKCJQQUlOVEVSX05BTUUiKTsKKyAgICAgICAgdmFyaWFibGVzLnJlbW92ZSgiU1RBVElDX0RFQ0wiKTsKKyAgICAgICAgdmFyaWFibGVzLnJlbW92ZSgiQ09MT1JTX0RFQ0wiKTsKKyAgICAgICAgdmFyaWFibGVzLnJlbW92ZSgiRE9fUEFJTlRfU1dJVENIX0JPRFkiKTsKKyAgICAgICAgdmFyaWFibGVzLnJlbW92ZSgiUEFJTlRJTkdfREVDTCIpOworICAgICAgICB2YXJpYWJsZXMucmVtb3ZlKCJTSEFQRVNfREVDTCIpOworICAgICAgICB2YXJpYWJsZXMucmVtb3ZlKCJHUkFESUVOVFNfREVDTCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIHVzYWdlIG9mIGEgY29sb3IgZnJvbSBhIGNvbXBvbmVudCB3aXRoaW4gYSBwYWludGVyLiBUaGF0CisgICAgICogaXMsIGEgcGFpbnRlciBjYW4gdXNlIGNvbG9ycyBmcm9tIHRoZSBjb21wb25lbnQgd2hlbiBpdCBwYWludHMuIFRoaXMKKyAgICAgKiBjbGFzcyByZXByZXNlbnRzIHRoZSB1c2FnZSBvZiBzdWNoIGEgY29sb3IsIGNvbnRhaW5pbmcgYSByZWZlcmVuY2UgdG8KKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjb250YWlucyB0aGUgY29sb3IsIGFuZCB0aGUgdmFyaW91cworICAgICAqIGRlcml2YXRpb24gb2Zmc2V0cyB0byBhcHBseSB0byB0aGF0IGNvbG9yLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvbmVudENvbG9yIHsKKyAgICAgICAgcHVibGljIFN0cmluZyBwcm9wZXJ0eU5hbWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVmYXVsdENvbG9yVmFyaWFibGVOYW1lOworICAgICAgICBwcml2YXRlIGZsb2F0IHNhdHVyYXRpb25PZmZzZXQgPSAwLCBicmlnaHRuZXNzT2Zmc2V0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYWxwaGFPZmZzZXQgPSAwOworCisgICAgICAgIHByaXZhdGUgQ29tcG9uZW50Q29sb3IoU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdENvbG9yVmFyaWFibGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNhdHVyYXRpb25PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYnJpZ2h0bmVzc09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFPZmZzZXQpIHsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q29sb3JWYXJpYWJsZU5hbWUgPSBkZWZhdWx0Q29sb3JWYXJpYWJsZU5hbWU7CisgICAgICAgICAgICB0aGlzLnNhdHVyYXRpb25PZmZzZXQgPSBzYXR1cmF0aW9uT2Zmc2V0OworICAgICAgICAgICAgdGhpcy5icmlnaHRuZXNzT2Zmc2V0ID0gYnJpZ2h0bmVzc09mZnNldDsKKyAgICAgICAgICAgIHRoaXMuYWxwaGFPZmZzZXQgPSBhbHBoYU9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBDb21wb25lbnRDb2xvciBjID0gKENvbXBvbmVudENvbG9yKW87CisgICAgICAgICAgICBpZiAoYWxwaGFPZmZzZXQgIT0gYy5hbHBoYU9mZnNldCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKEZsb2F0LmNvbXBhcmUoc2F0dXJhdGlvbk9mZnNldCwgYy5zYXR1cmF0aW9uT2Zmc2V0KSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChGbG9hdC5jb21wYXJlKGJyaWdodG5lc3NPZmZzZXQsIGMuYnJpZ2h0bmVzc09mZnNldCkgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoZGVmYXVsdENvbG9yVmFyaWFibGVOYW1lICE9IG51bGwgPworICAgICAgICAgICAgICAgICAgICAhZGVmYXVsdENvbG9yVmFyaWFibGVOYW1lLmVxdWFscyhjLmRlZmF1bHRDb2xvclZhcmlhYmxlTmFtZSkgOgorICAgICAgICAgICAgICAgICAgICBjLmRlZmF1bHRDb2xvclZhcmlhYmxlTmFtZSAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lICE9IG51bGwgPyAhcHJvcGVydHlOYW1lLmVxdWFscyhjLnByb3BlcnR5TmFtZSkgOgorICAgICAgICAgICAgICAgICAgICBjLnByb3BlcnR5TmFtZSAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IGhhc2ggPSA1OworICAgICAgICAgICAgaGFzaCA9IDYxICogaGFzaCArICh0aGlzLnByb3BlcnR5TmFtZSAhPSBudWxsID8KKyAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5TmFtZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICBoYXNoID0gNjEgKiBoYXNoICsgKHRoaXMuZGVmYXVsdENvbG9yVmFyaWFibGVOYW1lICE9IG51bGwgPworICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdENvbG9yVmFyaWFibGVOYW1lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIGhhc2ggPSA2MSAqIGhhc2ggKyBGbG9hdC5mbG9hdFRvSW50Qml0cyh0aGlzLnNhdHVyYXRpb25PZmZzZXQpOworICAgICAgICAgICAgaGFzaCA9IDYxICogaGFzaCArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMuYnJpZ2h0bmVzc09mZnNldCk7CisgICAgICAgICAgICBoYXNoID0gNjEgKiBoYXNoICsgdGhpcy5hbHBoYU9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvZ2VuZXJhdG9yL1RlbXBsYXRlV3JpdGVyLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9nZW5lcmF0b3IvVGVtcGxhdGVXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTc2YzgwCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvZ2VuZXJhdG9yL1RlbXBsYXRlV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuZ2VuZXJhdG9yOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGVtcGxhdGVXcml0ZXIgLSBDbGFzcyBmb3Igd3JpdGluZyBKYXZhIFNvdXJjZSBmaWxlcyB1c2luZyBhIHNyYyB0ZW1wbGF0ZSBhbmQgdmFyaWFibGUgc3Vic2l0dXRpb24KKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVXcml0ZXIgeworCisgICAgLyoqCisgICAgICogV3JpdGUgYSBKYXZhIHNvdXJjZSBmaWxlIGJ5IHRha2luZyBhIHRlbXBsYXRlIGZpbGUgYW5kIGFwcGx5aW5nIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBhbmQgd3JpdGluZyB0byB0aGUgb3V0cHV0CisgICAgICogZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSAgVGhlIHRlbXBsYXRlIHRvIHVzZQorICAgICAqIEBwYXJhbSB2YXJpYWJsZXMgTWFwIG9mIHRoZSB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIHRvIHN1YnN0aXR1dGUgaW4gdGhlIHRlbXBsYXRlCisgICAgICogQHBhcmFtIG91dHB1dCAgICBUaGUgZmlsZSB0byB3cml0ZSB0bworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3cml0aW5nIHRoZSBKYXZhIHNvdXJjZSBmaWxlCisgICAgICovCisgICAgc3RhdGljIHZvaWQgd3JpdGVTcmNGaWxlKFN0cmluZyB0ZW1wbGF0ZSwgTWFwPFN0cmluZywgU3RyaW5nPiB2YXJpYWJsZXMsIEZpbGUgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBUZW1wbGF0ZVJlYWRlciBpbiA9IG5ldyBUZW1wbGF0ZVJlYWRlcih2YXJpYWJsZXMsIHRlbXBsYXRlKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0KKyAgICAgICAgICAgICAgICBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIob3V0cHV0KSk7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSBpbi5yZWFkTGluZSgpOworICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihsaW5lKTsKKyAgICAgICAgICAgIGxpbmUgPSBpbi5yZWFkTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHRlbXBsYXRlIGZpbGUgaW50byBhIHN0cmluZworICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHRlbXBsYXRlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byBHZW5lcmF0b3IgY2xhc3MKKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgdGVtcGxhdGUgZmlsZSBhcyBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgdGVtcGxhdGUgZmlsZQorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgcmVhZChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBHZW5lcmF0b3IuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKKyAgICAgICAgaWYgKGluPT1udWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIFsiK25hbWUrCisgICAgICAgICAgICAgICAgIl0gcmVsYXRpdmUgdG8gY2xhc3MgWyIrR2VuZXJhdG9yLmNsYXNzLmdldE5hbWUoKSsiXSIpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICBpbnQgbGVuZ3RoID0gLTE7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgd2hpbGUgKChsZW5ndGggPSBpbi5yZWFkKGRhdGEpKSAhPSAtMSkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChuZXcgU3RyaW5nKGRhdGEsIDAsIGxlbmd0aCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKiogQSBCdWZmZXJlZFJlYWRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgcGVyZm9ybXMgc3RyaW5nIHJlcGxhY2VtZW50cyBhcyBuZWVkZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVGVtcGxhdGVSZWFkZXIgZXh0ZW5kcyBCdWZmZXJlZFJlYWRlciB7CisgICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiB2YXJpYWJsZXM7CisKKyAgICAgICAgVGVtcGxhdGVSZWFkZXIoTWFwPFN0cmluZywgU3RyaW5nPiB2YXJpYWJsZXMsIFN0cmluZyB0ZW1wbGF0ZSkgeworICAgICAgICAgICAgc3VwZXIobmV3IFN0cmluZ1JlYWRlcih0ZW1wbGF0ZSkpOworICAgICAgICAgICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBhIGxpbmUgb2YgdGV4dCBmcm9tIHRoZSB0ZW1wbGF0ZSBidXQgd2l0aCB2YXJpYWJsZXMgc3Vic3RpdHV0ZWQuIE90aGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gdGhlIHRleHQKKyAgICAgICAgICogICAgICAgICBzYW5zIHN1YnN0aXR1dGlvbi4gQ2FsbCB0aGlzIG1ldGhvZC4KKyAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRlVmFyaWFibGVzKHN1cGVyLnJlYWRMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3Vic3RpdHV0ZVZhcmlhYmxlcyhTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiB2YXJpYWJsZSA6IHZhcmlhYmxlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKCIkeyIgKyB2YXJpYWJsZS5nZXRLZXkoKSArICJ9IiwgdmFyaWFibGUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvQ3VzdG9tVUlEZWZhdWx0LmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL0N1c3RvbVVJRGVmYXVsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDc0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL0N1c3RvbVVJRGVmYXVsdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbDsKKworLyoqCisgKiBDdXN0b21VSURlZmF1bHQKKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tVUlEZWZhdWx0PFQ+IGV4dGVuZHMgVUlEZWZhdWx0PFQ+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRlciA9IC0xOworCisgICAgcHVibGljIEN1c3RvbVVJRGVmYXVsdCgpIHsKKyAgICAgICAgc3VwZXIoIlVubmFtZWQiICsgKCsrY291bnRlciA9PSAwID8gIiIgOiBjb3VudGVyKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgaWQpIHsKKyAgICAgICAgc3VwZXIuc2V0TmFtZShpZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9IYXNVSVN0eWxlLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL0hhc1VJU3R5bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzNiNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9IYXNVSVN0eWxlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsOworCisvKioKKyAqIEhhc1VJU3R5bGUgLSBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIGFsbCBjbGFzc2VzIHRoYXQgaGF2ZSBhIFVJU3R5bGUKKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgaW50ZXJmYWNlIEhhc1VJU3R5bGUgeworCisgICAgcHVibGljIFVJU3R5bGUgZ2V0U3R5bGUoKTsKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvUGFpbnRlckJvcmRlci5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9QYWludGVyQm9yZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlNTNkYgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvUGFpbnRlckJvcmRlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbDsKKworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgYm9yZGVyIHRoYXQgcmVmZXJzIHRvIGEgUGFpbnRlciB0byBkbyBpdCdzIHdvcmsuIFRoaXMgYm9yZGVyCisgKiBkb2Vzbid0IGFjdHVhbGx5IHJlbmRlciAtLSBpdCBpcyBqdXN0IHVzZWQgYXMgcGFydCBvZiB0aGUgbW9kZWwuCisgKgorICogQGF1dGhvciBSaWNoYXJkIEJhaXIKKyAqLworcHVibGljIGNsYXNzIFBhaW50ZXJCb3JkZXIgZXh0ZW5kcyBFbXB0eUJvcmRlciB7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGFpbnRlck5hbWU7CisgICAgcHVibGljIFBhaW50ZXJCb3JkZXIoU3RyaW5nIHBhaW50ZXJOYW1lLCBpbnQgdG9wLCBpbnQgbGVmdCwgaW50IGJvdHRvbSwgaW50IHJpZ2h0KSB7CisgICAgICAgIHN1cGVyKHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCk7CisgICAgICAgIHRoaXMucGFpbnRlck5hbWUgPSBwYWludGVyTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhaW50ZXJOYW1lKCkgeyByZXR1cm4gcGFpbnRlck5hbWU7IH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvU3ludGhNb2RlbC5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9TeW50aE1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhMThjNQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvU3ludGhNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNTMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWw7CisKK2ltcG9ydCBvcmcuamRlc2t0b3AuYmVhbnMuQWJzdHJhY3RCZWFuOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIudXRpbHMuSGFzUmVzb3VyY2VzOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIudXRpbHMuSGFzVUlEZWZhdWx0czsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklVbm1hcnNoYWxsaW5nQ29udGV4dDsKKworaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247CitpbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OworaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveE1lbnVJdGVtOworaW1wb3J0IGphdmF4LnN3aW5nLkpDb2xvckNob29zZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OworaW1wb3J0IGphdmF4LnN3aW5nLkpEZXNrdG9wUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KRWRpdG9yUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KRmlsZUNob29zZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSkZvcm1hdHRlZFRleHRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5KSW50ZXJuYWxGcmFtZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnU7CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnVCYXI7CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnVJdGVtOworaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFzc3dvcmRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUG9wdXBNZW51OworaW1wb3J0IGphdmF4LnN3aW5nLkpQcm9ncmVzc0JhcjsKK2ltcG9ydCBqYXZheC5zd2luZy5KUmFkaW9CdXR0b247CitpbXBvcnQgamF2YXguc3dpbmcuSlJhZGlvQnV0dG9uTWVudUl0ZW07CitpbXBvcnQgamF2YXguc3dpbmcuSlJvb3RQYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxCYXI7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlNlcGFyYXRvcjsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2xpZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOworaW1wb3J0IGphdmF4LnN3aW5nLkpTcGxpdFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRhYmJlZFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOworaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0QXJlYTsKK2ltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOworaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0UGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KVG9nZ2xlQnV0dG9uOworaW1wb3J0IGphdmF4LnN3aW5nLkpUb29sQmFyOworaW1wb3J0IGphdmF4LnN3aW5nLkpUb29sVGlwOworaW1wb3J0IGphdmF4LnN3aW5nLkpUcmVlOworaW1wb3J0IGphdmF4LnN3aW5nLkpWaWV3cG9ydDsKK2ltcG9ydCBqYXZheC5zd2luZy5VSURlZmF1bHRzOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuQmFzaWNMb29rQW5kRmVlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLm1ldGFsLk1ldGFsTG9va0FuZEZlZWw7CitpbXBvcnQgc3RhdGljIGphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhDb25zdGFudHMuKjsKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS5KVGFibGVIZWFkZXI7CitpbXBvcnQgamF2YS5hd3QuSW5zZXRzOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIE1vZGVscyBhIFN5bnRoIGxvb2sgYW5kIGZlZWwuIENvbnRhaW5zIGFsbCBvZiB0aGUgY29sb3JzLCBmb250cywgcGFpbnRlcnMsIHN0YXRlcywgZXRjIHRoYXQgY29tcG9zZSBhIHN5bnRoIGxvb2sgYW5kCisgKiBmZWVsLgorICogPHAvPgorICogVG8gbW9kZWwgU3ludGggcHJvcGVybHksIEkgbmVlZCB0byBib3RoIE1vZGVsIHRoZSB3YXkgU3ludGggd29ya3MgKHdpdGggc3R5bGVzLCBhbmQgc28gZm9ydGgpIGFuZCB0aGUgd2F5IGEgbG9vayBhbmQKKyAqIGZlZWwgd29ya3MgKFVJRGVmYXVsdHMgdGFibGUsIGV0Yykgc2luY2UgYm90aCBvZiB0aGVzZSBhcmUgc3VwcG9ydGVkIHdheXMgb2YgZG9pbmcgdGhpbmdzIGluIFN5bnRoLgorICogPHAvPgorICogT25lIGltcG9ydGFudCAoYnV0IG5vbi12aXN1YWwpIHRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY29uZmlndXJhYmxlIGlzIHRoZSBzdXBwb3J0IGZvciBJbnB1dE1hcHMgcGVyIGNvbXBvbmVudC4gSW4KKyAqIFN5bnRoLCBhbiBpbnB1dCBtYXAgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiBTeW50aCBlbGVtZW50LCBtZWFuaW5nIGl0IGFwcGxpZXMgdG8gZXZlcnl0aGluZy4gT3IgaXQgY2FuIGJlCisgKiBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgc3R5bGUuIEFuIElucHV0bWFwIGNhbiBoYXZlIGFuIGlkLCBhbmQgaXQgY2FuIGNvbnRhaW4gbXVsdGlwbGUga2V5L2FjdGlvbiBwYWlycyAod2hlcmUKKyAqIGFjdGlvbnMgYXJlIGRlbm90ZWQgYnkgbmFtZSkuCisgKiA8cC8+CisgKiBJdCBsb29rcyBsaWtlIFJlZ2lvbnMgY2FuIGhhdmUgSW5wdXRNYXBzPyBTb3VuZHMgZmlzaHkgdG8gbWUuIEkgdGhpbmsgb25seSBDb21wb25lbnRzIHJlYWxseSBoYXZlIGlucHV0IG1hcHMuCisgKiA8cC8+CisgKiBJIHdvdWxkIGxpa2Ugc29tZSB3YXkgb2YgZGVub3Rpbmcgc3BlY2lhbCBrZXlzIGJldHdlZW4gbWFjIGFuZCBvdGhlciBwbGF0Zm9ybXMuIEZvciBleGFtcGxlLCBjdXQsIGNvcHksIHBhc3RlIGV0YworICogc2hvdWxkIGJlIGRpZmZlcmVudC4gSW4gZ2VuZXJhbCwgdGhlIGN0cmwga2V5IGFuZCBhcHBsZSAobWV0YSkga2V5IGFyZSByZXZlcnNlZCBmcm9tIHdoYXQgaXMgdHlwaWNhbGx5IG9uIHdpbmRvd3MuCisgKgorICogQGF1dGhvciAgUmljaGFyZCBCYWlyCisgKiBAYXV0aG9yICBKYXNwZXIgUG90dHMKKyAqLworcHVibGljIGNsYXNzIFN5bnRoTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdEJlYW4gaW1wbGVtZW50cyBIYXNVSURlZmF1bHRzLCBIYXNVSVN0eWxlLCBIYXNSZXNvdXJjZXMgeworICAgIC8vSSdtIGdvaW5nIHRvIHdhbnQ6CisgICAgLy9lbnRyaWVzIHJlbGF0ZWQgdG8gdGhlIENvbnRyb2wgY29sb3IsIGFuZCBvdGhlciBjb2xvcnMgb2YgdGhlIEJhc2ljIExBRgorICAgIC8vZW50cmllcyByZWxhdGVkIHRvIGZvbnRzIChzdGFuZGFyZCBmb250cykgdXNlZCBpbiB0aGUgQmFzaWMgTEFGCisgICAgLy9lbnRyaWVzIHJlbGF0ZWQgdG8gc3RhbmRhcmQgaW5zZXRzLCBib3JkZXJzLCBkaW1lbnNpb25zLCBpY29ucworICAgIC8vZW50cmllcyByZWxhdGVkIHRvIGNvbXBvbmVudCBzcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBMQUYKKyAgICBwcml2YXRlIExpc3Q8VUlQYWludD4gY29sb3JzOworICAgIHByaXZhdGUgTGlzdDxVSUZvbnQ+IGZvbnRzOworICAgIHByaXZhdGUgTGlzdDxVSUluc2V0cz4gaW5zZXRzOworICAgIHByaXZhdGUgTGlzdDxVSUJvcmRlcj4gYm9yZGVyczsKKyAgICBwcml2YXRlIExpc3Q8VUlEaW1lbnNpb24+IGRpbWVuc2lvbnM7CisgICAgcHJpdmF0ZSBMaXN0PFVJSWNvbj4gaWNvbnM7CisgICAgcHJpdmF0ZSBMaXN0PFVJQ29tcG9uZW50PiBjb21wb25lbnRzOworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBsb2NhbCBVSURlZmF1bHRzIHRoYXQgY29udGFpbnMgYWxsIHRoZSBVSURlZmF1bHRzIGluIHRoaXMgc3ludGggbW9kZWwuIEl0IGlzIGtlcHQgdXB0b2RhdGUgYnkgdGhlCisgICAgICogaW5kZXJ2aWR1YWwgVUlEZWZhdWx0cyBub2RlcworICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IFVJRGVmYXVsdHMgbW9kZWxEZWZhdWx0cyA9IG5ldyBVSURlZmF1bHRzKCk7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgVUlTdHlsZSBnbG9iYWxTdHlsZSA9IG5ldyBVSVN0eWxlKCk7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBGaWxlIHJlc291cmNlc0RpcjsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBGaWxlIGltYWdlc0RpcjsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBGaWxlIHRlbXBsYXRlc0RpcjsKKworICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQgYnkgSklCWCB0byBjcmVhdGUgbmV3IGVtcHR5IFN5bnRoTW9kZWwgKi8KKyAgICBwcm90ZWN0ZWQgU3ludGhNb2RlbCgpIHsKKyAgICAgICAgdGhpcyhmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFN5bnRoTW9kZWwoYm9vbGVhbiBwb3B1bGF0ZVdpdGhEZWZhdWx0cykgeworICAgICAgICAvLyBjcmVhdGUgb2JzZXJ2YWJsZSBsaXN0cyB0aGF0IGZpcmUgY2hhbmdlcyBvbiBhcyBwcm9wZXJ0eSBjaGFuZ2VzCisgICAgICAgIGNvbG9ycyA9IG5ldyBBcnJheUxpc3Q8VUlQYWludD4oKTsKKyAgICAgICAgZm9udHMgPSBuZXcgQXJyYXlMaXN0PFVJRm9udD4oKTsKKyAgICAgICAgaW5zZXRzID0gbmV3IEFycmF5TGlzdDxVSUluc2V0cz4oKTsKKyAgICAgICAgYm9yZGVycyA9IG5ldyBBcnJheUxpc3Q8VUlCb3JkZXI+KCk7CisgICAgICAgIGRpbWVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFVJRGltZW5zaW9uPigpOworICAgICAgICBpY29ucyA9IG5ldyBBcnJheUxpc3Q8VUlJY29uPigpOworICAgICAgICBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDxVSUNvbXBvbmVudD4oKTsKKworICAgICAgICBpZiAocG9wdWxhdGVXaXRoRGVmYXVsdHMpIHsKKyAgICAgICAgICAgIC8vZ2V0IHRoZSB1aSBkZWZhdWx0cyBmcm9tIHRoZSBTeW50aExvb2tBbmRGZWVsLiBVc2luZyB0aGUgVUlEZWZhdWx0cyB0YWJsZSwKKyAgICAgICAgICAgIC8vcHJlIGluaXRpYWxpemUgZXZlcnl0aGluZy4KKy8vICAgICAgICBTeW50aExvb2tBbmRGZWVsIHN5bnRoID0gbmV3IFN5bnRoTG9va0FuZEZlZWwoKTsKKyAgICAgICAgICAgIEJhc2ljTG9va0FuZEZlZWwgc3ludGggPSBuZXcgTWV0YWxMb29rQW5kRmVlbCgpOworICAgICAgICAgICAgVUlEZWZhdWx0cyBkZWZhdWx0cyA9IHN5bnRoLmdldERlZmF1bHRzKCk7CisKKyAgICAgICAgICAgIC8vcHJlLWluaXQgdGhlIHBhbGV0dGVzCisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJkZXNrdG9wIiwgZGVmYXVsdHMuZ2V0Q29sb3IoImRlc2t0b3AiKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigiYWN0aXZlQ2FwdGlvbiIsIGRlZmF1bHRzLmdldENvbG9yKCJhY3RpdmVDYXB0aW9uIiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGNvbG9ycy5hZGQobmV3IFVJQ29sb3IoImFjdGl2ZUNhcHRpb25UZXh0IiwgZGVmYXVsdHMuZ2V0Q29sb3IoImFjdGl2ZUNhcHRpb25UZXh0IiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGNvbG9ycy5hZGQobmV3IFVJQ29sb3IoImFjdGl2ZUNhcHRpb25Cb3JkZXIiLCBkZWZhdWx0cy5nZXRDb2xvcigiYWN0aXZlQ2FwdGlvbkJvcmRlciIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJpbmFjdGl2ZUNhcHRpb24iLCBkZWZhdWx0cy5nZXRDb2xvcigiaW5hY3RpdmVDYXB0aW9uIiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGNvbG9ycy5hZGQobmV3IFVJQ29sb3IoImluYWN0aXZlQ2FwdGlvblRleHQiLCBkZWZhdWx0cy5nZXRDb2xvcigiaW5hY3RpdmVDYXB0aW9uVGV4dCIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJpbmFjdGl2ZUNhcHRpb25Cb3JkZXIiLCBkZWZhdWx0cy5nZXRDb2xvcigiaW5hY3RpdmVDYXB0aW9uQm9yZGVyIiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGNvbG9ycy5hZGQobmV3IFVJQ29sb3IoIndpbmRvdyIsIGRlZmF1bHRzLmdldENvbG9yKCJ3aW5kb3ciKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigid2luZG93Qm9yZGVyIiwgZGVmYXVsdHMuZ2V0Q29sb3IoIndpbmRvd0JvcmRlciIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJ3aW5kb3dUZXh0IiwgZGVmYXVsdHMuZ2V0Q29sb3IoIndpbmRvd1RleHQiKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigibWVudSIsIGRlZmF1bHRzLmdldENvbG9yKCJtZW51IiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGNvbG9ycy5hZGQobmV3IFVJQ29sb3IoIm1lbnVUZXh0IiwgZGVmYXVsdHMuZ2V0Q29sb3IoIm1lbnVUZXh0IiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGNvbG9ycy5hZGQobmV3IFVJQ29sb3IoInRleHQiLCBkZWZhdWx0cy5nZXRDb2xvcigidGV4dCIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJ0ZXh0VGV4dCIsIGRlZmF1bHRzLmdldENvbG9yKCJ0ZXh0VGV4dCIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJ0ZXh0SGlnaGxpZ2h0IiwgZGVmYXVsdHMuZ2V0Q29sb3IoInRleHRIaWdobGlnaHQiKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigidGV4dEhpZ2hsaWdodFRleHQiLCBkZWZhdWx0cy5nZXRDb2xvcigidGV4dEhpZ2hsaWdodFRleHQiKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigidGV4dEluYWN0aXZlVGV4dCIsIGRlZmF1bHRzLmdldENvbG9yKCJ0ZXh0SW5hY3RpdmVUZXh0IiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGNvbG9ycy5hZGQobmV3IFVJQ29sb3IoImNvbnRyb2wiLCBkZWZhdWx0cy5nZXRDb2xvcigiY29udHJvbCIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJjb250cm9sVGV4dCIsIGRlZmF1bHRzLmdldENvbG9yKCJjb250cm9sVGV4dCIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJjb250cm9sSGlnaGxpZ2h0IiwgZGVmYXVsdHMuZ2V0Q29sb3IoImNvbnRyb2xIaWdobGlnaHQiKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigiY29udHJvbExIaWdobGlnaHQiLCBkZWZhdWx0cy5nZXRDb2xvcigiY29udHJvbExIaWdobGlnaHQiKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigiY29udHJvbFNoYWRvdyIsIGRlZmF1bHRzLmdldENvbG9yKCJjb250cm9sU2hhZG93IiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGNvbG9ycy5hZGQobmV3IFVJQ29sb3IoImNvbnRyb2xEa1NoYWRvdyIsIGRlZmF1bHRzLmdldENvbG9yKCJjb250cm9sRGtTaGFkb3ciKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigic2Nyb2xsYmFyIiwgZGVmYXVsdHMuZ2V0Q29sb3IoInNjcm9sbGJhciIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBjb2xvcnMuYWRkKG5ldyBVSUNvbG9yKCJpbmZvIiwgZGVmYXVsdHMuZ2V0Q29sb3IoImluZm8iKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgY29sb3JzLmFkZChuZXcgVUlDb2xvcigiaW5mb1RleHQiLCBkZWZhdWx0cy5nZXRDb2xvcigiaW5mb1RleHQiKSwgbW9kZWxEZWZhdWx0cykpOworCisgICAgICAgICAgICBmb250cy5hZGQobmV3IFVJRm9udCgiZGlhbG9nUGxhaW4iLCBkZWZhdWx0cy5nZXRGb250KCJCdXR0b24uZm9udCIpLCBtb2RlbERlZmF1bHRzKSk7CisgICAgICAgICAgICBmb250cy5hZGQobmV3IFVJRm9udCgic2VyaWZQbGFpbiIsIGRlZmF1bHRzLmdldEZvbnQoIlRleHRQYW5lLmZvbnQiKSwgbW9kZWxEZWZhdWx0cykpOworICAgICAgICAgICAgZm9udHMuYWRkKG5ldyBVSUZvbnQoInNhbnNTZXJpZlBsYWluIiwgZGVmYXVsdHMuZ2V0Rm9udCgiVG9vbFRpcC5mb250IiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGZvbnRzLmFkZChuZXcgVUlGb250KCJtb25vc3BhY2VkUGxhaW4iLCBkZWZhdWx0cy5nZXRGb250KCJUZXh0QXJlYS5mb250IiksIG1vZGVsRGVmYXVsdHMpKTsKKyAgICAgICAgICAgIGZvbnRzLmFkZChuZXcgVUlGb250KCJkaWFsb2dCb2xkIiwgZGVmYXVsdHMuZ2V0Rm9udCgiSW50ZXJuYWxGcmFtZS50aXRsZUZvbnQiKSwgbW9kZWxEZWZhdWx0cykpOworCisgICAgICAgICAgICBpbnNldHMuYWRkKG5ldyBVSUluc2V0cygiemVyb0luc2V0cyIsIG5ldyBJbnNldHMoMCwgMCwgMCwgMCkpKTsKKyAgICAgICAgICAgIGluc2V0cy5hZGQobmV3IFVJSW5zZXRzKCJ0d29JbnNldHMiLCBuZXcgSW5zZXRzKDIsIDIsIDIsIDIpKSk7CisgICAgICAgICAgICBpbnNldHMuYWRkKG5ldyBVSUluc2V0cygidGhyZWVJbnNldHMiLCBuZXcgSW5zZXRzKDMsIDMsIDMsIDMpKSk7CisKKyAgICAgICAgICAgIGJvcmRlcnMuYWRkKG5ldyBVSUJvcmRlcigibWFyZ2luQm9yZGVyIiwgZGVmYXVsdHMuZ2V0Qm9yZGVyKCJNZW51SXRlbS5ib3JkZXIiKSkpOworICAgICAgICAgICAgYm9yZGVycy5hZGQobmV3IFVJQm9yZGVyKCJldGNoZWRCb3JkZXIiLCBkZWZhdWx0cy5nZXRCb3JkZXIoIlRpdGxlZEJvcmRlci5ib3JkZXIiKSkpOworICAgICAgICAgICAgYm9yZGVycy5hZGQobmV3IFVJQm9yZGVyKCJsb3dlcmVkQmV2ZWxCb3JkZXIiLCBkZWZhdWx0cy5nZXRCb3JkZXIoIlRhYmxlLnNjcm9sbFBhbmVCb3JkZXIiKSkpOworICAgICAgICAgICAgYm9yZGVycy5hZGQobmV3IFVJQm9yZGVyKCJibGFja0xpbmVCb3JkZXIiLCBkZWZhdWx0cy5nZXRCb3JkZXIoIlRvb2xUaXAuYm9yZGVyIikpKTsKKworICAgICAgICAgICAgLy9UT0RPIGhhdmUgdG8gZGVhbCB3aXRoIHRoZSBzcGVjaWFsIGFycm93IGJ1dHRvbiByZWdpb24KKworICAgICAgICAgICAgLy9wcmUtaW5pdCB0aGUgbGlzdCBvZiBVSSBjb21wb25lbnRzCisgICAgICAgICAgICBVSUNvbXBvbmVudCBidXR0b24gPSBuZXcgVUlDb21wb25lbnQoIkJ1dHRvbiIsIEpCdXR0b24uY2xhc3MuZ2V0TmFtZSgpLCAiQnV0dG9uVUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCBidXR0b24sIERFRkFVTFQsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKGJ1dHRvbik7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHRvZ2dsZUJ1dHRvbiA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiVG9nZ2xlQnV0dG9uIiwgSlRvZ2dsZUJ1dHRvbi5jbGFzcy5nZXROYW1lKCksICJUb2dnbGVCdXR0b25VSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIHRvZ2dsZUJ1dHRvbiwgREVGQVVMVCwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQsIFNFTEVDVEVELAorICAgICAgICAgICAgICAgICAgICBTRUxFQ1RFRCB8IFBSRVNTRUQsIFNFTEVDVEVEIHwgTU9VU0VfT1ZFUiwgRElTQUJMRUQgfCBTRUxFQ1RFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZCh0b2dnbGVCdXR0b24pOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCByYWRpb0J1dHRvbiA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiUmFkaW9CdXR0b24iLCBKUmFkaW9CdXR0b24uY2xhc3MuZ2V0TmFtZSgpLCAiUmFkaW9CdXR0b25VSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIHJhZGlvQnV0dG9uLCBERUZBVUxULCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCwgU0VMRUNURUQsCisgICAgICAgICAgICAgICAgICAgIFNFTEVDVEVEIHwgUFJFU1NFRCwgU0VMRUNURUQgfCBNT1VTRV9PVkVSLCBESVNBQkxFRCB8IFNFTEVDVEVEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHJhZGlvQnV0dG9uKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgY2hlY2tCb3ggPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIkNoZWNrQm94IiwgSkNoZWNrQm94LmNsYXNzLmdldE5hbWUoKSwgIkNoZWNrQm94VUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCBjaGVja0JveCwgREVGQVVMVCwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQsIFNFTEVDVEVELAorICAgICAgICAgICAgICAgICAgICBTRUxFQ1RFRCB8IFBSRVNTRUQsIFNFTEVDVEVEIHwgTU9VU0VfT1ZFUiwgRElTQUJMRUQgfCBTRUxFQ1RFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChjaGVja0JveCk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbG9yQ2hvb3NlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiQ29sb3JDaG9vc2VyIiwgSkNvbG9yQ2hvb3Nlci5jbGFzcy5nZXROYW1lKCksICJDb2xvckNob29zZXJVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIGNvbG9yQ2hvb3NlciwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoY29sb3JDaG9vc2VyKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgY29tYm9Cb3ggPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIkNvbWJvQm94IiwgSkNvbWJvQm94LmNsYXNzLmdldE5hbWUoKSwgIkNvbWJvQm94VUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCBjb21ib0JveCwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoY29tYm9Cb3gpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCBmaWxlQ2hvb3NlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiRmlsZUNob29zZXIiLCBKRmlsZUNob29zZXIuY2xhc3MuZ2V0TmFtZSgpLCAiRmlsZUNob29zZXJVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIGZpbGVDaG9vc2VyLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChmaWxlQ2hvb3Nlcik7CisKKyAgICAgICAgICAgIC8vbm90IHJlcHJlc2VudGVkIGluIFN5bnRoCisvLyAgICAgICAgVUlDb21wb25lbnQgIGZpbGVWaWV3ID0gbmV3IFVJQ29tcG9uZW50ICgiRmlsZVZpZXciLAorLy8gICAgICAgICAgICAgICAgbGlzdChESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IGludGVybmFsRnJhbWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIkludGVybmFsRnJhbWUiLCBKSW50ZXJuYWxGcmFtZS5jbGFzcy5nZXROYW1lKCksICJJbnRlcm5hbEZyYW1lVUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCBpbnRlcm5hbEZyYW1lLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICAvL2hhcyBhbiBpbnRlcm5hbCBmcmFtZSB0aXRsZSBwYW5lIHJlZ2lvbgorICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoaW50ZXJuYWxGcmFtZSk7CisKKyAgICAgICAgICAgIC8vVE9ETyBEZXNrdG9wSWNvbiA/Pz8KKworICAgICAgICAgICAgVUlDb21wb25lbnQgZGVza3RvcCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiRGVza3RvcCIsIEpEZXNrdG9wUGFuZS5jbGFzcy5nZXROYW1lKCksICJEZXNrdG9wUGFuZVVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgZGVza3RvcCwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoZGVza3RvcCk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IGxhYmVsID0gbmV3IFVJQ29tcG9uZW50KCJMYWJlbCIsIEpMYWJlbC5jbGFzcy5nZXROYW1lKCksICJMYWJlbFVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgbGFiZWwsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKGxhYmVsKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgbGlzdCA9IG5ldyBVSUNvbXBvbmVudCgiTGlzdCIsIEpMaXN0LmNsYXNzLmdldE5hbWUoKSwgIkxpc3RVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIGxpc3QsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKGxpc3QpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCBtZW51QmFyID0gbmV3IFVJQ29tcG9uZW50KCJNZW51QmFyIiwgSk1lbnVCYXIuY2xhc3MuZ2V0TmFtZSgpLCAiTWVudUJhclVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgbWVudUJhciwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQobWVudUJhcik7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IG1lbnVJdGVtID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVJQ29tcG9uZW50KCJNZW51SXRlbSIsIEpNZW51SXRlbS5jbGFzcy5nZXROYW1lKCksICJNZW51SXRlbVVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgbWVudUl0ZW0sIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIC8vaGFzIGEgbWVudUl0ZW1BY2NlbGVyYXRvciByZWdpb24KKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKG1lbnVJdGVtKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgcmFkaW9CdXR0b25NZW51SXRlbSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiUmFkaW9CdXR0b25NZW51SXRlbSIsIEpSYWRpb0J1dHRvbk1lbnVJdGVtLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFkaW9CdXR0b25NZW51SXRlbVVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgcmFkaW9CdXR0b25NZW51SXRlbSwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQocmFkaW9CdXR0b25NZW51SXRlbSk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IGNoZWNrQm94TWVudUl0ZW0gPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIkNoZWNrQm94TWVudUl0ZW0iLCBKQ2hlY2tCb3hNZW51SXRlbS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNrQm94TWVudUl0ZW1VSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIGNoZWNrQm94TWVudUl0ZW0sIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKGNoZWNrQm94TWVudUl0ZW0pOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCBtZW51ID0gbmV3IFVJQ29tcG9uZW50KCJNZW51IiwgSk1lbnUuY2xhc3MuZ2V0TmFtZSgpLCAiTWVudVVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgbWVudSwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQobWVudSk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHBvcHVwTWVudSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiUG9wdXBNZW51IiwgSlBvcHVwTWVudS5jbGFzcy5nZXROYW1lKCksICJQb3B1cE1lbnVVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIHBvcHVwTWVudSwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgLy9oYXMgYSBwb3B1cE1lbnVTZXBhcmF0b3IgcmVnaW9uCisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChwb3B1cE1lbnUpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCBvcHRpb25QYW5lID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVJQ29tcG9uZW50KCJPcHRpb25QYW5lIiwgSk9wdGlvblBhbmUuY2xhc3MuZ2V0TmFtZSgpLCAiT3B0aW9uUGFuZVVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgb3B0aW9uUGFuZSwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQob3B0aW9uUGFuZSk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHBhbmVsID0gbmV3IFVJQ29tcG9uZW50KCJQYW5lbCIsIEpQYW5lbC5jbGFzcy5nZXROYW1lKCksICJQYW5lbFVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgcGFuZWwsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHBhbmVsKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgcHJvZ3Jlc3NCYXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIlByb2dyZXNzQmFyIiwgSlByb2dyZXNzQmFyLmNsYXNzLmdldE5hbWUoKSwgIlByb2dyZXNzQmFyVUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCBwcm9ncmVzc0JhciwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQocHJvZ3Jlc3NCYXIpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCBzZXBhcmF0b3IgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIlNlcGFyYXRvciIsIEpTZXBhcmF0b3IuY2xhc3MuZ2V0TmFtZSgpLCAiU2VwYXJhdG9yVUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCBzZXBhcmF0b3IsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHNlcGFyYXRvcik7CisKKyAgICAgICAgICAgIFVJUmVnaW9uIHNjcm9sbEJhclRodW1iID0gbmV3IFVJUmVnaW9uKCJTY3JvbGxCYXIuVGh1bWIiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCBzY3JvbGxCYXJUaHVtYiwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgVUlSZWdpb24gc2Nyb2xsQmFyVHJhY2sgPSBuZXcgVUlSZWdpb24oIlNjcm9sbEJhci5UcmFjayIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIHNjcm9sbEJhclRyYWNrLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICBVSUNvbXBvbmVudCBzY3JvbGxCYXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIlNjcm9sbEJhciIsIEpTY3JvbGxCYXIuY2xhc3MuZ2V0TmFtZSgpLCAiU2Nyb2xsQmFyVUkiLCBzY3JvbGxCYXJUaHVtYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxCYXJUcmFjayk7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgc2Nyb2xsQmFyLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChzY3JvbGxCYXIpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCBzY3JvbGxQYW5lID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVJQ29tcG9uZW50KCJTY3JvbGxQYW5lIiwgSlNjcm9sbFBhbmUuY2xhc3MuZ2V0TmFtZSgpLCAiU2Nyb2xsUGFuZVVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgc2Nyb2xsUGFuZSwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoc2Nyb2xsUGFuZSk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHZpZXdwb3J0ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVJQ29tcG9uZW50KCJWaWV3cG9ydCIsIEpWaWV3cG9ydC5jbGFzcy5nZXROYW1lKCksICJWaWV3cG9ydFVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgdmlld3BvcnQsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHZpZXdwb3J0KTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgc2xpZGVyID0gbmV3IFVJQ29tcG9uZW50KCJTbGlkZXIiLCBKU2xpZGVyLmNsYXNzLmdldE5hbWUoKSwgIlNsaWRlclVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgc2xpZGVyLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICAvL2hhcyBzbGlkZXJUaHVtYiBhbmQgc2xpZGVyVHJhY2sgc3ViIHJlZ2lvbnMKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHNsaWRlcik7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHNwaW5uZXIgPSBuZXcgVUlDb21wb25lbnQoIlNwaW5uZXIiLCBKU3Bpbm5lci5jbGFzcy5nZXROYW1lKCksICJTcGlubmVyVUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCBzcGlubmVyLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChzcGlubmVyKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgc3BsaXRQYW5lID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVJQ29tcG9uZW50KCJTcGxpdFBhbmUiLCBKU3BsaXRQYW5lLmNsYXNzLmdldE5hbWUoKSwgIlNwbGl0UGFuZVVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgc3BsaXRQYW5lLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICAvL2hhcyBzcGxpdFBhbmVEaXZpZGVyIHN1YiByZWdpb24KKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHNwbGl0UGFuZSk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHRhYmJlZFBhbmUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIlRhYmJlZFBhbmUiLCBKVGFiYmVkUGFuZS5jbGFzcy5nZXROYW1lKCksICJUYWJiZWRQYW5lVUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCB0YWJiZWRQYW5lLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICAvL2hhcyB0YWJiZWRQYW5lQ29udGVudCBhbmQgdGFiYmVkUGFuZVRhYiBhbmQgVGFiYmVkUGFuZVRhYkFyZWEgc3ViIHJlZ2lvbnMKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHRhYmJlZFBhbmUpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCB0YWJsZSA9IG5ldyBVSUNvbXBvbmVudCgiVGFibGUiLCBKVGFibGUuY2xhc3MuZ2V0TmFtZSgpLCAiVGFibGVVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIHRhYmxlLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZCh0YWJsZSk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHRhYmxlSGVhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVJQ29tcG9uZW50KCJUYWJsZUhlYWRlciIsIEpUYWJsZUhlYWRlci5jbGFzcy5nZXROYW1lKCksICJUYWJsZUhlYWRlclVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgdGFibGVIZWFkZXIsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHRhYmxlSGVhZGVyKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgdGV4dEZpZWxkID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVJQ29tcG9uZW50KCJUZXh0RmllbGQiLCBKVGV4dEZpZWxkLmNsYXNzLmdldE5hbWUoKSwgIlRleHRGaWVsZFVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgdGV4dEZpZWxkLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZCh0ZXh0RmllbGQpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCBmb3JtYXR0ZWRUZXh0RmllbGQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVUlDb21wb25lbnQoIkZvcm1hdHRlZFRleHRGaWVsZCIsIEpGb3JtYXR0ZWRUZXh0RmllbGQuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXR0ZWRUZXh0RmllbGRVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIGZvcm1hdHRlZFRleHRGaWVsZCwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoZm9ybWF0dGVkVGV4dEZpZWxkKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgcGFzc3dvcmRGaWVsZCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiUGFzc3dvcmRGaWVsZCIsIEpQYXNzd29yZEZpZWxkLmNsYXNzLmdldE5hbWUoKSwgIlBhc3N3b3JkRmllbGRVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIHBhc3N3b3JkRmllbGQsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHBhc3N3b3JkRmllbGQpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCB0ZXh0QXJlYSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiVGV4dEFyZWEiLCBKVGV4dEFyZWEuY2xhc3MuZ2V0TmFtZSgpLCAiVGV4dEFyZWFVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIHRleHRBcmVhLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZCh0ZXh0QXJlYSk7CisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHRleHRQYW5lID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVJQ29tcG9uZW50KCJUZXh0UGFuZSIsIEpUZXh0UGFuZS5jbGFzcy5nZXROYW1lKCksICJUZXh0UGFuZVVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgdGV4dFBhbmUsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHRleHRQYW5lKTsKKworICAgICAgICAgICAgVUlDb21wb25lbnQgZWRpdG9yUGFuZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiRWRpdG9yUGFuZSIsIEpFZGl0b3JQYW5lLmNsYXNzLmdldE5hbWUoKSwgIkVkaXRvclBhbmVVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIGVkaXRvclBhbmUsIERJU0FCTEVELCBFTkFCTEVELCBGT0NVU0VELCBNT1VTRV9PVkVSLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKGVkaXRvclBhbmUpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgKiBUaGUgb25seSB0aGluZyBub3QgcmVwcmVzZW50ZWQgaW4gU3ludGggYXMgYSByZWdpb24uIEkgc3VwcG9zZSB3ZSdsbCBoYXZlCisgICAgICAgICAgICAqIHRvIG1ha2UgaXQgYSBDdXN0b21VSUNvbXBvbmVudAorICAgICAgICAgICAgKi8KKy8vICAgICAgICBVSUNvbXBvbmVudCAgdGl0bGVkQm9yZGVyID0gbmV3IFVJQ29tcG9uZW50ICgiVGl0bGVkQm9yZGVyIiwKKy8vICAgICAgICAgICAgICAgIGxpc3QoRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCB0b29sQmFyID0gbmV3IFVJQ29tcG9uZW50KCJUb29sQmFyIiwgSlRvb2xCYXIuY2xhc3MuZ2V0TmFtZSgpLCAiVG9vbEJhclVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgdG9vbEJhciwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgLy90b29sQmFyQ29udGVudCwgdG9vbEJhckRyYWdXaW5kb3csIHRvb2xCYXJTZXBhcmF0b3Igc3ViIHJlZ2lvbnMKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHRvb2xCYXIpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCB0b29sVGlwID0gbmV3IFVJQ29tcG9uZW50KCJUb29sVGlwIiwgSlRvb2xUaXAuY2xhc3MuZ2V0TmFtZSgpLCAiVG9vbFRpcFVJIik7CisgICAgICAgICAgICBhZGRTdGF0ZXModGhpcywgdG9vbFRpcCwgRElTQUJMRUQsIEVOQUJMRUQsIEZPQ1VTRUQsIE1PVVNFX09WRVIsIFBSRVNTRUQpOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQodG9vbFRpcCk7CisKKyAgICAgICAgICAgIC8vdG9vbHRpcCBtYW5hZ2VyCisKKyAgICAgICAgICAgIFVJQ29tcG9uZW50IHRyZWUgPSBuZXcgVUlDb21wb25lbnQoIlRyZWUiLCBKVHJlZS5jbGFzcy5nZXROYW1lKCksICJUcmVlVUkiKTsKKyAgICAgICAgICAgIGFkZFN0YXRlcyh0aGlzLCB0cmVlLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICAvL3RyZWVDZWxsIHN1YiByZWdpb24KKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHRyZWUpOworCisgICAgICAgICAgICBVSUNvbXBvbmVudCByb290UGFuZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVSUNvbXBvbmVudCgiUm9vdFBhbmUiLCBKUm9vdFBhbmUuY2xhc3MuZ2V0TmFtZSgpLCAiUm9vdFBhbmVVSSIpOworICAgICAgICAgICAgYWRkU3RhdGVzKHRoaXMsIHJvb3RQYW5lLCBESVNBQkxFRCwgRU5BQkxFRCwgRk9DVVNFRCwgTU9VU0VfT1ZFUiwgUFJFU1NFRCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChyb290UGFuZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxVSVBhaW50PiBnZXRDb2xvclBhbGV0dGUoKSB7CisgICAgICAgIHJldHVybiBjb2xvcnM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VUlGb250PiBnZXRGb250UGFsZXR0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZvbnRzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFVJSW5zZXRzPiBnZXRJbnNldFBhbGV0dGUoKSB7CisgICAgICAgIHJldHVybiBpbnNldHM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VUlCb3JkZXI+IGdldEJvcmRlclBhbGV0dGUoKSB7CisgICAgICAgIHJldHVybiBib3JkZXJzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFVJRGltZW5zaW9uPiBnZXREaW1lbnNpb25QYWxldHRlKCkgeworICAgICAgICByZXR1cm4gZGltZW5zaW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxVSUljb24+IGdldEljb25QYWxldHRlKCkgeworICAgICAgICByZXR1cm4gaWNvbnM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VUlDb21wb25lbnQ+IGdldENvbXBvbmVudHMoKSB7CisgICAgICAgIHJldHVybiBjb21wb25lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbG9jYWwgVUlEZWZhdWx0cyB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgVUlEZWZhdWx0cyBpbiB0aGlzIHN5bnRoIG1vZGVsLiBJdCBpcyBrZXB0IHVwdG9kYXRlIGJ5IHRoZQorICAgICAqIGluZGVydmlkdWFsIFVJRGVmYXVsdHMgbm9kZXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFVJRGVmYXVsdHMgZm9yIHRoZSBzeW50aCBtb2RlbAorICAgICAqLworICAgIHB1YmxpYyBVSURlZmF1bHRzIGdldFVpRGVmYXVsdHMoKSB7CisgICAgICAgIHJldHVybiBtb2RlbERlZmF1bHRzOworICAgIH0KKworICAgIHB1YmxpYyBVSVN0eWxlIGdldFN0eWxlKCkgeworICAgICAgICByZXR1cm4gZ2xvYmFsU3R5bGU7CisgICAgfQorCisgICAgLy8gYnkgZGVmYXVsdCB0aGVyZSBhcmUgbm8gcGFpbnRlcnMgYXNzaWduZWQgdG8gdGhlIHZhcmlvdXMgc3RhdGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTdGF0ZXMoU3ludGhNb2RlbCBtb2RlbCwgVUlSZWdpb24gcGFyZW50UmVnaW9uLCBpbnQuLi4gc3RhdGVzKSB7CisgICAgICAgIGZvciAoaW50IHN0YXRlIDogc3RhdGVzKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gc3RhdGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgRU5BQkxFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0YXRlTGlzdC5hZGQoVUlTdGF0ZVR5cGUuRU5BQkxFRF9LRVkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzdGF0ZSAmIE1PVVNFX09WRVIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZUxpc3QuYWRkKFVJU3RhdGVUeXBlLk1PVVNFX09WRVJfS0VZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBQUkVTU0VEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGVMaXN0LmFkZChVSVN0YXRlVHlwZS5QUkVTU0VEX0tFWSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgRElTQUJMRUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZUxpc3QuYWRkKFVJU3RhdGVUeXBlLkRJU0FCTEVEX0tFWSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgRk9DVVNFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0YXRlTGlzdC5hZGQoVUlTdGF0ZVR5cGUuRk9DVVNFRF9LRVkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFNFTEVDVEVEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGVMaXN0LmFkZChVSVN0YXRlVHlwZS5TRUxFQ1RFRF9LRVkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzdGF0ZSAmIERFRkFVTFQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZUxpc3QuYWRkKFVJU3RhdGVUeXBlLkRFRkFVTFRfS0VZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcmVudFJlZ2lvbi5hZGRCYWNrZ3JvdW5kU3RhdGUobmV3IFVJU3RhdGUobW9kZWwsIHBhcmVudFJlZ2lvbiwgc3RhdGVMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tzdGF0ZUxpc3Quc2l6ZSgpXSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldFJlc291cmNlc0RpcigpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlc0RpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXNEaXIoRmlsZSByZXNvdXJjZXNEaXIpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTeW50aE1vZGVsLnNldFJlc291cmNlc0RpcigiICsgcmVzb3VyY2VzRGlyICsgIikiKTsKKyAgICAgICAgRmlsZSBvbGQgPSBnZXRSZXNvdXJjZXNEaXIoKTsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXNEaXIgPSByZXNvdXJjZXNEaXI7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicmVzb3VyY2VzRGlyIiwgb2xkLCBnZXRSZXNvdXJjZXNEaXIoKSk7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0SW1hZ2VzRGlyKCkgeworICAgICAgICByZXR1cm4gaW1hZ2VzRGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlc0RpcihGaWxlIGltYWdlc0RpcikgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN5bnRoTW9kZWwuc2V0SW1hZ2VzRGlyKCIgKyBpbWFnZXNEaXIgKyAiKSIpOworICAgICAgICBGaWxlIG9sZCA9IGdldEltYWdlc0RpcigpOworICAgICAgICB0aGlzLmltYWdlc0RpciA9IGltYWdlc0RpcjsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJpbWFnZXNEaXIiLCBvbGQsIGdldEltYWdlc0RpcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRUZW1wbGF0ZXNEaXIoKSB7CisgICAgICAgIHJldHVybiB0ZW1wbGF0ZXNEaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVtcGxhdGVzRGlyKEZpbGUgdGVtcGxhdGVzRGlyKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3ludGhNb2RlbC5zZXRUZW1wbGF0ZXNEaXIoIiArIHRlbXBsYXRlc0RpciArICIpIik7CisgICAgICAgIEZpbGUgb2xkID0gZ2V0VGVtcGxhdGVzRGlyKCk7CisgICAgICAgIHRoaXMudGVtcGxhdGVzRGlyID0gdGVtcGxhdGVzRGlyOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInRlbXBsYXRlc0RpciIsIG9sZCwgZ2V0VGVtcGxhdGVzRGlyKCkpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gSklCWCBNZXRob2RzCisKKyAgICBwdWJsaWMgdm9pZCBwcmVTZXQoSVVubWFyc2hhbGxpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgRmlsZSByZXNvdXJjZXNEaXIgPSAoRmlsZSkgY29udGV4dC5nZXRVc2VyQ29udGV4dCgpOworICAgICAgICB0aGlzLnJlc291cmNlc0RpciA9IHJlc291cmNlc0RpcjsKKyAgICAgICAgdGhpcy5pbWFnZXNEaXIgPSBuZXcgRmlsZShyZXNvdXJjZXNEaXIsICJpbWFnZXMiKTsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZXNEaXIgPSBuZXcgRmlsZShyZXNvdXJjZXNEaXIsICJ0ZW1wbGF0ZXMiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1N5bnRoTW9kZWwuamlieC54bWwgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1N5bnRoTW9kZWwuamlieC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxNzcyYQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvU3ludGhNb2RlbC5qaWJ4LnhtbApAQCAtMCwwICsxLDE4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPCEtLQorIENvcHlyaWdodCAxOTk4LTIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgorCis8IURPQ1RZUEUgYmluZGluZyBTWVNURU0gImh0dHA6Ly9qaWJ4LnNvdXJjZWZvcmdlLm5ldCI+Cis8YmluZGluZz4KKyAgICA8bWFwcGluZyBjbGFzcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSURlZmF1bHQiIGFic3RyYWN0PSJ0cnVlIiBwb3N0LXNldD0icG9zdFNldCI+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJuYW1lIiBmaWVsZD0ibmFtZSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8IS0tID09IEFXVCBUWVBFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxtYXBwaW5nIGNsYXNzPSJqYXZhLmF3dC5Db2xvciIKKyAgICAgICAgICAgICBtYXJzaGFsbGVyPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzLkNvbG9yTWFwcGVyIgorICAgICAgICAgICAgIHVubWFyc2hhbGxlcj0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5qaWJ4aGVscGVycy5Db2xvck1hcHBlciIvPgorICAgIDxtYXBwaW5nIGNsYXNzPSJqYXZhLmxhbmcuQ2xhc3MiCisgICAgICAgICAgICAgbWFyc2hhbGxlcj0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5qaWJ4aGVscGVycy5DbGFzc01hcHBlciIKKyAgICAgICAgICAgICB1bm1hcnNoYWxsZXI9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuamlieGhlbHBlcnMuQ2xhc3NNYXBwZXIiLz4KKyAgICA8IS0tID09IFVJIEZPTlQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8bWFwcGluZyBuYW1lPSJ0eXBlZmFjZSIgY2xhc3M9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuZm9udC5UeXBlZmFjZSIgcG9zdC1zZXQ9InBvc3RTZXQiPgorICAgICAgICA8dmFsdWUgbmFtZT0iZmFtaWx5IiBmaWVsZD0ibmFtZSIgc3R5bGU9ImF0dHJpYnV0ZSIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJib2xkIiBmaWVsZD0iYm9sZCIgc3R5bGU9ImF0dHJpYnV0ZSIgdXNhZ2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJEZWZhdWx0Ii8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJpdGFsaWMiIGZpZWxkPSJpdGFsaWMiIHN0eWxlPSJhdHRyaWJ1dGUiIHVzYWdlPSJvcHRpb25hbCIgZGVmYXVsdD0iRGVmYXVsdCIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ic2l6ZSIgZmllbGQ9InNpemUiIHN0eWxlPSJhdHRyaWJ1dGUiIHVzYWdlPSJvcHRpb25hbCIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ic2l6ZU9mZnNldCIgZmllbGQ9InNpemVPZmZzZXQiIHN0eWxlPSJhdHRyaWJ1dGUiIHVzYWdlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0idWlEZWZhdWx0UGFyZW50TmFtZSIgZmllbGQ9InVpRGVmYXVsdFBhcmVudE5hbWUiIHN0eWxlPSJhdHRyaWJ1dGUiIHVzYWdlPSJvcHRpb25hbCIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJ1aUZvbnQiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJRm9udCIKKyAgICAgICAgICAgICBleHRlbmRzPSJvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJRGVmYXVsdCI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJRGVmYXVsdCIvPgorICAgICAgICA8Y29sbGVjdGlvbiBnZXQtbWV0aG9kPSJnZXRGb250cyIgc2V0LW1ldGhvZD0ic2V0Rm9udHMiIGNyZWF0ZS10eXBlPSJqYXZhLnV0aWwuQXJyYXlMaXN0Ii8+CisgICAgPC9tYXBwaW5nPgorICAgIDwhLS0gPT0gVUkgSU5TRVRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPG1hcHBpbmcgbmFtZT0idWlJbnNldHMiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJSW5zZXRzIgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlEZWZhdWx0Ij4KKyAgICAgICAgPHN0cnVjdHVyZSBtYXAtYXM9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlEZWZhdWx0Ii8+CisgICAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0iaW5zZXRzIiBnZXQtbWV0aG9kPSJnZXRJbnNldHMiIHNldC1tZXRob2Q9InNldEluc2V0cyIKKyAgICAgICAgICAgICAgICAgICBtYXJzaGFsbGVyPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzLkluc2V0c01hcHBlciIKKyAgICAgICAgICAgICAgICAgICB1bm1hcnNoYWxsZXI9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnMuSW5zZXRzTWFwcGVyIi8+CisgICAgPC9tYXBwaW5nPgorICAgIDwhLS0gPT0gVUkgUEFJTlQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8bWFwcGluZyBuYW1lPSJtYXR0ZSIgY2xhc3M9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuTWF0dGUiIHBvc3Qtc2V0PSJwb3N0U2V0Ij4KKyAgICAgICAgPHZhbHVlIG5hbWU9InJlZCIgZmllbGQ9InJlZCIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iZ3JlZW4iIGZpZWxkPSJncmVlbiIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iYmx1ZSIgZmllbGQ9ImJsdWUiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImFscGhhIiBmaWVsZD0iYWxwaGEiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9InVpRGVmYXVsdFBhcmVudE5hbWUiIGZpZWxkPSJ1aURlZmF1bHRQYXJlbnROYW1lIiBzdHlsZT0iYXR0cmlidXRlIiB1c2FnZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImNvbXBvbmVudFByb3BlcnR5TmFtZSIgZmllbGQ9ImNvbXBvbmVudFByb3BlcnR5TmFtZSIgc3R5bGU9ImF0dHJpYnV0ZSIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJodWVPZmZzZXQiIGZpZWxkPSJodWVPZmZzZXQiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9InNhdHVyYXRpb25PZmZzZXQiIGZpZWxkPSJzYXR1cmF0aW9uT2Zmc2V0IiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJicmlnaHRuZXNzT2Zmc2V0IiBmaWVsZD0iYnJpZ2h0bmVzc09mZnNldCIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iYWxwaGFPZmZzZXQiIGZpZWxkPSJhbHBoYU9mZnNldCIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0idWlSZXNvdXJjZSIgZmllbGQ9InVpUmVzb3VyY2UiIHN0eWxlPSJhdHRyaWJ1dGUiIHVzYWdlPSJvcHRpb25hbCIgZGVmYXVsdD0idHJ1ZSIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBjbGFzcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVBhaW50IiBhYnN0cmFjdD0idHJ1ZSIgdHlwZS1uYW1lPSJ1aXBhaW50IgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlEZWZhdWx0Ij4KKyAgICAgICAgPHN0cnVjdHVyZSBtYXAtYXM9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlEZWZhdWx0Ii8+CisgICAgICAgIDxzdHJ1Y3R1cmUgZ2V0LW1ldGhvZD0iZ2V0UGFpbnQiIHNldC1tZXRob2Q9InNldFBhaW50Ii8+CisgICAgPC9tYXBwaW5nPgorICAgIDxtYXBwaW5nIG5hbWU9InVpUGFpbnQiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJUGFpbnQiCisgICAgICAgICAgICAgZXh0ZW5kcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSURlZmF1bHQiPgorICAgICAgICA8c3RydWN0dXJlIG1hcC1hcz0idWlwYWludCIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJ1aUNvbG9yIiBjbGFzcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSUNvbG9yIgorICAgICAgICAgICAgIGV4dGVuZHM9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlQYWludCI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJ1aXBhaW50Ii8+CisgICAgPC9tYXBwaW5nPgorICAgIDwhLS0gPT0gVUkgU1RZTEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8bWFwcGluZyBjbGFzcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVN0eWxlIiBhYnN0cmFjdD0idHJ1ZSIgcG9zdC1zZXQ9InBvc3RTZXQiPgorICAgICAgICA8c3RydWN0dXJlIGZpZWxkPSJmb250IiB1c2FnZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPHN0cnVjdHVyZSBuYW1lPSJ0ZXh0Rm9yZWdyb3VuZCIgdXNhZ2U9Im9wdGlvbmFsIj4KKyAgICAgICAgICAgIDxzdHJ1Y3R1cmUgZmllbGQ9InRleHRGb3JlZ3JvdW5kIiB1c2FnZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPC9zdHJ1Y3R1cmU+CisgICAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0idGV4dEJhY2tncm91bmQiIHVzYWdlPSJvcHRpb25hbCI+CisgICAgICAgICAgICA8c3RydWN0dXJlIGZpZWxkPSJ0ZXh0QmFja2dyb3VuZCIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDwvc3RydWN0dXJlPgorICAgICAgICA8c3RydWN0dXJlIG5hbWU9ImJhY2tncm91bmQiIHVzYWdlPSJvcHRpb25hbCI+CisgICAgICAgICAgICA8c3RydWN0dXJlIGZpZWxkPSJiYWNrZ3JvdW5kIiB1c2FnZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPC9zdHJ1Y3R1cmU+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJpbmhlcml0LWZvbnQiIGZpZWxkPSJmb250SW5oZXJpdGVkIiB1c2FnZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InRydWUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImluaGVyaXQtdGV4dEZvcmVncm91bmQiIGZpZWxkPSJ0ZXh0Rm9yZWdyb3VuZEluaGVyaXRlZCIgdXNhZ2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJ0cnVlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJpbmhlcml0LXRleHRCYWNrZ3JvdW5kIiBmaWVsZD0idGV4dEJhY2tncm91bmRJbmhlcml0ZWQiIHVzYWdlPSJvcHRpb25hbCIgZGVmYXVsdD0idHJ1ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iaW5oZXJpdC1iYWNrZ3JvdW5kIiBmaWVsZD0iYmFja2dyb3VuZEluaGVyaXRlZCIgdXNhZ2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJ0cnVlIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJoaW50QWxwaGFJbnRlcnBvbGF0aW9uIiBmaWVsZD0iaGludEFscGhhSW50ZXJwb2xhdGlvbiIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJoaW50QW50aWFsaWFzaW5nIiBmaWVsZD0iaGludEFudGlhbGlhc2luZyIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJoaW50Q29sb3JSZW5kZXJpbmciIGZpZWxkPSJoaW50Q29sb3JSZW5kZXJpbmciIHVzYWdlPSJvcHRpb25hbCIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iaGludERpdGhlcmluZyIgZmllbGQ9ImhpbnREaXRoZXJpbmciIHVzYWdlPSJvcHRpb25hbCIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iaGludEZyYWN0aW9uYWxNZXRyaWNzIiBmaWVsZD0iaGludEZyYWN0aW9uYWxNZXRyaWNzIiB1c2FnZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImhpbnRJbnRlcnBvbGF0aW9uIiBmaWVsZD0iaGludEludGVycG9sYXRpb24iIHVzYWdlPSJvcHRpb25hbCIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iaGludFJlbmRlcmluZyIgZmllbGQ9ImhpbnRSZW5kZXJpbmciIHVzYWdlPSJvcHRpb25hbCIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iaGludFN0cm9rZUNvbnRyb2wiIGZpZWxkPSJoaW50U3Ryb2tlQ29udHJvbCIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJoaW50VGV4dEFudGlhbGlhc2luZyIgZmllbGQ9ImhpbnRUZXh0QW50aWFsaWFzaW5nIiB1c2FnZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImNhY2hlU2V0dGluZ3NJbmhlcml0ZWQiIGZpZWxkPSJjYWNoZVNldHRpbmdzSW5oZXJpdGVkIiB1c2FnZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InRydWUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImNhY2hlTW9kZSIgZmllbGQ9ImNhY2hlTW9kZSIgdXNhZ2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJGSVhFRF9TSVpFUyIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ibWF4SG96Q2FjaGVkSW1nU2NhbGluZyIgZmllbGQ9Im1heEhvekNhY2hlZEltZ1NjYWxpbmciIHVzYWdlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0ibWF4VmVydENhY2hlZEltZ1NjYWxpbmciIGZpZWxkPSJtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZyIgdXNhZ2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+CisgICAgICAgIDxjb2xsZWN0aW9uIG5hbWU9InVpcHJvcGVydGllcyIgZmllbGQ9InVpUHJvcGVydGllcyIgY3JlYXRlLXR5cGU9ImphdmEudXRpbC5BcnJheUxpc3QiPgorICAgICAgICAgICAgPHN0cnVjdHVyZSBtYXJzaGFsbGVyPSJvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLmppYnhoZWxwZXJzLlVJUHJvcGVydHlNYXBwZXIiCisgICAgICAgICAgICAgICAgICAgICAgIHVubWFyc2hhbGxlcj0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5qaWJ4aGVscGVycy5VSVByb3BlcnR5TWFwcGVyIi8+CisgICAgICAgIDwvY29sbGVjdGlvbj4KKyAgICA8L21hcHBpbmc+CisgICAgPCEtLSA9PSBVSSBTVEFURSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxtYXBwaW5nIG5hbWU9InN0YXRlVHlwZSIgY2xhc3M9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlTdGF0ZVR5cGUiPgorICAgICAgICA8dmFsdWUgbmFtZT0ia2V5IiBmaWVsZD0ia2V5IiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0iY29kZVNuaXBwZXQiIHVzYWdlPSJvcHRpb25hbCIgdGVzdC1tZXRob2Q9Imhhc0NvZGVTbmlwcGV0Ij4KKyAgICAgICAgICAgIDx2YWx1ZSBmaWVsZD0iY29kZVNuaXBwZXQiIHN0eWxlPSJjZGF0YSIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDwvc3RydWN0dXJlPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJzdGF0ZSIgY2xhc3M9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlTdGF0ZSIgcG9zdC1zZXQ9InBvc3RTZXQiIHByZS1zZXQ9InByZVNldCI+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJzdGF0ZUtleXMiIGZpZWxkPSJzdGF0ZUtleXMiIHN0eWxlPSJhdHRyaWJ1dGUiIGdldC1tZXRob2Q9ImdldFN0YXRlS2V5cyIgc2V0LW1ldGhvZD0ic2V0U3RhdGVLZXlzIgorICAgICAgICAgICAgICAgc2VyaWFsaXplcj0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVN0YXRlLmtleXNUb1N0cmluZyIKKyAgICAgICAgICAgICAgIGRlc2VyaWFsaXplcj0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVN0YXRlLnN0cmluZ1RvS2V5cyIvPgorICAgICAgICA8dmFsdWUgbmFtZT0iaW52ZXJ0ZWQiIGZpZWxkPSJpbnZlcnRlZCIgc3R5bGU9ImF0dHJpYnV0ZSIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0ic3R5bGUiIGZpZWxkPSJzdHlsZSIvPgorICAgICAgICA8c3RydWN0dXJlIGZpZWxkPSJjYW52YXMiCisgICAgICAgICAgICAgICAgICAgbWFyc2hhbGxlcj0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5qaWJ4aGVscGVycy5DYW52YXNNYXBwZXIiCisgICAgICAgICAgICAgICAgICAgdW5tYXJzaGFsbGVyPSJvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzLkNhbnZhc01hcHBlciIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8IS0tID09IFJFR0lPTlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8bWFwcGluZyBjbGFzcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVJlZ2lvbiIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgICAgICAgdHlwZS1uYW1lPSJyZWdpb24iIHByZS1zZXQ9InByZVNldCI+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJuYW1lIiBmaWVsZD0ibmFtZSIgc3R5bGU9ImF0dHJpYnV0ZSIvPgorICAgICAgICA8dmFsdWUgbmFtZT0idWkiIGZpZWxkPSJ1aSIgc3R5bGU9ImF0dHJpYnV0ZSIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJzdWJyZWdpb24iIGZpZWxkPSJzdWJyZWdpb24iIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImtleSIgZmllbGQ9ImtleSIgc3R5bGU9ImF0dHJpYnV0ZSIgdXNhZ2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJ0aXRsZSIgZmllbGQ9InRpdGxlIiBzdHlsZT0iYXR0cmlidXRlIiB1c2FnZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPHN0cnVjdHVyZSBuYW1lPSJjb250ZW50TWFyZ2lucyIgZmllbGQ9ImNvbnRlbnRNYXJnaW5zIgorICAgICAgICAgICAgICAgICAgIG1hcnNoYWxsZXI9Im9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnMuSW5zZXRzTWFwcGVyIgorICAgICAgICAgICAgICAgICAgIHVubWFyc2hhbGxlcj0ib3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5qaWJ4aGVscGVycy5JbnNldHNNYXBwZXIiLz4KKyAgICAgICAgPHN0cnVjdHVyZSBuYW1lPSJzdHlsZSIgZmllbGQ9InN0eWxlIi8+CisgICAgICAgIDxjb2xsZWN0aW9uIG5hbWU9ImJhY2tncm91bmRTdGF0ZXMiIGZpZWxkPSJiYWNrZ3JvdW5kU3RhdGVzIiBjcmVhdGUtdHlwZT0iamF2YS51dGlsLkFycmF5TGlzdCIvPgorICAgICAgICA8Y29sbGVjdGlvbiBuYW1lPSJmb3JlZ3JvdW5kU3RhdGVzIiBmaWVsZD0iZm9yZWdyb3VuZFN0YXRlcyIgY3JlYXRlLXR5cGU9ImphdmEudXRpbC5BcnJheUxpc3QiLz4KKyAgICAgICAgPGNvbGxlY3Rpb24gbmFtZT0iYm9yZGVyU3RhdGVzIiBmaWVsZD0iYm9yZGVyU3RhdGVzIiBjcmVhdGUtdHlwZT0iamF2YS51dGlsLkFycmF5TGlzdCIvPgorICAgICAgICA8Y29sbGVjdGlvbiBuYW1lPSJyZWdpb25zIiBmaWVsZD0ic3ViUmVnaW9ucyIgY3JlYXRlLXR5cGU9ImphdmEudXRpbC5BcnJheUxpc3QiLz4KKyAgICA8L21hcHBpbmc+CisgICAgPG1hcHBpbmcgbmFtZT0icmVnaW9uIiBjbGFzcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVJlZ2lvbiI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJyZWdpb24iLz4KKyAgICA8L21hcHBpbmc+CisgICAgPG1hcHBpbmcgbmFtZT0idWlJY29uUmVnaW9uIiBjbGFzcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSUljb25SZWdpb24iCisgICAgICAgICAgICAgZXh0ZW5kcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVJlZ2lvbiI+CisgICAgICAgIDxzdHJ1Y3R1cmUgbWFwLWFzPSJyZWdpb24iLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImJhc2ljS2V5IiBmaWVsZD0iYmFzaWNLZXkiIHN0eWxlPSJhdHRyaWJ1dGUiIHVzYWdlPSJvcHRpb25hbCIvPgorICAgIDwvbWFwcGluZz4KKyAgICA8bWFwcGluZyBuYW1lPSJ1aUNvbXBvbmVudCIgY2xhc3M9Im9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuVUlDb21wb25lbnQiCisgICAgICAgICAgICAgZXh0ZW5kcz0ib3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5VSVJlZ2lvbiI+CisgICAgICAgIDx2YWx1ZSBuYW1lPSJvcGFxdWUiIGZpZWxkPSJvcGFxdWUiIHN0eWxlPSJhdHRyaWJ1dGUiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9ImNvbXBvbmVudE5hbWUiIGZpZWxkPSJjb21wb25lbnROYW1lIiBzdHlsZT0iYXR0cmlidXRlIiB1c2FnZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPHZhbHVlIG5hbWU9InR5cGUiIGZpZWxkPSJ0eXBlIiBzdHlsZT0iYXR0cmlidXRlIi8+CisgICAgICAgIDxjb2xsZWN0aW9uIG5hbWU9InN0YXRlVHlwZXMiIGZpZWxkPSJzdGF0ZVR5cGVzIiBjcmVhdGUtdHlwZT0iamF2YS51dGlsLkFycmF5TGlzdCIvPgorICAgICAgICA8c3RydWN0dXJlIG1hcC1hcz0icmVnaW9uIi8+CisgICAgPC9tYXBwaW5nPgorICAgIDwhLS0gPT0gQkFTRSBNT0RFTCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxtYXBwaW5nIG5hbWU9InN5bnRoTW9kZWwiIGNsYXNzPSJvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlN5bnRoTW9kZWwiIHByZS1zZXQ9InByZVNldCI+CisgICAgICAgIDxjb2xsZWN0aW9uIG5hbWU9Imluc2V0cyIgZmllbGQ9Imluc2V0cyIgY3JlYXRlLXR5cGU9ImphdmEudXRpbC5BcnJheUxpc3QiLz4KKyAgICAgICAgPGNvbGxlY3Rpb24gbmFtZT0iY29sb3JzIiBmaWVsZD0iY29sb3JzIiBjcmVhdGUtdHlwZT0iamF2YS51dGlsLkFycmF5TGlzdCIvPgorICAgICAgICA8Y29sbGVjdGlvbiBuYW1lPSJmb250cyIgZmllbGQ9ImZvbnRzIiBjcmVhdGUtdHlwZT0iamF2YS51dGlsLkFycmF5TGlzdCIvPgorICAgICAgICA8c3RydWN0dXJlIG5hbWU9InN0eWxlIiBmaWVsZD0iZ2xvYmFsU3R5bGUiLz4KKyAgICAgICAgPGNvbGxlY3Rpb24gbmFtZT0iY29tcG9uZW50cyIgZmllbGQ9ImNvbXBvbmVudHMiIGNyZWF0ZS10eXBlPSJqYXZhLnV0aWwuQXJyYXlMaXN0Ii8+CisgICAgPC9tYXBwaW5nPgorPC9iaW5kaW5nPgpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSUJvcmRlci5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSUJvcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YzM1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJQm9yZGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsOworCitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKKworLyoqCisgKiBVSUJvcmRlcgorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBVSUJvcmRlciBleHRlbmRzIFVJRGVmYXVsdDxCb3JkZXI+IHsKKworICAgIHB1YmxpYyBVSUJvcmRlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVUlCb3JkZXIoU3RyaW5nIGlkLCBCb3JkZXIgYikgeworICAgICAgICBzdXBlcihpZCwgYik7CisgICAgfQorCisgICAgcHVibGljIEJvcmRlciBnZXRCb3JkZXIoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvcmRlcihCb3JkZXIgYikgeworICAgICAgICBCb3JkZXIgb2xkID0gZ2V0Qm9yZGVyKCk7CisgICAgICAgIHN1cGVyLnNldFZhbHVlKGIpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImJvcmRlciIsIG9sZCwgYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSUNvbG9yLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJQ29sb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzJkMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSUNvbG9yLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsOworCitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5wYWludC5NYXR0ZTsKKworaW1wb3J0IGphdmF4LnN3aW5nLlVJRGVmYXVsdHM7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CisKKy8qKgorICogVUlDb2xvcgorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBVSUNvbG9yIGV4dGVuZHMgVUlQYWludCB7CisKKyAgICBwdWJsaWMgVUlDb2xvcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVUlDb2xvcihTdHJpbmcgaWQsIE1hdHRlIHZhbHVlKSB7CisgICAgICAgIHN1cGVyKGlkLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIFVJQ29sb3IoU3RyaW5nIGlkLCBDb2xvciBjb2xvciwgVUlEZWZhdWx0cyBtb2RlbERlZmF1bHRzKSB7CisgICAgICAgIHRoaXMoaWQsIG5ldyBNYXR0ZShjb2xvciwgbW9kZWxEZWZhdWx0cykpOworICAgIH0KKworICAgIHB1YmxpYyBNYXR0ZSBnZXRQYWludCgpIHsKKyAgICAgICAgcmV0dXJuIChNYXR0ZSkgc3VwZXIuZ2V0UGFpbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWludChNYXR0ZSBjKSB7CisgICAgICAgIHN1cGVyLnNldFBhaW50KGMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlDb21wb25lbnQuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjgxMjRhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSUNvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWw7CisKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnV0aWxzLkhhc1VJRGVmYXVsdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFVJQ29tcG9uZW50IC0gbW9kZWwgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRlc2lnbnMgZm9yIGEgc2luZ2xlIHN3aW5nIGNvbXBvbmVudAorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBVSUNvbXBvbmVudCBleHRlbmRzIFVJUmVnaW9uIGltcGxlbWVudHMgSGFzVUlEZWZhdWx0cyB7CisKKyAgICAvKiogVGhlIGNsYXNzbmFtZSBvZiB0aGUgc3dpbmcgY29tcG9uZW50IHRoYXQgdGhpcyBVSUNvbXBvbmVudCByZXByZXNlbnRzICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBpZiBpdHMgYSBuYW1lZCBjb21wb25lbnQgb3IgbnVsbCBpZiBpdHMgYSBnZW5lcmljIGNvbXBvbmVudCAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBudWxsOworICAgIC8qKiBJZiB0aGlzIGNvbXBvbmVudHMgaXMgb3BhcXVlIHdoaWNoIG1lYW5zIHRoYXQgd2hlbiBpdCBpcyBwYWludGVkIGFsbCBvZiBpdHMgYm91bmRzIGFyZSBmaWxsZWQgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb3BhcXVlID0gZmFsc2U7CisgICAgLyoqCisgICAgICogQSBsaXN0IG9mIHN0YXRlIHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGlzIHJlZ2lvbiBhbmQgc3ViIHJlZ2lvbnMgb2YgdGhpcyBjb21wb25lbnQgYnV0IG5vdCBzdWJjb21wb25lbnRzCisgICAgICogb2YgdGhpcyBjb21wb25lbnQuIElmIHRoaXMgbGlzdCBpcyBlbXB0eSB0aGVuIHRoZSBzdGFuZGFyZCBzeW50aCBzZXQgb2Ygc3RhdGUgdHlwZXMgYXJlIGFzc3VtZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PFVJU3RhdGVUeXBlPiBzdGF0ZVR5cGVzOworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBDb250cnVjdG9ycworCisgICAgLyoqIG5vLWFyZ3MgY29udHJ1Y3RvciBmb3IgSklCWCAqLworICAgIHByb3RlY3RlZCBVSUNvbXBvbmVudCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgLy8gY3JlYXRlIG5ldyBvYnNlcnZhYmxlIGxpc3QgZm9yIHN0YXRlIHR5cGVzIHNvIHdlIGdldCBldmVudHMgZm9yIHdoZW4gdGhlIG1vZGVsIGNoYW5nZXMKKyAgICAgICAgc3RhdGVUeXBlcyA9IG5ldyBBcnJheUxpc3Q8VUlTdGF0ZVR5cGU+KCk7CisgICAgfQorCisgICAgcHVibGljIFVJQ29tcG9uZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHVpLCBVSVJlZ2lvbi4uLiBzdWJSZWdpb25zKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIHVpLCBzdWJSZWdpb25zKTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgZm9yIChVSVJlZ2lvbiByIDogc3ViUmVnaW9ucykgeworICAgICAgICAgICAgci5zZXRSZWdpb24odGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIG5ldyBvYnNlcnZhYmxlIGxpc3QgZm9yIHN0YXRlIHR5cGVzIHNvIHdlIGdldCBldmVudHMgZm9yIHdoZW4gdGhlIG1vZGVsIGNoYW5nZXMKKyAgICAgICAgc3RhdGVUeXBlcyA9IG5ldyBBcnJheUxpc3Q8VUlTdGF0ZVR5cGU+KCk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBCZWFuIE1ldGhvZHMKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50TmFtZShTdHJpbmcgY29tcG9uZW50TmFtZSkgeworICAgICAgICBTdHJpbmcgb2xkID0gZ2V0Q29tcG9uZW50TmFtZSgpOworICAgICAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImNvbXBvbmVudE5hbWUiLCBvbGQsIGdldENvbXBvbmVudE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7CisgICAgICAgIHJldHVybiBvcGFxdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3BhcXVlKGJvb2xlYW4gb3BhcXVlKSB7CisgICAgICAgIGJvb2xlYW4gb2xkID0gaXNPcGFxdWUoKTsKKyAgICAgICAgdGhpcy5vcGFxdWUgPSBvcGFxdWU7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgib3BhcXVlIiwgb2xkLCBpc09wYXF1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgU3RyaW5nIG9sZCA9IGdldFR5cGUoKTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ0eXBlIiwgb2xkLCBnZXRUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBzdGF0ZSB0eXBlcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhpcyByZWdpb24gYW5kIHN1YiByZWdpb25zIG9mIHRoaXMgY29tcG9uZW50IGJ1dCBub3QKKyAgICAgKiBzdWJjb21wb25lbnRzIG9mIHRoaXMgY29tcG9uZW50LiBJZiB0aGlzIGxpc3QgaXMgZW1wdHkgdGhlbiB0aGUgc3RhbmRhcmQgc3ludGggc2V0IG9mIHN0YXRlIHR5cGVzIGFyZSBhc3N1bWVkLgorICAgICAqCisgICAgICogQHJldHVybiBMaXN0IG9mIGF2YWlsYWJsZSBzdGF0ZSB0eXBlcworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFVJU3RhdGVUeXBlPiBnZXRTdGF0ZVR5cGVzKCkgeworICAgICAgICByZXR1cm4gc3RhdGVUeXBlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCAiIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMoY29tcG9uZW50TmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlwiIiArIGNvbXBvbmVudE5hbWUgKyAiXCIiOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICBpZiAodGl0bGUgPT0gbnVsbCB8fCAiIi5lcXVhbHModGl0bGUpKSB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhjb21wb25lbnROYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnROYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRpdGxlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSURlZmF1bHQuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlEZWZhdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYwYmYwOQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlEZWZhdWx0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbDsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5iZWFucy5BYnN0cmFjdEJlYW47CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlscy5IYXNVSURlZmF1bHRzOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxpbmdDb250ZXh0OworCitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGVudHJ5IGluIHRoZSBVSSBkZWZhdWx0cyB0YWJsZS4KKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgVUlEZWZhdWx0PFQ+IGV4dGVuZHMgQWJzdHJhY3RCZWFuIGltcGxlbWVudHMgSGFzVUlEZWZhdWx0cyB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFQgdmFsdWU7CisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIGxvY2FsIFVJRGVmYXVsdHMgdGhhdCBjb250YWlucyBhbGwgdGhlIFVJRGVmYXVsdHMgaW4gdGhlIHN5bnRoIG1vZGVsLiBJdCBpcyBrZXB0IHVwdG9kYXRlIGJ5IHRoZQorICAgICAqIGluZGVydmlkdWFsIFVJRGVmYXVsdHMgbm9kZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBVSURlZmF1bHRzIG1vZGVsRGVmYXVsdHMgPSBudWxsOworCisgICAgcHVibGljIFVJRGVmYXVsdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVUlEZWZhdWx0KFN0cmluZyBuYW1lLCBUIHZhbHVlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVUlEZWZhdWx0KFN0cmluZyBuYW1lLCBUIHZhbHVlLCBVSURlZmF1bHRzIG1vZGVsRGVmYXVsdHMpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB0aGlzLm1vZGVsRGVmYXVsdHMgPSBtb2RlbERlZmF1bHRzOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gSklCWCBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSklCWCBhZnRlciBhbGwgZmllbGRzIGhhdmUgYmVlbiBzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBKSUJYIFVubWFyc2hhbGxpbmcgQ29udGV4dAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3N0U2V0KElVbm1hcnNoYWxsaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIHdhbGsgdXAgdGlsbCB3ZSBnZXQgc3ludGggbW9kZWwKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0LmdldFN0YWNrRGVwdGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRTdGFja09iamVjdChpKSBpbnN0YW5jZW9mIEhhc1VJRGVmYXVsdHMpIHsKKyAgICAgICAgICAgICAgICBtb2RlbERlZmF1bHRzID0gKChIYXNVSURlZmF1bHRzKSBjb250ZXh0LmdldFN0YWNrT2JqZWN0KGkpKS5nZXRVaURlZmF1bHRzKCk7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVsRGVmYXVsdHMgIT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEJlYW4gTWV0aG9kcworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsb2NhbCBVSURlZmF1bHRzIHRoYXQgY29udGFpbnMgYWxsIHRoZSBVSURlZmF1bHRzIGluIHRoZSBzeW50aCBtb2RlbC4gSXQgaXMga2VwdCB1cHRvZGF0ZSBieSB0aGUKKyAgICAgKiBpbmRlcnZpZHVhbCBVSURlZmF1bHRzIG5vZGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBVSURlZmF1bHRzIGZvciB0aGUgc3ludGggbW9kZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgVUlEZWZhdWx0cyBnZXRVaURlZmF1bHRzKCkgeworICAgICAgICByZXR1cm4gbW9kZWxEZWZhdWx0czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHQpIHsKKyAgICAgICAgVCBvbGQgPSB0aGlzLnZhbHVlOworICAgICAgICB0aGlzLnZhbHVlID0gdDsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ2YWx1ZSIsIG9sZCwgZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIFQgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJuYW1lIiwgb2xkLCBuYW1lKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgLy8gdXBkYXRlIG1vZGVsIGRlZmF1bHRzCisgICAgICAgIGlmIChvbGQgIT0gbnVsbCkgbW9kZWxEZWZhdWx0cy5yZW1vdmUob2xkKTsKKyAgICAgICAgbW9kZWxEZWZhdWx0cy5wdXQoZ2V0TmFtZSgpLCBnZXRWYWx1ZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlEaW1lbnNpb24uamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlEaW1lbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjExYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSURpbWVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbDsKKworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKKworLyoqCisgKiBVSURpbWVuc2lvbgorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBVSURpbWVuc2lvbiBleHRlbmRzIFVJRGVmYXVsdDxEaW1lbnNpb24+IHsKKyAgICBwdWJsaWMgVUlEaW1lbnNpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIERpbWVuc2lvbiBnZXREaW1lbnNpb24oKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpbWVuc2lvbihEaW1lbnNpb24gZCkgeworICAgICAgICBEaW1lbnNpb24gb2xkID0gZ2V0RGltZW5zaW9uKCk7CisgICAgICAgIHN1cGVyLnNldFZhbHVlKGQpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImRpbWVuc2lvbiIsIG9sZCwgZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSUZvbnQuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlGb250LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiNmZkYgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlGb250LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsOworCitpbXBvcnQgamF2YS5hd3QuRm9udDsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmZvbnQuVHlwZWZhY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnN3aW5nLlVJRGVmYXVsdHM7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHNpbmdsZSBmb250IGVudHJ5IGluIHRoZSBVSURlZmF1bHRzIHRhYmxlLiBFYWNoIFVJRm9udCB0YWtlcyBhCisgKiBsaXN0IG9mIFR5cGVmYWNlcy4gVGhlc2UgdHlwZWZhY2VzIGFyZSBsaXN0ZWQgYnkgb3JkZXIgb2YgcHJlZmVyZW5jZS4gVGh1cywKKyAqIHdoZW4gcHV0dGluZyBhIGZvbnQgaW50byBVSURlZmF1bHRzLCB0aGUgY29kZSBjYW4gY2hlY2sgd2hldGhlciBlYWNoIGZvbnQKKyAqIGV4aXN0cywgYW5kIHdoZW4gaXQgZmluZHMgdGhlIGZpcnN0IGZvbnQgdGhhdCBkb2VzLCBpbnNlcnQgaXQuCisgKgorICogQGF1dGhvciAgUmljaGFyZCBCYWlyCisgKiBAYXV0aG9yICBKYXNwZXIgUG90dHMKKyAqLworcHVibGljIGNsYXNzIFVJRm9udCBleHRlbmRzIFVJRGVmYXVsdDxMaXN0PFR5cGVmYWNlPj4gaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVVJRGVmYXVsdHMoKSB7CisgICAgICAgIGlmIChnZXRVaURlZmF1bHRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChUeXBlZmFjZSB0IDogZ2V0Rm9udHMoKSkgeworICAgICAgICAgICAgICAgIGlmICh0LmlzRm9udFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFVpRGVmYXVsdHMoKS5wdXQoZ2V0TmFtZSgpLCB0LmdldEZvbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL1RPRE8gbXVzdCBub3QgaGF2ZSBmb3VuZCBhbnkuIERlZmF1bHQgdG8gdGhlIERlZmF1bHQgcGxhdGZvcm0gZm9udAorICAgICAgICBnZXRVaURlZmF1bHRzKCkucHV0KGdldE5hbWUoKSwgbmV3IEZvbnQoIkFyaWFsIiwgRm9udC5QTEFJTiwgMTIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVUlGb250KCkgeworICAgICAgICBzZXRWYWx1ZShuZXcgQXJyYXlMaXN0PFR5cGVmYWNlPigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVUlGb250KFN0cmluZyBpZCwgTGlzdDxUeXBlZmFjZT4gdmFsdWVzLCBVSURlZmF1bHRzIGRlZmF1bHRzKSB7CisgICAgICAgIHN1cGVyKGlkLCB2YWx1ZXMsIGRlZmF1bHRzKTsKKyAgICAgICAgdXBkYXRlVUlEZWZhdWx0cygpOworICAgIH0KKworICAgIHB1YmxpYyBVSUZvbnQoU3RyaW5nIGlkLCBGb250IGZvbnQsIFVJRGVmYXVsdHMgbW9kZWxEZWZhdWx0cykgeworICAgICAgICB0aGlzKGlkLCBBcnJheXMuYXNMaXN0KG5ldyBUeXBlZmFjZShmb250LCBtb2RlbERlZmF1bHRzKSksIG1vZGVsRGVmYXVsdHMpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFR5cGVmYWNlPiBnZXRGb250cygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEZvbnRzKExpc3Q8VHlwZWZhY2U+IHZhbHVlcykgeworICAgICAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlJY29uLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJSWNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTI1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJSWNvbi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbDsKKworaW1wb3J0IGphdmF4LnN3aW5nLkljb247CisKKy8qKgorICogVUlJY29uCisgKgorICogQGF1dGhvciAgUmljaGFyZCBCYWlyCisgKiBAYXV0aG9yICBKYXNwZXIgUG90dHMKKyAqLworcHVibGljIGNsYXNzIFVJSWNvbiBleHRlbmRzIFVJRGVmYXVsdDxJY29uPiB7CisKKyAgICBwdWJsaWMgVUlJY29uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBJY29uIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEljb24oSWNvbiBpKSB7CisgICAgICAgIEljb24gb2xkID0gZ2V0SWNvbigpOworICAgICAgICBzdXBlci5zZXRWYWx1ZShpKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJpY29uIiwgb2xkLCBpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJSWNvblJlZ2lvbi5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSUljb25SZWdpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU5MGVlCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSUljb25SZWdpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWw7CisKKy8qKgorICogQSBVSVJlZ2lvbiBzdWJjbGFzcyB3aGljaCBpcyB1c2VkIGZvciBnZW5lcmF0aW5nIGljb25zLiBGb3IgZXhhbXBsZSwgSlJhZGlvQnV0dG9uIGFuZCBKQ2hlY2tCb3ggcmVwcmVzZW50IHRoZW1zZWx2ZXMKKyAqIG1haW5seSB2aWEgdGhlaXIgaWNvbnMuIEhvd2V2ZXIsIGZyb20gdGhlIGRlc2lnbmVycyBwZXJzcGVjdGl2ZSwgdGhlIG1haW4gZGVzaWduIGlzbid0IGFuICJpY29uIiwgYnV0IGp1c3QgYSByZWdpb24KKyAqIG9uIHRoZSBidXR0b24uCisgKiA8cC8+CisgKiBUaGF0IHR5cGUgb2YgcmVnaW9uIGlzIHJlcHJlc2VudGVkIGJ5IGEgVUlJY29uUmVnaW9uLiBVSUljb25SZWdpb24gY29udGFpbnMgYSBzdHJpbmcgd2hpY2ggcmVmZXJlbmNlcyB0aGUgVUlEZWZhdWx0CisgKiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpY29uLiBGb3IgZXhhbXBsZSwgUmFkaW9CdXR0b24uaWNvbi4KKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgVUlJY29uUmVnaW9uIGV4dGVuZHMgVUlSZWdpb24geworICAgIC8qKiBUaGUgVWlEZWZhdWx0cyBrZXkgd2hpY2ggdGhpcyBpY29uIHNob3VsZCBiZSBzdG9yZWQgZm9yIGJhc2ljIExhRiB0byBmaW5kIGl0LiBUaGlzIGlzIGFic29sdXRlICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYmFzaWNLZXkgPSBudWxsOworCisgICAgcHVibGljIFVJSWNvblJlZ2lvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2ljS2V5KCkgeworICAgICAgICByZXR1cm4gYmFzaWNLZXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFzaWNLZXkoU3RyaW5nIGJhc2ljS2V5KSB7CisgICAgICAgIFN0cmluZyBvbGQgPSBnZXRCYXNpY0tleSgpOworICAgICAgICB0aGlzLmJhc2ljS2V5ID0gYmFzaWNLZXk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYmFzaWNLZXkiLG9sZCxnZXRCYXNpY0tleSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJSW5zZXRzLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJSW5zZXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzMjBkZQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlJbnNldHMuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWw7CisKK2ltcG9ydCBqYXZhLmF3dC5JbnNldHM7CisKKy8qKgorICogVUlJbnNldHMKKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgVUlJbnNldHMgZXh0ZW5kcyBVSURlZmF1bHQ8SW5zZXRzPiB7CisKKyAgICBwdWJsaWMgVUlJbnNldHMoKSB7CisgICAgfQorCisgICAgcHVibGljIFVJSW5zZXRzKFN0cmluZyBpZCwgSW5zZXRzIHZhbHVlKSB7CisgICAgICAgIHN1cGVyKGlkLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIEluc2V0cyBnZXRJbnNldHMoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluc2V0cyhJbnNldHMgaSkgeworICAgICAgICBJbnNldHMgb2xkID0gZ2V0SW5zZXRzKCk7CisgICAgICAgIHN1cGVyLnNldFZhbHVlKGkpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImluc2V0cyIsIG9sZCwgaSk7CisgICAgICAgIC8vIHVwZGF0ZSBtb2RlbCBkZWZhdWx0cworICAgICAgICBnZXRVaURlZmF1bHRzKCkucHV0KGdldE5hbWUoKSwgaSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlVpSW5zZXQoIiArIGdldE5hbWUoKSArICIpIiArCisgICAgICAgICAgICAgICAgKChnZXRJbnNldHMoKSA9PSBudWxsKSA/ICIgTk9ORSIgOiAiKCIgKyBnZXRJbnNldHMoKS50b3AgKyAiLCIgKyBnZXRJbnNldHMoKS5sZWZ0ICsgIiwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEluc2V0cygpLmJvdHRvbSArICIsIiArIGdldEluc2V0cygpLnJpZ2h0ICsgIikiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJUGFpbnQuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlQYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMWIzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJUGFpbnQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWw7CisKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnBhaW50Lk1hdHRlOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuUGFpbnRNb2RlbDsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CisKKy8qKgorICogVUlQYWludAorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBVSVBhaW50IGV4dGVuZHMgVUlEZWZhdWx0PFBhaW50TW9kZWw+IHsKKworICAgIC8qKiBMaXN0ZW5lciB0byBrZWVwIG1vZGVsIFVpRGVmYXVsdHMgdXAgdG8gZGF0ZSBmb3IgdGhpcyBVaVBhaW50ICovCisgICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG1hdHRlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgIFBhaW50TW9kZWwgcGFpbnRNb2RlbCA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAocGFpbnRNb2RlbCBpbnN0YW5jZW9mIE1hdHRlKSB7CisgICAgICAgICAgICAgICAgZ2V0VWlEZWZhdWx0cygpLnB1dChnZXROYW1lKCksICgoTWF0dGUpIHBhaW50TW9kZWwpLmdldENvbG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcHJvcG9nYXRlIHRoZSBwYWludCBjaGFuZ2UgdXAgYXMgUGFpbnRNb2RlbCBpcyBhIG11dGFibGUgb2JqZWN0CisgICAgICAgICAgICBpZiAoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscygicGFpbnQiKSkgeworICAgICAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgicGFpbnQiLCBudWxsLCBnZXRQYWludCgpKTsKKyAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInZhbHVlIiwgbnVsbCwgZ2V0UGFpbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIFVJUGFpbnQoKSB7fQorCisgICAgcHVibGljIFVJUGFpbnQoU3RyaW5nIGlkLCBQYWludE1vZGVsIHZhbHVlKSB7CisgICAgICAgIHN1cGVyKGlkLCB2YWx1ZSwgKHZhbHVlIGluc3RhbmNlb2YgTWF0dGUpID8gKChNYXR0ZSkgdmFsdWUpLmdldFVpRGVmYXVsdHMoKSA6IG51bGwpOworICAgICAgICAvLyB1cGRhdGUgbW9kZWwgZGVmYXVsdHMKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWF0dGUpIHsKKyAgICAgICAgICAgIE1hdHRlIG1hdHRlID0gKE1hdHRlKSB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChnZXRVaURlZmF1bHRzKCkgIT0gbnVsbCkgZ2V0VWlEZWZhdWx0cygpLnB1dChnZXROYW1lKCksIG1hdHRlLmdldENvbG9yKCkpOworICAgICAgICAgICAgbWF0dGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihtYXR0ZUxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBQYWludE1vZGVsIGdldFBhaW50KCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWludChQYWludE1vZGVsIGMpIHsKKyAgICAgICAgUGFpbnRNb2RlbCBvbGQgPSBnZXRQYWludCgpOworICAgICAgICBpZiAob2xkIGluc3RhbmNlb2YgTWF0dGUpIG9sZC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG1hdHRlTGlzdGVuZXIpOworICAgICAgICBzdXBlci5zZXRWYWx1ZShjKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwYWludCIsIG9sZCwgYyk7CisgICAgICAgIC8vIHVwZGF0ZSBtb2RlbCBkZWZhdWx0cworICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIE1hdHRlKSB7CisgICAgICAgICAgICBNYXR0ZSBtYXR0ZSA9IChNYXR0ZSkgYzsKKyAgICAgICAgICAgIGdldFVpRGVmYXVsdHMoKS5wdXQoZ2V0TmFtZSgpLCBtYXR0ZS5nZXRDb2xvcigpKTsKKyAgICAgICAgICAgIG1hdHRlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobWF0dGVMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJUHJvcGVydHkuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTdhNTgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWw7CisKK2ltcG9ydCBvcmcuamRlc2t0b3AuYmVhbnMuQWJzdHJhY3RCZWFuOworCisvKioKKyAqIFVJUHJvcGVydHkKKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgVUlQcm9wZXJ0eSBleHRlbmRzIEFic3RyYWN0QmVhbiB7CisgICAgcHVibGljIHN0YXRpYyBlbnVtIFByb3BlcnR5VHlwZSB7CisgICAgICAgIEJPT0xFQU4sIElOVCwgRkxPQVQsIERPVUJMRSwgU1RSSU5HLCBGT05ULCBDT0xPUiwgSU5TRVRTLCBESU1FTlNJT04sIEJPUkRFUgorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBQcm9wZXJ0eVR5cGUgdHlwZTsKKyAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKKworICAgIHByb3RlY3RlZCBVSVByb3BlcnR5KCkgeworICAgIH0KKworICAgIHB1YmxpYyBVSVByb3BlcnR5KFN0cmluZyBuYW1lLCBQcm9wZXJ0eVR5cGUgdHlwZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEJlYW4gTWV0aG9kcworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0cmluZyBvbGQgPSBnZXROYW1lKCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgibmFtZSIsIG9sZCwgZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoUHJvcGVydHlUeXBlIHR5cGUpIHsKKyAgICAgICAgUHJvcGVydHlUeXBlIG9sZCA9IGdldFR5cGUoKTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ0eXBlIiwgb2xkLCBnZXRUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgT2JqZWN0IG9sZCA9IGdldFZhbHVlKCk7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ2YWx1ZSIsIG9sZCwgZ2V0VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSVJlZ2lvbi5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSVJlZ2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTRmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJUmVnaW9uLmphdmEKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbDsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5iZWFucy5BYnN0cmFjdEJlYW47CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci51dGlscy5IYXNVSURlZmF1bHRzOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxpbmdDb250ZXh0OworCitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKK2ltcG9ydCBqYXZhLmF3dC5JbnNldHM7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSAiUmVnaW9uIiBpbiBzeW50aCwgd2hpY2ggYWxzbyBpbmNsdWRlcyBlbnRpcmUgY29tcG9uZW50cy4KKyAqCisgKiBAYXV0aG9yICBSaWNoYXJkIEJhaXIKKyAqIEBhdXRob3IgIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgVUlSZWdpb24gZXh0ZW5kcyBBYnN0cmFjdEJlYW4gaW1wbGVtZW50cyBIYXNVSURlZmF1bHRzLCBIYXNVSVN0eWxlIHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOy8vdGhlIGNvZGUtd2lzZSBuYW1lIG9mIHRoZSByZWdpb24KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleTsgLy90aGUgVUlkZWZhdWx0cyBrZXkgZm9yIHRoaXMgcmVnaW9uCisgICAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsgLy90aGUgdXNlciBmcmllbmRseSBuYW1lL3RpdGxlIG9mIHRoaXMgcmVnaW9uCisgICAgLyoqIExpc3Qgb2YgYmFja2dyb3VuZCBzdGF0ZXMgKi8KKyAgICBwcml2YXRlIExpc3Q8VUlTdGF0ZT4gYmFja2dyb3VuZFN0YXRlczsKKyAgICAvKiogTGlzdCBvZiBmb3JlZ3JvdW5kIHN0YXRlcyAqLworICAgIHByaXZhdGUgTGlzdDxVSVN0YXRlPiBmb3JlZ3JvdW5kU3RhdGVzOworICAgIC8qKiBMaXN0IG9mIGJvcmRlciBzdGF0ZXMgKi8KKyAgICBwcml2YXRlIExpc3Q8VUlTdGF0ZT4gYm9yZGVyU3RhdGVzOworICAgIHByaXZhdGUgVUlTdHlsZSBzdHlsZSA9IG5ldyBVSVN0eWxlKCk7CisgICAgcHJvdGVjdGVkIEluc2V0cyBjb250ZW50TWFyZ2lucyA9IG5ldyBJbnNldHMoMCwgMCwgMCwgMCk7CisgICAgLyoqIFN1YiByZWdpb25zLCBpZiBhbnkgKi8KKyAgICBwcml2YXRlIExpc3Q8VUlSZWdpb24+IHN1YlJlZ2lvbnM7CisKKyAgICAvL3RvZ2V0aGVyIHdpdGggbmFtZSwgdGhlc2UgdHdvIGZpZWxkcyBhbGxvdyBtZSB0byByZWNvbnN0cnVjdCwgaW4KKyAgICAvL2NvZGUsIGEgc3ludGggUmVnaW9uLCBpbmNsdWRpbmcgYSBjdXN0b20gUmVnaW9uLCBpZiB5b3UgbWFrZSBvbmUuCisgICAgcHJpdmF0ZSBTdHJpbmcgdWk7CisgICAgcHJpdmF0ZSBib29sZWFuIHN1YnJlZ2lvbjsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbG9jYWwgVUlEZWZhdWx0cyB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgVUlEZWZhdWx0cyBpbiB0aGUgc3ludGggbW9kZWwuIEl0IGlzIGtlcHQgdXB0b2RhdGUgYnkgdGhlCisgICAgICogaW5kZXJ2aWR1YWwgVUlEZWZhdWx0cyBub2RlcworICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IFVJRGVmYXVsdHMgbW9kZWxEZWZhdWx0cyA9IG51bGw7CisKKyAgICBwcml2YXRlIFVJUmVnaW9uIHJlZ2lvbjsgLy90aGUgcmVnaW9uIHRoYXQgdGhpcyByZWdpb24gYmVsb25ncyB0bworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKworICAgIC8qKiBuby1hcmdzIGNvbnRydWN0b3IgZm9yIEpJQlggKi8KKyAgICBwcm90ZWN0ZWQgVUlSZWdpb24oKSB7CisgICAgICAgIHN1YlJlZ2lvbnMgPSBuZXcgQXJyYXlMaXN0PFVJUmVnaW9uPigpOworICAgICAgICBiYWNrZ3JvdW5kU3RhdGVzID0gbmV3IEFycmF5TGlzdDxVSVN0YXRlPigpOworICAgICAgICBmb3JlZ3JvdW5kU3RhdGVzID0gbmV3IEFycmF5TGlzdDxVSVN0YXRlPigpOworICAgICAgICBib3JkZXJTdGF0ZXMgPSBuZXcgQXJyYXlMaXN0PFVJU3RhdGU+KCk7CisgICAgICAgIHN0eWxlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgic3R5bGUuIiArIGV2dC5nZXRQcm9wZXJ0eU5hbWUoKSwgZXZ0LmdldE9sZFZhbHVlKCksIGV2dC5nZXROZXdWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVJUmVnaW9uKFN0cmluZyBuYW1lLCBVSVJlZ2lvbi4uLiBzdWJSZWdpb25zKSB7CisgICAgICAgIHRoaXMobmFtZSwgbnVsbCwgdHJ1ZSwgc3ViUmVnaW9ucyk7CisgICAgfQorCisgICAgcHVibGljIFVJUmVnaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgdWksIFVJUmVnaW9uLi4uIHN1YlJlZ2lvbnMpIHsKKyAgICAgICAgdGhpcyhuYW1lLCB1aSwgZmFsc2UsIHN1YlJlZ2lvbnMpOworICAgIH0KKworICAgIHB1YmxpYyBVSVJlZ2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHVpLCBib29sZWFuIHN1YnJlZ2lvbiwgVUlSZWdpb24uLi4gc3ViUmVnaW9ucykgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudWkgPSB1aTsKKyAgICAgICAgdGhpcy5zdWJyZWdpb24gPSBzdWJyZWdpb247CisgICAgICAgIGlmIChzdWJSZWdpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoVUlSZWdpb24gciA6IHN1YlJlZ2lvbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc3ViUmVnaW9ucy5hZGQocik7CisgICAgICAgICAgICAgICAgICAgIHIuZ2V0U3R5bGUoKS5zZXRQYXJlbnRTdHlsZShnZXRTdHlsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEpJQlggTWV0aG9kcworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpJQlggYWZ0ZXIgYWxsIGZpZWxkcyBoYXZlIGJlZW4gc2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgSklCWCBVbm1hcnNoYWxsaW5nIENvbnRleHQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJlU2V0KElVbm1hcnNoYWxsaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIHdhbGsgdXAgdGlsbCB3ZSBnZXQgc3ludGggbW9kZWwKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0LmdldFN0YWNrRGVwdGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRTdGFja09iamVjdChpKSBpbnN0YW5jZW9mIEhhc1VJRGVmYXVsdHMpIHsKKyAgICAgICAgICAgICAgICBtb2RlbERlZmF1bHRzID0gKChIYXNVSURlZmF1bHRzKSBjb250ZXh0LmdldFN0YWNrT2JqZWN0KGkpKS5nZXRVaURlZmF1bHRzKCk7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVsRGVmYXVsdHMgIT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0LmdldFN0YWNrRGVwdGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRTdGFja09iamVjdChpKSBpbnN0YW5jZW9mIFVJUmVnaW9uICYmIGNvbnRleHQuZ2V0U3RhY2tPYmplY3QoaSkgIT0gdGhpcykgeworICAgICAgICAgICAgICAgIHJlZ2lvbiA9IChVSVJlZ2lvbikgY29udGV4dC5nZXRTdGFja09iamVjdChpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQmVhbiBNZXRob2RzCisKKyAgICBwdWJsaWMgSW5zZXRzIGdldENvbnRlbnRNYXJnaW5zKCkgeworICAgICAgICByZXR1cm4gY29udGVudE1hcmdpbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudE1hcmdpbnMoSW5zZXRzIGNvbnRlbnRNYXJnaW5zKSB7CisgICAgICAgIEluc2V0cyBvbGQgPSBnZXRDb250ZW50TWFyZ2lucygpOworICAgICAgICB0aGlzLmNvbnRlbnRNYXJnaW5zID0gY29udGVudE1hcmdpbnM7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiY29udGVudE1hcmdpbnMiLCBvbGQsIGdldENvbnRlbnRNYXJnaW5zKCkpOworICAgIH0KKworICAgIHZvaWQgc2V0UmVnaW9uKFVJUmVnaW9uIHIpIHsKKyAgICAgICAgdGhpcy5yZWdpb24gPSByOworICAgIH0KKworICAgIHB1YmxpYyBVSVJlZ2lvbiBnZXRSZWdpb24oKSB7CisgICAgICAgIHJldHVybiByZWdpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsb2NhbCBVSURlZmF1bHRzIHRoYXQgY29udGFpbnMgYWxsIHRoZSBVSURlZmF1bHRzIGluIHRoZSBzeW50aCBtb2RlbC4gSXQgaXMga2VwdCB1cHRvZGF0ZSBieSB0aGUKKyAgICAgKiBpbmRlcnZpZHVhbCBVSURlZmF1bHRzIG5vZGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBVSURlZmF1bHRzIGZvciB0aGUgc3ludGggbW9kZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgVUlEZWZhdWx0cyBnZXRVaURlZmF1bHRzKCkgeworICAgICAgICByZXR1cm4gbW9kZWxEZWZhdWx0czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBVSVJlZ2lvbltdIGdldFN1YlJlZ2lvbnMoKSB7CisgICAgICAgIHJldHVybiBzdWJSZWdpb25zLnRvQXJyYXkobmV3IFVJUmVnaW9uWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgVUlTdGF0ZVtdIGdldEJhY2tncm91bmRTdGF0ZXMoKSB7CisgICAgICAgIHJldHVybiBiYWNrZ3JvdW5kU3RhdGVzLnRvQXJyYXkobmV3IFVJU3RhdGVbMF0pOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBVSVN0YXRlW10gZ2V0Rm9yZWdyb3VuZFN0YXRlcygpIHsKKyAgICAgICAgcmV0dXJuIGZvcmVncm91bmRTdGF0ZXMudG9BcnJheShuZXcgVUlTdGF0ZVswXSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFVJU3RhdGVbXSBnZXRCb3JkZXJTdGF0ZXMoKSB7CisgICAgICAgIHJldHVybiBib3JkZXJTdGF0ZXMudG9BcnJheShuZXcgVUlTdGF0ZVswXSk7CisgICAgfQorCisgICAgcHVibGljIFVJU3R5bGUgZ2V0U3R5bGUoKSB7CisgICAgICAgIHJldHVybiBzdHlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlJlZ2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHN1YnJlZ2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFVpKCkgeworICAgICAgICByZXR1cm4gdWk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmFja2dyb3VuZFN0YXRlKFVJU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgLy8gY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHRoYXQgc3RhdGUKKyAgICAgICAgZm9yIChVSVN0YXRlIHVpU3RhdGUgOiBiYWNrZ3JvdW5kU3RhdGVzKSB7CisgICAgICAgICAgICBpZiAodWlTdGF0ZS5nZXROYW1lKCkuZXF1YWxzKHN0YXRlLmdldE5hbWUoKSkpIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBiYWNrZ3JvdW5kU3RhdGVzLmFkZChzdGF0ZSk7CisgICAgICAgIHN0YXRlLnNldFJlZ2lvbih0aGlzKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJiYWNrZ3JvdW5kU3RhdGVzIiwgbnVsbCwgYmFja2dyb3VuZFN0YXRlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQmFja2dyb3VuZFN0YXRlKFVJU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgaWYgKGJhY2tncm91bmRTdGF0ZXMucmVtb3ZlKHN0YXRlKSkgeworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJiYWNrZ3JvdW5kU3RhdGVzIiwgbnVsbCwgYmFja2dyb3VuZFN0YXRlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGb3JlZ3JvdW5kU3RhdGUoVUlTdGF0ZSBzdGF0ZSkgeworICAgICAgICAvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhhdCBzdGF0ZQorICAgICAgICBmb3IgKFVJU3RhdGUgdWlTdGF0ZSA6IGZvcmVncm91bmRTdGF0ZXMpIHsKKyAgICAgICAgICAgIGlmICh1aVN0YXRlLmdldE5hbWUoKS5lcXVhbHMoc3RhdGUuZ2V0TmFtZSgpKSkgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvcmVncm91bmRTdGF0ZXMuYWRkKHN0YXRlKTsKKyAgICAgICAgc3RhdGUuc2V0UmVnaW9uKHRoaXMpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImZvcmVncm91bmRTdGF0ZXMiLCBudWxsLCBmb3JlZ3JvdW5kU3RhdGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGb3JlZ3JvdW5kU3RhdGUoVUlTdGF0ZSBzdGF0ZSkgeworICAgICAgICBpZiAoZm9yZWdyb3VuZFN0YXRlcy5yZW1vdmUoc3RhdGUpKSB7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImZvcmVncm91bmRTdGF0ZXMiLCBudWxsLCBmb3JlZ3JvdW5kU3RhdGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEJvcmRlclN0YXRlKFVJU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgLy8gY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHRoYXQgc3RhdGUKKyAgICAgICAgZm9yIChVSVN0YXRlIHVpU3RhdGUgOiBib3JkZXJTdGF0ZXMpIHsKKyAgICAgICAgICAgIGlmICh1aVN0YXRlLmdldE5hbWUoKS5lcXVhbHMoc3RhdGUuZ2V0TmFtZSgpKSkgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJvcmRlclN0YXRlcy5hZGQoc3RhdGUpOworICAgICAgICBzdGF0ZS5zZXRSZWdpb24odGhpcyk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYm9yZGVyU3RhdGVzIiwgbnVsbCwgYm9yZGVyU3RhdGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVCb3JkZXJTdGF0ZShVSVN0YXRlIHN0YXRlKSB7CisgICAgICAgIGlmIChib3JkZXJTdGF0ZXMucmVtb3ZlKHN0YXRlKSkgeworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJib3JkZXJTdGF0ZXMiLCBudWxsLCBib3JkZXJTdGF0ZXMpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgcmV0dXJuIGtleSA9PSBudWxsIHx8ICIiLmVxdWFscyhrZXkpID8gbmFtZSA6IGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gdGl0bGUgPT0gbnVsbCB8fCAiIi5lcXVhbHModGl0bGUpID8gbmFtZSA6IHRpdGxlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlTdGF0ZS5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSVN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3NDdhNAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWw7CisKK2ltcG9ydCBvcmcuamRlc2t0b3AuYmVhbnMuQWJzdHJhY3RCZWFuOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuQ2FudmFzOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIudXRpbHMuSGFzUGF0aDsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLnV0aWxzLkhhc1VJRGVmYXVsdHM7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JVW5tYXJzaGFsbGluZ0NvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5zd2luZy5VSURlZmF1bHRzOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBTdGF0ZSBpbiB0aGUgU3ludGggTEFGLgorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBVSVN0YXRlIGV4dGVuZHMgQWJzdHJhY3RCZWFuIGltcGxlbWVudHMgSGFzVUlTdHlsZSwgSGFzUGF0aCB7CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBzdGF0ZUtleXM7CisgICAgcHJpdmF0ZSBib29sZWFuIGludmVydGVkOyAvL2luZGljYXRlcyB3aGV0aGVyIHRvIGludmVydCB0aGUgbWVhbmluZyBvZiB0aGUgOS1zcXVhcmUgc3RyZXRjaGluZyBpbnNldHMKKyAgICAvKiogQSBjYWNoZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbGlzdCBvZiBzdGF0ZUtleXMgZGVsaW1pbmF0ZWQgd2l0aCAiKyIgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjYWNoZWROYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIENhbnZhcyBjYW52YXM7CisgICAgcHJpdmF0ZSBVSVN0eWxlIHN0eWxlOworICAgIC8qKiB0aGUgcmVnaW9uIHRoYXQgdGhpcyBzdGF0ZSBiZWxvbmdzIHRvICovCisgICAgcHJpdmF0ZSBVSVJlZ2lvbiByZWdpb247CisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIGxvY2FsIFVJRGVmYXVsdHMgdGhhdCBjb250YWlucyBhbGwgdGhlIFVJRGVmYXVsdHMgaW4gdGhlIHN5bnRoIG1vZGVsLiBJdCBpcyBrZXB0IHVwdG9kYXRlIGJ5IHRoZQorICAgICAqIGluZGVydmlkdWFsIFVJRGVmYXVsdHMgbm9kZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBVSURlZmF1bHRzIG1vZGVsRGVmYXVsdHMgPSBudWxsOworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBDb250cnVjdG9ycworCisgICAgcHVibGljIFVJU3RhdGUoKSB7CisgICAgICAgIC8vIENyZWF0ZSBzdGF0ZSBrZXlzIGFzIGV2ZW50IGxpc3Qgc28gbW9kZWwgY2hhbmdlcyBhcmUgcHJvcG9nYXRlZAorICAgICAgICBzdGF0ZUtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVUlTdGF0ZShTeW50aE1vZGVsIG1vZGVsLCBVSVJlZ2lvbiBwYXJlbnRSZWdpb24sIFN0cmluZy4uLiBzdGF0ZVR5cGVLZXlzKSB7CisgICAgICAgIC8vIENyZWF0ZSBzdGF0ZSBrZXlzIGFzIGV2ZW50IGxpc3Qgc28gbW9kZWwgY2hhbmdlcyBhcmUgcHJvcG9nYXRlZAorICAgICAgICBzdGF0ZUtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgdGhpcy5zdGF0ZUtleXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGVUeXBlS2V5cykpOworICAgICAgICAvLworICAgICAgICBtb2RlbERlZmF1bHRzID0gbW9kZWwuZ2V0VWlEZWZhdWx0cygpOworICAgICAgICByZWdpb24gPSBwYXJlbnRSZWdpb247CisgICAgICAgIC8vIGNyZWF0ZSBuZXcgY2FudmFzCisgICAgICAgIGNhbnZhcyA9IG5ldyBDYW52YXMoMTAwLCAzMCk7CisgICAgICAgIGNhbnZhcy5zZXRVaURlZmF1bHRzKG1vZGVsRGVmYXVsdHMpOworICAgICAgICBTdHJpbmcgY2FudmFzUGF0aCA9IGdldFBhdGgoKTsKKyAgICAgICAgY2FudmFzLnNldFJlc291cmNlc0RpcihuZXcgRmlsZShtb2RlbC5nZXRSZXNvdXJjZXNEaXIoKSwgY2FudmFzUGF0aCkpOworICAgICAgICBjYW52YXMuc2V0VGVtcGxhdGVzRGlyKG5ldyBGaWxlKG1vZGVsLmdldFRlbXBsYXRlc0RpcigpLCBjYW52YXNQYXRoKSk7CisgICAgICAgIGNhbnZhcy5zZXRJbWFnZXNEaXIobmV3IEZpbGUobW9kZWwuZ2V0SW1hZ2VzRGlyKCksIGNhbnZhc1BhdGgpKTsKKyAgICAgICAgY2FudmFzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiY2FudmFzLiIgKyBldnQuZ2V0UHJvcGVydHlOYW1lKCksIGV2dC5nZXRPbGRWYWx1ZSgpLCBldnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAvLyBjcmVhdGUgbmV3IHN0eWxlCisgICAgICAgIHN0eWxlID0gbmV3IFVJU3R5bGUoKTsKKyAgICAgICAgc3R5bGUuc2V0UGFyZW50U3R5bGUocmVnaW9uLmdldFN0eWxlKCkpOworICAgICAgICBzdHlsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInN0eWxlLiIgKyBldnQuZ2V0UHJvcGVydHlOYW1lKCksIGV2dC5nZXRPbGRWYWx1ZSgpLCBldnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gSklCWCBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBKSUJYIG5lZWRzIHRoaXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZUtleXMgVGhlIG5ldyBsaXN0IG9mIHN0YXRlcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRTdGF0ZUtleXMoTGlzdDxTdHJpbmc+IHN0YXRlS2V5cykgeworICAgICAgICBpZiAoc3RhdGVLZXlzICE9IHRoaXMuc3RhdGVLZXlzKSB7CisgICAgICAgICAgICB0aGlzLnN0YXRlS2V5cy5jbGVhcigpOworICAgICAgICAgICAgdGhpcy5zdGF0ZUtleXMuYWRkQWxsKHN0YXRlS2V5cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSklCWCBhZnRlciBhbGwgZmllbGRzIGhhdmUgYmVlbiBzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBKSUJYIFVubWFyc2hhbGxpbmcgQ29udGV4dAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmVTZXQoSVVubWFyc2hhbGxpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gd2FsayB1cCB0aWxsIHdlIGdldCBzeW50aCBtb2RlbAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHQuZ2V0U3RhY2tEZXB0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFN0YWNrT2JqZWN0KGkpIGluc3RhbmNlb2YgSGFzVUlEZWZhdWx0cykgeworICAgICAgICAgICAgICAgIG1vZGVsRGVmYXVsdHMgPSAoKEhhc1VJRGVmYXVsdHMpIGNvbnRleHQuZ2V0U3RhY2tPYmplY3QoaSkpLmdldFVpRGVmYXVsdHMoKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kZWxEZWZhdWx0cyAhPSBudWxsKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHQuZ2V0U3RhY2tEZXB0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFN0YWNrT2JqZWN0KGkpIGluc3RhbmNlb2YgVUlSZWdpb24pIHsKKyAgICAgICAgICAgICAgICByZWdpb24gPSAoVUlSZWdpb24pIGNvbnRleHQuZ2V0U3RhY2tPYmplY3QoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSklCWCBhZnRlciBhbGwgZmllbGRzIGhhdmUgYmVlbiBzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBKSUJYIFVubWFyc2hhbGxpbmcgQ29udGV4dAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3N0U2V0KElVbm1hcnNoYWxsaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIGFkZCBsaXN0ZW5lcnMgdG8gcGFzcyBjYW52YXMgYW5kIHN0eWxlIGV2ZW50cyB1cCB0cmVlCisgICAgICAgIGNhbnZhcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImNhbnZhcy4iICsgZXZ0LmdldFByb3BlcnR5TmFtZSgpLCBldnQuZ2V0T2xkVmFsdWUoKSwgZXZ0LmdldE5ld1ZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc3R5bGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJzdHlsZS4iICsgZXZ0LmdldFByb3BlcnR5TmFtZSgpLCBldnQuZ2V0T2xkVmFsdWUoKSwgZXZ0LmdldE5ld1ZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEJlYW4gTWV0aG9kcworCisgICAgLyoqCisgICAgICogR2V0IHBhdGggdG8gdGhpcyBVSSBTdGF0ZSBvZiB0aGUgZm9ybSAvUmVnaW9uQS9SZWdpb25CL1N0YXRlTmFtZQorICAgICAqCisgICAgICogQHJldHVybiBQYXRoIHRvIHRoaXMgc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0TmFtZSgpKTsKKyAgICAgICAgVUlSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9uKCk7CisgICAgICAgIC8vIGNoZWNrIGlmIHdlIGFyZSBmb3JlZ3JvdW5kIGJhY2tncm91bmQgb3IgYm9yZGVyCisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChVSVN0YXRlIHN0YXRlIDogcmVnaW9uLmdldEJhY2tncm91bmRTdGF0ZXMoKSkgeworICAgICAgICAgICAgaWYgKHN0YXRlID09IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBidWYuaW5zZXJ0KDAsICJCYWNrZ3JvdW5kLyIpOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBmb3IgKFVJU3RhdGUgc3RhdGUgOiByZWdpb24uZ2V0Rm9yZWdyb3VuZFN0YXRlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmluc2VydCgwLCAiRm9yZWdyb3VuZC8iKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgZm9yIChVSVN0YXRlIHN0YXRlIDogcmVnaW9uLmdldEJvcmRlclN0YXRlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmluc2VydCgwLCAiQm9yZGVyLyIpOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgcGFyZW50IHJlZ2lvbnMKKyAgICAgICAgd2hpbGUgKHJlZ2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuaW5zZXJ0KDAsICcvJyk7CisgICAgICAgICAgICBpZiAocmVnaW9uIGluc3RhbmNlb2YgVUlDb21wb25lbnQgJiYgKChVSUNvbXBvbmVudCkgcmVnaW9uKS5nZXRDb21wb25lbnROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1Zi5pbnNlcnQoMCwgKChVSUNvbXBvbmVudCkgcmVnaW9uKS5nZXRDb21wb25lbnROYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWYuaW5zZXJ0KDAsIHJlZ2lvbi5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVnaW9uID0gcmVnaW9uLmdldFJlZ2lvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFJlZ2lvbihVSVJlZ2lvbiByKSB7CisgICAgICAgIHRoaXMucmVnaW9uID0gcjsKKyAgICAgICAgdGhpcy5zdHlsZS5zZXRQYXJlbnRTdHlsZShyLmdldFN0eWxlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBVSVJlZ2lvbiBnZXRSZWdpb24oKSB7CisgICAgICAgIHJldHVybiByZWdpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsb2NhbCBVSURlZmF1bHRzIHRoYXQgY29udGFpbnMgYWxsIHRoZSBVSURlZmF1bHRzIGluIHRoZSBzeW50aCBtb2RlbC4gSXQgaXMga2VwdCB1cHRvZGF0ZSBieSB0aGUKKyAgICAgKiBpbmRlcnZpZHVhbCBVSURlZmF1bHRzIG5vZGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBVSURlZmF1bHRzIGZvciB0aGUgc3ludGggbW9kZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgVUlEZWZhdWx0cyBnZXRVSURlZmF1bHRzKCkgeworICAgICAgICByZXR1cm4gbW9kZWxEZWZhdWx0czsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBzdGF0ZSB0eXBlIGtleXMgZm9yIHRoaXMgc3RhdGUuIFRoaXMgc3RhdGUgaXMgYXBwbGllZCB3aGVuIHRoZSBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZSBtYXRjaGVzIGFzCisgICAgICogbWFueSBhcyBwb3NzaWJsZSBvZiB0aGVzZSBzdGF0ZSB0eXBlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTGlzdCBvZiBzdGF0ZSB0eXBlcyB0aGF0IG5lZWQgdG8gYmUgdHJ1ZSBmb3IgdGhpcyBzdGF0ZS4gVGhpcyBpcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBkYXRhIGFuZCBjaGFuZ2VzIHRvCisgICAgICogICAgICAgICB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGVmZmVjdCB0aGlzIFVpU3RhdGUuCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTdGF0ZUtleXMoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZUtleXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW52ZXJ0ZWQoYm9vbGVhbiBiKSB7CisgICAgICAgIGJvb2xlYW4gb2xkID0gaW52ZXJ0ZWQ7CisgICAgICAgIGludmVydGVkID0gYjsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJpbnZlcnQiLCBvbGQsIGIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW52ZXJ0ZWQoKSB7CisgICAgICAgIHJldHVybiBpbnZlcnRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBzdGF0ZQorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgaWYgKGNhY2hlZE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc3RhdGVLZXlzKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoa2V5cyk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpdGVyLm5leHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSBidWYuYXBwZW5kKCcrJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWNoZWROYW1lID0gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhY2hlZE5hbWU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIENhbnZhcyBnZXRDYW52YXMoKSB7CisgICAgICAgIHJldHVybiBjYW52YXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FudmFzKENhbnZhcyBjKSB7CisgICAgICAgIENhbnZhcyBvbGQgPSBjYW52YXM7CisgICAgICAgIGNhbnZhcyA9IGM7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiY2FudmFzIiwgb2xkLCBjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVUlTdHlsZSBnZXRTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0eWxlOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gSklCWCBIZWxwZXIgTWV0aG9kcworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcga2V5c1RvU3RyaW5nKExpc3Q8U3RyaW5nPiBrZXlzKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgYnVmLmFwcGVuZChpdGVyLm5leHQoKSk7CisgICAgICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIGJ1Zi5hcHBlbmQoJysnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gc3RyaW5nVG9LZXlzKFN0cmluZyBrZXlzU3RyaW5nKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGtleXNTdHJpbmcuc3BsaXQoIlxcKyIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlTdGF0ZVR5cGUuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvVUlTdGF0ZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTFjYThmCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSVN0YXRlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWw7CisKK2ltcG9ydCBvcmcuamRlc2t0b3AuYmVhbnMuQWJzdHJhY3RCZWFuOworCisvKioKKyAqIFVJU3RhdGVUeXBlIC0gQSBVSUNvbXBvbmVudHMgaGFzIGEgY29sbGVjdGlvbiBvZiB0aGVzZSB3aGljaCBjb25zdGl0dXRlIHRoZSBhdmlsYWJsZXMgc3RhdGVzIHdoaWNoIGNhbiBiZSBjaG9zZW4gaW4KKyAqIHRoZSBjb21wb25lbnRzIHJlZ2lvbnMuIEEgVUlTdGF0ZVR5cGUgY2FuIGJlIGVpdGhlciBhIGN1c3RvbSBzdGF0ZSBvciBvbmUgb2YgdGhlIHByZWRlZmluZWQgc3RhbmRhcmQgc3RhdGVzLgorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBVSVN0YXRlVHlwZSBleHRlbmRzIEFic3RyYWN0QmVhbiB7CisgICAgLyogS2V5cyBmb3Igc3RhbmRhcmQgc3ludGggc3RhdGVzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFRF9LRVkgPSAiRW5hYmxlZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9VU0VfT1ZFUl9LRVkgPSAiTW91c2VPdmVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTU0VEX0tFWSA9ICJQcmVzc2VkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9LRVkgPSAiRGlzYWJsZWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPQ1VTRURfS0VZID0gIkZvY3VzZWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVEVEX0tFWSA9ICJTZWxlY3RlZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9LRVkgPSAiRGVmYXVsdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVEFOREFSRF9TWU5USF9TVEFURV9LRVlTID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgRU5BQkxFRF9LRVksIE1PVVNFX09WRVJfS0VZLCBQUkVTU0VEX0tFWSwgRElTQUJMRURfS0VZLCBGT0NVU0VEX0tFWSwgU0VMRUNURURfS0VZLCBERUZBVUxUX0tFWQorICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVSVN0YXRlVHlwZVtdIFNUQU5EQVJEX1NZTlRIX1NUQVRFUyA9IG5ldyBVSVN0YXRlVHlwZVtdeworICAgICAgICAgICAgbmV3IFVJU3RhdGVUeXBlKEVOQUJMRURfS0VZKSwKKyAgICAgICAgICAgIG5ldyBVSVN0YXRlVHlwZShNT1VTRV9PVkVSX0tFWSksCisgICAgICAgICAgICBuZXcgVUlTdGF0ZVR5cGUoUFJFU1NFRF9LRVkpLAorICAgICAgICAgICAgbmV3IFVJU3RhdGVUeXBlKERJU0FCTEVEX0tFWSksCisgICAgICAgICAgICBuZXcgVUlTdGF0ZVR5cGUoRk9DVVNFRF9LRVkpLAorICAgICAgICAgICAgbmV3IFVJU3RhdGVUeXBlKFNFTEVDVEVEX0tFWSksCisgICAgICAgICAgICBuZXcgVUlTdGF0ZVR5cGUoREVGQVVMVF9LRVkpCisgICAgfTsKKworICAgIC8qKiBVbmlxdWUgc3RyaW5nIGZvciB0aGUgdWkga2V5IGZvciB0aGlzIHN0YXRlLCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBjb21wb25lbnRzIHNldCBvZiBVaVN0YXRlVHlwZXMgKi8KKyAgICBwcml2YXRlIFN0cmluZyBrZXk7CisgICAgLyoqCisgICAgICogU25pcHBldCBvZiBqYXZhIGNvZGUgdGhhdCBkZWZpbmVzIGNhbGN1bGF0ZXMgdGhlIHZhbHVlIG9mIHRoaXMgc3RhdGUgZm9yIGEgcGFydGljdWxhciBjb21wb25lbnQuIFRoZSB2YXJhaWFibGUKKyAgICAgKiA8Y29kZT5jPC9jb2RlPiBpcyB0aGUgY29tcG9uZW50LiBZb3UgZW5kIHdpdGggYSByZXR1cm4gc3RhdGVtZW50IHJldHVybmluZyBib29sZWFuIHRydWUvZmFsc2UgZm9yIHRoZSBjdXJyZW50CisgICAgICogdmFsdWUgb2YgdGhpcyBzdGF0ZSBmb3IgdGhpcyBjb21wb25lbnQuIFRoaXMgY2FuIGJlIG51bGwgaWYgdGhlIGtleSBpcyBvbmUgb2YgdGhhdCBzdGFuZGFyZCBzeW50aCBzdGF0ZXMgZGVmaW5lZAorICAgICAqIGluIGNvbnN0YW50cyBpbiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvZGVTbmlwcGV0OworCisgICAgLyoqIEpJQlggbm8tYXJncyBjb250cnVjdG9yICovCisgICAgcHJpdmF0ZSBVSVN0YXRlVHlwZSgpIHt9CisKKyAgICBwcml2YXRlIFVJU3RhdGVUeXBlKFN0cmluZyBrZXkpIHsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMuY29kZVNuaXBwZXQgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBVSVN0YXRlVHlwZShTdHJpbmcga2V5LCBTdHJpbmcgY29kZVNuaXBwZXQpIHsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMuY29kZVNuaXBwZXQgPSBjb2RlU25pcHBldDsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEJlYW4gTWV0aG9kcworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1aSBkZWZhdWx0cyBrZXkgZm9yIHRoaXMgc3RhdGUgdHlwZS4gVW5pcXVlIHN0cmluZyBmb3IgdGhlIHVpIGtleSBmb3IgdGhpcyBzdGF0ZSwgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEKKyAgICAgKiBjb21wb25lbnRzIHNldCBvZiBVaVN0YXRlVHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVuaXF1ZSB1aSBkZWZhdWx0IGtleQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc25pcHBldCBvZiBqYXZhIGNvZGUgdGhhdCBkZWZpbmVzIGNhbGN1bGF0ZXMgdGhlIHZhbHVlIG9mIHRoaXMgc3RhdGUgZm9yIGEgcGFydGljdWxhciBjb21wb25lbnQuIFRoZQorICAgICAqIHZhcmFpYWJsZSA8Y29kZT5jPC9jb2RlPiBpcyB0aGUgY29tcG9uZW50LiBZb3UgZW5kIHdpdGggYSByZXR1cm4gc3RhdGVtZW50IHJldHVybmluZyBib29sZWFuIHRydWUvZmFsc2UgZm9yIHRoZQorICAgICAqIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBzdGF0ZSBmb3IgdGhpcyBjb21wb25lbnQuIFRoaXMgY2FuIGJlIG51bGwgaWYgdGhlIGtleSBpcyBvbmUgb2YgdGhhdCBzdGFuZGFyZCBzeW50aCBzdGF0ZXMKKyAgICAgKiBkZWZpbmVkIGluIGNvbnN0YW50cyBpbiB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiBTbmlwcGV0IG9mIGphdmEgY29kZSBvciBudWxsIGlmIHRoaXMgaXMgYSBzeW50aCBzdGFuZGFyZCBzdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29kZVNuaXBwZXQoKSB7CisgICAgICAgIHJldHVybiBjb2RlU25pcHBldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNuaXBwZXQgb2YgamF2YSBjb2RlIHRoYXQgZGVmaW5lcyBjYWxjdWxhdGVzIHRoZSB2YWx1ZSBvZiB0aGlzIHN0YXRlIGZvciBhIHBhcnRpY3VsYXIgY29tcG9uZW50LiBUaGUKKyAgICAgKiB2YXJhaWFibGUgPGNvZGU+YzwvY29kZT4gaXMgdGhlIGNvbXBvbmVudC4gWW91IGVuZCB3aXRoIGEgcmV0dXJuIHN0YXRlbWVudCByZXR1cm5pbmcgYm9vbGVhbiB0cnVlL2ZhbHNlIGZvciB0aGUKKyAgICAgKiBjdXJyZW50IHZhbHVlIG9mIHRoaXMgc3RhdGUgZm9yIHRoaXMgY29tcG9uZW50LiBUaGlzIGNhbiBiZSBudWxsIGlmIHRoZSBrZXkgaXMgb25lIG9mIHRoYXQgc3RhbmRhcmQgc3ludGggc3RhdGVzCisgICAgICogZGVmaW5lZCBpbiBjb25zdGFudHMgaW4gdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlU25pcHBldCBTbmlwcGV0IG9mIGphdmEgY29kZSBvciBudWxsIGlmIHRoaXMgaXMgYSBzeW50aCBzdGFuZGFyZCBzdGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvZGVTbmlwcGV0KFN0cmluZyBjb2RlU25pcHBldCkgeworICAgICAgICB0aGlzLmNvZGVTbmlwcGV0ID0gY29kZVNuaXBwZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZiB0aGlzIHN0YXRlIHR5cGUgaXMgYSBzdGFuZGFyZCBzeW50aCB0eXBlIGFuZCBoYXMgbm8gY29kZSBzbmlwcGV0IG9yIGEgY3VzdG9tIHR5cGUgdGhhdCBoYXMgYSBjb2RlCisgICAgICogc25pcHBldC4gSXQgaXMgdXNlZCBieSBKSUJYIHRvIGRldGVybWluIGlmIHRoZSBjb2RlIHNuaXBwZXQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gWE1MLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb2RlU25pcHBldCBpcyBub24gbnVsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0NvZGVTbmlwcGV0KCkgeworICAgICAgICByZXR1cm4gY29kZVNuaXBwZXQgIT0gbnVsbDsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSVN0eWxlLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL1VJU3R5bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTkyNmJmCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9VSVN0eWxlLmphdmEKQEAgLTAsMCArMSw0NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbDsKKworaW1wb3J0IG9yZy5qZGVza3RvcC5iZWFucy5BYnN0cmFjdEJlYW47CitpbXBvcnQgb3JnLmpkZXNrdG9wLnN3aW5neC5kZXNpZ25lci5mb250LlR5cGVmYWNlOworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIucGFpbnQuTWF0dGU7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JVW5tYXJzaGFsbGluZ0NvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVUlTdHlsZQorICoKKyAqIEBhdXRob3IgIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciAgSmFzcGVyIFBvdHRzCisgKi8KK3B1YmxpYyBjbGFzcyBVSVN0eWxlIGV4dGVuZHMgQWJzdHJhY3RCZWFuIHsKKyAgICBwdWJsaWMgc3RhdGljIGVudW0gQ2FjaGVNb2RlIHtOT19DQUNISU5HLEZJWEVEX1NJWkVTLE5JTkVfU1FVQVJFX1NDQUxFfQorICAgIHB1YmxpYyBzdGF0aWMgZW51bSBIaW50QWxwaGFJbnRlcnBvbGF0aW9uIHsKKyAgICAgICAgREVGQVVMVCwgUVVBTElUWSwgU1BFRUQKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGVudW0gSGludEFudGlhbGlhc2luZyB7CisgICAgICAgIERFRkFVTFQsIE9OLCBPRkYKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGVudW0gSGludENvbG9yUmVuZGVyaW5nIHsKKyAgICAgICAgREVGQVVMVCwgUVVBTElUWSwgU1BFRUQKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGVudW0gSGludERpdGhlcmluZyB7CisgICAgICAgIERFRkFVTFQsIERJU0FCTEUsIEVOQUJMRQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBIaW50RnJhY3Rpb25hbE1ldHJpY3MgeworICAgICAgICBERUZBVUxULCBPTiwgT0ZGCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBlbnVtIEhpbnRJbnRlcnBvbGF0aW9uIHsKKyAgICAgICAgTkVBUkVTVF9ORUlHSEJPUiwgQklMSU5FQVIsIEJJQ1VCSUMKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGVudW0gSGludFJlbmRlcmluZyB7CisgICAgICAgIERFRkFVTFQsIFFVQUxJVFksIFNQRUVECisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBlbnVtIEhpbnRTdHJva2VDb250cm9sIHsKKyAgICAgICAgREVGQVVMVCwgTk9STUFMSVpFLCBQVVJFCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBlbnVtIEhpbnRUZXh0QW50aWFsaWFzaW5nIHsKKyAgICAgICAgREVGQVVMVCwgT04sIE9GRiwgR0FTUCwgTENEX0hCR1IsIExDRF9IUkdCLCBMQ0RfVkJHUiwgTENEX1ZSR0IKKyAgICB9CisKKyAgICBwcml2YXRlIFR5cGVmYWNlIGZvbnQgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBmb250SW5oZXJpdGVkID0gdHJ1ZTsKKyAgICBwcml2YXRlIE1hdHRlIHRleHRGb3JlZ3JvdW5kID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdGV4dEZvcmVncm91bmRJbmhlcml0ZWQgPSB0cnVlOworICAgIHByaXZhdGUgTWF0dGUgdGV4dEJhY2tncm91bmQgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiB0ZXh0QmFja2dyb3VuZEluaGVyaXRlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBNYXR0ZSBiYWNrZ3JvdW5kID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gYmFja2dyb3VuZEluaGVyaXRlZCA9IHRydWU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGVTZXR0aW5nc0luaGVyaXRlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBDYWNoZU1vZGUgY2FjaGVNb2RlID0gQ2FjaGVNb2RlLkZJWEVEX1NJWkVTOworICAgIHByaXZhdGUgZG91YmxlIG1heEhvekNhY2hlZEltZ1NjYWxpbmcgPSAxOworICAgIHByaXZhdGUgZG91YmxlIG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nID0gMTsKKworICAgIHByaXZhdGUgSGludEFscGhhSW50ZXJwb2xhdGlvbiBoaW50QWxwaGFJbnRlcnBvbGF0aW9uID0gbnVsbDsKKyAgICBwcml2YXRlIEhpbnRBbnRpYWxpYXNpbmcgaGludEFudGlhbGlhc2luZyA9IG51bGw7CisgICAgcHJpdmF0ZSBIaW50Q29sb3JSZW5kZXJpbmcgaGludENvbG9yUmVuZGVyaW5nID0gbnVsbDsKKyAgICBwcml2YXRlIEhpbnREaXRoZXJpbmcgaGludERpdGhlcmluZyA9IG51bGw7CisgICAgcHJpdmF0ZSBIaW50RnJhY3Rpb25hbE1ldHJpY3MgaGludEZyYWN0aW9uYWxNZXRyaWNzID0gbnVsbDsKKyAgICBwcml2YXRlIEhpbnRJbnRlcnBvbGF0aW9uIGhpbnRJbnRlcnBvbGF0aW9uID0gbnVsbDsKKyAgICBwcml2YXRlIEhpbnRSZW5kZXJpbmcgaGludFJlbmRlcmluZyA9IG51bGw7CisgICAgcHJpdmF0ZSBIaW50U3Ryb2tlQ29udHJvbCBoaW50U3Ryb2tlQ29udHJvbCA9IG51bGw7CisgICAgcHJpdmF0ZSBIaW50VGV4dEFudGlhbGlhc2luZyBoaW50VGV4dEFudGlhbGlhc2luZyA9IG51bGw7CisgICAgcHJpdmF0ZSBMaXN0PFVJUHJvcGVydHk+IHVpUHJvcGVydGllczsKKyAgICBwcml2YXRlIFVJU3R5bGUgcGFyZW50U3R5bGUgPSBudWxsOworCisgICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRleHRGb3JlZ291bmRMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ0ZXh0Rm9yZWdyb3VuZC4iICsgZXZ0LmdldFByb3BlcnR5TmFtZSgpLCBldnQuZ2V0T2xkVmFsdWUoKSwgZXZ0LmdldE5ld1ZhbHVlKCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGV4dEJhY2tncm91bmRMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ0ZXh0QmFja2dyb3VuZC4iICsgZXZ0LmdldFByb3BlcnR5TmFtZSgpLCBldnQuZ2V0T2xkVmFsdWUoKSwgZXZ0LmdldE5ld1ZhbHVlKCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYmFja2dyb3VuZExpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImJhY2tncm91bmQuIiArIGV2dC5nZXRQcm9wZXJ0eU5hbWUoKSwgZXZ0LmdldE9sZFZhbHVlKCksIGV2dC5nZXROZXdWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIENvbnN0cnVjdG9ycworCisgICAgcHVibGljIFVJU3R5bGUoKSB7CisgICAgICAgIHVpUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8VUlQcm9wZXJ0eT4oKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEpJQlggTWV0aG9kcworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpJQlggYWZ0ZXIgYWxsIGZpZWxkcyBoYXZlIGJlZW4gc2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgSklCWCBVbm1hcnNoYWxsaW5nIENvbnRleHQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9zdFNldChJVW5tYXJzaGFsbGluZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyB3YWxrIHVwIHRpbGwgd2UgZ2V0IGEgcGFyZW50IHN0eWxlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dC5nZXRTdGFja0RlcHRoKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0U3RhY2tPYmplY3QoaSkgaW5zdGFuY2VvZiBIYXNVSVN0eWxlKSB7CisgICAgICAgICAgICAgICAgSGFzVUlTdHlsZSBoYXNTdHlsZSA9IChIYXNVSVN0eWxlKSBjb250ZXh0LmdldFN0YWNrT2JqZWN0KGkpOworICAgICAgICAgICAgICAgIGlmIChoYXNTdHlsZS5nZXRTdHlsZSgpICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50U3R5bGUgPSBoYXNTdHlsZS5nZXRTdHlsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50U3R5bGUgIT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBCZWFuIE1ldGhvZHMKKworICAgIHB1YmxpYyBVSVN0eWxlIGdldFBhcmVudFN0eWxlKCkgeworICAgICAgICByZXR1cm4gcGFyZW50U3R5bGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50U3R5bGUoVUlTdHlsZSBwYXJlbnRTdHlsZSkgeworICAgICAgICBVSVN0eWxlIG9sZCA9IGdldFBhcmVudFN0eWxlKCk7CisgICAgICAgIHRoaXMucGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwYXJlbnRTdHlsZSIsIG9sZCwgZ2V0UGFyZW50U3R5bGUoKSk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VUlQcm9wZXJ0eT4gZ2V0VWlQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gdWlQcm9wZXJ0aWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFVpUHJvcGVydHkoVUlQcm9wZXJ0eSB1aVByb3BlcnR5KSB7CisgICAgICAgIHVpUHJvcGVydGllcy5hZGQodWlQcm9wZXJ0eSk7CisgICAgICAgIC8vIHRvZG8gbm90IHF1aXRlIHN1cmUgd2hhdCBldmVudHMgd2Ugd2FudCBoZXJlCisgICAgICAgIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UoInVpUHJvcGVydGllcyIsIHVpUHJvcGVydGllcy5zaXplKCksIG51bGwsIHVpUHJvcGVydHkpOworLy8gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgidWlQcm9wZXJ0aWVzIiwgbnVsbCwgdWlQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVaVByb3BlcnR5KFVJUHJvcGVydHkgdWlQcm9wZXJ0eSkgeworICAgICAgICBpbnQgaW5kZXggPSB1aVByb3BlcnRpZXMuaW5kZXhPZih1aVByb3BlcnR5KTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICB1aVByb3BlcnRpZXMucmVtb3ZlKHVpUHJvcGVydHkpOworICAgICAgICAgICAgLy8gdG9kbyBub3QgcXVpdGUgc3VyZSB3aGF0IGV2ZW50cyB3ZSB3YW50IGhlcmUKKyAgICAgICAgICAgIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UoInVpUHJvcGVydGllcyIsIGluZGV4LCBudWxsLCB1aVByb3BlcnR5KTsKKy8vICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJ1aVByb3BlcnRpZXMiLCBudWxsLCB1aVByb3BlcnRpZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFR5cGVmYWNlIGdldEZvbnQoKSB7CisgICAgICAgIGlmIChpc0ZvbnRJbmhlcml0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudFN0eWxlID09IG51bGwgPyBmb250IDogcGFyZW50U3R5bGUuZ2V0Rm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb250KFR5cGVmYWNlIGZvbnQpIHsKKyAgICAgICAgVHlwZWZhY2Ugb2xkID0gZ2V0Rm9udCgpOworICAgICAgICB0aGlzLmZvbnQgPSBmb250OworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImZvbnQiLCBvbGQsIGZvbnQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRm9udEluaGVyaXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZvbnRJbmhlcml0ZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9udEluaGVyaXRlZChib29sZWFuIGIpIHsKKyAgICAgICAgYm9vbGVhbiBvbGQgPSBpc0ZvbnRJbmhlcml0ZWQoKTsKKyAgICAgICAgZm9udEluaGVyaXRlZCA9IGI7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZm9udEluaGVyaXRlZCIsIG9sZCwgYik7CisKKyAgICAgICAgaWYgKCFmb250SW5oZXJpdGVkICYmIGZvbnQgPT0gbnVsbCAmJiBwYXJlbnRTdHlsZSAhPSBudWxsICYmIHBhcmVudFN0eWxlLmdldEZvbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb250ID0gcGFyZW50U3R5bGUuZ2V0Rm9udCgpLmNsb25lKCk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImZvbnQiLCBudWxsLCBmb250KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNYXR0ZSBnZXRUZXh0Rm9yZWdyb3VuZCgpIHsKKyAgICAgICAgaWYgKGlzVGV4dEZvcmVncm91bmRJbmhlcml0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudFN0eWxlID09IG51bGwgPyBudWxsIDogcGFyZW50U3R5bGUuZ2V0VGV4dEZvcmVncm91bmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0Rm9yZWdyb3VuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGV4dEZvcmVncm91bmRJbmhlcml0ZWQoKSB7CisgICAgICAgIHJldHVybiB0ZXh0Rm9yZWdyb3VuZEluaGVyaXRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0Rm9yZWdyb3VuZEluaGVyaXRlZChib29sZWFuIGIpIHsKKyAgICAgICAgYm9vbGVhbiBvbGQgPSBpc1RleHRGb3JlZ3JvdW5kSW5oZXJpdGVkKCk7CisgICAgICAgIHRleHRGb3JlZ3JvdW5kSW5oZXJpdGVkID0gYjsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJmb3JlZ3JvdW5kSW5oZXJpdGVkIiwgb2xkLCBiKTsKKworICAgICAgICBpZiAoIXRleHRGb3JlZ3JvdW5kSW5oZXJpdGVkICYmIHRleHRGb3JlZ3JvdW5kID09IG51bGwgJiYgcGFyZW50U3R5bGUgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIHBhcmVudFN0eWxlLmdldFRleHRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGV4dEZvcmVncm91bmQgPSBwYXJlbnRTdHlsZS5nZXRUZXh0Rm9yZWdyb3VuZCgpLmNsb25lKCk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInRleHRGb3JlZ3JvdW5kIiwgbnVsbCwgdGV4dEZvcmVncm91bmQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGV4dEZvcmVncm91bmQoTWF0dGUgdGV4dEZvcmVncm91bmQpIHsKKyAgICAgICAgTWF0dGUgb2xkID0gdGhpcy50ZXh0Rm9yZWdyb3VuZDsKKyAgICAgICAgaWYgKG9sZCAhPSBudWxsKSBvbGQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0ZXh0Rm9yZWdvdW5kTGlzdGVuZXIpOworICAgICAgICB0aGlzLnRleHRGb3JlZ3JvdW5kID0gdGV4dEZvcmVncm91bmQ7CisgICAgICAgIGlmICh0aGlzLnRleHRGb3JlZ3JvdW5kICE9IG51bGwpIHRoaXMudGV4dEZvcmVncm91bmQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0ZXh0Rm9yZWdvdW5kTGlzdGVuZXIpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInRleHRGb3JlZ3JvdW5kIiwgb2xkLCB0aGlzLnRleHRGb3JlZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWF0dGUgZ2V0VGV4dEJhY2tncm91bmQoKSB7CisgICAgICAgIGlmIChpc1RleHRCYWNrZ3JvdW5kSW5oZXJpdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRTdHlsZSA9PSBudWxsID8gbnVsbCA6IHBhcmVudFN0eWxlLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0QmFja2dyb3VuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGV4dEJhY2tncm91bmRJbmhlcml0ZWQoKSB7CisgICAgICAgIHJldHVybiB0ZXh0QmFja2dyb3VuZEluaGVyaXRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0QmFja2dyb3VuZEluaGVyaXRlZChib29sZWFuIGIpIHsKKyAgICAgICAgYm9vbGVhbiBvbGQgPSBpc0JhY2tncm91bmRJbmhlcml0ZWQoKTsKKyAgICAgICAgdGV4dEJhY2tncm91bmRJbmhlcml0ZWQgPSBiOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInRleHRCYWNrZ3JvdW5kSW5oZXJpdGVkIiwgb2xkLCBiKTsKKworICAgICAgICBpZiAoIXRleHRCYWNrZ3JvdW5kSW5oZXJpdGVkICYmIHRleHRCYWNrZ3JvdW5kID09IG51bGwgJiYgcGFyZW50U3R5bGUgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIHBhcmVudFN0eWxlLmdldFRleHRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGV4dEJhY2tncm91bmQgPSBwYXJlbnRTdHlsZS5nZXRUZXh0QmFja2dyb3VuZCgpLmNsb25lKCk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoInRleHRCYWNrZ3JvdW5kIiwgbnVsbCwgdGV4dEJhY2tncm91bmQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGV4dEJhY2tncm91bmQoTWF0dGUgdGV4dEJhY2tncm91bmQpIHsKKyAgICAgICAgTWF0dGUgb2xkID0gdGhpcy50ZXh0QmFja2dyb3VuZDsKKyAgICAgICAgaWYgKG9sZCAhPSBudWxsKSBvbGQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0ZXh0QmFja2dyb3VuZExpc3RlbmVyKTsKKyAgICAgICAgdGhpcy50ZXh0QmFja2dyb3VuZCA9IHRleHRCYWNrZ3JvdW5kOworICAgICAgICBpZiAodGhpcy50ZXh0QmFja2dyb3VuZCAhPSBudWxsKSB0aGlzLnRleHRCYWNrZ3JvdW5kLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGV4dEJhY2tncm91bmRMaXN0ZW5lcik7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgidGV4dEJhY2tncm91bmQiLCBvbGQsIHRoaXMudGV4dEJhY2tncm91bmQpOworICAgIH0KKworICAgIHB1YmxpYyBNYXR0ZSBnZXRCYWNrZ3JvdW5kKCkgeworICAgICAgICBpZiAoaXNCYWNrZ3JvdW5kSW5oZXJpdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRTdHlsZSA9PSBudWxsID8gbnVsbCA6IHBhcmVudFN0eWxlLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBiYWNrZ3JvdW5kOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNCYWNrZ3JvdW5kSW5oZXJpdGVkKCkgeworICAgICAgICByZXR1cm4gYmFja2dyb3VuZEluaGVyaXRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW5oZXJpdGVkKGJvb2xlYW4gYikgeworICAgICAgICBib29sZWFuIG9sZCA9IGlzQmFja2dyb3VuZEluaGVyaXRlZCgpOworICAgICAgICBiYWNrZ3JvdW5kSW5oZXJpdGVkID0gYjsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJiYWNrZ3JvdW5kSW5oZXJpdGVkIiwgb2xkLCBiKTsKKworICAgICAgICBpZiAoIWJhY2tncm91bmRJbmhlcml0ZWQgJiYgYmFja2dyb3VuZCA9PSBudWxsICYmIHBhcmVudFN0eWxlICE9IG51bGwgJiYgcGFyZW50U3R5bGUuZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQgPSBwYXJlbnRTdHlsZS5nZXRCYWNrZ3JvdW5kKCkuY2xvbmUoKTsKKyAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYmFja2dyb3VuZCIsIG51bGwsIGJhY2tncm91bmQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChNYXR0ZSBiYWNrZ3JvdW5kKSB7CisgICAgICAgIE1hdHRlIG9sZCA9IHRoaXMuYmFja2dyb3VuZDsKKyAgICAgICAgaWYgKG9sZCAhPSBudWxsKSBvbGQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihiYWNrZ3JvdW5kTGlzdGVuZXIpOworICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOworICAgICAgICBpZiAodGhpcy5iYWNrZ3JvdW5kICE9IG51bGwpIHRoaXMuYmFja2dyb3VuZC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGJhY2tncm91bmRMaXN0ZW5lcik7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiYmFja2dyb3VuZCIsIG9sZCwgdGhpcy5iYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGludEFscGhhSW50ZXJwb2xhdGlvbiBnZXRIaW50QWxwaGFJbnRlcnBvbGF0aW9uKCkgeworICAgICAgICByZXR1cm4gaGludEFscGhhSW50ZXJwb2xhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIaW50QWxwaGFJbnRlcnBvbGF0aW9uKEhpbnRBbHBoYUludGVycG9sYXRpb24gaGludEFscGhhSW50ZXJwb2xhdGlvbikgeworICAgICAgICBIaW50QWxwaGFJbnRlcnBvbGF0aW9uIG9sZCA9IGdldEhpbnRBbHBoYUludGVycG9sYXRpb24oKTsKKyAgICAgICAgdGhpcy5oaW50QWxwaGFJbnRlcnBvbGF0aW9uID0gaGludEFscGhhSW50ZXJwb2xhdGlvbjsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJoaW50QWxwaGFJbnRlcnBvbGF0aW9uIiwgb2xkLCBnZXRIaW50QWxwaGFJbnRlcnBvbGF0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyBIaW50QW50aWFsaWFzaW5nIGdldEhpbnRBbnRpYWxpYXNpbmcoKSB7CisgICAgICAgIHJldHVybiBoaW50QW50aWFsaWFzaW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhpbnRBbnRpYWxpYXNpbmcoSGludEFudGlhbGlhc2luZyBoaW50QW50aWFsaWFzaW5nKSB7CisgICAgICAgIEhpbnRBbnRpYWxpYXNpbmcgb2xkID0gZ2V0SGludEFudGlhbGlhc2luZygpOworICAgICAgICB0aGlzLmhpbnRBbnRpYWxpYXNpbmcgPSBoaW50QW50aWFsaWFzaW5nOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImhpbnRBbnRpYWxpYXNpbmciLCBvbGQsIGdldEhpbnRBbnRpYWxpYXNpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIEhpbnRDb2xvclJlbmRlcmluZyBnZXRIaW50Q29sb3JSZW5kZXJpbmcoKSB7CisgICAgICAgIHJldHVybiBoaW50Q29sb3JSZW5kZXJpbmc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGludENvbG9yUmVuZGVyaW5nKEhpbnRDb2xvclJlbmRlcmluZyBoaW50Q29sb3JSZW5kZXJpbmcpIHsKKyAgICAgICAgSGludENvbG9yUmVuZGVyaW5nIG9sZCA9IGdldEhpbnRDb2xvclJlbmRlcmluZygpOworICAgICAgICB0aGlzLmhpbnRDb2xvclJlbmRlcmluZyA9IGhpbnRDb2xvclJlbmRlcmluZzsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJoaW50Q29sb3JSZW5kZXJpbmciLCBvbGQsIGdldEhpbnRDb2xvclJlbmRlcmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGludERpdGhlcmluZyBnZXRIaW50RGl0aGVyaW5nKCkgeworICAgICAgICByZXR1cm4gaGludERpdGhlcmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIaW50RGl0aGVyaW5nKEhpbnREaXRoZXJpbmcgaGludERpdGhlcmluZykgeworICAgICAgICBIaW50RGl0aGVyaW5nIG9sZCA9IGdldEhpbnREaXRoZXJpbmcoKTsKKyAgICAgICAgdGhpcy5oaW50RGl0aGVyaW5nID0gaGludERpdGhlcmluZzsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJoaW50RGl0aGVyaW5nIiwgb2xkLCBnZXRIaW50RGl0aGVyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyBIaW50RnJhY3Rpb25hbE1ldHJpY3MgZ2V0SGludEZyYWN0aW9uYWxNZXRyaWNzKCkgeworICAgICAgICByZXR1cm4gaGludEZyYWN0aW9uYWxNZXRyaWNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhpbnRGcmFjdGlvbmFsTWV0cmljcyhIaW50RnJhY3Rpb25hbE1ldHJpY3MgaGludEZyYWN0aW9uYWxNZXRyaWNzKSB7CisgICAgICAgIEhpbnRGcmFjdGlvbmFsTWV0cmljcyBvbGQgPSBnZXRIaW50RnJhY3Rpb25hbE1ldHJpY3MoKTsKKyAgICAgICAgdGhpcy5oaW50RnJhY3Rpb25hbE1ldHJpY3MgPSBoaW50RnJhY3Rpb25hbE1ldHJpY3M7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiaGludEZyYWN0aW9uYWxNZXRyaWNzIiwgb2xkLCBnZXRIaW50RnJhY3Rpb25hbE1ldHJpY3MoKSk7CisgICAgfQorCisgICAgcHVibGljIEhpbnRJbnRlcnBvbGF0aW9uIGdldEhpbnRJbnRlcnBvbGF0aW9uKCkgeworICAgICAgICByZXR1cm4gaGludEludGVycG9sYXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGludEludGVycG9sYXRpb24oSGludEludGVycG9sYXRpb24gaGludEludGVycG9sYXRpb24pIHsKKyAgICAgICAgSGludEludGVycG9sYXRpb24gb2xkID0gZ2V0SGludEludGVycG9sYXRpb24oKTsKKyAgICAgICAgdGhpcy5oaW50SW50ZXJwb2xhdGlvbiA9IGhpbnRJbnRlcnBvbGF0aW9uOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImhpbnRJbnRlcnBvbGF0aW9uIiwgb2xkLCBnZXRIaW50SW50ZXJwb2xhdGlvbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGludFJlbmRlcmluZyBnZXRIaW50UmVuZGVyaW5nKCkgeworICAgICAgICByZXR1cm4gaGludFJlbmRlcmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIaW50UmVuZGVyaW5nKEhpbnRSZW5kZXJpbmcgaGludFJlbmRlcmluZykgeworICAgICAgICBIaW50UmVuZGVyaW5nIG9sZCA9IGdldEhpbnRSZW5kZXJpbmcoKTsKKyAgICAgICAgdGhpcy5oaW50UmVuZGVyaW5nID0gaGludFJlbmRlcmluZzsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJoaW50UmVuZGVyaW5nIiwgb2xkLCBnZXRIaW50UmVuZGVyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyBIaW50U3Ryb2tlQ29udHJvbCBnZXRIaW50U3Ryb2tlQ29udHJvbCgpIHsKKyAgICAgICAgcmV0dXJuIGhpbnRTdHJva2VDb250cm9sOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhpbnRTdHJva2VDb250cm9sKEhpbnRTdHJva2VDb250cm9sIGhpbnRTdHJva2VDb250cm9sKSB7CisgICAgICAgIEhpbnRTdHJva2VDb250cm9sIG9sZCA9IGdldEhpbnRTdHJva2VDb250cm9sKCk7CisgICAgICAgIHRoaXMuaGludFN0cm9rZUNvbnRyb2wgPSBoaW50U3Ryb2tlQ29udHJvbDsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJoaW50U3Ryb2tlQ29udHJvbCIsIG9sZCwgZ2V0SGludFN0cm9rZUNvbnRyb2woKSk7CisgICAgfQorCisgICAgcHVibGljIEhpbnRUZXh0QW50aWFsaWFzaW5nIGdldEhpbnRUZXh0QW50aWFsaWFzaW5nKCkgeworICAgICAgICByZXR1cm4gaGludFRleHRBbnRpYWxpYXNpbmc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGludFRleHRBbnRpYWxpYXNpbmcoSGludFRleHRBbnRpYWxpYXNpbmcgaGludFRleHRBbnRpYWxpYXNpbmcpIHsKKyAgICAgICAgSGludFRleHRBbnRpYWxpYXNpbmcgb2xkID0gZ2V0SGludFRleHRBbnRpYWxpYXNpbmcoKTsKKyAgICAgICAgdGhpcy5oaW50VGV4dEFudGlhbGlhc2luZyA9IGhpbnRUZXh0QW50aWFsaWFzaW5nOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoImhpbnRUZXh0QW50aWFsaWFzaW5nIiwgb2xkLCBnZXRIaW50VGV4dEFudGlhbGlhc2luZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NhY2hlU2V0dGluZ3NJbmhlcml0ZWQoKSB7CisgICAgICAgIHJldHVybiBjYWNoZVNldHRpbmdzSW5oZXJpdGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlU2V0dGluZ3NJbmhlcml0ZWQoYm9vbGVhbiBjYWNoZVNldHRpbmdzSW5oZXJpdGVkKSB7CisgICAgICAgIGJvb2xlYW4gb2xkID0gaXNDYWNoZVNldHRpbmdzSW5oZXJpdGVkKCk7CisgICAgICAgIHRoaXMuY2FjaGVTZXR0aW5nc0luaGVyaXRlZCA9IGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiY2FjaGVTZXR0aW5nc0luaGVyaXRlZCIsIG9sZCwgaXNDYWNoZVNldHRpbmdzSW5oZXJpdGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyBDYWNoZU1vZGUgZ2V0Q2FjaGVNb2RlKCkgeworICAgICAgICBpZiAoaXNDYWNoZVNldHRpbmdzSW5oZXJpdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAocGFyZW50U3R5bGUgPT0gbnVsbCk/Q2FjaGVNb2RlLkZJWEVEX1NJWkVTIDogcGFyZW50U3R5bGUuZ2V0Q2FjaGVNb2RlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY2FjaGVNb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGVNb2RlKENhY2hlTW9kZSBjYWNoZU1vZGUpIHsKKyAgICAgICAgQ2FjaGVNb2RlIG9sZCA9IHRoaXMuY2FjaGVNb2RlOworICAgICAgICB0aGlzLmNhY2hlTW9kZSA9IGNhY2hlTW9kZTsKKyAgICAgICAgaWYgKGlzQ2FjaGVTZXR0aW5nc0luaGVyaXRlZCgpKSB7CisgICAgICAgICAgICBzZXRDYWNoZVNldHRpbmdzSW5oZXJpdGVkKGZhbHNlKTsKKyAgICAgICAgICAgIFVJU3R5bGUgcGFyZW50ID0gZ2V0UGFyZW50U3R5bGUoKTsKKyAgICAgICAgICAgIHNldE1heEhvekNhY2hlZEltZ1NjYWxpbmcocGFyZW50ID09IG51bGwgPyAxIDogcGFyZW50LmdldE1heEhvekNhY2hlZEltZ1NjYWxpbmcoKSk7CisgICAgICAgICAgICBzZXRNYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZyhwYXJlbnQgPT0gbnVsbCA/IDEgOiBwYXJlbnQuZ2V0TWF4VmVydENhY2hlZEltZ1NjYWxpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJjYWNoZU1vZGUiLG9sZCxjYWNoZU1vZGUpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0TWF4SG96Q2FjaGVkSW1nU2NhbGluZygpIHsKKyAgICAgICAgaWYgKGlzQ2FjaGVTZXR0aW5nc0luaGVyaXRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50U3R5bGUgPT0gbnVsbCA/IDEgOiBwYXJlbnRTdHlsZS5nZXRNYXhIb3pDYWNoZWRJbWdTY2FsaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbWF4SG96Q2FjaGVkSW1nU2NhbGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heEhvekNhY2hlZEltZ1NjYWxpbmcoZG91YmxlIG1heEhvekNhY2hlZEltZ1NjYWxpbmcpIHsKKyAgICAgICAgZG91YmxlIG9sZCA9IGdldE1heEhvekNhY2hlZEltZ1NjYWxpbmcoKTsKKyAgICAgICAgdGhpcy5tYXhIb3pDYWNoZWRJbWdTY2FsaW5nID0gbWF4SG96Q2FjaGVkSW1nU2NhbGluZzsKKyAgICAgICAgaWYgKGlzQ2FjaGVTZXR0aW5nc0luaGVyaXRlZCgpKSB7CisgICAgICAgICAgICBzZXRDYWNoZVNldHRpbmdzSW5oZXJpdGVkKGZhbHNlKTsKKyAgICAgICAgICAgIHNldENhY2hlTW9kZSgocGFyZW50U3R5bGUgPT0gbnVsbCk/Q2FjaGVNb2RlLkZJWEVEX1NJWkVTIDogcGFyZW50U3R5bGUuZ2V0Q2FjaGVNb2RlKCkpOworICAgICAgICAgICAgc2V0TWF4VmVydENhY2hlZEltZ1NjYWxpbmcocGFyZW50U3R5bGUgPT0gbnVsbCA/IDEgOiBwYXJlbnRTdHlsZS5nZXRNYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZygpKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoIm1heEhvekNhY2hlZEltZ1NjYWxpbmciLCBvbGQsIGdldE1heEhvekNhY2hlZEltZ1NjYWxpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRNYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZygpIHsKKyAgICAgICAgaWYgKGlzQ2FjaGVTZXR0aW5nc0luaGVyaXRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50U3R5bGUgPT0gbnVsbCA/IDEgOiBwYXJlbnRTdHlsZS5nZXRNYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4VmVydENhY2hlZEltZ1NjYWxpbmcoZG91YmxlIG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nKSB7CisgICAgICAgIGRvdWJsZSBvbGQgPSBnZXRNYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZygpOworICAgICAgICB0aGlzLm1heFZlcnRDYWNoZWRJbWdTY2FsaW5nID0gbWF4VmVydENhY2hlZEltZ1NjYWxpbmc7CisgICAgICAgIGlmIChpc0NhY2hlU2V0dGluZ3NJbmhlcml0ZWQoKSkgeworICAgICAgICAgICAgc2V0Q2FjaGVTZXR0aW5nc0luaGVyaXRlZChmYWxzZSk7CisgICAgICAgICAgICBzZXRDYWNoZU1vZGUoKHBhcmVudFN0eWxlID09IG51bGwpP0NhY2hlTW9kZS5GSVhFRF9TSVpFUyA6IHBhcmVudFN0eWxlLmdldENhY2hlTW9kZSgpKTsKKyAgICAgICAgICAgIHNldE1heEhvekNhY2hlZEltZ1NjYWxpbmcocGFyZW50U3R5bGUgPT0gbnVsbCA/IDEgOiBwYXJlbnRTdHlsZS5nZXRNYXhIb3pDYWNoZWRJbWdTY2FsaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgibWF4VmVydENhY2hlZEltZ1NjYWxpbmciLCBvbGQsIGdldE1heFZlcnRDYWNoZWRJbWdTY2FsaW5nKCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9qaWJ4aGVscGVycy9Cb3JkZXJNYXBwZXIuamF2YSBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvamlieGhlbHBlcnMvQm9yZGVyTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzNWY0MAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvamlieGhlbHBlcnMvQm9yZGVyTWFwcGVyLmphdmEKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2Ugb3JnLmpkZXNrdG9wLnN5bnRoZGVzaWduZXIuc3ludGhtb2RlbC5qaWJ4aGVscGVyczsKKworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSU1hcnNoYWxsZXI7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JVW5tYXJzaGFsbGVyOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSUFsaWFzYWJsZTsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklVbm1hcnNoYWxsaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLkppQlhFeGNlcHRpb247CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5NYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5pbXBsLlVubWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qZGVza3RvcC5zd2luZ3guZGVzaWduZXIuamlieGhlbHBlcnMuQ29sb3JNYXBwZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuTGluZUJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkV0Y2hlZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXI7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLk1hdHRlQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Db21wb3VuZEJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7CitpbXBvcnQgamF2YS5hd3QuSW5zZXRzOworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuUGFpbnRlckJvcmRlcjsKKworLyoqCisgKiBCb3JkZXJNYXBwZXIgLSBKSUJYIHhtbCBtYXBwZXIgZm9yIHN3aW5nIHN0YW5kYXJkIGJvcmRlcnMKKyAqCisgKiBAYXV0aG9yIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgQm9yZGVyTWFwcGVyIGltcGxlbWVudHMgSU1hcnNoYWxsZXIsIElVbm1hcnNoYWxsZXIsIElBbGlhc2FibGUgeworICAgIHByaXZhdGUgc3RhdGljIGVudW0gQm9yZGVyVHlwZSB7CisgICAgICAgIGVtcHR5LCBsaW5lLCBldGNoZWQsIGJldmVsLCBtYXR0ZSwgY29tcG91bmQsIHBhaW50ZXIKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZW51bSBTdWJUeXBlIHsKKyAgICAgICAgcmFpc2VkKEV0Y2hlZEJvcmRlci5SQUlTRUQpLCBsb3dlcmVkKEV0Y2hlZEJvcmRlci5MT1dFUkVEKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc3VidHlwZTsKKworICAgICAgICBTdWJUeXBlKGludCB0eXBlKSB7CisgICAgICAgICAgICB0aGlzLnN1YnR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRTdWJUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTkFNRSA9ICJib3JkZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAidHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAic3VidHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUF9OQU1FID0gInRvcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPVFRPTV9OQU1FID0gImJvdHRvbSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfTkFNRSA9ICJsZWZ0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUklHSFRfTkFNRSA9ICJyaWdodCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRISUNLTkVTU19OQU1FID0gInRoaWNrbmVzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0lERV9OQU1FID0gImluc2lkZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFNJREVfTkFNRSA9ICJvdXRzaWRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFJTlRFUl9OQU1FID0gInBhaW50ZXIiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOworICAgIHByaXZhdGUgaW50IGluZGV4OworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgQm9yZGVyTWFwcGVyKCkgeworICAgICAgICB1cmkgPSBudWxsOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIG5hbWUgPSBFTEVNRU5UX05BTUU7CisgICAgfQorCisgICAgcHVibGljIEJvcmRlck1hcHBlcihTdHJpbmcgdXJpLCBpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMudXJpID0gdXJpOworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb24oaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudChJVW5tYXJzaGFsbGluZ0NvbnRleHQgaVVubWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MKKyAgICAgICAgICAgIEppQlhFeGNlcHRpb24geworICAgICAgICByZXR1cm4gaVVubWFyc2hhbGxpbmdDb250ZXh0LmlzQXQodXJpLCBFTEVNRU5UX05BTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iamVjdCwgSU1hcnNoYWxsaW5nQ29udGV4dCBpTWFyc2hhbGxpbmdDb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIEppQlhFeGNlcHRpb24geworICAgICAgICBpZiAoIShpTWFyc2hhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgTWFyc2hhbGxpbmdDb250ZXh0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEppQlhFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IHR5cGUgZm9yIG1hcnNoYWxsZXIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1hcnNoYWxsaW5nQ29udGV4dCBjdHggPSAoTWFyc2hhbGxpbmdDb250ZXh0KSBpTWFyc2hhbGxpbmdDb250ZXh0OworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhaW50ZXJCb3JkZXIpIHsKKyAgICAgICAgICAgICAgICBQYWludGVyQm9yZGVyIGJvcmRlciA9IChQYWludGVyQm9yZGVyKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgSW5zZXRzIGluc2V0cyA9IGJvcmRlci5nZXRCb3JkZXJJbnNldHMoKTsKKyAgICAgICAgICAgICAgICBjdHguc3RhcnRUYWdBdHRyaWJ1dGVzKGluZGV4LCBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHJpYnV0ZShpbmRleCwgVFlQRV9OQU1FLCBCb3JkZXJUeXBlLnBhaW50ZXIudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUoaW5kZXgsIFBBSU5URVJfTkFNRSwgYm9yZGVyLmdldFBhaW50ZXJOYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlKGluZGV4LCBUT1BfTkFNRSwgaW5zZXRzLnRvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUoaW5kZXgsIEJPVFRPTV9OQU1FLCBpbnNldHMuYm90dG9tKQorICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHJpYnV0ZShpbmRleCwgTEVGVF9OQU1FLCBpbnNldHMubGVmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUoaW5kZXgsIFJJR0hUX05BTUUsIGluc2V0cy5yaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZVN0YXJ0Q29udGVudCgpOworICAgICAgICAgICAgICAgIGN0eC5lbmRUYWcoaW5kZXgsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbXB0eUJvcmRlcikgeworICAgICAgICAgICAgICAgIEluc2V0cyBpbnNldHMgPSAoKEVtcHR5Qm9yZGVyKSBvYmplY3QpLmdldEJvcmRlckluc2V0cygpOworICAgICAgICAgICAgICAgIGN0eC5zdGFydFRhZ0F0dHJpYnV0ZXMoaW5kZXgsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlKGluZGV4LCBUWVBFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvcmRlclR5cGUuZW1wdHkudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUoaW5kZXgsIFRPUF9OQU1FLCBpbnNldHMudG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHJpYnV0ZShpbmRleCwgQk9UVE9NX05BTUUsIGluc2V0cy5ib3R0b20pCisgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlKGluZGV4LCBMRUZUX05BTUUsIGluc2V0cy5sZWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHJpYnV0ZShpbmRleCwgUklHSFRfTkFNRSwgaW5zZXRzLnJpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlU3RhcnRFbXB0eSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaW5lQm9yZGVyKSB7CisgICAgICAgICAgICAgICAgTGluZUJvcmRlciBib3JkZXIgPSAoTGluZUJvcmRlcikgb2JqZWN0OworICAgICAgICAgICAgICAgIGN0eC5zdGFydFRhZ0F0dHJpYnV0ZXMoaW5kZXgsIG5hbWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKGluZGV4LCBUWVBFX05BTUUsIEJvcmRlclR5cGUubGluZS50b1N0cmluZygpKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZShpbmRleCwgVEhJQ0tORVNTX05BTUUsIGJvcmRlci5nZXRUaGlja25lc3MoKSkuCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZVN0YXJ0Q29udGVudCgpOworICAgICAgICAgICAgICAgIG5ldyBDb2xvck1hcHBlcigpLm1hcnNoYWwoYm9yZGVyLmdldExpbmVDb2xvcigpLCBjdHgpOworICAgICAgICAgICAgICAgIGN0eC5lbmRUYWcoaW5kZXgsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFdGNoZWRCb3JkZXIpIHsKKyAgICAgICAgICAgICAgICBFdGNoZWRCb3JkZXIgYm9yZGVyID0gKEV0Y2hlZEJvcmRlcikgb2JqZWN0OworICAgICAgICAgICAgICAgIGN0eC5zdGFydFRhZ0F0dHJpYnV0ZXMoaW5kZXgsIG5hbWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKGluZGV4LCBUWVBFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvcmRlclR5cGUuZXRjaGVkLnRvU3RyaW5nKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKGluZGV4LCBTVUJfVFlQRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIuZ2V0RXRjaFR5cGUoKT09RXRjaGVkQm9yZGVyLlJBSVNFRD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJUeXBlLnJhaXNlZC50b1N0cmluZygpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YlR5cGUubG93ZXJlZC50b1N0cmluZygpKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlU3RhcnRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgbmV3IENvbG9yTWFwcGVyKCkubWFyc2hhbChib3JkZXIuZ2V0SGlnaGxpZ2h0Q29sb3IoKSwgY3R4KTsKKyAgICAgICAgICAgICAgICBuZXcgQ29sb3JNYXBwZXIoKS5tYXJzaGFsKGJvcmRlci5nZXRTaGFkb3dDb2xvcigpLCBjdHgpOworICAgICAgICAgICAgICAgIGN0eC5lbmRUYWcoaW5kZXgsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCZXZlbEJvcmRlcikgeworICAgICAgICAgICAgICAgIEJldmVsQm9yZGVyIGJvcmRlciA9IChCZXZlbEJvcmRlcikgb2JqZWN0OworICAgICAgICAgICAgICAgIGN0eC5zdGFydFRhZ0F0dHJpYnV0ZXMoaW5kZXgsIG5hbWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKGluZGV4LCBUWVBFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvcmRlclR5cGUuYmV2ZWwudG9TdHJpbmcoKSkuCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUoaW5kZXgsIFNVQl9UWVBFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci5nZXRCZXZlbFR5cGUoKT09QmV2ZWxCb3JkZXIuUkFJU0VEPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YlR5cGUucmFpc2VkLnRvU3RyaW5nKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViVHlwZS5sb3dlcmVkLnRvU3RyaW5nKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VTdGFydENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBuZXcgQ29sb3JNYXBwZXIoKS5tYXJzaGFsKGJvcmRlci5nZXRIaWdobGlnaHRJbm5lckNvbG9yKCksIGN0eCk7CisgICAgICAgICAgICAgICAgbmV3IENvbG9yTWFwcGVyKCkubWFyc2hhbChib3JkZXIuZ2V0SGlnaGxpZ2h0T3V0ZXJDb2xvcigpLCBjdHgpOworICAgICAgICAgICAgICAgIG5ldyBDb2xvck1hcHBlcigpLm1hcnNoYWwoYm9yZGVyLmdldFNoYWRvd0lubmVyQ29sb3IoKSwgY3R4KTsKKyAgICAgICAgICAgICAgICBuZXcgQ29sb3JNYXBwZXIoKS5tYXJzaGFsKGJvcmRlci5nZXRIaWdobGlnaHRPdXRlckNvbG9yKCksIGN0eCk7CisgICAgICAgICAgICAgICAgY3R4LmVuZFRhZyhpbmRleCwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hdHRlQm9yZGVyKSB7CisgICAgICAgICAgICAgICAgTWF0dGVCb3JkZXIgYm9yZGVyID0gKE1hdHRlQm9yZGVyKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgSW5zZXRzIGluc2V0cyA9ICgoRW1wdHlCb3JkZXIpIG9iamVjdCkuZ2V0Qm9yZGVySW5zZXRzKCk7CisgICAgICAgICAgICAgICAgY3R4LnN0YXJ0VGFnQXR0cmlidXRlcyhpbmRleCwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUoaW5kZXgsIFRZUEVfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9yZGVyVHlwZS5tYXR0ZS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHJpYnV0ZShpbmRleCwgVE9QX05BTUUsIGluc2V0cy50b3ApCisgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlKGluZGV4LCBCT1RUT01fTkFNRSwgaW5zZXRzLmJvdHRvbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUoaW5kZXgsIExFRlRfTkFNRSwgaW5zZXRzLmxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlKGluZGV4LCBSSUdIVF9OQU1FLCBpbnNldHMucmlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VTdGFydENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBuZXcgQ29sb3JNYXBwZXIoKS5tYXJzaGFsKGJvcmRlci5nZXRNYXR0ZUNvbG9yKCksIGN0eCk7CisgICAgICAgICAgICAgICAgLy8gdG9kbzogd2Ugc2hvdWxkIHN1cHBvcnQgdGlsZWQgaWNvbnMgaGVyZSB0byBiZSAxMDAlIGNvbXBsZXRlCisgICAgICAgICAgICAgICAgY3R4LmVuZFRhZyhpbmRleCwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbXBvdW5kQm9yZGVyKSB7CisgICAgICAgICAgICAgICAgQ29tcG91bmRCb3JkZXIgYm9yZGVyID0gKENvbXBvdW5kQm9yZGVyKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgY3R4LnN0YXJ0VGFnQXR0cmlidXRlcyhpbmRleCwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGUoaW5kZXgsIFRZUEVfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9yZGVyVHlwZS5jb21wb3VuZC50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlU3RhcnRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgbmV3IEJvcmRlck1hcHBlcihudWxsLDAsIElOU0lERV9OQU1FKS5tYXJzaGFsKGJvcmRlci5nZXRJbnNpZGVCb3JkZXIoKSxjdHgpOworICAgICAgICAgICAgICAgIG5ldyBCb3JkZXJNYXBwZXIobnVsbCwwLCBPVVRTSURFX05BTUUpLm1hcnNoYWwoYm9yZGVyLmdldE91dHNpZGVCb3JkZXIoKSxjdHgpOworICAgICAgICAgICAgICAgIGN0eC5lbmRUYWcoaW5kZXgsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmlCWEV4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgdHlwZSBmb3IgbWFyc2hhbGxlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5tYXJzaGFsbGluZ0NvbnRleHQgaVVubWFyc2hhbGxpbmdDb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIEppQlhFeGNlcHRpb24geworICAgICAgICBCb3JkZXIgYm9yZGVyID0gbnVsbDsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlJ3JlIGF0IHRoZSBhcHByb3ByaWF0ZSBzdGFydCB0YWcKKyAgICAgICAgVW5tYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gKFVubWFyc2hhbGxpbmdDb250ZXh0KSBpVW5tYXJzaGFsbGluZ0NvbnRleHQ7CisgICAgICAgIGlmICghY3R4LmlzQXQodXJpLCBuYW1lKSkgeworICAgICAgICAgICAgY3R4LnRocm93U3RhcnRUYWdOYW1lRXJyb3IodXJpLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAvLyBnZXQgdHlwZQorICAgICAgICBCb3JkZXJUeXBlIHR5cGUgPSBCb3JkZXJUeXBlLnZhbHVlT2YoY3R4LmF0dHJpYnV0ZVRleHQodXJpLCBUWVBFX05BTUUpCisgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCkpOworICAgICAgICBpbnQgdG9wLGJvdHRvbSxsZWZ0LHJpZ2h0OworICAgICAgICBDb2xvciBjb2xvcjsKKyAgICAgICAgc3dpdGNoKHR5cGUpeworICAgICAgICAgICAgY2FzZSBlbXB0eToKKyAgICAgICAgICAgICAgICB0b3AgPSBjdHguYXR0cmlidXRlSW50KHVyaSwgVE9QX05BTUUsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBib3R0b20gPSBjdHguYXR0cmlidXRlSW50KHVyaSwgQk9UVE9NX05BTUUsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gY3R4LmF0dHJpYnV0ZUludCh1cmksIExFRlRfTkFNRSwgaW5kZXgpOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gY3R4LmF0dHJpYnV0ZUludCh1cmksIFJJR0hUX05BTUUsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBib3JkZXIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKHRvcCxsZWZ0LGJvdHRvbSxyaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGxpbmU6CisgICAgICAgICAgICAgICAgaW50IHRoaWNrbmVzcyA9IGN0eC5hdHRyaWJ1dGVJbnQodXJpLCBUSElDS05FU1NfTkFNRSwgaW5kZXgpOworICAgICAgICAgICAgICAgIGN0eC5wYXJzZVBhc3RTdGFydFRhZyh1cmksbmFtZSk7CisgICAgICAgICAgICAgICAgY29sb3IgPSAoQ29sb3IpbmV3IENvbG9yTWFwcGVyKCkudW5tYXJzaGFsKG51bGwsY3R4KTsKKyAgICAgICAgICAgICAgICBib3JkZXIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoY29sb3IsdGhpY2tuZXNzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZXRjaGVkOgorICAgICAgICAgICAgICAgIFN1YlR5cGUgZXRjaGVkVHlwZSA9IFN1YlR5cGUudmFsdWVPZigKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hdHRyaWJ1dGVUZXh0KHVyaSwgU1VCX1RZUEVfTkFNRSkudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICAgICAgY3R4LnBhcnNlUGFzdFN0YXJ0VGFnKHVyaSxuYW1lKTsKKyAgICAgICAgICAgICAgICBDb2xvciBoaWdoQ29sb3IgPSAoQ29sb3IpbmV3IENvbG9yTWFwcGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bm1hcnNoYWwobnVsbCxjdHgpOworICAgICAgICAgICAgICAgIENvbG9yIHNoYWRvd0NvbG9yID0gKENvbG9yKW5ldyBDb2xvck1hcHBlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAudW5tYXJzaGFsKG51bGwsY3R4KTsKKyAgICAgICAgICAgICAgICBib3JkZXIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0Y2hlZFR5cGUuZ2V0U3ViVHlwZSgpLGhpZ2hDb2xvcixzaGFkb3dDb2xvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGJldmVsOgorICAgICAgICAgICAgICAgIFN1YlR5cGUgYmV2ZWxUeXBlID0gU3ViVHlwZS52YWx1ZU9mKAorICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmF0dHJpYnV0ZVRleHQodXJpLCBTVUJfVFlQRV9OQU1FKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgICAgICAgICBjdHgucGFyc2VQYXN0U3RhcnRUYWcodXJpLG5hbWUpOworICAgICAgICAgICAgICAgIENvbG9yIGlubmVySGlnaENvbG9yID0gKENvbG9yKW5ldyBDb2xvck1hcHBlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAudW5tYXJzaGFsKG51bGwsY3R4KTsKKyAgICAgICAgICAgICAgICBDb2xvciBvdXRlckhpZ2hDb2xvciA9IChDb2xvciluZXcgQ29sb3JNYXBwZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnVubWFyc2hhbChudWxsLGN0eCk7CisgICAgICAgICAgICAgICAgQ29sb3IgaW5uZXJTaGFkb3dDb2xvciA9IChDb2xvciluZXcgQ29sb3JNYXBwZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnVubWFyc2hhbChudWxsLGN0eCk7CisgICAgICAgICAgICAgICAgQ29sb3Igb3V0ZXJTaGFkb3dDb2xvciA9IChDb2xvciluZXcgQ29sb3JNYXBwZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnVubWFyc2hhbChudWxsLGN0eCk7CisgICAgICAgICAgICAgICAgYm9yZGVyID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJldmVsVHlwZS5nZXRTdWJUeXBlKCksb3V0ZXJIaWdoQ29sb3IsaW5uZXJIaWdoQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRlclNoYWRvd0NvbG9yLGlubmVyU2hhZG93Q29sb3IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBtYXR0ZToKKyAgICAgICAgICAgICAgICB0b3AgPSBjdHguYXR0cmlidXRlSW50KHVyaSwgVE9QX05BTUUsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBib3R0b20gPSBjdHguYXR0cmlidXRlSW50KHVyaSwgQk9UVE9NX05BTUUsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gY3R4LmF0dHJpYnV0ZUludCh1cmksIExFRlRfTkFNRSwgaW5kZXgpOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gY3R4LmF0dHJpYnV0ZUludCh1cmksIFJJR0hUX05BTUUsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBjdHgucGFyc2VQYXN0U3RhcnRUYWcodXJpLG5hbWUpOworICAgICAgICAgICAgICAgIGNvbG9yID0gKENvbG9yKW5ldyBDb2xvck1hcHBlcigpLnVubWFyc2hhbChudWxsLGN0eCk7CisgICAgICAgICAgICAgICAgYm9yZGVyID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVNYXR0ZUJvcmRlcih0b3AsbGVmdCxib3R0b20scmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNvbXBvdW5kOgorICAgICAgICAgICAgICAgIGN0eC5wYXJzZVBhc3RTdGFydFRhZyh1cmksbmFtZSk7CisgICAgICAgICAgICAgICAgQm9yZGVyIGluc2lkZSA9IChCb3JkZXIpIG5ldyBCb3JkZXJNYXBwZXIobnVsbCwwLCBJTlNJREVfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bm1hcnNoYWwobnVsbCxjdHgpOworICAgICAgICAgICAgICAgIEJvcmRlciBvdXRzaWRlID0gKEJvcmRlcikgbmV3IEJvcmRlck1hcHBlcihudWxsLDAsIE9VVFNJREVfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bm1hcnNoYWwobnVsbCxjdHgpOworICAgICAgICAgICAgICAgIGJvcmRlciA9IEJvcmRlckZhY3RvcnkuY3JlYXRlQ29tcG91bmRCb3JkZXIob3V0c2lkZSwgaW5zaWRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgcGFpbnRlcjoKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFpbnRlck5hbWUgPSBjdHguYXR0cmlidXRlVGV4dCh1cmksIFBBSU5URVJfTkFNRSk7CisgICAgICAgICAgICAgICAgdG9wID0gY3R4LmF0dHJpYnV0ZUludCh1cmksIFRPUF9OQU1FLCBpbmRleCk7CisgICAgICAgICAgICAgICAgYm90dG9tID0gY3R4LmF0dHJpYnV0ZUludCh1cmksIEJPVFRPTV9OQU1FLCBpbmRleCk7CisgICAgICAgICAgICAgICAgbGVmdCA9IGN0eC5hdHRyaWJ1dGVJbnQodXJpLCBMRUZUX05BTUUsIGluZGV4KTsKKyAgICAgICAgICAgICAgICByaWdodCA9IGN0eC5hdHRyaWJ1dGVJbnQodXJpLCBSSUdIVF9OQU1FLCBpbmRleCk7CisgICAgICAgICAgICAgICAgYm9yZGVyID0gbmV3IFBhaW50ZXJCb3JkZXIocGFpbnRlck5hbWUsIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgY3R4LnBhcnNlUGFzdEVuZFRhZyh1cmksIG5hbWUpOworICAgICAgICByZXR1cm4gYm9yZGVyOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9qaWJ4aGVscGVycy9DbGFzc0NvbnZlcnRlci5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9qaWJ4aGVscGVycy9DbGFzc0NvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNTlkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL2ppYnhoZWxwZXJzL0NsYXNzQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLmppYnhoZWxwZXJzOworCisvKioKKyAqIENsYXNzQ29udmVydGVyCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVsIDE2LCAyMDA3KQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NDb252ZXJ0ZXIgeworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NUb1N0cmluZyhDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBjID09IG51bGwgPyAiIiA6IGMuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3Mgc3RyaW5nVG9DbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciA9PSBudWxsKSBjbGFzc0xvYWRlciA9IENsYXNzQ29udmVydGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gZmluZCBjbGFzcyB3aXRoIG5hbWUgWyIgKyBjbGFzc05hbWUgKyAiXSBpbiBDbGFzc0NvbnZlcnRlciIpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL2ppYnhoZWxwZXJzL0NsYXNzTWFwcGVyLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL2ppYnhoZWxwZXJzL0NsYXNzTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzZDc2NQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvamlieGhlbHBlcnMvQ2xhc3NNYXBwZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuamlieGhlbHBlcnM7CisKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGVyOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSU1hcnNoYWxsaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklVbm1hcnNoYWxsZXI7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JVW5tYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5KaUJYRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5NYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5pbXBsLlVubWFyc2hhbGxpbmdDb250ZXh0OworCisKK3B1YmxpYyBjbGFzcyBDbGFzc01hcHBlciBpbXBsZW1lbnRzIElNYXJzaGFsbGVyLCBJVW5tYXJzaGFsbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OQU1FID0gInR5cGUiOworCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb24oaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudChJVW5tYXJzaGFsbGluZ0NvbnRleHQgaVVubWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpVW5tYXJzaGFsbGluZ0NvbnRleHQuaXNBdChudWxsLCBFTEVNRU5UX05BTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iamVjdCwgSU1hcnNoYWxsaW5nQ29udGV4dCBpTWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEppQlhFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IHR5cGUgZm9yIG1hcnNoYWxsZXIiKTsKKyAgICAgICAgfSBlbHNlIGlmICghKGlNYXJzaGFsbGluZ0NvbnRleHQgaW5zdGFuY2VvZiBNYXJzaGFsbGluZ0NvbnRleHQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmlCWEV4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgdHlwZSBmb3IgbWFyc2hhbGxlciIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWFyc2hhbGxpbmdDb250ZXh0IGN0eCA9IChNYXJzaGFsbGluZ0NvbnRleHQpIGlNYXJzaGFsbGluZ0NvbnRleHQ7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcykgb2JqZWN0OworICAgICAgICAgICAgY3R4LnN0YXJ0VGFnQXR0cmlidXRlcygwLCBFTEVNRU5UX05BTUUpLgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUoMCwgInZhbHVlIiwgY2xhenouZ2V0TmFtZSgpKS4KKyAgICAgICAgICAgICAgICAgICAgY2xvc2VTdGFydEVtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChPYmplY3Qgb2JqZWN0LCBJVW5tYXJzaGFsbGluZ0NvbnRleHQgaVVubWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSBhdCB0aGUgYXBwcm9wcmlhdGUgc3RhcnQgdGFnCisgICAgICAgIFVubWFyc2hhbGxpbmdDb250ZXh0IGN0eCA9IChVbm1hcnNoYWxsaW5nQ29udGV4dCkgaVVubWFyc2hhbGxpbmdDb250ZXh0OworICAgICAgICBpZiAoIWN0eC5pc0F0KG51bGwsIEVMRU1FTlRfTkFNRSkpIHsKKyAgICAgICAgICAgIGN0eC50aHJvd1N0YXJ0VGFnTmFtZUVycm9yKG51bGwsIEVMRU1FTlRfTkFNRSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZ2V0IHZhbHVlcworICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdHguYXR0cmlidXRlVGV4dChudWxsLCAidmFsdWUiLCBudWxsKTsKKyAgICAgICAgY3R4LnBhcnNlUGFzdEVuZFRhZyhudWxsLCBFTEVNRU5UX05BTUUpOworICAgICAgICAvLyBjcmVhdGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9qaWJ4aGVscGVycy9Gb250TWFwcGVyLmphdmEgYi9qZGsvbWFrZS90b29scy9zd2luZy1uaW1idXMvY2xhc3Nlcy9vcmcvamRlc2t0b3Avc3ludGhkZXNpZ25lci9zeW50aG1vZGVsL2ppYnhoZWxwZXJzL0ZvbnRNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODE1YzBjCi0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9qaWJ4aGVscGVycy9Gb250TWFwcGVyLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLmppYnhoZWxwZXJzOworCitpbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxlcjsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JVW5tYXJzaGFsbGVyOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSmlCWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLmltcGwuTWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5Vbm1hcnNoYWxsaW5nQ29udGV4dDsKKworaW1wb3J0IGphdmEuYXd0LkZvbnQ7CisKKy8qKgorICogRm9udE1hcHBlcgorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biA4LCAyMDA3KQorICovCitwdWJsaWMgY2xhc3MgRm9udE1hcHBlciBpbXBsZW1lbnRzIElNYXJzaGFsbGVyLCBJVW5tYXJzaGFsbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OQU1FID0gImZvbnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfTkFNRSA9ICJmYW1pbHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9OQU1FID0gInN0eWxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0laRV9OQU1FID0gInNpemUiOworCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb24oaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudChJVW5tYXJzaGFsbGluZ0NvbnRleHQgaVVubWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpVW5tYXJzaGFsbGluZ0NvbnRleHQuaXNBdChudWxsLCBFTEVNRU5UX05BTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iamVjdCwgSU1hcnNoYWxsaW5nQ29udGV4dCBpTWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEZvbnQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmlCWEV4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgdHlwZSBmb3IgbWFyc2hhbGxlciIpOworICAgICAgICB9IGVsc2UgaWYgKCEoaU1hcnNoYWxsaW5nQ29udGV4dCBpbnN0YW5jZW9mIE1hcnNoYWxsaW5nQ29udGV4dCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKaUJYRXhjZXB0aW9uKCJJbnZhbGlkIG9iamVjdCB0eXBlIGZvciBtYXJzaGFsbGVyIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gKE1hcnNoYWxsaW5nQ29udGV4dCkgaU1hcnNoYWxsaW5nQ29udGV4dDsKKyAgICAgICAgICAgIEZvbnQgZm9udCA9IChGb250KSBvYmplY3Q7CisgICAgICAgICAgICBjdHguc3RhcnRUYWdBdHRyaWJ1dGVzKDAsIEVMRU1FTlRfTkFNRSkuCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSgwLCBGQU1JTFlfTkFNRSwgZm9udC5nZXRGYW1pbHkoKSkuCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSgwLCBTVFlMRV9OQU1FLCBmb250LmdldFN0eWxlKCkpLgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUoMCwgU0laRV9OQU1FLCBmb250LmdldFNpemUoKSkuCisgICAgICAgICAgICAgICAgICAgIGNsb3NlU3RhcnRFbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoT2JqZWN0IG9iamVjdCwgSVVubWFyc2hhbGxpbmdDb250ZXh0IGlVbm1hcnNoYWxsaW5nQ29udGV4dCkgdGhyb3dzIEppQlhFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgYXQgdGhlIGFwcHJvcHJpYXRlIHN0YXJ0IHRhZworICAgICAgICBVbm1hcnNoYWxsaW5nQ29udGV4dCBjdHggPSAoVW5tYXJzaGFsbGluZ0NvbnRleHQpIGlVbm1hcnNoYWxsaW5nQ29udGV4dDsKKyAgICAgICAgaWYgKCFjdHguaXNBdChudWxsLCBFTEVNRU5UX05BTUUpKSB7CisgICAgICAgICAgICBjdHgudGhyb3dTdGFydFRhZ05hbWVFcnJvcihudWxsLCBFTEVNRU5UX05BTUUpOworICAgICAgICB9CisgICAgICAgIC8vIGdldCB2YWx1ZXMKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjdHguYXR0cmlidXRlVGV4dChudWxsLCBGQU1JTFlfTkFNRSwgbnVsbCk7CisgICAgICAgIGludCBzdHlsZSA9IGN0eC5hdHRyaWJ1dGVJbnQobnVsbCwgU1RZTEVfTkFNRSwgMCk7CisgICAgICAgIGludCBzaXplID0gY3R4LmF0dHJpYnV0ZUludChudWxsLCBTSVpFX05BTUUsIDApOworICAgICAgICBjdHgucGFyc2VQYXN0RW5kVGFnKG51bGwsIEVMRU1FTlRfTkFNRSk7CisgICAgICAgIC8vIGNyZWF0ZQorICAgICAgICByZXR1cm4gbmV3IEZvbnQobmFtZSwgc3R5bGUsIHNpemUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvamlieGhlbHBlcnMvVUlQcm9wZXJ0eU1hcHBlci5qYXZhIGIvamRrL21ha2UvdG9vbHMvc3dpbmctbmltYnVzL2NsYXNzZXMvb3JnL2pkZXNrdG9wL3N5bnRoZGVzaWduZXIvc3ludGhtb2RlbC9qaWJ4aGVscGVycy9VSVByb3BlcnR5TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyYWI2YgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9tYWtlL3Rvb2xzL3N3aW5nLW5pbWJ1cy9jbGFzc2VzL29yZy9qZGVza3RvcC9zeW50aGRlc2lnbmVyL3N5bnRobW9kZWwvamlieGhlbHBlcnMvVUlQcm9wZXJ0eU1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIG9yZy5qZGVza3RvcC5zeW50aGRlc2lnbmVyLnN5bnRobW9kZWwuamlieGhlbHBlcnM7CisKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzLkRpbWVuc2lvbk1hcHBlcjsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3dpbmd4LmRlc2lnbmVyLmppYnhoZWxwZXJzLkluc2V0c01hcHBlcjsKK2ltcG9ydCBvcmcuamRlc2t0b3Auc3ludGhkZXNpZ25lci5zeW50aG1vZGVsLlVJUHJvcGVydHk7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxhYmxlOworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSU1hcnNoYWxsZXI7CitpbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxpbmdDb250ZXh0OworaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVVubWFyc2hhbGxlcjsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLklVbm1hcnNoYWxsaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLkppQlhFeGNlcHRpb247CitpbXBvcnQgb3JnLmppYngucnVudGltZS5pbXBsLk1hcnNoYWxsaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuamlieC5ydW50aW1lLmltcGwuVW5tYXJzaGFsbGluZ0NvbnRleHQ7CisKKy8qKgorICogVUlQcm9wZXJ0eU1hcHBlcgorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1bCAxMCwgMjAwNykKKyAqLworcHVibGljIGNsYXNzIFVJUHJvcGVydHlNYXBwZXIgaW1wbGVtZW50cyBJTWFyc2hhbGxlciwgSVVubWFyc2hhbGxlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTkFNRSA9ICJ1aVByb3BlcnR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9OQU1FID0gIm5hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAidHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX05BTUUgPSAidmFsdWUiOworCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb24oaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudChJVW5tYXJzaGFsbGluZ0NvbnRleHQgaVVubWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpVW5tYXJzaGFsbGluZ0NvbnRleHQuaXNBdChudWxsLCBFTEVNRU5UX05BTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iamVjdCwgSU1hcnNoYWxsaW5nQ29udGV4dCBpTWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJUHJvcGVydHkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmlCWEV4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgdHlwZSBmb3IgbWFyc2hhbGxlciIpOworICAgICAgICB9IGVsc2UgaWYgKCEoaU1hcnNoYWxsaW5nQ29udGV4dCBpbnN0YW5jZW9mIE1hcnNoYWxsaW5nQ29udGV4dCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKaUJYRXhjZXB0aW9uKCJJbnZhbGlkIG9iamVjdCB0eXBlIGZvciBtYXJzaGFsbGVyIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gKE1hcnNoYWxsaW5nQ29udGV4dCkgaU1hcnNoYWxsaW5nQ29udGV4dDsKKyAgICAgICAgICAgIFVJUHJvcGVydHkgcHJvcGVydHkgPSAoVUlQcm9wZXJ0eSkgb2JqZWN0OworICAgICAgICAgICAgY3R4LnN0YXJ0VGFnQXR0cmlidXRlcygwLCBFTEVNRU5UX05BTUUpOworICAgICAgICAgICAgY3R4LmF0dHJpYnV0ZSgwLCBOQU1FX05BTUUsIHByb3BlcnR5LmdldE5hbWUoKSk7CisgICAgICAgICAgICBjdHguYXR0cmlidXRlKDAsIFRZUEVfTkFNRSwgcHJvcGVydHkuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJPT0xFQU46CisgICAgICAgICAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgY3R4LmF0dHJpYnV0ZSgwLCBWQUxVRV9OQU1FLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBjdHguY2xvc2VTdGFydEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVRTOgorICAgICAgICAgICAgICAgICAgICBjdHguY2xvc2VTdGFydENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEluc2V0c01hcHBlcigpLm1hcnNoYWwocHJvcGVydHkuZ2V0VmFsdWUoKSwgY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgY3R4LmVuZFRhZygwLCBFTEVNRU5UX05BTUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTE9SOgorICAgICAgICAgICAgICAgIGNhc2UgRk9OVDoKKyAgICAgICAgICAgICAgICAgICAgY3R4LmNsb3NlU3RhcnRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSU1hcnNoYWxsYWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJTWFyc2hhbGxhYmxlKSBwcm9wZXJ0eS5nZXRWYWx1ZSgpKS5tYXJzaGFsKGN0eCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmlCWEV4Y2VwdGlvbigiTWFwcGVkIHZhbHVlIGlzIG5vdCBtYXJzaGFsbGFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjdHguZW5kVGFnKDAsIEVMRU1FTlRfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElNRU5TSU9OOgorICAgICAgICAgICAgICAgICAgICBjdHguY2xvc2VTdGFydENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IERpbWVuc2lvbk1hcHBlcigpLm1hcnNoYWwocHJvcGVydHkuZ2V0VmFsdWUoKSwgY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgY3R4LmVuZFRhZygwLCBFTEVNRU5UX05BTUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJPUkRFUjoKKyAgICAgICAgICAgICAgICAgICAgY3R4LmNsb3NlU3RhcnRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBCb3JkZXJNYXBwZXIoKS5tYXJzaGFsKHByb3BlcnR5LmdldFZhbHVlKCksIGN0eCk7CisgICAgICAgICAgICAgICAgICAgIGN0eC5lbmRUYWcoMCwgRUxFTUVOVF9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChPYmplY3Qgb2JqZWN0LCBJVW5tYXJzaGFsbGluZ0NvbnRleHQgaVVubWFyc2hhbGxpbmdDb250ZXh0KSB0aHJvd3MgSmlCWEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSBhdCB0aGUgYXBwcm9wcmlhdGUgc3RhcnQgdGFnCisgICAgICAgIFVubWFyc2hhbGxpbmdDb250ZXh0IGN0eCA9IChVbm1hcnNoYWxsaW5nQ29udGV4dCkgaVVubWFyc2hhbGxpbmdDb250ZXh0OworICAgICAgICBpZiAoIWN0eC5pc0F0KG51bGwsIEVMRU1FTlRfTkFNRSkpIHsKKyAgICAgICAgICAgIGN0eC50aHJvd1N0YXJ0VGFnTmFtZUVycm9yKG51bGwsIEVMRU1FTlRfTkFNRSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZ2V0IHZhbHVlcworICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOworICAgICAgICBTdHJpbmcgbmFtZSA9IGN0eC5hdHRyaWJ1dGVUZXh0KG51bGwsIE5BTUVfTkFNRSwgbnVsbCk7CisgICAgICAgIFVJUHJvcGVydHkuUHJvcGVydHlUeXBlIHR5cGUgPSBVSVByb3BlcnR5LlByb3BlcnR5VHlwZS52YWx1ZU9mKGN0eC5hdHRyaWJ1dGVUZXh0KG51bGwsIFRZUEVfTkFNRSwgbnVsbCkpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGN0eC5hdHRyaWJ1dGVUZXh0KG51bGwsIFZBTFVFX05BTUUsIG51bGwpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICAgIHZhbHVlID0gRG91YmxlLnBhcnNlRG91YmxlKGN0eC5hdHRyaWJ1dGVUZXh0KG51bGwsIFZBTFVFX05BTUUsIG51bGwpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgICAgIHZhbHVlID0gSW50ZWdlci5wYXJzZUludChjdHguYXR0cmlidXRlVGV4dChudWxsLCBWQUxVRV9OQU1FLCBudWxsKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgICAgIHZhbHVlID0gRmxvYXQucGFyc2VGbG9hdChjdHguYXR0cmlidXRlVGV4dChudWxsLCBWQUxVRV9OQU1FLCBudWxsKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUUklORzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGN0eC5hdHRyaWJ1dGVUZXh0KG51bGwsIFZBTFVFX05BTUUsIG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTlNFVFM6CisgICAgICAgICAgICAgICAgY3R4LnBhcnNlUGFzdFN0YXJ0VGFnKG51bGwsIEVMRU1FTlRfTkFNRSk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgSW5zZXRzTWFwcGVyKCkudW5tYXJzaGFsKHZhbHVlLCBjdHgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT0xPUjoKKyAgICAgICAgICAgIGNhc2UgRk9OVDoKKyAgICAgICAgICAgICAgICBjdHgucGFyc2VQYXN0U3RhcnRUYWcobnVsbCwgRUxFTUVOVF9OQU1FKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGN0eC51bm1hcnNoYWxFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJTUVOU0lPTjoKKyAgICAgICAgICAgICAgICBjdHgucGFyc2VQYXN0U3RhcnRUYWcobnVsbCwgRUxFTUVOVF9OQU1FKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEaW1lbnNpb25NYXBwZXIoKS51bm1hcnNoYWwodmFsdWUsIGN0eCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJPUkRFUjoKKyAgICAgICAgICAgICAgICBjdHgucGFyc2VQYXN0U3RhcnRUYWcobnVsbCwgRUxFTUVOVF9OQU1FKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBCb3JkZXJNYXBwZXIoKS51bm1hcnNoYWwodmFsdWUsIGN0eCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY3R4LnBhcnNlUGFzdEVuZFRhZyhudWxsLCBFTEVNRU5UX05BTUUpOworICAgICAgICAvLyBjcmVhdGUKKyAgICAgICAgcmV0dXJuIG5ldyBVSVByb3BlcnR5KG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2Jpbi9lbWVzc2FnZXMuaCBiL2pkay9zcmMvc2hhcmUvYmluL2VtZXNzYWdlcy5oCmluZGV4IDMxMWE4ZmEuLmRmYjk1YTYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvYmluL2VtZXNzYWdlcy5oCisrKyBiL2pkay9zcmMvc2hhcmUvYmluL2VtZXNzYWdlcy5oCkBAIC01MCw2ICs1MCwxMiBAQAogI2RlZmluZSBKQVJfRVJST1IyICAgICAgIkVycm9yOiBVbmFibGUgdG8gYWNjZXNzIGphcmZpbGUgJXMiCiAjZGVmaW5lIEpBUl9FUlJPUjMgICAgICAiRXJyb3I6IEludmFsaWQgb3IgY29ycnVwdCBqYXJmaWxlICVzIgogCisjZGVmaW5lIENMU19FUlJPUjEgICAgICAiRXJyb3I6IENvdWxkIG5vdCBmaW5kIHRoZSBtYWluIGNsYXNzICVzLlxuIiBKTklfRVJST1IKKyNkZWZpbmUgQ0xTX0VSUk9SMiAgICAgICJFcnJvcjogRmFpbGVkIHRvIGxvYWQgTWFpbiBDbGFzczogJXNcbiVzIgorI2RlZmluZSBDTFNfRVJST1IzICAgICAgIkVycm9yOiBObyBtYWluIG1ldGhvZCBmb3VuZCBpbiBzcGVjaWZpZWQgY2xhc3MuXG4iIEdFTl9FUlJPUgorI2RlZmluZSBDTFNfRVJST1I0ICAgICAgIkVycm9yOiBNYWluIG1ldGhvZCBub3QgcHVibGljXG4iIEdFTl9FUlJPUgorI2RlZmluZSBDTFNfRVJST1I1ICAgICAgIkVycm9yOiBtYWluLWNsYXNzOiBhdHRyaWJ1dGUgZXhjZWVkcyBzeXN0ZW0gbGltaXRzIG9mICVkIGJ5dGVzXG4iIEdFTl9FUlJPUgorCiAjZGVmaW5lIENGR19XQVJOMSAgICAgICAiV2FybmluZzogJXMgVk0gbm90IHN1cHBvcnRlZDsgJXMgVk0gd2lsbCBiZSB1c2VkIgogI2RlZmluZSBDRkdfV0FSTjIgICAgICAgIldhcm5pbmc6IE5vIGxlYWRpbmcgLSBvbiBsaW5lICVkIG9mIGAlcyciCiAjZGVmaW5lIENGR19XQVJOMyAgICAgICAiV2FybmluZzogTWlzc2luZyBWTSB0eXBlIG9uIGxpbmUgJWQgb2YgYCVzJyIKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvYmluL2phdmEuYyBiL2pkay9zcmMvc2hhcmUvYmluL2phdmEuYwppbmRleCAwZmVhZmMxLi4xODAxNjMzIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2Jpbi9qYXZhLmMKKysrIGIvamRrL3NyYy9zaGFyZS9iaW4vamF2YS5jCkBAIC05MTUsOCArOTE1LDE0IEBACiAgICAgICogdG8gYXZvaWQgbG9jYXRpbmcsIGV4cGFuZGluZyBhbmQgcGFyc2luZyB0aGUgbWFuaWZlc3QgZXh0cmEKICAgICAgKiB0aW1lcy4KICAgICAgKi8KLSAgICBpZiAoaW5mby5tYWluX2NsYXNzICE9IE5VTEwpCi0gICAgICAgICh2b2lkKUpMSV9TdHJDYXQoZW52X2VudHJ5LCBpbmZvLm1haW5fY2xhc3MpOworICAgIGlmIChpbmZvLm1haW5fY2xhc3MgIT0gTlVMTCkgeworICAgICAgICBpZiAoSkxJX1N0ckxlbihpbmZvLm1haW5fY2xhc3MpIDw9IE1BWE5BTUVMRU4pIHsKKyAgICAgICAgICAgICh2b2lkKUpMSV9TdHJDYXQoZW52X2VudHJ5LCBpbmZvLm1haW5fY2xhc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSkxJX1JlcG9ydEVycm9yTWVzc2FnZShDTFNfRVJST1I1LCBNQVhOQU1FTEVOKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CiAgICAgKHZvaWQpcHV0ZW52KGVudl9lbnRyeSk7CiAgICAgRXhlY0pSRShqcmUsIG5ld19hcmd2KTsKICAgICBKTElfRnJlZU1hbmlmZXN0KCk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3N3aW5nL1BhaW50ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvUGFpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjQ4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3N3aW5nL1BhaW50ZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4uamF2YS5zd2luZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHByZXNlcnZlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIEpESyA2LgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgamF2YXguc3dpbmcuUGFpbnRlcn0gaW5zdGVhZC4KKyAqLworcHVibGljIGludGVyZmFjZSBQYWludGVyPFQ+IGV4dGVuZHMgamF2YXguc3dpbmcuUGFpbnRlciB7Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3N3aW5nL3BsYWYvZ3RrL0dUS0ZpbGVDaG9vc2VyVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvcGxhZi9ndGsvR1RLRmlsZUNob29zZXJVSS5qYXZhCmluZGV4IGFjYjk0NGQuLmZhMmI2OWMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvcGxhZi9ndGsvR1RLRmlsZUNob29zZXJVSS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvcGxhZi9ndGsvR1RLRmlsZUNob29zZXJVSS5qYXZhCkBAIC0xMzQsNiArMTM0LDE1IEBACiAgICAgICAgIHN1cGVyKGZpbGVjaG9vc2VyKTsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgQWN0aW9uTWFwIGNyZWF0ZUFjdGlvbk1hcCgpIHsKKyAgICAgICAgQWN0aW9uTWFwIG1hcCA9IG5ldyBBY3Rpb25NYXBVSVJlc291cmNlKCk7CisgICAgICAgIG1hcC5wdXQoImFwcHJvdmVTZWxlY3Rpb24iLCBnZXRBcHByb3ZlU2VsZWN0aW9uQWN0aW9uKCkpOworICAgICAgICBtYXAucHV0KCJjYW5jZWxTZWxlY3Rpb24iLCBnZXRDYW5jZWxTZWxlY3Rpb25BY3Rpb24oKSk7CisgICAgICAgIG1hcC5wdXQoIkdvIFVwIiwgZ2V0Q2hhbmdlVG9QYXJlbnREaXJlY3RvcnlBY3Rpb24oKSk7CisgICAgICAgIG1hcC5wdXQoImZpbGVOYW1lQ29tcGxldGlvbiIsIGdldEZpbGVOYW1lQ29tcGxldGlvbkFjdGlvbigpKTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewogICAgICAgICBKRmlsZUNob29zZXIgZmMgPSBnZXRGaWxlQ2hvb3NlcigpOwogICAgICAgICBTdHJpbmcgdHlwZWRJbk5hbWUgPSBmaWxlTmFtZVRleHRGaWVsZCAhPSBudWxsID8KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvcGxhZi9uaW1idXMvQWJzdHJhY3RSZWdpb25QYWludGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3N3aW5nL3BsYWYvbmltYnVzL0Fic3RyYWN0UmVnaW9uUGFpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTRkYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vamF2YS9zd2luZy9wbGFmL25pbWJ1cy9BYnN0cmFjdFJlZ2lvblBhaW50ZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGNvbS5zdW4uamF2YS5zd2luZy5wbGFmLm5pbWJ1czsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHByZXNlcnZlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIEpESyA2LgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgamF2YXguc3dpbmcucGxhZi5uaW1idXMuQWJzdHJhY3RSZWdpb25QYWludGVyfSBpbnN0ZWFkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdpb25QYWludGVyIGV4dGVuZHMgamF2YXguc3dpbmcucGxhZi5uaW1idXMuQWJzdHJhY3RSZWdpb25QYWludGVyIHsKK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvcGxhZi9uaW1idXMvTmltYnVzTG9va0FuZEZlZWwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmEvc3dpbmcvcGxhZi9uaW1idXMvTmltYnVzTG9va0FuZEZlZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYzOTczCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vamF2YS9zd2luZy9wbGFmL25pbWJ1cy9OaW1idXNMb29rQW5kRmVlbC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgY29tLnN1bi5qYXZhLnN3aW5nLnBsYWYubmltYnVzOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgcHJlc2VydmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggSkRLIDYuCisgKgorICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBqYXZheC5zd2luZy5wbGFmLm5pbWJ1cy5OaW1idXNMb29rQW5kRmVlbH0gaW5zdGVhZC4KKyAqLworcHVibGljIGNsYXNzIE5pbWJ1c0xvb2tBbmRGZWVsIGV4dGVuZHMgamF2YXguc3dpbmcucGxhZi5uaW1idXMuTmltYnVzTG9va0FuZEZlZWwgeworfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vamF2YS9zd2luZy9wbGFmL3dpbmRvd3MvV2luZG93c0xvb2tBbmRGZWVsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3N3aW5nL3BsYWYvd2luZG93cy9XaW5kb3dzTG9va0FuZEZlZWwuamF2YQppbmRleCA3ODhmZTlmLi5lMjQwNjdlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3N3aW5nL3BsYWYvd2luZG93cy9XaW5kb3dzTG9va0FuZEZlZWwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3N3aW5nL3BsYWYvd2luZG93cy9XaW5kb3dzTG9va0FuZEZlZWwuamF2YQpAQCAtMTAwOSw2ICsxMDA5LDcgQEAKICAgICAgICAgICAgICJQb3B1cE1lbnUuYmFja2dyb3VuZCIsIE1lbnVCYWNrZ3JvdW5kQ29sb3IsCiAgICAgICAgICAgICAiUG9wdXBNZW51LmZvcmVncm91bmQiLCBNZW51VGV4dENvbG9yLAogICAgICAgICAgICAgIlBvcHVwTWVudS5wb3B1cFNvdW5kIiwgIndpbi5zb3VuZC5tZW51UG9wdXAiLAorICAgICAgICAgICAgIlBvcHVwTWVudS5jb25zdW1lRXZlbnRPbkNsb3NlIiwgQm9vbGVhbi5UUlVFLAogCiAgICAgICAgICAgICAvLyBNZW51cwogICAgICAgICAgICAgIk1lbnUuZm9udCIsIE1lbnVGb250LApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS9pbnRlcm5hbC9DbGllbnROb3RpZkZvcndhcmRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS9pbnRlcm5hbC9DbGllbnROb3RpZkZvcndhcmRlci5qYXZhCmluZGV4IGNiOTQzNzEuLmUxMDc3M2EgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2pteC9yZW1vdGUvaW50ZXJuYWwvQ2xpZW50Tm90aWZGb3J3YXJkZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbXgvcmVtb3RlL2ludGVybmFsL0NsaWVudE5vdGlmRm9yd2FyZGVyLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKICAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAgKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAgKi8KLQogcGFja2FnZSBjb20uc3VuLmpteC5yZW1vdGUuaW50ZXJuYWw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzQsNiArMzMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CiAKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OwpAQCAtNTQsNyArNTQsMTAgQEAKIAogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xpZW50Tm90aWZGb3J3YXJkZXIgewotICAgIHB1YmxpYyBDbGllbnROb3RpZkZvcndhcmRlcihNYXA8U3RyaW5nLCA/PiBlbnYpIHsKKworICAgIHByaXZhdGUgZmluYWwgQWNjZXNzQ29udHJvbENvbnRleHQgYWNjOworCisgICAgcHVibGljIENsaWVudE5vdGlmRm9yd2FyZGVyKE1hcCBlbnYpIHsKICAgICAgICAgdGhpcyhudWxsLCBlbnYpOwogICAgIH0KIApAQCAtODcsNiArOTAsOCBAQAogICAgICAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVubmFibGUgcjsKQEAgLTEzMCw2ICsxMzUsNyBAQAogCiAgICAgICAgIHRoaXMuZGVmYXVsdENsYXNzTG9hZGVyID0gZGVmYXVsdENsYXNzTG9hZGVyOwogICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXg7CisgICAgICAgIHRoaXMuYWNjID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zODAsMjggKzM4Niw4NSBAQAogICAgICAgICBzZXRTdGF0ZShURVJNSU5BVEVEKTsKICAgICB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHByaXZhdGUgY2xhc3NlcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIHByaXZhdGUgY2xhc3NlcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLworCiAgICAgcHJpdmF0ZSBjbGFzcyBOb3RpZkZldGNoZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGFscmVhZHlMb2dnZWQgPSBmYWxzZTsKKworICAgICAgICBwcml2YXRlIHZvaWQgbG9nT25jZShTdHJpbmcgbXNnLCBTZWN1cml0eUV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICBpZiAoYWxyZWFkeUxvZ2dlZCkgcmV0dXJuOworICAgICAgICAgICAgLy8gTG9nIG9ubHkgb25jZS4KKyAgICAgICAgICAgIGxvZ2dlci5jb25maWcoInNldENvbnRleHRDbGFzc0xvYWRlciIsbXNnKTsKKyAgICAgICAgICAgIGlmICh4ICE9IG51bGwpIGxvZ2dlci5maW5lKCJzZXRDb250ZXh0Q2xhc3NMb2FkZXIiLCB4KTsKKyAgICAgICAgICAgIGFscmVhZHlMb2dnZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IG5ldyBjb250ZXh0IGNsYXNzIGxvYWRlciwgcmV0dXJucyBwcmV2aW91cyBvbmUuCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgc2V0Q29udGV4dENsYXNzTG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICAgICAgZmluYWwgQWNjZXNzQ29udHJvbENvbnRleHQgY3R4dCA9IENsaWVudE5vdGlmRm9yd2FyZGVyLnRoaXMuYWNjOworICAgICAgICAgICAgLy8gaWYgY3R4dCBpcyBudWxsLCBsb2cgYSBjb25maWcgbWVzc2FnZSBhbmQgdGhyb3cgYQorICAgICAgICAgICAgLy8gU2VjdXJpdHlFeGNlcHRpb24uCisgICAgICAgICAgICBpZiAoY3R4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nT25jZSgiQWNjZXNzQ29udHJvbENvbnRleHQgbXVzdCBub3QgYmUgbnVsbC4iLG51bGwpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzQ29udHJvbENvbnRleHQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGNvbnRleHQgY2xhc3MgbG9hZGVyIC0gbWF5IHRocm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHlFeGNlcHRpb24gLSB0aG91Z2ggdW5saWtlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgcHJldmlvdXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90aGluZyBuZWVkcyB0byBiZSBkb25lLCBicmVhayBoZXJlLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBwcmV2aW91cykgcmV0dXJuIHByZXZpb3VzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgY29udGV4dCBjbGFzcyBsb2FkZXIgLSBtYXkgdGhyb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ09uY2UoIlBlcm1pc3Npb24gdG8gc2V0IENvbnRleHRDbGFzc0xvYWRlciBtaXNzaW5nLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3RpZmljYXRpb25zIHdpbGwgbm90IGJlIGRpc3BhdGNoZWQuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBjaGVjayB5b3VyIEphdmEgcG9saWN5IGNvbmZpZ3VyYXRpb246ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIGN0eHQpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgcHJldmlvdXM7CisgICAgICAgICAgICBpZiAoZGVmYXVsdENsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcmV2aW91cyA9IHNldENvbnRleHRDbGFzc0xvYWRlcihkZWZhdWx0Q2xhc3NMb2FkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmV2aW91cyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvUnVuKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0Q2xhc3NMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldmlvdXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkb1J1bigpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ2xpZW50Tm90aWZGb3J3YXJkZXIudGhpcykgewogICAgICAgICAgICAgICAgIGN1cnJlbnRGZXRjaFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRJTkcpCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGRlZmF1bHRDbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Vm9pZD4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGV4dENsYXNzTG9hZGVyKGRlZmF1bHRDbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBOb3RpZmljYXRpb25SZXN1bHQgbnIgPSBudWxsOwogICAgICAgICAgICAgaWYgKCFzaG91bGRTdG9wKCkgJiYgKG5yID0gZmV0Y2hOb3RpZnMoKSkgIT0gbnVsbCkgewpAQCAtNDM0LDggKzQ5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbiBtYmVhbiB1bnJlZ2lzdHJhdGlvbiBub3RpZgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcklELmVxdWFscyhtYmVhblJlbW92ZWROb3RpZklEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsaWVudExpc3RlbmVySW5mbyBsaSA9IGluZm9MaXN0LmdldChsaXN0ZW5lcklEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1dChsaXN0ZW5lcklELGxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHV0KGxpc3RlbmVySUQsIGxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBOb3RpZmljYXRpb24gbm90aWYgPSB0bi5nZXROb3RpZmljYXRpb24oKTsKQEAgLTc5OSw5ICs4NjMsNyBAQAogICAgIHByaXZhdGUgbG9uZyBjbGllbnRTZXF1ZW5jZU51bWJlciA9IC0xOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1heE5vdGlmaWNhdGlvbnM7CiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWVvdXQ7Ci0KICAgICBwcml2YXRlIEludGVnZXIgbWJlYW5SZW1vdmVkTm90aWZJRCA9IG51bGw7Ci0KICAgICBwcml2YXRlIFRocmVhZCBjdXJyZW50RmV0Y2hUaHJlYWQ7CiAKICAgICAvLyBzdGF0ZQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS9zZWN1cml0eS9NQmVhblNlcnZlckFjY2Vzc0NvbnRyb2xsZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2pteC9yZW1vdGUvc2VjdXJpdHkvTUJlYW5TZXJ2ZXJBY2Nlc3NDb250cm9sbGVyLmphdmEKaW5kZXggZDc1ZjgyOS4uNzFlNmY2ZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS9zZWN1cml0eS9NQmVhblNlcnZlckFjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbXgvcmVtb3RlL3NlY3VyaXR5L01CZWFuU2VydmVyQWNjZXNzQ29udHJvbGxlci5qYXZhCkBAIC0xMTEsNiArMTExLDIyIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2hlY2tXcml0ZSgpOwogCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGNhbGxlciBjYW4gY3JlYXRlIHRoZSBuYW1lZCBjbGFzcy4gIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgY2FsbHMge0BsaW5rICNjaGVja1dyaXRlKCl9LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ3JlYXRlKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgY2hlY2tXcml0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBjYWxsZXIgY2FuIHVucmVnaXN0ZXIgdGhlIG5hbWVkIE1CZWFuLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBjYWxscyB7QGxpbmsgI2NoZWNrV3JpdGUoKX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tVbnJlZ2lzdGVyKE9iamVjdE5hbWUgbmFtZSkgeworICAgICAgICBjaGVja1dyaXRlKCk7CisgICAgfQorCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLwpAQCAtMTQ4LDcgKzE2NCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbCA8Y29kZT5jaGVja1dyaXRlKCk8L2NvZGU+LCB0aGVuIGZvcndhcmQgdGhpcyBtZXRob2QgdG8gdGhlCisgICAgICogQ2FsbCA8Y29kZT5jaGVja0NyZWF0ZShjbGFzc05hbWUpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQogICAgICAqIHdyYXBwZWQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3RJbnN0YW5jZSBjcmVhdGVNQmVhbihTdHJpbmcgY2xhc3NOYW1lLCBPYmplY3ROYW1lIG5hbWUpCkBAIC0xNTgsNyArMTc0LDcgQEAKICAgICAgICAgTUJlYW5SZWdpc3RyYXRpb25FeGNlcHRpb24sCiAgICAgICAgIE1CZWFuRXhjZXB0aW9uLAogICAgICAgICBOb3RDb21wbGlhbnRNQmVhbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrV3JpdGUoKTsKKyAgICAgICAgY2hlY2tDcmVhdGUoY2xhc3NOYW1lKTsKICAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogICAgICAgICBpZiAoc20gPT0gbnVsbCkgewogICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldE1CZWFuU2VydmVyKCkuaW5zdGFudGlhdGUoY2xhc3NOYW1lKTsKQEAgLTE3MCw3ICsxODYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGwgPGNvZGU+Y2hlY2tXcml0ZSgpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQorICAgICAqIENhbGwgPGNvZGU+Y2hlY2tDcmVhdGUoY2xhc3NOYW1lKTwvY29kZT4sIHRoZW4gZm9yd2FyZCB0aGlzIG1ldGhvZCB0byB0aGUKICAgICAgKiB3cmFwcGVkIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0SW5zdGFuY2UgY3JlYXRlTUJlYW4oU3RyaW5nIGNsYXNzTmFtZSwgT2JqZWN0TmFtZSBuYW1lLApAQCAtMTgxLDcgKzE5Nyw3IEBACiAgICAgICAgIE1CZWFuUmVnaXN0cmF0aW9uRXhjZXB0aW9uLAogICAgICAgICBNQmVhbkV4Y2VwdGlvbiwKICAgICAgICAgTm90Q29tcGxpYW50TUJlYW5FeGNlcHRpb24gewotICAgICAgICBjaGVja1dyaXRlKCk7CisgICAgICAgIGNoZWNrQ3JlYXRlKGNsYXNzTmFtZSk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRNQmVhblNlcnZlcigpLmluc3RhbnRpYXRlKGNsYXNzTmFtZSwKQEAgLTE5Niw3ICsyMTIsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGwgPGNvZGU+Y2hlY2tXcml0ZSgpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQorICAgICAqIENhbGwgPGNvZGU+Y2hlY2tDcmVhdGUoY2xhc3NOYW1lKTwvY29kZT4sIHRoZW4gZm9yd2FyZCB0aGlzIG1ldGhvZCB0byB0aGUKICAgICAgKiB3cmFwcGVkIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0SW5zdGFuY2UgY3JlYXRlTUJlYW4oU3RyaW5nIGNsYXNzTmFtZSwKQEAgLTIwOSw3ICsyMjUsNyBAQAogICAgICAgICBNQmVhbkV4Y2VwdGlvbiwKICAgICAgICAgTm90Q29tcGxpYW50TUJlYW5FeGNlcHRpb24sCiAgICAgICAgIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBjaGVja1dyaXRlKCk7CisgICAgICAgIGNoZWNrQ3JlYXRlKGNsYXNzTmFtZSk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRNQmVhblNlcnZlcigpLmluc3RhbnRpYXRlKGNsYXNzTmFtZSwKQEAgLTIyMiw3ICsyMzgsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGwgPGNvZGU+Y2hlY2tXcml0ZSgpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQorICAgICAqIENhbGwgPGNvZGU+Y2hlY2tDcmVhdGUoY2xhc3NOYW1lKTwvY29kZT4sIHRoZW4gZm9yd2FyZCB0aGlzIG1ldGhvZCB0byB0aGUKICAgICAgKiB3cmFwcGVkIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0SW5zdGFuY2UgY3JlYXRlTUJlYW4oU3RyaW5nIGNsYXNzTmFtZSwKQEAgLTIzNyw3ICsyNTMsNyBAQAogICAgICAgICBNQmVhbkV4Y2VwdGlvbiwKICAgICAgICAgTm90Q29tcGxpYW50TUJlYW5FeGNlcHRpb24sCiAgICAgICAgIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBjaGVja1dyaXRlKCk7CisgICAgICAgIGNoZWNrQ3JlYXRlKGNsYXNzTmFtZSk7CiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRNQmVhblNlcnZlcigpLmluc3RhbnRpYXRlKGNsYXNzTmFtZSwKQEAgLTM5NCw0NSArNDEwLDQ1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbCA8Y29kZT5jaGVja1dyaXRlKCk8L2NvZGU+LCB0aGVuIGZvcndhcmQgdGhpcyBtZXRob2QgdG8gdGhlCisgICAgICogQ2FsbCA8Y29kZT5jaGVja0NyZWF0ZShjbGFzc05hbWUpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQogICAgICAqIHdyYXBwZWQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgaW5zdGFudGlhdGUoU3RyaW5nIGNsYXNzTmFtZSkKICAgICAgICAgdGhyb3dzIFJlZmxlY3Rpb25FeGNlcHRpb24sIE1CZWFuRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tXcml0ZSgpOworICAgICAgICBjaGVja0NyZWF0ZShjbGFzc05hbWUpOwogICAgICAgICByZXR1cm4gZ2V0TUJlYW5TZXJ2ZXIoKS5pbnN0YW50aWF0ZShjbGFzc05hbWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGwgPGNvZGU+Y2hlY2tXcml0ZSgpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQorICAgICAqIENhbGwgPGNvZGU+Y2hlY2tDcmVhdGUoY2xhc3NOYW1lKTwvY29kZT4sIHRoZW4gZm9yd2FyZCB0aGlzIG1ldGhvZCB0byB0aGUKICAgICAgKiB3cmFwcGVkIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGluc3RhbnRpYXRlKFN0cmluZyBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10pCiAgICAgICAgIHRocm93cyBSZWZsZWN0aW9uRXhjZXB0aW9uLCBNQmVhbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrV3JpdGUoKTsKKyAgICAgICAgY2hlY2tDcmVhdGUoY2xhc3NOYW1lKTsKICAgICAgICAgcmV0dXJuIGdldE1CZWFuU2VydmVyKCkuaW5zdGFudGlhdGUoY2xhc3NOYW1lLCBwYXJhbXMsIHNpZ25hdHVyZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbCA8Y29kZT5jaGVja1dyaXRlKCk8L2NvZGU+LCB0aGVuIGZvcndhcmQgdGhpcyBtZXRob2QgdG8gdGhlCisgICAgICogQ2FsbCA8Y29kZT5jaGVja0NyZWF0ZShjbGFzc05hbWUpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQogICAgICAqIHdyYXBwZWQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgaW5zdGFudGlhdGUoU3RyaW5nIGNsYXNzTmFtZSwgT2JqZWN0TmFtZSBsb2FkZXJOYW1lKQogICAgICAgICB0aHJvd3MgUmVmbGVjdGlvbkV4Y2VwdGlvbiwgTUJlYW5FeGNlcHRpb24sIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBjaGVja1dyaXRlKCk7CisgICAgICAgIGNoZWNrQ3JlYXRlKGNsYXNzTmFtZSk7CiAgICAgICAgIHJldHVybiBnZXRNQmVhblNlcnZlcigpLmluc3RhbnRpYXRlKGNsYXNzTmFtZSwgbG9hZGVyTmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbCA8Y29kZT5jaGVja1dyaXRlKCk8L2NvZGU+LCB0aGVuIGZvcndhcmQgdGhpcyBtZXRob2QgdG8gdGhlCisgICAgICogQ2FsbCA8Y29kZT5jaGVja0NyZWF0ZShjbGFzc05hbWUpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQogICAgICAqIHdyYXBwZWQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgaW5zdGFudGlhdGUoU3RyaW5nIGNsYXNzTmFtZSwgT2JqZWN0TmFtZSBsb2FkZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdLCBTdHJpbmcgc2lnbmF0dXJlW10pCiAgICAgICAgIHRocm93cyBSZWZsZWN0aW9uRXhjZXB0aW9uLCBNQmVhbkV4Y2VwdGlvbiwgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrV3JpdGUoKTsKKyAgICAgICAgY2hlY2tDcmVhdGUoY2xhc3NOYW1lKTsKICAgICAgICAgcmV0dXJuIGdldE1CZWFuU2VydmVyKCkuaW5zdGFudGlhdGUoY2xhc3NOYW1lLCBsb2FkZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CiAgICAgfQpAQCAtNTc5LDEyICs1OTUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYWxsIDxjb2RlPmNoZWNrV3JpdGUoKTwvY29kZT4sIHRoZW4gZm9yd2FyZCB0aGlzIG1ldGhvZCB0byB0aGUKKyAgICAgKiBDYWxsIDxjb2RlPmNoZWNrVW5yZWdpc3RlcigpPC9jb2RlPiwgdGhlbiBmb3J3YXJkIHRoaXMgbWV0aG9kIHRvIHRoZQogICAgICAqIHdyYXBwZWQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJNQmVhbihPYmplY3ROYW1lIG5hbWUpCiAgICAgICAgIHRocm93cyBJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uLCBNQmVhblJlZ2lzdHJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrV3JpdGUoKTsKKyAgICAgICAgY2hlY2tVbnJlZ2lzdGVyKG5hbWUpOwogICAgICAgICBnZXRNQmVhblNlcnZlcigpLnVucmVnaXN0ZXJNQmVhbihuYW1lKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2pteC9yZW1vdGUvc2VjdXJpdHkvTUJlYW5TZXJ2ZXJGaWxlQWNjZXNzQ29udHJvbGxlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS9zZWN1cml0eS9NQmVhblNlcnZlckZpbGVBY2Nlc3NDb250cm9sbGVyLmphdmEKaW5kZXggNjZjNzhmMi4uYTc1M2UzYSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS9zZWN1cml0eS9NQmVhblNlcnZlckZpbGVBY2Nlc3NDb250cm9sbGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS9zZWN1cml0eS9NQmVhblNlcnZlckZpbGVBY2Nlc3NDb250cm9sbGVyLmphdmEKQEAgLTMxLDExICszMSwxNyBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OwogCiAvKioKQEAgLTQ2LDcgKzUyLDggQEAKICAqIG5vdCBhbGxvd2VkOyBpbiB0aGlzIGNhc2UgdGhlIHJlcXVlc3QgaXMgbm90IGZvcndhcmRlZCB0byB0aGUKICAqIHdyYXBwZWQgb2JqZWN0LjwvcD4KICAqCi0gKiA8cD5UaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHtAbGluayAjY2hlY2tSZWFkKCl9IGFuZCB7QGxpbmsgI2NoZWNrV3JpdGUoKX0KKyAqIDxwPlRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUge0BsaW5rICNjaGVja1JlYWQoKX0sIHtAbGluayAjY2hlY2tXcml0ZSgpfSwKKyAqIHtAbGluayAjY2hlY2tDcmVhdGUoU3RyaW5nKX0sIGFuZCB7QGxpbmsgI2NoZWNrVW5yZWdpc3RlcihPYmplY3ROYW1lKX0KICAqIG1ldGhvZHMgYmFzZWQgb24gYW4gYWNjZXNzIGxldmVsIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIHVzZXJuYW1lL2FjY2VzcwogICogbGV2ZWwgcGFpcnMuIFRoZSBzZXQgb2YgdXNlcm5hbWUvYWNjZXNzIGxldmVsIHBhaXJzIGlzIHBhc3NlZCBlaXRoZXIgYXMgYQogICogZmlsZW5hbWUgd2hpY2ggZGVub3RlcyBhIHByb3BlcnRpZXMgZmlsZSBvbiBkaXNrLCBvciBkaXJlY3RseSBhcyBhbiBpbnN0YW5jZQpAQCAtNTYsMTQgKzYzLDUwIEBACiAgKiBoYXMgZXhhY3RseSBvbmUgYWNjZXNzIGxldmVsLiBUaGUgc2FtZSBhY2Nlc3MgbGV2ZWwgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsCiAgKiB1c2VybmFtZXMuPC9wPgogICoKLSAqIDxwPlRoZSBzdXBwb3J0ZWQgYWNjZXNzIGxldmVsIHZhbHVlcyBhcmUgPGk+cmVhZG9ubHk8L2k+IGFuZAotICogPGk+cmVhZHdyaXRlPC9pPi48L3A+CisgKiA8cD5UaGUgc3VwcG9ydGVkIGFjY2VzcyBsZXZlbCB2YWx1ZXMgYXJlIHtAY29kZSByZWFkb25seX0gYW5kCisgKiB7QGNvZGUgcmVhZHdyaXRlfS4gIFRoZSB7QGNvZGUgcmVhZHdyaXRlfSBhY2Nlc3MgbGV2ZWwgY2FuIGJlCisgKiBxdWFsaWZpZWQgYnkgb25lIG9yIG1vcmUgPGk+Y2xhdXNlczwvaT4sIHdoZXJlIGVhY2ggY2xhdXNlIGxvb2tzCisgKiBsaWtlIDxjb2RlPmNyZWF0ZSA8aT5jbGFzc05hbWVQYXR0ZXJuPC9pPjwvY29kZT4gb3Ige0Bjb2RlCisgKiB1bnJlZ2lzdGVyfS4gIEZvciBleGFtcGxlOjwvcD4KKyAqCisgKiA8cHJlPgorICogbW9uaXRvclJvbGUgIHJlYWRvbmx5CisgKiBjb250cm9sUm9sZSAgcmVhZHdyaXRlIFwKKyAqICAgICAgICAgICAgICBjcmVhdGUgamF2YXgubWFuYWdlbWVudC50aW1lci4qLGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvci4qIFwKKyAqICAgICAgICAgICAgICB1bnJlZ2lzdGVyCisgKiA8L3ByZT4KKyAqCisgKiA8cD4oVGhlIGNvbnRpbnVhdGlvbiBsaW5lcyB3aXRoIHtAY29kZSBcfSBjb21lIGZyb20gdGhlIHBhcnNlciBmb3IKKyAqIFByb3BlcnRpZXMgZmlsZXMuKTwvcD4KICAqLwogcHVibGljIGNsYXNzIE1CZWFuU2VydmVyRmlsZUFjY2Vzc0NvbnRyb2xsZXIKICAgICBleHRlbmRzIE1CZWFuU2VydmVyQWNjZXNzQ29udHJvbGxlciB7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFET05MWSA9ICJyZWFkb25seSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRFdSSVRFID0gInJlYWR3cml0ZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFET05MWSA9ICJyZWFkb25seSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEV1JJVEUgPSAicmVhZHdyaXRlIjsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFID0gImNyZWF0ZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBVTlJFR0lTVEVSID0gInVucmVnaXN0ZXIiOworCisgICAgcHJpdmF0ZSBlbnVtIEFjY2Vzc1R5cGUge1JFQUQsIFdSSVRFLCBDUkVBVEUsIFVOUkVHSVNURVJ9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWNjZXNzIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiB3cml0ZTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gY3JlYXRlUGF0dGVybnM7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB1bnJlZ2lzdGVyOworCisgICAgICAgIEFjY2Vzcyhib29sZWFuIHdyaXRlLCBib29sZWFuIHVucmVnaXN0ZXIsIExpc3Q8U3RyaW5nPiBjcmVhdGVQYXR0ZXJuTGlzdCkgeworICAgICAgICAgICAgdGhpcy53cml0ZSA9IHdyaXRlOworICAgICAgICAgICAgaW50IG5wYXRzID0gKGNyZWF0ZVBhdHRlcm5MaXN0ID09IG51bGwpID8gMCA6IGNyZWF0ZVBhdHRlcm5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGlmIChucGF0cyA9PSAwKQorICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUGF0dGVybnMgPSBOT19TVFJJTkdTOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUGF0dGVybnMgPSBjcmVhdGVQYXR0ZXJuTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbnBhdHNdKTsKKyAgICAgICAgICAgIHRoaXMudW5yZWdpc3RlciA9IHVucmVnaXN0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIE5PX1NUUklOR1MgPSBuZXcgU3RyaW5nWzBdOworICAgIH0KIAogICAgIC8qKgogICAgICAqIDxwPkNyZWF0ZSBhIG5ldyBNQmVhblNlcnZlckFjY2Vzc0NvbnRyb2xsZXIgdGhhdCBmb3J3YXJkcyBhbGwgdGhlCkBAIC04Nyw4ICsxMzAsOCBAQAogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcigpOwogICAgICAgICB0aGlzLmFjY2Vzc0ZpbGVOYW1lID0gYWNjZXNzRmlsZU5hbWU7Ci0gICAgICAgIHByb3BzID0gcHJvcGVydGllc0Zyb21GaWxlKGFjY2Vzc0ZpbGVOYW1lKTsKLSAgICAgICAgY2hlY2tWYWx1ZXMocHJvcHMpOworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gcHJvcGVydGllc0Zyb21GaWxlKGFjY2Vzc0ZpbGVOYW1lKTsKKyAgICAgICAgcGFyc2VQcm9wZXJ0aWVzKHByb3BzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMywxNCArMTY2LDE0IEBACiAgICAgICogI3NldE1CZWFuU2VydmVyfSBtZXRob2QgYWZ0ZXIgZG9pbmcgYWNjZXNzIGNoZWNrcyBiYXNlZCBvbiByZWFkIGFuZAogICAgICAqIHdyaXRlIHBlcm1pc3Npb25zLjwvcD4KICAgICAgKgotICAgICAqIDxwPlRoaXMgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgaW5zdGFuY2UuCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBtYWtlcyBhIGNvcHkgb2YgdGhlIHByb3BlcnRpZXMgaW5zdGFuY2UgdXNpbmcgaXRzCi0gICAgICogPGNvZGU+Y2xvbmU8L2NvZGU+IG1ldGhvZCBhbmQgaXQgaXMgdGhlIGNvcHkgdGhhdCBpcyBjb25zdWx0ZWQgdG8gY2hlY2sKLSAgICAgKiB0aGUgdXNlcm5hbWUgYW5kIGFjY2VzcyBsZXZlbCBvZiBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiBUaGUgb3JpZ2luYWwKLSAgICAgKiBwcm9wZXJ0aWVzIG9iamVjdCBjYW4gYmUgbW9kaWZpZWQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvcHkuIElmIHRoZQotICAgICAqIHtAbGluayAjcmVmcmVzaH0gbWV0aG9kIGlzIHRoZW4gY2FsbGVkLCB0aGUKLSAgICAgKiA8Y29kZT5NQmVhblNlcnZlckZpbGVBY2Nlc3NDb250cm9sbGVyPC9jb2RlPiB3aWxsIG1ha2UgYSBuZXcgY29weSBvZiB0aGUKLSAgICAgKiBwcm9wZXJ0aWVzIG9iamVjdCBhdCB0aGF0IHRpbWUuPC9wPgorICAgICAqIDxwPlRoaXMgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMKKyAgICAgKiBpbnN0YW5jZS4gIFRoaXMgY29uc3RydWN0b3IgbWFrZXMgYSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzCisgICAgICogaW5zdGFuY2UgYW5kIGl0IGlzIHRoZSBjb3B5IHRoYXQgaXMgY29uc3VsdGVkIHRvIGNoZWNrIHRoZQorICAgICAqIHVzZXJuYW1lIGFuZCBhY2Nlc3MgbGV2ZWwgb2YgYW4gaW5jb21pbmcgY29ubmVjdGlvbi4gVGhlCisgICAgICogb3JpZ2luYWwgcHJvcGVydGllcyBvYmplY3QgY2FuIGJlIG1vZGlmaWVkIHdpdGhvdXQgYWZmZWN0aW5nCisgICAgICogdGhlIGNvcHkuIElmIHRoZSB7QGxpbmsgI3JlZnJlc2h9IG1ldGhvZCBpcyB0aGVuIGNhbGxlZCwgdGhlCisgICAgICogPGNvZGU+TUJlYW5TZXJ2ZXJGaWxlQWNjZXNzQ29udHJvbGxlcjwvY29kZT4gd2lsbCBtYWtlIGEgbmV3CisgICAgICogY29weSBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QgYXQgdGhhdCB0aW1lLjwvcD4KICAgICAgKgogICAgICAqIEBwYXJhbSBhY2Nlc3NGaWxlUHJvcHMgcHJvcGVydGllcyBsaXN0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lL2FjY2VzcwogICAgICAqIGxldmVsIGVudHJpZXMuCkBAIC0xNDUsOCArMTg4LDcgQEAKICAgICAgICAgaWYgKGFjY2Vzc0ZpbGVQcm9wcyA9PSBudWxsKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBwcm9wZXJ0aWVzIik7CiAgICAgICAgIG9yaWdpbmFsUHJvcHMgPSBhY2Nlc3NGaWxlUHJvcHM7Ci0gICAgICAgIHByb3BzID0gKFByb3BlcnRpZXMpIGFjY2Vzc0ZpbGVQcm9wcy5jbG9uZSgpOwotICAgICAgICBjaGVja1ZhbHVlcyhwcm9wcyk7CisgICAgICAgIHBhcnNlUHJvcGVydGllcyhhY2Nlc3NGaWxlUHJvcHMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU1LDE0ICsxOTcsMTQgQEAKICAgICAgKiAjc2V0TUJlYW5TZXJ2ZXJ9IG1ldGhvZCBhZnRlciBkb2luZyBhY2Nlc3MgY2hlY2tzIGJhc2VkIG9uIHJlYWQgYW5kCiAgICAgICogd3JpdGUgcGVybWlzc2lvbnMuPC9wPgogICAgICAqCi0gICAgICogPHA+VGhpcyBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyBpbnN0YW5jZS4KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIG1ha2VzIGEgY29weSBvZiB0aGUgcHJvcGVydGllcyBpbnN0YW5jZSB1c2luZyBpdHMKLSAgICAgKiA8Y29kZT5jbG9uZTwvY29kZT4gbWV0aG9kIGFuZCBpdCBpcyB0aGUgY29weSB0aGF0IGlzIGNvbnN1bHRlZCB0byBjaGVjawotICAgICAqIHRoZSB1c2VybmFtZSBhbmQgYWNjZXNzIGxldmVsIG9mIGFuIGluY29taW5nIGNvbm5lY3Rpb24uIFRoZSBvcmlnaW5hbAotICAgICAqIHByb3BlcnRpZXMgb2JqZWN0IGNhbiBiZSBtb2RpZmllZCB3aXRob3V0IGFmZmVjdGluZyB0aGUgY29weS4gSWYgdGhlCi0gICAgICoge0BsaW5rICNyZWZyZXNofSBtZXRob2QgaXMgdGhlbiBjYWxsZWQsIHRoZQotICAgICAqIDxjb2RlPk1CZWFuU2VydmVyRmlsZUFjY2Vzc0NvbnRyb2xsZXI8L2NvZGU+IHdpbGwgbWFrZSBhIG5ldyBjb3B5IG9mIHRoZQotICAgICAqIHByb3BlcnRpZXMgb2JqZWN0IGF0IHRoYXQgdGltZS48L3A+CisgICAgICogPHA+VGhpcyBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcworICAgICAqIGluc3RhbmNlLiAgVGhpcyBjb25zdHJ1Y3RvciBtYWtlcyBhIGNvcHkgb2YgdGhlIHByb3BlcnRpZXMKKyAgICAgKiBpbnN0YW5jZSBhbmQgaXQgaXMgdGhlIGNvcHkgdGhhdCBpcyBjb25zdWx0ZWQgdG8gY2hlY2sgdGhlCisgICAgICogdXNlcm5hbWUgYW5kIGFjY2VzcyBsZXZlbCBvZiBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiBUaGUKKyAgICAgKiBvcmlnaW5hbCBwcm9wZXJ0aWVzIG9iamVjdCBjYW4gYmUgbW9kaWZpZWQgd2l0aG91dCBhZmZlY3RpbmcKKyAgICAgKiB0aGUgY29weS4gSWYgdGhlIHtAbGluayAjcmVmcmVzaH0gbWV0aG9kIGlzIHRoZW4gY2FsbGVkLCB0aGUKKyAgICAgKiA8Y29kZT5NQmVhblNlcnZlckZpbGVBY2Nlc3NDb250cm9sbGVyPC9jb2RlPiB3aWxsIG1ha2UgYSBuZXcKKyAgICAgKiBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIG9iamVjdCBhdCB0aGF0IHRpbWUuPC9wPgogICAgICAqCiAgICAgICogQHBhcmFtIGFjY2Vzc0ZpbGVQcm9wcyBwcm9wZXJ0aWVzIGxpc3QgY29udGFpbmluZyB0aGUgdXNlcm5hbWUvYWNjZXNzCiAgICAgICogbGV2ZWwgZW50cmllcy4KQEAgLTE4NCwxNiArMjI2LDM2IEBACiAgICAgICogQ2hlY2sgaWYgdGhlIGNhbGxlciBjYW4gZG8gcmVhZCBvcGVyYXRpb25zLiBUaGlzIG1ldGhvZCBkb2VzCiAgICAgICogbm90aGluZyBpZiBzbywgb3RoZXJ3aXNlIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjaGVja1JlYWQoKSB7Ci0gICAgICAgIGNoZWNrQWNjZXNzTGV2ZWwoUkVBRE9OTFkpOworICAgICAgICBjaGVja0FjY2VzcyhBY2Nlc3NUeXBlLlJFQUQsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENoZWNrIGlmIHRoZSBjYWxsZXIgY2FuIGRvIHdyaXRlIG9wZXJhdGlvbnMuICBUaGlzIG1ldGhvZCBkb2VzCiAgICAgICogbm90aGluZyBpZiBzbywgb3RoZXJ3aXNlIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjaGVja1dyaXRlKCkgewotICAgICAgICBjaGVja0FjY2Vzc0xldmVsKFJFQURXUklURSk7CisgICAgICAgIGNoZWNrQWNjZXNzKEFjY2Vzc1R5cGUuV1JJVEUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBjYWxsZXIgY2FuIGNyZWF0ZSBNQmVhbnMgb3IgaW5zdGFuY2VzIG9mIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgaWYgc28sIG90aGVyd2lzZSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hlY2tDcmVhdGUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBjaGVja0FjY2VzcyhBY2Nlc3NUeXBlLkNSRUFURSwgY2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgY2FsbGVyIGNhbiBkbyB1bnJlZ2lzdGVyIG9wZXJhdGlvbnMuICBUaGlzIG1ldGhvZCBkb2VzCisgICAgICogbm90aGluZyBpZiBzbywgb3RoZXJ3aXNlIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjaGVja1VucmVnaXN0ZXIoT2JqZWN0TmFtZSBuYW1lKSB7CisgICAgICAgIGNoZWNrQWNjZXNzKEFjY2Vzc1R5cGUuVU5SRUdJU1RFUiwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTgsMTQgKzI4MCwxMyBAQAogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgc3VwcGxpZWQgYWNjZXNzCiAgICAgICogbGV2ZWwgdmFsdWVzIGRpZmZlcnMgZnJvbSAicmVhZG9ubHkiIG9yICJyZWFkd3JpdGUiLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzeW5jaHJvbml6ZWQgKHByb3BzKSB7Ci0gICAgICAgICAgICBpZiAoYWNjZXNzRmlsZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwcm9wcyA9IChQcm9wZXJ0aWVzKSBvcmlnaW5hbFByb3BzLmNsb25lKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJvcHMgPSBwcm9wZXJ0aWVzRnJvbUZpbGUoYWNjZXNzRmlsZU5hbWUpOwotICAgICAgICAgICAgY2hlY2tWYWx1ZXMocHJvcHMpOwotICAgICAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZnJlc2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzOworICAgICAgICBpZiAoYWNjZXNzRmlsZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHByb3BzID0gKFByb3BlcnRpZXMpIG9yaWdpbmFsUHJvcHM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByb3BzID0gcHJvcGVydGllc0Zyb21GaWxlKGFjY2Vzc0ZpbGVOYW1lKTsKKyAgICAgICAgcGFyc2VQcm9wZXJ0aWVzKHByb3BzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIHByb3BlcnRpZXNGcm9tRmlsZShTdHJpbmcgZm5hbWUpCkBAIC0yNDAsNyArMzAxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjaGVja0FjY2Vzc0xldmVsKFN0cmluZyBhY2Nlc3NMZXZlbCkgeworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tBY2Nlc3MoQWNjZXNzVHlwZSByZXF1aXJlZEFjY2VzcywgU3RyaW5nIGFyZykgewogICAgICAgICBmaW5hbCBBY2Nlc3NDb250cm9sQ29udGV4dCBhY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKICAgICAgICAgZmluYWwgU3ViamVjdCBzID0KICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFN1YmplY3Q+KCkgewpAQCAtMjQ5LDM5ICszMTAsMjM1IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuOyAvKiBzZWN1cml0eSBoYXMgbm90IGJlZW4gZW5hYmxlZCAqLwotICAgICAgICBmaW5hbCBTZXQ8UHJpbmNpcGFsPiBwcmluY2lwYWxzID0gcy5nZXRQcmluY2lwYWxzKCk7Ci0gICAgICAgIGZvciAoUHJpbmNpcGFsIHAgOiBwcmluY2lwYWxzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZ3JhbnRlZEFjY2Vzc0xldmVsOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChwcm9wcykgewotICAgICAgICAgICAgICAgIGdyYW50ZWRBY2Nlc3NMZXZlbCA9IHByb3BzLmdldFByb3BlcnR5KHAuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChncmFudGVkQWNjZXNzTGV2ZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NMZXZlbC5lcXVhbHMoUkVBRE9OTFkpICYmCi0gICAgICAgICAgICAgICAgICAgIChncmFudGVkQWNjZXNzTGV2ZWwuZXF1YWxzKFJFQURPTkxZKSB8fAotICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZEFjY2Vzc0xldmVsLmVxdWFscyhSRUFEV1JJVEUpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NMZXZlbC5lcXVhbHMoUkVBRFdSSVRFKSAmJgotICAgICAgICAgICAgICAgICAgICBncmFudGVkQWNjZXNzTGV2ZWwuZXF1YWxzKFJFQURXUklURSkpCisgICAgICAgIGZpbmFsIFNldCBwcmluY2lwYWxzID0gcy5nZXRQcmluY2lwYWxzKCk7CisgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eVZhbHVlID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJpbmNpcGFscy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBmaW5hbCBQcmluY2lwYWwgcCA9IChQcmluY2lwYWwpIGkubmV4dCgpOworICAgICAgICAgICAgQWNjZXNzIGFjY2VzcyA9IGFjY2Vzc01hcC5nZXQocC5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKGFjY2VzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBvazsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlcXVpcmVkQWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVBRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTsgIC8vIGFsbCBhY2Nlc3MgZW50cmllcyBpbXBseSByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXUklURToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gYWNjZXNzLndyaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVU5SRUdJU1RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gYWNjZXNzLnVucmVnaXN0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9rICYmIGFjY2Vzcy53cml0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlID0gInVucmVnaXN0ZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1JFQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBjaGVja0NyZWF0ZUFjY2VzcyhhY2Nlc3MsIGFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9rICYmIGFjY2Vzcy53cml0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlID0gImNyZWF0ZSAiICsgYXJnOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9rKQogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJBY2Nlc3MgZGVuaWVkISBJbnZhbGlkIGFjY2VzcyBsZXZlbCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdGVkIE1CZWFuU2VydmVyIG9wZXJhdGlvbi4iKTsKKyAgICAgICAgU2VjdXJpdHlFeGNlcHRpb24gc2UgPSBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkFjY2VzcyBkZW5pZWQhIEludmFsaWQgIiArCisgICAgICAgICAgICAgICAgImFjY2VzcyBsZXZlbCBmb3IgcmVxdWVzdGVkIE1CZWFuU2VydmVyIG9wZXJhdGlvbi4iKTsKKyAgICAgICAgLy8gQWRkIHNvbWUgbW9yZSBpbmZvcm1hdGlvbiB0byBoZWxwIHBlb3BsZSB3aXRoIGRlcGxveW1lbnRzIHRoYXQKKyAgICAgICAgLy8gd29ya2VkIGJlZm9yZSB3ZSByZXF1aXJlZCBleHBsaWNpdCBjcmVhdGUgY2xhdXNlcy4gV2UncmUgbm90IGdpdmluZworICAgICAgICAvLyBhbnkgaW5mb3JtYXRpb24gdG8gdGhlIGJhZCBndXlzLCBvdGhlciB0aGFuIHRoYXQgdGhlIGFjY2VzcyBjb250cm9sCisgICAgICAgIC8vIGlzIGJhc2VkIG9uIGEgZmlsZSwgd2hpY2ggdGhleSBjb3VsZCBoYXZlIHdvcmtlZCBvdXQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgLy8gdHJhY2UgYW55d2F5LgorICAgICAgICBpZiAobmV3UHJvcGVydHlWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTZWN1cml0eUV4Y2VwdGlvbiBzZTIgPSBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkFjY2VzcyBwcm9wZXJ0eSAiICsKKyAgICAgICAgICAgICAgICAgICAgImZvciB0aGlzIGlkZW50aXR5IHNob3VsZCBiZSBzaW1pbGFyIHRvOiAiICsgUkVBRFdSSVRFICsKKyAgICAgICAgICAgICAgICAgICAgIiAiICsgbmV3UHJvcGVydHlWYWx1ZSk7CisgICAgICAgICAgICBzZS5pbml0Q2F1c2Uoc2UyKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY2hlY2tWYWx1ZXMoUHJvcGVydGllcyBwcm9wcykgewotICAgICAgICBDb2xsZWN0aW9uPD8+IGMgPSBwcm9wcy52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvcjw/PiBpID0gYy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWNjZXNzTGV2ZWwgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghYWNjZXNzTGV2ZWwuZXF1YWxzKFJFQURPTkxZKSAmJgotICAgICAgICAgICAgICAgICFhY2Nlc3NMZXZlbC5lcXVhbHMoUkVBRFdSSVRFKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJTeW50YXggZXJyb3IgaW4gYWNjZXNzIGxldmVsIGVudHJ5IFsiICsgYWNjZXNzTGV2ZWwgKyAiXSIpOwotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tDcmVhdGVBY2Nlc3MoQWNjZXNzIGFjY2VzcywgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWVQYXR0ZXJuIDogYWNjZXNzLmNyZWF0ZVBhdHRlcm5zKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lTWF0Y2goY2xhc3NOYW1lUGF0dGVybiwgY2xhc3NOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVNYXRjaChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICAvLyBXZSBzdHVkaW91c2x5IGF2b2lkZWQgcmVnZXhlcyB3aGVuIHBhcnNpbmcgdGhlIHByb3BlcnRpZXMgZmlsZSwKKyAgICAgICAgLy8gYmVjYXVzZSB0aGF0IGlzIGRvbmUgd2hlbmV2ZXIgdGhlIFZNIGlzIHN0YXJ0ZWQgd2l0aCB0aGUKKyAgICAgICAgLy8gYXBwcm9wcmlhdGUgLURjb20uc3VuLm1hbmFnZW1lbnQgb3B0aW9ucywgZXZlbiBpZiBub2JvZHkgZXZlcgorICAgICAgICAvLyBjcmVhdGVzIGFuIE1CZWFuLiAgV2UgZG9uJ3Qgd2FudCB0byBpbmN1ciB0aGUgb3ZlcmhlYWQgb2YgbG9hZGluZworICAgICAgICAvLyBhbGwgdGhlIHJlZ2V4IGNvZGUgd2hlbmV2ZXIgdGhvc2Ugb3B0aW9ucyBhcmUgc3BlY2lmaWVkLCBidXQgaWYgd2UKKyAgICAgICAgLy8gZ2V0IGFzIGZhciBhcyBoZXJlIHRoZW4gdGhlIFZNIGlzIGFscmVhZHkgcnVubmluZyBhbmQgc29tZWJvZHkgaXMKKyAgICAgICAgLy8gZG9pbmcgdGhlIHZlcnkgdW51c3VhbCBvcGVyYXRpb24gb2YgcmVtb3RlbHkgY3JlYXRpbmcgYW4gTUJlYW4uCisgICAgICAgIC8vIEJlY2F1c2UgdGhhdCBvcGVyYXRpb24gaXMgc28gdW51c3VhbCwgd2UgZG9uJ3QgdHJ5IHRvIG9wdGltaXplCisgICAgICAgIC8vIGJ5IGhhbmQtbWF0Y2hpbmcgb3IgYnkgY2FjaGluZyBjb21waWxlZCBQYXR0ZXJuIG9iamVjdHMuCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybiwgIioiLCB0cnVlKTsKKyAgICAgICAgd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9rID0gc3Rvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIqIikpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJbXi5dKiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChQYXR0ZXJuLnF1b3RlKHRvaykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc05hbWUubWF0Y2hlcyhzYi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHsKKyAgICAgICAgdGhpcy5hY2Nlc3NNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFjY2Vzcz4oKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogcHJvcHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBTdHJpbmcgYWNjZXNzU3RyaW5nID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIEFjY2VzcyBhY2Nlc3MgPSBQYXJzZXIucGFyc2VBY2Nlc3MoaWRlbnRpdHksIGFjY2Vzc1N0cmluZyk7CisgICAgICAgICAgICBhY2Nlc3NNYXAucHV0KGlkZW50aXR5LCBhY2Nlc3MpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhcnNlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBFT1MgPSAtMTsgIC8vIHBzZXVkby1jb2RlcG9pbnQgImVuZCBvZiBzdHJpbmciCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBhc3NlcnQgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoRU9TKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkZW50aXR5OyAgLy8ganVzdCBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHM7ICAvLyB0aGUgc3RyaW5nIHdlJ3JlIHBhcnNpbmcKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGVuOyAgIC8vIHMubGVuZ3RoKCkKKyAgICAgICAgcHJpdmF0ZSBpbnQgaTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYzsKKyAgICAgICAgLy8gQXQgYW55IHBvaW50LCBlaXRoZXIgYyBpcyBzLmNvZGVQb2ludEF0KGkpLCBvciBpID09IGxlbiBhbmQKKyAgICAgICAgLy8gYyBpcyBFT1MuICBXZSB1c2UgaW50IHJhdGhlciB0aGFuIGNoYXIgYmVjYXVzZSBpdCBpcyBjb25jZWl2YWJsZQorICAgICAgICAvLyAoaWYgdW5saWtlbHkpIHRoYXQgYSBjbGFzc25hbWUgaW4gYSBjcmVhdGUgY2xhdXNlIG1pZ2h0IGNvbnRhaW4KKyAgICAgICAgLy8gInN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycyIsIHRoZSBvbmVzIHRoYXQgZG9uJ3QgZml0IGluIHRoZSBvcmlnaW5hbAorICAgICAgICAvLyAxNiBiaXRzIGZvciBVbmljb2RlLgorCisgICAgICAgIHByaXZhdGUgUGFyc2VyKFN0cmluZyBpZGVudGl0eSwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHRoaXMuaWRlbnRpdHkgPSBpZGVudGl0eTsKKyAgICAgICAgICAgIHRoaXMucyA9IHM7CisgICAgICAgICAgICB0aGlzLmxlbiA9IHMubGVuZ3RoKCk7CisgICAgICAgICAgICB0aGlzLmkgPSAwOworICAgICAgICAgICAgaWYgKGkgPCBsZW4pCisgICAgICAgICAgICAgICAgdGhpcy5jID0gcy5jb2RlUG9pbnRBdChpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aGlzLmMgPSBFT1M7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgQWNjZXNzIHBhcnNlQWNjZXNzKFN0cmluZyBpZGVudGl0eSwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyc2VyKGlkZW50aXR5LCBzKS5wYXJzZUFjY2VzcygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBBY2Nlc3MgcGFyc2VBY2Nlc3MoKSB7CisgICAgICAgICAgICBza2lwU3BhY2UoKTsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gcGFyc2VXb3JkKCk7CisgICAgICAgICAgICBBY2Nlc3MgYWNjZXNzOworICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKFJFQURPTkxZKSkKKyAgICAgICAgICAgICAgICBhY2Nlc3MgPSBuZXcgQWNjZXNzKGZhbHNlLCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhSRUFEV1JJVEUpKQorICAgICAgICAgICAgICAgIGFjY2VzcyA9IHBhcnNlUmVhZFdyaXRlKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXgoIkV4cGVjdGVkICIgKyBSRUFET05MWSArICIgb3IgIiArIFJFQURXUklURSArCisgICAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyAhPSBFT1MpCisgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4KCJFeHRyYSB0ZXh0IGF0IGVuZCBvZiBsaW5lIik7CisgICAgICAgICAgICByZXR1cm4gYWNjZXNzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBBY2Nlc3MgcGFyc2VSZWFkV3JpdGUoKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gY3JlYXRlQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgYm9vbGVhbiB1bnJlZ2lzdGVyID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHNraXBTcGFjZSgpOworICAgICAgICAgICAgICAgIGlmIChjID09IEVPUykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBwYXJzZVdvcmQoKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoVU5SRUdJU1RFUikpCisgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKENSRUFURSkpCisgICAgICAgICAgICAgICAgICAgIHBhcnNlQ3JlYXRlKGNyZWF0ZUNsYXNzZXMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4KCJVbnJlY29nbml6ZWQga2V5d29yZCAiICsgdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEFjY2Vzcyh0cnVlLCB1bnJlZ2lzdGVyLCBjcmVhdGVDbGFzc2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZUNyZWF0ZShMaXN0PFN0cmluZz4gY3JlYXRlQ2xhc3NlcykgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBza2lwU3BhY2UoKTsKKyAgICAgICAgICAgICAgICBjcmVhdGVDbGFzc2VzLmFkZChwYXJzZUNsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBza2lwU3BhY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLCcpCisgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VDbGFzc05hbWUoKSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBjaGVjayB0aGF0IGNsYXNzbmFtZSBjb21wb25lbnRzIGJlZ2luIHdpdGggc3VpdGFibGUKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgKHNvIHdlIGFjY2VwdCAxLjIuMyBmb3IgZXhhbXBsZSkuICBUaGlzIG1lYW5zIHRoYXQKKyAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBvbmx5IHR3byBzdGF0ZXMsIHdoaWNoIHdlIGNhbiBjYWxsIGRvdE9LIGFuZCAhZG90T0sKKyAgICAgICAgICAgIC8vIGFjY29yZGluZyBhcyBhIGRvdCAoLikgaXMgbGVnYWwgb3Igbm90LiAgSW5pdGlhbGx5IHdlJ3JlIGluCisgICAgICAgICAgICAvLyAhZG90T0sgc2luY2UgYSBjbGFzc25hbWUgY2FuJ3Qgc3RhcnQgd2l0aCBhIGRvdDsgYWZ0ZXIgYSBkb3QKKyAgICAgICAgICAgIC8vIHdlJ3JlIGluICFkb3RPSyBhZ2FpbjsgYW5kIGFmdGVyIGFueSBvdGhlciBjaGFyYWN0ZXJzIHdlJ3JlIGluCisgICAgICAgICAgICAvLyBkb3RPSy4gIFRoZSBjbGFzc25hbWUgaXMgb25seSBhY2NlcHRlZCBpZiB3ZSBlbmQgaW4gZG90T0ssCisgICAgICAgICAgICAvLyBzbyB3ZSByZWplY3QgYW4gZW1wdHkgbmFtZSBvciBhIG5hbWUgdGhhdCBlbmRzIHdpdGggYSBkb3QuCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBpOworICAgICAgICAgICAgYm9vbGVhbiBkb3RPSyA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkb3RPSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN5bnRheCgiQmFkIC4gaW4gY2xhc3MgbmFtZSIpOworICAgICAgICAgICAgICAgICAgICBkb3RPSyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKicgfHwgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQorICAgICAgICAgICAgICAgICAgICBkb3RPSyA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIGkpOworICAgICAgICAgICAgaWYgKCFkb3RPSykKKyAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXgoIkJhZCBjbGFzcyBuYW1lICIgKyBjbGFzc05hbWUpOworICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkdmFuY2UgYyBhbmQgaSB0byB0aGUgbmV4dCBjaGFyYWN0ZXIsIHVubGVzcyBhbHJlYWR5IGF0IEVPUy4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIG5leHQoKSB7CisgICAgICAgICAgICBpZiAoYyAhPSBFT1MpIHsKKyAgICAgICAgICAgICAgICBpICs9IENoYXJhY3Rlci5jaGFyQ291bnQoYyk7CisgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pCisgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNvZGVQb2ludEF0KGkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYyA9IEVPUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBza2lwU3BhY2UoKSB7CisgICAgICAgICAgICB3aGlsZSAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXJzZVdvcmQoKSB7CisgICAgICAgICAgICBza2lwU3BhY2UoKTsKKyAgICAgICAgICAgIGlmIChjID09IEVPUykKKyAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXgoIkV4cGVjdGVkIHdvcmQgYXQgZW5kIG9mIGxpbmUiKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGFydCA9IGk7CisgICAgICAgICAgICB3aGlsZSAoYyAhPSBFT1MgJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCisgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHdvcmQgPSBzLnN1YnN0cmluZyhzdGFydCwgaSk7CisgICAgICAgICAgICBza2lwU3BhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiB3b3JkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc3ludGF4KFN0cmluZyBtc2cpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBtc2cgKyAiIFsiICsgaWRlbnRpdHkgKyAiICIgKyBzICsgIl0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgQWNjZXNzPiBhY2Nlc3NNYXA7CiAgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIG9yaWdpbmFsUHJvcHM7CiAgICAgcHJpdmF0ZSBTdHJpbmcgYWNjZXNzRmlsZU5hbWU7CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvTGRhcEN0eC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0xkYXBDdHguamF2YQppbmRleCBiZWM2ZmQwLi41Zjk0NjJjIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvTGRhcEN0eC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9MZGFwQ3R4LmphdmEKQEAgLTMwMiw3ICszMDIsMTYgQEAKIAogICAgICAgICBzY2hlbWFUcmVlcyA9IG5ldyBIYXNodGFibGUoMTEsIDAuNzVmKTsKICAgICAgICAgaW5pdEVudigpOwotICAgICAgICBjb25uZWN0KGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3QoZmFsc2UpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgLy8gTm90aGluZworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIExkYXBDdHgoTGRhcEN0eCBleGlzdGluZywgU3RyaW5nIG5ld0ROKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9WZXJzaW9uSGVscGVyMTIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9WZXJzaW9uSGVscGVyMTIuamF2YQppbmRleCBhNDEzMTE2Li4wZjZhNzBlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvVmVyc2lvbkhlbHBlcjEyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL1ZlcnNpb25IZWxwZXIxMi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMTk5OS0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMzLDEyICszMywzMyBAQAogCiBmaW5hbCBjbGFzcyBWZXJzaW9uSGVscGVyMTIgZXh0ZW5kcyBWZXJzaW9uSGVscGVyIHsKIAorICAgIC8vIFN5c3RlbSBwcm9wZXJ0eSB0byBjb250cm9sIHdoZXRoZXIgY2xhc3NlcyBtYXkgYmUgbG9hZGVkIGZyb20gYW4KKyAgICAvLyBhcmJpdHJhcnkgVVJMIGNvZGUgYmFzZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVU1RfVVJMX0NPREVCQVNFX1BST1BFUlRZID0KKyAgICAgICAgImNvbS5zdW4uam5kaS5sZGFwLm9iamVjdC50cnVzdFVSTENvZGViYXNlIjsKKworICAgIC8vIERldGVybWluZSB3aGV0aGVyIGNsYXNzZXMgbWF5IGJlIGxvYWRlZCBmcm9tIGFuIGFyYml0cmFyeSBVUkwgY29kZSBiYXNlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cnVzdFVSTENvZGViYXNlID0KKyAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KFRSVVNUX1VSTF9DT0RFQkFTRV9QUk9QRVJUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFsc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICk7CisKICAgICBWZXJzaW9uSGVscGVyMTIoKSB7fSAvLyBEaXNhbGxvdyBleHRlcm5hbCBmcm9tIGNyZWF0aW5nIG9uZSBvZiB0aGVzZS4KIAogICAgIENsYXNzTG9hZGVyIGdldFVSTENsYXNzTG9hZGVyKFN0cmluZ1tdIHVybCkKICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENsYXNzZXMgbWF5IG9ubHkgYmUgbG9hZGVkIGZyb20gYW4gYXJiaXRyYXJ5IFVSTCBjb2RlIGJhc2Ugd2hlbgorICAgICAgICAgICAgICogdGhlIHN5c3RlbSBwcm9wZXJ0eSBjb20uc3VuLmpuZGkubGRhcC5vYmplY3QudHJ1c3RVUkxDb2RlYmFzZQorICAgICAgICAgICAgICogaGFzIGJlZW4gc2V0IHRvICJ0cnVlIi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHRydXN0VVJMQ29kZWJhc2UpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVSTENsYXNzTG9hZGVyLm5ld0luc3RhbmNlKGdldFVybEFycmF5KHVybCksIHBhcmVudCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0QXVkaW9QdXNoZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRBdWRpb1B1c2hlci5qYXZhCmluZGV4IGQxOWZmNDEuLjQzNzczMzQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRBdWRpb1B1c2hlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRBdWRpb1B1c2hlci5qYXZhCkBAIC01NCw2ICs1NCw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGFjdGl2ZSA9IHRydWU7CiAgICAgICAgIGF1ZGlvdGhyZWFkID0gbmV3IFRocmVhZCh0aGlzKTsKKyAgICAgICAgYXVkaW90aHJlYWQuc2V0RGFlbW9uKHRydWUpOwogICAgICAgICBhdWRpb3RocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUFYX1BSSU9SSVRZKTsKICAgICAgICAgYXVkaW90aHJlYWQuc3RhcnQoKTsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0Q2hhbm5lbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vbWVkaWEvc291bmQvU29mdENoYW5uZWwuamF2YQppbmRleCA4YmI1ZjJlLi45NmE1NzVmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0Q2hhbm5lbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRDaGFubmVsLmphdmEKQEAgLTkzLDcgKzkzLDYgQEAKICAgICBwcm90ZWN0ZWQgZG91YmxlIHBvcnRhbWVudG9fdGltZSA9IDE7IC8vIGtleXNjaGFuZ2VzIHBlciBjb250cm9sIGJ1ZmZlciB0aW1lCiAgICAgcHJvdGVjdGVkIGludFtdIHBvcnRhbWVudG9fbGFzdG5vdGUgPSBuZXcgaW50WzEyOF07CiAgICAgcHJvdGVjdGVkIGludCBwb3J0YW1lbnRvX2xhc3Rub3RlX2l4ID0gMDsKLSAgICBwcml2YXRlIGludCBwb3J0YW1lbnRvX2NvbnRyb2xfbm90ZSA9IC0xOwogICAgIHByaXZhdGUgYm9vbGVhbiBwb3J0YW1lbnRvID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1vbm8gPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbXV0ZSA9IGZhbHNlOwpAQCAtMzY5LDEyICszNjgsMTIgQEAKICAgICAgICAgdm9pY2Uuc2V0U29sb011dGUoc29sb211dGUpOwogICAgICAgICBpZiAocmVsZWFzZVRyaWdnZXJlZCkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHBvcnRhbWVudG9fY29udHJvbF9ub3RlICE9IC0xKSB7CisgICAgICAgIGlmIChjb250cm9sbGVyWzg0XSAhPSAwKSB7CiAgICAgICAgICAgICB2b2ljZS5jb19ub3Rlb25fa2V5bnVtYmVyWzBdCi0gICAgICAgICAgICAgICAgICAgID0gKHR1bmluZy5nZXRUdW5pbmcocG9ydGFtZW50b19jb250cm9sX25vdGUpIC8gMTAwLjApCisgICAgICAgICAgICAgICAgICAgID0gKHR1bmluZy5nZXRUdW5pbmcoY29udHJvbGxlcls4NF0pIC8gMTAwLjApCiAgICAgICAgICAgICAgICAgICAgICogKDFmIC8gMTI4Zik7CiAgICAgICAgICAgICB2b2ljZS5wb3J0YW1lbnRvID0gdHJ1ZTsKLSAgICAgICAgICAgIHBvcnRhbWVudG9fY29udHJvbF9ub3RlID0gLTE7CisgICAgICAgICAgICBjb250cm9sQ2hhbmdlKDg0LCAwKTsKICAgICAgICAgfSBlbHNlIGlmIChwb3J0YW1lbnRvKSB7CiAgICAgICAgICAgICBpZiAobW9ubykgewogICAgICAgICAgICAgICAgIGlmIChwb3J0YW1lbnRvX2xhc3Rub3RlWzBdICE9IC0xKSB7CkBAIC0zODIsNyArMzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICh0dW5pbmcuZ2V0VHVuaW5nKHBvcnRhbWVudG9fbGFzdG5vdGVbMF0pIC8gMTAwLjApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoMWYgLyAxMjhmKTsKICAgICAgICAgICAgICAgICAgICAgdm9pY2UucG9ydGFtZW50byA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHBvcnRhbWVudG9fY29udHJvbF9ub3RlID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xDaGFuZ2UoODQsIDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwb3J0YW1lbnRvX2xhc3Rub3RlWzBdID0gbm90ZU51bWJlcjsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NDksMTkgKzQ0OCwxOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHBvcnRhbWVudG9fY29udHJvbF9ub3RlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJbODRdICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuX2ZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdm9pY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pY2VzW2ldLm9uICYmIHZvaWNlc1tpXS5jaGFubmVsID09IGNoYW5uZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdm9pY2VzW2ldLmFjdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2b2ljZXNbaV0ubm90ZSA9PSBwb3J0YW1lbnRvX2NvbnRyb2xfbm90ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2b2ljZXNbaV0ubm90ZSA9PSBjb250cm9sbGVyWzg0XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2b2ljZXNbaV0ucmVsZWFzZVRyaWdnZXJlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlc1tpXS5wb3J0YW1lbnRvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZXNbaV0uc2V0Tm90ZShub3RlTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2ZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwb3J0YW1lbnRvX2NvbnRyb2xfbm90ZSA9IC0xOworICAgICAgICAgICAgICAgICAgICBjb250cm9sQ2hhbmdlKDg0LCAwKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5fZm91bmQpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQpAQCAtNTU2LDYgKzU1NSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgdm9pY2VzW2ldLnJlbGVhc2VUcmlnZ2VyZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgdm9pY2VzW2ldLm5vdGVPZmYodmVsb2NpdHkpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGFsc28gY2hlY2sgc3RvbGVuIHZvaWNlcworICAgICAgICAgICAgICAgIGlmICh2b2ljZXNbaV0uc3RlYWxlcl9jaGFubmVsID09IHRoaXMgJiYgdm9pY2VzW2ldLnN0ZWFsZXJfbm90ZU51bWJlciA9PSBub3RlTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgIFNvZnRWb2ljZSB2ID0gdm9pY2VzW2ldOworICAgICAgICAgICAgICAgICAgICB2LnN0ZWFsZXJfcmVsZWFzZVRyaWdnZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB2LnN0ZWFsZXJfY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHYuc3RlYWxlcl9wZXJmb3JtZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB2LnN0ZWFsZXJfdm9pY2VJRCA9IC0xOworICAgICAgICAgICAgICAgICAgICB2LnN0ZWFsZXJfbm90ZU51bWJlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHYuc3RlYWxlcl92ZWxvY2l0eSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHYuc3RlYWxlcl9leHRlbmRlZENvbm5lY3Rpb25CbG9ja3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB2LnN0ZWFsZXJfY2hhbm5lbG1peGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFRyeSBwbGF5IGJhY2sgbm90ZS1vZmYgdHJpZ2dlcmVkIHZvaWNlcywKQEAgLTExNDEsOSArMTE1Miw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICAgIHBvcnRhbWVudG9fY29udHJvbF9ub3RlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDk4OgogICAgICAgICAgICAgICAgIG5ycG5fY29udHJvbCA9IChucnBuX2NvbnRyb2wgJiAoMTI3IDw8IDcpKSArIHZhbHVlOwogICAgICAgICAgICAgICAgIHJwbl9jb250cm9sID0gUlBOX05VTExfVkFMVUU7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0Q2hvcnVzLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0Q2hvcnVzLmphdmEKaW5kZXggMGE5ZjY0NDMuLjU5Nzc4Y2QgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRDaG9ydXMuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0Q2hvcnVzLmphdmEKQEAgLTM4LDExICszOCwxMSBAQAogCiAgICAgICAgIHByaXZhdGUgZmxvYXRbXSBkZWxheWJ1ZmZlcjsKICAgICAgICAgcHJpdmF0ZSBpbnQgcm92ZXBvcyA9IDA7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgZmxvYXQgZ2FpbiA9IDE7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgZmxvYXQgcmdhaW4gPSAwOwotICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGZsb2F0IGRlbGF5ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBnYWluID0gMTsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCByZ2FpbiA9IDA7CisgICAgICAgIHByaXZhdGUgZmxvYXQgZGVsYXkgPSAwOwogICAgICAgICBwcml2YXRlIGZsb2F0IGxhc3RkZWxheSA9IDA7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgZmxvYXQgZmVlZGJhY2sgPSAwOworICAgICAgICBwcml2YXRlIGZsb2F0IGZlZWRiYWNrID0gMDsKIAogICAgICAgICBwdWJsaWMgVmFyaWFibGVEZWxheShpbnQgbWF4YnVmZmVyc2l6ZSkgewogICAgICAgICAgICAgZGVsYXlidWZmZXIgPSBuZXcgZmxvYXRbbWF4YnVmZmVyc2l6ZV07CkBAIC0xMTUsMTAgKzExNSw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMRk9EZWxheSB7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBkb3VibGUgY19jb3NfZGVsdGE7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgZG91YmxlIGNfc2luX2RlbHRhOwotICAgICAgICBwcml2YXRlIGRvdWJsZSBjX2NvcyA9IDE7Ci0gICAgICAgIHByaXZhdGUgZG91YmxlIGNfc2luID0gMDsKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgcGhhc2UgPSAxOworICAgICAgICBwcml2YXRlIGRvdWJsZSBwaGFzZV9zdGVwID0gMDsKICAgICAgICAgcHJpdmF0ZSBkb3VibGUgZGVwdGggPSAwOwogICAgICAgICBwcml2YXRlIFZhcmlhYmxlRGVsYXkgdmRlbGF5OwogICAgICAgICBwcml2YXRlIGRvdWJsZSBzYW1wbGVyYXRlOwpAQCAtMTM5LDEzICsxMzcsMTEgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRSYXRlKGRvdWJsZSByYXRlKSB7CiAgICAgICAgICAgICBkb3VibGUgZyA9IChNYXRoLlBJICogMikgKiAocmF0ZSAvIGNvbnRyb2xyYXRlKTsKLSAgICAgICAgICAgIGNfY29zX2RlbHRhID0gTWF0aC5jb3MoZyk7Ci0gICAgICAgICAgICBjX3Npbl9kZWx0YSA9IE1hdGguc2luKGcpOworICAgICAgICAgICAgcGhhc2Vfc3RlcCA9IGc7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZShkb3VibGUgcGhhc2UpIHsKLSAgICAgICAgICAgIGNfY29zID0gTWF0aC5jb3MocGhhc2UpOwotICAgICAgICAgICAgY19zaW4gPSBNYXRoLnNpbihwaGFzZSk7CisgICAgICAgICAgICB0aGlzLnBoYXNlID0gcGhhc2U7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRGZWVkQmFjayhmbG9hdCBmZWVkYmFjaykgewpAQCAtMTYxLDE2ICsxNTcsMTYgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NNaXgoZmxvYXRbXSBpbiwgZmxvYXRbXSBvdXQsIGZsb2F0W10gcm91dCkgewotICAgICAgICAgICAgY19jb3MgPSBjX2NvcyAqIGNfY29zX2RlbHRhIC0gY19zaW4gKiBjX3Npbl9kZWx0YTsKLSAgICAgICAgICAgIGNfc2luID0gY19jb3MgKiBjX3Npbl9kZWx0YSArIGNfc2luICogY19jb3NfZGVsdGE7Ci0gICAgICAgICAgICB2ZGVsYXkuc2V0RGVsYXkoKGZsb2F0KSAoZGVwdGggKiAwLjUgKiAoY19jb3MgKyAyKSkpOworICAgICAgICAgICAgcGhhc2UgKz0gcGhhc2Vfc3RlcDsKKyAgICAgICAgICAgIHdoaWxlKHBoYXNlID4gKE1hdGguUEkgKiAyKSkgcGhhc2UgLT0gKE1hdGguUEkgKiAyKTsKKyAgICAgICAgICAgIHZkZWxheS5zZXREZWxheSgoZmxvYXQpIChkZXB0aCAqIDAuNSAqIChNYXRoLmNvcyhwaGFzZSkgKyAyKSkpOwogICAgICAgICAgICAgdmRlbGF5LnByb2Nlc3NNaXgoaW4sIG91dCwgcm91dCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzUmVwbGFjZShmbG9hdFtdIGluLCBmbG9hdFtdIG91dCwgZmxvYXRbXSByb3V0KSB7Ci0gICAgICAgICAgICBjX2NvcyA9IGNfY29zICogY19jb3NfZGVsdGEgLSBjX3NpbiAqIGNfc2luX2RlbHRhOwotICAgICAgICAgICAgY19zaW4gPSBjX2NvcyAqIGNfc2luX2RlbHRhICsgY19zaW4gKiBjX2Nvc19kZWx0YTsKLSAgICAgICAgICAgIHZkZWxheS5zZXREZWxheSgoZmxvYXQpIChkZXB0aCAqIDAuNSAqIChjX2NvcyArIDIpKSk7CisgICAgICAgICAgICBwaGFzZSArPSBwaGFzZV9zdGVwOworICAgICAgICAgICAgd2hpbGUocGhhc2UgPiAoTWF0aC5QSSAqIDIpKSBwaGFzZSAtPSAoTWF0aC5QSSAqIDIpOworICAgICAgICAgICAgdmRlbGF5LnNldERlbGF5KChmbG9hdCkgKGRlcHRoICogMC41ICogKE1hdGguY29zKHBoYXNlKSArIDIpKSk7CiAgICAgICAgICAgICB2ZGVsYXkucHJvY2Vzc1JlcGxhY2UoaW4sIG91dCwgcm91dCk7CiAKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vbWVkaWEvc291bmQvU29mdEZpbHRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vbWVkaWEvc291bmQvU29mdEZpbHRlci5qYXZhCmluZGV4IDA0NjhmMTUuLmM3ZWQ0ODcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRGaWx0ZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0RmlsdGVyLmphdmEKQEAgLTU0Myw4ICs1NDMsNiBAQAogCiAgICAgcHVibGljIHZvaWQgZmlsdGVyMShTb2Z0QXVkaW9CdWZmZXIgc2J1ZmZlcikgewogCi0gICAgICAgIGZsb2F0W10gYnVmZmVyID0gc2J1ZmZlci5hcnJheSgpOwotCiAgICAgICAgIGlmIChkaXJ0eSkgewogICAgICAgICAgICAgZmlsdGVyMWNhbGMoKTsKICAgICAgICAgICAgIGRpcnR5ID0gZmFsc2U7CkBAIC01NTksNiArNTU3LDcgQEAKIAogICAgICAgICBpZiAod2V0ID4gMCB8fCBsYXN0X3dldCA+IDApIHsKIAorICAgICAgICAgICAgZmxvYXRbXSBidWZmZXIgPSBzYnVmZmVyLmFycmF5KCk7CiAgICAgICAgICAgICBpbnQgbGVuID0gYnVmZmVyLmxlbmd0aDsKICAgICAgICAgICAgIGZsb2F0IGEwID0gdGhpcy5sYXN0X2EwOwogICAgICAgICAgICAgZmxvYXQgcSA9IHRoaXMubGFzdF9xOwpAQCAtNTc3LDE0ICs1NzYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgcSArPSBxX2RlbHRhOwogICAgICAgICAgICAgICAgICAgICBnYWluICs9IGdhaW5fZGVsdGE7CiAgICAgICAgICAgICAgICAgICAgIHdldCArPSB3ZXRfZGVsdGE7Ci0gICAgICAgICAgICAgICAgICAgIHkxID0gKDEgLSBxICogYTApICogeTEgLSAoYTApICogeTIgKyAoYTApICogYnVmZmVyW2ldOwotICAgICAgICAgICAgICAgICAgICB5MiA9ICgxIC0gcSAqIGEwKSAqIHkyICsgKGEwKSAqIHkxOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBnYTAgPSAoMSAtIHEgKiBhMCk7CisgICAgICAgICAgICAgICAgICAgIHkxID0gZ2EwICogeTEgKyAoYTApICogKGJ1ZmZlcltpXSAtIHkyKTsKKyAgICAgICAgICAgICAgICAgICAgeTIgPSBnYTAgKiB5MiArIChhMCkgKiB5MTsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0geTIgKiBnYWluICogd2V0ICsgYnVmZmVyW2ldICogKDEgLSB3ZXQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYTBfZGVsdGEgPT0gMCAmJiBxX2RlbHRhID09IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBnYTAgPSAoMSAtIHEgKiBhMCk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICB5MSA9ICgxIC0gcSAqIGEwKSAqIHkxIC0gKGEwKSAqIHkyICsgKGEwKSAqIGJ1ZmZlcltpXTsKLSAgICAgICAgICAgICAgICAgICAgeTIgPSAoMSAtIHEgKiBhMCkgKiB5MiArIChhMCkgKiB5MTsKKyAgICAgICAgICAgICAgICAgICAgeTEgPSBnYTAgKiB5MSArIChhMCkgKiAoYnVmZmVyW2ldIC0geTIpOworICAgICAgICAgICAgICAgICAgICB5MiA9IGdhMCAqIHkyICsgKGEwKSAqIHkxOwogICAgICAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSB5MiAqIGdhaW47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTU5Miw4ICs1OTMsOSBAQAogICAgICAgICAgICAgICAgICAgICBhMCArPSBhMF9kZWx0YTsKICAgICAgICAgICAgICAgICAgICAgcSArPSBxX2RlbHRhOwogICAgICAgICAgICAgICAgICAgICBnYWluICs9IGdhaW5fZGVsdGE7Ci0gICAgICAgICAgICAgICAgICAgIHkxID0gKDEgLSBxICogYTApICogeTEgLSAoYTApICogeTIgKyAoYTApICogYnVmZmVyW2ldOwotICAgICAgICAgICAgICAgICAgICB5MiA9ICgxIC0gcSAqIGEwKSAqIHkyICsgKGEwKSAqIHkxOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBnYTAgPSAoMSAtIHEgKiBhMCk7CisgICAgICAgICAgICAgICAgICAgIHkxID0gZ2EwICogeTEgKyAoYTApICogKGJ1ZmZlcltpXSAtIHkyKTsKKyAgICAgICAgICAgICAgICAgICAgeTIgPSBnYTAgKiB5MiArIChhMCkgKiB5MTsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0geTIgKiBnYWluOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRKaXR0ZXJDb3JyZWN0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRKaXR0ZXJDb3JyZWN0b3IuamF2YQppbmRleCA5OGQyMDViLi5iNjQ3YmE3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0Sml0dGVyQ29ycmVjdG9yLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vbWVkaWEvc291bmQvU29mdEppdHRlckNvcnJlY3Rvci5qYXZhCkBAIC0yMTYsNiArMjE2LDcgQEAKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBUaHJlYWQocnVubmFibGUpOworICAgICAgICAgICAgdGhyZWFkLnNldERhZW1vbih0cnVlKTsKICAgICAgICAgICAgIHRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUFYX1BSSU9SSVRZKTsKICAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0TG93RnJlcXVlbmN5T3NjaWxsYXRvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vbWVkaWEvc291bmQvU29mdExvd0ZyZXF1ZW5jeU9zY2lsbGF0b3IuamF2YQppbmRleCBhZGZlOWUwLi41ZTJlYTBiIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0TG93RnJlcXVlbmN5T3NjaWxsYXRvci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRMb3dGcmVxdWVuY3lPc2NpbGxhdG9yLmphdmEKQEAgLTQ1LDYgKzQ1LDEzIEBACiAgICAgcHJpdmF0ZSBkb3VibGUgc2luX2ZhY3RvciA9IDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIFBJMiA9IDIuMCAqIE1hdGguUEk7CiAKKyAgICBwdWJsaWMgU29mdExvd0ZyZXF1ZW5jeU9zY2lsbGF0b3IoKSB7CisgICAgICAgIC8vIElmIHNpbl9zdGVwIGlzIDAgdGhlbiBzaW5fc3RlcGZyZXEgbXVzdCBiZSAtSU5GCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2luX3N0ZXBmcmVxLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzaW5fc3RlcGZyZXFbaV0gPSBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2VkX2NvdW50OyBpKyspIHsKICAgICAgICAgICAgIG91dFtpXVswXSA9IDA7CkBAIC01Myw3ICs2MCw4IEBACiAgICAgICAgICAgICBmcmVxW2ldWzBdID0gMDsKICAgICAgICAgICAgIGRlbGF5X2NvdW50ZXJbaV0gPSAwOwogICAgICAgICAgICAgc2luX3BoYXNlW2ldID0gMDsKLSAgICAgICAgICAgIHNpbl9zdGVwZnJlcVtpXSA9IDA7CisgICAgICAgICAgICAvLyBJZiBzaW5fc3RlcCBpcyAwIHRoZW4gc2luX3N0ZXBmcmVxIG11c3QgYmUgLUlORgorICAgICAgICAgICAgc2luX3N0ZXBmcmVxW2ldID0gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZOwogICAgICAgICAgICAgc2luX3N0ZXBbaV0gPSAwOwogICAgICAgICB9CiAgICAgICAgIHVzZWRfY291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vbWVkaWEvc291bmQvU29mdE1haW5NaXhlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vbWVkaWEvc291bmQvU29mdE1haW5NaXhlci5qYXZhCmluZGV4IDFmMzgwNTguLmI2MmQxZDQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRNYWluTWl4ZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0TWFpbk1peGVyLmphdmEKQEAgLTQ4LDE2ICs0OCwxOCBAQAogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBTk5FTF9MRUZUID0gMDsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOTkVMX1JJR0hUID0gMTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOTkVMX0VGRkVDVDEgPSAyOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENIQU5ORUxfRUZGRUNUMiA9IDM7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBTk5FTF9FRkZFQ1QzID0gNDsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOTkVMX0VGRkVDVDQgPSA1OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENIQU5ORUxfTU9OTyA9IDI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBTk5FTF9FRkZFQ1QxID0gMzsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOTkVMX0VGRkVDVDIgPSA0OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENIQU5ORUxfRUZGRUNUMyA9IDU7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBTk5FTF9FRkZFQ1Q0ID0gNjsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOTkVMX0xFRlRfRFJZID0gMTA7CiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBTk5FTF9SSUdIVF9EUlkgPSAxMTsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOTkVMX1NDUkFUQ0gxID0gMTI7CiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hBTk5FTF9TQ1JBVENIMiA9IDEzOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENIQU5ORUxfQ0hBTk5FTE1JWEVSX0xFRlQgPSAxNDsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOTkVMX0NIQU5ORUxNSVhFUl9SSUdIVCA9IDE1OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENIQU5ORUxfQ0hBTk5FTE1JWEVSX01PTk8gPSAxNjsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY3RpdmVfc2Vuc2luZ19vbiA9IGZhbHNlOwogICAgIHByaXZhdGUgbG9uZyBtc2VjX2xhc3RfYWN0aXZpdHkgPSAtMTsKICAgICBwcml2YXRlIGJvb2xlYW4gcHVzaGVyX3NpbGVudCA9IGZhbHNlOwpAQCAtNDg1LDggKzQ4NywxMCBAQAogICAgICAgICAgICAgLy8gdG8gY2hhbm5lbG1peGVyIGxlZnQscmlnaHQgaW5wdXQvb3V0cHV0CiAgICAgICAgICAgICBTb2Z0QXVkaW9CdWZmZXIgbGVmdGJhayA9IGJ1ZmZlcnNbQ0hBTk5FTF9MRUZUXTsKICAgICAgICAgICAgIFNvZnRBdWRpb0J1ZmZlciByaWdodGJhayA9IGJ1ZmZlcnNbQ0hBTk5FTF9SSUdIVF07CisgICAgICAgICAgICBTb2Z0QXVkaW9CdWZmZXIgbW9ub2JhayA9IGJ1ZmZlcnNbQ0hBTk5FTF9NT05PXTsKICAgICAgICAgICAgIGJ1ZmZlcnNbQ0hBTk5FTF9MRUZUXSA9IGJ1ZmZlcnNbQ0hBTk5FTF9DSEFOTkVMTUlYRVJfTEVGVF07Ci0gICAgICAgICAgICBidWZmZXJzW0NIQU5ORUxfUklHSFRdID0gYnVmZmVyc1tDSEFOTkVMX0NIQU5ORUxNSVhFUl9MRUZUXTsKKyAgICAgICAgICAgIGJ1ZmZlcnNbQ0hBTk5FTF9SSUdIVF0gPSBidWZmZXJzW0NIQU5ORUxfQ0hBTk5FTE1JWEVSX1JJR0hUXTsKKyAgICAgICAgICAgIGJ1ZmZlcnNbQ0hBTk5FTF9NT05PXSA9IGJ1ZmZlcnNbQ0hBTk5FTF9DSEFOTkVMTUlYRVJfTU9OT107CiAKICAgICAgICAgICAgIGludCBidWZmZXJsZW4gPSBidWZmZXJzW0NIQU5ORUxfTEVGVF0uZ2V0U2l6ZSgpOwogCkBAIC01MDMsNiArNTA3LDcgQEAKICAgICAgICAgICAgIGZvciAoTW9kZWxDaGFubmVsTWl4ZXIgY21peGVyIDogYWN0X3JlZ2lzdGVyZWRNaXhlcnMpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNidWZmZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5maWxsKGNidWZmZXJbaV0sIDApOworICAgICAgICAgICAgICAgIGJ1ZmZlcnNbQ0hBTk5FTF9NT05PXS5jbGVhcigpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzYWN0aXZldm9pY2VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2b2ljZXN0YXR1cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWNlc3RhdHVzW2ldLmFjdGl2ZSkKQEAgLTUxNyw2ICs1MjIsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmKCFidWZmZXJzW0NIQU5ORUxfTU9OT10uaXNTaWxlbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gbW9ubyA9IGJ1ZmZlcnNbQ0hBTk5FTF9NT05PXS5hcnJheSgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIGxlZnQgPSBidWZmZXJzW0NIQU5ORUxfTEVGVF0uYXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5yb2ZjaGFubmVscyAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHJpZ2h0ID0gYnVmZmVyc1tDSEFOTkVMX1JJR0hUXS5hcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHYgPSBtb25vW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRbaV0gKz0gdjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFtpXSArPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRbaV0gKz0gbW9ub1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2J1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIGNidWZmID0gY2J1ZmZlcltpXTsKICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBvYnVmZiA9IG9idWZmZXJbaV07CkBAIC01MzksNiArNTY0LDcgQEAKIAogICAgICAgICAgICAgYnVmZmVyc1tDSEFOTkVMX0xFRlRdID0gbGVmdGJhazsKICAgICAgICAgICAgIGJ1ZmZlcnNbQ0hBTk5FTF9SSUdIVF0gPSByaWdodGJhazsKKyAgICAgICAgICAgIGJ1ZmZlcnNbQ0hBTk5FTF9NT05PXSA9IG1vbm9iYWs7CiAKICAgICAgICAgfQogCkBAIC01NDcsNiArNTczLDI3IEBACiAgICAgICAgICAgICAgICAgaWYgKHZvaWNlc3RhdHVzW2ldLmNoYW5uZWxtaXhlciA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICB2b2ljZXN0YXR1c1tpXS5wcm9jZXNzQXVkaW9Mb2dpYyhidWZmZXJzKTsKIAorICAgICAgICBpZighYnVmZmVyc1tDSEFOTkVMX01PTk9dLmlzU2lsZW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0W10gbW9ubyA9IGJ1ZmZlcnNbQ0hBTk5FTF9NT05PXS5hcnJheSgpOworICAgICAgICAgICAgZmxvYXRbXSBsZWZ0ID0gYnVmZmVyc1tDSEFOTkVMX0xFRlRdLmFycmF5KCk7CisgICAgICAgICAgICBpbnQgYnVmZmVybGVuID0gYnVmZmVyc1tDSEFOTkVMX0xFRlRdLmdldFNpemUoKTsKKyAgICAgICAgICAgIGlmIChucm9mY2hhbm5lbHMgIT0gMSkgeworICAgICAgICAgICAgICAgIGZsb2F0W10gcmlnaHQgPSBidWZmZXJzW0NIQU5ORUxfUklHSFRdLmFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB2ID0gbW9ub1tpXTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdFtpXSArPSB2OworICAgICAgICAgICAgICAgICAgICByaWdodFtpXSArPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZmZlcmxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxlZnRbaV0gKz0gbW9ub1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBSdW4gZWZmZWN0cwogICAgICAgICBpZiAoc3ludGguY2hvcnVzX29uKQogICAgICAgICAgICAgY2hvcnVzLnByb2Nlc3NBdWRpbygpOwpAQCAtNjY1LDcgKzcxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gc3ludGguZ2V0Q29udHJvbFJhdGUoKSk7CiAKICAgICAgICAgY29udHJvbF9tdXRleCA9IHN5bnRoLmNvbnRyb2xfbXV0ZXg7Ci0gICAgICAgIGJ1ZmZlcnMgPSBuZXcgU29mdEF1ZGlvQnVmZmVyWzE2XTsKKyAgICAgICAgYnVmZmVycyA9IG5ldyBTb2Z0QXVkaW9CdWZmZXJbMTddOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZmZlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGJ1ZmZlcnNbaV0gPSBuZXcgU29mdEF1ZGlvQnVmZmVyKGJ1ZmZlcnNpemUsIHN5bnRoLmdldEZvcm1hdCgpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vbWVkaWEvc291bmQvU29mdFN5bnRoZXNpemVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0U3ludGhlc2l6ZXIuamF2YQppbmRleCAzZjZjMTJmLi5hYjQ2YjJkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0U3ludGhlc2l6ZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0U3ludGhlc2l6ZXIuamF2YQpAQCAtODg5LDkgKzg4OSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAoY29udHJvbF9tdXRleCkgeworICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlRXhjZXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhbiB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAgc2V0Rm9ybWF0KGxpbmUuZ2V0Rm9ybWF0KCkpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEF1ZGlvSW5wdXRTdHJlYW0gYWlzID0gb3BlblN0cmVhbShnZXRGb3JtYXQoKSwgaW5mbyk7CiAKQEAgLTkwMCwxMCArOTAzLDEzIEBACiAKICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodGVzdGxpbmUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RsaW5lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0ZXN0bGluZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHRocm93IExpbmVVbmF2YWlsYWJsZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBBdWRpb1N5c3RlbS5nZXRTb3VyY2VEYXRhTGluZShnZXRGb3JtYXQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeSA9IHRoaXMubGF0ZW5jeTsKQEAgLTkxMSw2ICs5MTcsOCBAQAogICAgICAgICAgICAgICAgIGlmICghbGluZS5pc09wZW4oKSkgewogICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IGdldEZvcm1hdCgpLmdldEZyYW1lU2l6ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIChpbnQpKGdldEZvcm1hdCgpLmdldEZyYW1lUmF0ZSgpICogKGxhdGVuY3kvMTAwMDAwMGYpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHRocm93IExpbmVVbmF2YWlsYWJsZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICBsaW5lLm9wZW4oZ2V0Rm9ybWF0KCksIGJ1ZmZlclNpemUpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoYXQgd2Ugb3BlbmVkIHRoYXQgbGluZQpAQCAtOTU0LDEzICs5NjIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgd2Vha3N0cmVhbS5zb3VyY2VEYXRhTGluZSA9IHNvdXJjZURhdGFMaW5lOwogICAgICAgICAgICAgICAgIH0KIAotCi0KICAgICAgICAgICAgIH0gY2F0Y2ggKExpbmVVbmF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2F1c2VFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjYXVzZUV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2F1c2VFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2F1c2VFeGNlcHRpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChpc09wZW4oKSkKICAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgICAgICAgICAvLyBhbTogbmVlZCBNaWRpVW5hdmFpbGFibGVFeGNlcHRpb24oVGhyb3dhYmxlKSBjdG9yIQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaWRpVW5hdmFpbGFibGVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBNaWRpVW5hdmFpbGFibGVFeGNlcHRpb24gZXggPSBuZXcgTWlkaVVuYXZhaWxhYmxlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbiBub3Qgb3BlbiBsaW5lIik7CisgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGNhdXNlRXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgIH0KIAogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9tZWRpYS9zb3VuZC9Tb2Z0Vm9pY2UuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRWb2ljZS5qYXZhCmluZGV4IDQ5NjYyYjcuLmNlYzJlMzAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRWb2ljZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL21lZGlhL3NvdW5kL1NvZnRWb2ljZS5qYXZhCkBAIC03ODIsNiArNzgyLDcgQEAKIAogICAgICAgICBTb2Z0QXVkaW9CdWZmZXIgbGVmdCA9IGJ1ZmZlcltTb2Z0TWFpbk1peGVyLkNIQU5ORUxfTEVGVF07CiAgICAgICAgIFNvZnRBdWRpb0J1ZmZlciByaWdodCA9IGJ1ZmZlcltTb2Z0TWFpbk1peGVyLkNIQU5ORUxfUklHSFRdOworICAgICAgICBTb2Z0QXVkaW9CdWZmZXIgbW9ubyA9IGJ1ZmZlcltTb2Z0TWFpbk1peGVyLkNIQU5ORUxfTU9OT107CiAgICAgICAgIFNvZnRBdWRpb0J1ZmZlciBlZmYxID0gYnVmZmVyW1NvZnRNYWluTWl4ZXIuQ0hBTk5FTF9FRkZFQ1QxXTsKICAgICAgICAgU29mdEF1ZGlvQnVmZmVyIGVmZjIgPSBidWZmZXJbU29mdE1haW5NaXhlci5DSEFOTkVMX0VGRkVDVDJdOwogICAgICAgICBTb2Z0QXVkaW9CdWZmZXIgbGVmdGRyeSA9IGJ1ZmZlcltTb2Z0TWFpbk1peGVyLkNIQU5ORUxfTEVGVF9EUlldOwpAQCAtODAzLDEzICs4MDQsMjIgQEAKICAgICAgICAgICAgICAgICBtaXhBdWRpb1N0cmVhbShyaWdodGRyeSwgbGVmdCwgbGFzdF9vdXRfbWl4ZXJfbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9taXhlcl9sZWZ0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1peEF1ZGlvU3RyZWFtKGxlZnRkcnksIGxlZnQsIGxhc3Rfb3V0X21peGVyX2xlZnQsIG91dF9taXhlcl9sZWZ0KTsKLSAgICAgICAgICAgIGlmIChyaWdodGRyeSAhPSBudWxsKQotICAgICAgICAgICAgICAgIG1peEF1ZGlvU3RyZWFtKHJpZ2h0ZHJ5LCByaWdodCwgbGFzdF9vdXRfbWl4ZXJfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRfbWl4ZXJfcmlnaHQpOworICAgICAgICAgICAgaWYocmlnaHRkcnkgPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBsYXN0X291dF9taXhlcl9sZWZ0ID09IGxhc3Rfb3V0X21peGVyX3JpZ2h0ICYmCisgICAgICAgICAgICAgICAgICAgIG91dF9taXhlcl9sZWZ0ID09IG91dF9taXhlcl9yaWdodCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtaXhBdWRpb1N0cmVhbShsZWZ0ZHJ5LCBtb25vLCBsYXN0X291dF9taXhlcl9sZWZ0LCBvdXRfbWl4ZXJfbGVmdCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWl4QXVkaW9TdHJlYW0obGVmdGRyeSwgcmlnaHQsIGxhc3Rfb3V0X21peGVyX3JpZ2h0LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1peEF1ZGlvU3RyZWFtKGxlZnRkcnksIGxlZnQsIGxhc3Rfb3V0X21peGVyX2xlZnQsIG91dF9taXhlcl9sZWZ0KTsKKyAgICAgICAgICAgICAgICBpZiAocmlnaHRkcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgbWl4QXVkaW9TdHJlYW0ocmlnaHRkcnksIHJpZ2h0LCBsYXN0X291dF9taXhlcl9yaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9taXhlcl9yaWdodCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtaXhBdWRpb1N0cmVhbShsZWZ0ZHJ5LCByaWdodCwgbGFzdF9vdXRfbWl4ZXJfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbWl4ZXJfcmlnaHQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHJpZ2h0ZHJ5ID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9Db2xvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0NvbG9yLmphdmEKaW5kZXggZjk5ZTJiZi4uMDcxMGRiYiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0NvbG9yLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0NvbG9yLmphdmEKQEAgLTY4Nyw3ICs2ODcsNyBAQAogICAgICAqIEBzaW5jZSAgIEpESzEuMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBDb2xvciAmJiAoKENvbG9yKW9iaikudmFsdWUgPT0gdGhpcy52YWx1ZTsKKyAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENvbG9yICYmICgoQ29sb3Ipb2JqKS5nZXRSR0IoKSA9PSB0aGlzLmdldFJHQigpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0NvbXBvbmVudC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0NvbXBvbmVudC5qYXZhCmluZGV4IDAzNzQzMzMuLjg0ZDdhODEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9Db21wb25lbnQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvQ29tcG9uZW50LmphdmEKQEAgLTY2NjYsNyArNjY2Niw3IEBACiAKIAogICAgICAgICAgICAgLy8gVXBkYXRlIHN0YWNraW5nIG9yZGVyCi0gICAgICAgICAgICBwZWVyLnNldFpPcmRlcihnZXRIV1BlZXJBYm92ZU1lKCkpOworICAgICAgICAgICAgdXBkYXRlWk9yZGVyKCk7CiAKICAgICAgICAgICAgIGlmICghaXNBZGROb3RpZnlDb21wbGV0ZSkgewogICAgICAgICAgICAgICAgIG1peE9uU2hvd2luZygpOwpAQCAtOTgzOCw0ICs5ODM4LDExIEBACiAKICAgICAgICAgcmV0dXJuIGRvZXNDbGFzc0ltcGxlbWVudChvYmouZ2V0Q2xhc3MoKSwgaW50ZXJmYWNlTmFtZSk7CiAgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHRoZSBtZXRob2QgaXMgb3ZlcnJpZGVuIGluIHRoZSBXaW5kb3cgY2xhc3MsCisgICAgLy8gYSB3aW5kb3cgZG9lc24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQgaW4gdGhlIFotb3JkZXIuCisgICAgdm9pZCB1cGRhdGVaT3JkZXIoKSB7CisgICAgICAgIHBlZXIuc2V0Wk9yZGVyKGdldEhXUGVlckFib3ZlTWUoKSk7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvQ29udGFpbmVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvQ29udGFpbmVyLmphdmEKaW5kZXggOWExODRhNy4uMzA1YTRmZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0NvbnRhaW5lci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9Db250YWluZXIuamF2YQpAQCAtODQwLDcgKzg0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSBjb250YWluZXIgY2hhbmdlZCAtIG5lZWQgdG8gcmVwYXJlbnQgbmF0aXZlIHdpZGdldHMKICAgICAgICAgICAgICAgICAgICAgbmV3TmF0aXZlQ29udGFpbmVyLnJlcGFyZW50Q2hpbGQoY29tcCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbXAucGVlci5zZXRaT3JkZXIoY29tcC5nZXRIV1BlZXJBYm92ZU1lKCkpOworICAgICAgICAgICAgICAgIGNvbXAudXBkYXRlWk9yZGVyKCk7CiAKICAgICAgICAgICAgICAgICBpZiAoIWNvbXAuaXNMaWdodHdlaWdodCgpICYmIGlzTGlnaHR3ZWlnaHQoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBJZiBjb21wb25lbnQgaXMgaGVhdnl3ZWlnaHQgYW5kIG9uZSBvZiB0aGUgY29udGFpbmVycyBpcyBsaWdodHdlaWdodApAQCAtMzk3NywxMCArMzk3Nyw4IEBACiAgICAgICAgICAgICBDb21wb25lbnQgY29tcCA9IGdldENvbXBvbmVudChpbmRleCk7CiAgICAgICAgICAgICBpZiAoIWNvbXAuaXNMaWdodHdlaWdodCgpKSB7CiAgICAgICAgICAgICAgICAgY29tcC5hcHBseUN1cnJlbnRTaGFwZSgpOwotICAgICAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgQ29udGFpbmVyICYmICgoQ29udGFpbmVyKWNvbXApLmdldExheW91dCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb250YWluZXIpY29tcCkucmVjdXJzaXZlQXBwbHlDdXJyZW50U2hhcGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb250YWluZXIgJiYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgQ29udGFpbmVyICYmCiAgICAgICAgICAgICAgICAgICAgICgoQ29udGFpbmVyKWNvbXApLmhhc0hlYXZ5d2VpZ2h0RGVzY2VuZGFudHMoKSkgewogICAgICAgICAgICAgICAgICgoQ29udGFpbmVyKWNvbXApLnJlY3Vyc2l2ZUFwcGx5Q3VycmVudFNoYXBlKCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvRm9udC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0ZvbnQuamF2YQppbmRleCAwMWY0MDFlLi5mNzNlMGU5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvRm9udC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9Gb250LmphdmEKQEAgLTM3LDYgKzM3LDggQEAKIGltcG9ydCBqYXZhLmF3dC5wZWVyLkZvbnRQZWVyOwogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZTsKIGltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7CiBpbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOwpAQCAtNTEsNiArNTMsNyBAQAogaW1wb3J0IHN1bi5mb250LkF0dHJpYnV0ZVZhbHVlczsKIGltcG9ydCBzdW4uZm9udC5FQXR0cmlidXRlOwogaW1wb3J0IHN1bi5mb250LkNvbXBvc2l0ZUZvbnQ7CitpbXBvcnQgc3VuLmZvbnQuQ3JlYXRlZEZvbnRUcmFja2VyOwogaW1wb3J0IHN1bi5mb250LkZvbnQyRDsKIGltcG9ydCBzdW4uZm9udC5Gb250MkRIYW5kbGU7CiBpbXBvcnQgc3VuLmZvbnQuRm9udE1hbmFnZXI7CkBAIC01NzUsMTQgKzU3OCwxNiBAQAogICAgIH0KIAogICAgIC8qIHVzZWQgdG8gaW1wbGVtZW50IEZvbnQuY3JlYXRlRm9udCAqLwotICAgIHByaXZhdGUgRm9udChGaWxlIGZvbnRGaWxlLCBpbnQgZm9udEZvcm1hdCwgYm9vbGVhbiBpc0NvcHkpCisgICAgcHJpdmF0ZSBGb250KEZpbGUgZm9udEZpbGUsIGludCBmb250Rm9ybWF0LAorICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ29weSwgQ3JlYXRlZEZvbnRUcmFja2VyIHRyYWNrZXIpCiAgICAgICAgIHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jcmVhdGVkRm9udCA9IHRydWU7CiAgICAgICAgIC8qIEZvbnQyRCBpbnN0YW5jZXMgY3JlYXRlZCBieSB0aGlzIG1ldGhvZCB0cmFjayB0aGVpciBmb250IGZpbGUKICAgICAgICAgICogc28gdGhhdCB3aGVuIHRoZSBGb250MkQgaXMgR0MnZCBpdCBjYW4gYWxzbyByZW1vdmUgdGhlIGZpbGUuCiAgICAgICAgICAqLwogICAgICAgICB0aGlzLmZvbnQyREhhbmRsZSA9Ci0gICAgICAgICAgICBGb250TWFuYWdlci5jcmVhdGVGb250MkQoZm9udEZpbGUsIGZvbnRGb3JtYXQsIGlzQ29weSkuaGFuZGxlOworICAgICAgICAgICAgRm9udE1hbmFnZXIuY3JlYXRlRm9udDJEKGZvbnRGaWxlLCBmb250Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29weSwgdHJhY2tlcikuaGFuZGxlOwogICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmZvbnQyREhhbmRsZS5mb250MkQuZ2V0Rm9udE5hbWUoTG9jYWxlLmdldERlZmF1bHQoKSk7CiAgICAgICAgIHRoaXMuc3R5bGUgPSBGb250LlBMQUlOOwogICAgICAgICB0aGlzLnNpemUgPSAxOwpAQCAtNzg4LDYgKzc5MywyOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFVzZWQgd2l0aCB0aGUgYnl0ZSBjb3VudCB0cmFja2VyIGZvciBmb250cyBjcmVhdGVkIGZyb20gc3RyZWFtcy4KKyAgICAgKiBJZiBhIHRocmVhZCBjYW4gY3JlYXRlIHRlbXAgZmlsZXMgYW55d2F5LCBubyBwb2ludCBpbiBjb3VudGluZworICAgICAqIGZvbnQgYnl0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNUZW1wUGVybWlzc2lvbigpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEZpbGUgZiA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaGFzUGVybSA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIit+SlQiLCAiLnRtcCIsIG51bGwpOworICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIGYgPSBudWxsOworICAgICAgICAgICAgaGFzUGVybSA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAvKiBpbmMuIGFueSBraW5kIG9mIFNlY3VyaXR5RXhjZXB0aW9uICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc1Blcm07CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG5ldyA8Y29kZT5Gb250PC9jb2RlPiB1c2luZyB0aGUgc3BlY2lmaWVkIGZvbnQgdHlwZQogICAgICAqIGFuZCBpbnB1dCBkYXRhLiAgVGhlIG5ldyA8Y29kZT5Gb250PC9jb2RlPiBpcwogICAgICAqIGNyZWF0ZWQgd2l0aCBhIHBvaW50IHNpemUgb2YgMSBhbmQgc3R5bGUge0BsaW5rICNQTEFJTiBQTEFJTn0uCkBAIC04MjIsNTggKzg1MCw5NiBAQAogICAgICAgICAgICAgZm9udEZvcm1hdCAhPSBGb250LlRZUEUxX0ZPTlQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKCJmb250IGZvcm1hdCBub3QgcmVjb2duaXplZCIpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGZTdHJlYW0gPSBmb250U3RyZWFtOwotICAgICAgICBPYmplY3QgcmV0ID0gamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgbmV3IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICBGaWxlIHRGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgdEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCIrfkpGIiwgIi50bXAiLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAvKiBUZW1wIGZpbGUgZGVsZXRlZCBieSBmb250IHNodXRkb3duIGhvb2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZlN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgIGludCBidWZTaXplID0gODE5MjsKLSAgICAgICAgICAgICAgICAgICAgICBieXRlIFtdIGJ1ZiA9IG5ldyBieXRlW2J1ZlNpemVdOwotICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChieXRlc1JlYWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCA9IGluU3RyZWFtLnJlYWQoYnVmLCAwLCBidWZTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS53cml0ZShidWYsIDAsIGJ5dGVzUmVhZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgY2xvc2UgdGhlIGlucHV0IHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGlmICh0RmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRGaWxlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfSk7CisgICAgICAgIGJvb2xlYW4gY29waWVkRm9udERhdGEgPSBmYWxzZTsKIAotICAgICAgICBpZiAocmV0IGluc3RhbmNlb2YgRmlsZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGb250KChGaWxlKXJldCwgZm9udEZvcm1hdCwgdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbilyZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRm9udEZvcm1hdEV4Y2VwdGlvbigiQ291bGRuJ3QgYWNjZXNzIGZvbnQgc3RyZWFtIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBGaWxlIHRGaWxlID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248RmlsZT4oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBGaWxlIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZSgiK35KRiIsICIudG1wIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICBpbnQgdG90YWxTaXplID0gMDsKKyAgICAgICAgICAgIENyZWF0ZWRGb250VHJhY2tlciB0cmFja2VyID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248T3V0cHV0U3RyZWFtPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbSh0RmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGlmICghaGFzVGVtcFBlcm1pc3Npb24oKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFja2VyID0gQ3JlYXRlZEZvbnRUcmFja2VyLmdldFRyYWNrZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gZm9udFN0cmVhbS5yZWFkKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbFNpemUrYnl0ZXNSZWFkID4gdHJhY2tlci5NQVhfRklMRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmlsZSB0b28gYmlnLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxTaXplK3RyYWNrZXIuZ2V0TnVtQnl0ZXMoKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXIuTUFYX1RPVEFMX0JZVEVTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRvdGFsIGZpbGVzIHRvbyBiaWcuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlci5hZGRCeXRlcyhieXRlc1JlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLndyaXRlKGJ1ZiwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBjbG9zZSB0aGUgaW5wdXQgc3RyZWFtICovCisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEFmdGVyIGFsbCByZWZlcmVuY2VzIHRvIGEgRm9udDJEIGFyZSBkcm9wcGVkLCB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAqIHdpbGwgYmUgcmVtb3ZlZC4gVG8gc3VwcG9ydCBsb25nLWxpdmVkIEFwcENvbnRleHRzLAorICAgICAgICAgICAgICAgICAqIHdlIG5lZWQgdG8gdGhlbiBkZWNyZW1lbnQgdGhlIGJ5dGUgY291bnQgYnkgdGhlIHNpemUKKyAgICAgICAgICAgICAgICAgKiBvZiB0aGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgKiBJZiB0aGUgZGF0YSBpc24ndCBhIHZhbGlkIGZvbnQsIHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsCisgICAgICAgICAgICAgICAgICogZGVsZXRlIHRoZSB0bXAgZmlsZSBhbmQgZGVjcmVtZW50IHRoZSBieXRlIGNvdW50CisgICAgICAgICAgICAgICAgICogaW4gdGhlIHRyYWNrZXIgb2JqZWN0IGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgKiBjb25zdHJ1Y3Rvciwgc28gd2UgY2FuIHNldCAnY29waWVkRm9udERhdGEnIHRvIHRydWUgaGVyZQorICAgICAgICAgICAgICAgICAqIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHJlc3VsdHMgb2YgdGhhdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjb3BpZWRGb250RGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgRm9udCBmb250ID0gbmV3IEZvbnQodEZpbGUsIGZvbnRGb3JtYXQsIHRydWUsIHRyYWNrZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBmb250OworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvcGllZEZvbnREYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXIuc3ViQnl0ZXModG90YWxTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPFZvaWQ+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBWb2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEZvbnRGb3JtYXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoRm9udEZvcm1hdEV4Y2VwdGlvbil0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbil0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gdC5nZXRDYXVzZSgpOworICAgICAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRm9udEZvcm1hdEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChGb250Rm9ybWF0RXhjZXB0aW9uKWNhdXNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgZm9udCBkYXRhLiIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MTMsNiArOTc5LDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZvbnQgY3JlYXRlRm9udChpbnQgZm9udEZvcm1hdCwgRmlsZSBmb250RmlsZSkKICAgICAgICAgdGhyb3dzIGphdmEuYXd0LkZvbnRGb3JtYXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworCisgICAgICAgIGZvbnRGaWxlID0gbmV3IEZpbGUoZm9udEZpbGUuZ2V0UGF0aCgpKTsKKwogICAgICAgICBpZiAoZm9udEZvcm1hdCAhPSBGb250LlRSVUVUWVBFX0ZPTlQgJiYKICAgICAgICAgICAgIGZvbnRGb3JtYXQgIT0gRm9udC5UWVBFMV9GT05UKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICgiZm9udCBmb3JtYXQgbm90IHJlY29nbml6ZWQiKTsKQEAgLTkyNiw3ICs5OTUsNyBAQAogICAgICAgICBpZiAoIWZvbnRGaWxlLmNhblJlYWQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW4ndCByZWFkICIgKyBmb250RmlsZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBGb250KGZvbnRGaWxlLCBmb250Rm9ybWF0LCBmYWxzZSk7CisgICAgICAgIHJldHVybiBuZXcgRm9udChmb250RmlsZSwgZm9udEZvcm1hdCwgZmFsc2UsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0dyYXBoaWNzQ29uZmlndXJhdGlvbi5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0dyYXBoaWNzQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IGM1MjBkMzEuLjIzYWZlOGIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9HcmFwaGljc0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvR3JhcGhpY3NDb25maWd1cmF0aW9uLmphdmEKQEAgLTQ0MCwxMyArNDQwLDE0IEBACiAgICAgICogdGhlIHtAbGluayBHcmFwaGljc0RldmljZS5XaW5kb3dUcmFuc2x1Y2VuY3kjUEVSUElYRUxfVFJBTlNMVUNFTlQKICAgICAgKiBQRVJQSVhFTF9UUkFOU0xVQ0VOVH0ga2luZCBvZiB0cmFuc2x1Y2VuY3kuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZ2MgR3JhcGhpY3NDb25maWd1cmF0aW9uCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2MgYXJndW1lbnQgaXMgbnVsbAogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gR3JhcGhpY3NDb25maWd1cmF0aW9uIHN1cHBvcnRzCiAgICAgICogICAgICAgICB0aGUgdHJhbnNsdWNlbmN5IGVmZmVjdHMuCisgICAgICoKICAgICAgKiBAc2VlIFdpbmRvdyNzZXRCYWNrZ3JvdW5kKENvbG9yKQorICAgICAqCisgICAgICogQHNpbmNlIDEuNwogICAgICAqLwotICAgIC8qcHVibGljICovYm9vbGVhbiBpc1RyYW5zbHVjZW5jeUNhcGFibGUoKSB7CisgICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2x1Y2VuY3lDYXBhYmxlKCkgewogICAgICAgICAvLyBPdmVycmlkZGVuIGluIHN1YmNsYXNzZXMKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9HcmFwaGljc0RldmljZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKaW5kZXggOTIwNjg3MS4uYzdkOWIxMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKQEAgLTExMiwxMCArMTEyLDE0IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFlQRV9JTUFHRV9CVUZGRVIgICAgICAgICAgID0gMjsKIAotICAgIC8qKiBLaW5kcyBvZiB0cmFuc2x1Y2VuY3kgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN5c3RlbS4KLSAgICAgKiAgQHNlZSAjaXNUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQKKyAgICAvKioKKyAgICAgKiBLaW5kcyBvZiB0cmFuc2x1Y2VuY3kgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBzZWUgI2lzV2luZG93VHJhbnNsdWNlbmN5U3VwcG9ydGVkCisgICAgICoKKyAgICAgKiBAc2luY2UgMS43CiAgICAgICovCi0gICAgLypwdWJsaWMgKi9zdGF0aWMgZW51bSBXaW5kb3dUcmFuc2x1Y2VuY3kgeworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBXaW5kb3dUcmFuc2x1Y2VuY3kgewogICAgICAgICAvKioKICAgICAgICAgICogUmVwcmVzZW50cyBzdXBwb3J0IGluIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBmb3Igd2luZG93cyBlYWNoIHBpeGVsCiAgICAgICAgICAqIG9mIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgZWl0aGVyIGNvbXBsZXRlbHkgb3BhcXVlLCB3aXRoCkBAIC0yNDYsMzggKzI1MCw0NCBAQAogICAgICAqIGZ1bGwtc2NyZWVuIHdpbmRvdyBpcyBub3QgdmlzaWJsZSwgdGhpcyBtZXRob2Qgd2lsbCBtYWtlIGl0IHZpc2libGUuCiAgICAgICogSXQgd2lsbCByZW1haW4gdmlzaWJsZSB3aGVuIHJldHVybmluZyB0byB3aW5kb3dlZCBtb2RlLgogICAgICAqIDxwPgotICAgICAqIFdoZW4gcmV0dXJuaW5nIHRvIHdpbmRvd2VkIG1vZGUgZnJvbSBhbiBleGNsdXNpdmUgZnVsbC1zY3JlZW4gd2luZG93LCBhbnkKLSAgICAgKiBkaXNwbGF5IGNoYW5nZXMgbWFkZSBieSBjYWxsaW5nIDxjb2RlPnNldERpc3BsYXlNb2RlPC9jb2RlPiBhcmUKKyAgICAgKiBXaGVuIGVudGVyaW5nIGZ1bGwtc2NyZWVuIG1vZGUsIGFsbCB0aGUgdHJhbnNsdWNlbmN5IGVmZmVjdHMgYXJlIHJlc2V0IGZvcgorICAgICAqIHRoZSB3aW5kb3cuIEl0cyBzaGFwZSBpcyBzZXQgdG8ge0Bjb2RlIG51bGx9LCB0aGUgb3BhY2l0eSB2YWx1ZSBpcyBzZXQgdG8KKyAgICAgKiAxLjBmLCBhbmQgdGhlIGJhY2tncm91bmQgY29sb3IgYWxwaGEgaXMgc2V0IHRvIDI1NSAoY29tcGxldGVseSBvcGFxdWUpLgorICAgICAqIFRoZXNlIHZhbHVlcyBhcmUgbm90IHJlc3RvcmVkIHdoZW4gcmV0dXJuaW5nIHRvIHdpbmRvd2VkIG1vZGUuCisgICAgICogPHA+CisgICAgICogV2hlbiByZXR1cm5pbmcgdG8gd2luZG93ZWQgbW9kZSBmcm9tIGFuIGV4Y2x1c2l2ZSBmdWxsLXNjcmVlbiB3aW5kb3csCisgICAgICogYW55IGRpc3BsYXkgY2hhbmdlcyBtYWRlIGJ5IGNhbGxpbmcge0Bjb2RlIHNldERpc3BsYXlNb2RlfSBhcmUKICAgICAgKiBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLgogICAgICAqCi0gICAgICogQHBhcmFtIHcgYSB3aW5kb3cgdG8gdXNlIGFzIHRoZSBmdWxsLXNjcmVlbiB3aW5kb3c7IDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHBhcmFtIHcgYSB3aW5kb3cgdG8gdXNlIGFzIHRoZSBmdWxsLXNjcmVlbiB3aW5kb3c7IHtAY29kZSBudWxsfQogICAgICAqIGlmIHJldHVybmluZyB0byB3aW5kb3dlZCBtb2RlLiAgU29tZSBwbGF0Zm9ybXMgZXhwZWN0IHRoZQogICAgICAqIGZ1bGxzY3JlZW4gd2luZG93IHRvIGJlIGEgdG9wLWxldmVsIGNvbXBvbmVudCAoaS5lLiwgYSBGcmFtZSk7CiAgICAgICogdGhlcmVmb3JlIGl0IGlzIHByZWZlcmFibGUgdG8gdXNlIGEgRnJhbWUgaGVyZSByYXRoZXIgdGhhbiBhCiAgICAgICogV2luZG93LgorICAgICAqCiAgICAgICogQHNlZSAjaXNGdWxsU2NyZWVuU3VwcG9ydGVkCiAgICAgICogQHNlZSAjZ2V0RnVsbFNjcmVlbldpbmRvdwogICAgICAqIEBzZWUgI3NldERpc3BsYXlNb2RlCiAgICAgICogQHNlZSBDb21wb25lbnQjZW5hYmxlSW5wdXRNZXRob2RzCiAgICAgICogQHNlZSBDb21wb25lbnQjc2V0VmlzaWJsZQorICAgICAqCiAgICAgICogQHNpbmNlIDEuNAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxTY3JlZW5XaW5kb3coV2luZG93IHcpIHsKICAgICAgICAgaWYgKHcgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9YWFg6IFRoZSBhY3Rpb25zIHNob3VsZCBiZSBkb2N1bWVudGVkIGluIHNvbWUgbm9uLXVwZGF0ZSByZWxlYXNlLgotICAgICAgICAgICAgLyoKICAgICAgICAgICAgIGlmICh3LmdldFNoYXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHcuc2V0U2hhcGUodywgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXcuaXNPcGFxdWUoKSkgewotICAgICAgICAgICAgICAgIHcuc2V0T3BhcXVlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB3LnNldFNoYXBlKG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHcuZ2V0T3BhY2l0eSgpIDwgMS4wZikgewogICAgICAgICAgICAgICAgIHcuc2V0T3BhY2l0eSgxLjBmKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICovCisgICAgICAgICAgICBDb2xvciBiZ0NvbG9yID0gdy5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICBpZiAoYmdDb2xvci5nZXRBbHBoYSgpIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgYmdDb2xvciA9IG5ldyBDb2xvcihiZ0NvbG9yLmdldFJlZCgpLCBiZ0NvbG9yLmdldEdyZWVuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ0NvbG9yLmdldEJsdWUoKSwgMjU1KTsKKyAgICAgICAgICAgICAgICB3LnNldEJhY2tncm91bmQoYmdDb2xvcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoZnVsbFNjcmVlbldpbmRvdyAhPSBudWxsICYmIHdpbmRvd2VkTW9kZUJvdW5kcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBpZiB0aGUgd2luZG93IHdlbnQgaW50byBmcyBtb2RlIGJlZm9yZSBpdCB3YXMgcmVhbGl6ZWQgaXQgbWF5CiAgICAgICAgICAgICAvLyBoYXZlICgwLDApIGRpbWVuc2lvbnMKQEAgLTQ2OSwxMyArNDc5LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBsZXZlbCBvZiB0cmFuc2x1Y2VuY3kgaXMgc3VwcG9ydGVkCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBsZXZlbCBvZiB0cmFuc2x1Y2VuY3kgaXMgc3VwcG9ydGVkIGJ5CiAgICAgICogdGhpcyBncmFwaGljcyBkZXZpY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdHJhbnNsdWNlbmN5S2luZCBhIGtpbmQgb2YgdHJhbnNsdWNlbmN5IHN1cHBvcnQKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHRyYW5zbHVjZW5jeSBraW5kIGlzIHN1cHBvcnRlZAorICAgICAqCisgICAgICogQHNpbmNlIDEuNwogICAgICAqLwotICAgIC8qcHVibGljICovYm9vbGVhbiBpc1dpbmRvd1RyYW5zbHVjZW5jeVN1cHBvcnRlZChXaW5kb3dUcmFuc2x1Y2VuY3kgdHJhbnNsdWNlbmN5S2luZCkgeworICAgIHB1YmxpYyBib29sZWFuIGlzV2luZG93VHJhbnNsdWNlbmN5U3VwcG9ydGVkKFdpbmRvd1RyYW5zbHVjZW5jeSB0cmFuc2x1Y2VuY3lLaW5kKSB7CiAgICAgICAgIHN3aXRjaCAodHJhbnNsdWNlbmN5S2luZCkgewogICAgICAgICAgICAgY2FzZSBQRVJQSVhFTF9UUkFOU1BBUkVOVDoKICAgICAgICAgICAgICAgICByZXR1cm4gaXNXaW5kb3dTaGFwaW5nU3VwcG9ydGVkKCk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvV2luZG93LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvV2luZG93LmphdmEKaW5kZXggMDFkOWZmNS4uZDk5MTY0NyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L1dpbmRvdy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9XaW5kb3cuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5QYXRoMkQ7CiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5Qb2ludDJEOwogaW1wb3J0IGphdmEuYXd0LmltLklucHV0Q29udGV4dDsKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJTdHJhdGVneTsKQEAgLTI5Nyw2ICsyOTgsNyBAQAogICAgIC8qCiAgICAgICogT3BhY2l0eSBsZXZlbCBvZiB0aGUgd2luZG93CiAgICAgICoKKyAgICAgKiBAc2VyaWFsCiAgICAgICogQHNlZSAjc2V0T3BhY2l0eShmbG9hdCkKICAgICAgKiBAc2VlICNnZXRPcGFjaXR5KCkKICAgICAgKiBAc2luY2UgMS43CkBAIC0zMDcsNiArMzA5LDcgQEAKICAgICAgKiBUaGUgc2hhcGUgYXNzaWduZWQgdG8gdGhpcyB3aW5kb3cuIFRoaXMgZmllbGQgaXMgc2V0IHRvIG51bGwgaWYKICAgICAgKiBubyBzaGFwZSBpcyBzZXQgKHJlY3Rhbmd1bGFyIHdpbmRvdykuCiAgICAgICoKKyAgICAgKiBAc2VyaWFsCiAgICAgICogQHNlZSAjZ2V0U2hhcGUoKQogICAgICAqIEBzZWUgI3NldFNoYXBlKFNoYXBlKQogICAgICAqIEBzaW5jZSAxLjcKQEAgLTMzNDAsMzIgKzMzNDMsNzggQEAKICAgICAvLyAqKioqKioqKioqKioqKioqKioqKiBTSEFQRVMgJiBUUkFOU1BBUkVOQ1kgQ09ERSAqKioqKioqKioqKioqKioqKioqKgogCiAgICAgLyoqCi0gICAgICogSmF2YURvYworICAgICAqIFJldHVybnMgdGhlIG9wYWNpdHkgb2YgdGhlIHdpbmRvdy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG9wYWNpdHkgb2YgdGhlIHdpbmRvdworICAgICAqCisgICAgICogQHNlZSBXaW5kb3cjc2V0T3BhY2l0eQorICAgICAqIEBzZWUgR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5CisgICAgICoKKyAgICAgKiBAc2luY2UgMS43CiAgICAgICovCi0gICAgLypwdWJsaWMgKi9mbG9hdCBnZXRPcGFjaXR5KCkgeworICAgIHB1YmxpYyBmbG9hdCBnZXRPcGFjaXR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKGdldFRyZWVMb2NrKCkpIHsKICAgICAgICAgICAgIHJldHVybiBvcGFjaXR5OwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSmF2YURvYworICAgICAqIFNldHMgdGhlIG9wYWNpdHkgb2YgdGhlIHdpbmRvdy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgb3BhY2l0eSB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWzAuLjFdLiBOb3RlIHRoYXQgc2V0dGluZyB0aGUgb3BhY2l0eQorICAgICAqIGxldmVsIG9mIDAgbWF5IG9yIG1heSBub3QgZGlzYWJsZSB0aGUgbW91c2UgZXZlbnQgaGFuZGxpbmcgb24gdGhpcworICAgICAqIHdpbmRvdy4gVGhpcyBpcyBhIHBsYXRmb3JtLWRlcGVuZGVudCBiZWhhdmlvci4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiBvcmRlciBmb3IgdGhpcyBtZXRob2QgdG8gZW5hYmxlIHRoZSB0cmFuc2x1Y2VuY3kgZWZmZWN0LCB0aGUge0BsaW5rCisgICAgICogR3JhcGhpY3NEZXZpY2UjaXNXaW5kb3dUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoKX0gbWV0aG9kIG11c3QgaW5kaWNhdGUgdGhhdAorICAgICAqIHRoZSB7QGxpbmsgR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5I1RSQU5TTFVDRU5UIFRSQU5TTFVDRU5UfQorICAgICAqIHRyYW5zbHVjZW5jeSBpcyBzdXBwb3J0ZWQuCisgICAgICogPHA+CisgICAgICogQWxzbyBub3RlIHRoYXQgdGhlIHdpbmRvdyBtdXN0IG5vdCBiZSBpbiB0aGUgZnVsbC1zY3JlZW4gbW9kZSB3aGVuCisgICAgICogc2V0dGluZyB0aGUgb3BhY2l0eSB2YWx1ZSAmbHQ7IDEuMGYuIE90aGVyd2lzZSB0aGUge0Bjb2RlCisgICAgICogSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICogPHA+CisgICAgICogVGhlIHRyYW5zbHVjZW5jeSBsZXZlbHMgb2YgaW5kaXZpZHVhbCBwaXhlbHMgbWF5IGFsc28gYmUgZWZmZWN0ZWQgYnkgdGhlCisgICAgICogYWxwaGEgY29tcG9uZW50IG9mIHRoZWlyIGNvbG9yIChzZWUge0BsaW5rIHNldEJhY2tncm91bmQoKX0pIGFuZCB0aGUKKyAgICAgKiBjdXJyZW50IHNoYXBlIG9mIHRoaXMgd2luZG93IChzZWUge0BsaW5rIHNldFNoYXBlKCl9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGFjaXR5IHRoZSBvcGFjaXR5IGxldmVsIHRvIHNldCB0byB0aGUgd2luZG93CisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgb3BhY2l0eSBpcyBvdXQgb2YgdGhlIHJhbmdlCisgICAgICogICAgIFswLi4xXQorICAgICAqIEB0aHJvd3MgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIGlmIHRoZSB3aW5kb3cgaXMgaW4gZnVsbCBzY3JlZW4KKyAgICAgKiAgICAgbW9kZSwgYW5kIHRoZSBvcGFjaXR5IGlzIGxlc3MgdGhhbiAxLjBmCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUge0Bjb2RlCisgICAgICogICAgIEdyYXBoaWNzRGV2aWNlLldpbmRvd1RyYW5zbHVjZW5jeSNUUkFOU0xVQ0VOVCBUUkFOU0xVQ0VOVH0KKyAgICAgKiAgICAgdHJhbnNsdWNlbmN5IGtpbmQgaXMgbm90IHN1cHBvcnRlZCBhbmQgdGhlIG9wYWNpdHkgaXMgbGVzcyB0aGFuIDEuMGYKKyAgICAgKgorICAgICAqIEBzZWUgV2luZG93I2dldE9wYWNpdHkKKyAgICAgKiBAc2VlIFdpbmRvdyNzZXRCYWNrZ3JvdW5kKCkKKyAgICAgKiBAc2VlIFdpbmRvdyNzZXRTaGFwZSgpCisgICAgICogQHNlZSBHcmFwaGljc0RldmljZS5XaW5kb3dUcmFuc2x1Y2VuY3kKKyAgICAgKiBAc2VlIEdyYXBoaWNzRGV2aWNlI2lzV2luZG93VHJhbnNsdWNlbmN5U3VwcG9ydGVkKCkKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjcKICAgICAgKi8KLSAgICAvKnB1YmxpYyAqL3ZvaWQgc2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5KSB7CisgICAgcHVibGljIHZvaWQgc2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoZ2V0VHJlZUxvY2soKSkgewogICAgICAgICAgICAgaWYgKG9wYWNpdHkgPCAwLjBmIHx8IG9wYWNpdHkgPiAxLjBmKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSBvZiBvcGFjaXR5IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgWzAuMGYgLi4gMS4wZl0uIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MgPSBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIEdyYXBoaWNzRGV2aWNlIGdkID0gZ2MuZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoIWdkLmlzV2luZG93VHJhbnNsdWNlbmN5U3VwcG9ydGVkKEdyYXBoaWNzRGV2aWNlLldpbmRvd1RyYW5zbHVjZW5jeS5UUkFOU0xVQ0VOVCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICBpZiAob3BhY2l0eSA8IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MgPSBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBHcmFwaGljc0RldmljZSBnZCA9IGdjLmdldERldmljZSgpOworICAgICAgICAgICAgICAgIGlmIChnYy5nZXREZXZpY2UoKS5nZXRGdWxsU2NyZWVuV2luZG93KCkgPT0gdGhpcykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlNldHRpbmcgb3BhY2l0eSBmb3IgZnVsbC1zY3JlZW4gd2luZG93IGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2QuaXNXaW5kb3dUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzRGV2aWNlLldpbmRvd1RyYW5zbHVjZW5jeS5UUkFOU0xVQ0VOVCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiVFJBTlNMVUNFTlQgdHJhbnNsdWNlbmN5IGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGdjLmdldERldmljZSgpLmdldEZ1bGxTY3JlZW5XaW5kb3coKSA9PSB0aGlzKSAmJiAob3BhY2l0eSA8IDEuMGYpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlNldHRpbmcgb3BhY2l0eSBmb3IgZnVsbC1zY3JlZW4gd2luZG93IGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gb3BhY2l0eTsKICAgICAgICAgICAgIFdpbmRvd1BlZXIgcGVlciA9IChXaW5kb3dQZWVyKWdldFBlZXIoKTsKQEAgLTMzNzYsMzcgKzM0MjUsODYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBKYXZhRG9jCisgICAgICogUmV0dXJucyB0aGUgc2hhcGUgb2YgdGhlIHdpbmRvdy4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBtYXkgbm90IGJlIHRoZSBzYW1lIGFzCisgICAgICogcHJldmlvdXNseSBzZXQgd2l0aCB7QGNvZGUgc2V0U2hhcGUoc2hhcGUpfSwgYnV0IGl0IGlzIGd1YXJhbnRlZWQKKyAgICAgKiB0byByZXByZXNlbnQgdGhlIHNhbWUgc2hhcGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzaGFwZSBvZiB0aGUgd2luZG93IG9yIHtAY29kZSBudWxsfSBpZiBubworICAgICAqICAgICBzaGFwZSBpcyBzcGVjaWZpZWQgZm9yIHRoZSB3aW5kb3cKKyAgICAgKgorICAgICAqIEBzZWUgV2luZG93I3NldFNoYXBlCisgICAgICogQHNlZSBHcmFwaGljc0RldmljZS5XaW5kb3dUcmFuc2x1Y2VuY3kKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjcKICAgICAgKi8KLSAgICAvKnB1YmxpYyAqL1NoYXBlIGdldFNoYXBlKCkgeworICAgIHB1YmxpYyBTaGFwZSBnZXRTaGFwZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChnZXRUcmVlTG9jaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2hhcGU7CisgICAgICAgICAgICByZXR1cm4gc2hhcGUgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aDJELkZsb2F0KHNoYXBlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEphdmFEb2MKKyAgICAgKiBTZXRzIHRoZSBzaGFwZSBvZiB0aGUgd2luZG93LgorICAgICAqIDxwPgorICAgICAqIFNldHRpbmcgYSBzaGFwZSBlbmFibGVzIGN1dHRpbmcgb2ZmIHNvbWUgcGFydHMgb2YgdGhlIHdpbmRvdywgbGVhdmluZworICAgICAqIHZpc2libGUgYW5kIGNsaWNrYWJsZSBvbmx5IHRob3NlIHBhcnRzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gc2hhcGUKKyAgICAgKiAoc2VlIHtAbGluayBTaGFwZX0pLiBJZiB0aGUgc2hhcGUgYXJndW1lbnQgaXMgbnVsbCwgdGhpcyBtZXRob2RzCisgICAgICogcmVzdG9yZXMgdGhlIGRlZmF1bHQgc2hhcGUgKG1ha2luZyB0aGUgd2luZG93IHJlY3Rhbmd1bGFyIG9uIG1vc3QKKyAgICAgKiBwbGF0Zm9ybXMuKQorICAgICAqIDxwPgorICAgICAqIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBtdXN0IGJlIG1ldCBpbiBvcmRlciB0byBzZXQgYSBub24tbnVsbCBzaGFwZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSB7QGxpbmsgR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5I1BFUlBJWEVMX1RSQU5TUEFSRU5UCisgICAgICogUEVSUElYRUxfVFJBTlNQQVJFTlR9IHRyYW5zbHVjZW5jeSBraW5kIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIHVuZGVybHlpbmcgc3lzdGVtIChzZWUge0BsaW5rIH0pCisgICAgICogPGk+YW5kPC9pPgorICAgICAqIDxsaT5UaGUgd2luZG93IG11c3Qgbm90IGJlIGluIHRoZSBmdWxsLXNjcmVlbiBtb2RlIChzZWUKKyAgICAgKiB7QGxpbmsgR3JhcGhpY3NEZXZpY2Ujc2V0RnVsbFNjcmVlbldpbmRvdygpfSkKKyAgICAgKiA8L3VsPgorICAgICAqIElmIGEgY2VydGFpbiBjb25kaXRpb24gaXMgbm90IG1ldCwgZWl0aGVyIHRoZSB7QGNvZGUKKyAgICAgKiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gb3Ige0Bjb2RlIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbn0KKyAgICAgKiBpcyB0aHJvd24uCisgICAgICogPHA+CisgICAgICogVGhlIHRyYW5sdWNlbmN5IGxldmVscyBvZiBpbmRpdmlkdWFsIHBpeGVscyBtYXkgYWxzbyBiZSBlZmZlY3RlZCBieSB0aGUKKyAgICAgKiBhbHBoYSBjb21wb25lbnQgb2YgdGhlaXIgY29sb3IgKHNlZSB7QGxpbmsgc2V0QmFja2dyb3VuZCgpfSkgYW5kIHRoZQorICAgICAqIG9wYWNpdHkgdmFsdWUgKHNlZSB7QGxpbmsgc2V0T3BhY2l0eSgpfSkuIFNlZSB7QGxpbmsKKyAgICAgKiBHcmFwaGljc0RldmljZSNXaW5kb3dUcmFuc2x1Y2VuY3l9IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gd2luZG93IHRoZSB3aW5kb3cgdG8gc2V0IHRoZSBzaGFwZSB0bwogICAgICAqIEBwYXJhbSBzaGFwZSB0aGUgc2hhcGUgdG8gc2V0IHRvIHRoZSB3aW5kb3cKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgd2luZG93IGlzIGluIGZ1bGwgc2NyZWVuIG1vZGUsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBzaGFwZSBpcyBub3QgbnVsbAorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24gaWYgdGhlIHNoYXBlIGlzIG5vdCB7QGNvZGUKKyAgICAgKiAgICAgbnVsbH0gYW5kIHRoZSB3aW5kb3cgaXMgaW4gZnVsbC1zY3JlZW4gbW9kZQorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHNoYXBlIGlzIG5vdCB7QGNvZGUKKyAgICAgKiAgICAgbnVsbH0gYW5kIHtAbGluayBHcmFwaGljc0RldmljZS5XaW5kb3dUcmFuc2x1Y2VuY3kjUEVSUElYRUxfVFJBTlNQQVJFTlQKKyAgICAgKiAgICAgUEVSUElYRUxfVFJBTlNQQVJFTlR9IHRyYW5zbHVjZW5jeSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICoKKyAgICAgKiBAc2VlIFdpbmRvdyNnZXRTaGFwZSgpCisgICAgICogQHNlZSBXaW5kb3cjc2V0QmFja2dvdW5kKCkKKyAgICAgKiBAc2VlIFdpbmRvdyNzZXRPcGFjaXR5KCkKKyAgICAgKiBAc2VlIEdyYXBoaWNzRGV2aWNlLldpbmRvd1RyYW5zbHVjZW5jeQorICAgICAqIEBzZWUgR3JhcGhpY3NEZXZpY2UjaXNXaW5kb3dUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoKQorICAgICAqCisgICAgICogQHNpbmNlIDEuNwogICAgICAqLwotICAgIC8qcHVibGljICovdm9pZCBzZXRTaGFwZShTaGFwZSBzaGFwZSkgeworICAgIHB1YmxpYyB2b2lkIHNldFNoYXBlKFNoYXBlIHNoYXBlKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoZ2V0VHJlZUxvY2soKSkgewotICAgICAgICAgICAgR3JhcGhpY3NDb25maWd1cmF0aW9uIGdjID0gZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBHcmFwaGljc0RldmljZSBnZCA9IGdjLmdldERldmljZSgpOwotICAgICAgICAgICAgaWYgKCFnZC5pc1dpbmRvd1RyYW5zbHVjZW5jeVN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5LlBFUlBJWEVMX1RSQU5TUEFSRU5UKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICBpZiAoc2hhcGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYyA9IGdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgIEdyYXBoaWNzRGV2aWNlIGdkID0gZ2MuZ2V0RGV2aWNlKCk7CisgICAgICAgICAgICAgICAgaWYgKGdjLmdldERldmljZSgpLmdldEZ1bGxTY3JlZW5XaW5kb3coKSA9PSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBzaGFwZSBmb3IgZnVsbC1zY3JlZW4gd2luZG93IGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2QuaXNXaW5kb3dUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0RldmljZS5XaW5kb3dUcmFuc2x1Y2VuY3kuUEVSUElYRUxfVFJBTlNQQVJFTlQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIlBFUlBJWEVMX1RSQU5TUEFSRU5UIHRyYW5zbHVjZW5jeSBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoZ2MuZ2V0RGV2aWNlKCkuZ2V0RnVsbFNjcmVlbldpbmRvdygpID09IHRoaXMpICYmIChzaGFwZSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIHNoYXBlIGZvciBmdWxsLXNjcmVlbiB3aW5kb3cgaXMgbm90IHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc2hhcGUgPSBzaGFwZTsKKyAgICAgICAgICAgIHRoaXMuc2hhcGUgPSAoc2hhcGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IFBhdGgyRC5GbG9hdChzaGFwZSk7CiAgICAgICAgICAgICBXaW5kb3dQZWVyIHBlZXIgPSAoV2luZG93UGVlcilnZXRQZWVyKCk7CiAgICAgICAgICAgICBpZiAocGVlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcGVlci5hcHBseVNoYXBlKHNoYXBlID09IG51bGwgPyBudWxsIDogUmVnaW9uLmdldEluc3RhbmNlKHNoYXBlLCBudWxsKSk7CkBAIC0zNDE1LDY2ICszNTEzLDExNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEphdmFEb2MKKyAgICAgKiBHZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoaXMgd2luZG93LgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSByZXR1cm5lZCBjb2xvciBpbmRpY2F0ZXMgd2hldGhlcgorICAgICAqIHRoZSB3aW5kb3cgaXMgaW4gdGhlIG5vbi1vcGFxdWUgKHBlci1waXhlbCB0cmFuc2x1Y2VudCkgbW9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyBjb21wb25lbnQncyBiYWNrZ3JvdW5kIGNvbG9yCisgICAgICoKKyAgICAgKiBAc2VlIFdpbmRvdyNzZXRCYWNrZ3JvdW5kCisgICAgICogQHNlZSBHcmFwaGljc0RldmljZS5XaW5kb3dUcmFuc2x1Y2VuY3kKICAgICAgKi8KLS8qCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRCYWNrZ3JvdW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGlzIHdpbmRvdy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgd2luZG93aW5nIHN5c3RlbSBzdXBwb3J0cyB0aGUge0BsaW5rCisgICAgICogR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5I1BFUlBJWEVMX1RSQU5TTFVDRU5UIFBFUlBJWEVMX1RSQU5TTFVDRU5UfQorICAgICAqIHRyYW5jbHVjZW5jeSwgdGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gYmFja2dyb3VuZCBjb2xvcgorICAgICAqIG1heSBlZmZlY3QgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIGZvciB0aGlzIHdpbmRvdzogaXQgaW5kaWNhdGVzIHdoZXRoZXIKKyAgICAgKiB0aGlzIHdpbmRvdyBtdXN0IGJlIG9wYXF1ZSAoYWxwaGEgPT0gMS4wZikgb3IgcGVyLXBpeGVsIHRyYW5zbHVjZW50CisgICAgICogKGFscGhhICZsdDsgMS4wZikuICBBbGwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QgYmUgbWV0IGluIG9yZGVyCisgICAgICogdG8gYmUgYWJsZSB0byBlbmFibGUgdGhlIHBlci1waXhlbCB0cmFuc3BhcmVuY3kgbW9kZSBmb3IgdGhpcyB3aW5kb3c6CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUge0BsaW5rIEdyYXBoaWNzRGV2aWNlLldpbmRvd1RyYW5zbHVjZW5jeSNQRVJQSVhFTF9UUkFOU0xVQ0VOVAorICAgICAqIFBFUlBJWEVMX1RSQU5TTFVDRU5UfSB0cmFuc2x1Y2VuY3kgbXVzdCBiZSBzdXBwb3J0ZWQKKyAgICAgKiBieSB0aGUgZ3JhcGhpY3MgZGV2aWNlIHdoZXJlIHRoaXMgd2luZG93IGlzIGxvY2F0ZWQgPGk+YW5kPC9pPgorICAgICAqIDxsaT5UaGUgd2luZG93IG11c3Qgbm90IGJlIGluIHRoZSBmdWxsLXNjcmVlbiBtb2RlIChzZWUge0BsaW5rCisgICAgICogR3JhcGhpY3NEZXZpY2Ujc2V0RnVsbFNjcmVlbldpbmRvdygpfSkKKyAgICAgKiA8L3VsPgorICAgICAqIElmIGEgY2VydGFpbiBjb25kaXRpb24gaXMgbm90IG1ldCBhdCB0aGUgdGltZSBvZiBjYWxsaW5nIHRoaXMgbWV0aG9kLAorICAgICAqIHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGdpdmVuIGJhY2tncm91bmQgY29sb3Igd2lsbCBub3QgZWZmZWN0IHRoZQorICAgICAqIG1vZGUgb2Ygb3BlcmF0aW9uIGZvciB0aGlzIHdpbmRvdy4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHRoZSB3aW5kb3cgaXMgcGVyLXBpeGVsIHRyYW5zbHVjZW50LCB0aGUgZHJhd2luZyBzdWItc3lzdGVtCisgICAgICogcmVzcGVjdHMgdGhlIGFscGhhIHZhbHVlIG9mIGVhY2ggaW5kaXZpZHVhbCBwaXhlbC4gSWYgYSBwaXhlbCBnZXRzCisgICAgICogcGFpbnRlZCB3aXRoIHRoZSBhbHBoYSBjb2xvciBjb21wb25lbnQgZXF1YWwgdG8gemVybywgaXQgYmVjb21lcworICAgICAqIHZpc3VhbGx5IHRyYW5zcGFyZW50LCBpZiB0aGUgYWxwaGEgb2YgdGhlIHBpeGVsIGlzIGVxdWFsIHRvIDEuMGYsIHRoZQorICAgICAqIHBpeGVsIGlzIGZ1bGx5IG9wYXF1ZS4gSW50ZXJpbSB2YWx1ZXMgb2YgdGhlIGFscGhhIGNvbG9yIGNvbXBvbmVudCBtYWtlCisgICAgICogdGhlIHBpeGVsIHNlbWktdHJhbnNwYXJlbnQuIEluIHRoaXMgbW9kZSB0aGUgYmFja2dyb3VuZCBvZiB0aGUgd2luZG93CisgICAgICogZ2V0cyBwYWludGVkIHdpdGggdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBnaXZlbiBiYWNrZ3JvdW5kIGNvbG9yIChtZWFuaW5nCisgICAgICogdGhhdCBpdCBpcyBub3QgcGFpbnRlZCBhdCBhbGwgaWYgdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBvZiB0aGlzCisgICAgICogbWV0aG9kIGlzIGVxdWFsIHRvIHplcm8uKQorICAgICAqIDxwPgorICAgICAqIFRoZSBhY3R1YWwgbGV2ZWwgb2YgdHJhbnNsdWNlbmN5IG9mIGEgZ2l2ZW4gcGl4ZWwgYWxzbyBkZXBlbmRzIG9uIHdpbmRvdworICAgICAqIG9wYWNpdHkgKHNlZSB7QGxpbmsgc2V0T3BhY2l0eSgpfSksIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgc2hhcGUgb2YKKyAgICAgKiB0aGlzIHdpbmRvdyAoc2VlIHtAbGluayBzZXRTaGFwZSgpfSkuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHBhaW50aW5nIGEgcGl4ZWwgd2l0aCB0aGUgYWxwaGEgdmFsdWUgb2YgMCBtYXkgb3IgbWF5IG5vdAorICAgICAqIGRpc2FibGUgdGhlIG1vdXNlIGV2ZW50IGhhbmRsaW5nIG9uIHRoaXMgcGl4ZWwuIFRoaXMgaXMgYQorICAgICAqIHBsYXRmb3JtLWRlcGVuZGVudCBiZWhhdmlvci4gVG8gbWFrZSBzdXJlIHRoZSBtb3VzZSBjbGlja3MgZG8gbm90IGdldAorICAgICAqIGRpc3BhdGNoZWQgdG8gYSBwYXJ0aWN1bGFyIHBpeGVsLCB0aGUgcGl4ZWwgbXVzdCBiZSBleGNsdWRlZCBmcm9tIHRoZQorICAgICAqIHNoYXBlIG9mIHRoZSB3aW5kb3cuCisgICAgICogPHA+CisgICAgICogRW5hYmxpbmcgdGhlIHBlci1waXhlbCB0cmFuc2x1Y2VuY3kgbW9kZSBtYXkgY2hhbmdlIHRoZSBncmFwaGljcworICAgICAqIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyB3aW5kb3cgZHVlIHRvIHRoZSBuYXRpdmUgcGxhdGZvcm0gcmVxdWlyZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGJnQ29sb3IgdGhlIGNvbG9yIHRvIGJlY29tZSB0aGlzIHdpbmRvdydzIGJhY2tncm91bmQgY29sb3IuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgYWxwaGEgdmFsdWUgb2YgdGhlIGdpdmVuCisgICAgICogICAgIGJhY2tncm91bmQgY29sb3IgaXMgbGVzcyB0aGFuIDEuMGYgYW5kIHRoZSB3aW5kb3cgaXMgaW4KKyAgICAgKiAgICAgZnVsbC1zY3JlZW4gbW9kZQorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBnaXZlbgorICAgICAqICAgICBiYWNrZ3JvdW5kIGNvbG9yIGlzIGxlc3MgdGhhbiAxLjBmIGFuZAorICAgICAqICAgICB7QGxpbmsgR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5I1BFUlBJWEVMX1RSQU5TTFVDRU5UCisgICAgICogICAgIFBFUlBJWEVMX1RSQU5TTFVDRU5UfSB0cmFuc2x1Y2VuY3kgaXMgbm90IHN1cHBvcnRlZAorICAgICAqCisgICAgICogQHNlZSBXaW5kb3cjZ2V0QmFja2dyb3VuZAorICAgICAqIEBzZWUgV2luZG93I3NldE9wYWNpdHkoKQorICAgICAqIEBzZWUgV2luZG93I3NldFNoYXBlKCkKKyAgICAgKiBAc2VlIEdyYXBoaWNzRGV2aWNlLldpbmRvd1RyYW5zbHVjZW5jeQorICAgICAqIEBzZWUgR3JhcGhpY3NEZXZpY2UjaXNXaW5kb3dUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoKQorICAgICAqIEBzZWUgR3JhcGhpY3NDb25maWd1cmF0aW9uI2lzVHJhbnNsdWNlbmN5Q2FwYWJsZSgpCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBiZ0NvbG9yKSB7CisgICAgICAgIENvbG9yIG9sZEJnID0gZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAob2xkQmcgIT0gbnVsbCAmJiBvbGRCZy5lcXVhbHMoYmdDb2xvcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IpOworICAgICAgICBpbnQgb2xkQWxwaGEgPSBvbGRCZyAhPSBudWxsID8gb2xkQmcuZ2V0QWxwaGEoKSA6IDI1NTsKICAgICAgICAgaW50IGFscGhhID0gYmdDb2xvci5nZXRBbHBoYSgpOwotICAgICAgICBpZiAoYWxwaGEgPCAyNTUpIHsgLy8gbm9uLW9wYXF1ZSB3aW5kb3cKKyAgICAgICAgaWYgKChvbGRBbHBoYSA9PSAyNTUpICYmIChhbHBoYSA8IDI1NSkpIHsgLy8gbm9uLW9wYXF1ZSB3aW5kb3cKICAgICAgICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYyA9IGdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpOwogICAgICAgICAgICAgR3JhcGhpY3NEZXZpY2UgZ2QgPSBnYy5nZXREZXZpY2UoKTsKICAgICAgICAgICAgIGlmIChnYy5nZXREZXZpY2UoKS5nZXRGdWxsU2NyZWVuV2luZG93KCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIk1ha2luZyBmdWxsLXNjcmVlbiB3aW5kb3cgbm9uIG9wYXF1ZSBpcyBub3Qgc3VwcG9ydGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFnYy5pc1RyYW5zbHVjZW5jeUNhcGFibGUoKSkgewogICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBjYXBhYmxlR0MgPSBnZC5nZXRUcmFuc2x1Y2VuY3lDYXBhYmxlR0MoKTsKICAgICAgICAgICAgICAgICBpZiAoY2FwYWJsZUdDID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIlBFUlBJWEVMX1RSQU5TTFVDRU5UIHRyYW5zbHVjZW5jeSBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBHQworICAgICAgICAgICAgICAgIHNldEdyYXBoaWNzQ29uZmlndXJhdGlvbihjYXBhYmxlR0MpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0TGF5ZXJzT3BhcXVlKHRoaXMsIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIGlmICgob2xkQWxwaGEgPCAyNTUpICYmIChhbHBoYSA9PSAyNTUpKSB7CisgICAgICAgICAgICBzZXRMYXllcnNPcGFxdWUodGhpcywgdHJ1ZSk7CiAgICAgICAgIH0KLQotICAgICAgICBzdXBlci5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IpOwotCiAgICAgICAgIFdpbmRvd1BlZXIgcGVlciA9IChXaW5kb3dQZWVyKWdldFBlZXIoKTsKICAgICAgICAgaWYgKHBlZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgcGVlci5zZXRPcGFxdWUoYWxwaGEgPT0gMjU1KTsKICAgICAgICAgfQogICAgIH0KLSovCi0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIG9wYXF1ZSA9IHRydWU7Ci0KLSAgICB2b2lkIHNldE9wYXF1ZShib29sZWFuIG9wYXF1ZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGdldFRyZWVMb2NrKCkpIHsKLSAgICAgICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYyA9IGdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKCFvcGFxdWUgJiYgIWNvbS5zdW4uYXd0LkFXVFV0aWxpdGllcy5pc1RyYW5zbHVjZW5jeUNhcGFibGUoZ2MpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIHdpbmRvdyBtdXN0IHVzZSBhIHRyYW5zbHVjZW5jeS1jb21wYXRpYmxlIGdyYXBoaWNzIGNvbmZpZ3VyYXRpb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY29tLnN1bi5hd3QuQVdUVXRpbGl0aWVzLmlzVHJhbnNsdWNlbmN5U3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICBjb20uc3VuLmF3dC5BV1RVdGlsaXRpZXMuVHJhbnNsdWNlbmN5LlBFUlBJWEVMX1RSQU5TTFVDRU5UKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiUEVSUElYRUxfVFJBTlNMVUNFTlQgdHJhbnNsdWNlbmN5IGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGdjLmdldERldmljZSgpLmdldEZ1bGxTY3JlZW5XaW5kb3coKSA9PSB0aGlzKSAmJiAhb3BhcXVlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk1ha2luZyBmdWxsLXNjcmVlbiB3aW5kb3cgbm9uIG9wYXF1ZSBpcyBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0TGF5ZXJzT3BhcXVlKHRoaXMsIG9wYXF1ZSk7Ci0gICAgICAgICAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZTsKLSAgICAgICAgICAgIFdpbmRvd1BlZXIgcGVlciA9IChXaW5kb3dQZWVyKWdldFBlZXIoKTsKLSAgICAgICAgICAgIGlmIChwZWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwZWVyLnNldE9wYXF1ZShvcGFxdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpbmRvdyhCdWZmZXJlZEltYWdlIGJhY2tCdWZmZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkIChnZXRUcmVlTG9jaygpKSB7CkBAIC0zNTA1LDEwICszNjUyLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBscC5zZXRPcGFxdWUoaXNPcGFxdWUpOwogICAgICAgICAgICAgcm9vdC5zZXRPcGFxdWUoaXNPcGFxdWUpOwotICAgICAgICAgICAgcm9vdC5zZXREb3VibGVCdWZmZXJlZChpc09wYXF1ZSk7IC8vWFhYOiB0aGUgIndoaXRlIHJlY3QiIHdvcmthcm91bmQKKyAgICAgICAgICAgIHJvb3Quc2V0RG91YmxlQnVmZmVyZWQoaXNPcGFxdWUpOwogICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0T3BhcXVlKGlzT3BhcXVlKTsKLSAgICAgICAgICAgICAgICBjb250ZW50LnNldERvdWJsZUJ1ZmZlcmVkKGlzT3BhcXVlKTsgLy9YWFg6IHRoZSAid2hpdGUgcmVjdCIgd29ya2Fyb3VuZAorICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0RG91YmxlQnVmZmVyZWQoaXNPcGFxdWUpOwogCiAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSBkb3duIG9uZSBsZXZlbCB0byBzZWUgd2hldGhlciB3ZSBoYXZlIGEgSkFwcGxldAogICAgICAgICAgICAgICAgIC8vICh3aGljaCBpcyBhbHNvIGEgUm9vdFBhbmVDb250YWluZXIpIHdoaWNoIHJlcXVpcmVzIHByb2Nlc3NpbmcKQEAgLTM1MjMsMzYgKzM2NzAsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIENvbG9yIGJnID0gY29tcG9uZW50LmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgYm9vbGVhbiBoYXNUcmFuc3BhcmVudEJnID0gVFJBTlNQQVJFTlRfQkFDS0dST1VORF9DT0xPUi5lcXVhbHMoYmcpOwotCi0gICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICBjb250YWluZXIgPSAoQ29udGFpbmVyKSBjb21wb25lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNPcGFxdWUpIHsKLSAgICAgICAgICAgIGlmIChoYXNUcmFuc3BhcmVudEJnKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogd2UgdXNlIHRoZSBTeXN0ZW1Db2xvci53aW5kb3cgY29sb3IgYXMgdGhlIGRlZmF1bHQuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBjb2xvciBpcyB1c2VkIGluIHRoZSBXaW5kb3dQZWVyIGltcGxlbWVudGF0aW9ucyB0bwotICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHdpbmRvdyBpZiBpdCBpcyBudWxsLgotICAgICAgICAgICAgICAgIC8vIChUaGlzIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gZm9yIG90aGVyCi0gICAgICAgICAgICAgICAgLy8gUm9vdFBhbmVDb250YWluZXJzIHdlIG1pZ2h0IGJlIGludm9rZWQgd2l0aCkKLSAgICAgICAgICAgICAgICBDb2xvciBuZXdDb2xvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lci5wcmVzZXJ2ZUJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0NvbG9yID0gY29udGFpbmVyLnByZXNlcnZlQmFja2dyb3VuZENvbG9yOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0NvbG9yID0gU3lzdGVtQ29sb3Iud2luZG93OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0QmFja2dyb3VuZChuZXdDb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1RyYW5zcGFyZW50QmcgJiYgY29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250YWluZXIucHJlc2VydmVCYWNrZ3JvdW5kQ29sb3IgPSBiZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbXBvbmVudC5zZXRCYWNrZ3JvdW5kKFRSQU5TUEFSRU5UX0JBQ0tHUk9VTkRfQ09MT1IpOwotICAgICAgICB9CiAgICAgfQogCiAKQEAgLTM2MjAsMjAgKzM3MzcsMTYgQEAKICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0U2hhcGUoc2hhcGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoV2luZG93IHdpbmRvdykgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5nZXRCYWNrZ3JvdW5kKCkuZ2V0QWxwaGEoKSA8IDI1NTsKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAod2luZG93LmdldFRyZWVMb2NrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5vcGFxdWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbG9yIGJnID0gd2luZG93LmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJnICE9IG51bGwpID8gYmcuZ2V0QWxwaGEoKSA9PSAyNTUgOiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0T3BhcXVlKFdpbmRvdyB3aW5kb3csIGJvb2xlYW4gb3BhcXVlKSB7Ci0gICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICBDb2xvciBiZyA9IHdpbmRvdy5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICAgICAgaWYgKGJnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmcgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRCYWNrZ3JvdW5kKG5ldyBDb2xvcihiZy5nZXRSZWQoKSwgYmcuZ2V0R3JlZW4oKSwgYmcuZ2V0Qmx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFxdWUgPyAyNTUgOiAwKSk7Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB3aW5kb3cuc2V0T3BhcXVlKG9wYXF1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVXaW5kb3coV2luZG93IHdpbmRvdywgQnVmZmVyZWRJbWFnZSBiYWNrQnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgd2luZG93LnVwZGF0ZVdpbmRvdyhiYWNrQnVmZmVyKTsKQEAgLTM2NzQsNiArMzc4NywxMCBAQAogICAgICAgICB9KTsgLy8gV2luZG93QWNjZXNzb3IKICAgICB9IC8vIHN0YXRpYwogCisgICAgLy8gYSB3aW5kb3cgZG9lc24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQgaW4gdGhlIFotb3JkZXIuCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVaT3JkZXIoKSB7fQorCiB9IC8vIGNsYXNzIFdpbmRvdwogCiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9Ob1N1Y2hGaWVsZEVycm9yLmphdmEKaW5kZXggOGI3N2M3MS4uOGFkZWJjYSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9Ob1N1Y2hGaWVsZEVycm9yLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9Ob1N1Y2hGaWVsZEVycm9yLmphdmEKQEAgLTQxLDE0ICs0MSwxNCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNDU2NDMwMTk1ODg2MTI5MDM1TDsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5Ob1N1Y2hGaWVsZEV4Y2VwdGlvbjwvY29kZT4gd2l0aCBubyBkZXRhaWwgIG1lc3NhZ2UuCisgICAgICogQ29uc3RydWN0cyBhIDxjb2RlPk5vU3VjaEZpZWxkRXJyb3I8L2NvZGU+IHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIE5vU3VjaEZpZWxkRXJyb3IoKSB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPk5vU3VjaEZpZWxkRXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+Tm9TdWNoRmllbGRFcnJvcjwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICogZGV0YWlsIG1lc3NhZ2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gICBzICAgdGhlIGRldGFpbCBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL0J5dGVCdWZmZXJBcy1YLUJ1ZmZlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL0J5dGVCdWZmZXJBcy1YLUJ1ZmZlci5qYXZhCmluZGV4IDE1NjI2NDIuLjYwYmU3NDcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pby9CeXRlQnVmZmVyQXMtWC1CdWZmZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vQnl0ZUJ1ZmZlckFzLVgtQnVmZmVyLmphdmEKQEAgLTE5NiwxMCArMTk2LDEyIEBACiAKICAgICAgICAgaWYgKChzdGFydCA8IDApIHx8IChlbmQgPiBsZW4pIHx8IChzdGFydCA+IGVuZCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgICAgICBpbnQgc3VibGVuID0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgIGludCBvZmYgPSBvZmZzZXQgKyAoKHBvcyArIHN0YXJ0KSA8PCAkTEdfQllURVNfUEVSX1ZBTFVFJCk7Ci0gICAgICAgIGFzc2VydCAob2ZmID49IDApOwotICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXJBc0NoYXJCdWZmZXIkUlckJEJPJChiYiwgLTEsIDAsIHN1Ymxlbiwgc3VibGVuLCBvZmYpOworICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXJBc0NoYXJCdWZmZXIkUlckJEJPJChiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKyBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CiAgICAgfQogCiAjZW5kW2NoYXJdCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vRGlyZWN0LVgtQnVmZmVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vRGlyZWN0LVgtQnVmZmVyLmphdmEKaW5kZXggNWY3MzhiNy4uYTk3NzYyNiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL0RpcmVjdC1YLUJ1ZmZlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pby9EaXJlY3QtWC1CdWZmZXIuamF2YQpAQCAtNDEyLDEwICs0MTIsMTIgQEAKIAogICAgICAgICBpZiAoKHN0YXJ0IDwgMCkgfHwgKGVuZCA+IGxlbikgfHwgKHN0YXJ0ID4gZW5kKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIGludCBzdWJsZW4gPSBlbmQgLSBzdGFydDsKLSAgICAgICAgaW50IG9mZiA9IChwb3MgKyBzdGFydCkgPDwgJExHX0JZVEVTX1BFUl9WQUxVRSQ7Ci0gICAgICAgIGFzc2VydCAob2ZmID49IDApOwotICAgICAgICByZXR1cm4gbmV3IERpcmVjdENoYXJCdWZmZXIkUlckJEJPJCh0aGlzLCAtMSwgMCwgc3VibGVuLCBzdWJsZW4sIG9mZik7CisgICAgICAgIHJldHVybiBuZXcgRGlyZWN0Q2hhckJ1ZmZlciRSVyQkQk8kKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICsgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwogICAgIH0KIAogI2VuZFtjaGFyXQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL0hlYXAtWC1CdWZmZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pby9IZWFwLVgtQnVmZmVyLmphdmEKaW5kZXggYjYxNWJhMy4uODY0MTYxZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL0hlYXAtWC1CdWZmZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vSGVhcC1YLUJ1ZmZlci5qYXZhCkBAIC01NzIsMTAgKzU3MiwxMyBAQAogICAgICAgICAgICAgfHwgKGVuZCA+IGxlbmd0aCgpKQogICAgICAgICAgICAgfHwgKHN0YXJ0ID4gZW5kKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IHBvcyA9IHBvc2l0aW9uKCk7CiAgICAgICAgIHJldHVybiBuZXcgSGVhcENoYXJCdWZmZXIkUlckKGhiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgbGVuLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIHBvc2l0aW9uKCkgKyBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICsgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwogICAgIH0KIAogI2VuZFtjaGFyXQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL1N0cmluZ0NoYXJCdWZmZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pby9TdHJpbmdDaGFyQnVmZmVyLmphdmEKaW5kZXggNjQ4YjE5OC4uODg3MWI5NCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL1N0cmluZ0NoYXJCdWZmZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vU3RyaW5nQ2hhckJ1ZmZlci5qYXZhCkBAIC0xMDIsMTAgKzEwMiwxMiBAQAogICAgIHB1YmxpYyBmaW5hbCBDaGFyQnVmZmVyIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IHBvcyA9IHBvc2l0aW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0NoYXJCdWZmZXIoc3RyLCAtMSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ2hhckJ1ZmZlcihzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICsgY2hlY2tJbmRleChzdGFydCwgcG9zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKyBjaGVja0luZGV4KGVuZCwgcG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcoKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vY2hhbm5lbHMvQXN5bmNocm9ub3VzRGF0YWdyYW1DaGFubmVsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vY2hhbm5lbHMvQXN5bmNocm9ub3VzRGF0YWdyYW1DaGFubmVsLmphdmEKaW5kZXggNmE5ZDlmMC4uNjViOTBkMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL2NoYW5uZWxzL0FzeW5jaHJvbm91c0RhdGFncmFtQ2hhbm5lbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pby9jaGFubmVscy9Bc3luY2hyb25vdXNEYXRhZ3JhbUNoYW5uZWwuamF2YQpAQCAtNDQzLDcgKzQ0Myw3IEBACiAgICAgICogYXQgbGVhc3QgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgaXMgbm90IGFjY2Vzc2VkCiAgICAgICogd2hpbGUgdGhlIGNoYW5uZWwgcmVtYWlucyBvcGVuLgogICAgICAqCi0gICAgICogPHA+IElmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciBpbnN0YWxsZWQgYW5kIHRoZSB0aGUgY2hhbm5lbCBpcyBub3QKKyAgICAgKiA8cD4gSWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyIGluc3RhbGxlZCBhbmQgdGhlIGNoYW5uZWwgaXMgbm90CiAgICAgICogY29ubmVjdGVkIHRoZW4gdGhpcyBtZXRob2QgdmVyaWZpZXMgdGhhdCB0aGUgdGFyZ2V0IGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyCiAgICAgICogYXJlIHBlcm1pdHRlZCBieSB0aGUgc2VjdXJpdHkgbWFuYWdlcidzIHtAbGluayBTZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0CiAgICAgICogY2hlY2tDb25uZWN0fSBtZXRob2QuICBUaGUgb3ZlcmhlYWQgb2YgdGhpcyBzZWN1cml0eSBjaGVjayBjYW4gYmUgYXZvaWRlZApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL2ZpbGUvUGF0aC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL2ZpbGUvUGF0aC5qYXZhCmluZGV4IDU1YmY4ZmQuLjhmNzk2YjYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pby9maWxlL1BhdGguamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vZmlsZS9QYXRoLmphdmEKQEAgLTQ5NCw3ICs0OTQsNyBAQAogICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycwogICAgICAqIEB0aHJvd3MgIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSW4gdGhlIGNhc2Ugb2YgdGhlIHRoZSBkZWZhdWx0IHByb3ZpZGVyLCBhbmQgYSBzZWN1cml0eSBtYW5hZ2VyCisgICAgICogICAgICAgICAgSW4gdGhlIGNhc2Ugb2YgdGhlIGRlZmF1bHQgcHJvdmlkZXIsIGFuZCBhIHNlY3VyaXR5IG1hbmFnZXIKICAgICAgKiAgICAgICAgICBpcyBpbnN0YWxsZWQsIGl0IGRlbmllcyB7QGxpbmsgTGlua1Blcm1pc3Npb259PHR0Pigic3ltYm9saWMiKTwvdHQ+CiAgICAgICogICAgICAgICAgb3IgaXRzIHtAbGluayBTZWN1cml0eU1hbmFnZXIjY2hlY2tXcml0ZShTdHJpbmcpIGNoZWNrV3JpdGV9CiAgICAgICogICAgICAgICAgbWV0aG9kIGRlbmllcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIHBhdGggb2YgdGhlIHN5bWJvbGljIGxpbmsuCkBAIC01MzEsNyArNTMxLDcgQEAKICAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbgogICAgICAqICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKICAgICAgKiBAdGhyb3dzICBTZWN1cml0eUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIEluIHRoZSBjYXNlIG9mIHRoZSB0aGUgZGVmYXVsdCBwcm92aWRlciwgYW5kIGEgc2VjdXJpdHkgbWFuYWdlcgorICAgICAqICAgICAgICAgIEluIHRoZSBjYXNlIG9mIHRoZSBkZWZhdWx0IHByb3ZpZGVyLCBhbmQgYSBzZWN1cml0eSBtYW5hZ2VyCiAgICAgICogICAgICAgICAgaXMgaW5zdGFsbGVkLCBpdCBkZW5pZXMge0BsaW5rIExpbmtQZXJtaXNzaW9ufTx0dD4oImhhcmQiKTwvdHQ+CiAgICAgICogICAgICAgICAgb3IgaXRzIHtAbGluayBTZWN1cml0eU1hbmFnZXIjY2hlY2tXcml0ZShTdHJpbmcpIGNoZWNrV3JpdGV9CiAgICAgICogICAgICAgICAgbWV0aG9kIGRlbmllcyB3cml0ZSBhY2Nlc3MgdG8gYm90aCB0aGlzIHBhdGggYW5kIHRoZSBwYXRoIG9mIHRoZQpAQCAtNTYwLDcgKzU2MCw3IEBACiAgICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCiAgICAgICogQHRocm93cyAgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJbiB0aGUgY2FzZSBvZiB0aGUgdGhlIGRlZmF1bHQgcHJvdmlkZXIsIGFuZCBhIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAgKiAgICAgICAgICBJbiB0aGUgY2FzZSBvZiB0aGUgZGVmYXVsdCBwcm92aWRlciwgYW5kIGEgc2VjdXJpdHkgbWFuYWdlcgogICAgICAqICAgICAgICAgIGlzIGluc3RhbGxlZCwgaXQgY2hlY2tzIHRoYXQge0Bjb2RlIEZpbGVQZXJtaXNzaW9ufSBoYXMgYmVlbgogICAgICAqICAgICAgICAgIGdyYW50ZWQgd2l0aCB0aGUgIntAY29kZSByZWFkbGlua30iIGFjdGlvbiB0byByZWFkIHRoZSBsaW5rLgogICAgICAqLwpAQCAtNjE1LDcgKzYxNSw3IEBACiAgICAgICogICAgICAgICAgb2J0YWluZWQKICAgICAgKgogICAgICAqIEB0aHJvd3MgIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSW4gdGhlIGNhc2Ugb2YgdGhlIHRoZSBkZWZhdWx0IHByb3ZpZGVyLCBhbmQgYSBzZWN1cml0eSBtYW5hZ2VyCisgICAgICogICAgICAgICAgSW4gdGhlIGNhc2Ugb2YgdGhlIGRlZmF1bHQgcHJvdmlkZXIsIGFuZCBhIHNlY3VyaXR5IG1hbmFnZXIKICAgICAgKiAgICAgICAgICBpcyBpbnN0YWxsZWQsIHRoZSB7QGxpbmsgI3RvQWJzb2x1dGVQYXRoIHRvQWJzb2x1dGVQYXRofSBtZXRob2QKICAgICAgKiAgICAgICAgICB0aHJvd3MgYSBzZWN1cml0eSBleGNlcHRpb24uCiAgICAgICovCkBAIC02MzYsNyArNjM2LDcgQEAKICAgICAgKiBAdGhyb3dzICBJT0Vycm9yCiAgICAgICogICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycwogICAgICAqIEB0aHJvd3MgIFNlY3VyaXR5RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgSW4gdGhlIGNhc2Ugb2YgdGhlIHRoZSBkZWZhdWx0IHByb3ZpZGVyLCBhbmQgYSBzZWN1cml0eSBtYW5hZ2VyCisgICAgICogICAgICAgICAgSW4gdGhlIGNhc2Ugb2YgdGhlIGRlZmF1bHQgcHJvdmlkZXIsIGFuZCBhIHNlY3VyaXR5IG1hbmFnZXIKICAgICAgKiAgICAgICAgICBpcyBpbnN0YWxsZWQsIGl0cyB7QGxpbmsgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUHJvcGVydHlBY2Nlc3MoU3RyaW5nKQogICAgICAqICAgICAgICAgIGNoZWNrUHJvcGVydHlBY2Nlc3N9IG1ldGhvZCBpcyBpbnZva2VkIHRvIGNoZWNrIGFjY2VzcyB0byB0aGUKICAgICAgKiAgICAgICAgICBzeXN0ZW0gcHJvcGVydHkge0Bjb2RlIHVzZXIuZGlyfQpAQCAtNjc3LDcgKzY3Nyw3IEBACiAgICAgICogQHRocm93cyAgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBhbiBJL08gZXJyb3Igb2NjdXJzCiAgICAgICogQHRocm93cyAgU2VjdXJpdHlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBJbiB0aGUgY2FzZSBvZiB0aGUgdGhlIGRlZmF1bHQgcHJvdmlkZXIsIGFuZCBhIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAgKiAgICAgICAgICBJbiB0aGUgY2FzZSBvZiB0aGUgZGVmYXVsdCBwcm92aWRlciwgYW5kIGEgc2VjdXJpdHkgbWFuYWdlcgogICAgICAqICAgICAgICAgIGlzIGluc3RhbGxlZCwgaXRzIHtAbGluayBTZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKFN0cmluZykgY2hlY2tSZWFkfQogICAgICAqICAgICAgICAgIG1ldGhvZCBpcyBpbnZva2VkIHRvIGNoZWNrIHJlYWQgYWNjZXNzIHRvIHRoZSBmaWxlLCBhbmQgd2hlcmUKICAgICAgKiAgICAgICAgICB0aGlzIHBhdGggaXMgbm90IGFic29sdXRlLCBpdHMge0BsaW5rIFNlY3VyaXR5TWFuYWdlciNjaGVja1Byb3BlcnR5QWNjZXNzKFN0cmluZykKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pby9maWxlL1NlY3VyZURpcmVjdG9yeVN0cmVhbS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL2ZpbGUvU2VjdXJlRGlyZWN0b3J5U3RyZWFtLmphdmEKaW5kZXggYjI1NTVjMS4uNzI2OGM0MSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL2ZpbGUvU2VjdXJlRGlyZWN0b3J5U3RyZWFtLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL2ZpbGUvU2VjdXJlRGlyZWN0b3J5U3RyZWFtLmphdmEKQEAgLTIwOCw3ICsyMDgsNyBAQAogICAgICAqIEB0aHJvd3MgIENsb3NlZERpcmVjdG9yeVN0cmVhbUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgIGlmIHRoZSBkaXJlY3Rvcnkgc3RyZWFtIGlzIGNsb3NlZAogICAgICAqIEB0aHJvd3MgIE5vU3VjaEZpbGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBpZiB0aGUgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCA8aT4ob3B0aW9uYWwgc3BlY2lmaWMgZXhjZXB0aW9uKTwvaT4KKyAgICAgKiAgICAgICAgICBpZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IDxpPihvcHRpb25hbCBzcGVjaWZpYyBleGNlcHRpb24pPC9pPgogICAgICAqIEB0aHJvd3MgIERpcmVjdG9yeU5vdEVtcHR5RXhjZXB0aW9uCiAgICAgICogICAgICAgICAgaWYgdGhlIGRpcmVjdG9yeSBjb3VsZCBub3Qgb3RoZXJ3aXNlIGJlIGRlbGV0ZWQgYmVjYXVzZSBpdCBpcwogICAgICAqICAgICAgICAgIG5vdCBlbXB0eSA8aT4ob3B0aW9uYWwgc3BlY2lmaWMgZXhjZXB0aW9uKTwvaT4KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXIuamF2YQppbmRleCBkZDQ5MjcxLi40N2I4YTkzIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlci5qYXZhCkBAIC00MjUsNyArNDI1LDcgQEAKICAgICAgKiBQZXJmb3JtcyB0aGUgc3BlY2lmaWVkIDxjb2RlPlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248L2NvZGU+IHdpdGgKICAgICAgKiBwcml2aWxlZ2VzIGVuYWJsZWQgYW5kIHJlc3RyaWN0ZWQgYnkgdGhlIHNwZWNpZmllZAogICAgICAqIDxjb2RlPkFjY2Vzc0NvbnRyb2xDb250ZXh0PC9jb2RlPi4gIFRoZSBhY3Rpb24gaXMgcGVyZm9ybWVkIHdpdGggdGhlCi0gICAgICogaW50ZXJzZWN0aW9uIG9mIHRoZSB0aGUgcGVybWlzc2lvbnMgcG9zc2Vzc2VkIGJ5IHRoZSBjYWxsZXIncworICAgICAqIGludGVyc2VjdGlvbiBvZiB0aGUgcGVybWlzc2lvbnMgcG9zc2Vzc2VkIGJ5IHRoZSBjYWxsZXIncwogICAgICAqIHByb3RlY3Rpb24gZG9tYWluLCBhbmQgdGhvc2UgcG9zc2Vzc2VkIGJ5IHRoZSBkb21haW5zIHJlcHJlc2VudGVkIGJ5IHRoZQogICAgICAqIHNwZWNpZmllZCA8Y29kZT5BY2Nlc3NDb250cm9sQ29udGV4dDwvY29kZT4uCiAgICAgICogPHA+CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJzU3BpLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9BbGdvcml0aG1QYXJhbWV0ZXJzU3BpLmphdmEKaW5kZXggNGJmZjg2ZC4uYTcwZmFmMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvQWxnb3JpdGhtUGFyYW1ldGVyc1NwaS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L0FsZ29yaXRobVBhcmFtZXRlcnNTcGkuamF2YQpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICogcGFyYW1ldGVycyBzaG91bGQgYmUgcmV0dXJuZWQgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlCiAgICAgICogPGNvZGU+RFNBUGFyYW1ldGVyU3BlYzwvY29kZT4gY2xhc3MuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1TcGVjIHRoZSB0aGUgc3BlY2lmaWNhdGlvbiBjbGFzcyBpbiB3aGljaAorICAgICAqIEBwYXJhbSBwYXJhbVNwZWMgdGhlIHNwZWNpZmljYXRpb24gY2xhc3MgaW4gd2hpY2gKICAgICAgKiB0aGUgcGFyYW1ldGVycyBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbi4KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24uamF2YQppbmRleCA0ZjQyYzAyLi5kMTdkMjFhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uICh0aGUgZXhjZXB0aW9uIHRocm93biBieQorICAgICAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uICh0aGUgZXhjZXB0aW9uIHRocm93biBieQogICAgICAqIHRoZSBwcml2aWxlZ2VkIGNvbXB1dGF0aW9uIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwogICAgICAqIDxjb2RlPlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb248L2NvZGU+KS4KICAgICAgKgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvU2VjdXJpdHkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5LmphdmEKaW5kZXggN2VkNzk1Ni4uYzdkNjk1MCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvU2VjdXJpdHkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9TZWN1cml0eS5qYXZhCkBAIC01MDEsNyArNTAxLDcgQEAKICAgICAgKiA8bGk+IDxpPiZsdDtjcnlwdG9fc2VydmljZT4uJmx0O2FsZ29yaXRobV9vcl90eXBlPgogICAgICAqICZsdDthdHRyaWJ1dGVfbmFtZT46Jmx0IGF0dHJpYnV0ZV92YWx1ZT48L2k+CiAgICAgICogPHA+IFRoZSBjcnlwdG9ncmFwaGljIHNlcnZpY2UgbmFtZSBtdXN0IG5vdCBjb250YWluIGFueSBkb3RzLiBUaGVyZQotICAgICAqIG11c3QgYmUgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmF0ZXJzIGJldHdlZW4gdGhlIHRoZQorICAgICAqIG11c3QgYmUgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmF0ZXJzIGJldHdlZW4gdGhlCiAgICAgICogPGk+Jmx0O2FsZ29yaXRobV9vcl90eXBlPjwvaT4gYW5kIHRoZSA8aT4mbHQ7YXR0cmlidXRlX25hbWU+PC9pPi4KICAgICAgKiAgPHA+IEEgcHJvdmlkZXIgc2F0aXNmaWVzIHRoaXMgc2VsZWN0aW9uIGNyaXRlcmlvbiBpZmYgdGhlCiAgICAgICogcHJvdmlkZXIgaW1wbGVtZW50cyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobSBvciB0eXBlIGZvciB0aGUgc3BlY2lmaWVkCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9TZWN1cml0eVBlcm1pc3Npb24uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5UGVybWlzc2lvbi5qYXZhCmluZGV4IDQxNzQ0YWUuLjFkOTA0OWQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5UGVybWlzc2lvbi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5UGVybWlzc2lvbi5qYXZhCkBAIC0xMTgsNyArMTE4LDcgQEAKICAqICAgPHRkPnNldFByb3BlcnR5LntrZXl9PC90ZD4KICAqICAgPHRkPlNldHRpbmcgb2YgdGhlIHNlY3VyaXR5IHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBrZXk8L3RkPgogICogICA8dGQ+VGhpcyBjb3VsZCBpbmNsdWRlIHNldHRpbmcgYSBzZWN1cml0eSBwcm92aWRlciBvciBkZWZpbmluZwotICogdGhlIGxvY2F0aW9uIG9mIHRoZSB0aGUgc3lzdGVtLXdpZGUgc2VjdXJpdHkgcG9saWN5LiAgTWFsaWNpb3VzCisgKiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5c3RlbS13aWRlIHNlY3VyaXR5IHBvbGljeS4gIE1hbGljaW91cwogICogY29kZSB0aGF0IGhhcyBwZXJtaXNzaW9uIHRvIHNldCBhIG5ldyBzZWN1cml0eSBwcm92aWRlciBtYXkKICAqIHNldCBhIHJvZ3VlIHByb3ZpZGVyIHRoYXQgc3RlYWxzIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiBzdWNoCiAgKiBhcyBjcnlwdG9ncmFwaGljIHByaXZhdGUga2V5cy4gSW4gYWRkaXRpb24sIG1hbGljaW91cyBjb2RlIHdpdGgKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1NpZ25hdHVyZVNwaS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlU3BpLmphdmEKaW5kZXggNGI2MDQ5Yy4uYjZiZjM0NyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlU3BpLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvU2lnbmF0dXJlU3BpLmphdmEKQEAgLTMxNiw3ICszMTYsNyBAQAogICAgICAqIG92ZXJyaWRkZW4gYnkgYSBwcm92aWRlcgogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzCi0gICAgICogb3ZlcnJpZGRlbiBieSBhIHByb3ZpZGVyIGFuZCB0aGUgdGhlIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKiBvdmVycmlkZGVuIGJ5IGEgcHJvdmlkZXIgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCiAgICAgICogYXJlIGluYXBwcm9wcmlhdGUgZm9yIHRoaXMgc2lnbmF0dXJlIGVuZ2luZQogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZVNldFBhcmFtZXRlcihBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeS5qYXZhCmluZGV4IDk2MWUxNWQuLmYxMDU5ZDEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnkuamF2YQpAQCAtNDYwLDcgKzQ2MCw3IEBACiAgICAgICoge0BsaW5rIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVzZXQoKSByZXNldH0sIHRoaXMgbWV0aG9kIHdpbGwKICAgICAgKiBjb25zdW1lIHRoZSBlbnRpcmUgaW5wdXQgc3RyZWFtLiBPdGhlcndpc2UsIGVhY2ggY2FsbCB0byB0aGlzCiAgICAgICogbWV0aG9kIGNvbnN1bWVzIG9uZSBDUkwgYW5kIHRoZSByZWFkIHBvc2l0aW9uIG9mIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBpcyBwb3NpdGlvbmVkIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBieXRlIGFmdGVyIHRoZSB0aGUgaW5oZXJlbnQKKyAgICAgKiBpcyBwb3NpdGlvbmVkIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBieXRlIGFmdGVyIHRoZSBpbmhlcmVudAogICAgICAqIGVuZC1vZi1DUkwgbWFya2VyLiBJZiB0aGUgZGF0YSBpbiB0aGUKICAgICAgKiBpbnB1dCBzdHJlYW0gZG9lcyBub3QgY29udGFpbiBhbiBpbmhlcmVudCBlbmQtb2YtQ1JMIG1hcmtlciAob3RoZXIKICAgICAgKiB0aGFuIEVPRikgYW5kIHRoZXJlIGlzIHRyYWlsaW5nIGRhdGEgYWZ0ZXIgdGhlIENSTCBpcyBwYXJzZWQsIGEKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5U3BpLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRmFjdG9yeVNwaS5qYXZhCmluZGV4IDVjMjQwMjcuLjI5ZWI3NGIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVGYWN0b3J5U3BpLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUZhY3RvcnlTcGkuamF2YQpAQCAtODgsNyArODgsNyBAQAogICAgICAqIHtAbGluayBqYXZhLmlvLklucHV0U3RyZWFtI3Jlc2V0KCkgcmVzZXR9LCB0aGlzIG1ldGhvZCB3aWxsCiAgICAgICogY29uc3VtZSB0aGUgZW50aXJlIGlucHV0IHN0cmVhbS4gT3RoZXJ3aXNlLCBlYWNoIGNhbGwgdG8gdGhpcwogICAgICAqIG1ldGhvZCBjb25zdW1lcyBvbmUgY2VydGlmaWNhdGUgYW5kIHRoZSByZWFkIHBvc2l0aW9uIG9mIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBpcyBwb3NpdGlvbmVkIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBieXRlIGFmdGVyIHRoZSB0aGUgaW5oZXJlbnQKKyAgICAgKiBpcyBwb3NpdGlvbmVkIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBieXRlIGFmdGVyIHRoZSBpbmhlcmVudAogICAgICAqIGVuZC1vZi1jZXJ0aWZpY2F0ZSBtYXJrZXIuIElmIHRoZSBkYXRhIGluIHRoZQogICAgICAqIGlucHV0IHN0cmVhbSBkb2VzIG5vdCBjb250YWluIGFuIGluaGVyZW50IGVuZC1vZi1jZXJ0aWZpY2F0ZSBtYXJrZXIgKG90aGVyCiAgICAgICogdGhhbiBFT0YpIGFuZCB0aGVyZSBpcyB0cmFpbGluZyBkYXRhIGFmdGVyIHRoZSBjZXJ0aWZpY2F0ZSBpcyBwYXJzZWQsIGEKQEAgLTI2MSw3ICsyNjEsNyBAQAogICAgICAqIHtAbGluayBqYXZhLmlvLklucHV0U3RyZWFtI3Jlc2V0KCkgcmVzZXR9LCB0aGlzIG1ldGhvZCB3aWxsCiAgICAgICogY29uc3VtZSB0aGUgZW50aXJlIGlucHV0IHN0cmVhbS4gT3RoZXJ3aXNlLCBlYWNoIGNhbGwgdG8gdGhpcwogICAgICAqIG1ldGhvZCBjb25zdW1lcyBvbmUgQ1JMIGFuZCB0aGUgcmVhZCBwb3NpdGlvbiBvZiB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogaXMgcG9zaXRpb25lZCB0byB0aGUgbmV4dCBhdmFpbGFibGUgYnl0ZSBhZnRlciB0aGUgdGhlIGluaGVyZW50CisgICAgICogaXMgcG9zaXRpb25lZCB0byB0aGUgbmV4dCBhdmFpbGFibGUgYnl0ZSBhZnRlciB0aGUgaW5oZXJlbnQKICAgICAgKiBlbmQtb2YtQ1JMIG1hcmtlci4gSWYgdGhlIGRhdGEgaW4gdGhlCiAgICAgICogaW5wdXQgc3RyZWFtIGRvZXMgbm90IGNvbnRhaW4gYW4gaW5oZXJlbnQgZW5kLW9mLUNSTCBtYXJrZXIgKG90aGVyCiAgICAgICogdGhhbiBFT0YpIGFuZCB0aGVyZSBpcyB0cmFpbGluZyBkYXRhIGFmdGVyIHRoZSBDUkwgaXMgcGFyc2VkLCBhCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0NhbGVuZGFyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0NhbGVuZGFyLmphdmEKaW5kZXggN2ZhODI5Ni4uNWI3ZTI3NSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9DYWxlbmRhci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvQ2FsZW5kYXIuamF2YQpAQCAtNDEsOSArNDEsMTQgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PcHRpb25hbERhdGFFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHM7CiBpbXBvcnQgc3VuLnV0aWwuQnVkZGhpc3RDYWxlbmRhcjsKQEAgLTI2MjgsNiArMjYzMywxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJBY2Nlc3NDb250cm9sQ29udGV4dCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IElOU1RBTkNFOworICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgUnVudGltZVBlcm1pc3Npb24gcGVybSA9IG5ldyBSdW50aW1lUGVybWlzc2lvbigiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLnV0aWwuY2FsZW5kYXIiKTsKKyAgICAgICAgICAgIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBlcm1zID0gcGVybS5uZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpOworICAgICAgICAgICAgcGVybXMuYWRkKHBlcm0pOworICAgICAgICAgICAgSU5TVEFOQ0UgPSBuZXcgQWNjZXNzQ29udHJvbENvbnRleHQobmV3IFByb3RlY3Rpb25Eb21haW5bXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3RlY3Rpb25Eb21haW4obnVsbCwgcGVybXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlY29uc3RpdHV0ZXMgdGhpcyBvYmplY3QgZnJvbSBhIHN0cmVhbSAoaS5lLiwgZGVzZXJpYWxpemUgaXQpLgogICAgICAqLwpAQCAtMjY1NywxNyArMjY3NCwzMCBAQAogICAgICAgICBzZXJpYWxWZXJzaW9uT25TdHJlYW0gPSBjdXJyZW50U2VyaWFsVmVyc2lvbjsKIAogICAgICAgICAvLyBJZiB0aGVyZSdzIGEgWm9uZUluZm8gb2JqZWN0LCB1c2UgaXQgZm9yIHpvbmUuCisgICAgICAgIFpvbmVJbmZvIHppID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFpvbmVJbmZvIHppID0gKFpvbmVJbmZvKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmICh6aSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgem9uZSA9IHppOworICAgICAgICAgICAgemkgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248Wm9uZUluZm8+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFpvbmVJbmZvIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoWm9uZUluZm8pIGlucHV0LnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJBY2Nlc3NDb250cm9sQ29udGV4dC5JTlNUQU5DRSk7CisgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBhZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBPcHRpb25hbERhdGFFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoemkgIT0gbnVsbCkgeworICAgICAgICAgICAgem9uZSA9IHppOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgdGhlIGRlc2VyaWFsaXplZCBvYmplY3QgaGFzIGEgU2ltcGxlVGltZVpvbmUsIHRyeSB0bwpAQCAtMjY3Niw5ICsyNzA2LDkgQEAKICAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gYXMgbXVjaCBhcyBwb3NzaWJsZS4KICAgICAgICAgaWYgKHpvbmUgaW5zdGFuY2VvZiBTaW1wbGVUaW1lWm9uZSkgewogICAgICAgICAgICAgU3RyaW5nIGlkID0gem9uZS5nZXRJRCgpOwotICAgICAgICAgICAgVGltZVpvbmUgemkgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZShpZCk7Ci0gICAgICAgICAgICBpZiAoemkgIT0gbnVsbCAmJiB6aS5oYXNTYW1lUnVsZXMoem9uZSkgJiYgemkuZ2V0SUQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgem9uZSA9IHppOworICAgICAgICAgICAgVGltZVpvbmUgdHogPSBUaW1lWm9uZS5nZXRUaW1lWm9uZShpZCk7CisgICAgICAgICAgICBpZiAodHogIT0gbnVsbCAmJiB0ei5oYXNTYW1lUnVsZXMoem9uZSkgJiYgdHouZ2V0SUQoKS5lcXVhbHMoaWQpKSB7CisgICAgICAgICAgICAgICAgem9uZSA9IHR6OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ1JlY29yZC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ1JlY29yZC5qYXZhCmluZGV4IDZlZGEyMTEuLjBhY2Y5ZmEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dSZWNvcmQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvTG9nUmVjb3JkLmphdmEKQEAgLTI1LDYgKzI1LDggQEAKIAogcGFja2FnZSBqYXZhLnV0aWwubG9nZ2luZzsKIGltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKIGltcG9ydCBqYXZhLmlvLio7CiAKIC8qKgpAQCAtNjQsOSArNjYsMjQgQEAKICAqLwogCiBwdWJsaWMgY2xhc3MgTG9nUmVjb3JkIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2xvYmFsU2VxdWVuY2VOdW1iZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRUaHJlYWRJZD0xMDsKLSAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbDxJbnRlZ2VyPiB0aHJlYWRJZHMgPSBuZXcgVGhyZWFkTG9jYWw8SW50ZWdlcj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNMb25nIGdsb2JhbFNlcXVlbmNlTnVtYmVyCisgICAgICAgID0gbmV3IEF0b21pY0xvbmcoMCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aHJlYWRJRCB3aWxsIGJlIHRoZSBjdXJyZW50IHRocmVhZCdzCisgICAgICogdGhyZWFkIGlkLCBmb3IgZWFzZSBvZiBjb3JyZWxhdGlvbiwgdW5sZXNzIGl0IGlzIGdyZWF0ZXIgdGhhbgorICAgICAqIE1JTl9TRVFVRU5USUFMX1RIUkVBRF9JRCwgaW4gd2hpY2ggY2FzZSB3ZSB0cnkgaGFyZGVyIHRvIGtlZXAKKyAgICAgKiBvdXIgcHJvbWlzZSB0byBrZWVwIHRocmVhZElEcyB1bmlxdWUgYnkgYXZvaWRpbmcgY29sbGlzaW9ucyBkdWUKKyAgICAgKiB0byAzMi1iaXQgd3JhcGFyb3VuZC4gIFVuZm9ydHVuYXRlbHksIExvZ1JlY29yZC5nZXRUaHJlYWRJRCgpCisgICAgICogcmV0dXJucyBpbnQsIHdoaWxlIFRocmVhZC5nZXRJZCgpIHJldHVybnMgbG9uZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1NFUVVFTlRJQUxfVEhSRUFEX0lEID0gSW50ZWdlci5NQVhfVkFMVUUgLyAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBuZXh0VGhyZWFkSWQKKyAgICAgICAgPSBuZXcgQXRvbWljSW50ZWdlcihNSU5fU0VRVUVOVElBTF9USFJFQURfSUQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8SW50ZWdlcj4gdGhyZWFkSWRzCisgICAgICAgID0gbmV3IFRocmVhZExvY2FsPEludGVnZXI+KCk7CiAKICAgICAvKioKICAgICAgKiBAc2VyaWFsIExvZ2dpbmcgbWVzc2FnZSBsZXZlbApAQCAtMTIzLDYgKzE0MCwyMyBAQAogICAgIHByaXZhdGUgdHJhbnNpZW50IFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBuZXcgTG9nUmVjb3JkJ3MgdGhyZWFkSUQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVmYXVsdFRocmVhZElEKCkgeworICAgICAgICBsb25nIHRpZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKKyAgICAgICAgaWYgKHRpZCA8IE1JTl9TRVFVRU5USUFMX1RIUkVBRF9JRCkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIHRpZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEludGVnZXIgaWQgPSB0aHJlYWRJZHMuZ2V0KCk7CisgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlkID0gbmV4dFRocmVhZElkLmdldEFuZEluY3JlbWVudCgpOworICAgICAgICAgICAgICAgIHRocmVhZElkcy5zZXQoaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgTG9nUmVjb3JkIHdpdGggdGhlIGdpdmVuIGxldmVsIGFuZCBtZXNzYWdlIHZhbHVlcy4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgc2VxdWVuY2UgcHJvcGVydHkgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGEgbmV3IHVuaXF1ZSB2YWx1ZS4KQEAgLTE0NCwxNSArMTc4LDggQEAKICAgICAgICAgdGhpcy5sZXZlbCA9IGxldmVsOwogICAgICAgICBtZXNzYWdlID0gbXNnOwogICAgICAgICAvLyBBc3NpZ24gYSB0aHJlYWQgSUQgYW5kIGEgdW5pcXVlIHNlcXVlbmNlIG51bWJlci4KLSAgICAgICAgc3luY2hyb25pemVkIChMb2dSZWNvcmQuY2xhc3MpIHsKLSAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyID0gZ2xvYmFsU2VxdWVuY2VOdW1iZXIrKzsKLSAgICAgICAgICAgIEludGVnZXIgaWQgPSB0aHJlYWRJZHMuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlkID0gbmV3IEludGVnZXIobmV4dFRocmVhZElkKyspOwotICAgICAgICAgICAgICAgIHRocmVhZElkcy5zZXQoaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyZWFkSUQgPSBpZC5pbnRWYWx1ZSgpOwotICAgICAgICB9CisgICAgICAgIHNlcXVlbmNlTnVtYmVyID0gZ2xvYmFsU2VxdWVuY2VOdW1iZXIuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgIHRocmVhZElEID0gZGVmYXVsdFRocmVhZElEKCk7CiAgICAgICAgIG1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBuZWVkVG9JbmZlckNhbGxlciA9IHRydWU7CiAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2VyLmphdmEKaW5kZXggMjhmOTQyYS4uNWFlMmI0MiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXIuamF2YQpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAKICAgICAgICAgTG9nZ2VyIGxvZ2dlciA9IHRoaXM7CiAgICAgICAgIHdoaWxlIChsb2dnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChIYW5kbGVyIGhhbmRsZXIgOiBsb2dnZXIuaGFuZGxlcnMpIHsKKyAgICAgICAgICAgIGZvciAoSGFuZGxlciBoYW5kbGVyIDogbG9nZ2VyLmdldEhhbmRsZXJzKCkpIHsKICAgICAgICAgICAgICAgICBoYW5kbGVyLnB1Ymxpc2gocmVjb3JkKTsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC96aXAvWmlwQ29kZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcENvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0MmJlYQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcENvZGVyLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YS51dGlsLnppcDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQ7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHppcGZpbGUgbmFtZSBhbmQgY29tbWVudCBkZWNvZGluZyBhbmQgZW5jb2RpbmcKKyAqLworCitmaW5hbCBjbGFzcyBaaXBDb2RlciB7CisKKyAgICBTdHJpbmcgdG9TdHJpbmcoYnl0ZVtdIGJhLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIENoYXJzZXREZWNvZGVyIGNkID0gZGVjb2RlcigpLnJlc2V0KCk7CisgICAgICAgIGludCBsZW4gPSAoaW50KShsZW5ndGggKiBjZC5tYXhDaGFyc1BlckJ5dGUoKSk7CisgICAgICAgIGNoYXJbXSBjYSA9IG5ldyBjaGFyW2xlbl07CisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNhKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcChiYSwgMCwgbGVuZ3RoKTsKKyAgICAgICAgQ2hhckJ1ZmZlciBjYiA9IENoYXJCdWZmZXIud3JhcChjYSk7CisgICAgICAgIENvZGVyUmVzdWx0IGNyID0gY2QuZGVjb2RlKGJiLCBjYiwgdHJ1ZSk7CisgICAgICAgIGlmICghY3IuaXNVbmRlcmZsb3coKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY3IudG9TdHJpbmcoKSk7CisgICAgICAgIGNyID0gY2QuZmx1c2goY2IpOworICAgICAgICBpZiAoIWNyLmlzVW5kZXJmbG93KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNyLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjYSwgMCwgY2IucG9zaXRpb24oKSk7CisgICAgfQorCisgICAgU3RyaW5nIHRvU3RyaW5nKGJ5dGVbXSBiYSkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoYmEsIGJhLmxlbmd0aCk7CisgICAgfQorCisgICAgYnl0ZVtdIGdldEJ5dGVzKFN0cmluZyBzKSB7CisgICAgICAgIENoYXJzZXRFbmNvZGVyIGNlID0gZW5jb2RlcigpLnJlc2V0KCk7CisgICAgICAgIGNoYXJbXSBjYSA9IHMudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgaW50IGxlbiA9IChpbnQpKGNhLmxlbmd0aCAqIGNlLm1heEJ5dGVzUGVyQ2hhcigpKTsKKyAgICAgICAgYnl0ZVtdIGJhID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGJhOworICAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGJhKTsKKyAgICAgICAgQ2hhckJ1ZmZlciBjYiA9IENoYXJCdWZmZXIud3JhcChjYSk7CisgICAgICAgIENvZGVyUmVzdWx0IGNyID0gY2UuZW5jb2RlKGNiLCBiYiwgdHJ1ZSk7CisgICAgICAgIGlmICghY3IuaXNVbmRlcmZsb3coKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY3IudG9TdHJpbmcoKSk7CisgICAgICAgIGNyID0gY2UuZmx1c2goYmIpOworICAgICAgICBpZiAoIWNyLmlzVW5kZXJmbG93KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNyLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoYmIucG9zaXRpb24oKSA9PSBiYS5sZW5ndGgpICAvLyBkZWZlbnNpdmUgY29weT8KKyAgICAgICAgICAgIHJldHVybiBiYTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YoYmEsIGJiLnBvc2l0aW9uKCkpOworICAgIH0KKworICAgIC8vIGFzc3VtZSBpbnZva2VkIG9ubHkgaWYgInRoaXMiIGlzIG5vdCB1dGY4CisgICAgYnl0ZVtdIGdldEJ5dGVzVVRGOChTdHJpbmcgcykgeworICAgICAgICBpZiAoaXN1dGY4KQorICAgICAgICAgICAgcmV0dXJuIGdldEJ5dGVzKHMpOworICAgICAgICBpZiAodXRmOCA9PSBudWxsKQorICAgICAgICAgICAgdXRmOCA9IG5ldyBaaXBDb2RlcihDaGFyc2V0LmZvck5hbWUoIlVURi04IikpOworICAgICAgICByZXR1cm4gdXRmOC5nZXRCeXRlcyhzKTsKKyAgICB9CisKKworICAgIFN0cmluZyB0b1N0cmluZ1VURjgoYnl0ZVtdIGJhLCBpbnQgbGVuKSB7CisgICAgICAgIGlmIChpc3V0ZjgpCisgICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcoYmEsIGxlbik7CisgICAgICAgIGlmICh1dGY4ID09IG51bGwpCisgICAgICAgICAgICB1dGY4ID0gbmV3IFppcENvZGVyKENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKSk7CisgICAgICAgIHJldHVybiB1dGY4LnRvU3RyaW5nKGJhLCBsZW4pOworICAgIH0KKworICAgIGJvb2xlYW4gaXNVVEY4KCkgeworICAgICAgICByZXR1cm4gaXN1dGY4OworICAgIH0KKworICAgIHByaXZhdGUgQ2hhcnNldCBjczsKKyAgICBwcml2YXRlIENoYXJzZXREZWNvZGVyIGRlYzsKKyAgICBwcml2YXRlIENoYXJzZXRFbmNvZGVyIGVuYzsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXN1dGY4OworICAgIHByaXZhdGUgWmlwQ29kZXIgdXRmODsKKworICAgIHByaXZhdGUgWmlwQ29kZXIoQ2hhcnNldCBjcykgeworICAgICAgICB0aGlzLmNzID0gY3M7CisgICAgICAgIHRoaXMuaXN1dGY4ID0gY3MubmFtZSgpLmVxdWFscygiVVRGLTgiKTsKKyAgICB9CisKKyAgICBzdGF0aWMgWmlwQ29kZXIgZ2V0KENoYXJzZXQgY2hhcnNldCkgeworICAgICAgICByZXR1cm4gbmV3IFppcENvZGVyKGNoYXJzZXQpOworICAgIH0KKworICAgIHByaXZhdGUgQ2hhcnNldERlY29kZXIgZGVjb2RlcigpIHsKKyAgICAgICAgaWYgKGRlYyA9PSBudWxsKSB7CisgICAgICAgICAgICBkZWMgPSBjcy5uZXdEZWNvZGVyKCkKKyAgICAgICAgICAgICAgLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKQorICAgICAgICAgICAgICAub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlYzsKKyAgICB9CisKKyAgICBwcml2YXRlIENoYXJzZXRFbmNvZGVyIGVuY29kZXIoKSB7CisgICAgICAgIGlmIChlbmMgPT0gbnVsbCkgeworICAgICAgICAgICAgZW5jID0gY3MubmV3RW5jb2RlcigpCisgICAgICAgICAgICAgIC5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCkKKyAgICAgICAgICAgICAgLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbmM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC96aXAvWmlwQ29uc3RhbnRzNjQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcENvbnN0YW50czY0LmphdmEKaW5kZXggMWJmM2IxOC4uYjg0NGIyYyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC96aXAvWmlwQ29uc3RhbnRzNjQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3ppcC9aaXBDb25zdGFudHM2NC5qYXZhCkBAIC03Myw1ICs3MywxMiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgIFpJUDY0X0VYVFNJWiA9IDg7ICAgICAgIC8vIGNvbXByZXNzZWQgc2l6ZSwgOC1ieXRlCiAgICAgc3RhdGljIGZpbmFsIGludCAgWklQNjRfRVhUTEVOID0gMTY7ICAgICAgLy8gdW5jb21wcmVzc2VkIHNpemUsIDgtYnl0ZQogCisgICAgLyoKKyAgICAgKiBMYW5ndWFnZSBlbmNvZGluZyBmbGFnIEVGUworICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZTID0gMHg4MDA7ICAgICAgIC8vIElmIHRoaXMgYml0IGlzIHNldCB0aGUgZmlsZW5hbWUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWVudCBmaWVsZHMgZm9yIHRoaXMgZmlsZSBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5jb2RlZCB1c2luZyBVVEYtOC4KKwogICAgIHByaXZhdGUgWmlwQ29uc3RhbnRzNjQoKSB7fQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC96aXAvWmlwRW50cnkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcEVudHJ5LmphdmEKaW5kZXggNmMxNmE5YS4uOTZlM2I0ZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC96aXAvWmlwRW50cnkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3ppcC9aaXBFbnRyeS5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiAgICAgbG9uZyBzaXplID0gLTE7ICAgICAvLyB1bmNvbXByZXNzZWQgc2l6ZSBvZiBlbnRyeSBkYXRhCiAgICAgbG9uZyBjc2l6ZSA9IC0xOyAgICAvLyBjb21wcmVzc2VkIHNpemUgb2YgZW50cnkgZGF0YQogICAgIGludCBtZXRob2QgPSAtMTsgICAgLy8gY29tcHJlc3Npb24gbWV0aG9kCisgICAgaW50IGZsYWcgPSAwOyAgICAgICAvLyBnZW5lcmFsIHB1cnBvc2UgZmxhZwogICAgIGJ5dGVbXSBleHRyYTsgICAgICAgLy8gb3B0aW9uYWwgZXh0cmEgZmllbGQgZGF0YSBmb3IgZW50cnkKICAgICBTdHJpbmcgY29tbWVudDsgICAgIC8vIG9wdGlvbmFsIGNvbW1lbnQgc3RyaW5nIGZvciBlbnRyeQogCkBAIC01MywxMyArNTQsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkxBVEVEID0gODsKIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8qIFppcCBsaWJyYXJ5IGlzIGxvYWRlZCBmcm9tIFN5c3RlbS5pbml0aWFsaXplU3lzdGVtQ2xhc3MgKi8KLSAgICAgICAgaW5pdElEcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGluaXRJRHMoKTsKLQogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgemlwIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqCkBAIC05MCwyOCArODQsMTUgQEAKICAgICAgICAgc2l6ZSA9IGUuc2l6ZTsKICAgICAgICAgY3NpemUgPSBlLmNzaXplOwogICAgICAgICBtZXRob2QgPSBlLm1ldGhvZDsKKyAgICAgICAgZmxhZyA9IGUuZmxhZzsKICAgICAgICAgZXh0cmEgPSBlLmV4dHJhOwogICAgICAgICBjb21tZW50ID0gZS5jb21tZW50OwogICAgIH0KIAogICAgIC8qCi0gICAgICogQ3JlYXRlcyBhIG5ldyB6aXAgZW50cnkgZm9yIHRoZSBnaXZlbiBuYW1lIHdpdGggZmllbGRzIGluaXRpYWxpemVkCi0gICAgICogZnJvbSB0aGUgc3BlY2lmaWVkIGp6ZW50cnkgZGF0YS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHVuLWluaXRpYWxpemVkIHppcCBlbnRyeQogICAgICAqLwotICAgIFppcEVudHJ5KFN0cmluZyBuYW1lLCBsb25nIGp6ZW50cnkpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgaW5pdEZpZWxkcyhqemVudHJ5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGluaXRGaWVsZHMobG9uZyBqemVudHJ5KTsKLQotICAgIC8qCi0gICAgICogQ3JlYXRlcyBhIG5ldyB6aXAgZW50cnkgd2l0aCBmaWVsZHMgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgc3BlY2lmaWVkCi0gICAgICoganplbnRyeSBkYXRhLgotICAgICAqLwotICAgIFppcEVudHJ5KGxvbmcganplbnRyeSkgewotICAgICAgICBpbml0RmllbGRzKGp6ZW50cnkpOwotICAgIH0KKyAgICBaaXBFbnRyeSgpIHt9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnRyeS4KQEAgLTI1OCwxNiArMjM5LDE2IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBvcHRpb25hbCBjb21tZW50IHN0cmluZyBmb3IgdGhlIGVudHJ5LgorICAgICAqCisgICAgICogPHA+WklQIGVudHJ5IGNvbW1lbnRzIGhhdmUgbWF4aW11bSBsZW5ndGggb2YgMHhmZmZmLiBJZiB0aGUgbGVuZ3RoIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBjb21tZW50IHN0cmluZyBpcyBncmVhdGVyIHRoYW4gMHhGRkZGIGJ5dGVzIGFmdGVyIGVuY29kaW5nLCBvbmx5CisgICAgICogdGhlIGZpcnN0IDB4RkZGRiBieXRlcyBhcmUgb3V0cHV0IHRvIHRoZSBaSVAgZmlsZSBlbnRyeS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50IHN0cmluZwotICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsZW5ndGggb2YgdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAgICAgY29tbWVudCBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIDB4RkZGRiBieXRlcworICAgICAqCiAgICAgICogQHNlZSAjZ2V0Q29tbWVudCgpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAweGZmZmYvMwotICAgICAgICAgICAgICAgICAgICAmJiBaaXBPdXRwdXRTdHJlYW0uZ2V0VVRGOExlbmd0aChjb21tZW50KSA+IDB4ZmZmZikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBlbnRyeSBjb21tZW50IGxlbmd0aCIpOwotICAgICAgICB9CiAgICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3ppcC9aaXBGaWxlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3ppcC9aaXBGaWxlLmphdmEKaW5kZXggMzdlOTJkZC4uOGVlMGJjMiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC96aXAvWmlwRmlsZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcEZpbGUuamF2YQpAQCAtMjksOSArMjksMTEgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC56aXAuWmlwQ29uc3RhbnRzNjQuKjsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBlbnRyaWVzIGZyb20gYSB6aXAgZmlsZS4KQEAgLTc2LDE2ICs3OCwxOSBAQAogICAgIC8qKgogICAgICAqIE9wZW5zIGEgemlwIGZpbGUgZm9yIHJlYWRpbmcuCiAgICAgICoKLSAgICAgKiA8cD5GaXJzdCwgaWYgdGhlcmUgaXMgYSBzZWN1cml0eQotICAgICAqIG1hbmFnZXIsIGl0cyA8Y29kZT5jaGVja1JlYWQ8L2NvZGU+IG1ldGhvZAotICAgICAqIGlzIGNhbGxlZCB3aXRoIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBhcmd1bWVudAotICAgICAqIGFzIGl0cyBhcmd1bWVudCB0byBlbnN1cmUgdGhlIHJlYWQgaXMgYWxsb3dlZC4KKyAgICAgKiA8cD5GaXJzdCwgaWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyLCBpdHMgPGNvZGU+Y2hlY2tSZWFkPC9jb2RlPgorICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgPGNvZGU+bmFtZTwvY29kZT4gYXJndW1lbnQgYXMgaXRzIGFyZ3VtZW50CisgICAgICogdG8gZW5zdXJlIHRoZSByZWFkIGlzIGFsbG93ZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGUgVVRGLTgge0BsaW5rIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBjaGFyc2V0fSBpcyB1c2VkIHRvCisgICAgICogZGVjb2RlIHRoZSBlbnRyeSBuYW1lcyBhbmQgY29tbWVudHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgemlwIGZpbGUKICAgICAgKiBAdGhyb3dzIFppcEV4Y2VwdGlvbiBpZiBhIFpJUCBmb3JtYXQgZXJyb3IgaGFzIG9jY3VycmVkCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMKICAgICAgKiAgICAgICAgIDxjb2RlPmNoZWNrUmVhZDwvY29kZT4gbWV0aG9kIGRvZXNuJ3QgYWxsb3cgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUuCisgICAgICoKICAgICAgKiBAc2VlIFNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoamF2YS5sYW5nLlN0cmluZykKICAgICAgKi8KICAgICBwdWJsaWMgWmlwRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEwMSw2ICsxMDYsOSBAQAogICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgPGNvZGU+bmFtZTwvY29kZT4gYXJndW1lbnQgYXMgaXRzIGFyZ3VtZW50IHRvCiAgICAgICogZW5zdXJlIHRoZSByZWFkIGlzIGFsbG93ZWQuCiAgICAgICoKKyAgICAgKiA8cD5UaGUgVVRGLTgge0BsaW5rIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBjaGFyc2V0fSBpcyB1c2VkIHRvCisgICAgICogZGVjb2RlIHRoZSBlbnRyeSBuYW1lcyBhbmQgY29tbWVudHMKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlIHRoZSBaSVAgZmlsZSB0byBiZSBvcGVuZWQgZm9yIHJlYWRpbmcKICAgICAgKiBAcGFyYW0gbW9kZSB0aGUgbW9kZSBpbiB3aGljaCB0aGUgZmlsZSBpcyB0byBiZSBvcGVuZWQKICAgICAgKiBAdGhyb3dzIFppcEV4Y2VwdGlvbiBpZiBhIFpJUCBmb3JtYXQgZXJyb3IgaGFzIG9jY3VycmVkCkBAIC0xMTUsNiArMTIzLDU5IEBACiAgICAgICogQHNpbmNlIDEuMwogICAgICAqLwogICAgIHB1YmxpYyBaaXBGaWxlKEZpbGUgZmlsZSwgaW50IG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoZmlsZSwgbW9kZSwgQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIFpJUCBmaWxlIGZvciByZWFkaW5nIGdpdmVuIHRoZSBzcGVjaWZpZWQgRmlsZSBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD5UaGUgVVRGLTgge0BsaW5rIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBjaGFyc2V0fSBpcyB1c2VkIHRvCisgICAgICogZGVjb2RlIHRoZSBlbnRyeSBuYW1lcyBhbmQgY29tbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgWklQIGZpbGUgdG8gYmUgb3BlbmVkIGZvciByZWFkaW5nCisgICAgICogQHRocm93cyBaaXBFeGNlcHRpb24gaWYgYSBaSVAgZm9ybWF0IGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBaaXBGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKGZpbGUsIE9QRU5fUkVBRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBaaXBDb2RlciB6YzsKKworICAgIC8qKgorICAgICAqIE9wZW5zIGEgbmV3IDxjb2RlPlppcEZpbGU8L2NvZGU+IHRvIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IGluIHRoZSBzcGVjaWZpZWQgbW9kZS4gIFRoZSBtb2RlIGFyZ3VtZW50CisgICAgICogbXVzdCBiZSBlaXRoZXIgPHR0Pk9QRU5fUkVBRDwvdHQ+IG9yIDx0dD5PUEVOX1JFQUQgfCBPUEVOX0RFTEVURTwvdHQ+LgorICAgICAqCisgICAgICogPHA+Rmlyc3QsIGlmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciwgaXRzIDxjb2RlPmNoZWNrUmVhZDwvY29kZT4KKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGFyZ3VtZW50IGFzIGl0cyBhcmd1bWVudCB0bworICAgICAqIGVuc3VyZSB0aGUgcmVhZCBpcyBhbGxvd2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIFpJUCBmaWxlIHRvIGJlIG9wZW5lZCBmb3IgcmVhZGluZworICAgICAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIGluIHdoaWNoIHRoZSBmaWxlIGlzIHRvIGJlIG9wZW5lZAorICAgICAqIEBwYXJhbSBjaGFyc2V0CisgICAgICogICAgICAgIHRoZSB7QGxpbmsgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IHtAY29kZSBjaGFyc2V0fX0gdG8KKyAgICAgKiAgICAgICAgYmUgdXNlZCB0byBkZWNvZGUgdGhlIFpJUCBlbnRyeSBuYW1lIGFuZCBjb21tZW50IHRoYXQgYXJlIG5vdAorICAgICAqICAgICAgICBlbmNvZGVkIGJ5IHVzaW5nIFVURi04IGVuY29kaW5nIChpbmRpY2F0ZWQgYnkgZW50cnkncyBnZW5lcmFsCisgICAgICogICAgICAgIHB1cnBvc2UgZmxhZykuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFppcEV4Y2VwdGlvbiBpZiBhIFpJUCBmb3JtYXQgZXJyb3IgaGFzIG9jY3VycmVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMgPGNvZGU+Y2hlY2tSZWFkPC9jb2RlPgorICAgICAqICAgICAgICAgbWV0aG9kIGRvZXNuJ3QgYWxsb3cgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUsb3IgaXRzCisgICAgICogICAgICAgICA8Y29kZT5jaGVja0RlbGV0ZTwvY29kZT4gbWV0aG9kIGRvZXNuJ3QgYWxsb3cgZGVsZXRpbmcgdGhlCisgICAgICogICAgICAgICBmaWxlIHdoZW4gdGhlIDx0dD5PUEVOX0RFTEVURTwvdHQ+IGZsYWcgaXMgc2V0CisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgPHR0Pm1vZGU8L3R0PiBhcmd1bWVudCBpcyBpbnZhbGlkCisgICAgICoKKyAgICAgKiBAc2VlIFNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwRmlsZShGaWxlIGZpbGUsIGludCBtb2RlLCBDaGFyc2V0IGNoYXJzZXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKICAgICAgICAgaWYgKCgobW9kZSAmIE9QRU5fUkVBRCkgPT0gMCkgfHwKICAgICAgICAgICAgICgobW9kZSAmIH4oT1BFTl9SRUFEIHwgT1BFTl9ERUxFVEUpKSAhPSAwKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBtb2RlOiAweCIrCkBAIC0xMjgsMjQgKzE4OSw2MSBAQAogICAgICAgICAgICAgICAgIHNtLmNoZWNrRGVsZXRlKG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChjaGFyc2V0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImNoYXJzZXQgaXMgbnVsbCIpOworICAgICAgICB0aGlzLnpjID0gWmlwQ29kZXIuZ2V0KGNoYXJzZXQpOwogICAgICAgICBqemZpbGUgPSBvcGVuKG5hbWUsIG1vZGUsIGZpbGUubGFzdE1vZGlmaWVkKCkpOwotCiAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgIHRoaXMudG90YWwgPSBnZXRUb3RhbChqemZpbGUpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIG9wZW4oU3RyaW5nIG5hbWUsIGludCBtb2RlLCBsb25nIGxhc3RNb2RpZmllZCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRUb3RhbChsb25nIGp6ZmlsZSk7Ci0KKyAgICAvKioKKyAgICAgKiBPcGVucyBhIHppcCBmaWxlIGZvciByZWFkaW5nLgorICAgICAqCisgICAgICogPHA+Rmlyc3QsIGlmIHRoZXJlIGlzIGEgc2VjdXJpdHkgbWFuYWdlciwgaXRzIDxjb2RlPmNoZWNrUmVhZDwvY29kZT4KKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGFyZ3VtZW50IGFzIGl0cyBhcmd1bWVudAorICAgICAqIHRvIGVuc3VyZSB0aGUgcmVhZCBpcyBhbGxvd2VkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHppcCBmaWxlCisgICAgICogQHBhcmFtIGNoYXJzZXQKKyAgICAgKiAgICAgICAgdGhlIHtAbGluayBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQge0Bjb2RlIGNoYXJzZXR9fSB0bworICAgICAqICAgICAgICBiZSB1c2VkIHRvIGRlY29kZSB0aGUgWklQIGVudHJ5IG5hbWUgYW5kIGNvbW1lbnQgdGhhdCBhcmUgbm90CisgICAgICogICAgICAgIGVuY29kZWQgYnkgdXNpbmcgVVRGLTggZW5jb2RpbmcgKGluZGljYXRlZCBieSBlbnRyeSdzIGdlbmVyYWwKKyAgICAgKiAgICAgICAgcHVycG9zZSBmbGFnKS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uIGlmIGEgWklQIGZvcm1hdCBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICogICAgICAgICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpdHMgPGNvZGU+Y2hlY2tSZWFkPC9jb2RlPgorICAgICAqICAgICAgICAgbWV0aG9kIGRvZXNuJ3QgYWxsb3cgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUKKyAgICAgKgorICAgICAqIEBzZWUgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHB1YmxpYyBaaXBGaWxlKFN0cmluZyBuYW1lLCBDaGFyc2V0IGNoYXJzZXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcyhuZXcgRmlsZShuYW1lKSwgT1BFTl9SRUFELCBjaGFyc2V0KTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBPcGVucyBhIFpJUCBmaWxlIGZvciByZWFkaW5nIGdpdmVuIHRoZSBzcGVjaWZpZWQgRmlsZSBvYmplY3QuCiAgICAgICogQHBhcmFtIGZpbGUgdGhlIFpJUCBmaWxlIHRvIGJlIG9wZW5lZCBmb3IgcmVhZGluZwotICAgICAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uIGlmIGEgWklQIGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBjaGFyc2V0CisgICAgICogICAgICAgIFRoZSB7QGxpbmsgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IHtAY29kZSBjaGFyc2V0fX0gdG8gYmUKKyAgICAgKiAgICAgICAgdXNlZCB0byBkZWNvZGUgdGhlIFpJUCBlbnRyeSBuYW1lIGFuZCBjb21tZW50IChpZ25vcmVkIGlmCisgICAgICogICAgICAgIHRoZSA8YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCNsYW5nX2VuY29kaW5nIj4gbGFuZ3VhZ2UKKyAgICAgKiAgICAgICAgZW5jb2RpbmcgYml0PC9hPiBvZiB0aGUgWklQIGVudHJ5J3MgZ2VuZXJhbCBwdXJwb3NlIGJpdAorICAgICAqICAgICAgICBmbGFnIGlzIHNldCkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFppcEV4Y2VwdGlvbiBpZiBhIFpJUCBmb3JtYXQgZXJyb3IgaGFzIG9jY3VycmVkCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCisgICAgICoKKyAgICAgKiBAc2luY2UgMS43CiAgICAgICovCi0gICAgcHVibGljIFppcEZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMoZmlsZSwgT1BFTl9SRUFEKTsKKyAgICBwdWJsaWMgWmlwRmlsZShGaWxlIGZpbGUsIENoYXJzZXQgY2hhcnNldCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0aGlzKGZpbGUsIE9QRU5fUkVBRCwgY2hhcnNldCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjMsOSArMjYxLDkgQEAKICAgICAgICAgbG9uZyBqemVudHJ5ID0gMDsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBlbnN1cmVPcGVuKCk7Ci0gICAgICAgICAgICBqemVudHJ5ID0gZ2V0RW50cnkoanpmaWxlLCBuYW1lLCB0cnVlKTsKKyAgICAgICAgICAgIGp6ZW50cnkgPSBnZXRFbnRyeShqemZpbGUsIHpjLmdldEJ5dGVzKG5hbWUpLCB0cnVlKTsKICAgICAgICAgICAgIGlmIChqemVudHJ5ICE9IDApIHsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeShuYW1lLCBqemVudHJ5KTsKKyAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IGdldFppcEVudHJ5KG5hbWUsIGp6ZW50cnkpOwogICAgICAgICAgICAgICAgIGZyZWVFbnRyeShqemZpbGUsIGp6ZW50cnkpOwogICAgICAgICAgICAgICAgIHJldHVybiB6ZTsKICAgICAgICAgICAgIH0KQEAgLTE3Myw3ICsyNzEsNyBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZyBnZXRFbnRyeShsb25nIGp6ZmlsZSwgU3RyaW5nIG5hbWUsCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgZ2V0RW50cnkobG9uZyBqemZpbGUsIGJ5dGVbXSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkU2xhc2gpOwogCiAgICAgLy8gZnJlZUVudHJ5IHJlbGVhc2VzIHRoZSBDIGp6ZW50cnkgc3RydWN0LgpAQCAtMTk0LDM2ICsyOTIsMzAgQEAKICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgemlwIGZpbGUgaGFzIGJlZW4gY2xvc2VkCiAgICAgICovCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFppcEVudHJ5IGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SW5wdXRTdHJlYW0oZW50cnkubmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gZm9yIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBlbnRyeSwgb3IgbnVsbCBpZiB0aGUgZW50cnkgd2FzIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5hbWUiKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW50cnkiKTsKICAgICAgICAgfQogICAgICAgICBsb25nIGp6ZW50cnkgPSAwOwogICAgICAgICBaaXBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGVuc3VyZU9wZW4oKTsKLSAgICAgICAgICAgIGp6ZW50cnkgPSBnZXRFbnRyeShqemZpbGUsIG5hbWUsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmICghemMuaXNVVEY4KCkgJiYgKGVudHJ5LmZsYWcgJiBFRlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBqemVudHJ5ID0gZ2V0RW50cnkoanpmaWxlLCB6Yy5nZXRCeXRlc1VURjgoZW50cnkubmFtZSksIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAganplbnRyeSA9IGdldEVudHJ5KGp6ZmlsZSwgemMuZ2V0Qnl0ZXMoZW50cnkubmFtZSksIGZhbHNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChqemVudHJ5ID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgaW4gPSBuZXcgWmlwRmlsZUlucHV0U3RyZWFtKGp6ZW50cnkpOwotCiAgICAgICAgIH0KICAgICAgICAgZmluYWwgWmlwRmlsZUlucHV0U3RyZWFtIHpmaW4gPSBpbjsKLSAgICAgICAgc3dpdGNoIChnZXRNZXRob2QoanplbnRyeSkpIHsKKyAgICAgICAgc3dpdGNoIChnZXRFbnRyeU1ldGhvZChqemVudHJ5KSkgewogICAgICAgICBjYXNlIFNUT1JFRDoKICAgICAgICAgICAgIHJldHVybiB6ZmluOwogICAgICAgICBjYXNlIERFRkxBVEVEOgogICAgICAgICAgICAgLy8gTU9SRTogQ29tcHV0ZSBnb29kIHNpemUgZm9yIGluZmxhdGVyIHN0cmVhbToKLSAgICAgICAgICAgIGxvbmcgc2l6ZSA9IGdldFNpemUoanplbnRyeSkgKyAyOyAvLyBJbmZsYXRlciBsaWtlcyBhIGJpdCBvZiBzbGFjaworICAgICAgICAgICAgbG9uZyBzaXplID0gZ2V0RW50cnlTaXplKGp6ZW50cnkpICsgMjsgLy8gSW5mbGF0ZXIgbGlrZXMgYSBiaXQgb2Ygc2xhY2sKICAgICAgICAgICAgIGlmIChzaXplID4gNjU1MzYpIHNpemUgPSA4MTkyOwogICAgICAgICAgICAgaWYgKHNpemUgPD0gMCkgc2l6ZSA9IDQwOTY7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEluZmxhdGVySW5wdXRTdHJlYW0oemZpbiwgZ2V0SW5mbGF0ZXIoKSwgKGludClzaXplKSB7CkBAIC0yNjcsOCArMzU5LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0TWV0aG9kKGxvbmcganplbnRyeSk7Ci0KICAgICAvKgogICAgICAqIEdldHMgYW4gaW5mbGF0ZXIgZnJvbSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgaW5mbGF0ZXJzIG9yIGFsbG9jYXRlcwogICAgICAqIGEgbmV3IG9uZS4KQEAgLTM0Myw3ICs0MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLFxuIG1lc3NhZ2UgPSAiICsgbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoanplbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IGdldFppcEVudHJ5KG51bGwsIGp6ZW50cnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgZnJlZUVudHJ5KGp6ZmlsZSwganplbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gemU7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1MSw2ICs0NDEsMzggQEAKICAgICAgICAgICAgIH07CiAgICAgfQogCisgICAgcHJpdmF0ZSBaaXBFbnRyeSBnZXRaaXBFbnRyeShTdHJpbmcgbmFtZSwgbG9uZyBqemVudHJ5KSB7CisgICAgICAgIFppcEVudHJ5IGUgPSBuZXcgWmlwRW50cnkoKTsKKyAgICAgICAgZS5mbGFnID0gZ2V0RW50cnlGbGFnKGp6ZW50cnkpOyAgLy8gZ2V0IHRoZSBmbGFnIGZpcnN0CisgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGUubmFtZSA9IG5hbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBieXRlW10gYm5hbWUgPSBnZXRFbnRyeUJ5dGVzKGp6ZW50cnksIEpaRU5UUllfTkFNRSk7CisgICAgICAgICAgICBpZiAoIXpjLmlzVVRGOCgpICYmIChlLmZsYWcgJiBFRlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBlLm5hbWUgPSB6Yy50b1N0cmluZ1VURjgoYm5hbWUsIGJuYW1lLmxlbmd0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGUubmFtZSA9IHpjLnRvU3RyaW5nKGJuYW1lLCBibmFtZS5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGUudGltZSA9IGdldEVudHJ5VGltZShqemVudHJ5KTsKKyAgICAgICAgZS5jcmMgPSBnZXRFbnRyeUNyYyhqemVudHJ5KTsKKyAgICAgICAgZS5zaXplID0gZ2V0RW50cnlTaXplKGp6ZW50cnkpOworICAgICAgICBlLiBjc2l6ZSA9IGdldEVudHJ5Q1NpemUoanplbnRyeSk7CisgICAgICAgIGUubWV0aG9kID0gZ2V0RW50cnlNZXRob2QoanplbnRyeSk7CisgICAgICAgIGUuZXh0cmEgPSBnZXRFbnRyeUJ5dGVzKGp6ZW50cnksIEpaRU5UUllfRVhUUkEpOworICAgICAgICBieXRlW10gYmNvbW0gPSBnZXRFbnRyeUJ5dGVzKGp6ZW50cnksIEpaRU5UUllfQ09NTUVOVCk7CisgICAgICAgIGlmIChiY29tbSA9PSBudWxsKSB7CisgICAgICAgICAgICBlLmNvbW1lbnQgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCF6Yy5pc1VURjgoKSAmJiAoZS5mbGFnICYgRUZTKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZS5jb21tZW50ID0gemMudG9TdHJpbmdVVEY4KGJjb21tLCBiY29tbS5sZW5ndGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlLmNvbW1lbnQgPSB6Yy50b1N0cmluZyhiY29tbSwgYmNvbW0ubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZyBnZXROZXh0RW50cnkobG9uZyBqemZpbGUsIGludCBpKTsKIAogICAgIC8qKgpAQCAtNDQzLDggKzU2NSw4IEBACiAKICAgICAgICAgWmlwRmlsZUlucHV0U3RyZWFtKGxvbmcganplbnRyeSkgewogICAgICAgICAgICAgcG9zID0gMDsKLSAgICAgICAgICAgIHJlbSA9IGdldENTaXplKGp6ZW50cnkpOwotICAgICAgICAgICAgc2l6ZSA9IGdldFNpemUoanplbnRyeSk7CisgICAgICAgICAgICByZW0gPSBnZXRFbnRyeUNTaXplKGp6ZW50cnkpOworICAgICAgICAgICAgc2l6ZSA9IGdldEVudHJ5U2l6ZShqemVudHJ5KTsKICAgICAgICAgICAgIHRoaXMuanplbnRyeSA9IGp6ZW50cnk7CiAgICAgICAgIH0KIApAQCAtNTE0LDEzICs2MzYsMjUgQEAKIAogICAgIH0KIAorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgb3BlbihTdHJpbmcgbmFtZSwgaW50IG1vZGUsIGxvbmcgbGFzdE1vZGlmaWVkKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRUb3RhbChsb25nIGp6ZmlsZSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCByZWFkKGxvbmcganpmaWxlLCBsb25nIGp6ZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zLCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbik7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZyBnZXRDU2l6ZShsb25nIGp6ZW50cnkpOworICAgIC8vIGFjY2VzcyB0byB0aGUgbmF0aXZlIHplbnRyeSBvYmplY3QKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZyBnZXRFbnRyeVRpbWUobG9uZyBqemVudHJ5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZyBnZXRFbnRyeUNyYyhsb25nIGp6ZW50cnkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIGdldEVudHJ5Q1NpemUobG9uZyBqemVudHJ5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZyBnZXRFbnRyeVNpemUobG9uZyBqemVudHJ5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEVudHJ5TWV0aG9kKGxvbmcganplbnRyeSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRFbnRyeUZsYWcobG9uZyBqemVudHJ5KTsKIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIGdldFNpemUobG9uZyBqemVudHJ5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSlpFTlRSWV9OQU1FID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSlpFTlRSWV9FWFRSQSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpaRU5UUllfQ09NTUVOVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBnZXRFbnRyeUJ5dGVzKGxvbmcganplbnRyeSwgaW50IHR5cGUpOwogCi0gICAgLy8gVGVtcG9yYXJ5IGFkZCBvbiBmb3IgYnVnIHRyb3VibGVzaG9vdGluZwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0WmlwTWVzc2FnZShsb25nIGp6ZmlsZSk7CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3ppcC9aaXBJbnB1dFN0cmVhbS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC96aXAvWmlwSW5wdXRTdHJlYW0uamF2YQppbmRleCAxYjliOTM0Li44M2Y5YWQ0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3ppcC9aaXBJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcElucHV0U3RyZWFtLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC56aXAuWmlwQ29uc3RhbnRzNjQuKjsKIAogLyoqCkBAIC01NCw2ICs1NSw4IEBACiAgICAgLy8gb25lIGVudHJ5CiAgICAgcHJpdmF0ZSBib29sZWFuIGVudHJ5RU9GID0gZmFsc2U7CiAKKyAgICBwcml2YXRlIFppcENvZGVyIHpjOworCiAgICAgLyoqCiAgICAgICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBzdHJlYW0gaGFzIG5vdCBiZWVuIGNsb3NlZAogICAgICAqLwpAQCAtNjUsMTQgKzY4LDM5IEBACiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IFpJUCBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiA8cD5UaGUgVVRGLTgge0BsaW5rIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBjaGFyc2V0fSBpcyB1c2VkIHRvCisgICAgICogZGVjb2RlIHRoZSBlbnRyeSBuYW1lcy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpbiB0aGUgYWN0dWFsIGlucHV0IHN0cmVhbQogICAgICAqLwogICAgIHB1YmxpYyBaaXBJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgeworICAgICAgICB0aGlzKGluLCBDaGFyc2V0LmZvck5hbWUoIlVURi04IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgWklQIGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgYWN0dWFsIGlucHV0IHN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIGNoYXJzZXQKKyAgICAgKiAgICAgICAgVGhlIHtAbGluayBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQge0Bjb2RlIGNoYXJzZXR9fSB0byBiZQorICAgICAqICAgICAgICB1c2VkIHRvIGRlY29kZSB0aGUgWklQIGVudHJ5IG5hbWUgKGlnbm9yZWQgaWYgdGhlCisgICAgICogICAgICAgIDxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sI2xhbmdfZW5jb2RpbmciPiBsYW5ndWFnZQorICAgICAqICAgICAgICBlbmNvZGluZyBiaXQ8L2E+IG9mIHRoZSBaSVAgZW50cnkncyBnZW5lcmFsIHB1cnBvc2UgYml0CisgICAgICogICAgICAgIGZsYWcgaXMgc2V0KS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIENoYXJzZXQgY2hhcnNldCkgewogICAgICAgICBzdXBlcihuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShpbiwgNTEyKSwgbmV3IEluZmxhdGVyKHRydWUpLCA1MTIpOwogICAgICAgICB1c2VzRGVmYXVsdEluZmxhdGVyID0gdHJ1ZTsKICAgICAgICAgaWYoaW4gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpbiBpcyBudWxsIik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY2hhcnNldCBpcyBudWxsIik7CisgICAgICAgIHRoaXMuemMgPSBaaXBDb2Rlci5nZXQoY2hhcnNldCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDEsOCArMTY5LDggQEAKICAgICAgKiBAcGFyYW0gbGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyByZWFkCiAgICAgICogQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQogICAgICAqICAgICAgICAgZW50cnkgaXMgcmVhY2hlZAotICAgICAqIEBleGNlcHRpb24gIE51bGxQb2ludGVyRXhjZXB0aW9uIElmIDxjb2RlPmI8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBleGNlcHRpb24gIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gSWYgPGNvZGU+b2ZmPC9jb2RlPiBpcyBuZWdhdGl2ZSwKKyAgICAgKiBAZXhjZXB0aW9uICBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5iPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAZXhjZXB0aW9uICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPm9mZjwvY29kZT4gaXMgbmVnYXRpdmUsCiAgICAgICogPGNvZGU+bGVuPC9jb2RlPiBpcyBuZWdhdGl2ZSwgb3IgPGNvZGU+bGVuPC9jb2RlPiBpcyBncmVhdGVyIHRoYW4KICAgICAgKiA8Y29kZT5iLmxlbmd0aCAtIG9mZjwvY29kZT4KICAgICAgKiBAZXhjZXB0aW9uIFppcEV4Y2VwdGlvbiBpZiBhIFpJUCBmaWxlIGVycm9yIGhhcyBvY2N1cnJlZApAQCAtMjUyLDYgKzI4MCw4IEBACiAgICAgICAgIGlmIChnZXQzMih0bXBidWYsIDApICE9IExPQ1NJRykgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KKyAgICAgICAgLy8gZ2V0IGZsYWcgZmlyc3QsIHdlIG5lZWQgY2hlY2sgRUZTLgorICAgICAgICBmbGFnID0gZ2V0MTYodG1wYnVmLCBMT0NGTEcpOwogICAgICAgICAvLyBnZXQgdGhlIGVudHJ5IG5hbWUgYW5kIGNyZWF0ZSB0aGUgWmlwRW50cnkgZmlyc3QKICAgICAgICAgaW50IGxlbiA9IGdldDE2KHRtcGJ1ZiwgTE9DTkFNKTsKICAgICAgICAgaW50IGJsZW4gPSBiLmxlbmd0aDsKQEAgLTI2Miw5ICsyOTIsMTEgQEAKICAgICAgICAgICAgIGIgPSBuZXcgYnl0ZVtibGVuXTsKICAgICAgICAgfQogICAgICAgICByZWFkRnVsbHkoYiwgMCwgbGVuKTsKLSAgICAgICAgWmlwRW50cnkgZSA9IGNyZWF0ZVppcEVudHJ5KGdldFVURjhTdHJpbmcoYiwgMCwgbGVuKSk7CisgICAgICAgIC8vIEZvcmNlIHRvIHVzZSBVVEYtOCBpZiB0aGUgRUZTIGJpdCBpcyBPTiwgZXZlbiB0aGUgY3MgaXMgTk9UIFVURi04CisgICAgICAgIFppcEVudHJ5IGUgPSBjcmVhdGVaaXBFbnRyeSgoKGZsYWcgJiBFRlMpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHpjLnRvU3RyaW5nVVRGOChiLCBsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHpjLnRvU3RyaW5nKGIsIGxlbikpOwogICAgICAgICAvLyBub3cgZ2V0IHRoZSByZW1haW5pbmcgZmllbGRzIGZvciB0aGUgZW50cnkKLSAgICAgICAgZmxhZyA9IGdldDE2KHRtcGJ1ZiwgTE9DRkxHKTsKICAgICAgICAgaWYgKChmbGFnICYgMSkgPT0gMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiZW5jcnlwdGVkIFpJUCBlbnRyeSBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KQEAgLTMxMyw3MSArMzQ1LDYgQEAKICAgICAgICAgcmV0dXJuIGU7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBGZXRjaGVzIGEgVVRGOC1lbmNvZGVkIFN0cmluZyBmcm9tIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VVRGOFN0cmluZyhieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgewotICAgICAgICAvLyBGaXJzdCwgY291bnQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzZXF1ZW5jZQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBpbnQgbWF4ID0gb2ZmICsgbGVuOwotICAgICAgICBpbnQgaSA9IG9mZjsKLSAgICAgICAgd2hpbGUgKGkgPCBtYXgpIHsKLSAgICAgICAgICAgIGludCBjID0gYltpKytdICYgMHhmZjsKLSAgICAgICAgICAgIHN3aXRjaCAoYyA+PiA0KSB7Ci0gICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzoKLSAgICAgICAgICAgICAgICAvLyAweHh4eHh4eAotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEyOiBjYXNlIDEzOgotICAgICAgICAgICAgICAgIC8vIDExMHh4eHh4IDEweHh4eHh4Ci0gICAgICAgICAgICAgICAgaWYgKChiW2krK10gJiAweGMwKSAhPSAweDgwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgLy8gMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKLSAgICAgICAgICAgICAgICBpZiAoKChiW2krK10gJiAweGMwKSAhPSAweDgwKSB8fAotICAgICAgICAgICAgICAgICAgICAoKGJbaSsrXSAmIDB4YzApICE9IDB4ODApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gMTB4eHh4eHgsIDExMTF4eHh4Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpICE9IG1heCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE5vdyBkZWNvZGUgdGhlIGNoYXJhY3RlcnMuLi4KLSAgICAgICAgY2hhcltdIGNzID0gbmV3IGNoYXJbY291bnRdOwotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKG9mZiA8IG1heCkgewotICAgICAgICAgICAgaW50IGMgPSBiW29mZisrXSAmIDB4ZmY7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMgPj4gNCkgewotICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OiBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgLy8gMHh4eHh4eHgKLSAgICAgICAgICAgICAgICBjc1tpKytdID0gKGNoYXIpYzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTI6IGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgLy8gMTEweHh4eHggMTB4eHh4eHgKLSAgICAgICAgICAgICAgICBjc1tpKytdID0gKGNoYXIpKCgoYyAmIDB4MWYpIDw8IDYpIHwgKGJbb2ZmKytdICYgMHgzZikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAvLyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eAotICAgICAgICAgICAgICAgIGludCB0ID0gKGJbb2ZmKytdICYgMHgzZikgPDwgNjsKLSAgICAgICAgICAgICAgICBjc1tpKytdID0gKGNoYXIpKCgoYyAmIDB4MGYpIDw8IDEyKSB8IHQgfCAoYltvZmYrK10gJiAweDNmKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIDEweHh4eHh4LCAxMTExeHh4eAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjcywgMCwgY291bnQpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+WmlwRW50cnk8L2NvZGU+IG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZAogICAgICAqIGVudHJ5IG5hbWUuCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGJkNDRkMzIuLmRhMzVlZDkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL1ppcE91dHB1dFN0cmVhbS5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuemlwLlppcENvbnN0YW50czY0Lio7CkBAIC00NCwxOSArNDUsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhFbnRyeSB7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBaaXBFbnRyeSBlbnRyeTsKICAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgb2Zmc2V0OwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IGZsYWc7CiAgICAgICAgIHB1YmxpYyBYRW50cnkoWmlwRW50cnkgZW50cnksIGxvbmcgb2Zmc2V0KSB7CiAgICAgICAgICAgICB0aGlzLmVudHJ5ID0gZW50cnk7CiAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgICAgIHRoaXMuZmxhZyA9IChlbnRyeS5tZXRob2QgPT0gREVGTEFURUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZW50cnkuc2l6ZSAgPT0gLTEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuY3NpemUgPT0gLTEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuY3JjICAgPT0gLTEpKQotICAgICAgICAgICAgICAgIC8vIHN0b3JlIHNpemUsIGNvbXByZXNzZWQgc2l6ZSwgYW5kIGNyYy0zMiBpbiBkYXRhIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGNvbXByZXNzZWQgZW50cnkgZGF0YQotICAgICAgICAgICAgICAgID8gOAotICAgICAgICAgICAgICAgIC8vIHN0b3JlIHNpemUsIGNvbXByZXNzZWQgc2l6ZSwgYW5kIGNyYy0zMiBpbiBMT0MgaGVhZGVyCi0gICAgICAgICAgICAgICAgOiAwOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NiwxMiArNTcsMTQgQEAKICAgICBwcml2YXRlIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOwogICAgIHByaXZhdGUgbG9uZyB3cml0dGVuID0gMDsKICAgICBwcml2YXRlIGxvbmcgbG9jb2ZmID0gMDsKLSAgICBwcml2YXRlIFN0cmluZyBjb21tZW50OworICAgIHByaXZhdGUgYnl0ZVtdIGNvbW1lbnQ7CiAgICAgcHJpdmF0ZSBpbnQgbWV0aG9kID0gREVGTEFURUQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwogCisgICAgcHJpdmF0ZSBmaW5hbCBaaXBDb2RlciB6YzsKKwogICAgIHByaXZhdGUgc3RhdGljIGludCB2ZXJzaW9uKFppcEVudHJ5IGUpIHRocm93cyBaaXBFeGNlcHRpb24gewogICAgICAgICBzd2l0Y2ggKGUubWV0aG9kKSB7CiAgICAgICAgIGNhc2UgREVGTEFURUQ6IHJldHVybiAyMDsKQEAgLTEwMCwxMCArOTMsMzEgQEAKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgWklQIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiA8cD5UaGUgVVRGLTgge0BsaW5rIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBjaGFyc2V0fSBpcyB1c2VkCisgICAgICogdG8gZW5jb2RlIHRoZSBlbnRyeSBuYW1lcyBhbmQgY29tbWVudHMuCisgICAgICoKICAgICAgKiBAcGFyYW0gb3V0IHRoZSBhY3R1YWwgb3V0cHV0IHN0cmVhbQogICAgICAqLwogICAgIHB1YmxpYyBaaXBPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICB0aGlzKG91dCwgQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFpJUCBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIG91dCB0aGUgYWN0dWFsIG91dHB1dCBzdHJlYW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSB7QGxpbmsgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IDwvY29kZT5jaGFyc2V0PGNvZGU+fQorICAgICAqICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgdG8gZW5jb2RlIHRoZSBlbnRyeSBuYW1lcyBhbmQgY29tbWVudHMKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIENoYXJzZXQgY2hhcnNldCkgewogICAgICAgICBzdXBlcihvdXQsIG5ldyBEZWZsYXRlcihEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OLCB0cnVlKSk7CisgICAgICAgIGlmIChjaGFyc2V0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImNoYXJzZXQgaXMgbnVsbCIpOworICAgICAgICB0aGlzLnpjID0gWmlwQ29kZXIuZ2V0KGNoYXJzZXQpOwogICAgICAgICB1c2VzRGVmYXVsdERlZmxhdGVyID0gdHJ1ZTsKICAgICB9CiAKQEAgLTExNCwxMSArMTI4LDExIEBACiAgICAgICogICAgICAgICAgICBaSVAgZmlsZSBjb21tZW50IGlzIGdyZWF0ZXIgdGhhbiAweEZGRkYgYnl0ZXMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7Ci0gICAgICAgIGlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5sZW5ndGgoKSA+IDB4ZmZmZi8zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0VVRGOExlbmd0aChjb21tZW50KSA+IDB4ZmZmZikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWklQIGZpbGUgY29tbWVudCB0b28gbG9uZy4iKTsKKyAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jb21tZW50ID0gemMuZ2V0Qnl0ZXMoY29tbWVudCk7CisgICAgICAgICAgICBpZiAodGhpcy5jb21tZW50Lmxlbmd0aCA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJaSVAgZmlsZSBjb21tZW50IHRvbyBsb25nLiIpOwogICAgICAgICB9Ci0gICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjcsOCArMTgxLDE1IEBACiAgICAgICAgIGlmIChlLm1ldGhvZCA9PSAtMSkgewogICAgICAgICAgICAgZS5tZXRob2QgPSBtZXRob2Q7ICAvLyB1c2UgZGVmYXVsdCBtZXRob2QKICAgICAgICAgfQorICAgICAgICAvLyBzdG9yZSBzaXplLCBjb21wcmVzc2VkIHNpemUsIGFuZCBjcmMtMzIgaW4gTE9DIGhlYWRlcgorICAgICAgICBlLmZsYWcgPSAwOwogICAgICAgICBzd2l0Y2ggKGUubWV0aG9kKSB7CiAgICAgICAgIGNhc2UgREVGTEFURUQ6CisgICAgICAgICAgICAvLyBzdG9yZSBzaXplLCBjb21wcmVzc2VkIHNpemUsIGFuZCBjcmMtMzIgaW4gZGF0YSBkZXNjcmlwdG9yCisgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGNvbXByZXNzZWQgZW50cnkgZGF0YQorICAgICAgICAgICAgaWYgKGUuc2l6ZSAgPT0gLTEgfHwgZS5jc2l6ZSA9PSAtMSB8fCBlLmNyYyAgID09IC0xKQorICAgICAgICAgICAgICAgIGUuZmxhZyA9IDg7CisKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNUT1JFRDoKICAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgc2l6ZSwgdW5jb21wcmVzc2VkIHNpemUsIGFuZCBjcmMtMzIgbXVzdCBhbGwgYmUKQEAgLTE5Miw2ICsyMTMsOCBAQAogICAgICAgICBpZiAoISBuYW1lcy5hZGQoZS5uYW1lKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiZHVwbGljYXRlIGVudHJ5OiAiICsgZS5uYW1lKTsKICAgICAgICAgfQorICAgICAgICBpZiAoemMuaXNVVEY4KCkpCisgICAgICAgICAgICBlLmZsYWcgfD0gRUZTOwogICAgICAgICBjdXJyZW50ID0gbmV3IFhFbnRyeShlLCB3cml0dGVuKTsKICAgICAgICAgeGVudHJpZXMuYWRkKGN1cnJlbnQpOwogICAgICAgICB3cml0ZUxPQyhjdXJyZW50KTsKQEAgLTIxMyw3ICsyMzYsNyBAQAogICAgICAgICAgICAgICAgIHdoaWxlICghZGVmLmZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGVmbGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZyAmIDgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGUuZmxhZyAmIDgpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IHNpemUsIGNvbXByZXNzZWQgc2l6ZSwgYW5kIGNyYy0zMiBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaXplICE9IGRlZi5nZXRCeXRlc1JlYWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigKQEAgLTM0MywxMSArMzY2LDExIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTE9DKFhFbnRyeSB4ZW50cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFppcEVudHJ5IGUgPSB4ZW50cnkuZW50cnk7Ci0gICAgICAgIGludCBmbGFnID0geGVudHJ5LmZsYWc7CisgICAgICAgIGludCBmbGFnID0gZS5mbGFnOwogICAgICAgICBpbnQgZWxlbiA9IChlLmV4dHJhICE9IG51bGwpID8gZS5leHRyYS5sZW5ndGggOiAwOwogICAgICAgICBib29sZWFuIGhhc1ppcDY0ID0gZmFsc2U7CiAKLSAgICAgICAgd3JpdGVJbnQoTE9DU0lHKTsgICAgICAgICAgIC8vIExPQyBoZWFkZXIgc2lnbmF0dXJlCisgICAgICAgIHdyaXRlSW50KExPQ1NJRyk7ICAgICAgICAgICAgICAgLy8gTE9DIGhlYWRlciBzaWduYXR1cmUKIAogICAgICAgICBpZiAoKGZsYWcgJiA4KSA9PSA4KSB7CiAgICAgICAgICAgICB3cml0ZVNob3J0KHZlcnNpb24oZSkpOyAgICAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdApAQCAtMzgwLDcgKzQwMyw3IEBACiAgICAgICAgICAgICAgICAgd3JpdGVJbnQoZS5zaXplKTsgICAvLyB1bmNvbXByZXNzZWQgc2l6ZQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGJ5dGVbXSBuYW1lQnl0ZXMgPSBnZXRVVEY4Qnl0ZXMoZS5uYW1lKTsKKyAgICAgICAgYnl0ZVtdIG5hbWVCeXRlcyA9IHpjLmdldEJ5dGVzKGUubmFtZSk7CiAgICAgICAgIHdyaXRlU2hvcnQobmFtZUJ5dGVzLmxlbmd0aCk7CiAgICAgICAgIHdyaXRlU2hvcnQoZWxlbik7CiAgICAgICAgIHdyaXRlQnl0ZXMobmFtZUJ5dGVzLCAwLCBuYW1lQnl0ZXMubGVuZ3RoKTsKQEAgLTQxNyw3ICs0NDAsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB3cml0ZUNFTihYRW50cnkgeGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBaaXBFbnRyeSBlICA9IHhlbnRyeS5lbnRyeTsKLSAgICAgICAgaW50IGZsYWcgPSB4ZW50cnkuZmxhZzsKKyAgICAgICAgaW50IGZsYWcgPSBlLmZsYWc7CiAgICAgICAgIGludCB2ZXJzaW9uID0gdmVyc2lvbihlKTsKIAogICAgICAgICBsb25nIGNzaXplID0gZS5jc2l6ZTsKQEAgLTQ1NCw3ICs0NzcsNyBAQAogICAgICAgICB3cml0ZUludChlLmNyYyk7ICAgICAgICAgICAgLy8gY3JjLTMyCiAgICAgICAgIHdyaXRlSW50KGNzaXplKTsgICAgICAgICAgICAvLyBjb21wcmVzc2VkIHNpemUKICAgICAgICAgd3JpdGVJbnQoc2l6ZSk7ICAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBzaXplCi0gICAgICAgIGJ5dGVbXSBuYW1lQnl0ZXMgPSBnZXRVVEY4Qnl0ZXMoZS5uYW1lKTsKKyAgICAgICAgYnl0ZVtdIG5hbWVCeXRlcyA9IHpjLmdldEJ5dGVzKGUubmFtZSk7CiAgICAgICAgIHdyaXRlU2hvcnQobmFtZUJ5dGVzLmxlbmd0aCk7CiAgICAgICAgIGlmIChoYXNaaXA2NCkgewogICAgICAgICAgICAgLy8gKyBoZWFkaWQoMikgKyBkYXRhc2l6ZSgyKQpAQCAtNDY0LDggKzQ4Nyw4IEBACiAgICAgICAgIH0KICAgICAgICAgYnl0ZVtdIGNvbW1lbnRCeXRlczsKICAgICAgICAgaWYgKGUuY29tbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb21tZW50Qnl0ZXMgPSBnZXRVVEY4Qnl0ZXMoZS5jb21tZW50KTsKLSAgICAgICAgICAgIHdyaXRlU2hvcnQoY29tbWVudEJ5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBjb21tZW50Qnl0ZXMgPSB6Yy5nZXRCeXRlcyhlLmNvbW1lbnQpOworICAgICAgICAgICAgd3JpdGVTaG9ydChNYXRoLm1pbihjb21tZW50Qnl0ZXMubGVuZ3RoLCAweGZmZmYpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNvbW1lbnRCeXRlcyA9IG51bGw7CiAgICAgICAgICAgICB3cml0ZVNob3J0KDApOwpAQCAtNDg5LDcgKzUxMiw3IEBACiAgICAgICAgICAgICB3cml0ZUJ5dGVzKGUuZXh0cmEsIDAsIGUuZXh0cmEubGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoY29tbWVudEJ5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlQnl0ZXMoY29tbWVudEJ5dGVzLCAwLCBjb21tZW50Qnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIHdyaXRlQnl0ZXMoY29tbWVudEJ5dGVzLCAwLCBNYXRoLm1pbihjb21tZW50Qnl0ZXMubGVuZ3RoLCAweGZmZmYpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTQxLDkgKzU2NCw4IEBACiAgICAgICAgIHdyaXRlSW50KHhsZW4pOyAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgY2VudHJhbCBkaXJlY3RvcnkKICAgICAgICAgd3JpdGVJbnQoeG9mZik7ICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBvZiBjZW50cmFsIGRpcmVjdG9yeQogICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsKSB7ICAgICAgICAgICAgLy8gemlwIGZpbGUgY29tbWVudAotICAgICAgICAgICAgYnl0ZVtdIGIgPSBnZXRVVEY4Qnl0ZXMoY29tbWVudCk7Ci0gICAgICAgICAgICB3cml0ZVNob3J0KGIubGVuZ3RoKTsKLSAgICAgICAgICAgIHdyaXRlQnl0ZXMoYiwgMCwgYi5sZW5ndGgpOworICAgICAgICAgICAgd3JpdGVTaG9ydChjb21tZW50Lmxlbmd0aCk7CisgICAgICAgICAgICB3cml0ZUJ5dGVzKGNvbW1lbnQsIDAsIGNvbW1lbnQubGVuZ3RoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHdyaXRlU2hvcnQoMCk7CiAgICAgICAgIH0KQEAgLTU5NCw2MCArNjE2LDQgQEAKICAgICAgICAgc3VwZXIub3V0LndyaXRlKGIsIG9mZiwgbGVuKTsKICAgICAgICAgd3JpdHRlbiArPSBsZW47CiAgICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgU3RyaW5nJ3MgVVRGOCBlbmNvZGluZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgaW50IGdldFVURjhMZW5ndGgoU3RyaW5nIHMpIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA8PSAweDdmKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gMHg3ZmYpIHsKLSAgICAgICAgICAgICAgICBjb3VudCArPSAyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb3VudCArPSAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBVVEY4IGVuY29kaW5nCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldFVURjhCeXRlcyhTdHJpbmcgcykgewotICAgICAgICBjaGFyW10gYyA9IHMudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgaW50IGxlbiA9IGMubGVuZ3RoOwotICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYnl0ZXMuLi4KLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaW50IGNoID0gY1tpXTsKLSAgICAgICAgICAgIGlmIChjaCA8PSAweDdmKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gMHg3ZmYpIHsKLSAgICAgICAgICAgICAgICBjb3VudCArPSAyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb3VudCArPSAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vdyByZXR1cm4gdGhlIGVuY29kZWQgYnl0ZXMuLi4KLSAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtjb3VudF07Ci0gICAgICAgIGludCBvZmYgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgY2ggPSBjW2ldOwotICAgICAgICAgICAgaWYgKGNoIDw9IDB4N2YpIHsKLSAgICAgICAgICAgICAgICBiW29mZisrXSA9IChieXRlKWNoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAweDdmZikgewotICAgICAgICAgICAgICAgIGJbb2ZmKytdID0gKGJ5dGUpKChjaCA+PiA2KSB8IDB4YzApOwotICAgICAgICAgICAgICAgIGJbb2ZmKytdID0gKGJ5dGUpKChjaCAmIDB4M2YpIHwgMHg4MCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJbb2ZmKytdID0gKGJ5dGUpKChjaCA+PiAxMikgfCAweGUwKTsKLSAgICAgICAgICAgICAgICBiW29mZisrXSA9IChieXRlKSgoKGNoID4+IDYpICYgMHgzZikgfCAweDgwKTsKLSAgICAgICAgICAgICAgICBiW29mZisrXSA9IChieXRlKSgoY2ggJiAweDNmKSB8IDB4ODApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL3BhY2thZ2UuaHRtbCBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvemlwL3BhY2thZ2UuaHRtbAppbmRleCBkNGI1OTI2Li44M2QxMTdkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL3ppcC9wYWNrYWdlLmh0bWwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC96aXAvcGFja2FnZS5odG1sCkBAIC01Myw2ICs1MywxMSBAQAogICAgICAgUEtXQVJFIFpJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uPC9hPi4gVGhlIFpJUDY0KHRtKSBmb3JtYXQgZXh0ZW5zaW9ucwogICAgICAgYXJlIHVzZWQgdG8gb3ZlcmNvbWUgdGhlIHNpemUgbGltaXRhdGlvbnMgb2YgdGhlIG9yaWdpbmFsIFpJUCBmb3JtYXQuCiA8cD4KKyAgPGEgbmFtZT0ibGFuZ19lbmNvZGluZyI+CisgIDxsaT5BUFBFTkRJWCBEIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPgorICAgICAgUEtXQVJFIFpJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uPC9hPiAtIExhbmd1YWdlIEVuY29kaW5nIEZsYWcgKEVGUykgdG8KKyAgICAgIGVuY29kZSBaSVAgZW50cnkgZmlsZW5hbWUgYW5kIGNvbW1lbnQgZmllbGRzIHVzaW5nIFVURi04LgorPHA+CiAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmlzaS5lZHUvaW4tbm90ZXMvcmZjMTk1MC50eHQiPgogICAgICAgWkxJQiBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gdmVyc2lvbiAzLjM8L2E+CiAgICAgICAmbmJzcDsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvQ291bnRlck1vbml0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvQ291bnRlck1vbml0b3IuamF2YQppbmRleCBiMjdlNTdmLi5jYjEyNDRlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC9tb25pdG9yL0NvdW50ZXJNb25pdG9yLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvbW9uaXRvci9Db3VudGVyTW9uaXRvci5qYXZhCkBAIC01OTksNyArNTk5LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTUJlYW5Ob3RpZmljYXRpb25JbmZvW10gZ2V0Tm90aWZpY2F0aW9uSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG5vdGlmc0luZm87CisgICAgICAgIHJldHVybiBub3RpZnNJbmZvLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvR2F1Z2VNb25pdG9yLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC9tb25pdG9yL0dhdWdlTW9uaXRvci5qYXZhCmluZGV4IGFiNzFmMTAuLjI2NjJjNDIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvR2F1Z2VNb25pdG9yLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvbW9uaXRvci9HYXVnZU1vbml0b3IuamF2YQpAQCAtNDgxLDcgKzQ4MSw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1CZWFuTm90aWZpY2F0aW9uSW5mb1tdIGdldE5vdGlmaWNhdGlvbkluZm8oKSB7Ci0gICAgICAgIHJldHVybiBub3RpZnNJbmZvOworICAgICAgICByZXR1cm4gbm90aWZzSW5mby5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC9tb25pdG9yL01vbml0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvTW9uaXRvci5qYXZhCmluZGV4IGZiM2UxYTQuLjJlMzdkOGYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvTW9uaXRvci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvTW9uaXRvci5qYXZhCkBAIC0zMiw3ICszMiwxMCBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW47CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKQEAgLTE2Myw3ICsxNjYsMTAgQEAKICAgICAvKioKICAgICAgKiBBY2Nlc3NDb250cm9sQ29udGV4dCBvZiB0aGUgTW9uaXRvci5zdGFydCgpIGNhbGxlci4KICAgICAgKi8KLSAgICBwcml2YXRlIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2Nlc3NDb250cm9sQ29udGV4dCBub1Blcm1pc3Npb25zQUNDID0KKyAgICAgICAgICAgIG5ldyBBY2Nlc3NDb250cm9sQ29udGV4dCgKKyAgICAgICAgICAgIG5ldyBQcm90ZWN0aW9uRG9tYWluW10ge25ldyBQcm90ZWN0aW9uRG9tYWluKG51bGwsIG51bGwpfSk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBY2Nlc3NDb250cm9sQ29udGV4dCBhY2MgPSBub1Blcm1pc3Npb25zQUNDOwogCiAgICAgLyoqCiAgICAgICogU2NoZWR1bGVyIFNlcnZpY2UuCkBAIC0xNzMsMTQgKzE3OSwyMCBAQAogICAgICAgICAgICAgbmV3IERhZW1vblRocmVhZEZhY3RvcnkoIlNjaGVkdWxlciIpKTsKIAogICAgIC8qKgorICAgICAqIE1hcCBjb250YWluaW5nIHRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciBwZXIgdGhyZWFkIGdyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxUaHJlYWRQb29sRXhlY3V0b3IsIFZvaWQ+IGV4ZWN1dG9ycyA9CisgICAgICAgICAgICBuZXcgV2Vha0hhc2hNYXA8VGhyZWFkUG9vbEV4ZWN1dG9yLCBWb2lkPigpOworCisgICAgLyoqCisgICAgICogTG9jayBmb3IgZXhlY3V0b3JzIG1hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgZXhlY3V0b3JzTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIC8qKgogICAgICAqIE1heGltdW0gUG9vbCBTaXplCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1heGltdW1Qb29sU2l6ZTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dG9yIFNlcnZpY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkUG9vbEV4ZWN1dG9yIGV4ZWN1dG9yOwogICAgIHN0YXRpYyB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBtYXhpbXVtUG9vbFNpemVTeXNQcm9wID0gImpteC54Lm1vbml0b3IubWF4aW11bS5wb29sLnNpemUiOwogICAgICAgICBmaW5hbCBTdHJpbmcgbWF4aW11bVBvb2xTaXplU3RyID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCkBAIC0yMTAsMjIgKzIyMiw5IEBACiAgICAgICAgICAgICAgICAgbWF4aW11bVBvb2xTaXplID0gbWF4aW11bVBvb2xTaXplVG1wOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dG9yID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigKLSAgICAgICAgICAgICAgICBtYXhpbXVtUG9vbFNpemUsCi0gICAgICAgICAgICAgICAgbWF4aW11bVBvb2xTaXplLAotICAgICAgICAgICAgICAgIDYwTCwKLSAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTLAotICAgICAgICAgICAgICAgIG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigpLAotICAgICAgICAgICAgICAgIG5ldyBEYWVtb25UaHJlYWRGYWN0b3J5KCJFeGVjdXRvciIpKTsKLSAgICAgICAgZXhlY3V0b3IuYWxsb3dDb3JlVGhyZWFkVGltZU91dCh0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNb25pdG9yIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIEV4ZWN1dG9yIFNlcnZpY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNb25pdG9yVGFzayBtb25pdG9yVGFzayA9IG5ldyBNb25pdG9yVGFzaygpOwotCi0gICAgLyoqCiAgICAgICogRnV0dXJlIGFzc29jaWF0ZWQgdG8gdGhlIGN1cnJlbnQgbW9uaXRvciB0YXNrLgogICAgICAqLwogICAgIHByaXZhdGUgRnV0dXJlPD8+IG1vbml0b3JGdXR1cmU7CkBAIC0yMzMsNyArMjMyLDcgQEAKICAgICAvKioKICAgICAgKiBTY2hlZHVsZXIgdGFzayB0byBiZSBleGVjdXRlZCBieSB0aGUgU2NoZWR1bGVyIFNlcnZpY2UuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZXJUYXNrIHNjaGVkdWxlclRhc2sgPSBuZXcgU2NoZWR1bGVyVGFzayhtb25pdG9yVGFzayk7CisgICAgcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZXJUYXNrIHNjaGVkdWxlclRhc2sgPSBuZXcgU2NoZWR1bGVyVGFzaygpOwogCiAgICAgLyoqCiAgICAgICogU2NoZWR1bGVkRnV0dXJlIGFzc29jaWF0ZWQgdG8gdGhlIGN1cnJlbnQgc2NoZWR1bGVyIHRhc2suCkBAIC03MTksNiArNzE4LDcgQEAKICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBzY2hlZHVsZXIuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgY2xlYW51cEZ1dHVyZXMoKTsKKyAgICAgICAgICAgIHNjaGVkdWxlclRhc2suc2V0TW9uaXRvclRhc2sobmV3IE1vbml0b3JUYXNrKCkpOwogICAgICAgICAgICAgc2NoZWR1bGVyRnV0dXJlID0gc2NoZWR1bGVyLnNjaGVkdWxlKHNjaGVkdWxlclRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R3JhbnVsYXJpdHlQZXJpb2QoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwpAQCAtNzQ4LDcgKzc0OCw3IEBACiAKICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBBY2Nlc3NDb250cm9sQ29udGV4dC4KICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBhY2MgPSBudWxsOworICAgICAgICAgICAgYWNjID0gbm9QZXJtaXNzaW9uc0FDQzsKIAogICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNvbXBsZXggdHlwZSBhdHRyaWJ1dGUgaW5mb3JtYXRpb24KICAgICAgICAgICAgIC8vIHN1Y2ggdGhhdCBpdCBpcyByZWNhbGN1bGF0ZWQgYWdhaW4uCkBAIC0xNDY3LDcgKzE0NjcsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgU2NoZWR1bGVyVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKIAotICAgICAgICBwcml2YXRlIFJ1bm5hYmxlIHRhc2sgPSBudWxsOworICAgICAgICBwcml2YXRlIE1vbml0b3JUYXNrIHRhc2s7CiAKICAgICAgICAgLyoKICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDc1LDcgKzE0NzUsMTYgQEAKICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAqLwogCi0gICAgICAgIHB1YmxpYyBTY2hlZHVsZXJUYXNrKFJ1bm5hYmxlIHRhc2spIHsKKyAgICAgICAgcHVibGljIFNjaGVkdWxlclRhc2soKSB7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICogIEdFVFRFUlMvU0VUVEVSUworICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TW9uaXRvclRhc2soTW9uaXRvclRhc2sgdGFzaykgewogICAgICAgICAgICAgdGhpcy50YXNrID0gdGFzazsKICAgICAgICAgfQogCkBAIC0xNDg3LDcgKzE0OTYsNyBAQAogCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoTW9uaXRvci50aGlzKSB7Ci0gICAgICAgICAgICAgICAgTW9uaXRvci50aGlzLm1vbml0b3JGdXR1cmUgPSBleGVjdXRvci5zdWJtaXQodGFzayk7CisgICAgICAgICAgICAgICAgTW9uaXRvci50aGlzLm1vbml0b3JGdXR1cmUgPSB0YXNrLnN1Ym1pdCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTUwMCw2ICsxNTA5LDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIGNsYXNzIE1vbml0b3JUYXNrIGltcGxlbWVudHMgUnVubmFibGUgewogCisgICAgICAgIHByaXZhdGUgVGhyZWFkUG9vbEV4ZWN1dG9yIGV4ZWN1dG9yOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgKiAgQ09OU1RSVUNUT1JTCkBAIC0xNTA3LDYgKzE1MTgsMzggQEAKICAgICAgICAgICovCiAKICAgICAgICAgcHVibGljIE1vbml0b3JUYXNrKCkgeworICAgICAgICAgICAgLy8gRmluZCBvdXQgaWYgdGhlcmUncyBhbHJlYWR5IGFuIGV4aXN0aW5nIGV4ZWN1dG9yIGZvciB0aGUgY2FsbGluZworICAgICAgICAgICAgLy8gdGhyZWFkIGFuZCByZXVzZSBpdC4gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgb25lIGFuZCBzdG9yZSBpdCBpbgorICAgICAgICAgICAgLy8gdGhlIGV4ZWN1dG9ycyBtYXAuIElmIHRoZXJlIGlzIGEgU2VjdXJpdHlNYW5hZ2VyLCB0aGUgZ3JvdXAgb2YKKyAgICAgICAgICAgIC8vIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSBpcyB1c2VkLCBlbHNlIHRoZSBncm91cCBvZiB0aGUgdGhyZWFkCisgICAgICAgICAgICAvLyBpbnN0YW50aWF0aW5nIHRoaXMgTW9uaXRvclRhc2ssIGkuZS4gdGhlIGdyb3VwIG9mIHRoZSB0aHJlYWQgdGhhdAorICAgICAgICAgICAgLy8gY2FsbHMgIk1vbml0b3Iuc3RhcnQoKSIuCisgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgcyA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgICAgIFRocmVhZEdyb3VwIGdyb3VwID0gKHMgIT0gbnVsbCkgPyBzLmdldFRocmVhZEdyb3VwKCkgOgorICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZXhlY3V0b3JzTG9jaykgeworICAgICAgICAgICAgICAgIGZvciAoVGhyZWFkUG9vbEV4ZWN1dG9yIGUgOiBleGVjdXRvcnMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRGFlbW9uVGhyZWFkRmFjdG9yeSB0ZiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERhZW1vblRocmVhZEZhY3RvcnkpIGUuZ2V0VGhyZWFkRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRHcm91cCB0ZyA9IHRmLmdldFRocmVhZEdyb3VwKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZyA9PSBncm91cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW1Qb29sU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtUG9vbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhZW1vblRocmVhZEZhY3RvcnkoIlRocmVhZEdyb3VwPCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmdldE5hbWUoKSArICI+IEV4ZWN1dG9yIiwgZ3JvdXApKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuYWxsb3dDb3JlVGhyZWFkVGltZU91dCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JzLnB1dChleGVjdXRvciwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyoKQEAgLTE1MTUsMTIgKzE1NTgsMTggQEAKICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAqLwogCisgICAgICAgIHB1YmxpYyBGdXR1cmU8Pz4gc3VibWl0KCkgeworICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLnN1Ym1pdCh0aGlzKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgIGZpbmFsIFNjaGVkdWxlZEZ1dHVyZTw/PiBzZjsKKyAgICAgICAgICAgIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjOwogICAgICAgICAgICAgc3luY2hyb25pemVkIChNb25pdG9yLnRoaXMpIHsKICAgICAgICAgICAgICAgICBzZiA9IE1vbml0b3IudGhpcy5zY2hlZHVsZXJGdXR1cmU7CisgICAgICAgICAgICAgICAgYWMgPSBNb25pdG9yLnRoaXMuYWNjOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Vm9pZD4oKSB7CisgICAgICAgICAgICBQcml2aWxlZ2VkQWN0aW9uPFZvaWQ+IGFjdGlvbiA9IG5ldyBQcml2aWxlZ2VkQWN0aW9uPFZvaWQ+KCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyBWb2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKE1vbml0b3IudGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYW5bXSA9IGFscmVhZHlOb3RpZmllZHM7CkBAIC0xNTMzLDcgKzE1ODIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBNb25pdG9yLnRoaXMuYWNjKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoYWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzQ29udHJvbENvbnRleHQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbiwgYWMpOwogICAgICAgICAgICAgc3luY2hyb25pemVkIChNb25pdG9yLnRoaXMpIHsKICAgICAgICAgICAgICAgICBpZiAoTW9uaXRvci50aGlzLmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci50aGlzLnNjaGVkdWxlckZ1dHVyZSA9PSBzZikgewpAQCAtMTU3Myw2ICsxNjI2LDE1IEBACiAgICAgICAgICAgICBuYW1lUHJlZml4ID0gIkpNWCBNb25pdG9yICIgKyBwb29sTmFtZSArICIgUG9vbCBbVGhyZWFkLSI7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgRGFlbW9uVGhyZWFkRmFjdG9yeShTdHJpbmcgcG9vbE5hbWUsIFRocmVhZEdyb3VwIHRocmVhZEdyb3VwKSB7CisgICAgICAgICAgICBncm91cCA9IHRocmVhZEdyb3VwOworICAgICAgICAgICAgbmFtZVByZWZpeCA9ICJKTVggTW9uaXRvciAiICsgcG9vbE5hbWUgKyAiIFBvb2wgW1RocmVhZC0iOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRocmVhZEdyb3VwIGdldFRocmVhZEdyb3VwKCkgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgewogICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKGdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC9tb25pdG9yL1N0cmluZ01vbml0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvU3RyaW5nTW9uaXRvci5qYXZhCmluZGV4IDNjMmJiYzUuLjliNGFmNTIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvU3RyaW5nTW9uaXRvci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvU3RyaW5nTW9uaXRvci5qYXZhCkBAIC0xODQsNiArMTg0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBkZXJpdmVkIGdhdWdlIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVyaXZlZEdhdWdlKE9iamVjdE5hbWUgb2JqZWN0KSB7CiAgICAgICAgIHJldHVybiAoU3RyaW5nKSBzdXBlci5nZXREZXJpdmVkR2F1Z2Uob2JqZWN0KTsKICAgICB9CkBAIC0xOTksNiArMjAwLDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBkZXJpdmVkIGdhdWdlIHRpbWVzdGFtcCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KICAgICAgKgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXREZXJpdmVkR2F1Z2VUaW1lU3RhbXAoT2JqZWN0TmFtZSBvYmplY3QpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLmdldERlcml2ZWRHYXVnZVRpbWVTdGFtcChvYmplY3QpOwogICAgIH0KQEAgLTM0MSw4ICszNDMsOSBAQAogICAgICAqIHRoZSBKYXZhIGNsYXNzIG9mIHRoZSBub3RpZmljYXRpb24gYW5kIHRoZSBub3RpZmljYXRpb24gdHlwZXMgc2VudCBieQogICAgICAqIHRoZSBzdHJpbmcgbW9uaXRvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTUJlYW5Ob3RpZmljYXRpb25JbmZvW10gZ2V0Tm90aWZpY2F0aW9uSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG5vdGlmc0luZm87CisgICAgICAgIHJldHVybiBub3RpZnNJbmZvLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9wcmludC9hdHRyaWJ1dGUvc3RhbmRhcmQvTWVkaWFTaXplLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvcHJpbnQvYXR0cmlidXRlL3N0YW5kYXJkL01lZGlhU2l6ZS5qYXZhCmluZGV4IDU1Y2QxYWUuLjNiNjI2MmQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9wcmludC9hdHRyaWJ1dGUvc3RhbmRhcmQvTWVkaWFTaXplLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3ByaW50L2F0dHJpYnV0ZS9zdGFuZGFyZC9NZWRpYVNpemUuamF2YQpAQCAtMTIzLDggKzEyMywxMCBAQAogICAgICAgICBpZiAoeCA+IHkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlggZGltZW5zaW9uID4gWSBkaW1lbnNpb24iKTsKICAgICAgICAgfQotICAgICAgICBtZWRpYU5hbWUgPSBtZWRpYTsKLSAgICAgICAgbWVkaWFNYXAucHV0KG1lZGlhTmFtZSwgdGhpcyk7CisgICAgICAgIGlmIChtZWRpYSAhPSBudWxsICYmIG1lZGlhTWFwLmdldChtZWRpYSkgPT0gbnVsbCkgeworICAgICAgICAgICAgbWVkaWFOYW1lID0gbWVkaWE7CisgICAgICAgICAgICBtZWRpYU1hcC5wdXQobWVkaWFOYW1lLCB0aGlzKTsKKyAgICAgICAgfQogICAgICAgICBzaXplVmVjdG9yLmFkZCh0aGlzKTsKICAgICB9CiAKQEAgLTE0Nyw4ICsxNDksMTAgQEAKICAgICAgICAgaWYgKHggPiB5KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJYIGRpbWVuc2lvbiA+IFkgZGltZW5zaW9uIik7CiAgICAgICAgIH0KLSAgICAgICAgbWVkaWFOYW1lID0gbWVkaWE7Ci0gICAgICAgIG1lZGlhTWFwLnB1dChtZWRpYU5hbWUsIHRoaXMpOworICAgICAgICBpZiAobWVkaWEgIT0gbnVsbCAmJiBtZWRpYU1hcC5nZXQobWVkaWEpID09IG51bGwpIHsKKyAgICAgICAgICAgIG1lZGlhTmFtZSA9IG1lZGlhOworICAgICAgICAgICAgbWVkaWFNYXAucHV0KG1lZGlhTmFtZSwgdGhpcyk7CisgICAgICAgIH0KICAgICAgICAgc2l6ZVZlY3Rvci5hZGQodGhpcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvbWlkaS9NZXRhTWVzc2FnZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3NvdW5kL21pZGkvTWV0YU1lc3NhZ2UuamF2YQppbmRleCA3NzE4ZjhjLi44YjI3ZmExIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvbWlkaS9NZXRhTWVzc2FnZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zb3VuZC9taWRpL01ldGFNZXNzYWdlLmphdmEKQEAgLTEwMiw2ICsxMDIsMjkgQEAKICAgICAgICAgdGhpcyhkZWZhdWx0TWVzc2FnZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgTWV0YU1lc3NhZ2V9IGFuZCBzZXRzIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMuCisgICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGNhbiBiZSBjaGFuZ2VkIGJ5IHVzaW5nCisgICAgICogdGhlIHtAY29kZSBzZXRNZXNzYWdlfSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSAgIG1ldGEtbWVzc2FnZSB0eXBlIChtdXN0IGJlIGxlc3MgdGhhbiAxMjgpCisgICAgICogQHBhcmFtIGRhdGEgICB0aGUgZGF0YSBieXRlcyBpbiB0aGUgTUlESSBtZXNzYWdlCisgICAgICogQHBhcmFtIGxlbmd0aCBhbiBhbW91bnQgb2YgYnl0ZXMgaW4gdGhlIHtAY29kZSBkYXRhfSBieXRlIGFycmF5OworICAgICAqICAgICBpdCBzaG91bGQgYmUgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAge0Bjb2RlIGRhdGEubGVuZ3RofQorICAgICAqIEB0aHJvd3MgSW52YWxpZE1pZGlEYXRhRXhjZXB0aW9uIGlmIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGRvIG5vdCBzcGVjaWZ5CisgICAgICogICAgIGEgdmFsaWQgTUlESSBtZXRhIG1lc3NhZ2UKKyAgICAgKiBAc2VlICNzZXRNZXNzYWdlKGludCwgYnl0ZVtdLCBpbnQpCisgICAgICogQHNlZSAjZ2V0VHlwZSgpCisgICAgICogQHNlZSAjZ2V0RGF0YSgpCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHB1YmxpYyBNZXRhTWVzc2FnZShpbnQgdHlwZSwgYnl0ZVtdIGRhdGEsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZE1pZGlEYXRhRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgIHNldE1lc3NhZ2UodHlwZSwgZGF0YSwgbGVuZ3RoKTsgLy8gY2FuIHRocm93IEludmFsaWRNaWRpRGF0YUV4Y2VwdGlvbgorICAgIH0KKwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5NZXRhTWVzc2FnZTwvY29kZT4uCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvbWlkaS9TaG9ydE1lc3NhZ2UuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zb3VuZC9taWRpL1Nob3J0TWVzc2FnZS5qYXZhCmluZGV4IDcxNmQ3YjAuLjJkZGRjM2MgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zb3VuZC9taWRpL1Nob3J0TWVzc2FnZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zb3VuZC9taWRpL1Nob3J0TWVzc2FnZS5qYXZhCkBAIC0xODcsNiArMTg3LDgzIEBACiAgICAgICAgIGxlbmd0aCA9IDM7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU2hvcnRNZXNzYWdlfSB3aGljaCByZXByZXNlbnRzIGEgTUlESQorICAgICAqIG1lc3NhZ2UgdGhhdCB0YWtlcyBubyBkYXRhIGJ5dGVzLgorICAgICAqIFRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSBjYW4gYmUgY2hhbmdlZCBieSB1c2luZyBvbmUgb2YKKyAgICAgKiB0aGUge0Bjb2RlIHNldE1lc3NhZ2V9IG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBNSURJIHN0YXR1cyBieXRlCisgICAgICogQHRocm93cyBJbnZhbGlkTWlkaURhdGFFeGNlcHRpb24gaWYge0Bjb2RlIHN0YXR1c30gZG9lcyBub3Qgc3BlY2lmeQorICAgICAqICAgICBhIHZhbGlkIE1JREkgc3RhdHVzIGJ5dGUgZm9yIGEgbWVzc2FnZSB0aGF0IHJlcXVpcmVzIG5vIGRhdGEgYnl0ZXMKKyAgICAgKiBAc2VlICNzZXRNZXNzYWdlKGludCkKKyAgICAgKiBAc2VlICNzZXRNZXNzYWdlKGludCwgaW50LCBpbnQpCisgICAgICogQHNlZSAjc2V0TWVzc2FnZShpbnQsIGludCwgaW50LCBpbnQpCisgICAgICogQHNlZSAjZ2V0U3RhdHVzKCkKKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIFNob3J0TWVzc2FnZShpbnQgc3RhdHVzKSB0aHJvd3MgSW52YWxpZE1pZGlEYXRhRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgIHNldE1lc3NhZ2Uoc3RhdHVzKTsgLy8gY2FuIHRocm93IEludmFsaWRNaWRpRGF0YUV4Y2VwdGlvbgorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFNob3J0TWVzc2FnZX0gd2hpY2ggcmVwcmVzZW50cyBhIE1JREkgbWVzc2FnZQorICAgICAqIHRoYXQgdGFrZXMgdXAgdG8gdHdvIGRhdGEgYnl0ZXMuIElmIHRoZSBtZXNzYWdlIG9ubHkgdGFrZXMgb25lIGRhdGEgYnl0ZSwKKyAgICAgKiB0aGUgc2Vjb25kIGRhdGEgYnl0ZSBpcyBpZ25vcmVkLiBJZiB0aGUgbWVzc2FnZSBkb2VzIG5vdCB0YWtlCisgICAgICogYW55IGRhdGEgYnl0ZXMsIGJvdGggZGF0YSBieXRlcyBhcmUgaWdub3JlZC4KKyAgICAgKiBUaGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgY2FuIGJlIGNoYW5nZWQgYnkgdXNpbmcgb25lIG9mCisgICAgICogdGhlIHtAY29kZSBzZXRNZXNzYWdlfSBtZXRob2RzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1cyAgIHRoZSBNSURJIHN0YXR1cyBieXRlCisgICAgICogQHBhcmFtIGRhdGExICAgIHRoZSBmaXJzdCBkYXRhIGJ5dGUKKyAgICAgKiBAcGFyYW0gZGF0YTIgICAgdGhlIHNlY29uZCBkYXRhIGJ5dGUKKyAgICAgKiBAdGhyb3dzIEludmFsaWRNaWRpRGF0YUV4Y2VwdGlvbiBpZiB0aGUgc3RhdHVzIGJ5dGUgb3IgYWxsIGRhdGEgYnl0ZXMKKyAgICAgKiAgICAgYmVsb25naW5nIHRvIHRoZSBtZXNzYWdlIGRvIG5vdCBzcGVjaWZ5IGEgdmFsaWQgTUlESSBtZXNzYWdlCisgICAgICogQHNlZSAjc2V0TWVzc2FnZShpbnQpCisgICAgICogQHNlZSAjc2V0TWVzc2FnZShpbnQsIGludCwgaW50KQorICAgICAqIEBzZWUgI3NldE1lc3NhZ2UoaW50LCBpbnQsIGludCwgaW50KQorICAgICAqIEBzZWUgI2dldFN0YXR1cygpCisgICAgICogQHNlZSAjZ2V0RGF0YTEoKQorICAgICAqIEBzZWUgI2dldERhdGEyKCkKKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIFNob3J0TWVzc2FnZShpbnQgc3RhdHVzLCBpbnQgZGF0YTEsIGludCBkYXRhMikKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkTWlkaURhdGFFeGNlcHRpb24geworICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgc2V0TWVzc2FnZShzdGF0dXMsIGRhdGExLCBkYXRhMik7IC8vIGNhbiB0aHJvdyBJbnZhbGlkTWlkaURhdGFFeGNlcHRpb24KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTaG9ydE1lc3NhZ2V9IHdoaWNoIHJlcHJlc2VudHMgYSBjaGFubmVsCisgICAgICogTUlESSBtZXNzYWdlIHRoYXQgdGFrZXMgdXAgdG8gdHdvIGRhdGEgYnl0ZXMuIElmIHRoZSBtZXNzYWdlIG9ubHkgdGFrZXMKKyAgICAgKiBvbmUgZGF0YSBieXRlLCB0aGUgc2Vjb25kIGRhdGEgYnl0ZSBpcyBpZ25vcmVkLiBJZiB0aGUgbWVzc2FnZSBkb2VzIG5vdAorICAgICAqIHRha2UgYW55IGRhdGEgYnl0ZXMsIGJvdGggZGF0YSBieXRlcyBhcmUgaWdub3JlZC4KKyAgICAgKiBUaGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgY2FuIGJlIGNoYW5nZWQgYnkgdXNpbmcgb25lIG9mCisgICAgICogdGhlIHtAY29kZSBzZXRNZXNzYWdlfSBtZXRob2RzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1hbmQgIHRoZSBNSURJIGNvbW1hbmQgcmVwcmVzZW50ZWQgYnkgdGhpcyBtZXNzYWdlCisgICAgICogQHBhcmFtIGNoYW5uZWwgIHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSBkYXRhMSAgICB0aGUgZmlyc3QgZGF0YSBieXRlCisgICAgICogQHBhcmFtIGRhdGEyICAgIHRoZSBzZWNvbmQgZGF0YSBieXRlCisgICAgICogQHRocm93cyBJbnZhbGlkTWlkaURhdGFFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgdmFsdWUsIGNoYW5uZWwgdmFsdWUKKyAgICAgKiAgICAgb3IgYWxsIGRhdGEgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBtZXNzYWdlIGRvIG5vdCBzcGVjaWZ5CisgICAgICogICAgIGEgdmFsaWQgTUlESSBtZXNzYWdlCisgICAgICogQHNlZSAjc2V0TWVzc2FnZShpbnQpCisgICAgICogQHNlZSAjc2V0TWVzc2FnZShpbnQsIGludCwgaW50KQorICAgICAqIEBzZWUgI3NldE1lc3NhZ2UoaW50LCBpbnQsIGludCwgaW50KQorICAgICAqIEBzZWUgI2dldENvbW1hbmQoKQorICAgICAqIEBzZWUgI2dldENoYW5uZWwoKQorICAgICAqIEBzZWUgI2dldERhdGExKCkKKyAgICAgKiBAc2VlICNnZXREYXRhMigpCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHB1YmxpYyBTaG9ydE1lc3NhZ2UoaW50IGNvbW1hbmQsIGludCBjaGFubmVsLCBpbnQgZGF0YTEsIGludCBkYXRhMikKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkTWlkaURhdGFFeGNlcHRpb24geworICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgc2V0TWVzc2FnZShjb21tYW5kLCBjaGFubmVsLCBkYXRhMSwgZGF0YTIpOworICAgIH0KKwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5TaG9ydE1lc3NhZ2U8L2NvZGU+LgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3NvdW5kL21pZGkvU3lzZXhNZXNzYWdlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvbWlkaS9TeXNleE1lc3NhZ2UuamF2YQppbmRleCBhMzgzM2ZmLi4zODdkMDY2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvbWlkaS9TeXNleE1lc3NhZ2UuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvbWlkaS9TeXNleE1lc3NhZ2UuamF2YQpAQCAtMTIwLDYgKzEyMCw1NCBAQAogICAgICAgICBkYXRhWzFdID0gKGJ5dGUpIChTaG9ydE1lc3NhZ2UuRU5EX09GX0VYQ0xVU0lWRSAmIDB4RkYpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFN5c2V4TWVzc2FnZX0gYW5kIHNldHMgdGhlIGRhdGEgZm9yCisgICAgICogdGhlIG1lc3NhZ2UuIFRoZSBmaXJzdCBieXRlIG9mIHRoZSBkYXRhIGFycmF5IG11c3QgYmUgYSB2YWxpZCBzeXN0ZW0KKyAgICAgKiBleGNsdXNpdmUgc3RhdHVzIGJ5dGUgKDB4RjAgb3IgMHhGNykuCisgICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGNhbiBiZSBjaGFuZ2VkIGJ5IHVzaW5nIG9uZSBvZgorICAgICAqIHRoZSB7QGNvZGUgc2V0TWVzc2FnZX0gbWV0aG9kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBzeXN0ZW0gZXhjbHVzaXZlIG1lc3NhZ2UgZGF0YSBpbmNsdWRpbmcgdGhlIHN0YXR1cyBieXRlCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSB2YWxpZCBtZXNzYWdlIGRhdGEgaW4gdGhlIGFycmF5LAorICAgICAqICAgICBpbmNsdWRpbmcgdGhlIHN0YXR1cyBieXRlOyBpdCBzaG91bGQgYmUgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4KKyAgICAgKiAgICAgb3IgZXF1YWwgdG8ge0Bjb2RlIGRhdGEubGVuZ3RofQorICAgICAqIEB0aHJvd3MgSW52YWxpZE1pZGlEYXRhRXhjZXB0aW9uIGlmIHRoZSBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICogICAgIGRvIG5vdCBzcGVjaWZ5IGEgdmFsaWQgTUlESSBtZXRhIG1lc3NhZ2UuCisgICAgICogQHNlZSAjc2V0TWVzc2FnZShieXRlW10sIGludCkKKyAgICAgKiBAc2VlICNzZXRNZXNzYWdlKGludCwgYnl0ZVtdLCBpbnQpCisgICAgICogQHNlZSAjZ2V0RGF0YSgpCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHB1YmxpYyBTeXNleE1lc3NhZ2UoYnl0ZVtdIGRhdGEsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZE1pZGlEYXRhRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgIHNldE1lc3NhZ2UoZGF0YSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTeXNleE1lc3NhZ2V9IGFuZCBzZXRzIHRoZSBkYXRhIGZvciB0aGUgbWVzc2FnZS4KKyAgICAgKiBUaGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgY2FuIGJlIGNoYW5nZWQgYnkgdXNpbmcgb25lIG9mCisgICAgICogdGhlIHtAY29kZSBzZXRNZXNzYWdlfSBtZXRob2RzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIGJ5dGUgZm9yIHRoZSBtZXNzYWdlOyBpdCBtdXN0IGJlIGEgdmFsaWQgc3lzdGVtCisgICAgICogICAgIGV4Y2x1c2l2ZSBzdGF0dXMgYnl0ZSAoMHhGMCBvciAweEY3KQorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBzeXN0ZW0gZXhjbHVzaXZlIG1lc3NhZ2UgZGF0YSAod2l0aG91dCB0aGUgc3RhdHVzIGJ5dGUpCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSB2YWxpZCBtZXNzYWdlIGRhdGEgaW4gdGhlIGFycmF5OworICAgICAqICAgICBpdCBzaG91bGQgYmUgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAge0Bjb2RlIGRhdGEubGVuZ3RofQorICAgICAqIEB0aHJvd3MgSW52YWxpZE1pZGlEYXRhRXhjZXB0aW9uIGlmIHRoZSBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICogICAgIGRvIG5vdCBzcGVjaWZ5IGEgdmFsaWQgTUlESSBtZXRhIG1lc3NhZ2UuCisgICAgICogQHNlZSAjc2V0TWVzc2FnZShieXRlW10sIGludCkKKyAgICAgKiBAc2VlICNzZXRNZXNzYWdlKGludCwgYnl0ZVtdLCBpbnQpCisgICAgICogQHNlZSAjZ2V0RGF0YSgpCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHB1YmxpYyBTeXNleE1lc3NhZ2UoaW50IHN0YXR1cywgYnl0ZVtdIGRhdGEsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZE1pZGlEYXRhRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgIHNldE1lc3NhZ2Uoc3RhdHVzLCBkYXRhLCBsZW5ndGgpOworICAgIH0KKwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5TeXNleE1lc3NhZ2U8L2NvZGU+LgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3NvdW5kL3NhbXBsZWQvRmxvYXRDb250cm9sLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvc2FtcGxlZC9GbG9hdENvbnRyb2wuamF2YQppbmRleCA2NTBlYzQ5Li4xMmEzMTQwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvc2FtcGxlZC9GbG9hdENvbnRyb2wuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvc2FtcGxlZC9GbG9hdENvbnRyb2wuamF2YQpAQCAtMTMxLDEzICsxMzEsMzEgQEAKICAgICAgKiBAcGFyYW0gbWluTGFiZWwgdGhlIGxhYmVsIGZvciB0aGUgbWluaW11bSB2YWx1ZSwgc3VjaCBhcyAiTGVmdCIgb3IgIk9mZiIKICAgICAgKiBAcGFyYW0gbWlkTGFiZWwgdGhlIGxhYmVsIGZvciB0aGUgbWlkcG9pbnQgdmFsdWUsIHN1Y2ggYXMgIkNlbnRlciIgb3IgIkRlZmF1bHQiCiAgICAgICogQHBhcmFtIG1heExhYmVsIHRoZSBsYWJlbCBmb3IgdGhlIG1heGltdW0gdmFsdWUsIHN1Y2ggYXMgIlJpZ2h0IiBvciAiRnVsbCIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBtaW5pbXVtfSBpcyBncmVhdGVyCisgICAgICogICAgIHRoYW4ge0Bjb2RlIG1heGltdW19IG9yIHtAY29kZSBpbml0aWFsVmFsdWV9IGRvZXMgbm90IGZhbGwKKyAgICAgKiAgICAgd2l0aGluIHRoZSBhbGxvd2FibGUgcmFuZ2UKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRmxvYXRDb250cm9sKFR5cGUgdHlwZSwgZmxvYXQgbWluaW11bSwgZmxvYXQgbWF4aW11bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHByZWNpc2lvbiwgaW50IHVwZGF0ZVBlcmlvZCwgZmxvYXQgaW5pdGlhbFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXRzLCBTdHJpbmcgbWluTGFiZWwsIFN0cmluZyBtaWRMYWJlbCwgU3RyaW5nIG1heExhYmVsKSB7CisgICAgICAgICAgICBmbG9hdCBwcmVjaXNpb24sIGludCB1cGRhdGVQZXJpb2QsIGZsb2F0IGluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgIFN0cmluZyB1bml0cywgU3RyaW5nIG1pbkxhYmVsLCBTdHJpbmcgbWlkTGFiZWwsIFN0cmluZyBtYXhMYWJlbCkgewogCiAgICAgICAgIHN1cGVyKHR5cGUpOwogCisgICAgICAgIGlmIChtaW5pbXVtID4gbWF4aW11bSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWluaW11bSB2YWx1ZSAiICsgbWluaW11bQorICAgICAgICAgICAgICAgICAgICArICIgZXhjZWVkcyBtYXhpbXVtIHZhbHVlICIgKyBtYXhpbXVtICsgIi4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5pdGlhbFZhbHVlIDwgbWluaW11bSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5pdGlhbCB2YWx1ZSAiICsgaW5pdGlhbFZhbHVlCisgICAgICAgICAgICAgICAgICAgICsgIiBzbWFsbGVyIHRoYW4gYWxsb3dhYmxlIG1pbmltdW0gdmFsdWUgIiArIG1pbmltdW0gKyAiLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChpbml0aWFsVmFsdWUgPiBtYXhpbXVtKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbml0aWFsIHZhbHVlICIgKyBpbml0aWFsVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4Y2VlZHMgYWxsb3dhYmxlIG1heGltdW0gdmFsdWUgIiArIG1heGltdW0gKyAiLiIpOworICAgICAgICB9CisKKwogICAgICAgICB0aGlzLm1pbmltdW0gPSBtaW5pbXVtOwogICAgICAgICB0aGlzLm1heGltdW0gPSBtYXhpbXVtOwogCkBAIC0xNjcsMTAgKzE4NSwxNSBAQAogICAgICAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIHZhbHVlIHRoYXQgdGhlIGNvbnRyb2wgc3RhcnRzIHdpdGggd2hlbiBjb25zdHJ1Y3RlZAogICAgICAqIEBwYXJhbSB1bml0cyB0aGUgbGFiZWwgZm9yIHRoZSB1bml0cyBpbiB3aGljaCB0aGUgY29udHJvbCdzIHZhbHVlcyBhcmUgZXhwcmVzc2VkLAogICAgICAqIHN1Y2ggYXMgImRCIiBvciAiZnJhbWVzIHBlciBzZWNvbmQiCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgbWluaW11bX0gaXMgZ3JlYXRlcgorICAgICAqICAgICB0aGFuIHtAY29kZSBtYXhpbXVtfSBvciB7QGNvZGUgaW5pdGlhbFZhbHVlfSBkb2VzIG5vdCBmYWxsCisgICAgICogICAgIHdpdGhpbiB0aGUgYWxsb3dhYmxlIHJhbmdlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEZsb2F0Q29udHJvbChUeXBlIHR5cGUsIGZsb2F0IG1pbmltdW0sIGZsb2F0IG1heGltdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBwcmVjaXNpb24sIGludCB1cGRhdGVQZXJpb2QsIGZsb2F0IGluaXRpYWxWYWx1ZSwgU3RyaW5nIHVuaXRzKSB7Ci0gICAgICAgIHRoaXModHlwZSwgbWluaW11bSwgbWF4aW11bSwgcHJlY2lzaW9uLCB1cGRhdGVQZXJpb2QsIGluaXRpYWxWYWx1ZSwgdW5pdHMsICIiLCAiIiwgIiIpOworICAgICAgICAgICAgZmxvYXQgcHJlY2lzaW9uLCBpbnQgdXBkYXRlUGVyaW9kLCBmbG9hdCBpbml0aWFsVmFsdWUsIFN0cmluZyB1bml0cykgeworICAgICAgICB0aGlzKHR5cGUsIG1pbmltdW0sIG1heGltdW0sIHByZWNpc2lvbiwgdXBkYXRlUGVyaW9kLAorICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwgdW5pdHMsICIiLCAiIiwgIiIpOwogICAgIH0KIAogCkBAIC0zMDYsOSArMzI5LDIxIEBACiAgICAgICogQHBhcmFtIHRvIGZpbmFsIHZhbHVlIGFmdGVyIHRoZSBzaGlmdAogICAgICAqIEBwYXJhbSBtaWNyb3NlY29uZHMgbWF4aW11bSBkdXJhdGlvbiBvZiB0aGUgc2hpZnQgaW4gbWljcm9zZWNvbmRzCiAgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIge0Bjb2RlIGZyb219IG9yIHtAY29kZSB0b30KKyAgICAgKiAgICAgdmFsdWUgZG9lcyBub3QgZmFsbCB3aXRoaW4gdGhlIGFsbG93YWJsZSByYW5nZQorICAgICAqCiAgICAgICogQHNlZSAjZ2V0VXBkYXRlUGVyaW9kCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2hpZnQoZmxvYXQgZnJvbSwgZmxvYXQgdG8sIGludCBtaWNyb3NlY29uZHMpIHsKKyAgICAgICAgLy8gdGVzdCAiZnJvbSIgdmFsdWUsICJ0byIgdmFsdWUgd2lsbCBiZSB0ZXN0ZWQgYnkgc2V0VmFsdWUoKQorICAgICAgICBpZiAoZnJvbSA8IG1pbmltdW0pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlcXVlc3RlZCB2YWx1ZSAiICsgZnJvbQorICAgICAgICAgICAgICAgICAgICArICIgc21hbGxlciB0aGFuIGFsbG93YWJsZSBtaW5pbXVtIHZhbHVlICIgKyBtaW5pbXVtICsgIi4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJvbSA+IG1heGltdW0pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlcXVlc3RlZCB2YWx1ZSAiICsgZnJvbQorICAgICAgICAgICAgICAgICAgICArICIgZXhjZWVkcyBhbGxvd2FibGUgbWF4aW11bSB2YWx1ZSAiICsgbWF4aW11bSArICIuIik7CisgICAgICAgIH0KICAgICAgICAgc2V0VmFsdWUodG8pOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3NvdW5kL3NhbXBsZWQvc3BpL01peGVyUHJvdmlkZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zb3VuZC9zYW1wbGVkL3NwaS9NaXhlclByb3ZpZGVyLmphdmEKaW5kZXggZDVjMTYxZS4uYzc5YmIxMSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3NvdW5kL3NhbXBsZWQvc3BpL01peGVyUHJvdmlkZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc291bmQvc2FtcGxlZC9zcGkvTWl4ZXJQcm92aWRlci5qYXZhCkBAIC00Miw5ICs0MiwxNSBAQAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtaXhlciBwcm92aWRlciBzdXBwb3J0cyB0aGUgbWl4ZXIgcmVwcmVzZW50ZWQgYnkKICAgICAgKiB0aGUgc3BlY2lmaWVkIG1peGVyIGluZm8gb2JqZWN0LgorICAgICAqIDxwPgorICAgICAqIFRoZSBmdWxsIHNldCBvZiBtaXhlciBpbmZvIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIG1peGVycyBzdXBwb3J0ZWQKKyAgICAgKiBieSB0aGlzIHtAY29kZSBNaXhlclByb3ZpZGVyfSBtYXkgYmUgb2J0YWluZWQKKyAgICAgKiB0aHJvdWdoIHRoZSB7QGNvZGUgZ2V0TWl4ZXJJbmZvfSBtZXRob2QuCisgICAgICoKICAgICAgKiBAcGFyYW0gaW5mbyBhbiBpbmZvIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGUgbWl4ZXIgZm9yIHdoaWNoIHN1cHBvcnQgaXMgcXVlcmllZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBtaXhlciBpcyBzdXBwb3J0ZWQsCi0gICAgICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgbWl4ZXIgaXMgc3VwcG9ydGVkLAorICAgICAqICAgICBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBzZWUgI2dldE1peGVySW5mbygpCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNaXhlclN1cHBvcnRlZChNaXhlci5JbmZvIGluZm8pIHsKIApAQCAtNjIsMTcgKzY4LDM0IEBACiAgICAgLyoqCiAgICAgICogT2J0YWlucyB0aGUgc2V0IG9mIGluZm8gb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIG1peGVyCiAgICAgICogb3IgbWl4ZXJzIHByb3ZpZGVkIGJ5IHRoaXMgTWl4ZXJQcm92aWRlci4KLSAgICAgKiBAcmV0dXJuIHNldCBvZiBtaXhlciBpbmZvIG9iamVjdHMKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUge0Bjb2RlIGlzTWl4ZXJTdXBwb3J0ZWR9IG1ldGhvZCByZXR1cm5zIHtAY29kZSB0cnVlfQorICAgICAqIGZvciBhbGwgdGhlIGluZm8gb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiBUaGUgY29ycmVzcG9uZGluZyBtaXhlciBpbnN0YW5jZXMgZm9yIHRoZSBpbmZvIG9iamVjdHMKKyAgICAgKiBhcmUgcmV0dXJuZWQgYnkgdGhlIHtAY29kZSBnZXRNaXhlcn0gbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBhIHNldCBvZiBtaXhlciBpbmZvIG9iamVjdHMKKyAgICAgKiBAc2VlICNnZXRNaXhlcihqYXZheC5zb3VuZC5zYW1wbGVkLk1peGVyLkluZm8pIGdldE1peGVyKE1peGVyLkluZm8pCisgICAgICogQHNlZSAjaXNNaXhlclN1cHBvcnRlZChqYXZheC5zb3VuZC5zYW1wbGVkLk1peGVyLkluZm8pIGlzTWl4ZXJTdXBwb3J0ZWQoTWl4ZXIuSW5mbykKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTWl4ZXIuSW5mb1tdIGdldE1peGVySW5mbygpOwogCiAKICAgICAvKioKICAgICAgKiBPYnRhaW5zIGFuIGluc3RhbmNlIG9mIHRoZSBtaXhlciByZXByZXNlbnRlZCBieSB0aGUgaW5mbyBvYmplY3QuCisgICAgICogPHA+CisgICAgICogVGhlIGZ1bGwgc2V0IG9mIHRoZSBtaXhlciBpbmZvIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIG1peGVycworICAgICAqIHN1cHBvcnRlZCBieSB0aGlzIHtAY29kZSBNaXhlclByb3ZpZGVyfSBtYXkgYmUgb2J0YWluZWQKKyAgICAgKiB0aHJvdWdoIHRoZSB7QGNvZGUgZ2V0TWl4ZXJJbmZvfSBtZXRob2QuCisgICAgICogVXNlIHRoZSB7QGNvZGUgaXNNaXhlclN1cHBvcnRlZH0gbWV0aG9kIHRvIHRlc3Qgd2hldGhlcgorICAgICAqIHRoaXMge0Bjb2RlIE1peGVyUHJvdmlkZXJ9IHN1cHBvcnRzIGEgcGFydGljdWxhciBtaXhlci4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpbmZvIGFuIGluZm8gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBkZXNpcmVkIG1peGVyCiAgICAgICogQHJldHVybiBtaXhlciBpbnN0YW5jZQogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbmZvIG9iamVjdCBzcGVjaWZpZWQgZG9lcyBub3QKLSAgICAgKiBtYXRjaCB0aGUgaW5mbyBvYmplY3QgZm9yIGEgbWl4ZXIgc3VwcG9ydGVkIGJ5IHRoaXMgTWl4ZXJQcm92aWRlci4KKyAgICAgKiAgICAgbWF0Y2ggdGhlIGluZm8gb2JqZWN0IGZvciBhIG1peGVyIHN1cHBvcnRlZCBieSB0aGlzIE1peGVyUHJvdmlkZXIuCisgICAgICogQHNlZSAjZ2V0TWl4ZXJJbmZvKCkKKyAgICAgKiBAc2VlICNpc01peGVyU3VwcG9ydGVkKGphdmF4LnNvdW5kLnNhbXBsZWQuTWl4ZXIuSW5mbykgaXNNaXhlclN1cHBvcnRlZChNaXhlci5JbmZvKQogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBNaXhlciBnZXRNaXhlcihNaXhlci5JbmZvIGluZm8pOwogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0RlZmF1bHRDZWxsRWRpdG9yLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvRGVmYXVsdENlbGxFZGl0b3IuamF2YQppbmRleCBkYTFiYmNjLi4zMzIwZDM3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvRGVmYXVsdENlbGxFZGl0b3IuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvRGVmYXVsdENlbGxFZGl0b3IuamF2YQpAQCAtMjY2LDYgKzI2NiwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgY29sdW1uKSB7CiAgICAgICAgIGRlbGVnYXRlLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgaWYgKGVkaXRvckNvbXBvbmVudCBpbnN0YW5jZW9mIEpDaGVja0JveCkgeworICAgICAgICAgICAgLy9pbiBvcmRlciB0byBhdm9pZCBhICJmbGFzaGluZyIgZWZmZWN0IHdoZW4gY2xpY2tpbmcgYSBjaGVja2JveAorICAgICAgICAgICAgLy9pbiBhIHRhYmxlLCBpdCBpcyBpbXBvcnRhbnQgZm9yIHRoZSBlZGl0b3IgdG8gaGF2ZSBhcyBhIGJvcmRlcgorICAgICAgICAgICAgLy90aGUgc2FtZSBib3JkZXIgdGhhdCB0aGUgcmVuZGVyZXIgaGFzLCBhbmQgaGF2ZSBhcyB0aGUgYmFja2dyb3VuZAorICAgICAgICAgICAgLy90aGUgc2FtZSBjb2xvciBhcyB0aGUgcmVuZGVyZXIgaGFzLiBUaGlzIGlzIHByaW1hcmlseSBvbmx5CisgICAgICAgICAgICAvL25lZWRlZCBmb3IgSkNoZWNrQm94IHNpbmNlIHRoaXMgZWRpdG9yIGRvZXNuJ3QgZmlsbCBhbGwgdGhlCisgICAgICAgICAgICAvL3Zpc3VhbCBzcGFjZSBvZiB0aGUgdGFibGUgY2VsbCwgdW5saWtlIGEgdGV4dCBmaWVsZC4KKyAgICAgICAgICAgIFRhYmxlQ2VsbFJlbmRlcmVyIHJlbmRlcmVyID0gdGFibGUuZ2V0Q2VsbFJlbmRlcmVyKHJvdywgY29sdW1uKTsKKyAgICAgICAgICAgIENvbXBvbmVudCBjID0gcmVuZGVyZXIuZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQodGFibGUsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkLCB0cnVlLCByb3csIGNvbHVtbik7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZWRpdG9yQ29tcG9uZW50LnNldE9wYXF1ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBlZGl0b3JDb21wb25lbnQuc2V0QmFja2dyb3VuZChjLmdldEJhY2tncm91bmQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBKQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGVkaXRvckNvbXBvbmVudC5zZXRCb3JkZXIoKChKQ29tcG9uZW50KWMpLmdldEJvcmRlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVkaXRvckNvbXBvbmVudC5zZXRPcGFxdWUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJldHVybiBlZGl0b3JDb21wb25lbnQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvRGVmYXVsdExpc3RDZWxsUmVuZGVyZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9EZWZhdWx0TGlzdENlbGxSZW5kZXJlci5qYXZhCmluZGV4IDRkNTIzZTAuLjJjYjQyMjcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9EZWZhdWx0TGlzdENlbGxSZW5kZXJlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9EZWZhdWx0TGlzdENlbGxSZW5kZXJlci5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgc3VuLnN3aW5nLkRlZmF1bHRMb29rdXA7CiAKIAogLyoqCkBAIC03OSw4ICs4MCw5IEBACiAgICAgKiA8Y29kZT5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50PC9jb2RlPiBtZXRob2QgYW5kIHNldCB0aGUgYm9yZGVyCiAgICAgKiBvZiB0aGUgcmV0dXJuZWQgY29tcG9uZW50IGRpcmVjdGx5LgogICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBCb3JkZXIgbm9Gb2N1c0JvcmRlciA9IG5ldyBFbXB0eUJvcmRlcigxLCAxLCAxLCAxKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgU0FGRV9OT19GT0NVU19CT1JERVIgPSBuZXcgRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIERFRkFVTFRfTk9fRk9DVVNfQk9SREVSID0gbmV3IEVtcHR5Qm9yZGVyKDEsIDEsIDEsIDEpOworICAgIHByb3RlY3RlZCBzdGF0aWMgQm9yZGVyIG5vRm9jdXNCb3JkZXIgPSBERUZBVUxUX05PX0ZPQ1VTX0JPUkRFUjsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBkZWZhdWx0IHJlbmRlcmVyIG9iamVjdCBmb3IgYW4gaXRlbQpAQCAtOTAsMTQgKzkyLDIxIEBACiAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgIHNldE9wYXF1ZSh0cnVlKTsKICAgICAgICAgc2V0Qm9yZGVyKGdldE5vRm9jdXNCb3JkZXIoKSk7CisgICAgICAgIHNldE5hbWUoIkxpc3QuY2VsbFJlbmRlcmVyIik7CiAgICAgfQogCi0KLSAgICBwcml2YXRlIHN0YXRpYyBCb3JkZXIgZ2V0Tm9Gb2N1c0JvcmRlcigpIHsKKyAgICBwcml2YXRlIEJvcmRlciBnZXROb0ZvY3VzQm9yZGVyKCkgeworICAgICAgICBCb3JkZXIgYm9yZGVyID0gRGVmYXVsdExvb2t1cC5nZXRCb3JkZXIodGhpcywgdWksICJMaXN0LmNlbGxOb0ZvY3VzQm9yZGVyIik7CiAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGJvcmRlciAhPSBudWxsKSByZXR1cm4gYm9yZGVyOwogICAgICAgICAgICAgcmV0dXJuIFNBRkVfTk9fRk9DVVNfQk9SREVSOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFVJTWFuYWdlci5nZXRCb3JkZXIoIkxpc3Qubm9Gb2N1c0JvcmRlciIpOworICAgICAgICAgICAgaWYgKGJvcmRlciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIChub0ZvY3VzQm9yZGVyID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgbm9Gb2N1c0JvcmRlciA9PSBERUZBVUxUX05PX0ZPQ1VTX0JPUkRFUikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYm9yZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vRm9jdXNCb3JkZXI7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExOCw4ICsxMjcsOCBAQAogICAgICAgICAgICAgICAgICYmICFkcm9wTG9jYXRpb24uaXNJbnNlcnQoKQogICAgICAgICAgICAgICAgICYmIGRyb3BMb2NhdGlvbi5nZXRJbmRleCgpID09IGluZGV4KSB7CiAKLSAgICAgICAgICAgIGJnID0gVUlNYW5hZ2VyLmdldENvbG9yKCJMaXN0LmRyb3BDZWxsQmFja2dyb3VuZCIpOwotICAgICAgICAgICAgZmcgPSBVSU1hbmFnZXIuZ2V0Q29sb3IoIkxpc3QuZHJvcENlbGxGb3JlZ3JvdW5kIik7CisgICAgICAgICAgICBiZyA9IERlZmF1bHRMb29rdXAuZ2V0Q29sb3IodGhpcywgdWksICJMaXN0LmRyb3BDZWxsQmFja2dyb3VuZCIpOworICAgICAgICAgICAgZmcgPSBEZWZhdWx0TG9va3VwLmdldENvbG9yKHRoaXMsIHVpLCAiTGlzdC5kcm9wQ2VsbEZvcmVncm91bmQiKTsKIAogICAgICAgICAgICAgaXNTZWxlY3RlZCA9IHRydWU7CiAgICAgICAgIH0KQEAgLTE0OCwxMCArMTU3LDEwIEBACiAgICAgICAgIEJvcmRlciBib3JkZXIgPSBudWxsOwogICAgICAgICBpZiAoY2VsbEhhc0ZvY3VzKSB7CiAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkgewotICAgICAgICAgICAgICAgIGJvcmRlciA9IFVJTWFuYWdlci5nZXRCb3JkZXIoIkxpc3QuZm9jdXNTZWxlY3RlZENlbGxIaWdobGlnaHRCb3JkZXIiKTsKKyAgICAgICAgICAgICAgICBib3JkZXIgPSBEZWZhdWx0TG9va3VwLmdldEJvcmRlcih0aGlzLCB1aSwgIkxpc3QuZm9jdXNTZWxlY3RlZENlbGxIaWdobGlnaHRCb3JkZXIiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChib3JkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvcmRlciA9IFVJTWFuYWdlci5nZXRCb3JkZXIoIkxpc3QuZm9jdXNDZWxsSGlnaGxpZ2h0Qm9yZGVyIik7CisgICAgICAgICAgICAgICAgYm9yZGVyID0gRGVmYXVsdExvb2t1cC5nZXRCb3JkZXIodGhpcywgdWksICJMaXN0LmZvY3VzQ2VsbEhpZ2hsaWdodEJvcmRlciIpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYm9yZGVyID0gZ2V0Tm9Gb2N1c0JvcmRlcigpOwpAQCAtMTYxLDcgKzE3MCw2IEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogT3ZlcnJpZGRlbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KQEAgLTE3Miw2ICsxODAsNyBAQAogICAgICAqICAgICAgICAgYW5kIGRpZmZlcnMgZnJvbSB0aGUgSkxpc3QncyBiYWNrZ3JvdW5kOwogICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkgewogICAgICAgICBDb2xvciBiYWNrID0gZ2V0QmFja2dyb3VuZCgpOwogICAgICAgICBDb21wb25lbnQgcCA9IGdldFBhcmVudCgpOwpAQCAtMTkwLDYgKzE5OSw3IEBACiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7fQogCiAgICAvKioKQEAgLTE5OSw2ICsyMDksNyBAQAogICAgICoKICAgICAqIEBzaW5jZSAxLjUKICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7fQogCiAgICAvKioKQEAgLTIwOCw2ICsyMTksNyBAQAogICAgICoKICAgICAqIEBzaW5jZSAxLjUKICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlcGFpbnQoKSB7fQogCiAgICAvKioKQEAgLTIxNSwxMiArMjI3LDE0IEBACiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmV2YWxpZGF0ZSgpIHt9CiAgICAvKioKICAgICAqIE92ZXJyaWRkZW4gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVwYWludChsb25nIHRtLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkge30KIAogICAgLyoqCkBAIC0yMjgsNiArMjQyLDcgQEAKICAgICAqIFNlZSB0aGUgPGEgaHJlZj0iI292ZXJyaWRlIj5JbXBsZW1lbnRhdGlvbiBOb3RlPC9hPgogICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXBhaW50KFJlY3RhbmdsZSByKSB7fQogCiAgICAvKioKQEAgLTIzNSw2ICsyNTAsNyBAQAogICAgICogU2VlIHRoZSA8YSBocmVmPSIjb3ZlcnJpZGUiPkltcGxlbWVudGF0aW9uIE5vdGU8L2E+CiAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewogICAgICAgICAvLyBTdHJpbmdzIGdldCBpbnRlcm5lZC4uLgogICAgICAgICBpZiAocHJvcGVydHlOYW1lID09ICJ0ZXh0IgpAQCAtMjUxLDYgKzI2Nyw3IEBACiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJ5dGUgb2xkVmFsdWUsIGJ5dGUgbmV3VmFsdWUpIHt9CiAKICAgIC8qKgpAQCAtMjU4LDYgKzI3NSw3IEBACiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGNoYXIgb2xkVmFsdWUsIGNoYXIgbmV3VmFsdWUpIHt9CiAKICAgIC8qKgpAQCAtMjY1LDYgKzI4Myw3IEBACiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIHNob3J0IG9sZFZhbHVlLCBzaG9ydCBuZXdWYWx1ZSkge30KIAogICAgLyoqCkBAIC0yNzIsNiArMjkxLDcgQEAKICAgICAqIFNlZSB0aGUgPGEgaHJlZj0iI292ZXJyaWRlIj5JbXBsZW1lbnRhdGlvbiBOb3RlPC9hPgogICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHt9CiAKICAgIC8qKgpAQCAtMjc5LDYgKzI5OSw3IEBACiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGxvbmcgb2xkVmFsdWUsIGxvbmcgbmV3VmFsdWUpIHt9CiAKICAgIC8qKgpAQCAtMjg2LDYgKzMwNyw3IEBACiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZsb2F0IG9sZFZhbHVlLCBmbG9hdCBuZXdWYWx1ZSkge30KIAogICAgLyoqCkBAIC0yOTMsNiArMzE1LDcgQEAKICAgICAqIFNlZSB0aGUgPGEgaHJlZj0iI292ZXJyaWRlIj5JbXBsZW1lbnRhdGlvbiBOb3RlPC9hPgogICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgZG91YmxlIG9sZFZhbHVlLCBkb3VibGUgbmV3VmFsdWUpIHt9CiAKICAgIC8qKgpAQCAtMzAwLDYgKzMyMyw3IEBACiAgICAgKiBTZWUgdGhlIDxhIGhyZWY9IiNvdmVycmlkZSI+SW1wbGVtZW50YXRpb24gTm90ZTwvYT4KICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHt9CiAKICAgICAvKioKQEAgLTMyMSw1ICszNDUsNCBAQAogICAgICAgICBpbXBsZW1lbnRzIGphdmF4LnN3aW5nLnBsYWYuVUlSZXNvdXJjZQogICAgIHsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KQ29tYm9Cb3guamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KQ29tYm9Cb3guamF2YQppbmRleCA0MmVmNjQ2Li44MzhjZTVkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvSkNvbWJvQm94LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pDb21ib0JveC5qYXZhCkBAIC0zNCwxMiArMzQsMTAgQEAKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci4qOwogCiBpbXBvcnQgamF2YXguYWNjZXNzaWJpbGl0eS4qOwogCkBAIC0yMjcsNyArMjI1LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewogICAgICAgICBpbnN0YWxsQW5jZXN0b3JMaXN0ZW5lcigpOwotICAgICAgICBzZXRPcGFxdWUodHJ1ZSk7CisgICAgICAgIHNldFVJUHJvcGVydHkoIm9wYXF1ZSIsdHJ1ZSk7CiAgICAgICAgIHVwZGF0ZVVJKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvSlNjcm9sbFBhbmUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KU2Nyb2xsUGFuZS5qYXZhCmluZGV4IDEzYzEzNjUuLmIyYmU0M2MgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KU2Nyb2xsUGFuZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KU2Nyb2xsUGFuZS5qYXZhCkBAIC0zMiwxNSArMzIsMTIgQEAKIAogaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKIGltcG9ydCBqYXZhLmF3dC5Db21wb25lbnRPcmllbnRhdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKIGltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CiBpbXBvcnQgamF2YS5hd3QuSW5zZXRzOwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwogaW1wb3J0IGphdmEuYXd0LkxheW91dE1hbmFnZXI7CiBpbXBvcnQgamF2YS5hd3QuUG9pbnQ7CiAKIGltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CkBAIC0zMDQsNyArMzAxLDcgQEAKICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgc2V0Vmlld3BvcnRWaWV3KHZpZXcpOwogICAgICAgICB9Ci0gICAgICAgIHNldE9wYXF1ZSh0cnVlKTsKKyAgICAgICAgc2V0VUlQcm9wZXJ0eSgib3BhcXVlIix0cnVlKTsKICAgICAgICAgdXBkYXRlVUkoKTsKIAogICAgICAgICBpZiAoIXRoaXMuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKS5pc0xlZnRUb1JpZ2h0KCkpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KU3Bpbm5lci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pTcGlubmVyLmphdmEKaW5kZXggZGRkOTJiOS4uZWQ3YmZjOCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pTcGlubmVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pTcGlubmVyLmphdmEKQEAgLTI4LDcgKzI4LDYgQEAKIGltcG9ydCBqYXZhLmF3dC4qOwogaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CiAKLWltcG9ydCBqYXZheC5zd2luZy4qOwogaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7CiBpbXBvcnQgamF2YXguc3dpbmcudGV4dC4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuU3Bpbm5lclVJOwpAQCAtMTU0LDcgKzE1Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwogICAgICAgICB0aGlzLmVkaXRvciA9IGNyZWF0ZUVkaXRvcihtb2RlbCk7Ci0gICAgICAgIHNldE9wYXF1ZSh0cnVlKTsKKyAgICAgICAgc2V0VUlQcm9wZXJ0eSgib3BhcXVlIix0cnVlKTsKICAgICAgICAgdXBkYXRlVUkoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KU3BsaXRQYW5lLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvSlNwbGl0UGFuZS5qYXZhCmluZGV4IDFlMzhiOWYuLmI1ZDhlYzcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KU3BsaXRQYW5lLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pTcGxpdFBhbmUuamF2YQpAQCAtMjQ2LDcgKzI0Niw4IEBACiAgICAgICogbGF5b3V0LCB1c2luZyB0d28gYnV0dG9ucyBmb3IgdGhlIGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHVibGljIEpTcGxpdFBhbmUoKSB7Ci0gICAgICAgIHRoaXMoSlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElULCBmYWxzZSwKKyAgICAgICAgdGhpcyhKU3BsaXRQYW5lLkhPUklaT05UQUxfU1BMSVQsCisgICAgICAgICAgICBVSU1hbmFnZXIuZ2V0Qm9vbGVhbigiU3BsaXRQYW5lLmNvbnRpbnVvdXNMYXlvdXQiKSwKICAgICAgICAgICAgIG5ldyBKQnV0dG9uKFVJTWFuYWdlci5nZXRTdHJpbmcoIlNwbGl0UGFuZS5sZWZ0QnV0dG9uVGV4dCIpKSwKICAgICAgICAgICAgIG5ldyBKQnV0dG9uKFVJTWFuYWdlci5nZXRTdHJpbmcoIlNwbGl0UGFuZS5yaWdodEJ1dHRvblRleHQiKSkpOwogICAgIH0KQEAgLTI2Myw3ICsyNjQsOCBAQAogICAgICAqLwogICAgIEBDb25zdHJ1Y3RvclByb3BlcnRpZXMoeyJvcmllbnRhdGlvbiJ9KQogICAgIHB1YmxpYyBKU3BsaXRQYW5lKGludCBuZXdPcmllbnRhdGlvbikgewotICAgICAgICB0aGlzKG5ld09yaWVudGF0aW9uLCBmYWxzZSk7CisgICAgICAgIHRoaXMobmV3T3JpZW50YXRpb24sCisgICAgICAgICAgICBVSU1hbmFnZXIuZ2V0Qm9vbGVhbigiU3BsaXRQYW5lLmNvbnRpbnVvdXNMYXlvdXQiKSk7CiAgICAgfQogCiAKQEAgLTMwNyw3ICszMDksOSBAQAogICAgIHB1YmxpYyBKU3BsaXRQYW5lKGludCBuZXdPcmllbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgbmV3TGVmdENvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgbmV3UmlnaHRDb21wb25lbnQpewotICAgICAgICB0aGlzKG5ld09yaWVudGF0aW9uLCBmYWxzZSwgbmV3TGVmdENvbXBvbmVudCwgbmV3UmlnaHRDb21wb25lbnQpOworICAgICAgICB0aGlzKG5ld09yaWVudGF0aW9uLAorICAgICAgICAgICAgVUlNYW5hZ2VyLmdldEJvb2xlYW4oIlNwbGl0UGFuZS5jb250aW51b3VzTGF5b3V0IiksCisgICAgICAgICAgICBuZXdMZWZ0Q29tcG9uZW50LCBuZXdSaWdodENvbXBvbmVudCk7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KVGFibGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9KVGFibGUuamF2YQppbmRleCAxYjc3MGQ4Li5kYzlhZGViIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvSlRhYmxlLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL0pUYWJsZS5qYXZhCkBAIC03MzEsNiArNzMxLDM3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2Nyb2xsUGFuZS5zZXRDb2x1bW5IZWFkZXJWaWV3KGdldFRhYmxlSGVhZGVyKCkpOworICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Nyb2xscGFuZSBmb3IgYW55IExBRiBkZXBlbmRlbnQgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICBjb25maWd1cmVFbmNsb3NpbmdTY3JvbGxQYW5lVUkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBzdWItcGFydCBvZiBjb25maWd1cmVFbmNsb3NpbmdTY3JvbGxQYW5lKCkgdGhhdCBjb25maWd1cmVzCisgICAgICogYW55dGhpbmcgb24gdGhlIHNjcm9sbHBhbmUgdGhhdCBtYXkgY2hhbmdlIHdoZW4gdGhlIGxvb2sgYW5kIGZlZWwKKyAgICAgKiBjaGFuZ2VzLiBJdCBuZWVkZWQgdG8gYmUgc3BsaXQgb3V0IGZyb20gY29uZmlndXJlRW5jbG9zaW5nU2Nyb2xsUGFuZSgpIHNvCisgICAgICogdGhhdCBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdXBkYXRlVUkoKSB3aGVuIHRoZSBMQUYgY2hhbmdlcyB3aXRob3V0CisgICAgICogY2F1c2luZyB0aGUgcmVncmVzc2lvbiBmb3VuZCBpbiBidWcgNjY4Nzk2Mi4gVGhpcyB3YXMgYmVjYXVzZSB1cGRhdGVVSSgpCisgICAgICogaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHRoZW4gY2F1c2VkCisgICAgICogY29uZmlndXJlRW5jbG9zaW5nU2Nyb2xsUGFuZSgpIHRvIGJlIGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3Igd2hpY2gKKyAgICAgKiBjaGFuZ2VzIGl0cyBjb250cmFjdCBmb3IgYW55IHN1YmNsYXNzIHRoYXQgb3ZlcnJpZGVzIGl0LiBTbyBieSBzcGxpdHRpbmcKKyAgICAgKiBpdCBvdXQgaW4gdGhpcyB3YXkgY29uZmlndXJlRW5jbG9zaW5nU2Nyb2xsUGFuZVVJKCkgY2FuIGJlIGNhbGxlZCBib3RoCisgICAgICogZnJvbSBjb25maWd1cmVFbmNsb3NpbmdTY3JvbGxQYW5lKCkgYW5kIHVwZGF0ZVVJKCkgaW4gYSBzYWZlIG1hbm9yLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVFbmNsb3NpbmdTY3JvbGxQYW5lVUkoKSB7CisgICAgICAgIENvbnRhaW5lciBwID0gZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChwIGluc3RhbmNlb2YgSlZpZXdwb3J0KSB7CisgICAgICAgICAgICBDb250YWluZXIgZ3AgPSBwLmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKGdwIGluc3RhbmNlb2YgSlNjcm9sbFBhbmUpIHsKKyAgICAgICAgICAgICAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gKEpTY3JvbGxQYW5lKWdwOworICAgICAgICAgICAgICAgIC8vIE1ha2UgY2VydGFpbiB3ZSBhcmUgdGhlIHZpZXdQb3J0J3MgdmlldyBhbmQgbm90LCBmb3IKKyAgICAgICAgICAgICAgICAvLyBleGFtcGxlLCB0aGUgcm93SGVhZGVyVmlldyBvZiB0aGUgc2Nyb2xsUGFuZSAtCisgICAgICAgICAgICAgICAgLy8gYW4gaW1wbGVtZW50b3Igb2YgZml4ZWQgY29sdW1ucyBtaWdodCBkbyB0aGlzLgorICAgICAgICAgICAgICAgIEpWaWV3cG9ydCB2aWV3cG9ydCA9IHNjcm9sbFBhbmUuZ2V0Vmlld3BvcnQoKTsKKyAgICAgICAgICAgICAgICBpZiAodmlld3BvcnQgPT0gbnVsbCB8fCB2aWV3cG9ydC5nZXRWaWV3KCkgIT0gdGhpcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vICBzY3JvbGxQYW5lLmdldFZpZXdwb3J0KCkuc2V0QmFja2luZ1N0b3JlRW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBCb3JkZXIgYm9yZGVyID0gc2Nyb2xsUGFuZS5nZXRCb3JkZXIoKTsKICAgICAgICAgICAgICAgICBpZiAoYm9yZGVyID09IG51bGwgfHwgYm9yZGVyIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkgewpAQCAtNzQwLDYgKzc3MSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUGFuZS5zZXRCb3JkZXIoc2Nyb2xsUGFuZUJvcmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWRkIEpTY3JvbGxCYXIgY29ybmVyIGNvbXBvbmVudCBpZiBhdmFpbGFibGUgZnJvbSBMQUYgYW5kIG5vdCBhbHJlYWR5IHNldCBieSB0aGUgdXNlcgorICAgICAgICAgICAgICAgIENvbXBvbmVudCBjb3JuZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUGFuZS5nZXRDb3JuZXIoSlNjcm9sbFBhbmUuVVBQRVJfVFJBSUxJTkdfQ09STkVSKTsKKyAgICAgICAgICAgICAgICBpZiAoY29ybmVyID09IG51bGwgfHwgY29ybmVyIGluc3RhbmNlb2YgVUlSZXNvdXJjZSl7CisgICAgICAgICAgICAgICAgICAgIGNvcm5lciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb21wb25lbnRDbGFzcyA9IFVJTWFuYWdlci5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhYmxlLnNjcm9sbFBhbmVDb3JuZXJDb21wb25lbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudENsYXNzIGluc3RhbmNlb2YgQ2xhc3MpeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JuZXIgPSAoQ29tcG9uZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDbGFzcyljb21wb25lbnRDbGFzcykubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmUgYW5kIGRvbid0IHNldCBjb3JuZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzY3JvbGxQYW5lLnNldENvcm5lcihKU2Nyb2xsUGFuZS5VUFBFUl9UUkFJTElOR19DT1JORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ybmVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03ODMsNiArODMyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2Nyb2xsUGFuZS5zZXRDb2x1bW5IZWFkZXJWaWV3KG51bGwpOworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBTY3JvbGxQYW5lIGNvcm5lciBpZiBvbmUgd2FzIGFkZGVkIGJ5IHRoZSBMQUYKKyAgICAgICAgICAgICAgICBDb21wb25lbnQgY29ybmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFBhbmUuZ2V0Q29ybmVyKEpTY3JvbGxQYW5lLlVQUEVSX1RSQUlMSU5HX0NPUk5FUik7CisgICAgICAgICAgICAgICAgaWYgKGNvcm5lciBpbnN0YW5jZW9mIFVJUmVzb3VyY2UpeworICAgICAgICAgICAgICAgICAgICBzY3JvbGxQYW5lLnNldENvcm5lcihKU2Nyb2xsUGFuZS5VUFBFUl9UUkFJTElOR19DT1JORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzU5Miw2ICszNjQ4LDkgQEAKICAgICAgICAgICAgIHRhYmxlSGVhZGVyLnVwZGF0ZVVJKCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBVcGRhdGUgVUkgYXBwbGllZCB0byBwYXJlbnQgU2Nyb2xsUGFuZQorICAgICAgICBjb25maWd1cmVFbmNsb3NpbmdTY3JvbGxQYW5lVUkoKTsKKwogICAgICAgICBzZXRVSSgoVGFibGVVSSlVSU1hbmFnZXIuZ2V0VUkodGhpcykpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL011bHRpVUlEZWZhdWx0cy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL011bHRpVUlEZWZhdWx0cy5qYXZhCmluZGV4IGQ1OTA0ZDAuLjIwZWVlYWYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9NdWx0aVVJRGVmYXVsdHMuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvTXVsdGlVSURlZmF1bHRzLmphdmEKQEAgLTI2LDcgKzI2LDEwIEBACiBwYWNrYWdlIGphdmF4LnN3aW5nOwogCiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAKIApAQCAtNDgsNyArNTEsNyBAQAogICAgICAgICB0YWJsZXMgPSBuZXcgVUlEZWZhdWx0c1swXTsKICAgICB9CiAKLQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpCiAgICAgewogICAgICAgICBPYmplY3QgdmFsdWUgPSBzdXBlci5nZXQoa2V5KTsKQEAgLTY2LDcgKzY5LDcgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5LCBMb2NhbGUgbCkKICAgICB7CiAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHN1cGVyLmdldChrZXksbCk7CkBAIC04NCw3ICs4Nyw3IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICBpbnQgbiA9IHN1cGVyLnNpemUoKTsKICAgICAgICAgZm9yIChVSURlZmF1bHRzIHRhYmxlIDogdGFibGVzKSB7CkBAIC05MywxMiArOTYsMTIgQEAKICAgICAgICAgcmV0dXJuIG47CiAgICAgfQogCi0KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewogICAgICAgICByZXR1cm4gc2l6ZSgpID09IDA7CiAgICAgfQogCi0KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248T2JqZWN0PiBrZXlzKCkKICAgICB7CiAgICAgICAgIEVudW1lcmF0aW9uW10gZW51bXMgPSBuZXcgRW51bWVyYXRpb25bMSArIHRhYmxlcy5sZW5ndGhdOwpAQCAtMTEyLDcgKzExNSw3IEBACiAgICAgICAgIHJldHVybiBuZXcgTXVsdGlVSURlZmF1bHRzRW51bWVyYXRvcihlbnVtcyk7CiAgICAgfQogCi0KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248T2JqZWN0PiBlbGVtZW50cygpCiAgICAgewogICAgICAgICBFbnVtZXJhdGlvbltdIGVudW1zID0gbmV3IEVudW1lcmF0aW9uWzEgKyB0YWJsZXMubGVuZ3RoXTsKQEAgLTEyNiw2ICsxMjksMTkgQEAKICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVVJRGVmYXVsdHNFbnVtZXJhdG9yKGVudW1zKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gZW50cnlTZXQoKSB7CisgICAgICAgIFNldDxFbnRyeTxPYmplY3QsIE9iamVjdD4+IHNldCA9IG5ldyBIYXNoU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4oKTsKKyAgICAgICAgaWYgKHRhYmxlcyA9PSBudWxsKSByZXR1cm4gc2V0OworICAgICAgICBmb3IgKFVJRGVmYXVsdHMgdGFibGUgOiB0YWJsZXMpIHsKKyAgICAgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0LmFkZEFsbCh0YWJsZS5lbnRyeVNldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGdldFVJRXJyb3IoU3RyaW5nIG1zZykgewogICAgICAgICBpZiAodGFibGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgIHRhYmxlc1swXS5nZXRVSUVycm9yKG1zZyk7CkBAIC0xNjQsNyArMTgwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkKICAgICB7CiAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHN1cGVyLnJlbW92ZShrZXkpOwpAQCAtMTgyLDcgKzE5OCw3IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAgICAgICAgIHN1cGVyLmNsZWFyKCk7CiAgICAgICAgIGZvciAoVUlEZWZhdWx0cyB0YWJsZSA6IHRhYmxlcykgewpAQCAtMTkyLDYgKzIwOCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgYnVmLmFwcGVuZCgieyIpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL1BhaW50ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9QYWludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2MTM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9QYWludGVyLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgamF2YXguc3dpbmc7CisKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworCisvKioKKyAqIDxwPkEgcGFpbnRpbmcgZGVsZWdhdGUuIFRoZSBQYWludGVyIGludGVyZmFjZSBkZWZpbmVzIGV4YWN0bHkgb25lIG1ldGhvZCwKKyAqIDxjb2RlPnBhaW50PC9jb2RlPi4gSXQgaXMgdXNlZCBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBkZXZlbG9wZXIgY2FuIGNoYW5nZQorICogdGhlIHBhaW50aW5nIHJvdXRpbmUgb2YgYSBjb21wb25lbnQgd2l0aG91dCBoYXZpbmcgdG8gcmVzb3J0IHRvIHN1YmNsYXNzaW5nCisgKiB0aGUgY29tcG9uZW50LiBJdCBpcyBhbHNvIGdlbmVyaWNhbGx5IHVzZWZ1bCB3aGVuIGRvaW5nIGFueSBmb3JtIG9mIHBhaW50aW5nCisgKiBkZWxlZ2F0aW9uLjwvcD4KKyAqCisgKiA8cD48Y29kZT5QYWludGVyPC9jb2RlPnMgYXJlIHNpbXBseSBlbmNhcHN1bGF0aW9ucyBvZiBKYXZhMkQgY29kZSBhbmQgbWFrZQorICogaXQgZmFpcmx5IHRyaXZpYWwgdG8gcmV1c2UgZXhpc3RpbmcgPGNvZGU+UGFpbnRlcjwvY29kZT5zIG9yIHRvIGNvbWJpbmUKKyAqIHRoZW0gdG9nZXRoZXIuIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhcmUgYWxzbyB0cml2aWFsIHRvIHdyaXRlLAorICogc3VjaCB0aGF0IGlmIHlvdSBjYW4ndCBmaW5kIGEgPGNvZGU+UGFpbnRlcjwvY29kZT4gdGhhdCBkb2VzIHdoYXQgeW91IG5lZWQsCisgKiB5b3UgY2FuIHdyaXRlIG9uZSB3aXRoIG1pbmltYWwgZWZmb3J0LiBXcml0aW5nIGEgPGNvZGU+UGFpbnRlcjwvY29kZT4gcmVxdWlyZXMKKyAqIGtub3dsZWRnZSBvZiBKYXZhMkQuPC9wPgorICoKKyAqIDxwPkEgPGNvZGU+UGFpbnRlcjwvY29kZT4gbWF5IGJlIGNyZWF0ZWQgd2l0aCBhIHR5cGUgcGFyYW1ldGVyLiBUaGlzIHR5cGUgd2lsbCBiZQorICogZXhwZWN0ZWQgaW4gdGhlIDxjb2RlPnBhaW50PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLCB5b3UgbWF5IHdpc2ggdG8gd3JpdGUgYQorICogPGNvZGU+UGFpbnRlcjwvY29kZT4gdGhhdCBvbmx5IHdvcmtzIHdpdGggc3ViY2xhc3NlcyBvZiB7QGxpbmsgamF2YS5hd3QuQ29tcG9uZW50fS4KKyAqIEluIHRoYXQgY2FzZSwgd2hlbiB0aGUgPGNvZGU+UGFpbnRlcjwvY29kZT4gaXMgZGVjbGFyZWQsIHlvdSBtYXkgZGVjbGFyZSB0aGF0CisgKiBpdCByZXF1aXJlcyBhIDxjb2RlPkNvbXBvbmVudDwvY29kZT4sIGFsbG93aW5nIHRoZSBwYWludCBtZXRob2QgdG8gYmUgdHlwZSBzYWZlLiBFeDoKKyAqIDxwcmU+PGNvZGU+CisgKiAgICAgUGFpbnRlcjxDb21wb25lbnQ+IHAgPSBuZXcgUGFpbnRlcjxDb21wb25lbnQ+KCkgeworICogICAgICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljczJEIGcsIENvbXBvbmVudCBjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAqICAgICAgICAgICAgIGcuc2V0Q29sb3IoYy5nZXRCYWNrZ3JvdW5kKCkpOworICogICAgICAgICAgICAgLy9hbmQgc28gZm9ydGgKKyAqICAgICAgICAgfQorICogICAgIH0KKyAqIDwvY29kZT48L3ByZT48L3A+CisgKgorICogPHA+VGhpcyBpbnRlcmZhY2UgbWFrZXMgbm8gZ3VhcmFudGVlcyBvZiB0aHJlYWRzYWZldHkuPC9wPgorICoKKyAqIEBhdXRob3IgcmJhaXIKKyAqLworcHVibGljIGludGVyZmFjZSBQYWludGVyPFQ+IHsKKyAgICAvKioKKyAgICAgKiA8cD5SZW5kZXJzIHRvIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5hd3QuR3JhcGhpY3MyRH0gb2JqZWN0LiBJbXBsZW1lbnRhdGlvbnMKKyAgICAgKiBvZiB0aGlzIG1ldGhvZCA8ZW0+bWF5PC9lbT4gbW9kaWZ5IHN0YXRlIG9uIHRoZSA8Y29kZT5HcmFwaGljczJEPC9jb2RlPiwgYW5kIGFyZSBub3QKKyAgICAgKiByZXF1aXJlZCB0byByZXN0b3JlIHRoYXQgc3RhdGUgdXBvbiBjb21wbGV0aW9uLiBJbiBtb3N0IGNhc2VzLCBpdCBpcyByZWNvbW1lbmRlZAorICAgICAqIHRoYXQgdGhlIGNhbGxlciBwYXNzIGluIGEgc2NyYXRjaCBncmFwaGljcyBvYmplY3QuIFRoZSA8Y29kZT5HcmFwaGljczJEPC9jb2RlPgorICAgICAqIG11c3QgbmV2ZXIgYmUgbnVsbC48L3A+CisgICAgICoKKyAgICAgKiA8cD5TdGF0ZSBvbiB0aGUgZ3JhcGhpY3Mgb2JqZWN0IG1heSBiZSBob25vcmVkIGJ5IHRoZSA8Y29kZT5wYWludDwvY29kZT4gbWV0aG9kLAorICAgICAqIGJ1dCBtYXkgbm90IGJlLiBGb3IgaW5zdGFuY2UsIHNldHRpbmcgdGhlIGFudGlhbGlhc2luZyByZW5kZXJpbmcgaGludCBvbiB0aGUKKyAgICAgKiBncmFwaGljcyBtYXkgb3IgbWF5IG5vdCBiZSByZXNwZWN0ZWQgYnkgdGhlIDxjb2RlPlBhaW50ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzdXBwbGllZCBvYmplY3QgcGFyYW1ldGVyIGFjdHMgYXMgYW4gb3B0aW9uYWwgY29uZmlndXJhdGlvbiBhcmd1bWVudC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgaXQgY291bGQgYmUgb2YgdHlwZSA8Y29kZT5Db21wb25lbnQ8L2NvZGU+LiBBIDxjb2RlPlBhaW50ZXI8L2NvZGU+CisgICAgICogdGhhdCBleHBlY3RlZCBpdCBjb3VsZCB0aGVuIHJlYWQgc3RhdGUgZnJvbSB0aGF0IDxjb2RlPkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogdXNlIHRoZSBzdGF0ZSBmb3IgcGFpbnRpbmcuIEZvciBleGFtcGxlLCBhbiBpbXBsZW1lbnRhdGlvbiBtYXkgcmVhZCB0aGUKKyAgICAgKiBiYWNrZ3JvdW5kQ29sb3IgYW5kIHVzZSB0aGF0LjwvcD4KKyAgICAgKgorICAgICAqIDxwPkdlbmVyYWxseSwgdG8gZW5oYW5jZSByZXVzYWJpbGl0eSwgbW9zdCBzdGFuZGFyZCA8Y29kZT5QYWludGVyPC9jb2RlPnMgaWdub3JlCisgICAgICogdGhpcyBwYXJhbWV0ZXIuIFRoZXkgY2FuIHRodXMgYmUgcmV1c2VkIGluIGFueSBjb250ZXh0LiBUaGUgPGNvZGU+b2JqZWN0PC9jb2RlPgorICAgICAqIG1heSBiZSBudWxsLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3QgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0CisgICAgICogcGFyYW1ldGVyIGlzIG51bGwuPC9wPgorICAgICAqCisgICAgICogPHA+RmluYWxseSwgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiBhbmQgPGNvZGU+aGVpZ2h0PC9jb2RlPiBhcmd1bWVudHMgc3BlY2lmeSB0aGUKKyAgICAgKiB3aWR0aCBhbmQgaGVpZ2h0IHRoYXQgdGhlIDxjb2RlPlBhaW50ZXI8L2NvZGU+IHNob3VsZCBwYWludCBpbnRvLiBNb3JlCisgICAgICogc3BlY2lmaWNhbGx5LCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQgaW5zdHJ1Y3QgdGhlIHBhaW50ZXIgdGhhdCBpdCBzaG91bGQKKyAgICAgKiBwYWludCBmdWxseSB3aXRoaW4gdGhpcyB3aWR0aCBhbmQgaGVpZ2h0LiBBbnkgc3BlY2lmaWVkIGNsaXAgb24gdGhlCisgICAgICogPGNvZGU+ZzwvY29kZT4gcGFyYW0gd2lsbCBmdXJ0aGVyIGNvbnN0cmFpbiB0aGUgcmVnaW9uLjwvcD4KKyAgICAgKgorICAgICAqIDxwPkZvciBleGFtcGxlLCBzdXBwb3NlIEkgaGF2ZSBhIDxjb2RlPlBhaW50ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIHRoYXQgZHJhd3MKKyAgICAgKiBhIGdyYWRpZW50LiBUaGUgZ3JhZGllbnQgZ29lcyBmcm9tIHdoaXRlIHRvIGJsYWNrLiBJdCAic3RyZXRjaGVzIiB0byBmaWxsIHRoZQorICAgICAqIHBhaW50ZWQgcmVnaW9uLiBUaHVzLCBpZiBJIHVzZSB0aGlzIDxjb2RlPlBhaW50ZXI8L2NvZGU+IHRvIHBhaW50IGEgNTAwIHggNTAwCisgICAgICogcmVnaW9uLCB0aGUgZmFyIGxlZnQgd291bGQgYmUgYmxhY2ssIHRoZSBmYXIgcmlnaHQgd291bGQgYmUgd2hpdGUsIGFuZCBhIHNtb290aAorICAgICAqIGdyYWRpZW50IHdvdWxkIGJlIHBhaW50ZWQgYmV0d2Vlbi4gSSBjb3VsZCB0aGVuLCB3aXRob3V0IG1vZGlmaWNhdGlvbiwgcmV1c2UgdGhlCisgICAgICogPGNvZGU+UGFpbnRlcjwvY29kZT4gdG8gcGFpbnQgYSByZWdpb24gdGhhdCBpcyAyMHgyMCBpbiBzaXplLiBUaGlzIHJlZ2lvbiB3b3VsZAorICAgICAqIGFsc28gYmUgYmxhY2sgb24gdGhlIGxlZnQsIHdoaXRlIG9uIHRoZSByaWdodCwgYW5kIGEgc21vb3RoIGdyYWRpZW50IHBhaW50ZWQKKyAgICAgKiBiZXR3ZWVuLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnIFRoZSBHcmFwaGljczJEIHRvIHJlbmRlciB0by4gVGhpcyBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBvYmplY3QgYW4gb3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuIFRoaXMgbWF5IGJlIG51bGwuCisgICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50LgorICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzMkQgZywgVCBvYmplY3QsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvVUlNYW5hZ2VyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvVUlNYW5hZ2VyLmphdmEKaW5kZXggYmQ2ZjZhYy4uNDQzODhmZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL1VJTWFuYWdlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9VSU1hbmFnZXIuamF2YQpAQCAtMzgzLDYgKzM4Myw4IEBACiAgICAgICAgIEFycmF5TGlzdDxMb29rQW5kRmVlbEluZm8+IGlMQUZzID0gbmV3IEFycmF5TGlzdDxMb29rQW5kRmVlbEluZm8+KDQpOwogICAgICAgICBpTEFGcy5hZGQobmV3IExvb2tBbmRGZWVsSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAiTWV0YWwiLCAiamF2YXguc3dpbmcucGxhZi5tZXRhbC5NZXRhbExvb2tBbmRGZWVsIikpOworICAgICAgICBpTEFGcy5hZGQobmV3IExvb2tBbmRGZWVsSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAiTmltYnVzIiwgImphdmF4LnN3aW5nLnBsYWYubmltYnVzLk5pbWJ1c0xvb2tBbmRGZWVsIikpOwogICAgICAgICBpTEFGcy5hZGQobmV3IExvb2tBbmRGZWVsSW5mbygiQ0RFL01vdGlmIiwKICAgICAgICAgICAgICAgICAgICJjb20uc3VuLmphdmEuc3dpbmcucGxhZi5tb3RpZi5Nb3RpZkxvb2tBbmRGZWVsIikpOwogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvYm9yZGVyL1RpdGxlZEJvcmRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL2JvcmRlci9UaXRsZWRCb3JkZXIuamF2YQppbmRleCBlYjUwZTk1Li43NTQwYmRmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvYm9yZGVyL1RpdGxlZEJvcmRlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9ib3JkZXIvVGl0bGVkQm9yZGVyLmphdmEKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAqIEBwYXJhbSB0aXRsZSAgdGhlIHRpdGxlIHRoZSBib3JkZXIgc2hvdWxkIGRpc3BsYXkKICAgICAgKi8KICAgICBwdWJsaWMgVGl0bGVkQm9yZGVyKFN0cmluZyB0aXRsZSkgICAgIHsKLSAgICAgICAgdGhpcyhudWxsLCB0aXRsZSwgTEVBRElORywgVE9QLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGhpcyhudWxsLCB0aXRsZSwgTEVBRElORywgREVGQVVMVF9QT1NJVElPTiwgbnVsbCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgKiBAcGFyYW0gYm9yZGVyICB0aGUgYm9yZGVyCiAgICAgICovCiAgICAgcHVibGljIFRpdGxlZEJvcmRlcihCb3JkZXIgYm9yZGVyKSAgICAgICB7Ci0gICAgICAgIHRoaXMoYm9yZGVyLCAiIiwgTEVBRElORywgVE9QLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGhpcyhib3JkZXIsICIiLCBMRUFESU5HLCBERUZBVUxUX1BPU0lUSU9OLCBudWxsLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgICAqIEBwYXJhbSB0aXRsZSAgdGhlIHRpdGxlIHRoZSBib3JkZXIgc2hvdWxkIGRpc3BsYXkKICAgICAgKi8KICAgICBwdWJsaWMgVGl0bGVkQm9yZGVyKEJvcmRlciBib3JkZXIsIFN0cmluZyB0aXRsZSkgewotICAgICAgICB0aGlzKGJvcmRlciwgdGl0bGUsIExFQURJTkcsIFRPUCwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRoaXMoYm9yZGVyLCB0aXRsZSwgTEVBRElORywgREVGQVVMVF9QT1NJVElPTiwgbnVsbCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MDIsNyArNTAyLDMzIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdGl0bGUtcG9zaXRpb24gb2YgdGhlIHRpdGxlZCBib3JkZXIuCiAgICAgICovCi0gICAgcHVibGljIGludCBnZXRUaXRsZVBvc2l0aW9uKCkgICB7ICAgICAgIHJldHVybiB0aXRsZVBvc2l0aW9uOyAgIH0KKyAgICBwdWJsaWMgaW50IGdldFRpdGxlUG9zaXRpb24oKSB7CisgICAgICAgIGlmICh0aXRsZVBvc2l0aW9uID09IERFRkFVTFRfUE9TSVRJT04pIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IFVJTWFuYWdlci5nZXQoIlRpdGxlZEJvcmRlci5wb3NpdGlvbiIpOworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKXZhbHVlOworICAgICAgICAgICAgICAgIGlmICgiQUJPVkVfVE9QIi5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBQk9WRV9UT1A7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiVE9QIi5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUT1A7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiQkVMT1dfVE9QIi5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRUxPV19UT1A7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiQUJPVkVfQk9UVE9NIi5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBQk9WRV9CT1RUT007CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiQk9UVE9NIi5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCT1RUT007CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiQkVMT1dfQk9UVE9NIi5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRUxPV19CT1RUT007CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IChJbnRlZ2VyKXZhbHVlOworICAgICAgICAgICAgICAgIGlmIChpID49IDAgJiYgaSA8PSA2KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGl0bGVQb3NpdGlvbjsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB0aXRsZS1qdXN0aWZpY2F0aW9uIG9mIHRoZSB0aXRsZWQgYm9yZGVyLgpAQCAtNjEzLDcgKzYzOSw3IEBACiAgICAgICAgIEZvbnQgZm9udCA9IGdldEZvbnQoYyk7CiAgICAgICAgIEZvbnRNZXRyaWNzIGZtID0gYy5nZXRGb250TWV0cmljcyhmb250KTsKICAgICAgICAgSkNvbXBvbmVudCBqYyA9IChjIGluc3RhbmNlb2YgSkNvbXBvbmVudCkgPyAoSkNvbXBvbmVudCljIDogbnVsbDsKLSAgICAgICAgc3dpdGNoICh0aXRsZVBvc2l0aW9uKSB7CisgICAgICAgIHN3aXRjaCAoZ2V0VGl0bGVQb3NpdGlvbigpKSB7CiAgICAgICAgICAgY2FzZSBBQk9WRV9UT1A6CiAgICAgICAgICAgY2FzZSBCRUxPV19CT1RUT006CiAgICAgICAgICAgICAgIG1pblNpemUud2lkdGggPSBNYXRoLm1heChTd2luZ1V0aWxpdGllczIuc3RyaW5nV2lkdGgoamMsIGZtLApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNDb21ib0JveFVJLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY0NvbWJvQm94VUkuamF2YQppbmRleCBlZjA1ZDg3Li44MGI0NDljIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY0NvbWJvQm94VUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY0NvbWJvQm94VUkuamF2YQpAQCAtMjksNyArMjksNiBAQAogaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CiBpbXBvcnQgamF2YXguc3dpbmcuKjsKIGltcG9ydCBqYXZheC5hY2Nlc3NpYmlsaXR5Lio7Ci1pbXBvcnQgamF2YXguc3dpbmcuRm9jdXNNYW5hZ2VyOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuKjsKIGltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuKjsKIGltcG9ydCBqYXZheC5zd2luZy50ZXh0Lio7CkBAIC0xODcsNiArMTg2LDIzIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIHNhbWVCYXNlbGluZTsKIAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tYm8gYm94IGJ1dHRvbiBzaG91bGQgYmUgc3F1YXJlLgorICAgICAqIElmIHNxdWFyZSwgdGhlbiB0aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgZXF1YWwsIGFuZCBhcmUgYm90aCBzZXQgdG8KKyAgICAgKiB0aGUgaGVpZ2h0IG9mIHRoZSBjb21ibyAobWludXMgYXBwcm9wcmlhdGUgaW5zZXRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3F1YXJlQnV0dG9uID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsOiBpZiBzcGVjaWZpZWQsIHRoZXNlIGluc2V0cyBhY3QgYXMgcGFkZGluZyBhcm91bmQgdGhlIGNlbGwKKyAgICAgKiByZW5kZXJlciB3aGVuIGxheWluZyBvdXQgYW5kIHBhaW50aW5nIHRoZSAic2VsZWN0ZWQiIGl0ZW0gaW4gdGhlCisgICAgICogY29tYm8gYm94LiBCYXNpY0NvbWJvQm94VUkgdXNlcyBhIHNpbmdsZSBjb21ibyBib3ggcmVuZGVyZXIgZm9yIHJlbmRlcmluZworICAgICAqIGJvdGggdGhlIG1haW4gY29tYm8gYm94IGl0ZW0gYW5kIGFsc28gYWxsIHRoZSBpdGVtcyBpbiB0aGUgZHJvcGRvd24KKyAgICAgKiBmb3IgdGhlIGNvbWJvIGJveC4gcGFkZGluZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYWRkaXRpb24gaW5zZXRzIGluCisgICAgICogYWRkaXRpb24gdG8gdGhvc2Ugc3BlY2lmaWVkIGJ5IHRoZSBjZWxsIHJlbmRlcmVyLgorICAgICAqLworICAgIHByaXZhdGUgSW5zZXRzIHBhZGRpbmc7CisKICAgICAvLyBVc2VkIGZvciBjYWxjdWxhdGluZyB0aGUgZGVmYXVsdCBzaXplLgogICAgIHByaXZhdGUgc3RhdGljIExpc3RDZWxsUmVuZGVyZXIgZ2V0RGVmYXVsdExpc3RDZWxsUmVuZGVyZXIoKSB7CiAgICAgICAgIExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXIgPSAoTGlzdENlbGxSZW5kZXJlcilBcHBDb250ZXh0LgpAQCAtMjI2LDYgKzI0Miw3IEBACiAgICAgICAgIHJldHVybiBuZXcgQmFzaWNDb21ib0JveFVJKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaW5zdGFsbFVJKCBKQ29tcG9uZW50IGMgKSB7CiAgICAgICAgIGlzTWluaW11bVNpemVEaXJ0eSA9IHRydWU7CiAKQEAgLTI2NSw2ICsyODIsNyBAQAogICAgICAgICBjb21ib0JveC5zZXRLZXlTZWxlY3Rpb25NYW5hZ2VyKGtleVNlbGVjdGlvbk1hbmFnZXIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHVuaW5zdGFsbFVJKCBKQ29tcG9uZW50IGMgKSB7CiAgICAgICAgIHNldFBvcHVwVmlzaWJsZSggY29tYm9Cb3gsIGZhbHNlKTsKICAgICAgICAgcG9wdXAudW5pbnN0YWxsaW5nVUkoKTsKQEAgLTMxNyw3ICszMzUsMTMgQEAKICAgICAgICAgTG9va0FuZEZlZWwuaW5zdGFsbFByb3BlcnR5KCBjb21ib0JveCwgIm9wYXF1ZSIsIEJvb2xlYW4uVFJVRSk7CiAKICAgICAgICAgTG9uZyBsID0gKExvbmcpVUlNYW5hZ2VyLmdldCgiQ29tYm9Cb3gudGltZUZhY3RvciIpOwotICAgICAgICB0aW1lRmFjdG9yID0gKGwhPW51bGwpID8gbC5sb25nVmFsdWUoKSA6IDEwMDBMOworICAgICAgICB0aW1lRmFjdG9yID0gbCA9PSBudWxsID8gMTAwMEwgOiBsLmxvbmdWYWx1ZSgpOworCisgICAgICAgIC8vTk9URTogdGhpcyBuZWVkcyB0byBkZWZhdWx0IHRvIHRydWUgaWYgbm90IHNwZWNpZmllZAorICAgICAgICBCb29sZWFuIGIgPSAoQm9vbGVhbilVSU1hbmFnZXIuZ2V0KCJDb21ib0JveC5zcXVhcmVCdXR0b24iKTsKKyAgICAgICAgc3F1YXJlQnV0dG9uID0gYiA9PSBudWxsID8gdHJ1ZSA6IGI7CisKKyAgICAgICAgcGFkZGluZyA9IFVJTWFuYWdlci5nZXRJbnNldHMoIkNvbWJvQm94LnBhZGRpbmciKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUzMCw2ICs1NTQsNyBAQAogICAgICAqIDxjb2RlPkJhc2ljQ29tYm9Cb3hVSTwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIGNsYXNzIEtleUhhbmRsZXIgZXh0ZW5kcyBLZXlBZGFwdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoIEtleUV2ZW50IGUgKSB7CiAgICAgICAgICAgICBnZXRIYW5kbGVyKCkua2V5UHJlc3NlZChlKTsKICAgICAgICAgfQpAQCAtNzYxLDYgKzc4Niw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb21ib0JveC5jb25maWd1cmVFZGl0b3IoY29tYm9Cb3guZ2V0RWRpdG9yKCksY29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCkpOworCisgICAgICAgIGVkaXRvci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzc0LDYgKzgwMSw3IEBACiAgICAgICAgICAgICBlZGl0b3IucmVtb3ZlRm9jdXNMaXN0ZW5lcihmb2N1c0xpc3RlbmVyKTsKICAgICAgICAgfQogCisgICAgICAgIGVkaXRvci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwogICAgICAgICBlZGl0b3IucmVtb3ZlRm9jdXNMaXN0ZW5lcihnZXRIYW5kbGVyKCkpOwogICAgICAgICBjb21ib0JveC5nZXRFZGl0b3IoKS5yZW1vdmVBY3Rpb25MaXN0ZW5lcihnZXRIYW5kbGVyKCkpOwogICAgIH0KQEAgLTg2OCw3ICs4OTYsNyBAQAogCiAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAvLyBiZWdpbiBDb21wb25lbnRVSSBJbXBsZW1lbnRhdGlvbgotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcGFpbnQoIEdyYXBoaWNzIGcsIEpDb21wb25lbnQgYyApIHsKICAgICAgICAgaGFzRm9jdXMgPSBjb21ib0JveC5oYXNGb2N1cygpOwogICAgICAgICBpZiAoICFjb21ib0JveC5pc0VkaXRhYmxlKCkgKSB7CkBAIC04NzgsNiArOTA2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZSggSkNvbXBvbmVudCBjICkgewogICAgICAgICByZXR1cm4gZ2V0TWluaW11bVNpemUoYyk7CiAgICAgfQpAQCAtODg1LDE1ICs5MTQsMTkgQEAKICAgICAvKioKICAgICAgKiBUaGUgbWludW11bSBzaXplIGlzIHRoZSBzaXplIG9mIHRoZSBkaXNwbGF5IGFyZWEgcGx1cyBpbnNldHMgcGx1cyB0aGUgYnV0dG9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoIEpDb21wb25lbnQgYyApIHsKICAgICAgICAgaWYgKCAhaXNNaW5pbXVtU2l6ZURpcnR5ICkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24oY2FjaGVkTWluaW11bVNpemUpOwogICAgICAgICB9CiAgICAgICAgIERpbWVuc2lvbiBzaXplID0gZ2V0RGlzcGxheVNpemUoKTsKICAgICAgICAgSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOworICAgICAgICAvL2NhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYnV0dG9uCisgICAgICAgIGludCBidXR0b25IZWlnaHQgPSBzaXplLmhlaWdodDsKKyAgICAgICAgaW50IGJ1dHRvbldpZHRoID0gc3F1YXJlQnV0dG9uID8gYnV0dG9uSGVpZ2h0IDogYXJyb3dCdXR0b24uZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOworICAgICAgICAvL2FkanVzdCB0aGUgc2l6ZSBiYXNlZCBvbiB0aGUgYnV0dG9uIHdpZHRoCiAgICAgICAgIHNpemUuaGVpZ2h0ICs9IGluc2V0cy50b3AgKyBpbnNldHMuYm90dG9tOwotICAgICAgICBpbnQgYnV0dG9uU2l6ZSA9IHNpemUuaGVpZ2h0IC0gKGluc2V0cy50b3AgKyBpbnNldHMuYm90dG9tKTsKLSAgICAgICAgc2l6ZS53aWR0aCArPSAgaW5zZXRzLmxlZnQgKyBpbnNldHMucmlnaHQgKyBidXR0b25TaXplOworICAgICAgICBzaXplLndpZHRoICs9ICBpbnNldHMubGVmdCArIGluc2V0cy5yaWdodCArIGJ1dHRvbldpZHRoOwogCiAgICAgICAgIGNhY2hlZE1pbmltdW1TaXplLnNldFNpemUoIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0ICk7CiAgICAgICAgIGlzTWluaW11bVNpemVEaXJ0eSA9IGZhbHNlOwpAQCAtOTAxLDYgKzkzNCw3IEBACiAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKHNpemUpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0TWF4aW11bVNpemUoIEpDb21wb25lbnQgYyApIHsKICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24oU2hvcnQuTUFYX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUpOwogICAgIH0KQEAgLTkxMyw2ICs5NDcsNyBAQAogICAgICAqIEBzZWUgamF2YXguc3dpbmcuSkNvbXBvbmVudCNnZXRCYXNlbGluZShpbnQsIGludCkKICAgICAgKiBAc2luY2UgMS42CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRCYXNlbGluZShKQ29tcG9uZW50IGMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBzdXBlci5nZXRCYXNlbGluZShjLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgaW50IGJhc2VsaW5lID0gLTE7CkBAIC05NjcsNiArMTAwMiw3IEBACiAgICAgICogQHNlZSBqYXZheC5zd2luZy5KQ29tcG9uZW50I2dldEJhc2VsaW5lKGludCwgaW50KQogICAgICAqIEBzaW5jZSAxLjYKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29tcG9uZW50LkJhc2VsaW5lUmVzaXplQmVoYXZpb3IgZ2V0QmFzZWxpbmVSZXNpemVCZWhhdmlvcigKICAgICAgICAgICAgIEpDb21wb25lbnQgYykgewogICAgICAgICBzdXBlci5nZXRCYXNlbGluZVJlc2l6ZUJlaGF2aW9yKGMpOwpAQCAtMTAwMSw2ICsxMDM3LDcgQEAKICAgICB9CiAKICAgICAvLyBUaGlzIGlzIGN1cnJlbnRseSBoYWNreS4uLgorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUNoaWxkcmVuQ291bnQoSkNvbXBvbmVudCBjKSB7CiAgICAgICAgIGlmICggY29tYm9Cb3guaXNFZGl0YWJsZSgpICkgewogICAgICAgICAgICAgcmV0dXJuIDI7CkBAIC0xMDExLDYgKzEwNDgsNyBAQAogICAgIH0KIAogICAgIC8vIFRoaXMgaXMgY3VycmVudGx5IGhhY2t5Li4uCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZUNoaWxkKEpDb21wb25lbnQgYywgaW50IGkpIHsKICAgICAgICAgLy8gMCA9IHRoZSBwb3B1cAogICAgICAgICAvLyAxID0gdGhlIGVkaXRvcgpAQCAtMTIwNCw4ICsxMjQyLDE1IEBACiAgICAgICAgICAgICBzaG91bGRWYWxpZGF0ZSA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBjdXJyZW50VmFsdWVQYW5lLnBhaW50Q29tcG9uZW50KGcsYyxjb21ib0JveCxib3VuZHMueCxib3VuZHMueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMud2lkdGgsYm91bmRzLmhlaWdodCwgc2hvdWxkVmFsaWRhdGUpOworICAgICAgICBpbnQgeCA9IGJvdW5kcy54LCB5ID0gYm91bmRzLnksIHcgPSBib3VuZHMud2lkdGgsIGggPSBib3VuZHMuaGVpZ2h0OworICAgICAgICBpZiAocGFkZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICB4ID0gYm91bmRzLnggKyBwYWRkaW5nLmxlZnQ7CisgICAgICAgICAgICB5ID0gYm91bmRzLnkgKyBwYWRkaW5nLnRvcDsKKyAgICAgICAgICAgIHcgPSBib3VuZHMud2lkdGggLSAocGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodCk7CisgICAgICAgICAgICBoID0gYm91bmRzLmhlaWdodCAtIChwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tKTsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRWYWx1ZVBhbmUucGFpbnRDb21wb25lbnQoZyxjLGNvbWJvQm94LHgseSx3LGgsc2hvdWxkVmFsaWRhdGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMzMyw2ICsxMzc4LDEyIEBACiAgICAgICAgICAgICByZXN1bHQuaGVpZ2h0ID0gTWF0aC5tYXgocmVzdWx0LmhlaWdodCxkLmhlaWdodCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBjYWxjdWxhdGUgaW4gdGhlIHBhZGRpbmcKKyAgICAgICAgaWYgKHBhZGRpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0LndpZHRoICs9IHBhZGRpbmcubGVmdCArIHBhZGRpbmcucmlnaHQ7CisgICAgICAgICAgICByZXN1bHQuaGVpZ2h0ICs9IHBhZGRpbmcudG9wICsgcGFkZGluZy5ib3R0b207CisgICAgICAgIH0KKwogICAgICAgICAvLyBTZXQgdGhlIGNhY2hlZCB2YWx1ZQogICAgICAgICBjYWNoZWREaXNwbGF5U2l6ZS5zZXRTaXplKHJlc3VsdC53aWR0aCwgcmVzdWx0LmhlaWdodCk7CiAgICAgICAgIGlzRGlzcGxheVNpemVEaXJ0eSA9IGZhbHNlOwpAQCAtMTU5MSw5MSArMTY0Miw5OSBAQAogICAgICAgICAvLwogICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBlLmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICAgICAgSkNvbWJvQm94IGNvbWJvQm94ID0gKEpDb21ib0JveCllLmdldFNvdXJjZSgpOwotCi0gICAgICAgICAgICBpZiAoIHByb3BlcnR5TmFtZSA9PSAibW9kZWwiICkgewotICAgICAgICAgICAgICAgIENvbWJvQm94TW9kZWwgbmV3TW9kZWwgPSAoQ29tYm9Cb3hNb2RlbCllLmdldE5ld1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgQ29tYm9Cb3hNb2RlbCBvbGRNb2RlbCA9IChDb21ib0JveE1vZGVsKWUuZ2V0T2xkVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmICggb2xkTW9kZWwgIT0gbnVsbCAmJiBsaXN0RGF0YUxpc3RlbmVyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIoIGxpc3REYXRhTGlzdGVuZXIgKTsKKyAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGVkaXRvcil7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJvcmRlciBvZiB0aGUgZWRpdG9yIGNoYW5nZXMgdGhlbiB0aGlzIGNhbiBlZmZlY3QKKyAgICAgICAgICAgICAgICAvLyB0aGUgc2l6ZSBvZiB0aGUgZWRpdG9yIHdoaWNoIGNhbiBjYXVzZSB0aGUgY29tYm8ncyBzaXplIHRvCisgICAgICAgICAgICAgICAgLy8gYmVjb21lIGludmFsaWQgc28gd2UgbmVlZCB0byBjbGVhciBzaXplIGNhY2hlcworICAgICAgICAgICAgICAgIGlmICgiYm9yZGVyIi5lcXVhbHMocHJvcGVydHlOYW1lKSl7CisgICAgICAgICAgICAgICAgICAgIGlzTWluaW11bVNpemVEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlzRGlzcGxheVNpemVEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNvbWJvQm94LnJldmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEpDb21ib0JveCBjb21ib0JveCA9IChKQ29tYm9Cb3gpZS5nZXRTb3VyY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoIHByb3BlcnR5TmFtZSA9PSAibW9kZWwiICkgeworICAgICAgICAgICAgICAgICAgICBDb21ib0JveE1vZGVsIG5ld01vZGVsID0gKENvbWJvQm94TW9kZWwpZS5nZXROZXdWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBDb21ib0JveE1vZGVsIG9sZE1vZGVsID0gKENvbWJvQm94TW9kZWwpZS5nZXRPbGRWYWx1ZSgpOwogCi0gICAgICAgICAgICAgICAgaWYgKCBuZXdNb2RlbCAhPSBudWxsICYmIGxpc3REYXRhTGlzdGVuZXIgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3TW9kZWwuYWRkTGlzdERhdGFMaXN0ZW5lciggbGlzdERhdGFMaXN0ZW5lciApOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBvbGRNb2RlbCAhPSBudWxsICYmIGxpc3REYXRhTGlzdGVuZXIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIoIGxpc3REYXRhTGlzdGVuZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKCBlZGl0b3IgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3guY29uZmlndXJlRWRpdG9yKCBjb21ib0JveC5nZXRFZGl0b3IoKSwgY29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBuZXdNb2RlbCAhPSBudWxsICYmIGxpc3REYXRhTGlzdGVuZXIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIoIGxpc3REYXRhTGlzdGVuZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggZWRpdG9yICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21ib0JveC5jb25maWd1cmVFZGl0b3IoIGNvbWJvQm94LmdldEVkaXRvcigpLCBjb21ib0JveC5nZXRTZWxlY3RlZEl0ZW0oKSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlzTWluaW11bVNpemVEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlzRGlzcGxheVNpemVEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNvbWJvQm94LnJldmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3gucmVwYWludCgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpc01pbmltdW1TaXplRGlydHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlzRGlzcGxheVNpemVEaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY29tYm9Cb3gucmV2YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIGNvbWJvQm94LnJlcGFpbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBwcm9wZXJ0eU5hbWUgPT0gImVkaXRvciIgJiYgY29tYm9Cb3guaXNFZGl0YWJsZSgpICkgewotICAgICAgICAgICAgICAgIGFkZEVkaXRvcigpOwotICAgICAgICAgICAgICAgIGNvbWJvQm94LnJldmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBwcm9wZXJ0eU5hbWUgPT0gImVkaXRhYmxlIiApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGNvbWJvQm94LmlzRWRpdGFibGUoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3guc2V0UmVxdWVzdEZvY3VzRW5hYmxlZCggZmFsc2UgKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggcHJvcGVydHlOYW1lID09ICJlZGl0b3IiICYmIGNvbWJvQm94LmlzRWRpdGFibGUoKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWRkRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3guc2V0UmVxdWVzdEZvY3VzRW5hYmxlZCggdHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICByZW1vdmVFZGl0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3gucmV2YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVwZGF0ZVRvb2xUaXBUZXh0Rm9yQ2hpbGRyZW4oKTsKLQotICAgICAgICAgICAgICAgIGNvbWJvQm94LnJldmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBwcm9wZXJ0eU5hbWUgPT0gImVuYWJsZWQiICkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IGNvbWJvQm94LmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIGlmICggZWRpdG9yICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoIGFycm93QnV0dG9uICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICBhcnJvd0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAgICAgICAgIGNvbWJvQm94LnJlcGFpbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBwcm9wZXJ0eU5hbWUgPT0gImZvY3VzYWJsZSIgKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb2N1c2FibGUgPSBjb21ib0JveC5pc0ZvY3VzYWJsZSgpOwotICAgICAgICAgICAgICAgIGlmICggZWRpdG9yICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0Rm9jdXNhYmxlKGZvY3VzYWJsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCBhcnJvd0J1dHRvbiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgYXJyb3dCdXR0b24uc2V0Rm9jdXNhYmxlKGZvY3VzYWJsZSk7Ci0gICAgICAgICAgICAgICAgY29tYm9Cb3gucmVwYWludCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIHByb3BlcnR5TmFtZSA9PSAibWF4aW11bVJvd0NvdW50IiApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGlzUG9wdXBWaXNpYmxlKCBjb21ib0JveCApICkgewotICAgICAgICAgICAgICAgICAgICBzZXRQb3B1cFZpc2libGUoY29tYm9Cb3gsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UG9wdXBWaXNpYmxlKGNvbWJvQm94LCB0cnVlKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggcHJvcGVydHlOYW1lID09ICJlZGl0YWJsZSIgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggY29tYm9Cb3guaXNFZGl0YWJsZSgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3guc2V0UmVxdWVzdEZvY3VzRW5hYmxlZCggZmFsc2UgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVkaXRvcigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3guc2V0UmVxdWVzdEZvY3VzRW5hYmxlZCggdHJ1ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRWRpdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVG9vbFRpcFRleHRGb3JDaGlsZHJlbigpOworICAgICAgICAgICAgICAgICAgICBjb21ib0JveC5yZXZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIHByb3BlcnR5TmFtZSA9PSAiZm9udCIgKSB7Ci0gICAgICAgICAgICAgICAgbGlzdEJveC5zZXRGb250KCBjb21ib0JveC5nZXRGb250KCkgKTsKLSAgICAgICAgICAgICAgICBpZiAoIGVkaXRvciAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0Rm9udCggY29tYm9Cb3guZ2V0Rm9udCgpICk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHByb3BlcnR5TmFtZSA9PSAiZW5hYmxlZCIgKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IGNvbWJvQm94LmlzRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIGVkaXRvciAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIGFycm93QnV0dG9uICE9IG51bGwgKQorICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3gucmVwYWludCgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpc01pbmltdW1TaXplRGlydHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGNvbWJvQm94LnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggcHJvcGVydHlOYW1lID09IEpDb21wb25lbnQuVE9PTF9USVBfVEVYVF9LRVkgKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVG9vbFRpcFRleHRGb3JDaGlsZHJlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIHByb3BlcnR5TmFtZSA9PSBCYXNpY0NvbWJvQm94VUkuSVNfVEFCTEVfQ0VMTF9FRElUT1IgKSB7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBpblRhYmxlID0gKEJvb2xlYW4pZS5nZXROZXdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlzVGFibGVDZWxsRWRpdG9yID0gaW5UYWJsZS5lcXVhbHMoQm9vbGVhbi5UUlVFKSA/IHRydWUgOiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZSA9PSAicHJvdG90eXBlRGlzcGxheVZhbHVlIikgewotICAgICAgICAgICAgICAgIGlzTWluaW11bVNpemVEaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaXNEaXNwbGF5U2l6ZURpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjb21ib0JveC5yZXZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUgPT0gInJlbmRlcmVyIikgewotICAgICAgICAgICAgICAgIGlzTWluaW11bVNpemVEaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaXNEaXNwbGF5U2l6ZURpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjb21ib0JveC5yZXZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHByb3BlcnR5TmFtZSA9PSAiZm9jdXNhYmxlIiApIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb2N1c2FibGUgPSBjb21ib0JveC5pc0ZvY3VzYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIGVkaXRvciAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZXRGb2N1c2FibGUoZm9jdXNhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBhcnJvd0J1dHRvbiAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycm93QnV0dG9uLnNldEZvY3VzYWJsZShmb2N1c2FibGUpOworICAgICAgICAgICAgICAgICAgICBjb21ib0JveC5yZXBhaW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwcm9wZXJ0eU5hbWUgPT0gIm1heGltdW1Sb3dDb3VudCIgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaXNQb3B1cFZpc2libGUoIGNvbWJvQm94ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQb3B1cFZpc2libGUoY29tYm9Cb3gsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBvcHVwVmlzaWJsZShjb21ib0JveCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHByb3BlcnR5TmFtZSA9PSAiZm9udCIgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RCb3guc2V0Rm9udCggY29tYm9Cb3guZ2V0Rm9udCgpICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggZWRpdG9yICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0Rm9udCggY29tYm9Cb3guZ2V0Rm9udCgpICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXNNaW5pbXVtU2l6ZURpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3gudmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHByb3BlcnR5TmFtZSA9PSBKQ29tcG9uZW50LlRPT0xfVElQX1RFWFRfS0VZICkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVUb29sVGlwVGV4dEZvckNoaWxkcmVuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwcm9wZXJ0eU5hbWUgPT0gQmFzaWNDb21ib0JveFVJLklTX1RBQkxFX0NFTExfRURJVE9SICkgeworICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGluVGFibGUgPSAoQm9vbGVhbillLmdldE5ld1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGlzVGFibGVDZWxsRWRpdG9yID0gaW5UYWJsZS5lcXVhbHMoQm9vbGVhbi5UUlVFKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lID09ICJwcm90b3R5cGVEaXNwbGF5VmFsdWUiKSB7CisgICAgICAgICAgICAgICAgICAgIGlzTWluaW11bVNpemVEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlzRGlzcGxheVNpemVEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNvbWJvQm94LnJldmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lID09ICJyZW5kZXJlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNNaW5pbXVtU2l6ZURpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaXNEaXNwbGF5U2l6ZURpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3gucmV2YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xODA5LDE4ICsxODY4LDIzIEBACiAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gY2IuZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgICAgIEluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLSAgICAgICAgICAgIGludCBidXR0b25TaXplID0gaGVpZ2h0IC0gKGluc2V0cy50b3AgKyBpbnNldHMuYm90dG9tKTsKKyAgICAgICAgICAgIGludCBidXR0b25IZWlnaHQgPSBoZWlnaHQgLSAoaW5zZXRzLnRvcCArIGluc2V0cy5ib3R0b20pOworICAgICAgICAgICAgaW50IGJ1dHRvbldpZHRoID0gYnV0dG9uSGVpZ2h0OworICAgICAgICAgICAgaWYgKGFycm93QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbnNldHMgYXJyb3dJbnNldHMgPSBhcnJvd0J1dHRvbi5nZXRJbnNldHMoKTsKKyAgICAgICAgICAgICAgICBidXR0b25XaWR0aCA9IHNxdWFyZUJ1dHRvbiA/CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkhlaWdodCA6CisgICAgICAgICAgICAgICAgICAgIGFycm93QnV0dG9uLmdldFByZWZlcnJlZFNpemUoKS53aWR0aCArIGFycm93SW5zZXRzLmxlZnQgKyBhcnJvd0luc2V0cy5yaWdodDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFJlY3RhbmdsZSBjdmI7CiAKLSAgICAgICAgICAgIGlmICggYXJyb3dCdXR0b24gIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBpZihCYXNpY0dyYXBoaWNzVXRpbHMuaXNMZWZ0VG9SaWdodChjYikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyb3dCdXR0b24uc2V0Qm91bmRzKCB3aWR0aCAtIChpbnNldHMucmlnaHQgKyBidXR0b25TaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNldHMudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblNpemUsIGJ1dHRvblNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyb3dCdXR0b24uc2V0Qm91bmRzKCBpbnNldHMubGVmdCwgaW5zZXRzLnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TaXplLCBidXR0b25TaXplKTsKKyAgICAgICAgICAgIGlmIChhcnJvd0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKEJhc2ljR3JhcGhpY3NVdGlscy5pc0xlZnRUb1JpZ2h0KGNiKSkgeworICAgICAgICAgICAgICAgICAgICBhcnJvd0J1dHRvbi5zZXRCb3VuZHMod2lkdGggLSAoaW5zZXRzLnJpZ2h0ICsgYnV0dG9uV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2V0cy50b3AsIGJ1dHRvbldpZHRoLCBidXR0b25IZWlnaHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFycm93QnV0dG9uLnNldEJvdW5kcyhpbnNldHMubGVmdCwgaW5zZXRzLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25XaWR0aCwgYnV0dG9uSGVpZ2h0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIGVkaXRvciAhPSBudWxsICkgewpAQCAtMTgyOSw3ICsxODkzLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0KICAgICAgICAgLy8KICAgICAgICAgLy8gQWN0aW9uTGlzdGVuZXIKICAgICAgICAgLy8KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljTGlzdFVJLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY0xpc3RVSS5qYXZhCmluZGV4IGE3ZWM4ODguLjc3MDRkMTAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljTGlzdFVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNMaXN0VUkuamF2YQpAQCAtNDgwLDYgKzQ4MCwxMiBAQAogICAgICAgICBpZiAocmVuZGVyZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgTGlzdENlbGxSZW5kZXJlciBsY3IgPSAoTGlzdENlbGxSZW5kZXJlcilVSU1hbmFnZXIuZ2V0KAogICAgICAgICAgICAgICAgICAgICAiTGlzdC5jZWxsUmVuZGVyZXIiKTsKKworICAgICAgICAgICAgLy8gZml4IGZvciA2NzExMDcyIHNvbWUgTEFGcyBsaWtlIE5pbWJ1cyBkbyBub3QgcHJvdmlkZSB0aGlzCisgICAgICAgICAgICAvLyBVSU1hbmFnZXIga2V5IGFuZCB3ZSBzaG91bGQgbm90IHRocm91Z2ggYSBOUEUgaGVyZSBiZWNhdXNlIG9mIGl0CisgICAgICAgICAgICBpZiAobGNyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsY3IgPSBuZXcgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlbmRlcmVyID0gbGNyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoCiAgICAgICAgICAgICAgICAgICAgIGxpc3QsICJhIiwgLTEsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICBsYWZEZWZhdWx0cy5wdXQoQkFTRUxJTkVfQ09NUE9ORU5UX0tFWSwgcmVuZGVyZXIpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNNZW51SXRlbVVJLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY01lbnVJdGVtVUkuamF2YQppbmRleCBhNThjYzQ2Li42MWM3MGM5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY01lbnVJdGVtVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY01lbnVJdGVtVUkuamF2YQpAQCAtMTExLDYgKzExMSwxMSBAQAogICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0UHJvcGVydHlQcmVmaXgoKTsKIAogICAgICAgICBhY2NlbGVyYXRvckZvbnQgPSBVSU1hbmFnZXIuZ2V0Rm9udCgiTWVudUl0ZW0uYWNjZWxlcmF0b3JGb250Iik7CisgICAgICAgIC8vIHVzZSBkZWZhdWx0IGlmIG1pc3Npbmcgc28gdGhhdCBCYXNpY01lbnVJdGVtVUkgY2FuIGJlIHVzZWQgaW4gb3RoZXIKKyAgICAgICAgLy8gTEFGcyBsaWtlIE5pbWJ1cworICAgICAgICBpZiAoYWNjZWxlcmF0b3JGb250ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFjY2VsZXJhdG9yRm9udCA9IFVJTWFuYWdlci5nZXRGb250KCJNZW51SXRlbS5mb250Iik7CisgICAgICAgIH0KIAogICAgICAgICBPYmplY3Qgb3BhcXVlID0gVUlNYW5hZ2VyLmdldChnZXRQcm9wZXJ0eVByZWZpeCgpICsgIi5vcGFxdWUiKTsKICAgICAgICAgaWYgKG9wYXF1ZSAhPSBudWxsKSB7CkBAIC0xMzAsNyArMTM1LDcgQEAKICAgICAgICAgTG9va0FuZEZlZWwuaW5zdGFsbEJvcmRlcihtZW51SXRlbSwgcHJlZml4ICsgIi5ib3JkZXIiKTsKICAgICAgICAgb2xkQm9yZGVyUGFpbnRlZCA9IG1lbnVJdGVtLmlzQm9yZGVyUGFpbnRlZCgpOwogICAgICAgICBMb29rQW5kRmVlbC5pbnN0YWxsUHJvcGVydHkobWVudUl0ZW0sICJib3JkZXJQYWludGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTWFuYWdlci5nZXQocHJlZml4ICsgIi5ib3JkZXJQYWludGVkIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlNYW5hZ2VyLmdldEJvb2xlYW4ocHJlZml4ICsgIi5ib3JkZXJQYWludGVkIikpOwogICAgICAgICBMb29rQW5kRmVlbC5pbnN0YWxsQ29sb3JzQW5kRm9udChtZW51SXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgIi5iYWNrZ3JvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgIi5mb3JlZ3JvdW5kIiwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljUHJvZ3Jlc3NCYXJVSS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNQcm9ncmVzc0JhclVJLmphdmEKaW5kZXggZTc0MzYwMi4uMGQzMWRjMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNQcm9ncmVzc0JhclVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNQcm9ncmVzc0JhclVJLmphdmEKQEAgLTE1OCw2ICsxNTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3Jlc3NCYXIuZm9yZWdyb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ncmVzc0Jhci5mb250Iik7CiAgICAgICAgIGNlbGxMZW5ndGggPSBVSU1hbmFnZXIuZ2V0SW50KCJQcm9ncmVzc0Jhci5jZWxsTGVuZ3RoIik7CisgICAgICAgIGlmIChjZWxsTGVuZ3RoID09IDApIGNlbGxMZW5ndGggPSAxOwogICAgICAgICBjZWxsU3BhY2luZyA9IFVJTWFuYWdlci5nZXRJbnQoIlByb2dyZXNzQmFyLmNlbGxTcGFjaW5nIik7CiAgICAgICAgIHNlbGVjdGlvbkZvcmVncm91bmQgPSBVSU1hbmFnZXIuZ2V0Q29sb3IoIlByb2dyZXNzQmFyLnNlbGVjdGlvbkZvcmVncm91bmQiKTsKICAgICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZCA9IFVJTWFuYWdlci5nZXRDb2xvcigiUHJvZ3Jlc3NCYXIuc2VsZWN0aW9uQmFja2dyb3VuZCIpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNTY3JvbGxCYXJVSS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNTY3JvbGxCYXJVSS5qYXZhCmluZGV4IDdkYjFlMTEuLmIyMmE1ODcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljU2Nyb2xsQmFyVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1Njcm9sbEJhclVJLmphdmEKQEAgLTExMiw2ICsxMTIsMjQgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGludCBzY3JvbGxCYXJWYWx1ZTsKIAorICAgIC8qKgorICAgICAqIERpc3RhbmNlIGJldHdlZW4gdGhlIGluY3JlbWVudCBidXR0b24gYW5kIHRoZSB0cmFjay4gVGhpcyBtYXkgYmUgYSBuZWdhdGl2ZQorICAgICAqIG51bWJlci4gSWYgbmVnYXRpdmUsIHRoZW4gYW4gb3ZlcmxhcCBiZXR3ZWVuIHRoZSBidXR0b24gYW5kIHRyYWNrIHdpbGwgb2NjdXIsCisgICAgICogd2hpY2ggaXMgdXNlZnVsIGZvciBzaGFwZWQgYnV0dG9ucy4KKyAgICAgKgorICAgICAqIFRPRE8gVGhpcyBzaG91bGQgYmUgbWFkZSBwcm90ZWN0ZWQgaW4gYSBmZWF0dXJlIHJlbGVhc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBpbmNyR2FwOworCisgICAgLyoqCisgICAgICogRGlzdGFuY2UgYmV0d2VlbiB0aGUgZGVjcmVtZW50IGJ1dHRvbiBhbmQgdGhlIHRyYWNrLiBUaGlzIG1heSBiZSBhIG5lZ2F0aXZlCisgICAgICogbnVtYmVyLiBJZiBuZWdhdGl2ZSwgdGhlbiBhbiBvdmVybGFwIGJldHdlZW4gdGhlIGJ1dHRvbiBhbmQgdHJhY2sgd2lsbCBvY2N1ciwKKyAgICAgKiB3aGljaCBpcyB1c2VmdWwgZm9yIHNoYXBlZCBidXR0b25zLgorICAgICAqCisgICAgICogVE9ETyBUaGlzIHNob3VsZCBiZSBtYWRlIHByb3RlY3RlZCBpbiBhIGZlYXR1cmUgcmVsZWFzZQorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlY3JHYXA7CisKICAgICBzdGF0aWMgdm9pZCBsb2FkQWN0aW9uTWFwKExhenlBY3Rpb25NYXAgbWFwKSB7CiAgICAgICAgIG1hcC5wdXQobmV3IEFjdGlvbnMoQWN0aW9ucy5QT1NJVElWRV9VTklUX0lOQ1JFTUVOVCkpOwogICAgICAgICBtYXAucHV0KG5ldyBBY3Rpb25zKEFjdGlvbnMuUE9TSVRJVkVfQkxPQ0tfSU5DUkVNRU5UKSk7CkBAIC0xODYsNiArMjA0LDMxIEBACiAgICAgICAgIExvb2tBbmRGZWVsLmluc3RhbGxQcm9wZXJ0eShzY3JvbGxiYXIsICJvcGFxdWUiLCBCb29sZWFuLlRSVUUpOwogCiAgICAgICAgIHNjcm9sbEJhclZhbHVlID0gc2Nyb2xsYmFyLmdldFZhbHVlKCk7CisKKyAgICAgICAgaW5jckdhcCA9IFVJTWFuYWdlci5nZXRJbnQoIlNjcm9sbEJhci5pbmNyZW1lbnRCdXR0b25HYXAiKTsKKyAgICAgICAgZGVjckdhcCA9IFVJTWFuYWdlci5nZXRJbnQoIlNjcm9sbEJhci5kZWNyZW1lbnRCdXR0b25HYXAiKTsKKworICAgICAgICAvLyBUT0RPIHRoaXMgY2FuIGJlIHJlbW92ZWQgd2hlbiBpbmNyR2FwL2RlY3JHYXAgYmVjb21lIHByb3RlY3RlZAorICAgICAgICAvLyBoYW5kbGUgc2NhbGluZyBmb3Igc2l6ZVZhcmllbnRzIGZvciBzcGVjaWFsIGNhc2UgY29tcG9uZW50cy4gVGhlCisgICAgICAgIC8vIGtleSAiSkNvbXBvbmVudC5zaXplVmFyaWFudCIgc2NhbGVzIGZvciBsYXJnZS9zbWFsbC9taW5pCisgICAgICAgIC8vIGNvbXBvbmVudHMgYXJlIGJhc2VkIG9uIEFwcGxlcyBMQUYKKyAgICAgICAgU3RyaW5nIHNjYWxlS2V5ID0gKFN0cmluZylzY3JvbGxiYXIuZ2V0Q2xpZW50UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiKTsKKyAgICAgICAgaWYgKHNjYWxlS2V5ICE9IG51bGwpeworICAgICAgICAgICAgaWYgKCJsYXJnZSIuZXF1YWxzKHNjYWxlS2V5KSl7CisgICAgICAgICAgICAgICAgc2Nyb2xsQmFyV2lkdGggKj0gMS4xNTsKKyAgICAgICAgICAgICAgICBpbmNyR2FwICo9IDEuMTU7CisgICAgICAgICAgICAgICAgZGVjckdhcCAqPSAxLjE1OworICAgICAgICAgICAgfSBlbHNlIGlmICgic21hbGwiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgIHNjcm9sbEJhcldpZHRoICo9IDAuODU3OworICAgICAgICAgICAgICAgIGluY3JHYXAgKj0gMC44NTc7CisgICAgICAgICAgICAgICAgZGVjckdhcCAqPSAwLjcxNDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbmkiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgIHNjcm9sbEJhcldpZHRoICo9IDAuNzE0OworICAgICAgICAgICAgICAgIGluY3JHYXAgKj0gMC43MTQ7CisgICAgICAgICAgICAgICAgZGVjckdhcCAqPSAwLjcxNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogCkBAIC00NDIsMjAgKzQ4NSwyMyBAQAogICAgICAgICBnLnNldENvbG9yKHRyYWNrSGlnaGxpZ2h0Q29sb3IpOwogCiAgICAgICAgIGlmIChzY3JvbGxiYXIuZ2V0T3JpZW50YXRpb24oKSA9PSBKU2Nyb2xsQmFyLlZFUlRJQ0FMKSB7CisgICAgICAgICAgICAvL3BhaW50IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgdHJhY2sgYW5kIHRvcCBvZiB0aGUgdGh1bWIKICAgICAgICAgICAgIGludCB4ID0gaW5zZXRzLmxlZnQ7Ci0gICAgICAgICAgICBpbnQgeSA9IGRlY3JCdXR0b24uZ2V0WSgpICsgZGVjckJ1dHRvbi5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGludCB5ID0gdHJhY2tSZWN0Lnk7CiAgICAgICAgICAgICBpbnQgdyA9IHNjcm9sbGJhci5nZXRXaWR0aCgpIC0gKGluc2V0cy5sZWZ0ICsgaW5zZXRzLnJpZ2h0KTsKICAgICAgICAgICAgIGludCBoID0gdGh1bWJSLnkgLSB5OwogICAgICAgICAgICAgZy5maWxsUmVjdCh4LCB5LCB3LCBoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAgIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vaWYgbGVmdC10by1yaWdodCwgZmlsbCB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgdHJhY2sgYW5kCisgICAgICAgICAgICAvL3RoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHRodW1iLiBJZiByaWdodC10by1sZWZ0LCBmaWxsIHRoZSBhcmVhIGJldHdlZW4KKyAgICAgICAgICAgIC8vdGhlIGVuZCBvZiB0aGUgdGh1bWIgYW5kIGVuZCBvZiB0aGUgdHJhY2suCiAgICAgICAgICAgICBpbnQgeCwgdzsKICAgICAgICAgICAgIGlmIChzY3JvbGxiYXIuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKS5pc0xlZnRUb1JpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICB4ID0gZGVjckJ1dHRvbi5nZXRYKCkgKyBkZWNyQnV0dG9uLmdldFdpZHRoKCk7CisgICAgICAgICAgICAgICB4ID0gdHJhY2tSZWN0Lng7CiAgICAgICAgICAgICAgICAgdyA9IHRodW1iUi54IC0geDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgeCA9IHRodW1iUi54ICsgdGh1bWJSLndpZHRoOwotICAgICAgICAgICAgICAgIHcgPSBkZWNyQnV0dG9uLmdldFgoKSAtIHg7CisgICAgICAgICAgICAgICAgdyA9IHRyYWNrUmVjdC54ICsgdHJhY2tSZWN0LndpZHRoIC0geDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCB5ID0gaW5zZXRzLnRvcDsKICAgICAgICAgICAgIGludCBoID0gc2Nyb2xsYmFyLmdldEhlaWdodCgpIC0gKGluc2V0cy50b3AgKyBpbnNldHMuYm90dG9tKTsKQEAgLTQ3MSwxOSArNTE3LDIzIEBACiAgICAgICAgIGcuc2V0Q29sb3IodHJhY2tIaWdobGlnaHRDb2xvcik7CiAKICAgICAgICAgaWYgKHNjcm9sbGJhci5nZXRPcmllbnRhdGlvbigpID09IEpTY3JvbGxCYXIuVkVSVElDQUwpIHsKKyAgICAgICAgICAgIC8vZmlsbCB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBib3R0b20gb2YgdGhlIHRodW1iIGFuZCB0aGUgZW5kIG9mIHRoZSB0cmFjay4KICAgICAgICAgICAgIGludCB4ID0gaW5zZXRzLmxlZnQ7CiAgICAgICAgICAgICBpbnQgeSA9IHRodW1iUi55ICsgdGh1bWJSLmhlaWdodDsKICAgICAgICAgICAgIGludCB3ID0gc2Nyb2xsYmFyLmdldFdpZHRoKCkgLSAoaW5zZXRzLmxlZnQgKyBpbnNldHMucmlnaHQpOwotICAgICAgICAgICAgaW50IGggPSBpbmNyQnV0dG9uLmdldFkoKSAtIHk7CisgICAgICAgICAgICBpbnQgaCA9IHRyYWNrUmVjdC55ICsgdHJhY2tSZWN0LmhlaWdodCAtIHk7CiAgICAgICAgICAgICBnLmZpbGxSZWN0KHgsIHksIHcsIGgpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy9pZiBsZWZ0LXRvLXJpZ2h0LCBmaWxsIHRoZSBhcmVhIGJldHdlZW4gdGhlIHJpZ2h0IG9mIHRoZSB0aHVtYiBhbmQgdGhlCisgICAgICAgICAgICAvL2VuZCBvZiB0aGUgdHJhY2suIElmIHJpZ2h0LXRvLWxlZnQsIHRoZW4gZmlsbCB0aGUgYXJlYSB0byB0aGUgbGVmdCBvZgorICAgICAgICAgICAgLy90aGUgdGh1bWIgYW5kIHRoZSBzdGFydCBvZiB0aGUgdHJhY2suCiAgICAgICAgICAgICBpbnQgeCwgdzsKICAgICAgICAgICAgIGlmIChzY3JvbGxiYXIuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKS5pc0xlZnRUb1JpZ2h0KCkpIHsKICAgICAgICAgICAgICAgICB4ID0gdGh1bWJSLnggKyB0aHVtYlIud2lkdGg7Ci0gICAgICAgICAgICAgICAgdyA9IGluY3JCdXR0b24uZ2V0WCgpIC0geDsKKyAgICAgICAgICAgICAgICB3ID0gdHJhY2tSZWN0LnggKyB0cmFja1JlY3Qud2lkdGggLSB4OwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4ID0gaW5jckJ1dHRvbi5nZXRYKCkgKyBpbmNyQnV0dG9uLmdldFdpZHRoKCk7CisgICAgICAgICAgICAgICAgeCA9IHRyYWNrUmVjdC54OwogICAgICAgICAgICAgICAgIHcgPSB0aHVtYlIueCAtIHg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgeSA9IGluc2V0cy50b3A7CkBAIC02MTAsMTEgKzY2MCwxMyBAQAogICAgICAgICBpbnQgaW5jckJ1dHRvblkgPSBzYlNpemUuaGVpZ2h0IC0gKHNiSW5zZXRzLmJvdHRvbSArIGluY3JCdXR0b25IKTsKIAogICAgICAgICAvKiBUaGUgdGh1bWIgbXVzdCBmaXQgd2l0aGluIHRoZSBoZWlnaHQgbGVmdCBvdmVyIGFmdGVyIHdlCi0gICAgICAgICAqIHN1YnRyYWN0IHRoZSBwcmVmZXJyZWRTaXplIG9mIHRoZSBidXR0b25zIGFuZCB0aGUgaW5zZXRzLgorICAgICAgICAgKiBzdWJ0cmFjdCB0aGUgcHJlZmVycmVkU2l6ZSBvZiB0aGUgYnV0dG9ucyBhbmQgdGhlIGluc2V0cworICAgICAgICAgKiBhbmQgdGhlIGdhcHMKICAgICAgICAgICovCiAgICAgICAgIGludCBzYkluc2V0c0ggPSBzYkluc2V0cy50b3AgKyBzYkluc2V0cy5ib3R0b207CiAgICAgICAgIGludCBzYkJ1dHRvbnNIID0gZGVjckJ1dHRvbkggKyBpbmNyQnV0dG9uSDsKLSAgICAgICAgZmxvYXQgdHJhY2tIID0gc2JTaXplLmhlaWdodCAtIChzYkluc2V0c0ggKyBzYkJ1dHRvbnNIKTsKKyAgICAgICAgaW50IGdhcHMgPSBkZWNyR2FwICsgaW5jckdhcDsKKyAgICAgICAgZmxvYXQgdHJhY2tIID0gc2JTaXplLmhlaWdodCAtIChzYkluc2V0c0ggKyBzYkJ1dHRvbnNIKSAtIGdhcHM7CiAKICAgICAgICAgLyogQ29tcHV0ZSB0aGUgaGVpZ2h0IGFuZCBvcmlnaW4gb2YgdGhlIHRodW1iLiAgIFRoZSBjYXNlCiAgICAgICAgICAqIHdoZXJlIHRoZSB0aHVtYiBpcyBhdCB0aGUgYm90dG9tIGVkZ2UgaXMgaGFuZGxlZCBzcGVjaWFsbHkKQEAgLTYzMiwxMSArNjg0LDExIEBACiAgICAgICAgIHRodW1iSCA9IE1hdGgubWF4KHRodW1iSCwgZ2V0TWluaW11bVRodW1iU2l6ZSgpLmhlaWdodCk7CiAgICAgICAgIHRodW1iSCA9IE1hdGgubWluKHRodW1iSCwgZ2V0TWF4aW11bVRodW1iU2l6ZSgpLmhlaWdodCk7CiAKLSAgICAgICAgaW50IHRodW1iWSA9IGluY3JCdXR0b25ZIC0gdGh1bWJIOworICAgICAgICBpbnQgdGh1bWJZID0gaW5jckJ1dHRvblkgLSBpbmNyR2FwIC0gdGh1bWJIOwogICAgICAgICBpZiAodmFsdWUgPCAoc2IuZ2V0TWF4aW11bSgpIC0gc2IuZ2V0VmlzaWJsZUFtb3VudCgpKSkgewogICAgICAgICAgICAgZmxvYXQgdGh1bWJSYW5nZSA9IHRyYWNrSCAtIHRodW1iSDsKICAgICAgICAgICAgIHRodW1iWSA9IChpbnQpKDAuNWYgKyAodGh1bWJSYW5nZSAqICgodmFsdWUgLSBtaW4pIC8gKHJhbmdlIC0gZXh0ZW50KSkpKTsKLSAgICAgICAgICAgIHRodW1iWSArPSAgZGVjckJ1dHRvblkgKyBkZWNyQnV0dG9uSDsKKyAgICAgICAgICAgIHRodW1iWSArPSAgZGVjckJ1dHRvblkgKyBkZWNyQnV0dG9uSCArIGRlY3JHYXA7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBJZiB0aGUgYnV0dG9ucyBkb24ndCBmaXQsIGFsbG9jYXRlIGhhbGYgb2YgdGhlIGF2YWlsYWJsZQpAQCAtNjUyLDggKzcwNCw4IEBACiAKICAgICAgICAgLyogVXBkYXRlIHRoZSB0cmFja1JlY3QgZmllbGQuCiAgICAgICAgICAqLwotICAgICAgICBpbnQgaXRyYWNrWSA9IGRlY3JCdXR0b25ZICsgZGVjckJ1dHRvbkg7Ci0gICAgICAgIGludCBpdHJhY2tIID0gaW5jckJ1dHRvblkgLSBpdHJhY2tZOworICAgICAgICBpbnQgaXRyYWNrWSA9IGRlY3JCdXR0b25ZICsgZGVjckJ1dHRvbkggKyBkZWNyR2FwOworICAgICAgICBpbnQgaXRyYWNrSCA9IGluY3JCdXR0b25ZIC0gaW5jckdhcCAtIGl0cmFja1k7CiAgICAgICAgIHRyYWNrUmVjdC5zZXRCb3VuZHMoaXRlbVgsIGl0cmFja1ksIGl0ZW1XLCBpdHJhY2tIKTsKIAogICAgICAgICAvKiBJZiB0aGUgdGh1bWIgaXNuJ3QgZ29pbmcgdG8gZml0LCB6ZXJvIGl0J3MgYm91bmRzLiAgT3RoZXJ3aXNlCkBAIC02NzEsMTEgKzcyMywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKCh0aHVtYlkgKyB0aHVtYkgpID4gaW5jckJ1dHRvblkpIHsKLSAgICAgICAgICAgICAgICB0aHVtYlkgPSBpbmNyQnV0dG9uWSAtIHRodW1iSDsKKyAgICAgICAgICAgIGlmICgodGh1bWJZICsgdGh1bWJIKSA+IGluY3JCdXR0b25ZIC0gaW5jckdhcCkgeworICAgICAgICAgICAgICAgIHRodW1iWSA9IGluY3JCdXR0b25ZIC0gaW5jckdhcCAtIHRodW1iSDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aHVtYlkgIDwgKGRlY3JCdXR0b25ZICsgZGVjckJ1dHRvbkgpKSB7Ci0gICAgICAgICAgICAgICAgdGh1bWJZID0gZGVjckJ1dHRvblkgKyBkZWNyQnV0dG9uSCArIDE7CisgICAgICAgICAgICBpZiAodGh1bWJZICA8IChkZWNyQnV0dG9uWSArIGRlY3JCdXR0b25IICsgZGVjckdhcCkpIHsKKyAgICAgICAgICAgICAgICB0aHVtYlkgPSBkZWNyQnV0dG9uWSArIGRlY3JCdXR0b25IICsgZGVjckdhcCArIDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRUaHVtYkJvdW5kcyhpdGVtWCwgdGh1bWJZLCBpdGVtVywgdGh1bWJIKTsKICAgICAgICAgfQpAQCAtNzEwLDEzICs3NjIsMTYgQEAKICAgICAgICAgfQogICAgICAgICBpbnQgbGVmdEJ1dHRvblggPSBzYkluc2V0cy5sZWZ0OwogICAgICAgICBpbnQgcmlnaHRCdXR0b25YID0gc2JTaXplLndpZHRoIC0gKHNiSW5zZXRzLnJpZ2h0ICsgcmlnaHRCdXR0b25XKTsKKyAgICAgICAgaW50IGxlZnRHYXAgPSBsdHIgPyBkZWNyR2FwIDogaW5jckdhcDsKKyAgICAgICAgaW50IHJpZ2h0R2FwID0gbHRyID8gaW5jckdhcCA6IGRlY3JHYXA7CiAKICAgICAgICAgLyogVGhlIHRodW1iIG11c3QgZml0IHdpdGhpbiB0aGUgd2lkdGggbGVmdCBvdmVyIGFmdGVyIHdlCi0gICAgICAgICAqIHN1YnRyYWN0IHRoZSBwcmVmZXJyZWRTaXplIG9mIHRoZSBidXR0b25zIGFuZCB0aGUgaW5zZXRzLgorICAgICAgICAgKiBzdWJ0cmFjdCB0aGUgcHJlZmVycmVkU2l6ZSBvZiB0aGUgYnV0dG9ucyBhbmQgdGhlIGluc2V0cworICAgICAgICAgKiBhbmQgdGhlIGdhcHMKICAgICAgICAgICovCiAgICAgICAgIGludCBzYkluc2V0c1cgPSBzYkluc2V0cy5sZWZ0ICsgc2JJbnNldHMucmlnaHQ7CiAgICAgICAgIGludCBzYkJ1dHRvbnNXID0gbGVmdEJ1dHRvblcgKyByaWdodEJ1dHRvblc7Ci0gICAgICAgIGZsb2F0IHRyYWNrVyA9IHNiU2l6ZS53aWR0aCAtIChzYkluc2V0c1cgKyBzYkJ1dHRvbnNXKTsKKyAgICAgICAgZmxvYXQgdHJhY2tXID0gc2JTaXplLndpZHRoIC0gKHNiSW5zZXRzVyArIHNiQnV0dG9uc1cpIC0gKGxlZnRHYXAgKyByaWdodEdhcCk7CiAKICAgICAgICAgLyogQ29tcHV0ZSB0aGUgd2lkdGggYW5kIG9yaWdpbiBvZiB0aGUgdGh1bWIuICBFbmZvcmNlCiAgICAgICAgICAqIHRoZSB0aHVtYnMgbWluL21heCBkaW1lbnNpb25zLiAgVGhlIGNhc2Ugd2hlcmUgdGhlIHRodW1iCkBAIC03MzUsNyArNzkwLDcgQEAKICAgICAgICAgdGh1bWJXID0gTWF0aC5tYXgodGh1bWJXLCBnZXRNaW5pbXVtVGh1bWJTaXplKCkud2lkdGgpOwogICAgICAgICB0aHVtYlcgPSBNYXRoLm1pbih0aHVtYlcsIGdldE1heGltdW1UaHVtYlNpemUoKS53aWR0aCk7CiAKLSAgICAgICAgaW50IHRodW1iWCA9IGx0ciA/IHJpZ2h0QnV0dG9uWCAtIHRodW1iVyA6IGxlZnRCdXR0b25YICsgbGVmdEJ1dHRvblc7CisgICAgICAgIGludCB0aHVtYlggPSBsdHIgPyByaWdodEJ1dHRvblggLSByaWdodEdhcCAtIHRodW1iVyA6IGxlZnRCdXR0b25YICsgbGVmdEJ1dHRvblcgKyBsZWZ0R2FwOwogICAgICAgICBpZiAodmFsdWUgPCAobWF4IC0gc2IuZ2V0VmlzaWJsZUFtb3VudCgpKSkgewogICAgICAgICAgICAgZmxvYXQgdGh1bWJSYW5nZSA9IHRyYWNrVyAtIHRodW1iVzsKICAgICAgICAgICAgIGlmKCBsdHIgKSB7CkBAIC03NDMsNyArNzk4LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGh1bWJYID0gKGludCkoMC41ZiArICh0aHVtYlJhbmdlICogKChtYXggLSBleHRlbnQgLSB2YWx1ZSkgLyAocmFuZ2UgLSBleHRlbnQpKSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdGh1bWJYICs9ICBsZWZ0QnV0dG9uWCArIGxlZnRCdXR0b25XOworICAgICAgICAgICAgdGh1bWJYICs9IGxlZnRCdXR0b25YICsgbGVmdEJ1dHRvblcgKyBsZWZ0R2FwOwogICAgICAgICB9CiAKICAgICAgICAgLyogSWYgdGhlIGJ1dHRvbnMgZG9uJ3QgZml0LCBhbGxvY2F0ZSBoYWxmIG9mIHRoZSBhdmFpbGFibGUKQEAgLTc1Miw3ICs4MDcsNyBAQAogICAgICAgICBpbnQgc2JBdmFpbEJ1dHRvblcgPSAoc2JTaXplLndpZHRoIC0gc2JJbnNldHNXKTsKICAgICAgICAgaWYgKHNiQXZhaWxCdXR0b25XIDwgc2JCdXR0b25zVykgewogICAgICAgICAgICAgcmlnaHRCdXR0b25XID0gbGVmdEJ1dHRvblcgPSBzYkF2YWlsQnV0dG9uVyAvIDI7Ci0gICAgICAgICAgICByaWdodEJ1dHRvblggPSBzYlNpemUud2lkdGggLSAoc2JJbnNldHMucmlnaHQgKyByaWdodEJ1dHRvblcpOworICAgICAgICAgICAgcmlnaHRCdXR0b25YID0gc2JTaXplLndpZHRoIC0gKHNiSW5zZXRzLnJpZ2h0ICsgcmlnaHRCdXR0b25XICsgcmlnaHRHYXApOwogICAgICAgICB9CiAKICAgICAgICAgKGx0ciA/IGRlY3JCdXR0b24gOiBpbmNyQnV0dG9uKS5zZXRCb3VuZHMobGVmdEJ1dHRvblgsIGl0ZW1ZLCBsZWZ0QnV0dG9uVywgaXRlbUgpOwpAQCAtNzYwLDggKzgxNSw4IEBACiAKICAgICAgICAgLyogVXBkYXRlIHRoZSB0cmFja1JlY3QgZmllbGQuCiAgICAgICAgICAqLwotICAgICAgICBpbnQgaXRyYWNrWCA9IGxlZnRCdXR0b25YICsgbGVmdEJ1dHRvblc7Ci0gICAgICAgIGludCBpdHJhY2tXID0gcmlnaHRCdXR0b25YIC0gaXRyYWNrWDsKKyAgICAgICAgaW50IGl0cmFja1ggPSBsZWZ0QnV0dG9uWCArIGxlZnRCdXR0b25XICsgbGVmdEdhcDsKKyAgICAgICAgaW50IGl0cmFja1cgPSByaWdodEJ1dHRvblggLSByaWdodEdhcCAtIGl0cmFja1g7CiAgICAgICAgIHRyYWNrUmVjdC5zZXRCb3VuZHMoaXRyYWNrWCwgaXRlbVksIGl0cmFja1csIGl0ZW1IKTsKIAogICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIHRodW1iIGZpdHMgYmV0d2VlbiB0aGUgYnV0dG9ucy4gIE5vdGUKQEAgLTc3OCwxMSArODMzLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGh1bWJYICsgdGh1bWJXID4gcmlnaHRCdXR0b25YKSB7Ci0gICAgICAgICAgICAgICAgdGh1bWJYID0gcmlnaHRCdXR0b25YIC0gdGh1bWJXOworICAgICAgICAgICAgaWYgKHRodW1iWCArIHRodW1iVyA+IHJpZ2h0QnV0dG9uWCAtIHJpZ2h0R2FwKSB7CisgICAgICAgICAgICAgICAgdGh1bWJYID0gcmlnaHRCdXR0b25YIC0gcmlnaHRHYXAgLSB0aHVtYlc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGh1bWJYICA8IGxlZnRCdXR0b25YICsgbGVmdEJ1dHRvblcpIHsKLSAgICAgICAgICAgICAgICB0aHVtYlggPSBsZWZ0QnV0dG9uWCArIGxlZnRCdXR0b25XICsgMTsKKyAgICAgICAgICAgIGlmICh0aHVtYlggIDwgbGVmdEJ1dHRvblggKyBsZWZ0QnV0dG9uVyArIGxlZnRHYXApIHsKKyAgICAgICAgICAgICAgICB0aHVtYlggPSBsZWZ0QnV0dG9uWCArIGxlZnRCdXR0b25XICsgbGVmdEdhcCArIDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRUaHVtYkJvdW5kcyh0aHVtYlgsIGl0ZW1ZLCB0aHVtYlcsIGl0ZW1IKTsKICAgICAgICAgfQpAQCAtMTE1MSwyMCArMTIwNiwxNSBAQAogICAgICAgICAgICAgaW50IHRodW1iTWluLCB0aHVtYk1heCwgdGh1bWJQb3M7CiAKICAgICAgICAgICAgIGlmIChzY3JvbGxiYXIuZ2V0T3JpZW50YXRpb24oKSA9PSBKU2Nyb2xsQmFyLlZFUlRJQ0FMKSB7Ci0gICAgICAgICAgICAgICAgdGh1bWJNaW4gPSBkZWNyQnV0dG9uLmdldFkoKSArIGRlY3JCdXR0b24uZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgdGh1bWJNYXggPSBpbmNyQnV0dG9uLmdldFkoKSAtIHRodW1iUi5oZWlnaHQ7CisgICAgICAgICAgICAgICAgdGh1bWJNaW4gPSB0cmFja1JlY3QueTsKKyAgICAgICAgICAgICAgICB0aHVtYk1heCA9IHRyYWNrUmVjdC55ICsgdHJhY2tSZWN0LmhlaWdodCAtIHRodW1iUi5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgdGh1bWJQb3MgPSBNYXRoLm1pbih0aHVtYk1heCwgTWF0aC5tYXgodGh1bWJNaW4sIChlLmdldFkoKSAtIG9mZnNldCkpKTsKICAgICAgICAgICAgICAgICBzZXRUaHVtYkJvdW5kcyh0aHVtYlIueCwgdGh1bWJQb3MsIHRodW1iUi53aWR0aCwgdGh1bWJSLmhlaWdodCk7CiAgICAgICAgICAgICAgICAgdHJhY2tMZW5ndGggPSBnZXRUcmFja0JvdW5kcygpLmhlaWdodDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzY3JvbGxiYXIuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKS5pc0xlZnRUb1JpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJNaW4gPSBkZWNyQnV0dG9uLmdldFgoKSArIGRlY3JCdXR0b24uZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJNYXggPSBpbmNyQnV0dG9uLmdldFgoKSAtIHRodW1iUi53aWR0aDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHVtYk1pbiA9IGluY3JCdXR0b24uZ2V0WCgpICsgaW5jckJ1dHRvbi5nZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICB0aHVtYk1heCA9IGRlY3JCdXR0b24uZ2V0WCgpIC0gdGh1bWJSLndpZHRoOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHVtYk1pbiA9IHRyYWNrUmVjdC54OworICAgICAgICAgICAgICAgIHRodW1iTWF4ID0gdHJhY2tSZWN0LnggKyB0cmFja1JlY3Qud2lkdGggLSB0aHVtYlIud2lkdGg7CiAgICAgICAgICAgICAgICAgdGh1bWJQb3MgPSBNYXRoLm1pbih0aHVtYk1heCwgTWF0aC5tYXgodGh1bWJNaW4sIChlLmdldFgoKSAtIG9mZnNldCkpKTsKICAgICAgICAgICAgICAgICBzZXRUaHVtYkJvdW5kcyh0aHVtYlBvcywgdGh1bWJSLnksIHRodW1iUi53aWR0aCwgdGh1bWJSLmhlaWdodCk7CiAgICAgICAgICAgICAgICAgdHJhY2tMZW5ndGggPSBnZXRUcmFja0JvdW5kcygpLndpZHRoOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNTbGlkZXJVSS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNTbGlkZXJVSS5qYXZhCmluZGV4IDBhODU4ZDQuLjk3ZTJmNjAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljU2xpZGVyVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1NsaWRlclVJLmphdmEKQEAgLTIwNSw2ICsyMDUsOSBAQAogICAgICAgICBmb2N1c0NvbG9yID0gVUlNYW5hZ2VyLmdldENvbG9yKCJTbGlkZXIuZm9jdXMiKTsKIAogICAgICAgICBmb2N1c0luc2V0cyA9IChJbnNldHMpVUlNYW5hZ2VyLmdldCggIlNsaWRlci5mb2N1c0luc2V0cyIgKTsKKyAgICAgICAgLy8gdXNlIGRlZmF1bHQgaWYgbWlzc2luZyBzbyB0aGF0IEJhc2ljU2xpZGVyVUkgY2FuIGJlIHVzZWQgaW4gb3RoZXIKKyAgICAgICAgLy8gTEFGcyBsaWtlIE5pbWJ1cworICAgICAgICBpZiAoZm9jdXNJbnNldHMgPT0gbnVsbCkgZm9jdXNJbnNldHMgPSBuZXcgSW5zZXRzVUlSZXNvdXJjZSgyLDIsMiwyKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgVHJhY2tMaXN0ZW5lciBjcmVhdGVUcmFja0xpc3RlbmVyKEpTbGlkZXIgc2xpZGVyKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1NwbGl0UGFuZVVJLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1NwbGl0UGFuZVVJLmphdmEKaW5kZXggMmYwYmZmYS4uYjM1YTc1ZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNTcGxpdFBhbmVVSS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljU3BsaXRQYW5lVUkuamF2YQpAQCAtMzQ3LDggKzM0Nyw5IEBACiAgICAgICAgIC8vIFRoaXMgcGx1cyAyIGhlcmUgaXMgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29uc2lzdGFuY3kuIFByZXZpb3VzbHksCiAgICAgICAgIC8vIHRoZSBvbGQgc2l6ZSBkaWQgbm90IGluY2x1ZGUgdGhlIDIgcGl4ZWwgYm9yZGVyIGFyb3VuZCB0aGUgZGl2aWRlciwKICAgICAgICAgLy8gaXQgbm93IGRvZXMuCi0gICAgICAgIExvb2tBbmRGZWVsLmluc3RhbGxQcm9wZXJ0eShzcGxpdFBhbmUsICJkaXZpZGVyU2l6ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU1hbmFnZXIuZ2V0KCJTcGxpdFBhbmUuZGl2aWRlclNpemUiKSk7CisgICAgICAgIEludGVnZXIgZGl2aWRlclNpemUgPSAoSW50ZWdlcilVSU1hbmFnZXIuZ2V0KCJTcGxpdFBhbmUuZGl2aWRlclNpemUiKTsKKyAgICAgICAgaWYgKGRpdmlkZXIgPT0gbnVsbCkgZGl2aWRlclNpemUgPSAxMDsKKyAgICAgICAgTG9va0FuZEZlZWwuaW5zdGFsbFByb3BlcnR5KHNwbGl0UGFuZSwgImRpdmlkZXJTaXplIiwgZGl2aWRlclNpemUpOwogCiAgICAgICAgIGRpdmlkZXIuc2V0RGl2aWRlclNpemUoc3BsaXRQYW5lLmdldERpdmlkZXJTaXplKCkpOwogICAgICAgICBkaXZpZGVyU2l6ZSA9IGRpdmlkZXIuZ2V0RGl2aWRlclNpemUoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljVGFiYmVkUGFuZVVJLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1RhYmJlZFBhbmVVSS5qYXZhCmluZGV4IGEyNjZiNzcuLjVhOTRhMzYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljVGFiYmVkUGFuZVVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNUYWJiZWRQYW5lVUkuamF2YQpAQCAtMzc5LDYgKzM3OSwxNCBAQAogICAgICAgICAgICAgb3BhcXVlID0gQm9vbGVhbi5GQUxTRTsKICAgICAgICAgfQogICAgICAgICBMb29rQW5kRmVlbC5pbnN0YWxsUHJvcGVydHkodGFiUGFuZSwgIm9wYXF1ZSIsIG9wYXF1ZSk7CisKKyAgICAgICAgLy8gRml4IGZvciA2NzExMTQ1IEJhc2ljVGFiYmVkUGFudVVJIHNob3VsZCBub3QgdGhyb3cgYSBOUEUgaWYgdGhlc2UKKyAgICAgICAgLy8ga2V5cyBhcmUgbWlzc2luZy4gU28gd2UgYXJlIHNldHRpbmcgdGhlbSB0byB0aGVyZSBkZWZhdWx0IHZhbHVlcyBoZXJlCisgICAgICAgIC8vIGlmIHRoZSBrZXlzIGFyZSBtaXNzaW5nLgorICAgICAgICBpZiAodGFiSW5zZXRzID09IG51bGwpIHRhYkluc2V0cyA9IG5ldyBJbnNldHMoMCw0LDEsNCk7CisgICAgICAgIGlmIChzZWxlY3RlZFRhYlBhZEluc2V0cyA9PSBudWxsKSBzZWxlY3RlZFRhYlBhZEluc2V0cyA9IG5ldyBJbnNldHMoMiwyLDIsMSk7CisgICAgICAgIGlmICh0YWJBcmVhSW5zZXRzID09IG51bGwpIHRhYkFyZWFJbnNldHMgPSBuZXcgSW5zZXRzKDMsMiwwLDIpOworICAgICAgICBpZiAoY29udGVudEJvcmRlckluc2V0cyA9PSBudWxsKSBjb250ZW50Qm9yZGVySW5zZXRzID0gbmV3IEluc2V0cygyLDIsMywzKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxEZWZhdWx0cygpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljVGFibGVVSS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNUYWJsZVVJLmphdmEKaW5kZXggNTg1ZTAxZGMuLjE2Y2VhYjcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljVGFibGVVSS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljVGFibGVVSS5qYXZhCkBAIC0xNDE0LDE3ICsxNDE0LDIwIEBACiAKICAgICAgICAgQ29sb3Igc2JnID0gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwogICAgICAgICBpZiAoc2JnID09IG51bGwgfHwgc2JnIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkgewotICAgICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLnNlbGVjdGlvbkJhY2tncm91bmQiKSk7CisgICAgICAgICAgICBzYmcgPSBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLnNlbGVjdGlvbkJhY2tncm91bmQiKTsKKyAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbkJhY2tncm91bmQoc2JnICE9IG51bGwgPyBzYmcgOiBVSU1hbmFnZXIuZ2V0Q29sb3IoInRleHRIaWdobGlnaHQiKSk7CiAgICAgICAgIH0KIAogICAgICAgICBDb2xvciBzZmcgPSB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7CiAgICAgICAgIGlmIChzZmcgPT0gbnVsbCB8fCBzZmcgaW5zdGFuY2VvZiBVSVJlc291cmNlKSB7Ci0gICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuc2VsZWN0aW9uRm9yZWdyb3VuZCIpKTsKKyAgICAgICAgICAgIHNmZyA9IFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuc2VsZWN0aW9uRm9yZWdyb3VuZCIpOworICAgICAgICAgICAgdGFibGUuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChzZmcgIT0gbnVsbCA/IHNmZyA6IFVJTWFuYWdlci5nZXRDb2xvcigidGV4dEhpZ2hsaWdodFRleHQiKSk7CiAgICAgICAgIH0KIAogICAgICAgICBDb2xvciBncmlkQ29sb3IgPSB0YWJsZS5nZXRHcmlkQ29sb3IoKTsKICAgICAgICAgaWYgKGdyaWRDb2xvciA9PSBudWxsIHx8IGdyaWRDb2xvciBpbnN0YW5jZW9mIFVJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIHRhYmxlLnNldEdyaWRDb2xvcihVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmdyaWRDb2xvciIpKTsKKyAgICAgICAgICAgIGdyaWRDb2xvciA9IFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZ3JpZENvbG9yIik7CisgICAgICAgICAgICB0YWJsZS5zZXRHcmlkQ29sb3IoZ3JpZENvbG9yICE9IG51bGwgPyBncmlkQ29sb3IgOiBDb2xvci5HUkFZKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGluc3RhbGwgdGhlIHNjcm9sbHBhbmUgYm9yZGVyCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1RleHRVSS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNUZXh0VUkuamF2YQppbmRleCAxNjZjNmZjLi5jZWY5MTY2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1RleHRVSS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljVGV4dFVJLmphdmEKQEAgLTI3LDEzICsyNywxMCBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IGphdmEuYXd0Lio7CiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKLWltcG9ydCBqYXZhLmF3dC5mb250Lio7CiBpbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLio7Ci1pbXBvcnQgamF2YS5hd3QuZG5kLio7CiBpbXBvcnQgamF2YS5hd3QuaW0uSW5wdXRDb250ZXh0OwogaW1wb3J0IGphdmEuYmVhbnMuKjsKIGltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKIGltcG9ydCBqYXZheC5zd2luZy4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuKjsKIGltcG9ydCBqYXZheC5zd2luZy50ZXh0Lio7CkBAIC03ODUsMTEgKzc4MiwxNSBAQAogICAgICAgICAgICAgaW5zdGFsbERlZmF1bHRzKCk7CiAgICAgICAgICAgICBpbnN0YWxsRGVmYXVsdHMyKCk7CiAKLSAgICAgICAgICAgIC8vIGNvbW1vbiBjYXNlIGlzIGJhY2tncm91bmQgcGFpbnRlZC4uLiB0aGlzIGNhbgotICAgICAgICAgICAgLy8gZWFzaWx5IGJlIGNoYW5nZWQgYnkgc3ViY2xhc3NlcyBvciBmcm9tIG91dHNpZGUKLSAgICAgICAgICAgIC8vIG9mIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICBMb29rQW5kRmVlbC5pbnN0YWxsUHJvcGVydHkoZWRpdG9yLCAib3BhcXVlIiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIExvb2tBbmRGZWVsLmluc3RhbGxQcm9wZXJ0eShlZGl0b3IsICJhdXRvc2Nyb2xscyIsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBhcyB0aGVzZSBzaG91bGQgbm90IG92ZXJyaWRlIHdoYXQgc3ludGggaGFzCisgICAgICAgICAgICAvLyBzZXQgdGhlbSB0bworICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHN1bi5zd2luZy5wbGFmLnN5bnRoLlN5bnRoVUkpKXsKKyAgICAgICAgICAgICAgICAvLyBjb21tb24gY2FzZSBpcyBiYWNrZ3JvdW5kIHBhaW50ZWQuLi4gdGhpcyBjYW4KKyAgICAgICAgICAgICAgICAvLyBlYXNpbHkgYmUgY2hhbmdlZCBieSBzdWJjbGFzc2VzIG9yIGZyb20gb3V0c2lkZQorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICAgICAgTG9va0FuZEZlZWwuaW5zdGFsbFByb3BlcnR5KGVkaXRvciwgIm9wYXF1ZSIsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgTG9va0FuZEZlZWwuaW5zdGFsbFByb3BlcnR5KGVkaXRvciwgImF1dG9zY3JvbGxzIiwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gYXR0YWNoIHRvIHRoZSBtb2RlbCBhbmQgZWRpdG9yCiAgICAgICAgICAgICBlZGl0b3IuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih1cGRhdGVIYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljVHJlZVVJLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1RyZWVVSS5qYXZhCmluZGV4IDA1ZTMxODMuLjhmZGM4OGQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljVHJlZVVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNUcmVlVUkuamF2YQpAQCAtMjQwMiwxNSArMjQwMiwyNSBAQAogICAgICAgICB9CiAgICAgICAgIGxlYWRSb3cgPSBnZXRSb3dGb3JQYXRoKHRyZWUsIG5ld1BhdGgpOwogCi0gICAgICAgIGlmKHJlcGFpbnQpIHsKLSAgICAgICAgICAgIGlmKGJvdW5kcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyZWUucmVwYWludChib3VuZHMpOworICAgICAgICBpZiAocmVwYWludCkgeworICAgICAgICAgICAgaWYgKGJvdW5kcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJlZS5yZXBhaW50KGdldFJlcGFpbnRQYXRoQm91bmRzKGJvdW5kcykpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYm91bmRzID0gZ2V0UGF0aEJvdW5kcyh0cmVlLCBuZXdQYXRoKTsKLSAgICAgICAgICAgIGlmKGJvdW5kcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRyZWUucmVwYWludChib3VuZHMpOworICAgICAgICAgICAgaWYgKGJvdW5kcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJlZS5yZXBhaW50KGdldFJlcGFpbnRQYXRoQm91bmRzKGJvdW5kcykpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0UmVwYWludFBhdGhCb3VuZHMoUmVjdGFuZ2xlIGJvdW5kcykgeworICAgICAgICBpZiAoVUlNYW5hZ2VyLmdldEJvb2xlYW4oIlRyZWUucmVwYWludFdob2xlUm93IikpIHsKKyAgICAgICAgICAgYm91bmRzLnggPSAwOworICAgICAgICAgICBib3VuZHMud2lkdGggPSB0cmVlLmdldFdpZHRoKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvdW5kczsKKyAgICB9CisKICAgICBwcml2YXRlIFRyZWVQYXRoIGdldExlYWRTZWxlY3Rpb25QYXRoKCkgewogICAgICAgICByZXR1cm4gdHJlZS5nZXRMZWFkU2VsZWN0aW9uUGF0aCgpOwogICAgIH0KQEAgLTM2NDMsMTQgKzM2NTMsNiBAQAogICAgICAgICAgICAgZm9jdXNHYWluZWQoZSk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIFJlY3RhbmdsZSBnZXRSZXBhaW50UGF0aEJvdW5kcyhSZWN0YW5nbGUgYm91bmRzKSB7Ci0gICAgICAgICAgICBpZihVSU1hbmFnZXIuZ2V0Qm9vbGVhbigiVHJlZS5yZXBhaW50V2hvbGVSb3ciKSkgewotICAgICAgICAgICAgICAgYm91bmRzLnggPSAwOwotICAgICAgICAgICAgICAgYm91bmRzLndpZHRoID0gdHJlZS5nZXRXaWR0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJvdW5kczsKLSAgICAgICAgfQotCiAgICAgICAgIC8vCiAgICAgICAgIC8vIENlbGxFZGl0b3JMaXN0ZW5lcgogICAgICAgICAvLwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0Fic3RyYWN0UmVnaW9uUGFpbnRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0Fic3RyYWN0UmVnaW9uUGFpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmIxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvQWJzdHJhY3RSZWdpb25QYWludGVyLmphdmEKQEAgLTAsMCArMSw3MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgamF2YXguc3dpbmcucGxhZi5uaW1idXM7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmltYWdlLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5VSVJlc291cmNlOworaW1wb3J0IGphdmF4LnN3aW5nLlBhaW50ZXI7CitpbXBvcnQgamF2YS5hd3QucHJpbnQuUHJpbnRlckdyYXBoaWNzOworaW1wb3J0IHN0YXRpYyBqYXZheC5zd2luZy5wbGFmLm5pbWJ1cy5OaW1idXNMb29rQW5kRmVlbC5kZXJpdmVBUkdCOworCisvKioKKyAqIENvbnZlbmllbnQgYmFzZSBjbGFzcyBmb3IgZGVmaW5pbmcgUGFpbnRlciBpbnN0YW5jZXMgZm9yIHJlbmRlcmluZyBhCisgKiByZWdpb24gb3IgY29tcG9uZW50IGluIE5pbWJ1cy4KKyAqCisgKiBAYXV0aG9yIEphc3BlciBQb3R0cworICogQGF1dGhvciBSaWNoYXJkIEJhaXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVnaW9uUGFpbnRlciBpbXBsZW1lbnRzIFBhaW50ZXI8SkNvbXBvbmVudD4geworICAgIC8qKgorICAgICAqIFBhaW50Q29udGV4dCwgd2hpY2ggaG9sZHMgYSBsb3Qgb2YgdGhlIHN0YXRlIG5lZWRlZCBmb3IgY2FjaGUgaGludGluZyBhbmQgeC95IHZhbHVlIGRlY29kaW5nCisgICAgICogVGhlIGRhdGEgY29udGFpbmVkIHdpdGhpbiB0aGUgY29udGV4dCBpcyB0eXBpY2FsbHkgb25seSBjb21wdXRlZCBvbmNlIGFuZCByZXVzZWQgb3ZlcgorICAgICAqIG11bHRpcGxlIHBhaW50IGNhbGxzLCB3aGVyZWFzIHRoZSBvdGhlciB2YWx1ZXMgKHcsIGgsIGYsIGxlZnRXaWR0aCwgZXRjKSBhcmUgcmVjb21wdXRlZAorICAgICAqIGZvciBlYWNoIGNhbGwgdG8gcGFpbnQuCisgICAgICoKKyAgICAgKiBUaGlzIGZpZWxkIGlzIHJldHJpZXZlZCBmcm9tIHN1YmNsYXNzZXMgb24gZWFjaCBwYWludCBvcGVyYXRpb24uIEl0IGlzIHVwCisgICAgICogdG8gdGhlIHN1YmNsYXNzIHRvIGNvbXB1dGUgYW5kIGNhY2hlIHRoZSBQYWludENvbnRleHQgb3ZlciBtdWx0aXBsZSBjYWxscy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhaW50Q29udGV4dCBjdHg7CisgICAgLyoqCisgICAgICogVGhlIHNjYWxpbmcgZmFjdG9yLiBSZWNvbXB1dGVkIG9uIGVhY2ggY2FsbCB0byBwYWludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGY7CisgICAgLyoKKyAgICAgIFZhcmlvdXMgbWV0cmljcyB1c2VkIGZvciBkZWNvZGluZyB4L3kgdmFsdWVzIGJhc2VkIG9uIHRoZSBjYW52YXMgc2l6ZQorICAgICAgYW5kIHN0cmV0Y2hpbmcgaW5zZXRzLgorCisgICAgICBPbiBlYWNoIGNhbGwgdG8gcGFpbnQsIHdlIGZpcnN0IGFzayB0aGUgc3ViY2xhc3MgZm9yIHRoZSBQYWludENvbnRleHQuCisgICAgICBGcm9tIHRoZSBjb250ZXh0IHdlIGdldCB0aGUgY2FudmFzIHNpemUgYW5kIHN0cmV0Y2hpbmcgaW5zZXRzLCBhbmQgd2hldGhlcgorICAgICAgdGhlIGFsZ29yaXRobSBzaG91bGQgYmUgImludmVydGVkIiwgbWVhbmluZyB0aGUgY2VudGVyIHNlY3Rpb24gcmVtYWlucworICAgICAgYSBmaXhlZCBzaXplIGFuZCB0aGUgb3RoZXIgc2VjdGlvbnMgc2NhbGUuCisKKyAgICAgIFdlIHRoZW4gdXNlIHRoZXNlIHZhbHVlcyB0byBjb21wdXRlIGEgc2VyaWVzIG9mIG1ldHJpY3MgKGxpc3RlZCBiZWxvdykKKyAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIGRlY29kZSBwb2ludHMgaW4gYSBzcGVjaWZpYyBheGlzICh4IG9yIHkpLgorCisgICAgICBUaGUgbGVmdFdpZHRoIHJlcHJlc2VudHMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUgcmVnaW9uCisgICAgICB0byB0aGUgZmlyc3Qgc3RyZXRjaGluZyBpbnNldCwgYWZ0ZXIgYWNjb3VudGluZyBmb3IgYW55IHNjYWxpbmcgZmFjdG9yCisgICAgICAoc3VjaCBhcyBEUEkgc2NhbGluZykuIFRoZSBjZW50ZXJXaWR0aCBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgbGVmdFdpZHRoCisgICAgICBhbmQgdGhlIHJpZ2h0V2lkdGguIFRoZSByaWdodFdpZHRoIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByaWdodCBlZGdlLAorICAgICAgdG8gdGhlIHJpZ2h0IGluc2V0IChhZnRlciBzY2FsaW5nIGhhcyBiZWVuIGFwcGxpZWQpLgorCisgICAgICBUaGUgc2FtZSBsb2dpYyBnb2VzIGZvciB0b3BIZWlnaHQsIGNlbnRlckhlaWdodCwgYW5kIGJvdHRvbUhlaWdodC4KKworICAgICAgVGhlIGxlZnRTY2FsZSByZXByZXNlbnRzIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSB3aWR0aCB0YWtlbiBieSB0aGUgbGVmdCBzZWN0aW9uLgorICAgICAgVGhlIHNhbWUgbG9naWMgaXMgYXBwbGllZCB0byB0aGUgb3RoZXIgc2NhbGVzLgorCisgICAgICBUaGUgdmFyaW91cyB3aWR0aHMvaGVpZ2h0cyBhcmUgdXNlZCB0byBkZWNvZGUgY29udHJvbCBwb2ludHMuIFRoZQorICAgICAgdmFyaW91cyBzY2FsZXMgYXJlIHVzZWQgdG8gZGVjb2RlIGJlemllciBoYW5kbGVzIChvciBhbmNob3JzKS4KKyAgICAqLworICAgIC8qKgorICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgbGVmdCBzZWN0aW9uLiBSZWNvbXB1dGVkIG9uIGVhY2ggY2FsbCB0byBwYWludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGxlZnRXaWR0aDsKKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSB0b3Agc2VjdGlvbi4gUmVjb21wdXRlZCBvbiBlYWNoIGNhbGwgdG8gcGFpbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCB0b3BIZWlnaHQ7CisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIG9mIHRoZSBjZW50ZXIgc2VjdGlvbi4gUmVjb21wdXRlZCBvbiBlYWNoIGNhbGwgdG8gcGFpbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBjZW50ZXJXaWR0aDsKKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBjZW50ZXIgc2VjdGlvbi4gUmVjb21wdXRlZCBvbiBlYWNoIGNhbGwgdG8gcGFpbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBjZW50ZXJIZWlnaHQ7CisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIG9mIHRoZSByaWdodCBzZWN0aW9uLiBSZWNvbXB1dGVkIG9uIGVhY2ggY2FsbCB0byBwYWludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IHJpZ2h0V2lkdGg7CisgICAgLyoqCisgICAgICogVGhlIGhlaWdodCBvZiB0aGUgYm90dG9tIHNlY3Rpb24uIFJlY29tcHV0ZWQgb24gZWFjaCBjYWxsIHRvIHBhaW50LgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgYm90dG9tSGVpZ2h0OworICAgIC8qKgorICAgICAqIFRoZSBzY2FsaW5nIGZhY3RvciB0byB1c2UgZm9yIHRoZSBsZWZ0IHNlY3Rpb24uIFJlY29tcHV0ZWQgb24gZWFjaCBjYWxsIHRvIHBhaW50LgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbGVmdFNjYWxlOworICAgIC8qKgorICAgICAqIFRoZSBzY2FsaW5nIGZhY3RvciB0byB1c2UgZm9yIHRoZSB0b3Agc2VjdGlvbi4gUmVjb21wdXRlZCBvbiBlYWNoIGNhbGwgdG8gcGFpbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCB0b3BTY2FsZTsKKyAgICAvKioKKyAgICAgKiBUaGUgc2NhbGluZyBmYWN0b3IgdG8gdXNlIGZvciB0aGUgY2VudGVyIHNlY3Rpb24sIGluIHRoZSBob3Jpem9udGFsCisgICAgICogZGlyZWN0aW9uLiBSZWNvbXB1dGVkIG9uIGVhY2ggY2FsbCB0byBwYWludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGNlbnRlckhTY2FsZTsKKyAgICAvKioKKyAgICAgKiBUaGUgc2NhbGluZyBmYWN0b3IgdG8gdXNlIGZvciB0aGUgY2VudGVyIHNlY3Rpb24sIGluIHRoZSB2ZXJ0aWNhbAorICAgICAqIGRpcmVjdGlvbi4gUmVjb21wdXRlZCBvbiBlYWNoIGNhbGwgdG8gcGFpbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBjZW50ZXJWU2NhbGU7CisgICAgLyoqCisgICAgICogVGhlIHNjYWxpbmcgZmFjdG9yIHRvIHVzZSBmb3IgdGhlIHJpZ2h0IHNlY3Rpb24uIFJlY29tcHV0ZWQgb24gZWFjaCBjYWxsIHRvIHBhaW50LgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgcmlnaHRTY2FsZTsKKyAgICAvKioKKyAgICAgKiBUaGUgc2NhbGluZyBmYWN0b3IgdG8gdXNlIGZvciB0aGUgYm90dG9tIHNlY3Rpb24uIFJlY29tcHV0ZWQgb24gZWFjaCBjYWxsIHRvIHBhaW50LgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgYm90dG9tU2NhbGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQWJzdHJhY3RSZWdpb25QYWludGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0UmVnaW9uUGFpbnRlcigpIHsgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBwYWludChHcmFwaGljczJEIGcsIEpDb21wb25lbnQgYywgaW50IHcsIGludCBoKSB7CisgICAgICAgIC8vZG9uJ3QgcmVuZGVyIGlmIHRoZSB3aWR0aC9oZWlnaHQgYXJlIHRvbyBzbWFsbAorICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0wKSByZXR1cm47CisKKyAgICAgICAgT2JqZWN0W10gZXh0ZW5kZWRDYWNoZUtleXMgPSBnZXRFeHRlbmRlZENhY2hlS2V5cyhjKTsKKyAgICAgICAgY3R4ID0gZ2V0UGFpbnRDb250ZXh0KCk7CisgICAgICAgIFBhaW50Q29udGV4dC5DYWNoZU1vZGUgY2FjaGVNb2RlID0gY3R4ID09IG51bGwgPyBQYWludENvbnRleHQuQ2FjaGVNb2RlLk5PX0NBQ0hJTkcgOiBjdHguY2FjaGVNb2RlOworICAgICAgICBpZiAoY2FjaGVNb2RlID09IFBhaW50Q29udGV4dC5DYWNoZU1vZGUuTk9fQ0FDSElORyB8fAorICAgICAgICAgICAgICAgICFJbWFnZUNhY2hlLmdldEluc3RhbmNlKCkuaXNJbWFnZUNhY2hhYmxlKHcsIGgpIHx8CisgICAgICAgICAgICAgICAgZyBpbnN0YW5jZW9mIFByaW50ZXJHcmFwaGljcykgeworICAgICAgICAgICAgLy8gbm8gY2FjaGluZyBzbyBwYWludCBkaXJlY3RseQorICAgICAgICAgICAgcGFpbnQwKGcsIGMsIHcsIGgsIGV4dGVuZGVkQ2FjaGVLZXlzKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYWNoZU1vZGUgPT0gUGFpbnRDb250ZXh0LkNhY2hlTW9kZS5GSVhFRF9TSVpFUykgeworICAgICAgICAgICAgcGFpbnRXaXRoRml4ZWRTaXplQ2FjaGluZyhnLCBjLCB3LCBoLCBleHRlbmRlZENhY2hlS2V5cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyA5IFNxdWFyZSBjYWNoaW5nCisgICAgICAgICAgICBwYWludFdpdGg5U3F1YXJlQ2FjaGluZyhnLCBjdHgsIGMsIHcsIGgsIGV4dGVuZGVkQ2FjaGVLZXlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbnkgZXh0cmEgYXR0cmlidXRlcyB3aGljaCB0aGUgcGFpbnRlciBpbXBsZW1lbnRhdGlvbiB3b3VsZCBsaWtlCisgICAgICogdG8gaW5jbHVkZSBpbiB0aGUgaW1hZ2UgY2FjaGUgbG9va3Vwcy4gVGhpcyBpcyBjaGVja2VkIGZvciBldmVyeSBjYWxsCisgICAgICogb2YgdGhlIHBhaW50KGcsIGMsIHcsIGgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjb21wb25lbnQgb24gdGhlIGN1cnJlbnQgcGFpbnQgY2FsbAorICAgICAqIEByZXR1cm4gQXJyYXkgb2YgZXh0cmEgb2JqZWN0cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY2FjaGUga2V5CisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdFtdIGdldEV4dGVuZGVkQ2FjaGVLZXlzKEpDb21wb25lbnQgYykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5HZXRzIHRoZSBQYWludENvbnRleHQgZm9yIHRoaXMgcGFpbnRpbmcgb3BlcmF0aW9uLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gZXZlcnkKKyAgICAgKiBwYWludCwgYW5kIHNvIHNob3VsZCBiZSBmYXN0IGFuZCBwcm9kdWNlIG5vIGdhcmJhZ2UuIFRoZSBQYWludENvbnRleHQgY29udGFpbnMKKyAgICAgKiBpbmZvcm1hdGlvbiBzdWNoIGFzIGNhY2hlIGhpbnRzLiBJdCBhbHNvIGNvbnRhaW5zIGRhdGEgbmVjZXNzYXJ5IGZvciBkZWNvZGluZworICAgICAqIHBvaW50cyBhdCBydW50aW1lLCBzdWNoIGFzIHRoZSBzdHJldGNoaW5nIGluc2V0cywgdGhlIGNhbnZhcyBzaXplIGF0IHdoaWNoIHRoZQorICAgICAqIGVuY29kZWQgcG9pbnRzIHdlcmUgZGVmaW5lZCwgYW5kIHdoZXRoZXIgdGhlIHN0cmV0Y2hpbmcgaW5zZXRzIGFyZSBpbnZlcnRlZC48L3A+CisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBtZXRob2QgYWxsb3dzIGZvciBzdWJjbGFzc2VzIHRvIHBhY2thZ2UgdGhlIHBhaW50aW5nIG9mIGRpZmZlcmVudCBzdGF0ZXMKKyAgICAgKiB3aXRoIHBvc3NpYmx5IGRpZmZlcmVudCBjYW52YXMgc2l6ZXMsIGV0YywgaW50byBvbmUgQWJzdHJhY3RSZWdpb25QYWludGVyIGltcGxlbWVudGF0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBQYWludENvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFpbnQgb3BlcmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQYWludENvbnRleHQgZ2V0UGFpbnRDb250ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiA8cD5Db25maWd1cmVzIHRoZSBnaXZlbiBHcmFwaGljczJELiBPZnRlbiwgcmVuZGVyaW5nIGhpbnRzIG9yIGNvbXBvc2l0aWluZyBydWxlcyBhcmUKKyAgICAgKiBhcHBsaWVkIHRvIGEgR3JhcGhpY3MyRCBvYmplY3QgcHJpb3IgdG8gcGFpbnRpbmcsIHdoaWNoIHNob3VsZCBhZmZlY3QgYWxsIG9mIHRoZQorICAgICAqIHN1YnNlcXVlbnQgcGFpbnRpbmcgb3BlcmF0aW9ucy4gVGhpcyBtZXRob2QgcHJvdmlkZXMgYSBjb252ZW5pZW50IGhvb2sgZm9yIGNvbmZpZ3VyaW5nCisgICAgICogdGhlIEdyYXBoaWNzIG9iamVjdCBwcmlvciB0byByZW5kZXJpbmcsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcmVuZGVyIG9wZXJhdGlvbiBpcworICAgICAqIHBlcmZvcm1lZCB0byBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyIG9yIGRpcmVjdGx5IHRvIHRoZSBkaXNwbGF5LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnIFRoZSBHcmFwaGljczJEIG9iamVjdCB0byBjb25maWd1cmUuIFdpbGwgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY3MoR3JhcGhpY3MyRCBnKSB7CisgICAgICAgIGcuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfQU5USUFMSUFTSU5HLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9BTlRJQUxJQVNfT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdHVhbGx5IHBlcmZvcm1zIHRoZSBwYWludGluZyBvcGVyYXRpb24uIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCisgICAgICogVGhlIGdyYXBoaWNzIG9iamVjdCBwYXNzZWQgbWF5IHJlcHJlc2VudCB0aGUgYWN0dWFsIHN1cmZhY2UgYmVpbmcgcmVuZGVyZXJkIHRvLAorICAgICAqIG9yIGl0IG1heSBiZSBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyLiBJdCBoYXMgYWxzbyBiZWVuIHByZS10cmFuc2xhdGVkLiBTaW1wbHkgcmVuZGVyCisgICAgICogdGhlIGNvbXBvbmVudCBhcyBpZiBpdCB3ZXJlIGxvY2F0ZWQgYXQgMCwgMCBhbmQgaGFkIGEgd2lkdGggb2YgPGNvZGU+d2lkdGg8L2NvZGU+CisgICAgICogYW5kIGEgaGVpZ2h0IG9mIDxjb2RlPmhlaWdodDwvY29kZT4uIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB5b3UgbWF5IHdhbnQgdG8gcmVhZAorICAgICAqIHRoZSBjbGlwIGZyb20gdGhlIEdyYXBoaWNzMkQgb2JqZWN0IGFuZCBvbmx5IHJlbmRlciB3aXRoaW4gdGhhdCBzcGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnIFRoZSBHcmFwaGljczJEIHN1cmZhY2UgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gYyBUaGUgSkNvbXBvbmVudCByZWxhdGVkIHRvIHRoZSBkcmF3aW5nIGV2ZW50LiBGb3IgZXhhbXBsZSwgaWYgdGhlCisgICAgICogICAgICAgICAgcmVnaW9uIGJlaW5nIHJlbmRlcmVkIGlzIEJ1dHRvbiwgdGhlbiA8Y29kZT5jPC9jb2RlPiB3aWxsIGJlIGEKKyAgICAgKiAgICAgICAgICBKQnV0dG9uLiBJZiB0aGUgcmVnaW9uIGJlaW5nIGRyYXduIGlzIFNjcm9sbEJhclNsaWRlciwgdGhlbiB0aGUKKyAgICAgKiAgICAgICAgICBjb21wb25lbnQgd2lsbCBiZSBKU2Nyb2xsQmFyLiBUaGlzIHZhbHVlIG1heSBiZSBudWxsLgorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byBwYWludC4gTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mCisgICAgICogICAgICAgICAgICAgIHBhaW50aW5nIHRoZSBmb3JlZ3JvdW5kLCB0aGlzIHZhbHVlIG1heSBkaWZmZXIgZnJvbSBjLmdldFdpZHRoKCkuCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gcGFpbnQuIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZgorICAgICAqICAgICAgICAgICAgICAgcGFpbnRpbmcgdGhlIGZvcmVncm91bmQsIHRoaXMgdmFsdWUgbWF5IGRpZmZlciBmcm9tIGMuZ2V0SGVpZ2h0KCkuCisgICAgICogQHBhcmFtIGV4dGVuZGVkQ2FjaGVLZXlzIFRoZSByZXN1bHQgb2YgdGhlIGNhbGwgdG8gZ2V0RXh0ZW5kZWRDYWNoZUtleXMoKQorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvUGFpbnQoR3JhcGhpY3MyRCBnLCBKQ29tcG9uZW50IGMsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIE9iamVjdFtdIGV4dGVuZGVkQ2FjaGVLZXlzKTsKKworICAgIC8qKgorICAgICAqIERlY29kZXMgYW5kIHJldHVybnMgYSBmbG9hdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGFjdHVhbCBwaXhlbCBsb2NhdGlvbiBmb3IKKyAgICAgKiB0aGUgZ2l2ZW4gZW5jb2RlZCBYIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHggYW4gZW5jb2RlZCB4IHZhbHVlICgwLi4uMSwgb3IgMS4uLjIsIG9yIDIuLi4zKQorICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgeCB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBmbG9hdCBkZWNvZGVYKGZsb2F0IHgpIHsKKyAgICAgICAgaWYgKGN0eC5jYW52YXNTaXplID09IG51bGwpIHJldHVybiB4OworCisgICAgICAgIGlmICh4ID49IDAgJiYgeCA8PSAxKSB7CisgICAgICAgICAgICByZXR1cm4geCAqIGxlZnRXaWR0aDsKKyAgICAgICAgfSBlbHNlIGlmICh4ID4gMSAmJiB4IDwgMikgeworICAgICAgICAgICAgcmV0dXJuICgoeC0xKSAqIGNlbnRlcldpZHRoKSArIGxlZnRXaWR0aDsKKyAgICAgICAgfSBlbHNlIGlmICh4ID49IDIgJiYgeCA8PSAzKSB7CisgICAgICAgICAgICByZXR1cm4gKCh4LTIpICogcmlnaHRXaWR0aCkgKyBsZWZ0V2lkdGggKyBjZW50ZXJXaWR0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiSW52YWxpZCB4Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIGFuZCByZXR1cm5zIGEgZmxvYXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBhY3R1YWwgcGl4ZWwgbG9jYXRpb24gZm9yCisgICAgICogdGhlIGdpdmVuIGVuY29kZWQgeSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB5IGFuIGVuY29kZWQgeSB2YWx1ZSAoMC4uLjEsIG9yIDEuLi4yLCBvciAyLi4uMykKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHkgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgZmxvYXQgZGVjb2RlWShmbG9hdCB5KSB7CisgICAgICAgIGlmIChjdHguY2FudmFzU2l6ZSA9PSBudWxsKSByZXR1cm4geTsKKworICAgICAgICBpZiAoeSA+PSAwICYmIHkgPD0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHkgKiB0b3BIZWlnaHQ7CisgICAgICAgIH0gZWxzZSBpZiAoeSA+IDEgJiYgeSA8IDIpIHsKKyAgICAgICAgICAgIHJldHVybiAoKHktMSkgKiBjZW50ZXJIZWlnaHQpICsgdG9wSGVpZ2h0OworICAgICAgICB9IGVsc2UgaWYgKHkgPj0gMiAmJiB5IDw9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKHktMikgKiBib3R0b21IZWlnaHQpICsgdG9wSGVpZ2h0ICsgY2VudGVySGVpZ2h0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgYW5kIHJldHVybnMgYSBmbG9hdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGFjdHVhbCBwaXhlbCBsb2NhdGlvbiBmb3IKKyAgICAgKiB0aGUgYW5jaG9yIHBvaW50IGdpdmVuIHRoZSBlbmNvZGVkIFggdmFsdWUgb2YgdGhlIGNvbnRyb2wgcG9pbnQsIGFuZCB0aGUgb2Zmc2V0CisgICAgICogZGlzdGFuY2UgdG8gdGhlIGFuY2hvciBmcm9tIHRoYXQgY29udHJvbCBwb2ludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4IGFuIGVuY29kZWQgeCB2YWx1ZSBvZiB0aGUgYmV6aWVyIGNvbnRyb2wgcG9pbnQgKDAuLi4xLCBvciAxLi4uMiwgb3IgMi4uLjMpCisgICAgICogQHBhcmFtIGR4IHRoZSBvZmZzZXQgZGlzdGFuY2UgdG8gdGhlIGFuY2hvciBmcm9tIHRoZSBjb250cm9sIHBvaW50IHgKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHggbG9jYXRpb24gb2YgdGhlIGNvbnRyb2wgcG9pbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgZmxvYXQgZGVjb2RlQW5jaG9yWChmbG9hdCB4LCBmbG9hdCBkeCkgeworICAgICAgICBpZiAoY3R4LmNhbnZhc1NpemUgPT0gbnVsbCkgcmV0dXJuIHggKyBkeDsKKworICAgICAgICBpZiAoeCA+PSAwICYmIHggPD0gMSkgeworICAgICAgICAgICAgcmV0dXJuIGRlY29kZVgoeCkgKyAoZHggKiBsZWZ0U2NhbGUpOworICAgICAgICB9IGVsc2UgaWYgKHggPiAxICYmIHggPCAyKSB7CisgICAgICAgICAgICByZXR1cm4gZGVjb2RlWCh4KSArIChkeCAqIGNlbnRlckhTY2FsZSk7CisgICAgICAgIH0gZWxzZSBpZiAoeCA+PSAyICYmIHggPD0gMykgeworICAgICAgICAgICAgcmV0dXJuIGRlY29kZVgoeCkgKyAoZHggKiByaWdodFNjYWxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiSW52YWxpZCB4Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIGFuZCByZXR1cm5zIGEgZmxvYXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBhY3R1YWwgcGl4ZWwgbG9jYXRpb24gZm9yCisgICAgICogdGhlIGFuY2hvciBwb2ludCBnaXZlbiB0aGUgZW5jb2RlZCBZIHZhbHVlIG9mIHRoZSBjb250cm9sIHBvaW50LCBhbmQgdGhlIG9mZnNldAorICAgICAqIGRpc3RhbmNlIHRvIHRoZSBhbmNob3IgZnJvbSB0aGF0IGNvbnRyb2wgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0geSBhbiBlbmNvZGVkIHkgdmFsdWUgb2YgdGhlIGJlemllciBjb250cm9sIHBvaW50ICgwLi4uMSwgb3IgMS4uLjIsIG9yIDIuLi4zKQorICAgICAqIEBwYXJhbSBkeSB0aGUgb2Zmc2V0IGRpc3RhbmNlIHRvIHRoZSBhbmNob3IgZnJvbSB0aGUgY29udHJvbCBwb2ludCB5CisgICAgICogQHJldHVybiB0aGUgZGVjb2RlZCB5IHBvc2l0aW9uIG9mIHRoZSBjb250cm9sIHBvaW50CisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGZsb2F0IGRlY29kZUFuY2hvclkoZmxvYXQgeSwgZmxvYXQgZHkpIHsKKyAgICAgICAgaWYgKGN0eC5jYW52YXNTaXplID09IG51bGwpIHJldHVybiB5ICsgZHk7CisKKyAgICAgICAgaWYgKHkgPj0gMCAmJiB5IDw9IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWNvZGVZKHkpICsgKGR5ICogdG9wU2NhbGUpOworICAgICAgICB9IGVsc2UgaWYgKHkgPiAxICYmIHkgPCAyKSB7CisgICAgICAgICAgICByZXR1cm4gZGVjb2RlWSh5KSArIChkeSAqIGNlbnRlclZTY2FsZSk7CisgICAgICAgIH0gZWxzZSBpZiAoeSA+PSAyICYmIHkgPD0gMykgeworICAgICAgICAgICAgcmV0dXJuIGRlY29kZVkoeSkgKyAoZHkgKiBib3R0b21TY2FsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkludmFsaWQgeSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyBhbmQgcmV0dXJucyBhIGNvbG9yLCB3aGljaCBpcyBkZXJpdmVkIGZyb20gYSBiYXNlIGNvbG9yIGluIFVJCisgICAgICogZGVmYXVsdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAgICBBIGtleSBjb3Jyb3Nwb25kaW5nIHRvIHRoZSB2YWx1ZSBpbiB0aGUgVUkgRGVmYXVsdHMgdGFibGUKKyAgICAgKiAgICAgICAgICAgICAgICBvZiBVSU1hbmFnZXIgd2hlcmUgdGhlIGJhc2UgY29sb3IgaXMgZGVmaW5lZAorICAgICAqIEBwYXJhbSBoT2Zmc2V0IFRoZSBodWUgb2Zmc2V0IHVzZWQgZm9yIGRlcml2YXRpb24uCisgICAgICogQHBhcmFtIHNPZmZzZXQgVGhlIHNhdHVyYXRpb24gb2Zmc2V0IHVzZWQgZm9yIGRlcml2YXRpb24uCisgICAgICogQHBhcmFtIGJPZmZzZXQgVGhlIGJyaWdodG5lc3Mgb2Zmc2V0IHVzZWQgZm9yIGRlcml2YXRpb24uCisgICAgICogQHBhcmFtIGFPZmZzZXQgVGhlIGFscGhhIG9mZnNldCB1c2VkIGZvciBkZXJpdmF0aW9uLiBCZXR3ZWVuIDAuLi4yNTUKKyAgICAgKiBAcmV0dXJuIFRoZSBkZXJpdmVkIGNvbG9yLCB3aG9zIGNvbG9yIHZhbHVlIHdpbGwgY2hhbmdlIGlmIHRoZSBwYXJlbnQKKyAgICAgKiAgICAgICAgIHVpRGVmYXVsdCBjb2xvciBjaGFuZ2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBDb2xvciBkZWNvZGVDb2xvcihTdHJpbmcga2V5LCBmbG9hdCBoT2Zmc2V0LCBmbG9hdCBzT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiT2Zmc2V0LCBpbnQgYU9mZnNldCkgeworICAgICAgICBpZiAoVUlNYW5hZ2VyLmdldExvb2tBbmRGZWVsKCkgaW5zdGFuY2VvZiBOaW1idXNMb29rQW5kRmVlbCl7CisgICAgICAgICAgICBOaW1idXNMb29rQW5kRmVlbCBsYWYgPSAoTmltYnVzTG9va0FuZEZlZWwpIFVJTWFuYWdlci5nZXRMb29rQW5kRmVlbCgpOworICAgICAgICAgICAgcmV0dXJuIGxhZi5nZXREZXJpdmVkQ29sb3Ioa2V5LCBoT2Zmc2V0LCBzT2Zmc2V0LCBiT2Zmc2V0LCBhT2Zmc2V0LCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNhbiBub3QgZ2l2ZSBhIHJpZ2h0IGFuc3dlciBhcyBwYWludGVyIHNvdWxkIG5vdCBiZSB1c2VkIG91dHNpZGUKKyAgICAgICAgICAgIC8vIG9mIG5pbWJ1cyBsYWYgYnV0IGRvIHRoZSBiZXN0IHdlIGNhbgorICAgICAgICAgICAgcmV0dXJuIENvbG9yLmdldEhTQkNvbG9yKGhPZmZzZXQsc09mZnNldCxiT2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgYW5kIHJldHVybnMgYSBjb2xvciwgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIGEgb2Zmc2V0IGJldHdlZW4gdHdvCisgICAgICogb3RoZXIgY29sb3JzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbG9yMSAgIFRoZSBmaXJzdCBjb2xvcgorICAgICAqIEBwYXJhbSBjb2xvcjIgICBUaGUgc2Vjb25kIGNvbG9yCisgICAgICogQHBhcmFtIG1pZFBvaW50IFRoZSBvZmZzZXQgYmV0d2VlbiBjb2xvciAxIGFuZCBjb2xvciAyLCBhIHZhbHVlIG9mIDAuMCBpcworICAgICAqICAgICAgICAgICAgICAgICBjb2xvciAxIGFuZCAxLjAgaXMgY29sb3IgMjsKKyAgICAgKiBAcmV0dXJuIFRoZSBkZXJpdmVkIGNvbG9yCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIENvbG9yIGRlY29kZUNvbG9yKENvbG9yIGNvbG9yMSwgQ29sb3IgY29sb3IyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaWRQb2ludCkgeworICAgICAgICByZXR1cm4gbmV3IENvbG9yKGRlcml2ZUFSR0IoY29sb3IxLCBjb2xvcjIsIG1pZFBvaW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gcGFyYW1ldGVycyBmb3IgY3JlYXRpbmcgYSBMaW5lYXJHcmFkaWVudFBhaW50LCB0aGlzIG1ldGhvZCB3aWxsCisgICAgICogY3JlYXRlIGFuZCByZXR1cm4gYSBsaW5lYXIgZ3JhZGllbnQgcGFpbnQuIE9uZSBwcmltYXJ5IHB1cnBvc2UgZm9yIHRoaXMKKyAgICAgKiBtZXRob2QgaXMgdG8gYXZvaWQgY3JlYXRpbmcgYSBMaW5lYXJHcmFkaWVudFBhaW50IHdoZXJlIHRoZSBzdGFydCBhbmQKKyAgICAgKiBlbmQgcG9pbnRzIGFyZSBlcXVhbC4gSW4gc3VjaCBhIGNhc2UsIHRoZSBlbmQgeSBwb2ludCBpcyBzbGlnaHRseQorICAgICAqIGluY3JlYXNlZCB0byBhdm9pZCB0aGUgb3ZlcmxhcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4MQorICAgICAqIEBwYXJhbSB5MQorICAgICAqIEBwYXJhbSB4MgorICAgICAqIEBwYXJhbSB5MgorICAgICAqIEBwYXJhbSBtaWRwb2ludHMKKyAgICAgKiBAcGFyYW0gY29sb3JzCisgICAgICogQHJldHVybiBhIHZhbGlkIExpbmVhckdyYWRpZW50UGFpbnQuIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgTGluZWFyR3JhZGllbnRQYWludCBkZWNvZGVHcmFkaWVudChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXRbXSBtaWRwb2ludHMsIENvbG9yW10gY29sb3JzKSB7CisgICAgICAgIGlmICh4MSA9PSB4MiAmJiB5MSA9PSB5MikgeworICAgICAgICAgICAgeTIgKz0gLjAwMDAxZjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IExpbmVhckdyYWRpZW50UGFpbnQoeDEsIHkxLCB4MiwgeTIsIG1pZHBvaW50cywgY29sb3JzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBwYXJhbWV0ZXJzIGZvciBjcmVhdGluZyBhIFJhZGlhbEdyYWRpZW50UGFpbnQsIHRoaXMgbWV0aG9kIHdpbGwKKyAgICAgKiBjcmVhdGUgYW5kIHJldHVybiBhIHJhZGlhbCBncmFkaWVudCBwYWludC4gT25lIHByaW1hcnkgcHVycG9zZSBmb3IgdGhpcworICAgICAqIG1ldGhvZCBpcyB0byBhdm9pZCBjcmVhdGluZyBhIFJhZGlhbEdyYWRpZW50UGFpbnQgd2hlcmUgdGhlIHJhZGl1cworICAgICAqIGlzIG5vbi1wb3NpdGl2ZS4gSW4gc3VjaCBhIGNhc2UsIHRoZSByYWRpdXMgaXMganVzdCBzbGlnaHRseQorICAgICAqIGluY3JlYXNlZCB0byBhdm9pZCAwLgorICAgICAqCisgICAgICogQHBhcmFtIHgKKyAgICAgKiBAcGFyYW0geQorICAgICAqIEBwYXJhbSByCisgICAgICogQHBhcmFtIG1pZHBvaW50cworICAgICAqIEBwYXJhbSBjb2xvcnMKKyAgICAgKiBAcmV0dXJuIGEgdmFsaWQgUmFkaWFsR3JhZGllbnRQYWludC4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBSYWRpYWxHcmFkaWVudFBhaW50IGRlY29kZVJhZGlhbEdyYWRpZW50KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHIsIGZsb2F0W10gbWlkcG9pbnRzLCBDb2xvcltdIGNvbG9ycykgeworICAgICAgICBpZiAociA9PSAwZikgeworICAgICAgICAgICAgciA9IC4wMDAwMWY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSYWRpYWxHcmFkaWVudFBhaW50KHgsIHksIHIsIG1pZHBvaW50cywgY29sb3JzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb2xvciBwcm9wZXJ0eSBmcm9tIHRoZSBnaXZlbiBKQ29tcG9uZW50LiBGaXJzdCBjaGVja3MgZm9yIGEKKyAgICAgKiA8Y29kZT5nZXRYWFgoKTwvY29kZT4gbWV0aG9kIGFuZCBpZiB0aGF0IGZhaWxzIGNoZWNrcyBmb3IgYSBjbGllbnQKKyAgICAgKiBwcm9wZXJ0eSB3aXRoIGtleSA8Y29kZT5wcm9wZXJ0eTwvY29kZT4uIElmIHRoYXQgc3RpbGwgZmFpbHMgdG8gcmV0dXJuCisgICAgICogYSBDb2xvciB0aGVuIDxjb2RlPmRlZmF1bHRDb2xvcjwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY29tcG9uZW50IHRvIGdldCB0aGUgY29sb3IgcHJvcGVydHkgZnJvbQorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiBhIGJlYW4gc3R5bGUgcHJvcGVydHkgb3IgY2xpZW50IHByb3BlcnR5CisgICAgICogQHBhcmFtIGRlZmF1bHRDb2xvciBUaGUgY29sb3IgdG8gcmV0dXJuIGlmIG5vIGNvbG9yIHdhcyBvYnRhaW5lZCBmcm9tCisgICAgICogICAgICAgIHRoZSBjb21wb25lbnQuCisgICAgICogQHJldHVybiBUaGUgY29sb3IgdGhhdCB3YXMgb2J0YWluZWQgZnJvbSB0aGUgY29tcG9uZW50IG9yIGRlZmF1bHRDb2xvcgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBDb2xvciBnZXRDb21wb25lbnRDb2xvcihKQ29tcG9uZW50IGMsIFN0cmluZyBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgZGVmYXVsdENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzYXR1cmF0aW9uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBicmlnaHRuZXNzT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFPZmZzZXQpIHsKKyAgICAgICAgQ29sb3IgY29sb3IgPSBudWxsOworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgc29tZSBzcGVjaWFsIGNhc2VzIGZvciBwZXJmb3JtYW5jZQorICAgICAgICAgICAgaWYgKCJiYWNrZ3JvdW5kIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgY29sb3IgPSBjLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImZvcmVncm91bmQiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICBjb2xvciA9IGMuZ2V0Rm9yZWdyb3VuZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgSkxpc3QgJiYgInNlbGVjdGlvbkZvcmVncm91bmQiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICBjb2xvciA9ICgoSkxpc3QpIGMpLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIEpMaXN0ICYmICJzZWxlY3Rpb25CYWNrZ3JvdW5kIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgY29sb3IgPSAoKEpMaXN0KSBjKS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBKVGFibGUgJiYgInNlbGVjdGlvbkZvcmVncm91bmQiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICBjb2xvciA9ICgoSlRhYmxlKSBjKS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBKVGFibGUgJiYgInNlbGVjdGlvbkJhY2tncm91bmQiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICBjb2xvciA9ICgoSlRhYmxlKSBjKS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gImdldCIgKyBDaGFyYWN0ZXIudG9VcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDApKSArIHByb3BlcnR5LnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gYy5nZXRDbGFzcygpLmdldE1ldGhvZChzKTsKKyAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAoQ29sb3IpIG1ldGhvZC5pbnZva2UoYyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBkbyBhbnl0aGluZywgaXQganVzdCBkaWRuJ3Qgd29yaywgdGhhdCdzIGFsbC4KKyAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGNvdWxkIGJlIGEgbm9ybWFsIG9jY3VyYW5jZSBpZiB5b3UgdXNlIGEgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgLy9uYW1lIHJlZmVycmluZyB0byBhIGtleSBpbiBjbGllbnRQcm9wZXJ0aWVzIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy9hIHJlYWwgcHJvcGVydHkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYy5nZXRDbGllbnRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IChDb2xvcikgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gd2UgcmV0dXJuIHRoZSBkZWZhdWx0Q29sb3IgaWYgdGhlIGNvbG9yIGZvdW5kIGlzIG51bGwsIG9yIGlmCisgICAgICAgIC8vIGl0IGlzIGEgVUlSZXNvdXJjZS4gVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIGNvbG9yIGZvciB0aGUKKyAgICAgICAgLy8gRU5BQkxFRCBzdGF0ZSBpcyBzZXQgb24gdGhlIGNvbXBvbmVudCwgYnV0IHlvdSBkb24ndCB3YW50IHRvIHVzZQorICAgICAgICAvLyB0aGF0IGNvbG9yIGZvciB0aGUgb3ZlciBzdGF0ZS4gU28gd2Ugb25seSByZXNwZWN0IHRoZSBjb2xvcgorICAgICAgICAvLyBzcGVjaWZpZWQgZm9yIHRoZSBwcm9wZXJ0eSBpZiBpdCB3YXMgc2V0IGJ5IHRoZSB1c2VyLCBhcyBvcHBvc2VkCisgICAgICAgIC8vIHRvIHNldCBieSB1cy4KKyAgICAgICAgaWYgKGNvbG9yID09IG51bGwgfHwgY29sb3IgaW5zdGFuY2VvZiBVSVJlc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbG9yOworICAgICAgICB9IGVsc2UgaWYgKHNhdHVyYXRpb25PZmZzZXQgIT0gMCB8fCBicmlnaHRuZXNzT2Zmc2V0ICE9IDAgfHwgYWxwaGFPZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgZmxvYXRbXSB0bXAgPSBDb2xvci5SR0J0b0hTQihjb2xvci5nZXRSZWQoKSwgY29sb3IuZ2V0R3JlZW4oKSwgY29sb3IuZ2V0Qmx1ZSgpLCBudWxsKTsKKyAgICAgICAgICAgIHRtcFsxXSA9IGNsYW1wKHRtcFsxXSArIHNhdHVyYXRpb25PZmZzZXQpOworICAgICAgICAgICAgdG1wWzJdID0gY2xhbXAodG1wWzJdICsgYnJpZ2h0bmVzc09mZnNldCk7CisgICAgICAgICAgICBpbnQgYWxwaGEgPSBjbGFtcChjb2xvci5nZXRBbHBoYSgpICsgYWxwaGFPZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcigoQ29sb3IuSFNCdG9SR0IodG1wWzBdLCB0bXBbMV0sIHRtcFsyXSkgJiAweEZGRkZGRikgfCAoYWxwaGEgPDwyNCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyBlbmNhcHN1bGF0aW5nIHN0YXRlIHVzZWZ1bCB3aGVuIHBhaW50aW5nLiBHZW5lcmFsbHksIGluc3RhbmNlcyBvZiB0aGlzCisgICAgICogY2xhc3MgYXJlIGNyZWF0ZWQgb25jZSwgYW5kIHJldXNlZCBmb3IgZWFjaCBwYWludCByZXF1ZXN0IHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICAgICAqIFRoaXMgY2xhc3MgY29udGFpbnMgdmFsdWVzIHVzZWZ1bCB3aGVuIGhpbnRpbmcgdGhlIGNhY2hlIGVuZ2luZSwgYW5kIHdoZW4gZGVjb2RpbmcKKyAgICAgKiBjb250cm9sIHBvaW50cyBhbmQgYmV6aWVyIGN1cnZlIGFuY2hvcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBQYWludENvbnRleHQgeworICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGVudW0gQ2FjaGVNb2RlIHsKKyAgICAgICAgICAgIE5PX0NBQ0hJTkcsIEZJWEVEX1NJWkVTLCBOSU5FX1NRVUFSRV9TQ0FMRQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSW5zZXRzIEVNUFRZX0lOU0VUUyA9IG5ldyBJbnNldHMoMCwgMCwgMCwgMCk7CisKKyAgICAgICAgcHJpdmF0ZSBJbnNldHMgc3RyZXRjaGluZ0luc2V0czsKKyAgICAgICAgcHJpdmF0ZSBEaW1lbnNpb24gY2FudmFzU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGludmVydGVkOworICAgICAgICBwcml2YXRlIENhY2hlTW9kZSBjYWNoZU1vZGU7CisgICAgICAgIHByaXZhdGUgZG91YmxlIG1heEhvcml6b250YWxTY2FsZUZhY3RvcjsKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgbWF4VmVydGljYWxTY2FsZUZhY3RvcjsKKworICAgICAgICBwcml2YXRlIGZsb2F0IGE7IC8vIGluc2V0cy5sZWZ0CisgICAgICAgIHByaXZhdGUgZmxvYXQgYjsgLy8gY2FudmFzU2l6ZS53aWR0aCAtIGluc2V0cy5yaWdodAorICAgICAgICBwcml2YXRlIGZsb2F0IGM7IC8vIGluc2V0cy50b3AKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBkOyAvLyBjYW52YXNTaXplLmhlaWdodCAtIGluc2V0cy5ib3R0b207CisgICAgICAgIHByaXZhdGUgZmxvYXQgYVBlcmNlbnQ7IC8vIG9ubHkgdXNlZCBpZiBpbnZlcnRlZCA9PSB0cnVlCisgICAgICAgIHByaXZhdGUgZmxvYXQgYlBlcmNlbnQ7IC8vIG9ubHkgdXNlZCBpZiBpbnZlcnRlZCA9PSB0cnVlCisgICAgICAgIHByaXZhdGUgZmxvYXQgY1BlcmNlbnQ7IC8vIG9ubHkgdXNlZCBpZiBpbnZlcnRlZCA9PSB0cnVlCisgICAgICAgIHByaXZhdGUgZmxvYXQgZFBlcmNlbnQ7IC8vIG9ubHkgdXNlZCBpZiBpbnZlcnRlZCA9PSB0cnVlCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgUGFpbnRDb250ZXh0IHdoaWNoIGRvZXMgbm90IGF0dGVtcHQgdG8gY2FjaGUgb3Igc2NhbGUgYW55IGNhY2hlZAorICAgICAgICAgKiBpbWFnZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbnNldHMgVGhlIHN0cmV0Y2hpbmcgaW5zZXRzLiBNYXkgYmUgbnVsbC4gSWYgbnVsbCwgdGhlbiBhc3N1bWVkIHRvIGJlIDAsIDAsIDAsIDAuCisgICAgICAgICAqIEBwYXJhbSBjYW52YXNTaXplIFRoZSBzaXplIG9mIHRoZSBjYW52YXMgdXNlZCB3aGVuIGVuY29kaW5nIHRoZSB2YXJpb3VzIHgveSB2YWx1ZXMuIE1heSBiZSBudWxsLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBJZiBudWxsLCB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSBhcmUgbm8gZW5jb2RlZCB2YWx1ZXMsIGFuZCBhbnkgY2FsbHMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgdG8gb25lIG9mIHRoZSAiZGVjb2RlIiBtZXRob2RzIHdpbGwgcmV0dXJuIHRoZSBwYXNzZWQgaW4gdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSBpbnZlcnRlZCBXaGV0aGVyIHRvICJpbnZlcnQiIHRoZSBtZWFuaW5nIG9mIHRoZSA5LXNxdWFyZSBncmlkIGFuZCBzdHJldGNoaW5nIGluc2V0cworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBhaW50Q29udGV4dChJbnNldHMgaW5zZXRzLCBEaW1lbnNpb24gY2FudmFzU2l6ZSwgYm9vbGVhbiBpbnZlcnRlZCkgeworICAgICAgICAgICAgdGhpcyhpbnNldHMsIGNhbnZhc1NpemUsIGludmVydGVkLCBudWxsLCAxLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IFBhaW50Q29udGV4dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluc2V0cyBUaGUgc3RyZXRjaGluZyBpbnNldHMuIE1heSBiZSBudWxsLiBJZiBudWxsLCB0aGVuIGFzc3VtZWQgdG8gYmUgMCwgMCwgMCwgMC4KKyAgICAgICAgICogQHBhcmFtIGNhbnZhc1NpemUgVGhlIHNpemUgb2YgdGhlIGNhbnZhcyB1c2VkIHdoZW4gZW5jb2RpbmcgdGhlIHZhcmlvdXMgeC95IHZhbHVlcy4gTWF5IGJlIG51bGwuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgIElmIG51bGwsIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoZXJlIGFyZSBubyBlbmNvZGVkIHZhbHVlcywgYW5kIGFueSBjYWxscworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICB0byBvbmUgb2YgdGhlICJkZWNvZGUiIG1ldGhvZHMgd2lsbCByZXR1cm4gdGhlIHBhc3NlZCBpbiB2YWx1ZS4KKyAgICAgICAgICogQHBhcmFtIGludmVydGVkIFdoZXRoZXIgdG8gImludmVydCIgdGhlIG1lYW5pbmcgb2YgdGhlIDktc3F1YXJlIGdyaWQgYW5kIHN0cmV0Y2hpbmcgaW5zZXRzCisgICAgICAgICAqIEBwYXJhbSBjYWNoZU1vZGUgQSBoaW50IGFzIHRvIHdoaWNoIGNhY2hpbmcgbW9kZSB0byB1c2UuIElmIG51bGwsIHRoZW4gc2V0IHRvIG5vIGNhY2hpbmcuCisgICAgICAgICAqIEBwYXJhbSBtYXhIIFRoZSBtYXhpbWl1bSBzY2FsZSBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24gdG8gdXNlIGJlZm9yZSBwdW50aW5nIGFuZCByZWRyYXdpbmcgZnJvbSBzY3JhdGNoLgorICAgICAgICAgKiAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgbWF4SCBpcyAyLCB0aGVuIHdlIHdpbGwgYXR0ZW1wdCB0byBzY2FsZSBhbnkgY2FjaGVkIGltYWdlcyB1cCB0byAyeCB0aGUgY2FudmFzCisgICAgICAgICAqICAgICAgICAgICAgIHdpZHRoIGJlZm9yZSByZWRyYXdpbmcgZnJvbSBzY3JhdGNoLiBSZWFzb25hYmxlIG1heEggdmFsdWVzIG1heSBpbXByb3ZlIHBhaW50aW5nIHBlcmZvcm1hbmNlLgorICAgICAgICAgKiAgICAgICAgICAgICBJZiBzZXQgdG9vIGhpZ2gsIHRoZW4geW91IG1heSBnZXQgcG9vciBsb29raW5nIGdyYXBoaWNzIGF0IGhpZ2hlciB6b29tIGxldmVscy4gTXVzdCBiZSA+PSAxLgorICAgICAgICAgKiBAcGFyYW0gbWF4ViBUaGUgbWF4aW1pdW0gc2NhbGUgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiB0byB1c2UgYmVmb3JlIHB1bnRpbmcgYW5kIHJlZHJhd2luZyBmcm9tIHNjcmF0Y2guCisgICAgICAgICAqICAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiBtYXhWIGlzIDIsIHRoZW4gd2Ugd2lsbCBhdHRlbXB0IHRvIHNjYWxlIGFueSBjYWNoZWQgaW1hZ2VzIHVwIHRvIDJ4IHRoZSBjYW52YXMKKyAgICAgICAgICogICAgICAgICAgICAgaGVpZ2h0IGJlZm9yZSByZWRyYXdpbmcgZnJvbSBzY3JhdGNoLiBSZWFzb25hYmxlIG1heFYgdmFsdWVzIG1heSBpbXByb3ZlIHBhaW50aW5nIHBlcmZvcm1hbmNlLgorICAgICAgICAgKiAgICAgICAgICAgICBJZiBzZXQgdG9vIGhpZ2gsIHRoZW4geW91IG1heSBnZXQgcG9vciBsb29raW5nIGdyYXBoaWNzIGF0IGhpZ2hlciB6b29tIGxldmVscy4gTXVzdCBiZSA+PSAxLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBhaW50Q29udGV4dChJbnNldHMgaW5zZXRzLCBEaW1lbnNpb24gY2FudmFzU2l6ZSwgYm9vbGVhbiBpbnZlcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZU1vZGUgY2FjaGVNb2RlLCBkb3VibGUgbWF4SCwgZG91YmxlIG1heFYpIHsKKyAgICAgICAgICAgIGlmIChtYXhIIDwgMSB8fCBtYXhIIDwgMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJvdGggbWF4SCBhbmQgbWF4ViBtdXN0IGJlID49IDEiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5zdHJldGNoaW5nSW5zZXRzID0gaW5zZXRzID09IG51bGwgPyBFTVBUWV9JTlNFVFMgOiBpbnNldHM7CisgICAgICAgICAgICB0aGlzLmNhbnZhc1NpemUgPSBjYW52YXNTaXplOworICAgICAgICAgICAgdGhpcy5pbnZlcnRlZCA9IGludmVydGVkOworICAgICAgICAgICAgdGhpcy5jYWNoZU1vZGUgPSBjYWNoZU1vZGUgPT0gbnVsbCA/IENhY2hlTW9kZS5OT19DQUNISU5HIDogY2FjaGVNb2RlOworICAgICAgICAgICAgdGhpcy5tYXhIb3Jpem9udGFsU2NhbGVGYWN0b3IgPSBtYXhIOworICAgICAgICAgICAgdGhpcy5tYXhWZXJ0aWNhbFNjYWxlRmFjdG9yID0gbWF4VjsKKworICAgICAgICAgICAgaWYgKGNhbnZhc1NpemUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGEgPSBpbnNldHMubGVmdDsKKyAgICAgICAgICAgICAgICBiID0gY2FudmFzU2l6ZS53aWR0aCAtIGluc2V0cy5yaWdodDsKKyAgICAgICAgICAgICAgICBjID0gaW5zZXRzLnRvcDsKKyAgICAgICAgICAgICAgICBkID0gY2FudmFzU2l6ZS5oZWlnaHQgLSBpbnNldHMuYm90dG9tOworICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2l6ZSA9IGNhbnZhc1NpemU7CisgICAgICAgICAgICAgICAgdGhpcy5pbnZlcnRlZCA9IGludmVydGVkOworICAgICAgICAgICAgICAgIGlmIChpbnZlcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbGFibGUgPSBjYW52YXNTaXplLndpZHRoIC0gKGIgLSBhKTsKKyAgICAgICAgICAgICAgICAgICAgYVBlcmNlbnQgPSBhdmFpbGFibGUgPiAwZiA/IGEgLyBhdmFpbGFibGUgOiAwZjsKKyAgICAgICAgICAgICAgICAgICAgYlBlcmNlbnQgPSBhdmFpbGFibGUgPiAwZiA/IGIgLyBhdmFpbGFibGUgOiAwZjsKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gY2FudmFzU2l6ZS5oZWlnaHQgLSAoZCAtIGMpOworICAgICAgICAgICAgICAgICAgICBjUGVyY2VudCA9IGF2YWlsYWJsZSA+IDBmID8gYyAvIGF2YWlsYWJsZSA6IDBmOworICAgICAgICAgICAgICAgICAgICBkUGVyY2VudCA9IGF2YWlsYWJsZSA+IDBmID8gZCAvIGF2YWlsYWJsZSA6IDBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcml2YXRlIG1ldGhvZHMKKworICAgIC8vaW5pdGlhbGl6ZXMgdGhlIGNsYXNzIHRvIHByZXBhcmUgaXQgZm9yIGJlaW5nIGFibGUgdG8gZGVjb2RlIHBvaW50cworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlKGZsb2F0IHcsIGZsb2F0IGgpIHsKKyAgICAgICAgLy9pZiBubyBQYWludENvbnRleHQgaGFzIGJlZW4gc3BlY2lmaWVkLCByZXNldCB0aGUgdmFsdWVzIGFuZCBiYWlsCisgICAgICAgIC8vYWxzbyBiYWlsIGlmIHRoZSBjYW52YXNTaXplIHdhcyBub3Qgc2V0IChzaW5jZSBkZWNvZGluZyB3aWxsIG5vdCB3b3JrKQorICAgICAgICBpZiAoY3R4ID09IG51bGwgfHwgY3R4LmNhbnZhc1NpemUgPT0gbnVsbCkgeworICAgICAgICAgICAgZiA9IDFmOworICAgICAgICAgICAgbGVmdFdpZHRoID0gY2VudGVyV2lkdGggPSByaWdodFdpZHRoID0gMGY7CisgICAgICAgICAgICB0b3BIZWlnaHQgPSBjZW50ZXJIZWlnaHQgPSBib3R0b21IZWlnaHQgPSAwZjsKKyAgICAgICAgICAgIGxlZnRTY2FsZSA9IGNlbnRlckhTY2FsZSA9IHJpZ2h0U2NhbGUgPSAwZjsKKyAgICAgICAgICAgIHRvcFNjYWxlID0gY2VudGVyVlNjYWxlID0gYm90dG9tU2NhbGUgPSAwZjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vY2FsY3VsYXRlIHRoZSBzY2FsaW5nIGZhY3RvciwgYW5kIHRoZSBzaXplcyBmb3IgdGhlIHZhcmlvdXMgOS1zcXVhcmUgc2VjdGlvbnMKKyAgICAgICAgTnVtYmVyIHNjYWxlID0gKE51bWJlcilVSU1hbmFnZXIuZ2V0KCJzY2FsZSIpOworICAgICAgICBmID0gc2NhbGUgPT0gbnVsbCA/IDFmIDogc2NhbGUuZmxvYXRWYWx1ZSgpOworCisgICAgICAgIGlmIChjdHguaW52ZXJ0ZWQpIHsKKyAgICAgICAgICAgIGNlbnRlcldpZHRoID0gKGN0eC5iIC0gY3R4LmEpICogZjsKKyAgICAgICAgICAgIGZsb2F0IGF2YWlsYWJsZVNwYWNlID0gdyAtIGNlbnRlcldpZHRoOworICAgICAgICAgICAgbGVmdFdpZHRoID0gYXZhaWxhYmxlU3BhY2UgKiBjdHguYVBlcmNlbnQ7CisgICAgICAgICAgICByaWdodFdpZHRoID0gYXZhaWxhYmxlU3BhY2UgKiBjdHguYlBlcmNlbnQ7CisgICAgICAgICAgICBjZW50ZXJIZWlnaHQgPSAoY3R4LmQgLSBjdHguYykgKiBmOworICAgICAgICAgICAgYXZhaWxhYmxlU3BhY2UgPSBoIC0gY2VudGVySGVpZ2h0OworICAgICAgICAgICAgdG9wSGVpZ2h0ID0gYXZhaWxhYmxlU3BhY2UgKiBjdHguY1BlcmNlbnQ7CisgICAgICAgICAgICBib3R0b21IZWlnaHQgPSBhdmFpbGFibGVTcGFjZSAqIGN0eC5kUGVyY2VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlZnRXaWR0aCA9IGN0eC5hICogZjsKKyAgICAgICAgICAgIHJpZ2h0V2lkdGggPSAoZmxvYXQpKGN0eC5jYW52YXNTaXplLmdldFdpZHRoKCkgLSBjdHguYikgKiBmOworICAgICAgICAgICAgY2VudGVyV2lkdGggPSB3IC0gbGVmdFdpZHRoIC0gcmlnaHRXaWR0aDsKKyAgICAgICAgICAgIHRvcEhlaWdodCA9IGN0eC5jICogZjsKKyAgICAgICAgICAgIGJvdHRvbUhlaWdodCA9IChmbG9hdCkoY3R4LmNhbnZhc1NpemUuZ2V0SGVpZ2h0KCkgLSBjdHguZCkgKiBmOworICAgICAgICAgICAgY2VudGVySGVpZ2h0ID0gaCAtIHRvcEhlaWdodCAtIGJvdHRvbUhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGxlZnRTY2FsZSA9IGN0eC5hID09IDBmID8gMGYgOiBsZWZ0V2lkdGggLyBjdHguYTsKKyAgICAgICAgY2VudGVySFNjYWxlID0gKGN0eC5iIC0gY3R4LmEpID09IDBmID8gMGYgOiBjZW50ZXJXaWR0aCAvIChjdHguYiAtIGN0eC5hKTsKKyAgICAgICAgcmlnaHRTY2FsZSA9IChjdHguY2FudmFzU2l6ZS53aWR0aCAtIGN0eC5iKSA9PSAwZiA/IDBmIDogcmlnaHRXaWR0aCAvIChjdHguY2FudmFzU2l6ZS53aWR0aCAtIGN0eC5iKTsKKyAgICAgICAgdG9wU2NhbGUgPSBjdHguYyA9PSAwZiA/IDBmIDogdG9wSGVpZ2h0IC8gY3R4LmM7CisgICAgICAgIGNlbnRlclZTY2FsZSA9IChjdHguZCAtIGN0eC5jKSA9PSAwZiA/IDBmIDogY2VudGVySGVpZ2h0IC8gKGN0eC5kIC0gY3R4LmMpOworICAgICAgICBib3R0b21TY2FsZSA9IChjdHguY2FudmFzU2l6ZS5oZWlnaHQgLSBjdHguZCkgPT0gMGYgPyAwZiA6IGJvdHRvbUhlaWdodCAvIChjdHguY2FudmFzU2l6ZS5oZWlnaHQgLSBjdHguZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhaW50V2l0aDlTcXVhcmVDYWNoaW5nKEdyYXBoaWNzMkQgZywgUGFpbnRDb250ZXh0IGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkNvbXBvbmVudCBjLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGV4dGVuZGVkQ2FjaGVLZXlzKSB7CisgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiBzY2FsZSB0byB0aGUgcmVxdWVzdGVkIHNpemUKKyAgICAgICAgRGltZW5zaW9uIGNhbnZhcyA9IGN0eC5jYW52YXNTaXplOworICAgICAgICBJbnNldHMgaW5zZXRzID0gY3R4LnN0cmV0Y2hpbmdJbnNldHM7CisKKyAgICAgICAgaWYgKHcgPD0gKGNhbnZhcy53aWR0aCAqIGN0eC5tYXhIb3Jpem9udGFsU2NhbGVGYWN0b3IpICYmIGggPD0gKGNhbnZhcy5oZWlnaHQgKiBjdHgubWF4VmVydGljYWxTY2FsZUZhY3RvcikpIHsKKyAgICAgICAgICAgIC8vIGdldCBpbWFnZSBhdCBjYW52YXMgc2l6ZQorICAgICAgICAgICAgVm9sYXRpbGVJbWFnZSBpbWcgPSBnZXRJbWFnZShnLmdldERldmljZUNvbmZpZ3VyYXRpb24oKSwgYywgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0LCBleHRlbmRlZENhY2hlS2V5cyk7CisgICAgICAgICAgICBpZiAoaW1nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgZHN0IGluc2VydHMKKyAgICAgICAgICAgICAgICAvLyB0b2RvOiBkZXN0aW5hdGlvbiBpbnNlcnRzIG5lZWQgdG8gdGFrZSBpbnRvIGFjb3VudCBzY2FsZSBmYWN0b3IgZm9yIGhpZ2ggZHBpLiBOb3RlOiBZb3UgY2FuIHVzZSBmIGZvciB0aGlzLCBJIHRoaW5rCisgICAgICAgICAgICAgICAgSW5zZXRzIGRzdEluc2V0czsKKyAgICAgICAgICAgICAgICBpZiAoY3R4LmludmVydGVkKXsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRSaWdodCA9ICh3LShjYW52YXMud2lkdGgtKGluc2V0cy5sZWZ0K2luc2V0cy5yaWdodCkpKS8yOworICAgICAgICAgICAgICAgICAgICBpbnQgdG9wQm90dG9tID0gKGgtKGNhbnZhcy5oZWlnaHQtKGluc2V0cy50b3AraW5zZXRzLmJvdHRvbSkpKS8yOworICAgICAgICAgICAgICAgICAgICBkc3RJbnNldHMgPSBuZXcgSW5zZXRzKHRvcEJvdHRvbSxsZWZ0UmlnaHQsdG9wQm90dG9tLGxlZnRSaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0SW5zZXRzID0gaW5zZXRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBwYWludCA5IHNxdWFyZSBzY2FsZWQKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2xkU2NhbGVpbmdIaW50cyA9IGcuZ2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfSU5URVJQT0xBVElPTik7CisgICAgICAgICAgICAgICAgZy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9JTlRFUlBPTEFUSU9OLFJlbmRlcmluZ0hpbnRzLlZBTFVFX0lOVEVSUE9MQVRJT05fQklMSU5FQVIpOworICAgICAgICAgICAgICAgIEltYWdlU2NhbGluZ0hlbHBlci5wYWludChnLCAwLCAwLCB3LCBoLCBpbWcsIGluc2V0cywgZHN0SW5zZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VTY2FsaW5nSGVscGVyLlBhaW50VHlwZS5QQUlOVDlfU1RSRVRDSCwgSW1hZ2VTY2FsaW5nSGVscGVyLlBBSU5UX0FMTCk7CisgICAgICAgICAgICAgICAgZy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9JTlRFUlBPTEFUSU9OLAorICAgICAgICAgICAgICAgICAgICBvbGRTY2FsZWluZ0hpbnRzIT1udWxsP29sZFNjYWxlaW5nSGludHM6UmVuZGVyaW5nSGludHMuVkFMVUVfSU5URVJQT0xBVElPTl9ORUFSRVNUX05FSUdIQk9SKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcmVuZGVyIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgcGFpbnQwKGcsIGMsIHcsIGgsIGV4dGVuZGVkQ2FjaGVLZXlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHBhaW50IGRpcmVjdGx5CisgICAgICAgICAgICBwYWludDAoZywgYywgdywgaCwgZXh0ZW5kZWRDYWNoZUtleXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhaW50V2l0aEZpeGVkU2l6ZUNhY2hpbmcoR3JhcGhpY3MyRCBnLCBKQ29tcG9uZW50IGMsIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBPYmplY3RbXSBleHRlbmRlZENhY2hlS2V5cykgeworICAgICAgICBWb2xhdGlsZUltYWdlIGltZyA9IGdldEltYWdlKGcuZ2V0RGV2aWNlQ29uZmlndXJhdGlvbigpLCBjLCB3LCBoLCBleHRlbmRlZENhY2hlS2V5cyk7CisgICAgICAgIGlmIChpbWcgIT0gbnVsbCkgeworICAgICAgICAgICAgLy9yZW5kZXIgY2FjaGVkIGltYWdlCisgICAgICAgICAgICBnLmRyYXdJbWFnZShpbWcsIDAsIDAsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVuZGVyIGRpcmVjdGx5CisgICAgICAgICAgICBwYWludDAoZywgYywgdywgaCwgZXh0ZW5kZWRDYWNoZUtleXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldHMgdGhlIHJlbmRlcmVkIGltYWdlIGZvciB0aGlzIHBhaW50ZXIgYXQgdGhlIHJlcXVlc3RlZCBzaXplLCBlaXRoZXIgZnJvbSBjYWNoZSBvciBjcmVhdGUgYSBuZXcgb25lICovCisgICAgcHJpdmF0ZSBWb2xhdGlsZUltYWdlIGdldEltYWdlKEdyYXBoaWNzQ29uZmlndXJhdGlvbiBjb25maWcsIEpDb21wb25lbnQgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBPYmplY3RbXSBleHRlbmRlZENhY2hlS2V5cykgeworICAgICAgICBJbWFnZUNhY2hlIGltYWdlQ2FjaGUgPSBJbWFnZUNhY2hlLmdldEluc3RhbmNlKCk7CisgICAgICAgIC8vZ2V0IHRoZSBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50CisgICAgICAgIFZvbGF0aWxlSW1hZ2UgYnVmZmVyID0gKFZvbGF0aWxlSW1hZ2UpIGltYWdlQ2FjaGUuZ2V0SW1hZ2UoY29uZmlnLCB3LCBoLCB0aGlzLCBleHRlbmRlZENhY2hlS2V5cyk7CisKKyAgICAgICAgaW50IHJlbmRlckNvdW50ZXIgPSAwOyAvL3RvIGF2b2lkIGFueSBwb3RlbnRpYWwsIHRob3VnaCB1bmxpa2VseSwgaW5maW5pdGUgbG9vcAorICAgICAgICBkbyB7CisgICAgICAgICAgICAvL3ZhbGlkYXRlIHRoZSBidWZmZXIgc28gd2UgY2FuIGNoZWNrIGZvciBzdXJmYWNlIGxvc3MKKyAgICAgICAgICAgIGludCBidWZmZXJTdGF0dXMgPSBWb2xhdGlsZUltYWdlLklNQUdFX0lOQ09NUEFUSUJMRTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlclN0YXR1cyA9IGJ1ZmZlci52YWxpZGF0ZShjb25maWcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0lmIHRoZSBidWZmZXIgc3RhdHVzIGlzIGluY29tcGF0aWJsZSBvciByZXN0b3JlZCwgdGhlbiB3ZSBuZWVkIHRvIHJlLXJlbmRlciB0byB0aGUgdm9sYXRpbGUgaW1hZ2UKKyAgICAgICAgICAgIGlmIChidWZmZXJTdGF0dXMgPT0gVm9sYXRpbGVJbWFnZS5JTUFHRV9JTkNPTVBBVElCTEUgfHwgYnVmZmVyU3RhdHVzID09IFZvbGF0aWxlSW1hZ2UuSU1BR0VfUkVTVE9SRUQpIHsKKyAgICAgICAgICAgICAgICAvL2lmIHRoZSBidWZmZXIgaXMgbnVsbCAoaGFzbid0IGJlZW4gY3JlYXRlZCksIG9yIGlzbid0IHRoZSByaWdodCBzaXplLCBvciBoYXMgbG9zdCBpdHMgY29udGVudHMsCisgICAgICAgICAgICAgICAgLy90aGVuIHJlY3JlYXRlIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwgfHwgYnVmZmVyLmdldFdpZHRoKCkgIT0gdyB8fCBidWZmZXIuZ2V0SGVpZ2h0KCkgIT0gaCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU3RhdHVzID09IFZvbGF0aWxlSW1hZ2UuSU1BR0VfSU5DT01QQVRJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vY2xlYXIgYW55IHJlc291cmNlcyByZWxhdGVkIHRvIHRoZSBvbGQgYmFjayBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9yZWNyZWF0ZSB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNvbmZpZy5jcmVhdGVDb21wYXRpYmxlVm9sYXRpbGVJbWFnZSh3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHB1dCBpbiBjYWNoZSBmb3IgZnV0dXJlCisgICAgICAgICAgICAgICAgICAgIGltYWdlQ2FjaGUuc2V0SW1hZ2UoYnVmZmVyLCBjb25maWcsIHcsIGgsIHRoaXMsIGV4dGVuZGVkQ2FjaGVLZXlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9jcmVhdGUgdGhlIGdyYXBoaWNzIGNvbnRleHQgd2l0aCB3aGljaCB0byBwYWludCB0byB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgR3JhcGhpY3MyRCBiZyA9IGJ1ZmZlci5jcmVhdGVHcmFwaGljcygpOworICAgICAgICAgICAgICAgIC8vY2xlYXIgdGhlIGJhY2tncm91bmQgYmVmb3JlIGNvbmZpZ3VyaW5nIHRoZSBncmFwaGljcworICAgICAgICAgICAgICAgIGJnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0ZS5DbGVhcik7CisgICAgICAgICAgICAgICAgYmcuZmlsbFJlY3QoMCwgMCwgdywgaCk7CisgICAgICAgICAgICAgICAgYmcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLlNyY092ZXIpOworICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUdyYXBoaWNzKGJnKTsKKyAgICAgICAgICAgICAgICAvLyBwYWludCB0aGUgcGFpbnRlciBpbnRvIGJ1ZmZlcgorICAgICAgICAgICAgICAgIHBhaW50MChiZywgYywgdywgaCwgZXh0ZW5kZWRDYWNoZUtleXMpOworICAgICAgICAgICAgICAgIC8vY2xvc2UgYnVmZmVyIGdyYXBoaWNzCisgICAgICAgICAgICAgICAgYmcuZGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChidWZmZXIuY29udGVudHNMb3N0KCkgJiYgcmVuZGVyQ291bnRlcisrIDwgMyk7CisgICAgICAgIC8vIGNoZWNrIGlmIHdlIGZhaWxlZAorICAgICAgICBpZiAocmVuZGVyQ291bnRlciA9PSAzKSByZXR1cm4gbnVsbDsKKyAgICAgICAgLy8gcmV0dXJuIGltYWdlCisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorCisgICAgLy9jb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY3JlYXRlcyBhIHRlbXBvcmFyeSBncmFwaGljcyBvYmplY3QgYnkgY3JlYXRpbmcgYQorICAgIC8vY2xvbmUgb2YgdGhlIHBhc3NlZCBpbiBvbmUsIGNvbmZpZ3VyaW5nIGl0LCBkcmF3aW5nIHdpdGggaXQsIGRpc3Bvc2luZyBpdC4KKyAgICAvL1RoZXNlIHN0ZXBzIGhhdmUgdG8gYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgYW55IGhpbnRzIHNldCBvbiB0aGUgZ3JhcGhpY3MKKyAgICAvL2FyZSByZW1vdmVkIHN1YnNlcXVlbnQgdG8gcGFpbnRpbmcuCisgICAgcHJpdmF0ZSB2b2lkIHBhaW50MChHcmFwaGljczJEIGcsIEpDb21wb25lbnQgYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gZXh0ZW5kZWRDYWNoZUtleXMpIHsKKyAgICAgICAgcHJlcGFyZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZyA9IChHcmFwaGljczJEKWcuY3JlYXRlKCk7CisgICAgICAgIGNvbmZpZ3VyZUdyYXBoaWNzKGcpOworICAgICAgICBkb1BhaW50KGcsIGMsIHdpZHRoLCBoZWlnaHQsIGV4dGVuZGVkQ2FjaGVLZXlzKTsKKyAgICAgICAgZy5kaXNwb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmbG9hdCBjbGFtcChmbG9hdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiAxKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNsYW1wKGludCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiAyNTUpIHsKKyAgICAgICAgICAgIHZhbHVlID0gMjU1OworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvRGVmYXVsdHMudGVtcGxhdGUgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvRGVmYXVsdHMudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmNWFmYwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9EZWZhdWx0cy50ZW1wbGF0ZQpAQCAtMCwwICsxLDg3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSAke1BBQ0tBR0V9OworCitpbXBvcnQgamF2YXguc3dpbmcuUGFpbnRlcjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKK2ltcG9ydCBzdW4uZm9udC5Gb250TWFuYWdlcjsKK2ltcG9ydCBzdW4uc3dpbmcucGxhZi5zeW50aC5EZWZhdWx0U3ludGhTdHlsZTsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkludGVybmFsRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKK2ltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7CitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5Cb3JkZXJVSVJlc291cmNlOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuQ29sb3JVSVJlc291cmNlOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuRGltZW5zaW9uVUlSZXNvdXJjZTsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLkZvbnRVSVJlc291cmNlOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuSW5zZXRzVUlSZXNvdXJjZTsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLlJlZ2lvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoU3R5bGU7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuSW5zZXRzOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CitpbXBvcnQgc3RhdGljIGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2UuKjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLlVJUmVzb3VyY2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBhbGwgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgcmVsYXRlZCB0bworICogJHtMQUZfTkFNRX0uIEl0IGNvbnRhaW5zIGFsbCB0aGUgY29kZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBVSURlZmF1bHRzIHRhYmxlLAorICogYXMgd2VsbCBhcyBmb3Igc2VsZWN0aW5nCisgKiBhIFN5bnRoU3R5bGUgYmFzZWQgb24gYSBKQ29tcG9uZW50L1JlZ2lvbiBwYWlyLgorICoKKyAqIEBhdXRob3IgUmljaGFyZCBCYWlyCisgKi8KK2ZpbmFsIGNsYXNzICR7TEFGX05BTUV9RGVmYXVsdHMgeworICAgIC8qKgorICAgICAqIFRoZSBtYXAgb2YgU3ludGhTdHlsZXMuIFRoaXMgbWFwIGlzIGtleWVkIGJ5IFJlZ2lvbi4gRWFjaCBSZWdpb24gbWFwcworICAgICAqIHRvIGEgTGlzdCBvZiBMYXp5U3R5bGVzLiBFYWNoIExhenlTdHlsZSBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIHByZWZpeAorICAgICAqIHRoYXQgd2FzIHJlZ2lzdGVyZWQgd2l0aCBpdC4gVGhpcyByZWZlcmVuY2UgY2FuIHRoZW4gYmUgaW5zcGVjdGVkIHRvIHNlZQorICAgICAqIGlmIGl0IGlzIHRoZSBwcm9wZXIgbGF6eSBzdHlsZS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgTGF6eVN0eWxlIGZvciBhIHNpbmdsZSBSZWdpb24gaWYgdGhlcmUgaXMgbW9yZQorICAgICAqIHRoYW4gb25lIHByZWZpeCBkZWZpbmVkIGZvciBhIGdpdmVuIHJlZ2lvbi4gRm9yIGV4YW1wbGUsIGJvdGggQnV0dG9uIGFuZAorICAgICAqICJNeUJ1dHRvbiIgbWlnaHQgYmUgcHJlZml4ZXMgYXNzaWduZWQgdG8gdGhlIFJlZ2lvbi5CdXR0b24gcmVnaW9uLgorICAgICAqLworICAgIHByaXZhdGUgTWFwPFJlZ2lvbiwgTGlzdDxMYXp5U3R5bGU+PiBtOworICAgIC8qKgorICAgICAqIEEgbWFwIG9mIHJlZ2lvbnMgd2hpY2ggaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCisgICAgICogVGhpcyBtYXBwaW5nIGlzIG1haW50YWluZWQgc28gdGhhdCB0aGUgUmVnaW9uIGNhbiBiZSBmb3VuZCBiYXNlZCBvbgorICAgICAqIHByZWZpeCBpbiBhIHZlcnkgZmFzdCBtYW5uZXIuIFRoaXMgaXMgdXNlZCBpbiB0aGUgIm1hdGNoZXMiIG1ldGhvZCBvZgorICAgICAqIExhenlTdHlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlZ2lvbj4gcmVnaXN0ZXJlZFJlZ2lvbnMgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBSZWdpb24+KCk7CisgICAgLyoqCisgICAgICogT3VyIGZhbGxiYWNrIHN0eWxlIHRvIGF2b2lkIE5QRXMgaWYgdGhlIHByb3BlciBzdHlsZSBjYW5ub3QgYmUgZm91bmQgaW4KKyAgICAgKiB0aGlzIGNsYXNzLiBOb3Qgc3VyZSBpZiByZWx5aW5nIG9uIERlZmF1bHRTeW50aFN0eWxlIGlzIHRoZSBiZXN0IGNob2ljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIERlZmF1bHRTeW50aFN0eWxlIGRlZmF1bHRTdHlsZTsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBmb250IHRoYXQgd2lsbCBiZSB1c2VkLiBJIHN0b3JlIHRoaXMgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUKKyAgICAgKiBzZXQgaW4gdGhlIFVJRGVmYXVsdHMgd2hlbiByZXF1ZXN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGb250VUlSZXNvdXJjZSBkZWZhdWx0Rm9udDsKKworICAgIC8qKgorICAgICAqIE1hcCBvZiBsaXN0cyBvZiBkZXJpdmVkIGNvbG9ycyBrZXllZCBieSB0aGUgRGVyaXZlZENvbG9yS2V5cworICAgICAqLworICAgIHByaXZhdGUgTWFwPERlcml2ZWRDb2xvcktleSwgRGVyaXZlZENvbG9yPiBkZXJpdmVkQ29sb3JzTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPERlcml2ZWRDb2xvcktleSwgRGVyaXZlZENvbG9yPigpOworCisgICAgLyoqIFRlbXBvcnkga2V5IHVzZWQgZm9yIGZldGNoaW5nIGZyb20gdGhlIGRlcml2ZWRDb2xvcnNNYXAgKi8KKyAgICBwcml2YXRlIGZpbmFsIERlcml2ZWRDb2xvcktleSB0bXBEQ0tleSA9IG5ldyBEZXJpdmVkQ29sb3JLZXkoKTsKKworICAgIC8qKiBMaXN0ZW5lciBmb3IgY2hhbmdlcyB0byB1c2VyIGRlZmF1bHRzIHRhYmxlICovCisgICAgcHJpdmF0ZSBEZWZhdWx0c0xpc3RlbmVyIGRlZmF1bHRzTGlzdGVuZXIgPSBuZXcgRGVmYXVsdHNMaXN0ZW5lcigpOworCisgICAgLyoqIENhbGxlZCBieSBVSU1hbmFnZXIgd2hlbiB0aGlzIGxvb2sgYW5kIGZlZWwgaXMgaW5zdGFsbGVkLiAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgLy8gYWRkIGxpc3RlbmVyIGZvciBkZXJpdmVkIGNvbG9ycworICAgICAgICBVSU1hbmFnZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihkZWZhdWx0c0xpc3RlbmVyKTsKKyAgICAgICAgVUlNYW5hZ2VyLmdldERlZmF1bHRzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihkZWZhdWx0c0xpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIGJ5IFVJTWFuYWdlciB3aGVuIHRoaXMgbG9vayBhbmQgZmVlbCBpcyB1bmluc3RhbGxlZC4gKi8KKyAgICB2b2lkIHVuaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgLy8gcmVtb3ZlIGxpc3RlbmVyIGZvciBkZXJpdmVkIGNvbG9ycworICAgICAgICBVSU1hbmFnZXIuZ2V0RGVmYXVsdHMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGRlZmF1bHRzTGlzdGVuZXIpOworICAgICAgICBVSU1hbmFnZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihkZWZhdWx0c0xpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgJHtMQUZfTkFNRX1EZWZhdWx0cy4gVGhpcyBjb25zdHJ1Y3RvciBpcyBvbmx5IGNhbGxlZCBmcm9tCisgICAgICogd2l0aGluICR7TEFGX05BTUV9TG9va0FuZEZlZWwuCisgICAgICovCisgICAgJHtMQUZfTkFNRX1EZWZhdWx0cygpIHsKKyAgICAgICAgbSA9IG5ldyBIYXNoTWFwPFJlZ2lvbiwgTGlzdDxMYXp5U3R5bGU+PigpOworCisgICAgICAgIC8vQ3JlYXRlIHRoZSBkZWZhdWx0IGZvbnQgYW5kIGRlZmF1bHQgc3R5bGUuIEFsc28gcmVnaXN0ZXIgYWxsIG9mIHRoZQorICAgICAgICAvL3JlZ2lvbnMgYW5kIHRoZWlyIHN0YXRlcyB0aGF0IHRoaXMgY2xhc3Mgd2lsbCB1c2UgZm9yIGxhdGVyIGxvb2t1cC4KKyAgICAgICAgLy9BZGRpdGlvbmFsIHJlZ2lvbnMgY2FuIGJlIHJlZ2lzdGVyZWQgbGF0ZXIgYnkgM3JkIHBhcnR5IGNvbXBvbmVudHMuCisgICAgICAgIC8vVGhlc2UgYXJlIHNpbXBseSB0aGUgZGVmYXVsdCByZWdpc3RyYXRpb25zLgorICAgICAgICBkZWZhdWx0Rm9udCA9IEZvbnRNYW5hZ2VyLmdldEZvbnRDb25maWdGVUlSKCJzYW5zIiwgRm9udC5QTEFJTiwgMTIpOworICAgICAgICBkZWZhdWx0U3R5bGUgPSBuZXcgRGVmYXVsdFN5bnRoU3R5bGUoKTsKKyAgICAgICAgZGVmYXVsdFN0eWxlLnNldEZvbnQoZGVmYXVsdEZvbnQpOworCisgICAgICAgIC8vaW5pdGlhbGl6ZSB0aGUgbWFwIG9mIHN0eWxlcworJHtTVFlMRV9JTklUfQorICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tIE1ldGhvZHMgY2FsbGVkIGJ5ICR7TEFGX05BTUV9TG9va0FuZEZlZWwKKworICAgIC8qKgorICAgICAqIENhbGxlZCBmcm9tICR7TEFGX05BTUV9TG9va0FuZEZlZWwgdG8gaW5pdGlhbGl6ZSB0aGUgVUlEZWZhdWx0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkIFVJRGVmYXVsdHMgdGFibGUgdG8gaW5pdGlhbGl6ZS4gVGhpcyB3aWxsIG5ldmVyIGJlIG51bGwuCisgICAgICogICAgICAgICAgSWYgbGlzdGVuZXJzIGFyZSBhdHRhY2hlZCB0byA8Y29kZT5kPC9jb2RlPiwgdGhlbiB5b3Ugd2lsbAorICAgICAqICAgICAgICAgIG9ubHkgcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgTG9va0FuZEZlZWwgbGV2ZWwgZGVmYXVsdHMsIG5vdAorICAgICAqICAgICAgICAgIGFsbCBkZWZhdWx0cyBvbiB0aGUgVUlNYW5hZ2VyLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKFVJRGVmYXVsdHMgZCkgeworJHtVSV9ERUZBVUxUX0lOSVR9CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmVnaXN0ZXJzIHRoZSBnaXZlbiByZWdpb24gYW5kIHByZWZpeC4gVGhlIHByZWZpeCwgaWYgaXQgY29udGFpbnMKKyAgICAgKiBxdW90ZWQgc2VjdGlvbnMsIHJlZmVycyB0byBjZXJ0YWluIG5hbWVkIGNvbXBvbmVudHMuIElmIHRoZXJlIGFyZSBub3QKKyAgICAgKiBxdW90ZWQgc2VjdGlvbnMsIHRoZW4gdGhlIHByZWZpeCByZWZlcnMgdG8gYSBnZW5lcmljIGNvbXBvbmVudCB0eXBlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBnaXZlbiByZWdpb24vcHJlZml4IGNvbWJvIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbgorICAgICAqIGl0IHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQgdHdpY2UuIFRoZSBzZWNvbmQgcmVnaXN0cmF0aW9uIGF0dGVtcHQgd2lsbAorICAgICAqIGZhaWwgc2lsZW50bHkuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlZ2lvbiBUaGUgU3ludGggUmVnaW9uIHRoYXQgaXMgYmVpbmcgcmVnaXN0ZXJlZC4gU3VjaCBhcyBCdXR0b24sCisgICAgICogICAgICAgIG9yIFNjcm9sbEJhclRodW1iLgorICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIFVJRGVmYXVsdCBwcmVmaXguIEZvciBleGFtcGxlLCBjb3VsZCBiZSBDb21ib0JveCwgb3IgaWYKKyAgICAgKiAgICAgICAgYSBuYW1lZCBjb21wb25lbnRzLCAiTXlDb21ib0JveCIsIG9yIGV2ZW4gc29tZXRoaW5nIGxpa2UKKyAgICAgKiAgICAgICAgVG9vbEJhcjoiTXlDb21ib0JveCI6IkNvbWJvQm94LmFycm93QnV0dG9uIgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXIoUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHByZWZpeCkgeworICAgICAgICAvL3ZhbGlkYXRlIHRoZSBtZXRob2QgYXJndW1lbnRzCisgICAgICAgIGlmIChyZWdpb24gPT0gbnVsbCB8fCBwcmVmaXggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5laXRoZXIgUmVnaW9uIG5vciBQcmVmaXggbWF5IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vQWRkIGEgTGF6eVN0eWxlIGZvciB0aGlzIHJlZ2lvbi9wcmVmaXggdG8gbS4KKyAgICAgICAgTGlzdDxMYXp5U3R5bGU+IHN0eWxlcyA9IG0uZ2V0KHJlZ2lvbik7CisgICAgICAgIGlmIChzdHlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgc3R5bGVzID0gbmV3IExpbmtlZExpc3Q8TGF6eVN0eWxlPigpOworICAgICAgICAgICAgc3R5bGVzLmFkZChuZXcgTGF6eVN0eWxlKHByZWZpeCkpOworICAgICAgICAgICAgbS5wdXQocmVnaW9uLCBzdHlsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9pdGVyYXRlIG92ZXIgYWxsIHRoZSBjdXJyZW50IHN0eWxlcyBhbmQgc2VlIGlmIHRoaXMgcHJlZml4IGhhcworICAgICAgICAgICAgLy9hbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZC4gSWYgbm90LCB0aGVuIHJlZ2lzdGVyIGl0LgorICAgICAgICAgICAgZm9yIChMYXp5U3R5bGUgcyA6IHN0eWxlcykgeworICAgICAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKHMucHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3R5bGVzLmFkZChuZXcgTGF6eVN0eWxlKHByZWZpeCkpOworICAgICAgICB9CisKKyAgICAgICAgLy9hZGQgdGhpcyByZWdpb24gdG8gdGhlIG1hcCBvZiByZWdpc3RlcmVkIHJlZ2lvbnMKKyAgICAgICAgcmVnaXN0ZXJlZFJlZ2lvbnMucHV0KHJlZ2lvbi5nZXROYW1lKCksIHJlZ2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9jYXRlIHRoZSBzdHlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHJlZ2lvbiwgYW5kIGNvbXBvbmVudC4KKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tICR7TEFGX05BTUV9TG9va0FuZEZlZWwgaW4gdGhlIFN5bnRoU3R5bGVGYWN0b3J5CisgICAgICogaW1wbGVtZW50YXRpb24uPC9wPgorICAgICAqCisgICAgICogPHA+TG9va3VwIG9jY3VycyBhcyBmb2xsb3dzOjxici8+CisgICAgICogQ2hlY2sgdGhlIG1hcCBvZiBzdHlsZXMgPGNvZGU+bTwvY29kZT4uIElmIHRoZSBtYXAgY29udGFpbnMgbm8gc3R5bGVzIGF0CisgICAgICogYWxsLCB0aGVuIHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHRTdHlsZS4gSWYgdGhlIG1hcCBjb250YWlucyBzdHlsZXMsCisgICAgICogdGhlbiBpdGVyYXRlIG92ZXIgYWxsIG9mIHRoZSBzdHlsZXMgZm9yIHRoZSBSZWdpb24gPGNvZGU+cjwvY29kZT4gbG9va2luZworICAgICAqIGZvciB0aGUgYmVzdCBtYXRjaCwgYmFzZWQgb24gcHJlZml4LiBJZiBhIG1hdGNoIHdhcyBtYWRlLCB0aGVuIHJldHVybgorICAgICAqIHRoYXQgU3ludGhTdHlsZS4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGRlZmF1bHRTdHlsZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcCBUaGUgY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlZ2lvbi4gRm9yIGV4YW1wbGUsIGlmCisgICAgICogICAgICAgIHRoZSBSZWdpb24gaXMgUmVnaW9uLkJ1dHRvbiB0aGVuIHRoZSBjb21wb25lbnQgd2lsbCBiZSBhIEpCdXR0b24uCisgICAgICogICAgICAgIElmIHRoZSBSZWdpb24gaXMgYSBzdWJyZWdpb24sIHN1Y2ggYXMgU2Nyb2xsQmFyVGh1bWIsIHRoZW4gdGhlCisgICAgICogICAgICAgIGFzc29jaWF0ZWQgY29tcG9uZW50IHdpbGwgYmUgdGhlIGNvbXBvbmVudCB0aGF0IHN1YnJlZ2lvbiBiZWxvbmdzCisgICAgICogICAgICAgIHRvLCBzdWNoIGFzIEpTY3JvbGxCYXIuIFRoZSBKQ29tcG9uZW50IG1heSBiZSBuYW1lZC4gSXQgbWF5IG5vdCBiZQorICAgICAqICAgICAgICBudWxsLgorICAgICAqIEBwYXJhbSByIFRoZSByZWdpb24gd2UgYXJlIGxvb2tpbmcgZm9yIGEgc3R5bGUgZm9yLiBNYXkgbm90IGJlIG51bGwuCisgICAgICovCisgICAgU3ludGhTdHlsZSBnZXRTdHlsZShKQ29tcG9uZW50IGNvbXAsIFJlZ2lvbiByKSB7CisgICAgICAgIC8vdmFsaWRhdGUgbWV0aG9kIGFyZ3VtZW50cworICAgICAgICBpZiAoY29tcCA9PSBudWxsIHx8IHIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5laXRoZXIgY29tcCBub3IgciBtYXkgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgLy9pZiB0aGVyZSBhcmUgbm8gbGF6eSBzdHlsZXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHJlZ2lvbiByLCB0aGVuIHJldHVybgorICAgICAgICAvL3RoZSBkZWZhdWx0IHN0eWxlCisgICAgICAgIExpc3Q8TGF6eVN0eWxlPiBzdHlsZXMgPSBtLmdldChyKTsKKyAgICAgICAgaWYgKHN0eWxlcyA9PSBudWxsIHx8IHN0eWxlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRTdHlsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vTG9vayBmb3IgdGhlIGJlc3QgU3ludGhTdHlsZSBmb3IgdGhpcyBjb21wb25lbnQvcmVnaW9uIHBhaXIuCisgICAgICAgIExhenlTdHlsZSBmb3VuZFN0eWxlID0gbnVsbDsKKyAgICAgICAgZm9yIChMYXp5U3R5bGUgcyA6IHN0eWxlcykgeworICAgICAgICAgICAgaWYgKHMubWF0Y2hlcyhjb21wKSkgeworICAgICAgICAgICAgICAgIC8vcmVwbGFjZSB0aGUgZm91bmRTdHlsZSBpZiBmb3VuZFN0eWxlIGlzIG51bGwsIG9yCisgICAgICAgICAgICAgICAgLy9pZiB0aGUgbmV3IHN0eWxlICJzIiBpcyBtb3JlIHNwZWNpZmljIChpZSwgaXRzIHBhdGggd2FzCisgICAgICAgICAgICAgICAgLy9sb25nZXIpLCBvciBpZiB0aGUgZm91bmRTdHlsZSB3YXMgInNpbXBsZSIgYW5kIHRoZSBuZXcgc3R5bGUKKyAgICAgICAgICAgICAgICAvL3dhcyBub3QgKGllOiB0aGUgZm91bmRTdHlsZSB3YXMgZm9yIHNvbWV0aGluZyBsaWtlIEJ1dHRvbiBhbmQKKyAgICAgICAgICAgICAgICAvL3RoZSBuZXcgc3R5bGUgd2FzIGZvciBzb21ldGhpbmcgbGlrZSAiTXlCdXR0b24iLCBoZW5jZSwgYmVpbmcKKyAgICAgICAgICAgICAgICAvL21vcmUgc3BlY2lmaWMuKSBJbiBhbGwgY2FzZXMsIGZhdm9yIHRoZSBtb3N0IHNwZWNpZmljIHN0eWxlCisgICAgICAgICAgICAgICAgLy9mb3VuZC4KKyAgICAgICAgICAgICAgICBpZiAoZm91bmRTdHlsZSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgKGZvdW5kU3R5bGUucGFydHMubGVuZ3RoIDwgcy5wYXJ0cy5sZW5ndGgpIHx8CisgICAgICAgICAgICAgICAgICAgKGZvdW5kU3R5bGUucGFydHMubGVuZ3RoID09IHMucGFydHMubGVuZ3RoIAorICAgICAgICAgICAgICAgICAgICAmJiBmb3VuZFN0eWxlLnNpbXBsZSAmJiAhcy5zaW1wbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kU3R5bGUgPSBzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vcmV0dXJuIHRoZSBzdHlsZSwgaWYgZm91bmQsIG9yIHRoZSBkZWZhdWx0IHN0eWxlIGlmIG5vdCBmb3VuZAorICAgICAgICByZXR1cm4gZm91bmRTdHlsZSA9PSBudWxsID8gZGVmYXVsdFN0eWxlIDogZm91bmRTdHlsZS5nZXRTdHlsZShjb21wKTsKKyAgICB9CisKKyAgICAvKgorICAgICAgICBWYXJpb3VzIHB1YmxpYyBoZWxwZXIgY2xhc3Nlcy4KKyAgICAgICAgVGhlc2UgbWF5IGJlIHVzZWQgdG8gcmVnaXN0ZXIgM3JkIHBhcnR5IHZhbHVlcyBpbnRvIFVJRGVmYXVsdHMKKyAgICAqLworCisgICAgLyoqCisgICAgICogPHA+RGVyaXZlcyBpdHMgZm9udCB2YWx1ZSBiYXNlZCBvbiBhIHBhcmVudCBmb250IGFuZCBhIHNldCBvZiBvZmZzZXRzIGFuZAorICAgICAqIGF0dHJpYnV0ZXMuIFRoaXMgY2xhc3MgaXMgYW4gQWN0aXZlVmFsdWUsIG1lYW5pbmcgdGhhdCBpdCB3aWxsIHJlY29tcHV0ZQorICAgICAqIGl0cyB2YWx1ZSBlYWNoIHRpbWUgaXQgaXMgcmVxdWVzdGVkIGZyb20gVUlEZWZhdWx0cy4gSXQgaXMgdGhlcmVmb3JlCisgICAgICogcmVjb21tZW5kZWQgdG8gcmVhZCB0aGlzIHZhbHVlIG9uY2UgYW5kIGNhY2hlIGl0IGluIHRoZSBVSSBkZWxlZ2F0ZSBjbGFzcworICAgICAqIHVudGlsIGFza2VkIHRvIHJlaW5pdGlhbGl6ZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UbyB1c2UgdGhpcyBjbGFzcywgY3JlYXRlIGFuIGluc3RhbmNlIHdpdGggdGhlIGtleSBvZiB0aGUgZm9udCBpbiB0aGUKKyAgICAgKiBVSSBkZWZhdWx0cyB0YWJsZSBmcm9tIHdoaWNoIHRvIGRlcml2ZSB0aGlzIGZvbnQsIGFsb25nIHdpdGggYSBzaXplCisgICAgICogb2Zmc2V0IChpZiBhbnkpLCBhbmQgd2hldGhlciBpdCBpcyB0byBiZSBib2xkLCBpdGFsaWMsIG9yIGxlZnQgaW4gaXRzCisgICAgICogZGVmYXVsdCBmb3JtLjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERlcml2ZWRGb250IGltcGxlbWVudHMgVUlEZWZhdWx0cy5BY3RpdmVWYWx1ZSB7CisgICAgICAgIHByaXZhdGUgZmxvYXQgc2l6ZU9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBCb29sZWFuIGJvbGQ7CisgICAgICAgIHByaXZhdGUgQm9vbGVhbiBpdGFsaWM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudEtleTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IERlcml2ZWRGb250LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBVSURlZmF1bHQga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlcml2ZWQgZm9udCdzCisgICAgICAgICAqICAgICAgICAgICAgcGFyZW50IG9yIHNvdXJjZS4gSWYgdGhpcyBrZXkgbGVhZHMgdG8gYSBudWxsIHZhbHVlLCBvciBhCisgICAgICAgICAqICAgICAgICAgICAgdmFsdWUgdGhhdCBpcyBub3QgYSBmb250LCB0aGVuIG51bGwgd2lsbCBiZSByZXR1cm5lZCBhcworICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZXJpdmVkIGZvbnQuIFRoZSBrZXkgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgICAgICogQHBhcmFtIHNpemVPZmZzZXQgVGhlIHNpemUgb2Zmc2V0LCBhcyBhIHBlcmNlbnRhZ2UsIHRvIHVzZS4gRm9yCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgIGV4YW1wbGUsIGlmIHRoZSBzb3VyY2UgZm9udCB3YXMgYSAxMnB0IGZvbnQgYW5kIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBzaXplT2Zmc2V0IHdlcmUgc3BlY2lmaWVkIGFzIC45LCB0aGVuIHRoZSBuZXcgZm9udAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIDkwJSBvZiB3aGF0IHRoZSBzb3VyY2UgZm9udCB3YXMsIG9yLCAxMC44CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgIHB0cyB3aGljaCBpcyByb3VuZGVkIHRvIDExcHRzLiBUaGlzIGZyYWN0aW9uYWwKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgYmFzZWQgb2Zmc2V0IGFsbG93cyBmb3IgcHJvcGVyIGZvbnQgc2NhbGluZyBpbiBoaWdoCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgIERQSSBvciBsYXJnZSBzeXN0ZW0gZm9udCBzY2VuYXJpb3MuCisgICAgICAgICAqIEBwYXJhbSBib2xkIFdoZXRoZXIgdGhlIG5ldyBmb250IHNob3VsZCBiZSBib2xkLiBJZiBudWxsLCB0aGVuIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgbmV3IGZvbnQgd2lsbCBpbmhlcml0IHRoZSBib2xkIHNldHRpbmcgb2YgdGhlIHNvdXJjZQorICAgICAgICAgKiAgICAgICAgICAgICBmb250LgorICAgICAgICAgKiBAcGFyYW0gaXRhbGljIFdoZXRoZXIgdGhlIG5ldyBmb250IHNob3VsZCBiZSBpdGFsaWNpemVkLiBJZiBudWxsLAorICAgICAgICAgKiAgICAgICAgICAgICAgIHRoZW4gdGhpcyBuZXcgZm9udCB3aWxsIGluaGVyaXQgdGhlIGl0YWxpYyBzZXR0aW5nIG9mCisgICAgICAgICAqICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBmb250LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERlcml2ZWRGb250KFN0cmluZyBrZXksIGZsb2F0IHNpemVPZmZzZXQsIEJvb2xlYW4gYm9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gaXRhbGljKSB7CisgICAgICAgICAgICAvL3ZhbGlkYXRlIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIllvdSBtdXN0IHNwZWNpZnkgYSBrZXkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9zZXQgdGhlIHZhbHVlcworICAgICAgICAgICAgdGhpcy5wYXJlbnRLZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLnNpemVPZmZzZXQgPSBzaXplT2Zmc2V0OworICAgICAgICAgICAgdGhpcy5ib2xkID0gYm9sZDsKKyAgICAgICAgICAgIHRoaXMuaXRhbGljID0gaXRhbGljOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBpbmhlcml0RG9jCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVWYWx1ZShVSURlZmF1bHRzIGRlZmF1bHRzKSB7CisgICAgICAgICAgICBGb250IGYgPSBkZWZhdWx0cy5nZXRGb250KHBhcmVudEtleSk7CisgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHJvdW5kIHNpemUgZm9yIG5vdyBzbyB3ZSBoYXZlIGV4YWN0IGludCBmb250IHNpemUKKyAgICAgICAgICAgICAgICAvLyAob3Igd2UgbWF5IGhhdmUgbGFtZSBsb29raW5nIGZvbnRzKQorICAgICAgICAgICAgICAgIGZsb2F0IHNpemUgPSBNYXRoLnJvdW5kKGYuZ2V0U2l6ZTJEKCkgKiBzaXplT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpbnQgc3R5bGUgPSBmLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGJvbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYm9sZC5ib29sZWFuVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZSB8IEZvbnQuQk9MRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gc3R5bGUgJiB+Rm9udC5CT0xEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpdGFsaWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXRhbGljLmJvb2xlYW5WYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHN0eWxlIHwgRm9udC5JVEFMSUM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHN0eWxlICYgfkZvbnQuSVRBTElDOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmLmRlcml2ZUZvbnQoc3R5bGUsIHNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyBwcml2YXRlIGJlY2F1c2UgaXQgcmVsaWVzIG9uIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUKKyAgICAgKiBhdXRvLWdlbmVyYXRlZCBBYnN0cmFjdFJlZ2lvblBhaW50ZXIgc3ViY2xhc3Nlcy4gSGVuY2UsIGl0IGlzIG5vdAorICAgICAqIGdlbmVyYWxseSB1c2VmdWwsIGFuZCBpcyBwcml2YXRlLgorICAgICAqIDxwLz4KKyAgICAgKiBMYXp5UGFpbnRlciBpcyBhIExhenlWYWx1ZSBjbGFzcy4gSXQgd2lsbCBjcmVhdGUgdGhlCisgICAgICogQWJzdHJhY3RSZWdpb25QYWludGVyIGxhemlseSwgd2hlbiBhc2tlZC4gSXQgdXNlcyByZWZsZWN0aW9uIHRvIGxvYWQgdGhlCisgICAgICogcHJvcGVyIGNsYXNzIGFuZCBpbnZva2UgaXRzIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExhenlQYWludGVyIGltcGxlbWVudHMgVUlEZWZhdWx0cy5MYXp5VmFsdWUgeworICAgICAgICBwcml2YXRlIGludCB3aGljaDsKKyAgICAgICAgcHJpdmF0ZSBBYnN0cmFjdFJlZ2lvblBhaW50ZXIuUGFpbnRDb250ZXh0IGN0eDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworCisgICAgICAgIExhenlQYWludGVyKFN0cmluZyBjbGFzc05hbWUsIGludCB3aGljaCwgSW5zZXRzIGluc2V0cywKKyAgICAgICAgICAgICAgICAgICAgRGltZW5zaW9uIGNhbnZhc1NpemUsIGJvb2xlYW4gaW52ZXJ0ZWQpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGNsYXNzTmFtZSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgICAgICAgIHRoaXMud2hpY2ggPSB3aGljaDsKKyAgICAgICAgICAgIHRoaXMuY3R4ID0gbmV3IEFic3RyYWN0UmVnaW9uUGFpbnRlci5QYWludENvbnRleHQoCisgICAgICAgICAgICAgICAgaW5zZXRzLCBjYW52YXNTaXplLCBpbnZlcnRlZCk7CisgICAgICAgIH0KKworICAgICAgICBMYXp5UGFpbnRlcihTdHJpbmcgY2xhc3NOYW1lLCBpbnQgd2hpY2gsIEluc2V0cyBpbnNldHMsCisgICAgICAgICAgICAgICAgICAgIERpbWVuc2lvbiBjYW52YXNTaXplLCBib29sZWFuIGludmVydGVkLAorICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFJlZ2lvblBhaW50ZXIuUGFpbnRDb250ZXh0LkNhY2hlTW9kZSBjYWNoZU1vZGUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhILCBkb3VibGUgbWF4VikgeworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY2xhc3NOYW1lIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgICAgICAgICAgdGhpcy53aGljaCA9IHdoaWNoOworICAgICAgICAgICAgdGhpcy5jdHggPSBuZXcgQWJzdHJhY3RSZWdpb25QYWludGVyLlBhaW50Q29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgaW5zZXRzLCBjYW52YXNTaXplLCBpbnZlcnRlZCwgY2FjaGVNb2RlLCBtYXhILCBtYXhWKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVZhbHVlKFVJRGVmYXVsdHMgdGFibGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgYzsKKyAgICAgICAgICAgICAgICBPYmplY3QgY2w7CisgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHdlIHNob3VsZCB1c2UgYSBzZXBhcmF0ZSBDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgIGlmICh0YWJsZSA9PSBudWxsIHx8ICEoKGNsID0gdGFibGUuZ2V0KCJDbGFzc0xvYWRlciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VvZiBDbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgY2wgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCAoQ2xhc3NMb2FkZXIpY2wpOworICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gYy5nZXRDb25zdHJ1Y3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UmVnaW9uUGFpbnRlci5QYWludENvbnRleHQuY2xhc3MsIGludC5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmluZCB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBjbGFzczogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGN0eCwgd2hpY2gpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aGljaCBjcmVhdGVzIHRoZSBOaW1idXNTdHlsZSBhc3NvY2lhdGVkIHdpdGggaXQgbGF6aWx5LCBidXQgYWxzbworICAgICAqIG1hbmFnZXMgYSBsb3QgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3R5bGUuIEl0IGlzIGxlc3Mgb2YgYSBMYXp5VmFsdWUKKyAgICAgKiB0eXBlIG9mIGNsYXNzLCBhbmQgbW9yZSBvZiBhbiBFbnRyeSBvciBJdGVtIHR5cGUgb2YgY2xhc3MsIGFzIGl0CisgICAgICogcmVwcmVzZW50cyBhbiBlbnRyeSBpbiB0aGUgbGlzdCBvZiBMYXp5U3R5bGVzIGluIHRoZSBtYXAgbS4KKyAgICAgKgorICAgICAqIFRoZSBwcmltYXJ5IHJlc3BvbnNpYmlsaXRpZXMgb2YgdGhpcyBjbGFzcyBpbmNsdWRlOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5EZXRlcm1pbmluZyB3aGV0aGVyIGEgZ2l2ZW4gY29tcG9uZW50L3JlZ2lvbiBwYWlyIG1hdGNoZXMgdGhpcworICAgICAqICAgICAgIHN0eWxlPC9saT4KKyAgICAgKiAgIDxsaT5TcGxpdHRpbmcgdGhlIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGludG8gaXRzCisgICAgICogICAgICAgY29uc3RpdHVlbnQgcGFydHMgdG8gZmFjaWxpdGF0ZSBxdWlja2VyIG1hdGNoaW5nPC9saT4KKyAgICAgKiAgIDxsaT5DcmVhdGluZyBhbmQgdmVuZGluZyBhIE5pbWJ1c1N0eWxlIGxhemlseS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMYXp5U3R5bGUgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHByZWZpeCB0aGlzIExhenlTdHlsZSB3YXMgcmVnaXN0ZXJlZCB3aXRoLiBTb21ldGhpbmcgbGlrZQorICAgICAgICAgKiBCdXR0b24gb3IgQ29tYm9Cb3g6IkNvbWJvQm94LmFycm93QnV0dG9uIgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciBvciBub3QgdGhpcyBMYXp5U3R5bGUgcmVwcmVzZW50cyBhbiB1bm5hbWVkIGNvbXBvbmVudAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNpbXBsZSA9IHRydWU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmFyaW91cyBwYXJ0cywgb3Igc2VjdGlvbnMsIG9mIHRoZSBwcmVmaXguIEZvciBleGFtcGxlLAorICAgICAgICAgKiB0aGUgcHJlZml4OgorICAgICAgICAgKiAgICAgQ29tYm9Cb3g6IkNvbWJvQm94LmFycm93QnV0dG9uIgorICAgICAgICAgKgorICAgICAgICAgKiB3aWxsIGJlIGJyb2tlbiBpbnRvIHR3byBwYXJ0cywKKyAgICAgICAgICogICAgIENvbWJvQm94IGFuZCAiQ29tYm9Cb3guYXJyb3dCdXR0b24iCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFBhcnRbXSBwYXJ0czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhY2hlZCBzaGFyZWQgc3R5bGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE5pbWJ1c1N0eWxlIHN0eWxlOworICAgICAgICAvKioKKyAgICAgICAgICogQSB3ZWFrbHkgcmVmZXJlbmNlZCBoYXNoIG1hcCBzdWNoIHRoYXQgaWYgdGhlIHJlZmVyZW5jZSBKQ29tcG9uZW50CisgICAgICAgICAqIGtleSBpcyBnYXJiYWdlIGNvbGxlY3RlZCB0aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIG1hcC4KKyAgICAgICAgICogVGhpcyBjYWNoZSBleGlzdHMgc28gdGhhdCB3aGVuIGEgSkNvbXBvbmVudCBoYXMgbmltYnVzIG92ZXJyaWRlcworICAgICAgICAgKiBpbiBpdHMgY2xpZW50IG1hcCwgYSB1bmlxdWUgc3R5bGUgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZAorICAgICAgICAgKiBmb3IgdGhhdCBKQ29tcG9uZW50IGluc3RhbmNlLCBhbHdheXMuIEluIHN1Y2ggYSBzaXR1YXRpb24gZWFjaAorICAgICAgICAgKiBKQ29tcG9uZW50IGluc3RhbmNlIG11c3QgaGF2ZSBpdHMgb3duIGluc3RhbmNlIG9mIE5pbWJ1c1N0eWxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxKQ29tcG9uZW50LCBXZWFrUmVmZXJlbmNlPE5pbWJ1c1N0eWxlPj4gb3ZlcnJpZGVzQ2FjaGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBMYXp5U3R5bGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHlsZS4gQ2Fubm90IGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIExhenlTdHlsZShTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBwcmVmaXggbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgICAgICAgICAgLy90aGVyZSBpcyBvbmUgb2RkIGNhc2UgdGhhdCBuZWVkcyB0byBiZSBzdXBwb3J0ZWQgaGVyZTogY2VsbAorICAgICAgICAgICAgLy9yZW5kZXJlcnMuIEEgY2VsbCByZW5kZXJlciBpcyBkZWZpbmVkIGFzIGEgbmFtZWQgaW50ZXJuYWwKKyAgICAgICAgICAgIC8vY29tcG9uZW50LCBzbyBmb3IgZXhhbXBsZToKKyAgICAgICAgICAgIC8vIExpc3QuIkxpc3QuY2VsbFJlbmRlcmVyIgorICAgICAgICAgICAgLy9UaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBjb21wb25lbnQgbmFtZWQgTGlzdC5jZWxsUmVuZGVyZXIgaXMgbm90IGEKKyAgICAgICAgICAgIC8vY2hpbGQgb2YgYSBKTGlzdC4gUmF0aGVyLCBpdCBpcyB0cmVhdGVkIG1vcmUgYXMgYSBkaXJlY3QgY29tcG9uZW50CisgICAgICAgICAgICAvL1RodXMsIGlmIHRoZSBwcmVmaXggZW5kcyB3aXRoICJjZWxsUmVuZGVyZXIiLCB0aGVuIHJlbW92ZSBhbGwgdGhlCisgICAgICAgICAgICAvL3ByZXZpb3VzIGRvdHRlZCBwYXJ0cyBvZiB0aGUgcHJlZml4IG5hbWUgc28gdGhhdCBpdCBiZWNvbWVzLCBmb3IKKyAgICAgICAgICAgIC8vZXhhbXBsZTogIkxpc3QuY2VsbFJlbmRlcmVyIgorICAgICAgICAgICAgLy9MaWtld2lzZSwgd2UgaGF2ZSBhIGhhY2tlZCB3b3JrIGFyb3VuZCBmb3IgY2VsbFJlbmRlcmVyLCByZW5kZXJlciwKKyAgICAgICAgICAgIC8vYW5kIGxpc3RSZW5kZXJlci4KKyAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gcHJlZml4OworICAgICAgICAgICAgaWYgKHRlbXAuZW5kc1dpdGgoImNlbGxSZW5kZXJlclwiIikKKyAgICAgICAgICAgICAgICAgICAgfHwgdGVtcC5lbmRzV2l0aCgicmVuZGVyZXJcIiIpCisgICAgICAgICAgICAgICAgICAgIHx8IHRlbXAuZW5kc1dpdGgoImxpc3RSZW5kZXJlclwiIikpIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5zdWJzdHJpbmcodGVtcC5sYXN0SW5kZXhPZigiOlwiIikgKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9vdGhlcndpc2UsIG5vcm1hbCBjb2RlIHBhdGgKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzcGFydHMgPSBzcGxpdCh0ZW1wKTsKKyAgICAgICAgICAgIHBhcnRzID0gbmV3IFBhcnRbc3BhcnRzLnNpemUoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcGFydHNbaV0gPSBuZXcgUGFydChzcGFydHMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAocGFydHNbaV0ubmFtZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2ltcGxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHN0eWxlLiBDcmVhdGVzIGl0IGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICogQHJldHVybiB0aGUgc3R5bGUKKyAgICAgICAgICovCisgICAgICAgIFN5bnRoU3R5bGUgZ2V0U3R5bGUoSkNvbXBvbmVudCBjKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50IGhhcyBvdmVycmlkZXMsIGl0IGdldHMgaXRzIG93biB1bmlxdWUgc3R5bGUKKyAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBzdHlsZS4KKyAgICAgICAgICAgIGlmIChjLmdldENsaWVudFByb3BlcnR5KCJOaW1idXMuT3ZlcnJpZGVzIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZXNDYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZXNDYWNoZSA9IG5ldyBXZWFrSGFzaE1hcDxKQ29tcG9uZW50LCBXZWFrUmVmZXJlbmNlPE5pbWJ1c1N0eWxlPj4oKTsKKyAgICAgICAgICAgICAgICBXZWFrUmVmZXJlbmNlPE5pbWJ1c1N0eWxlPiByZWYgPSBvdmVycmlkZXNDYWNoZS5nZXQoYyk7CisgICAgICAgICAgICAgICAgTmltYnVzU3R5bGUgcyA9IHJlZiA9PSBudWxsID8gbnVsbCA6IHJlZi5nZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBuZXcgTmltYnVzU3R5bGUocHJlZml4LCBjKTsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzQ2FjaGUucHV0KGMsIG5ldyBXZWFrUmVmZXJlbmNlPE5pbWJ1c1N0eWxlPihzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBsYXppbHkgY3JlYXRlIHRoZSBzdHlsZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHN0eWxlID0gbmV3IE5pbWJ1c1N0eWxlKHByZWZpeCwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHJldHVybiB0aGUgc3R5bGUKKyAgICAgICAgICAgIHJldHVybiBzdHlsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIExhenlTdHlsZSBpcyBhIG1hdGNoIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50IGlmLCBhbmQgb25seSBpZiwKKyAgICAgICAgICogZm9yIGVhY2ggcGFydCBvZiB0aGUgcHJlZml4IHRoZSBjb21wb25lbnQgaGllcmFyY2h5IG1hdGNoZXMgZXhhY3RseS4KKyAgICAgICAgICogVGhhdCBpcywgaWYgZ2l2ZW4gImEiOnNvbWV0aGluZzoiYiIsIHRoZW46CisgICAgICAgICAqIGMuZ2V0TmFtZSgpIG11c3QgZXF1YWxzICJiIgorICAgICAgICAgKiBjLmdldFBhcmVudCgpIGNhbiBiZSBhbnl0aGluZworICAgICAgICAgKiBjLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldE5hbWUoKSBtdXN0IGVxdWFsICJhIi4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gbWF0Y2hlcyhKQ29tcG9uZW50IGMpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVzKGMsIHBhcnRzLmxlbmd0aCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoQ29tcG9uZW50IGMsIGludCBwYXJ0SW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0SW5kZXggPCAwKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIC8vb25seSBnZXQgaGVyZSBpZiBwYXJ0SW5kZXggPiAwIGFuZCBjID09IG51bGwKKworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChwYXJ0c1twYXJ0SW5kZXhdLm5hbWVkICYmIHBhcnRzW3BhcnRJbmRleF0ucy5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvL3NvIGZhciBzbyBnb29kLCByZWN1cnNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMoYy5nZXRQYXJlbnQoKSwgcGFydEluZGV4IC0gMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFwYXJ0c1twYXJ0SW5kZXhdLm5hbWVkKSB7CisgICAgICAgICAgICAgICAgLy9pZiBjIGlzIG5vdCBuYW1lZCwgYW5kIHBhcnRzW3BhcnRJbmRleF0gaGFzIGFuIGV4cGVjdGVkIGNsYXNzCisgICAgICAgICAgICAgICAgLy90eXBlIHJlZ2lzdGVyZWQsIHRoZW4gY2hlY2sgdG8gbWFrZSBzdXJlIGMgaXMgb2YgdGhlCisgICAgICAgICAgICAgICAgLy9yaWdodCB0eXBlOworICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gcGFydHNbcGFydEluZGV4XS5jOworICAgICAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsICYmIGNsYXp6LmlzQXNzaWduYWJsZUZyb20oYy5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgICAgICAvL3NvIGZhciBzbyBnb29kLCByZWN1cnNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzKGMuZ2V0UGFyZW50KCksIHBhcnRJbmRleCAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZFJlZ2lvbnMuY29udGFpbnNLZXkocGFydHNbcGFydEluZGV4XS5zKSkgeworICAgICAgICAgICAgICAgICAgICBSZWdpb24gciA9IHJlZ2lzdGVyZWRSZWdpb25zLmdldChwYXJ0c1twYXJ0SW5kZXhdLnMpOworICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgcGFyZW50ID0gci5pc1N1YnJlZ2lvbigpID8gYyA6IGMuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIC8vc3BlY2lhbCBjYXNlIHRoZSBKSW50ZXJuYWxGcmFtZVRpdGxlUGFuZSwgYmVjYXVzZSBpdAorICAgICAgICAgICAgICAgICAgICAvL2RvZXNuJ3QgZml0IHRoZSBtb2xkLiB2ZXJ5LCB2ZXJ5IGZ1bmt5LgorICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBSZWdpb24uSU5URVJOQUxfRlJBTUVfVElUTEVfUEFORSAmJiBwYXJlbnQgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50IGluc3RhbmNlb2YgSkludGVybmFsRnJhbWUuSkRlc2t0b3BJY29uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBKSW50ZXJuYWxGcmFtZS5KRGVza3RvcEljb24gaWNvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChKSW50ZXJuYWxGcmFtZS5KRGVza3RvcEljb24pIHBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGljb24uZ2V0SW50ZXJuYWxGcmFtZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vaXQgd2FzIHRoZSBuYW1lIG9mIGEgcmVnaW9uLiBTbyBmYXIsIHNvIGdvb2QuIFJlY3Vyc2UuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzKHBhcmVudCwgcGFydEluZGV4IC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZW4gc29tZSBkb3Qgc2VwYXJhdGVkIHByZWZpeCwgc3BsaXQgb24gdGhlIGNvbG9ucyB0aGF0IGFyZQorICAgICAgICAgKiBub3Qgd2l0aGluIHF1b3RlcywgYW5kIG5vdCB3aXRoaW4gYnJhY2tldHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcmVmaXgKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3BsaXQoU3RyaW5nIHByZWZpeCkgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhcnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBpbnQgYnJhY2tldENvdW50ID0gMDsKKyAgICAgICAgICAgIGJvb2xlYW4gaW5xdW90ZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGludCBsYXN0SW5kZXggPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmaXgubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IHByZWZpeC5jaGFyQXQoaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJhY2tldENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5xdW90ZXMgPSAhaW5xdW90ZXM7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJhY2tldENvdW50LS07CisgICAgICAgICAgICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hbGZvcm1lZCBwcmVmaXg6ICIgKyBwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjID09ICc6JyAmJiAhaW5xdW90ZXMgJiYgYnJhY2tldENvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy9mb3VuZCBhIGNoYXJhY3RlciB0byBzcGxpdCBvbi4KKyAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkKHByZWZpeC5zdWJzdHJpbmcobGFzdEluZGV4LCBpKSk7CisgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IGkgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPCBwcmVmaXgubGVuZ3RoKCkgLSAxICYmICFpbnF1b3RlcworICAgICAgICAgICAgICAgICAgICAmJiBicmFja2V0Q291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIHBhcnRzLmFkZChwcmVmaXguc3Vic3RyaW5nKGxhc3RJbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhcnRzOworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFBhcnQgeworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgczsKKyAgICAgICAgICAgIC8vdHJ1ZSBpZiB0aGlzIHBhcnQgcmVwcmVzZW50cyBhIGNvbXBvbmVudCBuYW1lCisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbmFtZWQ7CisgICAgICAgICAgICBwcml2YXRlIENsYXNzIGM7CisKKyAgICAgICAgICAgIFBhcnQoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICBuYW1lZCA9IHMuY2hhckF0KDApID09ICciJyAmJiBzLmNoYXJBdChzLmxlbmd0aCgpIC0gMSkgPT0gJyInOworICAgICAgICAgICAgICAgIGlmIChuYW1lZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnMgPSBzLnN1YnN0cmluZygxLCBzLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zID0gczsKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPIHVzZSBhIG1hcCBvZiBrbm93biByZWdpb25zIGZvciBTeW50aCBhbmQgU3dpbmcsIGFuZAorICAgICAgICAgICAgICAgICAgICAvL3RoZW4gdXNlIFtjbGFzc25hbWVdIGluc3RlYWQgb2Ygb3JnX2NsYXNzX25hbWUgc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBDbGFzcy5mb3JOYW1lKCJqYXZheC5zd2luZy5KIiArIHMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gQ2xhc3MuZm9yTmFtZShzLnJlcGxhY2UoIl8iLCAiLiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGRlcml2ZWQgY29sb3IsIGRlcml2ZWQgY29sb3JzIGFyZSBzaGFyZWQgaW5zdGFuY2VzIGFuZCB3aWxsIGJlCisgICAgICogdXBkYXRlZCB3aGVuIGl0cyBwYXJlbnQgVUlEZWZhdWx0IGNvbG9yIGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdWlEZWZhdWx0UGFyZW50TmFtZSBUaGUgcGFyZW50IFVJRGVmYXVsdCBrZXkKKyAgICAgKiBAcGFyYW0gaE9mZnNldCBUaGUgaHVlIG9mZnNldAorICAgICAqIEBwYXJhbSBzT2Zmc2V0IFRoZSBzYXR1cmF0aW9uIG9mZnNldAorICAgICAqIEBwYXJhbSBiT2Zmc2V0IFRoZSBicmlnaHRuZXNzIG9mZnNldAorICAgICAqIEBwYXJhbSBhT2Zmc2V0IFRoZSBhbHBoYSBvZmZzZXQKKyAgICAgKiBAcmV0dXJuIFRoZSBzdG9yZWQgZGVyaXZlZCBjb2xvcgorICAgICAqLworICAgIHB1YmxpYyBEZXJpdmVkQ29sb3IgZ2V0RGVyaXZlZENvbG9yKFN0cmluZyB1aURlZmF1bHRQYXJlbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsIGZsb2F0IHNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYk9mZnNldCwgaW50IGFPZmZzZXQpeworICAgICAgICByZXR1cm4gZ2V0RGVyaXZlZENvbG9yKHVpRGVmYXVsdFBhcmVudE5hbWUsIGhPZmZzZXQsIHNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk9mZnNldCwgYU9mZnNldCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgZGVyaXZlZCBjb2xvciwgZGVyaXZlZCBjb2xvcnMgYXJlIHNoYXJlZCBpbnN0YW5jZXMgYW5kIHdpbGwgYmUKKyAgICAgKiB1cGRhdGVkIHdoZW4gaXRzIHBhcmVudCBVSURlZmF1bHQgY29sb3IgY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1aURlZmF1bHRQYXJlbnROYW1lIFRoZSBwYXJlbnQgVUlEZWZhdWx0IGtleQorICAgICAqIEBwYXJhbSBoT2Zmc2V0IFRoZSBodWUgb2Zmc2V0CisgICAgICogQHBhcmFtIHNPZmZzZXQgVGhlIHNhdHVyYXRpb24gb2Zmc2V0CisgICAgICogQHBhcmFtIGJPZmZzZXQgVGhlIGJyaWdodG5lc3Mgb2Zmc2V0CisgICAgICogQHBhcmFtIGFPZmZzZXQgVGhlIGFscGhhIG9mZnNldAorICAgICAqIEBwYXJhbSB1aVJlc291cmNlIFRydWUgaWYgdGhlIGRlcml2ZWQgY29sb3Igc2hvdWxkIGJlIGEgVUlSZXNvdXJjZSwKKyAgICAgKiAgICAgICAgZmFsc2UgaWYgaXQgc2hvdWxkIG5vdCBiZSBhIFVJUmVzb3VyY2UKKyAgICAgKiBAcmV0dXJuIFRoZSBzdG9yZWQgZGVyaXZlZCBjb2xvcgorICAgICAqLworICAgIHB1YmxpYyBEZXJpdmVkQ29sb3IgZ2V0RGVyaXZlZENvbG9yKFN0cmluZyB1aURlZmF1bHRQYXJlbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsIGZsb2F0IHNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYk9mZnNldCwgaW50IGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1aVJlc291cmNlKXsKKyAgICAgICAgdG1wRENLZXkuc2V0KHVpRGVmYXVsdFBhcmVudE5hbWUsIGhPZmZzZXQsIHNPZmZzZXQsIGJPZmZzZXQsIGFPZmZzZXQsCisgICAgICAgICAgICB1aVJlc291cmNlKTsKKyAgICAgICAgRGVyaXZlZENvbG9yIGNvbG9yID0gZGVyaXZlZENvbG9yc01hcC5nZXQodG1wRENLZXkpOworICAgICAgICBpZiAoY29sb3IgPT0gbnVsbCl7CisgICAgICAgICAgICBpZiAodWlSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgIGNvbG9yID0gbmV3IERlcml2ZWRDb2xvci5VSVJlc291cmNlKHVpRGVmYXVsdFBhcmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LCBzT2Zmc2V0LCBiT2Zmc2V0LCBhT2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29sb3IgPSBuZXcgRGVyaXZlZENvbG9yKHVpRGVmYXVsdFBhcmVudE5hbWUsIGhPZmZzZXQsIHNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGJPZmZzZXQsIGFPZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBpbml0aWFsIHZhbHVlCisgICAgICAgICAgICBjb2xvci5yZWRlcml2ZUNvbG9yKCk7CisgICAgICAgICAgICAvLyBhZGQgdGhlIGxpc3RlbmVyIHNvIHRoYXQgaWYgdGhlIGNvbG9yIGNoYW5nZXMgd2UnbGwgcHJvcG9nYXRlIGl0CisgICAgICAgICAgICBjb2xvci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGRlZmF1bHRzTGlzdGVuZXIpOworICAgICAgICAgICAgLy8gYWRkIHRvIHRoZSBkZXJpdmVkIGNvbG9ycyB0YWJsZQorICAgICAgICAgICAgZGVyaXZlZENvbG9yc01hcC5wdXQobmV3IERlcml2ZWRDb2xvcktleSh1aURlZmF1bHRQYXJlbnROYW1lLAorICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LCBzT2Zmc2V0LCBiT2Zmc2V0LCBhT2Zmc2V0LCB1aVJlc291cmNlKSxjb2xvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEtleSBjbGFzcyBmb3IgZGVyaXZlZCBjb2xvcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIERlcml2ZWRDb2xvcktleSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHVpRGVmYXVsdFBhcmVudE5hbWU7CisgICAgICAgIHByaXZhdGUgZmxvYXQgaE9mZnNldCwgc09mZnNldCwgYk9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYU9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHVpUmVzb3VyY2U7CisKKyAgICAgICAgRGVyaXZlZENvbG9yS2V5KCl7fQorCisgICAgICAgIERlcml2ZWRDb2xvcktleShTdHJpbmcgdWlEZWZhdWx0UGFyZW50TmFtZSwgZmxvYXQgaE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNPZmZzZXQsIGZsb2F0IGJPZmZzZXQsIGludCBhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1aVJlc291cmNlKSB7CisgICAgICAgICAgICBzZXQodWlEZWZhdWx0UGFyZW50TmFtZSwgaE9mZnNldCwgc09mZnNldCwgYk9mZnNldCwgYU9mZnNldCwgdWlSZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldCAoU3RyaW5nIHVpRGVmYXVsdFBhcmVudE5hbWUsIGZsb2F0IGhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzT2Zmc2V0LCBmbG9hdCBiT2Zmc2V0LCBpbnQgYU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdWlSZXNvdXJjZSkgeworICAgICAgICAgICAgdGhpcy51aURlZmF1bHRQYXJlbnROYW1lID0gdWlEZWZhdWx0UGFyZW50TmFtZTsKKyAgICAgICAgICAgIHRoaXMuaE9mZnNldCA9IGhPZmZzZXQ7CisgICAgICAgICAgICB0aGlzLnNPZmZzZXQgPSBzT2Zmc2V0OworICAgICAgICAgICAgdGhpcy5iT2Zmc2V0ID0gYk9mZnNldDsKKyAgICAgICAgICAgIHRoaXMuYU9mZnNldCA9IGFPZmZzZXQ7CisgICAgICAgICAgICB0aGlzLnVpUmVzb3VyY2UgPSB1aVJlc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGVyaXZlZENvbG9yS2V5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgRGVyaXZlZENvbG9yS2V5IHRoYXQgPSAoRGVyaXZlZENvbG9yS2V5KSBvOworICAgICAgICAgICAgaWYgKGFPZmZzZXQgIT0gdGhhdC5hT2Zmc2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoRmxvYXQuY29tcGFyZSh0aGF0LmJPZmZzZXQsIGJPZmZzZXQpICE9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChGbG9hdC5jb21wYXJlKHRoYXQuaE9mZnNldCwgaE9mZnNldCkgIT0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKEZsb2F0LmNvbXBhcmUodGhhdC5zT2Zmc2V0LCBzT2Zmc2V0KSAhPSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAodWlEZWZhdWx0UGFyZW50TmFtZSAhPSBudWxsID8KKyAgICAgICAgICAgICAgICAhdWlEZWZhdWx0UGFyZW50TmFtZS5lcXVhbHModGhhdC51aURlZmF1bHRQYXJlbnROYW1lKSA6CisgICAgICAgICAgICAgICAgdGhhdC51aURlZmF1bHRQYXJlbnROYW1lICE9IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0aGlzLnVpUmVzb3VyY2UgIT0gdGhhdC51aVJlc291cmNlKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IHN1cGVyLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHVpRGVmYXVsdFBhcmVudE5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgaE9mZnNldCAhPSArMC4wZiA/CisgICAgICAgICAgICAgICAgICAgIEZsb2F0LmZsb2F0VG9JbnRCaXRzKGhPZmZzZXQpIDogMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgc09mZnNldCAhPSArMC4wZiA/CisgICAgICAgICAgICAgICAgICAgIEZsb2F0LmZsb2F0VG9JbnRCaXRzKHNPZmZzZXQpIDogMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgYk9mZnNldCAhPSArMC4wZiA/CisgICAgICAgICAgICAgICAgICAgIEZsb2F0LmZsb2F0VG9JbnRCaXRzKGJPZmZzZXQpIDogMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgYU9mZnNldDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHVpUmVzb3VyY2UgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgdG8gdXBkYXRlIGRlcml2ZWQgY29sb3JzIG9uIFVJTWFuYWdlciBEZWZhdWx0cyBjaGFuZ2VzCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBEZWZhdWx0c0xpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgT2JqZWN0IHNyYyA9IGV2dC5nZXRTb3VyY2UoKTsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBldnQuZ2V0UHJvcGVydHlOYW1lKCk7CisgICAgICAgICAgICBpZiAoa2V5LmVxdWFscygibG9va0FuZEZlZWwiKSl7CisgICAgICAgICAgICAgICAgLy8gTEFGIGhhcyBiZWVuIGluc3RhbGxlZCwgdGhpcyBpcyB0aGUgZmlyc3QgcG9pbnQgYXQgd2hpY2ggd2UKKyAgICAgICAgICAgICAgICAvLyBjYW4gYWNjZXNzIG91ciBkZWZhdWx0cyB0YWJsZSB2aWEgVUlNYW5hZ2VyIHNvIGJlZm9yZSBub3cKKyAgICAgICAgICAgICAgICAvLyBhbGwgZGVyaXZlZCBjb2xvcnMgd2lsbCBiZSBpbmNvcnJlY3QuCisgICAgICAgICAgICAgICAgLy8gRmlyc3Qgd2UgbmVlZCB0byB1cGRhdGUKKyAgICAgICAgICAgICAgICBmb3IgKERlcml2ZWRDb2xvciBjb2xvciA6IGRlcml2ZWRDb2xvcnNNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29sb3IucmVkZXJpdmVDb2xvcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgRGVyaXZlZENvbG9yICYmIGtleS5lcXVhbHMoInJnYiIpKSB7CisgICAgICAgICAgICAgICAgLy8gZGVyaXZlZCBjb2xvciB0aGF0IGlzIGluIFVJTWFuYWdlciBkZWZhdWx0cyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhbGwgaXRzIGRlcGVuZGVudCBjb2xvcnMuIERvbid0IHdvcnJ5IGFib3V0IGRvaW5nCisgICAgICAgICAgICAgICAgLy8gdGhpcyByZWN1cnNpdmVseSBzaW5jZSBjYWxsaW5nIHJlZGVyaXZlQ29sb3Igd2lsbCBjYXVzZQorICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgUENFIHRvIGJlIGZpcmVkLCBlbmRpbmcgdXAgaGVyZSBhbmQgZXNzZW50aWFsbHkKKyAgICAgICAgICAgICAgICAvLyByZWN1cnNpbmcKKyAgICAgICAgICAgICAgICBEZXJpdmVkQ29sb3IgcGFyZW50Q29sb3IgPSAoRGVyaXZlZENvbG9yKXNyYzsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50S2V5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PE9iamVjdCxPYmplY3Q+PiBlbnRyaWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVJTWFuYWdlci5nZXREZWZhdWx0cygpLmVudHJ5U2V0KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBwYXJlbnRDb2xvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50S2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50S2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9jb3VsZG4ndCBmaW5kIHRoZSBEZXJpdmVkQ29sb3IgaW4gdGhlIFVJRGVmYXVsdHMgbWFwLAorICAgICAgICAgICAgICAgICAgICAvL3NvIHdlIGp1c3QgYmFpbC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBlbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGVyaXZlZENvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEZXJpdmVkQ29sb3IgY29sb3IgPSAoRGVyaXZlZENvbG9yKWVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50S2V5LmVxdWFscyhjb2xvci5nZXRVaURlZmF1bHRQYXJlbnROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmVkZXJpdmVDb2xvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGFpbnRlckJvcmRlciBpbXBsZW1lbnRzIEJvcmRlciwgVUlSZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgSW5zZXRzIGluc2V0czsKKyAgICAgICAgcHJpdmF0ZSBQYWludGVyIHBhaW50ZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhaW50ZXJLZXk7CisgICAgICAgIAorICAgICAgICBQYWludGVyQm9yZGVyKFN0cmluZyBwYWludGVyS2V5LCBJbnNldHMgaW5zZXRzKSB7CisgICAgICAgICAgICB0aGlzLmluc2V0cyA9IGluc2V0czsKKyAgICAgICAgICAgIHRoaXMucGFpbnRlcktleSA9IHBhaW50ZXJLZXk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwYWludEJvcmRlcihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgICAgIGlmIChwYWludGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYWludGVyID0gKFBhaW50ZXIpVUlNYW5hZ2VyLmdldChwYWludGVyS2V5KTsKKyAgICAgICAgICAgICAgICBpZiAocGFpbnRlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGcudHJhbnNsYXRlKHgsIHkpOworICAgICAgICAgICAgaWYgKGcgaW5zdGFuY2VvZiBHcmFwaGljczJEKQorICAgICAgICAgICAgICAgIHBhaW50ZXIucGFpbnQoKEdyYXBoaWNzMkQpZywgYywgdywgaCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGltZyA9IG5ldyBCdWZmZXJlZEltYWdlKHcsIGgsIFRZUEVfSU5UX0FSR0IpOworICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZ2Z4ID0gaW1nLmNyZWF0ZUdyYXBoaWNzKCk7CisgICAgICAgICAgICAgICAgcGFpbnRlci5wYWludChnZngsIGMsIHcsIGgpOworICAgICAgICAgICAgICAgIGdmeC5kaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1nLCB4LCB5LCBudWxsKTsKKyAgICAgICAgICAgICAgICBpbWcgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZy50cmFuc2xhdGUoLXgsIC15KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW5zZXRzIGdldEJvcmRlckluc2V0cyhDb21wb25lbnQgYykgeworICAgICAgICAgICAgcmV0dXJuIChJbnNldHMpaW5zZXRzLmNsb25lKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCb3JkZXJPcGFxdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9EZXJpdmVkQ29sb3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9EZXJpdmVkQ29sb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGI3YjFhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0Rlcml2ZWRDb2xvci5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYubmltYnVzOworCitpbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworLyoqCisgKiBEZXJpdmVkQ29sb3IgLSBBIGNvbG9yIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgZGVyaXZlZCBmcm9tIGEgVUlNYW5hZ2VyCisgKiBkZWZhdWx0cyB0YWJsZSBjb2xvciBhbmQgYSBzZXQgb2Ygb2Zmc2V0cy4gSXQgY2FuIGJlIHJlZGVyaXZlZCBhdCBhbnkgcG9pbnQKKyAqIGJ5IGNhbGxpbmcgcmVkZXJpdmVDb2xvcigpLiBGb3IgZXhhbXBsZSB3aGVuIGl0cyBwYXJlbnQgY29sb3IgY2hhbmdlcyBhbmQgaXQKKyAqIHZhbHVlIHdpbGwgdXBkYXRlIHRvIHJlZmxlY3QgdGhlIG5ldyBkZXJpdmVkIGNvbG9yLiBQcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCisgKiBhcmUgZmlyZWQgZm9yIHRoZSAicmdiIiBwcm9wZXJ0eSB3aGVuIHRoZSBkZXJpdmVkIGNvbG9yIGNoYW5nZXMuCisgKgorICogQGF1dGhvciBKYXNwZXIgUG90dHMKKyAqLworY2xhc3MgRGVyaXZlZENvbG9yIGV4dGVuZHMgQ29sb3IgeworICAgIHByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IGNoYW5nZVN1cHBvcnQgPQorICAgICAgICAgICAgbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB1aURlZmF1bHRQYXJlbnROYW1lOworICAgIHByaXZhdGUgZmluYWwgZmxvYXQgaE9mZnNldCwgc09mZnNldCwgYk9mZnNldDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBhT2Zmc2V0OworICAgIHByaXZhdGUgaW50IGFyZ2JWYWx1ZTsKKworICAgIERlcml2ZWRDb2xvcihTdHJpbmcgdWlEZWZhdWx0UGFyZW50TmFtZSwgZmxvYXQgaE9mZnNldCwgZmxvYXQgc09mZnNldCwgZmxvYXQgYk9mZnNldCwgaW50IGFPZmZzZXQpIHsKKyAgICAgICAgc3VwZXIoMCk7CisgICAgICAgIHRoaXMudWlEZWZhdWx0UGFyZW50TmFtZSA9IHVpRGVmYXVsdFBhcmVudE5hbWU7CisgICAgICAgIHRoaXMuaE9mZnNldCA9IGhPZmZzZXQ7CisgICAgICAgIHRoaXMuc09mZnNldCA9IHNPZmZzZXQ7CisgICAgICAgIHRoaXMuYk9mZnNldCA9IGJPZmZzZXQ7CisgICAgICAgIHRoaXMuYU9mZnNldCA9IGFPZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRVaURlZmF1bHRQYXJlbnROYW1lKCkgeworICAgICAgICByZXR1cm4gdWlEZWZhdWx0UGFyZW50TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0SHVlT2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gaE9mZnNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0U2F0dXJhdGlvbk9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIHNPZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEJyaWdodG5lc3NPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBiT2Zmc2V0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QWxwaGFPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBhT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY2FsY3VsYXRlIHRoZSBkZXJpdmVkIGNvbG9yIGZyb20gdGhlIFVJTWFuYWdlciBwYXJlbnQgY29sb3IgYW5kIG9mZnNldHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWRlcml2ZUNvbG9yKCkgeworICAgICAgICBpbnQgb2xkID0gYXJnYlZhbHVlOworICAgICAgICBDb2xvciBzcmMgPSBVSU1hbmFnZXIuZ2V0Q29sb3IodWlEZWZhdWx0UGFyZW50TmFtZSk7CisgICAgICAgIGlmIChzcmMgIT0gbnVsbCkgeworICAgICAgICAgICAgZmxvYXRbXSB0bXAgPSBDb2xvci5SR0J0b0hTQihzcmMuZ2V0UmVkKCksIHNyYy5nZXRHcmVlbigpLCBzcmMuZ2V0Qmx1ZSgpLCBudWxsKTsKKyAgICAgICAgICAgIC8vIGFwcGx5IG9mZnNldHMKKyAgICAgICAgICAgIHRtcFswXSA9IGNsYW1wKHRtcFswXSArIGhPZmZzZXQpOworICAgICAgICAgICAgdG1wWzFdID0gY2xhbXAodG1wWzFdICsgc09mZnNldCk7CisgICAgICAgICAgICB0bXBbMl0gPSBjbGFtcCh0bXBbMl0gKyBiT2Zmc2V0KTsKKyAgICAgICAgICAgIGludCBhbHBoYSA9IGNsYW1wKHNyYy5nZXRBbHBoYSgpICsgYU9mZnNldCk7CisgICAgICAgICAgICBhcmdiVmFsdWUgPSAoQ29sb3IuSFNCdG9SR0IodG1wWzBdLCB0bXBbMV0sIHRtcFsyXSkgJiAweEZGRkZGRikgfCAoYWxwaGEgPDwgMjQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvYXRbXSB0bXAgPSBuZXcgZmxvYXRbM107CisgICAgICAgICAgICB0bXBbMF0gPSBjbGFtcChoT2Zmc2V0KTsKKyAgICAgICAgICAgIHRtcFsxXSA9IGNsYW1wKHNPZmZzZXQpOworICAgICAgICAgICAgdG1wWzJdID0gY2xhbXAoYk9mZnNldCk7CisgICAgICAgICAgICBpbnQgYWxwaGEgPSBjbGFtcChhT2Zmc2V0KTsKKyAgICAgICAgICAgIGFyZ2JWYWx1ZSA9IChDb2xvci5IU0J0b1JHQih0bXBbMF0sIHRtcFsxXSwgdG1wWzJdKSAmIDB4RkZGRkZGKSB8IChhbHBoYSA8PCAyNCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhbmdlU3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJnYiIsIG9sZCwgYXJnYlZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBSR0IgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBjb2xvciBpbiB0aGUgZGVmYXVsdCBzUkdCIHtAbGluayBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsfS4gKEJpdHMgMjQtMzEKKyAgICAgKiBhcmUgYWxwaGEsIDE2LTIzIGFyZSByZWQsIDgtMTUgYXJlIGdyZWVuLCAwLTcgYXJlIGJsdWUpLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgUkdCIHZhbHVlIG9mIHRoZSBjb2xvciBpbiB0aGUgZGVmYXVsdCBzUkdCIDxjb2RlPkNvbG9yTW9kZWw8L2NvZGU+LgorICAgICAqIEBzZWUgamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbCNnZXRSR0JkZWZhdWx0CisgICAgICogQHNlZSAjZ2V0UmVkCisgICAgICogQHNlZSAjZ2V0R3JlZW4KKyAgICAgKiBAc2VlICNnZXRCbHVlCisgICAgICogQHNpbmNlIEpESzEuMAorICAgICAqLworICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IGdldFJHQigpIHsKKyAgICAgICAgcmV0dXJuIGFyZ2JWYWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBEZXJpdmVkQ29sb3IpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIERlcml2ZWRDb2xvciB0aGF0ID0gKERlcml2ZWRDb2xvcikgbzsKKyAgICAgICAgaWYgKGFPZmZzZXQgIT0gdGhhdC5hT2Zmc2V0KSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChGbG9hdC5jb21wYXJlKHRoYXQuYk9mZnNldCwgYk9mZnNldCkgIT0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoRmxvYXQuY29tcGFyZSh0aGF0LmhPZmZzZXQsIGhPZmZzZXQpICE9IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKEZsb2F0LmNvbXBhcmUodGhhdC5zT2Zmc2V0LCBzT2Zmc2V0KSAhPSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdWlEZWZhdWx0UGFyZW50TmFtZS5lcXVhbHModGhhdC51aURlZmF1bHRQYXJlbnROYW1lKSkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gdWlEZWZhdWx0UGFyZW50TmFtZS5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGhPZmZzZXQgIT0gKzAuMGYgPworICAgICAgICAgICAgICAgIEZsb2F0LmZsb2F0VG9JbnRCaXRzKGhPZmZzZXQpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBzT2Zmc2V0ICE9ICswLjBmID8KKyAgICAgICAgICAgICAgICBGbG9hdC5mbG9hdFRvSW50Qml0cyhzT2Zmc2V0KSA6IDA7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgYk9mZnNldCAhPSArMC4wZiA/CisgICAgICAgICAgICAgICAgRmxvYXQuZmxvYXRUb0ludEJpdHMoYk9mZnNldCkgOiAwOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGFPZmZzZXQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgIC8qKgorICAgICAqIEFkZCBhIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdG8gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICogVGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgZm9yIGFsbCBwcm9wZXJ0aWVzLgorICAgICAqIFRoZSBzYW1lIGxpc3RlbmVyIG9iamVjdCBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGFuZCB3aWxsIGJlIGNhbGxlZAorICAgICAqIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgYWRkZWQuCisgICAgICogSWYgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IGlzIG51bGwsIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIG5vIGFjdGlvbgorICAgICAqIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyICBUaGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBjaGFuZ2VTdXBwb3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KKyAgICAgKiBUaGlzIHJlbW92ZXMgYSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQKKyAgICAgKiBmb3IgYWxsIHByb3BlcnRpZXMuCisgICAgICogSWYgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IHdhcyBhZGRlZCBtb3JlIHRoYW4gb25jZSB0byB0aGUgc2FtZSBldmVudAorICAgICAqIHNvdXJjZSwgaXQgd2lsbCBiZSBub3RpZmllZCBvbmUgbGVzcyB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuCisgICAgICogSWYgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IGlzIG51bGwsIG9yIHdhcyBuZXZlciBhZGRlZCwgbm8gZXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duIGFuZCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgIFRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgY2hhbmdlU3VwcG9ydC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGNsYW1wKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDEpIHsKKyAgICAgICAgICAgIHZhbHVlID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY2xhbXAoaW50IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDI1NSkgeworICAgICAgICAgICAgdmFsdWUgPSAyNTU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5Db2xvcjwvY29kZT4uIFRoaXMgbWV0aG9kCisgICAgICogaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuIFRoZSBjb250ZW50IGFuZAorICAgICAqIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIG1pZ2h0IHZhcnkgYmV0d2VlbiBpbXBsZW1lbnRhdGlvbnMuIFRoZQorICAgICAqIHJldHVybmVkIHN0cmluZyBtaWdodCBiZSBlbXB0eSBidXQgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkNvbG9yPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBDb2xvciBzcmMgPSBVSU1hbmFnZXIuZ2V0Q29sb3IodWlEZWZhdWx0UGFyZW50TmFtZSk7CisgICAgICAgIFN0cmluZyBzID0gIkRlcml2ZWRDb2xvcihjb2xvcj0iICsgZ2V0UmVkKCkgKyAiLCIgKyBnZXRHcmVlbigpICsgIiwiICsgZ2V0Qmx1ZSgpICsKKyAgICAgICAgICAgICAgICAiIHBhcmVudD0iICsgdWlEZWZhdWx0UGFyZW50TmFtZSArCisgICAgICAgICAgICAgICAgIiBvZmZzZXRzPSIgKyBnZXRIdWVPZmZzZXQoKSArICIsIiArIGdldFNhdHVyYXRpb25PZmZzZXQoKSArICIsIgorICAgICAgICAgICAgICAgICsgZ2V0QnJpZ2h0bmVzc09mZnNldCgpICsgIiwiICsgZ2V0QWxwaGFPZmZzZXQoKTsKKyAgICAgICAgcmV0dXJuIHNyYyA9PSBudWxsID8gcyA6IHMgKyAiIHBDb2xvcj0iICsgc3JjLmdldFJlZCgpICsgIiwiICsgc3JjLmdldEdyZWVuKCkgKyAiLCIgKyBzcmMuZ2V0Qmx1ZSgpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBVSVJlc291cmNlIGV4dGVuZHMgRGVyaXZlZENvbG9yIGltcGxlbWVudHMgamF2YXguc3dpbmcucGxhZi5VSVJlc291cmNlIHsKKyAgICAgICAgVUlSZXNvdXJjZShTdHJpbmcgdWlEZWZhdWx0UGFyZW50TmFtZSwgZmxvYXQgaE9mZnNldCwgZmxvYXQgc09mZnNldCwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCBiT2Zmc2V0LCBpbnQgYU9mZnNldCkgeworICAgICAgICAgICAgc3VwZXIodWlEZWZhdWx0UGFyZW50TmFtZSwgaE9mZnNldCwgc09mZnNldCwgYk9mZnNldCwgYU9mZnNldCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvRHJvcFNoYWRvd0VmZmVjdC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0Ryb3BTaGFkb3dFZmZlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTdhOGUwCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0Ryb3BTaGFkb3dFZmZlY3QuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLm5pbWJ1czsKKworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuUmFzdGVyOworaW1wb3J0IGphdmEuYXd0LmltYWdlLldyaXRhYmxlUmFzdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogRHJvcFNoYWRvd0VmZmVjdCAtIFRoaXMgZWZmZWN0IGN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggQVJHQiB0eXBlIGJ1ZmZlcmVkCisgKiBpbWFnZXMuCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDE4LCAyMDA3KQorICovCitjbGFzcyBEcm9wU2hhZG93RWZmZWN0IGV4dGVuZHMgU2hhZG93RWZmZWN0IHsKKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gRWZmZWN0IE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHlwZSBvZiB0aGlzIGVmZmVjdCwgb25lIG9mIFVOREVSLEJMRU5ERUQsT1ZFUi4gVU5ERVIgbWVhbnMgdGhlIHJlc3VsdCBvZiBhcHBseSBlZmZlY3Qgc2hvdWxkIGJlIHBhaW50ZWQKKyAgICAgKiB1bmRlciB0aGUgc3JjIGltYWdlLiBCTEVOREVEIG1lYW5zIHRoZSByZXN1bHQgb2YgYXBwbHkgc2ZmZWN0IGNvbnRhaW5zIGEgbW9kaWZpZWQgc3JjIGltYWdlIHNvIGp1c3QgaXQgc2hvdWxkIGJlCisgICAgICogcGFpbnRlZC4gT1ZFUiBtZWFucyB0aGUgcmVzdWx0IG9mIGFwcGx5IGVmZmVjdCBzaG91bGQgYmUgcGFpbnRlZCBvdmVyIHRoZSBzcmMgaW1hZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlZmZlY3QgdHlwZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEVmZmVjdFR5cGUgZ2V0RWZmZWN0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEVmZmVjdFR5cGUuVU5ERVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIGVmZmVjdCB0byB0aGUgc3JjIGltYWdlIGdlbmVyYXRpbmcgdGhlIHJlc3VsdCAuIFRoZSByZXN1bHQgaW1hZ2UgbWF5IG9yIG1heSBub3QgY29udGFpbiB0aGUgc291cmNlCisgICAgICogaW1hZ2UgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGVmZmVjdCB0eXBlIGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGltYWdlIGZvciBhcHBseWluZyB0aGUgZWZmZWN0IHRvCisgICAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UgdG8gcGFpbnQgZWZmZWN0IHJlc3VsdCBpbnRvLiBJZiB0aGlzIGlzIG51bGwgdGhlbiBhIG5ldyBpbWFnZSB3aWxsIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gdyAgIFRoZSB3aWR0aCBvZiB0aGUgc3JjIGltYWdlIHRvIGFwcGx5IGVmZmVjdCB0bywgdGhpcyBhbGxvdyB0aGUgc3JjIGFuZCBkc3QgYnVmZmVycyB0byBiZSBiaWdnZXIgdGhhbgorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgdGhlIG5lZWQgZWZmZWN0IGFwcGxpZWQgdG8gaXQKKyAgICAgKiBAcGFyYW0gaCAgIFRoZSBoZWlnaHQgb2YgdGhlIHNyYyBpbWFnZSB0byBhcHBseSBlZmZlY3QgdG8sIHRoaXMgYWxsb3cgdGhlIHNyYyBhbmQgZHN0IGJ1ZmZlcnMgdG8gYmUgYmlnZ2VyIHRoYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmVhIHRoZSBuZWVkIGVmZmVjdCBhcHBsaWVkIHRvIGl0CisgICAgICogQHJldHVybiBJbWFnZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGVmZmVjdAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEJ1ZmZlcmVkSW1hZ2UgYXBwbHlFZmZlY3QoQnVmZmVyZWRJbWFnZSBzcmMsIEJ1ZmZlcmVkSW1hZ2UgZHN0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsIHx8IHNyYy5nZXRUeXBlKCkgIT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVmZmVjdCBvbmx5IHdvcmtzIHdpdGggIiArCisgICAgICAgICAgICAgICAgICAgICJzb3VyY2UgaW1hZ2VzIG9mIHR5cGUgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChkc3QgIT0gbnVsbCAmJiBkc3QuZ2V0VHlwZSgpICE9IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQil7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFZmZlY3Qgb25seSB3b3JrcyB3aXRoICIgKworICAgICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gaW1hZ2VzIG9mIHR5cGUgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCLiIpOworICAgICAgICB9CisgICAgICAgIC8vIGNhbGN1bGF0ZSBvZmZzZXQKKyAgICAgICAgZG91YmxlIHRyYW5nbGVBbmdsZSA9IE1hdGgudG9SYWRpYW5zKGFuZ2xlIC0gOTApOworICAgICAgICBpbnQgb2Zmc2V0WCA9IChpbnQpIChNYXRoLnNpbih0cmFuZ2xlQW5nbGUpICogZGlzdGFuY2UpOworICAgICAgICBpbnQgb2Zmc2V0WSA9IChpbnQpIChNYXRoLmNvcyh0cmFuZ2xlQW5nbGUpICogZGlzdGFuY2UpOworICAgICAgICAvLyBjbGFjIGV4cGFuZGVkIHNpemUKKyAgICAgICAgaW50IHRtcE9mZlggPSBvZmZzZXRYICsgc2l6ZTsKKyAgICAgICAgaW50IHRtcE9mZlkgPSBvZmZzZXRYICsgc2l6ZTsKKyAgICAgICAgaW50IHRtcFcgPSB3ICsgb2Zmc2V0WCArIHNpemUgKyBzaXplOworICAgICAgICBpbnQgdG1wSCA9IGggKyBvZmZzZXRYICsgc2l6ZTsKKyAgICAgICAgLy8gY3JlYXRlIHRtcCBidWZmZXJzCisgICAgICAgIGludFtdIGxpbmVCdWYgPSBnZXRBcnJheUNhY2hlKCkuZ2V0VG1wSW50QXJyYXkodyk7CisgICAgICAgIGJ5dGVbXSB0bXBCdWYxID0gZ2V0QXJyYXlDYWNoZSgpLmdldFRtcEJ5dGVBcnJheTEodG1wVyAqIHRtcEgpOworICAgICAgICBBcnJheXMuZmlsbCh0bXBCdWYxLCAoYnl0ZSkgMHgwMCk7CisgICAgICAgIGJ5dGVbXSB0bXBCdWYyID0gZ2V0QXJyYXlDYWNoZSgpLmdldFRtcEJ5dGVBcnJheTIodG1wVyAqIHRtcEgpOworICAgICAgICAvLyBleHRyYWN0IHNyYyBpbWFnZSBhbHBoYSBjaGFubmVsIGFuZCBpbnZlcnNlIGFuZCBvZmZzZXQKKyAgICAgICAgUmFzdGVyIHNyY1Jhc3RlciA9IHNyYy5nZXRSYXN0ZXIoKTsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGludCBkeSA9ICh5ICsgdG1wT2ZmWSk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZHkgKiB0bXBXOworICAgICAgICAgICAgc3JjUmFzdGVyLmdldERhdGFFbGVtZW50cygwLCB5LCB3LCAxLCBsaW5lQnVmKTsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGR4ID0geCArIHRtcE9mZlg7CisgICAgICAgICAgICAgICAgdG1wQnVmMVtvZmZzZXQgKyBkeF0gPSAoYnl0ZSkgKChsaW5lQnVmW3hdICYgMHhGRjAwMDAwMCkgPj4+IDI0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBibHVyCisgICAgICAgIGZsb2F0W10ga2VybmVsID0gRWZmZWN0VXRpbHMuY3JlYXRlR2F1c3NpYW5LZXJuZWwoc2l6ZSk7CisgICAgICAgIEVmZmVjdFV0aWxzLmJsdXIodG1wQnVmMSwgdG1wQnVmMiwgdG1wVywgdG1wSCwga2VybmVsLCBzaXplKTsgLy8gaG9yaXpvbnRhbCBwYXNzCisgICAgICAgIEVmZmVjdFV0aWxzLmJsdXIodG1wQnVmMiwgdG1wQnVmMSwgdG1wSCwgdG1wVywga2VybmVsLCBzaXplKTsvLyB2ZXJ0aWNhbCBwYXNzCisgICAgICAgIC8vcmVzY2FsZQorICAgICAgICBmbG9hdCBzcHJlYWQgPSBNYXRoLm1pbigxIC8gKDEgLSAoMC4wMWYgKiB0aGlzLnNwcmVhZCkpLCAyNTUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRtcEJ1ZjEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoaW50KSAoKChpbnQpIHRtcEJ1ZjFbaV0gJiAweEZGKSAqIHNwcmVhZCk7CisgICAgICAgICAgICB0bXBCdWYxW2ldID0gKHZhbCA+IDI1NSkgPyAoYnl0ZSkgMHhGRiA6IChieXRlKSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIGNvbG9yIGltYWdlIHdpdGggc2hhZG93IGNvbG9yIGFuZCBncmV5c2NhbGUgaW1hZ2UgYXMgYWxwaGEKKyAgICAgICAgaWYgKGRzdCA9PSBudWxsKSBkc3QgPSBuZXcgQnVmZmVyZWRJbWFnZSh3LCBoLAorICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQik7CisgICAgICAgIFdyaXRhYmxlUmFzdGVyIHNoYWRvd1Jhc3RlciA9IGRzdC5nZXRSYXN0ZXIoKTsKKyAgICAgICAgaW50IHJlZCA9IGNvbG9yLmdldFJlZCgpLCBncmVlbiA9IGNvbG9yLmdldEdyZWVuKCksIGJsdWUgPSBjb2xvci5nZXRCbHVlKCk7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBpbnQgc3JjWSA9IHkgKyB0bXBPZmZZOworICAgICAgICAgICAgaW50IHNoYWRvd09mZnNldCA9IChzcmNZIC0gb2Zmc2V0WSkgKiB0bXBXOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjWCA9IHggKyB0bXBPZmZYOworICAgICAgICAgICAgICAgIGxpbmVCdWZbeF0gPSB0bXBCdWYxW3NoYWRvd09mZnNldCArIChzcmNYIC0gb2Zmc2V0WCldIDw8IDI0IHwgcmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGFkb3dSYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKDAsIHksIHcsIDEsIGxpbmVCdWYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkc3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0VmZmVjdC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0VmZmVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODhlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvRWZmZWN0LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgamF2YXguc3dpbmcucGxhZi5uaW1idXM7CisKK2ltcG9ydCBzdW4uYXd0LkFwcENvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKKworLyoqCisgKiBFZmZlY3QKKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChKdW4gMTgsIDIwMDcpCisgKi8KK2Fic3RyYWN0IGNsYXNzIEVmZmVjdCB7CisgICAgZW51bSBFZmZlY3RUeXBlIHsKKyAgICAgICAgVU5ERVIsIEJMRU5ERUQsIE9WRVIKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEFic3RyYWN0IE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHlwZSBvZiB0aGlzIGVmZmVjdCwgb25lIG9mIFVOREVSLEJMRU5ERUQsT1ZFUi4gVU5ERVIgbWVhbnMgdGhlIHJlc3VsdCBvZiBhcHBseSBlZmZlY3Qgc2hvdWxkIGJlIHBhaW50ZWQKKyAgICAgKiB1bmRlciB0aGUgc3JjIGltYWdlLiBCTEVOREVEIG1lYW5zIHRoZSByZXN1bHQgb2YgYXBwbHkgc2ZmZWN0IGNvbnRhaW5zIGEgbW9kaWZpZWQgc3JjIGltYWdlIHNvIGp1c3QgaXQgc2hvdWxkIGJlCisgICAgICogcGFpbnRlZC4gT1ZFUiBtZWFucyB0aGUgcmVzdWx0IG9mIGFwcGx5IGVmZmVjdCBzaG91bGQgYmUgcGFpbnRlZCBvdmVyIHRoZSBzcmMgaW1hZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlZmZlY3QgdHlwZQorICAgICAqLworICAgIGFic3RyYWN0IEVmZmVjdFR5cGUgZ2V0RWZmZWN0VHlwZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBvcGFjaXR5IHRvIHVzZSB0byBwYWludCB0aGUgcmVzdWx0IGVmZmVjdGVkIGltYWdlIGlmIHRoZSBFZmZlY3RUeXBlIGlzIFVOREVSIG9yIE9WRVIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvcGFjdGl0eSBmb3IgdGhlIGVmZmVjdCwgMC4wZiAtPiAxLjBmCisgICAgICovCisgICAgYWJzdHJhY3QgZmxvYXQgZ2V0T3BhY2l0eSgpOworCisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIGVmZmVjdCB0byB0aGUgc3JjIGltYWdlIGdlbmVyYXRpbmcgdGhlIHJlc3VsdCAuIFRoZSByZXN1bHQgaW1hZ2UgbWF5IG9yIG1heSBub3QgY29udGFpbiB0aGUgc291cmNlCisgICAgICogaW1hZ2UgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGVmZmVjdCB0eXBlIGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGltYWdlIGZvciBhcHBseWluZyB0aGUgZWZmZWN0IHRvCisgICAgICogQHBhcmFtIGRzdCBUaGUgZHN0aW5hdGlvbiBpbWFnZSB0byBwYWludCBlZmZlY3QgcmVzdWx0IGludG8uIElmIHRoaXMgaXMgbnVsbCB0aGVuIGEgbmV3IGltYWdlIHdpbGwgYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSB3ICAgVGhlIHdpZHRoIG9mIHRoZSBzcmMgaW1hZ2UgdG8gYXBwbHkgZWZmZWN0IHRvLCB0aGlzIGFsbG93IHRoZSBzcmMgYW5kIGRzdCBidWZmZXJzIHRvIGJlIGJpZ2dlciB0aGFuCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSB0aGUgbmVlZCBlZmZlY3QgYXBwbGllZCB0byBpdAorICAgICAqIEBwYXJhbSBoICAgVGhlIGhlaWdodCBvZiB0aGUgc3JjIGltYWdlIHRvIGFwcGx5IGVmZmVjdCB0bywgdGhpcyBhbGxvdyB0aGUgc3JjIGFuZCBkc3QgYnVmZmVycyB0byBiZSBiaWdnZXIgdGhhbgorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgdGhlIG5lZWQgZWZmZWN0IGFwcGxpZWQgdG8gaXQKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgYXBwbAorICAgICAqLworICAgIGFic3RyYWN0IEJ1ZmZlcmVkSW1hZ2UgYXBwbHlFZmZlY3QoQnVmZmVyZWRJbWFnZSBzcmMsIEJ1ZmZlcmVkSW1hZ2UgZHN0LCBpbnQgdywgaW50IGgpOworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBTdGF0aWMgZGF0YSBjYWNoZQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBBcnJheUNhY2hlIGdldEFycmF5Q2FjaGUoKSB7CisgICAgICAgIEFycmF5Q2FjaGUgY2FjaGUgPSAoQXJyYXlDYWNoZSlBcHBDb250ZXh0LmdldEFwcENvbnRleHQoKS5nZXQoQXJyYXlDYWNoZS5jbGFzcyk7CisgICAgICAgIGlmIChjYWNoZSA9PSBudWxsKXsKKyAgICAgICAgICAgIGNhY2hlID0gbmV3IEFycmF5Q2FjaGUoKTsKKyAgICAgICAgICAgIEFwcENvbnRleHQuZ2V0QXBwQ29udGV4dCgpLnB1dChBcnJheUNhY2hlLmNsYXNzLGNhY2hlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBBcnJheUNhY2hlIHsKKyAgICAgICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPGludFtdPiB0bXBJbnRBcnJheSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU29mdFJlZmVyZW5jZTxieXRlW10+IHRtcEJ5dGVBcnJheTEgPSBudWxsOworICAgICAgICBwcml2YXRlIFNvZnRSZWZlcmVuY2U8Ynl0ZVtdPiB0bXBCeXRlQXJyYXkyID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPGJ5dGVbXT4gdG1wQnl0ZUFycmF5MyA9IG51bGw7CisKKyAgICAgICAgcHJvdGVjdGVkIGludFtdIGdldFRtcEludEFycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICBpbnRbXSB0bXA7CisgICAgICAgICAgICBpZiAodG1wSW50QXJyYXkgPT0gbnVsbCB8fCAodG1wID0gdG1wSW50QXJyYXkuZ2V0KCkpID09IG51bGwgfHwgdG1wLmxlbmd0aCA8IHNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGFycmF5CisgICAgICAgICAgICAgICAgdG1wID0gbmV3IGludFtzaXplXTsKKyAgICAgICAgICAgICAgICB0bXBJbnRBcnJheSA9IG5ldyBTb2Z0UmVmZXJlbmNlPGludFtdPih0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBieXRlW10gZ2V0VG1wQnl0ZUFycmF5MShpbnQgc2l6ZSkgeworICAgICAgICAgICAgYnl0ZVtdIHRtcDsKKyAgICAgICAgICAgIGlmICh0bXBCeXRlQXJyYXkxID09IG51bGwgfHwgKHRtcCA9IHRtcEJ5dGVBcnJheTEuZ2V0KCkpID09IG51bGwgfHwgdG1wLmxlbmd0aCA8IHNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGFycmF5CisgICAgICAgICAgICAgICAgdG1wID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICAgICAgdG1wQnl0ZUFycmF5MSA9IG5ldyBTb2Z0UmVmZXJlbmNlPGJ5dGVbXT4odG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0bXA7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldFRtcEJ5dGVBcnJheTIoaW50IHNpemUpIHsKKyAgICAgICAgICAgIGJ5dGVbXSB0bXA7CisgICAgICAgICAgICBpZiAodG1wQnl0ZUFycmF5MiA9PSBudWxsIHx8ICh0bXAgPSB0bXBCeXRlQXJyYXkyLmdldCgpKSA9PSBudWxsIHx8IHRtcC5sZW5ndGggPCBzaXplKSB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBhcnJheQorICAgICAgICAgICAgICAgIHRtcCA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgICAgIHRtcEJ5dGVBcnJheTIgPSBuZXcgU29mdFJlZmVyZW5jZTxieXRlW10+KHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG1wOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXRUbXBCeXRlQXJyYXkzKGludCBzaXplKSB7CisgICAgICAgICAgICBieXRlW10gdG1wOworICAgICAgICAgICAgaWYgKHRtcEJ5dGVBcnJheTMgPT0gbnVsbCB8fCAodG1wID0gdG1wQnl0ZUFycmF5My5nZXQoKSkgPT0gbnVsbCB8fCB0bXAubGVuZ3RoIDwgc2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgYXJyYXkKKyAgICAgICAgICAgICAgICB0bXAgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgICAgICB0bXBCeXRlQXJyYXkzID0gbmV3IFNvZnRSZWZlcmVuY2U8Ynl0ZVtdPih0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9FZmZlY3RVdGlscy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0VmZmVjdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiNGExMgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9FZmZlY3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsNDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYubmltYnVzOworCitpbXBvcnQgamF2YS5hd3QuQWxwaGFDb21wb3NpdGU7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5UcmFuc3BhcmVuY3k7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NDb25maWd1cmF0aW9uOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzRW52aXJvbm1lbnQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5SYXN0ZXI7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuV3JpdGFibGVSYXN0ZXI7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbDsKKworLyoqCisgKiBFZmZlY3RVdGlscworICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biAxOCwgMjAwNykKKyAqLworY2xhc3MgRWZmZWN0VXRpbHMgeworCisgICAgLyoqCisgICAgICogQ2xlYXIgYSB0cmFuc3BhcmVudCBpbWFnZSB0byAxMDAlIHRyYW5zcGFyZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1nIFRoZSBpbWFnZSB0byBjbGVhcgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNsZWFySW1hZ2UoQnVmZmVyZWRJbWFnZSBpbWcpIHsKKyAgICAgICAgR3JhcGhpY3MyRCBnMiA9IGltZy5jcmVhdGVHcmFwaGljcygpOworICAgICAgICBnMi5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOworICAgICAgICBnMi5maWxsUmVjdCgwLCAwLCBpbWcuZ2V0V2lkdGgoKSwgaW1nLmdldEhlaWdodCgpKTsKKyAgICAgICAgZzIuZGlzcG9zZSgpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQmx1cgorCisgICAgLyoqCisgICAgICogQXBwbHkgR2F1c3NpYW4gQmx1ciB0byBJbWFnZQorICAgICAqCisgICAgICogQHBhcmFtIHNyYyAgICBUaGUgaW1hZ2UgdHAKKyAgICAgKiBAcGFyYW0gZHN0ICAgIFRoZSBkZXN0aW5hdGlvbiBpbWFnZSB0byBkcmF3IGJsdXJlZCBzcmMgaW1hZ2UgaW50bywgbnVsbCBpZiB5b3Ugd2FudCBhIG5ldyBvbmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSByYWRpdXMgVGhlIGJsdXIga2VybmVsIHJhZGl1cworICAgICAqIEByZXR1cm4gVGhlIGJsdXJlZCBpbWFnZQorICAgICAqLworICAgIHN0YXRpYyBCdWZmZXJlZEltYWdlIGdhdXNzaWFuQmx1cihCdWZmZXJlZEltYWdlIHNyYywgQnVmZmVyZWRJbWFnZSBkc3QsIGludCByYWRpdXMpIHsKKyAgICAgICAgaW50IHdpZHRoID0gc3JjLmdldFdpZHRoKCk7CisgICAgICAgIGludCBoZWlnaHQgPSBzcmMuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGlmIChkc3QgPT0gbnVsbCB8fCBkc3QuZ2V0V2lkdGgoKSAhPSB3aWR0aCB8fCBkc3QuZ2V0SGVpZ2h0KCkgIT0gaGVpZ2h0IHx8IHNyYy5nZXRUeXBlKCkgIT0gZHN0LmdldFR5cGUoKSkgeworICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29sb3JNb2RlbENvbXBhdGlibGVJbWFnZShzcmMpOworICAgICAgICB9CisgICAgICAgIGZsb2F0W10ga2VybmVsID0gY3JlYXRlR2F1c3NpYW5LZXJuZWwocmFkaXVzKTsKKyAgICAgICAgaWYgKHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSB7CisgICAgICAgICAgICBpbnRbXSBzcmNQaXhlbHMgPSBuZXcgaW50W3dpZHRoICogaGVpZ2h0XTsKKyAgICAgICAgICAgIGludFtdIGRzdFBpeGVscyA9IG5ldyBpbnRbd2lkdGggKiBoZWlnaHRdOworICAgICAgICAgICAgZ2V0UGl4ZWxzKHNyYywgMCwgMCwgd2lkdGgsIGhlaWdodCwgc3JjUGl4ZWxzKTsKKyAgICAgICAgICAgIC8vIGhvcml6b250YWwgcGFzcworICAgICAgICAgICAgYmx1cihzcmNQaXhlbHMsIGRzdFBpeGVscywgd2lkdGgsIGhlaWdodCwga2VybmVsLCByYWRpdXMpOworICAgICAgICAgICAgLy8gdmVydGljYWwgcGFzcworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gU3VzcGljaW91c05hbWVDb21iaW5hdGlvbgorICAgICAgICAgICAgYmx1cihkc3RQaXhlbHMsIHNyY1BpeGVscywgaGVpZ2h0LCB3aWR0aCwga2VybmVsLCByYWRpdXMpOworICAgICAgICAgICAgLy8gdGhlIHJlc3VsdCBpcyBub3cgc3RvcmVkIGluIHNyY1BpeGVscyBkdWUgdG8gdGhlIDJuZCBwYXNzCisgICAgICAgICAgICBzZXRQaXhlbHMoZHN0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBzcmNQaXhlbHMpOworICAgICAgICB9IGVsc2UgaWYgKHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0JZVEVfR1JBWSkgeworICAgICAgICAgICAgYnl0ZVtdIHNyY1BpeGVscyA9IG5ldyBieXRlW3dpZHRoICogaGVpZ2h0XTsKKyAgICAgICAgICAgIGJ5dGVbXSBkc3RQaXhlbHMgPSBuZXcgYnl0ZVt3aWR0aCAqIGhlaWdodF07CisgICAgICAgICAgICBnZXRQaXhlbHMoc3JjLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBzcmNQaXhlbHMpOworICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBwYXNzCisgICAgICAgICAgICBibHVyKHNyY1BpeGVscywgZHN0UGl4ZWxzLCB3aWR0aCwgaGVpZ2h0LCBrZXJuZWwsIHJhZGl1cyk7CisgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBwYXNzCisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBTdXNwaWNpb3VzTmFtZUNvbWJpbmF0aW9uCisgICAgICAgICAgICBibHVyKGRzdFBpeGVscywgc3JjUGl4ZWxzLCBoZWlnaHQsIHdpZHRoLCBrZXJuZWwsIHJhZGl1cyk7CisgICAgICAgICAgICAvLyB0aGUgcmVzdWx0IGlzIG5vdyBzdG9yZWQgaW4gc3JjUGl4ZWxzIGR1ZSB0byB0aGUgMm5kIHBhc3MKKyAgICAgICAgICAgIHNldFBpeGVscyhkc3QsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIHNyY1BpeGVscyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFZmZlY3RVdGlscy5nYXVzc2lhbkJsdXIoKSBzcmMgaW1hZ2UgaXMgbm90IGEgc3VwcG9ydGVkIHR5cGUsIHR5cGU9WyIgKworICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0VHlwZSgpICsgIl0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkJsdXJzIHRoZSBzb3VyY2UgcGl4ZWxzIGludG8gdGhlIGRlc3RpbmF0aW9uIHBpeGVscy4gVGhlIGZvcmNlIG9mIHRoZSBibHVyIGlzIHNwZWNpZmllZCBieSB0aGUgcmFkaXVzIHdoaWNoCisgICAgICogbXVzdCBiZSBncmVhdGVyIHRoYW4gMC48L3A+IDxwPlRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBpeGVscyBhcnJheXMgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBJTlRfQVJHQgorICAgICAqIGZvcm1hdC48L3A+IDxwPkFmdGVyIHRoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkLCBkc3RQaXhlbHMgY29udGFpbnMgYSB0cmFuc3Bvc2VkIGFuZCBmaWx0ZXJlZCBjb3B5IG9mCisgICAgICogc3JjUGl4ZWxzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmNQaXhlbHMgdGhlIHNvdXJjZSBwaXhlbHMKKyAgICAgKiBAcGFyYW0gZHN0UGl4ZWxzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbHMKKyAgICAgKiBAcGFyYW0gd2lkdGggICAgIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIHBpY3R1cmUKKyAgICAgKiBAcGFyYW0gaGVpZ2h0ICAgIHRoZSBoZWlnaHQgb2YgdGhlIHNvdXJjZSBwaWN0dXJlCisgICAgICogQHBhcmFtIGtlcm5lbCAgICB0aGUga2VybmVsIG9mIHRoZSBibHVyIGVmZmVjdAorICAgICAqIEBwYXJhbSByYWRpdXMgICAgdGhlIHJhZGl1cyBvZiB0aGUgYmx1ciBlZmZlY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJsdXIoaW50W10gc3JjUGl4ZWxzLCBpbnRbXSBkc3RQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBrZXJuZWwsIGludCByYWRpdXMpIHsKKyAgICAgICAgZmxvYXQgYTsKKyAgICAgICAgZmxvYXQgcjsKKyAgICAgICAgZmxvYXQgZzsKKyAgICAgICAgZmxvYXQgYjsKKworICAgICAgICBpbnQgY2E7CisgICAgICAgIGludCBjcjsKKyAgICAgICAgaW50IGNnOworICAgICAgICBpbnQgY2I7CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgaW50IGluZGV4ID0geTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSB5ICogd2lkdGg7CisKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGEgPSByID0gZyA9IGIgPSAwLjBmOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IC1yYWRpdXM7IGkgPD0gcmFkaXVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN1Yk9mZnNldCA9IHggKyBpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ViT2Zmc2V0IDwgMCB8fCBzdWJPZmZzZXQgPj0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk9mZnNldCA9ICh4ICsgd2lkdGgpICUgd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWwgPSBzcmNQaXhlbHNbb2Zmc2V0ICsgc3ViT2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmx1ckZhY3RvciA9IGtlcm5lbFtyYWRpdXMgKyBpXTsKKworICAgICAgICAgICAgICAgICAgICBhICs9IGJsdXJGYWN0b3IgKiAoKHBpeGVsID4+IDI0KSAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICByICs9IGJsdXJGYWN0b3IgKiAoKHBpeGVsID4+IDE2KSAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICBnICs9IGJsdXJGYWN0b3IgKiAoKHBpeGVsID4+IDgpICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgIGIgKz0gYmx1ckZhY3RvciAqICgocGl4ZWwpICYgMHhGRik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2EgPSAoaW50KSAoYSArIDAuNWYpOworICAgICAgICAgICAgICAgIGNyID0gKGludCkgKHIgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBjZyA9IChpbnQpIChnICsgMC41Zik7CisgICAgICAgICAgICAgICAgY2IgPSAoaW50KSAoYiArIDAuNWYpOworCisgICAgICAgICAgICAgICAgZHN0UGl4ZWxzW2luZGV4XSA9ICgoY2EgPiAyNTUgPyAyNTUgOiBjYSkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY3IgPiAyNTUgPyAyNTUgOiBjcikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY2cgPiAyNTUgPyAyNTUgOiBjZykgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKGNiID4gMjU1ID8gMjU1IDogY2IpOworICAgICAgICAgICAgICAgIGluZGV4ICs9IGhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkJsdXJzIHRoZSBzb3VyY2UgcGl4ZWxzIGludG8gdGhlIGRlc3RpbmF0aW9uIHBpeGVscy4gVGhlIGZvcmNlIG9mIHRoZSBibHVyIGlzIHNwZWNpZmllZCBieSB0aGUgcmFkaXVzIHdoaWNoCisgICAgICogbXVzdCBiZSBncmVhdGVyIHRoYW4gMC48L3A+IDxwPlRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBpeGVscyBhcnJheXMgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBCWVRFX0dSRVkKKyAgICAgKiBmb3JtYXQuPC9wPiA8cD5BZnRlciB0aGlzIG1ldGhvZCBpcyBleGVjdXRlZCwgZHN0UGl4ZWxzIGNvbnRhaW5zIGEgdHJhbnNwb3NlZCBhbmQgZmlsdGVyZWQgY29weSBvZgorICAgICAqIHNyY1BpeGVscy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjUGl4ZWxzIHRoZSBzb3VyY2UgcGl4ZWxzCisgICAgICogQHBhcmFtIGRzdFBpeGVscyB0aGUgZGVzdGluYXRpb24gcGl4ZWxzCisgICAgICogQHBhcmFtIHdpZHRoICAgICB0aGUgd2lkdGggb2YgdGhlIHNvdXJjZSBwaWN0dXJlCisgICAgICogQHBhcmFtIGhlaWdodCAgICB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgcGljdHVyZQorICAgICAqIEBwYXJhbSBrZXJuZWwgICAgdGhlIGtlcm5lbCBvZiB0aGUgYmx1ciBlZmZlY3QKKyAgICAgKiBAcGFyYW0gcmFkaXVzICAgIHRoZSByYWRpdXMgb2YgdGhlIGJsdXIgZWZmZWN0CisgICAgICovCisgICAgc3RhdGljIHZvaWQgYmx1cihieXRlW10gc3JjUGl4ZWxzLCBieXRlW10gZHN0UGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIGtlcm5lbCwgaW50IHJhZGl1cykgeworICAgICAgICBmbG9hdCBwOworICAgICAgICBpbnQgY3A7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0geSAqIHdpZHRoOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcCA9IDAuMGY7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IC1yYWRpdXM7IGkgPD0gcmFkaXVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN1Yk9mZnNldCA9IHggKyBpOworLy8gICAgICAgICAgICAgICAgICAgIGlmIChzdWJPZmZzZXQgPCAwKSBzdWJPZmZzZXQgPSAwOworLy8gICAgICAgICAgICAgICAgICAgIGlmIChzdWJPZmZzZXQgPj0gd2lkdGgpIHN1Yk9mZnNldCA9IHdpZHRoLTE7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJPZmZzZXQgPCAwIHx8IHN1Yk9mZnNldCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ViT2Zmc2V0ID0gKHggKyB3aWR0aCkgJSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWwgPSBzcmNQaXhlbHNbb2Zmc2V0ICsgc3ViT2Zmc2V0XSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJsdXJGYWN0b3IgPSBrZXJuZWxbcmFkaXVzICsgaV07CisgICAgICAgICAgICAgICAgICAgIHAgKz0gYmx1ckZhY3RvciAqIHBpeGVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjcCA9IChpbnQpIChwICsgMC41Zik7CisgICAgICAgICAgICAgICAgZHN0UGl4ZWxzW2luZGV4XSA9IChieXRlKSAoY3AgPiAyNTUgPyAyNTUgOiBjcCk7CisgICAgICAgICAgICAgICAgaW5kZXggKz0gaGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZsb2F0W10gY3JlYXRlR2F1c3NpYW5LZXJuZWwoaW50IHJhZGl1cykgeworICAgICAgICBpZiAocmFkaXVzIDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmFkaXVzIG11c3QgYmUgPj0gMSIpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXRbXSBkYXRhID0gbmV3IGZsb2F0W3JhZGl1cyAqIDIgKyAxXTsKKworICAgICAgICBmbG9hdCBzaWdtYSA9IHJhZGl1cyAvIDMuMGY7CisgICAgICAgIGZsb2F0IHR3b1NpZ21hU3F1YXJlID0gMi4wZiAqIHNpZ21hICogc2lnbWE7CisgICAgICAgIGZsb2F0IHNpZ21hUm9vdCA9IChmbG9hdCkgTWF0aC5zcXJ0KHR3b1NpZ21hU3F1YXJlICogTWF0aC5QSSk7CisgICAgICAgIGZsb2F0IHRvdGFsID0gMC4wZjsKKworICAgICAgICBmb3IgKGludCBpID0gLXJhZGl1czsgaSA8PSByYWRpdXM7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgZGlzdGFuY2UgPSBpICogaTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGkgKyByYWRpdXM7CisgICAgICAgICAgICBkYXRhW2luZGV4XSA9IChmbG9hdCkgTWF0aC5leHAoLWRpc3RhbmNlIC8gdHdvU2lnbWFTcXVhcmUpIC8gc2lnbWFSb290OworICAgICAgICAgICAgdG90YWwgKz0gZGF0YVtpbmRleF07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFbaV0gLz0gdG90YWw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIEdldC9TZXQgUGl4ZWxzIGhlbHBlciBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiA8cD5SZXR1cm5zIGFuIGFycmF5IG9mIHBpeGVscywgc3RvcmVkIGFzIGludGVnZXJzLCBmcm9tIGEgPGNvZGU+QnVmZmVyZWRJbWFnZTwvY29kZT4uIFRoZSBwaXhlbHMgYXJlIGdyYWJiZWQgZnJvbQorICAgICAqIGEgcmVjdGFuZ3VsYXIgYXJlYSBkZWZpbmVkIGJ5IGEgbG9jYXRpb24gYW5kIHR3byBkaW1lbnNpb25zLiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFuIGltYWdlIG9mIHR5cGUgZGlmZmVyZW50CisgICAgICogZnJvbSA8Y29kZT5CdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0I8L2NvZGU+IGFuZCA8Y29kZT5CdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQjwvY29kZT4gd2lsbCB1bm1hbmFnZSB0aGUKKyAgICAgKiBpbWFnZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1nICAgIHRoZSBzb3VyY2UgaW1hZ2UKKyAgICAgKiBAcGFyYW0geCAgICAgIHRoZSB4IGxvY2F0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IGdyYWJiaW5nIHBpeGVscworICAgICAqIEBwYXJhbSB5ICAgICAgdGhlIHkgbG9jYXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgZ3JhYmJpbmcgcGl4ZWxzCisgICAgICogQHBhcmFtIHcgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMgdG8gZ3JhYgorICAgICAqIEBwYXJhbSBoICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscyB0byBncmFiCisgICAgICogQHBhcmFtIHBpeGVscyBhIHByZS1hbGxvY2F0ZWQgYXJyYXkgb2YgcGl4ZWxzIG9mIHNpemUgdypoOyBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gPGNvZGU+cGl4ZWxzPC9jb2RlPiBpZiBub24tbnVsbCwgYSBuZXcgYXJyYXkgb2YgaW50ZWdlcnMgb3RoZXJ3aXNlCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgPGNvZGU+cGl4ZWxzPC9jb2RlPiBpcyBub24tbnVsbCBhbmQgb2YgbGVuZ3RoICZsdDsgdypoCisgICAgICovCisgICAgc3RhdGljIGJ5dGVbXSBnZXRQaXhlbHMoQnVmZmVyZWRJbWFnZSBpbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBieXRlW10gcGl4ZWxzKSB7CisgICAgICAgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgICAgIH0KKworICAgICAgICBpZiAocGl4ZWxzID09IG51bGwpIHsKKyAgICAgICAgICAgIHBpeGVscyA9IG5ldyBieXRlW3cgKiBoXTsKKyAgICAgICAgfSBlbHNlIGlmIChwaXhlbHMubGVuZ3RoIDwgdyAqIGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBpeGVscyBhcnJheSBtdXN0IGhhdmUgYSBsZW5ndGggPj0gdypoIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaW1hZ2VUeXBlID0gaW1nLmdldFR5cGUoKTsKKyAgICAgICAgaWYgKGltYWdlVHlwZSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfQllURV9HUkFZKSB7CisgICAgICAgICAgICBSYXN0ZXIgcmFzdGVyID0gaW1nLmdldFJhc3RlcigpOworICAgICAgICAgICAgcmV0dXJuIChieXRlW10pIHJhc3Rlci5nZXREYXRhRWxlbWVudHMoeCwgeSwgdywgaCwgcGl4ZWxzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9ubHkgdHlwZSBCWVRFX0dSQVkgaXMgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Xcml0ZXMgYSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBpbiB0aGUgZGVzdGluYXRpb24gPGNvZGU+QnVmZmVyZWRJbWFnZTwvY29kZT4uIENhbGxpbmcgdGhpcyBtZXRob2Qgb24gYW4KKyAgICAgKiBpbWFnZSBvZiB0eXBlIGRpZmZlcmVudCBmcm9tIDxjb2RlPkJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQjwvY29kZT4gYW5kIDxjb2RlPkJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCPC9jb2RlPgorICAgICAqIHdpbGwgdW5tYW5hZ2UgdGhlIGltYWdlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbWcgICAgdGhlIGRlc3RpbmF0aW9uIGltYWdlCisgICAgICogQHBhcmFtIHggICAgICB0aGUgeCBsb2NhdGlvbiBhdCB3aGljaCB0byBzdGFydCBzdG9yaW5nIHBpeGVscworICAgICAqIEBwYXJhbSB5ICAgICAgdGhlIHkgbG9jYXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgc3RvcmluZyBwaXhlbHMKKyAgICAgKiBAcGFyYW0gdyAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscyB0byBzdG9yZQorICAgICAqIEBwYXJhbSBoICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscyB0byBzdG9yZQorICAgICAqIEBwYXJhbSBwaXhlbHMgYW4gYXJyYXkgb2YgcGl4ZWxzLCBzdG9yZWQgYXMgaW50ZWdlcnMKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyA8Y29kZT5waXhlbHM8L2NvZGU+IGlzIG5vbi1udWxsIGFuZCBvZiBsZW5ndGggJmx0OyB3KmgKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZXRQaXhlbHMoQnVmZmVyZWRJbWFnZSBpbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgYnl0ZVtdIHBpeGVscykgeworICAgICAgICBpZiAocGl4ZWxzID09IG51bGwgfHwgdyA9PSAwIHx8IGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHBpeGVscy5sZW5ndGggPCB3ICogaCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGl4ZWxzIGFycmF5IG11c3QgaGF2ZSBhIGxlbmd0aCA+PSB3KmgiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaW1hZ2VUeXBlID0gaW1nLmdldFR5cGUoKTsKKyAgICAgICAgaWYgKGltYWdlVHlwZSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfQllURV9HUkFZKSB7CisgICAgICAgICAgICBXcml0YWJsZVJhc3RlciByYXN0ZXIgPSBpbWcuZ2V0UmFzdGVyKCk7CisgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIHksIHcsIGgsIHBpeGVscyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPbmx5IHR5cGUgQllURV9HUkFZIGlzIHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmV0dXJucyBhbiBhcnJheSBvZiBwaXhlbHMsIHN0b3JlZCBhcyBpbnRlZ2VycywgZnJvbSBhCisgICAgICogPGNvZGU+QnVmZmVyZWRJbWFnZTwvY29kZT4uIFRoZSBwaXhlbHMgYXJlIGdyYWJiZWQgZnJvbSBhIHJlY3Rhbmd1bGFyCisgICAgICogYXJlYSBkZWZpbmVkIGJ5IGEgbG9jYXRpb24gYW5kIHR3byBkaW1lbnNpb25zLiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uCisgICAgICogYW4gaW1hZ2Ugb2YgdHlwZSBkaWZmZXJlbnQgZnJvbSA8Y29kZT5CdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0I8L2NvZGU+CisgICAgICogYW5kIDxjb2RlPkJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCPC9jb2RlPiB3aWxsIHVubWFuYWdlIHRoZSBpbWFnZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1nIHRoZSBzb3VyY2UgaW1hZ2UKKyAgICAgKiBAcGFyYW0geCB0aGUgeCBsb2NhdGlvbiBhdCB3aGljaCB0byBzdGFydCBncmFiYmluZyBwaXhlbHMKKyAgICAgKiBAcGFyYW0geSB0aGUgeSBsb2NhdGlvbiBhdCB3aGljaCB0byBzdGFydCBncmFiYmluZyBwaXhlbHMKKyAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMgdG8gZ3JhYgorICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMgdG8gZ3JhYgorICAgICAqIEBwYXJhbSBwaXhlbHMgYSBwcmUtYWxsb2NhdGVkIGFycmF5IG9mIHBpeGVscyBvZiBzaXplIHcqaDsgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnBpeGVsczwvY29kZT4gaWYgbm9uLW51bGwsIGEgbmV3IGFycmF5IG9mIGludGVnZXJzCisgICAgICogICBvdGhlcndpc2UKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyA8Y29kZT5waXhlbHM8L2NvZGU+IGlzIG5vbi1udWxsIGFuZAorICAgICAqICAgb2YgbGVuZ3RoICZsdDsgdypoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRbXSBnZXRQaXhlbHMoQnVmZmVyZWRJbWFnZSBpbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludFtdIHBpeGVscykgeworICAgICAgICBpZiAodyA9PSAwIHx8IGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbMF07CisgICAgICAgIH0KKworICAgICAgICBpZiAocGl4ZWxzID09IG51bGwpIHsKKyAgICAgICAgICAgIHBpeGVscyA9IG5ldyBpbnRbdyAqIGhdOworICAgICAgICB9IGVsc2UgaWYgKHBpeGVscy5sZW5ndGggPCB3ICogaCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGl4ZWxzIGFycmF5IG11c3QgaGF2ZSBhIGxlbmd0aCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID49IHcqaCIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGltYWdlVHlwZSA9IGltZy5nZXRUeXBlKCk7CisgICAgICAgIGlmIChpbWFnZVR5cGUgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCIHx8CisgICAgICAgICAgICBpbWFnZVR5cGUgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IpIHsKKyAgICAgICAgICAgIFJhc3RlciByYXN0ZXIgPSBpbWcuZ2V0UmFzdGVyKCk7CisgICAgICAgICAgICByZXR1cm4gKGludFtdKSByYXN0ZXIuZ2V0RGF0YUVsZW1lbnRzKHgsIHksIHcsIGgsIHBpeGVscyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBVbm1hbmFnZXMgdGhlIGltYWdlCisgICAgICAgIHJldHVybiBpbWcuZ2V0UkdCKHgsIHksIHcsIGgsIHBpeGVscywgMCwgdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+V3JpdGVzIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgaW4gdGhlIGRlc3RpbmF0aW9uCisgICAgICogPGNvZGU+QnVmZmVyZWRJbWFnZTwvY29kZT4uIENhbGxpbmcgdGhpcyBtZXRob2Qgb24KKyAgICAgKiBhbiBpbWFnZSBvZiB0eXBlIGRpZmZlcmVudCBmcm9tIDxjb2RlPkJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQjwvY29kZT4KKyAgICAgKiBhbmQgPGNvZGU+QnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0I8L2NvZGU+IHdpbGwgdW5tYW5hZ2UgdGhlIGltYWdlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbWcgdGhlIGRlc3RpbmF0aW9uIGltYWdlCisgICAgICogQHBhcmFtIHggdGhlIHggbG9jYXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgc3RvcmluZyBwaXhlbHMKKyAgICAgKiBAcGFyYW0geSB0aGUgeSBsb2NhdGlvbiBhdCB3aGljaCB0byBzdGFydCBzdG9yaW5nIHBpeGVscworICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscyB0byBzdG9yZQorICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMgdG8gc3RvcmUKKyAgICAgKiBAcGFyYW0gcGl4ZWxzIGFuIGFycmF5IG9mIHBpeGVscywgc3RvcmVkIGFzIGludGVnZXJzCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgPGNvZGU+cGl4ZWxzPC9jb2RlPiBpcyBub24tbnVsbCBhbmQKKyAgICAgKiAgIG9mIGxlbmd0aCAmbHQ7IHcqaAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQaXhlbHMoQnVmZmVyZWRJbWFnZSBpbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50W10gcGl4ZWxzKSB7CisgICAgICAgIGlmIChwaXhlbHMgPT0gbnVsbCB8fCB3ID09IDAgfHwgaCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocGl4ZWxzLmxlbmd0aCA8IHcgKiBoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwaXhlbHMgYXJyYXkgbXVzdCBoYXZlIGEgbGVuZ3RoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPj0gdypoIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaW1hZ2VUeXBlID0gaW1nLmdldFR5cGUoKTsKKyAgICAgICAgaWYgKGltYWdlVHlwZSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IgfHwKKyAgICAgICAgICAgIGltYWdlVHlwZSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQikgeworICAgICAgICAgICAgV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gaW1nLmdldFJhc3RlcigpOworICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCB5LCB3LCBoLCBwaXhlbHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVW5tYW5hZ2VzIHRoZSBpbWFnZQorICAgICAgICAgICAgaW1nLnNldFJHQih4LCB5LCB3LCBoLCBwaXhlbHMsIDAsIHcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmV0dXJucyBhIG5ldyA8Y29kZT5CdWZmZXJlZEltYWdlPC9jb2RlPiB1c2luZyB0aGUgc2FtZSBjb2xvciBtb2RlbAorICAgICAqIGFzIHRoZSBpbWFnZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuIFRoZSByZXR1cm5lZCBpbWFnZSBpcyBvbmx5IGNvbXBhdGlibGUKKyAgICAgKiB3aXRoIHRoZSBpbWFnZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuIFRoaXMgZG9lcyBub3QgbWVhbiB0aGUgcmV0dXJuZWQKKyAgICAgKiBpbWFnZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGhhcmR3YXJlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgcmVmZXJlbmNlIGltYWdlIGZyb20gd2hpY2ggdGhlIGNvbG9yIG1vZGVsIG9mIHRoZSBuZXcKKyAgICAgKiAgIGltYWdlIGlzIG9idGFpbmVkCisgICAgICogQHJldHVybiBhIG5ldyA8Y29kZT5CdWZmZXJlZEltYWdlPC9jb2RlPiwgY29tcGF0aWJsZSB3aXRoIHRoZSBjb2xvciBtb2RlbAorICAgICAqICAgb2YgPGNvZGU+aW1hZ2U8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIGNyZWF0ZUNvbG9yTW9kZWxDb21wYXRpYmxlSW1hZ2UoQnVmZmVyZWRJbWFnZSBpbWFnZSkgeworICAgICAgICBDb2xvck1vZGVsIGNtID0gaW1hZ2UuZ2V0Q29sb3JNb2RlbCgpOworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoY20sCisgICAgICAgICAgICBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoaW1hZ2UuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5nZXRIZWlnaHQoKSksCisgICAgICAgICAgICBjbS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5SZXR1cm5zIGEgbmV3IHRyYW5zbHVjZW50IGNvbXBhdGlibGUgaW1hZ2Ugb2YgdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQKKyAgICAgKiBoZWlnaHQuIFRoYXQgaXMsIHRoZSByZXR1cm5lZCA8Y29kZT5CdWZmZXJlZEltYWdlPC9jb2RlPiBpcyBjb21wYXRpYmxlIHdpdGgKKyAgICAgKiB0aGUgZ3JhcGhpY3MgaGFyZHdhcmUuIElmIHRoZSBtZXRob2QgaXMgY2FsbGVkIGluIGEgaGVhZGxlc3MKKyAgICAgKiBlbnZpcm9ubWVudCwgdGhlbiB0aGUgcmV0dXJuZWQgQnVmZmVyZWRJbWFnZSB3aWxsIGJlIGNvbXBhdGlibGUgd2l0aAorICAgICAqIHRoZSBzb3VyY2UgaW1hZ2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgbmV3IGltYWdlCisgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBuZXcgaW1hZ2UKKyAgICAgKiBAcmV0dXJuIGEgbmV3IHRyYW5zbHVjZW50IGNvbXBhdGlibGUgPGNvZGU+QnVmZmVyZWRJbWFnZTwvY29kZT4gb2YgdGhlCisgICAgICogICBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyZWRJbWFnZSBjcmVhdGVDb21wYXRpYmxlVHJhbnNsdWNlbnRJbWFnZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGlzSGVhZGxlc3MoKSA/CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGgsIGhlaWdodCwgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSA6CisgICAgICAgICAgICAgICAgZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29tcGF0aWJsZUltYWdlKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIZWFkbGVzcygpIHsKKyAgICAgICAgcmV0dXJuIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIGdyYXBoaWNzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcmltYXJ5IHNjcmVlbgorICAgIHByaXZhdGUgc3RhdGljIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBHcmFwaGljc0Vudmlyb25tZW50LmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpLgorICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9JbWFnZUNhY2hlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvSW1hZ2VDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDM0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvSW1hZ2VDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYubmltYnVzOworCitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NDb25maWd1cmF0aW9uOworaW1wb3J0IGphdmEuYXd0LkltYWdlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworCisvKioKKyAqIEltYWdlQ2FjaGUgLSBBIGZpeGVkIHBpeGVsIGNvdW50IHNpemVkIGNhY2hlIG9mIEltYWdlcyBrZXllZCBieSBhcmJpdHJhcnkgc2V0IG9mIGFyZ3VtZW50cy4gQWxsIGltYWdlcyBhcmUgaGVsZCB3aXRoCisgKiBTb2Z0UmVmZXJlbmNlcyBzbyB0aGV5IHdpbGwgYmUgZHJvcHBlZCBieSB0aGUgR0MgaWYgaGVhcCBtZW1vcnkgZ2V0cyB0aWdodC4gV2hlbiBvdXIgc2l6ZSBoaXRzIG1heCBwaXhlbCBjb3VudCBsZWFzdAorICogcmVjZW50bHkgcmVxdWVzdGVkIGltYWdlcyBhcmUgcmVtb3ZlZCBmaXJzdC4KKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChBdWcgNywgMjAwNykKKyAqLworY2xhc3MgSW1hZ2VDYWNoZSB7CisgICAgLy8gT3JkZXJlZCBNYXAga2V5ZWQgYnkgYXJncyBoYXNoLCBvcmRlcmVkIGJ5IG1vc3QgcmVjZW50IGFjY2Vzc2VkIGVudHJ5LgorICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBQaXhlbENvdW50U29mdFJlZmVyZW5jZT4gbWFwID0KKyAgICAgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPEludGVnZXIsIFBpeGVsQ291bnRTb2Z0UmVmZXJlbmNlPigxNiwgMC43NWYsIHRydWUpOworICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIHBpeGVscyB0byBjYWNoZSwgdGhpcyBpcyB1c2VkIGlmIG1heENvdW50CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4UGl4ZWxDb3VudDsKKyAgICAvLyBNYXhpbXVtIGNhY2hlZCBpbWFnZSBzaXplIGluIHB4aWVscworICAgIHByaXZhdGUgZmluYWwgaW50IG1heFNpbmdsZUltYWdlUGl4ZWxTaXplOworICAgIC8vIFRoZSBjdXJyZW50IG51bWJlciBvZiBwaXhlbHMgc3RvcmVkIGluIHRoZSBjYWNoZQorICAgIHByaXZhdGUgaW50IGN1cnJlbnRQaXhlbENvdW50ID0gMDsKKyAgICAvLyBMb2NrIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byBtYXAKKyAgICBwcml2YXRlIFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgLy8gUmVmZXJlbmNlIHF1ZXVlIGZvciB0cmFja2luZyBsb3N0IHNvZnRyZWZlcmVuY2VzIHRvIGltYWdlcyBpbiB0aGUgY2FjaGUKKyAgICBwcml2YXRlIFJlZmVyZW5jZVF1ZXVlPEltYWdlPiByZWZlcmVuY2VRdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZTxJbWFnZT4oKTsKKyAgICAvLyBTaW5nbGV0b24gSW5zdGFuY2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZUNhY2hlIGluc3RhbmNlID0gbmV3IEltYWdlQ2FjaGUoKTsKKworCisgICAgLyoqIEdldCBzdGF0aWMgc2luZ2xldG9uIGluc3RhbmNlICovCisgICAgc3RhdGljIEltYWdlQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW1hZ2VDYWNoZSgpIHsKKyAgICAgICAgdGhpcy5tYXhQaXhlbENvdW50ID0gKDggKiAxMDI0ICogMTAyNCkgLyA0OyAvLyA4TWIgb2YgcGl4ZWxzCisgICAgICAgIHRoaXMubWF4U2luZ2xlSW1hZ2VQaXhlbFNpemUgPSAzMDAgKiAzMDA7CisgICAgfQorCisgICAgcHVibGljIEltYWdlQ2FjaGUoaW50IG1heFBpeGVsQ291bnQsIGludCBtYXhTaW5nbGVJbWFnZVBpeGVsU2l6ZSkgeworICAgICAgICB0aGlzLm1heFBpeGVsQ291bnQgPSBtYXhQaXhlbENvdW50OworICAgICAgICB0aGlzLm1heFNpbmdsZUltYWdlUGl4ZWxTaXplID0gbWF4U2luZ2xlSW1hZ2VQaXhlbFNpemU7CisgICAgfQorCisgICAgLyoqIENsZWFyIHRoZSBjYWNoZSAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgeworICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgaW1hZ2Ugc2l6ZSBpcyB0byBiaWcgdG8gYmUgc3RvcmVkIGluIHRoZSBjYWNoZQorICAgICAqCisgICAgICogQHBhcmFtIHcgVGhlIGltYWdlIHdpZHRoCisgICAgICogQHBhcmFtIGggVGhlIGltYWdlIGhlaWdodAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgaW1hZ2Ugc2l6ZSBpcyBsZXNzIHRoYW4gbWF4CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbWFnZUNhY2hhYmxlKGludCB3LCBpbnQgaCkgeworICAgICAgICByZXR1cm4gKHcgKiBoKSA8IG1heFNpbmdsZUltYWdlUGl4ZWxTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2FjaGVkIGltYWdlIGZvciBnaXZlbiBrZXlzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBncmFwaGljcyBjb25maWd1cmF0aW9uLCBuZWVkZWQgaWYgY2FjaGVkIGltYWdlIGlzIGEgVm9sYXRpbGUgSW1hZ2UuIFVzZWQgYXMgcGFydCBvZiBjYWNoZSBrZXkKKyAgICAgKiBAcGFyYW0gdyAgICAgIFRoZSBpbWFnZSB3aWR0aCwgdXNlZCBhcyBwYXJ0IG9mIGNhY2hlIGtleQorICAgICAqIEBwYXJhbSBoICAgICAgVGhlIGltYWdlIGhlaWdodCwgdXNlZCBhcyBwYXJ0IG9mIGNhY2hlIGtleQorICAgICAqIEBwYXJhbSBhcmdzICAgT3RoZXIgYXJndW1lbnRzIHRvIHVzZSBhcyBwYXJ0IG9mIHRoZSBjYWNoZSBrZXkKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNhY2hlZCBJbWFnZSwgb3IgbnVsbCB0aGVyZSBpcyBubyBjYWNoZWQgaW1hZ2UgZm9yIGtleQorICAgICAqLworICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShHcmFwaGljc0NvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgdywgaW50IGgsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIGxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQaXhlbENvdW50U29mdFJlZmVyZW5jZSByZWYgPSBtYXAuZ2V0KGhhc2goY29uZmlnLCB3LCBoLCBhcmdzKSk7CisgICAgICAgICAgICAvLyBjaGVjayByZWZlcmVuY2UgaGFzIG5vdCBiZWVuIGxvc3QgYW5kIHRoZSBrZXkgdHJ1bHkgbWF0Y2hlcywgaW4gY2FzZSBvZiBmYWxzZSBwb3NpdGl2ZSBoYXNoIG1hdGNoCisgICAgICAgICAgICBpZiAocmVmICE9IG51bGwgJiYgcmVmLmVxdWFscyhjb25maWcsdywgaCwgYXJncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVmLmdldCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNhY2hlZCBpbWFnZSBmb3IgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbWFnZSAgVGhlIGltYWdlIHRvIHN0b3JlIGluIGNhY2hlCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgZ3JhcGhpY3MgY29uZmlndXJhdGlvbiwgbmVlZGVkIGlmIGNhY2hlZCBpbWFnZSBpcyBhIFZvbGF0aWxlIEltYWdlLiBVc2VkIGFzIHBhcnQgb2YgY2FjaGUga2V5CisgICAgICogQHBhcmFtIHcgICAgICBUaGUgaW1hZ2Ugd2lkdGgsIHVzZWQgYXMgcGFydCBvZiBjYWNoZSBrZXkKKyAgICAgKiBAcGFyYW0gaCAgICAgIFRoZSBpbWFnZSBoZWlnaHQsIHVzZWQgYXMgcGFydCBvZiBjYWNoZSBrZXkKKyAgICAgKiBAcGFyYW0gYXJncyAgIE90aGVyIGFyZ3VtZW50cyB0byB1c2UgYXMgcGFydCBvZiB0aGUgY2FjaGUga2V5CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbWFnZSBjb3VsZCBiZSBjYWNoZWQgb3IgZmFsc2UgaWYgdGhlIGltYWdlIGlzIHRvbyBiaWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRJbWFnZShJbWFnZSBpbWFnZSwgR3JhcGhpY3NDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IHcsIGludCBoLCBPYmplY3QuLi4gYXJncykgeworICAgICAgICBpZiAoIWlzSW1hZ2VDYWNoYWJsZSh3LCBoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpbnQgaGFzaCA9IGhhc2goY29uZmlnLCB3LCBoLCBhcmdzKTsKKyAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQaXhlbENvdW50U29mdFJlZmVyZW5jZSByZWYgPSBtYXAuZ2V0KGhhc2gpOworICAgICAgICAgICAgLy8gY2hlY2sgaWYgY3VycmVudGx5IGluIG1hcAorICAgICAgICAgICAgaWYgKHJlZiAhPSBudWxsICYmIHJlZi5nZXQoKSA9PSBpbWFnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2xlYXIgb3V0IG9sZAorICAgICAgICAgICAgaWYgKHJlZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsQ291bnQgLT0gcmVmLnBpeGVsQ291bnQ7CisgICAgICAgICAgICAgICAgbWFwLnJlbW92ZShoYXNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkZCBuZXcgaW1hZ2UgdG8gcGl4ZWwgY291bnQKKyAgICAgICAgICAgIGludCBuZXdQaXhlbENvdW50ID0gaW1hZ2UuZ2V0V2lkdGgobnVsbCkgKiBpbWFnZS5nZXRIZWlnaHQobnVsbCk7CisgICAgICAgICAgICBjdXJyZW50UGl4ZWxDb3VudCArPSBuZXdQaXhlbENvdW50OworICAgICAgICAgICAgLy8gY2xlYW4gb3V0IGxvc3QgcmVmZXJlbmNlcyBpZiBub3QgZW5vdWdoIHNwYWNlCisgICAgICAgICAgICBpZiAoY3VycmVudFBpeGVsQ291bnQgPiBtYXhQaXhlbENvdW50KSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKChyZWYgPSAoUGl4ZWxDb3VudFNvZnRSZWZlcmVuY2UpcmVmZXJlbmNlUXVldWUucG9sbCgpKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgLy9yZWZlcmVuY2UgbG9zdAorICAgICAgICAgICAgICAgICAgICBtYXAucmVtb3ZlKHJlZi5oYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsQ291bnQgLT0gcmVmLnBpeGVsQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCBpdGVtcyB0aWxsIHRoZXJlIGlzIGVub3VnaCBmcmVlIHNwYWNlCisgICAgICAgICAgICBpZiAoY3VycmVudFBpeGVsQ291bnQgPiBtYXhQaXhlbENvdW50KSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIFBpeGVsQ291bnRTb2Z0UmVmZXJlbmNlPj4gbWFwSXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50UGl4ZWxDb3VudCA+IG1heFBpeGVsQ291bnQpICYmIG1hcEl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBQaXhlbENvdW50U29mdFJlZmVyZW5jZT4gZW50cnkgPSBtYXBJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbWFwSXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2UgaW1nID0gZW50cnkuZ2V0VmFsdWUoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGltZyAhPSBudWxsKSBpbWcuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsQ291bnQgLT0gZW50cnkuZ2V0VmFsdWUoKS5waXhlbENvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZpbmFseSBwdXQgbmV3IGluIG1hcAorICAgICAgICAgICAgbWFwLnB1dChoYXNoLCBuZXcgUGl4ZWxDb3VudFNvZnRSZWZlcmVuY2UoaW1hZ2UsIHJlZmVyZW5jZVF1ZXVlLCBuZXdQaXhlbENvdW50LGhhc2gsIGNvbmZpZywgdywgaCwgYXJncykpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIENyZWF0ZSBhIHVuaXF1ZSBoYXNoIGZyb20gYWxsIHRoZSBpbnB1dCAqLworICAgIHByaXZhdGUgaW50IGhhc2goR3JhcGhpY3NDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IHcsIGludCBoLCBPYmplY3QgLi4uIGFyZ3MpIHsKKyAgICAgICAgaW50IGhhc2g7CisgICAgICAgIGhhc2ggPSAoY29uZmlnICE9IG51bGwgPyBjb25maWcuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgdzsKKyAgICAgICAgaGFzaCA9IDMxICogaGFzaCArIGg7CisgICAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKyBBcnJheXMuZGVlcEhhc2hDb2RlKGFyZ3MpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKworICAgIC8qKiBFeHRlbmRlZCBTb2Z0UmVmZXJlbmNlIHRoYXQgc3RvcmVzIHRoZSBwaXhlbCBjb3VudCBldmVuIGFmdGVyIHRoZSBpbWFnZSBpcyBsb3N0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGl4ZWxDb3VudFNvZnRSZWZlcmVuY2UgZXh0ZW5kcyBTb2Z0UmVmZXJlbmNlPEltYWdlPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IHBpeGVsQ291bnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGhhc2g7CisgICAgICAgIC8vIGtleSBwYXJ0cworICAgICAgICBwcml2YXRlIGZpbmFsIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IHc7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJnczsKKworICAgICAgICBwdWJsaWMgUGl4ZWxDb3VudFNvZnRSZWZlcmVuY2UoSW1hZ2UgcmVmZXJlbnQsIFJlZmVyZW5jZVF1ZXVlPD8gc3VwZXIgSW1hZ2U+IHEsIGludCBwaXhlbENvdW50LCBpbnQgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBjb25maWcsIGludCB3LCBpbnQgaCwgT2JqZWN0W10gYXJncykgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbnQsIHEpOworICAgICAgICAgICAgdGhpcy5waXhlbENvdW50ID0gcGl4ZWxDb3VudDsKKyAgICAgICAgICAgIHRoaXMuaGFzaCA9IGhhc2g7CisgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgICAgICB0aGlzLmggPSBoOworICAgICAgICAgICAgdGhpcy5hcmdzID0gYXJnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyAoR3JhcGhpY3NDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IHcsIGludCBoLCBPYmplY3RbXSBhcmdzKXsKKyAgICAgICAgICAgIHJldHVybiBjb25maWcgPT0gdGhpcy5jb25maWcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID09IHRoaXMudyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPT0gdGhpcy5oICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhhcmdzLCB0aGlzLmFyZ3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0ltYWdlU2NhbGluZ0hlbHBlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0ltYWdlU2NhbGluZ0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjZmNTFhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0ltYWdlU2NhbGluZ0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYubmltYnVzOworCitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7CitpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CitpbXBvcnQgamF2YS5hd3QuSW5zZXRzOworCisvKioKKyAqIEltYWdlU2NhbGluZ0hlbHBlcgorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEF1ZyA4LCAyMDA3KQorICovCitjbGFzcyBJbWFnZVNjYWxpbmdIZWxwZXIgeworCisgICAgLyoqIEVudW1lcmF0aW9uIGZvciB0aGUgdHlwZXMgb2YgcGFpbnRpbmcgdGhpcyBjbGFzcyBjYW4gaGFuZGxlLiAqLworICAgIGVudW0gUGFpbnRUeXBlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhaW50aW5nIHR5cGUgaW5kaWNhdGluZyB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGNlbnRlcmVkIGluIHRoZSBzcGFjZSBwcm92aWRlZC4gIFdoZW4gdXNlZCB0aGUgPGNvZGU+bWFzazwvY29kZT4KKyAgICAgICAgICogaXMgaWdub3JlZC4KKyAgICAgICAgICovCisgICAgICAgIENFTlRFUiwKKworICAgICAgICAvKioKKyAgICAgICAgICogUGFpbnRpbmcgdHlwZSBpbmRpY2F0aW5nIHRoZSBpbWFnZSBzaG91bGQgYmUgdGlsZWQgYWNyb3NzIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC4gIFdoZW4gdXNlZCB0aGUKKyAgICAgICAgICogPGNvZGU+bWFzazwvY29kZT4gaXMgaWdub3JlZC4KKyAgICAgICAgICovCisgICAgICAgIFRJTEUsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhaW50aW5nIHR5cGUgaW5kaWNhdGluZyB0aGUgaW1hZ2Ugc2hvdWxkIGJlIHNwbGl0IGludG8gbmluZSByZWdpb25zIHdpdGggdGhlIHRvcCwgbGVmdCwgYm90dG9tIGFuZCByaWdodAorICAgICAgICAgKiBhcmVhcyBzdHJldGNoZWQuCisgICAgICAgICAqLworICAgICAgICBQQUlOVDlfU1RSRVRDSCwKKworICAgICAgICAvKioKKyAgICAgICAgICogUGFpbnRpbmcgdHlwZSBpbmRpY2F0aW5nIHRoZSBpbWFnZSBzaG91bGQgYmUgc3BsaXQgaW50byBuaW5lIHJlZ2lvbnMgd2l0aCB0aGUgdG9wLCBsZWZ0LCBib3R0b20gYW5kIHJpZ2h0CisgICAgICAgICAqIGFyZWFzIHRpbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgUEFJTlQ5X1RJTEUKKyAgICB9CisKKyAgICA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnNldHMgRU1QVFlfSU5TRVRTID0gbmV3IEluc2V0cygwLCAwLCAwLCAwKTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFJTlRfVE9QX0xFRlQgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFJTlRfVE9QID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFBBSU5UX1RPUF9SSUdIVCA9IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBQQUlOVF9MRUZUID0gODsKKyAgICBzdGF0aWMgZmluYWwgaW50IFBBSU5UX0NFTlRFUiA9IDE2OworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFJTlRfUklHSFQgPSAzMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFBBSU5UX0JPVFRPTV9SSUdIVCA9IDY0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFJTlRfQk9UVE9NID0gMTI4OworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFJTlRfQk9UVE9NX0xFRlQgPSAyNTY7CisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoYXQgYWxsIHJlZ2lvbnMgc2hvdWxkIGJlIHBhaW50ZWQuICBJZiB0aGlzIGlzIHNldCBhbnkgb3RoZXIgcmVnaW9ucyBzcGVjaWZpZWQgd2lsbCBub3QgYmUgcGFpbnRlZC4KKyAgICAgKiBGb3IgZXhhbXBsZSBQQUlOVF9BTEwgfCBQQUlOVF9DRU5URVIgd2lsbCBwYWludCBhbGwgYnV0IHRoZSBjZW50ZXIuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQQUlOVF9BTEwgPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdXNpbmcgdGhlIGFsZ29yaWdodG0gc3BlY2lmaWVkIGJ5IDxjb2RlPnBhaW50VHlwZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZyAgICAgICAgIEdyYXBoaWNzIHRvIHJlbmRlciB0bworICAgICAqIEBwYXJhbSB4ICAgICAgICAgWC1jb29yZGluYXRlCisgICAgICogQHBhcmFtIHkgICAgICAgICBZLWNvb3JkaW5hdGUKKyAgICAgKiBAcGFyYW0gdyAgICAgICAgIFdpZHRoIHRvIHJlbmRlciB0bworICAgICAqIEBwYXJhbSBoICAgICAgICAgSGVpZ2h0IHRvIHJlbmRlciB0bworICAgICAqIEBwYXJhbSBpbWFnZSAgICAgSW1hZ2UgdG8gcmVuZGVyIGZyb20sIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZworICAgICAqIEBwYXJhbSBzSW5zZXRzICAgSW5zZXRzIHNwZWNpZnlpbmcgdGhlIHBvcnRpb24gb2YgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSBzdHJldGNoZWQgb3IgdGlsZWQsIGlmIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgICBlbXB0eSA8Y29kZT5JbnNldHM8L2NvZGU+IHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gZEluc2V0cyAgIERlc3RpbmF0aW9uIGluc2V0cyBzcGVjaWZ5aW5nIHRoZSBwb3J0aW9uIG9mIHRoZSBpbWFnZSB3aWxsIGJlIHN0cmV0Y2hlZCBvciB0aWxlZCwgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGVtcHR5IDxjb2RlPkluc2V0czwvY29kZT4gd2lsbCBiZSB1c2VkLgorICAgICAqIEBwYXJhbSBwYWludFR5cGUgU3BlY2lmaWVzIHdoYXQgdHlwZSBvZiBhbGdvcml0aG0gdG8gdXNlIGluIHBhaW50aW5nCisgICAgICogQHBhcmFtIG1hc2sgICAgICBTcGVjaWZpZXMgcG9ydGlvbiBvZiBpbWFnZSB0byByZW5kZXIsIGlmIDxjb2RlPlBBSU5UX0FMTDwvY29kZT4gaXMgc3BlY2lmaWVkLCBhbnkgb3RoZXIgcmVnaW9ucworICAgICAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHdpbGwgbm90IGJlIHBhaW50ZWQsIGZvciBleGFtcGxlIFBBSU5UX0FMTCB8IFBBSU5UX0NFTlRFUiBwYWludHMgZXZlcnl0aGluZyBidXQgdGhlCisgICAgICogICAgICAgICAgICAgICAgICBjZW50ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgIEltYWdlIGltYWdlLCBJbnNldHMgc0luc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICBJbnNldHMgZEluc2V0cywgUGFpbnRUeXBlIHBhaW50VHlwZSwgaW50IG1hc2spIHsKKyAgICAgICAgaWYgKGltYWdlID09IG51bGwgfHwgaW1hZ2UuZ2V0V2lkdGgobnVsbCkgPD0gMCB8fCBpbWFnZS5nZXRIZWlnaHQobnVsbCkgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzSW5zZXRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHNJbnNldHMgPSBFTVBUWV9JTlNFVFM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRJbnNldHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZEluc2V0cyA9IEVNUFRZX0lOU0VUUzsKKyAgICAgICAgfQorICAgICAgICBpbnQgaXcgPSBpbWFnZS5nZXRXaWR0aChudWxsKTsKKyAgICAgICAgaW50IGloID0gaW1hZ2UuZ2V0SGVpZ2h0KG51bGwpOworCisgICAgICAgIGlmIChwYWludFR5cGUgPT0gUGFpbnRUeXBlLkNFTlRFUikgeworICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBpbWFnZQorICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1hZ2UsIHggKyAodyAtIGl3KSAvIDIsCisgICAgICAgICAgICAgICAgICAgIHkgKyAoaCAtIGloKSAvIDIsIG51bGwpOworICAgICAgICB9IGVsc2UgaWYgKHBhaW50VHlwZSA9PSBQYWludFR5cGUuVElMRSkgeworICAgICAgICAgICAgLy8gVGlsZSB0aGUgaW1hZ2UKKyAgICAgICAgICAgIGludCBsYXN0SVkgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgeUNvdW50ZXIgPSB5LCBtYXhZID0geSArIGg7IHlDb3VudGVyIDwgbWF4WTsKKyAgICAgICAgICAgICAgICAgeUNvdW50ZXIgKz0gKGloIC0gbGFzdElZKSwgbGFzdElZID0gMCkgeworICAgICAgICAgICAgICAgIGludCBsYXN0SVggPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IHhDb3VudGVyID0geCwgbWF4WCA9IHggKyB3OyB4Q291bnRlciA8IG1heFg7CisgICAgICAgICAgICAgICAgICAgICB4Q291bnRlciArPSAoaXcgLSBsYXN0SVgpLCBsYXN0SVggPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkeDIgPSBNYXRoLm1pbihtYXhYLCB4Q291bnRlciArIGl3IC0gbGFzdElYKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGR5MiA9IE1hdGgubWluKG1heFksIHlDb3VudGVyICsgaWggLSBsYXN0SVkpOworICAgICAgICAgICAgICAgICAgICBnLmRyYXdJbWFnZShpbWFnZSwgeENvdW50ZXIsIHlDb3VudGVyLCBkeDIsIGR5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SVgsIGxhc3RJWSwgbGFzdElYICsgZHgyIC0geENvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdElZICsgZHkyIC0geUNvdW50ZXIsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBzdCA9IHNJbnNldHMudG9wOworICAgICAgICAgICAgaW50IHNsID0gc0luc2V0cy5sZWZ0OworICAgICAgICAgICAgaW50IHNiID0gc0luc2V0cy5ib3R0b207CisgICAgICAgICAgICBpbnQgc3IgPSBzSW5zZXRzLnJpZ2h0OworCisgICAgICAgICAgICBpbnQgZHQgPSBkSW5zZXRzLnRvcDsKKyAgICAgICAgICAgIGludCBkbCA9IGRJbnNldHMubGVmdDsKKyAgICAgICAgICAgIGludCBkYiA9IGRJbnNldHMuYm90dG9tOworICAgICAgICAgICAgaW50IGRyID0gZEluc2V0cy5yaWdodDsKKworICAgICAgICAgICAgLy8gQ29uc3RyYWluIHRoZSBpbnNldHMgdG8gdGhlIHNpemUgb2YgdGhlIGltYWdlCisgICAgICAgICAgICBpZiAoc3QgKyBzYiA+IGloKSB7CisgICAgICAgICAgICAgICAgZGIgPSBkdCA9IHNiID0gc3QgPSBNYXRoLm1heCgwLCBpaCAvIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNsICsgc3IgPiBpdykgeworICAgICAgICAgICAgICAgIGRsID0gZHIgPSBzbCA9IHNyID0gTWF0aC5tYXgoMCwgaXcgLyAyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29uc3RyYWluIHRoZSBpbnNldHMgdG8gdGhlIHNpemUgb2YgdGhlIHJlZ2lvbiB3ZSdyZSBwYWludGluZworICAgICAgICAgICAgLy8gaW4uCisgICAgICAgICAgICBpZiAoZHQgKyBkYiA+IGgpIHsKKyAgICAgICAgICAgICAgICBkdCA9IGRiID0gTWF0aC5tYXgoMCwgaCAvIDIgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkbCArIGRyID4gdykgeworICAgICAgICAgICAgICAgIGRsID0gZHIgPSBNYXRoLm1heCgwLCB3IC8gMiAtIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIHN0cmV0Y2ggPSAocGFpbnRUeXBlID09IFBhaW50VHlwZS5QQUlOVDlfU1RSRVRDSCk7CisgICAgICAgICAgICBpZiAoKG1hc2sgJiBQQUlOVF9BTEwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gKFBBSU5UX0FMTCAtIDEpICYgfm1hc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgobWFzayAmIFBBSU5UX0xFRlQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkcmF3Q2h1bmsoaW1hZ2UsIGcsIHN0cmV0Y2gsIHgsIHkgKyBkdCwgeCArIGRsLCB5ICsgaCAtIGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3QsIHNsLCBpaCAtIHNiLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1hc2sgJiBQQUlOVF9UT1BfTEVGVCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGRyYXdJbWFnZShpbWFnZSwgZywgeCwgeSwgeCArIGRsLCB5ICsgZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBzbCwgc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtYXNrICYgUEFJTlRfVE9QKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZHJhd0NodW5rKGltYWdlLCBnLCBzdHJldGNoLCB4ICsgZGwsIHksIHggKyB3IC0gZHIsIHkgKyBkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsLCAwLCBpdyAtIHNyLCBzdCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1hc2sgJiBQQUlOVF9UT1BfUklHSFQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkcmF3SW1hZ2UoaW1hZ2UsIGcsIHggKyB3IC0gZHIsIHksIHggKyB3LCB5ICsgZHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpdyAtIHNyLCAwLCBpdywgc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtYXNrICYgUEFJTlRfUklHSFQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkcmF3Q2h1bmsoaW1hZ2UsIGcsIHN0cmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICB4ICsgdyAtIGRyLCB5ICsgZHQsIHggKyB3LCB5ICsgaCAtIGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgaXcgLSBzciwgc3QsIGl3LCBpaCAtIHNiLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1hc2sgJiBQQUlOVF9CT1RUT01fUklHSFQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkcmF3SW1hZ2UoaW1hZ2UsIGcsIHggKyB3IC0gZHIsIHkgKyBoIC0gZGIsIHggKyB3LCB5ICsgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl3IC0gc3IsIGloIC0gc2IsIGl3LCBpaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1hc2sgJiBQQUlOVF9CT1RUT00pICE9IDApIHsKKyAgICAgICAgICAgICAgICBkcmF3Q2h1bmsoaW1hZ2UsIGcsIHN0cmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICB4ICsgZGwsIHkgKyBoIC0gZGIsIHggKyB3IC0gZHIsIHkgKyBoLAorICAgICAgICAgICAgICAgICAgICAgICAgc2wsIGloIC0gc2IsIGl3IC0gc3IsIGloLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobWFzayAmIFBBSU5UX0JPVFRPTV9MRUZUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZHJhd0ltYWdlKGltYWdlLCBnLCB4LCB5ICsgaCAtIGRiLCB4ICsgZGwsIHkgKyBoLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgaWggLSBzYiwgc2wsIGloKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobWFzayAmIFBBSU5UX0NFTlRFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIGRyYXdJbWFnZShpbWFnZSwgZywgeCArIGRsLCB5ICsgZHQsIHggKyB3IC0gZHIsIHkgKyBoIC0gZGIsCisgICAgICAgICAgICAgICAgICAgICAgICBzbCwgc3QsIGl3IC0gc3IsIGloIC0gc2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhd3MgYSBwb3J0aW9uIG9mIGFuIGltYWdlLCBzdHJldGNoZWQgb3IgdGlsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1hZ2UgSW1hZ2UgdG8gcmVuZGVyLgorICAgICAqIEBwYXJhbSBnIEdyYXBoaWNzIHRvIHJlbmRlciB0bworICAgICAqIEBwYXJhbSBzdHJldGNoIFdoZXRoZXIgdGhlIGltYWdlIHNob3VsZCBiZSBzdHJldGNoZWQgb3IgdGltZWQgaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgcHJvdmlkZWQgc3BhY2UuCisgICAgICogQHBhcmFtIGR4MSBYIG9yaWdpbiB0byBkcmF3IHRvCisgICAgICogQHBhcmFtIGR5MSBZIG9yaWdpbiB0byBkcmF3IHRvCisgICAgICogQHBhcmFtIGR4MiBFbmQgeCBsb2NhdGlvbiB0byBkcmF3IHRvCisgICAgICogQHBhcmFtIGR5MiBFbmQgeSBsb2NhdGlvbiB0byBkcmF3IHRvCisgICAgICogQHBhcmFtIHN4MSBYIG9yaWdpbiB0byBkcmF3IGZyb20KKyAgICAgKiBAcGFyYW0gc3kxIFkgb3JpZ2luIHRvIGRyYXcgZnJvbQorICAgICAqIEBwYXJhbSBzeDIgTWF4IHggbG9jYXRpb24gdG8gZHJhdyBmcm9tCisgICAgICogQHBhcmFtIHN5MiBNYXggeSBsb2NhdGlvbiB0byBkcmF3IGZyb20KKyAgICAgKiBAcGFyYW0geERpcmVjdGlvbiBVc2VkIGlmIHRoZSBpbWFnZSBpcyBub3Qgc3RyZXRjaGVkLiBJZiB0cnVlIGl0CisgICAgICogICAgICAgIGluZGljYXRlcyB0aGUgaW1hZ2Ugc2hvdWxkIGJlIHRpbGVkIGFsb25nIHRoZSB4IGF4aXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkcmF3Q2h1bmsoSW1hZ2UgaW1hZ2UsIEdyYXBoaWNzIGcsIGJvb2xlYW4gc3RyZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeDEsIGludCBkeTEsIGludCBkeDIsIGludCBkeTIsIGludCBzeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kxLCBpbnQgc3gyLCBpbnQgc3kyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB4RGlyZWN0aW9uKSB7CisgICAgICAgIGlmIChkeDIgLSBkeDEgPD0gMCB8fCBkeTIgLSBkeTEgPD0gMCB8fCBzeDIgLSBzeDEgPD0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3kyIC0gc3kxIDw9IDApIHsKKyAgICAgICAgICAgIC8vIEJvZ3VzIGxvY2F0aW9uLCBub3RoaW5nIHRvIHBhaW50CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmV0Y2gpIHsKKyAgICAgICAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCBkeDEsIGR5MSwgZHgyLCBkeTIsIHN4MSwgc3kxLCBzeDIsIHN5MiwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgeFNpemUgPSBzeDIgLSBzeDE7CisgICAgICAgICAgICBpbnQgeVNpemUgPSBzeTIgLSBzeTE7CisgICAgICAgICAgICBpbnQgZGVsdGFYOworICAgICAgICAgICAgaW50IGRlbHRhWTsKKworICAgICAgICAgICAgaWYgKHhEaXJlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBkZWx0YVggPSB4U2l6ZTsKKyAgICAgICAgICAgICAgICBkZWx0YVkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZGVsdGFYID0gMDsKKyAgICAgICAgICAgICAgICBkZWx0YVkgPSB5U2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChkeDEgPCBkeDIgJiYgZHkxIDwgZHkyKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld0RYMiA9IE1hdGgubWluKGR4MiwgZHgxICsgeFNpemUpOworICAgICAgICAgICAgICAgIGludCBuZXdEWTIgPSBNYXRoLm1pbihkeTIsIGR5MSArIHlTaXplKTsKKworICAgICAgICAgICAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCBkeDEsIGR5MSwgbmV3RFgyLCBuZXdEWTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3gxLCBzeTEsIHN4MSArIG5ld0RYMiAtIGR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeTEgKyBuZXdEWTIgLSBkeTEsIG51bGwpOworICAgICAgICAgICAgICAgIGR4MSArPSBkZWx0YVg7CisgICAgICAgICAgICAgICAgZHkxICs9IGRlbHRhWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZHJhd0ltYWdlKEltYWdlIGltYWdlLCBHcmFwaGljcyBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeTEsIGludCBzeDIsIGludCBzeTIpIHsKKyAgICAgICAgLy8gUEVORElORzogaXMgdGhpcyBuZWNlc3NhcnksIHdpbGwgRzJEIGRvIGl0IGZvciBtZT8KKyAgICAgICAgaWYgKGR4MiAtIGR4MSA8PSAwIHx8IGR5MiAtIGR5MSA8PSAwIHx8IHN4MiAtIHN4MSA8PSAwIHx8CisgICAgICAgICAgICAgICAgc3kyIC0gc3kxIDw9IDApIHsKKyAgICAgICAgICAgIC8vIEJvZ3VzIGxvY2F0aW9uLCBub3RoaW5nIHRvIHBhaW50CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZy5kcmF3SW1hZ2UoaW1hZ2UsIGR4MSwgZHkxLCBkeDIsIGR5Miwgc3gxLCBzeTEsIHN4Miwgc3kyLCBudWxsKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0lubmVyR2xvd0VmZmVjdC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL0lubmVyR2xvd0VmZmVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDdjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvSW5uZXJHbG93RWZmZWN0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLm5pbWJ1czsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworCisvKioKKyAqIElubmVyR2xvd0VmZmVjdAorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biAyMSwgMjAwNykKKyAqLworY2xhc3MgSW5uZXJHbG93RWZmZWN0IGV4dGVuZHMgSW5uZXJTaGFkb3dFZmZlY3QgeworICAgIElubmVyR2xvd0VmZmVjdCgpIHsKKyAgICAgICAgZGlzdGFuY2UgPSAwOworICAgICAgICBjb2xvciA9IG5ldyBDb2xvcigyNTUsIDI1NSwgMjExKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvSW5uZXJTaGFkb3dFZmZlY3QuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9Jbm5lclNoYWRvd0VmZmVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzhjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvSW5uZXJTaGFkb3dFZmZlY3QuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLm5pbWJ1czsKKworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuUmFzdGVyOworaW1wb3J0IGphdmEuYXd0LmltYWdlLldyaXRhYmxlUmFzdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogSW5uZXJTaGFkb3dFZmZlY3QgLSBUaGlzIGVmZmVjdCBjdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIEFSR0IgdHlwZSBidWZmZXJlZAorICogaW1hZ2VzLgorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biAxOCwgMjAwNykKKyAqLworY2xhc3MgSW5uZXJTaGFkb3dFZmZlY3QgZXh0ZW5kcyBTaGFkb3dFZmZlY3QgeworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBFZmZlY3QgTWV0aG9kcworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlIG9mIHRoaXMgZWZmZWN0LCBvbmUgb2YgVU5ERVIsQkxFTkRFRCxPVkVSLiBVTkRFUiBtZWFucyB0aGUgcmVzdWx0IG9mIGFwcGx5IGVmZmVjdCBzaG91bGQgYmUgcGFpbnRlZAorICAgICAqIHVuZGVyIHRoZSBzcmMgaW1hZ2UuIEJMRU5ERUQgbWVhbnMgdGhlIHJlc3VsdCBvZiBhcHBseSBzZmZlY3QgY29udGFpbnMgYSBtb2RpZmllZCBzcmMgaW1hZ2Ugc28ganVzdCBpdCBzaG91bGQgYmUKKyAgICAgKiBwYWludGVkLiBPVkVSIG1lYW5zIHRoZSByZXN1bHQgb2YgYXBwbHkgZWZmZWN0IHNob3VsZCBiZSBwYWludGVkIG92ZXIgdGhlIHNyYyBpbWFnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGVmZmVjdCB0eXBlCisgICAgICovCisgICAgRWZmZWN0LkVmZmVjdFR5cGUgZ2V0RWZmZWN0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEVmZmVjdC5FZmZlY3RUeXBlLk9WRVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIGVmZmVjdCB0byB0aGUgc3JjIGltYWdlIGdlbmVyYXRpbmcgdGhlIHJlc3VsdCAuIFRoZSByZXN1bHQgaW1hZ2UgbWF5IG9yIG1heSBub3QgY29udGFpbiB0aGUgc291cmNlCisgICAgICogaW1hZ2UgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGVmZmVjdCB0eXBlIGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGltYWdlIGZvciBhcHBseWluZyB0aGUgZWZmZWN0IHRvCisgICAgICogQHBhcmFtIGRzdCBUaGUgZHN0aW5hdGlvbiBpbWFnZSB0byBwYWludCBlZmZlY3QgcmVzdWx0IGludG8uIElmIHRoaXMgaXMgbnVsbCB0aGVuIGEgbmV3IGltYWdlIHdpbGwgYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSB3ICAgVGhlIHdpZHRoIG9mIHRoZSBzcmMgaW1hZ2UgdG8gYXBwbHkgZWZmZWN0IHRvLCB0aGlzIGFsbG93IHRoZSBzcmMgYW5kIGRzdCBidWZmZXJzIHRvIGJlIGJpZ2dlciB0aGFuCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSB0aGUgbmVlZCBlZmZlY3QgYXBwbGllZCB0byBpdAorICAgICAqIEBwYXJhbSBoICAgVGhlIGhlaWdodCBvZiB0aGUgc3JjIGltYWdlIHRvIGFwcGx5IGVmZmVjdCB0bywgdGhpcyBhbGxvdyB0aGUgc3JjIGFuZCBkc3QgYnVmZmVycyB0byBiZSBiaWdnZXIgdGhhbgorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgdGhlIG5lZWQgZWZmZWN0IGFwcGxpZWQgdG8gaXQKKyAgICAgKiBAcmV0dXJuIEltYWdlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgZWZmZWN0CisgICAgICovCisgICAgQnVmZmVyZWRJbWFnZSBhcHBseUVmZmVjdChCdWZmZXJlZEltYWdlIHNyYywgQnVmZmVyZWRJbWFnZSBkc3QsIGludCB3LCBpbnQgaCkgeworICAgICAgICBpZiAoc3JjID09IG51bGwgfHwgc3JjLmdldFR5cGUoKSAhPSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRWZmZWN0IG9ubHkgd29ya3Mgd2l0aCAiICsKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZSBpbWFnZXMgb2YgdHlwZSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRzdCAhPSBudWxsICYmIGRzdC5nZXRUeXBlKCkgIT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVmZmVjdCBvbmx5IHdvcmtzIHdpdGggIiArCisgICAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBpbWFnZXMgb2YgdHlwZSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IuIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FsY3VsYXRlIG9mZnNldAorICAgICAgICBkb3VibGUgdHJhbmdsZUFuZ2xlID0gTWF0aC50b1JhZGlhbnMoYW5nbGUgLSA5MCk7CisgICAgICAgIGludCBvZmZzZXRYID0gKGludCkgKE1hdGguc2luKHRyYW5nbGVBbmdsZSkgKiBkaXN0YW5jZSk7CisgICAgICAgIGludCBvZmZzZXRZID0gKGludCkgKE1hdGguY29zKHRyYW5nbGVBbmdsZSkgKiBkaXN0YW5jZSk7CisgICAgICAgIC8vIGNsYWMgZXhwYW5kZWQgc2l6ZQorICAgICAgICBpbnQgdG1wT2ZmWCA9IG9mZnNldFggKyBzaXplOworICAgICAgICBpbnQgdG1wT2ZmWSA9IG9mZnNldFggKyBzaXplOworICAgICAgICBpbnQgdG1wVyA9IHcgKyBvZmZzZXRYICsgc2l6ZSArIHNpemU7CisgICAgICAgIGludCB0bXBIID0gaCArIG9mZnNldFggKyBzaXplOworICAgICAgICAvLyBjcmVhdGUgdG1wIGJ1ZmZlcnMKKyAgICAgICAgaW50W10gbGluZUJ1ZiA9IGdldEFycmF5Q2FjaGUoKS5nZXRUbXBJbnRBcnJheSh3KTsKKyAgICAgICAgYnl0ZVtdIHNyY0FscGhhQnVmID0gZ2V0QXJyYXlDYWNoZSgpLmdldFRtcEJ5dGVBcnJheTEodG1wVyAqIHRtcEgpOworICAgICAgICBBcnJheXMuZmlsbChzcmNBbHBoYUJ1ZiwgKGJ5dGUpIDB4RkYpOworICAgICAgICBieXRlW10gdG1wQnVmMSA9IGdldEFycmF5Q2FjaGUoKS5nZXRUbXBCeXRlQXJyYXkyKHRtcFcgKiB0bXBIKTsKKyAgICAgICAgYnl0ZVtdIHRtcEJ1ZjIgPSBnZXRBcnJheUNhY2hlKCkuZ2V0VG1wQnl0ZUFycmF5Myh0bXBXICogdG1wSCk7CisgICAgICAgIC8vIGV4dHJhY3Qgc3JjIGltYWdlIGFscGhhIGNoYW5uZWwgYW5kIGludmVyc2UgYW5kIG9mZnNldAorICAgICAgICBSYXN0ZXIgc3JjUmFzdGVyID0gc3JjLmdldFJhc3RlcigpOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgaW50IGR5ID0gKHkgKyB0bXBPZmZZKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBkeSAqIHRtcFc7CisgICAgICAgICAgICBzcmNSYXN0ZXIuZ2V0RGF0YUVsZW1lbnRzKDAsIHksIHcsIDEsIGxpbmVCdWYpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgZHggPSB4ICsgdG1wT2ZmWDsKKyAgICAgICAgICAgICAgICBzcmNBbHBoYUJ1ZltvZmZzZXQgKyBkeF0gPSAoYnl0ZSkgKCgyNTUgLSAoKGxpbmVCdWZbeF0gJiAweEZGMDAwMDAwKSA+Pj4gMjQpKSAmIDB4RkYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGJsdXIKKyAgICAgICAgZmxvYXRbXSBrZXJuZWwgPSBFZmZlY3RVdGlscy5jcmVhdGVHYXVzc2lhbktlcm5lbChzaXplICogMik7CisgICAgICAgIEVmZmVjdFV0aWxzLmJsdXIoc3JjQWxwaGFCdWYsIHRtcEJ1ZjIsIHRtcFcsIHRtcEgsIGtlcm5lbCwgc2l6ZSAqIDIpOyAvLyBob3Jpem9udGFsIHBhc3MKKyAgICAgICAgRWZmZWN0VXRpbHMuYmx1cih0bXBCdWYyLCB0bXBCdWYxLCB0bXBILCB0bXBXLCBrZXJuZWwsIHNpemUgKiAyKTsvLyB2ZXJ0aWNhbCBwYXNzCisgICAgICAgIC8vcmVzY2FsZQorICAgICAgICBmbG9hdCBzcHJlYWQgPSBNYXRoLm1pbigxIC8gKDEgLSAoMC4wMWYgKiB0aGlzLnNwcmVhZCkpLCAyNTUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRtcEJ1ZjEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoaW50KSAoKChpbnQpIHRtcEJ1ZjFbaV0gJiAweEZGKSAqIHNwcmVhZCk7CisgICAgICAgICAgICB0bXBCdWYxW2ldID0gKHZhbCA+IDI1NSkgPyAoYnl0ZSkgMHhGRiA6IChieXRlKSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIGNvbG9yIGltYWdlIHdpdGggc2hhZG93IGNvbG9yIGFuZCBncmV5c2NhbGUgaW1hZ2UgYXMgYWxwaGEKKyAgICAgICAgaWYgKGRzdCA9PSBudWxsKSBkc3QgPSBuZXcgQnVmZmVyZWRJbWFnZSh3LCBoLAorICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQik7CisgICAgICAgIFdyaXRhYmxlUmFzdGVyIHNoYWRvd1Jhc3RlciA9IGRzdC5nZXRSYXN0ZXIoKTsKKyAgICAgICAgaW50IHJlZCA9IGNvbG9yLmdldFJlZCgpLCBncmVlbiA9IGNvbG9yLmdldEdyZWVuKCksIGJsdWUgPSBjb2xvci5nZXRCbHVlKCk7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBpbnQgc3JjWSA9IHkgKyB0bXBPZmZZOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNyY1kgKiB0bXBXOworICAgICAgICAgICAgaW50IHNoYWRvd09mZnNldCA9IChzcmNZIC0gb2Zmc2V0WSkgKiB0bXBXOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjWCA9IHggKyB0bXBPZmZYOworICAgICAgICAgICAgICAgIGludCBvcmlnaWFubEFscGhhVmFsID0gMjU1IC0gKChpbnQpIHNyY0FscGhhQnVmW29mZnNldCArIHNyY1hdICYgMHhGRik7CisgICAgICAgICAgICAgICAgaW50IHNoYWRvd1ZhbCA9IChpbnQpIHRtcEJ1ZjFbc2hhZG93T2Zmc2V0ICsgKHNyY1ggLSBvZmZzZXRYKV0gJiAweEZGOworICAgICAgICAgICAgICAgIGludCBhbHBoYVZhbCA9IE1hdGgubWluKG9yaWdpYW5sQWxwaGFWYWwsIHNoYWRvd1ZhbCk7CisgICAgICAgICAgICAgICAgbGluZUJ1Zlt4XSA9ICgoYnl0ZSkgYWxwaGFWYWwgJiAweEZGKSA8PCAyNCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hhZG93UmFzdGVyLnNldERhdGFFbGVtZW50cygwLCB5LCB3LCAxLCBsaW5lQnVmKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHN0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9Mb3dlcmVkQm9yZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvTG93ZXJlZEJvcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmM4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvTG93ZXJlZEJvcmRlci5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYubmltYnVzOworCitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuVUlSZXNvdXJjZTsKK2ltcG9ydCBqYXZhLmF3dC5JbnNldHM7CitpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuVHJhbnNwYXJlbmN5OworaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworCisvKioKKyAqIExvd2VyZWRCb3JkZXIgLSBBIHJlY2Vzc2VkIHJvdW5kZWQgaW5uZXIgc2hhZG93ZWQgYm9yZGVyLiBVc2VkIGFzIHRoZQorICogc3RhbmRhcmQgTmltYnVzIFRpdGxlZEJvcmRlci4gVGhpcyBjbGFzcyBpcyBib3RoIGEgcGFpbnRlciBhbmQgYSBzd2luZworICogYm9yZGVyLgorICoKKyAqIEBhdXRob3IgSmFzcGVyIFBvdHRzCisgKi8KK2NsYXNzIExvd2VyZWRCb3JkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lvblBhaW50ZXIgaW1wbGVtZW50cyBCb3JkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTUdfU0laRSA9IDMwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQURJVVMgPSAxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnNldHMgSU5TRVRTID0gbmV3IEluc2V0cygxMCwxMCwxMCwxMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFpbnRDb250ZXh0IFBBSU5UX0NPTlRFWFQgPSBuZXcgUGFpbnRDb250ZXh0KElOU0VUUywKKyAgICAgICAgICAgIG5ldyBEaW1lbnNpb24oSU1HX1NJWkUsSU1HX1NJWkUpLGZhbHNlLAorICAgICAgICAgICAgUGFpbnRDb250ZXh0LkNhY2hlTW9kZS5OSU5FX1NRVUFSRV9TQ0FMRSwKKyAgICAgICAgICAgIEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gUGFpbnRlciBNZXRob2RzCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RXh0ZW5kZWRDYWNoZUtleXMoSkNvbXBvbmVudCBjKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge2MuZ2V0QmFja2dyb3VuZCgpfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3R1YWxseSBwZXJmb3JtcyB0aGUgcGFpbnRpbmcgb3BlcmF0aW9uLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMKKyAgICAgKiBtZXRob2QuIFRoZSBncmFwaGljcyBvYmplY3QgcGFzc2VkIG1heSByZXByZXNlbnQgdGhlIGFjdHVhbCBzdXJmYWNlIGJlaW5nCisgICAgICogcmVuZGVyZXJkIHRvLCBvciBpdCBtYXkgYmUgYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlci4gSXQgaGFzIGFsc28gYmVlbgorICAgICAqIHByZS10cmFuc2xhdGVkLiBTaW1wbHkgcmVuZGVyIHRoZSBjb21wb25lbnQgYXMgaWYgaXQgd2VyZSBsb2NhdGVkIGF0IDAsIDAKKyAgICAgKiBhbmQgaGFkIGEgd2lkdGggb2YgPGNvZGU+d2lkdGg8L2NvZGU+IGFuZCBhIGhlaWdodCBvZgorICAgICAqIDxjb2RlPmhlaWdodDwvY29kZT4uIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB5b3UgbWF5IHdhbnQgdG8gcmVhZCB0aGUKKyAgICAgKiBjbGlwIGZyb20gdGhlIEdyYXBoaWNzMkQgb2JqZWN0IGFuZCBvbmx5IHJlbmRlciB3aXRoaW4gdGhhdCBzcGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnICAgICAgVGhlIEdyYXBoaWNzMkQgc3VyZmFjZSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBjICAgICAgVGhlIEpDb21wb25lbnQgcmVsYXRlZCB0byB0aGUgZHJhd2luZyBldmVudC4gRm9yIGV4YW1wbGUsCisgICAgICogICAgICAgICAgICAgICBpZiB0aGUgcmVnaW9uIGJlaW5nIHJlbmRlcmVkIGlzIEJ1dHRvbiwgdGhlbiA8Y29kZT5jPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgd2lsbCBiZSBhIEpCdXR0b24uIElmIHRoZSByZWdpb24gYmVpbmcgZHJhd24gaXMKKyAgICAgKiAgICAgICAgICAgICAgIFNjcm9sbEJhclNsaWRlciwgdGhlbiB0aGUgY29tcG9uZW50IHdpbGwgYmUgSlNjcm9sbEJhci4KKyAgICAgKiAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgbWF5IGJlIG51bGwuCisgICAgICogQHBhcmFtIHdpZHRoICBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byBwYWludC4gTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mCisgICAgICogICAgICAgICAgICAgICBwYWludGluZyB0aGUgZm9yZWdyb3VuZCwgdGhpcyB2YWx1ZSBtYXkgZGlmZmVyIGZyb20KKyAgICAgKiAgICAgICAgICAgICAgIGMuZ2V0V2lkdGgoKS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiB0byBwYWludC4gTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mCisgICAgICogICAgICAgICAgICAgICBwYWludGluZyB0aGUgZm9yZWdyb3VuZCwgdGhpcyB2YWx1ZSBtYXkgZGlmZmVyIGZyb20KKyAgICAgKiAgICAgICAgICAgICAgIGMuZ2V0SGVpZ2h0KCkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9QYWludChHcmFwaGljczJEIGcsIEpDb21wb25lbnQgYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgT2JqZWN0W10gZXh0ZW5kZWRDYWNoZUtleXMpIHsKKyAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWcxID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoSU1HX1NJWkUsSU1HX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQik7CisgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1nMiA9IG5ldyBCdWZmZXJlZEltYWdlKElNR19TSVpFLElNR19TSVpFLAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOworICAgICAgICAvLyBkcmF3IHNoYWRvdyBzaGFwZQorICAgICAgICBHcmFwaGljczJEIGcyID0gKEdyYXBoaWNzMkQpaW1nMS5nZXRHcmFwaGljcygpOworICAgICAgICBnMi5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9BTlRJQUxJQVNJTkcsCisgICAgICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKKyAgICAgICAgZzIuc2V0Q29sb3IoYy5nZXRCYWNrZ3JvdW5kKCkpOworICAgICAgICBnMi5maWxsUm91bmRSZWN0KDIsMCwyNiwyNixSQURJVVMsUkFESVVTKTsKKyAgICAgICAgZzIuZGlzcG9zZSgpOworICAgICAgICAvLyBkcmF3IHNoYWRvdworICAgICAgICBJbm5lclNoYWRvd0VmZmVjdCBlZmZlY3QgPSBuZXcgSW5uZXJTaGFkb3dFZmZlY3QoKTsKKyAgICAgICAgZWZmZWN0LnNldERpc3RhbmNlKDEpOworICAgICAgICBlZmZlY3Quc2V0U2l6ZSgzKTsKKyAgICAgICAgZWZmZWN0LnNldENvbG9yKGdldExpZ2h0ZXIoYy5nZXRCYWNrZ3JvdW5kKCksMi4xZikpOworICAgICAgICBlZmZlY3Quc2V0QW5nbGUoOTApOworICAgICAgICBlZmZlY3QuYXBwbHlFZmZlY3QoaW1nMSxpbWcyLElNR19TSVpFLElNR19TSVpFKTsKKyAgICAgICAgLy8gZHJhdyBvdXRsaW5lIHRvIGltZzIKKyAgICAgICAgZzIgPSAoR3JhcGhpY3MyRClpbWcyLmdldEdyYXBoaWNzKCk7CisgICAgICAgIGcyLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX0FOVElBTElBU0lORywKKyAgICAgICAgICAgICAgICBSZW5kZXJpbmdIaW50cy5WQUxVRV9BTlRJQUxJQVNfT04pOworICAgICAgICBnMi5zZXRDbGlwKDAsMjgsSU1HX1NJWkUsMSk7CisgICAgICAgIGcyLnNldENvbG9yKGdldExpZ2h0ZXIoYy5nZXRCYWNrZ3JvdW5kKCksMC45MGYpKTsKKyAgICAgICAgZzIuZHJhd1JvdW5kUmVjdCgyLDEsMjUsMjUsUkFESVVTLFJBRElVUyk7CisgICAgICAgIGcyLmRpc3Bvc2UoKTsKKyAgICAgICAgLy8gZHJhdyBmaW5hbCBpbWFnZQorICAgICAgICBpZiAod2lkdGggIT0gSU1HX1NJWkUgfHwgaGVpZ2h0ICE9IElNR19TSVpFKXsKKyAgICAgICAgICAgIEltYWdlU2NhbGluZ0hlbHBlci5wYWludChnLDAsMCx3aWR0aCxoZWlnaHQsaW1nMiwgSU5TRVRTLCBJTlNFVFMsCisgICAgICAgICAgICAgICAgICAgIEltYWdlU2NhbGluZ0hlbHBlci5QYWludFR5cGUuUEFJTlQ5X1NUUkVUQ0gsCisgICAgICAgICAgICAgICAgICAgIEltYWdlU2NhbGluZ0hlbHBlci5QQUlOVF9BTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1nMiwwLDAsYyk7CisgICAgICAgIH0KKyAgICAgICAgaW1nMSA9IG51bGw7CisgICAgICAgIGltZzIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkdldHMgdGhlIFBhaW50Q29udGV4dCBmb3IgdGhpcyBwYWludGluZyBvcGVyYXRpb24uIFRoaXMgbWV0aG9kIGlzCisgICAgICogY2FsbGVkIG9uIGV2ZXJ5IHBhaW50LCBhbmQgc28gc2hvdWxkIGJlIGZhc3QgYW5kIHByb2R1Y2Ugbm8gZ2FyYmFnZS4gVGhlCisgICAgICogUGFpbnRDb250ZXh0IGNvbnRhaW5zIGluZm9ybWF0aW9uIHN1Y2ggYXMgY2FjaGUgaGludHMuIEl0IGFsc28gY29udGFpbnMKKyAgICAgKiBkYXRhIG5lY2Vzc2FyeSBmb3IgZGVjb2RpbmcgcG9pbnRzIGF0IHJ1bnRpbWUsIHN1Y2ggYXMgdGhlIHN0cmV0Y2hpbmcKKyAgICAgKiBpbnNldHMsIHRoZSBjYW52YXMgc2l6ZSBhdCB3aGljaCB0aGUgZW5jb2RlZCBwb2ludHMgd2VyZSBkZWZpbmVkLCBhbmQKKyAgICAgKiB3aGV0aGVyIHRoZSBzdHJldGNoaW5nIGluc2V0cyBhcmUgaW52ZXJ0ZWQuPC9wPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD4gVGhpcyBtZXRob2QgYWxsb3dzIGZvciBzdWJjbGFzc2VzIHRvIHBhY2thZ2UgdGhlIHBhaW50aW5nIG9mCisgICAgICogZGlmZmVyZW50IHN0YXRlcyB3aXRoIHBvc3NpYmx5IGRpZmZlcmVudCBjYW52YXMgc2l6ZXMsIGV0YywgaW50byBvbmUKKyAgICAgKiBBYnN0cmFjdFJlZ2lvblBhaW50ZXIgaW1wbGVtZW50YXRpb24uPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBhIFBhaW50Q29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWludCBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFBhaW50Q29udGV4dCBnZXRQYWludENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBQQUlOVF9DT05URVhUOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBCb3JkZXIgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5zZXRzIG9mIHRoZSBib3JkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY29tcG9uZW50IGZvciB3aGljaCB0aGlzIGJvcmRlciBpbnNldHMgdmFsdWUgYXBwbGllcworICAgICAqLworICAgIHB1YmxpYyBJbnNldHMgZ2V0Qm9yZGVySW5zZXRzKENvbXBvbmVudCBjKSB7CisgICAgICAgIHJldHVybiBJTlNFVFM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgYm9yZGVyIGlzIG9wYXF1ZS4gIElmIHRoZSBib3JkZXIgaXMgb3BhcXVlLCBpdAorICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIGl0J3Mgb3duIGJhY2tncm91bmQgd2hlbiBwYWludGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JvcmRlck9wYXF1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KKyAgICAgKiBhbmQgc2l6ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjICAgICAgdGhlIGNvbXBvbmVudCBmb3Igd2hpY2ggdGhpcyBib3JkZXIgaXMgYmVpbmcgcGFpbnRlZAorICAgICAqIEBwYXJhbSBnICAgICAgdGhlIHBhaW50IGdyYXBoaWNzCisgICAgICogQHBhcmFtIHggICAgICB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgcGFpbnRlZCBib3JkZXIKKyAgICAgKiBAcGFyYW0geSAgICAgIHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBwYWludGVkIGJvcmRlcgorICAgICAqIEBwYXJhbSB3aWR0aCAgdGhlIHdpZHRoIG9mIHRoZSBwYWludGVkIGJvcmRlcgorICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcGFpbnRlZCBib3JkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludEJvcmRlcihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgeworICAgICAgICBKQ29tcG9uZW50IGNvbXAgPSAoYyBpbnN0YW5jZW9mIEpDb21wb25lbnQpPyhKQ29tcG9uZW50KWM6bnVsbDsKKyAgICAgICAgaWYgKGcgaW5zdGFuY2VvZiBHcmFwaGljczJEKXsKKyAgICAgICAgICAgIEdyYXBoaWNzMkQgZzIgPSAoR3JhcGhpY3MyRClnOworICAgICAgICAgICAgZzIudHJhbnNsYXRlKHgseSk7CisgICAgICAgICAgICBwYWludChnMixjb21wLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGcyLnRyYW5zbGF0ZSgteCwteSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGltZyA9ICBuZXcgQnVmZmVyZWRJbWFnZShJTUdfU0laRSxJTUdfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKKyAgICAgICAgICAgIEdyYXBoaWNzMkQgZzIgPSAoR3JhcGhpY3MyRClpbWcuZ2V0R3JhcGhpY3MoKTsKKyAgICAgICAgICAgIHBhaW50KGcyLGNvbXAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgZzIuZGlzcG9zZSgpOworICAgICAgICAgICAgSW1hZ2VTY2FsaW5nSGVscGVyLnBhaW50KGcseCx5LHdpZHRoLGhlaWdodCxpbWcsSU5TRVRTLCBJTlNFVFMsCisgICAgICAgICAgICAgICAgICAgIEltYWdlU2NhbGluZ0hlbHBlci5QYWludFR5cGUuUEFJTlQ5X1NUUkVUQ0gsCisgICAgICAgICAgICAgICAgICAgIEltYWdlU2NhbGluZ0hlbHBlci5QQUlOVF9BTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2xvciBnZXRMaWdodGVyKENvbG9yIGMsIGZsb2F0IGZhY3Rvcil7CisgICAgICAgIHJldHVybiBuZXcgQ29sb3IoTWF0aC5taW4oKGludCkoYy5nZXRSZWQoKS9mYWN0b3IpLCAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKChpbnQpKGMuZ2V0R3JlZW4oKS9mYWN0b3IpLCAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKChpbnQpKGMuZ2V0Qmx1ZSgpL2ZhY3RvciksIDI1NSkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL05pbWJ1c0ljb24uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9OaW1idXNJY29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxY2EwZQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9OaW1idXNJY29uLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgamF2YXguc3dpbmcucGxhZi5uaW1idXM7CisKK2ltcG9ydCBqYXZheC5zd2luZy5QYWludGVyOworaW1wb3J0IHN1bi5zd2luZy5wbGFmLnN5bnRoLlN5bnRoSWNvbjsKKworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhDb250ZXh0OworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuVUlSZXNvdXJjZTsKKworLyoqCisgKiBBbiBpY29uIHRoYXQgZGVsZWdhdGVzIHRvIGEgcGFpbnRlci4KKyAqIEBhdXRob3IgcmJhaXIKKyAqLworY2xhc3MgTmltYnVzSWNvbiBleHRlbmRzIFN5bnRoSWNvbiB7CisgICAgcHJpdmF0ZSBpbnQgd2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgaGVpZ2h0OworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsKKyAgICBwcml2YXRlIFN0cmluZyBrZXk7CisKKyAgICBOaW1idXNJY29uKFN0cmluZyBwcmVmaXgsIFN0cmluZyBrZXksIGludCB3LCBpbnQgaCkgeworICAgICAgICB0aGlzLndpZHRoID0gdzsKKyAgICAgICAgdGhpcy5oZWlnaHQgPSBoOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGFpbnRJY29uKFN5bnRoQ29udGV4dCBjb250ZXh0LCBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBQYWludGVyIHBhaW50ZXIgPSBudWxsOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludGVyID0gKFBhaW50ZXIpY29udGV4dC5nZXRTdHlsZSgpLmdldChjb250ZXh0LCBrZXkpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWludGVyID09IG51bGwpeworICAgICAgICAgICAgcGFpbnRlciA9IChQYWludGVyKSBVSU1hbmFnZXIuZ2V0KHByZWZpeCArICJbRW5hYmxlZF0uIiArIGtleSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFpbnRlciAhPSBudWxsICYmIGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgSkNvbXBvbmVudCBjID0gY29udGV4dC5nZXRDb21wb25lbnQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcm90YXRlID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGZsaXAgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vdHJhbnNsYXRleCBhbmQgdHJhbnNsYXRleSBhcmUgYWRkaXRpb25hbCB0cmFuc2xhdGlvbnMgdGhhdAorICAgICAgICAgICAgLy9tdXN0IG9jY3VyIG9uIHRoZSBncmFwaGljcyBjb250ZXh0IHdoZW4gcmVuZGVyaW5nIGEgdG9vbGJhcgorICAgICAgICAgICAgLy9pY29uCisgICAgICAgICAgICBpbnQgdHJhbnNsYXRleCA9IDA7CisgICAgICAgICAgICBpbnQgdHJhbnNsYXRleSA9IDA7CisgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIEpUb29sQmFyKSB7CisgICAgICAgICAgICAgICAgSlRvb2xCYXIgdG9vbGJhciA9IChKVG9vbEJhciljOworICAgICAgICAgICAgICAgIHJvdGF0ZSA9IHRvb2xiYXIuZ2V0T3JpZW50YXRpb24oKSA9PSBKVG9vbEJhci5WRVJUSUNBTDsKKyAgICAgICAgICAgICAgICBmbGlwID0gIXRvb2xiYXIuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKS5pc0xlZnRUb1JpZ2h0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBOaW1idXNMb29rQW5kRmVlbC5yZXNvbHZlVG9vbGJhckNvbnN0cmFpbnQodG9vbGJhcik7CisgICAgICAgICAgICAgICAgLy93ZSBvbmx5IGRvIHRoZSArMSBoYWNrIGZvciBVSVJlc291cmNlIGJvcmRlcnMsIGFzc3VtaW5nCisgICAgICAgICAgICAgICAgLy90aGF0IHRoZSBib3JkZXIgaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUgb3VyIGJvcmRlcgorICAgICAgICAgICAgICAgIGlmICh0b29sYmFyLmdldEJvcmRlcigpIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobyA9PSBCb3JkZXJMYXlvdXQuU09VVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZXkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8gPT0gQm9yZGVyTGF5b3V0LkVBU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZXggPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGcgaW5zdGFuY2VvZiBHcmFwaGljczJEKXsKKyAgICAgICAgICAgICAgICBHcmFwaGljczJEIGdmeCA9IChHcmFwaGljczJEKWc7CisgICAgICAgICAgICAgICAgZ2Z4LnRyYW5zbGF0ZSh4LCB5KTsKKyAgICAgICAgICAgICAgICBnZngudHJhbnNsYXRlKHRyYW5zbGF0ZXgsIHRyYW5zbGF0ZXkpOworICAgICAgICAgICAgICAgIGlmIChyb3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2Z4LnJvdGF0ZShNYXRoLnRvUmFkaWFucyg5MCkpOworICAgICAgICAgICAgICAgICAgICBnZngudHJhbnNsYXRlKDAsIC13KTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnRlci5wYWludChnZngsIGNvbnRleHQuZ2V0Q29tcG9uZW50KCksIGgsIHcpOworICAgICAgICAgICAgICAgICAgICBnZngudHJhbnNsYXRlKDAsIHcpOworICAgICAgICAgICAgICAgICAgICBnZngucm90YXRlKE1hdGgudG9SYWRpYW5zKC05MCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxpcCl7CisgICAgICAgICAgICAgICAgICAgIGdmeC5zY2FsZSgtMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIGdmeC50cmFuc2xhdGUoLXcsMCk7CisgICAgICAgICAgICAgICAgICAgIHBhaW50ZXIucGFpbnQoZ2Z4LCBjb250ZXh0LmdldENvbXBvbmVudCgpLCB3LCBoKTsKKyAgICAgICAgICAgICAgICAgICAgZ2Z4LnRyYW5zbGF0ZSh3LDApOworICAgICAgICAgICAgICAgICAgICBnZnguc2NhbGUoLTEsIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhaW50ZXIucGFpbnQoZ2Z4LCBjb250ZXh0LmdldENvbXBvbmVudCgpLCB3LCBoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2Z4LnRyYW5zbGF0ZSgtdHJhbnNsYXRleCwgLXRyYW5zbGF0ZXkpOworICAgICAgICAgICAgICAgIGdmeC50cmFuc2xhdGUoLXgsIC15KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGltYWdlIGlmIHdlIGFyZSBwcmludGluZyB0byBhIEphdmEgMS4xIFByaW50R3JhcGhpY3MgYXMKKyAgICAgICAgICAgICAgICAvLyBpdCBpcyBub3QgYSBpbnN0YW5jZSBvZiBHcmFwaGljczJECisgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWcgPSBuZXcgQnVmZmVyZWRJbWFnZSh3LGgsCisgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOworICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZ2Z4ID0gaW1nLmNyZWF0ZUdyYXBoaWNzKCk7CisgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBnZngucm90YXRlKE1hdGgudG9SYWRpYW5zKDkwKSk7CisgICAgICAgICAgICAgICAgICAgIGdmeC50cmFuc2xhdGUoMCwgLXcpOworICAgICAgICAgICAgICAgICAgICBwYWludGVyLnBhaW50KGdmeCwgY29udGV4dC5nZXRDb21wb25lbnQoKSwgaCwgdyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGlwKXsKKyAgICAgICAgICAgICAgICAgICAgZ2Z4LnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZ2Z4LnRyYW5zbGF0ZSgtdywwKTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnRlci5wYWludChnZngsIGNvbnRleHQuZ2V0Q29tcG9uZW50KCksIHcsIGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhaW50ZXIucGFpbnQoZ2Z4LCBjb250ZXh0LmdldENvbXBvbmVudCgpLCB3LCBoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2Z4LmRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBnLmRyYXdJbWFnZShpbWcseCx5LG51bGwpOworICAgICAgICAgICAgICAgIGltZyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBJY29uIGludGVyZmFjZSdzIHBhaW50SWNvbiBtZXRob2QgYXMgdGhlIHN0YW5kYXJkCisgICAgICogc3ludGggc3R1YiBwYXNzZXMgbnVsbCBmb3IgdGhlIGNvbnRleHQgYW5kIHRoaXMgd2lsbCBjYXVzZSB1cyB0byBub3QKKyAgICAgKiBwYWludCBhbnkgdGhpbmcsIHNvIHdlIG92ZXJyaWRlIGhlcmUgc28gdGhhdCB3ZSBjYW4gcGFpbnQgdGhlIGVuYWJsZWQKKyAgICAgKiBzdGF0ZSBpZiBubyBzeW50aCBjb250ZXh0IGlzIGF2YWlsYWJsZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBhaW50SWNvbihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5KSB7CisgICAgICAgIFBhaW50ZXIgcGFpbnRlciA9IChQYWludGVyKVVJTWFuYWdlci5nZXQocHJlZml4ICsgIltFbmFibGVkXS4iICsga2V5KTsKKyAgICAgICAgaWYgKHBhaW50ZXIgIT0gbnVsbCl7CisgICAgICAgICAgICBKQ29tcG9uZW50IGpjID0gKGMgaW5zdGFuY2VvZiBKQ29tcG9uZW50KSA/IChKQ29tcG9uZW50KWMgOiBudWxsOworICAgICAgICAgICAgR3JhcGhpY3MyRCBnZnggPSAoR3JhcGhpY3MyRClnOworICAgICAgICAgICAgZ2Z4LnRyYW5zbGF0ZSh4LCB5KTsKKyAgICAgICAgICAgIHBhaW50ZXIucGFpbnQoZ2Z4LCBqYyAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgZ2Z4LnRyYW5zbGF0ZSgteCwgLXkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRJY29uV2lkdGgoU3ludGhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHdpZHRoOworICAgICAgICB9CisgICAgICAgIEpDb21wb25lbnQgYyA9IGNvbnRleHQuZ2V0Q29tcG9uZW50KCk7CisgICAgICAgIGlmIChjIGluc3RhbmNlb2YgSlRvb2xCYXIgJiYgKChKVG9vbEJhciljKS5nZXRPcmllbnRhdGlvbigpID09IEpUb29sQmFyLlZFUlRJQ0FMKSB7CisgICAgICAgICAgICAvL3dlIG9ubHkgZG8gdGhlIC0xIGhhY2sgZm9yIFVJUmVzb3VyY2UgYm9yZGVycywgYXNzdW1pbmcKKyAgICAgICAgICAgIC8vdGhhdCB0aGUgYm9yZGVyIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIG91ciBib3JkZXIKKyAgICAgICAgICAgIGlmIChjLmdldEJvcmRlcigpIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjLmdldFdpZHRoKCkgLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRXaWR0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNjYWxlKGNvbnRleHQsIHdpZHRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SWNvbkhlaWdodChTeW50aENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIEpDb21wb25lbnQgYyA9IGNvbnRleHQuZ2V0Q29tcG9uZW50KCk7CisgICAgICAgIGlmIChjIGluc3RhbmNlb2YgSlRvb2xCYXIpeworICAgICAgICAgICAgSlRvb2xCYXIgdG9vbGJhciA9IChKVG9vbEJhciljOworICAgICAgICAgICAgaWYgKHRvb2xiYXIuZ2V0T3JpZW50YXRpb24oKSA9PSBKVG9vbEJhci5IT1JJWk9OVEFMKSB7CisgICAgICAgICAgICAgICAgLy93ZSBvbmx5IGRvIHRoZSAtMSBoYWNrIGZvciBVSVJlc291cmNlIGJvcmRlcnMsIGFzc3VtaW5nCisgICAgICAgICAgICAgICAgLy90aGF0IHRoZSBib3JkZXIgaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUgb3VyIGJvcmRlcgorICAgICAgICAgICAgICAgIGlmICh0b29sYmFyLmdldEJvcmRlcigpIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRIZWlnaHQoKSAtIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGUoY29udGV4dCwgd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNjYWxlKGNvbnRleHQsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FsZSBhIHNpemUgYmFzZWQgb24gdGhlICJKQ29tcG9uZW50LnNpemVWYXJpYW50IiBjbGllbnQgcHJvcGVydHkgb2YgdGhlCisgICAgICogY29tcG9uZW50IHRoYXQgaXMgdXNpbmcgdGhpcyBpY29uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgc3ludGhDb250ZXh0IHRvIGdldCB0aGUgY29tcG9uZW50IGZyb20KKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzY2FsZQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxlZCBzaXplIG9yIG9yaWdpbmFsIGlmICJKQ29tcG9uZW50LnNpemVWYXJpYW50IiBpcyBub3QKKyAgICAgKiAgICAgICAgICBzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzY2FsZShTeW50aENvbnRleHQgY29udGV4dCwgaW50IHNpemUpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCB8fCBjb250ZXh0LmdldENvbXBvbmVudCgpID09IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIGtleSAiSkNvbXBvbmVudC5zaXplVmFyaWFudCIgaXMgdXNlZCB0byBtYXRjaCBBcHBsZSdzIExBRgorICAgICAgICBTdHJpbmcgc2NhbGVLZXkgPSAoU3RyaW5nKSBjb250ZXh0LmdldENvbXBvbmVudCgpLmdldENsaWVudFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJKQ29tcG9uZW50LnNpemVWYXJpYW50Iik7CisgICAgICAgIGlmIChzY2FsZUtleSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoTmltYnVzU3R5bGUuTEFSR0VfS0VZLmVxdWFscyhzY2FsZUtleSkpIHsKKyAgICAgICAgICAgICAgICBzaXplICo9IE5pbWJ1c1N0eWxlLkxBUkdFX1NDQUxFOworICAgICAgICAgICAgfSBlbHNlIGlmIChOaW1idXNTdHlsZS5TTUFMTF9LRVkuZXF1YWxzKHNjYWxlS2V5KSkgeworICAgICAgICAgICAgICAgIHNpemUgKj0gTmltYnVzU3R5bGUuU01BTExfU0NBTEU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKE5pbWJ1c1N0eWxlLk1JTklfS0VZLmVxdWFscyhzY2FsZUtleSkpIHsKKyAgICAgICAgICAgICAgICAvLyBtaW5pIGlzIG5vdCBxdWl0ZSBhcyBzbWFsbCBmb3IgaWNvbnMgYXMgZnVsbCBtaW5pIGlzCisgICAgICAgICAgICAgICAgLy8ganVzdCB0b28gdGlueQorICAgICAgICAgICAgICAgIHNpemUgKj0gTmltYnVzU3R5bGUuTUlOSV9TQ0FMRSArIDAuMDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL05pbWJ1c0xvb2tBbmRGZWVsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvTmltYnVzTG9va0FuZEZlZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUwMzFiCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL05pbWJ1c0xvb2tBbmRGZWVsLmphdmEKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgamF2YXguc3dpbmcucGxhZi5uaW1idXM7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgc3RhdGljIGphdmEuYXd0LkJvcmRlckxheW91dC4qOworaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKK2ltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7CitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5zeW50aC5SZWdpb247CitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5zeW50aC5TeW50aExvb2tBbmRGZWVsOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhTdHlsZTsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoU3R5bGVGYWN0b3J5OworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuVUlSZXNvdXJjZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuQ29udGFpbmVyOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuTGF5b3V0TWFuYWdlcjsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmF4LnN3aW5nLkdyYXlGaWx0ZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KVG9vbEJhcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuVGl0bGVkQm9yZGVyOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuQm9yZGVyVUlSZXNvdXJjZTsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLkNvbG9yVUlSZXNvdXJjZTsKK2ltcG9ydCBzdW4uc3dpbmcuSW1hZ2VJY29uVUlSZXNvdXJjZTsKK2ltcG9ydCBzdW4uc3dpbmcucGxhZi5zeW50aC5TeW50aEljb247CitpbXBvcnQgc3VuLnN3aW5nLnBsYWYuR1RLS2V5YmluZGluZ3M7CitpbXBvcnQgc3VuLnN3aW5nLnBsYWYuV2luZG93c0tleWJpbmRpbmdzOworaW1wb3J0IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb247CisKKy8qKgorICogPHA+VGhlIE5pbWJ1c0xvb2tBbmRGZWVsIGNsYXNzLjwvcD4KKyAqCisgKiBAYXV0aG9yIEphc3BlciBQb3R0cworICogQGF1dGhvciBSaWNoYXJkIEJhaXIKKyAqLworcHVibGljIGNsYXNzIE5pbWJ1c0xvb2tBbmRGZWVsIGV4dGVuZHMgU3ludGhMb29rQW5kRmVlbCB7CisKKyAgICAvKiogU2V0IG9mIHN0YW5kYXJkIHJlZ2lvbiBuYW1lcyBmb3IgVUlEZWZhdWx0cyBLZXlzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09NUE9ORU5UX0tFWVMgPSBuZXcgU3RyaW5nW117IkFycm93QnV0dG9uIiwgIkJ1dHRvbiIsCisgICAgICAgICAgICAgICAgICAgICJDaGVja0JveCIsICJDaGVja0JveE1lbnVJdGVtIiwgIkNvbG9yQ2hvb3NlciIsICJDb21ib0JveCIsCisgICAgICAgICAgICAgICAgICAgICJEZXNrdG9wUGFuZSIsICJEZXNrdG9wSWNvbiIsICJFZGl0b3JQYW5lIiwgIkZpbGVDaG9vc2VyIiwKKyAgICAgICAgICAgICAgICAgICAgIkZvcm1hdHRlZFRleHRGaWVsZCIsICJJbnRlcm5hbEZyYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIkludGVybmFsRnJhbWVUaXRsZVBhbmUiLCAiTGFiZWwiLCAiTGlzdCIsICJNZW51IiwKKyAgICAgICAgICAgICAgICAgICAgIk1lbnVCYXIiLCAiTWVudUl0ZW0iLCAiT3B0aW9uUGFuZSIsICJQYW5lbCIsCisgICAgICAgICAgICAgICAgICAgICJQYXNzd29yZEZpZWxkIiwgIlBvcHVwTWVudSIsICJQb3B1cE1lbnVTZXBhcmF0b3IiLAorICAgICAgICAgICAgICAgICAgICAiUHJvZ3Jlc3NCYXIiLCAiUmFkaW9CdXR0b24iLCAiUmFkaW9CdXR0b25NZW51SXRlbSIsCisgICAgICAgICAgICAgICAgICAgICJSb290UGFuZSIsICJTY3JvbGxCYXIiLCAiU2Nyb2xsQmFyVHJhY2siLCAiU2Nyb2xsQmFyVGh1bWIiLAorICAgICAgICAgICAgICAgICAgICAiU2Nyb2xsUGFuZSIsICJTZXBhcmF0b3IiLCAiU2xpZGVyIiwgIlNsaWRlclRyYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgIlNsaWRlclRodW1iIiwgIlNwaW5uZXIiLCAiU3BsaXRQYW5lIiwgIlRhYmJlZFBhbmUiLAorICAgICAgICAgICAgICAgICAgICAiVGFibGUiLCAiVGFibGVIZWFkZXIiLCAiVGV4dEFyZWEiLCAiVGV4dEZpZWxkIiwgIlRleHRQYW5lIiwKKyAgICAgICAgICAgICAgICAgICAgIlRvZ2dsZUJ1dHRvbiIsICJUb29sQmFyIiwgIlRvb2xUaXAiLCAiVHJlZSIsICJWaWV3cG9ydCJ9OworCisgICAgLyoqCisgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGF1dG8tZ2VuZXJhdGVkIGZpbGUgTmltYnVzRGVmYXVsdHMuIFRoaXMgZmlsZSBjb250YWlucworICAgICAqIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGFuZCB2YWx1ZXMgZm9yIHRoZSBsb29rIGFuZCBmZWVsIGFzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiB2aXN1YWwgZGVzaWduZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBOaW1idXNEZWZhdWx0cyBkZWZhdWx0czsKKworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZSB0byBwb3B1bGF0ZWQgTEFEIHVpZGVmYXVsdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIFVJRGVmYXVsdHMgdWlEZWZhdWx0czsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBOaW1idXNMb29rQW5kRmVlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmltYnVzTG9va0FuZEZlZWwoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGRlZmF1bHRzID0gbmV3IE5pbWJ1c0RlZmF1bHRzKCk7CisgICAgfQorCisgICAgLyoqIENhbGxlZCBieSBVSU1hbmFnZXIgd2hlbiB0aGlzIGxvb2sgYW5kIGZlZWwgaXMgaW5zdGFsbGVkLiAqLworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7CisgICAgICAgIGRlZmF1bHRzLmluaXRpYWxpemUoKTsKKyAgICAgICAgLy8gY3JlYXRlIHN5bnRoIHN0eWxlIGZhY3RvcnkKKyAgICAgICAgc2V0U3R5bGVGYWN0b3J5KG5ldyBTeW50aFN0eWxlRmFjdG9yeSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN5bnRoU3R5bGUgZ2V0U3R5bGUoSkNvbXBvbmVudCBjLCBSZWdpb24gcikgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0cy5nZXRTdHlsZShjLCByKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisKKyAgICAvKiogQ2FsbGVkIGJ5IFVJTWFuYWdlciB3aGVuIHRoaXMgbG9vayBhbmQgZmVlbCBpcyB1bmluc3RhbGxlZC4gKi8KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgdW5pbml0aWFsaXplKCkgeworICAgICAgICBzdXBlci51bmluaXRpYWxpemUoKTsKKyAgICAgICAgZGVmYXVsdHMudW5pbml0aWFsaXplKCk7CisgICAgICAgIC8vIGNsZWFyIGFsbCBjYWNoZWQgaW1hZ2VzIHRvIGZyZWUgbWVtb3J5CisgICAgICAgIEltYWdlQ2FjaGUuZ2V0SW5zdGFuY2UoKS5mbHVzaCgpOworICAgICAgICAvLyByZW1vdmUgdGhlIGxpc3RlbmVycyBhbmQgdGhpbmdzIGluc3RhbGxlZCBieSBOaW1idXNTdHlsZQorICAgICAgICBOaW1idXNTdHlsZS51bmluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIEBPdmVycmlkZSBwdWJsaWMgVUlEZWZhdWx0cyBnZXREZWZhdWx0cygpIHsKKyAgICAgICAgaWYgKHVpRGVmYXVsdHMgPT0gbnVsbCl7CisgICAgICAgICAgICAvLyBEZXRlY3QgcGxhdGZvcm0KKyAgICAgICAgICAgIFN0cmluZyBvc05hbWUgPSBnZXRTeXN0ZW1Qcm9wZXJ0eSgib3MubmFtZSIpOworICAgICAgICAgICAgYm9vbGVhbiBpc1dpbmRvd3MgPSBvc05hbWUgIT0gbnVsbCAmJiBvc05hbWUuY29udGFpbnMoIldpbmRvd3MiKTsKKworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjYWxsIHN1cGVyIGZvciBiYXNpYydzIHByb3BlcnRpZXMgZmlsZS4KKyAgICAgICAgICAgIHVpRGVmYXVsdHMgPSBzdXBlci5nZXREZWZhdWx0cygpOworICAgICAgICAgICAgZGVmYXVsdHMuaW5pdGlhbGl6ZURlZmF1bHRzKHVpRGVmYXVsdHMpOworCisgICAgICAgICAgICAvLyBJbnN0YWxsIEtleWJpbmRpbmdzCisgICAgICAgICAgICBpZiAoaXNXaW5kb3dzKSB7CisgICAgICAgICAgICAgICAgV2luZG93c0tleWJpbmRpbmdzLmluc3RhbGxLZXliaW5kaW5ncyh1aURlZmF1bHRzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR1RLS2V5YmluZGluZ3MuaW5zdGFsbEtleWJpbmRpbmdzKHVpRGVmYXVsdHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgVGl0bGVkIEJvcmRlcgorICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoIlRpdGxlZEJvcmRlci50aXRsZVBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgVGl0bGVkQm9yZGVyLkFCT1ZFX1RPUCk7CisgICAgICAgICAgICB1aURlZmF1bHRzLnB1dCgiVGl0bGVkQm9yZGVyLmJvcmRlciIsIG5ldyBCb3JkZXJVSVJlc291cmNlKAorICAgICAgICAgICAgICAgICAgICBuZXcgTG93ZXJlZEJvcmRlcigpKSk7CisgICAgICAgICAgICB1aURlZmF1bHRzLnB1dCgiVGl0bGVkQm9yZGVyLnRpdGxlQ29sb3IiLAorICAgICAgICAgICAgICAgICAgICBnZXREZXJpdmVkQ29sb3IoInRleHQiLDAuMGYsMC4wZiwwLjIzZiwwLHRydWUpKTsKKyAgICAgICAgICAgIHVpRGVmYXVsdHMucHV0KCJUaXRsZWRCb3JkZXIuZm9udCIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBOaW1idXNEZWZhdWx0cy5EZXJpdmVkRm9udCgiZGVmYXVsdEZvbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFmLCB0cnVlLCBudWxsKSk7CisKKyAgICAgICAgICAgIC8vIENob29zZSBEaWFsb2cgYnV0dG9uIHBvc2l0aW9ucworICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoIk9wdGlvblBhbmUuaXNZZXNMYXN0IiwgIWlzV2luZG93cyk7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIFRhYmxlIFNjcm9sbFBhbmUgQ29ybmVyIENvbXBvbmVudAorICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoIlRhYmxlLnNjcm9sbFBhbmVDb3JuZXJDb21wb25lbnQiLAorICAgICAgICAgICAgICAgICAgICBUYWJsZVNjcm9sbFBhbmVDb3JuZXIuY2xhc3MpOworCisgICAgICAgICAgICAvLyBTZXR1cCB0aGUgc2V0dGluZ3MgZm9yIFRvb2xCYXJTZXBhcmF0b3Igd2hpY2ggaXMgY3VzdG9tCisgICAgICAgICAgICAvLyBpbnN0YWxsZWQgZm9yIE5pbWJ1cworICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoIlRvb2xCYXJTZXBhcmF0b3JbRW5hYmxlZF0uYmFja2dyb3VuZFBhaW50ZXIiLAorICAgICAgICAgICAgICAgICAgICBuZXcgVG9vbEJhclNlcGFyYXRvclBhaW50ZXIoKSk7CisKKyAgICAgICAgICAgIC8vIFBvcHVsYXRlIFVJRGVmYXVsdHMgd2l0aCBhIHN0YW5kYXJkIHNldCBvZiBwcm9wZXJ0aWVzCisgICAgICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnRLZXkgOiBDT01QT05FTlRfS0VZUykgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBjb21wb25lbnRLZXkrIi5mb3JlZ3JvdW5kIjsKKyAgICAgICAgICAgICAgICBpZiAoIXVpRGVmYXVsdHMuY29udGFpbnNLZXkoa2V5KSl7CisgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdHMucHV0KGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmltYnVzUHJvcGVydHkoY29tcG9uZW50S2V5LCJ0ZXh0Rm9yZWdyb3VuZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2V5ID0gY29tcG9uZW50S2V5KyIuYmFja2dyb3VuZCI7CisgICAgICAgICAgICAgICAgaWYgKCF1aURlZmF1bHRzLmNvbnRhaW5zS2V5KGtleSkpeworICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRzLnB1dChrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5pbWJ1c1Byb3BlcnR5KGNvbXBvbmVudEtleSwiYmFja2dyb3VuZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2V5ID0gY29tcG9uZW50S2V5KyIuZm9udCI7CisgICAgICAgICAgICAgICAgaWYgKCF1aURlZmF1bHRzLmNvbnRhaW5zS2V5KGtleSkpeworICAgICAgICAgICAgICAgICAgICB1aURlZmF1bHRzLnB1dChrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5pbWJ1c1Byb3BlcnR5KGNvbXBvbmVudEtleSwiZm9udCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2V5ID0gY29tcG9uZW50S2V5KyIuZGlzYWJsZWRUZXh0IjsKKyAgICAgICAgICAgICAgICBpZiAoIXVpRGVmYXVsdHMuY29udGFpbnNLZXkoa2V5KSl7CisgICAgICAgICAgICAgICAgICAgIHVpRGVmYXVsdHMucHV0KGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmltYnVzUHJvcGVydHkoY29tcG9uZW50S2V5LCJEaXNhYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Rm9yZWdyb3VuZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2V5ID0gY29tcG9uZW50S2V5KyIuZGlzYWJsZWQiOworICAgICAgICAgICAgICAgIGlmICghdWlEZWZhdWx0cy5jb250YWluc0tleShrZXkpKXsKKyAgICAgICAgICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOaW1idXNQcm9wZXJ0eShjb21wb25lbnRLZXksIkRpc2FibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmlsZVZpZXcgaWNvbiBrZXlzIGFyZSB1c2VkIGJ5IHNvbWUgYXBwbGljYXRpb25zLCB3ZSBkb24ndCBoYXZlCisgICAgICAgICAgICAvLyBhIGNvbXB1dGVyIGljb24gYXQgdGhlIG1vbWVudCBzbyB1c2luZyBob21lIGljb24gZm9yIG5vdworICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoIkZpbGVWaWV3LmNvbXB1dGVySWNvbiIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBMaW5rUHJvcGVydHkoIkZpbGVDaG9vc2VyLmhvbWVGb2xkZXJJY29uIikpOworICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoIkZpbGVWaWV3LmRpcmVjdG9yeUljb24iLAorICAgICAgICAgICAgICAgICAgICBuZXcgTGlua1Byb3BlcnR5KCJGaWxlQ2hvb3Nlci5kaXJlY3RvcnlJY29uIikpOworICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoIkZpbGVWaWV3LmZpbGVJY29uIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IExpbmtQcm9wZXJ0eSgiRmlsZUNob29zZXIuZmlsZUljb24iKSk7CisgICAgICAgICAgICB1aURlZmF1bHRzLnB1dCgiRmlsZVZpZXcuZmxvcHB5RHJpdmVJY29uIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IExpbmtQcm9wZXJ0eSgiRmlsZUNob29zZXIuZmxvcHB5RHJpdmVJY29uIikpOworICAgICAgICAgICAgdWlEZWZhdWx0cy5wdXQoIkZpbGVWaWV3LmhhcmREcml2ZUljb24iLAorICAgICAgICAgICAgICAgICAgICBuZXcgTGlua1Byb3BlcnR5KCJGaWxlQ2hvb3Nlci5oYXJkRHJpdmVJY29uIikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1aURlZmF1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0eWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcG9uZW50IGFuZCByZWdpb24uIFRoaXMKKyAgICAgKiB3aWxsIG5ldmVyIHJldHVybiBudWxsLiBJZiBhbiBhcHByb3ByaWF0ZSBjb21wb25lbnQgYW5kIHJlZ2lvbiBjYW5ub3QKKyAgICAgKiBiZSBkZXRlcm1pbmVkLCB0aGVuIGEgZGVmYXVsdCBzdHlsZSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIGEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIGEgSkNvbXBvbmVudAorICAgICAqIEBwYXJhbSByIGEgbm9uLW51bGwgcmVmZXJlbmNlIHRvIHRoZSByZWdpb24gb2YgdGhlIGNvbXBvbmVudCBjCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIHJlZmVyZW5jZSB0byBhIE5pbWJ1c1N0eWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTmltYnVzU3R5bGUgZ2V0U3R5bGUoSkNvbXBvbmVudCBjLCBSZWdpb24gcikgeworICAgICAgICByZXR1cm4gKE5pbWJ1c1N0eWxlKVN5bnRoTG9va0FuZEZlZWwuZ2V0U3R5bGUoYywgcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2hvcnQgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGlzIGxvb2sgYW5kIGZlZWwuIFRoaXMKKyAgICAgKiBTdHJpbmcgd2lsbCBiZSB0aGUgdW5xdW90ZWQgU3RyaW5nICJOaW1idXMiLgorICAgICAqCisgICAgICogQHJldHVybiBhIHNob3J0IHN0cmluZyBpZGVudGlmeWluZyB0aGlzIGxvb2sgYW5kIGZlZWwuCisgICAgICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJOaW1idXMiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhpcyBsb29rIGFuZCBmZWVsLiBUaGlzIFN0cmluZyB3aWxsCisgICAgICogYmUgdGhlIHVucXVvdGVkIFN0cmluZyAiTmltYnVzIi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzaG9ydCBzdHJpbmcgaWRlbnRpZnlpbmcgdGhpcyBsb29rIGFuZCBmZWVsLgorICAgICAqLworICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIGdldElEKCkgeworICAgICAgICByZXR1cm4gIk5pbWJ1cyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhpcyBsb29rIGFuZCBmZWVsLgorICAgICAqCisgICAgICogQHJldHVybiB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgbG9vayBhbmQgZmVlbC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJOaW1idXMgTG9vayBhbmQgRmVlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKiBAcmV0dXJuIHRydWUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gc2hvdWxkVXBkYXRlU3R5bGVPbkFuY2VzdG9yQ2hhbmdlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmVnaXN0ZXJzIGEgdGhpcmQgcGFydHkgY29tcG9uZW50IHdpdGggdGhlIE5pbWJ1c0xvb2tBbmRGZWVsLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlJlZ2lvbnMgcmVwcmVzZW50IENvbXBvbmVudHMgYW5kIGFyZWFzIHdpdGhpbiBDb21wb25lbnRzIHRoYXQgYWN0IGFzCisgICAgICogaW5kZXBlbmRlbnQgcGFpbnRpbmcgYXJlYXMuIE9uY2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBOaW1idXNMb29rQW5kRmVlbCwKKyAgICAgKiBOaW1idXNTdHlsZXMgZm9yIHRoZXNlIFJlZ2lvbnMgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlCisgICAgICogPGNvZGU+Z2V0U3R5bGU8L2NvZGU+IG1ldGhvZC48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgTmltYnVzTG9va0FuZEZlZWwgdXNlcyBhIHN0YW5kYXJkIG5hbWluZyBzY2hlbWUgZm9yIGVudHJpZXMgaW4gdGhlCisgICAgICogVUlEZWZhdWx0cyB0YWJsZS4gVGhlIGtleSBmb3IgZWFjaCBwcm9wZXJ0eSwgc3RhdGUsIHBhaW50ZXIsIGFuZCBvdGhlcgorICAgICAqIGRlZmF1bHQgcmVnaXN0ZXJlZCBpbiBVSURlZmF1bHRzIGZvciBhIHNwZWNpZmljIFJlZ2lvbiB3aWxsIGJlZ2luIHdpdGgKKyAgICAgKiB0aGUgc3BlY2lmaWVkIDxjb2RlPnByZWZpeDwvY29kZT48L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgc3VwcG9zZSBJIGhhZCBhIGNvbXBvbmVudCBuYW1lZCBKRm9vLiBTdXBwb3NlIEkgdGhlbiByZWdpc3RlcmVkCisgICAgICogdGhpcyBjb21wb25lbnQgd2l0aCB0aGUgTmltYnVzTG9va0FuZEZlZWwgaW4gdGhpcyBtYW5uZXI6PC9wPgorICAgICAqCisgICAgICogPHByZT48Y29kZT4KKyAgICAgKiAgICAgbGFmLnJlZ2lzdGVyKE5pbWJ1c0Zvb1VJLkZPT19SRUdJT04sICJGb28iKTsKKyAgICAgKiA8L2NvZGU+PC9wcmU+CisgICAgICoKKyAgICAgKiA8cD5JbiB0aGlzIGNhc2UsIEkgY291bGQgdGhlbiByZWdpc3RlciBwcm9wZXJ0aWVzIGZvciB0aGlzIGNvbXBvbmVudCB3aXRoCisgICAgICogVUlEZWZhdWx0cyBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjo8L3A+CisgICAgICoKKyAgICAgKiA8cHJlPjxjb2RlPgorICAgICAqICAgICBVSU1hbmFnZXIucHV0KCJGb28uYmFja2dyb3VuZCIsIG5ldyBDb2xvclVJUmVzb3VyY2UoQ29sb3IuQkxBQ0spKTsKKyAgICAgKiAgICAgVUlNYW5hZ2VyLnB1dCgiRm9vLkVuYWJsZWQuYmFja2dyb3VuZFBhaW50ZXIiLCBuZXcgRm9vQmFja2dyb3VuZFBhaW50ZXIoKSk7CisgICAgICogPC9jb2RlPjwvcHJlPgorICAgICAqCisgICAgICogPHA+SXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZWdpc3RlciBhIG5hbWVkIGNvbXBvbmVudCB3aXRoIE5pbWJ1cy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2FudGVkIHRvIHN0eWxlIHRoZSBiYWNrZ3JvdW5kIG9mIGEgSlBhbmVsCisgICAgICogbmFtZWQgIk15UGFuZWwiIGRpZmZlcmVudGx5IGZyb20gb3RoZXIgSlBhbmVscy4gWW91IGNvdWxkIGFjY29tcGxpc2ggdGhpcworICAgICAqIGJ5IGRvaW5nIHRoZSBmb2xsb3dpbmc6PC9wPgorICAgICAqCisgICAgICogPHByZT48Y29kZT4KKyAgICAgKiAgICAgbGFmLnJlZ2lzdGVyKFJlZ2lvbi5QQU5FTCwgIlwiTXlQYW5lbFwiIik7CisgICAgICogICAgIFVJTWFuYWdlci5wdXQoIlwiTXlQYW5lbFwiLmJhY2tncm91bmQiLCBuZXcgQ29sb3JVSVJlc291cmNlKENvbG9yLlJFRCkpOworICAgICAqIDwvY29kZT48L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWdpb24gVGhlIFN5bnRoIFJlZ2lvbiB0aGF0IGlzIGJlaW5nIHJlZ2lzdGVyZWQuIFN1Y2ggYXMgQnV0dG9uLCBvcgorICAgICAqICAgICAgICBTY3JvbGxCYXJUaHVtYiwgb3IgTmltYnVzRm9vVUkuRk9PX1JFR0lPTi4KKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBVSURlZmF1bHQgcHJlZml4LiBGb3IgZXhhbXBsZSwgY291bGQgYmUgQ29tYm9Cb3gsIG9yIGlmCisgICAgICogICAgICAgIGEgbmFtZWQgY29tcG9uZW50cywgIk15Q29tYm9Cb3giLCBvciBldmVuIHNvbWV0aGluZyBsaWtlCisgICAgICogICAgICAgIFRvb2xCYXIuIk15Q29tYm9Cb3giLiJDb21ib0JveC5hcnJvd0J1dHRvbiIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihSZWdpb24gcmVnaW9uLCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIGRlZmF1bHRzLnJlZ2lzdGVyKHJlZ2lvbiwgcHJlZml4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgdXRpbGl0eSBtZXRob2QgdGhhdCByZWFkcyBzeXN0ZW0ga2V5cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgR2V0UHJvcGVydHlBY3Rpb24oa2V5KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEljb24gZ2V0RGlzYWJsZWRJY29uKEpDb21wb25lbnQgY29tcG9uZW50LCBJY29uIGljb24pIHsKKyAgICAgICAgaWYgKGljb24gaW5zdGFuY2VvZiBTeW50aEljb24pIHsKKyAgICAgICAgICAgIFN5bnRoSWNvbiBzaSA9IChTeW50aEljb24paWNvbjsKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1nID0gRWZmZWN0VXRpbHMuY3JlYXRlQ29tcGF0aWJsZVRyYW5zbHVjZW50SW1hZ2UoCisgICAgICAgICAgICAgICAgICAgIHNpLmdldEljb25XaWR0aCgpLCBzaS5nZXRJY29uSGVpZ2h0KCkpOworICAgICAgICAgICAgR3JhcGhpY3MyRCBnZnggPSBpbWcuY3JlYXRlR3JhcGhpY3MoKTsKKyAgICAgICAgICAgIHNpLnBhaW50SWNvbihjb21wb25lbnQsIGdmeCwgMCwgMCk7CisgICAgICAgICAgICBnZnguZGlzcG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUljb25VSVJlc291cmNlKEdyYXlGaWx0ZXIuY3JlYXRlRGlzYWJsZWRJbWFnZShpbWcpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXREaXNhYmxlZEljb24oY29tcG9uZW50LCBpY29uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGRlcml2ZWQgY29sb3IsIGRlcml2ZWQgY29sb3JzIGFyZSBzaGFyZWQgaW5zdGFuY2VzIGFuZCBpcyBjb2xvcgorICAgICAqIHZhbHVlIHdpbGwgY2hhbmdlIHdoZW4gaXRzIHBhcmVudCBVSURlZmF1bHQgY29sb3IgY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1aURlZmF1bHRQYXJlbnROYW1lIFRoZSBwYXJlbnQgVUlEZWZhdWx0IGtleQorICAgICAqIEBwYXJhbSBoT2Zmc2V0ICAgICAgICAgICAgIFRoZSBodWUgb2Zmc2V0CisgICAgICogQHBhcmFtIHNPZmZzZXQgICAgICAgICAgICAgVGhlIHNhdHVyYXRpb24gb2Zmc2V0CisgICAgICogQHBhcmFtIGJPZmZzZXQgICAgICAgICAgICAgVGhlIGJyaWdodG5lc3Mgb2Zmc2V0CisgICAgICogQHBhcmFtIGFPZmZzZXQgICAgICAgICAgICAgVGhlIGFscGhhIG9mZnNldAorICAgICAqIEBwYXJhbSB1aVJlc291cmNlICAgICAgICAgIFRydWUgaWYgdGhlIGRlcml2ZWQgY29sb3Igc2hvdWxkIGJlIGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSVJlc291cmNlLCBmYWxzZSBpZiBpdCBzaG91bGQgbm90IGJlCisgICAgICogQHJldHVybiBUaGUgc3RvcmVkIGRlcml2ZWQgY29sb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sb3IgZ2V0RGVyaXZlZENvbG9yKFN0cmluZyB1aURlZmF1bHRQYXJlbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwgZmxvYXQgc09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJPZmZzZXQsIGludCBhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1aVJlc291cmNlKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0cy5nZXREZXJpdmVkQ29sb3IodWlEZWZhdWx0UGFyZW50TmFtZSwgaE9mZnNldCwgc09mZnNldCwKKyAgICAgICAgICAgICAgICBiT2Zmc2V0LCBhT2Zmc2V0LCB1aVJlc291cmNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIGFuZCByZXR1cm5zIGEgY29sb3IsIHdoaWNoIGlzIGRlcml2ZWQgZnJvbSBhbiBvZmZzZXQgYmV0d2VlbiB0d28KKyAgICAgKiBvdGhlciBjb2xvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sb3IxICAgVGhlIGZpcnN0IGNvbG9yCisgICAgICogQHBhcmFtIGNvbG9yMiAgIFRoZSBzZWNvbmQgY29sb3IKKyAgICAgKiBAcGFyYW0gbWlkUG9pbnQgVGhlIG9mZnNldCBiZXR3ZWVuIGNvbG9yIDEgYW5kIGNvbG9yIDIsIGEgdmFsdWUgb2YgMC4wIGlzCisgICAgICogICAgICAgICAgICAgICAgIGNvbG9yIDEgYW5kIDEuMCBpcyBjb2xvciAyOworICAgICAqIEBwYXJhbSB1aVJlc291cmNlIFRydWUgaWYgdGhlIGRlcml2ZWQgY29sb3Igc2hvdWxkIGJlIGEgVUlSZXNvdXJjZQorICAgICAqIEByZXR1cm4gVGhlIGRlcml2ZWQgY29sb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29sb3IgZ2V0RGVyaXZlZENvbG9yKENvbG9yIGNvbG9yMSwgQ29sb3IgY29sb3IyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaWRQb2ludCwgYm9vbGVhbiB1aVJlc291cmNlKSB7CisgICAgICAgIGludCBhcmdiID0gZGVyaXZlQVJHQihjb2xvcjEsIGNvbG9yMiwgbWlkUG9pbnQpOworICAgICAgICBpZiAodWlSZXNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvclVJUmVzb3VyY2UoYXJnYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKGFyZ2IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyBhbmQgcmV0dXJucyBhIGNvbG9yLCB3aGljaCBpcyBkZXJpdmVkIGZyb20gYSBvZmZzZXQgYmV0d2VlbiB0d28KKyAgICAgKiBvdGhlciBjb2xvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sb3IxICAgVGhlIGZpcnN0IGNvbG9yCisgICAgICogQHBhcmFtIGNvbG9yMiAgIFRoZSBzZWNvbmQgY29sb3IKKyAgICAgKiBAcGFyYW0gbWlkUG9pbnQgVGhlIG9mZnNldCBiZXR3ZWVuIGNvbG9yIDEgYW5kIGNvbG9yIDIsIGEgdmFsdWUgb2YgMC4wIGlzCisgICAgICogICAgICAgICAgICAgICAgIGNvbG9yIDEgYW5kIDEuMCBpcyBjb2xvciAyOworICAgICAqIEByZXR1cm4gVGhlIGRlcml2ZWQgY29sb3IsIHdoaWNoIHdpbGwgYmUgYSBVSVJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIENvbG9yIGdldERlcml2ZWRDb2xvcihDb2xvciBjb2xvcjEsIENvbG9yIGNvbG9yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWlkUG9pbnQpIHsKKyAgICAgICAgcmV0dXJuIGdldERlcml2ZWRDb2xvcihjb2xvcjEsIGNvbG9yMiwgbWlkUG9pbnQsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhY2thZ2UgcHJpdmF0ZSBtZXRob2Qgd2hpY2ggcmV0dXJucyBlaXRoZXIgQm9yZGVyTGF5b3V0Lk5PUlRILAorICAgICAqIEJvcmRlckxheW91dC5TT1VUSCwgQm9yZGVyTGF5b3V0LkVBU1QsIG9yIEJvcmRlckxheW91dC5XRVNUIGRlcGVuZGluZworICAgICAqIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgdG9vbGJhciBpbiBpdHMgcGFyZW50LiBUaGUgdG9vbGJhciBtaWdodCBiZQorICAgICAqIGluIFBBR0VfU1RBUlQsIFBBR0VfRU5ELCBDRU5URVIsIG9yIHNvbWUgb3RoZXIgcG9zaXRpb24sIGJ1dCB3aWxsIGJlCisgICAgICogcmVzb2x2ZWQgdG8gZWl0aGVyIE5PUlRILFNPVVRILEVBU1QsIG9yIFdFU1QgYmFzZWQgb24gd2hlcmUgdGhlIHRvb2xiYXIKKyAgICAgKiBhY3R1YWxseSBJUywgd2l0aCBDRU5URVIgYmVpbmcgTk9SVEguCisgICAgICoKKyAgICAgKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIGJvcmRlciBsaW5lIHNob3VsZCBiZSBkcmF3bgorICAgICAqIGJ5IHRoZSBjdXN0b20gdG9vbGJhciBzdGF0ZXMsIGFuZCBhbHNvIHVzZWQgYnkgTmltYnVzSWNvbiB0byBkZXRlcm1pbmUKKyAgICAgKiB3aGV0aGVyIHRoZSBoYW5kbGUgaWNvbiBuZWVkcyB0byBiZSBzaGlmdGVkIHRvIGxvb2sgY29ycmVjdC4KKyAgICAgKgorICAgICAqIFRvb2xsYmFycyBhcmUgdW5mb3J0dW5hdGVseSBvZGQgaW4gdGhlIHdheSB0aGVzZSB0aGluZ3MgYXJlIGhhbmRsZWQsCisgICAgICogYW5kIHNvIHRoaXMgY29kZSBleGlzdHMgdG8gdW5pZnkgdGhlIGxvZ2ljIHJlbGF0ZWQgdG8gdG9vbGJhcnMgc28gaXQgY2FuCisgICAgICogYmUgc2hhcmVkIGFtb25nIHRoZSBzdGF0aWMgZmlsZXMgc3VjaCBhcyBOaW1idXNJY29uIGFuZCBnZW5lcmF0ZWQgZmlsZXMKKyAgICAgKiBzdWNoIGFzIHRoZSBUb29sQmFyIHN0YXRlIGNsYXNzZXMuCisgICAgICovCisgICAgc3RhdGljIE9iamVjdCByZXNvbHZlVG9vbGJhckNvbnN0cmFpbnQoSlRvb2xCYXIgdG9vbGJhcikgeworICAgICAgICAvL05PVEU6IHdlIGRvbid0IHdvcnJ5IGFib3V0IGNvbXBvbmVudCBvcmllbnRhdGlvbiBvciBQQUdFX0VORCBldGMKKyAgICAgICAgLy9iZWNhdXNlIHRoZSBCYXNpY1Rvb2xCYXJVSSBhbHdheXMgdXNlcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZgorICAgICAgICAvL05PUlRIL1NPVVRIL0VBU1QvV0VTVC4KKyAgICAgICAgaWYgKHRvb2xiYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IHRvb2xiYXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMYXlvdXRNYW5hZ2VyIG0gPSBwYXJlbnQuZ2V0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaWYgKG0gaW5zdGFuY2VvZiBCb3JkZXJMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQm9yZGVyTGF5b3V0IGIgPSAoQm9yZGVyTGF5b3V0KW07CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb24gPSBiLmdldENvbnN0cmFpbnRzKHRvb2xiYXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29uID09IFNPVVRIIHx8IGNvbiA9PSBFQVNUIHx8IGNvbiA9PSBXRVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1JUSDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PUlRIOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlcml2ZXMgdGhlIEFSR0IgdmFsdWUgZm9yIGEgY29sb3IgYmFzZWQgb24gYW4gb2Zmc2V0IGJldHdlZW4gdHdvCisgICAgICogb3RoZXIgY29sb3JzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbG9yMSAgIFRoZSBmaXJzdCBjb2xvcgorICAgICAqIEBwYXJhbSBjb2xvcjIgICBUaGUgc2Vjb25kIGNvbG9yCisgICAgICogQHBhcmFtIG1pZFBvaW50IFRoZSBvZmZzZXQgYmV0d2VlbiBjb2xvciAxIGFuZCBjb2xvciAyLCBhIHZhbHVlIG9mIDAuMCBpcworICAgICAqICAgICAgICAgICAgICAgICBjb2xvciAxIGFuZCAxLjAgaXMgY29sb3IgMjsKKyAgICAgKiBAcmV0dXJuIHRoZSBBUkdCIHZhbHVlIGZvciBhIG5ldyBjb2xvciBiYXNlZCBvbiB0aGlzIGRlcml2YXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGRlcml2ZUFSR0IoQ29sb3IgY29sb3IxLCBDb2xvciBjb2xvcjIsIGZsb2F0IG1pZFBvaW50KSB7CisgICAgICAgIGludCByID0gY29sb3IxLmdldFJlZCgpICsKKyAgICAgICAgICAgICAgICAoaW50KSAoKGNvbG9yMi5nZXRSZWQoKSAtIGNvbG9yMS5nZXRSZWQoKSkgKiBtaWRQb2ludCArIDAuNWYpOworICAgICAgICBpbnQgZyA9IGNvbG9yMS5nZXRHcmVlbigpICsKKyAgICAgICAgICAgICAgICAoaW50KSAoKGNvbG9yMi5nZXRHcmVlbigpIC0gY29sb3IxLmdldEdyZWVuKCkpICogbWlkUG9pbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgMC41Zik7CisgICAgICAgIGludCBiID0gY29sb3IxLmdldEJsdWUoKSArCisgICAgICAgICAgICAgICAgKGludCkgKChjb2xvcjIuZ2V0Qmx1ZSgpIC0gY29sb3IxLmdldEJsdWUoKSkgKiBtaWRQb2ludCArIDAuNWYpOworICAgICAgICBpbnQgYSA9IGNvbG9yMS5nZXRBbHBoYSgpICsKKyAgICAgICAgICAgICAgICAoaW50KSAoKGNvbG9yMi5nZXRBbHBoYSgpIC0gY29sb3IxLmdldEFscGhhKCkpICogbWlkUG9pbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgMC41Zik7CisgICAgICAgIHJldHVybiAoKGEgJiAweEZGKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgociAmIDB4RkYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKChnICYgMHhGRikgPDwgOCkgfAorICAgICAgICAgICAgICAgIChiICYgMHhGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIFN5bWJvbGljIExpbmsgc3R5bGUgVUlEZWZhbHRzIFByb3BlcnR5CisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBMaW5rUHJvcGVydHkgaW1wbGVtZW50cyBVSURlZmF1bHRzLkFjdGl2ZVZhbHVlLCBVSVJlc291cmNleworICAgICAgICBwcml2YXRlIFN0cmluZyBkc3RQcm9wTmFtZTsKKworICAgICAgICBwcml2YXRlIExpbmtQcm9wZXJ0eShTdHJpbmcgZHN0UHJvcE5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuZHN0UHJvcE5hbWUgPSBkc3RQcm9wTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVZhbHVlKFVJRGVmYXVsdHMgdGFibGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVSU1hbmFnZXIuZ2V0KGRzdFByb3BOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5pbWJ1cyBQcm9wZXJ0eSB0aGF0IGxvb2tzIHVwIE5pbWJ1cyBrZXlzIGZvciBzdGFuZGFyZCBrZXkgbmFtZXMuIEZvcgorICAgICAqIGV4YW1wbGUgIkJ1dHRvbi5iYWNrZ3JvdW5kIiAtLT4gIkJ1dHRvbltFbmFibGVkXS5iYWNrZ291bmQiCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBOaW1idXNQcm9wZXJ0eSBpbXBsZW1lbnRzIFVJRGVmYXVsdHMuQWN0aXZlVmFsdWUsIFVJUmVzb3VyY2UgeworICAgICAgICBwcml2YXRlIFN0cmluZyBwcmVmaXg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3VmZml4OworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNGb250OworCisgICAgICAgIHByaXZhdGUgTmltYnVzUHJvcGVydHkoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCkgeworICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgICAgICB0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKKyAgICAgICAgICAgIGlzRm9udCA9ICJmb250Ii5lcXVhbHMoc3VmZml4KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTmltYnVzUHJvcGVydHkoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN0YXRlLCBTdHJpbmcgc3VmZml4KSB7CisgICAgICAgICAgICB0aGlzKHByZWZpeCxzdWZmaXgpOworICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgdGhlIHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSA8Y29kZT5VSURlZmF1bHRzPC9jb2RlPiB0YWJsZS4KKyAgICAgICAgICogVGhlIG9iamVjdCBpcyBjcmVhdGVkIGVhY2ggdGltZSBpdCBpcyBhY2Nlc3NlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRhYmxlIGEgPGNvZGU+VUlEZWZhdWx0czwvY29kZT4gdGFibGUKKyAgICAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCA8Y29kZT5PYmplY3Q8L2NvZGU+CisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVWYWx1ZShVSURlZmF1bHRzIHRhYmxlKSB7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKKyAgICAgICAgICAgIC8vIGNoZWNrIHNwZWNpZmllZCBzdGF0ZQorICAgICAgICAgICAgaWYgKHN0YXRlIT1udWxsKXsKKyAgICAgICAgICAgICAgICBvYmogPSB1aURlZmF1bHRzLmdldChwcmVmaXgrIlsiK3N0YXRlKyJdLiIrc3VmZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIGVuYWJsZWQgc3RhdGUKKyAgICAgICAgICAgIGlmIChvYmo9PW51bGwpeworICAgICAgICAgICAgICAgIG9iaiA9IHVpRGVmYXVsdHMuZ2V0KHByZWZpeCsiW0VuYWJsZWRdLiIrc3VmZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciBkZWZhdWx0cworICAgICAgICAgICAgaWYgKG9iaj09bnVsbCl7CisgICAgICAgICAgICAgICAgaWYgKGlzRm9udCkgeworICAgICAgICAgICAgICAgICAgICBvYmogPSB1aURlZmF1bHRzLmdldCgiZGVmYXVsdEZvbnQiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvYmogPSB1aURlZmF1bHRzLmdldChzdWZmaXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvTmltYnVzU3R5bGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9OaW1idXNTdHlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZWZjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvTmltYnVzU3R5bGUuamF2YQpAQCAtMCwwICsxLDEyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgamF2YXguc3dpbmcucGxhZi5uaW1idXM7CisKK2ltcG9ydCBqYXZheC5zd2luZy5QYWludGVyOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuVUlEZWZhdWx0czsKK2ltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7CitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5Db2xvclVJUmVzb3VyY2U7CitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5zeW50aC5Db2xvclR5cGU7CitpbXBvcnQgc3RhdGljIGphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhDb25zdGFudHMuKjsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoUGFpbnRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoU3R5bGU7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRm9udDsKK2ltcG9ydCBqYXZhLmF3dC5JbnNldHM7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgc3VuLmF3dC5BcHBDb250ZXh0OworCisvKioKKyAqIDxwPkEgU3ludGhTdHlsZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IE5pbWJ1cy4gRWFjaCBSZWdpb24gdGhhdCBoYXMgYmVlbgorICogcmVnaXN0ZXJlZCB3aXRoIHRoZSBOaW1idXNMb29rQW5kRmVlbCB3aWxsIGhhdmUgYW4gYXNzb2NpYXRlZCBOaW1idXNTdHlsZS4KKyAqIFRoaXJkIHBhcnR5IGNvbXBvbmVudHMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBOaW1idXNMb29rQW5kRmVlbCB3aWxsCisgKiB0aGVyZWZvcmUgYmUgaGFuZGVkIGEgTmltYnVzU3R5bGUgZnJvbSB0aGUgbG9vayBhbmQgZmVlbCBmcm9tIHRoZQorICogI2dldFN0eWxlKEpDb21wb25lbnQsIFJlZ2lvbikgbWV0aG9kLjwvcD4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIHByb3Blcmx5IHJlYWRzIGFuZCByZXRyaWV2ZXMgdmFsdWVzIHBsYWNlZCBpbiB0aGUgVUlEZWZhdWx0cworICogYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZCBOaW1idXMgbmFtaW5nIGNvbnZlbnRpb25zLiBJdCB3aWxsIGNyZWF0ZSBhbmQKKyAqIHJldHJpZXZlIHBhaW50ZXJzLCBmb250cywgY29sb3JzLCBhbmQgb3RoZXIgZGF0YSBzdG9yZWQgdGhlcmUuPC9wPgorICoKKyAqIDxwPk5pbWJ1c1N0eWxlIGFsc28gc3VwcG9ydHMgdGhlIGFiaWxpdHkgdG8gb3ZlcnJpZGUgc2V0dGluZ3Mgb24gYSBwZXIKKyAqIGNvbXBvbmVudCBiYXNpcy4gTmltYnVzU3R5bGUgY2hlY2tzIHRoZSBjb21wb25lbnQncyBjbGllbnQgcHJvcGVydHkgbWFwIGZvcgorICogIk5pbWJ1cy5PdmVycmlkZXMiLiBJZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5IGlzIGFuIGluc3RhbmNlIG9mCisgKiBVSURlZmF1bHRzLCB0aGVuIHRoZSB2YWx1ZXMgaW4gdGhhdCBkZWZhdWx0cyB0YWJsZSB3aWxsIG92ZXJyaWRlIHRoZSBzdGFuZGFyZAorICogTmltYnVzIGRlZmF1bHRzIGluIFVJTWFuYWdlciwgYnV0IGZvciB0aGF0IGNvbXBvbmVudCBpbnN0YW5jZSBvbmx5LjwvcD4KKyAqCisgKiA8cD5PcHRpb25hbGx5LCB5b3UgbWF5IHNwZWNpZnkgdGhlIGNsaWVudCBwcm9wZXJ0eQorICogIk5pbWJ1cy5PdmVycmlkZXMuSW5oZXJpdERlZmF1bHRzIi4gSWYgdHJ1ZSwgdGhpcyBjbGllbnQgcHJvcGVydHkgaW5kaWNhdGVzCisgKiB0aGF0IHRoZSBkZWZhdWx0cyBsb2NhdGVkIGluIFVJTWFuYWdlciBzaG91bGQgZmlyc3QgYmUgcmVhZCwgYW5kIHRoZW4KKyAqIHJlcGxhY2VkIHdpdGggZGVmYXVsdHMgbG9jYXRlZCBpbiB0aGUgY29tcG9uZW50IGNsaWVudCBwcm9wZXJ0aWVzLiBJZiBmYWxzZSwKKyAqIHRoZW4gb25seSB0aGUgZGVmYXVsdHMgbG9jYXRlZCBpbiB0aGUgY29tcG9uZW50IGNsaWVudCBwcm9wZXJ0eSBtYXAgd2lsbAorICogYmUgdXNlZC4gSWYgbm90IHNwZWNpZmllZCwgaXQgaXMgYXNzdW1lZCB0byBiZSB0cnVlLjwvcD4KKyAqCisgKiA8cD5Zb3UgbXVzdCBzcGVjaWZ5ICJOaW1idXMuT3ZlcnJpZGVzIiBmb3IgIk5pbWJ1cy5PdmVycmlkZXMuSW5oZXJpdERlZmF1bHRzIgorICogdG8gaGF2ZSBhbnkgZWZmZWN0LiAiTmltYnVzLk92ZXJyaWRlcyIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueQorICogb3ZlcnJpZGVzLCB3aGlsZSAiTmltYnVzLk92ZXJyaWRlcy5Jbmhlcml0RGVmYXVsdHMiIGluZGljYXRlcyB3aGV0aGVyIHRob3NlCisgKiBvdmVycmlkZXMgc2hvdWxkIGZpcnN0IGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGRlZmF1bHRzIGZyb20gVUlNYW5hZ2VyLjwvcD4KKyAqCisgKiA8cD5UaGUgTmltYnVzU3R5bGUgaXMgcmVsb2FkZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgZmlyZWQKKyAqIGZvciBhIGNvbXBvbmVudCBmb3IgIk5pbWJ1cy5PdmVycmlkZXMiIG9yICJOaW1idXMuT3ZlcnJpZGVzLkluaGVyaXREZWZhdWx0cyIuCisgKiBTbyBmb3IgZXhhbXBsZSwgc2V0dGluZyBhIG5ldyBVSURlZmF1bHRzIG9uIGEgY29tcG9uZW50IHdvdWxkIGNhdXNlIHRoZQorICogc3R5bGUgdG8gYmUgcmVsb2FkZWQuPC9wPgorICoKKyAqIDxwPlRoZSB2YWx1ZXMgYXJlIG9ubHkgcmVhZCBvdXQgb2YgVUlNYW5hZ2VyIG9uY2UsIGFuZCB0aGVuIGNhY2hlZC4gSWYKKyAqIHlvdSBuZWVkIHRvIHJlYWQgdGhlIHZhbHVlcyBhZ2FpbiAoZm9yIGV4YW1wbGUsIGlmIHRoZSBVSSBpcyBiZWluZyByZWxvYWRlZCksCisgKiB0aGVuIGRpc2NhcmQgdGhpcyBOaW1idXNTdHlsZSBhbmQgcmVhZCBhIG5ldyBvbmUgZnJvbSBOaW1idXNMb29rQW5kRmVlbAorICogdXNpbmcgTmltYnVzTG9va0FuZEZlZWwuZ2V0U3R5bGUuPC9wPgorICoKKyAqIDxwPlRoZSBwcmltYXJ5IEFQSSBvZiBpbnRlcmVzdCBpbiB0aGlzIGNsYXNzIGZvciAzcmQgcGFydHkgY29tcG9uZW50IGF1dGhvcnMKKyAqIGFyZSB0aGUgdGhyZWUgbWV0aG9kcyB3aGljaCByZXRyaWV2ZSBwYWludGVyczogI2dldEJhY2tncm91bmRQYWludGVyLAorICogI2dldEZvcmVncm91bmRQYWludGVyLCBhbmQgI2dldEJvcmRlclBhaW50ZXIuPC9wPgorICoKKyAqIDxwPk5pbWJ1c1N0eWxlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gc3RhdGVzLCBvciBtb2RpZnkgdGhlIG9yZGVyIG9mCisgKiBzdGF0ZXMuIFN5bnRoIChhbmQgdGh1cyBOaW1idXMpIGhhcyB0aGUgY29uY2VwdCBvZiBhICJzdGF0ZSIuIEZvciBleGFtcGxlLAorICogYSBKQnV0dG9uIG1pZ2h0IGJlIGluIHRoZSAiTU9VU0VfT1ZFUiIgc3RhdGUsIG9yIHRoZSAiRU5BQkxFRCIgc3RhdGUsIG9yIHRoZQorICogIkRJU0FCTEVEIiBzdGF0ZS4gVGhlc2UgYXJlIGFsbCAic3RhbmRhcmQiIHN0YXRlcyB3aGljaCBhcmUgZGVmaW5lZCBpbiBzeW50aCwKKyAqIGFuZCB3aGljaCBhcHBseSB0byBhbGwgc3ludGggUmVnaW9ucy48L3A+CisgKgorICogPHA+U29tZXRpbWVzLCBob3dldmVyLCB5b3UgbmVlZCB0byBoYXZlIGEgY3VzdG9tIHN0YXRlLiBGb3IgZXhhbXBsZSwgeW91CisgKiB3YW50IEpCdXR0b24gdG8gcmVuZGVyIGRpZmZlcmVudGx5IGlmIGl0J3MgcGFyZW50IGlzIGEgSlRvb2xiYXIuIEluIE5pbWJ1cywKKyAqIHlvdSBzcGVjaWZ5IHRoZXNlIGN1c3RvbSBzdGF0ZXMgYnkgaW5jbHVkaW5nIGEgc3BlY2lhbCBrZXkgaW4gVUlEZWZhdWx0cy4KKyAqIFRoZSBmb2xsb3dpbmcgVUlEZWZhdWx0cyBlbnRyaWVzIGRlZmluZSB0aHJlZSBzdGF0ZXMgZm9yIHRoaXMgYnV0dG9uOjwvcD4KKyAqCisgKiA8cHJlPjxjb2RlPgorICogICAgIEpCdXR0b24uU3RhdGVzID0gRW5hYmxlZCwgRGlzYWJsZWQsIFRvb2xiYXIKKyAqICAgICBKQnV0dG9uW0VuYWJsZWRdLmJhY2tncm91bmRQYWludGVyID0gc29tZVBhaW50ZXIKKyAqICAgICBKQnV0dG9uW0Rpc2FibGVkXS5iYWNrZ3JvdW5kID0gQkxVRQorICogICAgIEpCdXR0b25bVG9vbGJhcl0uYmFja2dyb3VuZFBhaW50ZXIgPSBzb21lT3RoZXJQYWludAorICogPC9jb2RlPjwvcHJlPgorICoKKyAqIDxwPkFzIHlvdSBjYW4gc2VlLCB0aGUgPGNvZGU+SkJ1dHRvbi5TdGF0ZXM8L2NvZGU+IGVudHJ5IGxpc3RzIHRoZSBzdGF0ZXMKKyAqIHRoYXQgdGhlIEpCdXR0b24gc3R5bGUgd2lsbCBzdXBwb3J0LiBZb3UgdGhlbiBzcGVjaWZ5IHRoZSBzZXR0aW5ncyBmb3IKKyAqIGVhY2ggc3RhdGUuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgPGNvZGU+SkJ1dHRvbi5TdGF0ZXM8L2NvZGU+IGVudHJ5LAorICogdGhlbiB0aGUgc3RhbmRhcmQgU3ludGggc3RhdGVzIHdpbGwgYmUgYXNzdW1lZC4gSWYgeW91IHNwZWNpZnkgdGhlIGVudHJ5CisgKiBidXQgdGhlIGxpc3Qgb2Ygc3RhdGVzIGlzIGVtcHR5IG9yIG51bGwsIHRoZW4gdGhlIHN0YW5kYXJkIHN5bnRoIHN0YXRlcworICogd2lsbCBiZSBhc3N1bWVkLjwvcD4KKyAqCisgKiBAYXV0aG9yIFJpY2hhcmQgQmFpcgorICogQGF1dGhvciBKYXNwZXIgUG90dHMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5pbWJ1c1N0eWxlIGV4dGVuZHMgU3ludGhTdHlsZSB7CisgICAgLyogS2V5cyBhbmQgc2NhbGVzIGZvciBsYXJnZS9zbWFsbC9taW5pIGNvbXBvbmVudHMsIGJhc2VkIG9uIEFwcGxlcyBzaXplcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBUkdFX0tFWSA9ICJsYXJnZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU01BTExfS0VZID0gInNtYWxsIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5JX0tFWSA9ICJtaW5pIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBMQVJHRV9TQ0FMRSA9IDEuMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgU01BTExfU0NBTEUgPSAwLjg1NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBNSU5JX1NDQUxFID0gMC43MTQ7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIGNvbnN0YW50IHVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgZHVyaW5nIHRoZSBnZXQoKSBtZXRob2QuCisgICAgICogSWYgZ2V0KCkgcnVucyB0aHJvdWdoIGFsbCBvZiB0aGUgc2VhcmNoIGxvY2F0aW9ucyBhbmQgZGV0ZXJtaW5lcyB0aGF0CisgICAgICogdGhlcmUgaXMgbm8gdmFsdWUsIHRoZW4gTlVMTCB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSB2YWx1ZXMgbWFwLiBUaGlzIHdheQorICAgICAqIG9uIHN1YnNlcXVlbnQgbG9va3VwcyBpdCB3aWxsIHNpbXBseSBleHRyYWN0IE5VTEwsIHNlZSBpdCwgYW5kIHJldHVybgorICAgICAqIG51bGwgcmF0aGVyIHRoYW4gY29udGludWluZyB0aGUgbG9va3VwIHByb2NlZHVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTlVMTCA9ICdcMCc7CisgICAgLyoqCisgICAgICogPHA+VGhlIENvbG9yIHRvIHJldHVybiBmcm9tIGdldENvbG9yRm9yU3RhdGUgaWYgaXQgd291bGQgb3RoZXJ3aXNlIGhhdmUKKyAgICAgKiByZXR1cm5lZCBudWxsLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlJldHVybmluZyBudWxsIGZyb20gZ2V0Q29sb3JGb3JTdGF0ZSBpcyBhIHZlcnkgYmFkIHRoaW5nLCBhcyBpdCBjYXVzZXMKKyAgICAgKiB0aGUgQVdUIHBlZXIgZm9yIHRoZSBjb21wb25lbnQgdG8gaW5zdGFsbCBhIFN5c3RlbUNvbG9yLCB3aGljaCBpcyBub3QgYQorICAgICAqIFVJUmVzb3VyY2UuIEFzIGEgcmVzdWx0LCBpZiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBmcm9tCisgICAgICogZ2V0Q29sb3JGb3JTdGF0ZSwgdGhlbiB0aGVyZWFmdGVyIHRoZSBjb2xvciBpcyBub3QgdXBkYXRlZCBmb3Igb3RoZXIKKyAgICAgKiBzdGF0ZXMgb3Igb24gTEFGIGNoYW5nZXMgb3IgdXBkYXRlcy4gVGhpcyBERUZBVUxUX0NPTE9SIGlzIHVzZWQgdG8KKyAgICAgKiBlbnN1cmUgdGhhdCBhIENvbG9yVUlSZXNvdXJjZSBpcyBhbHdheXMgcmV0dXJuZWQgZnJvbQorICAgICAqIGdldENvbG9yRm9yU3RhdGUuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIERFRkFVTFRfQ09MT1IgPSBuZXcgQ29sb3JVSVJlc291cmNlKENvbG9yLkJMQUNLKTsKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgQ29tcGFyYXRvciBmb3Igb3JkZXJpbmcgdGhlIFJ1bnRpbWVTdGF0ZXMgYWNjb3JkaW5nIHRvIHRoZWlyCisgICAgICogcmFuay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFJ1bnRpbWVTdGF0ZT4gU1RBVEVfQ09NUEFSQVRPUiA9CisgICAgICAgIG5ldyBDb21wYXJhdG9yPFJ1bnRpbWVTdGF0ZT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShSdW50aW1lU3RhdGUgYSwgUnVudGltZVN0YXRlIGIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYS5zdGF0ZSAtIGIuc3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgLyoqCisgICAgICogVGhlIHByZWZpeCBmb3IgdGhlIGNvbXBvbmVudCBvciByZWdpb24gdGhhdCB0aGlzIE5pbWJ1c1N0eWxlCisgICAgICogcmVwcmVzZW50cy4gVGhpcyBwcmVmaXggaXMgdXNlZCB0byBsb29rdXAgc3RhdGUgaW4gdGhlIFVJTWFuYWdlci4KKyAgICAgKiBJdCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgQnV0dG9uIG9yIFNsaWRlci5UaHVtYiBvciAiTXlCdXR0b24iIG9yCisgICAgICogQ29tYm9Cb3guIkNvbWJvQm94LmFycm93QnV0dG9uIiBvciAiTXlDb21ib0JveCIuIkNvbWJvQm94LmFycm93QnV0dG9uIgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsKKyAgICAvKioKKyAgICAgKiBUaGUgU3ludGhQYWludGVyIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgTmltYnVzU3R5bGUuIFRoZQorICAgICAqIFN5bnRoUGFpbnRlciByZXR1cm5lZCB3aWxsIGJlIGEgU3ludGhQYWludGVySW1wbCwgd2hpY2ggd2lsbCBpbiB0dXJuCisgICAgICogZGVsZWdhdGUgYmFjayB0byB0aGlzIE5pbWJ1c1N0eWxlIGZvciB0aGUgcHJvcGVyIFBhaW50ZXIgKG5vdAorICAgICAqIFN5bnRoUGFpbnRlcikgdG8gdXNlIGZvciBwYWludGluZyB0aGUgZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgb3IgYm9yZGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3ludGhQYWludGVyIHBhaW50ZXI7CisgICAgLyoqCisgICAgICogRGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgb2YgdGhlIGRlZmF1bHRzLCBpbnNldHMsIHN0YXRlcywgYW5kIG90aGVyCisgICAgICogdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0eWxlLiBUaGlzIGluc3RhbmNlIHJlZmVycyB0byBkZWZhdWx0CisgICAgICogdmFsdWVzLCBhbmQgYXJlIHVzZWQgd2hlbiBubyBvdmVycmlkZXMgYXJlIGRpc2NvdmVyZWQgaW4gdGhlIGNsaWVudAorICAgICAqIHByb3BlcnRpZXMgb2YgYSBjb21wb25lbnQuIFRoZXNlIHZhbHVlcyBhcmUgbGF6aWx5IGNyZWF0ZWQgb24gZmlyc3QKKyAgICAgKiBhY2Nlc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBWYWx1ZXMgdmFsdWVzOworCisgICAgLyoqCisgICAgICogQSB0ZW1wb3JhcnkgQ2FjaGVLZXkgdXNlZCB0byBwZXJmb3JtIGxvb2t1cHMuIFRoaXMgcGF0dGVybiBhdm9pZHMKKyAgICAgKiBjcmVhdGluZyB1c2VsZXNzIGdhcmJhZ2Uga2V5cywgb3IgY29uY2F0ZW5hdGluZyBzdHJpbmdzLCBldGMuCisgICAgICovCisgICAgcHJpdmF0ZSBDYWNoZUtleSB0bXBLZXkgPSBuZXcgQ2FjaGVLZXkoIiIsIDApOworCisgICAgLyoqCisgICAgICogU29tZSBOaW1idXNTdHlsZXMgYXJlIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgY29tcG9uZW50IG9ubHkuIEluIE5pbWJ1cywKKyAgICAgKiB0aGlzIGhhcHBlbnMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBoYXMgYXMgYSBjbGllbnQgcHJvcGVydHkgYQorICAgICAqIFVJRGVmYXVsdHMgd2hpY2ggb3ZlcnJpZGVzIChvciBzdXBwbGVtZW50cykgdGhvc2UgZGVmYXVsdHMgZm91bmQgaW4KKyAgICAgKiBVSU1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBKQ29tcG9uZW50IGNvbXBvbmVudDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBOaW1idXNTdHlsZS4gT25seSB0aGUgcHJlZml4IG11c3QgYmUgc3VwcGxpZWQuIEF0IHRoZQorICAgICAqIGFwcHJvcHJpYXRlIHRpbWUsIGluc3RhbGxEZWZhdWx0cyB3aWxsIGJlIGNhbGxlZC4gQXQgdGhhdCBwb2ludCwgYWxsIG9mCisgICAgICogdGhlIHN0YXRlIGluZm9ybWF0aW9uIHdpbGwgYmUgcHVsbGVkIGZyb20gVUlNYW5hZ2VyIGFuZCBzdG9yZWQgbG9jYWxseQorICAgICAqIHdpdGhpbiB0aGlzIHN0eWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBTb21ldGhpbmcgbGlrZSBCdXR0b24gb3IgU2xpZGVyLlRodW1iIG9yCisgICAgICogICAgICAgIG9yZy5qZGVza3RvcC5zd2luZ3guSlhTdGF0dXNCYXIgb3IgQ29tYm9Cb3guIkNvbWJvQm94LmFycm93QnV0dG9uIgorICAgICAqIEBwYXJhbSBjIGFuIG9wdGlvbmFsIHJlZmVyZW5jZSB0byBhIGNvbXBvbmVudCB0aGF0IHRoaXMgTmltYnVzU3R5bGUKKyAgICAgKiAgICAgICAgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgY29tcG9uZW50CisgICAgICogICAgICAgIGhhcyBOaW1idXMgb3ZlcnJpZGVzIHJlZ2lzdGVyZWQgaW4gaXRzIGNsaWVudCBwcm9wZXJ0aWVzIGFuZAorICAgICAqICAgICAgICBzaG91bGQgYmUgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgTmltYnVzU3R5bGUoU3RyaW5nIHByZWZpeCwgSkNvbXBvbmVudCBjKSB7CisgICAgICAgIHRoaXMuY29tcG9uZW50ID0gYzsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgIHRoaXMucGFpbnRlciA9IG5ldyBTeW50aFBhaW50ZXJJbXBsKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICoKKyAgICAgKiBPdmVycmlkZGVuIHRvIGNhdXNlIHRoaXMgc3R5bGUgdG8gcG9wdWxhdGUgaXRzZWxmIHdpdGggZGF0YSBmcm9tCisgICAgICogVUlEZWZhdWx0cywgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBpbnN0YWxsRGVmYXVsdHMoU3ludGhDb250ZXh0IGN0eCkgeworICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIC8vZGVsZWdhdGUgdG8gdGhlIHN1cGVyY2xhc3MgdG8gaW5zdGFsbCBkZWZhdWx0cyBzdWNoIGFzIGJhY2tncm91bmQsCisgICAgICAgIC8vZm9yZWdyb3VuZCwgZm9udCwgYW5kIG9wYXF1ZSBvbnRvIHRoZSBzd2luZyBjb21wb25lbnQuCisgICAgICAgIHN1cGVyLmluc3RhbGxEZWZhdWx0cyhjdHgpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgcGFyc2VQcmVmaXgoU3RyaW5nIGtleSkgeworICAgICAgIGlmIChrZXkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgYm9vbGVhbiBpbnF1b3RlcyA9IGZhbHNlOworICAgICAgIGZvciAoaW50IGk9MDsgaTxrZXkubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICBjaGFyIGMgPSBrZXkuY2hhckF0KGkpOworICAgICAgICAgICBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgICAgICAgIGlucXVvdGVzID0gIWlucXVvdGVzOworICAgICAgICAgICB9IGVsc2UgaWYgKChjID09ICdbJyB8fCBjID09ICcuJykgJiYgIWlucXVvdGVzKSB7CisgICAgICAgICAgICAgICByZXR1cm4ga2V5LnN1YnN0cmluZygwLCBpKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgTmltYnVzTG9va0FuZEZlZWwgd2hlbiB0aGUgbG9vayBhbmQgZmVlbCBpcyBiZWluZyB1bmluc3RhbGxlZC4KKyAgICAgKiBQZXJmb3JtcyBnZW5lcmFsIGNsZWFudXAgb2YgYW55IGFwcC1jb250ZXh0IHNwZWNpZmljIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdW5pbml0aWFsaXplKCkgeworICAgICAgICAvLyBnZXQgdGhlIGFwcGNvbnRleHQgdGhhdCB3ZSd2ZSBzdG9yZWQgZGF0YSBpbgorICAgICAgICBBcHBDb250ZXh0IGN0eCA9IEFwcENvbnRleHQuZ2V0QXBwQ29udGV4dCgpOworCisgICAgICAgIC8vIGdldCB0aGUgcGNsIHN0b3JlZCBpbiBhcHAgY29udGV4dAorICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbCA9IChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQorICAgICAgICAgICAgICAgIGN0eC5nZXQoIk5pbWJ1c1N0eWxlLmRlZmF1bHRzLnBjbCIpOworCisgICAgICAgIC8vIGlmIHRoZSBwY2wgZXhpc3RzLCB1bmluc3RhbGwgaXQgZnJvbSB0aGUgVUlEZWZhdWx0cyB0YWJsZXMKKyAgICAgICAgaWYgKHBjbCAhPSBudWxsKSB7CisgICAgICAgICAgICBVSU1hbmFnZXIuZ2V0RGVmYXVsdHMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBjbCk7CisgICAgICAgICAgICBVSU1hbmFnZXIuZ2V0TG9va0FuZEZlZWxEZWZhdWx0cygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNsZWFyIG91dCB0aGUgY29tcGlsZWQgZGVmYXVsdHMKKyAgICAgICAgY3R4LnB1dCgiTmltYnVzU3R5bGUuZGVmYXVsdHMiLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdWxscyBkYXRhIG91dCBvZiBVSURlZmF1bHRzLCBpZiBpdCBoYXMgbm90IGRvbmUgc28gYWxyZWFkeSwgYW5kIHNldHMKKyAgICAgKiB1cCB0aGUgaW50ZXJuYWwgc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICAvLyBhIG5vbi1udWxsIHZhbHVlcyBvYmplY3QgaXMgdGhlIGZsYWcgd2UgdXNlIHRvIGRldGVybWluZSB3aGV0aGVyCisgICAgICAgIC8vIHRvIHJlcGFyc2UgZnJvbSBVSU1hbmFnZXIuCisgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgIC8vIHJlY29uc3RydWN0IHRoaXMgTmltYnVzU3R5bGUgYmFzZWQgb24gdGhlIGVudHJpZXMgaW4gdGhlIFVJTWFuYWdlcgorICAgICAgICAvLyBhbmQgcG9zc2libHkgYmFzZWQgb24gYW55IG92ZXJyaWRlcyB3aXRoaW4gdGhlIGNvbXBvbmVudCdzCisgICAgICAgIC8vIGNsaWVudCBwcm9wZXJ0aWVzIChhc3N1bWluZyBzdWNoIGEgY29tcG9uZW50IGV4aXN0cyBhbmQgY29udGFpbnMKKyAgICAgICAgLy8gYW55IE5pbWJ1cy5PdmVycmlkZXMpCisgICAgICAgIHZhbHVlcyA9IG5ldyBWYWx1ZXMoKTsKKworICAgICAgICAvLyB0aGUgcHJvZmlsZXIgcmV2ZWFsZWQgdGhhdCBhIGdyZWF0IGRlYWwgb2YgQ1BVIHRpbWUgYW5kIHVzZWxlc3MKKyAgICAgICAgLy8gZ2FyYmFnZSB3YXMgYmVpbmcgcHJvZHVjZWQgYnkgdGhpcyBtZXRob2QgYW5kIHRoZSBpbml0IG1ldGhvZC4gT25lCisgICAgICAgIC8vIGN1bHByaXQgd2FzIHRoZSBjcmVhdGlvbiBhbmQgcmVwYXJzaW5nIG9mIHRoZSBlbnRpcmUgVUlEZWZhdWx0cworICAgICAgICAvLyBtYXAgb24gZWFjaCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdoZXJlICJ2YWx1ZXMiIHdhcyBudWxsLiBJdCB0dXJucworICAgICAgICAvLyBvdXQgdGhpcyB3YXMgaGFwcGVuaW5nIGEgbG90LgorICAgICAgICAvLyBUbyByZW1vdmUgdGhpcyBib3R0bGVuZWNrLCB3ZSBzdG9yZSB0aGUgY29tcGlsZWQgVHJlZU1hcHMgb2YgZGVmYXVsdHMKKyAgICAgICAgLy8gaW4gdGhlIGFwcENvbnRleHQgZm9yIHJldXNlLiBJdCBpcyBudWxsZWQgd2hlbmV2ZXIgdGhlIFVJRGVmYXVsdHMKKyAgICAgICAgLy8gY2hhbmdlcyBhbmQgcmVjb21wdXRlZCB3aGVuIG5lY2Vzc2FyeS4KKyAgICAgICAgZmluYWwgQXBwQ29udGV4dCBjdHggPSBBcHBDb250ZXh0LmdldEFwcENvbnRleHQoKTsKKworICAgICAgICAvLyBmZXRjaCB0aGUgZGVmYXVsdHMgZnJvbSB0aGUgYXBwIGNvbnRleHQuIElmIG51bGwsIHRoZW4gY3JlYXRlIGFuZAorICAgICAgICAvLyBzdG9yZSB0aGUgY29tcGlsZWQgZGVmYXVsdHMKKyAgICAgICAgTWFwPFN0cmluZywgVHJlZU1hcDxTdHJpbmcsIE9iamVjdD4+IGNvbXBpbGVkRGVmYXVsdHMgPQorICAgICAgICAgICAgICAgIChNYXA8U3RyaW5nLCBUcmVlTWFwPFN0cmluZywgT2JqZWN0Pj4pCisgICAgICAgICAgICAgICAgICAgIGN0eC5nZXQoIk5pbWJ1c1N0eWxlLmRlZmF1bHRzIik7CisKKyAgICAgICAgaWYgKGNvbXBpbGVkRGVmYXVsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdGhlIGVudGlyZSBVSURlZmF1bHRzIHRhYmxlcyBhcmUgcGFyc2VkIGFuZCBjb21waWxlZCBpbnRvCisgICAgICAgICAgICAvLyB0aGlzIG1hcCBvZiBtYXBzLiBUaGUga2V5IG9mIHRoZSBjb21waWxlZERlZmF1bHRzIGlzIHRoZQorICAgICAgICAgICAgLy8gcHJlZml4IGZvciBlYWNoIHN0eWxlLCB3aGlsZSB0aGUgdmFsdWUgaXMgYSBtYXAgb2YKKyAgICAgICAgICAgIC8vIGtleXMtPnZhbHVlcyBmb3IgdGhhdCBwcmVmaXguCisgICAgICAgICAgICBjb21waWxlZERlZmF1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmVlTWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKworICAgICAgICAgICAgLy8gZ2V0IGFsbCB0aGUgZGVmYXVsdHMgZnJvbSBVSU1hbmFnZXIuZ2V0RGVmYXVsdHMoKSBhbmQgcHV0IHRoZW0KKyAgICAgICAgICAgIC8vIGludG8gdGhlIGNvbXBpbGVkRGVmYXVsdHMKKyAgICAgICAgICAgIGNvbXBpbGVEZWZhdWx0cyhjb21waWxlZERlZmF1bHRzLCBVSU1hbmFnZXIuZ2V0RGVmYXVsdHMoKSk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgc2Vjb25kIHN0YXRlbWVudCBwdWxscyBkZWZhdWx0cyBmcm9tIHRoZSBsYWYgZGVmYXVsdHMKKyAgICAgICAgICAgIFVJRGVmYXVsdHMgbGFmRGVmYXVsdHMgPSBVSU1hbmFnZXIuZ2V0TG9va0FuZEZlZWxEZWZhdWx0cygpOworICAgICAgICAgICAgY29tcGlsZURlZmF1bHRzKGNvbXBpbGVkRGVmYXVsdHMsIGxhZkRlZmF1bHRzKTsKKworICAgICAgICAgICAgLy8gaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gZG9uZSwgYWRkIGEgbGlzdGVuZXIgdG8gYm90aAorICAgICAgICAgICAgLy8gVUlNYW5hZ2VyLmdldERlZmF1bHRzKCkgYW5kIFVJTWFuYWdlci5nZXRMb29rQW5kRmVlbERlZmF1bHRzKCkuCisgICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbCA9IChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICBjdHguZ2V0KCJOaW1idXNTdHlsZS5kZWZhdWx0cy5wY2wiKTsKKworICAgICAgICAgICAgLy8gaWYgcGNsIGlzIG51bGwsIHRoZW4gaXQgaGFzIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBVSU1hbmFnZXIgZGVmYXVsdHMgZm9yIHRoaXMgYXBwIGNvbnRleHQKKyAgICAgICAgICAgIGlmIChwY2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFBDTCB3aGljaCB3aWxsIHNpbXBseSBjbGVhciBvdXQgdGhlIGNvbXBpbGVkCisgICAgICAgICAgICAgICAgLy8gZGVmYXVsdHMgZnJvbSB0aGUgYXBwIGNvbnRleHQsIGNhdXNpbmcgaXQgdG8gYmUgcmVjb21wdXRlZAorICAgICAgICAgICAgICAgIC8vIG9uIHN1YnNlcXVlbnQgcGFzc2VzCisgICAgICAgICAgICAgICAgcGNsID0gbmV3IERlZmF1bHRzTGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIFBDTCB0byBib3RoIGRlZmF1bHRzIHRhYmxlcyB0aGF0IHdlIHBheSBhdHRlbnRpb24KKyAgICAgICAgICAgICAgICAvLyB0bywgc28gdGhhdCBpZiB0aGUgVUlEZWZhdWx0cyBhcmUgdXBkYXRlZCwgdGhlbiB0aGUKKyAgICAgICAgICAgICAgICAvLyBwcmVjb21waWxlZCBkZWZhdWx0cyB3aWxsIGJlIGNsZWFyZWQgZnJvbSB0aGUgYXBwIGNvbnRleHQKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVjb21wdXRlZCBvbiBzdWJzZXF1ZW50IHBhc3NlcworICAgICAgICAgICAgICAgIFVJTWFuYWdlci5nZXREZWZhdWx0cygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKKyAgICAgICAgICAgICAgICBVSU1hbmFnZXIuZ2V0TG9va0FuZEZlZWxEZWZhdWx0cygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKKyAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBQQ0wgdG8gdGhlIGFwcCBjb250ZXh0IGFzIGEgbWFya2VyIGluZGljYXRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBQQ0wgaGFzIGJlZW4gcmVnaXN0ZXJlZCBzbyB3ZSBkb24ndCBlbmQgdXAgYWRkaW5nCisgICAgICAgICAgICAgICAgLy8gbW9yZSB0aGFuIG9uZSBsaXN0ZW5lciB0byB0aGUgVUlEZWZhdWx0cyB0YWJsZXMuCisgICAgICAgICAgICAgICAgY3R4LnB1dCgiTmltYnVzU3R5bGUuZGVmYXVsdHMucGNsIiwgcGNsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3RvcmUgdGhlIGRlZmF1bHRzIGZvciByZXVzZQorICAgICAgICAgICAgY3R4LnB1dCgiTmltYnVzU3R5bGUuZGVmYXVsdHMiLCBjb21waWxlZERlZmF1bHRzKTsKKyAgICAgICAgfQorCisgICAgICAgIFRyZWVNYXA8U3RyaW5nLCBPYmplY3Q+IGRlZmF1bHRzID0gY29tcGlsZWREZWZhdWx0cy5nZXQocHJlZml4KTsKKworICAgICAgICAvLyBpbnNwZWN0IHRoZSBjbGllbnQgcHJvcGVydGllcyBmb3IgdGhlIGtleSAiTmltYnVzLk92ZXJyaWRlcyIuIElmIHRoZQorICAgICAgICAvLyB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBVSURlZmF1bHRzLCB0aGVuIHRoZXNlIGRlZmF1bHRzIGFyZSB1c2VkCisgICAgICAgIC8vIGluIHBsYWNlIG9mLCBvciBpbiBhZGRpdGlvbiB0bywgdGhlIGRlZmF1bHRzIGluIFVJTWFuYWdlci4KKyAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDbGllbnRQcm9wZXJ0eSgiTmltYnVzLk92ZXJyaWRlcyIpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBVSURlZmF1bHRzKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGkgPSBjb21wb25lbnQuZ2V0Q2xpZW50UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgICAgICAiTmltYnVzLk92ZXJyaWRlcy5Jbmhlcml0RGVmYXVsdHMiKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGluaGVyaXQgPSBpIGluc3RhbmNlb2YgQm9vbGVhbiA/IChCb29sZWFuKWkgOiB0cnVlOworICAgICAgICAgICAgICAgIFVJRGVmYXVsdHMgZCA9IChVSURlZmF1bHRzKW87CisgICAgICAgICAgICAgICAgVHJlZU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogZC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylvYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCBkLmdldChrZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5oZXJpdCkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cy5wdXRBbGwobWFwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cyA9IG1hcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgdGhhdCBJJ3ZlIGFjY3VtdWxhdGVkIGFsbCB0aGUgZGVmYXVsdHMgcGVydGFpbmluZyB0byB0aGlzCisgICAgICAgIC8vIHN0eWxlLCBjYWxsIGluaXQgd2hpY2ggd2lsbCByZWFkIHRoZXNlIGRlZmF1bHRzIGFuZCBjb25maWd1cmUKKyAgICAgICAgLy8gdGhlIGRlZmF1bHQgInZhbHVlcyIuCisgICAgICAgIGluaXQodmFsdWVzLCBkZWZhdWx0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciBhbGwgdGhlIGtleXMgaW4gdGhlIHNwZWNpZmllZCBVSURlZmF1bHRzIGFuZCBjb21waWxlcworICAgICAqIHRob3NlIGtleXMgaW50byB0aGUgY29taWxlZERlZmF1bHRzIGRhdGEgc3RydWN0dXJlLiBJdCByZWxpZXMgb24KKyAgICAgKiBwYXJzaW5nIHRoZSAicHJlZml4IiBvdXQgb2YgdGhlIGtleS4gSWYgdGhlIGtleSBpcyBub3QgYSBTdHJpbmcgb3IgaXMKKyAgICAgKiBudWxsIHRoZW4gaXQgaXMgaWdub3JlZC4gSW4gYWxsIG90aGVyIGNhc2VzIGEgcHJlZml4IGlzIHBhcnNlZCBvdXQKKyAgICAgKiAoZXZlbiBpZiB0aGF0IHByZWZpeCBpcyB0aGUgZW1wdHkgU3RyaW5nIG9yIGlzIGEgImZha2UiIHByZWZpeC4gVGhhdAorICAgICAqIGlzLCBzdXBwb3NlIHlvdSBoYWQgYSBrZXkgRm9vfn5NeVNwZWNpYWwuS2V5VGhpbmd+fi4gSW4gdGhpcyBjYXNlIHRoaXMKKyAgICAgKiBpcyBub3QgYSBOaW1idXMgZm9ybWF0dGVkIGtleSwgYnV0IHdlIGRvbid0IGNhcmUsIHdlIHRyZWF0IGl0IGFzIGlmIGl0CisgICAgICogaXMuIFRoaXMgZG9lc24ndCBwb3NlIGFueSBoYXJtLCBpdCB3aWxsIHNpbXBseSBuZXZlciBiZSB1c2VkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21waWxlZERlZmF1bHRzCisgICAgICogQHBhcmFtIGQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY29tcGlsZURlZmF1bHRzKAorICAgICAgICAgICAgTWFwPFN0cmluZywgVHJlZU1hcDxTdHJpbmcsT2JqZWN0Pj4gY29tcGlsZWREZWZhdWx0cywKKyAgICAgICAgICAgIFVJRGVmYXVsdHMgZCkgeworICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBuZXcgSGFzaFNldChkLmtleVNldCgpKSkgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKW9iajsKKyAgICAgICAgICAgICAgICBTdHJpbmcga3AgPSBwYXJzZVByZWZpeChrZXkpOworICAgICAgICAgICAgICAgIGlmIChrcCA9PSBudWxsKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBUcmVlTWFwPFN0cmluZyxPYmplY3Q+IG1hcCA9IGNvbXBpbGVkRGVmYXVsdHMuZ2V0KGtwKTsKKyAgICAgICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLE9iamVjdD4oKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcGlsZWREZWZhdWx0cy5wdXQoa3AsIG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCBkLmdldChrZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiA8Y29kZT5WYWx1ZXM8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0cworICAgICAqIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gVHJlZU1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2IFRoZSBWYWx1ZXMgb2JqZWN0IHRvIGJlIGluaXRpYWxpemVkCisgICAgICogQHBhcmFtIG15RGVmYXVsdHMgYSBtYXAgb2YgVUlEZWZhdWx0cyB0byB1c2UgaW4gaW5pdGlhbGl6aW5nIHRoZSBWYWx1ZXMuCisgICAgICogICAgICAgIFRoaXMgbWFwIG11c3QgY29udGFpbiBvbmx5IGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU3R5bGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoVmFsdWVzIHYsIFRyZWVNYXA8U3RyaW5nLCBPYmplY3Q+IG15RGVmYXVsdHMpIHsKKyAgICAgICAgLy9hIGxpc3Qgb2YgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBzdGF0ZXMgdXNlZCBieSB0aGlzIHN0eWxlLiBUaGlzCisgICAgICAgIC8vbGlzdCBtYXkgY29udGFpbiBvbmx5ICJzdGFuZGFyZCIgc3RhdGVzICh0aG9zZSBkZWZpbmVkIGJ5IFN5bnRoKSwKKyAgICAgICAgLy9vciBpdCBtYXkgY29udGFpbiBjdXN0b20gc3RhdGVzLCBvciBpdCBtYXkgY29udGFpbiBvbmx5ICJzdGFuZGFyZCIKKyAgICAgICAgLy9zdGF0ZXMgYnV0IGxpc3QgdGhlbSBpbiBhIG5vbi1zdGFuZGFyZCBvcmRlci4KKyAgICAgICAgTGlzdDxTdGF0ZT4gc3RhdGVzID0gbmV3IEFycmF5TGlzdDxTdGF0ZT4oKTsKKyAgICAgICAgLy9hIG1hcCBvZiBzdGF0ZSBuYW1lIHRvIGNvZGUKKyAgICAgICAgTWFwPFN0cmluZyxJbnRlZ2VyPiBzdGF0ZUNvZGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLEludGVnZXI+KCk7CisgICAgICAgIC8vVGhpcyBpcyBhIGxpc3Qgb2YgcnVudGltZSAic3RhdGUiIGNvbnRleHQgb2JqZWN0cy4gVGhlc2UgY29udGFpbgorICAgICAgICAvL3RoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggc3RhdGUuCisgICAgICAgIExpc3Q8UnVudGltZVN0YXRlPiBydW50aW1lU3RhdGVzID0gbmV3IEFycmF5TGlzdDxSdW50aW1lU3RhdGU+KCk7CisKKyAgICAgICAgLy9kZXRlcm1pbmUgd2hldGhlciB0aGVyZSBhcmUgYW55IGN1c3RvbSBzdGF0ZXMsIG9yIGN1c3RvbSBzdGF0ZQorICAgICAgICAvL29yZGVyLiBJZiBzbywgdGhlbiByZWFkIGFsbCB0aG9zZSBjdXN0b20gc3RhdGVzIGFuZCBkZWZpbmUgdGhlCisgICAgICAgIC8vInZhbHVlcyIgc3RhdGVUeXBlcyB0byBiZSBhIG5vbi1udWxsIGFycmF5LgorICAgICAgICAvL090aGVyd2lzZSwgbGV0IHRoZSAidmFsdWVzIiBzdGF0ZVR5cGVzIGJlIG51bGwgdG8gaW5kaWNhdGUgdGhhdAorICAgICAgICAvL3RoZXJlIGFyZSBubyBjdXN0b20gc3RhdGVzIG9yIGN1c3RvbSBzdGF0ZSBvcmRlcmluZworICAgICAgICBTdHJpbmcgc3RhdGVzU3RyaW5nID0gKFN0cmluZylteURlZmF1bHRzLmdldChwcmVmaXggKyAiLlN0YXRlcyIpOworICAgICAgICBpZiAoc3RhdGVzU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBzW10gPSBzdGF0ZXNTdHJpbmcuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc1tpXSA9IHNbaV0udHJpbSgpOworICAgICAgICAgICAgICAgIGlmICghU3RhdGUuaXNTdGFuZGFyZFN0YXRlTmFtZShzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYSBub24tc3RhbmRhcmQgc3RhdGUgbmFtZSwgc28gbG9vayBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vY3VzdG9tIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCBpdAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RhdGVOYW1lID0gcHJlZml4ICsgIi4iICsgc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdGUgY3VzdG9tU3RhdGUgPSAoU3RhdGUpbXlEZWZhdWx0cy5nZXQoc3RhdGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5hZGQoY3VzdG9tU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzLmFkZChTdGF0ZS5nZXRTdGFuZGFyZFN0YXRlKHNbaV0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vaWYgdGhlcmUgd2VyZSBhbnkgc3RhdGVzIGRlZmluZWQsIHRoZW4gc2V0IHRoZSBzdGF0ZVR5cGVzIGFycmF5CisgICAgICAgICAgICAvL3RvIGJlIG5vbi1udWxsLiBPdGhlcndpc2UsIGxlYXZlIGl0IG51bGwgKG1lYW5pbmcsIHVzZSB0aGUKKyAgICAgICAgICAgIC8vc3RhbmRhcmQgc3ludGggc3RhdGVzKS4KKyAgICAgICAgICAgIGlmIChzdGF0ZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHYuc3RhdGVUeXBlcyA9IHN0YXRlcy50b0FycmF5KG5ldyBTdGF0ZVtzdGF0ZXMuc2l6ZSgpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vYXNzaWduIGNvZGVzIGZvciBlYWNoIG9mIHRoZSBzdGF0ZSB0eXBlcworICAgICAgICAgICAgaW50IGNvZGUgPSAxOworICAgICAgICAgICAgZm9yIChTdGF0ZSBzdGF0ZSA6IHN0YXRlcykgeworICAgICAgICAgICAgICAgIHN0YXRlQ29kZXMucHV0KHN0YXRlLmdldE5hbWUoKSwgY29kZSk7CisgICAgICAgICAgICAgICAgY29kZSA8PD0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vc2luY2UgdGhlcmUgd2VyZSBubyBjdXN0b20gc3RhdGVzIGRlZmluZWQsIHNldHVwIHRoZSBsaXN0IG9mCisgICAgICAgICAgICAvL3N0YW5kYXJkIHN5bnRoIHN0YXRlcy4gTm90ZSB0aGF0IHRoZSAidi5zdGF0ZVR5cGVzIiBpcyBub3QKKyAgICAgICAgICAgIC8vYmVpbmcgc2V0IGhlcmUsIGluZGljYXRpbmcgdGhhdCBhdCBydW50aW1lIHRoZSBzdGF0ZSBzZWxlY3Rpb24KKyAgICAgICAgICAgIC8vcm91dGluZXMgc2hvdWxkIHVzZSBzdGFuZGFyZCBzeW50aCBzdGF0ZXMgaW5zdGVhZCBvZiBjdXN0b20KKyAgICAgICAgICAgIC8vc3RhdGVzLiBJIGRvIG5lZWQgdG8gcG9wdXBsYXRlIHRoaXMgdGVtcCBsaXN0IG5vdyB0aG91Z2gsIHNvIHRoYXQKKyAgICAgICAgICAgIC8vdGhlIHJlbWFpbmRlciBvZiB0aGlzIG1ldGhvZCB3aWxsIGZ1bmN0aW9uIGFzIGV4cGVjdGVkLgorICAgICAgICAgICAgc3RhdGVzLmFkZChTdGF0ZS5FbmFibGVkKTsKKyAgICAgICAgICAgIHN0YXRlcy5hZGQoU3RhdGUuTW91c2VPdmVyKTsKKyAgICAgICAgICAgIHN0YXRlcy5hZGQoU3RhdGUuUHJlc3NlZCk7CisgICAgICAgICAgICBzdGF0ZXMuYWRkKFN0YXRlLkRpc2FibGVkKTsKKyAgICAgICAgICAgIHN0YXRlcy5hZGQoU3RhdGUuRm9jdXNlZCk7CisgICAgICAgICAgICBzdGF0ZXMuYWRkKFN0YXRlLlNlbGVjdGVkKTsKKyAgICAgICAgICAgIHN0YXRlcy5hZGQoU3RhdGUuRGVmYXVsdCk7CisKKyAgICAgICAgICAgIC8vYXNzaWduIGNvZGVzIGZvciB0aGUgc3RhdGVzCisgICAgICAgICAgICBzdGF0ZUNvZGVzLnB1dCgiRW5hYmxlZCIsIEVOQUJMRUQpOworICAgICAgICAgICAgc3RhdGVDb2Rlcy5wdXQoIk1vdXNlT3ZlciIsIE1PVVNFX09WRVIpOworICAgICAgICAgICAgc3RhdGVDb2Rlcy5wdXQoIlByZXNzZWQiLCBQUkVTU0VEKTsKKyAgICAgICAgICAgIHN0YXRlQ29kZXMucHV0KCJEaXNhYmxlZCIsIERJU0FCTEVEKTsKKyAgICAgICAgICAgIHN0YXRlQ29kZXMucHV0KCJGb2N1c2VkIiwgRk9DVVNFRCk7CisgICAgICAgICAgICBzdGF0ZUNvZGVzLnB1dCgiU2VsZWN0ZWQiLCBTRUxFQ1RFRCk7CisgICAgICAgICAgICBzdGF0ZUNvZGVzLnB1dCgiRGVmYXVsdCIsIERFRkFVTFQpOworICAgICAgICB9CisKKyAgICAgICAgLy9Ob3cgaXRlcmF0ZSBvdmVyIGFsbCB0aGUga2V5cyBpbiB0aGUgZGVmYXVsdHMgdGFibGUKKyAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbXlEZWZhdWx0cy5rZXlTZXQoKSkgeworICAgICAgICAgICAgLy9UaGUga2V5IGlzIHNvbWV0aGluZyBsaWtlIEpCdXR0b24uRW5hYmxlZC5iYWNrZ3JvdW5kUGFpbnRlciwKKyAgICAgICAgICAgIC8vb3IgSkJ1dHRvbi5TdGF0ZXMsIG9yIEpCdXR0b24uYmFja2dyb3VuZC4KKyAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSAiSkJ1dHRvbi4iIHBvcnRpb24gb2YgdGhlIGtleQorICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7CisgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGEgIiBvciA6IHRoZW4gd2Ugc2tpcCBpdCBiZWNhdXNlIGl0IGlzIGEgc3VicmVnaW9uCisgICAgICAgICAgICAvL29mIHNvbWUga2luZAorICAgICAgICAgICAgaWYgKHRlbXAuaW5kZXhPZignIicpICE9IC0xIHx8IHRlbXAuaW5kZXhPZignOicpICE9IC0xKSBjb250aW51ZTsKKyAgICAgICAgICAgIC8vcmVtb3ZlIHRoZSBzZXBhcmF0b3IKKyAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIC8vQXQgdGhpcyBwb2ludCwgdGVtcCBtYXkgYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAvL2JhY2tncm91bmQKKyAgICAgICAgICAgIC8vW0VuYWJsZWRdLmJhY2tncm91bmQKKyAgICAgICAgICAgIC8vW0VuYWJsZWQrTW91c2VPdmVyXS5iYWNrZ3JvdW5kCisgICAgICAgICAgICAvL3Byb3BlcnR5LmZvbworCisgICAgICAgICAgICAvL3BhcnNlIG91dCB0aGUgc3RhdGVzIGFuZCB0aGUgcHJvcGVydHkKKyAgICAgICAgICAgIFN0cmluZyBzdGF0ZVN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBudWxsOworICAgICAgICAgICAgaW50IGJyYWNrZXRJbmRleCA9IHRlbXAuaW5kZXhPZignXScpOworICAgICAgICAgICAgaWYgKGJyYWNrZXRJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAvL3RoZXJlIGlzIG5vdCBhIHN0YXRlIHN0cmluZywgc28gcHJvcGVydHkgPSB0ZW1wCisgICAgICAgICAgICAgICAgcHJvcGVydHkgPSB0ZW1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0ZVN0cmluZyA9IHRlbXAuc3Vic3RyaW5nKDAsIGJyYWNrZXRJbmRleCk7CisgICAgICAgICAgICAgICAgcHJvcGVydHkgPSB0ZW1wLnN1YnN0cmluZyhicmFja2V0SW5kZXggKyAyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9ub3cgdGhhdCBJIGhhdmUgdGhlIHN0YXRlIChpZiBhbnkpIGFuZCB0aGUgcHJvcGVydHksIGdldCB0aGUKKyAgICAgICAgICAgIC8vdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgYW5kIGluc3RhbGwgaXQgd2hlcmUgaXQgYmVsb25ncworICAgICAgICAgICAgaWYgKHN0YXRlU3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvL3RoZXJlIHdhcyBubyBzdGF0ZSwganVzdCBhIHByb3BlcnR5LiBDaGVjayBmb3IgdGhlIGN1c3RvbQorICAgICAgICAgICAgICAgIC8vImNvbnRlbnRNYXJnaW5zIiBwcm9wZXJ0eSAod2hpY2ggaXMgaGFuZGxlZCBzcGVjaWFsbHkgYnkKKyAgICAgICAgICAgICAgICAvL1N5bnRoL05pbWJ1cykuIEFsc28gY2hlY2sgZm9yIHRoZSBwcm9wZXJ0eSBiZWluZyAiU3RhdGVzIiwKKyAgICAgICAgICAgICAgICAvL2luIHdoaWNoIGNhc2UgaXQgaXMgbm90IGEgcmVhbCBwcm9wZXJ0eSBhbmQgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICAgICAgICAgICAgLy9vdGhlcndpc2UsIGFzc3VtZSBpdCBpcyBhIHByb3BlcnR5IGFuZCBpbnN0YWxsIGl0IG9uIHRoZQorICAgICAgICAgICAgICAgIC8vdmFsdWVzIG9iamVjdAorICAgICAgICAgICAgICAgIGlmICgiY29udGVudE1hcmdpbnMiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdi5jb250ZW50TWFyZ2lucyA9IChJbnNldHMpbXlEZWZhdWx0cy5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJTdGF0ZXMiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2LmRlZmF1bHRzLnB1dChwcm9wZXJ0eSwgbXlEZWZhdWx0cy5nZXQoa2V5KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL2l0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGRldmVsb3BlciBoYXMgYSBtYWxmb3JtZWQgVUlEZWZhdWx0cworICAgICAgICAgICAgICAgIC8vZW50cnksIHN1Y2ggdGhhdCBzb21ldGhpbmcgd2FzIHNwZWNpZmllZCBpbiB0aGUgcGxhY2Ugb2YKKyAgICAgICAgICAgICAgICAvL3RoZSBTdGF0ZSBwb3J0aW9uIG9mIHRoZSBrZXkgYnV0IGl0IHdhc24ndCBhIHN0YXRlLiBJbiB0aGlzCisgICAgICAgICAgICAgICAgLy9jYXNlLCBza2lwIHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgICAgICAgICAgICBib29sZWFuIHNraXAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvL3RoaXMgdmFyaWFibGUga2VlcHMgdHJhY2sgb2YgdGhlIGludCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICAgICAgICAvL3RoZSBzdGF0ZS4gU2VlIFN5bnRoU3RhdGUgZm9yIGRldGFpbHMuCisgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudFN0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAvL011bHRpcGxlIHN0YXRlcyBtYXkgYmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcsIHN1Y2ggYXMKKyAgICAgICAgICAgICAgICAvL0VuYWJsZWQrTW91c2VPdmVyCisgICAgICAgICAgICAgICAgU3RyaW5nW10gc3RhdGVQYXJ0cyA9IHN0YXRlU3RyaW5nLnNwbGl0KCJcXCsiKTsKKyAgICAgICAgICAgICAgICAvL0ZvciBlYWNoIHN0YXRlLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIFN0YXRlIG9iamVjdCBhc3NvY2lhdGVkCisgICAgICAgICAgICAgICAgLy93aXRoIGl0LCBvciBza2lwIGl0IGlmIGl0IGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogc3RhdGVQYXJ0cykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVDb2Rlcy5jb250YWluc0tleShzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGUgfD0gc3RhdGVDb2Rlcy5nZXQocyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1dhcyBub3QgYSBzdGF0ZS4gTWF5YmUgaXQgd2FzIGEgc3VicmVnaW9uIG9yIHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy9za2lwIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChza2lwKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vZmluZCB0aGUgUnVudGltZVN0YXRlIGZvciB0aGlzIFN0YXRlCisgICAgICAgICAgICAgICAgUnVudGltZVN0YXRlIHJzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKFJ1bnRpbWVTdGF0ZSBzIDogcnVudGltZVN0YXRlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAocy5zdGF0ZSA9PSBjb21wb25lbnRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcnMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL2NvdWxkbid0IGZpbmQgdGhlIHJ1bnRpbWUgc3RhdGUsIHNvIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICAgICAgICAgICAgICBpZiAocnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBycyA9IG5ldyBSdW50aW1lU3RhdGUoY29tcG9uZW50U3RhdGUsIHN0YXRlU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgcnVudGltZVN0YXRlcy5hZGQocnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vY2hlY2sgZm9yIGEgY291cGxlIHNwZWNpYWwgcHJvcGVydGllcywgc3VjaCBhcyBmb3IgdGhlCisgICAgICAgICAgICAgICAgLy9wYWludGVycy4gSWYgdGhlc2UgYXJlIGZvdW5kLCB0aGVuIHNldCB0aGUgc3BlY2lhbGx5IG9uCisgICAgICAgICAgICAgICAgLy90aGUgcnVudGltZSBzdGF0ZS4gRWxzZSwgaXQgaXMganVzdCBhIG5vcm1hbCBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAvL3NvIHB1dCBpdCBpbiB0aGUgVUlEZWZhdWx0cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBydW50aW1lCisgICAgICAgICAgICAgICAgLy9zdGF0ZQorICAgICAgICAgICAgICAgIGlmICgiYmFja2dyb3VuZFBhaW50ZXIiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMuYmFja2dyb3VuZFBhaW50ZXIgPSAoUGFpbnRlcilteURlZmF1bHRzLmdldChrZXkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImZvcmVncm91bmRQYWludGVyIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmZvcmVncm91bmRQYWludGVyID0gKFBhaW50ZXIpIG15RGVmYXVsdHMuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiYm9yZGVyUGFpbnRlciIuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgICAgICAgICBycy5ib3JkZXJQYWludGVyID0gKFBhaW50ZXIpIG15RGVmYXVsdHMuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcnMuZGVmYXVsdHMucHV0KHByb3BlcnR5LCBteURlZmF1bHRzLmdldChrZXkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL25vdyB0aGF0IEkndmUgY29sbGVjdGVkIGFsbCB0aGUgcnVudGltZSBzdGF0ZXMsIEknbGwgc29ydCB0aGVtIGJhc2VkCisgICAgICAgIC8vb24gdGhlaXIgaW50ZWdlciAic3RhdGUiIChzZWUgU3ludGhTdGF0ZSBmb3IgaG93IHRoaXMgd29ya3MpLgorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJ1bnRpbWVTdGF0ZXMsIFNUQVRFX0NPTVBBUkFUT1IpOworCisgICAgICAgIC8vZmluYWxseSwgc2V0IHRoZSBhcnJheSBvZiBydW50aW1lIHN0YXRlcyBvbiB0aGUgdmFsdWVzIG9iamVjdAorICAgICAgICB2LnN0YXRlcyA9IHJ1bnRpbWVTdGF0ZXMudG9BcnJheShuZXcgUnVudGltZVN0YXRlW3J1bnRpbWVTdGF0ZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKgorICAgICAqIE92ZXJyaWRkZW4gdG8gY2F1c2UgdGhpcyBzdHlsZSB0byBwb3B1bGF0ZSBpdHNlbGYgd2l0aCBkYXRhIGZyb20KKyAgICAgKiBVSURlZmF1bHRzLCBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyBJbnNldHMgZ2V0SW5zZXRzKFN5bnRoQ29udGV4dCBjdHgsIEluc2V0cyBpbikgeworICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgaW4gPSBuZXcgSW5zZXRzKDAsIDAsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgVmFsdWVzIHYgPSBnZXRWYWx1ZXMoY3R4KTsKKworICAgICAgICBpZiAodi5jb250ZW50TWFyZ2lucyA9PSBudWxsKSB7CisgICAgICAgICAgICBpbi5ib3R0b20gPSBpbi50b3AgPSBpbi5sZWZ0ID0gaW4ucmlnaHQgPSAwOworICAgICAgICAgICAgcmV0dXJuIGluOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW4uYm90dG9tID0gdi5jb250ZW50TWFyZ2lucy5ib3R0b207CisgICAgICAgICAgICBpbi50b3AgPSB2LmNvbnRlbnRNYXJnaW5zLnRvcDsKKyAgICAgICAgICAgIGluLmxlZnQgPSB2LmNvbnRlbnRNYXJnaW5zLmxlZnQ7CisgICAgICAgICAgICBpbi5yaWdodCA9IHYuY29udGVudE1hcmdpbnMucmlnaHQ7CisgICAgICAgICAgICAvLyBBY2NvdW50IGZvciBzY2FsZQorICAgICAgICAgICAgLy8gVGhlIGtleSAiSkNvbXBvbmVudC5zaXplVmFyaWFudCIgaXMgdXNlZCB0byBtYXRjaCBBcHBsZSdzIExBRgorICAgICAgICAgICAgU3RyaW5nIHNjYWxlS2V5ID0gKFN0cmluZyljdHguZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgICJKQ29tcG9uZW50LnNpemVWYXJpYW50Iik7CisgICAgICAgICAgICBpZiAoc2NhbGVLZXkgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgaWYgKExBUkdFX0tFWS5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICAgICAgaW4uYm90dG9tICo9IExBUkdFX1NDQUxFOworICAgICAgICAgICAgICAgICAgICBpbi50b3AgKj0gTEFSR0VfU0NBTEU7CisgICAgICAgICAgICAgICAgICAgIGluLmxlZnQgKj0gTEFSR0VfU0NBTEU7CisgICAgICAgICAgICAgICAgICAgIGluLnJpZ2h0ICo9IExBUkdFX1NDQUxFOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU01BTExfS0VZLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgICAgICBpbi5ib3R0b20gKj0gU01BTExfU0NBTEU7CisgICAgICAgICAgICAgICAgICAgIGluLnRvcCAqPSBTTUFMTF9TQ0FMRTsKKyAgICAgICAgICAgICAgICAgICAgaW4ubGVmdCAqPSBTTUFMTF9TQ0FMRTsKKyAgICAgICAgICAgICAgICAgICAgaW4ucmlnaHQgKj0gU01BTExfU0NBTEU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNSU5JX0tFWS5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICAgICAgaW4uYm90dG9tICo9IE1JTklfU0NBTEU7CisgICAgICAgICAgICAgICAgICAgIGluLnRvcCAqPSBNSU5JX1NDQUxFOworICAgICAgICAgICAgICAgICAgICBpbi5sZWZ0ICo9IE1JTklfU0NBTEU7CisgICAgICAgICAgICAgICAgICAgIGluLnJpZ2h0ICo9IE1JTklfU0NBTEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGluOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRkZW4gdG8gY2F1c2UgdGhpcyBzdHlsZSB0byBwb3B1bGF0ZSBpdHNlbGYgd2l0aCBkYXRhIGZyb20KKyAgICAgKiBVSURlZmF1bHRzLCBpZiBuZWNlc3NhcnkuPC9wPgorICAgICAqCisgICAgICogPHA+SW4gYWRkaXRpb24sIE5pbWJ1c1N0eWxlIGhhbmRsZXMgQ29sb3JUeXBlcyBzbGlnaHRseSBkaWZmZXJlbnRseSBmcm9tCisgICAgICogU3ludGguPC9wPgorICAgICAqIDx1bD4KKyAgICAgKiAgPGxpPkNvbG9yVHlwZS5CQUNLR1JPVU5EIHdpbGwgZXF1YXRlIHRvIHRoZSBjb2xvciBzdG9yZWQgaW4gVUlEZWZhdWx0cworICAgICAqICAgICAgbmFtZWQgImJhY2tncm91bmQiLjwvbGk+CisgICAgICogIDxsaT5Db2xvclR5cGUuVEVYVF9CQUNLR1JPVU5EIHdpbGwgZXF1YXRlIHRvIHRoZSBjb2xvciBzdG9yZWQgaW4KKyAgICAgKiAgICAgIFVJRGVmYXVsdHMgbmFtZWQgInRleHRCYWNrZ3JvdW5kIi48L2xpPgorICAgICAqICA8bGk+Q29sb3JUeXBlLkZPUkVHUk9VTkQgd2lsbCBlcXVhdGUgdG8gdGhlIGNvbG9yIHN0b3JlZCBpbiBVSURlZmF1bHRzCisgICAgICogICAgICBuYW1lZCAidGV4dEZvcmVncm91bmQiLjwvbGk+CisgICAgICogIDxsaT5Db2xvclR5cGUuVEVYVF9GT1JFR1JPVU5EIHdpbGwgZXF1YXRlIHRvIHRoZSBjb2xvciBzdG9yZWQgaW4KKyAgICAgKiAgICAgIFVJRGVmYXVsdHMgbmFtZWQgInRleHRGb3JlZ3JvdW5kIi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCBDb2xvciBnZXRDb2xvckZvclN0YXRlKFN5bnRoQ29udGV4dCBjdHgsIENvbG9yVHlwZSB0eXBlKSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBudWxsOworICAgICAgICBpZiAodHlwZSA9PSBDb2xvclR5cGUuQkFDS0dST1VORCkgeworICAgICAgICAgICAga2V5ID0gImJhY2tncm91bmQiOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ29sb3JUeXBlLkZPUkVHUk9VTkQpIHsKKyAgICAgICAgICAgIC8vbWFwIEZPUkVHUk9VTkQgYXMgVEVYVF9GT1JFR1JPVU5ECisgICAgICAgICAgICBrZXkgPSAidGV4dEZvcmVncm91bmQiOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ29sb3JUeXBlLlRFWFRfQkFDS0dST1VORCkgeworICAgICAgICAgICAga2V5ID0gInRleHRCYWNrZ3JvdW5kIjsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENvbG9yVHlwZS5URVhUX0ZPUkVHUk9VTkQpIHsKKyAgICAgICAgICAgIGtleSA9ICJ0ZXh0Rm9yZWdyb3VuZCI7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBDb2xvclR5cGUuRk9DVVMpIHsKKyAgICAgICAgICAgIGtleSA9ICJmb2N1cyI7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBrZXkgPSB0eXBlLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9DT0xPUjsKKyAgICAgICAgfQorICAgICAgICBDb2xvciBjID0gKENvbG9yKSBnZXQoY3R4LCBrZXkpOworICAgICAgICAvL2lmIGFsbCBlbHNlIGZhaWxzLCByZXR1cm4gYSBkZWZhdWx0IGNvbG9yICh3aGljaCBpcyBhIENvbG9yVUlSZXNvdXJjZSkKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgYyA9IERFRkFVTFRfQ09MT1I7CisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICoKKyAgICAgKiBPdmVycmlkZGVuIHRvIGNhdXNlIHRoaXMgc3R5bGUgdG8gcG9wdWxhdGUgaXRzZWxmIHdpdGggZGF0YSBmcm9tCisgICAgICogVUlEZWZhdWx0cywgaWYgbmVjZXNzYXJ5LiBJZiBhIHZhbHVlIG5hbWVkICJmb250IiBpcyBub3QgZm91bmQgaW4KKyAgICAgKiBVSURlZmF1bHRzLCB0aGVuIHRoZSAiZGVmYXVsdEZvbnQiIGZvbnQgaW4gVUlEZWZhdWx0cyB3aWxsIGJlIHJldHVybmVkCisgICAgICogaW5zdGVhZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIEZvbnQgZ2V0Rm9udEZvclN0YXRlKFN5bnRoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgRm9udCBmID0gKEZvbnQpZ2V0KGN0eCwgImZvbnQiKTsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgZiA9IFVJTWFuYWdlci5nZXRGb250KCJkZWZhdWx0Rm9udCIpOworCisgICAgICAgIC8vIEFjY291bnQgZm9yIHNjYWxlCisgICAgICAgIC8vIFRoZSBrZXkgIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiIGlzIHVzZWQgdG8gbWF0Y2ggQXBwbGUncyBMQUYKKyAgICAgICAgU3RyaW5nIHNjYWxlS2V5ID0gKFN0cmluZyljdHguZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50UHJvcGVydHkoCisgICAgICAgICAgICAgICAgIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiKTsKKyAgICAgICAgaWYgKHNjYWxlS2V5ICE9IG51bGwpeworICAgICAgICAgICAgaWYgKExBUkdFX0tFWS5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICBmID0gZi5kZXJpdmVGb250KE1hdGgucm91bmQoZi5nZXRTaXplMkQoKSpMQVJHRV9TQ0FMRSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChTTUFMTF9LRVkuZXF1YWxzKHNjYWxlS2V5KSl7CisgICAgICAgICAgICAgICAgZiA9IGYuZGVyaXZlRm9udChNYXRoLnJvdW5kKGYuZ2V0U2l6ZTJEKCkqU01BTExfU0NBTEUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTUlOSV9LRVkuZXF1YWxzKHNjYWxlS2V5KSl7CisgICAgICAgICAgICAgICAgZiA9IGYuZGVyaXZlRm9udChNYXRoLnJvdW5kKGYuZ2V0U2l6ZTJEKCkqTUlOSV9TQ0FMRSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBTeW50aFBhaW50ZXIgZm9yIHRoaXMgc3R5bGUsIHdoaWNoIGVuZHMgdXAgZGVsZWdhdGluZyB0bworICAgICAqIHRoZSBQYWludGVycyBpbnN0YWxsZWQgaW4gdGhpcyBzdHlsZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgcHVibGljIFN5bnRoUGFpbnRlciBnZXRQYWludGVyKFN5bnRoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgcmV0dXJuIHBhaW50ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKgorICAgICAqIE92ZXJyaWRkZW4gdG8gY2F1c2UgdGhpcyBzdHlsZSB0byBwb3B1bGF0ZSBpdHNlbGYgd2l0aCBkYXRhIGZyb20KKyAgICAgKiBVSURlZmF1bHRzLCBpZiBuZWNlc3NhcnkuIElmIG9wYWNpdHkgaXMgbm90IHNwZWNpZmllZCBpbiBVSSBkZWZhdWx0cywKKyAgICAgKiB0aGVuIGl0IGRlZmF1bHRzIHRvIGJlaW5nIG5vbi1vcGFxdWUuCisgICAgICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGlzT3BhcXVlKFN5bnRoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgLy8gRm9yY2UgVGFibGUgQ2VsbFJlbmRlcmVycyB0byBiZSBvcGFxdWUKKyAgICAgICAgaWYgKCJUYWJsZS5jZWxsUmVuZGVyZXIiLmVxdWFscyhjdHguZ2V0Q29tcG9uZW50KCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQm9vbGVhbiBvcGFxdWUgPSAoQm9vbGVhbilnZXQoY3R4LCAib3BhcXVlIik7CisgICAgICAgIHJldHVybiBvcGFxdWUgPT0gbnVsbCA/IGZhbHNlIDogb3BhcXVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICoKKyAgICAgKiA8cD5PdmVycmlkZGVuIHRvIGNhdXNlIHRoaXMgc3R5bGUgdG8gcG9wdWxhdGUgaXRzZWxmIHdpdGggZGF0YSBmcm9tCisgICAgICogVUlEZWZhdWx0cywgaWYgbmVjZXNzYXJ5LjwvcD4KKyAgICAgKgorICAgICAqIDxwPlByb3BlcnRpZXMgaW4gVUlEZWZhdWx0cyBtYXkgYmUgc3BlY2lmaWVkIGluIGEgY2hhaW5lZCBtYW5uZXIuIEZvcgorICAgICAqIGV4YW1wbGU6CisgICAgICogPHByZT4KKyAgICAgKiBiYWNrZ3JvdW5kCisgICAgICogQnV0dG9uLm9wYWNpdHkKKyAgICAgKiBCdXR0b24uRW5hYmxlZC5mb3JlZ3JvdW5kCisgICAgICogQnV0dG9uLkVuYWJsZWQrU2VsZWN0ZWQuYmFja2dyb3VuZAorICAgICAqIDwvcHJlPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkluIHRoaXMgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2VyZSBpbiB0aGUgRW5hYmxlZCtTZWxlY3RlZCBzdGF0ZSBhbmQKKyAgICAgKiBzZWFyY2hlZCBmb3IgImZvcmVncm91bmQiLiBJbiB0aGlzIGNhc2UsIHdlIGZpcnN0IGNoZWNrIGZvcgorICAgICAqIEJ1dHRvbi5FbmFibGVkK1NlbGVjdGVkLmZvcmVncm91bmQsIGJ1dCBubyBzdWNoIGNvbG9yIGV4aXN0cy4gV2UgdGhlbgorICAgICAqIGZhbGwgYmFjayB0byB0aGUgbmV4dCB2YWxpZCBzdGF0ZSwgaW4gdGhpcyBjYXNlLAorICAgICAqIEJ1dHRvbi5FbmFibGVkLmZvcmVncm91bmQsIGFuZCBoYXZlIGEgbWF0Y2guIFNvIHdlIHJldHVybiBpdC48L3A+CisgICAgICoKKyAgICAgKiA8cD5BZ2FpbiwgaWYgd2Ugd2VyZSBpbiB0aGUgc3RhdGUgRW5hYmxlZCBhbmQgbG9va2VkIGZvciAiYmFja2dyb3VuZCIsIHdlCisgICAgICogd291bGRuJ3QgZmluZCBpdCBpbiBCdXR0b24uRW5hYmxlZCwgb3IgaW4gQnV0dG9uLCBidXQgd291bGQgYXQgdGhlIHRvcAorICAgICAqIGxldmVsIGluIFVJTWFuYWdlci4gU28gd2UgcmV0dXJuIHRoYXQgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogPHA+T25lIHNwZWNpYWwgbm90ZTogdGhlICJrZXkiIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBjb3VsZCBiZSBvZiB0aGUgZm9ybQorICAgICAqICJiYWNrZ3JvdW5kIiBvciAiQnV0dG9uLmJhY2tncm91bmQiIHdoZXJlICJCdXR0b24iIGVxdWFscyB0aGUgcHJlZml4CisgICAgICogcGFzc2VkIHRvIHRoZSBOaW1idXNTdHlsZSBjb25zdHJ1Y3Rvci4gSW4gZWl0aGVyIGNhc2UsIGl0IGxvb2tzIGZvcgorICAgICAqICJiYWNrZ3JvdW5kIi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4CisgICAgICogQHBhcmFtIGtleSBtdXN0IG5vdCBiZSBudWxsCisgICAgICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyBPYmplY3QgZ2V0KFN5bnRoQ29udGV4dCBjdHgsIE9iamVjdCBrZXkpIHsKKyAgICAgICAgVmFsdWVzIHYgPSBnZXRWYWx1ZXMoY3R4KTsKKworICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHByZWZpeCwgaWYgdGhlcmUgaXMgb25lLgorICAgICAgICBTdHJpbmcgZnVsbEtleSA9IGtleS50b1N0cmluZygpOworICAgICAgICBTdHJpbmcgcGFydGlhbEtleSA9IGZ1bGxLZXkuc3Vic3RyaW5nKGZ1bGxLZXkuaW5kZXhPZigiLiIpICsgMSk7CisKKyAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7CisgICAgICAgIGludCB4c3RhdGUgPSBnZXRFeHRlbmRlZFN0YXRlKGN0eCwgdik7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGNhY2hlCisgICAgICAgIHRtcEtleS5pbml0KHBhcnRpYWxLZXksIHhzdGF0ZSk7CisgICAgICAgIG9iaiA9IHYuY2FjaGUuZ2V0KHRtcEtleSk7CisgICAgICAgIGJvb2xlYW4gd2FzSW5DYWNoZSA9IG9iaiAhPSBudWxsOworICAgICAgICBpZiAoIXdhc0luQ2FjaGUpeworICAgICAgICAgICAgLy8gU2VhcmNoIGV4YWN0IG1hdGNoaW5nIHN0YXRlcyBhbmQgdGhlbiBsZXNzZXIgbWF0Y2hpbmcgc3RhdGVzCisgICAgICAgICAgICBSdW50aW1lU3RhdGUgcyA9IG51bGw7CisgICAgICAgICAgICBpbnRbXSBsYXN0SW5kZXggPSBuZXcgaW50W10gey0xfTsKKyAgICAgICAgICAgIHdoaWxlIChvYmogPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAocyA9IGdldE5leHRTdGF0ZSh2LnN0YXRlcywgbGFzdEluZGV4LCB4c3RhdGUpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb2JqID0gcy5kZWZhdWx0cy5nZXQocGFydGlhbEtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTZWFyY2ggUmVnaW9uIERlZmF1bHRzCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwgJiYgdi5kZWZhdWx0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb2JqID0gdi5kZWZhdWx0cy5nZXQocGFydGlhbEtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZXR1cm4gZm91bmQgb2JqZWN0CisgICAgICAgICAgICAvLyBTZWFyY2ggVUlNYW5hZ2VyIERlZmF1bHRzCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIG9iaiA9IFVJTWFuYWdlci5nZXQoZnVsbEtleSk7CisgICAgICAgICAgICAvLyBTZWFyY2ggU3ludGggRGVmYXVsdHMgZm9yIElucHV0TWFwcworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsICYmIHBhcnRpYWxLZXkuZXF1YWxzKCJmb2N1c0lucHV0TWFwIikpIHsKKyAgICAgICAgICAgICAgICBvYmogPSBzdXBlci5nZXQoY3R4LCBmdWxsS2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIGFsbCB3ZSBnb3Qgd2FzIGEgbnVsbCwgc3RvcmUgdGhpcyBmYWN0IGZvciBsYXRlciB1c2UKKyAgICAgICAgICAgIHYuY2FjaGUucHV0KG5ldyBDYWNoZUtleShwYXJ0aWFsS2V5LCB4c3RhdGUpLAorICAgICAgICAgICAgICAgICAgICBvYmogPT0gbnVsbCA/IE5VTEwgOiBvYmopOworICAgICAgICB9CisgICAgICAgIC8vIHJldHVybiBmb3VuZCBvYmplY3QKKyAgICAgICAgcmV0dXJuIG9iaiA9PSBOVUxMID8gbnVsbCA6IG9iajsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBiYWNrZ3JvdW5kIFBhaW50ZXIsIGlmIHRoZXJlIGlzIG9uZSwgZm9yIHRoZSBzdGF0ZQorICAgICAqIHNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gU3ludGhDb250ZXh0LiBUaGlzIG1ldGhvZCBkb2VzIGFwcHJvcHJpYXRlCisgICAgICogZmFsbGJhY2sgc2VhcmNoaW5nLCBhcyBkZXNjcmliZWQgaW4gI2dldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdHggVGhlIFN5bnRoQ29udGV4dC4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFRoZSBiYWNrZ3JvdW5kIHBhaW50ZXIgYXNzb2NpYXRlZCBmb3IgdGhlIGdpdmVuIHN0YXRlLCBvciBudWxsIGlmCisgICAgICogbm9uZSBjb3VsZCBiZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFpbnRlciBnZXRCYWNrZ3JvdW5kUGFpbnRlcihTeW50aENvbnRleHQgY3R4KSB7CisgICAgICAgIFZhbHVlcyB2ID0gZ2V0VmFsdWVzKGN0eCk7CisgICAgICAgIGludCB4c3RhdGUgPSBnZXRFeHRlbmRlZFN0YXRlKGN0eCwgdik7CisgICAgICAgIFBhaW50ZXIgcCA9IG51bGw7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGNhY2hlCisgICAgICAgIHRtcEtleS5pbml0KCJiYWNrZ3JvdW5kUGFpbnRlciQkaW5zdGFuY2UiLCB4c3RhdGUpOworICAgICAgICBwID0gKFBhaW50ZXIpdi5jYWNoZS5nZXQodG1wS2V5KTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgcmV0dXJuIHA7CisKKyAgICAgICAgLy8gbm90IGluIGNhY2hlLCBzbyBsb29rdXAgYW5kIHN0b3JlIGluIGNhY2hlCisgICAgICAgIFJ1bnRpbWVTdGF0ZSBzID0gbnVsbDsKKyAgICAgICAgaW50W10gbGFzdEluZGV4ID0gbmV3IGludFtdIHstMX07CisgICAgICAgIHdoaWxlICgocyA9IGdldE5leHRTdGF0ZSh2LnN0YXRlcywgbGFzdEluZGV4LCB4c3RhdGUpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocy5iYWNrZ3JvdW5kUGFpbnRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcCA9IHMuYmFja2dyb3VuZFBhaW50ZXI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcCA9IChQYWludGVyKWdldChjdHgsICJiYWNrZ3JvdW5kUGFpbnRlciIpOworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICB2LmNhY2hlLnB1dChuZXcgQ2FjaGVLZXkoImJhY2tncm91bmRQYWludGVyJCRpbnN0YW5jZSIsIHhzdGF0ZSksIHApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGZvcmVncm91bmQgUGFpbnRlciwgaWYgdGhlcmUgaXMgb25lLCBmb3IgdGhlIHN0YXRlCisgICAgICogc3BlY2lmaWVkIGluIHRoZSBnaXZlbiBTeW50aENvbnRleHQuIFRoaXMgbWV0aG9kIGRvZXMgYXBwcm9wcmlhdGUKKyAgICAgKiBmYWxsYmFjayBzZWFyY2hpbmcsIGFzIGRlc2NyaWJlZCBpbiAjZ2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGN0eCBUaGUgU3ludGhDb250ZXh0LiBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqIEByZXR1cm4gVGhlIGZvcmVncm91bmQgcGFpbnRlciBhc3NvY2lhdGVkIGZvciB0aGUgZ2l2ZW4gc3RhdGUsIG9yIG51bGwgaWYKKyAgICAgKiBub25lIGNvdWxkIGJlIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBQYWludGVyIGdldEZvcmVncm91bmRQYWludGVyKFN5bnRoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgVmFsdWVzIHYgPSBnZXRWYWx1ZXMoY3R4KTsKKyAgICAgICAgaW50IHhzdGF0ZSA9IGdldEV4dGVuZGVkU3RhdGUoY3R4LCB2KTsKKyAgICAgICAgUGFpbnRlciBwID0gbnVsbDsKKworICAgICAgICAvLyBjaGVjayB0aGUgY2FjaGUKKyAgICAgICAgdG1wS2V5LmluaXQoImZvcmVncm91bmRQYWludGVyJCRpbnN0YW5jZSIsIHhzdGF0ZSk7CisgICAgICAgIHAgPSAoUGFpbnRlcil2LmNhY2hlLmdldCh0bXBLZXkpOworICAgICAgICBpZiAocCAhPSBudWxsKSByZXR1cm4gcDsKKworICAgICAgICAvLyBub3QgaW4gY2FjaGUsIHNvIGxvb2t1cCBhbmQgc3RvcmUgaW4gY2FjaGUKKyAgICAgICAgUnVudGltZVN0YXRlIHMgPSBudWxsOworICAgICAgICBpbnRbXSBsYXN0SW5kZXggPSBuZXcgaW50W10gey0xfTsKKyAgICAgICAgd2hpbGUgKChzID0gZ2V0TmV4dFN0YXRlKHYuc3RhdGVzLCBsYXN0SW5kZXgsIHhzdGF0ZSkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChzLmZvcmVncm91bmRQYWludGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwID0gcy5mb3JlZ3JvdW5kUGFpbnRlcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocCA9PSBudWxsKSBwID0gKFBhaW50ZXIpZ2V0KGN0eCwgImZvcmVncm91bmRQYWludGVyIik7CisgICAgICAgIGlmIChwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHYuY2FjaGUucHV0KG5ldyBDYWNoZUtleSgiZm9yZWdyb3VuZFBhaW50ZXIkJGluc3RhbmNlIiwgeHN0YXRlKSwgcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgYm9yZGVyIFBhaW50ZXIsIGlmIHRoZXJlIGlzIG9uZSwgZm9yIHRoZSBzdGF0ZQorICAgICAqIHNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gU3ludGhDb250ZXh0LiBUaGlzIG1ldGhvZCBkb2VzIGFwcHJvcHJpYXRlCisgICAgICogZmFsbGJhY2sgc2VhcmNoaW5nLCBhcyBkZXNjcmliZWQgaW4gI2dldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdHggVGhlIFN5bnRoQ29udGV4dC4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFRoZSBib3JkZXIgcGFpbnRlciBhc3NvY2lhdGVkIGZvciB0aGUgZ2l2ZW4gc3RhdGUsIG9yIG51bGwgaWYKKyAgICAgKiBub25lIGNvdWxkIGJlIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBQYWludGVyIGdldEJvcmRlclBhaW50ZXIoU3ludGhDb250ZXh0IGN0eCkgeworICAgICAgICBWYWx1ZXMgdiA9IGdldFZhbHVlcyhjdHgpOworICAgICAgICBpbnQgeHN0YXRlID0gZ2V0RXh0ZW5kZWRTdGF0ZShjdHgsIHYpOworICAgICAgICBQYWludGVyIHAgPSBudWxsOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBjYWNoZQorICAgICAgICB0bXBLZXkuaW5pdCgiYm9yZGVyUGFpbnRlciQkaW5zdGFuY2UiLCB4c3RhdGUpOworICAgICAgICBwID0gKFBhaW50ZXIpdi5jYWNoZS5nZXQodG1wS2V5KTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgcmV0dXJuIHA7CisKKyAgICAgICAgLy8gbm90IGluIGNhY2hlLCBzbyBsb29rdXAgYW5kIHN0b3JlIGluIGNhY2hlCisgICAgICAgIFJ1bnRpbWVTdGF0ZSBzID0gbnVsbDsKKyAgICAgICAgaW50W10gbGFzdEluZGV4ID0gbmV3IGludFtdIHstMX07CisgICAgICAgIHdoaWxlICgocyA9IGdldE5leHRTdGF0ZSh2LnN0YXRlcywgbGFzdEluZGV4LCB4c3RhdGUpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocy5ib3JkZXJQYWludGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwID0gcy5ib3JkZXJQYWludGVyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwID09IG51bGwpIHAgPSAoUGFpbnRlcilnZXQoY3R4LCAiYm9yZGVyUGFpbnRlciIpOworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICB2LmNhY2hlLnB1dChuZXcgQ2FjaGVLZXkoImJvcmRlclBhaW50ZXIkJGluc3RhbmNlIiwgeHN0YXRlKSwgcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgcHJvcGVyIFZhbHVlcyBiYXNlZCBvbiB0aGUgZ2l2ZW4KKyAgICAgKiBTeW50aENvbnRleHQuIEVuc3VyZXMgdGhhdCBwYXJzaW5nIG9mIHRoZSB2YWx1ZXMgaGFzIG9jY3VycmVkLCBvcgorICAgICAqIHJlb2NjdXJzIGFzIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdHggVGhlIFN5bnRoQ29udGV4dAorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCB2YWx1ZXMgcmVmZXJlbmNlCisgICAgICovCisgICAgcHJpdmF0ZSBWYWx1ZXMgZ2V0VmFsdWVzKFN5bnRoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgdXRpbGl0eSBtZXRob2QgdGhhdCBzZWFyY2hzIHRoZSBnaXZlbiBhcnJheSBvZiBTdHJpbmdzIGZvciB0aGUKKyAgICAgKiBnaXZlbiBzdHJpbmcuIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGZyb20gZ2V0RXh0ZW5kZWRTdGF0ZSBpZgorICAgICAqIHRoZSBkZXZlbG9wZXIgaGFzIHNwZWNpZmllZCBhIHNwZWNpZmljIHN0YXRlIGZvciB0aGUgY29tcG9uZW50IHRvIGJlCisgICAgICogaW4gKGllLCBoYXMgIndlZGdlZCIgdGhlIGNvbXBvbmVudCBpbiB0aGF0IHN0YXRlKSBieSBzcGVjaWZ5aW5nCisgICAgICogdGhleSBjbGllbnQgcHJvcGVydHkgIk5pbWJ1cy5TdGF0ZSIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZXMgYSBub24tbnVsbCBhcnJheSBvZiBzdHJpbmdzCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gbG9vayBmb3IgaW4gdGhlIGFycmF5CisgICAgICogQHJldHVybiB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGdpdmVuIG5hbWUgaXMgaW4gdGhlIGFycmF5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFN0cmluZ1tdIG5hbWVzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhuYW1lc1tpXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+R2V0cyB0aGUgZXh0ZW5kZWQgc3RhdGUgZm9yIGEgZ2l2ZW4gc3ludGggY29udGV4dC4gTmltYnVzIHN1cHBvcnRzIHRoZQorICAgICAqIGFiaWxpdHkgdG8gZGVmaW5lIGN1c3RvbSBzdGF0ZXMuIFRoZSBhbGdvcml0aG0gdXNlZCBmb3IgY2hvb3Npbmcgd2hhdAorICAgICAqIHN0eWxlIGluZm9ybWF0aW9uIHRvIHVzZSBmb3IgYSBnaXZlbiBzdGF0ZSByZXF1aXJlcyBhIHNpbmdsZSBpbnRlZ2VyCisgICAgICogYml0IHN0cmluZyB3aGVyZSBlYWNoIGJpdCBpbiB0aGUgaW50ZWdlciByZXByZXNlbnRzIGEgZGlmZmVyZW50IHN0YXRlCisgICAgICogdGhhdCB0aGUgY29tcG9uZW50IGlzIGluLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBjb21wb25lbnRTdGF0ZSBhcworICAgICAqIHJlcG9ydGVkIGluIHRoZSBTeW50aENvbnRleHQsIGluIGFkZGl0aW9uIHRvIGN1c3RvbSBzdGF0ZXMsIHRvIGRldGVybWluZQorICAgICAqIHdoYXQgdGhpcyBleHRlbmRlZCBzdGF0ZSBpcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5JbiBhZGRpdGlvbiwgdGhpcyBtZXRob2QgY2hlY2tzIHRoZSBjb21wb25lbnQgaW4gdGhlIGdpdmVuIGNvbnRleHQKKyAgICAgKiBmb3IgYSBjbGllbnQgcHJvcGVydHkgY2FsbGVkICJOaW1idXMuU3RhdGUiLiBJZiBvbmUgZXhpc3RzLCB0aGVuIGl0IHdpbGwKKyAgICAgKiBkZWNvbXBvc2UgdGhlIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhhdCBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgd2hhdAorICAgICAqIHN0YXRlIHRvIHJldHVybi4gSW4gdGhpcyB3YXksIHRoZSBkZXZlbG9wZXIgY2FuIGZvcmNlIGEgY29tcG9uZW50IHRvIGJlCisgICAgICogaW4gYSBzcGVjaWZpYyBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSAicmVhbCIgc3RhdGUgb2YgdGhlIGNvbXBvbmVudAorICAgICAqIGlzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoICJOaW1idXMuU3RhdGUiIHdvdWxkIGJlIG9mIHRoZSBmb3JtOgorICAgICAqIDxwcmU+RW5hYmxlZCtDdXN0b21TdGF0ZStNb3VzZU92ZXI8L3ByZT48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4CisgICAgICogQHBhcmFtIHYKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0RXh0ZW5kZWRTdGF0ZShTeW50aENvbnRleHQgY3R4LCBWYWx1ZXMgdikgeworICAgICAgICBKQ29tcG9uZW50IGMgPSBjdHguZ2V0Q29tcG9uZW50KCk7CisgICAgICAgIGludCB4c3RhdGUgPSAwOworICAgICAgICBpbnQgbWFzayA9IDE7CisgICAgICAgIC8vY2hlY2sgZm9yIHRoZSBOaW1idXMuU3RhdGUgY2xpZW50IHByb3BlcnR5CisgICAgICAgIC8vUGVyZm9ybWFuY2UgTk9URTogZ2V0Q2xpZW50UHJvcGVydHkgZW5kcyB1cCBpbnNpZGUgYSBzeW5jaHJvbml6ZWQKKyAgICAgICAgLy9ibG9jaywgc28gdGhlcmUgaXMgc29tZSBwb3RlbnRpYWwgZm9yIHBlcmZvcm1hbmNlIGlzc3VlcyBoZXJlLCBob3dldmVyCisgICAgICAgIC8vSSdtIG5vdCBjZXJ0YWluIHRoYXQgdGhlcmUgaXMgb25lIG9uIGEgbW9kZXJuIFZNLgorICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBjLmdldENsaWVudFByb3BlcnR5KCJOaW1idXMuU3RhdGUiKTsKKyAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBzdGF0ZU5hbWVzID0gcHJvcGVydHkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHN0YXRlcyA9IHN0YXRlTmFtZXMuc3BsaXQoIlxcKyIpOworICAgICAgICAgICAgaWYgKHYuc3RhdGVUeXBlcyA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICAvLyBzdGFuZGFyZCBzdGF0ZXMgb25seQorICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHN0YXRlU3RyIDogc3RhdGVzKSB7CisgICAgICAgICAgICAgICAgICAgIFN0YXRlLlN0YW5kYXJkU3RhdGUgcyA9IFN0YXRlLmdldFN0YW5kYXJkU3RhdGUoc3RhdGVTdHIpOworICAgICAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB4c3RhdGUgfD0gcy5nZXRTdGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY3VzdG9tIHN0YXRlcworICAgICAgICAgICAgICAgIGZvciAoU3RhdGUgcyA6IHYuc3RhdGVUeXBlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnMoc3RhdGVzLCBzLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhzdGF0ZSB8PSBtYXNrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPDw9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9pZiB0aGVyZSBhcmUgbm8gY3VzdG9tIHN0YXRlcyBkZWZpbmVkLCB0aGVuIHNpbXBseSByZXR1cm4gdGhlCisgICAgICAgICAgICAvL3N0YXRlIHRoYXQgU3ludGggcmVwb3J0ZWQKKyAgICAgICAgICAgIGlmICh2LnN0YXRlVHlwZXMgPT0gbnVsbCkgcmV0dXJuIGN0eC5nZXRDb21wb25lbnRTdGF0ZSgpOworCisgICAgICAgICAgICAvL3RoZXJlIGFyZSBjdXN0b20gc3RhdGVzIG9uIHRoaXMgdmFsdWVzLCBzbyBJJ2xsIGhhdmUgdG8gaXRlcmF0ZQorICAgICAgICAgICAgLy9vdmVyIHRoZW0gYWxsIGFuZCByZXR1cm4gYSBjdXN0b20gZXh0ZW5kZWQgc3RhdGUKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IGN0eC5nZXRDb21wb25lbnRTdGF0ZSgpOworICAgICAgICAgICAgZm9yIChTdGF0ZSBzIDogdi5zdGF0ZVR5cGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNJblN0YXRlKGMsIHN0YXRlKSkgeworICAgICAgICAgICAgICAgICAgICB4c3RhdGUgfD0gbWFzazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFzayA8PD0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4geHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkdldHMgdGhlIFJ1bnRpbWVTdGF0ZSB0aGF0IG1vc3QgY2xvc2VseSBtYXRjaGVzIHRoZSBzdGF0ZSBpbiB0aGUgZ2l2ZW4KKyAgICAgKiBjb250ZXh0LCBidXQgaXMgbGVzcyBzcGVjaWZpYyB0aGFuIHRoZSBnaXZlbiAibGFzdFN0YXRlIi4gRXNzZW50aWFsbHksCisgICAgICogdGhpcyBhbGxvd3MgeW91IHRvIHNlYXJjaCBmb3IgdGhlIG5leHQgYmVzdCBzdGF0ZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgaWYgeW91IGhhZCB0aGUgZm9sbG93aW5nIHRocmVlIHN0YXRlczoKKyAgICAgKiA8cHJlPgorICAgICAqIEVuYWJsZWQKKyAgICAgKiBFbmFibGVkK1ByZXNzZWQKKyAgICAgKiBEaXNhYmxlZAorICAgICAqIDwvcHJlPgorICAgICAqIEFuZCB5b3Ugd2FudGVkIHRvIGZpbmQgdGhlIHN0YXRlIHRoYXQgYmVzdCByZXByZXNlbnRlZAorICAgICAqIEVOQUJMRUQrUFJFU1NFRCtGT0NVU0VEIGFuZCA8Y29kZT5sYXN0U3RhdGU8L2NvZGU+IHdhcyBudWxsIChvciBhbgorICAgICAqIGVtcHR5IGFycmF5LCBvciBhbiBhcnJheSB3aXRoIGEgc2luZ2xlIGludCB3aXRoIGluZGV4ID09IC0xKSwgdGhlbgorICAgICAqIEVuYWJsZWQrUHJlc3NlZCB3b3VsZCBiZSByZXR1cm5lZC4gSWYgeW91IHRoZW4gY2FsbCB0aGlzIG1ldGhvZCBhZ2FpbiBidXQKKyAgICAgKiBwYXNzIHRoZSBpbmRleCBvZiBFbmFibGVkK1ByZXNzZWQgYXMgdGhlICJsYXN0U3RhdGUiLCB0aGVuCisgICAgICogRW5hYmxlZCB3b3VsZCBiZSByZXR1cm5lZC4gSWYgeW91IGNhbGwgdGhpcyBtZXRob2QgYSB0aGlyZCB0aW1lIGFuZCBwYXNzCisgICAgICogdGhlIGluZGV4IG9mIEVuYWJsZWQgaW4gYXMgdGhlIDxjb2RlPmxhc3RTdGF0ZTwvY29kZT4sIHRoZW4gbnVsbCB3b3VsZCBiZQorICAgICAqIHJldHVybmVkLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBhY3R1YWwgY29kZSBwYXRoIGZvciBkZXRlcm1pbmluZyB0aGUgcHJvcGVyIHN0YXRlIGlzIHRoZSBzYW1lIGFzCisgICAgICogaW4gU3ludGguPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGN0eAorICAgICAqIEBwYXJhbSBsYXN0U3RhdGUgYSAxIGVsZW1lbnQgYXJyYXksIGFsbG93aW5nIG1lIHRvIGRvIHBhc3MtYnktcmVmZXJlbmNlLgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bnRpbWVTdGF0ZSBnZXROZXh0U3RhdGUoUnVudGltZVN0YXRlW10gc3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBsYXN0U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4c3RhdGUpIHsKKyAgICAgICAgLy8gVXNlIHRoZSBTdGF0ZUluZm8gd2l0aCB0aGUgbW9zdCBiaXRzIHRoYXQgbWF0Y2hlcyB0aGF0IG9mIHN0YXRlLgorICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm9uZSwgdGhlbiBmYWxsYmFjayB0bworICAgICAgICAvLyB0aGUgU3RhdGVJbmZvIHdpdGggYSBzdGF0ZSBvZiAwLCBpbmRpY2F0aW5nIGl0J2xsIG1hdGNoIGFueXRoaW5nLgorCisgICAgICAgIC8vIENvbnNpZGVyIGlmIHdlIGhhdmUgMyBTdGF0ZUluZm9zIGEsIGIgYW5kIGMgd2l0aCBzdGF0ZXM6CisgICAgICAgIC8vIFNFTEVDVEVELCBTRUxFQ1RFRCB8IEVOQUJMRUQsIDAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiBWYWx1ZQorICAgICAgICAvLyAtLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIFNFTEVDVEVEICAgICAgICAgICAgICAgICAgICAgICBhCisgICAgICAgIC8vIFNFTEVDVEVEIHwgRU5BQkxFRCAgICAgICAgICAgICBiCisgICAgICAgIC8vIE1PVVNFX09WRVIgICAgICAgICAgICAgICAgICAgICBjCisgICAgICAgIC8vIFNFTEVDVEVEIHwgRU5BQkxFRCB8IEZPQ1VTRUQgICBiCisgICAgICAgIC8vIEVOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICBjCisKKyAgICAgICAgaWYgKHN0YXRlcyAhPSBudWxsICYmIHN0YXRlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBpbnQgYmVzdENvdW50ID0gMDsKKyAgICAgICAgICAgIGludCBiZXN0SW5kZXggPSAtMTsKKyAgICAgICAgICAgIGludCB3aWxkSW5kZXggPSAtMTsKKworICAgICAgICAgICAgLy9pZiB4c3RhdGUgaXMgMCwgdGhlbiBzZWFyY2ggZm9yIHRoZSBydW50aW1lIHN0YXRlIHdpdGggY29tcG9uZW50CisgICAgICAgICAgICAvL3N0YXRlIG9mIDAuIFRoYXQgaXMsIGZpbmQgdGhlIGV4YWN0IG1hdGNoIGFuZCByZXR1cm4gaXQuCisgICAgICAgICAgICBpZiAoeHN0YXRlID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb3VudGVyID0gc3RhdGVzLmxlbmd0aCAtIDE7IGNvdW50ZXIgPj0gMDsgY291bnRlci0tKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZXNbY291bnRlcl0uc3RhdGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFN0YXRlWzBdID0gY291bnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZXNbY291bnRlcl07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9hbiBleGFjdCBtYXRjaCBjb3VsZG4ndCBiZSBmb3VuZCwgc28gdGhlcmUgd2FzIG5vIG1hdGNoLgorICAgICAgICAgICAgICAgIGxhc3RTdGF0ZVswXSA9IC0xOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3hzdGF0ZSBpcyBzb21lIHZhbHVlICE9IDAKKworICAgICAgICAgICAgLy9kZXRlcm1pbmUgZnJvbSB3aGljaCBpbmRleCB0byBzdGFydCBsb29raW5nLiBJZiBsYXN0U3RhdGVbMF0gaXMgLTEKKyAgICAgICAgICAgIC8vdGhlbiB3ZSBrbm93IHRvIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgc3RhdGUgYXJyYXkuIE90aGVyd2lzZSwKKyAgICAgICAgICAgIC8vd2Ugc3RhcnQgYXQgdGhlIGxhc3RJbmRleCAtIDEuCisgICAgICAgICAgICBpbnQgbGFzdFN0YXRlSW5kZXggPSBsYXN0U3RhdGUgPT0gbnVsbCB8fCBsYXN0U3RhdGVbMF0gPT0gLTEgPworICAgICAgICAgICAgICAgIHN0YXRlcy5sZW5ndGggOiBsYXN0U3RhdGVbMF07CisKKyAgICAgICAgICAgIGZvciAoaW50IGNvdW50ZXIgPSBsYXN0U3RhdGVJbmRleCAtIDE7IGNvdW50ZXIgPj0gMDsgY291bnRlci0tKSB7CisgICAgICAgICAgICAgICAgaW50IG9TdGF0ZSA9IHN0YXRlc1tjb3VudGVyXS5zdGF0ZTsKKworICAgICAgICAgICAgICAgIGlmIChvU3RhdGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAod2lsZEluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aWxkSW5kZXggPSBjb3VudGVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoeHN0YXRlICYgb1N0YXRlKSA9PSBvU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBrZXksIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCBiaXRzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBTdGF0ZUluZm8gbWF0Y2gsIG90aGVyd2lzZSBhIFN0YXRlSW5mbyB3aXRoCisgICAgICAgICAgICAgICAgICAgIC8vIFNFTEVDVEVEIHwgRU5BQkxFRCB3b3VsZCBtYXRjaCBFTkFCTEVELCB3aGljaCB3ZQorICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB3YW50LgorCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29tZXMgZnJvbSBCaWdJbnRlZ2VyLmJpdENudAorICAgICAgICAgICAgICAgICAgICBpbnQgYml0Q291bnQgPSBvU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGJpdENvdW50IC09ICgweGFhYWFhYWFhICYgYml0Q291bnQpID4+PiAxOworICAgICAgICAgICAgICAgICAgICBiaXRDb3VudCA9IChiaXRDb3VudCAmIDB4MzMzMzMzMzMpICsgKChiaXRDb3VudCA+Pj4gMikgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzMzMzMzMzMpOworICAgICAgICAgICAgICAgICAgICBiaXRDb3VudCA9IGJpdENvdW50ICsgKGJpdENvdW50ID4+PiA0KSAmIDB4MGYwZjBmMGY7CisgICAgICAgICAgICAgICAgICAgIGJpdENvdW50ICs9IGJpdENvdW50ID4+PiA4OworICAgICAgICAgICAgICAgICAgICBiaXRDb3VudCArPSBiaXRDb3VudCA+Pj4gMTY7CisgICAgICAgICAgICAgICAgICAgIGJpdENvdW50ID0gYml0Q291bnQgJiAweGZmOworICAgICAgICAgICAgICAgICAgICBpZiAoYml0Q291bnQgPiBiZXN0Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RJbmRleCA9IGNvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0Q291bnQgPSBiaXRDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiZXN0SW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBsYXN0U3RhdGVbMF0gPSBiZXN0SW5kZXg7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlc1tiZXN0SW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpbGRJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGxhc3RTdGF0ZVswXSA9IHdpbGRJbmRleDsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVzW3dpbGRJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGFzdFN0YXRlWzBdID0gLTE7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIHZhbHVlcyBzdWNoIGFzIHRoZSBVSURlZmF1bHRzIGFuZCBwYWludGVycyBhc3Nzb2NpYXRlZCB3aXRoCisgICAgICogYSBzdGF0ZS4gV2hlcmVhcyA8Y29kZT5TdGF0ZTwvY29kZT4gcmVwcmVzZW50cyBhIGRpc3RpbmN0IHN0YXRlIHRoYXQgYQorICAgICAqIGNvbXBvbmVudCBjYW4gYmUgaW4gKHN1Y2ggYXMgRW5hYmxlZCksIHRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgY29sb3JzLAorICAgICAqIGZvbnRzLCBwYWludGVycywgZXRjIGFzc29jaWF0ZWQgd2l0aCBzb21lIHN0YXRlIGZvciB0aGlzCisgICAgICogc3R5bGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSdW50aW1lU3RhdGUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworICAgICAgICBpbnQgc3RhdGU7CisgICAgICAgIFBhaW50ZXIgYmFja2dyb3VuZFBhaW50ZXI7CisgICAgICAgIFBhaW50ZXIgZm9yZWdyb3VuZFBhaW50ZXI7CisgICAgICAgIFBhaW50ZXIgYm9yZGVyUGFpbnRlcjsKKyAgICAgICAgU3RyaW5nIHN0YXRlTmFtZTsKKyAgICAgICAgVUlEZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBVSURlZmF1bHRzKDEwLCAuN2YpOworCisgICAgICAgIHByaXZhdGUgUnVudGltZVN0YXRlKGludCBzdGF0ZSwgU3RyaW5nIHN0YXRlTmFtZSkgeworICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgdGhpcy5zdGF0ZU5hbWUgPSBzdGF0ZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJ1bnRpbWVTdGF0ZSBjbG9uZSgpIHsKKyAgICAgICAgICAgIFJ1bnRpbWVTdGF0ZSBjbG9uZSA9IG5ldyBSdW50aW1lU3RhdGUoc3RhdGUsIHN0YXRlTmFtZSk7CisgICAgICAgICAgICBjbG9uZS5iYWNrZ3JvdW5kUGFpbnRlciA9IGJhY2tncm91bmRQYWludGVyOworICAgICAgICAgICAgY2xvbmUuZm9yZWdyb3VuZFBhaW50ZXIgPSBmb3JlZ3JvdW5kUGFpbnRlcjsKKyAgICAgICAgICAgIGNsb25lLmJvcmRlclBhaW50ZXIgPSBib3JkZXJQYWludGVyOworICAgICAgICAgICAgY2xvbmUuZGVmYXVsdHMucHV0QWxsKGRlZmF1bHRzKTsKKyAgICAgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVzc2VudGlhbGx5IGEgc3RydWN0IG9mIGRhdGEgZm9yIGEgc3R5bGUuIEEgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzCisgICAgICogY2xhc3MgaXMgdXNlZCBieSBOaW1idXNTdHlsZS4gQWRkaXRpb25hbCBpbnN0YW5jZXMgZXhpc3QgZm9yIGVhY2gKKyAgICAgKiBjb21wb25lbnQgdGhhdCBoYXMgb3ZlcnJpZGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFZhbHVlcyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGlzdCBvZiBTdGF0ZSB0eXBlcy4gQSBTdGF0ZSByZXByZXNlbnRzIGEgdHlwZSBvZiBzdGF0ZSwgc3VjaAorICAgICAgICAgKiBhcyBFbmFibGVkLCBEZWZhdWx0LCBXaW5kb3dGb2N1c2VkLCBldGMuIFRoZXNlIGNhbiBiZSBjdXN0b20gc3RhdGVzLgorICAgICAgICAgKi8KKyAgICAgICAgU3RhdGVbXSBzdGF0ZVR5cGVzID0gbnVsbDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsaXN0IG9mIGFjdHVhbCBydW50aW1lIHN0YXRlIHJlcHJlc2VudGF0aW9ucy4gVGhlc2UgY2FuIHJlcHJlc2VudCB0aGluZ3Mgc3VjaAorICAgICAgICAgKiBhcyBFbmFibGVkICsgRm9jdXNlZC4gVGh1cywgdGhleSBkaWZmZXIgZnJvbSBTdGF0ZXMgaW4gdGhhdCB0aGV5IGNvbnRhaW4KKyAgICAgICAgICogc2V2ZXJhbCBzdGF0ZXMgdG9nZXRoZXIsIGFuZCBoYXZlIGFzc29jaWF0ZWQgcHJvcGVydGllcywgZGF0YSwgZXRjLgorICAgICAgICAgKi8KKyAgICAgICAgUnVudGltZVN0YXRlW10gc3RhdGVzID0gbnVsbDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50IG1hcmdpbnMgZm9yIHRoaXMgcmVnaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgSW5zZXRzIGNvbnRlbnRNYXJnaW5zOworICAgICAgICAvKioKKyAgICAgICAgICogRGVmYXVsdHMgb24gdGhlIHJlZ2lvbi9jb21wb25lbnQgbGV2ZWwuCisgICAgICAgICAqLworICAgICAgICBVSURlZmF1bHRzIGRlZmF1bHRzID0gbmV3IFVJRGVmYXVsdHMoMTAsIC43Zik7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTaW1wbGUgY2FjaGUuIEFmdGVyIGEgdmFsdWUgaGFzIGJlZW4gbG9va2VkIHVwLCBpdCBpcyBzdG9yZWQKKyAgICAgICAgICogaW4gdGhpcyBjYWNoZSBmb3IgbGF0ZXIgcmV0cmlldmFsLiBUaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZgorICAgICAgICAgKiB0aGUgcHJvcGVydHkgYmVpbmcgbG9va2VkIHVwLCB0d28gZG9sbGFyIHNpZ25zLCBhbmQgdGhlIGV4dGVuZGVkCisgICAgICAgICAqIHN0YXRlLiBTbyBmb3IgZXhhbXBsZToKKyAgICAgICAgICoKKyAgICAgICAgICogZm9vLmJhciQkMjM1MworICAgICAgICAgKi8KKyAgICAgICAgTWFwPENhY2hlS2V5LE9iamVjdD4gY2FjaGUgPSBuZXcgSGFzaE1hcDxDYWNoZUtleSxPYmplY3Q+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBwcmVzdXBwb3NlcyB0aGF0IGtleSBpcyBuZXZlciBudWxsIGFuZCB0aGF0CisgICAgICogdGhlIHR3byBrZXlzIGJlaW5nIGNoZWNrZWQgZm9yIGVxdWFsaXR5IGFyZSBuZXZlciBudWxsCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ2FjaGVLZXkgeworICAgICAgICBwcml2YXRlIFN0cmluZyBrZXk7CisgICAgICAgIHByaXZhdGUgaW50IHhzdGF0ZTsKKworICAgICAgICBDYWNoZUtleShPYmplY3Qga2V5LCBpbnQgeHN0YXRlKSB7CisgICAgICAgICAgICBpbml0KGtleSwgeHN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW5pdChPYmplY3Qga2V5LCBpbnQgeHN0YXRlKSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleS50b1N0cmluZygpOworICAgICAgICAgICAgdGhpcy54c3RhdGUgPSB4c3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGZpbmFsIENhY2hlS2V5IG90aGVyID0gKENhY2hlS2V5KSBvYmo7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0aGlzLnhzdGF0ZSAhPSBvdGhlci54c3RhdGUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghdGhpcy5rZXkuZXF1YWxzKG90aGVyLmtleSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgICAgICBoYXNoID0gMjkgKiBoYXNoICsgdGhpcy5rZXkuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIGhhc2ggPSAyOSAqIGhhc2ggKyB0aGlzLnhzdGF0ZTsKKyAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBsaXN0ZW5lciBpcyB1c2VkIHRvIGxpc3RlbiB0byB0aGUgVUlEZWZhdWx0cyB0YWJsZXMgYW5kIGNsZWFyIG91dAorICAgICAqIHRoZSBjYWNoZWQtcHJlY29tcGlsZWQgbWFwIG9mIGRlZmF1bHRzIGluIHRoYXQgY2FzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWZhdWx0c0xpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgeworICAgICAgICAgICAgQXBwQ29udGV4dC5nZXRBcHBDb250ZXh0KCkucHV0KCJOaW1idXNTdHlsZS5kZWZhdWx0cyIsIG51bGwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL091dGVyR2xvd0VmZmVjdC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL091dGVyR2xvd0VmZmVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZjgzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvT3V0ZXJHbG93RWZmZWN0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLm5pbWJ1czsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworCisvKioKKyAqIElubmVyR2xvd0VmZmVjdAorICoKKyAqIEBhdXRob3IgQ3JlYXRlZCBieSBKYXNwZXIgUG90dHMgKEp1biAyMSwgMjAwNykKKyAqLworY2xhc3MgT3V0ZXJHbG93RWZmZWN0IGV4dGVuZHMgRHJvcFNoYWRvd0VmZmVjdCB7CisgICAgT3V0ZXJHbG93RWZmZWN0KCkgeworICAgICAgICBkaXN0YW5jZSA9IDA7CisgICAgICAgIGNvbG9yID0gbmV3IENvbG9yKDI1NSwgMjU1LCAyMTEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9QYWludGVySW1wbC50ZW1wbGF0ZSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9QYWludGVySW1wbC50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZhMDAwCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL1BhaW50ZXJJbXBsLnRlbXBsYXRlCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgJHtQQUNLQUdFfTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS4qOworaW1wb3J0IGphdmEuYXd0LmltYWdlLio7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZheC5zd2luZy5QYWludGVyOworCisKK3B1YmxpYyBmaW5hbCBjbGFzcyAke1BBSU5URVJfTkFNRX0gZXh0ZW5kcyBBYnN0cmFjdFJlZ2lvblBhaW50ZXIgeworICAgIC8vcGFja2FnZSBwcml2YXRlIGludGVnZXJzIHJlcHJlc2VudGluZyB0aGUgYXZhaWxhYmxlIHN0YXRlcyB0aGF0CisgICAgLy90aGlzIHBhaW50ZXIgd2lsbCBwYWludC4gVGhlc2UgYXJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZQorICAgIC8vb2YgJHtQQUlOVEVSX05BTUV9IHRvIGRldGVybWluZSB3aGljaCByZWdpb24vc3RhdGUgaXMgYmVpbmcgcGFpbnRlZAorICAgIC8vYnkgdGhhdCBpbnN0YW5jZS4KKyR7U1RBVElDX0RFQ0x9CisKKyAgICBwcml2YXRlIGludCBzdGF0ZTsgLy9yZWZlcnMgdG8gb25lIG9mIHRoZSBzdGF0aWMgZmluYWwgaW50cyBhYm92ZQorICAgIHByaXZhdGUgUGFpbnRDb250ZXh0IGN0eDsKKworICAgIC8vdGhlIGZvbGxvd2luZyA0IHZhcmlhYmxlcyBhcmUgcmV1c2VkIGR1cmluZyB0aGUgcGFpbnRpbmcgY29kZSBvZiB0aGUgbGF5ZXJzCisgICAgcHJpdmF0ZSBQYXRoMkQgcGF0aCA9IG5ldyBQYXRoMkQuRmxvYXQoKTsKKyAgICBwcml2YXRlIFJlY3RhbmdsZTJEIHJlY3QgPSBuZXcgUmVjdGFuZ2xlMkQuRmxvYXQoMCwgMCwgMCwgMCk7CisgICAgcHJpdmF0ZSBSb3VuZFJlY3RhbmdsZTJEIHJvdW5kUmVjdCA9IG5ldyBSb3VuZFJlY3RhbmdsZTJELkZsb2F0KDAsIDAsIDAsIDAsIDAsIDApOworICAgIHByaXZhdGUgRWxsaXBzZTJEIGVsbGlwc2UgPSBuZXcgRWxsaXBzZTJELkZsb2F0KDAsIDAsIDAsIDApOworCisgICAgLy9BbGwgQ29sb3JzIHVzZWQgZm9yIHBhaW50aW5nIGFyZSBzdG9yZWQgaGVyZS4gSWRlYWxseSwgb25seSB0aG9zZSBjb2xvcnMgYmVpbmcgdXNlZAorICAgIC8vYnkgYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mICR7UEFJTlRFUl9OQU1FfSB3b3VsZCBiZSBjcmVhdGVkLiBGb3IgdGhlIG1vbWVudCBhdCBsZWFzdCwKKyAgICAvL2hvd2V2ZXIsIGFsbCBhcmUgY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS4KKyR7Q09MT1JTX0RFQ0x9CisKKyAgICAvL0FycmF5IG9mIGN1cnJlbnQgY29tcG9uZW50IGNvbG9ycywgdXBkYXRlZCBpbiBlYWNoIHBhaW50IGNhbGwKKyAgICBwcml2YXRlIE9iamVjdFtdIGNvbXBvbmVudENvbG9yczsKKworICAgIHB1YmxpYyAke1BBSU5URVJfTkFNRX0oUGFpbnRDb250ZXh0IGN0eCwgaW50IHN0YXRlKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgdGhpcy5jdHggPSBjdHg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZG9QYWludChHcmFwaGljczJEIGcsIEpDb21wb25lbnQgYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBPYmplY3RbXSBleHRlbmRlZENhY2hlS2V5cykgeworICAgICAgICAvL3BvcHVsYXRlIGNvbXBvbmVudENvbG9ycyBhcnJheSB3aXRoIGNvbG9ycyBjYWxjdWxhdGVkIGluIGdldEV4dGVuZGVkQ2FjaGVLZXlzIGNhbGwKKyAgICAgICAgY29tcG9uZW50Q29sb3JzID0gZXh0ZW5kZWRDYWNoZUtleXM7CisgICAgICAgIC8vZ2VuZXJhdGUgdGhpcyBlbnRpcmUgbWV0aG9kLiBFYWNoIHN0YXRlL2JnL2ZnL2JvcmRlciBjb21ibyB0aGF0IGhhcworICAgICAgICAvL2JlZW4gcGFpbnRlZCBnZXRzIGl0cyBvd24gS0VZIGFuZCBwYWludCBtZXRob2QuCisgICAgICAgIHN3aXRjaChzdGF0ZSkgeworJHtET19QQUlOVF9TV0lUQ0hfQk9EWX0KKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCiske0dFVF9FWFRFTkRFRF9DQUNIRV9LRVlTfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGZpbmFsIFBhaW50Q29udGV4dCBnZXRQYWludENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjdHg7CisgICAgfQorCiske1BBSU5USU5HX0RFQ0x9CisKKyR7U0hBUEVTX0RFQ0x9CisKKyR7R1JBRElFTlRTX0RFQ0x9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvU2hhZG93RWZmZWN0LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvU2hhZG93RWZmZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhMWUzZAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9TaGFkb3dFZmZlY3QuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLm5pbWJ1czsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworCisvKioKKyAqIFNoYWRvd0VmZmVjdCAtIGJhc2UgY2xhc3Mgd2l0aCBhbGwgdGhlIHN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIHNoYWRvdyBlZmZlY3RzCisgKgorICogQGF1dGhvciBDcmVhdGVkIGJ5IEphc3BlciBQb3R0cyAoSnVuIDE4LCAyMDA3KQorICovCithYnN0cmFjdCBjbGFzcyBTaGFkb3dFZmZlY3QgZXh0ZW5kcyBFZmZlY3QgeworICAgIHByb3RlY3RlZCBDb2xvciBjb2xvciA9IENvbG9yLkJMQUNLOworICAgIC8qKiBPcGFjaXR5IGEgZmxvYXQgMC0xIGZvciBwZXJjZW50YWdlICovCisgICAgcHJvdGVjdGVkIGZsb2F0IG9wYWNpdHkgPSAwLjc1ZjsKKyAgICAvKiogQW5nbGUgaW4gZGVncmVlcyBiZXR3ZWVuIDAtMzYwICovCisgICAgcHJvdGVjdGVkIGludCBhbmdsZSA9IDEzNTsKKyAgICAvKiogRGlzdGFuY2UgaW4gcGl4ZWxzICovCisgICAgcHJvdGVjdGVkIGludCBkaXN0YW5jZSA9IDU7CisgICAgLyoqIFRoZSBzaGFkb3cgc3ByZWFkIGJldHdlZW4gMC0xMDAgJSAqLworICAgIHByb3RlY3RlZCBpbnQgc3ByZWFkID0gMDsKKyAgICAvKiogU2l6ZSBpbiBwaXhlbHMgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHNpemUgPSA1OworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBCZWFuIG1ldGhvZHMKKworICAgIENvbG9yIGdldENvbG9yKCkgeworICAgICAgICByZXR1cm4gY29sb3I7CisgICAgfQorCisgICAgdm9pZCBzZXRDb2xvcihDb2xvciBjb2xvcikgeworICAgICAgICBDb2xvciBvbGQgPSBnZXRDb2xvcigpOworICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7CisgICAgfQorCisgICAgZmxvYXQgZ2V0T3BhY2l0eSgpIHsKKyAgICAgICAgcmV0dXJuIG9wYWNpdHk7CisgICAgfQorCisgICAgdm9pZCBzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHkpIHsKKyAgICAgICAgZmxvYXQgb2xkID0gZ2V0T3BhY2l0eSgpOworICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcGFjaXR5OworICAgIH0KKworICAgIGludCBnZXRBbmdsZSgpIHsKKyAgICAgICAgcmV0dXJuIGFuZ2xlOworICAgIH0KKworICAgIHZvaWQgc2V0QW5nbGUoaW50IGFuZ2xlKSB7CisgICAgICAgIGludCBvbGQgPSBnZXRBbmdsZSgpOworICAgICAgICB0aGlzLmFuZ2xlID0gYW5nbGU7CisgICAgfQorCisgICAgaW50IGdldERpc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gZGlzdGFuY2U7CisgICAgfQorCisgICAgdm9pZCBzZXREaXN0YW5jZShpbnQgZGlzdGFuY2UpIHsKKyAgICAgICAgaW50IG9sZCA9IGdldERpc3RhbmNlKCk7CisgICAgICAgIHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgICB9CisKKyAgICBpbnQgZ2V0U3ByZWFkKCkgeworICAgICAgICByZXR1cm4gc3ByZWFkOworICAgIH0KKworICAgIHZvaWQgc2V0U3ByZWFkKGludCBzcHJlYWQpIHsKKyAgICAgICAgaW50IG9sZCA9IGdldFNwcmVhZCgpOworICAgICAgICB0aGlzLnNwcmVhZCA9IHNwcmVhZDsKKyAgICB9CisKKyAgICBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgdm9pZCBzZXRTaXplKGludCBzaXplKSB7CisgICAgICAgIGludCBvbGQgPSBnZXRTaXplKCk7CisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL1N0YXRlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmI0MDgxCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL1N0YXRlLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgamF2YXguc3dpbmcucGxhZi5uaW1idXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7CitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5zeW50aC5TeW50aENvbnN0YW50czsKKworLyoqCisgKiA8cD5SZXByZXNlbnRzIGEgYnVpbHQgaW4sIG9yIGN1c3RvbSwgc3RhdGUgaW4gTmltYnVzLjwvcD4KKyAqCisgKiA8cD5TeW50aCBwcm92aWRlcyBzZXZlcmFsIGJ1aWx0IGluIHN0YXRlcywgd2hpY2ggYXJlOgorICogPHVsPgorICogIDxsaT5FbmFibGVkPC9saT4KKyAqICA8bGk+TW91c2UgT3ZlcjwvbGk+CisgKiAgPGxpPlByZXNzZWQ8L2xpPgorICogIDxsaT5EaXNhYmxlZDwvbGk+CisgKiAgPGxpPkZvY3VzZWQ8L2xpPgorICogIDxsaT5TZWxlY3RlZDwvbGk+CisgKiAgPGxpPkRlZmF1bHQ8L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5Ib3dldmVyLCB0aGVyZSBhcmUgbWFueSBtb3JlIHN0YXRlcyB0aGF0IGNvdWxkIGJlIGRlc2NyaWJlZCBpbiBhIExvb2tBbmRGZWVsLCBhbmQgaXQKKyAqIHdvdWxkIGJlIG5pY2UgdG8gc3R5bGUgY29tcG9uZW50cyBkaWZmZXJlbnRseSBiYXNlZCBvbiB0aGVzZSBkaWZmZXJlbnQgc3RhdGVzLgorICogRm9yIGV4YW1wbGUsIGEgcHJvZ3Jlc3MgYmFyIGNvdWxkIGJlICJpbmRldGVybWluYXRlIi4gSXQgd291bGQgYmUgdmVyeSBjb252ZW5pZW50CisgKiB0byBhbGxvdyB0aGlzIHRvIGJlIGRlZmluZWQgYXMgYSAic3RhdGUiLjwvcD4KKyAqCisgKiA8cD5UaGlzIGNsYXNzLCBTdGF0ZSwgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igc3VjaCBzaXR1YXRpb25zLgorICogU2ltcGx5IGltcGxlbWVudCB0aGUgYWJzdHJhY3QgI2lzSW5TdGF0ZSBtZXRob2QuIEl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4KKyAqIEpDb21wb25lbnQgaXMgImluIHRoaXMgc3RhdGUiLCBmYWxzZSBvdGhlcndpc2UuIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCisgKiA8ZW0+bWFueTwvZW0+IHRpbWVzIGluIDxlbT5wZXJmb3JtYW5jZSBzZW5zaXRpdmUgbG9vcHM8L2VtPi4gSXQgbXVzdCBleGVjdXRlCisgKiB2ZXJ5IHF1aWNrbHkuPC9wPgorICoKKyAqIDxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIG1pZ2h0IGJlIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgY3VzdG9tCisgKiAiSW5kZXRlcm1pbmF0ZSIgc3RhdGUgZm9yIEpQcm9ncmVzc0JhcnM6PC9wPgorICoKKyAqIDxwcmU+PGNvZGU+CisgKiAgICAgcHVibGljIGZpbmFsIGNsYXNzIEluZGV0ZXJtaW5hdGVTdGF0ZSBleHRlbmRzIFN0YXRlJmx0O0pQcm9ncmVzc0JhciZndDsgeworICogICAgICAgICBwdWJsaWMgSW5kZXRlcm1pbmF0ZVN0YXRlKCkgeworICogICAgICAgICAgICAgc3VwZXIoIkluZGV0ZXJtaW5hdGUiKTsKKyAqICAgICAgICAgfQorICoKKyAqICAgICAgICAgJiM2NDtPdmVycmlkZQorICogICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luU3RhdGUoSlByb2dyZXNzQmFyIGMpIHsKKyAqICAgICAgICAgICAgIHJldHVybiBjLmlzSW5kZXRlcm1pbmF0ZSgpOworICogICAgICAgICB9CisgKiAgICAgfQorICogPC9jb2RlPjwvcHJlPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGU8VCBleHRlbmRzIEpDb21wb25lbnQ+eworICAgIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdGFuZGFyZFN0YXRlPiBzdGFuZGFyZFN0YXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RhbmRhcmRTdGF0ZT4oNyk7CisgICAgc3RhdGljIGZpbmFsIFN0YXRlIEVuYWJsZWQgPSBuZXcgU3RhbmRhcmRTdGF0ZShTeW50aENvbnN0YW50cy5FTkFCTEVEKTsKKyAgICBzdGF0aWMgZmluYWwgU3RhdGUgTW91c2VPdmVyID0gbmV3IFN0YW5kYXJkU3RhdGUoU3ludGhDb25zdGFudHMuTU9VU0VfT1ZFUik7CisgICAgc3RhdGljIGZpbmFsIFN0YXRlIFByZXNzZWQgPSBuZXcgU3RhbmRhcmRTdGF0ZShTeW50aENvbnN0YW50cy5QUkVTU0VEKTsKKyAgICBzdGF0aWMgZmluYWwgU3RhdGUgRGlzYWJsZWQgPSBuZXcgU3RhbmRhcmRTdGF0ZShTeW50aENvbnN0YW50cy5ESVNBQkxFRCk7CisgICAgc3RhdGljIGZpbmFsIFN0YXRlIEZvY3VzZWQgPSBuZXcgU3RhbmRhcmRTdGF0ZShTeW50aENvbnN0YW50cy5GT0NVU0VEKTsKKyAgICBzdGF0aWMgZmluYWwgU3RhdGUgU2VsZWN0ZWQgPSBuZXcgU3RhbmRhcmRTdGF0ZShTeW50aENvbnN0YW50cy5TRUxFQ1RFRCk7CisgICAgc3RhdGljIGZpbmFsIFN0YXRlIERlZmF1bHQgPSBuZXcgU3RhbmRhcmRTdGF0ZShTeW50aENvbnN0YW50cy5ERUZBVUxUKTsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiA8cD5DcmVhdGUgYSBuZXcgY3VzdG9tIFN0YXRlLiBTcGVjaWZ5IHRoZSBuYW1lIGZvciB0aGUgc3RhdGUuIFRoZSBuYW1lIHNob3VsZAorICAgICAqIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHN0YXRlcyBzZXQgZm9yIGFueSBvbmUgcGFydGljdWxhciBjb21wb25lbnQuCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHN0YXRlIHNob3VsZCBjb2luY2lkZSB3aXRoIHRoZSBuYW1lIHVzZWQgaW4gVUlEZWZhdWx0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSBjb3JyZWN0OjwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPgorICAgICAqICAgICBkZWZhdWx0cy5wdXQoIkJ1dHRvbi5TdGF0ZXMiLCAiRW5hYmxlZCwgRm9vLCBEaXNhYmxlZCIpOworICAgICAqICAgICBkZWZhdWx0cy5wdXQoIkJ1dHRvbi5Gb28iLCBuZXcgRm9vU3RhdGUoIkZvbyIpKTsKKyAgICAgKiA8L2NvZGU+PC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhIHNpbXBsZSB1c2VyIGZyaWVuZGx5IG5hbWUgZm9yIHRoZSBzdGF0ZSwgc3VjaCBhcyAiSW5kZXRlcm1pbmF0ZSIKKyAgICAgKiAgICAgICAgb3IgIkVtYmVkZGVkUGFuZWwiIG9yICJCbHVycmVkIi4gSXQgaXMgY3VzdG9tYXJ5IHRvIHVzZSBjYW1lbCBjYXNlLAorICAgICAqICAgICAgICB3aXRoIHRoZSBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0YXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBuYW1lOyB9CisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50LCBjYWxsZWQgYnkgTmltYnVzU3R5bGUuPC9wPgorICAgICAqCisgICAgICogPHA+VGhlcmUgYXJlIGJvdGggY3VzdG9tIHN0YXRlcyBhbmQgc3RhbmRhcmQgc3RhdGVzLiBTdGFuZGFyZCBzdGF0ZXMKKyAgICAgKiBjb3JyZWxhdGUgdG8gdGhlIHN0YXRlcyBkZWZpbmVkIGluIFN5bnRoQ29uc3RhbnRzLiBXaGVuIGEgVUkgZGVsZWdhdGUKKyAgICAgKiBjb25zdHJ1Y3RzIGEgU3ludGhDb250ZXh0LCBpdCBzcGVjaWZpZXMgdGhlIHN0YXRlIHRoYXQgdGhlIGNvbXBvbmVudCBpcworICAgICAqIGluIGFjY29yZGluZyB0byB0aGUgc3RhdGVzIGRlZmluZWQgaW4gU3ludGhDb25zdGFudHMuIE91ciBOaW1idXNTdHlsZQorICAgICAqIHdpbGwgdGhlbiB0YWtlIHRoaXMgc3RhdGUsIGFuZCBxdWVyeSBlYWNoIFN0YXRlIGluc3RhbmNlIGluIHRoZSBzdHlsZQorICAgICAqIGFza2luZyB3aGV0aGVyIGlzSW5TdGF0ZShjLCBzKS48L3A+CisgICAgICoKKyAgICAgKiA8cD5Ob3csIG9ubHkgdGhlIHN0YW5kYXJkIHN0YXRlcyBjYXJlIGFib3V0IHRoZSAicyIgcGFyYW0uIFNvIHdlIGhhdmUKKyAgICAgKiB0aGlzIG9kZCBhcnJhbmdlbWVudDo8L3A+CisgICAgICogPHVsPgorICAgICAqICAgICA8bGk+TmltYnVzU3R5bGUgY2FsbHMgU3RhdGUuaXNJblN0YXRlKGMsIHMpPC9saT4KKyAgICAgKiAgICAgPGxpPlN0YXRlLmlzSW5TdGF0ZShjLCBzKSBzaW1wbHkgZGVsZWdhdGVzIHRvIFN0YXRlLmlzSW5TdGF0ZShjKTwvbGk+CisgICAgICogICAgIDxsaT48ZW0+RVhDRVBUPC9lbT4sIFN0YW5kYXJkU3RhdGUgb3ZlcnJpZGVzIFN0YXRlLmlzSW5TdGF0ZShjLCBzKSBhbmQKKyAgICAgKiAgICAgICAgIHJldHVybnMgZGlyZWN0bHkgZnJvbSB0aGF0IG1ldGhvZCBhZnRlciBjaGVja2luZyBpdHMgc3RhdGUsIGFuZAorICAgICAqICAgICAgICAgZG9lcyBub3QgY2FsbCBpc0luU3RhdGUoYykgKHNpbmNlIGl0IGlzIG5vdCBuZWVkZWQgZm9yIHN0YW5kYXJkIHN0YXRlcykuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIGJvb2xlYW4gaXNJblN0YXRlKFQgYywgaW50IHMpIHsKKyAgICAgICAgcmV0dXJuIGlzSW5TdGF0ZShjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5HZXRzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBKQ29tcG9uZW50IGlzIGluIHRoZSBjdXN0b20gc3RhdGUgcmVwcmVzZW50ZWQKKyAgICAgKiBieSB0aGlzIGNsYXNzLiA8ZW0+VGhpcyBpcyBhbiBleHRyZW1lbHkgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZlIGxvb3AuPC9lbT4KKyAgICAgKiBQbGVhc2UgdGFrZSBwcm9wZXIgcHJlY2F1dGlvbnMgdG8gZW5zdXJlIHRoYXQgaXQgZXhlY3V0ZXMgcXVpY2tseS48L3A+CisgICAgICoKKyAgICAgKiA8cD5OaW1idXMgdXNlcyB0aGlzIG1ldGhvZCB0byBoZWxwIGRldGVybWluZSB3aGF0IHN0YXRlIGEgSkNvbXBvbmVudCBpcworICAgICAqIGluLiBGb3IgZXhhbXBsZSwgYSBjdXN0b20gU3RhdGUgY291bGQgZXhpc3QgZm9yIEpQcm9ncmVzc0JhciBzdWNoIHRoYXQKKyAgICAgKiBpdCB3b3VsZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgcHJvZ3Jlc3MgYmFyIGlzIGluZGV0ZXJtaW5hdGUuCisgICAgICogU3VjaCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB3b3VsZCBzaW1wbHkgYmU6PC9wPgorICAgICAqCisgICAgICogPHByZT48Y29kZT4gcmV0dXJuIGMuaXNJbmRldGVybWluYXRlKCk7PC9jb2RlPjwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIEpDb21wb25lbnQgdG8gdGVzdC4gVGhpcyB3aWxsIG5ldmVyIGJlIG51bGwuCisgICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPmM8L2NvZGU+IGlzIGluIHRoZSBjdXN0b20gc3RhdGUgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiAgICAgICAgIHRoaXMgPGNvZGU+U3RhdGU8L2NvZGU+IGluc3RhbmNlCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNJblN0YXRlKFQgYyk7CisKKyAgICBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0KKworICAgIHN0YXRpYyBib29sZWFuIGlzU3RhbmRhcmRTdGF0ZU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHN0YW5kYXJkU3RhdGVzLmNvbnRhaW5zS2V5KG5hbWUpOworICAgIH0KKworICAgIHN0YXRpYyBTdGFuZGFyZFN0YXRlIGdldFN0YW5kYXJkU3RhdGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHN0YW5kYXJkU3RhdGVzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgU3RhbmRhcmRTdGF0ZSBleHRlbmRzIFN0YXRlPEpDb21wb25lbnQ+IHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc3RhdGU7CisKKyAgICAgICAgcHJpdmF0ZSBTdGFuZGFyZFN0YXRlKGludCBzdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIodG9TdHJpbmcoc3RhdGUpKTsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHN0YW5kYXJkU3RhdGVzLnB1dChnZXROYW1lKCksIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGlzSW5TdGF0ZShKQ29tcG9uZW50IGMsIGludCBzKSB7CisgICAgICAgICAgICByZXR1cm4gKHMgJiBzdGF0ZSkgPT0gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJblN0YXRlKEpDb21wb25lbnQgYykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUaGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHN0YXRlKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN5bnRoQ29uc3RhbnRzLkRFRkFVTFQpID09IFN5bnRoQ29uc3RhbnRzLkRFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJEZWZhdWx0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3ludGhDb25zdGFudHMuRElTQUJMRUQpID09IFN5bnRoQ29uc3RhbnRzLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIGJ1ZmZlci5hcHBlbmQoIisiKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJEaXNhYmxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN5bnRoQ29uc3RhbnRzLkVOQUJMRUQpID09IFN5bnRoQ29uc3RhbnRzLkVOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgYnVmZmVyLmFwcGVuZCgiKyIpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkVuYWJsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTeW50aENvbnN0YW50cy5GT0NVU0VEKSA9PSBTeW50aENvbnN0YW50cy5GT0NVU0VEKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIGJ1ZmZlci5hcHBlbmQoIisiKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJGb2N1c2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3ludGhDb25zdGFudHMuTU9VU0VfT1ZFUikgPT0gU3ludGhDb25zdGFudHMuTU9VU0VfT1ZFUikgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSBidWZmZXIuYXBwZW5kKCIrIik7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiTW91c2VPdmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3ludGhDb25zdGFudHMuUFJFU1NFRCkgPT0gU3ludGhDb25zdGFudHMuUFJFU1NFRCkgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSBidWZmZXIuYXBwZW5kKCIrIik7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiUHJlc3NlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN5bnRoQ29uc3RhbnRzLlNFTEVDVEVEKSA9PSBTeW50aENvbnN0YW50cy5TRUxFQ1RFRCkgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSBidWZmZXIuYXBwZW5kKCIrIik7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiU2VsZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9TdGF0ZUltcGwudGVtcGxhdGUgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvU3RhdGVJbXBsLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGRjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvU3RhdGVJbXBsLnRlbXBsYXRlCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KK3BhY2thZ2UgJHtQQUNLQUdFfTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworCitjbGFzcyAke1NUQVRFX05BTUV9IGV4dGVuZHMgU3RhdGUgeworICAgICR7U1RBVEVfTkFNRX0oKSB7CisgICAgICAgIHN1cGVyKCIke1NUQVRFX0tFWX0iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIGJvb2xlYW4gaXNJblN0YXRlKEpDb21wb25lbnQgYykgeworJHtCT0RZfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL1N5bnRoUGFpbnRlckltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9TeW50aFBhaW50ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiZWM5YQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9TeW50aFBhaW50ZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyODAyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYubmltYnVzOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybTsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLk5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb247CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhDb250ZXh0OworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhQYWludGVyOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhDb25zdGFudHM7CisKK2ltcG9ydCBqYXZheC5zd2luZy5QYWludGVyOworCisKK2NsYXNzIFN5bnRoUGFpbnRlckltcGwgZXh0ZW5kcyBTeW50aFBhaW50ZXIgeworICAgIHByaXZhdGUgTmltYnVzU3R5bGUgc3R5bGU7CisKKyAgICBTeW50aFBhaW50ZXJJbXBsKE5pbWJ1c1N0eWxlIHN0eWxlKSB7CisgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludCB0aGUgcHJvdmlkZWQgcGFpbnRlciB1c2luZyB0aGUgcHJvdmlkZWQgdHJhbnNmb3JtIGF0IHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwb3NpdGlvbiBhbmQgc2l6ZS4gSGFuZGxlcyBpZiBnIGlzIGEgbm9uIDJEIEdyYXBoaWNzIGJ5IHBhaW50aW5nIHZpYSBhCisgICAgICogQnVmZmVyZWRJbWFnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFpbnQoUGFpbnRlciBwLCBTeW50aENvbnRleHQgY3R4LCBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgeworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZyBpbnN0YW5jZW9mIEdyYXBoaWNzMkQpeworICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZ2Z4ID0gKEdyYXBoaWNzMkQpZzsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtIT1udWxsKXsKKyAgICAgICAgICAgICAgICAgICAgZ2Z4LnRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZngudHJhbnNsYXRlKHgsIHkpOworICAgICAgICAgICAgICAgIHAucGFpbnQoZ2Z4LCBjdHguZ2V0Q29tcG9uZW50KCksIHcsIGgpOworICAgICAgICAgICAgICAgIGdmeC50cmFuc2xhdGUoLXgsIC15KTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtIT1udWxsKXsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdmeC50cmFuc2Zvcm0odHJhbnNmb3JtLmNyZWF0ZUludmVyc2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHdlIGFyZSBpbiBjb250cm9sIG9mIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgaW50byB0aGlzIG1ldGhvZCBhbmQgb25seSBldmVyIHBhc3MgaW4gc2ltcGxlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm1zIG9mIHJvdGF0ZSwgZmxpcCBhbmQgdHJhbnNsYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGltYWdlIGlmIHdlIGFyZSBwcmludGluZyB0byBhIEphdmEgMS4xIFByaW50R3JhcGhpY3MgYXMKKyAgICAgICAgICAgICAgICAvLyBpdCBpcyBub3QgYSBpbnN0YW5jZSBvZiBHcmFwaGljczJECisgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWcgPSBuZXcgQnVmZmVyZWRJbWFnZSh3LGgsCisgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOworICAgICAgICAgICAgICAgIEdyYXBoaWNzMkQgZ2Z4ID0gaW1nLmNyZWF0ZUdyYXBoaWNzKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSE9bnVsbCl7CisgICAgICAgICAgICAgICAgICAgIGdmeC50cmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcC5wYWludChnZngsIGN0eC5nZXRDb21wb25lbnQoKSwgdywgaCk7CisgICAgICAgICAgICAgICAgZ2Z4LmRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBnLmRyYXdJbWFnZShpbWcseCx5LG51bGwpOworICAgICAgICAgICAgICAgIGltZyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFpbnRCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjdHgsIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgeworICAgICAgICAvLyBpZiB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY29tcG9uZW50IGlzIDEwMCUgdHJhbnNwYXJlbnQKKyAgICAgICAgLy8gdGhlbiB3ZSBzaG91bGQgbm90IHBhaW50IGFueSBiYWNrZ3JvdW5kIGdyYXBoaWNzLiBUaGlzIGlzIGEgc29sdXRpb24KKyAgICAgICAgLy8gZm9yIHRoZXJlIGJlaW5nIG5vIHdheSBvZiB0dXJuaW5nIG9mZiBOaW1idXMgYmFja2dyb3VuZCBwYWludGluZyBhcworICAgICAgICAvLyBiYXNpYyBjb21wb25lbnRzIGFyZSBhbGwgbm9uLW9wYXF1ZSBieSBkZWZhdWx0LgorICAgICAgICBDb21wb25lbnQgYyA9IGN0eC5nZXRDb21wb25lbnQoKTsKKyAgICAgICAgQ29sb3IgYmcgPSAoYyAhPSBudWxsKSA/IGMuZ2V0QmFja2dyb3VuZCgpIDogbnVsbDsKKyAgICAgICAgaWYgKGJnID09IG51bGwgfHwgYmcuZ2V0QWxwaGEoKSA+IDApeworICAgICAgICAgICAgUGFpbnRlciBiYWNrZ3JvdW5kUGFpbnRlciA9IHN0eWxlLmdldEJhY2tncm91bmRQYWludGVyKGN0eCk7CisgICAgICAgICAgICBpZiAoYmFja2dyb3VuZFBhaW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhaW50KGJhY2tncm91bmRQYWludGVyLCBjdHgsIGcsIHgsIHksIHcsIGgsdHJhbnNmb3JtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYWludEZvcmVncm91bmQoU3ludGhDb250ZXh0IGN0eCwgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtKSB7CisgICAgICAgIFBhaW50ZXIgZm9yZWdyb3VuZFBhaW50ZXIgPSBzdHlsZS5nZXRGb3JlZ3JvdW5kUGFpbnRlcihjdHgpOworICAgICAgICBpZiAoZm9yZWdyb3VuZFBhaW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFpbnQoZm9yZWdyb3VuZFBhaW50ZXIsIGN0eCwgZywgeCwgeSwgdywgaCx0cmFuc2Zvcm0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhaW50Qm9yZGVyKFN5bnRoQ29udGV4dCBjdHgsIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtKSB7CisgICAgICAgIFBhaW50ZXIgYm9yZGVyUGFpbnRlciA9IHN0eWxlLmdldEJvcmRlclBhaW50ZXIoY3R4KTsKKyAgICAgICAgaWYgKGJvcmRlclBhaW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFpbnQoYm9yZGVyUGFpbnRlciwgY3R4LCBnLCB4LCB5LCB3LCBoLHRyYW5zZm9ybSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFpbnRCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjdHgsIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgQ29tcG9uZW50IGMgPSBjdHguZ2V0Q29tcG9uZW50KCk7CisgICAgICAgIGJvb2xlYW4gbHRyID0gYy5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpLmlzTGVmdFRvUmlnaHQoKTsKKyAgICAgICAgLy8gRG9uJ3QgUlRMIGZsaXAgSlNwbGlkZXJzIGFzIHRoZXkgaGFuZGxlIGl0IGludGVybmFseQorICAgICAgICBpZiAoY3R4LmdldENvbXBvbmVudCgpIGluc3RhbmNlb2YgSlNsaWRlcikgbHRyID0gdHJ1ZTsKKworICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gU3dpbmdDb25zdGFudHMuVkVSVElDQUwgJiYgbHRyKSB7CisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS5yb3RhdGUoTWF0aC50b1JhZGlhbnMoOTApKTsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjdHgsIGcsIHksIHgsIGgsIHcsIHRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gU3dpbmdDb25zdGFudHMuVkVSVElDQUwpIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0ucm90YXRlKE1hdGgudG9SYWRpYW5zKDkwKSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKDAsLSh4K3cpKTsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjdHgsIGcsIHksIHgsIGgsIHcsIHRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gU3dpbmdDb25zdGFudHMuSE9SSVpPTlRBTCAmJiBsdHIpIHsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjdHgsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9ob3Jpem9udGFsIGFuZCByaWdodC10by1sZWZ0IG9yaWVudGF0aW9uCisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSh4LHkpOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS50cmFuc2xhdGUoLXcsMCk7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY3R4LCBnLCAwLCAwLCB3LCBoLCB0cmFuc2Zvcm0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhaW50Qm9yZGVyKFN5bnRoQ29udGV4dCBjdHgsIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgQ29tcG9uZW50IGMgPSBjdHguZ2V0Q29tcG9uZW50KCk7CisgICAgICAgIGJvb2xlYW4gbHRyID0gYy5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpLmlzTGVmdFRvUmlnaHQoKTsKKyAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IFN3aW5nQ29uc3RhbnRzLlZFUlRJQ0FMICYmIGx0cikgeworICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBBZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS5zY2FsZSgtMSwgMSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0ucm90YXRlKE1hdGgudG9SYWRpYW5zKDkwKSk7CisgICAgICAgICAgICBwYWludEJvcmRlcihjdHgsIGcsIHksIHgsIGgsIHcsIHRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gU3dpbmdDb25zdGFudHMuVkVSVElDQUwpIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0ucm90YXRlKE1hdGgudG9SYWRpYW5zKDkwKSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKDAsIC0oeCArIHcpKTsKKyAgICAgICAgICAgIHBhaW50Qm9yZGVyKGN0eCwgZywgeSwgMCwgaCwgdywgdHJhbnNmb3JtKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiA9PSBTd2luZ0NvbnN0YW50cy5IT1JJWk9OVEFMICYmIGx0cikgeworICAgICAgICAgICAgcGFpbnRCb3JkZXIoY3R4LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vaG9yaXpvbnRhbCBhbmQgcmlnaHQtdG8tbGVmdCBvcmllbnRhdGlvbgorICAgICAgICAgICAgcGFpbnRCb3JkZXIoY3R4LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYWludEZvcmVncm91bmQoU3ludGhDb250ZXh0IGN0eCwgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBDb21wb25lbnQgYyA9IGN0eC5nZXRDb21wb25lbnQoKTsKKyAgICAgICAgYm9vbGVhbiBsdHIgPSBjLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkuaXNMZWZ0VG9SaWdodCgpOworICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gU3dpbmdDb25zdGFudHMuVkVSVElDQUwgJiYgbHRyKSB7CisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS5yb3RhdGUoTWF0aC50b1JhZGlhbnMoOTApKTsKKyAgICAgICAgICAgIHBhaW50Rm9yZWdyb3VuZChjdHgsIGcsIHksIHgsIGgsIHcsIHRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gU3dpbmdDb25zdGFudHMuVkVSVElDQUwpIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0ucm90YXRlKE1hdGgudG9SYWRpYW5zKDkwKSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKDAsIC0oeCArIHcpKTsKKyAgICAgICAgICAgIHBhaW50Rm9yZWdyb3VuZChjdHgsIGcsIHksIDAsIGgsIHcsIHRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gU3dpbmdDb25zdGFudHMuSE9SSVpPTlRBTCAmJiBsdHIpIHsKKyAgICAgICAgICAgIHBhaW50Rm9yZWdyb3VuZChjdHgsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9ob3Jpem9udGFsIGFuZCByaWdodC10by1sZWZ0IG9yaWVudGF0aW9uCisgICAgICAgICAgICBwYWludEZvcmVncm91bmQoY3R4LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhbiBhcnJvdyBidXR0b24uIEFycm93IGJ1dHRvbnMgYXJlIGNyZWF0ZWQgYnkKKyAgICAgKiBzb21lIGNvbXBvbmVudHMsIHN1Y2ggYXMgPGNvZGU+SlNjcm9sbEJhcjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludEFycm93QnV0dG9uQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIGlmIChjb250ZXh0LmdldENvbXBvbmVudCgpLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkuaXNMZWZ0VG9SaWdodCgpKXsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKHgseSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0uc2NhbGUoLTEsIDEpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSgtdywwKTsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCAwLCAwLCB3LCBoLCB0cmFuc2Zvcm0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYW4gYXJyb3cgYnV0dG9uLiBBcnJvdyBidXR0b25zIGFyZSBjcmVhdGVkIGJ5CisgICAgICogc29tZSBjb21wb25lbnRzLCBzdWNoIGFzIDxjb2RlPkpTY3JvbGxCYXI8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRBcnJvd0J1dHRvbkJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGZvcmVncm91bmQgb2YgYW4gYXJyb3cgYnV0dG9uLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZQorICAgICAqIGZvciBkcmF3aW5nIGEgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgZGlyZWN0aW9uLCB0eXBpY2FsbHkKKyAgICAgKiBhbiBhcnJvdy4gQXJyb3cgYnV0dG9ucyBhcmUgY3JlYXRlZCBieQorICAgICAqIHNvbWUgY29tcG9uZW50cywgc3VjaCBhcyA8Y29kZT5KU2Nyb2xsQmFyPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBPbmUgb2YgU3dpbmdDb25zdGFudHMuTk9SVEgsIFN3aW5nQ29uc3RhbnRzLlNPVVRICisgICAgICogICAgICAgICAgICAgICAgICBTd2luZ0NvbnN0YW50cy5FQVNUIG9yIFN3aW5nQ29uc3RhbnRzLldFU1QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludEFycm93QnV0dG9uRm9yZWdyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgLy9hc3N1bWUgdGhhdCB0aGUgcGFpbnRlciBpcyBhcnJhbmdlZCB3aXRoIHRoZSBhcnJvdyBwb2ludGluZy4uLiBMRUZUPworICAgICAgICBTdHJpbmcgY29tcE5hbWUgPSBjb250ZXh0LmdldENvbXBvbmVudCgpLmdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBsdHIgPSBjb250ZXh0LmdldENvbXBvbmVudCgpLgorICAgICAgICAgICAgICAgIGdldENvbXBvbmVudE9yaWVudGF0aW9uKCkuaXNMZWZ0VG9SaWdodCgpOworICAgICAgICAvLyBUaGUgaGFyZCBjb2RpbmcgZm9yIHNwaW5uZXJzIGhlcmUgbmVlZHMgdG8gYmUgcmVwbGFjZWQgYnkgYSBtb3JlCisgICAgICAgIC8vIGdlbmVyYWwgbWV0aG9kIGZvciBkaXNhYmxpbmcgcm90YXRpb24KKyAgICAgICAgaWYgKCJTcGlubmVyLm5leHRCdXR0b24iLmVxdWFscyhjb21wTmFtZSkgfHwKKyAgICAgICAgICAgICAgICAiU3Bpbm5lci5wcmV2aW91c0J1dHRvbiIuZXF1YWxzKGNvbXBOYW1lKSkgeworICAgICAgICAgICAgaWYgKGx0cil7CisgICAgICAgICAgICAgICAgcGFpbnRGb3JlZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybS50cmFuc2xhdGUodywgMCk7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgICAgICBwYWludEZvcmVncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gU3dpbmdDb25zdGFudHMuV0VTVCkgeworICAgICAgICAgICAgcGFpbnRGb3JlZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTd2luZ0NvbnN0YW50cy5OT1JUSCkgeworICAgICAgICAgICAgaWYgKGx0cil7CisgICAgICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBBZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm0uc2NhbGUoLTEsIDEpOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybS5yb3RhdGUoTWF0aC50b1JhZGlhbnMoOTApKTsKKyAgICAgICAgICAgICAgICBwYWludEZvcmVncm91bmQoY29udGV4dCwgZywgeSwgMCwgaCwgdywgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBBZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm0ucm90YXRlKE1hdGgudG9SYWRpYW5zKDkwKSk7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSgwLCAtKHggKyB3KSk7CisgICAgICAgICAgICAgICAgcGFpbnRGb3JlZ3JvdW5kKGNvbnRleHQsIGcsIHksIDAsIGgsIHcsIHRyYW5zZm9ybSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IFN3aW5nQ29uc3RhbnRzLkVBU1QpIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKHcsIDApOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgIHBhaW50Rm9yZWdyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCB0cmFuc2Zvcm0pOworICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTd2luZ0NvbnN0YW50cy5TT1VUSCkgeworICAgICAgICAgICAgaWYgKGx0cil7CisgICAgICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBBZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm0ucm90YXRlKE1hdGgudG9SYWRpYW5zKC05MCkpOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybS50cmFuc2xhdGUoLWgsIDApOworICAgICAgICAgICAgICAgIHBhaW50Rm9yZWdyb3VuZChjb250ZXh0LCBnLCB5LCB4LCBoLCB3LCB0cmFuc2Zvcm0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybS5zY2FsZSgtMSwgMSk7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtLnJvdGF0ZShNYXRoLnRvUmFkaWFucygtOTApKTsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKC0oaCt5KSwgLSh3K3gpKTsKKyAgICAgICAgICAgICAgICBwYWludEZvcmVncm91bmQoY29udGV4dCwgZywgeSwgeCwgaCwgdywgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIGJ1dHRvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50QnV0dG9uQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgYnV0dG9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRCdXR0b25Cb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBjaGVjayBib3ggbWVudSBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRDaGVja0JveE1lbnVJdGVtQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBjaGVjayBib3ggbWVudSBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRDaGVja0JveE1lbnVJdGVtQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBjaGVjayBib3guCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludENoZWNrQm94QmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIGNoZWNrIGJveC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50Q2hlY2tCb3hCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgY29sb3IgY2hvb3Nlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50Q29sb3JDaG9vc2VyQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgY29sb3IgY2hvb3Nlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50Q29sb3JDaG9vc2VyQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgY29tYm8gYm94LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRDb21ib0JveEJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBpZiAoY29udGV4dC5nZXRDb21wb25lbnQoKS5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpLmlzTGVmdFRvUmlnaHQoKSl7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSh4LHkpOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS50cmFuc2xhdGUoLXcsMCk7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgMCwgMCwgdywgaCwgdHJhbnNmb3JtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgY29tYm8gYm94LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRDb21ib0JveEJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIGRlc2t0b3AgaWNvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50RGVza3RvcEljb25CYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgZGVza3RvcCBpY29uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnREZXNrdG9wSWNvbkJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIGRlc2t0b3AgcGFuZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50RGVza3RvcFBhbmVCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIGRlc2t0b3AgcGFuZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50RGVza3RvcFBhbmVCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGFuIGVkaXRvciBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRFZGl0b3JQYW5lQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYW4gZWRpdG9yIHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludEVkaXRvclBhbmVCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIGZpbGUgY2hvb3Nlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50RmlsZUNob29zZXJCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIGZpbGUgY2hvb3Nlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50RmlsZUNob29zZXJCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIGZvcm1hdHRlZCB0ZXh0IGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRGb3JtYXR0ZWRUZXh0RmllbGRCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIGlmIChjb250ZXh0LmdldENvbXBvbmVudCgpLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkuaXNMZWZ0VG9SaWdodCgpKXsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKHgseSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0uc2NhbGUoLTEsIDEpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSgtdywwKTsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCAwLCAwLCB3LCBoLCB0cmFuc2Zvcm0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBmb3JtYXR0ZWQgdGV4dCBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50Rm9ybWF0dGVkVGV4dEZpZWxkQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBpZiAoY29udGV4dC5nZXRDb21wb25lbnQoKS5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpLmlzTGVmdFRvUmlnaHQoKSl7CisgICAgICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKHgseSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0uc2NhbGUoLTEsIDEpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSgtdywwKTsKKyAgICAgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIDAsIDAsIHcsIGgsIHRyYW5zZm9ybSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYW4gaW50ZXJuYWwgZnJhbWUgdGl0bGUgcGFuZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50SW50ZXJuYWxGcmFtZVRpdGxlUGFuZUJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGFuIGludGVybmFsIGZyYW1lIHRpdGxlIHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludEludGVybmFsRnJhbWVUaXRsZVBhbmVCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhbiBpbnRlcm5hbCBmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50SW50ZXJuYWxGcmFtZUJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGFuIGludGVybmFsIGZyYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRJbnRlcm5hbEZyYW1lQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBsYWJlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50TGFiZWxCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgbGFiZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludExhYmVsQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludExpc3RCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50TGlzdEJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBtZW51IGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50TWVudUJhckJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBtZW51IGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50TWVudUJhckJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBtZW51IGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludE1lbnVJdGVtQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIG1lbnUgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50TWVudUl0ZW1Cb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgbWVudS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50TWVudUJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBtZW51LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRNZW51Qm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhbiBvcHRpb24gcGFuZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50T3B0aW9uUGFuZUJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYW4gb3B0aW9uIHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludE9wdGlvblBhbmVCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgcGFuZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFBhbmVsQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHBhbmVsLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRQYW5lbEJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBwYXNzd29yZCBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50UGFzc3dvcmRGaWVsZEJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBwYXNzd29yZCBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50UGFzc3dvcmRGaWVsZEJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBwb3B1cCBtZW51LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRQb3B1cE1lbnVCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgcG9wdXAgbWVudS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50UG9wdXBNZW51Qm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHByb2dyZXNzIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50UHJvZ3Jlc3NCYXJCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHByb2dyZXNzIGJhci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpbnZva2VzIHRoZQorICAgICAqIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lIHdpdGhvdXQgdGhlIG9yaWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIG9uZSBvZiA8Y29kZT5KUHJvZ3Jlc3NCYXIuSE9SSVpPTlRBTDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlByb2dyZXNzQmFyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFByb2dyZXNzQmFyQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG9yaWVudGF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHByb2dyZXNzIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50UHJvZ3Jlc3NCYXJCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBwcm9ncmVzcyBiYXIuIFRoaXMgaW1wbGVtZW50YXRpb24gaW52b2tlcyB0aGUKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0IHRoZSBvcmllbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiBvbmUgb2YgPGNvZGU+SlByb2dyZXNzQmFyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgIDxjb2RlPkpQcm9ncmVzc0Jhci5WRVJUSUNBTDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRQcm9ncmVzc0JhckJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG9yaWVudGF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGZvcmVncm91bmQgb2YgYSBwcm9ncmVzcyBiYXIuIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgICAqIHByb3ZpZGluZyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBwcm9ncmVzcyBvZiB0aGUgcHJvZ3Jlc3MgYmFyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIG9uZSBvZiA8Y29kZT5KUHJvZ3Jlc3NCYXIuSE9SSVpPTlRBTDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlByb2dyZXNzQmFyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50UHJvZ3Jlc3NCYXJGb3JlZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRGb3JlZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG9yaWVudGF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSByYWRpbyBidXR0b24gbWVudSBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRSYWRpb0J1dHRvbk1lbnVJdGVtQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHJhZGlvIGJ1dHRvbiBtZW51IGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFJhZGlvQnV0dG9uTWVudUl0ZW1Cb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgcmFkaW8gYnV0dG9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRSYWRpb0J1dHRvbkJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSByYWRpbyBidXR0b24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFJhZGlvQnV0dG9uQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHJvb3QgcGFuZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50Um9vdFBhbmVCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgcm9vdCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRSb290UGFuZUJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBzY3JvbGxiYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFNjcm9sbEJhckJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgc2Nyb2xsYmFyLiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMgdGhlCisgICAgICogbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgd2l0aG91dCB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT3JpZW50YXRpb24gb2YgdGhlIEpTY3JvbGxCYXIsIG9uZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2Nyb2xsQmFyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgIDxjb2RlPkpTY3JvbGxCYXIuVkVSVElDQUw8L2NvZGU+CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2Nyb2xsQmFyQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG9yaWVudGF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHNjcm9sbGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2Nyb2xsQmFyQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgc2Nyb2xsYmFyLiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMgdGhlCisgICAgICogbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgd2l0aG91dCB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT3JpZW50YXRpb24gb2YgdGhlIEpTY3JvbGxCYXIsIG9uZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2Nyb2xsQmFyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgIDxjb2RlPkpTY3JvbGxCYXIuVkVSVElDQUw8L2NvZGU+CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2Nyb2xsQmFyQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgdGh1bWIgb2YgYSBzY3JvbGxiYXIuIFRoZSB0aHVtYiBwcm92aWRlcworICAgICAqIGEgZ3JhcGhpY2FsIGluZGljYXRpb24gYXMgdG8gaG93IG11Y2ggb2YgdGhlIENvbXBvbmVudCBpcyB2aXNpYmxlIGluIGEKKyAgICAgKiA8Y29kZT5KU2Nyb2xsUGFuZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT3JpZW50YXRpb24gb2YgdGhlIEpTY3JvbGxCYXIsIG9uZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2Nyb2xsQmFyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgIDxjb2RlPkpTY3JvbGxCYXIuVkVSVElDQUw8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTY3JvbGxCYXJUaHVtYkJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBvcmllbnRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgdGhlIHRodW1iIG9mIGEgc2Nyb2xsYmFyLiBUaGUgdGh1bWIgcHJvdmlkZXMKKyAgICAgKiBhIGdyYXBoaWNhbCBpbmRpY2F0aW9uIGFzIHRvIGhvdyBtdWNoIG9mIHRoZSBDb21wb25lbnQgaXMgdmlzaWJsZSBpbiBhCisgICAgICogPGNvZGU+SlNjcm9sbFBhbmU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9yaWVudGF0aW9uIG9mIHRoZSBKU2Nyb2xsQmFyLCBvbmUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlNjcm9sbEJhci5IT1JJWk9OVEFMPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2Nyb2xsQmFyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2Nyb2xsQmFyVGh1bWJCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBvcmllbnRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSB0cmFjayBvZiBhIHNjcm9sbGJhci4gVGhlIHRyYWNrIGNvbnRhaW5zCisgICAgICogdGhlIHRodW1iLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTY3JvbGxCYXJUcmFja0JhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSB0cmFjayBvZiBhIHNjcm9sbGJhci4gVGhlIHRyYWNrIGNvbnRhaW5zCisgICAgICogdGhlIHRodW1iLiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lIHdpdGhvdXQKKyAgICAgKiB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT3JpZW50YXRpb24gb2YgdGhlIEpTY3JvbGxCYXIsIG9uZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2Nyb2xsQmFyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgIDxjb2RlPkpTY3JvbGxCYXIuVkVSVElDQUw8L2NvZGU+CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2Nyb2xsQmFyVHJhY2tCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIHRoZSB0cmFjayBvZiBhIHNjcm9sbGJhci4gVGhlIHRyYWNrIGNvbnRhaW5zCisgICAgICogdGhlIHRodW1iLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTY3JvbGxCYXJUcmFja0JvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiB0aGUgdHJhY2sgb2YgYSBzY3JvbGxiYXIuIFRoZSB0cmFjayBjb250YWlucworICAgICAqIHRoZSB0aHVtYi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpbnZva2VzIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0CisgICAgICogdGhlIG9yaWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9yaWVudGF0aW9uIG9mIHRoZSBKU2Nyb2xsQmFyLCBvbmUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlNjcm9sbEJhci5IT1JJWk9OVEFMPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2Nyb2xsQmFyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFNjcm9sbEJhclRyYWNrQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHNjcm9sbCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTY3JvbGxQYW5lQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHNjcm9sbCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTY3JvbGxQYW5lQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHNlcGFyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2VwYXJhdG9yQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBzZXBhcmF0b3IuIFRoaXMgaW1wbGVtZW50YXRpb24gaW52b2tlcyB0aGUKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0IHRoZSBvcmllbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiBPbmUgb2YgPGNvZGU+SlNlcGFyYXRvci5IT1JJWk9OVEFMPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlNlcGFyYXRvci5WRVJUSUNBTDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTZXBhcmF0b3JCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgc2VwYXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTZXBhcmF0b3JCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBzZXBhcmF0b3IuIFRoaXMgaW1wbGVtZW50YXRpb24gaW52b2tlcyB0aGUKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0IHRoZSBvcmllbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiBPbmUgb2YgPGNvZGU+SlNlcGFyYXRvci5IT1JJWk9OVEFMPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlNlcGFyYXRvci5WRVJUSUNBTDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTZXBhcmF0b3JCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBvcmllbnRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBmb3JlZ3JvdW5kIG9mIGEgc2VwYXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9uZSBvZiA8Y29kZT5KU2VwYXJhdG9yLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2VwYXJhdG9yLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2VwYXJhdG9yRm9yZWdyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50Rm9yZWdyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBvcmllbnRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgc2xpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTbGlkZXJCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHNsaWRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpbnZva2VzIHRoZQorICAgICAqIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lIHdpdGhvdXQgdGhlIG9yaWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9uZSBvZiA8Y29kZT5KU2xpZGVyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2xpZGVyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFNsaWRlckJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBvcmllbnRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBzbGlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFNsaWRlckJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHNsaWRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpbnZva2VzIHRoZQorICAgICAqIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lIHdpdGhvdXQgdGhlIG9yaWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9uZSBvZiA8Y29kZT5KU2xpZGVyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2xpZGVyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFNsaWRlckJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG9yaWVudGF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHRodW1iIG9mIGEgc2xpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9uZSBvZiA8Y29kZT5KU2xpZGVyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU2xpZGVyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2xpZGVyVGh1bWJCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBpZiAoY29udGV4dC5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAiU2xpZGVyLnBhaW50VGh1bWJBcnJvd1NoYXBlIikgPT0gQm9vbGVhbi5UUlVFKXsKKyAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PSBKU2xpZGVyLkhPUklaT05UQUwpeworICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gSlNsaWRlci5WRVJUSUNBTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBKU2xpZGVyLkhPUklaT05UQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIHRoZSB0aHVtYiBvZiBhIHNsaWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiBPbmUgb2YgPGNvZGU+SlNsaWRlci5IT1JJWk9OVEFMPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlNsaWRlci5WRVJUSUNBTDwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFNsaWRlclRodW1iQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgdHJhY2sgb2YgYSBzbGlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFNsaWRlclRyYWNrQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHRyYWNrIG9mIGEgc2xpZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMKKyAgICAgKiB0aGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgd2l0aG91dCB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT25lIG9mIDxjb2RlPkpTbGlkZXIuSE9SSVpPTlRBTDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkpTbGlkZXIuVkVSVElDQUw8L2NvZGU+CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2xpZGVyVHJhY2tCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIHRoZSB0cmFjayBvZiBhIHNsaWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2xpZGVyVHJhY2tCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgdGhlIHRyYWNrIG9mIGEgc2xpZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMgdGhlCisgICAgICogbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgd2l0aG91dCB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT25lIG9mIDxjb2RlPkpTbGlkZXIuSE9SSVpPTlRBTDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkpTbGlkZXIuVkVSVElDQUw8L2NvZGU+CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U2xpZGVyVHJhY2tCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBvcmllbnRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgc3Bpbm5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U3Bpbm5lckJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSBzcGlubmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTcGlubmVyQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgZGl2aWRlciBvZiBhIHNwbGl0IHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFNwbGl0UGFuZURpdmlkZXJCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgZGl2aWRlciBvZiBhIHNwbGl0IHBhbmUuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKiBpbnZva2VzIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0IHRoZSBvcmllbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiBPbmUgb2YgPGNvZGU+SlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElUPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlNwbGl0UGFuZS5WRVJUSUNBTF9TUExJVDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTcGxpdFBhbmVEaXZpZGVyQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICBpZiAob3JpZW50YXRpb24gPT0gSlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElUKSB7CisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS5yb3RhdGUoTWF0aC50b1JhZGlhbnMoOTApKTsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB5LCB4LCBoLCB3LCB0cmFuc2Zvcm0pOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGZvcmVncm91bmQgb2YgdGhlIGRpdmlkZXIgb2YgYSBzcGxpdCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9uZSBvZiA8Y29kZT5KU3BsaXRQYW5lLkhPUklaT05UQUxfU1BMSVQ8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElUPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U3BsaXRQYW5lRGl2aWRlckZvcmVncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50Rm9yZWdyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGRpdmlkZXIsIHdoZW4gdGhlIHVzZXIgaXMgZHJhZ2dpbmcgdGhlIGRpdmlkZXIsIG9mIGEKKyAgICAgKiBzcGxpdCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9uZSBvZiA8Y29kZT5KU3BsaXRQYW5lLkhPUklaT05UQUxfU1BMSVQ8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5KU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElUPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U3BsaXRQYW5lRHJhZ0RpdmlkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSBzcGxpdCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRTcGxpdFBhbmVCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgc3BsaXQgcGFuZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50U3BsaXRQYW5lQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHRhYmJlZCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUYWJiZWRQYW5lQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHRhYmJlZCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUYWJiZWRQYW5lQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgYXJlYSBiZWhpbmQgdGhlIHRhYnMgb2YgYSB0YWJiZWQgcGFuZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VGFiYmVkUGFuZVRhYkFyZWFCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgYXJlYSBiZWhpbmQgdGhlIHRhYnMgb2YgYSB0YWJiZWQgcGFuZS4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lIHdpdGhvdXQgdGhlCisgICAgICogb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT25lIG9mIDxjb2RlPkpUYWJiZWRQYW5lLlRPUDwvY29kZT4sCisgICAgICogICAgICAgICAgICAgICAgICAgIDxjb2RlPkpUYWJiZWRQYW5lLkxFRlQ8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVGFiYmVkUGFuZS5CT1RUT008L2NvZGU+LCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVGFiYmVkUGFuZS5SSUdIVDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUYWJiZWRQYW5lVGFiQXJlYUJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PSBKVGFiYmVkUGFuZS5MRUZUKSB7CisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS5yb3RhdGUoTWF0aC50b1JhZGlhbnMoOTApKTsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB5LCB4LCBoLCB3LCB0cmFuc2Zvcm0pOworICAgICAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uID09IEpUYWJiZWRQYW5lLlJJR0hUKSB7CisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnJvdGF0ZShNYXRoLnRvUmFkaWFucyg5MCkpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSgwLCAtKHggKyB3KSk7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeSwgMCwgaCwgdywgdHJhbnNmb3JtKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiA9PSBKVGFiYmVkUGFuZS5CT1RUT00pIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKHgseSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0uc2NhbGUoMSwgLTEpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSgwLC1oKTsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCAwLCAwLCB3LCBoLCB0cmFuc2Zvcm0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgdGhlIGFyZWEgYmVoaW5kIHRoZSB0YWJzIG9mIGEgdGFiYmVkIHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRhYmJlZFBhbmVUYWJBcmVhQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIHRoZSBhcmVhIGJlaGluZCB0aGUgdGFicyBvZiBhIHRhYmJlZCBwYW5lLiBUaGlzCisgICAgICogaW1wbGVtZW50YXRpb24gaW52b2tlcyB0aGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgd2l0aG91dCB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT25lIG9mIDxjb2RlPkpUYWJiZWRQYW5lLlRPUDwvY29kZT4sCisgICAgICogICAgICAgICAgICAgICAgICAgIDxjb2RlPkpUYWJiZWRQYW5lLkxFRlQ8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVGFiYmVkUGFuZS5CT1RUT008L2NvZGU+LCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVGFiYmVkUGFuZS5SSUdIVDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUYWJiZWRQYW5lVGFiQXJlYUJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHRhYiBvZiBhIHRhYmJlZCBwYW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHRhYkluZGV4IEluZGV4IG9mIHRhYiBiZWluZyBwYWludGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VGFiYmVkUGFuZVRhYkJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsIEdyYXBoaWNzIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFiSW5kZXgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHRhYiBvZiBhIHRhYmJlZCBwYW5lLiBUaGlzIGltcGxlbWVudGF0aW9uCisgICAgICogaW52b2tlcyB0aGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgd2l0aG91dCB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdGFiSW5kZXggSW5kZXggb2YgdGFiIGJlaW5nIHBhaW50ZWQuCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9uZSBvZiA8Y29kZT5KVGFiYmVkUGFuZS5UT1A8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVGFiYmVkUGFuZS5MRUZUPC9jb2RlPiwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlRhYmJlZFBhbmUuQk9UVE9NPC9jb2RlPiwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlRhYmJlZFBhbmUuUklHSFQ8L2NvZGU+CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VGFiYmVkUGFuZVRhYkJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsIEdyYXBoaWNzIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFiSW5kZXgsIGludCBvcmllbnRhdGlvbikgeworICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gSlRhYmJlZFBhbmUuTEVGVCkgeworICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBBZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS5zY2FsZSgtMSwgMSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0ucm90YXRlKE1hdGgudG9SYWRpYW5zKDkwKSk7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeSwgeCwgaCwgdywgdHJhbnNmb3JtKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiA9PSBKVGFiYmVkUGFuZS5SSUdIVCkgeworICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBBZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS5yb3RhdGUoTWF0aC50b1JhZGlhbnMoOTApKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS50cmFuc2xhdGUoMCwgLSh4ICsgdykpOworICAgICAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHksIDAsIGgsIHcsIHRyYW5zZm9ybSk7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gSlRhYmJlZFBhbmUuQk9UVE9NKSB7CisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSh4LHkpOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKDEsIC0xKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS50cmFuc2xhdGUoMCwtaCk7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgMCwgMCwgdywgaCwgdHJhbnNmb3JtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgdGFiIG9mIGEgdGFiYmVkIHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdGFiSW5kZXggSW5kZXggb2YgdGFiIGJlaW5nIHBhaW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUYWJiZWRQYW5lVGFiQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LCBHcmFwaGljcyBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhYkluZGV4KSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgdGFiIG9mIGEgdGFiYmVkIHBhbmUuIFRoaXMgaW1wbGVtZW50YXRpb24gaW52b2tlcworICAgICAqIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0IHRoZSBvcmllbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB0YWJJbmRleCBJbmRleCBvZiB0YWIgYmVpbmcgcGFpbnRlZC4KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT25lIG9mIDxjb2RlPkpUYWJiZWRQYW5lLlRPUDwvY29kZT4sCisgICAgICogICAgICAgICAgICAgICAgICAgIDxjb2RlPkpUYWJiZWRQYW5lLkxFRlQ8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVGFiYmVkUGFuZS5CT1RUT008L2NvZGU+LCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVGFiYmVkUGFuZS5SSUdIVDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUYWJiZWRQYW5lVGFiQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LCBHcmFwaGljcyBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhYkluZGV4LCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBhcmVhIHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnQgb2YgdGhlCisgICAgICogc2VsZWN0ZWQgdGFiIG9mIGEgdGFiYmVkIHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRhYmJlZFBhbmVDb250ZW50QmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LCBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIHRoZSBhcmVhIHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnQgb2YgdGhlCisgICAgICogc2VsZWN0ZWQgdGFiIG9mIGEgdGFiYmVkIHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRhYmJlZFBhbmVDb250ZW50Qm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LCBHcmFwaGljcyBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIGhlYWRlciBvZiBhIHRhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUYWJsZUhlYWRlckJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgdGhlIGhlYWRlciBvZiBhIHRhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUYWJsZUhlYWRlckJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSB0YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VGFibGVCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgdGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRhYmxlQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHRleHQgYXJlYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VGV4dEFyZWFCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgdGV4dCBhcmVhLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUZXh0QXJlYUJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSB0ZXh0IHBhbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRleHRQYW5lQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHRleHQgcGFuZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VGV4dFBhbmVCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIGEgdGV4dCBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VGV4dEZpZWxkQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBpZiAoY29udGV4dC5nZXRDb21wb25lbnQoKS5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpLmlzTGVmdFRvUmlnaHQoKSl7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSh4LHkpOworICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybS50cmFuc2xhdGUoLXcsMCk7CisgICAgICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgMCwgMCwgdywgaCwgdHJhbnNmb3JtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgdGV4dCBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VGV4dEZpZWxkQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBpZiAoY29udGV4dC5nZXRDb21wb25lbnQoKS5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpLmlzTGVmdFRvUmlnaHQoKSl7CisgICAgICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKHgseSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0uc2NhbGUoLTEsIDEpOworICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSgtdywwKTsKKyAgICAgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIDAsIDAsIHcsIGgsIHRyYW5zZm9ybSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSB0b2dnbGUgYnV0dG9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUb2dnbGVCdXR0b25CYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgdG9nZ2xlIGJ1dHRvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VG9nZ2xlQnV0dG9uQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHRvb2wgYmFyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUb29sQmFyQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgYSB0b29sIGJhci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpbnZva2VzIHRoZQorICAgICAqIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lIHdpdGhvdXQgdGhlIG9yaWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIE9uZSBvZiA8Y29kZT5KVG9vbEJhci5IT1JJWk9OVEFMPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+SlRvb2xCYXIuVkVSVElDQUw8L2NvZGU+CisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VG9vbEJhckJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBvcmllbnRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgYSB0b29sIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VG9vbEJhckJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHRvb2wgYmFyLiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMgdGhlCisgICAgICogbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgd2l0aG91dCB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT25lIG9mIDxjb2RlPkpUb29sQmFyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVG9vbEJhci5WRVJUSUNBTDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUb29sQmFyQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgdG9vbCBiYXIncyBjb250ZW50IGFyZWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRvb2xCYXJDb250ZW50QmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHRvb2wgYmFyJ3MgY29udGVudCBhcmVhLiBUaGlzIGltcGxlbWVudGF0aW9uCisgICAgICogaW52b2tlcyB0aGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgd2l0aG91dCB0aGUgb3JpZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZW50YXRpb24gT25lIG9mIDxjb2RlPkpUb29sQmFyLkhPUklaT05UQUw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5KVG9vbEJhci5WRVJUSUNBTDwvY29kZT4KKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUb29sQmFyQ29udGVudEJhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBvcmllbnRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgdGhlIGNvbnRlbnQgYXJlYSBvZiBhIHRvb2wgYmFyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUb29sQmFyQ29udGVudEJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiB0aGUgY29udGVudCBhcmVhIG9mIGEgdG9vbCBiYXIuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKiBpbnZva2VzIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0IHRoZSBvcmllbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiBPbmUgb2YgPGNvZGU+SlRvb2xCYXIuSE9SSVpPTlRBTDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkpUb29sQmFyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRvb2xCYXJDb250ZW50Qm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIHRvb2wgYmFyIHdoZW4gaXQKKyAgICAgKiBoYXMgYmVlbiBkZXRhY2hlZCBmcm9tIGl0cyBwcmltYXJ5IGZyYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUb29sQmFyRHJhZ1dpbmRvd0JhY2tncm91bmQoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJhY2tncm91bmQoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSB3aW5kb3cgY29udGFpbmluZyB0aGUgdG9vbCBiYXIgd2hlbiBpdAorICAgICAqIGhhcyBiZWVuIGRldGFjaGVkIGZyb20gaXRzIHByaW1hcnkgZnJhbWUuIFRoaXMgaW1wbGVtZW50YXRpb24gaW52b2tlcyB0aGUKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0IHRoZSBvcmllbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiBPbmUgb2YgPGNvZGU+SlRvb2xCYXIuSE9SSVpPTlRBTDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkpUb29sQmFyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRvb2xCYXJEcmFnV2luZG93QmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG9yaWVudGF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIHRvb2wgYmFyIHdoZW4gaXQKKyAgICAgKiBoYXMgYmVlbiBkZXRhY2hlZCBmcm9tIGl0J3MgcHJpbWFyeSBmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VG9vbEJhckRyYWdXaW5kb3dCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBib3JkZXIgb2YgdGhlIHdpbmRvdyBjb250YWluaW5nIHRoZSB0b29sIGJhciB3aGVuIGl0CisgICAgICogaGFzIGJlZW4gZGV0YWNoZWQgZnJvbSBpdCdzIHByaW1hcnkgZnJhbWUuIFRoaXMgaW1wbGVtZW50YXRpb24gaW52b2tlcyB0aGUKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB3aXRob3V0IHRoZSBvcmllbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBvcmllbnRhdGlvbiBPbmUgb2YgPGNvZGU+SlRvb2xCYXIuSE9SSVpPTlRBTDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkpUb29sQmFyLlZFUlRJQ0FMPC9jb2RlPgorICAgICAqIEBzaW5jZSAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRvb2xCYXJEcmFnV2luZG93Qm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgb3JpZW50YXRpb24pIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHRvb2wgdGlwLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUb29sVGlwQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHRvb2wgdGlwLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRUb29sVGlwQm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiBhIHRyZWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRyZWVCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCYWNrZ3JvdW5kKGNvbnRleHQsIGcsIHgsIHksIHcsIGgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYm9yZGVyIG9mIGEgdHJlZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VHJlZUJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHJvdyBjb250YWluaW5nIGEgY2VsbCBpbiBhIHRyZWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRyZWVDZWxsQmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiB0aGUgcm93IGNvbnRhaW5pbmcgYSBjZWxsIGluIGEgdHJlZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFN5bnRoQ29udGV4dCBpZGVudGlmeWluZyB0aGUgPGNvZGU+SkNvbXBvbmVudDwvY29kZT4gYW5kCisgICAgICogICAgICAgIDxjb2RlPlJlZ2lvbjwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gZyA8Y29kZT5HcmFwaGljczwvY29kZT4gdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0geSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gdyBXaWR0aCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhaW50VHJlZUNlbGxCb3JkZXIoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgcGFpbnRCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFpbnRzIHRoZSBmb2N1cyBpbmRpY2F0b3IgZm9yIGEgY2VsbCBpbiBhIHRyZWUgd2hlbiBpdCBoYXMgZm9jdXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFRyZWVDZWxsRm9jdXMoU3ludGhDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIC8vVE9ETworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhaW50cyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgdmlld3BvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTeW50aENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIDxjb2RlPkpDb21wb25lbnQ8L2NvZGU+IGFuZAorICAgICAqICAgICAgICA8Y29kZT5SZWdpb248L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGcgPGNvZGU+R3JhcGhpY3M8L2NvZGU+IHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHggWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKiBAcGFyYW0gaCBIZWlnaHQgb2YgdGhlIGFyZWEgdG8gcGFpbnQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWludFZpZXdwb3J0QmFja2dyb3VuZChTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgICAgICAgIHBhaW50QmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWludHMgdGhlIGJvcmRlciBvZiBhIHZpZXdwb3J0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgU3ludGhDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSA8Y29kZT5KQ29tcG9uZW50PC9jb2RlPiBhbmQKKyAgICAgKiAgICAgICAgPGNvZGU+UmVnaW9uPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSBnIDxjb2RlPkdyYXBoaWNzPC9jb2RlPiB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBwYWludCB0bworICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHBhaW50IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpbnRWaWV3cG9ydEJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICAgICAgICBwYWludEJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvVGFibGVTY3JvbGxQYW5lQ29ybmVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvVGFibGVTY3JvbGxQYW5lQ29ybmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3ZmJmZgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9UYWJsZVNjcm9sbFBhbmVDb3JuZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCitwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYubmltYnVzOworCitpbXBvcnQgamF2YXguc3dpbmcuUGFpbnRlcjsKKworaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuVUlSZXNvdXJjZTsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CisKKy8qKgorICogVGFibGVTY3JvbGxQYW5lQ29ybmVyIC0gQSBzaW1wbGUgY29tcG9uZW50IHRoYXQgcGFpbnRzIGl0c2VsZiB1c2luZyB0aGUgdGFibGUKKyAqIGhlYWRlciBiYWNrZ3JvdW5kIHBhaW50ZXIuIEl0IGlzIHVzZWQgdG8gZmlsbCB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZgorICogc2Nyb2xscGFuZS4KKyAqCisgKiBAYXV0aG9yIENyZWF0ZWQgYnkgSmFzcGVyIFBvdHRzIChKYW4gMjgsIDIwMDgpCisgKi8KK2NsYXNzIFRhYmxlU2Nyb2xsUGFuZUNvcm5lciBleHRlbmRzIEpDb21wb25lbnQgaW1wbGVtZW50cyBVSVJlc291cmNleworCisgICAgLyoqCisgICAgICogUGFpbnQgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgTmltYnVzIFRhYmxlIEhlYWRlciBCYWNrZ3JvdW5kIFBhaW50ZXIKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgeworICAgICAgICBQYWludGVyIHBhaW50ZXIgPSAoUGFpbnRlcikgVUlNYW5hZ2VyLmdldCgKKyAgICAgICAgICAgICJUYWJsZUhlYWRlcjpcIlRhYmxlSGVhZGVyLnJlbmRlcmVyXCJbRW5hYmxlZF0uYmFja2dyb3VuZFBhaW50ZXIiKTsKKyAgICAgICAgaWYgKHBhaW50ZXIgIT0gbnVsbCl7CisgICAgICAgICAgICBpZiAoZyBpbnN0YW5jZW9mIEdyYXBoaWNzMkQpeworICAgICAgICAgICAgICAgIHBhaW50ZXIucGFpbnQoKEdyYXBoaWNzMkQpZyx0aGlzLGdldFdpZHRoKCkrMSxnZXRIZWlnaHQoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHBhaW50IHVzaW5nIGltYWdlIHRvIG5vdCBHcmFwaGljczJEIHRvIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAvLyBKYXZhIDEuMSBwcmludGluZyBBUEkKKyAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGltZyA9ICBuZXcgQnVmZmVyZWRJbWFnZShnZXRXaWR0aCgpLGdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKKyAgICAgICAgICAgICAgICBHcmFwaGljczJEIGcyID0gKEdyYXBoaWNzMkQpaW1nLmdldEdyYXBoaWNzKCk7CisgICAgICAgICAgICAgICAgcGFpbnRlci5wYWludChnMix0aGlzLGdldFdpZHRoKCkrMSxnZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgZzIuZGlzcG9zZSgpOworICAgICAgICAgICAgICAgIGcuZHJhd0ltYWdlKGltZywwLDAsbnVsbCk7CisgICAgICAgICAgICAgICAgaW1nID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9Ub29sQmFyU2VwYXJhdG9yUGFpbnRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL1Rvb2xCYXJTZXBhcmF0b3JQYWludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhNDVlMQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9Ub29sQmFyU2VwYXJhdG9yUGFpbnRlci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLm5pbWJ1czsKKworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYubmltYnVzLkFic3RyYWN0UmVnaW9uUGFpbnRlci5QYWludENvbnRleHQuQ2FjaGVNb2RlOworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OworCisvKioKKyAqIEEgc3BlY2lhbCBwYWludGVyIGltcGxlbWVudGF0aW9uIGZvciB0b29sIGJhciBzZXBhcmF0b3JzIGluIE5pbWJ1cy4KKyAqIFRoZSBkZXNpZ25lciB0b29sIGRvZXNuJ3QgaGF2ZSBzdXBwb3J0IGZvciBwYWludGVycyB3aGljaCByZW5kZXIKKyAqIHJlcGVhdGVkIHBhdHRlcm5zLCBidXQgdGhhdCdzIGV4YWN0bHkgd2hhdCB0aGUgdG9vbGJhciBzZXBhcmF0b3IgZGVzaWduCisgKiBpcyBmb3IgTmltYnVzLiBUaGlzIGN1c3RvbSBwYWludGVyIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSB0aGlzIHNpdHVhdGlvbi4KKyAqIFdoZW4gc3VwcG9ydCBpcyBhZGRlZCB0byB0aGUgZGVzaWduIHRvb2wgLyBjb2RlIGdlbmVyYXRvciB0byBkZWFsIHdpdGgKKyAqIHJlcGVhdGVkIHBhdHRlcm5zLCB0aGVuIHdlIGNhbiByZW1vdmUgdGhpcyBjbGFzcy4KKyAqIDxwPgorICovCitmaW5hbCBjbGFzcyBUb29sQmFyU2VwYXJhdG9yUGFpbnRlciBleHRlbmRzIEFic3RyYWN0UmVnaW9uUGFpbnRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNQQUNFID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVQgPSAyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBhaW50Q29udGV4dCBnZXRQYWludENvbnRleHQoKSB7CisgICAgICAgIC8vdGhlIHBhaW50IGNvbnRleHQgcmV0dXJuZWQgd2lsbCBoYXZlIGEgZmV3IGR1bW15IHZhbHVlcy4gVGhlCisgICAgICAgIC8vaW1wbGVtZW50YXRpb24gb2YgZG9QYWludCBkb2Vzbid0IGJvdGhlciB3aXRoIHRoZSAiZGVjb2RlIiBtZXRob2RzCisgICAgICAgIC8vYnV0IGNhbGN1bGF0ZXMgd2hlcmUgdG8gcGFpbnQgdGhlIGNpcmNsZXMgbWFudWFsbHkuIEFzIHN1Y2gsIHdlCisgICAgICAgIC8vb25seSBuZWVkIHRvIGluZGljYXRlIGluIG91ciBQYWludENvbnRleHQgdGhhdCB3ZSBkb24ndCB3YW50IHRoaXMKKyAgICAgICAgLy90byBldmVyIGJlIGNhY2hlZAorICAgICAgICByZXR1cm4gbmV3IFBhaW50Q29udGV4dCgKKyAgICAgICAgICAgICAgICBuZXcgSW5zZXRzKDEsIDAsIDEsIDApLAorICAgICAgICAgICAgICAgIG5ldyBEaW1lbnNpb24oMzgsIDcpLAorICAgICAgICAgICAgICAgIGZhbHNlLCBDYWNoZU1vZGUuTk9fQ0FDSElORywgMSwgMSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZG9QYWludChHcmFwaGljczJEIGcsIEpDb21wb25lbnQgYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBPYmplY3RbXSBleHRlbmRlZENhY2hlS2V5cykgeworICAgICAgICAvL2l0IGlzIGFzc3VtZWQgdGhhdCBpbiB0aGUgbm9ybWFsIG9yaWVudGF0aW9uIHRoZSBzZXBhcmF0b3IgcmVuZGVycworICAgICAgICAvL2hvcml6b250YWxseS4gT3RoZXIgY29kZSByb3RhdGVzIGl0IGFzIG5lY2Vzc2FyeSBmb3IgYSB2ZXJ0aWNhbAorICAgICAgICAvL3NlcGFyYXRvci4KKyAgICAgICAgZy5zZXRDb2xvcihjLmdldEZvcmVncm91bmQoKSk7CisgICAgICAgIGludCB5ID0gaGVpZ2h0IC8gMjsKKyAgICAgICAgZm9yIChpbnQgaT1JTlNFVDsgaTw9d2lkdGgtSU5TRVQ7IGkrPVNQQUNFKSB7CisgICAgICAgICAgICBnLmZpbGxSZWN0KGksIHksIDEsIDEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL2RvYy1maWxlcy9wcm9wZXJ0aWVzLmh0bWwgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvZG9jLWZpbGVzL3Byb3BlcnRpZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTE3MGM0Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL2RvYy1maWxlcy9wcm9wZXJ0aWVzLmh0bWwKQEAgLTAsMCArMSwyMDcgQEAKKzxodG1sPgorPGhlYWQ+Cis8bGluayBocmVmPSJzdHlsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMSBpZD0icHJpbWFyeUNvbG9ycyI+UHJpbWFyeSBDb2xvcnM8L2gxPgorPHRhYmxlPgorPHRyPjx0aD5LZXk8L3RoPjx0aD5WYWx1ZTwvdGg+PHRoPlByZXZpZXc8L3RoPjwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+Y29udHJvbDwvY29kZT48L3RkPgorPHRkPjxwcmU+I2Q2ZDlkZiAoMjE0LDIxNywyMjMpPC9wcmU+PC90ZD4KKworPHRkIHdpZHRoPSIxMDAiIGJnY29sb3I9IiNkNmQ5ZGYiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPmluZm88L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiNmMmYyYmQgKDI0MiwyNDIsMTg5KTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iI2YyZjJiZCI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+bmltYnVzQWxlcnRZZWxsb3c8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiNmZmRjMjMgKDI1NSwyMjAsMzUpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjZmZkYzIzIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKworPHRkIHdpZHRoPSIyNTAiPjxjb2RlPm5pbWJ1c0Jhc2U8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiMzMzYyOGMgKDUxLDk4LDE0MCk8L3ByZT48L3RkPgorPHRkIHdpZHRoPSIxMDAiIGJnY29sb3I9IiMzMzYyOGMiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPm5pbWJ1c0Rpc2FibGVkVGV4dDwvY29kZT48L3RkPgorPHRkPjxwcmU+IzhlOGY5MSAoMTQyLDE0MywxNDUpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjOGU4ZjkxIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5uaW1idXNGb2N1czwvY29kZT48L3RkPgorPHRkPjxwcmU+IzczYTRkMSAoMTE1LDE2NCwyMDkpPC9wcmU+PC90ZD4KKworPHRkIHdpZHRoPSIxMDAiIGJnY29sb3I9IiM3M2E0ZDEiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPm5pbWJ1c0dyZWVuPC9jb2RlPjwvdGQ+Cis8dGQ+PHByZT4jYjBiMzMyICgxNzYsMTc5LDUwKTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iI2IwYjMzMiI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+bmltYnVzSW5mb0JsdWU8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiMyZjVjYjQgKDQ3LDkyLDE4MCk8L3ByZT48L3RkPgorPHRkIHdpZHRoPSIxMDAiIGJnY29sb3I9IiMyZjVjYjQiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorCis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+bmltYnVzTGlnaHRCYWNrZ3JvdW5kPC9jb2RlPjwvdGQ+Cis8dGQ+PHByZT4jZmZmZmZmICgyNTUsMjU1LDI1NSk8L3ByZT48L3RkPgorPHRkIHdpZHRoPSIxMDAiIGJnY29sb3I9IiNmZmZmZmYiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPm5pbWJ1c09yYW5nZTwvY29kZT48L3RkPgorPHRkPjxwcmU+I2JmNjIwNCAoMTkxLDk4LDQpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjYmY2MjA0Ij4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5uaW1idXNSZWQ8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiNhOTJlMjIgKDE2OSw0NiwzNCk8L3ByZT48L3RkPgorCis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iI2E5MmUyMiI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+bmltYnVzU2VsZWN0ZWRUZXh0PC9jb2RlPjwvdGQ+Cis8dGQ+PHByZT4jZmZmZmZmICgyNTUsMjU1LDI1NSk8L3ByZT48L3RkPgorPHRkIHdpZHRoPSIxMDAiIGJnY29sb3I9IiNmZmZmZmYiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPm5pbWJ1c1NlbGVjdGlvbkJhY2tncm91bmQ8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiMzOTY5OGEgKDU3LDEwNSwxMzgpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjMzk2OThhIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKworPHRkIHdpZHRoPSIyNTAiPjxjb2RlPnRleHQ8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiMwMDAwMDAgKDAsMCwwKTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8aDEgaWQ9InNlY29uZGFyeUNvbG9ycyI+U2Vjb25kYXJ5IENvbG9yczwvaDE+Cis8dGFibGU+Cis8dHI+PHRoPktleTwvdGg+PHRoPlZhbHVlPC90aD48dGg+UHJldmlldzwvdGg+PC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5hY3RpdmVDYXB0aW9uPC9jb2RlPjwvdGQ+CisKKzx0ZD48cHJlPiNiYWJlYzYgKDE4NiwxOTAsMTk4KTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iI2JhYmVjNiI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+YmFja2dyb3VuZDwvY29kZT48L3RkPgorPHRkPjxwcmU+I2Q2ZDlkZiAoMjE0LDIxNywyMjMpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjZDZkOWRmIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5jb250cm9sRGtTaGFkb3c8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiNhNGFiYjggKDE2NCwxNzEsMTg0KTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iI2E0YWJiOCI+Jm5ic3A7PC90ZD4KKworPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5jb250cm9sSGlnaGxpZ2h0PC9jb2RlPjwvdGQ+Cis8dGQ+PHByZT4jZTllY2YyICgyMzMsMjM2LDI0Mik8L3ByZT48L3RkPgorPHRkIHdpZHRoPSIxMDAiIGJnY29sb3I9IiNlOWVjZjIiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPmNvbnRyb2xMSGlnaGxpZ2h0PC9jb2RlPjwvdGQ+Cis8dGQ+PHByZT4jZjdmOGZhICgyNDcsMjQ4LDI1MCk8L3ByZT48L3RkPgorPHRkIHdpZHRoPSIxMDAiIGJnY29sb3I9IiNmN2Y4ZmEiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPmNvbnRyb2xTaGFkb3c8L2NvZGU+PC90ZD4KKworPHRkPjxwcmU+I2NjZDNlMCAoMjA0LDIxMSwyMjQpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjY2NkM2UwIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5jb250cm9sVGV4dDwvY29kZT48L3RkPgorPHRkPjxwcmU+IzAwMDAwMCAoMCwwLDApPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjMDAwMDAwIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5kZXNrdG9wPC9jb2RlPjwvdGQ+Cis8dGQ+PHByZT4jM2Q2MDc5ICg2MSw5NiwxMjEpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjM2Q2MDc5Ij4mbmJzcDs8L3RkPgorCis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPmluYWN0aXZlQ2FwdGlvbjwvY29kZT48L3RkPgorPHRkPjxwcmU+I2JkYzFjOCAoMTg5LDE5MywyMDApPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjYmRjMWM4Ij4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5pbmZvVGV4dDwvY29kZT48L3RkPgorPHRkPjxwcmU+IzAwMDAwMCAoMCwwLDApPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjMDAwMDAwIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5tZW51PC9jb2RlPjwvdGQ+CisKKzx0ZD48cHJlPiNlZGVmZjIgKDIzNywyMzksMjQyKTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iI2VkZWZmMiI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+bWVudVRleHQ8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiMwMDAwMDAgKDAsMCwwKTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+bmltYnVzQmx1ZUdyZXk8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiNhOWIwYmUgKDE2OSwxNzYsMTkwKTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iI2E5YjBiZSI+Jm5ic3A7PC90ZD4KKworPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT5uaW1idXNCb3JkZXI8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiM5Mjk3YTEgKDE0NiwxNTEsMTYxKTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iIzkyOTdhMSI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+bmltYnVzU2VsZWN0aW9uPC9jb2RlPjwvdGQ+Cis8dGQ+PHByZT4jMzk2OThhICg1NywxMDUsMTM4KTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iIzM5Njk4YSI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+c2Nyb2xsYmFyPC9jb2RlPjwvdGQ+CisKKzx0ZD48cHJlPiNjZGQwZDUgKDIwNSwyMDgsMjEzKTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iI2NkZDBkNSI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgd2lkdGg9IjI1MCI+PGNvZGU+dGV4dEJhY2tncm91bmQ8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiMzOTY5OGEgKDU3LDEwNSwxMzgpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjMzk2OThhIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT50ZXh0Rm9yZWdyb3VuZDwvY29kZT48L3RkPgorPHRkPjxwcmU+IzAwMDAwMCAoMCwwLDApPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjMDAwMDAwIj4mbmJzcDs8L3RkPgorCis8L3RyPgorPHRyPgorPHRkIHdpZHRoPSIyNTAiPjxjb2RlPnRleHRIaWdobGlnaHQ8L2NvZGU+PC90ZD4KKzx0ZD48cHJlPiMzOTY5OGEgKDU3LDEwNSwxMzgpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjMzk2OThhIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT50ZXh0SGlnaGxpZ2h0VGV4dDwvY29kZT48L3RkPgorPHRkPjxwcmU+I2ZmZmZmZiAoMjU1LDI1NSwyNTUpPC9wcmU+PC90ZD4KKzx0ZCB3aWR0aD0iMTAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB3aWR0aD0iMjUwIj48Y29kZT50ZXh0SW5hY3RpdmVUZXh0PC9jb2RlPjwvdGQ+CisKKzx0ZD48cHJlPiM4ZThmOTEgKDE0MiwxNDMsMTQ1KTwvcHJlPjwvdGQ+Cis8dGQgd2lkdGg9IjEwMCIgYmdjb2xvcj0iIzhlOGY5MSI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvcGFja2FnZS5odG1sIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNhMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEwMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzwhLS0KK0NvcHlyaWdodCAxOTk4LTIwMDEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK0RPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKworVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKK3BhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKK2J5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCitUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKK0FOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCit2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKK0NBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCitoYXZlIGFueSBxdWVzdGlvbnMuCistLT4KKworPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCitQcm92aWRlcyB1c2VyIGludGVyZmFjZSBvYmplY3RzIGJ1aWx0IGFjY29yZGluZyB0byB0aGUgY3Jvc3MtcGxhdGZvcm0KK05pbWJ1cyBsb29rIGFuZCBmZWVsLgorCis8cD5OaW1idXMgdXNlcyBpbnN0YW5jZXMgb2YgdGhlIHtAbGluayBqYXZheC5zd2luZy5QYWludGVyfSBpbnRlcmZhY2UgdG8gcGFpbnQKK2NvbXBvbmVudHMuIFdpdGggZWFjaCBTd2luZyBjb21wb25lbnQgaXQgYXNzb2NpYXRlcyBhIGZvcmVncm91bmQgYW5kIGEKK2JhY2tncm91bmQge0Bjb2RlIFBhaW50ZXJ9LCBhbmQgdGhlcmUgbWF5IGJlIHNldmVyYWwgcGFpbnRlcnMgZm9yIGRpZmZlcmVudAorY29tcG9uZW50IHN0YXRlcy4KKworPHA+TmltYnVzIGFsbG93cyBjdXN0b21pemluZyBtYW55IG9mIGl0cyBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgcGFpbnRlcnMsIGJ5CithbHRlcmluZyB0aGUge0BsaW5rIFVJRGVmYXVsdHN9IHRhYmxlLiBIZXJlJ3MgYW4gZXhhbXBsZToKKzxjb2RlPjxwcmU+CisgICAgVUlNYW5hZ2VyLnB1dCgiUHJvZ3Jlc3NCYXIudGlsZVdpZHRoIiwgbXlUaWxlV2lkdGgpOworICAgIFVJTWFuYWdlci5wdXQoIlByb2dyZXNzQmFyW0VuYWJsZWRdLmJhY2tncm91bmRQYWludGVyIiwgbXlCZ1BhaW50ZXIpOworICAgIFVJTWFuYWdlci5wdXQoIlByb2dyZXNzQmFyW0VuYWJsZWRdLmZvcmVncm91bmRQYWludGVyIiwgbXlGZ1BhaW50ZXIpOworPC9wcmU+PC9jb2RlPgorCis8cD5QZXItY29tcG9uZW50IGN1c3RvbWl6YXRpb24gaXMgYWxzbyBwb3NzaWJsZS4gV2hlbiByZW5kZXJpbmcgYSBjb21wb25lbnQsCitOaW1idXMgY2hlY2tzIGl0cyBjbGllbnQgcHJvcGVydHkgbmFtZWQgIk5pbWJ1cy5PdmVycmlkZXMiLiBUaGUgdmFsdWUgb2YgdGhpcworcHJvcGVydHkgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIHtAY29kZSBVSURlZmF1bHRzfS4gU2V0dGluZ3MgZnJvbSB0aGF0IHRhYmxlCitvdmVycmlkZSB0aGUgVUlNYW5hZ2VyIHNldHRpbmdzLCBidXQgZm9yIHRoYXQgcGFydGljdWxhciBjb21wb25lbnQgaW5zdGFuY2UKK29ubHkuIEFuIG9wdGlvbmFsIGNsaWVudCBwcm9wZXJ0eSwgIk5pbWJ1cy5PdmVycmlkZXMuSW5oZXJpdERlZmF1bHRzIiBvZiB0eXBlCitCb29sZWFuLCBzcGVjaWZpZXMgd2hldGhlciB0aGUgb3ZlcnJpZGluZyBzZXR0aW5ncyBzaG91bGQgYmUgbWVyZ2VkIHdpdGgKK2RlZmF1bHQgb25lcyAoe0Bjb2RlIHRydWV9KSwgb3IgcmVwbGFjZSB0aGVtICh7QGNvZGUgZmFsc2V9KS4gQnkgZGVmYXVsdCB0aGV5CithcmUgbWVyZ2VkOgorPGNvZGU+PHByZT4KKyAgICBKUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IEpQcm9ncmVzc0JhcigpOworICAgIFVJRGVmYXVsdHMgb3ZlcnJpZGVzID0gbmV3IFVJRGVmYXVsdHMoKTsKKyAgICBvdmVycmlkZXMucHV0KCJQcm9ncmVzc0Jhci5jeWNsZVRpbWUiLCAzMzApOworICAgIC4uLgorICAgIGJhci5wdXRDbGllbnRQcm9wZXJ0eSgiTmltYnVzLk92ZXJyaWRlcyIsIG92ZXJyaWRlcyk7CisgICAgYmFyLnB1dENsaWVudFByb3BlcnR5KCJOaW1idXMuT3ZlcnJpZGVzLkluaGVyaXREZWZhdWx0cyIsIGZhbHNlKTsKKzwvcHJlPjwvY29kZT4KKworPHA+Q29sb3JzIGluIE5pbWJ1cyBhcmUgZGVyaXZlZCBmcm9tIGEgY29yZSBzZXQgb2YKKzxhIGhyZWY9ImRvYy1maWxlcy9wcm9wZXJ0aWVzLmh0bWwjcHJpbWFyeUNvbG9ycyI+cHJpbWFyeSBjb2xvcnM8L2E+LiBUaGVyZSBhcmUgYWxzbworPGEgaHJlZj0iZG9jLWZpbGVzL3Byb3BlcnRpZXMuaHRtbCNzZWNvbmRhcnlDb2xvcnMiPnNlY29uZGFyeSBjb2xvcnM8L2E+LCB3aGljaCBhcmUKK2Rlcml2ZWQgZnJvbSBwcmltYXJ5IG9uZXMsIGJ1dCBzZXJ2ZSB0aGVtc2VsdmVzIGFzIGJhc2UgY29sb3JzIGZvciBvdGhlcgorZGVyaXZlZCBjb2xvcnMuIFRoZSBkZXJpdmF0aW9uIG1lY2hhbmlzbSBhbGxvd3MgZm9yIHJ1bnRpbWUgY3VzdG9taXphdGlvbiwKK2kuZS4gaWYgYSBwcmltYXJ5IG9yIHNlY29uZGFyeSBjb2xvciBpcyBjaGFuZ2VkLCBhbGwgY29sb3JzIHRoYXQgYXJlIGRlcml2ZWQKK2Zyb20gaXQgYXJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC4gVGhlIG1ldGhvZAore0BsaW5rIGphdmF4LnN3aW5nLnBsYWYubmltYnVzLk5pbWJ1c0xvb2tBbmRGZWVsI2dldERlcml2ZWRDb2xvcihqYXZhLmxhbmcuU3RyaW5nLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBpbnQsIGJvb2xlYW4pfQorbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGEgZGVyaXZlZCBjb2xvci4KKworPHA+VGhlc2UgY2xhc3NlcyBhcmUgZGVzaWduZWQgdG8gYmUgdXNlZCB3aGlsZSB0aGUKK2NvcnJlc3BvbmRpbmcgPGNvZGU+TG9va0FuZEZlZWw8L2NvZGU+IGNsYXNzIGhhcyBiZWVuCitpbnN0YWxsZWQKKyg8Y29kZT5VSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwobmV3IDxpPlhYWDwvaT5Mb29rQW5kRmVlbCgpKTwvY29kZT4pLgorVXNpbmcgdGhlbSB3aGlsZSBhIGRpZmZlcmVudCA8Y29kZT5Mb29rQW5kRmVlbDwvY29kZT4gaXMgaW5zdGFsbGVkCittYXkgcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMsIGluY2x1ZGluZyBleGNlcHRpb25zLgorQWRkaXRpb25hbGx5LCBjaGFuZ2luZyB0aGUgPGNvZGU+TG9va0FuZEZlZWw8L2NvZGU+CittYWludGFpbmVkIGJ5IHRoZSA8Y29kZT5VSU1hbmFnZXI8L2NvZGU+IHdpdGhvdXQgdXBkYXRpbmcgdGhlCitjb3JyZXNwb25kaW5nIDxjb2RlPkNvbXBvbmVudFVJPC9jb2RlPiBvZiBhbnkKKzxjb2RlPkpDb21wb25lbnQ8L2NvZGU+cyBtYXkgYWxzbyBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cywKK3N1Y2ggYXMgdGhlIHdyb25nIGNvbG9ycyBzaG93aW5nIHVwLCBhbmQgaXMgZ2VuZXJhbGx5IG5vdAorZW5jb3VyYWdlZC4KKworPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgorTW9zdCBvZiB0aGUgU3dpbmcgQVBJIGlzIDxlbT5ub3Q8L2VtPiB0aHJlYWQgc2FmZS4KK0ZvciBkZXRhaWxzLCBzZWUKKzxhCitocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvdWlzd2luZy9vdmVydmlldy90aHJlYWRzLmh0bWwiCit0YXJnZXQ9Il90b3AiPlRocmVhZHMgYW5kIFN3aW5nPC9hPiwKK2Egc2VjdGlvbiBpbgorPGVtPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC8iCit0YXJnZXQ9Il90b3AiPlRoZSBKYXZhIFR1dG9yaWFsPC9hPjwvZW0+LgorCitAc2luY2UgMS43CitAc2VyaWFsIGV4Y2x1ZGUKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL3NraW4ubGFmIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL3NraW4ubGFmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjg2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvc2tpbi5sYWYKQEAgLTAsMCArMSwyODMzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPCEtLQorIENvcHlyaWdodCAxOTk4LTIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorCisgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorIGhhdmUgYW55IHF1ZXN0aW9ucy4KKy0tPgorCis8c3ludGhNb2RlbD4KKyAgIDxpbnNldHM+CisgICAgICA8dWlJbnNldHMgbmFtZT0iemVyb0luc2V0cyI+CisgICAgICAgICA8aW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgPC91aUluc2V0cz4KKyAgICAgIDx1aUluc2V0cyBuYW1lPSJ0d29JbnNldHMiPgorICAgICAgICAgPGluc2V0cyB0b3A9IjIiIGJvdHRvbT0iMiIgbGVmdD0iMiIgcmlnaHQ9IjIiLz4KKyAgICAgIDwvdWlJbnNldHM+CisgICAgICA8dWlJbnNldHMgbmFtZT0idGhyZWVJbnNldHMiPgorICAgICAgICAgPGluc2V0cyB0b3A9IjMiIGJvdHRvbT0iMyIgbGVmdD0iMyIgcmlnaHQ9IjMiLz4KKyAgICAgIDwvdWlJbnNldHM+CisgICA8L2luc2V0cz4KKyAgIDxjb2xvcnM+CisgICAgICA8dWlDb2xvciBuYW1lPSJ0ZXh0Ij4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJjb250cm9sIj4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJuaW1idXNCYXNlIj4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iOTgiIGJsdWU9IjE0MCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0ibmltYnVzQmx1ZUdyZXkiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMTY5IiBncmVlbj0iMTc2IiBibHVlPSIxOTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyNTE4Nzk3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0ibmltYnVzT3JhbmdlIj4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MSIgZ3JlZW49Ijk4IiBibHVlPSI0IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJuaW1idXNHcmVlbiI+CisgICAgICAgICA8bWF0dGUgcmVkPSIxNzYiIGdyZWVuPSIxNzkiIGJsdWU9IjUwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJuaW1idXNSZWQiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMTY5IiBncmVlbj0iNDYiIGJsdWU9IjM0IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJuaW1idXNCb3JkZXIiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMTQ2IiBncmVlbj0iMTUxIiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE3MzU4NjE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMTM3MjU0OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9Im5pbWJ1c1NlbGVjdGlvbiI+CisgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAxMDc1MDQ3MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ4NzU3NzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9Im5pbWJ1c0luZm9CbHVlIj4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjQ3IiBncmVlbj0iOTIiIGJsdWU9IjE4MCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0ibmltYnVzQWxlcnRZZWxsb3ciPgorICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjIwIiBibHVlPSIzNSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0ibmltYnVzRm9jdXMiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCI+CisgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0ibmltYnVzU2VsZWN0aW9uQmFja2dyb3VuZCI+CisgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCI+CisgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0iaW5mb1RleHQiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9InRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9ImluZm8iPgorICAgICAgICAgPG1hdHRlIHJlZD0iMjQyIiBncmVlbj0iMjQyIiBibHVlPSIxODkiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9Im1lbnVUZXh0Ij4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJ0ZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJtZW51Ij4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjIzNyIgZ3JlZW49IjIzOSIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTUwNTMxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM5OTk5OTk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0ic2Nyb2xsYmFyIj4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNSIgZ3JlZW49IjIwOCIgYmx1ZT0iMjEzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3Mjk2NzYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA5MDE5NjA3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0iY29udHJvbFRleHQiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9InRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9ImNvbnRyb2xIaWdobGlnaHQiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJjb250cm9sTEhpZ2hsaWdodCI+CisgICAgICAgICA8bWF0dGUgcmVkPSIyNDciIGdyZWVuPSIyNDgiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTg1MjYzMTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9ImNvbnRyb2xTaGFkb3ciPgorICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjExIiBibHVlPSIyMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyMTI0MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICAgPHVpQ29sb3IgbmFtZT0iY29udHJvbERrU2hhZG93Ij4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDE4MzA2NjczIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9InRleHRIaWdobGlnaHQiPgorICAgICAgICAgPG1hdHRlIHJlZD0iNTciIGdyZWVuPSIxMDUiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzU2VsZWN0aW9uQmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0idGV4dEhpZ2hsaWdodFRleHQiPgorICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC91aUNvbG9yPgorICAgICAgPHVpQ29sb3IgbmFtZT0idGV4dEluYWN0aXZlVGV4dCI+CisgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICAgICA8dWlDb2xvciBuYW1lPSJkZXNrdG9wIj4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjYxIiBncmVlbj0iOTYiIGJsdWU9IjEyMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDkyMDcyNDkiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEzOTg0NjUzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNzQ1MDk4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9ImFjdGl2ZUNhcHRpb24iPgorICAgICAgICAgPG1hdHRlIHJlZD0iMTg2IiBncmVlbj0iMTkwIiBibHVlPSIxOTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ5OTIwMjUzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzMTM3MjU0NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdWlDb2xvcj4KKyAgICAgIDx1aUNvbG9yIG5hbWU9ImluYWN0aXZlQ2FwdGlvbiI+CisgICAgICAgICA8bWF0dGUgcmVkPSIxODkiIGdyZWVuPSIxOTMiIGJsdWU9IjIwMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA1MDUwNTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1NTUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L3VpQ29sb3I+CisgICA8L2NvbG9ycz4KKyAgIDxmb250cz4KKyAgICAgIDx1aUZvbnQgbmFtZT0iSW50ZXJuYWxGcmFtZS50aXRsZUZvbnQiPgorICAgICAgICA8dHlwZWZhY2UgdWlEZWZhdWx0UGFyZW50TmFtZT0iZGVmYXVsdEZvbnQiIGJvbGQ9Ik9uIi8+CisgICAgICA8L3VpRm9udD4KKyAgIDwvZm9udHM+CisgICA8c3R5bGU+CisgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0idGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgIDx0ZXh0QmFja2dyb3VuZD4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iMTA1IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbkJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgIDwvdGV4dEJhY2tncm91bmQ+CisgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJjb250cm9sIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICA8L2JhY2tncm91bmQ+CisgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgIDxpbmhlcml0LXRleHRCYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRCYWNrZ3JvdW5kPgorICAgICAgPGluaGVyaXQtYmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC1iYWNrZ3JvdW5kPgorICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9IlRpdGxlZEJvcmRlci5wb3NpdGlvbiIgdHlwZT0iU1RSSU5HIiB2YWx1ZT0iQUJPVkVfVE9QIi8+CisgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iRmlsZVZpZXcuZnVsbFJvd1NlbGVjdGlvbiIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9IlRSVUUiLz4KKyAgICAgIDwvdWlwcm9wZXJ0aWVzPgorICAgPC9zdHlsZT4KKyAgIDxjb21wb25lbnRzPgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhBcnJvd0J1dHRvbiIgbmFtZT0iQXJyb3dCdXR0b24iIHVpPSJTeW50aEFycm93QnV0dG9uVUkiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InNpemUiIHR5cGU9IklOVCIgdmFsdWU9IjE2Ii8+CisgICAgICAgICAgICA8L3VpcHJvcGVydGllcz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjciIGdyZWVuPSIxNzEiIGJsdWU9IjE3OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyNzQwODg5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTczOTE2NTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ5MDE5NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMi4wIiBjcDF4PSI4LjAiIGNwMXk9IjIuMCIgY3AyeD0iOC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjUuMCIgY3AxeD0iMi4wIiBjcDF5PSI1LjAiIGNwMng9IjIuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSI4LjAiIGNwMXg9IjguMCIgY3AxeT0iOC4wIiBjcDJ4PSI4LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0NSIgZ3JlZW49IjQ1IiBibHVlPSI0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzcyNTQ5MDYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjIuMCIgY3AxeD0iOC4wIiBjcDF5PSIyLjAiIGNwMng9IjguMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI1LjAiIGNwMXg9IjIuMCIgY3AxeT0iNS4wIiBjcDJ4PSIyLjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iOC4wIiBjcDF4PSI4LjAiIGNwMXk9IjguMCIgY3AyeD0iOC4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9mb3JlZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpCdXR0b24iIG5hbWU9IkJ1dHRvbiIgdWk9IkJ1dHRvblVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjYiIGJvdHRvbT0iNiIgbGVmdD0iMTQiIHJpZ2h0PSIxNCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImRlZmF1bHRCdXR0b25Gb2xsb3dzRm9jdXMiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEZWZhdWx0Ij4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTA0IiBoZWlnaHQ9IjMzIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSI3IiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiBMYXllciI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjEwMS4wIiB5MT0iMy4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjcuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ2IiBncmVlbj0iMjQ4IiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzEzNzI1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2IiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMyIgZ3JlZW49IjIzMCIgYmx1ZT0iMjM3IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU3NjY0MjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzgwMzkyMTMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE4NCIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYzIiBncmVlbj0iMTg0IiBibHVlPSIyMDMiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQzODY2OTk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0NzA1ODgxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTYiIG1pZHBvaW50PSIwLjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkzIiBncmVlbj0iMjE0IiBibHVlPSIyMzMiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2NDA0MDQ2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM2NDcwNTg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTMiIGdyZWVuPSIyMzQiIGJsdWU9IjI1MyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDc3NjExNTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDQzMTM3MjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTgiIGdyZWVuPSIxMTkiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM0NTg1OTIzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNCIgZ3JlZW49IjU1IiBibHVlPSI3NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NTE3Mzc3NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjU4ODIzNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIzLjAiIHkyPSIzMi4wIiByb3VuZGluZz0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MiIgZ3JlZW49Ijk0IiBibHVlPSI5NiIgYWxwaGE9IjY1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0xOTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGVmYXVsdCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NiIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjMiIGdyZWVuPSIyMzAiIGJsdWU9IjIzNyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NzY2NDI2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM4MDM5MjEzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIxODQiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDM4NjY5OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE4NCIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk2IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MyIgZ3JlZW49IjIxNCIgYmx1ZT0iMjMzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjQwNDA0NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNjQ3MDU4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEzIiBncmVlbj0iMjM0IiBibHVlPSIyNTMiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3NzYxMTU0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ0MzEzNzIzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMi4wIiB5Mj0iMzEuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk4IiBncmVlbj0iMTE5IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNDU4NTkyMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzQiIGdyZWVuPSI1NSIgYmx1ZT0iNzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTUxNzM3NzYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI1ODgyMzU0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjEwMy40IiB5MT0iMC42IiB5Mj0iMzIuNCIgcm91bmRpbmc9IjExLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitEZWZhdWx0Ij4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTg0MTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzAiIGdyZWVuPSIyMzciIGJsdWU9IjI0MyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTcyODU5NDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU4MjIxNjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDAzOTIxNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjIwMyIgYmx1ZT0iMjIyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTU1MzQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyMTU2ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjIwMyIgYmx1ZT0iMjIyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTU1MzQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyMTU2ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTIiIGdyZWVuPSIyMzMiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDc2OTg0MTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMiIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDY0MTU4OTIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU0NTUxODIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTkiIGdyZWVuPSI4NSIgYmx1ZT0iMTA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxMzQ4MzE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTc2OTk4NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTIxNTY4NjUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iNSIgYmx1ZT0iMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNTkyNzkzODIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDM1Mjk0MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIzLjAiIHkyPSIzMi4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkyIiBncmVlbj0iOTQiIGJsdWU9Ijk2IiBhbHBoYT0iNjUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY4ODU5NjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM2ODYyNzQ2IiBhbHBoYU9mZnNldD0iLTE5MCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIrRGVmYXVsdCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTg0MTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzAiIGdyZWVuPSIyMzciIGJsdWU9IjI0MyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTcyODU5NDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU4MjIxNjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDAzOTIxNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjIwMyIgYmx1ZT0iMjIyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTU1MzQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyMTU2ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjIwMyIgYmx1ZT0iMjIyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTU1MzQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyMTU2ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTIiIGdyZWVuPSIyMzMiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDc2OTg0MTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMiIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDY0MTU4OTIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU0NTUxODIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTkiIGdyZWVuPSI4NSIgYmx1ZT0iMTA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxMzQ4MzE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTc2OTk4NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTIxNTY4NjUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iNSIgYmx1ZT0iMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNTkyNzkzODIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDM1Mjk0MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iMTAzLjQiIHkxPSIwLjYiIHkyPSIzMi40IiByb3VuZGluZz0iMTEuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtEZWZhdWx0Ij4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzU2VsZWN0ZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MyIgZ3JlZW49IjE2OSIgYmx1ZT0iMTkyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTQuMjAzMzE5NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzgwNTA1OTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTgiIGdyZWVuPSIxNDkiIGJsdWU9IjE3OCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxOTAzODMyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yOTg2MzU2MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNDkwMTk2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49Ijk4IiBibHVlPSIxNDAiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNyIgbWlkcG9pbnQ9IjAuNiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49Ijk4IiBibHVlPSIxNDAiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTYiIG1pZHBvaW50PSIwLjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTEiIGdyZWVuPSIxMzciIGJsdWU9IjE4MCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxODcyNzE4MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTQxMjY5ODYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTU2ODYyNzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExOCIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA2IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iOC45Mzc3MTY1RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yMDg1Mjk4MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMi4wIiB5Mj0iMzEuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI4IiBncmVlbj0iNTYiIGJsdWU9IjgxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0zLjUyODU5NUUtNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTg2MDY3MjIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzMTM3MjU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMy4wIiB5Mj0iMzIuMCIgcm91bmRpbmc9IjEyLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIxNjAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTk1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrRGVmYXVsdCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjciIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDMiIGdyZWVuPSIxNjkiIGJsdWU9IjE5MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii00LjIwMzMxOTVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4MDUwNTk1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwMzkyMTU2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYiIG1pZHBvaW50PSIwLjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE4IiBncmVlbj0iMTQ5IiBibHVlPSIxNzgiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTkwMzgzMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjk4NjM1NjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ5MDE5NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTEiIGdyZWVuPSI5OCIgYmx1ZT0iMTQwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTEiIGdyZWVuPSI5OCIgYmx1ZT0iMTQwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk2IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkxIiBncmVlbj0iMTM3IiBibHVlPSIxODAiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTg3MjcxODMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE0MTI2OTg2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTgiIGdyZWVuPSIxNjQiIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjguOTM3NzE2NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjA4NTI5ODMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyOCIgZ3JlZW49IjU2IiBibHVlPSI4MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMy41Mjg1OTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDE4NjA2NzIyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzEzNzI1NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjYiIHgyPSIxMDMuNCIgeTE9IjAuNiIgeTI9IjMyLjQiIHJvdW5kaW5nPSIxMS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNyIgZ3JlZW49IjIyOSIgYmx1ZT0iMjMzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4NDc3NTI0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2ODYyNzQ0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIzIiBncmVlbj0iMjI2IiBibHVlPSIyMzAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxNTg3Mjk1NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDgwMDkxNTM2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzAxNjc1NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTYiIGdyZWVuPSIyMTkiIGJsdWU9IjIyNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzA1MjYzMiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMzcyNTQ5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTgiIGdyZWVuPSIyMjEiIGJsdWU9IjIyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzA4Nzg3NDQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ1MDk4MDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAxIiBncmVlbj0iMjA0IiBibHVlPSIyMTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY3NjY5MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODgiIGdyZWVuPSIxOTEiIGJsdWU9IjE5NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQ4NDEwMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMjc0NTA5NzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIzLjAiIHkyPSIzMi4wIiByb3VuZGluZz0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MiIgZ3JlZW49Ijk0IiBibHVlPSI5NiIgYWxwaGE9IjIzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0yMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjciIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA2NTU4MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQzMTM3MjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDEiIGdyZWVuPSIyNDIiIGJsdWU9IjI0NCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5ODIzMTIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIxMTc2NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDQiIGdyZWVuPSIyNDciIGJsdWU9IjI1MyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NDk1MzIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMi4wIiB5Mj0iMzEuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1NSIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wNTU1NTU1MjIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzU2NDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAxOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg1IiBncmVlbj0iODgiIGJsdWU9Ijk0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAxNDc4MTYzMTUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM3NjQ3MDYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIzLjAiIHkyPSIzMi4wIiByb3VuZGluZz0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MiIgZ3JlZW49Ijk0IiBibHVlPSI5NiIgYWxwaGE9IjY1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0xOTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjciIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA2NTU4MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQzMTM3MjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDEiIGdyZWVuPSIyNDIiIGJsdWU9IjI0NCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5ODIzMTIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIxMTc2NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDQiIGdyZWVuPSIyNDciIGJsdWU9IjI1MyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NDk1MzIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMi4wIiB5Mj0iMzEuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1NSIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wNTU1NTU1MjIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzU2NDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAxOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg1IiBncmVlbj0iODgiIGJsdWU9Ijk0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAxNDc4MTYzMTUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM3NjQ3MDYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iMTAzLjQiIHkxPSIwLjYiIHkyPSIzMi40IiByb3VuZGluZz0iMTEuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MyIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1ODkzMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTA5ODAzOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2IiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NyIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk4NTI2MzE0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiAgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiICB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjIiIGdyZWVuPSIxMjYiIGJsdWU9IjEzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjA5NzQwNzciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIxOTYwNzgzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDIiIGdyZWVuPSI0NiIgYmx1ZT0iNTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMTE2OTU5MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTMzMzMzMzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIzLjAiIHkyPSIzMi4wIiByb3VuZGluZz0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MiIgZ3JlZW49Ijk0IiBibHVlPSI5NiIgYWxwaGE9IjY1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0xOTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTA0IiBoZWlnaHQ9IjMzIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSI3IiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiBMYXllciI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjEwMS4wIiB5MT0iMy4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjcuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUzIiBncmVlbj0iMjUzIiBibHVlPSIyNTQiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNjU4OTMxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYiIG1pZHBvaW50PSIwLjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ3IiBncmVlbj0iMjQ4IiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTg1MjYzMTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzMzMzYyMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzMzMzYyMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjIiIGdyZWVuPSIxMjYiIGJsdWU9IjEzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjA5NzQwNzciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIxOTYwNzgzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDIiIGdyZWVuPSI0NiIgYmx1ZT0iNTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMTE2OTU5MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTMzMzMzMzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iMTAzLjQiIHkxPSIwLjYiIHkyPSIzMi40IiByb3VuZGluZz0iMTEuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjciIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDUiIGdyZWVuPSIyMDkiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDUwNTA1NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDU5NjAwMzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTAxOTYwNzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTQiIGdyZWVuPSIxOTkiIGJsdWU9IjIwNyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDg1NDcwMDgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA0NzcyNDM4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNzEiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDE4MzA2NjczIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTcxIiBibHVlPSIxODQiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDAyNzc3NzU1MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAxODMwNjY3MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDQiIGdyZWVuPSIyMTEiIGJsdWU9IjIyNCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjEyNDA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzEiIGdyZWVuPSIyMzciIGJsdWU9IjI1MSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzMDg0NTAzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzkyMTU2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuODg5NDczNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzE3NjQ3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk2IiBncmVlbj0iMTAwIiBibHVlPSIxMDgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iNS44NDc5NjFFLTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyMTU2ODY0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMy4wIiB5Mj0iMzIuMCIgcm91bmRpbmc9IjEyLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ1IiBncmVlbj0iMjUwIiBibHVlPSIyNTUiIGFscGhhPSIxNjAiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNSIgZ3JlZW49IjIwOSIgYmx1ZT0iMjE2IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNTA1MDU0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTk2MDAzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDE5NjA3OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2IiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5NCIgZ3JlZW49IjE5OSIgYmx1ZT0iMjA3IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwODU0NzAwOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ3NzI0MzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDY2NjY2NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMTgzMDY2NzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNyIgbWlkcG9pbnQ9IjAuNiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNzEiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDE4MzA2NjczIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk2IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjIxMSIgYmx1ZT0iMjI0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyMTI0MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMSIgZ3JlZW49IjIzNyIgYmx1ZT0iMjUxIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDMwODQ1MDM5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIzOTIxNTY3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMi4wIiB5Mj0iMzEuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSI3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iMC44ODk0NzM3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC43MTc2NDcxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTYiIGdyZWVuPSIxMDAiIGJsdWU9IjEwOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSI1Ljg0Nzk2MUUtNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzIxNTY4NjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iMTAzLjQiIHkxPSIwLjYiIHkyPSIzMi40IiByb3VuZGluZz0iMTEuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpUb2dnbGVCdXR0b24iIG5hbWU9IlRvZ2dsZUJ1dHRvbiIgdWk9IlRvZ2dsZUJ1dHRvblVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjYiIGJvdHRvbT0iNiIgbGVmdD0iMTQiIHJpZ2h0PSIxNCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNyIgZ3JlZW49IjIyOSIgYmx1ZT0iMjMzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4NDc3NTI0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2ODYyNzQ0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIzIiBncmVlbj0iMjI2IiBibHVlPSIyMzAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxNTg3Mjk1NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDgwMDkxNTM2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzAxNjc1NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTYiIGdyZWVuPSIyMTkiIGJsdWU9IjIyNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzA1MjYzMiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMzcyNTQ5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTgiIGdyZWVuPSIyMjEiIGJsdWU9IjIyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzA4Nzg3NDQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ1MDk4MDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAxIiBncmVlbj0iMjA0IiBibHVlPSIyMTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY3NjY5MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODgiIGdyZWVuPSIxOTEiIGJsdWU9IjE5NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQ4NDEwMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMjc0NTA5NzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIzLjAiIHkyPSIzMi4wIiByb3VuZGluZz0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MiIgZ3JlZW49Ijk0IiBibHVlPSI5NiIgYWxwaGE9IjIzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0yMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjciIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA2NTU4MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQzMTM3MjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDEiIGdyZWVuPSIyNDIiIGJsdWU9IjI0NCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5ODIzMTIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIxMTc2NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDQiIGdyZWVuPSIyNDciIGJsdWU9IjI1MyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NDk1MzIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMi4wIiB5Mj0iMzEuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1NSIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wNTU1NTU1MjIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzU2NDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAxOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg1IiBncmVlbj0iODgiIGJsdWU9Ijk0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAxNDc4MTYzMTUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM3NjQ3MDYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIzLjAiIHkyPSIzMi4wIiByb3VuZGluZz0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MiIgZ3JlZW49Ijk0IiBibHVlPSI5NiIgYWxwaGE9IjY1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0xOTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjciIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA2NTU4MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQzMTM3MjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDEiIGdyZWVuPSIyNDIiIGJsdWU9IjI0NCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5ODIzMTIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIxMTc2NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDQiIGdyZWVuPSIyNDciIGJsdWU9IjI1MyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NDk1MzIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMi4wIiB5Mj0iMzEuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1NSIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wNTU1NTU1MjIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzU2NDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAxOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg1IiBncmVlbj0iODgiIGJsdWU9Ijk0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAxNDc4MTYzMTUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM3NjQ3MDYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iMTAzLjQiIHkxPSIwLjYiIHkyPSIzMi40IiByb3VuZGluZz0iMTEuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MyIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1ODkzMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTA5ODAzOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2IiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NyIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk4NTI2MzE0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTI2IiBibHVlPSIxMzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwOTc0MDc3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQyIiBncmVlbj0iNDYiIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTExNjk1OTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUzMzMzMzM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEwMi4wIiB5MT0iMy4wIiB5Mj0iMzIuMCIgcm91bmRpbmc9IjEyLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTIiIGdyZWVuPSI5NCIgYmx1ZT0iOTYiIGFscGhhPSI2NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjg4NTk2NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzY4NjI3NDYiIGFscGhhT2Zmc2V0PSItMTkwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MyIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1ODkzMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTA5ODAzOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2IiBtaWRwb2ludD0iMC40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NyIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk4NTI2MzE0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTI2IiBibHVlPSIxMzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwOTc0MDc3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQyIiBncmVlbj0iNDYiIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTExNjk1OTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUzMzMzMzM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjEwMy40IiB5MT0iMC42IiB5Mj0iMzIuNCIgcm91bmRpbmc9IjExLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTA0IiBoZWlnaHQ9IjMzIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSI3IiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiBMYXllciI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjEwMS4wIiB5MT0iMy4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjcuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA1IiBncmVlbj0iMjA5IiBibHVlPSIyMTYiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA1MDUwNTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTYwMDM5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwMTk2MDc4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYiIG1pZHBvaW50PSIwLjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk0IiBncmVlbj0iMTk5IiBibHVlPSIyMDciIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA4NTQ3MDA4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDc3MjQzOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNjY2NjY2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTcxIiBibHVlPSIxODQiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDAyNzc3NzU1MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAxODMwNjY3MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC42Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMTgzMDY2NzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTYiIG1pZHBvaW50PSIwLjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjExIiBibHVlPSIyMjQiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDAyNzc3NzU1MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIxMjQwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMzMzMzMzMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMxIiBncmVlbj0iMjM3IiBibHVlPSIyNTEiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzA4NDUwMzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM5MjE1NjciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjg4OTQ3MzciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjcxNzY0NzEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NiIgZ3JlZW49IjEwMCIgYmx1ZT0iMTA4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjUuODQ3OTYxRS00IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjE1Njg2NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjMuMCIgeTI9IjMyLjAiIHJvdW5kaW5nPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NSIgZ3JlZW49IjI1MCIgYmx1ZT0iMjU1IiBhbHBoYT0iMTYwIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjciIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDUiIGdyZWVuPSIyMDkiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDUwNTA1NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDU5NjAwMzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTAxOTYwNzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTQiIGdyZWVuPSIxOTkiIGJsdWU9IjIwNyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDg1NDcwMDgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA0NzcyNDM4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNzEiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDE4MzA2NjczIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTcxIiBibHVlPSIxODQiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDAyNzc3NzU1MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAxODMwNjY3MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NiIgbWlkcG9pbnQ9IjAuNiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDQiIGdyZWVuPSIyMTEiIGJsdWU9IjIyNCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjEyNDA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzEiIGdyZWVuPSIyMzciIGJsdWU9IjI1MSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzMDg0NTAzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzkyMTU2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuODg5NDczNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzE3NjQ3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk2IiBncmVlbj0iMTAwIiBibHVlPSIxMDgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iNS44NDc5NjFFLTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyMTU2ODY0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjEwMy40IiB5MT0iMC42IiB5Mj0iMzIuNCIgcm91bmRpbmc9IjExLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjcyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSI3IiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2OS4wIiB5MT0iMy4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjcuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTY2IiBibHVlPSIxNzIiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMTM4ODg4OTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQwMTQ2OSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDcwNTg4MjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMzM2ODk4NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTAiIGdyZWVuPSIxOTMiIGJsdWU9IjE5OSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NTMwMDE4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg5IiBncmVlbj0iMTkyIiBibHVlPSIxOTgiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjUwNzE3NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzEzNzI1NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNzAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyNSIgZ3JlZW49IjEyNyIgYmx1ZT0iMTMxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NDcyNDc5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzEzNzI1NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTY2IiBibHVlPSIxNzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjk1OTA2NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDc0NTA5OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI3MC4wIiB5MT0iMy4wIiB5Mj0iMjMuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjE2OSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItODYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzllY2ZjMDRiLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE2NiIgYmx1ZT0iMTcyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDEzODg4ODk1NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY0MDE0NjkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA3MDU4ODIzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMzNjg5ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkwIiBncmVlbj0iMTkzIiBibHVlPSIxOTkiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjUzMDAxOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4OSIgZ3JlZW49IjE5MiIgYmx1ZT0iMTk4IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY1MDcxNzciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDMxMzcyNTQ3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjUiIGdyZWVuPSIxMjciIGJsdWU9IjEzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQ3MjQ3OSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjMxMzcyNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE2NiIgYmx1ZT0iMTcxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY5NTkwNjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA3NDUwOTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iNzEuNCIgeTE9IjAuNiIgeTI9IjIzLjQiIHJvdW5kaW5nPSIxMS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjcyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSI3IiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2OS4wIiB5MT0iMy4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjcuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE3IiBncmVlbj0iMTIxIiBibHVlPSIxMjYiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDE4NTE4NTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzkwOTc3NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjUwOTgwNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEzMzY4OTg0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NSIgZ3JlZW49IjE0OSIgYmx1ZT0iMTU2IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNTA1MDU0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDAwMTM0OTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDQiIGdyZWVuPSIxNDciIGJsdWU9IjE1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAxMDEwMTA4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzk1NTg1NzUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzNzI1NDkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNzAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY2IiBncmVlbj0iNjgiIGJsdWU9IjcwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzM4MzQ2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NzA1ODgyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTIiIGdyZWVuPSI5NCIgYmx1ZT0iOTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ5MzAxODI1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjA3ODQzMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI3MC4wIiB5MT0iMy4wIiB5Mj0iMjMuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjE2OSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItODYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzllZDkyZWQ4LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtTZWxlY3RlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjcyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSI3IiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2OS4wIiB5MT0iMy4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjcuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE3IiBncmVlbj0iMTIxIiBibHVlPSIxMjYiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDE4NTE4NTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzkwOTc3NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjUwOTgwNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEzMzY4OTg0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NSIgZ3JlZW49IjE0OSIgYmx1ZT0iMTU2IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNTA1MDU0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDAwMTM0OTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDQiIGdyZWVuPSIxNDciIGJsdWU9IjE1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAxMDEwMTA4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzk1NTg1NzUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzNzI1NDkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNzAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY2IiBncmVlbj0iNjgiIGJsdWU9IjcwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzM4MzQ2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NzA1ODgyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTIiIGdyZWVuPSI5NCIgYmx1ZT0iOTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ5MzAxODI1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjA3ODQzMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjYiIHgyPSI3MS40IiB5MT0iMC42IiB5Mj0iMjMuNCIgcm91bmRpbmc9IjExLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitTZWxlY3RlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1MiIgYmx1ZT0iMTU3IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNjk0NDQxOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDU5NTcwOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMzM2ODk4NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzMiIGdyZWVuPSIxNzYiIGJsdWU9IjE4MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MTA3NTc2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDMxMzcyNTQ3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzIiIGdyZWVuPSIxNzUiIGJsdWU9IjE4MSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MDgwMjU2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNzAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk1IiBncmVlbj0iOTciIGJsdWU9IjEwMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MDUyNjMxNSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzUyOTQxMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI0IiBncmVlbj0iMTI2IiBibHVlPSIxMzAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY0MzcyNDY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIzLjAiIHkyPSIyMy4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTY5IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii04NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOWVkYTYyMjAucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIrU2VsZWN0ZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1MiIgYmx1ZT0iMTU3IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNjk0NDQxOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDU5NTcwOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMzM2ODk4NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzMiIGdyZWVuPSIxNzYiIGJsdWU9IjE4MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MTA3NTc2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDMxMzcyNTQ3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzIiIGdyZWVuPSIxNzUiIGJsdWU9IjE4MSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MDgwMjU2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNzAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk1IiBncmVlbj0iOTciIGJsdWU9IjEwMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MDUyNjMxNSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzUyOTQxMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI0IiBncmVlbj0iMTI2IiBibHVlPSIxMzAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY0MzcyNDY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjcxLjQiIHkxPSIwLjYiIHkyPSIyMy40IiByb3VuZGluZz0iMTEuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQrU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Rpc2FibGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjIwNiIgYmx1ZT0iMjEyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODA3MzQ4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA4NjI3NDUwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEzMzY4OTg0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwOSIgZ3JlZW49IjIxMiIgYmx1ZT0iMjE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2OTI0MTkxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwOTgwMzkxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA5IiBncmVlbj0iMjEyIiBibHVlPSIyMTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY5MjQxOTEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTUiIGdyZWVuPSIxOTgiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjY0MDg2NjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDU0OTAxOTU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDMiIGdyZWVuPSIyMDYiIGJsdWU9IjIxMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjgwNzM0OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wODYyNzQ1MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNzAuMCIgeTE9IjMuMCIgeTI9IjIzLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIzNSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMjIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5ZWRiNTYxOS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KUmFkaW9CdXR0b24iIG5hbWU9IlJhZGlvQnV0dG9uIiB1aT0iUmFkaW9CdXR0b25VSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Rpc2FibGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTA0IiBoZWlnaHQ9IjMzIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSI3IiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iNyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zPgorICAgICAgICAgICAgPHVpSWNvblJlZ2lvbiBuYW1lPSJJY29uIiBzdWJyZWdpb249InRydWUiIGtleT0iaWNvbiI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2MzQ0NDExIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNiIgZ3JlZW49IjIyOCIgYmx1ZT0iMjMyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4NDY2NDI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2NDcwNTg3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzY4NTgwMDciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43MjgwOTY2NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzAxNjc1NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjgyMTc1MjI1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNyIgZ3JlZW49IjIyMCIgYmx1ZT0iMjI2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MDcwMzMwNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNDExNzY0NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE2IiBncmVlbj0iMjE5IiBibHVlPSIyMjUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwNTI2MzIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTM3MjU0OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3NTQ5MDE5NjA3ODQzMDMiIHkxPSIwLjAwNDkwMTk2MDc4NDMxMzcyNyIgeDI9IjAuNTA3MzUyOTQxMTc2NDcxIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIwNCIgYmx1ZT0iMjEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NzY2OTE3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODUiIGdyZWVuPSIxODgiIGJsdWU9IjE5NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQxMzQ1NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTU2ODYyNzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ5Nzg5OTE1OTY2Mzg2NTMzIiB5MT0iLTAuMDA0MjAxNjgwNjcyMjY4OTA2NSIgeDI9IjAuNTAwMDAwMDAwMDAwMDAwMiIgeTI9IjAuOTk3ODk5MTU5NjYzODY1NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYzNDQ0MTEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUwIiBncmVlbj0iMjUwIiBibHVlPSIyNTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1NDIyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzkyMTU2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQzNjc0Njk4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MDE2NzU3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTI0MDk2MzciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44ODU1NDIxNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjUiIGdyZWVuPSIyMjgiIGJsdWU9IjIzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzIwNjQ3NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNzI1NDkwMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3NTQ5MDE5NjA3ODQzMDMiIHkxPSIwLjAwNDkwMTk2MDc4NDMxMzcyNyIgeDI9IjAuNTA3MzUyOTQxMTc2NDcxIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OCIgZ3JlZW49IjE1MSIgYmx1ZT0iMTU3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzIwMTQ3NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY4IiBncmVlbj0iNzEiIGJsdWU9Ijc3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDA2MzU2Nzk4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NDMxMzcyNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3ODk5MTU5NjYzODY1MzMiIHkxPSItMC4wMDQyMDE2ODA2NzIyNjg5MDY1IiB4Mj0iMC41MDAwMDAwMDAwMDAwMDAyIiB5Mj0iMC45OTc4OTkxNTk2NjM4NjU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iU2hhZG93Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIzLjAiIHkyPSIxNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2OSIgZ3JlZW49IjE3NiIgYmx1ZT0iMTkwIiBhbHBoYT0iMTQzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iLTExMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzhkZGMwMjFiLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYzNDQ0MTEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUwIiBncmVlbj0iMjUwIiBibHVlPSIyNTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1NDIyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzkyMTU2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQzNjc0Njk4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MDE2NzU3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTI0MDk2MzciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44ODU1NDIxNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjUiIGdyZWVuPSIyMjgiIGJsdWU9IjIzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzIwNjQ3NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNzI1NDkwMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3NTQ5MDE5NjA3ODQzMDMiIHkxPSIwLjAwNDkwMTk2MDc4NDMxMzcyNyIgeDI9IjAuNTA3MzUyOTQxMTc2NDcxIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OCIgZ3JlZW49IjE1MSIgYmx1ZT0iMTU3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzIwMTQ3NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY4IiBncmVlbj0iNzEiIGJsdWU9Ijc3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDA2MzU2Nzk4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NDMxMzcyNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3ODk5MTU5NjYzODY1MzMiIHkxPSItMC4wMDQyMDE2ODA2NzIyNjg5MDY1IiB4Mj0iMC41MDAwMDAwMDAwMDAwMDAyIiB5Mj0iMC45OTc4OTkxNTk2NjM4NjU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMC42IiB4Mj0iMTcuNCIgeTE9IjAuNiIgeTI9IjE3LjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2MzQ0NDExIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MSIgZ3JlZW49IjI1MiIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4xMTExMTExMDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNjU1ODA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0MzEzNzI0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzY4NTgwMDciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43MjgwOTY2NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzMiIGdyZWVuPSIyMzYiIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzMzMzYyMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjgyMTc1MjI1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NiIgZ3JlZW49IjI0NCIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA4NTg1ODU4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjczODkwNTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzNSIgZ3JlZW49IjIzNiIgYmx1ZT0iMjM2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4xMTExMTExMDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNjI4OTAzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE4MDM5MjE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc1NDkwMTk2MDc4NDMwMyIgeTE9IjAuMDA0OTAxOTYwNzg0MzEzNzI3IiB4Mj0iMC41MDczNTI5NDExNzY0NzEiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTI2IiBibHVlPSIxMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNTA1MDU0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjc4MTk1NTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIyMzUyOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyIiBncmVlbj0iMjYiIGJsdWU9IjM0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjQyNDE0ODYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjYxMTc2NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ5Nzg5OTE1OTY2Mzg2NTMzIiB5MT0iLTAuMDA0MjAxNjgwNjcyMjY4OTA2NSIgeDI9IjAuNTAwMDAwMDAwMDAwMDAwMiIgeTI9IjAuOTk3ODk5MTU5NjYzODY1NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlNoYWRvdyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMy4wIiB5Mj0iMTcuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjkiIGdyZWVuPSIxNzYiIGJsdWU9IjE5MCIgYWxwaGE9IjE0MyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9Ii0xMTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM4ZGU3YTlhNy5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMy4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE1LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNjM0NDQxMSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTIiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMTExMTExMTA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1NTgwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDMxMzcyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM2ODU4MDA3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MzMzNjIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwMzkyMTU2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzI4MDk2NjYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44MjE3NTIyNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDYiIGdyZWVuPSIyNDQiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wODU4NTg1OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY3Mzg5MDU2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzUiIGdyZWVuPSIyMzYiIGJsdWU9IjIzNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMTExMTExMTA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDYyODkwMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xODAzOTIxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3NTQ5MDE5NjA3ODQzMDMiIHkxPSIwLjAwNDkwMTk2MDc4NDMxMzcyNyIgeDI9IjAuNTA3MzUyOTQxMTc2NDcxIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMiIgZ3JlZW49IjEyNiIgYmx1ZT0iMTMzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDUwNTA1NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI3ODE5NTUyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMjM1Mjk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMiIgZ3JlZW49IjI2IiBibHVlPSIzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI0MjQxNDg2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC42MTE3NjQ3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc4OTkxNTk2NjM4NjUzMyIgeTE9Ii0wLjAwNDIwMTY4MDY3MjI2ODkwNjUiIHgyPSIwLjUwMDAwMDAwMDAwMDAwMDIiIHkyPSIwLjk5Nzg5OTE1OTY2Mzg2NTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIwLjYiIHgyPSIxNy40IiB5MT0iMC42IiB5Mj0iMTcuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2MzQ0NDExIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNiIgZ3JlZW49IjIwOSIgYmx1ZT0iMjE1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODY2NTg1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA5ODAzOTIxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzUyNDA5NjMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTcxIiBibHVlPSIxODQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMTgzMDY2NzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTQ4MTkyOCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNzEiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDAyNzc3NzU1MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAxODMwNjY3MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NDg3OTUyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49IjE5OCIgYmx1ZT0iMjExIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwMjkyNDAyNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwNDc4OTIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDgyMzUyOTM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc1NDkwMTk2MDc4NDMwMyIgeTE9IjAuMDA0OTAxOTYwNzg0MzEzNzI3IiB4Mj0iMC41MDczNTI5NDExNzY0NzEiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTMiIGdyZWVuPSIxMyIgYmx1ZT0iMjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIzOTQ3MzY3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC42NjY2NjY3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTMiIGdyZWVuPSIxMTciIGJsdWU9IjExOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDc3Nzc3OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY4MTUzNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI4MjM1Mjk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc4OTkxNTk2NjM4NjUzMyIgeTE9Ii0wLjAwNDIwMTY4MDY3MjI2ODkwNjUiIHgyPSIwLjUwMDAwMDAwMDAwMDAwMDIiIHkyPSIwLjk5Nzg5OTE1OTY2Mzg2NTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJTaGFkb3ciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjMuMCIgeTI9IjE3LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzhlODk2MzY4LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMy4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE1LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNjM0NDQxMSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDYiIGdyZWVuPSIyMDkiIGJsdWU9IjIxNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjg2NjU4NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTgwMzkyMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM1MjQwOTYzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDE4MzA2NjczIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjU0ODE5MjgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTcxIiBibHVlPSIxODQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMTgzMDY2NzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTQ4Nzk1MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIxOTgiIGJsdWU9IjIxMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDI5MjQwMjUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyMDQ3ODkyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA4MjM1MjkzNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3NTQ5MDE5NjA3ODQzMDMiIHkxPSIwLjAwNDkwMTk2MDc4NDMxMzcyNyIgeDI9IjAuNTA3MzUyOTQxMTc2NDcxIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzIiBncmVlbj0iMTMiIGJsdWU9IjIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iMC4yMzk0NzM2NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNjY2NjY2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTEzIiBncmVlbj0iMTE3IiBibHVlPSIxMTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjA3Nzc3NzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODE1MzQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yODIzNTI5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3ODk5MTU5NjYzODY1MzMiIHkxPSItMC4wMDQyMDE2ODA2NzIyNjg5MDY1IiB4Mj0iMC41MDAwMDAwMDAwMDAwMDAyIiB5Mj0iMC45OTc4OTkxNTk2NjM4NjU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMC42IiB4Mj0iMTcuNCIgeTE9IjAuNiIgeTI9IjE3LjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjYuMCIgeDI9IjEyLjAiIHkxPSI2LjAiIHkyPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDEiIGdyZWVuPSIxMDMiIGJsdWU9IjEwNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzI0MzEwNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzMzMzMzMzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40NjM4NTU0MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuNjExMTExMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC43NDUwOTgwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjciIGdyZWVuPSIzMCIgYmx1ZT0iMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wNzEyOTE4NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNjE1Njg2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTA0OTAxOTYwNzg0MzEzNyIgeTE9IjAuMCIgeDI9IjAuNDk1MDk4MDM5MjE1Njg2MyIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDgxMzI1MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDQiIGdyZWVuPSIyNDYiIGJsdWU9IjI0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5NTg1MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MjM1Mjk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTIwNDgxOTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE3IiBncmVlbj0iMjI1IiBibHVlPSIyMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2NzA0NDczIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM2NDcwNTg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDU3ODMxMzIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYzIiBncmVlbj0iMTg0IiBibHVlPSIyMDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc3NDA5NjM3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE4NCIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDM4NjY5OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44ODU1NDIxNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzQiIGdyZWVuPSIxOTUiIGJsdWU9IjIxNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ0ODc5ODQyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5MDE5NjA2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc1NDkwMTk2MDc4NDMwMyIgeTE9IjAuMDA0OTAxOTYwNzg0MzEzNzI3IiB4Mj0iMC41MDczNTI5NDExNzY0NzEiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTAwIiBncmVlbj0iMTIwIiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMi45NTY5ODY0RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNjAzNTE5OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMCIgZ3JlZW49IjQwIiBibHVlPSI1OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDE5NDU4MTE1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjE1Njg2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3ODk5MTU5NjYzODY1MzMiIHkxPSItMC4wMDQyMDE2ODA2NzIyNjg5MDY1IiB4Mj0iMC41MDAwMDAwMDAwMDAwMDAyIiB5Mj0iMC45OTc4OTkxNTk2NjM4NjU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iU2hhZG93Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIzLjAiIHkyPSIxNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2OSIgZ3JlZW49IjE3NiIgYmx1ZT0iMTkwIiBhbHBoYT0iMTQzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iLTExMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzhlMTUwNDdjLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjYuMCIgeDI9IjEyLjAiIHkxPSI2LjAiIHkyPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDEiIGdyZWVuPSIxMDMiIGJsdWU9IjEwNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzI0MzEwNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzMzMzMzMzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40NjM4NTU0MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuNjExMTExMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC43NDUwOTgwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjciIGdyZWVuPSIzMCIgYmx1ZT0iMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wNzEyOTE4NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNjE1Njg2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTA0OTAxOTYwNzg0MzEzNyIgeTE9IjAuMCIgeDI9IjAuNDk1MDk4MDM5MjE1Njg2MyIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDgxMzI1MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDQiIGdyZWVuPSIyNDYiIGJsdWU9IjI0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5NTg1MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MjM1Mjk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTIwNDgxOTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE3IiBncmVlbj0iMjI1IiBibHVlPSIyMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2NzA0NDczIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM2NDcwNTg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDU3ODMxMzIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYzIiBncmVlbj0iMTg0IiBibHVlPSIyMDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc3NDA5NjM3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE4NCIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDM4NjY5OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44ODU1NDIxNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzQiIGdyZWVuPSIxOTUiIGJsdWU9IjIxNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ0ODc5ODQyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5MDE5NjA2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc1NDkwMTk2MDc4NDMwMyIgeTE9IjAuMDA0OTAxOTYwNzg0MzEzNzI3IiB4Mj0iMC41MDczNTI5NDExNzY0NzEiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTAwIiBncmVlbj0iMTIwIiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMi45NTY5ODY0RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNjAzNTE5OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMCIgZ3JlZW49IjQwIiBibHVlPSI1OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDE5NDU4MTE1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjE1Njg2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3ODk5MTU5NjYzODY1MzMiIHkxPSItMC4wMDQyMDE2ODA2NzIyNjg5MDY1IiB4Mj0iMC41MDAwMDAwMDAwMDAwMDAyIiB5Mj0iMC45OTc4OTkxNTk2NjM4NjU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMC42IiB4Mj0iMTcuNCIgeTE9IjAuNiIgeTI9IjE3LjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD40PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iNi4wIiB4Mj0iMTIuMCIgeTE9IjYuMCIgeTI9IjEyLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY0IiBncmVlbj0iNjUiIGJsdWU9IjY2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4MDIyMzI4NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDg2Mjc0NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ2Mzg1NTQyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNyIgZ3JlZW49IjMwIiBibHVlPSIzMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjA3MTI5MTg3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC42MTU2ODYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41MDQ5MDE5NjA3ODQzMTM3IiB5MT0iMC4wIiB4Mj0iMC40OTUwOTgwMzkyMTU2ODYzIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMy4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE1LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wMzkxNTY2MjciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTU3IiBncmVlbj0iMTc4IiBibHVlPSIxOTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDM2NzM0NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjExNzQ2OTg4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMiIgZ3JlZW49IjE1MyIgYmx1ZT0iMTgwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTA2NTQ5MjYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjMxMzQ5MjA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDU3ODMxMzIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTEiIGdyZWVuPSI5OCIgYmx1ZT0iMTQwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NjU2NjI2NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49Ijk4IiBibHVlPSIxNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjg4NTU0MjE1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgyIiBncmVlbj0iMTI3IiBibHVlPSIxNjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iOC4wNTY3NkUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTIzODA5NTIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc1NDkwMTk2MDc4NDMwMyIgeTE9IjAuMDA0OTAxOTYwNzg0MzEzNzI3IiB4Mj0iMC41MDczNTI5NDExNzY0NzEiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTMiIGdyZWVuPSIxMyIgYmx1ZT0iMTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ5ODAzOTI1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMCIgZ3JlZW49IjQwIiBibHVlPSI1OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDE5NDU4MTE1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjE1Njg2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDkiIGdyZWVuPSI3NSIgYmx1ZT0iMTAwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAzMDQ3NzA0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTI1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTU2ODYyNzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ5Nzg5OTE1OTY2Mzg2NTMzIiB5MT0iLTAuMDA0MjAxNjgwNjcyMjY4OTA2NSIgeDI9IjAuNTAwMDAwMDAwMDAwMDAwMiIgeTI9IjAuOTk3ODk5MTU5NjYzODY1NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlNoYWRvdyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMy4wIiB5Mj0iMTcuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOGU4MTczMzEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkK1NlbGVjdGVkK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSI2LjAiIHgyPSIxMi4wIiB5MT0iNi4wIiB5Mj0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjQiIGdyZWVuPSI2NSIgYmx1ZT0iNjYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDgwMjIzMjg1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40ODYyNzQ1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDYzODU1NDIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzQ1MDk4MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI3IiBncmVlbj0iMzAiIGJsdWU9IjMzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDcxMjkxODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjYxNTY4NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUwNDkwMTk2MDc4NDMxMzciIHkxPSIwLjAiIHgyPSIwLjQ5NTA5ODAzOTIxNTY4NjMiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAzOTE1NjYyNyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTciIGdyZWVuPSIxNzgiIGJsdWU9IjE5NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDE3Mjg1OTQzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40MzY3MzQ3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIxOTYwNzgzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTE3NDY5ODgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTUzIiBibHVlPSIxODAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxMDY1NDkyNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzEzNDkyMDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTU2ODYyNzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40NTc4MzEzMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49Ijk4IiBibHVlPSIxNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY2NTY2MjY1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iOTgiIGJsdWU9IjE0MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuODg1NTQyMTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODIiIGdyZWVuPSIxMjciIGJsdWU9IjE2OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI4LjA1Njc2RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMjM4MDk1MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDk4MDM5MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ5NzU0OTAxOTYwNzg0MzAzIiB5MT0iMC4wMDQ5MDE5NjA3ODQzMTM3MjciIHgyPSIwLjUwNzM1Mjk0MTE3NjQ3MSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMyIgZ3JlZW49IjEzIiBibHVlPSIxMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDk4MDM5MjUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwIiBncmVlbj0iNDAiIGJsdWU9IjU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjIuOTU2OTg2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTk0NTgxMTUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyMTU2ODY3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0OSIgZ3JlZW49Ijc1IiBibHVlPSIxMDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDMwNDc3MDQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMjU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNTY4NjI3NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3ODk5MTU5NjYzODY1MzMiIHkxPSItMC4wMDQyMDE2ODA2NzIyNjg5MDY1IiB4Mj0iMC41MDAwMDAwMDAwMDAwMDAyIiB5Mj0iMC45OTc4OTkxNTk2NjM4NjU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMC42IiB4Mj0iMTcuNCIgeTE9IjAuNiIgeTI9IjE3LjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIrU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSI2LjAiIHgyPSIxMi4wIiB5MT0iNi4wIiB5Mj0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTAxIiBncmVlbj0iMTAzIiBibHVlPSIxMDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcyNDMxMDciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMzMzMzMzM0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDYzODU1NDIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzQ1MDk4MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI3IiBncmVlbj0iMzAiIGJsdWU9IjMzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDcxMjkxODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjYxNTY4NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUwNDkwMTk2MDc4NDMxMzciIHkxPSIwLjAiIHgyPSIwLjQ5NTA5ODAzOTIxNTY4NjMiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA4MTMyNTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ1IiBncmVlbj0iMjQ4IiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDExOTg1MDA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTIwNDgxOTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI1IiBncmVlbj0iMjMzIiBibHVlPSIyNDEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2OTMyNDI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM5NjA3ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yODMxMzI1MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIyMDMiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NTUzNDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjcwMTgwNzIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgyIiBncmVlbj0iMjAzIiBibHVlPSIyMjIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTU1MzQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyMTU2ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44MTAyNDEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk1IiBncmVlbj0iMjE2IiBibHVlPSIyMzUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjU1MDE1NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNzI1NDkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44ODU1NDIxNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTAiIGdyZWVuPSIyMDkiIGJsdWU9IjIyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMjQyOTQyNTciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3MjcxODcyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0MTE3NjQ1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc1NDkwMTk2MDc4NDMwMyIgeTE9IjAuMDA0OTAxOTYwNzg0MzEzNzI3IiB4Mj0iMC41MDczNTI5NDExNzY0NzEiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjIiIGdyZWVuPSI4NyIgYmx1ZT0iMTA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii02LjM3NDcxN0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjA0NTIxNjMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyMTU2ODY1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMSIgZ3JlZW49IjExIiBibHVlPSIxMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTA1ODgyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3ODk5MTU5NjYzODY1MzMiIHkxPSItMC4wMDQyMDE2ODA2NzIyNjg5MDY1IiB4Mj0iMC41MDAwMDAwMDAwMDAwMDAyIiB5Mj0iMC45OTc4OTkxNTk2NjM4NjU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iU2hhZG93Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIzLjAiIHkyPSIxNy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2OSIgZ3JlZW49IjE3NiIgYmx1ZT0iMTkwIiBhbHBoYT0iMTQzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iLTExMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzhlN2I5NmYyLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK1NlbGVjdGVkK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSI2LjAiIHgyPSIxMi4wIiB5MT0iNi4wIiB5Mj0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTAxIiBncmVlbj0iMTAzIiBibHVlPSIxMDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcyNDMxMDciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMzMzMzMzM0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDYzODU1NDIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzQ1MDk4MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI3IiBncmVlbj0iMzAiIGJsdWU9IjMzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDcxMjkxODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjYxNTY4NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUwNDkwMTk2MDc4NDMxMzciIHkxPSIwLjAiIHgyPSIwLjQ5NTA5ODAzOTIxNTY4NjMiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA4MTMyNTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ1IiBncmVlbj0iMjQ4IiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDExOTg1MDA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTIwNDgxOTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI1IiBncmVlbj0iMjMzIiBibHVlPSIyNDEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2OTMyNDI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM5NjA3ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yODMxMzI1MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIyMDMiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NTUzNDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjcwMTgwNzIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgyIiBncmVlbj0iMjAzIiBibHVlPSIyMjIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTU1MzQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyMTU2ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44MTAyNDEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk1IiBncmVlbj0iMjE2IiBibHVlPSIyMzUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjU1MDE1NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNzI1NDkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44ODU1NDIxNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTAiIGdyZWVuPSIyMDkiIGJsdWU9IjIyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMjQyOTQyNTciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3MjcxODcyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0MTE3NjQ1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40OTc1NDkwMTk2MDc4NDMwMyIgeTE9IjAuMDA0OTAxOTYwNzg0MzEzNzI3IiB4Mj0iMC41MDczNTI5NDExNzY0NzEiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjIiIGdyZWVuPSI4NyIgYmx1ZT0iMTA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii02LjM3NDcxN0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjA0NTIxNjMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyMTU2ODY1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMSIgZ3JlZW49IjExIiBibHVlPSIxMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTA1ODgyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDk3ODk5MTU5NjYzODY1MzMiIHkxPSItMC4wMDQyMDE2ODA2NzIyNjg5MDY1IiB4Mj0iMC41MDAwMDAwMDAwMDAwMDAyIiB5Mj0iMC45OTc4OTkxNTk2NjM4NjU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMC42IiB4Mj0iMTcuNCIgeTE9IjAuNiIgeTI9IjE3LjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCtTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjYuMCIgeDI9IjEyLjAiIHkxPSI2LjAiIHkyPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODEiIGdyZWVuPSIxODUiIGJsdWU9IjE5MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1ODE3MDI5NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMDM5MjE1Njg0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDYzODU1NDIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYzIiBncmVlbj0iMTY4IiBibHVlPSIxNzUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQxOTU0ODkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA1ODgyMzUyNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcwIiBncmVlbj0iMTc1IiBibHVlPSIxODgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA5MjU5Mjg0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTQ3ODE2MzE1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUwNDkwMTk2MDc4NDMxMzciIHkxPSIwLjAiIHgyPSIwLjQ5NTA5ODAzOTIxNTY4NjMiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA4MTMyNTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE5IiBncmVlbj0iMjIzIiBibHVlPSIyMzAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjc0MDg4OTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU4Nzg4ODIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40NTc4MzEzMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDQiIGdyZWVuPSIyMTAiIGJsdWU9IjIxOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTY3MjIxMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjg4NTU0MjE1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNiIgZ3JlZW49IjIxMiIgYmx1ZT0iMjIxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41Njc4NDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzE3NjQ3MDQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ5NzU0OTAxOTYwNzg0MzAzIiB5MT0iMC4wMDQ5MDE5NjA3ODQzMTM3MjciIHgyPSIwLjUwNzM1Mjk0MTE3NjQ3MSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIxOTgiIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAxMDIzNzIxNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTYyODk4NzYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc2IiBncmVlbj0iMTgyIiBibHVlPSIxOTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTY1ODY0ODMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2MjAzMDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ5Nzg5OTE1OTY2Mzg2NTMzIiB5MT0iLTAuMDA0MjAxNjgwNjcyMjY4OTA2NSIgeDI9IjAuNTAwMDAwMDAwMDAwMDAwMiIgeTI9IjAuOTk3ODk5MTU5NjYzODY1NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzhlODMxMjJkLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSkNoZWNrQm94IiBuYW1lPSJDaGVja0JveCIgdWk9IkNoZWNrQm94VUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iSWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9Imljb24iPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE1LjAiIHJvdW5kaW5nPSIzLjc2NDcwNTg4MjM1MjkzNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI3IiBncmVlbj0iMjI5IiBibHVlPSIyMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYwOTk2MzI0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM2NDcwNTg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQ0NTc4MzQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjU1MTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk5Njc4MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjE1Njg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTkiIGdyZWVuPSIyMjIiIGJsdWU9IjIyOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk2MjQwNjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzQ1MDk4MDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDAzIiB5Mj0iMC45OTc1NDkwMTk2MDc4NDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMy43MDU4ODIzNTI5NDExNzQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIwNCIgYmx1ZT0iMjEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NzY2OTE3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODgiIGdyZWVuPSIxOTEiIGJsdWU9IjE5NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQ4NDEwMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMjc0NTA5NzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTIxMDA4NDAzMzYxMzQ0NSIgeTI9IjAuOTk1Nzk4MzE5MzI3NzMxMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE1LjAiIHJvdW5kaW5nPSIzLjc2NDcwNTg4MjM1MjkzNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUxIiBncmVlbj0iMjUxIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjMxNzQ2MDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NDQ1NzgzNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk1MzU1NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM5IiBncmVlbj0iMjQyIiBibHVlPSIyNDgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU5OTQyMzk0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQyMzUyOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDAzIiB5Mj0iMC45OTc1NDkwMTk2MDc4NDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMy43MDU4ODIzNTI5NDExNzQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1MiIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzU2NDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAxOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODYiIGdyZWVuPSI4OSIgYmx1ZT0iOTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE1Nzg5NDcyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNzI1NDkwMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MjEwMDg0MDMzNjEzNDQ1IiB5Mj0iMC45OTU3OTgzMTkzMjc3MzExIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIxMS4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjUuMTc2NDcwNTg4MjM1Mjc5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2OSIgZ3JlZW49IjE3NiIgYmx1ZT0iMTkwIiBhbHBoYT0iMTY2IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iLTg5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM4ZWM2NjYxZS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCIgcm91bmRpbmc9IjMuNzY0NzA1ODgyMzUyOTM1Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzE3NDYwNSIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzkyMTU2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0NDU3ODM0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTUzNTU2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyNTQ5MDE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzkiIGdyZWVuPSIyNDIiIGJsdWU9IjI0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk5NDIzOTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDIzNTI5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MDAwMDAwMDAwMDAwMDMiIHkyPSIwLjk5NzU0OTAxOTYwNzg0MzEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSIzLjcwNTg4MjM1Mjk0MTE3NCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ5IiBncmVlbj0iMTUyIiBibHVlPSIxNTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDUzNTY0MjkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyNTQ5MDE5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NiIgZ3JlZW49Ijg5IiBibHVlPSI5NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTU3ODk0NzIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM3MjU0OTAzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUyMTAwODQwMzM2MTM0NDUiIHkyPSIwLjk5NTc5ODMxOTMyNzczMTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iMTcuNCIgeTE9IjAuNiIgeTI9IjE3LjQiIHJvdW5kaW5nPSI3Ljk5OTk5OTk5OTk5OTk5OSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE1LjAiIHJvdW5kaW5nPSIzLjc2NDcwNTg4MjM1MjkzNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUzIiBncmVlbj0iMjUzIiBibHVlPSIyNTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjMxNzc3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NDcwNTg4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQ0NTc4MzQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU5ODUyNDIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzk5OTk5OTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MDAwMDAwMDAwMDAwMDMiIHkyPSIwLjk5NzU0OTAxOTYwNzg0MzEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSIzLjcwNTg4MjM1Mjk0MTE3NCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTI2IiBibHVlPSIxMzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwOTc0MDc3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDQiIGdyZWVuPSI0NyIgYmx1ZT0iNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDEwMTAxMDgiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDg5NDczNjkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUyOTQxMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTIxMDA4NDAzMzYxMzQ0NSIgeTI9IjAuOTk1Nzk4MzE5MzI3NzMxMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMTEuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI1LjE3NjQ3MDU4ODIzNTI3OSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjkiIGdyZWVuPSIxNzYiIGJsdWU9IjE5MCIgYWxwaGE9IjE2NiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9Ii04OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIrRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMy43NjQ3MDU4ODIzNTI5MzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MyIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzMTc3NzMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDQ3MDU4OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0NDU3ODM0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTg1MjQyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM5OTk5OTk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDAzIiB5Mj0iMC45OTc1NDkwMTk2MDc4NDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMy43MDU4ODIzNTI5NDExNzQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMiIgZ3JlZW49IjEyNiIgYmx1ZT0iMTM0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyMDk3NDA3NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjE5NjA3ODMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQ0IiBncmVlbj0iNDciIGJsdWU9IjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAxMDEwMTA4IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjA4OTQ3MzY5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC41Mjk0MTE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUyMTAwODQwMzM2MTM0NDUiIHkyPSIwLjk5NTc5ODMxOTMyNzczMTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iMTcuNCIgeTE9IjAuNiIgeTI9IjE3LjQiIHJvdW5kaW5nPSI3Ljk5OTk5OTk5OTk5OTk5OSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMy43NjQ3MDU4ODIzNTI5MzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNSIgZ3JlZW49IjIwOSIgYmx1ZT0iMjE2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI3NDA4ODk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41ODQ3ODg0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5ODAzOTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NDQ1NzgzNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNzEiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTY4MTY4MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTI3MDE4NjciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTcyNTQ5MDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE5MSIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI5NjgxNjgzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41Mzc2NzUxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwMyIgeTI9IjAuOTk3NTQ5MDE5NjA3ODQzMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjMuNzA1ODgyMzUyOTQxMTc0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuODg5NDczNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzE3NjQ3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTUiIGdyZWVuPSI5OSIgYmx1ZT0iMTA3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDAxNjIzMjEzMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzI1NDkwMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MjEwMDg0MDMzNjEzNDQ1IiB5Mj0iMC45OTU3OTgzMTkzMjc3MzExIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIxMS4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjUuMTc2NDcwNTg4MjM1Mjc5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2OSIgZ3JlZW49IjE3NiIgYmx1ZT0iMTkwIiBhbHBoYT0iMTY2IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iLTg5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMy43NjQ3MDU4ODIzNTI5MzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNSIgZ3JlZW49IjIwOSIgYmx1ZT0iMjE2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI3NDA4ODk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41ODQ3ODg0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5ODAzOTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NDQ1NzgzNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNzEiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTY4MTY4MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTI3MDE4NjciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTcyNTQ5MDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE5MSIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI5NjgxNjgzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41Mzc2NzUxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwMyIgeTI9IjAuOTk3NTQ5MDE5NjA3ODQzMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjMuNzA1ODgyMzUyOTQxMTc0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuODg5NDczNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzE3NjQ3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTUiIGdyZWVuPSI5OSIgYmx1ZT0iMTA3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDAxNjIzMjEzMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzI1NDkwMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MjEwMDg0MDMzNjEzNDQ1IiB5Mj0iMC45OTU3OTgzMTkzMjc3MzExIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjE3LjQiIHkxPSIwLjYiIHkyPSIxNy40IiByb3VuZGluZz0iNy45OTk5OTk5OTk5OTk5OTkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMDI5NDExNzY0NzA1ODgyIiB5PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AxeD0iNS4wMjk0MTE3NjQ3MDU4ODIiIGNwMXk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI1LjAyOTQxMTc2NDcwNTg4MiIgY3AyeT0iOC4wNTg4MjM1Mjk0MTE3NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAyOTQxMTc2NDcwNTg4MiIgeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMXg9IjcuMDI5NDExNzY0NzA1ODgyIiBjcDF5PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AyeD0iNy4wMjk0MTE3NjQ3MDU4ODIiIGNwMnk9IjguMDU4ODIzNTI5NDExNzY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC40NDExNzY0NzA1ODgyMzYiIHk9IjExLjA1ODgyMzUyOTQxMTc2NCIgY3AxeD0iOC40NDExNzY0NzA1ODgyMzYiIGNwMXk9IjExLjA1ODgyMzUyOTQxMTc2NCIgY3AyeD0iOC40NDExNzY0NzA1ODgyMzYiIGNwMnk9IjExLjA1ODgyMzUyOTQxMTc2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjU4ODIzNTI5NDExNzY0NyIgeT0iMy4xMTc2NDcwNTg4MjM1MjkiIGNwMXg9IjExLjU4ODIzNTI5NDExNzY0NyIgY3AxeT0iMy4xMTc2NDcwNTg4MjM1MjkiIGNwMng9IjExLjU4ODIzNTI5NDExNzY0NyIgY3AyeT0iMy4xMTc2NDcwNTg4MjM1MjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIzLjA4ODIzNTI5NDExNzY0NjciIGNwMXg9IjE0LjAiIGNwMXk9IjMuMDg4MjM1Mjk0MTE3NjQ2NyIgY3AyeD0iMTQuMCIgY3AyeT0iMy4wODgyMzUyOTQxMTc2NDY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC45NDExNzY0NzA1ODgyMzYiIHk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AxeD0iOC45NDExNzY0NzA1ODgyMzYiIGNwMXk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AyeD0iOC45NDExNzY0NzA1ODgyMzYiIGNwMnk9IjEzLjAyOTQxMTc2NDcwNTg4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMDU4ODIzNTI5NDExNzY0IiB5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiIGNwMXg9IjguMDU4ODIzNTI5NDExNzY0IiBjcDF5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiIGNwMng9IjguMDU4ODIzNTI5NDExNzY0IiBjcDJ5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTUuMCIgcm91bmRpbmc9IjMuNzY0NzA1ODgyMzUyOTM1Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDYiIGdyZWVuPSIyNDgiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzEzNzI1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0NDU3ODM0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NiIgZ3JlZW49IjE4NyIgYmx1ZT0iMjA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDQxNTM5NTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg4IiBncmVlbj0iMjA5IiBibHVlPSIyMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjAyNzU3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0NTA5ODAyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwMyIgeTI9IjAuOTk3NTQ5MDE5NjA3ODQzMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMi4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjMuNzA1ODgyMzUyOTQxMTc0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5OCIgZ3JlZW49IjExOSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzQ1ODU5MjMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzUiIGdyZWVuPSI1NiIgYmx1ZT0iNzUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDIzODA5MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjU0OTAxOTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTIxMDA4NDAzMzYxMzQ0NSIgeTI9IjAuOTk1Nzk4MzE5MzI3NzMxMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMTEuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI1LjE3NjQ3MDU4ODIzNTI3OSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjkiIGdyZWVuPSIxNzYiIGJsdWU9IjE5MCIgYWxwaGE9IjE2NiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9Ii04OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOGVkMTk4MDkucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wMjk0MTE3NjQ3MDU4ODIiIHk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI1LjAyOTQxMTc2NDcwNTg4MiIgY3AxeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjUuMDI5NDExNzY0NzA1ODgyIiBjcDJ5PSI4LjA1ODgyMzUyOTQxMTc2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMDI5NDExNzY0NzA1ODgyIiB5PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AxeD0iNy4wMjk0MTE3NjQ3MDU4ODIiIGNwMXk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI3LjAyOTQxMTc2NDcwNTg4MiIgY3AyeT0iOC4wNTg4MjM1Mjk0MTE3NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgeT0iMTEuMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AxeT0iMTEuMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iMTEuMDU4ODIzNTI5NDExNzY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiB5PSIzLjExNzY0NzA1ODgyMzUyOSIgY3AxeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiBjcDF5PSIzLjExNzY0NzA1ODgyMzUyOSIgY3AyeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiBjcDJ5PSIzLjExNzY0NzA1ODgyMzUyOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjMuMDg4MjM1Mjk0MTE3NjQ2NyIgY3AxeD0iMTQuMCIgY3AxeT0iMy4wODgyMzUyOTQxMTc2NDY3IiBjcDJ4PSIxNC4wIiBjcDJ5PSIzLjA4ODIzNTI5NDExNzY0NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDF4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgY3AxeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iMTMuMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIHk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AxeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMXk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AyeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMnk9IjEzLjAyOTQxMTc2NDcwNTg4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMy43NjQ3MDU4ODIzNTI5MzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NiIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTk3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQ0NTc4MzQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY2IiBncmVlbj0iMTg3IiBibHVlPSIyMDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NDE1Mzk1MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODgiIGdyZWVuPSIyMDkiIGJsdWU9IjIyOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MDI3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzQ1MDk4MDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDAzIiB5Mj0iMC45OTc1NDkwMTk2MDc4NDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMy43MDU4ODIzNTI5NDExNzQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk4IiBncmVlbj0iMTE5IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNDU4NTkyMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNSIgZ3JlZW49IjU2IiBibHVlPSI3NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwMjM4MDkzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNTQ5MDE5OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MjEwMDg0MDMzNjEzNDQ1IiB5Mj0iMC45OTU3OTgzMTkzMjc3MzExIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjE3LjQiIHkxPSIwLjYiIHkyPSIxNy40IiByb3VuZGluZz0iNy45OTk5OTk5OTk5OTk5OTkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wMjk0MTE3NjQ3MDU4ODIiIHk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI1LjAyOTQxMTc2NDcwNTg4MiIgY3AxeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjUuMDI5NDExNzY0NzA1ODgyIiBjcDJ5PSI4LjA1ODgyMzUyOTQxMTc2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMDI5NDExNzY0NzA1ODgyIiB5PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AxeD0iNy4wMjk0MTE3NjQ3MDU4ODIiIGNwMXk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI3LjAyOTQxMTc2NDcwNTg4MiIgY3AyeT0iOC4wNTg4MjM1Mjk0MTE3NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgeT0iMTEuMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AxeT0iMTEuMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iMTEuMDU4ODIzNTI5NDExNzY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiB5PSIzLjExNzY0NzA1ODgyMzUyOSIgY3AxeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiBjcDF5PSIzLjExNzY0NzA1ODgyMzUyOSIgY3AyeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiBjcDJ5PSIzLjExNzY0NzA1ODgyMzUyOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjMuMDg4MjM1Mjk0MTE3NjQ2NyIgY3AxeD0iMTQuMCIgY3AxeT0iMy4wODgyMzUyOTQxMTc2NDY3IiBjcDJ4PSIxNC4wIiBjcDJ5PSIzLjA4ODIzNTI5NDExNzY0NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDF4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgY3AxeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iMTMuMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIHk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AxeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMXk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AyeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMnk9IjEzLjAyOTQxMTc2NDcwNTg4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMy43NjQ3MDU4ODIzNTI5MzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MyIgZ3JlZW49IjE2OSIgYmx1ZT0iMTkyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii00LjIwMzMxOTVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4MDUwNTk1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwMzkyMTU2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTE1NTAxNTIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTQ4IiBibHVlPSIxNzYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAyMTQ4OTI2MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjg5MTIzNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNDExNzY0NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0NDU3ODM0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iOTgiIGJsdWU9IjEzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDYzNjI0OTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAxNjMxMTI4OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwNiIgZ3JlZW49IjE1MyIgYmx1ZT0iMTk1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTc5MzA0MDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjE1Njg2MjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDAzIiB5Mj0iMC45OTc1NDkwMTk2MDc4NDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMy43MDU4ODIzNTI5NDExNzQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjciIGdyZWVuPSI1NSIgYmx1ZT0iODAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTMuNTI4NTk1RS01IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyNjc4NTczMSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjM1Mjk0MTMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTIxMDA4NDAzMzYxMzQ0NSIgeTI9IjAuOTk1Nzk4MzE5MzI3NzMxMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxNi4wIiB5MT0iMTEuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI1LjE3NjQ3MDU4ODIzNTI3OSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrU2VsZWN0ZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAyOTQxMTc2NDcwNTg4MiIgeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMXg9IjUuMDI5NDExNzY0NzA1ODgyIiBjcDF5PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AyeD0iNS4wMjk0MTE3NjQ3MDU4ODIiIGNwMnk9IjguMDU4ODIzNTI5NDExNzY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wMjk0MTE3NjQ3MDU4ODIiIHk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI3LjAyOTQxMTc2NDcwNTg4MiIgY3AxeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjcuMDI5NDExNzY0NzA1ODgyIiBjcDJ5PSI4LjA1ODgyMzUyOTQxMTc2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNDQxMTc2NDcwNTg4MjM2IiB5PSIxMS4wNTg4MjM1Mjk0MTE3NjQiIGNwMXg9IjguNDQxMTc2NDcwNTg4MjM2IiBjcDF5PSIxMS4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjguNDQxMTc2NDcwNTg4MjM2IiBjcDJ5PSIxMS4wNTg4MjM1Mjk0MTE3NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS41ODgyMzUyOTQxMTc2NDciIHk9IjMuMTE3NjQ3MDU4ODIzNTI5IiBjcDF4PSIxMS41ODgyMzUyOTQxMTc2NDciIGNwMXk9IjMuMTE3NjQ3MDU4ODIzNTI5IiBjcDJ4PSIxMS41ODgyMzUyOTQxMTc2NDciIGNwMnk9IjMuMTE3NjQ3MDU4ODIzNTI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMy4wODgyMzUyOTQxMTc2NDY3IiBjcDF4PSIxNC4wIiBjcDF5PSIzLjA4ODIzNTI5NDExNzY0NjciIGNwMng9IjE0LjAiIGNwMnk9IjMuMDg4MjM1Mjk0MTE3NjQ2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguOTQxMTc2NDcwNTg4MjM2IiB5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiIGNwMXg9IjguOTQxMTc2NDcwNTg4MjM2IiBjcDF5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiIGNwMng9IjguOTQxMTc2NDcwNTg4MjM2IiBjcDJ5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjA1ODgyMzUyOTQxMTc2NCIgeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDF4PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AxeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AyeT0iMTMuMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE1LjAiIHJvdW5kaW5nPSIzLjc2NDcwNTg4MjM1MjkzNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQzIiBncmVlbj0iMTY5IiBibHVlPSIxOTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTQuMjAzMzE5NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzgwNTA1OTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMTU1MDE1MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNDgiIGJsdWU9IjE3NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDIxNDg5MjYzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yODkxMjM0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0MTE3NjQ2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQ0NTc4MzQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTEiIGdyZWVuPSI5OCIgYmx1ZT0iMTM0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwNjM2MjQ5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE2MzExMjg4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA2IiBncmVlbj0iMTUzIiBibHVlPSIxOTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xNzkzMDQwMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMTU2ODYyNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MDAwMDAwMDAwMDAwMDMiIHkyPSIwLjk5NzU0OTAxOTYwNzg0MzEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSIzLjcwNTg4MjM1Mjk0MTE3NCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNyIgZ3JlZW49IjU1IiBibHVlPSI4MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMy41Mjg1OTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDI2Nzg1NzMxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzUyOTQxMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MjEwMDg0MDMzNjEzNDQ1IiB5Mj0iMC45OTU3OTgzMTkzMjc3MzExIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjE3LjQiIHkxPSIwLjYiIHkyPSIxNy40IiByb3VuZGluZz0iNy45OTk5OTk5OTk5OTk5OTkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAyOTQxMTc2NDcwNTg4MiIgeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMXg9IjUuMDI5NDExNzY0NzA1ODgyIiBjcDF5PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AyeD0iNS4wMjk0MTE3NjQ3MDU4ODIiIGNwMnk9IjguMDU4ODIzNTI5NDExNzY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wMjk0MTE3NjQ3MDU4ODIiIHk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI3LjAyOTQxMTc2NDcwNTg4MiIgY3AxeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjcuMDI5NDExNzY0NzA1ODgyIiBjcDJ5PSI4LjA1ODgyMzUyOTQxMTc2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNDQxMTc2NDcwNTg4MjM2IiB5PSIxMS4wNTg4MjM1Mjk0MTE3NjQiIGNwMXg9IjguNDQxMTc2NDcwNTg4MjM2IiBjcDF5PSIxMS4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjguNDQxMTc2NDcwNTg4MjM2IiBjcDJ5PSIxMS4wNTg4MjM1Mjk0MTE3NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS41ODgyMzUyOTQxMTc2NDciIHk9IjMuMTE3NjQ3MDU4ODIzNTI5IiBjcDF4PSIxMS41ODgyMzUyOTQxMTc2NDciIGNwMXk9IjMuMTE3NjQ3MDU4ODIzNTI5IiBjcDJ4PSIxMS41ODgyMzUyOTQxMTc2NDciIGNwMnk9IjMuMTE3NjQ3MDU4ODIzNTI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMy4wODgyMzUyOTQxMTc2NDY3IiBjcDF4PSIxNC4wIiBjcDF5PSIzLjA4ODIzNTI5NDExNzY0NjciIGNwMng9IjE0LjAiIGNwMnk9IjMuMDg4MjM1Mjk0MTE3NjQ2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguOTQxMTc2NDcwNTg4MjM2IiB5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiIGNwMXg9IjguOTQxMTc2NDcwNTg4MjM2IiBjcDF5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiIGNwMng9IjguOTQxMTc2NDcwNTg4MjM2IiBjcDJ5PSIxMy4wMjk0MTE3NjQ3MDU4ODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjA1ODgyMzUyOTQxMTc2NCIgeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDF4PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AxeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AyeT0iMTMuMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE1LjAiIHJvdW5kaW5nPSIzLjc2NDcwNTg4MjM1MjkzNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ4IiBncmVlbj0iMjUwIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTg0MTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NDQ1NzgzNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIyMDMiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NTUzNDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA3IiBncmVlbj0iMjI4IiBibHVlPSIyNDciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NzM3NzA5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC40MTk2MDc4MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MDAwMDAwMDAwMDAwMDMiIHkyPSIwLjk5NzU0OTAxOTYwNzg0MzEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjIuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSIzLjcwNTg4MjM1Mjk0MTE3NCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTkiIGdyZWVuPSI4NSIgYmx1ZT0iMTA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxMzQ4MzE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTc2OTk4NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTIxNTY4NjUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSI2IiBibHVlPSIzMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA1NDY4MTcyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQzMTM3MjU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUyMTAwODQwMzM2MTM0NDUiIHkyPSIwLjk5NTc5ODMxOTMyNzczMTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTYuMCIgeTE9IjExLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iNS4xNzY0NzA1ODgyMzUyNzkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY5IiBncmVlbj0iMTc2IiBibHVlPSIxOTAiIGFscGhhPSIxNjYiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSItODkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK1NlbGVjdGVkK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wMjk0MTE3NjQ3MDU4ODIiIHk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI1LjAyOTQxMTc2NDcwNTg4MiIgY3AxeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjUuMDI5NDExNzY0NzA1ODgyIiBjcDJ5PSI4LjA1ODgyMzUyOTQxMTc2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMDI5NDExNzY0NzA1ODgyIiB5PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AxeD0iNy4wMjk0MTE3NjQ3MDU4ODIiIGNwMXk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI3LjAyOTQxMTc2NDcwNTg4MiIgY3AyeT0iOC4wNTg4MjM1Mjk0MTE3NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgeT0iMTEuMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AxeT0iMTEuMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iMTEuMDU4ODIzNTI5NDExNzY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiB5PSIzLjExNzY0NzA1ODgyMzUyOSIgY3AxeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiBjcDF5PSIzLjExNzY0NzA1ODgyMzUyOSIgY3AyeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiBjcDJ5PSIzLjExNzY0NzA1ODgyMzUyOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjMuMDg4MjM1Mjk0MTE3NjQ2NyIgY3AxeD0iMTQuMCIgY3AxeT0iMy4wODgyMzUyOTQxMTc2NDY3IiBjcDJ4PSIxNC4wIiBjcDJ5PSIzLjA4ODIzNTI5NDExNzY0NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDF4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgY3AxeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iMTMuMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIHk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AxeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMXk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AyeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMnk9IjEzLjAyOTQxMTc2NDcwNTg4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMy43NjQ3MDU4ODIzNTI5MzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTk4NDEzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzOTIxNTY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQ0NTc4MzQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgyIiBncmVlbj0iMjAzIiBibHVlPSIyMjIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTU1MzQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyMTU2ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNyIgZ3JlZW49IjIyOCIgYmx1ZT0iMjQ3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDczNzcwOTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDE5NjA3ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDAzIiB5Mj0iMC45OTc1NDkwMTk2MDc4NDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMy43MDU4ODIzNTI5NDExNzQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU5IiBncmVlbj0iODUiIGJsdWU9IjEwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTM0ODMxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE3Njk5ODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyMTU2ODY1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iNiIgYmx1ZT0iMzAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNTQ2ODE3MiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40MzEzNzI1OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MjEwMDg0MDMzNjEzNDQ1IiB5Mj0iMC45OTU3OTgzMTkzMjc3MzExIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjE3LjQiIHkxPSIwLjYiIHkyPSIxNy40IiByb3VuZGluZz0iNy45OTk5OTk5OTk5OTk5OTkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjYiIGdyZWVuPSIxNzAiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyNzQwODg5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTczNTY3NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNDUwOTgwMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wMjk0MTE3NjQ3MDU4ODIiIHk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI1LjAyOTQxMTc2NDcwNTg4MiIgY3AxeT0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjUuMDI5NDExNzY0NzA1ODgyIiBjcDJ5PSI4LjA1ODgyMzUyOTQxMTc2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMDI5NDExNzY0NzA1ODgyIiB5PSI4LjA1ODgyMzUyOTQxMTc2NCIgY3AxeD0iNy4wMjk0MTE3NjQ3MDU4ODIiIGNwMXk9IjguMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI3LjAyOTQxMTc2NDcwNTg4MiIgY3AyeT0iOC4wNTg4MjM1Mjk0MTE3NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgeT0iMTEuMDU4ODIzNTI5NDExNzY0IiBjcDF4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AxeT0iMTEuMDU4ODIzNTI5NDExNzY0IiBjcDJ4PSI4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iMTEuMDU4ODIzNTI5NDExNzY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiB5PSIzLjExNzY0NzA1ODgyMzUyOSIgY3AxeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiBjcDF5PSIzLjExNzY0NzA1ODgyMzUyOSIgY3AyeD0iMTEuNTg4MjM1Mjk0MTE3NjQ3IiBjcDJ5PSIzLjExNzY0NzA1ODgyMzUyOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjMuMDg4MjM1Mjk0MTE3NjQ2NyIgY3AxeD0iMTQuMCIgY3AxeT0iMy4wODgyMzUyOTQxMTc2NDY3IiBjcDJ4PSIxNC4wIiBjcDJ5PSIzLjA4ODIzNTI5NDExNzY0NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDF4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgY3AxeT0iMTMuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSI4Ljk0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iMTMuMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIHk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AxeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMXk9IjEzLjAyOTQxMTc2NDcwNTg4MiIgY3AyeD0iOC4wNTg4MjM1Mjk0MTE3NjQiIGNwMnk9IjEzLjAyOTQxMTc2NDcwNTg4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjE1LjAiIHkxPSIzLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMy43NjQ3MDU4ODIzNTI5MzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMCIgZ3JlZW49IjIyNCIgYmx1ZT0iMjMwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTIyMzYwNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0NDU3ODM0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjIxMCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjcyMjExNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDkiIGdyZWVuPSIyMTUiIGJsdWU9IjIyNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTY4NzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI5NDExNzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDAzIiB5Mj0iMC45OTc1NDkwMTk2MDc4NDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE2LjAiIHkxPSIyLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMy43MDU4ODIzNTI5NDExNzQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MSIgZ3JlZW49IjE5NyIgYmx1ZT0iMjA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDM3NzEwNzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDYyNzQ1MDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzgiIGdyZWVuPSIxODUiIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDIyMjIyMjIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzMjgwNjEwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTIxMDA4NDAzMzYxMzQ0NSIgeTI9IjAuOTk1Nzk4MzE5MzI3NzMxMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgPC9yZWdpb25zPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KQ29sb3JDaG9vc2VyIiBuYW1lPSJDb2xvckNob29zZXIiIHVpPSJDb2xvckNob29zZXJVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSI1IiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0ic3dhdGNoZXNEZWZhdWx0UmVjZW50Q29sb3IiIHR5cGU9IkNPTE9SIj4KKyAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICA8L3VpUHJvcGVydHk+CisgICAgICAgICAgICA8L3VpcHJvcGVydGllcz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zPgorICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIGNvbXBvbmVudE5hbWU9IkNvbG9yQ2hvb3Nlci5wcmV2aWV3UGFuZWxIb2xkZXIiIHR5cGU9ImphdmF4LnN3aW5nLkpQYW5lbCIgbmFtZT0iUGFuZWwiIHVpPSJQYW5lbFVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIxMCIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiBjb21wb25lbnROYW1lPSJPcHRpb25QYW5lLmxhYmVsIiB0eXBlPSJqYXZheC5zd2luZy5KTGFiZWwiIG5hbWU9IkxhYmVsIiB1aT0iTGFiZWxVSSIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMTAiIGxlZnQ9IjEwIiByaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgICAgICAgPC9yZWdpb25zPgorICAgICAgICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSkNvbWJvQm94IiBuYW1lPSJDb21ib0JveCIgdWk9IkNvbWJvQm94VUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXM+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRW5hYmxlZCIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9Ik1vdXNlT3ZlciIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlByZXNzZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJTZWxlY3RlZCIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkRpc2FibGVkIi8+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRm9jdXNlZCIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkVkaXRhYmxlIj4KKyAgICAgICAgICAgICAgIDxjb2RlU25pcHBldD48IVtDREFUQVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoSkNvbWJvQm94KWMpLmlzRWRpdGFibGUoKTtdXT48L2NvZGVTbmlwcGV0PgorICAgICAgICAgICAgPC9zdGF0ZVR5cGU+CisgICAgICAgICA8L3N0YXRlVHlwZXM+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iZm9yY2VPcGFxdWUiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJidXR0b25XaGVuTm90RWRpdGFibGUiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJyZW5kZXJlclVzZUxpc3RDb2xvcnMiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icHJlc3NlZFdoZW5Qb3B1cFZpc2libGUiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJzcXVhcmVCdXR0b24iIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icG9wdXBJbnNldHMiIHR5cGU9IklOU0VUUyI+CisgICAgICAgICAgICAgICAgICA8aW5zZXRzIHRvcD0iLTIiIGJvdHRvbT0iMCIgbGVmdD0iMiIgcmlnaHQ9IjIiLz4KKyAgICAgICAgICAgICAgIDwvdWlQcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InBhZGRpbmciIHR5cGU9IklOU0VUUyI+CisgICAgICAgICAgICAgICAgICA8aW5zZXRzIHRvcD0iMyIgYm90dG9tPSIzIiBsZWZ0PSIzIiByaWdodD0iMyIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MyIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjgiIGJvdHRvbT0iOCIgbGVmdD0iOSIgcmlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMCIgZ3JlZW49IjIyNCIgYmx1ZT0iMjMwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTIyMzYwNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM0Mzc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjIxNSIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIzOTEyNDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU3NzQxODMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI1NDkwMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42MTkzMTgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjIxMCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjcyMjExNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDYiIGdyZWVuPSIyMTIiIGJsdWU9IjIyMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTY3ODQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMxNzY0NzA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjI1IiB5PSIzLjAiIGNwMXg9IjY0LjI1IiBjcDF5PSIzLjAiIGNwMng9IjY0LjI1IiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3NS4wIiB5PSIzLjAiIGNwMXg9Ijc1LjAiIGNwMXk9IjMuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODAuMCIgeT0iOC4wIiBjcDF4PSI4MC4wIiBjcDF5PSI0LjAiIGNwMng9IjgwLjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgwLjAiIHk9IjE2LjAiIGNwMXg9IjgwLjAiIGNwMXk9IjE2LjAiIGNwMng9IjgwLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3NS4wIiB5PSIyMS4wIiBjcDF4PSI3OS4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI3NS4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMjUiIHk9IjIxLjAiIGNwMXg9IjY0LjI1IiBjcDF5PSIyMS4wIiBjcDJ4PSI2NC4yNSIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIxOTciIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTYyODk4NzYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc4IiBncmVlbj0iMTg1IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTAyMzcyMTciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU1Nzk5NDA3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwNzg0MzEyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyLjAiIGNwMXg9Ijc2LjAiIGNwMXk9IjIuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iNy4wIiBjcDF4PSI4MS4wIiBjcDF5PSI0LjAiIGNwMng9IjgxLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE3LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjE3LjAiIGNwMng9IjgxLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyMi4wIiBjcDF4PSI3OS4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI3Ni4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjciIGdyZWVuPSIyMjkiIGJsdWU9IjIzMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjA5OTYzMjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzY0NzA1ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MDA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOSIgZ3JlZW49IjIyMSIgYmx1ZT0iMjI2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDQwMzk1OTc1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MDQ3NDA4NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMzcyNTQ4OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY2NDc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTUzNTU2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyNTQ5MDE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTYiIGdyZWVuPSIyMTkiIGJsdWU9IjIyNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI0LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIzLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjMuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjEuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjEuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMjEuMCIgY3AxeD0iOC4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI0LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjE2LjAiIGNwMXg9IjMuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSI3LjAiIGNwMXg9IjMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIzLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDEiIGdyZWVuPSIyMDQiIGJsdWU9IjIxMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTkyODU3MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNzQ1MDk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODgiIGdyZWVuPSIxOTEiIGJsdWU9IjE5NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTkwMDI5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIyMzUyOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI3LjAiIGNwMXg9IjIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTcuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSI4IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iLTI0NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE2LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxOC4wIiBjcDF4PSIyLjAiIGNwMXk9IjE4LjAiIGNwMng9IjIuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMjMuMCIgY3AxeD0iNC4wIiBjcDF5PSIyMy4wIiBjcDJ4PSI3LjAiIGNwMnk9IjIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyMy4wIiBjcDF4PSI3Ni4wIiBjcDF5PSIyMy4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iMTguMCIgY3AxeD0iODEuMCIgY3AxeT0iMjEuMCIgY3AyeD0iODEuMCIgY3AyeT0iMTguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE2LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjE2LjAiIGNwMng9IjgxLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2NmZjg4OTZhLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQrUHJlc3NlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MyIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjgiIGJvdHRvbT0iOCIgbGVmdD0iOSIgcmlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMCIgZ3JlZW49IjIyNCIgYmx1ZT0iMjMwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTIyMzYwNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM0Mzc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjIxNSIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIzOTEyNDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU3NzQxODMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI1NDkwMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42MTkzMTgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjIxMCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjcyMjExNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDYiIGdyZWVuPSIyMTIiIGJsdWU9IjIyMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTY3ODQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMxNzY0NzA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjI1IiB5PSIzLjAiIGNwMXg9IjY0LjI1IiBjcDF5PSIzLjAiIGNwMng9IjY0LjI1IiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3NS4wIiB5PSIzLjAiIGNwMXg9Ijc1LjAiIGNwMXk9IjMuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODAuMCIgeT0iOC4wIiBjcDF4PSI4MC4wIiBjcDF5PSI0LjAiIGNwMng9IjgwLjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgwLjAiIHk9IjE2LjAiIGNwMXg9IjgwLjAiIGNwMXk9IjE2LjAiIGNwMng9IjgwLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3NS4wIiB5PSIyMS4wIiBjcDF4PSI3OS4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI3NS4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMjUiIHk9IjIxLjAiIGNwMXg9IjY0LjI1IiBjcDF5PSIyMS4wIiBjcDJ4PSI2NC4yNSIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIxOTciIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTYyODk4NzYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc4IiBncmVlbj0iMTg1IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTAyMzcyMTciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU1Nzk5NDA3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwNzg0MzEyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyLjAiIGNwMXg9Ijc2LjAiIGNwMXk9IjIuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iNy4wIiBjcDF4PSI4MS4wIiBjcDF5PSI0LjAiIGNwMng9IjgxLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE3LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjE3LjAiIGNwMng9IjgxLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyMi4wIiBjcDF4PSI3OS4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI3Ni4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjciIGdyZWVuPSIyMjkiIGJsdWU9IjIzMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjA5OTYzMjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzY0NzA1ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MDA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOSIgZ3JlZW49IjIyMSIgYmx1ZT0iMjI2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDQwMzk1OTc1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MDQ3NDA4NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMzcyNTQ4OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY2NDc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTUzNTU2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyNTQ5MDE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTYiIGdyZWVuPSIyMTkiIGJsdWU9IjIyNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI0LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIzLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjMuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjEuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjEuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMjEuMCIgY3AxeD0iOC4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI0LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjE2LjAiIGNwMXg9IjMuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSI3LjAiIGNwMXg9IjMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIzLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDEiIGdyZWVuPSIyMDQiIGJsdWU9IjIxMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTkyODU3MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNzQ1MDk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODgiIGdyZWVuPSIxOTEiIGJsdWU9IjE5NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTkwMDI5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIyMzUyOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI3LjAiIGNwMXg9IjIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTcuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSI4IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iLTI0NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE2LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxOC4wIiBjcDF4PSIyLjAiIGNwMXk9IjE4LjAiIGNwMng9IjIuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMjMuMCIgY3AxeD0iNC4wIiBjcDF5PSIyMy4wIiBjcDJ4PSI3LjAiIGNwMnk9IjIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyMy4wIiBjcDF4PSI3Ni4wIiBjcDF5PSIyMy4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iMTguMCIgY3AxeD0iODEuMCIgY3AxeT0iMjEuMCIgY3AyeD0iODEuMCIgY3AyeT0iMTguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE2LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjE2LjAiIGNwMng9IjgxLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2NmZjg4OTZhLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MyIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjgiIGJvdHRvbT0iOCIgbGVmdD0iOSIgcmlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NiIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zNDM3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzkiIGdyZWVuPSIxOTciIGJsdWU9IjIxMiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMjg5NDEwMzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ4MDA1MzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjgyMzUyOTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42MTkzMTgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE4NCIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkxIiBncmVlbj0iMjEyIiBibHVlPSIyMzEiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MjU1NDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzU2ODYyNzIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMjUiIHk9IjMuMCIgY3AxeD0iNjQuMjUiIGNwMXk9IjMuMCIgY3AyeD0iNjQuMjUiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc1LjAiIHk9IjMuMCIgY3AxeD0iNzUuMCIgY3AxeT0iMy4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MC4wIiB5PSI4LjAiIGNwMXg9IjgwLjAiIGNwMXk9IjQuMCIgY3AyeD0iODAuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODAuMCIgeT0iMTYuMCIgY3AxeD0iODAuMCIgY3AxeT0iMTYuMCIgY3AyeD0iODAuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc1LjAiIHk9IjIxLjAiIGNwMXg9Ijc5LjAiIGNwMXk9IjIxLjAiIGNwMng9Ijc1LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4yNSIgeT0iMjEuMCIgY3AxeD0iNjQuMjUiIGNwMXk9IjIxLjAiIGNwMng9IjY0LjI1IiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk4IiBncmVlbj0iMTE5IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNDU4NTkyMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNCIgZ3JlZW49IjU1IiBibHVlPSI3NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NTE3Mzc3NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjU4ODIzNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMi4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc2LjAiIHk9IjIuMCIgY3AxeD0iNzYuMCIgY3AxeT0iMi4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MS4wIiB5PSI3LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjQuMCIgY3AyeD0iODEuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iMTcuMCIgY3AxeD0iODEuMCIgY3AxeT0iMTcuMCIgY3AyeD0iODEuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc2LjAiIHk9IjIyLjAiIGNwMXg9Ijc5LjAiIGNwMXk9IjIyLjAiIGNwMng9Ijc2LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyMi4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MSIgZ3JlZW49IjI1MSIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjMxNzQ2MDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MDA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNCIgZ3JlZW49IjIyNiIgYmx1ZT0iMjMxIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNDAzOTU5NzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYwNTQxMTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzU2ODYyNzIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NjQ3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTUzNTU2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyNTQ5MDE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDIiIGdyZWVuPSIyNDUiIGJsdWU9IjI1MSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTk4NTc3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIzLjAiIGNwMXg9IjQuMCIgY3AxeT0iMy4wIiBjcDJ4PSI4LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjMuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMy4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyMS4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIyMS4wIiBjcDF4PSI4LjAiIGNwMXk9IjIxLjAiIGNwMng9IjQuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTYuMCIgY3AxeD0iMy4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIzLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjcuMCIgY3AxeD0iMy4wIiBjcDF5PSI3LjAiIGNwMng9IjMuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1MiIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41Nzg3NTIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3MDU4ODIzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NSIgZ3JlZW49Ijg4IiBibHVlPSI5NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTM5OTY5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTgwMzkyMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI3LjAiIGNwMXg9IjIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTcuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE5IiBncmVlbj0iMTI0IiBibHVlPSIxMzQiIGFscGhhPSI3OSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIyIiBhbHBoYU9mZnNldD0iLTE3NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE2LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxOC4wIiBjcDF4PSIyLjAiIGNwMXk9IjE4LjAiIGNwMng9IjIuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMjMuMCIgY3AxeD0iNC4wIiBjcDF5PSIyMy4wIiBjcDJ4PSI3LjAiIGNwMnk9IjIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyMy4wIiBjcDF4PSI3Ni4wIiBjcDF5PSIyMy4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iMTguMCIgY3AxeD0iODEuMCIgY3AxeT0iMjEuMCIgY3AyeD0iODEuMCIgY3AyeT0iMTguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE2LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjE2LjAiIGNwMng9IjgxLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2NmZTU5YmQ0LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MyIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjgiIGJvdHRvbT0iOCIgbGVmdD0iOSIgcmlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NiIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zNDM3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzkiIGdyZWVuPSIxOTciIGJsdWU9IjIxMiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMjg5NDEwMzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ4MDA1MzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjgyMzUyOTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42MTkzMTgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE4NCIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkxIiBncmVlbj0iMjEyIiBibHVlPSIyMzEiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MjU1NDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzU2ODYyNzIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMjUiIHk9IjMuMCIgY3AxeD0iNjQuMjUiIGNwMXk9IjMuMCIgY3AyeD0iNjQuMjUiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc1LjAiIHk9IjMuMCIgY3AxeD0iNzUuMCIgY3AxeT0iMy4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MC4wIiB5PSI4LjAiIGNwMXg9IjgwLjAiIGNwMXk9IjQuMCIgY3AyeD0iODAuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODAuMCIgeT0iMTYuMCIgY3AxeD0iODAuMCIgY3AxeT0iMTYuMCIgY3AyeD0iODAuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc1LjAiIHk9IjIxLjAiIGNwMXg9Ijc5LjAiIGNwMXk9IjIxLjAiIGNwMng9Ijc1LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4yNSIgeT0iMjEuMCIgY3AxeD0iNjQuMjUiIGNwMXk9IjIxLjAiIGNwMng9IjY0LjI1IiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk4IiBncmVlbj0iMTE5IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNDU4NTkyMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNCIgZ3JlZW49IjU1IiBibHVlPSI3NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NTE3Mzc3NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjU4ODIzNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMi4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc2LjAiIHk9IjIuMCIgY3AxeD0iNzYuMCIgY3AxeT0iMi4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MS4wIiB5PSI3LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjQuMCIgY3AyeD0iODEuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iMTcuMCIgY3AxeD0iODEuMCIgY3AxeT0iMTcuMCIgY3AyeD0iODEuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc2LjAiIHk9IjIyLjAiIGNwMXg9Ijc5LjAiIGNwMXk9IjIyLjAiIGNwMng9Ijc2LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyMi4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MSIgZ3JlZW49IjI1MSIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjMxNzQ2MDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MDA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNCIgZ3JlZW49IjIyNiIgYmx1ZT0iMjMxIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNDAzOTU5NzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYwNTQxMTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzU2ODYyNzIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NjQ3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTUzNTU2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyNTQ5MDE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDIiIGdyZWVuPSIyNDUiIGJsdWU9IjI1MSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTk4NTc3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIzLjAiIGNwMXg9IjQuMCIgY3AxeT0iMy4wIiBjcDJ4PSI4LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjMuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMy4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyMS4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIyMS4wIiBjcDF4PSI4LjAiIGNwMXk9IjIxLjAiIGNwMng9IjQuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTYuMCIgY3AxeD0iMy4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIzLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjcuMCIgY3AxeD0iMy4wIiBjcDF5PSI3LjAiIGNwMng9IjMuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1MiIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41Nzg3NTIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3MDU4ODIzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NSIgZ3JlZW49Ijg4IiBibHVlPSI5NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTM5OTY5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTgwMzkyMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI3LjAiIGNwMXg9IjIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTcuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjgyLjQiIHkxPSIwLjYiIHkyPSIyMy40IiByb3VuZGluZz0iMTMuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iODMiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI4IiBib3R0b209IjgiIGxlZnQ9IjkiIHJpZ2h0PSIxOSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDgiIGdyZWVuPSIyNTAiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTk4NDEzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzOTIxNTY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzQzNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAwIiBncmVlbj0iMjE2IiBibHVlPSIyMzAiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItOC43Mzg2MzdFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUwNTI3OTU0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM1Mjk0MTE2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjE5MzE4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIyMDMiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU1NTM0MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjE1Njg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIyMTIiIGJsdWU9IjIzMSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDYyNTU0MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNTY4NjI3MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEwIiBncmVlbj0iMjMxIiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3NTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMjUiIHk9IjMuMCIgY3AxeD0iNjQuMjUiIGNwMXk9IjMuMCIgY3AyeD0iNjQuMjUiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc1LjAiIHk9IjMuMCIgY3AxeD0iNzUuMCIgY3AxeT0iMy4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MC4wIiB5PSI4LjAiIGNwMXg9IjgwLjAiIGNwMXk9IjQuMCIgY3AyeD0iODAuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODAuMCIgeT0iMTYuMCIgY3AxeD0iODAuMCIgY3AxeT0iMTYuMCIgY3AyeD0iODAuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc1LjAiIHk9IjIxLjAiIGNwMXg9Ijc5LjAiIGNwMXk9IjIxLjAiIGNwMng9Ijc1LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4yNSIgeT0iMjEuMCIgY3AxeD0iNjQuMjUiIGNwMXk9IjIxLjAiIGNwMng9IjY0LjI1IiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU5IiBncmVlbj0iODUiIGJsdWU9IjEwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTM0ODMxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE3Njk5ODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyMTU2ODY1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iNSIgYmx1ZT0iMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNTkyNzkzODIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDM1Mjk0MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMi4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc2LjAiIHk9IjIuMCIgY3AxeD0iNzYuMCIgY3AxeT0iMi4wIiBjcDJ4PSI3OS4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MS4wIiB5PSI3LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjQuMCIgY3AyeD0iODEuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iMTcuMCIgY3AxeD0iODEuMCIgY3AxeT0iMTcuMCIgY3AyeD0iODEuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc2LjAiIHk9IjIyLjAiIGNwMXg9Ijc5LjAiIGNwMXk9IjIyLjAiIGNwMng9Ijc2LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyMi4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MyIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjMxNzc3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NDcwNTg4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDAwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDAiIGdyZWVuPSIyNDIiIGJsdWU9IjI0NiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTEzMjQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQxNTY4NjI1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjY0NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk4NTI0MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zOTk5OTk5OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIzLjAiIGNwMXg9IjQuMCIgY3AxeT0iMy4wIiBjcDJ4PSI4LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjMuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMy4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyMS4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIyMS4wIiBjcDF4PSI4LjAiIGNwMXk9IjIxLjAiIGNwMng9IjQuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTYuMCIgY3AxeD0iMy4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIzLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjcuMCIgY3AxeD0iMy4wIiBjcDF5PSI3LjAiIGNwMng9IjMuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMiIgZ3JlZW49IjEyNiIgYmx1ZT0iMTM0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NDYxNjIwNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQyIiBncmVlbj0iNDYiIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40MTM0OTIwOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzM3MjU0OTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI3LjAiIGNwMXg9IjIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTcuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjgyLjQiIHkxPSIwLjYiIHkyPSIyMy40IiByb3VuZGluZz0iMTMuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2NmZmNlMzVhLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjgzIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iOCIgYm90dG9tPSI4IiBsZWZ0PSI5IiByaWdodD0iMTkiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ4IiBncmVlbj0iMjUwIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5ODQxMyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzkyMTU2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM0Mzc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMCIgZ3JlZW49IjIxNiIgYmx1ZT0iMjMwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTguNzM4NjM3RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MDUyNzk1NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYxOTMxODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgyIiBncmVlbj0iMjAzIiBibHVlPSIyMjIiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NTUzNDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkxIiBncmVlbj0iMjEyIiBibHVlPSIyMzEiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MjU1NDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzU2ODYyNzIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjIzMSIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjI1IiB5PSIzLjAiIGNwMXg9IjY0LjI1IiBjcDF5PSIzLjAiIGNwMng9IjY0LjI1IiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3NS4wIiB5PSIzLjAiIGNwMXg9Ijc1LjAiIGNwMXk9IjMuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODAuMCIgeT0iOC4wIiBjcDF4PSI4MC4wIiBjcDF5PSI0LjAiIGNwMng9IjgwLjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgwLjAiIHk9IjE2LjAiIGNwMXg9IjgwLjAiIGNwMXk9IjE2LjAiIGNwMng9IjgwLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3NS4wIiB5PSIyMS4wIiBjcDF4PSI3OS4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI3NS4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMjUiIHk9IjIxLjAiIGNwMXg9IjY0LjI1IiBjcDF5PSIyMS4wIiBjcDJ4PSI2NC4yNSIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1OSIgZ3JlZW49Ijg1IiBibHVlPSIxMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDEzNDgzMTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xNzY5OTg3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjE1Njg2NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjUiIGJsdWU9IjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDU5Mjc5MzgyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQzNTI5NDE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyLjAiIGNwMXg9Ijc2LjAiIGNwMXk9IjIuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iNy4wIiBjcDF4PSI4MS4wIiBjcDF5PSI0LjAiIGNwMng9IjgxLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE3LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjE3LjAiIGNwMng9IjgxLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyMi4wIiBjcDF4PSI3OS4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI3Ni4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTMiIGdyZWVuPSIyNTMiIGJsdWU9IjI1NCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzMTc3NzMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDQ3MDU4OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQwMDU2ODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQwIiBncmVlbj0iMjQyIiBibHVlPSIyNDYiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjExMzI0MSIgYnJpZ2h0bmVzc09mZnNldD0iMC40MTU2ODYyNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY2NDc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU5ODUyNDIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzk5OTk5OTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI0LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIzLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjMuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjEuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjEuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMjEuMCIgY3AxeD0iOC4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI0LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjE2LjAiIGNwMXg9IjMuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSI3LjAiIGNwMXg9IjMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIzLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjIiIGdyZWVuPSIxMjYiIGJsdWU9IjEzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTQ2MTYyMDciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MiIgZ3JlZW49IjQ2IiBibHVlPSI1NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDEzNDkyMDgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMzNzI1NDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iNy4wIiBjcDF4PSIyLjAiIGNwMXk9IjQuMCIgY3AyeD0iMi4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE3LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTcuMCIgY3AyeD0iMi4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIyMi4wIiBjcDF4PSI0LjAiIGNwMXk9IjIyLjAiIGNwMng9IjcuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIyLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjIyLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIyLjAiIGNwMXg9IjcuMCIgY3AxeT0iMi4wIiBjcDJ4PSI0LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExOSIgZ3JlZW49IjEyNCIgYmx1ZT0iMTM0IiBhbHBoYT0iNzkiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMiIgYWxwaGFPZmZzZXQ9Ii0xNzYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNi4wIiBjcDF4PSIyLjAiIGNwMXk9IjE2LjAiIGNwMng9IjIuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTguMCIgY3AxeD0iMi4wIiBjcDF5PSIxOC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIzLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjMuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzYuMCIgeT0iMjMuMCIgY3AxeD0iNzYuMCIgY3AxeT0iMjMuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE4LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjIxLjAiIGNwMng9IjgxLjAiIGNwMnk9IjE4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MS4wIiB5PSIxNi4wIiBjcDF4PSI4MS4wIiBjcDF5PSIxNi4wIiBjcDJ4PSI4MS4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNjZmZjZTM1YS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MyIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjgiIGJvdHRvbT0iOCIgbGVmdD0iOSIgcmlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MyIgZ3JlZW49IjE2OSIgYmx1ZT0iMTkyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTQuMjAzMzE5NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzgwNTA1OTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zNDM3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3NiIgZ3JlZW49IjExNyIgYmx1ZT0iMTU0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNC4wODE3MjZFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyOTIyMDc4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1NDkwMTk1OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYxOTMxODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTMiIGdyZWVuPSIxMDAiIGJsdWU9IjE0MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA4OTUzNzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NiIgZ3JlZW49IjE0NiIgYmx1ZT0iMTg5IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNTkwNzI4OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTQzNjUwOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTIxNTY4NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4yNSIgeT0iMy4wIiBjcDF4PSI2NC4yNSIgY3AxeT0iMy4wIiBjcDJ4PSI2NC4yNSIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzUuMCIgeT0iMy4wIiBjcDF4PSI3NS4wIiBjcDF5PSIzLjAiIGNwMng9Ijc5LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgwLjAiIHk9IjguMCIgY3AxeD0iODAuMCIgY3AxeT0iNC4wIiBjcDJ4PSI4MC4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MC4wIiB5PSIxNi4wIiBjcDF4PSI4MC4wIiBjcDF5PSIxNi4wIiBjcDJ4PSI4MC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzUuMCIgeT0iMjEuMCIgY3AxeD0iNzkuMCIgY3AxeT0iMjEuMCIgY3AyeD0iNzUuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjI1IiB5PSIyMS4wIiBjcDF4PSI2NC4yNSIgY3AxeT0iMjEuMCIgY3AyeD0iNjQuMjUiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyOCIgZ3JlZW49IjU2IiBibHVlPSI4MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMy41Mjg1OTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDE4NjA2NzIyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzEzNzI1NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzYuMCIgeT0iMi4wIiBjcDF4PSI3Ni4wIiBjcDF5PSIyLjAiIGNwMng9Ijc5LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjcuMCIgY3AxeD0iODEuMCIgY3AxeT0iNC4wIiBjcDJ4PSI4MS4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MS4wIiB5PSIxNy4wIiBjcDF4PSI4MS4wIiBjcDF5PSIxNy4wIiBjcDJ4PSI4MS4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzYuMCIgeT0iMjIuMCIgY3AxeD0iNzkuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNzYuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIyLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjIyLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA1IiBncmVlbj0iMjA5IiBibHVlPSIyMTYiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyNzQwODg5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTg0Nzg4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yOTgwMzkyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDAwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzIiIGdyZWVuPSIxNzkiIGJsdWU9IjE5MSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI2NjExNTA3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MzYyMzc4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY2NDc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjk2ODE2ODMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyNzAxODY3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE3MjU0OTAxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMDgiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDM4MDE0OTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU0NTYyNDIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjMuMCIgY3AxeD0iNC4wIiBjcDF5PSIzLjAiIGNwMng9IjguMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMy4wIiBjcDF4PSI2NC4wIiBjcDF5PSIzLjAiIGNwMng9IjY0LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIxLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjIxLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjIxLjAiIGNwMXg9IjguMCIgY3AxeT0iMjEuMCIgY3AyeD0iNC4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNi4wIiBjcDF4PSIzLjAiIGNwMXk9IjIwLjAiIGNwMng9IjMuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iNy4wIiBjcDF4PSIzLjAiIGNwMXk9IjcuMCIgY3AyeD0iMy4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC41MjE1Njg2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTYiIGdyZWVuPSIxMDAiIGJsdWU9IjEwOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTI0NjAzMiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTI1NDkwMjIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI3LjAiIGNwMXg9IjIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTcuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjgyLjQiIHkxPSIwLjYiIHkyPSIyMy40IiByb3VuZGluZz0iMTMuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2NmZmYzYzI2LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MyIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjgiIGJvdHRvbT0iOCIgbGVmdD0iOSIgcmlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MyIgZ3JlZW49IjE2OSIgYmx1ZT0iMTkyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTQuMjAzMzE5NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzgwNTA1OTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zNDM3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3NiIgZ3JlZW49IjExNyIgYmx1ZT0iMTU0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNC4wODE3MjZFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyOTIyMDc4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1NDkwMTk1OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYxOTMxODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTMiIGdyZWVuPSIxMDAiIGJsdWU9IjE0MiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA4OTUzNzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NiIgZ3JlZW49IjE0NiIgYmx1ZT0iMTg5IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNTkwNzI4OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTQzNjUwOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTIxNTY4NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4yNSIgeT0iMy4wIiBjcDF4PSI2NC4yNSIgY3AxeT0iMy4wIiBjcDJ4PSI2NC4yNSIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzUuMCIgeT0iMy4wIiBjcDF4PSI3NS4wIiBjcDF5PSIzLjAiIGNwMng9Ijc5LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgwLjAiIHk9IjguMCIgY3AxeD0iODAuMCIgY3AxeT0iNC4wIiBjcDJ4PSI4MC4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MC4wIiB5PSIxNi4wIiBjcDF4PSI4MC4wIiBjcDF5PSIxNi4wIiBjcDJ4PSI4MC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzUuMCIgeT0iMjEuMCIgY3AxeD0iNzkuMCIgY3AxeT0iMjEuMCIgY3AyeD0iNzUuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjI1IiB5PSIyMS4wIiBjcDF4PSI2NC4yNSIgY3AxeT0iMjEuMCIgY3AyeD0iNjQuMjUiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyOCIgZ3JlZW49IjU2IiBibHVlPSI4MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMy41Mjg1OTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDE4NjA2NzIyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzEzNzI1NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzYuMCIgeT0iMi4wIiBjcDF4PSI3Ni4wIiBjcDF5PSIyLjAiIGNwMng9Ijc5LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjcuMCIgY3AxeD0iODEuMCIgY3AxeT0iNC4wIiBjcDJ4PSI4MS4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MS4wIiB5PSIxNy4wIiBjcDF4PSI4MS4wIiBjcDF5PSIxNy4wIiBjcDJ4PSI4MS4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzYuMCIgeT0iMjIuMCIgY3AxeD0iNzkuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNzYuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIyLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjIyLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA1IiBncmVlbj0iMjA5IiBibHVlPSIyMTYiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyNzQwODg5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTg0Nzg4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yOTgwMzkyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDAwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzIiIGdyZWVuPSIxNzkiIGJsdWU9IjE5MSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI2NjExNTA3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MzYyMzc4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY2NDc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjk2ODE2ODMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyNzAxODY3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE3MjU0OTAxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMDgiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDM4MDE0OTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU0NTYyNDIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjMuMCIgY3AxeD0iNC4wIiBjcDF5PSIzLjAiIGNwMng9IjguMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMy4wIiBjcDF4PSI2NC4wIiBjcDF5PSIzLjAiIGNwMng9IjY0LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIxLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjIxLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjIxLjAiIGNwMXg9IjguMCIgY3AxeT0iMjEuMCIgY3AyeD0iNC4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNi4wIiBjcDF4PSIzLjAiIGNwMXk9IjIwLjAiIGNwMng9IjMuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iNy4wIiBjcDF4PSIzLjAiIGNwMXk9IjcuMCIgY3AyeD0iMy4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC41MjE1Njg2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTYiIGdyZWVuPSIxMDAiIGJsdWU9IjEwOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTI0NjAzMiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTI1NDkwMjIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI3LjAiIGNwMXg9IjIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTcuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjQuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIxNzIiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTgzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTYuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIyLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE4LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTguMCIgY3AyeD0iMi4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIyMy4wIiBjcDF4PSI0LjAiIGNwMXk9IjIzLjAiIGNwMng9IjcuMCIgY3AyeT0iMjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc2LjAiIHk9IjIzLjAiIGNwMXg9Ijc2LjAiIGNwMXk9IjIzLjAiIGNwMng9Ijc5LjAiIGNwMnk9IjIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MS4wIiB5PSIxOC4wIiBjcDF4PSI4MS4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI4MS4wIiBjcDJ5PSIxOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iMTYuMCIgY3AxeD0iODEuMCIgY3AxeT0iMTYuMCIgY3AyeD0iODEuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzY2ZmZjNjMjYucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjgzIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iOCIgYm90dG9tPSI4IiBsZWZ0PSI5IiByaWdodD0iMTkiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQzIiBncmVlbj0iMTY5IiBibHVlPSIxOTIiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItNC4yMDMzMTk1RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zODA1MDU5NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM0Mzc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc2IiBncmVlbj0iMTE3IiBibHVlPSIxNTQiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI0LjA4MTcyNkUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTI5MjIwNzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDU0OTAxOTU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjE5MzE4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MyIgZ3JlZW49IjEwMCIgYmx1ZT0iMTQyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDg5NTM3NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk2IiBncmVlbj0iMTQ2IiBibHVlPSIxODkiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDE1OTA3Mjg4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xNDM2NTA4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE5MjE1Njg1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjI1IiB5PSIzLjAiIGNwMXg9IjY0LjI1IiBjcDF5PSIzLjAiIGNwMng9IjY0LjI1IiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3NS4wIiB5PSIzLjAiIGNwMXg9Ijc1LjAiIGNwMXk9IjMuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODAuMCIgeT0iOC4wIiBjcDF4PSI4MC4wIiBjcDF5PSI0LjAiIGNwMng9IjgwLjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgwLjAiIHk9IjE2LjAiIGNwMXg9IjgwLjAiIGNwMXk9IjE2LjAiIGNwMng9IjgwLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3NS4wIiB5PSIyMS4wIiBjcDF4PSI3OS4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI3NS4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMjUiIHk9IjIxLjAiIGNwMXg9IjY0LjI1IiBjcDF5PSIyMS4wIiBjcDJ4PSI2NC4yNSIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI4IiBncmVlbj0iNTYiIGJsdWU9IjgxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0zLjUyODU5NUUtNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTg2MDY3MjIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzMTM3MjU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjY0LjAiIHk9IjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyLjAiIGNwMXg9Ijc2LjAiIGNwMXk9IjIuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuMCIgeT0iNy4wIiBjcDF4PSI4MS4wIiBjcDF5PSI0LjAiIGNwMng9IjgxLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE3LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjE3LjAiIGNwMng9IjgxLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3Ni4wIiB5PSIyMi4wIiBjcDF4PSI3OS4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI3Ni4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjIuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjIuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDUiIGdyZWVuPSIyMDkiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI3NDA4ODk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41ODQ3ODg0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5ODAzOTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MDA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MiIgZ3JlZW49IjE3OSIgYmx1ZT0iMTkxIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjY2MTE1MDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUzNjIzNzg0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE5OTk5OTk5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjY0NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTcxIiBibHVlPSIxODQiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTY4MTY4MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTI3MDE4NjciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTcyNTQ5MDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMiIgZ3JlZW49IjIwOCIgYmx1ZT0iMjIyIiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzgwMTQ5NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTQ1NjI0MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjE1Njg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI0LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIzLjAiIGNwMXg9IjY0LjAiIGNwMXk9IjMuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMjEuMCIgY3AxeD0iNjQuMCIgY3AxeT0iMjEuMCIgY3AyeD0iNjQuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMjEuMCIgY3AxeD0iOC4wIiBjcDF5PSIyMS4wIiBjcDJ4PSI0LjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjE2LjAiIGNwMXg9IjMuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSI3LjAiIGNwMXg9IjMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIzLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUyMTU2ODY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NiIgZ3JlZW49IjEwMCIgYmx1ZT0iMTA4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MjQ2MDMyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAyMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjcuMCIgY3AxeD0iMi4wIiBjcDF5PSI0LjAiIGNwMng9IjIuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNy4wIiBjcDF4PSIyLjAiIGNwMXk9IjE3LjAiIGNwMng9IjIuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMjIuMCIgY3AxeD0iNC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI3LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2NC4wIiB5PSIyMi4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSI2NC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNjQuMCIgeT0iMi4wIiBjcDF4PSI2NC4wIiBjcDF5PSIyLjAiIGNwMng9IjY0LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMi4wIiBjcDF4PSI3LjAiIGNwMXk9IjIuMCIgY3AyeD0iNC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjE2NyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItODgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNi4wIiBjcDF4PSIyLjAiIGNwMXk9IjE2LjAiIGNwMng9IjIuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTguMCIgY3AxeD0iMi4wIiBjcDF5PSIxOC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIzLjAiIGNwMXg9IjQuMCIgY3AxeT0iMjMuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNzYuMCIgeT0iMjMuMCIgY3AxeD0iNzYuMCIgY3AxeT0iMjMuMCIgY3AyeD0iNzkuMCIgY3AyeT0iMjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjgxLjAiIHk9IjE4LjAiIGNwMXg9IjgxLjAiIGNwMXk9IjIxLjAiIGNwMng9IjgxLjAiIGNwMnk9IjE4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4MS4wIiB5PSIxNi4wIiBjcDF4PSI4MS4wIiBjcDF5PSIxNi4wIiBjcDJ4PSI4MS4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNjZmZmM2MyNi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkK0VkaXRhYmxlIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9Ijc5IiBoZWlnaHQ9IjIxIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNiIgYm90dG9tPSI2IiBsZWZ0PSI1IiByaWdodD0iMTciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMzAuMCIgeDI9IjMwLjAiIHkxPSIxMC4wIiB5Mj0iMTAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49IjUzIiBibHVlPSI1NyIgYWxwaGE9IjY0IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwNTI2MzE1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTIxNTY4NjYiIGFscGhhT2Zmc2V0PSItMTkxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrRWRpdGFibGUiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNzkiIGhlaWdodD0iMjEiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI2IiBib3R0b209IjYiIGxlZnQ9IjUiIHJpZ2h0PSIxNyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzMC4wIiB4Mj0iMzAuMCIgeTE9IjEwLjAiIHkyPSIxMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iNTMiIGJsdWU9IjU3IiBhbHBoYT0iNjQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA1MjYzMTU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC41MjE1Njg2NiIgYWxwaGFPZmZzZXQ9Ii0xOTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCtFZGl0YWJsZSI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxNDIiIGhlaWdodD0iMjciLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuNiIgeT0iMC42IiBjcDF4PSIwLjYiIGNwMXk9IjAuNiIgY3AyeD0iMC42IiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMzYuNCIgeT0iMC42IiBjcDF4PSIxMzYuNCIgY3AxeT0iMC42IiBjcDJ4PSIxMzkuNCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQxLjQiIHk9IjYuNiIgY3AxeD0iMTQxLjQiIGNwMXk9IjMuNiIgY3AyeD0iMTQxLjQiIGNwMnk9IjYuNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0MS40IiB5PSIyMS40IiBjcDF4PSIxNDEuNCIgY3AxeT0iMjEuNCIgY3AyeD0iMTQxLjQiIGNwMnk9IjI0LjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMzYuNCIgeT0iMjYuNCIgY3AxeD0iMTM5LjQiIGNwMXk9IjI2LjQiIGNwMng9IjEzNi40IiBjcDJ5PSIyNi40Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42IiB5PSIyNi40IiBjcDF4PSIwLjYiIGNwMXk9IjI2LjQiIGNwMng9IjAuNiIgY3AyeT0iMjYuNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0ZDk0NjU0ZGMucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitFZGl0YWJsZSI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3OSIgaGVpZ2h0PSIyMSIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjQiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMwLjAiIHgyPSIzMC4wIiB5MT0iMTAuMCIgeTI9IjEwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTEiIGdyZWVuPSI1MyIgYmx1ZT0iNTciIGFscGhhPSI2NCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDUyNjMxNTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUyMTU2ODY2IiBhbHBoYU9mZnNldD0iLTE5MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkK0VkaXRhYmxlIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9Ijc5IiBoZWlnaHQ9IjIxIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNCIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iMTciLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMzAuMCIgeDI9IjMwLjAiIHkxPSIxMC4wIiB5Mj0iMTAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49IjUzIiBibHVlPSI1NyIgYWxwaGE9IjY0IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwNTI2MzE1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTIxNTY4NjYiIGFscGhhT2Zmc2V0PSItMTkxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnM+CisgICAgICAgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgY29tcG9uZW50TmFtZT0iQ29tYm9Cb3gudGV4dEZpZWxkIiB0eXBlPSJqYXZheC5zd2luZy5KVGV4dEZpZWxkIiBuYW1lPSJUZXh0RmllbGQiIHVpPSJUZXh0RmllbGRVSSIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iNiIgcmlnaHQ9IjMiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Rpc2FibGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI2NCIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iMyIgbGVmdD0iMyIgcmlnaHQ9IjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIyIiBncmVlbj0iMjI1IiBibHVlPSIyMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTY1ODY0ODMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYwNTE0NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzQ5MDE5NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA4IiBncmVlbj0iMjEwIiBibHVlPSIyMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNDAzOTU5NzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYwMzE1NjE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5NDExNzYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2NC4wIiB5MT0iMy4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjAiIGdyZWVuPSIyMjIiIGJsdWU9IjIyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3OTY4OTMxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0NTA5ODAzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTIiIGdyZWVuPSIyMTQiIGJsdWU9IjIxOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3ODU2Mjg0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMS4wIiB4Mj0iMC41IiB5Mj0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjY0LjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5OSIgZ3JlZW49IjIwMiIgYmx1ZT0iMjA3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MTg3ODk3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMDQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NzAzMzQ5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3NDUwOTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjIyLjAiIHkyPSIyMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMTgiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzQ1MDk4MDUiIGFscGhhT2Zmc2V0PSItMjM3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNjZmU0ZTAyMS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNjQiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjMiIGxlZnQ9IjMiIHJpZ2h0PSIxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjY0LjAiIHkxPSI1LjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkyIiBncmVlbj0iMTkyIiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUzNDQ5NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2NC4wIiB5MT0iMy4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDMiIGdyZWVuPSIyMDMiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuNjY2NjY2NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMDQ5MDE5NjEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE5OTk5OTk5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjIuMCIgeTI9IjUuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQxIiBncmVlbj0iMTQyIiBibHVlPSIxNDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk2NTQwMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTg0MzEzNzEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45OTE0NzcyNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzYiIGdyZWVuPSIxNzYiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNDg3NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjY0LjAiIHkxPSIyMi4wIiB5Mj0iMjMuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjE4IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iLTIzNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzY2ZlNTIxNTEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjY0IiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSIzIiBsZWZ0PSIzIiByaWdodD0iMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2NC4wIiB5MT0iNS4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjY0LjAiIHkxPSI1LjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49IjE5MiIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MzQ0OTY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjQuMCIgeTE9IjMuMCIgeTI9IjUuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAzIiBncmVlbj0iMjAzIiBibHVlPSIyMDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjY2NjY2NjciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDA0OTAxOTYxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjY0LjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MSIgZ3JlZW49IjE0MiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjU0MDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4NDMxMzcxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTkxNDc3MjUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc2IiBncmVlbj0iMTc2IiBibHVlPSIxNzciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDQ4NzY2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI2NC4wIiB5MT0iMjIuMCIgeTI9IjIzLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIxOCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuNjExMTExMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC43NDUwOTgwNSIgYWxwaGFPZmZzZXQ9Ii0yMzciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIGNvbXBvbmVudE5hbWU9IkNvbWJvQm94LmFycm93QnV0dG9uIiB0eXBlPSJqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoQXJyb3dCdXR0b24iIG5hbWU9IkFycm93QnV0dG9uIiB1aT0iQXJyb3dCdXR0b25VSSIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxzdGF0ZVR5cGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkVuYWJsZWQiLz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJNb3VzZU92ZXIiLz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJQcmVzc2VkIi8+CisgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRGlzYWJsZWQiLz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJFZGl0YWJsZSI+CisgICAgICAgICAgICAgICAgICAgICA8Y29kZVNuaXBwZXQ+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudCBwYXJlbnQgPSBjLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50IGluc3RhbmNlb2YgSkNvbWJvQm94ICYmICgoSkNvbWJvQm94KXBhcmVudCkuaXNFZGl0YWJsZSgpO11dPjwvY29kZVNuaXBwZXQ+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlVHlwZT4KKyAgICAgICAgICAgICAgIDwvc3RhdGVUeXBlcz4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0ic2l6ZSIgdHlwZT0iSU5UIiB2YWx1ZT0iMTkiLz4KKyAgICAgICAgICAgICAgICAgIDwvdWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIzIiBib3R0b209IjQiIGxlZnQ9IjEiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjEiIGJvdHRvbT0iNCIgbGVmdD0iMSIgcmlnaHQ9IjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK01vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjMiIGJvdHRvbT0iNCIgbGVmdD0iMSIgcmlnaHQ9IjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK1ByZXNzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIzIiBib3R0b209IjQiIGxlZnQ9IjEiIHJpZ2h0PSI2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQrRWRpdGFibGUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI4IiBib3R0b209IjgiIGxlZnQ9IjEiIHJpZ2h0PSI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMCIgZ3JlZW49IjIyNCIgYmx1ZT0iMjMwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTIyMzYwNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM0Mzc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjIxNSIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIzOTEyNDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU3NzQxODMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI1NDkwMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42MTkzMTgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjIxMCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjcyMjExNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDYiIGdyZWVuPSIyMTIiIGJsdWU9IjIyMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTY3ODQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMxNzY0NzA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIzLjAiIGNwMXg9IjEyLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTYuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iOC4wIiBjcDF4PSIxNy4wIiBjcDF5PSI0LjAiIGNwMng9IjE3LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjE2LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjE2LjAiIGNwMng9IjE3LjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIyMS4wIiBjcDF4PSIxNi4wIiBjcDF5PSIyMS4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIyMS4wIiBjcDF4PSIxLjAiIGNwMXk9IjIxLjAiIGNwMng9IjEuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjg1Mjk0MTE3NjQ3MDU4ODMiIHk9IjIxLjExNzY0NzA1ODgyMzUzIiBjcDF4PSIwLjg1Mjk0MTE3NjQ3MDU4ODMiIGNwMXk9IjIxLjExNzY0NzA1ODgyMzUzIiBjcDJ4PSIwLjg1Mjk0MTE3NjQ3MDU4ODMiIGNwMnk9IjIxLjExNzY0NzA1ODgyMzUzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MSIgZ3JlZW49IjE5NyIgYmx1ZT0iMjA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjI4OTg3NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzgiIGdyZWVuPSIxODUiIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAxMDIzNzIxNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTU3OTk0MDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjA3ODQzMTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyLjAiIGNwMXg9IjAuMCIgY3AxeT0iMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjIuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMi4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI3LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTguMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMTcuMCIgY3AxeD0iMTguMCIgY3AxeT0iMTcuMCIgY3AyeD0iMTguMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjIyLjAiIGNwMXg9IjE2LjAiIGNwMXk9IjIyLjAiIGNwMng9IjEzLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIyLjAiIGNwMXg9IjAuMCIgY3AxeT0iMjIuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSI4IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iLTI0NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjE2LjAiIGNwMXg9IjAuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMTYuMCIgY3AxeD0iMTguMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTguMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjE4LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjE4LjAiIGNwMng9IjE4LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyMy4wIiBjcDF4PSIxNi4wIiBjcDF5PSIyMy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyMy4wIiBjcDF4PSIwLjAiIGNwMXk9IjIzLjAiIGNwMng9IjAuMCIgY3AyeT0iMjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzYzc3ZDFlYjgucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK0VkaXRhYmxlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iOCIgYm90dG9tPSI4IiBsZWZ0PSIxIiByaWdodD0iOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMjc1NDQ5MSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDYiIGdyZWVuPSIyNDgiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzEzNzI1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ0NjUyNDA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3NCIgZ3JlZW49IjE5MiIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAyMzAwNzM5MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDY4MjUwMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjcwNTg4MjIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NDE3MTEyNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIxODQiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQzODY2OTk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0NzA1ODgxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIyMTIiIGJsdWU9IjIzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MjU1NDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzU2ODYyNzIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjMuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI4LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTcuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMTYuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjIxLjAiIGNwMXg9IjE2LjAiIGNwMXk9IjIxLjAiIGNwMng9IjEyLjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjIxLjAiIGNwMXg9IjEuMCIgY3AxeT0iMjEuMCIgY3AyeD0iMS4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuODUyOTQxMTc2NDcwNTg4MyIgeT0iMjEuMTE3NjQ3MDU4ODIzNTMiIGNwMXg9IjAuODUyOTQxMTc2NDcwNTg4MyIgY3AxeT0iMjEuMTE3NjQ3MDU4ODIzNTMiIGNwMng9IjAuODUyOTQxMTc2NDcwNTg4MyIgY3AyeT0iMjEuMTE3NjQ3MDU4ODIzNTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTgiIGdyZWVuPSIxMTkiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM0NTg1OTIzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjM0IiBncmVlbj0iNTUiIGJsdWU9Ijc0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk1MTczNzc2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNTg4MjM1NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyLjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMi4wIiBjcDF4PSIxMy4wIiBjcDF5PSIyLjAiIGNwMng9IjE2LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjcuMCIgY3AxeD0iMTguMCIgY3AxeT0iNC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIxNy4wIiBjcDF4PSIxOC4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMjIuMCIgY3AxeD0iMTYuMCIgY3AxeT0iMjIuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjY0IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iLTE5MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjE2LjAiIGNwMXg9IjAuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMTYuMCIgY3AxeD0iMTguMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTguMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjE4LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjE4LjAiIGNwMng9IjE4LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyMy4wIiBjcDF4PSIxNi4wIiBjcDF5PSIyMy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyMy4wIiBjcDF4PSIwLjAiIGNwMXk9IjIzLjAiIGNwMng9IjAuMCIgY3AyeT0iMjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzYzc2MWRjY2YucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIrRWRpdGFibGUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI4IiBib3R0b209IjgiIGxlZnQ9IjEiIHJpZ2h0PSI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4yNzU0NDkxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTk4NDEzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzOTIxNTY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDQ2NTI0MDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkxIiBncmVlbj0iMjA5IiBibHVlPSIyMjYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDIzMDA3MzkzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40ODA4NDcwMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMzcyNTQ4OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0MTcxMTI0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjIwMyIgYmx1ZT0iMjIyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU1NTM0MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjE1Njg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTgzOTU3MjMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEwIiBncmVlbj0iMjMxIiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIzLjAiIGNwMXg9IjEyLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTYuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iOC4wIiBjcDF4PSIxNy4wIiBjcDF5PSI0LjAiIGNwMng9IjE3LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjE2LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjE2LjAiIGNwMng9IjE3LjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIyMS4wIiBjcDF4PSIxNi4wIiBjcDF5PSIyMS4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIyMS4wIiBjcDF4PSIxLjAiIGNwMXk9IjIxLjAiIGNwMng9IjEuMCIgY3AyeT0iMjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjg1Mjk0MTE3NjQ3MDU4ODMiIHk9IjIxLjExNzY0NzA1ODgyMzUzIiBjcDF4PSIwLjg1Mjk0MTE3NjQ3MDU4ODMiIGNwMXk9IjIxLjExNzY0NzA1ODgyMzUzIiBjcDJ4PSIwLjg1Mjk0MTE3NjQ3MDU4ODMiIGNwMnk9IjIxLjExNzY0NzA1ODgyMzUzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU5IiBncmVlbj0iODUiIGJsdWU9IjEwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTM0ODMxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE3Njk5ODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyMTU2ODY1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iNSIgYmx1ZT0iMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNTkyNzkzODIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDM1Mjk0MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyLjAiIGNwMXg9IjAuMCIgY3AxeT0iMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjIuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMi4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI3LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTguMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMTcuMCIgY3AxeD0iMTguMCIgY3AxeT0iMTcuMCIgY3AyeD0iMTguMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjIyLjAiIGNwMXg9IjE2LjAiIGNwMXk9IjIyLjAiIGNwMng9IjEzLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIyLjAiIGNwMXg9IjAuMCIgY3AxeT0iMjIuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSI2NCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuNjExMTExMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC43NDUwOTgwNSIgYWxwaGFPZmZzZXQ9Ii0xOTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxNi4wIiBjcDF4PSIwLjAiIGNwMXk9IjE2LjAiIGNwMng9IjAuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjE2LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjE2LjAiIGNwMng9IjE4LjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIxOC4wIiBjcDF4PSIxOC4wIiBjcDF5PSIxOC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMjMuMCIgY3AxeD0iMTYuMCIgY3AxeT0iMjMuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMjMuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMy4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2M3N2YxYTU4LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtFZGl0YWJsZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjgiIGJvdHRvbT0iOCIgbGVmdD0iMSIgcmlnaHQ9IjgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjI3NTQ0OTEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQzIiBncmVlbj0iMTY5IiBibHVlPSIxOTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTQuMjAzMzE5NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzgwNTA1OTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40NDY1MjQwNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI2MyIgZ3JlZW49IjEwNyIgYmx1ZT0iMTQ3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjcuMTM0MDhFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NDI4NTY5NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMjc0NTA5NzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NDE3MTEyNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MyIgZ3JlZW49IjEwMCIgYmx1ZT0iMTQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA4OTUzNzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4OSIgZ3JlZW49IjEzNSIgYmx1ZT0iMTc3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjguOTM3NzE2NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTM4NTM5MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ1MDk4MDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjMuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI4LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTcuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMTYuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjIxLjAiIGNwMXg9IjE2LjAiIGNwMXk9IjIxLjAiIGNwMng9IjEyLjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjIxLjAiIGNwMXg9IjEuMCIgY3AxeT0iMjEuMCIgY3AyeD0iMS4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuODUyOTQxMTc2NDcwNTg4MyIgeT0iMjEuMTE3NjQ3MDU4ODIzNTMiIGNwMXg9IjAuODUyOTQxMTc2NDcwNTg4MyIgY3AxeT0iMjEuMTE3NjQ3MDU4ODIzNTMiIGNwMng9IjAuODUyOTQxMTc2NDcwNTg4MyIgY3AyeT0iMjEuMTE3NjQ3MDU4ODIzNTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyOCIgZ3JlZW49IjU2IiBibHVlPSI4MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMy41Mjg1OTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDE4NjA2NzIyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzEzNzI1NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyLjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMi4wIiBjcDF4PSIxMy4wIiBjcDF5PSIyLjAiIGNwMng9IjE2LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjcuMCIgY3AxeD0iMTguMCIgY3AxeT0iNC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIxNy4wIiBjcDF4PSIxOC4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMjIuMCIgY3AxeD0iMTYuMCIgY3AxeT0iMjIuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjY0IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iLTE5MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjE2LjAiIGNwMXg9IjAuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMTYuMCIgY3AxeD0iMTguMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTguMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjE4LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjE4LjAiIGNwMng9IjE4LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyMy4wIiBjcDF4PSIxNi4wIiBjcDF5PSIyMy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyMy4wIiBjcDF4PSIwLjAiIGNwMXk9IjIzLjAiIGNwMng9IjAuMCIgY3AyeT0iMjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0ZDhkMTdkMTMucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCtFZGl0YWJsZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjgiIGJvdHRvbT0iOCIgbGVmdD0iMSIgcmlnaHQ9IjgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjI3NTQ0OTEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQzIiBncmVlbj0iMTY5IiBibHVlPSIxOTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTQuMjAzMzE5NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzgwNTA1OTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40NDY1MjQwNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI2MyIgZ3JlZW49IjEwNyIgYmx1ZT0iMTQ3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjcuMTM0MDhFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NDI4NTY5NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMjc0NTA5NzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NDE3MTEyNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MyIgZ3JlZW49IjEwMCIgYmx1ZT0iMTQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA4OTUzNzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4OSIgZ3JlZW49IjEzNSIgYmx1ZT0iMTc3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjguOTM3NzE2NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTM4NTM5MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ1MDk4MDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjMuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI4LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTcuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMTYuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjIxLjAiIGNwMXg9IjE2LjAiIGNwMXk9IjIxLjAiIGNwMng9IjEyLjAiIGNwMnk9IjIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjIxLjAiIGNwMXg9IjEuMCIgY3AxeT0iMjEuMCIgY3AyeD0iMS4wIiBjcDJ5PSIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuODUyOTQxMTc2NDcwNTg4MyIgeT0iMjEuMTE3NjQ3MDU4ODIzNTMiIGNwMXg9IjAuODUyOTQxMTc2NDcwNTg4MyIgY3AxeT0iMjEuMTE3NjQ3MDU4ODIzNTMiIGNwMng9IjAuODUyOTQxMTc2NDcwNTg4MyIgY3AyeT0iMjEuMTE3NjQ3MDU4ODIzNTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyOCIgZ3JlZW49IjU2IiBibHVlPSI4MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMy41Mjg1OTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDE4NjA2NzIyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzEzNzI1NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyLjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMi4wIiBjcDF4PSIxMy4wIiBjcDF5PSIyLjAiIGNwMng9IjE2LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjcuMCIgY3AxeD0iMTguMCIgY3AxeT0iNC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIxNy4wIiBjcDF4PSIxOC4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMjIuMCIgY3AxeD0iMTYuMCIgY3AxeT0iMjIuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjY0IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iLTE5MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjE2LjAiIGNwMXg9IjAuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMTYuMCIgY3AxeD0iMTguMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTguMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjE4LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjE4LjAiIGNwMng9IjE4LjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyMy4wIiBjcDF4PSIxNi4wIiBjcDF5PSIyMy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSIyMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyMy4wIiBjcDF4PSIwLjAiIGNwMXk9IjIzLjAiIGNwMng9IjAuMCIgY3AyeT0iMjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzYzc4MDhiMDgucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiIGludmVydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjI0IiBoZWlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNiIgYm90dG9tPSI2IiBsZWZ0PSI5IiByaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJBcnJvdyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQ1IiBncmVlbj0iNDUiIGJsdWU9IjQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNzI1NDkwNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNiIgZ3JlZW49IjYiIGJsdWU9IjYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUyNTQ5MDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIxLjAiIHkxPSIwLjUiIHgyPSIwLjAiIHkyPSIwLjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC45OTYzMjM1Mjk0MTE3NjQiIHk9IjguNTMxMjUwMDAwMDAwMDA0IiBjcDF4PSI4Ljk5NjMyMzUyOTQxMTc2NCIgY3AxeT0iOC41MzEyNTAwMDAwMDAwMDQiIGNwMng9IjguOTk2MzIzNTI5NDExNzY0IiBjcDJ5PSI4LjUzMTI1MDAwMDAwMDAwNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTRkODQyZWNmZC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjQiIGhlaWdodD0iMTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI2IiBib3R0b209IjYiIGxlZnQ9IjkiIHJpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkFycm93Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDUiIGdyZWVuPSI0NSIgYmx1ZT0iNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM3MjU0OTA2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI2IiBncmVlbj0iNiIgYmx1ZT0iNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTI1NDkwMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjEuMCIgeTE9IjAuNSIgeDI9IjAuMCIgeTI9IjAuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjAzMTI1IiB5PSI4LjQ2ODc1IiBjcDF4PSI5LjAzMTI1IiBjcDF5PSI4LjQ2ODc1IiBjcDJ4PSI5LjAzMTI1IiBjcDJ5PSI4LjQ2ODc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNGQ4NDJlY2ZkLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiIGludmVydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjI0IiBoZWlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNiIgYm90dG9tPSI2IiBsZWZ0PSI5IiByaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJBcnJvdyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY3IiBncmVlbj0iMTcxIiBibHVlPSIxNzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjc0MDg4OTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU3MzkxNjU1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0OTAxOTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjEuMCIgeTE9IjAuNSIgeDI9IjAuMCIgeTI9IjAuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjA1ODgyMzUyOTQxMTc2NCIgeT0iOC41MzEyNTAwMDAwMDAwMDQiIGNwMXg9IjkuMDU4ODIzNTI5NDExNzY0IiBjcDF5PSI4LjUzMTI1MDAwMDAwMDAwNCIgY3AyeD0iOS4wNTg4MjM1Mjk0MTE3NjQiIGNwMnk9IjguNTMxMjUwMDAwMDAwMDA0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNGQ4NWZlYzEwLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjQiIGhlaWdodD0iMTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI2IiBib3R0b209IjYiIGxlZnQ9IjkiIHJpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkFycm93Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjEuMCIgeTE9IjAuNSIgeDI9IjAuMCIgeTI9IjAuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjEyMTMyMzUyOTQxMTc2NCIgeT0iOC40Njg3NTAwMDAwMDAwMDQiIGNwMXg9IjkuMTIxMzIzNTI5NDExNzY0IiBjcDF5PSI4LjQ2ODc1MDAwMDAwMDAwNCIgY3AyeD0iOS4xMjEzMjM1Mjk0MTE3NjQiIGNwMnk9IjguNDY4NzUwMDAwMDAwMDA0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNGQ4NjFjMWIyLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQiIGludmVydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjI0IiBoZWlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNiIgYm90dG9tPSI2IiBsZWZ0PSI5IiByaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJBcnJvdyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIxLjAiIHkxPSIwLjUiIHgyPSIwLjAiIHkyPSIwLjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wNTg4MjM1Mjk0MTE3NjQiIHk9IjguNTMxMjUwMDAwMDAwMDA0IiBjcDF4PSI5LjA1ODgyMzUyOTQxMTc2NCIgY3AxeT0iOC41MzEyNTAwMDAwMDAwMDQiIGNwMng9IjkuMDU4ODIzNTI5NDExNzY0IiBjcDJ5PSI4LjUzMTI1MDAwMDAwMDAwNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTRkODYxYzFiMi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvZm9yZWdyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9InRydWUiIGNvbXBvbmVudE5hbWU9IkNvbWJvQm94Lmxpc3RSZW5kZXJlciIgdHlwZT0iamF2YXguc3dpbmcuSkxhYmVsIiBuYW1lPSJMYWJlbCIgdWk9IkxhYmVsVUkiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIyIiBib3R0b209IjIiIGxlZnQ9IjQiIHJpZ2h0PSI0Ii8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtYmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC1iYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iMTA1IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbkJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtYmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC1iYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIGNvbXBvbmVudE5hbWU9IkNvbWJvQm94LnJlbmRlcmVyIiB0eXBlPSJqYXZheC5zd2luZy5KTGFiZWwiIG5hbWU9IkxhYmVsIiB1aT0iTGFiZWxVSSIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjIiIGJvdHRvbT0iMiIgbGVmdD0iNCIgcmlnaHQ9IjQiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iMTA1IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbkJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtYmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC1iYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgPC9yZWdpb25zPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiBjb21wb25lbnROYW1lPSJDb21ib0JveC5zY3JvbGxQYW5lIiB0eXBlPSJqYXZheC5zd2luZy5KU2Nyb2xsUGFuZSIgbmFtZT0iU2Nyb2xsUGFuZSIgdWk9IlNjcm9sbFBhbmVVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9InRydWUiIHR5cGU9ImphdmF4LnN3aW5nLkpGaWxlQ2hvb3NlciIgbmFtZT0iRmlsZUNob29zZXIiIHVpPSJGaWxlQ2hvb3NlclVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjEwIiBib3R0b209IjEwIiBsZWZ0PSIxMCIgcmlnaHQ9IjEwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0idXNlc1NpbmdsZUZpbGVQYW5lIiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEwMC4wIiB5MT0iMC4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0iY29udHJvbCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zPgorICAgICAgICAgICAgPHVpSWNvblJlZ2lvbiBuYW1lPSJmaWxlSWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9ImZpbGVJY29uIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIxMjgiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iLTEyNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC4wIiB5PSIyLjAiIGNwMXg9IjEwLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuMCIgeT0iMS4wIiBjcDF4PSIxMC4wIiBjcDF5PSIxLjAiIGNwMng9IjEwLjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMS4wIiBjcDF4PSIyLjAiIGNwMXk9IjEuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE1LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI1LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjUuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMTQuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTQuMCIgY3AxeD0iMy4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIzLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjIuMCIgY3AxeD0iMy4wIiBjcDF5PSIyLjAiIGNwMng9IjMuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM4IiBncmVlbj0iMTU3IiBibHVlPSIxNzYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQxOTgwNTIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQxMTc2NDYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjAiIHk9IjEuMCIgY3AxeD0iMTAuMCIgY3AxeT0iMS4wIiBjcDJ4PSIxMC4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4Ljc0MDc0MDc0MDc0MDc0IiB5PSIxLjAiIGNwMXg9IjguNzQwNzQwNzQwNzQwNzQiIGNwMXk9IjEuMCIgY3AyeD0iOC43NDA3NDA3NDA3NDA3NCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC43Nzc3Nzc3Nzc3Nzc3NzciIHk9IjYuMjIyMjIyMjIyMjIyMjE5IiBjcDF4PSI4Ljc3Nzc3Nzc3Nzc3Nzc3NyIgY3AxeT0iNi4yMjIyMjIyMjIyMjIyMTkiIGNwMng9IjguNzc3Nzc3Nzc3Nzc3Nzc3IiBjcDJ5PSI2LjIyMjIyMjIyMjIyMjIxOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjYuMjAzNzAzNzAzNzAzNyIgY3AxeD0iMTQuMCIgY3AxeT0iNi4yMDM3MDM3MDM3MDM3IiBjcDJ4PSIxNC4wIiBjcDJ5PSI2LjIwMzcwMzcwMzcwMzciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI1LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTQuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuMCIgeT0iNS4wIiBjcDF4PSIxMC4wIiBjcDF5PSI1LjAiIGNwMng9IjEwLjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMTUiIGJsdWU9IjIyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNzc2ODA5NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUxNzgxMDM0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0OTAxOTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzOCIgZ3JlZW49IjI0MiIgYmx1ZT0iMjQ3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDEzOTQwODcxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTkyNzciIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDE5NjA3ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuMCIgeT0iMS4wIiBjcDF4PSIxMC4wIiBjcDF5PSIxLjAiIGNwMng9IjEwLjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMS4wIiBjcDF4PSIyLjAiIGNwMXk9IjEuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE1LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC4wIiB5PSI1LjAiIGNwMXg9IjEwLjAiIGNwMXk9IjUuMCIgY3AyeD0iMTAuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzNiIgZ3JlZW49IjI0NSIgYmx1ZT0iMjUzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMzI2Nzk3MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA0MzMzMjYzNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4wNDYyOTYyOTYyOTYyOTYzNiIgeTE9IjAuOTY3NTkyNTkyNTkyNTkyOSIgeDI9IjAuNDg2MTExMTExMTExMTEwOTQiIHkyPSIwLjUzMjQwNzQwNzQwNzQwNzQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuMCIgeT0iMS4wIiBjcDF4PSIxMC4wIiBjcDF5PSIxLjAiIGNwMng9IjEwLjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjAiIHk9IjUuMCIgY3AxeD0iMTAuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxMC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI1LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTQuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjE0LjAiIHkxPSIxNS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NyIgZ3JlZW49Ijk4IiBibHVlPSIxMDIiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDkiIGdyZWVuPSIxNTEiIGJsdWU9IjE1NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NTY1NDUxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMC4wIiBjcDF4PSIxLjAiIGNwMXk9IjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE2LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNi4wIiBjcDF4PSIyLjAiIGNwMXk9IjE2LjAiIGNwMng9IjIuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMS4wIiBjcDF4PSIyLjAiIGNwMXk9IjEuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC41MTg1MTg1MTg1MTg1MjMiIHk9IjAuOTk5OTk5OTk5OTk5OTk5OSIgY3AxeD0iMTAuNTE4NTE4NTE4NTE4NTIzIiBjcDF5PSIwLjk5OTk5OTk5OTk5OTk5OTkiIGNwMng9IjEwLjUxODUxODUxODUxODUyMyIgY3AyeT0iMC45OTk5OTk5OTk5OTk5OTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMDAwMDAwMDAwMDAwMDAyIiB5PSI0LjUiIGNwMXg9IjE0LjAwMDAwMDAwMDAwMDAwMiIgY3AxeT0iNC41IiBjcDJ4PSIxNC4wMDAwMDAwMDAwMDAwMDIiIGNwMnk9IjQuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjE2LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjE2LjAiIGNwMng9IjE0LjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxNi4wIiBjcDF4PSIxNS4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNC40NDQ0NDQ0NDQ0NDQ0NDEiIGNwMXg9IjE1LjAiIGNwMXk9IjQuNDQ0NDQ0NDQ0NDQ0NDQxIiBjcDJ4PSIxNS4wIiBjcDJ5PSI0LjQ0NDQ0NDQ0NDQ0NDQ0MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjcyMjIyMjIyMjIyMjIyNSIgeT0iMC4wIiBjcDF4PSIxMC43MjIyMjIyMjIyMjIyMjUiIGNwMXk9IjAuMCIgY3AyeD0iMTAuNzIyMjIyMjIyMjIyMjI1IiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iZGlyZWN0b3J5SWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9ImRpcmVjdG9yeUljb24iPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMTIuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDAiIGdyZWVuPSIxMjIiIGJsdWU9IjE0MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMjc0MzY2MTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjMzNTAxNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yNTQ0OTEwMyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTEiIGdyZWVuPSIxMzAiIGJsdWU9IjE0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMjQyOTQyNTciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4NTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDMxMzcyNTQ3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3NiIgZ3JlZW49IjkxIiBibHVlPSIxMDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDE4MDgxMDY5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNTk1MjM4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMzcyNTQ5MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI1LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjUuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iNC4wIiBjcDF4PSIxMy4wIiBjcDF5PSI0LjAiIGNwMng9IjEzLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNzQwNzQwNzQwNzQwNzQwNSIgeT0iMy45OTk5OTk5OTk5OTk5OTk2IiBjcDF4PSIzLjc0MDc0MDc0MDc0MDc0MDUiIGNwMXk9IjMuOTk5OTk5OTk5OTk5OTk5NiIgY3AyeD0iMy43NDA3NDA3NDA3NDA3NDA1IiBjcDJ5PSIzLjk5OTk5OTk5OTk5OTk5OTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAxODUxODUxODUxODUxMzciIHk9IjEwLjA1NTU1NTU1NTU1NTU1IiBjcDF4PSIyLjAxODUxODUxODUxODUxMzciIGNwMXk9IjEwLjA1NTU1NTU1NTU1NTU1IiBjcDJ4PSIyLjAxODUxODUxODUxODUxMzciIGNwMnk9IjEwLjA1NTU1NTU1NTU1NTU1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNC4wIiBjcDF4PSIyLjAiIGNwMXk9IjE0LjAiIGNwMng9IjIuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTQuMCIgY3AxeD0iMy4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIzLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjk2Mjk2Mjk2Mjk2Mjk2MzIiIHk9IjEyLjEyOTYyOTYyOTYyOTYzMiIgY3AxeD0iMi45NjI5NjI5NjI5NjI5NjMyIiBjcDF5PSIxMi4xMjk2Mjk2Mjk2Mjk2MzIiIGNwMng9IjIuOTYyOTYyOTYyOTYyOTYzMiIgY3AyeT0iMTIuMTI5NjI5NjI5NjI5NjMyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC41Nzk5OTk5OTk5OTk5OTEiIHk9IjQuOTgiIGNwMXg9IjQuNTc5OTk5OTk5OTk5OTkxIiBjcDF5PSI0Ljk4IiBjcDJ4PSI0LjU3OTk5OTk5OTk5OTk5MSIgY3AyeT0iNC45OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MiIgZ3JlZW49Ijk3IiBibHVlPSIxMjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDEyMDk0Mzc4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yMzU3MTQyOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDc4NDMxNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzUiIGdyZWVuPSI1NSIgYmx1ZT0iNzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMi45NTY5ODY0RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTUxNjYzNjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI2Mjc0NTEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuMCIgeT0iNC4wIiBjcDF4PSIxNi4wIiBjcDF5PSI0LjAiIGNwMng9IjE2LjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjAiIHk9IjUuMCIgY3AxeD0iMTYuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI1LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjUuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMy4wIiBjcDF4PSIxMy4wIiBjcDF5PSIzLjAiIGNwMng9IjEzLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI4LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjcuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIxLjAiIGNwMXg9IjcuMCIgY3AxeT0iMS4wIiBjcDJ4PSI3LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuOTQ0NDQ0NDQ0NDQ0NDQzOCIgeT0iMS4wMTg1MTg1MTg1MTg1MTg2IiBjcDF4PSIyLjk0NDQ0NDQ0NDQ0NDQ0MzgiIGNwMXk9IjEuMDE4NTE4NTE4NTE4NTE4NiIgY3AyeD0iMi45NDQ0NDQ0NDQ0NDQ0NDM4IiBjcDJ5PSIxLjAxODUxODUxODUxODUxODYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjk4MTQ4MTQ4MTQ4MTQ4MTQiIHk9IjEuNzQwNzQwNzQwNzQwNzQwMyIgY3AxeD0iMi45ODE0ODE0ODE0ODE0ODE0IiBjcDF5PSIxLjc0MDc0MDc0MDc0MDc0MDMiIGNwMng9IjIuOTgxNDgxNDgxNDgxNDgxNCIgY3AyeT0iMS43NDA3NDA3NDA3NDA3NDAzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS43NDA3NDA3NDA3NDA3NDA3IiB5PSIzLjAiIGNwMXg9IjEuNzQwNzQwNzQwNzQwNzQwNyIgY3AxeT0iMy4wIiBjcDJ4PSIxLjc0MDc0MDc0MDc0MDc0MDciIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE0LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTQuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjcuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC44NzAzNzAzNzAzNzAzNyIgeT0iNS45NjI5NjI5NjI5NjI5NjUiIGNwMXg9IjE0Ljg3MDM3MDM3MDM3MDM3IiBjcDF5PSI1Ljk2Mjk2Mjk2Mjk2Mjk2NSIgY3AyeD0iMTQuODcwMzcwMzcwMzcwMzciIGNwMnk9IjUuOTYyOTYyOTYyOTYyOTY1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNS4wIiBjcDF4PSIxNS4wIiBjcDF5PSI1LjAiIGNwMng9IjE1LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjAiIHk9IjUuMCIgY3AxeD0iMTYuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS40NjI5NjI5NjI5NjI5NjciIHk9IjYuMTI5NjI5NjI5NjI5NjI5IiBjcDF4PSIxNS40NjI5NjI5NjI5NjI5NjciIGNwMXk9IjYuMTI5NjI5NjI5NjI5NjI5IiBjcDJ4PSIxNS40NjI5NjI5NjI5NjI5NjciIGNwMnk9IjYuMTI5NjI5NjI5NjI5NjI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNy4wIiBjcDF4PSIxNS4wIiBjcDF5PSI3LjAiIGNwMng9IjE1LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjE0LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjE0LjAiIGNwMng9IjE1LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNS4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxNS4wIiBjcDF4PSIxLjAiIGNwMXk9IjE1LjAiIGNwMng9IjEuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTQuMCIgY3AxeD0iMC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjMuMjU5MjU5MjU5MjU5MjYiIGNwMXg9IjAuMCIgY3AxeT0iMy4yNTkyNTkyNTkyNTkyNiIgY3AyeD0iMC4wIiBjcDJ5PSIzLjI1OTI1OTI1OTI1OTI2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4xODUxODUxODUxODUxODU2IiB5PSIwLjAiIGNwMXg9IjMuMTg1MTg1MTg1MTg1MTg1NiIgY3AxeT0iMC4wIiBjcDJ4PSIzLjE4NTE4NTE4NTE4NTE4NTYiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMC4wIiBjcDF4PSI3LjAiIGNwMXk9IjAuMCIgY3AyeD0iNy4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjU1NTU1NTU1NTU1NTU1IiB5PSIyLjAwMDAwMDAwMDAwMDAwMDQiIGNwMXg9IjguNTU1NTU1NTU1NTU1NTUiIGNwMXk9IjIuMDAwMDAwMDAwMDAwMDAwNCIgY3AyeD0iOC41NTU1NTU1NTU1NTU1NSIgY3AyeT0iMi4wMDAwMDAwMDAwMDAwMDA0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMi4wIiBjcDF4PSIxMy4wIiBjcDF5PSIyLjAiIGNwMng9IjEzLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjMuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI0LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iOC4wIiB4Mj0iMTMuMCIgeTE9IjMuMCIgeTI9IjQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjE1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSItMTAwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjcuMCIgeTE9IjEuMCIgeTI9IjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjIwNSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSItNTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMi4wIiB5MT0iMy4wIiB5Mj0iNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTMwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9Ii0xMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAyIiBncmVlbj0iMjE1IiBibHVlPSIyMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDc3NjgwOTQ1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MTc4MTAzNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNDkwMTk2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDgiIGdyZWVuPSIyNTAiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5ODQxMyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzkyMTU2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE0LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNC4wIiBjcDF4PSIyLjAiIGNwMXk9IjE0LjAiIGNwMng9IjIuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMDQxNjY2NjY2NjY2NjY3IiB5PSIxMC4xODc0OTk5OTk5OTk5OTgiIGNwMXg9IjIuMDQxNjY2NjY2NjY2NjY3IiBjcDF5PSIxMC4xODc0OTk5OTk5OTk5OTgiIGNwMng9IjIuMDQxNjY2NjY2NjY2NjY3IiBjcDJ5PSIxMC4xODc0OTk5OTk5OTk5OTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjk3OTE2NjY2NjY2NjY2OCIgeT0iNC4wIiBjcDF4PSIzLjk3OTE2NjY2NjY2NjY2OCIgY3AxeT0iNC4wIiBjcDJ4PSIzLjk3OTE2NjY2NjY2NjY2OCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iNC4wIiBjcDF4PSIxMy4wIiBjcDF5PSI0LjAiIGNwMng9IjEzLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjMuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjMuMCIgY3AxeD0iOC4wIiBjcDF5PSIzLjAiIGNwMng9IjguMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIyLjAiIGNwMXg9IjcuMCIgY3AxeT0iMi4wIiBjcDJ4PSI3LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMS4wIiBjcDF4PSI3LjAiIGNwMXk9IjEuMCIgY3AyeD0iNy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjEuMCIgY3AxeD0iMy4wIiBjcDF5PSIxLjAiIGNwMng9IjMuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIyLjAiIGNwMXg9IjMuMCIgY3AxeT0iMi4wIiBjcDJ4PSIzLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMy4wIiBjcDF4PSIyLjAiIGNwMXk9IjMuMCIgY3AyeD0iMi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjMuMCIgY3AxeD0iMS4wIiBjcDF5PSIzLjAiIGNwMng9IjEuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNDE5MTYxNyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzgiIGdyZWVuPSIxOTgiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1OTc4ODM4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5ODAzOTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xNjQ2NzA2NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzQiIGdyZWVuPSIxNjIiIGJsdWU9IjE4OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTU5NTI1ODciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM0ODQ4MDI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE4ODIzNTI4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzI2MzQ3MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTEiIGdyZWVuPSIxMzkiIGJsdWU9IjE2NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTU5NTI1ODciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjMwODQ0MTU4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA5ODAzOTIxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NSIgZ3JlZW49IjEyMyIgYmx1ZT0iMTQ5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjczMjk4MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDM1Mjk0MTE2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTQuMCIgY3AxeD0iMy4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIzLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAxODUxODUxODUxODUxODYiIHk9IjEwLjA1NTU1NTU1NTU1NTU1OSIgY3AxeD0iMy4wMTg1MTg1MTg1MTg1MTg2IiBjcDF5PSIxMC4wNTU1NTU1NTU1NTU1NTkiIGNwMng9IjMuMDE4NTE4NTE4NTE4NTE4NiIgY3AyeT0iMTAuMDU1NTU1NTU1NTU1NTU5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI1LjAiIGNwMXg9IjQuMCIgY3AxeT0iNS4wIiBjcDJ4PSI0LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjUuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI3LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTQuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMSIgZ3JlZW49IjEyNiIgYmx1ZT0iMTM2IiBhbHBoYT0iMTU2IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjEiIGFscGhhT2Zmc2V0PSItOTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMy4wIiBjcDF4PSIwLjAiIGNwMXk9IjEzLjAiIGNwMng9IjAuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTQuMCIgY3AxeD0iMC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE2LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTYuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjE0LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjE0LjAiIGNwMng9IjE1LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxMy4wIiBjcDF4PSIxNS4wIiBjcDF5PSIxMy4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9InVwRm9sZGVySWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9InVwRm9sZGVySWNvbiI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4xMjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iSWNvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1NCIgZ3JlZW49IjIxMSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwNjA0NDM4OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjM5NjM1ODUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg1IiBncmVlbj0iMTc1IiBibHVlPSIyNDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDA2MzI0NTg5MyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTU5MjUwNSIgYnJpZ2h0bmVzc09mZnNldD0iMC40MDc4NDMxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjAiIHk9IjkuMCIgY3AxeD0iMTAuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMC4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC4wIiB5PSI1LjAiIGNwMXg9IjEwLjAiIGNwMXk9IjUuMCIgY3AyeD0iMTAuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4zNDc4MjYwODY5NTY1MjE1IiB5PSI1LjAiIGNwMXg9IjcuMzQ3ODI2MDg2OTU2NTIxNSIgY3AxeT0iNS4wIiBjcDJ4PSI3LjM0NzgyNjA4Njk1NjUyMTUiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjk3ODI2MDg2OTU2NTIxNyIgeT0iMS4yODI2MDg2OTU2NTIxNzMyIiBjcDF4PSIxMC45NzgyNjA4Njk1NjUyMTciIGNwMXk9IjEuMjgyNjA4Njk1NjUyMTczMiIgY3AyeD0iMTAuOTc4MjYwODY5NTY1MjE3IiBjcDJ5PSIxLjI4MjYwODY5NTY1MjE3MzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4zMDQzNDc4MjYwODY5NDgiIHk9IjQuOTk5OTk5OTk5OTk5OTk5IiBjcDF4PSIxNC4zMDQzNDc4MjYwODY5NDgiIGNwMXk9IjQuOTk5OTk5OTk5OTk5OTk5IiBjcDJ4PSIxNC4zMDQzNDc4MjYwODY5NDgiIGNwMnk9IjQuOTk5OTk5OTk5OTk5OTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iNS4wIiBjcDF4PSIxMi4wIiBjcDF5PSI1LjAiIGNwMng9IjEyLjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjkuMCIgY3AxeD0iMTIuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjYzMDQzNDc4MjYwODcwMiIgeT0iNC45NzgyNjA4Njk1NjUyMTgiIGNwMXg9IjYuNjMwNDM0NzgyNjA4NzAyIiBjcDF5PSI0Ljk3ODI2MDg2OTU2NTIxOCIgY3AyeD0iNi42MzA0MzQ3ODI2MDg3MDIiIGNwMnk9IjQuOTc4MjYwODY5NTY1MjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuMCIgeT0iNS4wIiBjcDF4PSIxMC4wIiBjcDF5PSI1LjAiIGNwMng9IjEwLjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjAiIHk9IjkuMCIgY3AxeD0iMTAuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMC4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSI5LjAiIGNwMXg9IjEyLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTIuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iNS4wIiBjcDF4PSIxMi4wIiBjcDF5PSI1LjAiIGNwMng9IjEyLjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjMyNjA4Njk1NjUyMTc0MiIgeT0iNS4wIiBjcDF4PSIxNS4zMjYwODY5NTY1MjE3NDIiIGNwMXk9IjUuMCIgY3AyeD0iMTUuMzI2MDg2OTU2NTIxNzQyIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSIwLjY1MjE3MzkxMzA0MzQ3ODUiIGNwMXg9IjExLjAiIGNwMXk9IjAuNjUyMTczOTEzMDQzNDc4NSIgY3AyeD0iMTEuMCIgY3AyeT0iMC42NTIxNzM5MTMwNDM0Nzg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIxMDAiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDYxNDY5Njc0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ1MDk4MDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSI1OCIgYmx1ZT0iMTE3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA1MzkzOTIyMyIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wOTAxOTYxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iNi4wIiBjcDF4PSI2LjAiIGNwMXk9IjYuMCIgY3AyeD0iNi4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjQuNTY1MjE3MzkxMzA0MzQyIiBjcDF4PSI2LjAiIGNwMXk9IjQuNTY1MjE3MzkxMzA0MzQyIiBjcDJ4PSI2LjAiIGNwMnk9IjQuNTY1MjE3MzkxMzA0MzQyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuNjczOTEzMDQzNDc4MjY1IiB5PSIwLjAiIGNwMXg9IjEwLjY3MzkxMzA0MzQ3ODI2NSIgY3AxeT0iMC4wIiBjcDJ4PSIxMC42NzM5MTMwNDM0NzgyNjUiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjMwNDM0NzgyNjA4Njk1NSIgeT0iLTguMzI2NjcyNjg0Njg4Njc0RS0xNyIgY3AxeD0iMTEuMzA0MzQ3ODI2MDg2OTU1IiBjcDF5PSItOC4zMjY2NzI2ODQ2ODg2NzRFLTE3IiBjcDJ4PSIxMS4zMDQzNDc4MjYwODY5NTUiIGNwMnk9Ii04LjMyNjY3MjY4NDY4ODY3NEUtMTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS45NzgyNjA4Njk1NjUyMTciIHk9IjQuNTY1MjE3MzkxMzA0MzQzIiBjcDF4PSIxNS45NzgyNjA4Njk1NjUyMTciIGNwMXk9IjQuNTY1MjE3MzkxMzA0MzQzIiBjcDJ4PSIxNS45NzgyNjA4Njk1NjUyMTciIGNwMnk9IjQuNTY1MjE3MzkxMzA0MzQzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuMCIgeT0iNi4wIiBjcDF4PSIxNi4wIiBjcDF5PSI2LjAiIGNwMng9IjE2LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjYuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI5LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTMuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMTAuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjAiIHk9IjEwLjAiIGNwMXg9IjEwLjAiIGNwMXk9IjEwLjAiIGNwMng9IjEwLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjAiIHk9IjkuMCIgY3AxeD0iOS4wIiBjcDF5PSI5LjAiIGNwMng9IjkuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSI2LjAiIGNwMXg9IjkuMCIgY3AxeT0iNi4wIiBjcDJ4PSI5LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMCIgZ3JlZW49IjEyNSIgYmx1ZT0iMTM1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjUuODQ3OTYxRS00IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTU2ODYyNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wMjE3MzkxMzA0MzQ3ODMiIHk9IjYuNTIxNzM5MTMwNDM0NzgyIiBjcDF4PSI2LjAyMTczOTEzMDQzNDc4MyIgY3AxeT0iNi41MjE3MzkxMzA0MzQ3ODIiIGNwMng9IjYuMDIxNzM5MTMwNDM0NzgzIiBjcDJ5PSI2LjUyMTczOTEzMDQzNDc4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iNS4zNjk1NjUyMTczOTEzMDQiIGNwMXg9IjYuMCIgY3AxeT0iNS4zNjk1NjUyMTczOTEzMDQiIGNwMng9IjYuMCIgY3AyeT0iNS4zNjk1NjUyMTczOTEzMDQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNi4wIiB5PSI1LjU4Njk1NjUyMTczOTEzIiBjcDF4PSIxNi4wIiBjcDF5PSI1LjU4Njk1NjUyMTczOTEzIiBjcDJ4PSIxNi4wIiBjcDJ5PSI1LjU4Njk1NjUyMTczOTEzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuODkxMzA0MzQ3ODI2MDg2IiB5PSI2LjQ5OTk5OTk5OTk5OTk5OSIgY3AxeD0iMTQuODkxMzA0MzQ3ODI2MDg2IiBjcDF5PSI2LjQ5OTk5OTk5OTk5OTk5OSIgY3AyeD0iMTQuODkxMzA0MzQ3ODI2MDg2IiBjcDJ5PSI2LjQ5OTk5OTk5OTk5OTk5OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjk1NjUyMTczOTEzMDQzNCIgeT0iNi45MTMwNDM0NzgyNjA4NyIgY3AxeD0iMTIuOTU2NTIxNzM5MTMwNDM0IiBjcDF5PSI2LjkxMzA0MzQ3ODI2MDg3IiBjcDJ4PSIxMi45NTY1MjE3MzkxMzA0MzQiIGNwMnk9IjYuOTEzMDQzNDc4MjYwODciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi45MTMwNDM0NzgyNjA4NyIgeT0iOS4zNDc4MjYwODY5NTY1MiIgY3AxeD0iMTIuOTEzMDQzNDc4MjYwODciIGNwMXk9IjkuMzQ3ODI2MDg2OTU2NTIiIGNwMng9IjEyLjkxMzA0MzQ3ODI2MDg3IiBjcDJ5PSI5LjM0NzgyNjA4Njk1NjUyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuODY5NTY1MjE3MzkxMzAzIiB5PSIxMC42MDg2OTU2NTIxNzM5MTQiIGNwMXg9IjExLjg2OTU2NTIxNzM5MTMwMyIgY3AxeT0iMTAuNjA4Njk1NjUyMTczOTE0IiBjcDJ4PSIxMS44Njk1NjUyMTczOTEzMDMiIGNwMnk9IjEwLjYwODY5NTY1MjE3MzkxNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjIxNzM5MTMwNDM0NzgyNiIgeT0iMTAuNTQzNDc4MjYwODY5NTY2IiBjcDF4PSIxMC4yMTczOTEzMDQzNDc4MjYiIGNwMXk9IjEwLjU0MzQ3ODI2MDg2OTU2NiIgY3AyeD0iMTAuMjE3MzkxMzA0MzQ3ODI2IiBjcDJ5PSIxMC41NDM0NzgyNjA4Njk1NjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjI2MDg2OTU2NTIxNzM5IiB5PSI5LjM0NzgyNjA4Njk1NjUyIiBjcDF4PSI5LjI2MDg2OTU2NTIxNzM5IiBjcDF5PSI5LjM0NzgyNjA4Njk1NjUyIiBjcDJ4PSI5LjI2MDg2OTU2NTIxNzM5IiBjcDJ5PSI5LjM0NzgyNjA4Njk1NjUyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4yNjA4Njk1NjUyMTczOSIgeT0iNi44Njk1NjUyMTczOTEzMDQiIGNwMXg9IjkuMjYwODY5NTY1MjE3MzkiIGNwMXk9IjYuODY5NTY1MjE3MzkxMzA0IiBjcDJ4PSI5LjI2MDg2OTU2NTIxNzM5IiBjcDJ5PSI2Ljg2OTU2NTIxNzM5MTMwNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzgiIGdyZWVuPSIxOTgiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1OTc4ODM4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5ODAzOTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMzA2ODE4MSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzQiIGdyZWVuPSIxNjIiIGJsdWU9IjE4OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTU5NTI1ODciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM0ODQ4MDI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE4ODIzNTI4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDg4NjM2MzciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTgiIGdyZWVuPSIxMjYiIGJsdWU9IjE1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTU5NTI1ODciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjI4MDQ1MTE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA0NzA1ODgyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NSIgZ3JlZW49IjEyMyIgYmx1ZT0iMTQ5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjczMjk4MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDM1Mjk0MTE2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTUuMCIgY3AxeD0iMy4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIzLjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjExLjAiIGNwMXg9IjMuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI2LjAiIGNwMXg9IjQuMCIgY3AxeT0iNi4wIiBjcDJ4PSI0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjYuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMS4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NyIgZ3JlZW49IjExMiIgYmx1ZT0iMTM1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxMjA5NDM3OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjgwMTU4NzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzAiIGdyZWVuPSI1MCIgYmx1ZT0iNjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDI1NDQ4OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwNDk2OTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI3ODQzMTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxMS4wIiBjcDF4PSIyLjAiIGNwMXk9IjExLjAiIGNwMng9IjIuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iNi4wIiBjcDF4PSIzLjAiIGNwMXk9IjYuMCIgY3AyeD0iMy4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjUuMCIgY3AxeD0iNC4wIiBjcDF5PSI1LjAiIGNwMng9IjQuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNS4wIiBjcDF4PSIxNS4wIiBjcDF5PSI1LjAiIGNwMng9IjE1LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjE1LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjE1LjAiIGNwMng9IjE1LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIxNi4wIiBjcDF4PSIxMy4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNi4wIiBjcDF4PSIyLjAiIGNwMXk9IjE2LjAiIGNwMng9IjIuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDQiIGdyZWVuPSIyNDciIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjExNzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzEzNzI1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA5NjU5MDkxIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMiIgZ3JlZW49IjIxNSIgYmx1ZT0iMjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA3NzY4MDk0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTE3ODEwMzQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzQ5MDE5NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ4IiBncmVlbj0iMjUwIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTg0MTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxNS4wIiBjcDF4PSIxLjAiIGNwMXk9IjE1LjAiIGNwMng9IjEuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iNC4wIiBjcDF4PSIxLjAiIGNwMXk9IjQuMCIgY3AyeD0iMS4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjQuMCIgY3AxeD0iMi4wIiBjcDF5PSI0LjAiIGNwMng9IjIuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIzLjAiIGNwMXg9IjMuMCIgY3AxeT0iMy4wIiBjcDJ4PSIzLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMi4wIiBjcDF4PSIzLjAiIGNwMXk9IjIuMCIgY3AyeD0iMy4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjcuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIzLjAiIGNwMXg9IjcuMCIgY3AxeT0iMy4wIiBjcDJ4PSI3LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI4LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjE1LjAiIGNwMXg9IjguMCIgY3AxeT0iMTUuMCIgY3AyeD0iOC4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMiIgZ3JlZW49IjEzNiIgYmx1ZT0iMTUwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NDkwNDc2MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMjc4NDA5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwOSIgZ3JlZW49IjEyMyIgYmx1ZT0iMTM2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDM3MTg0ODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxNTY4NjI3NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkxNDc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU5IiBncmVlbj0iNjkiIGJsdWU9Ijc4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjIuOTU2OTg2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzkyMTI0NTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI0MzEzNzI3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTUuMCIgY3AxeD0iMC4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIwLjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE2LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTYuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjE1LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjE1LjAiIGNwMng9IjE1LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxMC4wIiBjcDF4PSIxNS4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuMCIgeT0iNy4wIiBjcDF4PSIxNi4wIiBjcDF5PSI3LjAiIGNwMng9IjE2LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjAiIHk9IjUuMCIgY3AxeD0iMTYuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjUuMCIgY3AxeD0iOC4wIiBjcDF5PSI1LjAiIGNwMng9IjguMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIyLjAiIGNwMXg9IjguMCIgY3AxeT0iMi4wIiBjcDJ4PSI4LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMS4wIiBjcDF4PSI3LjAiIGNwMXk9IjEuMCIgY3AyeD0iNy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjEuMCIgY3AxeD0iMy4wIiBjcDF5PSIxLjAiIGNwMng9IjMuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIyLjAiIGNwMXg9IjIuMCIgY3AxeT0iMi4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMy4wIiBjcDF4PSIyLjAiIGNwMXk9IjMuMCIgY3AyeD0iMi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjMuMCIgY3AxeD0iMS4wIiBjcDF5PSIzLjAiIGNwMng9IjEuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSI0LjAiIGNwMXg9IjAuMCIgY3AxeT0iNC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0OThmZmRhMzUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgICAgPHVpSWNvblJlZ2lvbiBuYW1lPSJuZXdGb2xkZXJJY29uIiBzdWJyZWdpb249InRydWUiIGtleT0ibmV3Rm9sZGVySWNvbiI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD41PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciA0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjExMjkwMzIyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yMzU0ODM4NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTIiIGdyZWVuPSIyNTUiIGJsdWU9IjkyIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zODcwOTY3NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTIiIGdyZWVuPSIyNTUiIGJsdWU9IjkyIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41NzA5Njc3MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTMiIGdyZWVuPSIxOTEiIGJsdWU9IjQiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjEuMCIgeDI9IjAuNDQ5MTAxNzk0MDgxOTAxMiIgeTI9IjAuNDYzMjc2ODM3MzQ1Mzc2MzQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi45MjMwNzY5MjMwNzY5MjI1IiB5PSIzLjMwNzY5MjMwNzY5MjMwOCIgY3AxeD0iMi45MjMwNzY5MjMwNzY5MjI1IiBjcDF5PSIzLjMwNzY5MjMwNzY5MjMwOCIgY3AyeD0iMi45MjMwNzY5MjMwNzY5MjI1IiBjcDJ5PSIzLjMwNzY5MjMwNzY5MjMwOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNDQyMzA3NjkyMzA3NjkxNiIgeT0iMi44NDYxNTM4NDYxNTM4NDYzIiBjcDF4PSIzLjQ0MjMwNzY5MjMwNzY5MTYiIGNwMXk9IjIuODQ2MTUzODQ2MTUzODQ2MyIgY3AyeD0iMy40NDIzMDc2OTIzMDc2OTE2IiBjcDJ5PSIyLjg0NjE1Mzg0NjE1Mzg0NjMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0Ljk0MjMwNzY5MjMwNzY5MjUiIHk9IjQuMDM4NDYxNTM4NDYxNTM4IiBjcDF4PSI0Ljk0MjMwNzY5MjMwNzY5MjUiIGNwMXk9IjQuMDM4NDYxNTM4NDYxNTM4IiBjcDJ4PSI0Ljk0MjMwNzY5MjMwNzY5MjUiIGNwMnk9IjQuMDM4NDYxNTM4NDYxNTM4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4yMTE1Mzg0NjE1Mzg0NjIiIHk9IjIuMTUzODQ2MTUzODQ2MTU0IiBjcDF4PSI1LjIxMTUzODQ2MTUzODQ2MiIgY3AxeT0iMi4xNTM4NDYxNTM4NDYxNTQiIGNwMng9IjUuMjExNTM4NDYxNTM4NDYyIiBjcDJ5PSIyLjE1Mzg0NjE1Mzg0NjE1NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNzY5MjMwNzY5MjMwNzciIHk9IjIuMTkyMzA3NjkyMzA3NjkyNSIgY3AxeD0iNS43NjkyMzA3NjkyMzA3NyIgY3AxeT0iMi4xOTIzMDc2OTIzMDc2OTI1IiBjcDJ4PSI1Ljc2OTIzMDc2OTIzMDc3IiBjcDJ5PSIyLjE5MjMwNzY5MjMwNzY5MjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjEzNDYxNTM4NDYxNTM4NSIgeT0iNC4wMzg0NjE1Mzg0NjE1MzgiIGNwMXg9IjYuMTM0NjE1Mzg0NjE1Mzg1IiBjcDF5PSI0LjAzODQ2MTUzODQ2MTUzOCIgY3AyeD0iNi4xMzQ2MTUzODQ2MTUzODUiIGNwMnk9IjQuMDM4NDYxNTM4NDYxNTM4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy40MDM4NDYxNTM4NDYxNTQiIHk9IjIuOTgwNzY5MjMwNzY5MjMxMyIgY3AxeD0iNy40MDM4NDYxNTM4NDYxNTQiIGNwMXk9IjIuOTgwNzY5MjMwNzY5MjMxMyIgY3AyeD0iNy40MDM4NDYxNTM4NDYxNTQiIGNwMnk9IjIuOTgwNzY5MjMwNzY5MjMxMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuOTgwNzY5MjMwNzY5MjMxIiB5PSIzLjUxOTIzMDc2OTIzMDc2OTYiIGNwMXg9IjcuOTgwNzY5MjMwNzY5MjMxIiBjcDF5PSIzLjUxOTIzMDc2OTIzMDc2OTYiIGNwMng9IjcuOTgwNzY5MjMwNzY5MjMxIiBjcDJ5PSIzLjUxOTIzMDc2OTIzMDc2OTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjkwMzg0NjE1Mzg0NjE1NCIgeT0iNC42OTIzMDc2OTIzMDc2OTI1IiBjcDF4PSI2LjkwMzg0NjE1Mzg0NjE1NCIgY3AxeT0iNC42OTIzMDc2OTIzMDc2OTI1IiBjcDJ4PSI2LjkwMzg0NjE1Mzg0NjE1NCIgY3AyeT0iNC42OTIzMDc2OTIzMDc2OTI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC43NTAwMDAwMDAwMDAwMDciIHk9IjUuMTUzODQ2MTUzODQ2MTU0IiBjcDF4PSI4Ljc1MDAwMDAwMDAwMDAwNyIgY3AxeT0iNS4xNTM4NDYxNTM4NDYxNTQiIGNwMng9IjguNzUwMDAwMDAwMDAwMDA3IiBjcDJ5PSI1LjE1Mzg0NjE1Mzg0NjE1NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNzY5MjMwNzY5MjMwNzc1IiB5PSI1LjgwNzY5MjMwNzY5MjMwNzUiIGNwMXg9IjguNzY5MjMwNzY5MjMwNzc1IiBjcDF5PSI1LjgwNzY5MjMwNzY5MjMwNzUiIGNwMng9IjguNzY5MjMwNzY5MjMwNzc1IiBjcDJ5PSI1LjgwNzY5MjMwNzY5MjMwNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjUzODQ2MTUzODQ2MTUzOSIgeT0iNi4wNTc2OTIzMDc2OTIzMDgiIGNwMXg9IjYuNTM4NDYxNTM4NDYxNTM5IiBjcDF5PSI2LjA1NzY5MjMwNzY5MjMwOCIgY3AyeD0iNi41Mzg0NjE1Mzg0NjE1MzkiIGNwMnk9IjYuMDU3NjkyMzA3NjkyMzA4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy44MjY5MjMwNzY5MjMwNzkiIHk9IjcuMzQ2MTUzODQ2MTUzODQ2IiBjcDF4PSI3LjgyNjkyMzA3NjkyMzA3OSIgY3AxeT0iNy4zNDYxNTM4NDYxNTM4NDYiIGNwMng9IjcuODI2OTIzMDc2OTIzMDc5IiBjcDJ5PSI3LjM0NjE1Mzg0NjE1Mzg0NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuNDQyMzA3NjkyMzA3NjkyIiB5PSI3Ljg4NDYxNTM4NDYxNTM4NCIgY3AxeD0iNy40NDIzMDc2OTIzMDc2OTIiIGNwMXk9IjcuODg0NjE1Mzg0NjE1Mzg0IiBjcDJ4PSI3LjQ0MjMwNzY5MjMwNzY5MiIgY3AyeT0iNy44ODQ2MTUzODQ2MTUzODQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjExNTM4NDYxNTM4NDYxNyIgeT0iNi42MzQ2MTUzODQ2MTUzODUiIGNwMXg9IjYuMTE1Mzg0NjE1Mzg0NjE3IiBjcDF5PSI2LjYzNDYxNTM4NDYxNTM4NSIgY3AyeD0iNi4xMTUzODQ2MTUzODQ2MTciIGNwMnk9IjYuNjM0NjE1Mzg0NjE1Mzg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS44ODQ2MTUzODQ2MTUzODUiIHk9IjguOTYxNTM4NDYxNTM4NDYyIiBjcDF4PSI1Ljg4NDYxNTM4NDYxNTM4NSIgY3AxeT0iOC45NjE1Mzg0NjE1Mzg0NjIiIGNwMng9IjUuODg0NjE1Mzg0NjE1Mzg1IiBjcDJ5PSI4Ljk2MTUzODQ2MTUzODQ2MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMjUiIHk9IjguOTYxNTM4NDYxNTM4NDYyIiBjcDF4PSI1LjI1IiBjcDF5PSI4Ljk2MTUzODQ2MTUzODQ2MiIgY3AyeD0iNS4yNSIgY3AyeT0iOC45NjE1Mzg0NjE1Mzg0NjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0Ljg4NDYxNTM4NDYxNTM4NSIgeT0iNi43MzA3NjkyMzA3NjkyMzEiIGNwMXg9IjQuODg0NjE1Mzg0NjE1Mzg1IiBjcDF5PSI2LjczMDc2OTIzMDc2OTIzMSIgY3AyeD0iNC44ODQ2MTUzODQ2MTUzODUiIGNwMnk9IjYuNzMwNzY5MjMwNzY5MjMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy40NjE1Mzg0NjE1Mzg0NjEiIHk9IjguMCIgY3AxeD0iMy40NjE1Mzg0NjE1Mzg0NjEiIGNwMXk9IjguMCIgY3AyeD0iMy40NjE1Mzg0NjE1Mzg0NjEiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMjExNTM4NDYxNTM4NDYxIiB5PSI3LjI2OTIzMDc2OTIzMDc2OSIgY3AxeD0iMy4yMTE1Mzg0NjE1Mzg0NjEiIGNwMXk9IjcuMjY5MjMwNzY5MjMwNzY5IiBjcDJ4PSIzLjIxMTUzODQ2MTUzODQ2MSIgY3AyeT0iNy4yNjkyMzA3NjkyMzA3NjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjE1Mzg0NjE1Mzg0NjE1MyIgeT0iNi4wNTc2OTIzMDc2OTIzMDc1IiBjcDF4PSI0LjE1Mzg0NjE1Mzg0NjE1MyIgY3AxeT0iNi4wNTc2OTIzMDc2OTIzMDc1IiBjcDJ4PSI0LjE1Mzg0NjE1Mzg0NjE1MyIgY3AyeT0iNi4wNTc2OTIzMDc2OTIzMDc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4zNDYxNTM4NDYxNTM4NDU0IiB5PSI1Ljg4NDYxNTM4NDYxNTM4NSIgY3AxeD0iMi4zNDYxNTM4NDYxNTM4NDU0IiBjcDF5PSI1Ljg4NDYxNTM4NDYxNTM4NSIgY3AyeD0iMi4zNDYxNTM4NDYxNTM4NDU0IiBjcDJ5PSI1Ljg4NDYxNTM4NDYxNTM4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuNDAzODQ2MTUzODQ2MTUzMyIgeT0iNS4wMzg0NjE1Mzg0NjE1MzgiIGNwMXg9IjIuNDAzODQ2MTUzODQ2MTUzMyIgY3AxeT0iNS4wMzg0NjE1Mzg0NjE1MzgiIGNwMng9IjIuNDAzODQ2MTUzODQ2MTUzMyIgY3AyeT0iNS4wMzg0NjE1Mzg0NjE1MzgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjExNTM4NDYxNTM4NDYxNSIgeT0iNC45MjMwNzY5MjMwNzY5MjMiIGNwMXg9IjQuMTE1Mzg0NjE1Mzg0NjE1IiBjcDF5PSI0LjkyMzA3NjkyMzA3NjkyMyIgY3AyeD0iNC4xMTUzODQ2MTUzODQ2MTUiIGNwMnk9IjQuOTIzMDc2OTIzMDc2OTIzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iODUiIGJsdWU9IjEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDMyNzU4NTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTgyNzMyOTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjUwOTgwMzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMTczMDc2OTIzMDc2OTIzNCIgeT0iMS42NTM4NDYxNTM4NDYxNTQiIGNwMXg9IjEuMTczMDc2OTIzMDc2OTIzNCIgY3AxeT0iMS42NTM4NDYxNTM4NDYxNTQiIGNwMng9IjEuMTczMDc2OTIzMDc2OTIzNCIgY3AyeT0iMS42NTM4NDYxNTM4NDYxNTQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjYzNDYxNTM4NDYxNTM4NTIiIHk9IjEuMDc2OTIzMDc2OTIzMDc3MyIgY3AxeD0iMS42MzQ2MTUzODQ2MTUzODUyIiBjcDF5PSIxLjA3NjkyMzA3NjkyMzA3NzMiIGNwMng9IjEuNjM0NjE1Mzg0NjE1Mzg1MiIgY3AyeT0iMS4wNzY5MjMwNzY5MjMwNzczIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC44MjY5MjMwNzY5MjMwNzciIHk9IjMuNzMwNzY5MjMwNzY5MjMxMyIgY3AxeD0iNC44MjY5MjMwNzY5MjMwNzciIGNwMXk9IjMuNzMwNzY5MjMwNzY5MjMxMyIgY3AyeD0iNC44MjY5MjMwNzY5MjMwNzciIGNwMnk9IjMuNzMwNzY5MjMwNzY5MjMxMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMDk2MTUzODQ2MTUzODQ3IiB5PSIwLjA5NjE1Mzg0NjE1Mzg0NjE1IiBjcDF4PSI1LjA5NjE1Mzg0NjE1Mzg0NyIgY3AxeT0iMC4wOTYxNTM4NDYxNTM4NDYxNSIgY3AyeD0iNS4wOTYxNTM4NDYxNTM4NDciIGNwMnk9IjAuMDk2MTUzODQ2MTUzODQ2MTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjkwMzg0NjE1Mzg0NjE1NCIgeT0iMC4wOTYxNTM4NDYxNTM4NDYxNSIgY3AxeD0iNS45MDM4NDYxNTM4NDYxNTQiIGNwMXk9IjAuMDk2MTUzODQ2MTUzODQ2MTUiIGNwMng9IjUuOTAzODQ2MTUzODQ2MTU0IiBjcDJ5PSIwLjA5NjE1Mzg0NjE1Mzg0NjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4zNjUzODQ2MTUzODQ2MTUiIHk9IjMuNjE1Mzg0NjE1Mzg0NjE1NCIgY3AxeD0iNi4zNjUzODQ2MTUzODQ2MTUiIGNwMXk9IjMuNjE1Mzg0NjE1Mzg0NjE1NCIgY3AyeD0iNi4zNjUzODQ2MTUzODQ2MTUiIGNwMnk9IjMuNjE1Mzg0NjE1Mzg0NjE1NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuMTkyMzA3NjkyMzA3NjkzIiB5PSIxLjAzODQ2MTUzODQ2MTUzODUiIGNwMXg9IjkuMTkyMzA3NjkyMzA3NjkzIiBjcDF5PSIxLjAzODQ2MTUzODQ2MTUzODUiIGNwMng9IjkuMTkyMzA3NjkyMzA3NjkzIiBjcDJ5PSIxLjAzODQ2MTUzODQ2MTUzODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5Ljk0MjMwNzY5MjMwNzY5MyIgeT0iMS44ODQ2MTUzODQ2MTUzODQ2IiBjcDF4PSI5Ljk0MjMwNzY5MjMwNzY5MyIgY3AxeT0iMS44ODQ2MTUzODQ2MTUzODQ2IiBjcDJ4PSI5Ljk0MjMwNzY5MjMwNzY5MyIgY3AyeT0iMS44ODQ2MTUzODQ2MTUzODQ2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4zMjY5MjMwNzY5MjMwNzciIHk9IjQuNzExNTM4NDYxNTM4NDYzIiBjcDF4PSI3LjMyNjkyMzA3NjkyMzA3NyIgY3AxeT0iNC43MTE1Mzg0NjE1Mzg0NjMiIGNwMng9IjcuMzI2OTIzMDc2OTIzMDc3IiBjcDJ5PSI0LjcxMTUzODQ2MTUzODQ2MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjg2NTM4NDYxNTM4NDYxMyIgeT0iNS4xNTM4NDYxNTM4NDYxNTMiIGNwMXg9IjEwLjg2NTM4NDYxNTM4NDYxMyIgY3AxeT0iNS4xNTM4NDYxNTM4NDYxNTMiIGNwMng9IjEwLjg2NTM4NDYxNTM4NDYxMyIgY3AyeT0iNS4xNTM4NDYxNTM4NDYxNTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC45MDM4NDYxNTM4NDYxNTUiIHk9IjUuODg0NjE1Mzg0NjE1Mzg0IiBjcDF4PSIxMC45MDM4NDYxNTM4NDYxNTUiIGNwMXk9IjUuODg0NjE1Mzg0NjE1Mzg0IiBjcDJ4PSIxMC45MDM4NDYxNTM4NDYxNTUiIGNwMnk9IjUuODg0NjE1Mzg0NjE1Mzg0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy40NDIzMDc2OTIzMDc2OTI1IiB5PSI2LjI1IiBjcDF4PSI3LjQ0MjMwNzY5MjMwNzY5MjUiIGNwMXk9IjYuMjUiIGNwMng9IjcuNDQyMzA3NjkyMzA3NjkyNSIgY3AyeT0iNi4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNzg4NDYxNTM4NDYxNTQ3IiB5PSI5LjM4NDYxNTM4NDYxNTM5NyIgY3AxeD0iOS43ODg0NjE1Mzg0NjE1NDciIGNwMXk9IjkuMzg0NjE1Mzg0NjE1Mzk3IiBjcDJ4PSI5Ljc4ODQ2MTUzODQ2MTU0NyIgY3AyeT0iOS4zODQ2MTUzODQ2MTUzOTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjUxOTIzMDc2OTIzMDc4MiIgeT0iOS45NjE1Mzg0NjE1Mzg0NzQiIGNwMXg9IjkuNTE5MjMwNzY5MjMwNzgyIiBjcDF5PSI5Ljk2MTUzODQ2MTUzODQ3NCIgY3AyeD0iOS41MTkyMzA3NjkyMzA3ODIiIGNwMnk9IjkuOTYxNTM4NDYxNTM4NDc0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4zMjY5MjMwNzY5MjMwNzc1IiB5PSI3LjAxOTIzMDc2OTIzMDc2OSIgY3AxeD0iNi4zMjY5MjMwNzY5MjMwNzc1IiBjcDF5PSI3LjAxOTIzMDc2OTIzMDc2OSIgY3AyeD0iNi4zMjY5MjMwNzY5MjMwNzc1IiBjcDJ5PSI3LjAxOTIzMDc2OTIzMDc2OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuOTAzODQ2MTUzODQ2MTU0IiB5PSIxMC45MDM4NDYxNTM4NDYxNTMiIGNwMXg9IjUuOTAzODQ2MTUzODQ2MTU0IiBjcDF5PSIxMC45MDM4NDYxNTM4NDYxNTMiIGNwMng9IjUuOTAzODQ2MTUzODQ2MTU0IiBjcDJ5PSIxMC45MDM4NDYxNTM4NDYxNTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjE3MzA3NjkyMzA3NjkyMyIgeT0iMTAuODY1Mzg0NjE1Mzg0NjE1IiBjcDF4PSI1LjE3MzA3NjkyMzA3NjkyMyIgY3AxeT0iMTAuODY1Mzg0NjE1Mzg0NjE1IiBjcDJ4PSI1LjE3MzA3NjkyMzA3NjkyMyIgY3AyeT0iMTAuODY1Mzg0NjE1Mzg0NjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC43NjkyMzA3NjkyMzA3NyIgeT0iNy4wNTc2OTIzMDc2OTIzMDc1IiBjcDF4PSI0Ljc2OTIzMDc2OTIzMDc3IiBjcDF5PSI3LjA1NzY5MjMwNzY5MjMwNzUiIGNwMng9IjQuNzY5MjMwNzY5MjMwNzciIGNwMnk9IjcuMDU3NjkyMzA3NjkyMzA3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuNDQyMzA3NjkyMzA3NjkzIiB5PSI5LjgwNzY5MjMwNzY5MjMxNCIgY3AxeD0iMS40NDIzMDc2OTIzMDc2OTMiIGNwMXk9IjkuODA3NjkyMzA3NjkyMzE0IiBjcDJ4PSIxLjQ0MjMwNzY5MjMwNzY5MyIgY3AyeT0iOS44MDc2OTIzMDc2OTIzMTQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAzODQ2MTUzODQ2MTUzOTIiIHk9IjkuNDIzMDc2OTIzMDc2OTIzIiBjcDF4PSIxLjAzODQ2MTUzODQ2MTUzOTIiIGNwMXk9IjkuNDIzMDc2OTIzMDc2OTIzIiBjcDJ4PSIxLjAzODQ2MTUzODQ2MTUzOTIiIGNwMnk9IjkuNDIzMDc2OTIzMDc2OTIzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy43NSIgeT0iNi4wMzg0NjE1Mzg0NjE1MzgiIGNwMXg9IjMuNzUiIGNwMXk9IjYuMDM4NDYxNTM4NDYxNTM4IiBjcDJ4PSIzLjc1IiBjcDJ5PSI2LjAzODQ2MTUzODQ2MTUzOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMDU3NjkyMzA3NjkyMzA3ODIiIHk9IjUuOTgwNzY5MjMwNzY5MjMxIiBjcDF4PSIwLjA1NzY5MjMwNzY5MjMwNzgyIiBjcDF5PSI1Ljk4MDc2OTIzMDc2OTIzMSIgY3AyeD0iMC4wNTc2OTIzMDc2OTIzMDc4MiIgY3AyeT0iNS45ODA3NjkyMzA3NjkyMzEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjA3NjkyMzA3NjkyMzA3Njk4IiB5PSI1LjEzNDYxNTM4NDYxNTM4NCIgY3AxeD0iMC4wNzY5MjMwNzY5MjMwNzY5OCIgY3AxeT0iNS4xMzQ2MTUzODQ2MTUzODQiIGNwMng9IjAuMDc2OTIzMDc2OTIzMDc2OTgiIGNwMnk9IjUuMTM0NjE1Mzg0NjE1Mzg0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy45ODA3NjkyMzA3NjkyMzEiIHk9IjQuNzExNTM4NDYxNTM4NDYxIiBjcDF4PSIzLjk4MDc2OTIzMDc2OTIzMSIgY3AxeT0iNC43MTE1Mzg0NjE1Mzg0NjEiIGNwMng9IjMuOTgwNzY5MjMwNzY5MjMxIiBjcDJ5PSI0LjcxMTUzODQ2MTUzODQ2MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iODUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTE3MCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjEzNDYxNTM4NDYxNTM4NjEiIHk9IjAuMzA3NjkyMzA3NjkyMzA3NjUiIGNwMXg9IjEuMTM0NjE1Mzg0NjE1Mzg2MSIgY3AxeT0iMC4zMDc2OTIzMDc2OTIzMDc2NSIgY3AyeD0iMS4xMzQ2MTUzODQ2MTUzODYxIiBjcDJ5PSIwLjMwNzY5MjMwNzY5MjMwNzY1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy43NjkyMzA3NjkyMzA3NzEiIHk9IjEuODg0NjE1Mzg0NjE1Mzg0NiIgY3AxeD0iMy43NjkyMzA3NjkyMzA3NzEiIGNwMXk9IjEuODg0NjE1Mzg0NjE1Mzg0NiIgY3AyeD0iMy43NjkyMzA3NjkyMzA3NzEiIGNwMnk9IjEuODg0NjE1Mzg0NjE1Mzg0NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuNTk2MTUzODQ2MTUzODQ4IiB5PSIwLjA5NjE1Mzg0NjE1Mzg0NjE1IiBjcDF4PSI0LjU5NjE1Mzg0NjE1Mzg0OCIgY3AxeT0iMC4wOTYxNTM4NDYxNTM4NDYxNSIgY3AyeD0iNC41OTYxNTM4NDYxNTM4NDgiIGNwMnk9IjAuMDk2MTUzODQ2MTUzODQ2MTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjUxOTIzMDc2OTIzMDc3MSIgeT0iMi4wMzg0NjE1Mzg0NjE1Mzg4IiBjcDF4PSI2LjUxOTIzMDc2OTIzMDc3MSIgY3AxeT0iMi4wMzg0NjE1Mzg0NjE1Mzg4IiBjcDJ4PSI2LjUxOTIzMDc2OTIzMDc3MSIgY3AyeT0iMi4wMzg0NjE1Mzg0NjE1Mzg4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4yNjkyMzA3NjkyMzA3NTYiIHk9IjAuNjkyMzA3NjkyMzA3NjkyNSIgY3AxeD0iOS4yNjkyMzA3NjkyMzA3NTYiIGNwMXk9IjAuNjkyMzA3NjkyMzA3NjkyNSIgY3AyeD0iOS4yNjkyMzA3NjkyMzA3NTYiIGNwMnk9IjAuNjkyMzA3NjkyMzA3NjkyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuMTUzODQ2MTUzODQ2MTQiIHk9IjQuMjUiIGNwMXg9IjkuMTUzODQ2MTUzODQ2MTQiIGNwMXk9IjQuMjUiIGNwMng9IjkuMTUzODQ2MTUzODQ2MTQiIGNwMnk9IjQuMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS44NDYxNTM4NDYxNTM4MzQiIHk9IjQuNTU3NjkyMzA3NjkyMzA3NSIgY3AxeD0iMTEuODQ2MTUzODQ2MTUzODM0IiBjcDF5PSI0LjU1NzY5MjMwNzY5MjMwNzUiIGNwMng9IjExLjg0NjE1Mzg0NjE1MzgzNCIgY3AyeT0iNC41NTc2OTIzMDc2OTIzMDc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS43MTE1Mzg0NjE1Mzg0NSIgeT0iNy4wIiBjcDF4PSI5LjcxMTUzODQ2MTUzODQ1IiBjcDF5PSI3LjAiIGNwMng9IjkuNzExNTM4NDYxNTM4NDUiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjQ5OTk5OTk5OTk5OTk4OCIgeT0iMTAuODA3NjkyMzA3NjkyMzA4IiBjcDF4PSIxMC40OTk5OTk5OTk5OTk5ODgiIGNwMXk9IjEwLjgwNzY5MjMwNzY5MjMwOCIgY3AyeD0iMTAuNDk5OTk5OTk5OTk5OTg4IiBjcDJ5PSIxMC44MDc2OTIzMDc2OTIzMDgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjIxMTUzODQ2MTUzODQ2MzUiIHk9IjkuOTgwNzY5MjMwNzY5MjMyIiBjcDF4PSI3LjIxMTUzODQ2MTUzODQ2MzUiIGNwMXk9IjkuOTgwNzY5MjMwNzY5MjMyIiBjcDJ4PSI3LjIxMTUzODQ2MTUzODQ2MzUiIGNwMnk9IjkuOTgwNzY5MjMwNzY5MjMyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS43ODg0NjE1Mzg0NjE1NCIgeT0iMTIuMDU3NjkyMzA3NjkyMzA4IiBjcDF4PSI1Ljc4ODQ2MTUzODQ2MTU0IiBjcDF5PSIxMi4wNTc2OTIzMDc2OTIzMDgiIGNwMng9IjUuNzg4NDYxNTM4NDYxNTQiIGNwMnk9IjEyLjA1NzY5MjMwNzY5MjMwOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMTUzODQ2MTUzODQ2MTU1IiB5PSI5LjkyMzA3NjkyMzA3NjkyMyIgY3AxeD0iMy4xNTM4NDYxNTM4NDYxNTUiIGNwMXk9IjkuOTIzMDc2OTIzMDc2OTIzIiBjcDJ4PSIzLjE1Mzg0NjE1Mzg0NjE1NSIgY3AyeT0iOS45MjMwNzY5MjMwNzY5MjMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjEzNDYxNTM4NDYxNTM4NjEiIHk9IjEwLjU1NzY5MjMwNzY5MjMwOCIgY3AxeD0iMS4xMzQ2MTUzODQ2MTUzODYxIiBjcDF5PSIxMC41NTc2OTIzMDc2OTIzMDgiIGNwMng9IjEuMTM0NjE1Mzg0NjE1Mzg2MSIgY3AyeT0iMTAuNTU3NjkyMzA3NjkyMzA4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS41NTc2OTIzMDc2OTIzMDg4IiB5PSI3LjkyMzA3NjkyMzA3NjkyMyIgY3AxeD0iMS41NTc2OTIzMDc2OTIzMDg4IiBjcDF5PSI3LjkyMzA3NjkyMzA3NjkyMyIgY3AyeD0iMS41NTc2OTIzMDc2OTIzMDg4IiBjcDJ5PSI3LjkyMzA3NjkyMzA3NjkyMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNS45MjMwNzY5MjMwNzY5MjMiIGNwMXg9IjAuMCIgY3AxeT0iNS45MjMwNzY5MjMwNzY5MjMiIGNwMng9IjAuMCIgY3AyeT0iNS45MjMwNzY5MjMwNzY5MjMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjkyMzA3NjkyMzA3NjkyNDIiIHk9IjMuNDAzODQ2MTUzODQ2MTU0IiBjcDF4PSIxLjkyMzA3NjkyMzA3NjkyNDIiIGNwMXk9IjMuNDAzODQ2MTUzODQ2MTU0IiBjcDJ4PSIxLjkyMzA3NjkyMzA3NjkyNDIiIGNwMnk9IjMuNDAzODQ2MTUzODQ2MTU0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIxMi4wIiBjcDF4PSIxMi4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwMCIgZ3JlZW49IjEyMiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAyNzQzNjYxNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzM1MDE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI1NDQ5MTAzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExMSIgZ3JlZW49IjEzMCIgYmx1ZT0iMTQ4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAyNDI5NDI1NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzg1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzEzNzI1NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc2IiBncmVlbj0iOTEiIGJsdWU9IjEwNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTgwODEwNjkiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM1OTUyMzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzNzI1NDkyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjUuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI0LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjQuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy43NDA3NDA3NDA3NDA3NDA1IiB5PSIzLjk5OTk5OTk5OTk5OTk5OTYiIGNwMXg9IjMuNzQwNzQwNzQwNzQwNzQwNSIgY3AxeT0iMy45OTk5OTk5OTk5OTk5OTk2IiBjcDJ4PSIzLjc0MDc0MDc0MDc0MDc0MDUiIGNwMnk9IjMuOTk5OTk5OTk5OTk5OTk5NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMDE4NTE4NTE4NTE4NTEzNyIgeT0iMTAuMDU1NTU1NTU1NTU1NTUiIGNwMXg9IjIuMDE4NTE4NTE4NTE4NTEzNyIgY3AxeT0iMTAuMDU1NTU1NTU1NTU1NTUiIGNwMng9IjIuMDE4NTE4NTE4NTE4NTEzNyIgY3AyeT0iMTAuMDU1NTU1NTU1NTU1NTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE0LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNC4wIiBjcDF4PSIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuOTYyOTYyOTYyOTYyOTYzMiIgeT0iMTIuMTI5NjI5NjI5NjI5NjMyIiBjcDF4PSIyLjk2Mjk2Mjk2Mjk2Mjk2MzIiIGNwMXk9IjEyLjEyOTYyOTYyOTYyOTYzMiIgY3AyeD0iMi45NjI5NjI5NjI5NjI5NjMyIiBjcDJ5PSIxMi4xMjk2Mjk2Mjk2Mjk2MzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjU3OTk5OTk5OTk5OTk5MSIgeT0iNC45OCIgY3AxeD0iNC41Nzk5OTk5OTk5OTk5OTEiIGNwMXk9IjQuOTgiIGNwMng9IjQuNTc5OTk5OTk5OTk5OTkxIiBjcDJ5PSI0Ljk4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjcyIiBncmVlbj0iOTciIGJsdWU9IjEyMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTIwOTQzNzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIzNTcxNDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNzg0MzE0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNSIgZ3JlZW49IjU1IiBibHVlPSI3MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExNTE2NjM2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjYyNzQ1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNi4wIiB5PSI0LjAiIGNwMXg9IjE2LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTYuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuMCIgeT0iNS4wIiBjcDF4PSIxNi4wIiBjcDF5PSI1LjAiIGNwMng9IjE2LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjUuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIzLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIzLjAiIGNwMXg9IjguMCIgY3AxeT0iMy4wIiBjcDJ4PSI4LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMi4wIiBjcDF4PSI3LjAiIGNwMXk9IjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjEuMCIgY3AxeD0iNy4wIiBjcDF5PSIxLjAiIGNwMng9IjcuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi45NDQ0NDQ0NDQ0NDQ0NDM4IiB5PSIxLjAxODUxODUxODUxODUxODYiIGNwMXg9IjIuOTQ0NDQ0NDQ0NDQ0NDQzOCIgY3AxeT0iMS4wMTg1MTg1MTg1MTg1MTg2IiBjcDJ4PSIyLjk0NDQ0NDQ0NDQ0NDQ0MzgiIGNwMnk9IjEuMDE4NTE4NTE4NTE4NTE4NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuOTgxNDgxNDgxNDgxNDgxNCIgeT0iMS43NDA3NDA3NDA3NDA3NDAzIiBjcDF4PSIyLjk4MTQ4MTQ4MTQ4MTQ4MTQiIGNwMXk9IjEuNzQwNzQwNzQwNzQwNzQwMyIgY3AyeD0iMi45ODE0ODE0ODE0ODE0ODE0IiBjcDJ5PSIxLjc0MDc0MDc0MDc0MDc0MDMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjc0MDc0MDc0MDc0MDc0MDciIHk9IjMuMCIgY3AxeD0iMS43NDA3NDA3NDA3NDA3NDA3IiBjcDF5PSIzLjAiIGNwMng9IjEuNzQwNzQwNzQwNzQwNzQwNyIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTQuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNC4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNy4wIiBjcDF4PSIxNC4wIiBjcDF5PSI3LjAiIGNwMng9IjE0LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0Ljg3MDM3MDM3MDM3MDM3IiB5PSI1Ljk2Mjk2Mjk2Mjk2Mjk2NSIgY3AxeD0iMTQuODcwMzcwMzcwMzcwMzciIGNwMXk9IjUuOTYyOTYyOTYyOTYyOTY1IiBjcDJ4PSIxNC44NzAzNzAzNzAzNzAzNyIgY3AyeT0iNS45NjI5NjI5NjI5NjI5NjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI1LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuMCIgeT0iNS4wIiBjcDF4PSIxNi4wIiBjcDF5PSI1LjAiIGNwMng9IjE2LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjQ2Mjk2Mjk2Mjk2Mjk2NyIgeT0iNi4xMjk2Mjk2Mjk2Mjk2MjkiIGNwMXg9IjE1LjQ2Mjk2Mjk2Mjk2Mjk2NyIgY3AxeT0iNi4xMjk2Mjk2Mjk2Mjk2MjkiIGNwMng9IjE1LjQ2Mjk2Mjk2Mjk2Mjk2NyIgY3AyeT0iNi4xMjk2Mjk2Mjk2Mjk2MjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI3LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTQuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjE1LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjE1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE1LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxNC4wIiBjcDF4PSIwLjAiIGNwMXk9IjE0LjAiIGNwMng9IjAuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMy4yNTkyNTkyNTkyNTkyNiIgY3AxeD0iMC4wIiBjcDF5PSIzLjI1OTI1OTI1OTI1OTI2IiBjcDJ4PSIwLjAiIGNwMnk9IjMuMjU5MjU5MjU5MjU5MjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjE4NTE4NTE4NTE4NTE4NTYiIHk9IjAuMCIgY3AxeD0iMy4xODUxODUxODUxODUxODU2IiBjcDF5PSIwLjAiIGNwMng9IjMuMTg1MTg1MTg1MTg1MTg1NiIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIwLjAiIGNwMXg9IjcuMCIgY3AxeT0iMC4wIiBjcDJ4PSI3LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNTU1NTU1NTU1NTU1NTUiIHk9IjIuMDAwMDAwMDAwMDAwMDAwNCIgY3AxeD0iOC41NTU1NTU1NTU1NTU1NSIgY3AxeT0iMi4wMDAwMDAwMDAwMDAwMDA0IiBjcDJ4PSI4LjU1NTU1NTU1NTU1NTU1IiBjcDJ5PSIyLjAwMDAwMDAwMDAwMDAwMDQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMy4wIiBjcDF4PSIxNC4wIiBjcDF5PSIzLjAiIGNwMng9IjE0LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjQuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNC4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI4LjAiIHgyPSIxMy4wIiB5MT0iMy4wIiB5Mj0iNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9Ii0xMDAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNy4wIiB5MT0iMS4wIiB5Mj0iMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjA1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9Ii01MCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIyLjAiIHkxPSIzLjAiIHkyPSI0LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIxMzAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iLTEyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMTUiIGJsdWU9IjIyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNzc2ODA5NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUxNzgxMDM0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0OTAxOTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTk4NDEzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzOTIxNTY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTQuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE0LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wNDE2NjY2NjY2NjY2NjciIHk9IjEwLjE4NzQ5OTk5OTk5OTk5OCIgY3AxeD0iMi4wNDE2NjY2NjY2NjY2NjciIGNwMXk9IjEwLjE4NzQ5OTk5OTk5OTk5OCIgY3AyeD0iMi4wNDE2NjY2NjY2NjY2NjciIGNwMnk9IjEwLjE4NzQ5OTk5OTk5OTk5OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuOTc5MTY2NjY2NjY2NjY4IiB5PSI0LjAiIGNwMXg9IjMuOTc5MTY2NjY2NjY2NjY4IiBjcDF5PSI0LjAiIGNwMng9IjMuOTc5MTY2NjY2NjY2NjY4IiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI0LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjQuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMy4wIiBjcDF4PSIxMy4wIiBjcDF5PSIzLjAiIGNwMng9IjEzLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI4LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjcuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIxLjAiIGNwMXg9IjcuMCIgY3AxeT0iMS4wIiBjcDJ4PSI3LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMS4wIiBjcDF4PSIzLjAiIGNwMXk9IjEuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjIuMCIgY3AxeD0iMy4wIiBjcDF5PSIyLjAiIGNwMng9IjMuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIzLjAiIGNwMXg9IjIuMCIgY3AxeT0iMy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA0MTkxNjE3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3OCIgZ3JlZW49IjE5OCIgYmx1ZT0iMjE2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjIuOTU2OTg2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU5Nzg4MzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjk4MDM5MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjE2NDY3MDY2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNCIgZ3JlZW49IjE2MiIgYmx1ZT0iMTg4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzQ4NDgwMjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTg4MjM1MjgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zMjYzNDczIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExMSIgZ3JlZW49IjEzOSIgYmx1ZT0iMTY1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzA4NDQxNTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDk4MDM5MjEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk1IiBncmVlbj0iMTIzIiBibHVlPSIxNDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDE1OTUyNTg3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yNzMyOTgxNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNC4wIiBjcDF4PSIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDE4NTE4NTE4NTE4NTE4NiIgeT0iMTAuMDU1NTU1NTU1NTU1NTU5IiBjcDF4PSIzLjAxODUxODUxODUxODUxODYiIGNwMXk9IjEwLjA1NTU1NTU1NTU1NTU1OSIgY3AyeD0iMy4wMTg1MTg1MTg1MTg1MTg2IiBjcDJ5PSIxMC4wNTU1NTU1NTU1NTU1NTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjUuMCIgY3AxeD0iNC4wIiBjcDF5PSI1LjAiIGNwMng9IjQuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNS4wIiBjcDF4PSIxNS4wIiBjcDF5PSI1LjAiIGNwMng9IjE1LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjcuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNC4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIxIiBncmVlbj0iMTI2IiBibHVlPSIxMzYiIGFscGhhPSIxNTYiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMSIgYWxwaGFPZmZzZXQ9Ii05OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEzLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxNC4wIiBjcDF4PSIwLjAiIGNwMXk9IjE0LjAiIGNwMng9IjAuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTYuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTQuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDBmM2U3M2JhLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iY29tcHV0ZXJJY29uIiBzdWJyZWdpb249InRydWUiIGtleT0iY29tcHV0ZXJJY29uIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iaGFyZERyaXZlSWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9ImhhcmREcml2ZUljb24iPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjguMCIgeDI9IjkuMCIgeTE9IjEyLjAiIHkyPSIxNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU5IiBncmVlbj0iNjIiIGJsdWU9IjY2IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjYuMCIgeDI9IjcuMCIgeTE9IjEyLjAiIHkyPSIxNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU5IiBncmVlbj0iNjIiIGJsdWU9IjY2IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMCIgeDI9IjUuMCIgeTE9IjEyLjAiIHkyPSIxNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU5IiBncmVlbj0iNjIiIGJsdWU9IjY2IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSI0LjAiIHkxPSI1LjAiIHkyPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTUyIiBncmVlbj0iMTU1IiBibHVlPSIxNTgiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSI0LjAiIHkxPSI5LjAiIHkyPSIxMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1MiIgZ3JlZW49IjE1NSIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMTIuMCIgeDI9IjEzLjAiIHkxPSI5LjAiIHkyPSIxMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1MiIgZ3JlZW49IjE1NSIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMTIuMCIgeDI9IjEzLjAiIHkxPSI1LjAiIHkyPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcwIiBncmVlbj0iMTcyIiBibHVlPSIxNzUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIxMi4wIiB4Mj0iMTMuMCIgeTE9IjEuMCIgeTI9IjIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIxOTMiIGJsdWU9IjE5NCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjMuMCIgeDI9IjQuMCIgeTE9IjEuMCIgeTI9IjIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIxOTMiIGJsdWU9IjE5NCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDMiIGdyZWVuPSIyNDUiIGJsdWU9IjI0NiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzk2Nzc0MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDgiIGdyZWVuPSIyMTIiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDMiIGdyZWVuPSIyNDUiIGJsdWU9IjI0NiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMi4wIiBjcDF4PSI0LjAiIGNwMXk9IjMuMCIgY3AyeD0iNi4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSIyLjAiIGNwMXg9IjEwLjAiIGNwMXk9IjEuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iNS4wIiBjcDF4PSIxMi4wIiBjcDF5PSI0LjAiIGNwMng9IjEyLjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjguMCIgY3AxeD0iMTIuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSIxMC4wIiBjcDF4PSIxMC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSI4LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjEwLjAiIGNwMXg9IjguMCIgY3AxeT0iMTAuMCIgY3AyeD0iNi4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI4LjAiIGNwMXg9IjQuMCIgY3AxeT0iMTAuMCIgY3AyeD0iNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjUuMCIgY3AxeD0iNC4wIiBjcDF5PSI2LjAiIGNwMng9IjQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcFNoYWRvdyBibGVuZGluZ01vZGU9Ik5PUk1BTCIgb3BhY2l0eT0iMC40IiBhbmdsZT0iMTM1IiBkaXN0YW5jZT0iMCIgc3ByZWFkPSIwIiBzaXplPSI0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Ryb3BTaGFkb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5uZXJTaGFkb3cgYmxlbmRpbmdNb2RlPSJOT1JNQUwiIG9wYWNpdHk9IjAuNTEiIGFuZ2xlPSIyOTEiIGRpc3RhbmNlPSIzIiBzcHJlYWQ9IjAiIHNpemU9IjIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5uZXJTaGFkb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VmZmVjdHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSI0LjAiIHkxPSIxMy4wIiB5Mj0iMTQuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDQiIGdyZWVuPSIyNTUiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEwLjAiIHgyPSIxMy4wIiB5MT0iMTUuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTYiIGdyZWVuPSI1MSIgYmx1ZT0iMjUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iOS4wIiB5MT0iMTUuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTYiIGdyZWVuPSI1MSIgYmx1ZT0iMjUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA1IiBncmVlbj0iMTEwIiBibHVlPSIxMTgiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjMiIGdyZWVuPSI2NyIgYmx1ZT0iNzIiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjEyLjAiIGNwMXg9IjIuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNS4wIiBjcDF4PSIyLjAiIGNwMXk9IjE1LjAiIGNwMng9IjIuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTUuMCIgY3AxeD0iMy4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIzLjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjE0LjAiIGNwMXg9IjMuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMTQuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjE1LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjE1LjAiIGNwMng9IjEzLjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNS4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTIuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxNC4wIiB5MT0iMS4wIiB5Mj0iMTIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM5IiBncmVlbj0iMjQxIiBibHVlPSIyNDMiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk3IiBncmVlbj0iMjAxIiBibHVlPSIyMDUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxNS4wIiB5MT0iMTIuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTUuMCIgeTE9IjAuMCIgeTI9IjEyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYwIiBncmVlbj0iMTYxIiBibHVlPSIxNjMiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDBmNDg5NDVjLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgICAgPHVpSWNvblJlZ2lvbiBuYW1lPSJmbG9wcHlEcml2ZUljb24iIHN1YnJlZ2lvbj0idHJ1ZSIga2V5PSJmbG9wcHlEcml2ZUljb24iPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTMuMCIgeDI9IjE0LjAiIHkxPSIxMy4wIiB5Mj0iMTQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIzLjAiIHkxPSIxMy4wIiB5Mj0iMTQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NCIgZ3JlZW49Ijc4IiBibHVlPSIxMjIiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTIuODg0NjE1Mzg0NjE1MzgxIiB4Mj0iMTQuMTkyMzA3NjkyMzA3NjkzIiB5MT0iMTIuOTAzODQ2MTUzODQ2MTUzIiB5Mj0iMTQuNDIzMDc2OTIzMDc2OTI5IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMSIgZ3JlZW49IjIzNCIgYmx1ZT0iMjM3IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuODA3NjkyMzA3NjkyMzA4IiB4Mj0iMy4xNzMwNzY5MjMwNzY5MjM0IiB5MT0iMTIuNzg4NDYxNTM4NDYxNTQiIHkyPSIxNC40MDM4NDYxNTM4NDYxNTciIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4wIiB4Mj0iMTIuMCIgeTE9IjE0LjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjEyMiIgYmx1ZT0iMTAxIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ5IiBncmVlbj0iMTUzIiBibHVlPSIxNTYiIGFscGhhPSI1NCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjEuMCIgY3AxeD0iNC4wIiBjcDF5PSIxLjAiIGNwMng9IjQuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIxLjAiIGNwMXg9IjUuMCIgY3AxeT0iMS4wIiBjcDJ4PSI1LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iNS4wIiBjcDF4PSI1LjAiIGNwMXk9IjUuMCIgY3AyeD0iNS4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjUuMCIgY3AxeD0iNy4wIiBjcDF5PSI1LjAiIGNwMng9IjcuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIxLjAiIGNwMXg9IjcuMCIgY3AxeT0iMS4wIiBjcDJ4PSI3LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMS4wIiBjcDF4PSI4LjAiIGNwMXk9IjEuMCIgY3AyeD0iOC4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjUuMCIgY3AxeD0iOC4wIiBjcDF5PSI1LjAiIGNwMng9IjguMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSI1LjAiIGNwMXg9IjkuMCIgY3AxeT0iNS4wIiBjcDJ4PSI5LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuMCIgeT0iNi4wIiBjcDF4PSI5LjAiIGNwMXk9IjYuMCIgY3AyeD0iOS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjYuMCIgY3AxeD0iNC4wIiBjcDF5PSI2LjAiIGNwMng9IjQuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMSIgZ3JlZW49IjIzNCIgYmx1ZT0iMjM3IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMSIgZ3JlZW49IjIzNCIgYmx1ZT0iMjM3IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNSIgZ3JlZW49IjIxMSIgYmx1ZT0iMjE1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIxLjAiIGNwMXg9IjYuMCIgY3AxeT0iMS4wIiBjcDJ4PSI2LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iNi4wIiBjcDF4PSI2LjAiIGNwMXk9IjYuMCIgY3AyeD0iNi4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSI2LjAiIGNwMXg9IjEyLjAiIGNwMXk9IjYuMCIgY3AyeD0iMTIuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMi4wIiBjcDF4PSIxMi4wIiBjcDF5PSIyLjAiIGNwMng9IjEyLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjIuMCIgY3AxeD0iMTEuMCIgY3AxeT0iMi4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI1LjAiIGNwMXg9IjExLjAiIGNwMXk9IjUuMCIgY3AyeD0iMTEuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSI1LjAiIGNwMXg9IjkuMCIgY3AxeT0iNS4wIiBjcDJ4PSI5LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuMCIgeT0iMi4wIiBjcDF4PSI5LjAiIGNwMXk9IjIuMCIgY3AyeD0iOS4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIyLjAiIGNwMXg9IjEyLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMS4wIiBjcDF4PSIxMi4wIiBjcDF5PSIxLjAiIGNwMng9IjEyLjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDU4MDY0NTE3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNCIgZ3JlZW49IjIyNCIgYmx1ZT0iMjI0IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMjI1ODA2NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTkwMzIyNTgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI2NDUxNjEyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNCIgZ3JlZW49IjIyNCIgYmx1ZT0iMjI0IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zNjEyOTAzNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjQiIGdyZWVuPSIyMjQiIGJsdWU9IjIyNCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDAzMjI1OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTE2MTI5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Njc3NDE5MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzIiIGdyZWVuPSIyMzIiIGJsdWU9IjIzMiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjYxMjkwMzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMyIiBncmVlbj0iMjMyIiBibHVlPSIyMzIiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc1MTYxMjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjkuMCIgY3AxeD0iNC4wIiBjcDF5PSI5LjAiIGNwMng9IjQuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI4LjAiIGNwMXg9IjUuMCIgY3AxeT0iOC4wIiBjcDJ4PSI1LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjguMCIgY3AxeD0iMTEuMCIgY3AxeT0iOC4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSI5LjAiIGNwMXg9IjEyLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTIuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMTQuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMTQuMCIgY3AxeD0iNC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTc5IiBibHVlPSIyMDYiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTciIGdyZWVuPSIxMjMiIGJsdWU9IjE3MCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjgzODcwOTciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTMiIGdyZWVuPSI4NiIgYmx1ZT0iMTQ2IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43NTgwNjQ1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQ4IiBncmVlbj0iODIiIGJsdWU9IjE0NCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MSIgZ3JlZW49Ijk5IiBibHVlPSIxNTAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjIuMCIgY3AxeD0iMS4wIiBjcDF5PSIyLjAiIGNwMng9IjEuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxLjAiIGNwMXg9IjIuMCIgY3AxeT0iMS4wIiBjcDJ4PSIyLjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjEuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMS4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjMuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTUuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTUuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDYiIGdyZWVuPSI0NiIgYmx1ZT0iNDYiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEyMjU4MDY1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY0IiBncmVlbj0iNjQiIGJsdWU9IjY0IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44ODA2NDUxNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MyIgZ3JlZW49IjQzIiBibHVlPSI0MyIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMS4wIiBjcDF4PSIwLjAiIGNwMXk9IjEuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIwLjAiIGNwMng9IjEuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMC4wIiBjcDF4PSIxNC4wIiBjcDF5PSIwLjAiIGNwMng9IjE0LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjAiIHk9IjIuMCIgY3AxeD0iMTYuMCIgY3AxeT0iMi4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNi4wIiB5PSIxNS4wIiBjcDF4PSIxNi4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTYuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTYuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjE1LjAiIGNwMXg9IjAuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwZjU3N2Y1OS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9ImhvbWVGb2xkZXJJY29uIiBzdWJyZWdpb249InRydWUiIGtleT0iaG9tZUZvbGRlckljb24iPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NTwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYwIiBncmVlbj0iMTYxIiBibHVlPSIxNjIiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIxIiBncmVlbj0iMjI1IiBibHVlPSIyMzAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNjMwNzY5MjMwNzY5MjMxIiB5MT0iMC4zNjIxNzk0ODcxNzk0ODcwNiIgeDI9IjAuMjg4NDYxNTM4NDYxNTM4NDQiIHkyPSIwLjczMzk3NDM1ODk3NDM1OTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSIzLjAiIGNwMXg9IjkuMCIgY3AxeT0iMy4wIiBjcDJ4PSI5LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI4LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjYuMCIgY3AxeD0iOC4wIiBjcDF5PSI2LjAiIGNwMng9IjguMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iOS4wIiBjcDF4PSIxMS4wIiBjcDF5PSI5LjAiIGNwMng9IjExLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjkuMCIgY3AxeD0iMTMuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI3LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjcuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MCIgZ3JlZW49IjE2MSIgYmx1ZT0iMTYyIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNiIgZ3JlZW49IjIzMCIgYmx1ZT0iMjMzIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQzMDc2OTIzMDc2OTIzMDgiIHkxPSIwLjM3ODIwNTEyODIwNTEyODEiIHgyPSIwLjcwNzY5MjMwNzY5MjMwODEiIHkyPSIwLjY3MzA3NjkyMzA3NjkyMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSI4LjAiIGNwMXg9IjMuMCIgY3AxeT0iOC4wIiBjcDJ4PSIzLjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMy4wIiBjcDF4PSI3LjAiIGNwMXk9IjMuMCIgY3AyeD0iNy4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjMuMCIgY3AxeD0iOC4wIiBjcDF5PSIzLjAiIGNwMng9IjguMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSI2LjAiIGNwMXg9IjguMCIgY3AxeT0iNi4wIiBjcDJ4PSI4LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iOS4wIiBjcDF4PSI1LjAiIGNwMXk9IjkuMCIgY3AyeD0iNS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjkuMCIgY3AxeD0iMy4wIiBjcDF5PSI5LjAiIGNwMng9IjMuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ0IiBncmVlbj0iMjIyIiBibHVlPSIxNDMiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yODg0NjE1Mzg0NjE1MzgzIiB5PSI3LjIzMDc2OTIzMDc2OTIzIiBjcDF4PSIxLjI4ODQ2MTUzODQ2MTUzODMiIGNwMXk9IjcuMjMwNzY5MjMwNzY5MjMiIGNwMng9IjEuMjg4NDYxNTM4NDYxNTM4MyIgY3AyeT0iNy4yMzA3NjkyMzA3NjkyMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iOC4wIiBjcDF4PSIxLjAiIGNwMXk9IjguMCIgY3AyeD0iMS4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjYxNTM4NDYxNTM4NDYxNTQiIHk9IjcuODI2OTIzMDc2OTIzMDc3NSIgY3AxeD0iMS42MTUzODQ2MTUzODQ2MTU0IiBjcDF5PSI3LjgyNjkyMzA3NjkyMzA3NzUiIGNwMng9IjEuNjE1Mzg0NjE1Mzg0NjE1NCIgY3AyeT0iNy44MjY5MjMwNzY5MjMwNzc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy40MDM4NDYxNTM4NDYxNTYiIHk9IjIuMDE5MjMwNzY5MjMwNzY5IiBjcDF4PSI3LjQwMzg0NjE1Mzg0NjE1NiIgY3AxeT0iMi4wMTkyMzA3NjkyMzA3NjkiIGNwMng9IjcuNDAzODQ2MTUzODQ2MTU2IiBjcDJ5PSIyLjAxOTIzMDc2OTIzMDc2OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNTU3NjkyMzA3NjkyMzAxIiB5PSIyLjAiIGNwMXg9IjguNTU3NjkyMzA3NjkyMzAxIiBjcDF5PSIyLjAiIGNwMng9IjguNTU3NjkyMzA3NjkyMzAxIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4zMDc2OTIzMDc2OTIzMSIgeT0iNy43NjkyMzA3NjkyMzA3NyIgY3AxeD0iMTQuMzA3NjkyMzA3NjkyMzEiIGNwMXk9IjcuNzY5MjMwNzY5MjMwNzciIGNwMng9IjE0LjMwNzY5MjMwNzY5MjMxIiBjcDJ5PSI3Ljc2OTIzMDc2OTIzMDc3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iOC4wIiBjcDF4PSIxNS4wIiBjcDF5PSI4LjAiIGNwMng9IjE1LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjczMDc2OTIzMDc2OTIyMyIgeT0iNy4xOTIzMDc2OTIzMDc2OTIiIGNwMXg9IjE0LjczMDc2OTIzMDc2OTIyMyIgY3AxeT0iNy4xOTIzMDc2OTIzMDc2OTIiIGNwMng9IjE0LjczMDc2OTIzMDc2OTIyMyIgY3AyeT0iNy4xOTIzMDc2OTIzMDc2OTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjY1Mzg0NjE1Mzg0NjE1IiB5PSIwLjk4MDc2OTIzMDc2OTIzMDYiIGNwMXg9IjguNjUzODQ2MTUzODQ2MTUiIGNwMXk9IjAuOTgwNzY5MjMwNzY5MjMwNiIgY3AyeD0iOC42NTM4NDYxNTM4NDYxNSIgY3AyeT0iMC45ODA3NjkyMzA3NjkyMzA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy40NDIzMDc2OTIzMDc2OTEiIHk9IjEuMCIgY3AxeD0iNy40NDIzMDc2OTIzMDc2OTEiIGNwMXk9IjEuMCIgY3AyeD0iNy40NDIzMDc2OTIzMDc2OTEiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTQiIGdyZWVuPSI5MiIgYmx1ZT0iMTMiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjQiIGdyZWVuPSI0OCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNy4wIiBjcDF4PSIwLjAiIGNwMXk9IjcuMCIgY3AyeD0iMC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjkuMCIgY3AxeD0iMC4wIiBjcDF5PSI5LjAiIGNwMng9IjAuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI5LjAiIGNwMXg9IjIuMCIgY3AxeT0iOS4wIiBjcDJ4PSIyLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMzg0NjE1Mzg0NjE1MzkyIiB5PSIyLjk5OTk5OTk5OTk5OTk5ODciIGNwMXg9IjcuMzg0NjE1Mzg0NjE1MzkyIiBjcDF5PSIyLjk5OTk5OTk5OTk5OTk5ODciIGNwMng9IjcuMzg0NjE1Mzg0NjE1MzkyIiBjcDJ5PSIyLjk5OTk5OTk5OTk5OTk5ODciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjU3NjkyMzA3NjkyMzA3NyIgeT0iMy4wIiBjcDF4PSI4LjU3NjkyMzA3NjkyMzA3NyIgY3AxeT0iMy4wIiBjcDJ4PSI4LjU3NjkyMzA3NjkyMzA3NyIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iOS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI5LjAiIGNwMng9IjE0LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjAiIHk9IjkuMCIgY3AxeD0iMTYuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNi4wIiB5PSI3LjAiIGNwMXg9IjE2LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTYuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSIwLjAiIGNwMXg9IjkuMCIgY3AxeT0iMC4wIiBjcDJ4PSI5LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMC4wIiBjcDF4PSI3LjAiIGNwMXk9IjAuMCIgY3AyeD0iNy4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI2LjAiIHgyPSI3LjAiIHkxPSIxMC4wIiB5Mj0iMTQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM3IiBncmVlbj0iMTE1IiBibHVlPSI2MCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzQiIGdyZWVuPSIxNTEiIGJsdWU9IjkxIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODEiIGdyZWVuPSI1OSIgYmx1ZT0iNyIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NyIgZ3JlZW49Ijc0IiBibHVlPSIxOCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMTUuMCIgY3AxeD0iNS4wIiBjcDF5PSIxNS4wIiBjcDJ4PSI1LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjE1LjAiIGNwMXg9IjguMCIgY3AxeT0iMTUuMCIgY3AyeD0iOC4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIxMC4wIiBjcDF4PSI4LjAiIGNwMXk9IjEwLjAiIGNwMng9IjguMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iOS4wIiBjcDF4PSI3LjAiIGNwMXk9IjkuMCIgY3AyeD0iNy4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjkuMCIgY3AxeD0iNi4wIiBjcDF5PSI5LjAiIGNwMng9IjYuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIxMC4wIiBjcDF4PSI1LjAiIGNwMXk9IjEwLjAiIGNwMng9IjUuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMC4wIiB4Mj0iMTEuMCIgeTE9IjEwLjAiIHkyPSIxMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc3IiBncmVlbj0iMTMzIiBibHVlPSIxODUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iOS4wIiB4Mj0iMTIuMCIgeTE9IjkuMCIgeTI9IjEyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI3IiBncmVlbj0iNTciIGJsdWU9Ijg3IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc1IiBncmVlbj0iMTA5IiBibHVlPSIxMzciIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyOCIgZ3JlZW49IjIzMiIgYmx1ZT0iMjM3IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iOC4wIiBjcDF4PSIzLjAiIGNwMXk9IjguMCIgY3AyeD0iMy4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjE0LjAiIGNwMXg9IjMuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMTQuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjguMCIgY3AxeD0iMTMuMCIgY3AxeT0iOC4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjQuMCIgY3AxeD0iOC4wIiBjcDF5PSI0LjAiIGNwMng9IjguMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTEiIGdyZWVuPSI2MCIgYmx1ZT0iNzAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSI4LjAiIGNwMXg9IjIuMCIgY3AxeT0iOC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTQuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjE1LjAiIGNwMXg9IjMuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMTUuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjE0LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjE0LjAiIGNwMng9IjE0LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI4LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjguMCIgY3AyeD0iMTQuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwZjY2MDc3NS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9ImRldGFpbHNWaWV3SWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9ImRldGFpbHNWaWV3SWNvbiI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD43PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciA2Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS4wIiB4Mj0iNy4wIiB5MT0iOS4wIiB5Mj0iMTAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI2OSIgZ3JlZW49Ijc4IiBibHVlPSI4NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDU3MzQ5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDQ3NDc5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTU2ODYyOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iOC4wIiB4Mj0iMTAuMCIgeTE9IjkuMCIgeTI9IjEwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTMiIGdyZWVuPSIxMDYiIGJsdWU9IjExNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDIyNjI3NzExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40MzA1ODYxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wOTAxOTYxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI4LjAiIHgyPSIxMC4wIiB5MT0iNy4wIiB5Mj0iOC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwMyIgZ3JlZW49IjEwOSIgYmx1ZT0iMTEzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAxMTk4NTAwNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTQ3MjE4NzQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEwNTg4MjM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI1LjAiIHgyPSI3LjAiIHkxPSI3LjAiIHkyPSI4LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA1IiBncmVlbj0iMTExIiBibHVlPSIxMTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAyODk0MTAzNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTQwODg2NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDk0MTE3NjciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciA1Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEyMjE1OTA5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2IiBncmVlbj0iMTYiIGJsdWU9IjE2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC40ODYyNzQ1NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjE5ODg2MzY0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjMyNjcwNDUzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzNDA5MDk0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzOCIgZ3JlZW49IjEzOCIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIxLjAiIHkxPSIwLjAiIHgyPSIwLjAiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC45MTMwNDM0NzgyNjA4Njk2IiB5PSIxNC42MDg2OTU2NTIxNzM5MTIiIGNwMXg9IjAuOTEzMDQzNDc4MjYwODY5NiIgY3AxeT0iMTQuNjA4Njk1NjUyMTczOTEyIiBjcDJ4PSIwLjkxMzA0MzQ3ODI2MDg2OTYiIGNwMnk9IjE0LjYwODY5NTY1MjE3MzkxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuNDEzMDQzNDc4MjYwODY5NCIgeT0iMTUuMTA4Njk1NjUyMTczOTEyIiBjcDF4PSIxLjQxMzA0MzQ3ODI2MDg2OTQiIGNwMXk9IjE1LjEwODY5NTY1MjE3MzkxMiIgY3AyeD0iMS40MTMwNDM0NzgyNjA4Njk0IiBjcDJ5PSIxNS4xMDg2OTU2NTIxNzM5MTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjEwODY5NTY1MjE3MzkxMSIgeT0iMTEuNDc4MjYwODY5NTY1MjE5IiBjcDF4PSI1LjEwODY5NTY1MjE3MzkxMSIgY3AxeT0iMTEuNDc4MjYwODY5NTY1MjE5IiBjcDJ4PSI1LjEwODY5NTY1MjE3MzkxMSIgY3AyeT0iMTEuNDc4MjYwODY5NTY1MjE5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC41NjUyMTczOTEzMDQzNDk0IiB5PSIxMC45MzQ3ODI2MDg2OTU2NDkiIGNwMXg9IjQuNTY1MjE3MzkxMzA0MzQ5NCIgY3AxeT0iMTAuOTM0NzgyNjA4Njk1NjQ5IiBjcDJ4PSI0LjU2NTIxNzM5MTMwNDM0OTQiIGNwMnk9IjEwLjkzNDc4MjYwODY5NTY0OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzgzNTIyNzIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjQiIGdyZWVuPSI2NCIgYmx1ZT0iNjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI5ODAzOTIzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDU0NTQ1NDciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcxIiBncmVlbj0iMTcxIiBibHVlPSIxNzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTIxNTY4NjIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41MTQyMDQ1NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjAiIHkxPSIwLjAiIHgyPSIxLjAiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxNS4wIiBjcDF4PSIwLjAiIGNwMXk9IjE1LjAiIGNwMng9IjAuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTYuMCIgY3AxeD0iMC4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE2LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIxMi4wIiBjcDF4PSI1LjAiIGNwMXk9IjEyLjAiIGNwMng9IjUuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMTAuMCIgY3AxeD0iNC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjQuMCIgeDI9IjExLjAiIHkxPSI1LjAiIHkyPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNDA2MjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI5IiBncmVlbj0iMjQwIiBibHVlPSIyNDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAzNjUxNjc4NiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTU1MzkzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQyNzQ1MDk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTUiIGdyZWVuPSIxODYiIGJsdWU9IjIxMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDEwNjU0OTI2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNjM0MTM4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI4NjI3NDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ5MjIzNjAyNDg0NDcyMDciIHkxPSIwLjk3NTE1NTI3OTUwMzEwNSIgeDI9IjAuNDc4MjYwODY5NTY1MjE3MzUiIHkyPSIwLjIzOTEzMDQzNDc4MjYwODczIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMy4wIiB4Mj0iMTIuMCIgeTE9IjQuMCIgeTI9IjEzLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwMiIgZ3JlZW49IjEwMiIgYmx1ZT0iMTA0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxNjQ4MzUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE0MTE3NjQ5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMiIgZ3JlZW49IjEyIiBibHVlPSIxMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTAxOTYwOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iSWNvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjguMCIgeDI9IjEzLjAiIHkxPSIxMS4wIiB5Mj0iMTIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzgiIGdyZWVuPSIxODMiIGJsdWU9IjE4OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAxMjI1NzM5NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTc3NTEzMiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTIxNTY4NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iOC4wIiB4Mj0iMTMuMCIgeTE9IjcuMCIgeTI9IjguMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIxNzQiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI3LjEzNDA4RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MjE1ODM4NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNzI1NDkwMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iOC4wIiB4Mj0iMTMuMCIgeTE9IjMuMCIgeTI9IjQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIxNzQiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI3LjEzNDA4RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MjE1ODM4NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNzI1NDkwMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS4wIiB4Mj0iNy4wIiB5MT0iMy4wIiB5Mj0iNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE3NCIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjcuMTM0MDhFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyMTU4Mzg2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE3MjU0OTAxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxNS4wIiB5MT0iMS4wIiB5Mj0iMTQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM5IiBibHVlPSIyNDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAyODk0MTAzNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTkwNjMyMyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MDc4NDMxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTEzNjM2MzciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAwIiBncmVlbj0iMjE0IiBibHVlPSIyMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUxMjkwNzI3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0NTA5ODAyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTcxMDIyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIxIiBncmVlbj0iMjI5IiBibHVlPSIyMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDk1ODM2NTIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQxIiBncmVlbj0iMjQ1IiBibHVlPSIyNDgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDA3MjIzMTI5MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjA3NDg4NSIgYnJpZ2h0bmVzc09mZnNldD0iMC40MjM1Mjk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE2LjAiIHkxPSIwLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjEiIGdyZWVuPSIxNzUiIGJsdWU9IjE4OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDg3NTY2MTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTkyMTU2ODUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMyIgZ3JlZW49IjEzNCIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40ODM5OTAxMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDk5MTYwYWY3LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgICAgPHVpSWNvblJlZ2lvbiBuYW1lPSJsaXN0Vmlld0ljb24iIHN1YnJlZ2lvbj0idHJ1ZSIga2V5PSJsaXN0Vmlld0ljb24iPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NTwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iSWNvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjcuMCIgeDI9IjEyLjAiIHkxPSIxMi4wIiB5Mj0iMTMuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODYiIGdyZWVuPSIxODYiIGJsdWU9IjE4NiIgYWxwaGE9IjQwIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMCIgeDI9IjYuMCIgeTE9IjEyLjAiIHkyPSIxMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NiIgZ3JlZW49IjE4NiIgYmx1ZT0iMTg2IiBhbHBoYT0iNDAiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4wIiB4Mj0iNi4wIiB5MT0iMTAuMCIgeTI9IjExLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg2IiBncmVlbj0iMTg2IiBibHVlPSIxODYiIGFscGhhPSI1MCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI3LjAiIHgyPSIxMS4wIiB5MT0iMTAuMCIgeTI9IjExLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg2IiBncmVlbj0iMTg2IiBibHVlPSIxODYiIGFscGhhPSI0MCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI3LjAiIHgyPSIxMi4wIiB5MT0iOC4wIiB5Mj0iOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NiIgZ3JlZW49IjE4NiIgYmx1ZT0iMTg2IiBhbHBoYT0iNDAiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4wIiB4Mj0iNi4wIiB5MT0iOC4wIiB5Mj0iOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NiIgZ3JlZW49IjE4NiIgYmx1ZT0iMTg2IiBhbHBoYT0iNTAiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNy4wIiB4Mj0iMTEuMCIgeTE9IjYuMCIgeTI9IjcuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODYiIGdyZWVuPSIxODYiIGJsdWU9IjE4NiIgYWxwaGE9IjQwIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMCIgeDI9IjYuMCIgeTE9IjYuMCIgeTI9IjcuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODYiIGdyZWVuPSIxODYiIGJsdWU9IjE4NiIgYWxwaGE9IjUwIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjcuMCIgeDI9IjEyLjAiIHkxPSI0LjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg2IiBncmVlbj0iMTg2IiBibHVlPSIxODYiIGFscGhhPSI1MCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI0LjAiIHgyPSI2LjAiIHkxPSI0LjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg2IiBncmVlbj0iMTg2IiBibHVlPSIxODYiIGFscGhhPSI1MCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI0LjAiIHgyPSI2LjAiIHkxPSIxMS4wIiB5Mj0iMTIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MCIgZ3JlZW49Ijc1IiBibHVlPSI3OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDQ1Nzc1NzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyMTc5MDI3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzkyMTU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI3LjAiIHgyPSIxMi4wIiB5MT0iMTEuMCIgeTI9IjEyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjcwIiBncmVlbj0iNzUiIGJsdWU9Ijc5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwNDU3NzU3NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTIxNzkwMjciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzOTIxNTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40Mjg5NzcyOCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MyIgZ3JlZW49Ijk4IiBibHVlPSIxMDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDA0NTc3NTc3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NDc0NzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MCIgZ3JlZW49Ijc1IiBibHVlPSI3OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDQ1Nzc1NzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyMTc5MDI3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzkyMTU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjcuMCIgeDI9IjExLjAiIHkxPSI5LjAiIHkyPSIxMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDgiIGdyZWVuPSIxMTQiIGJsdWU9IjEyMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDM0NjU5MSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3NyIgZ3JlZW49IjgyIiBibHVlPSI4NyIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMCIgeDI9IjYuMCIgeTE9IjkuMCIgeTI9IjEwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzciIGdyZWVuPSI4MiIgYmx1ZT0iODciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyMDc3MTc0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMDc4NDMxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNy4wIiB4Mj0iMTIuMCIgeTE9IjcuMCIgeTI9IjguMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODciIGdyZWVuPSI5MyIgYmx1ZT0iOTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAyODk0MTAzNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTIzNDY5NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTY0NzA1OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ4Mjk1NDUzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwNiIgZ3JlZW49IjExMiIgYmx1ZT0iMTE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MzQwMTkzNSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDg2Mjc0NTM0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NyIgZ3JlZW49IjkzIiBibHVlPSI5OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDI4OTQxMDM1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MjM0Njk0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNjQ3MDU5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4wIiB4Mj0iNi4wIiB5MT0iNy4wIiB5Mj0iOC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkwIiBncmVlbj0iOTUiIGJsdWU9IjEwMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTA1MjYzMTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM1Mjk0MTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMCIgeDI9IjYuMCIgeTE9IjUuMCIgeTI9IjYuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NyIgZ3JlZW49IjEwMyIgYmx1ZT0iMTA4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMzUzNTM1NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA4Njc0NDY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjE1Njg2NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNy4wIiB4Mj0iMTEuMCIgeTE9IjUuMCIgeTI9IjYuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NyIgZ3JlZW49IjEwMyIgYmx1ZT0iMTA4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMjg5NDEwMzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUzMzg2MjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyNTQ5MDIyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI3LjAiIHgyPSIxMi4wIiB5MT0iMy4wIiB5Mj0iNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTkiIGdyZWVuPSIxMDUiIGJsdWU9IjExMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTI3NjA2MiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTEzNzI1NTEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MjA0NTQ1MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjQiIGdyZWVuPSIxMzIiIGJsdWU9IjEzOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItOC43Mzg2MzdFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyNzgwMDYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAwMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41ODIzODY0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk5IiBncmVlbj0iMTA1IiBibHVlPSIxMTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUyNzYwNjIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExMzcyNTUxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMCIgeDI9IjYuMCIgeTE9IjMuMCIgeTI9IjQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5OSIgZ3JlZW49IjEwNSIgYmx1ZT0iMTExIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41Mjc2MDYyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMTM3MjU1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTUuMCIgeTE9IjEuMCIgeTI9IjE0LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzOSIgYmx1ZT0iMjQ0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMjg5NDEwMzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU5MDYzMjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDA3ODQzMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA3NjcwNDU1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMCIgZ3JlZW49IjIxNCIgYmx1ZT0iMjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MTI5MDcyNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNDUwOTgwMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQwOTA5MDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA5IiBncmVlbj0iMjIxIiBibHVlPSIyMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUzMjcxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM2NDcwNTg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDEiIGdyZWVuPSIyNDUiIGJsdWU9IjI0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDcyMjMxMjkzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MDc0ODg1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQyMzUyOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTYuMCIgeTE9IjAuMCIgeTI9IjE1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MSIgZ3JlZW49IjE3NSIgYmx1ZT0iMTg5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40ODc1NjYxNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTIxNTY4NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIzIiBncmVlbj0iMTM0IiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ4Mzk5MDEzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0OTk3Yzc1YmMucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgPC9yZWdpb25zPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoSW50ZXJuYWxGcmFtZVRpdGxlUGFuZSIgbmFtZT0iSW50ZXJuYWxGcmFtZVRpdGxlUGFuZSIgdWk9IkNvbXBvbmVudFVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9Im1heEZyYW1lSWNvblNpemUiIHR5cGU9IkRJTUVOU0lPTiI+CisgICAgICAgICAgICAgICAgICA8ZGltZW5zaW9uIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICA8L3VpcHJvcGVydGllcz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSkludGVybmFsRnJhbWUiIG5hbWU9IkludGVybmFsRnJhbWUiIHVpPSJJbnRlcm5hbEZyYW1lVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXM+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRW5hYmxlZCIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IldpbmRvd0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgPGNvZGVTbmlwcGV0PjwhW0NEQVRBWworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjIGluc3RhbmNlb2YgSkludGVybmFsRnJhbWUgJiYgKChKSW50ZXJuYWxGcmFtZSljKS5pc1NlbGVjdGVkKCk7XV0+PC9jb2RlU25pcHBldD4KKyAgICAgICAgICAgIDwvc3RhdGVUeXBlPgorICAgICAgICAgPC9zdGF0ZVR5cGVzPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMSIgYm90dG9tPSI2IiBsZWZ0PSI2IiByaWdodD0iNiIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjI1IiBoZWlnaHQ9IjM2Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMjUiIGJvdHRvbT0iNiIgbGVmdD0iNiIgcmlnaHQ9IjYiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMjMuMCIgeTE9IjM0LjAiIHkyPSIzNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjIxNCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3Mzk5NjYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI2LjAiIHgyPSIxOS4wIiB5MT0iMjUuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9ImNvbnRyb2wiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTgiIGdyZWVuPSIxNjMiIGJsdWU9IjE3MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjM4MjExMTUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC4wIiB5PSIyNS4wIiBjcDF4PSIyMC4wIiBjcDF5PSIyNS4wIiBjcDJ4PSIyMC4wIiBjcDJ5PSIyNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIyNS4wIiBjcDF4PSI2LjAiIGNwMXk9IjI1LjAiIGNwMng9IjYuMCIgY3AyeT0iMjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMzAuMCIgY3AxeD0iNi4wIiBjcDF5PSIzMC4wIiBjcDJ4PSI2LjAiIGNwMnk9IjMwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOS4wIiB5PSIzMC4wIiBjcDF4PSIxOS4wIiBjcDF5PSIzMC4wIiBjcDJ4PSIxOS4wIiBjcDJ5PSIzMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkuMCIgeT0iMjUuMCIgY3AxeD0iMTkuMCIgY3AxeT0iMjUuMCIgY3AyeD0iMTkuMCIgY3AyeT0iMjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjAiIHk9IjI1LjAiIGNwMXg9IjIwLjAiIGNwMXk9IjI1LjAiIGNwMng9IjIwLjAiIGNwMnk9IjI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC4wIiB5PSIzMS4wIiBjcDF4PSIyMC4wIiBjcDF5PSIzMS4wIiBjcDJ4PSIyMC4wIiBjcDJ5PSIzMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIzMS4wIiBjcDF4PSI1LjAiIGNwMXk9IjMxLjAiIGNwMng9IjUuMCIgY3AyeT0iMzEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMjQuMCIgY3AxeD0iNS4wIiBjcDF5PSIyNC4wIiBjcDJ4PSI1LjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC4wIiB5PSIyNC4wIiBjcDF4PSIyMC4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIyMC4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAzIiBncmVlbj0iMjA3IiBibHVlPSIyMTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMTExMTE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjM1Nzc5NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTAxOTYwNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIyNC4wIiBjcDF4PSI1LjAiIGNwMXk9IjI0LjAiIGNwMng9IjUuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMjQuMCIgY3AxeD0iNC4wIiBjcDF5PSIyNC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjMyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMzIuMCIgY3AyeD0iNC4wIiBjcDJ5PSIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjEuMCIgeT0iMzIuMCIgY3AxeD0iMjEuMCIgY3AxeT0iMzIuMCIgY3AyeD0iMjEuMCIgY3AyeT0iMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIxLjAiIHk9IjI0LjAiIGNwMXg9IjIxLjAiIGNwMXk9IjI0LjAiIGNwMng9IjIxLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC4wIiB5PSIyNC4wIiBjcDF4PSIyMC4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIyMC4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuMCIgeT0iMzEuMCIgY3AxeD0iMjAuMCIgY3AxeT0iMzEuMCIgY3AyeD0iMjAuMCIgY3AyeT0iMzEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMzEuMCIgY3AxeD0iNS4wIiBjcDF5PSIzMS4wIiBjcDJ4PSI1LjAiIGNwMnk9IjMxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIxOTYiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA1MDUwNTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1NjMzOTEyMiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIyNC4wIiBjcDF4PSI0LjAiIGNwMXk9IjI0LjAiIGNwMng9IjQuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMjQuMCIgY3AxeD0iMS4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjMzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMzIuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIzNS4wIiBjcDF4PSIyLjAiIGNwMXk9IjM1LjAiIGNwMng9IjQuMCIgY3AyeT0iMzUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIyLjAiIHk9IjM1LjAiIGNwMXg9IjIxLjAiIGNwMXk9IjM1LjAiIGNwMng9IjIzLjAiIGNwMnk9IjM1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNC4wIiB5PSIzMy4wIiBjcDF4PSIyNC4wIiBjcDF5PSIzNC4wIiBjcDJ4PSIyNC4wIiBjcDJ5PSIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQuMCIgeT0iMjQuMCIgY3AxeD0iMjQuMCIgY3AxeT0iMjQuMCIgY3AyeD0iMjQuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIxLjAiIHk9IjI0LjAiIGNwMXg9IjIxLjAiIGNwMXk9IjI0LjAiIGNwMng9IjIxLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMS4wIiB5PSIzMi4wIiBjcDF4PSIyMS4wIiBjcDF5PSIzMi4wIiBjcDJ4PSIyMS4wIiBjcDJ5PSIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIzMi4wIiBjcDF4PSI0LjAiIGNwMXk9IjMyLjAiIGNwMng9IjQuMCIgY3AyeT0iMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMzIwMzU5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzAiIGdyZWVuPSIxNzQiIGJsdWU9IjE4MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDQyNzM0NzQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzOTQ4ODA2MiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDI3NDUwOTc5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIxOTYiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA1MDUwNTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1NjMzOTEyMiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjMuMCIgY3AxeD0iMS4wIiBjcDF5PSI0LjAiIGNwMng9IjEuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxLjAiIGNwMXg9IjIuMCIgY3AxeT0iMS4wIiBjcDJ4PSI0LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIyLjAiIHk9IjEuMCIgY3AxeD0iMjEuMCIgY3AxeT0iMS4wIiBjcDJ4PSIyMy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNC4wIiB5PSIzLjAiIGNwMXg9IjI0LjAiIGNwMXk9IjIuMCIgY3AyeD0iMjQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQuMCIgeT0iMjQuMCIgY3AxeD0iMjQuMCIgY3AxeT0iMjQuMCIgY3AyeD0iMjQuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMjQuMCIgY3AxeD0iMS4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMjUuMCIgeTE9IjAuMCIgeTI9IjM2LjAiIHJvdW5kaW5nPSI0LjY2NjY2NjY2NjY2NjY2NiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzYiIGdyZWVuPSIxNDEiIGJsdWU9IjE1MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTM2Mzc2NTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZTBkZDJjNjAucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK1dpbmRvd0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjUiIGhlaWdodD0iMzYiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIyNSIgYm90dG9tPSI2IiBsZWZ0PSI2IiByaWdodD0iNiIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIyMy4wIiB5MT0iMzQuMCIgeTI9IjM1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM1IiBncmVlbj0iMjM2IiBibHVlPSIyMzgiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMjMuMCIgeTE9IjIuMCIgeTI9IjI0LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4yNDI1MTQ5NyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjciIGdyZWVuPSIyMjkiIGJsdWU9IjIzMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE0MTYyNTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzYwNzg0MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcwIiBncmVlbj0iMTc1IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU1NDYzMzIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTc2NDcwNTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNi4wIiB4Mj0iMTkuMCIgeTE9IjI1LjAiIHkyPSIzMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJjb250cm9sIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA4IiBncmVlbj0iMTE0IiBibHVlPSIxMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzgwMTQ5NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDc5NDY0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDQ3MDU4ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMjUuMCIgY3AxeD0iNS4wIiBjcDF5PSIyNS4wIiBjcDJ4PSI1LjAiIGNwMnk9IjI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjMxLjAiIGNwMXg9IjUuMCIgY3AxeT0iMzEuMCIgY3AyeD0iNS4wIiBjcDJ5PSIzMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuMCIgeT0iMzEuMCIgY3AxeD0iMjAuMCIgY3AxeT0iMzEuMCIgY3AyeD0iMjAuMCIgY3AyeT0iMzEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjAiIHk9IjI0LjAiIGNwMXg9IjIwLjAiIGNwMXk9IjI0LjAiIGNwMng9IjIwLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjI0LjAiIGNwMXg9IjUuMCIgY3AxeT0iMjQuMCIgY3AyeD0iNS4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIyNS4wIiBjcDF4PSI1LjAiIGNwMXk9IjI1LjAiIGNwMng9IjUuMCIgY3AyeT0iMjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE5LjAiIHk9IjI1LjAiIGNwMXg9IjE5LjAiIGNwMXk9IjI1LjAiIGNwMng9IjE5LjAiIGNwMnk9IjI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOS4wIiB5PSIzMC4wIiBjcDF4PSIxOS4wIiBjcDF5PSIzMC4wIiBjcDJ4PSIxOS4wIiBjcDJ5PSIzMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIzMC4wIiBjcDF4PSI2LjAiIGNwMXk9IjMwLjAiIGNwMng9IjYuMCIgY3AyeT0iMzAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMjUuMCIgY3AxeD0iNi4wIiBjcDF5PSIyNS4wIiBjcDJ4PSI2LjAiIGNwMnk9IjI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDkiIGdyZWVuPSIxNTgiIGJsdWU9IjE2NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTI3OTI5ODQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA1ODgyMzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIxLjAiIHk9IjI0LjAiIGNwMXg9IjIxLjAiIGNwMXk9IjI0LjAiIGNwMng9IjIxLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC4wIiB5PSIyNC4wIiBjcDF4PSIyMC4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIyMC4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuMCIgeT0iMzEuMCIgY3AxeD0iMjAuMCIgY3AxeT0iMzEuMCIgY3AyeD0iMjAuMCIgY3AyeT0iMzEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMzEuMCIgY3AxeD0iNS4wIiBjcDF5PSIzMS4wIiBjcDJ4PSI1LjAiIGNwMnk9IjMxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjI0LjAiIGNwMXg9IjUuMCIgY3AxeT0iMjQuMCIgY3AyeD0iNS4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIyNC4wIiBjcDF4PSI0LjAiIGNwMXk9IjI0LjAiIGNwMng9IjQuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMzIuMCIgY3AxeD0iNC4wIiBjcDF5PSIzMi4wIiBjcDJ4PSI0LjAiIGNwMnk9IjMyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMS4wIiB5PSIzMi4wIiBjcDF4PSIyMS4wIiBjcDF5PSIzMi4wIiBjcDJ4PSIyMS4wIiBjcDJ5PSIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcxIiBncmVlbj0iMTc2IiBibHVlPSIxODYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU1NTA2OTE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE4MDM5MjE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjI0LjAiIGNwMXg9IjQuMCIgY3AxeT0iMjQuMCIgY3AyeD0iNC4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIyNC4wIiBjcDF4PSIyLjAiIGNwMXk9IjI0LjAiIGNwMng9IjIuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMzIuMCIgY3AxeD0iMi4wIiBjcDF5PSIzMS4wIiBjcDJ4PSIyLjAiIGNwMnk9IjMzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjM0LjAiIGNwMXg9IjMuMCIgY3AxeT0iMzQuMCIgY3AyeD0iNS4wIiBjcDJ5PSIzNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjEuMCIgeT0iMzQuMCIgY3AxeD0iMjAuMCIgY3AxeT0iMzQuMCIgY3AyeD0iMjIuMCIgY3AyeT0iMzQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIzLjAiIHk9IjMyLjAiIGNwMXg9IjIzLjAiIGNwMXk9IjMzLjAiIGNwMng9IjIzLjAiIGNwMnk9IjMxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMy4wIiB5PSIyNC4wIiBjcDF4PSIyMy4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIyMy4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjEuMCIgeT0iMjQuMCIgY3AxeD0iMjEuMCIgY3AxeT0iMjQuMCIgY3AyeD0iMjEuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIxLjAiIHk9IjMyLjAiIGNwMXg9IjIxLjAiIGNwMXk9IjMyLjAiIGNwMng9IjIxLjAiIGNwMnk9IjMyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjMyLjAiIGNwMXg9IjQuMCIgY3AxeT0iMzIuMCIgY3AyeD0iNC4wIiBjcDJ5PSIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjA3IiBibHVlPSIyMTMiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIyNC4wIiBjcDF4PSIzLjAiIGNwMXk9IjI0LjAiIGNwMng9IjMuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMjQuMCIgY3AxeD0iMS4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjMzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMzIuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIzNS4wIiBjcDF4PSIyLjAiIGNwMXk9IjM1LjAiIGNwMng9IjQuMCIgY3AyeT0iMzUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIyLjAiIHk9IjM1LjAiIGNwMXg9IjIxLjAiIGNwMXk9IjM1LjAiIGNwMng9IjIzLjAiIGNwMnk9IjM1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNC4wIiB5PSIzMy4wIiBjcDF4PSIyNC4wIiBjcDF5PSIzNC4wIiBjcDJ4PSIyNC4wIiBjcDJ5PSIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQuMCIgeT0iMjQuMCIgY3AxeD0iMjQuMCIgY3AxeT0iMjQuMCIgY3AyeD0iMjQuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIyLjAiIHk9IjI0LjAiIGNwMXg9IjIyLjAiIGNwMXk9IjI0LjAiIGNwMng9IjIyLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMi4wIiB5PSIzMy4wIiBjcDF4PSIyMi4wIiBjcDF5PSIzMy4wIiBjcDJ4PSIyMi4wIiBjcDJ5PSIzMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIzMy4wIiBjcDF4PSIzLjAiIGNwMXk9IjMzLjAiIGNwMng9IjMuMCIgY3AyeT0iMzMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDAiIGdyZWVuPSIyNDEiIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjI3NDQ5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zOTk5OTk5OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjA3IiBibHVlPSIyMTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU5MzQ2MDgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjg2Mjc0NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjMuMCIgY3AxeD0iMS4wIiBjcDF5PSI0LjAiIGNwMng9IjEuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxLjAiIGNwMXg9IjIuMCIgY3AxeT0iMS4wIiBjcDJ4PSI0LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIyLjAiIHk9IjEuMCIgY3AxeD0iMjEuMCIgY3AxeT0iMS4wIiBjcDJ4PSIyMy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNC4wIiB5PSIzLjAiIGNwMXg9IjI0LjAiIGNwMXk9IjIuMCIgY3AyeD0iMjQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQuMCIgeT0iMjQuMCIgY3AxeD0iMjQuMCIgY3AxeT0iMjQuMCIgY3AyeD0iMjQuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMjQuMCIgY3AxeD0iMS4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIyLjAiIGNwMXg9IjEuMCIgY3AxeT0iMS4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIyNS4wIiB5MT0iMC4wIiB5Mj0iMzYuMCIgcm91bmRpbmc9IjQuODMzMzMzMzMzMzMzMzMyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQzIiBncmVlbj0iNDYiIGJsdWU9IjUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI1NTE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3ODg1MTU2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNDkwMTk2NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2UwZTliNjAyLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zPgorICAgICAgICAgICAgPHJlZ2lvbiBuYW1lPSJJbnRlcm5hbEZyYW1lVGl0bGVQYW5lIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjMiIGJvdHRvbT0iMyIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InRpdGxlQWxpZ25tZW50IiB0eXBlPSJTVFJJTkciIHZhbHVlPSJDRU5URVIiLz4KKyAgICAgICAgICAgICAgICAgIDwvdWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zPgorICAgICAgICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIGNvbXBvbmVudE5hbWU9IkludGVybmFsRnJhbWVUaXRsZVBhbmUubWVudUJ1dHRvbiIgdHlwZT0iamF2YXguc3dpbmcuSkJ1dHRvbiIgbmFtZT0iQnV0dG9uIiB1aT0iQnV0dG9uVUkiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJFbmFibGVkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iTW91c2VPdmVyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iUHJlc3NlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkRpc2FibGVkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRm9jdXNlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlNlbGVjdGVkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iV2luZG93Tm90Rm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZVNuaXBwZXQ+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50IHBhcmVudCA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBKSW50ZXJuYWxGcmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSkludGVybmFsRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoKChKSW50ZXJuYWxGcmFtZSlwYXJlbnQpLmlzU2VsZWN0ZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtdXT48L2NvZGVTbmlwcGV0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlVHlwZXM+CisgICAgICAgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0idGVzdCIgdHlwZT0iU1RSSU5HIiB2YWx1ZT0iYW0gSW50ZXJuYWxGcmFtZVRpdGxlUGFuZS5tZW51QnV0dG9uIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3VpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxyZWdpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpSWNvblJlZ2lvbiBuYW1lPSJJY29uIiBzdWJyZWdpb249InRydWUiIGtleT0iaWNvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSI5IiBib3R0b209IjkiIGxlZnQ9IjEwIiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iNi4wIiBjcDF4PSI2LjAiIGNwMXk9IjYuMCIgY3AyeD0iNi4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI2LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjYuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS41MDAwMDAwMDAwMDAwMDQiIHk9IjEwLjk1IiBjcDF4PSI5LjUwMDAwMDAwMDAwMDAwNCIgY3AxeT0iMTAuOTUiIGNwMng9IjkuNTAwMDAwMDAwMDAwMDA0IiBjcDJ5PSIxMC45NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NCIgZ3JlZW49IjY2IiBibHVlPSI4OCIgYWxwaGE9IjEyMyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTE5MTQ5NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjQ5MzUwNjciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIwMzkyMTU5IiBhbHBoYU9mZnNldD0iLTEzMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDg1Nzk1NDciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTQiIGdyZWVuPSI2NiIgYmx1ZT0iODgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjkxOTE0OTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjI0OTM1MDY3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMDM5MjE1OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTQiIGdyZWVuPSI2NiIgYmx1ZT0iODgiIGFscGhhPSIxMzIiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjkxOTE0OTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjI0OTM1MDY3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMDM5MjE1OSIgYWxwaGFPZmZzZXQ9Ii0xMjMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTA3MTQyODU3MTQyODU2OSIgeTE9IjAuMDk0OTk5OTk5OTk5OTk5OTkiIHgyPSIwLjQ5Mjg1NzE0Mjg1NzE0MzQ0IiB5Mj0iMC45MDk5OTk5OTk5OTk5OTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iOC4wIiBjcDF4PSI2LjAiIGNwMXk9IjguMCIgY3AyeD0iNi4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI4LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjguMCIgY3AyeD0iMTMuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS41MjQ5OTk5OTk5OTk5OTUiIHk9IjEyLjk3NSIgY3AxeD0iOS41MjQ5OTk5OTk5OTk5OTUiIGNwMXk9IjEyLjk3NSIgY3AyeD0iOS41MjQ5OTk5OTk5OTk5OTUiIGNwMnk9IjEyLjk3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTciIGdyZWVuPSIxNjMiIGJsdWU9IjE3NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTE5MTQ5NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTM4MDEzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NyIgZ3JlZW49Ijk3IiBibHVlPSIxMTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzA1NDM3NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4NTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA5NDExNzY3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NiIgZ3JlZW49Ijk2IiBibHVlPSIxMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzA1NDM3NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4MzU0MDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA5ODAzOTI0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTMiIGdyZWVuPSIxMjMiIGJsdWU9IjE0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMDU0Mzc0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDMxNDg4OTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC41MDE5NjA4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NiIgZ3JlZW49Ijk2IiBibHVlPSIxMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzA1NDM3NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4MzU0MDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA5ODAzOTI0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSI4NiIgYmx1ZT0iOTMiIGFscGhhPSI3MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDI5OTk0MzI0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODAzOTIxNiIgYWxwaGFPZmZzZXQ9Ii0xODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2QwZDYyNmFjLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4OSIgZ3JlZW49IjE5MyIgYmx1ZT0iMjAxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NzYwMTI4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIzOTIxNTY3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjYuMCIgY3AxeD0iNi4wIiBjcDF5PSI2LjAiIGNwMng9IjYuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iNi4wIiBjcDF4PSIxMy4wIiBjcDF5PSI2LjAiIGNwMng9IjEzLjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNTAwMDAwMDAwMDAwMDA0IiB5PSIxMC45NSIgY3AxeD0iOS41MDAwMDAwMDAwMDAwMDQiIGNwMXk9IjEwLjk1IiBjcDJ4PSI5LjUwMDAwMDAwMDAwMDAwNCIgY3AyeT0iMTAuOTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg1IiBncmVlbj0iMTg4IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjU1MTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk0MjYzNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDc4NDMxMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYyMjE1OTA2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1OCIgZ3JlZW49IjE2MyIgYmx1ZT0iMTczIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NDkwMDkxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTQiIGdyZWVuPSIxNTkiIGJsdWU9IjE2OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTQ2OTU2OSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMTM3MjU0OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgzIiBncmVlbj0iODYiIGJsdWU9IjkzIiBhbHBoYT0iNDciIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAyOTk5NDMyNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzgwMzkyMTYiIGFscGhhT2Zmc2V0PSItMjA4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNkMGU4YzRmOS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjYuMCIgY3AxeD0iNi4wIiBjcDF5PSI2LjAiIGNwMng9IjYuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iNi4wIiBjcDF4PSIxMy4wIiBjcDF5PSI2LjAiIGNwMng9IjEzLjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNTAwMDAwMDAwMDAwMDA0IiB5PSIxMC45NSIgY3AxeD0iOS41MDAwMDAwMDAwMDAwMDQiIGNwMXk9IjEwLjk1IiBjcDJ4PSI5LjUwMDAwMDAwMDAwMDAwNCIgY3AyeT0iMTAuOTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzciIGdyZWVuPSI4OCIgYmx1ZT0iMTExIiBhbHBoYT0iMTIzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDM0MDkzNDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjMyOTQwOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTEzNzI1NTEiIGFscGhhT2Zmc2V0PSItMTMyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40ODU3OTU0NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3NyIgZ3JlZW49Ijg4IiBibHVlPSIxMTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzQwOTM0NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzI5NDA4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMTM3MjU1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzciIGdyZWVuPSI4OCIgYmx1ZT0iMTExIiBhbHBoYT0iMTMyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDM0MDkzNDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjMyOTQwOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTEzNzI1NTEiIGFscGhhT2Zmc2V0PSItMTIzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUwNzE0Mjg1NzE0Mjg1NjkiIHkxPSIwLjA5NDk5OTk5OTk5OTk5OTk5IiB4Mj0iMC40OTI4NTcxNDI4NTcxNDM0NCIgeTI9IjAuOTA5OTk5OTk5OTk5OTk5OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjguMCIgY3AxeD0iNi4wIiBjcDF5PSI4LjAiIGNwMng9IjYuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iOC4wIiBjcDF4PSIxMy4wIiBjcDF5PSI4LjAiIGNwMng9IjEzLjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNTI0OTk5OTk5OTk5OTk1IiB5PSIxMi45NzUiIGNwMXg9IjkuNTI0OTk5OTk5OTk5OTk1IiBjcDF5PSIxMi45NzUiIGNwMng9IjkuNTI0OTk5OTk5OTk5OTk1IiBjcDJ5PSIxMi45NzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY4IiBncmVlbj0iMTc0IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjkxOTE0OTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU0MzgyMjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTc2NDcwNTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDUiIGdyZWVuPSIxMTUiIGJsdWU9IjEzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMDU0Mzc0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDE5Mjk2MzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDUiIGdyZWVuPSIxMTUiIGJsdWU9IjEzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMDU0Mzc0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDE5Mjk2MzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzIiIGdyZWVuPSIxNDIiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMDU0Mzc0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU1NTkwMDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDgyMzUyOTM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40OTAxOTYxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0NCIgZ3JlZW49IjU2IiBibHVlPSI4MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTg1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjM1Mjk0MTMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIxMS4wIiB5Mj0iMTguMCIgcm91bmRpbmc9IjYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg2IiBibHVlPSI5MyIgYWxwaGE9IjcwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMjk5OTQzMjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM4MDM5MjE2IiBhbHBoYU9mZnNldD0iLTE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZDBlYWNkM2YucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iNi4wIiBjcDF4PSI2LjAiIGNwMXk9IjYuMCIgY3AyeD0iNi4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI2LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjYuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS41MDAwMDAwMDAwMDAwMDQiIHk9IjEwLjk1IiBjcDF4PSI5LjUwMDAwMDAwMDAwMDAwNCIgY3AxeT0iMTAuOTUiIGNwMng9IjkuNTAwMDAwMDAwMDAwMDA0IiBjcDJ5PSIxMC45NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNiIgZ3JlZW49IjMwIiBibHVlPSI1NiIgYWxwaGE9IjEyMyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTY4MTY4MyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wNzg1NzE0NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzI5NDExOCIgYWxwaGFPZmZzZXQ9Ii0xMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ4NTc5NTQ3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2IiBncmVlbj0iMzAiIGJsdWU9IjU2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI5NjgxNjgzIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjA3ODU3MTQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjk0MTE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNiIgZ3JlZW49IjMwIiBibHVlPSI1NiIgYWxwaGE9IjEzMiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTY4MTY4MyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wNzg1NzE0NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzI5NDExOCIgYWxwaGFPZmZzZXQ9Ii0xMjMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTA3MTQyODU3MTQyODU2OSIgeTE9IjAuMDk0OTk5OTk5OTk5OTk5OTkiIHgyPSIwLjQ5Mjg1NzE0Mjg1NzE0MzQ0IiB5Mj0iMC45MDk5OTk5OTk5OTk5OTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iOC4wIiBjcDF4PSI2LjAiIGNwMXk9IjguMCIgY3AyeD0iNi4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI4LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjguMCIgY3AyeD0iMTMuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS41MjQ5OTk5OTk5OTk5OTUiIHk9IjEyLjk3NSIgY3AxeD0iOS41MjQ5OTk5OTk5OTk5OTUiIGNwMXk9IjEyLjk3NSIgY3AyeD0iOS41MjQ5OTk5OTk5OTk5OTUiIGNwMnk9IjEyLjk3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTIiIGdyZWVuPSIxMjAiIGJsdWU9IjEzNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU5MjQzNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTYiIGdyZWVuPSI2OCIgYmx1ZT0iOTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjkxOTE0OTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjI1NzkzNjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE5NjA3ODQ1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NiIgZ3JlZW49IjY4IiBibHVlPSI5MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTE5MTQ5NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjU3OTM2NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTk2MDc4NDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjcyIiBncmVlbj0iODMiIGJsdWU9IjEwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzNDA5MzQ0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zMTQ5NTk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMzMzMzMzNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMyIgZ3JlZW49IjI3IiBibHVlPSI1NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMTEwNDM4NiIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMjM1NDQ5OSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzM3MjU0OTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIxMS4wIiB5Mj0iMTguMCIgcm91bmRpbmc9IjYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg2IiBibHVlPSI5MyIgYWxwaGE9IjcwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMjk5OTQzMjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM4MDM5MjE2IiBhbHBoYU9mZnNldD0iLTE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZDBlYzE3NTUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK1dpbmRvd05vdEZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwMCIgZ3JlZW49IjEwNCIgYmx1ZT0iMTEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NDQ4MDUxNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTE3NjQ3MDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iNi4wIiBjcDF4PSI2LjAiIGNwMXk9IjYuMCIgY3AyeD0iNi4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI2LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjYuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS41MDAwMDAwMDAwMDAwMDQiIHk9IjEwLjk1IiBjcDF4PSI5LjUwMDAwMDAwMDAwMDAwNCIgY3AxeT0iMTAuOTUiIGNwMng9IjkuNTAwMDAwMDAwMDAwMDA0IiBjcDJ5PSIxMC45NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODEiIGdyZWVuPSIxODUiIGJsdWU9IjE5MiIgYWxwaGE9IjEyMyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyNzQwODg5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTc4NDIyNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9Ii0xMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ4NTc5NTQ3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OCIgZ3JlZW49IjE1MSIgYmx1ZT0iMTU5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDQyNTYwNTE4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjY1MzE5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3NDUwOTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2OSIgZ3JlZW49IjE3MyIgYmx1ZT0iMTgyIiBhbHBoYT0iMTMyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDM2NzMyOTEyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2NDcwNTg3IiBhbHBoYU9mZnNldD0iLTEyMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41MDcxNDI4NTcxNDI4NTY5IiB5MT0iMC4wOTQ5OTk5OTk5OTk5OTk5OSIgeDI9IjAuNDkyODU3MTQyODU3MTQzNDQiIHkyPSIwLjkwOTk5OTk5OTk5OTk5OTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSI3LjAiIGNwMXg9IjYuMCIgY3AxeT0iNy4wIiBjcDJ4PSI2LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjcuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjQwOTA5MDkwOTA5MDkwMyIgeT0iMTEuNzk1NDU0NTQ1NDU0NTQ1IiBjcDF4PSI5LjQwOTA5MDkwOTA5MDkwMyIgY3AxeT0iMTEuNzk1NDU0NTQ1NDU0NTQ1IiBjcDJ4PSI5LjQwOTA5MDkwOTA5MDkwMyIgY3AyeT0iMTEuNzk1NDU0NTQ1NDU0NTQ1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE4LjAiIHkxPSIxLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iNi43NDk5OTk5OTk5OTk5OTUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOSIgZ3JlZW49IjIyMSIgYmx1ZT0iMjI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTMzOTI5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyOTQxMTc1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg4IiBncmVlbj0iMTkxIiBibHVlPSIxOTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNDI1NjA1MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU4MDQzNzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjMxMzcyNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NTA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MyIgZ3JlZW49IjE4NyIgYmx1ZT0iMTk1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NzQxNzU4MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMTU2ODYyNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg5IiBncmVlbj0iMTkzIiBibHVlPSIyMDEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU3NjAxMjgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM5MjE1NjciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNiIgZ3JlZW49IjE0MSIgYmx1ZT0iMTUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MzYzNzY1NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk1IiBncmVlbj0iMTAwIiBibHVlPSIxMTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ5OTM1MDY3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMTc2NDcwOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTUiIGdyZWVuPSIxMDAiIGJsdWU9IjExMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDk5MzUwNjciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExNzY0NzA4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZmMzOWZjMmIucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIrV2luZG93Tm90Rm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjYuMCIgY3AxeD0iNi4wIiBjcDF5PSI2LjAiIGNwMng9IjYuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iNi4wIiBjcDF4PSIxMy4wIiBjcDF5PSI2LjAiIGNwMng9IjEzLjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNTAwMDAwMDAwMDAwMDA0IiB5PSIxMC45NSIgY3AxeD0iOS41MDAwMDAwMDAwMDAwMDQiIGNwMXk9IjEwLjk1IiBjcDJ4PSI5LjUwMDAwMDAwMDAwMDAwNCIgY3AyeT0iMTAuOTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzciIGdyZWVuPSI4OCIgYmx1ZT0iMTExIiBhbHBoYT0iMTIzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDM0MDkzNDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjMyOTQwOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTEzNzI1NTEiIGFscGhhT2Zmc2V0PSItMTMyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40ODU3OTU0NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3NyIgZ3JlZW49Ijg4IiBibHVlPSIxMTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzQwOTM0NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzI5NDA4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMTM3MjU1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzciIGdyZWVuPSI4OCIgYmx1ZT0iMTExIiBhbHBoYT0iMTMyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDM0MDkzNDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjMyOTQwOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTEzNzI1NTEiIGFscGhhT2Zmc2V0PSItMTIzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUwNzE0Mjg1NzE0Mjg1NjkiIHkxPSIwLjA5NDk5OTk5OTk5OTk5OTk5IiB4Mj0iMC40OTI4NTcxNDI4NTcxNDM0NCIgeTI9IjAuOTA5OTk5OTk5OTk5OTk5OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjguMCIgY3AxeD0iNi4wIiBjcDF5PSI4LjAiIGNwMng9IjYuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iOC4wIiBjcDF4PSIxMy4wIiBjcDF5PSI4LjAiIGNwMng9IjEzLjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNTI0OTk5OTk5OTk5OTk1IiB5PSIxMi45NzUiIGNwMXg9IjkuNTI0OTk5OTk5OTk5OTk1IiBjcDF5PSIxMi45NzUiIGNwMng9IjkuNTI0OTk5OTk5OTk5OTk1IiBjcDJ5PSIxMi45NzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY4IiBncmVlbj0iMTc0IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjkxOTE0OTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU0MzgyMjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTc2NDcwNTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDUiIGdyZWVuPSIxMTUiIGJsdWU9IjEzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMDU0Mzc0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDE5Mjk2MzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDUiIGdyZWVuPSIxMTUiIGJsdWU9IjEzNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMDU0Mzc0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDE5Mjk2MzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzIiIGdyZWVuPSIxNDIiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMDU0Mzc0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU1NTkwMDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDgyMzUyOTM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40OTAxOTYxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0NCIgZ3JlZW49IjU2IiBibHVlPSI4MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTg1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjM1Mjk0MTMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIxMS4wIiB5Mj0iMTguMCIgcm91bmRpbmc9IjYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg2IiBibHVlPSI5MyIgYWxwaGE9IjcwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMjk5OTQzMjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM4MDM5MjE2IiBhbHBoYU9mZnNldD0iLTE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZDBlYWNkM2YucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkK1dpbmRvd05vdEZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSI2LjAiIGNwMXg9IjYuMCIgY3AxeT0iNi4wIiBjcDJ4PSI2LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjYuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjUwMDAwMDAwMDAwMDAwNCIgeT0iMTAuOTUiIGNwMXg9IjkuNTAwMDAwMDAwMDAwMDA0IiBjcDF5PSIxMC45NSIgY3AyeD0iOS41MDAwMDAwMDAwMDAwMDQiIGNwMnk9IjEwLjk1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2IiBncmVlbj0iMzAiIGJsdWU9IjU2IiBhbHBoYT0iMTIzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI5NjgxNjgzIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjA3ODU3MTQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjk0MTE4IiBhbHBoYU9mZnNldD0iLTEzMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDg1Nzk1NDciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYiIGdyZWVuPSIzMCIgYmx1ZT0iNTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjk2ODE2ODMiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDc4NTcxNDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyOTQxMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2IiBncmVlbj0iMzAiIGJsdWU9IjU2IiBhbHBoYT0iMTMyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI5NjgxNjgzIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjA3ODU3MTQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjk0MTE4IiBhbHBoYU9mZnNldD0iLTEyMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41MDcxNDI4NTcxNDI4NTY5IiB5MT0iMC4wOTQ5OTk5OTk5OTk5OTk5OSIgeDI9IjAuNDkyODU3MTQyODU3MTQzNDQiIHkyPSIwLjkwOTk5OTk5OTk5OTk5OTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSI4LjAiIGNwMXg9IjYuMCIgY3AxeT0iOC4wIiBjcDJ4PSI2LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjguMCIgY3AxeD0iMTMuMCIgY3AxeT0iOC4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjUyNDk5OTk5OTk5OTk5NSIgeT0iMTIuOTc1IiBjcDF4PSI5LjUyNDk5OTk5OTk5OTk5NSIgY3AxeT0iMTIuOTc1IiBjcDJ4PSI5LjUyNDk5OTk5OTk5OTk5NSIgY3AyeT0iMTIuOTc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE4LjAiIHkxPSIxLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iNi43NDk5OTk5OTk5OTk5OTMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExMiIgZ3JlZW49IjEyMCIgYmx1ZT0iMTM2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTkyNDM3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMTU2ODYyNzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NiIgZ3JlZW49IjY4IiBibHVlPSI5MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyOTE5MTQ5NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjU3OTM2NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTk2MDc4NDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NTA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU2IiBncmVlbj0iNjgiIGJsdWU9IjkwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI5MTkxNDk0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yNTc5MzY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xOTYwNzg0NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzIiIGdyZWVuPSI4MyIgYmx1ZT0iMTA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDM0MDkzNDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjMxNDk1OTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzMzMzMzM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzIiBncmVlbj0iMjciIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMxMTA0Mzg2IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjEyMzU0NDk5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMzcyNTQ5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgzIiBncmVlbj0iODYiIGJsdWU9IjkzIiBhbHBoYT0iNzAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAyOTk5NDMyNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzgwMzkyMTYiIGFscGhhT2Zmc2V0PSItMTg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNkMGVjMTc1NS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgICAgICAgICAgICAgPC9yZWdpb25zPgorICAgICAgICAgICAgICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgICAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiBjb21wb25lbnROYW1lPSJJbnRlcm5hbEZyYW1lVGl0bGVQYW5lLmljb25pZnlCdXR0b24iIHR5cGU9ImphdmF4LnN3aW5nLkpCdXR0b24iIG5hbWU9IkJ1dHRvbiIgdWk9IkJ1dHRvblVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRW5hYmxlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9Ik1vdXNlT3ZlciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlByZXNzZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJEaXNhYmxlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkZvY3VzZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJTZWxlY3RlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IldpbmRvd05vdEZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGVTbmlwcGV0PjwhW0NEQVRBWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudCBwYXJlbnQgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSkludGVybmFsRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEpJbnRlcm5hbEZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCgoSkludGVybmFsRnJhbWUpcGFyZW50KS5pc1NlbGVjdGVkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XV0+PC9jb2RlU25pcHBldD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZVR5cGVzPgorICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iOSIgYm90dG9tPSI5IiBsZWZ0PSI5IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS40NTQ1NDU0NTQ1NDU0NTQiIHgyPSIxMy42MTM2MzYzNjM2MzYzNjMiIHkxPSIxMS4wMjI3MjcyNzI3MjcyNzMiIHkyPSIxMy4wMDAwMDAwMDAwMDAwMDIiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI0Ljc1MDAwMDAwMDAwMDAwMSIgeDI9IjE0LjI1MDAwMDAwMDAwMDAwNCIgeTE9IjExLjkzMTgxODE4MTgxODE4MiIgeTI9IjEzLjQ3NzI3MjcyNzI3MjcyOCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4OCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIxNDkiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wODM3Nzg5NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDAzOTIxNTciIGFscGhhT2Zmc2V0PSItMTA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE4LjAiIHkxPSIxLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iNi43NDk5OTk5OTk5OTk5OTMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOCIgZ3JlZW49IjE2NCIgYmx1ZT0iMTEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTQuNDU2MzQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDgzNjQ0NzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA1ODgyMzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSI5OCIgYmx1ZT0iNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NTA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49Ijk5IiBibHVlPSI1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDUwOTkyOTY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAwMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOCIgZ3JlZW49IjEyNSIgYmx1ZT0iMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyMTI1OTQ1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4OCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wODM3Nzg5NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDAzOTIxNTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MSIgZ3JlZW49Ijk4IiBibHVlPSI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgzIiBncmVlbj0iODYiIGJsdWU9IjkzIiBhbHBoYT0iNzAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAyOTk5NDMyNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzgwMzkyMTYiIGFscGhhT2Zmc2V0PSItMTg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNkMTAwZDM4OS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjUuNDU0NTQ1NDU0NTQ1NDU0IiB4Mj0iMTMuNjEzNjM2MzYzNjM2MzYzIiB5MT0iMTEuMDIyNzI3MjcyNzI3MjczIiB5Mj0iMTMuMDAwMDAwMDAwMDAwMDAyIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3OCIgZ3JlZW49IjE4MyIgYmx1ZT0iMTkyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDM5NjgyMzkiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzNzYwOTY1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC43NTAwMDAwMDAwMDAwMDEiIHgyPSIxNC4yNTAwMDAwMDAwMDAwMDQiIHkxPSIxMS45MzE4MTgxODE4MTgxODIiIHkyPSIxMy40NzcyNzI3MjcyNzI3MjgiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzYiIGdyZWVuPSI4NSIgYmx1ZT0iODciIGFscGhhPSIzOSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDgwODA4MSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTU5MTA0NjkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQwMzkyMTU3IiBhbHBoYU9mZnNldD0iLTIxNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODciIGdyZWVuPSIxOTAiIGJsdWU9IjE5NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuNTI3MzMyMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuOTMzMTM5MjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYyIiBncmVlbj0iMTY2IiBibHVlPSIxNzYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjUzNTI2ODY2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC44OTk1MTIyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNTg4MjM1MjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NTA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1NyIgZ3JlZW49IjE2MiIgYmx1ZT0iMTcxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC41MjMzNjM5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC44OTcxODYzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTU0IiBncmVlbj0iMTU5IiBibHVlPSIxNjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjUyNzMzMjEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjg5MDMwMDIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA4NjI3NDUwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg1IiBncmVlbj0iMTg4IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjUyMDM4NzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjkzNzYwNjgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTQiIGdyZWVuPSIxNTkiIGJsdWU9IjE2OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuNTI3MzMyMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuODkwMzAwMiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDg2Mjc0NTA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSI4NiIgYmx1ZT0iOTMiIGFscGhhPSI3MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDI5OTk0MzI0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODAzOTIxNiIgYWxwaGFPZmZzZXQ9Ii0xODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2UyM2Y2ZWEwLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI1LjQ1NDU0NTQ1NDU0NTQ1NCIgeDI9IjEzLjYxMzYzNjM2MzYzNjM2MyIgeTE9IjExLjAyMjcyNzI3MjcyNzI3MyIgeTI9IjEzLjAwMDAwMDAwMDAwMDAwMiIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuNzUwMDAwMDAwMDAwMDAxIiB4Mj0iMTQuMjUwMDAwMDAwMDAwMDA0IiB5MT0iMTEuOTMxODE4MTgxODE4MTgyIiB5Mj0iMTMuNDc3MjcyNzI3MjcyNzI4IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjcxIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDI1NzcyNDM0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjkiIGdyZWVuPSIxNzUiIGJsdWU9IjEyMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii00LjQ1NjM0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUwNzQ0MTkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ5MDE5NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjEyMCIgYmx1ZT0iMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSI5Ljc0NTM1OUUtNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTExNzU5MDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NTA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjExOCIgYmx1ZT0iMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5MjgwMTY5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzciIGdyZWVuPSIxNDQiIGJsdWU9IjUwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xOTAwMjgwNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xODAzOTIxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTEwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA4Mzc3ODk3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMTc2NDcwNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc1IiBncmVlbj0iNTkiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wMjc1ODg0OSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDYyNzQ1MDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSI4NiIgYmx1ZT0iOTMiIGFscGhhPSI3MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDI5OTk0MzI0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODAzOTIxNiIgYWxwaGFPZmZzZXQ9Ii0xODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2UyNDUwZWQ5LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS40NTQ1NDU0NTQ1NDU0NTQiIHgyPSIxMy42MTM2MzYzNjM2MzYzNjMiIHkxPSIxMS4wMjI3MjcyNzI3MjcyNzMiIHkyPSIxMy4wMDAwMDAwMDAwMDAwMDIiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI0Ljc1MDAwMDAwMDAwMDAwMSIgeDI9IjE0LjI3MjcyNzI3MjcyNzI3NSIgeTE9IjExLjc0OTk5OTk5OTk5OTk5OCIgeTI9IjE0LjA5MDkwOTA5MDkwOTEiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTU0IiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjE2NCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA4Mzc3ODk3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNDUwOTgwMyIgYWxwaGFPZmZzZXQ9Ii05MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDEiIGdyZWVuPSIxMjMiIGJsdWU9IjcyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDE3ODg3NDk1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zMzcyNjY1NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODAiIGdyZWVuPSI3MSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxODAzODIyOCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODQiIGdyZWVuPSI3NSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxNTg0NDE4OSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDI3NDUwOTc5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTUiIGdyZWVuPSI4NiIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxMDI3NDcwMSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTU2ODYyNzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg5IiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA4Mzc3ODk3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIzMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA1MzEwNDEyNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSI4NiIgYmx1ZT0iOTMiIGFscGhhPSI3MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDI5OTk0MzI0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODAzOTIxNiIgYWxwaGFPZmZzZXQ9Ii0xODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2UyNDdiYzc2LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtXaW5kb3dOb3RGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI1LjQ1NDU0NTQ1NDU0NTQ1NCIgeDI9IjEzLjYxMzYzNjM2MzYzNjM2MyIgeTE9IjExLjAyMjcyNzI3MjcyNzI3MyIgeTI9IjEzLjAwMDAwMDAwMDAwMDAwMiIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5OCIgZ3JlZW49IjEwMiIgYmx1ZT0iMTA4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE3OTMzNzI2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjE1Njg2NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC43NTAwMDAwMDAwMDAwMDEiIHgyPSIxNC4yNTAwMDAwMDAwMDAwMDQiIHkxPSIxMS45MzE4MTgxODE4MTgxODIiIHkyPSIxMy40NzcyNzI3MjcyNzI3MjgiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzYiIGdyZWVuPSI4NSIgYmx1ZT0iODciIGFscGhhPSIzOSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDgwODA4MSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTU5MTA0NjkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQwMzkyMTU3IiBhbHBoYU9mZnNldD0iLTIxNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTkiIGdyZWVuPSIyMjEiIGJsdWU9IjIyNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuNTE2MjIxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC45NTY3MzYyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg1IiBncmVlbj0iMTg5IiBibHVlPSIxOTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjUyMjI4MTYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjkyMjkzNTIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODMiIGdyZWVuPSIxODciIGJsdWU9IjE5NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuNTI3MzMyMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuOTE3NTE5MTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTE2MTY3NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODkiIGdyZWVuPSIxOTMiIGJsdWU9IjIwMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuNTI3MzMyMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuOTE5MzU2MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNiIgZ3JlZW49IjE0MSIgYmx1ZT0iMTUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC41MjczMzIxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC44Nzk3MTk4NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTU2ODYyNzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk1IiBncmVlbj0iMTAwIiBibHVlPSIxMTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjUyNzMzMjEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjg0MjY5NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzE3NjQ3MDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIxMS4wIiB5Mj0iMTguMCIgcm91bmRpbmc9IjYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg2IiBibHVlPSI5MyIgYWxwaGE9IjcwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMjk5OTQzMjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM4MDM5MjE2IiBhbHBoYU9mZnNldD0iLTE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZmMyOTQ3MzUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIrV2luZG93Tm90Rm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS40NTQ1NDU0NTQ1NDU0NTQiIHgyPSIxMy42MTM2MzYzNjM2MzYzNjMiIHkxPSIxMS4wMjI3MjcyNzI3MjcyNzMiIHkyPSIxMy4wMDAwMDAwMDAwMDAwMDIiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI0Ljc1MDAwMDAwMDAwMDAwMSIgeDI9IjE0LjI1MDAwMDAwMDAwMDAwNCIgeTE9IjExLjkzMTgxODE4MTgxODE4MiIgeTI9IjEzLjQ3NzI3MjcyNzI3MjcyOCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDQiIGdyZWVuPSI3MSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAyNTc3MjQzNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI5IiBncmVlbj0iMTc1IiBibHVlPSIxMjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItNC40NTYzNDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MDc0NDE5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0OTAxOTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTEiIGdyZWVuPSIxMjAiIGJsdWU9IjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iOS43NDUzNTlFLTYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMTc1OTAxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTEiIGdyZWVuPSIxMTgiIGJsdWU9IjI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTI4MDE2OSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM3IiBncmVlbj0iMTQ0IiBibHVlPSI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTkwMDI4MDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTgwMzkyMTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wODM3Nzg5NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzE3NjQ3MDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3NSIgZ3JlZW49IjU5IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDI3NTg4NDkiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDIwOTQyMzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA2Mjc0NTA5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgzIiBncmVlbj0iODYiIGJsdWU9IjkzIiBhbHBoYT0iNzAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAyOTk5NDMyNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzgwMzkyMTYiIGFscGhhT2Zmc2V0PSItMTg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNlMjQ1MGVkOS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrV2luZG93Tm90Rm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS40NTQ1NDU0NTQ1NDU0NTQiIHgyPSIxMy42MTM2MzYzNjM2MzYzNjMiIHkxPSIxMS4wMjI3MjcyNzI3MjcyNzMiIHkyPSIxMy4wMDAwMDAwMDAwMDAwMDIiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI0Ljc1MDAwMDAwMDAwMDAwMSIgeDI9IjE0LjI3MjcyNzI3MjcyNzI3NSIgeTE9IjExLjc0OTk5OTk5OTk5OTk5OCIgeTI9IjE0LjA5MDkwOTA5MDkwOTEiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTU0IiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjE2NCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA4Mzc3ODk3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNDUwOTgwMyIgYWxwaGFPZmZzZXQ9Ii05MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDEiIGdyZWVuPSIxMjMiIGJsdWU9IjcyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDE3ODg3NDk1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zMzcyNjY1NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODAiIGdyZWVuPSI3MSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxODAzODIyOCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODQiIGdyZWVuPSI3NSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxNTg0NDE4OSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDI3NDUwOTc5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTUiIGdyZWVuPSI4NiIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxMDI3NDcwMSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTU2ODYyNzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg5IiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA4Mzc3ODk3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIzMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA1MzEwNDEyNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSI4NiIgYmx1ZT0iOTMiIGFscGhhPSI3MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDI5OTk0MzI0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODAzOTIxNiIgYWxwaGFPZmZzZXQ9Ii0xODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2UyNDdiYzc2LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIGNvbXBvbmVudE5hbWU9IkludGVybmFsRnJhbWVUaXRsZVBhbmUubWF4aW1pemVCdXR0b24iIHR5cGU9ImphdmF4LnN3aW5nLkpCdXR0b24iIG5hbWU9IkJ1dHRvbiIgdWk9IkJ1dHRvblVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRW5hYmxlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9Ik1vdXNlT3ZlciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlByZXNzZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJEaXNhYmxlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkZvY3VzZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJTZWxlY3RlZCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IldpbmRvd05vdEZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGVTbmlwcGV0PjwhW0NEQVRBWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudCBwYXJlbnQgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSkludGVybmFsRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEpJbnRlcm5hbEZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCgoSkludGVybmFsRnJhbWUpcGFyZW50KS5pc1NlbGVjdGVkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XV0+PC9jb2RlU25pcHBldD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IldpbmRvd01heGltaXplZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZVNuaXBwZXQ+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50IHBhcmVudCA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBKSW50ZXJuYWxGcmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSkludGVybmFsRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoSkludGVybmFsRnJhbWUpcGFyZW50KS5pc01heGltdW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO11dPjwvY29kZVNuaXBwZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGVUeXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjkiIGJvdHRvbT0iOSIgbGVmdD0iOSIgcmlnaHQ9IjkiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQrV2luZG93TWF4aW1pemVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD41PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODYiIGdyZWVuPSIxOTAiIGJsdWU9IjE5OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDk5MjAyNTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDMxMzcyNTQ3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI3LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjcuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iOS4wIiBjcDF4PSIxMy4wIiBjcDF5PSI5LjAiIGNwMng9IjEzLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjkuMCIgY3AxeD0iMTQuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIxMi4wIiBjcDF4PSI4LjAiIGNwMXk9IjEyLjAiIGNwMng9IjguMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMTEuMCIgY3AxeD0iOC4wIiBjcDF5PSIxMS4wIiBjcDJ4PSI4LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjExLjAiIGNwMXg9IjcuMCIgY3AxeT0iMTEuMCIgY3AyeD0iNy4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIxMy4wIiBjcDF4PSI3LjAiIGNwMXk9IjEzLjAiIGNwMng9IjcuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI3LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5OCIgZ3JlZW49IjIwMSIgYmx1ZT0iMjA4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MjQ0OTM5MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNzA1ODgyMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc2IiBncmVlbj0iMTgxIiBibHVlPSIxODkiIGFscGhhPSIyNDIiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwODU0NzAwOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQxNzQzMjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAwMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSItMTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjQuMCIgY3AxeD0iNC4wIiBjcDF5PSI0LjAiIGNwMng9IjQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iNC4wIiBjcDF4PSIxMi4wIiBjcDF5PSI0LjAiIGNwMng9IjEyLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjEwLjAiIGNwMXg9IjEyLjAiIGNwMXk9IjEwLjAiIGNwMng9IjEyLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjEwLjAiIGNwMXg9IjQuMCIgY3AxeT0iMTAuMCIgY3AyeD0iNC4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI2LjAiIGNwMXg9IjQuMCIgY3AxeT0iNi4wIiBjcDJ4PSI0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iNi4wIiBjcDF4PSI1LjAiIGNwMXk9IjYuMCIgY3AyeD0iNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjkuMCIgY3AxeD0iNS4wIiBjcDF5PSI5LjAiIGNwMng9IjUuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iOS4wIiBjcDF4PSIxMS4wIiBjcDF5PSI5LjAiIGNwMng9IjExLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjYuMCIgY3AxeD0iMTEuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjYuMCIgY3AxeD0iNC4wIiBjcDF5PSI2LjAiIGNwMng9IjQuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEwLjcyNzI3MjcyNzI3MjcyNyIgeDI9IjE0Ljk1NDU0NTQ1NDU0NTQ1NyIgeTE9IjcuMzQwOTA5MDkwOTA5MDkxIiB5Mj0iOS40MzE4MTgxODE4MTgxODMiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY2IiBncmVlbj0iMTcwIiBibHVlPSIxNzkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDQ0ODQxOTIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY0ODA0NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iOC4zNDA5MDkwOTA5MDkwOTIiIHgyPSIxNC45NzcyNzI3MjcyNzI3MyIgeTE9IjEyLjk3NzI3MjcyNzI3MjcyNyIgeTI9IjEzLjk3NzI3MjcyNzI3MjcyOCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTMiIGdyZWVuPSIxNTciIGJsdWU9IjE2NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDQ4NDE5MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjQyMzU3MiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDUwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjcuMCIgeDI9IjguMCIgeTE9IjExLjAiIHkyPSIxNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1MyIgZ3JlZW49IjE1OCIgYmx1ZT0iMTY3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjQzNjYwMDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNjgzODEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA0NzA1ODgyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMS45MDkwOTA5MDkwOTA5MDgiIHgyPSIxMi43OTU0NTQ1NDU0NTQ1NDciIHkxPSI3LjAiIHkyPSIxMC45NTQ1NDU0NTQ1NDU0NTUiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY2IiBncmVlbj0iMTcwIiBibHVlPSIxNzkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDQ0ODQxOTIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY0ODA0NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS4wMjI3MjcyNzI3MjcyNzI1IiB4Mj0iMTIuMCIgeTE9IjkuOTc3MjcyNzI3MjcyNzI3IiB5Mj0iMTAuNzk1NDU0NTQ1NDU0NTQ3IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1OCIgZ3JlZW49IjE2MiIgYmx1ZT0iMTcxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjQ0NDg0MTkyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42NDQ2NDciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAzMTM3MjU0NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4yMDQ1NDU0NTQ1NDU0NTQiIHgyPSI1LjEzNjM2MzYzNjM2MzYzNyIgeTE9IjEwLjg4NjM2MzYzNjM2MzYzNyIgeTI9IjYuOTc3MjcyNzI3MjcyNzI3NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTgiIGdyZWVuPSIxNjIiIGJsdWU9IjE3MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDQ4NDE5MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjQ0NjQ3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzEzNzI1NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMTEzNjM2MzYzNjM2MzYzIiB4Mj0iMTIuODE4MTgxODE4MTgxODIyIiB5MT0iNS4wMjI3MjcyNzI3MjcyNzI1IiB5Mj0iNi45NzcyNzI3MjcyNzI3Mjc1IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NSIgZ3JlZW49IjE2OSIgYmx1ZT0iMTc2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjQzNTUxNzkiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY1ODE3MDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODciIGdyZWVuPSIxOTAiIGJsdWU9IjE5NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDA1Njg0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjc0NzUyMDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDY2NjY2NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1NCIgZ3JlZW49IjE1OSIgYmx1ZT0iMTY5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjQ0MDU2ODQ1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzE5MTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAzOTIxNTY4NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg1IiBncmVlbj0iMTg4IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDMzNjI0MDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY3OTIxOTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDU0OTAxOTU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTQiIGdyZWVuPSIxNTkiIGJsdWU9IjE2OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDA1Njg0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjMxOTEzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNmYmVkY2E2Yi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrV2luZG93TWF4aW1pemVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD41PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjIyMiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iNy4wIiBjcDF4PSIxMy4wIiBjcDF5PSI3LjAiIGNwMng9IjEzLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjkuMCIgY3AxeD0iMTMuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI5LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjkuMCIgY3AyeD0iMTQuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTIuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMTIuMCIgY3AxeD0iOC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSI4LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjExLjAiIGNwMXg9IjguMCIgY3AxeT0iMTEuMCIgY3AyeD0iOC4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIxMS4wIiBjcDF4PSI3LjAiIGNwMXk9IjExLjAiIGNwMng9IjcuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMTMuMCIgY3AxeD0iNy4wIiBjcDF5PSIxMy4wIiBjcDJ4PSI3LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxMy4wIiBjcDF4PSIxNS4wIiBjcDF5PSIxMy4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNy4wIiBjcDF4PSIxNS4wIiBjcDF5PSI3LjAiIGNwMng9IjE1LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjQyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii0xMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjQuMCIgY3AxeD0iNC4wIiBjcDF5PSI0LjAiIGNwMng9IjQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iNC4wIiBjcDF4PSIxMi4wIiBjcDF5PSI0LjAiIGNwMng9IjEyLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjEwLjAiIGNwMXg9IjEyLjAiIGNwMXk9IjEwLjAiIGNwMng9IjEyLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjEwLjAiIGNwMXg9IjQuMCIgY3AxeT0iMTAuMCIgY3AyeD0iNC4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI2LjAiIGNwMXg9IjQuMCIgY3AxeT0iNi4wIiBjcDJ4PSI0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iNi4wIiBjcDF4PSI1LjAiIGNwMXk9IjYuMCIgY3AyeD0iNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjkuMCIgY3AxeD0iNS4wIiBjcDF5PSI5LjAiIGNwMng9IjUuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iOS4wIiBjcDF4PSIxMS4wIiBjcDF5PSI5LjAiIGNwMng9IjExLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjYuMCIgY3AxeD0iMTEuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjYuMCIgY3AxeD0iNC4wIiBjcDF5PSI2LjAiIGNwMng9IjQuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEwLjcyNzI3MjcyNzI3MjcyNyIgeDI9IjE0Ljk1NDU0NTQ1NDU0NTQ1NyIgeTE9IjcuMzQwOTA5MDkwOTA5MDkxIiB5Mj0iOS40MzE4MTgxODE4MTgxODMiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTciIGdyZWVuPSI5NSIgYmx1ZT0iMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9Ii0wLjAwODcwNjg5NzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwOTMzMDIxMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzIxNTY4NjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjE1LjA0NTQ1NDU0NTQ1NDU0NSIgeDI9IjE1Ljg2MzYzNjM2MzYzNjM2MyIgeTE9IjEzLjk1NDU0NTQ1NDU0NTQ1NSIgeTI9IjcuNTkwOTA5MDkwOTA5MDkxIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk3IiBncmVlbj0iOTUiIGJsdWU9IjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSItMC4wMDg3MDY4OTc1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDkzMzAyMTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyMTU2ODY0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI4LjM0MDkwOTA5MDkwOTA5MiIgeDI9IjE0Ljk3NzI3MjcyNzI3MjczIiB5MT0iMTIuOTc3MjcyNzI3MjcyNzI3IiB5Mj0iMTMuOTc3MjcyNzI3MjcyNzI4IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk3IiBncmVlbj0iOTUiIGJsdWU9IjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSItMC4wMDg3MDY4OTc1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDkzMzAyMTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyMTU2ODY0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI3LjI1IiB4Mj0iOC4yOTU0NTQ1NDU0NTQ1NDciIHkxPSIxMS4wIiB5Mj0iMTMuOTMxODE4MTgxODE4MTgzIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk3IiBncmVlbj0iOTUiIGJsdWU9IjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSItMC4wMDg3MDY4OTc1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDkzMzAyMTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyMTU2ODY0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMS45MDkwOTA5MDkwOTA5MDgiIHgyPSIxMi43OTU0NTQ1NDU0NTQ1NDciIHkxPSI3LjAiIHkyPSIxMC45NTQ1NDU0NTQ1NDU0NTUiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTciIGdyZWVuPSI5NSIgYmx1ZT0iMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9Ii0wLjAwODcwNjg5NzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwOTMzMDIxMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzIxNTY4NjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjUuMDIyNzI3MjcyNzI3MjcyNSIgeDI9IjEyLjAiIHkxPSI5Ljk3NzI3MjcyNzI3MjcyNyIgeTI9IjEwLjc5NTQ1NDU0NTQ1NDU0NyIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NyIgZ3JlZW49Ijk1IiBibHVlPSIyOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iLTAuMDA4NzA2ODk3NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA5MzMwMjEzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjE1Njg2NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4yMDQ1NDU0NTQ1NDU0NTQiIHgyPSI1LjEzNjM2MzYzNjM2MzYzNyIgeTE9IjEwLjg4NjM2MzYzNjM2MzYzNyIgeTI9IjYuOTc3MjcyNzI3MjcyNzI3NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NyIgZ3JlZW49Ijk1IiBibHVlPSIyOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iLTAuMDA4NzA2ODk3NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA5MzMwMjEzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjE1Njg2NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4xMTM2MzYzNjM2MzYzNjMiIHgyPSIxMi44MTgxODE4MTgxODE4MjIiIHkxPSI1LjAyMjcyNzI3MjcyNzI3MjUiIHkyPSI2Ljk3NzI3MjcyNzI3MjcyNzUiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTciIGdyZWVuPSI5NSIgYmx1ZT0iMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9Ii0wLjAwODcwNjg5NzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwOTMzMDIxMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzIxNTY4NjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTc2IiBibHVlPSIxMTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDI2NDI3MDYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM0NTY3MDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk4IiBncmVlbj0iMTE4IiBibHVlPSI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAyNTM2MzgwMyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNDU0MzEzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzkyMTU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5OSIgZ3JlZW49IjExOSIgYmx1ZT0iNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMjUzNjM4MDMiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjM3MzEyOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjM1Mjk0MTMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyNSIgZ3JlZW49IjE0NSIgYmx1ZT0iMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDI1MzYzODAzIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjA2NTUzNjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMTUiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMTYyNzkwNyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC42NDMxMzczIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5OCIgZ3JlZW49IjExOCIgYmx1ZT0iNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMjUzNjM4MDMiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjQ1NDMxMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjM5MjE1NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgzIiBncmVlbj0iODYiIGJsdWU9IjkzIiBhbHBoYT0iNzAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAyOTk5NDMyNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzgwMzkyMTYiIGFscGhhT2Zmc2V0PSItMTg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNlMWY4OGZjNC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitXaW5kb3dNYXhpbWl6ZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjU8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjIyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii0zMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI3LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjcuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iOS4wIiBjcDF4PSIxMy4wIiBjcDF5PSI5LjAiIGNwMng9IjEzLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjkuMCIgY3AxeD0iMTQuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIxMi4wIiBjcDF4PSI4LjAiIGNwMXk9IjEyLjAiIGNwMng9IjguMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMTEuMCIgY3AxeD0iOC4wIiBjcDF5PSIxMS4wIiBjcDJ4PSI4LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjExLjAiIGNwMXg9IjcuMCIgY3AxeT0iMTEuMCIgY3AyeD0iNy4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIxMy4wIiBjcDF4PSI3LjAiIGNwMXk9IjEzLjAiIGNwMng9IjcuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI3LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNDIiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTEzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNC4wIiBjcDF4PSI0LjAiIGNwMXk9IjQuMCIgY3AyeD0iNC4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSI0LjAiIGNwMXg9IjEyLjAiIGNwMXk9IjQuMCIgY3AyeD0iMTIuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMTAuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMTAuMCIgY3AxeD0iNC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjYuMCIgY3AxeD0iNC4wIiBjcDF5PSI2LjAiIGNwMng9IjQuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI2LjAiIGNwMXg9IjUuMCIgY3AxeT0iNi4wIiBjcDJ4PSI1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iOS4wIiBjcDF4PSI1LjAiIGNwMXk9IjkuMCIgY3AyeD0iNS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI5LjAiIGNwMXg9IjExLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iNi4wIiBjcDF4PSIxMS4wIiBjcDF5PSI2LjAiIGNwMng9IjExLjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNi4wIiBjcDF4PSI0LjAiIGNwMXk9IjYuMCIgY3AyeD0iNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTAuNzI3MjcyNzI3MjcyNzI3IiB4Mj0iMTQuOTU0NTQ1NDU0NTQ1NDU3IiB5MT0iNy4zNDA5MDkwOTA5MDkwOTEiIHkyPSI5LjQzMTgxODE4MTgxODE4MyIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjUiIGdyZWVuPSIxMzYiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDA5NjA0NDA5IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE2ODYyNzQ0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxNS4wNDU0NTQ1NDU0NTQ1NDUiIHgyPSIxNS44NjM2MzYzNjM2MzYzNjMiIHkxPSIxMy45NTQ1NDU0NTQ1NDU0NTUiIHkyPSI3LjU5MDkwOTA5MDkwOTA5MSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjkiIGdyZWVuPSIxNDAiIGJsdWU9IjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDA5NTA2MDE3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI1NzkwMSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTUyOTQxMTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjguMzQwOTA5MDkwOTA5MDkyIiB4Mj0iMTQuOTc3MjcyNzI3MjcyNzMiIHkxPSIxMi45NzcyNzI3MjcyNzI3MjciIHkyPSIxMy45NzcyNzI3MjcyNzI3MjgiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI0IiBncmVlbj0iMTM3IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAxMTkzOTEyMyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNjQ3MDU4NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNy4yNSIgeDI9IjguMjk1NDU0NTQ1NDU0NTQ3IiB5MT0iMTEuMCIgeTI9IjEzLjkzMTgxODE4MTgxODE4MyIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjciIGdyZWVuPSIxNDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDExNjAwMjExIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE1Mjk0MTE3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMS45MDkwOTA5MDkwOTA5MDgiIHgyPSIxMi43OTU0NTQ1NDU0NTQ1NDciIHkxPSI3LjAiIHkyPSIxMC45NTQ1NDU0NTQ1NDU0NTUiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI1IiBncmVlbj0iMTM2IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAwOTYwNDQwOSIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNjg2Mjc0NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS4wMjI3MjcyNzI3MjcyNzI1IiB4Mj0iMTIuMCIgeTE9IjkuOTc3MjcyNzI3MjcyNzI3IiB5Mj0iMTAuNzk1NDU0NTQ1NDU0NTQ3IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExMyIgZ3JlZW49IjEyNiIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMTMzMTk4MDUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjA3ODQzMTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMjA0NTQ1NDU0NTQ1NDU0IiB4Mj0iNS4xMzYzNjM2MzYzNjM2MzciIHkxPSIxMC44ODYzNjM2MzYzNjM2MzciIHkyPSI2Ljk3NzI3MjcyNzI3MjcyNzUiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE3IiBncmVlbj0iMTMwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAxMjc5MDY4IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE5MjE1Njg1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI0LjExMzYzNjM2MzYzNjM2MyIgeDI9IjEyLjgxODE4MTgxODE4MTgyMiIgeTE9IjUuMDIyNzI3MjcyNzI3MjcyNSIgeTI9IjYuOTc3MjcyNzI3MjcyNzI3NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDgiIGdyZWVuPSIxMjIiIGJsdWU9IjAiIGFscGhhPSIyMDYiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDE1MjQ5NzI5IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIyMzUyOTQzIiBhbHBoYU9mZnNldD0iLTQ5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg3IiBncmVlbj0iMTkzIiBibHVlPSIxMjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDA5ODIyNjM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNDI0MzIwNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTQ5MDE5NTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzgiIGdyZWVuPSIxNDkiIGJsdWU9IjIyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAxMDU1OTcwOCIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMzE2Nzg1OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NTA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzOSIgZ3JlZW49IjE1MCIgYmx1ZT0iMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDEwNTU5NzA4IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjEyNTk5NjI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMTM3MjU0OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY1IiBncmVlbj0iMTc2IiBibHVlPSI0OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMTA1NTk3MDgiIHNhdHVyYXRpb25PZmZzZXQ9IjkuMjA1MzQxM0UtNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMTkiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMTYyNzkwNyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC42Mjc0NTEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU5IiBncmVlbj0iODQiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDQ1NzI3MjEiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzcyNTQ5MDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIxMS4wIiB5Mj0iMTguMCIgcm91bmRpbmc9IjYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg2IiBibHVlPSI5MyIgYWxwaGE9IjcwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMjk5OTQzMjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM4MDM5MjE2IiBhbHBoYU9mZnNldD0iLTE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZmJmM2ViOGMucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkK1dpbmRvd01heGltaXplZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NTwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyMjIiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTMzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjcuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI5LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTMuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iOS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI5LjAiIGNwMng9IjE0LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjEyLjAiIGNwMXg9IjguMCIgY3AxeT0iMTIuMCIgY3AyeD0iOC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIxMS4wIiBjcDF4PSI4LjAiIGNwMXk9IjExLjAiIGNwMng9IjguMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMTEuMCIgY3AxeD0iNy4wIiBjcDF5PSIxMS4wIiBjcDJ4PSI3LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjEzLjAiIGNwMXg9IjcuMCIgY3AxeT0iMTMuMCIgY3AyeD0iNy4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTMuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjcuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI0MiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI0LjAiIGNwMXg9IjQuMCIgY3AxeT0iNC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjQuMCIgY3AxeD0iMTIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIxMC4wIiBjcDF4PSIxMi4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIxMC4wIiBjcDF4PSI0LjAiIGNwMXk9IjEwLjAiIGNwMng9IjQuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNi4wIiBjcDF4PSI0LjAiIGNwMXk9IjYuMCIgY3AyeD0iNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjYuMCIgY3AxeD0iNS4wIiBjcDF5PSI2LjAiIGNwMng9IjUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI5LjAiIGNwMXg9IjUuMCIgY3AxeT0iOS4wIiBjcDJ4PSI1LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjkuMCIgY3AxeD0iMTEuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI2LjAiIGNwMXg9IjExLjAiIGNwMXk9IjYuMCIgY3AyeD0iMTEuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI2LjAiIGNwMXg9IjQuMCIgY3AxeT0iNi4wIiBjcDJ4PSI0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMC43MjcyNzI3MjcyNzI3MjciIHgyPSIxNC45NTQ1NDU0NTQ1NDU0NTciIHkxPSI3LjM0MDkwOTA5MDkwOTA5MSIgeTI9IjkuNDMxODE4MTgxODE4MTgzIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQ1IiBncmVlbj0iNzEiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDU3MTU2ODc2IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQyMzUyOTQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxNS4wNDU0NTQ1NDU0NTQ1NDUiIHgyPSIxNS44NjM2MzYzNjM2MzYzNjMiIHkxPSIxMy45NTQ1NDU0NTQ1NDU0NTUiIHkyPSI3LjU5MDkwOTA5MDkwOTA5MSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NSIgZ3JlZW49IjgwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA0ODIwNzM1OCIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODgyMzUzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI4LjM0MDkwOTA5MDkwOTA5MiIgeDI9IjE0Ljk3NzI3MjcyNzI3MjczIiB5MT0iMTIuOTc3MjcyNzI3MjcyNzI3IiB5Mj0iMTMuOTc3MjcyNzI3MjcyNzI4IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQxIiBncmVlbj0iNjkiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDYzNzU2ODUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDMxMzcyNTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjcuMCIgeDI9IjguMCIgeTE9IjExLjAiIHkyPSIxNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQyIiBncmVlbj0iNzEiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDY0MTk5MTIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDIzNTI5NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjExLjkwOTA5MDkwOTA5MDkwOCIgeDI9IjEyLjc5NTQ1NDU0NTQ1NDU0NyIgeTE9IjcuMCIgeTI9IjEwLjk1NDU0NTQ1NDU0NTQ1NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MSIgZ3JlZW49IjY3IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA2MDgwMDYyNyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40MzkyMTU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI1LjAyMjcyNzI3MjcyNzI3MjUiIHgyPSIxMi4wIiB5MT0iOS45NzcyNzI3MjcyNzI3MjciIHkyPSIxMC43OTU0NTQ1NDU0NTQ1NDciIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzYiIGdyZWVuPSI2MyIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wNjc1NTI2IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ1NDkwMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4yMDQ1NDU0NTQ1NDU0NTQiIHgyPSI1LjEzNjM2MzYzNjM2MzYzNyIgeTE9IjEwLjg4NjM2MzYzNjM2MzYzNyIgeTI9IjYuOTc3MjcyNzI3MjcyNzI3NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzOCIgZ3JlZW49IjY1IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA2NTM1NDc4IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ0NzA1ODgzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI0LjExMzYzNjM2MzYzNjM2MyIgeDI9IjEyLjgxODE4MTgxODE4MTgyMiIgeTE9IjUuMDIyNzI3MjcyNzI3MjcyNSIgeTI9IjYuOTc3MjcyNzI3MjcyNzI3NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOSIgZ3JlZW49IjQ4IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA5NjgxODQ5IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUxMzcyNTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIzIiBncmVlbj0iMTM5IiBibHVlPSI3MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMzU5MjUwMyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjM4NjU2MDEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzQiIGdyZWVuPSI5NiIgYmx1ZT0iNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMzU5NzkxMDciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjM3NjYyOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyNTQ5MDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NTA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjcxIiBncmVlbj0iOTQiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDM2OTA0MTciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzMzMzMzMzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyNSIgZ3JlZW49IjE0NSIgYmx1ZT0iMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDI1MzYzODAzIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjA2NTUzNjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iLTAuMTcwNTQyNjQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjcyMDY3MDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjcwMTk2MDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjMwIiBncmVlbj0iNTkiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDc4MDQ0OTIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDcwNTg4MjciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIxMS4wIiB5Mj0iMTguMCIgcm91bmRpbmc9IjYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg2IiBibHVlPSI5MyIgYWxwaGE9IjcwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMjk5OTQzMjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM4MDM5MjE2IiBhbHBoYU9mZnNldD0iLTE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZmJmYWYyY2YucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK1dpbmRvd05vdEZvY3VzZWQrV2luZG93TWF4aW1pemVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD41PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDAiIGdyZWVuPSIxMDMiIGJsdWU9IjEwOSIgYWxwaGE9IjIyMiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjc5NTc1MDYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMxNzY0NzA3IiBhbHBoYU9mZnNldD0iLTMzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjcuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI5LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTMuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iOS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI5LjAiIGNwMng9IjE0LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjEyLjAiIGNwMXg9IjguMCIgY3AxeT0iMTIuMCIgY3AyeD0iOC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIxMS4wIiBjcDF4PSI4LjAiIGNwMXk9IjExLjAiIGNwMng9IjguMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMTEuMCIgY3AxeD0iNy4wIiBjcDF5PSIxMS4wIiBjcDJ4PSI3LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjEzLjAiIGNwMXg9IjcuMCIgY3AxeT0iMTMuMCIgY3AyeD0iNy4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTMuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjcuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDIiIGdyZWVuPSIxMDUiIGJsdWU9IjExMSIgYWxwaGE9IjI0MiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjk0NDUyMzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMwOTgwMzkzIiBhbHBoYU9mZnNldD0iLTEzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNC4wIiBjcDF4PSI0LjAiIGNwMXk9IjQuMCIgY3AyeD0iNC4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSI0LjAiIGNwMXg9IjEyLjAiIGNwMXk9IjQuMCIgY3AyeD0iMTIuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMTAuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMTAuMCIgY3AxeD0iNC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjYuMCIgY3AxeD0iNC4wIiBjcDF5PSI2LjAiIGNwMng9IjQuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI2LjAiIGNwMXg9IjUuMCIgY3AxeT0iNi4wIiBjcDJ4PSI1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iOS4wIiBjcDF4PSI1LjAiIGNwMXk9IjkuMCIgY3AyeD0iNS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI5LjAiIGNwMXg9IjExLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iNi4wIiBjcDF4PSIxMS4wIiBjcDF5PSI2LjAiIGNwMng9IjExLjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNi4wIiBjcDF4PSI0LjAiIGNwMXk9IjYuMCIgY3AyeD0iNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTAuNzI3MjcyNzI3MjcyNzI3IiB4Mj0iMTQuOTU0NTQ1NDU0NTQ1NDU3IiB5MT0iNy4zNDA5MDkwOTA5MDkwOTEiIHkyPSI5LjQzMTgxODE4MTgxODE4MyIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODUiIGdyZWVuPSIxODkiIGJsdWU9IjE5NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40MzU1MTc5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42NjQ1NDgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDY2NjY2NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjExLjkwOTA5MDkwOTA5MDkwOCIgeDI9IjEyLjc5NTQ1NDU0NTQ1NDU0NyIgeTE9IjcuMCIgeTI9IjEwLjk1NDU0NTQ1NDU0NTQ1NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODEiIGdyZWVuPSIxODUiIGJsdWU9IjE5MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40MzU1MTc5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42NjMzNzg3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI1LjAyMjcyNzI3MjcyNzI3MjUiIHgyPSIxMi4wIiB5MT0iOS45NzcyNzI3MjcyNzI3MjciIHkyPSIxMC43OTU0NTQ1NDU0NTQ1NDciIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc5IiBncmVlbj0iMTgzIiBibHVlPSIxOTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDQwNTY4NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY1Nzg0MzIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDQ3MDU4ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE5IiBncmVlbj0iMjIxIiBibHVlPSIyMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDI5NDU3MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjk4MzQ5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE3NjQ3MDU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg4IiBncmVlbj0iMTkxIiBibHVlPSIxOTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDUwNjY5NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY2NTM5NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY1MDU2ODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgzIiBncmVlbj0iMTg3IiBibHVlPSIxOTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDQwNTY4NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY1OTEzMTk0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2Mjc0NTA5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg5IiBncmVlbj0iMTkzIiBibHVlPSIyMDEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDQwNTY4NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY2MDk2ODkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDg2Mjc0NTA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzYiIGdyZWVuPSIxNDEiIGJsdWU9IjE1MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDA1Njg0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjIxMzMyNjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEwOTgwMzkxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTUiIGdyZWVuPSIxMDAiIGJsdWU9IjExMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDA1Njg0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTg0MzA2OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjcwNTg4MjUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNmYmZlMWFiMS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitXaW5kb3dOb3RGb2N1c2VkK1dpbmRvd01heGltaXplZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NTwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyMjIiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTMzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjcuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI5LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTMuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iOS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI5LjAiIGNwMng9IjE0LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjAiIHk9IjEyLjAiIGNwMXg9IjguMCIgY3AxeT0iMTIuMCIgY3AyeD0iOC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIxMS4wIiBjcDF4PSI4LjAiIGNwMXk9IjExLjAiIGNwMng9IjguMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMTEuMCIgY3AxeD0iNy4wIiBjcDF5PSIxMS4wIiBjcDJ4PSI3LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjEzLjAiIGNwMXg9IjcuMCIgY3AxeT0iMTMuMCIgY3AyeD0iNy4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTMuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjcuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI0MiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI0LjAiIGNwMXg9IjQuMCIgY3AxeT0iNC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjQuMCIgY3AxeD0iMTIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIxMC4wIiBjcDF4PSIxMi4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIxMC4wIiBjcDF4PSI0LjAiIGNwMXk9IjEwLjAiIGNwMng9IjQuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNi4wIiBjcDF4PSI0LjAiIGNwMXk9IjYuMCIgY3AyeD0iNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjYuMCIgY3AxeD0iNS4wIiBjcDF5PSI2LjAiIGNwMng9IjUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI5LjAiIGNwMXg9IjUuMCIgY3AxeT0iOS4wIiBjcDJ4PSI1LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjkuMCIgY3AxeD0iMTEuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI2LjAiIGNwMXg9IjExLjAiIGNwMXk9IjYuMCIgY3AyeD0iMTEuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI2LjAiIGNwMXg9IjQuMCIgY3AxeT0iNi4wIiBjcDJ4PSI0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMC43MjcyNzI3MjcyNzI3MjciIHgyPSIxNC45NTQ1NDU0NTQ1NDU0NTciIHkxPSI3LjM0MDkwOTA5MDkwOTA5MSIgeTI9IjkuNDMxODE4MTgxODE4MTgzIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyNSIgZ3JlZW49IjEzNiIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMDk2MDQ0MDkiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTY4NjI3NDQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjE1LjA0NTQ1NDU0NTQ1NDU0NSIgeDI9IjE1Ljg2MzYzNjM2MzYzNjM2MyIgeTE9IjEzLjk1NDU0NTQ1NDU0NTQ1NSIgeTI9IjcuNTkwOTA5MDkwOTA5MDkxIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyOSIgZ3JlZW49IjE0MCIgYmx1ZT0iMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMDk1MDYwMTciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjU3OTAxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNTI5NDExNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iOC4zNDA5MDkwOTA5MDkwOTIiIHgyPSIxNC45NzcyNzI3MjcyNzI3MyIgeTE9IjEyLjk3NzI3MjcyNzI3MjcyNyIgeTI9IjEzLjk3NzI3MjcyNzI3MjcyOCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjQiIGdyZWVuPSIxMzciIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDExOTM5MTIzIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE2NDcwNTg3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI3LjI1IiB4Mj0iOC4yOTU0NTQ1NDU0NTQ1NDciIHkxPSIxMS4wIiB5Mj0iMTMuOTMxODE4MTgxODE4MTgzIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyNyIgZ3JlZW49IjE0MCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMTE2MDAyMTEiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTUyOTQxMTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjExLjkwOTA5MDkwOTA5MDkwOCIgeDI9IjEyLjc5NTQ1NDU0NTQ1NDU0NyIgeTE9IjcuMCIgeTI9IjEwLjk1NDU0NTQ1NDU0NTQ1NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjUiIGdyZWVuPSIxMzYiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDA5NjA0NDA5IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE2ODYyNzQ0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI1LjAyMjcyNzI3MjcyNzI3MjUiIHgyPSIxMi4wIiB5MT0iOS45NzcyNzI3MjcyNzI3MjciIHkyPSIxMC43OTU0NTQ1NDU0NTQ1NDciIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTEzIiBncmVlbj0iMTI2IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAxMzMxOTgwNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMDc4NDMxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4yMDQ1NDU0NTQ1NDU0NTQiIHgyPSI1LjEzNjM2MzYzNjM2MzYzNyIgeTE9IjEwLjg4NjM2MzYzNjM2MzYzNyIgeTI9IjYuOTc3MjcyNzI3MjcyNzI3NSIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTciIGdyZWVuPSIxMzAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDEyNzkwNjgiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTkyMTU2ODUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMTEzNjM2MzYzNjM2MzYzIiB4Mj0iMTIuODE4MTgxODE4MTgxODIyIiB5MT0iNS4wMjI3MjcyNzI3MjcyNzI1IiB5Mj0iNi45NzcyNzI3MjcyNzI3Mjc1IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwOCIgZ3JlZW49IjEyMiIgYmx1ZT0iMCIgYWxwaGE9IjIwNiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMTUyNDk3MjkiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjIzNTI5NDMiIGFscGhhT2Zmc2V0PSItNDkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODciIGdyZWVuPSIxOTMiIGJsdWU9IjEyMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMDk4MjI2MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM0MjQzMjA1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1NDkwMTk1OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzOCIgZ3JlZW49IjE0OSIgYmx1ZT0iMjIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDEwNTU5NzA4IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjEzMTY3ODU4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY1MDU2ODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM5IiBncmVlbj0iMTUwIiBibHVlPSIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMTA1NTk3MDgiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTI1OTk2MjkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjUiIGdyZWVuPSIxNzYiIGJsdWU9IjQ5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAxMDU1OTcwOCIgc2F0dXJhdGlvbk9mZnNldD0iOS4yMDUzNDEzRS00IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIxOSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4xNjI3OTA3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjYyNzQ1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTkiIGdyZWVuPSI4NCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wNDU3MjcyMSIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNzI1NDkwMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgzIiBncmVlbj0iODYiIGJsdWU9IjkzIiBhbHBoYT0iNzAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAyOTk5NDMyNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzgwMzkyMTYiIGFscGhhT2Zmc2V0PSItMTg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNmYmYzZWI4Yy5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrV2luZG93Tm90Rm9jdXNlZCtXaW5kb3dNYXhpbWl6ZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjU8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjIyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii0zMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI3LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjcuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iOS4wIiBjcDF4PSIxMy4wIiBjcDF5PSI5LjAiIGNwMng9IjEzLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjkuMCIgY3AxeD0iMTQuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIxMi4wIiBjcDF4PSI4LjAiIGNwMXk9IjEyLjAiIGNwMng9IjguMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMTEuMCIgY3AxeD0iOC4wIiBjcDF5PSIxMS4wIiBjcDJ4PSI4LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjExLjAiIGNwMXg9IjcuMCIgY3AxeT0iMTEuMCIgY3AyeD0iNy4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIxMy4wIiBjcDF4PSI3LjAiIGNwMXk9IjEzLjAiIGNwMng9IjcuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI3LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNDIiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTEzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNC4wIiBjcDF4PSI0LjAiIGNwMXk9IjQuMCIgY3AyeD0iNC4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSI0LjAiIGNwMXg9IjEyLjAiIGNwMXk9IjQuMCIgY3AyeD0iMTIuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMTAuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMTAuMCIgY3AxeD0iNC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjYuMCIgY3AxeD0iNC4wIiBjcDF5PSI2LjAiIGNwMng9IjQuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI2LjAiIGNwMXg9IjUuMCIgY3AxeT0iNi4wIiBjcDJ4PSI1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iOS4wIiBjcDF4PSI1LjAiIGNwMXk9IjkuMCIgY3AyeD0iNS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI5LjAiIGNwMXg9IjExLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iNi4wIiBjcDF4PSIxMS4wIiBjcDF5PSI2LjAiIGNwMng9IjExLjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNi4wIiBjcDF4PSI0LjAiIGNwMXk9IjYuMCIgY3AyeD0iNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTAuNzI3MjcyNzI3MjcyNzI3IiB4Mj0iMTQuOTU0NTQ1NDU0NTQ1NDU3IiB5MT0iNy4zNDA5MDkwOTA5MDkwOTEiIHkyPSI5LjQzMTgxODE4MTgxODE4MyIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0NSIgZ3JlZW49IjcxIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA1NzE1Njg3NiIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40MjM1Mjk0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTUuMDQ1NDU0NTQ1NDU0NTQ1IiB4Mj0iMTUuODYzNjM2MzYzNjM2MzYzIiB5MT0iMTMuOTU0NTQ1NDU0NTQ1NDU1IiB5Mj0iNy41OTA5MDkwOTA5MDkwOTEiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTUiIGdyZWVuPSI4MCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wNDgyMDczNTgiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzg4MjM1MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iOC4zNDA5MDkwOTA5MDkwOTIiIHgyPSIxNC45NzcyNzI3MjcyNzI3MyIgeTE9IjEyLjk3NzI3MjcyNzI3MjcyNyIgeTI9IjEzLjk3NzI3MjcyNzI3MjcyOCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MSIgZ3JlZW49IjY5IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA2Mzc1Njg1IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQzMTM3MjU1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI3LjAiIHgyPSI4LjAiIHkxPSIxMS4wIiB5Mj0iMTQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MiIgZ3JlZW49IjcxIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA2NDE5OTEyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQyMzUyOTQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMS45MDkwOTA5MDkwOTA5MDgiIHgyPSIxMi43OTU0NTQ1NDU0NTQ1NDciIHkxPSI3LjAiIHkyPSIxMC45NTQ1NDU0NTQ1NDU0NTUiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDEiIGdyZWVuPSI2NyIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wNjA4MDA2MjciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDM5MjE1NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNS4wMjI3MjcyNzI3MjcyNzI1IiB4Mj0iMTIuMCIgeTE9IjkuOTc3MjcyNzI3MjcyNzI3IiB5Mj0iMTAuNzk1NDU0NTQ1NDU0NTQ3IiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjM2IiBncmVlbj0iNjMiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDY3NTUyNiIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NTQ5MDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjQuMjA0NTQ1NDU0NTQ1NDU0IiB4Mj0iNS4xMzYzNjM2MzYzNjM2MzciIHkxPSIxMC44ODYzNjM2MzYzNjM2MzciIHkyPSI2Ljk3NzI3MjcyNzI3MjcyNzUiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzgiIGdyZWVuPSI2NSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wNjUzNTQ3OCIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NDcwNTg4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4xMTM2MzYzNjM2MzYzNjMiIHgyPSIxMi44MTgxODE4MTgxODE4MjIiIHkxPSI1LjAyMjcyNzI3MjcyNzI3MjUiIHkyPSI2Ljk3NzI3MjcyNzI3MjcyNzUiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkiIGdyZWVuPSI0OCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wOTY4MTg0OSIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC41MTM3MjU1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE4LjAiIHkxPSIxLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iNi43NDk5OTk5OTk5OTk5OTMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMyIgZ3JlZW49IjEzOSIgYmx1ZT0iNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDM1OTI1MDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIzODY1NjAxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNTY4NjI3NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc0IiBncmVlbj0iOTYiIGJsdWU9IjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDM1OTc5MTA3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIzNzY2MjkxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjU0OTAyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MSIgZ3JlZW49Ijk0IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAzNjkwNDE3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMzMzMzMzM0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjUiIGdyZWVuPSIxNDUiIGJsdWU9IjMxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAyNTM2MzgwMyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wNjU1MzY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMzMzMzMzMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9Ii0wLjE3MDU0MjY0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43MjA2NzA0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC43MDE5NjA4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzMCIgZ3JlZW49IjU5IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA3ODA0NDkyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ3MDU4ODI3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSI4NiIgYmx1ZT0iOTMiIGFscGhhPSI3MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDI5OTk0MzI0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODAzOTIxNiIgYWxwaGFPZmZzZXQ9Ii0xODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZiZmFmMmNmLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjY8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjYwNDc5MDMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk1IiBncmVlbj0iMTk5IiBibHVlPSIyMDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNTA1MDU0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTcxMjgyNTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDYyNzQ1MDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzIiIGdyZWVuPSIxNzciIGJsdWU9IjE4NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDAzOTY4MjM5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzUyNTc0OTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxNTY4NjI3NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjQuMCIgY3AxeD0iNC4wIiBjcDF5PSI0LjAiIGNwMng9IjQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIxMy4wIiBjcDF4PSI0LjAiIGNwMXk9IjEzLjAiIGNwMng9IjQuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI2LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjYuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNi4wIiBjcDF4PSIxNC4wIiBjcDF5PSI2LjAiIGNwMng9IjE0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjEyLjAiIGNwMXg9IjUuMCIgY3AxeT0iMTIuMCIgY3AyeD0iNS4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI2LjAiIGNwMXg9IjUuMCIgY3AxeT0iNi4wIiBjcDJ4PSI1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjYuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI0LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY1IiBncmVlbj0iMTY5IiBibHVlPSIxNzYiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy42MzYzNjM2MzYzNjM2MzYiIHk9IjUuMjUiIGNwMXg9IjMuNjM2MzYzNjM2MzYzNjM2IiBjcDF5PSI1LjI1IiBjcDJ4PSIzLjYzNjM2MzYzNjM2MzYzNiIgY3AyeT0iNS4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNjU5MDkwOTA5MDkwOTA4MyIgeT0iMTMuNDMxODE4MTgxODE4MTg1IiBjcDF4PSIzLjY1OTA5MDkwOTA5MDkwODMiIGNwMXk9IjEzLjQzMTgxODE4MTgxODE4NSIgY3AyeD0iMy42NTkwOTA5MDkwOTA5MDgzIiBjcDJ5PSIxMy40MzE4MTgxODE4MTgxODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS41MDAwMDAwMDAwMDAwMDQiIHk9IjEzLjQwOTA5MDkwOTA5MDkxIiBjcDF4PSIxNS41MDAwMDAwMDAwMDAwMDQiIGNwMXk9IjEzLjQwOTA5MDkwOTA5MDkxIiBjcDJ4PSIxNS41MDAwMDAwMDAwMDAwMDQiIGNwMnk9IjEzLjQwOTA5MDkwOTA5MDkxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuNTY4MTgxODE4MTgxODIiIHk9IjUuMjUiIGNwMXg9IjE1LjU2ODE4MTgxODE4MTgyIiBjcDF5PSI1LjI1IiBjcDJ4PSIxNS41NjgxODE4MTgxODE4MiIgY3AyeT0iNS4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjcyNzI3MjcyNzI3MjcyNSIgeT0iNS4yNSIgY3AxeD0iMTMuNzI3MjcyNzI3MjcyNzI1IiBjcDF5PSI1LjI1IiBjcDJ4PSIxMy43MjcyNzI3MjcyNzI3MjUiIGNwMnk9IjUuMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy45MDkwOTA5MDkwOTA5MSIgeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3IiBjcDF4PSIxMy45MDkwOTA5MDkwOTA5MSIgY3AxeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3IiBjcDJ4PSIxMy45MDkwOTA5MDkwOTA5MSIgY3AyeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4zMTgxODE4MTgxODE4MTgiIHk9IjExLjgxODE4MTgxODE4MTgyIiBjcDF4PSI1LjMxODE4MTgxODE4MTgxOCIgY3AxeT0iMTEuODE4MTgxODE4MTgxODIiIGNwMng9IjUuMzE4MTgxODE4MTgxODE4IiBjcDJ5PSIxMS44MTgxODE4MTgxODE4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNDA5MDkwOTA5MDkwOTA5IiB5PSI2Ljk1NDU0NTQ1NDU0NTQ1NCIgY3AxeD0iNS40MDkwOTA5MDkwOTA5MDkiIGNwMXk9IjYuOTU0NTQ1NDU0NTQ1NDU0IiBjcDJ4PSI1LjQwOTA5MDkwOTA5MDkwOSIgY3AyeT0iNi45NTQ1NDU0NTQ1NDU0NTQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIHk9IjYuOTMxODE4MTgxODE4MTgxIiBjcDF4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIGNwMXk9IjYuOTMxODE4MTgxODE4MTgxIiBjcDJ4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIGNwMnk9IjYuOTMxODE4MTgxODE4MTgxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuNzI3MjcyNzI3MjcyNzM0IiB5PSI1LjIyNzI3MjcyNzI3MjcyNzUiIGNwMXg9IjEzLjcyNzI3MjcyNzI3MjczNCIgY3AxeT0iNS4yMjcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSIxMy43MjcyNzI3MjcyNzI3MzQiIGNwMnk9IjUuMjI3MjcyNzI3MjcyNzI3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg3IiBncmVlbj0iMTkwIiBibHVlPSIxOTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDQwNTY4NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY3NDc1MjA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTY5IiBibHVlPSIxNzciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDMyMDIxNDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY0NzIyNDA3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NzY2NDY3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1OCIgZ3JlZW49IjE2MyIgYmx1ZT0iMTczIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjQ0MDU2ODQ1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzM5NjUyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTU0IiBncmVlbj0iMTU5IiBibHVlPSIxNjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuNDQwNTY4NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzMTkxMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDM5MjE1Njg0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODUiIGdyZWVuPSIxODgiIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40MzM2MjQwMyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjc5MjE5NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTQ5MDE5NTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1NCIgZ3JlZW49IjE1OSIgYmx1ZT0iMTY5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjQ0MDU2ODQ1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzE5MTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAzOTIxNTY4NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZjMDY0OGZiLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjQuMCIgY3AxeD0iNC4wIiBjcDF5PSI0LjAiIGNwMng9IjQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIxMy4wIiBjcDF4PSI0LjAiIGNwMXk9IjEzLjAiIGNwMng9IjQuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI2LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjYuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNi4wIiBjcDF4PSIxNC4wIiBjcDF5PSI2LjAiIGNwMng9IjE0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjEyLjAiIGNwMXg9IjUuMCIgY3AxeT0iMTIuMCIgY3AyeD0iNS4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI2LjAiIGNwMXg9IjUuMCIgY3AxeT0iNi4wIiBjcDJ4PSI1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjYuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI0LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjQiIGdyZWVuPSI4OCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjYzNjM2MzYzNjM2MzYzNiIgeT0iNS4yNSIgY3AxeD0iMy42MzYzNjM2MzYzNjM2MzYiIGNwMXk9IjUuMjUiIGNwMng9IjMuNjM2MzYzNjM2MzYzNjM2IiBjcDJ5PSI1LjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy42NTkwOTA5MDkwOTA5MDgzIiB5PSIxMy40MzE4MTgxODE4MTgxODUiIGNwMXg9IjMuNjU5MDkwOTA5MDkwOTA4MyIgY3AxeT0iMTMuNDMxODE4MTgxODE4MTg1IiBjcDJ4PSIzLjY1OTA5MDkwOTA5MDkwODMiIGNwMnk9IjEzLjQzMTgxODE4MTgxODE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjUwMDAwMDAwMDAwMDAwNCIgeT0iMTMuNDA5MDkwOTA5MDkwOTEiIGNwMXg9IjE1LjUwMDAwMDAwMDAwMDAwNCIgY3AxeT0iMTMuNDA5MDkwOTA5MDkwOTEiIGNwMng9IjE1LjUwMDAwMDAwMDAwMDAwNCIgY3AyeT0iMTMuNDA5MDkwOTA5MDkwOTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS41NjgxODE4MTgxODE4MiIgeT0iNS4yNSIgY3AxeD0iMTUuNTY4MTgxODE4MTgxODIiIGNwMXk9IjUuMjUiIGNwMng9IjE1LjU2ODE4MTgxODE4MTgyIiBjcDJ5PSI1LjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuNzI3MjcyNzI3MjcyNzI1IiB5PSI1LjI1IiBjcDF4PSIxMy43MjcyNzI3MjcyNzI3MjUiIGNwMXk9IjUuMjUiIGNwMng9IjEzLjcyNzI3MjcyNzI3MjcyNSIgY3AyeT0iNS4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjkwOTA5MDkwOTA5MDkxIiB5PSIxMi4wNDU0NTQ1NDU0NTQ1NDciIGNwMXg9IjEzLjkwOTA5MDkwOTA5MDkxIiBjcDF5PSIxMi4wNDU0NTQ1NDU0NTQ1NDciIGNwMng9IjEzLjkwOTA5MDkwOTA5MDkxIiBjcDJ5PSIxMi4wNDU0NTQ1NDU0NTQ1NDciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjMxODE4MTgxODE4MTgxOCIgeT0iMTEuODE4MTgxODE4MTgxODIiIGNwMXg9IjUuMzE4MTgxODE4MTgxODE4IiBjcDF5PSIxMS44MTgxODE4MTgxODE4MiIgY3AyeD0iNS4zMTgxODE4MTgxODE4MTgiIGNwMnk9IjExLjgxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS40MDkwOTA5MDkwOTA5MDkiIHk9IjYuOTU0NTQ1NDU0NTQ1NDU0IiBjcDF4PSI1LjQwOTA5MDkwOTA5MDkwOSIgY3AxeT0iNi45NTQ1NDU0NTQ1NDU0NTQiIGNwMng9IjUuNDA5MDkwOTA5MDkwOTA5IiBjcDJ5PSI2Ljk1NDU0NTQ1NDU0NTQ1NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjc5NTQ1NDU0NTQ1NDU0MyIgeT0iNi45MzE4MTgxODE4MTgxODEiIGNwMXg9IjEzLjc5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iNi45MzE4MTgxODE4MTgxODEiIGNwMng9IjEzLjc5NTQ1NDU0NTQ1NDU0MyIgY3AyeT0iNi45MzE4MTgxODE4MTgxODEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy43MjcyNzI3MjcyNzI3MzQiIHk9IjUuMjI3MjcyNzI3MjcyNzI3NSIgY3AxeD0iMTMuNzI3MjcyNzI3MjcyNzM0IiBjcDF5PSI1LjIyNzI3MjcyNzI3MjcyNzUiIGNwMng9IjEzLjcyNzI3MjcyNzI3MjczNCIgY3AyeT0iNS4yMjcyNzI3MjcyNzI3Mjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNzYiIGJsdWU9IjExMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMjY0MjcwNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzQ1NjcwNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTgiIGdyZWVuPSIxMTgiIGJsdWU9IjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDI1MzYzODAzIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI0NTQzMTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzOTIxNTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NTA1NjgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk5IiBncmVlbj0iMTE5IiBibHVlPSI1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAyNTM2MzgwMyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yMzczMTI4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzUyOTQxMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI1IiBncmVlbj0iMTQ1IiBibHVlPSIzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMjUzNjM4MDMiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDY1NTM2NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIxNSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4xNjI3OTA3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjY0MzEzNzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk4IiBncmVlbj0iMTE4IiBibHVlPSI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAyNTM2MzgwMyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNDU0MzEzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzkyMTU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSI4NiIgYmx1ZT0iOTMiIGFscGhhPSI3MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDI5OTk0MzI0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODAzOTIxNiIgYWxwaGFPZmZzZXQ9Ii0xODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2UxZmViYTA1LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD42PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciA1Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNC4wIiBjcDF4PSI0LjAiIGNwMXk9IjQuMCIgY3AyeD0iNC4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjEzLjAiIGNwMXg9IjQuMCIgY3AxeT0iMTMuMCIgY3AyeD0iNC4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTMuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjYuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI2LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjYuMCIgY3AyeD0iMTQuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTIuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMTIuMCIgY3AxeD0iNS4wIiBjcDF5PSIxMi4wIiBjcDJ4PSI1LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjYuMCIgY3AxeD0iNS4wIiBjcDF5PSI2LjAiIGNwMng9IjUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNi4wIiBjcDF4PSIxNS4wIiBjcDF5PSI2LjAiIGNwMng9IjE1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjQuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNC4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTMiIGdyZWVuPSIxMjUiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy42MzYzNjM2MzYzNjM2MzYiIHk9IjUuMjUiIGNwMXg9IjMuNjM2MzYzNjM2MzYzNjM2IiBjcDF5PSI1LjI1IiBjcDJ4PSIzLjYzNjM2MzYzNjM2MzYzNiIgY3AyeT0iNS4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNjU5MDkwOTA5MDkwOTA4MyIgeT0iMTMuNDMxODE4MTgxODE4MTg1IiBjcDF4PSIzLjY1OTA5MDkwOTA5MDkwODMiIGNwMXk9IjEzLjQzMTgxODE4MTgxODE4NSIgY3AyeD0iMy42NTkwOTA5MDkwOTA5MDgzIiBjcDJ5PSIxMy40MzE4MTgxODE4MTgxODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS41MDAwMDAwMDAwMDAwMDQiIHk9IjEzLjQwOTA5MDkwOTA5MDkxIiBjcDF4PSIxNS41MDAwMDAwMDAwMDAwMDQiIGNwMXk9IjEzLjQwOTA5MDkwOTA5MDkxIiBjcDJ4PSIxNS41MDAwMDAwMDAwMDAwMDQiIGNwMnk9IjEzLjQwOTA5MDkwOTA5MDkxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuNTY4MTgxODE4MTgxODIiIHk9IjUuMjUiIGNwMXg9IjE1LjU2ODE4MTgxODE4MTgyIiBjcDF5PSI1LjI1IiBjcDJ4PSIxNS41NjgxODE4MTgxODE4MiIgY3AyeT0iNS4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjcyNzI3MjcyNzI3MjcyNSIgeT0iNS4yNSIgY3AxeD0iMTMuNzI3MjcyNzI3MjcyNzI1IiBjcDF5PSI1LjI1IiBjcDJ4PSIxMy43MjcyNzI3MjcyNzI3MjUiIGNwMnk9IjUuMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy45MDkwOTA5MDkwOTA5MSIgeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3IiBjcDF4PSIxMy45MDkwOTA5MDkwOTA5MSIgY3AxeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3IiBjcDJ4PSIxMy45MDkwOTA5MDkwOTA5MSIgY3AyeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4zMTgxODE4MTgxODE4MTgiIHk9IjExLjgxODE4MTgxODE4MTgyIiBjcDF4PSI1LjMxODE4MTgxODE4MTgxOCIgY3AxeT0iMTEuODE4MTgxODE4MTgxODIiIGNwMng9IjUuMzE4MTgxODE4MTgxODE4IiBjcDJ5PSIxMS44MTgxODE4MTgxODE4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNDA5MDkwOTA5MDkwOTA5IiB5PSI2Ljk1NDU0NTQ1NDU0NTQ1NCIgY3AxeD0iNS40MDkwOTA5MDkwOTA5MDkiIGNwMXk9IjYuOTU0NTQ1NDU0NTQ1NDU0IiBjcDJ4PSI1LjQwOTA5MDkwOTA5MDkwOSIgY3AyeT0iNi45NTQ1NDU0NTQ1NDU0NTQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIHk9IjYuOTMxODE4MTgxODE4MTgxIiBjcDF4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIGNwMXk9IjYuOTMxODE4MTgxODE4MTgxIiBjcDJ4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIGNwMnk9IjYuOTMxODE4MTgxODE4MTgxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuNzI3MjcyNzI3MjcyNzM0IiB5PSI1LjIyNzI3MjcyNzI3MjcyNzUiIGNwMXg9IjEzLjcyNzI3MjcyNzI3MjczNCIgY3AxeT0iNS4yMjcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSIxMy43MjcyNzI3MjcyNzI3MzQiIGNwMnk9IjUuMjI3MjcyNzI3MjcyNzI3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg3IiBncmVlbj0iMTkzIiBibHVlPSIxMjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDA5ODIyNjM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNDI0MzIwNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTQ5MDE5NTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDEiIGdyZWVuPSIxNTEiIGJsdWU9IjI3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAwOTU2NDg3NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMDA1MjE2MjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEwOTgwMzkxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY1MDU2ODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM4IiBncmVlbj0iMTQ5IiBibHVlPSIyMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMTA1NTk3MDgiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTMxNjc4NTgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjUiIGdyZWVuPSIxNzYiIGJsdWU9IjQ5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAxMDU1OTcwOCIgc2F0dXJhdGlvbk9mZnNldD0iOS4yMDUzNDEzRS00IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIxOSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4xNjI3OTA3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjYyNzQ1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTkiIGdyZWVuPSI4NCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wNDU3MjcyMSIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNzI1NDkwMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjIxMSIgYmx1ZT0iMjI3IiBhbHBoYT0iMTU0IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNDgzMDg5NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA5MjA0NzMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ1MDk4MDMiIGFscGhhT2Zmc2V0PSItMTAxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNmYzBjNmJlMy5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjY8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI0LjAiIGNwMXg9IjQuMCIgY3AxeT0iNC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMTMuMCIgY3AxeD0iNC4wIiBjcDF5PSIxMy4wIiBjcDJ4PSI0LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxMy4wIiBjcDF4PSIxNS4wIiBjcDF5PSIxMy4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNi4wIiBjcDF4PSIxNS4wIiBjcDF5PSI2LjAiIGNwMng9IjE1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjYuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIxMi4wIiBjcDF4PSI1LjAiIGNwMXk9IjEyLjAiIGNwMng9IjUuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iNi4wIiBjcDF4PSI1LjAiIGNwMXk9IjYuMCIgY3AyeD0iNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI2LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjYuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNC4wIiBjcDF4PSIxNS4wIiBjcDF5PSI0LjAiIGNwMng9IjE1LjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5IiBncmVlbj0iNDgiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy42MzYzNjM2MzYzNjM2MzYiIHk9IjUuMjUiIGNwMXg9IjMuNjM2MzYzNjM2MzYzNjM2IiBjcDF5PSI1LjI1IiBjcDJ4PSIzLjYzNjM2MzYzNjM2MzYzNiIgY3AyeT0iNS4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNjU5MDkwOTA5MDkwOTA4MyIgeT0iMTMuNDMxODE4MTgxODE4MTg1IiBjcDF4PSIzLjY1OTA5MDkwOTA5MDkwODMiIGNwMXk9IjEzLjQzMTgxODE4MTgxODE4NSIgY3AyeD0iMy42NTkwOTA5MDkwOTA5MDgzIiBjcDJ5PSIxMy40MzE4MTgxODE4MTgxODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS41MDAwMDAwMDAwMDAwMDQiIHk9IjEzLjQwOTA5MDkwOTA5MDkxIiBjcDF4PSIxNS41MDAwMDAwMDAwMDAwMDQiIGNwMXk9IjEzLjQwOTA5MDkwOTA5MDkxIiBjcDJ4PSIxNS41MDAwMDAwMDAwMDAwMDQiIGNwMnk9IjEzLjQwOTA5MDkwOTA5MDkxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuNTY4MTgxODE4MTgxODIiIHk9IjUuMjUiIGNwMXg9IjE1LjU2ODE4MTgxODE4MTgyIiBjcDF5PSI1LjI1IiBjcDJ4PSIxNS41NjgxODE4MTgxODE4MiIgY3AyeT0iNS4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjcyNzI3MjcyNzI3MjcyNSIgeT0iNS4yNSIgY3AxeD0iMTMuNzI3MjcyNzI3MjcyNzI1IiBjcDF5PSI1LjI1IiBjcDJ4PSIxMy43MjcyNzI3MjcyNzI3MjUiIGNwMnk9IjUuMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy45MDkwOTA5MDkwOTA5MSIgeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3IiBjcDF4PSIxMy45MDkwOTA5MDkwOTA5MSIgY3AxeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3IiBjcDJ4PSIxMy45MDkwOTA5MDkwOTA5MSIgY3AyeT0iMTIuMDQ1NDU0NTQ1NDU0NTQ3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4zMTgxODE4MTgxODE4MTgiIHk9IjExLjgxODE4MTgxODE4MTgyIiBjcDF4PSI1LjMxODE4MTgxODE4MTgxOCIgY3AxeT0iMTEuODE4MTgxODE4MTgxODIiIGNwMng9IjUuMzE4MTgxODE4MTgxODE4IiBjcDJ5PSIxMS44MTgxODE4MTgxODE4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNDA5MDkwOTA5MDkwOTA5IiB5PSI2Ljk1NDU0NTQ1NDU0NTQ1NCIgY3AxeD0iNS40MDkwOTA5MDkwOTA5MDkiIGNwMXk9IjYuOTU0NTQ1NDU0NTQ1NDU0IiBjcDJ4PSI1LjQwOTA5MDkwOTA5MDkwOSIgY3AyeT0iNi45NTQ1NDU0NTQ1NDU0NTQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIHk9IjYuOTMxODE4MTgxODE4MTgxIiBjcDF4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIGNwMXk9IjYuOTMxODE4MTgxODE4MTgxIiBjcDJ4PSIxMy43OTU0NTQ1NDU0NTQ1NDMiIGNwMnk9IjYuOTMxODE4MTgxODE4MTgxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuNzI3MjcyNzI3MjcyNzM0IiB5PSI1LjIyNzI3MjcyNzI3MjcyNzUiIGNwMXg9IjEzLjcyNzI3MjcyNzI3MjczNCIgY3AxeT0iNS4yMjcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSIxMy43MjcyNzI3MjcyNzI3MzQiIGNwMnk9IjUuMjI3MjcyNzI3MjcyNzI3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjEuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSI2Ljc0OTk5OTk5OTk5OTk5MyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIzIiBncmVlbj0iMTM5IiBibHVlPSI3MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMzU5MjUwMyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjM4NjU2MDEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzQiIGdyZWVuPSI5NiIgYmx1ZT0iNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMzU5NzkxMDciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjM3NjYyOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMyNTQ5MDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43OTM0MTMxNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MSIgZ3JlZW49Ijk0IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAzNjkwNDE3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMzMzMzMzM0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NiIgZ3JlZW49IjEwOSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMzEyOTIyMyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNzQ1MDk4MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9Ii0wLjE3MDU0MjY0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43MjA2NzA0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC43MDE5NjA4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzMCIgZ3JlZW49IjU5IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA3ODA0NDkyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ3MDU4ODI3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkwIiBncmVlbj0iMTk3IiBibHVlPSIyMTIiIGFscGhhPSIxOTAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDAyNTI1MjEwNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDA2NzUyNzI5NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wODYyNzQ1MDUiIGFscGhhT2Zmc2V0PSItNjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZjMTAxN2M5LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtXaW5kb3dOb3RGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD42PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciA1Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDIiIGdyZWVuPSIxMDUiIGJsdWU9IjExMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjk0NDUyMzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMwOTgwMzkzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjQuMCIgY3AxeD0iNC4wIiBjcDF5PSI0LjAiIGNwMng9IjQuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIxMy4wIiBjcDF4PSI0LjAiIGNwMXk9IjEzLjAiIGNwMng9IjQuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI2LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjYuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNi4wIiBjcDF4PSIxNC4wIiBjcDF5PSI2LjAiIGNwMng9IjE0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEyLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjEyLjAiIGNwMXg9IjUuMCIgY3AxeT0iMTIuMCIgY3AyeD0iNS4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSI2LjAiIGNwMXg9IjUuMCIgY3AxeT0iNi4wIiBjcDJ4PSI1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjYuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI0LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTkiIGdyZWVuPSIyMjEiIGJsdWU9IjIyNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40Mjk0NTczIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42OTgzNDkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTc2NDcwNTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODMiIGdyZWVuPSIxODciIGJsdWU9IjE5NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDA1Njg0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjU5MTMxOTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDYyNzQ1MDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzE4NTYyOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODMiIGdyZWVuPSIxODciIGJsdWU9IjE5NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDA1Njg0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjU5MTMxOTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDYyNzQ1MDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODkiIGdyZWVuPSIxOTMiIGJsdWU9IjIwMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC40NDA1Njg0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjYwOTY4OSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wODYyNzQ1MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNiIgZ3JlZW49IjE0MSIgYmx1ZT0iMTUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjQ0MDU2ODQ1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MjEzMzI2NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NSIgZ3JlZW49IjEwMCIgYmx1ZT0iMTEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjQ0MDU2ODQ1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41ODQzMDY4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNzA1ODgyNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZjMTJlNGNiLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK1dpbmRvd05vdEZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjY8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSI0LjAiIGNwMXg9IjQuMCIgY3AxeT0iNC4wIiBjcDJ4PSI0LjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iMTMuMCIgY3AxeD0iNC4wIiBjcDF5PSIxMy4wIiBjcDJ4PSI0LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxMy4wIiBjcDF4PSIxNS4wIiBjcDF5PSIxMy4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNi4wIiBjcDF4PSIxNS4wIiBjcDF5PSI2LjAiIGNwMng9IjE1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjYuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIxMi4wIiBjcDF4PSI1LjAiIGNwMXk9IjEyLjAiIGNwMng9IjUuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iNi4wIiBjcDF4PSI1LjAiIGNwMXk9IjYuMCIgY3AyeD0iNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI2LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjYuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNC4wIiBjcDF4PSIxNS4wIiBjcDF5PSI0LjAiIGNwMng9IjE1LjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExMyIgZ3JlZW49IjEyNSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjYzNjM2MzYzNjM2MzYzNiIgeT0iNS4yNSIgY3AxeD0iMy42MzYzNjM2MzYzNjM2MzYiIGNwMXk9IjUuMjUiIGNwMng9IjMuNjM2MzYzNjM2MzYzNjM2IiBjcDJ5PSI1LjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy42NTkwOTA5MDkwOTA5MDgzIiB5PSIxMy40MzE4MTgxODE4MTgxODUiIGNwMXg9IjMuNjU5MDkwOTA5MDkwOTA4MyIgY3AxeT0iMTMuNDMxODE4MTgxODE4MTg1IiBjcDJ4PSIzLjY1OTA5MDkwOTA5MDkwODMiIGNwMnk9IjEzLjQzMTgxODE4MTgxODE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjUwMDAwMDAwMDAwMDAwNCIgeT0iMTMuNDA5MDkwOTA5MDkwOTEiIGNwMXg9IjE1LjUwMDAwMDAwMDAwMDAwNCIgY3AxeT0iMTMuNDA5MDkwOTA5MDkwOTEiIGNwMng9IjE1LjUwMDAwMDAwMDAwMDAwNCIgY3AyeT0iMTMuNDA5MDkwOTA5MDkwOTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS41NjgxODE4MTgxODE4MiIgeT0iNS4yNSIgY3AxeD0iMTUuNTY4MTgxODE4MTgxODIiIGNwMXk9IjUuMjUiIGNwMng9IjE1LjU2ODE4MTgxODE4MTgyIiBjcDJ5PSI1LjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuNzI3MjcyNzI3MjcyNzI1IiB5PSI1LjI1IiBjcDF4PSIxMy43MjcyNzI3MjcyNzI3MjUiIGNwMXk9IjUuMjUiIGNwMng9IjEzLjcyNzI3MjcyNzI3MjcyNSIgY3AyeT0iNS4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjkwOTA5MDkwOTA5MDkxIiB5PSIxMi4wNDU0NTQ1NDU0NTQ1NDciIGNwMXg9IjEzLjkwOTA5MDkwOTA5MDkxIiBjcDF5PSIxMi4wNDU0NTQ1NDU0NTQ1NDciIGNwMng9IjEzLjkwOTA5MDkwOTA5MDkxIiBjcDJ5PSIxMi4wNDU0NTQ1NDU0NTQ1NDciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjMxODE4MTgxODE4MTgxOCIgeT0iMTEuODE4MTgxODE4MTgxODIiIGNwMXg9IjUuMzE4MTgxODE4MTgxODE4IiBjcDF5PSIxMS44MTgxODE4MTgxODE4MiIgY3AyeD0iNS4zMTgxODE4MTgxODE4MTgiIGNwMnk9IjExLjgxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS40MDkwOTA5MDkwOTA5MDkiIHk9IjYuOTU0NTQ1NDU0NTQ1NDU0IiBjcDF4PSI1LjQwOTA5MDkwOTA5MDkwOSIgY3AxeT0iNi45NTQ1NDU0NTQ1NDU0NTQiIGNwMng9IjUuNDA5MDkwOTA5MDkwOTA5IiBjcDJ5PSI2Ljk1NDU0NTQ1NDU0NTQ1NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjc5NTQ1NDU0NTQ1NDU0MyIgeT0iNi45MzE4MTgxODE4MTgxODEiIGNwMXg9IjEzLjc5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iNi45MzE4MTgxODE4MTgxODEiIGNwMng9IjEzLjc5NTQ1NDU0NTQ1NDU0MyIgY3AyeT0iNi45MzE4MTgxODE4MTgxODEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy43MjcyNzI3MjcyNzI3MzQiIHk9IjUuMjI3MjcyNzI3MjcyNzI3NSIgY3AxeD0iMTMuNzI3MjcyNzI3MjcyNzM0IiBjcDF5PSI1LjIyNzI3MjcyNzI3MjcyNzUiIGNwMng9IjEzLjcyNzI3MjcyNzI3MjczNCIgY3AyeT0iNS4yMjcyNzI3MjcyNzI3Mjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODciIGdyZWVuPSIxOTMiIGJsdWU9IjEyMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMDk4MjI2MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM0MjQzMjA1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1NDkwMTk1OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MSIgZ3JlZW49IjE1MSIgYmx1ZT0iMjciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDA5NTY0ODc3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjEwMDUyMTYyNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzgiIGdyZWVuPSIxNDkiIGJsdWU9IjIyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjAxMDU1OTcwOCIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMzE2Nzg1OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NSIgZ3JlZW49IjE3NiIgYmx1ZT0iNDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDEwNTU5NzA4IiBzYXR1cmF0aW9uT2Zmc2V0PSI5LjIwNTM0MTNFLTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjE5IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjE2Mjc5MDciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNjI3NDUxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1OSIgZ3JlZW49Ijg0IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSIwLjA0NTcyNzIxIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI3OTMyOTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM3MjU0OTAzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNDg2ODQyMTA1MjYzMTU3OSIgeTE9IjAuMDAxNDcwNTg4MjM1Mjk0MTE3NiIgeDI9IjAuMjQ4Njg0MjEwNTI2MzE1OCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMTEuMCIgeTI9IjE4LjAiIHJvdW5kaW5nPSI2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjExIiBibHVlPSIyMjciIGFscGhhPSIxNTQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA0ODMwODk3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDkyMDQ3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNDUwOTgwMyIgYWxwaGFPZmZzZXQ9Ii0xMDEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZjMGM2YmUzLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtXaW5kb3dOb3RGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD42PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciA1Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNC4wIiBjcDF4PSI0LjAiIGNwMXk9IjQuMCIgY3AyeD0iNC4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjEzLjAiIGNwMXg9IjQuMCIgY3AxeT0iMTMuMCIgY3AyeD0iNC4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTMuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjYuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI2LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjYuMCIgY3AyeD0iMTQuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTIuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMTIuMCIgY3AxeD0iNS4wIiBjcDF5PSIxMi4wIiBjcDJ4PSI1LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjYuMCIgY3AxeD0iNS4wIiBjcDF5PSI2LjAiIGNwMng9IjUuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNi4wIiBjcDF4PSIxNS4wIiBjcDF5PSI2LjAiIGNwMng9IjE1LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjQuMCIgY3AxeD0iMTUuMCIgY3AxeT0iNC4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOSIgZ3JlZW49IjQ4IiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNjM2MzYzNjM2MzYzNjM2IiB5PSI1LjI1IiBjcDF4PSIzLjYzNjM2MzYzNjM2MzYzNiIgY3AxeT0iNS4yNSIgY3AyeD0iMy42MzYzNjM2MzYzNjM2MzYiIGNwMnk9IjUuMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjY1OTA5MDkwOTA5MDkwODMiIHk9IjEzLjQzMTgxODE4MTgxODE4NSIgY3AxeD0iMy42NTkwOTA5MDkwOTA5MDgzIiBjcDF5PSIxMy40MzE4MTgxODE4MTgxODUiIGNwMng9IjMuNjU5MDkwOTA5MDkwOTA4MyIgY3AyeT0iMTMuNDMxODE4MTgxODE4MTg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuNTAwMDAwMDAwMDAwMDA0IiB5PSIxMy40MDkwOTA5MDkwOTA5MSIgY3AxeD0iMTUuNTAwMDAwMDAwMDAwMDA0IiBjcDF5PSIxMy40MDkwOTA5MDkwOTA5MSIgY3AyeD0iMTUuNTAwMDAwMDAwMDAwMDA0IiBjcDJ5PSIxMy40MDkwOTA5MDkwOTA5MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjU2ODE4MTgxODE4MTgyIiB5PSI1LjI1IiBjcDF4PSIxNS41NjgxODE4MTgxODE4MiIgY3AxeT0iNS4yNSIgY3AyeD0iMTUuNTY4MTgxODE4MTgxODIiIGNwMnk9IjUuMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy43MjcyNzI3MjcyNzI3MjUiIHk9IjUuMjUiIGNwMXg9IjEzLjcyNzI3MjcyNzI3MjcyNSIgY3AxeT0iNS4yNSIgY3AyeD0iMTMuNzI3MjcyNzI3MjcyNzI1IiBjcDJ5PSI1LjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuOTA5MDkwOTA5MDkwOTEiIHk9IjEyLjA0NTQ1NDU0NTQ1NDU0NyIgY3AxeD0iMTMuOTA5MDkwOTA5MDkwOTEiIGNwMXk9IjEyLjA0NTQ1NDU0NTQ1NDU0NyIgY3AyeD0iMTMuOTA5MDkwOTA5MDkwOTEiIGNwMnk9IjEyLjA0NTQ1NDU0NTQ1NDU0NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMzE4MTgxODE4MTgxODE4IiB5PSIxMS44MTgxODE4MTgxODE4MiIgY3AxeD0iNS4zMTgxODE4MTgxODE4MTgiIGNwMXk9IjExLjgxODE4MTgxODE4MTgyIiBjcDJ4PSI1LjMxODE4MTgxODE4MTgxOCIgY3AyeT0iMTEuODE4MTgxODE4MTgxODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjQwOTA5MDkwOTA5MDkwOSIgeT0iNi45NTQ1NDU0NTQ1NDU0NTQiIGNwMXg9IjUuNDA5MDkwOTA5MDkwOTA5IiBjcDF5PSI2Ljk1NDU0NTQ1NDU0NTQ1NCIgY3AyeD0iNS40MDkwOTA5MDkwOTA5MDkiIGNwMnk9IjYuOTU0NTQ1NDU0NTQ1NDU0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuNzk1NDU0NTQ1NDU0NTQzIiB5PSI2LjkzMTgxODE4MTgxODE4MSIgY3AxeD0iMTMuNzk1NDU0NTQ1NDU0NTQzIiBjcDF5PSI2LjkzMTgxODE4MTgxODE4MSIgY3AyeD0iMTMuNzk1NDU0NTQ1NDU0NTQzIiBjcDJ5PSI2LjkzMTgxODE4MTgxODE4MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjcyNzI3MjcyNzI3MjczNCIgeT0iNS4yMjcyNzI3MjcyNzI3Mjc1IiBjcDF4PSIxMy43MjcyNzI3MjcyNzI3MzQiIGNwMXk9IjUuMjI3MjcyNzI3MjcyNzI3NSIgY3AyeD0iMTMuNzI3MjcyNzI3MjcyNzM0IiBjcDJ5PSI1LjIyNzI3MjcyNzI3MjcyNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE4LjAiIHkxPSIxLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iNi43NDk5OTk5OTk5OTk5OTMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMyIgZ3JlZW49IjEzOSIgYmx1ZT0iNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDM1OTI1MDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIzODY1NjAxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNTY4NjI3NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc0IiBncmVlbj0iOTYiIGJsdWU9IjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDM1OTc5MTA3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIzNzY2MjkxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMjU0OTAyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzkzNDEzMTYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzEiIGdyZWVuPSI5NCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wMzY5MDQxNyIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMzMzMzMzNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODYiIGdyZWVuPSIxMDkiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0dyZWVuIiBodWVPZmZzZXQ9IjAuMDMxMjkyMjMiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjc5MzI5NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjc0NTA5ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNHcmVlbiIgaHVlT2Zmc2V0PSItMC4xNzA1NDI2NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzIwNjcwNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzAxOTYwOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzAiIGdyZWVuPSI1OSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzR3JlZW4iIGh1ZU9mZnNldD0iMC4wNzgwNDQ5MiIgc2F0dXJhdGlvbk9mZnNldD0iMC4yNzkzMjk2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NzA1ODgyNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MCIgZ3JlZW49IjE5NyIgYmx1ZT0iMjEyIiBhbHBoYT0iMTkwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwMjUyNTIxMDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwNjc1MjcyOTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDg2Mjc0NTA1IiBhbHBoYU9mZnNldD0iLTY1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNmYzEwMTdjOS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgICAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiBjb21wb25lbnROYW1lPSJJbnRlcm5hbEZyYW1lVGl0bGVQYW5lLmNsb3NlQnV0dG9uIiB0eXBlPSJqYXZheC5zd2luZy5KQnV0dG9uIiBuYW1lPSJCdXR0b24iIHVpPSJCdXR0b25VSSIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkVuYWJsZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJNb3VzZU92ZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJQcmVzc2VkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRGlzYWJsZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJGb2N1c2VkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iU2VsZWN0ZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJXaW5kb3dOb3RGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlU25pcHBldD48IVtDREFUQVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgcGFyZW50ID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50LmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEpJbnRlcm5hbEZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBKSW50ZXJuYWxGcmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISgoKEpJbnRlcm5hbEZyYW1lKXBhcmVudCkuaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO11dPjwvY29kZVNuaXBwZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGVUeXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjkiIGJvdHRvbT0iOSIgbGVmdD0iOSIgcmlnaHQ9IjkiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5OCIgZ3JlZW49IjIwMSIgYmx1ZT0iMjA4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MjQ0OTM5MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNzA1ODgyMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC44ODYzNjM2MzYzNjM2MzgiIHk9IjUuMDkwOTA5MDkwOTA5MDkiIGNwMXg9IjQuODg2MzYzNjM2MzYzNjM4IiBjcDF5PSI1LjA5MDkwOTA5MDkwOTA5IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzOCIgY3AyeT0iNS4wOTA5MDkwOTA5MDkwOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMTEzNjM2MzYzNjM2MzYyIiB5PSIzLjg0MDkwOTA5MDkwOTA5IiBjcDF4PSI2LjExMzYzNjM2MzYzNjM2MiIgY3AxeT0iMy44NDA5MDkwOTA5MDkwOSIgY3AyeD0iNi4xMTM2MzYzNjM2MzYzNjIiIGNwMnk9IjMuODQwOTA5MDkwOTA5MDkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjUiIHk9IjcuMjcyNzI3MjcyNzI3Mjc1IiBjcDF4PSI5LjUiIGNwMXk9IjcuMjcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSI5LjUiIGNwMnk9IjcuMjcyNzI3MjcyNzI3Mjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuNzk1NDU0NTQ1NDU0NTQxIiB5PSIzLjc5NTQ1NDU0NTQ1NDU0MzYiIGNwMXg9IjEyLjc5NTQ1NDU0NTQ1NDU0MSIgY3AxeT0iMy43OTU0NTQ1NDU0NTQ1NDM2IiBjcDJ4PSIxMi43OTU0NTQ1NDU0NTQ1NDEiIGNwMnk9IjMuNzk1NDU0NTQ1NDU0NTQzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjEzNjM2MzYzNjM2MzY0IiB5PSI1LjEzNjM2MzYzNjM2MzYzNSIgY3AxeD0iMTQuMTM2MzYzNjM2MzYzNjQiIGNwMXk9IjUuMTM2MzYzNjM2MzYzNjM1IiBjcDJ4PSIxNC4xMzYzNjM2MzYzNjM2NCIgY3AyeT0iNS4xMzYzNjM2MzYzNjM2MzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC43NzI3MjcyNzI3MjcyNzkiIHk9IjguNDc3MjcyNzI3MjcyNzI4IiBjcDF4PSIxMC43NzI3MjcyNzI3MjcyNzkiIGNwMXk9IjguNDc3MjcyNzI3MjcyNzI4IiBjcDJ4PSIxMC43NzI3MjcyNzI3MjcyNzkiIGNwMnk9IjguNDc3MjcyNzI3MjcyNzI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMjI3MjcyNzI3MjcyNzMyIiB5PSIxMS43NDk5OTk5OTk5OTk5OTYiIGNwMXg9IjE0LjIyNzI3MjcyNzI3MjczMiIgY3AxeT0iMTEuNzQ5OTk5OTk5OTk5OTk2IiBjcDJ4PSIxNC4yMjcyNzI3MjcyNzI3MzIiIGNwMnk9IjExLjc0OTk5OTk5OTk5OTk5NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgeT0iMTMuMzE4MTgxODE4MTgxODIiIGNwMXg9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iMTMuMzE4MTgxODE4MTgxODIiIGNwMng9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgY3AyeT0iMTMuMzE4MTgxODE4MTgxODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjQ3NzI3MjcyNzI3MjcyNSIgeT0iOS43NDk5OTk5OTk5OTk5OTMiIGNwMXg9IjkuNDc3MjcyNzI3MjcyNzI1IiBjcDF5PSI5Ljc0OTk5OTk5OTk5OTk5MyIgY3AyeD0iOS40NzcyNzI3MjcyNzI3MjUiIGNwMnk9IjkuNzQ5OTk5OTk5OTk5OTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yOTU0NTQ1NDU0NTQ1NDMiIHk9IjEzLjM2MzYzNjM2MzYzNjM3IiBjcDF4PSI2LjI5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iMTMuMzYzNjM2MzYzNjM2MzciIGNwMng9IjYuMjk1NDU0NTQ1NDU0NTQzIiBjcDJ5PSIxMy4zNjM2MzYzNjM2MzYzNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuNzk1NDU0NTQ1NDU0NTQ4IiB5PSIxMS44MTgxODE4MTgxODE4MTMiIGNwMXg9IjQuNzk1NDU0NTQ1NDU0NTQ4IiBjcDF5PSIxMS44MTgxODE4MTgxODE4MTMiIGNwMng9IjQuNzk1NDU0NTQ1NDU0NTQ4IiBjcDJ5PSIxMS44MTgxODE4MTgxODE4MTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjI5NTQ1NDU0NTQ1NDU0MSIgeT0iOC40OTk5OTk5OTk5OTk5OTgiIGNwMXg9IjguMjk1NDU0NTQ1NDU0NTQxIiBjcDF5PSI4LjQ5OTk5OTk5OTk5OTk5OCIgY3AyeD0iOC4yOTU0NTQ1NDU0NTQ1NDEiIGNwMnk9IjguNDk5OTk5OTk5OTk5OTk4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTUyIiBncmVlbj0iMTU2IiBibHVlPSIxNjUiIGFscGhhPSIxMzMiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSIwLjYwMDU2OTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjcyMDAyODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxNTY4NjI3NCIgYWxwaGFPZmZzZXQ9Ii0xMjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC43NDk5OTk5OTk5OTk5OTgiIHk9IjEzLjI3MjcyNzI3MjcyNzI4IiBjcDF4PSI0Ljc0OTk5OTk5OTk5OTk5OCIgY3AxeT0iMTMuMjcyNzI3MjcyNzI3MjgiIGNwMng9IjQuNzQ5OTk5OTk5OTk5OTk4IiBjcDJ5PSIxMy4yNzI3MjcyNzI3MjcyOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiB5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMXg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDF5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMng9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjU5MDkwOTA5MDkwOTA5NSIgeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDF4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AxeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDJ4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AyeT0iMTAuNjM2MzYzNjM2MzYzNjQ0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMDAwMDAwMDAwMDAwMDA1IiB5PSIxNC4zMTgxODE4MTgxODE4MjUiIGNwMXg9IjEzLjAwMDAwMDAwMDAwMDAwNSIgY3AxeT0iMTQuMzE4MTgxODE4MTgxODI1IiBjcDJ4PSIxMy4wMDAwMDAwMDAwMDAwMDUiIGNwMnk9IjE0LjMxODE4MTgxODE4MTgyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjQzMTgxODE4MTgxODE4NSIgeT0iMTIuOTU0NTQ1NDU0NTQ1NDYyIiBjcDF4PSIxNC40MzE4MTgxODE4MTgxODUiIGNwMXk9IjEyLjk1NDU0NTQ1NDU0NTQ2MiIgY3AyeD0iMTQuNDMxODE4MTgxODE4MTg1IiBjcDJ5PSIxMi45NTQ1NDU0NTQ1NDU0NjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4zMTgxODE4MTgxODE4MjIiIHk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDF4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMXk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDJ4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMnk9IjkuNDMxODE4MTgxODE4MTg5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMzE4MTgxODE4MTgxODIyIiB5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AxeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDF5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AyeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDJ5PSI2LjEzNjM2MzYzNjM2MzYzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjk3NzI3MjcyNzI3MjczMiIgeT0iNC41NjgxODE4MTgxODE4MTc1IiBjcDF4PSIxMi45NzcyNzI3MjcyNzI3MzIiIGNwMXk9IjQuNTY4MTgxODE4MTgxODE3NSIgY3AyeD0iMTIuOTc3MjcyNzI3MjcyNzMyIiBjcDJ5PSI0LjU2ODE4MTgxODE4MTgxNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjY1OTA5MDkwOTA5MDkxMiIgeT0iNy45MzE4MTgxODE4MTgxODIiIGNwMXg9IjkuNjU5MDkwOTA5MDkwOTEyIiBjcDF5PSI3LjkzMTgxODE4MTgxODE4MiIgY3AyeD0iOS42NTkwOTA5MDkwOTA5MTIiIGNwMnk9IjcuOTMxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yNzI3MjcyNzI3MjcyNzIiIHk9IjQuNjEzNjM2MzYzNjM2MzYzIiBjcDF4PSI2LjI3MjcyNzI3MjcyNzI3MiIgY3AxeT0iNC42MTM2MzYzNjM2MzYzNjMiIGNwMng9IjYuMjcyNzI3MjcyNzI3MjcyIiBjcDJ5PSI0LjYxMzYzNjM2MzYzNjM2MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuODg2MzYzNjM2MzYzNjM1IiB5PSI1Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeD0iNC44ODYzNjM2MzYzNjM2MzUiIGNwMXk9IjUuOTc3MjcyNzI3MjcyNzI3IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzNSIgY3AyeT0iNS45NzcyNzI3MjcyNzI3MjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjExMzYzNjM2MzYzNjM2NSIgeT0iOS40NTQ1NDU0NTQ1NDU0NjciIGNwMXg9IjguMTEzNjM2MzYzNjM2MzY1IiBjcDF5PSI5LjQ1NDU0NTQ1NDU0NTQ2NyIgY3AyeD0iOC4xMTM2MzYzNjM2MzYzNjUiIGNwMnk9IjkuNDU0NTQ1NDU0NTQ1NDY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg1IiBncmVlbj0iMTg4IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSIwLjU4OTM1MTkiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjc1NzM2NTc2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA5NDExNzY0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTQiIGdyZWVuPSIxNTkiIGJsdWU9IjE2OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9IjAuNTk2Mjk2MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzEwMDU5MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZjMmNiNjYxLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTkiIGhlaWdodD0iMTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0Ljg4NjM2MzYzNjM2MzYzOCIgeT0iNS4wOTA5MDkwOTA5MDkwOSIgY3AxeD0iNC44ODYzNjM2MzYzNjM2MzgiIGNwMXk9IjUuMDkwOTA5MDkwOTA5MDkiIGNwMng9IjQuODg2MzYzNjM2MzYzNjM4IiBjcDJ5PSI1LjA5MDkwOTA5MDkwOTA5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4xMTM2MzYzNjM2MzYzNjIiIHk9IjMuODQwOTA5MDkwOTA5MDkiIGNwMXg9IjYuMTEzNjM2MzYzNjM2MzYyIiBjcDF5PSIzLjg0MDkwOTA5MDkwOTA5IiBjcDJ4PSI2LjExMzYzNjM2MzYzNjM2MiIgY3AyeT0iMy44NDA5MDkwOTA5MDkwOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNSIgeT0iNy4yNzI3MjcyNzI3MjcyNzUiIGNwMXg9IjkuNSIgY3AxeT0iNy4yNzI3MjcyNzI3MjcyNzUiIGNwMng9IjkuNSIgY3AyeT0iNy4yNzI3MjcyNzI3MjcyNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi43OTU0NTQ1NDU0NTQ1NDEiIHk9IjMuNzk1NDU0NTQ1NDU0NTQzNiIgY3AxeD0iMTIuNzk1NDU0NTQ1NDU0NTQxIiBjcDF5PSIzLjc5NTQ1NDU0NTQ1NDU0MzYiIGNwMng9IjEyLjc5NTQ1NDU0NTQ1NDU0MSIgY3AyeT0iMy43OTU0NTQ1NDU0NTQ1NDM2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMTM2MzYzNjM2MzYzNjQiIHk9IjUuMTM2MzYzNjM2MzYzNjM1IiBjcDF4PSIxNC4xMzYzNjM2MzYzNjM2NCIgY3AxeT0iNS4xMzYzNjM2MzYzNjM2MzUiIGNwMng9IjE0LjEzNjM2MzYzNjM2MzY0IiBjcDJ5PSI1LjEzNjM2MzYzNjM2MzYzNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjc3MjcyNzI3MjcyNzI3OSIgeT0iOC40NzcyNzI3MjcyNzI3MjgiIGNwMXg9IjEwLjc3MjcyNzI3MjcyNzI3OSIgY3AxeT0iOC40NzcyNzI3MjcyNzI3MjgiIGNwMng9IjEwLjc3MjcyNzI3MjcyNzI3OSIgY3AyeT0iOC40NzcyNzI3MjcyNzI3MjgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4yMjcyNzI3MjcyNzI3MzIiIHk9IjExLjc0OTk5OTk5OTk5OTk5NiIgY3AxeD0iMTQuMjI3MjcyNzI3MjcyNzMyIiBjcDF5PSIxMS43NDk5OTk5OTk5OTk5OTYiIGNwMng9IjE0LjIyNzI3MjcyNzI3MjczMiIgY3AyeT0iMTEuNzQ5OTk5OTk5OTk5OTk2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuNzk1NDU0NTQ1NDU0NTQzIiB5PSIxMy4zMTgxODE4MTgxODE4MiIgY3AxeD0iMTIuNzk1NDU0NTQ1NDU0NTQzIiBjcDF5PSIxMy4zMTgxODE4MTgxODE4MiIgY3AyeD0iMTIuNzk1NDU0NTQ1NDU0NTQzIiBjcDJ5PSIxMy4zMTgxODE4MTgxODE4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNDc3MjcyNzI3MjcyNzI1IiB5PSI5Ljc0OTk5OTk5OTk5OTk5MyIgY3AxeD0iOS40NzcyNzI3MjcyNzI3MjUiIGNwMXk9IjkuNzQ5OTk5OTk5OTk5OTkzIiBjcDJ4PSI5LjQ3NzI3MjcyNzI3MjcyNSIgY3AyeT0iOS43NDk5OTk5OTk5OTk5OTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjI5NTQ1NDU0NTQ1NDU0MyIgeT0iMTMuMzYzNjM2MzYzNjM2MzciIGNwMXg9IjYuMjk1NDU0NTQ1NDU0NTQzIiBjcDF5PSIxMy4zNjM2MzYzNjM2MzYzNyIgY3AyeD0iNi4yOTU0NTQ1NDU0NTQ1NDMiIGNwMnk9IjEzLjM2MzYzNjM2MzYzNjM3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC43OTU0NTQ1NDU0NTQ1NDgiIHk9IjExLjgxODE4MTgxODE4MTgxMyIgY3AxeD0iNC43OTU0NTQ1NDU0NTQ1NDgiIGNwMXk9IjExLjgxODE4MTgxODE4MTgxMyIgY3AyeD0iNC43OTU0NTQ1NDU0NTQ1NDgiIGNwMnk9IjExLjgxODE4MTgxODE4MTgxMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMjk1NDU0NTQ1NDU0NTQxIiB5PSI4LjQ5OTk5OTk5OTk5OTk5OCIgY3AxeD0iOC4yOTU0NTQ1NDU0NTQ1NDEiIGNwMXk9IjguNDk5OTk5OTk5OTk5OTk4IiBjcDJ4PSI4LjI5NTQ1NDU0NTQ1NDU0MSIgY3AyeT0iOC40OTk5OTk5OTk5OTk5OTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MSIgZ3JlZW49IjIxIiBibHVlPSIxNCIgYWxwaGE9IjEzMyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9IjAuMDA1NjUzMDI0NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMDQwMDAzNjU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODQzMTM3MyIgYWxwaGFPZmZzZXQ9Ii0xMjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC43NDk5OTk5OTk5OTk5OTgiIHk9IjEzLjI3MjcyNzI3MjcyNzI4IiBjcDF4PSI0Ljc0OTk5OTk5OTk5OTk5OCIgY3AxeT0iMTMuMjcyNzI3MjcyNzI3MjgiIGNwMng9IjQuNzQ5OTk5OTk5OTk5OTk4IiBjcDJ5PSIxMy4yNzI3MjcyNzI3MjcyOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiB5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMXg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDF5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMng9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjU5MDkwOTA5MDkwOTA5NSIgeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDF4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AxeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDJ4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AyeT0iMTAuNjM2MzYzNjM2MzYzNjQ0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMDAwMDAwMDAwMDAwMDA1IiB5PSIxNC4zMTgxODE4MTgxODE4MjUiIGNwMXg9IjEzLjAwMDAwMDAwMDAwMDAwNSIgY3AxeT0iMTQuMzE4MTgxODE4MTgxODI1IiBjcDJ4PSIxMy4wMDAwMDAwMDAwMDAwMDUiIGNwMnk9IjE0LjMxODE4MTgxODE4MTgyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjQzMTgxODE4MTgxODE4NSIgeT0iMTIuOTU0NTQ1NDU0NTQ1NDYyIiBjcDF4PSIxNC40MzE4MTgxODE4MTgxODUiIGNwMXk9IjEyLjk1NDU0NTQ1NDU0NTQ2MiIgY3AyeD0iMTQuNDMxODE4MTgxODE4MTg1IiBjcDJ5PSIxMi45NTQ1NDU0NTQ1NDU0NjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4zMTgxODE4MTgxODE4MjIiIHk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDF4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMXk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDJ4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMnk9IjkuNDMxODE4MTgxODE4MTg5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMzE4MTgxODE4MTgxODIyIiB5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AxeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDF5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AyeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDJ5PSI2LjEzNjM2MzYzNjM2MzYzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjk3NzI3MjcyNzI3MjczMiIgeT0iNC41NjgxODE4MTgxODE4MTc1IiBjcDF4PSIxMi45NzcyNzI3MjcyNzI3MzIiIGNwMXk9IjQuNTY4MTgxODE4MTgxODE3NSIgY3AyeD0iMTIuOTc3MjcyNzI3MjcyNzMyIiBjcDJ5PSI0LjU2ODE4MTgxODE4MTgxNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjY1OTA5MDkwOTA5MDkxMiIgeT0iNy45MzE4MTgxODE4MTgxODIiIGNwMXg9IjkuNjU5MDkwOTA5MDkwOTEyIiBjcDF5PSI3LjkzMTgxODE4MTgxODE4MiIgY3AyeD0iOS42NTkwOTA5MDkwOTA5MTIiIGNwMnk9IjcuOTMxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yNzI3MjcyNzI3MjcyNzIiIHk9IjQuNjEzNjM2MzYzNjM2MzYzIiBjcDF4PSI2LjI3MjcyNzI3MjcyNzI3MiIgY3AxeT0iNC42MTM2MzYzNjM2MzYzNjMiIGNwMng9IjYuMjcyNzI3MjcyNzI3MjcyIiBjcDJ5PSI0LjYxMzYzNjM2MzYzNjM2MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuODg2MzYzNjM2MzYzNjM1IiB5PSI1Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeD0iNC44ODYzNjM2MzYzNjM2MzUiIGNwMXk9IjUuOTc3MjcyNzI3MjcyNzI3IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzNSIgY3AyeT0iNS45NzcyNzI3MjcyNzI3MjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjExMzYzNjM2MzYzNjM2NSIgeT0iOS40NTQ1NDU0NTQ1NDU0NjciIGNwMXg9IjguMTEzNjM2MzYzNjM2MzY1IiBjcDF5PSI5LjQ1NDU0NTQ1NDU0NTQ2NyIgY3AyeD0iOC4xMTM2MzYzNjM2MzYzNjUiIGNwMnk9IjkuNDU0NTQ1NDU0NTQ1NDY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjAuOTU0NTQ1NDU0NTQ1NDU0NiIgeTI9IjE1Ljk1NDU0NTQ1NDU0NTQ1NSIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTkiIGdyZWVuPSIxMjEiIGJsdWU9IjExMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9IjYuODkwNTk1RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNjY2NTU3NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MSIgZ3JlZW49IjI4IiBibHVlPSIxNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9Ii0wLjAwMTAyMTcxMyIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMDE4MDQ1NTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAzMTM3MjU0NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY1MDU2ODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYwIiBncmVlbj0iMjQiIGJsdWU9IjExIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTIuNzM0MjYwNkUtNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMzI0MzM0MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDM1Mjk0MTE2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODYiIGdyZWVuPSI1MCIgYmx1ZT0iMzciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMi43MzQyNjA2RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAwMjI1ODcxOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNjY2NjY2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTYiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NDMxMzczIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTkiIGdyZWVuPSIyMyIgYmx1ZT0iMTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMi43MzQyNjA2RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjEzODI5MDM1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIxMS4wIiB5Mj0iMTguMCIgcm91bmRpbmc9IjYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg2IiBibHVlPSI5MyIgYWxwaGE9IjcwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMjk5OTQzMjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM4MDM5MjE2IiBhbHBoYU9mZnNldD0iLTE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZTFmZjVhNzgucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC44ODYzNjM2MzYzNjM2MzgiIHk9IjUuMDkwOTA5MDkwOTA5MDkiIGNwMXg9IjQuODg2MzYzNjM2MzYzNjM4IiBjcDF5PSI1LjA5MDkwOTA5MDkwOTA5IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzOCIgY3AyeT0iNS4wOTA5MDkwOTA5MDkwOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMTEzNjM2MzYzNjM2MzYyIiB5PSIzLjg0MDkwOTA5MDkwOTA5IiBjcDF4PSI2LjExMzYzNjM2MzYzNjM2MiIgY3AxeT0iMy44NDA5MDkwOTA5MDkwOSIgY3AyeD0iNi4xMTM2MzYzNjM2MzYzNjIiIGNwMnk9IjMuODQwOTA5MDkwOTA5MDkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjUiIHk9IjcuMjcyNzI3MjcyNzI3Mjc1IiBjcDF4PSI5LjUiIGNwMXk9IjcuMjcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSI5LjUiIGNwMnk9IjcuMjcyNzI3MjcyNzI3Mjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuNzk1NDU0NTQ1NDU0NTQxIiB5PSIzLjc5NTQ1NDU0NTQ1NDU0MzYiIGNwMXg9IjEyLjc5NTQ1NDU0NTQ1NDU0MSIgY3AxeT0iMy43OTU0NTQ1NDU0NTQ1NDM2IiBjcDJ4PSIxMi43OTU0NTQ1NDU0NTQ1NDEiIGNwMnk9IjMuNzk1NDU0NTQ1NDU0NTQzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjEzNjM2MzYzNjM2MzY0IiB5PSI1LjEzNjM2MzYzNjM2MzYzNSIgY3AxeD0iMTQuMTM2MzYzNjM2MzYzNjQiIGNwMXk9IjUuMTM2MzYzNjM2MzYzNjM1IiBjcDJ4PSIxNC4xMzYzNjM2MzYzNjM2NCIgY3AyeT0iNS4xMzYzNjM2MzYzNjM2MzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC43NzI3MjcyNzI3MjcyNzkiIHk9IjguNDc3MjcyNzI3MjcyNzI4IiBjcDF4PSIxMC43NzI3MjcyNzI3MjcyNzkiIGNwMXk9IjguNDc3MjcyNzI3MjcyNzI4IiBjcDJ4PSIxMC43NzI3MjcyNzI3MjcyNzkiIGNwMnk9IjguNDc3MjcyNzI3MjcyNzI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMjI3MjcyNzI3MjcyNzMyIiB5PSIxMS43NDk5OTk5OTk5OTk5OTYiIGNwMXg9IjE0LjIyNzI3MjcyNzI3MjczMiIgY3AxeT0iMTEuNzQ5OTk5OTk5OTk5OTk2IiBjcDJ4PSIxNC4yMjcyNzI3MjcyNzI3MzIiIGNwMnk9IjExLjc0OTk5OTk5OTk5OTk5NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgeT0iMTMuMzE4MTgxODE4MTgxODIiIGNwMXg9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iMTMuMzE4MTgxODE4MTgxODIiIGNwMng9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgY3AyeT0iMTMuMzE4MTgxODE4MTgxODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjQ3NzI3MjcyNzI3MjcyNSIgeT0iOS43NDk5OTk5OTk5OTk5OTMiIGNwMXg9IjkuNDc3MjcyNzI3MjcyNzI1IiBjcDF5PSI5Ljc0OTk5OTk5OTk5OTk5MyIgY3AyeD0iOS40NzcyNzI3MjcyNzI3MjUiIGNwMnk9IjkuNzQ5OTk5OTk5OTk5OTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yOTU0NTQ1NDU0NTQ1NDMiIHk9IjEzLjM2MzYzNjM2MzYzNjM3IiBjcDF4PSI2LjI5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iMTMuMzYzNjM2MzYzNjM2MzciIGNwMng9IjYuMjk1NDU0NTQ1NDU0NTQzIiBjcDJ5PSIxMy4zNjM2MzYzNjM2MzYzNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuNzk1NDU0NTQ1NDU0NTQ4IiB5PSIxMS44MTgxODE4MTgxODE4MTMiIGNwMXg9IjQuNzk1NDU0NTQ1NDU0NTQ4IiBjcDF5PSIxMS44MTgxODE4MTgxODE4MTMiIGNwMng9IjQuNzk1NDU0NTQ1NDU0NTQ4IiBjcDJ5PSIxMS44MTgxODE4MTgxODE4MTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjI5NTQ1NDU0NTQ1NDU0MSIgeT0iOC40OTk5OTk5OTk5OTk5OTgiIGNwMXg9IjguMjk1NDU0NTQ1NDU0NTQxIiBjcDF5PSI4LjQ5OTk5OTk5OTk5OTk5OCIgY3AyeD0iOC4yOTU0NTQ1NDU0NTQ1NDEiIGNwMnk9IjguNDk5OTk5OTk5OTk5OTk4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjEzMyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9Ii0wLjAxNDgxNDgxNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4yMDExODM0NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMDM5MjE1Njg0IiBhbHBoYU9mZnNldD0iLTEyMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0Ljc0OTk5OTk5OTk5OTk5OCIgeT0iMTMuMjcyNzI3MjcyNzI3MjgiIGNwMXg9IjQuNzQ5OTk5OTk5OTk5OTk4IiBjcDF5PSIxMy4yNzI3MjcyNzI3MjcyOCIgY3AyeD0iNC43NDk5OTk5OTk5OTk5OTgiIGNwMnk9IjEzLjI3MjcyNzI3MjcyNzI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS43MDQ1NDU0NTQ1NDU0NTMiIHk9IjE0LjI5NTQ1NDU0NTQ1NDU1MiIgY3AxeD0iNS43MDQ1NDU0NTQ1NDU0NTMiIGNwMXk9IjE0LjI5NTQ1NDU0NTQ1NDU1MiIgY3AyeD0iNS43MDQ1NDU0NTQ1NDU0NTMiIGNwMnk9IjE0LjI5NTQ1NDU0NTQ1NDU1MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNTkwOTA5MDkwOTA5MDk1IiB5PSIxMC42MzYzNjM2MzYzNjM2NDQiIGNwMXg9IjkuNTkwOTA5MDkwOTA5MDk1IiBjcDF5PSIxMC42MzYzNjM2MzYzNjM2NDQiIGNwMng9IjkuNTkwOTA5MDkwOTA5MDk1IiBjcDJ5PSIxMC42MzYzNjM2MzYzNjM2NDQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wMDAwMDAwMDAwMDAwMDUiIHk9IjE0LjMxODE4MTgxODE4MTgyNSIgY3AxeD0iMTMuMDAwMDAwMDAwMDAwMDA1IiBjcDF5PSIxNC4zMTgxODE4MTgxODE4MjUiIGNwMng9IjEzLjAwMDAwMDAwMDAwMDAwNSIgY3AyeT0iMTQuMzE4MTgxODE4MTgxODI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuNDMxODE4MTgxODE4MTg1IiB5PSIxMi45NTQ1NDU0NTQ1NDU0NjIiIGNwMXg9IjE0LjQzMTgxODE4MTgxODE4NSIgY3AxeT0iMTIuOTU0NTQ1NDU0NTQ1NDYyIiBjcDJ4PSIxNC40MzE4MTgxODE4MTgxODUiIGNwMnk9IjEyLjk1NDU0NTQ1NDU0NTQ2MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjMxODE4MTgxODE4MTgyMiIgeT0iOS40MzE4MTgxODE4MTgxODkiIGNwMXg9IjExLjMxODE4MTgxODE4MTgyMiIgY3AxeT0iOS40MzE4MTgxODE4MTgxODkiIGNwMng9IjExLjMxODE4MTgxODE4MTgyMiIgY3AyeT0iOS40MzE4MTgxODE4MTgxODkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4zMTgxODE4MTgxODE4MjIiIHk9IjYuMTM2MzYzNjM2MzYzNjM2IiBjcDF4PSIxNC4zMTgxODE4MTgxODE4MjIiIGNwMXk9IjYuMTM2MzYzNjM2MzYzNjM2IiBjcDJ4PSIxNC4zMTgxODE4MTgxODE4MjIiIGNwMnk9IjYuMTM2MzYzNjM2MzYzNjM2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuOTc3MjcyNzI3MjcyNzMyIiB5PSI0LjU2ODE4MTgxODE4MTgxNzUiIGNwMXg9IjEyLjk3NzI3MjcyNzI3MjczMiIgY3AxeT0iNC41NjgxODE4MTgxODE4MTc1IiBjcDJ4PSIxMi45NzcyNzI3MjcyNzI3MzIiIGNwMnk9IjQuNTY4MTgxODE4MTgxODE3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNjU5MDkwOTA5MDkwOTEyIiB5PSI3LjkzMTgxODE4MTgxODE4MiIgY3AxeD0iOS42NTkwOTA5MDkwOTA5MTIiIGNwMXk9IjcuOTMxODE4MTgxODE4MTgyIiBjcDJ4PSI5LjY1OTA5MDkwOTA5MDkxMiIgY3AyeT0iNy45MzE4MTgxODE4MTgxODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjI3MjcyNzI3MjcyNzI3MiIgeT0iNC42MTM2MzYzNjM2MzYzNjMiIGNwMXg9IjYuMjcyNzI3MjcyNzI3MjcyIiBjcDF5PSI0LjYxMzYzNjM2MzYzNjM2MyIgY3AyeD0iNi4yNzI3MjcyNzI3MjcyNzIiIGNwMnk9IjQuNjEzNjM2MzYzNjM2MzYzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC44ODYzNjM2MzYzNjM2MzUiIHk9IjUuOTc3MjcyNzI3MjcyNzI3IiBjcDF4PSI0Ljg4NjM2MzYzNjM2MzYzNSIgY3AxeT0iNS45NzcyNzI3MjcyNzI3MjciIGNwMng9IjQuODg2MzYzNjM2MzYzNjM1IiBjcDJ5PSI1Ljk3NzI3MjcyNzI3MjcyNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMTEzNjM2MzYzNjM2MzY1IiB5PSI5LjQ1NDU0NTQ1NDU0NTQ2NyIgY3AxeD0iOC4xMTM2MzYzNjM2MzYzNjUiIGNwMXk9IjkuNDU0NTQ1NDU0NTQ1NDY3IiBjcDJ4PSI4LjExMzYzNjM2MzYzNjM2NSIgY3AyeT0iOS40NTQ1NDU0NTQ1NDU0NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMC45MzE4MTgxODE4MTgxODE5IiB5Mj0iMTUuOTMxODE4MTgxODE4MTgyIiByb3VuZGluZz0iNi43NDk5OTk5OTk5OTk5OTMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjEzMiIgYmx1ZT0iMTI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iNi44OTA1OTVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4OTI5Mjc1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2MDc4NDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41Mzk3NzI3NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODAiIGdyZWVuPSI0NyIgYmx1ZT0iMzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSIyLjUzNzIwMkUtNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTIyOTQ1MzEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzkiIGdyZWVuPSI0MyIgYmx1ZT0iMzAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMi43MzQyNjA2RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAzMzU4NTY2OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NzkwNDE5MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDUiIGdyZWVuPSI2OSIgYmx1ZT0iNTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMi43MzQyNjA2RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzE5ODcyNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNDExNzY0NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zODgyMzUzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzUiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMzMzMzMzMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgzIiBncmVlbj0iODYiIGJsdWU9IjkzIiBhbHBoYT0iNzAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDAyOTk5NDMyNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzgwMzkyMTYiIGFscGhhT2Zmc2V0PSItMTg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNmYzMwMTAxMS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC44ODYzNjM2MzYzNjM2MzgiIHk9IjUuMDkwOTA5MDkwOTA5MDkiIGNwMXg9IjQuODg2MzYzNjM2MzYzNjM4IiBjcDF5PSI1LjA5MDkwOTA5MDkwOTA5IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzOCIgY3AyeT0iNS4wOTA5MDkwOTA5MDkwOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMTEzNjM2MzYzNjM2MzYyIiB5PSIzLjg0MDkwOTA5MDkwOTA5IiBjcDF4PSI2LjExMzYzNjM2MzYzNjM2MiIgY3AxeT0iMy44NDA5MDkwOTA5MDkwOSIgY3AyeD0iNi4xMTM2MzYzNjM2MzYzNjIiIGNwMnk9IjMuODQwOTA5MDkwOTA5MDkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjUiIHk9IjcuMjcyNzI3MjcyNzI3Mjc1IiBjcDF4PSI5LjUiIGNwMXk9IjcuMjcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSI5LjUiIGNwMnk9IjcuMjcyNzI3MjcyNzI3Mjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuNzk1NDU0NTQ1NDU0NTQxIiB5PSIzLjc5NTQ1NDU0NTQ1NDU0MzYiIGNwMXg9IjEyLjc5NTQ1NDU0NTQ1NDU0MSIgY3AxeT0iMy43OTU0NTQ1NDU0NTQ1NDM2IiBjcDJ4PSIxMi43OTU0NTQ1NDU0NTQ1NDEiIGNwMnk9IjMuNzk1NDU0NTQ1NDU0NTQzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjEzNjM2MzYzNjM2MzY0IiB5PSI1LjEzNjM2MzYzNjM2MzYzNSIgY3AxeD0iMTQuMTM2MzYzNjM2MzYzNjQiIGNwMXk9IjUuMTM2MzYzNjM2MzYzNjM1IiBjcDJ4PSIxNC4xMzYzNjM2MzYzNjM2NCIgY3AyeT0iNS4xMzYzNjM2MzYzNjM2MzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC43NzI3MjcyNzI3MjcyNzkiIHk9IjguNDc3MjcyNzI3MjcyNzI4IiBjcDF4PSIxMC43NzI3MjcyNzI3MjcyNzkiIGNwMXk9IjguNDc3MjcyNzI3MjcyNzI4IiBjcDJ4PSIxMC43NzI3MjcyNzI3MjcyNzkiIGNwMnk9IjguNDc3MjcyNzI3MjcyNzI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMjI3MjcyNzI3MjcyNzMyIiB5PSIxMS43NDk5OTk5OTk5OTk5OTYiIGNwMXg9IjE0LjIyNzI3MjcyNzI3MjczMiIgY3AxeT0iMTEuNzQ5OTk5OTk5OTk5OTk2IiBjcDJ4PSIxNC4yMjcyNzI3MjcyNzI3MzIiIGNwMnk9IjExLjc0OTk5OTk5OTk5OTk5NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgeT0iMTMuMzE4MTgxODE4MTgxODIiIGNwMXg9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iMTMuMzE4MTgxODE4MTgxODIiIGNwMng9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgY3AyeT0iMTMuMzE4MTgxODE4MTgxODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjQ3NzI3MjcyNzI3MjcyNSIgeT0iOS43NDk5OTk5OTk5OTk5OTMiIGNwMXg9IjkuNDc3MjcyNzI3MjcyNzI1IiBjcDF5PSI5Ljc0OTk5OTk5OTk5OTk5MyIgY3AyeD0iOS40NzcyNzI3MjcyNzI3MjUiIGNwMnk9IjkuNzQ5OTk5OTk5OTk5OTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yOTU0NTQ1NDU0NTQ1NDMiIHk9IjEzLjM2MzYzNjM2MzYzNjM3IiBjcDF4PSI2LjI5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iMTMuMzYzNjM2MzYzNjM2MzciIGNwMng9IjYuMjk1NDU0NTQ1NDU0NTQzIiBjcDJ5PSIxMy4zNjM2MzYzNjM2MzYzNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuNzk1NDU0NTQ1NDU0NTQ4IiB5PSIxMS44MTgxODE4MTgxODE4MTMiIGNwMXg9IjQuNzk1NDU0NTQ1NDU0NTQ4IiBjcDF5PSIxMS44MTgxODE4MTgxODE4MTMiIGNwMng9IjQuNzk1NDU0NTQ1NDU0NTQ4IiBjcDJ5PSIxMS44MTgxODE4MTgxODE4MTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjI5NTQ1NDU0NTQ1NDU0MSIgeT0iOC40OTk5OTk5OTk5OTk5OTgiIGNwMXg9IjguMjk1NDU0NTQ1NDU0NTQxIiBjcDF5PSI4LjQ5OTk5OTk5OTk5OTk5OCIgY3AyeD0iOC4yOTU0NTQ1NDU0NTQ1NDEiIGNwMnk9IjguNDk5OTk5OTk5OTk5OTk4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODgiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMTMzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMTc2NDcwNyIgYWxwaGFPZmZzZXQ9Ii0xMjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC43NDk5OTk5OTk5OTk5OTgiIHk9IjEzLjI3MjcyNzI3MjcyNzI4IiBjcDF4PSI0Ljc0OTk5OTk5OTk5OTk5OCIgY3AxeT0iMTMuMjcyNzI3MjcyNzI3MjgiIGNwMng9IjQuNzQ5OTk5OTk5OTk5OTk4IiBjcDJ5PSIxMy4yNzI3MjcyNzI3MjcyOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiB5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMXg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDF5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMng9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjU5MDkwOTA5MDkwOTA5NSIgeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDF4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AxeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDJ4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AyeT0iMTAuNjM2MzYzNjM2MzYzNjQ0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMDAwMDAwMDAwMDAwMDA1IiB5PSIxNC4zMTgxODE4MTgxODE4MjUiIGNwMXg9IjEzLjAwMDAwMDAwMDAwMDAwNSIgY3AxeT0iMTQuMzE4MTgxODE4MTgxODI1IiBjcDJ4PSIxMy4wMDAwMDAwMDAwMDAwMDUiIGNwMnk9IjE0LjMxODE4MTgxODE4MTgyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjQzMTgxODE4MTgxODE4NSIgeT0iMTIuOTU0NTQ1NDU0NTQ1NDYyIiBjcDF4PSIxNC40MzE4MTgxODE4MTgxODUiIGNwMXk9IjEyLjk1NDU0NTQ1NDU0NTQ2MiIgY3AyeD0iMTQuNDMxODE4MTgxODE4MTg1IiBjcDJ5PSIxMi45NTQ1NDU0NTQ1NDU0NjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4zMTgxODE4MTgxODE4MjIiIHk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDF4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMXk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDJ4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMnk9IjkuNDMxODE4MTgxODE4MTg5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMzE4MTgxODE4MTgxODIyIiB5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AxeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDF5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AyeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDJ5PSI2LjEzNjM2MzYzNjM2MzYzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjk3NzI3MjcyNzI3MjczMiIgeT0iNC41NjgxODE4MTgxODE4MTc1IiBjcDF4PSIxMi45NzcyNzI3MjcyNzI3MzIiIGNwMXk9IjQuNTY4MTgxODE4MTgxODE3NSIgY3AyeD0iMTIuOTc3MjcyNzI3MjcyNzMyIiBjcDJ5PSI0LjU2ODE4MTgxODE4MTgxNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjY1OTA5MDkwOTA5MDkxMiIgeT0iNy45MzE4MTgxODE4MTgxODIiIGNwMXg9IjkuNjU5MDkwOTA5MDkwOTEyIiBjcDF5PSI3LjkzMTgxODE4MTgxODE4MiIgY3AyeD0iOS42NTkwOTA5MDkwOTA5MTIiIGNwMnk9IjcuOTMxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yNzI3MjcyNzI3MjcyNzIiIHk9IjQuNjEzNjM2MzYzNjM2MzYzIiBjcDF4PSI2LjI3MjcyNzI3MjcyNzI3MiIgY3AxeT0iNC42MTM2MzYzNjM2MzYzNjMiIGNwMng9IjYuMjcyNzI3MjcyNzI3MjcyIiBjcDJ5PSI0LjYxMzYzNjM2MzYzNjM2MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuODg2MzYzNjM2MzYzNjM1IiB5PSI1Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeD0iNC44ODYzNjM2MzYzNjM2MzUiIGNwMXk9IjUuOTc3MjcyNzI3MjcyNzI3IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzNSIgY3AyeT0iNS45NzcyNzI3MjcyNzI3MjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjExMzYzNjM2MzYzNjM2NSIgeT0iOS40NTQ1NDU0NTQ1NDU0NjciIGNwMXg9IjguMTEzNjM2MzYzNjM2MzY1IiBjcDF5PSI5LjQ1NDU0NTQ1NDU0NTQ2NyIgY3AyeD0iOC4xMTM2MzYzNjM2MzYzNjUiIGNwMnk9IjkuNDU0NTQ1NDU0NTQ1NDY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjAuOTU0NTQ1NDU0NTQ1NDU0NiIgeTI9IjE1Ljk1NDU0NTQ1NDU0NTQ1NSIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzQiIGdyZWVuPSI3MiIgYmx1ZT0iNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIxMjYwOTY1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NCIgZ3JlZW49IjQiIGJsdWU9IjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTczNDA1NjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA5ODAzOTIxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk4MjAzNTkzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1NyIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjAxMTgzNDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA0NzA1ODgyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MyIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjAxMTgzNDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ5NDExNzY4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTciIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMDM5MjE1OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTE1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii0xNDAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZjMzJjMzk3LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtXaW5kb3dOb3RGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD40PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDAiIGdyZWVuPSIxMDMiIGJsdWU9IjEwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjc5NTc1MDYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMxNzY0NzA3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0Ljg4NjM2MzYzNjM2MzYzOCIgeT0iNS4wOTA5MDkwOTA5MDkwOSIgY3AxeD0iNC44ODYzNjM2MzYzNjM2MzgiIGNwMXk9IjUuMDkwOTA5MDkwOTA5MDkiIGNwMng9IjQuODg2MzYzNjM2MzYzNjM4IiBjcDJ5PSI1LjA5MDkwOTA5MDkwOTA5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4xMTM2MzYzNjM2MzYzNjIiIHk9IjMuODQwOTA5MDkwOTA5MDkiIGNwMXg9IjYuMTEzNjM2MzYzNjM2MzYyIiBjcDF5PSIzLjg0MDkwOTA5MDkwOTA5IiBjcDJ4PSI2LjExMzYzNjM2MzYzNjM2MiIgY3AyeT0iMy44NDA5MDkwOTA5MDkwOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNSIgeT0iNy4yNzI3MjcyNzI3MjcyNzUiIGNwMXg9IjkuNSIgY3AxeT0iNy4yNzI3MjcyNzI3MjcyNzUiIGNwMng9IjkuNSIgY3AyeT0iNy4yNzI3MjcyNzI3MjcyNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi43OTU0NTQ1NDU0NTQ1NDEiIHk9IjMuNzk1NDU0NTQ1NDU0NTQzNiIgY3AxeD0iMTIuNzk1NDU0NTQ1NDU0NTQxIiBjcDF5PSIzLjc5NTQ1NDU0NTQ1NDU0MzYiIGNwMng9IjEyLjc5NTQ1NDU0NTQ1NDU0MSIgY3AyeT0iMy43OTU0NTQ1NDU0NTQ1NDM2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMTM2MzYzNjM2MzYzNjQiIHk9IjUuMTM2MzYzNjM2MzYzNjM1IiBjcDF4PSIxNC4xMzYzNjM2MzYzNjM2NCIgY3AxeT0iNS4xMzYzNjM2MzYzNjM2MzUiIGNwMng9IjE0LjEzNjM2MzYzNjM2MzY0IiBjcDJ5PSI1LjEzNjM2MzYzNjM2MzYzNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjc3MjcyNzI3MjcyNzI3OSIgeT0iOC40NzcyNzI3MjcyNzI3MjgiIGNwMXg9IjEwLjc3MjcyNzI3MjcyNzI3OSIgY3AxeT0iOC40NzcyNzI3MjcyNzI3MjgiIGNwMng9IjEwLjc3MjcyNzI3MjcyNzI3OSIgY3AyeT0iOC40NzcyNzI3MjcyNzI3MjgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4yMjcyNzI3MjcyNzI3MzIiIHk9IjExLjc0OTk5OTk5OTk5OTk5NiIgY3AxeD0iMTQuMjI3MjcyNzI3MjcyNzMyIiBjcDF5PSIxMS43NDk5OTk5OTk5OTk5OTYiIGNwMng9IjE0LjIyNzI3MjcyNzI3MjczMiIgY3AyeT0iMTEuNzQ5OTk5OTk5OTk5OTk2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuNzk1NDU0NTQ1NDU0NTQzIiB5PSIxMy4zMTgxODE4MTgxODE4MiIgY3AxeD0iMTIuNzk1NDU0NTQ1NDU0NTQzIiBjcDF5PSIxMy4zMTgxODE4MTgxODE4MiIgY3AyeD0iMTIuNzk1NDU0NTQ1NDU0NTQzIiBjcDJ5PSIxMy4zMTgxODE4MTgxODE4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuNDc3MjcyNzI3MjcyNzI1IiB5PSI5Ljc0OTk5OTk5OTk5OTk5MyIgY3AxeD0iOS40NzcyNzI3MjcyNzI3MjUiIGNwMXk9IjkuNzQ5OTk5OTk5OTk5OTkzIiBjcDJ4PSI5LjQ3NzI3MjcyNzI3MjcyNSIgY3AyeT0iOS43NDk5OTk5OTk5OTk5OTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjI5NTQ1NDU0NTQ1NDU0MyIgeT0iMTMuMzYzNjM2MzYzNjM2MzciIGNwMXg9IjYuMjk1NDU0NTQ1NDU0NTQzIiBjcDF5PSIxMy4zNjM2MzYzNjM2MzYzNyIgY3AyeD0iNi4yOTU0NTQ1NDU0NTQ1NDMiIGNwMnk9IjEzLjM2MzYzNjM2MzYzNjM3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC43OTU0NTQ1NDU0NTQ1NDgiIHk9IjExLjgxODE4MTgxODE4MTgxMyIgY3AxeD0iNC43OTU0NTQ1NDU0NTQ1NDgiIGNwMXk9IjExLjgxODE4MTgxODE4MTgxMyIgY3AyeD0iNC43OTU0NTQ1NDU0NTQ1NDgiIGNwMnk9IjExLjgxODE4MTgxODE4MTgxMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMjk1NDU0NTQ1NDU0NTQxIiB5PSI4LjQ5OTk5OTk5OTk5OTk5OCIgY3AxeD0iOC4yOTU0NTQ1NDU0NTQ1NDEiIGNwMXk9IjguNDk5OTk5OTk5OTk5OTk4IiBjcDJ4PSI4LjI5NTQ1NDU0NTQ1NDU0MSIgY3AyeT0iOC40OTk5OTk5OTk5OTk5OTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxOC4wIiB5MT0iMC45NTQ1NDU0NTQ1NDU0NTQ2IiB5Mj0iMTUuOTU0NTQ1NDU0NTQ1NDU1IiByb3VuZGluZz0iNi43NDk5OTk5OTk5OTk5OTMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOSIgZ3JlZW49IjIyMSIgYmx1ZT0iMjI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iMC41ODUxODUxNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzc2NDk1MTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjE1Njg2MjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40ODIwMzU5MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODMiIGdyZWVuPSIxODciIGJsdWU9IjE5NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9IjAuNTk2Mjk2MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzM3Mjc4MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDE5NjA3OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY4NTYyODgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgzIiBncmVlbj0iMTg3IiBibHVlPSIxOTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSIwLjU5NjI5NjMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjczNzI3ODEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTAxOTYwNzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4OSIgZ3JlZW49IjE5MyIgYmx1ZT0iMjAxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iMC41OTYyOTYzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43MzkxMTUwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjU0OTAxOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1NDQxMTc2NDcwNTg4MjUiIHkyPSIxLjAwMTY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjAuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSI4LjYwMDAwMDAwMDAwMDAxNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM2IiBncmVlbj0iMTQxIiBibHVlPSIxNTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSIwLjU5NjI5NjMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjY5OTQ3ODgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA3MDU4ODIzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NSIgZ3JlZW49IjEwMCIgYmx1ZT0iMTEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iMC41OTYyOTYzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42NjI0NTI5NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjMxMzcyNTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNmYzM0ZjgwZS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitXaW5kb3dOb3RGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOSIgaGVpZ2h0PSIxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD40PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuODg2MzYzNjM2MzYzNjM4IiB5PSI1LjA5MDkwOTA5MDkwOTA5IiBjcDF4PSI0Ljg4NjM2MzYzNjM2MzYzOCIgY3AxeT0iNS4wOTA5MDkwOTA5MDkwOSIgY3AyeD0iNC44ODYzNjM2MzYzNjM2MzgiIGNwMnk9IjUuMDkwOTA5MDkwOTA5MDkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjExMzYzNjM2MzYzNjM2MiIgeT0iMy44NDA5MDkwOTA5MDkwOSIgY3AxeD0iNi4xMTM2MzYzNjM2MzYzNjIiIGNwMXk9IjMuODQwOTA5MDkwOTA5MDkiIGNwMng9IjYuMTEzNjM2MzYzNjM2MzYyIiBjcDJ5PSIzLjg0MDkwOTA5MDkwOTA5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS41IiB5PSI3LjI3MjcyNzI3MjcyNzI3NSIgY3AxeD0iOS41IiBjcDF5PSI3LjI3MjcyNzI3MjcyNzI3NSIgY3AyeD0iOS41IiBjcDJ5PSI3LjI3MjcyNzI3MjcyNzI3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjc5NTQ1NDU0NTQ1NDU0MSIgeT0iMy43OTU0NTQ1NDU0NTQ1NDM2IiBjcDF4PSIxMi43OTU0NTQ1NDU0NTQ1NDEiIGNwMXk9IjMuNzk1NDU0NTQ1NDU0NTQzNiIgY3AyeD0iMTIuNzk1NDU0NTQ1NDU0NTQxIiBjcDJ5PSIzLjc5NTQ1NDU0NTQ1NDU0MzYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4xMzYzNjM2MzYzNjM2NCIgeT0iNS4xMzYzNjM2MzYzNjM2MzUiIGNwMXg9IjE0LjEzNjM2MzYzNjM2MzY0IiBjcDF5PSI1LjEzNjM2MzYzNjM2MzYzNSIgY3AyeD0iMTQuMTM2MzYzNjM2MzYzNjQiIGNwMnk9IjUuMTM2MzYzNjM2MzYzNjM1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuNzcyNzI3MjcyNzI3Mjc5IiB5PSI4LjQ3NzI3MjcyNzI3MjcyOCIgY3AxeD0iMTAuNzcyNzI3MjcyNzI3Mjc5IiBjcDF5PSI4LjQ3NzI3MjcyNzI3MjcyOCIgY3AyeD0iMTAuNzcyNzI3MjcyNzI3Mjc5IiBjcDJ5PSI4LjQ3NzI3MjcyNzI3MjcyOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjIyNzI3MjcyNzI3MjczMiIgeT0iMTEuNzQ5OTk5OTk5OTk5OTk2IiBjcDF4PSIxNC4yMjcyNzI3MjcyNzI3MzIiIGNwMXk9IjExLjc0OTk5OTk5OTk5OTk5NiIgY3AyeD0iMTQuMjI3MjcyNzI3MjcyNzMyIiBjcDJ5PSIxMS43NDk5OTk5OTk5OTk5OTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi43OTU0NTQ1NDU0NTQ1NDMiIHk9IjEzLjMxODE4MTgxODE4MTgyIiBjcDF4PSIxMi43OTU0NTQ1NDU0NTQ1NDMiIGNwMXk9IjEzLjMxODE4MTgxODE4MTgyIiBjcDJ4PSIxMi43OTU0NTQ1NDU0NTQ1NDMiIGNwMnk9IjEzLjMxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS40NzcyNzI3MjcyNzI3MjUiIHk9IjkuNzQ5OTk5OTk5OTk5OTkzIiBjcDF4PSI5LjQ3NzI3MjcyNzI3MjcyNSIgY3AxeT0iOS43NDk5OTk5OTk5OTk5OTMiIGNwMng9IjkuNDc3MjcyNzI3MjcyNzI1IiBjcDJ5PSI5Ljc0OTk5OTk5OTk5OTk5MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMjk1NDU0NTQ1NDU0NTQzIiB5PSIxMy4zNjM2MzYzNjM2MzYzNyIgY3AxeD0iNi4yOTU0NTQ1NDU0NTQ1NDMiIGNwMXk9IjEzLjM2MzYzNjM2MzYzNjM3IiBjcDJ4PSI2LjI5NTQ1NDU0NTQ1NDU0MyIgY3AyeT0iMTMuMzYzNjM2MzYzNjM2MzciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0Ljc5NTQ1NDU0NTQ1NDU0OCIgeT0iMTEuODE4MTgxODE4MTgxODEzIiBjcDF4PSI0Ljc5NTQ1NDU0NTQ1NDU0OCIgY3AxeT0iMTEuODE4MTgxODE4MTgxODEzIiBjcDJ4PSI0Ljc5NTQ1NDU0NTQ1NDU0OCIgY3AyeT0iMTEuODE4MTgxODE4MTgxODEzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4yOTU0NTQ1NDU0NTQ1NDEiIHk9IjguNDk5OTk5OTk5OTk5OTk4IiBjcDF4PSI4LjI5NTQ1NDU0NTQ1NDU0MSIgY3AxeT0iOC40OTk5OTk5OTk5OTk5OTgiIGNwMng9IjguMjk1NDU0NTQ1NDU0NTQxIiBjcDJ5PSI4LjQ5OTk5OTk5OTk5OTk5OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIxMzMiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjAxMTgzNDQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDAzOTIxNTY4NCIgYWxwaGFPZmZzZXQ9Ii0xMjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC43NDk5OTk5OTk5OTk5OTgiIHk9IjEzLjI3MjcyNzI3MjcyNzI4IiBjcDF4PSI0Ljc0OTk5OTk5OTk5OTk5OCIgY3AxeT0iMTMuMjcyNzI3MjcyNzI3MjgiIGNwMng9IjQuNzQ5OTk5OTk5OTk5OTk4IiBjcDJ5PSIxMy4yNzI3MjcyNzI3MjcyOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiB5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMXg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDF5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMng9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjU5MDkwOTA5MDkwOTA5NSIgeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDF4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AxeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDJ4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AyeT0iMTAuNjM2MzYzNjM2MzYzNjQ0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMDAwMDAwMDAwMDAwMDA1IiB5PSIxNC4zMTgxODE4MTgxODE4MjUiIGNwMXg9IjEzLjAwMDAwMDAwMDAwMDAwNSIgY3AxeT0iMTQuMzE4MTgxODE4MTgxODI1IiBjcDJ4PSIxMy4wMDAwMDAwMDAwMDAwMDUiIGNwMnk9IjE0LjMxODE4MTgxODE4MTgyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjQzMTgxODE4MTgxODE4NSIgeT0iMTIuOTU0NTQ1NDU0NTQ1NDYyIiBjcDF4PSIxNC40MzE4MTgxODE4MTgxODUiIGNwMXk9IjEyLjk1NDU0NTQ1NDU0NTQ2MiIgY3AyeD0iMTQuNDMxODE4MTgxODE4MTg1IiBjcDJ5PSIxMi45NTQ1NDU0NTQ1NDU0NjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4zMTgxODE4MTgxODE4MjIiIHk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDF4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMXk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDJ4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMnk9IjkuNDMxODE4MTgxODE4MTg5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMzE4MTgxODE4MTgxODIyIiB5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AxeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDF5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AyeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDJ5PSI2LjEzNjM2MzYzNjM2MzYzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjk3NzI3MjcyNzI3MjczMiIgeT0iNC41NjgxODE4MTgxODE4MTc1IiBjcDF4PSIxMi45NzcyNzI3MjcyNzI3MzIiIGNwMXk9IjQuNTY4MTgxODE4MTgxODE3NSIgY3AyeD0iMTIuOTc3MjcyNzI3MjcyNzMyIiBjcDJ5PSI0LjU2ODE4MTgxODE4MTgxNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjY1OTA5MDkwOTA5MDkxMiIgeT0iNy45MzE4MTgxODE4MTgxODIiIGNwMXg9IjkuNjU5MDkwOTA5MDkwOTEyIiBjcDF5PSI3LjkzMTgxODE4MTgxODE4MiIgY3AyeD0iOS42NTkwOTA5MDkwOTA5MTIiIGNwMnk9IjcuOTMxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yNzI3MjcyNzI3MjcyNzIiIHk9IjQuNjEzNjM2MzYzNjM2MzYzIiBjcDF4PSI2LjI3MjcyNzI3MjcyNzI3MiIgY3AxeT0iNC42MTM2MzYzNjM2MzYzNjMiIGNwMng9IjYuMjcyNzI3MjcyNzI3MjcyIiBjcDJ5PSI0LjYxMzYzNjM2MzYzNjM2MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuODg2MzYzNjM2MzYzNjM1IiB5PSI1Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeD0iNC44ODYzNjM2MzYzNjM2MzUiIGNwMXk9IjUuOTc3MjcyNzI3MjcyNzI3IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzNSIgY3AyeT0iNS45NzcyNzI3MjcyNzI3MjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjExMzYzNjM2MzYzNjM2NSIgeT0iOS40NTQ1NDU0NTQ1NDU0NjciIGNwMXg9IjguMTEzNjM2MzYzNjM2MzY1IiBjcDF5PSI5LjQ1NDU0NTQ1NDU0NTQ2NyIgY3AyeD0iOC4xMTM2MzYzNjM2MzYzNjUiIGNwMnk9IjkuNDU0NTQ1NDU0NTQ1NDY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjAuOTMxODE4MTgxODE4MTgxOSIgeTI9IjE1LjkzMTgxODE4MTgxODE4MiIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTAiIGdyZWVuPSIxMzIiIGJsdWU9IjEyNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9IjYuODkwNTk1RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zODkyOTI3NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNjA3ODQzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTM5NzcyNzUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgwIiBncmVlbj0iNDciIGJsdWU9IjM0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iMi41MzcyMDJFLTUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDEyMjk0NTMxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA0MzEzNzI1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY1MDU2ODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc5IiBncmVlbj0iNDMiIGJsdWU9IjMwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTIuNzM0MjYwNkUtNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMzM1ODU2NjgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDM5MjE1Njg0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTc5MDQxOTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA1IiBncmVlbj0iNjkiIGJsdWU9IjU2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTIuNzM0MjYwNkUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcxOTg3MjciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQxMTc2NDYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTQ0MTE3NjQ3MDU4ODI1IiB5Mj0iMS4wMDE2NjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIwLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iOC42MDAwMDAwMDAwMDAwMTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjcwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9Ii0wLjAxNDgxNDgxNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4yMDExODM0NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzg4MjM1MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM1IiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzUmVkIiBodWVPZmZzZXQ9Ii0wLjAxNDgxNDgxNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4yMDExODM0NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI0ODY4NDIxMDUyNjMxNTc5IiB5MT0iMC4wMDE0NzA1ODgyMzUyOTQxMTc2IiB4Mj0iMC4yNDg2ODQyMTA1MjYzMTU4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE5LjAiIHkxPSIxMS4wIiB5Mj0iMTguMCIgcm91bmRpbmc9IjYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg2IiBibHVlPSI5MyIgYWxwaGE9IjcwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMjk5OTQzMjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM4MDM5MjE2IiBhbHBoYU9mZnNldD0iLTE4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZmMzMDEwMTEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkK1dpbmRvd05vdEZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE5IiBoZWlnaHQ9IjE4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC44ODYzNjM2MzYzNjM2MzgiIHk9IjUuMDkwOTA5MDkwOTA5MDkiIGNwMXg9IjQuODg2MzYzNjM2MzYzNjM4IiBjcDF5PSI1LjA5MDkwOTA5MDkwOTA5IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzOCIgY3AyeT0iNS4wOTA5MDkwOTA5MDkwOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMTEzNjM2MzYzNjM2MzYyIiB5PSIzLjg0MDkwOTA5MDkwOTA5IiBjcDF4PSI2LjExMzYzNjM2MzYzNjM2MiIgY3AxeT0iMy44NDA5MDkwOTA5MDkwOSIgY3AyeD0iNi4xMTM2MzYzNjM2MzYzNjIiIGNwMnk9IjMuODQwOTA5MDkwOTA5MDkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjUiIHk9IjcuMjcyNzI3MjcyNzI3Mjc1IiBjcDF4PSI5LjUiIGNwMXk9IjcuMjcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSI5LjUiIGNwMnk9IjcuMjcyNzI3MjcyNzI3Mjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuNzk1NDU0NTQ1NDU0NTQxIiB5PSIzLjc5NTQ1NDU0NTQ1NDU0MzYiIGNwMXg9IjEyLjc5NTQ1NDU0NTQ1NDU0MSIgY3AxeT0iMy43OTU0NTQ1NDU0NTQ1NDM2IiBjcDJ4PSIxMi43OTU0NTQ1NDU0NTQ1NDEiIGNwMnk9IjMuNzk1NDU0NTQ1NDU0NTQzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjEzNjM2MzYzNjM2MzY0IiB5PSI1LjEzNjM2MzYzNjM2MzYzNSIgY3AxeD0iMTQuMTM2MzYzNjM2MzYzNjQiIGNwMXk9IjUuMTM2MzYzNjM2MzYzNjM1IiBjcDJ4PSIxNC4xMzYzNjM2MzYzNjM2NCIgY3AyeT0iNS4xMzYzNjM2MzYzNjM2MzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC43NzI3MjcyNzI3MjcyNzkiIHk9IjguNDc3MjcyNzI3MjcyNzI4IiBjcDF4PSIxMC43NzI3MjcyNzI3MjcyNzkiIGNwMXk9IjguNDc3MjcyNzI3MjcyNzI4IiBjcDJ4PSIxMC43NzI3MjcyNzI3MjcyNzkiIGNwMnk9IjguNDc3MjcyNzI3MjcyNzI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMjI3MjcyNzI3MjcyNzMyIiB5PSIxMS43NDk5OTk5OTk5OTk5OTYiIGNwMXg9IjE0LjIyNzI3MjcyNzI3MjczMiIgY3AxeT0iMTEuNzQ5OTk5OTk5OTk5OTk2IiBjcDJ4PSIxNC4yMjcyNzI3MjcyNzI3MzIiIGNwMnk9IjExLjc0OTk5OTk5OTk5OTk5NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgeT0iMTMuMzE4MTgxODE4MTgxODIiIGNwMXg9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iMTMuMzE4MTgxODE4MTgxODIiIGNwMng9IjEyLjc5NTQ1NDU0NTQ1NDU0MyIgY3AyeT0iMTMuMzE4MTgxODE4MTgxODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjQ3NzI3MjcyNzI3MjcyNSIgeT0iOS43NDk5OTk5OTk5OTk5OTMiIGNwMXg9IjkuNDc3MjcyNzI3MjcyNzI1IiBjcDF5PSI5Ljc0OTk5OTk5OTk5OTk5MyIgY3AyeD0iOS40NzcyNzI3MjcyNzI3MjUiIGNwMnk9IjkuNzQ5OTk5OTk5OTk5OTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yOTU0NTQ1NDU0NTQ1NDMiIHk9IjEzLjM2MzYzNjM2MzYzNjM3IiBjcDF4PSI2LjI5NTQ1NDU0NTQ1NDU0MyIgY3AxeT0iMTMuMzYzNjM2MzYzNjM2MzciIGNwMng9IjYuMjk1NDU0NTQ1NDU0NTQzIiBjcDJ5PSIxMy4zNjM2MzYzNjM2MzYzNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuNzk1NDU0NTQ1NDU0NTQ4IiB5PSIxMS44MTgxODE4MTgxODE4MTMiIGNwMXg9IjQuNzk1NDU0NTQ1NDU0NTQ4IiBjcDF5PSIxMS44MTgxODE4MTgxODE4MTMiIGNwMng9IjQuNzk1NDU0NTQ1NDU0NTQ4IiBjcDJ5PSIxMS44MTgxODE4MTgxODE4MTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjI5NTQ1NDU0NTQ1NDU0MSIgeT0iOC40OTk5OTk5OTk5OTk5OTgiIGNwMXg9IjguMjk1NDU0NTQ1NDU0NTQxIiBjcDF5PSI4LjQ5OTk5OTk5OTk5OTk5OCIgY3AyeD0iOC4yOTU0NTQ1NDU0NTQ1NDEiIGNwMnk9IjguNDk5OTk5OTk5OTk5OTk4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODgiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMTMzIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMTc2NDcwNyIgYWxwaGFPZmZzZXQ9Ii0xMjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC43NDk5OTk5OTk5OTk5OTgiIHk9IjEzLjI3MjcyNzI3MjcyNzI4IiBjcDF4PSI0Ljc0OTk5OTk5OTk5OTk5OCIgY3AxeT0iMTMuMjcyNzI3MjcyNzI3MjgiIGNwMng9IjQuNzQ5OTk5OTk5OTk5OTk4IiBjcDJ5PSIxMy4yNzI3MjcyNzI3MjcyOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiB5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMXg9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDF5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiIGNwMng9IjUuNzA0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSIxNC4yOTU0NTQ1NDU0NTQ1NTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjU5MDkwOTA5MDkwOTA5NSIgeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDF4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AxeT0iMTAuNjM2MzYzNjM2MzYzNjQ0IiBjcDJ4PSI5LjU5MDkwOTA5MDkwOTA5NSIgY3AyeT0iMTAuNjM2MzYzNjM2MzYzNjQ0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMDAwMDAwMDAwMDAwMDA1IiB5PSIxNC4zMTgxODE4MTgxODE4MjUiIGNwMXg9IjEzLjAwMDAwMDAwMDAwMDAwNSIgY3AxeT0iMTQuMzE4MTgxODE4MTgxODI1IiBjcDJ4PSIxMy4wMDAwMDAwMDAwMDAwMDUiIGNwMnk9IjE0LjMxODE4MTgxODE4MTgyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjQzMTgxODE4MTgxODE4NSIgeT0iMTIuOTU0NTQ1NDU0NTQ1NDYyIiBjcDF4PSIxNC40MzE4MTgxODE4MTgxODUiIGNwMXk9IjEyLjk1NDU0NTQ1NDU0NTQ2MiIgY3AyeD0iMTQuNDMxODE4MTgxODE4MTg1IiBjcDJ5PSIxMi45NTQ1NDU0NTQ1NDU0NjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4zMTgxODE4MTgxODE4MjIiIHk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDF4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMXk9IjkuNDMxODE4MTgxODE4MTg5IiBjcDJ4PSIxMS4zMTgxODE4MTgxODE4MjIiIGNwMnk9IjkuNDMxODE4MTgxODE4MTg5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMzE4MTgxODE4MTgxODIyIiB5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AxeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDF5PSI2LjEzNjM2MzYzNjM2MzYzNiIgY3AyeD0iMTQuMzE4MTgxODE4MTgxODIyIiBjcDJ5PSI2LjEzNjM2MzYzNjM2MzYzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjk3NzI3MjcyNzI3MjczMiIgeT0iNC41NjgxODE4MTgxODE4MTc1IiBjcDF4PSIxMi45NzcyNzI3MjcyNzI3MzIiIGNwMXk9IjQuNTY4MTgxODE4MTgxODE3NSIgY3AyeD0iMTIuOTc3MjcyNzI3MjcyNzMyIiBjcDJ5PSI0LjU2ODE4MTgxODE4MTgxNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjY1OTA5MDkwOTA5MDkxMiIgeT0iNy45MzE4MTgxODE4MTgxODIiIGNwMXg9IjkuNjU5MDkwOTA5MDkwOTEyIiBjcDF5PSI3LjkzMTgxODE4MTgxODE4MiIgY3AyeD0iOS42NTkwOTA5MDkwOTA5MTIiIGNwMnk9IjcuOTMxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4yNzI3MjcyNzI3MjcyNzIiIHk9IjQuNjEzNjM2MzYzNjM2MzYzIiBjcDF4PSI2LjI3MjcyNzI3MjcyNzI3MiIgY3AxeT0iNC42MTM2MzYzNjM2MzYzNjMiIGNwMng9IjYuMjcyNzI3MjcyNzI3MjcyIiBjcDJ5PSI0LjYxMzYzNjM2MzYzNjM2MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuODg2MzYzNjM2MzYzNjM1IiB5PSI1Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeD0iNC44ODYzNjM2MzYzNjM2MzUiIGNwMXk9IjUuOTc3MjcyNzI3MjcyNzI3IiBjcDJ4PSI0Ljg4NjM2MzYzNjM2MzYzNSIgY3AyeT0iNS45NzcyNzI3MjcyNzI3MjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjExMzYzNjM2MzYzNjM2NSIgeT0iOS40NTQ1NDU0NTQ1NDU0NjciIGNwMXg9IjguMTEzNjM2MzYzNjM2MzY1IiBjcDF5PSI5LjQ1NDU0NTQ1NDU0NTQ2NyIgY3AyeD0iOC4xMTM2MzYzNjM2MzYzNjUiIGNwMnk9IjkuNDU0NTQ1NDU0NTQ1NDY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTguMCIgeTE9IjAuOTU0NTQ1NDU0NTQ1NDU0NiIgeTI9IjE1Ljk1NDU0NTQ1NDU0NTQ1NSIgcm91bmRpbmc9IjYuNzQ5OTk5OTk5OTk5OTkzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzQiIGdyZWVuPSI3MiIgYmx1ZT0iNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIxMjYwOTY1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUzOTc3Mjc1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NCIgZ3JlZW49IjQiIGJsdWU9IjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTczNDA1NjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA5ODAzOTIxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjUwNTY4MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk4MjAzNTkzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1NyIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjAxMTgzNDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA0NzA1ODgyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjU0NDExNzY0NzA1ODgyNSIgeTI9IjEuMDAxNjY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxOS4wIiB5MT0iMC4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjguNjAwMDAwMDAwMDAwMDE0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MyIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjAxMTgzNDQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ5NDExNzY4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTciIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjIwMTE4MzQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMDM5MjE1OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjQ4Njg0MjEwNTI2MzE1NzkiIHkxPSIwLjAwMTQ3MDU4ODIzNTI5NDExNzYiIHgyPSIwLjI0ODY4NDIxMDUyNjMxNTgiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTkuMCIgeTE9IjExLjAiIHkyPSIxOC4wIiByb3VuZGluZz0iNi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTE1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii0xNDAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZjMzJjMzk3LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgICAgICAgPC9yZWdpb25zPgorICAgICAgICAgICAgPC9yZWdpb24+CisgICAgICAgICA8L3JlZ2lvbnM+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpJbnRlcm5hbEZyYW1lLkpEZXNrdG9wSWNvbiIgbmFtZT0iRGVza3RvcEljb24iIHVpPSJEZXNrdG9wSWNvblVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjQiIGJvdHRvbT0iNSIgbGVmdD0iNiIgcmlnaHQ9IjQiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyOCIgaGVpZ2h0PSIyNiIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNC4wIiB4Mj0iMjUuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4yNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjciIGdyZWVuPSIyMjkiIGJsdWU9IjIzMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4ODk3NDU5NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNjQ3MDU4NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcwIiBncmVlbj0iMTc1IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI5NDQ1MjM4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMjcuMCIgeTE9IjEuMCIgeTI9IjIzLjAiIHJvdW5kaW5nPSIzLjEwMDAwMDAwMDAwMDAwMDUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0MCIgZ3JlZW49IjI0MSIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwMjI2MTg1NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjA3IiBibHVlPSIyMTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY4MjcyOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTAxOTYwNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIyNy4wIiB5MT0iMC4wIiB5Mj0iMjQuMCIgcm91bmRpbmc9IjQuODMzMzMzMzMzMzMzMzMxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQzIiBncmVlbj0iNDYiIGJsdWU9IjUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI1NTE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3ODg1MTU2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNDkwMTk2NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgdHlwZT0iamF2YXguc3dpbmcuSkRlc2t0b3BQYW5lIiBuYW1lPSJEZXNrdG9wUGFuZSIgdWk9IkRlc2t0b3BQYW5lVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjMwMCIgaGVpZ2h0PSIyMzIiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQ5IiBncmVlbj0iODEiIGJsdWU9IjEwMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMTI2MTM5NTIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExNjEwNjQ1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzUiIGdyZWVuPSI2MiIgYmx1ZT0iODQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAzODIxNzkwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDUyMzgwOTgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIxOTYwNzg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyMzIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMzIuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTM4LjUiIGNwMXg9IjAuMCIgY3AxeT0iMTM4LjUiIGNwMng9IjAuMCIgY3AyeT0iMTM4LjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMi4wIiB5PSIxODUuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTY1LjUiIGNwMng9IjMyLjAiIGNwMnk9IjIwNC41Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNTAuMCIgeT0iMjMyLjAiIGNwMXg9IjUwLjAiIGNwMXk9IjIzMS41IiBjcDJ4PSI1MC4wIiBjcDJ5PSIyMzIuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MCIgZ3JlZW49IjExMCIgYmx1ZT0iMTQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwNDU3NzU3NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTI4NjcyMDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNSIgZ3JlZW49IjYzIiBibHVlPSI4NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDM0ODgzMDIyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDI2OTEwNTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIxMTc2NDcyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODIuMCIgeT0iMjMyLjAiIGNwMXg9IjgyLjAiIGNwMXk9IjIzMi4wIiBjcDJ4PSI4Mi4wIiBjcDJ5PSIyMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ijc5LjAiIHk9IjE1My4wIiBjcDF4PSI4NC4wIiBjcDF5PSIxOTAuMCIgY3AyeD0iNzQuMCIgY3AyeT0iMTE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1OC4wIiB5PSI1Mi4wIiBjcDF4PSI2Ny4wIiBjcDF5PSI4NS41IiBjcDJ4PSI0OS4wIiBjcDJ5PSIxOC41Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDAuMCIgeT0iMC4wIiBjcDF4PSI0MC4wIiBjcDF5PSIwLjAiIGNwMng9IjQwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjE0Mi4wIiBjcDF4PSIwLjAiIGNwMXk9IjE0Mi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjE0Mi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDUuMCIgeT0iMjMyLjAiIGNwMXg9IjQ1LjAiIGNwMXk9IjIzMS41IiBjcDJ4PSI0NS4wIiBjcDJ5PSIyMzIuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NSIgZ3JlZW49Ijg4IiBibHVlPSIxMTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDA4NDc2MjU3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMjY3ODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMDk4MDM5NDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUzIiBncmVlbj0iODUiIGJsdWU9IjEwOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDg5NTQ3MDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyNjQ1NTAxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAyMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMzU0ODM4NzA5Njc3NDE5MjYiIHkxPSIwLjExNDI4NTcxNDI4NTcxNDMiIHgyPSIwLjQ4Mzg3MDk2Nzc0MTkzNTciIHkyPSIwLjk4MDk1MjM4MDk1MjM4MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxODIuMCIgeT0iMjMyLjAiIGNwMXg9IjE4Mi4wIiBjcDF5PSIyMzIuMCIgY3AyeD0iMTgyLjAiIGNwMnk9IjIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkyLjAiIHk9IjIwNC41IiBjcDF4PSIxODUuMCIgY3AxeT0iMjIxLjUiIGNwMng9IjE5OS4wIiBjcDJ5PSIxODcuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwMy4yNSIgeT0iMTc5Ljc1IiBjcDF4PSIyMDMuMjUiIGNwMXk9IjE3OS43NSIgY3AyeD0iMjAzLjI1IiBjcDJ5PSIxNzkuNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMjIuNSIgeT0iMjA1LjAiIGNwMXg9IjIxMS41IiBjcDF5PSIxOTAuMCIgY3AyeD0iMjMzLjUiIGNwMnk9IjIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQ0LjAiIHk9IjIzMi4wIiBjcDF4PSIyNDQuMCIgY3AxeT0iMjMxLjUiIGNwMng9IjI0NC4wIiBjcDJ5PSIyMzIuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI2MSIgZ3JlZW49Ijk2IiBibHVlPSIxMjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDA5MjA3MjQ5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMzk4NDY1MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDc0NTA5ODMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU0IiBncmVlbj0iODYiIGJsdWU9IjEwOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMTA3NTA0NzMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEzNTcxNDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAyMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMzUxMTIzNTk1NTA1NjE4MSIgeTE9IjAuMDkzMjY0MjQ4NzA0NjYzMjUiIHgyPSIwLjMzNDI2OTY2MjkyMTM0ODM1IiB5Mj0iMC45ODQ2MTUzODQ2MTUzODQ3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1Ni41IiB5PSIyMzIuMCIgY3AxeD0iMTU2LjUiIGNwMXk9IjIzMi4wIiBjcDJ4PSIxNTYuNSIgY3AyeT0iMjMyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNjYuNSIgeT0iMTgwLjUiIGNwMXg9IjE2NC41IiBjcDF5PSIyMDMuMCIgY3AyeD0iMTY4LjUiIGNwMnk9IjE1OC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcwLjUiIHk9IjEzMy43NSIgY3AxeD0iMTcwLjUiIGNwMXk9IjEzMy43NSIgY3AyeD0iMTcwLjUiIGNwMnk9IjEzMy43NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwMy4yNSIgeT0iMTc5Ljc1IiBjcDF4PSIyMDMuMjUiIGNwMXk9IjE3OS43NSIgY3AyeD0iMjAzLjI1IiBjcDJ5PSIxNzkuNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOTUuMjUiIHk9IjIwNy4wIiBjcDF4PSIyMDEuMjUiIGNwMXk9IjE5My4wIiBjcDJ4PSIxODkuMjUiIGNwMnk9IjIyMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTgyLjUiIHk9IjIzMi4wIiBjcDF4PSIxODIuNSIgY3AxeT0iMjMyLjAiIGNwMng9IjE4Mi41IiBjcDJ5PSIyMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49Ijk0IiBibHVlPSIxMjciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTguMDI4NzQ2RS01IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODQ1MzMyMTUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA1MDk4MDQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjkyIiBibHVlPSIxMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDEyNTU5NzEyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMzEzNjY0OSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDk4MDM5MjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjg2NTk2OTU4MTc0OTA0OTMiIHkxPSIwLjAxMTA0OTcyMzc1NjkwNjA3NyIgeDI9IjAuMjQ4MDk4ODU5MzE1NTg5NDIiIHkyPSIwLjk1MDI3NjI0MzA5MzkyMjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcwLjUiIHk9IjEzNC41IiBjcDF4PSIxNzAuNSIgY3AxeT0iMTM0LjUiIGNwMng9IjE3MC41IiBjcDJ5PSIxMzQuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3Mi41IiB5PSI1NS41IiBjcDF4PSIxNzIuNSIgY3AxeT0iODguNSIgY3AyeD0iMTcyLjUiIGNwMnk9IjIyLjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNjguNSIgeT0iMC4wIiBjcDF4PSIxNjguNSIgY3AxeT0iMC4wIiBjcDJ4PSIxNjguNSIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzAwLjAiIHk9IjAuMCIgY3AxeD0iMzAwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMzAwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMwMC4wIiB5PSI0Ni4wIiBjcDF4PSIzMDAuMCIgY3AxeT0iNDYuMCIgY3AyeD0iMzAwLjAiIGNwMnk9IjQ2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNDIuMCIgeT0iMTE3LjAiIGNwMXg9IjI2OS41IiBjcDF5PSI3OC41IiBjcDJ4PSIyMTQuNSIgY3AyeT0iMTU1LjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMDMuMCIgeT0iMTgwLjUiIGNwMXg9IjIwMy4wIiBjcDF5PSIxODAuNSIgY3AyeD0iMjAzLjAiIGNwMnk9IjE4MC41Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iOTQiIGJsdWU9IjEyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItOC4wMjg3NDZFLTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4NDUzMzIxNSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDUwOTgwNDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU2IiBncmVlbj0iODkiIGJsdWU9IjExNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDUyMDUzMzMyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMjI2NzA4MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDk4MDM5MjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC44MzUzNjU4NTM2NTg1MzY3IiB5Mj0iMC45NTIyMDU4ODIzNTI5NDEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwMS41IiB5PSIwLjAiIGNwMXg9IjEwMS41IiBjcDF5PSIwLjAiIGNwMng9IjEwMS41IiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMzIuNSIgeT0iNzIuMCIgY3AxeD0iMTExLjUiIGNwMXk9IjM0LjUiIGNwMng9IjE1My41IiBjcDJ5PSIxMDkuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3Mi4wIiB5PSIxMzUuNSIgY3AxeD0iMTcyLjAiIGNwMXk9IjEzNS41IiBjcDJ4PSIxNzIuMCIgY3AyeT0iMTM1LjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxODIuMCIgeT0iNTYuMCIgY3AxeD0iMTgzLjUiIGNwMXk9Ijg1LjUiIGNwMng9IjE4MC41IiBjcDJ5PSIyNi41Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTgxLjUiIHk9IjAuMCIgY3AxeD0iMTgxLjUiIGNwMXk9IjAuMCIgY3AyeD0iMTgxLjUiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjYiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcwLjAiIHk9IjAuMCIgY3AxeD0iMTcwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMTcwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3MC4wIiB5PSIxMzIuMCIgY3AxeD0iMTcwLjAiIGNwMXk9IjEzMi4wIiBjcDJ4PSIxNzAuMCIgY3AyeT0iMTMyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMDIuNSIgeT0iMTc5LjAiIGNwMXg9IjIwMi41IiBjcDF5PSIxNzkuMCIgY3AyeD0iMjAyLjUiIGNwMnk9IjE3OS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQzLjUiIHk9IjExNS41IiBjcDF4PSIyMjAuMCIgY3AxeT0iMTQ5LjAiIGNwMng9IjI2Ny4wIiBjcDJ5PSI4Mi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzAwLjAiIHk9IjQ2LjUiIGNwMXg9IjMwMC4wIiBjcDF5PSI0Ni41IiBjcDJ4PSIzMDAuMCIgY3AyeT0iNDYuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMwMC4wIiB5PSIwLjAiIGNwMXg9IjMwMC4wIiBjcDF5PSIwLjAiIGNwMng9IjMwMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDgiIGdyZWVuPSI4MyIgYmx1ZT0iMTE0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0zLjY4ODMzNTRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1Njc2NjkyNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTAxOTYwODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUzIiBncmVlbj0iODUiIGJsdWU9IjEwOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDg5NTQ3MDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyNjQ1NTAxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjU0OTAyMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuOTU2NzMwNzY5MjMwNzY5MiIgeTE9IjAuMDY4MzU0NDMwMzc5NzQ2ODQiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIzNi41IiB5PSIyMzIuMCIgY3AxeD0iMjM2LjUiIGNwMXk9IjIzMS41IiBjcDJ4PSIyMzYuNSIgY3AyeT0iMjMyLjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOTYuMCIgeT0iMTc5LjUiIGNwMXg9IjE5Ni4wIiBjcDF5PSIxNzkuNSIgY3AyeD0iMTk2LjAiIGNwMnk9IjE3OS41Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzAwLjAiIHk9IjM0LjAiIGNwMXg9IjMwMC4wIiBjcDF5PSIzNC4wIiBjcDJ4PSIzMDAuMCIgY3AyeT0iMzQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMwMC4wIiB5PSIyMzIuMCIgY3AxeD0iMzAwLjAiIGNwMXk9IjIzMS41IiBjcDJ4PSIzMDAuNSIgY3AyeT0iMjMyLjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzAiIGdyZWVuPSIxMTAiIGJsdWU9IjE0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDQ1Nzc1NzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyODY3MjA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDMiIGdyZWVuPSI3MyIgYmx1ZT0iOTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDA2MzI0NTg5MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDgzNjMwOTgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE3MjU0OTA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iODEuNSIgeT0iMjMyLjAiIGNwMXg9IjgxLjUiIGNwMXk9IjIzMS41IiBjcDJ4PSI4MS41IiBjcDJ5PSIyMzIuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM4LjUiIHk9IjAuMCIgY3AxeD0iMzguNSIgY3AxeT0iMC4wIiBjcDJ4PSIzOC41IiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDUuNSIgeT0iMC4wIiBjcDF4PSIxMDUuNSIgY3AxeT0iMC4wIiBjcDJ4PSIxMDUuNSIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTc2LjAiIHk9IjEzMy41IiBjcDF4PSIxNzYuMCIgY3AxeT0iMTMzLjUiIGNwMng9IjE3Ni4wIiBjcDJ5PSIxMzMuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2Mi41IiB5PSIyMzIuMCIgY3AxeD0iMTYyLjUiIGNwMXk9IjIzMi4wIiBjcDJ4PSIxNjIuNSIgY3AyeT0iMjMyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2UwOTk3NDM0LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSkxhYmVsIiBuYW1lPSJMYWJlbCIgdWk9IkxhYmVsVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgdHlwZT0iamF2YXguc3dpbmcuSkxpc3QiIG5hbWU9Ikxpc3QiIHVpPSJMaXN0VUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxpbmhlcml0LWJhY2tncm91bmQ+ZmFsc2U8L2luaGVyaXQtYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icmVuZGVyZXJVc2VMaXN0Q29sb3JzIiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icmVuZGVyZXJVc2VVSUJvcmRlciIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImNlbGxOb0ZvY3VzQm9yZGVyIiB0eXBlPSJCT1JERVIiPgorICAgICAgICAgICAgICAgICAgIDxib3JkZXIgdHlwZT0iZW1wdHkiIHRvcD0iMiIgbGVmdD0iNSIgYm90dG9tPSIyIiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iZm9jdXNDZWxsSGlnaGxpZ2h0Qm9yZGVyIiB0eXBlPSJCT1JERVIiPgorICAgICAgICAgICAgICAgICAgIDxib3JkZXIgdHlwZT0icGFpbnRlciIgcGFpbnRlcj0iVHJlZTpUcmVlQ2VsbFtFbmFibGVkK0ZvY3VzZWRdLmJhY2tncm91bmRQYWludGVyIiB0b3A9IjIiIGxlZnQ9IjUiIGJvdHRvbT0iMiIgcmlnaHQ9IjUiIC8+CisgICAgICAgICAgICAgICA8L3VpUHJvcGVydHk+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJkcm9wTGluZUNvbG9yIiB0eXBlPSJDT0xPUiI+CisgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDIiIGdyZWVuPSIyNDIiIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICA8L3VpUHJvcGVydHk+CisgICAgICAgICAgICA8L3VpcHJvcGVydGllcz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiIHVpUmVzb3VyY2U9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTciIGdyZWVuPSIxMDUiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzU2VsZWN0aW9uQmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIgdWlSZXNvdXJjZT0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAgICA8L3RleHRCYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0QmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0QmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCtTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3Rpb25CYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIiB1aVJlc291cmNlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgICAgIDwvdGV4dEJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRCYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRCYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiIHVpUmVzb3VyY2U9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zPgorICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgY29tcG9uZW50TmFtZT0iTGlzdC5jZWxsUmVuZGVyZXIiIHR5cGU9ImphdmF4LnN3aW5nLkpMYWJlbCIgbmFtZT0iTGFiZWwiIHVpPSJMYWJlbFVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3Rpb25CYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIiB1aVJlc291cmNlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC1iYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LWJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICAgICA8L3JlZ2lvbnM+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpNZW51QmFyIiBuYW1lPSJNZW51QmFyIiB1aT0iTWVudUJhclVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjIiIGJvdHRvbT0iMiIgbGVmdD0iNiIgcmlnaHQ9IjYiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMjIiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIxIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE4LjAiIHkxPSIwLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDkiIGdyZWVuPSIyNTAiIGJsdWU9IjI1MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDI1NTgxOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzkyMTU2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAzIiBtaWRwb2ludD0iMC4yOCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTAiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MSIgYWxwaGE9IjIyNiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMTExMTExMTA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1NDIyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzkyMTU2NyIgYWxwaGFPZmZzZXQ9Ii0yOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzU2OTQ0NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTI1NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMS4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE4LjAiIHkxPSIwLjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MDE2NzU3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjAiIHkxPSIwLjAiIHgyPSIwLjAiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2M2NzViYTM1LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMzAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjEiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjMwLjAiIHkxPSIyOS4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYm9yZGVyU3RhdGVzPgorICAgICAgICAgPHJlZ2lvbnM+CisgICAgICAgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSk1lbnUiIG5hbWU9Ik1lbnUiIHVpPSJNZW51VUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMSIgYm90dG9tPSIyIiBsZWZ0PSI0IiByaWdodD0iNCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNSIgZ3JlZW49IjM1IiBibHVlPSIzNiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEwMC4wIiB5MT0iMC4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAxMDc1MDQ3MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ4NzU3NzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMS4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnM+CisgICAgICAgICAgICAgICAgICA8cmVnaW9uIG5hbWU9Ik1lbnVJdGVtQWNjZWxlcmF0b3IiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjgwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjgwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iODAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICAgICAgICA8L3JlZ2lvbj4KKyAgICAgICAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgICAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICAgICA8L3JlZ2lvbnM+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpNZW51SXRlbSIgbmFtZT0iTWVudUl0ZW0iIHVpPSJNZW51SXRlbVVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjEiIGJvdHRvbT0iMiIgbGVmdD0iMTIiIHJpZ2h0PSIxMyIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InRleHRJY29uR2FwIiB0eXBlPSJJTlQiIHZhbHVlPSI1Ii8+CisgICAgICAgICAgICA8L3VpcHJvcGVydGllcz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzUiIGdyZWVuPSIzNSIgYmx1ZT0iMzYiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEwMC4wIiB5MT0iMC4wIiB5Mj0iMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iMTA1IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbiIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIxLjAiIHkxPSIwLjAiIHgyPSIxLjAiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDxyZWdpb24gbmFtZT0iTWVudUl0ZW1BY2NlbGVyYXRvciIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iODAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvcmVnaW9uPgorICAgICAgICAgPC9yZWdpb25zPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KUmFkaW9CdXR0b25NZW51SXRlbSIgbmFtZT0iUmFkaW9CdXR0b25NZW51SXRlbSIgdWk9IlJhZGlvQnV0dG9uTWVudUl0ZW1VSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIxIiBib3R0b209IjIiIGxlZnQ9IjEyIiByaWdodD0iMTMiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJ0ZXh0SWNvbkdhcCIgdHlwZT0iSU5UIiB2YWx1ZT0iNSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjM1IiBncmVlbj0iMzUiIGJsdWU9IjM2IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxMDAuMCIgeTE9IjAuMCIgeTI9IjMuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3Rpb24iIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMS4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkK01vdXNlT3ZlciI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEwMC4wIiB5MT0iMC4wIiB5Mj0iMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iMTA1IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbiIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIxLjAiIHkxPSIwLjAiIHgyPSIxLjAiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iY2hlY2tJY29uIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQrU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjkiIGhlaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg5ODM2NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE3NjQ3MDU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjUuNDg3ODA0ODc4MDQ4NzgxIiBjcDF4PSIwLjAiIGNwMXk9IjUuNDg3ODA0ODc4MDQ4NzgxIiBjcDJ4PSIwLjAiIGNwMnk9IjUuNDg3ODA0ODc4MDQ4NzgxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC41NDg3ODA0ODc4MDQ4NzgiIHk9IjEuMDEyMTk1MTIxOTUxMjE5NyIgY3AxeD0iNC41NDg3ODA0ODc4MDQ4NzgiIGNwMXk9IjEuMDEyMTk1MTIxOTUxMjE5NyIgY3AyeD0iNC41NDg3ODA0ODc4MDQ4NzgiIGNwMnk9IjEuMDEyMTk1MTIxOTUxMjE5NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuMCIgeT0iNS41MTIxOTUxMjE5NTEyMiIgY3AxeD0iOS4wIiBjcDF5PSI1LjUxMjE5NTEyMTk1MTIyIiBjcDJ4PSI5LjAiIGNwMnk9IjUuNTEyMTk1MTIxOTUxMjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjUzNjU4NTM2NTg1MzY1OSIgeT0iMTAuMCIgY3AxeD0iNC41MzY1ODUzNjU4NTM2NTkiIGNwMXk9IjEwLjAiIGNwMng9IjQuNTM2NTg1MzY1ODUzNjU5IiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjkiIGhlaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzEiIGdyZWVuPSI3MSIgYmx1ZT0iNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTY2Mzc0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDYyNzQ1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wMTIxOTUxMjE5NTEyMTk1MjMiIHk9IjUuNDg3ODA0ODc4MDQ4NzgxIiBjcDF4PSIwLjAxMjE5NTEyMTk1MTIxOTUyMyIgY3AxeT0iNS40ODc4MDQ4NzgwNDg3ODEiIGNwMng9IjAuMDEyMTk1MTIxOTUxMjE5NTIzIiBjcDJ5PSI1LjQ4NzgwNDg3ODA0ODc4MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuNTQ4NzgwNDg3ODA0ODc4IiB5PSIxLjAxMjE5NTEyMTk1MTIxOTciIGNwMXg9IjQuNTQ4NzgwNDg3ODA0ODc4IiBjcDF5PSIxLjAxMjE5NTEyMTk1MTIxOTciIGNwMng9IjQuNTQ4NzgwNDg3ODA0ODc4IiBjcDJ5PSIxLjAxMjE5NTEyMTk1MTIxOTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjAiIHk9IjUuNTEyMTk1MTIxOTUxMjIiIGNwMXg9IjkuMCIgY3AxeT0iNS41MTIxOTUxMjE5NTEyMiIgY3AyeD0iOS4wIiBjcDJ5PSI1LjUxMjE5NTEyMTk1MTIyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC41MzY1ODUzNjU4NTM2NTkiIHk9IjEwLjAiIGNwMXg9IjQuNTM2NTg1MzY1ODUzNjU5IiBjcDF5PSIxMC4wIiBjcDJ4PSI0LjUzNjU4NTM2NTg1MzY1OSIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZTU4ZTAwZmQucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCtNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjkiIGhlaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAxMjE5NTEyMTk1MTIxOTUyMyIgeT0iNS40ODc4MDQ4NzgwNDg3ODEiIGNwMXg9IjAuMDEyMTk1MTIxOTUxMjE5NTIzIiBjcDF5PSI1LjQ4NzgwNDg3ODA0ODc4MSIgY3AyeD0iMC4wMTIxOTUxMjE5NTEyMTk1MjMiIGNwMnk9IjUuNDg3ODA0ODc4MDQ4NzgxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC41NDg3ODA0ODc4MDQ4NzgiIHk9IjEuMDEyMTk1MTIxOTUxMjE5NyIgY3AxeD0iNC41NDg3ODA0ODc4MDQ4NzgiIGNwMXk9IjEuMDEyMTk1MTIxOTUxMjE5NyIgY3AyeD0iNC41NDg3ODA0ODc4MDQ4NzgiIGNwMnk9IjEuMDEyMTk1MTIxOTUxMjE5NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuMCIgeT0iNS41MTIxOTUxMjE5NTEyMiIgY3AxeD0iOS4wIiBjcDF5PSI1LjUxMjE5NTEyMTk1MTIyIiBjcDJ4PSI5LjAiIGNwMnk9IjUuNTEyMTk1MTIxOTUxMjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjUzNjU4NTM2NTg1MzY1OSIgeT0iMTAuMCIgY3AxeD0iNC41MzY1ODUzNjU4NTM2NTkiIGNwMXk9IjEwLjAiIGNwMng9IjQuNTM2NTg1MzY1ODUzNjU5IiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNlNTkzZjNkMC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8cmVnaW9uIG5hbWU9Ik1lbnVJdGVtQWNjZWxlcmF0b3IiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjgwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjgwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iODAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3JlZ2lvbj4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iSWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9Imljb24iPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE0IiBoZWlnaHQ9IjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE0IiBoZWlnaHQ9IjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTQiIGhlaWdodD0iMTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgPC9yZWdpb25zPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KQ2hlY2tCb3hNZW51SXRlbSIgbmFtZT0iQ2hlY2tCb3hNZW51SXRlbSIgdWk9IkNoZWNrQm94TWVudUl0ZW1VSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIxIiBib3R0b209IjIiIGxlZnQ9IjEyIiByaWdodD0iMTMiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJ0ZXh0SWNvbkdhcCIgdHlwZT0iSU5UIiB2YWx1ZT0iNSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjM1IiBncmVlbj0iMzUiIGJsdWU9IjM2IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxMDAuMCIgeTE9IjAuMCIgeTI9IjMuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3Rpb24iIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMS4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkK01vdXNlT3ZlciI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEwMC4wIiB5MT0iMC4wIiB5Mj0iMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iMTA1IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbiIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIxLjAiIHkxPSIwLjAiIHgyPSIxLjAiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iY2hlY2tJY29uIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQrU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjkiIGhlaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg5ODM2NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE3NjQ3MDU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjUuMCIgY3AxeD0iMC4wIiBjcDF5PSI1LjAiIGNwMng9IjAuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4xNDYzNDE0NjM0MTQ2MzQzIiB5PSI1LjAiIGNwMXg9IjIuMTQ2MzQxNDYzNDE0NjM0MyIgY3AxeT0iNS4wIiBjcDJ4PSIyLjE0NjM0MTQ2MzQxNDYzNDMiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNTYwOTc1NjA5NzU2MDk4IiB5PSI3LjM5MDI0MzkwMjQzOTAzMiIgY3AxeD0iMy41NjA5NzU2MDk3NTYwOTgiIGNwMXk9IjcuMzkwMjQzOTAyNDM5MDMyIiBjcDJ4PSIzLjU2MDk3NTYwOTc1NjA5OCIgY3AyeT0iNy4zOTAyNDM5MDI0MzkwMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2Ljk2MzQxNDYzNDE0NjM0NCIgeT0iMC4wIiBjcDF4PSI2Ljk2MzQxNDYzNDE0NjM0NCIgY3AxeT0iMC4wIiBjcDJ4PSI2Ljk2MzQxNDYzNDE0NjM0NCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSIwLjAiIGNwMXg9IjkuMCIgY3AxeT0iMC4wIiBjcDJ4PSI5LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuMCIgeT0iMC45OTk5OTk5OTk5OTk5OTk4IiBjcDF4PSI5LjAiIGNwMXk9IjAuOTk5OTk5OTk5OTk5OTk5OCIgY3AyeD0iOS4wIiBjcDJ5PSIwLjk5OTk5OTk5OTk5OTk5OTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjE1ODUzNjU4NTM2NTg1OSIgeT0iMS45NzU2MDk3NTYwOTc1NjE0IiBjcDF4PSI4LjE1ODUzNjU4NTM2NTg1OSIgY3AxeT0iMS45NzU2MDk3NTYwOTc1NjE0IiBjcDJ4PSI4LjE1ODUzNjU4NTM2NTg1OSIgY3AyeT0iMS45NzU2MDk3NTYwOTc1NjE0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIxMC4wIiBjcDF4PSI0LjAiIGNwMXk9IjEwLjAiIGNwMng9IjQuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuODY1ODUzNjU4NTM2NTg1MiIgeT0iMTAuMCIgY3AxeD0iMi44NjU4NTM2NTg1MzY1ODUyIiBjcDF5PSIxMC4wIiBjcDJ4PSIyLjg2NTg1MzY1ODUzNjU4NTIiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iOSIgaGVpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MiIgZ3JlZW49IjcyIiBibHVlPSI3MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjgyNzY4NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDU4ODIzNTMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNS4wIiBjcDF4PSIwLjAiIGNwMXk9IjUuMCIgY3AyeD0iMC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjE0NjM0MTQ2MzQxNDYzNDMiIHk9IjUuMCIgY3AxeD0iMi4xNDYzNDE0NjM0MTQ2MzQzIiBjcDF5PSI1LjAiIGNwMng9IjIuMTQ2MzQxNDYzNDE0NjM0MyIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy41NjA5NzU2MDk3NTYwOTgiIHk9IjcuMzkwMjQzOTAyNDM5MDMyIiBjcDF4PSIzLjU2MDk3NTYwOTc1NjA5OCIgY3AxeT0iNy4zOTAyNDM5MDI0MzkwMzIiIGNwMng9IjMuNTYwOTc1NjA5NzU2MDk4IiBjcDJ5PSI3LjM5MDI0MzkwMjQzOTAzMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuOTYzNDE0NjM0MTQ2MzQ0IiB5PSIwLjAiIGNwMXg9IjYuOTYzNDE0NjM0MTQ2MzQ0IiBjcDF5PSIwLjAiIGNwMng9IjYuOTYzNDE0NjM0MTQ2MzQ0IiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5LjAiIHk9IjAuMCIgY3AxeD0iOS4wIiBjcDF5PSIwLjAiIGNwMng9IjkuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSIwLjk5OTk5OTk5OTk5OTk5OTgiIGNwMXg9IjkuMCIgY3AxeT0iMC45OTk5OTk5OTk5OTk5OTk4IiBjcDJ4PSI5LjAiIGNwMnk9IjAuOTk5OTk5OTk5OTk5OTk5OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMTU4NTM2NTg1MzY1ODU5IiB5PSIxLjk3NTYwOTc1NjA5NzU2MTQiIGNwMXg9IjguMTU4NTM2NTg1MzY1ODU5IiBjcDF5PSIxLjk3NTYwOTc1NjA5NzU2MTQiIGNwMng9IjguMTU4NTM2NTg1MzY1ODU5IiBjcDJ5PSIxLjk3NTYwOTc1NjA5NzU2MTQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjEwLjAiIGNwMXg9IjQuMCIgY3AxeT0iMTAuMCIgY3AyeD0iNC4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi44NjU4NTM2NTg1MzY1ODUyIiB5PSIxMC4wIiBjcDF4PSIyLjg2NTg1MzY1ODUzNjU4NTIiIGNwMXk9IjEwLjAiIGNwMng9IjIuODY1ODUzNjU4NTM2NTg1MiIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZTU4YjE5OWUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCtNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjkiIGhlaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjUuMCIgY3AxeD0iMC4wIiBjcDF5PSI1LjAiIGNwMng9IjAuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4xNDYzNDE0NjM0MTQ2MzQzIiB5PSI1LjAiIGNwMXg9IjIuMTQ2MzQxNDYzNDE0NjM0MyIgY3AxeT0iNS4wIiBjcDJ4PSIyLjE0NjM0MTQ2MzQxNDYzNDMiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNTYwOTc1NjA5NzU2MDk4IiB5PSI3LjM5MDI0MzkwMjQzOTAzMiIgY3AxeD0iMy41NjA5NzU2MDk3NTYwOTgiIGNwMXk9IjcuMzkwMjQzOTAyNDM5MDMyIiBjcDJ4PSIzLjU2MDk3NTYwOTc1NjA5OCIgY3AyeT0iNy4zOTAyNDM5MDI0MzkwMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2Ljk2MzQxNDYzNDE0NjM0NCIgeT0iMC4wIiBjcDF4PSI2Ljk2MzQxNDYzNDE0NjM0NCIgY3AxeT0iMC4wIiBjcDJ4PSI2Ljk2MzQxNDYzNDE0NjM0NCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOS4wIiB5PSIwLjAiIGNwMXg9IjkuMCIgY3AxeT0iMC4wIiBjcDJ4PSI5LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjkuMCIgeT0iMC45OTk5OTk5OTk5OTk5OTk4IiBjcDF4PSI5LjAiIGNwMXk9IjAuOTk5OTk5OTk5OTk5OTk5OCIgY3AyeD0iOS4wIiBjcDJ5PSIwLjk5OTk5OTk5OTk5OTk5OTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjE1ODUzNjU4NTM2NTg1OSIgeT0iMS45NzU2MDk3NTYwOTc1NjE0IiBjcDF4PSI4LjE1ODUzNjU4NTM2NTg1OSIgY3AxeT0iMS45NzU2MDk3NTYwOTc1NjE0IiBjcDJ4PSI4LjE1ODUzNjU4NTM2NTg1OSIgY3AyeT0iMS45NzU2MDk3NTYwOTc1NjE0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wIiB5PSIxMC4wIiBjcDF4PSI0LjAiIGNwMXk9IjEwLjAiIGNwMng9IjQuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuODY1ODUzNjU4NTM2NTg1MiIgeT0iMTAuMCIgY3AxeD0iMi44NjU4NTM2NTg1MzY1ODUyIiBjcDF5PSIxMC4wIiBjcDJ4PSIyLjg2NTg1MzY1ODUzNjU4NTIiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2U1OTI1OTEwLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgICAgIDxyZWdpb24gbmFtZT0iTWVudUl0ZW1BY2NlbGVyYXRvciIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iODAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iODAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvcmVnaW9uPgorICAgICAgICAgPC9yZWdpb25zPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KTWVudSIgbmFtZT0iTWVudSIgdWk9Ik1lbnVVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIxIiBib3R0b209IjIiIGxlZnQ9IjEyIiByaWdodD0iNSIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNSIgZ3JlZW49IjM1IiBibHVlPSIzNiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTAwLjAiIHkxPSIwLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iMTA1IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbiIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIxLjAiIHkxPSIwLjAiIHgyPSIxLjAiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iYXJyb3dJY29uIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjkiIGhlaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg5ODM2NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE3NjQ3MDU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEuMCIgY3AxeD0iMC4wIiBjcDF5PSIxLjAiIGNwMng9IjAuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy43NTYwOTc1NjA5NzU1ODkiIHk9IjUuNTEyMTk1MTIxOTUxMjA2IiBjcDF4PSI3Ljc1NjA5NzU2MDk3NTU4OSIgY3AxeT0iNS41MTIxOTUxMjE5NTEyMDYiIGNwMng9IjcuNzU2MDk3NTYwOTc1NTg5IiBjcDJ5PSI1LjUxMjE5NTEyMTk1MTIwNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTAuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iOSIgaGVpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3MSIgZ3JlZW49IjcxIiBibHVlPSI3MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjYzNzQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NjI3NDUxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEuMCIgY3AxeD0iMC4wIiBjcDF5PSIxLjAiIGNwMng9IjAuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy43NTYwOTc1NjA5NzU1ODkiIHk9IjUuNTEyMTk1MTIxOTUxMjA2IiBjcDF4PSI3Ljc1NjA5NzU2MDk3NTU4OSIgY3AxeT0iNS41MTIxOTUxMjE5NTEyMDYiIGNwMng9IjcuNzU2MDk3NTYwOTc1NTg5IiBjcDJ5PSI1LjUxMjE5NTEyMTk1MTIwNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTAuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2U1N2YyNTVlLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iOSIgaGVpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjEiIGJvdHRvbT0iMSIgbGVmdD0iMSIgcmlnaHQ9IjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEuMCIgY3AxeD0iMC4wIiBjcDF5PSIxLjAiIGNwMng9IjAuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy42NzA3MzE3MDczMTcwNjYiIHk9IjUuNDk5OTk5OTk5OTk5OTk4IiBjcDF4PSI3LjY3MDczMTcwNzMxNzA2NiIgY3AxeT0iNS40OTk5OTk5OTk5OTk5OTgiIGNwMng9IjcuNjcwNzMxNzA3MzE3MDY2IiBjcDJ5PSI1LjQ5OTk5OTk5OTk5OTk5OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTAuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2U1OGEyNzVhLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgICAgIDxyZWdpb24gbmFtZT0iTWVudUl0ZW1BY2NlbGVyYXRvciIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iODAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iODAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvcmVnaW9uPgorICAgICAgICAgPC9yZWdpb25zPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9InRydWUiIHR5cGU9ImphdmF4LnN3aW5nLkpQb3B1cE1lbnUiIG5hbWU9IlBvcHVwTWVudSIgdWk9IlBvcHVwTWVudVVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjYiIGJvdHRvbT0iNiIgbGVmdD0iMSIgcmlnaHQ9IjEiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJjb25zdW1lRXZlbnRPbkNsb3NlIiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIyMCIgaGVpZ2h0PSIzMTMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI5IiBib3R0b209IjExIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIyMTkuMCIgeTE9IjEuMCIgeTI9IjMxMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMTUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM3IiBncmVlbj0iMjM5IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjEzNDgyOTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxNTA1MzEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzk5OTk5OTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45OCIgbWlkcG9pbnQ9IjAuOCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzciIGdyZWVuPSIyMzkiIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE1MDUzMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zOTk5OTk5OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjcyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIyMjAuMCIgeTE9IjAuMCIgeTI9IjMxMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg5IiBncmVlbj0iODkiIGJsdWU9Ijg5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM5NjA3ODQ0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjIwIiBoZWlnaHQ9IjMxMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjExIiBib3R0b209IjExIiBsZWZ0PSIyIiByaWdodD0iMiIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIyMTkuMCIgeTE9IjEuMCIgeTI9IjMxMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMTUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM3IiBncmVlbj0iMjM5IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjEzNDgyOTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxNTA1MzEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzk5OTk5OTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45OCIgbWlkcG9pbnQ9IjAuOCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzciIGdyZWVuPSIyMzkiIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE1MDUzMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zOTk5OTk5OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjcyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIyMjAuMCIgeTE9IjAuMCIgeTI9IjMxMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijg5IiBncmVlbj0iODkiIGJsdWU9Ijg5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM5NjA3ODQ0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZGJlYjUxYzIucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KUG9wdXBNZW51JFNlcGFyYXRvciIgbmFtZT0iUG9wdXBNZW51U2VwYXJhdG9yIiB1aT0iUG9wdXBNZW51U2VwYXJhdG9yVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMSIgYm90dG9tPSIyIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIiBpbnZlcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjMiIGhlaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjEiIGJvdHRvbT0iMSIgbGVmdD0iMSIgcmlnaHQ9IjEiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMy4wIiB5MT0iMS4wIiB5Mj0iMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NyIgZ3JlZW49IjE3MiIgYmx1ZT0iMTgwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDg1NDcwMDgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzODMwNDA5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIxLjAiIHgyPSIwLjc1IiB5Mj0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9InRydWUiIHR5cGU9ImphdmF4LnN3aW5nLkpPcHRpb25QYW5lIiBuYW1lPSJPcHRpb25QYW5lIiB1aT0iT3B0aW9uUGFuZVVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjE1IiBib3R0b209IjE1IiBsZWZ0PSIxNSIgcmlnaHQ9IjE1Ii8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9ImNvbnRyb2wiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iYnV0dG9uT3JpZW50YXRpb24iIHR5cGU9IklOVCIgdmFsdWU9IjQiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9Im1lc3NhZ2VBbmNob3IiIHR5cGU9IklOVCIgdmFsdWU9IjE3Ii8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJzZXBhcmF0b3JQYWRkaW5nIiB0eXBlPSJJTlQiIHZhbHVlPSIwIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJzYW1lU2l6ZUJ1dHRvbnMiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiBjb21wb25lbnROYW1lPSJPcHRpb25QYW5lLnNlcGFyYXRvciIgdHlwZT0iamF2YXguc3dpbmcuSlNlcGFyYXRvciIgbmFtZT0iU2VwYXJhdG9yIiB1aT0iU2VwYXJhdG9yVUkiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIxIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIGNvbXBvbmVudE5hbWU9Ik9wdGlvblBhbmUubWVzc2FnZUFyZWEiIHR5cGU9ImphdmF4LnN3aW5nLkpQYW5lbCIgbmFtZT0iUGFuZWwiIHVpPSJQYW5lbFVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIxMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiBjb21wb25lbnROYW1lPSJPcHRpb25QYW5lLmxhYmVsIiB0eXBlPSJqYXZheC5zd2luZy5KTGFiZWwiIG5hbWU9IkxhYmVsIiB1aT0iTGFiZWxVSSIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMTAiIGxlZnQ9IjEwIiByaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEwMC4wIiB5MT0iMC4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgICAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgICAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9IkVycm9ySWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9ImVycm9ySWNvbiIgYmFzaWNLZXk9Ik9wdGlvblBhbmUuZXJyb3JJY29uIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjU8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iNjgiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjc5ODgxNjU2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMzNzI1NDg4IiBhbHBoYU9mZnNldD0iLTE4NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjEzLjY4NzUiIGNwMXg9IjEuMCIgY3AxeT0iMTMuNjg3NSIgY3AyeD0iMS4wIiBjcDJ5PSIxMy42ODc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuNDM3NSIgeT0iMS4wIiBjcDF4PSIxMy40Mzc1IiBjcDF5PSIxLjAiIGNwMng9IjEzLjQzNzUiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMyLjU2MjUiIHk9IjEuMCIgY3AxeD0iMzIuNTYyNSIgY3AxeT0iMS4wIiBjcDJ4PSIzMi41NjI1IiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NS4wIiB5PSIxMy41IiBjcDF4PSI0NS4wIiBjcDF5PSIxMy41IiBjcDJ4PSI0NS4wIiBjcDJ5PSIxMy41Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDUuMCIgeT0iMzIuMCIgY3AxeD0iNDUuMCIgY3AxeT0iMzIuMCIgY3AyeD0iNDUuMCIgY3AyeT0iMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMyLjAiIHk9IjQ1LjAiIGNwMXg9IjMyLjAiIGNwMXk9IjQ1LjAiIGNwMng9IjMyLjAiIGNwMnk9IjQ1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy42ODc1IiB5PSI0NC45Mzc1IiBjcDF4PSIxMy42ODc1IiBjcDF5PSI0NC45Mzc1IiBjcDJ4PSIxMy42ODc1IiBjcDJ5PSI0NC45Mzc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wNjI1IiB5PSIzMi4zMTI1IiBjcDF4PSIxLjA2MjUiIGNwMXk9IjMyLjMxMjUiIGNwMng9IjEuMDYyNSIgY3AyeT0iMzIuMzEyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMjQuMCIgY3AxeD0iMS4wIiBjcDF5PSIyNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjI0LjAiIGNwMXg9IjIuMCIgY3AxeT0iMjQuMCIgY3AyeD0iMi4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIzMi4wIiBjcDF4PSIyLjAiIGNwMXk9IjMyLjAiIGNwMng9IjIuMCIgY3AyeT0iMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjQ0LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjQ0LjAiIGNwMng9IjE0LjAiIGNwMnk9IjQ0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzMi4wIiB5PSI0NC4wIiBjcDF4PSIzMi4wIiBjcDF5PSI0NC4wIiBjcDJ4PSIzMi4wIiBjcDJ5PSI0NC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iMzIuMCIgY3AxeD0iNDQuMCIgY3AxeT0iMzIuMCIgY3AyeD0iNDQuMCIgY3AyeT0iMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjE0LjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjE0LjAiIGNwMng9IjQ0LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzMi4wIiB5PSIyLjAiIGNwMXg9IjMyLjAiIGNwMXk9IjIuMCIgY3AyeD0iMzIuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIyLjAiIGNwMng9IjE0LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTQuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjI0LjAiIGNwMXg9IjIuMCIgY3AxeT0iMjQuMCIgY3AyeD0iMi4wIiBjcDJ5PSIyNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIyNC4wIiBjcDF4PSIxLjAiIGNwMXk9IjI0LjAiIGNwMng9IjEuMCIgY3AyeT0iMjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMjAuMCIgeDI9IjI2LjAiIHkxPSIzMi4wIiB5Mj0iMzguMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTAiIGdyZWVuPSIyNTAiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjI3NDUwOTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMjc0NTA5NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuMCIgeT0iMTEuMCIgY3AxeD0iMjAuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMjAuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjMuMCIgeT0iOC4wIiBjcDF4PSIyMS4wIiBjcDF5PSI4LjAiIGNwMng9IjI1LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI2LjAiIHk9IjExLjAiIGNwMXg9IjI2LjAiIGNwMXk9IjkuMCIgY3AyeD0iMjYuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI0LjAiIHk9IjI5LjAiIGNwMXg9IjI0LjAiIGNwMXk9IjI5LjAiIGNwMng9IjI0LjAiIGNwMnk9IjI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMi4wIiB5PSIyOS4wIiBjcDF4PSIyMi4wIiBjcDF5PSIyOS4wIiBjcDJ4PSIyMi4wIiBjcDJ5PSIyOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI1IiBncmVlbj0iMTM2IiBibHVlPSIxMzYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQwMzI2MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM0NTE2MTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk4IiBncmVlbj0iNTQiIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzE1NDM4MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMTM3MjU0OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY4Mzg3MSIgbWlkcG9pbnQ9IjAuNjgzNjczNDQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg3IiBncmVlbj0iMTciIGJsdWU9IjE3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjExMDI3NDM3NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNzA1ODgyMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM1IiBncmVlbj0iNjAiIGJsdWU9IjYwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNSZWQiIGh1ZU9mZnNldD0iLTAuMDE0ODE0ODE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTQxMzU3NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTQuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzIuMCIgeT0iMS4wIiBjcDF4PSIzMi4wIiBjcDF5PSIxLjAiIGNwMng9IjMyLjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ1LjAiIHk9IjE0LjAiIGNwMXg9IjQ1LjAiIGNwMXk9IjE0LjAiIGNwMng9IjQ1LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NS4wIiB5PSIzMi4wIiBjcDF4PSI0NS4wIiBjcDF5PSIzMi4wIiBjcDJ4PSI0NS4wIiBjcDJ5PSIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzIuMCIgeT0iNDUuMCIgY3AxeD0iMzIuMCIgY3AxeT0iNDUuMCIgY3AyeD0iMzIuMCIgY3AyeT0iNDUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjQ1LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjQ1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjQ1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjMyLjAiIGNwMXg9IjEuMCIgY3AxeT0iMzIuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MyIgZ3JlZW49IjMiIGJsdWU9IjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1JlZCIgaHVlT2Zmc2V0PSItMC4wMTQ4MTQ4MTQiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTgzODQyNDIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEzLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMC4wIiBjcDF4PSIxMy4wIiBjcDF5PSIwLjAiIGNwMng9IjEzLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMzLjAiIHk9IjAuMCIgY3AxeD0iMzMuMCIgY3AxeT0iMC4wIiBjcDJ4PSIzMy4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0Ni4wIiB5PSIxMy4wIiBjcDF4PSI0Ni4wIiBjcDF5PSIxMy4wIiBjcDJ4PSI0Ni4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDYuMCIgeT0iMzMuMCIgY3AxeD0iNDYuMCIgY3AxeT0iMzMuMCIgY3AyeD0iNDYuMCIgY3AyeT0iMzMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMzLjAiIHk9IjQ2LjAiIGNwMXg9IjMzLjAiIGNwMXk9IjQ2LjAiIGNwMng9IjMzLjAiIGNwMnk9IjQ2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI0Ni4wIiBjcDF4PSIxMy4wIiBjcDF5PSI0Ni4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI0Ni4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIzMy4wIiBjcDF4PSIwLjAiIGNwMXk9IjMzLjAiIGNwMng9IjAuMCIgY3AyeT0iMzMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRyb3BTaGFkb3cgYmxlbmRpbmdNb2RlPSJOT1JNQUwiIG9wYWNpdHk9IjAuMjgiIGFuZ2xlPSIxMzUiIGRpc3RhbmNlPSIyIiBzcHJlYWQ9IjAiIHNpemU9IjMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHJvcFNoYWRvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWZmZWN0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MDYzOTNlYmMucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgICAgPHVpSWNvblJlZ2lvbiBuYW1lPSJJbmZvcm1hdGlvbkljb24iIHN1YnJlZ2lvbj0idHJ1ZSIga2V5PSJpbmZvcm1hdGlvbkljb24iIGJhc2ljS2V5PSJPcHRpb25QYW5lLmluZm9ybWF0aW9uSWNvbiI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD40PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIwLjAiIHgyPSIyNi4wIiB5MT0iOC4wIiB5Mj0iMTQuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTAiIGdyZWVuPSIyNTAiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjIzNTI5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUwIiBncmVlbj0iMjUwIiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iLTAuNjExMTExMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIxOTYwNzgzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIxOC4wIiBjcDF4PSIxNS41IiBjcDF5PSIxOC4wIiBjcDJ4PSIyMC41IiBjcDJ5PSIxOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQuMCIgeT0iMTguMCIgY3AxeD0iMjIuODEyNSIgY3AxeT0iMTguMCIgY3AyeD0iMjUuMTg3NSIgY3AyeT0iMTguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI2LjAiIHk9IjIxLjAiIGNwMXg9IjI2LjAiIGNwMXk9IjE5LjAiIGNwMng9IjI2LjAiIGNwMnk9IjIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNi4wIiB5PSIzMy4wIiBjcDF4PSIyNi4wIiBjcDF5PSIzMy4wIiBjcDJ4PSIyNi4wIiBjcDJ5PSIzMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjguOTM3NSIgeT0iMzMuMCIgY3AxeD0iMjYuMzc1IiBjcDF5PSIzMy4wNjI1IiBjcDJ4PSIzMS41IiBjcDJ5PSIzMi45Mzc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjkuMCIgeT0iMzcuMCIgY3AxeD0iMzEuNTYyNSIgY3AxeT0iMzcuMCIgY3AyeD0iMjYuNDM3NSIgY3AyeT0iMzcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjEyNSIgeT0iMzcuMCIgY3AxeD0iMTkuNjI1IiBjcDF5PSIzNy4wNjI1IiBjcDJ4PSIxNC42MjUiIGNwMnk9IjM2LjkzNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSIzMy4wIiBjcDF4PSIxNC41NjI1IiBjcDF5PSIzMy4wIiBjcDJ4PSIxOS40Mzc1IiBjcDJ5PSIzMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuMCIgeT0iMzMuMCIgY3AxeD0iMjAuMCIgY3AxeT0iMzMuMCIgY3AyeD0iMjAuMCIgY3AyeT0iMzMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjAiIHk9IjIyLjAiIGNwMXg9IjIwLjAiIGNwMXk9IjIyLjAiIGNwMng9IjIwLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIyMi4wIiBjcDF4PSIyMC43NSIgY3AxeT0iMjIuMCIgY3AyeD0iMTUuMjUiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSI0NC4wIiB5MT0iMi4wIiB5Mj0iNDQuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTUwIiBncmVlbj0iMTc1IiBibHVlPSIyMjIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0luZm9CbHVlIiBodWVPZmZzZXQ9Ii0wLjAwMTQ3OTM4NzMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQxNDU2NDU1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2NDcwNTg3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjg0MjQ2NTYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzgiIGdyZWVuPSIxMTYiIGJsdWU9IjE5MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzSW5mb0JsdWUiIGh1ZU9mZnNldD0iMy40Mzc5OTZFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE0NzI2NTg1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA0MzEzNzI1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDgiIGdyZWVuPSI5MyIgYmx1ZT0iMTgwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNJbmZvQmx1ZSIgaHVlT2Zmc2V0PSItNC4yNzE4NjVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwNTU1NTUxMDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjcxOTE3ODEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDciIGdyZWVuPSI5MiIgYmx1ZT0iMTgwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNJbmZvQmx1ZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NyIgZ3JlZW49IjEzNCIgYmx1ZT0iMjI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNJbmZvQmx1ZSIgaHVlT2Zmc2V0PSItNy44NjY2MjFFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyNzI4MTczIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE3MjU0OTAxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMS4wIiB4Mj0iNDUuMCIgeTE9IjEuMCIgeTI9IjQ1LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MiIgZ3JlZW49IjE4NSIgYmx1ZT0iMjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNJbmZvQmx1ZSIgaHVlT2Zmc2V0PSItOC4yMjk2MTMzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NDYzMTI0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTIxNTY4NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ4Mjg3NjcyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY0IiBncmVlbj0iMTA2IiBibHVlPSIxOTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0luZm9CbHVlIiBodWVPZmZzZXQ9IjAuMDAxMjcyOTE2OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczOTY3NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkzIiBncmVlbj0iMTM5IiBibHVlPSIyMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0luZm9CbHVlIiBodWVPZmZzZXQ9IjguMzU0MTg3RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xNDE0ODYyOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjAuMCIgeDI9IjQ2LjAiIHkxPSIwLjAiIHkyPSI0Ni4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzMyIgZ3JlZW49Ijc4IiBibHVlPSIxNjYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0luZm9CbHVlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wNjIzMTU5NCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDU0OTAxOTU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNCIgZ3JlZW49IjYwIiBibHVlPSIxMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0luZm9CbHVlIiBodWVPZmZzZXQ9IjMuMTYyMDI2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wNzc5MDUwNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTkyMTU2ODUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjAuMCIgeDI9IjAuMCIgeTE9IjAuMCIgeTI9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcFNoYWRvdyBibGVuZGluZ01vZGU9Ik5PUk1BTCIgb3BhY2l0eT0iMC4zNSIgYW5nbGU9IjEzNSIgZGlzdGFuY2U9IjIiIHNwcmVhZD0iMCIgc2l6ZT0iNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kcm9wU2hhZG93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lZmZlY3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwOWZkMGFlMS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9IlF1ZXN0aW9uSWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9InF1ZXN0aW9uSWNvbiIgYmFzaWNLZXk9Ik9wdGlvblBhbmUucXVlc3Rpb25JY29uIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMjAuMCIgeDI9IjI2LjAiIHkxPSIzMi4wIiB5Mj0iMzguMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxNy44NzUiIGNwMXg9IjEzLjUiIGNwMXk9IjE2LjUiIGNwMng9IjE2LjUiIGNwMnk9IjE5LjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkuMTg3NSIgeT0iMTcuMTg3NSIgY3AxeD0iMTguNDM3NSIgY3AxeT0iMTguMzc1IiBjcDJ4PSIxOS45Mzc1IiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjIuNSIgeT0iMTMuOTM3NSIgY3AxeD0iMjAuNjg3NSIgY3AxeT0iMTMuOTM3NSIgY3AyeD0iMjQuMzEyNSIgY3AyeT0iMTMuOTM3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI1LjY4NzUiIHk9IjE2LjgxMjUiIGNwMXg9IjI1LjY4NzUiIGNwMXk9IjE1LjI1IiBjcDJ4PSIyNS42ODc1IiBjcDJ5PSIxOC4zNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMi41NjI1IiB5PSIyMC41NjI1IiBjcDF4PSIyMy44MTI1IiBjcDF5PSIxOS4zNzUiIGNwMng9IjIxLjMxMjUiIGNwMnk9IjIxLjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuMDYyNSIgeT0iMjYuMTI1IiBjcDF4PSIyMC4wIiBjcDF5PSIyNC42MjUiIGNwMng9IjIwLjEyNSIgY3AyeT0iMjcuNjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjIuODc1IiB5PSIyOC45Mzc1IiBjcDF4PSIyMS41NjI1IiBjcDF5PSIyOC45Mzc1IiBjcDJ4PSIyNC4xODc1IiBjcDJ5PSIyOC45Mzc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjUuOTM3NSIgeT0iMjYuMjUiIGNwMXg9IjI1LjkzNzUiIGNwMXk9IjI3Ljg3NSIgY3AyeD0iMjUuOTM3NSIgY3AyeT0iMjQuNjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjkuNDM3NSIgeT0iMjIuMzEyNSIgY3AxeD0iMjguMjUiIGNwMXk9IjIzLjU2MjUiIGNwMng9IjMwLjYyNSIgY3AyeT0iMjEuMDYyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMyLjAiIHk9IjE2LjYyNSIgY3AxeD0iMzIuMDYyNSIgY3AxeT0iMTkuOTM3NSIgY3AyeD0iMzEuOTM3NSIgY3AyeT0iMTMuMzEyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIzLjE4NzUiIHk9IjguMDYyNSIgY3AxeD0iMjkuMzEyNSIgY3AxeT0iOC4wIiBjcDJ4PSIxNy4wNjI1IiBjcDJ5PSI4LjEyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjYyNSIgeT0iMTMuODc1IiBjcDF4PSIxNS4wNjI1IiBjcDF5PSIxMi42MjUiIGNwMng9IjE0LjE4NzUiIGNwMnk9IjE1LjEyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjQ0LjAiIHkxPSIyLjAiIHkyPSI0NC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTkiIGdyZWVuPSIxNjMiIGJsdWU9IjE2OCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC4wMTg1MTg1NjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1Njk1NDg4NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDg2Mjc0NTA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzA0Nzk0NTIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE2IiBncmVlbj0iMTIyIiBibHVlPSIxMzAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iLTAuMDE1ODcyOTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDI4MzQwMDcxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjU0MTA5NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NiIgZ3JlZW49IjEwNCIgYmx1ZT0iMTEyIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMzIzMzA4MzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMwNTg4MjM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTgiIGdyZWVuPSIxMjgiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDM0NDAxMjE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjEuMCIgeDI9IjQ1LjAiIHkxPSIxLjAiIHkyPSI0NS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjgiIGdyZWVuPSIxNzMiIGJsdWU9IjE3OCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1NDM0NjU0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNDcwNTg4MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTAxIiBncmVlbj0iMTA5IiBibHVlPSIxMTgiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iLTAuMDIyODc1Nzg2IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAzMzU0MTQ4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yODIzNTI5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjAuMCIgeDI9IjQ2LjAiIHkxPSIwLjAiIHkyPSI0Ni4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxMjAiIGJsdWU9IjEyNiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC4wMjAyMDIwNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIzMjI0NzI2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNTA5ODA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNiIgZ3JlZW49IjM0IiBibHVlPSI0MyIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC4wMjI4NzU3ODYiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMjg0ODIyNTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU3NjQ3MDYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcFNoYWRvdyBibGVuZGluZ01vZGU9Ik5PUk1BTCIgb3BhY2l0eT0iMC40MyIgYW5nbGU9IjEzNSIgZGlzdGFuY2U9IjIiIHNwcmVhZD0iMCIgc2l6ZT0iMyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kcm9wU2hhZG93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lZmZlY3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwOWYxYmRlYy5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9Ildhcm5pbmdJY29uIiBzdWJyZWdpb249InRydWUiIGtleT0id2FybmluZ0ljb24iIGJhc2ljS2V5PSJPcHRpb25QYW5lLndhcm5pbmdJY29uIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMjEuMCIgeDI9IjI3LjAiIHkxPSIzNS4wIiB5Mj0iNDEuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNiIgZ3JlZW49IjE2IiBibHVlPSIxNiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjY4MjM1Mjk2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjkiIGdyZWVuPSI2OSIgYmx1ZT0iNjkiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iLTAuNjExMTExMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NzQ1MDk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI0LjAiIHk9IjExLjAiIGNwMXg9IjIyLjAiIGNwMXk9IjExLjAiIGNwMng9IjI2LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNy4wIiB5PSIxNS4wIiBjcDF4PSIyNy4wIiBjcDF5PSIxMy4wIiBjcDJ4PSIyNy4wIiBjcDJ5PSIxNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQuMCIgeT0iMzIuMCIgY3AxeD0iMjUuMzEyNSIgY3AxeT0iMzIuMCIgY3AyeD0iMjIuNjg3NSIgY3AyeT0iMzIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIxLjAiIHk9IjE1LjAiIGNwMXg9IjIxLjAiIGNwMXk9IjE3LjAiIGNwMng9IjIxLjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIzNyIgYmx1ZT0iMTM5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNBbGVydFllbGxvdyIgaHVlT2Zmc2V0PSI2LjUzMDg4MUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDA3ODQzMTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM0NTg5MDQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjI0IiBibHVlPSI2MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQWxlcnRZZWxsb3ciIGh1ZU9mZnNldD0iLTMuOTQ1Njc4NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA5ODAzOTE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42NDA0MTA5NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMjAiIGJsdWU9IjM1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNBbGVydFllbGxvdyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuODI1MzQyNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMzIiIGJsdWU9IjQ3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNBbGVydFllbGxvdyIgaHVlT2Zmc2V0PSIwLjAwODA4NTY2OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ3MDU4ODIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSI4MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQWxlcnRZZWxsb3ciIGh1ZU9mZnNldD0iMC4wMjY1MTUxNTYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE4NDMxMzcxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjMuOTM3NSIgeT0iMi4wNjI1IiBjcDF4PSIyMi4xODc1IiBjcDF5PSIyLjA2MjUiIGNwMng9IjI1LjY4NzUiIGNwMnk9IjIuMDYyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI2LjYyNSIgeT0iNC41NjI1IiBjcDF4PSIyNi42MjUiIGNwMXk9IjQuNTYyNSIgY3AyeD0iMjYuNjI1IiBjcDJ5PSI0LjU2MjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC43NSIgeT0iMzguNDM3NSIgY3AxeD0iNDQuNzUiIGNwMXk9IjM4LjQzNzUiIGNwMng9IjQ0Ljc1IiBjcDJ5PSIzOC40Mzc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDUuOTM3NSIgeT0iNDIuMCIgY3AxeD0iNDUuOTM3NSIgY3AxeT0iNDAuNTYyNSIgY3AyeD0iNDUuOTM3NSIgY3AyeT0iNDMuNDM3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQyLjQzNzUiIHk9IjQ0LjAiIGNwMXg9IjQyLjQzNzUiIGNwMXk9IjQ0LjAiIGNwMng9IjQyLjQzNzUiIGNwMnk9IjQ0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjgxMjUiIHk9IjQ0LjAiIGNwMXg9IjQuODEyNSIgY3AxeT0iNDQuMCIgY3AyeD0iNC44MTI1IiBjcDJ5PSI0NC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4xODc1IiB5PSI0MS44NzUiIGNwMXg9IjIuMjUiIGNwMXk9IjQzLjUiIGNwMng9IjIuMTI1IiBjcDJ5PSI0MC4yNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNjI1IiB5PSIzNy45Mzc1IiBjcDF4PSIzLjYyNSIgY3AxeT0iMzcuOTM3NSIgY3AyeD0iMy42MjUiIGNwMnk9IjM3LjkzNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMS4xODc1IiB5PSI0LjkzNzUiIGNwMXg9IjIxLjE4NzUiIGNwMXk9IjQuOTM3NSIgY3AyeD0iMjEuMTg3NSIgY3AyeT0iNC45Mzc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNiIgZ3JlZW49IjE4MSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQWxlcnRZZWxsb3ciIGh1ZU9mZnNldD0iLTQuOTEwMjMwNkUtNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4xMzcyNTQ5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNTI5NDExNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY2IiBncmVlbj0iMTM4IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNBbGVydFllbGxvdyIgaHVlT2Zmc2V0PSItMC4wMDE1OTczMDAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjEzNzI1NDkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM0OTAxOTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQuMCIgeT0iMS4wIiBjcDF4PSIyMi4wIiBjcDF5PSIxLjAiIGNwMng9IjI2LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI3LjE4NzUiIHk9IjMuOTM3NSIgY3AxeD0iMjcuMTg3NSIgY3AxeT0iMy45Mzc1IiBjcDJ4PSIyNy4xODc1IiBjcDJ5PSIzLjkzNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NS4yNSIgeT0iMzcuNDM3NSIgY3AxeD0iNDUuMjUiIGNwMXk9IjM3LjQzNzUiIGNwMng9IjQ1LjI1IiBjcDJ5PSIzNy40Mzc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDYuODEyNSIgeT0iNDIuMjUiIGNwMXg9IjQ2LjgxMjUiIGNwMXk9IjM5Ljg3NSIgY3AyeD0iNDYuODEyNSIgY3AyeT0iNDQuNjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iNDUuMCIgY3AxeD0iNDQuMCIgY3AxeT0iNDUuMCIgY3AyeD0iNDQuMCIgY3AyeT0iNDUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNDUuMCIgY3AxeD0iNC4wIiBjcDF5PSI0NS4wIiBjcDJ4PSI0LjAiIGNwMnk9IjQ1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjE4NzUiIHk9IjQyLjMxMjUiIGNwMXg9IjEuMzEyNSIgY3AxeT0iNDQuNTYyNSIgY3AyeD0iMS4wNjI1IiBjcDJ5PSI0MC4wNjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi44NzUiIHk9IjM3LjUiIGNwMXg9IjIuODc1IiBjcDF5PSIzNy41IiBjcDJ4PSIyLjg3NSIgY3AyeT0iMzcuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIxLjAiIHk9IjQuMCIgY3AxeD0iMjEuMCIgY3AxeT0iNC4wIiBjcDJ4PSIyMS4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRyb3BTaGFkb3cgYmxlbmRpbmdNb2RlPSJOT1JNQUwiIG9wYWNpdHk9IjAuMjIiIGFuZ2xlPSIxMzUiIGRpc3RhbmNlPSIyIiBzcHJlYWQ9IjAiIHNpemU9IjMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHJvcFNoYWRvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWZmZWN0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MGEwODQyMGEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICA8L3JlZ2lvbnM+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgdHlwZT0iamF2YXguc3dpbmcuSlBhbmVsIiBuYW1lPSJQYW5lbCIgdWk9IlBhbmVsVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KUHJvZ3Jlc3NCYXIiIG5hbWU9IlByb2dyZXNzQmFyIiB1aT0iUHJvZ3Jlc3NCYXJVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJFbmFibGVkIi8+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRGlzYWJsZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJJbmRldGVybWluYXRlIj4KKyAgICAgICAgICAgICAgIDxjb2RlU25pcHBldD48IVtDREFUQVsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEpQcm9ncmVzc0JhciljKS5pc0luZGV0ZXJtaW5hdGUoKTsKKyAgICAgICAgICAgICAgIF1dPjwvY29kZVNuaXBwZXQ+CisgICAgICAgICAgICA8L3N0YXRlVHlwZT4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJGaW5pc2hlZCI+CisgICAgICAgICAgICAgICA8Y29kZVNuaXBwZXQ+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChKUHJvZ3Jlc3NCYXIpYykuZ2V0UGVyY2VudENvbXBsZXRlKCkgPT0gMS4wOworICAgICAgICAgICAgICAgIF1dPjwvY29kZVNuaXBwZXQ+CisgICAgICAgICAgICA8L3N0YXRlVHlwZT4KKyAgICAgICAgIDwvc3RhdGVUeXBlcz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJ0aWxlV2hlbkluZGV0ZXJtaW5hdGUiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJ0aWxlV2lkdGgiIHR5cGU9IklOVCIgdmFsdWU9IjI3Ii8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJwYWludE91dHNpZGVDbGlwIiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icm90YXRlVGV4dCIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InZlcnRpY3RhbFNpemUiIHR5cGU9IkRJTUVOU0lPTiI+CisgICAgICAgICAgICAgICAgICA8ZGltZW5zaW9uIHdpZHRoPSIxOSIgaGVpZ2h0PSIxNTAiLz4KKyAgICAgICAgICAgICAgIDwvdWlQcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9Imhvcml6b250YWxTaXplIiB0eXBlPSJESU1FTlNJT04iPgorICAgICAgICAgICAgICAgICAgPGRpbWVuc2lvbiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICA8L3VpUHJvcGVydHk+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJjeWNsZVRpbWUiIHR5cGU9IklOVCIgdmFsdWU9IjI1MCIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjI5IiBoZWlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIyNi4wIiB5MT0iMy4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAzODcwOTY3OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wODA2NDUxNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzUiIGdyZWVuPSIyMzYiIGJsdWU9IjIzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTc5MjEyNzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTg4MjM1MjgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zOTM1NDg0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOCIgZ3JlZW49IjIxOSIgYmx1ZT0iMjIyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAxMzg4ODg5NTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5MjUwODMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI1NDkwMTkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40Mzg3MDk2OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDYiIGdyZWVuPSIyMDgiIGJsdWU9IjIxMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODIyMjQ0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wODYyNzQ1MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45MDk2Nzc0NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjciIGdyZWVuPSIyMjkiIGJsdWU9IjIzMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODQ3NzUyNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNjg2Mjc0NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkxOTM1NDg2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OSIgZ3JlZW49IjI1MSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4Njk5NjkwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIyNy4wIiB5MT0iMi4wIiB5Mj0iMTcuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM2IiBncmVlbj0iMTM5IiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ4NDU3MzUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE3NjQ3MDU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzQiIGdyZWVuPSIxNzciIGJsdWU9IjE4MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjEzNDU5ODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyNzQ1MDk3OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MDUxNDgwMWQucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjI5IiBoZWlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIyNi4wIiB5MT0iMy4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAzODcwOTY3OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzUiIGdyZWVuPSIyMzYiIGJsdWU9IjIzOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMTM4ODg4OTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTM3ODk5MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTIxNTY4NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA4MDY0NTE2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNSIgZ3JlZW49IjIyNyIgYmx1ZT0iMjMxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4NDU1MjI5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2MDc4NDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zOTM1NDg0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNyIgZ3JlZW49IjIyMCIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4MzYyMDQ5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDM4NzA5NjgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEwIiBncmVlbj0iMjEyIiBibHVlPSIyMTciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzgyNjgyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkwOTY3NzQ1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMSIgZ3JlZW49IjIyMyIgYmx1ZT0iMjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc5ODI0NTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTQ5MDE5NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkyMjU4MDY2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMCIgZ3JlZW49IjIzMiIgYmx1ZT0iMjM3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDgwOTkwNDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTg0MzEzNzEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMjcuMCIgeTE9IjIuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNTQ4Mzg3MSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzUiIGdyZWVuPSIxNzgiIGJsdWU9IjE4NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjE2MTMyNzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUxNjEyOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTMiIGdyZWVuPSIxOTciIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MTI2NTIzNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MWZlN2RiZDcucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjI3IiBoZWlnaHQ9IjE5Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIyNi4wIiB5MT0iMy4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAzODcwOTY3OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzYiIGdyZWVuPSIyMDkiIGJsdWU9IjE3OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuMDAzOTQwMzI5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43Mzc1MzIyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE3NjQ3MDU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDgzODcwOTciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE5IiBncmVlbj0iMTY3IiBibHVlPSIxMDciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwNTUwNjczOSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDY3NjQyMDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDYxMjkwMzMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAzIiBncmVlbj0iMTI3IiBibHVlPSI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuMDA0MjEyNzQ0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTg1OTU0MTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDQ3MDU4ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41MTkzNTQ4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49IjEwMiIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuMDA0NzYyNjk0MiIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMDM5MjE1Njg0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTE2MTI5MDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMyIiBncmVlbj0iMTQyIiBibHVlPSI0MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuMDA0NzYyNjk0MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTUxNDcxMzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTYwNzg0MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkzMjI1ODA3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjE3NyIgYmx1ZT0iNzUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAxMDY2NTQ3NiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjczMTc1MjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjUwOTgwMzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMjcuMCIgeTE9IjIuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wMzg3MDk2NzgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTUyIiBncmVlbj0iNjIiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wMTU3OTY1MTIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDIwOTQyMzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE1Mjk0MTE3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDcwOTY3NzQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcyIiBncmVlbj0iODIiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wMDQzMjE2MDUiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDIwOTQyMzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA3NDUwOTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40OTAzMjI2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NSIgZ3JlZW49Ijc1IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDA4MDIxMzk5IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMDE5NjA3OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkwMzIyNTgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg1IiBncmVlbj0iMTAxIiBibHVlPSIzNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxMTcwNjkwNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTc5MDU3NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NDUxNjEzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNCIgZ3JlZW49IjI0IiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDQ4NjkxMjU0IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMDE5NjA4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkxIiBncmVlbj0iOTgiIGJsdWU9IjQiIGFscGhhPSI5OSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSItMTU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMC42MzMzMzMzMzMzMzMzMzM0IiBjcDF4PSI1LjAiIGNwMXk9IjAuNjMzMzMzMzMzMzMzMzMzNCIgY3AyeD0iMS4wIiBjcDJ5PSIwLjYzMzMzMzMzMzMzMzMzMzQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjYzMzMzMzMzMzMzMzMzMzQiIHk9IjMuMCIgY3AxeD0iMC42MzMzMzMzMzMzMzMzMzM0IiBjcDF5PSIxLjAiIGNwMng9IjAuNjMzMzMzMzMzMzMzMzMzNCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42MzMzMzMzMzMzMzMzMzM0IiB5PSIxNi4wIiBjcDF4PSIwLjYzMzMzMzMzMzMzMzMzMzQiIGNwMXk9IjE0LjAiIGNwMng9IjAuNjMzMzMzMzMzMzMzMzMzNCIgY3AyeT0iMTguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTguNDY2NjY2NjY2NjY2NjkiIGNwMXg9IjEuMCIgY3AxeT0iMTguNDY2NjY2NjY2NjY2NjkiIGNwMng9IjUuMCIgY3AyeT0iMTguNDY2NjY2NjY2NjY2NjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNy4wIiB5PSIxOC40NjY2NjY2NjY2NjY2OSIgY3AxeD0iMjcuMCIgY3AxeT0iMTguNDY2NjY2NjY2NjY2NjkiIGNwMng9IjI3LjAiIGNwMnk9IjE4LjQ2NjY2NjY2NjY2NjY5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjcuMCIgeT0iMTcuMCIgY3AxeD0iMjcuMCIgY3AxeT0iMTcuMCIgY3AyeD0iMjcuMCIgY3AyeT0iMTcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTcuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjE3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjIuMCIgY3AxeD0iMi4wIiBjcDF5PSIyLjAiIGNwMng9IjIuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjcuMCIgeT0iMi4wIiBjcDF4PSIyNy4wIiBjcDF5PSIyLjAiIGNwMng9IjI3LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI3LjAiIHk9IjAuNjAwMDAwMDAwMDAwMDAwMSIgY3AxeD0iMjcuMCIgY3AxeT0iMC42MDAwMDAwMDAwMDAwMDAxIiBjcDJ4PSIyNy4wIiBjcDJ5PSIwLjYwMDAwMDAwMDAwMDAwMDEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA1MThmZWQwLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK0ZpbmlzaGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyNyIgaGVpZ2h0PSIxOSIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMjQuMCIgeTE9IjMuMCIgeTI9IjE2LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wMzg3MDk2NzgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM2IiBncmVlbj0iMjA5IiBibHVlPSIxNzkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwMzk0MDMyOSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzM3NTMyMiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNzY0NzA1OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA4Mzg3MDk3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOSIgZ3JlZW49IjE2NyIgYmx1ZT0iMTA3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wMDU1MDY3MzkiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2NzY0MjA3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwOTgwMzkxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ2MTI5MDMzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjEyNyIgYmx1ZT0iNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwNDIxMjc0NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE4NTk1NDE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA0NzA1ODgyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTE5MzU0OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIxMDIiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwNDc2MjY5NDIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDIwOTQyMzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDAzOTIxNTY4NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkxNjEyOTA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMiIgZ3JlZW49IjE0MiIgYmx1ZT0iNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwNDc2MjY5NDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE1MTQ3MTM4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2MDc4NDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45MzIyNTgwNyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIxNzciIGJsdWU9Ijc1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wMTA2NjU0NzYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjI3MzE3NTI0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjI1LjAiIHkxPSIyLjAiIHkyPSIxNy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDM4NzA5Njc4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1MiIgZ3JlZW49IjYyIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDE1Nzk2NTEyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNTI5NDExNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA3MDk2Nzc0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MiIgZ3JlZW49IjgyIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDA0MzIxNjA1IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNzQ1MDk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDkwMzIyNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjUiIGdyZWVuPSI3NSIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAwODAyMTM5OSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTAxOTYwNzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45MDMyMjU4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NSIgZ3JlZW49IjEwMSIgYmx1ZT0iMzciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wMTE3MDY5MDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE3OTA1NzYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTQ1MTYxMyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTQiIGdyZWVuPSIyNCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA0ODY5MTI1NCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjA5NDIzOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzAxOTYwOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MSIgZ3JlZW49Ijk4IiBibHVlPSI0IiBhbHBoYT0iOTkiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iLTE1NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjczMzMzMzMzMzMzMzMzNDMiIHk9IjAuNjMzMzMzMzMzMzMzMzMzNCIgY3AxeD0iMi43MzMzMzMzMzMzMzMzMzQzIiBjcDF5PSIwLjYzMzMzMzMzMzMzMzMzMzQiIGNwMng9IjAuNzMzMzMzMzMzMzMzMzMzNCIgY3AyeT0iMC42MzMzMzMzMzMzMzMzMzM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42MDAwMDAwMDAwMDAwMDAxIiB5PSIzLjAzMzMzMzMzMzMzMzMzMyIgY3AxeD0iMC42MDAwMDAwMDAwMDAwMDAxIiBjcDF5PSIxLjAzMzMzMzMzMzMzMzMzMzQiIGNwMng9IjAuNjAwMDAwMDAwMDAwMDAwMSIgY3AyeT0iMy4wMzMzMzMzMzMzMzMzMzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjYwMDAwMDAwMDAwMDAwMDEiIHk9IjE2LjEzMzMzMzMzMzMzMzM0IiBjcDF4PSIwLjYwMDAwMDAwMDAwMDAwMDEiIGNwMXk9IjE2LjEzMzMzMzMzMzMzMzM0IiBjcDJ4PSIwLjYwMDAwMDAwMDAwMDAwMDEiIGNwMnk9IjE4LjEzMzMzMzMzMzMzMzM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi45IiB5PSIxOC40MDAwMDAwMDAwMDAwMTYiIGNwMXg9IjAuOSIgY3AxeT0iMTguNDAwMDAwMDAwMDAwMDE2IiBjcDJ4PSIyLjkiIGNwMnk9IjE4LjQwMDAwMDAwMDAwMDAxNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIzLjk5OTk5OTk5OTk5OTk4NiIgeT0iMTguMzY2NjY2NjY2NjY2Njc4IiBjcDF4PSIyMy45OTk5OTk5OTk5OTk5ODYiIGNwMXk9IjE4LjM2NjY2NjY2NjY2NjY3OCIgY3AyeD0iMjUuOTcwOTI5MjQ0MTI2NTE2IiBjcDJ5PSIxOC4zODY1MjM3MDYwMzE4MjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNi4zMzMzMzMzMzMzMzMzNSIgeT0iMTYuMTY2NjY2NjY2NjY2NjY0IiBjcDF4PSIyNi4zMDAwMDAwMDAwMDAwMTUiIGNwMXk9IjE4LjEwMDAwMDAwMDAwMDA1IiBjcDJ4PSIyNi4zMzMzMzMzMzMzMzMzNSIgY3AyeT0iMTYuMTY2NjY2NjY2NjY2NjY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjYuMzY2NjY2NjY2NjY2Njc4IiB5PSIxMy40NjY2NjY2NjY2NjY2NiIgY3AxeD0iMjYuMzY2NjY2NjY2NjY2Njc4IiBjcDF5PSIxMy40NjY2NjY2NjY2NjY2NiIgY3AyeD0iMjYuMzY2NjY2NjY2NjY2Njc4IiBjcDJ5PSIxMy40NjY2NjY2NjY2NjY2NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI2LjMzMzMzMzMzMzMzMzM0MyIgeT0iNi42MzMzMzMzMzMzMzMzMzIiIGNwMXg9IjI2LjMzMzMzMzMzMzMzMzM0MyIgY3AxeT0iNi42MzMzMzMzMzMzMzMzMzIiIGNwMng9IjI2LjMzMzMzMzMzMzMzMzM0MyIgY3AyeT0iNi42MzMzMzMzMzMzMzMzMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNi4zMzMzMzMzMzMzMzMzMiIgeT0iMy4wMzMzMzMzMzMzMzMzMzI4IiBjcDF4PSIyNi4zMzMzMzMzMzMzMzMzMiIgY3AxeT0iMy4wMzMzMzMzMzMzMzMzMzI4IiBjcDJ4PSIyNi4zMzc1NTA2NjM3NTA3MzYiIGNwMnk9IjEuMDgyOTk1NTc0OTk1MTYyMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI0LjMwMDAwMDAwMDAwMDAwNCIgeT0iMC42NjY2NjY2NjY2NjY2NjY3IiBjcDF4PSIyNi4yNjU5NDYwMTk0MTM5NDYiIGNwMXk9IjAuNjgzNzg4OTMzODg4MDE2OCIgY3AyeD0iMjQuMzAwMDAwMDAwMDAwMDA0IiBjcDJ5PSIwLjY2NjY2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtJbmRldGVybWluYXRlIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InByb2dyZXNzUGFkZGluZyIgdHlwZT0iSU5UIiB2YWx1ZT0iMyIvPgorICAgICAgICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIzMCIgaGVpZ2h0PSIxMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMjAuMCIgeDI9IjIxLjAiIHkxPSIwLjAiIHkyPSIxMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iODUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTE3MCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMC4wIiB4Mj0iMTEuMCIgeTE9IjAuMCIgeTI9IjEzLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSI4MiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTczIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOSIgZ3JlZW49IjE2NyIgYmx1ZT0iMTA3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wMDU1MDY3MzkiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2NzY0MjA3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwOTgwMzkxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQxMjkwMzIyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjEyNyIgYmx1ZT0iNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwNDIxMjc0NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE4NTk1NDE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA0NzA1ODgyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDcwOTY3NzQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkyIiBncmVlbj0iMTAyIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wMDQ3NjI2OTQyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAyMDk0MjM5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAwMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MiIgZ3JlZW49IjE2MiIgYmx1ZT0iNjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwNDc2MjY5NDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIxNzE1MjgzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIzOTIxNTY3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNi4wIiBjcDF4PSIwLjAiIGNwMXk9IjYuMCIgY3AyeD0iMi42Nzg1NzE0Mjg1NzE0MzMiIGNwMnk9IjYuMDAwMDAwMDAwMDAwMDAxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMzU3MTQyODU3MTQyODcyIiB5PSIxLjAzNTcxNDI4NTcxNDI4MzQiIGNwMXg9IjYuMTQyODU3MTQyODU3MTU3IiBjcDF5PSIxLjAwMDAwMDAwMDAwMDAwMDQiIGNwMng9IjEyLjM1NzE0Mjg1NzE0Mjg3MiIgY3AyeT0iMS4wMzU3MTQyODU3MTQyODM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuMjg1NzE0Mjg1NzE0MjgiIHk9IjEuMDM1NzE0Mjg1NzE0Mjg1OCIgY3AxeD0iMTYuMjg1NzE0Mjg1NzE0MjgiIGNwMXk9IjEuMDM1NzE0Mjg1NzE0Mjg1OCIgY3AyeD0iMjQuNjE1Mzg0NjE1Mzg0NjM4IiBjcDJ5PSIxLjAzODQ2MTUzODQ2MTUzNTQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyOC4wIiB5PSI2LjAiIGNwMXg9IjIyLjcxNDI4NTcxNDI4NTczIiBjcDF5PSI2LjAzNTcxNDI4NTcxNDI4NiIgY3AyeD0iMjguMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzAuMCIgeT0iNi4wIiBjcDF4PSIzMC4wIiBjcDF5PSI2LjAiIGNwMng9IjMwLjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMwLjAiIHk9IjcuMCIgY3AxeD0iMzAuMCIgY3AxeT0iNy4wIiBjcDJ4PSIzMC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyOC4wIiB5PSI3LjAiIGNwMXg9IjI4LjAiIGNwMXk9IjcuMCIgY3AyeD0iMjIuNjc4NTcxNDI4NTcxNDMiIGNwMnk9IjcuMDM1NzE0Mjg1NzE0Mjg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuMjg1NzE0Mjg1NzE0Mjk1IiB5PSIxMi4wMDAwMDAwMDAwMDAwMDciIGNwMXg9IjI1LjI2OTIzMDc2OTIzMDc5IiBjcDF5PSIxMi4wMzg0NjE1Mzg0NjE1MzgiIGNwMng9IjE2LjI4NTcxNDI4NTcxNDI5NSIgY3AyeT0iMTIuMDAwMDAwMDAwMDAwMDA3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuNzg1NzE0Mjg1NzE0Mjk1IiB5PSIxMi4wIiBjcDF4PSIxMi43ODU3MTQyODU3MTQyOTUiIGNwMXk9IjEyLjAiIGNwMng9IjYuMDcxNDI4NTcxNDI4NTkyIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSI3LjAiIGNwMXg9IjIuNjA3MTQyODU3MTQyODU2OCIgY3AxeT0iNy4wMzU3MTQyODU3MTQyODYiIGNwMng9IjAuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjMwLjAiIHkxPSIwLjAiIHkyPSIxMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDUxNjEyOTAyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA4MDY0NTE2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzNSIgZ3JlZW49IjIzNiIgYmx1ZT0iMjM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NzkyMTI3NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xODgyMzUyOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUwNjQ1MTYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE3IiBncmVlbj0iMjE0IiBibHVlPSIyMTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjU0NDQ0NDQ0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODc0ODQ4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjg3NDE5MzU1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNyIgZ3JlZW49IjIyOSIgYmx1ZT0iMjMzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4NDc3NTI0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2ODYyNzQ0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTAzMjI1OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDkiIGdyZWVuPSIyNTEiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODY5OTY5MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA1MjY2YWIwLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjciIGhlaWdodD0iMTkiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjI2LjAiIHkxPSIzLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDM4NzA5Njc4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMCIgZ3JlZW49IjIxNSIgYmx1ZT0iMjExIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDA5NzA0OTAzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC45MzgxNDg1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDgzODcwOTciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE1IiBncmVlbj0iMjAzIiBibHVlPSIxOTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItNC40NTYzNDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC44Njc0Mjk3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTQxMTc2NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ2MTI5MDMzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjE5MiIgYmx1ZT0iMTczIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTQuNDU2MzQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzk4OTYyODMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41MTkzNTQ4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwOCIgZ3JlZW49IjE4NSIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wMDEzMjc0MTAzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43NTMwOTYxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTE2MTI5MDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE5IiBncmVlbj0iMTk2IiBibHVlPSIxNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwMTMyNzQxMDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjc2NDQ0NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTMyMjU4MDciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI1IiBncmVlbj0iMjA2IiBibHVlPSIxODIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwOTI0NDI5MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzg3OTQ2NDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMjcuMCIgeTE9IjIuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wMzg3MDk2NzgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk3IiBncmVlbj0iMTc0IiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wMjM1OTM3ODciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjc5NjMxNjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNzA5Njc3NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIxNzkiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxMDYwODI0MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzc2MDg3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40OTAzMjI2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMCIgZ3JlZW49IjE3NyIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDE1NDAyOTA2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43ODQwNTc2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkwMzIyNTgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA2IiBncmVlbj0iMTg1IiBibHVlPSIxNzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wMTcxMTIzMDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjgwOTE1NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDU4ODIzNTI2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTQ1MTYxMyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODYiIGdyZWVuPSIxNjMiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA3MDQ0NTY0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC44NDQ2NDkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOCIgZ3JlZW49IjIxMSIgYmx1ZT0iMTk4IiBhbHBoYT0iOTkiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAyNDU1NDM1NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuODg3MzE0NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9Ii0xNTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIwLjYzMzMzMzMzMzMzMzMzMzQiIGNwMXg9IjUuMCIgY3AxeT0iMC42MzMzMzMzMzMzMzMzMzM0IiBjcDJ4PSIxLjAiIGNwMnk9IjAuNjMzMzMzMzMzMzMzMzMzNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuNjMzMzMzMzMzMzMzMzMzNCIgeT0iMy4wIiBjcDF4PSIwLjYzMzMzMzMzMzMzMzMzMzQiIGNwMXk9IjEuMCIgY3AyeD0iMC42MzMzMzMzMzMzMzMzMzM0IiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjYzMzMzMzMzMzMzMzMzMzQiIHk9IjE2LjAiIGNwMXg9IjAuNjMzMzMzMzMzMzMzMzMzNCIgY3AxeT0iMTQuMCIgY3AyeD0iMC42MzMzMzMzMzMzMzMzMzM0IiBjcDJ5PSIxOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxOC40NjY2NjY2NjY2NjY2OSIgY3AxeD0iMS4wIiBjcDF5PSIxOC40NjY2NjY2NjY2NjY2OSIgY3AyeD0iNS4wIiBjcDJ5PSIxOC40NjY2NjY2NjY2NjY2OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI3LjAiIHk9IjE4LjQ2NjY2NjY2NjY2NjY5IiBjcDF4PSIyNy4wIiBjcDF5PSIxOC40NjY2NjY2NjY2NjY2OSIgY3AyeD0iMjcuMCIgY3AyeT0iMTguNDY2NjY2NjY2NjY2NjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNy4wIiB5PSIxNy4wIiBjcDF4PSIyNy4wIiBjcDF5PSIxNy4wIiBjcDJ4PSIyNy4wIiBjcDJ5PSIxNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNy4wIiBjcDF4PSIyLjAiIGNwMXk9IjE3LjAiIGNwMng9IjIuMCIgY3AyeT0iMTcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMi4wIiBjcDF4PSIyLjAiIGNwMXk9IjIuMCIgY3AyeD0iMi4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNy4wIiB5PSIyLjAiIGNwMXg9IjI3LjAiIGNwMXk9IjIuMCIgY3AyeD0iMjcuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjcuMCIgeT0iMC42MDAwMDAwMDAwMDAwMDAxIiBjcDF4PSIyNy4wIiBjcDF5PSIwLjYwMDAwMDAwMDAwMDAwMDEiIGNwMng9IjI3LjAiIGNwMnk9IjAuNjAwMDAwMDAwMDAwMDAwMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCtGaW5pc2hlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjciIGhlaWdodD0iMTkiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjI0LjAiIHkxPSIzLjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDM4NzA5Njc4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMCIgZ3JlZW49IjIxNSIgYmx1ZT0iMjExIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDA5NzA0OTAzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC45MzgxNDg1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDgzODcwOTciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE1IiBncmVlbj0iMjAzIiBibHVlPSIxOTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItNC40NTYzNDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC44Njc0Mjk3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTQxMTc2NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ2MTI5MDMzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjE5MiIgYmx1ZT0iMTczIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTQuNDU2MzQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzk4OTYyODMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41MTkzNTQ4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwOCIgZ3JlZW49IjE4NSIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wMDEzMjc0MTAzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43NTMwOTYxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTE2MTI5MDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE5IiBncmVlbj0iMTk2IiBibHVlPSIxNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwMTMyNzQxMDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjc2NDQ0NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTMyMjU4MDciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI1IiBncmVlbj0iMjA2IiBibHVlPSIxODIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwOTI0NDI5MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzg3OTQ2NDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMjUuMCIgeTE9IjIuMCIgeTI9IjE3LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wMzg3MDk2NzgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk3IiBncmVlbj0iMTc0IiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wMjM1OTM3ODciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjc5NjMxNjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNzA5Njc3NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIxNzkiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjAxMDYwODI0MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNzc2MDg3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40OTAzMjI2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMCIgZ3JlZW49IjE3NyIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTAuMDE1NDAyOTA2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43ODQwNTc2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkwMzIyNTgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA2IiBncmVlbj0iMTg1IiBibHVlPSIxNzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSItMC4wMTcxMTIzMDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjgwOTE1NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDU4ODIzNTI2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTQ1MTYxMyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODYiIGdyZWVuPSIxNjMiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii0wLjA3MDQ0NTY0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC44NDQ2NDkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxOCIgZ3JlZW49IjIxMSIgYmx1ZT0iMTk4IiBhbHBoYT0iOTkiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAyNDU1NDM1NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuODg3MzE0NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9Ii0xNTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi45NjY2NjY2NjY2NjY2NjM3IiB5PSIwLjU5OTk5OTk5OTk5OTk5OTkiIGNwMXg9IjQuOTY2NjY2NjY2NjY2NjY3IiBjcDF5PSIwLjU5OTk5OTk5OTk5OTk5OTkiIGNwMng9IjAuOTY2NjY2NjY2NjY2NjY0MyIgY3AyeT0iMC41OTk5OTk5OTk5OTk5OTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC41OTk5OTk5OTk5OTk5OTg5IiB5PSIyLjk2NjY2NjY2NjY2NjY2NyIgY3AxeD0iMC41OTk5OTk5OTk5OTk5OTg5IiBjcDF5PSIwLjk2NjY2NjY2NjY2NjY2NjEiIGNwMng9IjAuNTk5OTk5OTk5OTk5OTk4OSIgY3AyeT0iNC45NjY2NjY2NjY2NjY2NjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjU5OTk5OTk5OTk5OTk5ODkiIHk9IjE1Ljk2NjY2NjY2NjY2NjY3NiIgY3AxeD0iMC41OTk5OTk5OTk5OTk5OTg5IiBjcDF5PSIxMy45NjY2NjY2NjY2NjY2NyIgY3AyeD0iMC41OTk5OTk5OTk5OTk5OTg5IiBjcDJ5PSIxNy45NjY2NjY2NjY2NjY2ODMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjk2NjY2NjY2NjY2NjY2MzciIHk9IjE4LjQzMzMzMzMzMzMzMzM3MyIgY3AxeD0iMC45NjY2NjY2NjY2NjY2NjQzIiBjcDF5PSIxOC40MzMzMzMzMzMzMzMzNzMiIGNwMng9IjQuOTY2NjY2NjY2NjY2NjY3IiBjcDJ5PSIxOC40MzMzMzMzMzMzMzMzNzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNS41MDAwMDAwMDAwMDAwMjUiIHk9IjE4LjQwMDAwMDAwMDAwMDAzOCIgY3AxeD0iMjUuNTAwMDAwMDAwMDAwMDI1IiBjcDF5PSIxOC40MDAwMDAwMDAwMDAwMzgiIGNwMng9IjI1LjUwMDAwMDAwMDAwMDAyNSIgY3AyeT0iMTguNDAwMDAwMDAwMDAwMDM4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjYuMjMzMzMzMzMzMzMzMzUiIHk9IjE3LjQ2NjY2NjY2NjY2NjY5NyIgY3AxeD0iMjYuMjMzMzMzMzMzMzMzMzUiIGNwMXk9IjE3LjQ2NjY2NjY2NjY2NjY5NyIgY3AyeD0iMjYuMjMzMzMzMzMzMzMzMzUiIGNwMnk9IjE3LjQ2NjY2NjY2NjY2NjY5NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI2LjI2NjY2NjY2NjY2NjY2MiIgeT0iMTAuNTMzMzMzMzMzMzMzMzUiIGNwMXg9IjI2LjI2NjY2NjY2NjY2NjY2MiIgY3AxeT0iMTAuNTMzMzMzMzMzMzMzMzUiIGNwMng9IjI2LjI2NjY2NjY2NjY2NjY2MiIgY3AyeT0iMTAuNTMzMzMzMzMzMzMzMzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNi4yOTk5OTk5OTk5OTk5OTciIHk9IjguNjY2NjY2NjY2NjY2NjYzIiBjcDF4PSIyNi4yOTk5OTk5OTk5OTk5OTciIGNwMXk9IjguNjY2NjY2NjY2NjY2NjYzIiBjcDJ4PSIyNi4yOTk5OTk5OTk5OTk5OTciIGNwMnk9IjguNjY2NjY2NjY2NjY2NjYzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjYuMjk5OTk5OTk5OTk5OTg2IiB5PSIxLjg2NjY2NjY2NjY2NjY2NjMiIGNwMXg9IjI2LjI5OTk5OTk5OTk5OTk4NiIgY3AxeT0iMS44NjY2NjY2NjY2NjY2NjYzIiBjcDJ4PSIyNi4yOTk5OTk5OTk5OTk5ODYiIGNwMnk9IjEuODY2NjY2NjY2NjY2NjY2MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI1Ljc5OTk5OTk5OTk5OTk4MyIgeT0iMC42NjY2NjY2NjY2NjY2NjU3IiBjcDF4PSIyNS43OTk5OTk5OTk5OTk5ODMiIGNwMXk9IjAuNjY2NjY2NjY2NjY2NjY1NyIgY3AyeD0iMjUuNzk5OTk5OTk5OTk5OTgzIiBjcDJ5PSIwLjY2NjY2NjY2NjY2NjY2NTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQrSW5kZXRlcm1pbmF0ZSI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJwcm9ncmVzc1BhZGRpbmciIHR5cGU9IklOVCIgdmFsdWU9IjMiLz4KKyAgICAgICAgICAgICAgICAgIDwvdWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMzAiIGhlaWdodD0iMTMiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNSIgZ3JlZW49IjIwMyIgYmx1ZT0iMTkxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iLTQuNDU2MzQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuODY3NDI5NzMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDk0MTE3NjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MTI5MDMyMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTEiIGdyZWVuPSIxOTIiIGJsdWU9IjE3MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9Ii00LjQ1NjM0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjc5ODk2MjgzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDcwOTY3NzQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA4IiBncmVlbj0iMTg1IiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c09yYW5nZSIgaHVlT2Zmc2V0PSIwLjAwMTMyNzQxMDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjc1MzA5NjEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDY2NjY2NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyNCIgZ3JlZW49IjIwMiIgYmx1ZT0iMTc5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNPcmFuZ2UiIGh1ZU9mZnNldD0iMC4wMDE0MDYyMjI2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC43NzgxNjQ3NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjYuMCIgY3AxeD0iMC4wIiBjcDF5PSI2LjAiIGNwMng9IjIuNjc4NTcxNDI4NTcxNDMzIiBjcDJ5PSI2LjAwMDAwMDAwMDAwMDAwMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjM1NzE0Mjg1NzE0Mjg3MiIgeT0iMS4wMzU3MTQyODU3MTQyODM0IiBjcDF4PSI2LjAiIGNwMXk9IjEuMCIgY3AyeD0iMTIuMzU3MTQyODU3MTQyODcyIiBjcDJ5PSIxLjAzNTcxNDI4NTcxNDI4MzQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNi4yODU3MTQyODU3MTQyOCIgeT0iMS4wMzU3MTQyODU3MTQyODU4IiBjcDF4PSIxNi4yODU3MTQyODU3MTQyOCIgY3AxeT0iMS4wMzU3MTQyODU3MTQyODU4IiBjcDJ4PSIyMC4yODU3MTQyODU3MTQyNzgiIGNwMnk9IjEuMDM1NzE0Mjg1NzE0Mjg1OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI4LjAiIHk9IjYuMCIgY3AxeD0iMjIuNzE0Mjg1NzE0Mjg1NzMiIGNwMXk9IjYuMDM1NzE0Mjg1NzE0Mjg2IiBjcDJ4PSIyOC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzMC4wIiB5PSI2LjAiIGNwMXg9IjMwLjAiIGNwMXk9IjYuMCIgY3AyeD0iMzAuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzAuMCIgeT0iNy4wIiBjcDF4PSIzMC4wIiBjcDF5PSI3LjAiIGNwMng9IjMwLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI4LjAiIHk9IjcuMCIgY3AxeD0iMjguMCIgY3AxeT0iNy4wIiBjcDJ4PSIyMi42Nzg1NzE0Mjg1NzE0MyIgY3AyeT0iNy4wMzU3MTQyODU3MTQyODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNi4yODU3MTQyODU3MTQyOTUiIHk9IjEyLjAwMDAwMDAwMDAwMDAwNyIgY3AxeD0iMjAuMjg1NzE0Mjg1NzE0MjgiIGNwMXk9IjEyLjAwMDAwMDAwMDAwMDAwNyIgY3AyeD0iMTYuMjg1NzE0Mjg1NzE0Mjk1IiBjcDJ5PSIxMi4wMDAwMDAwMDAwMDAwMDciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi43ODU3MTQyODU3MTQyOTUiIHk9IjEyLjAiIGNwMXg9IjEyLjc4NTcxNDI4NTcxNDI5NSIgY3AxeT0iMTIuMCIgY3AyeD0iNi4yMTQyODU3MTQyODU3MTIiIGNwMnk9IjExLjk2NDI4NTcxNDI4NTcxNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNy4wIiBjcDF4PSIyLjYwNzE0Mjg1NzE0Mjg1NjgiIGNwMXk9IjcuMDM1NzE0Mjg1NzE0Mjg2IiBjcDJ4PSIwLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIzMC4wIiB5MT0iMC4wIiB5Mj0iMTMuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA1MTYxMjkwMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjUiIGdyZWVuPSIyMjgiIGJsdWU9IjIzMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDE1ODcyOTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODAzNTM5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE2NDcwNTg3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDgwNjQ1MTYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIwIiBncmVlbj0iMjIyIiBibHVlPSIyMjciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzk2ODkzMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNDUwOTgwMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjUwNjQ1MTYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE1IiBncmVlbj0iMjE2IiBibHVlPSIyMjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDIyMjIyMjgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4Nzc5OTA0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuODc0MTkzNTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE4IiBncmVlbj0iMjIwIiBibHVlPSIyMjYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDEzODg4ODk1NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc1MTI4MDg2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0MTE3NjQ2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTAzMjI1OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjQiIGdyZWVuPSIyMjYiIGJsdWU9IjIzMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMTM4ODg4OTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzYwNDM1NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNjQ3MDU4NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MWZlZTQ2ZmYucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2ZvcmVncm91bmRTdGF0ZXM+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSlNlcGFyYXRvciIgbmFtZT0iU2VwYXJhdG9yIiB1aT0iU2VwYXJhdG9yVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIiBpbnZlcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iNDAiIHJpZ2h0PSI0MCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxMDAuMCIgeTE9IjEuMCIgeTI9IjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjciIGdyZWVuPSIxNzIiIGJsdWU9IjE4MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA4NTQ3MDA4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzgzMDQwOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDM5MjE1Njg0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJ0cnVlIiB0eXBlPSJqYXZheC5zd2luZy5KU2Nyb2xsQmFyIiBuYW1lPSJTY3JvbGxCYXIiIHVpPSJTY3JvbGxCYXJVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJpbmNyZW1lbnRCdXR0b25HYXAiIHR5cGU9IklOVCIgdmFsdWU9Ii04Ii8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJkZWNyZW1lbnRCdXR0b25HYXAiIHR5cGU9IklOVCIgdmFsdWU9Ii04Ii8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJ0aHVtYkhlaWdodCIgdHlwZT0iSU5UIiB2YWx1ZT0iMTUiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9Im1pbmltdW1UaHVtYlNpemUiIHR5cGU9IkRJTUVOU0lPTiI+CisgICAgICAgICAgICAgICAgICA8ZGltZW5zaW9uIHdpZHRoPSIyOSIgaGVpZ2h0PSIyOSIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0ibWF4aW11bVRodW1iU2l6ZSIgdHlwZT0iRElNRU5TSU9OIj4KKyAgICAgICAgICAgICAgICAgIDxkaW1lbnNpb24gd2lkdGg9IjEwMDAiIGhlaWdodD0iMTAwMCIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiBjb21wb25lbnROYW1lPSJTY3JvbGxCYXIuYnV0dG9uIiB0eXBlPSJqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoQXJyb3dCdXR0b24iIG5hbWU9IkFycm93QnV0dG9uIiB1aT0iU3ludGhBcnJvd0J1dHRvblVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJzaXplIiB0eXBlPSJJTlQiIHZhbHVlPSIyNSIvPgorICAgICAgICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyNSIgaGVpZ2h0PSIxNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjEiIGJvdHRvbT0iMSIgbGVmdD0iMSIgcmlnaHQ9IjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjkwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii0xNjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuNDQxMTc2NDcwNTg4MjM2IiB5PSIyLjAiIGNwMXg9IjE1LjcwNTg4MjM1Mjk0MTE3NiIgY3AxeT0iMi4wIiBjcDJ4PSIxNy4xNzY0NzA1ODgyMzUyOTciIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjUyOTQxMTc2NDcwNTg4IiB5PSI2LjMyMzUyOTQxMTc2NDcwNiIgY3AxeD0iMTYuNjE3NjQ3MDU4ODIzNTI1IiBjcDF5PSI0LjExNzY0NzA1ODgyMzUyNyIgY3AyeD0iMTguNDQxMTc2NDcwNTg4MjM2IiBjcDJ5PSI4LjUyOTQxMTc2NDcwNTg4NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjQxMTc2NDcwNTg4MjM0IiB5PSIxMS4zMjM1Mjk0MTE3NjQ3MDciIGNwMXg9IjE4LjA1ODgyMzUyOTQxMTc1IiBjcDF5PSI5LjQ3MDU4ODIzNTI5NDEyIiBjcDJ4PSIyMi43NjQ3MDU4ODIzNTI5MyIgY3AyeT0iMTMuMTc2NDcwNTg4MjM1MjkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjQuNDk5OTk5OTk5OTk5OTkzIiB5PSIxNC4yMzUyOTQxMTc2NDcwNTYiIGNwMXg9IjI0LjQ5OTk5OTk5OTk5OTk5MyIgY3AxeT0iMTQuMjM1Mjk0MTE3NjQ3MDU2IiBjcDJ4PSIyNC40OTk5OTk5OTk5OTk5OTMiIGNwMnk9IjE0LjIzNTI5NDExNzY0NzA1NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI0LjM1Mjk0MTE3NjQ3MDU4NyIgeT0iMTQuODIzNTI5NDExNzY0NzA3IiBjcDF4PSIyNC4zNTI5NDExNzY0NzA1ODciIGNwMXk9IjE0LjgyMzUyOTQxMTc2NDcwNyIgY3AyeD0iMjQuMzUyOTQxMTc2NDcwNTg3IiBjcDJ5PSIxNC44MjM1Mjk0MTE3NjQ3MDciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOS44MjM1Mjk0MTE3NjQ2NjciIHk9IjExLjk3MDU4ODIzNTI5NDExNiIgY3AxeD0iMjEuMzgyMzUyOTQxMTc2NDMyIiBjcDF5PSIxMy4zNTI5NDExNzY0NzA1ODMiIGNwMng9IjE4LjI2NDcwNTg4MjM1MjkwMyIgY3AyeT0iMTAuNTg4MjM1Mjk0MTE3NjQ5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuOTcwNTg4MjM1Mjk0MTE2IiB5PSI3LjI5NDExNzY0NzA1ODgyMyIgY3AxeD0iMTcuNzY0NzA1ODgyMzUyOTQiIGNwMXk9IjkuMjk0MTE3NjQ3MDU4ODIyIiBjcDJ4PSIxNi4xNzY0NzA1ODgyMzUyOTMiIGNwMnk9IjUuMjk0MTE3NjQ3MDU4ODI0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQ1IiBncmVlbj0iNDUiIGJsdWU9IjQ2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg4Nzg3MTgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU2NDcwNTkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41OTI4MTQ0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY0IiBncmVlbj0iNjUiIGJsdWU9IjY2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4MDIyMzI4NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDg2Mjc0NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk5NDAxMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjkiIGdyZWVuPSIxMzEiIGJsdWU9IjEzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMTExMTExMTA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTUyNTkxNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjMxMzcyNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjkyNDk5OTk5NDYzNTU4MyIgeTE9IjAuOTI4NTcxNDI4NTcxNDI4MyIgeDI9IjAuOTI0OTk5OTk4NjA5MjI1MyIgeTI9IjAuMDA0MjAxNjgwNjcyMjY4ODcxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjQuMCIgY3AxeD0iMTIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIxMS4wIiBjcDF4PSIxMi4wIiBjcDF5PSIxMS4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC45NDExNzY0NzA1ODgyMzU1IiB5PSI3LjQ5OTk5OTk5OTk5OTk5OSIgY3AxeD0iNC45NDExNzY0NzA1ODgyMzU1IiBjcDF5PSI3LjQ5OTk5OTk5OTk5OTk5OSIgY3AyeD0iNC45NDExNzY0NzA1ODgyMzU1IiBjcDJ5PSI3LjQ5OTk5OTk5OTk5OTk5OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTIiIGdyZWVuPSIxMTQiIGJsdWU9IjExNSIgYWxwaGE9IjExOSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDU1NTU1NTIyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODQ0MzkzNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjk0MTE3NjYiIGFscGhhT2Zmc2V0PSItMTM2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MiIgZ3JlZW49IjI1NCIgYmx1ZT0iMjU1IiBhbHBoYT0iNzciIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjA1NTU1NTUyMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk4NzYxNjEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTc4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjAiIHkxPSIwLjUiIHgyPSIwLjU3MzUyOTQxMTc2NDcwNyIgeTI9IjAuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSItMC4wNTg4MjM1Mjk0MTE3NjQ3MDUiIHk9IjEuMDI5NDExNzY0NzA1ODgyMiIgY3AxeD0iLTAuMDU4ODIzNTI5NDExNzY0NzA1IiBjcDF5PSIxLjAyOTQxMTc2NDcwNTg4MjIiIGNwMng9Ii0wLjA1ODgyMzUyOTQxMTc2NDcwNSIgY3AyeT0iMS4wMjk0MTE3NjQ3MDU4ODIyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC45NzA1ODgyMzUyOTQxMTc1IiB5PSIxLjQ5OTk5OTk5OTk5OTk5ODciIGNwMXg9IjAuOTcwNTg4MjM1Mjk0MTE3NSIgY3AxeT0iMS40OTk5OTk5OTk5OTk5OTg3IiBjcDJ4PSIwLjk3MDU4ODIzNTI5NDExNzUiIGNwMnk9IjEuNDk5OTk5OTk5OTk5OTk4NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuOTQxMTc2NDcwNTg4MjM1NSIgeT0iMi4wMjk0MTE3NjQ3MDU4ODIyIiBjcDF4PSIxLjk0MTE3NjQ3MDU4ODIzNTUiIGNwMXk9IjIuMDI5NDExNzY0NzA1ODgyMiIgY3AyeD0iMS45NDExNzY0NzA1ODgyMzU1IiBjcDJ5PSIyLjAyOTQxMTc2NDcwNTg4MjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjk0MTE3NjQ3MDU4ODIzNTUiIHk9IjE1LjAyOTQxMTc2NDcwNTg4MiIgY3AxeD0iMS45NDExNzY0NzA1ODgyMzU1IiBjcDF5PSIxNS4wMjk0MTE3NjQ3MDU4ODIiIGNwMng9IjEuOTQxMTc2NDcwNTg4MjM1NSIgY3AyeT0iMTUuMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iLTAuMDU4ODIzNTI5NDExNzY0NzA1IiB5PSIxNS4wMjk0MTE3NjQ3MDU4ODIiIGNwMXg9Ii0wLjA1ODgyMzUyOTQxMTc2NDcwNSIgY3AxeT0iMTUuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSItMC4wNTg4MjM1Mjk0MTE3NjQ3MDUiIGNwMnk9IjE1LjAyOTQxMTc2NDcwNTg4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDciIGdyZWVuPSIxNDkiIGJsdWU9IjE1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NzYzMTU4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNDkwMTk2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDY1ODY4MjY2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjIxMiIgYmx1ZT0iMjEyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4xMTExMTExMDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTgwOTMzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA4NjI3NDUwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjExMzc3MjQ1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0MCIgZ3JlZW49IjI0MSIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwMjI2MTg1NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM0NzMwNTQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE3IiBncmVlbj0iMjIxIiBibHVlPSIyMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAzOTY4MjU2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc5Mjc2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQwNzE4NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTAiIGdyZWVuPSIyMTQiIGJsdWU9IjIxOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzM4MjkwNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDk4MDM5MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45MjgxNDM3NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDIiIGdyZWVuPSIyNDYiIGJsdWU9IjI0OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDM5NjgyNTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODI0MTM4NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzEzNzI1NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMC4wIiBjcDF4PSIxNy4wIiBjcDF5PSIwLjAiIGNwMng9IjE3LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjUuMCIgY3AxeD0iMTYuMjk0MTE3NjQ3MDU4ODM3IiBjcDF5PSIxLjk3MDU4ODIzNTI5NDExNzgiIGNwMng9IjE3LjcwNTg4MjM1Mjk0MTE2MyIgY3AyeT0iOC4wMjk0MTE3NjQ3MDU4ODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC4wIiB5PSIxMS4wIiBjcDF4PSIxOC4wIiBjcDF5PSI5LjA1ODgyMzUyOTQxMTc2NCIgY3AyeD0iMjIuMCIgY3AyeT0iMTIuOTQxMTc2NDcwNTg4MjM2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjUuMCIgeT0iMTQuMCIgY3AxeD0iMjUuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMjUuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI1LjAiIHk9IjE1LjAiIGNwMXg9IjI1LjAiIGNwMXk9IjE1LjAiIGNwMng9IjI1LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjE1LjAiIGNwMXg9IjAuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI1LjAiIHk9IjE1LjAiIGNwMXg9IjI1LjAiIGNwMXk9IjE1LjAiIGNwMng9IjI1LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2U3MDJmZGY4LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjI1IiBoZWlnaHQ9IjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMSIgYm90dG9tPSIxIiBsZWZ0PSIxIiByaWdodD0iMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNS4wIiB5PSIxNS4wIiBjcDF4PSIyNS4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIyNS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjUiIGhlaWdodD0iMTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIxIiBib3R0b209IjEiIGxlZnQ9IjEiIHJpZ2h0PSIxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSI5MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTY1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjQ0MTE3NjQ3MDU4ODIzNiIgeT0iMi4wIiBjcDF4PSIxNS43MDU4ODIzNTI5NDExNzYiIGNwMXk9IjIuMCIgY3AyeD0iMTcuMTc2NDcwNTg4MjM1Mjk3IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy41Mjk0MTE3NjQ3MDU4OCIgeT0iNi4zMjM1Mjk0MTE3NjQ3MDYiIGNwMXg9IjE2LjYxNzY0NzA1ODgyMzUyNSIgY3AxeT0iNC4xMTc2NDcwNTg4MjM1MjciIGNwMng9IjE4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iOC41Mjk0MTE3NjQ3MDU4ODQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC40MTE3NjQ3MDU4ODIzNCIgeT0iMTEuMzIzNTI5NDExNzY0NzA3IiBjcDF4PSIxOC4wNTg4MjM1Mjk0MTE3NSIgY3AxeT0iOS40NzA1ODgyMzUyOTQxMiIgY3AyeD0iMjIuNzY0NzA1ODgyMzUyOTMiIGNwMnk9IjEzLjE3NjQ3MDU4ODIzNTI5MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI0LjQ5OTk5OTk5OTk5OTk5MyIgeT0iMTQuMjM1Mjk0MTE3NjQ3MDU2IiBjcDF4PSIyNC40OTk5OTk5OTk5OTk5OTMiIGNwMXk9IjE0LjIzNTI5NDExNzY0NzA1NiIgY3AyeD0iMjQuNDk5OTk5OTk5OTk5OTkzIiBjcDJ5PSIxNC4yMzUyOTQxMTc2NDcwNTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNC4zNTI5NDExNzY0NzA1ODciIHk9IjE0LjgyMzUyOTQxMTc2NDcwNyIgY3AxeD0iMjQuMzUyOTQxMTc2NDcwNTg3IiBjcDF5PSIxNC44MjM1Mjk0MTE3NjQ3MDciIGNwMng9IjI0LjM1Mjk0MTE3NjQ3MDU4NyIgY3AyeT0iMTQuODIzNTI5NDExNzY0NzA3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkuODIzNTI5NDExNzY0NjY3IiB5PSIxMS45NzA1ODgyMzUyOTQxMTYiIGNwMXg9IjIxLjM4MjM1Mjk0MTE3NjQzMiIgY3AxeT0iMTMuMzUyOTQxMTc2NDcwNTgzIiBjcDJ4PSIxOC4yNjQ3MDU4ODIzNTI5MDMiIGNwMnk9IjEwLjU4ODIzNTI5NDExNzY0OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2Ljk3MDU4ODIzNTI5NDExNiIgeT0iNy4yOTQxMTc2NDcwNTg4MjMiIGNwMXg9IjE3Ljc2NDcwNTg4MjM1Mjk0IiBjcDF5PSI5LjI5NDExNzY0NzA1ODgyMiIgY3AyeD0iMTYuMTc2NDcwNTg4MjM1MjkzIiBjcDJ5PSI1LjI5NDExNzY0NzA1ODgyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI2NCIgZ3JlZW49IjY0IiBibHVlPSI2NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NTE0MTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ5MDE5NjA4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTkyODE0NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49Ijg0IiBibHVlPSI4NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODY5OTY5MDYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQxMTc2NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45OTQwMTIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ4IiBncmVlbj0iMTUwIiBibHVlPSIxNTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjExMTExMTEwNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk3MTkyOTgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC45MjQ5OTk5OTQ2MzU1ODMiIHkxPSIwLjkyODU3MTQyODU3MTQyODMiIHgyPSIwLjkyNDk5OTk5ODYwOTIyNTMiIHkyPSIwLjAwNDIwMTY4MDY3MjI2ODg3MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSI0LjAiIGNwMXg9IjEyLjAiIGNwMXk9IjQuMCIgY3AyeD0iMTIuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMTEuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuOTQxMTc2NDcwNTg4MjM1NSIgeT0iNy40OTk5OTk5OTk5OTk5OTkiIGNwMXg9IjQuOTQxMTc2NDcwNTg4MjM1NSIgY3AxeT0iNy40OTk5OTk5OTk5OTk5OTkiIGNwMng9IjQuOTQxMTc2NDcwNTg4MjM1NSIgY3AyeT0iNy40OTk5OTk5OTk5OTk5OTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjE5NTE4NzE3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MCIgZ3JlZW49IjE2MyIgYmx1ZT0iMTY1IiBhbHBoYT0iMTg2IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wNDQ0NDQ0NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDgwMjIzMjg1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wOTgwMzkyMSIgYWxwaGFPZmZzZXQ9Ii02OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTIiIGdyZWVuPSIyNTQiIGJsdWU9IjI1NSIgYWxwaGE9IjIxNSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDU1NTU1NTIyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTg3NjE2MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii0zOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4wIiB5MT0iMC41IiB4Mj0iMC41NzM1Mjk0MTE3NjQ3MDciIHkyPSIwLjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iLTAuMDU4ODIzNTI5NDExNzY0NzA1IiB5PSIxLjAyOTQxMTc2NDcwNTg4MjIiIGNwMXg9Ii0wLjA1ODgyMzUyOTQxMTc2NDcwNSIgY3AxeT0iMS4wMjk0MTE3NjQ3MDU4ODIyIiBjcDJ4PSItMC4wNTg4MjM1Mjk0MTE3NjQ3MDUiIGNwMnk9IjEuMDI5NDExNzY0NzA1ODgyMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuOTcwNTg4MjM1Mjk0MTE3NSIgeT0iMS40OTk5OTk5OTk5OTk5OTg3IiBjcDF4PSIwLjk3MDU4ODIzNTI5NDExNzUiIGNwMXk9IjEuNDk5OTk5OTk5OTk5OTk4NyIgY3AyeD0iMC45NzA1ODgyMzUyOTQxMTc1IiBjcDJ5PSIxLjQ5OTk5OTk5OTk5OTk5ODciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjk0MTE3NjQ3MDU4ODIzNTUiIHk9IjIuMDI5NDExNzY0NzA1ODgyMiIgY3AxeD0iMS45NDExNzY0NzA1ODgyMzU1IiBjcDF5PSIyLjAyOTQxMTc2NDcwNTg4MjIiIGNwMng9IjEuOTQxMTc2NDcwNTg4MjM1NSIgY3AyeT0iMi4wMjk0MTE3NjQ3MDU4ODIyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS45NDExNzY0NzA1ODgyMzU1IiB5PSIxNS4wMjk0MTE3NjQ3MDU4ODIiIGNwMXg9IjEuOTQxMTc2NDcwNTg4MjM1NSIgY3AxeT0iMTUuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSIxLjk0MTE3NjQ3MDU4ODIzNTUiIGNwMnk9IjE1LjAyOTQxMTc2NDcwNTg4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9Ii0wLjA1ODgyMzUyOTQxMTc2NDcwNSIgeT0iMTUuMDI5NDExNzY0NzA1ODgyIiBjcDF4PSItMC4wNTg4MjM1Mjk0MTE3NjQ3MDUiIGNwMXk9IjE1LjAyOTQxMTc2NDcwNTg4MiIgY3AyeD0iLTAuMDU4ODIzNTI5NDExNzY0NzA1IiBjcDJ5PSIxNS4wMjk0MTE3NjQ3MDU4ODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYwIiBncmVlbj0iMTYzIiBibHVlPSIxNjUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjA0NDQ0NDQ0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODAyMjMyODUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA5ODAzOTIxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDY1ODY4MjY2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNyIgZ3JlZW49IjIxNyIgYmx1ZT0iMjE3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA1ODgyMzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMTM3NzI0NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zNDczMDU0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzNiIgZ3JlZW49IjI0MCIgYmx1ZT0iMjQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMzk2ODI1NjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4MTcxOTczNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDc4NDMxMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0MDcxODYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI5IiBncmVlbj0iMjMzIiBibHVlPSIyMzciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc2NzcxMDQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTg0MzEzNzEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45MjgxNDM3NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjAuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMC4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI1LjAiIGNwMXg9IjE2LjI5NDExNzY0NzA1ODgzNyIgY3AxeT0iMS45NzA1ODgyMzUyOTQxMTc4IiBjcDJ4PSIxNy43MDU4ODIzNTI5NDExNjMiIGNwMnk9IjguMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuMCIgeT0iMTEuMCIgY3AxeD0iMTguMCIgY3AxeT0iOS4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjIyLjAiIGNwMnk9IjEyLjk0MTE3NjQ3MDU4ODIzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI1LjAiIHk9IjE0LjAiIGNwMXg9IjI1LjAiIGNwMXk9IjE0LjAiIGNwMng9IjI1LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNS4wIiB5PSIxNS4wIiBjcDF4PSIyNS4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIyNS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxNS4wIiBjcDF4PSIwLjAiIGNwMXk9IjE1LjAiIGNwMng9IjAuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNS4wIiB5PSIxNS4wIiBjcDF4PSIyNS4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIyNS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTRkOTg4YjEyMC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjUiIGhlaWdodD0iMTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIxIiBib3R0b209IjEiIGxlZnQ9IjEiIHJpZ2h0PSIxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSI5MCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTY1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjQ0MTE3NjQ3MDU4ODIzNiIgeT0iMi4wIiBjcDF4PSIxNS43MDU4ODIzNTI5NDExNzYiIGNwMXk9IjIuMCIgY3AyeD0iMTcuMTc2NDcwNTg4MjM1Mjk3IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy41Mjk0MTE3NjQ3MDU4OCIgeT0iNi4zMjM1Mjk0MTE3NjQ3MDYiIGNwMXg9IjE2LjYxNzY0NzA1ODgyMzUyNSIgY3AxeT0iNC4xMTc2NDcwNTg4MjM1MjciIGNwMng9IjE4LjQ0MTE3NjQ3MDU4ODIzNiIgY3AyeT0iOC41Mjk0MTE3NjQ3MDU4ODQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC40MTE3NjQ3MDU4ODIzNCIgeT0iMTEuMzIzNTI5NDExNzY0NzA3IiBjcDF4PSIxOC4wNTg4MjM1Mjk0MTE3NSIgY3AxeT0iOS40NzA1ODgyMzUyOTQxMiIgY3AyeD0iMjIuNzY0NzA1ODgyMzUyOTMiIGNwMnk9IjEzLjE3NjQ3MDU4ODIzNTI5MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI0LjQ5OTk5OTk5OTk5OTk5MyIgeT0iMTQuMjM1Mjk0MTE3NjQ3MDU2IiBjcDF4PSIyNC40OTk5OTk5OTk5OTk5OTMiIGNwMXk9IjE0LjIzNTI5NDExNzY0NzA1NiIgY3AyeD0iMjQuNDk5OTk5OTk5OTk5OTkzIiBjcDJ5PSIxNC4yMzUyOTQxMTc2NDcwNTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNC4zNTI5NDExNzY0NzA1ODciIHk9IjE0LjgyMzUyOTQxMTc2NDcwNyIgY3AxeD0iMjQuMzUyOTQxMTc2NDcwNTg3IiBjcDF5PSIxNC44MjM1Mjk0MTE3NjQ3MDciIGNwMng9IjI0LjM1Mjk0MTE3NjQ3MDU4NyIgY3AyeT0iMTQuODIzNTI5NDExNzY0NzA3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkuODIzNTI5NDExNzY0NjY3IiB5PSIxMS45NzA1ODgyMzUyOTQxMTYiIGNwMXg9IjIxLjM4MjM1Mjk0MTE3NjQzMiIgY3AxeT0iMTMuMzUyOTQxMTc2NDcwNTgzIiBjcDJ4PSIxOC4yNjQ3MDU4ODIzNTI5MDMiIGNwMnk9IjEwLjU4ODIzNTI5NDExNzY0OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2Ljk3MDU4ODIzNTI5NDExNiIgeT0iNy4yOTQxMTc2NDcwNTg4MjMiIGNwMXg9IjE3Ljc2NDcwNTg4MjM1Mjk0IiBjcDF5PSI5LjI5NDExNzY0NzA1ODgyMiIgY3AyeD0iMTYuMTc2NDcwNTg4MjM1MjkzIiBjcDJ5PSI1LjI5NDExNzY0NzA1ODgyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjc0NTA5ODA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjkyNDk5OTk5NDYzNTU4MyIgeTE9IjAuOTI4NTcxNDI4NTcxNDI4MyIgeDI9IjAuOTI0OTk5OTk4NjA5MjI1MyIgeTI9IjAuMDA0MjAxNjgwNjcyMjY4ODcxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjQuMCIgY3AxeD0iMTIuMCIgY3AxeT0iNC4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMi4wIiB5PSIxMS4wIiBjcDF4PSIxMi4wIiBjcDF5PSIxMS4wIiBjcDJ4PSIxMi4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC45NDExNzY0NzA1ODgyMzU1IiB5PSI3LjQ5OTk5OTk5OTk5OTk5OSIgY3AxeD0iNC45NDExNzY0NzA1ODgyMzU1IiBjcDF5PSI3LjQ5OTk5OTk5OTk5OTk5OSIgY3AyeD0iNC45NDExNzY0NzA1ODgyMzU1IiBjcDJ5PSI3LjQ5OTk5OTk5OTk5OTk5OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjYiIGdyZWVuPSIxMzEiIGJsdWU9IjEzNSIgYWxwaGE9IjIxMSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDM3MDM3MDE1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDM4NTk2NDYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIxNTY4NjI2IiBhbHBoYU9mZnNldD0iLTQ0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MiIgZ3JlZW49IjI1NCIgYmx1ZT0iMjU1IiBhbHBoYT0iNzciIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjA1NTU1NTUyMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk4NzYxNjEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTc4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjAiIHkxPSIwLjUiIHgyPSIwLjU3MzUyOTQxMTc2NDcwNyIgeTI9IjAuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSItMC4wNTg4MjM1Mjk0MTE3NjQ3MDUiIHk9IjEuMDI5NDExNzY0NzA1ODgyMiIgY3AxeD0iLTAuMDU4ODIzNTI5NDExNzY0NzA1IiBjcDF5PSIxLjAyOTQxMTc2NDcwNTg4MjIiIGNwMng9Ii0wLjA1ODgyMzUyOTQxMTc2NDcwNSIgY3AyeT0iMS4wMjk0MTE3NjQ3MDU4ODIyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC45NzA1ODgyMzUyOTQxMTc1IiB5PSIxLjQ5OTk5OTk5OTk5OTk5ODciIGNwMXg9IjAuOTcwNTg4MjM1Mjk0MTE3NSIgY3AxeT0iMS40OTk5OTk5OTk5OTk5OTg3IiBjcDJ4PSIwLjk3MDU4ODIzNTI5NDExNzUiIGNwMnk9IjEuNDk5OTk5OTk5OTk5OTk4NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuOTQxMTc2NDcwNTg4MjM1NSIgeT0iMi4wMjk0MTE3NjQ3MDU4ODIyIiBjcDF4PSIxLjk0MTE3NjQ3MDU4ODIzNTUiIGNwMXk9IjIuMDI5NDExNzY0NzA1ODgyMiIgY3AyeD0iMS45NDExNzY0NzA1ODgyMzU1IiBjcDJ5PSIyLjAyOTQxMTc2NDcwNTg4MjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjk0MTE3NjQ3MDU4ODIzNTUiIHk9IjE1LjAyOTQxMTc2NDcwNTg4MiIgY3AxeD0iMS45NDExNzY0NzA1ODgyMzU1IiBjcDF5PSIxNS4wMjk0MTE3NjQ3MDU4ODIiIGNwMng9IjEuOTQxMTc2NDcwNTg4MjM1NSIgY3AyeT0iMTUuMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iLTAuMDU4ODIzNTI5NDExNzY0NzA1IiB5PSIxNS4wMjk0MTE3NjQ3MDU4ODIiIGNwMXg9Ii0wLjA1ODgyMzUyOTQxMTc2NDcwNSIgY3AxeT0iMTUuMDI5NDExNzY0NzA1ODgyIiBjcDJ4PSItMC4wNTg4MjM1Mjk0MTE3NjQ3MDUiIGNwMnk9IjE1LjAyOTQxMTc2NDcwNTg4MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjYiIGdyZWVuPSIxMzEiIGJsdWU9IjEzNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDM3MDM3MDE1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDM4NTk2NDYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIxNTY4NjI2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDY1ODY4MjY2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MCIgZ3JlZW49IjE4NSIgYmx1ZT0iMTg3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wNjM0OTIwNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMDkzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjExMzc3MjQ1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNSIgZ3JlZW49IjIxMCIgYmx1ZT0iMjEzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wNDg2MTExMDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3Mjk2NzYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA5MDE5NjA3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzQ3MzA1NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODciIGdyZWVuPSIxOTMiIGJsdWU9IjE5OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDM1MzUzNTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1NDk3MDc2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzMTM3MjU0NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0MDcxODYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgwIiBncmVlbj0iMTg3IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAzNDE4ODAzMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQzMTY4ODA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkyODE0Mzc0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNyIgZ3JlZW49IjIxMyIgYmx1ZT0iMjE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMzUzNTM1NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDYwMDY3NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDk4MDM5MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjAuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMC4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI1LjAiIGNwMXg9IjE2LjI5NDExNzY0NzA1ODgzNyIgY3AxeT0iMS45NzA1ODgyMzUyOTQxMTc4IiBjcDJ4PSIxNy43MDU4ODIzNTI5NDExNjMiIGNwMnk9IjguMDI5NDExNzY0NzA1ODgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuMCIgeT0iMTEuMCIgY3AxeD0iMTguMCIgY3AxeT0iOS4wNTg4MjM1Mjk0MTE3NjQiIGNwMng9IjIyLjAiIGNwMnk9IjEyLjk0MTE3NjQ3MDU4ODIzNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI1LjAiIHk9IjE0LjAiIGNwMXg9IjI1LjAiIGNwMXk9IjE0LjAiIGNwMng9IjI1LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNS4wIiB5PSIxNS4wIiBjcDF4PSIyNS4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIyNS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxNS4wIiBjcDF4PSIwLjAiIGNwMXk9IjE1LjAiIGNwMng9IjAuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyNS4wIiB5PSIxNS4wIiBjcDF4PSIyNS4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIyNS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTRkOThhZWU2Mi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9mb3JlZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgICAgPHJlZ2lvbiBuYW1lPSJTY3JvbGxCYXJUaHVtYiIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIzOCIgaGVpZ2h0PSIxNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMTUiIHJpZ2h0PSIxNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDQiIGdyZWVuPSIxMjUiIGJsdWU9IjE0MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDE3Mjg1OTQzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNjI5ODciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDQiIGdyZWVuPSIxMjUiIGJsdWU9IjE0MyIgYWxwaGE9IjAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzYyOTg3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9Ii0yNTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuOTQwOTA5MDkwOTA5MDg5IiB5MT0iMC4wMzU5MjgxNDQxMjI5MTkzNCIgeDI9IjAuNTk1NDU0NTQ1NDU0NTQ1NyIgeTI9IjAuMjYzNDczMDQ1NDgwMTU3NzYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzcuMDQ1NDU0NTQ1NDU0NTUiIHk9IjAuMCIgY3AxeD0iMzcuMDQ1NDU0NTQ1NDU0NTUiIGNwMXk9IjAuMCIgY3AyeD0iMzcuMDQ1NDU0NTQ1NDU0NTUiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMyLjA0NTQ1NDU0NTQ1NDU1IiB5PSIwLjAiIGNwMXg9IjMyLjA0NTQ1NDU0NTQ1NDU1IiBjcDF5PSIwLjAiIGNwMng9IjMyLjA0NTQ1NDU0NTQ1NDU1IiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNC42ODE4MTgxODE4MTgxOTQiIHk9IjIuMCIgY3AxeD0iMzQuMDAwMDAwMDAwMDAwMDIiIGNwMXk9IjAuNzcyNzI3MjcyNzI3MjcyOSIgY3AyeD0iMzUuMzYzNjM2MzYzNjM2MzciIGNwMnk9IjMuMjI3MjcyNzI3MjcyNzI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzUuNTkwOTA5MDkwOTA5MDgiIHk9IjcuNTkwOTA5MDkwOTA5MDk0IiBjcDF4PSIzNS41OTA5MDkwOTA5MDkwOCIgY3AxeT0iNy41OTA5MDkwOTA5MDkwOTQiIGNwMng9IjM1LjU5MDkwOTA5MDkwOTA4IiBjcDJ5PSI3LjU5MDkwOTA5MDkwOTA5NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyOS4zNjM2MzYzNjM2MzYzNjciIHk9IjcuNjgxODE4MTgxODE4MTgyIiBjcDF4PSIyOS4zNjM2MzYzNjM2MzYzNjciIGNwMXk9IjcuNjgxODE4MTgxODE4MTgyIiBjcDJ4PSIyOS4zNjM2MzYzNjM2MzYzNjciIGNwMnk9IjcuNjgxODE4MTgxODE4MTgyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwNCIgZ3JlZW49IjEyNSIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTcyODU5NDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM2Mjk4NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyOSIgZ3JlZW49IjE0OCIgYmx1ZT0iMTY1IiBhbHBoYT0iMzMiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4yMDM0ODU1RS01IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40MTc1MzI0NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTgwMzkyMSIgYWxwaGFPZmZzZXQ9Ii0yMjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMDY4MTgxODE4MTgxODE4MTQiIHkxPSItMC4wMDU5NTIzODEwNTM3NDkzOTgiIHgyPSIwLjM2ODkwOTA4ODcxMTgyNTU0IiB5Mj0iMC4yMzkyOTE3MTc1Njg3NDkwNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjAuMCIgY3AxeD0iNi4wIiBjcDF5PSIwLjAiIGNwMng9IjYuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIwLjAiIGNwMXg9IjEuMCIgY3AxeT0iMC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuNDA5MDkwOTA5MDkwOTA4MyIgeT0iNy42MzYzNjM2MzYzNjM2NDIiIGNwMXg9IjIuNDA5MDkwOTA5MDkwOTA4MyIgY3AxeT0iNy42MzYzNjM2MzYzNjM2NDIiIGNwMng9IjIuNDA5MDkwOTA5MDkwOTA4MyIgY3AyeT0iNy42MzYzNjM2MzYzNjM2NDIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAwMDAwMDAwMDAwMDAwMDQiIHk9IjIuMDQ1NDU0NTQ1NDU0NTUwMyIgY3AxeD0iMi4wNDU0NTQ1NDU0NTQ1NDQiIGNwMXk9IjMuNTkwOTA5MDkwOTA5MDk3NSIgY3AyeD0iMy45NTQ1NDU0NTQ1NDU0NTciIGNwMnk9IjAuNTAwMDAwMDAwMDAwMDAzMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDM4OTIyMTU3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MyIgZ3JlZW49IjE5NCIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjcuMTM0MDhFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUzMjc3MzE0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYyODc0MjUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUyIiBncmVlbj0iMjUzIiBibHVlPSIyNTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzMTc2MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDQzMTM3MjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zMjkzNDEzMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjgiIGdyZWVuPSIxODkiIGJsdWU9IjIwOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ0MzQwNjU4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI2NjY2NjY1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQ5NzAwNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTciIGdyZWVuPSIyMTgiIGJsdWU9IjIzNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2NjkzNzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzgwMzkyMTMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzNyIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjA3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjUxMjYwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIwLjAiIGNwMng9IjEuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxLjAiIGNwMXg9IjEuMCIgY3AxeT0iMS4wIiBjcDJ4PSIwLjk1NDU0NTQ1NDU0NTQ1NDYiIGNwMnk9IjkuNDU0NTQ1NDU0NTQ1NDUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxNC4wIiBjcDF4PSI5LjEzNjM2MzYzNjM2MzY0NiIgY3AxeT0iMTQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIzLjAiIHk9IjE0LjAiIGNwMXg9IjIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjI4LjkwOTA5MDkwOTA5MDkzNSIgY3AyeT0iMTMuOTk5OTk5OTk5OTk5OTk2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzcuMCIgeT0iMS4wIiBjcDF4PSIzNi45NTQ1NDU0NTQ1NDU0NSIgY3AxeT0iOS4zNjM2MzYzNjM2MzYzNiIgY3AyeD0iMzcuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzcuMCIgeT0iMC4wIiBjcDF4PSIzNy4wIiBjcDF5PSIwLjAiIGNwMng9IjM3LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5IiBncmVlbj0iMzAiIGJsdWU9IjQ5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iMC4xODA2MTIyNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzU2ODYyNzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU0IiBncmVlbj0iNzUiIGJsdWU9Ijk0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjEwMTgyMzciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4MDM5MjE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEuMCIgY3AxeD0iMC4wIiBjcDF5PSIxLjAiIGNwMng9IjAuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTUuMCIgY3AxeD0iNS4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjMuMCIgeT0iMTUuMCIgY3AxeD0iMjMuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMzMuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM4LjAiIHk9IjEuMCIgY3AxeD0iMzguMCIgY3AxeT0iNy4wIiBjcDJ4PSIzOC4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOC4wIiB5PSIwLjAiIGNwMXg9IjM4LjAiIGNwMXk9IjAuMCIgY3AyeD0iMzguMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNlNmEyNDU4OS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjM4IiBoZWlnaHQ9IjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIxNSIgcmlnaHQ9IjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwNCIgZ3JlZW49IjEyNSIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTcyODU5NDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM2Mjk4NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwNCIgZ3JlZW49IjEyNSIgYmx1ZT0iMTQzIiBhbHBoYT0iMCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDE3Mjg1OTQzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNjI5ODciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iLTI1NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC45NDA5MDkwOTA5MDkwODkiIHkxPSIwLjAzNTkyODE0NDEyMjkxOTM0IiB4Mj0iMC41OTU0NTQ1NDU0NTQ1NDU3IiB5Mj0iMC4yNjM0NzMwNDU0ODAxNTc3NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNy4wNDU0NTQ1NDU0NTQ1NSIgeT0iMC4wIiBjcDF4PSIzNy4wNDU0NTQ1NDU0NTQ1NSIgY3AxeT0iMC4wIiBjcDJ4PSIzNy4wNDU0NTQ1NDU0NTQ1NSIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzIuMDQ1NDU0NTQ1NDU0NTUiIHk9IjAuMCIgY3AxeD0iMzIuMDQ1NDU0NTQ1NDU0NTUiIGNwMXk9IjAuMCIgY3AyeD0iMzIuMDQ1NDU0NTQ1NDU0NTUiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM0LjY4MTgxODE4MTgxODE5NCIgeT0iMi4wIiBjcDF4PSIzNC4wMDAwMDAwMDAwMDAwMiIgY3AxeT0iMC43NzI3MjcyNzI3MjcyNzI5IiBjcDJ4PSIzNS4zNjM2MzYzNjM2MzYzNyIgY3AyeT0iMy4yMjcyNzI3MjcyNzI3MjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNS41OTA5MDkwOTA5MDkwOCIgeT0iNy41OTA5MDkwOTA5MDkwOTQiIGNwMXg9IjM1LjU5MDkwOTA5MDkwOTA4IiBjcDF5PSI3LjU5MDkwOTA5MDkwOTA5NCIgY3AyeD0iMzUuNTkwOTA5MDkwOTA5MDgiIGNwMnk9IjcuNTkwOTA5MDkwOTA5MDk0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI5LjM2MzYzNjM2MzYzNjM2NyIgeT0iNy42ODE4MTgxODE4MTgxODIiIGNwMXg9IjI5LjM2MzYzNjM2MzYzNjM2NyIgY3AxeT0iNy42ODE4MTgxODE4MTgxODIiIGNwMng9IjI5LjM2MzYzNjM2MzYzNjM2NyIgY3AyeT0iNy42ODE4MTgxODE4MTgxODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA0IiBncmVlbj0iMTI1IiBibHVlPSIxNDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzYyOTg3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI5IiBncmVlbj0iMTQ4IiBibHVlPSIxNjUiIGFscGhhPSIzMyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjIwMzQ4NTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQxNzUzMjQ3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA5ODAzOTIxIiBhbHBoYU9mZnNldD0iLTIyMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4wNjgxODE4MTgxODE4MTgxNCIgeTE9Ii0wLjAwNTk1MjM4MTA1Mzc0OTM5OCIgeDI9IjAuMzY4OTA5MDg4NzExODI1NTQiIHkyPSIwLjIzOTI5MTcxNzU2ODc0OTA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMC4wIiBjcDF4PSI2LjAiIGNwMXk9IjAuMCIgY3AyeD0iNi4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIwLjAiIGNwMng9IjEuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi40MDkwOTA5MDkwOTA5MDgzIiB5PSI3LjYzNjM2MzYzNjM2MzY0MiIgY3AxeD0iMi40MDkwOTA5MDkwOTA5MDgzIiBjcDF5PSI3LjYzNjM2MzYzNjM2MzY0MiIgY3AyeD0iMi40MDkwOTA5MDkwOTA5MDgzIiBjcDJ5PSI3LjYzNjM2MzYzNjM2MzY0MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDAwMDAwMDAwMDAwMDAwNCIgeT0iMi4wNDU0NTQ1NDU0NTQ1NTAzIiBjcDF4PSIyLjA0NTQ1NDU0NTQ1NDU0NCIgY3AxeT0iMy41OTA5MDkwOTA5MDkwOTc1IiBjcDJ4PSIzLjk1NDU0NTQ1NDU0NTQ1NyIgY3AyeT0iMC41MDAwMDAwMDAwMDAwMDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wMzg5MjIxNTciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg5IiBncmVlbj0iMTk2IiBibHVlPSIyMDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTAyMzcyMTciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2MjE4NDkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjUwOTgwMzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNjI4NzQyNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTMiIGdyZWVuPSIyNTMiIGJsdWU9IjI1NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzE3NzczIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ0NzA1ODgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zMjkzNDEzMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODciIGdyZWVuPSIyMDgiIGJsdWU9IjIyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1OTUwMjg1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0MTE3NjQ1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQ5NzAwNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTYiIGdyZWVuPSIyMzciIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDE3Mjg1OTQzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40ODI3NzMxMyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMC4wIiBjcDF4PSIxLjAiIGNwMXk9IjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjEuMCIgY3AxeD0iMS4wIiBjcDF5PSIxLjAiIGNwMng9IjAuOTU0NTQ1NDU0NTQ1NDU0NiIgY3AyeT0iOS40NTQ1NDU0NTQ1NDU0NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjE0LjAiIGNwMXg9IjkuMTM2MzYzNjM2MzYzNjQ2IiBjcDF5PSIxNC4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjMuMCIgeT0iMTQuMCIgY3AxeD0iMjMuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMjguOTA5MDkwOTA5MDkwOTM1IiBjcDJ5PSIxMy45OTk5OTk5OTk5OTk5OTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNy4wIiB5PSIxLjAiIGNwMXg9IjM2Ljk1NDU0NTQ1NDU0NTQ1IiBjcDF5PSI5LjM2MzYzNjM2MzYzNjM2IiBjcDJ4PSIzNy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNy4wIiB5PSIwLjAiIGNwMXg9IjM3LjAiIGNwMXk9IjAuMCIgY3AyeD0iMzcuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkiIGdyZWVuPSIzMCIgYmx1ZT0iNDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjE4MDYxMjI3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNTY4NjI3OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTQiIGdyZWVuPSI3NSIgYmx1ZT0iOTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yMTAxODIzNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTgwMzkyMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMS4wIiBjcDF4PSIwLjAiIGNwMXk9IjEuMCIgY3AyeD0iMC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxNS4wIiBjcDF4PSI1LjAiIGNwMXk9IjE1LjAiIGNwMng9IjE1LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMy4wIiB5PSIxNS4wIiBjcDF4PSIyMy4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIzMy4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzguMCIgeT0iMS4wIiBjcDF4PSIzOC4wIiBjcDF5PSI3LjAiIGNwMng9IjM4LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM4LjAiIHk9IjAuMCIgY3AxeD0iMzguMCIgY3AxeT0iMC4wIiBjcDJ4PSIzOC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDFlYzI5NmYxLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMzgiIGhlaWdodD0iMTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjE1IiByaWdodD0iMTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzYiIGdyZWVuPSI0MiIgYmx1ZT0iNDgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4NTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM2MDc4NDM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDQiIGdyZWVuPSIxMjUiIGJsdWU9IjE0MyIgYWxwaGE9IjAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzYyOTg3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9Ii0yNTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuOTQwOTA5MDkwOTA5MDg5IiB5MT0iMC4wMzU5MjgxNDQxMjI5MTkzNCIgeDI9IjAuMzc2MTU2MzI5MTkzMzYzNCIgeTI9IjAuMzQ5MTAxNzg4OTczMTE0OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNy4wNDU0NTQ1NDU0NTQ1NSIgeT0iMC4wIiBjcDF4PSIzNy4wNDU0NTQ1NDU0NTQ1NSIgY3AxeT0iMC4wIiBjcDJ4PSIzNy4wNDU0NTQ1NDU0NTQ1NSIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzEuMzQ1NDU0NTQ1NDU0NTQiIHk9IjAuMCIgY3AxeD0iMzEuMzQ1NDU0NTQ1NDU0NTQiIGNwMXk9IjAuMCIgY3AyeD0iMzEuMzQ1NDU0NTQ1NDU0NTQiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM0LjM4MTgxODE4MTgxODIxIiB5PSIyLjA5OTk5OTk5OTk5OTk5OTYiIGNwMXg9IjMzLjcwMDAwMDAwMDAwMDA0IiBjcDF5PSIwLjg3MjcyNzI3MjcyNzI3MyIgY3AyeD0iMzUuMDYzNjM2MzYzNjM2Mzg0IiBjcDJ5PSIzLjMyNzI3MjcyNzI3MjcyNjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNS41OTA5MDkwOTA5MDkwOCIgeT0iNy41OTA5MDkwOTA5MDkwOTQiIGNwMXg9IjM1LjU5MDkwOTA5MDkwOTA4IiBjcDF5PSI3LjU5MDkwOTA5MDkwOTA5NCIgY3AyeD0iMzUuNTkwOTA5MDkwOTA5MDgiIGNwMnk9IjcuNTkwOTA5MDkwOTA5MDk0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI5LjM2MzYzNjM2MzYzNjM2NyIgeT0iNy42ODE4MTgxODE4MTgxODIiIGNwMXg9IjI5LjM2MzYzNjM2MzYzNjM2NyIgY3AxeT0iNy42ODE4MTgxODE4MTgxODIiIGNwMng9IjI5LjM2MzYzNjM2MzYzNjM2NyIgY3AyeT0iNy42ODE4MTgxODE4MTgxODIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzkiIGdyZWVuPSI0NyIgYmx1ZT0iNTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTguNzM4NjM3RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNTc5MzY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMzcyNTQ5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI5IiBncmVlbj0iMTQ4IiBibHVlPSIxNjUiIGFscGhhPSIzMyIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjIwMzQ4NTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQxNzUzMjQ3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA5ODAzOTIxIiBhbHBoYU9mZnNldD0iLTIyMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4wNjgxODE4MTgxODE4MTgxNCIgeTE9Ii0wLjAwNTk1MjM4MTA1Mzc0OTM5OCIgeDI9IjAuMzY4OTA5MDg4NzExODI1NTQiIHkyPSIwLjIzOTI5MTcxNzU2ODc0OTA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMC4wIiBjcDF4PSI2LjAiIGNwMXk9IjAuMCIgY3AyeD0iNi4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIwLjAiIGNwMng9IjEuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi40MDkwOTA5MDkwOTA5MDgzIiB5PSI3LjYzNjM2MzYzNjM2MzY0MiIgY3AxeD0iMi40MDkwOTA5MDkwOTA5MDgzIiBjcDF5PSI3LjYzNjM2MzYzNjM2MzY0MiIgY3AyeD0iMi40MDkwOTA5MDkwOTA5MDgzIiBjcDJ5PSI3LjYzNjM2MzYzNjM2MzY0MiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDAwMDAwMDAwMDAwMDAwNCIgeT0iMi4wNDU0NTQ1NDU0NTQ1NTAzIiBjcDF4PSIyLjA0NTQ1NDU0NTQ1NDU0NCIgY3AxeT0iMy41OTA5MDkwOTA5MDkwOTc1IiBjcDJ4PSIzLjk1NDU0NTQ1NDU0NTQ1NyIgY3AyeT0iMC41MDAwMDAwMDAwMDAwMDMxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wMzg5MjIxNTciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODkiIGdyZWVuPSIxMTMiIGJsdWU9IjEzNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMjkwODY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjkwMTI2MDYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxNTY4NjI3NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2Mjg3NDI1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1MSIgZ3JlZW49IjE3NSIgYmx1ZT0iMTk2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii04LjczODYzN0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDA2MTIyNDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjE5NjA3ODMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zMjkzNDEzMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NSIgZ3JlZW49IjEwMiIgYmx1ZT0iMTQ0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE3NjU4NzEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjQ5NzAwNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NiIgZ3JlZW49IjEzMyIgYmx1ZT0iMTc1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTI3MTQyODUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTM3MjU0OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTMxIiBncmVlbj0iMTc3IiBibHVlPSIyMjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDE4NzI3MTgzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yMzExNjg4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMTM3MjU0NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIwLjAiIGNwMng9IjEuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxLjAiIGNwMXg9IjEuMCIgY3AxeT0iMS4wIiBjcDJ4PSIwLjk1NDU0NTQ1NDU0NTQ1NDYiIGNwMnk9IjkuNDU0NTQ1NDU0NTQ1NDUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxNC4wIiBjcDF4PSI5LjEzNjM2MzYzNjM2MzY0NiIgY3AxeT0iMTQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIzLjAiIHk9IjE0LjAiIGNwMXg9IjIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjI4LjkwOTA5MDkwOTA5MDkzNSIgY3AyeT0iMTMuOTk5OTk5OTk5OTk5OTk2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzcuMCIgeT0iMS4wIiBjcDF4PSIzNi45NTQ1NDU0NTQ1NDU0NSIgY3AxeT0iOS4zNjM2MzYzNjM2MzYzNiIgY3AyeD0iMzcuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzcuMCIgeT0iMC4wIiBjcDF4PSIzNy4wIiBjcDF5PSIwLjAiIGNwMng9IjM3LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQiIGdyZWVuPSIzMCIgYmx1ZT0iNTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDEzNDgzMTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjI5MDIxMTYyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zMzcyNTQ5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxLjAiIGNwMXg9IjAuMCIgY3AxeT0iMS4wIiBjcDJ4PSIwLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjE1LjAiIGNwMXg9IjUuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIzLjAiIHk9IjE1LjAiIGNwMXg9IjIzLjAiIGNwMXk9IjE1LjAiIGNwMng9IjMzLjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOC4wIiB5PSIxLjAiIGNwMXg9IjM4LjAiIGNwMXk9IjcuMCIgY3AyeD0iMzguMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzguMCIgeT0iMC4wIiBjcDF4PSIzOC4wIiBjcDF5PSIwLjAiIGNwMng9IjM4LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0ZDk4NGZhNDEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvcmVnaW9uPgorICAgICAgICAgICAgPHJlZ2lvbiBuYW1lPSJTY3JvbGxCYXJUcmFjayIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+Mi4wPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjE4LjAiIHkxPSIwLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDE2MTI5MDMyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MSIgZ3JlZW49IjE5MiIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwMDE2MzYyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2MTI5MDMyNCIgbWlkcG9pbnQ9IjAuNDkwMTk2MDgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk3IiBncmVlbj0iMTk4IiBibHVlPSIxOTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTAwNDc2MDY0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI2NDUxNjEyIiBtaWRwb2ludD0iMC4yNzk3OTI3NiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjMiIGdyZWVuPSIyMjMiIGJsdWU9IjIyNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNjA2MjAzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuODgzODcwOTYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUzIiBncmVlbj0iMjUzIiBibHVlPSIyNTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MDEzOGU5YmUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMzQiIGhlaWdodD0iMTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjEwIiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjAiIGdyZWVuPSIxNjMiIGJsdWU9IjE2NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDE1ODcyOTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjg2MTAxNSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDkwMTk2MDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIwNCIgYmx1ZT0iMjEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NzY2OTE3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC44NjQ1ODM0NTU0NDAwOTUyIiB5MT0iMC4yMDk1MjM4MDk1MjM4MDk1MyIgeDI9IjAuMDIwODMzMTg4NDYwOTAzODk0IiB5Mj0iMC45NTIzODA5NTIzODA5NTI2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI1Ljk5OTk5OTk5OTk5OTk4IiB5PSIxMy40OTk5OTk5OTk5OTk5OTgiIGNwMXg9IjI1LjU3MTQyODU3MTQyODU0OCIgY3AxeT0iMTIuODU3MTQyODU3MTQyODYiIGNwMng9IjI2LjQyODU3MTQyODU3MTQxIiBjcDJ5PSIxNC4xNDI4NTcxNDI4NTcxMzciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzMC42NDI4NTcxNDI4NTcxNDIiIHk9IjEwLjk5OTk5OTk5OTk5OTk5NiIgY3AxeD0iMjkuMDcxNDI4NTcxNDI4NTciIGNwMXk9IjEyLjY0Mjg1NzE0Mjg1NzEzNSIgY3AyeD0iMzIuMjE0Mjg1NzE0Mjg1NzE1IiBjcDJ5PSI5LjM1NzE0Mjg1NzE0Mjg1OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMyLjU3MTQyODU3MTQyODU3IiB5PSI2LjkyODU3MTQyODU3MTQzMSIgY3AxeD0iMzMuMjg1NzE0Mjg1NzE0MjkiIGNwMXk9IjcuNTcxNDI4NTcxNDI4NTc2NSIgY3AyeD0iMzEuODU3MTQyODU3MTQyODQ3IiBjcDJ5PSI2LjI4NTcxNDI4NTcxNDI4NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI5LjcxNDI4NTcxNDI4NTcxIiB5PSIxMC4yODU3MTQyODU3MTQyODUiIGNwMXg9IjMwLjQyODU3MTQyODU3MTQyMyIgY3AxeT0iOS40Mjg1NzE0Mjg1NzE0MyIgY3AyeD0iMjkuMCIgY3AyeT0iMTEuMTQyODU3MTQyODU3MTM5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1NSIgZ3JlZW49IjE1OCIgYmx1ZT0iMTYyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTU4NzI5NTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NzMxNjQ0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMDk4MDM5MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwOSIgZ3JlZW49IjIxMiIgYmx1ZT0iMjE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2OTI0MTkxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwOTgwMzkxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMTI3MTkyOTg4NjIwMjM5OTgiIHkxPSIwLjEzMTU3ODk0MDc2NDAyODYiIHgyPSIwLjkwNzg5NDcyODkxNjgzNCIgeTI9IjAuODc3MTkyOTg4NjIwMjQwMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjE0Mjg1NzE0Mjg1NzE0MjgiIHk9IjYuODU3MTQyODU3MTQyODU4IiBjcDF4PSIwLjM1NzE0Mjg1NzE0Mjg1NzIiIGNwMXk9IjcuNDI4NTcxNDI4NTcxNDMxIiBjcDJ4PSIxLjkyODU3MTQyODU3MTQyODQiIGNwMnk9IjYuMjg1NzE0Mjg1NzE0Mjg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC42NDI4NTcxNDI4NTcxNDIiIHk9IjEwLjM1NzE0Mjg1NzE0Mjg2IiBjcDF4PSIzLjI4NTcxNDI4NTcxNDI4NSIgY3AxeT0iOC43ODU3MTQyODU3MTQyOSIgY3AyeD0iNi4wIiBjcDJ5PSIxMS45Mjg1NzE0Mjg1NzE0MjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjcxNDI4NTcxNDI4NTcxMiIgeT0iMTMuNjQyODU3MTQyODU3MTQiIGNwMXg9IjguOTI4NTcxNDI4NTcxNDI1IiBjcDF5PSIxMi42NDI4NTcxNDI4NTcxNCIgY3AyeD0iOC40OTk5OTk5OTk5OTk5OTgiIGNwMnk9IjE0LjY0Mjg1NzE0Mjg1NzE0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy41NzE0Mjg1NzE0Mjg1NzA3IiB5PSIxMS41NzE0Mjg1NzE0Mjg1NzMiIGNwMXg9IjUuMDcxNDI4NTcxNDI4NTcxIiBjcDF5PSIxMy4yMTQyODU3MTQyODU3MTkiIGNwMng9IjIuMDcxNDI4NTcxNDI4NTcwMyIgY3AyeT0iOS45Mjg1NzE0Mjg1NzE0MjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjg3MDk2Nzc1Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjYwIiBncmVlbj0iNjEiIGJsdWU9IjYyIiBhbHBoYT0iMCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzgyNjgyNSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTAxOTYwOCIgYWxwaGFPZmZzZXQ9Ii0yNTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTYiIGdyZWVuPSI1NyIgYmx1ZT0iNTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDU5Njc4ODYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUxMzcyNTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSItMC4wNDU5MTgzNjczNDY5Mzg3MzYiIHkxPSIwLjE4MzM2NDI1MzkxNzA5MjIiIHgyPSIwLjg3MjQ0ODk3OTU5MTgzNjgiIHkyPSIwLjA0MDUwNzExMTA1OTk0OTIyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNC4wIiB5PSIwLjAiIGNwMXg9IjM0LjAiIGNwMXk9IjAuMCIgY3AyeD0iMzQuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjcuMCIgeT0iMC4wIiBjcDF4PSIyNy4wIiBjcDF5PSIwLjAiIGNwMng9IjI3LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjI3LjAiIHk9IjE0LjAiIGNwMXg9IjI3LjAiIGNwMXk9IjE0LjAiIGNwMng9IjI3LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzMS4wNzE0Mjg1NzE0Mjg1NSIgeT0iMTAuOTI4NTcxNDI4NTcxNDI1IiBjcDF4PSIzMC4wNzE0Mjg1NzE0Mjg1NSIgY3AxeT0iMTEuOTI4NTcxNDI4NTcxNDI1IiBjcDJ4PSIzMi4wNzE0Mjg1NzE0Mjg1NTUiIGNwMnk9IjkuOTI4NTcxNDI4NTcxNDI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzQuMCIgeT0iNi4wIiBjcDF4PSIzNC4wIiBjcDF5PSI2LjAiIGNwMng9IjM0LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NiIgZ3JlZW49IjU3IiBibHVlPSI1OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTk2Nzg4NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTEzNzI1NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTYiIGdyZWVuPSI1NyIgYmx1ZT0iNTkiIGFscGhhPSIwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTY3ODg2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC41MTM3MjU1IiBhbHBoYU9mZnNldD0iLTI1NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4wIiB5MT0iMC4wIiB4Mj0iMC45Mjg1NzE0Mjg1NzE0MjgyIiB5Mj0iMC4xMjI0NDg5Nzk1OTE4MzY3MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjAuMCIgY3AxeD0iNy4wIiBjcDF5PSIwLjAiIGNwMng9IjcuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNi4wIiBjcDF4PSIwLjAiIGNwMXk9IjYuMCIgY3AyeD0iMC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjExLjAiIGNwMXg9IjIuMCIgY3AxeT0iMTAuMCIgY3AyeD0iNC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi43ODU3MTQyODU3MTQyODQiIHk9IjEzLjk5OTk5OTk5OTk5OTk5NSIgY3AxeD0iNi43ODU3MTQyODU3MTQyODQiIGNwMXk9IjEzLjk5OTk5OTk5OTk5OTk5NSIgY3AyeD0iNi43ODU3MTQyODU3MTQyODQiIGNwMnk9IjEzLjk5OTk5OTk5OTk5OTk5NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjM0LjAiIHkxPSIwLjAiIHkyPSIxNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDQiIGdyZWVuPSIxMDUiIGJsdWU9IjEwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMjIyMjIyOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY0NjU0NzUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMxNzY0NzA3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYxMjkwMzI0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNCIgZ3JlZW49IjEzNiIgYmx1ZT0iMTQwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NzY2OTE3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEzMjI1ODA2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MCIgZ3JlZW49IjE3MyIgYmx1ZT0iMTc4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NTU4MjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA0NzA1ODgyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzA5Njc3NDIiIG1pZHBvaW50PSIwLjMyMTA1MjY0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5NSIgZ3JlZW49IjE5NyIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAxMzg4ODg5NTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MTExNzQ0NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjgyMjU4MDY0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MDE2NzU3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwMTIyZmI5MC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3JlZ2lvbj4KKyAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSlNjcm9sbFBhbmUiIG5hbWU9IlNjcm9sbFBhbmUiIHVpPSJTY3JvbGxQYW5lVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMyIgYm90dG9tPSIzIiBsZWZ0PSIzIiByaWdodD0iMyIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InVzZUNoaWxkVGV4dENvbXBvbmVudEZvY3VzIiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjIuMCIgY3AxeD0iMi4wIiBjcDF5PSIyLjAiIGNwMng9IjIuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIyMi4wIiBjcDF4PSIyLjAiIGNwMXk9IjIyLjAiIGNwMng9IjIuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyMC4wIiB5PSIyMi4wIiBjcDF4PSIxMjAuMCIgY3AxeT0iMjIuMCIgY3AyeD0iMTIwLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjAuMCIgeT0iMi4wIiBjcDF4PSIxMjAuMCIgY3AxeT0iMi4wIiBjcDJ4PSIxMjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIxLjQiIHk9IjIuMCIgY3AxeD0iMTIxLjUiIGNwMXk9IjIuMCIgY3AyeD0iMTIxLjUiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyMS40IiB5PSIyMy40IiBjcDF4PSIxMjEuNCIgY3AxeT0iMjMuNCIgY3AyeD0iMTIxLjQiIGNwMnk9IjIzLjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjYiIHk9IjIzLjQiIGNwMXg9IjAuNiIgY3AxeT0iMjMuNCIgY3AyeD0iMC42IiBjcDJ5PSIyMy40Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42IiB5PSIwLjYiIGNwMXg9IjAuNiIgY3AxeT0iMC42IiBjcDJ4PSIwLjYiIGNwMnk9IjAuNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyMS40IiB5PSIwLjYiIGNwMXg9IjEyMS40IiBjcDF5PSIwLjYiIGNwMng9IjEyMS40IiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjEuNCIgeT0iMi4wIiBjcDF4PSIxMjEuNCIgY3AxeT0iMi4wIiBjcDJ4PSIxMjEuNCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjExOS4wIiB5MT0iMjEuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ2IiBncmVlbj0iMTUxIiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMTkuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjMuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ2IiBncmVlbj0iMTUxIiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjIuMCIgeTI9IjMuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjIxLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NiIgZ3JlZW49IjE1MSIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCb3JkZXIiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTE5LjAiIHgyPSIxMjAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ2IiBncmVlbj0iMTUxIiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIzLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NiIgZ3JlZW49IjE1MSIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCb3JkZXIiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIyLjAiIHkyPSIzLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ2IiBncmVlbj0iMTUxIiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9ib3JkZXJTdGF0ZXM+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgdHlwZT0iamF2YXguc3dpbmcuSlZpZXdwb3J0IiBuYW1lPSJWaWV3cG9ydCIgdWk9IlZpZXdwb3J0VUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpTbGlkZXIiIG5hbWU9IlNsaWRlciIgdWk9IlNsaWRlclVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkVuYWJsZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJNb3VzZU92ZXIiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJQcmVzc2VkIi8+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRGlzYWJsZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJGb2N1c2VkIi8+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iU2VsZWN0ZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJBcnJvd1NoYXBlIj4KKyAgICAgICAgICAgICAgIDxjb2RlU25pcHBldD48IVtDREFUQVsgcmV0dXJuIGMuZ2V0Q2xpZW50UHJvcGVydHkoIlNsaWRlci5wYWludFRodW1iQXJyb3dTaGFwZSIpID09IEJvb2xlYW4uVFJVRTsgXV0+PC9jb2RlU25pcHBldD4KKyAgICAgICAgICAgIDwvc3RhdGVUeXBlPgorICAgICAgICAgPC9zdGF0ZVR5cGVzPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0idGh1bWJXaWR0aCIgdHlwZT0iSU5UIiB2YWx1ZT0iMTciLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InRodW1iSGVpZ2h0IiB0eXBlPSJJTlQiIHZhbHVlPSIxNyIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0idHJhY2tCb3JkZXIiIHR5cGU9IklOVCIgdmFsdWU9IjAiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InBhaW50VmFsdWUiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0idGlja0NvbG9yIiB0eXBlPSJDT0xPUiI+CisgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNSIgZ3JlZW49IjQwIiBibHVlPSI0OCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDxyZWdpb24gbmFtZT0iU2xpZGVyVGh1bWIiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMy4wIiB4Mj0iMTQuMCIgeTE9IjMuMCIgeTI9IjE0LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMSIgZ3JlZW49IjIyNSIgYmx1ZT0iMjMxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTI0MjQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM1Njg2MjcyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDI1MTMzNjgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjEwIiBibHVlPSIyMTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjEzNDgyOTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2NzIyMTE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwOCIgZ3JlZW49IjIxNCIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41Njg0NDk3NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTAyMzUxMDk3MTc4NjgzNCIgeTE9IjAuMDAxNTY3Mzk4MTE5MTIyMjU4NyIgeDI9IjAuNTAyMzUxMDk3MTc4NjgzOCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE1LjAiIHkxPSIyLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTAiIGdyZWVuPSIxOTYiIGJsdWU9IjIwNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTYyNTQzNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTczIiBncmVlbj0iMTgwIiBibHVlPSIxODkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTUwOTgzMzMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU1MTA1ODIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE5MjE1Njg1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41MTA2MTAwNzk1NzU1OTciIHkxPSItNC41NTM2NDkxMjQ0MzkxMTlFLTE4IiB4Mj0iMC40OTkzMzY4NzAwMjY1MjUxIiB5Mj0iMS4wMDM5Nzg3Nzk4NDA4NDg4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOWVhMmMxMjUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjMuMCIgeDI9IjE0LjAiIHkxPSIzLjAiIHkyPSIxNC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDkiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMjMwOTYwODUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYyMzgwOTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MjUxMzM2OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIxODQiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQzODY2OTk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0NzA1ODgxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjk3ODYwOTYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYzIiBncmVlbj0iMTg0IiBibHVlPSIyMDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg0IiBncmVlbj0iMjA1IiBibHVlPSIyMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTcxNDI4NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjk0MTE3NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMDAxNTY3Mzk4MTE5MTIyMjU4NyIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE1LjAiIHkxPSIyLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5OCIgZ3JlZW49IjExOSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzQ1ODU5MjMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzYiIGdyZWVuPSI1NyIgYmx1ZT0iNzUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTE1NzE0MzEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI1NDkwMTk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41MSIgeTE9Ii00LjU1MzY0OTEyNDQzOTExOUUtMTgiIHgyPSIwLjUxIiB5Mj0iMS4wMDM5Nzg3Nzk4NDA4NDg4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMi4wIiB4Mj0iMTUuMCIgeTE9IjMuMCIgeTI9IjE2LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTExIiBncmVlbj0iMTE2IiBibHVlPSIxMjUiIGFscGhhPSI5OSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDAzOTY4MjM5IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAwMTQ3MzY4NzYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI1NDkwMTk4IiBhbHBoYU9mZnNldD0iLTE1NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzllMjVhM2VhLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTciIGhlaWdodD0iMTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNC4wIiB5MT0iMy4wIiB5Mj0iMTQuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ5IiBncmVlbj0iMjUxIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDIzMDk2MDg1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MjM4MDk1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzOTIxNTY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDI1MTMzNjgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYzIiBncmVlbj0iMTg0IiBibHVlPSIyMDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY5Nzg2MDk2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE4NCIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDM4NjY5OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjIwNSIgYmx1ZT0iMjI0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU3MTQyODYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI5NDExNzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAwMTU2NzM5ODExOTEyMjI1ODciIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNS4wIiB5MT0iMi4wIiB5Mj0iMTUuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTgiIGdyZWVuPSIxMTkiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM0NTg1OTIzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjM2IiBncmVlbj0iNTciIGJsdWU9Ijc1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTcyODU5NDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExNTcxNDMxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNTQ5MDE5OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTEiIHkxPSItNC41NTM2NDkxMjQ0MzkxMTlFLTE4IiB4Mj0iMC41MSIgeTI9IjEuMDAzOTc4Nzc5ODQwODQ4OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjAuNiIgeDI9IjE2LjQiIHkxPSIwLjYiIHkyPSIxNi40Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCtNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMy4wIiB4Mj0iMTQuMCIgeTE9IjMuMCIgeTI9IjE0LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MSIgZ3JlZW49IjI1MiIgYmx1ZT0iMjUzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42Mjc4MDkxNyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NDMxMzcyMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQyNTEzMzY4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NSIgZ3JlZW49IjIwNSIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjIuOTU2OTg2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDY1MzEwNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY5Nzg2MDk2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MyIgZ3JlZW49IjIwNCIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU2MzQyMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAxIiBncmVlbj0iMjIyIiBibHVlPSIyNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDczMjE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zOTIxNTY4NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTAyMzUxMDk3MTc4NjgzNCIgeTE9IjAuMDAxNTY3Mzk4MTE5MTIyMjU4NyIgeDI9IjAuNTAyMzUxMDk3MTc4NjgzOCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE1LjAiIHkxPSIyLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MyIgZ3JlZW49IjgwIiBibHVlPSIxMDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAzODIxNzkwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTU1MzIyMTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxIiBncmVlbj0iMSIgYmx1ZT0iMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ1MDk4MDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUxMDYxMDA3OTU3NTU5NyIgeTE9Ii00LjU1MzY0OTEyNDQzOTExOUUtMTgiIHgyPSIwLjQ5OTMzNjg3MDAyNjUyNTEiIHkyPSIxLjAwMzk3ODc3OTg0MDg0ODgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIwLjYiIHgyPSIxNi40IiB5MT0iMC42IiB5Mj0iMTYuNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5ZWE0YTZlNi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkZvY3VzZWQrUHJlc3NlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTciIGhlaWdodD0iMTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIzLjAiIHgyPSIxNC4wIiB5MT0iMy4wIiB5Mj0iMTQuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY2IiBncmVlbj0iMTg2IiBibHVlPSIyMDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMi45NTY5ODY0RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NDk0Mzk3NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTA5ODAzOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ3NTkzNTgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iOTgiIGJsdWU9IjE0MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTk2MjU2NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49Ijk4IiBibHVlPSIxNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSIxMjkiIGJsdWU9IjE3MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI4LjkzNzcxNjVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyMTA5NDQwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjE1Njg2MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTAyMzUxMDk3MTc4NjgzNCIgeTE9IjAuMDAxNTY3Mzk4MTE5MTIyMjU4NyIgeDI9IjAuNTAyMzUxMDk3MTc4NjgzOCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE1LjAiIHkxPSIyLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxIiBncmVlbj0iMSIgYmx1ZT0iMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ1MDk4MDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjM4IiBncmVlbj0iNjYiIGJsdWU9IjkyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ4NzU3NzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4ODIzNTMxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41MTA2MTAwNzk1NzU1OTciIHkxPSItNC41NTM2NDkxMjQ0MzkxMTlFLTE4IiB4Mj0iMC40OTkzMzY4NzAwMjY1MjUxIiB5Mj0iMS4wMDM5Nzg3Nzk4NDA4NDg4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMC42IiB4Mj0iMTYuNCIgeTE9IjAuNiIgeTI9IjE2LjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOWVhNzc1NDYucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMy4wIiB4Mj0iMTQuMCIgeTE9IjMuMCIgeTI9IjE0LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MSIgZ3JlZW49IjI1MiIgYmx1ZT0iMjUzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42Mjc4MDkxNyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NDMxMzcyMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQyNTEzMzY4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NSIgZ3JlZW49IjIwNSIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjIuOTU2OTg2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDY1MzEwNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY5Nzg2MDk2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MyIgZ3JlZW49IjIwNCIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU2MzQyMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAxIiBncmVlbj0iMjIyIiBibHVlPSIyNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDczMjE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zOTIxNTY4NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNTAyMzUxMDk3MTc4NjgzNCIgeTE9IjAuMDAxNTY3Mzk4MTE5MTIyMjU4NyIgeDI9IjAuNTAyMzUxMDk3MTc4NjgzOCIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGxpcHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjIuMCIgeDI9IjE1LjAiIHkxPSIyLjAiIHkyPSIxNS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MyIgZ3JlZW49IjgwIiBibHVlPSIxMDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAzODIxNzkwMiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTU1MzIyMTMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxIiBncmVlbj0iMSIgYmx1ZT0iMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ1MDk4MDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUxMDYxMDA3OTU3NTU5NyIgeTE9Ii00LjU1MzY0OTEyNDQzOTExOUUtMTgiIHgyPSIwLjQ5OTMzNjg3MDAyNjUyNTEiIHkyPSIxLjAwMzk3ODc3OTg0MDg0ODgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTEiIGdyZWVuPSIxMTYiIGJsdWU9IjEyNSIgYWxwaGE9Ijk5IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDM5NjgyMzkiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDAxNDczNjg3NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjU0OTAxOTgiIGFscGhhT2Zmc2V0PSItMTU2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOWVhNGE2ZTYucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgeDE9IjMuMCIgeDI9IjE0LjAiIHkxPSIzLjAiIHkyPSIxNC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjYiIGdyZWVuPSIxODYiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ0OTQzOTc2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDc1OTM1ODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTEiIGdyZWVuPSI5OCIgYmx1ZT0iMTQwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41OTYyNTY3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iOTgiIGJsdWU9IjE0MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49IjEyOSIgYmx1ZT0iMTcxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjguOTM3NzE2NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTIxMDk0NDA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyMTU2ODYyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41MDIzNTEwOTcxNzg2ODM0IiB5MT0iMC4wMDE1NjczOTgxMTkxMjIyNTg3IiB4Mj0iMC41MDIzNTEwOTcxNzg2ODM4IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSB4MT0iMi4wIiB4Mj0iMTUuMCIgeTE9IjIuMCIgeTI9IjE1LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEiIGdyZWVuPSIxIiBibHVlPSIxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDUwOTgwNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzgiIGdyZWVuPSI2NiIgYmx1ZT0iOTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDE1OTUyNTg3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDg3NTc3OSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTg4MjM1MzEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUxMDYxMDA3OTU3NTU5NyIgeTE9Ii00LjU1MzY0OTEyNDQzOTExOUUtMTgiIHgyPSIwLjQ5OTMzNjg3MDAyNjUyNTEiIHkyPSIxLjAwMzk3ODc3OTg0MDg0ODgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxsaXBzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIHgxPSIyLjAiIHgyPSIxNS4wIiB5MT0iMy4wIiB5Mj0iMTYuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjEzNCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTIxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsbGlwc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOWVhNzc1NDYucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK0Fycm93U2hhcGUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYxMjkwMzI0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAyMzA5NjA4NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjIzNzYyMTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjE0MTkzNTQ4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMiIgZ3JlZW49IjIzNyIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTQzOTIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzk5OTk5OTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40NjEyOTAzMyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjYiIGdyZWVuPSIxODciIGJsdWU9IjIwNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDE3Mjg1OTQzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NDU0NzA0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzM1NDgzOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIyMTIiIGJsdWU9IjIzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MjU1NDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzU2ODYyNzIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44NTE2MTI5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwOCIgZ3JlZW49IjIyOSIgYmx1ZT0iMjQ4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDc0NDIzOTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDIzNTI5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAyNzgwMzAzMDMwMzAyOSIgeT0iMy4wMDQ4NDg0ODQ4NDg0ODYiIGNwMXg9IjMuMDMyNjQ5MDIxMTQ5MjU2IiBjcDF5PSI0LjY2NzQ5ODEzODIzMTczNTUiIGNwMng9IjQuNTM2MDExOTc1NTM5MjQ3IiBjcDJ5PSIyLjE1NTc2MDM4NTA0NTkzOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjg0NjM2MzYzNjM2MzYzOCIgeT0iOS4yOTE4MTgxODE4MTgxODEiIGNwMXg9IjEzLjg0OTU0ODI0Mjk3NzQyNSIgY3AxeT0iOC42ODUxMjk5MjQwNzYyNTQiIGNwMng9IjEzLjg0MjQ3MzQ0MDI0MjU0NSIgY3AyeT0iMTAuMDMyOTI1ODI2NTYyMDEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjk3MjcyNzI3MjcyNzI3NTMiIHk9IjEzLjk2NjM2MzYzNjM2MzYzNSIgY3AxeD0iNC4zNTk4MjQ2NTQxNDI1MjMiIGNwMXk9IjE1LjIwNzE0NTY0NjMzNDc2NCIgY3AyeD0iMy41ODYzNjE0NDE5OTMwNjA1IiBjcDJ5PSIxMi43Mjc5MjY1MDEyNjg5MjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA0IiBncmVlbj0iMTIxIiBibHVlPSIxMzUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAzMzgyODYxNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDA2MDg0NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ4MDY0NTE1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQ3IiBncmVlbj0iNjgiIGJsdWU9Ijg3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTc1OTQ0MTgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIwNzg0MzE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzMiIgZ3JlZW49IjUwIiBibHVlPSI2NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMjMwMDczOTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMzMyNjI1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yODYyNzQ1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjA3NzY1MTUxNTE1MTUxMyIgeT0iMTQuOTc3MjcyNzI3MjcyNzIzIiBjcDF4PSIyLjMyNzY2MzU3NTkwMjY4NzYiIGNwMXk9IjEzLjg5MjkyMTY5NTI0MjYzNCIgY3AyeD0iMy45ODc0NjA0NjA1ODczOTY3IiBjcDJ5PSIxNi4yOTI2OTY5MDU4NTU4MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjA3NTc1NzU3NTc1NzU4IiB5PSI5LjI3ODQwOTA5MDkwOTA5MyIgY3AxeD0iMTUuMDkwMzQ2MzgzODU0MDgzIiBjcDF5PSIxMC4yMDc5NjExNjE4NzU2MDkiIGNwMng9IjE1LjA2MjEwMjM5NTUwOTExNiIgY3AyeT0iOC40MDgzNDQ3OTI2MTg1NDgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjA0NjE5NTY1MjE3MzkxNCIgeT0iMi4wMzU4MjAxNTgxMDI3NjciIGNwMXg9IjQuMDE5MTg5MTI3MDc4Njg0IiBjcDF5PSIwLjYxMDk1NTc2MTM4MjUxOTIiIGNwMng9IjIuMjk3Njc0NzY0NTk3NTI3IiBjcDJ5PSIzLjEzMTk2Mzk1NTk5NzYyODQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTAiIGdyZWVuPSIxNTYiIGJsdWU9IjE2OCIgYWxwaGE9IjE0NiIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjA4MzMzMzMzMzMzMzMzMiIgeT0iMi41MDM3ODc4Nzg3ODc4NzkiIGNwMXg9IjIuMjE5ODA3ODE0NjY1Njk5NyIgY3AxeT0iMi44NzI3ODMzMTQyMzIyMjEiIGNwMng9IjUuNjQ3NjYwMjEyOTQzODk0IiBjcDJ5PSIyLjE5NDAzNjU2NDc2Njc1OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1Ljk2MjcyNzI3MjcyNzI4NCIgeT0iOS4yODE4MTgxODE4MTgxODEiIGNwMXg9IjE2LjAyMDkwMDg1NzI3NjI0NiIgY3AxeT0iOC44MTcwNTQ2OTA2MjAzODgiIGNwMng9IjE1LjYyMTg1ODcxNDE2OTMxMyIgY3AyeT0iMTIuMDA1MTAzMzcyOTEwNzI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy41MDMxODE4MTgxODE4MTc1IiB5PSIxNS44NDY4MTgxODE4MTgxODMiIGNwMXg9IjguMDcxMzA5NzM1MjQ0MTA3IiBjcDF5PSIxNS44NDA4MDMyNjY2Njk4ODQiIGNwMng9Ii0wLjAyMDIxMzc0MDkxODMzMTcwMyIgY3AyeT0iMTUuODUxNDU3NDgzODkyNjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQrQXJyb3dTaGFwZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTciIGhlaWdodD0iMTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMSIgZ3JlZW49IjIyNSIgYmx1ZT0iMjMxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTI0MjQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM1Njg2MjcyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDI1MTMzNjgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjEwIiBibHVlPSIyMTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjEzNDgyOTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2NzIyMTE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwOCIgZ3JlZW49IjIxNCIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41Njg0NDk3NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAyNzgwMzAzMDMwMzAyOSIgeT0iMy4wMDQ4NDg0ODQ4NDg0ODYiIGNwMXg9IjMuMDMyNjQ5MDIxMTQ5MjU2IiBjcDF5PSI0LjY2NzQ5ODEzODIzMTczNTUiIGNwMng9IjQuNTM2MDExOTc1NTM5MjQ3IiBjcDJ5PSIyLjE1NTc2MDM4NTA0NTkzOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjg0NjM2MzYzNjM2MzYzOCIgeT0iOS4yOTE4MTgxODE4MTgxODEiIGNwMXg9IjEzLjg0OTU0ODI0Mjk3NzQyNSIgY3AxeT0iOC42ODUxMjk5MjQwNzYyNTQiIGNwMng9IjEzLjg0MjQ3MzQ0MDI0MjU0NSIgY3AyeT0iMTAuMDMyOTI1ODI2NTYyMDEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjk3MjcyNzI3MjcyNzI3NTMiIHk9IjEzLjk2NjM2MzYzNjM2MzYzNSIgY3AxeD0iNC4zNTk4MjQ2NTQxNDI1MjMiIGNwMXk9IjE1LjIwNzE0NTY0NjMzNDc2NCIgY3AyeD0iMy41ODYzNjE0NDE5OTMwNjA1IiBjcDJ5PSIxMi43Mjc5MjY1MDEyNjg5MjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkwIiBncmVlbj0iMTk2IiBibHVlPSIyMDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjEzNDgyOTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2MjU0MzYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MyIgZ3JlZW49IjE4MCIgYmx1ZT0iMTg5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDE1MDk4MzMzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NTEwNTgyMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xOTIxNTY4NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjA3NzY1MTUxNTE1MTUxMyIgeT0iMTQuOTc3MjcyNzI3MjcyNzIzIiBjcDF4PSIyLjMyNzY2MzU3NTkwMjY4NzYiIGNwMXk9IjEzLjg5MjkyMTY5NTI0MjYzNCIgY3AyeD0iMy45ODc0NjA0NjA1ODczOTY3IiBjcDJ5PSIxNi4yOTI2OTY5MDU4NTU4MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjA3NTc1NzU3NTc1NzU4IiB5PSI5LjI3ODQwOTA5MDkwOTA5MyIgY3AxeD0iMTUuMDkwMzQ2MzgzODU0MDgzIiBjcDF5PSIxMC4yMDc5NjExNjE4NzU2MDkiIGNwMng9IjE1LjA2MjEwMjM5NTUwOTExNiIgY3AyeT0iOC40MDgzNDQ3OTI2MTg1NDgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjA0NjE5NTY1MjE3MzkxNCIgeT0iMi4wMzU4MjAxNTgxMDI3NjciIGNwMXg9IjQuMDE5MTg5MTI3MDc4Njg0IiBjcDF5PSIwLjYxMDk1NTc2MTM4MjUxOTIiIGNwMng9IjIuMjk3Njc0NzY0NTk3NTI3IiBjcDJ5PSIzLjEzMTk2Mzk1NTk5NzYyODQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK0Fycm93U2hhcGUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTIiIGJsdWU9IjI1MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjI3ODA5MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDQzMTM3MjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MjUxMzM2OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODUiIGdyZWVuPSIyMDUiIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2NTMxMDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI1NDkwMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42OTc4NjA5NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODMiIGdyZWVuPSIyMDQiIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NjM0MjEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI1NDkwMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIyMiIgYmx1ZT0iMjQwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTcyODU5NDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3MzIxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNC4wMjc4MDMwMzAzMDMwMjkiIHk9IjMuMDA0ODQ4NDg0ODQ4NDg2IiBjcDF4PSIzLjAzMjY0OTAyMTE0OTI1NiIgY3AxeT0iNC42Njc0OTgxMzgyMzE3MzU1IiBjcDJ4PSI0LjUzNjAxMTk3NTUzOTI0NyIgY3AyeT0iMi4xNTU3NjAzODUwNDU5MzgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy44NDYzNjM2MzYzNjM2MzgiIHk9IjkuMjkxODE4MTgxODE4MTgxIiBjcDF4PSIxMy44NDk1NDgyNDI5Nzc0MjUiIGNwMXk9IjguNjg1MTI5OTI0MDc2MjU0IiBjcDJ4PSIxMy44NDI0NzM0NDAyNDI1NDUiIGNwMnk9IjEwLjAzMjkyNTgyNjU2MjAxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy45NzI3MjcyNzI3MjcyNzUzIiB5PSIxMy45NjYzNjM2MzYzNjM2MzUiIGNwMXg9IjQuMzU5ODI0NjU0MTQyNTIzIiBjcDF5PSIxNS4yMDcxNDU2NDYzMzQ3NjQiIGNwMng9IjMuNTg2MzYxNDQxOTkzMDYwNSIgY3AyeT0iMTIuNzI3OTI2NTAxMjY4OTIyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUzIiBncmVlbj0iODAiIGJsdWU9IjEwMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDM4MjE3OTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xNTUzMjIxMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEiIGdyZWVuPSIxIiBibHVlPSIxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDUwOTgwNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjA3NzY1MTUxNTE1MTUxMyIgeT0iMTQuOTc3MjcyNzI3MjcyNzIzIiBjcDF4PSIyLjMyNzY2MzU3NTkwMjY4NzYiIGNwMXk9IjEzLjg5MjkyMTY5NTI0MjYzNCIgY3AyeD0iMy45ODc0NjA0NjA1ODczOTY3IiBjcDJ5PSIxNi4yOTI2OTY5MDU4NTU4MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjA3NTc1NzU3NTc1NzU4IiB5PSI5LjI3ODQwOTA5MDkwOTA5MyIgY3AxeD0iMTUuMDkwMzQ2MzgzODU0MDgzIiBjcDF5PSIxMC4yMDc5NjExNjE4NzU2MDkiIGNwMng9IjE1LjA2MjEwMjM5NTUwOTExNiIgY3AyeT0iOC40MDgzNDQ3OTI2MTg1NDgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjA0NjE5NTY1MjE3MzkxNCIgeT0iMi4wMzU4MjAxNTgxMDI3NjciIGNwMXg9IjQuMDE5MTg5MTI3MDc4Njg0IiBjcDF5PSIwLjYxMDk1NTc2MTM4MjUxOTIiIGNwMng9IjIuMjk3Njc0NzY0NTk3NTI3IiBjcDJ5PSIzLjEzMTk2Mzk1NTk5NzYyODQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTAiIGdyZWVuPSIxNTYiIGJsdWU9IjE2OCIgYWxwaGE9IjE0NiIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjA4MzMzMzMzMzMzMzMzMiIgeT0iMi41MDM3ODc4Nzg3ODc4NzkiIGNwMXg9IjIuMjE5ODA3ODE0NjY1Njk5NyIgY3AxeT0iMi44NzI3ODMzMTQyMzIyMjEiIGNwMng9IjUuNjQ3NjYwMjEyOTQzODk0IiBjcDJ5PSIyLjE5NDAzNjU2NDc2Njc1OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1Ljk2MjcyNzI3MjcyNzI4NCIgeT0iOS4yODE4MTgxODE4MTgxODEiIGNwMXg9IjE2LjAyMDkwMDg1NzI3NjI0NiIgY3AxeT0iOC44MTcwNTQ2OTA2MjAzODgiIGNwMng9IjE1LjYyMTg1ODcxNDE2OTMxMyIgY3AyeT0iMTIuMDA1MTAzMzcyOTEwNzI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy41MDMxODE4MTgxODE4MTc1IiB5PSIxNS44NDY4MTgxODE4MTgxODMiIGNwMXg9IjguMDcxMzA5NzM1MjQ0MTA3IiBjcDF5PSIxNS44NDA4MDMyNjY2Njk4ODQiIGNwMng9Ii0wLjAyMDIxMzc0MDkxODMzMTcwMyIgY3AyeT0iMTUuODUxNDU3NDgzODkyNjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtBcnJvd1NoYXBlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY2IiBncmVlbj0iMTg2IiBibHVlPSIyMDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMi45NTY5ODY0RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NDk0Mzk3NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTA5ODAzOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQ3NTkzNTgyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iOTgiIGJsdWU9IjE0MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNTk2MjU2NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49Ijk4IiBibHVlPSIxNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODMiIGdyZWVuPSIxMjkiIGJsdWU9IjE3MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI4LjkzNzcxNjVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEyMTA5NDQwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjE1Njg2MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAyNzgwMzAzMDMwMzAyOSIgeT0iMy4wMDQ4NDg0ODQ4NDg0ODYiIGNwMXg9IjMuMDMyNjQ5MDIxMTQ5MjU2IiBjcDF5PSI0LjY2NzQ5ODEzODIzMTczNTUiIGNwMng9IjQuNTM2MDExOTc1NTM5MjQ3IiBjcDJ5PSIyLjE1NTc2MDM4NTA0NTkzOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjg0NjM2MzYzNjM2MzYzOCIgeT0iOS4yOTE4MTgxODE4MTgxODEiIGNwMXg9IjEzLjg0OTU0ODI0Mjk3NzQyNSIgY3AxeT0iOC42ODUxMjk5MjQwNzYyNTQiIGNwMng9IjEzLjg0MjQ3MzQ0MDI0MjU0NSIgY3AyeT0iMTAuMDMyOTI1ODI2NTYyMDEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjk3MjcyNzI3MjcyNzI3NTMiIHk9IjEzLjk2NjM2MzYzNjM2MzYzNSIgY3AxeD0iNC4zNTk4MjQ2NTQxNDI1MjMiIGNwMXk9IjE1LjIwNzE0NTY0NjMzNDc2NCIgY3AyeD0iMy41ODYzNjE0NDE5OTMwNjA1IiBjcDJ5PSIxMi43Mjc5MjY1MDEyNjg5MjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMSIgZ3JlZW49IjEiIGJsdWU9IjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0NTA5ODA3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzOCIgZ3JlZW49IjY2IiBibHVlPSI5MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTU5NTI1ODciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA0ODc1Nzc5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xODgyMzUzMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjA3NzY1MTUxNTE1MTUxMyIgeT0iMTQuOTc3MjcyNzI3MjcyNzIzIiBjcDF4PSIyLjMyNzY2MzU3NTkwMjY4NzYiIGNwMXk9IjEzLjg5MjkyMTY5NTI0MjYzNCIgY3AyeD0iMy45ODc0NjA0NjA1ODczOTY3IiBjcDJ5PSIxNi4yOTI2OTY5MDU4NTU4MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjA3NTc1NzU3NTc1NzU4IiB5PSI5LjI3ODQwOTA5MDkwOTA5MyIgY3AxeD0iMTUuMDkwMzQ2MzgzODU0MDgzIiBjcDF5PSIxMC4yMDc5NjExNjE4NzU2MDkiIGNwMng9IjE1LjA2MjEwMjM5NTUwOTExNiIgY3AyeT0iOC40MDgzNDQ3OTI2MTg1NDgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjA0NjE5NTY1MjE3MzkxNCIgeT0iMi4wMzU4MjAxNTgxMDI3NjciIGNwMXg9IjQuMDE5MTg5MTI3MDc4Njg0IiBjcDF5PSIwLjYxMDk1NTc2MTM4MjUxOTIiIGNwMng9IjIuMjk3Njc0NzY0NTk3NTI3IiBjcDJ5PSIzLjEzMTk2Mzk1NTk5NzYyODQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTAiIGdyZWVuPSIxNTYiIGJsdWU9IjE2OCIgYWxwaGE9IjE0NiIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjA4MzMzMzMzMzMzMzMzMiIgeT0iMi41MDM3ODc4Nzg3ODc4NzkiIGNwMXg9IjIuMjE5ODA3ODE0NjY1Njk5NyIgY3AxeT0iMi44NzI3ODMzMTQyMzIyMjEiIGNwMng9IjUuNjQ3NjYwMjEyOTQzODk0IiBjcDJ5PSIyLjE5NDAzNjU2NDc2Njc1OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1Ljk2MjcyNzI3MjcyNzI4NCIgeT0iOS4yODE4MTgxODE4MTgxODEiIGNwMXg9IjE2LjAyMDkwMDg1NzI3NjI0NiIgY3AxeT0iOC44MTcwNTQ2OTA2MjAzODgiIGNwMng9IjE1LjYyMTg1ODcxNDE2OTMxMyIgY3AyeT0iMTIuMDA1MTAzMzcyOTEwNzI4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy41MDMxODE4MTgxODE4MTc1IiB5PSIxNS44NDY4MTgxODE4MTgxODMiIGNwMXg9IjguMDcxMzA5NzM1MjQ0MTA3IiBjcDF5PSIxNS44NDA4MDMyNjY2Njk4ODQiIGNwMng9Ii0wLjAyMDIxMzc0MDkxODMzMTcwMyIgY3AyeT0iMTUuODUxNDU3NDgzODkyNjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCtBcnJvd1NoYXBlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2MTI5MDMyNCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDgiIGdyZWVuPSIyNTAiIGJsdWU9IjI1MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMjMwOTYwODUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYyMzc2MjEzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xNDE5MzU0OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzIiIGdyZWVuPSIyMzciIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk0MzkyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM5OTk5OTk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDYxMjkwMzMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY2IiBncmVlbj0iMTg3IiBibHVlPSIyMDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDQ1NDcwNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjczNTQ4MzkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkxIiBncmVlbj0iMjEyIiBibHVlPSIyMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjI1NTQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM1Njg2MjcyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuODUxNjEyOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDgiIGdyZWVuPSIyMjkiIGJsdWU9IjI0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3NDQyMzk3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQyMzUyOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ5MjU3NzMwNDQwODI3MzIiIHkxPSIwLjA4MjAxOTg2MjY3Nzk3NTA2IiB4Mj0iMC40OTI1NzczMDQ0MDgyNzMxIiB5Mj0iMC45MTc5ODAxMzczMjIwMjQ5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMDI3ODAzMDMwMzAzMDI5IiB5PSIzLjAwNDg0ODQ4NDg0ODQ4NiIgY3AxeD0iMy4wMzI2NDkwMjExNDkyNTYiIGNwMXk9IjQuNjY3NDk4MTM4MjMxNzM1NSIgY3AyeD0iNC41MzYwMTE5NzU1MzkyNDciIGNwMnk9IjIuMTU1NzYwMzg1MDQ1OTM4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuODQ2MzYzNjM2MzYzNjM4IiB5PSI5LjI5MTgxODE4MTgxODE4MSIgY3AxeD0iMTMuODQ5NTQ4MjQyOTc3NDI1IiBjcDF5PSI4LjY4NTEyOTkyNDA3NjI1NCIgY3AyeD0iMTMuODQyNDczNDQwMjQyNTQ1IiBjcDJ5PSIxMC4wMzI5MjU4MjY1NjIwMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuOTcyNzI3MjcyNzI3Mjc1MyIgeT0iMTMuOTY2MzYzNjM2MzYzNjM1IiBjcDF4PSI0LjM1OTgyNDY1NDE0MjUyMyIgY3AxeT0iMTUuMjA3MTQ1NjQ2MzM0NzY0IiBjcDJ4PSIzLjU4NjM2MTQ0MTk5MzA2MDUiIGNwMnk9IjEyLjcyNzkyNjUwMTI2ODkyMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDQiIGdyZWVuPSIxMjEiIGJsdWU9IjEzNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDMzODI4NjE2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40MDYwODQ2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDgwNjQ1MTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNDciIGdyZWVuPSI2OCIgYmx1ZT0iODciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xNzU5NDQxOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjA3ODQzMTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjMyIiBncmVlbj0iNTAiIGJsdWU9IjY3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAyMzAwNzM5MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEzMzI2MjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI4NjI3NDUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDc3NjUxNTE1MTUxNTEzIiB5PSIxNC45NzcyNzI3MjcyNzI3MjMiIGNwMXg9IjIuMzI3NjYzNTc1OTAyNjg3NiIgY3AxeT0iMTMuODkyOTIxNjk1MjQyNjM0IiBjcDJ4PSIzLjk4NzQ2MDQ2MDU4NzM5NjciIGNwMnk9IjE2LjI5MjY5NjkwNTg1NTgxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMDc1NzU3NTc1NzU3NTgiIHk9IjkuMjc4NDA5MDkwOTA5MDkzIiBjcDF4PSIxNS4wOTAzNDYzODM4NTQwODMiIGNwMXk9IjEwLjIwNzk2MTE2MTg3NTYwOSIgY3AyeD0iMTUuMDYyMTAyMzk1NTA5MTE2IiBjcDJ5PSI4LjQwODM0NDc5MjYxODU0OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDQ2MTk1NjUyMTczOTE0IiB5PSIyLjAzNTgyMDE1ODEwMjc2NyIgY3AxeD0iNC4wMTkxODkxMjcwNzg2ODQiIGNwMXk9IjAuNjEwOTU1NzYxMzgyNTE5MiIgY3AyeD0iMi4yOTc2NzQ3NjQ1OTc1MjciIGNwMnk9IjMuMTMxOTYzOTU1OTk3NjI4NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAwMjk3NjE5MDQ3NjE4OTQiIHk9IjAuNTg2Mzc3MTY0NTAyMTY0NSIgY3AxeD0iMS4xMzk0NTA2NzE4MDg1NTciIGNwMXk9IjAuOTU1MzcyNTk5OTQ2NTA2OCIgY3AyeD0iNC41NjczMDMwNzAwODY3NTA1IiBjcDJ5PSIwLjI3NjYyNTg1MDQ4MTA0MzY2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuOTYyNzI3MjcyNzI3Mjg0IiB5PSI5LjI4MTgxODE4MTgxODE4MSIgY3AxeD0iMTUuOTY3MTMzMTE2NzM3MjU5IiBjcDF5PSI4LjA5MzcwMjAyNzU3MTQxNiIgY3AyeD0iMTUuOTU1MzYyNzMyMDY2MDA5IiBjcDJ5PSIxMS4yNjc4MDA4MjQwNjcyNTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjUwMzE4MTgxODE4MTgxNzUiIHk9IjE2LjM0NjgxODE4MTgxODE4IiBjcDF4PSI2LjI3NDg2ODE2NDgyNzA3NiIgY3AxeT0iMTYuMzM3ODQzNTk5ODMwNTkiIGNwMng9Ii0wLjI1MTcxNzMyNTgyMzI3MjU1IiBjcDJ5PSIxNi4zNTg5NzYzNTc3NDczNTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCtNb3VzZU92ZXIrQXJyb3dTaGFwZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTciIGhlaWdodD0iMTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MSIgZ3JlZW49IjI1MiIgYmx1ZT0iMjUzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42Mjc4MDkxNyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NDMxMzcyMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQyNTEzMzY4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NSIgZ3JlZW49IjIwNSIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjIuOTU2OTg2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDY1MzEwNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY5Nzg2MDk2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MyIgZ3JlZW49IjIwNCIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU2MzQyMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAxIiBncmVlbj0iMjIyIiBibHVlPSIyNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDczMjE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zOTIxNTY4NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAyNzgwMzAzMDMwMzAyOSIgeT0iMy4wMDQ4NDg0ODQ4NDg0ODYiIGNwMXg9IjMuMDMyNjQ5MDIxMTQ5MjU2IiBjcDF5PSI0LjY2NzQ5ODEzODIzMTczNTUiIGNwMng9IjQuNTM2MDExOTc1NTM5MjQ3IiBjcDJ5PSIyLjE1NTc2MDM4NTA0NTkzOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjg0NjM2MzYzNjM2MzYzOCIgeT0iOS4yOTE4MTgxODE4MTgxODEiIGNwMXg9IjEzLjg0OTU0ODI0Mjk3NzQyNSIgY3AxeT0iOC42ODUxMjk5MjQwNzYyNTQiIGNwMng9IjEzLjg0MjQ3MzQ0MDI0MjU0NSIgY3AyeT0iMTAuMDMyOTI1ODI2NTYyMDEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjk3MjcyNzI3MjcyNzI3NTMiIHk9IjEzLjk2NjM2MzYzNjM2MzYzNSIgY3AxeD0iNC4zNTk4MjQ2NTQxNDI1MjMiIGNwMXk9IjE1LjIwNzE0NTY0NjMzNDc2NCIgY3AyeD0iMy41ODYzNjE0NDE5OTMwNjA1IiBjcDJ5PSIxMi43Mjc5MjY1MDEyNjg5MjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTMiIGdyZWVuPSI4MCIgYmx1ZT0iMTAyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMzgyMTc5MDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE1NTMyMjEzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMSIgZ3JlZW49IjEiIGJsdWU9IjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0NTA5ODA3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDc3NjUxNTE1MTUxNTEzIiB5PSIxNC45NzcyNzI3MjcyNzI3MjMiIGNwMXg9IjIuMzI3NjYzNTc1OTAyNjg3NiIgY3AxeT0iMTMuODkyOTIxNjk1MjQyNjM0IiBjcDJ4PSIzLjk4NzQ2MDQ2MDU4NzM5NjciIGNwMnk9IjE2LjI5MjY5NjkwNTg1NTgxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMDc1NzU3NTc1NzU3NTgiIHk9IjkuMjc4NDA5MDkwOTA5MDkzIiBjcDF4PSIxNS4wOTAzNDYzODM4NTQwODMiIGNwMXk9IjEwLjIwNzk2MTE2MTg3NTYwOSIgY3AyeD0iMTUuMDYyMTAyMzk1NTA5MTE2IiBjcDJ5PSI4LjQwODM0NDc5MjYxODU0OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDQ2MTk1NjUyMTczOTE0IiB5PSIyLjAzNTgyMDE1ODEwMjc2NyIgY3AxeD0iNC4wMTkxODkxMjcwNzg2ODQiIGNwMXk9IjAuNjEwOTU1NzYxMzgyNTE5MiIgY3AyeD0iMi4yOTc2NzQ3NjQ1OTc1MjciIGNwMnk9IjMuMTMxOTYzOTU1OTk3NjI4NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAwMjk3NjE5MDQ3NjE4OTQiIHk9IjAuNTg2Mzc3MTY0NTAyMTY0NSIgY3AxeD0iMS4xMzk0NTA2NzE4MDg1NTciIGNwMXk9IjAuOTU1MzcyNTk5OTQ2NTA2OCIgY3AyeD0iNC41NjczMDMwNzAwODY3NTA1IiBjcDJ5PSIwLjI3NjYyNTg1MDQ4MTA0MzY2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuOTYyNzI3MjcyNzI3Mjg0IiB5PSI5LjI4MTgxODE4MTgxODE4MSIgY3AxeD0iMTUuOTY3MTMzMTE2NzM3MjU5IiBjcDF5PSI4LjA5MzcwMjAyNzU3MTQxNiIgY3AyeD0iMTUuOTU1MzYyNzMyMDY2MDA5IiBjcDJ5PSIxMS4yNjc4MDA4MjQwNjcyNTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjUwMzE4MTgxODE4MTgxNzUiIHk9IjE2LjM0NjgxODE4MTgxODE4IiBjcDF4PSI2LjI3NDg2ODE2NDgyNzA3NiIgY3AxeT0iMTYuMzM3ODQzNTk5ODMwNTkiIGNwMng9Ii0wLjI1MTcxNzMyNTgyMzI3MjU1IiBjcDJ5PSIxNi4zNTg5NzYzNTc3NDczNTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCtQcmVzc2VkK0Fycm93U2hhcGUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjYiIGdyZWVuPSIxODYiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ0OTQzOTc2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDc1OTM1ODIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTEiIGdyZWVuPSI5OCIgYmx1ZT0iMTQwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC41OTYyNTY3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iOTgiIGJsdWU9IjE0MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MyIgZ3JlZW49IjEyOSIgYmx1ZT0iMTcxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjguOTM3NzE2NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTIxMDk0NDA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyMTU2ODYyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMDI3ODAzMDMwMzAzMDI5IiB5PSIzLjAwNDg0ODQ4NDg0ODQ4NiIgY3AxeD0iMy4wMzI2NDkwMjExNDkyNTYiIGNwMXk9IjQuNjY3NDk4MTM4MjMxNzM1NSIgY3AyeD0iNC41MzYwMTE5NzU1MzkyNDciIGNwMnk9IjIuMTU1NzYwMzg1MDQ1OTM4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuODQ2MzYzNjM2MzYzNjM4IiB5PSI5LjI5MTgxODE4MTgxODE4MSIgY3AxeD0iMTMuODQ5NTQ4MjQyOTc3NDI1IiBjcDF5PSI4LjY4NTEyOTkyNDA3NjI1NCIgY3AyeD0iMTMuODQyNDczNDQwMjQyNTQ1IiBjcDJ5PSIxMC4wMzI5MjU4MjY1NjIwMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuOTcyNzI3MjcyNzI3Mjc1MyIgeT0iMTMuOTY2MzYzNjM2MzYzNjM1IiBjcDF4PSI0LjM1OTgyNDY1NDE0MjUyMyIgY3AxeT0iMTUuMjA3MTQ1NjQ2MzM0NzY0IiBjcDJ4PSIzLjU4NjM2MTQ0MTk5MzA2MDUiIGNwMnk9IjEyLjcyNzkyNjUwMTI2ODkyMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxIiBncmVlbj0iMSIgYmx1ZT0iMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ1MDk4MDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjM4IiBncmVlbj0iNjYiIGJsdWU9IjkyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ4NzU3NzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4ODIzNTMxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDc3NjUxNTE1MTUxNTEzIiB5PSIxNC45NzcyNzI3MjcyNzI3MjMiIGNwMXg9IjIuMzI3NjYzNTc1OTAyNjg3NiIgY3AxeT0iMTMuODkyOTIxNjk1MjQyNjM0IiBjcDJ4PSIzLjk4NzQ2MDQ2MDU4NzM5NjciIGNwMnk9IjE2LjI5MjY5NjkwNTg1NTgxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMDc1NzU3NTc1NzU3NTgiIHk9IjkuMjc4NDA5MDkwOTA5MDkzIiBjcDF4PSIxNS4wOTAzNDYzODM4NTQwODMiIGNwMXk9IjEwLjIwNzk2MTE2MTg3NTYwOSIgY3AyeD0iMTUuMDYyMTAyMzk1NTA5MTE2IiBjcDJ5PSI4LjQwODM0NDc5MjYxODU0OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMDQ2MTk1NjUyMTczOTE0IiB5PSIyLjAzNTgyMDE1ODEwMjc2NyIgY3AxeD0iNC4wMTkxODkxMjcwNzg2ODQiIGNwMXk9IjAuNjEwOTU1NzYxMzgyNTE5MiIgY3AyeD0iMi4yOTc2NzQ3NjQ1OTc1MjciIGNwMnk9IjMuMTMxOTYzOTU1OTk3NjI4NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAwMjk3NjE5MDQ3NjE4OTQiIHk9IjAuNTg2Mzc3MTY0NTAyMTY0NSIgY3AxeD0iMS4xMzk0NTA2NzE4MDg1NTciIGNwMXk9IjAuOTU1MzcyNTk5OTQ2NTA2OCIgY3AyeD0iNC41NjczMDMwNzAwODY3NTA1IiBjcDJ5PSIwLjI3NjYyNTg1MDQ4MTA0MzY2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuOTYyNzI3MjcyNzI3Mjg0IiB5PSI5LjI4MTgxODE4MTgxODE4MSIgY3AxeD0iMTUuOTY3MTMzMTE2NzM3MjU5IiBjcDF5PSI4LjA5MzcwMjAyNzU3MTQxNiIgY3AyeD0iMTUuOTU1MzYyNzMyMDY2MDA5IiBjcDJ5PSIxMS4yNjc4MDA4MjQwNjcyNTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjUwMzE4MTgxODE4MTgxNzUiIHk9IjE2LjM0NjgxODE4MTgxODE4IiBjcDF4PSI2LjI3NDg2ODE2NDgyNzA3NiIgY3AxeT0iMTYuMzM3ODQzNTk5ODMwNTkiIGNwMng9Ii0wLjI1MTcxNzMyNTgyMzI3MjU1IiBjcDJ5PSIxNi4zNTg5NzYzNTc3NDczNTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3JlZ2lvbj4KKyAgICAgICAgICAgIDxyZWdpb24gbmFtZT0iU2xpZGVyVHJhY2siIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIzIiBoZWlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNiIgYm90dG9tPSI2IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjQ3MDU4ODIzNTI5NDExNzMiIHgyPSIyMS41Mjk0MTE3NjQ3MDU4NzMiIHkxPSI3LjAiIHkyPSIxMS4wIiByb3VuZGluZz0iMy45OTk5OTk5OTk5OTk5OTkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5NiIgZ3JlZW49IjIwMCIgYmx1ZT0iMjA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDYxOTgyNjI4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2Mjc0NTA5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI3NTQwMTA2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIwNSIgYmx1ZT0iMjEyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDUwNTA1NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDU4NjM5NTIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA4NjI3NDUwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA2IiBncmVlbj0iMjA5IiBibHVlPSIyMTciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDEwMTAxMDgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTgzNTA3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjIzLjAiIHkxPSI2LjAiIHkyPSIxMS4wIiByb3VuZGluZz0iNC45NDExNzY0NzA1ODgyNDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MyIgZ3JlZW49IjE5NiIgYmx1ZT0iMjAzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MTI2NTIzNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA2IiBncmVlbj0iMjA5IiBibHVlPSIyMTciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDEwMTAxMDgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTgzNTA3MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjA3NjQ3MDU4ODIzNTI5NDEyIiB4Mj0iMC4yNSIgeTI9IjAuOTExNzY0NzA1ODgyMzUzMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIyMi4wIiB5MT0iOS4wIiB5Mj0iMTYuMCIgcm91bmRpbmc9IjguNzA1ODgyMzUyOTQxMTc0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTI0NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOWU5MGUzMmMucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIzIiBoZWlnaHQ9IjE3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNiIgYm90dG9tPSI2IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjQ0MTE3NjQ3MDU4ODIzNSIgeDI9IjIxLjQ5OTk5OTk5OTk5OTk5IiB5MT0iNy4wIiB5Mj0iMTEuMCIgcm91bmRpbmc9IjMuOTk5OTk5OTk5OTk5OTk5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTUiIGdyZWVuPSIxNjAiIGJsdWU9IjE2OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA4NTQ3MDA4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzMxNDUzNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDg2Mjc0NTA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjc1NDAxMDYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTcyIiBncmVlbj0iMTc2IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA0MjczNDc0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDAyNTYwNDYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjcwNTg4MjQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg3IiBncmVlbj0iMTkyIiBibHVlPSIyMDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDM2MjY4ODkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDQ3MDU4ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIyMy4wIiB5MT0iNi4wIiB5Mj0iMTEuMCIgcm91bmRpbmc9IjQuOTQxMTc2NDcwNTg4MjQzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDUiIGdyZWVuPSIxNDkiIGJsdWU9IjE1NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzQwOTMxOTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTgiIGdyZWVuPSIxNjIiIGJsdWU9IjE3MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIzODIxMTE1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNjY2NjY2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjA3NjQ3MDU4ODIzNTI5NDEyIiB4Mj0iMC4yNSIgeTI9IjAuOTExNzY0NzA1ODgyMzUzMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIyMi4wIiB5MT0iOS4wIiB5Mj0iMTIuMCIgcm91bmRpbmc9IjguNzA1ODgyMzUyOTQxMTc0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTQ0IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9Ii0xMTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzllMGEyMTY4LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3JlZ2lvbj4KKyAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSlNwaW5uZXIiIG5hbWU9IlNwaW5uZXIiIHVpPSJTcGlubmVyVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiBjb21wb25lbnROYW1lPSJTcGlubmVyLmVkaXRvciIgdHlwZT0iamF2YXguc3dpbmcuSlBhbmVsIiBuYW1lPSJQYW5lbCIgdWk9IlBhbmVsVUkiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KRm9ybWF0dGVkVGV4dEZpZWxkIiBuYW1lPSJGb3JtYXR0ZWRUZXh0RmllbGQiIHVpPSJGb3JtYXR0ZWRUZXh0RmllbGRVSSIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9IlBhbmVsOiZxdW90O1NwaW5uZXIuZm9ybWF0dGVkVGV4dEZpZWxkJnF1b3Q7Ij4KKyAgICAgICAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjYiIGJvdHRvbT0iNSIgbGVmdD0iNiIgcmlnaHQ9IjYiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Rpc2FibGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI2NCIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iMyIgbGVmdD0iMyIgcmlnaHQ9IjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIyIiBncmVlbj0iMjI1IiBibHVlPSIyMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTY1ODY0ODMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYwNTE0NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzQ5MDE5NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA4IiBncmVlbj0iMjEwIiBibHVlPSIyMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNDAzOTU5NzUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYwMzE1NjE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5NDExNzYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2NC4wIiB5MT0iMy4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjAiIGdyZWVuPSIyMjIiIGJsdWU9IjIyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3OTY4OTMxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0NTA5ODAzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTIiIGdyZWVuPSIyMTQiIGJsdWU9IjIxOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3ODU2Mjg0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMS4wIiB4Mj0iMC41IiB5Mj0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjY0LjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5OSIgZ3JlZW49IjIwMiIgYmx1ZT0iMjA3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MTg3ODk3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMDQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NzAzMzQ5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3NDUwOTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjIyLjAiIHkyPSIyMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMTgiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzQ1MDk4MDUiIGFscGhhT2Zmc2V0PSItMjM3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNjQiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjMiIGxlZnQ9IjMiIHJpZ2h0PSIxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjY0LjAiIHkxPSI1LjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkyIiBncmVlbj0iMTkyIiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUzNDQ5NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2NC4wIiB5MT0iMy4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMTY4NDQ5MiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDMiIGdyZWVuPSIyMDMiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTYyNDM1NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTQ5MDE5NTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI2NC4wIiB5MT0iMi4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDEiIGdyZWVuPSIxNDIiIGJsdWU9IjE0MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTY1NDAzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xODQzMTM3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk5MTQ3NzI1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5NiIgZ3JlZW49IjE5NiIgYmx1ZT0iMTk0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA0ODc2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjIyLjAiIHkyPSIyMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMTgiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzQ1MDk4MDUiIGFscGhhT2Zmc2V0PSItMjM3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNjQiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjMiIGxlZnQ9IjMiIHJpZ2h0PSIxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjY0LjAiIHkxPSI1LjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkyIiBncmVlbj0iMTkyIiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUzNDQ5NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2NC4wIiB5MT0iMy4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMTY4NDQ5MiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDMiIGdyZWVuPSIyMDMiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTYyNDM1NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTQ5MDE5NTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI2NC4wIiB5MT0iMi4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDEiIGdyZWVuPSIxNDIiIGJsdWU9IjE0MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTY1NDAzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xODQzMTM3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk5MTQ3NzI1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3NiIgZ3JlZW49IjE3NiIgYmx1ZT0iMTc3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA0ODc2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDUwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42NjY2NjY2NjY2NjY2NjY2IiB4Mj0iNjMuOTE2NjY2NjY2NjY2NjYiIHkxPSIwLjY2NjY2NjY2NjY2NjY2NjYiIHkyPSIyMy4yNDk5OTk5OTk5OTk5OTYiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3RlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNjQiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjMiIGxlZnQ9IjMiIHJpZ2h0PSIxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjY0LjAiIHkxPSI1LjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkyIiBncmVlbj0iMTkyIiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUzNDQ5NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2NC4wIiB5MT0iMy4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMTY4NDQ5MiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDMiIGdyZWVuPSIyMDMiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTYyNDM1NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTQ5MDE5NTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI2NC4wIiB5MT0iMi4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDEiIGdyZWVuPSIxNDIiIGJsdWU9IjE0MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTY1NDAzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xODQzMTM3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk5MTQ3NzI1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5NiIgZ3JlZW49IjE5NiIgYmx1ZT0iMTk0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA0ODc2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNjQuMCIgeTE9IjIyLjAiIHkyPSIyMy4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMTgiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNzQ1MDk4MDUiIGFscGhhT2Zmc2V0PSItMjM3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI2NCIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iMyIgbGVmdD0iMyIgcmlnaHQ9IjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjQuMCIgeTE9IjUuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI2NC4wIiB5MT0iNS4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIxOTIiIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTM0NDk2NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjY0LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4xNjg0NDkyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1NjI0MzU1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1NDkwMTk1OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjY0LjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MSIgZ3JlZW49IjE0MiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjU0MDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4NDMxMzcxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTkxNDc3MjUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc2IiBncmVlbj0iMTc2IiBibHVlPSIxNzciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDQ4NzY2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjY2NjY2NjY2NjY2NjY2NjYiIHgyPSI2My45MTY2NjY2NjY2NjY2NiIgeTE9IjAuNjY2NjY2NjY2NjY2NjY2NiIgeTI9IjIzLjI0OTk5OTk5OTk5OTk5NiIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIGNvbXBvbmVudE5hbWU9IlNwaW5uZXIucHJldmlvdXNCdXR0b24iIHR5cGU9ImphdmF4LnN3aW5nLnBsYWYuc3ludGguU3ludGhBcnJvd0J1dHRvbiIgbmFtZT0iQXJyb3dCdXR0b24iIHVpPSJTeW50aEFycm93QnV0dG9uVUkiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InNpemUiIHR5cGU9IklOVCIgdmFsdWU9IjIwIi8+CisgICAgICAgICAgICAgICAgICA8L3VpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iNiIgbGVmdD0iMSIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEyIiBncmVlbj0iMjE3IiBibHVlPSIyMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTg1NzA2MDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU4MjE0MjkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI5NDExNzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMTQ5NzMyNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDQiIGdyZWVuPSIyMTAiIGJsdWU9IjIxOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTY3MjIxMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA2IiBncmVlbj0iMjEyIiBibHVlPSIyMjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMjEzNDgyOTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2Nzg0MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMTc2NDcwNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIwLjAiIGNwMng9IjEuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSI5LjAiIGNwMXg9IjEuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjkuMCIgY3AxeD0iMTQuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI2LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTcuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMC4wIiBjcDF4PSIxNy4wIiBjcDF5PSIwLjAiIGNwMng9IjE3LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODQiIGdyZWVuPSIxOTEiIGJsdWU9IjIwMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAxNTA5ODMzMyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTU1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzgiIGdyZWVuPSIxODUiIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAxMDIzNzIxNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTU3OTk0MDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjA3ODQzMTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTAuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMC4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iNi4wIiBjcDF4PSIxOC4wIiBjcDF5PSI4LjAiIGNwMng9IjE4LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjAuMCIgY3AxeD0iMTguMCIgY3AxeT0iMC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2EzZDQ3ZjIzLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjYiIGxlZnQ9IjEiIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjIxNSIgYmx1ZT0iMjI2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MzgzNjkyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMzNzI1NDg4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTE0OTczMjYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY1IiBncmVlbj0iMTg2IiBibHVlPSIyMDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxNzI4NTk0MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDQ0NTM3ODIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjUwOTgwMzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zNjg5ODM5NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIxODQiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQzODY2OTk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0NzA1ODgxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIyMTIiIGJsdWU9IjIzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MjU1NDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzU2ODYyNzIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIwLjAiIGNwMXg9IjEuMCIgY3AxeT0iMC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iOS4wIiBjcDF4PSIxLjAiIGNwMXk9IjkuMCIgY3AyeD0iMS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI5LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjkuMCIgY3AyeD0iMTYuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iNi4wIiBjcDF4PSIxNy4wIiBjcDF5PSI3LjAiIGNwMng9IjE3LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjAuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMC4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjYiIGdyZWVuPSI4NyIgYmx1ZT0iMTA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjU4MzU1OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTMzMzMzMzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjM0IiBncmVlbj0iNTUiIGJsdWU9Ijc0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk1MTczNzc2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNTg4MjM1NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjEwLjAiIGNwMng9IjAuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEwLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEwLjAiIGNwMng9IjE3LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI2LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjguMCIgY3AyeD0iMTguMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMC4wIiBjcDF4PSIxOC4wIiBjcDF5PSIwLjAiIGNwMng9IjE4LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwMCIgZ3JlZW49IjEwNCIgYmx1ZT0iMTEyIiBhbHBoYT0iMTA3IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMzM4MzQ1NzciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjMwNTg4MjM2IiBhbHBoYU9mZnNldD0iLTE0OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMS4wIiBjcDF4PSIwLjAiIGNwMXk9IjExLjAiIGNwMng9IjAuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjIyNzI3MjcyNzI3MjcyNyIgeT0iMTEuMCIgY3AxeD0iMTMuMjI3MjcyNzI3MjcyNzI3IiBjcDF5PSIxMS4wIiBjcDJ4PSIxNS4zNDA5MDkwOTA5MDkxMDYiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI2LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjkuMCIgY3AyeD0iMTguMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTNhM2I3YzQwYi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSI2IiBsZWZ0PSIxIiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDQiIGdyZWVuPSIyMTUiIGJsdWU9IjIyNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTM4MzY5MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMzcyNTQ4OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjExNDk3MzI2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NSIgZ3JlZW49IjE4NiIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTcyODU5NDMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ0NDUzNzgyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzY4OTgzOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYzIiBncmVlbj0iMTg0IiBibHVlPSIyMDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkxIiBncmVlbj0iMjEyIiBibHVlPSIyMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjI1NTQxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM1Njg2MjcyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMC4wIiBjcDF4PSIxLjAiIGNwMXk9IjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjkuMCIgY3AxeD0iMS4wIiBjcDF5PSI5LjAiIGNwMng9IjEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iOS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI5LjAiIGNwMng9IjE2LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjYuMCIgY3AxeD0iMTcuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSIwLjAiIGNwMXg9IjE3LjAiIGNwMXk9IjAuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY2IiBncmVlbj0iODciIGJsdWU9IjEwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjI1ODM1NTgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzMzMzMzM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNCIgZ3JlZW49IjU1IiBibHVlPSI3NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NTE3Mzc3NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjU4ODIzNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTAuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxMC4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iNi4wIiBjcDF4PSIxOC4wIiBjcDF5PSI4LjAiIGNwMng9IjE4LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjAuMCIgY3AxeD0iMTguMCIgY3AxeT0iMC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTEuNCIgY3AxeD0iMC4wIiBjcDF5PSIxMS40IiBjcDJ4PSIwLjAiIGNwMnk9IjExLjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC40IiB5PSIxMS40IiBjcDF4PSIxNC40IiBjcDF5PSIxMS40IiBjcDJ4PSIxNy40IiBjcDJ5PSIxMS40Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkuNCIgeT0iNy40IiBjcDF4PSIxOS40IiBjcDF5PSIxMC40IiBjcDJ4PSIxOS40IiBjcDJ5PSI3LjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOS40IiB5PSIwLjAiIGNwMXg9IjE5LjQiIGNwMXk9IjAuMCIgY3AyeD0iMTkuNCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjMiIGJvdHRvbT0iNiIgbGVmdD0iMSIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIxIiBncmVlbj0iMjMzIiBibHVlPSIyNDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDEwNTg1MTg5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NDE0NTIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDA3ODQzMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjExNDk3MzI2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjIwNCIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAyNTQ0ODgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MDgyNjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI1NDkwMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zNjg5ODM5NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIyMDMiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NTUzNDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEwIiBncmVlbj0iMjMxIiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMC4wIiBjcDF4PSIxLjAiIGNwMXk9IjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjkuMCIgY3AxeD0iMS4wIiBjcDF5PSI5LjAiIGNwMng9IjEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iOS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI5LjAiIGNwMng9IjE2LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjYuMCIgY3AxeD0iMTcuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSIwLjAiIGNwMXg9IjE3LjAiIGNwMXk9IjAuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5IiBncmVlbj0iNDUiIGJsdWU9IjY5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxMzQ4MzE2NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wODg5MjMzOTUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI3ODQzMTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSI1IiBibHVlPSIyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA1OTI3OTM4MiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40MzUyOTQxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjEwLjAiIGNwMng9IjAuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEwLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEwLjAiIGNwMng9IjE3LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI2LjAiIGNwMXg9IjE4LjAiIGNwMXk9IjguMCIgY3AyeD0iMTguMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMC4wIiBjcDF4PSIxOC4wIiBjcDF5PSIwLjAiIGNwMng9IjE4LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMS40IiBjcDF4PSIwLjAiIGNwMXk9IjExLjQiIGNwMng9IjAuMCIgY3AyeT0iMTEuNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjQiIHk9IjExLjQiIGNwMXg9IjE0LjQiIGNwMXk9IjExLjQiIGNwMng9IjE3LjQiIGNwMnk9IjExLjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOS40IiB5PSI3LjQiIGNwMXg9IjE5LjQiIGNwMXk9IjEwLjQiIGNwMng9IjE5LjQiIGNwMnk9IjcuNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE5LjQiIHk9IjAuMCIgY3AxeD0iMTkuNCIgY3AxeT0iMC4wIiBjcDJ4PSIxOS40IiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iNiIgbGVmdD0iMSIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA3IiBncmVlbj0iMTQxIiBibHVlPSIxNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iOC4zNTQ3ODNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjI1NzgwNzMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI1NDkwMTkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMTQ5NzMyNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NCIgZ3JlZW49IjEwMCIgYmx1ZT0iMTQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjguOTM3NzE2NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE1OTk1OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzY4OTgzOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTMiIGdyZWVuPSIxMDAiIGJsdWU9IjE0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwODk1Mzc1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODkiIGdyZWVuPSIxMzUiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI4LjkzNzcxNjVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEzODUzOTE3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0NTA5ODAzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMC4wIiBjcDF4PSIxLjAiIGNwMXk9IjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjkuMCIgY3AxeD0iMS4wIiBjcDF5PSI5LjAiIGNwMng9IjEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iOS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI5LjAiIGNwMng9IjE2LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjYuMCIgY3AxeD0iMTcuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSIwLjAiIGNwMXg9IjE3LjAiIGNwMXk9IjAuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSI1IiBibHVlPSIzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA2MTEzMzMyNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40Mjc0NTEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI4IiBncmVlbj0iNTYiIGJsdWU9IjgxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0zLjUyODU5NUUtNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTg2MDY3MjIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzMTM3MjU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTAuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjYuMCIgY3AxeD0iMTguMCIgY3AxeT0iOC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIwLjAiIGNwMXg9IjE4LjAiIGNwMXk9IjAuMCIgY3AyeD0iMTguMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjExLjQiIGNwMXg9IjAuMCIgY3AxeT0iMTEuNCIgY3AyeD0iMC4wIiBjcDJ5PSIxMS40Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuNCIgeT0iMTEuNCIgY3AxeD0iMTQuNCIgY3AxeT0iMTEuNCIgY3AyeD0iMTcuNCIgY3AyeT0iMTEuNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE5LjQiIHk9IjcuNCIgY3AxeD0iMTkuNCIgY3AxeT0iMTAuNCIgY3AyeD0iMTkuNCIgY3AyeT0iNy40Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkuNCIgeT0iMC4wIiBjcDF4PSIxOS40IiBjcDF5PSIwLjAiIGNwMng9IjE5LjQiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSI2IiBsZWZ0PSIxIiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjEiIGdyZWVuPSIyMzMiIGJsdWU9IjI0NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTA1ODUxODkiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU0MTQ1MiIgYnJpZ2h0bmVzc09mZnNldD0iMC40MDc4NDMxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTE0OTczMjYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg0IiBncmVlbj0iMjA0IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDI1NDQ4OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDYwODI2NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjM2ODk4Mzk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjIwMyIgYmx1ZT0iMjIyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU1NTM0MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjE1Njg2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTAiIGdyZWVuPSIyMzEiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ3NTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIwLjAiIGNwMXg9IjEuMCIgY3AxeT0iMC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iOS4wIiBjcDF4PSIxLjAiIGNwMXk9IjkuMCIgY3AyeD0iMS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI5LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjkuMCIgY3AyeD0iMTYuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iNi4wIiBjcDF4PSIxNy4wIiBjcDF5PSI3LjAiIGNwMng9IjE3LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjAuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMC4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkiIGdyZWVuPSI0NSIgYmx1ZT0iNjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDEzNDgzMTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjA4ODkyMzM5NSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjc4NDMxNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjUiIGJsdWU9IjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDU5Mjc5MzgyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQzNTI5NDE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTAuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjYuMCIgY3AxeD0iMTguMCIgY3AxeT0iOC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIwLjAiIGNwMXg9IjE4LjAiIGNwMXk9IjAuMCIgY3AyeD0iMTguMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjgiIGdyZWVuPSIyOCIgYmx1ZT0iMjgiIGFscGhhPSI3NiIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuNjExMTExMSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC42MzUyOTQxNCIgYWxwaGFPZmZzZXQ9Ii0xNzkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjEwLjAiIGNwMng9IjAuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTEuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMS4wIiBjcDJ4PSIwLjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4yMjcyNzI3MjcyNzI3MjciIHk9IjExLjAiIGNwMXg9IjEzLjIyNzI3MjcyNzI3MjcyNyIgY3AxeT0iMTEuMCIgY3AyeD0iMTUuMzQwOTA5MDkwOTA5MTA2IiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iNi4wIiBjcDF4PSIxOC4wIiBjcDF5PSI5LjAiIGNwMng9IjE4LjAiIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzYTNkNmM2NzUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iNiIgbGVmdD0iMSIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA3IiBncmVlbj0iMTQxIiBibHVlPSIxNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iOC4zNTQ3ODNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjI1NzgwNzMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI1NDkwMTkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMTQ5NzMyNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NCIgZ3JlZW49IjEwMCIgYmx1ZT0iMTQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjguOTM3NzE2NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE1OTk1OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzY4OTgzOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTMiIGdyZWVuPSIxMDAiIGJsdWU9IjE0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwODk1Mzc1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODkiIGdyZWVuPSIxMzUiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI4LjkzNzcxNjVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEzODUzOTE3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0NTA5ODAzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMC4wIiBjcDF4PSIxLjAiIGNwMXk9IjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjkuMCIgY3AxeD0iMS4wIiBjcDF5PSI5LjAiIGNwMng9IjEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iOS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI5LjAiIGNwMng9IjE2LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjYuMCIgY3AxeD0iMTcuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNy4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSIwLjAiIGNwMXg9IjE3LjAiIGNwMXk9IjAuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSI1IiBibHVlPSIzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA2MTEzMzMyNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40Mjc0NTEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI4IiBncmVlbj0iNTYiIGJsdWU9IjgxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0zLjUyODU5NUUtNSIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMTg2MDY3MjIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzMTM3MjU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTAuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTAuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMTAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjYuMCIgY3AxeD0iMTguMCIgY3AxeT0iOC4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIwLjAiIGNwMXg9IjE4LjAiIGNwMXk9IjAuMCIgY3AyeD0iMTguMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSI2OSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItMTg2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTAuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjExLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMjI3MjcyNzI3MjcyNzI3IiB5PSIxMS4wIiBjcDF4PSIxMS4xMTM2MzYzNjM2MzYzNDciIGNwMXk9IjExLjAiIGNwMng9IjE1LjM0MDkwOTA5MDkwOTEwNiIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjYuMCIgY3AxeD0iMTguMCIgY3AxeT0iOS4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2EzZDdlMWM1LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMyIgYm90dG9tPSI1IiBsZWZ0PSI2IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2MyIgZ3JlZW49IjE2OCIgYmx1ZT0iMTc1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDE4NTcwNjAyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NjcxNDI4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMzcyNTQ5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjMuMCIgY3AxeD0iNi4wIiBjcDF5PSIzLjAiIGNwMng9IjYuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC41MjI3MjcyNzI3MjcyNjMiIHk9IjYuOTc3MjcyNzI3MjcyNzI3NSIgY3AxeD0iOC41MjI3MjcyNzI3MjcyNjMiIGNwMXk9IjYuOTc3MjcyNzI3MjcyNzI3NSIgY3AyeD0iOC41MjI3MjcyNzI3MjcyNjMiIGNwMnk9IjYuOTc3MjcyNzI3MjcyNzI3NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjMuMCIgY3AxeD0iMTEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMyIgYm90dG9tPSI1IiBsZWZ0PSI2IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIzLjAiIGNwMXg9IjYuMCIgY3AxeT0iMy4wIiBjcDJ4PSI2LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNTIyNzI3MjcyNzI3MjYzIiB5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiIGNwMXg9IjguNTIyNzI3MjcyNzI3MjYzIiBjcDF5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiIGNwMng9IjguNTIyNzI3MjcyNzI3MjYzIiBjcDJ5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSIzLjAiIGNwMXg9IjExLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTEuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkZvY3VzZWQiIGludmVydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD40PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjMiIGJvdHRvbT0iNSIgbGVmdD0iNiIgcmlnaHQ9IjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMy4wIiBjcDF4PSI2LjAiIGNwMXk9IjMuMCIgY3AyeD0iNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjUyMjcyNzI3MjcyNzI2MyIgeT0iNi45NzcyNzI3MjcyNzI3Mjc1IiBjcDF4PSI4LjUyMjcyNzI3MjcyNzI2MyIgY3AxeT0iNi45NzcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSI4LjUyMjcyNzI3MjcyNzI2MyIgY3AyeT0iNi45NzcyNzI3MjcyNzI3Mjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iMy4wIiBjcDF4PSIxMS4wIiBjcDF5PSIzLjAiIGNwMng9IjExLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJNb3VzZU92ZXIrRm9jdXNlZCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMyIgYm90dG9tPSI1IiBsZWZ0PSI2IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIzLjAiIGNwMXg9IjYuMCIgY3AxeT0iMy4wIiBjcDJ4PSI2LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNTIyNzI3MjcyNzI3MjYzIiB5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiIGNwMXg9IjguNTIyNzI3MjcyNzI3MjYzIiBjcDF5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiIGNwMng9IjguNTIyNzI3MjcyNzI3MjYzIiBjcDJ5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSIzLjAiIGNwMXg9IjExLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTEuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrRm9jdXNlZCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMyIgYm90dG9tPSI1IiBsZWZ0PSI2IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIzLjAiIGNwMXg9IjYuMCIgY3AxeT0iMy4wIiBjcDJ4PSI2LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNTIyNzI3MjcyNzI3MjYzIiB5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiIGNwMXg9IjguNTIyNzI3MjcyNzI3MjYzIiBjcDF5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiIGNwMng9IjguNTIyNzI3MjcyNzI3MjYzIiBjcDJ5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSIzLjAiIGNwMXg9IjExLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTEuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMyIgYm90dG9tPSI1IiBsZWZ0PSI2IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIzLjAiIGNwMXg9IjYuMCIgY3AxeT0iMy4wIiBjcDJ4PSI2LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNTIyNzI3MjcyNzI3MjYzIiB5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiIGNwMXg9IjguNTIyNzI3MjcyNzI3MjYzIiBjcDF5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiIGNwMng9IjguNTIyNzI3MjcyNzI3MjYzIiBjcDJ5PSI2Ljk3NzI3MjcyNzI3MjcyNzUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSIzLjAiIGNwMXg9IjExLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTEuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQiIGludmVydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjMiIGJvdHRvbT0iNSIgbGVmdD0iNiIgcmlnaHQ9IjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMy4wIiBjcDF4PSI2LjAiIGNwMXk9IjMuMCIgY3AyeD0iNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjUyMjcyNzI3MjcyNzI2MyIgeT0iNi45NzcyNzI3MjcyNzI3Mjc1IiBjcDF4PSI4LjUyMjcyNzI3MjcyNzI2MyIgY3AxeT0iNi45NzcyNzI3MjcyNzI3Mjc1IiBjcDJ4PSI4LjUyMjcyNzI3MjcyNzI2MyIgY3AyeT0iNi45NzcyNzI3MjcyNzI3Mjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iMy4wIiBjcDF4PSIxMS4wIiBjcDF5PSIzLjAiIGNwMng9IjExLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2ZvcmVncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICAgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgY29tcG9uZW50TmFtZT0iU3Bpbm5lci5uZXh0QnV0dG9uIiB0eXBlPSJqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoQXJyb3dCdXR0b24iIG5hbWU9IkFycm93QnV0dG9uIiB1aT0iU3ludGhBcnJvd0J1dHRvblVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJzaXplIiB0eXBlPSJJTlQiIHZhbHVlPSIyMCIvPgorICAgICAgICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjEiIGxlZnQ9IjEiIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE3LjAiIHkxPSIxMS4wIiB5Mj0iMTIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODgiIGdyZWVuPSIxOTQiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTYxODIyNjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjQ3MDU4ODEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMCIgZ3JlZW49IjIyNCIgYmx1ZT0iMjMwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTIyMzYwNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjAzMzMzMzMzNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDciIGdyZWVuPSIyMTMiIGJsdWU9IjIyMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAxNjU4NjQ4MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTcyMzY1OSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMTc2NDcwNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjExLjAiIGNwMXg9IjEuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjMuMCIgY3AxeD0iMTAuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI3LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTcuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMTEuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIxOTciIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyMTM0ODI5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTYyODk4NzYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg1IiBncmVlbj0iMTkyIiBibHVlPSIyMDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTAyMzcyMTciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU2MDcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEyLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyLjAiIGNwMXg9IjAuMCIgY3AxeT0iMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjIuMCIgY3AxeD0iOS4zNjM2MzYzNjM2MzYzNiIgY3AxeT0iMi4wIiBjcDJ4PSIxNi42MzYzNjM2MzYzNjM2NCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iNy4wIiBjcDF4PSIxNy45NzcyNzI3MjcyNzI3MjciIGNwMXk9IjMuMjUwMDAwMDAwMDAwMDAxIiBjcDJ4PSIxOC4wMjI3MjcyNzI3MjcyNzMiIGNwMnk9IjEwLjc1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMTIuMCIgY3AxeD0iMTguMCIgY3AxeT0iMTIuMCIgY3AyeD0iMTguMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzYTNjZjIwNDEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD40PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iMSIgbGVmdD0iMSIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTcuMCIgeTE9IjExLjAiIHkyPSIxMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkzIiBncmVlbj0iMTExIiBibHVlPSIxMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDIzMDA3MzkzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNjIyNzY4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNDcwNTg4MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ2IiBncmVlbj0iMjQ4IiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43Mjk5NDY1NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIyMDYiIGJsdWU9IjIxOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDEyNzA3MTE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MDc4NjA0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC4wMzMzMzMzMzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc5IiBncmVlbj0iMTk3IiBibHVlPSIyMTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAyODk0MTAzNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDgwMDUzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yODIzNTI5MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjExLjAiIGNwMXg9IjEuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjMuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI3LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTcuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMTEuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5OCIgZ3JlZW49IjExOSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzQ1ODU5MjMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzAiIGdyZWVuPSI5MSIgYmx1ZT0iMTEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjcyMDc3OTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExNzY0NzA4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTIuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyLjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMi4wIiBjcDF4PSIxMy4wIiBjcDF5PSIyLjAiIGNwMng9IjE2LjYzNjM2MzYzNjM2MzY0IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI3LjAiIGNwMXg9IjE3Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeT0iMy4yNTAwMDAwMDAwMDAwMDEiIGNwMng9IjE4LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjEyLjAiIGNwMXg9IjE4LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE4LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2EzYzA2NTEzLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjEiIGxlZnQ9IjEiIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE3LjAiIHkxPSIxMS4wIiB5Mj0iMTIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MyIgZ3JlZW49IjExMSIgYmx1ZT0iMTI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAyMzAwNzM5MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzYyMjc2OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDQ3MDU4ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NiIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTk3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzUxMzM2OSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTEiIGdyZWVuPSIyMDYiIGJsdWU9IjIxOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDEyNzA3MTE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MDc4NjA0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC4wMzMzMzMzMzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc5IiBncmVlbj0iMTk3IiBibHVlPSIyMTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAyODk0MTAzNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDgwMDUzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yODIzNTI5MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjExLjAiIGNwMXg9IjEuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjMuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI3LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTcuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMTEuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5OCIgZ3JlZW49IjExOSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzQ1ODU5MjMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAwNzg0MzEzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzAiIGdyZWVuPSI5MSIgYmx1ZT0iMTEwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjcyMDc3OTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExNzY0NzA4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTIuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyLjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMi4wIiBjcDF4PSIxMy4wIiBjcDF5PSIyLjAiIGNwMng9IjE2LjYzNjM2MzYzNjM2MzY0IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI3LjAiIGNwMXg9IjE3Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeT0iMy4yNTAwMDAwMDAwMDAwMDEiIGNwMng9IjE4LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjEyLjAiIGNwMXg9IjE4LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE4LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMi4wIiBjcDF4PSIwLjAiIGNwMXk9IjEyLjAiIGNwMng9IjAuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC42IiBjcDF4PSIwLjAiIGNwMXk9IjAuNiIgY3AyeD0iMC4wIiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIwLjYiIGNwMXg9IjE0LjAiIGNwMXk9IjAuNiIgY3AyeD0iMTcuNCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkuNCIgeT0iNy4wIiBjcDF4PSIxOS40IiBjcDF5PSIzLjYiIGNwMng9IjE5LjQiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE5LjQiIHk9IjEyLjAiIGNwMXg9IjE5LjQiIGNwMXk9IjEyLjAiIGNwMng9IjE5LjQiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSIxIiBsZWZ0PSIxIiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxNy4wIiB5MT0iMTEuMCIgeTI9IjEyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA5IiBncmVlbj0iMTI4IiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4yMDM0ODU1RS01IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zODc0Mzg0MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTk4NDEzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzOTIxNTY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzU5MzU4MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDQiIGdyZWVuPSIyMTkiIGJsdWU9IjIzMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDEyNzA3MTE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MTUwMjQ2NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNjA3ODQzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuMDMzMzMzMzM1Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5NSIgZ3JlZW49IjIxMiIgYmx1ZT0iMjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAyMTU2NDM2NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDkwOTc3NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzQ1MDk4MDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxMS4wIiBjcDF4PSIxLjAiIGNwMXk9IjExLjAiIGNwMng9IjEuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIzLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTYuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iNy4wIiBjcDF4PSIxNy4wIiBjcDF5PSI1LjAiIGNwMng9IjE3LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjExLjAiIGNwMXg9IjE3LjAiIGNwMXk9IjExLjAiIGNwMng9IjE3LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTkiIGdyZWVuPSI4NSIgYmx1ZT0iMTA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxMzQ4MzE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTc2OTk4NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTIxNTY4NjUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0IiBncmVlbj0iNTAiIGJsdWU9Ijc0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxMzQ4MzE2NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMzk5NjEzOTgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI1ODgyMzU0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTIuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIuMCIgY3AxeD0iMC4wIiBjcDF5PSIyLjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMi4wIiBjcDF4PSIxMy4wIiBjcDF5PSIyLjAiIGNwMng9IjE2LjYzNjM2MzYzNjM2MzY0IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI3LjAiIGNwMXg9IjE3Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeT0iMy4yNTAwMDAwMDAwMDAwMDEiIGNwMng9IjE4LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjEyLjAiIGNwMXg9IjE4LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE4LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMi4wIiBjcDF4PSIwLjAiIGNwMXk9IjEyLjAiIGNwMng9IjAuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC42IiBjcDF4PSIwLjAiIGNwMXk9IjAuNiIgY3AyeD0iMC4wIiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIwLjYiIGNwMXg9IjE0LjAiIGNwMXk9IjAuNiIgY3AyeD0iMTcuNCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTkuNCIgeT0iNy4wIiBjcDF4PSIxOS40IiBjcDF5PSIzLjYiIGNwMng9IjE5LjQiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE5LjQiIHk9IjEyLjAiIGNwMXg9IjE5LjQiIGNwMXk9IjEyLjAiIGNwMng9IjE5LjQiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iMSIgbGVmdD0iMSIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMS4wIiB4Mj0iMTcuMCIgeTE9IjExLjAiIHkyPSIxMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1IiBncmVlbj0iNDMiIGJsdWU9IjgyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDE4MzYzMjM3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjE4MTM1ODg3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMjc0NTEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MyIgZ3JlZW49IjE2OSIgYmx1ZT0iMTkyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii00LjIwMzMxOTVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4MDUwNTk1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwMzkyMTU2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzQzMzE1NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MiIgZ3JlZW49IjEyMiIgYmx1ZT0iMTU4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjIuOTU2OTg2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTU0NzAxNjIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDcwNTg4MjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC4wMzMzMzMzMzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjkiIGdyZWVuPSIxMTIiIGJsdWU9IjE1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItNC42MjM1MzIzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTU3MTQyNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxMS4wIiBjcDF4PSIxLjAiIGNwMXk9IjExLjAiIGNwMng9IjEuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIzLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTYuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iNy4wIiBjcDF4PSIxNy4wIiBjcDF5PSI1LjAiIGNwMng9IjE3LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE3LjAiIHk9IjExLjAiIGNwMXg9IjE3LjAiIGNwMXk9IjExLjAiIGNwMng9IjE3LjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NTQ5MDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMi4wIiBjcDF4PSIwLjAiIGNwMXk9IjEyLjAiIGNwMng9IjAuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMi4wIiBjcDF4PSIwLjAiIGNwMXk9IjIuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTYuNDU0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSI3LjAiIGNwMXg9IjE3Ljk3NzI3MjcyNzI3MjcyNyIgY3AxeT0iMy41MjI3MjcyNzI3MjcyNzM0IiBjcDJ4PSIxOC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOC4wIiB5PSIxMi4wIiBjcDF4PSIxOC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIxOC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTIuMCIgY3AxeD0iMC4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjAuNiIgY3AxeD0iMC4wIiBjcDF5PSIwLjYiIGNwMng9IjAuMCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMC42IiBjcDF4PSIxNC4wIiBjcDF5PSIwLjYiIGNwMng9IjE3LjQiIGNwMnk9IjAuNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE5LjQiIHk9IjcuMCIgY3AxeD0iMTkuNCIgY3AxeT0iMy42IiBjcDJ4PSIxOS40IiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxOS40IiB5PSIxMi4wIiBjcDF4PSIxOS40IiBjcDF5PSIxMi4wIiBjcDJ4PSIxOS40IiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjEiIGxlZnQ9IjEiIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjE3LjAiIHkxPSIxMS4wIiB5Mj0iMTIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDkiIGdyZWVuPSIxMjgiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjIwMzQ4NTVFLTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4NzQzODQyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ4IiBncmVlbj0iMjUwIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTg0MTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43OTQxMTc2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNCIgZ3JlZW49IjIxOSIgYmx1ZT0iMjMyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMTI3MDcxMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUxNTAyNDY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM2MDc4NDMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC4wMzMzMzMzMzUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk1IiBncmVlbj0iMjEyIiBibHVlPSIyMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDIxNTY0MzY0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40OTA5Nzc0NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNDUwOTgwMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjExLjAiIGNwMXg9IjEuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjMuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI3LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTcuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMTEuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1OSIgZ3JlZW49Ijg1IiBibHVlPSIxMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDEzNDgzMTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xNzY5OTg3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjE1Njg2NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQiIGdyZWVuPSI1MCIgYmx1ZT0iNzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDEzNDgzMTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAzOTk2MTM5OCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjU4ODIzNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMi4wIiBjcDF4PSIwLjAiIGNwMXk9IjEyLjAiIGNwMng9IjAuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMi4wIiBjcDF4PSIwLjAiIGNwMXk9IjIuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTYuNjM2MzYzNjM2MzYzNjQiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjcuMCIgY3AxeD0iMTcuOTc3MjcyNzI3MjcyNzI3IiBjcDF5PSIzLjI1MDAwMDAwMDAwMDAwMSIgY3AyeD0iMTguMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTguMCIgeT0iMTIuMCIgY3AxeD0iMTguMCIgY3AxeT0iMTIuMCIgY3AyeD0iMTguMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzYTNkMGZkYTgucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iMSIgbGVmdD0iMSIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMC4wIiB5MT0iMC4wIiB5Mj0iMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjIwMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIxNy4wIiB5MT0iMTEuMCIgeTI9IjEyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTUiIGdyZWVuPSI0MyIgYmx1ZT0iODIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMTgzNjMyMzciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTgxMzU4ODciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIyNzQ1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQzIiBncmVlbj0iMTY5IiBibHVlPSIxOTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTQuMjAzMzE5NUUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzgwNTA1OTUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44NjM2MzY0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjgyIiBncmVlbj0iMTIyIiBibHVlPSIxNTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMi45NTY5ODY0RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xNTQ3MDE2MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNzA1ODgyMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjAzMzMzMzMzNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI2OSIgZ3JlZW49IjExMiIgYmx1ZT0iMTUwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii00LjYyMzUzMjNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NTcxNDI3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzOTIxNTY4NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjExLjAiIGNwMXg9IjEuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjMuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNy4wIiB5PSI3LjAiIGNwMXg9IjE3LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTcuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTcuMCIgeT0iMTEuMCIgY3AxeD0iMTcuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMTcuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIyNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ1NDkwMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEyLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyLjAiIGNwMXg9IjAuMCIgY3AxeT0iMi4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjIuMCIgY3AxeD0iMTMuMCIgY3AxeT0iMi4wIiBjcDJ4PSIxNi40NTQ1NDU0NTQ1NDU0NTMiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjcuMCIgY3AxeD0iMTcuOTc3MjcyNzI3MjcyNzI3IiBjcDF5PSIzLjUyMjcyNzI3MjcyNzI3MzQiIGNwMng9IjE4LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE4LjAiIHk9IjEyLjAiIGNwMXg9IjE4LjAiIGNwMXk9IjEyLjAiIGNwMng9IjE4LjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2EzZDIyMDcwLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSIzIiBsZWZ0PSI2IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MyIgZ3JlZW49IjE3NyIgYmx1ZT0iMTgzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41ODEwNjk0NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNjg2Mjc0NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40ODYzNjM2MzYzNjM2MzYyIiB5MT0iMC4wMTE2OTU5MDYxMDY2MDU2ODkiIHgyPSIwLjQ5MDkwOTA5MDkwOTA5MTEiIHkyPSIwLjg4ODg4ODg5MTk4NzI0NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjkuMCIgY3AxeD0iNi4wIiBjcDF5PSI5LjAiIGNwMng9IjYuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC40NTQ1NDU0NTQ1NDU0NTMiIHk9IjUuMTEzNjM2MzYzNjM2MzYxNSIgY3AxeD0iOC40NTQ1NDU0NTQ1NDU0NTMiIGNwMXk9IjUuMTEzNjM2MzYzNjM2MzYxNSIgY3AyeD0iOC40NTQ1NDU0NTQ1NDU0NTMiIGNwMnk9IjUuMTEzNjM2MzYzNjM2MzYxNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjkuMCIgY3AxeD0iMTEuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjQ8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSIzIiBsZWZ0PSI2IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjkiIGdyZWVuPSIxMjkiIGJsdWU9IjEyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDQzMTM3MjUyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3OCIgZ3JlZW49Ijc4IiBibHVlPSI3OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjQzMTM3MjciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjQ4NjM2MzYzNjM2MzYzNjIiIHkxPSIwLjAxMTY5NTkwNjEwNjYwNTY4OSIgeDI9IjAuNDkwOTA5MDkwOTA5MDkxMSIgeTI9IjAuODg4ODg4ODkxOTg3MjQ2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iOS4wIiBjcDF4PSI2LjAiIGNwMXk9IjkuMCIgY3AyeD0iNi4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4LjQ1NDU0NTQ1NDU0NTQ1MyIgeT0iNS4xMTM2MzYzNjM2MzYzNjE1IiBjcDF4PSI4LjQ1NDU0NTQ1NDU0NTQ1MyIgY3AxeT0iNS4xMTM2MzYzNjM2MzYzNjE1IiBjcDJ4PSI4LjQ1NDU0NTQ1NDU0NTQ1MyIgY3AyeT0iNS4xMTM2MzYzNjM2MzYzNjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTEuMCIgeT0iOS4wIiBjcDF4PSIxMS4wIiBjcDF5PSI5LjAiIGNwMng9IjExLjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJGb2N1c2VkIiBpbnZlcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIzIiBib3R0b209IjMiIGxlZnQ9IjYiIHJpZ2h0PSI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyOSIgZ3JlZW49IjEyOSIgYmx1ZT0iMTI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc4IiBncmVlbj0iNzgiIGJsdWU9Ijc4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNDMxMzcyNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDg2MzYzNjM2MzYzNjM2MiIgeTE9IjAuMDExNjk1OTA2MTA2NjA1Njg5IiB4Mj0iMC40OTA5MDkwOTA5MDkwOTExIiB5Mj0iMC44ODg4ODg4OTE5ODcyNDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSI5LjAiIGNwMXg9IjYuMCIgY3AxeT0iOS4wIiBjcDJ4PSI2LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNDU0NTQ1NDU0NTQ1NDUzIiB5PSI1LjExMzYzNjM2MzYzNjM2MTUiIGNwMXg9IjguNDU0NTQ1NDU0NTQ1NDUzIiBjcDF5PSI1LjExMzYzNjM2MzYzNjM2MTUiIGNwMng9IjguNDU0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSI1LjExMzYzNjM2MzYzNjM2MTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI5LjAiIGNwMXg9IjExLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitGb2N1c2VkIiBpbnZlcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIzIiBib3R0b209IjMiIGxlZnQ9IjYiIHJpZ2h0PSI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyOSIgZ3JlZW49IjEyOSIgYmx1ZT0iMTI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc4IiBncmVlbj0iNzgiIGJsdWU9Ijc4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNDMxMzcyNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDg2MzYzNjM2MzYzNjM2MiIgeTE9IjAuMDExNjk1OTA2MTA2NjA1Njg5IiB4Mj0iMC40OTA5MDkwOTA5MDkwOTExIiB5Mj0iMC44ODg4ODg4OTE5ODcyNDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSI5LjAiIGNwMXg9IjYuMCIgY3AxeT0iOS4wIiBjcDJ4PSI2LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNDU0NTQ1NDU0NTQ1NDUzIiB5PSI1LjExMzYzNjM2MzYzNjM2MTUiIGNwMXg9IjguNDU0NTQ1NDU0NTQ1NDUzIiBjcDF5PSI1LjExMzYzNjM2MzYzNjM2MTUiIGNwMng9IjguNDU0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSI1LjExMzYzNjM2MzYzNjM2MTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI5LjAiIGNwMXg9IjExLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrRm9jdXNlZCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIwIiBoZWlnaHQ9IjEyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSIzIiBsZWZ0PSI2IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC40ODYzNjM2MzYzNjM2MzYyIiB5MT0iMC4wMTE2OTU5MDYxMDY2MDU2ODkiIHgyPSIwLjQ5MDkwOTA5MDkwOTA5MTEiIHkyPSIwLjg4ODg4ODg5MTk4NzI0NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjkuMCIgY3AxeD0iNi4wIiBjcDF5PSI5LjAiIGNwMng9IjYuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC41MjI3MjcyNzI3MjcyNzMiIHk9IjUuMzE4MTgxODE4MTgxODE4IiBjcDF4PSI4LjUyMjcyNzI3MjcyNzI3MyIgY3AxeT0iNS4zMTgxODE4MTgxODE4MTgiIGNwMng9IjguNTIyNzI3MjcyNzI3MjczIiBjcDJ5PSI1LjMxODE4MTgxODE4MTgxOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjExLjAiIHk9IjkuMCIgY3AxeD0iMTEuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxMS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIiBpbnZlcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjAiIGhlaWdodD0iMTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjMiIGxlZnQ9IjYiIHJpZ2h0PSI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyOSIgZ3JlZW49IjEyOSIgYmx1ZT0iMTI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijc4IiBncmVlbj0iNzgiIGJsdWU9Ijc4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNDMxMzcyNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDg2MzYzNjM2MzYzNjM2MiIgeTE9IjAuMDExNjk1OTA2MTA2NjA1Njg5IiB4Mj0iMC40OTA5MDkwOTA5MDkwOTExIiB5Mj0iMC44ODg4ODg4OTE5ODcyNDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSI5LjAiIGNwMXg9IjYuMCIgY3AxeT0iOS4wIiBjcDJ4PSI2LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNDU0NTQ1NDU0NTQ1NDUzIiB5PSI1LjExMzYzNjM2MzYzNjM2MTUiIGNwMXg9IjguNDU0NTQ1NDU0NTQ1NDUzIiBjcDF5PSI1LjExMzYzNjM2MzYzNjM2MTUiIGNwMng9IjguNDU0NTQ1NDU0NTQ1NDUzIiBjcDJ5PSI1LjExMzYzNjM2MzYzNjM2MTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI5LjAiIGNwMXg9IjExLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQiIGludmVydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iMyIgbGVmdD0iNiIgcmlnaHQ9IjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNDg2MzYzNjM2MzYzNjM2MiIgeTE9IjAuMDExNjk1OTA2MTA2NjA1Njg5IiB4Mj0iMC40OTA5MDkwOTA5MDkwOTExIiB5Mj0iMC44ODg4ODg4OTE5ODcyNDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSI5LjAiIGNwMXg9IjYuMCIgY3AxeT0iOS4wIiBjcDJ4PSI2LjAiIGNwMnk9IjkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNTIyNzI3MjcyNzI3MjczIiB5PSI1LjMxODE4MTgxODE4MTgxOCIgY3AxeD0iOC41MjI3MjcyNzI3MjcyNzMiIGNwMXk9IjUuMzE4MTgxODE4MTgxODE4IiBjcDJ4PSI4LjUyMjcyNzI3MjcyNzI3MyIgY3AyeT0iNS4zMTgxODE4MTgxODE4MTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMS4wIiB5PSI5LjAiIGNwMXg9IjExLjAiIGNwMXk9IjkuMCIgY3AyeD0iMTEuMCIgY3AyeT0iOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvZm9yZWdyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSlNwbGl0UGFuZSIgbmFtZT0iU3BsaXRQYW5lIiB1aT0iU3BsaXRQYW5lVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXM+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRW5hYmxlZCIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9Ik1vdXNlT3ZlciIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlByZXNzZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJEaXNhYmxlZCIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkZvY3VzZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJTZWxlY3RlZCIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlZlcnRpY2FsIj4KKyAgICAgICAgICAgICAgIDxjb2RlU25pcHBldD48IVtDREFUQVsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjIGluc3RhbmNlb2YgSlNwbGl0UGFuZSAmJiAoKChKU3BsaXRQYW5lKWMpLmdldE9yaWVudGF0aW9uKCkgPT0gMSk7XV0+PC9jb2RlU25pcHBldD4KKyAgICAgICAgICAgIDwvc3RhdGVUeXBlPgorICAgICAgICAgPC9zdGF0ZVR5cGVzPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMSIgYm90dG9tPSIxIiBsZWZ0PSIxIiByaWdodD0iMSIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0ic2l6ZSIgdHlwZT0iSU5UIiB2YWx1ZT0iMTAiLz4KKwkgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iZGl2aWRlclNpemUiIHR5cGU9IklOVCIgdmFsdWU9IjEwIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJjZW50ZXJPbmVUb3VjaEJ1dHRvbnMiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJvbmVUb3VjaEJ1dHRvbk9mZnNldCIgdHlwZT0iSU5UIiB2YWx1ZT0iMzAiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9Im9uZVRvdWNoRXhwYW5kYWJsZSIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJjb250aW51b3VzTGF5b3V0IiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSIxNSIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zPgorICAgICAgICAgICAgPHJlZ2lvbiBuYW1lPSJTcGxpdFBhbmVEaXZpZGVyIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjY4IiBoZWlnaHQ9IjEwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMyIgYm90dG9tPSIzIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSI2OC4wIiB5MT0iMC4wIiB5Mj0iMTAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA1ODA2NDUxNyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTczNTg2MTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTAzMjI1ODA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NCIgZ3JlZW49IjI0NCIgYmx1ZT0iMjQ2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTAyMzk2MjM1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIxOTYwNzgzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTI5MDMyMjUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43Mzg3MDk3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxNCIgZ3JlZW49IjIxNyIgYmx1ZT0iMjIzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MDE2NzU3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuODE5MzU0ODMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ0IiBncmVlbj0iMjQ0IiBibHVlPSIyNDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDIzOTYyMzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjE5NjA3ODMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44OTY3NzQyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NiIgZ3JlZW49IjE1MSIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAxNzM1ODYxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTEzNzI1NDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA1NjIzMTRkLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjY4IiBoZWlnaHQ9IjEwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMyIgYm90dG9tPSIzIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSI2OC4wIiB5MT0iMC4wIiB5Mj0iMTAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA1ODA2NDUxNyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTczNTg2MTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTAzMjI1ODA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzAxNjc1NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjgxOTM1NDgzIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuODk2Nzc0MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTczNTg2MTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwNTYyMzE0ZC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIiBpbnZlcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI2OCIgaGVpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMjQiIHJpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyNi4wIiB4Mj0iNDIuMCIgeTE9IjQuMCIgeTI9IjcuMCIgcm91bmRpbmc9IjQuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA5MDMyMjU4NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODAiIGdyZWVuPSIxODQiIGJsdWU9IjE5MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDgwMjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzUiIGdyZWVuPSIyMzgiIGJsdWU9IjI0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDU1NTU1MTA1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjk3MDk5OSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMTU2ODYyNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY2NDUxNjE1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5OCIgZ3JlZW49IjIwMSIgYmx1ZT0iMjA3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NzA0ODA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjI1LjAiIHgyPSI0My4wIiB5MT0iMy4wIiB5Mj0iOC4wIiByb3VuZGluZz0iMy42NjY2NjY2NjY2NjY2OTI3Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjA2NDUxNjEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ2IiBncmVlbj0iMTUxIiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE3MzU4NjE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMTM3MjU0OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc5MzU0ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwNTYyMzE0ZC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtWZXJ0aWNhbCIgaW52ZXJ0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAiIGhlaWdodD0iMzgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08cmVjdGFuZ2xlIHgxPSIzLjk1NDU0NTQ1NDU0NTQ1NDYiIHgyPSI2LjAiIHkxPSIyNi40OTk5OTk5OTk5OTk5OCIgeTI9IjEwLjc3MjcyNzI3MjcyNzI3NSIgcm91bmRpbmc9IjIuMDAwMDAwMDAwMDAwMDAxIj4tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iNCIgeDI9IjYuMCIgeTE9IjEwIiB5Mj0iMjYuNSIgcm91bmRpbmc9IjIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE4OCIgYmx1ZT0iMTk2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA0OTMwMTgyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjE2MTI5MDMyIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjIxNCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3Mzk5NjYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuODY0NTE2MTQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEzIiBncmVlbj0iMjE3IiBibHVlPSIyMjIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxODUxODU2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY5OTg1NzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI1NDkwMTkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45MDY0NTE2NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODgiIGdyZWVuPSIxOTIiIGJsdWU9IjIwMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTA1MjYzMTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDM5MjE1Njg0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjcuMCIgeTE9IjkuMCIgeTI9IjI4LjAiIHJvdW5kaW5nPSI0LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1MCIgZ3JlZW49IjE1NSIgYmx1ZT0iMTY1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAxOTYxNzIyMiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDk4MDM5MjEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44NDE5MzU0NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjYiIGdyZWVuPSIxNzAiIGJsdWU9IjE3OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDQyNzM0NzQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzNzkwMDYyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NDgzODcxIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MiIgZ3JlZW49IjI1MyIgYmx1ZT0iMjUzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4xMTExMTExMDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNjU3Mzc0NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwNTZlZjU4ZS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9mb3JlZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3JlZ2lvbj4KKyAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSlRhYmJlZFBhbmUiIG5hbWU9IlRhYmJlZFBhbmUiIHVpPSJUYWJiZWRQYW5lVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0idGFiQXJlYVN0YXRlc01hdGNoU2VsZWN0ZWRUYWIiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJudWRnZVNlbGVjdGVkTGFiZWwiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0idGFiUnVuT3ZlcmxheSIgdHlwZT0iSU5UIiB2YWx1ZT0iMiIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0idGFiT3ZlcmxhcCIgdHlwZT0iSU5UIiB2YWx1ZT0iLTEiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImV4dGVuZFRhYnNUb0Jhc2UiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJ1c2VCYXNpY0Fycm93cyIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InNoYWRvdyIgdHlwZT0iQ09MT1IiPgorICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Rpc2FibGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iZGFya1NoYWRvdyIgdHlwZT0iQ09MT1IiPgorICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9InRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgIDwvdWlQcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImhpZ2hsaWdodCIgdHlwZT0iQ09MT1IiPgorICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnM+CisgICAgICAgICAgICA8cmVnaW9uIG5hbWU9IlRhYmJlZFBhbmVUYWIiIHN1YnJlZ2lvbj0idHJ1ZSI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIyIiBib3R0b209IjMiIGxlZnQ9IjgiIHJpZ2h0PSI4Ii8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNDQiIGhlaWdodD0iMjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjEiIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MSIgZ3JlZW49IjI1MSIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzMTc0NjA1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzOTIxNTY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzEiIGdyZWVuPSIyMzIiIGJsdWU9IjIzNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA1NDY4MTcyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTQ1Mjc4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM3NjQ3MDU3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTk1MzU1NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zMjU0OTAxOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE5LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTkuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSI2LjAiIGNwMXg9IjEuMCIgY3AxeT0iOS41NTU1NTU1NTU1NTU1NTQiIGNwMng9IjEuMCIgY3AyeT0iMi40NDQ0NDQ0NDQ0NDQ0NDY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIxLjAiIGNwMXg9IjIuNTU1NTU1NTU1NTU1NTU3IiBjcDF5PSIxLjAiIGNwMng9IjkuNDQ0NDQ0NDQ0NDQ0NDQzIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOC4wIiB5PSIxLjAiIGNwMXg9IjM0LjY2NjY2NjY2NjY2NjY2IiBjcDF5PSIxLjAiIGNwMng9IjQxLjMzMzMzMzMzMzMzMzM0IiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSI2LjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIuNzIyMjIyMjIyMjIyMjIzIiBjcDJ4PSI0My4wIiBjcDJ5PSI5LjI3Nzc3Nzc3Nzc3Nzc3NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjAiIHk9IjE5LjAiIGNwMXg9IjQzLjAiIGNwMXk9IjE5LjAiIGNwMng9IjQzLjAiIGNwMnk9IjE5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTAzIiBncmVlbj0iMTA2IiBibHVlPSIxMTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU1NTM1NzE2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMDk4MDM5NDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIxOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ3ODQzMTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSI1LjAiIGNwMXg9IjAuMCIgY3AxeT0iOC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMC4wIiBjcDF4PSIyLjAiIGNwMXk9IjAuMCIgY3AyeD0iOC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOS4wIiB5PSIwLjAiIGNwMXg9IjM2LjAiIGNwMXk9IjAuMCIgY3AyeD0iNDIuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iNS4wIiBjcDF4PSI0NC4wIiBjcDF5PSIyLjAiIGNwMng9IjQ0LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjIwLjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjIwLjAiIGNwMng9IjQ0LjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwNDA0OGEzZS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjQ0IiBoZWlnaHQ9IjIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSIxIiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTMiIGdyZWVuPSIyNTMiIGJsdWU9IjI1NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzE3NzczIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ0NzA1ODgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0MiIgZ3JlZW49IjI0NCIgYmx1ZT0iMjQ3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDIxMzQ4Mjk4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTU0NzEzNiIgYnJpZ2h0bmVzc09mZnNldD0iMC40MTk2MDc4MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU5ODUyNDIiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzk5OTk5OTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxOS4wIiBjcDF4PSIxLjAiIGNwMXk9IjE5LjAiIGNwMng9IjEuMCIgY3AyeT0iMTkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iNi4wIiBjcDF4PSIxLjAiIGNwMXk9IjkuNTU1NTU1NTU1NTU1NTU0IiBjcDJ4PSIxLjAiIGNwMnk9IjIuNDQ0NDQ0NDQ0NDQ0NDQ2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMS4wIiBjcDF4PSIyLjU1NTU1NTU1NTU1NTU1NyIgY3AxeT0iMS4wIiBjcDJ4PSI5LjQ0NDQ0NDQ0NDQ0NDQ0MyIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzguMCIgeT0iMS4wIiBjcDF4PSIzNC42NjY2NjY2NjY2NjY2NiIgY3AxeT0iMS4wIiBjcDJ4PSI0MS4zMzMzMzMzMzMzMzMzNCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDMuMCIgeT0iNi4wIiBjcDF4PSI0My4wIiBjcDF5PSIyLjcyMjIyMjIyMjIyMjIyMyIgY3AyeD0iNDMuMCIgY3AyeT0iOS4yNzc3Nzc3Nzc3Nzc3NzciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSIxOS4wIiBjcDF4PSI0My4wIiBjcDF5PSIxOS4wIiBjcDJ4PSI0My4wIiBjcDJ5PSIxOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMiIgZ3JlZW49IjEyNiIgYmx1ZT0iMTM0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NDYxNjIwNyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIxOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ3ODQzMTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSI1LjAiIGNwMXg9IjAuMCIgY3AxeT0iOC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMC4wIiBjcDF4PSIyLjAiIGNwMXk9IjAuMCIgY3AyeD0iOC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOS4wIiB5PSIwLjAiIGNwMXg9IjM2LjAiIGNwMXk9IjAuMCIgY3AyeD0iNDIuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iNS4wIiBjcDF4PSI0NC4wIiBjcDF5PSIyLjAiIGNwMng9IjQ0LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjIwLjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjIwLjAiIGNwMng9IjQ0LjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwNDFhODE0Yy5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtQcmVzc2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjQ0IiBoZWlnaHQ9IjIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSIxIiBsZWZ0PSI2IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDUiIGdyZWVuPSIyMDkiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAyNzQwODg5OCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTg0Nzg4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yOTgwMzkyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODMiIGdyZWVuPSIxODgiIGJsdWU9IjE5OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzNTkzMTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTU1MzEyMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzEzNzI1NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjY0MTkzNTQ3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NiIgZ3JlZW49IjE3MyIgYmx1ZT0iMTg2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDI5NjgxNjgzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41MjgxODc0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE4MDM5MjE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMDgiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzODAxNDk1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41NDU2MjQyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyMTU2ODYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxOS4wIiBjcDF4PSIxLjAiIGNwMXk9IjE5LjAiIGNwMng9IjEuMCIgY3AyeT0iMTkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iNi4wIiBjcDF4PSIxLjAiIGNwMXk9IjkuNjY2NjY2NjY2NjY2NjY0IiBjcDJ4PSIxLjAiIGNwMnk9IjIuMzMzMzMzMzMzMzMzMzM1NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMS4wIiBjcDF4PSIyLjQ0NDQ0NDQ0NDQ0NDQ0NjQiIGNwMXk9IjEuMCIgY3AyeD0iOS41NTU1NTU1NTU1NTU1NTQiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM4LjAiIHk9IjEuMCIgY3AxeD0iMzQuNDk5OTk5OTk5OTk5OTg2IiBjcDF5PSIxLjA1NTU1NTU1NTU1NTU1NTYiIGNwMng9IjQxLjUwMDAwMDAwMDAwMDAxNCIgY3AyeT0iMC45NDQ0NDQ0NDQ0NDQ0NDQ0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDMuMCIgeT0iNi4wIiBjcDF4PSI0My4wNTU1NTU1NTU1NTU1NiIgY3AxeT0iMi4zMzMzMzMzMzMzMzMzMzU3IiBjcDJ4PSI0Mi45NDQ0NDQ0NDQ0NDQ0NCIgY3AyeT0iOS42NjY2NjY2NjY2NjY2NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSIxOS4wIiBjcDF4PSI0My4wIiBjcDF5PSIxOS4wIiBjcDJ4PSI0My4wIiBjcDJ5PSIxOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSI3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTIxNTY4NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIxOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ3ODQzMTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIxOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ3ODQzMTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSI1LjAiIGNwMXg9Ii0wLjA1NTU1NTU1NTU1NTU1NTU1IiBjcDF5PSIyLjM4ODg4ODg4ODg4ODg4NzUiIGNwMng9IjAuMDU1NTU1NTU1NTU1NTU1NTUiIGNwMnk9IjcuNjExMTExMTExMTExMTEyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMC4wIiBjcDF4PSIyLjQ5OTk5OTk5OTk5OTk5ODIiIGNwMXk9IjAuMCIgY3AyeD0iNy41MDAwMDAwMDAwMDAwMDIiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM5LjAiIHk9IjAuMCIgY3AxeD0iMzYuMjc3Nzc3Nzc3Nzc3Nzg2IiBjcDF5PSIwLjAiIGNwMng9IjQxLjcyMjIyMjIyMjIyMjIxNCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iNS4wIiBjcDF4PSI0My45NDQ0NDQ0NDQ0NDQ0NCIgY3AxeT0iMi4yNzc3Nzc3Nzc3Nzc3NzciIGNwMng9IjQ0LjA1NTU1NTU1NTU1NTU2IiBjcDJ5PSI3LjcyMjIyMjIyMjIyMjIyMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjIwLjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjIwLjAiIGNwMng9IjQ0LjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwNDFiN2Y1Ni5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNDQiIGhlaWdodD0iMjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI2IiBib3R0b209IjEiIGxlZnQ9IjciIHJpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMCIgZ3JlZW49IjIyMiIgYmx1ZT0iMjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDQ2MzQ4MzMzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MDA2MjY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0NTA5ODAyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTciIGdyZWVuPSIyMTkiIGJsdWU9IjIyNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA0NjM0ODMzMyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjAwMTU4NzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzMzMzMzMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMzI0NTk0MzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU5NTM1NTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzI1NDkwMTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxOS4wIiBjcDF4PSIxLjAiIGNwMXk9IjE5LjAiIGNwMng9IjEuMCIgY3AyeT0iMTkuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iNi4wIiBjcDF4PSIxLjAiIGNwMXk9IjkuNTU1NTU1NTU1NTU1NTU0IiBjcDJ4PSIxLjAiIGNwMnk9IjIuNDQ0NDQ0NDQ0NDQ0NDQ2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMS4wIiBjcDF4PSIyLjU1NTU1NTU1NTU1NTU1NyIgY3AxeT0iMS4wIiBjcDJ4PSI5LjQ0NDQ0NDQ0NDQ0NDQ0MyIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzguMCIgeT0iMS4wIiBjcDF4PSIzNC42NjY2NjY2NjY2NjY2NiIgY3AxeT0iMS4wIiBjcDJ4PSI0MS4zMzMzMzMzMzMzMzMzNCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDMuMCIgeT0iNi4wIiBjcDF4PSI0My4wIiBjcDF5PSIyLjcyMjIyMjIyMjIyMjIyMyIgY3AyeD0iNDMuMCIgY3AyeT0iOS4yNzc3Nzc3Nzc3Nzc3NzciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSIxOS4wIiBjcDF4PSI0My4wIiBjcDF5PSIxOS4wIiBjcDJ4PSI0My4wIiBjcDJ5PSIxOS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5NiIgZ3JlZW49IjE5OSIgYmx1ZT0iMjA1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDMyNDU5NDM4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTE4MTE4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgwIiBncmVlbj0iMTgyIiBibHVlPSIxOTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNTQ2ODE3MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTgzMDgyNzQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSI1LjAiIGNwMXg9IjAuMCIgY3AxeT0iOC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuMCIgeT0iMC4wIiBjcDF4PSIyLjAiIGNwMXk9IjAuMCIgY3AyeD0iOC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOS4wIiB5PSIwLjAiIGNwMXg9IjM2LjAiIGNwMXk9IjAuMCIgY3AyeD0iNDIuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iNS4wIiBjcDF4PSI0NC4wIiBjcDF5PSIyLjAiIGNwMng9IjQ0LjAiIGNwMnk9IjguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjIwLjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjIwLjAiIGNwMng9IjQ0LjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwNDFkYTYzNi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkK0Rpc2FibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjQ0IiBoZWlnaHQ9IjIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSIwIiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDYiIGdyZWVuPSIyNDgiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzEzNzI1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI0ODM4NzEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA3IiBncmVlbj0iMjE4IiBibHVlPSIyMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNy4xMzQwOEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTQzNjA5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0NTA5ODAyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjAzMjI1OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjkiIGdyZWVuPSIxODkiIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDIwNzUxMzU3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTYxMDI2NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzY3NzQxOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIxODQiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQzODY2OTk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0NzA1ODgxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzQiIGdyZWVuPSIxOTUiIGJsdWU9IjIxNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ0ODc5ODQyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5MDE5NjA2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjYuMCIgY3AxeD0iMS4wIiBjcDF5PSI5LjU1NTU1NTU1NTU1NTU1NCIgY3AyeD0iMS4wIiBjcDJ5PSIyLjQ0NDQ0NDQ0NDQ0NDQ0NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjEuMCIgY3AxeD0iMi41NTU1NTU1NTU1NTU1NTciIGNwMXk9IjEuMCIgY3AyeD0iOS40NDQ0NDQ0NDQ0NDQ0NDMiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM4LjAiIHk9IjEuMCIgY3AxeD0iMzQuNjY2NjY2NjY2NjY2NjYiIGNwMXk9IjEuMCIgY3AyeD0iNDEuMzMzMzMzMzMzMzMzMzQiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjAiIHk9IjYuMCIgY3AxeD0iNDMuMCIgY3AxeT0iMi43MjIyMjIyMjIyMjIyMjMiIGNwMng9IjQzLjAiIGNwMnk9IjkuMjc3Nzc3Nzc3Nzc3Nzc3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDMuMCIgeT0iMjAuMCIgY3AxeD0iNDMuMCIgY3AxeT0iMjAuMCIgY3AyeD0iNDMuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTYiIGdyZWVuPSIxOTkiIGJsdWU9IjIwNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAzMjQ1OTQzOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTkxODExODQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MCIgZ3JlZW49IjE4MiIgYmx1ZT0iMTkwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDU0NjgxNzIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU4MzA4Mjc0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNS4wIiBjcDF4PSIwLjAiIGNwMXk9IjguMCIgY3AyeD0iMC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjAuMCIgY3AxeD0iMi4wIiBjcDF5PSIwLjAiIGNwMng9IjguMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzkuMCIgeT0iMC4wIiBjcDF4PSIzNi4wIiBjcDF5PSIwLjAiIGNwMng9IjQyLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjUuMCIgY3AxeD0iNDQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI0NC4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSIyMC4wIiBjcDF4PSI0NC4wIiBjcDF5PSIyMC4wIiBjcDJ4PSI0NC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MDQxZTgyZDEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjQ0IiBoZWlnaHQ9IjIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSIwIiBsZWZ0PSI3IiByaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDYiIGdyZWVuPSIyNDgiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzEzNzI1MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI0ODM4NzEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA3IiBncmVlbj0iMjE4IiBibHVlPSIyMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNy4xMzQwOEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTQzNjA5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0NTA5ODAyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjAzMjI1OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjkiIGdyZWVuPSIxODkiIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDIwNzUxMzU3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NTYxMDI2NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzY3NzQxOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjMiIGdyZWVuPSIxODQiIGJsdWU9IjIwMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQzODY2OTk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0NzA1ODgxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzQiIGdyZWVuPSIxOTUiIGJsdWU9IjIxNCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ0ODc5ODQyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5MDE5NjA2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjYuMCIgY3AxeD0iMS4wIiBjcDF5PSI5LjU1NTU1NTU1NTU1NTU1NCIgY3AyeD0iMS4wIiBjcDJ5PSIyLjQ0NDQ0NDQ0NDQ0NDQ0NjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjEuMCIgY3AxeD0iMi41NTU1NTU1NTU1NTU1NTciIGNwMXk9IjEuMCIgY3AyeD0iOS40NDQ0NDQ0NDQ0NDQ0NDMiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM4LjAiIHk9IjEuMCIgY3AxeD0iMzQuNjY2NjY2NjY2NjY2NjYiIGNwMXk9IjEuMCIgY3AyeD0iNDEuMzMzMzMzMzMzMzMzMzQiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjAiIHk9IjYuMCIgY3AxeD0iNDMuMCIgY3AxeT0iMi43MjIyMjIyMjIyMjIyMjMiIGNwMng9IjQzLjAiIGNwMnk9IjkuMjc3Nzc3Nzc3Nzc3Nzc3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDMuMCIgeT0iMjAuMCIgY3AxeD0iNDMuMCIgY3AxeT0iMjAuMCIgY3AyeD0iNDMuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzMyIgZ3JlZW49IjU0IiBibHVlPSI3MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4Nzc2OTA5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNjI3NDUxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40Nzg0MzE0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNS4wIiBjcDF4PSIwLjAiIGNwMXk9IjguMCIgY3AyeD0iMC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjAuMCIgY3AxeD0iMi4wIiBjcDF5PSIwLjAiIGNwMng9IjguMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzkuMCIgeT0iMC4wIiBjcDF4PSIzNi4wIiBjcDF5PSIwLjAiIGNwMng9IjQyLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjUuMCIgY3AxeD0iNDQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI0NC4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSIyMC4wIiBjcDF4PSI0NC4wIiBjcDF5PSIyMC4wIiBjcDJ4PSI0NC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MDQxZTgyZDEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkK01vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI0NCIgaGVpZ2h0PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iMCIgbGVmdD0iOSIgcmlnaHQ9IjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ4IiBncmVlbj0iMjUwIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTg0MTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yNDgzODcxIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjIyNCIgYmx1ZT0iMjM1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMjI2Mjc3MTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUzMzU4NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzcyNTQ5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjAzMjI1OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODQiIGdyZWVuPSIyMDUiIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDE3Mjg1OTQzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjA4MjY0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyNTQ5MDE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzY3NzQxOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIyMDMiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NTUzNDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk2Nzc0MTkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkzIiBncmVlbj0iMjE0IiBibHVlPSIyMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjQwNDA0NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNjQ3MDU4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjIwLjAiIGNwMXg9IjEuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSI2LjAiIGNwMXg9IjEuMCIgY3AxeT0iOS41NTU1NTU1NTU1NTU1NTQiIGNwMng9IjEuMCIgY3AyeT0iMi40NDQ0NDQ0NDQ0NDQ0NDY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIxLjAiIGNwMXg9IjIuNTU1NTU1NTU1NTU1NTU3IiBjcDF5PSIxLjAiIGNwMng9IjkuNDQ0NDQ0NDQ0NDQ0NDQzIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOC4wIiB5PSIxLjAiIGNwMXg9IjM0LjY2NjY2NjY2NjY2NjY2IiBjcDF5PSIxLjAiIGNwMng9IjQxLjMzMzMzMzMzMzMzMzM0IiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSI2LjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIuNzIyMjIyMjIyMjIyMjIzIiBjcDJ4PSI0My4wIiBjcDJ5PSI5LjI3Nzc3Nzc3Nzc3Nzc3NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjAiIHk9IjIwLjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIwLjAiIGNwMng9IjQzLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjQiIGJsdWU9IjI3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDYzMzIzNjgiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDQzMTM3MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDc4NDMxNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjUuMCIgY3AxeD0iMC4wIiBjcDF5PSI4LjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIwLjAiIGNwMXg9IjIuMCIgY3AxeT0iMC4wIiBjcDJ4PSI4LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM5LjAiIHk9IjAuMCIgY3AxeD0iMzYuMCIgY3AxeT0iMC4wIiBjcDJ4PSI0Mi4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSI1LjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjIuMCIgY3AyeD0iNDQuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iMjAuMCIgY3AxeD0iNDQuMCIgY3AxeT0iMjAuMCIgY3AyeD0iNDQuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA0MjQ3MTM4LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCtQcmVzc2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjQ0IiBoZWlnaHQ9IjIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNyIgYm90dG9tPSIwIiBsZWZ0PSI5IiByaWdodD0iOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDMiIGdyZWVuPSIxNjkiIGJsdWU9IjE5MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItNC4yMDMzMTk1RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zODA1MDU5NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI0ODM4NzEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iODQiIGdyZWVuPSIxMjMiIGJsdWU9IjE1OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTM0ODMxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjE2NDAxNjE5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA3NDUwOTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42MDMyMjU4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU0IiBncmVlbj0iMTAxIiBibHVlPSIxNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxMDAwMTY1OSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDE1OTk1OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDA3ODQzMTM3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzY3NzQxOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MSIgZ3JlZW49Ijk4IiBibHVlPSIxNDAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk0MTkzNTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjAiIGdyZWVuPSIxMDYiIGJsdWU9IjE0OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTg3MjcxODMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzODM5ODg2MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIyMC4wIiBjcDF4PSIxLjAiIGNwMXk9IjIwLjAiIGNwMng9IjEuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iNi4wIiBjcDF4PSIxLjAiIGNwMXk9IjkuNTU1NTU1NTU1NTU1NTU0IiBjcDJ4PSIxLjAiIGNwMnk9IjIuNDQ0NDQ0NDQ0NDQ0NDQ2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuMCIgeT0iMS4wIiBjcDF4PSIyLjU1NTU1NTU1NTU1NTU1NyIgY3AxeT0iMS4wIiBjcDJ4PSI5LjQ0NDQ0NDQ0NDQ0NDQ0MyIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzguMCIgeT0iMS4wIiBjcDF4PSIzNC42NjY2NjY2NjY2NjY2NiIgY3AxeT0iMS4wIiBjcDJ4PSI0MS4zMzMzMzMzMzMzMzMzNCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDMuMCIgeT0iNi4wIiBjcDF4PSI0My4wIiBjcDF5PSIyLjcyMjIyMjIyMjIyMjIyMyIgY3AyeD0iNDMuMCIgY3AyeT0iOS4yNzc3Nzc3Nzc3Nzc3NzciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSIyMC4wIiBjcDF4PSI0My4wIiBjcDF5PSIyMC4wIiBjcDJ4PSI0My4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSI0IiBibHVlPSIyNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA2MzMyMzY4IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ0MzEzNzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjU3ODY1MTY3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41NDkwMTk2MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjUuMCIgY3AxeD0iMC4wIiBjcDF5PSI4LjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIwLjAiIGNwMXg9IjIuMCIgY3AxeT0iMC4wIiBjcDJ4PSI4LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM5LjAiIHk9IjAuMCIgY3AxeD0iMzYuMCIgY3AxeT0iMC4wIiBjcDJ4PSI0Mi4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSI1LjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjIuMCIgY3AyeD0iNDQuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iMjAuMCIgY3AxeD0iNDQuMCIgY3AxeT0iMjAuMCIgY3AyeD0iNDQuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA0MjViYmE2LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI0NCIgaGVpZ2h0PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iMyIgbGVmdD0iNyIgcmlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuOTE2NjY2NjY2NjY2NjY0IiB5PSIxNy43NDk5OTk5OTk5OTk5OTYiIGNwMXg9IjIwLjkxNjY2NjY2NjY2NjY2NCIgY3AxeT0iMTcuNzQ5OTk5OTk5OTk5OTk2IiBjcDJ4PSIyMC45MTY2NjY2NjY2NjY2NjQiIGNwMnk9IjE3Ljc0OTk5OTk5OTk5OTk5NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjk1ODMzMzMzMzMzMzMzMiIgeT0iMTkuMzMzMzMzMzMzMzMzMzMyIiBjcDF4PSIyMC45NTgzMzMzMzMzMzMzMzIiIGNwMXk9IjE5LjMzMzMzMzMzMzMzMzMzMiIgY3AyeD0iMjAuOTU4MzMzMzMzMzMzMzMyIiBjcDJ5PSIxOS4zMzMzMzMzMzMzMzMzMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjY2NjY2NjY2NjY2NjY2NjUiIHk9IjE5LjMzMzMzMzMzMzMzMzM0IiBjcDF4PSIyLjY2NjY2NjY2NjY2NjY2NjUiIGNwMXk9IjE5LjMzMzMzMzMzMzMzMzM0IiBjcDJ4PSIyLjY2NjY2NjY2NjY2NjY2NjUiIGNwMnk9IjE5LjMzMzMzMzMzMzMzMzM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi42MjQ5OTk5OTk5OTk5OTg3IiB5PSI2LjE2NjY2NjY2NjY2NjY2NSIgY3AxeD0iMi42MjQ5OTk5OTk5OTk5OTg3IiBjcDF5PSI2LjE2NjY2NjY2NjY2NjY2NSIgY3AyeD0iMi42MjQ5OTk5OTk5OTk5OTg3IiBjcDJ5PSIzLjkxNjY2NjY2NjY2NjY2NDciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjkxNjY2NjY2NjY2NjY2NCIgeT0iMi42NjY2NjY2NjY2NjY2NjUiIGNwMXg9IjMuOTk5OTk5OTk5OTk5OTk5NiIgY3AxeT0iMi42NjY2NjY2NjY2NjY2NjUiIGNwMng9IjUuOTE2NjY2NjY2NjY2NjY0IiBjcDJ5PSIyLjY2NjY2NjY2NjY2NjY2NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM3LjcwODMzMzMzMzMzMzMzIiB5PSIyLjY2NjY2NjY2NjY2NjY2NjUiIGNwMXg9IjM3LjcwODMzMzMzMzMzMzMzIiBjcDF5PSIyLjY2NjY2NjY2NjY2NjY2NjUiIGNwMng9IjM5LjgzMzMzMzMzMzMzMzMxNCIgY3AyeT0iMi42NjY2NjY2NjY2NjY2NjY1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDEuNDE2NjY2NjY2NjY2NjY0IiB5PSI2LjA0MTY2NjY2NjY2NjY2NyIgY3AxeD0iNDEuNDE2NjY2NjY2NjY2NjY0IiBjcDF5PSIzLjQ1ODMzMzMzMzMzMzMzNTMiIGNwMng9IjQxLjQxNjY2NjY2NjY2NjY2NCIgY3AyeT0iNi4wNDE2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0MS4zNzUwMDAwMDAwMDAwMSIgeT0iMTkuMjkxNjY2NjY2NjY2NjU3IiBjcDF4PSI0MS4zNzUwMDAwMDAwMDAwMSIgY3AxeT0iMTkuMjkxNjY2NjY2NjY2NjU3IiBjcDJ4PSI0MS4zNzUwMDAwMDAwMDAwMSIgY3AyeT0iMTkuMjkxNjY2NjY2NjY2NjU3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjEuMDAwMDAwMDAwMDAwMDA3IiB5PSIxOS4zMzMzMzMzMzMzMzMzMyIgY3AxeD0iMjEuMDAwMDAwMDAwMDAwMDA3IiBjcDF5PSIxOS4zMzMzMzMzMzMzMzMzMyIgY3AyeD0iMjEuMDAwMDAwMDAwMDAwMDA3IiBjcDJ5PSIxOS4zMzMzMzMzMzMzMzMzMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjkxNjY2NjY2NjY2NjY2OCIgeT0iMTcuNzA4MzMzMzMzMzMzMzMyIiBjcDF4PSIyMC45MTY2NjY2NjY2NjY2NjgiIGNwMXk9IjE3LjcwODMzMzMzMzMzMzMzMiIgY3AyeD0iMjAuOTE2NjY2NjY2NjY2NjY4IiBjcDJ5PSIxNy43MDgzMzMzMzMzMzMzMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOS43MDgzMzMzMzMzMzMzMyIgeT0iMTcuNjY2NjY2NjY2NjY2NjY4IiBjcDF4PSIzOS43MDgzMzMzMzMzMzMzMyIgY3AxeT0iMTcuNjY2NjY2NjY2NjY2NjY4IiBjcDJ4PSIzOS43MDgzMzMzMzMzMzMzMyIgY3AyeT0iMTcuNjY2NjY2NjY2NjY2NjY4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzkuNjI1IiB5PSI2LjA4MzMzMzMzMzMzMzMzMiIgY3AxeD0iMzkuNjI1IiBjcDF5PSI2LjA4MzMzMzMzMzMzMzMzMiIgY3AyeD0iMzkuNjI0OTk5OTk5OTk5OTkiIGNwMnk9IjUuMTY2NjY2NjY2NjY2NjY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzcuNjY2NjY2NjY2NjY2NjY0IiB5PSI0LjI0OTk5OTk5OTk5OTk5OSIgY3AxeD0iMzguNzUiIGNwMXk9IjQuMjQ5OTk5OTk5OTk5OTk3IiBjcDJ4PSIzNy42NjY2NjY2NjY2NjY2NjQiIGNwMnk9IjQuMjQ5OTk5OTk5OTk5OTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS44MzMzMzMzMzMzMzMzMzIiIHk9IjQuMjkxNjY2NjY2NjY2NjY2IiBjcDF4PSI1LjgzMzMzMzMzMzMzMzMzMiIgY3AxeT0iNC4yOTE2NjY2NjY2NjY2NjYiIGNwMng9IjQuODMzMzMzMzMzMzMzMzMyIiBjcDJ5PSI0LjI5MTY2NjY2NjY2NjY2NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMzc0OTk5OTk5OTk5OTk4IiB5PSI2LjA4MzMzMzMzMzMzMzMzIiBjcDF4PSI0LjQxNjY2NjY2NjY2NjY2NSIgY3AxeT0iNS4xMjQ5OTk5OTk5OTk5OTY0IiBjcDJ4PSI0LjM3NDk5OTk5OTk5OTk5OCIgY3AyeT0iNi4wODMzMzMzMzMzMzMzMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMjkxNjY2NjY2NjY2NjY0IiB5PSIxNy43MDgzMzMzMzMzMzMzMzQiIGNwMXg9IjQuMjkxNjY2NjY2NjY2NjY0IiBjcDF5PSIxNy43MDgzMzMzMzMzMzMzMzQiIGNwMng9IjQuMjkxNjY2NjY2NjY2NjY0IiBjcDJ5PSIxNy43MDgzMzMzMzMzMzMzMzQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ2IiBncmVlbj0iMjQ4IiBibHVlPSIyNTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDMxMzcyNTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yNDgzODcxIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNyIgZ3JlZW49IjIxOCIgYmx1ZT0iMjI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjcuMTM0MDhFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjU0MzYwOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNDUwOTgwMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYwMzIyNTgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY5IiBncmVlbj0iMTg5IiBibHVlPSIyMDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAyMDc1MTM1NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU2MTAyNjQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc2Nzc0MTkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTYzIiBncmVlbj0iMTg0IiBibHVlPSIyMDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40Mzg2Njk5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDcwNTg4MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc0IiBncmVlbj0iMTk1IiBibHVlPSIyMTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NDg3OTg0MiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yOTAxOTYwNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjIwLjAiIGNwMXg9IjEuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSI2LjAiIGNwMXg9IjEuMCIgY3AxeT0iOS41NTU1NTU1NTU1NTU1NTQiIGNwMng9IjEuMCIgY3AyeT0iMi40NDQ0NDQ0NDQ0NDQ0NDY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIxLjAiIGNwMXg9IjIuNTU1NTU1NTU1NTU1NTU3IiBjcDF5PSIxLjAiIGNwMng9IjkuNDQ0NDQ0NDQ0NDQ0NDQzIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOC4wIiB5PSIxLjAiIGNwMXg9IjM0LjY2NjY2NjY2NjY2NjY2IiBjcDF5PSIxLjAiIGNwMng9IjQxLjMzMzMzMzMzMzMzMzM0IiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSI2LjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIuNzIyMjIyMjIyMjIyMjIzIiBjcDJ4PSI0My4wIiBjcDJ5PSI5LjI3Nzc3Nzc3Nzc3Nzc3NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjAiIHk9IjIwLjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIwLjAiIGNwMng9IjQzLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzMiIGdyZWVuPSI1NCIgYmx1ZT0iNzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODc3NjkwOSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjYyNzQ1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDc4NDMxNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjUuMCIgY3AxeD0iMC4wIiBjcDF5PSI4LjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIwLjAiIGNwMXg9IjIuMCIgY3AxeT0iMC4wIiBjcDJ4PSI4LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM5LjAiIHk9IjAuMCIgY3AxeD0iMzYuMCIgY3AxeT0iMC4wIiBjcDJ4PSI0Mi4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSI1LjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjIuMCIgY3AyeD0iNDQuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iMjAuMCIgY3AxeD0iNDQuMCIgY3AxeT0iMjAuMCIgY3AyeD0iNDQuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA0MWU4MmQxLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCtNb3VzZU92ZXIrRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI0NCIgaGVpZ2h0PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjciIGJvdHRvbT0iMyIgbGVmdD0iOSIgcmlnaHQ9IjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuOTE2NjY2NjY2NjY2NjY0IiB5PSIxNy43NDk5OTk5OTk5OTk5OTYiIGNwMXg9IjIwLjkxNjY2NjY2NjY2NjY2NCIgY3AxeT0iMTcuNzQ5OTk5OTk5OTk5OTk2IiBjcDJ4PSIyMC45MTY2NjY2NjY2NjY2NjQiIGNwMnk9IjE3Ljc0OTk5OTk5OTk5OTk5NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjk1ODMzMzMzMzMzMzMzMiIgeT0iMTkuMzMzMzMzMzMzMzMzMzMyIiBjcDF4PSIyMC45NTgzMzMzMzMzMzMzMzIiIGNwMXk9IjE5LjMzMzMzMzMzMzMzMzMzMiIgY3AyeD0iMjAuOTU4MzMzMzMzMzMzMzMyIiBjcDJ5PSIxOS4zMzMzMzMzMzMzMzMzMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjY2NjY2NjY2NjY2NjY2NjUiIHk9IjE5LjMzMzMzMzMzMzMzMzM0IiBjcDF4PSIyLjY2NjY2NjY2NjY2NjY2NjUiIGNwMXk9IjE5LjMzMzMzMzMzMzMzMzM0IiBjcDJ4PSIyLjY2NjY2NjY2NjY2NjY2NjUiIGNwMnk9IjE5LjMzMzMzMzMzMzMzMzM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi42MjQ5OTk5OTk5OTk5OTg3IiB5PSI2LjE2NjY2NjY2NjY2NjY2NSIgY3AxeD0iMi42MjQ5OTk5OTk5OTk5OTg3IiBjcDF5PSI2LjE2NjY2NjY2NjY2NjY2NSIgY3AyeD0iMi42MjQ5OTk5OTk5OTk5OTg3IiBjcDJ5PSIzLjkxNjY2NjY2NjY2NjY2NDciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjkxNjY2NjY2NjY2NjY2NCIgeT0iMi42NjY2NjY2NjY2NjY2NjUiIGNwMXg9IjMuOTk5OTk5OTk5OTk5OTk5NiIgY3AxeT0iMi42NjY2NjY2NjY2NjY2NjUiIGNwMng9IjUuOTE2NjY2NjY2NjY2NjY0IiBjcDJ5PSIyLjY2NjY2NjY2NjY2NjY2NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM3LjcwODMzMzMzMzMzMzMzIiB5PSIyLjY2NjY2NjY2NjY2NjY2NjUiIGNwMXg9IjM3LjcwODMzMzMzMzMzMzMzIiBjcDF5PSIyLjY2NjY2NjY2NjY2NjY2NjUiIGNwMng9IjM5LjgzMzMzMzMzMzMzMzMxNCIgY3AyeT0iMi42NjY2NjY2NjY2NjY2NjY1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDEuNDE2NjY2NjY2NjY2NjY0IiB5PSI2LjA0MTY2NjY2NjY2NjY2NyIgY3AxeD0iNDEuNDE2NjY2NjY2NjY2NjY0IiBjcDF5PSIzLjQ1ODMzMzMzMzMzMzMzNTMiIGNwMng9IjQxLjQxNjY2NjY2NjY2NjY2NCIgY3AyeT0iNi4wNDE2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0MS4zNzUwMDAwMDAwMDAwMSIgeT0iMTkuMjkxNjY2NjY2NjY2NjU3IiBjcDF4PSI0MS4zNzUwMDAwMDAwMDAwMSIgY3AxeT0iMTkuMjkxNjY2NjY2NjY2NjU3IiBjcDJ4PSI0MS4zNzUwMDAwMDAwMDAwMSIgY3AyeT0iMTkuMjkxNjY2NjY2NjY2NjU3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjEuMDAwMDAwMDAwMDAwMDA3IiB5PSIxOS4zMzMzMzMzMzMzMzMzMyIgY3AxeD0iMjEuMDAwMDAwMDAwMDAwMDA3IiBjcDF5PSIxOS4zMzMzMzMzMzMzMzMzMyIgY3AyeD0iMjEuMDAwMDAwMDAwMDAwMDA3IiBjcDJ5PSIxOS4zMzMzMzMzMzMzMzMzMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjkxNjY2NjY2NjY2NjY2OCIgeT0iMTcuNzA4MzMzMzMzMzMzMzMyIiBjcDF4PSIyMC45MTY2NjY2NjY2NjY2NjgiIGNwMXk9IjE3LjcwODMzMzMzMzMzMzMzMiIgY3AyeD0iMjAuOTE2NjY2NjY2NjY2NjY4IiBjcDJ5PSIxNy43MDgzMzMzMzMzMzMzMzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOS43MDgzMzMzMzMzMzMzMyIgeT0iMTcuNjY2NjY2NjY2NjY2NjY4IiBjcDF4PSIzOS43MDgzMzMzMzMzMzMzMyIgY3AxeT0iMTcuNjY2NjY2NjY2NjY2NjY4IiBjcDJ4PSIzOS43MDgzMzMzMzMzMzMzMyIgY3AyeT0iMTcuNjY2NjY2NjY2NjY2NjY4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzkuNjI1IiB5PSI2LjA4MzMzMzMzMzMzMzMzMiIgY3AxeD0iMzkuNjI1IiBjcDF5PSI2LjA4MzMzMzMzMzMzMzMzMiIgY3AyeD0iMzkuNjI0OTk5OTk5OTk5OTkiIGNwMnk9IjUuMTY2NjY2NjY2NjY2NjY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzcuNjY2NjY2NjY2NjY2NjY0IiB5PSI0LjI0OTk5OTk5OTk5OTk5OSIgY3AxeD0iMzguNzUiIGNwMXk9IjQuMjQ5OTk5OTk5OTk5OTk3IiBjcDJ4PSIzNy42NjY2NjY2NjY2NjY2NjQiIGNwMnk9IjQuMjQ5OTk5OTk5OTk5OTk5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS44MzMzMzMzMzMzMzMzMzIiIHk9IjQuMjkxNjY2NjY2NjY2NjY2IiBjcDF4PSI1LjgzMzMzMzMzMzMzMzMzMiIgY3AxeT0iNC4yOTE2NjY2NjY2NjY2NjYiIGNwMng9IjQuODMzMzMzMzMzMzMzMzMyIiBjcDJ5PSI0LjI5MTY2NjY2NjY2NjY2NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMzc0OTk5OTk5OTk5OTk4IiB5PSI2LjA4MzMzMzMzMzMzMzMzIiBjcDF4PSI0LjQxNjY2NjY2NjY2NjY2NSIgY3AxeT0iNS4xMjQ5OTk5OTk5OTk5OTY0IiBjcDJ4PSI0LjM3NDk5OTk5OTk5OTk5OCIgY3AyeT0iNi4wODMzMzMzMzMzMzMzMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMjkxNjY2NjY2NjY2NjY0IiB5PSIxNy43MDgzMzMzMzMzMzMzMzQiIGNwMXg9IjQuMjkxNjY2NjY2NjY2NjY0IiBjcDF5PSIxNy43MDgzMzMzMzMzMzMzMzQiIGNwMng9IjQuMjkxNjY2NjY2NjY2NjY0IiBjcDJ5PSIxNy43MDgzMzMzMzMzMzMzMzQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ4IiBncmVlbj0iMjUwIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDQ2ODE2NDciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYxOTg0MTMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM5MjE1NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yNDgzODcxIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjIyNCIgYmx1ZT0iMjM1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMjI2Mjc3MTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUzMzU4NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzcyNTQ5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNjAzMjI1OCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODQiIGdyZWVuPSIyMDUiIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDE3Mjg1OTQzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjA4MjY0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMyNTQ5MDE4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzY3NzQxOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIyMDMiIGJsdWU9IjIyMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NTUzNDEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzIxNTY4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk2Nzc0MTkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkzIiBncmVlbj0iMjE0IiBibHVlPSIyMzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iNS4xNDk4NDEzRS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40NjQwNDA0NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNjQ3MDU4NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjIwLjAiIGNwMXg9IjEuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSI2LjAiIGNwMXg9IjEuMCIgY3AxeT0iOS41NTU1NTU1NTU1NTU1NTQiIGNwMng9IjEuMCIgY3AyeT0iMi40NDQ0NDQ0NDQ0NDQ0NDY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIxLjAiIGNwMXg9IjIuNTU1NTU1NTU1NTU1NTU3IiBjcDF5PSIxLjAiIGNwMng9IjkuNDQ0NDQ0NDQ0NDQ0NDQzIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOC4wIiB5PSIxLjAiIGNwMXg9IjM0LjY2NjY2NjY2NjY2NjY2IiBjcDF5PSIxLjAiIGNwMng9IjQxLjMzMzMzMzMzMzMzMzM0IiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSI2LjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIuNzIyMjIyMjIyMjIyMjIzIiBjcDJ4PSI0My4wIiBjcDJ5PSI5LjI3Nzc3Nzc3Nzc3Nzc3NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjAiIHk9IjIwLjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIwLjAiIGNwMng9IjQzLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjQiIGJsdWU9IjI3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDYzMzIzNjgiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDQzMTM3MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDc4NDMxNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjUuMCIgY3AxeD0iMC4wIiBjcDF5PSI4LjAiIGNwMng9IjAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS4wIiB5PSIwLjAiIGNwMXg9IjIuMCIgY3AxeT0iMC4wIiBjcDJ4PSI4LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM5LjAiIHk9IjAuMCIgY3AxeD0iMzYuMCIgY3AxeT0iMC4wIiBjcDJ4PSI0Mi4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSI1LjAiIGNwMXg9IjQ0LjAiIGNwMXk9IjIuMCIgY3AyeD0iNDQuMCIgY3AyeT0iOC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iMjAuMCIgY3AxeD0iNDQuMCIgY3AxeT0iMjAuMCIgY3AyeD0iNDQuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIyMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA0MjQ3MTM4LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCtQcmVzc2VkK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNDQiIGhlaWdodD0iMjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI3IiBib3R0b209IjMiIGxlZnQ9IjkiIHJpZ2h0PSI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIwLjkxNjY2NjY2NjY2NjY2NCIgeT0iMTcuNzQ5OTk5OTk5OTk5OTk2IiBjcDF4PSIyMC45MTY2NjY2NjY2NjY2NjQiIGNwMXk9IjE3Ljc0OTk5OTk5OTk5OTk5NiIgY3AyeD0iMjAuOTE2NjY2NjY2NjY2NjY0IiBjcDJ5PSIxNy43NDk5OTk5OTk5OTk5OTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC45NTgzMzMzMzMzMzMzMzIiIHk9IjE5LjMzMzMzMzMzMzMzMzMzMiIgY3AxeD0iMjAuOTU4MzMzMzMzMzMzMzMyIiBjcDF5PSIxOS4zMzMzMzMzMzMzMzMzMzIiIGNwMng9IjIwLjk1ODMzMzMzMzMzMzMzMiIgY3AyeT0iMTkuMzMzMzMzMzMzMzMzMzMyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi42NjY2NjY2NjY2NjY2NjY1IiB5PSIxOS4zMzMzMzMzMzMzMzMzNCIgY3AxeD0iMi42NjY2NjY2NjY2NjY2NjY1IiBjcDF5PSIxOS4zMzMzMzMzMzMzMzMzNCIgY3AyeD0iMi42NjY2NjY2NjY2NjY2NjY1IiBjcDJ5PSIxOS4zMzMzMzMzMzMzMzMzNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuNjI0OTk5OTk5OTk5OTk4NyIgeT0iNi4xNjY2NjY2NjY2NjY2NjUiIGNwMXg9IjIuNjI0OTk5OTk5OTk5OTk4NyIgY3AxeT0iNi4xNjY2NjY2NjY2NjY2NjUiIGNwMng9IjIuNjI0OTk5OTk5OTk5OTk4NyIgY3AyeT0iMy45MTY2NjY2NjY2NjY2NjQ3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNS45MTY2NjY2NjY2NjY2NjQiIHk9IjIuNjY2NjY2NjY2NjY2NjY1IiBjcDF4PSIzLjk5OTk5OTk5OTk5OTk5OTYiIGNwMXk9IjIuNjY2NjY2NjY2NjY2NjY1IiBjcDJ4PSI1LjkxNjY2NjY2NjY2NjY2NCIgY3AyeT0iMi42NjY2NjY2NjY2NjY2NjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzNy43MDgzMzMzMzMzMzMzMyIgeT0iMi42NjY2NjY2NjY2NjY2NjY1IiBjcDF4PSIzNy43MDgzMzMzMzMzMzMzMyIgY3AxeT0iMi42NjY2NjY2NjY2NjY2NjY1IiBjcDJ4PSIzOS44MzMzMzMzMzMzMzMzMTQiIGNwMnk9IjIuNjY2NjY2NjY2NjY2NjY2NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQxLjQxNjY2NjY2NjY2NjY2NCIgeT0iNi4wNDE2NjY2NjY2NjY2NjciIGNwMXg9IjQxLjQxNjY2NjY2NjY2NjY2NCIgY3AxeT0iMy40NTgzMzMzMzMzMzMzMzUzIiBjcDJ4PSI0MS40MTY2NjY2NjY2NjY2NjQiIGNwMnk9IjYuMDQxNjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDEuMzc1MDAwMDAwMDAwMDEiIHk9IjE5LjI5MTY2NjY2NjY2NjY1NyIgY3AxeD0iNDEuMzc1MDAwMDAwMDAwMDEiIGNwMXk9IjE5LjI5MTY2NjY2NjY2NjY1NyIgY3AyeD0iNDEuMzc1MDAwMDAwMDAwMDEiIGNwMnk9IjE5LjI5MTY2NjY2NjY2NjY1NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIxLjAwMDAwMDAwMDAwMDAwNyIgeT0iMTkuMzMzMzMzMzMzMzMzMzMiIGNwMXg9IjIxLjAwMDAwMDAwMDAwMDAwNyIgY3AxeT0iMTkuMzMzMzMzMzMzMzMzMzMiIGNwMng9IjIxLjAwMDAwMDAwMDAwMDAwNyIgY3AyeT0iMTkuMzMzMzMzMzMzMzMzMzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyMC45MTY2NjY2NjY2NjY2NjgiIHk9IjE3LjcwODMzMzMzMzMzMzMzMiIgY3AxeD0iMjAuOTE2NjY2NjY2NjY2NjY4IiBjcDF5PSIxNy43MDgzMzMzMzMzMzMzMzIiIGNwMng9IjIwLjkxNjY2NjY2NjY2NjY2OCIgY3AyeT0iMTcuNzA4MzMzMzMzMzMzMzMyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzkuNzA4MzMzMzMzMzMzMzMiIHk9IjE3LjY2NjY2NjY2NjY2NjY2OCIgY3AxeD0iMzkuNzA4MzMzMzMzMzMzMzMiIGNwMXk9IjE3LjY2NjY2NjY2NjY2NjY2OCIgY3AyeD0iMzkuNzA4MzMzMzMzMzMzMzMiIGNwMnk9IjE3LjY2NjY2NjY2NjY2NjY2OCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM5LjYyNSIgeT0iNi4wODMzMzMzMzMzMzMzMzIiIGNwMXg9IjM5LjYyNSIgY3AxeT0iNi4wODMzMzMzMzMzMzMzMzIiIGNwMng9IjM5LjYyNDk5OTk5OTk5OTk5IiBjcDJ5PSI1LjE2NjY2NjY2NjY2NjY2NCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjM3LjY2NjY2NjY2NjY2NjY2NCIgeT0iNC4yNDk5OTk5OTk5OTk5OTkiIGNwMXg9IjM4Ljc1IiBjcDF5PSI0LjI0OTk5OTk5OTk5OTk5NyIgY3AyeD0iMzcuNjY2NjY2NjY2NjY2NjY0IiBjcDJ5PSI0LjI0OTk5OTk5OTk5OTk5OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjUuODMzMzMzMzMzMzMzMzMyIiB5PSI0LjI5MTY2NjY2NjY2NjY2NiIgY3AxeD0iNS44MzMzMzMzMzMzMzMzMzIiIGNwMXk9IjQuMjkxNjY2NjY2NjY2NjY2IiBjcDJ4PSI0LjgzMzMzMzMzMzMzMzMzMiIgY3AyeT0iNC4yOTE2NjY2NjY2NjY2NjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjM3NDk5OTk5OTk5OTk5OCIgeT0iNi4wODMzMzMzMzMzMzMzMyIgY3AxeD0iNC40MTY2NjY2NjY2NjY2NjUiIGNwMXk9IjUuMTI0OTk5OTk5OTk5OTk2NCIgY3AyeD0iNC4zNzQ5OTk5OTk5OTk5OTgiIGNwMnk9IjYuMDgzMzMzMzMzMzMzMzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjI5MTY2NjY2NjY2NjY2NCIgeT0iMTcuNzA4MzMzMzMzMzMzMzM0IiBjcDF4PSI0LjI5MTY2NjY2NjY2NjY2NCIgY3AxeT0iMTcuNzA4MzMzMzMzMzMzMzM0IiBjcDJ4PSI0LjI5MTY2NjY2NjY2NjY2NCIgY3AyeT0iMTcuNzA4MzMzMzMzMzMzMzM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MyIgZ3JlZW49IjE2OSIgYmx1ZT0iMTkyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii00LjIwMzMxOTVFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4MDUwNTk1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwMzkyMTU2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjQ4Mzg3MSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4NCIgZ3JlZW49IjEyMyIgYmx1ZT0iMTU5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxMzQ4MzE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTY0MDE2MTkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDc0NTA5OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYwMzIyNTgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTQiIGdyZWVuPSIxMDEiIGJsdWU9IjE0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC4wMDEwMDAxNjU5IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTU5OTU5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMDc4NDMxMzciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43Njc3NDE5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjUxIiBncmVlbj0iOTgiIGJsdWU9IjE0MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTQxOTM1NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI2MCIgZ3JlZW49IjEwNiIgYmx1ZT0iMTQ5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxODcyNzE4MyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDM4Mzk4ODYyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzNTI5NDExNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjIwLjAiIGNwMXg9IjEuMCIgY3AxeT0iMjAuMCIgY3AyeD0iMS4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSI2LjAiIGNwMXg9IjEuMCIgY3AxeT0iOS41NTU1NTU1NTU1NTU1NTQiIGNwMng9IjEuMCIgY3AyeT0iMi40NDQ0NDQ0NDQ0NDQ0NDY0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIxLjAiIGNwMXg9IjIuNTU1NTU1NTU1NTU1NTU3IiBjcDF5PSIxLjAiIGNwMng9IjkuNDQ0NDQ0NDQ0NDQ0NDQzIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzOC4wIiB5PSIxLjAiIGNwMXg9IjM0LjY2NjY2NjY2NjY2NjY2IiBjcDF5PSIxLjAiIGNwMng9IjQxLjMzMzMzMzMzMzMzMzM0IiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0My4wIiB5PSI2LjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIuNzIyMjIyMjIyMjIyMjIzIiBjcDJ4PSI0My4wIiBjcDJ5PSI5LjI3Nzc3Nzc3Nzc3Nzc3NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjAiIHk9IjIwLjAiIGNwMXg9IjQzLjAiIGNwMXk9IjIwLjAiIGNwMng9IjQzLjAiIGNwMnk9IjIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjQiIGJsdWU9IjI3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDYzMzIzNjgiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDQzMTM3MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuNTc4NjUxNjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjU0OTAxOTYzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNS4wIiBjcDF4PSIwLjAiIGNwMXk9IjguMCIgY3AyeD0iMC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI1LjAiIHk9IjAuMCIgY3AxeD0iMi4wIiBjcDF5PSIwLjAiIGNwMng9IjguMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMzkuMCIgeT0iMC4wIiBjcDF4PSIzNi4wIiBjcDF5PSIwLjAiIGNwMng9IjQyLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjUuMCIgY3AxeD0iNDQuMCIgY3AxeT0iMi4wIiBjcDJ4PSI0NC4wIiBjcDJ5PSI4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSIyMC4wIiBjcDF4PSI0NC4wIiBjcDF5PSIyMC4wIiBjcDJ4PSI0NC4wIiBjcDJ5PSIyMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIyMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MDQyNWJiYTYucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvcmVnaW9uPgorICAgICAgICAgICAgPHJlZ2lvbiBuYW1lPSJUYWJiZWRQYW5lVGFiQXJlYSIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjMiIGJvdHRvbT0iNCIgbGVmdD0iMTAiIHJpZ2h0PSIxMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI1IiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSI2IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSI1LjAiIHkxPSIxOS4wIiB5Mj0iMjQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA4Mzg3MDk3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIxOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ3ODQzMTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMDk2Nzc0MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODEiIGdyZWVuPSIyMDIiIGJsdWU9IjIyMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NDcxODgzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMxNzY0NzA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzY0NTE2MSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIyMTMiIGJsdWU9IjIzMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MzMwMDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzYwNzg0MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc4NzA5NjgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDc4NDMxNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIwLjAiIHkxPSIwLjAiIHkyPSIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjAwIiBibHVlPSIwIiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQwNDA5MWMyMi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjUiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjYiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjUuMCIgeTE9IjE5LjAiIHkyPSIyNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDgzODcwOTciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgwIiBncmVlbj0iMTgyIiBibHVlPSIxOTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNTQ2ODE3MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTgzMDgyNzQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMDk2Nzc0MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODEiIGdyZWVuPSIyMDIiIGJsdWU9IjIyMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1NDcxODgzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMxNzY0NzA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzY0NTE2MSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIyMTMiIGJsdWU9IjIzMiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2MzMwMDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzYwNzg0MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc4NzA5NjgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgwIiBncmVlbj0iMTgyIiBibHVlPSIxOTAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wNTQ2ODE3MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTgzMDgyNzQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA0MDkxYzIyLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK01vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNSIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iNiIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iNS4wIiB5MT0iMTkuMCIgeTI9IjI0LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wODM4NzA5NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItMC41Nzg2NTE2NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNTQ5MDE5NjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMDk2Nzc0MiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDAiIGdyZWVuPSIyMjEiIGJsdWU9IjI0MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSI1LjE0OTg0MTNFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ2OTA0NzYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzkyMTU2ODQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43NjQ1MTYxIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMSIgZ3JlZW49IjIzMiIgYmx1ZT0iMjUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjUuMTQ5ODQxM0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDc2MzUxNzQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc4NzA5NjgiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjE4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDg4MDE1MDIiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMzY0Mjg1NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuNDc4NDMxNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MDQxOGMzYmUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrUHJlc3NlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNSIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iNiIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iNS4wIiB5MT0iMTkuMCIgeTI9IjI0LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wODM4NzA5NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIwIiBncmVlbj0iMCIgYmx1ZT0iMTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wODgwMTUwMiIgc2F0dXJhdGlvbk9mZnNldD0iMC4zNjQyODU3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40Nzg0MzE0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTA5Njc3NDIiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNjQiIGdyZWVuPSIxMTEiIGJsdWU9IjE1MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1NDAxNDkyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzY0NTE2MSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI3NSIgZ3JlZW49IjEyMiIgYmx1ZT0iMTY0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDkzMDMxMzUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDk0MTE3NjQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43ODcwOTY4IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjAiIGdyZWVuPSIwIiBibHVlPSIxOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjA4ODAxNTAyIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjM2NDI4NTciIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjQ3ODQzMTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDA0MTlmOWZhLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvcmVnaW9uPgorICAgICAgICAgICAgPHJlZ2lvbiBuYW1lPSJUYWJiZWRQYW5lQ29udGVudCIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iMTUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3JlZ2lvbj4KKyAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJ0cnVlIiB0eXBlPSJqYXZheC5zd2luZy5KVGFibGUiIG5hbWU9IlRhYmxlIiB1aT0iVGFibGVVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNSIgZ3JlZW49IjM1IiBibHVlPSIzNiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgPGluaGVyaXQtYmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC1iYWNrZ3JvdW5kPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJzaG93R3JpZCIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJpbnRlcmNlbGxTcGFjaW5nIiB0eXBlPSJESU1FTlNJT04iPgorICAgICAgICAgICAgICAgICAgPGRpbWVuc2lvbiB3aWR0aD0iMCIgaGVpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8L3VpUHJvcGVydHk+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJhbHRlcm5hdGVSb3dDb2xvciIgdHlwZT0iQ09MT1IiPgorICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQyIiBncmVlbj0iMjQyIiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDUwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIiB1aVJlc291cmNlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icmVuZGVyZXJVc2VUYWJsZUNvbG9ycyIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InJlbmRlcmVyVXNlVUlCb3JkZXIiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJjZWxsTm9Gb2N1c0JvcmRlciIgdHlwZT0iQk9SREVSIj4KKyAgICAgICAgICAgICAgICAgICA8Ym9yZGVyIHR5cGU9ImVtcHR5IiB0b3A9IjIiIGxlZnQ9IjUiIGJvdHRvbT0iMiIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgIDwvdWlQcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImZvY3VzQ2VsbEhpZ2hsaWdodEJvcmRlciIgdHlwZT0iQk9SREVSIj4KKyAgICAgICAgICAgICAgICAgICA8Ym9yZGVyIHR5cGU9InBhaW50ZXIiIHBhaW50ZXI9IlRyZWU6VHJlZUNlbGxbRW5hYmxlZCtGb2N1c2VkXS5iYWNrZ3JvdW5kUGFpbnRlciIgdG9wPSIyIiBsZWZ0PSI1IiBib3R0b209IjIiIHJpZ2h0PSI1IiAvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iZHJvcExpbmVDb2xvciIgdHlwZT0iQ09MT1IiPgorICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQyIiBncmVlbj0iMjQyIiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iZHJvcExpbmVTaG9ydENvbG9yIiB0eXBlPSJDT0xPUiI+CisgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDIiIGdyZWVuPSIyNDIiIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzT3JhbmdlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiIHVpUmVzb3VyY2U9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTciIGdyZWVuPSIxMDUiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzU2VsZWN0aW9uQmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIgdWlSZXNvdXJjZT0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAgICA8L3RleHRCYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0QmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0QmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCtTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3Rpb25CYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIiB1aVJlc291cmNlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgICAgIDwvdGV4dEJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRCYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRCYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnM+CisgICAgICAgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJ0cnVlIiBjb21wb25lbnROYW1lPSJUYWJsZS5jZWxsUmVuZGVyZXIiIHR5cGU9ImphdmF4LnN3aW5nLkpMYWJlbCIgbmFtZT0iTGFiZWwiIHVpPSJMYWJlbFVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiIHVpUmVzb3VyY2U9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAgICA8L2JhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC1iYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LWJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICAgICA8L3JlZ2lvbnM+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgdHlwZT0iamF2YXguc3dpbmcudGFibGUuSlRhYmxlSGVhZGVyIiBuYW1lPSJUYWJsZUhlYWRlciIgdWk9IlRhYmxlSGVhZGVyVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJyaWdodEFsaWduU29ydEFycm93IiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPC91aXByb3BlcnRpZXM+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucz4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iQXNjZW5kaW5nU29ydEljb24iIHN1YnJlZ2lvbj0idHJ1ZSIga2V5PSJhc2NlbmRpbmdTb3J0SWNvbiIgYmFzaWNLZXk9IlRhYmxlLmFzY2VuZGluZ1NvcnRJY29uIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjciIGhlaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD41PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMDUiIGdyZWVuPSIxNDIiIGJsdWU9IjE4MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNTc5Mjc5NjYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIxOTA0NzY0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Njg2Mjc0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1MyIgZ3JlZW49IjEwNCIgYmx1ZT0iMTU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAzODU2NTk5MyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMjAxMjk4NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNTQ5MDE5NTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSI3LjAiIGNwMXg9IjAuMCIgY3AxeT0iNy4wIiBjcDJ4PSIwLjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNTM1MDg3NzE5Mjk4MjQ2NiIgeT0iLTAuMDA4NzcxOTI5ODI0NTYxNDAzIiBjcDF4PSIzLjUzNTA4NzcxOTI5ODI0NjYiIGNwMXk9Ii0wLjAwODc3MTkyOTgyNDU2MTQwMyIgY3AyeD0iMy41MzUwODc3MTkyOTgyNDY2IiBjcDJ5PSItMC4wMDg3NzE5Mjk4MjQ1NjE0MDMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjcuMCIgY3AxeD0iNy4wIiBjcDF5PSI3LjAiIGNwMng9IjcuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQyM2E2YzUyZi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9IkRlc2NlbmRpbmdTb3J0SWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9ImRlc2NlbmRpbmdTb3J0SWNvbiIgYmFzaWNLZXk9IlRhYmxlLmRlc2NlbmRpbmdTb3J0SWNvbiI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3IiBoZWlnaHQ9IjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NTwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTA1IiBncmVlbj0iMTQyIiBibHVlPSIxODAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDU3OTI3OTY2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yMTkwNDc2NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNTY4NjI3NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTMiIGdyZWVuPSIxMDQiIGJsdWU9IjE1NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMzg1NjU5OTMiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDIwMTI5ODYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDU0OTAxOTU4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjAuMCIgY3AxeD0iNy4wIiBjcDF5PSIwLjAiIGNwMng9IjcuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy41MTc1NDM4NTk2NDkxMjI0IiB5PSI3LjAiIGNwMXg9IjMuNTE3NTQzODU5NjQ5MTIyNCIgY3AxeT0iNy4wIiBjcDJ4PSIzLjUxNzU0Mzg1OTY0OTEyMjQiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MjNhYzM2MmEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgY29tcG9uZW50TmFtZT0iVGFibGVIZWFkZXIucmVuZGVyZXIiIHR5cGU9ImphdmF4LnN3aW5nLkpMYWJlbCIgbmFtZT0iTGFiZWwiIHVpPSJMYWJlbFVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRW5hYmxlZCIvPgorICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9Ik1vdXNlT3ZlciIvPgorICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlByZXNzZWQiLz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJEaXNhYmxlZCIvPgorICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkZvY3VzZWQiLz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJTZWxlY3RlZCIvPgorICAgICAgICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlNvcnRlZCI+CisgICAgICAgICAgICAgICAgICAgICA8Y29kZVNuaXBwZXQ+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIgPSAoU3RyaW5nKWMuZ2V0Q2xpZW50UHJvcGVydHkoIlRhYmxlLnNvcnRPcmRlciIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIHNvcnRPcmRlciAhPSBudWxsICYmICgiQVNDRU5ESU5HIi5lcXVhbHMoc29ydE9yZGVyKSB8fCAiREVTQ0VORElORyIuZXF1YWxzKHNvcnRPcmRlcikpOyBdXT48L2NvZGVTbmlwcGV0PgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZVR5cGU+CisgICAgICAgICAgICAgICA8L3N0YXRlVHlwZXM+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIyIiBib3R0b209IjQiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMjEuMCIgeTE9IjAuMCIgeTI9IjE5LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4yNDc0MjI2OCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNjU1ODA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0MzEzNzI0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjg4ODg4OSIgbWlkcG9pbnQ9IjAuNjI3MjcyNyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjUiIGdyZWVuPSIyMjciIGJsdWU9IjIzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODQ1NTIyOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNjA3ODQzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzAzNzAzNyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzAxNjc1NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQyIiBncmVlbj0iMjQ1IiBibHVlPSIyNTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc0NjY5NzQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM5MjE1NjciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMjEuMCIgeDI9IjIyLjAiIHkxPSIwLjAiIHkyPSIxOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMzMwNDM0NzciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAxIiBncmVlbj0iMjAzIiBibHVlPSIyMDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMTExMTE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODYyNTQ0NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNjI3NDUwOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MzcwMzcwNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzQiIGdyZWVuPSIxMzkiIGJsdWU9IjE0NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDEzODg4ODM2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjgzMzQ1MzYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE3MjU0OTAxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzUxODUxODYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM2IiBncmVlbj0iMTQxIiBibHVlPSIxNDgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI5NDQ1MjM4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNjQ3MDU4NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgyIiBncmVlbj0iMTg3IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyMDIwMjA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTM1MzE0OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjIyLjAiIHkxPSIxOS4wIiB5Mj0iMjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTYiIGdyZWVuPSIxMjEiIGJsdWU9IjEyOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iNS44MjMwMDFFLTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMjEuMCIgeTE9IjAuMCIgeTI9IjE5LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4yNDc0MjI2OCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTEiIGdyZWVuPSIyNTEiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNjU1ODA2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0MzEzNzI0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjg4ODg4OSIgbWlkcG9pbnQ9IjAuNjI3MjcyNyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjUiIGdyZWVuPSIyMjciIGJsdWU9IjIzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODQ1NTIyOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNjA3ODQzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzAzNzAzNyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTQiIGdyZWVuPSIyMTciIGJsdWU9IjIyMyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzAxNjc1NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQyIiBncmVlbj0iMjQ1IiBibHVlPSIyNTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc0NjY5NzQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM5MjE1NjciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMjEuMCIgeDI9IjIyLjAiIHkxPSIwLjAiIHkyPSIxOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMzMwNDM0NzciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAxIiBncmVlbj0iMjAzIiBibHVlPSIyMDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMTExMTE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODYyNTQ0NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNjI3NDUwOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MzcwMzcwNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzQiIGdyZWVuPSIxMzkiIGJsdWU9IjE0NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDEzODg4ODM2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjgzMzQ1MzYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE3MjU0OTAxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzUxODUxODYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM2IiBncmVlbj0iMTQxIiBibHVlPSIxNDgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI5NDQ1MjM4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNjQ3MDU4NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgyIiBncmVlbj0iMTg3IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyMDIwMjA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTM1MzE0OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjIyLjAiIHkxPSIxOS4wIiB5Mj0iMjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTYiIGdyZWVuPSIxMjEiIGJsdWU9IjEyOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iNS44MjMwMDFFLTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MjM1OTU2YzUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjIiIGhlaWdodD0iMjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMCIgeT0iMCIgY3AxeD0iMCIgY3AxeT0iMCIgY3AyeD0iMCIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMCIgeT0iMjAiIGNwMXg9IjAiIGNwMXk9IjIwIiBjcDJ4PSIwIiBjcDJ5PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjIiIHk9IjIwIiBjcDF4PSIyMiIgY3AxeT0iMjAiIGNwMng9IjIyIiBjcDJ5PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjIiIHk9IjAiIGNwMXg9IjIyIiBjcDF5PSIwIiBjcDJ4PSIyMiIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIwIiBjcDF4PSIxLjIiIGNwMXk9IjAiIGNwMng9IjEuMiIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIxLjIiIGNwMXg9IjEuMiIgY3AxeT0iMS4yIiBjcDJ4PSIxLjIiIGNwMnk9IjEuMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuOCIgeT0iMS4yIiBjcDF4PSIyMC44IiBjcDF5PSIxLjIiIGNwMng9IjIwLjgiIGNwMnk9IjEuMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuOCIgeT0iMTguOCIgY3AxeD0iMjAuOCIgY3AxeT0iMTguOCIgY3AyeD0iMjAuOCIgY3AyeT0iMTguOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIxOC44IiBjcDF4PSIxLjIiIGNwMXk9IjE4LjgiIGNwMng9IjEuMiIgY3AyeT0iMTguOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIwIiBjcDF4PSIxLjIiIGNwMXk9IjAiIGNwMng9IjEuMiIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjIxLjAiIHkxPSIwLjAiIHkyPSIxOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMjQ3NDIyNjgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUxIiBncmVlbj0iMjUxIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1NTgwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDMxMzcyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI4ODg4ODkiIG1pZHBvaW50PSIwLjYyNzI3MjciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI1IiBncmVlbj0iMjI3IiBibHVlPSIyMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg0NTUyMjkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTYwNzg0MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjcwMzcwMzciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0MiIgZ3JlZW49IjI0NSIgYmx1ZT0iMjUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NDY2OTc0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIzOTIxNTY3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIxLjAiIHgyPSIyMi4wIiB5MT0iMC4wIiB5Mj0iMTkuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjMzMDQzNDc3Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg2MjU0NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDYyNzQ1MDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDM3MDM3MDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM0IiBncmVlbj0iMTM5IiBibHVlPSIxNDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI4MzM0NTM2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNzI1NDkwMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc1MTg1MTg2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNiIgZ3JlZW49IjE0MSIgYmx1ZT0iMTQ4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTM4ODg4MzYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyOTQ0NTIzOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTY0NzA1ODciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjE4NyIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjAyMDIwNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDUzNTMxNDk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIyMi4wIiB5MT0iMTkuMCIgeTI9IjIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE2IiBncmVlbj0iMTIxIiBibHVlPSIxMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSItMC4wMTM4ODg4MzYiIHNhdHVyYXRpb25PZmZzZXQ9IjUuODIzMDAxRS00IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMjEuMCIgeTE9IjAuMCIgeTI9IjE5LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4yNDc0MjI2OCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTMiIGdyZWVuPSIyNTMiIGJsdWU9IjI1NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNjU4OTMxIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1MDk4MDM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjg4ODg4OSIgbWlkcG9pbnQ9IjAuNjI3MjcyNyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDAiIGdyZWVuPSIyNDIiIGJsdWU9IjI0NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODYxMzYwNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjcwMzcwMzciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC44ODAxMzY5NyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMjEuMCIgeDI9IjIyLjAiIHkxPSIwLjAiIHkyPSIxOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMzMwNDM0NzciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAxIiBncmVlbj0iMjAzIiBibHVlPSIyMDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMTExMTE0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wODYyNTQ0NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNjI3NDUwOTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC40MzcwMzcwNSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzQiIGdyZWVuPSIxMzkiIGJsdWU9IjE0NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDEzODg4ODM2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjgzMzQ1MzYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE3MjU0OTAxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNzUxODUxODYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM2IiBncmVlbj0iMTQxIiBibHVlPSIxNDgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI5NDQ1MjM4IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNjQ3MDU4NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTgyIiBncmVlbj0iMTg3IiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyMDIwMjA0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTM1MzE0OTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjIyLjAiIHkxPSIxOS4wIiB5Mj0iMjAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTYiIGdyZWVuPSIxMjEiIGJsdWU9IjEyOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iNS44MjMwMDFFLTQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MjM1YjkyOWIucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjIyIiBoZWlnaHQ9IjIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIyMS4wIiB5MT0iMC4wIiB5Mj0iMTkuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjI0NzQyMjY4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwNSIgZ3JlZW49IjIwOSIgYmx1ZT0iMjE2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDUwNTA1NCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDU5NjAwMzkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTAxOTYwNzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4yODg4ODg5IiBtaWRwb2ludD0iMC42MjcyNzI3Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3NiIgZ3JlZW49IjE4MiIgYmx1ZT0iMTk0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAxNzc0MjgxMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTU2ODYyNzQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43MDM3MDM3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDE4MzA2NjczIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAyIiBncmVlbj0iMjA4IiBibHVlPSIyMjIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA1NTU1NTEwNSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwNDM2MjI3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEyNTQ5MDE5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIxLjAiIHgyPSIyMi4wIiB5MT0iMC4wIiB5Mj0iMTkuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjMzMDQzNDc3Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg2MjU0NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDYyNzQ1MDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDM3MDM3MDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM0IiBncmVlbj0iMTM5IiBibHVlPSIxNDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI4MzM0NTM2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNzI1NDkwMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc1MTg1MTg2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNiIgZ3JlZW49IjE0MSIgYmx1ZT0iMTQ4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTM4ODg4MzYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyOTQ0NTIzOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTY0NzA1ODciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjE4NyIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjAyMDIwNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDUzNTMxNDk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIyMi4wIiB5MT0iMTkuMCIgeTI9IjIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE2IiBncmVlbj0iMTIxIiBibHVlPSIxMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSItMC4wMTM4ODg4MzYiIHNhdHVyYXRpb25PZmZzZXQ9IjUuODIzMDAxRS00IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDIzNjY4ZWUwLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK1NvcnRlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjIiIGhlaWdodD0iMjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjIxLjAiIHkxPSIwLjAiIHkyPSIxOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMjQ3NDIyNjgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ4IiBncmVlbj0iMjUwIiBibHVlPSIyNTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDIzMDk2MDg1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MjM3NjIxMyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzI1MzQyNDgiIG1pZHBvaW50PSIwLjYyNzI3MjciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkzIiBncmVlbj0iMjA4IiBibHVlPSIyMjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDAxMjcwNzExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTA5MDE3NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzE3NjQ3MDQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43MDM3MDM3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3OCIgZ3JlZW49IjE5NyIgYmx1ZT0iMjEzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMjQ2MTE5NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDcxMzk1MDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjg2Mjc0NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk3NjAyNzM3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIyMCIgYmx1ZT0iMjM1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwNTEyMjI0NDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ5MTAzMzQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM3MjU0OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyMS4wIiB4Mj0iMjIuMCIgeTE9IjAuMCIgeTI9IjE5LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4zMzA0MzQ3NyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDEiIGdyZWVuPSIyMDMiIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4NjI1NDQ3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2Mjc0NTA5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQzNzAzNzA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNCIgZ3JlZW49IjEzOSIgYmx1ZT0iMTQ2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTM4ODg4MzYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyODMzNDUzNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTcyNTQ5MDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43NTE4NTE4NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzYiIGdyZWVuPSIxNDEiIGJsdWU9IjE0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDEzODg4ODM2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjk0NDUyMzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE2NDcwNTg3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIxODciIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDIwMjAyMDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzUzMTQ5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMjIuMCIgeTE9IjE5LjAiIHkyPSIyMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNiIgZ3JlZW49IjEyMSIgYmx1ZT0iMTI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCb3JkZXIiIGh1ZU9mZnNldD0iLTAuMDEzODg4ODM2IiBzYXR1cmF0aW9uT2Zmc2V0PSI1LjgyMzAwMUUtNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTQyMzY3N2RmZC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtGb2N1c2VkK1NvcnRlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjIiIGhlaWdodD0iMjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMCIgeT0iMCIgY3AxeD0iMCIgY3AxeT0iMCIgY3AyeD0iMCIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMCIgeT0iMjAiIGNwMXg9IjAiIGNwMXk9IjIwIiBjcDJ4PSIwIiBjcDJ5PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjIiIHk9IjIwIiBjcDF4PSIyMiIgY3AxeT0iMjAiIGNwMng9IjIyIiBjcDJ5PSIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjIiIHk9IjAiIGNwMXg9IjIyIiBjcDF5PSIwIiBjcDJ4PSIyMiIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIwIiBjcDF4PSIxLjIiIGNwMXk9IjAiIGNwMng9IjEuMiIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIxLjIiIGNwMXg9IjEuMiIgY3AxeT0iMS4yIiBjcDJ4PSIxLjIiIGNwMnk9IjEuMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuOCIgeT0iMS4yIiBjcDF4PSIyMC44IiBjcDF5PSIxLjIiIGNwMng9IjIwLjgiIGNwMnk9IjEuMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMjAuOCIgeT0iMTguOCIgY3AxeD0iMjAuOCIgY3AxeT0iMTguOCIgY3AyeD0iMjAuOCIgY3AyeT0iMTguOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIxOC44IiBjcDF4PSIxLjIiIGNwMXk9IjE4LjgiIGNwMng9IjEuMiIgY3AyeT0iMTguOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIwIiBjcDF4PSIxLjIiIGNwMXk9IjAiIGNwMng9IjEuMiIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjIxLjAiIHkxPSIwLjAiIHkyPSIxOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMjQ3NDIyNjgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjQ4IiBncmVlbj0iMjUwIiBibHVlPSIyNTEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTAuMDIzMDk2MDg1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MjM3NjIxMyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjg4ODg4OSIgbWlkcG9pbnQ9IjAuNjI3MjcyNyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODkiIGdyZWVuPSIyMDUiIGJsdWU9IjIxOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSItOC43Mzg2MzdFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ5ODcyNzk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjMwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43MDM3MDM3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3OCIgZ3JlZW49IjE5NyIgYmx1ZT0iMjEzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9Ii0wLjAwMjQ2MTE5NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDcxMzk1MDUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjg2Mjc0NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAyIiBncmVlbj0iMjIwIiBibHVlPSIyMzYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iLTIuMjAyOTg3N0UtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDkxNjQ2NSIgYnJpZ2h0bmVzc09mZnNldD0iMC4zNzY0NzA1NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyMS4wIiB4Mj0iMjIuMCIgeTE9IjAuMCIgeTI9IjE5LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC4zMzA0MzQ3NyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDEiIGdyZWVuPSIyMDMiIGJsdWU9IjIwNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA4NjI1NDQ3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2Mjc0NTA5NCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjQzNzAzNzA1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNCIgZ3JlZW49IjEzOSIgYmx1ZT0iMTQ2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTM4ODg4MzYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyODMzNDUzNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTcyNTQ5MDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43NTE4NTE4NiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMzYiIGdyZWVuPSIxNDEiIGJsdWU9IjE0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDEzODg4ODM2IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMjk0NDUyMzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE2NDcwNTg3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODIiIGdyZWVuPSIxODciIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDIwMjAyMDQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzUzMTQ5OCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMjIuMCIgeTE9IjE5LjAiIHkyPSIyMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNiIgZ3JlZW49IjEyMSIgYmx1ZT0iMTI4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCb3JkZXIiIGh1ZU9mZnNldD0iLTAuMDEzODg4ODM2IiBzYXR1cmF0aW9uT2Zmc2V0PSI1LjgyMzAwMUUtNCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5uZXJTaGFkb3cgYmxlbmRpbmdNb2RlPSJOT1JNQUwiIG9wYWNpdHk9IjAuNzUiIGFuZ2xlPSIxMzUiIGRpc3RhbmNlPSIwIiBzcHJlYWQ9IjUzIiBzaXplPSIzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQ5IiBncmVlbj0iMTUwIiBibHVlPSIyMzkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbm5lclNoYWRvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWZmZWN0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTE0MjM2OGYyMTIucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkK1NvcnRlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMjIiIGhlaWdodD0iMjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjIxLjAiIHkxPSIwLjAiIHkyPSIxOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuMjQ3NDIyNjgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUxIiBncmVlbj0iMjUxIiBibHVlPSIyNTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1NTgwNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNDMxMzcyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjI4ODg4ODkiIG1pZHBvaW50PSIwLjYyNzI3MjciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjI1IiBncmVlbj0iMjI3IiBibHVlPSIyMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg0NTUyMjkiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTYwNzg0MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjcwMzcwMzciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDcwMTY3NTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTI5NDExNzYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0MiIgZ3JlZW49IjI0NSIgYmx1ZT0iMjUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3NDY2OTc0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIzOTIxNTY3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIxLjAiIHgyPSIyMi4wIiB5MT0iMC4wIiB5Mj0iMTkuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjMzMDQzNDc3Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMSIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDg2MjU0NDciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDYyNzQ1MDk0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNDM3MDM3MDUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM0IiBncmVlbj0iMTM5IiBibHVlPSIxNDYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxMzg4ODgzNiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI4MzM0NTM2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xNzI1NDkwMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjc1MTg1MTg2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNiIgZ3JlZW49IjE0MSIgYmx1ZT0iMTQ4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTM4ODg4MzYiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyOTQ0NTIzOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTY0NzA1ODciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4MiIgZ3JlZW49IjE4NyIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjAyMDIwNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDUzNTMxNDk4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIyMi4wIiB5MT0iMTkuMCIgeTI9IjIwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE2IiBncmVlbj0iMTIxIiBibHVlPSIxMjgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSItMC4wMTM4ODg4MzYiIHNhdHVyYXRpb25PZmZzZXQ9IjUuODIzMDAxRS00IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgICAgPC9yZWdpb25zPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9InRydWUiIGNvbXBvbmVudE5hbWU9IlRhYmxlLmVkaXRvciIgdHlwZT0iamF2YXguc3dpbmcuSlRleHRGaWVsZCIgbmFtZT0iVGV4dEZpZWxkIiB1aT0iVGV4dEZpZWxkVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMyIgYm90dG9tPSIzIiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxpbmhlcml0LWJhY2tncm91bmQ+ZmFsc2U8L2luaGVyaXQtYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTAwLjAiIHkxPSIwLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwNDQiIHkyPSIwLjE2MjUwMDAwMDAwMDAwMDA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwIiB5PSIwIiBjcDF4PSIwIiBjcDF5PSIwIiBjcDJ4PSIwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMCIgeT0iMzAiIGNwMXg9IjAiIGNwMXk9IjMwIiBjcDJ4PSIwIiBjcDJ5PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwMCIgeT0iMzAiIGNwMXg9IjEwMCIgY3AxeT0iMzAiIGNwMng9IjEwMCIgY3AyeT0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDAiIHk9IjAiIGNwMXg9IjEwMCIgY3AxeT0iMCIgY3AyeD0iMTAwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIwIiBjcDF4PSIxLjIiIGNwMXk9IjAiIGNwMng9IjEuMiIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMiIgeT0iMS4yIiBjcDF4PSIxLjIiIGNwMXk9IjEuMiIgY3AyeD0iMS4yIiBjcDJ5PSIxLjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OC44IiB5PSIxLjIiIGNwMXg9Ijk4LjgiIGNwMXk9IjEuMiIgY3AyeD0iOTguOCIgY3AyeT0iMS4yIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTguOCIgeT0iMjguOCIgY3AxeD0iOTguOCIgY3AxeT0iMjguOCIgY3AyeD0iOTguOCIgY3AyeT0iMjguOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMiIgeT0iMjguOCIgY3AxeD0iMS4yIiBjcDF5PSIyOC44IiBjcDJ4PSIxLjIiIGNwMnk9IjI4LjgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjAiIGNwMXg9IjEuMiIgY3AxeT0iMCIgY3AyeD0iMS4yIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3RlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9InRydWUiIGNvbXBvbmVudE5hbWU9IlRyZWUuY2VsbEVkaXRvciIgdHlwZT0iamF2YXguc3dpbmcuSlRleHRGaWVsZCIgbmFtZT0iVGV4dEZpZWxkIiB1aT0iVGV4dEZpZWxkVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMiIgYm90dG9tPSIyIiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxpbmhlcml0LWJhY2tncm91bmQ+ZmFsc2U8L2luaGVyaXQtYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMTczNTg2MTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjExMzcyNTQ4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwIiB5PSIwIiBjcDF4PSIwIiBjcDF5PSIwIiBjcDJ4PSIwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMCIgeT0iMzAiIGNwMXg9IjAiIGNwMXk9IjMwIiBjcDJ4PSIwIiBjcDJ5PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwMCIgeT0iMzAiIGNwMXg9IjEwMCIgY3AxeT0iMzAiIGNwMng9IjEwMCIgY3AyeT0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDAiIHk9IjAiIGNwMXg9IjEwMCIgY3AxeT0iMCIgY3AyeD0iMTAwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMSIgeT0iMCIgY3AxeD0iMSIgY3AxeT0iMCIgY3AyeD0iMSIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEiIHk9IjEiIGNwMXg9IjEiIGNwMXk9IjEiIGNwMng9IjEiIGNwMnk9IjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OSIgeT0iMSIgY3AxeD0iOTkiIGNwMXk9IjEiIGNwMng9Ijk5IiBjcDJ5PSIxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTkiIHk9IjI5IiBjcDF4PSI5OSIgY3AxeT0iMjkiIGNwMng9Ijk5IiBjcDJ5PSIyOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEiIHk9IjI5IiBjcDF4PSIxIiBjcDF5PSIyOSIgY3AyeD0iMSIgY3AyeT0iMjkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxIiB5PSIwIiBjcDF4PSIxIiBjcDF5PSIwIiBjcDJ4PSIxIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwIiB5PSIwIiBjcDF4PSIwIiBjcDF5PSIwIiBjcDJ4PSIwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMCIgeT0iMzAiIGNwMXg9IjAiIGNwMXk9IjMwIiBjcDJ4PSIwIiBjcDJ5PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwMCIgeT0iMzAiIGNwMXg9IjEwMCIgY3AxeT0iMzAiIGNwMng9IjEwMCIgY3AyeT0iMzAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDAiIHk9IjAiIGNwMXg9IjEwMCIgY3AxeT0iMCIgY3AyeD0iMTAwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4yIiB5PSIwIiBjcDF4PSIxLjIiIGNwMXk9IjAiIGNwMng9IjEuMiIgY3AyeT0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMiIgeT0iMS4yIiBjcDF4PSIxLjIiIGNwMXk9IjEuMiIgY3AyeD0iMS4yIiBjcDJ5PSIxLjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OC44IiB5PSIxLjIiIGNwMXg9Ijk4LjgiIGNwMXk9IjEuMiIgY3AyeD0iOTguOCIgY3AyeT0iMS4yIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTguOCIgeT0iMjguOCIgY3AxeD0iOTguOCIgY3AxeT0iMjguOCIgY3AyeD0iOTguOCIgY3AyeT0iMjguOCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMiIgeT0iMjguOCIgY3AxeD0iMS4yIiBjcDF5PSIyOC44IiBjcDJ4PSIxLjIiIGNwMnk9IjI4LjgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjAiIGNwMXg9IjEuMiIgY3AxeT0iMCIgY3AyeD0iMS4yIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3RlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KVGV4dEZpZWxkIiBuYW1lPSJUZXh0RmllbGQiIHVpPSJUZXh0RmllbGRVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSI2IiBib3R0b209IjYiIGxlZnQ9IjYiIHJpZ2h0PSI2Ii8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgPC9iYWNrZ3JvdW5kPgorICAgICAgICAgICAgPGluaGVyaXQtYmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC1iYWNrZ3JvdW5kPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Rpc2FibGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMjIiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjIiIGdyZWVuPSIyMjUiIGJsdWU9IjIyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDE1ODcyOTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzk5NTg2MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNTI5NDExNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUiIHkyPSIwLjE1MDAwMDAwMDAwMDAwMDEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzk5MjdiMjZlLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMjIiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwNDQiIHkyPSIwLjE2MjUwMDAwMDAwMDAwMDA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5OTIwMWQ3OS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3RlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMjAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDA0NCIgeTI9IjAuMTYyNTAwMDAwMDAwMDAwMDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzk5MjAxZDc5LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSIzIiBsZWZ0PSIzIiByaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMTkuMCIgeDI9IjEyMC4wIiB5MT0iNS4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTAiIGdyZWVuPSIyMTIiIGJsdWU9IjIxNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3ODI2ODI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMjAuMCIgeTE9IjIyLjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjIxMiIgYmx1ZT0iMjE3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc4MjY4MjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA1ODgyMzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjMuMCIgeTE9IjUuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA4IiBncmVlbj0iMjEwIiBibHVlPSIyMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzc5NjgxOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTgwMzkyMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMiIgZ3JlZW49IjIxNCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc4NTYyODQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTEzNzI1NDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMiIgZ3JlZW49IjIyNSIgYmx1ZT0iMjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTU4NzI5NTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3OTk1ODYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Mjk0MTE3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTkiIGdyZWVuPSIyMDIiIGJsdWU9IjIwNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA2OTQ0NDE4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzE4Nzg5NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNjY2NjY2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEwIiBncmVlbj0iMjEyIiBibHVlPSIyMTciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzgyNjgyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOTkyN2IyNmUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIyLjAiIGNwMXg9IjIuMCIgY3AxeT0iMi4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMjIuMCIgY3AxeD0iMi4wIiBjcDF5PSIyMi4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjAuMCIgeT0iMjIuMCIgY3AxeD0iMTIwLjAiIGNwMXk9IjIyLjAiIGNwMng9IjEyMC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIwLjAiIHk9IjIuMCIgY3AxeD0iMTIwLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyMS40IiB5PSIyLjAiIGNwMXg9IjEyMS41IiBjcDF5PSIyLjAiIGNwMng9IjEyMS41IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjEuNCIgeT0iMjMuNCIgY3AxeD0iMTIxLjQiIGNwMXk9IjIzLjQiIGNwMng9IjEyMS40IiBjcDJ5PSIyMy40Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42IiB5PSIyMy40IiBjcDF4PSIwLjYiIGNwMXk9IjIzLjQiIGNwMng9IjAuNiIgY3AyeT0iMjMuNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuNiIgeT0iMC42IiBjcDF4PSIwLjYiIGNwMXk9IjAuNiIgY3AyeD0iMC42IiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjEuNCIgeT0iMC42IiBjcDF4PSIxMjEuNCIgY3AxeT0iMC42IiBjcDJ4PSIxMjEuNCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIxLjQiIHk9IjIuMCIgY3AxeD0iMTIxLjQiIGNwMXk9IjIuMCIgY3AyeD0iMTIxLjQiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjIxLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49IjE5MiIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MzQ0OTY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTE5LjAiIHgyPSIxMjAuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg0IiBncmVlbj0iMTg0IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUxMjA5MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIzLjAiIHkxPSI1LjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE4NCIgYmx1ZT0iMTg1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MTIwOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjY2NjY2NjciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDA0OTAxOTYxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MSIgZ3JlZW49IjE0MiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjU0MDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4NDMxMzcxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzYiIGdyZWVuPSIxNzYiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNDg3NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwNDQiIHkyPSIwLjE2MjUwMDAwMDAwMDAwMDA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5OTIwMWQ3OS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjIxLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49IjE5MiIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MzQ0OTY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTE5LjAiIHgyPSIxMjAuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg0IiBncmVlbj0iMTg0IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUxMjA5MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIzLjAiIHkxPSI1LjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE4NCIgYmx1ZT0iMTg1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MTIwOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjY2NjY2NjciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDA0OTAxOTYxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MSIgZ3JlZW49IjE0MiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjU0MDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4NDMxMzcxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzYiIGdyZWVuPSIxNzYiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNDg3NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5OTIwMWQ3OS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYm9yZGVyU3RhdGVzPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KRm9ybWF0dGVkVGV4dEZpZWxkIiBuYW1lPSJGb3JtYXR0ZWRUZXh0RmllbGQiIHVpPSJGb3JtYXR0ZWRUZXh0RmllbGRVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSI2IiBib3R0b209IjYiIGxlZnQ9IjYiIHJpZ2h0PSI2Ii8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMjAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIyIiBncmVlbj0iMjI1IiBibHVlPSIyMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxNTg3Mjk1NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc5OTU4NjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTUyOTQxMTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1IiB5Mj0iMC4xNTAwMDAwMDAwMDAwMDAxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5OTI3YjI2ZS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMjAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MDAwMDAwMDAwMDAwMDQ0IiB5Mj0iMC4xNjI1MDAwMDAwMDAwMDAwNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOTkyMDFkNzkucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzU2VsZWN0ZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwNDQiIHkyPSIwLjE2MjUwMDAwMDAwMDAwMDA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5OTIwMWQ3OS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMjIiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjMiIGxlZnQ9IjMiIHJpZ2h0PSIzIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjExOS4wIiB4Mj0iMTIwLjAiIHkxPSI1LjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjIxMiIgYmx1ZT0iMjE3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc4MjY4MjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA1ODgyMzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMjIuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEwIiBncmVlbj0iMjEyIiBibHVlPSIyMTciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzgyNjgyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMy4wIiB5MT0iNS4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDgiIGdyZWVuPSIyMTAiIGJsdWU9IjIxNSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3Nzk2ODE4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA5ODAzOTIxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjMuMCIgeTI9IjUuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEyIiBncmVlbj0iMjE0IiBibHVlPSIyMTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzg1NjI4NCIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMTM3MjU0OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIyIiBncmVlbj0iMjI1IiBibHVlPSIyMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxNTg3Mjk1NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc5OTU4NjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTUyOTQxMTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5OSIgZ3JlZW49IjIwMiIgYmx1ZT0iMjA3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MTg3ODk3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA2NjY2NjY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTAiIGdyZWVuPSIyMTIiIGJsdWU9IjIxNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3ODI2ODI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5OTI3YjI2ZS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkZvY3VzZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIyLjAiIGNwMXg9IjIuMCIgY3AxeT0iMi4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMjIuMCIgY3AxeD0iMi4wIiBjcDF5PSIyMi4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjAuMCIgeT0iMjIuMCIgY3AxeD0iMTIwLjAiIGNwMXk9IjIyLjAiIGNwMng9IjEyMC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIwLjAiIHk9IjIuMCIgY3AxeD0iMTIwLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyMS40IiB5PSIyLjAiIGNwMXg9IjEyMS41IiBjcDF5PSIyLjAiIGNwMng9IjEyMS41IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjEuNCIgeT0iMjMuNCIgY3AxeD0iMTIxLjQiIGNwMXk9IjIzLjQiIGNwMng9IjEyMS40IiBjcDJ5PSIyMy40Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42IiB5PSIyMy40IiBjcDF4PSIwLjYiIGNwMXk9IjIzLjQiIGNwMng9IjAuNiIgY3AyeT0iMjMuNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuNiIgeT0iMC42IiBjcDF4PSIwLjYiIGNwMXk9IjAuNiIgY3AyeD0iMC42IiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjEuNCIgeT0iMC42IiBjcDF4PSIxMjEuNCIgY3AxeT0iMC42IiBjcDJ4PSIxMjEuNCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIxLjQiIHk9IjIuMCIgY3AxeD0iMTIxLjQiIGNwMXk9IjIuMCIgY3AyeD0iMTIxLjQiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjIxLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49IjE5MiIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MzQ0OTY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTE5LjAiIHgyPSIxMjAuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg0IiBncmVlbj0iMTg0IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUxMjA5MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIzLjAiIHkxPSI1LjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE4NCIgYmx1ZT0iMTg1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MTIwOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjY2NjY2NjciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDA0OTAxOTYxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MSIgZ3JlZW49IjE0MiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjU0MDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4NDMxMzcxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzYiIGdyZWVuPSIxNzYiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNDg3NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwNDQiIHkyPSIwLjE2MjUwMDAwMDAwMDAwMDA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5OTIwMWQ3OS5wbmciPgorICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIyMS4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIxOTIiIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTM0NDk2NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjExOS4wIiB4Mj0iMTIwLjAiIHkxPSI1LjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE4NCIgYmx1ZT0iMTg1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MTIwOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMy4wIiB5MT0iNS4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODQiIGdyZWVuPSIxODQiIGJsdWU9IjE4NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTEyMDkxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjExOS4wIiB5MT0iMy4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDMiIGdyZWVuPSIyMDMiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC42NjY2NjY3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAwNDkwMTk2MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTk5OTk5OTkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDEiIGdyZWVuPSIxNDIiIGJsdWU9IjE0MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTY1NDAzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xODQzMTM3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc2IiBncmVlbj0iMTc2IiBibHVlPSIxNzciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDQ4NzY2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOTkyMDFkNzkucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JvcmRlclN0YXRlcz4KKyAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgdHlwZT0iamF2YXguc3dpbmcuSlBhc3N3b3JkRmllbGQiIG5hbWU9IlBhc3N3b3JkRmllbGQiIHVpPSJQYXNzd29yZEZpZWxkVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iNiIgYm90dG9tPSI2IiBsZWZ0PSI2IiByaWdodD0iNiIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMiIgZ3JlZW49IjIyNSIgYmx1ZT0iMjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTU4NzI5NTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3OTk1ODYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Mjk0MTE3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNSIgeTI9IjAuMTUwMDAwMDAwMDAwMDAwMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOTkyN2IyNmUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDA0NCIgeTI9IjAuMTYyNTAwMDAwMDAwMDAwMDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzk5MjAxZDc5LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMjIiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MDAwMDAwMDAwMDAwMDQ0IiB5Mj0iMC4xNjI1MDAwMDAwMDAwMDAwNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOTkyMDFkNzkucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Rpc2FibGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSIzIiBsZWZ0PSIzIiByaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMTkuMCIgeDI9IjEyMC4wIiB5MT0iNS4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTAiIGdyZWVuPSIyMTIiIGJsdWU9IjIxNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3ODI2ODI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMjAuMCIgeTE9IjIyLjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjIxMiIgYmx1ZT0iMjE3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc4MjY4MjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA1ODgyMzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjMuMCIgeTE9IjUuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA4IiBncmVlbj0iMjEwIiBibHVlPSIyMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzc5NjgxOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTgwMzkyMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMiIgZ3JlZW49IjIxNCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc4NTYyODQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTEzNzI1NDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMiIgZ3JlZW49IjIyNSIgYmx1ZT0iMjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTU4NzI5NTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3OTk1ODYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Mjk0MTE3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTkiIGdyZWVuPSIyMDIiIGJsdWU9IjIwNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA2OTQ0NDE4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzE4Nzg5NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNjY2NjY2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEwIiBncmVlbj0iMjEyIiBibHVlPSIyMTciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzgyNjgyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOTkyN2IyNmUucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJGb2N1c2VkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMjIiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMi4wIiBjcDF4PSIyLjAiIGNwMXk9IjIuMCIgY3AyeD0iMi4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjIyLjAiIGNwMXg9IjIuMCIgY3AxeT0iMjIuMCIgY3AyeD0iMi4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIwLjAiIHk9IjIyLjAiIGNwMXg9IjEyMC4wIiBjcDF5PSIyMi4wIiBjcDJ4PSIxMjAuMCIgY3AyeT0iMjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyMC4wIiB5PSIyLjAiIGNwMXg9IjEyMC4wIiBjcDF5PSIyLjAiIGNwMng9IjEyMC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjEuNCIgeT0iMi4wIiBjcDF4PSIxMjEuNSIgY3AxeT0iMi4wIiBjcDJ4PSIxMjEuNSIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIxLjQiIHk9IjIzLjQiIGNwMXg9IjEyMS40IiBjcDF5PSIyMy40IiBjcDJ4PSIxMjEuNCIgY3AyeT0iMjMuNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuNiIgeT0iMjMuNCIgY3AxeD0iMC42IiBjcDF5PSIyMy40IiBjcDJ4PSIwLjYiIGNwMnk9IjIzLjQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjYiIHk9IjAuNiIgY3AxeD0iMC42IiBjcDF5PSIwLjYiIGNwMng9IjAuNiIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIxLjQiIHk9IjAuNiIgY3AxeD0iMTIxLjQiIGNwMXk9IjAuNiIgY3AyeD0iMTIxLjQiIGNwMnk9IjAuNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyMS40IiB5PSIyLjAiIGNwMXg9IjEyMS40IiBjcDF5PSIyLjAiIGNwMng9IjEyMS40IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIyMS4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTIiIGdyZWVuPSIxOTIiIGJsdWU9IjE5MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTM0NDk2NiIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMTE3NjQ3MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjExOS4wIiB4Mj0iMTIwLjAiIHkxPSI1LjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE4NCIgYmx1ZT0iMTg1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MTIwOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMy4wIiB5MT0iNS4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODQiIGdyZWVuPSIxODQiIGJsdWU9IjE4NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTEyMDkxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjExOS4wIiB5MT0iMy4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDMiIGdyZWVuPSIyMDMiIGJsdWU9IjIwNCIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC42NjY2NjY3IiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAwNDkwMTk2MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTk5OTk5OTkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDEiIGdyZWVuPSIxNDIiIGJsdWU9IjE0MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDI3Nzc3NzkxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTY1NDAzIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xODQzMTM3MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTc2IiBncmVlbj0iMTc2IiBibHVlPSIxNzciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDQ4NzY2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNTA5ODAzOSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MDAwMDAwMDAwMDAwMDQ0IiB5Mj0iMC4xNjI1MDAwMDAwMDAwMDAwNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOTkyMDFkNzkucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMjIiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjExOS4wIiB5MT0iMjEuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkyIiBncmVlbj0iMTkyIiBibHVlPSIxOTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUzNDQ5NjYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDExNzY0NzA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMTkuMCIgeDI9IjEyMC4wIiB5MT0iNS4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODQiIGdyZWVuPSIxODQiIGJsdWU9IjE4NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNTEyMDkxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMTk2MDc4NDIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjMuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg0IiBncmVlbj0iMTg0IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUxMjA5MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjMuMCIgeTI9IjUuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAzIiBncmVlbj0iMjAzIiBibHVlPSIyMDQiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuNjY2NjY2NyIgc2F0dXJhdGlvbk9mZnNldD0iMC4wMDQ5MDE5NjEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE5OTk5OTk5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMjAuMCIgeTE9IjIuMCIgeTI9IjUuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQxIiBncmVlbj0iMTQyIiBibHVlPSIxNDMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAyNzc3Nzc5MSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDk2NTQwMyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTg0MzEzNzEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3NiIgZ3JlZW49IjE3NiIgYmx1ZT0iMTc3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA0ODc2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDUwOTgwMzkiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzk5MjAxZDc5LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9ib3JkZXJTdGF0ZXM+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpUZXh0QXJlYSIgbmFtZT0iVGV4dEFyZWEiIHVpPSJUZXh0QXJlYVVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkVuYWJsZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJNb3VzZU92ZXIiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJQcmVzc2VkIi8+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iU2VsZWN0ZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJEaXNhYmxlZCIvPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IkZvY3VzZWQiLz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJOb3RJblNjcm9sbFBhbmUiPgorICAgICAgICAgICAgICAgPGNvZGVTbmlwcGV0PjwhW0NEQVRBWworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShjLmdldFBhcmVudCgpIGluc3RhbmNlb2YgamF2YXguc3dpbmcuSlZpZXdwb3J0KTtdXT48L2NvZGVTbmlwcGV0PgorICAgICAgICAgICAgPC9zdGF0ZVR5cGU+CisgICAgICAgICA8L3N0YXRlVHlwZXM+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSI2IiBib3R0b209IjYiIGxlZnQ9IjYiIHJpZ2h0PSI2Ii8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTIyLjAiIHkxPSIwLjAiIHkyPSIyNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMiIgZ3JlZW49IjIyNSIgYmx1ZT0iMjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTU4NzI5NTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3OTk1ODYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Mjk0MTE3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNSIgeTI9IjAuMTUwMDAwMDAwMDAwMDAwMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMjIiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEyMi4wIiB5MT0iMC4wIiB5Mj0iMjQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgY29tcG9uZW50UHJvcGVydHlOYW1lPSJiYWNrZ3JvdW5kIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwNDQiIHkyPSIwLjE2MjUwMDAwMDAwMDAwMDA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkK05vdEluU2Nyb2xsUGFuZSI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMjIiIGhlaWdodD0iMjQiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjIiIGdyZWVuPSIyMjUiIGJsdWU9IjIyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDE1ODcyOTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzk5NTg2MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNTI5NDExNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUiIHkyPSIwLjE1MDAwMDAwMDAwMDAwMDEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtOb3RJblNjcm9sbFBhbmUiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDA0NCIgeTI9IjAuMTYyNTAwMDAwMDAwMDAwMDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMjAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTAwMDAwMDAwMDAwMDA0NCIgeTI9IjAuMTYyNTAwMDAwMDAwMDAwMDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkK05vdEluU2Nyb2xsUGFuZSI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSIzIiBsZWZ0PSIzIiByaWdodD0iMyIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxMTkuMCIgeDI9IjEyMC4wIiB5MT0iNS4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMTAiIGdyZWVuPSIyMTIiIGJsdWU9IjIxNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3ODI2ODI1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwNTg4MjM1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMjAuMCIgeTE9IjIyLjAiIHkyPSIyMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMCIgZ3JlZW49IjIxMiIgYmx1ZT0iMjE3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc4MjY4MjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA1ODgyMzUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjMuMCIgeTE9IjUuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA4IiBncmVlbj0iMjEwIiBibHVlPSIyMTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzc5NjgxOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wOTgwMzkyMSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIxMiIgZ3JlZW49IjIxNCIgYmx1ZT0iMjE5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc4NTYyODQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTEzNzI1NDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIyMiIgZ3JlZW49IjIyNSIgYmx1ZT0iMjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTU4NzI5NTUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3OTk1ODYzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE1Mjk0MTE3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjEyMC4wIiB5MT0iMi4wIiB5Mj0iNS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTkiIGdyZWVuPSIyMDIiIGJsdWU9IjIwNyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA2OTQ0NDE4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzE4Nzg5NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wNjY2NjY2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjEwIiBncmVlbj0iMjEyIiBibHVlPSIyMTciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDA3OTM2NTM3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzgyNjgyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDU4ODIzNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJGb2N1c2VkK05vdEluU2Nyb2xsUGFuZSI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPGNhY2hlTW9kZT5OSU5FX1NRVUFSRV9TQ0FMRTwvY2FjaGVNb2RlPgorICAgICAgICAgICAgICAgICAgPG1heEhvekNhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhIb3pDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPG1heFZlcnRDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4VmVydENhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIyLjAiIGNwMXg9IjIuMCIgY3AxeT0iMi4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMjIuMCIgY3AxeD0iMi4wIiBjcDF5PSIyMi4wIiBjcDJ4PSIyLjAiIGNwMnk9IjIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjAuMCIgeT0iMjIuMCIgY3AxeD0iMTIwLjAiIGNwMXk9IjIyLjAiIGNwMng9IjEyMC4wIiBjcDJ5PSIyMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIwLjAiIHk9IjIuMCIgY3AxeD0iMTIwLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTIwLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyMS40IiB5PSIyLjAiIGNwMXg9IjEyMS41IiBjcDF5PSIyLjAiIGNwMng9IjEyMS41IiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjEuNCIgeT0iMjMuNCIgY3AxeD0iMTIxLjQiIGNwMXk9IjIzLjQiIGNwMng9IjEyMS40IiBjcDJ5PSIyMy40Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42IiB5PSIyMy40IiBjcDF4PSIwLjYiIGNwMXk9IjIzLjQiIGNwMng9IjAuNiIgY3AyeT0iMjMuNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuNiIgeT0iMC42IiBjcDF4PSIwLjYiIGNwMXk9IjAuNiIgY3AyeD0iMC42IiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMjEuNCIgeT0iMC42IiBjcDF4PSIxMjEuNCIgY3AxeT0iMC42IiBjcDJ4PSIxMjEuNCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIxLjQiIHk9IjIuMCIgY3AxeD0iMTIxLjQiIGNwMXk9IjIuMCIgY3AyeD0iMTIxLjQiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjIxLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49IjE5MiIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MzQ0OTY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTE5LjAiIHgyPSIxMjAuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg0IiBncmVlbj0iMTg0IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUxMjA5MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIzLjAiIHkxPSI1LjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE4NCIgYmx1ZT0iMTg1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MTIwOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjY2NjY2NjciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDA0OTAxOTYxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MSIgZ3JlZW49IjE0MiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjU0MDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4NDMxMzcxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzYiIGdyZWVuPSIxNzYiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNDg3NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUwMDAwMDAwMDAwMDAwNDQiIHkyPSIwLjE2MjUwMDAwMDAwMDAwMDA2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQrTm90SW5TY3JvbGxQYW5lIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI0Ii8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMTkuMCIgeTE9IjIxLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE5MiIgZ3JlZW49IjE5MiIgYmx1ZT0iMTkzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MzQ0OTY2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMTE5LjAiIHgyPSIxMjAuMCIgeTE9IjUuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTg0IiBncmVlbj0iMTg0IiBibHVlPSIxODUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDUxMjA5MSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDE5NjA3ODQyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIzLjAiIHkxPSI1LjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4NCIgZ3JlZW49IjE4NCIgYmx1ZT0iMTg1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA1MTIwOTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAxOTYwNzg0MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTE5LjAiIHkxPSIzLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMyIgZ3JlZW49IjIwMyIgYmx1ZT0iMjA0IiBhbHBoYT0iMjU1IiBjb21wb25lbnRQcm9wZXJ0eU5hbWU9ImJhY2tncm91bmQiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjY2NjY2NjciIHNhdHVyYXRpb25PZmZzZXQ9IjAuMDA0OTAxOTYxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xOTk5OTk5OSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGNvbXBvbmVudFByb3BlcnR5TmFtZT0iYmFja2dyb3VuZCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTIwLjAiIHkxPSIyLjAiIHkyPSI1LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MSIgZ3JlZW49IjE0MiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5NjU0MDMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjE4NDMxMzcxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzYiIGdyZWVuPSIxNzYiIGJsdWU9IjE3NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wNTU1NTU1ODIiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjEwNDg3NjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA1MDk4MDM5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYm9yZGVyU3RhdGVzPgorICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9InRydWUiIHR5cGU9ImphdmF4LnN3aW5nLkpUZXh0UGFuZSIgbmFtZT0iVGV4dFBhbmUiIHVpPSJUZXh0UGFuZVVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjQiIGJvdHRvbT0iNCIgbGVmdD0iNiIgcmlnaHQ9IjYiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQ+CisgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgPC9iYWNrZ3JvdW5kPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQyIiBncmVlbj0iMTQzIiBibHVlPSIxNDUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Rpc2FibGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxMDAuMCIgeTE9IjAuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjIyIiBncmVlbj0iMjI1IiBibHVlPSIyMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAxNTg3Mjk1NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDc5OTU4NjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTUyOTQxMTciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjIiIHkyPSIwLjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDIiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxMDAuMCIgeTE9IjAuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yIiB5Mj0iMC4xIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3RlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTAwLjAiIHkxPSIwLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgdHlwZT0iamF2YXguc3dpbmcuSkVkaXRvclBhbmUiIG5hbWU9IkVkaXRvclBhbmUiIHVpPSJFZGl0b3JQYW5lVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iNCIgYm90dG9tPSI0IiBsZWZ0PSI2IiByaWdodD0iNiIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8L2JhY2tncm91bmQ+CisgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgIDxjYWNoZU1vZGU+Tk9fQ0FDSElORzwvY2FjaGVNb2RlPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEwMC4wIiB5MT0iMC4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMjIiIGdyZWVuPSIyMjUiIGJsdWU9IjIyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDE1ODcyOTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzk5NTg2MyIgYnJpZ2h0bmVzc09mZnNldD0iMC4xNTI5NDExNyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMiIgeTI9IjAuMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMiI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjEwMC4wIiB5MT0iMC4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjIiIHkyPSIwLjEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iU2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGVkVGV4dCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxMDAuMCIgeTE9IjAuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0xpZ2h0QmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJ0cnVlIiB0eXBlPSJqYXZheC5zd2luZy5KVG9vbEJhciIgbmFtZT0iVG9vbEJhciIgdWk9IlRvb2xCYXJVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcz4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJOb3J0aCI+CisgICAgICAgICAgICAgICA8Y29kZVNuaXBwZXQ+PCFbQ0RBVEFbCisgICAgICAgIEpUb29sQmFyIHRvb2xiYXIgPSAoSlRvb2xCYXIpYzsKKyAgICAgICAgcmV0dXJuIE5pbWJ1c0xvb2tBbmRGZWVsLnJlc29sdmVUb29sYmFyQ29uc3RyYWludCh0b29sYmFyKSA9PSBCb3JkZXJMYXlvdXQuTk9SVEg7CisgICAgICAgICAgICAgICBdXT48L2NvZGVTbmlwcGV0PgorICAgICAgICAgICAgPC9zdGF0ZVR5cGU+CisgICAgICAgICAgICA8c3RhdGVUeXBlIGtleT0iRWFzdCI+CisgICAgICAgICAgICAgICA8Y29kZVNuaXBwZXQ+PCFbQ0RBVEFbCisgICAgICAgIEpUb29sQmFyIHRvb2xiYXIgPSAoSlRvb2xCYXIpYzsKKyAgICAgICAgcmV0dXJuIE5pbWJ1c0xvb2tBbmRGZWVsLnJlc29sdmVUb29sYmFyQ29uc3RyYWludCh0b29sYmFyKSA9PSBCb3JkZXJMYXlvdXQuRUFTVDsKKyAgICAgICAgICAgICAgIF1dPjwvY29kZVNuaXBwZXQ+CisgICAgICAgICAgICA8L3N0YXRlVHlwZT4KKyAgICAgICAgICAgIDxzdGF0ZVR5cGUga2V5PSJXZXN0Ij4KKyAgICAgICAgICAgICAgIDxjb2RlU25pcHBldD48IVtDREFUQVsKKyAgICAgICAgSlRvb2xCYXIgdG9vbGJhciA9IChKVG9vbEJhciljOworICAgICAgICByZXR1cm4gTmltYnVzTG9va0FuZEZlZWwucmVzb2x2ZVRvb2xiYXJDb25zdHJhaW50KHRvb2xiYXIpID09IEJvcmRlckxheW91dC5XRVNUOworICAgICAgICAgICAgICAgXV0+PC9jb2RlU25pcHBldD4KKyAgICAgICAgICAgIDwvc3RhdGVUeXBlPgorICAgICAgICAgICAgPHN0YXRlVHlwZSBrZXk9IlNvdXRoIj4KKyAgICAgICAgICAgICAgIDxjb2RlU25pcHBldD48IVtDREFUQVsKKyAgICAgICAgSlRvb2xCYXIgdG9vbGJhciA9IChKVG9vbEJhciljOworICAgICAgICByZXR1cm4gTmltYnVzTG9va0FuZEZlZWwucmVzb2x2ZVRvb2xiYXJDb25zdHJhaW50KHRvb2xiYXIpID09IEJvcmRlckxheW91dC5TT1VUSDsKKyAgICAgICAgICAgICAgIF1dPjwvY29kZVNuaXBwZXQ+CisgICAgICAgICAgICA8L3N0YXRlVHlwZT4KKyAgICAgICAgIDwvc3RhdGVUeXBlcz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjIiIGJvdHRvbT0iMiIgbGVmdD0iMiIgcmlnaHQ9IjIiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXM+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJOb3J0aCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMzAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjEiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjMwLjAiIHkxPSIyOS4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNvdXRoIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjEiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMzAuMCIgeTE9IjAuMCIgeTI9IjEuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVhc3QiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMSIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIzMC4wIiB5MT0iMC4wIiB5Mj0iMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NiIgZ3JlZW49IjE1MSIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCb3JkZXIiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iV2VzdCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMzAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIwIiBib3R0b209IjEiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuMCIgeDI9IjMwLjAiIHkxPSIyOS4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYm9yZGVyU3RhdGVzPgorICAgICAgICAgPHJlZ2lvbnM+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9IkhhbmRsZUljb24iIHN1YnJlZ2lvbj0idHJ1ZSIga2V5PSJoYW5kbGVJY29uIj4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTEiIGhlaWdodD0iMzgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNTkiIGdyZWVuPSIxNjQiIGJsdWU9IjE3MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA4NTQ3MDA4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMzQ5NDQ5MiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDcwNTg4MjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMzguMCIgY3AxeD0iMC4wIiBjcDF5PSIzOC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjM4LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjM2LjAiIGNwMXg9IjAuMCIgY3AxeT0iMzYuMCIgY3AyeD0iMC4wIiBjcDJ5PSIzNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIzOC4wIiBjcDF4PSIyLjAiIGNwMXk9IjM4LjAiIGNwMng9IjIuMCIgY3AyeT0iMzguMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE1OSIgZ3JlZW49IjE2NCIgYmx1ZT0iMTcyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDg1NDcwMDgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzNDk0NDkyIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNzA1ODgyMyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMi4wIiBjcDF4PSIwLjAiIGNwMXk9IjIuMCIgY3AyeD0iMC4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjAuMCIgY3AxeD0iMi4wIiBjcDF5PSIwLjAiIGNwMng9IjIuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEwLjAiIHgyPSIxMS4wIiB5MT0iMC4wIiB5Mj0iMzguMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzciIGdyZWVuPSIxODEiIGJsdWU9IjE4OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDI5Njc1NjMzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwOTgwMzkxNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTAuMCIgeTE9IjAuMCIgeTI9IjM4LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjExIiBncmVlbj0iMjE0IiBibHVlPSIyMTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNjk0NDQxOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczOTk2NjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTEzNzI1NDgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjAiIHkxPSIwLjUiIHgyPSIxLjAiIHkyPSIwLjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExNDI4NmQ2MmMwLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlJY29uUmVnaW9uPgorICAgICAgICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpCdXR0b24iIG5hbWU9IkJ1dHRvbiIgdWk9IkJ1dHRvblVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iNCIgYm90dG9tPSI0IiBsZWZ0PSI0IiByaWdodD0iNCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZU1vZGU+TklORV9TUVVBUkVfU0NBTEU8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPjIuMDwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MzwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjg1NzE0Mjg1NzE0Mjg2IiB5PSIwLjYiIGNwMXg9IjQzLjg1NzE0Mjg1NzE0Mjg2IiBjcDF5PSIwLjYiIGNwMng9IjQzLjg1NzE0Mjg1NzE0Mjg2IiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OC4wIiB5PSIwLjYiIGNwMXg9Ijk4LjAiIGNwMXk9IjAuNiIgY3AyeD0iMTAxLjAiIGNwMnk9IjAuNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwMy40Mjg1NzE0Mjg1NzE0MiIgeT0iNi4wIiBjcDF4PSIxMDMuNDI4NTcxNDI4NTcxNDIiIGNwMXk9IjMuMCIgY3AyeD0iMTAzLjQyODU3MTQyODU3MTQyIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDMuNDk5OTk5OTk5OTk5OTkiIHk9IjI3LjAiIGNwMXg9IjEwMy40OTk5OTk5OTk5OTk5OSIgY3AxeT0iMjcuMCIgY3AyeD0iMTAzLjQ5OTk5OTk5OTk5OTk5IiBjcDJ5PSIzMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTguMCIgeT0iMzIuMzU3MTQyODU3MTQyODUiIGNwMXg9IjEwMS4wIiBjcDF5PSIzMi4zNTcxNDI4NTcxNDI4NSIgY3AyeD0iOTguMCIgY3AyeT0iMzIuMzU3MTQyODU3MTQyODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjMyLjM1NzE0Mjg1NzE0Mjg1IiBjcDF4PSI2LjAiIGNwMXk9IjMyLjM1NzE0Mjg1NzE0Mjg1IiBjcDJ4PSIzLjAiIGNwMnk9IjMyLjM1NzE0Mjg1NzE0Mjg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42IiB5PSIyNy4wIiBjcDF4PSIwLjYiIGNwMXk9IjMwLjAiIGNwMng9IjAuNiIgY3AyeT0iMjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuNiIgeT0iNi4wNzE0Mjg1NzE0Mjg1NzIiIGNwMXg9IjAuNiIgY3AxeT0iNi4wNzE0Mjg1NzE0Mjg1NzIiIGNwMng9IjAuNiIgY3AyeT0iMy4wNzE0Mjg1NzE0Mjg1NzEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjAuNiIgY3AxeD0iMy4wIiBjcDF5PSIwLjYiIGNwMng9IjYuMCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iMC42IiBjcDF4PSI0NC4wIiBjcDF5PSIwLjYiIGNwMng9IjQ0LjAiIGNwMnk9IjAuNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjIuNDI4NTcxNDI4NTcxNDI5NyIgY3AxeD0iNDQuMCIgY3AxeT0iMi40Mjg1NzE0Mjg1NzE0Mjk3IiBjcDJ4PSI0NC4wIiBjcDJ5PSIyLjQyODU3MTQyODU3MTQyOTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjIuNDI4NTcxNDI4NTcxNDI5NyIgY3AxeD0iNi4wIiBjcDF5PSIyLjQyODU3MTQyODU3MTQyOTciIGNwMng9IjQuMDcxNDI4NTcxNDI4NTczIiBjcDJ5PSIyLjQyODU3MTQyODU3MTQyOTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjM1NzE0Mjg1NzE0Mjg1OCIgeT0iNS45Mjg1NzE0Mjg1NzE0MjkiIGNwMXg9IjIuMzEyODYzMzczNTIyNzQ4IiBjcDF5PSIzLjQ5OTM1MzMzMzgyOTgwNSIgY3AyeD0iMi4zNTcxNDI4NTcxNDI4NTgiIGNwMnk9IjUuOTI4NTcxNDI4NTcxNDI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4zNTcxNDI4NTcxNDI4NTgiIHk9IjI3LjAiIGNwMXg9IjIuMzU3MTQyODU3MTQyODU4IiBjcDF5PSIyNy4wIiBjcDJ4PSIyLjM1NzE0Mjg1NzE0Mjg1OCIgY3AyeT0iMjkuMjE0Mjg1NzE0Mjg1Njk4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIzMC41NzE0Mjg1NzE0Mjg1NjIiIGNwMXg9IjQuMjE0Mjg1NzE0Mjg1NzE1IiBjcDF5PSIzMC41NzE0Mjg1NzE0Mjg1NjIiIGNwMng9IjYuMCIgY3AyeT0iMzAuNTcxNDI4NTcxNDI4NTYyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTguMCIgeT0iMzAuNTcxNDI4NTcxNDI4NTYyIiBjcDF4PSI5OC4wIiBjcDF5PSIzMC41NzE0Mjg1NzE0Mjg1NjIiIGNwMng9IjEwMC4wNzE0Mjg1NzE0Mjg2IiBjcDJ5PSIzMC41NzE0Mjg1NzE0Mjg1NjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDEuNTAwMDAwMDAwMDAwMDEiIHk9IjI3LjAiIGNwMXg9IjEwMS41MDAwMDAwMDAwMDAwMSIgY3AxeT0iMjkuMjE0Mjg1NzE0Mjg1NzA1IiBjcDJ4PSIxMDEuNTAwMDAwMDAwMDAwMDEiIGNwMnk9IjI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDEuNTcxNDI4NTcxNDI4NTgiIHk9IjYuMCIgY3AxeD0iMTAxLjU3MTQyODU3MTQyODU4IiBjcDF5PSI2LjAiIGNwMng9IjEwMS41NzE0Mjg1NzE0Mjg1OCIgY3AyeT0iMy44NTcxNDI4NTcxNDI4NTk0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTguMDcxNDI4NTcxNDI4NTciIHk9IjIuMzU3MTQyODU3MTQyODU4IiBjcDF4PSIxMDAuMjE0Mjg1NzE0Mjg1NzQiIGNwMXk9IjIuMzU3MTQyODU3MTQyODU4IiBjcDJ4PSI5OC4wNzE0Mjg1NzE0Mjg1NyIgY3AyeT0iMi4zNTcxNDI4NTcxNDI4NTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSIyLjQyODU3MTQyODU3MTQyOTciIGNwMXg9IjQ0LjAiIGNwMXk9IjIuNDI4NTcxNDI4NTcxNDI5NyIgY3AyeD0iNDQuMCIgY3AyeT0iMi40Mjg1NzE0Mjg1NzE0Mjk3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTA0IiBoZWlnaHQ9IjMzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiBMYXllciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjEwMS4wIiB5MT0iMy4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUzIiBncmVlbj0iMjUzIiBibHVlPSIyNTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1ODkzMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTA5ODAzOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NyIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5ODUyNjMxNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzMiIGdyZWVuPSIyMzYiIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzMzMzYyMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTI2IiBibHVlPSIxMzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwOTc0MDc3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQyIiBncmVlbj0iNDYiIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTExNjk1OTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUzMzMzMzM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJTaGFkb3cgTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjMuMCIgeTI9IjMyLjAiIHJvdW5kaW5nPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkyIiBncmVlbj0iOTQiIGJsdWU9Ijk2IiBhbHBoYT0iMTAyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0xNTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MyIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA2NTg5MzEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjUwOTgwMzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDciIGdyZWVuPSIyNDgiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTg1MjYzMTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MzMzNjIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwMzkyMTU2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMiIgZ3JlZW49IjEyNiIgYmx1ZT0iMTM0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyMDk3NDA3NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjE5NjA3ODMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MiIgZ3JlZW49IjQ2IiBibHVlPSI1NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjExMTY5NTkxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41MzMzMzMzNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjYiIHgyPSIxMDMuNCIgeTE9IjAuNiIgeTI9IjMyLjQiIHJvdW5kaW5nPSIxMy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDUiIGdyZWVuPSIyMDkiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA1MDUwNTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTYwMDM5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwMTk2MDc4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk0IiBncmVlbj0iMTk5IiBibHVlPSIyMDciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwODU0NzAwOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ3NzI0MzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDY2NjY2NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDE4MzA2NjczIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTcxIiBibHVlPSIxODQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMTgzMDY2NzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjExIiBibHVlPSIyMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyMTI0MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMSIgZ3JlZW49IjIzNyIgYmx1ZT0iMjUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzMDg0NTAzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzkyMTU2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTI2IiBibHVlPSIxMzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwOTc0MDc3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQyIiBncmVlbj0iNDYiIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTExNjk1OTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUzMzMzMzM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJTaGFkb3cgTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjMuMCIgeTI9IjMyLjAiIHJvdW5kaW5nPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkyIiBncmVlbj0iOTQiIGJsdWU9Ijk2IiBhbHBoYT0iMTAyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0xNTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDQiIGhlaWdodD0iMzMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIExheWVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iMTAxLjAiIHkxPSIzLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iOS4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDUiIGdyZWVuPSIyMDkiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA1MDUwNTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTYwMDM5IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjEwMTk2MDc4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk0IiBncmVlbj0iMTk5IiBibHVlPSIyMDciIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwODU0NzAwOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ3NzI0MzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDY2NjY2NjYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC42IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE3MSIgYmx1ZT0iMTg0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDI3Nzc3NTUzIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wMDE4MzA2NjczIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTcxIiBibHVlPSIxODQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAwMTgzMDY2NzMiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjAyMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA0IiBncmVlbj0iMjExIiBibHVlPSIyMjQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwMjc3Nzc1NTMiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyMTI0MDYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMSIgZ3JlZW49IjIzNyIgYmx1ZT0iMjUxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNTU1NTUxMDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzMDg0NTAzOSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzkyMTU2NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTI2IiBibHVlPSIxMzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwOTc0MDc3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQyIiBncmVlbj0iNDYiIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTExNjk1OTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUzMzMzMzM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjEwMy40IiB5MT0iMC42IiB5Mj0iMzIuNCIgcm91bmRpbmc9IjEzLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUNvbXBvbmVudD4KKyAgICAgICAgICAgIDx1aUNvbXBvbmVudCBvcGFxdWU9ImZhbHNlIiB0eXBlPSJqYXZheC5zd2luZy5KVG9nZ2xlQnV0dG9uIiBuYW1lPSJUb2dnbGVCdXR0b24iIHVpPSJUb2dnbGVCdXR0b25VSSIgc3VicmVnaW9uPSJ0cnVlIj4KKyAgICAgICAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjQiIGJvdHRvbT0iNCIgbGVmdD0iNCIgcmlnaHQ9IjQiLz4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5JTkVfU1FVQVJFX1NDQUxFPC9jYWNoZU1vZGU+CisgICAgICAgICAgICAgICAgICA8bWF4SG96Q2FjaGVkSW1nU2NhbGluZz4yLjA8L21heEhvekNhY2hlZEltZ1NjYWxpbmc+CisgICAgICAgICAgICAgICAgICA8bWF4VmVydENhY2hlZEltZ1NjYWxpbmc+SU5GPC9tYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTA0IiBoZWlnaHQ9IjM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiBMYXllciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTA0IiBoZWlnaHQ9IjM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiBMYXllciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQzLjg1NzE0Mjg1NzE0Mjg2IiB5PSIwLjYiIGNwMXg9IjQzLjg1NzE0Mjg1NzE0Mjg2IiBjcDF5PSIwLjYiIGNwMng9IjQzLjg1NzE0Mjg1NzE0Mjg2IiBjcDJ5PSIwLjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OC4wIiB5PSIwLjYiIGNwMXg9Ijk4LjAiIGNwMXk9IjAuNiIgY3AyeD0iMTAxLjAiIGNwMnk9IjAuNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwMy40Mjg1NzE0Mjg1NzE0MiIgeT0iNi4wIiBjcDF4PSIxMDMuNDI4NTcxNDI4NTcxNDIiIGNwMXk9IjMuMCIgY3AyeD0iMTAzLjQyODU3MTQyODU3MTQyIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDMuNDk5OTk5OTk5OTk5OTkiIHk9IjI3LjAiIGNwMXg9IjEwMy40OTk5OTk5OTk5OTk5OSIgY3AxeT0iMjcuMCIgY3AyeD0iMTAzLjQ5OTk5OTk5OTk5OTk5IiBjcDJ5PSIzMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTguMCIgeT0iMzIuMzU3MTQyODU3MTQyODUiIGNwMXg9IjEwMS4wIiBjcDF5PSIzMi4zNTcxNDI4NTcxNDI4NSIgY3AyeD0iOTguMCIgY3AyeT0iMzIuMzU3MTQyODU3MTQyODUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjMyLjM1NzE0Mjg1NzE0Mjg1IiBjcDF4PSI2LjAiIGNwMXk9IjMyLjM1NzE0Mjg1NzE0Mjg1IiBjcDJ4PSIzLjAiIGNwMnk9IjMyLjM1NzE0Mjg1NzE0Mjg1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC42IiB5PSIyNy4wIiBjcDF4PSIwLjYiIGNwMXk9IjMwLjAiIGNwMng9IjAuNiIgY3AyeT0iMjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuNiIgeT0iNi4wNzE0Mjg1NzE0Mjg1NzIiIGNwMXg9IjAuNiIgY3AxeT0iNi4wNzE0Mjg1NzE0Mjg1NzIiIGNwMng9IjAuNiIgY3AyeT0iMy4wNzE0Mjg1NzE0Mjg1NzEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjAuNiIgY3AxeD0iMy4wIiBjcDF5PSIwLjYiIGNwMng9IjYuMCIgY3AyeT0iMC42Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNDQuMCIgeT0iMC42IiBjcDF4PSI0NC4wIiBjcDF5PSIwLjYiIGNwMng9IjQ0LjAiIGNwMnk9IjAuNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQ0LjAiIHk9IjIuNDI4NTcxNDI4NTcxNDI5NyIgY3AxeD0iNDQuMCIgY3AxeT0iMi40Mjg1NzE0Mjg1NzE0Mjk3IiBjcDJ4PSI0NC4wIiBjcDJ5PSIyLjQyODU3MTQyODU3MTQyOTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI2LjAiIHk9IjIuNDI4NTcxNDI4NTcxNDI5NyIgY3AxeD0iNi4wIiBjcDF5PSIyLjQyODU3MTQyODU3MTQyOTciIGNwMng9IjQuMDcxNDI4NTcxNDI4NTczIiBjcDJ5PSIyLjQyODU3MTQyODU3MTQyOTciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjM1NzE0Mjg1NzE0Mjg1OCIgeT0iNS45Mjg1NzE0Mjg1NzE0MjkiIGNwMXg9IjIuMzEyODYzMzczNTIyNzQ4IiBjcDF5PSIzLjQ5OTM1MzMzMzgyOTgwNSIgY3AyeD0iMi4zNTcxNDI4NTcxNDI4NTgiIGNwMnk9IjUuOTI4NTcxNDI4NTcxNDI5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4zNTcxNDI4NTcxNDI4NTgiIHk9IjI3LjAiIGNwMXg9IjIuMzU3MTQyODU3MTQyODU4IiBjcDF5PSIyNy4wIiBjcDJ4PSIyLjM1NzE0Mjg1NzE0Mjg1OCIgY3AyeT0iMjkuMjE0Mjg1NzE0Mjg1Njk4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi4wIiB5PSIzMC41NzE0Mjg1NzE0Mjg1NjIiIGNwMXg9IjQuMjE0Mjg1NzE0Mjg1NzE1IiBjcDF5PSIzMC41NzE0Mjg1NzE0Mjg1NjIiIGNwMng9IjYuMCIgY3AyeT0iMzAuNTcxNDI4NTcxNDI4NTYyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTguMCIgeT0iMzAuNTcxNDI4NTcxNDI4NTYyIiBjcDF4PSI5OC4wIiBjcDF5PSIzMC41NzE0Mjg1NzE0Mjg1NjIiIGNwMng9IjEwMC4wNzE0Mjg1NzE0Mjg2IiBjcDJ5PSIzMC41NzE0Mjg1NzE0Mjg1NjIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDEuNTAwMDAwMDAwMDAwMDEiIHk9IjI3LjAiIGNwMXg9IjEwMS41MDAwMDAwMDAwMDAwMSIgY3AxeT0iMjkuMjE0Mjg1NzE0Mjg1NzA1IiBjcDJ4PSIxMDEuNTAwMDAwMDAwMDAwMDEiIGNwMnk9IjI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDEuNTcxNDI4NTcxNDI4NTgiIHk9IjYuMCIgY3AxeD0iMTAxLjU3MTQyODU3MTQyODU4IiBjcDF5PSI2LjAiIGNwMng9IjEwMS41NzE0Mjg1NzE0Mjg1OCIgY3AyeT0iMy44NTcxNDI4NTcxNDI4NTk0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOTguMDcxNDI4NTcxNDI4NTciIHk9IjIuMzU3MTQyODU3MTQyODU4IiBjcDF4PSIxMDAuMjE0Mjg1NzE0Mjg1NzQiIGNwMXk9IjIuMzU3MTQyODU3MTQyODU4IiBjcDJ4PSI5OC4wNzE0Mjg1NzE0Mjg1NyIgY3AyeT0iMi4zNTcxNDI4NTcxNDI4NTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0NC4wIiB5PSIyLjQyODU3MTQyODU3MTQyOTciIGNwMXg9IjQ0LjAiIGNwMXk9IjIuNDI4NTcxNDI4NTcxNDI5NyIgY3AyeD0iNDQuMCIgY3AyeT0iMi40Mjg1NzE0Mjg1NzE0Mjk3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlciI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTA0IiBoZWlnaHQ9IjM0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiBMYXllciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjEwMS4wIiB5MT0iMy4wIiB5Mj0iMzAuMCIgcm91bmRpbmc9IjkuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjUzIiBncmVlbj0iMjUzIiBibHVlPSIyNTQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDU1NTU1NTgyIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMDY1ODkzMSIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTA5ODAzOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0NyIgZ3JlZW49IjI0OCIgYmx1ZT0iMjUwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA5ODUyNjMxNCIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMzMiIGdyZWVuPSIyMzYiIGJsdWU9IjI0MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNzMzMzYyMyIgYnJpZ2h0bmVzc09mZnNldD0iMC4yMDM5MjE1NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjIuMCIgeTI9IjMxLjAiIHJvdW5kaW5nPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDkiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIyIiBncmVlbj0iMTI2IiBibHVlPSIxMzQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDIwOTc0MDc3IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMTk2MDc4MyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjk1IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjQyIiBncmVlbj0iNDYiIGJsdWU9IjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMTExNjk1OTEiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjUzMzMzMzM2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJTaGFkb3cgTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSIxMDIuMCIgeTE9IjMuMCIgeTI9IjMyLjAiIHJvdW5kaW5nPSIxMi4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjkyIiBncmVlbj0iOTQiIGJsdWU9Ijk2IiBhbHBoYT0iMTAyIiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2ODg1OTY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjg2Mjc0NiIgYWxwaGFPZmZzZXQ9Ii0xNTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwNCIgaGVpZ2h0PSIzNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24gTGF5ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSIxMDEuMCIgeTE9IjMuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSI5LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1MyIgZ3JlZW49IjI1MyIgYmx1ZT0iMjU0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjA1NTU1NTU4MiIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTA2NTg5MzEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjUwOTgwMzgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wNiIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDciIGdyZWVuPSIyNDgiIGJsdWU9IjI1MCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wOTg1MjYzMTQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjM1Mjk0MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjYiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjMzIiBncmVlbj0iMjM2IiBibHVlPSIyNDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDczMzM2MjMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjAzOTIxNTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC43IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzMyIgZ3JlZW49IjIzNiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA3MzMzNjIzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjIwMzkyMTU2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuOTUiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTAyLjAiIHkxPSIyLjAiIHkyPSIzMS4wIiByb3VuZGluZz0iMTIuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA5IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEyMiIgZ3JlZW49IjEyNiIgYmx1ZT0iMTM0IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAyMDk3NDA3NyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjE5NjA3ODMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC45NSIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI0MiIgZ3JlZW49IjQ2IiBibHVlPSI1NCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjExMTY5NTkxIiBicmlnaHRuZXNzT2Zmc2V0PSItMC41MzMzMzMzNiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjYiIHgyPSIxMDMuNCIgeTE9IjAuNiIgeTI9IjMyLjQiIHJvdW5kaW5nPSIxMy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI4LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1MiIgYmx1ZT0iMTU3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTU3MDkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMzNjg5ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTczIiBncmVlbj0iMTc2IiBibHVlPSIxODIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDYxMDc1NzY2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzEzNzI1NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MiIgZ3JlZW49IjE3NSIgYmx1ZT0iMTgxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MDgwMjU2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTEyNjI2MjYyNjI2MjYxIiB5Mj0iMS4wMDkyNTkyNTkyNTkyNTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMTAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTUiIGdyZWVuPSI5NyIgYmx1ZT0iMTAwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDYwNTI2MzE1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNTI5NDEyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjQiIGdyZWVuPSIxMjYiIGJsdWU9IjEzMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQzNzI0NjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNDk5OTk5OTk5OTk5OTk5NCIgeTI9IjEuMDA0MTY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI3MC4wIiB5MT0iMy4wIiB5Mj0iMjMuMCIgcm91bmRpbmc9IjEwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIxNjkiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTg2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlByZXNzZWQrRm9jdXNlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNzIiIGhlaWdodD0iMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjY5LjAiIHkxPSIzLjAiIHkyPSIyMS4wIiByb3VuZGluZz0iOC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDkiIGdyZWVuPSIxNTIiIGJsdWU9IjE1NyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDA2OTQ0NDE4IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNTk1NzA5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMjk0MTE3NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjEzMzY4OTg0IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MyIgZ3JlZW49IjE3NiIgYmx1ZT0iMTgyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MTA3NTc2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDMxMzcyNTQ3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzIiIGdyZWVuPSIxNzUiIGJsdWU9IjE4MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjA4MDI1NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDM1Mjk0MTE2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUxMjYyNjI2MjYyNjI2MSIgeTI9IjEuMDA5MjU5MjU5MjU5MjU5MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI3MC4wIiB5MT0iMi4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjEwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk1IiBncmVlbj0iOTciIGJsdWU9IjEwMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iLTAuMDExMTExMTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MDUyNjMxNSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzUyOTQxMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI0IiBncmVlbj0iMTI2IiBibHVlPSIxMzAiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY0MzcyNDY1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMzUyOTQxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjQ5OTk5OTk5OTk5OTk5OTQiIHkyPSIxLjAwNDE2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iNzEuNCIgeTE9IjAuNiIgeTI9IjIzLjQiIHJvdW5kaW5nPSIxMy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iNzIiIGhlaWdodD0iMjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjY5LjAiIHkxPSIzLjAiIHkyPSIyMS4wIiByb3VuZGluZz0iOC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNjYiIGJsdWU9IjE3MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMTM4ODg4OTU1IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQwMTQ2OSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDcwNTg4MjMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4xMzM2ODk4NCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxOTAiIGdyZWVuPSIxOTMiIGJsdWU9IjE5OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjUzMDAxOCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE4OSIgZ3JlZW49IjE5MiIgYmx1ZT0iMTk4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NTA3MTc3IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAzMTM3MjU0NyIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI1MTI2MjYyNjI2MjYyNjEiIHkyPSIxLjAwOTI1OTI1OTI1OTI1OTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNzAuMCIgeTE9IjIuMCIgeTI9IjIyLjAiIHJvdW5kaW5nPSIxMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjUiIGdyZWVuPSIxMjciIGJsdWU9IjEzMSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQ3MjQ3OSIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjMxMzcyNTQiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE2NCIgZ3JlZW49IjE2NiIgYmx1ZT0iMTcxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAwNzkzNjUzNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY5NTkwNjQiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA3NDUwOTgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNDk5OTk5OTk5OTk5OTk5NCIgeTI9IjEuMDA0MTY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI3MC4wIiB5MT0iMy4wIiB5Mj0iMjMuMCIgcm91bmRpbmc9IjEwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIxNjkiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTg2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5ZWNmYzA0Yi5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjcyIiBoZWlnaHQ9IjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2OS4wIiB5MT0iMy4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjguMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTY0IiBncmVlbj0iMTY2IiBibHVlPSIxNzIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMDEzODg4ODk1NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY0MDE0NjkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjA3MDU4ODIzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMzNjg5ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTkwIiBncmVlbj0iMTkzIiBibHVlPSIxOTkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY1MzAwMTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDM1Mjk0MTE2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxODkiIGdyZWVuPSIxOTIiIGJsdWU9IjE5OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjUwNzE3NyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzEzNzI1NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTEyNjI2MjYyNjI2MjYxIiB5Mj0iMS4wMDkyNTkyNTkyNTkyNTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMTAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI1IiBncmVlbj0iMTI3IiBibHVlPSIxMzEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY0NzI0NzkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzMTM3MjU0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNjQiIGdyZWVuPSIxNjYiIGJsdWU9IjE3MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2OTU5MDY0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNzQ1MDk4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjQ5OTk5OTk5OTk5OTk5OTQiIHkyPSIxLjAwNDE2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC42IiB4Mj0iNzEuNCIgeTE9IjAuNiIgeTI9IjIzLjQiIHJvdW5kaW5nPSIxMy4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNSIgZ3JlZW49IjE2NCIgYmx1ZT0iMjA5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJQcmVzc2VkK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI4LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNyIgZ3JlZW49IjEyMSIgYmx1ZT0iMTI2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTg1MTg1NjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzOTA5Nzc0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNTA5ODA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMzNjg5ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ1IiBncmVlbj0iMTQ5IiBibHVlPSIxNTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNTA1MDU0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDAwMTM0OTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDQiIGdyZWVuPSIxNDciIGJsdWU9IjE1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMTAxMDEwOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDM5NTU4NTc1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMzcyNTQ5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUxMjYyNjI2MjYyNjI2MSIgeTI9IjEuMDA5MjU5MjU5MjU5MjU5MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI3MC4wIiB5MT0iMi4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjEwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY2IiBncmVlbj0iNjgiIGJsdWU9IjcwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzM4MzQ2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NzA1ODgyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTIiIGdyZWVuPSI5NCIgYmx1ZT0iOTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ5MzAxODI1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjA3ODQzMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI0OTk5OTk5OTk5OTk5OTk0IiB5Mj0iMS4wMDQxNjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIzLjAiIHkyPSIyMy4wIiByb3VuZGluZz0iMTAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjE2OSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjU0OTAxOTUiIGFscGhhT2Zmc2V0PSItODYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExMzllZDkyZWQ4LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iUHJlc3NlZCtTZWxlY3RlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI4LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExNyIgZ3JlZW49IjEyMSIgYmx1ZT0iMTI2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTg1MTg1NjciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjAzOTA5Nzc0IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yNTA5ODA0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMzNjg5ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ1IiBncmVlbj0iMTQ5IiBibHVlPSIxNTYiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAwNTA1MDU0IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNDAwMTM0OTIiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEzMzMzMzMzIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDQiIGdyZWVuPSIxNDciIGJsdWU9IjE1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMTAxMDEwOCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDM5NTU4NTc1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4xMzcyNTQ5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjUxMjYyNjI2MjYyNjI2MSIgeTI9IjEuMDA5MjU5MjU5MjU5MjU5MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI3MC4wIiB5MT0iMi4wIiB5Mj0iMjIuMCIgcm91bmRpbmc9IjEwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjY2IiBncmVlbj0iNjgiIGJsdWU9IjcwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMjc3Nzc3OTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1MzM4MzQ2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC40NzA1ODgyNCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTIiIGdyZWVuPSI5NCIgYmx1ZT0iOTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQ5MzAxODI1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNjA3ODQzMiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjI0OTk5OTk5OTk5OTk5OTk0IiB5Mj0iMS4wMDQxNjY2NjY2NjY2NjY3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjAuNiIgeDI9IjcxLjQiIHkxPSIwLjYiIHkyPSIyMy40IiByb3VuZGluZz0iMTMuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iTW91c2VPdmVyK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI4LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1MiIgYmx1ZT0iMTU3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTU3MDkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMzNjg5ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTczIiBncmVlbj0iMTc2IiBibHVlPSIxODIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDYxMDc1NzY2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzEzNzI1NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MiIgZ3JlZW49IjE3NSIgYmx1ZT0iMTgxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MDgwMjU2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTEyNjI2MjYyNjI2MjYxIiB5Mj0iMS4wMDkyNTkyNTkyNTkyNTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMTAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTUiIGdyZWVuPSI5NyIgYmx1ZT0iMTAwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDYwNTI2MzE1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNTI5NDEyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjQiIGdyZWVuPSIxMjYiIGJsdWU9IjEzMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQzNzI0NjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNDk5OTk5OTk5OTk5OTk5NCIgeTI9IjEuMDA0MTY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIyLjAiIHgyPSI3MC4wIiB5MT0iMy4wIiB5Mj0iMjMuMCIgcm91bmRpbmc9IjEwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIxNjkiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTg2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUxheWVyIGZpbGVOYW1lPSIxMTM5ZWRhNjIyMC5wbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT5mYWxzZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9Ik1vdXNlT3ZlcitTZWxlY3RlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSI3MiIgaGVpZ2h0PSIyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNjkuMCIgeTE9IjMuMCIgeTI9IjIxLjAiIHJvdW5kaW5nPSI4LjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0OSIgZ3JlZW49IjE1MiIgYmx1ZT0iMTU3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMDY5NDQ0MTgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA1OTU3MDkiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEyOTQxMTc2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMzNjg5ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTczIiBncmVlbj0iMTc2IiBibHVlPSIxODIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDYxMDc1NzY2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzEzNzI1NDciIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3MiIgZ3JlZW49IjE3NSIgYmx1ZT0iMTgxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2MDgwMjU2IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTEyNjI2MjYyNjI2MjYxIiB5Mj0iMS4wMDkyNTkyNTkyNTkyNTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMTAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iOTUiIGdyZWVuPSI5NyIgYmx1ZT0iMTAwIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC4wMTExMTExNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDYwNTI2MzE1IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4zNTI5NDEyIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMjQiIGdyZWVuPSIxMjYiIGJsdWU9IjEzMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjQzNzI0NjUiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjIzNTI5NDEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNDk5OTk5OTk5OTk5OTk5NCIgeTI9IjEuMDA0MTY2NjY2NjY2NjY2NyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjYiIHgyPSI3MS40IiB5MT0iMC42IiB5Mj0iMjMuNCIgcm91bmRpbmc9IjEzLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTE1IiBncmVlbj0iMTY0IiBibHVlPSIyMDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0ZvY3VzIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjcyIiBoZWlnaHQ9IjI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIzLjAiIHgyPSI2OS4wIiB5MT0iMy4wIiB5Mj0iMjEuMCIgcm91bmRpbmc9IjguMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAzIiBncmVlbj0iMjA2IiBibHVlPSIyMTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY4MDczNDgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDg2Mjc0NTA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMTMzNjg5ODQiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjA5IiBncmVlbj0iMjEyIiBibHVlPSIyMTgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY5MjQxOTEiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTA5ODAzOTE1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDkiIGdyZWVuPSIyMTIiIGJsdWU9IjIxOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4wNjkyNDE5MSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xMDk4MDM5MTUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC4yNTEyNjI2MjYyNjI2MjYxIiB5Mj0iMS4wMDkyNTkyNTkyNTkyNTkzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjIuMCIgeDI9IjcwLjAiIHkxPSIyLjAiIHkyPSIyMi4wIiByb3VuZGluZz0iMTAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTk1IiBncmVlbj0iMTk4IiBibHVlPSIyMDQiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY2NDA4NjY0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjA1NDkwMTk1OCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjAzIiBncmVlbj0iMjA2IiBibHVlPSIyMTIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDY4MDczNDgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDg2Mjc0NTA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuMjQ5OTk5OTk5OTk5OTk5OTQiIHkyPSIxLjAwNDE2NjY2NjY2NjY2NjciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iNzAuMCIgeTE9IjMuMCIgeTI9IjIzLjAiIHJvdW5kaW5nPSIxMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMzUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iLTIyMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzOWVkYjU2MTkucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICAgICA8L3JlZ2lvbnM+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpUb29sQmFyJFNlcGFyYXRvciIgbmFtZT0iVG9vbEJhclNlcGFyYXRvciIgdWk9IlRvb2xCYXJTZXBhcmF0b3JVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIyIiBib3R0b209IjMiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDYiIGdyZWVuPSIxNTEiIGJsdWU9IjE2MSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQm9yZGVyIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxpbmhlcml0LXRleHRGb3JlZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDxtYXhIb3pDYWNoZWRJbWdTY2FsaW5nPklORjwvbWF4SG96Q2FjaGVkSW1nU2NhbGluZz4KKyAgICAgICAgICAgIDxtYXhWZXJ0Q2FjaGVkSW1nU2NhbGluZz5JTkY8L21heFZlcnRDYWNoZWRJbWdTY2FsaW5nPgorICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0iZmFsc2UiIHR5cGU9ImphdmF4LnN3aW5nLkpUb29sVGlwIiBuYW1lPSJUb29sVGlwIiB1aT0iVG9vbFRpcFVJIiBzdWJyZWdpb249ImZhbHNlIj4KKyAgICAgICAgIDxzdGF0ZVR5cGVzLz4KKyAgICAgICAgIDxjb250ZW50TWFyZ2lucyB0b3A9IjQiIGJvdHRvbT0iNCIgbGVmdD0iNCIgcmlnaHQ9IjQiLz4KKyAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAiIGhlaWdodD0iMTAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSIxIiBib3R0b209IjEiIGxlZnQ9IjEiIHJpZ2h0PSIxIi8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjkuMCIgeTE9IjEuMCIgeTI9IjkuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDIiIGdyZWVuPSIyNDIiIGJsdWU9IjE4OSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0iaW5mbyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxMC4wIiB5MT0iMC4wIiB5Mj0iMS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NiIgZ3JlZW49IjE1MSIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCb3JkZXIiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTAuMCIgeTE9IjkuMCIgeTI9IjEwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ2IiBncmVlbj0iMTUxIiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxLjAiIHkxPSIxLjAiIHkyPSI5LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTQ2IiBncmVlbj0iMTUxIiBibHVlPSIxNjEiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JvcmRlciIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI5LjAiIHgyPSIxMC4wIiB5MT0iMS4wIiB5Mj0iOS4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0NiIgZ3JlZW49IjE1MSIgYmx1ZT0iMTYxIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCb3JkZXIiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICA8cmVnaW9ucy8+CisgICAgICA8L3VpQ29tcG9uZW50PgorICAgICAgPHVpQ29tcG9uZW50IG9wYXF1ZT0idHJ1ZSIgdHlwZT0iamF2YXguc3dpbmcuSlRyZWUiIG5hbWU9IlRyZWUiIHVpPSJUcmVlVUkiIHN1YnJlZ2lvbj0iZmFsc2UiPgorICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMCIgZ3JlZW49IjAiIGJsdWU9IjAiIGFscGhhPSIwIiB1aURlZmF1bHRQYXJlbnROYW1lPSJ0ZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIiB1aVJlc291cmNlPSJmYWxzZSIvPgorICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiIHVpUmVzb3VyY2U9ImZhbHNlIi8+CisgICAgICAgICAgICA8L3RleHRCYWNrZ3JvdW5kPgorICAgICAgICAgICAgPGJhY2tncm91bmQ+CisgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICA8L2JhY2tncm91bmQ+CisgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgIDxpbmhlcml0LXRleHRCYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LXRleHRCYWNrZ3JvdW5kPgorICAgICAgICAgICAgPGluaGVyaXQtYmFja2dyb3VuZD5mYWxzZTwvaW5oZXJpdC1iYWNrZ3JvdW5kPgorICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CisgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KKyAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJyZW5kZXJlckZpbGxCYWNrZ3JvdW5kIiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImxlZnRDaGlsZEluZGVudCIgdHlwZT0iSU5UIiB2YWx1ZT0iMTIiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InJpZ2h0Q2hpbGRJbmRlbnQiIHR5cGU9IklOVCIgdmFsdWU9IjQiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImRyYXdIb3Jpem9udGFsTGluZXMiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0iZHJhd1ZlcnRpY2FsTGluZXMiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0ic2hvd1Jvb3RIYW5kbGVzIiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InJlbmRlcmVyVXNlVHJlZUNvbG9ycyIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InJlcGFpbnRXaG9sZVJvdyIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9InJvd0hlaWdodCIgdHlwZT0iSU5UIiB2YWx1ZT0iMCIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icmVuZGVyZXJNYXJnaW5zIiB0eXBlPSJJTlNFVFMiPgorICAgICAgICAgICAgICAgICAgIDxpbnNldHMgdG9wPSIyIiBsZWZ0PSIwIiBib3R0b209IjEiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICA8L3VpUHJvcGVydHk+CisgICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJzZWxlY3Rpb25Gb3JlZ3JvdW5kIiB0eXBlPSJDT0xPUiI+CisgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzU2VsZWN0ZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIiB1aVJlc291cmNlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPC91aVByb3BlcnR5PgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0ic2VsZWN0aW9uQmFja2dyb3VuZCIgdHlwZT0iQ09MT1IiPgorICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTciIGdyZWVuPSIxMDUiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzU2VsZWN0aW9uQmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIgdWlSZXNvdXJjZT0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgIDwvdWlQcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImRyb3BMaW5lQ29sb3IiIHR5cGU9IkNPTE9SIj4KKyAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0MiIgZ3JlZW49IjI0MiIgYmx1ZT0iMjQyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNGb2N1cyIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgIDwvdWlQcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvdWlwcm9wZXJ0aWVzPgorICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRGlzYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxMDAiIGhlaWdodD0iMzAiLz4KKyAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+MjwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtTZWxlY3RlZCI+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMSIgYm90dG9tPSIxIiBsZWZ0PSIxIiByaWdodD0iMSIvPgorICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgPHJlZ2lvbnM+CisgICAgICAgICAgICA8cmVnaW9uIG5hbWU9IlRyZWVDZWxsIiBzdWJyZWdpb249InRydWUiIHRpdGxlPSJUcmVlIENlbGwiPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LWJhY2tncm91bmQ+ZmFsc2U8L2luaGVyaXQtYmFja2dyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIxNSIgcmlnaHQ9IjE1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iTGF5ZXIgMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtGb2N1c2VkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzTGlnaHRCYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2JhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC1iYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LWJhY2tncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwIiB5PSIwIiBjcDF4PSIwIiBjcDF5PSIwIiBjcDJ4PSIwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwIiB5PSIzMCIgY3AxeD0iMCIgY3AxeT0iMzAiIGNwMng9IjAiIGNwMnk9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDAiIHk9IjMwIiBjcDF4PSIxMDAiIGNwMXk9IjMwIiBjcDJ4PSIxMDAiIGNwMnk9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDAiIHk9IjAiIGNwMXg9IjEwMCIgY3AxeT0iMCIgY3AyeD0iMTAwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjAiIGNwMXg9IjEuMiIgY3AxeT0iMCIgY3AyeD0iMS4yIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjEuMiIgY3AxeD0iMS4yIiBjcDF5PSIxLjIiIGNwMng9IjEuMiIgY3AyeT0iMS4yIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OC44IiB5PSIxLjIiIGNwMXg9Ijk4LjgiIGNwMXk9IjEuMiIgY3AyeD0iOTguOCIgY3AyeT0iMS4yIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OC44IiB5PSIyOC44IiBjcDF4PSI5OC44IiBjcDF5PSIyOC44IiBjcDJ4PSI5OC44IiBjcDJ5PSIyOC44Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjI4LjgiIGNwMXg9IjEuMiIgY3AxeT0iMjguOCIgY3AyeD0iMS4yIiBjcDJ5PSIyOC44Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjAiIGNwMXg9IjEuMiIgY3AxeT0iMCIgY3AyeD0iMS4yIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIwLjAiIHgyPSIxMDAuMCIgeTE9IjAuMCIgeTI9IjMwLjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTI5IiBncmVlbj0iMTI5IiBibHVlPSIxMjkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbkJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMS4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkK0ZvY3VzZWQiPgorICAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTUiIGdyZWVuPSIxNjQiIGJsdWU9IjIwOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRm9jdXMiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwIiB5PSIwIiBjcDF4PSIwIiBjcDF5PSIwIiBjcDJ4PSIwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwIiB5PSIzMCIgY3AxeD0iMCIgY3AxeT0iMzAiIGNwMng9IjAiIGNwMnk9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDAiIHk9IjMwIiBjcDF4PSIxMDAiIGNwMXk9IjMwIiBjcDJ4PSIxMDAiIGNwMnk9IjMwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMDAiIHk9IjAiIGNwMXg9IjEwMCIgY3AxeT0iMCIgY3AyeD0iMTAwIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjAiIGNwMXg9IjEuMiIgY3AxeT0iMCIgY3AyeD0iMS4yIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjEuMiIgY3AxeD0iMS4yIiBjcDF5PSIxLjIiIGNwMng9IjEuMiIgY3AyeT0iMS4yIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OC44IiB5PSIxLjIiIGNwMXg9Ijk4LjgiIGNwMXk9IjEuMiIgY3AyeD0iOTguOCIgY3AyeT0iMS4yIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI5OC44IiB5PSIyOC44IiBjcDF4PSI5OC44IiBjcDF5PSIyOC44IiBjcDJ4PSI5OC44IiBjcDJ5PSIyOC44Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjI4LjgiIGNwMXg9IjEuMiIgY3AxeT0iMjguOCIgY3AyeD0iMS4yIiBjcDJ5PSIyOC44Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjIiIHk9IjAiIGNwMXg9IjEuMiIgY3AxeT0iMCIgY3AyeD0iMS4yIiBjcDJ5PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMC4wIiB4Mj0iMTAwLjAiIHkxPSIwLjAiIHkyPSIzMC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjU3IiBncmVlbj0iMTA1IiBibHVlPSIxMzgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c1NlbGVjdGlvbkJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMS4wIiB5MT0iMC4wIiB4Mj0iMS4wIiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC9yZWdpb24+CisgICAgICAgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJmYWxzZSIgY29tcG9uZW50TmFtZT0iVHJlZS5jZWxsUmVuZGVyZXIiIHR5cGU9ImphdmF4LnN3aW5nLkpMYWJlbCIgbmFtZT0iTGFiZWwiIHVpPSJMYWJlbFVJIiBzdWJyZWdpb249InRydWUiPgorICAgICAgICAgICAgICAgPHN0YXRlVHlwZXMvPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE0MiIgZ3JlZW49IjE0MyIgYmx1ZT0iMTQ1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNEaXNhYmxlZFRleHQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgICAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9ImxlYWZJY29uIiBzdWJyZWdpb249InRydWUiIGtleT0ibGVhZkljb24iIGJhc2ljS2V5PSJUcmVlLmxlYWZJY29uIj4KKyAgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjEyOCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSItMTI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC4wIiB5PSIyLjAiIGNwMXg9IjEwLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTAuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjAiIHk9IjEuMCIgY3AxeD0iMTAuMCIgY3AxeT0iMS4wIiBjcDJ4PSIxMC4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxLjAiIGNwMXg9IjIuMCIgY3AxeT0iMS4wIiBjcDJ4PSIyLjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE1LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjE1LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjE1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI1LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjUuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjE0LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjEzLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNC4wIiBjcDF4PSIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjIuMCIgY3AxeD0iMy4wIiBjcDF5PSIyLjAiIGNwMng9IjMuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzOCIgZ3JlZW49IjE1NyIgYmx1ZT0iMTc2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC40MTk4MDUyIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjE0MTE3NjQ2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuMCIgeT0iMS4wIiBjcDF4PSIxMC4wIiBjcDF5PSIxLjAiIGNwMng9IjEwLjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI4Ljc0MDc0MDc0MDc0MDc0IiB5PSIxLjAiIGNwMXg9IjguNzQwNzQwNzQwNzQwNzQiIGNwMXk9IjEuMCIgY3AyeD0iOC43NDA3NDA3NDA3NDA3NCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNzc3Nzc3Nzc3Nzc3Nzc3IiB5PSI2LjIyMjIyMjIyMjIyMjIxOSIgY3AxeD0iOC43Nzc3Nzc3Nzc3Nzc3NzciIGNwMXk9IjYuMjIyMjIyMjIyMjIyMjE5IiBjcDJ4PSI4Ljc3Nzc3Nzc3Nzc3Nzc3NyIgY3AyeT0iNi4yMjIyMjIyMjIyMjIyMTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNi4yMDM3MDM3MDM3MDM3IiBjcDF4PSIxNC4wIiBjcDF5PSI2LjIwMzcwMzcwMzcwMzciIGNwMng9IjE0LjAiIGNwMnk9IjYuMjAzNzAzNzAzNzAzNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSI1LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTQuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjAiIHk9IjUuMCIgY3AxeD0iMTAuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxMC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIwMiIgZ3JlZW49IjIxNSIgYmx1ZT0iMjI5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA3NzY4MDk0NSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNTE3ODEwMzQiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMzQ5MDE5NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjIzOCIgZ3JlZW49IjI0MiIgYmx1ZT0iMjQ3IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDEzOTQwODcxIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC41OTkyNzciIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDE5NjA3ODIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC4wIiB5PSIxLjAiIGNwMXg9IjEwLjAiIGNwMXk9IjEuMCIgY3AyeD0iMTAuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMS4wIiBjcDF4PSIyLjAiIGNwMXk9IjEuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNS4wIiBjcDF4PSIyLjAiIGNwMXk9IjE1LjAiIGNwMng9IjIuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNS4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTAuMCIgeT0iNS4wIiBjcDF4PSIxMC4wIiBjcDF5PSI1LjAiIGNwMng9IjEwLjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjM2IiBncmVlbj0iMjQ1IiBibHVlPSIyNTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjAzMjY3OTczNyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMDQzMzMyNjM2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI0NzA1ODgxIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMDQ2Mjk2Mjk2Mjk2Mjk2MzYiIHkxPSIwLjk2NzU5MjU5MjU5MjU5MjkiIHgyPSIwLjQ4NjExMTExMTExMTExMDk0IiB5Mj0iMC41MzI0MDc0MDc0MDc0MDc0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC4wIiB5PSIxLjAiIGNwMXg9IjEwLjAiIGNwMXk9IjEuMCIgY3AyeD0iMTAuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjAiIHk9IjUuMCIgY3AxeD0iMTAuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxMC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNS4wIiBjcDF4PSIxNC4wIiBjcDF5PSI1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMi4wIiB4Mj0iMTQuMCIgeTE9IjE1LjAiIHkyPSIxNi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk3IiBncmVlbj0iOTgiIGJsdWU9IjEwMiIgYWxwaGE9IjI1NSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3RhbmdsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDkiIGdyZWVuPSIxNTEiIGJsdWU9IjE1NiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmx1ZUdyZXkiIGh1ZU9mZnNldD0iMC4wMDc5MzY1MzciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjA2NTY1NDUxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTMzMzMzMzMiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjAuMCIgY3AxeD0iMS4wIiBjcDF5PSIwLjAiIGNwMng9IjEuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTYuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNi4wIiBjcDF4PSIyLjAiIGNwMXk9IjE2LjAiIGNwMng9IjIuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjEuMCIgY3AxeD0iMi4wIiBjcDF5PSIxLjAiIGNwMng9IjIuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEwLjUxODUxODUxODUxODUyMyIgeT0iMC45OTk5OTk5OTk5OTk5OTk5IiBjcDF4PSIxMC41MTg1MTg1MTg1MTg1MjMiIGNwMXk9IjAuOTk5OTk5OTk5OTk5OTk5OSIgY3AyeD0iMTAuNTE4NTE4NTE4NTE4NTIzIiBjcDJ5PSIwLjk5OTk5OTk5OTk5OTk5OTkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMDAwMDAwMDAwMDAwMDAyIiB5PSI0LjUiIGNwMXg9IjE0LjAwMDAwMDAwMDAwMDAwMiIgY3AxeT0iNC41IiBjcDJ4PSIxNC4wMDAwMDAwMDAwMDAwMDIiIGNwMnk9IjQuNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjE2LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjE2LjAiIGNwMng9IjE1LjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNC40NDQ0NDQ0NDQ0NDQ0NDEiIGNwMXg9IjE1LjAiIGNwMXk9IjQuNDQ0NDQ0NDQ0NDQ0NDQxIiBjcDJ4PSIxNS4wIiBjcDJ5PSI0LjQ0NDQ0NDQ0NDQ0NDQ0MSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMC43MjIyMjIyMjIyMjIyMjUiIHk9IjAuMCIgY3AxeD0iMTAuNzIyMjIyMjIyMjIyMjI1IiBjcDF5PSIwLjAiIGNwMng9IjEwLjcyMjIyMjIyMjIyMjIyNSIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZlNjM0ZmY5LnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGVMYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9ImNsb3NlZEljb24iIHN1YnJlZ2lvbj0idHJ1ZSIga2V5PSJjbG9zZWRJY29uIiBiYXNpY0tleT0iVHJlZS5jbG9zZWRJY29uIj4KKyAgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD40PC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEyLjAiIHk9IjEyLjAiIGNwMXg9IjEyLjAiIGNwMXk9IjEyLjAiIGNwMng9IjEyLjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwMCIgZ3JlZW49IjEyMiIgYmx1ZT0iMTQzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAyNzQzNjYxNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzM1MDE1IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAxMTc2NDcwNSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMjU0NDkxMDMiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxMTEiIGdyZWVuPSIxMzAiIGJsdWU9IjE0OCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMjQyOTQyNTciIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjM4NTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDMxMzcyNTQ3IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNzYiIGdyZWVuPSI5MSIgYmx1ZT0iMTA1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxODA4MTA2OSIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzU5NTIzOCIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMTM3MjU0OTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI1LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjUuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjQuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNC4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy43NDA3NDA3NDA3NDA3NDA1IiB5PSIzLjk5OTk5OTk5OTk5OTk5OTYiIGNwMXg9IjMuNzQwNzQwNzQwNzQwNzQwNSIgY3AxeT0iMy45OTk5OTk5OTk5OTk5OTk2IiBjcDJ4PSIzLjc0MDc0MDc0MDc0MDc0MDUiIGNwMnk9IjMuOTk5OTk5OTk5OTk5OTk5NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAxODUxODUxODUxODUxMzciIHk9IjEwLjA1NTU1NTU1NTU1NTU1IiBjcDF4PSIyLjAxODUxODUxODUxODUxMzciIGNwMXk9IjEwLjA1NTU1NTU1NTU1NTU1IiBjcDJ4PSIyLjAxODUxODUxODUxODUxMzciIGNwMnk9IjEwLjA1NTU1NTU1NTU1NTU1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTQuMCIgY3AxeD0iMi4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIyLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNC4wIiBjcDF4PSIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjk2Mjk2Mjk2Mjk2Mjk2MzIiIHk9IjEyLjEyOTYyOTYyOTYyOTYzMiIgY3AxeD0iMi45NjI5NjI5NjI5NjI5NjMyIiBjcDF5PSIxMi4xMjk2Mjk2Mjk2Mjk2MzIiIGNwMng9IjIuOTYyOTYyOTYyOTYyOTYzMiIgY3AyeT0iMTIuMTI5NjI5NjI5NjI5NjMyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuNTc5OTk5OTk5OTk5OTkxIiB5PSI0Ljk4IiBjcDF4PSI0LjU3OTk5OTk5OTk5OTk5MSIgY3AxeT0iNC45OCIgY3AyeD0iNC41Nzk5OTk5OTk5OTk5OTEiIGNwMnk9IjQuOTgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjcyIiBncmVlbj0iOTciIGJsdWU9IjEyMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTIwOTQzNzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIzNTcxNDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNzg0MzE0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMzUiIGdyZWVuPSI1NSIgYmx1ZT0iNzMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMi45NTY5ODY0RS00IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTUxNjYzNjYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjI2Mjc0NTEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNi4wIiB5PSI0LjAiIGNwMXg9IjE2LjAiIGNwMXk9IjQuMCIgY3AyeD0iMTYuMCIgY3AyeT0iNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjAiIHk9IjUuMCIgY3AxeD0iMTYuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iNS4wIiBjcDF4PSIxMy4wIiBjcDF5PSI1LjAiIGNwMng9IjEzLjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIzLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI4LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIyLjAiIGNwMXg9IjcuMCIgY3AxeT0iMi4wIiBjcDJ4PSI3LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjEuMCIgY3AxeD0iNy4wIiBjcDF5PSIxLjAiIGNwMng9IjcuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuOTQ0NDQ0NDQ0NDQ0NDQzOCIgeT0iMS4wMTg1MTg1MTg1MTg1MTg2IiBjcDF4PSIyLjk0NDQ0NDQ0NDQ0NDQ0MzgiIGNwMXk9IjEuMDE4NTE4NTE4NTE4NTE4NiIgY3AyeD0iMi45NDQ0NDQ0NDQ0NDQ0NDM4IiBjcDJ5PSIxLjAxODUxODUxODUxODUxODYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi45ODE0ODE0ODE0ODE0ODE0IiB5PSIxLjc0MDc0MDc0MDc0MDc0MDMiIGNwMXg9IjIuOTgxNDgxNDgxNDgxNDgxNCIgY3AxeT0iMS43NDA3NDA3NDA3NDA3NDAzIiBjcDJ4PSIyLjk4MTQ4MTQ4MTQ4MTQ4MTQiIGNwMnk9IjEuNzQwNzQwNzQwNzQwNzQwMyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjc0MDc0MDc0MDc0MDc0MDciIHk9IjMuMCIgY3AxeD0iMS43NDA3NDA3NDA3NDA3NDA3IiBjcDF5PSIzLjAiIGNwMng9IjEuNzQwNzQwNzQwNzQwNzQwNyIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIxNC4wIiBjcDF4PSIxLjAiIGNwMXk9IjE0LjAiIGNwMng9IjEuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNC4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjcuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuODcwMzcwMzcwMzcwMzciIHk9IjUuOTYyOTYyOTYyOTYyOTY1IiBjcDF4PSIxNC44NzAzNzAzNzAzNzAzNyIgY3AxeT0iNS45NjI5NjI5NjI5NjI5NjUiIGNwMng9IjE0Ljg3MDM3MDM3MDM3MDM3IiBjcDJ5PSI1Ljk2Mjk2Mjk2Mjk2Mjk2NSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI1LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjUuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE2LjAiIHk9IjUuMCIgY3AxeD0iMTYuMCIgY3AxeT0iNS4wIiBjcDJ4PSIxNi4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuNDYyOTYyOTYyOTYyOTY3IiB5PSI2LjEyOTYyOTYyOTYyOTYyOSIgY3AxeD0iMTUuNDYyOTYyOTYyOTYyOTY3IiBjcDF5PSI2LjEyOTYyOTYyOTYyOTYyOSIgY3AyeD0iMTUuNDYyOTYyOTYyOTYyOTY3IiBjcDJ5PSI2LjEyOTYyOTYyOTYyOTYyOSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI3LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjE0LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjE0LjAiIGNwMng9IjE1LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTUuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE1LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMTQuMCIgY3AxeD0iMC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIzLjI1OTI1OTI1OTI1OTI2IiBjcDF4PSIwLjAiIGNwMXk9IjMuMjU5MjU5MjU5MjU5MjYiIGNwMng9IjAuMCIgY3AyeT0iMy4yNTkyNTkyNTkyNTkyNiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjE4NTE4NTE4NTE4NTE4NTYiIHk9IjAuMCIgY3AxeD0iMy4xODUxODUxODUxODUxODU2IiBjcDF5PSIwLjAiIGNwMng9IjMuMTg1MTg1MTg1MTg1MTg1NiIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMC4wIiBjcDF4PSI3LjAiIGNwMXk9IjAuMCIgY3AyeD0iNy4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC41NTU1NTU1NTU1NTU1NSIgeT0iMi4wMDAwMDAwMDAwMDAwMDA0IiBjcDF4PSI4LjU1NTU1NTU1NTU1NTU1IiBjcDF5PSIyLjAwMDAwMDAwMDAwMDAwMDQiIGNwMng9IjguNTU1NTU1NTU1NTU1NTUiIGNwMnk9IjIuMDAwMDAwMDAwMDAwMDAwNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjMuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iNC4wIiBjcDF4PSIxNC4wIiBjcDF5PSI0LjAiIGNwMng9IjE0LjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI4LjAiIHgyPSIxMy4wIiB5MT0iMy4wIiB5Mj0iNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9Ii0xMDAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjMuMCIgeDI9IjcuMCIgeTE9IjEuMCIgeTI9IjIuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjIwNSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSItNTAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0YW5nbGUgeDE9IjEuMCIgeDI9IjIuMCIgeTE9IjMuMCIgeTI9IjQuMCIgcm91bmRpbmc9IjAuMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyNTUiIGJsdWU9IjI1NSIgYWxwaGE9IjEzMCIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjYzNTcxNDMiIGJyaWdodG5lc3NPZmZzZXQ9IjAuNDUwOTgwMzciIGFscGhhT2Zmc2V0PSItMTI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMTUiIGJsdWU9IjIyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNzc2ODA5NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUxNzgxMDM0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0OTAxOTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNDgiIGdyZWVuPSIyNTAiIGJsdWU9IjI1MiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNDY4MTY0NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjE5ODQxMyIgYnJpZ2h0bmVzc09mZnNldD0iMC40MzkyMTU2NiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTQuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxNC4wIiBjcDF4PSIyLjAiIGNwMXk9IjE0LjAiIGNwMng9IjIuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjA0MTY2NjY2NjY2NjY2NyIgeT0iMTAuMTg3NDk5OTk5OTk5OTk4IiBjcDF4PSIyLjA0MTY2NjY2NjY2NjY2NyIgY3AxeT0iMTAuMTg3NDk5OTk5OTk5OTk4IiBjcDJ4PSIyLjA0MTY2NjY2NjY2NjY2NyIgY3AyeT0iMTAuMTg3NDk5OTk5OTk5OTk4Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuOTc5MTY2NjY2NjY2NjY4IiB5PSI0LjAiIGNwMXg9IjMuOTc5MTY2NjY2NjY2NjY4IiBjcDF5PSI0LjAiIGNwMng9IjMuOTc5MTY2NjY2NjY2NjY4IiBjcDJ5PSI0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iNC4wIiBjcDF4PSIxMy4wIiBjcDF5PSI0LjAiIGNwMng9IjEzLjAiIGNwMnk9IjQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIzLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI4LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIyLjAiIGNwMXg9IjcuMCIgY3AxeT0iMi4wIiBjcDJ4PSI3LjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjEuMCIgY3AxeD0iNy4wIiBjcDF5PSIxLjAiIGNwMng9IjcuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMS4wIiBjcDF4PSIzLjAiIGNwMXk9IjEuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIyLjAiIGNwMXg9IjMuMCIgY3AxeT0iMi4wIiBjcDJ4PSIzLjAiIGNwMnk9IjIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjMuMCIgY3AxeD0iMi4wIiBjcDF5PSIzLjAiIGNwMng9IjIuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMDQxOTE2MTciIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNzgiIGdyZWVuPSIxOTgiIGJsdWU9IjIxNiIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjQ1OTc4ODM4IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI5ODAzOTIiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjE2NDY3MDY2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTM0IiBncmVlbj0iMTYyIiBibHVlPSIxODgiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDE1OTUyNTg3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNDg0ODAyNSIgYnJpZ2h0bmVzc09mZnNldD0iMC4xODgyMzUyOCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMzI2MzQ3MyIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExMSIgZ3JlZW49IjEzOSIgYmx1ZT0iMTY1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzA4NDQxNTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDk4MDM5MjEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIxLjAiIG1pZHBvaW50PSIwLjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5NSIgZ3JlZW49IjEyMyIgYmx1ZT0iMTQ5IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMjczMjk4MTciIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDM1Mjk0MTE2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNC4wIiBjcDF4PSIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAxODUxODUxODUxODUxODYiIHk9IjEwLjA1NTU1NTU1NTU1NTU1OSIgY3AxeD0iMy4wMTg1MTg1MTg1MTg1MTg2IiBjcDF5PSIxMC4wNTU1NTU1NTU1NTU1NTkiIGNwMng9IjMuMDE4NTE4NTE4NTE4NTE4NiIgY3AyeT0iMTAuMDU1NTU1NTU1NTU1NTU5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNS4wIiBjcDF4PSI0LjAiIGNwMXk9IjUuMCIgY3AyeD0iNC4wIiBjcDJ5PSI1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNS4wIiBjcDF4PSIxNS4wIiBjcDF5PSI1LjAiIGNwMng9IjE1LjAiIGNwMnk9IjUuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSI3LjAiIGNwMXg9IjE1LjAiIGNwMXk9IjcuMCIgY3AyeD0iMTUuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjE0LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjE0LjAiIGNwMng9IjE0LjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIxIiBncmVlbj0iMTI2IiBibHVlPSIxMzYiIGFscGhhPSIxNTYiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMSIgYWxwaGFPZmZzZXQ9Ii05OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxMy4wIiBjcDF4PSIwLjAiIGNwMXk9IjEzLjAiIGNwMng9IjAuMCIgY3AyeT0iMTMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjE0LjAiIGNwMXg9IjAuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTYuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTYuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTYuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxNC4wIiBjcDF4PSIxNS4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZmU2YzliMzkucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ0ZW1wbGF0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9Im9wZW5JY29uIiBzdWJyZWdpb249InRydWUiIGtleT0ib3Blbkljb24iIGJhc2ljS2V5PSJUcmVlLm9wZW5JY29uIj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh0TGF5ZXJOYW1lSW5kZXg+NDwvbmV4dExheWVyTmFtZUluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmV0Y2hpbmdJbnNldHMgdG9wPSI1IiBib3R0b209IjUiIGxlZnQ9IjUiIHJpZ2h0PSI1Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iQnV0dG9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyNTUiIGdyZWVuPSIyMDAiIGJsdWU9IjAiIGFscGhhPSIyNTUiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTIuMCIgeT0iMTIuMCIgY3AxeD0iMTIuMCIgY3AxeT0iMTIuMCIgY3AyeD0iMTIuMCIgY3AyeT0iMTIuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI5MyIgZ3JlZW49IjExMyIgYmx1ZT0iMTMzIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zMzQ5NjI0MyIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMDI3NDUwOTc5IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI4MiIgZ3JlZW49Ijk4IiBibHVlPSIxMTMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDE5OTM0NzczIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4zNjEzNzgiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjEwNTg4MjM4IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjcuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI2LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjYuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy42OTk5OTk5OTk5OTk5OTk3IiB5PSI2LjAiIGNwMXg9IjMuNjk5OTk5OTk5OTk5OTk5NyIgY3AxeT0iNi4wIiBjcDJ4PSIzLjY5OTk5OTk5OTk5OTk5OTciIGNwMnk9IjYuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuMCIgeT0iMTEuMCIgY3AxeD0iMi4wIiBjcDF5PSIxMS4wIiBjcDJ4PSIyLjAiIGNwMnk9IjExLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE0LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNC4wIiBjcDF4PSIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuOTYyOTYyOTYyOTYyOTYzMiIgeT0iMTIuMTI5NjI5NjI5NjI5NjMyIiBjcDF4PSIyLjk2Mjk2Mjk2Mjk2Mjk2MzIiIGNwMXk9IjEyLjEyOTYyOTYyOTYyOTYzMiIgY3AyeD0iMi45NjI5NjI5NjI5NjI5NjMyIiBjcDJ5PSIxMi4xMjk2Mjk2Mjk2Mjk2MzIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjcuMCIgY3AxeD0iNC4wIiBjcDF5PSI3LjAiIGNwMng9IjQuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyYWRpZW50IGN5Y2xlTWV0aG9kPSJOT19DWUNMRSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjcyIiBncmVlbj0iOTciIGJsdWU9IjEyMCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwMTIwOTQzNzgiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjIzNTcxNDI5IiBicmlnaHRuZXNzT2Zmc2V0PSItMC4wNzg0MzE0IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjEuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIzNSIgZ3JlZW49IjU1IiBibHVlPSI3MyIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIyLjk1Njk4NjRFLTQiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExNTE2NjM2NiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMjYyNzQ1MSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3JhZGllbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNi4wIiB5PSI2LjAiIGNwMXg9IjE2LjAiIGNwMXk9IjYuMCIgY3AyeD0iMTYuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTYuMCIgeT0iNy4wIiBjcDF4PSIxNi4wIiBjcDF5PSI3LjAiIGNwMng9IjE2LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEzLjAiIHk9IjcuMCIgY3AxeD0iMTMuMCIgY3AxeT0iNy4wIiBjcDJ4PSIxMy4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIzLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjMuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iOC4wIiB5PSIzLjAiIGNwMXg9IjguMCIgY3AxeT0iMy4wIiBjcDJ4PSI4LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjcuMCIgeT0iMi4wIiBjcDF4PSI3LjAiIGNwMXk9IjIuMCIgY3AyeD0iNy4wIiBjcDJ5PSIyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjEuMCIgY3AxeD0iNy4wIiBjcDF5PSIxLjAiIGNwMng9IjcuMCIgY3AyeT0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi45NDQ0NDQ0NDQ0NDQ0NDM4IiB5PSIxLjAxODUxODUxODUxODUxODYiIGNwMXg9IjIuOTQ0NDQ0NDQ0NDQ0NDQzOCIgY3AxeT0iMS4wMTg1MTg1MTg1MTg1MTg2IiBjcDJ4PSIyLjk0NDQ0NDQ0NDQ0NDQ0MzgiIGNwMnk9IjEuMDE4NTE4NTE4NTE4NTE4NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjIuOTgxNDgxNDgxNDgxNDgxNCIgeT0iMS43NDA3NDA3NDA3NDA3NDAzIiBjcDF4PSIyLjk4MTQ4MTQ4MTQ4MTQ4MTQiIGNwMXk9IjEuNzQwNzQwNzQwNzQwNzQwMyIgY3AyeD0iMi45ODE0ODE0ODE0ODE0ODE0IiBjcDJ5PSIxLjc0MDc0MDc0MDc0MDc0MDMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjc0MDc0MDc0MDc0MDc0MDciIHk9IjMuMCIgY3AxeD0iMS43NDA3NDA3NDA3NDA3NDA3IiBjcDF5PSIzLjAiIGNwMng9IjEuNzQwNzQwNzQwNzQwNzQwNyIgY3AyeT0iMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMS4wIiB5PSIzLjAiIGNwMXg9IjEuMCIgY3AxeT0iMy4wIiBjcDJ4PSIxLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTQuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNC4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMTEuMCIgY3AxeD0iMTQuMCIgY3AxeT0iMTEuMCIgY3AyeD0iMTQuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjEwLjAiIGNwMXg9IjE0LjAiIGNwMXk9IjEwLjAiIGNwMng9IjE0LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS41Nzk5OTk5OTk5OTk5OTciIHk9IjcuMTIwMDAwMDAwMDAwMDA0IiBjcDF4PSIxNS41Nzk5OTk5OTk5OTk5OTciIGNwMXk9IjcuMTIwMDAwMDAwMDAwMDA0IiBjcDJ4PSIxNS41Nzk5OTk5OTk5OTk5OTciIGNwMnk9IjcuMTIwMDAwMDAwMDAwMDA0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuOTAwMDAwMDAwMDAwMDA3IiB5PSI3LjI2MDAwMDAwMDAwMDAwNCIgY3AxeD0iMTUuOTAwMDAwMDAwMDAwMDA3IiBjcDF5PSI3LjI2MDAwMDAwMDAwMDAwNCIgY3AyeD0iMTUuOTAwMDAwMDAwMDAwMDA3IiBjcDJ5PSI3LjI2MDAwMDAwMDAwMDAwNCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEwLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEwLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNS4wIiB5PSIxMS4wIiBjcDF4PSIxNS4wIiBjcDF5PSIxMS4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSIxMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTQuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjE1LjAiIGNwMXg9IjE0LjAiIGNwMXk9IjE1LjAiIGNwMng9IjE0LjAiIGNwMnk9IjE1LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxLjAiIHk9IjE1LjAiIGNwMXg9IjEuMCIgY3AxeT0iMTUuMCIgY3AyeD0iMS4wIiBjcDJ5PSIxNS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxNC4wIiBjcDF4PSIwLjAiIGNwMXk9IjE0LjAiIGNwMng9IjAuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMy4yNTkyNTkyNTkyNTkyNiIgY3AxeD0iMC4wIiBjcDF5PSIzLjI1OTI1OTI1OTI1OTI2IiBjcDJ4PSIwLjAiIGNwMnk9IjMuMjU5MjU5MjU5MjU5MjYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjE4NTE4NTE4NTE4NTE4NTYiIHk9IjAuMCIgY3AxeD0iMy4xODUxODUxODUxODUxODU2IiBjcDF5PSIwLjAiIGNwMng9IjMuMTg1MTg1MTg1MTg1MTg1NiIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIwLjAiIGNwMXg9IjcuMCIgY3AxeT0iMC4wIiBjcDJ4PSI3LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguNTU1NTU1NTU1NTU1NTUiIHk9IjIuMDAwMDAwMDAwMDAwMDAwNCIgY3AxeD0iOC41NTU1NTU1NTU1NTU1NSIgY3AxeT0iMi4wMDAwMDAwMDAwMDAwMDA0IiBjcDJ4PSI4LjU1NTU1NTU1NTU1NTU1IiBjcDJ5PSIyLjAwMDAwMDAwMDAwMDAwMDQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSIyLjAiIGNwMXg9IjEzLjAiIGNwMXk9IjIuMCIgY3AyeD0iMTMuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTQuMCIgeT0iMy4wIiBjcDF4PSIxNC4wIiBjcDF5PSIzLjAiIGNwMng9IjE0LjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE0LjAiIHk9IjYuMCIgY3AxeD0iMTQuMCIgY3AxeT0iNi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSI4LjAiIHgyPSIxMy4wIiB5MT0iMy4wIiB5Mj0iNC4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMTU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9Ii0xMDAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdGFuZ2xlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RhbmdsZSB4MT0iMy4wIiB4Mj0iNy4wIiB5MT0iMS4wIiB5Mj0iMi4wIiByb3VuZGluZz0iMC4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjA1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNjM1NzE0MyIgYnJpZ2h0bmVzc09mZnNldD0iMC40NTA5ODAzNyIgYWxwaGFPZmZzZXQ9Ii01MCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdGFuZ2xlIHgxPSIxLjAiIHgyPSIyLjAiIHkxPSIzLjAiIHkyPSI0LjAiIHJvdW5kaW5nPSIwLjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIxMzAiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MzU3MTQzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQ1MDk4MDM3IiBhbHBoYU9mZnNldD0iLTEyNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWN0YW5nbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncmFkaWVudCBjeWNsZU1ldGhvZD0iTk9fQ1lDTEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3AgcG9zaXRpb249IjAuMCIgbWlkcG9pbnQ9IjAuNSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIyMDIiIGdyZWVuPSIyMTUiIGJsdWU9IjIyOSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzQmFzZSIgaHVlT2Zmc2V0PSIwLjAwNzc2ODA5NDUiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjUxNzgxMDM0IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjM0OTAxOTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI0OCIgZ3JlZW49IjI1MCIgYmx1ZT0iMjUyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDA0NjgxNjQ3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC42MTk4NDEzIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjQzOTIxNTY2IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdG9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC41IiB5MT0iMC4wIiB4Mj0iMC41IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTQuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE0LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIyLjAiIHk9IjE0LjAiIGNwMXg9IjIuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMi4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIxMS4wIiBjcDF4PSIyLjAiIGNwMXk9IjExLjAiIGNwMng9IjIuMCIgY3AyeT0iMTEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjQuMCIgeT0iNi4wIiBjcDF4PSI0LjAiIGNwMXk9IjYuMCIgY3AyeD0iNC4wIiBjcDJ5PSI2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxMy4wIiB5PSI2LjAiIGNwMXg9IjEzLjAiIGNwMXk9IjYuMCIgY3AyeD0iMTMuMCIgY3AyeT0iNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTMuMCIgeT0iMy4wIiBjcDF4PSIxMy4wIiBjcDF5PSIzLjAiIGNwMng9IjEzLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjguMCIgeT0iMy4wIiBjcDF4PSI4LjAiIGNwMXk9IjMuMCIgY3AyeD0iOC4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjIuMCIgY3AxeD0iNy4wIiBjcDF5PSIyLjAiIGNwMng9IjcuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIxLjAiIGNwMXg9IjcuMCIgY3AxeT0iMS4wIiBjcDJ4PSI3LjAiIGNwMnk9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMS4wIiBjcDF4PSIzLjAiIGNwMXk9IjEuMCIgY3AyeD0iMy4wIiBjcDJ5PSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIzLjAiIHk9IjIuMCIgY3AxeD0iMy4wIiBjcDF5PSIyLjAiIGNwMng9IjMuMCIgY3AyeT0iMi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMi4wIiB5PSIzLjAiIGNwMXg9IjIuMCIgY3AxeT0iMy4wIiBjcDJ4PSIyLjAiIGNwMnk9IjMuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMy4wIiBjcDF4PSIxLjAiIGNwMXk9IjMuMCIgY3AyeD0iMS4wIiBjcDJ5PSIzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhZGllbnQgY3ljbGVNZXRob2Q9Ik5PX0NZQ0xFIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjA0MTkxNjE3IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjE3OCIgZ3JlZW49IjE5OCIgYmx1ZT0iMjE2IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjIuOTU2OTg2NEUtNCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuNDU5Nzg4MzgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMjk4MDM5MiIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIHBvc2l0aW9uPSIwLjE2NDY3MDY2IiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEzNCIgZ3JlZW49IjE2MiIgYmx1ZT0iMTg4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzQ4NDgwMjUiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMTg4MjM1MjgiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMC4zMjYzNDczIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjExMSIgZ3JlZW49IjEzOSIgYmx1ZT0iMTY1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCYXNlIiBodWVPZmZzZXQ9IjAuMDAxNTk1MjU4NyIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMzA4NDQxNTgiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMDk4MDM5MjEiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBwb3NpdGlvbj0iMS4wIiBtaWRwb2ludD0iMC41Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9Ijk1IiBncmVlbj0iMTIzIiBibHVlPSIxNDkiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0Jhc2UiIGh1ZU9mZnNldD0iMC4wMDE1OTUyNTg3IiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4yNzMyOTgxNyIgYnJpZ2h0bmVzc09mZnNldD0iMC4wMzUyOTQxMTYiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0b3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyYWRpZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjUiIHkxPSIwLjAiIHgyPSIwLjUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy4wIiB5PSIxNC4wIiBjcDF4PSIzLjAiIGNwMXk9IjE0LjAiIGNwMng9IjMuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuMCIgeT0iMTIuMCIgY3AxeD0iMy4wIiBjcDF5PSIxMi4wIiBjcDJ4PSIzLjAiIGNwMnk9IjEyLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI0LjAiIHk9IjcuMCIgY3AxeD0iNC4wIiBjcDF5PSI3LjAiIGNwMng9IjQuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iNy4wIiBjcDF4PSIxNS4wIiBjcDF5PSI3LjAiIGNwMng9IjE1LjAiIGNwMnk9IjcuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjkuMCIgY3AxeD0iMTUuMCIgY3AxeT0iOS4wIiBjcDJ4PSIxNS4wIiBjcDJ5PSI5LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNC4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNC4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTIxIiBncmVlbj0iMTI2IiBibHVlPSIxMzYiIGFscGhhPSIxNTYiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSItMC4yMSIgYWxwaGFPZmZzZXQ9Ii05OSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjEzLjAiIGNwMXg9IjAuMCIgY3AxeT0iMTMuMCIgY3AyeD0iMC4wIiBjcDJ5PSIxMy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIxNC4wIiBjcDF4PSIwLjAiIGNwMXk9IjE0LjAiIGNwMng9IjAuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjEuMCIgeT0iMTYuMCIgY3AxeD0iMS4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxLjAiIGNwMnk9IjE2LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIxNC4wIiB5PSIxNi4wIiBjcDF4PSIxNC4wIiBjcDF5PSIxNi4wIiBjcDJ4PSIxNC4wIiBjcDJ5PSIxNi4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMTUuMCIgeT0iMTQuMCIgY3AxeD0iMTUuMCIgY3AxeT0iMTQuMCIgY3AyeD0iMTUuMCIgY3AyeT0iMTQuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjE1LjAiIHk9IjEzLjAiIGNwMXg9IjE1LjAiIGNwMXk9IjEzLjAiIGNwMng9IjE1LjAiIGNwMnk9IjEzLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZlODNmNjVjLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgICAgIDx1aUljb25SZWdpb24gbmFtZT0iY29sbGFwc2VkSWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9ImNvbGxhcHNlZEljb24iPgorICAgICAgICAgICAgICAgPGNvbnRlbnRNYXJnaW5zIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8Y2FjaGVTZXR0aW5nc0luaGVyaXRlZD5mYWxzZTwvY2FjaGVTZXR0aW5nc0luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjEwMiIgZ3JlZW49IjEwMiIgYmx1ZT0iMTAyIiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSItMC42MTExMTExIiBzYXR1cmF0aW9uT2Zmc2V0PSItMC4xMTA1MjYzMTYiIGJyaWdodG5lc3NPZmZzZXQ9Ii0wLjM0NTA5ODA1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNi45MTgwMzI3ODY4ODUyNDUiIHk9IjMuNTA4MTk2NzIxMzExNDc1MyIgY3AxeD0iNi45MTgwMzI3ODY4ODUyNDUiIGNwMXk9IjMuNTA4MTk2NzIxMzExNDc1MyIgY3AyeD0iNi45MTgwMzI3ODY4ODUyNDUiIGNwMnk9IjMuNTA4MTk2NzIxMzExNDc1MyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iNy4wIiBjcDF4PSIwLjAiIGNwMXk9IjcuMCIgY3AyeD0iMC4wIiBjcDJ5PSI3LjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlTGF5ZXIgZmlsZU5hbWU9IjExM2ZlNjFjMDcyLnBuZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF5ZXIgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InRlbXBsYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPmZhbHNlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZUxheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgICAgPHN0YXRlIHN0YXRlS2V5cz0iRW5hYmxlZCtTZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgorICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTgiIGhlaWdodD0iNyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4zPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJCdXR0b24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNCbHVlR3JleSIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iMC4yNTQ5MDE5NSIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWludFBvaW50cyB4MT0iMC4yNSIgeTE9IjAuMCIgeDI9IjAuNzUiIHkyPSIxLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMC4wIiB5PSIwLjAiIGNwMXg9IjAuMCIgY3AxeT0iMC4wIiBjcDJ4PSIwLjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjYuOTE4MDMyNzg2ODg1MjQ1IiB5PSIzLjUwODE5NjcyMTMxMTQ3NTMiIGNwMXg9IjYuOTE4MDMyNzg2ODg1MjQ1IiBjcDF5PSIzLjUwODE5NjcyMTMxMTQ3NTMiIGNwMng9IjYuOTE4MDMyNzg2ODg1MjQ1IiBjcDJ5PSIzLjUwODE5NjcyMTMxMTQ3NTMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjcuMCIgY3AxeD0iMC4wIiBjcDF5PSI3LjAiIGNwMng9IjAuMCIgY3AyeT0iNy4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2hhcGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KKyAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgorICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KKyAgICAgICAgICAgICAgIDwvYmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgICAgIDxmb3JlZ3JvdW5kU3RhdGVzLz4KKyAgICAgICAgICAgICAgIDxib3JkZXJTdGF0ZXMvPgorICAgICAgICAgICAgICAgPHJlZ2lvbnMvPgorICAgICAgICAgICAgPC91aUljb25SZWdpb24+CisgICAgICAgICAgICA8dWlJY29uUmVnaW9uIG5hbWU9ImV4cGFuZGVkSWNvbiIgc3VicmVnaW9uPSJ0cnVlIiBrZXk9ImV4cGFuZGVkSWNvbiI+CisgICAgICAgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgPGJhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMTAyIiBncmVlbj0iMTAyIiBibHVlPSIxMDIiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9Ii0wLjYxMTExMTEiIHNhdHVyYXRpb25PZmZzZXQ9Ii0wLjExMDUyNjMxNiIgYnJpZ2h0bmVzc09mZnNldD0iLTAuMzQ1MDk4MDUiIGFscGhhT2Zmc2V0PSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFpbnRQb2ludHMgeDE9IjAuMjUiIHkxPSIwLjAiIHgyPSIwLjc1IiB5Mj0iMS4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjAuMCIgeT0iMC4wIiBjcDF4PSIwLjAiIGNwMXk9IjAuMCIgY3AyeD0iMC4wIiBjcDJ5PSIwLjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSI3LjAiIHk9IjAuMCIgY3AxeD0iNy4wIiBjcDF5PSIwLjAiIGNwMng9IjcuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iMy41NDA5ODM2MDY1NTczNzc0IiB5PSI2Ljk1MDgxOTY3MjEzMTE0NiIgY3AxeD0iMy41NDA5ODM2MDY1NTczNzc0IiBjcDF5PSI2Ljk1MDgxOTY3MjEzMTE0NiIgY3AyeD0iMy41NDA5ODM2MDY1NTczNzc0IiBjcDJ5PSI2Ljk1MDgxOTY3MjEzMTE0NiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb2ludHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVMYXllciBmaWxlTmFtZT0iMTEzZmU2Mjg5ZmEucG5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0idGVtcGxhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+ZmFsc2U8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlTGF5ZXI+CisgICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJFbmFibGVkK1NlbGVjdGVkIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVpcHJvcGVydGllcy8+CisgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplIHdpZHRoPSIxOCIgaGVpZ2h0PSI3Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjM8L25leHRMYXllck5hbWVJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iNSIgYm90dG9tPSI1IiBsZWZ0PSI1IiByaWdodD0iNSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkJ1dHRvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BhY2l0eT4xLjA8L29wYWNpdHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsbE9wYWNpdHk+MS4wPC9maWxsT3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibGVuZGluZ01vZGU+Tk9STUFMPC9ibGVuZGluZ01vZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9ja2VkPmZhbHNlPC9sb2NrZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlzaWJsZT50cnVlPC92aXNpYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYXBlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjU1IiBncmVlbj0iMjU1IiBibHVlPSIyNTUiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9Im5pbWJ1c0JsdWVHcmV5IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iLTAuMTEwNTI2MzE2IiBicmlnaHRuZXNzT2Zmc2V0PSIwLjI1NDkwMTk1IiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhaW50UG9pbnRzIHgxPSIwLjI1IiB5MT0iMC4wIiB4Mj0iMC43NSIgeTI9IjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb2ludCB4PSIwLjAiIHk9IjAuMCIgY3AxeD0iMC4wIiBjcDF5PSIwLjAiIGNwMng9IjAuMCIgY3AyeT0iMC4wIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9pbnQgeD0iNy4wIiB5PSIwLjAiIGNwMXg9IjcuMCIgY3AxeT0iMC4wIiBjcDJ4PSI3LjAiIGNwMnk9IjAuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvaW50IHg9IjMuNTQwOTgzNjA2NTU3Mzc3NCIgeT0iNi45NTA4MTk2NzIxMzExNDYiIGNwMXg9IjMuNTQwOTgzNjA2NTU3Mzc3NCIgY3AxeT0iNi45NTA4MTk2NzIxMzExNDYiIGNwMng9IjMuNTQwOTgzNjA2NTU3Mzc3NCIgY3AyeT0iNi45NTA4MTk2NzIxMzExNDYiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9pbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaGFwZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWZmZWN0cy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xheWVyPgorICAgICAgICAgICAgICAgICAgICAgPC9jYW52YXM+CisgICAgICAgICAgICAgICAgICA8L3N0YXRlPgorICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kU3RhdGVzPgorICAgICAgICAgICAgICAgPGZvcmVncm91bmRTdGF0ZXMvPgorICAgICAgICAgICAgICAgPGJvcmRlclN0YXRlcy8+CisgICAgICAgICAgICAgICA8cmVnaW9ucy8+CisgICAgICAgICAgICA8L3VpSWNvblJlZ2lvbj4KKyAgICAgICAgIDwvcmVnaW9ucz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICAgICA8dWlDb21wb25lbnQgb3BhcXVlPSJ0cnVlIiB0eXBlPSJqYXZheC5zd2luZy5KUm9vdFBhbmUiIG5hbWU9IlJvb3RQYW5lIiB1aT0iUm9vdFBhbmVVSSIgc3VicmVnaW9uPSJmYWxzZSI+CisgICAgICAgICA8c3RhdGVUeXBlcy8+CisgICAgICAgICA8Y29udGVudE1hcmdpbnMgdG9wPSIwIiBib3R0b209IjAiIGxlZnQ9IjAiIHJpZ2h0PSIwIi8+CisgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQvPgorICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgIDxiYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iMjE0IiBncmVlbj0iMjE3IiBibHVlPSIyMjMiIGFscGhhPSIyNTUiIHVpRGVmYXVsdFBhcmVudE5hbWU9ImNvbnRyb2wiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KKyAgICAgICAgICAgIDwvYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxpbmhlcml0LWJhY2tncm91bmQ+ZmFsc2U8L2luaGVyaXQtYmFja2dyb3VuZD4KKyAgICAgICAgICAgIDxjYWNoZVNldHRpbmdzSW5oZXJpdGVkPmZhbHNlPC9jYWNoZVNldHRpbmdzSW5oZXJpdGVkPgorICAgICAgICAgICAgPGNhY2hlTW9kZT5OT19DQUNISU5HPC9jYWNoZU1vZGU+CisgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KKyAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkVuYWJsZWQiPgorICAgICAgICAgICAgICAgPHN0eWxlPgorICAgICAgICAgICAgICAgICAgPHRleHRGb3JlZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgIDx0ZXh0QmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8YmFja2dyb3VuZC8+CisgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KKyAgICAgICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgICAgICA8Y2FudmFzPgorICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgorICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+CisgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjUiIGJvdHRvbT0iNSIgbGVmdD0iNSIgcmlnaHQ9IjUiLz4KKyAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KKyAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KKyAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgorICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+CisgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KKyAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KKyAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+CisgICAgICAgICAgICAgICA8L2NhbnZhcz4KKyAgICAgICAgICAgIDwvc3RhdGU+CisgICAgICAgICA8L2JhY2tncm91bmRTdGF0ZXM+CisgICAgICAgICA8Zm9yZWdyb3VuZFN0YXRlcy8+CisgICAgICAgICA8Ym9yZGVyU3RhdGVzLz4KKyAgICAgICAgIDxyZWdpb25zLz4KKyAgICAgIDwvdWlDb21wb25lbnQ+CisgICA8L2NvbXBvbmVudHM+Cis8L3N5bnRoTW9kZWw+CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aEFycm93QnV0dG9uLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aEFycm93QnV0dG9uLmphdmEKaW5kZXggMzNhZGZjNS4uZWRmZDg5NiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhBcnJvd0J1dHRvbi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoQXJyb3dCdXR0b24uamF2YQpAQCAtMTEzLDYgKzExMywzMSBAQAogICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN0eWxlKCkuZ2V0SW50KGNvbnRleHQsICJBcnJvd0J1dHRvbi5zaXplIiwgMTYpOwogICAgICAgICAgICAgICAgIGRpbSA9IG5ldyBEaW1lbnNpb24oc2l6ZSwgc2l6ZSk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBzY2FsaW5nIGZvciBzaXplVmFyaWVudHMgZm9yIHNwZWNpYWwgY2FzZSBjb21wb25lbnRzLiBUaGUKKyAgICAgICAgICAgIC8vIGtleSAiSkNvbXBvbmVudC5zaXplVmFyaWFudCIgc2NhbGVzIGZvciBsYXJnZS9zbWFsbC9taW5pCisgICAgICAgICAgICAvLyBjb21wb25lbnRzIGFyZSBiYXNlZCBvbiBBcHBsZXMgTEFGCisgICAgICAgICAgICBDb250YWluZXIgcGFyZW50ID0gY29udGV4dC5nZXRDb21wb25lbnQoKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBKQ29tcG9uZW50ICYmICEocGFyZW50IGluc3RhbmNlb2YgSkNvbWJvQm94KSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBzY2FsZUtleSA9ICgoSkNvbXBvbmVudClwYXJlbnQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xpZW50UHJvcGVydHkoIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiKTsKKyAgICAgICAgICAgICAgICBpZiAoc2NhbGVLZXkgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIGlmICgibGFyZ2UiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgICAgICAgICAgZGltID0gbmV3IERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGltLndpZHRoICogMS4xNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGRpbS5oZWlnaHQgKiAxLjE1KSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNtYWxsIi5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpbSA9IG5ldyBEaW1lbnNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGRpbS53aWR0aCAqIDAuODU3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGltLmhlaWdodCAqIDAuODU3KSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbmkiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgICAgICAgICAgZGltID0gbmV3IERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGltLndpZHRoICogMC43MTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShkaW0uaGVpZ2h0ICogMC43MTQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY29udGV4dC5kaXNwb3NlKCk7CiAgICAgICAgICAgICByZXR1cm4gZGltOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aENvbWJvQm94VUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoQ29tYm9Cb3hVSS5qYXZhCmluZGV4IDZiOGQ0YmJjLi43Njg3YTBkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aENvbWJvQm94VUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aENvbWJvQm94VUkuamF2YQpAQCAtMjksMTYgKzI5LDExIEBACiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwogaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguYWNjZXNzaWJpbGl0eS4qOwotaW1wb3J0IGphdmF4LnN3aW5nLkZvY3VzTWFuYWdlcjsKIGltcG9ydCBqYXZheC5zd2luZy5wbGFmLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLio7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC4qOwogaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi5iYXNpYy4qOwogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgc3VuLmF3dC5BcHBDb250ZXh0OwogaW1wb3J0IHN1bi5zd2luZy5wbGFmLnN5bnRoLlN5bnRoVUk7CiAKIC8qKgpAQCAtNTEsMTEgKzQ2LDkzIEBACiAgICAgcHJpdmF0ZSBTeW50aFN0eWxlIHN0eWxlOwogICAgIHByaXZhdGUgYm9vbGVhbiB1c2VMaXN0Q29sb3JzOwogCisgICAgLyoqCisgICAgICogVXNlZCB0byBhZGp1c3QgdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIHRoZSBwb3B1cC4gVmVyeSB1c2VmdWwgZm9yCisgICAgICogc2l0dWF0aW9ucyBzdWNoIGFzIHdlIGZpbmQgaW4gTmltYnVzIHdoZXJlIHBhcnQgb2YgdGhlIGJvcmRlciBpcyB1c2VkCisgICAgICogdG8gcGFpbnQgdGhlIGZvY3VzLiBJbiBzdWNoIGNhc2VzLCB0aGUgYm9yZGVyIGlzIGVtcHR5IHNwYWNlLCBhbmQgbm90CisgICAgICogcGFydCBvZiB0aGUgInZpc3VhbCIgYm9yZGVyLCBhbmQgaW4gdGhlc2UgY2FzZXMsIHlvdSdkIGxpa2UgdGhlIHBvcHVwCisgICAgICogdG8gYmUgYWRqdXN0ZWQgc3VjaCB0aGF0IGl0IGxvb2tzIGFzIGlmIGl0IHdlcmUgbmV4dCB0byB0aGUgdmlzdWFsIGJvcmRlci4KKyAgICAgKiBZb3UgbWF5IHdhbnQgdG8gdXNlIG5lZ2F0aXZlIGluc2V0cyB0byBnZXQgdGhlIHJpZ2h0IGxvb2suCisgICAgICovCisgICAgSW5zZXRzIHBvcHVwSW5zZXRzOworCisgICAgLyoqCisgICAgICogVGhpcyBmbGFnIG1heSBiZSBzZXQgdmlhIFVJRGVmYXVsdHMuIEJ5IGRlZmF1bHQsIGl0IGlzIGZhbHNlLCB0bworICAgICAqIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZiB0cnVlLCB0aGVuIHRoZSBjb21ibyB3aWxsCisgICAgICogImFjdCBhcyBhIGJ1dHRvbiIgd2hlbiBpdCBpcyBub3QgZWRpdGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGJ1dHRvbldoZW5Ob3RFZGl0YWJsZTsKKworICAgIC8qKgorICAgICAqIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21ibyBib3ggYW5kIGNvbWJvIGJveCBidXR0b24gc2hvdWxkCisgICAgICogcmVtYWluIGluIHRoZSBQUkVTU0VEIHN0YXRlIHdoaWxlIHRoZSBjb21ibyBwb3B1cCBpcyB2aXNpYmxlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwcmVzc2VkV2hlblBvcHVwVmlzaWJsZTsKKworICAgIC8qKgorICAgICAqIFdoZW4gYnV0dG9uV2hlbk5vdEVkaXRhYmxlIGlzIHRydWUsIHRoaXMgZmllbGQgaXMgdXNlZCB0byBoZWxwIG1ha2UKKyAgICAgKiB0aGUgY29tYm8gYm94IGFwcGVhciBhbmQgZnVuY3Rpb24gYXMgYSBidXR0b24gd2hlbiB0aGUgY29tYm8gYm94IGlzCisgICAgICogbm90IGVkaXRhYmxlLiBJbiBzdWNoIGEgc3RhdGUsIHlvdSBjYW4gY2xpY2sgYW55d2hlcmUgb24gdGhlIGJ1dHRvbgorICAgICAqIHRvIGdldCBpdCB0byBvcGVuIHRoZSBwb3B1cC4gQWxzbywgYW55d2hlcmUgeW91IGhvdmVyIG92ZXIgdGhlIGNvbWJvCisgICAgICogd2lsbCBjYXVzZSB0aGUgZW50aXJlIGNvbWJvIHRvIGdvIGludG8gInJvbGxvdmVyIiBzdGF0ZSwgYW5kIGFueXdoZXJlCisgICAgICogeW91IHByZXNzIHdpbGwgZ28gaW50byAicHJlc3NlZCIgc3RhdGUuIFRoaXMgYWxzbyBrZWVwcyBpbiBzeW5jIHRoZQorICAgICAqIHN0YXRlIG9mIHRoZSBjb21ibyBhbmQgdGhlIGFycm93QnV0dG9uLgorICAgICAqLworICAgIHByaXZhdGUgQnV0dG9uSGFuZGxlciBidXR0b25IYW5kbGVyOworCisgICAgLyoqCisgICAgICogSGFuZGxlciBmb3IgcmVwYWludGluZyBjb21ibyB3aGVuIGVkaXRvciBjb21wb25lbnQgZ2FpbnMvbG9vc2VzIGZvY3VzCisgICAgICovCisgICAgcHJpdmF0ZSBFZGl0b3JGb2N1c0hhbmRsZXIgZWRpdG9yRm9jdXNIYW5kbGVyOworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlbiB0aGUgY2VsbCByZW5kZXJlciB3aWxsIGJlIGZvcmNlZCB0byBiZSBub24tb3BhcXVlIHdoZW4KKyAgICAgKiB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHNlbGVjdGVkIGl0ZW0gaW4gdGhlIGNvbWJvIGJveCAobm90IGluIHRoZSBsaXN0KSwKKyAgICAgKiBhbmQgZm9yY2VkIHRvIG9wYXF1ZSBhZnRlciByZW5kZXJpbmcgdGhlIHNlbGVjdGVkIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZU9wYXF1ZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTk9URTogVGhpcyBzZXJ2ZXMgdGhlIHNhbWUgcHVycG9zZSBhcyB0aGUgc2FtZSBmaWVsZCBpbiBCYXNpY0NvbWJvQm94VUkuCisgICAgICogSXQgaXMgaGVyZSBiZWNhdXNlIEkgY291bGQgbm90IGdpdmUgdGhlIHBhZGRpbmcgZmllbGQgaW4KKyAgICAgKiBCYXNpY0NvbWJvQm94VUkgcHJvdGVjdGVkIGFjY2VzcyBpbiBhbiB1cGRhdGUgcmVsZWFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEluc2V0cyBwYWRkaW5nOworCiAgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnRVSSBjcmVhdGVVSShKQ29tcG9uZW50IGMpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTeW50aENvbWJvQm94VUkoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqCisgICAgICogT3ZlcnJpZGRlbiB0byBlbnN1cmUgdGhhdCBCdXR0b25IYW5kbGVyIGlzIGNyZWF0ZWQgcHJpb3IgdG8gYW55IG9mCisgICAgICogdGhlIG90aGVyIGluc3RhbGxYWFggbWV0aG9kcywgc2luY2Ugc2V2ZXJhbCBvZiB0aGVtIHJlZmVyZW5jZQorICAgICAqIGJ1dHRvbkhhbmRsZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5zdGFsbFVJKEpDb21wb25lbnQgYykgeworICAgICAgICBidXR0b25IYW5kbGVyID0gbmV3IEJ1dHRvbkhhbmRsZXIoKTsKKyAgICAgICAgc3VwZXIuaW5zdGFsbFVJKGMpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGluc3RhbGxEZWZhdWx0cygpIHsKKyAgICAgICAgLy9OT1RFOiBUaGlzIG5leHQgbGluZSBvZiBjb2RlIHdhcyBhZGRlZCBiZWNhdXNlLCBzaW5jZSBzcXVhcmVCdXR0b24gaW4KKyAgICAgICAgLy9CYXNpY0NvbWJvQm94VUkgaXMgcHJpdmF0ZSwgSSBuZWVkIHRvIGhhdmUgc29tZSB3YXkgb2YgcmVhZGluZyBpdCBmcm9tIFVJTWFuYWdlci4KKyAgICAgICAgLy9UaGlzIGlzIGFuIGluY29tcGxldGUgc29sdXRpb24gKHNpbmNlIGl0IGltcGxpZXMgdGhhdCBzcXVhcmVCdXRvbnMsCisgICAgICAgIC8vb25jZSBzZXQsIGNhbm5vdCBiZSByZXNldCBwZXIgc3RhdGUuIFByb2JhYmx5IG9rLCBidXQgbm90IGFsd2F5cyBvaykuCisgICAgICAgIC8vVGhpcyBsaW5lIG9mIGNvZGUgc2hvdWxkIGJlIHJlbW92ZWQgYXQgdGhlIHNhbWUgdGltZSB0aGF0IHNxdWFyZUJ1dHRvbgorICAgICAgICAvL2lzIG1hZGUgcHJvdGVjdGVkIGluIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgICAgc3VwZXIuaW5zdGFsbERlZmF1bHRzKCk7CisKKyAgICAgICAgLy9UaGlzIGlzIGhlcmUgaW5zdGVhZCBvZiBpbiB1cGRhdGVTdHlsZSBiZWNhdXNlIHRoZSB2YWx1ZSBmb3IgcGFkZGluZworICAgICAgICAvL25lZWRzIHRvIHJlbWFpbiBjb25zaXN0ZW50IHdpdGggdGhlIHZhbHVlIGZvciBwYWRkaW5nIGluCisgICAgICAgIC8vQmFzaWNDb21ib0JveFVJLiBJIHdvdWxkbid0IGhhdmUgdGhpcyB2YWx1ZSBoZXJlIGF0IGFsbCBpZiBub3QKKyAgICAgICAgLy9mb3IgdGhlIGZhY3QgdGhhdCBJIGNhbm5vdCBtYWtlICJwYWRkaW5nIiBwcm90ZWN0ZWQgaW4gYW55IHdheQorICAgICAgICAvL2ZvciBhbiB1cGRhdGUgcmVsZWFzZS4gVGhpcyAqc2hvdWxkKiBiZSBmaXhlZCBpbiBKYXZhIDcKKyAgICAgICAgcGFkZGluZyA9IFVJTWFuYWdlci5nZXRJbnNldHMoIkNvbWJvQm94LnBhZGRpbmciKTsKKwogICAgICAgICB1cGRhdGVTdHlsZShjb21ib0JveCk7CiAgICAgfQogCkBAIC02NSwxMiArMTQyLDIwIEBACiAKICAgICAgICAgc3R5bGUgPSBTeW50aExvb2tBbmRGZWVsLnVwZGF0ZVN0eWxlKGNvbnRleHQsIHRoaXMpOwogICAgICAgICBpZiAoc3R5bGUgIT0gb2xkU3R5bGUpIHsKKyAgICAgICAgICAgIHBvcHVwSW5zZXRzID0gKEluc2V0cylzdHlsZS5nZXQoY29udGV4dCwgIkNvbWJvQm94LnBvcHVwSW5zZXRzIik7CiAgICAgICAgICAgICB1c2VMaXN0Q29sb3JzID0gc3R5bGUuZ2V0Qm9vbGVhbihjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21ib0JveC5yZW5kZXJlclVzZUxpc3RDb2xvcnMiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgIkNvbWJvQm94LnJlbmRlcmVyVXNlTGlzdENvbG9ycyIsIHRydWUpOworICAgICAgICAgICAgYnV0dG9uV2hlbk5vdEVkaXRhYmxlID0gc3R5bGUuZ2V0Qm9vbGVhbihjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAiQ29tYm9Cb3guYnV0dG9uV2hlbk5vdEVkaXRhYmxlIiwgZmFsc2UpOworICAgICAgICAgICAgcHJlc3NlZFdoZW5Qb3B1cFZpc2libGUgPSBzdHlsZS5nZXRCb29sZWFuKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICJDb21ib0JveC5wcmVzc2VkV2hlblBvcHVwVmlzaWJsZSIsIGZhbHNlKTsKKwogICAgICAgICAgICAgaWYgKG9sZFN0eWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB1bmluc3RhbGxLZXlib2FyZEFjdGlvbnMoKTsKICAgICAgICAgICAgICAgICBpbnN0YWxsS2V5Ym9hcmRBY3Rpb25zKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JjZU9wYXF1ZSA9IHN0eWxlLmdldEJvb2xlYW4oY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIkNvbWJvQm94LmZvcmNlT3BhcXVlIiwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGNvbnRleHQuZGlzcG9zZSgpOwogCkBAIC03OSwxMSArMTY0LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsTGlzdGVuZXJzKCkgewogICAgICAgICBjb21ib0JveC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBjb21ib0JveC5hZGRNb3VzZUxpc3RlbmVyKGJ1dHRvbkhhbmRsZXIpOworICAgICAgICBlZGl0b3JGb2N1c0hhbmRsZXIgPSBuZXcgRWRpdG9yRm9jdXNIYW5kbGVyKGNvbWJvQm94KTsKICAgICAgICAgc3VwZXIuaW5zdGFsbExpc3RlbmVycygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVuaW5zdGFsbFVJKEpDb21wb25lbnQgYykgeworICAgICAgICBpZiAocG9wdXAgaW5zdGFuY2VvZiBTeW50aENvbWJvUG9wdXApIHsKKyAgICAgICAgICAgICgoU3ludGhDb21ib1BvcHVwKXBvcHVwKS5yZW1vdmVQb3B1cE1lbnVMaXN0ZW5lcihidXR0b25IYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci51bmluc3RhbGxVSShjKTsKKyAgICAgICAgYnV0dG9uSGFuZGxlciA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdW5pbnN0YWxsRGVmYXVsdHMoKSB7CiAgICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChjb21ib0JveCwgRU5BQkxFRCk7CiAKQEAgLTkyLDExICsxOTAsMTcgQEAKICAgICAgICAgc3R5bGUgPSBudWxsOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHVuaW5zdGFsbExpc3RlbmVycygpIHsKKyAgICAgICAgZWRpdG9yRm9jdXNIYW5kbGVyLnVucmVnaXN0ZXIoKTsKICAgICAgICAgY29tYm9Cb3gucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgY29tYm9Cb3gucmVtb3ZlTW91c2VMaXN0ZW5lcihidXR0b25IYW5kbGVyKTsKKyAgICAgICAgYnV0dG9uSGFuZGxlci5wcmVzc2VkID0gZmFsc2U7CisgICAgICAgIGJ1dHRvbkhhbmRsZXIub3ZlciA9IGZhbHNlOwogICAgICAgICBzdXBlci51bmluc3RhbGxMaXN0ZW5lcnMoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3ludGhDb250ZXh0IGdldENvbnRleHQoSkNvbXBvbmVudCBjKSB7CiAgICAgICAgIHJldHVybiBnZXRDb250ZXh0KGMsIGdldENvbXBvbmVudFN0YXRlKGMpKTsKICAgICB9CkBAIC0xMTEsMTggKzIxNSw1NiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldENvbXBvbmVudFN0YXRlKEpDb21wb25lbnQgYykgewotICAgICAgICByZXR1cm4gU3ludGhMb29rQW5kRmVlbC5nZXRDb21wb25lbnRTdGF0ZShjKTsKKyAgICAgICAgLy8gY3VycmVudGx5IHdlIGhhdmUgYSBicm9rZW4gc2l0dWF0aW9uIHdoZXJlIGlmIGEgZGV2ZWxvcGVyCisgICAgICAgIC8vIHRha2VzIHRoZSBib3JkZXIgZnJvbSBhIEpDb21ib0JveCBhbmQgc2V0cyBpdCBvbiBhIEpUZXh0RmllbGQKKyAgICAgICAgLy8gdGhlbiB0aGUgY29kZXBhdGggd2lsbCBldmVudHVhbGx5IGxlYWQgYmFjayB0byB0aGlzIG1ldGhvZAorICAgICAgICAvLyBidXQgcGFzcyBpbiBhIEpUZXh0RmllbGQgaW5zdGVhZCBvZiBKQ29tYm9Cb3ghIEluIGNhc2UgdGhpcworICAgICAgICAvLyBoYXBwZW5zLCB3ZSBqdXN0IHJldHVybiB0aGUgbm9ybWFsIHN5bnRoIHN0YXRlIGZvciB0aGUgY29tcG9uZW50CisgICAgICAgIC8vIGluc3RlYWQgb2YgZG9pbmcgYW55dGhpbmcgc3BlY2lhbAorICAgICAgICBpZiAoIShjIGluc3RhbmNlb2YgSkNvbWJvQm94KSkgcmV0dXJuIFN5bnRoTG9va0FuZEZlZWwuZ2V0Q29tcG9uZW50U3RhdGUoYyk7CisKKyAgICAgICAgSkNvbWJvQm94IGJveCA9IChKQ29tYm9Cb3gpYzsKKyAgICAgICAgaWYgKHNob3VsZEFjdExpa2VCdXR0b24oKSkgeworICAgICAgICAgICAgaW50IHN0YXRlID0gRU5BQkxFRDsKKyAgICAgICAgICAgIGlmICgoIWMuaXNFbmFibGVkKCkpKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBESVNBQkxFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidXR0b25IYW5kbGVyLmlzUHJlc3NlZCgpKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgfD0gUFJFU1NFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidXR0b25IYW5kbGVyLmlzUm9sbG92ZXIoKSkgeworICAgICAgICAgICAgICAgIHN0YXRlIHw9IE1PVVNFX09WRVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYm94LmlzRm9jdXNPd25lcigpKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgfD0gRk9DVVNFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZvciBlZGl0YWJsZSBjb21ib3MgdGhlIGVkaXRvciBjb21wb25lbnQgaGFzIHRoZSBmb2N1cyBub3QgdGhlCisgICAgICAgICAgICAvLyBjb21ibyBib3ggaXRzIHNlbGYsIHNvIHdlIHNob3VsZCBtYWtlIHRoZSBjb21ibyBwYWludCBmb2N1c2VkCisgICAgICAgICAgICAvLyB3aGVuIGl0cyBlZGl0b3IgaGFzIGZvY3VzCisgICAgICAgICAgICBpbnQgYmFzaWNTdGF0ZSA9IFN5bnRoTG9va0FuZEZlZWwuZ2V0Q29tcG9uZW50U3RhdGUoYyk7CisgICAgICAgICAgICBpZiAoYm94LmlzRWRpdGFibGUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgYm94LmdldEVkaXRvcigpLmdldEVkaXRvckNvbXBvbmVudCgpLmlzRm9jdXNPd25lcigpKSB7CisgICAgICAgICAgICAgICAgYmFzaWNTdGF0ZSB8PSBGT0NVU0VEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJhc2ljU3RhdGU7CisgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQ29tYm9Qb3B1cCBjcmVhdGVQb3B1cCgpIHsKLSAgICAgICAgU3ludGhDb21ib1BvcHVwIHBvcHVwID0gbmV3IFN5bnRoQ29tYm9Qb3B1cCggY29tYm9Cb3ggKTsKLSAgICAgICAgcmV0dXJuIHBvcHVwOworICAgICAgICBTeW50aENvbWJvUG9wdXAgcCA9IG5ldyBTeW50aENvbWJvUG9wdXAoY29tYm9Cb3gpOworICAgICAgICBwLmFkZFBvcHVwTWVudUxpc3RlbmVyKGJ1dHRvbkhhbmRsZXIpOworICAgICAgICByZXR1cm4gcDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgTGlzdENlbGxSZW5kZXJlciBjcmVhdGVSZW5kZXJlcigpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTeW50aENvbWJvQm94UmVuZGVyZXIoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQ29tYm9Cb3hFZGl0b3IgY3JlYXRlRWRpdG9yKCkgewogICAgICAgICByZXR1cm4gbmV3IFN5bnRoQ29tYm9Cb3hFZGl0b3IoKTsKICAgICB9CkBAIC0xMzEsMjIgKzI3MywyNSBAQAogICAgIC8vIGVuZCBVSSBJbml0aWFsaXphdGlvbgogICAgIC8vPT09PT09PT09PT09PT09PT09PT09PQogCi0KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKICAgICAgICAgaWYgKFN5bnRoTG9va0FuZEZlZWwuc2hvdWxkVXBkYXRlU3R5bGUoZSkpIHsKICAgICAgICAgICAgIHVwZGF0ZVN0eWxlKGNvbWJvQm94KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBKQnV0dG9uIGNyZWF0ZUFycm93QnV0dG9uKCkgewogICAgICAgICBTeW50aEFycm93QnV0dG9uIGJ1dHRvbiA9IG5ldyBTeW50aEFycm93QnV0dG9uKFN3aW5nQ29uc3RhbnRzLlNPVVRIKTsKICAgICAgICAgYnV0dG9uLnNldE5hbWUoIkNvbWJvQm94LmFycm93QnV0dG9uIik7CisgICAgICAgIGJ1dHRvbi5zZXRNb2RlbChidXR0b25IYW5kbGVyKTsKICAgICAgICAgcmV0dXJuIGJ1dHRvbjsKICAgICB9CiAKICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIC8vIGJlZ2luIENvbXBvbmVudFVJIEltcGxlbWVudGF0aW9uCiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoR3JhcGhpY3MgZywgSkNvbXBvbmVudCBjKSB7CiAgICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChjKTsKIApAQCAtMTU3LDYgKzMwMiw3IEBACiAgICAgICAgIGNvbnRleHQuZGlzcG9zZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcsIEpDb21wb25lbnQgYykgewogICAgICAgICBTeW50aENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoYyk7CiAKQEAgLTE3MiwzMyArMzE4LDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwYWludEJvcmRlcihTeW50aENvbnRleHQgY29udGV4dCwgR3JhcGhpY3MgZywgaW50IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksIGludCB3LCBpbnQgaCkgewogICAgICAgICBjb250ZXh0LmdldFBhaW50ZXIoKS5wYWludENvbWJvQm94Qm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogUGFpbnRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwYWludEN1cnJlbnRWYWx1ZShHcmFwaGljcyBnLFJlY3RhbmdsZSBib3VuZHMsYm9vbGVhbiBoYXNGb2N1cykgewogICAgICAgICBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyID0gY29tYm9Cb3guZ2V0UmVuZGVyZXIoKTsKICAgICAgICAgQ29tcG9uZW50IGM7CiAKLSAgICAgICAgaWYgKCBoYXNGb2N1cyAmJiAhaXNQb3B1cFZpc2libGUoY29tYm9Cb3gpICkgewotICAgICAgICAgICAgYyA9IHJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoIGxpc3RCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGMgPSByZW5kZXJlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KCBsaXN0Qm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvQm94LmdldFNlbGVjdGVkSXRlbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIH0KKyAgICAgICAgYyA9IHJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoCisgICAgICAgICAgICAgICAgbGlzdEJveCwgY29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCksIC0xLCBmYWxzZSwgZmFsc2UgKTsKKwogICAgICAgICAvLyBGaXggZm9yIDQyMzg4Mjk6IHNob3VsZCBsYXkgb3V0IHRoZSBKUGFuZWwuCiAgICAgICAgIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUgPSBmYWxzZTsKICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBKUGFuZWwpICB7CkBAIC0yMDcsMzYgKzM0Myw4OCBAQAogCiAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkgewogICAgICAgICAgICAgYy5zZXROYW1lKCJDb21ib0JveC5yZW5kZXJlciIpOwotICAgICAgICAgICAgY3VycmVudFZhbHVlUGFuZS5wYWludENvbXBvbmVudChnLGMsY29tYm9Cb3gsYm91bmRzLngsYm91bmRzLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLndpZHRoLGJvdW5kcy5oZWlnaHQsIHNob3VsZFZhbGlkYXRlKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZVBhbmUucGFpbnRDb21wb25lbnQoZyxjLGNvbWJvQm94LGJvdW5kcy54LGJvdW5kcy55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy53aWR0aCxib3VuZHMuaGVpZ2h0LCBzaG91bGRWYWxpZGF0ZSk7CisKKyAgICAgICAgYm9vbGVhbiBmb3JjZSA9IGZvcmNlT3BhcXVlICYmIGMgaW5zdGFuY2VvZiBKQ29tcG9uZW50OworICAgICAgICBpZiAoZm9yY2UpIHsKKyAgICAgICAgICAgICgoSkNvbXBvbmVudCljKS5zZXRPcGFxdWUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHggPSBib3VuZHMueCwgeSA9IGJvdW5kcy55LCB3ID0gYm91bmRzLndpZHRoLCBoID0gYm91bmRzLmhlaWdodDsKKyAgICAgICAgaWYgKHBhZGRpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCA9IGJvdW5kcy54ICsgcGFkZGluZy5sZWZ0OworICAgICAgICAgICAgeSA9IGJvdW5kcy55ICsgcGFkZGluZy50b3A7CisgICAgICAgICAgICB3ID0gYm91bmRzLndpZHRoIC0gKHBhZGRpbmcubGVmdCArIHBhZGRpbmcucmlnaHQpOworICAgICAgICAgICAgaCA9IGJvdW5kcy5oZWlnaHQgLSAocGFkZGluZy50b3AgKyBwYWRkaW5nLmJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50VmFsdWVQYW5lLnBhaW50Q29tcG9uZW50KGcsIGMsIGNvbWJvQm94LCB4LCB5LCB3LCBoLCBzaG91bGRWYWxpZGF0ZSk7CisKKyAgICAgICAgaWYgKGZvcmNlKSB7CisgICAgICAgICAgICAoKEpDb21wb25lbnQpYykuc2V0T3BhcXVlKHRydWUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY29tYm8gYm94IHNob3VsZCBhY3QgYXMgb25lIGJpZyBidXR0b24uIFR5cGljYWxseQorICAgICAqIG9ubHkgaGFwcGVucyB3aGVuIGJ1dHRvbldoZW5Ob3RFZGl0YWJsZSBpcyB0cnVlLCBhbmQgY29tYm9Cb3guaXNFZGl0YWJsZQorICAgICAqIGlzIGZhbHNlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRBY3RMaWtlQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gYnV0dG9uV2hlbk5vdEVkaXRhYmxlICYmICFjb21ib0JveC5pc0VkaXRhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHNpemUgb2YgYW4gZW1wdHkgZGlzcGxheSBhcmVhIG9mIHRoZSBjb21ibyBib3ggdXNpbmcKKyAgICAgKiB0aGUgY3VycmVudCByZW5kZXJlciBhbmQgZm9udC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdhcyBvdmVycmlkZGVuIHRvIHVzZSBTeW50aENvbWJvQm94UmVuZGVyZXIgaW5zdGVhZCBvZgorICAgICAqIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyIGFzIHRoZSBkZWZhdWx0IHJlbmRlcmVyIHdoZW4gY2FsY3VsYXRpbmcgdGhlCisgICAgICogc2l6ZSBvZiB0aGUgY29tYm8gYm94LiBUaGlzIGlzIHVzZWQgaW4gdGhlIGNhc2Ugb2YgdGhlIGNvbWJvIG5vdCBoYXZpbmcKKyAgICAgKiBhbnkgZGF0YS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgYW4gZW1wdHkgZGlzcGxheSBhcmVhCisgICAgICogQHNlZSAjZ2V0RGlzcGxheVNpemUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGdldERlZmF1bHRTaXplKCkgeworICAgICAgICBTeW50aENvbWJvQm94UmVuZGVyZXIgciA9IG5ldyBTeW50aENvbWJvQm94UmVuZGVyZXIoKTsKKyAgICAgICAgRGltZW5zaW9uIGQgPSBnZXRTaXplRm9yQ29tcG9uZW50KHIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0Qm94LCAiICIsIC0xLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24oZC53aWR0aCwgZC5oZWlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaGFzIGJlZW4gcmVmYWN0b3JlZCBvdXQgaW4gaG9wZXMgdGhhdCBpdCBtYXkgYmUgaW52ZXN0aWdhdGVkIGFuZAorICAgICAqIHNpbXBsaWZpZWQgZm9yIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIGFkZGluZy9yZW1vdmluZworICAgICAqIHRoZSBjb21wb25lbnQgdG8gdGhlIGN1cnJlbnRWYWx1ZVBhbmUgYW5kIGNoYW5naW5nIHRoZSBmb250IG1heSBiZQorICAgICAqIHJlZHVuZGFudCBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogTk9URTogVGhpcyBtZXRob2Qgd2FzIGNvcGllZCBpbiBpdHMgZW50aXJldHkgZnJvbSBCYXNpY0NvbWJvQm94VUkuIE1pZ2h0CisgICAgICogd2FudCB0byBtYWtlIGl0IHByb3RlY3RlZCBpbiBCYXNpY0NvbWJvQm94VUkgaW4gSmF2YSA3CisgICAgICovCisgICAgcHJpdmF0ZSBEaW1lbnNpb24gZ2V0U2l6ZUZvckNvbXBvbmVudChDb21wb25lbnQgY29tcCkgeworICAgICAgICBjdXJyZW50VmFsdWVQYW5lLmFkZChjb21wKTsKKyAgICAgICAgY29tcC5zZXRGb250KGNvbWJvQm94LmdldEZvbnQoKSk7CisgICAgICAgIERpbWVuc2lvbiBkID0gY29tcC5nZXRQcmVmZXJyZWRTaXplKCk7CisgICAgICAgIGN1cnJlbnRWYWx1ZVBhbmUucmVtb3ZlKGNvbXApOworICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBGcm9tIEJhc2ljQ29tYm9Cb3hSZW5kZXJlciB2IDEuMTguCisgICAgICoKKyAgICAgKiBCZSBhd2FyZSB0aGF0IFN5bnRoRmlsZUNob29zZXJVSUltcGwgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIGRlZmF1bHQKKyAgICAgKiByZW5kZXJlciBpbnN0YWxsZWQgb24gYSBTeW50aCBjb21ibyBib3ggaXMgYSBKTGFiZWwuIElmIHRoaXMgaXMgY2hhbmdlZCwKKyAgICAgKiB0aGVuIGFuIGFzc2VydCB3aWxsIGZhaWwgaW4gU3ludGhGaWxlQ2hvb3NlclVJSW1wbAogICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgU3ludGhDb21ib0JveFJlbmRlcmVyIGV4dGVuZHMgSkxhYmVsIGltcGxlbWVudHMgTGlzdENlbGxSZW5kZXJlciwgVUlSZXNvdXJjZSB7CiAgICAgICAgIHB1YmxpYyBTeW50aENvbWJvQm94UmVuZGVyZXIoKSB7CiAgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgc2V0TmFtZSgiQ29tYm9Cb3gucmVuZGVyZXIiKTsKICAgICAgICAgICAgIHNldFRleHQoIiAiKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIC8vIEFzIFN5bnRoQ29tYm9Cb3hSZW5kZXJlcidzIGFyZSBhc2tlZCBmb3IgYSBzaXplIEJFRk9SRSB0aGV5Ci0gICAgICAgICAgICAvLyBhcmUgcGFyZW50ZWQgZ2V0TmFtZSBpcyBvdmVycmlkZW4gdG8gZm9yY2UgdGhlIG5hbWUgdG8gYmUKLSAgICAgICAgICAgIC8vIENvbWJvQm94LnJlbmRlcmVyIGlmIGl0IGlzbid0IHNldC4gSWYgd2UgZGlkbid0IGRvIHRoaXMgdGhlCi0gICAgICAgICAgICAvLyB3cm9uZyBzdHlsZSBjb3VsZCBiZSB1c2VkIGZvciBzaXplIGNhbGN1bGF0aW9ucy4KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gc3VwZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiQ29tYm9Cb3gucmVuZGVyZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKICAgICAgICAgICAgIHNldE5hbWUoIkNvbWJvQm94Lmxpc3RSZW5kZXJlciIpOwpAQCAtMjUwLDggKzQzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGhMYWJlbFVJLmNsYXNzKSwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuaXNFbmFibGVkKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2V0QmFja2dyb3VuZChsaXN0LmdldEJhY2tncm91bmQoKSk7CiAgICAgICAgICAgICAgICAgc2V0Rm9yZWdyb3VuZChsaXN0LmdldEZvcmVncm91bmQoKSk7CiAgICAgICAgICAgICB9CkBAIC0yNjEsOCArNDQ4LDcgQEAKICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEljb24pIHsKICAgICAgICAgICAgICAgICBzZXRJY29uKChJY29uKXZhbHVlKTsKICAgICAgICAgICAgICAgICBzZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9ICh2YWx1ZSA9PSBudWxsKSA/ICIgIiA6IHZhbHVlLnRvU3RyaW5nKCk7CiAKICAgICAgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKHRleHQpKSB7CkBAIC0yNzYsMTIgKzQ2MiwxNSBAQAogICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBuZWVkZWQgZm9yIEdUSyBjb21ib2JveGVzLCB3aGVyZSB0aGUKICAgICAgICAgICAgIC8vIExpc3RDZWxsUmVuZGVyZXIncyBzdGF0ZSBkZXRlcm1pbmVzIHRoZSB2aXN1YWwgc3RhdGUKICAgICAgICAgICAgIC8vIG9mIHRoZSBjb21ib2JveC4KLSAgICAgICAgICAgIHNldEVuYWJsZWQoY29tYm9Cb3guaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgc2V0Q29tcG9uZW50T3JpZW50YXRpb24oY29tYm9Cb3guZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7CisgICAgICAgICAgICBpZiAoY29tYm9Cb3ggIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgc2V0RW5hYmxlZChjb21ib0JveC5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgc2V0Q29tcG9uZW50T3JpZW50YXRpb24oY29tYm9Cb3guZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKICAgICAgICAgICAgIHN1cGVyLnBhaW50KGcpOwogICAgICAgICAgICAgU3ludGhMb29rQW5kRmVlbC5yZXNldFNlbGVjdGVkVUkoKTsKQEAgLTMwMiw2ICs0OTEsNyBAQAogICAgICAgICAgICAgZWRpdG9yLnNldE5hbWUoIkNvbWJvQm94LnRleHRGaWVsZCIpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0RWRpdG9yQ29tcG9uZW50KCkgewogICAgICAgICAgICAgcmV0dXJuIGVkaXRvcjsKICAgICAgICAgfQpAQCAtMzExLDYgKzUwMSw3IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBhbk9iamVjdCB0aGUgZGlzcGxheWVkIHZhbHVlIG9mIHRoZSBlZGl0b3IKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRJdGVtKE9iamVjdCBhbk9iamVjdCkgewogICAgICAgICAgICAgU3RyaW5nIHRleHQ7CiAKQEAgLTMyNiw2ICs1MTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbSgpIHsKICAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IGVkaXRvci5nZXRUZXh0KCk7CiAKQEAgLTM0OCwxNyArNTQwLDI2MSBAQAogICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdEFsbCgpIHsKICAgICAgICAgICAgIGVkaXRvci5zZWxlY3RBbGwoKTsKICAgICAgICAgICAgIGVkaXRvci5yZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBhZGRBY3Rpb25MaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsKSB7CiAgICAgICAgICAgICBlZGl0b3IuYWRkQWN0aW9uTGlzdGVuZXIobCk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbCkgewogICAgICAgICAgICAgZWRpdG9yLnJlbW92ZUFjdGlvbkxpc3RlbmVyKGwpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBhbGwgdGhlIGxvZ2ljIGZvciB0cmVhdGluZyB0aGUgY29tYm8gYXMgYSBidXR0b24gd2hlbiBpdCBpcworICAgICAqIG5vdCBlZGl0YWJsZSwgYW5kIHdoZW4gc2hvdWxkQWN0TGlrZUJ1dHRvbigpIGlzIHRydWUuIFRoaXMgY2xhc3MgaXMgYQorICAgICAqIHNwZWNpYWwgQnV0dG9uTW9kZWwsIGFuZCBpbnN0YWxsZWQgb24gdGhlIGFycm93QnV0dG9uIHdoZW4gYXBwcm9wcmlhdGUuCisgICAgICogSXQgYWxzbyBpcyBpbnN0YWxsZWQgYXMgYSBtb3VzZSBsaXN0ZW5lciBhbmQgbW91c2UgbW90aW9uIGxpc3RlbmVyIG9uCisgICAgICogdGhlIGNvbWJvIGJveC4gSW4gdGhpcyB3YXksIHRoZSBzdGF0ZSBiZXR3ZWVuIHRoZSBidXR0b24gYW5kIGNvbWJvCisgICAgICogYXJlIGluIHN5bmMuIFdoZW5ldmVyIG9uZSBpcyAib3ZlciIgYm90aCBhcmUuIFdoZW5ldmVyIG9uZSBpcyBwcmVzc2VkLAorICAgICAqIGJvdGggYXJlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQnV0dG9uSGFuZGxlciBleHRlbmRzIERlZmF1bHRCdXR0b25Nb2RlbAorICAgICAgICAgICAgaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyLCBQb3B1cE1lbnVMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbW91c2UgaXMgb3ZlciB0aGUgY29tYm8gb3IgdGhlIGFycm93IGJ1dHRvbi4KKyAgICAgICAgICogVGhpcyBmaWVsZCBvbmx5IGhhcyBtZWFuaW5nIGlmIGJ1dHRvbldoZW5Ob3RFbmFibGVkIGlzIHRydWUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjb21ibyBvciBhcnJvdyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4gVGhpcworICAgICAgICAgKiBmaWVsZCBvbmx5IGhhcyBtZWFuaW5nIGlmIGJ1dHRvbldoZW5Ob3RFbmFibGVkIGlzIHRydWUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJlc3NlZDsKKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBTdGF0ZSBNZXRob2RzCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlVwZGF0ZXMgdGhlIGludGVybmFsICJwcmVzc2VkIiBzdGF0ZS4gSWYgc2hvdWxkQWN0TGlrZUJ1dHRvbigpCisgICAgICAgICAqIGlzIHRydWUsIGFuZCBpZiB0aGlzIG1ldGhvZCBjYWxsIHdpbGwgY2hhbmdlIHRoZSBpbnRlcm5hbCBzdGF0ZSwKKyAgICAgICAgICogdGhlbiB0aGUgY29tYm8gYW5kIGJ1dHRvbiB3aWxsIGJlIHJlcGFpbnRlZC48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZWl0aGVyIHdoZW4gYSBwcmVzcyBldmVudAorICAgICAgICAgKiBvY2N1cnMgb24gdGhlIGNvbWJvIGJveCwgb3Igb24gdGhlIGFycm93IGJ1dHRvbi48L3A+CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJlc3NlZChib29sZWFuIHApIHsKKyAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IHAgJiYgaXNFbmFibGVkKCk7CisgICAgICAgICAgICBpZiAoc2hvdWxkQWN0TGlrZUJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgY29tYm9Cb3gucmVwYWludCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlVwZGF0ZXMgdGhlIGludGVybmFsICJvdmVyIiBzdGF0ZS4gSWYgc2hvdWxkQWN0TGlrZUJ1dHRvbigpCisgICAgICAgICAqIGlzIHRydWUsIGFuZCBpZiB0aGlzIG1ldGhvZCBjYWxsIHdpbGwgY2hhbmdlIHRoZSBpbnRlcm5hbCBzdGF0ZSwKKyAgICAgICAgICogdGhlbiB0aGUgY29tYm8gYW5kIGJ1dHRvbiB3aWxsIGJlIHJlcGFpbnRlZC48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZWl0aGVyIHdoZW4gYSBtb3VzZW92ZXIvbW91c2VvZmYgZXZlbnQKKyAgICAgICAgICogb2NjdXJzIG9uIHRoZSBjb21ibyBib3gsIG9yIG9uIHRoZSBhcnJvdyBidXR0b24uPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU92ZXIoYm9vbGVhbiBvKSB7CisgICAgICAgICAgICBib29sZWFuIG9sZCA9IGlzUm9sbG92ZXIoKTsKKyAgICAgICAgICAgIHRoaXMub3ZlciA9IG8gJiYgaXNFbmFibGVkKCk7CisgICAgICAgICAgICBib29sZWFuIG5ld28gPSBpc1JvbGxvdmVyKCk7CisgICAgICAgICAgICBpZiAoc2hvdWxkQWN0TGlrZUJ1dHRvbigpICYmIG9sZCAhPSBuZXdvKSB7CisgICAgICAgICAgICAgICAgY29tYm9Cb3gucmVwYWludCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gRGVmYXVsdEJ1dHRvbk1vZGVsIE1ldGhvZHMKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAvKioKKyAgICAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAgICAgKgorICAgICAgICAgKiBFbnN1cmVzIHRoYXQgaXNQcmVzc2VkKCkgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tYm8gaXMgcHJlc3NlZCwKKyAgICAgICAgICogb3IgdGhlIGFycm93QnV0dG9uIGlzIHByZXNzZWQsIDxlbT5vcjwvZW0+IGlmIHRoZSBjb21ibyBwb3B1cCBpcworICAgICAgICAgKiB2aXNpYmxlLiBUaGlzIGlzIHRoZSBjYXNlIGJlY2F1c2UgYSBjb21ibyBib3ggbG9va3MgcHJlc3NlZCB3aGVuCisgICAgICAgICAqIHRoZSBwb3B1cCBpcyB2aXNpYmxlLCBhbmQgc28gc2hvdWxkIHRoZSBhcnJvdyBidXR0b24uCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmVzc2VkKCkgeworICAgICAgICAgICAgYm9vbGVhbiBiID0gc2hvdWxkQWN0TGlrZUJ1dHRvbigpID8gcHJlc3NlZCA6IHN1cGVyLmlzUHJlc3NlZCgpOworICAgICAgICAgICAgcmV0dXJuIGIgfHwgKHByZXNzZWRXaGVuUG9wdXBWaXNpYmxlICYmIGNvbWJvQm94LmlzUG9wdXBWaXNpYmxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICoKKyAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSBhcm1lZCBzdGF0ZSBpcyBpbiBzeW5jIHdpdGggdGhlIHByZXNzZWQgc3RhdGUKKyAgICAgICAgICogaWYgc2hvdWxkQWN0TGlrZUJ1dHRvbiBpcyB0cnVlLiBXaXRob3V0IHRoaXMgbWV0aG9kLCB0aGUgYXJyb3cKKyAgICAgICAgICogYnV0dG9uIHdpbGwgbm90IGxvb2sgcHJlc3NlZCB3aGVuIHRoZSBwb3B1cCBpcyBvcGVuLCByZWdhcmRsZXNzCisgICAgICAgICAqIG9mIHRoZSByZXN1bHQgb2YgaXNQcmVzc2VkKCkgYWxvbmUuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBcm1lZCgpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYiA9IHNob3VsZEFjdExpa2VCdXR0b24oKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHByZXNzZWRXaGVuUG9wdXBWaXNpYmxlICYmIGNvbWJvQm94LmlzUG9wdXBWaXNpYmxlKCkpOworICAgICAgICAgICAgcmV0dXJuIGIgPyBpc1ByZXNzZWQoKSA6IHN1cGVyLmlzQXJtZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICAgICAqCisgICAgICAgICAqIEVuc3VyZXMgdGhhdCBpc1JvbGxvdmVyKCkgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tYm8gaXMKKyAgICAgICAgICogcm9sbGVkIG92ZXIsIG9yIHRoZSBhcnJvd0J1dHRvbiBpcyByb2xsZWQgb3Zlci4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvbGxvdmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIHNob3VsZEFjdExpa2VCdXR0b24oKSA/IG92ZXIgOiBzdXBlci5pc1JvbGxvdmVyKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAgICAgKgorICAgICAgICAgKiBGb3J3YXJkcyBwcmVzc2VkIHN0YXRlcyB0byB0aGUgaW50ZXJuYWwgInByZXNzZWQiIGZpZWxkCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJlc3NlZChib29sZWFuIGIpIHsKKyAgICAgICAgICAgIHN1cGVyLnNldFByZXNzZWQoYik7CisgICAgICAgICAgICB1cGRhdGVQcmVzc2VkKGIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yd2FyZHMgcm9sbG92ZXIgc3RhdGVzIHRvIHRoZSBpbnRlcm5hbCAib3ZlciIgZmllbGQKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb2xsb3Zlcihib29sZWFuIGIpIHsKKyAgICAgICAgICAgIHN1cGVyLnNldFJvbGxvdmVyKGIpOworICAgICAgICAgICAgdXBkYXRlT3ZlcihiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIE1vdXNlTGlzdGVuZXIvTW91c2VNb3Rpb25MaXN0ZW5lciBNZXRob2RzCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IG1vdXNlRXZlbnQpIHsKKyAgICAgICAgICAgIHVwZGF0ZU92ZXIodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBtb3VzZUV2ZW50KSB7CisgICAgICAgICAgICB1cGRhdGVPdmVyKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBtb3VzZUV2ZW50KSB7CisgICAgICAgICAgICB1cGRhdGVQcmVzc2VkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBtb3VzZUV2ZW50KSB7CisgICAgICAgICAgICB1cGRhdGVQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7fQorCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIFBvcHVwTWVudUxpc3RlbmVyIE1ldGhvZHMKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAvKioKKyAgICAgICAgICogQGluaGVyaXREb2MKKyAgICAgICAgICoKKyAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSBjb21ibyBib3ggaXMgcmVwYWludGVkIHdoZW4gdGhlIHBvcHVwIGlzIGNsb3NlZC4KKyAgICAgICAgICogVGhpcyBhdm9pZHMgYSBidWcgd2hlcmUgY2xpY2tpbmcgb2ZmIHRoZSBjb21ibyB3YXNuJ3QgY2F1c2luZyBhIHJlcGFpbnQsCisgICAgICAgICAqIGFuZCB0aHVzIHRoZSBjb21ibyBib3ggc3RpbGwgbG9va2VkIHByZXNzZWQgZXZlbiB3aGVuIGl0IHdhcyBub3QuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgYnVnIHdhcyBvbmx5IG5vdGljZWQgd2hlbiBhY3RpbmcgYXMgYSBidXR0b24sIGJ1dCBtYXkgYmUgZ2VuZXJhbGx5CisgICAgICAgICAqIHByZXNlbnQuIElmIHNvLCByZW1vdmUgdGhlIGlmKCkgYmxvY2sKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwb3B1cE1lbnVDYW5jZWxlZChQb3B1cE1lbnVFdmVudCBlKSB7CisgICAgICAgICAgICBpZiAoc2hvdWxkQWN0TGlrZUJ1dHRvbigpIHx8IHByZXNzZWRXaGVuUG9wdXBWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgY29tYm9Cb3gucmVwYWludCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHt9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lSW52aXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHt9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlciBmb3IgcmVwYWludGluZyBjb21ibyB3aGVuIGVkaXRvciBjb21wb25lbnQgZ2FpbnMvbG9vc2VzIGZvY3VzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWRpdG9yRm9jdXNIYW5kbGVyIGltcGxlbWVudHMgRm9jdXNMaXN0ZW5lciwKKyAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIEpDb21ib0JveCBjb21ib0JveDsKKyAgICAgICAgcHJpdmF0ZSBDb21ib0JveEVkaXRvciBlZGl0b3IgPSBudWxsOworICAgICAgICBwcml2YXRlIENvbXBvbmVudCBlZGl0b3JDb21wb25lbnQgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgRWRpdG9yRm9jdXNIYW5kbGVyKEpDb21ib0JveCBjb21ib0JveCkgeworICAgICAgICAgICAgdGhpcy5jb21ib0JveCA9IGNvbWJvQm94OworICAgICAgICAgICAgZWRpdG9yID0gY29tYm9Cb3guZ2V0RWRpdG9yKCk7CisgICAgICAgICAgICBpZiAoZWRpdG9yICE9IG51bGwpeworICAgICAgICAgICAgICAgIGVkaXRvckNvbXBvbmVudCA9IGVkaXRvci5nZXRFZGl0b3JDb21wb25lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZWRpdG9yQ29tcG9uZW50ICE9IG51bGwpeworICAgICAgICAgICAgICAgICAgICBlZGl0b3JDb21wb25lbnQuYWRkRm9jdXNMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21ib0JveC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJlZGl0b3IiLHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlcigpeworICAgICAgICAgICAgY29tYm9Cb3gucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIGlmIChlZGl0b3JDb21wb25lbnQhPW51bGwpeworICAgICAgICAgICAgICAgIGVkaXRvckNvbXBvbmVudC5yZW1vdmVGb2N1c0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIEludm9rZWQgd2hlbiBhIGNvbXBvbmVudCBnYWlucyB0aGUga2V5Ym9hcmQgZm9jdXMuICovCisgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgeworICAgICAgICAgICAgLy8gcmVwYWludCB3aG9sZSBjb21ibyBvbiBmb2N1cyBnYWluCisgICAgICAgICAgICBjb21ib0JveC5yZXBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogSW52b2tlZCB3aGVuIGEgY29tcG9uZW50IGxvc2VzIHRoZSBrZXlib2FyZCBmb2N1cy4gKi8KKyAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgeworICAgICAgICAgICAgLy8gcmVwYWludCB3aG9sZSBjb21ibyBvbiBmb2N1cyBsb3NzCisgICAgICAgICAgICBjb21ib0JveC5yZXBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbWJvcyBlZGl0b3IgY2hhbmdlcworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZ0IEEgUHJvcGVydHlDaGFuZ2VFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIGFuZAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB0aGF0IGhhcyBjaGFuZ2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgIENvbWJvQm94RWRpdG9yIG5ld0VkaXRvciA9IGNvbWJvQm94LmdldEVkaXRvcigpOworICAgICAgICAgICAgaWYgKGVkaXRvciAhPSBuZXdFZGl0b3IpeworICAgICAgICAgICAgICAgIGlmIChlZGl0b3JDb21wb25lbnQhPW51bGwpeworICAgICAgICAgICAgICAgICAgICBlZGl0b3JDb21wb25lbnQucmVtb3ZlRm9jdXNMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWRpdG9yID0gbmV3RWRpdG9yOworICAgICAgICAgICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIGVkaXRvckNvbXBvbmVudCA9IGVkaXRvci5nZXRFZGl0b3JDb21wb25lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvckNvbXBvbmVudCAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckNvbXBvbmVudC5hZGRGb2N1c0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhMb29rQW5kRmVlbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhMb29rQW5kRmVlbC5qYXZhCmluZGV4IDE3ODk4MWYuLjk3NmVjMGEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoTG9va0FuZEZlZWwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aExvb2tBbmRGZWVsLmphdmEKQEAgLTEzOCw5ICsxMzgsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2VsZWN0ZWRVSVN0YXRlID0gU3ludGhDb25zdGFudHMuRk9DVVNFRDsKICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgc2VsZWN0ZWRVSVN0YXRlIHw9IFN5bnRoQ29uc3RhbnRzLkVOQUJMRUQ7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRVSVN0YXRlID0gU3ludGhDb25zdGFudHMuRk9DVVNFRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHNlbGVjdGVkVUlTdGF0ZSB8PSBTeW50aENvbnN0YW50cy5ESVNBQkxFRDsKQEAgLTI1MSw2ICsyNTEsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgKChTeW50aExvb2tBbmRGZWVsKWxhZikuCiAgICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVTdHlsZU9uQW5jZXN0b3JDaGFuZ2VkKCkpOwogICAgICAgICB9CisgICAgICAgIC8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgdHdvIG5pbWJ1cyBiYXNlZCBvdmVycmlkZXMgc2hvdWxkIGJlIHJlZmFjdG9yZWQKKyAgICAgICAgLy8gdG8gYmUgaW4gdGhlIE5pbWJ1cyBMQUYuIER1ZSB0byBjb25zdHJhaW50cyBpbiBhbiB1cGRhdGUgcmVsZWFzZSwKKyAgICAgICAgLy8gd2UgY291bGRuJ3QgYWN0dWFsbHkgcHJvdmlkZSB0aGUgcHVibGljIEFQSSBuZWNlc3NhcnkgdG8gYWxsb3cKKyAgICAgICAgLy8gTmltYnVzTG9va0FuZEZlZWwgKGEgc3ViY2xhc3Mgb2YgU3ludGhMb29rQW5kRmVlbCkgdG8gcHJvdmlkZSBpdHMKKyAgICAgICAgLy8gb3duIHJ1bGVzIGZvciBzaG91bGRVcGRhdGVTdHlsZS4KKyAgICAgICAgZWxzZSBpZiAoIk5pbWJ1cy5PdmVycmlkZXMiID09IGVOYW1lKSB7CisgICAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHdoZW4gdGhlIE5pbWJ1cy5PdmVycmlkZXMgY2xpZW50IHByb3BlcnR5IGhhcworICAgICAgICAgICAgLy8gYmVlbiBjaGFuZ2VkCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgiTmltYnVzLk92ZXJyaWRlcy5Jbmhlcml0RGVmYXVsdHMiID09IGVOYW1lKSB7CisgICAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHdoZW4gdGhlIE5pbWJ1cy5PdmVycmlkZXMuSW5oZXJpdERlZmF1bHRzCisgICAgICAgICAgICAvLyBjbGllbnQgcHJvcGVydHkgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCJKQ29tcG9uZW50LnNpemVWYXJpYW50IiA9PSBlTmFtZSkgeworICAgICAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSB3aGVuIHRoZSBKQ29tcG9uZW50LnNpemVWYXJpYW50CisgICAgICAgICAgICAvLyBjbGllbnQgcHJvcGVydHkgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTYyMiw2ICs2NDIsNyBAQAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBVSU1hbmFnZXIgd2hlbiB0aGlzIGxvb2sgYW5kIGZlZWwgaXMgaW5zdGFsbGVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CiAgICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTsKICAgICAgICAgRGVmYXVsdExvb2t1cC5zZXREZWZhdWx0TG9va3VwKG5ldyBTeW50aERlZmF1bHRMb29rdXAoKSk7CkBAIC02MzMsNiArNjU0LDcgQEAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgVUlNYW5hZ2VyIHdoZW4gdGhpcyBsb29rIGFuZCBmZWVsIGlzIHVuaW5zdGFsbGVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZSgpIHsKICAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCkuCiAgICAgICAgICAgICByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKF9oYW5kbGVyKTsKQEAgLTY0Nyw2ICs2NjksNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBEZWZhdWx0cyB0YWJsZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVUlEZWZhdWx0cyBnZXREZWZhdWx0cygpIHsKICAgICAgICAgVUlEZWZhdWx0cyB0YWJsZSA9IG5ldyBVSURlZmF1bHRzKDYwLCAwLjc1Zik7CiAKQEAgLTcwNCw2ICs3MjcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0cnVlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkTG9va0FuZEZlZWwoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTcxMyw2ICs3MzcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBmYWxzZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTmF0aXZlTG9va0FuZEZlZWwoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC03MjIsNiArNzQ3LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBzeW50aC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewogICAgICAgICByZXR1cm4gIlN5bnRoIGxvb2sgYW5kIGZlZWwiOwogICAgIH0KQEAgLTczMSw2ICs3NTcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBhIHNob3J0IHN0cmluZyBpZGVudGlmeWluZyB0aGlzIGxvb2sgYW5kIGZlZWwuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gIlN5bnRoIGxvb2sgYW5kIGZlZWwiOwogICAgIH0KQEAgLTc0MCw2ICs3NjcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBhIHNob3J0IHN0cmluZyBpZGVudGlmeWluZyB0aGlzIGxvb2sgYW5kIGZlZWwuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRJRCgpIHsKICAgICAgICAgcmV0dXJuICJTeW50aCI7CiAgICAgfQpAQCAtODA1LDYgKzgzMyw3IEBACiAgICAgICAgICAgICB0ay5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGtleSwgdGhpcyk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBwY2UpIHsKICAgICAgICAgICAgIFVJRGVmYXVsdHMgZGVmYXVsdHMgPSBVSU1hbmFnZXIuZ2V0TG9va0FuZEZlZWxEZWZhdWx0cygpOwogICAgICAgICAgICAgaWYgKGRlZmF1bHRzLmdldEJvb2xlYW4oIlN5bnRoLmRvTm90U2V0VGV4dEFBIikpIHsKQEAgLTg3Myw2ICs5MDIsNyBAQAogICAgICAgICAgICAgaWYgKCFpc1VwZGF0ZVBlbmRpbmcoKSkgewogICAgICAgICAgICAgICAgIHNldFVwZGF0ZVBlbmRpbmcodHJ1ZSk7CiAgICAgICAgICAgICAgICAgUnVubmFibGUgdWlVcGRhdGVyID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWxsVUlzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVcGRhdGVQZW5kaW5nKGZhbHNlKTsKQEAgLTg4OSw2ICs5MTksNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldnQuZ2V0UHJvcGVydHlOYW1lKCk7CiAgICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUgPSBldnQuZ2V0TmV3VmFsdWUoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoUHJvZ3Jlc3NCYXJVSS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhQcm9ncmVzc0JhclVJLmphdmEKaW5kZXggOTNjNjZjMy4uYzZhNzUzNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhQcm9ncmVzc0JhclVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhQcm9ncmVzc0JhclVJLmphdmEKQEAgLTI3LDE0ICsyNywxMSBAQAogCiBpbXBvcnQgamF2YS5hd3QuKjsKIGltcG9ydCBqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybTsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC4qOwogaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuKjsKIGltcG9ydCBqYXZheC5zd2luZy5wbGFmLio7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi5iYXNpYy5CYXNpY1Byb2dyZXNzQmFyVUk7CiBpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBzdW4uc3dpbmcucGxhZi5zeW50aC5TeW50aFVJOwogaW1wb3J0IHN1bi5zd2luZy5Td2luZ1V0aWxpdGllczI7CiAKQEAgLTQ2LDI0ICs0MywyOSBAQAogY2xhc3MgU3ludGhQcm9ncmVzc0JhclVJIGV4dGVuZHMgQmFzaWNQcm9ncmVzc0JhclVJIGltcGxlbWVudHMgU3ludGhVSSwKICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CiAgICAgcHJpdmF0ZSBTeW50aFN0eWxlIHN0eWxlOwotCiAgICAgcHJpdmF0ZSBpbnQgcHJvZ3Jlc3NQYWRkaW5nOworICAgIHByaXZhdGUgYm9vbGVhbiByb3RhdGVUZXh0OyAvLyBhZGRlZCBmb3IgTmltYnVzIExBRgogICAgIHByaXZhdGUgYm9vbGVhbiBwYWludE91dHNpZGVDbGlwOworICAgIHByaXZhdGUgYm9vbGVhbiB0aWxlV2hlbkluZGV0ZXJtaW5hdGU7IC8vd2hldGhlciB0byB0aWxlIGluZGV0ZXJtaW5hdGUgcGFpbnRpbmcKKyAgICBwcml2YXRlIGludCB0aWxlV2lkdGg7IC8vdGhlIHdpZHRoIG9mIGVhY2ggdGlsZQogCiAgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnRVSSBjcmVhdGVVSShKQ29tcG9uZW50IHgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTeW50aFByb2dyZXNzQmFyVUkoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsTGlzdGVuZXJzKCkgewogICAgICAgICBzdXBlci5pbnN0YWxsTGlzdGVuZXJzKCk7CiAgICAgICAgIHByb2dyZXNzQmFyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdW5pbnN0YWxsTGlzdGVuZXJzKCkgewogICAgICAgICBzdXBlci51bmluc3RhbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgcHJvZ3Jlc3NCYXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsRGVmYXVsdHMoKSB7CiAgICAgICAgIHVwZGF0ZVN0eWxlKHByb2dyZXNzQmFyKTsKICAgICB9CkBAIC03MiwxNyArNzQsMzQgQEAKICAgICAgICAgU3ludGhDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KGMsIEVOQUJMRUQpOwogICAgICAgICBTeW50aFN0eWxlIG9sZFN0eWxlID0gc3R5bGU7CiAgICAgICAgIHN0eWxlID0gU3ludGhMb29rQW5kRmVlbC51cGRhdGVTdHlsZShjb250ZXh0LCB0aGlzKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IG9sZFN0eWxlKSB7Ci0gICAgICAgICAgICBzZXRDZWxsTGVuZ3RoKHN0eWxlLmdldEludChjb250ZXh0LCAiUHJvZ3Jlc3NCYXIuY2VsbExlbmd0aCIsIDEpKTsKLSAgICAgICAgICAgIHNldENlbGxTcGFjaW5nKHN0eWxlLmdldEludChjb250ZXh0LCAiUHJvZ3Jlc3NCYXIuY2VsbFNwYWNpbmciLCAwKSk7Ci0gICAgICAgICAgICBwcm9ncmVzc1BhZGRpbmcgPSBzdHlsZS5nZXRJbnQoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIlByb2dyZXNzQmFyLnByb2dyZXNzUGFkZGluZyIsIDApOwotICAgICAgICAgICAgcGFpbnRPdXRzaWRlQ2xpcCA9IHN0eWxlLmdldEJvb2xlYW4oY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIlByb2dyZXNzQmFyLnBhaW50T3V0c2lkZUNsaXAiLCBmYWxzZSk7CisgICAgICAgIHNldENlbGxMZW5ndGgoc3R5bGUuZ2V0SW50KGNvbnRleHQsICJQcm9ncmVzc0Jhci5jZWxsTGVuZ3RoIiwgMSkpOworICAgICAgICBzZXRDZWxsU3BhY2luZyhzdHlsZS5nZXRJbnQoY29udGV4dCwgIlByb2dyZXNzQmFyLmNlbGxTcGFjaW5nIiwgMCkpOworICAgICAgICBwcm9ncmVzc1BhZGRpbmcgPSBzdHlsZS5nZXRJbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAiUHJvZ3Jlc3NCYXIucHJvZ3Jlc3NQYWRkaW5nIiwgMCk7CisgICAgICAgIHBhaW50T3V0c2lkZUNsaXAgPSBzdHlsZS5nZXRCb29sZWFuKGNvbnRleHQsCisgICAgICAgICAgICAgICAgIlByb2dyZXNzQmFyLnBhaW50T3V0c2lkZUNsaXAiLCBmYWxzZSk7CisgICAgICAgIHJvdGF0ZVRleHQgPSBzdHlsZS5nZXRCb29sZWFuKGNvbnRleHQsCisgICAgICAgICAgICAgICAgIlByb2dyZXNzQmFyLnJvdGF0ZVRleHQiLCBmYWxzZSk7CisgICAgICAgIHRpbGVXaGVuSW5kZXRlcm1pbmF0ZSA9IHN0eWxlLmdldEJvb2xlYW4oY29udGV4dCwgIlByb2dyZXNzQmFyLnRpbGVXaGVuSW5kZXRlcm1pbmF0ZSIsIGZhbHNlKTsKKyAgICAgICAgdGlsZVdpZHRoID0gc3R5bGUuZ2V0SW50KGNvbnRleHQsICJQcm9ncmVzc0Jhci50aWxlV2lkdGgiLCAxNSk7CisgICAgICAgIC8vIGhhbmRsZSBzY2FsaW5nIGZvciBzaXplVmFyaWVudHMgZm9yIHNwZWNpYWwgY2FzZSBjb21wb25lbnRzLiBUaGUKKyAgICAgICAgLy8ga2V5ICJKQ29tcG9uZW50LnNpemVWYXJpYW50IiBzY2FsZXMgZm9yIGxhcmdlL3NtYWxsL21pbmkKKyAgICAgICAgLy8gY29tcG9uZW50cyBhcmUgYmFzZWQgb24gQXBwbGVzIExBRgorICAgICAgICBTdHJpbmcgc2NhbGVLZXkgPSAoU3RyaW5nKXByb2dyZXNzQmFyLmdldENsaWVudFByb3BlcnR5KAorICAgICAgICAgICAgICAgICJKQ29tcG9uZW50LnNpemVWYXJpYW50Iik7CisgICAgICAgIGlmIChzY2FsZUtleSAhPSBudWxsKXsKKyAgICAgICAgICAgIGlmICgibGFyZ2UiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgIHRpbGVXaWR0aCAqPSAxLjE1OworICAgICAgICAgICAgfSBlbHNlIGlmICgic21hbGwiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgIHRpbGVXaWR0aCAqPSAwLjg1NzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbmkiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgIHRpbGVXaWR0aCAqPSAwLjc4NDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxEZWZhdWx0cygpIHsKICAgICAgICAgU3ludGhDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KHByb2dyZXNzQmFyLCBFTkFCTEVEKTsKIApAQCAtMTA4LDYgKzEyNyw3IEBACiAgICAgICAgIHJldHVybiBTeW50aExvb2tBbmRGZWVsLmdldENvbXBvbmVudFN0YXRlKGMpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoSkNvbXBvbmVudCBjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgc3VwZXIuZ2V0QmFzZWxpbmUoYywgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgIGlmIChwcm9ncmVzc0Jhci5pc1N0cmluZ1BhaW50ZWQoKSAmJgpAQCAtMTIyLDYgKzE0MiwxNiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRCb3goUmVjdGFuZ2xlIHIpIHsKKyAgICAgICAgaWYgKHRpbGVXaGVuSW5kZXRlcm1pbmF0ZSkgeworICAgICAgICAgICAgcmV0dXJuIFN3aW5nVXRpbGl0aWVzLmNhbGN1bGF0ZUlubmVyQXJlYShwcm9ncmVzc0Jhciwgcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Qm94KHIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0QW5pbWF0aW9uSW5kZXgoaW50IG5ld1ZhbHVlKSB7CiAgICAgICAgIGlmIChwYWludE91dHNpZGVDbGlwKSB7CiAgICAgICAgICAgICBpZiAoZ2V0QW5pbWF0aW9uSW5kZXgoKSA9PSBuZXdWYWx1ZSkgewpAQCAtMTM0LDYgKzE2NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoR3JhcGhpY3MgZywgSkNvbXBvbmVudCBjKSB7CiAgICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChjKTsKIApAQCAtMTQ1LDYgKzE3Niw3IEBACiAgICAgICAgIGNvbnRleHQuZGlzcG9zZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcsIEpDb21wb25lbnQgYykgewogICAgICAgICBTeW50aENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoYyk7CiAKQEAgLTE5Niw0NCArMjI4LDk4IEBACiAgICAgICAgICAgICB3aWR0aCA9IGJveFJlY3Qud2lkdGggLSBwcm9ncmVzc1BhZGRpbmcgLSBwcm9ncmVzc1BhZGRpbmc7CiAgICAgICAgICAgICBoZWlnaHQgPSBib3hSZWN0LmhlaWdodCAtIHByb2dyZXNzUGFkZGluZyAtIHByb2dyZXNzUGFkZGluZzsKICAgICAgICAgfQotICAgICAgICBjb250ZXh0LmdldFBhaW50ZXIoKS5wYWludFByb2dyZXNzQmFyRm9yZWdyb3VuZChjb250ZXh0LCBnLAotICAgICAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBCYXIuZ2V0T3JpZW50YXRpb24oKSk7CiAKLSAgICAgICAgaWYgKHBCYXIuaXNTdHJpbmdQYWludGVkKCkgJiYgIXBCYXIuaXNJbmRldGVybWluYXRlKCkpIHsKKyAgICAgICAgLy9pZiB0aWxpbmcgYW5kIGluZGV0ZXJtaW5hdGUsIHRoZW4gcGFpbnQgdGhlIHByb2dyZXNzIGJhciBmb3JlZ3JvdW5kIGEKKyAgICAgICAgLy9iaXQgd2lkZXIgdGhhbiBpdCBzaG91bGQgYmUuIFNoaWZ0IGFzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcworICAgICAgICAvL2FuIGFuaW1hdGVkIGVmZmVjdAorICAgICAgICBpZiAodGlsZVdoZW5JbmRldGVybWluYXRlICYmIHBCYXIuaXNJbmRldGVybWluYXRlKCkpIHsKKyAgICAgICAgICAgIGRvdWJsZSBwZXJjZW50Q29tcGxldGUgPSAoZG91YmxlKWdldEFuaW1hdGlvbkluZGV4KCkgLyAoZG91YmxlKWdldEZyYW1lQ291bnQoKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAoaW50KShwZXJjZW50Q29tcGxldGUgKiB0aWxlV2lkdGgpOworICAgICAgICAgICAgU2hhcGUgY2xpcCA9IGcuZ2V0Q2xpcCgpOworICAgICAgICAgICAgZy5jbGlwUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChwQmFyLmdldE9yaWVudGF0aW9uKCkgPT0gSlByb2dyZXNzQmFyLkhPUklaT05UQUwpIHsKKyAgICAgICAgICAgICAgICAvL3BhaW50IGVhY2ggdGlsZSBob3Jpem9udGFsbHkKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPXgtdGlsZVdpZHRoK29mZnNldDsgaTw9d2lkdGg7IGkrPXRpbGVXaWR0aCkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFBhaW50ZXIoKS5wYWludFByb2dyZXNzQmFyRm9yZWdyb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBnLCBpLCB5LCB0aWxlV2lkdGgsIGhlaWdodCwgcEJhci5nZXRPcmllbnRhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvL0pQcm9ncmVzc0Jhci5WRVJUSUNBTAorICAgICAgICAgICAgICAgIC8vcGFpbnQgZWFjaCB0aWxlIHZlcnRpY2FsbHkKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPXktb2Zmc2V0OyBpPGhlaWdodCt0aWxlV2lkdGg7IGkrPXRpbGVXaWR0aCkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFBhaW50ZXIoKS5wYWludFByb2dyZXNzQmFyRm9yZWdyb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBnLCB4LCBpLCB3aWR0aCwgdGlsZVdpZHRoLCBwQmFyLmdldE9yaWVudGF0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGcuc2V0Q2xpcChjbGlwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0UGFpbnRlcigpLnBhaW50UHJvZ3Jlc3NCYXJGb3JlZ3JvdW5kKGNvbnRleHQsIGcsCisgICAgICAgICAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBCYXIuZ2V0T3JpZW50YXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocEJhci5pc1N0cmluZ1BhaW50ZWQoKSkgewogICAgICAgICAgICAgcGFpbnRUZXh0KGNvbnRleHQsIGcsIHBCYXIuZ2V0U3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRUZXh0KFN5bnRoQ29udGV4dCBjb250ZXh0LCBHcmFwaGljcyBnLAogICAgICAgICAgICAgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIEZvbnQgZm9udCA9IGNvbnRleHQuZ2V0U3R5bGUoKS5nZXRGb250KGNvbnRleHQpOwotICAgICAgICBGb250TWV0cmljcyBtZXRyaWNzID0gU3dpbmdVdGlsaXRpZXMyLmdldEZvbnRNZXRyaWNzKHByb2dyZXNzQmFyLCBnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQpOwotCiAgICAgICAgIGlmIChwcm9ncmVzc0Jhci5pc1N0cmluZ1BhaW50ZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nIHBCYXJTdHJpbmcgPSBwcm9ncmVzc0Jhci5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBwcm9ncmVzc0Jhci5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGludCBzdHJMZW5ndGggPSBjb250ZXh0LmdldFN0eWxlKCkuZ2V0R3JhcGhpY3NVdGlscyhjb250ZXh0KS4KLSAgICAgICAgICAgICAgICBjb21wdXRlU3RyaW5nV2lkdGgoY29udGV4dCwgZm9udCwgbWV0cmljcywgcEJhclN0cmluZyk7Ci0KLSAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRzIGZvciB0aGUgdGV4dC4KLSAgICAgICAgICAgIFJlY3RhbmdsZSB0ZXh0UmVjdCA9IG5ldyBSZWN0YW5nbGUoCi0gICAgICAgICAgICAgICAgKGJvdW5kcy53aWR0aCAvIDIpIC0gKHN0ckxlbmd0aCAvIDIpLAotICAgICAgICAgICAgICAgIChib3VuZHMuaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgKG1ldHJpY3MuZ2V0QXNjZW50KCkgKyBtZXRyaWNzLmdldERlc2NlbnQoKSkpIC8gMiwKLSAgICAgICAgICAgICAgICAwLCAwKTsKLQotICAgICAgICAgICAgLy8gUHJvZ3Jlc3MgYmFyIGlzbid0IHRhbGwgZW5vdWdoIGZvciB0aGUgZm9udC4gIERvbid0IHBhaW50IGl0LgotICAgICAgICAgICAgaWYgKHRleHRSZWN0LnkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQYWludCB0aGUgdGV4dC4KICAgICAgICAgICAgIFN5bnRoU3R5bGUgc3R5bGUgPSBjb250ZXh0LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBnLnNldENvbG9yKHN0eWxlLmdldENvbG9yKGNvbnRleHQsIENvbG9yVHlwZS5URVhUX0ZPUkVHUk9VTkQpKTsKLSAgICAgICAgICAgIGcuc2V0Rm9udChzdHlsZS5nZXRGb250KGNvbnRleHQpKTsKLSAgICAgICAgICAgIHN0eWxlLmdldEdyYXBoaWNzVXRpbHMoY29udGV4dCkucGFpbnRUZXh0KGNvbnRleHQsIGcsIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRSZWN0LngsIHRleHRSZWN0LnksIC0xKTsKKyAgICAgICAgICAgIEZvbnQgZm9udCA9IHN0eWxlLmdldEZvbnQoY29udGV4dCk7CisgICAgICAgICAgICBGb250TWV0cmljcyBmbSA9IFN3aW5nVXRpbGl0aWVzMi5nZXRGb250TWV0cmljcygKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXIsIGcsIGZvbnQpOworICAgICAgICAgICAgaW50IHN0ckxlbmd0aCA9IHN0eWxlLmdldEdyYXBoaWNzVXRpbHMoY29udGV4dCkuCisgICAgICAgICAgICAgICAgY29tcHV0ZVN0cmluZ1dpZHRoKGNvbnRleHQsIGZvbnQsIGZtLCB0aXRsZSk7CisgICAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gcHJvZ3Jlc3NCYXIuZ2V0Qm91bmRzKCk7CisKKyAgICAgICAgICAgIGlmIChyb3RhdGVUZXh0ICYmCisgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyLmdldE9yaWVudGF0aW9uKCkgPT0gSlByb2dyZXNzQmFyLlZFUlRJQ0FMKXsKKyAgICAgICAgICAgICAgICBHcmFwaGljczJEIGcyID0gKEdyYXBoaWNzMkQpZzsKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHBvc2l0aW9uIGZvciB0aGUgdGV4dC4KKyAgICAgICAgICAgICAgICBQb2ludCB0ZXh0UG9zOworICAgICAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSByb3RhdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NCYXIuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKS5pc0xlZnRUb1JpZ2h0KCkpeworICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IEFmZmluZVRyYW5zZm9ybS5nZXRSb3RhdGVJbnN0YW5jZSgtTWF0aC5QSS8yKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFBvcyA9IG5ldyBQb2ludCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChib3VuZHMud2lkdGgrZm0uZ2V0QXNjZW50KCktZm0uZ2V0RGVzY2VudCgpKS8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvdW5kcy5oZWlnaHQrc3RyTGVuZ3RoKS8yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IEFmZmluZVRyYW5zZm9ybS5nZXRSb3RhdGVJbnN0YW5jZShNYXRoLlBJLzIpOworICAgICAgICAgICAgICAgICAgICB0ZXh0UG9zID0gbmV3IFBvaW50KAorICAgICAgICAgICAgICAgICAgICAgICAgKGJvdW5kcy53aWR0aC1mbS5nZXRBc2NlbnQoKStmbS5nZXREZXNjZW50KCkpLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoYm91bmRzLmhlaWdodC1zdHJMZW5ndGgpLzIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFByb2dyZXNzIGJhciBpc24ndCB3aWRlIGVub3VnaCBmb3IgdGhlIGZvbnQuICBEb24ndCBwYWludCBpdC4KKyAgICAgICAgICAgICAgICBpZiAodGV4dFBvcy54IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUGFpbnQgdGhlIHRleHQuCisgICAgICAgICAgICAgICAgZm9udCA9IGZvbnQuZGVyaXZlRm9udChyb3RhdGlvbik7CisgICAgICAgICAgICAgICAgZzIuc2V0Rm9udChmb250KTsKKyAgICAgICAgICAgICAgICBnMi5zZXRDb2xvcihzdHlsZS5nZXRDb2xvcihjb250ZXh0LCBDb2xvclR5cGUuVEVYVF9GT1JFR1JPVU5EKSk7CisgICAgICAgICAgICAgICAgc3R5bGUuZ2V0R3JhcGhpY3NVdGlscyhjb250ZXh0KS5wYWludFRleHQoY29udGV4dCwgZywgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRQb3MueCwgdGV4dFBvcy55LCAtMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRzIGZvciB0aGUgdGV4dC4KKyAgICAgICAgICAgICAgICBSZWN0YW5nbGUgdGV4dFJlY3QgPSBuZXcgUmVjdGFuZ2xlKAorICAgICAgICAgICAgICAgICAgICAoYm91bmRzLndpZHRoIC8gMikgLSAoc3RyTGVuZ3RoIC8gMiksCisgICAgICAgICAgICAgICAgICAgIChib3VuZHMuaGVpZ2h0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgIChmbS5nZXRBc2NlbnQoKSArIGZtLmdldERlc2NlbnQoKSkpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAvLyBQcm9ncmVzcyBiYXIgaXNuJ3QgdGFsbCBlbm91Z2ggZm9yIHRoZSBmb250LiAgRG9uJ3QgcGFpbnQgaXQuCisgICAgICAgICAgICAgICAgaWYgKHRleHRSZWN0LnkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBQYWludCB0aGUgdGV4dC4KKyAgICAgICAgICAgICAgICBnLnNldENvbG9yKHN0eWxlLmdldENvbG9yKGNvbnRleHQsIENvbG9yVHlwZS5URVhUX0ZPUkVHUk9VTkQpKTsKKyAgICAgICAgICAgICAgICBnLnNldEZvbnQoZm9udCk7CisgICAgICAgICAgICAgICAgc3R5bGUuZ2V0R3JhcGhpY3NVdGlscyhjb250ZXh0KS5wYWludFRleHQoY29udGV4dCwgZywgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRSZWN0LngsIHRleHRSZWN0LnksIC0xKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ0LDM0ICszMzAsNjcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLSAgICAgICAgaWYgKFN5bnRoTG9va0FuZEZlZWwuc2hvdWxkVXBkYXRlU3R5bGUoZSkpIHsKKyAgICAgICAgaWYgKFN5bnRoTG9va0FuZEZlZWwuc2hvdWxkVXBkYXRlU3R5bGUoZSkgfHwKKyAgICAgICAgICAgICAgICAiaW5kZXRlcm1pbmF0ZSIuZXF1YWxzKGUuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CiAgICAgICAgICAgICB1cGRhdGVTdHlsZSgoSlByb2dyZXNzQmFyKWUuZ2V0U291cmNlKCkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKEpDb21wb25lbnQgYykgewotICAgICAgICBEaW1lbnNpb24gICAgICAgc2l6ZTsKLSAgICAgICAgSW5zZXRzICAgICAgICAgIGJvcmRlciA9IHByb2dyZXNzQmFyLmdldEluc2V0cygpOwotICAgICAgICBGb250TWV0cmljcyAgICAgZm9udFNpemVyID0gcHJvZ3Jlc3NCYXIuZ2V0Rm9udE1ldHJpY3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyLmdldEZvbnQoKSk7CisgICAgICAgIERpbWVuc2lvbiBzaXplID0gbnVsbDsKKyAgICAgICAgSW5zZXRzIGJvcmRlciA9IHByb2dyZXNzQmFyLmdldEluc2V0cygpOworICAgICAgICBGb250TWV0cmljcyBmb250U2l6ZXIgPSBwcm9ncmVzc0Jhci5nZXRGb250TWV0cmljcyhwcm9ncmVzc0Jhci5nZXRGb250KCkpOworICAgICAgICBTdHJpbmcgcHJvZ1N0cmluZyA9IHByb2dyZXNzQmFyLmdldFN0cmluZygpOworICAgICAgICBpbnQgc3RyaW5nSGVpZ2h0ID0gZm9udFNpemVyLmdldEhlaWdodCgpICsgZm9udFNpemVyLmdldERlc2NlbnQoKTsKKwogICAgICAgICBpZiAocHJvZ3Jlc3NCYXIuZ2V0T3JpZW50YXRpb24oKSA9PSBKUHJvZ3Jlc3NCYXIuSE9SSVpPTlRBTCkgewogICAgICAgICAgICAgc2l6ZSA9IG5ldyBEaW1lbnNpb24oZ2V0UHJlZmVycmVkSW5uZXJIb3Jpem9udGFsKCkpOworICAgICAgICAgICAgaWYgKHByb2dyZXNzQmFyLmlzU3RyaW5nUGFpbnRlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBoZWlnaHQgaWYgbmVjZXNzYXJ5IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN0cmluZworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdIZWlnaHQgPiBzaXplLmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBzaXplLmhlaWdodCA9IHN0cmluZ0hlaWdodDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIHdpZHRoIGlmIG5lY2Vzc2FyeSB0byBtYWtlIHJvb20gZm9yIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICBpbnQgc3RyaW5nV2lkdGggPSBTd2luZ1V0aWxpdGllczIuc3RyaW5nV2lkdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhciwgZm9udFNpemVyLCBwcm9nU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nV2lkdGggPiBzaXplLndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUud2lkdGggPSBzdHJpbmdXaWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzaXplID0gbmV3IERpbWVuc2lvbihnZXRQcmVmZXJyZWRJbm5lclZlcnRpY2FsKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBwcm9ncmVzcyBzdHJpbmcgd2lsbCBmaXQuCi0gICAgICAgIGlmIChwcm9ncmVzc0Jhci5pc1N0cmluZ1BhaW50ZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nIHByb2dTdHJpbmcgPSBwcm9ncmVzc0Jhci5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIGludCBzdHJpbmdIZWlnaHQgPSBmb250U2l6ZXIuZ2V0SGVpZ2h0KCkgKwotICAgICAgICAgICAgICAgICAgICBmb250U2l6ZXIuZ2V0RGVzY2VudCgpOwotICAgICAgICAgICAgaWYgKHN0cmluZ0hlaWdodCA+IHNpemUuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSBzdHJpbmdIZWlnaHQ7CisgICAgICAgICAgICBpZiAocHJvZ3Jlc3NCYXIuaXNTdHJpbmdQYWludGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHdpZHRoIGlzIGJpZyBlbm91Z2ggZm9yIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nSGVpZ2h0ID4gc2l6ZS53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBzaXplLndpZHRoID0gc3RyaW5nSGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgaGVpZ2h0IGlzIGJpZyBlbm91Z2ggZm9yIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICBpbnQgc3RyaW5nV2lkdGggPSBTd2luZ1V0aWxpdGllczIuc3RyaW5nV2lkdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhciwgZm9udFNpemVyLCBwcm9nU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nV2lkdGggPiBzaXplLmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBzaXplLmhlaWdodCA9IHN0cmluZ1dpZHRoOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYWxzbyBmb3IgY29tcGxldGVuZXNzLgotICAgICAgICAgICAgaW50IHN0cmluZ1dpZHRoID0gU3dpbmdVdGlsaXRpZXMyLnN0cmluZ1dpZHRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhciwgZm9udFNpemVyLCBwcm9nU3RyaW5nKTsKLSAgICAgICAgICAgIGlmIChzdHJpbmdXaWR0aCA+IHNpemUud2lkdGgpIHsKLSAgICAgICAgICAgICAgICBzaXplLndpZHRoID0gc3RyaW5nV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgc2NhbGluZyBmb3Igc2l6ZVZhcmllbnRzIGZvciBzcGVjaWFsIGNhc2UgY29tcG9uZW50cy4gVGhlCisgICAgICAgIC8vIGtleSAiSkNvbXBvbmVudC5zaXplVmFyaWFudCIgc2NhbGVzIGZvciBsYXJnZS9zbWFsbC9taW5pCisgICAgICAgIC8vIGNvbXBvbmVudHMgYXJlIGJhc2VkIG9uIEFwcGxlcyBMQUYKKyAgICAgICAgU3RyaW5nIHNjYWxlS2V5ID0gKFN0cmluZylwcm9ncmVzc0Jhci5nZXRDbGllbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAiSkNvbXBvbmVudC5zaXplVmFyaWFudCIpOworICAgICAgICBpZiAoc2NhbGVLZXkgIT0gbnVsbCl7CisgICAgICAgICAgICBpZiAoImxhcmdlIi5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICBzaXplLndpZHRoICo9IDEuMTVmOworICAgICAgICAgICAgICAgIHNpemUuaGVpZ2h0ICo9IDEuMTVmOworICAgICAgICAgICAgfSBlbHNlIGlmICgic21hbGwiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgIHNpemUud2lkdGggKj0gMC45MGY7CisgICAgICAgICAgICAgICAgc2l6ZS5oZWlnaHQgKj0gMC45MGY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW5pIi5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICBzaXplLndpZHRoICo9IDAuNzg0ZjsKKyAgICAgICAgICAgICAgICBzaXplLmhlaWdodCAqPSAwLjc4NGY7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhTY3JvbGxCYXJVSS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhTY3JvbGxCYXJVSS5qYXZhCmluZGV4IDYwMzgxMGMuLjZhNGIyZDcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoU2Nyb2xsQmFyVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFNjcm9sbEJhclVJLmphdmEKQEAgLTI2LDEyICsyNiw4IEBACiBwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYuc3ludGg7CiAKIGltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7Ci0KIGltcG9ydCBqYXZhLmJlYW5zLio7Ci0KIGltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuKjsKIGltcG9ydCBzdW4uc3dpbmcucGxhZi5zeW50aC5TeW50aFVJOwpAQCAtNTIsMTIgKzQ4LDIzIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkTWluaW11bVRodW1iU2l6ZTsKICAgICBwcml2YXRlIGludCBzY3JvbGxCYXJXaWR0aDsKIAorICAgIC8vVGhlc2UgdHdvIHZhcmlhYmxlcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHRoZSBjb3Jyb3Nwb25kaW5nIG9uZXMgaW4gQmFzaWNTY3JvbGxCYXJVSSBhcmUgbWFkZSBwcm90ZWN0ZWQKKyAgICBwcml2YXRlIGludCBpbmNyR2FwOworICAgIHByaXZhdGUgaW50IGRlY3JHYXA7CiAKICAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudFVJIGNyZWF0ZVVJKEpDb21wb25lbnQgYykgICAgewogICAgICAgICByZXR1cm4gbmV3IFN5bnRoU2Nyb2xsQmFyVUkoKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsRGVmYXVsdHMoKSB7CisgICAgICAgIC8vTk9URTogVGhpcyBuZXh0IGxpbmUgb2YgY29kZSB3YXMgYWRkZWQgYmVjYXVzZSwgc2luY2UgaW5jckdhcCBhbmQgZGVjckdhcCBpbgorICAgICAgICAvL0Jhc2ljU2Nyb2xsQmFyVUkgYXJlIHByaXZhdGUsIEkgbmVlZCB0byBoYXZlIHNvbWUgd2F5IG9mIHVwZGF0aW5nIHRoZW0uCisgICAgICAgIC8vVGhpcyBpcyBhbiBpbmNvbXBsZXRlIHNvbHV0aW9uIChzaW5jZSBpdCBpbXBsaWVzIHRoYXQgdGhlIGluY3JHYXAgYW5kIGRlY3JHYXAKKyAgICAgICAgLy9hcmUgc2V0IG9uY2UsIGFuZCBub3QgcmVzZXQgcGVyIHN0YXRlLiBQcm9iYWJseSBvaywgYnV0IG5vdCBhbHdheXMgb2spLgorICAgICAgICAvL1RoaXMgbGluZSBvZiBjb2RlIHNob3VsZCBiZSByZW1vdmVkIGF0IHRoZSBzYW1lIHRpbWUgdGhhdCBpbmNyR2FwIGFuZAorICAgICAgICAvL2RlY3JHYXAgYXJlIHJlbW92ZWQgYW5kIG1hZGUgcHJvdGVjdGVkIGluIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgICAgc3VwZXIuaW5zdGFsbERlZmF1bHRzKCk7CisKICAgICAgICAgdHJhY2tIaWdobGlnaHQgPSBOT19ISUdITElHSFQ7CiAgICAgICAgIGlmIChzY3JvbGxiYXIuZ2V0TGF5b3V0KCkgPT0gbnVsbCB8fAogICAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGJhci5nZXRMYXlvdXQoKSBpbnN0YW5jZW9mIFVJUmVzb3VyY2UpKSB7CkBAIC04OSw2ICs5NiwzMSBAQAogICAgICAgICAgICAgaWYgKG1heGltdW1UaHVtYlNpemUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1heGltdW1UaHVtYlNpemUgPSBuZXcgRGltZW5zaW9uKDQwOTYsIDQwOTcpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmNyR2FwID0gc3R5bGUuZ2V0SW50KGNvbnRleHQsICJTY3JvbGxCYXIuaW5jcmVtZW50QnV0dG9uR2FwIiwgMCk7CisgICAgICAgICAgICBkZWNyR2FwID0gc3R5bGUuZ2V0SW50KGNvbnRleHQsICJTY3JvbGxCYXIuZGVjcmVtZW50QnV0dG9uR2FwIiwgMCk7CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBzY2FsaW5nIGZvciBzaXplVmFyaWVudHMgZm9yIHNwZWNpYWwgY2FzZSBjb21wb25lbnRzLiBUaGUKKyAgICAgICAgICAgIC8vIGtleSAiSkNvbXBvbmVudC5zaXplVmFyaWFudCIgc2NhbGVzIGZvciBsYXJnZS9zbWFsbC9taW5pCisgICAgICAgICAgICAvLyBjb21wb25lbnRzIGFyZSBiYXNlZCBvbiBBcHBsZXMgTEFGCisgICAgICAgICAgICBTdHJpbmcgc2NhbGVLZXkgPSAoU3RyaW5nKXNjcm9sbGJhci5nZXRDbGllbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAgICAgIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiKTsKKyAgICAgICAgICAgIGlmIChzY2FsZUtleSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBpZiAoImxhcmdlIi5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQmFyV2lkdGggKj0gMS4xNTsKKyAgICAgICAgICAgICAgICAgICAgaW5jckdhcCAqPSAxLjE1OworICAgICAgICAgICAgICAgICAgICBkZWNyR2FwICo9IDEuMTU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic21hbGwiLmVxdWFscyhzY2FsZUtleSkpeworICAgICAgICAgICAgICAgICAgICBzY3JvbGxCYXJXaWR0aCAqPSAwLjg1NzsKKyAgICAgICAgICAgICAgICAgICAgaW5jckdhcCAqPSAwLjg1NzsKKyAgICAgICAgICAgICAgICAgICAgZGVjckdhcCAqPSAwLjg1NzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW5pIi5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQmFyV2lkdGggKj0gMC43MTQ7CisgICAgICAgICAgICAgICAgICAgIGluY3JHYXAgKj0gMC43MTQ7CisgICAgICAgICAgICAgICAgICAgIGRlY3JHYXAgKj0gMC43MTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAob2xkU3R5bGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHVuaW5zdGFsbEtleWJvYXJkQWN0aW9ucygpOwogICAgICAgICAgICAgICAgIGluc3RhbGxLZXlib2FyZEFjdGlvbnMoKTsKQEAgLTI3NCwxOCArMzA2LDU2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1pbmltdW1UaHVtYlNpemU7Ci0KICAgICB9CiAKLQogICAgIHByb3RlY3RlZCBKQnV0dG9uIGNyZWF0ZURlY3JlYXNlQnV0dG9uKGludCBvcmllbnRhdGlvbikgIHsKLSAgICAgICAgU3ludGhBcnJvd0J1dHRvbiBzeW50aEFycm93QnV0dG9uID0gbmV3IFN5bnRoQXJyb3dCdXR0b24ob3JpZW50YXRpb24pOworICAgICAgICBTeW50aEFycm93QnV0dG9uIHN5bnRoQXJyb3dCdXR0b24gPSBuZXcgU3ludGhBcnJvd0J1dHRvbihvcmllbnRhdGlvbikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVjckdhcCA8IDApIHsgLy90aGVyZSBpcyBhbiBvdmVybGFwIGJldHdlZW4gdGhlIHRyYWNrIGFuZCBidXR0b24KKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsYmFyLmdldE9yaWVudGF0aW9uKCkgPT0gSlNjcm9sbEJhci5WRVJUSUNBTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGp1c3QgdGhlIGhlaWdodCBieSBkZWNyR2FwCisgICAgICAgICAgICAgICAgICAgICAgICAvL05vdGU6IGRlY3JHYXAgaXMgbmVnYXRpdmUhCisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgKz0gZGVjckdhcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRqdXN0IHRoZSB3aWR0aCBieSBkZWNyR2FwCisgICAgICAgICAgICAgICAgICAgICAgICAvL05vdGU6IGRlY3JHYXAgaXMgbmVnYXRpdmUhCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSBkZWNyR2FwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoeCA+PSAwKSAmJiAoeCA8IHdpZHRoKSAmJiAoeSA+PSAwKSAmJiAoeSA8IGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jb250YWlucyh4LCB5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICAgICAgc3ludGhBcnJvd0J1dHRvbi5zZXROYW1lKCJTY3JvbGxCYXIuYnV0dG9uIik7CiAgICAgICAgIHJldHVybiBzeW50aEFycm93QnV0dG9uOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBKQnV0dG9uIGNyZWF0ZUluY3JlYXNlQnV0dG9uKGludCBvcmllbnRhdGlvbikgIHsKLSAgICAgICAgU3ludGhBcnJvd0J1dHRvbiBzeW50aEFycm93QnV0dG9uID0gbmV3IFN5bnRoQXJyb3dCdXR0b24ob3JpZW50YXRpb24pOworICAgICAgICBTeW50aEFycm93QnV0dG9uIHN5bnRoQXJyb3dCdXR0b24gPSBuZXcgU3ludGhBcnJvd0J1dHRvbihvcmllbnRhdGlvbikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5jckdhcCA8IDApIHsgLy90aGVyZSBpcyBhbiBvdmVybGFwIGJldHdlZW4gdGhlIHRyYWNrIGFuZCBidXR0b24KKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsYmFyLmdldE9yaWVudGF0aW9uKCkgPT0gSlNjcm9sbEJhci5WRVJUSUNBTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGp1c3QgdGhlIGhlaWdodCBhbmQgeSBieSBpbmNyR2FwCisgICAgICAgICAgICAgICAgICAgICAgICAvL05vdGU6IGluY3JHYXAgaXMgbmVnYXRpdmUhCisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgKz0gaW5jckdhcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkgKz0gaW5jckdhcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRqdXN0IHRoZSB3aWR0aCBhbmQgeCBieSBpbmNyR2FwCisgICAgICAgICAgICAgICAgICAgICAgICAvL05vdGU6IGluY3JHYXAgaXMgbmVnYXRpdmUhCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSBpbmNyR2FwOworICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBpbmNyR2FwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoeCA+PSAwKSAmJiAoeCA8IHdpZHRoKSAmJiAoeSA+PSAwKSAmJiAoeSA8IGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jb250YWlucyh4LCB5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICAgICAgc3ludGhBcnJvd0J1dHRvbi5zZXROYW1lKCJTY3JvbGxCYXIuYnV0dG9uIik7CiAgICAgICAgIHJldHVybiBzeW50aEFycm93QnV0dG9uOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoU2Nyb2xsUGFuZVVJLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFNjcm9sbFBhbmVVSS5qYXZhCmluZGV4IDYyZjczMmMuLjFkZmRhZDYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoU2Nyb2xsUGFuZVVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhTY3JvbGxQYW5lVUkuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLnN5bnRoOwogCiBpbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC4qOworaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuSlRleHRDb21wb25lbnQ7CiBpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLio7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuKjsKQEAgLTM1LDcgKzM1LDExIEBACiBpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwogCiBpbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkNvbnRhaW5lckxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkNvbnRhaW5lckV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkZvY3VzTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudDsKKwogaW1wb3J0IHN1bi5zd2luZy5wbGFmLnN5bnRoLlN5bnRoVUk7CiAKIApAQCAtNDcsMTEgKzUxLDE0IEBACiBjbGFzcyBTeW50aFNjcm9sbFBhbmVVSSBleHRlbmRzIEJhc2ljU2Nyb2xsUGFuZVVJIGltcGxlbWVudHMKICAgICAgICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgU3ludGhVSSB7CiAgICAgcHJpdmF0ZSBTeW50aFN0eWxlIHN0eWxlOworICAgIHByaXZhdGUgYm9vbGVhbiB2aWV3cG9ydFZpZXdIYXNGb2N1cyA9IGZhbHNlOworICAgIHByaXZhdGUgVmlld3BvcnRWaWV3Rm9jdXNIYW5kbGVyIHZpZXdwb3J0Vmlld0ZvY3VzSGFuZGxlcjsKIAogICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50VUkgY3JlYXRlVUkoSkNvbXBvbmVudCB4KSB7CiAgICAgICAgIHJldHVybiBuZXcgU3ludGhTY3JvbGxQYW5lVUkoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoR3JhcGhpY3MgZywgSkNvbXBvbmVudCBjKSB7CiAgICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChjKTsKIApAQCAtNjIsNiArNjksNyBAQAogICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnLCBKQ29tcG9uZW50IGMpIHsKICAgICAgICAgU3ludGhDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KGMpOwogCkBAIC04Myw2ICs5MSw3IEBACiAgICAgICAgIGNvbnRleHQuZ2V0UGFpbnRlcigpLnBhaW50U2Nyb2xsUGFuZUJvcmRlcihjb250ZXh0LCBnLCB4LCB5LCB3LCBoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsRGVmYXVsdHMoSlNjcm9sbFBhbmUgc2Nyb2xscGFuZSkgewogICAgICAgICB1cGRhdGVTdHlsZShzY3JvbGxwYW5lKTsKICAgICB9CkBAIC0xMDYsMTEgKzExNSwyMSBAQAogICAgIH0KIAogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaW5zdGFsbExpc3RlbmVycyhKU2Nyb2xsUGFuZSBjKSB7CiAgICAgICAgIHN1cGVyLmluc3RhbGxMaXN0ZW5lcnMoYyk7CiAgICAgICAgIGMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaWYgKFVJTWFuYWdlci5nZXRCb29sZWFuKCJTY3JvbGxQYW5lLnVzZUNoaWxkVGV4dENvbXBvbmVudEZvY3VzIikpeworICAgICAgICAgICAgdmlld3BvcnRWaWV3Rm9jdXNIYW5kbGVyID0gbmV3IFZpZXdwb3J0Vmlld0ZvY3VzSGFuZGxlcigpOworICAgICAgICAgICAgYy5nZXRWaWV3cG9ydCgpLmFkZENvbnRhaW5lckxpc3RlbmVyKHZpZXdwb3J0Vmlld0ZvY3VzSGFuZGxlcik7CisgICAgICAgICAgICBDb21wb25lbnQgdmlldyA9IGMuZ2V0Vmlld3BvcnQoKS5nZXRWaWV3KCk7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEpUZXh0Q29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgdmlldy5hZGRGb2N1c0xpc3RlbmVyKHZpZXdwb3J0Vmlld0ZvY3VzSGFuZGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxEZWZhdWx0cyhKU2Nyb2xsUGFuZSBjKSB7CiAgICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChjLCBFTkFCTEVEKTsKIApAQCAtMTIzLDkgKzE0MiwxOCBAQAogICAgIH0KIAogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdW5pbnN0YWxsTGlzdGVuZXJzKEpDb21wb25lbnQgYykgewogICAgICAgICBzdXBlci51bmluc3RhbGxMaXN0ZW5lcnMoYyk7CiAgICAgICAgIGMucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaWYgKHZpZXdwb3J0Vmlld0ZvY3VzSGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBKVmlld3BvcnQgdmlld3BvcnQgPSAoKEpTY3JvbGxQYW5lKSBjKS5nZXRWaWV3cG9ydCgpOworICAgICAgICAgICAgdmlld3BvcnQucmVtb3ZlQ29udGFpbmVyTGlzdGVuZXIodmlld3BvcnRWaWV3Rm9jdXNIYW5kbGVyKTsKKyAgICAgICAgICAgIGlmICh2aWV3cG9ydC5nZXRWaWV3KCkhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld3BvcnQuZ2V0VmlldygpLnJlbW92ZUZvY3VzTGlzdGVuZXIodmlld3BvcnRWaWV3Rm9jdXNIYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZXdwb3J0Vmlld0ZvY3VzSGFuZGxlciA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAKIApAQCAtMTQ1LDcgKzE3MywxMSBAQAogCiAKICAgICBwcml2YXRlIGludCBnZXRDb21wb25lbnRTdGF0ZShKQ29tcG9uZW50IGMpIHsKLSAgICAgICAgcmV0dXJuIFN5bnRoTG9va0FuZEZlZWwuZ2V0Q29tcG9uZW50U3RhdGUoYyk7CisgICAgICAgIGludCBiYXNlU3RhdGUgPSBTeW50aExvb2tBbmRGZWVsLmdldENvbXBvbmVudFN0YXRlKGMpOworICAgICAgICBpZiAodmlld3BvcnRWaWV3Rm9jdXNIYW5kbGVyIT1udWxsICYmIHZpZXdwb3J0Vmlld0hhc0ZvY3VzKXsKKyAgICAgICAgICAgIGJhc2VTdGF0ZSA9IGJhc2VTdGF0ZSB8IEZPQ1VTRUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJhc2VTdGF0ZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKQEAgLTE2Nyw2ICsxOTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Qm9yZGVyKENvbXBvbmVudCBjLCBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgICAgICBKQ29tcG9uZW50IGpjID0gKEpDb21wb25lbnQpYzsKQEAgLTE4Miw2ICsyMTUsNyBAQAogICAgICAgICAgICAgY29udGV4dC5kaXNwb3NlKCk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEluc2V0cyBnZXRCb3JkZXJJbnNldHMoQ29tcG9uZW50IGMsIEluc2V0cyBpbnNldHMpIHsKICAgICAgICAgICAgIGlmIChpbnNldHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5zZXRzKHRoaXMuaW5zZXRzLnRvcCwgdGhpcy5pbnNldHMubGVmdCwKQEAgLTE5NCw4ICsyMjgsMzkgQEAKICAgICAgICAgICAgIHJldHVybiBpbnNldHM7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCb3JkZXJPcGFxdWUoKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUga2VlcGluZyB0cmFjayBvZiB0aGUgdmlld3BvcnQncyB2aWV3J3MgZm9jdXMKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFZpZXdwb3J0Vmlld0ZvY3VzSGFuZGxlciBpbXBsZW1lbnRzIENvbnRhaW5lckxpc3RlbmVyLAorICAgICAgICAgICAgRm9jdXNMaXN0ZW5lcnsKKyAgICAgICAgcHVibGljIHZvaWQgY29tcG9uZW50QWRkZWQoQ29udGFpbmVyRXZlbnQgZSkgeworICAgICAgICAgICAgaWYgKGUuZ2V0Q2hpbGQoKSBpbnN0YW5jZW9mIEpUZXh0Q29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgZS5nZXRDaGlsZCgpLmFkZEZvY3VzTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgdmlld3BvcnRWaWV3SGFzRm9jdXMgPSBlLmdldENoaWxkKCkuaXNGb2N1c093bmVyKCk7CisgICAgICAgICAgICAgICAgc2Nyb2xscGFuZS5yZXBhaW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjb21wb25lbnRSZW1vdmVkKENvbnRhaW5lckV2ZW50IGUpIHsKKyAgICAgICAgICAgIGlmIChlLmdldENoaWxkKCkgaW5zdGFuY2VvZiBKVGV4dENvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIGUuZ2V0Q2hpbGQoKS5yZW1vdmVGb2N1c0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7CisgICAgICAgICAgICB2aWV3cG9ydFZpZXdIYXNGb2N1cyA9IHRydWU7CisgICAgICAgICAgICBzY3JvbGxwYW5lLnJlcGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKKyAgICAgICAgICAgIHZpZXdwb3J0Vmlld0hhc0ZvY3VzID0gZmFsc2U7CisgICAgICAgICAgICBzY3JvbGxwYW5lLnJlcGFpbnQoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoU2xpZGVyVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoU2xpZGVyVUkuamF2YQppbmRleCA1OGZiNTM3Li43OGQwYmIxIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFNsaWRlclVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhTbGlkZXJVSS5qYXZhCkBAIC01Myw2ICs1MywyMCBAQAogICAgIHByb3RlY3RlZCBSZWN0YW5nbGUgdmFsdWVSZWN0ID0gbmV3IFJlY3RhbmdsZSgpOwogICAgIHByb3RlY3RlZCBib29sZWFuIHBhaW50VmFsdWU7CiAKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgSlNsaWRlciBpcyB1c2VkIGFzIGEgcmVuZGVyZXIgaW4gYSBKVGFibGUsIGl0cyBsYXlvdXQgaXMgbm90CisgICAgICogYmVpbmcgcmVjb21wdXRlZCBldmVuIHRob3VnaCB0aGUgc2l6ZSBpcyBjaGFuZ2luZy4gRXZlbiB0aG91Z2ggdGhlcmUKKyAgICAgKiBpcyBhIENvbXBvbmVudExpc3RlbmVyIGluc3RhbGxlZCwgaXQgaXMgbm90IGJlaW5nIG5vdGlmaWVkLiBBcyBzdWNoLAorICAgICAqIGF0IHRpbWVzIHdoZW4gYmVpbmcgYXNrZWQgdG8gcGFpbnQgdGhlIGxheW91dCBzaG91bGQgZmlyc3QgYmUgcmVkb25lLgorICAgICAqIEF0IHRoZSBlbmQgb2YgdGhlIGxheW91dCBtZXRob2Qgd2Ugc2V0IHRoaXMgbGFzdFNpemUgdmFyaWFibGUsIHdoaWNoCisgICAgICogcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgc2xpZGVyIHRoZSBsYXN0IHRpbWUgaXQgd2FzIGxheWVkIG91dC4KKyAgICAgKgorICAgICAqIEluIHRoZSBwYWludCBtZXRob2Qgd2UgdGhlbiBjaGVjayB0byBzZWUgdGhhdCB0aGlzIGlzIGFjY3VyYXRlLCB0aGF0CisgICAgICogdGhlIHNsaWRlciBoYXMgbm90IGNoYW5nZWQgc2l6ZXMgc2luY2UgYmVpbmcgbGFzdCBsYXllZCBvdXQuIElmIG5lY2Vzc2FyeQorICAgICAqIHdlIHJlY29tcHV0ZSB0aGUgbGF5b3V0LgorICAgICAqLworICAgIHByaXZhdGUgRGltZW5zaW9uIGxhc3RTaXplID0gbnVsbDsKKwogICAgIHByaXZhdGUgaW50IHRyYWNrSGVpZ2h0OwogICAgIHByaXZhdGUgaW50IHRyYWNrQm9yZGVyOwogICAgIHByaXZhdGUgaW50IHRodW1iV2lkdGg7CkBAIC02Myw3ICs3Nyw4IEBACiAgICAgcHJpdmF0ZSBTeW50aFN0eWxlIHNsaWRlclRodW1iU3R5bGU7CiAKICAgICAvKiogVXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbG9yIHRvIHBhaW50IHRoZSB0aHVtYi4gKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIHRodW1iQWN0aXZlOworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gdGh1bWJBY3RpdmU7IC8vaGFwcGVucyBvbiByb2xsb3ZlciwgYW5kIHdoZW4gcHJlc3NlZAorICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gdGh1bWJQcmVzc2VkOyAvL2hhcHBlbnMgd2hlbiBtb3VzZSB3YXMgZGVwcmVzc2VkIHdoaWxlIG92ZXIgdGh1bWIKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENvbXBvbmVudFVJIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCkBAIC0xMTksNiArMTM0LDI0IEBACiAgICAgICAgICAgICB0aHVtYkhlaWdodCA9CiAgICAgICAgICAgICAgICAgc3R5bGUuZ2V0SW50KGNvbnRleHQsICJTbGlkZXIudGh1bWJIZWlnaHQiLCAxNCk7CiAKKyAgICAgICAgICAgIC8vIGhhbmRsZSBzY2FsaW5nIGZvciBzaXplVmFyaWVudHMgZm9yIHNwZWNpYWwgY2FzZSBjb21wb25lbnRzLiBUaGUKKyAgICAgICAgICAgIC8vIGtleSAiSkNvbXBvbmVudC5zaXplVmFyaWFudCIgc2NhbGVzIGZvciBsYXJnZS9zbWFsbC9taW5pCisgICAgICAgICAgICAvLyBjb21wb25lbnRzIGFyZSBiYXNlZCBvbiBBcHBsZXMgTEFGCisgICAgICAgICAgICBTdHJpbmcgc2NhbGVLZXkgPSAoU3RyaW5nKXNsaWRlci5nZXRDbGllbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAgICAgIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiKTsKKyAgICAgICAgICAgIGlmIChzY2FsZUtleSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBpZiAoImxhcmdlIi5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJXaWR0aCAqPSAxLjE1OworICAgICAgICAgICAgICAgICAgICB0aHVtYkhlaWdodCAqPSAxLjE1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNtYWxsIi5lcXVhbHMoc2NhbGVLZXkpKXsKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJXaWR0aCAqPSAwLjg1NzsKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJIZWlnaHQgKj0gMC44NTc7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluaSIuZXF1YWxzKHNjYWxlS2V5KSl7CisgICAgICAgICAgICAgICAgICAgIHRodW1iV2lkdGggKj0gMC43ODQ7CisgICAgICAgICAgICAgICAgICAgIHRodW1iSGVpZ2h0ICo9IDAuNzg0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgdHJhY2tCb3JkZXIgPQogICAgICAgICAgICAgICAgIHN0eWxlLmdldEludChjb250ZXh0LCAiU2xpZGVyLnRyYWNrQm9yZGVyIiwgMSk7CiAKQEAgLTE1Miw2ICsxODUsMTEgQEAKICAgICAgICAgc2V0VGh1bWJBY3RpdmUodGh1bWJSZWN0LmNvbnRhaW5zKHgsIHkpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGh1bWJTdGF0ZShpbnQgeCwgaW50IHksIGJvb2xlYW4gcHJlc3NlZCkgeworICAgICAgICB1cGRhdGVUaHVtYlN0YXRlKHgsIHkpOworICAgICAgICBzZXRUaHVtYlByZXNzZWQocHJlc3NlZCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNldFRodW1iQWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7CiAgICAgICAgIGlmICh0aHVtYkFjdGl2ZSAhPSBhY3RpdmUpIHsKICAgICAgICAgICAgIHRodW1iQWN0aXZlID0gYWN0aXZlOwpAQCAtMTU5LDYgKzE5NywxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHNldFRodW1iUHJlc3NlZChib29sZWFuIHByZXNzZWQpIHsKKyAgICAgICAgaWYgKHRodW1iUHJlc3NlZCAhPSBwcmVzc2VkKSB7CisgICAgICAgICAgICB0aHVtYlByZXNzZWQgPSBwcmVzc2VkOworICAgICAgICAgICAgc2xpZGVyLnJlcGFpbnQodGh1bWJSZWN0KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoSkNvbXBvbmVudCBjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgaWYgKGMgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnQgbXVzdCBiZSBub24tbnVsbCIpOwpAQCAtNDE4LDYgKzQ2Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY29udGV4dC5kaXNwb3NlKCk7CisgICAgICAgIGxhc3RTaXplID0gc2xpZGVyLmdldFNpemUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY2Nyw3ICs3MTMsOSBAQAogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0Q29tcG9uZW50U3RhdGUoSkNvbXBvbmVudCBjLCBSZWdpb24gcmVnaW9uKSB7CiAgICAgICAgIGlmIChyZWdpb24gPT0gUmVnaW9uLlNMSURFUl9USFVNQiAmJiB0aHVtYkFjdGl2ZSAmJmMuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBNT1VTRV9PVkVSOworICAgICAgICAgICAgaW50IHN0YXRlID0gdGh1bWJQcmVzc2VkID8gUFJFU1NFRCA6IE1PVVNFX09WRVI7CisgICAgICAgICAgICBpZiAoYy5pc0ZvY3VzT3duZXIoKSkgc3RhdGUgfD0gRk9DVVNFRDsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gU3ludGhMb29rQW5kRmVlbC5nZXRDb21wb25lbnRTdGF0ZShjKTsKICAgICB9CkBAIC02OTMsNiArNzQxLDEwIEBACiAgICAgICAgIHJlY2FsY3VsYXRlSWZPcmllbnRhdGlvbkNoYW5nZWQoKTsKICAgICAgICAgUmVjdGFuZ2xlIGNsaXAgPSBnLmdldENsaXBCb3VuZHMoKTsKIAorICAgICAgICBpZiAobGFzdFNpemUgPT0gbnVsbCB8fCAhbGFzdFNpemUuZXF1YWxzKHNsaWRlci5nZXRTaXplKCkpKSB7CisgICAgICAgICAgICBjYWxjdWxhdGVHZW9tZXRyeSgpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHBhaW50VmFsdWUpIHsKICAgICAgICAgICAgIEZvbnRNZXRyaWNzIGZtID0gU3dpbmdVdGlsaXRpZXMyLmdldEZvbnRNZXRyaWNzKHNsaWRlciwgZyk7CiAgICAgICAgICAgICBpbnQgbGFiZWxXaWR0aCA9IGNvbnRleHQuZ2V0U3R5bGUoKS5nZXRHcmFwaGljc1V0aWxzKGNvbnRleHQpLgpAQCAtNzgxLDkgKzgzMywxNCBAQAogICAgICAgICAgICAgc2V0VGh1bWJBY3RpdmUoZmFsc2UpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZSkgeworICAgICAgICAgICAgc3VwZXIubW91c2VQcmVzc2VkKGUpOworICAgICAgICAgICAgc2V0VGh1bWJQcmVzc2VkKHRodW1iUmVjdC5jb250YWlucyhlLmdldFgoKSwgZS5nZXRZKCkpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7CiAgICAgICAgICAgICBzdXBlci5tb3VzZVJlbGVhc2VkKGUpOwotICAgICAgICAgICAgdXBkYXRlVGh1bWJTdGF0ZShlLmdldFgoKSwgZS5nZXRZKCkpOworICAgICAgICAgICAgdXBkYXRlVGh1bWJTdGF0ZShlLmdldFgoKSwgZS5nZXRZKCksIGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRHJhZ2dlZChNb3VzZUV2ZW50IGUpIHsKQEAgLTgxNCw2ICs4NzEsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGRyYXdJbnZlcnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrQm90dG9tID0gdk1heDsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tUb3AgPSB0cmFja1RvcCArIGhhbGZUaHVtYkhlaWdodDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB0cmFja1RvcCA9IHZNYXg7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhTcGlubmVyVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoU3Bpbm5lclVJLmphdmEKaW5kZXggYzc5NDk5OS4uZDBkZDQ0YiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhTcGlubmVyVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFNwaW5uZXJVSS5qYXZhCkBAIC0yNiwxNyArMjYsMTIgQEAKIAogaW1wb3J0IGphdmEuYXd0Lio7CiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CiAKIGltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuQmFzaWNTcGlubmVyVUk7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC4qOwogCiBpbXBvcnQgamF2YS5iZWFucy4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IHN1bi5zd2luZy5wbGFmLnN5bnRoLlN5bnRoVUk7CiAKIC8qKgpAQCAtNDgsNyArNDMsMTYgQEAKIGNsYXNzIFN5bnRoU3Bpbm5lclVJIGV4dGVuZHMgQmFzaWNTcGlubmVyVUkgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLAogICAgICAgICBTeW50aFVJIHsKICAgICBwcml2YXRlIFN5bnRoU3R5bGUgc3R5bGU7Ci0KKyAgICAvKioKKyAgICAgKiBBIEZvY3VzTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggY2F1c2VzIHRoZSBlbnRpcmUgc3Bpbm5lciB0byBiZQorICAgICAqIHJlcGFpbnRlZCB3aGVuZXZlciB0aGUgZWRpdG9yIGNvbXBvbmVudCAodHlwaWNhbGx5IGEgdGV4dCBmaWVsZCkgYmVjb21lcworICAgICAqIGZvY3VzZWQsIG9yIGxvc2VzIGZvY3VzLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNpbmNlIFN5bnRoU3Bpbm5lclVJCisgICAgICogaXMgY29tcG9zZWQgb2YgYW4gZWRpdG9yIGFuZCB0d28gYnV0dG9ucywgaXQgaXMgbmVjZXNzYXJ5IHRoYXQgYWxsIHRocmVlCisgICAgICogY29tcG9uZW50cyBpbmRpY2F0ZSB0aGF0IHRoZXkgYXJlICJmb2N1c2VkIiBzbyB0aGF0IHRoZXkgY2FuIGJlIGRyYXduCisgICAgICogYXBwcm9wcmlhdGVseS4gVGhlIHJlcGFpbnQgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgYnV0dG9ucyBhcmUgZHJhd24KKyAgICAgKiBpbiB0aGUgbmV3IGZvY3VzZWQgb3IgdW5mb2N1c2VkIHN0YXRlLCBtaXJyb3JpbmcgdGhhdCBvZiB0aGUgZWRpdG9yLgorICAgICAqLworICAgIHByaXZhdGUgRWRpdG9yRm9jdXNIYW5kbGVyIGVkaXRvckZvY3VzSGFuZGxlciA9IG5ldyBFZGl0b3JGb2N1c0hhbmRsZXIoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgU3ludGhTcGlubmVyVUkuCkBAIC02MSw5ICs2NSwxNyBAQAogICAgICAgICByZXR1cm4gbmV3IFN5bnRoU3Bpbm5lclVJKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaW5zdGFsbExpc3RlbmVycygpIHsKICAgICAgICAgc3VwZXIuaW5zdGFsbExpc3RlbmVycygpOwogICAgICAgICBzcGlubmVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIEpDb21wb25lbnQgZWRpdG9yID0gc3Bpbm5lci5nZXRFZGl0b3IoKTsKKyAgICAgICAgaWYgKGVkaXRvciBpbnN0YW5jZW9mIEpTcGlubmVyLkRlZmF1bHRFZGl0b3IpIHsKKyAgICAgICAgICAgIEpUZXh0RmllbGQgdGYgPSAoKEpTcGlubmVyLkRlZmF1bHRFZGl0b3IpZWRpdG9yKS5nZXRUZXh0RmllbGQoKTsKKyAgICAgICAgICAgIGlmICh0ZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGYuYWRkRm9jdXNMaXN0ZW5lcihlZGl0b3JGb2N1c0hhbmRsZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC03NCw5ICs4NiwxNyBAQAogICAgICAqCiAgICAgICogQHNlZSAjaW5zdGFsbExpc3RlbmVycwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHVuaW5zdGFsbExpc3RlbmVycygpIHsKICAgICAgICAgc3VwZXIudW5pbnN0YWxsTGlzdGVuZXJzKCk7CiAgICAgICAgIHNwaW5uZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgSkNvbXBvbmVudCBlZGl0b3IgPSBzcGlubmVyLmdldEVkaXRvcigpOworICAgICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgSlNwaW5uZXIuRGVmYXVsdEVkaXRvcikgeworICAgICAgICAgICAgSlRleHRGaWVsZCB0ZiA9ICgoSlNwaW5uZXIuRGVmYXVsdEVkaXRvcillZGl0b3IpLmdldFRleHRGaWVsZCgpOworICAgICAgICAgICAgaWYgKHRmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0Zi5yZW1vdmVGb2N1c0xpc3RlbmVyKGVkaXRvckZvY3VzSGFuZGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIzMyw2ICsyNTMsMTggQEAKICAgICBwcm90ZWN0ZWQgdm9pZCByZXBsYWNlRWRpdG9yKEpDb21wb25lbnQgb2xkRWRpdG9yLCBKQ29tcG9uZW50IG5ld0VkaXRvcikgewogICAgICAgICBzcGlubmVyLnJlbW92ZShvbGRFZGl0b3IpOwogICAgICAgICBzcGlubmVyLmFkZChuZXdFZGl0b3IsICJFZGl0b3IiKTsKKyAgICAgICAgaWYgKG9sZEVkaXRvciBpbnN0YW5jZW9mIEpTcGlubmVyLkRlZmF1bHRFZGl0b3IpIHsKKyAgICAgICAgICAgIEpUZXh0RmllbGQgdGYgPSAoKEpTcGlubmVyLkRlZmF1bHRFZGl0b3Ipb2xkRWRpdG9yKS5nZXRUZXh0RmllbGQoKTsKKyAgICAgICAgICAgIGlmICh0ZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGYucmVtb3ZlRm9jdXNMaXN0ZW5lcihlZGl0b3JGb2N1c0hhbmRsZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuZXdFZGl0b3IgaW5zdGFuY2VvZiBKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKSB7CisgICAgICAgICAgICBKVGV4dEZpZWxkIHRmID0gKChKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKW5ld0VkaXRvcikuZ2V0VGV4dEZpZWxkKCk7CisgICAgICAgICAgICBpZiAodGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRmLmFkZEZvY3VzTGlzdGVuZXIoZWRpdG9yRm9jdXNIYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVFZGl0b3JBbGlnbm1lbnQoSkNvbXBvbmVudCBlZGl0b3IpIHsKQEAgLTI0MCwxMCArMjcyLDE0IEBACiAgICAgICAgICAgICBTeW50aENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoc3Bpbm5lcik7CiAgICAgICAgICAgICBJbnRlZ2VyIGFsaWdubWVudCA9IChJbnRlZ2VyKWNvbnRleHQuZ2V0U3R5bGUoKS5nZXQoCiAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsICJTcGlubmVyLmVkaXRvckFsaWdubWVudCIpOworICAgICAgICAgICAgSlRleHRGaWVsZCB0ZXh0ID0gKChKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKWVkaXRvcikuZ2V0VGV4dEZpZWxkKCk7CiAgICAgICAgICAgICBpZiAoYWxpZ25tZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKVGV4dEZpZWxkIHRleHQgPSAoKEpTcGlubmVyLkRlZmF1bHRFZGl0b3IpZWRpdG9yKS5nZXRUZXh0RmllbGQoKTsKICAgICAgICAgICAgICAgICB0ZXh0LnNldEhvcml6b250YWxBbGlnbm1lbnQoYWxpZ25tZW50KTsKKwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY29weSBhY3Jvc3MgdGhlIHNpemVWYXJpYW50IHByb3BlcnR5IHRvIHRoZSBlZGl0b3IKKyAgICAgICAgICAgIHRleHQucHV0Q2xpZW50UHJvcGVydHkoIkpDb21wb25lbnQuc2l6ZVZhcmlhbnQiLAorICAgICAgICAgICAgICAgICAgICBzcGlubmVyLmdldENsaWVudFByb3BlcnR5KCJKQ29tcG9uZW50LnNpemVWYXJpYW50IikpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MDQsNCArNDQwLDM4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKiogTGlzdGVuIHRvIGVkaXRvciB0ZXh0IGZpZWxkIGZvY3VzIGNoYW5nZXMgYW5kIHJlcGFpbnQgd2hvbGUgc3Bpbm5lciAqLworICAgIHByaXZhdGUgY2xhc3MgRWRpdG9yRm9jdXNIYW5kbGVyIGltcGxlbWVudHMgRm9jdXNMaXN0ZW5lcnsKKyAgICAgICAgLyoqIEludm9rZWQgd2hlbiBhIGVkaXRvciB0ZXh0IGZpZWxkIGdhaW5zIHRoZSBrZXlib2FyZCBmb2N1cy4gKi8KKyAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7CisgICAgICAgICAgICBzcGlubmVyLnJlcGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBJbnZva2VkIHdoZW4gYSBlZGl0b3IgdGV4dCBmaWVsZCBsb3NlcyB0aGUga2V5Ym9hcmQgZm9jdXMuICovCisgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKKyAgICAgICAgICAgIHNwaW5uZXIucmVwYWludCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIE92ZXJyaWRlIHRoZSBhcnJvd2J1dHRvbnMgZm9jdXMgaGFuZGxpbmcgdG8gZm9sbG93IHRoZSB0ZXh0IGZpZWxkcyBmb2N1cyAqLworICAgIHByaXZhdGUgY2xhc3MgU3Bpbm5lckFycm93QnV0dG9uIGV4dGVuZHMgU3ludGhBcnJvd0J1dHRvbnsKKyAgICAgICAgcHVibGljIFNwaW5uZXJBcnJvd0J1dHRvbihpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihkaXJlY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNPd25lcigpIHsKKyAgICAgICAgICAgIGlmIChzcGlubmVyID09IG51bGwpeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5pc0ZvY3VzT3duZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Bpbm5lci5nZXRFZGl0b3IoKSBpbnN0YW5jZW9mIEpTcGlubmVyLkRlZmF1bHRFZGl0b3IpeworICAgICAgICAgICAgICAgIHJldHVybiAoKEpTcGlubmVyLkRlZmF1bHRFZGl0b3Ipc3Bpbm5lci5nZXRFZGl0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0RmllbGQoKS5pc0ZvY3VzT3duZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Bpbm5lci5nZXRFZGl0b3IoKSE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3Bpbm5lci5nZXRFZGl0b3IoKS5pc0ZvY3VzT3duZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmlzRm9jdXNPd25lcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhTdHlsZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhTdHlsZS5qYXZhCmluZGV4IGQ1OTVlZjYuLjUyZTllZjEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoU3R5bGUuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFN0eWxlLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRlZmF1bHRFZGl0b3JLaXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkpUZXh0Q29tcG9uZW50OwogaW1wb3J0IHN1bi5zd2luZy5wbGFmLnN5bnRoLlN5bnRoVUk7CiAKIC8qKgpAQCAtNzU4LDI4ICs3NTksNDggQEAKICAgICBwdWJsaWMgQ29sb3IgZ2V0Q29sb3IoU3ludGhDb250ZXh0IGNvbnRleHQsIENvbG9yVHlwZSB0eXBlKSB7CiAgICAgICAgIEpDb21wb25lbnQgYyA9IGNvbnRleHQuZ2V0Q29tcG9uZW50KCk7CiAgICAgICAgIFJlZ2lvbiBpZCA9IGNvbnRleHQuZ2V0UmVnaW9uKCk7Ci0gICAgICAgIGludCBjcyA9IGNvbnRleHQuZ2V0Q29tcG9uZW50U3RhdGUoKTsKLSAgICAgICAgLy8gRm9yIHRoZSBlbmFibGVkIHN0YXRlLCBwcmVmZXIgdGhlIHdpZGdldCdzIGNvbG9ycwotICAgICAgICBpZiAoIWlkLmlzU3VicmVnaW9uKCkgJiYgY3MgPT0gU3ludGhDb25zdGFudHMuRU5BQkxFRCkgewotICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ29sb3JUeXBlLkJBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IENvbG9yVHlwZS5GT1JFR1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGMuZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBDb2xvclR5cGUuVEVYVF9GT1JFR1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgZ2V0Rm9yZWdyb3VuZCByZXR1cm5zIGEgbm9uLVVJUmVzb3VyY2UgaXQgbWVhbnMgdGhlCi0gICAgICAgICAgICAgICAgLy8gZGV2ZWxvcGVyIGhhcyBleHBsaWNpdGx5IHNldCB0aGUgZm9yZWdyb3VuZCwgdXNlIGl0IG92ZXIKLSAgICAgICAgICAgICAgICAvLyB0aGF0IG9mIFRFWFRfRk9SRUdST1VORCBhcyB0aGF0IGlzIHR5cGljYWxseSB0aGUgZXhwZWN0ZWQKLSAgICAgICAgICAgICAgICAvLyBiZWhhdmlvci4KLSAgICAgICAgICAgICAgICBDb2xvciBjb2xvciA9IGMuZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICAgICAgICAgIGlmICghKGNvbG9yIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOworCisgICAgICAgIGlmICgoY29udGV4dC5nZXRDb21wb25lbnRTdGF0ZSgpICYgU3ludGhDb25zdGFudHMuRElTQUJMRUQpICE9IDApIHsKKyAgICAgICAgICAgIC8vVGhpcyBjb21wb25lbnQgaXMgZGlzYWJsZWQsIHNvIHJldHVybiB0aGUgZGlzYWJsZWQgY29sb3IuCisgICAgICAgICAgICAvL0luIHNvbWUgY2FzZXMgdGhpcyBtZWFucyBpZ25vcmluZyB0aGUgY29sb3Igc3BlY2lmaWVkIGJ5IHRoZQorICAgICAgICAgICAgLy9kZXZlbG9wZXIgb24gdGhlIGNvbXBvbmVudC4gSW4gb3RoZXIgY2FzZXMgaXQgbWVhbnMgdXNpbmcgYQorICAgICAgICAgICAgLy9zcGVjaWZpZWQgZGlzYWJsZWRUZXh0Q29sb3IsIHN1Y2ggYXMgb24gSlRleHRDb21wb25lbnRzLgorICAgICAgICAgICAgLy9Gb3IgZXhhbXBsZSwgSkxhYmVsIGRvZXNuJ3Qgc3BlY2lmeSBhIGRpc2FibGVkIGNvbG9yIHRoYXQgdGhlCisgICAgICAgICAgICAvL2RldmVsb3BlciBjYW4gc2V0LCB5ZXQgaXQgc2hvdWxkIGhhdmUgYSBkaXNhYmxlZCBjb2xvciB0byB0aGUKKyAgICAgICAgICAgIC8vdGV4dCB3aGVuIHRoZSBsYWJlbCBpcyBkaXNhYmxlZC4gVGhpcyBjb2RlIGFsbG93cyBmb3IgdGhhdC4KKyAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgSlRleHRDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICBKVGV4dENvbXBvbmVudCB0eHQgPSAoSlRleHRDb21wb25lbnQpYzsKKyAgICAgICAgICAgICAgICBDb2xvciBkaXNhYmxlZENvbG9yID0gdHh0LmdldERpc2FibGVkVGV4dENvbG9yKCk7CisgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkQ29sb3IgPT0gbnVsbCB8fCBkaXNhYmxlZENvbG9yIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29sb3JGb3JTdGF0ZShjb250ZXh0LCB0eXBlKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBKTGFiZWwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBDb2xvclR5cGUuRk9SRUdST1VORCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENvbG9yVHlwZS5URVhUX0ZPUkVHUk9VTkQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbG9yRm9yU3RhdGUoY29udGV4dCwgdHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gVGhlbiB1c2Ugd2hhdCB3ZSd2ZSBsb2NhbGx5IGRlZmluZWQKLSAgICAgICAgQ29sb3IgY29sb3IgPSBnZXRDb2xvckZvclN0YXRlKGNvbnRleHQsIHR5cGUpOworCisgICAgICAgIC8vIElmIHRoZSBkZXZlbG9wZXIgaGFzIHNwZWNpZmllZCBhIGNvbG9yLCBwcmVmZXIgaXQuIE90aGVyd2lzZSwgZ2V0CisgICAgICAgIC8vIHRoZSBjb2xvciBmb3IgdGhlIHN0YXRlLgorICAgICAgICBDb2xvciBjb2xvciA9IG51bGw7CisgICAgICAgIGlmICghaWQuaXNTdWJyZWdpb24oKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ29sb3JUeXBlLkJBQ0tHUk9VTkQpIHsKKyAgICAgICAgICAgICAgICBjb2xvciA9IGMuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBDb2xvclR5cGUuRk9SRUdST1VORCkgeworICAgICAgICAgICAgICAgIGNvbG9yID0gYy5nZXRGb3JlZ3JvdW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IENvbG9yVHlwZS5URVhUX0ZPUkVHUk9VTkQpIHsKKyAgICAgICAgICAgICAgICBjb2xvciA9IGMuZ2V0Rm9yZWdyb3VuZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbG9yID09IG51bGwgfHwgY29sb3IgaW5zdGFuY2VvZiBVSVJlc291cmNlKSB7CisgICAgICAgICAgICAvLyBUaGVuIHVzZSB3aGF0IHdlJ3ZlIGxvY2FsbHkgZGVmaW5lZAorICAgICAgICAgICAgY29sb3IgPSBnZXRDb2xvckZvclN0YXRlKGNvbnRleHQsIHR5cGUpOworICAgICAgICB9CisKICAgICAgICAgaWYgKGNvbG9yID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIE5vIGNvbG9yLCBmYWxsYmFjayB0byB0aGF0IG9mIHRoZSB3aWRnZXQuCiAgICAgICAgICAgICBpZiAodHlwZSA9PSBDb2xvclR5cGUuQkFDS0dST1VORCB8fApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUYWJiZWRQYW5lVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVGFiYmVkUGFuZVVJLmphdmEKaW5kZXggYWM5MTQxOS4uY2VmOTRlMSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUYWJiZWRQYW5lVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFRhYmJlZFBhbmVVSS5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBwYWNrYWdlIGphdmF4LnN3aW5nLnBsYWYuc3ludGg7CiAKIGltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuKjsKIGltcG9ydCBqYXZheC5zd2luZy50ZXh0LlZpZXc7CkBAIC0zNSw4ICszNCw2IEBACiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBzdW4uc3dpbmcucGxhZi5zeW50aC5TeW50aFVJOwogaW1wb3J0IHN1bi5zd2luZy5Td2luZ1V0aWxpdGllczI7CiAKQEAgLTUwLDYgKzQ3LDQwIEBACiAgKiBpbnNldHMgZm9yIHRoZSBzZWxlY3RlZCB0YWIuCiAgKi8KIGNsYXNzIFN5bnRoVGFiYmVkUGFuZVVJIGV4dGVuZHMgQmFzaWNUYWJiZWRQYW5lVUkgaW1wbGVtZW50cyBTeW50aFVJLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICB7CisgICAgLyoqCisgICAgICogPHA+SWYgbm9uLXplcm8sIHRhYk92ZXJsYXAgaW5kaWNhdGVzIHRoZSBhbW91bnQgdGhhdCB0aGUgdGFiIGJvdW5kcworICAgICAqIHNob3VsZCBiZSBhbHRlcmVkIHN1Y2ggdGhhdCB0aGV5IHdvdWxkIG92ZXJsYXAgd2l0aCBhIHRhYiBvbiBlaXRoZXIgdGhlCisgICAgICogbGVhZGluZyBvciB0cmFpbGluZyBlbmQgb2YgYSBydW4gKGllOiBpbiBUT1AsIHRoaXMgd291bGQgYmUgb24gdGhlIGxlZnQKKyAgICAgKiBvciByaWdodCkuPC9wPgorCisgICAgICogPHA+QSBwb3NpdGl2ZSBvdmVybGFwIGluZGljYXRlcyB0aGF0IHRhYnMgc2hvdWxkIG92ZXJsYXAgcmlnaHQvZG93biwKKyAgICAgKiB3aGlsZSBhIG5lZ2F0aXZlIG92ZXJsYXAgaW5kaWNhdGVzIHRoYSB0YWJzIHNob3VsZCBvdmVybGFwIGxlZnQvdXAuPC9wPgorICAgICAqCisgICAgICogPHA+V2hlbiB0YWJPdmVybGFwIGlzIHNwZWNpZmllZCwgaXQgYm90aCBjaGFuZ2VzIHRoZSB4IHBvc2l0aW9uIGFuZCB3aWR0aAorICAgICAqIG9mIHRoZSB0YWIgaWYgaW4gVE9QIG9yIEJPVFRPTSBwbGFjZW1lbnQsIGFuZCBjaGFuZ2VzIHRoZSB5IHBvc2l0aW9uIGFuZAorICAgICAqIGhlaWdodCBpZiBpbiBMRUZUIG9yIFJJR0hUIHBsYWNlbWVudC48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIGRvbmUgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uLiBDb25zaWRlciBhIHJ1biBvZiAxMCB0YWJzLgorICAgICAqIFRoZXJlIGFyZSA5IGdhcHMgYmV0d2VlbiB0aGVzZSB0YWJzLiBJZiB5b3Ugc3BlY2lmaWVkIGEgdGFiT3ZlcmxhcCBvZgorICAgICAqICItMSIsIHRoZW4gZWFjaCBvZiB0aGUgdGFicyAieCIgdmFsdWVzIHdpbGwgYmUgc2hpZnRlZCBsZWZ0LiBUaGlzIGxlYXZlcworICAgICAqIDkgcGl4ZWxzIG9mIHNwYWNlIHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHQtbW9zdCB0YWIgdW5wYWludGVkLiBTbywgZWFjaAorICAgICAqIHRhYidzIHdpZHRoIGlzIGFsc28gZXh0ZW5kZWQgYnkgMSBwaXhlbCB0byBtYWtlIHVwIHRoZSBkaWZmZXJlbmNlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgcHJvcGVydHkgcmVzcGVjdHMgdGhlIFJUTCBjb21wb25lbnQgb3JpZW50YXRpb24uPC9wPgorICAgICAqLworICAgIHByaXZhdGUgaW50IHRhYk92ZXJsYXAgPSAwOworCisgICAgLyoqCisgICAgICogV2hlbiBhIHRhYmJlZCBwYW5lIGhhcyBtdWx0aXBsZSByb3dzIG9mIHRhYnMsIHRoaXMgaW5kaWNhdGVzIHdoZXRoZXIKKyAgICAgKiB0aGUgdGFicyBpbiB0aGUgdXBwZXIgcm93KHMpIHNob3VsZCBleHRlbmQgdG8gdGhlIGJhc2Ugb2YgdGhlIHRhYiBhcmVhLAorICAgICAqIG9yIHdoZXRoZXIgdGhleSBzaG91bGQgcmVtYWluIGF0IHRoZWlyIG5vcm1hbCB0YWIgaGVpZ2h0LiBUaGlzIGRvZXMgbm90CisgICAgICogYWZmZWN0IHRoZSBib3VuZHMgb2YgdGhlIHRhYnMsIG9ubHkgdGhlIGJvdW5kcyBvZiBhcmVhIHBhaW50ZWQgYnkgdGhlCisgICAgICogdGFicy4gVGhlIHRleHQgcG9zaXRpb24gZG9lcyBub3QgY2hhbmdlLiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGJvdHRvbQorICAgICAqIGJvcmRlciBvZiB0aGUgdXBwZXIgcm93IG9mIHRhYnMgYmVjb21lcyBmdWxseSBvYnNjdXJlZCBieSB0aGUgbG93ZXIgdGFicywKKyAgICAgKiByZXN1bHRpbmcgaW4gYSBjbGVhbmVyIGxvb2suCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGV4dGVuZFRhYnNUb0Jhc2UgPSBmYWxzZTsKKwogICAgIHByaXZhdGUgU3ludGhDb250ZXh0IHRhYkFyZWFDb250ZXh0OwogICAgIHByaXZhdGUgU3ludGhDb250ZXh0IHRhYkNvbnRleHQ7CiAgICAgcHJpdmF0ZSBTeW50aENvbnRleHQgdGFiQ29udGVudENvbnRleHQ7CkBAIC02NCw2ICs5NSwxNCBAQAogCiAgICAgcHJpdmF0ZSBSZWN0YW5nbGUgdGFiQXJlYUJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoKTsKIAorICAgIC8vYWRkZWQgZm9yIHRoZSBOaW1idXMgbG9vayBhbmQgZmVlbCwgd2hlcmUgdGhlIHRhYiBhcmVhIGlzIHBhaW50ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZQorICAgIC8vc3RhdGUgZm9yIHRoZSBzZWxlY3RlZCB0YWIKKyAgICBwcml2YXRlIGJvb2xlYW4gdGFiQXJlYVN0YXRlc01hdGNoU2VsZWN0ZWRUYWIgPSBmYWxzZTsKKyAgICAvL2FkZGVkIGZvciB0aGUgTmltYnVzIExBRiB0byBlbnN1cmUgdGhhdCB0aGUgbGFiZWxzIGRvbid0IG1vdmUgd2hldGhlciB0aGUgdGFiIGlzIHNlbGVjdGVkIG9yIG5vdAorICAgIHByaXZhdGUgYm9vbGVhbiBudWRnZVNlbGVjdGVkTGFiZWwgPSB0cnVlOworCisgICAgcHJpdmF0ZSBib29sZWFuIHNlbGVjdGVkVGFiSXNQcmVzc2VkID0gZmFsc2U7CisKICAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudFVJIGNyZWF0ZVVJKEpDb21wb25lbnQgYykgewogICAgICAgICByZXR1cm4gbmV3IFN5bnRoVGFiYmVkUGFuZVVJKCk7CiAgICAgfQpAQCAtOTAsMTIgKzEyOSwxOSBAQAogICAgICAgICBpZiAoc3R5bGUgIT0gb2xkU3R5bGUpIHsKICAgICAgICAgICAgIHRhYlJ1bk92ZXJsYXkgPQogICAgICAgICAgICAgICAgIHN0eWxlLmdldEludChjb250ZXh0LCAiVGFiYmVkUGFuZS50YWJSdW5PdmVybGF5IiwgMCk7CisgICAgICAgICAgICB0YWJPdmVybGFwID0gc3R5bGUuZ2V0SW50KGNvbnRleHQsICJUYWJiZWRQYW5lLnRhYk92ZXJsYXAiLCAwKTsKKyAgICAgICAgICAgIGV4dGVuZFRhYnNUb0Jhc2UgPSBzdHlsZS5nZXRCb29sZWFuKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICJUYWJiZWRQYW5lLmV4dGVuZFRhYnNUb0Jhc2UiLCBmYWxzZSk7CiAgICAgICAgICAgICB0ZXh0SWNvbkdhcCA9IHN0eWxlLmdldEludChjb250ZXh0LCAiVGFiYmVkUGFuZS50ZXh0SWNvbkdhcCIsIDApOwogICAgICAgICAgICAgc2VsZWN0ZWRUYWJQYWRJbnNldHMgPSAoSW5zZXRzKXN0eWxlLmdldChjb250ZXh0LAogICAgICAgICAgICAgICAgICJUYWJiZWRQYW5lLnNlbGVjdGVkVGFiUGFkSW5zZXRzIik7CiAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUYWJQYWRJbnNldHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFiUGFkSW5zZXRzID0gbmV3IEluc2V0cygwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhYkFyZWFTdGF0ZXNNYXRjaFNlbGVjdGVkVGFiID0gc3R5bGUuZ2V0Qm9vbGVhbihjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAiVGFiYmVkUGFuZS50YWJBcmVhU3RhdGVzTWF0Y2hTZWxlY3RlZFRhYiIsIGZhbHNlKTsKKyAgICAgICAgICAgIG51ZGdlU2VsZWN0ZWRMYWJlbCA9IHN0eWxlLmdldEJvb2xlYW4oY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIlRhYmJlZFBhbmUubnVkZ2VTZWxlY3RlZExhYmVsIiwgdHJ1ZSk7CiAgICAgICAgICAgICBpZiAob2xkU3R5bGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHVuaW5zdGFsbEtleWJvYXJkQWN0aW9ucygpOwogICAgICAgICAgICAgICAgIGluc3RhbGxLZXlib2FyZEFjdGlvbnMoKTsKQEAgLTE5OSw2ICsyNDUsMTQgQEAKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgSkJ1dHRvbiBjcmVhdGVTY3JvbGxCdXR0b24oaW50IGRpcmVjdGlvbikgeworICAgICAgICAvLyBhZGRlZCBmb3IgTmltYnVzIExBRiBzbyB0aGF0IGl0IGNhbiB1c2UgdGhlIGJhc2ljIGFycm93IGJ1dHRvbnMKKyAgICAgICAgLy8gVUlNYW5hZ2VyIGlzIHF1ZXJpZWQgZGlyZWN0bHkgaGVyZSBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGJlZm9yZQorICAgICAgICAvLyB1cGRhdGVTdHlsZSBpcyBjYWxsZWQgc28gdGhlIHN0eWxlIGNhbiBub3QgYmUgcXVlcmllZCBkaXJlY3RseQorICAgICAgICBpZiAoVUlNYW5hZ2VyLmdldEJvb2xlYW4oIlRhYmJlZFBhbmUudXNlQmFzaWNBcnJvd3MiKSkgeworICAgICAgICAgICAgSkJ1dHRvbiBidG4gPSBzdXBlci5jcmVhdGVTY3JvbGxCdXR0b24oZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGJ0bi5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpKTsKKyAgICAgICAgICAgIHJldHVybiBidG47CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBTeW50aFNjcm9sbGFibGVUYWJCdXR0b24oZGlyZWN0aW9uKTsKICAgICB9CiAKQEAgLTIwOCw2ICsyNjIsNzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICoKKyAgICAgKiBPdmVycmlkZGVuIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgc2VsZWN0ZWQgdGFiIGlzIGFsc28gcHJlc3NlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTW91c2VMaXN0ZW5lciBjcmVhdGVNb3VzZUxpc3RlbmVyKCkgeworICAgICAgICBmaW5hbCBNb3VzZUxpc3RlbmVyIGRlbGVnYXRlID0gc3VwZXIuY3JlYXRlTW91c2VMaXN0ZW5lcigpOworICAgICAgICBmaW5hbCBNb3VzZU1vdGlvbkxpc3RlbmVyIGRlbGVnYXRlMiA9IChNb3VzZU1vdGlvbkxpc3RlbmVyKWRlbGVnYXRlOworICAgICAgICByZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7IGRlbGVnYXRlLm1vdXNlQ2xpY2tlZChlKTsgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKE1vdXNlRXZlbnQgZSkgeyBkZWxlZ2F0ZS5tb3VzZUVudGVyZWQoZSk7IH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZSkgeyBkZWxlZ2F0ZS5tb3VzZUV4aXRlZChlKTsgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0YWJQYW5lLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgdGFiSW5kZXggPSB0YWJGb3JDb29yZGluYXRlKHRhYlBhbmUsIGUuZ2V0WCgpLCBlLmdldFkoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRhYkluZGV4ID49IDAgJiYgdGFiUGFuZS5pc0VuYWJsZWRBdCh0YWJJbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhYkluZGV4ID09IHRhYlBhbmUuZ2V0U2VsZWN0ZWRJbmRleCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGlja2luZyBvbiBzZWxlY3RlZCB0YWIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFiSXNQcmVzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyBuZWVkIHRvIGp1c3QgcmVwYWludCB0aGUgdGFiIGFyZWEhCisgICAgICAgICAgICAgICAgICAgICAgICB0YWJQYW5lLnJlcGFpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vZm9yd2FyZCB0aGUgZXZlbnQgKHRoaXMgd2lsbCBzZXQgdGhlIHNlbGVjdGVkIGluZGV4LCBvciBub25lIGF0IGFsbAorICAgICAgICAgICAgICAgIGRlbGVnYXRlLm1vdXNlUHJlc3NlZChlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUYWJJc1ByZXNzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWJJc1ByZXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPIG5lZWQgdG8ganVzdCByZXBhaW50IHRoZSB0YWIgYXJlYSEKKyAgICAgICAgICAgICAgICAgICAgdGFiUGFuZS5yZXBhaW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vZm9yd2FyZCB0aGUgZXZlbnQKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5tb3VzZVJlbGVhc2VkKGUpOworCisgICAgICAgICAgICAgICAgLy9oYWNrOiBUaGUgc3VwZXIgbWV0aG9kICpzaG91bGQqIGJlIHNldHRpbmcgdGhlIG1vdXNlLW92ZXIgcHJvcGVydHkgY29ycmVjdGx5CisgICAgICAgICAgICAgICAgLy9oZXJlLCBidXQgaXQgZG9lc24ndC4gVGhhdCBpcywgd2hlbiB0aGUgbW91c2UgaXMgcmVsZWFzZWQsIHdoYXRldmVyIHRhYiBpcyBiZWxvdyB0aGUKKyAgICAgICAgICAgICAgICAvL3JlbGVhc2VkIG1vdXNlIHNob3VsZCBiZSBpbiByb2xsb3ZlciBzdGF0ZS4gQnV0LCBpZiB5b3Ugc2VsZWN0IGEgdGFiIGFuZCBkb24ndAorICAgICAgICAgICAgICAgIC8vbW92ZSB0aGUgbW91c2UsIHRoaXMgZG9lc24ndCBoYXBwZW4uIEhlbmNlLCBmb3J3YXJkaW5nIHRoZSBldmVudC4KKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZTIubW91c2VNb3ZlZChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldFRhYkxhYmVsU2hpZnRYKGludCB0YWJQbGFjZW1lbnQsIGludCB0YWJJbmRleCwgYm9vbGVhbiBpc1NlbGVjdGVkKSB7CisgICAgICAgIGlmIChudWRnZVNlbGVjdGVkTGFiZWwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUYWJMYWJlbFNoaWZ0WCh0YWJQbGFjZW1lbnQsIHRhYkluZGV4LCBpc1NlbGVjdGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRUYWJMYWJlbFNoaWZ0WShpbnQgdGFiUGxhY2VtZW50LCBpbnQgdGFiSW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCkgeworICAgICAgICBpZiAobnVkZ2VTZWxlY3RlZExhYmVsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFiTGFiZWxTaGlmdFkodGFiUGxhY2VtZW50LCB0YWJJbmRleCwgaXNTZWxlY3RlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShHcmFwaGljcyBnLCBKQ29tcG9uZW50IGMpIHsKICAgICAgICAgU3ludGhDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KGMpOwogCkBAIC0zMjEsNiArNDQ0LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSB0YWJBcmVhQm91bmRzKSB7CiAgICAgICAgIFJlY3RhbmdsZSBjbGlwUmVjdCA9IGcuZ2V0Q2xpcEJvdW5kcygpOwogCisgICAgICAgIC8vaWYgdGhlIHRhYiBhcmVhJ3Mgc3RhdGVzIHNob3VsZCBtYXRjaCB0aGF0IG9mIHRoZSBzZWxlY3RlZCB0YWIsIHRoZW4KKyAgICAgICAgLy9maXJzdCB1cGRhdGUgdGhlIHNlbGVjdGVkIHRhYidzIHN0YXRlcywgdGhlbiBzZXQgdGhlIHN0YXRlCisgICAgICAgIC8vZm9yIHRoZSB0YWIgYXJlYSB0byBtYXRjaAorICAgICAgICAvL290aGVyd2lzZSwgcmVzdG9yZSB0aGUgdGFiIGFyZWEncyBzdGF0ZSB0byBFTkFCTEVEICh3aGljaCBpcyB0aGUKKyAgICAgICAgLy9vbmx5IHN1cHBvcnRlZCBzdGF0ZSBvdGhlcndpc2UpLgorICAgICAgICBpZiAodGFiQXJlYVN0YXRlc01hdGNoU2VsZWN0ZWRUYWIgJiYgc2VsZWN0ZWRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICB1cGRhdGVUYWJDb250ZXh0KHNlbGVjdGVkSW5kZXgsIHRydWUsIHNlbGVjdGVkVGFiSXNQcmVzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFJvbGxvdmVyVGFiKCkgPT0gc2VsZWN0ZWRJbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9jdXNJbmRleCgpID09IHNlbGVjdGVkSW5kZXgpKTsKKyAgICAgICAgICAgIHNzLnNldENvbXBvbmVudFN0YXRlKHRhYkNvbnRleHQuZ2V0Q29tcG9uZW50U3RhdGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcy5zZXRDb21wb25lbnRTdGF0ZShTeW50aENvbnN0YW50cy5FTkFCTEVEKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFBhaW50IHRoZSB0YWIgYXJlYS4KICAgICAgICAgU3ludGhMb29rQW5kRmVlbC51cGRhdGVTdWJyZWdpb24oc3MsIGcsIHRhYkFyZWFCb3VuZHMpOwogICAgICAgICBzcy5nZXRQYWludGVyKCkucGFpbnRUYWJiZWRQYW5lVGFiQXJlYUJhY2tncm91bmQoc3MsIGcsCkBAIC0zNjIsMTcgKzQ5OSwyMiBAQAogCiAgICAgICAgIFJlY3RhbmdsZSByID0gbnVsbDsKIAotICAgICAgICBpZiAoKG9sZFJvbGxvdmVyVGFiID49IDApICYmIChvbGRSb2xsb3ZlclRhYiA8IHRhYlBhbmUuZ2V0VGFiQ291bnQoKSkpIHsKLSAgICAgICAgICAgIHIgPSBnZXRUYWJCb3VuZHModGFiUGFuZSwgb2xkUm9sbG92ZXJUYWIpOwotICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhYlBhbmUucmVwYWludChyKTsKKyAgICAgICAgaWYgKG9sZFJvbGxvdmVyVGFiICE9IGluZGV4ICYmIHRhYkFyZWFTdGF0ZXNNYXRjaFNlbGVjdGVkVGFiKSB7CisgICAgICAgICAgICAvL1RPRE8gbmVlZCB0byBqdXN0IHJlcGFpbnQgdGhlIHRhYiBhcmVhIQorICAgICAgICAgICAgdGFiUGFuZS5yZXBhaW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKG9sZFJvbGxvdmVyVGFiID49IDApICYmIChvbGRSb2xsb3ZlclRhYiA8IHRhYlBhbmUuZ2V0VGFiQ291bnQoKSkpIHsKKyAgICAgICAgICAgICAgICByID0gZ2V0VGFiQm91bmRzKHRhYlBhbmUsIG9sZFJvbGxvdmVyVGFiKTsKKyAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlBhbmUucmVwYWludChyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgciA9IGdldFRhYkJvdW5kcyh0YWJQYW5lLCBpbmRleCk7Ci0gICAgICAgICAgICBpZiAociAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFiUGFuZS5yZXBhaW50KHIpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICByID0gZ2V0VGFiQm91bmRzKHRhYlBhbmUsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlBhbmUucmVwYWludChyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zODMsMTggKzUyNSw1MSBAQAogICAgICAgICBSZWN0YW5nbGUgdGFiUmVjdCA9IHJlY3RzW3RhYkluZGV4XTsKICAgICAgICAgaW50IHNlbGVjdGVkSW5kZXggPSB0YWJQYW5lLmdldFNlbGVjdGVkSW5kZXgoKTsKICAgICAgICAgYm9vbGVhbiBpc1NlbGVjdGVkID0gc2VsZWN0ZWRJbmRleCA9PSB0YWJJbmRleDsKLSAgICAgICAgdXBkYXRlVGFiQ29udGV4dCh0YWJJbmRleCwgaXNTZWxlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFJvbGxvdmVyVGFiKCkgPT0gdGFiSW5kZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9jdXNJbmRleCgpID09IHRhYkluZGV4KSk7CisgICAgICAgIHVwZGF0ZVRhYkNvbnRleHQodGFiSW5kZXgsIGlzU2VsZWN0ZWQsIGlzU2VsZWN0ZWQgJiYgc2VsZWN0ZWRUYWJJc1ByZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFJvbGxvdmVyVGFiKCkgPT0gdGFiSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRGb2N1c0luZGV4KCkgPT0gdGFiSW5kZXgpKTsKIAogICAgICAgICBTeW50aExvb2tBbmRGZWVsLnVwZGF0ZVN1YnJlZ2lvbihzcywgZywgdGFiUmVjdCk7Ci0gICAgICAgIHRhYkNvbnRleHQuZ2V0UGFpbnRlcigpLnBhaW50VGFiYmVkUGFuZVRhYkJhY2tncm91bmQodGFiQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgdGFiUmVjdC54LCB0YWJSZWN0LnksIHRhYlJlY3Qud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlJlY3QuaGVpZ2h0LCB0YWJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiUGFuZS5nZXRUYWJQbGFjZW1lbnQoKSk7CisgICAgICAgIGludCB4ID0gdGFiUmVjdC54OworICAgICAgICBpbnQgeSA9IHRhYlJlY3QueTsKKyAgICAgICAgaW50IGhlaWdodCA9IHRhYlJlY3QuaGVpZ2h0OworICAgICAgICBpbnQgd2lkdGggPSB0YWJSZWN0LndpZHRoOworICAgICAgICBpbnQgcGxhY2VtZW50ID0gdGFiUGFuZS5nZXRUYWJQbGFjZW1lbnQoKTsKKyAgICAgICAgaWYgKGV4dGVuZFRhYnNUb0Jhc2UgJiYgcnVuQ291bnQgPiAxKSB7CisgICAgICAgICAgICAvL3BhaW50IHRoaXMgdGFiIHN1Y2ggdGhhdCBpdHMgZWRnZSBjbG9zZXN0IHRvIHRoZSBiYXNlIGlzIGVxdWFsIHRvCisgICAgICAgICAgICAvL2VkZ2Ugb2YgdGhlIHNlbGVjdGVkIHRhYiBjbG9zZXN0IHRvIHRoZSBiYXNlLiBJbiB0ZXJtcyBvZiB0aGUgVE9QCisgICAgICAgICAgICAvL3RhYiBwbGFjZW1lbnQsIHRoaXMgd2lsbCBjYXVzZSB0aGUgYm90dG9tIG9mIGVhY2ggdGFiIHRvIGJlCisgICAgICAgICAgICAvL3BhaW50ZWQgZXZlbiB3aXRoIHRoZSBib3R0b20gb2YgdGhlIHNlbGVjdGVkIHRhYi4gVGhpcyBpcyBiZWNhdXNlCisgICAgICAgICAgICAvL2luIGVhY2ggdGFiIHBsYWNlbWVudCAoVE9QLCBMRUZULCBCT1RUT00sIFJJR0hUKSB0aGUgc2VsZWN0ZWQgdGFiCisgICAgICAgICAgICAvL2lzIGNsb3Nlc3QgdG8gdGhlIGJhc2UuCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSByZWN0c1tzZWxlY3RlZEluZGV4XTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21ZID0gci55ICsgci5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBib3R0b21ZIC0gdGFiUmVjdC55OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByaWdodFggPSByLnggKyByLndpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSByaWdodFggLSB0YWJSZWN0Lng7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCT1RUT006CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wWSA9IHIueTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9ICh0YWJSZWN0LnkgKyB0YWJSZWN0LmhlaWdodCkgLSB0b3BZOworICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHRvcFk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0WCA9IHIueDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gKHRhYlJlY3QueCArIHRhYlJlY3Qud2lkdGgpIC0gbGVmdFg7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdFg7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGFiQ29udGV4dC5nZXRQYWludGVyKCkucGFpbnRUYWJiZWRQYW5lVGFiQmFja2dyb3VuZCh0YWJDb250ZXh0LCBnLAorICAgICAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIHRhYkluZGV4LCBwbGFjZW1lbnQpOwogICAgICAgICB0YWJDb250ZXh0LmdldFBhaW50ZXIoKS5wYWludFRhYmJlZFBhbmVUYWJCb3JkZXIodGFiQ29udGV4dCwgZywKLSAgICAgICAgICAgICAgICAgICB0YWJSZWN0LngsIHRhYlJlY3QueSwgdGFiUmVjdC53aWR0aCwgdGFiUmVjdC5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgdGFiSW5kZXgsIHRhYlBhbmUuZ2V0VGFiUGxhY2VtZW50KCkpOworICAgICAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIHRhYkluZGV4LCBwbGFjZW1lbnQpOwogCiAgICAgICAgIGlmICh0YWJQYW5lLmdldFRhYkNvbXBvbmVudEF0KHRhYkluZGV4KSA9PSBudWxsKSB7CiAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSB0YWJQYW5lLmdldFRpdGxlQXQodGFiSW5kZXgpOwpAQCAtNTYxLDcgKzczNiw3IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIEluc2V0cyBnZXRUYWJJbnNldHMoaW50IHRhYlBsYWNlbWVudCwgaW50IHRhYkluZGV4KSB7Ci0gICAgICAgIHVwZGF0ZVRhYkNvbnRleHQodGFiSW5kZXgsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgdXBkYXRlVGFiQ29udGV4dCh0YWJJbmRleCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldEZvY3VzSW5kZXgoKSA9PSB0YWJJbmRleCkpOwogICAgICAgICByZXR1cm4gdGFiSW5zZXRzOwogICAgIH0KQEAgLTU3NSw3ICs3NTAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUYWJDb250ZXh0KGludCBpbmRleCwgYm9vbGVhbiBzZWxlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTW91c2VPdmVyLCBib29sZWFuIGhhc0ZvY3VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc01vdXNlRG93biwgYm9vbGVhbiBpc01vdXNlT3ZlciwgYm9vbGVhbiBoYXNGb2N1cykgewogICAgICAgICBpbnQgc3RhdGUgPSAwOwogICAgICAgICBpZiAoIXRhYlBhbmUuaXNFbmFibGVkKCkgfHwgIXRhYlBhbmUuaXNFbmFibGVkQXQoaW5kZXgpKSB7CiAgICAgICAgICAgICBzdGF0ZSB8PSBTeW50aENvbnN0YW50cy5ESVNBQkxFRDsKQEAgLTU5OSw5ICs3NzQsNjggQEAKICAgICAgICAgaWYgKGhhc0ZvY3VzICYmIHRhYlBhbmUuaGFzRm9jdXMoKSkgewogICAgICAgICAgICAgc3RhdGUgfD0gU3ludGhDb25zdGFudHMuRk9DVVNFRDsgLy8gaW5kaXZpZHVhbCB0YWIgaGFzIGZvY3VzCiAgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTW91c2VEb3duKSB7CisgICAgICAgICAgICBzdGF0ZSB8PSBTeW50aENvbnN0YW50cy5QUkVTU0VEOworICAgICAgICB9CisKICAgICAgICAgdGFiQ29udGV4dC5zZXRDb21wb25lbnRTdGF0ZShzdGF0ZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKgorICAgICAqIE92ZXJyaWRkZW4gdG8gY3JlYXRlIGEgVGFiYmVkUGFuZUxheW91dCBzdWJjbGFzcyB3aGljaCB0YWtlcyBpbnRvCisgICAgICogYWNjb3VudCB0YWJPdmVybGFwLgorICAgICAqLworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgTGF5b3V0TWFuYWdlciBjcmVhdGVMYXlvdXRNYW5hZ2VyKCkgeworICAgICAgICBpZiAodGFiUGFuZS5nZXRUYWJMYXlvdXRQb2xpY3koKSA9PSBKVGFiYmVkUGFuZS5TQ1JPTExfVEFCX0xBWU9VVCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUxheW91dE1hbmFnZXIoKTsKKyAgICAgICAgfSBlbHNlIHsgLyogV1JBUF9UQUJfTEFZT1VUICovCisgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmJlZFBhbmVMYXlvdXQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2FsY3VsYXRlTGF5b3V0SW5mbygpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2FsY3VsYXRlTGF5b3V0SW5mbygpOworICAgICAgICAgICAgICAgICAgICAvL3NoaWZ0IGFsbCB0aGUgdGFicywgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJPdmVybGFwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWJDb3VudCA9IHRhYlBhbmUuZ2V0VGFiQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbGVmdC10by1yaWdodC9yaWdodC10by1sZWZ0IG9ubHkgYWZmZWN0cyBsYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vd2hlbiBwbGFjZW1lbnQgaXMgVE9QIG9yIEJPVFRPTQorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsdHIgPSB0YWJQYW5lLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkuaXNMZWZ0VG9SaWdodCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJ1bkNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSB0YWJSdW5zW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0ID0gdGFiUnVuc1soaSA9PSBydW5Db3VudCAtIDEpPyAwIDogaSArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSAobmV4dCAhPSAwPyBuZXh0IC0gMTogdGFiQ291bnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gc3RhcnQrMTsgaiA8PSBlbmQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4c2hpZnQgYW5kIHlzaGlmdCByZXByZXNlbnQgdGhlIGFtb3VudCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGlvbiB0byBzaGlmdCB0aGUgdGFiIGluIHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BlY3RpdmUgYXhpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c2hpZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmUgeHNoaWZ0IGFuZCB5IHNoaWZ0IGJhc2VkIG9uIHRhYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhbmQgbHRyL3J0bAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRhYlBhbmUuZ2V0VGFiUGxhY2VtZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSlRhYmJlZFBhbmUuVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKVGFiYmVkUGFuZS5CT1RUT006CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNoaWZ0ID0gbHRyID8gdGFiT3ZlcmxhcCA6IC10YWJPdmVybGFwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKVGFiYmVkUGFuZS5MRUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKVGFiYmVkUGFuZS5SSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c2hpZnQgPSB0YWJPdmVybGFwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLy9kbyBub3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdHNbal0ueCArPSB4c2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RzW2pdLnkgKz0geXNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0c1tqXS53aWR0aCArPSBNYXRoLmFicyh4c2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0c1tqXS5oZWlnaHQgKz0gTWF0aC5hYnMoeXNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBTeW50aFNjcm9sbGFibGVUYWJCdXR0b24gZXh0ZW5kcyBTeW50aEFycm93QnV0dG9uIGltcGxlbWVudHMKICAgICAgICAgICAgIFVJUmVzb3VyY2UgewogICAgICAgICBwdWJsaWMgU3ludGhTY3JvbGxhYmxlVGFiQnV0dG9uKGludCBkaXJlY3Rpb24pIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVGFibGVIZWFkZXJVSS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUYWJsZUhlYWRlclVJLmphdmEKaW5kZXggMjBkM2MwMS4uYjM3ZDlmMSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUYWJsZUhlYWRlclVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUYWJsZUhlYWRlclVJLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIGltcG9ydCBqYXZheC5zd2luZy5wbGFmLmJhc2ljLio7CiBpbXBvcnQgamF2YXguc3dpbmcudGFibGUuKjsKIAoraW1wb3J0IHN1bi5zd2luZy5EZWZhdWx0TG9va3VwOwogaW1wb3J0IHN1bi5zd2luZy5wbGFmLnN5bnRoLio7CiBpbXBvcnQgc3VuLnN3aW5nLnRhYmxlLio7CiAKQEAgLTE2MCw2ICsxNjEsNyBAQAogICAgIHByaXZhdGUgY2xhc3MgSGVhZGVyUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVDZWxsSGVhZGVyUmVuZGVyZXIgewogICAgICAgICBIZWFkZXJSZW5kZXJlcigpIHsKICAgICAgICAgICAgIHNldEhvcml6b250YWxBbGlnbm1lbnQoSkxhYmVsLkxFQURJTkcpOworICAgICAgICAgICAgc2V0TmFtZSgiVGFibGVIZWFkZXIucmVuZGVyZXIiKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTc4LDI0ICsxODAsNDAgQEAKICAgICAgICAgICAgICAgICBTeW50aExvb2tBbmRGZWVsLnJlc2V0U2VsZWN0ZWRVSSgpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvL3N0dWZmIGEgdmFyaWFibGUgaW50byB0aGUgY2xpZW50IHByb3BlcnR5IG9mIHRoaXMgcmVuZGVyZXIgaW5kaWNhdGluZyB0aGUgc29ydCBvcmRlciwKKyAgICAgICAgICAgIC8vc28gdGhhdCBkaWZmZXJlbnQgcmVuZGVyaW5nIGNhbiBiZSBkb25lIGZvciB0aGUgaGVhZGVyIGJhc2VkIG9uIHNvcnRlZCBzdGF0ZS4KKyAgICAgICAgICAgIFJvd1NvcnRlciBycyA9IHRhYmxlID09IG51bGwgPyBudWxsIDogdGFibGUuZ2V0Um93U29ydGVyKCk7CisgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgUm93U29ydGVyLlNvcnRLZXk+IHNvcnRLZXlzID0gcnMgPT0gbnVsbCA/IG51bGwgOiBycy5nZXRTb3J0S2V5cygpOworICAgICAgICAgICAgaWYgKHNvcnRLZXlzICE9IG51bGwgJiYgc29ydEtleXMuc2l6ZSgpID4gMCAmJiBzb3J0S2V5cy5nZXQoMCkuZ2V0Q29sdW1uKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgdGFibGUuY29udmVydENvbHVtbkluZGV4VG9Nb2RlbChjb2x1bW4pKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKHNvcnRLZXlzLmdldCgwKS5nZXRTb3J0T3JkZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTQ0VORElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dENsaWVudFByb3BlcnR5KCJUYWJsZS5zb3J0T3JkZXIiLCAiQVNDRU5ESU5HIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBERVNDRU5ESU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgcHV0Q2xpZW50UHJvcGVydHkoIlRhYmxlLnNvcnRPcmRlciIsICJERVNDRU5ESU5HIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBVTlNPUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dENsaWVudFByb3BlcnR5KCJUYWJsZS5zb3J0T3JkZXIiLCAiVU5TT1JURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJDYW5ub3QgaGFwcGVuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRDbGllbnRQcm9wZXJ0eSgiVGFibGUuc29ydE9yZGVyIiwgIlVOU09SVEVEIik7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN1cGVyLmdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRhYmxlLCB2YWx1ZSwgaXNTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ZvY3VzLCByb3csIGNvbHVtbik7CiAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEJvcmRlcihCb3JkZXIgYm9yZGVyKSB7CiAgICAgICAgICAgICBpZiAoYm9yZGVyIGluc3RhbmNlb2YgU3ludGhCb3JkZXIpIHsKICAgICAgICAgICAgICAgICBzdXBlci5zZXRCb3JkZXIoYm9yZGVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gc3VwZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiVGFibGVIZWFkZXIucmVuZGVyZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFRhYmxlVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVGFibGVVSS5qYXZhCmluZGV4IGJlOTBhYzUuLjFiOGNmOTggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVGFibGVVSS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVGFibGVVSS5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAKIGltcG9ydCBqYXZhLmF3dC5Db2xvcjsKIGltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwogaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwogaW1wb3J0IGphdmEuYXd0LlBvaW50OwogaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKQEAgLTcwLDYgKzcxLDcgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiB1c2VUYWJsZUNvbG9yczsKICAgICBwcml2YXRlIGJvb2xlYW4gdXNlVUlCb3JkZXI7CisgICAgcHJpdmF0ZSBDb2xvciBhbHRlcm5hdGVDb2xvcjsgLy90aGUgYmFja2dyb3VuZCBjb2xvciB0byB1c2UgZm9yIGNlbGxzIGZvciBhbHRlcm5hdGUgY2VsbHMKIAogICAgIC8vIFRhYmxlQ2VsbFJlbmRlcmVyIGluc3RhbGxlZCBvbiB0aGUgSlRhYmxlIGF0IHRoZSB0aW1lIHdlJ3JlIGluc3RhbGxlZCwKICAgICAvLyBjYWNoZWQgc28gdGhhdCB3ZSBjYW4gcmVpbnN0YWxsIHRoZW0gYXQgdW5pbnN0YWxsVUkgdGltZS4KQEAgLTE2MSw2ICsxNjMsMjEgQEAKICAgICAgICAgICAgIGlmIChyb3dIZWlnaHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIExvb2tBbmRGZWVsLmluc3RhbGxQcm9wZXJ0eSh0YWJsZSwgInJvd0hlaWdodCIsIHJvd0hlaWdodCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIHNob3dHcmlkID0gc3R5bGUuZ2V0Qm9vbGVhbihjb250ZXh0LCAiVGFibGUuc2hvd0dyaWQiLCB0cnVlKTsKKyAgICAgICAgICAgIGlmICghc2hvd0dyaWQpIHsKKyAgICAgICAgICAgICAgICB0YWJsZS5zZXRTaG93R3JpZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEaW1lbnNpb24gZCA9IHRhYmxlLmdldEludGVyY2VsbFNwYWNpbmcoKTsKKy8vICAgICAgICAgICAgaWYgKGQgPT0gbnVsbCB8fCBkIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkgeworICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGQgPSAoRGltZW5zaW9uKXN0eWxlLmdldChjb250ZXh0LCAiVGFibGUuaW50ZXJjZWxsU3BhY2luZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWx0ZXJuYXRlQ29sb3IgPSAoQ29sb3Ipc3R5bGUuZ2V0KGNvbnRleHQsICJUYWJsZS5hbHRlcm5hdGVSb3dDb2xvciIpOworICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRhYmxlLnNldEludGVyY2VsbFNwYWNpbmcoZCk7CisgICAgICAgICAgICB9CisKKwogICAgICAgICAgICAgaWYgKG9sZFN0eWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB1bmluc3RhbGxLZXlib2FyZEFjdGlvbnMoKTsKICAgICAgICAgICAgICAgICBpbnN0YWxsS2V5Ym9hcmRBY3Rpb25zKCk7CkBAIC02MTcsNiArNjM0LDE0IEBACiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgVGFibGVDZWxsUmVuZGVyZXIgcmVuZGVyZXIgPSB0YWJsZS5nZXRDZWxsUmVuZGVyZXIocm93LCBjb2x1bW4pOwogICAgICAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IHRhYmxlLnByZXBhcmVSZW5kZXJlcihyZW5kZXJlciwgcm93LCBjb2x1bW4pOworICAgICAgICAgICAgQ29sb3IgYiA9IGNvbXBvbmVudC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICBpZiAoKGIgPT0gbnVsbCB8fCBiIGluc3RhbmNlb2YgVUlSZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICB8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBTeW50aEJvb2xlYW5UYWJsZUNlbGxSZW5kZXJlcikKKyAgICAgICAgICAgICAgICAgICAgJiYgIXRhYmxlLmlzQ2VsbFNlbGVjdGVkKHJvdywgY29sdW1uKSkgeworICAgICAgICAgICAgICAgIGlmIChhbHRlcm5hdGVDb2xvciAhPSBudWxsICYmIHJvdyAlIDIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0QmFja2dyb3VuZChhbHRlcm5hdGVDb2xvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVuZGVyZXJQYW5lLnBhaW50Q29tcG9uZW50KGcsIGNvbXBvbmVudCwgdGFibGUsIGNlbGxSZWN0LngsCiAgICAgICAgICAgICAgICAgICAgIGNlbGxSZWN0LnksIGNlbGxSZWN0LndpZHRoLCBjZWxsUmVjdC5oZWlnaHQsIHRydWUpOwogICAgICAgICB9CkBAIC02MzQsMTYgKzY1OSw4IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1Jvd1NlbGVjdGVkOwogCiAgICAgICAgIHB1YmxpYyBTeW50aEJvb2xlYW5UYWJsZUNlbGxSZW5kZXJlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICBzZXRIb3Jpem9udGFsQWxpZ25tZW50KEpMYWJlbC5DRU5URVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzdXBlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJUYWJsZS5jZWxsUmVuZGVyZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICBzZXROYW1lKCJUYWJsZS5jZWxsUmVuZGVyZXIiKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoCkBAIC02NTIsMTcgKzY2OSwyNCBAQAogICAgICAgICAgICAgaXNSb3dTZWxlY3RlZCA9IGlzU2VsZWN0ZWQ7CiAKICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0Rm9yZWdyb3VuZCh0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkpOwotICAgICAgICAgICAgICAgIHNldEJhY2tncm91bmQodGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpKTsKKyAgICAgICAgICAgICAgICBzZXRGb3JlZ3JvdW5kKHVud3JhcCh0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkpKTsKKyAgICAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKHVud3JhcCh0YWJsZS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0Rm9yZWdyb3VuZCh0YWJsZS5nZXRGb3JlZ3JvdW5kKCkpOwotICAgICAgICAgICAgICAgIHNldEJhY2tncm91bmQodGFibGUuZ2V0QmFja2dyb3VuZCgpKTsKKyAgICAgICAgICAgICAgICBzZXRGb3JlZ3JvdW5kKHVud3JhcCh0YWJsZS5nZXRGb3JlZ3JvdW5kKCkpKTsKKyAgICAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKHVud3JhcCh0YWJsZS5nZXRCYWNrZ3JvdW5kKCkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2V0U2VsZWN0ZWQoKHZhbHVlICE9IG51bGwgJiYgKChCb29sZWFuKXZhbHVlKS5ib29sZWFuVmFsdWUoKSkpOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIENvbG9yIHVud3JhcChDb2xvciBjKSB7CisgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFVJUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKGMuZ2V0UkdCKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKICAgICAgICAgICAgIHJldHVybiBpc1Jvd1NlbGVjdGVkID8gdHJ1ZSA6IHN1cGVyLmlzT3BhcXVlKCk7CiAgICAgICAgIH0KQEAgLTczMiw3ICs3NTYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uQ2xhc3MgPT0gSWNvbi5jbGFzcyB8fCBjb2x1bW5DbGFzcyA9PSBJbWFnZUljb24uY2xhc3MpIHsKICAgICAgICAgICAgICAgICBzZXRIb3Jpem9udGFsQWxpZ25tZW50KEpMYWJlbC5DRU5URVIpOwotICAgICAgICAgICAgICAgIHNldEljb24oKEljb24pdmFsdWUpOworICAgICAgICAgICAgICAgIHNldEljb24oKHZhbHVlIGluc3RhbmNlb2YgSWNvbikgPyAoSWNvbil2YWx1ZSA6IG51bGwpOwogICAgICAgICAgICAgICAgIHNldFRleHQoIiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uQ2xhc3MgPT0gRGF0ZS5jbGFzcykgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUZXh0QXJlYVVJLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFRleHRBcmVhVUkuamF2YQppbmRleCAzYTY1MGQyLi4wMTk0NzY1IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFRleHRBcmVhVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFRleHRBcmVhVUkuamF2YQpAQCAtMjcsMTAgKzI3LDExIEBACiAKIGltcG9ydCBqYXZheC5zd2luZy4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuKjsKIGltcG9ydCBqYXZheC5zd2luZy5wbGFmLmJhc2ljLkJhc2ljVGV4dEFyZWFVSTsKIGltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkZvY3VzTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudDsKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CiBpbXBvcnQgc3VuLnN3aW5nLnBsYWYuc3ludGguU3ludGhVSTsKIApAQCAtNTAsNyArNTEsNyBAQAogICoKICAqIEBhdXRob3IgIFNoYW5ub24gSGlja2V5CiAgKi8KLWNsYXNzIFN5bnRoVGV4dEFyZWFVSSBleHRlbmRzIEJhc2ljVGV4dEFyZWFVSSBpbXBsZW1lbnRzIFN5bnRoVUkgeworY2xhc3MgU3ludGhUZXh0QXJlYVVJIGV4dGVuZHMgQmFzaWNUZXh0QXJlYVVJIGltcGxlbWVudHMgU3ludGhVSSwgRm9jdXNMaXN0ZW5lciB7CiAgICAgcHJpdmF0ZSBTeW50aFN0eWxlIHN0eWxlOwogCiAgICAgLyoqCkBAIC02MywxNiArNjQsMjYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTeW50aFRleHRBcmVhVUkoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKKyAgICAgICAgZ2V0Q29tcG9uZW50KCkucmVwYWludCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKKyAgICAgICAgZ2V0Q29tcG9uZW50KCkucmVwYWludCgpOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGluc3RhbGxEZWZhdWx0cygpIHsKICAgICAgICAgLy8gSW5zdGFsbHMgdGhlIHRleHQgY3Vyc29yIG9uIHRoZSBjb21wb25lbnQKICAgICAgICAgc3VwZXIuaW5zdGFsbERlZmF1bHRzKCk7CiAgICAgICAgIHVwZGF0ZVN0eWxlKGdldENvbXBvbmVudCgpKTsKKyAgICAgICAgZ2V0Q29tcG9uZW50KCkuYWRkRm9jdXNMaXN0ZW5lcih0aGlzKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxEZWZhdWx0cygpIHsKICAgICAgICAgU3ludGhDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KGdldENvbXBvbmVudCgpLCBFTkFCTEVEKTsKIAogICAgICAgICBnZXRDb21wb25lbnQoKS5wdXRDbGllbnRQcm9wZXJ0eSgiY2FyZXRBc3BlY3RSYXRpbyIsIG51bGwpOworICAgICAgICBnZXRDb21wb25lbnQoKS5yZW1vdmVGb2N1c0xpc3RlbmVyKHRoaXMpOwogCiAgICAgICAgIHN0eWxlLnVuaW5zdGFsbERlZmF1bHRzKGNvbnRleHQpOwogICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVG9nZ2xlQnV0dG9uVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVG9nZ2xlQnV0dG9uVUkuamF2YQppbmRleCA3NGI5ZjdjLi5kNGIyMmJhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFRvZ2dsZUJ1dHRvblVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUb2dnbGVCdXR0b25VSS5qYXZhCkBAIC0yNSwxMiArMjUsMTAgQEAKIAogcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLnN5bnRoOwogCi1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC4qOwotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLio7Ci1pbXBvcnQgamF2YXguc3dpbmcucGxhZi4qOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuVmlldzsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKK2ltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuQ29tcG9uZW50VUk7CiAKIC8qKgogICogU3ludGgncyBUb2dnbGVCdXR0b25VSS4KQEAgLTQ1LDE1ICs0MywyMSBAQAogICAgICAgICByZXR1cm4gbmV3IFN5bnRoVG9nZ2xlQnV0dG9uVUkoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5UHJlZml4KCkgewogICAgICAgICByZXR1cm4gIlRvZ2dsZUJ1dHRvbi4iOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHZvaWQgcGFpbnRCYWNrZ3JvdW5kKFN5bnRoQ29udGV4dCBjb250ZXh0LCBHcmFwaGljcyBnLCBKQ29tcG9uZW50IGMpIHsKLSAgICAgICAgY29udGV4dC5nZXRQYWludGVyKCkucGFpbnRUb2dnbGVCdXR0b25CYWNrZ3JvdW5kKGNvbnRleHQsIGcsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmdldFdpZHRoKCksIGMuZ2V0SGVpZ2h0KCkpOworICAgICAgICBpZiAoKChBYnN0cmFjdEJ1dHRvbikgYykuaXNDb250ZW50QXJlYUZpbGxlZCgpKSB7CisgICAgICAgICAgICBpbnQgeCA9IDAsIHkgPSAwLCB3ID0gYy5nZXRXaWR0aCgpLCBoID0gYy5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIFN5bnRoUGFpbnRlciBwYWludGVyID0gY29udGV4dC5nZXRQYWludGVyKCk7CisgICAgICAgICAgICBwYWludGVyLnBhaW50VG9nZ2xlQnV0dG9uQmFja2dyb3VuZChjb250ZXh0LCBnLCB4LCB5LCB3LCBoKTsKKyAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHBhaW50Qm9yZGVyKFN5bnRoQ29udGV4dCBjb250ZXh0LCBHcmFwaGljcyBnLCBpbnQgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwgaW50IHcsIGludCBoKSB7CiAgICAgICAgIGNvbnRleHQuZ2V0UGFpbnRlcigpLnBhaW50VG9nZ2xlQnV0dG9uQm9yZGVyKGNvbnRleHQsIGcsIHgsIHksIHcsIGgpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUb29sQmFyVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVG9vbEJhclVJLmphdmEKaW5kZXggNjBhYTk1MS4uYzQ5NTM2YyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUb29sQmFyVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFRvb2xCYXJVSS5qYXZhCkBAIC0yNSwxOCArMjUsMjQgQEAKIAogcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLnN5bnRoOwogCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci4qOwotaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuKjsKK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YS5hd3QuQ29udGFpbmVyOworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKK2ltcG9ydCBqYXZhLmF3dC5JbnNldHM7CitpbXBvcnQgamF2YS5hd3QuTGF5b3V0TWFuYWdlcjsKK2ltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3g7CitpbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OworaW1wb3J0IGphdmF4LnN3aW5nLkpTZXBhcmF0b3I7CitpbXBvcnQgamF2YXguc3dpbmcuSlRvb2xCYXI7CitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5Db21wb25lbnRVSTsKIGltcG9ydCBqYXZheC5zd2luZy5wbGFmLmJhc2ljLkJhc2ljVG9vbEJhclVJOwotaW1wb3J0IHN1bi5zd2luZy5wbGFmLnN5bnRoLio7Ci0KK2ltcG9ydCBzdW4uc3dpbmcucGxhZi5zeW50aC5TeW50aEljb247CitpbXBvcnQgc3VuLnN3aW5nLnBsYWYuc3ludGguU3ludGhVSTsKIAogLyoqCiAgKiBBIFN5bnRoIEwmRiBpbXBsZW1lbnRhdGlvbiBvZiBUb29sQmFyVUkuICBUaGlzIGltcGxlbWVudGF0aW9uCkBAIC01NywyMyArNjMsMzUgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTeW50aFRvb2xCYXJVSSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGluc3RhbGxEZWZhdWx0cygpIHsKICAgICAgICAgdG9vbEJhci5zZXRMYXlvdXQoY3JlYXRlTGF5b3V0KCkpOwogICAgICAgICB1cGRhdGVTdHlsZSh0b29sQmFyKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsTGlzdGVuZXJzKCkgewogICAgICAgICBzdXBlci5pbnN0YWxsTGlzdGVuZXJzKCk7CiAgICAgICAgIHRvb2xCYXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxMaXN0ZW5lcnMoKSB7CiAgICAgICAgIHN1cGVyLnVuaW5zdGFsbExpc3RlbmVycygpOwogICAgICAgICB0b29sQmFyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0eWxlKEpUb29sQmFyIGMpIHsKLSAgICAgICAgU3ludGhDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KGMsIEVOQUJMRUQpOworICAgICAgICBTeW50aENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoCisgICAgICAgICAgICAgICAgYywgUmVnaW9uLlRPT0xfQkFSX0NPTlRFTlQsIG51bGwsIEVOQUJMRUQpOworICAgICAgICBjb250ZW50U3R5bGUgPSBTeW50aExvb2tBbmRGZWVsLnVwZGF0ZVN0eWxlKGNvbnRleHQsIHRoaXMpOworICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTsKKworICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dChjLCBSZWdpb24uVE9PTF9CQVJfRFJBR19XSU5ET1csIG51bGwsIEVOQUJMRUQpOworICAgICAgICBkcmFnV2luZG93U3R5bGUgPSBTeW50aExvb2tBbmRGZWVsLnVwZGF0ZVN0eWxlKGNvbnRleHQsIHRoaXMpOworICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTsKKworICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dChjLCBFTkFCTEVEKTsKICAgICAgICAgU3ludGhTdHlsZSBvbGRTdHlsZSA9IHN0eWxlOwogCiAgICAgICAgIHN0eWxlID0gU3ludGhMb29rQW5kRmVlbC51cGRhdGVTdHlsZShjb250ZXh0LCB0aGlzKTsKQEAgLTg2LDE2ICsxMDQsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGNvbnRleHQuZGlzcG9zZSgpOwotCi0gICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KGMsIFJlZ2lvbi5UT09MX0JBUl9DT05URU5ULCBFTkFCTEVEKTsKLSAgICAgICAgY29udGVudFN0eWxlID0gU3ludGhMb29rQW5kRmVlbC51cGRhdGVTdHlsZShjb250ZXh0LCB0aGlzKTsKLSAgICAgICAgY29udGV4dC5kaXNwb3NlKCk7Ci0KLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoYywgUmVnaW9uLlRPT0xfQkFSX0RSQUdfV0lORE9XLCBFTkFCTEVEKTsKLSAgICAgICAgZHJhZ1dpbmRvd1N0eWxlID0gU3ludGhMb29rQW5kRmVlbC51cGRhdGVTdHlsZShjb250ZXh0LCB0aGlzKTsKLSAgICAgICAgY29udGV4dC5kaXNwb3NlKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdW5pbnN0YWxsRGVmYXVsdHMoKSB7CiAgICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0b29sQmFyLCBFTkFCTEVEKTsKIApAQCAtMTA1LDEyICsxMTYsMTQgQEAKIAogICAgICAgICBoYW5kbGVJY29uID0gbnVsbDsKIAotICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dCh0b29sQmFyLCBSZWdpb24uVE9PTF9CQVJfQ09OVEVOVCwgRU5BQkxFRCk7CisgICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KHRvb2xCYXIsIFJlZ2lvbi5UT09MX0JBUl9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3R5bGUsIEVOQUJMRUQpOwogICAgICAgICBjb250ZW50U3R5bGUudW5pbnN0YWxsRGVmYXVsdHMoY29udGV4dCk7CiAgICAgICAgIGNvbnRleHQuZGlzcG9zZSgpOwogICAgICAgICBjb250ZW50U3R5bGUgPSBudWxsOwogCi0gICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KHRvb2xCYXIsIFJlZ2lvbi5UT09MX0JBUl9EUkFHX1dJTkRPVywgRU5BQkxFRCk7CisgICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KHRvb2xCYXIsIFJlZ2lvbi5UT09MX0JBUl9EUkFHX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ1dpbmRvd1N0eWxlLCBFTkFCTEVEKTsKICAgICAgICAgZHJhZ1dpbmRvd1N0eWxlLnVuaW5zdGFsbERlZmF1bHRzKGNvbnRleHQpOwogICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTsKICAgICAgICAgZHJhZ1dpbmRvd1N0eWxlID0gbnVsbDsKQEAgLTExOCwxMSArMTMxLDExIEBACiAgICAgICAgIHRvb2xCYXIuc2V0TGF5b3V0KG51bGwpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGluc3RhbGxDb21wb25lbnRzKCkgewotICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsQ29tcG9uZW50cygpIHt9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxDb21wb25lbnRzKCkgewotICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxDb21wb25lbnRzKCkge30KIAogICAgIHByb3RlY3RlZCBMYXlvdXRNYW5hZ2VyIGNyZWF0ZUxheW91dCgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTeW50aFRvb2xCYXJMYXlvdXRNYW5hZ2VyKCk7CkBAIC0xMzcsMTMgKzE1MCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBTeW50aExvb2tBbmRGZWVsLmdldFJlZ2lvbihjKSwgc3R5bGUsIHN0YXRlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN5bnRoQ29udGV4dCBnZXRDb250ZXh0KEpDb21wb25lbnQgYywgUmVnaW9uIHJlZ2lvbikgewotICAgICAgICByZXR1cm4gZ2V0Q29udGV4dChjLCByZWdpb24sIGdldENvbXBvbmVudFN0YXRlKGMsIHJlZ2lvbikpOworICAgIHByaXZhdGUgU3ludGhDb250ZXh0IGdldENvbnRleHQoSkNvbXBvbmVudCBjLCBSZWdpb24gcmVnaW9uLCBTeW50aFN0eWxlIHN0eWxlKSB7CisgICAgICAgIHJldHVybiBTeW50aENvbnRleHQuZ2V0Q29udGV4dChTeW50aENvbnRleHQuY2xhc3MsIGMsIHJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLCBnZXRDb21wb25lbnRTdGF0ZShjLCByZWdpb24pKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN5bnRoQ29udGV4dCBnZXRDb250ZXh0KEpDb21wb25lbnQgYywgUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXRlKSB7CisgICAgcHJpdmF0ZSBTeW50aENvbnRleHQgZ2V0Q29udGV4dChKQ29tcG9uZW50IGMsIFJlZ2lvbiByZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50aFN0eWxlIHN0eWxlLCBpbnQgc3RhdGUpIHsKICAgICAgICAgcmV0dXJuIFN5bnRoQ29udGV4dC5nZXRDb250ZXh0KFN5bnRoQ29udGV4dC5jbGFzcywgYywgcmVnaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ1dpbmRvd1N0eWxlLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwgc3RhdGUpOwogICAgIH0KIAogICAgIHByaXZhdGUgUmVnaW9uIGdldFJlZ2lvbihKQ29tcG9uZW50IGMpIHsKQEAgLTE1OCw2ICsxNzMsNyBAQAogICAgICAgICByZXR1cm4gU3ludGhMb29rQW5kRmVlbC5nZXRDb21wb25lbnRTdGF0ZShjKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoR3JhcGhpY3MgZywgSkNvbXBvbmVudCBjKSB7CiAgICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChjKTsKIApAQCAtMTY5LDYgKzE4NSw3IEBACiAgICAgICAgIGNvbnRleHQuZGlzcG9zZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcsIEpDb21wb25lbnQgYykgewogICAgICAgICBTeW50aENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoYyk7CiAKQEAgLTE4MywxMiArMjAwLDE1IEBACiAgICAgfQogCiAgICAgLy8gT3ZlcmxvYWRlZCB0byBkbyBub3RoaW5nIHNvIHdlIGNhbiBzaGFyZSBsaXN0ZW5lcnMuCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Qm9yZGVyVG9Ob25Sb2xsb3ZlcihDb21wb25lbnQgYykge30KIAogICAgIC8vIE92ZXJsb2FkZWQgdG8gZG8gbm90aGluZyBzbyB3ZSBjYW4gc2hhcmUgbGlzdGVuZXJzLgorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldEJvcmRlclRvUm9sbG92ZXIoQ29tcG9uZW50IGMpIHt9CiAKICAgICAvLyBPdmVybG9hZGVkIHRvIGRvIG5vdGhpbmcgc28gd2UgY2FuIHNoYXJlIGxpc3RlbmVycy4KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCb3JkZXJUb05vcm1hbChDb21wb25lbnQgYykge30KIAogICAgIHByb3RlY3RlZCB2b2lkIHBhaW50KFN5bnRoQ29udGV4dCBjb250ZXh0LCBHcmFwaGljcyBnKSB7CkBAIC0yMDEsNyArMjIxLDggQEAKICAgICAgICAgICAgICAgICAgICAgU3ludGhJY29uLmdldEljb25IZWlnaHQoaGFuZGxlSWNvbiwgY29udGV4dCkpOwogICAgICAgICB9CiAKLSAgICAgICAgU3ludGhDb250ZXh0IHN1YmNvbnRleHQgPSBnZXRDb250ZXh0KHRvb2xCYXIsIFJlZ2lvbi5UT09MX0JBUl9DT05URU5UKTsKKyAgICAgICAgU3ludGhDb250ZXh0IHN1YmNvbnRleHQgPSBnZXRDb250ZXh0KAorICAgICAgICAgICAgICAgIHRvb2xCYXIsIFJlZ2lvbi5UT09MX0JBUl9DT05URU5ULCBjb250ZW50U3R5bGUpOwogICAgICAgICBwYWludENvbnRlbnQoc3ViY29udGV4dCwgZywgY29udGVudFJlY3QpOwogICAgICAgICBzdWJjb250ZXh0LmRpc3Bvc2UoKTsKICAgICB9CkBAIC0yMTcsMTIgKzIzOCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sQmFyLmdldE9yaWVudGF0aW9uKCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHBhaW50RHJhZ1dpbmRvdyhHcmFwaGljcyBnKSB7CiAgICAgICAgIGludCB3ID0gZHJhZ1dpbmRvdy5nZXRXaWR0aCgpOwogICAgICAgICBpbnQgaCA9IGRyYWdXaW5kb3cuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0b29sQmFyLFJlZ2lvbi5UT09MX0JBUl9EUkFHX1dJTkRPVyk7Ci0gICAgICAgIFN5bnRoTG9va0FuZEZlZWwudXBkYXRlU3VicmVnaW9uKGNvbnRleHQsIGcsIG5ldyBSZWN0YW5nbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgdywgaCkpOworICAgICAgICBTeW50aENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoCisgICAgICAgICAgICAgICAgdG9vbEJhciwgUmVnaW9uLlRPT0xfQkFSX0RSQUdfV0lORE9XLCBkcmFnV2luZG93U3R5bGUpOworICAgICAgICBTeW50aExvb2tBbmRGZWVsLnVwZGF0ZVN1YnJlZ2lvbigKKyAgICAgICAgICAgICAgICBjb250ZXh0LCBnLCBuZXcgUmVjdGFuZ2xlKDAsIDAsIHcsIGgpKTsKICAgICAgICAgY29udGV4dC5nZXRQYWludGVyKCkucGFpbnRUb29sQmFyRHJhZ1dpbmRvd0JhY2tncm91bmQoY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgMCwgMCwgdywgaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ1dpbmRvdy5nZXRPcmllbnRhdGlvbigpKTsKQEAgLTMxOSw2ICszNDIsMTkgQEAKIAogICAgICAgICAgICAgQ29tcG9uZW50IGM7CiAgICAgICAgICAgICBEaW1lbnNpb24gZDsKKworICAgICAgICAgICAgLy8gSlRvb2xCYXIgYnkgZGVmYXVsdCB1c2VzIGEgc29tZXdoYXQgbW9kaWZpZWQgQm94TGF5b3V0IGFzCisgICAgICAgICAgICAvLyBpdHMgbGF5b3V0IG1hbmFnZXIuIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIHdhbnQgdG8KKyAgICAgICAgICAgIC8vIHN1cHBvcnQgQm94ICJnbHVlIiBhcyBhIHdheSB0byBtb3ZlIHRoaW5ncyBhcm91bmQgb24gdGhlCisgICAgICAgICAgICAvLyB0b29sYmFyLiAiZ2x1ZSIgaXMgcmVwcmVzZW50ZWQgaW4gQm94TGF5b3V0IGFzIGEgQm94LkZpbGxlcgorICAgICAgICAgICAgLy8gd2l0aCBhIG1pbmltdW0gYW5kIHByZWZlcnJlZCBzaXplIG9mICgwLDApLgorICAgICAgICAgICAgLy8gU28gd2hhdCB3ZSBkbyBoZXJlIGlzIGZpbmQgdGhlIG51bWJlciBvZiBzdWNoIGdsdWUgZmlsbGVycworICAgICAgICAgICAgLy8gYW5kIGZpZ3VyZSBvdXQgaG93IG11Y2ggc3BhY2Ugc2hvdWxkIGJlIGFsbG9jYXRlZCB0byB0aGVtLgorICAgICAgICAgICAgaW50IGdsdWVDb3VudCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGIuZ2V0Q29tcG9uZW50Q291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzR2x1ZSh0Yi5nZXRDb21wb25lbnQoaSkpKSBnbHVlQ291bnQrKzsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHRiLmdldE9yaWVudGF0aW9uKCkgPT0gSlRvb2xCYXIuSE9SSVpPTlRBTCkgewogICAgICAgICAgICAgICAgIGludCBoYW5kbGVXaWR0aCA9IHRiLmlzRmxvYXRhYmxlKCkgPwogICAgICAgICAgICAgICAgICAgICBTeW50aEljb24uZ2V0SWNvbldpZHRoKGhhbmRsZUljb24sIGNvbnRleHQpIDogMDsKQEAgLTMzOSw2ICszNzUsMTYgQEAKICAgICAgICAgICAgICAgICBpbnQgYmFzZVkgPSBpbnNldHMudG9wOwogICAgICAgICAgICAgICAgIGludCBiYXNlSCA9IHRiLmdldEhlaWdodCgpIC0gaW5zZXRzLnRvcCAtIGluc2V0cy5ib3R0b207CiAKKyAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdldCB0aGUgbWluaW11bSB3aWR0aCBmb3IgbGF5aW5nIHRoaW5ncyBvdXQKKyAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBjYWxjdWxhdGUgaG93IG11Y2ggZW1wdHkgc3BhY2UgbmVlZHMgdG8KKyAgICAgICAgICAgICAgICAvLyBiZSBkaXN0cmlidXRlZCBhbW9uZyB0aGUgImdsdWUiLCBpZiBhbnkKKyAgICAgICAgICAgICAgICBpbnQgZXh0cmFTcGFjZVBlckdsdWUgPSAwOworICAgICAgICAgICAgICAgIGlmIChnbHVlQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBtaW5XaWR0aCA9IG1pbmltdW1MYXlvdXRTaXplKHBhcmVudCkud2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhU3BhY2VQZXJHbHVlID0gKHRiLmdldFdpZHRoKCkgLSBtaW5XaWR0aCkgLyBnbHVlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYVNwYWNlUGVyR2x1ZSA8IDApIGV4dHJhU3BhY2VQZXJHbHVlID0gMDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRiLmdldENvbXBvbmVudENvdW50KCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBjID0gdGIuZ2V0Q29tcG9uZW50KGkpOwogICAgICAgICAgICAgICAgICAgICBkID0gYy5nZXRQcmVmZXJyZWRTaXplKCk7CkBAIC0zNTIsNiArMzk4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBiYXNlWSArIChiYXNlSCAvIDIpIC0gKGQuaGVpZ2h0IC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBoID0gZC5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGUgY29tcG9uZW50IGlzIGEgImdsdWUiIGNvbXBvbmVudCB0aGVuIGFkZCB0byBpdHMKKyAgICAgICAgICAgICAgICAgICAgLy93aWR0aCB0aGUgZXh0cmFTcGFjZVBlckdsdWUgaXQgaXMgZHVlCisgICAgICAgICAgICAgICAgICAgIGlmIChpc0dsdWUoYykpIGQud2lkdGggKz0gZXh0cmFTcGFjZVBlckdsdWU7CiAgICAgICAgICAgICAgICAgICAgIGMuc2V0Qm91bmRzKGx0ciA/IHggOiB4IC0gZC53aWR0aCwgeSwgZC53aWR0aCwgaCk7CiAgICAgICAgICAgICAgICAgICAgIHggPSBsdHIgPyB4ICsgZC53aWR0aCA6IHggLSBkLndpZHRoOwogICAgICAgICAgICAgICAgIH0KQEAgLTM2OSw2ICs0MTgsMTYgQEAKICAgICAgICAgICAgICAgICBpbnQgYmFzZVcgPSB0Yi5nZXRXaWR0aCgpIC0gaW5zZXRzLmxlZnQgLSBpbnNldHMucmlnaHQ7CiAgICAgICAgICAgICAgICAgaW50IHkgPSBoYW5kbGVIZWlnaHQgKyBpbnNldHMudG9wOwogCisgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIG1pbmltdW0gaGVpZ2h0IGZvciBsYXlpbmcgdGhpbmdzIG91dAorICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGNhbGN1bGF0ZSBob3cgbXVjaCBlbXB0eSBzcGFjZSBuZWVkcyB0bworICAgICAgICAgICAgICAgIC8vIGJlIGRpc3RyaWJ1dGVkIGFtb25nIHRoZSAiZ2x1ZSIsIGlmIGFueQorICAgICAgICAgICAgICAgIGludCBleHRyYVNwYWNlUGVyR2x1ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGdsdWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pbkhlaWdodCA9IG1pbmltdW1MYXlvdXRTaXplKHBhcmVudCkuaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBleHRyYVNwYWNlUGVyR2x1ZSA9ICh0Yi5nZXRIZWlnaHQoKSAtIG1pbkhlaWdodCkgLyBnbHVlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYVNwYWNlUGVyR2x1ZSA8IDApIGV4dHJhU3BhY2VQZXJHbHVlID0gMDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRiLmdldENvbXBvbmVudENvdW50KCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBjID0gdGIuZ2V0Q29tcG9uZW50KGkpOwogICAgICAgICAgICAgICAgICAgICBkID0gYy5nZXRQcmVmZXJyZWRTaXplKCk7CkBAIC0zODIsMTEgKzQ0MSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGJhc2VYICsgKGJhc2VXIC8gMikgLSAoZC53aWR0aCAvIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGQud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGUgY29tcG9uZW50IGlzIGEgImdsdWUiIGNvbXBvbmVudCB0aGVuIGFkZCB0byBpdHMKKyAgICAgICAgICAgICAgICAgICAgLy9oZWlnaHQgdGhlIGV4dHJhU3BhY2VQZXJHbHVlIGl0IGlzIGR1ZQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNHbHVlKGMpKSBkLmhlaWdodCArPSBleHRyYVNwYWNlUGVyR2x1ZTsKICAgICAgICAgICAgICAgICAgICAgYy5zZXRCb3VuZHMoeCwgeSwgdywgZC5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICB5ICs9IGQuaGVpZ2h0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRleHQuZGlzcG9zZSgpOwogICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzR2x1ZShDb21wb25lbnQgYykgeworICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBCb3guRmlsbGVyKSB7CisgICAgICAgICAgICAgICAgQm94LkZpbGxlciBmID0gKEJveC5GaWxsZXIpYzsKKyAgICAgICAgICAgICAgICBEaW1lbnNpb24gbWluID0gZi5nZXRNaW5pbXVtU2l6ZSgpOworICAgICAgICAgICAgICAgIERpbWVuc2lvbiBwcmVmID0gZi5nZXRQcmVmZXJyZWRTaXplKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1pbi53aWR0aCA9PSAwICYmICBtaW4uaGVpZ2h0ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWYud2lkdGggPT0gMCAmJiBwcmVmLmhlaWdodCA9PSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUcmVlVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL3N5bnRoL1N5bnRoVHJlZVVJLmphdmEKaW5kZXggNTYwM2MyMC4uNDcwMTFhOCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvc3ludGgvU3ludGhUcmVlVUkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9zeW50aC9TeW50aFRyZWVVSS5qYXZhCkBAIC0yNCwyMCArMjQsMzEgQEAKICAqLwogcGFja2FnZSBqYXZheC5zd2luZy5wbGFmLnN5bnRoOwogCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKLWltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuKjsKLWltcG9ydCBqYXZhLmF3dC5kbmQuKjsKLWltcG9ydCBqYXZhLmJlYW5zLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuKjsKLWltcG9ydCBqYXZheC5zd2luZy5wbGFmLmJhc2ljLio7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS4qOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgc3VuLnN3aW5nLnBsYWYuc3ludGguKjsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7CitpbXBvcnQgamF2YS5hd3QuSW5zZXRzOworaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0Q2VsbEVkaXRvcjsKK2ltcG9ydCBqYXZheC5zd2luZy5JY29uOworaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKK2ltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKK2ltcG9ydCBqYXZheC5zd2luZy5Mb29rQW5kRmVlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLkNvbXBvbmVudFVJOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuVUlSZXNvdXJjZTsKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLmJhc2ljLkJhc2ljVHJlZVVJOworaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVDZWxsRWRpdG9yOworaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVDZWxsUmVuZGVyZXI7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlQ2VsbEVkaXRvcjsKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVDZWxsUmVuZGVyZXI7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKK2ltcG9ydCBzdW4uc3dpbmcucGxhZi5zeW50aC5TeW50aEljb247CitpbXBvcnQgc3VuLnN3aW5nLnBsYWYuc3ludGguU3ludGhVSTsKIAogLyoqCiAgKiBTa2lubmFibGUgVHJlZVVJLgpAQCAtNzIsMTAgKzgzLDEyIEBACiAgICAgICAgIGV4cGFuZGVkSWNvbldyYXBwZXIgPSBuZXcgRXhwYW5kZWRJY29uV3JhcHBlcigpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJY29uIGdldEV4cGFuZGVkSWNvbigpIHsKICAgICAgICAgcmV0dXJuIGV4cGFuZGVkSWNvbldyYXBwZXI7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaW5zdGFsbERlZmF1bHRzKCkgewogICAgICAgICB1cGRhdGVTdHlsZSh0cmVlKTsKICAgICB9CkBAIC0xMzUsMTEgKzE0OCwxMyBAQAogICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsTGlzdGVuZXJzKCkgewogICAgICAgICBzdXBlci5pbnN0YWxsTGlzdGVuZXJzKCk7CiAgICAgICAgIHRyZWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3ludGhDb250ZXh0IGdldENvbnRleHQoSkNvbXBvbmVudCBjKSB7CiAgICAgICAgIHJldHVybiBnZXRDb250ZXh0KGMsIGdldENvbXBvbmVudFN0YXRlKGMpKTsKICAgICB9CkBAIC0xNzIsNiArMTg3LDcgQEAKICAgICAgICAgcmV0dXJuIEVOQUJMRUQgfCBTRUxFQ1RFRDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgVHJlZUNlbGxFZGl0b3IgY3JlYXRlRGVmYXVsdENlbGxFZGl0b3IoKSB7CiAgICAgICAgIFRyZWVDZWxsUmVuZGVyZXIgcmVuZGVyZXIgPSB0cmVlLmdldENlbGxSZW5kZXJlcigpOwogICAgICAgICBEZWZhdWx0VHJlZUNlbGxFZGl0b3IgZWRpdG9yOwpAQCAtMTg2LDEwICsyMDIsMTIgQEAKICAgICAgICAgcmV0dXJuIGVkaXRvcjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgVHJlZUNlbGxSZW5kZXJlciBjcmVhdGVEZWZhdWx0Q2VsbFJlbmRlcmVyKCkgewogICAgICAgICByZXR1cm4gbmV3IFN5bnRoVHJlZUNlbGxSZW5kZXJlcigpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHVuaW5zdGFsbERlZmF1bHRzKCkgewogICAgICAgICBTeW50aENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQodHJlZSwgRU5BQkxFRCk7CiAKQEAgLTIwOCwxMSArMjI2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxMaXN0ZW5lcnMoKSB7CiAgICAgICAgIHN1cGVyLnVuaW5zdGFsbExpc3RlbmVycygpOwogICAgICAgICB0cmVlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdXBkYXRlKEdyYXBoaWNzIGcsIEpDb21wb25lbnQgYykgewogICAgICAgICBTeW50aENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoYyk7CiAKQEAgLTIyOCw2ICsyNDgsNyBAQAogICAgICAgICBjb250ZXh0LmdldFBhaW50ZXIoKS5wYWludFRyZWVCb3JkZXIoY29udGV4dCwgZywgeCwgeSwgdywgaCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZywgSkNvbXBvbmVudCBjKSB7CiAgICAgICAgIFN5bnRoQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChjKTsKIApAQCAtNDgxLDYgKzUwMiw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBwYWludEhvcml6b250YWxQYXJ0T2ZMZWcoR3JhcGhpY3MgZywgUmVjdGFuZ2xlIGNsaXBCb3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2V0cyBpbnNldHMsIFJlY3RhbmdsZSBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVQYXRoIHBhdGgsIGludCByb3csCkBAIC00OTQsMTIgKzUxNiwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRIb3Jpem9udGFsTGluZShHcmFwaGljcyBnLCBKQ29tcG9uZW50IGMsIGludCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAgICAgICAgIHBhaW50Q29udGV4dC5nZXRTdHlsZSgpLmdldEdyYXBoaWNzVXRpbHMocGFpbnRDb250ZXh0KS5kcmF3TGluZSgKICAgICAgICAgICAgIHBhaW50Q29udGV4dCwgIlRyZWUuaG9yaXpvbnRhbExpbmUiLCBnLCBsZWZ0LCB5LCByaWdodCwgeSwgbGluZXNTdHlsZSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRWZXJ0aWNhbFBhcnRPZkxlZyhHcmFwaGljcyBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGNsaXBCb3VuZHMsIEluc2V0cyBpbnNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlUGF0aCBwYXRoKSB7CkBAIC01MDgsNiArNTMyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHBhaW50VmVydGljYWxMaW5lKEdyYXBoaWNzIGcsIEpDb21wb25lbnQgYywgaW50IHgsIGludCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm90dG9tKSB7CiAgICAgICAgIHBhaW50Q29udGV4dC5nZXRTdHlsZSgpLmdldEdyYXBoaWNzVXRpbHMocGFpbnRDb250ZXh0KS5kcmF3TGluZSgKQEAgLTUyOCwxMiArNTUzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHJvcExvY2F0aW9uLmdldENoaWxkSW5kZXgoKSA9PSAtMQogICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhdGggPT0gZHJvcExvY2F0aW9uLmdldFBhdGgoKTsKIAorICAgICAgICBpbnQgc3RhdGUgPSBFTkFCTEVEOwogICAgICAgICBpZiAoc2VsZWN0ZWQgfHwgaXNEcm9wKSB7Ci0gICAgICAgICAgICBjZWxsQ29udGV4dC5zZXRDb21wb25lbnRTdGF0ZShFTkFCTEVEIHwgU0VMRUNURUQpOworICAgICAgICAgICAgc3RhdGUgfD0gU0VMRUNURUQ7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjZWxsQ29udGV4dC5zZXRDb21wb25lbnRTdGF0ZShFTkFCTEVEKTsKKworICAgICAgICBpZiAodHJlZS5pc0ZvY3VzT3duZXIoKSAmJiByb3cgPT0gbGVhZFJvdykgeworICAgICAgICAgICAgc3RhdGUgfD0gRk9DVVNFRDsKICAgICAgICAgfQorCisgICAgICAgIGNlbGxDb250ZXh0LnNldENvbXBvbmVudFN0YXRlKHN0YXRlKTsKKwogICAgICAgICBpZiAoZHRjciAhPSBudWxsICYmIChkdGNyLmdldEJvcmRlclNlbGVjdGlvbkNvbG9yKCkgaW5zdGFuY2VvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSVJlc291cmNlKSkgewogICAgICAgICAgICAgZHRjci5zZXRCb3JkZXJTZWxlY3Rpb25Db2xvcihzdHlsZS5nZXRDb2xvcigKQEAgLTU3NCw2ICs2MDQsMjggQEAKICAgICAgICAgICAgICAgIDogeCAtIChpbnQpTWF0aC5mbG9vcihpY29uV2lkdGggLyAyLjApOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRFeHBhbmRDb250cm9sKEdyYXBoaWNzIGcsIFJlY3RhbmdsZSBjbGlwQm91bmRzLAorICAgICAgICAgICAgSW5zZXRzIGluc2V0cywgUmVjdGFuZ2xlIGJvdW5kcywgVHJlZVBhdGggcGF0aCwgaW50IHJvdywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNFeHBhbmRlZCwgYm9vbGVhbiBoYXNCZWVuRXhwYW5kZWQsIGJvb2xlYW4gaXNMZWFmKSB7CisgICAgICAgIC8vbW9kaWZ5IHRoZSBwYWludENvbnRleHQncyBzdGF0ZSB0byBtYXRjaCB0aGUgc3RhdGUgZm9yIHRoZSByb3cKKyAgICAgICAgLy90aGlzIGlzIGEgaGFjayBpbiB0aGF0IGl0IHJlcXVpcmVzIGtub3dsZWRnZSBvZiB0aGUgc3Vic2VxdWVudAorICAgICAgICAvL21ldGhvZCBjYWxscy4gVGhlIHBvaW50IGlzLCB0aGUgY29udGV4dCB1c2VkIGluIGRyYXdDZW50ZXJlZAorICAgICAgICAvL3Nob3VsZCByZWZsZWN0IHRoZSBzdGF0ZSBvZiB0aGUgcm93LCBub3Qgb2YgdGhlIHRyZWUuCisgICAgICAgIGJvb2xlYW4gaXNTZWxlY3RlZCA9IHRyZWUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5pc1BhdGhTZWxlY3RlZChwYXRoKTsKKyAgICAgICAgaW50IHN0YXRlID0gcGFpbnRDb250ZXh0LmdldENvbXBvbmVudFN0YXRlKCk7CisgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7CisgICAgICAgICAgICBwYWludENvbnRleHQuc2V0Q29tcG9uZW50U3RhdGUoc3RhdGUgfCBTeW50aENvbnN0YW50cy5TRUxFQ1RFRCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIucGFpbnRFeHBhbmRDb250cm9sKGcsIGNsaXBCb3VuZHMsIGluc2V0cywgYm91bmRzLCBwYXRoLCByb3csCisgICAgICAgICAgICAgICAgaXNFeHBhbmRlZCwgaGFzQmVlbkV4cGFuZGVkLCBpc0xlYWYpOworICAgICAgICBwYWludENvbnRleHQuc2V0Q29tcG9uZW50U3RhdGUoc3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGRyYXdDZW50ZXJlZChDb21wb25lbnQgYywgR3JhcGhpY3MgZ3JhcGhpY3MsIEljb24gaWNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KSB7CiAgICAgICAgIGludCB3ID0gU3ludGhJY29uLmdldEljb25XaWR0aChpY29uLCBwYWludENvbnRleHQpOwpAQCAtNjE4LDYgKzY3MCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGdldFJvd1goaW50IHJvdywgaW50IGRlcHRoKSB7CiAgICAgICAgIHJldHVybiBzdXBlci5nZXRSb3dYKHJvdywgZGVwdGgpICsgcGFkZGluZzsKICAgICB9CkBAIC02MjcsOSArNjgwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBVSVJlc291cmNlIHsKICAgICAgICAgU3ludGhUcmVlQ2VsbFJlbmRlcmVyKCkgewogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgICAgIHJldHVybiAiVHJlZS5jZWxsUmVuZGVyZXIiOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0VHJlZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVHJlZSB0cmVlLCBPYmplY3QgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwYW5kZWQsCkBAIC02NDYsNiArNzAzLDggQEAKICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUcmVlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRyZWUsIHZhbHVlLCBzZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZCwgbGVhZiwgcm93LCBoYXNGb2N1cyk7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewogICAgICAgICAgICAgcGFpbnRDb21wb25lbnQoZyk7CiAgICAgICAgICAgICBpZiAoaGFzRm9jdXMpIHsKQEAgLTY5Miw4ICs3NTEsMTAgQEAKICAgICAgICAgICAgIHNldEJvcmRlclNlbGVjdGlvbkNvbG9yKG51bGwpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBUcmVlQ2VsbEVkaXRvciBjcmVhdGVUcmVlQ2VsbEVkaXRvcigpIHsKICAgICAgICAgICAgIEpUZXh0RmllbGQgdGYgPSBuZXcgSlRleHRGaWVsZCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVHJlZS5jZWxsRWRpdG9yIjsKICAgICAgICAgICAgICAgICB9CkBAIC03MDYsNyArNzY3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLy8KICAgICAvLyBCYXNpY1RyZWVVSSBkaXJlY3RseSB1c2VzIGV4cGFuZEljb24gb3V0c2lkZSBvZiB0aGUgU3ludGggbWV0aG9kcy4KICAgICAvLyBUbyBnZXQgdGhlIGNvcnJlY3QgY29udGV4dCB3ZSByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhpcyB0aGF0IGZldGNoZXMKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy90YWJsZS9EZWZhdWx0VGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy90YWJsZS9EZWZhdWx0VGFibGVDZWxsUmVuZGVyZXIuamF2YQppbmRleCBhMWFjNWZlLi5jMjAzMTc4IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvdGFibGUvRGVmYXVsdFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3RhYmxlL0RlZmF1bHRUYWJsZUNlbGxSZW5kZXJlci5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBwYWNrYWdlIGphdmF4LnN3aW5nLnRhYmxlOwogCiBpbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNlbGxSZW5kZXJlcjsKIGltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuKjsKIAogaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKQEAgLTM0LDYgKzMzLDcgQEAKIGltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBzdW4uc3dpbmcuRGVmYXVsdExvb2t1cDsKIAogCiAvKioKQEAgLTkyLDggKzkyLDkgQEAKICAgICAqIDxjb2RlPmdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50PC9jb2RlPiBtZXRob2QgYW5kIHNldCB0aGUgYm9yZGVyCiAgICAgKiBvZiB0aGUgcmV0dXJuZWQgY29tcG9uZW50IGRpcmVjdGx5LgogICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBCb3JkZXIgbm9Gb2N1c0JvcmRlciA9IG5ldyBFbXB0eUJvcmRlcigxLCAxLCAxLCAxKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgU0FGRV9OT19GT0NVU19CT1JERVIgPSBuZXcgRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIERFRkFVTFRfTk9fRk9DVVNfQk9SREVSID0gbmV3IEVtcHR5Qm9yZGVyKDEsIDEsIDEsIDEpOworICAgIHByb3RlY3RlZCBzdGF0aWMgQm9yZGVyIG5vRm9jdXNCb3JkZXIgPSBERUZBVUxUX05PX0ZPQ1VTX0JPUkRFUjsKIAogICAgIC8vIFdlIG5lZWQgYSBwbGFjZSB0byBzdG9yZSB0aGUgY29sb3IgdGhlIEpMYWJlbCBzaG91bGQgYmUgcmV0dXJuZWQKICAgICAvLyB0byBhZnRlciBpdHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgaGF2ZSBiZWVuIHNldApAQCAtMTA5LDEyICsxMTAsMTggQEAKICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgc2V0T3BhcXVlKHRydWUpOwogICAgICAgICBzZXRCb3JkZXIoZ2V0Tm9Gb2N1c0JvcmRlcigpKTsKKyAgICAgICAgc2V0TmFtZSgiVGFibGUuY2VsbFJlbmRlcmVyIik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgQm9yZGVyIGdldE5vRm9jdXNCb3JkZXIoKSB7CisgICAgcHJpdmF0ZSBCb3JkZXIgZ2V0Tm9Gb2N1c0JvcmRlcigpIHsKKyAgICAgICAgQm9yZGVyIGJvcmRlciA9IERlZmF1bHRMb29rdXAuZ2V0Qm9yZGVyKHRoaXMsIHVpLCAiVGFibGUuY2VsbE5vRm9jdXNCb3JkZXIiKTsKICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoYm9yZGVyICE9IG51bGwpIHJldHVybiBib3JkZXI7CiAgICAgICAgICAgICByZXR1cm4gU0FGRV9OT19GT0NVU19CT1JERVI7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobm9Gb2N1c0JvcmRlciA9PSBudWxsIHx8IG5vRm9jdXNCb3JkZXIgPT0gREVGQVVMVF9OT19GT0NVU19CT1JERVIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYm9yZGVyOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG5vRm9jdXNCb3JkZXI7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTAsOCArMTk3LDggQEAKICAgICAgICAgICAgICAgICAmJiBkcm9wTG9jYXRpb24uZ2V0Um93KCkgPT0gcm93CiAgICAgICAgICAgICAgICAgJiYgZHJvcExvY2F0aW9uLmdldENvbHVtbigpID09IGNvbHVtbikgewogCi0gICAgICAgICAgICBmZyA9IFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZHJvcENlbGxGb3JlZ3JvdW5kIik7Ci0gICAgICAgICAgICBiZyA9IFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZHJvcENlbGxCYWNrZ3JvdW5kIik7CisgICAgICAgICAgICBmZyA9IERlZmF1bHRMb29rdXAuZ2V0Q29sb3IodGhpcywgdWksICJUYWJsZS5kcm9wQ2VsbEZvcmVncm91bmQiKTsKKyAgICAgICAgICAgIGJnID0gRGVmYXVsdExvb2t1cC5nZXRDb2xvcih0aGlzLCB1aSwgIlRhYmxlLmRyb3BDZWxsQmFja2dyb3VuZCIpOwogCiAgICAgICAgICAgICBpc1NlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjAyLDEyICsyMDksMTggQEAKICAgICAgICAgICAgIHN1cGVyLnNldEJhY2tncm91bmQoYmcgPT0gbnVsbCA/IHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYmcpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ29sb3IgYmFja2dyb3VuZCA9IHVuc2VsZWN0ZWRCYWNrZ3JvdW5kICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdW5zZWxlY3RlZEJhY2tncm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGFibGUuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICAgICAgaWYgKGJhY2tncm91bmQgPT0gbnVsbCB8fCBiYWNrZ3JvdW5kIGluc3RhbmNlb2YgamF2YXguc3dpbmcucGxhZi5VSVJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgQ29sb3IgYWx0ZXJuYXRlQ29sb3IgPSBEZWZhdWx0TG9va3VwLmdldENvbG9yKHRoaXMsIHVpLCAiVGFibGUuYWx0ZXJuYXRlUm93Q29sb3IiKTsKKyAgICAgICAgICAgICAgICBpZiAoYWx0ZXJuYXRlQ29sb3IgIT0gbnVsbCAmJiByb3cgJSAyID09IDApCisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBhbHRlcm5hdGVDb2xvcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN1cGVyLnNldEZvcmVncm91bmQodW5zZWxlY3RlZEZvcmVncm91bmQgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1bnNlbGVjdGVkRm9yZWdyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0YWJsZS5nZXRGb3JlZ3JvdW5kKCkpOwotICAgICAgICAgICAgc3VwZXIuc2V0QmFja2dyb3VuZCh1bnNlbGVjdGVkQmFja2dyb3VuZCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVuc2VsZWN0ZWRCYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRhYmxlLmdldEJhY2tncm91bmQoKSk7CisgICAgICAgICAgICBzdXBlci5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwogICAgICAgICB9CiAKICAgICAgICAgc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwpAQCAtMjE1LDIwICsyMjgsMjAgQEAKICAgICAgICAgaWYgKGhhc0ZvY3VzKSB7CiAgICAgICAgICAgICBCb3JkZXIgYm9yZGVyID0gbnVsbDsKICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgYm9yZGVyID0gVUlNYW5hZ2VyLmdldEJvcmRlcigiVGFibGUuZm9jdXNTZWxlY3RlZENlbGxIaWdobGlnaHRCb3JkZXIiKTsKKyAgICAgICAgICAgICAgICBib3JkZXIgPSBEZWZhdWx0TG9va3VwLmdldEJvcmRlcih0aGlzLCB1aSwgIlRhYmxlLmZvY3VzU2VsZWN0ZWRDZWxsSGlnaGxpZ2h0Qm9yZGVyIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYm9yZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib3JkZXIgPSBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKTsKKyAgICAgICAgICAgICAgICBib3JkZXIgPSBEZWZhdWx0TG9va3VwLmdldEJvcmRlcih0aGlzLCB1aSwgIlRhYmxlLmZvY3VzQ2VsbEhpZ2hsaWdodEJvcmRlciIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0Qm9yZGVyKGJvcmRlcik7CiAKICAgICAgICAgICAgIGlmICghaXNTZWxlY3RlZCAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgICBDb2xvciBjb2w7Ci0gICAgICAgICAgICAgICAgY29sID0gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxGb3JlZ3JvdW5kIik7CisgICAgICAgICAgICAgICAgY29sID0gRGVmYXVsdExvb2t1cC5nZXRDb2xvcih0aGlzLCB1aSwgIlRhYmxlLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsKICAgICAgICAgICAgICAgICBpZiAoY29sICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0Rm9yZWdyb3VuZChjb2wpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb2wgPSBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEJhY2tncm91bmQiKTsKKyAgICAgICAgICAgICAgICBjb2wgPSBEZWZhdWx0TG9va3VwLmdldENvbG9yKHRoaXMsIHVpLCAiVGFibGUuZm9jdXNDZWxsQmFja2dyb3VuZCIpOwogICAgICAgICAgICAgICAgIGlmIChjb2wgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBzdXBlci5zZXRCYWNrZ3JvdW5kKGNvbCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjYxLDYgKzI3NCw3IEBACiAgICAgICAgIGlmIChwICE9IG51bGwpIHsKICAgICAgICAgICAgIHAgPSBwLmdldFBhcmVudCgpOwogICAgICAgICB9CisKICAgICAgICAgLy8gcCBzaG91bGQgbm93IGJlIHRoZSBKVGFibGUuCiAgICAgICAgIGJvb2xlYW4gY29sb3JNYXRjaCA9IChiYWNrICE9IG51bGwpICYmIChwICE9IG51bGwpICYmCiAgICAgICAgICAgICBiYWNrLmVxdWFscyhwLmdldEJhY2tncm91bmQoKSkgJiYKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy90cmVlL0RlZmF1bHRUcmVlQ2VsbFJlbmRlcmVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvdHJlZS9EZWZhdWx0VHJlZUNlbGxSZW5kZXJlci5qYXZhCmluZGV4IDYzNjNhZTkuLmRkN2ExY2EgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy90cmVlL0RlZmF1bHRUcmVlQ2VsbFJlbmRlcmVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3RyZWUvRGVmYXVsdFRyZWVDZWxsUmVuZGVyZXIuamF2YQpAQCAtMjUsMTYgKzI1LDI0IEBACiAKIHBhY2thZ2UgamF2YXguc3dpbmcudHJlZTsKIAotaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOworaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKK2ltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi5Db2xvclVJUmVzb3VyY2U7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi5Gb250VUlSZXNvdXJjZTsKIGltcG9ydCBqYXZheC5zd2luZy5wbGFmLlVJUmVzb3VyY2U7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi5iYXNpYy5CYXNpY0dyYXBoaWNzVXRpbHM7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC4qOwotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7CitpbXBvcnQgamF2YXguc3dpbmcuTG9va0FuZEZlZWw7CitpbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKK2ltcG9ydCBzdW4uc3dpbmcuRGVmYXVsdExvb2t1cDsKIAogLyoqCiAgKiBEaXNwbGF5cyBhbiBlbnRyeSBpbiBhIHRyZWUuCkBAIC0xNDgsNiArMTU2LDcgQEAKICAgICBwcm90ZWN0ZWQgQ29sb3IgYm9yZGVyU2VsZWN0aW9uQ29sb3I7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNEcm9wQ2VsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlsbEJhY2tncm91bmQgPSB0cnVlOwogCiAgICAgLyoqCiAgICAgICogU2V0IHRvIHRydWUgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIGhhcyBydW4uCkBAIC0xNzcsNDEgKzE4Niw0OCBAQAogICAgICAgICAvLyBudWxsLiBBcyBzdWNoLCBpZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhpcyBkb2VzIG5vdCByZXNldCB0aGUKICAgICAgICAgLy8gdmFsdWUuCiAgICAgICAgIGlmICghaW5pdGVkIHx8IChnZXRMZWFmSWNvbigpIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkpIHsKLSAgICAgICAgICAgIHNldExlYWZJY29uKFVJTWFuYWdlci5nZXRJY29uKCJUcmVlLmxlYWZJY29uIikpOworICAgICAgICAgICAgc2V0TGVhZkljb24oRGVmYXVsdExvb2t1cC5nZXRJY29uKHRoaXMsIHVpLCAiVHJlZS5sZWFmSWNvbiIpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWluaXRlZCB8fCAoZ2V0Q2xvc2VkSWNvbigpIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkpIHsKLSAgICAgICAgICAgIHNldENsb3NlZEljb24oVUlNYW5hZ2VyLmdldEljb24oIlRyZWUuY2xvc2VkSWNvbiIpKTsKKyAgICAgICAgICAgIHNldENsb3NlZEljb24oRGVmYXVsdExvb2t1cC5nZXRJY29uKHRoaXMsIHVpLCAiVHJlZS5jbG9zZWRJY29uIikpOwogICAgICAgICB9CiAgICAgICAgIGlmICghaW5pdGVkIHx8IChnZXRPcGVuSWNvbigpIGluc3RhbmNlb2YgVUlNYW5hZ2VyKSkgewotICAgICAgICAgICAgc2V0T3Blbkljb24oVUlNYW5hZ2VyLmdldEljb24oIlRyZWUub3Blbkljb24iKSk7CisgICAgICAgICAgICBzZXRPcGVuSWNvbihEZWZhdWx0TG9va3VwLmdldEljb24odGhpcywgdWksICJUcmVlLm9wZW5JY29uIikpOwogICAgICAgICB9CiAgICAgICAgIGlmICghaW5pdGVkIHx8IChnZXRUZXh0U2VsZWN0aW9uQ29sb3IoKSBpbnN0YW5jZW9mIFVJUmVzb3VyY2UpKSB7CiAgICAgICAgICAgICBzZXRUZXh0U2VsZWN0aW9uQ29sb3IoCi0gICAgICAgICAgICAgICAgICAgIFVJTWFuYWdlci5nZXRDb2xvcigiVHJlZS5zZWxlY3Rpb25Gb3JlZ3JvdW5kIikpOworICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TG9va3VwLmdldENvbG9yKHRoaXMsIHVpLCAiVHJlZS5zZWxlY3Rpb25Gb3JlZ3JvdW5kIikpOwogICAgICAgICB9CiAgICAgICAgIGlmICghaW5pdGVkIHx8IChnZXRUZXh0Tm9uU2VsZWN0aW9uQ29sb3IoKSBpbnN0YW5jZW9mIFVJUmVzb3VyY2UpKSB7CiAgICAgICAgICAgICBzZXRUZXh0Tm9uU2VsZWN0aW9uQ29sb3IoCi0gICAgICAgICAgICAgICAgVUlNYW5hZ2VyLmdldENvbG9yKCJUcmVlLnRleHRGb3JlZ3JvdW5kIikpOworICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TG9va3VwLmdldENvbG9yKHRoaXMsIHVpLCAiVHJlZS50ZXh0Rm9yZWdyb3VuZCIpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWluaXRlZCB8fCAoZ2V0QmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yKCkgaW5zdGFuY2VvZiBVSVJlc291cmNlKSkgewogICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yKAotICAgICAgICAgICAgICAgIFVJTWFuYWdlci5nZXRDb2xvcigiVHJlZS5zZWxlY3Rpb25CYWNrZ3JvdW5kIikpOworICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TG9va3VwLmdldENvbG9yKHRoaXMsIHVpLCAiVHJlZS5zZWxlY3Rpb25CYWNrZ3JvdW5kIikpOwogICAgICAgICB9CiAgICAgICAgIGlmICghaW5pdGVkIHx8CiAgICAgICAgICAgICAgICAgKGdldEJhY2tncm91bmROb25TZWxlY3Rpb25Db2xvcigpIGluc3RhbmNlb2YgVUlSZXNvdXJjZSkpIHsKICAgICAgICAgICAgIHNldEJhY2tncm91bmROb25TZWxlY3Rpb25Db2xvcigKLSAgICAgICAgICAgICAgICAgICAgVUlNYW5hZ2VyLmdldENvbG9yKCJUcmVlLnRleHRCYWNrZ3JvdW5kIikpOworICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TG9va3VwLmdldENvbG9yKHRoaXMsIHVpLCAiVHJlZS50ZXh0QmFja2dyb3VuZCIpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWluaXRlZCB8fCAoZ2V0Qm9yZGVyU2VsZWN0aW9uQ29sb3IoKSBpbnN0YW5jZW9mIFVJUmVzb3VyY2UpKSB7CiAgICAgICAgICAgICBzZXRCb3JkZXJTZWxlY3Rpb25Db2xvcigKLSAgICAgICAgICAgICAgICBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRyZWUuc2VsZWN0aW9uQm9yZGVyQ29sb3IiKSk7CisgICAgICAgICAgICAgICAgICAgIERlZmF1bHRMb29rdXAuZ2V0Q29sb3IodGhpcywgdWksICJUcmVlLnNlbGVjdGlvbkJvcmRlckNvbG9yIikpOwogICAgICAgICB9Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IFVJTWFuYWdlci5nZXQoIlRyZWUuZHJhd3NGb2N1c0JvcmRlckFyb3VuZEljb24iKTsKLSAgICAgICAgZHJhd3NGb2N1c0JvcmRlckFyb3VuZEljb24gPSAodmFsdWUgIT0gbnVsbCAmJiAoKEJvb2xlYW4pdmFsdWUpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHZhbHVlID0gVUlNYW5hZ2VyLmdldCgiVHJlZS5kcmF3RGFzaGVkRm9jdXNJbmRpY2F0b3IiKTsKLSAgICAgICAgZHJhd0Rhc2hlZEZvY3VzSW5kaWNhdG9yID0gKHZhbHVlICE9IG51bGwgJiYgKChCb29sZWFuKXZhbHVlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgZHJhd3NGb2N1c0JvcmRlckFyb3VuZEljb24gPSBEZWZhdWx0TG9va3VwLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgdGhpcywgdWksICJUcmVlLmRyYXdzRm9jdXNCb3JkZXJBcm91bmRJY29uIiwgZmFsc2UpOworICAgICAgICBkcmF3RGFzaGVkRm9jdXNJbmRpY2F0b3IgPSBEZWZhdWx0TG9va3VwLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgdGhpcywgdWksICJUcmVlLmRyYXdEYXNoZWRGb2N1c0luZGljYXRvciIsIGZhbHNlKTsKKworICAgICAgICBmaWxsQmFja2dyb3VuZCA9IERlZmF1bHRMb29rdXAuZ2V0Qm9vbGVhbih0aGlzLCB1aSwgIlRyZWUucmVuZGVyZXJGaWxsQmFja2dyb3VuZCIsIHRydWUpOworICAgICAgICBJbnNldHMgbWFyZ2lucyA9IERlZmF1bHRMb29rdXAuZ2V0SW5zZXRzKHRoaXMsIHVpLCAiVHJlZS5yZW5kZXJlck1hcmdpbnMiKTsKKyAgICAgICAgaWYgKG1hcmdpbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcihtYXJnaW5zLnRvcCwgbWFyZ2lucy5sZWZ0LAorICAgICAgICAgICAgICAgICAgICBtYXJnaW5zLmJvdHRvbSwgbWFyZ2lucy5yaWdodCkpOworICAgICAgICB9CisKKyAgICAgICAgc2V0TmFtZSgiVHJlZS5jZWxsUmVuZGVyZXIiKTsKICAgICB9CiAKIApAQCAtMjIwLDcgKzIzNiw3IEBACiAgICAgICAqIHJlcHJlc2VudCBub24tbGVhZiBub2RlcyB0aGF0IGFyZSBleHBhbmRlZC4KICAgICAgICovCiAgICAgcHVibGljIEljb24gZ2V0RGVmYXVsdE9wZW5JY29uKCkgewotICAgICAgICByZXR1cm4gVUlNYW5hZ2VyLmdldEljb24oIlRyZWUub3Blbkljb24iKTsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRMb29rdXAuZ2V0SWNvbih0aGlzLCB1aSwgIlRyZWUub3Blbkljb24iKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyOCw3ICsyNDQsNyBAQAogICAgICAgKiByZXByZXNlbnQgbm9uLWxlYWYgbm9kZXMgdGhhdCBhcmUgbm90IGV4cGFuZGVkLgogICAgICAgKi8KICAgICBwdWJsaWMgSWNvbiBnZXREZWZhdWx0Q2xvc2VkSWNvbigpIHsKLSAgICAgICAgcmV0dXJuIFVJTWFuYWdlci5nZXRJY29uKCJUcmVlLmNsb3NlZEljb24iKTsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRMb29rdXAuZ2V0SWNvbih0aGlzLCB1aSwgIlRyZWUuY2xvc2VkSWNvbiIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjM2LDcgKzI1Miw3IEBACiAgICAgICAqIHJlcHJlc2VudCBsZWFmIG5vZGVzLgogICAgICAgKi8KICAgICBwdWJsaWMgSWNvbiBnZXREZWZhdWx0TGVhZkljb24oKSB7Ci0gICAgICAgIHJldHVybiBVSU1hbmFnZXIuZ2V0SWNvbigiVHJlZS5sZWFmSWNvbiIpOworICAgICAgICByZXR1cm4gRGVmYXVsdExvb2t1cC5nZXRJY29uKHRoaXMsIHVpLCAiVHJlZS5sZWFmSWNvbiIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDI1LDcgKzQ0MSw3IEBACiAgICAgICAgICAgICAgICAgJiYgZHJvcExvY2F0aW9uLmdldENoaWxkSW5kZXgoKSA9PSAtMQogICAgICAgICAgICAgICAgICYmIHRyZWUuZ2V0Um93Rm9yUGF0aChkcm9wTG9jYXRpb24uZ2V0UGF0aCgpKSA9PSByb3cpIHsKIAotICAgICAgICAgICAgQ29sb3IgY29sID0gVUlNYW5hZ2VyLmdldENvbG9yKCJUcmVlLmRyb3BDZWxsRm9yZWdyb3VuZCIpOworICAgICAgICAgICAgQ29sb3IgY29sID0gRGVmYXVsdExvb2t1cC5nZXRDb2xvcih0aGlzLCB1aSwgIlRyZWUuZHJvcENlbGxGb3JlZ3JvdW5kIik7CiAgICAgICAgICAgICBpZiAoY29sICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBmZyA9IGNvbDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NDEsMjYgKzQ1NywyNCBAQAogCiAgICAgICAgIHNldEZvcmVncm91bmQoZmcpOwogCi0gICAgICAgIC8vIFRoZXJlIG5lZWRzIHRvIGJlIGEgd2F5IHRvIHNwZWNpZnkgZGlzYWJsZWQgaWNvbnMuCisgICAgICAgIEljb24gaWNvbiA9IG51bGw7CisgICAgICAgIGlmIChsZWFmKSB7CisgICAgICAgICAgICBpY29uID0gZ2V0TGVhZkljb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChleHBhbmRlZCkgeworICAgICAgICAgICAgaWNvbiA9IGdldE9wZW5JY29uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpY29uID0gZ2V0Q2xvc2VkSWNvbigpOworICAgICAgICB9CisKICAgICAgICAgaWYgKCF0cmVlLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChsZWFmKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGlzYWJsZWRJY29uKGdldExlYWZJY29uKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHBhbmRlZCkgewotICAgICAgICAgICAgICAgIHNldERpc2FibGVkSWNvbihnZXRPcGVuSWNvbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0RGlzYWJsZWRJY29uKGdldENsb3NlZEljb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMb29rQW5kRmVlbCBsYWYgPSBVSU1hbmFnZXIuZ2V0TG9va0FuZEZlZWwoKTsKKyAgICAgICAgICAgIEljb24gZGlzYWJsZWRJY29uID0gbGFmLmdldERpc2FibGVkSWNvbih0cmVlLCBpY29uKTsKKyAgICAgICAgICAgIGlmIChkaXNhYmxlZEljb24gIT0gbnVsbCkgaWNvbiA9IGRpc2FibGVkSWNvbjsKKyAgICAgICAgICAgIHNldERpc2FibGVkSWNvbihpY29uKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobGVhZikgewotICAgICAgICAgICAgICAgIHNldEljb24oZ2V0TGVhZkljb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0SWNvbihnZXRPcGVuSWNvbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0SWNvbihnZXRDbG9zZWRJY29uKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0SWNvbihpY29uKTsKICAgICAgICAgfQogICAgICAgICBzZXRDb21wb25lbnRPcmllbnRhdGlvbih0cmVlLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkpOwogCkBAIC00NzYsNyArNDkwLDcgQEAKICAgICAgICAgQ29sb3IgYkNvbG9yOwogCiAgICAgICAgIGlmIChpc0Ryb3BDZWxsKSB7Ci0gICAgICAgICAgICBiQ29sb3IgPSBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRyZWUuZHJvcENlbGxCYWNrZ3JvdW5kIik7CisgICAgICAgICAgICBiQ29sb3IgPSBEZWZhdWx0TG9va3VwLmdldENvbG9yKHRoaXMsIHVpLCAiVHJlZS5kcm9wQ2VsbEJhY2tncm91bmQiKTsKICAgICAgICAgICAgIGlmIChiQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGJDb2xvciA9IGdldEJhY2tncm91bmRTZWxlY3Rpb25Db2xvcigpOwogICAgICAgICAgICAgfQpAQCAtNDkwLDkgKzUwNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgaW1hZ2VPZmZzZXQgPSAtMTsKLSAgICAgICAgaWYoYkNvbG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIEljb24gY3VycmVudEkgPSBnZXRJY29uKCk7Ci0KKyAgICAgICAgaWYgKGJDb2xvciAhPSBudWxsICYmIGZpbGxCYWNrZ3JvdW5kKSB7CiAgICAgICAgICAgICBpbWFnZU9mZnNldCA9IGdldExhYmVsU3RhcnQoKTsKICAgICAgICAgICAgIGcuc2V0Q29sb3IoYkNvbG9yKTsKICAgICAgICAgICAgIGlmKGdldENvbXBvbmVudE9yaWVudGF0aW9uKCkuaXNMZWZ0VG9SaWdodCgpKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2FwcGxldC9BcHBsZXRQYW5lbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hcHBsZXQvQXBwbGV0UGFuZWwuamF2YQppbmRleCA5OWI4NWE3Li45MTEzMjRlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2FwcGxldC9BcHBsZXRQYW5lbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vYXBwbGV0L0FwcGxldFBhbmVsLmphdmEKQEAgLTQ1LDcgKzQ1LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7CiBpbXBvcnQgc3VuLmF3dC5BcHBDb250ZXh0OwogaW1wb3J0IHN1bi5hd3QuRW1iZWRkZWRGcmFtZTsKIGltcG9ydCBzdW4uYXd0LlN1blRvb2xraXQ7CkBAIC00NTAsNyArNDQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBsZXRQYW5lbCBwID0gdGhpczsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00ODAsNyArNDc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwbGV0UGFuZWwgcCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFwcGxldCBhID0gYXBwbGV0OwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNldFZpc2libGUodHJ1ZSk7CkBAIC01MTQsNyArNTEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFwcGxldCBhID0gYXBwbGV0OwogCi0gICAgICAgICAgICAgICAgICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc2V0VmlzaWJsZShmYWxzZSk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2F3dC9FbWJlZGRlZEZyYW1lLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2F3dC9FbWJlZGRlZEZyYW1lLmphdmEKaW5kZXggN2I3Nzg2Mi4uZWU5YTFlNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hd3QvRW1iZWRkZWRGcmFtZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vYXd0L0VtYmVkZGVkRnJhbWUuamF2YQpAQCAtNTg4LDkgKzU4OCwxMSBAQAogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkgewogICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0T3BhcXVlKGJvb2xlYW4gaXNPcGFxdWUpIHsKICAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVXaW5kb3coQnVmZmVyZWRJbWFnZSBiYWNrQnVmZmVyKSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlV2luZG93KEJ1ZmZlcmVkSW1hZ2UgYmkpIHsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgdm9pZCByZXBvc2l0aW9uU2VjdXJpdHlXYXJuaW5nKCkgewogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2F3dC9TdW5Ub29sa2l0LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2F3dC9TdW5Ub29sa2l0LmphdmEKaW5kZXggYWM5OWY0Yi4uYTZlMWNiMSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hd3QvU3VuVG9vbGtpdC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vYXd0L1N1blRvb2xraXQuamF2YQpAQCAtMjAzOCwzNyArMjAzOCwzNCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYSBjb250YWluaW5nIHRvcCBsZXZlbCB3aW5kb3cgZm9yIHRoZSBwYXNzZWQKICAgICAgKiBjb21wb25lbnQgaXMKLSAgICAgKiB7QGxpbmsgY29tLnN1bi5hd3QuQVdUVXRpbGl0aWVzLlRyYW5zbHVjZW5jeSNQRVJQSVhFTF9UUkFOU0xVQ0VOVCBQRVJQSVhFTF9UUkFOU0xVQ0VOVH0uCisgICAgICoge0BsaW5rIEdyYXBoaWNzRGV2aWNlLldpbmRvd1RyYW5zbHVjZW5jeSNQRVJQSVhFTF9UUkFOU0xVQ0VOVCBQRVJQSVhFTF9UUkFOU0xVQ0VOVH0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gYyBhIENvbXBvbmVudCB3aGljaCB0b3BsZXZlbCdzIHRvIGNoZWNrCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gIGlmIHRoZSBwYXNzZWQgY29tcG9uZW50IGlzIG5vdCBudWxsIGFuZCBoYXMgYQogICAgICAqIGNvbnRhaW5pbmcgdG9wbGV2ZWwgd2luZG93IHdoaWNoIGlzIG9wYXF1ZSAoc28gcGVyLXBpeGVsIHRyYW5zbHVjZW5jeQogICAgICAqIGlzIG5vdCBlbmFibGVkKSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiBAc2VlIGNvbS5zdW4uYXd0LkFXVFV0aWxpdGllcy5UcmFuc2x1Y2VuY3kjUEVSUElYRUxfVFJBTlNMVUNFTlQKLSAgICAgKiBAc2VlIGNvbS5zdW4uYXd0LkFXVFV0aWxpdGllcyNpc1dpbmRvd09wYXF1ZShXaW5kb3cpCisgICAgICogQHNlZSBHcmFwaGljc0RldmljZS5XaW5kb3dUcmFuc2x1Y2VuY3kjUEVSUElYRUxfVFJBTlNMVUNFTlQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluaW5nVG9wTGV2ZWxPcGFxdWUoQ29tcG9uZW50IGMpIHsKICAgICAgICAgV2luZG93IHcgPSBnZXRDb250YWluaW5nV2luZG93KGMpOwotICAgICAgICAvLyByZXR1cm4gdyAhPSBudWxsICYmICh3KS5pc09wYXF1ZSgpOwotICAgICAgICByZXR1cm4gdyAhPSBudWxsICYmIGNvbS5zdW4uYXd0LkFXVFV0aWxpdGllcy5pc1dpbmRvd09wYXF1ZSh3KTsKKyAgICAgICAgcmV0dXJuIHcgIT0gbnVsbCAmJiAoKFdpbmRvdyl3KS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgKChXaW5kb3cpdykuZ2V0QmFja2dyb3VuZCgpLmdldEFscGhhKCkgPT0gMjU1OwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYSBjb250YWluaW5nIHRvcCBsZXZlbCB3aW5kb3cgZm9yIHRoZSBwYXNzZWQKICAgICAgKiBjb21wb25lbnQgaXMKLSAgICAgKiB7QGxpbmsgY29tLnN1bi5hd3QuQVdUVXRpbGl0aWVzLlRyYW5zbHVjZW5jeSNUUkFOU0xVQ0VOVCBUUkFOU0xVQ0VOVH0uCisgICAgICoge0BsaW5rIEdyYXBoaWNzRGV2aWNlLldpbmRvd1RyYW5zbHVjZW5jeSNUUkFOU0xVQ0VOVCBUUkFOU0xVQ0VOVH0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gYyBhIENvbXBvbmVudCB3aGljaCB0b3BsZXZlbCdzIHRvIGNoZWNrCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBhc3NlZCBjb21wb25lbnQgaXMgbm90IG51bGwgYW5kIGhhcyBhCiAgICAgICogY29udGFpbmluZyB0b3BsZXZlbCB3aW5kb3cgd2hpY2ggaGFzIG9wYWNpdHkgbGVzcyB0aGFuCiAgICAgICogMS4wZiAod2hpY2ggbWVhbnMgdGhhdCBpdCBpcyB0cmFuc2x1Y2VudCksIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogQHNlZSBjb20uc3VuLmF3dC5BV1RVdGlsaXRpZXMuVHJhbnNsdWNlbmN5I1RSQU5TTFVDRU5UCi0gICAgICogQHNlZSBjb20uc3VuLmF3dC5BV1RVdGlsaXRpZXMjZ2V0V2luZG93T3BhY2l0eShXaW5kb3cpCisgICAgICogQHNlZSBHcmFwaGljc0RldmljZS5XaW5kb3dUcmFuc2x1Y2VuY3kjVFJBTlNMVUNFTlQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluaW5nVG9wTGV2ZWxUcmFuc2x1Y2VudChDb21wb25lbnQgYykgewogICAgICAgICBXaW5kb3cgdyA9IGdldENvbnRhaW5pbmdXaW5kb3coYyk7Ci0gICAgICAgIC8vIHJldHVybiB3ICE9IG51bGwgJiYgKHcpLmdldE9wYWNpdHkoKSA8IDEuMGY7Ci0gICAgICAgIHJldHVybiB3ICE9IG51bGwgJiYgY29tLnN1bi5hd3QuQVdUVXRpbGl0aWVzLmdldFdpbmRvd09wYWNpdHkoKFdpbmRvdyl3KSA8IDEuMGY7CisgICAgICAgIHJldHVybiB3ICE9IG51bGwgJiYgKChXaW5kb3cpdykuZ2V0T3BhY2l0eSgpIDwgMS4wZjsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vYXd0L2RhdGF0cmFuc2Zlci9EYXRhVHJhbnNmZXJlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hd3QvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2ZlcmVyLmphdmEKaW5kZXggZDk2MDA4My4uY2ZlMDE5MCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hd3QvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2ZlcmVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hd3QvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2ZlcmVyLmphdmEKQEAgLTY1LDEwICs2NSwxMyBAQAogCiBpbXBvcnQgamF2YS5ybWkuTWFyc2hhbGxlZE9iamVjdDsKIAoraW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW47CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0xMTEsNiArMTE0LDggQEAKIGltcG9ydCBzdW4uYXd0LmltYWdlLkltYWdlUmVwcmVzZW50YXRpb247CiBpbXBvcnQgc3VuLmF3dC5pbWFnZS5Ub29sa2l0SW1hZ2U7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uOworCiAKIC8qKgogICogUHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIHRvIGJlIHNoYXJlZCBhbW9uZyB0aGUgRGF0YUZsYXZvciBjbGFzcyBhbmQKQEAgLTExNzcsOCArMTE4MiwxMCBAQAogICAgICAgICAgICAgKFN0cmluZy5jbGFzcy5lcXVhbHMoZmxhdm9yLmdldFJlcHJlc2VudGF0aW9uQ2xhc3MoKSkgJiYKICAgICAgICAgICAgICBpc0ZsYXZvckNoYXJzZXRUZXh0VHlwZShmbGF2b3IpICYmIGlzVGV4dEZvcm1hdChmb3JtYXQpKSkgewogCisgICAgICAgICAgICBTdHJpbmcgc3RyID0gcmVtb3ZlU3VzcGVjdGVkRGF0YShmbGF2b3IsIGNvbnRlbnRzLCAoU3RyaW5nKW9iaik7CisKICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVUcmFuc2ZlcmFibGVTdHJpbmcoCi0gICAgICAgICAgICAgICAgKFN0cmluZylvYmosCisgICAgICAgICAgICAgICAgc3RyLAogICAgICAgICAgICAgICAgIGZvcm1hdCk7CiAKICAgICAgICAgLy8gU291cmNlIGRhdGEgaXMgYSBSZWFkZXIuIENvbnZlcnQgdG8gYSBTdHJpbmcgYW5kIHJlY3VyLiBJbiB0aGUKQEAgLTEyODYsNiArMTI5MywxMSBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZGF0YSB0cmFuc2xhdGlvbiBmYWlsZWQiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIExpc3QgbGlzdCA9IChMaXN0KW9iajsKKworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0IGZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgICAgICBmaW5hbCBQcm90ZWN0aW9uRG9tYWluIHVzZXJQcm90ZWN0aW9uRG9tYWluID0gZ2V0VXNlclByb3RlY3Rpb25Eb21haW4oY29udGVudHMpOworCiAgICAgICAgICAgICBpbnQgbkZpbGVzID0gMDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIE9iamVjdCBvID0gbGlzdC5nZXQoaSk7CkBAIC0xMjkzLDE3ICsxMzA1LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIG5GaWxlcysrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1tuRmlsZXNdOwogCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNbaisrXSA9ICgoRmlsZSlvKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzW2orK10gPSAoU3RyaW5nKW87CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBmaWxlT2JqZWN0IDogbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBjYXN0VG9GaWxlKGZpbGVPYmplY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGlzRmlsZUluV2Vic3RhcnRlZENhY2hlKGZpbGUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9yYmlkZGVuVG9SZWFkKGZpbGUsIHVzZXJQcm90ZWN0aW9uRG9tYWluKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGQoZmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTMxMywxMCArMTMyNiwxMSBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihwYWUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBmaWxlc1tpXS5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSBib3Mud3JpdGUoMCk7Ci0gICAgICAgICAgICAgICAgIGJvcy53cml0ZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gKChTdHJpbmcpZmlsZUxpc3QuZ2V0KGkpKS5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgIGlmIChpICE9IDApIGJvcy53cml0ZSgwKTsKKyAgICAgICAgICAgICAgICBib3Mud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgLy8gU291cmNlIGRhdGEgaXMgYW4gSW5wdXRTdHJlYW0uIEZvciBhcmJpdHJhcnkgZmxhdm9ycywganVzdCBncmFiIHRoZQpAQCAtMTM2Niw2ICsxMzgwLDEyMyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIHJlbW92ZVN1c3BlY3RlZERhdGEoRGF0YUZsYXZvciBmbGF2b3IsIGZpbmFsIFRyYW5zZmVyYWJsZSBjb250ZW50cywgZmluYWwgU3RyaW5nIHN0cikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKG51bGwgPT0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpCisgICAgICAgICAgICB8fCAhZmxhdm9yLmlzTWltZVR5cGVFcXVhbCgidGV4dC91cmktbGlzdCIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyOworICAgICAgICB9CisKKworICAgICAgICBTdHJpbmcgcmV0X3ZhbCA9ICIiOworICAgICAgICBmaW5hbCBQcm90ZWN0aW9uRG9tYWluIHVzZXJQcm90ZWN0aW9uRG9tYWluID0gZ2V0VXNlclByb3RlY3Rpb25Eb21haW4oY29udGVudHMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXRfdmFsID0gKFN0cmluZykgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYWxsb3dlZEZpbGVzID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIFtdIHVyaUFycmF5ID0gc3RyLnNwbGl0KCIoXFxzKSsiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZU5hbWUgOiB1cmlBcnJheSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShpc0ZpbGVJbldlYnN0YXJ0ZWRDYWNoZShmaWxlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZvcmJpZGRlblRvUmVhZChmaWxlLCB1c2VyUHJvdGVjdGlvbkRvbWFpbikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPSBhbGxvd2VkRmlsZXMubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRGaWxlcy5hcHBlbmQoIlxcclxcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEZpbGVzLmFwcGVuZChmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dlZEZpbGVzLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihwYWUuZ2V0TWVzc2FnZSgpLCBwYWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvdGVjdGlvbkRvbWFpbiBnZXRVc2VyUHJvdGVjdGlvbkRvbWFpbihUcmFuc2ZlcmFibGUgY29udGVudHMpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzLmdldENsYXNzKCkuZ2V0UHJvdGVjdGlvbkRvbWFpbigpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZvcmJpZGRlblRvUmVhZCAoRmlsZSBmaWxlLCBQcm90ZWN0aW9uRG9tYWluIHByb3RlY3Rpb25Eb21haW4pCisgICAgeworICAgICAgICBpZiAobnVsbCA9PSBwcm90ZWN0aW9uRG9tYWluKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVQZXJtaXNzaW9uIGZpbGVQZXJtaXNzaW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVQZXJtaXNzaW9uKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpLCAicmVhZCwgZGVsZXRlIik7CisgICAgICAgICAgICBpZiAocHJvdGVjdGlvbkRvbWFpbi5pbXBsaWVzKGZpbGVQZXJtaXNzaW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBJdCBpcyBpbXBvcnRhbnQgZG8gbm90IHVzZSB1c2VyJ3Mgc3VjY2Vzc29ycworICAgIC8vIG9mIEZpbGUgY2xhc3MuCisgICAgcHJpdmF0ZSBGaWxlIGNhc3RUb0ZpbGUoT2JqZWN0IGZpbGVPYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IG51bGw7CisgICAgICAgIGlmIChmaWxlT2JqZWN0IGluc3RhbmNlb2YgRmlsZSkgeworICAgICAgICAgICAgZmlsZVBhdGggPSAoKEZpbGUpZmlsZU9iamVjdCkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICB9IGVsc2UgaWYgKGZpbGVPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgZmlsZVBhdGggPSAoU3RyaW5nKSBmaWxlT2JqZWN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRmlsZShmaWxlUGF0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gREVQTE9ZTUVOVF9DQUNIRV9QUk9QRVJUSUVTID0geworICAgICAgICAiZGVwbG95bWVudC5zeXN0ZW0uY2FjaGVkaXIiLAorICAgICAgICAiZGVwbG95bWVudC51c2VyLmNhY2hlZGlyIiwKKyAgICAgICAgImRlcGxveW1lbnQuamF2YXdzLmNhY2hlZGlyIiwKKyAgICAgICAgImRlcGxveW1lbnQuamF2YXBpLmNhY2hlZGlyIgorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUxpc3QgPEZpbGU+IGRlcGxveW1lbnRDYWNoZURpcmVjdG9yeUxpc3QgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxGaWxlPigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVJbldlYnN0YXJ0ZWRDYWNoZShGaWxlIGYpIHsKKworICAgICAgICBpZiAoZGVwbG95bWVudENhY2hlRGlyZWN0b3J5TGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhY2hlRGlyZWN0b3J5UHJvcGVydHkgOiBERVBMT1lNRU5UX0NBQ0hFX1BST1BFUlRJRVMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2FjaGVEaXJlY3RvcnlQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KGNhY2hlRGlyZWN0b3J5UHJvcGVydHkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZURpcmVjdG9yeVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBjYWNoZURpcmVjdG9yeSA9IChuZXcgRmlsZShjYWNoZURpcmVjdG9yeVBhdGgpKS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVEaXJlY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRDYWNoZURpcmVjdG9yeUxpc3QuYWRkKGNhY2hlRGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRmlsZSBkZXBsb3ltZW50Q2FjaGVEaXJlY3RvcnkgOiBkZXBsb3ltZW50Q2FjaGVEaXJlY3RvcnlMaXN0KSB7CisgICAgICAgICAgICBmb3IgKEZpbGUgZGlyID0gZjsgZGlyICE9IG51bGw7IGRpciA9IGRpci5nZXRQYXJlbnRGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlyLmVxdWFscyhkZXBsb3ltZW50Q2FjaGVEaXJlY3RvcnkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKwogICAgIHB1YmxpYyBPYmplY3QgdHJhbnNsYXRlQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBEYXRhRmxhdm9yIGZsYXZvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZm9ybWF0LCBUcmFuc2ZlcmFibGUgbG9jYWxlVHJhbnNmZXJhYmxlKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vYXd0L2ltYWdlL0dpZkltYWdlRGVjb2Rlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hd3QvaW1hZ2UvR2lmSW1hZ2VEZWNvZGVyLmphdmEKaW5kZXggYWE4N2ZiOC4uYjA2NzlhZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hd3QvaW1hZ2UvR2lmSW1hZ2VEZWNvZGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9hd3QvaW1hZ2UvR2lmSW1hZ2VEZWNvZGVyLmphdmEKQEAgLTU4NSw5ICs1ODUsMTYgQEAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlJlYWRpbmcgYSAiICsgd2lkdGggKyAiIGJ5ICIgKyBoZWlnaHQgKyAiICIgKwogICAgICAgICAgICAgICAgICAgICAgIChpbnRlcmxhY2UgPyAiIiA6ICJub24tIikgKyAiaW50ZXJsYWNlZCBpbWFnZS4uLiIpOwogICAgICAgICB9Ci0KKyAgICAgICAgaW50IGluaXRDb2RlU2l6ZSA9IEV4dHJhY3RCeXRlKGJsb2NrLCA5KTsKKyAgICAgICAgaWYgKGluaXRDb2RlU2l6ZSA+PSAxMikgeworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgaW5pdGlhbCBjb2RlIHNpemU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29kZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGJvb2xlYW4gcmV0ID0gcGFyc2VJbWFnZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlLCBFeHRyYWN0Qnl0ZShibG9jaywgOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2UsIGluaXRDb2RlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCByYXNsaW5lLCBtb2RlbCk7CiAKICAgICAgICAgaWYgKCFyZXQpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9DcmVhdGVkRm9udFRyYWNrZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9DcmVhdGVkRm9udFRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDEzMzdkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L0NyZWF0ZWRGb250VHJhY2tlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLmZvbnQ7CisKK3B1YmxpYyBjbGFzcyBDcmVhdGVkRm9udFRyYWNrZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0ZJTEVfU0laRSA9IDMyICogMTAyNCAqIDEwMjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RPVEFMX0JZVEVTID0gMTAgKiBNQVhfRklMRV9TSVpFOworCisgICAgc3RhdGljIGludCBudW1CeXRlczsKKyAgICBzdGF0aWMgQ3JlYXRlZEZvbnRUcmFja2VyIHRyYWNrZXI7CisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBDcmVhdGVkRm9udFRyYWNrZXIgZ2V0VHJhY2tlcigpIHsKKyAgICAgICAgaWYgKHRyYWNrZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJhY2tlciA9IG5ldyBDcmVhdGVkRm9udFRyYWNrZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJhY2tlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXROdW1CeXRlcygpIHsKKyAgICAgICAgcmV0dXJuIG51bUJ5dGVzOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRCeXRlcyhpbnQgc3opIHsKKyAgICAgICAgbnVtQnl0ZXMgKz0gc3o7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN1YkJ5dGVzKGludCBzeikgeworICAgICAgICBudW1CeXRlcyAtPSBzejsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ZvbnQvRmlsZUZvbnQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9GaWxlRm9udC5qYXZhCmluZGV4IGI2YTIwOTkuLjVhYWQxMWIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9GaWxlRm9udC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9GaWxlRm9udC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAzLTIwMDggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTI1LDkgKzEyNSw5IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHZvaWQgc2V0RmlsZVRvUmVtb3ZlKEZpbGUgZmlsZSkgeworICAgIHZvaWQgc2V0RmlsZVRvUmVtb3ZlKEZpbGUgZmlsZSwgQ3JlYXRlZEZvbnRUcmFja2VyIHRyYWNrZXIpIHsKICAgICAgICAgRGlzcG9zZXIuYWRkT2JqZWN0UmVjb3JkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3JlYXRlZEZvbnRGaWxlRGlzcG9zZXJSZWNvcmQoZmlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDcmVhdGVkRm9udEZpbGVEaXNwb3NlclJlY29yZChmaWxlLCB0cmFja2VyKSk7CiAgICAgfQogCiAgICAgLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGZvbnQgc2NhbGVyIGlzIGRldGVybWluZWQgdG8KQEAgLTI0NiwxMiArMjQ2LDE2IEBACiAgICAgICAgIHJldHVybiBnZXRTY2FsZXIoKS5nZXRVbml0c1BlckVtKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlZEZvbnRGaWxlRGlzcG9zZXJSZWNvcmQgaW1wbGVtZW50cyBEaXNwb3NlclJlY29yZCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlZEZvbnRGaWxlRGlzcG9zZXJSZWNvcmQKKyAgICAgICAgaW1wbGVtZW50cyBEaXNwb3NlclJlY29yZCB7CiAKICAgICAgICAgRmlsZSBmb250RmlsZSA9IG51bGw7CisgICAgICAgIENyZWF0ZWRGb250VHJhY2tlciB0cmFja2VyOwogCi0gICAgICAgIHByaXZhdGUgQ3JlYXRlZEZvbnRGaWxlRGlzcG9zZXJSZWNvcmQoRmlsZSBmaWxlKSB7CisgICAgICAgIHByaXZhdGUgQ3JlYXRlZEZvbnRGaWxlRGlzcG9zZXJSZWNvcmQoRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZWRGb250VHJhY2tlciB0cmFja2VyKSB7CiAgICAgICAgICAgICBmb250RmlsZSA9IGZpbGU7CisgICAgICAgICAgICB0aGlzLnRyYWNrZXIgPSB0cmFja2VyOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKQEAgLTI2MCw2ICsyNjQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udEZpbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXIuc3ViQnl0ZXMoKGludClmb250RmlsZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFTUlORDogaXMgaXQgcG9zc2libGUgdGhhdCB0aGUgZmlsZSBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0aWxsIG9wZW4/IEl0IHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9udDJEIGlzIGRpc3Bvc2VkIGJ1dCBjb3VsZCB0aGlzIGNvZGUKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9Gb250TWFuYWdlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L0ZvbnRNYW5hZ2VyLmphdmEKaW5kZXggYThiNzIxZC4uNmFjODk2MiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L0ZvbnRNYW5hZ2VyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L0ZvbnRNYW5hZ2VyLmphdmEKQEAgLTIzNTcsMTkgKzIzNTcsMjEgQEAKICAgICBzdGF0aWMgVmVjdG9yPEZpbGU+IHRtcEZvbnRGaWxlcyA9IG51bGw7CiAKICAgICBwdWJsaWMgc3RhdGljIEZvbnQyRCBjcmVhdGVGb250MkQoRmlsZSBmb250RmlsZSwgaW50IGZvbnRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDb3B5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ29weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZEZvbnRUcmFja2VyIHRyYWNrZXIpCiAgICAgICAgIHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uIHsKIAogICAgICAgICBTdHJpbmcgZm9udEZpbGVQYXRoID0gZm9udEZpbGUuZ2V0UGF0aCgpOwogICAgICAgICBGaWxlRm9udCBmb250MkQgPSBudWxsOwogICAgICAgICBmaW5hbCBGaWxlIGZGaWxlID0gZm9udEZpbGU7CisgICAgICAgIGZpbmFsIENyZWF0ZWRGb250VHJhY2tlciBfdHJhY2tlciA9IHRyYWNrZXI7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzd2l0Y2ggKGZvbnRGb3JtYXQpIHsKICAgICAgICAgICAgIGNhc2UgRm9udC5UUlVFVFlQRV9GT05UOgogICAgICAgICAgICAgICAgIGZvbnQyRCA9IG5ldyBUcnVlVHlwZUZvbnQoZm9udEZpbGVQYXRoLCBudWxsLCAwLCB0cnVlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRm9udC5UWVBFMV9GT05UOgotICAgICAgICAgICAgICAgIGZvbnQyRCA9IG5ldyBUeXBlMUZvbnQoZm9udEZpbGVQYXRoLCBudWxsKTsKKyAgICAgICAgICAgICAgICBmb250MkQgPSBuZXcgVHlwZTFGb250KGZvbnRGaWxlUGF0aCwgbnVsbCwgaXNDb3B5KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvbnRGb3JtYXRFeGNlcHRpb24oIlVucmVjb2duaXNlZCBGb250IEZvcm1hdCIpOwpAQCAtMjM3OSw2ICsyMzgxLDkgQEAKICAgICAgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAogICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90cmFja2VyLnN1YkJ5dGVzKChpbnQpZkZpbGUubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkZpbGUuZGVsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjM4Nyw3ICsyMzkyLDcgQEAKICAgICAgICAgICAgIHRocm93KGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc0NvcHkpIHsKLSAgICAgICAgICAgIGZvbnQyRC5zZXRGaWxlVG9SZW1vdmUoZm9udEZpbGUpOworICAgICAgICAgICAgZm9udDJELnNldEZpbGVUb1JlbW92ZShmb250RmlsZSwgdHJhY2tlcik7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZvbnRNYW5hZ2VyLmNsYXNzKSB7CiAKICAgICAgICAgICAgICAgICBpZiAodG1wRm9udEZpbGVzID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9UcnVlVHlwZUZvbnQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9UcnVlVHlwZUZvbnQuamF2YQppbmRleCA1ZDk0NzdiLi4xM2YwZjY5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ZvbnQvVHJ1ZVR5cGVGb250LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L1RydWVUeXBlRm9udC5qYXZhCkBAIC0xNzUsOCArMTc1LDE3IEBACiAgICAgICAgIHN1cGVyKHBsYXRuYW1lLCBuYXRpdmVOYW1lcyk7CiAgICAgICAgIHVzZUphdmFSYXN0ZXJpemVyID0gamF2YVJhc3Rlcml6ZXI7CiAgICAgICAgIGZvbnRSYW5rID0gRm9udDJELlRURl9SQU5LOwotICAgICAgICB2ZXJpZnkoKTsKLSAgICAgICAgaW5pdChmSW5kZXgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmVyaWZ5KCk7CisgICAgICAgICAgICBpbml0KGZJbmRleCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBGb250Rm9ybWF0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKEZvbnRGb3JtYXRFeGNlcHRpb24pdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvbnRGb3JtYXRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcnVudGltZSBleGNlcHRpb24uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgRGlzcG9zZXIuYWRkT2JqZWN0UmVjb3JkKHRoaXMsIGRpc3Bvc2VyUmVjb3JkKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9UeXBlMUZvbnQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9UeXBlMUZvbnQuamF2YQppbmRleCAzNjg0MWI2Li5hMTE3MzEwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ZvbnQvVHlwZTFGb250LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L1R5cGUxRm9udC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKIGltcG9ydCBzdW4uamF2YTJkLkRpc3Bvc2VyOworaW1wb3J0IHN1bi5qYXZhMmQuRGlzcG9zZXJSZWNvcmQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS5hd3QuRm9udDsKQEAgLTc2LDYgKzc3LDI3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUeXBlMUZvbnQgZXh0ZW5kcyBGaWxlRm9udCB7CiAKKyAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVDFEaXNwb3NlclJlY29yZCAgaW1wbGVtZW50cyBEaXNwb3NlclJlY29yZCB7CisgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKyAgICAgICAgVDFEaXNwb3NlclJlY29yZChTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgICAgICBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgamF2YS5pby5GaWxlKGZpbGVOYW1lKSkuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCiAgICAgV2Vha1JlZmVyZW5jZSBidWZmZXJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZShudWxsKTsKIAogICAgIHByaXZhdGUgU3RyaW5nIHBzTmFtZSA9IG51bGw7CkBAIC0xMjUsMTggKzE0Nyw0MiBAQAogCiAKICAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgVHlwZTEgRm9udC4KKyAgICAgKiBAcGFyYW0gcGxhdG5hbWUgLSBQbGF0Zm9ybSBpZGVudGlmaWVyIG9mIHRoZSBmb250LiBUeXBpY2FsbHkgZmlsZSBuYW1lLgorICAgICAqIEBwYXJhbSBuYXRpdmVOYW1lcyAtIE5hdGl2ZSBuYW1lcyAtIHR5cGljYWxseSBYTEZEcyBvbiBVbml4LgorICAgICAqLworICAgIHB1YmxpYyBUeXBlMUZvbnQoU3RyaW5nIHBsYXRuYW1lLCBPYmplY3QgbmF0aXZlTmFtZXMpCisgICAgICAgIHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzKHBsYXRuYW1lLCBuYXRpdmVOYW1lcywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgogICAgICAqIC0gZG9lcyBiYXNpYyB2ZXJpZmljYXRpb24gb2YgdGhlIGZpbGUKICAgICAgKiAtIHJlYWRzIHRoZSBuYW1lcyAoZnVsbCwgZmFtaWx5KS4KICAgICAgKiAtIGRldGVybWluZXMgdGhlIHN0eWxlIG9mIHRoZSBmb250LgogICAgICAqIEB0aHJvd3MgRm9udEZvcm1hdEV4Y2VwdGlvbiAtIGlmIHRoZSBmb250IGNhbid0IGJlIG9wZW5lZAogICAgICAqIG9yIGZhaWxzIHZlcmlmaWNhdGlvbiwgIG9yIHRoZXJlJ3Mgbm8gdXNhYmxlIGNtYXAKICAgICAgKi8KLSAgICBwdWJsaWMgVHlwZTFGb250KFN0cmluZyBwbGF0bmFtZSwgT2JqZWN0IG5hdGl2ZU5hbWVzKQorICAgIHB1YmxpYyBUeXBlMUZvbnQoU3RyaW5nIHBsYXRuYW1lLCBPYmplY3QgbmF0aXZlTmFtZXMsIGJvb2xlYW4gY3JlYXRlZENvcHkpCiAgICAgICAgIHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIocGxhdG5hbWUsIG5hdGl2ZU5hbWVzKTsKICAgICAgICAgZm9udFJhbmsgPSBGb250MkQuVFlQRTFfUkFOSzsKICAgICAgICAgY2hlY2tlZE5hdGl2ZXMgPSB0cnVlOwotICAgICAgICB2ZXJpZnkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZlcmlmeSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaWYgKGNyZWF0ZWRDb3B5KSB7CisgICAgICAgICAgICAgICAgVDFEaXNwb3NlclJlY29yZCByZWYgPSBuZXcgVDFEaXNwb3NlclJlY29yZChwbGF0bmFtZSk7CisgICAgICAgICAgICAgICAgRGlzcG9zZXIuYWRkT2JqZWN0UmVjb3JkKGJ1ZmZlclJlZiwgcmVmKTsKKyAgICAgICAgICAgICAgICBidWZmZXJSZWYgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBGb250Rm9ybWF0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKEZvbnRGb3JtYXRFeGNlcHRpb24pdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvbnRGb3JtYXRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcnVudGltZSBleGNlcHRpb24uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBCeXRlQnVmZmVyIGdldEJ1ZmZlcigpIHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vaW8vQnl0ZVRvQ2hhckJpZzUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vaW8vQnl0ZVRvQ2hhckJpZzUuamF2YQppbmRleCAxODU3MDIzLi41MDk1MWU0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2lvL0J5dGVUb0NoYXJCaWc1LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9pby9CeXRlVG9DaGFyQmlnNS5qYXZhCkBAIC0yNiw2ICsyNiw4IEBACiAKIHBhY2thZ2Ugc3VuLmlvOwogCitpbXBvcnQgc3VuLm5pby5jcy5leHQuQmlnNTsKKwogLyoqCiAgKiBUYWJsZXMgYW5kIGRhdGEgdG8gY29udmVydCBCaWc1IHRvIFVuaWNvZGUKICAqCkBAIC0zNCwyMTc5ICszNiwxNiBAQAogCiBwdWJsaWMgY2xhc3MgQnl0ZVRvQ2hhckJpZzUgZXh0ZW5kcyBCeXRlVG9DaGFyRG91YmxlQnl0ZSB7CiAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBCaWc1IG5pb0NvZGVyID0gbmV3IEJpZzUoKTsKKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CiAgICAgICAgIHJldHVybiAiQmlnNSI7CiAgICAgfQogCiAgICAgcHVibGljIEJ5dGVUb0NoYXJCaWc1KCkgewotICAgICAgICBzdXBlci5pbmRleDEgPSBpbmRleDE7Ci0gICAgICAgIHN1cGVyLmluZGV4MiA9IGluZGV4MjsKKyAgICAgICAgc3VwZXIuaW5kZXgxID0gbmlvQ29kZXIuZ2V0RGVjb2RlckluZGV4MSgpOworICAgICAgICBzdXBlci5pbmRleDIgPSBuaW9Db2Rlci5nZXREZWNvZGVySW5kZXgyKCk7CiAgICAgICAgIHN0YXJ0ID0gMHg0MDsKICAgICAgICAgZW5kID0gMHhGRTsKICAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaW5uZXJJbmRleDA9Ci0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MzAwMCIrCi0gICAgICAgICJcdUZGMENcdTMwMDFcdTMwMDJcdUZGMEVcdTIwMjJcdUZGMUJcdUZGMUFcdUZGMUYiKwotICAgICAgICAiXHVGRjAxXHVGRTMwXHUyMDI2XHUyMDI1XHVGRTUwXHVGRjY0XHVGRTUyXHUwMEI3IisKLSAgICAgICAgIlx1RkU1NFx1RkU1NVx1RkU1Nlx1RkU1N1x1RkY1Q1x1MjAxM1x1RkUzMVx1MjAxNCIrCi0gICAgICAgICJcdUZFMzNcdUZGM0ZcdUZFMzRcdUZFNEZcdUZGMDhcdUZGMDlcdUZFMzVcdUZFMzYiKwotICAgICAgICAiXHVGRjVCXHVGRjVEXHVGRTM3XHVGRTM4XHUzMDE0XHUzMDE1XHVGRTM5XHVGRTNBIisKLSAgICAgICAgIlx1MzAxMFx1MzAxMVx1RkUzQlx1RkUzQ1x1MzAwQVx1MzAwQlx1RkUzRFx1RkUzRSIrCi0gICAgICAgICJcdTMwMDhcdTMwMDlcdUZFM0ZcdUZFNDBcdTMwMENcdTMwMERcdUZFNDFcdUZFNDIiKwotICAgICAgICAiXHUzMDBFXHUzMDBGXHVGRTQzXHVGRTQ0XHVGRTU5XHVGRTVBXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZFNUJcdUZFNUNcdUZFNURcdUZFNUVcdTIwMThcdTIwMTlcdTIwMUNcdTIwMUQiKwotICAgICAgICAiXHUzMDFEXHUzMDFFXHUyMDM1XHUyMDMyXHVGRjAzXHVGRjA2XHVGRjBBXHUyMDNCIisKLSAgICAgICAgIlx1MDBBN1x1MzAwM1x1MjVDQlx1MjVDRlx1MjVCM1x1MjVCMlx1MjVDRVx1MjYwNiIrCi0gICAgICAgICJcdTI2MDVcdTI1QzdcdTI1QzZcdTI1QTFcdTI1QTBcdTI1QkRcdTI1QkNcdTMyQTMiKwotICAgICAgICAiXHUyMTA1XHUyMDNFXHVGRkZEXHVGRjNGXHVGRkZEXHVGRTQ5XHVGRTRBXHVGRTREIisKLSAgICAgICAgIlx1RkU0RVx1RkU0Qlx1RkU0Q1x1RkU1Rlx1RkU2MFx1RkU2MVx1RkYwQlx1RkYwRCIrCi0gICAgICAgICJcdTAwRDdcdTAwRjdcdTAwQjFcdTIyMUFcdUZGMUNcdUZGMUVcdUZGMURcdTIyNjYiKwotICAgICAgICAiXHUyMjY3XHUyMjYwXHUyMjFFXHUyMjUyXHUyMjYxXHVGRTYyXHVGRTYzXHVGRTY0IisKLSAgICAgICAgIlx1RkU2NVx1RkU2Nlx1MjIzQ1x1MjIyOVx1MjIyQVx1MjJBNVx1MjIyMFx1MjIxRiIrCi0gICAgICAgICJcdTIyQkZcdTMzRDJcdTMzRDFcdTIyMkJcdTIyMkVcdTIyMzVcdTIyMzRcdTI2NDAiKwotICAgICAgICAiXHUyNjQyXHUyNjQxXHUyNjA5XHUyMTkxXHUyMTkzXHUyMTkwXHUyMTkyXHUyMTk2IisKLSAgICAgICAgIlx1MjE5N1x1MjE5OVx1MjE5OFx1MjIyNVx1MjIyM1x1MjU3MVx1MjU3Mlx1RkYwRiIrCi0gICAgICAgICJcdUZGM0NcdUZGMDRcdTAwQTVcdTMwMTJcdTAwQTJcdTAwQTNcdUZGMDVcdUZGMjAiKwotICAgICAgICAiXHUyMTAzXHUyMTA5XHVGRTY5XHVGRTZBXHVGRTZCXHUzM0Q1XHUzMzlDXHUzMzlEIisKLSAgICAgICAgIlx1MzM5RVx1MzNDRVx1MzNBMVx1MzM4RVx1MzM4Rlx1MzNDNFx1MDBCMFx1NTE1OSIrCi0gICAgICAgICJcdTUxNUJcdTUxNUVcdTUxNURcdTUxNjFcdTUxNjNcdTU1RTdcdTc0RTlcdTdDQ0UiKwotICAgICAgICAiXHUyNTgxXHUyNTgyXHUyNTgzXHUyNTg0XHUyNTg1XHUyNTg2XHUyNTg3XHUyNTg4IisKLSAgICAgICAgIlx1MjU4Rlx1MjU4RVx1MjU4RFx1MjU4Q1x1MjU4Qlx1MjU4QVx1MjU4OVx1MjUzQyIrCi0gICAgICAgICJcdTI1MzRcdTI1MkNcdTI1MjRcdTI1MUNcdTI1OTRcdTI1MDBcdTI1MDJcdTI1OTUiKwotICAgICAgICAiXHUyNTBDXHUyNTEwXHUyNTE0XHUyNTE4XHUyNTZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MjU2RSIrCi0gICAgICAgICJcdTI1NzBcdTI1NkZcdTI1NTBcdTI1NUVcdTI1NkFcdTI1NjFcdTI1RTJcdTI1RTMiKwotICAgICAgICAiXHUyNUU1XHUyNUU0XHUyNTcxXHUyNTcyXHUyNTczXHVGRjEwXHVGRjExXHVGRjEyIisKLSAgICAgICAgIlx1RkYxM1x1RkYxNFx1RkYxNVx1RkYxNlx1RkYxN1x1RkYxOFx1RkYxOVx1MjE2MCIrCi0gICAgICAgICJcdTIxNjFcdTIxNjJcdTIxNjNcdTIxNjRcdTIxNjVcdTIxNjZcdTIxNjdcdTIxNjgiKwotICAgICAgICAiXHUyMTY5XHUzMDIxXHUzMDIyXHUzMDIzXHUzMDI0XHUzMDI1XHUzMDI2XHUzMDI3IisKLSAgICAgICAgIlx1MzAyOFx1MzAyOVx1NTM0MVx1NTM0NFx1NTM0NVx1RkYyMVx1RkYyMlx1RkYyMyIrCi0gICAgICAgICJcdUZGMjRcdUZGMjVcdUZGMjZcdUZGMjdcdUZGMjhcdUZGMjlcdUZGMkFcdUZGMkIiKwotICAgICAgICAiXHVGRjJDXHVGRjJEXHVGRjJFXHVGRjJGXHVGRjMwXHVGRjMxXHVGRjMyXHVGRjMzIisKLSAgICAgICAgIlx1RkYzNFx1RkYzNVx1RkYzNlx1RkYzN1x1RkYzOFx1RkYzOVx1RkYzQVx1RkY0MSIrCi0gICAgICAgICJcdUZGNDJcdUZGNDNcdUZGNDRcdUZGNDVcdUZGNDZcdUZGNDdcdUZGNDhcdUZGNDkiKwotICAgICAgICAiXHVGRjRBXHVGRjRCXHVGRjRDXHVGRjREXHVGRjRFXHVGRjRGXHVGRjUwXHVGRjUxIisKLSAgICAgICAgIlx1RkY1Mlx1RkY1M1x1RkY1NFx1RkY1NVx1RkY1Nlx1RkY1N1x1RkY1OFx1RkY1OSIrCi0gICAgICAgICJcdUZGNUFcdTAzOTFcdTAzOTJcdTAzOTNcdTAzOTRcdTAzOTVcdTAzOTZcdTAzOTciKwotICAgICAgICAiXHUwMzk4XHUwMzk5XHUwMzlBXHUwMzlCXHUwMzlDXHUwMzlEXHUwMzlFXHUwMzlGIisKLSAgICAgICAgIlx1MDNBMFx1MDNBMVx1MDNBM1x1MDNBNFx1MDNBNVx1MDNBNlx1MDNBN1x1MDNBOCIrCi0gICAgICAgICJcdTAzQTlcdTAzQjFcdTAzQjJcdTAzQjNcdTAzQjRcdTAzQjVcdTAzQjZcdTAzQjciKwotICAgICAgICAiXHUwM0I4XHUwM0I5XHUwM0JBXHUwM0JCXHUwM0JDXHUwM0JEXHUwM0JFXHUwM0JGIisKLSAgICAgICAgIlx1MDNDMFx1MDNDMVx1MDNDM1x1MDNDNFx1MDNDNVx1MDNDNlx1MDNDN1x1MDNDOCIrCi0gICAgICAgICJcdTAzQzlcdTMxMDVcdTMxMDZcdTMxMDdcdTMxMDhcdTMxMDlcdTMxMEFcdTMxMEIiKwotICAgICAgICAiXHUzMTBDXHUzMTBEXHUzMTBFXHUzMTBGXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MzExMFx1MzExMSIrCi0gICAgICAgICJcdTMxMTJcdTMxMTNcdTMxMTRcdTMxMTVcdTMxMTZcdTMxMTdcdTMxMThcdTMxMTkiKwotICAgICAgICAiXHUzMTFBXHUzMTFCXHUzMTFDXHUzMTFEXHUzMTFFXHUzMTFGXHUzMTIwXHUzMTIxIisKLSAgICAgICAgIlx1MzEyMlx1MzEyM1x1MzEyNFx1MzEyNVx1MzEyNlx1MzEyN1x1MzEyOFx1MzEyOSIrCi0gICAgICAgICJcdTAyRDlcdTAyQzlcdTAyQ0FcdTAyQzdcdTAyQ0JcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NEUwMFx1NEU1OVx1NEUwMVx1NEUwMyIrCi0gICAgICAgICJcdTRFNDNcdTRFNURcdTRFODZcdTRFOENcdTRFQkFcdTUxM0ZcdTUxNjVcdTUxNkIiKwotICAgICAgICAiXHU1MUUwXHU1MjAwXHU1MjAxXHU1MjlCXHU1MzE1XHU1MzQxXHU1MzVDXHU1M0M4IisKLSAgICAgICAgIlx1NEUwOVx1NEUwQlx1NEUwOFx1NEUwQVx1NEUyQlx1NEUzOFx1NTFFMVx1NEU0NSIrCi0gICAgICAgICJcdTRFNDhcdTRFNUZcdTRFNUVcdTRFOEVcdTRFQTFcdTUxNDBcdTUyMDNcdTUyRkEiKwotICAgICAgICAiXHU1MzQzXHU1M0M5XHU1M0UzXHU1NzFGXHU1OEVCXHU1OTE1XHU1OTI3XHU1OTczIisKLSAgICAgICAgIlx1NUI1MFx1NUI1MVx1NUI1M1x1NUJGOFx1NUMwRlx1NUMyMlx1NUMzOFx1NUM3MSIrCi0gICAgICAgICJcdTVERERcdTVERTVcdTVERjFcdTVERjJcdTVERjNcdTVERkVcdTVFNzJcdTVFRkUiKwotICAgICAgICAiXHU1RjBCXHU1RjEzXHU2MjREXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NEUxMVx1NEUxMFx1NEUwRCIrCi0gICAgICAgICJcdTRFMkRcdTRFMzBcdTRFMzlcdTRFNEJcdTVDMzlcdTRFODhcdTRFOTFcdTRFOTUiKwotICAgICAgICAiXHU0RTkyXHU0RTk0XHU0RUEyXHU0RUMxXHU0RUMwXHU0RUMzXHU0RUM2XHU0RUM3IisKLSAgICAgICAgIlx1NEVDRFx1NEVDQVx1NEVDQlx1NEVDNFx1NTE0M1x1NTE0MVx1NTE2N1x1NTE2RCIrCi0gICAgICAgICJcdTUxNkVcdTUxNkNcdTUxOTdcdTUxRjZcdTUyMDZcdTUyMDdcdTUyMDhcdTUyRkIiKwotICAgICAgICAiXHU1MkZFXHU1MkZGXHU1MzE2XHU1MzM5XHU1MzQ4XHU1MzQ3XHU1MzQ1XHU1MzVFIisKLSAgICAgICAgIlx1NTM4NFx1NTNDQlx1NTNDQVx1NTNDRFx1NThFQ1x1NTkyOVx1NTkyQlx1NTkyQSIrCi0gICAgICAgICJcdTU5MkRcdTVCNTRcdTVDMTFcdTVDMjRcdTVDM0FcdTVDNkZcdTVERjRcdTVFN0IiKwotICAgICAgICAiXHU1RUZGXHU1RjE0XHU1RjE1XHU1RkMzXHU2MjA4XHU2MjM2XHU2MjRCXHU2MjRFIisKLSAgICAgICAgIlx1NjUyRlx1NjU4N1x1NjU5N1x1NjVBNFx1NjVCOVx1NjVFNVx1NjZGMFx1NjcwOCIrCi0gICAgICAgICJcdTY3MjhcdTZCMjBcdTZCNjJcdTZCNzlcdTZCQ0JcdTZCRDRcdTZCREJcdTZDMEYiKwotICAgICAgICAiXHU2QzM0XHU3MDZCXHU3MjJBXHU3MjM2XHU3MjNCXHU3MjQ3XHU3MjU5XHU3MjVCIisKLSAgICAgICAgIlx1NzJBQ1x1NzM4Qlx1NEUxOVx1NEUxNlx1NEUxNVx1NEUxNFx1NEUxOFx1NEUzQiIrCi0gICAgICAgICJcdTRFNERcdTRFNEZcdTRFNEVcdTRFRTVcdTRFRDhcdTRFRDRcdTRFRDVcdTRFRDYiKwotICAgICAgICAiXHU0RUQ3XHU0RUUzXHU0RUU0XHU0RUQ5XHU0RURFXHU1MTQ1XHU1MTQ0XHU1MTg5IisKLSAgICAgICAgIlx1NTE4QVx1NTFBQ1x1NTFGOVx1NTFGQVx1NTFGOFx1NTIwQVx1NTJBMFx1NTI5RiIrCi0gICAgICAgICJcdTUzMDVcdTUzMDZcdTUzMTdcdTUzMURcdTRFREZcdTUzNEFcdTUzNDlcdTUzNjEiKwotICAgICAgICAiXHU1MzYwXHU1MzZGXHU1MzZFXHU1M0JCXHU1M0VGXHU1M0U0XHU1M0YzXHU1M0VDIisKLSAgICAgICAgIlx1NTNFRVx1NTNFOVx1NTNFOFx1NTNGQ1x1NTNGOFx1NTNGNVx1NTNFQlx1NTNFNiIrCi0gICAgICAgICJcdTUzRUFcdTUzRjJcdTUzRjFcdTUzRjBcdTUzRTVcdTUzRURcdTUzRkJcdTU2REIiKwotICAgICAgICAiXHU1NkRBXHU1OTE2XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NTkyRVx1NTkzMVx1NTk3NFx1NTk3NiIrCi0gICAgICAgICJcdTVCNTVcdTVCODNcdTVDM0NcdTVERThcdTVERTdcdTVERTZcdTVFMDJcdTVFMDMiKwotICAgICAgICAiXHU1RTczXHU1RTdDXHU1RjAxXHU1RjE4XHU1RjE3XHU1RkM1XHU2MjBBXHU2MjUzIisKLSAgICAgICAgIlx1NjI1NFx1NjI1Mlx1NjI1MVx1NjVBNVx1NjVFNlx1NjcyRVx1NjcyQ1x1NjcyQSIrCi0gICAgICAgICJcdTY3MkJcdTY3MkRcdTZCNjNcdTZCQ0RcdTZDMTFcdTZDMTBcdTZDMzhcdTZDNDEiKwotICAgICAgICAiXHU2QzQwXHU2QzNFXHU3MkFGXHU3Mzg0XHU3Mzg5XHU3NERDXHU3NEU2XHU3NTE4IisKLSAgICAgICAgIlx1NzUxRlx1NzUyOFx1NzUyOVx1NzUzMFx1NzUzMVx1NzUzMlx1NzUzM1x1NzU4QiIrCi0gICAgICAgICJcdTc2N0RcdTc2QUVcdTc2QkZcdTc2RUVcdTc3REJcdTc3RTJcdTc3RjNcdTc5M0EiKwotICAgICAgICAiXHU3OUJFXHU3QTc0XHU3QUNCXHU0RTFFXHU0RTFGXHU0RTUyXHU0RTUzXHU0RTY5IisKLSAgICAgICAgIlx1NEU5OVx1NEVBNFx1NEVBNlx1NEVBNVx1NEVGRlx1NEYwOVx1NEYxOVx1NEYwQSIrCi0gICAgICAgICJcdTRGMTVcdTRGMERcdTRGMTBcdTRGMTFcdTRGMEZcdTRFRjJcdTRFRjZcdTRFRkIiKwotICAgICAgICAiXHU0RUYwXHU0RUYzXHU0RUZEXHU0RjAxXHU0RjBCXHU1MTQ5XHU1MTQ3XHU1MTQ2IisKLSAgICAgICAgIlx1NTE0OFx1NTE2OFx1NTE3MVx1NTE4RFx1NTFCMFx1NTIxN1x1NTIxMVx1NTIxMiIrCi0gICAgICAgICJcdTUyMEVcdTUyMTZcdTUyQTNcdTUzMDhcdTUzMjFcdTUzMjBcdTUzNzBcdTUzNzEiKwotICAgICAgICAiXHU1NDA5XHU1NDBGXHU1NDBDXHU1NDBBXHU1NDEwXHU1NDAxXHU1NDBCXHU1NDA0IisKLSAgICAgICAgIlx1NTQxMVx1NTQwRFx1NTQwOFx1NTQwM1x1NTQwRVx1NTQwNlx1NTQxMlx1NTZFMCIrCi0gICAgICAgICJcdTU2REVcdTU2RERcdTU3MzNcdTU3MzBcdTU3MjhcdTU3MkRcdTU3MkNcdTU3MkYiKwotICAgICAgICAiXHU1NzI5XHU1OTE5XHU1OTFBXHU1OTM3XHU1OTM4XHU1OTg0XHU1OTc4XHU1OTgzIisKLSAgICAgICAgIlx1NTk3RFx1NTk3OVx1NTk4Mlx1NTk4MVx1NUI1N1x1NUI1OFx1NUI4N1x1NUI4OCIrCi0gICAgICAgICJcdTVCODVcdTVCODlcdTVCRkFcdTVDMTZcdTVDNzlcdTVEREVcdTVFMDZcdTVFNzYiKwotICAgICAgICAiXHU1RTc0XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1NUYwRlx1NUYxQlx1NUZEOVx1NUZENlx1NjIwRSIrCi0gICAgICAgICJcdTYyMENcdTYyMERcdTYyMTBcdTYyNjNcdTYyNUJcdTYyNThcdTY1MzZcdTY1RTkiKwotICAgICAgICAiXHU2NUU4XHU2NUVDXHU2NUVEXHU2NkYyXHU2NkYzXHU2NzA5XHU2NzNEXHU2NzM0IisKLSAgICAgICAgIlx1NjczMVx1NjczNVx1NkIyMVx1NkI2NFx1NkI3Qlx1NkMxNlx1NkM1RFx1NkM1NyIrCi0gICAgICAgICJcdTZDNTlcdTZDNUZcdTZDNjBcdTZDNTBcdTZDNTVcdTZDNjFcdTZDNUJcdTZDNEQiKwotICAgICAgICAiXHU2QzRFXHU3MDcwXHU3MjVGXHU3MjVEXHU3NjdFXHU3QUY5XHU3QzczXHU3Q0Y4IisKLSAgICAgICAgIlx1N0YzNlx1N0Y4QVx1N0ZCRFx1ODAwMVx1ODAwM1x1ODAwQ1x1ODAxMlx1ODAzMyIrCi0gICAgICAgICJcdTgwN0ZcdTgwODlcdTgwOEJcdTgwOENcdTgxRTNcdTgxRUFcdTgxRjNcdTgxRkMiKwotICAgICAgICAiXHU4MjBDXHU4MjFCXHU4MjFGXHU4MjZFXHU4MjcyXHU4MjdFXHU4NjZCXHU4ODQwIisKLSAgICAgICAgIlx1ODg0Q1x1ODg2M1x1ODk3Rlx1OTYyMVx1NEUzMlx1NEVBOFx1NEY0RFx1NEY0RiIrCi0gICAgICAgICJcdTRGNDdcdTRGNTdcdTRGNUVcdTRGMzRcdTRGNUJcdTRGNTVcdTRGMzBcdTRGNTAiKwotICAgICAgICAiXHU0RjUxXHU0RjNEXHU0RjNBXHU0RjM4XHU0RjQzXHU0RjU0XHU0RjNDXHU0RjQ2IisKLSAgICAgICAgIlx1NEY2M1x1NEY1Q1x1NEY2MFx1NEYyRlx1NEY0RVx1NEYzNlx1NEY1OVx1NEY1RCIrCi0gICAgICAgICJcdTRGNDhcdTRGNUFcdTUxNENcdTUxNEJcdTUxNERcdTUxNzVcdTUxQjZcdTUxQjciKwotICAgICAgICAiXHU1MjI1XHU1MjI0XHU1MjI5XHU1MjJBXHU1MjI4XHU1MkFCXHU1MkE5XHU1MkFBIisKLSAgICAgICAgIlx1NTJBQ1x1NTMyM1x1NTM3M1x1NTM3NVx1NTQxRFx1NTQyRFx1NTQxRVx1NTQzRSIrCi0gICAgICAgICJcdTU0MjZcdTU0NEVcdTU0MjdcdTU0NDZcdTU0NDNcdTU0MzNcdTU0NDhcdTU0NDIiKwotICAgICAgICAiXHU1NDFCXHU1NDI5XHU1NDRBXHU1NDM5XHU1NDNCXHU1NDM4XHU1NDJFXHU1NDM1IisKLSAgICAgICAgIlx1NTQzNlx1NTQyMFx1NTQzQ1x1NTQ0MFx1NTQzMVx1NTQyQlx1NTQxRlx1NTQyQyIrCi0gICAgICAgICJcdTU2RUFcdTU2RjBcdTU2RTRcdTU2RUJcdTU3NEFcdTU3NTFcdTU3NDBcdTU3NEQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1NTc0N1x1NTc0RVx1NTczRVx1NTc1MFx1NTc0Rlx1NTczQiIrCi0gICAgICAgICJcdTU4RUZcdTU5M0VcdTU5OURcdTU5OTJcdTU5QThcdTU5OUVcdTU5QTNcdTU5OTkiKwotICAgICAgICAiXHU1OTk2XHU1OThEXHU1OUE0XHU1OTkzXHU1OThBXHU1OUE1XHU1QjVEXHU1QjVDIisKLSAgICAgICAgIlx1NUI1QVx1NUI1Qlx1NUI4Q1x1NUI4Qlx1NUI4Rlx1NUMyQ1x1NUM0MFx1NUM0MSIrCi0gICAgICAgICJcdTVDM0ZcdTVDM0VcdTVDOTBcdTVDOTFcdTVDOTRcdTVDOENcdTVERUJcdTVFMEMiKwotICAgICAgICAiXHU1RThGXHU1RTg3XHU1RThBXHU1RUY3XHU1RjA0XHU1RjFGXHU1RjY0XHU1RjYyIisKLSAgICAgICAgIlx1NUY3N1x1NUY3OVx1NUZEOFx1NUZDQ1x1NUZEN1x1NUZDRFx1NUZGMVx1NUZFQiIrCi0gICAgICAgICJcdTVGRjhcdTVGRUFcdTYyMTJcdTYyMTFcdTYyODRcdTYyOTdcdTYyOTZcdTYyODAiKwotICAgICAgICAiXHU2Mjc2XHU2Mjg5XHU2MjZEXHU2MjhBXHU2MjdDXHU2MjdFXHU2Mjc5XHU2MjczIisKLSAgICAgICAgIlx1NjI5Mlx1NjI2Rlx1NjI5OFx1NjI2RVx1NjI5NVx1NjI5M1x1NjI5MVx1NjI4NiIrCi0gICAgICAgICJcdTY1MzlcdTY1M0JcdTY1MzhcdTY1RjFcdTY2RjRcdTY3NUZcdTY3NEVcdTY3NEYiKwotICAgICAgICAiXHU2NzUwXHU2NzUxXHU2NzVDXHU2NzU2XHU2NzVFXHU2NzQ5XHU2NzQ2XHU2NzYwIisKLSAgICAgICAgIlx1Njc1M1x1Njc1N1x1NkI2NVx1NkJDRlx1NkM0Mlx1NkM1RVx1NkM5OVx1NkM4MSIrCi0gICAgICAgICJcdTZDODhcdTZDODlcdTZDODVcdTZDOUJcdTZDNkFcdTZDN0FcdTZDOTBcdTZDNzAiKwotICAgICAgICAiXHU2QzhDXHU2QzY4XHU2Qzk2XHU2QzkyXHU2QzdEXHU2QzgzXHU2QzcyXHU2QzdFIisKLSAgICAgICAgIlx1NkM3NFx1NkM4Nlx1NkM3Nlx1NkM4RFx1NkM5NFx1NkM5OFx1NkM4Mlx1NzA3NiIrCi0gICAgICAgICJcdTcwN0NcdTcwN0RcdTcwNzhcdTcyNjJcdTcyNjFcdTcyNjBcdTcyQzRcdTcyQzIiKwotICAgICAgICAiXHU3Mzk2XHU3NTJDXHU3NTJCXHU3NTM3XHU3NTM4XHU3NjgyXHU3NkVGXHU3N0UzIisKLSAgICAgICAgIlx1NzlDMVx1NzlDMFx1NzlCRlx1N0E3Nlx1N0NGQlx1N0Y1NVx1ODA5Nlx1ODA5MyIrCi0gICAgICAgICJcdTgwOURcdTgwOThcdTgwOUJcdTgwOUFcdTgwQjJcdTgyNkZcdTgyOTJcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1ODI4Qlx1ODI4RFx1ODk4Qlx1ODlEMlx1OEEwMFx1OEMzN1x1OEM0NiIrCi0gICAgICAgICJcdThDNTVcdThDOURcdThENjRcdThENzBcdThEQjNcdThFQUJcdThFQ0FcdThGOUIiKwotICAgICAgICAiXHU4RkIwXHU4RkMyXHU4RkM2XHU4RkM1XHU4RkM0XHU1REUxXHU5MDkxXHU5MEEyIisKLSAgICAgICAgIlx1OTBBQVx1OTBBNlx1OTBBM1x1OTE0OVx1OTFDNlx1OTFDQ1x1OTYzMlx1OTYyRSIrCi0gICAgICAgICJcdTk2MzFcdTk2MkFcdTk2MkNcdTRFMjZcdTRFNTZcdTRFNzNcdTRFOEJcdTRFOUIiKwotICAgICAgICAiXHU0RTlFXHU0RUFCXHU0RUFDXHU0RjZGXHU0RjlEXHU0RjhEXHU0RjczXHU0RjdGIisKLSAgICAgICAgIlx1NEY2Q1x1NEY5Qlx1NEY4Qlx1NEY4Nlx1NEY4M1x1NEY3MFx1NEY3NVx1NEY4OCIrCi0gICAgICAgICJcdTRGNjlcdTRGN0JcdTRGOTZcdTRGN0VcdTRGOEZcdTRGOTFcdTRGN0FcdTUxNTQiKwotICAgICAgICAiXHU1MTUyXHU1MTU1XHU1MTY5XHU1MTc3XHU1MTc2XHU1MTc4XHU1MUJEXHU1MUZEIisKLSAgICAgICAgIlx1NTIzQlx1NTIzOFx1NTIzN1x1NTIzQVx1NTIzMFx1NTIyRVx1NTIzNlx1NTI0MSIrCi0gICAgICAgICJcdTUyQkVcdTUyQkJcdTUzNTJcdTUzNTRcdTUzNTNcdTUzNTFcdTUzNjZcdTUzNzciKwotICAgICAgICAiXHU1Mzc4XHU1Mzc5XHU1M0Q2XHU1M0Q0XHU1M0Q3XHU1NDczXHU1NDc1XHU1NDk2IisKLSAgICAgICAgIlx1NTQ3OFx1NTQ5NVx1NTQ4MFx1NTQ3Qlx1NTQ3N1x1NTQ4NFx1NTQ5Mlx1NTQ4NiIrCi0gICAgICAgICJcdTU0N0NcdTU0OTBcdTU0NzFcdTU0NzZcdTU0OENcdTU0OUFcdTU0NjJcdTU0NjgiKwotICAgICAgICAiXHU1NDhCXHU1NDdEXHU1NDhFXHU1NkZBXHU1NzgzXHU1Nzc3XHU1NzZBXHU1NzY5IisKLSAgICAgICAgIlx1NTc2MVx1NTc2Nlx1NTc2NFx1NTc3Q1x1NTkxQ1x1NTk0OVx1NTk0N1x1NTk0OCIrCi0gICAgICAgICJcdTU5NDRcdTU5NTRcdTU5QkVcdTU5QkJcdTU5RDRcdTU5QjlcdTU5QUVcdTU5RDEiKwotICAgICAgICAiXHU1OUM2XHU1OUQwXHU1OUNEXHU1OUNCXHU1OUQzXHU1OUNBXHU1OUFGXHU1OUIzIisKLSAgICAgICAgIlx1NTlEMlx1NTlDNVx1NUI1Rlx1NUI2NFx1NUI2M1x1NUI5N1x1NUI5QVx1NUI5OCIrCi0gICAgICAgICJcdTVCOUNcdTVCOTlcdTVCOUJcdTVDMUFcdTVDNDhcdTVDNDVcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1NUM0Nlx1NUNCN1x1NUNBMVx1NUNCOFx1NUNBOVx1NUNBQlx1NUNCMVx1NUNCMyIrCi0gICAgICAgICJcdTVFMThcdTVFMUFcdTVFMTZcdTVFMTVcdTVFMUJcdTVFMTFcdTVFNzhcdTVFOUEiKwotICAgICAgICAiXHU1RTk3XHU1RTlDXHU1RTk1XHU1RTk2XHU1RUY2XHU1RjI2XHU1RjI3XHU1RjI5IisKLSAgICAgICAgIlx1NUY4MFx1NUY4MVx1NUY3Rlx1NUY3Q1x1NUZERFx1NUZFMFx1NUZGRFx1NUZGNSIrCi0gICAgICAgICJcdTVGRkZcdTYwMEZcdTYwMTRcdTYwMkZcdTYwMzVcdTYwMTZcdTYwMkFcdTYwMTUiKwotICAgICAgICAiXHU2MDIxXHU2MDI3XHU2MDI5XHU2MDJCXHU2MDFCXHU2MjE2XHU2MjE1XHU2MjNGIisKLSAgICAgICAgIlx1NjIzRVx1NjI0MFx1NjI3Rlx1NjJDOVx1NjJDQ1x1NjJDNFx1NjJCRlx1NjJDMiIrCi0gICAgICAgICJcdTYyQjlcdTYyRDJcdTYyREJcdTYyQUJcdTYyRDNcdTYyRDRcdTYyQ0JcdTYyQzgiKwotICAgICAgICAiXHU2MkE4XHU2MkJEXHU2MkJDXHU2MkQwXHU2MkQ5XHU2MkM3XHU2MkNEXHU2MkI1IisKLSAgICAgICAgIlx1NjJEQVx1NjJCMVx1NjJEOFx1NjJENlx1NjJEN1x1NjJDNlx1NjJBQ1x1NjJDRSIrCi0gICAgICAgICJcdTY1M0VcdTY1QTdcdTY1QkNcdTY1RkFcdTY2MTRcdTY2MTNcdTY2MENcdTY2MDYiKwotICAgICAgICAiXHU2NjAyXHU2NjBFXHU2NjAwXHU2NjBGXHU2NjE1XHU2NjBBXHU2NjA3XHU2NzBEIisKLSAgICAgICAgIlx1NjcwQlx1Njc2RFx1Njc4Qlx1Njc5NVx1Njc3MVx1Njc5Q1x1Njc3M1x1Njc3NyIrCi0gICAgICAgICJcdTY3ODdcdTY3OURcdTY3OTdcdTY3NkZcdTY3NzBcdTY3N0ZcdTY3ODlcdTY3N0UiKwotICAgICAgICAiXHU2NzkwXHU2Nzc1XHU2NzlBXHU2NzkzXHU2NzdDXHU2NzZBXHU2NzcyXHU2QjIzIisKLSAgICAgICAgIlx1NkI2Nlx1NkI2N1x1NkI3Rlx1NkMxM1x1NkMxQlx1NkNFM1x1NkNFOFx1NkNGMyIrCi0gICAgICAgICJcdTZDQjFcdTZDQ0NcdTZDRTVcdTZDQjNcdTZDQkRcdTZDQkVcdTZDQkNcdTZDRTIiKwotICAgICAgICAiXHU2Q0FCXHU2Q0Q1XHU2Q0QzXHU2Q0I4XHU2Q0M0XHU2Q0I5XHU2Q0MxXHU2Q0FFIisKLSAgICAgICAgIlx1NkNEN1x1NkNDNVx1NkNGMVx1NkNCRlx1NkNCQlx1NkNFMVx1NkNEQlx1NkNDQSIrCi0gICAgICAgICJcdTZDQUNcdTZDRUZcdTZDRENcdTZDRDZcdTZDRTBcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU3MDk1IisKLSAgICAgICAgIlx1NzA4RVx1NzA5Mlx1NzA4QVx1NzA5OVx1NzIyQ1x1NzIyRFx1NzIzOFx1NzI0OCIrCi0gICAgICAgICJcdTcyNjdcdTcyNjlcdTcyQzBcdTcyQ0VcdTcyRDlcdTcyRDdcdTcyRDBcdTczQTkiKwotICAgICAgICAiXHU3M0E4XHU3MzlGXHU3M0FCXHU3M0E1XHU3NTNEXHU3NTlEXHU3NTk5XHU3NTlBIisKLSAgICAgICAgIlx1NzY4NFx1NzZDMlx1NzZGMlx1NzZGNFx1NzdFNVx1NzdGRFx1NzkzRVx1Nzk0MCIrCi0gICAgICAgICJcdTc5NDFcdTc5QzlcdTc5QzhcdTdBN0FcdTdBNzlcdTdBRkFcdTdDRkVcdTdGNTQiKwotICAgICAgICAiXHU3RjhDXHU3RjhCXHU4MDA1XHU4MEJBXHU4MEE1XHU4MEEyXHU4MEIxXHU4MEExIisKLSAgICAgICAgIlx1ODBBQlx1ODBBOVx1ODBCNFx1ODBBQVx1ODBBRlx1ODFFNVx1ODFGRVx1ODIwRCIrCi0gICAgICAgICJcdTgyQjNcdTgyOURcdTgyOTlcdTgyQURcdTgyQkRcdTgyOUZcdTgyQjlcdTgyQjEiKwotICAgICAgICAiXHU4MkFDXHU4MkE1XHU4MkFGXHU4MkI4XHU4MkEzXHU4MkIwXHU4MkJFXHU4MkI3IisKLSAgICAgICAgIlx1ODY0RVx1ODY3MVx1NTIxRFx1ODg2OFx1OEVDQlx1OEZDRVx1OEZENFx1OEZEMSIrCi0gICAgICAgICJcdTkwQjVcdTkwQjhcdTkwQjFcdTkwQjZcdTkxQzdcdTkxRDFcdTk1NzdcdTk1ODAiKwotICAgICAgICAiXHU5NjFDXHU5NjQwXHU5NjNGXHU5NjNCXHU5NjQ0XHU5NjQyXHU5NkI5XHU5NkU4IisKLSAgICAgICAgIlx1OTc1Mlx1OTc1RVx1NEU5Rlx1NEVBRFx1NEVBRVx1NEZFMVx1NEZCNVx1NEZBRiIrCi0gICAgICAgICJcdTRGQkZcdTRGRTBcdTRGRDFcdTRGQ0ZcdTRGRERcdTRGQzNcdTRGQjZcdTRGRDgiKwotICAgICAgICAiXHU0RkRGXHU0RkNBXHU0RkQ3XHU0RkFFXHU0RkQwXHU0RkM0XHU0RkMyXHU0RkRBIisKLSAgICAgICAgIlx1NEZDRVx1NEZERVx1NEZCN1x1NTE1N1x1NTE5Mlx1NTE5MVx1NTFBMFx1NTI0RSIrCi0gICAgICAgICJcdTUyNDNcdTUyNEFcdTUyNERcdTUyNENcdTUyNEJcdTUyNDdcdTUyQzdcdTUyQzkiKwotICAgICAgICAiXHU1MkMzXHU1MkMxXHU1MzBEXHU1MzU3XHU1MzdCXHU1MzlBXHU1M0RCXHU1NEFDIisKLSAgICAgICAgIlx1NTRDMFx1NTRBOFx1NTRDRVx1NTRDOVx1NTRCOFx1NTRBNlx1NTRCM1x1NTRDNyIrCi0gICAgICAgICJcdTU0QzJcdTU0QkRcdTU0QUFcdTU0QzFcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU1NEM0XHU1NEM4IisKLSAgICAgICAgIlx1NTRBRlx1NTRBQlx1NTRCMVx1NTRCQlx1NTRBOVx1NTRBN1x1NTRCRlx1NTZGRiIrCi0gICAgICAgICJcdTU3ODJcdTU3OEJcdTU3QTBcdTU3QTNcdTU3QTJcdTU3Q0VcdTU3QUVcdTU3OTMiKwotICAgICAgICAiXHU1OTU1XHU1OTUxXHU1OTRGXHU1OTRFXHU1OTUwXHU1OURDXHU1OUQ4XHU1OUZGIisKLSAgICAgICAgIlx1NTlFM1x1NTlFOFx1NUEwM1x1NTlFNVx1NTlFQVx1NTlEQVx1NTlFNlx1NUEwMSIrCi0gICAgICAgICJcdTU5RkJcdTVCNjlcdTVCQTNcdTVCQTZcdTVCQTRcdTVCQTJcdTVCQTVcdTVDMDEiKwotICAgICAgICAiXHU1QzRFXHU1QzRGXHU1QzREXHU1QzRCXHU1Q0Q5XHU1Q0QyXHU1REY3XHU1RTFEIisKLSAgICAgICAgIlx1NUUyNVx1NUUxRlx1NUU3RFx1NUVBMFx1NUVBNlx1NUVGQVx1NUYwOFx1NUYyRCIrCi0gICAgICAgICJcdTVGNjVcdTVGODhcdTVGODVcdTVGOEFcdTVGOEJcdTVGODdcdTVGOENcdTVGODkiKwotICAgICAgICAiXHU2MDEyXHU2MDFEXHU2MDIwXHU2MDI1XHU2MDBFXHU2MDI4XHU2MDREXHU2MDcwIisKLSAgICAgICAgIlx1NjA2OFx1NjA2Mlx1NjA0Nlx1NjA0M1x1NjA2Q1x1NjA2Qlx1NjA2QVx1NjA2NCIrCi0gICAgICAgICJcdTYyNDFcdTYyRENcdTYzMTZcdTYzMDlcdTYyRkNcdTYyRURcdTYzMDFcdTYyRUUiKwotICAgICAgICAiXHU2MkZEXHU2MzA3XHU2MkYxXHU2MkY3XHU2MkVGXHU2MkVDXHU2MkZFXHU2MkY0IisKLSAgICAgICAgIlx1NjMxMVx1NjMwMlx1NjUzRlx1NjU0NVx1NjVBQlx1NjVCRFx1NjVFMlx1NjYyNSIrCi0gICAgICAgICJcdTY2MkRcdTY2MjBcdTY2MjdcdTY2MkZcdTY2MUZcdTY2MjhcdTY2MzFcdTY2MjQiKwotICAgICAgICAiXHU2NkY3XHU2N0ZGXHU2N0QzXHU2N0YxXHU2N0Q0XHU2N0QwXHU2N0VDXHU2N0I2IisKLSAgICAgICAgIlx1NjdBRlx1NjdGNVx1NjdFOVx1NjdFRlx1NjdDNFx1NjdEMVx1NjdCNFx1NjdEQSIrCi0gICAgICAgICJcdTY3RTVcdTY3QjhcdTY3Q0ZcdTY3REVcdTY3RjNcdTY3QjBcdTY3RDlcdTY3RTIiKwotICAgICAgICAiXHU2N0REXHU2N0QyXHU2QjZBXHU2QjgzXHU2Qjg2XHU2QkI1XHU2QkQyXHU2QkQ3IisKLSAgICAgICAgIlx1NkMxRlx1NkNDOVx1NkQwQlx1NkQzMlx1NkQyQVx1NkQ0MVx1NkQyNVx1NkQwQyIrCi0gICAgICAgICJcdTZEMzFcdTZEMUVcdTZEMTdcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU2RDNCXHU2RDNEXHU2RDNFIisKLSAgICAgICAgIlx1NkQzNlx1NkQxQlx1NkNGNVx1NkQzOVx1NkQyN1x1NkQzOFx1NkQyOVx1NkQyRSIrCi0gICAgICAgICJcdTZEMzVcdTZEMEVcdTZEMkJcdTcwQUJcdTcwQkFcdTcwQjNcdTcwQUNcdTcwQUYiKwotICAgICAgICAiXHU3MEFEXHU3MEI4XHU3MEFFXHU3MEE0XHU3MjMwXHU3MjcyXHU3MjZGXHU3Mjc0IisKLSAgICAgICAgIlx1NzJFOVx1NzJFMFx1NzJFMVx1NzNCN1x1NzNDQVx1NzNCQlx1NzNCMlx1NzNDRCIrCi0gICAgICAgICJcdTczQzBcdTczQjNcdTc1MUFcdTc1MkRcdTc1NEZcdTc1NENcdTc1NEVcdTc1NEIiKwotICAgICAgICAiXHU3NUFCXHU3NUE0XHU3NUE1XHU3NUEyXHU3NUEzXHU3Njc4XHU3Njg2XHU3Njg3IisKLSAgICAgICAgIlx1NzY4OFx1NzZDOFx1NzZDNlx1NzZDM1x1NzZDNVx1NzcwMVx1NzZGOVx1NzZGOCIrCi0gICAgICAgICJcdTc3MDlcdTc3MEJcdTc2RkVcdTc2RkNcdTc3MDdcdTc3RENcdTc4MDJcdTc4MTQiKwotICAgICAgICAiXHU3ODBDXHU3ODBEXHU3OTQ2XHU3OTQ5XHU3OTQ4XHU3OTQ3XHU3OUI5XHU3OUJBIisKLSAgICAgICAgIlx1NzlEMVx1NzlEMlx1NzlDQlx1N0E3Rlx1N0E4MVx1N0FGRlx1N0FGRFx1N0M3RCIrCi0gICAgICAgICJcdTdEMDJcdTdEMDVcdTdEMDBcdTdEMDlcdTdEMDdcdTdEMDRcdTdEMDZcdTdGMzgiKwotICAgICAgICAiXHU3RjhFXHU3RkJGXHU4MDA0XHU4MDEwXHU4MDBEXHU4MDExXHU4MDM2XHU4MEQ2IisKLSAgICAgICAgIlx1ODBFNVx1ODBEQVx1ODBDM1x1ODBDNFx1ODBDQ1x1ODBFMVx1ODBEQlx1ODBDRSIrCi0gICAgICAgICJcdTgwREVcdTgwRTRcdTgwRERcdTgxRjRcdTgyMjJcdTgyRTdcdTgzMDNcdTgzMDUiKwotICAgICAgICAiXHU4MkUzXHU4MkRCXHU4MkU2XHU4MzA0XHU4MkU1XHU4MzAyXHU4MzA5XHU4MkQyIisKLSAgICAgICAgIlx1ODJEN1x1ODJGMVx1ODMwMVx1ODJEQ1x1ODJENFx1ODJEMVx1ODJERVx1ODJEMyIrCi0gICAgICAgICJcdTgyREZcdTgyRUZcdTgzMDZcdTg2NTBcdTg2NzlcdTg2N0JcdTg2N0FcdTg4NEQiKwotICAgICAgICAiXHU4ODZCXHU4OTgxXHU4OUQ0XHU4QTA4XHU4QTAyXHU4QTAzXHU4QzlFXHU4Q0EwIisKLSAgICAgICAgIlx1OEQ3NFx1OEQ3M1x1OERCNFx1OEVDRFx1OEVDQ1x1OEZGMFx1OEZFNlx1OEZFMiIrCi0gICAgICAgICJcdThGRUFcdThGRTVcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU4RkVEXHU4RkVCXHU4RkU0XHU4RkU4IisKLSAgICAgICAgIlx1OTBDQVx1OTBDRVx1OTBDMVx1OTBDM1x1OTE0Qlx1OTE0QVx1OTFDRFx1OTU4MiIrCi0gICAgICAgICJcdTk2NTBcdTk2NEJcdTk2NENcdTk2NERcdTk3NjJcdTk3NjlcdTk3Q0JcdTk3RUQiKwotICAgICAgICAiXHU5N0YzXHU5ODAxXHU5OEE4XHU5OERCXHU5OERGXHU5OTk2XHU5OTk5XHU0RTU4IisKLSAgICAgICAgIlx1NEVCM1x1NTAwQ1x1NTAwRFx1NTAyM1x1NEZFRlx1NTAyNlx1NTAyNVx1NEZGOCIrCi0gICAgICAgICJcdTUwMjlcdTUwMTZcdTUwMDZcdTUwM0NcdTUwMUZcdTUwMUFcdTUwMTJcdTUwMTEiKwotICAgICAgICAiXHU0RkZBXHU1MDAwXHU1MDE0XHU1MDI4XHU0RkYxXHU1MDIxXHU1MDBCXHU1MDE5IisKLSAgICAgICAgIlx1NTAxOFx1NEZGM1x1NEZFRVx1NTAyRFx1NTAyQVx1NEZGRVx1NTAyQlx1NTAwOSIrCi0gICAgICAgICJcdTUxN0NcdTUxQTRcdTUxQTVcdTUxQTJcdTUxQ0RcdTUxQ0NcdTUxQzZcdTUxQ0IiKwotICAgICAgICAiXHU1MjU2XHU1MjVDXHU1MjU0XHU1MjVCXHU1MjVEXHU1MzJBXHU1MzdGXHU1MzlGIisKLSAgICAgICAgIlx1NTM5RFx1NTNERlx1NTRFOFx1NTUxMFx1NTUwMVx1NTUzN1x1NTRGQ1x1NTRFNSIrCi0gICAgICAgICJcdTU0RjJcdTU1MDZcdTU0RkFcdTU1MTRcdTU0RTlcdTU0RURcdTU0RTFcdTU1MDkiKwotICAgICAgICAiXHU1NEVFXHU1NEVBXHU1NEU2XHU1NTI3XHU1NTA3XHU1NEZEXHU1NTBGXHU1NzAzIisKLSAgICAgICAgIlx1NTcwNFx1NTdDMlx1NTdENFx1NTdDQlx1NTdDM1x1NTgwOVx1NTkwRlx1NTk1NyIrCi0gICAgICAgICJcdTU5NThcdTU5NUFcdTVBMTFcdTVBMThcdTVBMUNcdTVBMUZcdTVBMUJcdTVBMTMiKwotICAgICAgICAiXHU1OUVDXHU1QTIwXHU1QTIzXHU1QTI5XHU1QTI1XHU1QTBDXHU1QTA5XHU1QjZCIisKLSAgICAgICAgIlx1NUM1OFx1NUJCMFx1NUJCM1x1NUJCNlx1NUJCNFx1NUJBRVx1NUJCNVx1NUJCOSIrCi0gICAgICAgICJcdTVCQjhcdTVDMDRcdTVDNTFcdTVDNTVcdTVDNTBcdTVDRURcdTVDRkRcdTVDRkIiKwotICAgICAgICAiXHU1Q0VBXHU1Q0U4XHU1Q0YwXHU1Q0Y2XHU1RDAxXHU1Q0Y0XHU1REVFXHU1RTJEIisKLSAgICAgICAgIlx1NUUyQlx1NUVBQlx1NUVBRFx1NUVBN1x1NUYzMVx1NUY5Mlx1NUY5MVx1NUY5MCIrCi0gICAgICAgICJcdTYwNTlcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHU2MDYzXHU2MDY1XHU2MDUwXHU2MDU1XHU2MDZEIisKLSAgICAgICAgIlx1NjA2OVx1NjA2Rlx1NjA4NFx1NjA5Rlx1NjA5QVx1NjA4RFx1NjA5NFx1NjA4QyIrCi0gICAgICAgICJcdTYwODVcdTYwOTZcdTYyNDdcdTYyRjNcdTYzMDhcdTYyRkZcdTYzNEVcdTYzM0UiKwotICAgICAgICAiXHU2MzJGXHU2MzU1XHU2MzQyXHU2MzQ2XHU2MzRGXHU2MzQ5XHU2MzNBXHU2MzUwIisKLSAgICAgICAgIlx1NjMzRFx1NjMyQVx1NjMyQlx1NjMyOFx1NjM0RFx1NjM0Q1x1NjU0OFx1NjU0OSIrCi0gICAgICAgICJcdTY1OTlcdTY1QzFcdTY1QzVcdTY2NDJcdTY2NDlcdTY2NEZcdTY2NDNcdTY2NTIiKwotICAgICAgICAiXHU2NjRDXHU2NjQ1XHU2NjQxXHU2NkY4XHU2NzE0XHU2NzE1XHU2NzE3XHU2ODIxIisKLSAgICAgICAgIlx1NjgzOFx1Njg0OFx1Njg0Nlx1Njg1M1x1NjgzOVx1Njg0Mlx1Njg1NFx1NjgyOSIrCi0gICAgICAgICJcdTY4QjNcdTY4MTdcdTY4NENcdTY4NTFcdTY4M0RcdTY3RjRcdTY4NTBcdTY4NDAiKwotICAgICAgICAiXHU2ODNDXHU2ODQzXHU2ODJBXHU2ODQ1XHU2ODEzXHU2ODE4XHU2ODQxXHU2QjhBIisKLSAgICAgICAgIlx1NkI4OVx1NkJCN1x1NkMyM1x1NkMyN1x1NkMyOFx1NkMyNlx1NkMyNFx1NkNGMCIrCi0gICAgICAgICJcdTZENkFcdTZEOTVcdTZEODhcdTZEODdcdTZENjZcdTZENzhcdTZENzdcdTZENTkiKwotICAgICAgICAiXHU2RDkzXHU2RDZDXHU2RDg5XHU2RDZFXHU2RDVBXHU2RDc0XHU2RDY5XHU2RDhDIisKLSAgICAgICAgIlx1NkQ4QVx1NkQ3OVx1NkQ4NVx1NkQ2NVx1NkQ5NFx1NzBDQVx1NzBEOFx1NzBFNCIrCi0gICAgICAgICJcdTcwRDlcdTcwQzhcdTcwQ0ZcdTcyMzlcdTcyNzlcdTcyRkNcdTcyRjlcdTcyRkQiKwotICAgICAgICAiXHU3MkY4XHU3MkY3XHU3Mzg2XHU3M0VEXHU3NDA5XHU3M0VFXHU3M0UwXHU3M0VBIisKLSAgICAgICAgIlx1NzNERVx1NzU1NFx1NzU1RFx1NzU1Q1x1NzU1QVx1NzU1OVx1NzVCRVx1NzVDNSIrCi0gICAgICAgICJcdTc1QzdcdTc1QjJcdTc1QjNcdTc1QkRcdTc1QkNcdTc1QjlcdTc1QzJcdTc1QjgiKwotICAgICAgICAiXHU3NjhCXHU3NkIwXHU3NkNBXHU3NkNEXHU3NkNFXHU3NzI5XHU3NzFGXHU3NzIwIisKLSAgICAgICAgIlx1NzcyOFx1NzdFOVx1NzgzMFx1NzgyN1x1NzgzOFx1NzgxRFx1NzgzNFx1NzgzNyIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHU3ODI1XHU3ODJEXHU3ODIwXHU3ODFGXHU3ODMyXHU3OTU1IisKLSAgICAgICAgIlx1Nzk1MFx1Nzk2MFx1Nzk1Rlx1Nzk1Nlx1Nzk1RVx1Nzk1RFx1Nzk1N1x1Nzk1QSIrCi0gICAgICAgICJcdTc5RTRcdTc5RTNcdTc5RTdcdTc5REZcdTc5RTZcdTc5RTlcdTc5RDhcdTdBODQiKwotICAgICAgICAiXHU3QTg4XHU3QUQ5XHU3QjA2XHU3QjExXHU3Qzg5XHU3RDIxXHU3RDE3XHU3RDBCIisKLSAgICAgICAgIlx1N0QwQVx1N0QyMFx1N0QyMlx1N0QxNFx1N0QxMFx1N0QxNVx1N0QxQVx1N0QxQyIrCi0gICAgICAgICJcdTdEMERcdTdEMTlcdTdEMUJcdTdGM0FcdTdGNUZcdTdGOTRcdTdGQzVcdTdGQzEiKwotICAgICAgICAiXHU4MDA2XHU4MDE4XHU4MDE1XHU4MDE5XHU4MDE3XHU4MDNEXHU4MDNGXHU4MEYxIisKLSAgICAgICAgIlx1ODEwMlx1ODBGMFx1ODEwNVx1ODBFRFx1ODBGNFx1ODEwNlx1ODBGOFx1ODBGMyIrCi0gICAgICAgICJcdTgxMDhcdTgwRkRcdTgxMEFcdTgwRkNcdTgwRUZcdTgxRURcdTgxRUNcdTgyMDAiKwotICAgICAgICAiXHU4MjEwXHU4MjJBXHU4MjJCXHU4MjI4XHU4MjJDXHU4MkJCXHU4MzJCXHU4MzUyIisKLSAgICAgICAgIlx1ODM1NFx1ODM0QVx1ODMzOFx1ODM1MFx1ODM0OVx1ODMzNVx1ODMzNFx1ODM0RiIrCi0gICAgICAgICJcdTgzMzJcdTgzMzlcdTgzMzZcdTgzMTdcdTgzNDBcdTgzMzFcdTgzMjhcdTgzNDMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGlubmVySW5kZXgxPQotICAgICAgICAiXHU4NjU0XHU4NjhBXHU4NkFBXHU4NjkzXHU4NkE0XHU4NkE5XHU4NjhDXHU4NkEzIisKLSAgICAgICAgIlx1ODY5Q1x1ODg3MFx1ODg3N1x1ODg4MVx1ODg4Mlx1ODg3RFx1ODg3OVx1OEExOCIrCi0gICAgICAgICJcdThBMTBcdThBMEVcdThBMENcdThBMTVcdThBMEFcdThBMTdcdThBMTNcdThBMTYiKwotICAgICAgICAiXHU4QTBGXHU4QTExXHU4QzQ4XHU4QzdBXHU4Qzc5XHU4Q0ExXHU4Q0EyXHU4RDc3IisKLSAgICAgICAgIlx1OEVBQ1x1OEVEMlx1OEVENFx1OEVDRlx1OEZCMVx1OTAwMVx1OTAwNlx1OEZGNyIrCi0gICAgICAgICJcdTkwMDBcdThGRkFcdThGRjRcdTkwMDNcdThGRkRcdTkwMDVcdThGRjhcdTkwOTUiKwotICAgICAgICAiXHU5MEUxXHU5MEREXHU5MEUyXHU5MTUyXHU5MTREXHU5MTRDXHU5MUQ4XHU5MUREIisKLSAgICAgICAgIlx1OTFEN1x1OTFEQ1x1OTFEOVx1OTU4M1x1OTY2Mlx1OTY2M1x1OTY2MVx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHU5NjVCXHU5NjVEXHU5NjY0XHU5NjU4XHU5NjVFXHU5NkJCXHU5OEUyIisKLSAgICAgICAgIlx1OTlBQ1x1OUFBOFx1OUFEOFx1OUIyNVx1OUIzMlx1OUIzQ1x1NEU3RVx1NTA3QSIrCi0gICAgICAgICJcdTUwN0RcdTUwNUNcdTUwNDdcdTUwNDNcdTUwNENcdTUwNUFcdTUwNDlcdTUwNjUiKwotICAgICAgICAiXHU1MDc2XHU1MDRFXHU1MDU1XHU1MDc1XHU1MDc0XHU1MDc3XHU1MDRGXHU1MDBGIisKLSAgICAgICAgIlx1NTA2Rlx1NTA2RFx1NTE1Q1x1NTE5NVx1NTFGMFx1NTI2QVx1NTI2Rlx1NTJEMiIrCi0gICAgICAgICJcdTUyRDlcdTUyRDhcdTUyRDVcdTUzMTBcdTUzMEZcdTUzMTlcdTUzM0ZcdTUzNDAiKwotICAgICAgICAiXHU1MzNFXHU1M0MzXHU2NkZDXHU1NTQ2XHU1NTZBXHU1NTY2XHU1NTQ0XHU1NTVFIisKLSAgICAgICAgIlx1NTU2MVx1NTU0M1x1NTU0QVx1NTUzMVx1NTU1Nlx1NTU0Rlx1NTU1NVx1NTUyRiIrCi0gICAgICAgICJcdTU1NjRcdTU1MzhcdTU1MkVcdTU1NUNcdTU1MkNcdTU1NjNcdTU1MzNcdTU1NDEiKwotICAgICAgICAiXHU1NTU3XHU1NzA4XHU1NzBCXHU1NzA5XHU1N0RGXHU1ODA1XHU1ODBBXHU1ODA2IisKLSAgICAgICAgIlx1NTdFMFx1NTdFNFx1NTdGQVx1NTgwMlx1NTgzNVx1NTdGN1x1NTdGOVx1NTkyMCIrCi0gICAgICAgICJcdTU5NjJcdTVBMzZcdTVBNDFcdTVBNDlcdTVBNjZcdTVBNkFcdTVBNDBcdTVBM0MiKwotICAgICAgICAiXHU1QTYyXHU1QTVBXHU1QTQ2XHU1QTRBXHU1QjcwXHU1QkM3XHU1QkM1XHU1QkM0IisKLSAgICAgICAgIlx1NUJDMlx1NUJCRlx1NUJDNlx1NUMwOVx1NUMwOFx1NUMwN1x1NUM2MFx1NUM1QyIrCi0gICAgICAgICJcdTVDNURcdTVEMDdcdTVEMDZcdTVEMEVcdTVEMUJcdTVEMTZcdTVEMjJcdTVEMTEiKwotICAgICAgICAiXHU1RDI5XHU1RDE0XHU1RDE5XHU1RDI0XHU1RDI3XHU1RDE3XHU1REUyXHU1RTM4IisKLSAgICAgICAgIlx1NUUzNlx1NUUzM1x1NUUzN1x1NUVCN1x1NUVCOFx1NUVCNlx1NUVCNVx1NUVCRSIrCi0gICAgICAgICJcdTVGMzVcdTVGMzdcdTVGNTdcdTVGNkNcdTVGNjlcdTVGNkJcdTVGOTdcdTVGOTkiKwotICAgICAgICAiXHU1RjlFXHU1Rjk4XHU1RkExXHU1RkEwXHU1RjlDXHU2MDdGXHU2MEEzXHU2MDg5IisKLSAgICAgICAgIlx1NjBBMFx1NjBBOFx1NjBDQlx1NjBCNFx1NjBFNlx1NjBCRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHU2MEM1XHU2MEJCXHU2MEI1XHU2MERDXHU2MEJDXHU2MEQ4XHU2MEQ1XHU2MEM2IisKLSAgICAgICAgIlx1NjBERlx1NjBCOFx1NjBEQVx1NjBDN1x1NjIxQVx1NjIxQlx1NjI0OFx1NjNBMCIrCi0gICAgICAgICJcdTYzQTdcdTYzNzJcdTYzOTZcdTYzQTJcdTYzQTVcdTYzNzdcdTYzNjdcdTYzOTgiKwotICAgICAgICAiXHU2M0FBXHU2MzcxXHU2M0E5XHU2Mzg5XHU2MzgzXHU2MzlCXHU2MzZCXHU2M0E4IisKLSAgICAgICAgIlx1NjM4NFx1NjM4OFx1NjM5OVx1NjNBMVx1NjNBQ1x1NjM5Mlx1NjM4Rlx1NjM4MCIrCi0gICAgICAgICJcdTYzN0JcdTYzNjlcdTYzNjhcdTYzN0FcdTY1NURcdTY1NTZcdTY1NTFcdTY1NTkiKwotICAgICAgICAiXHU2NTU3XHU1NTVGXHU2NTRGXHU2NTU4XHU2NTU1XHU2NTU0XHU2NTlDXHU2NTlCIisKLSAgICAgICAgIlx1NjVBQ1x1NjVDRlx1NjVDQlx1NjVDQ1x1NjVDRVx1NjY1RFx1NjY1QVx1NjY2NCIrCi0gICAgICAgICJcdTY2NjhcdTY2NjZcdTY2NUVcdTY2RjlcdTUyRDdcdTY3MUJcdTY4ODFcdTY4QUYiKwotICAgICAgICAiXHU2OEEyXHU2ODkzXHU2OEI1XHU2ODdGXHU2ODc2XHU2OEIxXHU2OEE3XHU2ODk3IisKLSAgICAgICAgIlx1NjhCMFx1Njg4M1x1NjhDNFx1NjhBRFx1Njg4Nlx1Njg4NVx1Njg5NFx1Njg5RCIrCi0gICAgICAgICJcdTY4QThcdTY4OUZcdTY4QTFcdTY4ODJcdTZCMzJcdTZCQkFcdTZCRUJcdTZCRUMiKwotICAgICAgICAiXHU2QzJCXHU2RDhFXHU2REJDXHU2REYzXHU2REQ5XHU2REIyXHU2REUxXHU2RENDIisKLSAgICAgICAgIlx1NkRFNFx1NkRGQlx1NkRGQVx1NkUwNVx1NkRDN1x1NkRDQlx1NkRBRlx1NkREMSIrCi0gICAgICAgICJcdTZEQUVcdTZEREVcdTZERjlcdTZEQjhcdTZERjdcdTZERjVcdTZEQzVcdTZERDIiKwotICAgICAgICAiXHU2RTFBXHU2REI1XHU2RERBXHU2REVCXHU2REQ4XHU2REVBXHU2REYxXHU2REVFIisKLSAgICAgICAgIlx1NkRFOFx1NkRDNlx1NkRDNFx1NkRBQVx1NkRFQ1x1NkRCRlx1NkRFNlx1NzBGOSIrCi0gICAgICAgICJcdTcxMDlcdTcxMEFcdTcwRkRcdTcwRUZcdTcyM0RcdTcyN0RcdTcyODFcdTczMUMiKwotICAgICAgICAiXHU3MzFCXHU3MzE2XHU3MzEzXHU3MzE5XHU3Mzg3XHU3NDA1XHU3NDBBXHU3NDAzIisKLSAgICAgICAgIlx1NzQwNlx1NzNGRVx1NzQwRFx1NzRFMFx1NzRGNlx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTc0RjciKwotICAgICAgICAiXHU3NTFDXHU3NTIyXHU3NTY1XHU3NTY2XHU3NTYyXHU3NTcwXHU3NThGXHU3NUQ0IisKLSAgICAgICAgIlx1NzVENVx1NzVCNVx1NzVDQVx1NzVDRFx1NzY4RVx1NzZENFx1NzZEMlx1NzZEQiIrCi0gICAgICAgICJcdTc3MzdcdTc3M0VcdTc3M0NcdTc3MzZcdTc3MzhcdTc3M0FcdTc4NkJcdTc4NDMiKwotICAgICAgICAiXHU3ODRFXHU3OTY1XHU3OTY4XHU3OTZEXHU3OUZCXHU3QTkyXHU3QTk1XHU3QjIwIisKLSAgICAgICAgIlx1N0IyOFx1N0IxQlx1N0IyQ1x1N0IyNlx1N0IxOVx1N0IxRVx1N0IyRVx1N0M5MiIrCi0gICAgICAgICJcdTdDOTdcdTdDOTVcdTdENDZcdTdENDNcdTdENzFcdTdEMkVcdTdEMzlcdTdEM0MiKwotICAgICAgICAiXHU3RDQwXHU3RDMwXHU3RDMzXHU3RDQ0XHU3RDJGXHU3RDQyXHU3RDMyXHU3RDMxIisKLSAgICAgICAgIlx1N0YzRFx1N0Y5RVx1N0Y5QVx1N0ZDQ1x1N0ZDRVx1N0ZEMlx1ODAxQ1x1ODA0QSIrCi0gICAgICAgICJcdTgwNDZcdTgxMkZcdTgxMTZcdTgxMjNcdTgxMkJcdTgxMjlcdTgxMzBcdTgxMjQiKwotICAgICAgICAiXHU4MjAyXHU4MjM1XHU4MjM3XHU4MjM2XHU4MjM5XHU4MzhFXHU4MzlFXHU4Mzk4IisKLSAgICAgICAgIlx1ODM3OFx1ODNBMlx1ODM5Nlx1ODNCRFx1ODNBQlx1ODM5Mlx1ODM4QVx1ODM5MyIrCi0gICAgICAgICJcdTgzODlcdTgzQTBcdTgzNzdcdTgzN0JcdTgzN0NcdTgzODZcdTgzQTdcdTg2NTUiKwotICAgICAgICAiXHU1RjZBXHU4NkM3XHU4NkMwXHU4NkI2XHU4NkM0XHU4NkI1XHU4NkM2XHU4NkNCIisKLSAgICAgICAgIlx1ODZCMVx1ODZBRlx1ODZDOVx1ODg1M1x1ODg5RVx1ODg4OFx1ODhBQlx1ODg5MiIrCi0gICAgICAgICJcdTg4OTZcdTg4OERcdTg4OEJcdTg5OTNcdTg5OEZcdThBMkFcdThBMURcdThBMjMiKwotICAgICAgICAiXHU4QTI1XHU4QTMxXHU4QTJEXHU4QTFGXHU4QTFCXHU4QTIyXHU4QzQ5XHU4QzVBIisKLSAgICAgICAgIlx1OENBOVx1OENBQ1x1OENBQlx1OENBOFx1OENBQVx1OENBN1x1OEQ2N1x1OEQ2NiIrCi0gICAgICAgICJcdThEQkVcdThEQkFcdThFREJcdThFREZcdTkwMTlcdTkwMERcdTkwMUFcdTkwMTciKwotICAgICAgICAiXHU5MDIzXHU5MDFGXHU5MDFEXHU5MDEwXHU5MDE1XHU5MDFFXHU5MDIwXHU5MDBGIisKLSAgICAgICAgIlx1OTAyMlx1OTAxNlx1OTAxQlx1OTAxNFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTkwRThcdTkwRUQiKwotICAgICAgICAiXHU5MEZEXHU5MTU3XHU5MUNFXHU5MUY1XHU5MUU2XHU5MUUzXHU5MUU3XHU5MUVEIisKLSAgICAgICAgIlx1OTFFOVx1OTU4OVx1OTY2QVx1OTY3NVx1OTY3M1x1OTY3OFx1OTY3MFx1OTY3NCIrCi0gICAgICAgICJcdTk2NzZcdTk2NzdcdTk2NkNcdTk2QzBcdTk2RUFcdTk2RTlcdTdBRTBcdTdBREYiKwotICAgICAgICAiXHU5ODAyXHU5ODAzXHU5QjVBXHU5Q0U1XHU5RTc1XHU5RTdGXHU5RUE1XHU5RUJCIisKLSAgICAgICAgIlx1NTBBMlx1NTA4RFx1NTA4NVx1NTA5OVx1NTA5MVx1NTA4MFx1NTA5Nlx1NTA5OCIrCi0gICAgICAgICJcdTUwOUFcdTY3MDBcdTUxRjFcdTUyNzJcdTUyNzRcdTUyNzVcdTUyNjlcdTUyREUiKwotICAgICAgICAiXHU1MkREXHU1MkRCXHU1MzVBXHU1M0E1XHU1NTdCXHU1NTgwXHU1NUE3XHU1NTdDIisKLSAgICAgICAgIlx1NTU4QVx1NTU5RFx1NTU5OFx1NTU4Mlx1NTU5Q1x1NTVBQVx1NTU5NFx1NTU4NyIrCi0gICAgICAgICJcdTU1OEJcdTU1ODNcdTU1QjNcdTU1QUVcdTU1OUZcdTU1M0VcdTU1QjJcdTU1OUEiKwotICAgICAgICAiXHU1NUJCXHU1NUFDXHU1NUIxXHU1NTdFXHU1NTg5XHU1NUFCXHU1NTk5XHU1NzBEIisKLSAgICAgICAgIlx1NTgyRlx1NTgyQVx1NTgzNFx1NTgyNFx1NTgzMFx1NTgzMVx1NTgyMVx1NTgxRCIrCi0gICAgICAgICJcdTU4MjBcdTU4RjlcdTU4RkFcdTU5NjBcdTVBNzdcdTVBOUFcdTVBN0ZcdTVBOTIiKwotICAgICAgICAiXHU1QTlCXHU1QUE3XHU1QjczXHU1QjcxXHU1QkQyXHU1QkNDXHU1QkQzXHU1QkQwIisKLSAgICAgICAgIlx1NUMwQVx1NUMwQlx1NUMzMVx1NUQ0Q1x1NUQ1MFx1NUQzNFx1NUQ0N1x1NURGRCIrCi0gICAgICAgICJcdTVFNDVcdTVFM0RcdTVFNDBcdTVFNDNcdTVFN0VcdTVFQ0FcdTVFQzFcdTVFQzIiKwotICAgICAgICAiXHU1RUM0XHU1RjNDXHU1RjZEXHU1RkE5XHU1RkFBXHU1RkE4XHU2MEQxXHU2MEUxIisKLSAgICAgICAgIlx1NjBCMlx1NjBCNlx1NjBFMFx1NjExQ1x1NjEyM1x1NjBGQVx1NjExNVx1NjBGMCIrCi0gICAgICAgICJcdTYwRkJcdTYwRjRcdTYxNjhcdTYwRjFcdTYxMEVcdTYwRjZcdTYxMDlcdTYxMDAiKwotICAgICAgICAiXHU2MTEyXHU2MjFGXHU2MjQ5XHU2M0EzXHU2MzhDXHU2M0NGXHU2M0MwXHU2M0U5IisKLSAgICAgICAgIlx1NjNDOVx1NjNDNlx1NjNDRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTYzRDJcdTYzRTNcdTYzRDAiKwotICAgICAgICAiXHU2M0UxXHU2M0Q2XHU2M0VEXHU2M0VFXHU2Mzc2XHU2M0Y0XHU2M0VBXHU2M0RCIisKLSAgICAgICAgIlx1NjQ1Mlx1NjNEQVx1NjNGOVx1NjU1RVx1NjU2Nlx1NjU2Mlx1NjU2M1x1NjU5MSIrCi0gICAgICAgICJcdTY1OTBcdTY1QUZcdTY2NkVcdTY2NzBcdTY2NzRcdTY2NzZcdTY2NkZcdTY2OTEiKwotICAgICAgICAiXHU2NjdBXHU2NjdFXHU2Njc3XHU2NkZFXHU2NkZGXHU2NzFGXHU2NzFEXHU2OEZBIisKLSAgICAgICAgIlx1NjhENVx1NjhFMFx1NjhEOFx1NjhEN1x1NjkwNVx1NjhERlx1NjhGNVx1NjhFRSIrCi0gICAgICAgICJcdTY4RTdcdTY4RjlcdTY4RDJcdTY4RjJcdTY4RTNcdTY4Q0JcdTY4Q0RcdTY5MEQiKwotICAgICAgICAiXHU2OTEyXHU2OTBFXHU2OEM5XHU2OERBXHU2OTZFXHU2OEZCXHU2QjNFXHU2QjNBIisKLSAgICAgICAgIlx1NkIzRFx1NkI5OFx1NkI5Nlx1NkJCQ1x1NkJFRlx1NkMyRVx1NkMyRlx1NkMyQyIrCi0gICAgICAgICJcdTZFMkZcdTZFMzhcdTZFNTRcdTZFMjFcdTZFMzJcdTZFNjdcdTZFNEFcdTZFMjAiKwotICAgICAgICAiXHU2RTI1XHU2RTIzXHU2RTFCXHU2RTVCXHU2RTU4XHU2RTI0XHU2RTU2XHU2RTZFIisKLSAgICAgICAgIlx1NkUyRFx1NkUyNlx1NkU2Rlx1NkUzNFx1NkU0RFx1NkUzQVx1NkUyQ1x1NkU0MyIrCi0gICAgICAgICJcdTZFMURcdTZFM0VcdTZFQ0JcdTZFODlcdTZFMTlcdTZFNEVcdTZFNjNcdTZFNDQiKwotICAgICAgICAiXHU2RTcyXHU2RTY5XHU2RTVGXHU3MTE5XHU3MTFBXHU3MTI2XHU3MTMwXHU3MTIxIisKLSAgICAgICAgIlx1NzEzNlx1NzE2RVx1NzExQ1x1NzI0Q1x1NzI4NFx1NzI4MFx1NzMzNlx1NzMyNSIrCi0gICAgICAgICJcdTczMzRcdTczMjlcdTc0M0FcdTc0MkFcdTc0MzNcdTc0MjJcdTc0MjVcdTc0MzUiKwotICAgICAgICAiXHU3NDM2XHU3NDM0XHU3NDJGXHU3NDFCXHU3NDI2XHU3NDI4XHU3NTI1XHU3NTI2IisKLSAgICAgICAgIlx1NzU2Qlx1NzU2QVx1NzVFMlx1NzVEQlx1NzVFM1x1NzVEOVx1NzVEOFx1NzVERSIrCi0gICAgICAgICJcdTc1RTBcdTc2N0JcdTc2N0NcdTc2OTZcdTc2OTNcdTc2QjRcdTc2RENcdTc3NEYiKwotICAgICAgICAiXHU3N0VEXHU3ODVEXHU3ODZDXHU3ODZGXHU3QTBEXHU3QTA4XHU3QTBCXHU3QTA1IisKLSAgICAgICAgIlx1N0EwMFx1N0E5OFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTdBOTdcdTdBOTZcdTdBRTVcdTdBRTMiKwotICAgICAgICAiXHU3QjQ5XHU3QjU2XHU3QjQ2XHU3QjUwXHU3QjUyXHU3QjU0XHU3QjREXHU3QjRCIisKLSAgICAgICAgIlx1N0I0Rlx1N0I1MVx1N0M5Rlx1N0NBNVx1N0Q1RVx1N0Q1MFx1N0Q2OFx1N0Q1NSIrCi0gICAgICAgICJcdTdEMkJcdTdENkVcdTdENzJcdTdENjFcdTdENjZcdTdENjJcdTdENzBcdTdENzMiKwotICAgICAgICAiXHU1NTg0XHU3RkQ0XHU3RkQ1XHU4MDBCXHU4MDUyXHU4MDg1XHU4MTU1XHU4MTU0IisKLSAgICAgICAgIlx1ODE0Qlx1ODE1MVx1ODE0RVx1ODEzOVx1ODE0Nlx1ODEzRVx1ODE0Q1x1ODE1MyIrCi0gICAgICAgICJcdTgxNzRcdTgyMTJcdTgyMUNcdTgzRTlcdTg0MDNcdTgzRjhcdTg0MERcdTgzRTAiKwotICAgICAgICAiXHU4M0M1XHU4NDBCXHU4M0MxXHU4M0VGXHU4M0YxXHU4M0Y0XHU4NDU3XHU4NDBBIisKLSAgICAgICAgIlx1ODNGMFx1ODQwQ1x1ODNDQ1x1ODNGRFx1ODNGMlx1ODNDQVx1ODQzOFx1ODQwRSIrCi0gICAgICAgICJcdTg0MDRcdTgzRENcdTg0MDdcdTgzRDRcdTgzREZcdTg2NUJcdTg2REZcdTg2RDkiKwotICAgICAgICAiXHU4NkVEXHU4NkQ0XHU4NkRCXHU4NkU0XHU4NkQwXHU4NkRFXHU4ODU3XHU4OEMxIisKLSAgICAgICAgIlx1ODhDMlx1ODhCMVx1ODk4M1x1ODk5Nlx1OEEzQlx1OEE2MFx1OEE1NVx1OEE1RSIrCi0gICAgICAgICJcdThBM0NcdThBNDFcdThBNTRcdThBNUJcdThBNTBcdThBNDZcdThBMzRcdThBM0EiKwotICAgICAgICAiXHU4QTM2XHU4QTU2XHU4QzYxXHU4QzgyXHU4Q0FGXHU4Q0JDXHU4Q0IzXHU4Q0JEIisKLSAgICAgICAgIlx1OENDMVx1OENCQlx1OENDMFx1OENCNFx1OENCN1x1OENCNlx1OENCRlx1OENCOCIrCi0gICAgICAgICJcdThEOEFcdThEODVcdThEODFcdThEQ0VcdThERERcdThEQ0JcdThEREFcdThERDEiKwotICAgICAgICAiXHU4RENDXHU4RERCXHU4REM2XHU4RUZCXHU4RUY4XHU4RUZDXHU4RjlDXHU5MDJFIisKLSAgICAgICAgIlx1OTAzNVx1OTAzMVx1OTAzOFx1OTAzMlx1OTAzNlx1OTEwMlx1OTBGNVx1OTEwOSIrCi0gICAgICAgICJcdTkwRkVcdTkxNjNcdTkxNjVcdTkxQ0ZcdTkyMTRcdTkyMTVcdTkyMjNcdTkyMDkiKwotICAgICAgICAiXHU5MjFFXHU5MjBEXHU5MjEwXHU5MjA3XHU5MjExXHU5NTk0XHU5NThGXHU5NThCIisKLSAgICAgICAgIlx1OTU5MVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdTk1OTNcdTk1OTJcdTk1OEVcdTk2OEFcdTk2OEUiKwotICAgICAgICAiXHU5NjhCXHU5NjdEXHU5Njg1XHU5Njg2XHU5NjhEXHU5NjcyXHU5Njg0XHU5NkMxIisKLSAgICAgICAgIlx1OTZDNVx1OTZDNFx1OTZDNlx1OTZDN1x1OTZFRlx1OTZGMlx1OTdDQ1x1OTgwNSIrCi0gICAgICAgICJcdTk4MDZcdTk4MDhcdTk4RTdcdTk4RUFcdTk4RUZcdTk4RTlcdTk4RjJcdTk4RUQiKwotICAgICAgICAiXHU5OUFFXHU5OUFEXHU5RUMzXHU5RUNEXHU5RUQxXHU0RTgyXHU1MEFEXHU1MEI1IisKLSAgICAgICAgIlx1NTBCMlx1NTBCM1x1NTBDNVx1NTBCRVx1NTBBQ1x1NTBCN1x1NTBCQlx1NTBBRiIrCi0gICAgICAgICJcdTUwQzdcdTUyN0ZcdTUyNzdcdTUyN0RcdTUyREZcdTUyRTZcdTUyRTRcdTUyRTIiKwotICAgICAgICAiXHU1MkUzXHU1MzJGXHU1NURGXHU1NUU4XHU1NUQzXHU1NUU2XHU1NUNFXHU1NURDIisKLSAgICAgICAgIlx1NTVDN1x1NTVEMVx1NTVFM1x1NTVFNFx1NTVFRlx1NTVEQVx1NTVFMVx1NTVDNSIrCi0gICAgICAgICJcdTU1QzZcdTU1RTVcdTU1QzlcdTU3MTJcdTU3MTNcdTU4NUVcdTU4NTFcdTU4NTgiKwotICAgICAgICAiXHU1ODU3XHU1ODVBXHU1ODU0XHU1ODZCXHU1ODRDXHU1ODZEXHU1ODRBXHU1ODYyIisKLSAgICAgICAgIlx1NTg1Mlx1NTg0Qlx1NTk2N1x1NUFDMVx1NUFDOVx1NUFDQ1x1NUFCRVx1NUFCRCIrCi0gICAgICAgICJcdTVBQkNcdTVBQjNcdTVBQzJcdTVBQjJcdTVENjlcdTVENkZcdTVFNENcdTVFNzkiKwotICAgICAgICAiXHU1RUM5XHU1RUM4XHU1RjEyXHU1RjU5XHU1RkFDXHU1RkFFXHU2MTFBXHU2MTBGIisKLSAgICAgICAgIlx1NjE0OFx1NjExRlx1NjBGM1x1NjExQlx1NjBGOVx1NjEwMVx1NjEwOFx1NjE0RSIrCi0gICAgICAgICJcdTYxNENcdTYxNDRcdTYxNERcdTYxM0VcdTYxMzRcdTYxMjdcdTYxMERcdTYxMDYiKwotICAgICAgICAiXHU2MTM3XHU2MjIxXHU2MjIyXHU2NDEzXHU2NDNFXHU2NDFFXHU2NDJBXHU2NDJEIisKLSAgICAgICAgIlx1NjQzRFx1NjQyQ1x1NjQwRlx1NjQxQ1x1NjQxNFx1NjQwRFx1NjQzNlx1NjQxNiIrCi0gICAgICAgICJcdTY0MTdcdTY0MDZcdTY1NkNcdTY1OUZcdTY1QjBcdTY2OTdcdTY2ODlcdTY2ODciKwotICAgICAgICAiXHU2Njg4XHU2Njk2XHU2Njg0XHU2Njk4XHU2NjhEXHU2NzAzXHU2OTk0XHU2OTZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdTY5NUFcdTY5NzdcdTY5NjBcdTY5NTRcdTY5NzVcdTY5MzAiKwotICAgICAgICAiXHU2OTgyXHU2OTRBXHU2OTY4XHU2OTZCXHU2OTVFXHU2OTUzXHU2OTc5XHU2OTg2IisKLSAgICAgICAgIlx1Njk1RFx1Njk2M1x1Njk1Qlx1NkI0N1x1NkI3Mlx1NkJDMFx1NkJCRlx1NkJEMyIrCi0gICAgICAgICJcdTZCRkRcdTZFQTJcdTZFQUZcdTZFRDNcdTZFQjZcdTZFQzJcdTZFOTBcdTZFOUQiKwotICAgICAgICAiXHU2RUM3XHU2RUM1XHU2RUE1XHU2RTk4XHU2RUJDXHU2RUJBXHU2RUFCXHU2RUQxIisKLSAgICAgICAgIlx1NkU5Nlx1NkU5Q1x1NkVDNFx1NkVENFx1NkVBQVx1NkVBN1x1NkVCNFx1NzE0RSIrCi0gICAgICAgICJcdTcxNTlcdTcxNjlcdTcxNjRcdTcxNDlcdTcxNjdcdTcxNUNcdTcxNkNcdTcxNjYiKwotICAgICAgICAiXHU3MTRDXHU3MTY1XHU3MTVFXHU3MTQ2XHU3MTY4XHU3MTU2XHU3MjNBXHU3MjUyIisKLSAgICAgICAgIlx1NzMzN1x1NzM0NVx1NzMzRlx1NzMzRVx1NzQ2Rlx1NzQ1QVx1NzQ1NVx1NzQ1RiIrCi0gICAgICAgICJcdTc0NUVcdTc0NDFcdTc0M0ZcdTc0NTlcdTc0NUJcdTc0NUNcdTc1NzZcdTc1NzgiKwotICAgICAgICAiXHU3NjAwXHU3NUYwXHU3NjAxXHU3NUYyXHU3NUYxXHU3NUZBXHU3NUZGXHU3NUY0IisKLSAgICAgICAgIlx1NzVGM1x1NzZERVx1NzZERlx1Nzc1Qlx1Nzc2Qlx1Nzc2Nlx1Nzc1RVx1Nzc2MyIrCi0gICAgICAgICJcdTc3NzlcdTc3NkFcdTc3NkNcdTc3NUNcdTc3NjVcdTc3NjhcdTc3NjJcdTc3RUUiKwotICAgICAgICAiXHU3ODhFXHU3OEIwXHU3ODk3XHU3ODk4XHU3ODhDXHU3ODg5XHU3ODdDXHU3ODkxIisKLSAgICAgICAgIlx1Nzg5M1x1Nzg3Rlx1Nzk3QVx1Nzk3Rlx1Nzk4MVx1ODQyQ1x1NzlCRFx1N0ExQyIrCi0gICAgICAgICJcdTdBMUFcdTdBMjBcdTdBMTRcdTdBMUZcdTdBMUVcdTdBOUZcdTdBQTBcdTdCNzciKwotICAgICAgICAiXHU3QkMwXHU3QjYwXHU3QjZFXHU3QjY3XHU3Q0IxXHU3Q0IzXHU3Q0I1XHU3RDkzIisKLSAgICAgICAgIlx1N0Q3OVx1N0Q5MVx1N0Q4MVx1N0Q4Rlx1N0Q1Qlx1N0Y2RVx1N0Y2OVx1N0Y2QSIrCi0gICAgICAgICJcdTdGNzJcdTdGQTlcdTdGQThcdTdGQTRcdTgwNTZcdTgwNThcdTgwODZcdTgwODQiKwotICAgICAgICAiXHU4MTcxXHU4MTcwXHU4MTc4XHU4MTY1XHU4MTZFXHU4MTczXHU4MTZCXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdTgxNzlcdTgxN0FcdTgxNjZcdTgyMDVcdTgyNDdcdTg0ODJcdTg0NzciKwotICAgICAgICAiXHU4NDNEXHU4NDMxXHU4NDc1XHU4NDY2XHU4NDZCXHU4NDQ5XHU4NDZDXHU4NDVCIisKLSAgICAgICAgIlx1ODQzQ1x1ODQzNVx1ODQ2MVx1ODQ2M1x1ODQ2OVx1ODQ2RFx1ODQ0Nlx1ODY1RSIrCi0gICAgICAgICJcdTg2NUNcdTg2NUZcdTg2RjlcdTg3MTNcdTg3MDhcdTg3MDdcdTg3MDBcdTg2RkUiKwotICAgICAgICAiXHU4NkZCXHU4NzAyXHU4NzAzXHU4NzA2XHU4NzBBXHU4ODU5XHU4OERGXHU4OEQ0IisKLSAgICAgICAgIlx1ODhEOVx1ODhEQ1x1ODhEOFx1ODhERFx1ODhFMVx1ODhDQVx1ODhENVx1ODhEMiIrCi0gICAgICAgICJcdTg5OUNcdTg5RTNcdThBNkJcdThBNzJcdThBNzNcdThBNjZcdThBNjlcdThBNzAiKwotICAgICAgICAiXHU4QTg3XHU4QTdDXHU4QTYzXHU4QUEwXHU4QTcxXHU4QTg1XHU4QTZEXHU4QTYyIisKLSAgICAgICAgIlx1OEE2RVx1OEE2Q1x1OEE3OVx1OEE3Qlx1OEEzRVx1OEE2OFx1OEM2Mlx1OEM4QSIrCi0gICAgICAgICJcdThDODlcdThDQ0FcdThDQzdcdThDQzhcdThDQzRcdThDQjJcdThDQzNcdThDQzIiKwotICAgICAgICAiXHU4Q0M1XHU4REUxXHU4RERGXHU4REU4XHU4REVGXHU4REYzXHU4REZBXHU4REVBIisKLSAgICAgICAgIlx1OERFNFx1OERFNlx1OEVCMlx1OEYwM1x1OEYwOVx1OEVGRVx1OEYwQVx1OEY5RiIrCi0gICAgICAgICJcdThGQjJcdTkwNEJcdTkwNEFcdTkwNTNcdTkwNDJcdTkwNTRcdTkwM0NcdTkwNTUiKwotICAgICAgICAiXHU5MDUwXHU5MDQ3XHU5MDRGXHU5MDRFXHU5MDREXHU5MDUxXHU5MDNFXHU5MDQxIisKLSAgICAgICAgIlx1OTExMlx1OTExN1x1OTE2Q1x1OTE2QVx1OTE2OVx1OTFDOVx1OTIzN1x1OTI1NyIrCi0gICAgICAgICJcdTkyMzhcdTkyM0RcdTkyNDBcdTkyM0VcdTkyNUJcdTkyNEJcdTkyNjRcdTkyNTEiKwotICAgICAgICAiXHU5MjM0XHU5MjQ5XHU5MjREXHU5MjQ1XHU5MjM5XHU5MjNGXHU5MjVBXHU5NTk4IisKLSAgICAgICAgIlx1OTY5OFx1OTY5NFx1OTY5NVx1OTZDRFx1OTZDQlx1OTZDOVx1OTZDQVx1OTZGNyIrCi0gICAgICAgICJcdTk2RkJcdTk2RjlcdTk2RjZcdTk3NTZcdTk3NzRcdTk3NzZcdTk4MTBcdTk4MTEiKwotICAgICAgICAiXHU5ODEzXHU5ODBBXHU5ODEyXHU5ODBDXHU5OEZDXHU5OEY0XHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdTk4RkRcdTk4RkVcdTk5QjNcdTk5QjFcdTk5QjRcdTlBRTFcdTlDRTlcdTlFODIiKwotICAgICAgICAiXHU5RjBFXHU5RjEzXHU5RjIwXHU1MEU3XHU1MEVFXHU1MEU1XHU1MEQ2XHU1MEVEIisKLSAgICAgICAgIlx1NTBEQVx1NTBENVx1NTBDRlx1NTBEMVx1NTBGMVx1NTBDRVx1NTBFOVx1NTE2MiIrCi0gICAgICAgICJcdTUxRjNcdTUyODNcdTUyODJcdTUzMzFcdTUzQURcdTU1RkVcdTU2MDBcdTU2MUIiKwotICAgICAgICAiXHU1NjE3XHU1NUZEXHU1NjE0XHU1NjA2XHU1NjA5XHU1NjBEXHU1NjBFXHU1NUY3IisKLSAgICAgICAgIlx1NTYxNlx1NTYxRlx1NTYwOFx1NTYxMFx1NTVGNlx1NTcxOFx1NTcxNlx1NTg3NSIrCi0gICAgICAgICJcdTU4N0VcdTU4ODNcdTU4OTNcdTU4OEFcdTU4NzlcdTU4ODVcdTU4N0RcdTU4RkQiKwotICAgICAgICAiXHU1OTI1XHU1OTIyXHU1OTI0XHU1OTZBXHU1OTY5XHU1QUUxXHU1QUU2XHU1QUU5IisKLSAgICAgICAgIlx1NUFEN1x1NUFENlx1NUFEOFx1NUFFM1x1NUI3NVx1NUJERVx1NUJFN1x1NUJFMSIrCi0gICAgICAgICJcdTVCRTVcdTVCRTZcdTVCRThcdTVCRTJcdTVCRTRcdTVCREZcdTVDMERcdTVDNjIiKwotICAgICAgICAiXHU1RDg0XHU1RDg3XHU1RTVCXHU1RTYzXHU1RTU1XHU1RTU3XHU1RTU0XHU1RUQzIisKLSAgICAgICAgIlx1NUVENlx1NUYwQVx1NUY0Nlx1NUY3MFx1NUZCOVx1NjE0N1x1NjEzRlx1NjE0QiIrCi0gICAgICAgICJcdTYxNzdcdTYxNjJcdTYxNjNcdTYxNUZcdTYxNUFcdTYxNThcdTYxNzVcdTYyMkEiKwotICAgICAgICAiXHU2NDg3XHU2NDU4XHU2NDU0XHU2NEE0XHU2NDc4XHU2NDVGXHU2NDdBXHU2NDUxIisKLSAgICAgICAgIlx1NjQ2N1x1NjQzNFx1NjQ2RFx1NjQ3Qlx1NjU3Mlx1NjVBMVx1NjVEN1x1NjVENiIrCi0gICAgICAgICJcdTY2QTJcdTY2QThcdTY2OURcdTY5OUNcdTY5QThcdTY5OTVcdTY5QzFcdTY5QUUiKwotICAgICAgICAiXHU2OUQzXHU2OUNCXHU2OTlCXHU2OUI3XHU2OUJCXHU2OUFCXHU2OUI0XHU2OUQwIisKLSAgICAgICAgIlx1NjlDRFx1NjlBRFx1NjlDQ1x1NjlBNlx1NjlDM1x1NjlBM1x1NkI0OVx1NkI0QyIrCi0gICAgICAgICJcdTZDMzNcdTZGMzNcdTZGMTRcdTZFRkVcdTZGMTNcdTZFRjRcdTZGMjlcdTZGM0UiKwotICAgICAgICAiXHU2RjIwXHU2RjJDXHU2RjBGXHU2RjAyXHU2RjIyXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NkVGRiIrCi0gICAgICAgICJcdTZFRUZcdTZGMDZcdTZGMzFcdTZGMzhcdTZGMzJcdTZGMjNcdTZGMTVcdTZGMkIiKwotICAgICAgICAiXHU2RjJGXHU2Rjg4XHU2RjJBXHU2RUVDXHU2RjAxXHU2RUYyXHU2RUNDXHU2RUY3IisKLSAgICAgICAgIlx1NzE5NFx1NzE5OVx1NzE3RFx1NzE4QVx1NzE4NFx1NzE5Mlx1NzIzRVx1NzI5MiIrCi0gICAgICAgICJcdTcyOTZcdTczNDRcdTczNTBcdTc0NjRcdTc0NjNcdTc0NkFcdTc0NzBcdTc0NkQiKwotICAgICAgICAiXHU3NTA0XHU3NTkxXHU3NjI3XHU3NjBEXHU3NjBCXHU3NjA5XHU3NjEzXHU3NkUxIisKLSAgICAgICAgIlx1NzZFM1x1Nzc4NFx1Nzc3RFx1Nzc3Rlx1Nzc2MVx1NzhDMVx1Nzg5Rlx1NzhBNyIrCi0gICAgICAgICJcdTc4QjNcdTc4QTlcdTc4QTNcdTc5OEVcdTc5OEZcdTc5OERcdTdBMkVcdTdBMzEiKwotICAgICAgICAiXHU3QUFBXHU3QUE5XHU3QUVEXHU3QUVGXHU3QkExXHU3Qjk1XHU3QjhCXHU3Qjc1IisKLSAgICAgICAgIlx1N0I5N1x1N0I5RFx1N0I5NFx1N0I4Rlx1N0JCOFx1N0I4N1x1N0I4NFx1N0NCOSIrCi0gICAgICAgICJcdTdDQkRcdTdDQkVcdTdEQkJcdTdEQjBcdTdEOUNcdTdEQkRcdTdEQkVcdTdEQTAiKwotICAgICAgICAiXHU3RENBXHU3REI0XHU3REIyXHU3REIxXHU3REJBXHU3REEyXHU3REJGXHU3REI1IisKLSAgICAgICAgIlx1N0RCOFx1N0RBRFx1N0REMlx1N0RDN1x1N0RBQ1x1N0Y3MFx1N0ZFMFx1N0ZFMSIrCi0gICAgICAgICJcdTdGREZcdTgwNUVcdTgwNUFcdTgwODdcdTgxNTBcdTgxODBcdTgxOEZcdTgxODgiKwotICAgICAgICAiXHU4MThBXHU4MTdGXHU4MTgyXHU4MUU3XHU4MUZBXHU4MjA3XHU4MjE0XHU4MjFFIisKLSAgICAgICAgIlx1ODI0Qlx1ODRDOVx1ODRCRlx1ODRDNlx1ODRDNFx1ODQ5OVx1ODQ5RVx1ODRCMiIrCi0gICAgICAgICJcdTg0OUNcdTg0Q0JcdTg0QjhcdTg0QzBcdTg0RDNcdTg0OTBcdTg0QkNcdTg0RDEiKwotICAgICAgICAiXHU4NENBXHU4NzNGXHU4NzFDXHU4NzNCXHU4NzIyXHU4NzI1XHU4NzM0XHU4NzE4IisKLSAgICAgICAgIlx1ODc1NVx1ODczN1x1ODcyOVx1ODhGM1x1ODkwMlx1ODhGNFx1ODhGOVx1ODhGOCIrCi0gICAgICAgICJcdTg4RkRcdTg4RThcdTg5MUFcdTg4RUZcdThBQTZcdThBOENcdThBOUVcdThBQTMiKwotICAgICAgICAiXHU4QThEXHU4QUExXHU4QTkzXHU4QUE0XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1OEFBQVx1OEFBNSIrCi0gICAgICAgICJcdThBQThcdThBOThcdThBOTFcdThBOUFcdThBQTdcdThDNkFcdThDOERcdThDOEMiKwotICAgICAgICAiXHU4Q0QzXHU4Q0QxXHU4Q0QyXHU4RDZCXHU4RDk5XHU4RDk1XHU4REZDXHU4RjE0IisKLSAgICAgICAgIlx1OEYxMlx1OEYxNVx1OEYxM1x1OEZBM1x1OTA2MFx1OTA1OFx1OTA1Q1x1OTA2MyIrCi0gICAgICAgICJcdTkwNTlcdTkwNUVcdTkwNjJcdTkwNURcdTkwNUJcdTkxMTlcdTkxMThcdTkxMUUiKwotICAgICAgICAiXHU5MTc1XHU5MTc4XHU5MTc3XHU5MTc0XHU5Mjc4XHU5MjgwXHU5Mjg1XHU5Mjk4IisKLSAgICAgICAgIlx1OTI5Nlx1OTI3Qlx1OTI5M1x1OTI5Q1x1OTJBOFx1OTI3Q1x1OTI5MVx1OTVBMSIrCi0gICAgICAgICJcdTk1QThcdTk1QTlcdTk1QTNcdTk1QTVcdTk1QTRcdTk2OTlcdTk2OUNcdTk2OUIiKwotICAgICAgICAiXHU5NkNDXHU5NkQyXHU5NzAwXHU5NzdDXHU5Nzg1XHU5N0Y2XHU5ODE3XHU5ODE4IisKLSAgICAgICAgIlx1OThBRlx1OThCMVx1OTkwM1x1OTkwNVx1OTkwQ1x1OTkwOVx1OTlDMVx1OUFBRiIrCi0gICAgICAgICJcdTlBQjBcdTlBRTZcdTlCNDFcdTlCNDJcdTlDRjRcdTlDRjZcdTlDRjNcdTlFQkMiKwotICAgICAgICAiXHU5RjNCXHU5RjRBXHU1MTA0XHU1MTAwXHU1MEZCXHU1MEY1XHU1MEY5XHU1MTAyIisKLSAgICAgICAgIlx1NTEwOFx1NTEwOVx1NTEwNVx1NTFEQ1x1NTI4N1x1NTI4OFx1NTI4OVx1NTI4RCIrCi0gICAgICAgICJcdTUyOEFcdTUyRjBcdTUzQjJcdTU2MkVcdTU2M0JcdTU2MzlcdTU2MzJcdTU2M0YiKwotICAgICAgICAiXHU1NjM0XHU1NjI5XHU1NjUzXHU1NjRFXHU1NjU3XHU1Njc0XHU1NjM2XHU1NjJGIisKLSAgICAgICAgIlx1NTYzMFx1NTg4MFx1NTg5Rlx1NTg5RVx1NThCM1x1NTg5Q1x1NThBRVx1NThBOSIrCi0gICAgICAgICJcdTU4QTZcdTU5NkRcdTVCMDlcdTVBRkJcdTVCMEJcdTVBRjVcdTVCMENcdTVCMDgiKwotICAgICAgICAiXHU1QkVFXHU1QkVDXHU1QkU5XHU1QkVCXHU1QzY0XHU1QzY1XHU1RDlEXHU1RDk0IisKLSAgICAgICAgIlx1NUU2Mlx1NUU1Rlx1NUU2MVx1NUVFMlx1NUVEQVx1NUVERlx1NUVERFx1NUVFMyIrCi0gICAgICAgICJcdTVFRTBcdTVGNDhcdTVGNzFcdTVGQjdcdTVGQjVcdTYxNzZcdTYxNjdcdTYxNkUiKwotICAgICAgICAiXHU2MTVEXHU2MTU1XHU2MTgyXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NjE3Q1x1NjE3MFx1NjE2QiIrCi0gICAgICAgICJcdTYxN0VcdTYxQTdcdTYxOTBcdTYxQUJcdTYxOEVcdTYxQUNcdTYxOUFcdTYxQTQiKwotICAgICAgICAiXHU2MTk0XHU2MUFFXHU2MjJFXHU2NDY5XHU2NDZGXHU2NDc5XHU2NDlFXHU2NEIyIisKLSAgICAgICAgIlx1NjQ4OFx1NjQ5MFx1NjRCMFx1NjRBNVx1NjQ5M1x1NjQ5NVx1NjRBOVx1NjQ5MiIrCi0gICAgICAgICJcdTY0QUVcdTY0QURcdTY0QUJcdTY0OUFcdTY0QUNcdTY0OTlcdTY0QTJcdTY0QjMiKwotICAgICAgICAiXHU2NTc1XHU2NTc3XHU2NTc4XHU2NkFFXHU2NkFCXHU2NkI0XHU2NkIxXHU2QTIzIisKLSAgICAgICAgIlx1NkExRlx1NjlFOFx1NkEwMVx1NkExRVx1NkExOVx1NjlGRFx1NkEyMVx1NkExMyIrCi0gICAgICAgICJcdTZBMEFcdTY5RjNcdTZBMDJcdTZBMDVcdTY5RURcdTZBMTFcdTZCNTBcdTZCNEUiKwotICAgICAgICAiXHU2QkE0XHU2QkM1XHU2QkM2XHU2RjNGXHU2RjdDXHU2Rjg0XHU2RjUxXHU2RjY2IisKLSAgICAgICAgIlx1NkY1NFx1NkY4Nlx1NkY2RFx1NkY1Qlx1NkY3OFx1NkY2RVx1NkY4RVx1NkY3QSIrCi0gICAgICAgICJcdTZGNzBcdTZGNjRcdTZGOTdcdTZGNThcdTZFRDVcdTZGNkZcdTZGNjBcdTZGNUYiKwotICAgICAgICAiXHU3MTlGXHU3MUFDXHU3MUIxXHU3MUE4XHU3MjU2XHU3MjlCXHU3MzRFXHU3MzU3IisKLSAgICAgICAgIlx1NzQ2OVx1NzQ4Qlx1NzQ4M1x1NzQ3RVx1NzQ4MFx1NzU3Rlx1NzYyMFx1NzYyOSIrCi0gICAgICAgICJcdTc2MUZcdTc2MjRcdTc2MjZcdTc2MjFcdTc2MjJcdTc2OUFcdTc2QkFcdTc2RTQiKwotICAgICAgICAiXHU3NzhFXHU3Nzg3XHU3NzhDXHU3NzkxXHU3NzhCXHU3OENCXHU3OEM1XHU3OEJBIisKLSAgICAgICAgIlx1NzhDQVx1NzhCRVx1NzhENVx1NzhCQ1x1NzhEMFx1N0EzRlx1N0EzQ1x1N0E0MCIrCi0gICAgICAgICJcdTdBM0RcdTdBMzdcdTdBM0JcdTdBQUZcdTdBQUVcdTdCQURcdTdCQjFcdTdCQzQiKwotICAgICAgICAiXHU3QkI0XHU3QkM2XHU3QkM3XHU3QkMxXHU3QkEwXHU3QkNDXHU3Q0NBXHU3REUwIisKLSAgICAgICAgIlx1N0RGNFx1N0RFRlx1N0RGQlx1N0REOFx1N0RFQ1x1N0RERFx1N0RFOFx1N0RFMyIrCi0gICAgICAgICJcdTdEREFcdTdEREVcdTdERTlcdTdEOUVcdTdERDlcdTdERjJcdTdERjlcdTdGNzUiKwotICAgICAgICAiXHU3Rjc3XHU3RkFGXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1N0ZFOVx1ODAyNlx1ODE5Qlx1ODE5QyIrCi0gICAgICAgICJcdTgxOURcdTgxQTBcdTgxOUFcdTgxOThcdTg1MTdcdTg1M0RcdTg1MUFcdTg0RUUiKwotICAgICAgICAiXHU4NTJDXHU4NTJEXHU4NTEzXHU4NTExXHU4NTIzXHU4NTIxXHU4NTE0XHU4NEVDIisKLSAgICAgICAgIlx1ODUyNVx1ODRGRlx1ODUwNlx1ODc4Mlx1ODc3NFx1ODc3Nlx1ODc2MFx1ODc2NiIrCi0gICAgICAgICJcdTg3NzhcdTg3NjhcdTg3NTlcdTg3NTdcdTg3NENcdTg3NTNcdTg4NUJcdTg4NUQiKwotICAgICAgICAiXHU4OTEwXHU4OTA3XHU4OTEyXHU4OTEzXHU4OTE1XHU4OTBBXHU4QUJDXHU4QUQyIisKLSAgICAgICAgIlx1OEFDN1x1OEFDNFx1OEE5NVx1OEFDQlx1OEFGOFx1OEFCMlx1OEFDOVx1OEFDMiIrCi0gICAgICAgICJcdThBQkZcdThBQjBcdThBRDZcdThBQ0RcdThBQjZcdThBQjlcdThBREJcdThDNEMiKwotICAgICAgICAiXHU4QzRFXHU4QzZDXHU4Q0UwXHU4Q0RFXHU4Q0U2XHU4Q0U0XHU4Q0VDXHU4Q0VEIisKLSAgICAgICAgIlx1OENFMlx1OENFM1x1OENEQ1x1OENFQVx1OENFMVx1OEQ2RFx1OEQ5Rlx1OERBMyIrCi0gICAgICAgICJcdThFMkJcdThFMTBcdThFMURcdThFMjJcdThFMEZcdThFMjlcdThFMUZcdThFMjEiKwotICAgICAgICAiXHU4RTFFXHU4RUJBXHU4RjFEXHU4RjFCXHU4RjFGXHU4RjI5XHU4RjI2XHU4RjJBIisKLSAgICAgICAgIlx1OEYxQ1x1OEYxRVx1OEYyNVx1OTA2OVx1OTA2RVx1OTA2OFx1OTA2RFx1OTA3NyIrCi0gICAgICAgICJcdTkxMzBcdTkxMkRcdTkxMjdcdTkxMzFcdTkxODdcdTkxODlcdTkxOEJcdTkxODMiKwotICAgICAgICAiXHU5MkM1XHU5MkJCXHU5MkI3XHU5MkVBXHU5MkFDXHU5MkU0XHU5MkMxXHU5MkIzIisKLSAgICAgICAgIlx1OTJCQ1x1OTJEMlx1OTJDN1x1OTJGMFx1OTJCMlx1OTVBRFx1OTVCMVx1OTcwNCIrCi0gICAgICAgICJcdTk3MDZcdTk3MDdcdTk3MDlcdTk3NjBcdTk3OERcdTk3OEJcdTk3OEZcdTk4MjEiKwotICAgICAgICAiXHU5ODJCXHU5ODFDXHU5OEIzXHU5OTBBXHU5OTEzXHU5OTEyXHU5OTE4XHU5OUREIisKLSAgICAgICAgIlx1OTlEMFx1OTlERlx1OTlEQlx1OTlEMVx1OTlENVx1OTlEMlx1OTlEOVx1OUFCNyIrCi0gICAgICAgICJcdTlBRUVcdTlBRUZcdTlCMjdcdTlCNDVcdTlCNDRcdTlCNzdcdTlCNkZcdTlEMDYiKwotICAgICAgICAiXHU5RDA5XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1OUQwM1x1OUVBOVx1OUVCRVx1OUVDRVx1NThBOCIrCi0gICAgICAgICJcdTlGNTJcdTUxMTJcdTUxMThcdTUxMTRcdTUxMTBcdTUxMTVcdTUxODBcdTUxQUEiKwotICAgICAgICAiXHU1MUREXHU1MjkxXHU1MjkzXHU1MkYzXHU1NjU5XHU1NjZCXHU1Njc5XHU1NjY5IisKLSAgICAgICAgIlx1NTY2NFx1NTY3OFx1NTY2QVx1NTY2OFx1NTY2NVx1NTY3MVx1NTY2Rlx1NTY2QyIrCi0gICAgICAgICJcdTU2NjJcdTU2NzZcdTU4QzFcdTU4QkVcdTU4QzdcdTU4QzVcdTU5NkVcdTVCMUQiKwotICAgICAgICAiXHU1QjM0XHU1Qjc4XHU1QkYwXHU1QzBFXHU1RjRBXHU2MUIyXHU2MTkxXHU2MUE5IisKLSAgICAgICAgIlx1NjE4QVx1NjFDRFx1NjFCNlx1NjFCRVx1NjFDQVx1NjFDOFx1NjIzMFx1NjRDNSIrCi0gICAgICAgICJcdTY0QzFcdTY0Q0JcdTY0QkJcdTY0QkNcdTY0REFcdTY0QzRcdTY0QzdcdTY0QzIiKwotICAgICAgICAiXHU2NENEXHU2NEJGXHU2NEQyXHU2NEQ0XHU2NEJFXHU2NTc0XHU2NkM2XHU2NkM5IisKLSAgICAgICAgIlx1NjZCOVx1NjZDNFx1NjZDN1x1NjZCOFx1NkEzRFx1NkEzOFx1NkEzQVx1NkE1OSIrCi0gICAgICAgICJcdTZBNkJcdTZBNThcdTZBMzlcdTZBNDRcdTZBNjJcdTZBNjFcdTZBNEJcdTZBNDciKwotICAgICAgICAiXHU2QTM1XHU2QTVGXHU2QTQ4XHU2QjU5XHU2Qjc3XHU2QzA1XHU2RkMyXHU2RkIxIisKLSAgICAgICAgIlx1NkZBMVx1NkZDM1x1NkZBNFx1NkZDMVx1NkZBN1x1NkZCM1x1NkZDMFx1NkZCOSIrCi0gICAgICAgICJcdTZGQjZcdTZGQTZcdTZGQTBcdTZGQjRcdTcxQkVcdTcxQzlcdTcxRDBcdTcxRDIiKwotICAgICAgICAiXHU3MUM4XHU3MUQ1XHU3MUI5XHU3MUNFXHU3MUQ5XHU3MURDXHU3MUMzXHU3MUM0IisKLSAgICAgICAgIlx1NzM2OFx1NzQ5Q1x1NzRBM1x1NzQ5OFx1NzQ5Rlx1NzQ5RVx1NzRFMlx1NzUwQyIrCi0gICAgICAgICJcdTc1MERcdTc2MzRcdTc2MzhcdTc2M0FcdTc2RTdcdTc2RTVcdTc3QTBcdTc3OUUiKwotICAgICAgICAiXHU3NzlGXHU3N0E1XHU3OEU4XHU3OERBXHU3OEVDXHU3OEU3XHU3OUE2XHU3QTREIisKLSAgICAgICAgIlx1N0E0RVx1N0E0Nlx1N0E0Q1x1N0E0Qlx1N0FCQVx1N0JEOVx1N0MxMVx1N0JDOSIrCi0gICAgICAgICJcdTdCRTRcdTdCREJcdTdCRTFcdTdCRTlcdTdCRTZcdTdDRDVcdTdDRDZcdTdFMEEiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1N0UxMVx1N0UwOFx1N0UxQlx1N0UyM1x1N0UxRVx1N0UxRCIrCi0gICAgICAgICJcdTdFMDlcdTdFMTBcdTdGNzlcdTdGQjJcdTdGRjBcdTdGRjFcdTdGRUVcdTgwMjgiKwotICAgICAgICAiXHU4MUIzXHU4MUE5XHU4MUE4XHU4MUZCXHU4MjA4XHU4MjU4XHU4MjU5XHU4NTRBIisKLSAgICAgICAgIlx1ODU1OVx1ODU0OFx1ODU2OFx1ODU2OVx1ODU0M1x1ODU0OVx1ODU2RFx1ODU2QSIrCi0gICAgICAgICJcdTg1NUVcdTg3ODNcdTg3OUZcdTg3OUVcdTg3QTJcdTg3OERcdTg4NjFcdTg5MkEiKwotICAgICAgICAiXHU4OTMyXHU4OTI1XHU4OTJCXHU4OTIxXHU4OUFBXHU4OUE2XHU4QUU2XHU4QUZBIisKLSAgICAgICAgIlx1OEFFQlx1OEFGMVx1OEIwMFx1OEFEQ1x1OEFFN1x1OEFFRVx1OEFGRVx1OEIwMSIrCi0gICAgICAgICJcdThCMDJcdThBRjdcdThBRURcdThBRjNcdThBRjZcdThBRkNcdThDNkJcdThDNkQiKwotICAgICAgICAiXHU4QzkzXHU4Q0Y0XHU4RTQ0XHU4RTMxXHU4RTM0XHU4RTQyXHU4RTM5XHU4RTM1IisKLSAgICAgICAgIlx1OEYzQlx1OEYyRlx1OEYzOFx1OEYzM1x1OEZBOFx1OEZBNlx1OTA3NVx1OTA3NCIrCi0gICAgICAgICJcdTkwNzhcdTkwNzJcdTkwN0NcdTkwN0FcdTkxMzRcdTkxOTJcdTkzMjBcdTkzMzYiKwotICAgICAgICAiXHU5MkY4XHU5MzMzXHU5MzJGXHU5MzIyXHU5MkZDXHU5MzJCXHU5MzA0XHU5MzFBIjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBpbm5lckluZGV4Mj0KLSAgICAgICAgIlx1OTMxMFx1OTMyNlx1OTMyMVx1OTMxNVx1OTMyRVx1OTMxOVx1OTVCQlx1OTZBNyIrCi0gICAgICAgICJcdTk2QThcdTk2QUFcdTk2RDVcdTk3MEVcdTk3MTFcdTk3MTZcdTk3MERcdTk3MTMiKwotICAgICAgICAiXHU5NzBGXHU5NzVCXHU5NzVDXHU5NzY2XHU5Nzk4XHU5ODMwXHU5ODM4XHU5ODNCIisKLSAgICAgICAgIlx1OTgzN1x1OTgyRFx1OTgzOVx1OTgyNFx1OTkxMFx1OTkyOFx1OTkxRVx1OTkxQiIrCi0gICAgICAgICJcdTk5MjFcdTk5MUFcdTk5RURcdTk5RTJcdTk5RjFcdTlBQjhcdTlBQkNcdTlBRkIiKwotICAgICAgICAiXHU5QUVEXHU5QjI4XHU5QjkxXHU5RDE1XHU5RDIzXHU5RDI2XHU5RDI4XHU5RDEyIisKLSAgICAgICAgIlx1OUQxQlx1OUVEOFx1OUVENFx1OUY4RFx1OUY5Q1x1NTEyQVx1NTExRlx1NTEyMSIrCi0gICAgICAgICJcdTUxMzJcdTUyRjVcdTU2OEVcdTU2ODBcdTU2OTBcdTU2ODVcdTU2ODdcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1NTY4Rlx1NThENVx1NThEM1x1NThEMVx1NThDRVx1NUIzMFx1NUIyQSIrCi0gICAgICAgICJcdTVCMjRcdTVCN0FcdTVDMzdcdTVDNjhcdTVEQkNcdTVEQkFcdTVEQkRcdTVEQjgiKwotICAgICAgICAiXHU1RTZCXHU1RjRDXHU1RkJEXHU2MUM5XHU2MUMyXHU2MUM3XHU2MUU2XHU2MUNCIisKLSAgICAgICAgIlx1NjIzMlx1NjIzNFx1NjRDRVx1NjRDQVx1NjREOFx1NjRFMFx1NjRGMFx1NjRFNiIrCi0gICAgICAgICJcdTY0RUNcdTY0RjFcdTY0RTJcdTY0RURcdTY1ODJcdTY1ODNcdTY2RDlcdTY2RDYiKwotICAgICAgICAiXHU2QTgwXHU2QTk0XHU2QTg0XHU2QUEyXHU2QTlDXHU2QURCXHU2QUEzXHU2QTdFIisKLSAgICAgICAgIlx1NkE5N1x1NkE5MFx1NkFBMFx1NkI1Q1x1NkJBRVx1NkJEQVx1NkMwOFx1NkZEOCIrCi0gICAgICAgICJcdTZGRjFcdTZGREZcdTZGRTBcdTZGREJcdTZGRTRcdTZGRUJcdTZGRUZcdTZGODAiKwotICAgICAgICAiXHU2RkVDXHU2RkUxXHU2RkU5XHU2RkQ1XHU2RkVFXHU2RkYwXHU3MUU3XHU3MURGIisKLSAgICAgICAgIlx1NzFFRVx1NzFFNlx1NzFFNVx1NzFFRFx1NzFFQ1x1NzFGNFx1NzFFMFx1NzIzNSIrCi0gICAgICAgICJcdTcyNDZcdTczNzBcdTczNzJcdTc0QTlcdTc0QjBcdTc0QTZcdTc0QThcdTc2NDYiKwotICAgICAgICAiXHU3NjQyXHU3NjRDXHU3NkVBXHU3N0IzXHU3N0FBXHU3N0IwXHU3N0FDXHU3N0E3IisKLSAgICAgICAgIlx1NzdBRFx1NzdFRlx1NzhGN1x1NzhGQVx1NzhGNFx1NzhFRlx1NzkwMVx1NzlBNyIrCi0gICAgICAgICJcdTc5QUFcdTdBNTdcdTdBQkZcdTdDMDdcdTdDMERcdTdCRkVcdTdCRjdcdTdDMEMiKwotICAgICAgICAiXHU3QkUwXHU3Q0UwXHU3Q0RDXHU3Q0RFXHU3Q0UyXHU3Q0RGXHU3Q0Q5XHU3Q0REIisKLSAgICAgICAgIlx1N0UyRVx1N0UzRVx1N0U0Nlx1N0UzN1x1N0UzMlx1N0U0M1x1N0UyQlx1N0UzRCIrCi0gICAgICAgICJcdTdFMzFcdTdFNDVcdTdFNDFcdTdFMzRcdTdFMzlcdTdFNDhcdTdFMzVcdTdFM0YiKwotICAgICAgICAiXHU3RTJGXHU3RjQ0XHU3RkYzXHU3RkZDXHU4MDcxXHU4MDcyXHU4MDcwXHU4MDZGIisKLSAgICAgICAgIlx1ODA3M1x1ODFDNlx1ODFDM1x1ODFCQVx1ODFDMlx1ODFDMFx1ODFCRlx1ODFCRCIrCi0gICAgICAgICJcdTgxQzlcdTgxQkVcdTgxRThcdTgyMDlcdTgyNzFcdTg1QUFcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1ODU4NFx1ODU3RVx1ODU5Q1x1ODU5MVx1ODU5NFx1ODVBRlx1ODU5Qlx1ODU4NyIrCi0gICAgICAgICJcdTg1QThcdTg1OEFcdTg2NjdcdTg3QzBcdTg3RDFcdTg3QjNcdTg3RDJcdTg3QzYiKwotICAgICAgICAiXHU4N0FCXHU4N0JCXHU4N0JBXHU4N0M4XHU4N0NCXHU4OTNCXHU4OTM2XHU4OTQ0IisKLSAgICAgICAgIlx1ODkzOFx1ODkzRFx1ODlBQ1x1OEIwRVx1OEIxN1x1OEIxOVx1OEIxQlx1OEIwQSIrCi0gICAgICAgICJcdThCMjBcdThCMURcdThCMDRcdThCMTBcdThDNDFcdThDM0ZcdThDNzNcdThDRkEiKwotICAgICAgICAiXHU4Q0ZEXHU4Q0ZDXHU4Q0Y4XHU4Q0ZCXHU4REE4XHU4RTQ5XHU4RTRCXHU4RTQ4IisKLSAgICAgICAgIlx1OEU0QVx1OEY0NFx1OEYzRVx1OEY0Mlx1OEY0NVx1OEYzRlx1OTA3Rlx1OTA3RCIrCi0gICAgICAgICJcdTkwODRcdTkwODFcdTkwODJcdTkwODBcdTkxMzlcdTkxQTNcdTkxOUVcdTkxOUMiKwotICAgICAgICAiXHU5MzREXHU5MzgyXHU5MzI4XHU5Mzc1XHU5MzRBXHU5MzY1XHU5MzRCXHU5MzE4IisKLSAgICAgICAgIlx1OTM3RVx1OTM2Q1x1OTM1Qlx1OTM3MFx1OTM1QVx1OTM1NFx1OTVDQVx1OTVDQiIrCi0gICAgICAgICJcdTk1Q0NcdTk1QzhcdTk1QzZcdTk2QjFcdTk2QjhcdTk2RDZcdTk3MUNcdTk3MUUiKwotICAgICAgICAiXHU5N0EwXHU5N0QzXHU5ODQ2XHU5OEI2XHU5OTM1XHU5QTAxXHU5OUZGXHU5QkFFIisKLSAgICAgICAgIlx1OUJBQlx1OUJBQVx1OUJBRFx1OUQzQlx1OUQzRlx1OUU4Qlx1OUVDRlx1OUVERSIrCi0gICAgICAgICJcdTlFRENcdTlFRERcdTlFREJcdTlGM0VcdTlGNEJcdTUzRTJcdTU2OTVcdTU2QUUiKwotICAgICAgICAiXHU1OEQ5XHU1OEQ4XHU1QjM4XHU1RjVEXHU2MUUzXHU2MjMzXHU2NEY0XHU2NEYyIisKLSAgICAgICAgIlx1NjRGRVx1NjUwNlx1NjRGQVx1NjRGQlx1NjRGN1x1NjVCN1x1NjZEQ1x1NjcyNiIrCi0gICAgICAgICJcdTZBQjNcdTZBQUNcdTZBQzNcdTZBQkJcdTZBQjhcdTZBQzJcdTZBQUVcdTZBQUYiKwotICAgICAgICAiXHU2QjVGXHU2Qjc4XHU2QkFGXHU3MDA5XHU3MDBCXHU2RkZFXHU3MDA2XHU2RkZBIisKLSAgICAgICAgIlx1NzAxMVx1NzAwRlx1NzFGQlx1NzFGQ1x1NzFGRVx1NzFGOFx1NzM3N1x1NzM3NSIrCi0gICAgICAgICJcdTc0QTdcdTc0QkZcdTc1MTVcdTc2NTZcdTc2NThcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU3NjUyIisKLSAgICAgICAgIlx1NzdCRFx1NzdCRlx1NzdCQlx1NzdCQ1x1NzkwRVx1NzlBRVx1N0E2MVx1N0E2MiIrCi0gICAgICAgICJcdTdBNjBcdTdBQzRcdTdBQzVcdTdDMkJcdTdDMjdcdTdDMkFcdTdDMUVcdTdDMjMiKwotICAgICAgICAiXHU3QzIxXHU3Q0U3XHU3RTU0XHU3RTU1XHU3RTVFXHU3RTVBXHU3RTYxXHU3RTUyIisKLSAgICAgICAgIlx1N0U1OVx1N0Y0OFx1N0ZGOVx1N0ZGQlx1ODA3N1x1ODA3Nlx1ODFDRFx1ODFDRiIrCi0gICAgICAgICJcdTgyMEFcdTg1Q0ZcdTg1QTlcdTg1Q0RcdTg1RDBcdTg1QzlcdTg1QjBcdTg1QkEiKwotICAgICAgICAiXHU4NUI5XHU4NUE2XHU4N0VGXHU4N0VDXHU4N0YyXHU4N0UwXHU4OTg2XHU4OUIyIisKLSAgICAgICAgIlx1ODlGNFx1OEIyOFx1OEIzOVx1OEIyQ1x1OEIyQlx1OEM1MFx1OEQwNVx1OEU1OSIrCi0gICAgICAgICJcdThFNjNcdThFNjZcdThFNjRcdThFNUZcdThFNTVcdThFQzBcdThGNDlcdThGNEQiKwotICAgICAgICAiXHU5MDg3XHU5MDgzXHU5MDg4XHU5MUFCXHU5MUFDXHU5MUQwXHU5Mzk0XHU5MzhBIisKLSAgICAgICAgIlx1OTM5Nlx1OTNBMlx1OTNCM1x1OTNBRVx1OTNBQ1x1OTNCMFx1OTM5OFx1OTM5QSIrCi0gICAgICAgICJcdTkzOTdcdTk1RDRcdTk1RDZcdTk1RDBcdTk1RDVcdTk2RTJcdTk2RENcdTk2RDkiKwotICAgICAgICAiXHU5NkRCXHU5NkRFXHU5NzI0XHU5N0EzXHU5N0E2XHU5N0FEXHU5N0Y5XHU5ODREIisKLSAgICAgICAgIlx1OTg0Rlx1OTg0Q1x1OTg0RVx1OTg1M1x1OThCQVx1OTkzRVx1OTkzRlx1OTkzRCIrCi0gICAgICAgICJcdTk5MkVcdTk5QTVcdTlBMEVcdTlBQzFcdTlCMDNcdTlCMDZcdTlCNEZcdTlCNEUiKwotICAgICAgICAiXHU5QjREXHU5QkNBXHU5QkM5XHU5QkZEXHU5QkM4XHU5QkMwXHU5RDUxXHU5RDVEIisKLSAgICAgICAgIlx1OUQ2MFx1OUVFMFx1OUYxNVx1OUYyQ1x1NTEzM1x1NTZBNVx1NThERVx1NThERiIrCi0gICAgICAgICJcdTU4RTJcdTVCRjVcdTlGOTBcdTVFRUNcdTYxRjJcdTYxRjdcdTYxRjZcdTYxRjUiKwotICAgICAgICAiXHU2NTAwXHU2NTBGXHU2NkUwXHU2NkREXHU2QUU1XHU2QUREXHU2QURBXHU2QUQzIisKLSAgICAgICAgIlx1NzAxQlx1NzAxRlx1NzAyOFx1NzAxQVx1NzAxRFx1NzAxNVx1NzAxOFx1NzIwNiIrCi0gICAgICAgICJcdTcyMERcdTcyNThcdTcyQTJcdTczNzhcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU3MzdBXHU3NEJEIisKLSAgICAgICAgIlx1NzRDQVx1NzRFM1x1NzU4N1x1NzU4Nlx1NzY1Rlx1NzY2MVx1NzdDN1x1NzkxOSIrCi0gICAgICAgICJcdTc5QjFcdTdBNkJcdTdBNjlcdTdDM0VcdTdDM0ZcdTdDMzhcdTdDM0RcdTdDMzciKwotICAgICAgICAiXHU3QzQwXHU3RTZCXHU3RTZEXHU3RTc5XHU3RTY5XHU3RTZBXHU3Rjg1XHU3RTczIisKLSAgICAgICAgIlx1N0ZCNlx1N0ZCOVx1N0ZCOFx1ODFEOFx1ODVFOVx1ODVERFx1ODVFQVx1ODVENSIrCi0gICAgICAgICJcdTg1RTRcdTg1RTVcdTg1RjdcdTg3RkJcdTg4MDVcdTg4MERcdTg3RjlcdTg3RkUiKwotICAgICAgICAiXHU4OTYwXHU4OTVGXHU4OTU2XHU4OTVFXHU4QjQxXHU4QjVDXHU4QjU4XHU4QjQ5IisKLSAgICAgICAgIlx1OEI1QVx1OEI0RVx1OEI0Rlx1OEI0Nlx1OEI1OVx1OEQwOFx1OEQwQVx1OEU3QyIrCi0gICAgICAgICJcdThFNzJcdThFODdcdThFNzZcdThFNkNcdThFN0FcdThFNzRcdThGNTRcdThGNEUiKwotICAgICAgICAiXHU4RkFEXHU5MDhBXHU5MDhCXHU5MUIxXHU5MUFFXHU5M0UxXHU5M0QxXHU5M0RGIisKLSAgICAgICAgIlx1OTNDM1x1OTNDOFx1OTNEQ1x1OTNERFx1OTNENlx1OTNFMlx1OTNDRFx1OTNEOCIrCi0gICAgICAgICJcdTkzRTRcdTkzRDdcdTkzRThcdTk1RENcdTk2QjRcdTk2RTNcdTk3MkFcdTk3MjciKwotICAgICAgICAiXHU5NzYxXHU5N0RDXHU5N0ZCXHU5ODVFXHU5ODU4XHU5ODVCXHU5OEJDXHU5OTQ1IisKLSAgICAgICAgIlx1OTk0OVx1OUExNlx1OUExOVx1OUIwRFx1OUJFOFx1OUJFN1x1OUJENlx1OUJEQiIrCi0gICAgICAgICJcdTlEODlcdTlENjFcdTlENzJcdTlENkFcdTlENkNcdTlFOTJcdTlFOTdcdTlFOTMiKwotICAgICAgICAiXHU5RUI0XHU1MkY4XHU1NkE4XHU1NkI3XHU1NkI2XHU1NkI0XHU1NkJDXHU1OEU0IisKLSAgICAgICAgIlx1NUI0MFx1NUI0M1x1NUI3RFx1NUJGNlx1NURDOVx1NjFGOFx1NjFGQVx1NjUxOCIrCi0gICAgICAgICJcdTY1MTRcdTY1MTlcdTY2RTZcdTY3MjdcdTZBRUNcdTcwM0VcdTcwMzBcdTcwMzIiKwotICAgICAgICAiXHU3MjEwXHU3MzdCXHU3NENGXHU3NjYyXHU3NjY1XHU3OTI2XHU3OTJBXHU3OTJDIisKLSAgICAgICAgIlx1NzkyQlx1N0FDN1x1N0FGNlx1N0M0Q1x1N0M0M1x1N0M0RFx1N0NFRlx1N0NGMCIrCi0gICAgICAgICJcdThGQUVcdTdFN0RcdTdFN0NcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU3RTgyXHU3RjRDXHU4MDAwIisKLSAgICAgICAgIlx1ODFEQVx1ODI2Nlx1ODVGQlx1ODVGOVx1ODYxMVx1ODVGQVx1ODYwNlx1ODYwQiIrCi0gICAgICAgICJcdTg2MDdcdTg2MEFcdTg4MTRcdTg4MTVcdTg5NjRcdTg5QkFcdTg5RjhcdThCNzAiKwotICAgICAgICAiXHU4QjZDXHU4QjY2XHU4QjZGXHU4QjVGXHU4QjZCXHU4RDBGXHU4RDBEXHU4RTg5IisKLSAgICAgICAgIlx1OEU4MVx1OEU4NVx1OEU4Mlx1OTFCNFx1OTFDQlx1OTQxOFx1OTQwM1x1OTNGRCIrCi0gICAgICAgICJcdTk1RTFcdTk3MzBcdTk4QzRcdTk5NTJcdTk5NTFcdTk5QThcdTlBMkJcdTlBMzAiKwotICAgICAgICAiXHU5QTM3XHU5QTM1XHU5QzEzXHU5QzBEXHU5RTc5XHU5RUI1XHU5RUU4XHU5RjJGIisKLSAgICAgICAgIlx1OUY1Rlx1OUY2M1x1OUY2MVx1NTEzN1x1NTEzOFx1NTZDMVx1NTZDMFx1NTZDMiIrCi0gICAgICAgICJcdTU5MTRcdTVDNkNcdTVEQ0RcdTYxRkNcdTYxRkVcdTY1MURcdTY1MUNcdTY1OTUiKwotICAgICAgICAiXHU2NkU5XHU2QUZCXHU2QjA0XHU2QUZBXHU2QkIyXHU3MDRDXHU3MjFCXHU3MkE3IisKLSAgICAgICAgIlx1NzRENlx1NzRENFx1NzY2OVx1NzdEM1x1N0M1MFx1N0U4Rlx1N0U4Q1x1N0ZCQyIrCi0gICAgICAgICJcdTg2MTdcdTg2MkRcdTg2MUFcdTg4MjNcdTg4MjJcdTg4MjFcdTg4MUZcdTg5NkEiKwotICAgICAgICAiXHU4OTZDXHU4OUJEXHU4Qjc0XHU4Qjc3XHU4QjdEXHU4RDEzXHU4RThBXHU4RThEIisKLSAgICAgICAgIlx1OEU4Qlx1OEY1Rlx1OEZBRlx1OTFCQVx1OTQyRVx1OTQzM1x1OTQzNVx1OTQzQSIrCi0gICAgICAgICJcdTk0MzhcdTk0MzJcdTk0MkJcdTk1RTJcdTk3MzhcdTk3MzlcdTk3MzJcdTk3RkYiKwotICAgICAgICAiXHU5ODY3XHU5ODY1XHU5OTU3XHU5QTQ1XHU5QTQzXHU5QTQwXHU5QTNFXHU5QUNGIisKLSAgICAgICAgIlx1OUI1NFx1OUI1MVx1OUMyRFx1OUMyNVx1OURBRlx1OURCNFx1OURDMlx1OURCOCIrCi0gICAgICAgICJcdTlFOURcdTlFRUZcdTlGMTlcdTlGNUNcdTlGNjZcdTlGNjdcdTUxM0NcdTUxM0IiKwotICAgICAgICAiXHU1NkM4XHU1NkNBXHU1NkM5XHU1QjdGXHU1REQ0XHU1REQyXHU1RjRFXHU2MUZGIisKLSAgICAgICAgIlx1NjUyNFx1NkIwQVx1NkI2MVx1NzA1MVx1NzA1OFx1NzM4MFx1NzRFNFx1NzU4QSIrCi0gICAgICAgICJcdTc2NkVcdTc2NkNcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU3OUIzXHU3QzYwXHU3QzVGXHU4MDdFIisKLSAgICAgICAgIlx1ODA3RFx1ODFERlx1ODk3Mlx1ODk2Rlx1ODlGQ1x1OEI4MFx1OEQxNlx1OEQxNyIrCi0gICAgICAgICJcdThFOTFcdThFOTNcdThGNjFcdTkxNDhcdTk0NDRcdTk0NTFcdTk0NTJcdTk3M0QiKwotICAgICAgICAiXHU5NzNFXHU5N0MzXHU5N0MxXHU5ODZCXHU5OTU1XHU5QTU1XHU5QTREXHU5QUQyIisKLSAgICAgICAgIlx1OUIxQVx1OUM0OVx1OUMzMVx1OUMzRVx1OUMzQlx1OUREM1x1OUREN1x1OUYzNCIrCi0gICAgICAgICJcdTlGNkNcdTlGNkFcdTlGOTRcdTU2Q0NcdTVERDZcdTYyMDBcdTY1MjNcdTY1MkIiKwotICAgICAgICAiXHU2NTJBXHU2NkVDXHU2QjEwXHU3NERBXHU3QUNBXHU3QzY0XHU3QzYzXHU3QzY1IisKLSAgICAgICAgIlx1N0U5M1x1N0U5Nlx1N0U5NFx1ODFFMlx1ODYzOFx1ODYzRlx1ODgzMVx1OEI4QSIrCi0gICAgICAgICJcdTkwOTBcdTkwOEZcdTk0NjNcdTk0NjBcdTk0NjRcdTk3NjhcdTk4NkZcdTk5NUMiKwotICAgICAgICAiXHU5QTVBXHU5QTVCXHU5QTU3XHU5QUQzXHU5QUQ0XHU5QUQxXHU5QzU0XHU5QzU3IisKLSAgICAgICAgIlx1OUM1Nlx1OURFNVx1OUU5Rlx1OUVGNFx1NTZEMVx1NThFOVx1NjUyQ1x1NzA1RSIrCi0gICAgICAgICJcdTc2NzFcdTc2NzJcdTc3RDdcdTdGNTBcdTdGODhcdTg4MzZcdTg4MzlcdTg4NjIiKwotICAgICAgICAiXHU4QjkzXHU4QjkyXHU4Qjk2XHU4Mjc3XHU4RDFCXHU5MUMwXHU5NDZBXHU5NzQyIisKLSAgICAgICAgIlx1OTc0OFx1OTc0NFx1OTdDNlx1OTg3MFx1OUE1Rlx1OUIyMlx1OUI1OFx1OUM1RiIrCi0gICAgICAgICJcdTlERjlcdTlERkFcdTlFN0NcdTlFN0RcdTlGMDdcdTlGNzdcdTlGNzJcdTVFRjMiKwotICAgICAgICAiXHU2QjE2XHU3MDYzXHU3QzZDXHU3QzZFXHU4ODNCXHU4OUMwXHU4RUExXHU5MUMxIisKLSAgICAgICAgIlx1OTQ3Mlx1OTQ3MFx1OTg3MVx1OTk1RVx1OUFENlx1OUIyM1x1OUVDQ1x1NzA2NCIrCi0gICAgICAgICJcdTc3REFcdThCOUFcdTk0NzdcdTk3QzlcdTlBNjJcdTlBNjVcdTdFOUNcdThCOUMiKwotICAgICAgICAiXHU4RUFBXHU5MUM1XHU5NDdEXHU5NDdFXHU5NDdDXHU5Qzc3XHU5Qzc4XHU5RUY3IisKLSAgICAgICAgIlx1OEM1NFx1OTQ3Rlx1OUUxQVx1NzIyOFx1OUE2QVx1OUIzMVx1OUUxQlx1OUUxRSIrCi0gICAgICAgICJcdTdDNzJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHUzMEZFXHUzMDlEXHUzMDlFXHUzMDA1XHUzMDQxIisKLSAgICAgICAgIlx1MzA0Mlx1MzA0M1x1MzA0NFx1MzA0NVx1MzA0Nlx1MzA0N1x1MzA0OFx1MzA0OSIrCi0gICAgICAgICJcdTMwNEFcdTMwNEJcdTMwNENcdTMwNERcdTMwNEVcdTMwNEZcdTMwNTBcdTMwNTEiKwotICAgICAgICAiXHUzMDUyXHUzMDUzXHUzMDU0XHUzMDU1XHUzMDU2XHUzMDU3XHUzMDU4XHUzMDU5IisKLSAgICAgICAgIlx1MzA1QVx1MzA1Qlx1MzA1Q1x1MzA1RFx1MzA1RVx1MzA1Rlx1MzA2MFx1MzA2MSIrCi0gICAgICAgICJcdTMwNjJcdTMwNjNcdTMwNjRcdTMwNjVcdTMwNjZcdTMwNjdcdTMwNjhcdTMwNjkiKwotICAgICAgICAiXHUzMDZBXHUzMDZCXHUzMDZDXHUzMDZEXHUzMDZFXHUzMDZGXHUzMDcwXHUzMDcxIisKLSAgICAgICAgIlx1MzA3Mlx1MzA3M1x1MzA3NFx1MzA3NVx1MzA3Nlx1MzA3N1x1MzA3OFx1MzA3OSIrCi0gICAgICAgICJcdTMwN0FcdTMwN0JcdTMwN0NcdTMwN0RcdTMwN0VcdTMwN0ZcdTMwODBcdTMwODEiKwotICAgICAgICAiXHUzMDgyXHUzMDgzXHUzMDg0XHUzMDg1XHUzMDg2XHUzMDg3XHUzMDg4XHUzMDg5IisKLSAgICAgICAgIlx1MzA4QVx1MzA4Qlx1MzA4Q1x1MzA4RFx1MzA4RVx1MzA4Rlx1MzA5MFx1MzA5MSIrCi0gICAgICAgICJcdTMwOTJcdTMwOTNcdTMwQTFcdTMwQTJcdTMwQTNcdTMwQTRcdTMwQTVcdTMwQTYiKwotICAgICAgICAiXHUzMEE3XHUzMEE4XHUzMEE5XHUzMEFBXHUzMEFCXHUzMEFDXHUzMEFEXHUzMEFFIisKLSAgICAgICAgIlx1MzBBRlx1MzBCMFx1MzBCMVx1MzBCMlx1MzBCM1x1MzBCNFx1MzBCNVx1MzBCNiIrCi0gICAgICAgICJcdTMwQjdcdTMwQjhcdTMwQjlcdTMwQkFcdTMwQkJcdTMwQkNcdTMwQkRcdTMwQkUiKwotICAgICAgICAiXHUzMEJGXHUzMEMwXHUzMEMxXHUzMEMyXHUzMEMzXHUzMEM0XHUzMEM1XHUzMEM2IisKLSAgICAgICAgIlx1MzBDN1x1MzBDOFx1MzBDOVx1MzBDQVx1MzBDQlx1MzBDQ1x1MzBDRFx1MzBDRSIrCi0gICAgICAgICJcdTMwQ0ZcdTMwRDBcdTMwRDFcdTMwRDJcdTMwRDNcdTMwRDRcdTMwRDVcdTMwRDYiKwotICAgICAgICAiXHUzMEQ3XHUzMEQ4XHUzMEQ5XHUzMERBXHUzMERCXHUzMERDXHUzMEREXHUzMERFIisKLSAgICAgICAgIlx1MzBERlx1MzBFMFx1MzBFMVx1MzBFMlx1MzBFM1x1MzBFNFx1MzBFNVx1MzBFNiIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHUzMEU3XHUzMEU4XHUzMEU5XHUzMEVBXHUzMEVCXHUzMEVDIisKLSAgICAgICAgIlx1MzBFRFx1MzBFRVx1MzBFRlx1MzBGMFx1MzBGMVx1MzBGMlx1MzBGM1x1MzBGNCIrCi0gICAgICAgICJcdTMwRjVcdTMwRjZcdTA0MTRcdTA0MTVcdTA0MDFcdTA0MTZcdTA0MTdcdTA0MTgiKwotICAgICAgICAiXHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDIzXHUwNDI0XHUwNDI1XHUwNDI2IisKLSAgICAgICAgIlx1MDQyN1x1MDQyOFx1MDQyOVx1MDQyQVx1MDQyQlx1MDQyQ1x1MDQyRFx1MDQyRSIrCi0gICAgICAgICJcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0NTEiKwotICAgICAgICAiXHUwNDM2XHUwNDM3XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEIisKLSAgICAgICAgIlx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQ0NFx1MDQ0NSIrCi0gICAgICAgICJcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NEQiKwotICAgICAgICAiXHUwNDRFXHUwNDRGXHUyNDYwXHUyNDYxXHUyNDYyXHUyNDYzXHUyNDY0XHUyNDY1IisKLSAgICAgICAgIlx1MjQ2Nlx1MjQ2N1x1MjQ2OFx1MjQ2OVx1MjQ3NFx1MjQ3NVx1MjQ3Nlx1MjQ3NyIrCi0gICAgICAgICJcdTI0NzhcdTI0NzlcdTI0N0FcdTI0N0JcdTI0N0NcdTI0N0RcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHU0RTQyXHU0RTVDXHU1MUY1XHU1MzFBXHU1MzgyXHU0RTA3XHU0RTBDXHU0RTQ3IisKLSAgICAgICAgIlx1NEU4RFx1NTZEN1x1RkEwQ1x1NUM2RVx1NUY3M1x1NEUwRlx1NTE4N1x1NEUwRSIrCi0gICAgICAgICJcdTRFMkVcdTRFOTNcdTRFQzJcdTRFQzlcdTRFQzhcdTUxOThcdTUyRkNcdTUzNkMiKwotICAgICAgICAiXHU1M0I5XHU1NzIwXHU1OTAzXHU1OTJDXHU1QzEwXHU1REZGXHU2NUUxXHU2QkIzIisKLSAgICAgICAgIlx1NkJDQ1x1NkMxNFx1NzIzRlx1NEUzMVx1NEUzQ1x1NEVFOFx1NEVEQ1x1NEVFOSIrCi0gICAgICAgICJcdTRFRTFcdTRFRERcdTRFREFcdTUyMENcdTUzMUNcdTUzNENcdTU3MjJcdTU3MjMiKwotICAgICAgICAiXHU1OTE3XHU1OTJGXHU1QjgxXHU1Qjg0XHU1QzEyXHU1QzNCXHU1Qzc0XHU1QzczIisKLSAgICAgICAgIlx1NUUwNFx1NUU4MFx1NUU4Mlx1NUZDOVx1NjIwOVx1NjI1MFx1NkMxNVx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHU2QzM2XHU2QzQzXHU2QzNGXHU2QzNCXHU3MkFFXHU3MkIwXHU3MzhBIisKLSAgICAgICAgIlx1NzlCOFx1ODA4QVx1OTYxRVx1NEYwRVx1NEYxOFx1NEYyQ1x1NEVGNVx1NEYxNCIrCi0gICAgICAgICJcdTRFRjFcdTRGMDBcdTRFRjdcdTRGMDhcdTRGMURcdTRGMDJcdTRGMDVcdTRGMjIiKwotICAgICAgICAiXHU0RjEzXHU0RjA0XHU0RUY0XHU0RjEyXHU1MUIxXHU1MjEzXHU1MjA5XHU1MjEwIisKLSAgICAgICAgIlx1NTJBNlx1NTMyMlx1NTMxRlx1NTM0RFx1NTM4QVx1NTQwN1x1NTZFMVx1NTZERiIrCi0gICAgICAgICJcdTU3MkVcdTU3MkFcdTU3MzRcdTU5M0NcdTU5ODBcdTU5N0NcdTU5ODVcdTU5N0IiKwotICAgICAgICAiXHU1OTdFXHU1OTc3XHU1OTdGXHU1QjU2XHU1QzE1XHU1QzI1XHU1QzdDXHU1QzdBIisKLSAgICAgICAgIlx1NUM3Qlx1NUM3RVx1NURERlx1NUU3NVx1NUU4NFx1NUYwMlx1NUYxQVx1NUY3NCIrCi0gICAgICAgICJcdTVGRDVcdTVGRDRcdTVGQ0ZcdTYyNUNcdTYyNUVcdTYyNjRcdTYyNjFcdTYyNjYiKwotICAgICAgICAiXHU2MjYyXHU2MjU5XHU2MjYwXHU2MjVBXHU2MjY1XHU2NUVGXHU2NUVFXHU2NzNFIisKLSAgICAgICAgIlx1NjczOVx1NjczOFx1NjczQlx1NjczQVx1NjczRlx1NjczQ1x1NjczM1x1NkMxOCIrCi0gICAgICAgICJcdTZDNDZcdTZDNTJcdTZDNUNcdTZDNEZcdTZDNEFcdTZDNTRcdTZDNEJcdTZDNEMiKwotICAgICAgICAiXHU3MDcxXHU3MjVFXHU3MkI0XHU3MkI1XHU3MzhFXHU3NTJBXHU3NjdGXHU3QTc1IisKLSAgICAgICAgIlx1N0Y1MVx1ODI3OFx1ODI3Q1x1ODI4MFx1ODI3RFx1ODI3Rlx1ODY0RFx1ODk3RSIrCi0gICAgICAgICJcdTkwOTlcdTkwOTdcdTkwOThcdTkwOUJcdTkwOTRcdTk2MjJcdTk2MjRcdTk2MjAiKwotICAgICAgICAiXHU5NjIzXHU0RjU2XHU0RjNCXHU0RjYyXHU0RjQ5XHU0RjUzXHU0RjY0XHU0RjNFIisKLSAgICAgICAgIlx1NEY2N1x1NEY1Mlx1NEY1Rlx1NEY0MVx1NEY1OFx1NEYyRFx1NEYzM1x1NEYzRiIrCi0gICAgICAgICJcdTRGNjFcdTUxOEZcdTUxQjlcdTUyMUNcdTUyMUVcdTUyMjFcdTUyQURcdTUyQUUiKwotICAgICAgICAiXHU1MzA5XHU1MzYzXHU1MzcyXHU1MzhFXHU1MzhGXHU1NDMwXHU1NDM3XHU1NDJBIisKLSAgICAgICAgIlx1NTQ1NFx1NTQ0NVx1NTQxOVx1NTQxQ1x1NTQyNVx1NTQxOFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHU1NDNEXHU1NDRGXHU1NDQxXHU1NDI4XHU1NDI0XHU1NDQ3XHU1NkVFXHU1NkU3IisKLSAgICAgICAgIlx1NTZFNVx1NTc0MVx1NTc0NVx1NTc0Q1x1NTc0OVx1NTc0Qlx1NTc1Mlx1NTkwNiIrCi0gICAgICAgICJcdTU5NDBcdTU5QTZcdTU5OThcdTU5QTBcdTU5OTdcdTU5OEVcdTU5QTJcdTU5OTAiKwotICAgICAgICAiXHU1OThGXHU1OUE3XHU1OUExXHU1QjhFXHU1QjkyXHU1QzI4XHU1QzJBXHU1QzhEIisKLSAgICAgICAgIlx1NUM4Rlx1NUM4OFx1NUM4Qlx1NUM4OVx1NUM5Mlx1NUM4QVx1NUM4Nlx1NUM5MyIrCi0gICAgICAgICJcdTVDOTVcdTVERTBcdTVFMEFcdTVFMEVcdTVFOEJcdTVFODlcdTVFOENcdTVFODgiKwotICAgICAgICAiXHU1RThEXHU1RjA1XHU1RjFEXHU1Rjc4XHU1Rjc2XHU1RkQyXHU1RkQxXHU1RkQwIisKLSAgICAgICAgIlx1NUZFRFx1NUZFOFx1NUZFRVx1NUZGM1x1NUZFMVx1NUZFNFx1NUZFM1x1NUZGQSIrCi0gICAgICAgICJcdTVGRUZcdTVGRjdcdTVGRkJcdTYwMDBcdTVGRjRcdTYyM0FcdTYyODNcdTYyOEMiKwotICAgICAgICAiXHU2MjhFXHU2MjhGXHU2Mjk0XHU2Mjg3XHU2MjcxXHU2MjdCXHU2MjdBXHU2MjcwIisKLSAgICAgICAgIlx1NjI4MVx1NjI4OFx1NjI3N1x1NjI3RFx1NjI3Mlx1NjI3NFx1NjUzN1x1NjVGMCIrCi0gICAgICAgICJcdTY1RjRcdTY1RjNcdTY1RjJcdTY1RjVcdTY3NDVcdTY3NDdcdTY3NTlcdTY3NTUiKwotICAgICAgICAiXHU2NzRDXHU2NzQ4XHU2NzVEXHU2NzREXHU2NzVBXHU2NzRCXHU2QkQwXHU2QzE5IisKLSAgICAgICAgIlx1NkMxQVx1NkM3OFx1NkM2N1x1NkM2Qlx1NkM4NFx1NkM4Qlx1NkM4Rlx1NkM3MSIrCi0gICAgICAgICJcdTZDNkZcdTZDNjlcdTZDOUFcdTZDNkRcdTZDODdcdTZDOTVcdTZDOUNcdTZDNjYiKwotICAgICAgICAiXHU2QzczXHU2QzY1XHU2QzdCXHU2QzhFXHU3MDc0XHU3MDdBXHU3MjYzXHU3MkJGIisKLSAgICAgICAgIlx1NzJCRFx1NzJDM1x1NzJDNlx1NzJDMVx1NzJCQVx1NzJDNVx1NzM5NVx1NzM5NyIrCi0gICAgICAgICJcdTczOTNcdTczOTRcdTczOTJcdTc1M0FcdTc1MzlcdTc1OTRcdTc1OTVcdTc2ODEiKwotICAgICAgICAiXHU3OTNEXHU4MDM0XHU4MDk1XHU4MDk5XHU4MDkwXHU4MDkyXHU4MDlDXHU4MjkwIisKLSAgICAgICAgIlx1ODI4Rlx1ODI4NVx1ODI4RVx1ODI5MVx1ODI5M1x1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTgyOEEiKwotICAgICAgICAiXHU4MjgzXHU4Mjg0XHU4Qzc4XHU4RkM5XHU4RkJGXHU5MDlGXHU5MEExXHU5MEE1IisKLSAgICAgICAgIlx1OTA5RVx1OTBBN1x1OTBBMFx1OTYzMFx1OTYyOFx1OTYyRlx1OTYyRFx1NEUzMyIrCi0gICAgICAgICJcdTRGOThcdTRGN0NcdTRGODVcdTRGN0RcdTRGODBcdTRGODdcdTRGNzZcdTRGNzQiKwotICAgICAgICAiXHU0Rjg5XHU0Rjg0XHU0Rjc3XHU0RjRDXHU0Rjk3XHU0RjZBXHU0RjlBXHU0Rjc5IisKLSAgICAgICAgIlx1NEY4MVx1NEY3OFx1NEY5MFx1NEY5Q1x1NEY5NFx1NEY5RVx1NEY5Mlx1NEY4MiIrCi0gICAgICAgICJcdTRGOTVcdTRGNkJcdTRGNkVcdTUxOUVcdTUxQkNcdTUxQkVcdTUyMzVcdTUyMzIiKwotICAgICAgICAiXHU1MjMzXHU1MjQ2XHU1MjMxXHU1MkJDXHU1MzBBXHU1MzBCXHU1MzNDXHU1MzkyIisKLSAgICAgICAgIlx1NTM5NFx1NTQ4N1x1NTQ3Rlx1NTQ4MVx1NTQ5MVx1NTQ4Mlx1NTQ4OFx1NTQ2QiIrCi0gICAgICAgICJcdTU0N0FcdTU0N0VcdTU0NjVcdTU0NkNcdTU0NzRcdTU0NjZcdTU0OERcdTU0NkYiKwotICAgICAgICAiXHU1NDYxXHU1NDYwXHU1NDk4XHU1NDYzXHU1NDY3XHU1NDY0XHU1NkY3XHU1NkY5IisKLSAgICAgICAgIlx1NTc2Rlx1NTc3Mlx1NTc2RFx1NTc2Qlx1NTc3MVx1NTc3MFx1NTc3Nlx1NTc4MCIrCi0gICAgICAgICJcdTU3NzVcdTU3N0JcdTU3NzNcdTU3NzRcdTU3NjJcdTU3NjhcdTU3N0RcdTU5MEMiKwotICAgICAgICAiXHU1OTQ1XHU1OUI1XHU1OUJBXHU1OUNGXHU1OUNFXHU1OUIyXHU1OUNDXHU1OUMxIisKLSAgICAgICAgIlx1NTlCNlx1NTlCQ1x1NTlDM1x1NTlENlx1NTlCMVx1NTlCRFx1NTlDMFx1NTlDOCIrCi0gICAgICAgICJcdTU5QjRcdTU5QzdcdTVCNjJcdTVCNjVcdTVCOTNcdTVCOTVcdTVDNDRcdTVDNDciKwotICAgICAgICAiXHU1Q0FFXHU1Q0E0XHU1Q0EwXHU1Q0I1XHU1Q0FGXHU1Q0E4XHU1Q0FDXHU1QzlGIisKLSAgICAgICAgIlx1NUNBM1x1NUNBRFx1NUNBMlx1NUNBQVx1NUNBN1x1NUM5RFx1NUNBNVx1NUNCNiIrCi0gICAgICAgICJcdTVDQjBcdTVDQTZcdTVFMTdcdTVFMTRcdTVFMTlcdTVGMjhcdTVGMjJcdTVGMjMiKwotICAgICAgICAiXHU1RjI0XHU1RjU0XHU1RjgyXHU1RjdFXHU1RjdEXHU1RkRFXHU1RkU1XHU2MDJEIisKLSAgICAgICAgIlx1NjAyNlx1NjAxOVx1NjAzMlx1NjAwQlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTYwMzRcdTYwMEEiKwotICAgICAgICAiXHU2MDE3XHU2MDMzXHU2MDFBXHU2MDFFXHU2MDJDXHU2MDIyXHU2MDBEXHU2MDEwIisKLSAgICAgICAgIlx1NjAyRVx1NjAxM1x1NjAxMVx1NjAwQ1x1NjAwOVx1NjAxQ1x1NjIxNFx1NjIzRCIrCi0gICAgICAgICJcdTYyQURcdTYyQjRcdTYyRDFcdTYyQkVcdTYyQUFcdTYyQjZcdTYyQ0FcdTYyQUUiKwotICAgICAgICAiXHU2MkIzXHU2MkFGXHU2MkJCXHU2MkE5XHU2MkIwXHU2MkI4XHU2NTNEXHU2NUE4IisKLSAgICAgICAgIlx1NjVCQlx1NjYwOVx1NjVGQ1x1NjYwNFx1NjYxMlx1NjYwOFx1NjVGQlx1NjYwMyIrCi0gICAgICAgICJcdTY2MEJcdTY2MERcdTY2MDVcdTY1RkRcdTY2MTFcdTY2MTBcdTY2RjZcdTY3MEEiKwotICAgICAgICAiXHU2Nzg1XHU2NzZDXHU2NzhFXHU2NzkyXHU2Nzc2XHU2NzdCXHU2Nzk4XHU2Nzg2IisKLSAgICAgICAgIlx1Njc4NFx1Njc3NFx1Njc4RFx1Njc4Q1x1Njc3QVx1Njc5Rlx1Njc5MVx1Njc5OSIrCi0gICAgICAgICJcdTY3ODNcdTY3N0RcdTY3ODFcdTY3NzhcdTY3NzlcdTY3OTRcdTZCMjVcdTZCODAiKwotICAgICAgICAiXHU2QjdFXHU2QkRFXHU2QzFEXHU2QzkzXHU2Q0VDXHU2Q0VCXHU2Q0VFXHU2Q0Q5IisKLSAgICAgICAgIlx1NkNCNlx1NkNENFx1NkNBRFx1NkNFN1x1NkNCN1x1NkNEMFx1NkNDMlx1NkNCQSIrCi0gICAgICAgICJcdTZDQzNcdTZDQzZcdTZDRURcdTZDRjJcdTZDRDJcdTZDRERcdTZDQjRcdTZDOEEiKwotICAgICAgICAiXHU2QzlEXHU2QzgwXHU2Q0RFXHU2Q0MwXHU2RDMwXHU2Q0NEXHU2Q0M3XHU2Q0IwIisKLSAgICAgICAgIlx1NkNGOVx1NkNDRlx1NkNFOVx1NkNEMVx1NzA5NFx1NzA5OFx1NzA4NVx1NzA5MyIrCi0gICAgICAgICJcdTcwODZcdTcwODRcdTcwOTFcdTcwOTZcdTcwODJcdTcwOUFcdTcwODNcdTcyNkEiKwotICAgICAgICAiXHU3MkQ2XHU3MkNCXHU3MkQ4XHU3MkM5XHU3MkRDXHU3MkQyXHU3MkQ0XHU3MkRBIisKLSAgICAgICAgIlx1NzJDQ1x1NzJEMVx1NzNBNFx1NzNBMVx1NzNBRFx1NzNBNlx1NzNBMlx1NzNBMCIrCi0gICAgICAgICJcdTczQUNcdTczOURcdTc0RERcdTc0RThcdTc1M0ZcdTc1NDBcdTc1M0VcdTc1OEMiKwotICAgICAgICAiXHU3NTk4XHU3NkFGXHU3NkYzXHU3NkYxXHU3NkYwXHU3NkY1XHU3N0Y4XHU3N0ZDIisKLSAgICAgICAgIlx1NzdGOVx1NzdGQlx1NzdGQVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTc3RjdcdTc5NDJcdTc5M0YiKwotICAgICAgICAiXHU3OUM1XHU3QTc4XHU3QTdCXHU3QUZCXHU3Qzc1XHU3Q0ZEXHU4MDM1XHU4MDhGIisKLSAgICAgICAgIlx1ODBBRVx1ODBBM1x1ODBCOFx1ODBCNVx1ODBBRFx1ODIyMFx1ODJBMFx1ODJDMCIrCi0gICAgICAgICJcdTgyQUJcdTgyOUFcdTgyOThcdTgyOUJcdTgyQjVcdTgyQTdcdTgyQUVcdTgyQkMiKwotICAgICAgICAiXHU4MjlFXHU4MkJBXHU4MkI0XHU4MkE4XHU4MkExXHU4MkE5XHU4MkMyXHU4MkE0IisKLSAgICAgICAgIlx1ODJDM1x1ODJCNlx1ODJBMlx1ODY3MFx1ODY2Rlx1ODY2RFx1ODY2RVx1OEM1NiIrCi0gICAgICAgICJcdThGRDJcdThGQ0JcdThGRDNcdThGQ0RcdThGRDZcdThGRDVcdThGRDdcdTkwQjIiKwotICAgICAgICAiXHU5MEI0XHU5MEFGXHU5MEIzXHU5MEIwXHU5NjM5XHU5NjNEXHU5NjNDXHU5NjNBIisKLSAgICAgICAgIlx1OTY0M1x1NEZDRFx1NEZDNVx1NEZEM1x1NEZCMlx1NEZDOVx1NEZDQlx1NEZDMSIrCi0gICAgICAgICJcdTRGRDRcdTRGRENcdTRGRDlcdTRGQkJcdTRGQjNcdTRGREJcdTRGQzdcdTRGRDYiKwotICAgICAgICAiXHU0RkJBXHU0RkMwXHU0RkI5XHU0RkVDXHU1MjQ0XHU1MjQ5XHU1MkMwXHU1MkMyIisKLSAgICAgICAgIlx1NTMzRFx1NTM3Q1x1NTM5N1x1NTM5Nlx1NTM5OVx1NTM5OFx1NTRCQVx1NTRBMSIrCi0gICAgICAgICJcdTU0QURcdTU0QTVcdTU0Q0ZcdTU0QzNcdTgzMERcdTU0QjdcdTU0QUVcdTU0RDYiKwotICAgICAgICAiXHU1NEI2XHU1NEM1XHU1NEM2XHU1NEEwXHU1NDcwXHU1NEJDXHU1NEEyXHU1NEJFIisKLSAgICAgICAgIlx1NTQ3Mlx1NTRERVx1NTRCMFx1NTdCNVx1NTc5RVx1NTc5Rlx1NTdBNFx1NTc4QyIrCi0gICAgICAgICJcdTU3OTdcdTU3OURcdTU3OUJcdTU3OTRcdTU3OThcdTU3OEZcdTU3OTlcdTU3QTUiKwotICAgICAgICAiXHU1NzlBXHU1Nzk1XHU1OEY0XHU1OTBEXHU1OTUzXHU1OUUxXHU1OURFXHU1OUVFIisKLSAgICAgICAgIlx1NUEwMFx1NTlGMVx1NTlERFx1NTlGQVx1NTlGRFx1NTlGQ1x1NTlGNlx1NTlFNCIrCi0gICAgICAgICJcdTU5RjJcdTU5RjdcdTU5REJcdTU5RTlcdTU5RjNcdTU5RjVcdTU5RTBcdTU5RkUiKwotICAgICAgICAiXHU1OUY0XHU1OUVEXHU1QkE4XHU1QzRDXHU1Q0QwXHU1Q0Q4XHU1Q0NDXHU1Q0Q3IisKLSAgICAgICAgIlx1NUNDQlx1NUNEQlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTVDREVcdTVDREFcdTVDQzlcdTVDQzciKwotICAgICAgICAiXHU1Q0NBXHU1Q0Q2XHU1Q0QzXHU1Q0Q0XHU1Q0NGXHU1Q0M4XHU1Q0M2XHU1Q0NFIisKLSAgICAgICAgIlx1NUNERlx1NUNGOFx1NURGOVx1NUUyMVx1NUUyMlx1NUUyM1x1NUUyMFx1NUUyNCIrCi0gICAgICAgICJcdTVFQjBcdTVFQTRcdTVFQTJcdTVFOUJcdTVFQTNcdTVFQTVcdTVGMDdcdTVGMkUiKwotICAgICAgICAiXHU1RjU2XHU1Rjg2XHU2MDM3XHU2MDM5XHU2MDU0XHU2MDcyXHU2MDVFXHU2MDQ1IisKLSAgICAgICAgIlx1NjA1M1x1NjA0N1x1NjA0OVx1NjA1Qlx1NjA0Q1x1NjA0MFx1NjA0Mlx1NjA1RiIrCi0gICAgICAgICJcdTYwMjRcdTYwNDRcdTYwNThcdTYwNjZcdTYwNkVcdTYyNDJcdTYyNDNcdTYyQ0YiKwotICAgICAgICAiXHU2MzBEXHU2MzBCXHU2MkY1XHU2MzBFXHU2MzAzXHU2MkVCXHU2MkY5XHU2MzBGIisKLSAgICAgICAgIlx1NjMwQ1x1NjJGOFx1NjJGNlx1NjMwMFx1NjMxM1x1NjMxNFx1NjJGQVx1NjMxNSIrCi0gICAgICAgICJcdTYyRkJcdTYyRjBcdTY1NDFcdTY1NDNcdTY1QUFcdTY1QkZcdTY2MzZcdTY2MjEiKwotICAgICAgICAiXHU2NjMyXHU2NjM1XHU2NjFDXHU2NjI2XHU2NjIyXHU2NjMzXHU2NjJCXHU2NjNBIisKLSAgICAgICAgIlx1NjYxRFx1NjYzNFx1NjYzOVx1NjYyRVx1NjcwRlx1NjcxMFx1NjdDMVx1NjdGMiIrCi0gICAgICAgICJcdTY3QzhcdTY3QkFcdTY3RENcdTY3QkJcdTY3RjhcdTY3RDhcdTY3QzBcdTY3QjciKwotICAgICAgICAiXHU2N0M1XHU2N0VCXHU2N0U0XHU2N0RGXHU2N0I1XHU2N0NEXHU2N0IzXHU2N0Y3IisKLSAgICAgICAgIlx1NjdGNlx1NjdFRVx1NjdFM1x1NjdDMlx1NjdCOVx1NjdDRVx1NjdFN1x1NjdGMCIrCi0gICAgICAgICJcdTY3QjJcdTY3RkNcdTY3QzZcdTY3RURcdTY3Q0NcdTY3QUVcdTY3RTZcdTY3REIiKwotICAgICAgICAiXHU2N0ZBXHU2N0M5XHU2N0NBXHU2N0MzXHU2N0VBXHU2N0NCXHU2QjI4XHU2QjgyIisKLSAgICAgICAgIlx1NkI4NFx1NkJCNlx1NkJENlx1NkJEOFx1NkJFMFx1NkMyMFx1NkMyMVx1NkQyOCIrCi0gICAgICAgICJcdTZEMzRcdTZEMkRcdTZEMUZcdTZEM0NcdTZEM0ZcdTZEMTJcdTZEMEFcdTZDREEiKwotICAgICAgICAiXHU2RDMzXHU2RDA0XHU2RDE5XHU2RDNBXHU2RDFBXHU2RDExXHU2RDAwXHU2RDFEIisKLSAgICAgICAgIlx1NkQ0Mlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdTZEMDFcdTZEMThcdTZEMzdcdTZEMDNcdTZEMEYiKwotICAgICAgICAiXHU2RDQwXHU2RDA3XHU2RDIwXHU2RDJDXHU2RDA4XHU2RDIyXHU2RDA5XHU2RDEwIisKLSAgICAgICAgIlx1NzBCN1x1NzA5Rlx1NzBCRVx1NzBCMVx1NzBCMFx1NzBBMVx1NzBCNFx1NzBCNSIrCi0gICAgICAgICJcdTcwQTlcdTcyNDFcdTcyNDlcdTcyNEFcdTcyNkNcdTcyNzBcdTcyNzNcdTcyNkUiKwotICAgICAgICAiXHU3MkNBXHU3MkU0XHU3MkU4XHU3MkVCXHU3MkRGXHU3MkVBXHU3MkU2XHU3MkUzIisKLSAgICAgICAgIlx1NzM4NVx1NzNDQ1x1NzNDMlx1NzNDOFx1NzNDNVx1NzNCOVx1NzNCNlx1NzNCNSIrCi0gICAgICAgICJcdTczQjRcdTczRUJcdTczQkZcdTczQzdcdTczQkVcdTczQzNcdTczQzZcdTczQjgiKwotICAgICAgICAiXHU3M0NCXHU3NEVDXHU3NEVFXHU3NTJFXHU3NTQ3XHU3NTQ4XHU3NUE3XHU3NUFBIisKLSAgICAgICAgIlx1NzY3OVx1NzZDNFx1NzcwOFx1NzcwM1x1NzcwNFx1NzcwNVx1NzcwQVx1NzZGNyIrCi0gICAgICAgICJcdTc2RkJcdTc2RkFcdTc3RTdcdTc3RThcdTc4MDZcdTc4MTFcdTc4MTJcdTc4MDUiKwotICAgICAgICAiXHU3ODEwXHU3ODBGXHU3ODBFXHU3ODA5XHU3ODAzXHU3ODEzXHU3OTRBXHU3OTRDIisKLSAgICAgICAgIlx1Nzk0Qlx1Nzk0NVx1Nzk0NFx1NzlENVx1NzlDRFx1NzlDRlx1NzlENlx1NzlDRSIrCi0gICAgICAgICJcdTdBODBcdTdBN0VcdTdBRDFcdTdCMDBcdTdCMDFcdTdDN0FcdTdDNzhcdTdDNzkiKwotICAgICAgICAiXHU3QzdGXHU3QzgwXHU3QzgxXHU3RDAzXHU3RDA4XHU3RDAxXHU3RjU4XHU3RjkxIisKLSAgICAgICAgIlx1N0Y4RFx1N0ZCRVx1ODAwN1x1ODAwRVx1ODAwRlx1ODAxNFx1ODAzN1x1ODBEOCIrCi0gICAgICAgICJcdTgwQzdcdTgwRTBcdTgwRDFcdTgwQzhcdTgwQzJcdTgwRDBcdTgwQzVcdTgwRTMiKwotICAgICAgICAiXHU4MEQ5XHU4MERDXHU4MENBXHU4MEQ1XHU4MEM5XHU4MENGXHU4MEQ3XHU4MEU2IisKLSAgICAgICAgIlx1ODBDRFx1ODFGRlx1ODIyMVx1ODI5NFx1ODJEOVx1ODJGRVx1ODJGOVx1ODMwNyIrCi0gICAgICAgICJcdTgyRThcdTgzMDBcdTgyRDVcdTgzM0FcdTgyRUJcdTgyRDZcdTgyRjRcdTgyRUMiKwotICAgICAgICAiXHU4MkUxXHU4MkYyXHU4MkY1XHU4MzBDXHU4MkZCXHU4MkY2XHU4MkYwXHU4MkVBIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdTgyRTRcdTgyRTBcdTgyRkFcdTgyRjNcdTgyRURcdTg2NzciKwotICAgICAgICAiXHU4Njc0XHU4NjdDXHU4NjczXHU4ODQxXHU4ODRFXHU4ODY3XHU4ODZBXHU4ODY5IisKLSAgICAgICAgIlx1ODlEM1x1OEEwNFx1OEEwN1x1OEQ3Mlx1OEZFM1x1OEZFMVx1OEZFRVx1OEZFMCIrCi0gICAgICAgICJcdTkwRjFcdTkwQkRcdTkwQkZcdTkwRDVcdTkwQzVcdTkwQkVcdTkwQzdcdTkwQ0IiKwotICAgICAgICAiXHU5MEM4XHU5MUQ0XHU5MUQzXHU5NjU0XHU5NjRGXHU5NjUxXHU5NjUzXHU5NjRBIisKLSAgICAgICAgIlx1OTY0RVx1NTAxRVx1NTAwNVx1NTAwN1x1NTAxM1x1NTAyMlx1NTAzMFx1NTAxQiIrCi0gICAgICAgICJcdTRGRjVcdTRGRjRcdTUwMzNcdTUwMzdcdTUwMkNcdTRGRjZcdTRGRjdcdTUwMTciKwotICAgICAgICAiXHU1MDFDXHU1MDIwXHU1MDI3XHU1MDM1XHU1MDJGXHU1MDMxXHU1MDBFXHU1MTVBIisKLSAgICAgICAgIlx1NTE5NFx1NTE5M1x1NTFDQVx1NTFDNFx1NTFDNVx1NTFDOFx1NTFDRVx1NTI2MSIrCi0gICAgICAgICJcdTUyNUFcdTUyNTJcdTUyNUVcdTUyNUZcdTUyNTVcdTUyNjJcdTUyQ0RcdTUzMEUiKwotICAgICAgICAiXHU1MzlFXHU1NTI2XHU1NEUyXHU1NTE3XHU1NTEyXHU1NEU3XHU1NEYzXHU1NEU0IisKLSAgICAgICAgIlx1NTUxQVx1NTRGRlx1NTUwNFx1NTUwOFx1NTRFQlx1NTUxMVx1NTUwNVx1NTRGMSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaW5uZXJJbmRleDM9Ci0gICAgICAgICJcdTU1MEFcdTU0RkJcdTU0RjdcdTU0RjhcdTU0RTBcdTU1MEVcdTU1MDNcdTU1MEIiKwotICAgICAgICAiXHU1NzAxXHU1NzAyXHU1N0NDXHU1ODMyXHU1N0Q1XHU1N0QyXHU1N0JBXHU1N0M2IisKLSAgICAgICAgIlx1NTdCRFx1NTdCQ1x1NTdCOFx1NTdCNlx1NTdCRlx1NTdDN1x1NTdEMFx1NTdCOSIrCi0gICAgICAgICJcdTU3QzFcdTU5MEVcdTU5NEFcdTVBMTlcdTVBMTZcdTVBMkRcdTVBMkVcdTVBMTUiKwotICAgICAgICAiXHU1QTBGXHU1QTE3XHU1QTBBXHU1QTFFXHU1QTMzXHU1QjZDXHU1QkE3XHU1QkFEIisKLSAgICAgICAgIlx1NUJBQ1x1NUMwM1x1NUM1Nlx1NUM1NFx1NUNFQ1x1NUNGRlx1NUNFRVx1NUNGMSIrCi0gICAgICAgICJcdTVDRjdcdTVEMDBcdTVDRjlcdTVFMjlcdTVFMjhcdTVFQThcdTVFQUVcdTVFQUEiKwotICAgICAgICAiXHU1RUFDXHU1RjMzXHU1RjMwXHU1RjY3XHU2MDVEXHU2MDVBXHU2MDY3XHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdTYwNDFcdTYwQTJcdTYwODhcdTYwODBcdTYwOTJcdTYwODFcdTYwOUQiKwotICAgICAgICAiXHU2MDgzXHU2MDk1XHU2MDlCXHU2MDk3XHU2MDg3XHU2MDlDXHU2MDhFXHU2MjE5IisKLSAgICAgICAgIlx1NjI0Nlx1NjJGMlx1NjMxMFx1NjM1Nlx1NjMyQ1x1NjM0NFx1NjM0NVx1NjMzNiIrCi0gICAgICAgICJcdTYzNDNcdTYzRTRcdTYzMzlcdTYzNEJcdTYzNEFcdTYzM0NcdTYzMjlcdTYzNDEiKwotICAgICAgICAiXHU2MzM0XHU2MzU4XHU2MzU0XHU2MzU5XHU2MzJEXHU2MzQ3XHU2MzMzXHU2MzVBIisKLSAgICAgICAgIlx1NjM1MVx1NjMzOFx1NjM1N1x1NjM0MFx1NjM0OFx1NjU0QVx1NjU0Nlx1NjVDNiIrCi0gICAgICAgICJcdTY1QzNcdTY1QzRcdTY1QzJcdTY2NEFcdTY2NUZcdTY2NDdcdTY2NTFcdTY3MTIiKwotICAgICAgICAiXHU2NzEzXHU2ODFGXHU2ODFBXHU2ODQ5XHU2ODMyXHU2ODMzXHU2ODNCXHU2ODRCIisKLSAgICAgICAgIlx1Njg0Rlx1NjgxNlx1NjgzMVx1NjgxQ1x1NjgzNVx1NjgyQlx1NjgyRFx1NjgyRiIrCi0gICAgICAgICJcdTY4NEVcdTY4NDRcdTY4MzRcdTY4MURcdTY4MTJcdTY4MTRcdTY4MjZcdTY4MjgiKwotICAgICAgICAiXHU2ODJFXHU2ODREXHU2ODNBXHU2ODI1XHU2ODIwXHU2QjJDXHU2QjJGXHU2QjJEIisKLSAgICAgICAgIlx1NkIzMVx1NkIzNFx1NkI2RFx1ODA4Mlx1NkI4OFx1NkJFNlx1NkJFNFx1NkJFOCIrCi0gICAgICAgICJcdTZCRTNcdTZCRTJcdTZCRTdcdTZDMjVcdTZEN0FcdTZENjNcdTZENjRcdTZENzYiKwotICAgICAgICAiXHU2RDBEXHU2RDYxXHU2RDkyXHU2RDU4XHU2RDYyXHU2RDZEXHU2RDZGXHU2RDkxIisKLSAgICAgICAgIlx1NkQ4RFx1NkRFRlx1NkQ3Rlx1NkQ4Nlx1NkQ1RVx1NkQ2N1x1NkQ2MFx1NkQ5NyIrCi0gICAgICAgICJcdTZENzBcdTZEN0NcdTZENUZcdTZEODJcdTZEOThcdTZEMkZcdTZENjhcdTZEOEIiKwotICAgICAgICAiXHU2RDdFXHU2RDgwXHU2RDg0XHU2RDE2XHU2RDgzXHU2RDdCXHU2RDdEXHU2RDc1IisKLSAgICAgICAgIlx1NkQ5MFx1NzBEQ1x1NzBEM1x1NzBEMVx1NzBERFx1NzBDQlx1N0YzOVx1NzBFMiIrCi0gICAgICAgICJcdTcwRDdcdTcwRDJcdTcwREVcdTcwRTBcdTcwRDRcdTcwQ0RcdTcwQzVcdTcwQzYiKwotICAgICAgICAiXHU3MEM3XHU3MERBXHU3MENFXHU3MEUxXHU3MjQyXHU3Mjc4XHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdTcyNzdcdTcyNzZcdTczMDBcdTcyRkFcdTcyRjRcdTcyRkVcdTcyRjZcdTcyRjMiKwotICAgICAgICAiXHU3MkZCXHU3MzAxXHU3M0QzXHU3M0Q5XHU3M0U1XHU3M0Q2XHU3M0JDXHU3M0U3IisKLSAgICAgICAgIlx1NzNFM1x1NzNFOVx1NzNEQ1x1NzNEMlx1NzNEQlx1NzNENFx1NzNERFx1NzNEQSIrCi0gICAgICAgICJcdTczRDdcdTczRDhcdTczRThcdTc0REVcdTc0REZcdTc0RjRcdTc0RjVcdTc1MjEiKwotICAgICAgICAiXHU3NTVCXHU3NTVGXHU3NUIwXHU3NUMxXHU3NUJCXHU3NUM0XHU3NUMwXHU3NUJGIisKLSAgICAgICAgIlx1NzVCNlx1NzVCQVx1NzY4QVx1NzZDOVx1NzcxRFx1NzcxQlx1NzcxMFx1NzcxMyIrCi0gICAgICAgICJcdTc3MTJcdTc3MjNcdTc3MTFcdTc3MTVcdTc3MTlcdTc3MUFcdTc3MjJcdTc3MjciKwotICAgICAgICAiXHU3ODIzXHU3ODJDXHU3ODIyXHU3ODM1XHU3ODJGXHU3ODI4XHU3ODJFXHU3ODJCIisKLSAgICAgICAgIlx1NzgyMVx1NzgyOVx1NzgzM1x1NzgyQVx1NzgzMVx1Nzk1NFx1Nzk1Qlx1Nzk0RiIrCi0gICAgICAgICJcdTc5NUNcdTc5NTNcdTc5NTJcdTc5NTFcdTc5RUJcdTc5RUNcdTc5RTBcdTc5RUUiKwotICAgICAgICAiXHU3OUVEXHU3OUVBXHU3OURDXHU3OURFXHU3OUREXHU3QTg2XHU3QTg5XHU3QTg1IisKLSAgICAgICAgIlx1N0E4Qlx1N0E4Q1x1N0E4QVx1N0E4N1x1N0FEOFx1N0IxMFx1N0IwNFx1N0IxMyIrCi0gICAgICAgICJcdTdCMDVcdTdCMEZcdTdCMDhcdTdCMEFcdTdCMEVcdTdCMDlcdTdCMTJcdTdDODQiKwotICAgICAgICAiXHU3QzkxXHU3QzhBXHU3QzhDXHU3Qzg4XHU3QzhEXHU3Qzg1XHU3RDFFXHU3RDFEIisKLSAgICAgICAgIlx1N0QxMVx1N0QwRVx1N0QxOFx1N0QxNlx1N0QxM1x1N0QxRlx1N0QxMlx1N0QwRiIrCi0gICAgICAgICJcdTdEMENcdTdGNUNcdTdGNjFcdTdGNUVcdTdGNjBcdTdGNURcdTdGNUJcdTdGOTYiKwotICAgICAgICAiXHU3RjkyXHU3RkMzXHU3RkMyXHU3RkMwXHU4MDE2XHU4MDNFXHU4MDM5XHU4MEZBIisKLSAgICAgICAgIlx1ODBGMlx1ODBGOVx1ODBGNVx1ODEwMVx1ODBGQlx1ODEwMFx1ODIwMVx1ODIyRiIrCi0gICAgICAgICJcdTgyMjVcdTgzMzNcdTgzMkRcdTgzNDRcdTgzMTlcdTgzNTFcdTgzMjVcdTgzNTYiKwotICAgICAgICAiXHU4MzNGXHU4MzQxXHU4MzI2XHU4MzFDXHU4MzIyXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1ODM0MiIrCi0gICAgICAgICJcdTgzNEVcdTgzMUJcdTgzMkFcdTgzMDhcdTgzM0NcdTgzNERcdTgzMTZcdTgzMjQiKwotICAgICAgICAiXHU4MzIwXHU4MzM3XHU4MzJGXHU4MzI5XHU4MzQ3XHU4MzQ1XHU4MzRDXHU4MzUzIisKLSAgICAgICAgIlx1ODMxRVx1ODMyQ1x1ODM0Qlx1ODMyN1x1ODM0OFx1ODY1M1x1ODY1Mlx1ODZBMiIrCi0gICAgICAgICJcdTg2QThcdTg2OTZcdTg2OERcdTg2OTFcdTg2OUVcdTg2ODdcdTg2OTdcdTg2ODYiKwotICAgICAgICAiXHU4NjhCXHU4NjlBXHU4Njg1XHU4NkE1XHU4Njk5XHU4NkExXHU4NkE3XHU4Njk1IisKLSAgICAgICAgIlx1ODY5OFx1ODY4RVx1ODY5RFx1ODY5MFx1ODY5NFx1ODg0M1x1ODg0NFx1ODg2RCIrCi0gICAgICAgICJcdTg4NzVcdTg4NzZcdTg4NzJcdTg4ODBcdTg4NzFcdTg4N0ZcdTg4NkZcdTg4ODMiKwotICAgICAgICAiXHU4ODdFXHU4ODc0XHU4ODdDXHU4QTEyXHU4QzQ3XHU4QzU3XHU4QzdCXHU4Q0E0IisKLSAgICAgICAgIlx1OENBM1x1OEQ3Nlx1OEQ3OFx1OERCNVx1OERCN1x1OERCNlx1OEVEMVx1OEVEMyIrCi0gICAgICAgICJcdThGRkVcdThGRjVcdTkwMDJcdThGRkZcdThGRkJcdTkwMDRcdThGRkNcdThGRjYiKwotICAgICAgICAiXHU5MEQ2XHU5MEUwXHU5MEQ5XHU5MERBXHU5MEUzXHU5MERGXHU5MEU1XHU5MEQ4IisKLSAgICAgICAgIlx1OTBEQlx1OTBEN1x1OTBEQ1x1OTBFNFx1OTE1MFx1OTE0RVx1OTE0Rlx1OTFENSIrCi0gICAgICAgICJcdTkxRTJcdTkxREFcdTk2NUNcdTk2NUZcdTk2QkNcdTk4RTNcdTlBREZcdTlCMkYiKwotICAgICAgICAiXHU0RTdGXHU1MDcwXHU1MDZBXHU1MDYxXHU1MDVFXHU1MDYwXHU1MDUzXHU1MDRCIisKLSAgICAgICAgIlx1NTA1RFx1NTA3Mlx1NTA0OFx1NTA0RFx1NTA0MVx1NTA1Qlx1NTA0QVx1NTA2MiIrCi0gICAgICAgICJcdTUwMTVcdTUwNDVcdTUwNUZcdTUwNjlcdTUwNkJcdTUwNjNcdTUwNjRcdTUwNDYiKwotICAgICAgICAiXHU1MDQwXHU1MDZFXHU1MDczXHU1MDU3XHU1MDUxXHU1MUQwXHU1MjZCXHU1MjZEIisKLSAgICAgICAgIlx1NTI2Q1x1NTI2RVx1NTJENlx1NTJEM1x1NTMyRFx1NTM5Q1x1NTU3NVx1NTU3NiIrCi0gICAgICAgICJcdTU1M0NcdTU1NERcdTU1NTBcdTU1MzRcdTU1MkFcdTU1NTFcdTU1NjJcdTU1MzYiKwotICAgICAgICAiXHU1NTM1XHU1NTMwXHU1NTUyXHU1NTQ1XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NTUwQ1x1NTUzMiIrCi0gICAgICAgICJcdTU1NjVcdTU1NEVcdTU1MzlcdTU1NDhcdTU1MkRcdTU1M0JcdTU1NDBcdTU1NEIiKwotICAgICAgICAiXHU1NzBBXHU1NzA3XHU1N0ZCXHU1ODE0XHU1N0UyXHU1N0Y2XHU1N0RDXHU1N0Y0IisKLSAgICAgICAgIlx1NTgwMFx1NTdFRFx1NTdGRFx1NTgwOFx1NTdGOFx1NTgwQlx1NTdGM1x1NTdDRiIrCi0gICAgICAgICJcdTU4MDdcdTU3RUVcdTU3RTNcdTU3RjJcdTU3RTVcdTU3RUNcdTU3RTFcdTU4MEUiKwotICAgICAgICAiXHU1N0ZDXHU1ODEwXHU1N0U3XHU1ODAxXHU1ODBDXHU1N0YxXHU1N0U5XHU1N0YwIisKLSAgICAgICAgIlx1NTgwRFx1NTgwNFx1NTk1Q1x1NUE2MFx1NUE1OFx1NUE1NVx1NUE2N1x1NUE1RSIrCi0gICAgICAgICJcdTVBMzhcdTVBMzVcdTVBNkRcdTVBNTBcdTVBNUZcdTVBNjVcdTVBNkNcdTVBNTMiKwotICAgICAgICAiXHU1QTY0XHU1QTU3XHU1QTQzXHU1QTVEXHU1QTUyXHU1QTQ0XHU1QTVCXHU1QTQ4IisKLSAgICAgICAgIlx1NUE4RVx1NUEzRVx1NUE0RFx1NUEzOVx1NUE0Q1x1NUE3MFx1NUE2OVx1NUE0NyIrCi0gICAgICAgICJcdTVBNTFcdTVBNTZcdTVBNDJcdTVBNUNcdTVCNzJcdTVCNkVcdTVCQzFcdTVCQzAiKwotICAgICAgICAiXHU1QzU5XHU1RDFFXHU1RDBCXHU1RDFEXHU1RDFBXHU1RDIwXHU1RDBDXHU1RDI4IisKLSAgICAgICAgIlx1NUQwRFx1NUQyNlx1NUQyNVx1NUQwRlx1NUQzMFx1NUQxMlx1NUQyM1x1NUQxRiIrCi0gICAgICAgICJcdTVEMkVcdTVFM0VcdTVFMzRcdTVFQjFcdTVFQjRcdTVFQjlcdTVFQjJcdTVFQjMiKwotICAgICAgICAiXHU1RjM2XHU1RjM4XHU1RjlCXHU1Rjk2XHU1RjlGXHU2MDhBXHU2MDkwXHU2MDg2IisKLSAgICAgICAgIlx1NjBCRVx1NjBCMFx1NjBCQVx1NjBEM1x1NjBENFx1NjBDRlx1NjBFNFx1NjBEOSIrCi0gICAgICAgICJcdTYwRERcdTYwQzhcdTYwQjFcdTYwREJcdTYwQjdcdTYwQ0FcdTYwQkZcdTYwQzMiKwotICAgICAgICAiXHU2MENEXHU2MEMwXHU2MzMyXHU2MzY1XHU2MzhBXHU2MzgyXHU2MzdEXHU2M0JEIisKLSAgICAgICAgIlx1NjM5RVx1NjNBRFx1NjM5RFx1NjM5N1x1NjNBQlx1NjM4RVx1NjM2Rlx1NjM4NyIrCi0gICAgICAgICJcdTYzOTBcdTYzNkVcdTYzQUZcdTYzNzVcdTYzOUNcdTYzNkRcdTYzQUVcdTYzN0MiKwotICAgICAgICAiXHU2M0E0XHU2MzNCXHU2MzlGXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NjM3OFx1NjM4NVx1NjM4MSIrCi0gICAgICAgICJcdTYzOTFcdTYzOERcdTYzNzBcdTY1NTNcdTY1Q0RcdTY2NjVcdTY2NjFcdTY2NUIiKwotICAgICAgICAiXHU2NjU5XHU2NjVDXHU2NjYyXHU2NzE4XHU2ODc5XHU2ODg3XHU2ODkwXHU2ODlDIisKLSAgICAgICAgIlx1Njg2RFx1Njg2RVx1NjhBRVx1NjhBQlx1Njk1Nlx1Njg2Rlx1NjhBM1x1NjhBQyIrCi0gICAgICAgICJcdTY4QTlcdTY4NzVcdTY4NzRcdTY4QjJcdTY4OEZcdTY4NzdcdTY4OTJcdTY4N0MiKwotICAgICAgICAiXHU2ODZCXHU2ODcyXHU2OEFBXHU2ODgwXHU2ODcxXHU2ODdFXHU2ODlCXHU2ODk2IisKLSAgICAgICAgIlx1Njg4Qlx1NjhBMFx1Njg4OVx1NjhBNFx1Njg3OFx1Njg3Qlx1Njg5MVx1Njg4QyIrCi0gICAgICAgICJcdTY4OEFcdTY4N0RcdTZCMzZcdTZCMzNcdTZCMzdcdTZCMzhcdTZCOTFcdTZCOEYiKwotICAgICAgICAiXHU2QjhEXHU2QjhFXHU2QjhDXHU2QzJBXHU2REMwXHU2REFCXHU2REI0XHU2REIzIisKLSAgICAgICAgIlx1NkU3NFx1NkRBQ1x1NkRFOVx1NkRFMlx1NkRCN1x1NkRGNlx1NkRENFx1NkUwMCIrCi0gICAgICAgICJcdTZEQzhcdTZERTBcdTZEREZcdTZERDZcdTZEQkVcdTZERTVcdTZERENcdTZEREQiKwotICAgICAgICAiXHU2RERCXHU2REY0XHU2RENBXHU2REJEXHU2REVEXHU2REYwXHU2REJBXHU2REQ1IisKLSAgICAgICAgIlx1NkRDMlx1NkRDRlx1NkRDOVx1NkREMFx1NkRGMlx1NkREM1x1NkRGRFx1NkRENyIrCi0gICAgICAgICJcdTZEQ0RcdTZERTNcdTZEQkJcdTcwRkFcdTcxMERcdTcwRjdcdTcxMTdcdTcwRjQiKwotICAgICAgICAiXHU3MTBDXHU3MEYwXHU3MTA0XHU3MEYzXHU3MTEwXHU3MEZDXHU3MEZGXHU3MTA2IisKLSAgICAgICAgIlx1NzExM1x1NzEwMFx1NzBGOFx1NzBGNlx1NzEwQlx1NzEwMlx1NzEwRVx1NzI3RSIrCi0gICAgICAgICJcdTcyN0JcdTcyN0NcdTcyN0ZcdTczMURcdTczMTdcdTczMDdcdTczMTFcdTczMTgiKwotICAgICAgICAiXHU3MzBBXHU3MzA4XHU3MkZGXHU3MzBGXHU3MzFFXHU3Mzg4XHU3M0Y2XHU3M0Y4IisKLSAgICAgICAgIlx1NzNGNVx1NzQwNFx1NzQwMVx1NzNGRFx1NzQwN1x1NzQwMFx1NzNGQVx1NzNGQyIrCi0gICAgICAgICJcdTczRkZcdTc0MENcdTc0MEJcdTczRjRcdTc0MDhcdTc1NjRcdTc1NjNcdTc1Q0UiKwotICAgICAgICAiXHU3NUQyXHU3NUNGXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NzVDQlx1NzVDQ1x1NzVEMVx1NzVEMCIrCi0gICAgICAgICJcdTc2OEZcdTc2ODlcdTc2RDNcdTc3MzlcdTc3MkZcdTc3MkRcdTc3MzFcdTc3MzIiKwotICAgICAgICAiXHU3NzM0XHU3NzMzXHU3NzNEXHU3NzI1XHU3NzNCXHU3NzM1XHU3ODQ4XHU3ODUyIisKLSAgICAgICAgIlx1Nzg0OVx1Nzg0RFx1Nzg0QVx1Nzg0Q1x1NzgyNlx1Nzg0NVx1Nzg1MFx1Nzk2NCIrCi0gICAgICAgICJcdTc5NjdcdTc5NjlcdTc5NkFcdTc5NjNcdTc5NkJcdTc5NjFcdTc5QkJcdTc5RkEiKwotICAgICAgICAiXHU3OUY4XHU3OUY2XHU3OUY3XHU3QThGXHU3QTk0XHU3QTkwXHU3QjM1XHU3QjQ3IisKLSAgICAgICAgIlx1N0IzNFx1N0IyNVx1N0IzMFx1N0IyMlx1N0IyNFx1N0IzM1x1N0IxOFx1N0IyQSIrCi0gICAgICAgICJcdTdCMURcdTdCMzFcdTdCMkJcdTdCMkRcdTdCMkZcdTdCMzJcdTdCMzhcdTdCMUEiKwotICAgICAgICAiXHU3QjIzXHU3Qzk0XHU3Qzk4XHU3Qzk2XHU3Q0EzXHU3RDM1XHU3RDNEXHU3RDM4IisKLSAgICAgICAgIlx1N0QzNlx1N0QzQVx1N0Q0NVx1N0QyQ1x1N0QyOVx1N0Q0MVx1N0Q0N1x1N0QzRSIrCi0gICAgICAgICJcdTdEM0ZcdTdENEFcdTdEM0JcdTdEMjhcdTdGNjNcdTdGOTVcdTdGOUNcdTdGOUQiKwotICAgICAgICAiXHU3RjlCXHU3RkNBXHU3RkNCXHU3RkNEXHU3RkQwXHU3RkQxXHU3RkM3XHU3RkNGIisKLSAgICAgICAgIlx1N0ZDOVx1ODAxRlx1ODAxRVx1ODAxQlx1ODA0N1x1ODA0M1x1ODA0OFx1ODExOCIrCi0gICAgICAgICJcdTgxMjVcdTgxMTlcdTgxMUJcdTgxMkRcdTgxMUZcdTgxMkNcdTgxMUVcdTgxMjEiKwotICAgICAgICAiXHU4MTE1XHU4MTI3XHU4MTFEXHU4MTIyXHU4MjExXHU4MjM4XHU4MjMzXHU4MjNBIisKLSAgICAgICAgIlx1ODIzNFx1ODIzMlx1ODI3NFx1ODM5MFx1ODNBM1x1ODNBOFx1ODM4RFx1ODM3QSIrCi0gICAgICAgICJcdTgzNzNcdTgzQTRcdTgzNzRcdTgzOEZcdTgzODFcdTgzOTVcdTgzOTlcdTgzNzUiKwotICAgICAgICAiXHU4Mzk0XHU4M0E5XHU4MzdEXHU4MzgzXHU4MzhDXHU4MzlEXHU4MzlCXHU4M0FBIisKLSAgICAgICAgIlx1ODM4Qlx1ODM3RVx1ODNBNVx1ODNBRlx1ODM4OFx1ODM5N1x1ODNCMFx1ODM3RiIrCi0gICAgICAgICJcdTgzQTZcdTgzODdcdTgzQUVcdTgzNzZcdTgzOUFcdTg2NTlcdTg2NTZcdTg2QkYiKwotICAgICAgICAiXHU4NkI3XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1ODZDMlx1ODZDMVx1ODZDNVx1ODZCQVx1ODZCMCIrCi0gICAgICAgICJcdTg2QzhcdTg2QjlcdTg2QjNcdTg2QjhcdTg2Q0NcdTg2QjRcdTg2QkJcdTg2QkMiKwotICAgICAgICAiXHU4NkMzXHU4NkJEXHU4NkJFXHU4ODUyXHU4ODg5XHU4ODk1XHU4OEE4XHU4OEEyIisKLSAgICAgICAgIlx1ODhBQVx1ODg5QVx1ODg5MVx1ODhBMVx1ODg5Rlx1ODg5OFx1ODhBN1x1ODg5OSIrCi0gICAgICAgICJcdTg4OUJcdTg4OTdcdTg4QTRcdTg4QUNcdTg4OENcdTg4OTNcdTg4OEVcdTg5ODIiKwotICAgICAgICAiXHU4OUQ2XHU4OUQ5XHU4OUQ1XHU4QTMwXHU4QTI3XHU4QTJDXHU4QTFFXHU4QzM5IisKLSAgICAgICAgIlx1OEMzQlx1OEM1Q1x1OEM1RFx1OEM3RFx1OENBNVx1OEQ3RFx1OEQ3Qlx1OEQ3OSIrCi0gICAgICAgICJcdThEQkNcdThEQzJcdThEQjlcdThEQkZcdThEQzFcdThFRDhcdThFREVcdThFREQiKwotICAgICAgICAiXHU4RURDXHU4RUQ3XHU4RUUwXHU4RUUxXHU5MDI0XHU5MDBCXHU5MDExXHU5MDFDIisKLSAgICAgICAgIlx1OTAwQ1x1OTAyMVx1OTBFRlx1OTBFQVx1OTBGMFx1OTBGNFx1OTBGMlx1OTBGMyIrCi0gICAgICAgICJcdTkwRDRcdTkwRUJcdTkwRUNcdTkwRTlcdTkxNTZcdTkxNThcdTkxNUFcdTkxNTMiKwotICAgICAgICAiXHU5MTU1XHU5MUVDXHU5MUY0XHU5MUYxXHU5MUYzXHU5MUY4XHU5MUU0XHU5MUY5IisKLSAgICAgICAgIlx1OTFFQVx1OTFFQlx1OTFGN1x1OTFFOFx1OTFFRVx1OTU3QVx1OTU4Nlx1OTU4OCIrCi0gICAgICAgICJcdTk2N0NcdTk2NkRcdTk2NkJcdTk2NzFcdTk2NkZcdTk2QkZcdTk3NkFcdTk4MDQiKwotICAgICAgICAiXHU5OEU1XHU5OTk3XHU1MDlCXHU1MDk1XHU1MDk0XHU1MDlFXHU1MDhCXHU1MEEzIisKLSAgICAgICAgIlx1NTA4M1x1NTA4Q1x1NTA4RVx1NTA5RFx1NTA2OFx1NTA5Q1x1NTA5Mlx1NTA4MiIrCi0gICAgICAgICJcdTUwODdcdTUxNUZcdTUxRDRcdTUzMTJcdTUzMTFcdTUzQTRcdTUzQTdcdTU1OTEiKwotICAgICAgICAiXHU1NUE4XHU1NUE1XHU1NUFEXHU1NTc3XHU1NjQ1XHU1NUEyXHU1NTkzXHU1NTg4IisKLSAgICAgICAgIlx1NTU4Rlx1NTVCNVx1NTU4MVx1NTVBM1x1NTU5Mlx1NTVBNFx1NTU3RFx1NTU4QyIrCi0gICAgICAgICJcdTU1QTZcdTU1N0ZcdTU1OTVcdTU1QTFcdTU1OEVcdTU3MENcdTU4MjlcdTU4MzciKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1NTgxOVx1NTgxRVx1NTgyN1x1NTgyM1x1NTgyOFx1NTdGNSIrCi0gICAgICAgICJcdTU4NDhcdTU4MjVcdTU4MUNcdTU4MUJcdTU4MzNcdTU4M0ZcdTU4MzZcdTU4MkUiKwotICAgICAgICAiXHU1ODM5XHU1ODM4XHU1ODJEXHU1ODJDXHU1ODNCXHU1OTYxXHU1QUFGXHU1QTk0IisKLSAgICAgICAgIlx1NUE5Rlx1NUE3QVx1NUFBMlx1NUE5RVx1NUE3OFx1NUFBNlx1NUE3Q1x1NUFBNSIrCi0gICAgICAgICJcdTVBQUNcdTVBOTVcdTVBQUVcdTVBMzdcdTVBODRcdTVBOEFcdTVBOTdcdTVBODMiKwotICAgICAgICAiXHU1QThCXHU1QUE5XHU1QTdCXHU1QTdEXHU1QThDXHU1QTlDXHU1QThGXHU1QTkzIisKLSAgICAgICAgIlx1NUE5RFx1NUJFQVx1NUJDRFx1NUJDQlx1NUJENFx1NUJEMVx1NUJDQVx1NUJDRSIrCi0gICAgICAgICJcdTVDMENcdTVDMzBcdTVEMzdcdTVENDNcdTVENkJcdTVENDFcdTVENEJcdTVEM0YiKwotICAgICAgICAiXHU1RDM1XHU1RDUxXHU1RDRFXHU1RDU1XHU1RDMzXHU1RDNBXHU1RDUyXHU1RDNEIisKLSAgICAgICAgIlx1NUQzMVx1NUQ1OVx1NUQ0Mlx1NUQzOVx1NUQ0OVx1NUQzOFx1NUQzQ1x1NUQzMiIrCi0gICAgICAgICJcdTVEMzZcdTVENDBcdTVENDVcdTVFNDRcdTVFNDFcdTVGNThcdTVGQTZcdTVGQTUiKwotICAgICAgICAiXHU1RkFCXHU2MEM5XHU2MEI5XHU2MENDXHU2MEUyXHU2MENFXHU2MEM0XHU2MTE0IisKLSAgICAgICAgIlx1NjBGMlx1NjEwQVx1NjExNlx1NjEwNVx1NjBGNVx1NjExM1x1NjBGOFx1NjBGQyIrCi0gICAgICAgICJcdTYwRkVcdTYwQzFcdTYxMDNcdTYxMThcdTYxMURcdTYxMTBcdTYwRkZcdTYxMDQiKwotICAgICAgICAiXHU2MTBCXHU2MjRBXHU2Mzk0XHU2M0IxXHU2M0IwXHU2M0NFXHU2M0U1XHU2M0U4IisKLSAgICAgICAgIlx1NjNFRlx1NjNDM1x1NjQ5RFx1NjNGM1x1NjNDQVx1NjNFMFx1NjNGNlx1NjNENSIrCi0gICAgICAgICJcdTYzRjJcdTYzRjVcdTY0NjFcdTYzREZcdTYzQkVcdTYzRERcdTYzRENcdTYzQzQiKwotICAgICAgICAiXHU2M0Q4XHU2M0QzXHU2M0MyXHU2M0M3XHU2M0NDXHU2M0NCXHU2M0M4XHU2M0YwIisKLSAgICAgICAgIlx1NjNEN1x1NjNEOVx1NjUzMlx1NjU2N1x1NjU2QVx1NjU2NFx1NjU1Q1x1NjU2OCIrCi0gICAgICAgICJcdTY1NjVcdTY1OENcdTY1OURcdTY1OUVcdTY1QUVcdTY1RDBcdTY1RDJcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1NjY3Q1x1NjY2Q1x1NjY3Qlx1NjY4MFx1NjY3MVx1NjY3OVx1NjY2QSIrCi0gICAgICAgICJcdTY2NzJcdTY3MDFcdTY5MENcdTY4RDNcdTY5MDRcdTY4RENcdTY5MkFcdTY4RUMiKwotICAgICAgICAiXHU2OEVBXHU2OEYxXHU2OTBGXHU2OEQ2XHU2OEY3XHU2OEVCXHU2OEU0XHU2OEY2IisKLSAgICAgICAgIlx1NjkxM1x1NjkxMFx1NjhGM1x1NjhFMVx1NjkwN1x1NjhDQ1x1NjkwOFx1Njk3MCIrCi0gICAgICAgICJcdTY4QjRcdTY5MTFcdTY4RUZcdTY4QzZcdTY5MTRcdTY4RjhcdTY4RDBcdTY4RkQiKwotICAgICAgICAiXHU2OEZDXHU2OEU4XHU2OTBCXHU2OTBBXHU2OTE3XHU2OENFXHU2OEM4XHU2OEREIisKLSAgICAgICAgIlx1NjhERVx1NjhFNlx1NjhGNFx1NjhEMVx1NjkwNlx1NjhENFx1NjhFOVx1NjkxNSIrCi0gICAgICAgICJcdTY5MjVcdTY4QzdcdTZCMzlcdTZCM0JcdTZCM0ZcdTZCM0NcdTZCOTRcdTZCOTciKwotICAgICAgICAiXHU2Qjk5XHU2Qjk1XHU2QkJEXHU2QkYwXHU2QkYyXHU2QkYzXHU2QzMwXHU2REZDIisKLSAgICAgICAgIlx1NkU0Nlx1NkU0N1x1NkUxRlx1NkU0OVx1NkU4OFx1NkUzQ1x1NkUzRFx1NkU0NSIrCi0gICAgICAgICJcdTZFNjJcdTZFMkJcdTZFM0ZcdTZFNDFcdTZFNURcdTZFNzNcdTZFMUNcdTZFMzMiKwotICAgICAgICAiXHU2RTRCXHU2RTQwXHU2RTUxXHU2RTNCXHU2RTAzXHU2RTJFXHU2RTVFXHU2RTY4IisKLSAgICAgICAgIlx1NkU1Q1x1NkU2MVx1NkUzMVx1NkUyOFx1NkU2MFx1NkU3MVx1NkU2Qlx1NkUzOSIrCi0gICAgICAgICJcdTZFMjJcdTZFMzBcdTZFNTNcdTZFNjVcdTZFMjdcdTZFNzhcdTZFNjRcdTZFNzciKwotICAgICAgICAiXHU2RTU1XHU2RTc5XHU2RTUyXHU2RTY2XHU2RTM1XHU2RTM2XHU2RTVBXHU3MTIwIisKLSAgICAgICAgIlx1NzExRVx1NzEyRlx1NzBGQlx1NzEyRVx1NzEzMVx1NzEyM1x1NzEyNVx1NzEyMiIrCi0gICAgICAgICJcdTcxMzJcdTcxMUZcdTcxMjhcdTcxM0FcdTcxMUJcdTcyNEJcdTcyNUFcdTcyODgiKwotICAgICAgICAiXHU3Mjg5XHU3Mjg2XHU3Mjg1XHU3MjhCXHU3MzEyXHU3MzBCXHU3MzMwXHU3MzIyIisKLSAgICAgICAgIlx1NzMzMVx1NzMzM1x1NzMyN1x1NzMzMlx1NzMyRFx1NzMyNlx1NzMyM1x1NzMzNSIrCi0gICAgICAgICJcdTczMENcdTc0MkVcdTc0MkNcdTc0MzBcdTc0MkJcdTc0MTZcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1NzQxQVx1NzQyMVx1NzQyRFx1NzQzMVx1NzQyNFx1NzQyM1x1NzQxRFx1NzQyOSIrCi0gICAgICAgICJcdTc0MjBcdTc0MzJcdTc0RkJcdTc1MkZcdTc1NkZcdTc1NkNcdTc1RTdcdTc1REEiKwotICAgICAgICAiXHU3NUUxXHU3NUU2XHU3NUREXHU3NURGXHU3NUU0XHU3NUQ3XHU3Njk1XHU3NjkyIisKLSAgICAgICAgIlx1NzZEQVx1Nzc0Nlx1Nzc0N1x1Nzc0NFx1Nzc0RFx1Nzc0NVx1Nzc0QVx1Nzc0RSIrCi0gICAgICAgICJcdTc3NEJcdTc3NENcdTc3REVcdTc3RUNcdTc4NjBcdTc4NjRcdTc4NjVcdTc4NUMiKwotICAgICAgICAiXHU3ODZEXHU3ODcxXHU3ODZBXHU3ODZFXHU3ODcwXHU3ODY5XHU3ODY4XHU3ODVFIisKLSAgICAgICAgIlx1Nzg2Mlx1Nzk3NFx1Nzk3M1x1Nzk3Mlx1Nzk3MFx1N0EwMlx1N0EwQVx1N0EwMyIrCi0gICAgICAgICJcdTdBMENcdTdBMDRcdTdBOTlcdTdBRTZcdTdBRTRcdTdCNEFcdTdCM0JcdTdCNDQiKwotICAgICAgICAiXHU3QjQ4XHU3QjRDXHU3QjRFXHU3QjQwXHU3QjU4XHU3QjQ1XHU3Q0EyXHU3QzlFIisKLSAgICAgICAgIlx1N0NBOFx1N0NBMVx1N0Q1OFx1N0Q2Rlx1N0Q2M1x1N0Q1M1x1N0Q1Nlx1N0Q2NyIrCi0gICAgICAgICJcdTdENkFcdTdENEZcdTdENkRcdTdENUNcdTdENkJcdTdENTJcdTdENTRcdTdENjkiKwotICAgICAgICAiXHU3RDUxXHU3RDVGXHU3RDRFXHU3RjNFXHU3RjNGXHU3RjY1XHU3RjY2XHU3RkEyIisKLSAgICAgICAgIlx1N0ZBMFx1N0ZBMVx1N0ZEN1x1ODA1MVx1ODA0Rlx1ODA1MFx1ODBGRVx1ODBENCIrCi0gICAgICAgICJcdTgxNDNcdTgxNEFcdTgxNTJcdTgxNEZcdTgxNDdcdTgxM0RcdTgxNERcdTgxM0EiKwotICAgICAgICAiXHU4MUU2XHU4MUVFXHU4MUY3XHU4MUY4XHU4MUY5XHU4MjA0XHU4MjNDXHU4MjNEIisKLSAgICAgICAgIlx1ODIzRlx1ODI3NVx1ODMzQlx1ODNDRlx1ODNGOVx1ODQyM1x1ODNDMFx1ODNFOCIrCi0gICAgICAgICJcdTg0MTJcdTgzRTdcdTgzRTRcdTgzRkNcdTgzRjZcdTg0MTBcdTgzQzZcdTgzQzgiKwotICAgICAgICAiXHU4M0VCXHU4M0UzXHU4M0JGXHU4NDAxXHU4M0REXHU4M0U1XHU4M0Q4XHU4M0ZGIisKLSAgICAgICAgIlx1ODNFMVx1ODNDQlx1ODNDRVx1ODNENlx1ODNGNVx1ODNDOVx1ODQwOVx1ODQwRiIrCi0gICAgICAgICJcdTgzREVcdTg0MTFcdTg0MDZcdTgzQzJcdTgzRjNcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU4M0Q1IisKLSAgICAgICAgIlx1ODNGQVx1ODNDN1x1ODNEMVx1ODNFQVx1ODQxM1x1ODNDM1x1ODNFQ1x1ODNFRSIrCi0gICAgICAgICJcdTgzQzRcdTgzRkJcdTgzRDdcdTgzRTJcdTg0MUJcdTgzREJcdTgzRkVcdTg2RDgiKwotICAgICAgICAiXHU4NkUyXHU4NkU2XHU4NkQzXHU4NkUzXHU4NkRBXHU4NkVBXHU4NkREXHU4NkVCIisKLSAgICAgICAgIlx1ODZEQ1x1ODZFQ1x1ODZFOVx1ODZEN1x1ODZFOFx1ODZEMVx1ODg0OFx1ODg1NiIrCi0gICAgICAgICJcdTg4NTVcdTg4QkFcdTg4RDdcdTg4QjlcdTg4QjhcdTg4QzBcdTg4QkVcdTg4QjYiKwotICAgICAgICAiXHU4OEJDXHU4OEI3XHU4OEJEXHU4OEIyXHU4OTAxXHU4OEM5XHU4OTk1XHU4OTk4IisKLSAgICAgICAgIlx1ODk5N1x1ODlERFx1ODlEQVx1ODlEQlx1OEE0RVx1OEE0RFx1OEEzOVx1OEE1OSIrCi0gICAgICAgICJcdThBNDBcdThBNTdcdThBNThcdThBNDRcdThBNDVcdThBNTJcdThBNDhcdThBNTEiKwotICAgICAgICAiXHU4QTRBXHU4QTRDXHU4QTRGXHU4QzVGXHU4QzgxXHU4QzgwXHU4Q0JBXHU4Q0JFIisKLSAgICAgICAgIlx1OENCMFx1OENCOVx1OENCNVx1OEQ4NFx1OEQ4MFx1OEQ4OVx1OEREOFx1OEREMyIrCi0gICAgICAgICJcdThEQ0RcdThEQzdcdThERDZcdThERENcdThEQ0ZcdThERDVcdThERDlcdThEQzgiKwotICAgICAgICAiXHU4REQ3XHU4REM1XHU4RUVGXHU4RUY3XHU4RUZBXHU4RUY5XHU4RUU2XHU4RUVFIisKLSAgICAgICAgIlx1OEVFNVx1OEVGNVx1OEVFN1x1OEVFOFx1OEVGNlx1OEVFQlx1OEVGMVx1OEVFQyIrCi0gICAgICAgICJcdThFRjRcdThFRTlcdTkwMkRcdTkwMzRcdTkwMkZcdTkxMDZcdTkxMkNcdTkxMDQiKwotICAgICAgICAiXHU5MEZGXHU5MEZDXHU5MTA4XHU5MEY5XHU5MEZCXHU5MTAxXHU5MTAwXHU5MTA3IisKLSAgICAgICAgIlx1OTEwNVx1OTEwM1x1OTE2MVx1OTE2NFx1OTE1Rlx1OTE2Mlx1OTE2MFx1OTIwMSIrCi0gICAgICAgICJcdTkyMEFcdTkyMjVcdTkyMDNcdTkyMUFcdTkyMjZcdTkyMEZcdTkyMENcdTkyMDAiKwotICAgICAgICAiXHU5MjEyXHU5MUZGXHU5MUZEXHU5MjA2XHU5MjA0XHU5MjI3XHU5MjAyXHU5MjFDIisKLSAgICAgICAgIlx1OTIyNFx1OTIxOVx1OTIxN1x1OTIwNVx1OTIxNlx1OTU3Qlx1OTU4RFx1OTU4QyIrCi0gICAgICAgICJcdTk1OTBcdTk2ODdcdTk2N0VcdTk2ODhcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU5Njg5XHU5NjgzIisKLSAgICAgICAgIlx1OTY4MFx1OTZDMlx1OTZDOFx1OTZDM1x1OTZGMVx1OTZGMFx1OTc2Q1x1OTc3MCIrCi0gICAgICAgICJcdTk3NkVcdTk4MDdcdTk4QTlcdTk4RUJcdTlDRTZcdTlFRjlcdTRFODNcdTRFODQiKwotICAgICAgICAiXHU0RUI2XHU1MEJEXHU1MEJGXHU1MEM2XHU1MEFFXHU1MEM0XHU1MENBXHU1MEI0IisKLSAgICAgICAgIlx1NTBDOFx1NTBDMlx1NTBCMFx1NTBDMVx1NTBCQVx1NTBCMVx1NTBDQlx1NTBDOSIrCi0gICAgICAgICJcdTUwQjZcdTUwQjhcdTUxRDdcdTUyN0FcdTUyNzhcdTUyN0JcdTUyN0NcdTU1QzMiKwotICAgICAgICAiXHU1NURCXHU1NUNDXHU1NUQwXHU1NUNCXHU1NUNBXHU1NUREXHU1NUMwXHU1NUQ0IisKLSAgICAgICAgIlx1NTVDNFx1NTVFOVx1NTVCRlx1NTVEMlx1NTU4RFx1NTVDRlx1NTVENVx1NTVFMiIrCi0gICAgICAgICJcdTU1RDZcdTU1QzhcdTU1RjJcdTU1Q0RcdTU1RDlcdTU1QzJcdTU3MTRcdTU4NTMiKwotICAgICAgICAiXHU1ODY4XHU1ODY0XHU1ODRGXHU1ODREXHU1ODQ5XHU1ODZGXHU1ODU1XHU1ODRFIisKLSAgICAgICAgIlx1NTg1RFx1NTg1OVx1NTg2NVx1NTg1Qlx1NTgzRFx1NTg2M1x1NTg3MVx1NThGQyIrCi0gICAgICAgICJcdTVBQzdcdTVBQzRcdTVBQ0JcdTVBQkFcdTVBQjhcdTVBQjFcdTVBQjVcdTVBQjAiKwotICAgICAgICAiXHU1QUJGXHU1QUM4XHU1QUJCXHU1QUM2XHU1QUI3XHU1QUMwXHU1QUNBXHU1QUI0IisKLSAgICAgICAgIlx1NUFCNlx1NUFDRFx1NUFCOVx1NUE5MFx1NUJENlx1NUJEOFx1NUJEOVx1NUMxRiIrCi0gICAgICAgICJcdTVDMzNcdTVENzFcdTVENjNcdTVENEFcdTVENjVcdTVENzJcdTVENkNcdTVENUUiKwotICAgICAgICAiXHU1RDY4XHU1RDY3XHU1RDYyXHU1REYwXHU1RTRGXHU1RTRFXHU1RTRBXHU1RTREIisKLSAgICAgICAgIlx1NUU0Qlx1NUVDNVx1NUVDQ1x1NUVDNlx1NUVDQlx1NUVDN1x1NUY0MFx1NUZBRiIrCi0gICAgICAgICJcdTVGQURcdTYwRjdcdTYxNDlcdTYxNEFcdTYxMkJcdTYxNDVcdTYxMzZcdTYxMzIiKwotICAgICAgICAiXHU2MTJFXHU2MTQ2XHU2MTJGXHU2MTRGXHU2MTI5XHU2MTQwXHU2MjIwXHU5MTY4IisKLSAgICAgICAgIlx1NjIyM1x1NjIyNVx1NjIyNFx1NjNDNVx1NjNGMVx1NjNFQlx1NjQxMFx1NjQxMiIrCi0gICAgICAgICJcdTY0MDlcdTY0MjBcdTY0MjRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU2NDMzXHU2NDQzXHU2NDFGIisKLSAgICAgICAgIlx1NjQxNVx1NjQxOFx1NjQzOVx1NjQzN1x1NjQyMlx1NjQyM1x1NjQwQ1x1NjQyNiIrCi0gICAgICAgICJcdTY0MzBcdTY0MjhcdTY0NDFcdTY0MzVcdTY0MkZcdTY0MEFcdTY0MUFcdTY0NDAiKwotICAgICAgICAiXHU2NDI1XHU2NDI3XHU2NDBCXHU2M0U3XHU2NDFCXHU2NDJFXHU2NDIxXHU2NDBFIisKLSAgICAgICAgIlx1NjU2Rlx1NjU5Mlx1NjVEM1x1NjY4Nlx1NjY4Q1x1NjY5NVx1NjY5MFx1NjY4QiIrCi0gICAgICAgICJcdTY2OEFcdTY2OTlcdTY2OTRcdTY2NzhcdTY3MjBcdTY5NjZcdTY5NUZcdTY5MzgiKwotICAgICAgICAiXHU2OTRFXHU2OTYyXHU2OTcxXHU2OTNGXHU2OTQ1XHU2OTZBXHU2OTM5XHU2OTQyIisKLSAgICAgICAgIlx1Njk1N1x1Njk1OVx1Njk3QVx1Njk0OFx1Njk0OVx1NjkzNVx1Njk2Q1x1NjkzMyIrCi0gICAgICAgICJcdTY5M0RcdTY5NjVcdTY4RjBcdTY5NzhcdTY5MzRcdTY5NjlcdTY5NDBcdTY5NkYiKwotICAgICAgICAiXHU2OTQ0XHU2OTc2XHU2OTU4XHU2OTQxXHU2OTc0XHU2OTRDXHU2OTNCXHU2OTRCIisKLSAgICAgICAgIlx1NjkzN1x1Njk1Q1x1Njk0Rlx1Njk1MVx1NjkzMlx1Njk1Mlx1NjkyRlx1Njk3QiIrCi0gICAgICAgICJcdTY5M0NcdTZCNDZcdTZCNDVcdTZCNDNcdTZCNDJcdTZCNDhcdTZCNDFcdTZCOUIiKwotICAgICAgICAiXHVGQTBEXHU2QkZCXHU2QkZDXHU2QkY5XHU2QkY3XHU2QkY4XHU2RTlCXHU2RUQ2IisKLSAgICAgICAgIlx1NkVDOFx1NkU4Rlx1NkVDMFx1NkU5Rlx1NkU5M1x1NkU5NFx1NkVBMFx1NkVCMSIrCi0gICAgICAgICJcdTZFQjlcdTZFQzZcdTZFRDJcdTZFQkRcdTZFQzFcdTZFOUVcdTZFQzlcdTZFQjciKwotICAgICAgICAiXHU2RUIwXHU2RUNEXHU2RUE2XHU2RUNGXHU2RUIyXHU2RUJFXHU2RUMzXHU2RURDIisKLSAgICAgICAgIlx1NkVEOFx1NkU5OVx1NkU5Mlx1NkU4RVx1NkU4RFx1NkVBNFx1NkVBMVx1NkVCRiIrCi0gICAgICAgICJcdTZFQjNcdTZFRDBcdTZFQ0FcdTZFOTdcdTZFQUVcdTZFQTNcdTcxNDdcdTcxNTQiKwotICAgICAgICAiXHU3MTUyXHU3MTYzXHU3MTYwXHU3MTQxXHU3MTVEXHU3MTYyXHU3MTcyXHU3MTc4IisKLSAgICAgICAgIlx1NzE2QVx1NzE2MVx1NzE0Mlx1NzE1OFx1NzE0M1x1NzE0Qlx1NzE3MFx1NzE1RiIrCi0gICAgICAgICJcdTcxNTBcdTcxNTNcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU3MTQ0XHU3MTREXHU3MTVBXHU3MjRGIisKLSAgICAgICAgIlx1NzI4RFx1NzI4Q1x1NzI5MVx1NzI5MFx1NzI4RVx1NzMzQ1x1NzM0Mlx1NzMzQiIrCi0gICAgICAgICJcdTczM0FcdTczNDBcdTczNEFcdTczNDlcdTc0NDRcdTc0NEFcdTc0NEJcdTc0NTIiKwotICAgICAgICAiXHU3NDUxXHU3NDU3XHU3NDQwXHU3NDRGXHU3NDUwXHU3NDRFXHU3NDQyXHU3NDQ2IisKLSAgICAgICAgIlx1NzQ0RFx1NzQ1NFx1NzRFMVx1NzRGRlx1NzRGRVx1NzRGRFx1NzUxRFx1NzU3OSIrCi0gICAgICAgICJcdTc1NzdcdTY5ODNcdTc1RUZcdTc2MEZcdTc2MDNcdTc1RjdcdTc1RkVcdTc1RkMiKwotICAgICAgICAiXHU3NUY5XHU3NUY4XHU3NjEwXHU3NUZCXHU3NUY2XHU3NUVEXHU3NUY1XHU3NUZEIisKLSAgICAgICAgIlx1NzY5OVx1NzZCNVx1NzZERFx1Nzc1NVx1Nzc1Rlx1Nzc2MFx1Nzc1Mlx1Nzc1NiIrCi0gICAgICAgICJcdTc3NUFcdTc3NjlcdTc3NjdcdTc3NTRcdTc3NTlcdTc3NkRcdTc3RTBcdTc4ODciKwotICAgICAgICAiXHU3ODlBXHU3ODk0XHU3ODhGXHU3ODg0XHU3ODk1XHU3ODg1XHU3ODg2XHU3OEExIisKLSAgICAgICAgIlx1Nzg4M1x1Nzg3OVx1Nzg5OVx1Nzg4MFx1Nzg5Nlx1Nzg3Qlx1Nzk3Q1x1Nzk4MiIrCi0gICAgICAgICJcdTc5N0RcdTc5NzlcdTdBMTFcdTdBMThcdTdBMTlcdTdBMTJcdTdBMTdcdTdBMTUiKwotICAgICAgICAiXHU3QTIyXHU3QTEzXHU3QTFCXHU3QTEwXHU3QUEzXHU3QUEyXHU3QTlFXHU3QUVCIisKLSAgICAgICAgIlx1N0I2Nlx1N0I2NFx1N0I2RFx1N0I3NFx1N0I2OVx1N0I3Mlx1N0I2NVx1N0I3MyIrCi0gICAgICAgICJcdTdCNzFcdTdCNzBcdTdCNjFcdTdCNzhcdTdCNzZcdTdCNjNcdTdDQjJcdTdDQjQiKwotICAgICAgICAiXHU3Q0FGXHU3RDg4XHU3RDg2XHU3RDgwXHU3RDhEXHU3RDdGXHU3RDg1XHU3RDdBIisKLSAgICAgICAgIlx1N0Q4RVx1N0Q3Qlx1N0Q4M1x1N0Q3Q1x1N0Q4Q1x1N0Q5NFx1N0Q4NFx1N0Q3RCIrCi0gICAgICAgICJcdTdEOTJcdTdGNkRcdTdGNkJcdTdGNjdcdTdGNjhcdTdGNkNcdTdGQTZcdTdGQTUiKwotICAgICAgICAiXHU3RkE3XHU3RkRCXHU3RkRDXHU4MDIxXHU4MTY0XHU4MTYwXHU4MTc3XHU4MTVDIisKLSAgICAgICAgIlx1ODE2OVx1ODE1Qlx1ODE2Mlx1ODE3Mlx1NjcyMVx1ODE1RVx1ODE3Nlx1ODE2NyIrCi0gICAgICAgICJcdTgxNkZcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHU4MTQ0XHU4MTYxXHU4MjFEXHU4MjQ5XHU4MjQ0IisKLSAgICAgICAgIlx1ODI0MFx1ODI0Mlx1ODI0NVx1ODRGMVx1ODQzRlx1ODQ1Nlx1ODQ3Nlx1ODQ3OSIrCi0gICAgICAgICJcdTg0OEZcdTg0OERcdTg0NjVcdTg0NTFcdTg0NDBcdTg0ODZcdTg0NjdcdTg0MzAiKwotICAgICAgICAiXHU4NDREXHU4NDdEXHU4NDVBXHU4NDU5XHU4NDc0XHU4NDczXHU4NDVEXHU4NTA3IisKLSAgICAgICAgIlx1ODQ1RVx1ODQzN1x1ODQzQVx1ODQzNFx1ODQ3QVx1ODQ0M1x1ODQ3OFx1ODQzMiIrCi0gICAgICAgICJcdTg0NDVcdTg0MjlcdTgzRDlcdTg0NEJcdTg0MkZcdTg0NDJcdTg0MkRcdTg0NUYiKwotICAgICAgICAiXHU4NDcwXHU4NDM5XHU4NDRFXHU4NDRDXHU4NDUyXHU4NDZGXHU4NEM1XHU4NDhFIisKLSAgICAgICAgIlx1ODQzQlx1ODQ0N1x1ODQzNlx1ODQzM1x1ODQ2OFx1ODQ3RVx1ODQ0NFx1ODQyQiIrCi0gICAgICAgICJcdTg0NjBcdTg0NTRcdTg0NkVcdTg0NTBcdTg3MEJcdTg3MDRcdTg2RjdcdTg3MEMiKwotICAgICAgICAiXHU4NkZBXHU4NkQ2XHU4NkY1XHU4NzREXHU4NkY4XHU4NzBFXHU4NzA5XHU4NzAxIisKLSAgICAgICAgIlx1ODZGNlx1ODcwRFx1ODcwNVx1ODhENlx1ODhDQlx1ODhDRFx1ODhDRVx1ODhERSIrCi0gICAgICAgICJcdTg4REJcdTg4REFcdTg4Q0NcdTg4RDBcdTg5ODVcdTg5OUJcdTg5REZcdTg5RTUiKwotICAgICAgICAiXHU4OUU0XHU4OUUxXHU4OUUwXHU4OUUyXHU4OURDXHU4OUU2XHU4QTc2XHU4QTg2IisKLSAgICAgICAgIlx1OEE3Rlx1OEE2MVx1OEEzRlx1OEE3N1x1OEE4Mlx1OEE4NFx1OEE3NVx1OEE4MyIrCi0gICAgICAgICJcdThBODFcdThBNzRcdThBN0FcdThDM0NcdThDNEJcdThDNEFcdThDNjVcdThDNjQiKwotICAgICAgICAiXHU4QzY2XHU4Qzg2XHU4Qzg0XHU4Qzg1XHU4Q0NDXHU4RDY4XHU4RDY5XHU4RDkxIisKLSAgICAgICAgIlx1OEQ4Q1x1OEQ4RVx1OEQ4Rlx1OEQ4RFx1OEQ5M1x1OEQ5NFx1OEQ5MFx1OEQ5MiIrCi0gICAgICAgICJcdThERjBcdThERTBcdThERUNcdThERjFcdThERUVcdThERDBcdThERTlcdThERTMiKwotICAgICAgICAiXHU4REUyXHU4REU3XHU4REYyXHU4REVCXHU4REY0XHU4RjA2XHU4RUZGXHU4RjAxIisKLSAgICAgICAgIlx1OEYwMFx1OEYwNVx1OEYwN1x1OEYwOFx1OEYwMlx1OEYwQlx1OTA1Mlx1OTAzRiIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHU5MDQ0XHU5MDQ5XHU5MDNEXHU5MTEwXHU5MTBEXHU5MTBGIisKLSAgICAgICAgIlx1OTExMVx1OTExNlx1OTExNFx1OTEwQlx1OTEwRVx1OTE2RVx1OTE2Rlx1OTI0OCIrCi0gICAgICAgICJcdTkyNTJcdTkyMzBcdTkyM0FcdTkyNjZcdTkyMzNcdTkyNjVcdTkyNUVcdTkyODMiKwotICAgICAgICAiXHU5MjJFXHU5MjRBXHU5MjQ2XHU5MjZEXHU5MjZDXHU5MjRGXHU5MjYwXHU5MjY3IisKLSAgICAgICAgIlx1OTI2Rlx1OTIzNlx1OTI2MVx1OTI3MFx1OTIzMVx1OTI1NFx1OTI2M1x1OTI1MCIrCi0gICAgICAgICJcdTkyNzJcdTkyNEVcdTkyNTNcdTkyNENcdTkyNTZcdTkyMzJcdTk1OUZcdTk1OUMiKwotICAgICAgICAiXHU5NTlFXHU5NTlCXHU5NjkyXHU5NjkzXHU5NjkxXHU5Njk3XHU5NkNFXHU5NkZBIisKLSAgICAgICAgIlx1OTZGRFx1OTZGOFx1OTZGNVx1OTc3M1x1OTc3N1x1OTc3OFx1OTc3Mlx1OTgwRiIrCi0gICAgICAgICJcdTk4MERcdTk4MEVcdTk4QUNcdTk4RjZcdTk4RjlcdTk5QUZcdTk5QjJcdTk5QjAiKwotICAgICAgICAiXHU5OUI1XHU5QUFEXHU5QUFCXHU5QjVCXHU5Q0VBXHU5Q0VEXHU5Q0U3XHU5RTgwIisKLSAgICAgICAgIlx1OUVGRFx1NTBFNlx1NTBENFx1NTBEN1x1NTBFOFx1NTBGM1x1NTBEQlx1NTBFQSIrCi0gICAgICAgICJcdTUwRERcdTUwRTRcdTUwRDNcdTUwRUNcdTUwRjBcdTUwRUZcdTUwRTNcdTUwRTAiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGlubmVySW5kZXg0PQotICAgICAgICAiXHU1MUQ4XHU1MjgwXHU1MjgxXHU1MkU5XHU1MkVCXHU1MzMwXHU1M0FDXHU1NjI3IisKLSAgICAgICAgIlx1NTYxNVx1NTYwQ1x1NTYxMlx1NTVGQ1x1NTYwRlx1NTYxQ1x1NTYwMVx1NTYxMyIrCi0gICAgICAgICJcdTU2MDJcdTU1RkFcdTU2MURcdTU2MDRcdTU1RkZcdTU1RjlcdTU4ODlcdTU4N0MiKwotICAgICAgICAiXHU1ODkwXHU1ODk4XHU1ODg2XHU1ODgxXHU1ODdGXHU1ODc0XHU1ODhCXHU1ODdBIisKLSAgICAgICAgIlx1NTg4N1x1NTg5MVx1NTg4RVx1NTg3Nlx1NTg4Mlx1NTg4OFx1NTg3Qlx1NTg5NCIrCi0gICAgICAgICJcdTU4OEZcdTU4RkVcdTU5NkJcdTVBRENcdTVBRUVcdTVBRTVcdTVBRDVcdTVBRUEiKwotICAgICAgICAiXHU1QURBXHU1QUVEXHU1QUVCXHU1QUYzXHU1QUUyXHU1QUUwXHU1QURCXHU1QUVDIisKLSAgICAgICAgIlx1NUFERVx1NUFERFx1NUFEOVx1NUFFOFx1NUFERlx1NUI3N1x1NUJFMFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHU1QkUzXHU1QzYzXHU1RDgyXHU1RDgwXHU1RDdEXHU1RDg2XHU1RDdBIisKLSAgICAgICAgIlx1NUQ4MVx1NUQ3N1x1NUQ4QVx1NUQ4OVx1NUQ4OFx1NUQ3RVx1NUQ3Q1x1NUQ4RCIrCi0gICAgICAgICJcdTVENzlcdTVEN0ZcdTVFNThcdTVFNTlcdTVFNTNcdTVFRDhcdTVFRDFcdTVFRDciKwotICAgICAgICAiXHU1RUNFXHU1RURDXHU1RUQ1XHU1RUQ5XHU1RUQyXHU1RUQ0XHU1RjQ0XHU1RjQzIisKLSAgICAgICAgIlx1NUY2Rlx1NUZCNlx1NjEyQ1x1NjEyOFx1NjE0MVx1NjE1RVx1NjE3MVx1NjE3MyIrCi0gICAgICAgICJcdTYxNTJcdTYxNTNcdTYxNzJcdTYxNkNcdTYxODBcdTYxNzRcdTYxNTRcdTYxN0EiKwotICAgICAgICAiXHU2MTVCXHU2MTY1XHU2MTNCXHU2MTZBXHU2MTYxXHU2MTU2XHU2MjI5XHU2MjI3IisKLSAgICAgICAgIlx1NjIyQlx1NjQyQlx1NjQ0RFx1NjQ1Qlx1NjQ1RFx1NjQ3NFx1NjQ3Nlx1NjQ3MiIrCi0gICAgICAgICJcdTY0NzNcdTY0N0RcdTY0NzVcdTY0NjZcdTY0QTZcdTY0NEVcdTY0ODJcdTY0NUUiKwotICAgICAgICAiXHU2NDVDXHU2NDRCXHU2NDUzXHU2NDYwXHU2NDUwXHU2NDdGXHU2NDNGXHU2NDZDIisKLSAgICAgICAgIlx1NjQ2Qlx1NjQ1OVx1NjQ2NVx1NjQ3N1x1NjU3M1x1NjVBMFx1NjZBMVx1NjZBMCIrCi0gICAgICAgICJcdTY2OUZcdTY3MDVcdTY3MDRcdTY3MjJcdTY5QjFcdTY5QjZcdTY5QzlcdTY5QTAiKwotICAgICAgICAiXHU2OUNFXHU2OTk2XHU2OUIwXHU2OUFDXHU2OUJDXHU2OTkxXHU2OTk5XHU2OThFIisKLSAgICAgICAgIlx1NjlBN1x1Njk4RFx1NjlBOVx1NjlCRVx1NjlBRlx1NjlCRlx1NjlDNFx1NjlCRCIrCi0gICAgICAgICJcdTY5QTRcdTY5RDRcdTY5QjlcdTY5Q0FcdTY5OUFcdTY5Q0ZcdTY5QjNcdTY5OTMiKwotICAgICAgICAiXHU2OUFBXHU2OUExXHU2OTlFXHU2OUQ5XHU2OTk3XHU2OTkwXHU2OUMyXHU2OUI1IisKLSAgICAgICAgIlx1NjlBNVx1NjlDNlx1NkI0QVx1NkI0RFx1NkI0Qlx1NkI5RVx1NkI5Rlx1NkJBMCIrCi0gICAgICAgICJcdTZCQzNcdTZCQzRcdTZCRkVcdTZFQ0VcdTZFRjVcdTZFRjFcdTZGMDNcdTZGMjUiKwotICAgICAgICAiXHU2RUY4XHU2RjM3XHU2RUZCXHU2RjJFXHU2RjA5XHU2RjRFXHU2RjE5XHU2RjFBIisKLSAgICAgICAgIlx1NkYyN1x1NkYxOFx1NkYzQlx1NkYxMlx1NkVFRFx1NkYwQVx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHU2RjM2XHU2RjczXHU2RUY5XHU2RUVFXHU2RjJEXHU2RjQwXHU2RjMwXHU2RjNDIisKLSAgICAgICAgIlx1NkYzNVx1NkVFQlx1NkYwN1x1NkYwRVx1NkY0M1x1NkYwNVx1NkVGRFx1NkVGNiIrCi0gICAgICAgICJcdTZGMzlcdTZGMUNcdTZFRkNcdTZGM0FcdTZGMUZcdTZGMERcdTZGMUVcdTZGMDgiKwotICAgICAgICAiXHU2RjIxXHU3MTg3XHU3MTkwXHU3MTg5XHU3MTgwXHU3MTg1XHU3MTgyXHU3MThGIisKLSAgICAgICAgIlx1NzE3Qlx1NzE4Nlx1NzE4MVx1NzE5N1x1NzI0NFx1NzI1M1x1NzI5N1x1NzI5NSIrCi0gICAgICAgICJcdTcyOTNcdTczNDNcdTczNERcdTczNTFcdTczNENcdTc0NjJcdTc0NzNcdTc0NzEiKwotICAgICAgICAiXHU3NDc1XHU3NDcyXHU3NDY3XHU3NDZFXHU3NTAwXHU3NTAyXHU3NTAzXHU3NTdEIisKLSAgICAgICAgIlx1NzU5MFx1NzYxNlx1NzYwOFx1NzYwQ1x1NzYxNVx1NzYxMVx1NzYwQVx1NzYxNCIrCi0gICAgICAgICJcdTc2QjhcdTc3ODFcdTc3N0NcdTc3ODVcdTc3ODJcdTc3NkVcdTc3ODBcdTc3NkYiKwotICAgICAgICAiXHU3NzdFXHU3NzgzXHU3OEIyXHU3OEFBXHU3OEI0XHU3OEFEXHU3OEE4XHU3ODdFIisKLSAgICAgICAgIlx1NzhBQlx1Nzg5RVx1NzhBNVx1NzhBMFx1NzhBQ1x1NzhBMlx1NzhBNFx1Nzk5OCIrCi0gICAgICAgICJcdTc5OEFcdTc5OEJcdTc5OTZcdTc5OTVcdTc5OTRcdTc5OTNcdTc5OTdcdTc5ODgiKwotICAgICAgICAiXHU3OTkyXHU3OTkwXHU3QTJCXHU3QTRBXHU3QTMwXHU3QTJGXHU3QTI4XHU3QTI2IisKLSAgICAgICAgIlx1N0FBOFx1N0FBQlx1N0FBQ1x1N0FFRVx1N0I4OFx1N0I5Q1x1N0I4QVx1N0I5MSIrCi0gICAgICAgICJcdTdCOTBcdTdCOTZcdTdCOERcdTdCOENcdTdCOUJcdTdCOEVcdTdCODVcdTdCOTgiKwotICAgICAgICAiXHU1Mjg0XHU3Qjk5XHU3QkE0XHU3QjgyXHU3Q0JCXHU3Q0JGXHU3Q0JDXHU3Q0JBIisKLSAgICAgICAgIlx1N0RBN1x1N0RCN1x1N0RDMlx1N0RBM1x1N0RBQVx1N0RDMVx1N0RDMFx1N0RDNSIrCi0gICAgICAgICJcdTdEOURcdTdEQ0VcdTdEQzRcdTdEQzZcdTdEQ0JcdTdEQ0NcdTdEQUZcdTdEQjkiKwotICAgICAgICAiXHU3RDk2XHU3REJDXHU3RDlGXHU3REE2XHU3REFFXHU3REE5XHU3REExXHU3REM5IisKLSAgICAgICAgIlx1N0Y3M1x1N0ZFMlx1N0ZFM1x1N0ZFNVx1N0ZERVx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTgwMjQiKwotICAgICAgICAiXHU4MDVEXHU4MDVDXHU4MTg5XHU4MTg2XHU4MTgzXHU4MTg3XHU4MThEXHU4MThDIisKLSAgICAgICAgIlx1ODE4Qlx1ODIxNVx1ODQ5N1x1ODRBNFx1ODRBMVx1ODQ5Rlx1ODRCQVx1ODRDRSIrCi0gICAgICAgICJcdTg0QzJcdTg0QUNcdTg0QUVcdTg0QUJcdTg0QjlcdTg0QjRcdTg0QzFcdTg0Q0QiKwotICAgICAgICAiXHU4NEFBXHU4NDlBXHU4NEIxXHU4NEQwXHU4NDlEXHU4NEE3XHU4NEJCXHU4NEEyIisKLSAgICAgICAgIlx1ODQ5NFx1ODRDN1x1ODRDQ1x1ODQ5Qlx1ODRBOVx1ODRBRlx1ODRBOFx1ODRENiIrCi0gICAgICAgICJcdTg0OThcdTg0QjZcdTg0Q0ZcdTg0QTBcdTg0RDdcdTg0RDRcdTg0RDJcdTg0REIiKwotICAgICAgICAiXHU4NEIwXHU4NDkxXHU4NjYxXHU4NzMzXHU4NzIzXHU4NzI4XHU4NzZCXHU4NzQwIisKLSAgICAgICAgIlx1ODcyRVx1ODcxRVx1ODcyMVx1ODcxOVx1ODcxQlx1ODc0M1x1ODcyQ1x1ODc0MSIrCi0gICAgICAgICJcdTg3M0VcdTg3NDZcdTg3MjBcdTg3MzJcdTg3MkFcdTg3MkRcdTg3M0NcdTg3MTIiKwotICAgICAgICAiXHU4NzNBXHU4NzMxXHU4NzM1XHU4NzQyXHU4NzI2XHU4NzI3XHU4NzM4XHU4NzI0IisKLSAgICAgICAgIlx1ODcxQVx1ODczMFx1ODcxMVx1ODhGN1x1ODhFN1x1ODhGMVx1ODhGMlx1ODhGQSIrCi0gICAgICAgICJcdTg4RkVcdTg4RUVcdTg4RkNcdTg4RjZcdTg4RkJcdTg4RjBcdTg4RUNcdTg4RUIiKwotICAgICAgICAiXHU4OTlEXHU4OUExXHU4OTlGXHU4OTlFXHU4OUU5XHU4OUVCXHU4OUU4XHU4QUFCIisKLSAgICAgICAgIlx1OEE5OVx1OEE4Qlx1OEE5Mlx1OEE4Rlx1OEE5Nlx1OEMzRFx1OEM2OFx1OEM2OSIrCi0gICAgICAgICJcdThDRDVcdThDQ0ZcdThDRDdcdThEOTZcdThFMDlcdThFMDJcdThERkZcdThFMEQiKwotICAgICAgICAiXHU4REZEXHU4RTBBXHU4RTAzXHU4RTA3XHU4RTA2XHU4RTA1XHU4REZFXHU4RTAwIisKLSAgICAgICAgIlx1OEUwNFx1OEYxMFx1OEYxMVx1OEYwRVx1OEYwRFx1OTEyM1x1OTExQ1x1OTEyMCIrCi0gICAgICAgICJcdTkxMjJcdTkxMUZcdTkxMURcdTkxMUFcdTkxMjRcdTkxMjFcdTkxMUJcdTkxN0EiKwotICAgICAgICAiXHU5MTcyXHU5MTc5XHU5MTczXHU5MkE1XHU5MkE0XHU5Mjc2XHU5MjlCXHU5MjdBIisKLSAgICAgICAgIlx1OTJBMFx1OTI5NFx1OTJBQVx1OTI4RFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTkyQTZcdTkyOUEiKwotICAgICAgICAiXHU5MkFCXHU5Mjc5XHU5Mjk3XHU5MjdGXHU5MkEzXHU5MkVFXHU5MjhFXHU5MjgyIisKLSAgICAgICAgIlx1OTI5NVx1OTJBMlx1OTI3RFx1OTI4OFx1OTJBMVx1OTI4QVx1OTI4Nlx1OTI4QyIrCi0gICAgICAgICJcdTkyOTlcdTkyQTdcdTkyN0VcdTkyODdcdTkyQTlcdTkyOURcdTkyOEJcdTkyMkQiKwotICAgICAgICAiXHU5NjlFXHU5NkExXHU5NkZGXHU5NzU4XHU5NzdEXHU5NzdBXHU5NzdFXHU5NzgzIisKLSAgICAgICAgIlx1OTc4MFx1OTc4Mlx1OTc3Qlx1OTc4NFx1OTc4MVx1OTc3Rlx1OTdDRVx1OTdDRCIrCi0gICAgICAgICJcdTk4MTZcdTk4QURcdTk4QUVcdTk5MDJcdTk5MDBcdTk5MDdcdTk5OURcdTk5OUMiKwotICAgICAgICAiXHU5OUMzXHU5OUI5XHU5OUJCXHU5OUJBXHU5OUMyXHU5OUJEXHU5OUM3XHU5QUIxIisKLSAgICAgICAgIlx1OUFFM1x1OUFFN1x1OUIzRVx1OUIzRlx1OUI2MFx1OUI2MVx1OUI1Rlx1OUNGMSIrCi0gICAgICAgICJcdTlDRjJcdTlDRjVcdTlFQTdcdTUwRkZcdTUxMDNcdTUxMzBcdTUwRjhcdTUxMDYiKwotICAgICAgICAiXHU1MTA3XHU1MEY2XHU1MEZFXHU1MTBCXHU1MTBDXHU1MEZEXHU1MTBBXHU1MjhCIisKLSAgICAgICAgIlx1NTI4Q1x1NTJGMVx1NTJFRlx1NTY0OFx1NTY0Mlx1NTY0Q1x1NTYzNVx1NTY0MSIrCi0gICAgICAgICJcdTU2NEFcdTU2NDlcdTU2NDZcdTU2NThcdTU2NUFcdTU2NDBcdTU2MzNcdTU2M0QiKwotICAgICAgICAiXHU1NjJDXHU1NjNFXHU1NjM4XHU1NjJBXHU1NjNBXHU1NzFBXHU1OEFCXHU1ODlEIisKLSAgICAgICAgIlx1NThCMVx1NThBMFx1NThBM1x1NThBRlx1NThBQ1x1NThBNVx1NThBMVx1NThGRiIrCi0gICAgICAgICJcdTVBRkZcdTVBRjRcdTVBRkRcdTVBRjdcdTVBRjZcdTVCMDNcdTVBRjhcdTVCMDIiKwotICAgICAgICAiXHU1QUY5XHU1QjAxXHU1QjA3XHU1QjA1XHU1QjBGXHU1QzY3XHU1RDk5XHU1RDk3IisKLSAgICAgICAgIlx1NUQ5Rlx1NUQ5Mlx1NURBMlx1NUQ5M1x1NUQ5NVx1NURBMFx1NUQ5Q1x1NURBMSIrCi0gICAgICAgICJcdTVEOUFcdTVEOUVcdTVFNjlcdTVFNURcdTVFNjBcdTVFNUNcdTdERjNcdTVFREIiKwotICAgICAgICAiXHU1RURFXHU1RUUxXHU1RjQ5XHU1RkIyXHU2MThCXHU2MTgzXHU2MTc5XHU2MUIxIisKLSAgICAgICAgIlx1NjFCMFx1NjFBMlx1NjE4OVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTYxOUJcdTYxOTNcdTYxQUYiKwotICAgICAgICAiXHU2MUFEXHU2MTlGXHU2MTkyXHU2MUFBXHU2MUExXHU2MThEXHU2MTY2XHU2MUIzIisKLSAgICAgICAgIlx1NjIyRFx1NjQ2RVx1NjQ3MFx1NjQ5Nlx1NjRBMFx1NjQ4NVx1NjQ5N1x1NjQ5QyIrCi0gICAgICAgICJcdTY0OEZcdTY0OEJcdTY0OEFcdTY0OENcdTY0QTNcdTY0OUZcdTY0NjhcdTY0QjEiKwotICAgICAgICAiXHU2NDk4XHU2NTc2XHU2NTdBXHU2NTc5XHU2NTdCXHU2NUIyXHU2NUIzXHU2NkI1IisKLSAgICAgICAgIlx1NjZCMFx1NjZBOVx1NjZCMlx1NjZCN1x1NjZBQVx1NjZBRlx1NkEwMFx1NkEwNiIrCi0gICAgICAgICJcdTZBMTdcdTY5RTVcdTY5RjhcdTZBMTVcdTY5RjFcdTY5RTRcdTZBMjBcdTY5RkYiKwotICAgICAgICAiXHU2OUVDXHU2OUUyXHU2QTFCXHU2QTFEXHU2OUZFXHU2QTI3XHU2OUYyXHU2OUVFIisKLSAgICAgICAgIlx1NkExNFx1NjlGN1x1NjlFN1x1NkE0MFx1NkEwOFx1NjlFNlx1NjlGQlx1NkEwRCIrCi0gICAgICAgICJcdTY5RkNcdTY5RUJcdTZBMDlcdTZBMDRcdTZBMThcdTZBMjVcdTZBMEZcdTY5RjYiKwotICAgICAgICAiXHU2QTI2XHU2QTA3XHU2OUY0XHU2QTE2XHU2QjUxXHU2QkE1XHU2QkEzXHU2QkEyIisKLSAgICAgICAgIlx1NkJBNlx1NkMwMVx1NkMwMFx1NkJGRlx1NkMwMlx1NkY0MVx1NkYyNlx1NkY3RSIrCi0gICAgICAgICJcdTZGODdcdTZGQzZcdTZGOTJcdTZGOERcdTZGODlcdTZGOENcdTZGNjJcdTZGNEYiKwotICAgICAgICAiXHU2Rjg1XHU2RjVBXHU2Rjk2XHU2Rjc2XHU2RjZDXHU2RjgyXHU2RjU1XHU2RjcyIisKLSAgICAgICAgIlx1NkY1Mlx1NkY1MFx1NkY1N1x1NkY5NFx1NkY5M1x1NkY1RFx1NkYwMFx1NkY2MSIrCi0gICAgICAgICJcdTZGNkJcdTZGN0RcdTZGNjdcdTZGOTBcdTZGNTNcdTZGOEJcdTZGNjlcdTZGN0YiKwotICAgICAgICAiXHU2Rjk1XHU2RjYzXHU2Rjc3XHU2RjZBXHU2RjdCXHU3MUIyXHU3MUFGXHU3MTlCIisKLSAgICAgICAgIlx1NzFCMFx1NzFBMFx1NzE5QVx1NzFBOVx1NzFCNVx1NzE5RFx1NzFBNVx1NzE5RSIrCi0gICAgICAgICJcdTcxQTRcdTcxQTFcdTcxQUFcdTcxOUNcdTcxQTdcdTcxQjNcdTcyOThcdTcyOUEiKwotICAgICAgICAiXHU3MzU4XHU3MzUyXHU3MzVFXHU3MzVGXHU3MzYwXHU3MzVEXHU3MzVCXHU3MzYxIisKLSAgICAgICAgIlx1NzM1QVx1NzM1OVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTczNjJcdTc0ODdcdTc0ODlcdTc0OEEiKwotICAgICAgICAiXHU3NDg2XHU3NDgxXHU3NDdEXHU3NDg1XHU3NDg4XHU3NDdDXHU3NDc5XHU3NTA4IisKLSAgICAgICAgIlx1NzUwN1x1NzU3RVx1NzYyNVx1NzYxRVx1NzYxOVx1NzYxRFx1NzYxQ1x1NzYyMyIrCi0gICAgICAgICJcdTc2MUFcdTc2MjhcdTc2MUJcdTc2OUNcdTc2OURcdTc2OUVcdTc2OUJcdTc3OEQiKwotICAgICAgICAiXHU3NzhGXHU3Nzg5XHU3Nzg4XHU3OENEXHU3OEJCXHU3OENGXHU3OENDXHU3OEQxIisKLSAgICAgICAgIlx1NzhDRVx1NzhENFx1NzhDOFx1NzhDM1x1NzhDNFx1NzhDOVx1Nzk5QVx1NzlBMSIrCi0gICAgICAgICJcdTc5QTBcdTc5OUNcdTc5QTJcdTc5OUJcdTZCNzZcdTdBMzlcdTdBQjJcdTdBQjQiKwotICAgICAgICAiXHU3QUIzXHU3QkI3XHU3QkNCXHU3QkJFXHU3QkFDXHU3QkNFXHU3QkFGXHU3QkI5IisKLSAgICAgICAgIlx1N0JDQVx1N0JCNVx1N0NDNVx1N0NDOFx1N0NDQ1x1N0NDQlx1N0RGN1x1N0REQiIrCi0gICAgICAgICJcdTdERUFcdTdERTdcdTdERDdcdTdERTFcdTdFMDNcdTdERkFcdTdERTZcdTdERjYiKwotICAgICAgICAiXHU3REYxXHU3REYwXHU3REVFXHU3RERGXHU3Rjc2XHU3RkFDXHU3RkIwXHU3RkFEIisKLSAgICAgICAgIlx1N0ZFRFx1N0ZFQlx1N0ZFQVx1N0ZFQ1x1N0ZFNlx1N0ZFOFx1ODA2NFx1ODA2NyIrCi0gICAgICAgICJcdTgxQTNcdTgxOUZcdTgxOUVcdTgxOTVcdTgxQTJcdTgxOTlcdTgxOTdcdTgyMTYiKwotICAgICAgICAiXHU4MjRGXHU4MjUzXHU4MjUyXHU4MjUwXHU4MjRFXHU4MjUxXHU4NTI0XHU4NTNCIisKLSAgICAgICAgIlx1ODUwRlx1ODUwMFx1ODUyOVx1ODUwRVx1ODUwOVx1ODUwRFx1ODUxRlx1ODUwQSIrCi0gICAgICAgICJcdTg1MjdcdTg1MUNcdTg0RkJcdTg1MkJcdTg0RkFcdTg1MDhcdTg1MENcdTg0RjQiKwotICAgICAgICAiXHU4NTJBXHU4NEYyXHU4NTE1XHU4NEY3XHU4NEVCXHU4NEYzXHU4NEZDXHU4NTEyIisKLSAgICAgICAgIlx1ODRFQVx1ODRFOVx1ODUxNlx1ODRGRVx1ODUyOFx1ODUxRFx1ODUyRVx1ODUwMiIrCi0gICAgICAgICJcdTg0RkRcdTg1MUVcdTg0RjZcdTg1MzFcdTg1MjZcdTg0RTdcdTg0RThcdTg0RjAiKwotICAgICAgICAiXHU4NEVGXHU4NEY5XHU4NTE4XHU4NTIwXHU4NTMwXHU4NTBCXHU4NTE5XHU4NTJGIisKLSAgICAgICAgIlx1ODY2Mlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdTg3NTZcdTg3NjNcdTg3NjRcdTg3NzdcdTg3RTEiKwotICAgICAgICAiXHU4NzczXHU4NzU4XHU4NzU0XHU4NzVCXHU4NzUyXHU4NzYxXHU4NzVBXHU4NzUxIisKLSAgICAgICAgIlx1ODc1RVx1ODc2RFx1ODc2QVx1ODc1MFx1ODc0RVx1ODc1Rlx1ODc1RFx1ODc2RiIrCi0gICAgICAgICJcdTg3NkNcdTg3N0FcdTg3NkVcdTg3NUNcdTg3NjVcdTg3NEZcdTg3N0JcdTg3NzUiKwotICAgICAgICAiXHU4NzYyXHU4NzY3XHU4NzY5XHU4ODVBXHU4OTA1XHU4OTBDXHU4OTE0XHU4OTBCIisKLSAgICAgICAgIlx1ODkxN1x1ODkxOFx1ODkxOVx1ODkwNlx1ODkxNlx1ODkxMVx1ODkwRVx1ODkwOSIrCi0gICAgICAgICJcdTg5QTJcdTg5QTRcdTg5QTNcdTg5RURcdTg5RjBcdTg5RUNcdThBQ0ZcdThBQzYiKwotICAgICAgICAiXHU4QUI4XHU4QUQzXHU4QUQxXHU4QUQ0XHU4QUQ1XHU4QUJCXHU4QUQ3XHU4QUJFIisKLSAgICAgICAgIlx1OEFDMFx1OEFDNVx1OEFEOFx1OEFDM1x1OEFCQVx1OEFCRFx1OEFEOVx1OEMzRSIrCi0gICAgICAgICJcdThDNERcdThDOEZcdThDRTVcdThDREZcdThDRDlcdThDRThcdThDREFcdThDREQiKwotICAgICAgICAiXHU4Q0U3XHU4REEwXHU4RDlDXHU4REExXHU4RDlCXHU4RTIwXHU4RTIzXHU4RTI1IisKLSAgICAgICAgIlx1OEUyNFx1OEUyRVx1OEUxNVx1OEUxQlx1OEUxNlx1OEUxMVx1OEUxOVx1OEUyNiIrCi0gICAgICAgICJcdThFMjdcdThFMTRcdThFMTJcdThFMThcdThFMTNcdThFMUNcdThFMTdcdThFMUEiKwotICAgICAgICAiXHU4RjJDXHU4RjI0XHU4RjE4XHU4RjFBXHU4RjIwXHU4RjIzXHU4RjE2XHU4RjE3IisKLSAgICAgICAgIlx1OTA3M1x1OTA3MFx1OTA2Rlx1OTA2N1x1OTA2Qlx1OTEyRlx1OTEyQlx1OTEyOSIrCi0gICAgICAgICJcdTkxMkFcdTkxMzJcdTkxMjZcdTkxMkVcdTkxODVcdTkxODZcdTkxOEFcdTkxODEiKwotICAgICAgICAiXHU5MTgyXHU5MTg0XHU5MTgwXHU5MkQwXHU5MkMzXHU5MkM0XHU5MkMwXHU5MkQ5IisKLSAgICAgICAgIlx1OTJCNlx1OTJDRlx1OTJGMVx1OTJERlx1OTJEOFx1OTJFOVx1OTJEN1x1OTJERCIrCi0gICAgICAgICJcdTkyQ0NcdTkyRUZcdTkyQzJcdTkyRThcdTkyQ0FcdTkyQzhcdTkyQ0VcdTkyRTYiKwotICAgICAgICAiXHU5MkNEXHU5MkQ1XHU5MkM5XHU5MkUwXHU5MkRFXHU5MkU3XHU5MkQxXHU5MkQzIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdTkyQjVcdTkyRTFcdTkyQzZcdTkyQjRcdTk1N0NcdTk1QUMiKwotICAgICAgICAiXHU5NUFCXHU5NUFFXHU5NUIwXHU5NkE0XHU5NkEyXHU5NkQzXHU5NzA1XHU5NzA4IisKLSAgICAgICAgIlx1OTcwMlx1OTc1QVx1OTc4QVx1OTc4RVx1OTc4OFx1OTdEMFx1OTdDRlx1OTgxRSIrCi0gICAgICAgICJcdTk4MURcdTk4MjZcdTk4MjlcdTk4MjhcdTk4MjBcdTk4MUJcdTk4MjdcdTk4QjIiKwotICAgICAgICAiXHU5OTA4XHU5OEZBXHU5OTExXHU5OTE0XHU5OTE2XHU5OTE3XHU5OTE1XHU5OURDIisKLSAgICAgICAgIlx1OTlDRFx1OTlDRlx1OTlEM1x1OTlENFx1OTlDRVx1OTlDOVx1OTlENlx1OTlEOCIrCi0gICAgICAgICJcdTk5Q0JcdTk5RDdcdTk5Q0NcdTlBQjNcdTlBRUNcdTlBRUJcdTlBRjNcdTlBRjIiKwotICAgICAgICAiXHU5QUYxXHU5QjQ2XHU5QjQzXHU5QjY3XHU5Qjc0XHU5QjcxXHU5QjY2XHU5Qjc2IisKLSAgICAgICAgIlx1OUI3NVx1OUI3MFx1OUI2OFx1OUI2NFx1OUI2Q1x1OUNGQ1x1OUNGQVx1OUNGRCIrCi0gICAgICAgICJcdTlDRkZcdTlDRjdcdTlEMDdcdTlEMDBcdTlDRjlcdTlDRkJcdTlEMDhcdTlEMDUiKwotICAgICAgICAiXHU5RDA0XHU5RTgzXHU5RUQzXHU5RjBGXHU5RjEwXHU1MTFDXHU1MTEzXHU1MTE3IisKLSAgICAgICAgIlx1NTExQVx1NTExMVx1NTFERVx1NTMzNFx1NTNFMVx1NTY3MFx1NTY2MFx1NTY2RSIrCi0gICAgICAgICJcdTU2NzNcdTU2NjZcdTU2NjNcdTU2NkRcdTU2NzJcdTU2NUVcdTU2NzdcdTU3MUMiKwotICAgICAgICAiXHU1NzFCXHU1OEM4XHU1OEJEXHU1OEM5XHU1OEJGXHU1OEJBXHU1OEMyXHU1OEJDIisKLSAgICAgICAgIlx1NThDNlx1NUIxN1x1NUIxOVx1NUIxQlx1NUIyMVx1NUIxNFx1NUIxM1x1NUIxMCIrCi0gICAgICAgICJcdTVCMTZcdTVCMjhcdTVCMUFcdTVCMjBcdTVCMUVcdTVCRUZcdTVEQUNcdTVEQjEiKwotICAgICAgICAiXHU1REE5XHU1REE3XHU1REI1XHU1REIwXHU1REFFXHU1REFBXHU1REE4XHU1REIyIisKLSAgICAgICAgIlx1NURBRFx1NURBRlx1NURCNFx1NUU2N1x1NUU2OFx1NUU2Nlx1NUU2Rlx1NUVFOSIrCi0gICAgICAgICJcdTVFRTdcdTVFRTZcdTVFRThcdTVFRTVcdTVGNEJcdTVGQkNcdTYxOURcdTYxQTgiKwotICAgICAgICAiXHU2MTk2XHU2MUM1XHU2MUI0XHU2MUM2XHU2MUMxXHU2MUNDXHU2MUJBXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdTYxQkZcdTYxQjhcdTYxOENcdTY0RDdcdTY0RDZcdTY0RDBcdTY0Q0YiKwotICAgICAgICAiXHU2NEM5XHU2NEJEXHU2NDg5XHU2NEMzXHU2NERCXHU2NEYzXHU2NEQ5XHU2NTMzIisKLSAgICAgICAgIlx1NjU3Rlx1NjU3Q1x1NjVBMlx1NjZDOFx1NjZCRVx1NjZDMFx1NjZDQVx1NjZDQiIrCi0gICAgICAgICJcdTY2Q0ZcdTY2QkRcdTY2QkJcdTY2QkFcdTY2Q0NcdTY3MjNcdTZBMzRcdTZBNjYiKwotICAgICAgICAiXHU2QTQ5XHU2QTY3XHU2QTMyXHU2QTY4XHU2QTNFXHU2QTVEXHU2QTZEXHU2QTc2IisKLSAgICAgICAgIlx1NkE1Qlx1NkE1MVx1NkEyOFx1NkE1QVx1NkEzQlx1NkEzRlx1NkE0MVx1NkE2QSIrCi0gICAgICAgICJcdTZBNjRcdTZBNTBcdTZBNEZcdTZBNTRcdTZBNkZcdTZBNjlcdTZBNjBcdTZBM0MiKwotICAgICAgICAiXHU2QTVFXHU2QTU2XHU2QTU1XHU2QTREXHU2QTRFXHU2QTQ2XHU2QjU1XHU2QjU0IisKLSAgICAgICAgIlx1NkI1Nlx1NkJBN1x1NkJBQVx1NkJBQlx1NkJDOFx1NkJDN1x1NkMwNFx1NkMwMyIrCi0gICAgICAgICJcdTZDMDZcdTZGQURcdTZGQ0JcdTZGQTNcdTZGQzdcdTZGQkNcdTZGQ0VcdTZGQzgiKwotICAgICAgICAiXHU2RjVFXHU2RkM0XHU2RkJEXHU2RjlFXHU2RkNBXHU2RkE4XHU3MDA0XHU2RkE1IisKLSAgICAgICAgIlx1NkZBRVx1NkZCQVx1NkZBQ1x1NkZBQVx1NkZDRlx1NkZCRlx1NkZCOFx1NkZBMiIrCi0gICAgICAgICJcdTZGQzlcdTZGQUJcdTZGQ0RcdTZGQUZcdTZGQjJcdTZGQjBcdTcxQzVcdTcxQzIiKwotICAgICAgICAiXHU3MUJGXHU3MUI4XHU3MUQ2XHU3MUMwXHU3MUMxXHU3MUNCXHU3MUQ0XHU3MUNBIisKLSAgICAgICAgIlx1NzFDN1x1NzFDRlx1NzFCRFx1NzFEOFx1NzFCQ1x1NzFDNlx1NzFEQVx1NzFEQiIrCi0gICAgICAgICJcdTcyOURcdTcyOUVcdTczNjlcdTczNjZcdTczNjdcdTczNkNcdTczNjVcdTczNkIiKwotICAgICAgICAiXHU3MzZBXHU3NDdGXHU3NDlBXHU3NEEwXHU3NDk0XHU3NDkyXHU3NDk1XHU3NEExIisKLSAgICAgICAgIlx1NzUwQlx1NzU4MFx1NzYyRlx1NzYyRFx1NzYzMVx1NzYzRFx1NzYzM1x1NzYzQyIrCi0gICAgICAgICJcdTc2MzVcdTc2MzJcdTc2MzBcdTc2QkJcdTc2RTZcdTc3OUFcdTc3OURcdTc3QTEiKwotICAgICAgICAiXHU3NzlDXHU3NzlCXHU3N0EyXHU3N0EzXHU3Nzk1XHU3Nzk5XHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdTc3OTdcdTc4RERcdTc4RTlcdTc4RTVcdTc4RUFcdTc4REVcdTc4RTNcdTc4REIiKwotICAgICAgICAiXHU3OEUxXHU3OEUyXHU3OEVEXHU3OERGXHU3OEUwXHU3OUE0XHU3QTQ0XHU3QTQ4IisKLSAgICAgICAgIlx1N0E0N1x1N0FCNlx1N0FCOFx1N0FCNVx1N0FCMVx1N0FCN1x1N0JERVx1N0JFMyIrCi0gICAgICAgICJcdTdCRTdcdTdCRERcdTdCRDVcdTdCRTVcdTdCREFcdTdCRThcdTdCRjlcdTdCRDQiKwotICAgICAgICAiXHU3QkVBXHU3QkUyXHU3QkRDXHU3QkVCXHU3QkQ4XHU3QkRGXHU3Q0QyXHU3Q0Q0IisKLSAgICAgICAgIlx1N0NEN1x1N0NEMFx1N0NEMVx1N0UxMlx1N0UyMVx1N0UxN1x1N0UwQ1x1N0UxRiIrCi0gICAgICAgICJcdTdFMjBcdTdFMTNcdTdFMEVcdTdFMUNcdTdFMTVcdTdFMUFcdTdFMjJcdTdFMEIiKwotICAgICAgICAiXHU3RTBGXHU3RTE2XHU3RTBEXHU3RTE0XHU3RTI1XHU3RTI0XHU3RjQzXHU3RjdCIisKLSAgICAgICAgIlx1N0Y3Q1x1N0Y3QVx1N0ZCMVx1N0ZFRlx1ODAyQVx1ODAyOVx1ODA2Q1x1ODFCMSIrCi0gICAgICAgICJcdTgxQTZcdTgxQUVcdTgxQjlcdTgxQjVcdTgxQUJcdTgxQjBcdTgxQUNcdTgxQjQiKwotICAgICAgICAiXHU4MUIyXHU4MUI3XHU4MUE3XHU4MUYyXHU4MjU1XHU4MjU2XHU4MjU3XHU4NTU2IisKLSAgICAgICAgIlx1ODU0NVx1ODU2Qlx1ODU0RFx1ODU1M1x1ODU2MVx1ODU1OFx1ODU0MFx1ODU0NiIrCi0gICAgICAgICJcdTg1NjRcdTg1NDFcdTg1NjJcdTg1NDRcdTg1NTFcdTg1NDdcdTg1NjNcdTg1M0UiKwotICAgICAgICAiXHU4NTVCXHU4NTcxXHU4NTRFXHU4NTZFXHU4NTc1XHU4NTU1XHU4NTY3XHU4NTYwIisKLSAgICAgICAgIlx1ODU4Q1x1ODU2Nlx1ODU1RFx1ODU1NFx1ODU2NVx1ODU2Q1x1ODY2M1x1ODY2NSIrCi0gICAgICAgICJcdTg2NjRcdTg3OUJcdTg3OEZcdTg3OTdcdTg3OTNcdTg3OTJcdTg3ODhcdTg3ODEiKwotICAgICAgICAiXHU4Nzk2XHU4Nzk4XHU4Nzc5XHU4Nzg3XHU4N0EzXHU4Nzg1XHU4NzkwXHU4NzkxIisKLSAgICAgICAgIlx1ODc5RFx1ODc4NFx1ODc5NFx1ODc5Q1x1ODc5QVx1ODc4OVx1ODkxRVx1ODkyNiIrCi0gICAgICAgICJcdTg5MzBcdTg5MkRcdTg5MkVcdTg5MjdcdTg5MzFcdTg5MjJcdTg5MjlcdTg5MjMiKwotICAgICAgICAiXHU4OTJGXHU4OTJDXHU4OTFGXHU4OUYxXHU4QUUwXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1OEFFMiIrCi0gICAgICAgICJcdThBRjJcdThBRjRcdThBRjVcdThBRERcdThCMTRcdThBRTRcdThBREZcdThBRjAiKwotICAgICAgICAiXHU4QUM4XHU4QURFXHU4QUUxXHU4QUU4XHU4QUZGXHU4QUVGXHU4QUZCXHU4QzkxIisKLSAgICAgICAgIlx1OEM5Mlx1OEM5MFx1OENGNVx1OENFRVx1OENGMVx1OENGMFx1OENGM1x1OEQ2QyIrCi0gICAgICAgICJcdThENkVcdThEQTVcdThEQTdcdThFMzNcdThFM0VcdThFMzhcdThFNDBcdThFNDUiKwotICAgICAgICAiXHU4RTM2XHU4RTNDXHU4RTNEXHU4RTQxXHU4RTMwXHU4RTNGXHU4RUJEXHU4RjM2IisKLSAgICAgICAgIlx1OEYyRVx1OEYzNVx1OEYzMlx1OEYzOVx1OEYzN1x1OEYzNFx1OTA3Nlx1OTA3OSIrCi0gICAgICAgICJcdTkwN0JcdTkwODZcdTkwRkFcdTkxMzNcdTkxMzVcdTkxMzZcdTkxOTNcdTkxOTAiKwotICAgICAgICAiXHU5MTkxXHU5MThEXHU5MThGXHU5MzI3XHU5MzFFXHU5MzA4XHU5MzFGXHU5MzA2IisKLSAgICAgICAgIlx1OTMwRlx1OTM3QVx1OTMzOFx1OTMzQ1x1OTMxQlx1OTMyM1x1OTMxMlx1OTMwMSIrCi0gICAgICAgICJcdTkzNDZcdTkzMkRcdTkzMEVcdTkzMERcdTkyQ0JcdTkzMURcdTkyRkFcdTkzMjUiKwotICAgICAgICAiXHU5MzEzXHU5MkY5XHU5MkY3XHU5MzM0XHU5MzAyXHU5MzI0XHU5MkZGXHU5MzI5IisKLSAgICAgICAgIlx1OTMzOVx1OTMzNVx1OTMyQVx1OTMxNFx1OTMwQ1x1OTMwQlx1OTJGRVx1OTMwOSIrCi0gICAgICAgICJcdTkzMDBcdTkyRkJcdTkzMTZcdTk1QkNcdTk1Q0RcdTk1QkVcdTk1QjlcdTk1QkEiKwotICAgICAgICAiXHU5NUI2XHU5NUJGXHU5NUI1XHU5NUJEXHU5NkE5XHU5NkQ0XHU5NzBCXHU5NzEyIisKLSAgICAgICAgIlx1OTcxMFx1OTc5OVx1OTc5N1x1OTc5NFx1OTdGMFx1OTdGOFx1OTgzNVx1OTgyRiIrCi0gICAgICAgICJcdTk4MzJcdTk5MjRcdTk5MUZcdTk5MjdcdTk5MjlcdTk5OUVcdTk5RUVcdTk5RUMiKwotICAgICAgICAiXHU5OUU1XHU5OUU0XHU5OUYwXHU5OUUzXHU5OUVBXHU5OUU5XHU5OUU3XHU5QUI5IisKLSAgICAgICAgIlx1OUFCRlx1OUFCNFx1OUFCQlx1OUFGNlx1OUFGQVx1OUFGOVx1OUFGN1x1OUIzMyIrCi0gICAgICAgICJcdTlCODBcdTlCODVcdTlCODdcdTlCN0NcdTlCN0VcdTlCN0JcdTlCODJcdTlCOTMiKwotICAgICAgICAiXHU5QjkyXHU5QjkwXHU5QjdBXHU5Qjk1XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1OUI3RFx1OUI4OCIrCi0gICAgICAgICJcdTlEMjVcdTlEMTdcdTlEMjBcdTlEMUVcdTlEMTRcdTlEMjlcdTlEMURcdTlEMTgiKwotICAgICAgICAiXHU5RDIyXHU5RDEwXHU5RDE5XHU5RDFGXHU5RTg4XHU5RTg2XHU5RTg3XHU5RUFFIisKLSAgICAgICAgIlx1OUVBRFx1OUVENVx1OUVENlx1OUVGQVx1OUYxMlx1OUYzRFx1NTEyNlx1NTEyNSIrCi0gICAgICAgICJcdTUxMjJcdTUxMjRcdTUxMjBcdTUxMjlcdTUyRjRcdTU2OTNcdTU2OENcdTU2OEQiKwotICAgICAgICAiXHU1Njg2XHU1Njg0XHU1NjgzXHU1NjdFXHU1NjgyXHU1NjdGXHU1NjgxXHU1OEQ2IisKLSAgICAgICAgIlx1NThENFx1NThDRlx1NThEMlx1NUIyRFx1NUIyNVx1NUIzMlx1NUIyM1x1NUIyQyIrCi0gICAgICAgICJcdTVCMjdcdTVCMjZcdTVCMkZcdTVCMkVcdTVCN0JcdTVCRjFcdTVCRjJcdTVEQjciKwotICAgICAgICAiXHU1RTZDXHU1RTZBXHU1RkJFXHU1RkJCXHU2MUMzXHU2MUI1XHU2MUJDXHU2MUU3IisKLSAgICAgICAgIlx1NjFFMFx1NjFFNVx1NjFFNFx1NjFFOFx1NjFERVx1NjRFRlx1NjRFOVx1NjRFMyIrCi0gICAgICAgICJcdTY0RUJcdTY0RTRcdTY0RThcdTY1ODFcdTY1ODBcdTY1QjZcdTY1REFcdTY2RDIiKwotICAgICAgICAiXHU2QThEXHU2QTk2XHU2QTgxXHU2QUE1XHU2QTg5XHU2QTlGXHU2QTlCXHU2QUExIisKLSAgICAgICAgIlx1NkE5RVx1NkE4N1x1NkE5M1x1NkE4RVx1NkE5NVx1NkE4M1x1NkFBOFx1NkFBNCIrCi0gICAgICAgICJcdTZBOTFcdTZBN0ZcdTZBQTZcdTZBOUFcdTZBODVcdTZBOENcdTZBOTJcdTZCNUIiKwotICAgICAgICAiXHU2QkFEXHU2QzA5XHU2RkNDXHU2RkE5XHU2RkY0XHU2RkQ0XHU2RkUzXHU2RkRDIisKLSAgICAgICAgIlx1NkZFRFx1NkZFN1x1NkZFNlx1NkZERVx1NkZGMlx1NkZERFx1NkZFMlx1NkZFOCIrCi0gICAgICAgICJcdTcxRTFcdTcxRjFcdTcxRThcdTcxRjJcdTcxRTRcdTcxRjBcdTcxRTJcdTczNzMiKwotICAgICAgICAiXHU3MzZFXHU3MzZGXHU3NDk3XHU3NEIyXHU3NEFCXHU3NDkwXHU3NEFBXHU3NEFEIisKLSAgICAgICAgIlx1NzRCMVx1NzRBNVx1NzRBRlx1NzUxMFx1NzUxMVx1NzUxMlx1NzUwRlx1NzU4NCIrCi0gICAgICAgICJcdTc2NDNcdTc2NDhcdTc2NDlcdTc2NDdcdTc2QTRcdTc2RTlcdTc3QjVcdTc3QUIiKwotICAgICAgICAiXHU3N0IyXHU3N0I3XHU3N0I2XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1NzdCNFx1NzdCMVx1NzdBOCIrCi0gICAgICAgICJcdTc3RjBcdTc4RjNcdTc4RkRcdTc5MDJcdTc4RkJcdTc4RkNcdTc4RjJcdTc5MDUiKwotICAgICAgICAiXHU3OEY5XHU3OEZFXHU3OTA0XHU3OUFCXHU3OUE4XHU3QTVDXHU3QTVCXHU3QTU2IisKLSAgICAgICAgIlx1N0E1OFx1N0E1NFx1N0E1QVx1N0FCRVx1N0FDMFx1N0FDMVx1N0MwNVx1N0MwRiIrCi0gICAgICAgICJcdTdCRjJcdTdDMDBcdTdCRkZcdTdCRkJcdTdDMEVcdTdCRjRcdTdDMEJcdTdCRjMiKwotICAgICAgICAiXHU3QzAyXHU3QzA5XHU3QzAzXHU3QzAxXHU3QkY4XHU3QkZEXHU3QzA2XHU3QkYwIisKLSAgICAgICAgIlx1N0JGMVx1N0MxMFx1N0MwQVx1N0NFOFx1N0UyRFx1N0UzQ1x1N0U0Mlx1N0UzMyIrCi0gICAgICAgICJcdTk4NDhcdTdFMzhcdTdFMkFcdTdFNDlcdTdFNDBcdTdFNDdcdTdFMjlcdTdFNEMiKwotICAgICAgICAiXHU3RTMwXHU3RTNCXHU3RTM2XHU3RTQ0XHU3RTNBXHU3RjQ1XHU3RjdGXHU3RjdFIisKLSAgICAgICAgIlx1N0Y3RFx1N0ZGNFx1N0ZGMlx1ODAyQ1x1ODFCQlx1ODFDNFx1ODFDQ1x1ODFDQSIrCi0gICAgICAgICJcdTgxQzVcdTgxQzdcdTgxQkNcdTgxRTlcdTgyNUJcdTgyNUFcdTgyNUNcdTg1ODMiKwotICAgICAgICAiXHU4NTgwXHU4NThGXHU4NUE3XHU4NTk1XHU4NUEwXHU4NThCXHU4NUEzXHU4NTdCIisKLSAgICAgICAgIlx1ODVBNFx1ODU5QVx1ODU5RVx1ODU3N1x1ODU3Q1x1ODU4OVx1ODVBMVx1ODU3QSIrCi0gICAgICAgICJcdTg1NzhcdTg1NTdcdTg1OEVcdTg1OTZcdTg1ODZcdTg1OERcdTg1OTlcdTg1OUQiKwotICAgICAgICAiXHU4NTgxXHU4NUEyXHU4NTgyXHU4NTg4XHU4NTg1XHU4NTc5XHU4NTc2XHU4NTk4IisKLSAgICAgICAgIlx1ODU5MFx1ODU5Rlx1ODY2OFx1ODdCRVx1ODdBQVx1ODdBRFx1ODdDNVx1ODdCMCIrCi0gICAgICAgICJcdTg3QUNcdTg3QjlcdTg3QjVcdTg3QkNcdTg3QUVcdTg3QzlcdTg3QzNcdTg3QzIiKwotICAgICAgICAiXHU4N0NDXHU4N0I3XHU4N0FGXHU4N0M0XHU4N0NBXHU4N0I0XHU4N0I2XHU4N0JGIisKLSAgICAgICAgIlx1ODdCOFx1ODdCRFx1ODdERVx1ODdCMlx1ODkzNVx1ODkzM1x1ODkzQ1x1ODkzRSIrCi0gICAgICAgICJcdTg5NDFcdTg5NTJcdTg5MzdcdTg5NDJcdTg5QURcdTg5QUZcdTg5QUVcdTg5RjIiKwotICAgICAgICAiXHU4OUYzXHU4QjFFXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1OEIxOFx1OEIxNlx1OEIxMVx1OEIwNSIrCi0gICAgICAgICJcdThCMEJcdThCMjJcdThCMEZcdThCMTJcdThCMTVcdThCMDdcdThCMERcdThCMDgiKwotICAgICAgICAiXHU4QjA2XHU4QjFDXHU4QjEzXHU4QjFBXHU4QzRGXHU4QzcwXHU4QzcyXHU4QzcxIisKLSAgICAgICAgIlx1OEM2Rlx1OEM5NVx1OEM5NFx1OENGOVx1OEQ2Rlx1OEU0RVx1OEU0RFx1OEU1MyIrCi0gICAgICAgICJcdThFNTBcdThFNENcdThFNDdcdThGNDNcdThGNDBcdTkwODVcdTkwN0VcdTkxMzgiKwotICAgICAgICAiXHU5MTlBXHU5MUEyXHU5MTlCXHU5MTk5XHU5MTlGXHU5MUExXHU5MTlEXHU5MUEwIisKLSAgICAgICAgIlx1OTNBMVx1OTM4M1x1OTNBRlx1OTM2NFx1OTM1Nlx1OTM0N1x1OTM3Q1x1OTM1OCIrCi0gICAgICAgICJcdTkzNUNcdTkzNzZcdTkzNDlcdTkzNTBcdTkzNTFcdTkzNjBcdTkzNkRcdTkzOEYiKwotICAgICAgICAiXHU5MzRDXHU5MzZBXHU5Mzc5XHU5MzU3XHU5MzU1XHU5MzUyXHU5MzRGXHU5MzcxIisKLSAgICAgICAgIlx1OTM3N1x1OTM3Qlx1OTM2MVx1OTM1RVx1OTM2M1x1OTM2N1x1OTM4MFx1OTM0RSIrCi0gICAgICAgICJcdTkzNTlcdTk1QzdcdTk1QzBcdTk1QzlcdTk1QzNcdTk1QzVcdTk1QjdcdTk2QUUiKwotICAgICAgICAiXHU5NkIwXHU5NkFDXHU5NzIwXHU5NzFGXHU5NzE4XHU5NzFEXHU5NzE5XHU5NzlBIisKLSAgICAgICAgIlx1OTdBMVx1OTc5Q1x1OTc5RVx1OTc5RFx1OTdENVx1OTdENFx1OTdGMVx1OTg0MSIrCi0gICAgICAgICJcdTk4NDRcdTk4NEFcdTk4NDlcdTk4NDVcdTk4NDNcdTk5MjVcdTk5MkJcdTk5MkMiKwotICAgICAgICAiXHU5OTJBXHU5OTMzXHU5OTMyXHU5OTJGXHU5OTJEXHU5OTMxXHU5OTMwXHU5OTk4IisKLSAgICAgICAgIlx1OTlBM1x1OTlBMVx1OUEwMlx1OTlGQVx1OTlGNFx1OTlGN1x1OTlGOVx1OTlGOCIrCi0gICAgICAgICJcdTk5RjZcdTk5RkJcdTk5RkRcdTk5RkVcdTk5RkNcdTlBMDNcdTlBQkVcdTlBRkUiKwotICAgICAgICAiXHU5QUZEXHU5QjAxXHU5QUZDXHU5QjQ4XHU5QjlBXHU5QkE4XHU5QjlFXHU5QjlCIisKLSAgICAgICAgIlx1OUJBNlx1OUJBMVx1OUJBNVx1OUJBNFx1OUI4Nlx1OUJBMlx1OUJBMFx1OUJBRiIrCi0gICAgICAgICJcdTlEMzNcdTlENDFcdTlENjdcdTlEMzZcdTlEMkVcdTlEMkZcdTlEMzFcdTlEMzgiKwotICAgICAgICAiXHU5RDMwXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1OUQ0NVx1OUQ0Mlx1OUQ0M1x1OUQzRVx1OUQzNyIrCi0gICAgICAgICJcdTlENDBcdTlEM0RcdTdGRjVcdTlEMkRcdTlFOEFcdTlFODlcdTlFOERcdTlFQjAiKwotICAgICAgICAiXHU5RUM4XHU5RURBXHU5RUZCXHU5RUZGXHU5RjI0XHU5RjIzXHU5RjIyXHU5RjU0IisKLSAgICAgICAgIlx1OUZBMFx1NTEzMVx1NTEyRFx1NTEyRVx1NTY5OFx1NTY5Q1x1NTY5N1x1NTY5QSIrCi0gICAgICAgICJcdTU2OURcdTU2OTlcdTU5NzBcdTVCM0NcdTVDNjlcdTVDNkFcdTVEQzBcdTVFNkQiKwotICAgICAgICAiXHU1RTZFXHU2MUQ4XHU2MURGXHU2MUVEXHU2MUVFXHU2MUYxXHU2MUVBXHU2MUYwIisKLSAgICAgICAgIlx1NjFFQlx1NjFENlx1NjFFOVx1NjRGRlx1NjUwNFx1NjRGRFx1NjRGOFx1NjUwMSIrCi0gICAgICAgICJcdTY1MDNcdTY0RkNcdTY1OTRcdTY1REJcdTY2REFcdTY2REJcdTY2RDhcdTZBQzUiKwotICAgICAgICAiXHU2QUI5XHU2QUJEXHU2QUUxXHU2QUM2XHU2QUJBXHU2QUI2XHU2QUI3XHU2QUM3IisKLSAgICAgICAgIlx1NkFCNFx1NkFBRFx1NkI1RVx1NkJDOVx1NkMwQlx1NzAwN1x1NzAwQ1x1NzAwRCIrCi0gICAgICAgICJcdTcwMDFcdTcwMDVcdTcwMTRcdTcwMEVcdTZGRkZcdTcwMDBcdTZGRkJcdTcwMjYiKwotICAgICAgICAiXHU2RkZDXHU2RkY3XHU3MDBBXHU3MjAxXHU3MUZGXHU3MUY5XHU3MjAzXHU3MUZEIisKLSAgICAgICAgIlx1NzM3Nlx1NzRCOFx1NzRDMFx1NzRCNVx1NzRDMVx1NzRCRVx1NzRCNlx1NzRCQiIrCi0gICAgICAgICJcdTc0QzJcdTc1MTRcdTc1MTNcdTc2NUNcdTc2NjRcdTc2NTlcdTc2NTBcdTc2NTMiKwotICAgICAgICAiXHU3NjU3XHU3NjVBXHU3NkE2XHU3NkJEXHU3NkVDXHU3N0MyXHU3N0JBXHU3OEZGIisKLSAgICAgICAgIlx1NzkwQ1x1NzkxM1x1NzkxNFx1NzkwOVx1NzkxMFx1NzkxMlx1NzkxMVx1NzlBRCIrCi0gICAgICAgICJcdTc5QUNcdTdBNUZcdTdDMUNcdTdDMjlcdTdDMTlcdTdDMjBcdTdDMUZcdTdDMkQiKwotICAgICAgICAiXHU3QzFEXHU3QzI2XHU3QzI4XHU3QzIyXHU3QzI1XHU3QzMwXHU3RTVDXHU3RTUwIisKLSAgICAgICAgIlx1N0U1Nlx1N0U2M1x1N0U1OFx1N0U2Mlx1N0U1Rlx1N0U1MVx1N0U2MFx1N0U1NyIrCi0gICAgICAgICJcdTdFNTNcdTdGQjVcdTdGQjNcdTdGRjdcdTdGRjhcdTgwNzVcdTgxRDFcdTgxRDIiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1ODFEMFx1ODI1Rlx1ODI1RVx1ODVCNFx1ODVDNlx1ODVDMCIrCi0gICAgICAgICJcdTg1QzNcdTg1QzJcdTg1QjNcdTg1QjVcdTg1QkRcdTg1QzdcdTg1QzRcdTg1QkYiKwotICAgICAgICAiXHU4NUNCXHU4NUNFXHU4NUM4XHU4NUM1XHU4NUIxXHU4NUI2XHU4NUQyXHU4NjI0IisKLSAgICAgICAgIlx1ODVCOFx1ODVCN1x1ODVCRVx1ODY2OVx1ODdFN1x1ODdFNlx1ODdFMlx1ODdEQiIrCi0gICAgICAgICJcdTg3RUJcdTg3RUFcdTg3RTVcdTg3REZcdTg3RjNcdTg3RTRcdTg3RDRcdTg3REMiKwotICAgICAgICAiXHU4N0QzXHU4N0VEXHU4N0Q4XHU4N0UzXHU4N0E0XHU4N0Q3XHU4N0Q5XHU4ODAxIisKLSAgICAgICAgIlx1ODdGNFx1ODdFOFx1ODdERFx1ODk1M1x1ODk0Qlx1ODk0Rlx1ODk0Q1x1ODk0NiIrCi0gICAgICAgICJcdTg5NTBcdTg5NTFcdTg5NDlcdThCMkFcdThCMjdcdThCMjNcdThCMzNcdThCMzAiKwotICAgICAgICAiXHU4QjM1XHU4QjQ3XHU4QjJGXHU4QjNDXHU4QjNFXHU4QjMxXHU4QjI1XHU4QjM3IisKLSAgICAgICAgIlx1OEIyNlx1OEIzNlx1OEIyRVx1OEIyNFx1OEIzQlx1OEIzRFx1OEIzQVx1OEM0MiIrCi0gICAgICAgICJcdThDNzVcdThDOTlcdThDOThcdThDOTdcdThDRkVcdThEMDRcdThEMDJcdThEMDAiKwotICAgICAgICAiXHU4RTVDXHU4RTYyXHU4RTYwXHU4RTU3XHU4RTU2XHU4RTVFXHU4RTY1XHU4RTY3IjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBpbm5lckluZGV4NT0KLSAgICAgICAgIlx1OEU1Qlx1OEU1QVx1OEU2MVx1OEU1RFx1OEU2OVx1OEU1NFx1OEY0Nlx1OEY0NyIrCi0gICAgICAgICJcdThGNDhcdThGNEJcdTkxMjhcdTkxM0FcdTkxM0JcdTkxM0VcdTkxQThcdTkxQTUiKwotICAgICAgICAiXHU5MUE3XHU5MUFGXHU5MUFBXHU5M0I1XHU5MzhDXHU5MzkyXHU5M0I3XHU5MzlCIisKLSAgICAgICAgIlx1OTM5RFx1OTM4OVx1OTNBN1x1OTM4RVx1OTNBQVx1OTM5RVx1OTNBNlx1OTM5NSIrCi0gICAgICAgICJcdTkzODhcdTkzOTlcdTkzOUZcdTkzOERcdTkzQjFcdTkzOTFcdTkzQjJcdTkzQTQiKwotICAgICAgICAiXHU5M0E4XHU5M0I0XHU5M0EzXHU5M0E1XHU5NUQyXHU5NUQzXHU5NUQxXHU5NkIzIisKLSAgICAgICAgIlx1OTZEN1x1OTZEQVx1NURDMlx1OTZERlx1OTZEOFx1OTZERFx1OTcyM1x1OTcyMiIrCi0gICAgICAgICJcdTk3MjVcdTk3QUNcdTk3QUVcdTk3QThcdTk3QUJcdTk3QTRcdTk3QUFcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1OTdBMlx1OTdBNVx1OTdEN1x1OTdEOVx1OTdENlx1OTdEOFx1OTdGQSIrCi0gICAgICAgICJcdTk4NTBcdTk4NTFcdTk4NTJcdTk4QjhcdTk5NDFcdTk5M0NcdTk5M0FcdTlBMEYiKwotICAgICAgICAiXHU5QTBCXHU5QTA5XHU5QTBEXHU5QTA0XHU5QTExXHU5QTBBXHU5QTA1XHU5QTA3IisKLSAgICAgICAgIlx1OUEwNlx1OUFDMFx1OUFEQ1x1OUIwOFx1OUIwNFx1OUIwNVx1OUIyOVx1OUIzNSIrCi0gICAgICAgICJcdTlCNEFcdTlCNENcdTlCNEJcdTlCQzdcdTlCQzZcdTlCQzNcdTlCQkZcdTlCQzEiKwotICAgICAgICAiXHU5QkI1XHU5QkI4XHU5QkQzXHU5QkI2XHU5QkM0XHU5QkI5XHU5QkJEXHU5RDVDIisKLSAgICAgICAgIlx1OUQ1M1x1OUQ0Rlx1OUQ0QVx1OUQ1Qlx1OUQ0Qlx1OUQ1OVx1OUQ1Nlx1OUQ0QyIrCi0gICAgICAgICJcdTlENTdcdTlENTJcdTlENTRcdTlENUZcdTlENThcdTlENUFcdTlFOEVcdTlFOEMiKwotICAgICAgICAiXHU5RURGXHU5RjAxXHU5RjAwXHU5RjE2XHU5RjI1XHU5RjJCXHU5RjJBXHU5RjI5IisKLSAgICAgICAgIlx1OUYyOFx1OUY0Q1x1OUY1NVx1NTEzNFx1NTEzNVx1NTI5Nlx1NTJGN1x1NTNCNCIrCi0gICAgICAgICJcdTU2QUJcdTU2QURcdTU2QTZcdTU2QTdcdTU2QUFcdTU2QUNcdTU4REFcdTU4REQiKwotICAgICAgICAiXHU1OERCXHU1OTEyXHU1QjNEXHU1QjNFXHU1QjNGXHU1REMzXHU1RTcwXHU1RkJGIisKLSAgICAgICAgIlx1NjFGQlx1NjUwN1x1NjUxMFx1NjUwRFx1NjUwOVx1NjUwQ1x1NjUwRVx1NjU4NCIrCi0gICAgICAgICJcdTY1REVcdTY1RERcdTY2REVcdTZBRTdcdTZBRTBcdTZBQ0NcdTZBRDFcdTZBRDkiKwotICAgICAgICAiXHU2QUNCXHU2QURGXHU2QURDXHU2QUQwXHU2QUVCXHU2QUNGXHU2QUNEXHU2QURFIisKLSAgICAgICAgIlx1NkI2MFx1NkJCMFx1NkMwQ1x1NzAxOVx1NzAyN1x1NzAyMFx1NzAxNlx1NzAyQiIrCi0gICAgICAgICJcdTcwMjFcdTcwMjJcdTcwMjNcdTcwMjlcdTcwMTdcdTcwMjRcdTcwMUNcdTcwMkEiKwotICAgICAgICAiXHU3MjBDXHU3MjBBXHU3MjA3XHU3MjAyXHU3MjA1XHU3MkE1XHU3MkE2XHU3MkE0IisKLSAgICAgICAgIlx1NzJBM1x1NzJBMVx1NzRDQlx1NzRDNVx1NzRCN1x1NzRDM1x1NzUxNlx1NzY2MCIrCi0gICAgICAgICJcdTc3QzlcdTc3Q0FcdTc3QzRcdTc3RjFcdTc5MURcdTc5MUJcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1NzkyMVx1NzkxQ1x1NzkxN1x1NzkxRVx1NzlCMFx1N0E2N1x1N0E2OFx1N0MzMyIrCi0gICAgICAgICJcdTdDM0NcdTdDMzlcdTdDMkNcdTdDM0JcdTdDRUNcdTdDRUFcdTdFNzZcdTdFNzUiKwotICAgICAgICAiXHU3RTc4XHU3RTcwXHU3RTc3XHU3RTZGXHU3RTdBXHU3RTcyXHU3RTc0XHU3RTY4IisKLSAgICAgICAgIlx1N0Y0Qlx1N0Y0QVx1N0Y4M1x1N0Y4Nlx1N0ZCN1x1N0ZGRFx1N0ZGRVx1ODA3OCIrCi0gICAgICAgICJcdTgxRDdcdTgxRDVcdTgyNjRcdTgyNjFcdTgyNjNcdTg1RUJcdTg1RjFcdTg1RUQiKwotICAgICAgICAiXHU4NUQ5XHU4NUUxXHU4NUU4XHU4NURBXHU4NUQ3XHU4NUVDXHU4NUYyXHU4NUY4IisKLSAgICAgICAgIlx1ODVEOFx1ODVERlx1ODVFM1x1ODVEQ1x1ODVEMVx1ODVGMFx1ODVFNlx1ODVFRiIrCi0gICAgICAgICJcdTg1REVcdTg1RTJcdTg4MDBcdTg3RkFcdTg4MDNcdTg3RjZcdTg3RjdcdTg4MDkiKwotICAgICAgICAiXHU4ODBDXHU4ODBCXHU4ODA2XHU4N0ZDXHU4ODA4XHU4N0ZGXHU4ODBBXHU4ODAyIisKLSAgICAgICAgIlx1ODk2Mlx1ODk1QVx1ODk1Qlx1ODk1N1x1ODk2MVx1ODk1Q1x1ODk1OFx1ODk1RCIrCi0gICAgICAgICJcdTg5NTlcdTg5ODhcdTg5QjdcdTg5QjZcdTg5RjZcdThCNTBcdThCNDhcdThCNEEiKwotICAgICAgICAiXHU4QjQwXHU4QjUzXHU4QjU2XHU4QjU0XHU4QjRCXHU4QjU1XHU4QjUxXHU4QjQyIisKLSAgICAgICAgIlx1OEI1Mlx1OEI1N1x1OEM0M1x1OEM3N1x1OEM3Nlx1OEM5QVx1OEQwNlx1OEQwNyIrCi0gICAgICAgICJcdThEMDlcdThEQUNcdThEQUFcdThEQURcdThEQUJcdThFNkRcdThFNzhcdThFNzMiKwotICAgICAgICAiXHU4RTZBXHU4RTZGXHU4RTdCXHU4RUMyXHU4RjUyXHU4RjUxXHU4RjRGXHU4RjUwIisKLSAgICAgICAgIlx1OEY1M1x1OEZCNFx1OTE0MFx1OTEzRlx1OTFCMFx1OTFBRFx1OTNERVx1OTNDNyIrCi0gICAgICAgICJcdTkzQ0ZcdTkzQzJcdTkzREFcdTkzRDBcdTkzRjlcdTkzRUNcdTkzQ0NcdTkzRDkiKwotICAgICAgICAiXHU5M0E5XHU5M0U2XHU5M0NBXHU5M0Q0XHU5M0VFXHU5M0UzXHU5M0Q1XHU5M0M0IisKLSAgICAgICAgIlx1OTNDRVx1OTNDMFx1OTNEMlx1OTNFN1x1OTU3RFx1OTVEQVx1OTVEQlx1OTZFMSIrCi0gICAgICAgICJcdTk3MjlcdTk3MkJcdTk3MkNcdTk3MjhcdTk3MjZcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU5N0IzIisKLSAgICAgICAgIlx1OTdCN1x1OTdCNlx1OTdERFx1OTdERVx1OTdERlx1OTg1Q1x1OTg1OVx1OTg1RCIrCi0gICAgICAgICJcdTk4NTdcdTk4QkZcdTk4QkRcdTk4QkJcdTk4QkVcdTk5NDhcdTk5NDdcdTk5NDMiKwotICAgICAgICAiXHU5OUE2XHU5OUE3XHU5QTFBXHU5QTE1XHU5QTI1XHU5QTFEXHU5QTI0XHU5QTFCIisKLSAgICAgICAgIlx1OUEyMlx1OUEyMFx1OUEyN1x1OUEyM1x1OUExRVx1OUExQ1x1OUExNFx1OUFDMiIrCi0gICAgICAgICJcdTlCMEJcdTlCMEFcdTlCMEVcdTlCMENcdTlCMzdcdTlCRUFcdTlCRUJcdTlCRTAiKwotICAgICAgICAiXHU5QkRFXHU5QkU0XHU5QkU2XHU5QkUyXHU5QkYwXHU5QkQ0XHU5QkQ3XHU5QkVDIisKLSAgICAgICAgIlx1OUJEQ1x1OUJEOVx1OUJFNVx1OUJENVx1OUJFMVx1OUJEQVx1OUQ3N1x1OUQ4MSIrCi0gICAgICAgICJcdTlEOEFcdTlEODRcdTlEODhcdTlENzFcdTlEODBcdTlENzhcdTlEODZcdTlEOEIiKwotICAgICAgICAiXHU5RDhDXHU5RDdEXHU5RDZCXHU5RDc0XHU5RDc1XHU5RDcwXHU5RDY5XHU5RDg1IisKLSAgICAgICAgIlx1OUQ3M1x1OUQ3Qlx1OUQ4Mlx1OUQ2Rlx1OUQ3OVx1OUQ3Rlx1OUQ4N1x1OUQ2OCIrCi0gICAgICAgICJcdTlFOTRcdTlFOTFcdTlFQzBcdTlFRkNcdTlGMkRcdTlGNDBcdTlGNDFcdTlGNEQiKwotICAgICAgICAiXHU5RjU2XHU5RjU3XHU5RjU4XHU1MzM3XHU1NkIyXHU1NkI1XHU1NkIzXHU1OEUzIisKLSAgICAgICAgIlx1NUI0NVx1NURDNlx1NURDN1x1NUVFRVx1NUVFRlx1NUZDMFx1NUZDMVx1NjFGOSIrCi0gICAgICAgICJcdTY1MTdcdTY1MTZcdTY1MTVcdTY1MTNcdTY1REZcdTY2RThcdTY2RTNcdTY2RTQiKwotICAgICAgICAiXHU2QUYzXHU2QUYwXHU2QUVBXHU2QUU4XHU2QUY5XHU2QUYxXHU2QUVFXHU2QUVGIisKLSAgICAgICAgIlx1NzAzQ1x1NzAzNVx1NzAyRlx1NzAzN1x1NzAzNFx1NzAzMVx1NzA0Mlx1NzAzOCIrCi0gICAgICAgICJcdTcwM0ZcdTcwM0FcdTcwMzlcdTcwNDBcdTcwM0JcdTcwMzNcdTcwNDFcdTcyMTMiKwotICAgICAgICAiXHU3MjE0XHU3MkE4XHU3MzdEXHU3MzdDXHU3NEJBXHU3NkFCXHU3NkFBXHU3NkJFIisKLSAgICAgICAgIlx1NzZFRFx1NzdDQ1x1NzdDRVx1NzdDRlx1NzdDRFx1NzdGMlx1NzkyNVx1NzkyMyIrCi0gICAgICAgICJcdTc5MjdcdTc5MjhcdTc5MjRcdTc5MjlcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU3OUIyXHU3QTZFIisKLSAgICAgICAgIlx1N0E2Q1x1N0E2RFx1N0FGN1x1N0M0OVx1N0M0OFx1N0M0QVx1N0M0N1x1N0M0NSIrCi0gICAgICAgICJcdTdDRUVcdTdFN0JcdTdFN0VcdTdFODFcdTdFODBcdTdGQkFcdTdGRkZcdTgwNzkiKwotICAgICAgICAiXHU4MURCXHU4MUQ5XHU4MjBCXHU4MjY4XHU4MjY5XHU4NjIyXHU4NUZGXHU4NjAxIisKLSAgICAgICAgIlx1ODVGRVx1ODYxQlx1ODYwMFx1ODVGNlx1ODYwNFx1ODYwOVx1ODYwNVx1ODYwQyIrCi0gICAgICAgICJcdTg1RkRcdTg4MTlcdTg4MTBcdTg4MTFcdTg4MTdcdTg4MTNcdTg4MTZcdTg5NjMiKwotICAgICAgICAiXHU4OTY2XHU4OUI5XHU4OUY3XHU4QjYwXHU4QjZBXHU4QjVEXHU4QjY4XHU4QjYzIisKLSAgICAgICAgIlx1OEI2NVx1OEI2N1x1OEI2RFx1OERBRVx1OEU4Nlx1OEU4OFx1OEU4NFx1OEY1OSIrCi0gICAgICAgICJcdThGNTZcdThGNTdcdThGNTVcdThGNThcdThGNUFcdTkwOERcdTkxNDNcdTkxNDEiKwotICAgICAgICAiXHU5MUI3XHU5MUI1XHU5MUIyXHU5MUIzXHU5NDBCXHU5NDEzXHU5M0ZCXHU5NDIwIisKLSAgICAgICAgIlx1OTQwRlx1OTQxNFx1OTNGRVx1OTQxNVx1OTQxMFx1OTQyOFx1OTQxOVx1OTQwRCIrCi0gICAgICAgICJcdTkzRjVcdTk0MDBcdTkzRjdcdTk0MDdcdTk0MEVcdTk0MTZcdTk0MTJcdTkzRkEiKwotICAgICAgICAiXHU5NDA5XHU5M0Y4XHU5NDBBXHU5M0ZGXHU5M0ZDXHU5NDBDXHU5M0Y2XHU5NDExIisKLSAgICAgICAgIlx1OTQwNlx1OTVERVx1OTVFMFx1OTVERlx1OTcyRVx1OTcyRlx1OTdCOVx1OTdCQiIrCi0gICAgICAgICJcdTk3RkRcdTk3RkVcdTk4NjBcdTk4NjJcdTk4NjNcdTk4NUZcdTk4QzFcdTk4QzIiKwotICAgICAgICAiXHU5OTUwXHU5OTRFXHU5OTU5XHU5OTRDXHU5OTRCXHU5OTUzXHU5QTMyXHU5QTM0IisKLSAgICAgICAgIlx1OUEzMVx1OUEyQ1x1OUEyQVx1OUEzNlx1OUEyOVx1OUEyRVx1OUEzOFx1OUEyRCIrCi0gICAgICAgICJcdTlBQzdcdTlBQ0FcdTlBQzZcdTlCMTBcdTlCMTJcdTlCMTFcdTlDMEJcdTlDMDgiKwotICAgICAgICAiXHU5QkY3XHU5QzA1XHU5QzEyXHU5QkY4XHU5QzQwXHU5QzA3XHU5QzBFXHU5QzA2IisKLSAgICAgICAgIlx1OUMxN1x1OUMxNFx1OUMwOVx1OUQ5Rlx1OUQ5OVx1OURBNFx1OUQ5RFx1OUQ5MiIrCi0gICAgICAgICJcdTlEOThcdTlEOTBcdTlEOUJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU5REEwXHU5RDk0XHU5RDlDIisKLSAgICAgICAgIlx1OURBQVx1OUQ5N1x1OURBMVx1OUQ5QVx1OURBMlx1OURBOFx1OUQ5RVx1OURBMyIrCi0gICAgICAgICJcdTlEQkZcdTlEQTlcdTlEOTZcdTlEQTZcdTlEQTdcdTlFOTlcdTlFOUJcdTlFOUEiKwotICAgICAgICAiXHU5RUU1XHU5RUU0XHU5RUU3XHU5RUU2XHU5RjMwXHU5RjJFXHU5RjVCXHU5RjYwIisKLSAgICAgICAgIlx1OUY1RVx1OUY1RFx1OUY1OVx1OUY5MVx1NTEzQVx1NTEzOVx1NTI5OFx1NTI5NyIrCi0gICAgICAgICJcdTU2QzNcdTU2QkRcdTU2QkVcdTVCNDhcdTVCNDdcdTVEQ0JcdTVEQ0ZcdTVFRjEiKwotICAgICAgICAiXHU2MUZEXHU2NTFCXHU2QjAyXHU2QUZDXHU2QjAzXHU2QUY4XHU2QjAwXHU3MDQzIisKLSAgICAgICAgIlx1NzA0NFx1NzA0QVx1NzA0OFx1NzA0OVx1NzA0NVx1NzA0Nlx1NzIxRFx1NzIxQSIrCi0gICAgICAgICJcdTcyMTlcdTczN0VcdTc1MTdcdTc2NkFcdTc3RDBcdTc5MkRcdTc5MzFcdTc5MkYiKwotICAgICAgICAiXHU3QzU0XHU3QzUzXHU3Q0YyXHU3RThBXHU3RTg3XHU3RTg4XHU3RThCXHU3RTg2IisKLSAgICAgICAgIlx1N0U4RFx1N0Y0RFx1N0ZCQlx1ODAzMFx1ODFERFx1ODYxOFx1ODYyQVx1ODYyNiIrCi0gICAgICAgICJcdTg2MUZcdTg2MjNcdTg2MUNcdTg2MTlcdTg2MjdcdTg2MkVcdTg2MjFcdTg2MjAiKwotICAgICAgICAiXHU4NjI5XHU4NjFFXHU4NjI1XHU4ODI5XHU4ODFEXHU4ODFCXHU4ODIwXHU4ODI0IisKLSAgICAgICAgIlx1ODgxQ1x1ODgyQlx1ODg0QVx1ODk2RFx1ODk2OVx1ODk2RVx1ODk2Qlx1ODlGQSIrCi0gICAgICAgICJcdThCNzlcdThCNzhcdThCNDVcdThCN0FcdThCN0JcdThEMTBcdThEMTRcdThEQUYiKwotICAgICAgICAiXHU4RThFXHU4RThDXHU4RjVFXHU4RjVCXHU4RjVEXHU5MTQ2XHU5MTQ0XHU5MTQ1IisKLSAgICAgICAgIlx1OTFCOVx1OTQzRlx1OTQzQlx1OTQzNlx1OTQyOVx1OTQzRFx1OTQzQ1x1OTQzMCIrCi0gICAgICAgICJcdTk0MzlcdTk0MkFcdTk0MzdcdTk0MkNcdTk0NDBcdTk0MzFcdTk1RTVcdTk1RTQiKwotICAgICAgICAiXHU5NUUzXHU5NzM1XHU5NzNBXHU5N0JGXHU5N0UxXHU5ODY0XHU5OEM5XHU5OEM2IisKLSAgICAgICAgIlx1OThDMFx1OTk1OFx1OTk1Nlx1OUEzOVx1OUEzRFx1OUE0Nlx1OUE0NFx1OUE0MiIrCi0gICAgICAgICJcdTlBNDFcdTlBM0FcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHU5QTNGXHU5QUNEXHU5QjE1XHU5QjE3IisKLSAgICAgICAgIlx1OUIxOFx1OUIxNlx1OUIzQVx1OUI1Mlx1OUMyQlx1OUMxRFx1OUMxQ1x1OUMyQyIrCi0gICAgICAgICJcdTlDMjNcdTlDMjhcdTlDMjlcdTlDMjRcdTlDMjFcdTlEQjdcdTlEQjZcdTlEQkMiKwotICAgICAgICAiXHU5REMxXHU5REM3XHU5RENBXHU5RENGXHU5REJFXHU5REM1XHU5REMzXHU5REJCIisKLSAgICAgICAgIlx1OURCNVx1OURDRVx1OURCOVx1OURCQVx1OURBQ1x1OURDOFx1OURCMVx1OURBRCIrCi0gICAgICAgICJcdTlEQ0NcdTlEQjNcdTlEQ0RcdTlEQjJcdTlFN0FcdTlFOUNcdTlFRUJcdTlFRUUiKwotICAgICAgICAiXHU5RUVEXHU5RjFCXHU5RjE4XHU5RjFBXHU5RjMxXHU5RjRFXHU5RjY1XHU5RjY0IisKLSAgICAgICAgIlx1OUY5Mlx1NEVCOVx1NTZDNlx1NTZDNVx1NTZDQlx1NTk3MVx1NUI0Qlx1NUI0QyIrCi0gICAgICAgICJcdTVERDVcdTVERDFcdTVFRjJcdTY1MjFcdTY1MjBcdTY1MjZcdTY1MjJcdTZCMEIiKwotICAgICAgICAiXHU2QjA4XHU2QjA5XHU2QzBEXHU3MDU1XHU3MDU2XHU3MDU3XHU3MDUyXHU3MjFFIisKLSAgICAgICAgIlx1NzIxRlx1NzJBOVx1NzM3Rlx1NzREOFx1NzRENVx1NzREOVx1NzREN1x1NzY2RCIrCi0gICAgICAgICJcdTc2QURcdTc5MzVcdTc5QjRcdTdBNzBcdTdBNzFcdTdDNTdcdTdDNUNcdTdDNTkiKwotICAgICAgICAiXHU3QzVCXHU3QzVBXHU3Q0Y0XHU3Q0YxXHU3RTkxXHU3RjRGXHU3Rjg3XHU4MURFIisKLSAgICAgICAgIlx1ODI2Qlx1ODYzNFx1ODYzNVx1ODYzM1x1ODYyQ1x1ODYzMlx1ODYzNlx1ODgyQyIrCi0gICAgICAgICJcdTg4MjhcdTg4MjZcdTg4MkFcdTg4MjVcdTg5NzFcdTg5QkZcdTg5QkVcdTg5RkIiKwotICAgICAgICAiXHU4QjdFXHU4Qjg0XHU4QjgyXHU4Qjg2XHU4Qjg1XHU4QjdGXHU4RDE1XHU4RTk1IisKLSAgICAgICAgIlx1OEU5NFx1OEU5QVx1OEU5Mlx1OEU5MFx1OEU5Nlx1OEU5N1x1OEY2MFx1OEY2MiIrCi0gICAgICAgICJcdTkxNDdcdTk0NENcdTk0NTBcdTk0NEFcdTk0NEJcdTk0NEZcdTk0NDdcdTk0NDUiKwotICAgICAgICAiXHU5NDQ4XHU5NDQ5XHU5NDQ2XHU5NzNGXHU5N0UzXHU5ODZBXHU5ODY5XHU5OENCIisKLSAgICAgICAgIlx1OTk1NFx1OTk1Qlx1OUE0RVx1OUE1M1x1OUE1NFx1OUE0Q1x1OUE0Rlx1OUE0OCIrCi0gICAgICAgICJcdTlBNEFcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHU5QTQ5XHU5QTUyXHU5QTUwXHU5QUQwXHU5QjE5IisKLSAgICAgICAgIlx1OUIyQlx1OUIzQlx1OUI1Nlx1OUI1NVx1OUM0Nlx1OUM0OFx1OUMzRlx1OUM0NCIrCi0gICAgICAgICJcdTlDMzlcdTlDMzNcdTlDNDFcdTlDM0NcdTlDMzdcdTlDMzRcdTlDMzJcdTlDM0QiKwotICAgICAgICAiXHU5QzM2XHU5RERCXHU5REQyXHU5RERFXHU5RERBXHU5RENCXHU5REQwXHU5RERDIisKLSAgICAgICAgIlx1OUREMVx1OURERlx1OURFOVx1OUREOVx1OUREOFx1OURENlx1OURGNVx1OURENSIrCi0gICAgICAgICJcdTlERERcdTlFQjZcdTlFRjBcdTlGMzVcdTlGMzNcdTlGMzJcdTlGNDJcdTlGNkIiKwotICAgICAgICAiXHU5Rjk1XHU5RkEyXHU1MTNEXHU1Mjk5XHU1OEU4XHU1OEU3XHU1OTcyXHU1QjREIisKLSAgICAgICAgIlx1NUREOFx1ODgyRlx1NUY0Rlx1NjIwMVx1NjIwM1x1NjIwNFx1NjUyOVx1NjUyNSIrCi0gICAgICAgICJcdTY1OTZcdTY2RUJcdTZCMTFcdTZCMTJcdTZCMEZcdTZCQ0FcdTcwNUJcdTcwNUEiKwotICAgICAgICAiXHU3MjIyXHU3MzgyXHU3MzgxXHU3MzgzXHU3NjcwXHU3N0Q0XHU3QzY3XHU3QzY2IisKLSAgICAgICAgIlx1N0U5NVx1ODI2Q1x1ODYzQVx1ODY0MFx1ODYzOVx1ODYzQ1x1ODYzMVx1ODYzQiIrCi0gICAgICAgICJcdTg2M0VcdTg4MzBcdTg4MzJcdTg4MkVcdTg4MzNcdTg5NzZcdTg5NzRcdTg5NzMiKwotICAgICAgICAiXHU4OUZFXHU4QjhDXHU4QjhFXHU4QjhCXHU4Qjg4XHU4QzQ1XHU4RDE5XHU4RTk4IisKLSAgICAgICAgIlx1OEY2NFx1OEY2M1x1OTFCQ1x1OTQ2Mlx1OTQ1NVx1OTQ1RFx1OTQ1N1x1OTQ1RSIrCi0gICAgICAgICJcdTk3QzRcdTk3QzVcdTk4MDBcdTlBNTZcdTlBNTlcdTlCMUVcdTlCMUZcdTlCMjAiKwotICAgICAgICAiXHU5QzUyXHU5QzU4XHU5QzUwXHU5QzRBXHU5QzREXHU5QzRCXHU5QzU1XHU5QzU5IisKLSAgICAgICAgIlx1OUM0Q1x1OUM0RVx1OURGQlx1OURGN1x1OURFRlx1OURFM1x1OURFQlx1OURGOCIrCi0gICAgICAgICJcdTlERTRcdTlERjZcdTlERTFcdTlERUVcdTlERTZcdTlERjJcdTlERjBcdTlERTIiKwotICAgICAgICAiXHU5REVDXHU5REY0XHU5REYzXHU5REU4XHU5REVEXHU5RUMyXHU5RUQwXHU5RUYyIisKLSAgICAgICAgIlx1OUVGM1x1OUYwNlx1OUYxQ1x1OUYzOFx1OUYzN1x1OUYzNlx1OUY0M1x1OUY0RiIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHU5RjcxXHU5RjcwXHU5RjZFXHU5RjZGXHU1NkQzXHU1NkNEIisKLSAgICAgICAgIlx1NUI0RVx1NUM2RFx1NjUyRFx1NjZFRFx1NjZFRVx1NkIxM1x1NzA1Rlx1NzA2MSIrCi0gICAgICAgICJcdTcwNURcdTcwNjBcdTcyMjNcdTc0REJcdTc0RTVcdTc3RDVcdTc5MzhcdTc5QjciKwotICAgICAgICAiXHU3OUI2XHU3QzZBXHU3RTk3XHU3Rjg5XHU4MjZEXHU4NjQzXHU4ODM4XHU4ODM3IisKLSAgICAgICAgIlx1ODgzNVx1ODg0Qlx1OEI5NFx1OEI5NVx1OEU5RVx1OEU5Rlx1OEVBMFx1OEU5RCIrCi0gICAgICAgICJcdTkxQkVcdTkxQkRcdTkxQzJcdTk0NkJcdTk0NjhcdTk0NjlcdTk2RTVcdTk3NDYiKwotICAgICAgICAiXHU5NzQzXHU5NzQ3XHU5N0M3XHU5N0U1XHU5QTVFXHU5QUQ1XHU5QjU5XHU5QzYzIisKLSAgICAgICAgIlx1OUM2N1x1OUM2Nlx1OUM2Mlx1OUM1RVx1OUM2MFx1OUUwMlx1OURGRVx1OUUwNyIrCi0gICAgICAgICJcdTlFMDNcdTlFMDZcdTlFMDVcdTlFMDBcdTlFMDFcdTlFMDlcdTlERkZcdTlERkQiKwotICAgICAgICAiXHU5RTA0XHU5RUEwXHU5RjFFXHU5RjQ2XHU5Rjc0XHU5Rjc1XHU5Rjc2XHU1NkQ0IisKLSAgICAgICAgIlx1NjUyRVx1NjVCOFx1NkIxOFx1NkIxOVx1NkIxN1x1NkIxQVx1NzA2Mlx1NzIyNiIrCi0gICAgICAgICJcdTcyQUFcdTc3RDhcdTc3RDlcdTc5MzlcdTdDNjlcdTdDNkJcdTdDRjZcdTdFOUEiKwotICAgICAgICAiXHU3RTk4XHU3RTlCXHU3RTk5XHU4MUUwXHU4MUUxXHU4NjQ2XHU4NjQ3XHU4NjQ4IisKLSAgICAgICAgIlx1ODk3OVx1ODk3QVx1ODk3Q1x1ODk3Qlx1ODlGRlx1OEI5OFx1OEI5OVx1OEVBNSIrCi0gICAgICAgICJcdThFQTRcdThFQTNcdTk0NkVcdTk0NkRcdTk0NkZcdTk0NzFcdTk0NzNcdTk3NDkiKwotICAgICAgICAiXHU5ODcyXHU5OTVGXHU5QzY4XHU5QzZFXHU5QzZEXHU5RTBCXHU5RTBEXHU5RTEwIisKLSAgICAgICAgIlx1OUUwRlx1OUUxMlx1OUUxMVx1OUVBMVx1OUVGNVx1OUYwOVx1OUY0N1x1OUY3OCIrCi0gICAgICAgICJcdTlGN0JcdTlGN0FcdTlGNzlcdTU3MUVcdTcwNjZcdTdDNkZcdTg4M0NcdThEQjIiKwotICAgICAgICAiXHU4RUE2XHU5MUMzXHU5NDc0XHU5NDc4XHU5NDc2XHU5NDc1XHU5QTYwXHU5Qzc0IisKLSAgICAgICAgIlx1OUM3M1x1OUM3MVx1OUM3NVx1OUUxNFx1OUUxM1x1OUVGNlx1OUYwQVx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHU5RkE0XHU3MDY4XHU3MDY1XHU3Q0Y3XHU4NjZBXHU4ODNFXHU4ODNEIisKLSAgICAgICAgIlx1ODgzRlx1OEI5RVx1OEM5Q1x1OEVBOVx1OEVDOVx1OTc0Qlx1OTg3M1x1OTg3NCIrCi0gICAgICAgICJcdTk4Q0NcdTk5NjFcdTk5QUJcdTlBNjRcdTlBNjZcdTlBNjdcdTlCMjRcdTlFMTUiKwotICAgICAgICAiXHU5RTE3XHU5RjQ4XHU2MjA3XHU2QjFFXHU3MjI3XHU4NjRDXHU4RUE4XHU5NDgyIisKLSAgICAgICAgIlx1OTQ4MFx1OTQ4MVx1OUE2OVx1OUE2OFx1OUIyRVx1OUUxOVx1NzIyOVx1ODY0QiIrCi0gICAgICAgICJcdThCOUZcdTk0ODNcdTlDNzlcdTlFQjdcdTc2NzVcdTlBNkJcdTlDN0FcdTlFMUQiKwotICAgICAgICAiXHU3MDY5XHU3MDZBXHU5RUE0XHU5RjdFXHU5RjQ5XHU5Rjk4XHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiKwotICAgICAgICAiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEIisKLSAgICAgICAgIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRCIrCi0gICAgICAgICJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgc2hvcnQgaW5kZXgxW10gPSB7Ci0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCi0gICAgICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAotICAgICAgICAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDAsIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LAotICAgICAgICA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwKLSAgICAgICAgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsCi0gICAgICAgIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfTsKLQotICAgIFN0cmluZyBpbmRleDJbXSA9IHsKLSAgICAgICAgaW5uZXJJbmRleDAsCi0gICAgICAgIGlubmVySW5kZXgxLAotICAgICAgICBpbm5lckluZGV4MiwKLSAgICAgICAgaW5uZXJJbmRleDMsCi0gICAgICAgIGlubmVySW5kZXg0LAotICAgICAgICBpbm5lckluZGV4NQotICAgIH07CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2lvL0NoYXJUb0J5dGVKb2hhYi5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9pby9DaGFyVG9CeXRlSm9oYWIuamF2YQppbmRleCAzN2VkMjUzLi5iM2I2MDlkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2lvL0NoYXJUb0J5dGVKb2hhYi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vaW8vQ2hhclRvQnl0ZUpvaGFiLmphdmEKQEAgLTQ2LDQ3MjggKzQ2LDQgQEAKICAgICAgICAgc3VwZXIuaW5kZXgxID0gbmlvQ29kZXIuZ2V0RW5jb2RlckluZGV4MSgpOwogICAgICAgICBzdXBlci5pbmRleDIgPSBuaW9Db2Rlci5nZXRFbmNvZGVySW5kZXgyKCk7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGlubmVySW5kZXgwPQotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDIwXHUwMDIxXCJcdTAwMjNcdTAwMjRcdTAwMjVcdTAwMjZcJyIrCi0gICAgICAgICJcdTAwMjhcdTAwMjlcdTAwMkFcdTAwMkJcdTAwMkNcdTAwMkRcdTAwMkVcdTAwMkYiKwotICAgICAgICAiXHUwMDMwXHUwMDMxXHUwMDMyXHUwMDMzXHUwMDM0XHUwMDM1XHUwMDM2XHUwMDM3IisKLSAgICAgICAgIlx1MDAzOFx1MDAzOVx1MDAzQVx1MDAzQlx1MDAzQ1x1MDAzRFx1MDAzRVx1MDAzRiIrCi0gICAgICAgICJcdTAwNDBcdTAwNDFcdTAwNDJcdTAwNDNcdTAwNDRcdTAwNDVcdTAwNDZcdTAwNDciKwotICAgICAgICAiXHUwMDQ4XHUwMDQ5XHUwMDRBXHUwMDRCXHUwMDRDXHUwMDREXHUwMDRFXHUwMDRGIisKLSAgICAgICAgIlx1MDA1MFx1MDA1MVx1MDA1Mlx1MDA1M1x1MDA1NFx1MDA1NVx1MDA1Nlx1MDA1NyIrCi0gICAgICAgICJcdTAwNThcdTAwNTlcdTAwNUFcdTAwNUJcXFx1MDA1RFx1MDA1RVx1MDA1RiIrCi0gICAgICAgICJcdTAwNjBcdTAwNjFcdTAwNjJcdTAwNjNcdTAwNjRcdTAwNjVcdTAwNjZcdTAwNjciKwotICAgICAgICAiXHUwMDY4XHUwMDY5XHUwMDZBXHUwMDZCXHUwMDZDXHUwMDZEXHUwMDZFXHUwMDZGIisKLSAgICAgICAgIlx1MDA3MFx1MDA3MVx1MDA3Mlx1MDA3M1x1MDA3NFx1MDA3NVx1MDA3Nlx1MDA3NyIrCi0gICAgICAgICJcdTAwNzhcdTAwNzlcdTAwN0FcdTAwN0JcdTAwN0NcdTAwN0RcdTAwN0VcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RDlBRVx1MDAwMFx1MDAwMFx1RDlCNFx1MDAwMFx1MDAwMFx1RDk2NyIrCi0gICAgICAgICJcdUQ5MzdcdTAwMDBcdURDQTNcdTAwMDBcdTAwMDBcdUQ5MzlcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEOTU2XHVEOTRFXHVERDk5XHVERDlBXHVEOUE1XHUwMDAwXHVEOUQyXHVEOTM0IisKLSAgICAgICAgIlx1RDlBQ1x1REQ5OFx1RENBQ1x1MDAwMFx1RENGOVx1RENGNlx1RENGQVx1RDlBRiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdURDQTFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RENBMlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RDk0RiIrCi0gICAgICAgICJcdURDQUFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdURDQURcdUREM0MiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVERDMxXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUREMzNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUQ5NTAiKwotICAgICAgICAiXHVERDNBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVERDNEXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVERDMyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdURDQTRcdUREMzQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1REQzNVx1RENBNlx1REQzNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUREMzdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdURDQTgiKwotICAgICAgICAiXHVERDM4XHVEQ0E5XHVERDM5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1REQ0MFx1RENBRlx1REQzRlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdURDQUJcdUREM0JcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RENBRVx1REQzRSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVEOUE3IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUQ5QjBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEOUE4XHVEOUFCXHVEOUFBXHVEOUFEXHUwMDAwXHVEOUE5XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdURCNTFcdURCNTJcdURCNTNcdURCNTRcdURCNTVcdURCNTZcdURCNTciKwotICAgICAgICAiXHVEQjU4XHVEQjU5XHVEQjVBXHVEQjVCXHVEQjVDXHVEQjVEXHVEQjVFXHVEQjVGIisKLSAgICAgICAgIlx1REI2MFx1REI2MVx1MDAwMFx1REI2Mlx1REI2M1x1REI2NFx1REI2NVx1REI2NiIrCi0gICAgICAgICJcdURCNjdcdURCNjhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVEQjcxXHVEQjcyXHVEQjczXHVEQjc0XHVEQjc1XHVEQjc2XHVEQjc3IisKLSAgICAgICAgIlx1REI3OFx1REI3OVx1REI3QVx1REI3Qlx1REI3Q1x1REI3RFx1REI3RVx1REI5MSIrCi0gICAgICAgICJcdURCOTJcdURCOTNcdTAwMDBcdURCOTRcdURCOTVcdURCOTZcdURCOTdcdURCOTgiKwotICAgICAgICAiXHVEQjk5XHVEQjlBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1REVBN1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVERUExXHVERUEyXHVERUEzXHVERUE0XHVERUE1XHVERUE2XHVERUE4XHVERUE5IisKLSAgICAgICAgIlx1REVBQVx1REVBQlx1REVBQ1x1REVBRFx1REVBRVx1REVBRlx1REVCMFx1REVCMSIrCi0gICAgICAgICJcdURFQjJcdURFQjNcdURFQjRcdURFQjVcdURFQjZcdURFQjdcdURFQjhcdURFQjkiKwotICAgICAgICAiXHVERUJBXHVERUJCXHVERUJDXHVERUJEXHVERUJFXHVERUJGXHVERUMwXHVERUMxIisKLSAgICAgICAgIlx1REVEMVx1REVEMlx1REVEM1x1REVENFx1REVENVx1REVENlx1REVEOFx1REVEOSIrCi0gICAgICAgICJcdURFREFcdURFREJcdURFRENcdURFRERcdURFREVcdURFREZcdURFRTBcdURFRTEiKwotICAgICAgICAiXHVERUUyXHVERUUzXHVERUU0XHVERUU1XHVERUU2XHVERUU3XHVERUU4XHVERUU5IisKLSAgICAgICAgIlx1REVFQVx1REVFQlx1REVFQ1x1REVFRFx1REVFRVx1REVFRlx1REVGMFx1REVGMSIrCi0gICAgICAgICJcdTAwMDBcdURFRDdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUQ5M0FcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEOTNFXHVEOTNGXHUwMDAwXHUwMDAwXHVEOTQwXHVEOTQxXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RDlEM1x1RDlENFx1MDAwMFx1MDAwMFx1MDAwMFx1RDkzNVx1RDkzNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEOUI2XHUwMDAwXHVEOTU3XHVEOTU4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RDk2OFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUREOUJcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVERDlDIisKLSAgICAgICAgIlx1MDAwMFx1REQ5RFx1REQ5RVx1REQ5Rlx1RERBMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUQ5NTlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVEOUI1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1REMzNFx1MDAwMFx1MDAwMFx1RDlFMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVEOUU1XHVEOUUyXHUwMDAwXHUwMDAwXHUwMDAwXHVEQzY5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RDk1QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVEQ0Y3XHVEQ0Y4XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RENGQlx1RENGQ1x1RENGRFx1RENGRVx1MDAwMCIrCi0gICAgICAgICJcdURCNDBcdURCNDFcdURCNDJcdURCNDNcdURCNDRcdURCNDVcdURCNDZcdURCNDciKwotICAgICAgICAiXHVEQjQ4XHVEQjQ5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1REIzMVx1REIzMlx1REIzM1x1REIzNFx1REIzNVx1REIzNlx1REIzN1x1REIzOCIrCi0gICAgICAgICJcdURCMzlcdURCM0FcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUQ5NzdcdUQ5NzhcdUQ5NzZcdUQ5NzlcdUQ5N0FcdUQ5RDVcdUQ5RDhcdUQ5RDYiKwotICAgICAgICAiXHVEOUQ5XHVEOUQ3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RDlBMVx1MDAwMFx1RDlBMlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RDlBM1x1MDAwMFx1RDk2M1x1RDlBNFx1MDAwMFx1MDAwMFx1MDAwMFx1RDk2NCIrCi0gICAgICAgICJcdUQ5OTZcdTAwMDBcdTAwMDBcdUQ5OTdcdTAwMDBcdTAwMDBcdTAwMDBcdUQ5QjMiKwotICAgICAgICAiXHUwMDAwXHVEOUIyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RDk3RVx1MDAwMFx1MDAwMFx1RDk5Mlx1RDk1NFx1MDAwMCIrCi0gICAgICAgICJcdUQ5NjBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUQ5M0JcdTAwMDBcdUQ5OUUiKwotICAgICAgICAiXHVEOTlGXHVEOTlEXHVEOTlDXHVEOTk0XHVEOTk1XHUwMDAwXHVEOUIxXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RDk1NVx1RDk5M1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUQ5M0RcdUQ5OTFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUQ5NjZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RDk1MVx1RDk2NVx1MDAwMFx1MDAwMFx1RDk1Mlx1RDk1M1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUQ5N0NcdUQ5N0RcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUQ5OUFcdUQ5OUJcdTAwMDBcdTAwMDBcdUQ5OThcdUQ5OTkiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUQ5QzFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVEOTYxXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUQ5NjJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdURDRTdcdURDRThcdURDRTlcdURDRUFcdURDRUJcdURDRUNcdURDRURcdURDRUUiKwotICAgICAgICAiXHVEQ0VGXHVEQ0YwXHVEQ0YxXHVEQ0YyXHVEQ0YzXHVEQ0Y0XHVEQ0Y1XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1REQ3N1x1REQ3OFx1REQ3OVx1REQ3QSIrCi0gICAgICAgICJcdUREN0JcdUREN0NcdUREN0RcdUREN0VcdUREOTFcdUREOTJcdUREOTNcdUREOTQiKwotICAgICAgICAiXHVERDk1XHVERDk2XHVERDk3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVERDVEXHVERDVFXHVERDVGXHVERDYwIisKLSAgICAgICAgIlx1REQ2MVx1REQ2Mlx1REQ2M1x1REQ2NFx1REQ2NVx1REQ2Nlx1REQ2N1x1REQ2OCIrCi0gICAgICAgICJcdURENjlcdURENkFcdURENkJcdURENkNcdURENkRcdURENkVcdURENkZcdURENzAiKwotICAgICAgICAiXHVERDcxXHVERDcyXHVERDczXHVERDc0XHVERDc1XHVERDc2XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RENDRFx1RENDRVx1RENDRlx1RENEMFx1RENEMVx1RENEMlx1RENEM1x1RENENCIrCi0gICAgICAgICJcdURDRDVcdURDRDZcdURDRDdcdURDRDhcdURDRDlcdURDREFcdURDREJcdURDREMiKwotICAgICAgICAiXHVEQ0REXHVEQ0RFXHVEQ0RGXHVEQ0UwXHVEQ0UxXHVEQ0UyXHVEQ0UzXHVEQ0U0IisKLSAgICAgICAgIlx1RENFNVx1RENFNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1REJBMVx1REJBQ1x1REJBMlx1REJBRFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdURCQTNcdURCQzhcdURCQzdcdURCQUUiKwotICAgICAgICAiXHVEQkE0XHVEQkMyXHVEQkMxXHVEQkFGXHVEQkE2XHVEQkM2XHVEQkM1XHVEQkIxIisKLSAgICAgICAgIlx1REJBNVx1REJDNFx1REJDM1x1REJCMFx1REJBN1x1REJCQ1x1REJDOVx1REJDQSIrCi0gICAgICAgICJcdURCQjdcdURCQ0JcdURCQ0NcdURCQjJcdURCQTlcdURCQkVcdURCQ0RcdURCQ0UiKwotICAgICAgICAiXHVEQkI5XHVEQkNGXHVEQkQwXHVEQkI0XHVEQkE4XHVEQkQxXHVEQkQyXHVEQkI4IisKLSAgICAgICAgIlx1REJCRFx1REJEM1x1REJENFx1REJCM1x1REJBQVx1REJENVx1REJENlx1REJCQSIrCi0gICAgICAgICJcdURCQkZcdURCRDdcdURCRDhcdURCQjVcdURCQUJcdURCRDlcdURCREFcdURCQkIiKwotICAgICAgICAiXHVEQkRCXHVEQkRDXHVEQkMwXHVEQkREXHVEQkRFXHVEQkRGXHVEQkUwXHVEQkUxIisKLSAgICAgICAgIlx1REJFMlx1REJFM1x1REJFNFx1REJCNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RDlDNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEOTcxXHVEOTcwXHUwMDAwXHVEOUMzXHVEOUM3XHVEOUM4XHVEOUNCXHVEOUNBIisKLSAgICAgICAgIlx1RDlDOVx1RDlDQ1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUQ5NzNcdUQ5NzJcdTAwMDBcdTAwMDBcdUQ5QkFcdUQ5QjkiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVEOTc1XHVEOTc0XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RDlCOFx1RDlCN1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RDk2Rlx1RDk2RSIrCi0gICAgICAgICJcdUQ5QzJcdTAwMDBcdTAwMDBcdUQ5NkJcdTAwMDBcdTAwMDBcdUQ5NkRcdUQ5NkMiKwotICAgICAgICAiXHVEOUM0XHVEOUM1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVEOTZBXHVEOTY5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RDlDRlx1RDlDRSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVEOUQwXHUwMDAwXHVEOUQxXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUQ5NUZcdTAwMDBcdUQ5NUVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEOUJDXHVEOUJEXHUwMDAwXHVEOUMwXHVEOUJCXHVEOUJFXHUwMDAwXHVEOUJGIisKLSAgICAgICAgIlx1RDlDRFx1RDlEQlx1RDlEQ1x1MDAwMFx1RDlERFx1RDlEQVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUQ5MzFcdUQ5MzJcdUQ5MzNcdUQ5MzhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEOTQ0XHVEOTQ1XHVEOTQ2XHVEOTQ3XHVEOTQ4XHVEOTQ5XHVEOTRBXHVEOTRCIisKLSAgICAgICAgIlx1RDk0Q1x1RDk0RFx1MDAwMFx1RDk3Qlx1RDk0Mlx1RDk0M1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RERBMVx1RERBMlx1RERBM1x1RERBNFx1RERBNVx1RERBNlx1RERBNyIrCi0gICAgICAgICJcdUREQThcdUREQTlcdUREQUFcdUREQUJcdUREQUNcdUREQURcdUREQUVcdUREQUYiKwotICAgICAgICAiXHVEREIwXHVEREIxXHVEREIyXHVEREIzXHVEREI0XHVEREI1XHVEREI2XHVEREI3IisKLSAgICAgICAgIlx1RERCOFx1RERCOVx1RERCQVx1RERCQlx1RERCQ1x1RERCRFx1RERCRVx1RERCRiIrCi0gICAgICAgICJcdUREQzBcdUREQzFcdUREQzJcdUREQzNcdUREQzRcdUREQzVcdUREQzZcdUREQzciKwotICAgICAgICAiXHVEREM4XHVEREM5XHVERENBXHVERENCXHVERENDXHVERENEXHVERENFXHVERENGIisKLSAgICAgICAgIlx1REREMFx1REREMVx1REREMlx1REREM1x1RERENFx1RERENVx1RERENlx1RERENyIrCi0gICAgICAgICJcdURERDhcdURERDlcdUREREFcdUREREJcdURERENcdURERERcdUREREVcdUREREYiKwotICAgICAgICAiXHVEREUwXHVEREUxXHVEREUyXHVEREUzXHVEREU0XHVEREU1XHVEREU2XHVEREU3IisKLSAgICAgICAgIlx1RERFOFx1RERFOVx1RERFQVx1RERFQlx1RERFQ1x1RERFRFx1RERFRVx1RERFRiIrCi0gICAgICAgICJcdURERjBcdURERjFcdURERjJcdURERjNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1REUzMVx1REUzMlx1REUzM1x1REUzNFx1REUzNVx1REUzNlx1REUzNyIrCi0gICAgICAgICJcdURFMzhcdURFMzlcdURFM0FcdURFM0JcdURFM0NcdURFM0RcdURFM0VcdURFM0YiKwotICAgICAgICAiXHVERTQwXHVERTQxXHVERTQyXHVERTQzXHVERTQ0XHVERTQ1XHVERTQ2XHVERTQ3IisKLSAgICAgICAgIlx1REU0OFx1REU0OVx1REU0QVx1REU0Qlx1REU0Q1x1REU0RFx1REU0RVx1REU0RiIrCi0gICAgICAgICJcdURFNTBcdURFNTFcdURFNTJcdURFNTNcdURFNTRcdURFNTVcdURFNTZcdURFNTciKwotICAgICAgICAiXHVERTU4XHVERTU5XHVERTVBXHVERTVCXHVERTVDXHVERTVEXHVERTVFXHVERTVGIisKLSAgICAgICAgIlx1REU2MFx1REU2MVx1REU2Mlx1REU2M1x1REU2NFx1REU2NVx1REU2Nlx1REU2NyIrCi0gICAgICAgICJcdURFNjhcdURFNjlcdURFNkFcdURFNkJcdURFNkNcdURFNkRcdURFNkVcdURFNkYiKwotICAgICAgICAiXHVERTcwXHVERTcxXHVERTcyXHVERTczXHVERTc0XHVERTc1XHVERTc2XHVERTc3IisKLSAgICAgICAgIlx1REU3OFx1REU3OVx1REU3QVx1REU3Qlx1REU3Q1x1REU3RFx1REU3RVx1REU5MSIrCi0gICAgICAgICJcdURFOTJcdURFOTNcdURFOTRcdURFOTVcdURFOTZcdURFOTdcdURFOThcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1ODg0MVx1OEM0MVx1ODQ0NFx1OTA0MVx1ODQ0Nlx1ODQ0N1x1OTQ0MSIrCi0gICAgICAgICJcdTk4NDFcdTlDNDFcdTg0NEFcdTg0NEJcdTg0NENcdTg0NERcdTg0NEVcdTg0NEYiKwotICAgICAgICAiXHU4NDUwXHVBMDQxXHVBNDQxXHVBODQxXHU4NDU0XHVBQzQxXHVCMDQxXHVCNDQxIisKLSAgICAgICAgIlx1Qjg0MVx1QkM0MVx1QzA0MVx1QzQ0MVx1Qzg0MVx1Q0M0MVx1RDA0MVx1ODQ2MSIrCi0gICAgICAgICJcdTg0ODFcdTg0QTFcdTg0QzFcdTg0RTFcdTg1NDFcdTg1NjFcdTg1ODFcdTg1QTEiKwotICAgICAgICAiXHU4NUMxXHU4NUUxXHU4NjQxXHU4NjYxXHU4NjgxXHU4NkExXHU4NkMxXHU4NkUxIisKLSAgICAgICAgIlx1ODc0MVx1ODc2MVx1ODc4MVx1ODdBMVx1REFENFx1REFENVx1REFENlx1REFENyIrCi0gICAgICAgICJcdURBRDhcdURBRDlcdURBREFcdURBREJcdURBRENcdURBRERcdURBREVcdURBREYiKwotICAgICAgICAiXHVEQUUwXHVEQUUxXHVEQUUyXHVEQUUzXHVEQUU0XHVEQUU1XHVEQUU2XHVEQUU3IisKLSAgICAgICAgIlx1REFFOFx1REFFOVx1REFFQVx1REFFQlx1REFFQ1x1REFFRFx1REFFRVx1REFFRiIrCi0gICAgICAgICJcdURBRjBcdURBRjFcdURBRjJcdURBRjNcdURBRjRcdURBRjVcdURBRjZcdURBRjciKwotICAgICAgICAiXHVEQUY4XHVEQUY5XHVEQUZBXHVEQUZCXHVEQUZDXHVEQUZEXHVEQUZFXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVERDQxXHVERDQyXHVERDQzXHVERDQ0XHVERDQ1XHVERDQ2XHVERDQ3XHVERDQ4IisKLSAgICAgICAgIlx1REQ0OVx1REQ0QVx1REQ0Qlx1REQ0Q1x1REQ0RFx1REQ0RVx1REQ0Rlx1REQ1MCIrCi0gICAgICAgICJcdURENTFcdURENTJcdURENTNcdURENTRcdURENTVcdURENTZcdURENTdcdURENTgiKwotICAgICAgICAiXHVERDU5XHVERDVBXHVERDVCXHVERDVDXHVEOURGXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEQ0IxXHVEQ0IyXHVEQ0IzXHVEQ0I0XHVEQ0I1XHVEQ0I2XHVEQ0I3XHVEQ0I4IisKLSAgICAgICAgIlx1RENCOVx1RENCQVx1RENCQlx1RENCQ1x1RENCRFx1RENCRVx1RENCRlx1RENDMCIrCi0gICAgICAgICJcdURDQzFcdURDQzJcdURDQzNcdURDQzRcdURDQzVcdURDQzZcdURDQzdcdURDQzgiKwotICAgICAgICAiXHVEQ0M5XHVEQ0NBXHVEQ0NCXHVEQ0NDXHUwMDAwXHUwMDAwXHUwMDAwXHVEOURFIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaW5uZXJJbmRleDE9Ci0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEQzU5XHVEQzVBXHVEQzVCXHVEQzVDXHVEQzVEXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1REM0QVx1REM0Qlx1REM2Q1x1REM2RFx1REM2RVx1REM0Nlx1REM0N1x1REM0OCIrCi0gICAgICAgICJcdURDNjRcdURDNjVcdURDNjZcdURDNjdcdURDNjhcdURDMzFcdURDMzJcdURDMzMiKwotICAgICAgICAiXHVEQzM1XHVEQzNCXHVEQzNDXHVEQzNEXHVEQzNFXHVEQzNGXHVEQzQwXHVEQzQxIisKLSAgICAgICAgIlx1REM0Mlx1REM0M1x1REM0NFx1REMzN1x1REMzOFx1REMzOVx1REMzQVx1REM0RCIrCi0gICAgICAgICJcdURDNEVcdURDNzVcdURDNzZcdURDNzdcdURDNzhcdURDNzFcdURDNzJcdURDNzMiKwotICAgICAgICAiXHVEQzRGXHVEQzUwXHVEQzUxXHVEQzUyXHVEQzUzXHVEQzU0XHVEQzU1XHVEQzU2IisKLSAgICAgICAgIlx1REM1N1x1REM1OFx1REM1RVx1REM1Rlx1REM2MFx1REM2MVx1REM2Mlx1REM2MyIrCi0gICAgICAgICJcdURDNkFcdURDNkJcdUQ5RTNcdURDN0NcdURDMzZcdURDNzBcdURDOTFcdUQ5RTEiKwotICAgICAgICAiXHVEQzRDXHVEQzdEXHVEQzQ1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVEQzQ5IisKLSAgICAgICAgIlx1REM3QVx1MDAwMFx1MDAwMFx1REM3Qlx1MDAwMFx1MDAwMFx1REM2Rlx1MDAwMCIrCi0gICAgICAgICJcdUQ5RTRcdTAwMDBcdTAwMDBcdURDNzRcdURDN0VcdURDNzlcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjE3OVx1RjJDQlx1MDAwMFx1RjY2Mlx1MDAwMFx1MDAwMFx1MDAwMFx1RTc0MiIrCi0gICAgICAgICJcdUYxREJcdUVBQjJcdUVBQkVcdUY3QkJcdTAwMDBcdUU5OTZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNUU0XHUwMDAwXHUwMDAwXHVGNEE2XHVFOUUwXHVFQkE2XHUwMDAwIisKLSAgICAgICAgIlx1RTI5QVx1RTk0MFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUNBQVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGM0U5XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTFGQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY5M0ZcdUU0QTFcdTAwMDBcdUYzQUJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRUQxXHVFNDNDXHUwMDAwXHVFMjlCXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjNGRFx1MDAwMFx1RUE0Rlx1RjhCQVx1RjdCOSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyNjJcdTAwMDAiKwotICAgICAgICAiXHVFQ0FCXHVGMEUwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMjlDXHVFMEY3XHVFREE1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUwNzFcdTAwMDBcdUU1NUNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMDcxXHUwMDAwXHUwMDAwXHVFOTczXHVFQUFEIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTBFQlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU1QUZcdTAwMDBcdTAwMDBcdTAwMDBcdUU2OTdcdTAwMDAiKwotICAgICAgICAiXHVFREY4XHUwMDAwXHUwMDAwXHVFQTUwXHVGMTMzXHUwMDAwXHVFRkNEXHUwMDAwIisKLSAgICAgICAgIlx1RjAzN1x1RUZGNlx1RjhCQlx1MDAwMFx1RUVFOVx1RjJDQ1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUzNzZcdTAwMDBcdTAwMDBcdUVBNTFcdTAwMDBcdTAwMDBcdUVEM0NcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNzVDXHVGN0YxXHUwMDAwXHVFMjZGXHVGODM0XHVFRTQyXHUwMDAwIisKLSAgICAgICAgIlx1Rjg5RFx1MDAwMFx1MDAwMFx1Rjg0RFx1RTE1OFx1RjJDRFx1RTVENVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU0QTJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMTYxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUQzN1x1RjE2Mlx1MDAwMFx1MDAwMFx1RjY0MVx1MDAwMFx1MDAwMFx1RTI5RCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUzNjFcdUUwQkZcdTAwMDBcdUYxQTRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMUE4XHVFQTUyXHVGNjcyXHVGMURDIisKLSAgICAgICAgIlx1RTk5N1x1RUI0OVx1MDAwMFx1MDAwMFx1MDAwMFx1RTU1RVx1MDAwMFx1RjU0NSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU0REJcdUU2NDVcdUYxMzRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUQ3Nlx1MDAwMFx1RjNFQVx1MDAwMFx1MDAwMFx1MDAwMFx1RTBFQ1x1RTBDMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYxOTRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMzdBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjdGMlx1RjEzNVx1RTM2Rlx1MDAwMFx1RUVFQVx1RTM3Qlx1RTk2MSIrCi0gICAgICAgICJcdUU4RTlcdUY5Q0NcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU4RDciKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFODcxXHUwMDAwXHVFNjQ2XHUwMDAwIisKLSAgICAgICAgIlx1RUNERlx1MDAwMFx1RUE1M1x1MDAwMFx1RUE1NFx1RTAzMVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYyN0NcdTAwMDBcdTAwMDBcdUU0QTNcdUYyNDciKwotICAgICAgICAiXHVGNzVGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMDU4XHVGMjQ4XHVGM0FDIisKLSAgICAgICAgIlx1RjNBNVx1RUZDRVx1MDAwMFx1MDAwMFx1MDAwMFx1RjdCQ1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVERjlcdUYxN0FcdUU5RDZcdUYxQzJcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjczNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RURCQSIrCi0gICAgICAgICJcdUU4RDhcdTAwMDBcdTAwMDBcdUUwMzJcdTAwMDBcdTAwMDBcdUUzQ0RcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMjdEXHUwMDAwXHUwMDAwXHUwMDAwXHVGMTdCXHVFQTU1IisKLSAgICAgICAgIlx1MDAwMFx1RUNFMFx1MDAwMFx1RTA1OVx1RjQ3OVx1MDAwMFx1RTVDRVx1MDAwMCIrCi0gICAgICAgICJcdUY2NDZcdTAwMDBcdUUyNTJcdUU2NTdcdTAwMDBcdUVDQjRcdTAwMDBcdUYzQUQiKwotICAgICAgICAiXHUwMDAwXHVGMDcyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNkMyXHUwMDAwIisKLSAgICAgICAgIlx1RjRBN1x1MDAwMFx1MDAwMFx1RTFFQVx1MDAwMFx1RjBFRVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0IyXHVGOUE1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY2NVx1RTVFMlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY3NDUiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFMTk3XHVGNUI1XHVFRDNEXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUVFQlx1RjNENVx1MDAwMFx1MDAwMFx1MDAwMFx1RjM0Qlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVGQjVcdTAwMDBcdUUxNTlcdUY4NjVcdTAwMDBcdTAwMDBcdUVCRDQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNkQ2XHUwMDAwXHUwMDAwXHVFOTUxXHUwMDAwXHVFQTU2IisKLSAgICAgICAgIlx1Rjg5MVx1RUNFMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCRjNcdUU5OTgiKwotICAgICAgICAiXHUwMDAwXHVFMjlFXHUwMDAwXHVFOEM0XHUwMDAwXHVGNzkzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTk3NFx1MDAwMFx1RURFRlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU5NDFcdTAwMDBcdTAwMDBcdTAwMDBcdUU1RDZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNERBXHUwMDAwXHVFMEMxXHUwMDAwXHVFOEMzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTdGQVx1RTRFRVx1MDAwMFx1MDAwMFx1MDAwMFx1Rjg0OFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY5QTZcdUYwRUZcdTAwMDBcdUY1MzZcdTAwMDBcdUUxNUFcdUY0QTgiKwotICAgICAgICAiXHUwMDAwXHVGNERCXHUwMDAwXHVFOEE3XHVGNjQ3XHUwMDAwXHVFMkU2XHVGMzk0IisKLSAgICAgICAgIlx1RTBEQVx1MDAwMFx1RUVEMlx1RTZDM1x1RjY5Mlx1RUY2RVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFREE2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RURFN1x1MDAwMFx1MDAwMFx1MDAwMFx1RTAzMyIrCi0gICAgICAgICJcdUUxMzdcdUYwNTlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY3NDYiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGODM1XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjNBRVx1MDAwMFx1RjJDRVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwRURcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY0MFx1RjJDRlx1RUZDRlx1MDAwMCIrCi0gICAgICAgICJcdUY2REVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMjYzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOTk5XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RThBOFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUwRjhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQUExXHVFOUUxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1Q0FcdUVGQjZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRUVDXHVGMjdFXHUwMDAwXHVGNEYwXHUwMDAwXHVFQUJGIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTE1Qlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzNTFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNTYyXHVFQjRBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQUMwIisKLSAgICAgICAgIlx1MDAwMFx1RTI3MFx1MDAwMFx1MDAwMFx1MDAwMFx1RTk2Mlx1RjlFQVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU2OThcdTAwMDBcdTAwMDBcdTAwMDBcdUYwNUFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRjc5XHUwMDAwXHVFQ0FDIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjREMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMDM0XHUwMDAwXHVFOEY4XHUwMDAwXHUwMDAwXHUwMDAwXHVFQTU3IisKLSAgICAgICAgIlx1RjBGMFx1RjNENlx1MDAwMFx1MDAwMFx1RURFMlx1MDAwMFx1RTE1Q1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUwRkJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMDczXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUFDMSIrCi0gICAgICAgICJcdTAwMDBcdUU2N0RcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRkQwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjI0OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTVFMyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUzRDNcdTAwMDBcdUVERjBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRjQ0XHVGMEMzXHUwMDAwXHVGMDNBXHVGODlFXHVGNUY2XHVGMzRDXHVGOUQ0IisKLSAgICAgICAgIlx1RUI0Qlx1RTI1M1x1MDAwMFx1RTM0QVx1RjZCQVx1RTc5NVx1RjZDRFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVEM0VcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNTZGXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTM3N1x1MDAwMFx1MDAwMFx1RjE5Rlx1MDAwMFx1RTQzRSIrCi0gICAgICAgICJcdUYyOTFcdUU1RDdcdUYwNzRcdUY3MzJcdUUxRUJcdUU2QkZcdUY4QjFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMUVDXHUwMDAwXHUwMDAwXHUwMDAwXHVFOTQyXHVFMzdDXHVFMjlGIisKLSAgICAgICAgIlx1RjI5Mlx1MDAwMFx1MDAwMFx1MDAwMFx1RTE1Mlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUzN0RcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVERjdcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNEZDXHUwMDAwXHUwMDAwXHVGMjMyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTdCM1x1MDAwMFx1MDAwMFx1RTc5Nlx1MDAwMFx1RUZCNyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMjNFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0EyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTc5M1x1MDAwMFx1RTU1Rlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVEQTdcdUU1RDIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjM5XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjUzMlx1MDAwMFx1RjNEN1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU1RDhcdTAwMDBcdUYzNERcdUU2RDBcdUU1NjBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTZDRlx1RjBFQVx1RjlFQlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU4RURcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1Rjk1NVx1RTBDMlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjlENVx1MDAwMCIrCi0gICAgICAgICJcdUY1NThcdUVGN0FcdUY1RjNcdTAwMDBcdTAwMDBcdUY3REVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNEVGXHUwMDAwXHUwMDAwXHVGMTYzXHUwMDAwXHUwMDAwXHVFOUMyXHVGMkI3IisKLSAgICAgICAgIlx1RUVENFx1MDAwMFx1RTA1QVx1MDAwMFx1MDAwMFx1MDAwMFx1RTdGQlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4OUZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2M0EiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTlBXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjZGN1x1RTkzQ1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU2RDdcdUVBQTJcdTAwMDBcdTAwMDBcdTAwMDBcdUUyNEVcdTAwMDAiKwotICAgICAgICAiXHVFNEYwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzM0XHVFQkVDIisKLSAgICAgICAgIlx1RTJFN1x1RjRDQlx1RjFBOVx1RTA0RVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY1OTFcdTAwMDBcdTAwMDBcdTAwMDBcdUY2NUUiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQTlEXHVFMzRCXHVFNUI3XHVGMjkzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjUzOFx1MDAwMFx1RTk5QVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUwQTdcdTAwMDBcdUU4NUVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQjc2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjFBNVx1RjI5NFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTk5QiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY3RENcdTAwMDBcdTAwMDBcdUY0RENcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNzk0XHUwMDAwXHVGNTlCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk5M1x1MDAwMFx1MDAwMFx1MDAwMFx1RTM0QyIrCi0gICAgICAgICJcdUU4RjlcdUU2QjFcdTAwMDBcdTAwMDBcdTAwMDBcdUUwRkNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMzM1XHVFMEZEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTVGNFx1MDAwMFx1MDAwMFx1MDAwMFx1RTFFRCIrCi0gICAgICAgICJcdUUwMzVcdTAwMDBcdTAwMDBcdUU2M0JcdUUzNTJcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMzRFXHVFNDREXHVFMTM0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY4NDZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMTVEXHUwMDAwXHVFODlDXHUwMDAwXHVGNjVGXHUwMDAwXHVFRkI4IisKLSAgICAgICAgIlx1MDAwMFx1RTc5N1x1MDAwMFx1MDAwMFx1MDAwMFx1RTE1RVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU2Q0RcdTAwMDBcdTAwMDBcdUU1NjFcdUVGRURcdTAwMDAiKwotICAgICAgICAiXHVFMDdCXHVFN0UyXHUwMDAwXHVGOUIyXHUwMDAwXHVFQ0FEXHVFNjVDXHVFN0I0IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUJBN1x1RjI2M1x1RTM1M1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGOUIzXHUwMDAwXHVFNUU0XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTJFOFx1MDAwMFx1RjFDM1x1RTM0Mlx1MDAwMFx1MDAwMFx1RTJBMFx1RTgzOCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY3NjBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGOUQ2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNzYxXHUwMDAwXHVGNzYyIisKLSAgICAgICAgIlx1RTk2M1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTlFMlx1RjhGOVx1RTlDMSIrCi0gICAgICAgICJcdTAwMDBcdUVDQjVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMUREXHVFMjU0XHUwMDAwXHVFMEExXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTlFM1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk2RCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGN0FGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNDlEIisKLSAgICAgICAgIlx1RTJBMVx1RUQzOFx1MDAwMFx1RjU0Nlx1RjFBMFx1MDAwMFx1MDAwMFx1RUNBRSIrCi0gICAgICAgICJcdUVFRURcdUY5QzFcdUU4NzJcdTAwMDBcdTAwMDBcdUU3NDNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFOUU0XHVGMzkxXHVGNjkzXHVGODkyXHUwMDAwXHUwMDAwXHVFM0Y1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTg1Rlx1MDAwMFx1RTk2NFx1MDAwMFx1RTkzNlx1MDAwMCIrCi0gICAgICAgICJcdUYyQkZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyNUZcdTAwMDAiKwotICAgICAgICAiXHVFQjY5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0Q2IisKLSAgICAgICAgIlx1RjE2NFx1RjA1Qlx1MDAwMFx1MDAwMFx1RTA0Rlx1RTVCMFx1MDAwMFx1RTJFOSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzRURcdTAwMDBcdUUxNUYiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDlBXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVEN0RcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNkQ4XHUwMDAwXHVGOUE3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMDNCIisKLSAgICAgICAgIlx1RjY0Mlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTJGMFx1RjdCRFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFOTZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTBEQlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY0RDFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRkQxXHVGNEE5XHVFMzcwXHVFRkQyXHUwMDAwXHVFODczXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUM2Mlx1MDAwMFx1RjYzMlx1RUJGNCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU4NzRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRUQ1XHVGNUJGXHVFMkEyXHVFMUFGXHVFMkEzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTFCMFx1RjNGRVx1RTMzM1x1RUJBRlx1RjczM1x1MDAwMFx1RTAzNiIrCi0gICAgICAgICJcdUY2QkJcdUY0N0FcdUVBNThcdUVGRDNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQTU5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjlERVx1RTA1MFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY3RUFcdUUzQ0VcdUYyNjRcdTAwMDBcdUU1NjJcdUU3QTNcdUY5QThcdUU2RDkiKwotICAgICAgICAiXHVGNkNFXHVGODRFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTJENlx1MDAwMFx1RTZGMFx1MDAwMFx1RjBFMSIrCi0gICAgICAgICJcdUY3NTVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU5OUNcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFOUMzXHUwMDAwXHVGN0RGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUVFRlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY5RTVcdUY2MzNcdTAwMDBcdUU3RkNcdUY5QTlcdTAwMDBcdUVFRUVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNUU1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjJEMFx1MDAwMFx1RTFCMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY2QTJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYzQjJcdTAwMDBcdUYzQjFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMUIyXHUwMDAwXHVFODNCXHUwMDAwXHVFMDM3XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUNFMlx1RjhCQ1x1RTdBNFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYyNEFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY3NjNcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEZBXHUwMDAwXHVFMkE0XHUwMDAwIisKLSAgICAgICAgIlx1RTk5RFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNjczXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjFBQVx1MDAwMFx1MDAwMFx1RjQzMVx1RTI3MVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY4MzZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGN0UwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMTY2XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUQ3RVx1RjdBMVx1MDAwMFx1MDAwMFx1RjhFRlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY3RUJcdUYyMzNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYwM0NcdTAwMDBcdTAwMDBcdTAwMDBcdUUwMzhcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNTlDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUQ2XHVGOTk4XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjU1OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY3NjRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNzM2XHUwMDAwXHVFQTVBXHVGNDU2IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTZEQVx1MDAwMCIrCi0gICAgICAgICJcdUU0RDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzU1XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYwNzYiKwotICAgICAgICAiXHUwMDAwXHVGNEREXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDZBXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY3NFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY2OTRcdTAwMDBcdUVBQzJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0ZEIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTE5OFx1MDAwMFx1MDAwMFx1RTRCQVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVEM0ZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0UxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzM2XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTBEM1x1MDAwMFx1MDAwMFx1MDAwMFx1RUI0Q1x1MDAwMFx1RjU1QVx1RTU5QyIrCi0gICAgICAgICJcdTAwMDBcdUY5QUFcdUY3RTJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjU0N1x1RjlDMlx1Rjk0MFx1MDAwMFx1RjlFQ1x1RTA3Mlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5QkQiKwotICAgICAgICAiXHUwMDAwXHVGMDc3XHVFQUMzXHVFM0QyXHVFMjcyXHUwMDAwXHVFNEE0XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOUFCXHUwMDAwXHVFQUUwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0NTdcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRUYwXHUwMDAwXHVFMzdFXHUwMDAwXHUwMDAwXHVGNEFBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUE1Qlx1RjY0OFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUJGNVx1RjNCM1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY2QTNcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMDM5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTJBNVx1MDAwMFx1MDAwMFx1RUFDNCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUJCMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYzNEZcdTAwMDBcdUY2MzRcdTAwMDBcdUVDQjZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGODU2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMzkxXHUwMDAwXHUwMDAwXHVGOUVEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTlDNFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOTk5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUU0Rlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBM0RcdTAwMDBcdUY4NEZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFREYxXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjFDNFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNDM1XHUwMDAwXHUwMDAwXHVGOUVFXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjVCNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVCRjZcdUVBNUNcdTAwMDBcdTAwMDBcdUY5NkVcdTAwMDAiKwotICAgICAgICAiXHVGMTY3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUxRERcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNjQ3XHVFMUIzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1Rjc2NVx1RUREOFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUyRUFcdTAwMDBcdTAwMDBcdUUyRDBcdTAwMDBcdUYwNUNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMDNFXHVGMDNEXHUwMDAwXHUwMDAwXHVFNEYxXHUwMDAwIisKLSAgICAgICAgIlx1RTRBNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjZDRiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMjM0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzM0XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjQzMlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUzOTJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNDMzXHUwMDAwXHVGNkY4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzQzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RThBOVx1MDAwMFx1MDAwMFx1RTRCQlx1RTA3Q1x1MDAwMCIrCi0gICAgICAgICJcdUYzQTZcdUUwRDVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjZFN1x1MDAwMFx1MDAwMFx1RTFERVx1MDAwMFx1RjZBNFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY3NTBcdTAwMDBcdTAwMDBcdTAwMDBcdUU0RERcdTAwMDAiKwotICAgICAgICAiXHVFMTYwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMkE2XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY5NVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVCRjdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNERDXHUwMDAwXHUwMDAwXHVGOEEwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjgzN1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMEQ5XHUwMDAwXHVFMkE3XHVGMDNGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUQ5MVx1MDAwMFx1MDAwMFx1MDAwMFx1RUZCOSIrCi0gICAgICAgICJcdUYzRDhcdTAwMDBcdTAwMDBcdUU3NjhcdTAwMDBcdTAwMDBcdUVCOTRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUU0NCIrCi0gICAgICAgICJcdUU5OUVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjRGMVx1MDAwMFx1MDAwMFx1MDAwMFx1RUNEMFx1MDAwMFx1MDAwMFx1RjQ5RCIrCi0gICAgICAgICJcdTAwMDBcdUU4QzZcdUUzOTNcdTAwMDBcdUUzOTRcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMkRDXHUwMDAwXHVFNEQxXHUwMDAwXHUwMDAwXHVFMTQxXHVGNkQ4XHUwMDAwIisKLSAgICAgICAgIlx1RTBBOFx1RjBCQ1x1RUQ0RVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTZDXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTk1Mlx1MDAwMFx1MDAwMFx1RjMzN1x1MDAwMFx1MDAwMFx1RUU1MCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUwN0RcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGN0IiKwotICAgICAgICAiXHVFREU4XHVFOTUzXHUwMDAwXHUwMDAwXHVGMURFXHVFNEYyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTE5OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFMjY0XHVFRUFCXHUwMDAwXHUwMDAwXHUwMDAwXHVFMEMzIisKLSAgICAgICAgIlx1MDAwMFx1RUJCMVx1MDAwMFx1MDAwMFx1RjZCMlx1MDAwMFx1MDAwMFx1RTRGMyIrCi0gICAgICAgICJcdUU0RDJcdTAwMDBcdUY1QzBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBRERcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMjk1XHVFRUYxXHUwMDAwXHVGOUI0XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0NThcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNEQyXHUwMDAwXHUwMDAwXHVGMjk2XHUwMDAwXHVFQzYzXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTE2MVx1MDAwMFx1RUFFQVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVGQkFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0Q3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjVDRFx1MDAwMFx1RjNGMlx1Rjg1NyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFN0Y4XHVFNTUyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNjc1XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTlDNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVFRjJcdUYxREZcdTAwMDBcdTAwMDBcdUUwNUJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFOEZBXHUwMDAwXHUwMDAwXHUwMDAwXHVFRjQ1XHUwMDAwXHVFNEE2IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjlCNVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY3QzlcdTAwMDBcdUVENzJcdTAwMDBcdUY4QkRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNkE0XHVFMjU1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMjY1XHVFNjc2IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RURCRFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVBNURcdUYxOTVcdTAwMDBcdTAwMDBcdUYxRTAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjE3Q1x1RjhCRVx1RUFFQlx1MDAwMFx1RUJGOFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0JFIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTM5NVx1RUIzQVx1RUY3Mlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDNjRcdUU0OUZcdTAwMDBcdUVEQThcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFN0QzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNERFIisKLSAgICAgICAgIlx1MDAwMFx1RjU0OFx1RjZCQ1x1RTk5Rlx1MDAwMFx1RUY3Q1x1RUQ3N1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDRjdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYxMzgiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGODkzXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RURGMlx1MDAwMFx1MDAwMFx1RTM5NiIrCi0gICAgICAgICJcdUU0M0ZcdUU5NzVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzMzVcdUYzQjQiKwotICAgICAgICAiXHVGOTQxXHVFMTlBXHUwMDAwXHUwMDAwXHVFOUM2XHVGODYxXHUwMDAwXHVGNkRGIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjgzOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYyOTdcdTAwMDBcdUVBNUVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFRjMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNkFDXHVGMEM0XHVGMUUxXHVFQjNCXHVFOUM3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTQ0M1x1RTQ0Rlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUwNUNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY4QkZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFREZEXHVFOUU1XHVFNzVEXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjE5Nlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUzOTdcdTAwMDBcdTAwMDBcdUVGN0RcdUUzNjIiKwotICAgICAgICAiXHUwMDAwXHVFN0Q4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY3Nlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU4QUFcdTAwMDBcdTAwMDBcdTAwMDBcdUY2RTBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTc2OVx1MDAwMFx1RjUzM1x1MDAwMFx1MDAwMFx1RjU2RFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYyRDFcdTAwMDBcdTAwMDBcdUU3QjVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMUFCXHUwMDAwXHVFQ0I3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjI0Qlx1RTFCNFx1MDAwMFx1RUI5NVx1RjA1RFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYxOTdcdUVGN0VcdTAwMDBcdUUwQTlcdUYzQUZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMDVEXHUwMDAwIisKLSAgICAgICAgIlx1RjEzOVx1MDAwMFx1RjQ3Qlx1MDAwMFx1RjlFRlx1MDAwMFx1RjdGM1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRTUxXHUwMDAwXHUwMDAwXHVGMTY4XHUwMDAwXHUwMDAwXHUwMDAwXHVGMUFDIisKLSAgICAgICAgIlx1MDAwMFx1RjA1RVx1MDAwMFx1RUY2Rlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQTVGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTQzNlx1MDAwMFx1MDAwMFx1RUVGNFx1RTNENlx1MDAwMFx1MDAwMFx1RUU1MiIrCi0gICAgICAgICJcdUVDRTNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVENDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNzQ0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjYzNVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0REVcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNkE1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNkU4XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUY1Nlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGOEU2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTlFNlx1MDAwMFx1MDAwMFx1MDAwMFx1RTlBMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTc2QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU4M0NcdUYwNDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0I4XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTAzQVx1RUJGOVx1MDAwMFx1RjA0MVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY0N0NcdTAwMDBcdTAwMDBcdUY4N0VcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYyNjVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY3RjRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNDdDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEZCXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjlGMFx1MDAwMFx1RUI0RFx1RTI3M1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY3NTZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVBM0VcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVBQzVcdTAwMDBcdTAwMDBcdUVEQkVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjFBRFx1Rjg3QVx1MDAwMFx1MDAwMFx1RTFFRVx1RjFBNlx1MDAwMFx1RjFBRSIrCi0gICAgICAgICJcdUYzN0RcdTAwMDBcdUU5QTFcdTAwMDBcdUYxQUZcdUY5OUFcdTAwMDBcdUU3N0IiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFMTlCXHVFMUI1XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjgzOVx1MDAwMFx1RUJERFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVDNjVcdUYxQ0ZcdTAwMDBcdTAwMDBcdTAwMDBcdUU5QTJcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGN0NBXHUwMDAwXHVGMDc4XHUwMDAwXHVFREVEXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTRFQlx1MDAwMFx1RUZENCIrCi0gICAgICAgICJcdUVCRkFcdUVENUNcdTAwMDBcdUVCRTRcdUVGNTdcdTAwMDBcdTAwMDBcdUUyNkIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFOTY1XHUwMDAwXHVGNkI1XHVGOTk1XHVGMzk1IisKLSAgICAgICAgIlx1RTIzRlx1RjNCNVx1RjJEMlx1RUY1OFx1RjBGMVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUwRDRcdUVCNEVcdUVDRjhcdUYwNzlcdUY5NDJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjk2XHUwMDAwXHVFMkUwXHUwMDAwIisKLSAgICAgICAgIlx1RjIzNVx1MDAwMFx1MDAwMFx1RjgzQVx1RUU1M1x1RUJCMlx1RTAzQlx1MDAwMCIrCi0gICAgICAgICJcdUVDRTRcdUVGQkJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDNjYiKwotICAgICAgICAiXHVGNEYyXHUwMDAwXHVGMjY2XHVGMDQyXHVFMzk4XHVGMTY5XHVFODVCXHVFMkE4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTlBM1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU3NkJcdTAwMDBcdUY3Q0VcdUVGRDVcdUVDRDFcdTAwMDBcdTAwMDBcdUU0NEMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzNDXHVGNENDIisKLSAgICAgICAgIlx1MDAwMFx1RTFGQlx1RjY2Nlx1MDAwMFx1RUVGNVx1RUY5MVx1RUNGOVx1RTQ0QiIrCi0gICAgICAgICJcdUY0RjNcdUVDRkJcdTAwMDBcdUVBNjBcdUUyNDBcdTAwMDBcdUU2OTlcdUYzRDkiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNUMxXHVFOTU0XHUwMDAwIisKLSAgICAgICAgIlx1RjVCQlx1MDAwMFx1RUE2MVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU5NzZcdTAwMDBcdTAwMDBcdUVBNjJcdTAwMDBcdTAwMDBcdUYxRTIiKwotICAgICAgICAiXHVGMjk4XHVGMDVGXHVGMzdFXHVFQ0ZDXHUwMDAwXHVFNERGXHVFNEY0XHVFQkIzIisKLSAgICAgICAgIlx1MDAwMFx1RUJCNFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjU2M1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVBQzZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRkQ2XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RThBQlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY2MzZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQ0I5XHVGMEM1XHVGNTM5XHVFMUI2XHVFNDlCXHUwMDAwXHVFODNEXHVFNDczIisKLSAgICAgICAgIlx1RTJEMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTBEQ1x1RTE5Q1x1MDAwMCIrCi0gICAgICAgICJcdUUyRERcdTAwMDBcdTAwMDBcdUVGMzlcdTAwMDBcdUVDQkJcdUVDQkFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQjZBXHUwMDAwXHUwMDAwXHUwMDAwXHVGMjk5XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTk0M1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU0RjVcdTAwMDBcdUU2QTZcdTAwMDBcdUY2NDVcdUU2REJcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQkQ1XHUwMDAwXHUwMDAwXHVFNTdBIisKLSAgICAgICAgIlx1MDAwMFx1RUFBM1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY5REZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUzOTlcdUYxRDRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTBBQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVENkJcdTAwMDBcdUVCRkJcdUUwQTJcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNEUwXHUwMDAwXHVFRDRGXHUwMDAwXHVGOEMwXHUwMDAwXHVFODRFIisKLSAgICAgICAgIlx1RUQ1RFx1MDAwMFx1RTY0OVx1MDAwMFx1MDAwMFx1MDAwMFx1RjJDMFx1MDAwMCIrCi0gICAgICAgICJcdUVCRkNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY2NDlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQUM3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUQ0MVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTk3NyIrCi0gICAgICAgICJcdUU5NzhcdTAwMDBcdTAwMDBcdTAwMDBcdUY4NjZcdTAwMDBcdUU0RjZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGM0RBXHUwMDAwXHVGODk0XHUwMDAwXHUwMDAwIjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBpbm5lckluZGV4Mj0KLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUM5RiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1Q0ZcdUUzOUFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMURGXHUwMDAwXHUwMDAwXHVGNUNCXHUwMDAwXHVFRDkyXHVFMEFCIisKLSAgICAgICAgIlx1MDAwMFx1RTZDNFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDQTAiKwotICAgICAgICAiXHUwMDAwXHVFOURBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTgzRVx1RTA3RVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU1QjlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDQTFcdTAwMDBcdTAwMDBcdUVGNzNcdTAwMDBcdTAwMDBcdUY0QUIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyQTkiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNEY3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1OTNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMjc0XHUwMDAwXHVFRjk0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RURGNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRUFFXHUwMDAwXHVFNjRBXHUwMDAwXHVFQUVDXHVFRDUwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGNzRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNzQ1XHUwMDAwXHUwMDAwXHUwMDAwXHVFRDZDXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjU0OVx1RjNCNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDNkVcdUVCQjVcdTAwMDBcdTAwMDBcdUUxRUZcdUYzQTdcdUUyNzUiKwotICAgICAgICAiXHVFMEREXHUwMDAwXHUwMDAwXHVFN0UzXHUwMDAwXHUwMDAwXHVGNEFDXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTM5Qlx1RjEzQlx1RUE2M1x1RjZFOVx1MDAwMFx1MDAwMFx1RjdGNSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCREVcdUUwRUVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQ0JDXHVGNzY2XHUwMDAwXHUwMDAwXHVFOEVFXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjlGMVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY2QjZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1NkVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNDdEXHUwMDAwXHVFOEQ5XHUwMDAwXHVGMzM4XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUJGRFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVBNjRcdTAwMDBcdUVCM0NcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMUUzXHUwMDAwXHUwMDAwXHVFNEUxXHUwMDAwIisKLSAgICAgICAgIlx1RUFDOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTdCNlx1MDAwMFx1RjlBQyIrCi0gICAgICAgICJcdUYyRDNcdTAwMDBcdTAwMDBcdTAwMDBcdUVENTFcdUY3N0JcdTAwMDBcdUU4QUMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOTU2XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTczRFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY2NEEiKwotICAgICAgICAiXHUwMDAwXHVFOERGXHVFNEQzXHVGNzU3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUwNUVcdUY3NTFcdUU0NDRcdTAwMDBcdTAwMDBcdUU5NDQiKwotICAgICAgICAiXHVGODQ5XHVFMDVGXHUwMDAwXHVGOTQzXHVGMDdBXHVGMDdCXHVFMzlDXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjFFNFx1MDAwMFx1MDAwMFx1RTlFNyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVBQzlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBRUQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMjRDXHUwMDAwXHVGMkMxIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTE2Mlx1MDAwMFx1RTlBNFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVBQ0FcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU0RjhcdUYzQTgiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUI3XHUwMDAwXHVGMkQ0XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUQ2RFx1RUFFRVx1RTBBQyIrCi0gICAgICAgICJcdUVGQkNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYwN0NcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQUNCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjdCRlx1RTYzRlx1RTVDNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUyQUFcdTAwMDBcdTAwMDBcdUUyMzlcdTAwMDBcdTAwMDBcdUU2OUFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGM0I3XHVGMjlBXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0Q5IisKLSAgICAgICAgIlx1RjRERlx1MDAwMFx1Rjc1OFx1RTI1Nlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1RTZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTc2XHUwMDAwXHUwMDAwXHVFRTU1XHVGMkQ1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTBFRlx1Rjk2Rlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU5MzdcdTAwMDBcdTAwMDBcdUU2NzdcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNzU5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0QyIisKLSAgICAgICAgIlx1MDAwMFx1RUNCRFx1MDAwMFx1RTJFMVx1RjM1MFx1RjE2QVx1MDAwMFx1RTlENyIrCi0gICAgICAgICJcdUY4RjBcdTAwMDBcdTAwMDBcdUYxM0NcdTAwMDBcdTAwMDBcdTAwMDBcdUYzMzkiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGODY3XHVGOEMxIisKLSAgICAgICAgIlx1MDAwMFx1RTQ1MFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVEQjBcdTAwMDBcdTAwMDBcdTAwMDBcdUYxRTVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFMEFEXHUwMDAwXHVGN0IwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY2QTVcdTAwMDBcdUUwQUVcdTAwMDBcdUU4M0ZcdTAwMDBcdUU3NDZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNEE3XHVGOEIyIisKLSAgICAgICAgIlx1MDAwMFx1RjlDNFx1MDAwMFx1RjEzRFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY4QTFcdTAwMDBcdTAwMDBcdTAwMDBcdUVERTlcdUVGRUUiKwotICAgICAgICAiXHUwMDAwXHVGNEY0XHVGNzk1XHVGMzUxXHVFQTNGXHVGNzQwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjRFMFx1RUVBRlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RThBRCIrCi0gICAgICAgICJcdTAwMDBcdUVFNDVcdTAwMDBcdTAwMDBcdUY3QThcdTAwMDBcdTAwMDBcdUU5RDgiKwotICAgICAgICAiXHVFRjY5XHVGMkQ2XHUwMDAwXHUwMDAwXHUwMDAwXHVFNEUyXHUwMDAwXHVFQzZGIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjk3MFx1RTZDOFx1RjlBRFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVBRUZcdUUxNjNcdUU0RjlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1OTIiKwotICAgICAgICAiXHVFOEM3XHVFQTY1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzk2XHUwMDAwIisKLSAgICAgICAgIlx1RTVEMFx1RUREOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY5NTdcdUU5NjZcdUVDNzBcdTAwMDBcdTAwMDBcdTAwMDBcdUU4NDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNEEzXHUwMDAwXHVFNEVDIisKLSAgICAgICAgIlx1MDAwMFx1RjU1Qlx1MDAwMFx1MDAwMFx1MDAwMFx1RjlDNVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVDRkRcdTAwMDBcdUY3QjFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzlEXHVGMTZCXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjVCQ1x1RjQzNCIrCi0gICAgICAgICJcdUU3NUVcdUU3NUZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNUY3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjY3MVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU0NDdcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEVDXHUwMDAwXHVFOUM4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVENzgiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNDUxXHUwMDAwXHUwMDAwXHUwMDAwXHVGNzY3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTY0Qlx1RUE2Nlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY2QkRcdUYxM0VcdTAwMDBcdTAwMDBcdTAwMDBcdUUzNzFcdTAwMDBcdUVCOTciKwotICAgICAgICAiXHVGMDQzXHUwMDAwXHVFMjY2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMTM1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMTk4XHVFQzcxXHVFQ0JFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk1OFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUxRjBcdTAwMDBcdUY3RjZcdTAwMDBcdTAwMDBcdUVBRjBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFREJGXHUwMDAwXHUwMDAwXHUwMDAwXHVFMjRGXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjk3MVx1RjFCMFx1RjlEMVx1RjY0Qlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY3Q0ZcdUYwREFcdUUwNTFcdTAwMDBcdUU0NDhcdUUxRjFcdTAwMDBcdUVDRDMiKwotICAgICAgICAiXHVGOUU2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFN0RcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQ0ZBXHUwMDAwXHUwMDAwXHVGMzNBXHVGN0QwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk3Mlx1MDAwMFx1RjczN1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVCRTVcdUYyOUJcdTAwMDBcdTAwMDBcdTAwMDBcdUVFRjYiKwotICAgICAgICAiXHVGMDdEXHUwMDAwXHUwMDAwXHVGOTQ0XHVGNUMyXHUwMDAwXHUwMDAwXHVFNkRDIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYzOTdcdTAwMDBcdUU5RThcdUU0RURcdUY1RkNcdTAwMDBcdUU4NEZcdTAwMDAiKwotICAgICAgICAiXHVFMTlEXHUwMDAwXHUwMDAwXHUwMDAwXHVFNEZBXHVGNTM0XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjJEN1x1MDAwMFx1RTU1MyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGOEUzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjhFRFx1MDAwMFx1RUIzRFx1MDAwMFx1MDAwMFx1RjA3RSIrCi0gICAgICAgICJcdUY4QjNcdUVENTJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjY3N1x1RTQ2RFx1MDAwMFx1RUFDQ1x1MDAwMFx1MDAwMFx1Rjk1OVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVEQTlcdUVCOThcdUY2NDNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQkZFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMEYwXHUwMDAwIisKLSAgICAgICAgIlx1RjA5MVx1RjA5Mlx1MDAwMFx1MDAwMFx1MDAwMFx1RTg1MFx1Rjc0NFx1RjBGMiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVENTNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRkQ3XHVFRDkzXHUwMDAwXHUwMDAwXHUwMDAwXHVFMDkxIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTI2NyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGOTVBXHUwMDAwXHUwMDAwXHUwMDAwXHVGNEUxXHUwMDAwXHUwMDAwXHVFMEM0IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUNFNVx1MDAwMFx1RTBDNVx1RjA0NCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVGQkRcdTAwMDBcdUU2QzlcdTAwMDBcdTAwMDBcdUYwREIiKwotICAgICAgICAiXHVGMUIxXHUwMDAwXHVFMTUzXHVGNkJFXHVGOTVCXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1Rjc5Nlx1MDAwMFx1RTdCN1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY0RDNcdUY0RDRcdTAwMDBcdTAwMDBcdTAwMDBcdUY2RTRcdTAwMDBcdUY2RDEiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNzQ3XHVFMjQxXHVFMDUyXHUwMDAwXHUwMDAwXHVGOEI0IisKLSAgICAgICAgIlx1RTBDNlx1MDAwMFx1MDAwMFx1RjM5OFx1MDAwMFx1MDAwMFx1RTVFN1x1MDAwMCIrCi0gICAgICAgICJcdUYwNjBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUxNjRcdUUwQUYiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTNBXHVFRkFGXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjVDM1x1RUZEOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU5RTlcdTAwMDBcdTAwMDBcdTAwMDBcdUYzRjNcdTAwMDAiKwotICAgICAgICAiXHVFNUZCXHVFQTRCXHUwMDAwXHUwMDAwXHVGNTlEXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjlGM1x1RjlGMlx1RjZBNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU5QzlcdTAwMDBcdTAwMDBcdUU1NjMiKwotICAgICAgICAiXHUwMDAwXHVFMTM4XHUwMDAwXHVFODUxXHVFMTY1XHUwMDAwXHVFN0U0XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjg1QVx1MDAwMFx1MDAwMFx1MDAwMFx1RURFM1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU0QkNcdTAwMDBcdTAwMDBcdTAwMDBcdUUwOTJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzU0XHUwMDAwXHUwMDAwXHUwMDAwXHVFMDYwIisKLSAgICAgICAgIlx1RjgzQlx1RjBFQlx1RUVGOFx1RTdFNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTNEN1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNEE0XHUwMDAwXHUwMDAwXHUwMDAwXHVFNTlEXHVGOTczIisKLSAgICAgICAgIlx1Rjg2OFx1MDAwMFx1RjRENVx1MDAwMFx1RTJBQlx1MDAwMFx1MDAwMFx1RjBGMyIrCi0gICAgICAgICJcdUU1RkNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU0RDQiKwotICAgICAgICAiXHVFMUZDXHUwMDAwXHVFN0U2XHUwMDAwXHVFQzlCXHVFQzMxXHVGMEQ0XHUwMDAwIisKLSAgICAgICAgIlx1RUI5OVx1RUQ0Mlx1RTE5RVx1MDAwMFx1MDAwMFx1MDAwMFx1RjhFNFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY1M0JcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzNEQiKwotICAgICAgICAiXHUwMDAwXHVFMDkzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjJCOFx1MDAwMFx1MDAwMFx1MDAwMFx1RTZDMFx1MDAwMCIrCi0gICAgICAgICJcdUYyOUNcdUY5RjRcdTAwMDBcdTAwMDBcdUU0RTNcdTAwMDBcdUY4QzJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNUU4XHVFOEFFIisKLSAgICAgICAgIlx1RUJCNlx1Rjc0N1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUI0RiIrCi0gICAgICAgICJcdUY4QzNcdUU5RUFcdTAwMDBcdUVDMzJcdTAwMDBcdUYyMzZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNjc4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjY5N1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOUNBXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTM3Mlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTlBNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU5RUJcdTAwMDBcdTAwMDBcdUVEOUJcdTAwMDBcdTAwMDBcdUVDQUYiKwotICAgICAgICAiXHVFMzlFXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTlFXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTE0Q1x1RjZFQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVERTRcdUVBRjFcdTAwMDBcdTAwMDBcdUY2RTFcdTAwMDBcdUY3RjciKwotICAgICAgICAiXHVGMkI5XHUwMDAwXHUwMDAwXHVGNzY4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY3QTlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNzY5XHUwMDAwXHUwMDAwXHUwMDAwXHVGMjREXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTc1Nlx1MDAwMFx1MDAwMFx1RUQ3M1x1RjVDRVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU5RDlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU3RTciKwotICAgICAgICAiXHVFNDQ5XHVFNUMzXHUwMDAwXHUwMDAwXHVFODc1XHVFODYwXHUwMDAwXHVFM0Q5IisKLSAgICAgICAgIlx1RTI2OFx1MDAwMFx1RTBERVx1RjUzQ1x1RTg5RFx1MDAwMFx1RjY3OVx1RUY5NSIrCi0gICAgICAgICJcdUUyQUNcdUYzOTJcdTAwMDBcdUY1OUZcdUU4QzhcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTI1MFx1RUNENFx1RTNDRlx1RjNGNSIrCi0gICAgICAgICJcdTAwMDBcdUUxRjJcdTAwMDBcdUUyRUJcdTAwMDBcdTAwMDBcdTAwMDBcdUUxQjgiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0E2XHVFM0RBIisKLSAgICAgICAgIlx1MDAwMFx1RjQzNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjQzNiIrCi0gICAgICAgICJcdTAwMDBcdUVENUVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNEZCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGM0E5XHUwMDAwXHUwMDAwXHUwMDAwXHVGNDU5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYyRDhcdUVFNTlcdTAwMDBcdUU3NDhcdUY4OTVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjRCNVx1MDAwMFx1MDAwMFx1RjczNFx1MDAwMFx1MDAwMFx1RTNGMyIrCi0gICAgICAgICJcdUVFNThcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY3NkFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTk3OSIrCi0gICAgICAgICJcdUVBNjdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwREZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFMkVDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTZGIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTNGNFx1RTQ0QVx1MDAwMFx1MDAwMFx1MDAwMFx1RUFGMiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVCQjdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQzMzXHVFNEZDXHUwMDAwXHUwMDAwXHVGMUU2XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RThDOVx1MDAwMFx1MDAwMFx1MDAwMFx1RUQ5Q1x1MDAwMCIrCi0gICAgICAgICJcdUUyREVcdTAwMDBcdTAwMDBcdUUyNjBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNUQzXHVGNEY1XHVGNkFFXHUwMDAwXHUwMDAwXHVGMkM4XHUwMDAwXHVFMUYzIisKLSAgICAgICAgIlx1RjVDRlx1RURGM1x1RjM1Mlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTA2MVx1MDAwMFx1MDAwMFx1MDAwMFx1RjA5M1x1MDAwMFx1RTMzNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU3REEiKwotICAgICAgICAiXHVGMzNCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMEU3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RURDMFx1Rjk0NVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVENTRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMTM5XHVGOUM2XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjA0NVx1MDAwMFx1RURBQVx1RUFCQSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUJERlx1MDAwMFx1RTg2MSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCQjhcdTAwMDBcdUVGOTZcdUU0RkQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQzM0XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjQ1QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU4NzZcdUY2QjNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjlDRFx1MDAwMFx1MDAwMFx1MDAwMFx1RjRCNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYyNjdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNUM0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTczNFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjQzNyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFN0I4XHVFN0I5XHVGMkM5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU2NUVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNkNCXHVFQUFFXHVFRjk3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTQ0NVx1MDAwMFx1MDAwMFx1MDAwMFx1RTRENVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1NUNcdUU4OUVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0U4XHUwMDAwXHVGNkVCXHVGNUM5XHUwMDAwIisKLSAgICAgICAgIlx1RjRCQ1x1MDAwMFx1RTg2Mlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU0QjVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRjQ2XHUwMDAwXHUwMDAwXHVFNjVGXHVGNTRBXHUwMDAwXHVGNkM5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTEzQVx1MDAwMFx1MDAwMFx1RjM1M1x1RTE2Nlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUzNjNcdTAwMDBcdUU0QkRcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFOEZCXHUwMDAwXHVFMEUwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTRFNFx1RjY5OVx1MDAwMFx1MDAwMFx1RTVCQVx1RjRDRFx1RTBFMSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYwRjRcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNTNEXHUwMDAwXHVGOTNBXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjZFQ1x1MDAwMFx1MDAwMFx1MDAwMFx1RUY5OFx1MDAwMCIrCi0gICAgICAgICJcdUU4NzdcdTAwMDBcdTAwMDBcdTAwMDBcdUY2Q0NcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVEQzFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCN0VcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNUZEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTI3Nlx1RjkzQlx1RTVCQlx1MDAwMFx1MDAwMFx1RjQzOCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDMzVcdUUxQjkiKwotICAgICAgICAiXHVGMDk0XHVFMEM3XHUwMDAwXHVFMUY0XHUwMDAwXHUwMDAwXHVFOEFGXHVGMkQ5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTFCQVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY5OUJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBRjNcdUUyNzdcdUU4NTIiKwotICAgICAgICAiXHUwMDAwXHVFMkFEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRUY5XHVGNzM4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjRFMlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUwOTRcdUVBQTRcdTAwMDBcdTAwMDBcdUU1NTRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMTY3XHVFREMyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTFCQlx1MDAwMFx1RjJEQVx1RjI2OFx1MDAwMFx1RTlBNyIrCi0gICAgICAgICJcdUVDMzZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCNTBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNjQwXHVGNzVBXHUwMDAwXHVGOTlDXHUwMDAwXHVFN0ZFIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUE0MFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU5RUNcdUU4NzhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1NzAiKwotICAgICAgICAiXHUwMDAwXHVFNjlCXHUwMDAwXHVFMUQ3XHVFQTY4XHUwMDAwXHUwMDAwXHVGNDlBIisKLSAgICAgICAgIlx1MDAwMFx1RUQ2Nlx1MDAwMFx1MDAwMFx1RTM1NVx1RjUzRVx1MDAwMFx1RTlBOCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYxQzVcdUY0RDZcdTAwMDBcdTAwMDBcdUVBNjkiKwotICAgICAgICAiXHVFQ0U2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNEE4IisKLSAgICAgICAgIlx1MDAwMFx1RThCMFx1MDAwMFx1MDAwMFx1RUREQVx1RUNCRlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU4QjFcdTAwMDBcdTAwMDBcdTAwMDBcdUU1RTlcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjUxXHVGMkRCXHUwMDAwXHUwMDAwXHVGMzc5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTZCMlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTM5RiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFN0U5XHUwMDAwXHUwMDAwXHVFM0EwXHUwMDAwXHVGMTdEXHVFNEE5XHUwMDAwIisKLSAgICAgICAgIlx1RjQzOVx1RjM1NFx1MDAwMFx1MDAwMFx1RUM3Mlx1RUZFRlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY3RDFcdTAwMDBcdTAwMDBcdUVGRDlcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRjZBXHVFODUzXHVFODU0XHVFNTU1XHUwMDAwXHVFRUZBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTFFMFx1RUNCMCIrCi0gICAgICAgICJcdTAwMDBcdUU4QjJcdUY4QzRcdTAwMDBcdUY0RTNcdTAwMDBcdUU3QTVcdUY4RTciKwotICAgICAgICAiXHVFOUNCXHVFMzY0XHUwMDAwXHVFRTQ2XHVFQjNFXHVGOURBXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTk0NVx1RUI5QSIrCi0gICAgICAgICJcdUVFQjFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1RjBcdTAwMDBcdUU3NkMiKwotICAgICAgICAiXHVGMUM2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQkI5XHUwMDAwXHVFQ0MwIisKLSAgICAgICAgIlx1RjdDMFx1RUZGMFx1MDAwMFx1MDAwMFx1RTdEQlx1MDAwMFx1RjRFNFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU5NDZcdUVENzlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMzU1XHVFQ0MxXHVGOTVDXHVGOTVEXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjQ1Qlx1MDAwMFx1RjQ1Q1x1MDAwMFx1MDAwMFx1MDAwMFx1RUQ1RiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGM0RCXHUwMDAwXHVGODY5XHUwMDAwXHVGM0I4XHVGOUY1XHVFQjlCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUVGQlx1Rjk0N1x1Rjk3NFx1RjhDNSIrCi0gICAgICAgICJcdUVDRTdcdUU3NDlcdTAwMDBcdUY2OUFcdTAwMDBcdTAwMDBcdUU5NTVcdUUxNjgiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjNGXHVGNTc3XHUwMDAwXHVGMkRDXHVFMkZDIisKLSAgICAgICAgIlx1RjJERFx1MDAwMFx1RjQzQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5QkVcdTAwMDBcdTAwMDBcdUUwM0MiKwotICAgICAgICAiXHVGOUJCXHVGOUM3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRUIyXHUwMDAwIisKLSAgICAgICAgIlx1RjA2MVx1RUFGNFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTNFQ1x1RUQ2RSIrCi0gICAgICAgICJcdUVEQzNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU3QTZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMUJDXHUwMDAwXHVGNEU1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjFENVx1MDAwMFx1MDAwMFx1RTdCQVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYxRTdcdUY4QjVcdUY3N0NcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQjc3XHUwMDAwXHVFMTY5XHUwMDAwXHUwMDAwXHVFNTU2XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUVBNVx1MDAwMFx1RTVGNVx1RTRCRSIrCi0gICAgICAgICJcdTAwMDBcdUY5OURcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDk0XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUFGNVx1MDAwMFx1MDAwMFx1RUY5QVx1Rjc3RFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUyNTdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5RjZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUY2OFx1MDAwMFx1RTFEOFx1RUVENlx1RTE2QVx1MDAwMFx1MDAwMFx1RTA3MyIrCi0gICAgICAgICJcdUVBRjZcdUYzNTdcdUYzNTZcdTAwMDBcdUU3NEFcdTAwMDBcdUYzRjRcdUY1OTIiKwotICAgICAgICAiXHVGNUNDXHUwMDAwXHUwMDAwXHVGOTc1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjA1NVx1RjA5NVx1MDAwMFx1RTlEQlx1MDAwMFx1RTk2N1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBOUZcdUY0OUJcdTAwMDBcdUU1QzciKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzYwXHUwMDAwXHVGMzU4XHVFM0ExXHVFM0EyIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTdENFx1RTY3OCIrCi0gICAgICAgICJcdUU3Q0FcdTAwMDBcdUU4NDFcdUU3NTdcdUU5NzJcdUY0Q0VcdUY1RjRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGM0I5XHUwMDAwXHUwMDAwXHVFODYzXHUwMDAwXHVGNjdBXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTJGNVx1MDAwMFx1MDAwMFx1RjlBRVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwNjJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQUI0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNkREXHVGODRBIisKLSAgICAgICAgIlx1RjIzN1x1RjVCRFx1MDAwMFx1Rjc5N1x1MDAwMFx1MDAwMFx1RjFFOFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1NzFcdTAwMDBcdUUzQTNcdUVCRDYiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjdGOFx1MDAwMFx1RThDQSIrCi0gICAgICAgICJcdUUwRjlcdUU1NjRcdTAwMDBcdUU3RENcdTAwMDBcdUYyNEVcdTAwMDBcdUY2RUQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNDdFXHUwMDAwXHUwMDAwXHVFQkU2XHVGNkY5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTlFRCIrCi0gICAgICAgICJcdTAwMDBcdUVGNkJcdTAwMDBcdUU4QjNcdTAwMDBcdTAwMDBcdTAwMDBcdUUzRjciKwotICAgICAgICAiXHVFQjQwXHUwMDAwXHUwMDAwXHVFNTcyXHUwMDAwXHVGNjY3XHUwMDAwXHVFNkY5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTc2RFx1MDAwMFx1RTFGRFx1RjQzQlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUJEIisKLSAgICAgICAgIlx1Rjc1Mlx1MDAwMFx1MDAwMFx1RjQzQ1x1MDAwMFx1MDAwMFx1RTAzRFx1RTAzRSIrCi0gICAgICAgICJcdUUyQUVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDQzJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOTQ3XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RThEQSIrCi0gICAgICAgICJcdUU3QkJcdUUwOTVcdUY2NjNcdUVFOUFcdUYwOTdcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMDk4XHUwMDAwXHUwMDAwXHVGNjlCXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUyQUZcdTAwMDBcdTAwMDBcdUUwNjNcdTAwMDBcdTAwMDBcdUUwM0YiKwotICAgICAgICAiXHVFNDQwXHVGM0JBXHUwMDAwXHVFNkIzXHVFQ0MzXHVGNEZEXHVFQTZBXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUE2Qlx1MDAwMFx1MDAwMFx1RjJERVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUM3M1x1RjI5RFx1MDAwMFx1MDAwMFx1RUFGN1x1RTZDQSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMjc4XHVFOERCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjNCQlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUZGMSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGODQ3XHVFMzU2XHUwMDAwXHUwMDAwXHVFMTNCXHVGMjM4XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTBGQVx1RjdGOVx1RTE5Rlx1RTRGRVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVENjBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0N0VcdTAwMDAiKwotICAgICAgICAiXHVFNTY1XHVFQUNEXHUwMDAwXHVGOTQ4XHVFM0QwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNDVEXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjZEMlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwNjQiKwotICAgICAgICAiXHUwMDAwXHVFNUQ5XHUwMDAwXHUwMDAwXHUwMDAwXHVFNzZFXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTFEOSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYyMzlcdUY2NENcdTAwMDBcdTAwMDBcdUUxNkIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzU5XHUwMDAwXHVGOTlFIisKLSAgICAgICAgIlx1MDAwMFx1RUY1OVx1RjVBMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUVGQyIrCi0gICAgICAgICJcdUU2REVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBNkNcdTAwMDBcdUYzM0MiKwotICAgICAgICAiXHVFMUEwXHVFMUUxXHUwMDAwXHVFQkJBXHUwMDAwXHVFOEVGXHVFODQyXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzQTVcdUU5NDhcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNzk4XHUwMDAwXHVFM0E0XHUwMDAwXHVFMUUyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTk3QVx1MDAwMFx1MDAwMFx1RjM5OVx1MDAwMFx1RjM1QSIrCi0gICAgICAgICJcdUUzNEVcdTAwMDBcdUU5RENcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1NjYiKwotICAgICAgICAiXHVFNEQ2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMUQwIisKLSAgICAgICAgIlx1RTFBMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUFCNVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVBRjhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNTMxXHVFMjQyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUY1QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjBGNVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDRDVcdUY1RDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNUExXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU3QTciKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RURBQlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFNUJcdTAwMDBcdUY1RjEiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RURDNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY3QTNcdUVCNkJcdUY2N0JcdTAwMDBcdUUwRjEiKwotICAgICAgICAiXHUwMDAwXHVFN0VBXHVGNUEyXHUwMDAwXHUwMDAwXHUwMDAwXHVFNkQxXHUwMDAwIisKLSAgICAgICAgIlx1RTNGOFx1RjA5QVx1RjA5Qlx1RTg0M1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYyREZcdTAwMDBcdTAwMDBcdUYzRUZcdTAwMDBcdUVERjZcdUYyNEZcdUVDNzQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzRGXHUwMDAwXHVGODNDIisKLSAgICAgICAgIlx1RjVEMVx1RUVCM1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUZCRVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY0NUVcdUU4QjRcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOTVFXHUwMDAwXHVFOUVFIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUVCNFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2QjRcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNkI0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTFCRVx1MDAwMFx1RTg3OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUyQjBcdUY2RDlcdUY0RTZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMjY5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMjNBXHUwMDAwXHVFMEM4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUzMzdcdTAwMDBcdUYzNUJcdTAwMDBcdUUzNTciKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRDU1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RThFMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU1REFcdTAwMDBcdUU2QTdcdTAwMDBcdTAwMDBcdTAwMDBcdUYyNTAiKwotICAgICAgICAiXHUwMDAwXHVGNzk4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNUQyXHVGMUU5IisKLSAgICAgICAgIlx1MDAwMFx1RTdCQ1x1MDAwMFx1RURDNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNUEzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTg2NFx1RUMzN1x1RjhGQ1x1MDAwMFx1MDAwMFx1RjNEQ1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwOTZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRjlDXHUwMDAwXHUwMDAwXHVFMjc5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUZGOFx1RUM3NVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUzNDlcdUU1OTRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzQTYiKwotICAgICAgICAiXHUwMDAwXHVFQUNFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk5Nlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTRBQVx1MDAwMFx1MDAwMFx1MDAwMFx1RTEzQ1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYyRTBcdTAwMDBcdTAwMDBcdTAwMDBcdUVERTVcdUUzNjVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOEZDIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk3Nlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUwRkVcdUYxRUFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUE0MVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY3RTNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNTMyXHVFMkY2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU2NjBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNUVBXHVGM0VFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGODVCXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RURBMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1QjFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFMkVEXHUwMDAwXHVGMUVCXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTVCMlx1MDAwMFx1MDAwMFx1MDAwMFx1RTVCQ1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGOUUyXHVGNEFEXHUwMDAwXHVGOURCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVGQjBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFM0E3XHUwMDAwXHUwMDAwXHVGOUUzXHVFMjQzXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjlFNFx1Rjg1RSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwNDBcdTAwMDBcdUY2QTdcdTAwMDAiKwotICAgICAgICAiXHVFMkIxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUUzMiIrCi0gICAgICAgICJcdTAwMDBcdUY5NDZcdUY0M0RcdUYyRTFcdUY0QUVcdUU5NTZcdUU3RUJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRjcwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUJBOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTVGNiIrCi0gICAgICAgICJcdUUyRkRcdTAwMDBcdTAwMDBcdUVBNkRcdTAwMDBcdTAwMDBcdTAwMDBcdUU3RDEiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDdBXHVGNDVGXHUwMDAwXHVGNkJGXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUM3Nlx1RUMzOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDRDZcdTAwMDAiKwotICAgICAgICAiXHVGMUQxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRkY5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2NDFcdUVBNDIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQjc4XHUwMDAwXHUwMDAwXHVFNEFCXHUwMDAwXHVGMERDIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUFBRlx1MDAwMFx1RTA1M1x1MDAwMFx1MDAwMFx1RjI5RSIrCi0gICAgICAgICJcdTAwMDBcdUY5QzNcdTAwMDBcdTAwMDBcdTAwMDBcdUYwRjZcdUUyQjJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0VDXHUwMDAwXHVFN0JEXHUwMDAwXHVFNzZGIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTU0OFx1RjBCRVx1RTlFRlx1MDAwMFx1RTlGMFx1RTlGMSIrCi0gICAgICAgICJcdUU5RjJcdTAwMDBcdTAwMDBcdUU3QkVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjhDNlx1RTJCM1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYyOUZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVEM0IiKwotICAgICAgICAiXHUwMDAwXHVFODU1XHUwMDAwXHVFNzdDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUzQThcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUMzOVx1MDAwMFx1MDAwMFx1RUE0QyIrCi0gICAgICAgICJcdUVFQjVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU4RjBcdTAwMDAiKwotICAgICAgICAiXHVGMkUyXHVGM0YwXHVFMkI0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RThGMVx1MDAwMCIrCi0gICAgICAgICJcdUVCNDFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBQTVcdTAwMDBcdUY3RDIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRUZEXHUwMDAwXHUwMDAwXHVFRTMzXHVGOEYxXHVFMEIwIisKLSAgICAgICAgIlx1RjQzRVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUxRTdcdTAwMDBcdUVGNkNcdTAwMDBcdTAwMDBcdUVFRDdcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNkMwXHUwMDAwXHVFMzczXHUwMDAwXHUwMDAwXHUwMDAwXHVFODMxXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTE0RFx1MDAwMFx1MDAwMFx1RTNBOVx1RTlDQ1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDRkVcdUUzQUFcdUVGM0FcdTAwMDBcdUYwNDZcdUY3RkFcdUVFNUMiKwotICAgICAgICAiXHVGNjY4XHUwMDAwXHUwMDAwXHUwMDAwXHVFNTU3XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTdDQlx1MDAwMFx1RTdEMlx1RTRDQlx1RTc5OVx1RTgzOVx1RjVGOFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVBNkVcdUY0M0ZcdUY3MzlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTc1OFx1MDAwMFx1MDAwMFx1RjI1MVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY3QzFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFOUYzXHVGMDlDXHUwMDAwXHVGNjREXHVFQkJCXHVFMUJGXHVGNTY0XHVFRTVEIisKLSAgICAgICAgIlx1MDAwMFx1Rjk1Rlx1RjhBMlx1MDAwMFx1RUI2Q1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY1NEJcdUU4NjVcdTAwMDBcdUY3QjJcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEYyXHUwMDAwXHVFOEY2XHUwMDAwXHVFQTZGIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RThGMlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY3NkNcdUY2RUVcdUYwRThcdTAwMDBcdUU0OUNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGM0JDXHUwMDAwXHUwMDAwXHVGODZBXHUwMDAwXHUwMDAwXHVFODdBXHVFODU2IisKLSAgICAgICAgIlx1RjZDMVx1MDAwMFx1MDAwMFx1RUVCNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGlubmVySW5kZXgzPQotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RURDN1x1RTYzQ1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU5NTdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCQTkiKwotICAgICAgICAiXHUwMDAwXHVFQzNBXHUwMDAwXHVFNUE2XHUwMDAwXHUwMDAwXHVFNTY3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjQ2MFx1MDAwMFx1RjA5RCIrCi0gICAgICAgICJcdTAwMDBcdUVCNkRcdUY4RjNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGM0JEXHUwMDAwXHUwMDAwXHVFQzc3XHVGOUQ3XHUwMDAwIisKLSAgICAgICAgIlx1RTI1OFx1RjA0N1x1MDAwMFx1Rjk1MFx1MDAwMFx1RjlFN1x1RjZFRlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU2QjVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYyQkFcdUYzRERcdTAwMDBcdUVBNDNcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFRjVCXHUwMDAwXHUwMDAwXHVGNzZEXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjhDN1x1RTVDOFx1MDAwMFx1RTZERlx1MDAwMFx1RTlBOVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGQjFcdTAwMDBcdTAwMDBcdUY4M0QiKwotICAgICAgICAiXHVGNjY5XHVGODk2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNzNBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUU3RVx1MDAwMFx1RTE2QyIrCi0gICAgICAgICJcdUVCQkNcdUVCOTFcdTAwMDBcdTAwMDBcdUVGQkZcdUY5OUZcdUVFNUVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQkQ3XHUwMDAwXHVFRTVGXHUwMDAwXHVGNTkzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDk1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUQ5RFx1MDAwMFx1MDAwMFx1RjdFNFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMkUzXHUwMDAwXHUwMDAwXHVFMkVFXHVGNjRFXHVFQjQyXHVGOUEwXHVFM0FCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTZGQVx1MDAwMFx1MDAwMFx1MDAwMFx1RjhDOCIrCi0gICAgICAgICJcdTAwMDBcdUVDNjdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNTMzXHVGMzlBXHVFNkE4XHUwMDAwXHUwMDAwXHUwMDAwXHVFQkU3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTRCRlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYyRTRcdTAwMDBcdUU2QzVcdUYwRTJcdTAwMDBcdTAwMDBcdUY5NzdcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRDMyXHUwMDAwXHVFQzc4XHUwMDAwXHVFRTYwXHUwMDAwXHVGOEU4IisKLSAgICAgICAgIlx1RjU3OFx1RURGNFx1RjU0Q1x1RjU2NVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUFCNiIrCi0gICAgICAgICJcdTAwMDBcdUY5NDlcdUYyNTJcdUUwOTdcdTAwMDBcdTAwMDBcdTAwMDBcdUYyRTUiKwotICAgICAgICAiXHVFMEUyXHVFNTM0XHUwMDAwXHVFQTcwXHVFODlGXHVFRDU2XHVFRjRFXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUI2RVx1RjY0NFx1RjA2Mlx1MDAwMFx1RjdGQiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVCNTJcdTAwMDBcdUUwNzRcdTAwMDBcdUVFQjdcdTAwMDAiKwotICAgICAgICAiXHVGMDlGXHUwMDAwXHVFN0REXHUwMDAwXHVFODQ0XHVGMjNBXHVGOEU5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RThDQlx1RTg0NVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYzQkVcdTAwMDBcdTAwMDBcdUU0QUNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEM5XHUwMDAwIisKLSAgICAgICAgIlx1RUFDRlx1MDAwMFx1MDAwMFx1RTRDMFx1RUNEN1x1MDAwMFx1RjJFNlx1Rjk2MCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGQzAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNUQzXHUwMDAwXHUwMDAwXHVGMTZDXHVGNkI3IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjA0OFx1RTNGOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU5NThcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYwNDlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzREVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNkI2XHVFMkI1XHUwMDAwXHVFN0E4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjE3RVx1MDAwMFx1MDAwMFx1RTlBQVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUxQTJcdUVGM0VcdTAwMDBcdTAwMDBcdTAwMDBcdUVCQkQiKwotICAgICAgICAiXHUwMDAwXHVGNDYxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRkMxXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTQ5RVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU4QjVcdTAwMDBcdUY0RTdcdUU3QTBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGOTYxXHUwMDAwXHVGMUIyXHVGNTNGXHUwMDAwXHVGOEEzXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1Rjk1MVx1MDAwMFx1RjIzQlx1RTUzNVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjU5NCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYyNjlcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGOENBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUUzXHVFNzRCIisKLSAgICAgICAgIlx1MDAwMFx1RUREQlx1Rjc5OVx1MDAwMFx1MDAwMFx1MDAwMFx1RjY2NFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2QTkiKwotICAgICAgICAiXHUwMDAwXHVFMEM5XHUwMDAwXHUwMDAwXHVFRTYxXHVGMzVDXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU3M0VcdTAwMDBcdUY3RDNcdUU1RkVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzRDXHVGNDQwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUMzQlx1RjRFOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYyQzJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYxRUMiKwotICAgICAgICAiXHUwMDAwXHVFRUI4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU4QTBcdTAwMDBcdTAwMDBcdUUxNEVcdTAwMDBcdTAwMDBcdUY0OUUiKwotICAgICAgICAiXHVFODdCXHUwMDAwXHVFQzY4XHVGMUQ2XHUwMDAwXHUwMDAwXHVFNjYxXHVFQjQzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjk2Mlx1MDAwMFx1RjBDOFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU0QzFcdUYzNURcdTAwMDAiKwotICAgICAgICAiXHVFMkY3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjFEMlx1MDAwMFx1RTU2OFx1RTk1OVx1RTZGMVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVBQkJcdTAwMDBcdTAwMDBcdUY0QTVcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNTVEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGM0JGXHVGNzQxXHUwMDAwIisKLSAgICAgICAgIlx1RUZGQVx1MDAwMFx1MDAwMFx1MDAwMFx1RjhDQlx1MDAwMFx1MDAwMFx1RTA2NSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0Q0XHVGNkNBXHUwMDAwXHUwMDAwXHVFNjU4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk3OFx1RjRCRCIrCi0gICAgICAgICJcdTAwMDBcdUYyQTBcdTAwMDBcdUVFRkVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNEMyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNEI2XHUwMDAwIisKLSAgICAgICAgIlx1RTEzRFx1RjY5Q1x1RTY0Mlx1RTQ2OFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVFRDhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0E1XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUVCOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjMzRCIrCi0gICAgICAgICJcdUY4Q0NcdUYwQTFcdTAwMDBcdTAwMDBcdUU1MzZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGOENEXHUwMDAwXHVFNUJEXHVGM0RGXHUwMDAwXHUwMDAwXHVGNjlEIisKLSAgICAgICAgIlx1MDAwMFx1RUE0NFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1RUJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFREM4XHUwMDAwXHUwMDAwXHUwMDAwXHVGOEE0XHVFNTQ5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUE3MVx1MDAwMFx1RUQzM1x1MDAwMFx1MDAwMFx1MDAwMFx1RTZCNyIrCi0gICAgICAgICJcdTAwMDBcdUY3N0VcdTAwMDBcdTAwMDBcdTAwMDBcdUVBNDVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNjYyXHUwMDAwXHVGN0Q1XHVFRUJBXHVGMEQ1XHVFNUY3XHVGMkU3XHVFQkJFIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjgzRVx1MDAwMFx1MDAwMFx1MDAwMFx1RTY3OSIrCi0gICAgICAgICJcdUU2N0VcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFQkIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMTVCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTVCM1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMjQ0XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjhBNVx1RUJFRVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY2QThcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY4Q0VcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzREXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjhGRFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY5NzlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMkI2XHUwMDAwXHUwMDAwXHUwMDAwXHVGMUM3XHVGMjNDXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTE2RFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY2MzdcdTAwMDBcdTAwMDBcdTAwMDBcdUVFOUNcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNUE0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjlEQ1x1RjFCM1x1RTI1OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYyRThcdTAwMDBcdTAwMDBcdUVCQkZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGODZCXHVFMEUzXHVGNkE5XHUwMDAwXHVGOEE2IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTk0OVx1MDAwMFx1MDAwMFx1MDAwMFx1RjNDMCIrCi0gICAgICAgICJcdUYxQzhcdUYyQzNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTYzRFx1MDAwMFx1MDAwMFx1RjlDRVx1MDAwMFx1MDAwMFx1MDAwMFx1RUYzMSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGOEY0XHVFNUE3XHUwMDAwXHUwMDAwXHUwMDAwXHVGM0Y2XHUwMDAwXHVFRTYzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMTZFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1Rjc0Mlx1MDAwMFx1MDAwMFx1MDAwMFx1RTk3Qlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5QjZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFREVBXHUwMDAwXHUwMDAwXHVGM0UwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU4Q0NcdUU5Q0RcdTAwMDBcdTAwMDBcdTAwMDBcdUU1NThcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFN0VEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNUE1XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVFOURcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFNjRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjlDOCIrCi0gICAgICAgICJcdTAwMDBcdUU2MzFcdUY5QkZcdTAwMDBcdUY5NjNcdTAwMDBcdUYyQTFcdTAwMDAiKwotICAgICAgICAiXHVFRUJDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFM0VFXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUU2NVx1MDAwMFx1MDAwMFx1RUZGMlx1MDAwMFx1RUFCMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU3NzBcdUY5NEFcdUY5QUZcdUYzNUUiKwotICAgICAgICAiXHUwMDAwXHVFOEUxXHUwMDAwXHUwMDAwXHVFREM5XHUwMDAwXHVGMUI0XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCNTNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0Q4XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUZGQlx1RjAzOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjlCNyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY4QTdcdTAwMDBcdUVGQzJcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGOUY3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQzY5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTk3Q1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGMzJcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRTkyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjlGOFx1RjlGOVx1MDAwMFx1MDAwMFx1MDAwMFx1RjY0Rlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVFQTdcdTAwMDBcdUVFNjdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNTk1XHVFNTU5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjlDXHUwMDAwIisKLSAgICAgICAgIlx1RTZGMlx1MDAwMFx1RUJDMFx1MDAwMFx1RThFMlx1RUU2OFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFQkQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzVGXHVGNEJFXHVFQzNDIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjVCN1x1RUI5Mlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGOUI4XHVFQ0U4XHUwMDAwXHVFNTM3XHVFRjlFIisKLSAgICAgICAgIlx1Rjg2Mlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjc5MVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNjYzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTVCNFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMzYwXHUwMDAwXHVGNkYwXHVGMjQzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjA0QVx1MDAwMFx1RjA2M1x1MDAwMFx1MDAwMFx1RjFDOVx1RTlBQlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVEQUNcdUY5QTFcdTAwMDBcdUVBRDBcdUYxNDNcdTAwMDAiKwotICAgICAgICAiXHVFQUQxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMUVEXHVGNzQ4IisKLSAgICAgICAgIlx1RjZGQVx1MDAwMFx1MDAwMFx1MDAwMFx1RjczQlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY1NzBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNTRBXHVFRDQzXHUwMDAwXHVFRkRBXHUwMDAwXHVFQTQ2XHUwMDAwXHVFN0JGIisKLSAgICAgICAgIlx1MDAwMFx1RTdDMFx1RTY5MVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTdDQyIrCi0gICAgICAgICJcdTAwMDBcdUU4M0FcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQUU1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjZFNVx1MDAwMFx1MDAwMFx1MDAwMFx1RTE0Mlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVBRjlcdUU2RTBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNTRCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOUZBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTE0M1x1MDAwMFx1MDAwMFx1RThGMyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUFEMlx1MDAwMFx1RTI1QVx1MDAwMFx1RjI2QVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVENzRcdTAwMDAiKwotICAgICAgICAiXHVGOENGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMkI3IisKLSAgICAgICAgIlx1MDAwMFx1RjI1M1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUyN0FcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQzNEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU2RTFcdUY4OTdcdTAwMDBcdTAwMDBcdUU1QzlcdUY3M0NcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUVEOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0RTlcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzdEXHVFQ0M0XHVGMzkzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUY3NVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVCOUNcdUYyNTRcdUU3REVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMEEyXHVGMEEzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk1Mlx1RjA0QiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGM0JcdUVBNzJcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjFFRlx1MDAwMFx1RUYzM1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTJGMSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTU0Q1x1MDAwMFx1Rjk3QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVFQkVcdTAwMDBcdUY5OTRcdTAwMDBcdTAwMDBcdUU2NDRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQzNFXHUwMDAwXHVFNEI3XHVGODVDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjg2Q1x1MDAwMFx1RjFCNVx1RUJFMyIrCi0gICAgICAgICJcdTAwMDBcdUVGM0NcdTAwMDBcdUVGNkRcdTAwMDBcdTAwMDBcdUYyRTlcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTREXHUwMDAwXHVFMkI4XHVFRkRCIisKLSAgICAgICAgIlx1RTNBQ1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTg1NyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYwQzkiKwotICAgICAgICAiXHUwMDAwXHVFRjVDXHUwMDAwXHUwMDAwXHUwMDAwXHVFQTQ3XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTY0Q1x1RTRFNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4NkRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFODY2XHUwMDAwXHVFMDQxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTg1OFx1RUFBNlx1MDAwMFx1RjdCM1x1RjQ2Mlx1MDAwMFx1RTA1NCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyNUJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMUY1XHUwMDAwXHUwMDAwXHUwMDAwXHVGOUIwXHVFNUE4XHUwMDAwIisKLSAgICAgICAgIlx1RjNDMVx1MDAwMFx1MDAwMFx1RUM3OVx1RTk1QVx1RjE0NFx1Rjg1MFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4QThcdUUzMzhcdTAwMDBcdTAwMDBcdUU4N0NcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFN0VFIisKLSAgICAgICAgIlx1MDAwMFx1RUI5RFx1MDAwMFx1MDAwMFx1MDAwMFx1RjJFQVx1Rjg2RVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVCNTRcdTAwMDBcdUUyQjlcdTAwMDBcdUU1Q0FcdUU2RTJcdUVDM0YiKwotICAgICAgICAiXHUwMDAwXHVFNkI4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUY1RFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY2NkFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMkEyXHVFQzZBXHVGNjlFXHUwMDAwXHUwMDAwXHVGOEQwXHVFM0FEXHUwMDAwIisKLSAgICAgICAgIlx1RTFFNFx1MDAwMFx1RTNBRVx1RTk3RFx1RUY1RVx1MDAwMFx1RjM5Qlx1RTI0NSIrCi0gICAgICAgICJcdUVFOUVcdTAwMDBcdTAwMDBcdUU2RkJcdUUzNjZcdUU5RjVcdUY2RjFcdTAwMDAiKwotICAgICAgICAiXHVGNjlGXHUwMDAwXHVFOEY3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEVBIisKLSAgICAgICAgIlx1RUZEQ1x1RTdDMVx1MDAwMFx1RjVGMlx1RUI1NVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYwNjRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0MyXHUwMDAwXHVGMDRDIisKLSAgICAgICAgIlx1MDAwMFx1RTQ1NVx1RjhEMVx1RUVDMFx1RjBBNVx1MDAwMFx1RUFGQVx1RUNBMiIrCi0gICAgICAgICJcdUU2QjlcdTAwMDBcdUVGQzNcdTAwMDBcdUVGOUZcdUVGM0ZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNDYzXHVGOEE5XHVFNzM1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNUNCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzNThcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFM0FGXHVFNkUzXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjU2IisKLSAgICAgICAgIlx1MDAwMFx1RTYzMlx1MDAwMFx1RjFGMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNkYzXHUwMDAwXHUwMDAwXHUwMDAwXHVGOTY0XHUwMDAwXHVFODY3XHVFMTZGIisKLSAgICAgICAgIlx1MDAwMFx1RjQ2NFx1MDAwMFx1RTNCMFx1MDAwMFx1RTE3MFx1MDAwMFx1RThGRCIrCi0gICAgICAgICJcdUY0QkZcdTAwMDBcdUYzNjFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGOTRCXHUwMDAwXHVFQzQwXHUwMDAwXHUwMDAwXHVFRTM1XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUM2Qlx1MDAwMFx1MDAwMFx1MDAwMFx1RUFERVx1MDAwMFx1RUI1NyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0OTFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFMTcxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjdBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUVDMlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUyNDZcdTAwMDBcdUY0QzBcdTAwMDBcdUUxRkVcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGOEQyXHUwMDAwXHVGNzlBXHVGNkZCXHUwMDAwXHUwMDAwXHVFRjRGXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUY0N1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYxQjYiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTk0QVx1MDAwMFx1MDAwMFx1RTE0NFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGM0Y3XHUwMDAwXHUwMDAwXHUwMDAwXHVFRjQ4XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTA5OFx1MDAwMFx1RUQzNFx1RjU2Nlx1MDAwMFx1MDAwMFx1MDAwMFx1RUFFNiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVBQTdcdTAwMDBcdUVBRTdcdUVCQzFcdTAwMDAiKwotICAgICAgICAiXHVFRkM0XHUwMDAwXHUwMDAwXHVFOTVCXHVFRkM1XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjJBM1x1RjBBNlx1RTBBM1x1RUNFOVx1MDAwMFx1MDAwMFx1MDAwMFx1RTNGQiIrCi0gICAgICAgICJcdUYyQTRcdTAwMDBcdUYyRUJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzQ0IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTFBM1x1MDAwMFx1MDAwMFx1RUY3NiIrCi0gICAgICAgICJcdTAwMDBcdUYyQTVcdTAwMDBcdUU0Q0NcdUU4N0RcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNkJBXHUwMDAwXHVGNDY1XHVGNUU1XHVFN0VGXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjdCNFx1MDAwMFx1MDAwMFx1RTVENFx1RjlDRlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU4RTNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzRTEiKwotICAgICAgICAiXHVGMTQ2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEZFXHVFNEQ3XHUwMDAwIisKLSAgICAgICAgIlx1RTNCMVx1MDAwMFx1RTBCMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTNCMiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwQjJcdUYzQzIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNTcxXHVGN0I1XHUwMDAwXHUwMDAwXHVFQkMzXHVFQkMyIisKLSAgICAgICAgIlx1MDAwMFx1RjBGN1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBQThcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMENBXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUU0OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY3NkVcdUY3QUFcdUUwOTlcdTAwMDBcdUYxQjdcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNEI4XHVGNDY2XHUwMDAwXHUwMDAwXHVFNTY5XHVGMjU1XHVGNDkyXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTA0Mlx1MDAwMFx1MDAwMFx1RTk0Qlx1MDAwMFx1RjNGOCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYxNDdcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRENBXHUwMDAwXHVGNjUwXHVGOUREXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTU3M1x1RTE3Mlx1MDAwMFx1RjZENFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU2RTVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTRDM1x1MDAwMFx1RTczNlx1MDAwMFx1RjY1MVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU5RjZcdTAwMDBcdUUxQzBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRERDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RURDQlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQkM0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRjQwIisKLSAgICAgICAgIlx1RjU0MFx1RjRFQVx1RTg3RVx1MDAwMFx1RTZCQlx1MDAwMFx1RUM0MVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTZBQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU2OURcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDZGXHUwMDAwXHVFMDY2XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjBBOFx1MDAwMFx1MDAwMFx1MDAwMFx1RThGRVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNjUyXHUwMDAwXHUwMDAwXHVGMkJCXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTU5Rlx1MDAwMFx1MDAwMFx1RUI1OFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVGNDlcdTAwMDBcdUYyQTZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMUE0XHUwMDAwXHUwMDAwXHVFNTk2XHVFOEExXHVFOERDXHVFOEREXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjI2Q1x1MDAwMFx1RTBDQlx1Rjk2NSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyN0JcdTAwMDAiKwotICAgICAgICAiXHVFMUMxXHUwMDAwXHUwMDAwXHVGOEQzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0FCXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY1RDRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU3QTkiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRkREXHVFOENEXHUwMDAwXHUwMDAwXHVFOUNFXHUwMDAwIisKLSAgICAgICAgIlx1RUVDM1x1MDAwMFx1RjE1Q1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY3RUNcdTAwMDBcdTAwMDBcdTAwMDBcdUUwQ0NcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjlFXHVFNTM4XHUwMDAwXHVGMUQzXHVFNzkxIisKLSAgICAgICAgIlx1MDAwMFx1RjQ2N1x1MDAwMFx1RTA5QVx1RTg5MVx1MDAwMFx1MDAwMFx1RTY2NCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU3Q0RcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNzdFXHUwMDAwXHVGNDUxXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUFEM1x1MDAwMFx1MDAwMFx1MDAwMFx1RTg5Mlx1MDAwMFx1RUM3QVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVCOUZcdTAwMDBcdTAwMDBcdUU3OUFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNkFGXHVFODQ2XHUwMDAwXHVFMDY3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0NjhcdTAwMDAiKwotICAgICAgICAiXHVFNzlCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1Rjg2Rlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyRUYiKwotICAgICAgICAiXHVFN0MyXHUwMDAwXHVGMzYyXHUwMDAwXHVFRDYxXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjRCN1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY4NzBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjJFQ1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDNDJcdTAwMDBcdUU1NERcdTAwMDBcdTAwMDBcdUU3Q0VcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTcyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU1MzlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUxQzJcdUVFREEiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjQ2OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU3QUFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzRFXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTkzRFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDN0JcdUU2OUVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMDlCXHUwMDAwXHUwMDAwXHVFNTZBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjU2N1x1RTEzMVx1MDAwMFx1MDAwMFx1RTJCQSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjVCOCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU3QzNcdUUzNzhcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQ0M1XHVGMEY4XHUwMDAwXHVGNDQxXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTJCQlx1MDAwMFx1MDAwMFx1MDAwMFx1RTRBRFx1RUY3MVx1RTI3QyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVCNDRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUE3M1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFOUY3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0NDJcdUY0RjZcdUY2NkIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNkZFXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjc2Rlx1MDAwMFx1RjZGMlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzM5XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUU2QSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNUE2XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU2QkNcdUUxNzNcdTAwMDBcdTAwMDBcdUVFNkIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTlERFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUzQjNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYyRUQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjZFXHVFRDk2XHVFQkVGXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTlGOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUY1RiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFMDc1XHUwMDAwXHUwMDAwXHUwMDAwXHVFOTMxIisKLSAgICAgICAgIlx1MDAwMFx1RUI0NVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGOTNDXHVGOTNEXHVFNzM3XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjFCOFx1MDAwMFx1MDAwMFx1MDAwMFx1RThCNlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU2OTJcdUY0QUZcdTAwMDBcdTAwMDBcdUUxQTVcdTAwMDAiKwotICAgICAgICAiXHVFODkzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNzM4XHUwMDAwXHUwMDAwXHUwMDAwXHVFMTc0XHUwMDAwXHUwMDAwXHVFM0I0IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTA2OFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU4OTRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNUE3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjVBOFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFMzZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU1RUNcdUU1RjhcdUU4OTVcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUNDNlx1MDAwMFx1MDAwMFx1MDAwMFx1RUE3NFx1MDAwMCIrCi0gICAgICAgICJcdUVBNzVcdUUzQjVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzQjYiKwotICAgICAgICAiXHVFM0I3XHVGNDQzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUZERVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjM2M1x1RjQ0NCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYzNjRcdUUwRTRcdUY4RDRcdUY1RTZcdUVDRUFcdTAwMDAiKwotICAgICAgICAiXHVFQTc2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQUQ0XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1Rjc5Qlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjMzRVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFM0I4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjZGIisKLSAgICAgICAgIlx1MDAwMFx1RTM2N1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5MzFcdUYyRUVcdUU5NjgiKwotICAgICAgICAiXHUwMDAwXHVFRkRGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVERERcdUY5RkIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQjU5XHUwMDAwXHUwMDAwXHUwMDAwXHVFNjU5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTUzQVx1MDAwMFx1RURDQ1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVGRTBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzNjhcdUY5MzJcdUU1NEUiKwotICAgICAgICAiXHVFQzQzXHVFQTc3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTk0Q1x1RTQ0Nlx1RjVENVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUyMzFcdUY1QTlcdTAwMDBcdTAwMDBcdUU5RjlcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFOUZBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzY1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY2Rlx1MDAwMFx1RjQ2QVx1RUQ3QiIrCi0gICAgICAgICJcdTAwMDBcdUY0OTNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjE0OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY5RkNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCQUFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMDY5XHUwMDAwXHUwMDAwXHVGMkVGXHUwMDAwXHVGNUFBXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjE5Qlx1MDAwMFx1MDAwMFx1RjczRCIrCi0gICAgICAgICJcdTAwMDBcdUY0NTJcdUY2NTNcdTAwMDBcdUU2RDJcdTAwMDBcdTAwMDBcdUY3QTIiKwotICAgICAgICAiXHVGMzY2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjM5Q1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY2NzBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGRjNcdUY0NTMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNTNCXHVFMDQzXHVFMUE2XHUwMDAwXHVFMUMzIisKLSAgICAgICAgIlx1RTFEQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTdDRlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY2NTRcdTAwMDBcdTAwMDBcdTAwMDBcdUYyNkRcdUVFQzRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQzQ0IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVBRTJcdUVFREJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRjQxXHUwMDAwXHVGOTNFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RURDRFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjg3Qlx1MDAwMFx1RTJCQ1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUyRTJcdUUxRjZcdTAwMDBcdTAwMDBcdUYyRjBcdTAwMDBcdUY1NEUiKwotICAgICAgICAiXHUwMDAwXHVFNTVEXHUwMDAwXHUwMDAwXHVGNEI4XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUZBMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY0OTRcdUY0RUJcdTAwMDBcdUYzNjdcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMkQ3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMkRGIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVGNTBcdUVGNTFcdTAwMDBcdTAwMDBcdTAwMDBcdUUyRTNcdUVGQTIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTMzQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0QzFcdUUzM0JcdTAwMDBcdUU1NzQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMkJDXHVFNzMxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTdERiIrCi0gICAgICAgICJcdTAwMDBcdUY0RDdcdTAwMDBcdTAwMDBcdTAwMDBcdUU5NERcdTAwMDBcdUUxNzUiKwotICAgICAgICAiXHVGMUYxXHUwMDAwXHUwMDAwXHVGM0UyXHUwMDAwXHVFNTZCXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUM0NVx1MDAwMFx1MDAwMFx1RTA3Nlx1MDAwMFx1RTRBRSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUxNzZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGM0QzXHVGNUU3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMDZBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY4RUUiKwotICAgICAgICAiXHUwMDAwXHVFQkM1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUFFOVx1MDAwMFx1RjI2RVx1MDAwMFx1MDAwMFx1RjZDMlx1MDAwMCIrCi0gICAgICAgICJcdUU3MzJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU5QUNcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzNGXHVFNjREXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVCQUJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0I2XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTU5N1x1MDAwMFx1RTM1OVx1RjJBN1x1RUM3Q1x1MDAwMFx1RThFQSIrCi0gICAgICAgICJcdUUyNUNcdUY1RThcdUY2RDVcdTAwMDBcdUU0Q0RcdTAwMDBcdUY0RkVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTM0NVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCQTBcdTAwMDBcdUVBRkJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRTZEXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUYzNFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwQ0QiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMkE4XHUwMDAwXHUwMDAwXHUwMDAwXHVGMjQ0IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTg2OFx1RTNCOVx1MDAwMFx1RUFBOSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY0QjBcdTAwMDBcdTAwMDBcdUUxNTRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMjQ3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjJBOVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVBRDVcdTAwMDBcdTAwMDBcdUYxRDdcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMjU2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjJCRFx1Rjk2Nlx1MDAwMFx1MDAwMFx1RThGNFx1MDAwMFx1RjJBQVx1Rjc0OSIrCi0gICAgICAgICJcdTAwMDBcdUY1RTlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQ0Q5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVCQzZcdTAwMDBcdTAwMDBcdTAwMDBcdUU1NEZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQTc4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzdBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY0QzJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNEFGXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTA2Qlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk2NyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYxRDhcdUVCQzdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjU2OFx1RTY0M1x1RTlBRCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU1QkVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGM0MzXHVGMjZGXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNjdCXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTY5XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTZFNlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU4NDdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTlGQlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU5Q0ZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNzMzXHUwMDAwXHUwMDAwXHVFODY5XHUwMDAwXHVGMzY4IisKLSAgICAgICAgIlx1RjJDNFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUJEOCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzRDRcdTAwMDBcdUYxRjIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNURCXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTVEQ1x1RjRDNFx1RTBEN1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDNDZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYyRjFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjhENVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU0RDhcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOUQwXHVGMzY5IisKLSAgICAgICAgIlx1RTBCM1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTVERCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTFBN1x1MDAwMFx1MDAwMFx1RTMzQ1x1MDAwMCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaW5uZXJJbmRleDQ9Ci0gICAgICAgICJcdUUzQkFcdTAwMDBcdUYzQzRcdTAwMDBcdUVEQjNcdUY4RjVcdUVGRTFcdUY5RTAiKwotICAgICAgICAiXHVGOTRDXHUwMDAwXHVFODMyXHVFODMzXHUwMDAwXHVFNDMxXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTQ5MVx1MDAwMFx1MDAwMFx1MDAwMFx1RUM3RFx1MDAwMFx1MDAwMFx1RUE3OSIrCi0gICAgICAgICJcdUUyNkNcdUY0NDVcdUUzNzRcdUU5RDFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQkM4XHVFOEI3XHVFQUUzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjFCOVx1RjNDNVx1MDAwMFx1RjRDRlx1RTZBQiIrCi0gICAgICAgICJcdUVCQUNcdTAwMDBcdTAwMDBcdUVDRUJcdTAwMDBcdUYyNTdcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQkM5XHVFMDlDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjM5RFx1Rjg3MVx1RjM2QVx1RTE3N1x1RTg5Nlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMTRGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTI3RFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU1QTlcdUY4NzJcdTAwMDBcdTAwMDBcdTAwMDBcdUUzNzVcdTAwMDAiKwotICAgICAgICAiXHVGMEQ2XHUwMDAwXHVGMTZGXHUwMDAwXHUwMDAwXHUwMDAwXHVFQUZDXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjZENlx1RUE3QVx1RTBCNFx1MDAwMFx1MDAwMFx1RjJCRVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUxNDVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyQkQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjJGMlx1RUM0NyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUxNzhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzlFXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTY3MFx1MDAwMFx1RjNDNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDNDhcdUYwQUJcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMEI1XHVFNzYxXHUwMDAwXHVGNTVFXHVGNEY3XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTZDNlx1MDAwMFx1RTNCQlx1RjZBQVx1MDAwMFx1RjFDQVx1RTZEM1x1RTc5QyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY2NTUiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFM0NDXHVFOUZDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUFGRFx1MDAwMCIrCi0gICAgICAgICJcdUY3RTVcdTAwMDBcdUVCNUFcdTAwMDBcdTAwMDBcdUY0OUZcdUU0QjBcdTAwMDAiKwotICAgICAgICAiXHVGNTk1XHVFODU5XHUwMDAwXHVFRTZFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1Rjc0QVx1RUY2MFx1MDAwMFx1MDAwMFx1RTc5RFx1MDAwMFx1MDAwMFx1RjA2NSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2MzNcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNjU2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY0NkJcdUVEOUVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRjQyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTg2QVx1MDAwMFx1RjQ2Q1x1RjhENlx1RUZCMiIrCi0gICAgICAgICJcdTAwMDBcdUYyM0RcdTAwMDBcdUY4NzNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFOTdFXHUwMDAwXHUwMDAwXHVGNUVBXHVFRTcwIisKLSAgICAgICAgIlx1MDAwMFx1RjM5Rlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTZBQyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1QzVcdUYyNzBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFOEU1XHUwMDAwXHVFOURFXHUwMDAwXHUwMDAwXHVFN0YwXHVFRkEzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYzRjlcdTAwMDBcdUY0NTRcdUVCNUJcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRkE0XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUM0OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDQjFcdUY5N0JcdUUxQThcdTAwMDBcdUUxNDZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMzZCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUU0QVx1MDAwMFx1MDAwMFx1RTFBOVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY0QzNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQkQ5XHUwMDAwXHUwMDAwXHVGMkFCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUVDNVx1MDAwMFx1MDAwMFx1RUI3OVx1MDAwMCIrCi0gICAgICAgICJcdUY0QzVcdTAwMDBcdTAwMDBcdUU1NTBcdUU1QkZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOUFFXHUwMDAwIisKLSAgICAgICAgIlx1RjdGQ1x1MDAwMFx1RTE1MFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFREEyXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTI0OFx1MDAwMFx1MDAwMFx1MDAwMFx1RTc2Mlx1RjdENlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjNBQVx1RTI2MVx1MDAwMFx1MDAwMFx1RjY1N1x1MDAwMCIrCi0gICAgICAgICJcdUU4RUJcdTAwMDBcdUVBRkVcdTAwMDBcdTAwMDBcdUU3NzFcdTAwMDBcdUY2RjMiKwotICAgICAgICAiXHUwMDAwXHVFNkU3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTVBMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUzQkNcdTAwMDBcdUVEQ0ZcdTAwMDBcdUUwQjZcdTAwMDBcdUU4NDhcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUM0XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTY0RVx1MDAwMFx1MDAwMFx1MDAwMFx1RUM0QVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyRDhcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQjVDXHVGMEY5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjlGRFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU2RThcdUUwRDhcdTAwMDBcdTAwMDBcdTAwMDBcdUVGRTJcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRjRBXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0M3XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjE1RFx1MDAwMFx1RjE1RVx1MDAwMFx1RTY0Rlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVDQTdcdTAwMDBcdUVBRDZcdUY5RThcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMjcxIisKLSAgICAgICAgIlx1RjYzOFx1RTlGRFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY3NEJcdTAwMDBcdUVGNjFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGN0Q3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTI3RVx1MDAwMFx1MDAwMFx1RjE1Rlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVGQTVcdUU2NjVcdTAwMDBcdUUxQzVcdTAwMDBcdUYxQkFcdUUzQkRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMkJFXHUwMDAwXHUwMDAwXHVGMTRCXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTQ0MVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTE3OVx1MDAwMFx1RTdDNCIrCi0gICAgICAgICJcdUVGRkNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTNCRVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYxNENcdTAwMDBcdTAwMDBcdUVEQURcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNkIwXHUwMDAwXHVFMTdBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTRDNFx1MDAwMFx1MDAwMFx1RTY1MFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU2OUZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQkExXHUwMDAwIisKLSAgICAgICAgIlx1RUE0RFx1MDAwMFx1RjYzOVx1MDAwMFx1MDAwMFx1MDAwMFx1RTgzNFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjM0IisKLSAgICAgICAgIlx1RjVDNlx1MDAwMFx1RUJBMlx1RUZDNlx1MDAwMFx1MDAwMFx1MDAwMFx1RjQ1NSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1NzlcdUU2N0NcdUYwRDMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMTREXHVFQzZDXHVFQTdCXHVGMzZDIisKLSAgICAgICAgIlx1MDAwMFx1RjBCRlx1MDAwMFx1RTZDRVx1RTNCRlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1QUJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0ZEXHUwMDAwXHVFMDZDXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTFDNlx1RjQ0Nlx1MDAwMFx1MDAwMFx1RTlGRVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUxNDdcdUU4QjhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzNzkiKwotICAgICAgICAiXHUwMDAwXHVFMjZEXHVGMEMwXHUwMDAwXHVGOUEyXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjc1Qlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYwNjZcdUYzQjBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOENFXHUwMDAwXHVGNkMzXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU4Q0ZcdUUwQTRcdTAwMDBcdTAwMDBcdUY3NzBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGOEQ3XHUwMDAwXHUwMDAwXHVGMENBXHVFQjMxXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUyNURcdTAwMDBcdTAwMDBcdUU1NkNcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGOUQ4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNDk4XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjQ0N1x1MDAwMFx1MDAwMFx1Rjg5OFx1RjYzQVx1Rjg5OSIrCi0gICAgICAgICJcdUU3NzZcdTAwMDBcdUY1NDFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUY2Mlx1MDAwMFx1RTA1NVx1RTE3Qlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVDN0VcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQzRCXHUwMDAwXHVGNkFEXHUwMDAwXHUwMDAwXHUwMDAwXHVGNzcxIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY0RUNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBMzFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUQ5Rlx1MDAwMFx1MDAwMFx1RUNFQ1x1MDAwMCIrCi0gICAgICAgICJcdUU5QUZcdUU5QjBcdTAwMDBcdTAwMDBcdUUwQjdcdUVGNjNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUJBM1x1RTQ3MFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYzQTBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRkE2XHVFMEYyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjFGM1x1RTk2OVx1RUI1RFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjZEQSIrCi0gICAgICAgICJcdUU4QjlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMTNFXHUwMDAwXHVFODZCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUM3IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU5QjFcdTAwMDBcdUU3M0ZcdUVDQTNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMjkxXHUwMDAwXHUwMDAwXHVGNDk1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1Rjc0M1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVCNUVcdTAwMDBcdUY1RkRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMEVDXHUwMDAwXHUwMDAwXHVFNEM1XHVGOTdDXHVFNDZCIisKLSAgICAgICAgIlx1RTU3Qlx1MDAwMFx1RUEzMlx1MDAwMFx1MDAwMFx1MDAwMFx1RURFNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzNDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTVDNFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjFGNCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVDRURcdTAwMDBcdUVGNTJcdTAwMDBcdUYxRjUiKwotICAgICAgICAiXHVFNkZDXHUwMDAwXHVGMUJCXHUwMDAwXHUwMDAwXHVGNjNCXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjQ0OFx1RjY1OFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU0RTZcdUY0NkRcdUUyQkZcdTAwMDBcdUYwQUNcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMkMwXHUwMDAwXHVFRTM4IisKLSAgICAgICAgIlx1RjlFOVx1MDAwMFx1RTJDMVx1MDAwMFx1RUI2Rlx1RUE3Q1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVCMzJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTRGXHVFQzkxXHUwMDAwXHVFN0YxXHVGM0M3IisKLSAgICAgICAgIlx1MDAwMFx1RTBCOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY3RkVcdUU4QkFcdUU4OTdcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNjdDXHVFODZDXHVGODc0IisKLSAgICAgICAgIlx1MDAwMFx1RUI1Rlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU5QjJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFMzlcdTAwMDBcdUYyRjMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY0RURcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMEZBXHUwMDAwXHVGN0U2XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTA2RFx1RTVERSIrCi0gICAgICAgICJcdTAwMDBcdUUwNkVcdUVBRTRcdTAwMDBcdTAwMDBcdTAwMDBcdUVFOUZcdTAwMDAiKwotICAgICAgICAiXHVGNUFDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDk3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVGRTNcdTAwMDBcdUYxQ0JcdUUyRTRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNzYzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTlCM1x1RTU3Q1x1MDAwMFx1MDAwMFx1RjQ0OVx1MDAwMFx1RUFCNyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUwQ0VcdUY4RDhcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMzY5XHUwMDAwXHUwMDAwXHVFOUQyXHVGNkY0XHVFRURDXHVFRDM1IisKLSAgICAgICAgIlx1MDAwMFx1RjkzM1x1MDAwMFx1RThCQlx1MDAwMFx1MDAwMFx1MDAwMFx1RjQ0QSIrCi0gICAgICAgICJcdUVGRkRcdUUzNUFcdTAwMDBcdUY1RDZcdUU3QzVcdUVENDRcdTAwMDBcdUYxQTciKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYwNERcdUVFQTBcdTAwMDBcdUY2QzRcdUY1QURcdTAwMDBcdUU3RTAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFMDQ0XHUwMDAwXHUwMDAwXHVGNzcyXHVFMkMyIisKLSAgICAgICAgIlx1MDAwMFx1RjE0RVx1MDAwMFx1MDAwMFx1MDAwMFx1RURCNFx1RTFDOFx1RjI1OCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRUM4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTFDOVx1RjdCN1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYzRThcdUU3RjJcdUU4RjVcdUUwNDVcdUU3QzZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNzU5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTdBQiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjFCQ1x1MDAwMFx1MDAwMFx1RTc2NFx1MDAwMFx1MDAwMFx1MDAwMFx1RTk2QSIrCi0gICAgICAgICJcdTAwMDBcdUVDNENcdTAwMDBcdTAwMDBcdUY5N0RcdUYxNzBcdUU0QTBcdTAwMDAiKwotICAgICAgICAiXHVFRkM3XHVFRTNBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUM5Mlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjg0QiIrCi0gICAgICAgICJcdTAwMDBcdUY1QUVcdUY4QUFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYxOUQiKwotICAgICAgICAiXHUwMDAwXHVGMTRGXHVGOTY4XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTU3NVx1MDAwMFx1MDAwMFx1MDAwMFx1RjdDMyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYyNzJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTZFOVx1RjFGNlx1MDAwMFx1MDAwMFx1MDAwMFx1RUE3RFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUxN0NcdTAwMDAiKwotICAgICAgICAiXHVFQ0VFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRjY0XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjg5QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU5QjRcdUVENDVcdUU3NDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTc2NVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY1N0FcdTAwMDBcdTAwMDBcdTAwMDBcdUUyNDlcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNjcxXHVFMkQyXHUwMDAwXHVFMzQ2XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTIzMlx1MDAwMFx1MDAwMFx1RjRFRVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY0RjhcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTk1Q1x1MDAwMFx1RTM1Qlx1MDAwMFx1MDAwMFx1MDAwMFx1RjkzNCIrCi0gICAgICAgICJcdUUxQ0FcdUU2RDRcdUVBMzNcdTAwMDBcdUVENzBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMjU5XHUwMDAwXHUwMDAwXHUwMDAwXHVFQzZEXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjVGRVx1RTUzQ1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU1RDFcdTAwMDBcdUU3OTJcdUY3NTNcdUYwNjdcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNUQ3XHUwMDAwXHUwMDAwXHVFNzRGXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjlDMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYwQURcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1QUFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUVBOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYyNUEiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFMDc3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1Rjc3M1x1MDAwMFx1RTU2RFx1MDAwMFx1MDAwMFx1RjA2OFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY4RDlcdUYxRjdcdTAwMDBcdTAwMDBcdUVEQjUiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzNEXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjNGMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUM0RFx1MDAwMFx1MDAwMFx1MDAwMFx1RUNDOFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU3RDVcdTAwMDBcdTAwMDBcdUVBQUFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFOEJDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY3NzRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGM0ZBXHUwMDAwXHUwMDAwXHVFREI2XHVGNEVGXHUwMDAwXHUwMDAwXHVGOERBIisKLSAgICAgICAgIlx1RUJFMFx1MDAwMFx1RTdBQ1x1MDAwMFx1RjVFQlx1MDAwMFx1RUI0Nlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVGQzhcdTAwMDBcdUUwQ0ZcdTAwMDBcdUVDQzlcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQTdFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUM0RVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOTkxXHUwMDAwXHVFNjM1XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUM5M1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2QTBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU3QTFcdTAwMDBcdUU3NTBcdUU5NkJcdTAwMDBcdTAwMDBcdUYxQkQiKwotICAgICAgICAiXHVFQUI4XHUwMDAwXHVGMDM1XHUwMDAwXHUwMDAwXHUwMDAwXHVFNkFEXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjRGOVx1MDAwMFx1RjFGOFx1MDAwMFx1RjVDN1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCQ0FcdUYwRTNcdTAwMDBcdUY0NkUiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjc1Q1x1MDAwMFx1RjA2OSIrCi0gICAgICAgICJcdTAwMDBcdUU0QzZcdTAwMDBcdUU4RTZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNUFGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMjkyXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUZGRVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4QjZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFQzk0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTJGMlx1RjZCOVx1RTdGM1x1MDAwMFx1MDAwMFx1RUJDQlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTg2RFx1MDAwMFx1MDAwMFx1RTg0OSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYwRkIiKwotICAgICAgICAiXHUwMDAwXHVFMEI5XHUwMDAwXHUwMDAwXHVGMUY5XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUI3MFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1NTBcdTAwMDAiKwotICAgICAgICAiXHVGOUJDXHVFQUIxXHVFQ0VGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjMzIisKLSAgICAgICAgIlx1RjlCOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYzNDFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMUNCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjFCRVx1MDAwMFx1MDAwMFx1MDAwMFx1RTVDMFx1RUNGMFx1RjFGQSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGRTRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNUVEXHVFRUREXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTU5OFx1RURCN1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU4RTdcdUVDNEZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMjVCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTZGNFx1RjM2RFx1MDAwMFx1MDAwMFx1MDAwMFx1RTIzQiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVFREVcdTAwMDBcdTAwMDBcdTAwMDBcdUU2NjZcdUVCQ0MiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRjQzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RURFRVx1RTkzMiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVCNjBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTVCNVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNUExIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY4REJcdTAwMDAiKwotICAgICAgICAiXHVGN0NCXHUwMDAwXHUwMDAwXHUwMDAwXHVFMEYzXHVGNTM1XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1Rjg1OFx1RTY2N1x1MDAwMFx1RUZFNVx1RjhEQyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5RDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4RjZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTgzNVx1MDAwMFx1RThCRFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYxNzJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTFGN1x1RjM2RVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY2NTlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBOTEiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNEIxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjk3RVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVGNTNcdTAwMDBcdUYzQzhcdTAwMDBcdTAwMDBcdTAwMDBcdUUyOTMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0VEXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjQ5Nlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDQ2XHUwMDAwIisKLSAgICAgICAgIlx1RjVCOVx1MDAwMFx1RTk5Mlx1RUNGMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVGMzVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjQ0Qlx1MDAwMFx1RUEzNFx1MDAwMFx1RTg1Q1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTA3OVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDREFcdTAwMDBcdUY5NjkiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMDZBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjdDNFx1MDAwMCIrCi0gICAgICAgICJcdUVDQTRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEREXHUwMDAwXHVGMkNBXHUwMDAwIisKLSAgICAgICAgIlx1RUY1NFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU1Q0NcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMEQ3XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU3QUQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGOEFCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU0RDlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNUEyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY2RVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU4OThcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjYxXHUwMDAwXHUwMDAwXHVFRkE4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjVGOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4M0ZcdTAwMDBcdUYwRkNcdTAwMDBcdTAwMDBcdUVCN0FcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0IyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNUM1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjNFM1x1RTVFRVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMUNDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMUQ5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTc1MVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY4N0NcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzRUJcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGODRDXHVFRTcyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjg3NVx1RUM5Q1x1MDAwMFx1MDAwMFx1MDAwMFx1RTA0NiIrCi0gICAgICAgICJcdTAwMDBcdUVENDdcdTAwMDBcdUYwNkJcdTAwMDBcdUY1RkFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGOEFDXHVFMkMzXHVGMEZEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1Rjc5Q1x1MDAwMFx1MDAwMFx1RUFCOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVCRjFcdTAwMDBcdUU0MzRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1RkIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzZBXHVFMzZCIisKLSAgICAgICAgIlx1MDAwMFx1RjA0RVx1RTdCMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUwNDdcdTAwMDBcdTAwMDBcdUU0RTdcdTAwMDBcdUY3NzVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNEIyXHUwMDAwXHUwMDAwXHUwMDAwXHVFQzUwXHVGNDZGIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTFFNVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0FDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTFDRFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMjNFXHVFNjNFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTZFQSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVFRTBcdUYwQUVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFMkQ5XHUwMDAwXHUwMDAwXHVFOTVEXHVGMUZCXHUwMDAwXHVFQTkyIisKLSAgICAgICAgIlx1MDAwMFx1RTZFQlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVBMzVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFQUQ3XHVFOEQwXHVFOEQxXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTVBM1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjM0Mlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU5NkMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTA3OFx1MDAwMFx1Rjc3Nlx1RTk1RVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYwNkNcdUU4RDJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRkIzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjZEQlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVDQThcdTAwMDAiKwotICAgICAgICAiXHVFNkFFXHUwMDAwXHUwMDAwXHVFQjcxXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTBCQVx1MDAwMFx1MDAwMFx1RUREMVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTM2QyIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1QzFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNzVBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUNBOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCMzQiKwotICAgICAgICAiXHUwMDAwXHVFRkE5XHUwMDAwXHVFNEM3XHUwMDAwXHUwMDAwXHVFOTZEXHVGNzNFIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTE0OFx1MDAwMFx1MDAwMFx1MDAwMFx1RTMzRSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU3OTRcdTAwMDBcdTAwMDBcdUVDQ0FcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTEzRlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU1M0RcdUY2NjFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFMzVDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTA1Nlx1MDAwMFx1MDAwMFx1RTVDMlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUyNEFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTA1N1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGODQwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBRDhcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNUJBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RURFQlx1MDAwMFx1RjJGNFx1RTlCNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUxQUFcdTAwMDBcdUVDRjJcdTAwMDBcdUY4RjdcdTAwMDBcdUY2RDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGOUJBXHUwMDAwXHUwMDAwXHVGOUUxXHVGNkEwIisKLSAgICAgICAgIlx1RTNDMFx1MDAwMFx1MDAwMFx1RUY1NVx1MDAwMFx1RUQ0OFx1MDAwMFx1RUJFOCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUxNTFcdTAwMDBcdUU0N0RcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFOEJFXHUwMDAwXHUwMDAwXHVFQjcyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1Rjg1OVx1MDAwMFx1MDAwMFx1RUJDRFx1MDAwMFx1RTA0OFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY0NzBcdUYzQzlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVBOTNcdTAwMDBcdTAwMDBcdTAwMDBcdUYzNkZcdUY3NTRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMjVDXHUwMDAwXHUwMDAwXHVFQTk0XHUwMDAwIisKLSAgICAgICAgIlx1RUVDOVx1MDAwMFx1RUM5NVx1RUVFMVx1MDAwMFx1MDAwMFx1RUNDQlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDQ0NcdTAwMDBcdTAwMDBcdTAwMDBcdUUyRjhcdUYyQUNcdTAwMDAiKwotICAgICAgICAiXHVGOUZFXHVGOTM1XHVGODQxXHVFQUQ5XHUwMDAwXHVFQjYyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjU2QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzQ0FcdTAwMDBcdUUyMzMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNDRDXHVGMTczXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUIzNVx1MDAwMFx1RjZBQlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYwQUZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVEREVcdTAwMDAiKwotICAgICAgICAiXHVFQkE0XHVFMUFCXHUwMDAwXHVFN0Y0XHVFRjM2XHVFMUNFXHVFQkU5XHUwMDAwIisKLSAgICAgICAgIlx1Rjk5MVx1MDAwMFx1RUI3M1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVDNTFcdTAwMDBcdUUyMzRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQTM2XHUwMDAwXHUwMDAwXHVGMEZFXHUwMDAwXHVGMEREXHVGMzcwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjU2Qlx1MDAwMFx1RUM5Nlx1MDAwMFx1MDAwMFx1RTRDOCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY1N0JcdTAwMDBcdUYyNDVcdTAwMDBcdUY1RDgiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNURGXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjc1XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjBCMFx1RjU3M1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVDQ0RcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1OTZcdUY4NDIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMkY1XHVFMDZGXHUwMDAwXHVGMEIxXHVGMUJGXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjlDOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUQzNlx1RjdBNCIrCi0gICAgICAgICJcdUYzNDNcdTAwMDBcdUVERUNcdTAwMDBcdTAwMDBcdTAwMDBcdUUzRTdcdTAwMDAiKwotICAgICAgICAiXHVFN0M3XHVFRDY3XHVGMDZEXHUwMDAwXHVFNTk5XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTg0QVx1MDAwMCIrCi0gICAgICAgICJcdUU4NURcdTAwMDBcdTAwMDBcdTAwMDBcdUY3Q0NcdTAwMDBcdUVCREFcdUU4QkYiKwotICAgICAgICAiXHUwMDAwXHVFMTU1XHVGMTYwXHVFMEJCXHUwMDAwXHVFQTk1XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUZBQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU3QzhcdTAwMDBcdTAwMDBcdUYyNzNcdUU2QkRcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFMkM0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTM1RFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY5MzZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGM0ZCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOUQyXHVFM0MxIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVDREJcdTAwMDBcdUU0QzlcdTAwMDBcdUU5NUZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMTdEXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUEzN1x1MDAwMFx1MDAwMFx1RUU0QiIrCi0gICAgICAgICJcdUYxMzFcdTAwMDBcdTAwMDBcdTAwMDBcdUUxNDlcdTAwMDBcdTAwMDBcdUY4REUiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRUUyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTU1MVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU5MzhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQzUyXHUwMDAwXHVGNEQ4XHVFREQzXHUwMDAwXHUwMDAwXHVGNEQ5XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjRDNlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUxREIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUFDIisKLSAgICAgICAgIlx1MDAwMFx1Rjk1M1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTU3N1x1MDAwMCIrCi0gICAgICAgICJcdUUzQzJcdTAwMDBcdUY3QTVcdTAwMDBcdUVGNjVcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0NFXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTU1QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVBREFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGOERGXHVFRUUzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY3OURcdUVDQ0ZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNUIwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTc3N1x1MDAwMFx1RTdDOVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNzNGXHVGMkY2XHUwMDAwIisKLSAgICAgICAgIlx1RTlCNlx1RjIzRlx1RTFGOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUE0OCIrCi0gICAgICAgICJcdUY5MzdcdUY2RkNcdUY2QjFcdUUyNEJcdUY1MzFcdTAwMDBcdTAwMDBcdUYyNUQiKwotICAgICAgICAiXHVFQkFFXHUwMDAwXHUwMDAwXHVGMTUzXHVFMkZFXHUwMDAwXHVGNzRGXHVFNzcyIisKLSAgICAgICAgIlx1RTRFOFx1MDAwMFx1MDAwMFx1RUEzOFx1RjU3NFx1RjE1Mlx1MDAwMFx1RTdGNSIrCi0gICAgICAgICJcdUY3QzVcdUU5RDNcdUU2OTNcdUYxOUVcdUY5OTJcdTAwMDBcdTAwMDBcdUYxQzAiKwotICAgICAgICAiXHVFMDQ5XHUwMDAwXHVGMjc0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjQ3MVx1MDAwMFx1RUE0OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU2OTRcdTAwMDBcdUVBOTZcdTAwMDBcdUVBREJcdTAwMDAiKwotICAgICAgICAiXHVFOEQzXHUwMDAwXHVGODc3XHVFNzczXHVGNTUxXHUwMDAwXHVFOUI3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjQ5N1x1MDAwMFx1MDAwMFx1RTUzRVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2OTVcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFOUI4XHVFMkM1XHVFQURGXHUwMDAwXHUwMDAwIjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBpbm5lckluZGV4NT0KLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjQ0RVx1RjYzMVx1MDAwMFx1RjBDQiIrCi0gICAgICAgICJcdUYzRkNcdTAwMDBcdUY0QzdcdTAwMDBcdTAwMDBcdUVCN0JcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMUZDXHUwMDAwXHUwMDAwXHVFQkRCXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjI3NVx1MDAwMFx1RUE5N1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY4NjNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGM0NCXHUwMDAwXHUwMDAwXHVFMzNGXHVFOUI5XHUwMDAwXHUwMDAwXHVFM0MzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1QjFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGMDU2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYzNzFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNjNDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjVEOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYzN0JcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFOUJBXHUwMDAwXHUwMDAwXHUwMDAwXHVGNDRGXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjZDNVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU4QTJcdUY0OThcdTAwMDBcdTAwMDBcdUUwNEEiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjZGNVx1MDAwMFx1RTBFNVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYyNzZcdTAwMDBcdUVCNjNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMjM1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjY4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTUzRlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUZDOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTRDRSIrCi0gICAgICAgICJcdUY1NTJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMEU2XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYzQTFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMEIyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGM0EyXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYwQjNcdTAwMDBcdUYzNDRcdTAwMDBcdTAwMDBcdUUwRjQiKwotICAgICAgICAiXHVFNTQwXHVGNEIyXHVGOEI3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY1RUNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYyNzciKwotICAgICAgICAiXHVGNTQyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1RURcdTAwMDBcdUUyRjNcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjM3Mlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjI1RSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYzQ0NcdTAwMDBcdTAwMDBcdUVEQjhcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNkY1XHVFQ0YzXHVFMkU1XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMkM2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjRCM1x1RUQ2OFx1RTJGOVx1RTJEQVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY4NURcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRTczIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY0NzJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjVFRVx1MDAwMFx1MDAwMFx1RTA0Qlx1MDAwMFx1MDAwMFx1RUNEQ1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUyOTRcdTAwMDBcdUU2NjlcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMjQwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjU3NVx1RTc1Mlx1RTk2MFx1RTE3RVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU1RTBcdUY2NUFcdUY5Q0FcdUU3NjZcdUY1NUYiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjM2XHVFOTRFIisKLSAgICAgICAgIlx1MDAwMFx1RThENFx1RTZDN1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjRBMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYzQ0RcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQzUzXHVFOTZFXHUwMDAwXHVFOTZGXHUwMDAwXHUwMDAwXHVGMkFEXHVFRTNCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjdERFx1RjA0Rlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYyQUVcdTAwMDBcdTAwMDBcdTAwMDBcdUY1NjBcdUUyOTVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUUzQ1x1MDAwMFx1RTI2RSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU1RjlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFQ0Y0XHVFMUQwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTVCOFx1MDAwMFx1MDAwMFx1RjZGRFx1MDAwMCIrCi0gICAgICAgICJcdUU5MzlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBOThcdTAwMDBcdUU5M0EiKwotICAgICAgICAiXHVGNDczXHVFRkI0XHVFNDZDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVGRTZcdTAwMDBcdTAwMDBcdUVDRjZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRUNBXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTM1RVx1MDAwMFx1MDAwMFx1RTg5OVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMDRDXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjI3OFx1RTg2RVx1MDAwMFx1RjQ5OVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVDOURcdTAwMDBcdUUxMzZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU4NEIiKwotICAgICAgICAiXHUwMDAwXHVGMjc5XHUwMDAwXHUwMDAwXHUwMDAwXHVGNURBXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjZEQ1x1RUJFQVx1RTI1MVx1RTU0MVx1MDAwMFx1RjlCMVx1RUU0RFx1MDAwMCIrCi0gICAgICAgICJcdUY4QURcdTAwMDBcdTAwMDBcdUY3NzdcdTAwMDBcdUVCQ0VcdTAwMDBcdUY2RTIiKwotICAgICAgICAiXHVGNUVGXHVFMkM3XHUwMDAwXHUwMDAwXHVFNTQyXHVFMTkxXHUwMDAwXHVFNTc4IisKLSAgICAgICAgIlx1MDAwMFx1RjI1Rlx1RjZEN1x1MDAwMFx1MDAwMFx1RUIzNlx1RTY1MVx1RUJEQyIrCi0gICAgICAgICJcdUYzNzNcdUYzRTRcdUU5OTNcdUU2MzdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTk3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjNDRVx1RjQ3NFx1MDAwMFx1MDAwMFx1RTM0MFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYxOTFcdTAwMDBcdTAwMDBcdTAwMDBcdUY3QkFcdTAwMDBcdUYwQjVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNTdEXHVFQzU0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRkU3IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjBCNFx1RjAzMVx1MDAwMFx1Rjc0Q1x1RTIzNlx1MDAwMCIrCi0gICAgICAgICJcdUY3QzZcdUY5NkFcdTAwMDBcdUU1NDNcdUU0QjlcdUYwNkVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRkFCXHUwMDAwXHUwMDAwXHVFQkUxXHVFNENGXHVGNTk4XHUwMDAwIisKLSAgICAgICAgIlx1RjA1MFx1RUJDRlx1MDAwMFx1RTE0QVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYyN0FcdTAwMDBcdTAwMDBcdTAwMDBcdUYzNzRcdUY0QjRcdUU1N0UiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNDUwXHUwMDAwXHUwMDAwXHVGM0U1XHUwMDAwXHVGNTUzIisKLSAgICAgICAgIlx1RUI2NFx1MDAwMFx1RjBCNlx1MDAwMFx1RTZBMVx1RTBFOFx1MDAwMFx1RjdBRCIrCi0gICAgICAgICJcdUVGQURcdUU3NzRcdUY4NDNcdUVDNTVcdUY5NERcdTAwMDBcdTAwMDBcdUYxNTQiKwotICAgICAgICAiXHVFNzQxXHUwMDAwXHVFOTNCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNUE0IisKLSAgICAgICAgIlx1MDAwMFx1RjBFOVx1MDAwMFx1MDAwMFx1MDAwMFx1RUY0Qlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUU3NjdcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGOEFFXHVFM0UxXHUwMDAwXHUwMDAwXHVFOEMwXHUwMDAwIisKLSAgICAgICAgIlx1RjVCRVx1MDAwMFx1RUE5OVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTA5RCIrCi0gICAgICAgICJcdUY2QzZcdUUyQzhcdTAwMDBcdTAwMDBcdTAwMDBcdUVCRDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMjYwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUZGNFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUyOTZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTVDRFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUyREJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFOUJCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMjNDXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUZFOFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1NDRcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRDU3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY1REJcdTAwMDBcdTAwMDBcdUY4NTFcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFQTM5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTU5QSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYyRjdcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNEIzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMEI3XHVGMkY4XHVGNURDXHVGMUNDXHVFOEQ1XHVGM0NGXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjNEMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNUIyXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTdBRVx1RTVBQ1x1MDAwMFx1RUM1Nlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5QTNcdTAwMDBcdUY4RTUiKwotICAgICAgICAiXHVFQUFCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUM5NyIrCi0gICAgICAgICJcdTAwMDBcdUY2M0RcdTAwMDBcdUY1QjNcdTAwMDBcdUYzNDVcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFQkE1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjVERFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMTMyXHVGMUZEXHUwMDAwXHVGNUI0XHVGOEI4IisKLSAgICAgICAgIlx1MDAwMFx1RThBM1x1MDAwMFx1MDAwMFx1RTY1QVx1RTBEOVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFREQ0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNEZBIisKLSAgICAgICAgIlx1MDAwMFx1RjBCOFx1MDAwMFx1RUI0N1x1RTZFQ1x1RjNFQ1x1RURBRlx1RTVFMSIrCi0gICAgICAgICJcdUU2RURcdUUzRDFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVCRjIiKwotICAgICAgICAiXHVGMkY5XHUwMDAwXHUwMDAwXHUwMDAwXHVFOUJDXHVGNjZDXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjM3NVx1MDAwMFx1MDAwMFx1MDAwMFx1RjU1NCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVGRTlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNEZCXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNTkxXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTEzMlx1RjZGRVx1RUFCQ1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjBDRCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUzNDdcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2NTJcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFRjNEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMkFGIisKLSAgICAgICAgIlx1RTBBNVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTBFOVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4NzhcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMTU2IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUU3N1x1MDAwMFx1MDAwMFx1RjA1N1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU4QTRcdTAwMDBcdUUyQzlcdUVDOUVcdUYyRkFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMERFXHUwMDAwXHUwMDAwXHVGNUM4XHUwMDAwXHVFNTZFXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUVCNjVcdTAwMDBcdUYyQjBcdTAwMDBcdTAwMDBcdUVDNTdcdTAwMDAiKwotICAgICAgICAiXHVFN0FGXHUwMDAwXHUwMDAwXHUwMDAwXHVGN0U3XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFRUU1XHUwMDAwXHUwMDAwXHVFMkNBXHVFQkQxIisKLSAgICAgICAgIlx1MDAwMFx1RUM1OFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMkZCXHUwMDAwXHUwMDAwXHVGODlCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RTk5NFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjM3XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1Rjc3OFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMEVBXHUwMDAwXHUwMDAwXHUwMDAwXHVFMEJDXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTY3Mlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNURFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjVERlx1MDAwMFx1RjI0Nlx1MDAwMFx1MDAwMFx1MDAwMFx1RUM5OFx1RTRDQSIrCi0gICAgICAgICJcdUYyRkNcdUUzQzRcdUYyQjFcdTAwMDBcdUUzQzVcdTAwMDBcdUUzNkVcdTAwMDAiKwotICAgICAgICAiXHVFN0UxXHUwMDAwXHUwMDAwXHVFQjQ4XHUwMDAwXHUwMDAwXHVFMUQxXHVGNEI5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUVDQ1x1MDAwMFx1RTYzOFx1RTIzN1x1MDAwMFx1RTU0NVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVENThcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNEI0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYwQjlcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMEY1XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY2RFx1MDAwMFx1RjNBM1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMTU3XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUZDQVx1MDAwMFx1RUJGMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY1RTBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGOEFGXHUwMDAwXHUwMDAwXHUwMDAwXHVFMEQxIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjhFMFx1RjQ3NVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUYxOTJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjM3Q1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMjdCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUZDQlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUxOTJcdTAwMDBcdTAwMDBcdUU2QUZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjRBMVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOTk3XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGM0E0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUI2Nlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYyQjJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTYxXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjZBMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzRDFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTA5RVx1RTA5Rlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUyNUVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNEM4XHUwMDAwXHVGNEJBIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjFGRSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFODM2XHUwMDAwXHUwMDAwXHVFQjdDXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1Rjc1RFx1MDAwMFx1RTBEMlx1MDAwMFx1MDAwMFx1MDAwMFx1RjBDRSIrCi0gICAgICAgICJcdTAwMDBcdUY3RDhcdUY3RDlcdUUwNzBcdUU4NUFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMEE2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTA1OFx1RjdFRVx1RThFQ1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUzNDFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU1RUZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRTk1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RUVBMlx1RUQ2OVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVENzEiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGOTU0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjdFRlx1RTJGNFx1RjZFNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyNENcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNTU1XHVFOTMzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTlCRFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY1NTZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNzMxXHUwMDAwXHUwMDAwXHUwMDAwXHVFRjY2XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RThDMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUYzNzZcdTAwMDBcdTAwMDBcdTAwMDBcdUVENDkiKwotICAgICAgICAiXHVGNjdEXHUwMDAwXHVGN0FFXHUwMDAwXHVFOUJFXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTZCMFx1RTc3OFx1RTBCRFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY3REFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNzVFXHVGN0YwXHVFQjdEXHVFQ0IzXHVGNTQzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjA1Mlx1RjQ3Nlx1RjM0Nlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU4RDZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGMEU0XHUwMDAwXHUwMDAwXHVGNDc3XHUwMDAwXHVFNkQ1XHVFNTQ2XHVGN0U4IisKLSAgICAgICAgIlx1RTZDMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RURENVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVGRUFcdUU2Q0NcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNEU5XHVFQzU5XHUwMDAwXHVGOTZCXHVFMUFEXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTE0MFx1RjAzMlx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVEOThcdUUzNTBcdTAwMDBcdUYzNDdcdUYyMzFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFNkY2XHUwMDAwXHUwMDAwXHUwMDAwXHVFQzVBIisKLSAgICAgICAgIlx1RUM1Qlx1MDAwMFx1Rjg1Rlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYwREZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2NUIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTQ0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjFDRFx1RUQ2Mlx1MDAwMFx1MDAwMFx1RjAzOVx1RUQ0QVx1RjRBMlx1RTFEMiIrCi0gICAgICAgICJcdTAwMDBcdUY2NUJcdTAwMDBcdUYzRTZcdUYxQzFcdUVGNENcdUYyNjFcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMzc3XHVFQzVDXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUQzQVx1MDAwMFx1RjVFMVx1RjFEQVx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU2RUVcdUUzRjFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRkVCXHVFRkVDXHVFQjc0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFODM3IisKLSAgICAgICAgIlx1RTlENFx1MDAwMFx1RjAzM1x1MDAwMFx1MDAwMFx1MDAwMFx1RTY1M1x1RTY5NiIrCi0gICAgICAgICJcdTAwMDBcdUU4NkZcdTAwMDBcdUYyQjNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQzVEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMkZEXHVGNDc4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYyQzVcdTAwMDBcdUVFRTdcdTAwMDBcdTAwMDBcdUU2RkRcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFRUNFXHUwMDAwXHUwMDAwXHVFQURDXHUwMDAwXHVGN0M3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTdGNiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFQUFDXHUwMDAwXHVFNjZBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTkzNFx1MDAwMFx1MDAwMFx1MDAwMFx1RjM0OFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUU1RkFcdTAwMDBcdUVEOTlcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNjU0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjU3Q1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjJGRVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzMzFcdTAwMDBcdUVBM0FcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFODRDXHVFNzlFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1Rjg2NFx1MDAwMFx1MDAwMFx1MDAwMFx1RjE3NVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5MzhcdTAwMDBcdTAwMDBcdUYxNzYiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNzVCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY4QjlcdTAwMDBcdUVENjNcdTAwMDBcdUUxRjkiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUUyRDNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMDdBXHUwMDAwXHUwMDAwXHVFMkQ0XHUwMDAwXHVGNzREXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNTU3XHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjA2Rlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY3REJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNTQ3XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMEU1XHUwMDAwXHUwMDAwXHVFQkQyXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjAzNFx1MDAwMFx1MDAwMFx1MDAwMFx1Rjg1MiIrCi0gICAgICAgICJcdUY4RTFcdUY4N0RcdUYzMzJcdUUxOTNcdTAwMDBcdUY4MzNcdUVDOTlcdTAwMDAiKwotICAgICAgICAiXHVFQzVFXHUwMDAwXHVFRkY1XHUwMDAwXHVFQkVCXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUVFOFx1RUY2N1x1RTg5QVx1RTU1Qlx1MDAwMFx1MDAwMFx1MDAwMFx1RjZGNiIrCi0gICAgICAgICJcdUU2NTVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTU3OVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY4OUNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMTk0XHVGNkREXHUwMDAwXHVFQTRBXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTIzOFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzNDlcdUVEQTBcdUVENTlcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDY0XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjA1M1x1MDAwMFx1RjJCNFx1MDAwMFx1MDAwMFx1MDAwMFx1RTZCRVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY4RTJcdTAwMDBcdUUxRDMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMkI1XHUwMDAwXHUwMDAwXHUwMDAwXHVGODc5IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY3QTZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVBQkQiKwotICAgICAgICAiXHUwMDAwXHVGNkM3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY3OUZcdTAwMDBcdTAwMDBcdUY3OUUiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVBM0JcdUU4RThcdTAwMDBcdTAwMDBcdUVDREQiKwotICAgICAgICAiXHUwMDAwXHVFQkUyXHVFM0M2XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjY2MFx1RjBFNlx1RTg5QiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYxNTdcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQTlBXHVGNzc5XHVFQ0RFXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTI5N1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4NTNcdUVERDdcdTAwMDBcdUYxNThcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGNEM5XHUwMDAwXHUwMDAwXHVFRDRCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RUUzRVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjJCNlx1MDAwMCIrCi0gICAgICAgICJcdUU5NEZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMjREXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzUzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTM1Rlx1MDAwMFx1RTJGQVx1RjRDQVx1RUI2N1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUUzQzdcdUVGQUVcdTAwMDBcdUVGNERcdTAwMDBcdTAwMDBcdUY4NTQiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUM1Rlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY4NTVcdTAwMDBcdTAwMDBcdTAwMDBcdUY3QjhcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFOTcwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjhCMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTczOVx1RURERlx1RjdBN1x1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY2N0VcdTAwMDBcdUY2NUNcdUVDOUFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGMTkzXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTg3MFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVGM0QyXHVFNDVDXHVFMkNCXHUwMDAwXHUwMDAwXHVFMDREXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTlCRlx1MDAwMFx1MDAwMFx1MDAwMFx1RjY5MVx1MDAwMFx1RUE5QiIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGODQ0XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTVBRFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzRTciKwotICAgICAgICAiXHUwMDAwXHVFQTRFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTk1MFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTNDOFx1RTNDOSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVGNzRFXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUwRjZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFNTlCXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGNUUyXHVFQkQzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU3NzlcdTAwMDBcdTAwMDBcdUY3QTBcdTAwMDBcdUUyQ0NcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGOUE0XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTI5OFx1MDAwMFx1Rjg2MCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUxOTVcdUVFNEVcdTAwMDBcdTAwMDBcdTAwMDBcdUY2M0UiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVFNUYwXHUwMDAwXHUwMDAwXHVFM0NBXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1Rjk0RVx1RTVGMVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMUU5XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUY4NDVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVDNjBcdUY1OTlcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMUQ0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUVBM1x1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU4QTVcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVDNjFcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNkEyIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjZFM1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUYwMzZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMzMxXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTI2QVx1RjhFQlx1RThBNlx1RThERVx1RTc3NVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYwNzAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNzNBXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RURFMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNjZCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjJDNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY3N0FcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDY1IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUUyOTlcdTAwMDBcdTAwMDBcdUVCNjhcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFNkVGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjU3RFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUU2XHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTE5Nlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY1RTNcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFRDVBXHUwMDAwXHVFOTcxXHUwMDAwXHUwMDAwXHVGN0M4XHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUY5NEZcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RUYzN1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUU3NTRcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMEJFIisKLSAgICAgICAgIlx1MDAwMFx1RTkzRVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU2RjciKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzNzhcdTAwMDBcdUU5QzAiKwotICAgICAgICAiXHUwMDAwXHVFMkNEXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTk5NVx1RTdCMFx1MDAwMFx1RUU3OVx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGlubmVySW5kZXg2PQotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RUQ0Q1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVGMDU0XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUQ3Q1x1MDAwMCIrCi0gICAgICAgICJcdUVENzVcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RjhGOFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RTE0Qlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUVENERcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVFMURDXHVFN0Y3XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTlERlx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUYxQ0VcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHVFN0QwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFREEzIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RjdDRFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUFFXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyQ0UiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHVGNjNGXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RjlEM1x1RjBFRFx1RTY2Q1x1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUVEQTRcdTAwMDBcdTAwMDBcdTAwMDBcdUU1QjZcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTY2RFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdUY3RTlcdTAwMDBcdTAwMDBcdTAwMDBcdUVFQTRcdTAwMDBcdUU2NzMiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUUzQ0JcdUU2NzRcdTAwMDBcdTAwMDBcdTAwMDBcdUU1RjIiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQTlDXHUwMDAwXHVFNkY4IisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTc3QVx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFMkQ1XHVFNzlGXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1RTczQlx1MDAwMFx1MDAwMFx1RjlDQlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUY5NkNcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFQjM4XHVFNUYzXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1RjlEOVx1MDAwMFx1MDAwMFx1RTEzM1x1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUU3RjlcdTAwMDBcdTAwMDBcdUU0RUFcdUY1RjVcdTAwMDBcdUYyQzdcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTREQVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUU4NERcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUYzOCIrCi0gICAgICAgICJcdUU5M0ZcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUYzMzNcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHVFMUQ1XHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdUVCMzlcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdUVBM0NcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1RjM0QVx1RjI0MVx1MDAwMFx1MDAwMFx1RjI0Mlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY2NURcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVGMjYyIisKLSAgICAgICAgIlx1MDAwMFx1RTY1Nlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RUI3NSIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdUY0QkJcdTAwMDBcdUVERTFcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFRDVCIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHVFNkEzXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RThDMlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1RTBBMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdUUyQ0ZcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHU4ODYxXHU4ODYyXHU4ODYzXHU4ODY0XHU4ODY1XHU4ODY2XHU4ODY3XHU4ODY4IisKLSAgICAgICAgIlx1ODg2OVx1ODg2QVx1ODg2Qlx1ODg2Q1x1ODg2RFx1ODg2RVx1ODg2Rlx1ODg3MCIrCi0gICAgICAgICJcdTg4NzFcdTg4NzNcdTg4NzRcdTg4NzVcdTg4NzZcdTg4NzdcdTg4NzhcdTg4NzkiKwotICAgICAgICAiXHU4ODdBXHU4ODdCXHU4ODdDXHU4ODdEXHU4ODgxXHU4ODgyXHU4ODgzXHU4ODg0IisKLSAgICAgICAgIlx1ODg4NVx1ODg4Nlx1ODg4N1x1ODg4OFx1ODg4OVx1ODg4QVx1ODg4Qlx1ODg4QyIrCi0gICAgICAgICJcdTg4OERcdTg4OEVcdTg4OEZcdTg4OTBcdTg4OTFcdTg4OTNcdTg4OTRcdTg4OTUiKwotICAgICAgICAiXHU4ODk2XHU4ODk3XHU4ODk4XHU4ODk5XHU4ODlBXHU4ODlCXHU4ODlDXHU4ODlEIisKLSAgICAgICAgIlx1ODhBMVx1ODhBMlx1ODhBM1x1ODhBNFx1ODhBNVx1ODhBNlx1ODhBN1x1ODhBOCIrCi0gICAgICAgICJcdTg4QTlcdTg4QUFcdTg4QUJcdTg4QUNcdTg4QURcdTg4QUVcdTg4QUZcdTg4QjAiKwotICAgICAgICAiXHU4OEIxXHU4OEIzXHU4OEI0XHU4OEI1XHU4OEI2XHU4OEI3XHU4OEI4XHU4OEI5IisKLSAgICAgICAgIlx1ODhCQVx1ODhCQlx1ODhCQ1x1ODhCRFx1ODhDMVx1ODhDMlx1ODhDM1x1ODhDNCIrCi0gICAgICAgICJcdTg4QzVcdTg4QzZcdTg4QzdcdTg4QzhcdTg4QzlcdTg4Q0FcdTg4Q0JcdTg4Q0MiKwotICAgICAgICAiXHU4OENEXHU4OENFXHU4OENGXHU4OEQwXHU4OEQxXHU4OEQzXHU4OEQ0XHU4OEQ1IisKLSAgICAgICAgIlx1ODhENlx1ODhEN1x1ODhEOFx1ODhEOVx1ODhEQVx1ODhEQlx1ODhEQ1x1ODhERCIrCi0gICAgICAgICJcdTg4RTFcdTg4RTJcdTg4RTNcdTg4RTRcdTg4RTVcdTg4RTZcdTg4RTdcdTg4RTgiKwotICAgICAgICAiXHU4OEU5XHU4OEVBXHU4OEVCXHU4OEVDXHU4OEVEXHU4OEVFXHU4OEVGXHU4OEYwIisKLSAgICAgICAgIlx1ODhGMVx1ODhGM1x1ODhGNFx1ODhGNVx1ODhGNlx1ODhGN1x1ODhGOFx1ODhGOSIrCi0gICAgICAgICJcdTg4RkFcdTg4RkJcdTg4RkNcdTg4RkRcdTg5NDFcdTg5NDJcdTg5NDNcdTg5NDQiKwotICAgICAgICAiXHU4OTQ1XHU4OTQ2XHU4OTQ3XHU4OTQ4XHU4OTQ5XHU4OTRBXHU4OTRCXHU4OTRDIisKLSAgICAgICAgIlx1ODk0RFx1ODk0RVx1ODk0Rlx1ODk1MFx1ODk1MVx1ODk1M1x1ODk1NFx1ODk1NSIrCi0gICAgICAgICJcdTg5NTZcdTg5NTdcdTg5NThcdTg5NTlcdTg5NUFcdTg5NUJcdTg5NUNcdTg5NUQiKwotICAgICAgICAiXHU4OTYxXHU4OTYyXHU4OTYzXHU4OTY0XHU4OTY1XHU4OTY2XHU4OTY3XHU4OTY4IisKLSAgICAgICAgIlx1ODk2OVx1ODk2QVx1ODk2Qlx1ODk2Q1x1ODk2RFx1ODk2RVx1ODk2Rlx1ODk3MCIrCi0gICAgICAgICJcdTg5NzFcdTg5NzNcdTg5NzRcdTg5NzVcdTg5NzZcdTg5NzdcdTg5NzhcdTg5NzkiKwotICAgICAgICAiXHU4OTdBXHU4OTdCXHU4OTdDXHU4OTdEXHU4OTgxXHU4OTgyXHU4OTgzXHU4OTg0IisKLSAgICAgICAgIlx1ODk4NVx1ODk4Nlx1ODk4N1x1ODk4OFx1ODk4OVx1ODk4QVx1ODk4Qlx1ODk4QyIrCi0gICAgICAgICJcdTg5OERcdTg5OEVcdTg5OEZcdTg5OTBcdTg5OTFcdTg5OTNcdTg5OTRcdTg5OTUiKwotICAgICAgICAiXHU4OTk2XHU4OTk3XHU4OTk4XHU4OTk5XHU4OTlBXHU4OTlCXHU4OTlDXHU4OTlEIisKLSAgICAgICAgIlx1ODlBMVx1ODlBMlx1ODlBM1x1ODlBNFx1ODlBNVx1ODlBNlx1ODlBN1x1ODlBOCIrCi0gICAgICAgICJcdTg5QTlcdTg5QUFcdTg5QUJcdTg5QUNcdTg5QURcdTg5QUVcdTg5QUZcdTg5QjAiKwotICAgICAgICAiXHU4OUIxXHU4OUIzXHU4OUI0XHU4OUI1XHU4OUI2XHU4OUI3XHU4OUI4XHU4OUI5IisKLSAgICAgICAgIlx1ODlCQVx1ODlCQlx1ODlCQ1x1ODlCRFx1ODlDMVx1ODlDMlx1ODlDM1x1ODlDNCIrCi0gICAgICAgICJcdTg5QzVcdTg5QzZcdTg5QzdcdTg5QzhcdTg5QzlcdTg5Q0FcdTg5Q0JcdTg5Q0MiKwotICAgICAgICAiXHU4OUNEXHU4OUNFXHU4OUNGXHU4OUQwXHU4OUQxXHU4OUQzXHU4OUQ0XHU4OUQ1IisKLSAgICAgICAgIlx1ODlENlx1ODlEN1x1ODlEOFx1ODlEOVx1ODlEQVx1ODlEQlx1ODlEQ1x1ODlERCIrCi0gICAgICAgICJcdTg5RTFcdTg5RTJcdTg5RTNcdTg5RTRcdTg5RTVcdTg5RTZcdTg5RTdcdTg5RTgiKwotICAgICAgICAiXHU4OUU5XHU4OUVBXHU4OUVCXHU4OUVDXHU4OUVEXHU4OUVFXHU4OUVGXHU4OUYwIisKLSAgICAgICAgIlx1ODlGMVx1ODlGM1x1ODlGNFx1ODlGNVx1ODlGNlx1ODlGN1x1ODlGOFx1ODlGOSIrCi0gICAgICAgICJcdTg5RkFcdTg5RkJcdTg5RkNcdTg5RkRcdThBNDFcdThBNDJcdThBNDNcdThBNDQiKwotICAgICAgICAiXHU4QTQ1XHU4QTQ2XHU4QTQ3XHU4QTQ4XHU4QTQ5XHU4QTRBXHU4QTRCXHU4QTRDIisKLSAgICAgICAgIlx1OEE0RFx1OEE0RVx1OEE0Rlx1OEE1MFx1OEE1MVx1OEE1M1x1OEE1NFx1OEE1NSIrCi0gICAgICAgICJcdThBNTZcdThBNTdcdThBNThcdThBNTlcdThBNUFcdThBNUJcdThBNUNcdThBNUQiKwotICAgICAgICAiXHU4QTYxXHU4QTYyXHU4QTYzXHU4QTY0XHU4QTY1XHU4QTY2XHU4QTY3XHU4QTY4IisKLSAgICAgICAgIlx1OEE2OVx1OEE2QVx1OEE2Qlx1OEE2Q1x1OEE2RFx1OEE2RVx1OEE2Rlx1OEE3MCIrCi0gICAgICAgICJcdThBNzFcdThBNzNcdThBNzRcdThBNzVcdThBNzZcdThBNzdcdThBNzhcdThBNzkiKwotICAgICAgICAiXHU4QTdBXHU4QTdCXHU4QTdDXHU4QTdEXHU4QTgxXHU4QTgyXHU4QTgzXHU4QTg0IisKLSAgICAgICAgIlx1OEE4NVx1OEE4Nlx1OEE4N1x1OEE4OFx1OEE4OVx1OEE4QVx1OEE4Qlx1OEE4QyIrCi0gICAgICAgICJcdThBOERcdThBOEVcdThBOEZcdThBOTBcdThBOTFcdThBOTNcdThBOTRcdThBOTUiKwotICAgICAgICAiXHU4QTk2XHU4QTk3XHU4QTk4XHU4QTk5XHU4QTlBXHU4QTlCXHU4QTlDXHU4QTlEIisKLSAgICAgICAgIlx1OEFBMVx1OEFBMlx1OEFBM1x1OEFBNFx1OEFBNVx1OEFBNlx1OEFBN1x1OEFBOCIrCi0gICAgICAgICJcdThBQTlcdThBQUFcdThBQUJcdThBQUNcdThBQURcdThBQUVcdThBQUZcdThBQjAiKwotICAgICAgICAiXHU4QUIxXHU4QUIzXHU4QUI0XHU4QUI1XHU4QUI2XHU4QUI3XHU4QUI4XHU4QUI5IisKLSAgICAgICAgIlx1OEFCQVx1OEFCQlx1OEFCQ1x1OEFCRFx1OEFDMVx1OEFDMlx1OEFDM1x1OEFDNCIrCi0gICAgICAgICJcdThBQzVcdThBQzZcdThBQzdcdThBQzhcdThBQzlcdThBQ0FcdThBQ0JcdThBQ0MiKwotICAgICAgICAiXHU4QUNEXHU4QUNFXHU4QUNGXHU4QUQwXHU4QUQxXHU4QUQzXHU4QUQ0XHU4QUQ1IisKLSAgICAgICAgIlx1OEFENlx1OEFEN1x1OEFEOFx1OEFEOVx1OEFEQVx1OEFEQlx1OEFEQ1x1OEFERCIrCi0gICAgICAgICJcdThBRTFcdThBRTJcdThBRTNcdThBRTRcdThBRTVcdThBRTZcdThBRTdcdThBRTgiKwotICAgICAgICAiXHU4QUU5XHU4QUVBXHU4QUVCXHU4QUVDXHU4QUVEXHU4QUVFXHU4QUVGXHU4QUYwIisKLSAgICAgICAgIlx1OEFGMVx1OEFGM1x1OEFGNFx1OEFGNVx1OEFGNlx1OEFGN1x1OEFGOFx1OEFGOSIrCi0gICAgICAgICJcdThBRkFcdThBRkJcdThBRkNcdThBRkRcdThCNDFcdThCNDJcdThCNDNcdThCNDQiKwotICAgICAgICAiXHU4QjQ1XHU4QjQ2XHU4QjQ3XHU4QjQ4XHU4QjQ5XHU4QjRBXHU4QjRCXHU4QjRDIisKLSAgICAgICAgIlx1OEI0RFx1OEI0RVx1OEI0Rlx1OEI1MFx1OEI1MVx1OEI1M1x1OEI1NFx1OEI1NSIrCi0gICAgICAgICJcdThCNTZcdThCNTdcdThCNThcdThCNTlcdThCNUFcdThCNUJcdThCNUNcdThCNUQiKwotICAgICAgICAiXHU4QjYxXHU4QjYyXHU4QjYzXHU4QjY0XHU4QjY1XHU4QjY2XHU4QjY3XHU4QjY4IisKLSAgICAgICAgIlx1OEI2OVx1OEI2QVx1OEI2Qlx1OEI2Q1x1OEI2RFx1OEI2RVx1OEI2Rlx1OEI3MCIrCi0gICAgICAgICJcdThCNzFcdThCNzNcdThCNzRcdThCNzVcdThCNzZcdThCNzdcdThCNzhcdThCNzkiKwotICAgICAgICAiXHU4QjdBXHU4QjdCXHU4QjdDXHU4QjdEXHU4QjgxXHU4QjgyXHU4QjgzXHU4Qjg0IisKLSAgICAgICAgIlx1OEI4NVx1OEI4Nlx1OEI4N1x1OEI4OFx1OEI4OVx1OEI4QVx1OEI4Qlx1OEI4QyIrCi0gICAgICAgICJcdThCOERcdThCOEVcdThCOEZcdThCOTBcdThCOTFcdThCOTNcdThCOTRcdThCOTUiKwotICAgICAgICAiXHU4Qjk2XHU4Qjk3XHU4Qjk4XHU4Qjk5XHU4QjlBXHU4QjlCXHU4QjlDXHU4QjlEIisKLSAgICAgICAgIlx1OEJBMVx1OEJBMlx1OEJBM1x1OEJBNFx1OEJBNVx1OEJBNlx1OEJBN1x1OEJBOCIrCi0gICAgICAgICJcdThCQTlcdThCQUFcdThCQUJcdThCQUNcdThCQURcdThCQUVcdThCQUZcdThCQjAiKwotICAgICAgICAiXHU4QkIxXHU4QkIzXHU4QkI0XHU4QkI1XHU4QkI2XHU4QkI3XHU4QkI4XHU4QkI5IisKLSAgICAgICAgIlx1OEJCQVx1OEJCQlx1OEJCQ1x1OEJCRFx1OEM2MVx1OEM2Mlx1OEM2M1x1OEM2NCIrCi0gICAgICAgICJcdThDNjVcdThDNjZcdThDNjdcdThDNjhcdThDNjlcdThDNkFcdThDNkJcdThDNkMiKwotICAgICAgICAiXHU4QzZEXHU4QzZFXHU4QzZGXHU4QzcwXHU4QzcxXHU4QzczXHU4Qzc0XHU4Qzc1IisKLSAgICAgICAgIlx1OEM3Nlx1OEM3N1x1OEM3OFx1OEM3OVx1OEM3QVx1OEM3Qlx1OEM3Q1x1OEM3RCIrCi0gICAgICAgICJcdThDODFcdThDODJcdThDODNcdThDODRcdThDODVcdThDODZcdThDODdcdThDODgiKwotICAgICAgICAiXHU4Qzg5XHU4QzhBXHU4QzhCXHU4QzhDXHU4QzhEXHU4QzhFXHU4QzhGXHU4QzkwIisKLSAgICAgICAgIlx1OEM5MVx1OEM5M1x1OEM5NFx1OEM5NVx1OEM5Nlx1OEM5N1x1OEM5OFx1OEM5OSIrCi0gICAgICAgICJcdThDOUFcdThDOUJcdThDOUNcdThDOURcdThDQTFcdThDQTJcdThDQTNcdThDQTQiKwotICAgICAgICAiXHU4Q0E1XHU4Q0E2XHU4Q0E3XHU4Q0E4XHU4Q0E5XHU4Q0FBXHU4Q0FCXHU4Q0FDIisKLSAgICAgICAgIlx1OENBRFx1OENBRVx1OENBRlx1OENCMFx1OENCMVx1OENCM1x1OENCNFx1OENCNSIrCi0gICAgICAgICJcdThDQjZcdThDQjdcdThDQjhcdThDQjlcdThDQkFcdThDQkJcdThDQkNcdThDQkQiKwotICAgICAgICAiXHU4Q0MxXHU4Q0MyXHU4Q0MzXHU4Q0M0XHU4Q0M1XHU4Q0M2XHU4Q0M3XHU4Q0M4IisKLSAgICAgICAgIlx1OENDOVx1OENDQVx1OENDQlx1OENDQ1x1OENDRFx1OENDRVx1OENDRlx1OENEMCIrCi0gICAgICAgICJcdThDRDFcdThDRDNcdThDRDRcdThDRDVcdThDRDZcdThDRDdcdThDRDhcdThDRDkiKwotICAgICAgICAiXHU4Q0RBXHU4Q0RCXHU4Q0RDXHU4Q0REXHU4Q0UxXHU4Q0UyXHU4Q0UzXHU4Q0U0IisKLSAgICAgICAgIlx1OENFNVx1OENFNlx1OENFN1x1OENFOFx1OENFOVx1OENFQVx1OENFQlx1OENFQyIrCi0gICAgICAgICJcdThDRURcdThDRUVcdThDRUZcdThDRjBcdThDRjFcdThDRjNcdThDRjRcdThDRjUiKwotICAgICAgICAiXHU4Q0Y2XHU4Q0Y3XHU4Q0Y4XHU4Q0Y5XHU4Q0ZBXHU4Q0ZCXHU4Q0ZDXHU4Q0ZEIisKLSAgICAgICAgIlx1OEQ0MVx1OEQ0Mlx1OEQ0M1x1OEQ0NFx1OEQ0NVx1OEQ0Nlx1OEQ0N1x1OEQ0OCIrCi0gICAgICAgICJcdThENDlcdThENEFcdThENEJcdThENENcdThENERcdThENEVcdThENEZcdThENTAiKwotICAgICAgICAiXHU4RDUxXHU4RDUzXHU4RDU0XHU4RDU1XHU4RDU2XHU4RDU3XHU4RDU4XHU4RDU5IisKLSAgICAgICAgIlx1OEQ1QVx1OEQ1Qlx1OEQ1Q1x1OEQ1RFx1OEQ2MVx1OEQ2Mlx1OEQ2M1x1OEQ2NCIrCi0gICAgICAgICJcdThENjVcdThENjZcdThENjdcdThENjhcdThENjlcdThENkFcdThENkJcdThENkMiKwotICAgICAgICAiXHU4RDZEXHU4RDZFXHU4RDZGXHU4RDcwXHU4RDcxXHU4RDczXHU4RDc0XHU4RDc1IisKLSAgICAgICAgIlx1OEQ3Nlx1OEQ3N1x1OEQ3OFx1OEQ3OVx1OEQ3QVx1OEQ3Qlx1OEQ3Q1x1OEQ3RCIrCi0gICAgICAgICJcdThEODFcdThEODJcdThEODNcdThEODRcdThEODVcdThEODZcdThEODdcdThEODgiKwotICAgICAgICAiXHU4RDg5XHU4RDhBXHU4RDhCXHU4RDhDXHU4RDhEXHU4RDhFXHU4RDhGXHU4RDkwIisKLSAgICAgICAgIlx1OEQ5MVx1OEQ5M1x1OEQ5NFx1OEQ5NVx1OEQ5Nlx1OEQ5N1x1OEQ5OFx1OEQ5OSIrCi0gICAgICAgICJcdThEOUFcdThEOUJcdThEOUNcdThEOURcdThEQTFcdThEQTJcdThEQTNcdThEQTQiKwotICAgICAgICAiXHU4REE1XHU4REE2XHU4REE3XHU4REE4XHU4REE5XHU4REFBXHU4REFCXHU4REFDIisKLSAgICAgICAgIlx1OERBRFx1OERBRVx1OERBRlx1OERCMFx1OERCMVx1OERCM1x1OERCNFx1OERCNSIrCi0gICAgICAgICJcdThEQjZcdThEQjdcdThEQjhcdThEQjlcdThEQkFcdThEQkJcdThEQkNcdThEQkQiKwotICAgICAgICAiXHU4REMxXHU4REMyXHU4REMzXHU4REM0XHU4REM1XHU4REM2XHU4REM3XHU4REM4IisKLSAgICAgICAgIlx1OERDOVx1OERDQVx1OERDQlx1OERDQ1x1OERDRFx1OERDRVx1OERDRlx1OEREMCIrCi0gICAgICAgICJcdThERDFcdThERDNcdThERDRcdThERDVcdThERDZcdThERDdcdThERDhcdThERDkiKwotICAgICAgICAiXHU4RERBXHU4RERCXHU4RERDXHU4REREXHU4REUxXHU4REUyXHU4REUzXHU4REU0IisKLSAgICAgICAgIlx1OERFNVx1OERFNlx1OERFN1x1OERFOFx1OERFOVx1OERFQVx1OERFQlx1OERFQyIrCi0gICAgICAgICJcdThERURcdThERUVcdThERUZcdThERjBcdThERjFcdThERjNcdThERjRcdThERjUiKwotICAgICAgICAiXHU4REY2XHU4REY3XHU4REY4XHU4REY5XHU4REZBXHU4REZCXHU4REZDXHU4REZEIisKLSAgICAgICAgIlx1OEU0MVx1OEU0Mlx1OEU0M1x1OEU0NFx1OEU0NVx1OEU0Nlx1OEU0N1x1OEU0OCIrCi0gICAgICAgICJcdThFNDlcdThFNEFcdThFNEJcdThFNENcdThFNERcdThFNEVcdThFNEZcdThFNTAiKwotICAgICAgICAiXHU4RTUxXHU4RTUzXHU4RTU0XHU4RTU1XHU4RTU2XHU4RTU3XHU4RTU4XHU4RTU5IisKLSAgICAgICAgIlx1OEU1QVx1OEU1Qlx1OEU1Q1x1OEU1RFx1OEU2MVx1OEU2Mlx1OEU2M1x1OEU2NCIrCi0gICAgICAgICJcdThFNjVcdThFNjZcdThFNjdcdThFNjhcdThFNjlcdThFNkFcdThFNkJcdThFNkMiKwotICAgICAgICAiXHU4RTZEXHU4RTZFXHU4RTZGXHU4RTcwXHU4RTcxXHU4RTczXHU4RTc0XHU4RTc1IisKLSAgICAgICAgIlx1OEU3Nlx1OEU3N1x1OEU3OFx1OEU3OVx1OEU3QVx1OEU3Qlx1OEU3Q1x1OEU3RCIrCi0gICAgICAgICJcdThFODFcdThFODJcdThFODNcdThFODRcdThFODVcdThFODZcdThFODdcdThFODgiKwotICAgICAgICAiXHU4RTg5XHU4RThBXHU4RThCXHU4RThDXHU4RThEXHU4RThFXHU4RThGXHU4RTkwIisKLSAgICAgICAgIlx1OEU5MVx1OEU5M1x1OEU5NFx1OEU5NVx1OEU5Nlx1OEU5N1x1OEU5OFx1OEU5OSIrCi0gICAgICAgICJcdThFOUFcdThFOUJcdThFOUNcdThFOURcdThFQTFcdThFQTJcdThFQTNcdThFQTQiKwotICAgICAgICAiXHU4RUE1XHU4RUE2XHU4RUE3XHU4RUE4XHU4RUE5XHU4RUFBXHU4RUFCXHU4RUFDIisKLSAgICAgICAgIlx1OEVBRFx1OEVBRVx1OEVBRlx1OEVCMFx1OEVCMVx1OEVCM1x1OEVCNFx1OEVCNSIrCi0gICAgICAgICJcdThFQjZcdThFQjdcdThFQjhcdThFQjlcdThFQkFcdThFQkJcdThFQkNcdThFQkQiKwotICAgICAgICAiXHU4RUMxXHU4RUMyXHU4RUMzXHU4RUM0XHU4RUM1XHU4RUM2XHU4RUM3XHU4RUM4IisKLSAgICAgICAgIlx1OEVDOVx1OEVDQVx1OEVDQlx1OEVDQ1x1OEVDRFx1OEVDRVx1OEVDRlx1OEVEMCIrCi0gICAgICAgICJcdThFRDFcdThFRDNcdThFRDRcdThFRDVcdThFRDZcdThFRDdcdThFRDhcdThFRDkiKwotICAgICAgICAiXHU4RURBXHU4RURCXHU4RURDXHU4RUREXHU4RUUxXHU4RUUyXHU4RUUzXHU4RUU0IisKLSAgICAgICAgIlx1OEVFNVx1OEVFNlx1OEVFN1x1OEVFOFx1OEVFOVx1OEVFQVx1OEVFQlx1OEVFQyIrCi0gICAgICAgICJcdThFRURcdThFRUVcdThFRUZcdThFRjBcdThFRjFcdThFRjNcdThFRjRcdThFRjUiKwotICAgICAgICAiXHU4RUY2XHU4RUY3XHU4RUY4XHU4RUY5XHU4RUZBXHU4RUZCXHU4RUZDXHU4RUZEIisKLSAgICAgICAgIlx1OEY0MVx1OEY0Mlx1OEY0M1x1OEY0NFx1OEY0NVx1OEY0Nlx1OEY0N1x1OEY0OCIrCi0gICAgICAgICJcdThGNDlcdThGNEFcdThGNEJcdThGNENcdThGNERcdThGNEVcdThGNEZcdThGNTAiKwotICAgICAgICAiXHU4RjUxXHU4RjUzXHU4RjU0XHU4RjU1XHU4RjU2XHU4RjU3XHU4RjU4XHU4RjU5IisKLSAgICAgICAgIlx1OEY1QVx1OEY1Qlx1OEY1Q1x1OEY1RFx1OEY2MVx1OEY2Mlx1OEY2M1x1OEY2NCIrCi0gICAgICAgICJcdThGNjVcdThGNjZcdThGNjdcdThGNjhcdThGNjlcdThGNkFcdThGNkJcdThGNkMiKwotICAgICAgICAiXHU4RjZEXHU4RjZFXHU4RjZGXHU4RjcwXHU4RjcxXHU4RjczXHU4Rjc0XHU4Rjc1IisKLSAgICAgICAgIlx1OEY3Nlx1OEY3N1x1OEY3OFx1OEY3OVx1OEY3QVx1OEY3Qlx1OEY3Q1x1OEY3RCIrCi0gICAgICAgICJcdThGODFcdThGODJcdThGODNcdThGODRcdThGODVcdThGODZcdThGODdcdThGODgiKwotICAgICAgICAiXHU4Rjg5XHU4RjhBXHU4RjhCXHU4RjhDXHU4RjhEXHU4RjhFXHU4RjhGXHU4RjkwIisKLSAgICAgICAgIlx1OEY5MVx1OEY5M1x1OEY5NFx1OEY5NVx1OEY5Nlx1OEY5N1x1OEY5OFx1OEY5OSIrCi0gICAgICAgICJcdThGOUFcdThGOUJcdThGOUNcdThGOURcdThGQTFcdThGQTJcdThGQTNcdThGQTQiKwotICAgICAgICAiXHU4RkE1XHU4RkE2XHU4RkE3XHU4RkE4XHU4RkE5XHU4RkFBXHU4RkFCXHU4RkFDIisKLSAgICAgICAgIlx1OEZBRFx1OEZBRVx1OEZBRlx1OEZCMFx1OEZCMVx1OEZCM1x1OEZCNFx1OEZCNSIrCi0gICAgICAgICJcdThGQjZcdThGQjdcdThGQjhcdThGQjlcdThGQkFcdThGQkJcdThGQkNcdThGQkQiKwotICAgICAgICAiXHU5MDYxXHU5MDYyXHU5MDYzXHU5MDY0XHU5MDY1XHU5MDY2XHU5MDY3XHU5MDY4IisKLSAgICAgICAgIlx1OTA2OVx1OTA2QVx1OTA2Qlx1OTA2Q1x1OTA2RFx1OTA2RVx1OTA2Rlx1OTA3MCIrCi0gICAgICAgICJcdTkwNzFcdTkwNzNcdTkwNzRcdTkwNzVcdTkwNzZcdTkwNzdcdTkwNzhcdTkwNzkiKwotICAgICAgICAiXHU5MDdBXHU5MDdCXHU5MDdDXHU5MDdEXHU5MDgxXHU5MDgyXHU5MDgzXHU5MDg0IisKLSAgICAgICAgIlx1OTA4NVx1OTA4Nlx1OTA4N1x1OTA4OFx1OTA4OVx1OTA4QVx1OTA4Qlx1OTA4QyIrCi0gICAgICAgICJcdTkwOERcdTkwOEVcdTkwOEZcdTkwOTBcdTkwOTFcdTkwOTNcdTkwOTRcdTkwOTUiKwotICAgICAgICAiXHU5MDk2XHU5MDk3XHU5MDk4XHU5MDk5XHU5MDlBXHU5MDlCXHU5MDlDXHU5MDlEIisKLSAgICAgICAgIlx1OTBBMVx1OTBBMlx1OTBBM1x1OTBBNFx1OTBBNVx1OTBBNlx1OTBBN1x1OTBBOCIrCi0gICAgICAgICJcdTkwQTlcdTkwQUFcdTkwQUJcdTkwQUNcdTkwQURcdTkwQUVcdTkwQUZcdTkwQjAiKwotICAgICAgICAiXHU5MEIxXHU5MEIzXHU5MEI0XHU5MEI1XHU5MEI2XHU5MEI3XHU5MEI4XHU5MEI5IisKLSAgICAgICAgIlx1OTBCQVx1OTBCQlx1OTBCQ1x1OTBCRFx1OTBDMVx1OTBDMlx1OTBDM1x1OTBDNCIrCi0gICAgICAgICJcdTkwQzVcdTkwQzZcdTkwQzdcdTkwQzhcdTkwQzlcdTkwQ0FcdTkwQ0JcdTkwQ0MiKwotICAgICAgICAiXHU5MENEXHU5MENFXHU5MENGXHU5MEQwXHU5MEQxXHU5MEQzXHU5MEQ0XHU5MEQ1IisKLSAgICAgICAgIlx1OTBENlx1OTBEN1x1OTBEOFx1OTBEOVx1OTBEQVx1OTBEQlx1OTBEQ1x1OTBERCIrCi0gICAgICAgICJcdTkwRTFcdTkwRTJcdTkwRTNcdTkwRTRcdTkwRTVcdTkwRTZcdTkwRTdcdTkwRTgiKwotICAgICAgICAiXHU5MEU5XHU5MEVBXHU5MEVCXHU5MEVDXHU5MEVEXHU5MEVFXHU5MEVGXHU5MEYwIisKLSAgICAgICAgIlx1OTBGMVx1OTBGM1x1OTBGNFx1OTBGNVx1OTBGNlx1OTBGN1x1OTBGOFx1OTBGOSIrCi0gICAgICAgICJcdTkwRkFcdTkwRkJcdTkwRkNcdTkwRkRcdTkxNDFcdTkxNDJcdTkxNDNcdTkxNDQiKwotICAgICAgICAiXHU5MTQ1XHU5MTQ2XHU5MTQ3XHU5MTQ4XHU5MTQ5XHU5MTRBXHU5MTRCXHU5MTRDIisKLSAgICAgICAgIlx1OTE0RFx1OTE0RVx1OTE0Rlx1OTE1MFx1OTE1MVx1OTE1M1x1OTE1NFx1OTE1NSIrCi0gICAgICAgICJcdTkxNTZcdTkxNTdcdTkxNThcdTkxNTlcdTkxNUFcdTkxNUJcdTkxNUNcdTkxNUQiKwotICAgICAgICAiXHU5MTYxXHU5MTYyXHU5MTYzXHU5MTY0XHU5MTY1XHU5MTY2XHU5MTY3XHU5MTY4IisKLSAgICAgICAgIlx1OTE2OVx1OTE2QVx1OTE2Qlx1OTE2Q1x1OTE2RFx1OTE2RVx1OTE2Rlx1OTE3MCIrCi0gICAgICAgICJcdTkxNzFcdTkxNzNcdTkxNzRcdTkxNzVcdTkxNzZcdTkxNzdcdTkxNzhcdTkxNzkiKwotICAgICAgICAiXHU5MTdBXHU5MTdCXHU5MTdDXHU5MTdEXHU5MTgxXHU5MTgyXHU5MTgzXHU5MTg0IisKLSAgICAgICAgIlx1OTE4NVx1OTE4Nlx1OTE4N1x1OTE4OFx1OTE4OVx1OTE4QVx1OTE4Qlx1OTE4QyIrCi0gICAgICAgICJcdTkxOERcdTkxOEVcdTkxOEZcdTkxOTBcdTkxOTFcdTkxOTNcdTkxOTRcdTkxOTUiKwotICAgICAgICAiXHU5MTk2XHU5MTk3XHU5MTk4XHU5MTk5XHU5MTlBXHU5MTlCXHU5MTlDXHU5MTlEIisKLSAgICAgICAgIlx1OTFBMVx1OTFBMlx1OTFBM1x1OTFBNFx1OTFBNVx1OTFBNlx1OTFBN1x1OTFBOCIrCi0gICAgICAgICJcdTkxQTlcdTkxQUFcdTkxQUJcdTkxQUNcdTkxQURcdTkxQUVcdTkxQUZcdTkxQjAiKwotICAgICAgICAiXHU5MUIxXHU5MUIzXHU5MUI0XHU5MUI1XHU5MUI2XHU5MUI3XHU5MUI4XHU5MUI5IisKLSAgICAgICAgIlx1OTFCQVx1OTFCQlx1OTFCQ1x1OTFCRFx1OTFDMVx1OTFDMlx1OTFDM1x1OTFDNCIrCi0gICAgICAgICJcdTkxQzVcdTkxQzZcdTkxQzdcdTkxQzhcdTkxQzlcdTkxQ0FcdTkxQ0JcdTkxQ0MiKwotICAgICAgICAiXHU5MUNEXHU5MUNFXHU5MUNGXHU5MUQwXHU5MUQxXHU5MUQzXHU5MUQ0XHU5MUQ1IisKLSAgICAgICAgIlx1OTFENlx1OTFEN1x1OTFEOFx1OTFEOVx1OTFEQVx1OTFEQlx1OTFEQ1x1OTFERCIrCi0gICAgICAgICJcdTkxRTFcdTkxRTJcdTkxRTNcdTkxRTRcdTkxRTVcdTkxRTZcdTkxRTdcdTkxRTgiKwotICAgICAgICAiXHU5MUU5XHU5MUVBXHU5MUVCXHU5MUVDXHU5MUVEXHU5MUVFXHU5MUVGXHU5MUYwIisKLSAgICAgICAgIlx1OTFGMVx1OTFGM1x1OTFGNFx1OTFGNVx1OTFGNlx1OTFGN1x1OTFGOFx1OTFGOSIrCi0gICAgICAgICJcdTkxRkFcdTkxRkJcdTkxRkNcdTkxRkRcdTkyNDFcdTkyNDJcdTkyNDNcdTkyNDQiKwotICAgICAgICAiXHU5MjQ1XHU5MjQ2XHU5MjQ3XHU5MjQ4XHU5MjQ5XHU5MjRBXHU5MjRCXHU5MjRDIisKLSAgICAgICAgIlx1OTI0RFx1OTI0RVx1OTI0Rlx1OTI1MFx1OTI1MVx1OTI1M1x1OTI1NFx1OTI1NSIrCi0gICAgICAgICJcdTkyNTZcdTkyNTdcdTkyNThcdTkyNTlcdTkyNUFcdTkyNUJcdTkyNUNcdTkyNUQiKwotICAgICAgICAiXHU5MjYxXHU5MjYyXHU5MjYzXHU5MjY0XHU5MjY1XHU5MjY2XHU5MjY3XHU5MjY4IisKLSAgICAgICAgIlx1OTI2OVx1OTI2QVx1OTI2Qlx1OTI2Q1x1OTI2RFx1OTI2RVx1OTI2Rlx1OTI3MCIrCi0gICAgICAgICJcdTkyNzFcdTkyNzNcdTkyNzRcdTkyNzVcdTkyNzZcdTkyNzdcdTkyNzhcdTkyNzkiKwotICAgICAgICAiXHU5MjdBXHU5MjdCXHU5MjdDXHU5MjdEXHU5MjgxXHU5MjgyXHU5MjgzXHU5Mjg0IisKLSAgICAgICAgIlx1OTI4NVx1OTI4Nlx1OTI4N1x1OTI4OFx1OTI4OVx1OTI4QVx1OTI4Qlx1OTI4QyIrCi0gICAgICAgICJcdTkyOERcdTkyOEVcdTkyOEZcdTkyOTBcdTkyOTFcdTkyOTNcdTkyOTRcdTkyOTUiKwotICAgICAgICAiXHU5Mjk2XHU5Mjk3XHU5Mjk4XHU5Mjk5XHU5MjlBXHU5MjlCXHU5MjlDXHU5MjlEIisKLSAgICAgICAgIlx1OTJBMVx1OTJBMlx1OTJBM1x1OTJBNFx1OTJBNVx1OTJBNlx1OTJBN1x1OTJBOCIrCi0gICAgICAgICJcdTkyQTlcdTkyQUFcdTkyQUJcdTkyQUNcdTkyQURcdTkyQUVcdTkyQUZcdTkyQjAiKwotICAgICAgICAiXHU5MkIxXHU5MkIzXHU5MkI0XHU5MkI1XHU5MkI2XHU5MkI3XHU5MkI4XHU5MkI5IisKLSAgICAgICAgIlx1OTJCQVx1OTJCQlx1OTJCQ1x1OTJCRFx1OTJDMVx1OTJDMlx1OTJDM1x1OTJDNCIrCi0gICAgICAgICJcdTkyQzVcdTkyQzZcdTkyQzdcdTkyQzhcdTkyQzlcdTkyQ0FcdTkyQ0JcdTkyQ0MiKwotICAgICAgICAiXHU5MkNEXHU5MkNFXHU5MkNGXHU5MkQwXHU5MkQxXHU5MkQzXHU5MkQ0XHU5MkQ1IisKLSAgICAgICAgIlx1OTJENlx1OTJEN1x1OTJEOFx1OTJEOVx1OTJEQVx1OTJEQlx1OTJEQ1x1OTJERCIrCi0gICAgICAgICJcdTkyRTFcdTkyRTJcdTkyRTNcdTkyRTRcdTkyRTVcdTkyRTZcdTkyRTdcdTkyRTgiKwotICAgICAgICAiXHU5MkU5XHU5MkVBXHU5MkVCXHU5MkVDXHU5MkVEXHU5MkVFXHU5MkVGXHU5MkYwIisKLSAgICAgICAgIlx1OTJGMVx1OTJGM1x1OTJGNFx1OTJGNVx1OTJGNlx1OTJGN1x1OTJGOFx1OTJGOSIrCi0gICAgICAgICJcdTkyRkFcdTkyRkJcdTkyRkNcdTkyRkRcdTkzNDFcdTkzNDJcdTkzNDNcdTkzNDQiKwotICAgICAgICAiXHU5MzQ1XHU5MzQ2XHU5MzQ3XHU5MzQ4XHU5MzQ5XHU5MzRBXHU5MzRCXHU5MzRDIisKLSAgICAgICAgIlx1OTM0RFx1OTM0RVx1OTM0Rlx1OTM1MFx1OTM1MVx1OTM1M1x1OTM1NFx1OTM1NSIrCi0gICAgICAgICJcdTkzNTZcdTkzNTdcdTkzNThcdTkzNTlcdTkzNUFcdTkzNUJcdTkzNUNcdTkzNUQiKwotICAgICAgICAiXHU5MzYxXHU5MzYyXHU5MzYzXHU5MzY0XHU5MzY1XHU5MzY2XHU5MzY3XHU5MzY4IisKLSAgICAgICAgIlx1OTM2OVx1OTM2QVx1OTM2Qlx1OTM2Q1x1OTM2RFx1OTM2RVx1OTM2Rlx1OTM3MCIrCi0gICAgICAgICJcdTkzNzFcdTkzNzNcdTkzNzRcdTkzNzVcdTkzNzZcdTkzNzdcdTkzNzhcdTkzNzkiKwotICAgICAgICAiXHU5MzdBXHU5MzdCXHU5MzdDXHU5MzdEXHU5MzgxXHU5MzgyXHU5MzgzXHU5Mzg0IisKLSAgICAgICAgIlx1OTM4NVx1OTM4Nlx1OTM4N1x1OTM4OFx1OTM4OVx1OTM4QVx1OTM4Qlx1OTM4QyIrCi0gICAgICAgICJcdTkzOERcdTkzOEVcdTkzOEZcdTkzOTBcdTkzOTFcdTkzOTNcdTkzOTRcdTkzOTUiKwotICAgICAgICAiXHU5Mzk2XHU5Mzk3XHU5Mzk4XHU5Mzk5XHU5MzlBXHU5MzlCXHU5MzlDXHU5MzlEIisKLSAgICAgICAgIlx1OTNBMVx1OTNBMlx1OTNBM1x1OTNBNFx1OTNBNVx1OTNBNlx1OTNBN1x1OTNBOCIrCi0gICAgICAgICJcdTkzQTlcdTkzQUFcdTkzQUJcdTkzQUNcdTkzQURcdTkzQUVcdTkzQUZcdTkzQjAiKwotICAgICAgICAiXHU5M0IxXHU5M0IzXHU5M0I0XHU5M0I1XHU5M0I2XHU5M0I3XHU5M0I4XHU5M0I5IisKLSAgICAgICAgIlx1OTNCQVx1OTNCQlx1OTNCQ1x1OTNCRFx1OTQ2MVx1OTQ2Mlx1OTQ2M1x1OTQ2NCIrCi0gICAgICAgICJcdTk0NjVcdTk0NjZcdTk0NjdcdTk0NjhcdTk0NjlcdTk0NkFcdTk0NkJcdTk0NkMiKwotICAgICAgICAiXHU5NDZEXHU5NDZFXHU5NDZGXHU5NDcwXHU5NDcxXHU5NDczXHU5NDc0XHU5NDc1IisKLSAgICAgICAgIlx1OTQ3Nlx1OTQ3N1x1OTQ3OFx1OTQ3OVx1OTQ3QVx1OTQ3Qlx1OTQ3Q1x1OTQ3RCIrCi0gICAgICAgICJcdTk0ODFcdTk0ODJcdTk0ODNcdTk0ODRcdTk0ODVcdTk0ODZcdTk0ODdcdTk0ODgiKwotICAgICAgICAiXHU5NDg5XHU5NDhBXHU5NDhCXHU5NDhDXHU5NDhEXHU5NDhFXHU5NDhGXHU5NDkwIisKLSAgICAgICAgIlx1OTQ5MVx1OTQ5M1x1OTQ5NFx1OTQ5NVx1OTQ5Nlx1OTQ5N1x1OTQ5OFx1OTQ5OSIrCi0gICAgICAgICJcdTk0OUFcdTk0OUJcdTk0OUNcdTk0OURcdTk0QTFcdTk0QTJcdTk0QTNcdTk0QTQiKwotICAgICAgICAiXHU5NEE1XHU5NEE2XHU5NEE3XHU5NEE4XHU5NEE5XHU5NEFBXHU5NEFCXHU5NEFDIisKLSAgICAgICAgIlx1OTRBRFx1OTRBRVx1OTRBRlx1OTRCMFx1OTRCMVx1OTRCM1x1OTRCNFx1OTRCNSIrCi0gICAgICAgICJcdTk0QjZcdTk0QjdcdTk0QjhcdTk0QjlcdTk0QkFcdTk0QkJcdTk0QkNcdTk0QkQiKwotICAgICAgICAiXHU5NEMxXHU5NEMyXHU5NEMzXHU5NEM0XHU5NEM1XHU5NEM2XHU5NEM3XHU5NEM4IisKLSAgICAgICAgIlx1OTRDOVx1OTRDQVx1OTRDQlx1OTRDQ1x1OTRDRFx1OTRDRVx1OTRDRlx1OTREMCIrCi0gICAgICAgICJcdTk0RDFcdTk0RDNcdTk0RDRcdTk0RDVcdTk0RDZcdTk0RDdcdTk0RDhcdTk0RDkiKwotICAgICAgICAiXHU5NERBXHU5NERCXHU5NERDXHU5NEREXHU5NEUxXHU5NEUyXHU5NEUzXHU5NEU0IisKLSAgICAgICAgIlx1OTRFNVx1OTRFNlx1OTRFN1x1OTRFOFx1OTRFOVx1OTRFQVx1OTRFQlx1OTRFQyIrCi0gICAgICAgICJcdTk0RURcdTk0RUVcdTk0RUZcdTk0RjBcdTk0RjFcdTk0RjNcdTk0RjRcdTk0RjUiKwotICAgICAgICAiXHU5NEY2XHU5NEY3XHU5NEY4XHU5NEY5XHU5NEZBXHU5NEZCXHU5NEZDXHU5NEZEIisKLSAgICAgICAgIlx1OTU0MVx1OTU0Mlx1OTU0M1x1OTU0NFx1OTU0NVx1OTU0Nlx1OTU0N1x1OTU0OCIrCi0gICAgICAgICJcdTk1NDlcdTk1NEFcdTk1NEJcdTk1NENcdTk1NERcdTk1NEVcdTk1NEZcdTk1NTAiKwotICAgICAgICAiXHU5NTUxXHU5NTUzXHU5NTU0XHU5NTU1XHU5NTU2XHU5NTU3XHU5NTU4XHU5NTU5IisKLSAgICAgICAgIlx1OTU1QVx1OTU1Qlx1OTU1Q1x1OTU1RFx1OTU2MVx1OTU2Mlx1OTU2M1x1OTU2NCIrCi0gICAgICAgICJcdTk1NjVcdTk1NjZcdTk1NjdcdTk1NjhcdTk1NjlcdTk1NkFcdTk1NkJcdTk1NkMiKwotICAgICAgICAiXHU5NTZEXHU5NTZFXHU5NTZGXHU5NTcwXHU5NTcxXHU5NTczXHU5NTc0XHU5NTc1IisKLSAgICAgICAgIlx1OTU3Nlx1OTU3N1x1OTU3OFx1OTU3OVx1OTU3QVx1OTU3Qlx1OTU3Q1x1OTU3RCIrCi0gICAgICAgICJcdTk1ODFcdTk1ODJcdTk1ODNcdTk1ODRcdTk1ODVcdTk1ODZcdTk1ODdcdTk1ODgiKwotICAgICAgICAiXHU5NTg5XHU5NThBXHU5NThCXHU5NThDXHU5NThEXHU5NThFXHU5NThGXHU5NTkwIisKLSAgICAgICAgIlx1OTU5MVx1OTU5M1x1OTU5NFx1OTU5NVx1OTU5Nlx1OTU5N1x1OTU5OFx1OTU5OSIrCi0gICAgICAgICJcdTk1OUFcdTk1OUJcdTk1OUNcdTk1OURcdTk1QTFcdTk1QTJcdTk1QTNcdTk1QTQiKwotICAgICAgICAiXHU5NUE1XHU5NUE2XHU5NUE3XHU5NUE4XHU5NUE5XHU5NUFBXHU5NUFCXHU5NUFDIisKLSAgICAgICAgIlx1OTVBRFx1OTVBRVx1OTVBRlx1OTVCMFx1OTVCMVx1OTVCM1x1OTVCNFx1OTVCNSIrCi0gICAgICAgICJcdTk1QjZcdTk1QjdcdTk1QjhcdTk1QjlcdTk1QkFcdTk1QkJcdTk1QkNcdTk1QkQiKwotICAgICAgICAiXHU5NUMxXHU5NUMyXHU5NUMzXHU5NUM0XHU5NUM1XHU5NUM2XHU5NUM3XHU5NUM4IisKLSAgICAgICAgIlx1OTVDOVx1OTVDQVx1OTVDQlx1OTVDQ1x1OTVDRFx1OTVDRVx1OTVDRlx1OTVEMCIrCi0gICAgICAgICJcdTk1RDFcdTk1RDNcdTk1RDRcdTk1RDVcdTk1RDZcdTk1RDdcdTk1RDhcdTk1RDkiKwotICAgICAgICAiXHU5NURBXHU5NURCXHU5NURDXHU5NUREXHU5NUUxXHU5NUUyXHU5NUUzXHU5NUU0IisKLSAgICAgICAgIlx1OTVFNVx1OTVFNlx1OTVFN1x1OTVFOFx1OTVFOVx1OTVFQVx1OTVFQlx1OTVFQyIrCi0gICAgICAgICJcdTk1RURcdTk1RUVcdTk1RUZcdTk1RjBcdTk1RjFcdTk1RjNcdTk1RjRcdTk1RjUiKwotICAgICAgICAiXHU5NUY2XHU5NUY3XHU5NUY4XHU5NUY5XHU5NUZBXHU5NUZCXHU5NUZDXHU5NUZEIisKLSAgICAgICAgIlx1OTY0MVx1OTY0Mlx1OTY0M1x1OTY0NFx1OTY0NVx1OTY0Nlx1OTY0N1x1OTY0OCIrCi0gICAgICAgICJcdTk2NDlcdTk2NEFcdTk2NEJcdTk2NENcdTk2NERcdTk2NEVcdTk2NEZcdTk2NTAiKwotICAgICAgICAiXHU5NjUxXHU5NjUzXHU5NjU0XHU5NjU1XHU5NjU2XHU5NjU3XHU5NjU4XHU5NjU5IisKLSAgICAgICAgIlx1OTY1QVx1OTY1Qlx1OTY1Q1x1OTY1RFx1OTY2MVx1OTY2Mlx1OTY2M1x1OTY2NCIrCi0gICAgICAgICJcdTk2NjVcdTk2NjZcdTk2NjdcdTk2NjhcdTk2NjlcdTk2NkFcdTk2NkJcdTk2NkMiKwotICAgICAgICAiXHU5NjZEXHU5NjZFXHU5NjZGXHU5NjcwXHU5NjcxXHU5NjczXHU5Njc0XHU5Njc1IisKLSAgICAgICAgIlx1OTY3Nlx1OTY3N1x1OTY3OFx1OTY3OVx1OTY3QVx1OTY3Qlx1OTY3Q1x1OTY3RCIrCi0gICAgICAgICJcdTk2ODFcdTk2ODJcdTk2ODNcdTk2ODRcdTk2ODVcdTk2ODZcdTk2ODdcdTk2ODgiKwotICAgICAgICAiXHU5Njg5XHU5NjhBXHU5NjhCXHU5NjhDXHU5NjhEXHU5NjhFXHU5NjhGXHU5NjkwIisKLSAgICAgICAgIlx1OTY5MVx1OTY5M1x1OTY5NFx1OTY5NVx1OTY5Nlx1OTY5N1x1OTY5OFx1OTY5OSIrCi0gICAgICAgICJcdTk2OUFcdTk2OUJcdTk2OUNcdTk2OURcdTk2QTFcdTk2QTJcdTk2QTNcdTk2QTQiKwotICAgICAgICAiXHU5NkE1XHU5NkE2XHU5NkE3XHU5NkE4XHU5NkE5XHU5NkFBXHU5NkFCXHU5NkFDIisKLSAgICAgICAgIlx1OTZBRFx1OTZBRVx1OTZBRlx1OTZCMFx1OTZCMVx1OTZCM1x1OTZCNFx1OTZCNSIrCi0gICAgICAgICJcdTk2QjZcdTk2QjdcdTk2QjhcdTk2QjlcdTk2QkFcdTk2QkJcdTk2QkNcdTk2QkQiKwotICAgICAgICAiXHU5NkMxXHU5NkMyXHU5NkMzXHU5NkM0XHU5NkM1XHU5NkM2XHU5NkM3XHU5NkM4IisKLSAgICAgICAgIlx1OTZDOVx1OTZDQVx1OTZDQlx1OTZDQ1x1OTZDRFx1OTZDRVx1OTZDRlx1OTZEMCIrCi0gICAgICAgICJcdTk2RDFcdTk2RDNcdTk2RDRcdTk2RDVcdTk2RDZcdTk2RDdcdTk2RDhcdTk2RDkiKwotICAgICAgICAiXHU5NkRBXHU5NkRCXHU5NkRDXHU5NkREXHU5NkUxXHU5NkUyXHU5NkUzXHU5NkU0IisKLSAgICAgICAgIlx1OTZFNVx1OTZFNlx1OTZFN1x1OTZFOFx1OTZFOVx1OTZFQVx1OTZFQlx1OTZFQyIrCi0gICAgICAgICJcdTk2RURcdTk2RUVcdTk2RUZcdTk2RjBcdTk2RjFcdTk2RjNcdTk2RjRcdTk2RjUiKwotICAgICAgICAiXHU5NkY2XHU5NkY3XHU5NkY4XHU5NkY5XHU5NkZBXHU5NkZCXHU5NkZDXHU5NkZEIisKLSAgICAgICAgIlx1OTc0MVx1OTc0Mlx1OTc0M1x1OTc0NFx1OTc0NVx1OTc0Nlx1OTc0N1x1OTc0OCIrCi0gICAgICAgICJcdTk3NDlcdTk3NEFcdTk3NEJcdTk3NENcdTk3NERcdTk3NEVcdTk3NEZcdTk3NTAiKwotICAgICAgICAiXHU5NzUxXHU5NzUzXHU5NzU0XHU5NzU1XHU5NzU2XHU5NzU3XHU5NzU4XHU5NzU5IisKLSAgICAgICAgIlx1OTc1QVx1OTc1Qlx1OTc1Q1x1OTc1RFx1OTc2MVx1OTc2Mlx1OTc2M1x1OTc2NCIrCi0gICAgICAgICJcdTk3NjVcdTk3NjZcdTk3NjdcdTk3NjhcdTk3NjlcdTk3NkFcdTk3NkJcdTk3NkMiKwotICAgICAgICAiXHU5NzZEXHU5NzZFXHU5NzZGXHU5NzcwXHU5NzcxXHU5NzczXHU5Nzc0XHU5Nzc1IisKLSAgICAgICAgIlx1OTc3Nlx1OTc3N1x1OTc3OFx1OTc3OVx1OTc3QVx1OTc3Qlx1OTc3Q1x1OTc3RCIrCi0gICAgICAgICJcdTk3ODFcdTk3ODJcdTk3ODNcdTk3ODRcdTk3ODVcdTk3ODZcdTk3ODdcdTk3ODgiKwotICAgICAgICAiXHU5Nzg5XHU5NzhBXHU5NzhCXHU5NzhDXHU5NzhEXHU5NzhFXHU5NzhGXHU5NzkwIisKLSAgICAgICAgIlx1OTc5MVx1OTc5M1x1OTc5NFx1OTc5NVx1OTc5Nlx1OTc5N1x1OTc5OFx1OTc5OSIrCi0gICAgICAgICJcdTk3OUFcdTk3OUJcdTk3OUNcdTk3OURcdTk3QTFcdTk3QTJcdTk3QTNcdTk3QTQiKwotICAgICAgICAiXHU5N0E1XHU5N0E2XHU5N0E3XHU5N0E4XHU5N0E5XHU5N0FBXHU5N0FCXHU5N0FDIisKLSAgICAgICAgIlx1OTdBRFx1OTdBRVx1OTdBRlx1OTdCMFx1OTdCMVx1OTdCM1x1OTdCNFx1OTdCNSIrCi0gICAgICAgICJcdTk3QjZcdTk3QjdcdTk3QjhcdTk3QjlcdTk3QkFcdTk3QkJcdTk3QkNcdTk3QkQiKwotICAgICAgICAiXHU5ODYxXHU5ODYyXHU5ODYzXHU5ODY0XHU5ODY1XHU5ODY2XHU5ODY3XHU5ODY4IisKLSAgICAgICAgIlx1OTg2OVx1OTg2QVx1OTg2Qlx1OTg2Q1x1OTg2RFx1OTg2RVx1OTg2Rlx1OTg3MCIrCi0gICAgICAgICJcdTk4NzFcdTk4NzNcdTk4NzRcdTk4NzVcdTk4NzZcdTk4NzdcdTk4NzhcdTk4NzkiKwotICAgICAgICAiXHU5ODdBXHU5ODdCXHU5ODdDXHU5ODdEXHU5ODgxXHU5ODgyXHU5ODgzXHU5ODg0IisKLSAgICAgICAgIlx1OTg4NVx1OTg4Nlx1OTg4N1x1OTg4OFx1OTg4OVx1OTg4QVx1OTg4Qlx1OTg4QyIrCi0gICAgICAgICJcdTk4OERcdTk4OEVcdTk4OEZcdTk4OTBcdTk4OTFcdTk4OTNcdTk4OTRcdTk4OTUiKwotICAgICAgICAiXHU5ODk2XHU5ODk3XHU5ODk4XHU5ODk5XHU5ODlBXHU5ODlCXHU5ODlDXHU5ODlEIisKLSAgICAgICAgIlx1OThBMVx1OThBMlx1OThBM1x1OThBNFx1OThBNVx1OThBNlx1OThBN1x1OThBOCIrCi0gICAgICAgICJcdTk4QTlcdTk4QUFcdTk4QUJcdTk4QUNcdTk4QURcdTk4QUVcdTk4QUZcdTk4QjAiKwotICAgICAgICAiXHU5OEIxXHU5OEIzXHU5OEI0XHU5OEI1XHU5OEI2XHU5OEI3XHU5OEI4XHU5OEI5IisKLSAgICAgICAgIlx1OThCQVx1OThCQlx1OThCQ1x1OThCRFx1OThDMVx1OThDMlx1OThDM1x1OThDNCIrCi0gICAgICAgICJcdTk4QzVcdTk4QzZcdTk4QzdcdTk4QzhcdTk4QzlcdTk4Q0FcdTk4Q0JcdTk4Q0MiKwotICAgICAgICAiXHU5OENEXHU5OENFXHU5OENGXHU5OEQwXHU5OEQxXHU5OEQzXHU5OEQ0XHU5OEQ1IisKLSAgICAgICAgIlx1OThENlx1OThEN1x1OThEOFx1OThEOVx1OThEQVx1OThEQlx1OThEQ1x1OThERCIrCi0gICAgICAgICJcdTk4RTFcdTk4RTJcdTk4RTNcdTk4RTRcdTk4RTVcdTk4RTZcdTk4RTdcdTk4RTgiKwotICAgICAgICAiXHU5OEU5XHU5OEVBXHU5OEVCXHU5OEVDXHU5OEVEXHU5OEVFXHU5OEVGXHU5OEYwIisKLSAgICAgICAgIlx1OThGMVx1OThGM1x1OThGNFx1OThGNVx1OThGNlx1OThGN1x1OThGOFx1OThGOSIrCi0gICAgICAgICJcdTk4RkFcdTk4RkJcdTk4RkNcdTk4RkRcdTk5NDFcdTk5NDJcdTk5NDNcdTk5NDQiKwotICAgICAgICAiXHU5OTQ1XHU5OTQ2XHU5OTQ3XHU5OTQ4XHU5OTQ5XHU5OTRBXHU5OTRCXHU5OTRDIisKLSAgICAgICAgIlx1OTk0RFx1OTk0RVx1OTk0Rlx1OTk1MFx1OTk1MVx1OTk1M1x1OTk1NFx1OTk1NSIrCi0gICAgICAgICJcdTk5NTZcdTk5NTdcdTk5NThcdTk5NTlcdTk5NUFcdTk5NUJcdTk5NUNcdTk5NUQiKwotICAgICAgICAiXHU5OTYxXHU5OTYyXHU5OTYzXHU5OTY0XHU5OTY1XHU5OTY2XHU5OTY3XHU5OTY4IisKLSAgICAgICAgIlx1OTk2OVx1OTk2QVx1OTk2Qlx1OTk2Q1x1OTk2RFx1OTk2RVx1OTk2Rlx1OTk3MCIrCi0gICAgICAgICJcdTk5NzFcdTk5NzNcdTk5NzRcdTk5NzVcdTk5NzZcdTk5NzdcdTk5NzhcdTk5NzkiKwotICAgICAgICAiXHU5OTdBXHU5OTdCXHU5OTdDXHU5OTdEXHU5OTgxXHU5OTgyXHU5OTgzXHU5OTg0IisKLSAgICAgICAgIlx1OTk4NVx1OTk4Nlx1OTk4N1x1OTk4OFx1OTk4OVx1OTk4QVx1OTk4Qlx1OTk4QyIrCi0gICAgICAgICJcdTk5OERcdTk5OEVcdTk5OEZcdTk5OTBcdTk5OTFcdTk5OTNcdTk5OTRcdTk5OTUiKwotICAgICAgICAiXHU5OTk2XHU5OTk3XHU5OTk4XHU5OTk5XHU5OTlBXHU5OTlCXHU5OTlDXHU5OTlEIisKLSAgICAgICAgIlx1OTlBMVx1OTlBMlx1OTlBM1x1OTlBNFx1OTlBNVx1OTlBNlx1OTlBN1x1OTlBOCIrCi0gICAgICAgICJcdTk5QTlcdTk5QUFcdTk5QUJcdTk5QUNcdTk5QURcdTk5QUVcdTk5QUZcdTk5QjAiKwotICAgICAgICAiXHU5OUIxXHU5OUIzXHU5OUI0XHU5OUI1XHU5OUI2XHU5OUI3XHU5OUI4XHU5OUI5IisKLSAgICAgICAgIlx1OTlCQVx1OTlCQlx1OTlCQ1x1OTlCRFx1OTlDMVx1OTlDMlx1OTlDM1x1OTlDNCIrCi0gICAgICAgICJcdTk5QzVcdTk5QzZcdTk5QzdcdTk5QzhcdTk5QzlcdTk5Q0FcdTk5Q0JcdTk5Q0MiKwotICAgICAgICAiXHU5OUNEXHU5OUNFXHU5OUNGXHU5OUQwXHU5OUQxXHU5OUQzXHU5OUQ0XHU5OUQ1IisKLSAgICAgICAgIlx1OTlENlx1OTlEN1x1OTlEOFx1OTlEOVx1OTlEQVx1OTlEQlx1OTlEQ1x1OTlERCIrCi0gICAgICAgICJcdTk5RTFcdTk5RTJcdTk5RTNcdTk5RTRcdTk5RTVcdTk5RTZcdTk5RTdcdTk5RTgiKwotICAgICAgICAiXHU5OUU5XHU5OUVBXHU5OUVCXHU5OUVDXHU5OUVEXHU5OUVFXHU5OUVGXHU5OUYwIisKLSAgICAgICAgIlx1OTlGMVx1OTlGM1x1OTlGNFx1OTlGNVx1OTlGNlx1OTlGN1x1OTlGOFx1OTlGOSIrCi0gICAgICAgICJcdTk5RkFcdTk5RkJcdTk5RkNcdTk5RkRcdTlBNDFcdTlBNDJcdTlBNDNcdTlBNDQiKwotICAgICAgICAiXHU5QTQ1XHU5QTQ2XHU5QTQ3XHU5QTQ4XHU5QTQ5XHU5QTRBXHU5QTRCXHU5QTRDIisKLSAgICAgICAgIlx1OUE0RFx1OUE0RVx1OUE0Rlx1OUE1MFx1OUE1MVx1OUE1M1x1OUE1NFx1OUE1NSIrCi0gICAgICAgICJcdTlBNTZcdTlBNTdcdTlBNThcdTlBNTlcdTlBNUFcdTlBNUJcdTlBNUNcdTlBNUQiKwotICAgICAgICAiXHU5QTYxXHU5QTYyXHU5QTYzXHU5QTY0XHU5QTY1XHU5QTY2XHU5QTY3XHU5QTY4IisKLSAgICAgICAgIlx1OUE2OVx1OUE2QVx1OUE2Qlx1OUE2Q1x1OUE2RFx1OUE2RVx1OUE2Rlx1OUE3MCIrCi0gICAgICAgICJcdTlBNzFcdTlBNzNcdTlBNzRcdTlBNzVcdTlBNzZcdTlBNzdcdTlBNzhcdTlBNzkiKwotICAgICAgICAiXHU5QTdBXHU5QTdCXHU5QTdDXHU5QTdEXHU5QTgxXHU5QTgyXHU5QTgzXHU5QTg0IisKLSAgICAgICAgIlx1OUE4NVx1OUE4Nlx1OUE4N1x1OUE4OFx1OUE4OVx1OUE4QVx1OUE4Qlx1OUE4QyIrCi0gICAgICAgICJcdTlBOERcdTlBOEVcdTlBOEZcdTlBOTBcdTlBOTFcdTlBOTNcdTlBOTRcdTlBOTUiKwotICAgICAgICAiXHU5QTk2XHU5QTk3XHU5QTk4XHU5QTk5XHU5QTlBXHU5QTlCXHU5QTlDXHU5QTlEIisKLSAgICAgICAgIlx1OUFBMVx1OUFBMlx1OUFBM1x1OUFBNFx1OUFBNVx1OUFBNlx1OUFBN1x1OUFBOCIrCi0gICAgICAgICJcdTlBQTlcdTlBQUFcdTlBQUJcdTlBQUNcdTlBQURcdTlBQUVcdTlBQUZcdTlBQjAiKwotICAgICAgICAiXHU5QUIxXHU5QUIzXHU5QUI0XHU5QUI1XHU5QUI2XHU5QUI3XHU5QUI4XHU5QUI5IisKLSAgICAgICAgIlx1OUFCQVx1OUFCQlx1OUFCQ1x1OUFCRFx1OUFDMVx1OUFDMlx1OUFDM1x1OUFDNCIrCi0gICAgICAgICJcdTlBQzVcdTlBQzZcdTlBQzdcdTlBQzhcdTlBQzlcdTlBQ0FcdTlBQ0JcdTlBQ0MiKwotICAgICAgICAiXHU5QUNEXHU5QUNFXHU5QUNGXHU5QUQwXHU5QUQxXHU5QUQzXHU5QUQ0XHU5QUQ1IisKLSAgICAgICAgIlx1OUFENlx1OUFEN1x1OUFEOFx1OUFEOVx1OUFEQVx1OUFEQlx1OUFEQ1x1OUFERCIrCi0gICAgICAgICJcdTlBRTFcdTlBRTJcdTlBRTNcdTlBRTRcdTlBRTVcdTlBRTZcdTlBRTdcdTlBRTgiKwotICAgICAgICAiXHU5QUU5XHU5QUVBXHU5QUVCXHU5QUVDXHU5QUVEXHU5QUVFXHU5QUVGXHU5QUYwIisKLSAgICAgICAgIlx1OUFGMVx1OUFGM1x1OUFGNFx1OUFGNVx1OUFGNlx1OUFGN1x1OUFGOFx1OUFGOSIrCi0gICAgICAgICJcdTlBRkFcdTlBRkJcdTlBRkNcdTlBRkRcdTlCNDFcdTlCNDJcdTlCNDNcdTlCNDQiKwotICAgICAgICAiXHU5QjQ1XHU5QjQ2XHU5QjQ3XHU5QjQ4XHU5QjQ5XHU5QjRBXHU5QjRCXHU5QjRDIisKLSAgICAgICAgIlx1OUI0RFx1OUI0RVx1OUI0Rlx1OUI1MFx1OUI1MVx1OUI1M1x1OUI1NFx1OUI1NSIrCi0gICAgICAgICJcdTlCNTZcdTlCNTdcdTlCNThcdTlCNTlcdTlCNUFcdTlCNUJcdTlCNUNcdTlCNUQiKwotICAgICAgICAiXHU5QjYxXHU5QjYyXHU5QjYzXHU5QjY0XHU5QjY1XHU5QjY2XHU5QjY3XHU5QjY4IisKLSAgICAgICAgIlx1OUI2OVx1OUI2QVx1OUI2Qlx1OUI2Q1x1OUI2RFx1OUI2RVx1OUI2Rlx1OUI3MCIrCi0gICAgICAgICJcdTlCNzFcdTlCNzNcdTlCNzRcdTlCNzVcdTlCNzZcdTlCNzdcdTlCNzhcdTlCNzkiKwotICAgICAgICAiXHU5QjdBXHU5QjdCXHU5QjdDXHU5QjdEXHU5QjgxXHU5QjgyXHU5QjgzXHU5Qjg0IisKLSAgICAgICAgIlx1OUI4NVx1OUI4Nlx1OUI4N1x1OUI4OFx1OUI4OVx1OUI4QVx1OUI4Qlx1OUI4QyIrCi0gICAgICAgICJcdTlCOERcdTlCOEVcdTlCOEZcdTlCOTBcdTlCOTFcdTlCOTNcdTlCOTRcdTlCOTUiKwotICAgICAgICAiXHU5Qjk2XHU5Qjk3XHU5Qjk4XHU5Qjk5XHU5QjlBXHU5QjlCXHU5QjlDXHU5QjlEIisKLSAgICAgICAgIlx1OUJBMVx1OUJBMlx1OUJBM1x1OUJBNFx1OUJBNVx1OUJBNlx1OUJBN1x1OUJBOCIrCi0gICAgICAgICJcdTlCQTlcdTlCQUFcdTlCQUJcdTlCQUNcdTlCQURcdTlCQUVcdTlCQUZcdTlCQjAiKwotICAgICAgICAiXHU5QkIxXHU5QkIzXHU5QkI0XHU5QkI1XHU5QkI2XHU5QkI3XHU5QkI4XHU5QkI5IisKLSAgICAgICAgIlx1OUJCQVx1OUJCQlx1OUJCQ1x1OUJCRFx1OUM2MVx1OUM2Mlx1OUM2M1x1OUM2NCIrCi0gICAgICAgICJcdTlDNjVcdTlDNjZcdTlDNjdcdTlDNjhcdTlDNjlcdTlDNkFcdTlDNkJcdTlDNkMiKwotICAgICAgICAiXHU5QzZEXHU5QzZFXHU5QzZGXHU5QzcwXHU5QzcxXHU5QzczXHU5Qzc0XHU5Qzc1IisKLSAgICAgICAgIlx1OUM3Nlx1OUM3N1x1OUM3OFx1OUM3OVx1OUM3QVx1OUM3Qlx1OUM3Q1x1OUM3RCIrCi0gICAgICAgICJcdTlDODFcdTlDODJcdTlDODNcdTlDODRcdTlDODVcdTlDODZcdTlDODdcdTlDODgiKwotICAgICAgICAiXHU5Qzg5XHU5QzhBXHU5QzhCXHU5QzhDXHU5QzhEXHU5QzhFXHU5QzhGXHU5QzkwIisKLSAgICAgICAgIlx1OUM5MVx1OUM5M1x1OUM5NFx1OUM5NVx1OUM5Nlx1OUM5N1x1OUM5OFx1OUM5OSIrCi0gICAgICAgICJcdTlDOUFcdTlDOUJcdTlDOUNcdTlDOURcdTlDQTFcdTlDQTJcdTlDQTNcdTlDQTQiKwotICAgICAgICAiXHU5Q0E1XHU5Q0E2XHU5Q0E3XHU5Q0E4XHU5Q0E5XHU5Q0FBXHU5Q0FCXHU5Q0FDIisKLSAgICAgICAgIlx1OUNBRFx1OUNBRVx1OUNBRlx1OUNCMFx1OUNCMVx1OUNCM1x1OUNCNFx1OUNCNSIrCi0gICAgICAgICJcdTlDQjZcdTlDQjdcdTlDQjhcdTlDQjlcdTlDQkFcdTlDQkJcdTlDQkNcdTlDQkQiKwotICAgICAgICAiXHU5Q0MxXHU5Q0MyXHU5Q0MzXHU5Q0M0XHU5Q0M1XHU5Q0M2XHU5Q0M3XHU5Q0M4IisKLSAgICAgICAgIlx1OUNDOVx1OUNDQVx1OUNDQlx1OUNDQ1x1OUNDRFx1OUNDRVx1OUNDRlx1OUNEMCIrCi0gICAgICAgICJcdTlDRDFcdTlDRDNcdTlDRDRcdTlDRDVcdTlDRDZcdTlDRDdcdTlDRDhcdTlDRDkiKwotICAgICAgICAiXHU5Q0RBXHU5Q0RCXHU5Q0RDXHU5Q0REXHU5Q0UxXHU5Q0UyXHU5Q0UzXHU5Q0U0IisKLSAgICAgICAgIlx1OUNFNVx1OUNFNlx1OUNFN1x1OUNFOFx1OUNFOVx1OUNFQVx1OUNFQlx1OUNFQyIrCi0gICAgICAgICJcdTlDRURcdTlDRUVcdTlDRUZcdTlDRjBcdTlDRjFcdTlDRjNcdTlDRjRcdTlDRjUiKwotICAgICAgICAiXHU5Q0Y2XHU5Q0Y3XHU5Q0Y4XHU5Q0Y5XHU5Q0ZBXHU5Q0ZCXHU5Q0ZDXHU5Q0ZEIisKLSAgICAgICAgIlx1OUQ0MVx1OUQ0Mlx1OUQ0M1x1OUQ0NFx1OUQ0NVx1OUQ0Nlx1OUQ0N1x1OUQ0OCIrCi0gICAgICAgICJcdTlENDlcdTlENEFcdTlENEJcdTlENENcdTlENERcdTlENEVcdTlENEZcdTlENTAiKwotICAgICAgICAiXHU5RDUxXHU5RDUzXHU5RDU0XHU5RDU1XHU5RDU2XHU5RDU3XHU5RDU4XHU5RDU5IisKLSAgICAgICAgIlx1OUQ1QVx1OUQ1Qlx1OUQ1Q1x1OUQ1RFx1OUQ2MVx1OUQ2Mlx1OUQ2M1x1OUQ2NCIrCi0gICAgICAgICJcdTlENjVcdTlENjZcdTlENjdcdTlENjhcdTlENjlcdTlENkFcdTlENkJcdTlENkMiKwotICAgICAgICAiXHU5RDZEXHU5RDZFXHU5RDZGXHU5RDcwXHU5RDcxXHU5RDczXHU5RDc0XHU5RDc1IisKLSAgICAgICAgIlx1OUQ3Nlx1OUQ3N1x1OUQ3OFx1OUQ3OVx1OUQ3QVx1OUQ3Qlx1OUQ3Q1x1OUQ3RCIrCi0gICAgICAgICJcdTlEODFcdTlEODJcdTlEODNcdTlEODRcdTlEODVcdTlEODZcdTlEODdcdTlEODgiKwotICAgICAgICAiXHU5RDg5XHU5RDhBXHU5RDhCXHU5RDhDXHU5RDhEXHU5RDhFXHU5RDhGXHU5RDkwIisKLSAgICAgICAgIlx1OUQ5MVx1OUQ5M1x1OUQ5NFx1OUQ5NVx1OUQ5Nlx1OUQ5N1x1OUQ5OFx1OUQ5OSIrCi0gICAgICAgICJcdTlEOUFcdTlEOUJcdTlEOUNcdTlEOURcdTlEQTFcdTlEQTJcdTlEQTNcdTlEQTQiKwotICAgICAgICAiXHU5REE1XHU5REE2XHU5REE3XHU5REE4XHU5REE5XHU5REFBXHU5REFCXHU5REFDIisKLSAgICAgICAgIlx1OURBRFx1OURBRVx1OURBRlx1OURCMFx1OURCMVx1OURCM1x1OURCNFx1OURCNSIrCi0gICAgICAgICJcdTlEQjZcdTlEQjdcdTlEQjhcdTlEQjlcdTlEQkFcdTlEQkJcdTlEQkNcdTlEQkQiKwotICAgICAgICAiXHU5REMxXHU5REMyXHU5REMzXHU5REM0XHU5REM1XHU5REM2XHU5REM3XHU5REM4IisKLSAgICAgICAgIlx1OURDOVx1OURDQVx1OURDQlx1OURDQ1x1OURDRFx1OURDRVx1OURDRlx1OUREMCIrCi0gICAgICAgICJcdTlERDFcdTlERDNcdTlERDRcdTlERDVcdTlERDZcdTlERDdcdTlERDhcdTlERDkiKwotICAgICAgICAiXHU5RERBXHU5RERCXHU5RERDXHU5REREXHU5REUxXHU5REUyXHU5REUzXHU5REU0IisKLSAgICAgICAgIlx1OURFNVx1OURFNlx1OURFN1x1OURFOFx1OURFOVx1OURFQVx1OURFQlx1OURFQyIrCi0gICAgICAgICJcdTlERURcdTlERUVcdTlERUZcdTlERjBcdTlERjFcdTlERjNcdTlERjRcdTlERjUiKwotICAgICAgICAiXHU5REY2XHU5REY3XHU5REY4XHU5REY5XHU5REZBXHU5REZCXHU5REZDXHU5REZEIisKLSAgICAgICAgIlx1OUU0MVx1OUU0Mlx1OUU0M1x1OUU0NFx1OUU0NVx1OUU0Nlx1OUU0N1x1OUU0OCIrCi0gICAgICAgICJcdTlFNDlcdTlFNEFcdTlFNEJcdTlFNENcdTlFNERcdTlFNEVcdTlFNEZcdTlFNTAiKwotICAgICAgICAiXHU5RTUxXHU5RTUzXHU5RTU0XHU5RTU1XHU5RTU2XHU5RTU3XHU5RTU4XHU5RTU5IisKLSAgICAgICAgIlx1OUU1QVx1OUU1Qlx1OUU1Q1x1OUU1RFx1OUU2MVx1OUU2Mlx1OUU2M1x1OUU2NCIrCi0gICAgICAgICJcdTlFNjVcdTlFNjZcdTlFNjdcdTlFNjhcdTlFNjlcdTlFNkFcdTlFNkJcdTlFNkMiKwotICAgICAgICAiXHU5RTZEXHU5RTZFXHU5RTZGXHU5RTcwXHU5RTcxXHU5RTczXHU5RTc0XHU5RTc1IisKLSAgICAgICAgIlx1OUU3Nlx1OUU3N1x1OUU3OFx1OUU3OVx1OUU3QVx1OUU3Qlx1OUU3Q1x1OUU3RCIrCi0gICAgICAgICJcdTlFODFcdTlFODJcdTlFODNcdTlFODRcdTlFODVcdTlFODZcdTlFODdcdTlFODgiKwotICAgICAgICAiXHU5RTg5XHU5RThBXHU5RThCXHU5RThDXHU5RThEXHU5RThFXHU5RThGXHU5RTkwIisKLSAgICAgICAgIlx1OUU5MVx1OUU5M1x1OUU5NFx1OUU5NVx1OUU5Nlx1OUU5N1x1OUU5OFx1OUU5OSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaW5uZXJJbmRleDc9Ci0gICAgICAgICJcdTlFOUFcdTlFOUJcdTlFOUNcdTlFOURcdTlFQTFcdTlFQTJcdTlFQTNcdTlFQTQiKwotICAgICAgICAiXHU5RUE1XHU5RUE2XHU5RUE3XHU5RUE4XHU5RUE5XHU5RUFBXHU5RUFCXHU5RUFDIisKLSAgICAgICAgIlx1OUVBRFx1OUVBRVx1OUVBRlx1OUVCMFx1OUVCMVx1OUVCM1x1OUVCNFx1OUVCNSIrCi0gICAgICAgICJcdTlFQjZcdTlFQjdcdTlFQjhcdTlFQjlcdTlFQkFcdTlFQkJcdTlFQkNcdTlFQkQiKwotICAgICAgICAiXHU5RUMxXHU5RUMyXHU5RUMzXHU5RUM0XHU5RUM1XHU5RUM2XHU5RUM3XHU5RUM4IisKLSAgICAgICAgIlx1OUVDOVx1OUVDQVx1OUVDQlx1OUVDQ1x1OUVDRFx1OUVDRVx1OUVDRlx1OUVEMCIrCi0gICAgICAgICJcdTlFRDFcdTlFRDNcdTlFRDRcdTlFRDVcdTlFRDZcdTlFRDdcdTlFRDhcdTlFRDkiKwotICAgICAgICAiXHU5RURBXHU5RURCXHU5RURDXHU5RUREXHU5RUUxXHU5RUUyXHU5RUUzXHU5RUU0IisKLSAgICAgICAgIlx1OUVFNVx1OUVFNlx1OUVFN1x1OUVFOFx1OUVFOVx1OUVFQVx1OUVFQlx1OUVFQyIrCi0gICAgICAgICJcdTlFRURcdTlFRUVcdTlFRUZcdTlFRjBcdTlFRjFcdTlFRjNcdTlFRjRcdTlFRjUiKwotICAgICAgICAiXHU5RUY2XHU5RUY3XHU5RUY4XHU5RUY5XHU5RUZBXHU5RUZCXHU5RUZDXHU5RUZEIisKLSAgICAgICAgIlx1OUY0MVx1OUY0Mlx1OUY0M1x1OUY0NFx1OUY0NVx1OUY0Nlx1OUY0N1x1OUY0OCIrCi0gICAgICAgICJcdTlGNDlcdTlGNEFcdTlGNEJcdTlGNENcdTlGNERcdTlGNEVcdTlGNEZcdTlGNTAiKwotICAgICAgICAiXHU5RjUxXHU5RjUzXHU5RjU0XHU5RjU1XHU5RjU2XHU5RjU3XHU5RjU4XHU5RjU5IisKLSAgICAgICAgIlx1OUY1QVx1OUY1Qlx1OUY1Q1x1OUY1RFx1OUY2MVx1OUY2Mlx1OUY2M1x1OUY2NCIrCi0gICAgICAgICJcdTlGNjVcdTlGNjZcdTlGNjdcdTlGNjhcdTlGNjlcdTlGNkFcdTlGNkJcdTlGNkMiKwotICAgICAgICAiXHU5RjZEXHU5RjZFXHU5RjZGXHU5RjcwXHU5RjcxXHU5RjczXHU5Rjc0XHU5Rjc1IisKLSAgICAgICAgIlx1OUY3Nlx1OUY3N1x1OUY3OFx1OUY3OVx1OUY3QVx1OUY3Qlx1OUY3Q1x1OUY3RCIrCi0gICAgICAgICJcdTlGODFcdTlGODJcdTlGODNcdTlGODRcdTlGODVcdTlGODZcdTlGODdcdTlGODgiKwotICAgICAgICAiXHU5Rjg5XHU5RjhBXHU5RjhCXHU5RjhDXHU5RjhEXHU5RjhFXHU5RjhGXHU5RjkwIisKLSAgICAgICAgIlx1OUY5MVx1OUY5M1x1OUY5NFx1OUY5NVx1OUY5Nlx1OUY5N1x1OUY5OFx1OUY5OSIrCi0gICAgICAgICJcdTlGOUFcdTlGOUJcdTlGOUNcdTlGOURcdTlGQTFcdTlGQTJcdTlGQTNcdTlGQTQiKwotICAgICAgICAiXHU5RkE1XHU5RkE2XHU5RkE3XHU5RkE4XHU5RkE5XHU5RkFBXHU5RkFCXHU5RkFDIisKLSAgICAgICAgIlx1OUZBRFx1OUZBRVx1OUZBRlx1OUZCMFx1OUZCMVx1OUZCM1x1OUZCNFx1OUZCNSIrCi0gICAgICAgICJcdTlGQjZcdTlGQjdcdTlGQjhcdTlGQjlcdTlGQkFcdTlGQkJcdTlGQkNcdTlGQkQiKwotICAgICAgICAiXHVBMDYxXHVBMDYyXHVBMDYzXHVBMDY0XHVBMDY1XHVBMDY2XHVBMDY3XHVBMDY4IisKLSAgICAgICAgIlx1QTA2OVx1QTA2QVx1QTA2Qlx1QTA2Q1x1QTA2RFx1QTA2RVx1QTA2Rlx1QTA3MCIrCi0gICAgICAgICJcdUEwNzFcdUEwNzNcdUEwNzRcdUEwNzVcdUEwNzZcdUEwNzdcdUEwNzhcdUEwNzkiKwotICAgICAgICAiXHVBMDdBXHVBMDdCXHVBMDdDXHVBMDdEXHVBMDgxXHVBMDgyXHVBMDgzXHVBMDg0IisKLSAgICAgICAgIlx1QTA4NVx1QTA4Nlx1QTA4N1x1QTA4OFx1QTA4OVx1QTA4QVx1QTA4Qlx1QTA4QyIrCi0gICAgICAgICJcdUEwOERcdUEwOEVcdUEwOEZcdUEwOTBcdUEwOTFcdUEwOTNcdUEwOTRcdUEwOTUiKwotICAgICAgICAiXHVBMDk2XHVBMDk3XHVBMDk4XHVBMDk5XHVBMDlBXHVBMDlCXHVBMDlDXHVBMDlEIisKLSAgICAgICAgIlx1QTBBMVx1QTBBMlx1QTBBM1x1QTBBNFx1QTBBNVx1QTBBNlx1QTBBN1x1QTBBOCIrCi0gICAgICAgICJcdUEwQTlcdUEwQUFcdUEwQUJcdUEwQUNcdUEwQURcdUEwQUVcdUEwQUZcdUEwQjAiKwotICAgICAgICAiXHVBMEIxXHVBMEIzXHVBMEI0XHVBMEI1XHVBMEI2XHVBMEI3XHVBMEI4XHVBMEI5IisKLSAgICAgICAgIlx1QTBCQVx1QTBCQlx1QTBCQ1x1QTBCRFx1QTBDMVx1QTBDMlx1QTBDM1x1QTBDNCIrCi0gICAgICAgICJcdUEwQzVcdUEwQzZcdUEwQzdcdUEwQzhcdUEwQzlcdUEwQ0FcdUEwQ0JcdUEwQ0MiKwotICAgICAgICAiXHVBMENEXHVBMENFXHVBMENGXHVBMEQwXHVBMEQxXHVBMEQzXHVBMEQ0XHVBMEQ1IisKLSAgICAgICAgIlx1QTBENlx1QTBEN1x1QTBEOFx1QTBEOVx1QTBEQVx1QTBEQlx1QTBEQ1x1QTBERCIrCi0gICAgICAgICJcdUEwRTFcdUEwRTJcdUEwRTNcdUEwRTRcdUEwRTVcdUEwRTZcdUEwRTdcdUEwRTgiKwotICAgICAgICAiXHVBMEU5XHVBMEVBXHVBMEVCXHVBMEVDXHVBMEVEXHVBMEVFXHVBMEVGXHVBMEYwIisKLSAgICAgICAgIlx1QTBGMVx1QTBGM1x1QTBGNFx1QTBGNVx1QTBGNlx1QTBGN1x1QTBGOFx1QTBGOSIrCi0gICAgICAgICJcdUEwRkFcdUEwRkJcdUEwRkNcdUEwRkRcdUExNDFcdUExNDJcdUExNDNcdUExNDQiKwotICAgICAgICAiXHVBMTQ1XHVBMTQ2XHVBMTQ3XHVBMTQ4XHVBMTQ5XHVBMTRBXHVBMTRCXHVBMTRDIisKLSAgICAgICAgIlx1QTE0RFx1QTE0RVx1QTE0Rlx1QTE1MFx1QTE1MVx1QTE1M1x1QTE1NFx1QTE1NSIrCi0gICAgICAgICJcdUExNTZcdUExNTdcdUExNThcdUExNTlcdUExNUFcdUExNUJcdUExNUNcdUExNUQiKwotICAgICAgICAiXHVBMTYxXHVBMTYyXHVBMTYzXHVBMTY0XHVBMTY1XHVBMTY2XHVBMTY3XHVBMTY4IisKLSAgICAgICAgIlx1QTE2OVx1QTE2QVx1QTE2Qlx1QTE2Q1x1QTE2RFx1QTE2RVx1QTE2Rlx1QTE3MCIrCi0gICAgICAgICJcdUExNzFcdUExNzNcdUExNzRcdUExNzVcdUExNzZcdUExNzdcdUExNzhcdUExNzkiKwotICAgICAgICAiXHVBMTdBXHVBMTdCXHVBMTdDXHVBMTdEXHVBMTgxXHVBMTgyXHVBMTgzXHVBMTg0IisKLSAgICAgICAgIlx1QTE4NVx1QTE4Nlx1QTE4N1x1QTE4OFx1QTE4OVx1QTE4QVx1QTE4Qlx1QTE4QyIrCi0gICAgICAgICJcdUExOERcdUExOEVcdUExOEZcdUExOTBcdUExOTFcdUExOTNcdUExOTRcdUExOTUiKwotICAgICAgICAiXHVBMTk2XHVBMTk3XHVBMTk4XHVBMTk5XHVBMTlBXHVBMTlCXHVBMTlDXHVBMTlEIisKLSAgICAgICAgIlx1QTFBMVx1QTFBMlx1QTFBM1x1QTFBNFx1QTFBNVx1QTFBNlx1QTFBN1x1QTFBOCIrCi0gICAgICAgICJcdUExQTlcdUExQUFcdUExQUJcdUExQUNcdUExQURcdUExQUVcdUExQUZcdUExQjAiKwotICAgICAgICAiXHVBMUIxXHVBMUIzXHVBMUI0XHVBMUI1XHVBMUI2XHVBMUI3XHVBMUI4XHVBMUI5IisKLSAgICAgICAgIlx1QTFCQVx1QTFCQlx1QTFCQ1x1QTFCRFx1QTFDMVx1QTFDMlx1QTFDM1x1QTFDNCIrCi0gICAgICAgICJcdUExQzVcdUExQzZcdUExQzdcdUExQzhcdUExQzlcdUExQ0FcdUExQ0JcdUExQ0MiKwotICAgICAgICAiXHVBMUNEXHVBMUNFXHVBMUNGXHVBMUQwXHVBMUQxXHVBMUQzXHVBMUQ0XHVBMUQ1IisKLSAgICAgICAgIlx1QTFENlx1QTFEN1x1QTFEOFx1QTFEOVx1QTFEQVx1QTFEQlx1QTFEQ1x1QTFERCIrCi0gICAgICAgICJcdUExRTFcdUExRTJcdUExRTNcdUExRTRcdUExRTVcdUExRTZcdUExRTdcdUExRTgiKwotICAgICAgICAiXHVBMUU5XHVBMUVBXHVBMUVCXHVBMUVDXHVBMUVEXHVBMUVFXHVBMUVGXHVBMUYwIisKLSAgICAgICAgIlx1QTFGMVx1QTFGM1x1QTFGNFx1QTFGNVx1QTFGNlx1QTFGN1x1QTFGOFx1QTFGOSIrCi0gICAgICAgICJcdUExRkFcdUExRkJcdUExRkNcdUExRkRcdUEyNDFcdUEyNDJcdUEyNDNcdUEyNDQiKwotICAgICAgICAiXHVBMjQ1XHVBMjQ2XHVBMjQ3XHVBMjQ4XHVBMjQ5XHVBMjRBXHVBMjRCXHVBMjRDIisKLSAgICAgICAgIlx1QTI0RFx1QTI0RVx1QTI0Rlx1QTI1MFx1QTI1MVx1QTI1M1x1QTI1NFx1QTI1NSIrCi0gICAgICAgICJcdUEyNTZcdUEyNTdcdUEyNThcdUEyNTlcdUEyNUFcdUEyNUJcdUEyNUNcdUEyNUQiKwotICAgICAgICAiXHVBMjYxXHVBMjYyXHVBMjYzXHVBMjY0XHVBMjY1XHVBMjY2XHVBMjY3XHVBMjY4IisKLSAgICAgICAgIlx1QTI2OVx1QTI2QVx1QTI2Qlx1QTI2Q1x1QTI2RFx1QTI2RVx1QTI2Rlx1QTI3MCIrCi0gICAgICAgICJcdUEyNzFcdUEyNzNcdUEyNzRcdUEyNzVcdUEyNzZcdUEyNzdcdUEyNzhcdUEyNzkiKwotICAgICAgICAiXHVBMjdBXHVBMjdCXHVBMjdDXHVBMjdEXHVBMjgxXHVBMjgyXHVBMjgzXHVBMjg0IisKLSAgICAgICAgIlx1QTI4NVx1QTI4Nlx1QTI4N1x1QTI4OFx1QTI4OVx1QTI4QVx1QTI4Qlx1QTI4QyIrCi0gICAgICAgICJcdUEyOERcdUEyOEVcdUEyOEZcdUEyOTBcdUEyOTFcdUEyOTNcdUEyOTRcdUEyOTUiKwotICAgICAgICAiXHVBMjk2XHVBMjk3XHVBMjk4XHVBMjk5XHVBMjlBXHVBMjlCXHVBMjlDXHVBMjlEIisKLSAgICAgICAgIlx1QTJBMVx1QTJBMlx1QTJBM1x1QTJBNFx1QTJBNVx1QTJBNlx1QTJBN1x1QTJBOCIrCi0gICAgICAgICJcdUEyQTlcdUEyQUFcdUEyQUJcdUEyQUNcdUEyQURcdUEyQUVcdUEyQUZcdUEyQjAiKwotICAgICAgICAiXHVBMkIxXHVBMkIzXHVBMkI0XHVBMkI1XHVBMkI2XHVBMkI3XHVBMkI4XHVBMkI5IisKLSAgICAgICAgIlx1QTJCQVx1QTJCQlx1QTJCQ1x1QTJCRFx1QTJDMVx1QTJDMlx1QTJDM1x1QTJDNCIrCi0gICAgICAgICJcdUEyQzVcdUEyQzZcdUEyQzdcdUEyQzhcdUEyQzlcdUEyQ0FcdUEyQ0JcdUEyQ0MiKwotICAgICAgICAiXHVBMkNEXHVBMkNFXHVBMkNGXHVBMkQwXHVBMkQxXHVBMkQzXHVBMkQ0XHVBMkQ1IisKLSAgICAgICAgIlx1QTJENlx1QTJEN1x1QTJEOFx1QTJEOVx1QTJEQVx1QTJEQlx1QTJEQ1x1QTJERCIrCi0gICAgICAgICJcdUEyRTFcdUEyRTJcdUEyRTNcdUEyRTRcdUEyRTVcdUEyRTZcdUEyRTdcdUEyRTgiKwotICAgICAgICAiXHVBMkU5XHVBMkVBXHVBMkVCXHVBMkVDXHVBMkVEXHVBMkVFXHVBMkVGXHVBMkYwIisKLSAgICAgICAgIlx1QTJGMVx1QTJGM1x1QTJGNFx1QTJGNVx1QTJGNlx1QTJGN1x1QTJGOFx1QTJGOSIrCi0gICAgICAgICJcdUEyRkFcdUEyRkJcdUEyRkNcdUEyRkRcdUEzNDFcdUEzNDJcdUEzNDNcdUEzNDQiKwotICAgICAgICAiXHVBMzQ1XHVBMzQ2XHVBMzQ3XHVBMzQ4XHVBMzQ5XHVBMzRBXHVBMzRCXHVBMzRDIisKLSAgICAgICAgIlx1QTM0RFx1QTM0RVx1QTM0Rlx1QTM1MFx1QTM1MVx1QTM1M1x1QTM1NFx1QTM1NSIrCi0gICAgICAgICJcdUEzNTZcdUEzNTdcdUEzNThcdUEzNTlcdUEzNUFcdUEzNUJcdUEzNUNcdUEzNUQiKwotICAgICAgICAiXHVBMzYxXHVBMzYyXHVBMzYzXHVBMzY0XHVBMzY1XHVBMzY2XHVBMzY3XHVBMzY4IisKLSAgICAgICAgIlx1QTM2OVx1QTM2QVx1QTM2Qlx1QTM2Q1x1QTM2RFx1QTM2RVx1QTM2Rlx1QTM3MCIrCi0gICAgICAgICJcdUEzNzFcdUEzNzNcdUEzNzRcdUEzNzVcdUEzNzZcdUEzNzdcdUEzNzhcdUEzNzkiKwotICAgICAgICAiXHVBMzdBXHVBMzdCXHVBMzdDXHVBMzdEXHVBMzgxXHVBMzgyXHVBMzgzXHVBMzg0IisKLSAgICAgICAgIlx1QTM4NVx1QTM4Nlx1QTM4N1x1QTM4OFx1QTM4OVx1QTM4QVx1QTM4Qlx1QTM4QyIrCi0gICAgICAgICJcdUEzOERcdUEzOEVcdUEzOEZcdUEzOTBcdUEzOTFcdUEzOTNcdUEzOTRcdUEzOTUiKwotICAgICAgICAiXHVBMzk2XHVBMzk3XHVBMzk4XHVBMzk5XHVBMzlBXHVBMzlCXHVBMzlDXHVBMzlEIisKLSAgICAgICAgIlx1QTNBMVx1QTNBMlx1QTNBM1x1QTNBNFx1QTNBNVx1QTNBNlx1QTNBN1x1QTNBOCIrCi0gICAgICAgICJcdUEzQTlcdUEzQUFcdUEzQUJcdUEzQUNcdUEzQURcdUEzQUVcdUEzQUZcdUEzQjAiKwotICAgICAgICAiXHVBM0IxXHVBM0IzXHVBM0I0XHVBM0I1XHVBM0I2XHVBM0I3XHVBM0I4XHVBM0I5IisKLSAgICAgICAgIlx1QTNCQVx1QTNCQlx1QTNCQ1x1QTNCRFx1QTQ2MVx1QTQ2Mlx1QTQ2M1x1QTQ2NCIrCi0gICAgICAgICJcdUE0NjVcdUE0NjZcdUE0NjdcdUE0NjhcdUE0NjlcdUE0NkFcdUE0NkJcdUE0NkMiKwotICAgICAgICAiXHVBNDZEXHVBNDZFXHVBNDZGXHVBNDcwXHVBNDcxXHVBNDczXHVBNDc0XHVBNDc1IisKLSAgICAgICAgIlx1QTQ3Nlx1QTQ3N1x1QTQ3OFx1QTQ3OVx1QTQ3QVx1QTQ3Qlx1QTQ3Q1x1QTQ3RCIrCi0gICAgICAgICJcdUE0ODFcdUE0ODJcdUE0ODNcdUE0ODRcdUE0ODVcdUE0ODZcdUE0ODdcdUE0ODgiKwotICAgICAgICAiXHVBNDg5XHVBNDhBXHVBNDhCXHVBNDhDXHVBNDhEXHVBNDhFXHVBNDhGXHVBNDkwIisKLSAgICAgICAgIlx1QTQ5MVx1QTQ5M1x1QTQ5NFx1QTQ5NVx1QTQ5Nlx1QTQ5N1x1QTQ5OFx1QTQ5OSIrCi0gICAgICAgICJcdUE0OUFcdUE0OUJcdUE0OUNcdUE0OURcdUE0QTFcdUE0QTJcdUE0QTNcdUE0QTQiKwotICAgICAgICAiXHVBNEE1XHVBNEE2XHVBNEE3XHVBNEE4XHVBNEE5XHVBNEFBXHVBNEFCXHVBNEFDIisKLSAgICAgICAgIlx1QTRBRFx1QTRBRVx1QTRBRlx1QTRCMFx1QTRCMVx1QTRCM1x1QTRCNFx1QTRCNSIrCi0gICAgICAgICJcdUE0QjZcdUE0QjdcdUE0QjhcdUE0QjlcdUE0QkFcdUE0QkJcdUE0QkNcdUE0QkQiKwotICAgICAgICAiXHVBNEMxXHVBNEMyXHVBNEMzXHVBNEM0XHVBNEM1XHVBNEM2XHVBNEM3XHVBNEM4IisKLSAgICAgICAgIlx1QTRDOVx1QTRDQVx1QTRDQlx1QTRDQ1x1QTRDRFx1QTRDRVx1QTRDRlx1QTREMCIrCi0gICAgICAgICJcdUE0RDFcdUE0RDNcdUE0RDRcdUE0RDVcdUE0RDZcdUE0RDdcdUE0RDhcdUE0RDkiKwotICAgICAgICAiXHVBNERBXHVBNERCXHVBNERDXHVBNEREXHVBNEUxXHVBNEUyXHVBNEUzXHVBNEU0IisKLSAgICAgICAgIlx1QTRFNVx1QTRFNlx1QTRFN1x1QTRFOFx1QTRFOVx1QTRFQVx1QTRFQlx1QTRFQyIrCi0gICAgICAgICJcdUE0RURcdUE0RUVcdUE0RUZcdUE0RjBcdUE0RjFcdUE0RjNcdUE0RjRcdUE0RjUiKwotICAgICAgICAiXHVBNEY2XHVBNEY3XHVBNEY4XHVBNEY5XHVBNEZBXHVBNEZCXHVBNEZDXHVBNEZEIisKLSAgICAgICAgIlx1QTU0MVx1QTU0Mlx1QTU0M1x1QTU0NFx1QTU0NVx1QTU0Nlx1QTU0N1x1QTU0OCIrCi0gICAgICAgICJcdUE1NDlcdUE1NEFcdUE1NEJcdUE1NENcdUE1NERcdUE1NEVcdUE1NEZcdUE1NTAiKwotICAgICAgICAiXHVBNTUxXHVBNTUzXHVBNTU0XHVBNTU1XHVBNTU2XHVBNTU3XHVBNTU4XHVBNTU5IisKLSAgICAgICAgIlx1QTU1QVx1QTU1Qlx1QTU1Q1x1QTU1RFx1QTU2MVx1QTU2Mlx1QTU2M1x1QTU2NCIrCi0gICAgICAgICJcdUE1NjVcdUE1NjZcdUE1NjdcdUE1NjhcdUE1NjlcdUE1NkFcdUE1NkJcdUE1NkMiKwotICAgICAgICAiXHVBNTZEXHVBNTZFXHVBNTZGXHVBNTcwXHVBNTcxXHVBNTczXHVBNTc0XHVBNTc1IisKLSAgICAgICAgIlx1QTU3Nlx1QTU3N1x1QTU3OFx1QTU3OVx1QTU3QVx1QTU3Qlx1QTU3Q1x1QTU3RCIrCi0gICAgICAgICJcdUE1ODFcdUE1ODJcdUE1ODNcdUE1ODRcdUE1ODVcdUE1ODZcdUE1ODdcdUE1ODgiKwotICAgICAgICAiXHVBNTg5XHVBNThBXHVBNThCXHVBNThDXHVBNThEXHVBNThFXHVBNThGXHVBNTkwIisKLSAgICAgICAgIlx1QTU5MVx1QTU5M1x1QTU5NFx1QTU5NVx1QTU5Nlx1QTU5N1x1QTU5OFx1QTU5OSIrCi0gICAgICAgICJcdUE1OUFcdUE1OUJcdUE1OUNcdUE1OURcdUE1QTFcdUE1QTJcdUE1QTNcdUE1QTQiKwotICAgICAgICAiXHVBNUE1XHVBNUE2XHVBNUE3XHVBNUE4XHVBNUE5XHVBNUFBXHVBNUFCXHVBNUFDIisKLSAgICAgICAgIlx1QTVBRFx1QTVBRVx1QTVBRlx1QTVCMFx1QTVCMVx1QTVCM1x1QTVCNFx1QTVCNSIrCi0gICAgICAgICJcdUE1QjZcdUE1QjdcdUE1QjhcdUE1QjlcdUE1QkFcdUE1QkJcdUE1QkNcdUE1QkQiKwotICAgICAgICAiXHVBNUMxXHVBNUMyXHVBNUMzXHVBNUM0XHVBNUM1XHVBNUM2XHVBNUM3XHVBNUM4IisKLSAgICAgICAgIlx1QTVDOVx1QTVDQVx1QTVDQlx1QTVDQ1x1QTVDRFx1QTVDRVx1QTVDRlx1QTVEMCIrCi0gICAgICAgICJcdUE1RDFcdUE1RDNcdUE1RDRcdUE1RDVcdUE1RDZcdUE1RDdcdUE1RDhcdUE1RDkiKwotICAgICAgICAiXHVBNURBXHVBNURCXHVBNURDXHVBNUREXHVBNUUxXHVBNUUyXHVBNUUzXHVBNUU0IisKLSAgICAgICAgIlx1QTVFNVx1QTVFNlx1QTVFN1x1QTVFOFx1QTVFOVx1QTVFQVx1QTVFQlx1QTVFQyIrCi0gICAgICAgICJcdUE1RURcdUE1RUVcdUE1RUZcdUE1RjBcdUE1RjFcdUE1RjNcdUE1RjRcdUE1RjUiKwotICAgICAgICAiXHVBNUY2XHVBNUY3XHVBNUY4XHVBNUY5XHVBNUZBXHVBNUZCXHVBNUZDXHVBNUZEIisKLSAgICAgICAgIlx1QTY0MVx1QTY0Mlx1QTY0M1x1QTY0NFx1QTY0NVx1QTY0Nlx1QTY0N1x1QTY0OCIrCi0gICAgICAgICJcdUE2NDlcdUE2NEFcdUE2NEJcdUE2NENcdUE2NERcdUE2NEVcdUE2NEZcdUE2NTAiKwotICAgICAgICAiXHVBNjUxXHVBNjUzXHVBNjU0XHVBNjU1XHVBNjU2XHVBNjU3XHVBNjU4XHVBNjU5IisKLSAgICAgICAgIlx1QTY1QVx1QTY1Qlx1QTY1Q1x1QTY1RFx1QTY2MVx1QTY2Mlx1QTY2M1x1QTY2NCIrCi0gICAgICAgICJcdUE2NjVcdUE2NjZcdUE2NjdcdUE2NjhcdUE2NjlcdUE2NkFcdUE2NkJcdUE2NkMiKwotICAgICAgICAiXHVBNjZEXHVBNjZFXHVBNjZGXHVBNjcwXHVBNjcxXHVBNjczXHVBNjc0XHVBNjc1IisKLSAgICAgICAgIlx1QTY3Nlx1QTY3N1x1QTY3OFx1QTY3OVx1QTY3QVx1QTY3Qlx1QTY3Q1x1QTY3RCIrCi0gICAgICAgICJcdUE2ODFcdUE2ODJcdUE2ODNcdUE2ODRcdUE2ODVcdUE2ODZcdUE2ODdcdUE2ODgiKwotICAgICAgICAiXHVBNjg5XHVBNjhBXHVBNjhCXHVBNjhDXHVBNjhEXHVBNjhFXHVBNjhGXHVBNjkwIisKLSAgICAgICAgIlx1QTY5MVx1QTY5M1x1QTY5NFx1QTY5NVx1QTY5Nlx1QTY5N1x1QTY5OFx1QTY5OSIrCi0gICAgICAgICJcdUE2OUFcdUE2OUJcdUE2OUNcdUE2OURcdUE2QTFcdUE2QTJcdUE2QTNcdUE2QTQiKwotICAgICAgICAiXHVBNkE1XHVBNkE2XHVBNkE3XHVBNkE4XHVBNkE5XHVBNkFBXHVBNkFCXHVBNkFDIisKLSAgICAgICAgIlx1QTZBRFx1QTZBRVx1QTZBRlx1QTZCMFx1QTZCMVx1QTZCM1x1QTZCNFx1QTZCNSIrCi0gICAgICAgICJcdUE2QjZcdUE2QjdcdUE2QjhcdUE2QjlcdUE2QkFcdUE2QkJcdUE2QkNcdUE2QkQiKwotICAgICAgICAiXHVBNkMxXHVBNkMyXHVBNkMzXHVBNkM0XHVBNkM1XHVBNkM2XHVBNkM3XHVBNkM4IisKLSAgICAgICAgIlx1QTZDOVx1QTZDQVx1QTZDQlx1QTZDQ1x1QTZDRFx1QTZDRVx1QTZDRlx1QTZEMCIrCi0gICAgICAgICJcdUE2RDFcdUE2RDNcdUE2RDRcdUE2RDVcdUE2RDZcdUE2RDdcdUE2RDhcdUE2RDkiKwotICAgICAgICAiXHVBNkRBXHVBNkRCXHVBNkRDXHVBNkREXHVBNkUxXHVBNkUyXHVBNkUzXHVBNkU0IisKLSAgICAgICAgIlx1QTZFNVx1QTZFNlx1QTZFN1x1QTZFOFx1QTZFOVx1QTZFQVx1QTZFQlx1QTZFQyIrCi0gICAgICAgICJcdUE2RURcdUE2RUVcdUE2RUZcdUE2RjBcdUE2RjFcdUE2RjNcdUE2RjRcdUE2RjUiKwotICAgICAgICAiXHVBNkY2XHVBNkY3XHVBNkY4XHVBNkY5XHVBNkZBXHVBNkZCXHVBNkZDXHVBNkZEIisKLSAgICAgICAgIlx1QTc0MVx1QTc0Mlx1QTc0M1x1QTc0NFx1QTc0NVx1QTc0Nlx1QTc0N1x1QTc0OCIrCi0gICAgICAgICJcdUE3NDlcdUE3NEFcdUE3NEJcdUE3NENcdUE3NERcdUE3NEVcdUE3NEZcdUE3NTAiKwotICAgICAgICAiXHVBNzUxXHVBNzUzXHVBNzU0XHVBNzU1XHVBNzU2XHVBNzU3XHVBNzU4XHVBNzU5IisKLSAgICAgICAgIlx1QTc1QVx1QTc1Qlx1QTc1Q1x1QTc1RFx1QTc2MVx1QTc2Mlx1QTc2M1x1QTc2NCIrCi0gICAgICAgICJcdUE3NjVcdUE3NjZcdUE3NjdcdUE3NjhcdUE3NjlcdUE3NkFcdUE3NkJcdUE3NkMiKwotICAgICAgICAiXHVBNzZEXHVBNzZFXHVBNzZGXHVBNzcwXHVBNzcxXHVBNzczXHVBNzc0XHVBNzc1IisKLSAgICAgICAgIlx1QTc3Nlx1QTc3N1x1QTc3OFx1QTc3OVx1QTc3QVx1QTc3Qlx1QTc3Q1x1QTc3RCIrCi0gICAgICAgICJcdUE3ODFcdUE3ODJcdUE3ODNcdUE3ODRcdUE3ODVcdUE3ODZcdUE3ODdcdUE3ODgiKwotICAgICAgICAiXHVBNzg5XHVBNzhBXHVBNzhCXHVBNzhDXHVBNzhEXHVBNzhFXHVBNzhGXHVBNzkwIisKLSAgICAgICAgIlx1QTc5MVx1QTc5M1x1QTc5NFx1QTc5NVx1QTc5Nlx1QTc5N1x1QTc5OFx1QTc5OSIrCi0gICAgICAgICJcdUE3OUFcdUE3OUJcdUE3OUNcdUE3OURcdUE3QTFcdUE3QTJcdUE3QTNcdUE3QTQiKwotICAgICAgICAiXHVBN0E1XHVBN0E2XHVBN0E3XHVBN0E4XHVBN0E5XHVBN0FBXHVBN0FCXHVBN0FDIisKLSAgICAgICAgIlx1QTdBRFx1QTdBRVx1QTdBRlx1QTdCMFx1QTdCMVx1QTdCM1x1QTdCNFx1QTdCNSIrCi0gICAgICAgICJcdUE3QjZcdUE3QjdcdUE3QjhcdUE3QjlcdUE3QkFcdUE3QkJcdUE3QkNcdUE3QkQiKwotICAgICAgICAiXHVBODYxXHVBODYyXHVBODYzXHVBODY0XHVBODY1XHVBODY2XHVBODY3XHVBODY4IisKLSAgICAgICAgIlx1QTg2OVx1QTg2QVx1QTg2Qlx1QTg2Q1x1QTg2RFx1QTg2RVx1QTg2Rlx1QTg3MCIrCi0gICAgICAgICJcdUE4NzFcdUE4NzNcdUE4NzRcdUE4NzVcdUE4NzZcdUE4NzdcdUE4NzhcdUE4NzkiKwotICAgICAgICAiXHVBODdBXHVBODdCXHVBODdDXHVBODdEXHVBODgxXHVBODgyXHVBODgzXHVBODg0IisKLSAgICAgICAgIlx1QTg4NVx1QTg4Nlx1QTg4N1x1QTg4OFx1QTg4OVx1QTg4QVx1QTg4Qlx1QTg4QyIrCi0gICAgICAgICJcdUE4OERcdUE4OEVcdUE4OEZcdUE4OTBcdUE4OTFcdUE4OTNcdUE4OTRcdUE4OTUiKwotICAgICAgICAiXHVBODk2XHVBODk3XHVBODk4XHVBODk5XHVBODlBXHVBODlCXHVBODlDXHVBODlEIisKLSAgICAgICAgIlx1QThBMVx1QThBMlx1QThBM1x1QThBNFx1QThBNVx1QThBNlx1QThBN1x1QThBOCIrCi0gICAgICAgICJcdUE4QTlcdUE4QUFcdUE4QUJcdUE4QUNcdUE4QURcdUE4QUVcdUE4QUZcdUE4QjAiKwotICAgICAgICAiXHVBOEIxXHVBOEIzXHVBOEI0XHVBOEI1XHVBOEI2XHVBOEI3XHVBOEI4XHVBOEI5IisKLSAgICAgICAgIlx1QThCQVx1QThCQlx1QThCQ1x1QThCRFx1QThDMVx1QThDMlx1QThDM1x1QThDNCIrCi0gICAgICAgICJcdUE4QzVcdUE4QzZcdUE4QzdcdUE4QzhcdUE4QzlcdUE4Q0FcdUE4Q0JcdUE4Q0MiKwotICAgICAgICAiXHVBOENEXHVBOENFXHVBOENGXHVBOEQwXHVBOEQxXHVBOEQzXHVBOEQ0XHVBOEQ1IisKLSAgICAgICAgIlx1QThENlx1QThEN1x1QThEOFx1QThEOVx1QThEQVx1QThEQlx1QThEQ1x1QThERCIrCi0gICAgICAgICJcdUE4RTFcdUE4RTJcdUE4RTNcdUE4RTRcdUE4RTVcdUE4RTZcdUE4RTdcdUE4RTgiKwotICAgICAgICAiXHVBOEU5XHVBOEVBXHVBOEVCXHVBOEVDXHVBOEVEXHVBOEVFXHVBOEVGXHVBOEYwIisKLSAgICAgICAgIlx1QThGMVx1QThGM1x1QThGNFx1QThGNVx1QThGNlx1QThGN1x1QThGOFx1QThGOSIrCi0gICAgICAgICJcdUE4RkFcdUE4RkJcdUE4RkNcdUE4RkRcdUE5NDFcdUE5NDJcdUE5NDNcdUE5NDQiKwotICAgICAgICAiXHVBOTQ1XHVBOTQ2XHVBOTQ3XHVBOTQ4XHVBOTQ5XHVBOTRBXHVBOTRCXHVBOTRDIisKLSAgICAgICAgIlx1QTk0RFx1QTk0RVx1QTk0Rlx1QTk1MFx1QTk1MVx1QTk1M1x1QTk1NFx1QTk1NSIrCi0gICAgICAgICJcdUE5NTZcdUE5NTdcdUE5NThcdUE5NTlcdUE5NUFcdUE5NUJcdUE5NUNcdUE5NUQiKwotICAgICAgICAiXHVBOTYxXHVBOTYyXHVBOTYzXHVBOTY0XHVBOTY1XHVBOTY2XHVBOTY3XHVBOTY4IisKLSAgICAgICAgIlx1QTk2OVx1QTk2QVx1QTk2Qlx1QTk2Q1x1QTk2RFx1QTk2RVx1QTk2Rlx1QTk3MCIrCi0gICAgICAgICJcdUE5NzFcdUE5NzNcdUE5NzRcdUE5NzVcdUE5NzZcdUE5NzdcdUE5NzhcdUE5NzkiKwotICAgICAgICAiXHVBOTdBXHVBOTdCXHVBOTdDXHVBOTdEXHVBOTgxXHVBOTgyXHVBOTgzXHVBOTg0IisKLSAgICAgICAgIlx1QTk4NVx1QTk4Nlx1QTk4N1x1QTk4OFx1QTk4OVx1QTk4QVx1QTk4Qlx1QTk4QyIrCi0gICAgICAgICJcdUE5OERcdUE5OEVcdUE5OEZcdUE5OTBcdUE5OTFcdUE5OTNcdUE5OTRcdUE5OTUiKwotICAgICAgICAiXHVBOTk2XHVBOTk3XHVBOTk4XHVBOTk5XHVBOTlBXHVBOTlCXHVBOTlDXHVBOTlEIisKLSAgICAgICAgIlx1QTlBMVx1QTlBMlx1QTlBM1x1QTlBNFx1QTlBNVx1QTlBNlx1QTlBN1x1QTlBOCIrCi0gICAgICAgICJcdUE5QTlcdUE5QUFcdUE5QUJcdUE5QUNcdUE5QURcdUE5QUVcdUE5QUZcdUE5QjAiKwotICAgICAgICAiXHVBOUIxXHVBOUIzXHVBOUI0XHVBOUI1XHVBOUI2XHVBOUI3XHVBOUI4XHVBOUI5IisKLSAgICAgICAgIlx1QTlCQVx1QTlCQlx1QTlCQ1x1QTlCRFx1QTlDMVx1QTlDMlx1QTlDM1x1QTlDNCIrCi0gICAgICAgICJcdUE5QzVcdUE5QzZcdUE5QzdcdUE5QzhcdUE5QzlcdUE5Q0FcdUE5Q0JcdUE5Q0MiKwotICAgICAgICAiXHVBOUNEXHVBOUNFXHVBOUNGXHVBOUQwXHVBOUQxXHVBOUQzXHVBOUQ0XHVBOUQ1IisKLSAgICAgICAgIlx1QTlENlx1QTlEN1x1QTlEOFx1QTlEOVx1QTlEQVx1QTlEQlx1QTlEQ1x1QTlERCIrCi0gICAgICAgICJcdUE5RTFcdUE5RTJcdUE5RTNcdUE5RTRcdUE5RTVcdUE5RTZcdUE5RTdcdUE5RTgiKwotICAgICAgICAiXHVBOUU5XHVBOUVBXHVBOUVCXHVBOUVDXHVBOUVEXHVBOUVFXHVBOUVGXHVBOUYwIisKLSAgICAgICAgIlx1QTlGMVx1QTlGM1x1QTlGNFx1QTlGNVx1QTlGNlx1QTlGN1x1QTlGOFx1QTlGOSIrCi0gICAgICAgICJcdUE5RkFcdUE5RkJcdUE5RkNcdUE5RkRcdUFBNDFcdUFBNDJcdUFBNDNcdUFBNDQiKwotICAgICAgICAiXHVBQTQ1XHVBQTQ2XHVBQTQ3XHVBQTQ4XHVBQTQ5XHVBQTRBXHVBQTRCXHVBQTRDIisKLSAgICAgICAgIlx1QUE0RFx1QUE0RVx1QUE0Rlx1QUE1MFx1QUE1MVx1QUE1M1x1QUE1NFx1QUE1NSIrCi0gICAgICAgICJcdUFBNTZcdUFBNTdcdUFBNThcdUFBNTlcdUFBNUFcdUFBNUJcdUFBNUNcdUFBNUQiKwotICAgICAgICAiXHVBQTYxXHVBQTYyXHVBQTYzXHVBQTY0XHVBQTY1XHVBQTY2XHVBQTY3XHVBQTY4IisKLSAgICAgICAgIlx1QUE2OVx1QUE2QVx1QUE2Qlx1QUE2Q1x1QUE2RFx1QUE2RVx1QUE2Rlx1QUE3MCIrCi0gICAgICAgICJcdUFBNzFcdUFBNzNcdUFBNzRcdUFBNzVcdUFBNzZcdUFBNzdcdUFBNzhcdUFBNzkiKwotICAgICAgICAiXHVBQTdBXHVBQTdCXHVBQTdDXHVBQTdEXHVBQTgxXHVBQTgyXHVBQTgzXHVBQTg0IisKLSAgICAgICAgIlx1QUE4NVx1QUE4Nlx1QUE4N1x1QUE4OFx1QUE4OVx1QUE4QVx1QUE4Qlx1QUE4QyIrCi0gICAgICAgICJcdUFBOERcdUFBOEVcdUFBOEZcdUFBOTBcdUFBOTFcdUFBOTNcdUFBOTRcdUFBOTUiKwotICAgICAgICAiXHVBQTk2XHVBQTk3XHVBQTk4XHVBQTk5XHVBQTlBXHVBQTlCXHVBQTlDXHVBQTlEIisKLSAgICAgICAgIlx1QUFBMVx1QUFBMlx1QUFBM1x1QUFBNFx1QUFBNVx1QUFBNlx1QUFBN1x1QUFBOCIrCi0gICAgICAgICJcdUFBQTlcdUFBQUFcdUFBQUJcdUFBQUNcdUFBQURcdUFBQUVcdUFBQUZcdUFBQjAiKwotICAgICAgICAiXHVBQUIxXHVBQUIzXHVBQUI0XHVBQUI1XHVBQUI2XHVBQUI3XHVBQUI4XHVBQUI5IisKLSAgICAgICAgIlx1QUFCQVx1QUFCQlx1QUFCQ1x1QUFCRFx1QUFDMVx1QUFDMlx1QUFDM1x1QUFDNCIrCi0gICAgICAgICJcdUFBQzVcdUFBQzZcdUFBQzdcdUFBQzhcdUFBQzlcdUFBQ0FcdUFBQ0JcdUFBQ0MiKwotICAgICAgICAiXHVBQUNEXHVBQUNFXHVBQUNGXHVBQUQwXHVBQUQxXHVBQUQzXHVBQUQ0XHVBQUQ1IisKLSAgICAgICAgIlx1QUFENlx1QUFEN1x1QUFEOFx1QUFEOVx1QUFEQVx1QUFEQlx1QUFEQ1x1QUFERCIrCi0gICAgICAgICJcdUFBRTFcdUFBRTJcdUFBRTNcdUFBRTRcdUFBRTVcdUFBRTZcdUFBRTdcdUFBRTgiKwotICAgICAgICAiXHVBQUU5XHVBQUVBXHVBQUVCXHVBQUVDXHVBQUVEXHVBQUVFXHVBQUVGXHVBQUYwIisKLSAgICAgICAgIlx1QUFGMVx1QUFGM1x1QUFGNFx1QUFGNVx1QUFGNlx1QUFGN1x1QUFGOFx1QUFGOSIrCi0gICAgICAgICJcdUFBRkFcdUFBRkJcdUFBRkNcdUFBRkRcdUFCNDFcdUFCNDJcdUFCNDNcdUFCNDQiKwotICAgICAgICAiXHVBQjQ1XHVBQjQ2XHVBQjQ3XHVBQjQ4XHVBQjQ5XHVBQjRBXHVBQjRCXHVBQjRDIisKLSAgICAgICAgIlx1QUI0RFx1QUI0RVx1QUI0Rlx1QUI1MFx1QUI1MVx1QUI1M1x1QUI1NFx1QUI1NSIrCi0gICAgICAgICJcdUFCNTZcdUFCNTdcdUFCNThcdUFCNTlcdUFCNUFcdUFCNUJcdUFCNUNcdUFCNUQiKwotICAgICAgICAiXHVBQjYxXHVBQjYyXHVBQjYzXHVBQjY0XHVBQjY1XHVBQjY2XHVBQjY3XHVBQjY4IisKLSAgICAgICAgIlx1QUI2OVx1QUI2QVx1QUI2Qlx1QUI2Q1x1QUI2RFx1QUI2RVx1QUI2Rlx1QUI3MCIrCi0gICAgICAgICJcdUFCNzFcdUFCNzNcdUFCNzRcdUFCNzVcdUFCNzZcdUFCNzdcdUFCNzhcdUFCNzkiKwotICAgICAgICAiXHVBQjdBXHVBQjdCXHVBQjdDXHVBQjdEXHVBQjgxXHVBQjgyXHVBQjgzXHVBQjg0IisKLSAgICAgICAgIlx1QUI4NVx1QUI4Nlx1QUI4N1x1QUI4OFx1QUI4OVx1QUI4QVx1QUI4Qlx1QUI4QyIrCi0gICAgICAgICJcdUFCOERcdUFCOEVcdUFCOEZcdUFCOTBcdUFCOTFcdUFCOTNcdUFCOTRcdUFCOTUiKwotICAgICAgICAiXHVBQjk2XHVBQjk3XHVBQjk4XHVBQjk5XHVBQjlBXHVBQjlCXHVBQjlDXHVBQjlEIisKLSAgICAgICAgIlx1QUJBMVx1QUJBMlx1QUJBM1x1QUJBNFx1QUJBNVx1QUJBNlx1QUJBN1x1QUJBOCIrCi0gICAgICAgICJcdUFCQTlcdUFCQUFcdUFCQUJcdUFCQUNcdUFCQURcdUFCQUVcdUFCQUZcdUFCQjAiKwotICAgICAgICAiXHVBQkIxXHVBQkIzXHVBQkI0XHVBQkI1XHVBQkI2XHVBQkI3XHVBQkI4XHVBQkI5IisKLSAgICAgICAgIlx1QUJCQVx1QUJCQlx1QUJCQ1x1QUJCRFx1QUM2MVx1QUM2Mlx1QUM2M1x1QUM2NCIrCi0gICAgICAgICJcdUFDNjVcdUFDNjZcdUFDNjdcdUFDNjhcdUFDNjlcdUFDNkFcdUFDNkJcdUFDNkMiKwotICAgICAgICAiXHVBQzZEXHVBQzZFXHVBQzZGXHVBQzcwXHVBQzcxXHVBQzczXHVBQzc0XHVBQzc1IisKLSAgICAgICAgIlx1QUM3Nlx1QUM3N1x1QUM3OFx1QUM3OVx1QUM3QVx1QUM3Qlx1QUM3Q1x1QUM3RCIrCi0gICAgICAgICJcdUFDODFcdUFDODJcdUFDODNcdUFDODRcdUFDODVcdUFDODZcdUFDODdcdUFDODgiKwotICAgICAgICAiXHVBQzg5XHVBQzhBXHVBQzhCXHVBQzhDXHVBQzhEXHVBQzhFXHVBQzhGXHVBQzkwIisKLSAgICAgICAgIlx1QUM5MVx1QUM5M1x1QUM5NFx1QUM5NVx1QUM5Nlx1QUM5N1x1QUM5OFx1QUM5OSIrCi0gICAgICAgICJcdUFDOUFcdUFDOUJcdUFDOUNcdUFDOURcdUFDQTFcdUFDQTJcdUFDQTNcdUFDQTQiKwotICAgICAgICAiXHVBQ0E1XHVBQ0E2XHVBQ0E3XHVBQ0E4XHVBQ0E5XHVBQ0FBXHVBQ0FCXHVBQ0FDIisKLSAgICAgICAgIlx1QUNBRFx1QUNBRVx1QUNBRlx1QUNCMFx1QUNCMVx1QUNCM1x1QUNCNFx1QUNCNSIrCi0gICAgICAgICJcdUFDQjZcdUFDQjdcdUFDQjhcdUFDQjlcdUFDQkFcdUFDQkJcdUFDQkNcdUFDQkQiKwotICAgICAgICAiXHVBQ0MxXHVBQ0MyXHVBQ0MzXHVBQ0M0XHVBQ0M1XHVBQ0M2XHVBQ0M3XHVBQ0M4IisKLSAgICAgICAgIlx1QUNDOVx1QUNDQVx1QUNDQlx1QUNDQ1x1QUNDRFx1QUNDRVx1QUNDRlx1QUNEMCIrCi0gICAgICAgICJcdUFDRDFcdUFDRDNcdUFDRDRcdUFDRDVcdUFDRDZcdUFDRDdcdUFDRDhcdUFDRDkiKwotICAgICAgICAiXHVBQ0RBXHVBQ0RCXHVBQ0RDXHVBQ0REXHVBQ0UxXHVBQ0UyXHVBQ0UzXHVBQ0U0IisKLSAgICAgICAgIlx1QUNFNVx1QUNFNlx1QUNFN1x1QUNFOFx1QUNFOVx1QUNFQVx1QUNFQlx1QUNFQyIrCi0gICAgICAgICJcdUFDRURcdUFDRUVcdUFDRUZcdUFDRjBcdUFDRjFcdUFDRjNcdUFDRjRcdUFDRjUiKwotICAgICAgICAiXHVBQ0Y2XHVBQ0Y3XHVBQ0Y4XHVBQ0Y5XHVBQ0ZBXHVBQ0ZCXHVBQ0ZDXHVBQ0ZEIisKLSAgICAgICAgIlx1QUQ0MVx1QUQ0Mlx1QUQ0M1x1QUQ0NFx1QUQ0NVx1QUQ0Nlx1QUQ0N1x1QUQ0OCIrCi0gICAgICAgICJcdUFENDlcdUFENEFcdUFENEJcdUFENENcdUFENERcdUFENEVcdUFENEZcdUFENTAiKwotICAgICAgICAiXHVBRDUxXHVBRDUzXHVBRDU0XHVBRDU1XHVBRDU2XHVBRDU3XHVBRDU4XHVBRDU5IisKLSAgICAgICAgIlx1QUQ1QVx1QUQ1Qlx1QUQ1Q1x1QUQ1RFx1QUQ2MVx1QUQ2Mlx1QUQ2M1x1QUQ2NCIrCi0gICAgICAgICJcdUFENjVcdUFENjZcdUFENjdcdUFENjhcdUFENjlcdUFENkFcdUFENkJcdUFENkMiKwotICAgICAgICAiXHVBRDZEXHVBRDZFXHVBRDZGXHVBRDcwXHVBRDcxXHVBRDczXHVBRDc0XHVBRDc1IisKLSAgICAgICAgIlx1QUQ3Nlx1QUQ3N1x1QUQ3OFx1QUQ3OVx1QUQ3QVx1QUQ3Qlx1QUQ3Q1x1QUQ3RCIrCi0gICAgICAgICJcdUFEODFcdUFEODJcdUFEODNcdUFEODRcdUFEODVcdUFEODZcdUFEODdcdUFEODgiKwotICAgICAgICAiXHVBRDg5XHVBRDhBXHVBRDhCXHVBRDhDXHVBRDhEXHVBRDhFXHVBRDhGXHVBRDkwIisKLSAgICAgICAgIlx1QUQ5MVx1QUQ5M1x1QUQ5NFx1QUQ5NVx1QUQ5Nlx1QUQ5N1x1QUQ5OFx1QUQ5OSIrCi0gICAgICAgICJcdUFEOUFcdUFEOUJcdUFEOUNcdUFEOURcdUFEQTFcdUFEQTJcdUFEQTNcdUFEQTQiKwotICAgICAgICAiXHVBREE1XHVBREE2XHVBREE3XHVBREE4XHVBREE5XHVBREFBXHVBREFCXHVBREFDIisKLSAgICAgICAgIlx1QURBRFx1QURBRVx1QURBRlx1QURCMFx1QURCMVx1QURCM1x1QURCNFx1QURCNSIrCi0gICAgICAgICJcdUFEQjZcdUFEQjdcdUFEQjhcdUFEQjlcdUFEQkFcdUFEQkJcdUFEQkNcdUFEQkQiKwotICAgICAgICAiXHVBREMxXHVBREMyXHVBREMzXHVBREM0XHVBREM1XHVBREM2XHVBREM3XHVBREM4IisKLSAgICAgICAgIlx1QURDOVx1QURDQVx1QURDQlx1QURDQ1x1QURDRFx1QURDRVx1QURDRlx1QUREMCIrCi0gICAgICAgICJcdUFERDFcdUFERDNcdUFERDRcdUFERDVcdUFERDZcdUFERDdcdUFERDhcdUFERDkiKwotICAgICAgICAiXHVBRERBXHVBRERCXHVBRERDXHVBREREXHVBREUxXHVBREUyXHVBREUzXHVBREU0IisKLSAgICAgICAgIlx1QURFNVx1QURFNlx1QURFN1x1QURFOFx1QURFOVx1QURFQVx1QURFQlx1QURFQyIrCi0gICAgICAgICJcdUFERURcdUFERUVcdUFERUZcdUFERjBcdUFERjFcdUFERjNcdUFERjRcdUFERjUiKwotICAgICAgICAiXHVBREY2XHVBREY3XHVBREY4XHVBREY5XHVBREZBXHVBREZCXHVBREZDXHVBREZEIisKLSAgICAgICAgIlx1QUU0MVx1QUU0Mlx1QUU0M1x1QUU0NFx1QUU0NVx1QUU0Nlx1QUU0N1x1QUU0OCIrCi0gICAgICAgICJcdUFFNDlcdUFFNEFcdUFFNEJcdUFFNENcdUFFNERcdUFFNEVcdUFFNEZcdUFFNTAiKwotICAgICAgICAiXHVBRTUxXHVBRTUzXHVBRTU0XHVBRTU1XHVBRTU2XHVBRTU3XHVBRTU4XHVBRTU5IisKLSAgICAgICAgIlx1QUU1QVx1QUU1Qlx1QUU1Q1x1QUU1RFx1QUU2MVx1QUU2Mlx1QUU2M1x1QUU2NCIrCi0gICAgICAgICJcdUFFNjVcdUFFNjZcdUFFNjdcdUFFNjhcdUFFNjlcdUFFNkFcdUFFNkJcdUFFNkMiKwotICAgICAgICAiXHVBRTZEXHVBRTZFXHVBRTZGXHVBRTcwXHVBRTcxXHVBRTczXHVBRTc0XHVBRTc1IisKLSAgICAgICAgIlx1QUU3Nlx1QUU3N1x1QUU3OFx1QUU3OVx1QUU3QVx1QUU3Qlx1QUU3Q1x1QUU3RCIrCi0gICAgICAgICJcdUFFODFcdUFFODJcdUFFODNcdUFFODRcdUFFODVcdUFFODZcdUFFODdcdUFFODgiKwotICAgICAgICAiXHVBRTg5XHVBRThBXHVBRThCXHVBRThDXHVBRThEXHVBRThFXHVBRThGXHVBRTkwIisKLSAgICAgICAgIlx1QUU5MVx1QUU5M1x1QUU5NFx1QUU5NVx1QUU5Nlx1QUU5N1x1QUU5OFx1QUU5OSIrCi0gICAgICAgICJcdUFFOUFcdUFFOUJcdUFFOUNcdUFFOURcdUFFQTFcdUFFQTJcdUFFQTNcdUFFQTQiKwotICAgICAgICAiXHVBRUE1XHVBRUE2XHVBRUE3XHVBRUE4XHVBRUE5XHVBRUFBXHVBRUFCXHVBRUFDIisKLSAgICAgICAgIlx1QUVBRFx1QUVBRVx1QUVBRlx1QUVCMFx1QUVCMVx1QUVCM1x1QUVCNFx1QUVCNSIrCi0gICAgICAgICJcdUFFQjZcdUFFQjdcdUFFQjhcdUFFQjlcdUFFQkFcdUFFQkJcdUFFQkNcdUFFQkQiKwotICAgICAgICAiXHVBRUMxXHVBRUMyXHVBRUMzXHVBRUM0XHVBRUM1XHVBRUM2XHVBRUM3XHVBRUM4IisKLSAgICAgICAgIlx1QUVDOVx1QUVDQVx1QUVDQlx1QUVDQ1x1QUVDRFx1QUVDRVx1QUVDRlx1QUVEMCIrCi0gICAgICAgICJcdUFFRDFcdUFFRDNcdUFFRDRcdUFFRDVcdUFFRDZcdUFFRDdcdUFFRDhcdUFFRDkiKwotICAgICAgICAiXHVBRURBXHVBRURCXHVBRURDXHVBRUREXHVBRUUxXHVBRUUyXHVBRUUzXHVBRUU0IisKLSAgICAgICAgIlx1QUVFNVx1QUVFNlx1QUVFN1x1QUVFOFx1QUVFOVx1QUVFQVx1QUVFQlx1QUVFQyIrCi0gICAgICAgICJcdUFFRURcdUFFRUVcdUFFRUZcdUFFRjBcdUFFRjFcdUFFRjNcdUFFRjRcdUFFRjUiKwotICAgICAgICAiXHVBRUY2XHVBRUY3XHVBRUY4XHVBRUY5XHVBRUZBXHVBRUZCXHVBRUZDXHVBRUZEIisKLSAgICAgICAgIlx1QUY0MVx1QUY0Mlx1QUY0M1x1QUY0NFx1QUY0NVx1QUY0Nlx1QUY0N1x1QUY0OCIrCi0gICAgICAgICJcdUFGNDlcdUFGNEFcdUFGNEJcdUFGNENcdUFGNERcdUFGNEVcdUFGNEZcdUFGNTAiKwotICAgICAgICAiXHVBRjUxXHVBRjUzXHVBRjU0XHVBRjU1XHVBRjU2XHVBRjU3XHVBRjU4XHVBRjU5IisKLSAgICAgICAgIlx1QUY1QVx1QUY1Qlx1QUY1Q1x1QUY1RFx1QUY2MVx1QUY2Mlx1QUY2M1x1QUY2NCIrCi0gICAgICAgICJcdUFGNjVcdUFGNjZcdUFGNjdcdUFGNjhcdUFGNjlcdUFGNkFcdUFGNkJcdUFGNkMiKwotICAgICAgICAiXHVBRjZEXHVBRjZFXHVBRjZGXHVBRjcwXHVBRjcxXHVBRjczXHVBRjc0XHVBRjc1IisKLSAgICAgICAgIlx1QUY3Nlx1QUY3N1x1QUY3OFx1QUY3OVx1QUY3QVx1QUY3Qlx1QUY3Q1x1QUY3RCIrCi0gICAgICAgICJcdUFGODFcdUFGODJcdUFGODNcdUFGODRcdUFGODVcdUFGODZcdUFGODdcdUFGODgiKwotICAgICAgICAiXHVBRjg5XHVBRjhBXHVBRjhCXHVBRjhDXHVBRjhEXHVBRjhFXHVBRjhGXHVBRjkwIisKLSAgICAgICAgIlx1QUY5MVx1QUY5M1x1QUY5NFx1QUY5NVx1QUY5Nlx1QUY5N1x1QUY5OFx1QUY5OSIrCi0gICAgICAgICJcdUFGOUFcdUFGOUJcdUFGOUNcdUFGOURcdUFGQTFcdUFGQTJcdUFGQTNcdUFGQTQiKwotICAgICAgICAiXHVBRkE1XHVBRkE2XHVBRkE3XHVBRkE4XHVBRkE5XHVBRkFBXHVBRkFCXHVBRkFDIisKLSAgICAgICAgIlx1QUZBRFx1QUZBRVx1QUZBRlx1QUZCMFx1QUZCMVx1QUZCM1x1QUZCNFx1QUZCNSIrCi0gICAgICAgICJcdUFGQjZcdUFGQjdcdUFGQjhcdUFGQjlcdUFGQkFcdUFGQkJcdUFGQkNcdUFGQkQiKwotICAgICAgICAiXHVCMDYxXHVCMDYyXHVCMDYzXHVCMDY0XHVCMDY1XHVCMDY2XHVCMDY3XHVCMDY4IisKLSAgICAgICAgIlx1QjA2OVx1QjA2QVx1QjA2Qlx1QjA2Q1x1QjA2RFx1QjA2RVx1QjA2Rlx1QjA3MCIrCi0gICAgICAgICJcdUIwNzFcdUIwNzNcdUIwNzRcdUIwNzVcdUIwNzZcdUIwNzdcdUIwNzhcdUIwNzkiKwotICAgICAgICAiXHVCMDdBXHVCMDdCXHVCMDdDXHVCMDdEXHVCMDgxXHVCMDgyXHVCMDgzXHVCMDg0IisKLSAgICAgICAgIlx1QjA4NVx1QjA4Nlx1QjA4N1x1QjA4OFx1QjA4OVx1QjA4QVx1QjA4Qlx1QjA4QyIrCi0gICAgICAgICJcdUIwOERcdUIwOEVcdUIwOEZcdUIwOTBcdUIwOTFcdUIwOTNcdUIwOTRcdUIwOTUiKwotICAgICAgICAiXHVCMDk2XHVCMDk3XHVCMDk4XHVCMDk5XHVCMDlBXHVCMDlCXHVCMDlDXHVCMDlEIisKLSAgICAgICAgIlx1QjBBMVx1QjBBMlx1QjBBM1x1QjBBNFx1QjBBNVx1QjBBNlx1QjBBN1x1QjBBOCIrCi0gICAgICAgICJcdUIwQTlcdUIwQUFcdUIwQUJcdUIwQUNcdUIwQURcdUIwQUVcdUIwQUZcdUIwQjAiKwotICAgICAgICAiXHVCMEIxXHVCMEIzXHVCMEI0XHVCMEI1XHVCMEI2XHVCMEI3XHVCMEI4XHVCMEI5IisKLSAgICAgICAgIlx1QjBCQVx1QjBCQlx1QjBCQ1x1QjBCRFx1QjBDMVx1QjBDMlx1QjBDM1x1QjBDNCIrCi0gICAgICAgICJcdUIwQzVcdUIwQzZcdUIwQzdcdUIwQzhcdUIwQzlcdUIwQ0FcdUIwQ0JcdUIwQ0MiKwotICAgICAgICAiXHVCMENEXHVCMENFXHVCMENGXHVCMEQwXHVCMEQxXHVCMEQzXHVCMEQ0XHVCMEQ1IisKLSAgICAgICAgIlx1QjBENlx1QjBEN1x1QjBEOFx1QjBEOVx1QjBEQVx1QjBEQlx1QjBEQ1x1QjBERCIrCi0gICAgICAgICJcdUIwRTFcdUIwRTJcdUIwRTNcdUIwRTRcdUIwRTVcdUIwRTZcdUIwRTdcdUIwRTgiKwotICAgICAgICAiXHVCMEU5XHVCMEVBXHVCMEVCXHVCMEVDXHVCMEVEXHVCMEVFXHVCMEVGXHVCMEYwIisKLSAgICAgICAgIlx1QjBGMVx1QjBGM1x1QjBGNFx1QjBGNVx1QjBGNlx1QjBGN1x1QjBGOFx1QjBGOSIrCi0gICAgICAgICJcdUIwRkFcdUIwRkJcdUIwRkNcdUIwRkRcdUIxNDFcdUIxNDJcdUIxNDNcdUIxNDQiKwotICAgICAgICAiXHVCMTQ1XHVCMTQ2XHVCMTQ3XHVCMTQ4XHVCMTQ5XHVCMTRBXHVCMTRCXHVCMTRDIisKLSAgICAgICAgIlx1QjE0RFx1QjE0RVx1QjE0Rlx1QjE1MFx1QjE1MVx1QjE1M1x1QjE1NFx1QjE1NSIrCi0gICAgICAgICJcdUIxNTZcdUIxNTdcdUIxNThcdUIxNTlcdUIxNUFcdUIxNUJcdUIxNUNcdUIxNUQiKwotICAgICAgICAiXHVCMTYxXHVCMTYyXHVCMTYzXHVCMTY0XHVCMTY1XHVCMTY2XHVCMTY3XHVCMTY4IisKLSAgICAgICAgIlx1QjE2OVx1QjE2QVx1QjE2Qlx1QjE2Q1x1QjE2RFx1QjE2RVx1QjE2Rlx1QjE3MCIrCi0gICAgICAgICJcdUIxNzFcdUIxNzNcdUIxNzRcdUIxNzVcdUIxNzZcdUIxNzdcdUIxNzhcdUIxNzkiKwotICAgICAgICAiXHVCMTdBXHVCMTdCXHVCMTdDXHVCMTdEXHVCMTgxXHVCMTgyXHVCMTgzXHVCMTg0IisKLSAgICAgICAgIlx1QjE4NVx1QjE4Nlx1QjE4N1x1QjE4OFx1QjE4OVx1QjE4QVx1QjE4Qlx1QjE4QyIrCi0gICAgICAgICJcdUIxOERcdUIxOEVcdUIxOEZcdUIxOTBcdUIxOTFcdUIxOTNcdUIxOTRcdUIxOTUiKwotICAgICAgICAiXHVCMTk2XHVCMTk3XHVCMTk4XHVCMTk5XHVCMTlBXHVCMTlCXHVCMTlDXHVCMTlEIisKLSAgICAgICAgIlx1QjFBMVx1QjFBMlx1QjFBM1x1QjFBNFx1QjFBNVx1QjFBNlx1QjFBN1x1QjFBOCIrCi0gICAgICAgICJcdUIxQTlcdUIxQUFcdUIxQUJcdUIxQUNcdUIxQURcdUIxQUVcdUIxQUZcdUIxQjAiKwotICAgICAgICAiXHVCMUIxXHVCMUIzXHVCMUI0XHVCMUI1XHVCMUI2XHVCMUI3XHVCMUI4XHVCMUI5IisKLSAgICAgICAgIlx1QjFCQVx1QjFCQlx1QjFCQ1x1QjFCRFx1QjFDMVx1QjFDMlx1QjFDM1x1QjFDNCIrCi0gICAgICAgICJcdUIxQzVcdUIxQzZcdUIxQzdcdUIxQzhcdUIxQzlcdUIxQ0FcdUIxQ0JcdUIxQ0MiKwotICAgICAgICAiXHVCMUNEXHVCMUNFXHVCMUNGXHVCMUQwXHVCMUQxXHVCMUQzXHVCMUQ0XHVCMUQ1IisKLSAgICAgICAgIlx1QjFENlx1QjFEN1x1QjFEOFx1QjFEOVx1QjFEQVx1QjFEQlx1QjFEQ1x1QjFERCIrCi0gICAgICAgICJcdUIxRTFcdUIxRTJcdUIxRTNcdUIxRTRcdUIxRTVcdUIxRTZcdUIxRTdcdUIxRTgiKwotICAgICAgICAiXHVCMUU5XHVCMUVBXHVCMUVCXHVCMUVDXHVCMUVEXHVCMUVFXHVCMUVGXHVCMUYwIisKLSAgICAgICAgIlx1QjFGMVx1QjFGM1x1QjFGNFx1QjFGNVx1QjFGNlx1QjFGN1x1QjFGOFx1QjFGOSIrCi0gICAgICAgICJcdUIxRkFcdUIxRkJcdUIxRkNcdUIxRkRcdUIyNDFcdUIyNDJcdUIyNDNcdUIyNDQiKwotICAgICAgICAiXHVCMjQ1XHVCMjQ2XHVCMjQ3XHVCMjQ4XHVCMjQ5XHVCMjRBXHVCMjRCXHVCMjRDIisKLSAgICAgICAgIlx1QjI0RFx1QjI0RVx1QjI0Rlx1QjI1MFx1QjI1MVx1QjI1M1x1QjI1NFx1QjI1NSIrCi0gICAgICAgICJcdUIyNTZcdUIyNTdcdUIyNThcdUIyNTlcdUIyNUFcdUIyNUJcdUIyNUNcdUIyNUQiKwotICAgICAgICAiXHVCMjYxXHVCMjYyXHVCMjYzXHVCMjY0XHVCMjY1XHVCMjY2XHVCMjY3XHVCMjY4IisKLSAgICAgICAgIlx1QjI2OVx1QjI2QVx1QjI2Qlx1QjI2Q1x1QjI2RFx1QjI2RVx1QjI2Rlx1QjI3MCIrCi0gICAgICAgICJcdUIyNzFcdUIyNzNcdUIyNzRcdUIyNzVcdUIyNzZcdUIyNzdcdUIyNzhcdUIyNzkiKwotICAgICAgICAiXHVCMjdBXHVCMjdCXHVCMjdDXHVCMjdEXHVCMjgxXHVCMjgyXHVCMjgzXHVCMjg0IisKLSAgICAgICAgIlx1QjI4NVx1QjI4Nlx1QjI4N1x1QjI4OFx1QjI4OVx1QjI4QVx1QjI4Qlx1QjI4QyIrCi0gICAgICAgICJcdUIyOERcdUIyOEVcdUIyOEZcdUIyOTBcdUIyOTFcdUIyOTNcdUIyOTRcdUIyOTUiKwotICAgICAgICAiXHVCMjk2XHVCMjk3XHVCMjk4XHVCMjk5XHVCMjlBXHVCMjlCXHVCMjlDXHVCMjlEIisKLSAgICAgICAgIlx1QjJBMVx1QjJBMlx1QjJBM1x1QjJBNFx1QjJBNVx1QjJBNlx1QjJBN1x1QjJBOCIrCi0gICAgICAgICJcdUIyQTlcdUIyQUFcdUIyQUJcdUIyQUNcdUIyQURcdUIyQUVcdUIyQUZcdUIyQjAiKwotICAgICAgICAiXHVCMkIxXHVCMkIzXHVCMkI0XHVCMkI1XHVCMkI2XHVCMkI3XHVCMkI4XHVCMkI5IisKLSAgICAgICAgIlx1QjJCQVx1QjJCQlx1QjJCQ1x1QjJCRFx1QjJDMVx1QjJDMlx1QjJDM1x1QjJDNCIrCi0gICAgICAgICJcdUIyQzVcdUIyQzZcdUIyQzdcdUIyQzhcdUIyQzlcdUIyQ0FcdUIyQ0JcdUIyQ0MiKwotICAgICAgICAiXHVCMkNEXHVCMkNFXHVCMkNGXHVCMkQwXHVCMkQxXHVCMkQzXHVCMkQ0XHVCMkQ1IisKLSAgICAgICAgIlx1QjJENlx1QjJEN1x1QjJEOFx1QjJEOVx1QjJEQVx1QjJEQlx1QjJEQ1x1QjJERCIrCi0gICAgICAgICJcdUIyRTFcdUIyRTJcdUIyRTNcdUIyRTRcdUIyRTVcdUIyRTZcdUIyRTdcdUIyRTgiKwotICAgICAgICAiXHVCMkU5XHVCMkVBXHVCMkVCXHVCMkVDXHVCMkVEXHVCMkVFXHVCMkVGXHVCMkYwIisKLSAgICAgICAgIlx1QjJGMVx1QjJGM1x1QjJGNFx1QjJGNVx1QjJGNlx1QjJGN1x1QjJGOFx1QjJGOSIrCi0gICAgICAgICJcdUIyRkFcdUIyRkJcdUIyRkNcdUIyRkRcdUIzNDFcdUIzNDJcdUIzNDNcdUIzNDQiKwotICAgICAgICAiXHVCMzQ1XHVCMzQ2XHVCMzQ3XHVCMzQ4XHVCMzQ5XHVCMzRBXHVCMzRCXHVCMzRDIisKLSAgICAgICAgIlx1QjM0RFx1QjM0RVx1QjM0Rlx1QjM1MFx1QjM1MVx1QjM1M1x1QjM1NFx1QjM1NSIrCi0gICAgICAgICJcdUIzNTZcdUIzNTdcdUIzNThcdUIzNTlcdUIzNUFcdUIzNUJcdUIzNUNcdUIzNUQiKwotICAgICAgICAiXHVCMzYxXHVCMzYyXHVCMzYzXHVCMzY0XHVCMzY1XHVCMzY2XHVCMzY3XHVCMzY4IisKLSAgICAgICAgIlx1QjM2OVx1QjM2QVx1QjM2Qlx1QjM2Q1x1QjM2RFx1QjM2RVx1QjM2Rlx1QjM3MCIrCi0gICAgICAgICJcdUIzNzFcdUIzNzNcdUIzNzRcdUIzNzVcdUIzNzZcdUIzNzdcdUIzNzhcdUIzNzkiKwotICAgICAgICAiXHVCMzdBXHVCMzdCXHVCMzdDXHVCMzdEXHVCMzgxXHVCMzgyXHVCMzgzXHVCMzg0IisKLSAgICAgICAgIlx1QjM4NVx1QjM4Nlx1QjM4N1x1QjM4OFx1QjM4OVx1QjM4QVx1QjM4Qlx1QjM4QyIrCi0gICAgICAgICJcdUIzOERcdUIzOEVcdUIzOEZcdUIzOTBcdUIzOTFcdUIzOTNcdUIzOTRcdUIzOTUiKwotICAgICAgICAiXHVCMzk2XHVCMzk3XHVCMzk4XHVCMzk5XHVCMzlBXHVCMzlCXHVCMzlDXHVCMzlEIisKLSAgICAgICAgIlx1QjNBMVx1QjNBMlx1QjNBM1x1QjNBNFx1QjNBNVx1QjNBNlx1QjNBN1x1QjNBOCIrCi0gICAgICAgICJcdUIzQTlcdUIzQUFcdUIzQUJcdUIzQUNcdUIzQURcdUIzQUVcdUIzQUZcdUIzQjAiKwotICAgICAgICAiXHVCM0IxXHVCM0IzXHVCM0I0XHVCM0I1XHVCM0I2XHVCM0I3XHVCM0I4XHVCM0I5IisKLSAgICAgICAgIlx1QjNCQVx1QjNCQlx1QjNCQ1x1QjNCRFx1QjQ2MVx1QjQ2Mlx1QjQ2M1x1QjQ2NCIrCi0gICAgICAgICJcdUI0NjVcdUI0NjZcdUI0NjdcdUI0NjhcdUI0NjlcdUI0NkFcdUI0NkJcdUI0NkMiKwotICAgICAgICAiXHVCNDZEXHVCNDZFXHVCNDZGXHVCNDcwXHVCNDcxXHVCNDczXHVCNDc0XHVCNDc1IisKLSAgICAgICAgIlx1QjQ3Nlx1QjQ3N1x1QjQ3OFx1QjQ3OVx1QjQ3QVx1QjQ3Qlx1QjQ3Q1x1QjQ3RCIrCi0gICAgICAgICJcdUI0ODFcdUI0ODJcdUI0ODNcdUI0ODRcdUI0ODVcdUI0ODZcdUI0ODdcdUI0ODgiKwotICAgICAgICAiXHVCNDg5XHVCNDhBXHVCNDhCXHVCNDhDXHVCNDhEXHVCNDhFXHVCNDhGXHVCNDkwIisKLSAgICAgICAgIlx1QjQ5MVx1QjQ5M1x1QjQ5NFx1QjQ5NVx1QjQ5Nlx1QjQ5N1x1QjQ5OFx1QjQ5OSIrCi0gICAgICAgICJcdUI0OUFcdUI0OUJcdUI0OUNcdUI0OURcdUI0QTFcdUI0QTJcdUI0QTNcdUI0QTQiKwotICAgICAgICAiXHVCNEE1XHVCNEE2XHVCNEE3XHVCNEE4XHVCNEE5XHVCNEFBXHVCNEFCXHVCNEFDIisKLSAgICAgICAgIlx1QjRBRFx1QjRBRVx1QjRBRlx1QjRCMFx1QjRCMVx1QjRCM1x1QjRCNFx1QjRCNSIrCi0gICAgICAgICJcdUI0QjZcdUI0QjdcdUI0QjhcdUI0QjlcdUI0QkFcdUI0QkJcdUI0QkNcdUI0QkQiKwotICAgICAgICAiXHVCNEMxXHVCNEMyXHVCNEMzXHVCNEM0XHVCNEM1XHVCNEM2XHVCNEM3XHVCNEM4IisKLSAgICAgICAgIlx1QjRDOVx1QjRDQVx1QjRDQlx1QjRDQ1x1QjRDRFx1QjRDRVx1QjRDRlx1QjREMCIrCi0gICAgICAgICJcdUI0RDFcdUI0RDNcdUI0RDRcdUI0RDVcdUI0RDZcdUI0RDdcdUI0RDhcdUI0RDkiKwotICAgICAgICAiXHVCNERBXHVCNERCXHVCNERDXHVCNEREXHVCNEUxXHVCNEUyXHVCNEUzXHVCNEU0IisKLSAgICAgICAgIlx1QjRFNVx1QjRFNlx1QjRFN1x1QjRFOFx1QjRFOVx1QjRFQVx1QjRFQlx1QjRFQyIrCi0gICAgICAgICJcdUI0RURcdUI0RUVcdUI0RUZcdUI0RjBcdUI0RjFcdUI0RjNcdUI0RjRcdUI0RjUiKwotICAgICAgICAiXHVCNEY2XHVCNEY3XHVCNEY4XHVCNEY5XHVCNEZBXHVCNEZCXHVCNEZDXHVCNEZEIisKLSAgICAgICAgIlx1QjU0MVx1QjU0Mlx1QjU0M1x1QjU0NFx1QjU0NVx1QjU0Nlx1QjU0N1x1QjU0OCIrCi0gICAgICAgICJcdUI1NDlcdUI1NEFcdUI1NEJcdUI1NENcdUI1NERcdUI1NEVcdUI1NEZcdUI1NTAiKwotICAgICAgICAiXHVCNTUxXHVCNTUzXHVCNTU0XHVCNTU1XHVCNTU2XHVCNTU3XHVCNTU4XHVCNTU5IisKLSAgICAgICAgIlx1QjU1QVx1QjU1Qlx1QjU1Q1x1QjU1RFx1QjU2MVx1QjU2Mlx1QjU2M1x1QjU2NCIrCi0gICAgICAgICJcdUI1NjVcdUI1NjZcdUI1NjdcdUI1NjhcdUI1NjlcdUI1NkFcdUI1NkJcdUI1NkMiKwotICAgICAgICAiXHVCNTZEXHVCNTZFXHVCNTZGXHVCNTcwXHVCNTcxXHVCNTczXHVCNTc0XHVCNTc1IisKLSAgICAgICAgIlx1QjU3Nlx1QjU3N1x1QjU3OFx1QjU3OVx1QjU3QVx1QjU3Qlx1QjU3Q1x1QjU3RCIrCi0gICAgICAgICJcdUI1ODFcdUI1ODJcdUI1ODNcdUI1ODRcdUI1ODVcdUI1ODZcdUI1ODdcdUI1ODgiKwotICAgICAgICAiXHVCNTg5XHVCNThBXHVCNThCXHVCNThDXHVCNThEXHVCNThFXHVCNThGXHVCNTkwIisKLSAgICAgICAgIlx1QjU5MVx1QjU5M1x1QjU5NFx1QjU5NVx1QjU5Nlx1QjU5N1x1QjU5OFx1QjU5OSIrCi0gICAgICAgICJcdUI1OUFcdUI1OUJcdUI1OUNcdUI1OURcdUI1QTFcdUI1QTJcdUI1QTNcdUI1QTQiKwotICAgICAgICAiXHVCNUE1XHVCNUE2XHVCNUE3XHVCNUE4XHVCNUE5XHVCNUFBXHVCNUFCXHVCNUFDIisKLSAgICAgICAgIlx1QjVBRFx1QjVBRVx1QjVBRlx1QjVCMFx1QjVCMVx1QjVCM1x1QjVCNFx1QjVCNSIrCi0gICAgICAgICJcdUI1QjZcdUI1QjdcdUI1QjhcdUI1QjlcdUI1QkFcdUI1QkJcdUI1QkNcdUI1QkQiKwotICAgICAgICAiXHVCNUMxXHVCNUMyXHVCNUMzXHVCNUM0XHVCNUM1XHVCNUM2XHVCNUM3XHVCNUM4IisKLSAgICAgICAgIlx1QjVDOVx1QjVDQVx1QjVDQlx1QjVDQ1x1QjVDRFx1QjVDRVx1QjVDRlx1QjVEMCIrCi0gICAgICAgICJcdUI1RDFcdUI1RDNcdUI1RDRcdUI1RDVcdUI1RDZcdUI1RDdcdUI1RDhcdUI1RDkiKwotICAgICAgICAiXHVCNURBXHVCNURCXHVCNURDXHVCNUREXHVCNUUxXHVCNUUyXHVCNUUzXHVCNUU0IisKLSAgICAgICAgIlx1QjVFNVx1QjVFNlx1QjVFN1x1QjVFOFx1QjVFOVx1QjVFQVx1QjVFQlx1QjVFQyIrCi0gICAgICAgICJcdUI1RURcdUI1RUVcdUI1RUZcdUI1RjBcdUI1RjFcdUI1RjNcdUI1RjRcdUI1RjUiKwotICAgICAgICAiXHVCNUY2XHVCNUY3XHVCNUY4XHVCNUY5XHVCNUZBXHVCNUZCXHVCNUZDXHVCNUZEIisKLSAgICAgICAgIlx1QjY0MVx1QjY0Mlx1QjY0M1x1QjY0NFx1QjY0NVx1QjY0Nlx1QjY0N1x1QjY0OCIrCi0gICAgICAgICJcdUI2NDlcdUI2NEFcdUI2NEJcdUI2NENcdUI2NERcdUI2NEVcdUI2NEZcdUI2NTAiKwotICAgICAgICAiXHVCNjUxXHVCNjUzXHVCNjU0XHVCNjU1XHVCNjU2XHVCNjU3XHVCNjU4XHVCNjU5IisKLSAgICAgICAgIlx1QjY1QVx1QjY1Qlx1QjY1Q1x1QjY1RFx1QjY2MVx1QjY2Mlx1QjY2M1x1QjY2NCIrCi0gICAgICAgICJcdUI2NjVcdUI2NjZcdUI2NjdcdUI2NjhcdUI2NjlcdUI2NkFcdUI2NkJcdUI2NkMiKwotICAgICAgICAiXHVCNjZEXHVCNjZFXHVCNjZGXHVCNjcwXHVCNjcxXHVCNjczXHVCNjc0XHVCNjc1IisKLSAgICAgICAgIlx1QjY3Nlx1QjY3N1x1QjY3OFx1QjY3OVx1QjY3QVx1QjY3Qlx1QjY3Q1x1QjY3RCIrCi0gICAgICAgICJcdUI2ODFcdUI2ODJcdUI2ODNcdUI2ODRcdUI2ODVcdUI2ODZcdUI2ODdcdUI2ODgiKwotICAgICAgICAiXHVCNjg5XHVCNjhBXHVCNjhCXHVCNjhDXHVCNjhEXHVCNjhFXHVCNjhGXHVCNjkwIisKLSAgICAgICAgIlx1QjY5MVx1QjY5M1x1QjY5NFx1QjY5NVx1QjY5Nlx1QjY5N1x1QjY5OFx1QjY5OSIrCi0gICAgICAgICJcdUI2OUFcdUI2OUJcdUI2OUNcdUI2OURcdUI2QTFcdUI2QTJcdUI2QTNcdUI2QTQiKwotICAgICAgICAiXHVCNkE1XHVCNkE2XHVCNkE3XHVCNkE4XHVCNkE5XHVCNkFBXHVCNkFCXHVCNkFDIisKLSAgICAgICAgIlx1QjZBRFx1QjZBRVx1QjZBRlx1QjZCMFx1QjZCMVx1QjZCM1x1QjZCNFx1QjZCNSIrCi0gICAgICAgICJcdUI2QjZcdUI2QjdcdUI2QjhcdUI2QjlcdUI2QkFcdUI2QkJcdUI2QkNcdUI2QkQiKwotICAgICAgICAiXHVCNkMxXHVCNkMyXHVCNkMzXHVCNkM0XHVCNkM1XHVCNkM2XHVCNkM3XHVCNkM4IisKLSAgICAgICAgIlx1QjZDOVx1QjZDQVx1QjZDQlx1QjZDQ1x1QjZDRFx1QjZDRVx1QjZDRlx1QjZEMCIrCi0gICAgICAgICJcdUI2RDFcdUI2RDNcdUI2RDRcdUI2RDVcdUI2RDZcdUI2RDdcdUI2RDhcdUI2RDkiKwotICAgICAgICAiXHVCNkRBXHVCNkRCXHVCNkRDXHVCNkREXHVCNkUxXHVCNkUyXHVCNkUzXHVCNkU0IisKLSAgICAgICAgIlx1QjZFNVx1QjZFNlx1QjZFN1x1QjZFOFx1QjZFOVx1QjZFQVx1QjZFQlx1QjZFQyIrCi0gICAgICAgICJcdUI2RURcdUI2RUVcdUI2RUZcdUI2RjBcdUI2RjFcdUI2RjNcdUI2RjRcdUI2RjUiKwotICAgICAgICAiXHVCNkY2XHVCNkY3XHVCNkY4XHVCNkY5XHVCNkZBXHVCNkZCXHVCNkZDXHVCNkZEIisKLSAgICAgICAgIlx1Qjc0MVx1Qjc0Mlx1Qjc0M1x1Qjc0NFx1Qjc0NVx1Qjc0Nlx1Qjc0N1x1Qjc0OCIrCi0gICAgICAgICJcdUI3NDlcdUI3NEFcdUI3NEJcdUI3NENcdUI3NERcdUI3NEVcdUI3NEZcdUI3NTAiKwotICAgICAgICAiXHVCNzUxXHVCNzUzXHVCNzU0XHVCNzU1XHVCNzU2XHVCNzU3XHVCNzU4XHVCNzU5IisKLSAgICAgICAgIlx1Qjc1QVx1Qjc1Qlx1Qjc1Q1x1Qjc1RFx1Qjc2MVx1Qjc2Mlx1Qjc2M1x1Qjc2NCIrCi0gICAgICAgICJcdUI3NjVcdUI3NjZcdUI3NjdcdUI3NjhcdUI3NjlcdUI3NkFcdUI3NkJcdUI3NkMiKwotICAgICAgICAiXHVCNzZEXHVCNzZFXHVCNzZGXHVCNzcwXHVCNzcxXHVCNzczXHVCNzc0XHVCNzc1IisKLSAgICAgICAgIlx1Qjc3Nlx1Qjc3N1x1Qjc3OFx1Qjc3OVx1Qjc3QVx1Qjc3Qlx1Qjc3Q1x1Qjc3RCIrCi0gICAgICAgICJcdUI3ODFcdUI3ODJcdUI3ODNcdUI3ODRcdUI3ODVcdUI3ODZcdUI3ODdcdUI3ODgiKwotICAgICAgICAiXHVCNzg5XHVCNzhBXHVCNzhCXHVCNzhDXHVCNzhEXHVCNzhFXHVCNzhGXHVCNzkwIisKLSAgICAgICAgIlx1Qjc5MVx1Qjc5M1x1Qjc5NFx1Qjc5NVx1Qjc5Nlx1Qjc5N1x1Qjc5OFx1Qjc5OSIrCi0gICAgICAgICJcdUI3OUFcdUI3OUJcdUI3OUNcdUI3OURcdUI3QTFcdUI3QTJcdUI3QTNcdUI3QTQiKwotICAgICAgICAiXHVCN0E1XHVCN0E2XHVCN0E3XHVCN0E4XHVCN0E5XHVCN0FBXHVCN0FCXHVCN0FDIisKLSAgICAgICAgIlx1QjdBRFx1QjdBRVx1QjdBRlx1QjdCMFx1QjdCMVx1QjdCM1x1QjdCNFx1QjdCNSIrCi0gICAgICAgICJcdUI3QjZcdUI3QjdcdUI3QjhcdUI3QjlcdUI3QkFcdUI3QkJcdUI3QkNcdUI3QkQiKwotICAgICAgICAiXHVCODYxXHVCODYyXHVCODYzXHVCODY0XHVCODY1XHVCODY2XHVCODY3XHVCODY4IisKLSAgICAgICAgIlx1Qjg2OVx1Qjg2QVx1Qjg2Qlx1Qjg2Q1x1Qjg2RFx1Qjg2RVx1Qjg2Rlx1Qjg3MCIrCi0gICAgICAgICJcdUI4NzFcdUI4NzNcdUI4NzRcdUI4NzVcdUI4NzZcdUI4NzdcdUI4NzhcdUI4NzkiKwotICAgICAgICAiXHVCODdBXHVCODdCXHVCODdDXHVCODdEXHVCODgxXHVCODgyXHVCODgzXHVCODg0IisKLSAgICAgICAgIlx1Qjg4NVx1Qjg4Nlx1Qjg4N1x1Qjg4OFx1Qjg4OVx1Qjg4QVx1Qjg4Qlx1Qjg4QyIrCi0gICAgICAgICJcdUI4OERcdUI4OEVcdUI4OEZcdUI4OTBcdUI4OTFcdUI4OTNcdUI4OTRcdUI4OTUiKwotICAgICAgICAiXHVCODk2XHVCODk3XHVCODk4XHVCODk5XHVCODlBXHVCODlCXHVCODlDXHVCODlEIisKLSAgICAgICAgIlx1QjhBMVx1QjhBMlx1QjhBM1x1QjhBNFx1QjhBNVx1QjhBNlx1QjhBN1x1QjhBOCIrCi0gICAgICAgICJcdUI4QTlcdUI4QUFcdUI4QUJcdUI4QUNcdUI4QURcdUI4QUVcdUI4QUZcdUI4QjAiKwotICAgICAgICAiXHVCOEIxXHVCOEIzXHVCOEI0XHVCOEI1XHVCOEI2XHVCOEI3XHVCOEI4XHVCOEI5IisKLSAgICAgICAgIlx1QjhCQVx1QjhCQlx1QjhCQ1x1QjhCRFx1QjhDMVx1QjhDMlx1QjhDM1x1QjhDNCIrCi0gICAgICAgICJcdUI4QzVcdUI4QzZcdUI4QzdcdUI4QzhcdUI4QzlcdUI4Q0FcdUI4Q0JcdUI4Q0MiKwotICAgICAgICAiXHVCOENEXHVCOENFXHVCOENGXHVCOEQwXHVCOEQxXHVCOEQzXHVCOEQ0XHVCOEQ1IisKLSAgICAgICAgIlx1QjhENlx1QjhEN1x1QjhEOFx1QjhEOVx1QjhEQVx1QjhEQlx1QjhEQ1x1QjhERCIrCi0gICAgICAgICJcdUI4RTFcdUI4RTJcdUI4RTNcdUI4RTRcdUI4RTVcdUI4RTZcdUI4RTdcdUI4RTgiKwotICAgICAgICAiXHVCOEU5XHVCOEVBXHVCOEVCXHVCOEVDXHVCOEVEXHVCOEVFXHVCOEVGXHVCOEYwIisKLSAgICAgICAgIlx1QjhGMVx1QjhGM1x1QjhGNFx1QjhGNVx1QjhGNlx1QjhGN1x1QjhGOFx1QjhGOSIrCi0gICAgICAgICJcdUI4RkFcdUI4RkJcdUI4RkNcdUI4RkRcdUI5NDFcdUI5NDJcdUI5NDNcdUI5NDQiKwotICAgICAgICAiXHVCOTQ1XHVCOTQ2XHVCOTQ3XHVCOTQ4XHVCOTQ5XHVCOTRBXHVCOTRCXHVCOTRDIisKLSAgICAgICAgIlx1Qjk0RFx1Qjk0RVx1Qjk0Rlx1Qjk1MFx1Qjk1MVx1Qjk1M1x1Qjk1NFx1Qjk1NSIrCi0gICAgICAgICJcdUI5NTZcdUI5NTdcdUI5NThcdUI5NTlcdUI5NUFcdUI5NUJcdUI5NUNcdUI5NUQiKwotICAgICAgICAiXHVCOTYxXHVCOTYyXHVCOTYzXHVCOTY0XHVCOTY1XHVCOTY2XHVCOTY3XHVCOTY4IisKLSAgICAgICAgIlx1Qjk2OVx1Qjk2QVx1Qjk2Qlx1Qjk2Q1x1Qjk2RFx1Qjk2RVx1Qjk2Rlx1Qjk3MCIrCi0gICAgICAgICJcdUI5NzFcdUI5NzNcdUI5NzRcdUI5NzVcdUI5NzZcdUI5NzdcdUI5NzhcdUI5NzkiKwotICAgICAgICAiXHVCOTdBXHVCOTdCXHVCOTdDXHVCOTdEXHVCOTgxXHVCOTgyXHVCOTgzXHVCOTg0IisKLSAgICAgICAgIlx1Qjk4NVx1Qjk4Nlx1Qjk4N1x1Qjk4OFx1Qjk4OVx1Qjk4QVx1Qjk4Qlx1Qjk4QyIrCi0gICAgICAgICJcdUI5OERcdUI5OEVcdUI5OEZcdUI5OTBcdUI5OTFcdUI5OTNcdUI5OTRcdUI5OTUiKwotICAgICAgICAiXHVCOTk2XHVCOTk3XHVCOTk4XHVCOTk5XHVCOTlBXHVCOTlCXHVCOTlDXHVCOTlEIisKLSAgICAgICAgIlx1QjlBMVx1QjlBMlx1QjlBM1x1QjlBNFx1QjlBNVx1QjlBNlx1QjlBN1x1QjlBOCIrCi0gICAgICAgICJcdUI5QTlcdUI5QUFcdUI5QUJcdUI5QUNcdUI5QURcdUI5QUVcdUI5QUZcdUI5QjAiKwotICAgICAgICAiXHVCOUIxXHVCOUIzXHVCOUI0XHVCOUI1XHVCOUI2XHVCOUI3XHVCOUI4XHVCOUI5IisKLSAgICAgICAgIlx1QjlCQVx1QjlCQlx1QjlCQ1x1QjlCRFx1QjlDMVx1QjlDMlx1QjlDM1x1QjlDNCIrCi0gICAgICAgICJcdUI5QzVcdUI5QzZcdUI5QzdcdUI5QzhcdUI5QzlcdUI5Q0FcdUI5Q0JcdUI5Q0MiKwotICAgICAgICAiXHVCOUNEXHVCOUNFXHVCOUNGXHVCOUQwXHVCOUQxXHVCOUQzXHVCOUQ0XHVCOUQ1IisKLSAgICAgICAgIlx1QjlENlx1QjlEN1x1QjlEOFx1QjlEOVx1QjlEQVx1QjlEQlx1QjlEQ1x1QjlERCIrCi0gICAgICAgICJcdUI5RTFcdUI5RTJcdUI5RTNcdUI5RTRcdUI5RTVcdUI5RTZcdUI5RTdcdUI5RTgiKwotICAgICAgICAiXHVCOUU5XHVCOUVBXHVCOUVCXHVCOUVDXHVCOUVEXHVCOUVFXHVCOUVGXHVCOUYwIisKLSAgICAgICAgIlx1QjlGMVx1QjlGM1x1QjlGNFx1QjlGNVx1QjlGNlx1QjlGN1x1QjlGOFx1QjlGOSIrCi0gICAgICAgICJcdUI5RkFcdUI5RkJcdUI5RkNcdUI5RkRcdUJBNDFcdUJBNDJcdUJBNDNcdUJBNDQiKwotICAgICAgICAiXHVCQTQ1XHVCQTQ2XHVCQTQ3XHVCQTQ4XHVCQTQ5XHVCQTRBXHVCQTRCXHVCQTRDIisKLSAgICAgICAgIlx1QkE0RFx1QkE0RVx1QkE0Rlx1QkE1MFx1QkE1MVx1QkE1M1x1QkE1NFx1QkE1NSIrCi0gICAgICAgICJcdUJBNTZcdUJBNTdcdUJBNThcdUJBNTlcdUJBNUFcdUJBNUJcdUJBNUNcdUJBNUQiKwotICAgICAgICAiXHVCQTYxXHVCQTYyXHVCQTYzXHVCQTY0XHVCQTY1XHVCQTY2XHVCQTY3XHVCQTY4IisKLSAgICAgICAgIlx1QkE2OVx1QkE2QVx1QkE2Qlx1QkE2Q1x1QkE2RFx1QkE2RVx1QkE2Rlx1QkE3MCIrCi0gICAgICAgICJcdUJBNzFcdUJBNzNcdUJBNzRcdUJBNzVcdUJBNzZcdUJBNzdcdUJBNzhcdUJBNzkiKwotICAgICAgICAiXHVCQTdBXHVCQTdCXHVCQTdDXHVCQTdEXHVCQTgxXHVCQTgyXHVCQTgzXHVCQTg0IjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBpbm5lckluZGV4OD0KLSAgICAgICAgIlx1QkE4NVx1QkE4Nlx1QkE4N1x1QkE4OFx1QkE4OVx1QkE4QVx1QkE4Qlx1QkE4QyIrCi0gICAgICAgICJcdUJBOERcdUJBOEVcdUJBOEZcdUJBOTBcdUJBOTFcdUJBOTNcdUJBOTRcdUJBOTUiKwotICAgICAgICAiXHVCQTk2XHVCQTk3XHVCQTk4XHVCQTk5XHVCQTlBXHVCQTlCXHVCQTlDXHVCQTlEIisKLSAgICAgICAgIlx1QkFBMVx1QkFBMlx1QkFBM1x1QkFBNFx1QkFBNVx1QkFBNlx1QkFBN1x1QkFBOCIrCi0gICAgICAgICJcdUJBQTlcdUJBQUFcdUJBQUJcdUJBQUNcdUJBQURcdUJBQUVcdUJBQUZcdUJBQjAiKwotICAgICAgICAiXHVCQUIxXHVCQUIzXHVCQUI0XHVCQUI1XHVCQUI2XHVCQUI3XHVCQUI4XHVCQUI5IisKLSAgICAgICAgIlx1QkFCQVx1QkFCQlx1QkFCQ1x1QkFCRFx1QkFDMVx1QkFDMlx1QkFDM1x1QkFDNCIrCi0gICAgICAgICJcdUJBQzVcdUJBQzZcdUJBQzdcdUJBQzhcdUJBQzlcdUJBQ0FcdUJBQ0JcdUJBQ0MiKwotICAgICAgICAiXHVCQUNEXHVCQUNFXHVCQUNGXHVCQUQwXHVCQUQxXHVCQUQzXHVCQUQ0XHVCQUQ1IisKLSAgICAgICAgIlx1QkFENlx1QkFEN1x1QkFEOFx1QkFEOVx1QkFEQVx1QkFEQlx1QkFEQ1x1QkFERCIrCi0gICAgICAgICJcdUJBRTFcdUJBRTJcdUJBRTNcdUJBRTRcdUJBRTVcdUJBRTZcdUJBRTdcdUJBRTgiKwotICAgICAgICAiXHVCQUU5XHVCQUVBXHVCQUVCXHVCQUVDXHVCQUVEXHVCQUVFXHVCQUVGXHVCQUYwIisKLSAgICAgICAgIlx1QkFGMVx1QkFGM1x1QkFGNFx1QkFGNVx1QkFGNlx1QkFGN1x1QkFGOFx1QkFGOSIrCi0gICAgICAgICJcdUJBRkFcdUJBRkJcdUJBRkNcdUJBRkRcdUJCNDFcdUJCNDJcdUJCNDNcdUJCNDQiKwotICAgICAgICAiXHVCQjQ1XHVCQjQ2XHVCQjQ3XHVCQjQ4XHVCQjQ5XHVCQjRBXHVCQjRCXHVCQjRDIisKLSAgICAgICAgIlx1QkI0RFx1QkI0RVx1QkI0Rlx1QkI1MFx1QkI1MVx1QkI1M1x1QkI1NFx1QkI1NSIrCi0gICAgICAgICJcdUJCNTZcdUJCNTdcdUJCNThcdUJCNTlcdUJCNUFcdUJCNUJcdUJCNUNcdUJCNUQiKwotICAgICAgICAiXHVCQjYxXHVCQjYyXHVCQjYzXHVCQjY0XHVCQjY1XHVCQjY2XHVCQjY3XHVCQjY4IisKLSAgICAgICAgIlx1QkI2OVx1QkI2QVx1QkI2Qlx1QkI2Q1x1QkI2RFx1QkI2RVx1QkI2Rlx1QkI3MCIrCi0gICAgICAgICJcdUJCNzFcdUJCNzNcdUJCNzRcdUJCNzVcdUJCNzZcdUJCNzdcdUJCNzhcdUJCNzkiKwotICAgICAgICAiXHVCQjdBXHVCQjdCXHVCQjdDXHVCQjdEXHVCQjgxXHVCQjgyXHVCQjgzXHVCQjg0IisKLSAgICAgICAgIlx1QkI4NVx1QkI4Nlx1QkI4N1x1QkI4OFx1QkI4OVx1QkI4QVx1QkI4Qlx1QkI4QyIrCi0gICAgICAgICJcdUJCOERcdUJCOEVcdUJCOEZcdUJCOTBcdUJCOTFcdUJCOTNcdUJCOTRcdUJCOTUiKwotICAgICAgICAiXHVCQjk2XHVCQjk3XHVCQjk4XHVCQjk5XHVCQjlBXHVCQjlCXHVCQjlDXHVCQjlEIisKLSAgICAgICAgIlx1QkJBMVx1QkJBMlx1QkJBM1x1QkJBNFx1QkJBNVx1QkJBNlx1QkJBN1x1QkJBOCIrCi0gICAgICAgICJcdUJCQTlcdUJCQUFcdUJCQUJcdUJCQUNcdUJCQURcdUJCQUVcdUJCQUZcdUJCQjAiKwotICAgICAgICAiXHVCQkIxXHVCQkIzXHVCQkI0XHVCQkI1XHVCQkI2XHVCQkI3XHVCQkI4XHVCQkI5IisKLSAgICAgICAgIlx1QkJCQVx1QkJCQlx1QkJCQ1x1QkJCRFx1QkM2MVx1QkM2Mlx1QkM2M1x1QkM2NCIrCi0gICAgICAgICJcdUJDNjVcdUJDNjZcdUJDNjdcdUJDNjhcdUJDNjlcdUJDNkFcdUJDNkJcdUJDNkMiKwotICAgICAgICAiXHVCQzZEXHVCQzZFXHVCQzZGXHVCQzcwXHVCQzcxXHVCQzczXHVCQzc0XHVCQzc1IisKLSAgICAgICAgIlx1QkM3Nlx1QkM3N1x1QkM3OFx1QkM3OVx1QkM3QVx1QkM3Qlx1QkM3Q1x1QkM3RCIrCi0gICAgICAgICJcdUJDODFcdUJDODJcdUJDODNcdUJDODRcdUJDODVcdUJDODZcdUJDODdcdUJDODgiKwotICAgICAgICAiXHVCQzg5XHVCQzhBXHVCQzhCXHVCQzhDXHVCQzhEXHVCQzhFXHVCQzhGXHVCQzkwIisKLSAgICAgICAgIlx1QkM5MVx1QkM5M1x1QkM5NFx1QkM5NVx1QkM5Nlx1QkM5N1x1QkM5OFx1QkM5OSIrCi0gICAgICAgICJcdUJDOUFcdUJDOUJcdUJDOUNcdUJDOURcdUJDQTFcdUJDQTJcdUJDQTNcdUJDQTQiKwotICAgICAgICAiXHVCQ0E1XHVCQ0E2XHVCQ0E3XHVCQ0E4XHVCQ0E5XHVCQ0FBXHVCQ0FCXHVCQ0FDIisKLSAgICAgICAgIlx1QkNBRFx1QkNBRVx1QkNBRlx1QkNCMFx1QkNCMVx1QkNCM1x1QkNCNFx1QkNCNSIrCi0gICAgICAgICJcdUJDQjZcdUJDQjdcdUJDQjhcdUJDQjlcdUJDQkFcdUJDQkJcdUJDQkNcdUJDQkQiKwotICAgICAgICAiXHVCQ0MxXHVCQ0MyXHVCQ0MzXHVCQ0M0XHVCQ0M1XHVCQ0M2XHVCQ0M3XHVCQ0M4IisKLSAgICAgICAgIlx1QkNDOVx1QkNDQVx1QkNDQlx1QkNDQ1x1QkNDRFx1QkNDRVx1QkNDRlx1QkNEMCIrCi0gICAgICAgICJcdUJDRDFcdUJDRDNcdUJDRDRcdUJDRDVcdUJDRDZcdUJDRDdcdUJDRDhcdUJDRDkiKwotICAgICAgICAiXHVCQ0RBXHVCQ0RCXHVCQ0RDXHVCQ0REXHVCQ0UxXHVCQ0UyXHVCQ0UzXHVCQ0U0IisKLSAgICAgICAgIlx1QkNFNVx1QkNFNlx1QkNFN1x1QkNFOFx1QkNFOVx1QkNFQVx1QkNFQlx1QkNFQyIrCi0gICAgICAgICJcdUJDRURcdUJDRUVcdUJDRUZcdUJDRjBcdUJDRjFcdUJDRjNcdUJDRjRcdUJDRjUiKwotICAgICAgICAiXHVCQ0Y2XHVCQ0Y3XHVCQ0Y4XHVCQ0Y5XHVCQ0ZBXHVCQ0ZCXHVCQ0ZDXHVCQ0ZEIisKLSAgICAgICAgIlx1QkQ0MVx1QkQ0Mlx1QkQ0M1x1QkQ0NFx1QkQ0NVx1QkQ0Nlx1QkQ0N1x1QkQ0OCIrCi0gICAgICAgICJcdUJENDlcdUJENEFcdUJENEJcdUJENENcdUJENERcdUJENEVcdUJENEZcdUJENTAiKwotICAgICAgICAiXHVCRDUxXHVCRDUzXHVCRDU0XHVCRDU1XHVCRDU2XHVCRDU3XHVCRDU4XHVCRDU5IisKLSAgICAgICAgIlx1QkQ1QVx1QkQ1Qlx1QkQ1Q1x1QkQ1RFx1QkQ2MVx1QkQ2Mlx1QkQ2M1x1QkQ2NCIrCi0gICAgICAgICJcdUJENjVcdUJENjZcdUJENjdcdUJENjhcdUJENjlcdUJENkFcdUJENkJcdUJENkMiKwotICAgICAgICAiXHVCRDZEXHVCRDZFXHVCRDZGXHVCRDcwXHVCRDcxXHVCRDczXHVCRDc0XHVCRDc1IisKLSAgICAgICAgIlx1QkQ3Nlx1QkQ3N1x1QkQ3OFx1QkQ3OVx1QkQ3QVx1QkQ3Qlx1QkQ3Q1x1QkQ3RCIrCi0gICAgICAgICJcdUJEODFcdUJEODJcdUJEODNcdUJEODRcdUJEODVcdUJEODZcdUJEODdcdUJEODgiKwotICAgICAgICAiXHVCRDg5XHVCRDhBXHVCRDhCXHVCRDhDXHVCRDhEXHVCRDhFXHVCRDhGXHVCRDkwIisKLSAgICAgICAgIlx1QkQ5MVx1QkQ5M1x1QkQ5NFx1QkQ5NVx1QkQ5Nlx1QkQ5N1x1QkQ5OFx1QkQ5OSIrCi0gICAgICAgICJcdUJEOUFcdUJEOUJcdUJEOUNcdUJEOURcdUJEQTFcdUJEQTJcdUJEQTNcdUJEQTQiKwotICAgICAgICAiXHVCREE1XHVCREE2XHVCREE3XHVCREE4XHVCREE5XHVCREFBXHVCREFCXHVCREFDIisKLSAgICAgICAgIlx1QkRBRFx1QkRBRVx1QkRBRlx1QkRCMFx1QkRCMVx1QkRCM1x1QkRCNFx1QkRCNSIrCi0gICAgICAgICJcdUJEQjZcdUJEQjdcdUJEQjhcdUJEQjlcdUJEQkFcdUJEQkJcdUJEQkNcdUJEQkQiKwotICAgICAgICAiXHVCREMxXHVCREMyXHVCREMzXHVCREM0XHVCREM1XHVCREM2XHVCREM3XHVCREM4IisKLSAgICAgICAgIlx1QkRDOVx1QkRDQVx1QkRDQlx1QkRDQ1x1QkRDRFx1QkRDRVx1QkRDRlx1QkREMCIrCi0gICAgICAgICJcdUJERDFcdUJERDNcdUJERDRcdUJERDVcdUJERDZcdUJERDdcdUJERDhcdUJERDkiKwotICAgICAgICAiXHVCRERBXHVCRERCXHVCRERDXHVCREREXHVCREUxXHVCREUyXHVCREUzXHVCREU0IisKLSAgICAgICAgIlx1QkRFNVx1QkRFNlx1QkRFN1x1QkRFOFx1QkRFOVx1QkRFQVx1QkRFQlx1QkRFQyIrCi0gICAgICAgICJcdUJERURcdUJERUVcdUJERUZcdUJERjBcdUJERjFcdUJERjNcdUJERjRcdUJERjUiKwotICAgICAgICAiXHVCREY2XHVCREY3XHVCREY4XHVCREY5XHVCREZBXHVCREZCXHVCREZDXHVCREZEIisKLSAgICAgICAgIlx1QkU0MVx1QkU0Mlx1QkU0M1x1QkU0NFx1QkU0NVx1QkU0Nlx1QkU0N1x1QkU0OCIrCi0gICAgICAgICJcdUJFNDlcdUJFNEFcdUJFNEJcdUJFNENcdUJFNERcdUJFNEVcdUJFNEZcdUJFNTAiKwotICAgICAgICAiXHVCRTUxXHVCRTUzXHVCRTU0XHVCRTU1XHVCRTU2XHVCRTU3XHVCRTU4XHVCRTU5IisKLSAgICAgICAgIlx1QkU1QVx1QkU1Qlx1QkU1Q1x1QkU1RFx1QkU2MVx1QkU2Mlx1QkU2M1x1QkU2NCIrCi0gICAgICAgICJcdUJFNjVcdUJFNjZcdUJFNjdcdUJFNjhcdUJFNjlcdUJFNkFcdUJFNkJcdUJFNkMiKwotICAgICAgICAiXHVCRTZEXHVCRTZFXHVCRTZGXHVCRTcwXHVCRTcxXHVCRTczXHVCRTc0XHVCRTc1IisKLSAgICAgICAgIlx1QkU3Nlx1QkU3N1x1QkU3OFx1QkU3OVx1QkU3QVx1QkU3Qlx1QkU3Q1x1QkU3RCIrCi0gICAgICAgICJcdUJFODFcdUJFODJcdUJFODNcdUJFODRcdUJFODVcdUJFODZcdUJFODdcdUJFODgiKwotICAgICAgICAiXHVCRTg5XHVCRThBXHVCRThCXHVCRThDXHVCRThEXHVCRThFXHVCRThGXHVCRTkwIisKLSAgICAgICAgIlx1QkU5MVx1QkU5M1x1QkU5NFx1QkU5NVx1QkU5Nlx1QkU5N1x1QkU5OFx1QkU5OSIrCi0gICAgICAgICJcdUJFOUFcdUJFOUJcdUJFOUNcdUJFOURcdUJFQTFcdUJFQTJcdUJFQTNcdUJFQTQiKwotICAgICAgICAiXHVCRUE1XHVCRUE2XHVCRUE3XHVCRUE4XHVCRUE5XHVCRUFBXHVCRUFCXHVCRUFDIisKLSAgICAgICAgIlx1QkVBRFx1QkVBRVx1QkVBRlx1QkVCMFx1QkVCMVx1QkVCM1x1QkVCNFx1QkVCNSIrCi0gICAgICAgICJcdUJFQjZcdUJFQjdcdUJFQjhcdUJFQjlcdUJFQkFcdUJFQkJcdUJFQkNcdUJFQkQiKwotICAgICAgICAiXHVCRUMxXHVCRUMyXHVCRUMzXHVCRUM0XHVCRUM1XHVCRUM2XHVCRUM3XHVCRUM4IisKLSAgICAgICAgIlx1QkVDOVx1QkVDQVx1QkVDQlx1QkVDQ1x1QkVDRFx1QkVDRVx1QkVDRlx1QkVEMCIrCi0gICAgICAgICJcdUJFRDFcdUJFRDNcdUJFRDRcdUJFRDVcdUJFRDZcdUJFRDdcdUJFRDhcdUJFRDkiKwotICAgICAgICAiXHVCRURBXHVCRURCXHVCRURDXHVCRUREXHVCRUUxXHVCRUUyXHVCRUUzXHVCRUU0IisKLSAgICAgICAgIlx1QkVFNVx1QkVFNlx1QkVFN1x1QkVFOFx1QkVFOVx1QkVFQVx1QkVFQlx1QkVFQyIrCi0gICAgICAgICJcdUJFRURcdUJFRUVcdUJFRUZcdUJFRjBcdUJFRjFcdUJFRjNcdUJFRjRcdUJFRjUiKwotICAgICAgICAiXHVCRUY2XHVCRUY3XHVCRUY4XHVCRUY5XHVCRUZBXHVCRUZCXHVCRUZDXHVCRUZEIisKLSAgICAgICAgIlx1QkY0MVx1QkY0Mlx1QkY0M1x1QkY0NFx1QkY0NVx1QkY0Nlx1QkY0N1x1QkY0OCIrCi0gICAgICAgICJcdUJGNDlcdUJGNEFcdUJGNEJcdUJGNENcdUJGNERcdUJGNEVcdUJGNEZcdUJGNTAiKwotICAgICAgICAiXHVCRjUxXHVCRjUzXHVCRjU0XHVCRjU1XHVCRjU2XHVCRjU3XHVCRjU4XHVCRjU5IisKLSAgICAgICAgIlx1QkY1QVx1QkY1Qlx1QkY1Q1x1QkY1RFx1QkY2MVx1QkY2Mlx1QkY2M1x1QkY2NCIrCi0gICAgICAgICJcdUJGNjVcdUJGNjZcdUJGNjdcdUJGNjhcdUJGNjlcdUJGNkFcdUJGNkJcdUJGNkMiKwotICAgICAgICAiXHVCRjZEXHVCRjZFXHVCRjZGXHVCRjcwXHVCRjcxXHVCRjczXHVCRjc0XHVCRjc1IisKLSAgICAgICAgIlx1QkY3Nlx1QkY3N1x1QkY3OFx1QkY3OVx1QkY3QVx1QkY3Qlx1QkY3Q1x1QkY3RCIrCi0gICAgICAgICJcdUJGODFcdUJGODJcdUJGODNcdUJGODRcdUJGODVcdUJGODZcdUJGODdcdUJGODgiKwotICAgICAgICAiXHVCRjg5XHVCRjhBXHVCRjhCXHVCRjhDXHVCRjhEXHVCRjhFXHVCRjhGXHVCRjkwIisKLSAgICAgICAgIlx1QkY5MVx1QkY5M1x1QkY5NFx1QkY5NVx1QkY5Nlx1QkY5N1x1QkY5OFx1QkY5OSIrCi0gICAgICAgICJcdUJGOUFcdUJGOUJcdUJGOUNcdUJGOURcdUJGQTFcdUJGQTJcdUJGQTNcdUJGQTQiKwotICAgICAgICAiXHVCRkE1XHVCRkE2XHVCRkE3XHVCRkE4XHVCRkE5XHVCRkFBXHVCRkFCXHVCRkFDIisKLSAgICAgICAgIlx1QkZBRFx1QkZBRVx1QkZBRlx1QkZCMFx1QkZCMVx1QkZCM1x1QkZCNFx1QkZCNSIrCi0gICAgICAgICJcdUJGQjZcdUJGQjdcdUJGQjhcdUJGQjlcdUJGQkFcdUJGQkJcdUJGQkNcdUJGQkQiKwotICAgICAgICAiXHVDMDYxXHVDMDYyXHVDMDYzXHVDMDY0XHVDMDY1XHVDMDY2XHVDMDY3XHVDMDY4IisKLSAgICAgICAgIlx1QzA2OVx1QzA2QVx1QzA2Qlx1QzA2Q1x1QzA2RFx1QzA2RVx1QzA2Rlx1QzA3MCIrCi0gICAgICAgICJcdUMwNzFcdUMwNzNcdUMwNzRcdUMwNzVcdUMwNzZcdUMwNzdcdUMwNzhcdUMwNzkiKwotICAgICAgICAiXHVDMDdBXHVDMDdCXHVDMDdDXHVDMDdEXHVDMDgxXHVDMDgyXHVDMDgzXHVDMDg0IisKLSAgICAgICAgIlx1QzA4NVx1QzA4Nlx1QzA4N1x1QzA4OFx1QzA4OVx1QzA4QVx1QzA4Qlx1QzA4QyIrCi0gICAgICAgICJcdUMwOERcdUMwOEVcdUMwOEZcdUMwOTBcdUMwOTFcdUMwOTNcdUMwOTRcdUMwOTUiKwotICAgICAgICAiXHVDMDk2XHVDMDk3XHVDMDk4XHVDMDk5XHVDMDlBXHVDMDlCXHVDMDlDXHVDMDlEIisKLSAgICAgICAgIlx1QzBBMVx1QzBBMlx1QzBBM1x1QzBBNFx1QzBBNVx1QzBBNlx1QzBBN1x1QzBBOCIrCi0gICAgICAgICJcdUMwQTlcdUMwQUFcdUMwQUJcdUMwQUNcdUMwQURcdUMwQUVcdUMwQUZcdUMwQjAiKwotICAgICAgICAiXHVDMEIxXHVDMEIzXHVDMEI0XHVDMEI1XHVDMEI2XHVDMEI3XHVDMEI4XHVDMEI5IisKLSAgICAgICAgIlx1QzBCQVx1QzBCQlx1QzBCQ1x1QzBCRFx1QzBDMVx1QzBDMlx1QzBDM1x1QzBDNCIrCi0gICAgICAgICJcdUMwQzVcdUMwQzZcdUMwQzdcdUMwQzhcdUMwQzlcdUMwQ0FcdUMwQ0JcdUMwQ0MiKwotICAgICAgICAiXHVDMENEXHVDMENFXHVDMENGXHVDMEQwXHVDMEQxXHVDMEQzXHVDMEQ0XHVDMEQ1IisKLSAgICAgICAgIlx1QzBENlx1QzBEN1x1QzBEOFx1QzBEOVx1QzBEQVx1QzBEQlx1QzBEQ1x1QzBERCIrCi0gICAgICAgICJcdUMwRTFcdUMwRTJcdUMwRTNcdUMwRTRcdUMwRTVcdUMwRTZcdUMwRTdcdUMwRTgiKwotICAgICAgICAiXHVDMEU5XHVDMEVBXHVDMEVCXHVDMEVDXHVDMEVEXHVDMEVFXHVDMEVGXHVDMEYwIisKLSAgICAgICAgIlx1QzBGMVx1QzBGM1x1QzBGNFx1QzBGNVx1QzBGNlx1QzBGN1x1QzBGOFx1QzBGOSIrCi0gICAgICAgICJcdUMwRkFcdUMwRkJcdUMwRkNcdUMwRkRcdUMxNDFcdUMxNDJcdUMxNDNcdUMxNDQiKwotICAgICAgICAiXHVDMTQ1XHVDMTQ2XHVDMTQ3XHVDMTQ4XHVDMTQ5XHVDMTRBXHVDMTRCXHVDMTRDIisKLSAgICAgICAgIlx1QzE0RFx1QzE0RVx1QzE0Rlx1QzE1MFx1QzE1MVx1QzE1M1x1QzE1NFx1QzE1NSIrCi0gICAgICAgICJcdUMxNTZcdUMxNTdcdUMxNThcdUMxNTlcdUMxNUFcdUMxNUJcdUMxNUNcdUMxNUQiKwotICAgICAgICAiXHVDMTYxXHVDMTYyXHVDMTYzXHVDMTY0XHVDMTY1XHVDMTY2XHVDMTY3XHVDMTY4IisKLSAgICAgICAgIlx1QzE2OVx1QzE2QVx1QzE2Qlx1QzE2Q1x1QzE2RFx1QzE2RVx1QzE2Rlx1QzE3MCIrCi0gICAgICAgICJcdUMxNzFcdUMxNzNcdUMxNzRcdUMxNzVcdUMxNzZcdUMxNzdcdUMxNzhcdUMxNzkiKwotICAgICAgICAiXHVDMTdBXHVDMTdCXHVDMTdDXHVDMTdEXHVDMTgxXHVDMTgyXHVDMTgzXHVDMTg0IisKLSAgICAgICAgIlx1QzE4NVx1QzE4Nlx1QzE4N1x1QzE4OFx1QzE4OVx1QzE4QVx1QzE4Qlx1QzE4QyIrCi0gICAgICAgICJcdUMxOERcdUMxOEVcdUMxOEZcdUMxOTBcdUMxOTFcdUMxOTNcdUMxOTRcdUMxOTUiKwotICAgICAgICAiXHVDMTk2XHVDMTk3XHVDMTk4XHVDMTk5XHVDMTlBXHVDMTlCXHVDMTlDXHVDMTlEIisKLSAgICAgICAgIlx1QzFBMVx1QzFBMlx1QzFBM1x1QzFBNFx1QzFBNVx1QzFBNlx1QzFBN1x1QzFBOCIrCi0gICAgICAgICJcdUMxQTlcdUMxQUFcdUMxQUJcdUMxQUNcdUMxQURcdUMxQUVcdUMxQUZcdUMxQjAiKwotICAgICAgICAiXHVDMUIxXHVDMUIzXHVDMUI0XHVDMUI1XHVDMUI2XHVDMUI3XHVDMUI4XHVDMUI5IisKLSAgICAgICAgIlx1QzFCQVx1QzFCQlx1QzFCQ1x1QzFCRFx1QzFDMVx1QzFDMlx1QzFDM1x1QzFDNCIrCi0gICAgICAgICJcdUMxQzVcdUMxQzZcdUMxQzdcdUMxQzhcdUMxQzlcdUMxQ0FcdUMxQ0JcdUMxQ0MiKwotICAgICAgICAiXHVDMUNEXHVDMUNFXHVDMUNGXHVDMUQwXHVDMUQxXHVDMUQzXHVDMUQ0XHVDMUQ1IisKLSAgICAgICAgIlx1QzFENlx1QzFEN1x1QzFEOFx1QzFEOVx1QzFEQVx1QzFEQlx1QzFEQ1x1QzFERCIrCi0gICAgICAgICJcdUMxRTFcdUMxRTJcdUMxRTNcdUMxRTRcdUMxRTVcdUMxRTZcdUMxRTdcdUMxRTgiKwotICAgICAgICAiXHVDMUU5XHVDMUVBXHVDMUVCXHVDMUVDXHVDMUVEXHVDMUVFXHVDMUVGXHVDMUYwIisKLSAgICAgICAgIlx1QzFGMVx1QzFGM1x1QzFGNFx1QzFGNVx1QzFGNlx1QzFGN1x1QzFGOFx1QzFGOSIrCi0gICAgICAgICJcdUMxRkFcdUMxRkJcdUMxRkNcdUMxRkRcdUMyNDFcdUMyNDJcdUMyNDNcdUMyNDQiKwotICAgICAgICAiXHVDMjQ1XHVDMjQ2XHVDMjQ3XHVDMjQ4XHVDMjQ5XHVDMjRBXHVDMjRCXHVDMjRDIisKLSAgICAgICAgIlx1QzI0RFx1QzI0RVx1QzI0Rlx1QzI1MFx1QzI1MVx1QzI1M1x1QzI1NFx1QzI1NSIrCi0gICAgICAgICJcdUMyNTZcdUMyNTdcdUMyNThcdUMyNTlcdUMyNUFcdUMyNUJcdUMyNUNcdUMyNUQiKwotICAgICAgICAiXHVDMjYxXHVDMjYyXHVDMjYzXHVDMjY0XHVDMjY1XHVDMjY2XHVDMjY3XHVDMjY4IisKLSAgICAgICAgIlx1QzI2OVx1QzI2QVx1QzI2Qlx1QzI2Q1x1QzI2RFx1QzI2RVx1QzI2Rlx1QzI3MCIrCi0gICAgICAgICJcdUMyNzFcdUMyNzNcdUMyNzRcdUMyNzVcdUMyNzZcdUMyNzdcdUMyNzhcdUMyNzkiKwotICAgICAgICAiXHVDMjdBXHVDMjdCXHVDMjdDXHVDMjdEXHVDMjgxXHVDMjgyXHVDMjgzXHVDMjg0IisKLSAgICAgICAgIlx1QzI4NVx1QzI4Nlx1QzI4N1x1QzI4OFx1QzI4OVx1QzI4QVx1QzI4Qlx1QzI4QyIrCi0gICAgICAgICJcdUMyOERcdUMyOEVcdUMyOEZcdUMyOTBcdUMyOTFcdUMyOTNcdUMyOTRcdUMyOTUiKwotICAgICAgICAiXHVDMjk2XHVDMjk3XHVDMjk4XHVDMjk5XHVDMjlBXHVDMjlCXHVDMjlDXHVDMjlEIisKLSAgICAgICAgIlx1QzJBMVx1QzJBMlx1QzJBM1x1QzJBNFx1QzJBNVx1QzJBNlx1QzJBN1x1QzJBOCIrCi0gICAgICAgICJcdUMyQTlcdUMyQUFcdUMyQUJcdUMyQUNcdUMyQURcdUMyQUVcdUMyQUZcdUMyQjAiKwotICAgICAgICAiXHVDMkIxXHVDMkIzXHVDMkI0XHVDMkI1XHVDMkI2XHVDMkI3XHVDMkI4XHVDMkI5IisKLSAgICAgICAgIlx1QzJCQVx1QzJCQlx1QzJCQ1x1QzJCRFx1QzJDMVx1QzJDMlx1QzJDM1x1QzJDNCIrCi0gICAgICAgICJcdUMyQzVcdUMyQzZcdUMyQzdcdUMyQzhcdUMyQzlcdUMyQ0FcdUMyQ0JcdUMyQ0MiKwotICAgICAgICAiXHVDMkNEXHVDMkNFXHVDMkNGXHVDMkQwXHVDMkQxXHVDMkQzXHVDMkQ0XHVDMkQ1IisKLSAgICAgICAgIlx1QzJENlx1QzJEN1x1QzJEOFx1QzJEOVx1QzJEQVx1QzJEQlx1QzJEQ1x1QzJERCIrCi0gICAgICAgICJcdUMyRTFcdUMyRTJcdUMyRTNcdUMyRTRcdUMyRTVcdUMyRTZcdUMyRTdcdUMyRTgiKwotICAgICAgICAiXHVDMkU5XHVDMkVBXHVDMkVCXHVDMkVDXHVDMkVEXHVDMkVFXHVDMkVGXHVDMkYwIisKLSAgICAgICAgIlx1QzJGMVx1QzJGM1x1QzJGNFx1QzJGNVx1QzJGNlx1QzJGN1x1QzJGOFx1QzJGOSIrCi0gICAgICAgICJcdUMyRkFcdUMyRkJcdUMyRkNcdUMyRkRcdUMzNDFcdUMzNDJcdUMzNDNcdUMzNDQiKwotICAgICAgICAiXHVDMzQ1XHVDMzQ2XHVDMzQ3XHVDMzQ4XHVDMzQ5XHVDMzRBXHVDMzRCXHVDMzRDIisKLSAgICAgICAgIlx1QzM0RFx1QzM0RVx1QzM0Rlx1QzM1MFx1QzM1MVx1QzM1M1x1QzM1NFx1QzM1NSIrCi0gICAgICAgICJcdUMzNTZcdUMzNTdcdUMzNThcdUMzNTlcdUMzNUFcdUMzNUJcdUMzNUNcdUMzNUQiKwotICAgICAgICAiXHVDMzYxXHVDMzYyXHVDMzYzXHVDMzY0XHVDMzY1XHVDMzY2XHVDMzY3XHVDMzY4IisKLSAgICAgICAgIlx1QzM2OVx1QzM2QVx1QzM2Qlx1QzM2Q1x1QzM2RFx1QzM2RVx1QzM2Rlx1QzM3MCIrCi0gICAgICAgICJcdUMzNzFcdUMzNzNcdUMzNzRcdUMzNzVcdUMzNzZcdUMzNzdcdUMzNzhcdUMzNzkiKwotICAgICAgICAiXHVDMzdBXHVDMzdCXHVDMzdDXHVDMzdEXHVDMzgxXHVDMzgyXHVDMzgzXHVDMzg0IisKLSAgICAgICAgIlx1QzM4NVx1QzM4Nlx1QzM4N1x1QzM4OFx1QzM4OVx1QzM4QVx1QzM4Qlx1QzM4QyIrCi0gICAgICAgICJcdUMzOERcdUMzOEVcdUMzOEZcdUMzOTBcdUMzOTFcdUMzOTNcdUMzOTRcdUMzOTUiKwotICAgICAgICAiXHVDMzk2XHVDMzk3XHVDMzk4XHVDMzk5XHVDMzlBXHVDMzlCXHVDMzlDXHVDMzlEIisKLSAgICAgICAgIlx1QzNBMVx1QzNBMlx1QzNBM1x1QzNBNFx1QzNBNVx1QzNBNlx1QzNBN1x1QzNBOCIrCi0gICAgICAgICJcdUMzQTlcdUMzQUFcdUMzQUJcdUMzQUNcdUMzQURcdUMzQUVcdUMzQUZcdUMzQjAiKwotICAgICAgICAiXHVDM0IxXHVDM0IzXHVDM0I0XHVDM0I1XHVDM0I2XHVDM0I3XHVDM0I4XHVDM0I5IisKLSAgICAgICAgIlx1QzNCQVx1QzNCQlx1QzNCQ1x1QzNCRFx1QzQ2MVx1QzQ2Mlx1QzQ2M1x1QzQ2NCIrCi0gICAgICAgICJcdUM0NjVcdUM0NjZcdUM0NjdcdUM0NjhcdUM0NjlcdUM0NkFcdUM0NkJcdUM0NkMiKwotICAgICAgICAiXHVDNDZEXHVDNDZFXHVDNDZGXHVDNDcwXHVDNDcxXHVDNDczXHVDNDc0XHVDNDc1IisKLSAgICAgICAgIlx1QzQ3Nlx1QzQ3N1x1QzQ3OFx1QzQ3OVx1QzQ3QVx1QzQ3Qlx1QzQ3Q1x1QzQ3RCIrCi0gICAgICAgICJcdUM0ODFcdUM0ODJcdUM0ODNcdUM0ODRcdUM0ODVcdUM0ODZcdUM0ODdcdUM0ODgiKwotICAgICAgICAiXHVDNDg5XHVDNDhBXHVDNDhCXHVDNDhDXHVDNDhEXHVDNDhFXHVDNDhGXHVDNDkwIisKLSAgICAgICAgIlx1QzQ5MVx1QzQ5M1x1QzQ5NFx1QzQ5NVx1QzQ5Nlx1QzQ5N1x1QzQ5OFx1QzQ5OSIrCi0gICAgICAgICJcdUM0OUFcdUM0OUJcdUM0OUNcdUM0OURcdUM0QTFcdUM0QTJcdUM0QTNcdUM0QTQiKwotICAgICAgICAiXHVDNEE1XHVDNEE2XHVDNEE3XHVDNEE4XHVDNEE5XHVDNEFBXHVDNEFCXHVDNEFDIisKLSAgICAgICAgIlx1QzRBRFx1QzRBRVx1QzRBRlx1QzRCMFx1QzRCMVx1QzRCM1x1QzRCNFx1QzRCNSIrCi0gICAgICAgICJcdUM0QjZcdUM0QjdcdUM0QjhcdUM0QjlcdUM0QkFcdUM0QkJcdUM0QkNcdUM0QkQiKwotICAgICAgICAiXHVDNEMxXHVDNEMyXHVDNEMzXHVDNEM0XHVDNEM1XHVDNEM2XHVDNEM3XHVDNEM4IisKLSAgICAgICAgIlx1QzRDOVx1QzRDQVx1QzRDQlx1QzRDQ1x1QzRDRFx1QzRDRVx1QzRDRlx1QzREMCIrCi0gICAgICAgICJcdUM0RDFcdUM0RDNcdUM0RDRcdUM0RDVcdUM0RDZcdUM0RDdcdUM0RDhcdUM0RDkiKwotICAgICAgICAiXHVDNERBXHVDNERCXHVDNERDXHVDNEREXHVDNEUxXHVDNEUyXHVDNEUzXHVDNEU0IisKLSAgICAgICAgIlx1QzRFNVx1QzRFNlx1QzRFN1x1QzRFOFx1QzRFOVx1QzRFQVx1QzRFQlx1QzRFQyIrCi0gICAgICAgICJcdUM0RURcdUM0RUVcdUM0RUZcdUM0RjBcdUM0RjFcdUM0RjNcdUM0RjRcdUM0RjUiKwotICAgICAgICAiXHVDNEY2XHVDNEY3XHVDNEY4XHVDNEY5XHVDNEZBXHVDNEZCXHVDNEZDXHVDNEZEIisKLSAgICAgICAgIlx1QzU0MVx1QzU0Mlx1QzU0M1x1QzU0NFx1QzU0NVx1QzU0Nlx1QzU0N1x1QzU0OCIrCi0gICAgICAgICJcdUM1NDlcdUM1NEFcdUM1NEJcdUM1NENcdUM1NERcdUM1NEVcdUM1NEZcdUM1NTAiKwotICAgICAgICAiXHVDNTUxXHVDNTUzXHVDNTU0XHVDNTU1XHVDNTU2XHVDNTU3XHVDNTU4XHVDNTU5IisKLSAgICAgICAgIlx1QzU1QVx1QzU1Qlx1QzU1Q1x1QzU1RFx1QzU2MVx1QzU2Mlx1QzU2M1x1QzU2NCIrCi0gICAgICAgICJcdUM1NjVcdUM1NjZcdUM1NjdcdUM1NjhcdUM1NjlcdUM1NkFcdUM1NkJcdUM1NkMiKwotICAgICAgICAiXHVDNTZEXHVDNTZFXHVDNTZGXHVDNTcwXHVDNTcxXHVDNTczXHVDNTc0XHVDNTc1IisKLSAgICAgICAgIlx1QzU3Nlx1QzU3N1x1QzU3OFx1QzU3OVx1QzU3QVx1QzU3Qlx1QzU3Q1x1QzU3RCIrCi0gICAgICAgICJcdUM1ODFcdUM1ODJcdUM1ODNcdUM1ODRcdUM1ODVcdUM1ODZcdUM1ODdcdUM1ODgiKwotICAgICAgICAiXHVDNTg5XHVDNThBXHVDNThCXHVDNThDXHVDNThEXHVDNThFXHVDNThGXHVDNTkwIisKLSAgICAgICAgIlx1QzU5MVx1QzU5M1x1QzU5NFx1QzU5NVx1QzU5Nlx1QzU5N1x1QzU5OFx1QzU5OSIrCi0gICAgICAgICJcdUM1OUFcdUM1OUJcdUM1OUNcdUM1OURcdUM1QTFcdUM1QTJcdUM1QTNcdUM1QTQiKwotICAgICAgICAiXHVDNUE1XHVDNUE2XHVDNUE3XHVDNUE4XHVDNUE5XHVDNUFBXHVDNUFCXHVDNUFDIisKLSAgICAgICAgIlx1QzVBRFx1QzVBRVx1QzVBRlx1QzVCMFx1QzVCMVx1QzVCM1x1QzVCNFx1QzVCNSIrCi0gICAgICAgICJcdUM1QjZcdUM1QjdcdUM1QjhcdUM1QjlcdUM1QkFcdUM1QkJcdUM1QkNcdUM1QkQiKwotICAgICAgICAiXHVDNUMxXHVDNUMyXHVDNUMzXHVDNUM0XHVDNUM1XHVDNUM2XHVDNUM3XHVDNUM4IisKLSAgICAgICAgIlx1QzVDOVx1QzVDQVx1QzVDQlx1QzVDQ1x1QzVDRFx1QzVDRVx1QzVDRlx1QzVEMCIrCi0gICAgICAgICJcdUM1RDFcdUM1RDNcdUM1RDRcdUM1RDVcdUM1RDZcdUM1RDdcdUM1RDhcdUM1RDkiKwotICAgICAgICAiXHVDNURBXHVDNURCXHVDNURDXHVDNUREXHVDNUUxXHVDNUUyXHVDNUUzXHVDNUU0IisKLSAgICAgICAgIlx1QzVFNVx1QzVFNlx1QzVFN1x1QzVFOFx1QzVFOVx1QzVFQVx1QzVFQlx1QzVFQyIrCi0gICAgICAgICJcdUM1RURcdUM1RUVcdUM1RUZcdUM1RjBcdUM1RjFcdUM1RjNcdUM1RjRcdUM1RjUiKwotICAgICAgICAiXHVDNUY2XHVDNUY3XHVDNUY4XHVDNUY5XHVDNUZBXHVDNUZCXHVDNUZDXHVDNUZEIisKLSAgICAgICAgIlx1QzY0MVx1QzY0Mlx1QzY0M1x1QzY0NFx1QzY0NVx1QzY0Nlx1QzY0N1x1QzY0OCIrCi0gICAgICAgICJcdUM2NDlcdUM2NEFcdUM2NEJcdUM2NENcdUM2NERcdUM2NEVcdUM2NEZcdUM2NTAiKwotICAgICAgICAiXHVDNjUxXHVDNjUzXHVDNjU0XHVDNjU1XHVDNjU2XHVDNjU3XHVDNjU4XHVDNjU5IisKLSAgICAgICAgIlx1QzY1QVx1QzY1Qlx1QzY1Q1x1QzY1RFx1QzY2MVx1QzY2Mlx1QzY2M1x1QzY2NCIrCi0gICAgICAgICJcdUM2NjVcdUM2NjZcdUM2NjdcdUM2NjhcdUM2NjlcdUM2NkFcdUM2NkJcdUM2NkMiKwotICAgICAgICAiXHVDNjZEXHVDNjZFXHVDNjZGXHVDNjcwXHVDNjcxXHVDNjczXHVDNjc0XHVDNjc1IisKLSAgICAgICAgIlx1QzY3Nlx1QzY3N1x1QzY3OFx1QzY3OVx1QzY3QVx1QzY3Qlx1QzY3Q1x1QzY3RCIrCi0gICAgICAgICJcdUM2ODFcdUM2ODJcdUM2ODNcdUM2ODRcdUM2ODVcdUM2ODZcdUM2ODdcdUM2ODgiKwotICAgICAgICAiXHVDNjg5XHVDNjhBXHVDNjhCXHVDNjhDXHVDNjhEXHVDNjhFXHVDNjhGXHVDNjkwIisKLSAgICAgICAgIlx1QzY5MVx1QzY5M1x1QzY5NFx1QzY5NVx1QzY5Nlx1QzY5N1x1QzY5OFx1QzY5OSIrCi0gICAgICAgICJcdUM2OUFcdUM2OUJcdUM2OUNcdUM2OURcdUM2QTFcdUM2QTJcdUM2QTNcdUM2QTQiKwotICAgICAgICAiXHVDNkE1XHVDNkE2XHVDNkE3XHVDNkE4XHVDNkE5XHVDNkFBXHVDNkFCXHVDNkFDIisKLSAgICAgICAgIlx1QzZBRFx1QzZBRVx1QzZBRlx1QzZCMFx1QzZCMVx1QzZCM1x1QzZCNFx1QzZCNSIrCi0gICAgICAgICJcdUM2QjZcdUM2QjdcdUM2QjhcdUM2QjlcdUM2QkFcdUM2QkJcdUM2QkNcdUM2QkQiKwotICAgICAgICAiXHVDNkMxXHVDNkMyXHVDNkMzXHVDNkM0XHVDNkM1XHVDNkM2XHVDNkM3XHVDNkM4IisKLSAgICAgICAgIlx1QzZDOVx1QzZDQVx1QzZDQlx1QzZDQ1x1QzZDRFx1QzZDRVx1QzZDRlx1QzZEMCIrCi0gICAgICAgICJcdUM2RDFcdUM2RDNcdUM2RDRcdUM2RDVcdUM2RDZcdUM2RDdcdUM2RDhcdUM2RDkiKwotICAgICAgICAiXHVDNkRBXHVDNkRCXHVDNkRDXHVDNkREXHVDNkUxXHVDNkUyXHVDNkUzXHVDNkU0IisKLSAgICAgICAgIlx1QzZFNVx1QzZFNlx1QzZFN1x1QzZFOFx1QzZFOVx1QzZFQVx1QzZFQlx1QzZFQyIrCi0gICAgICAgICJcdUM2RURcdUM2RUVcdUM2RUZcdUM2RjBcdUM2RjFcdUM2RjNcdUM2RjRcdUM2RjUiKwotICAgICAgICAiXHVDNkY2XHVDNkY3XHVDNkY4XHVDNkY5XHVDNkZBXHVDNkZCXHVDNkZDXHVDNkZEIisKLSAgICAgICAgIlx1Qzc0MVx1Qzc0Mlx1Qzc0M1x1Qzc0NFx1Qzc0NVx1Qzc0Nlx1Qzc0N1x1Qzc0OCIrCi0gICAgICAgICJcdUM3NDlcdUM3NEFcdUM3NEJcdUM3NENcdUM3NERcdUM3NEVcdUM3NEZcdUM3NTAiKwotICAgICAgICAiXHVDNzUxXHVDNzUzXHVDNzU0XHVDNzU1XHVDNzU2XHVDNzU3XHVDNzU4XHVDNzU5IisKLSAgICAgICAgIlx1Qzc1QVx1Qzc1Qlx1Qzc1Q1x1Qzc1RFx1Qzc2MVx1Qzc2Mlx1Qzc2M1x1Qzc2NCIrCi0gICAgICAgICJcdUM3NjVcdUM3NjZcdUM3NjdcdUM3NjhcdUM3NjlcdUM3NkFcdUM3NkJcdUM3NkMiKwotICAgICAgICAiXHVDNzZEXHVDNzZFXHVDNzZGXHVDNzcwXHVDNzcxXHVDNzczXHVDNzc0XHVDNzc1IisKLSAgICAgICAgIlx1Qzc3Nlx1Qzc3N1x1Qzc3OFx1Qzc3OVx1Qzc3QVx1Qzc3Qlx1Qzc3Q1x1Qzc3RCIrCi0gICAgICAgICJcdUM3ODFcdUM3ODJcdUM3ODNcdUM3ODRcdUM3ODVcdUM3ODZcdUM3ODdcdUM3ODgiKwotICAgICAgICAiXHVDNzg5XHVDNzhBXHVDNzhCXHVDNzhDXHVDNzhEXHVDNzhFXHVDNzhGXHVDNzkwIisKLSAgICAgICAgIlx1Qzc5MVx1Qzc5M1x1Qzc5NFx1Qzc5NVx1Qzc5Nlx1Qzc5N1x1Qzc5OFx1Qzc5OSIrCi0gICAgICAgICJcdUM3OUFcdUM3OUJcdUM3OUNcdUM3OURcdUM3QTFcdUM3QTJcdUM3QTNcdUM3QTQiKwotICAgICAgICAiXHVDN0E1XHVDN0E2XHVDN0E3XHVDN0E4XHVDN0E5XHVDN0FBXHVDN0FCXHVDN0FDIisKLSAgICAgICAgIlx1QzdBRFx1QzdBRVx1QzdBRlx1QzdCMFx1QzdCMVx1QzdCM1x1QzdCNFx1QzdCNSIrCi0gICAgICAgICJcdUM3QjZcdUM3QjdcdUM3QjhcdUM3QjlcdUM3QkFcdUM3QkJcdUM3QkNcdUM3QkQiKwotICAgICAgICAiXHVDODYxXHVDODYyXHVDODYzXHVDODY0XHVDODY1XHVDODY2XHVDODY3XHVDODY4IisKLSAgICAgICAgIlx1Qzg2OVx1Qzg2QVx1Qzg2Qlx1Qzg2Q1x1Qzg2RFx1Qzg2RVx1Qzg2Rlx1Qzg3MCIrCi0gICAgICAgICJcdUM4NzFcdUM4NzNcdUM4NzRcdUM4NzVcdUM4NzZcdUM4NzdcdUM4NzhcdUM4NzkiKwotICAgICAgICAiXHVDODdBXHVDODdCXHVDODdDXHVDODdEXHVDODgxXHVDODgyXHVDODgzXHVDODg0IisKLSAgICAgICAgIlx1Qzg4NVx1Qzg4Nlx1Qzg4N1x1Qzg4OFx1Qzg4OVx1Qzg4QVx1Qzg4Qlx1Qzg4QyIrCi0gICAgICAgICJcdUM4OERcdUM4OEVcdUM4OEZcdUM4OTBcdUM4OTFcdUM4OTNcdUM4OTRcdUM4OTUiKwotICAgICAgICAiXHVDODk2XHVDODk3XHVDODk4XHVDODk5XHVDODlBXHVDODlCXHVDODlDXHVDODlEIisKLSAgICAgICAgIlx1QzhBMVx1QzhBMlx1QzhBM1x1QzhBNFx1QzhBNVx1QzhBNlx1QzhBN1x1QzhBOCIrCi0gICAgICAgICJcdUM4QTlcdUM4QUFcdUM4QUJcdUM4QUNcdUM4QURcdUM4QUVcdUM4QUZcdUM4QjAiKwotICAgICAgICAiXHVDOEIxXHVDOEIzXHVDOEI0XHVDOEI1XHVDOEI2XHVDOEI3XHVDOEI4XHVDOEI5IisKLSAgICAgICAgIlx1QzhCQVx1QzhCQlx1QzhCQ1x1QzhCRFx1QzhDMVx1QzhDMlx1QzhDM1x1QzhDNCIrCi0gICAgICAgICJcdUM4QzVcdUM4QzZcdUM4QzdcdUM4QzhcdUM4QzlcdUM4Q0FcdUM4Q0JcdUM4Q0MiKwotICAgICAgICAiXHVDOENEXHVDOENFXHVDOENGXHVDOEQwXHVDOEQxXHVDOEQzXHVDOEQ0XHVDOEQ1IisKLSAgICAgICAgIlx1QzhENlx1QzhEN1x1QzhEOFx1QzhEOVx1QzhEQVx1QzhEQlx1QzhEQ1x1QzhERCIrCi0gICAgICAgICJcdUM4RTFcdUM4RTJcdUM4RTNcdUM4RTRcdUM4RTVcdUM4RTZcdUM4RTdcdUM4RTgiKwotICAgICAgICAiXHVDOEU5XHVDOEVBXHVDOEVCXHVDOEVDXHVDOEVEXHVDOEVFXHVDOEVGXHVDOEYwIisKLSAgICAgICAgIlx1QzhGMVx1QzhGM1x1QzhGNFx1QzhGNVx1QzhGNlx1QzhGN1x1QzhGOFx1QzhGOSIrCi0gICAgICAgICJcdUM4RkFcdUM4RkJcdUM4RkNcdUM4RkRcdUM5NDFcdUM5NDJcdUM5NDNcdUM5NDQiKwotICAgICAgICAiXHVDOTQ1XHVDOTQ2XHVDOTQ3XHVDOTQ4XHVDOTQ5XHVDOTRBXHVDOTRCXHVDOTRDIisKLSAgICAgICAgIlx1Qzk0RFx1Qzk0RVx1Qzk0Rlx1Qzk1MFx1Qzk1MVx1Qzk1M1x1Qzk1NFx1Qzk1NSIrCi0gICAgICAgICJcdUM5NTZcdUM5NTdcdUM5NThcdUM5NTlcdUM5NUFcdUM5NUJcdUM5NUNcdUM5NUQiKwotICAgICAgICAiXHVDOTYxXHVDOTYyXHVDOTYzXHVDOTY0XHVDOTY1XHVDOTY2XHVDOTY3XHVDOTY4IisKLSAgICAgICAgIlx1Qzk2OVx1Qzk2QVx1Qzk2Qlx1Qzk2Q1x1Qzk2RFx1Qzk2RVx1Qzk2Rlx1Qzk3MCIrCi0gICAgICAgICJcdUM5NzFcdUM5NzNcdUM5NzRcdUM5NzVcdUM5NzZcdUM5NzdcdUM5NzhcdUM5NzkiKwotICAgICAgICAiXHVDOTdBXHVDOTdCXHVDOTdDXHVDOTdEXHVDOTgxXHVDOTgyXHVDOTgzXHVDOTg0IisKLSAgICAgICAgIlx1Qzk4NVx1Qzk4Nlx1Qzk4N1x1Qzk4OFx1Qzk4OVx1Qzk4QVx1Qzk4Qlx1Qzk4QyIrCi0gICAgICAgICJcdUM5OERcdUM5OEVcdUM5OEZcdUM5OTBcdUM5OTFcdUM5OTNcdUM5OTRcdUM5OTUiKwotICAgICAgICAiXHVDOTk2XHVDOTk3XHVDOTk4XHVDOTk5XHVDOTlBXHVDOTlCXHVDOTlDXHVDOTlEIisKLSAgICAgICAgIlx1QzlBMVx1QzlBMlx1QzlBM1x1QzlBNFx1QzlBNVx1QzlBNlx1QzlBN1x1QzlBOCIrCi0gICAgICAgICJcdUM5QTlcdUM5QUFcdUM5QUJcdUM5QUNcdUM5QURcdUM5QUVcdUM5QUZcdUM5QjAiKwotICAgICAgICAiXHVDOUIxXHVDOUIzXHVDOUI0XHVDOUI1XHVDOUI2XHVDOUI3XHVDOUI4XHVDOUI5IisKLSAgICAgICAgIlx1QzlCQVx1QzlCQlx1QzlCQ1x1QzlCRFx1QzlDMVx1QzlDMlx1QzlDM1x1QzlDNCIrCi0gICAgICAgICJcdUM5QzVcdUM5QzZcdUM5QzdcdUM5QzhcdUM5QzlcdUM5Q0FcdUM5Q0JcdUM5Q0MiKwotICAgICAgICAiXHVDOUNEXHVDOUNFXHVDOUNGXHVDOUQwXHVDOUQxXHVDOUQzXHVDOUQ0XHVDOUQ1IisKLSAgICAgICAgIlx1QzlENlx1QzlEN1x1QzlEOFx1QzlEOVx1QzlEQVx1QzlEQlx1QzlEQ1x1QzlERCIrCi0gICAgICAgICJcdUM5RTFcdUM5RTJcdUM5RTNcdUM5RTRcdUM5RTVcdUM5RTZcdUM5RTdcdUM5RTgiKwotICAgICAgICAiXHVDOUU5XHVDOUVBXHVDOUVCXHVDOUVDXHVDOUVEXHVDOUVFXHVDOUVGXHVDOUYwIisKLSAgICAgICAgIlx1QzlGMVx1QzlGM1x1QzlGNFx1QzlGNVx1QzlGNlx1QzlGN1x1QzlGOFx1QzlGOSIrCi0gICAgICAgICJcdUM5RkFcdUM5RkJcdUM5RkNcdUM5RkRcdUNBNDFcdUNBNDJcdUNBNDNcdUNBNDQiKwotICAgICAgICAiXHVDQTQ1XHVDQTQ2XHVDQTQ3XHVDQTQ4XHVDQTQ5XHVDQTRBXHVDQTRCXHVDQTRDIisKLSAgICAgICAgIlx1Q0E0RFx1Q0E0RVx1Q0E0Rlx1Q0E1MFx1Q0E1MVx1Q0E1M1x1Q0E1NFx1Q0E1NSIrCi0gICAgICAgICJcdUNBNTZcdUNBNTdcdUNBNThcdUNBNTlcdUNBNUFcdUNBNUJcdUNBNUNcdUNBNUQiKwotICAgICAgICAiXHVDQTYxXHVDQTYyXHVDQTYzXHVDQTY0XHVDQTY1XHVDQTY2XHVDQTY3XHVDQTY4IisKLSAgICAgICAgIlx1Q0E2OVx1Q0E2QVx1Q0E2Qlx1Q0E2Q1x1Q0E2RFx1Q0E2RVx1Q0E2Rlx1Q0E3MCIrCi0gICAgICAgICJcdUNBNzFcdUNBNzNcdUNBNzRcdUNBNzVcdUNBNzZcdUNBNzdcdUNBNzhcdUNBNzkiKwotICAgICAgICAiXHVDQTdBXHVDQTdCXHVDQTdDXHVDQTdEXHVDQTgxXHVDQTgyXHVDQTgzXHVDQTg0IisKLSAgICAgICAgIlx1Q0E4NVx1Q0E4Nlx1Q0E4N1x1Q0E4OFx1Q0E4OVx1Q0E4QVx1Q0E4Qlx1Q0E4QyIrCi0gICAgICAgICJcdUNBOERcdUNBOEVcdUNBOEZcdUNBOTBcdUNBOTFcdUNBOTNcdUNBOTRcdUNBOTUiKwotICAgICAgICAiXHVDQTk2XHVDQTk3XHVDQTk4XHVDQTk5XHVDQTlBXHVDQTlCXHVDQTlDXHVDQTlEIisKLSAgICAgICAgIlx1Q0FBMVx1Q0FBMlx1Q0FBM1x1Q0FBNFx1Q0FBNVx1Q0FBNlx1Q0FBN1x1Q0FBOCIrCi0gICAgICAgICJcdUNBQTlcdUNBQUFcdUNBQUJcdUNBQUNcdUNBQURcdUNBQUVcdUNBQUZcdUNBQjAiKwotICAgICAgICAiXHVDQUIxXHVDQUIzXHVDQUI0XHVDQUI1XHVDQUI2XHVDQUI3XHVDQUI4XHVDQUI5IisKLSAgICAgICAgIlx1Q0FCQVx1Q0FCQlx1Q0FCQ1x1Q0FCRFx1Q0FDMVx1Q0FDMlx1Q0FDM1x1Q0FDNCIrCi0gICAgICAgICJcdUNBQzVcdUNBQzZcdUNBQzdcdUNBQzhcdUNBQzlcdUNBQ0FcdUNBQ0JcdUNBQ0MiKwotICAgICAgICAiXHVDQUNEXHVDQUNFXHVDQUNGXHVDQUQwXHVDQUQxXHVDQUQzXHVDQUQ0XHVDQUQ1IisKLSAgICAgICAgIlx1Q0FENlx1Q0FEN1x1Q0FEOFx1Q0FEOVx1Q0FEQVx1Q0FEQlx1Q0FEQ1x1Q0FERCIrCi0gICAgICAgICJcdUNBRTFcdUNBRTJcdUNBRTNcdUNBRTRcdUNBRTVcdUNBRTZcdUNBRTdcdUNBRTgiKwotICAgICAgICAiXHVDQUU5XHVDQUVBXHVDQUVCXHVDQUVDXHVDQUVEXHVDQUVFXHVDQUVGXHVDQUYwIisKLSAgICAgICAgIlx1Q0FGMVx1Q0FGM1x1Q0FGNFx1Q0FGNVx1Q0FGNlx1Q0FGN1x1Q0FGOFx1Q0FGOSIrCi0gICAgICAgICJcdUNBRkFcdUNBRkJcdUNBRkNcdUNBRkRcdUNCNDFcdUNCNDJcdUNCNDNcdUNCNDQiKwotICAgICAgICAiXHVDQjQ1XHVDQjQ2XHVDQjQ3XHVDQjQ4XHVDQjQ5XHVDQjRBXHVDQjRCXHVDQjRDIisKLSAgICAgICAgIlx1Q0I0RFx1Q0I0RVx1Q0I0Rlx1Q0I1MFx1Q0I1MVx1Q0I1M1x1Q0I1NFx1Q0I1NSIrCi0gICAgICAgICJcdUNCNTZcdUNCNTdcdUNCNThcdUNCNTlcdUNCNUFcdUNCNUJcdUNCNUNcdUNCNUQiKwotICAgICAgICAiXHVDQjYxXHVDQjYyXHVDQjYzXHVDQjY0XHVDQjY1XHVDQjY2XHVDQjY3XHVDQjY4IisKLSAgICAgICAgIlx1Q0I2OVx1Q0I2QVx1Q0I2Qlx1Q0I2Q1x1Q0I2RFx1Q0I2RVx1Q0I2Rlx1Q0I3MCIrCi0gICAgICAgICJcdUNCNzFcdUNCNzNcdUNCNzRcdUNCNzVcdUNCNzZcdUNCNzdcdUNCNzhcdUNCNzkiKwotICAgICAgICAiXHVDQjdBXHVDQjdCXHVDQjdDXHVDQjdEXHVDQjgxXHVDQjgyXHVDQjgzXHVDQjg0IisKLSAgICAgICAgIlx1Q0I4NVx1Q0I4Nlx1Q0I4N1x1Q0I4OFx1Q0I4OVx1Q0I4QVx1Q0I4Qlx1Q0I4QyIrCi0gICAgICAgICJcdUNCOERcdUNCOEVcdUNCOEZcdUNCOTBcdUNCOTFcdUNCOTNcdUNCOTRcdUNCOTUiKwotICAgICAgICAiXHVDQjk2XHVDQjk3XHVDQjk4XHVDQjk5XHVDQjlBXHVDQjlCXHVDQjlDXHVDQjlEIisKLSAgICAgICAgIlx1Q0JBMVx1Q0JBMlx1Q0JBM1x1Q0JBNFx1Q0JBNVx1Q0JBNlx1Q0JBN1x1Q0JBOCIrCi0gICAgICAgICJcdUNCQTlcdUNCQUFcdUNCQUJcdUNCQUNcdUNCQURcdUNCQUVcdUNCQUZcdUNCQjAiKwotICAgICAgICAiXHVDQkIxXHVDQkIzXHVDQkI0XHVDQkI1XHVDQkI2XHVDQkI3XHVDQkI4XHVDQkI5IisKLSAgICAgICAgIlx1Q0JCQVx1Q0JCQlx1Q0JCQ1x1Q0JCRFx1Q0M2MVx1Q0M2Mlx1Q0M2M1x1Q0M2NCIrCi0gICAgICAgICJcdUNDNjVcdUNDNjZcdUNDNjdcdUNDNjhcdUNDNjlcdUNDNkFcdUNDNkJcdUNDNkMiKwotICAgICAgICAiXHVDQzZEXHVDQzZFXHVDQzZGXHVDQzcwXHVDQzcxXHVDQzczXHVDQzc0XHVDQzc1IisKLSAgICAgICAgIlx1Q0M3Nlx1Q0M3N1x1Q0M3OFx1Q0M3OVx1Q0M3QVx1Q0M3Qlx1Q0M3Q1x1Q0M3RCIrCi0gICAgICAgICJcdUNDODFcdUNDODJcdUNDODNcdUNDODRcdUNDODVcdUNDODZcdUNDODdcdUNDODgiKwotICAgICAgICAiXHVDQzg5XHVDQzhBXHVDQzhCXHVDQzhDXHVDQzhEXHVDQzhFXHVDQzhGXHVDQzkwIisKLSAgICAgICAgIlx1Q0M5MVx1Q0M5M1x1Q0M5NFx1Q0M5NVx1Q0M5Nlx1Q0M5N1x1Q0M5OFx1Q0M5OSIrCi0gICAgICAgICJcdUNDOUFcdUNDOUJcdUNDOUNcdUNDOURcdUNDQTFcdUNDQTJcdUNDQTNcdUNDQTQiKwotICAgICAgICAiXHVDQ0E1XHVDQ0E2XHVDQ0E3XHVDQ0E4XHVDQ0E5XHVDQ0FBXHVDQ0FCXHVDQ0FDIisKLSAgICAgICAgIlx1Q0NBRFx1Q0NBRVx1Q0NBRlx1Q0NCMFx1Q0NCMVx1Q0NCM1x1Q0NCNFx1Q0NCNSIrCi0gICAgICAgICJcdUNDQjZcdUNDQjdcdUNDQjhcdUNDQjlcdUNDQkFcdUNDQkJcdUNDQkNcdUNDQkQiKwotICAgICAgICAiXHVDQ0MxXHVDQ0MyXHVDQ0MzXHVDQ0M0XHVDQ0M1XHVDQ0M2XHVDQ0M3XHVDQ0M4IisKLSAgICAgICAgIlx1Q0NDOVx1Q0NDQVx1Q0NDQlx1Q0NDQ1x1Q0NDRFx1Q0NDRVx1Q0NDRlx1Q0NEMCIrCi0gICAgICAgICJcdUNDRDFcdUNDRDNcdUNDRDRcdUNDRDVcdUNDRDZcdUNDRDdcdUNDRDhcdUNDRDkiKwotICAgICAgICAiXHVDQ0RBXHVDQ0RCXHVDQ0RDXHVDQ0REXHVDQ0UxXHVDQ0UyXHVDQ0UzXHVDQ0U0IisKLSAgICAgICAgIlx1Q0NFNVx1Q0NFNlx1Q0NFN1x1Q0NFOFx1Q0NFOVx1Q0NFQVx1Q0NFQlx1Q0NFQyIrCi0gICAgICAgICJcdUNDRURcdUNDRUVcdUNDRUZcdUNDRjBcdUNDRjFcdUNDRjNcdUNDRjRcdUNDRjUiKwotICAgICAgICAiXHVDQ0Y2XHVDQ0Y3XHVDQ0Y4XHVDQ0Y5XHVDQ0ZBXHVDQ0ZCXHVDQ0ZDXHVDQ0ZEIisKLSAgICAgICAgIlx1Q0Q0MVx1Q0Q0Mlx1Q0Q0M1x1Q0Q0NFx1Q0Q0NVx1Q0Q0Nlx1Q0Q0N1x1Q0Q0OCIrCi0gICAgICAgICJcdUNENDlcdUNENEFcdUNENEJcdUNENENcdUNENERcdUNENEVcdUNENEZcdUNENTAiKwotICAgICAgICAiXHVDRDUxXHVDRDUzXHVDRDU0XHVDRDU1XHVDRDU2XHVDRDU3XHVDRDU4XHVDRDU5IisKLSAgICAgICAgIlx1Q0Q1QVx1Q0Q1Qlx1Q0Q1Q1x1Q0Q1RFx1Q0Q2MVx1Q0Q2Mlx1Q0Q2M1x1Q0Q2NCIrCi0gICAgICAgICJcdUNENjVcdUNENjZcdUNENjdcdUNENjhcdUNENjlcdUNENkFcdUNENkJcdUNENkMiKwotICAgICAgICAiXHVDRDZEXHVDRDZFXHVDRDZGXHVDRDcwXHVDRDcxXHVDRDczXHVDRDc0XHVDRDc1IisKLSAgICAgICAgIlx1Q0Q3Nlx1Q0Q3N1x1Q0Q3OFx1Q0Q3OVx1Q0Q3QVx1Q0Q3Qlx1Q0Q3Q1x1Q0Q3RCIrCi0gICAgICAgICJcdUNEODFcdUNEODJcdUNEODNcdUNEODRcdUNEODVcdUNEODZcdUNEODdcdUNEODgiKwotICAgICAgICAiXHVDRDg5XHVDRDhBXHVDRDhCXHVDRDhDXHVDRDhEXHVDRDhFXHVDRDhGXHVDRDkwIisKLSAgICAgICAgIlx1Q0Q5MVx1Q0Q5M1x1Q0Q5NFx1Q0Q5NVx1Q0Q5Nlx1Q0Q5N1x1Q0Q5OFx1Q0Q5OSIrCi0gICAgICAgICJcdUNEOUFcdUNEOUJcdUNEOUNcdUNEOURcdUNEQTFcdUNEQTJcdUNEQTNcdUNEQTQiKwotICAgICAgICAiXHVDREE1XHVDREE2XHVDREE3XHVDREE4XHVDREE5XHVDREFBXHVDREFCXHVDREFDIisKLSAgICAgICAgIlx1Q0RBRFx1Q0RBRVx1Q0RBRlx1Q0RCMFx1Q0RCMVx1Q0RCM1x1Q0RCNFx1Q0RCNSIrCi0gICAgICAgICJcdUNEQjZcdUNEQjdcdUNEQjhcdUNEQjlcdUNEQkFcdUNEQkJcdUNEQkNcdUNEQkQiKwotICAgICAgICAiXHVDREMxXHVDREMyXHVDREMzXHVDREM0XHVDREM1XHVDREM2XHVDREM3XHVDREM4IisKLSAgICAgICAgIlx1Q0RDOVx1Q0RDQVx1Q0RDQlx1Q0RDQ1x1Q0RDRFx1Q0RDRVx1Q0RDRlx1Q0REMCIrCi0gICAgICAgICJcdUNERDFcdUNERDNcdUNERDRcdUNERDVcdUNERDZcdUNERDdcdUNERDhcdUNERDkiKwotICAgICAgICAiXHVDRERBXHVDRERCXHVDRERDXHVDREREXHVDREUxXHVDREUyXHVDREUzXHVDREU0IisKLSAgICAgICAgIlx1Q0RFNVx1Q0RFNlx1Q0RFN1x1Q0RFOFx1Q0RFOVx1Q0RFQVx1Q0RFQlx1Q0RFQyIrCi0gICAgICAgICJcdUNERURcdUNERUVcdUNERUZcdUNERjBcdUNERjFcdUNERjNcdUNERjRcdUNERjUiKwotICAgICAgICAiXHVDREY2XHVDREY3XHVDREY4XHVDREY5XHVDREZBXHVDREZCXHVDREZDXHVDREZEIisKLSAgICAgICAgIlx1Q0U0MVx1Q0U0Mlx1Q0U0M1x1Q0U0NFx1Q0U0NVx1Q0U0Nlx1Q0U0N1x1Q0U0OCIrCi0gICAgICAgICJcdUNFNDlcdUNFNEFcdUNFNEJcdUNFNENcdUNFNERcdUNFNEVcdUNFNEZcdUNFNTAiKwotICAgICAgICAiXHVDRTUxXHVDRTUzXHVDRTU0XHVDRTU1XHVDRTU2XHVDRTU3XHVDRTU4XHVDRTU5IisKLSAgICAgICAgIlx1Q0U1QVx1Q0U1Qlx1Q0U1Q1x1Q0U1RFx1Q0U2MVx1Q0U2Mlx1Q0U2M1x1Q0U2NCIrCi0gICAgICAgICJcdUNFNjVcdUNFNjZcdUNFNjdcdUNFNjhcdUNFNjlcdUNFNkFcdUNFNkJcdUNFNkMiKwotICAgICAgICAiXHVDRTZEXHVDRTZFXHVDRTZGXHVDRTcwXHVDRTcxXHVDRTczXHVDRTc0XHVDRTc1IisKLSAgICAgICAgIlx1Q0U3Nlx1Q0U3N1x1Q0U3OFx1Q0U3OVx1Q0U3QVx1Q0U3Qlx1Q0U3Q1x1Q0U3RCIrCi0gICAgICAgICJcdUNFODFcdUNFODJcdUNFODNcdUNFODRcdUNFODVcdUNFODZcdUNFODdcdUNFODgiKwotICAgICAgICAiXHVDRTg5XHVDRThBXHVDRThCXHVDRThDXHVDRThEXHVDRThFXHVDRThGXHVDRTkwIisKLSAgICAgICAgIlx1Q0U5MVx1Q0U5M1x1Q0U5NFx1Q0U5NVx1Q0U5Nlx1Q0U5N1x1Q0U5OFx1Q0U5OSIrCi0gICAgICAgICJcdUNFOUFcdUNFOUJcdUNFOUNcdUNFOURcdUNFQTFcdUNFQTJcdUNFQTNcdUNFQTQiKwotICAgICAgICAiXHVDRUE1XHVDRUE2XHVDRUE3XHVDRUE4XHVDRUE5XHVDRUFBXHVDRUFCXHVDRUFDIisKLSAgICAgICAgIlx1Q0VBRFx1Q0VBRVx1Q0VBRlx1Q0VCMFx1Q0VCMVx1Q0VCM1x1Q0VCNFx1Q0VCNSIrCi0gICAgICAgICJcdUNFQjZcdUNFQjdcdUNFQjhcdUNFQjlcdUNFQkFcdUNFQkJcdUNFQkNcdUNFQkQiKwotICAgICAgICAiXHVDRUMxXHVDRUMyXHVDRUMzXHVDRUM0XHVDRUM1XHVDRUM2XHVDRUM3XHVDRUM4IisKLSAgICAgICAgIlx1Q0VDOVx1Q0VDQVx1Q0VDQlx1Q0VDQ1x1Q0VDRFx1Q0VDRVx1Q0VDRlx1Q0VEMCIrCi0gICAgICAgICJcdUNFRDFcdUNFRDNcdUNFRDRcdUNFRDVcdUNFRDZcdUNFRDdcdUNFRDhcdUNFRDkiKwotICAgICAgICAiXHVDRURBXHVDRURCXHVDRURDXHVDRUREXHVDRUUxXHVDRUUyXHVDRUUzXHVDRUU0IisKLSAgICAgICAgIlx1Q0VFNVx1Q0VFNlx1Q0VFN1x1Q0VFOFx1Q0VFOVx1Q0VFQVx1Q0VFQlx1Q0VFQyIrCi0gICAgICAgICJcdUNFRURcdUNFRUVcdUNFRUZcdUNFRjBcdUNFRjFcdUNFRjNcdUNFRjRcdUNFRjUiKwotICAgICAgICAiXHVDRUY2XHVDRUY3XHVDRUY4XHVDRUY5XHVDRUZBXHVDRUZCXHVDRUZDXHVDRUZEIisKLSAgICAgICAgIlx1Q0Y0MVx1Q0Y0Mlx1Q0Y0M1x1Q0Y0NFx1Q0Y0NVx1Q0Y0Nlx1Q0Y0N1x1Q0Y0OCIrCi0gICAgICAgICJcdUNGNDlcdUNGNEFcdUNGNEJcdUNGNENcdUNGNERcdUNGNEVcdUNGNEZcdUNGNTAiKwotICAgICAgICAiXHVDRjUxXHVDRjUzXHVDRjU0XHVDRjU1XHVDRjU2XHVDRjU3XHVDRjU4XHVDRjU5IisKLSAgICAgICAgIlx1Q0Y1QVx1Q0Y1Qlx1Q0Y1Q1x1Q0Y1RFx1Q0Y2MVx1Q0Y2Mlx1Q0Y2M1x1Q0Y2NCIrCi0gICAgICAgICJcdUNGNjVcdUNGNjZcdUNGNjdcdUNGNjhcdUNGNjlcdUNGNkFcdUNGNkJcdUNGNkMiKwotICAgICAgICAiXHVDRjZEXHVDRjZFXHVDRjZGXHVDRjcwXHVDRjcxXHVDRjczXHVDRjc0XHVDRjc1IisKLSAgICAgICAgIlx1Q0Y3Nlx1Q0Y3N1x1Q0Y3OFx1Q0Y3OVx1Q0Y3QVx1Q0Y3Qlx1Q0Y3Q1x1Q0Y3RCIrCi0gICAgICAgICJcdUNGODFcdUNGODJcdUNGODNcdUNGODRcdUNGODVcdUNGODZcdUNGODdcdUNGODgiKwotICAgICAgICAiXHVDRjg5XHVDRjhBXHVDRjhCXHVDRjhDXHVDRjhEXHVDRjhFXHVDRjhGXHVDRjkwIisKLSAgICAgICAgIlx1Q0Y5MVx1Q0Y5M1x1Q0Y5NFx1Q0Y5NVx1Q0Y5Nlx1Q0Y5N1x1Q0Y5OFx1Q0Y5OSIrCi0gICAgICAgICJcdUNGOUFcdUNGOUJcdUNGOUNcdUNGOURcdUNGQTFcdUNGQTJcdUNGQTNcdUNGQTQiKwotICAgICAgICAiXHVDRkE1XHVDRkE2XHVDRkE3XHVDRkE4XHVDRkE5XHVDRkFBXHVDRkFCXHVDRkFDIisKLSAgICAgICAgIlx1Q0ZBRFx1Q0ZBRVx1Q0ZBRlx1Q0ZCMFx1Q0ZCMVx1Q0ZCM1x1Q0ZCNFx1Q0ZCNSIrCi0gICAgICAgICJcdUNGQjZcdUNGQjdcdUNGQjhcdUNGQjlcdUNGQkFcdUNGQkJcdUNGQkNcdUNGQkQiKwotICAgICAgICAiXHVEMDYxXHVEMDYyXHVEMDYzXHVEMDY0XHVEMDY1XHVEMDY2XHVEMDY3XHVEMDY4IisKLSAgICAgICAgIlx1RDA2OVx1RDA2QVx1RDA2Qlx1RDA2Q1x1RDA2RFx1RDA2RVx1RDA2Rlx1RDA3MCIrCi0gICAgICAgICJcdUQwNzFcdUQwNzNcdUQwNzRcdUQwNzVcdUQwNzZcdUQwNzdcdUQwNzhcdUQwNzkiKwotICAgICAgICAiXHVEMDdBXHVEMDdCXHVEMDdDXHVEMDdEXHVEMDgxXHVEMDgyXHVEMDgzXHVEMDg0IisKLSAgICAgICAgIlx1RDA4NVx1RDA4Nlx1RDA4N1x1RDA4OFx1RDA4OVx1RDA4QVx1RDA4Qlx1RDA4QyIrCi0gICAgICAgICJcdUQwOERcdUQwOEVcdUQwOEZcdUQwOTBcdUQwOTFcdUQwOTNcdUQwOTRcdUQwOTUiKwotICAgICAgICAiXHVEMDk2XHVEMDk3XHVEMDk4XHVEMDk5XHVEMDlBXHVEMDlCXHVEMDlDXHVEMDlEIisKLSAgICAgICAgIlx1RDBBMVx1RDBBMlx1RDBBM1x1RDBBNFx1RDBBNVx1RDBBNlx1RDBBN1x1RDBBOCIrCi0gICAgICAgICJcdUQwQTlcdUQwQUFcdUQwQUJcdUQwQUNcdUQwQURcdUQwQUVcdUQwQUZcdUQwQjAiKwotICAgICAgICAiXHVEMEIxXHVEMEIzXHVEMEI0XHVEMEI1XHVEMEI2XHVEMEI3XHVEMEI4XHVEMEI5IisKLSAgICAgICAgIlx1RDBCQVx1RDBCQlx1RDBCQ1x1RDBCRFx1RDBDMVx1RDBDMlx1RDBDM1x1RDBDNCIrCi0gICAgICAgICJcdUQwQzVcdUQwQzZcdUQwQzdcdUQwQzhcdUQwQzlcdUQwQ0FcdUQwQ0JcdUQwQ0MiKwotICAgICAgICAiXHVEMENEXHVEMENFXHVEMENGXHVEMEQwXHVEMEQxXHVEMEQzXHVEMEQ0XHVEMEQ1IisKLSAgICAgICAgIlx1RDBENlx1RDBEN1x1RDBEOFx1RDBEOVx1RDBEQVx1RDBEQlx1RDBEQ1x1RDBERCIrCi0gICAgICAgICJcdUQwRTFcdUQwRTJcdUQwRTNcdUQwRTRcdUQwRTVcdUQwRTZcdUQwRTdcdUQwRTgiKwotICAgICAgICAiXHVEMEU5XHVEMEVBXHVEMEVCXHVEMEVDXHVEMEVEXHVEMEVFXHVEMEVGXHVEMEYwIisKLSAgICAgICAgIlx1RDBGMVx1RDBGM1x1RDBGNFx1RDBGNVx1RDBGNlx1RDBGN1x1RDBGOFx1RDBGOSIrCi0gICAgICAgICJcdUQwRkFcdUQwRkJcdUQwRkNcdUQwRkRcdUQxNDFcdUQxNDJcdUQxNDNcdUQxNDQiKwotICAgICAgICAiXHVEMTQ1XHVEMTQ2XHVEMTQ3XHVEMTQ4XHVEMTQ5XHVEMTRBXHVEMTRCXHVEMTRDIisKLSAgICAgICAgIlx1RDE0RFx1RDE0RVx1RDE0Rlx1RDE1MFx1RDE1MVx1RDE1M1x1RDE1NFx1RDE1NSIrCi0gICAgICAgICJcdUQxNTZcdUQxNTdcdUQxNThcdUQxNTlcdUQxNUFcdUQxNUJcdUQxNUNcdUQxNUQiKwotICAgICAgICAiXHVEMTYxXHVEMTYyXHVEMTYzXHVEMTY0XHVEMTY1XHVEMTY2XHVEMTY3XHVEMTY4IisKLSAgICAgICAgIlx1RDE2OVx1RDE2QVx1RDE2Qlx1RDE2Q1x1RDE2RFx1RDE2RVx1RDE2Rlx1RDE3MCIrCi0gICAgICAgICJcdUQxNzFcdUQxNzNcdUQxNzRcdUQxNzVcdUQxNzZcdUQxNzdcdUQxNzhcdUQxNzkiKwotICAgICAgICAiXHVEMTdBXHVEMTdCXHVEMTdDXHVEMTdEXHVEMTgxXHVEMTgyXHVEMTgzXHVEMTg0IisKLSAgICAgICAgIlx1RDE4NVx1RDE4Nlx1RDE4N1x1RDE4OFx1RDE4OVx1RDE4QVx1RDE4Qlx1RDE4QyIrCi0gICAgICAgICJcdUQxOERcdUQxOEVcdUQxOEZcdUQxOTBcdUQxOTFcdUQxOTNcdUQxOTRcdUQxOTUiKwotICAgICAgICAiXHVEMTk2XHVEMTk3XHVEMTk4XHVEMTk5XHVEMTlBXHVEMTlCXHVEMTlDXHVEMTlEIisKLSAgICAgICAgIlx1RDFBMVx1RDFBMlx1RDFBM1x1RDFBNFx1RDFBNVx1RDFBNlx1RDFBN1x1RDFBOCIrCi0gICAgICAgICJcdUQxQTlcdUQxQUFcdUQxQUJcdUQxQUNcdUQxQURcdUQxQUVcdUQxQUZcdUQxQjAiKwotICAgICAgICAiXHVEMUIxXHVEMUIzXHVEMUI0XHVEMUI1XHVEMUI2XHVEMUI3XHVEMUI4XHVEMUI5IisKLSAgICAgICAgIlx1RDFCQVx1RDFCQlx1RDFCQ1x1RDFCRFx1RDFDMVx1RDFDMlx1RDFDM1x1RDFDNCIrCi0gICAgICAgICJcdUQxQzVcdUQxQzZcdUQxQzdcdUQxQzhcdUQxQzlcdUQxQ0FcdUQxQ0JcdUQxQ0MiKwotICAgICAgICAiXHVEMUNEXHVEMUNFXHVEMUNGXHVEMUQwXHVEMUQxXHVEMUQzXHVEMUQ0XHVEMUQ1IisKLSAgICAgICAgIlx1RDFENlx1RDFEN1x1RDFEOFx1RDFEOVx1RDFEQVx1RDFEQlx1RDFEQ1x1RDFERCIrCi0gICAgICAgICJcdUQxRTFcdUQxRTJcdUQxRTNcdUQxRTRcdUQxRTVcdUQxRTZcdUQxRTdcdUQxRTgiKwotICAgICAgICAiXHVEMUU5XHVEMUVBXHVEMUVCXHVEMUVDXHVEMUVEXHVEMUVFXHVEMUVGXHVEMUYwIisKLSAgICAgICAgIlx1RDFGMVx1RDFGM1x1RDFGNFx1RDFGNVx1RDFGNlx1RDFGN1x1RDFGOFx1RDFGOSIrCi0gICAgICAgICJcdUQxRkFcdUQxRkJcdUQxRkNcdUQxRkRcdUQyNDFcdUQyNDJcdUQyNDNcdUQyNDQiKwotICAgICAgICAiXHVEMjQ1XHVEMjQ2XHVEMjQ3XHVEMjQ4XHVEMjQ5XHVEMjRBXHVEMjRCXHVEMjRDIisKLSAgICAgICAgIlx1RDI0RFx1RDI0RVx1RDI0Rlx1RDI1MFx1RDI1MVx1RDI1M1x1RDI1NFx1RDI1NSIrCi0gICAgICAgICJcdUQyNTZcdUQyNTdcdUQyNThcdUQyNTlcdUQyNUFcdUQyNUJcdUQyNUNcdUQyNUQiKwotICAgICAgICAiXHVEMjYxXHVEMjYyXHVEMjYzXHVEMjY0XHVEMjY1XHVEMjY2XHVEMjY3XHVEMjY4IisKLSAgICAgICAgIlx1RDI2OVx1RDI2QVx1RDI2Qlx1RDI2Q1x1RDI2RFx1RDI2RVx1RDI2Rlx1RDI3MCIrCi0gICAgICAgICJcdUQyNzFcdUQyNzNcdUQyNzRcdUQyNzVcdUQyNzZcdUQyNzdcdUQyNzhcdUQyNzkiKwotICAgICAgICAiXHVEMjdBXHVEMjdCXHVEMjdDXHVEMjdEXHVEMjgxXHVEMjgyXHVEMjgzXHVEMjg0IisKLSAgICAgICAgIlx1RDI4NVx1RDI4Nlx1RDI4N1x1RDI4OFx1RDI4OVx1RDI4QVx1RDI4Qlx1RDI4QyIrCi0gICAgICAgICJcdUQyOERcdUQyOEVcdUQyOEZcdUQyOTBcdUQyOTFcdUQyOTNcdUQyOTRcdUQyOTUiKwotICAgICAgICAiXHVEMjk2XHVEMjk3XHVEMjk4XHVEMjk5XHVEMjlBXHVEMjlCXHVEMjlDXHVEMjlEIisKLSAgICAgICAgIlx1RDJBMVx1RDJBMlx1RDJBM1x1RDJBNFx1RDJBNVx1RDJBNlx1RDJBN1x1RDJBOCIrCi0gICAgICAgICJcdUQyQTlcdUQyQUFcdUQyQUJcdUQyQUNcdUQyQURcdUQyQUVcdUQyQUZcdUQyQjAiKwotICAgICAgICAiXHVEMkIxXHVEMkIzXHVEMkI0XHVEMkI1XHVEMkI2XHVEMkI3XHVEMkI4XHVEMkI5IisKLSAgICAgICAgIlx1RDJCQVx1RDJCQlx1RDJCQ1x1RDJCRFx1RDJDMVx1RDJDMlx1RDJDM1x1RDJDNCIrCi0gICAgICAgICJcdUQyQzVcdUQyQzZcdUQyQzdcdUQyQzhcdUQyQzlcdUQyQ0FcdUQyQ0JcdUQyQ0MiKwotICAgICAgICAiXHVEMkNEXHVEMkNFXHVEMkNGXHVEMkQwXHVEMkQxXHVEMkQzXHVEMkQ0XHVEMkQ1IisKLSAgICAgICAgIlx1RDJENlx1RDJEN1x1RDJEOFx1RDJEOVx1RDJEQVx1RDJEQlx1RDJEQ1x1RDJERCIrCi0gICAgICAgICJcdUQyRTFcdUQyRTJcdUQyRTNcdUQyRTRcdUQyRTVcdUQyRTZcdUQyRTdcdUQyRTgiKwotICAgICAgICAiXHVEMkU5XHVEMkVBXHVEMkVCXHVEMkVDXHVEMkVEXHVEMkVFXHVEMkVGXHVEMkYwIisKLSAgICAgICAgIlx1RDJGMVx1RDJGM1x1RDJGNFx1RDJGNVx1RDJGNlx1RDJGN1x1RDJGOFx1RDJGOSIrCi0gICAgICAgICJcdUQyRkFcdUQyRkJcdUQyRkNcdUQyRkRcdUQzNDFcdUQzNDJcdUQzNDNcdUQzNDQiKwotICAgICAgICAiXHVEMzQ1XHVEMzQ2XHVEMzQ3XHVEMzQ4XHVEMzQ5XHVEMzRBXHVEMzRCXHVEMzRDIisKLSAgICAgICAgIlx1RDM0RFx1RDM0RVx1RDM0Rlx1RDM1MFx1RDM1MVx1RDM1M1x1RDM1NFx1RDM1NSIrCi0gICAgICAgICJcdUQzNTZcdUQzNTdcdUQzNThcdUQzNTlcdUQzNUFcdUQzNUJcdUQzNUNcdUQzNUQiKwotICAgICAgICAiXHVEMzYxXHVEMzYyXHVEMzYzXHVEMzY0XHVEMzY1XHVEMzY2XHVEMzY3XHVEMzY4IisKLSAgICAgICAgIlx1RDM2OVx1RDM2QVx1RDM2Qlx1RDM2Q1x1RDM2RFx1RDM2RVx1RDM2Rlx1RDM3MCIrCi0gICAgICAgICJcdUQzNzFcdUQzNzNcdUQzNzRcdUQzNzVcdUQzNzZcdUQzNzdcdUQzNzhcdUQzNzkiKwotICAgICAgICAiXHVEMzdBXHVEMzdCXHVEMzdDXHVEMzdEXHVEMzgxXHVEMzgyXHVEMzgzXHVEMzg0IisKLSAgICAgICAgIlx1RDM4NVx1RDM4Nlx1RDM4N1x1RDM4OFx1RDM4OVx1RDM4QVx1RDM4Qlx1RDM4QyIrCi0gICAgICAgICJcdUQzOERcdUQzOEVcdUQzOEZcdUQzOTBcdUQzOTFcdUQzOTNcdUQzOTRcdUQzOTUiKwotICAgICAgICAiXHVEMzk2XHVEMzk3XHVEMzk4XHVEMzk5XHVEMzlBXHVEMzlCXHVEMzlDXHVEMzlEIisKLSAgICAgICAgIlx1RDNBMVx1RDNBMlx1RDNBM1x1RDNBNFx1RDNBNVx1RDNBNlx1RDNBN1x1RDNBOCIrCi0gICAgICAgICJcdUQzQTlcdUQzQUFcdUQzQUJcdUQzQUNcdUQzQURcdUQzQUVcdUQzQUZcdUQzQjAiKwotICAgICAgICAiXHVEM0IxXHVEM0IzXHVEM0I0XHVEM0I1XHVEM0I2XHVEM0I3XHVEM0I4XHVEM0I5IisKLSAgICAgICAgIlx1RDNCQVx1RDNCQlx1RDNCQ1x1RDNCRFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1RTBEMFx1RTBENlx1RTBFN1x1RTFDRlx1RTFFOFx1RTIzRFx1RTJGQlx1RTMzMiIrCi0gICAgICAgICJcdUUzNDhcdUUzNjBcdUUzNkRcdUUzRDRcdUUzRDVcdUUzRDhcdUUzREJcdUUzREMiKwotICAgICAgICAiXHVFM0REXHVFM0RFXHVFM0RGXHVFM0UwXHVFM0UyXHVFM0UzXHVFM0U0XHVFM0U1IisKLSAgICAgICAgIlx1RTNFNlx1RTNFOFx1RTNFOVx1RTNFQVx1RTNFQlx1RTNFRFx1RTNFRlx1RTNGMCIrCi0gICAgICAgICJcdUUzRjJcdUUzRjZcdUUzRkFcdUUzRkNcdUUzRkRcdUUzRkVcdUU0MzJcdUU0MzMiKwotICAgICAgICAiXHVFNDM3XHVFNDM4XHVFNDM5XHVFNDNBXHVFNDNCXHVFNDNEXHVFNDQyXHVFNDRFIisKLSAgICAgICAgIlx1RTQ1Mlx1RTQ1M1x1RTQ1NFx1RTQ1Nlx1RTQ1N1x1RTQ1OFx1RTQ1OVx1RTQ1QSIrCi0gICAgICAgICJcdUU0NUJcdUU0NURcdUU0NUVcdUU0NUZcdUU0NjBcdUU0NjFcdUU0NjJcdUU0NjMiKwotICAgICAgICAiXHVFNDY0XHVFNDY1XHVFNDY2XHVFNDY3XHVFNDY5XHVFNDZBXHVFNDZFXHVFNDZGIisKLSAgICAgICAgIlx1RTQ3MVx1RTQ3Mlx1RTQ3NFx1RTQ3NVx1RTQ3Nlx1RTQ3N1x1RTQ3OFx1RTQ3OSIrCi0gICAgICAgICJcdUU0N0FcdUU0N0JcdUU0OTJcdUU0OTNcdUU0OTRcdUU0OTVcdUU0OTZcdUU0OTciKwotICAgICAgICAiXHVFNDk5XHVFNDlBXHVFNTc2XHVFNTlFXHVFNUE1XHVFNUFCXHVFNUFFXHVFNjQ4IisKLSAgICAgICAgIlx1RTY1RFx1RTZDQlx1RTZFNFx1RThDNVx1RThFNFx1RTkzNVx1RTlBNVx1RTlENSIrCi0gICAgICAgICJcdUU5RjRcdUVBOUVcdUVBQTBcdUVBQjNcdUVBRTFcdUVBRThcdUVCOTNcdUVCQUQiKwotICAgICAgICAiXHVFQkVEXHVFQ0Y1XHVFRDMxXHVFRDM5XHVFREFFXHVFREIxXHVFREIyXHVFREI5IisKLSAgICAgICAgIlx1RURCQlx1RURCQ1x1RURDNFx1RURDRVx1RUREMFx1RUREMlx1RURENlx1RURGQSIrCi0gICAgICAgICJcdUVERkJcdUVERkNcdUVERkVcdUVFMzFcdUVFMzRcdUVFMzdcdUVFM0RcdUVFM0YiKwotICAgICAgICAiXHVFRTQwXHVFRTQxXHVFRTQzXHVFRTQ3XHVFRTQ4XHVFRTRDXHVFRTU0XHVFRTU2IisKLSAgICAgICAgIlx1RUU1N1x1RUU1QVx1RUU2Mlx1RUU2Nlx1RUU2OVx1RUU2Q1x1RUU2Rlx1RUU3MSIrCi0gICAgICAgICJcdUVFNzRcdUVFNzVcdUVFNzZcdUVFNzhcdUVFN0FcdUVFN0JcdUVFN0NcdUVFOTEiKwotICAgICAgICAiXHVFRTkzXHVFRTk0XHVFRTk3XHVFRTk4XHVFRTk5XHVFRTlCXHVFRUExXHVFRUE2IisKLSAgICAgICAgIlx1RUVBOVx1RUVBQVx1RUVBQ1x1RUVBRFx1RUVCMFx1RUVCRlx1RUVDMVx1RUVDNiIrCi0gICAgICAgICJcdUVFQzdcdUVFQ0JcdUVFQ0RcdUVFQ0ZcdUVFRDBcdUVFRDNcdUVFREZcdUVFRTQiKwotICAgICAgICAiXHVFRUU2XHVFRUY3XHVFRjc3XHVFRjc4XHVFRjkyXHVFRjkzXHVFRjk5XHVFRjlCIisKLSAgICAgICAgIlx1RUY5RFx1RUZBMFx1RUZBN1x1RUZBQ1x1RUZDQ1x1RUZGN1x1RjA1MVx1RjA3NSIrCi0gICAgICAgICJcdUYwOTZcdUYwOTlcdUYwOUVcdUYwQTBcdUYwQTRcdUYwQTdcdUYwQTlcdUYwQUEiKwotICAgICAgICAiXHVGMEJBXHVGMEJCXHVGMEJEXHVGMEMxXHVGMEMyXHVGMEM2XHVGMEM3XHVGMENDIisKLSAgICAgICAgIlx1RjBDRlx1RjBEMFx1RjBEMVx1RjBEMlx1RjBEOFx1RjEzNlx1RjEzN1x1RjEzQSIrCi0gICAgICAgICJcdUYxM0ZcdUYxNDBcdUYxNDFcdUYxNDJcdUYxNDVcdUYxNDhcdUYxNEFcdUYxNTAiKwotICAgICAgICAiXHVGMTUxXHVGMTU1XHVGMTU2XHVGMTU5XHVGMTVBXHVGMTY1XHVGMTZEXHVGMTZFIisKLSAgICAgICAgIlx1RjE3MVx1RjE3NFx1RjE3N1x1RjE3OFx1RjE5OVx1RjE5QVx1RjE5Q1x1RjFBMSIrCi0gICAgICAgICJcdUYxQTJcdUYxQTNcdUYxRUVcdUYyNkJcdUY0NERcdUY0OUNcdUY0QjFcdUY1MzciOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGlubmVySW5kZXg5PQotICAgICAgICAiXHVGNTdFXHVGNjk2XHVGNjk4XHVGNkI4XHVGNkM4XHVGNkQzXHVGNzZCXHVGNzkyIisKLSAgICAgICAgIlx1RjgzMVx1RjgzMlx1Rjg3Nlx1RjkzOVx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdURBMzFcdURBMzJcdURBMzNcdURBMzRcdURBMzVcdURBMzZcdURBMzciKwotICAgICAgICAiXHVEQTM4XHVEQTM5XHVEQTNBXHVEQTNCXHVEQTNDXHVEQTNEXHVEQTNFXHVEQTNGIisKLSAgICAgICAgIlx1REE0MFx1REE0MVx1REE0Mlx1REE0M1x1REE0NFx1REE0NVx1REE0Nlx1REE0NyIrCi0gICAgICAgICJcdURBNDhcdURBNDlcdURBNEFcdURBNEJcdURBNENcdURBNERcdURBNEVcdURBNEYiKwotICAgICAgICAiXHVEQTUwXHVEQTUxXHVEQTUyXHVEQTUzXHVEQTU0XHVEQTU1XHVEQTU2XHVEQTU3IisKLSAgICAgICAgIlx1REE1OFx1REE1OVx1REE1QVx1REE1Qlx1REE1Q1x1REE1RFx1REE1RVx1REE1RiIrCi0gICAgICAgICJcdURBNjBcdURBNjFcdURBNjJcdURBNjNcdURBNjRcdURBNjVcdURBNjZcdURBNjciKwotICAgICAgICAiXHVEQTY4XHVEQTY5XHVEQTZBXHVEQTZCXHVEOTNDXHVEQTZEXHVEQTZFXHVEQTZGIisKLSAgICAgICAgIlx1REE3MFx1REE3MVx1REE3Mlx1REE3M1x1REE3NFx1REE3NVx1REE3Nlx1REE3NyIrCi0gICAgICAgICJcdURBNzhcdURBNzlcdURBN0FcdURBN0JcdURBN0NcdURBN0RcdURBN0VcdURBOTEiKwotICAgICAgICAiXHVEQTkyXHVEQTkzXHVEQTk0XHVEQTk1XHVEQTk2XHVEQTk3XHVEQTk4XHVEQTk5IisKLSAgICAgICAgIlx1REE5QVx1REE5Qlx1REE5Q1x1REE5RFx1REE5RVx1REE5Rlx1RDlBNlx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHVEOTVCXHVEOTVDXHVEOUEwXHVEQUEwXHUwMDAwXHVEOTVEXHVEQTZDXHUwMDAwIisKLSAgICAgICAgIlx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMFx1MDAwMCIrCi0gICAgICAgICJcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDBcdTAwMDAiKwotICAgICAgICAiXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwXHUwMDAwIjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHNob3J0IGluZGV4MVtdID0gewotICAgICAgICAxLCAyLCAzLCA0LCA1LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgICA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgICAxMywgMTQsIDE1LCAxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTcsIDE4LAotICAgICAgICAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwKLSAgICAgICAgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsCi0gICAgICAgIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LAotICAgICAgICA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwKLSAgICAgICAgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDk5LCAxMDAsIDEwMSwgMTAyLAotICAgICAgICAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsCi0gICAgICAgIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwKLSAgICAgICAgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDE0MywgMTQ0LCAwLCAwLCAwLCAwLCAxNDUKLSAgICB9OwotCi0gICAgU3RyaW5nIGluZGV4MltdID0gewotICAgICAgICBpbm5lckluZGV4MCwKLSAgICAgICAgaW5uZXJJbmRleDEsCi0gICAgICAgIGlubmVySW5kZXgyLAotICAgICAgICBpbm5lckluZGV4MywKLSAgICAgICAgaW5uZXJJbmRleDQsCi0gICAgICAgIGlubmVySW5kZXg1LAotICAgICAgICBpbm5lckluZGV4NiwKLSAgICAgICAgaW5uZXJJbmRleDcsCi0gICAgICAgIGlubmVySW5kZXg4LAotICAgICAgICBpbm5lckluZGV4OQotICAgIH07CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25ldC9odHRwc2VydmVyL1JlcXVlc3QuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L2h0dHBzZXJ2ZXIvUmVxdWVzdC5qYXZhCmluZGV4IDgwYmMzMWQuLjU0MmU4ZTggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L2h0dHBzZXJ2ZXIvUmVxdWVzdC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L2h0dHBzZXJ2ZXIvUmVxdWVzdC5qYXZhCkBAIC01Miw2ICs1Miw5IEBACiAgICAgICAgIG9zID0gcmF3b3V0OwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBzdGFydExpbmUgPSByZWFkTGluZSgpOworICAgICAgICAgICAgaWYgKHN0YXJ0TGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogc2tpcCBibGFuayBsaW5lcyAqLwogICAgICAgICB9IHdoaWxlIChzdGFydExpbmUgPT0gbnVsbCA/IGZhbHNlIDogc3RhcnRMaW5lLmVxdWFscyAoIiIpKTsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25ldC9odHRwc2VydmVyL1NlcnZlckltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L2h0dHBzZXJ2ZXIvU2VydmVySW1wbC5qYXZhCmluZGV4IGNmZmY4ZGQuLjhmNWM4YmUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L2h0dHBzZXJ2ZXIvU2VydmVySW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L2h0dHBzZXJ2ZXIvU2VydmVySW1wbC5qYXZhCkBAIC00MzMsNiArNDMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJhd2luID0gc3NsU3RyZWFtcy5nZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmF3b3V0ID0gc3NsU3RyZWFtcy5nZXRPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHNzbFN0cmVhbXMuZ2V0U1NMRW5naW5lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNzbFN0cmVhbXMgPSBzc2xTdHJlYW1zOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgcmF3aW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVxdWVzdC5SZWFkU3RyZWFtICgKQEAgLTQ0Miw2ICs0NDMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlckltcGwudGhpcywgY2hhbgogICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJhdyA9IHJhd2luOworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJhd291dCA9IHJhd291dDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUmVxdWVzdCByZXEgPSBuZXcgUmVxdWVzdCAocmF3aW4sIHJhd291dCk7CiAgICAgICAgICAgICAgICAgcmVxdWVzdExpbmUgPSByZXEucmVxdWVzdExpbmUoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0FzeW5jaHJvbm91c0ZpbGVDaGFubmVsSW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uaW8vY2gvQXN5bmNocm9ub3VzRmlsZUNoYW5uZWxJbXBsLmphdmEKaW5kZXggMjczNWE1YS4uMTgwMjM4ZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uaW8vY2gvQXN5bmNocm9ub3VzRmlsZUNoYW5uZWxJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uaW8vY2gvQXN5bmNocm9ub3VzRmlsZUNoYW5uZWxJbXBsLmphdmEKQEAgLTExMywxNiArMTEzLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmaW5hbCB2b2lkIGludmFsaWRhdGVBbGxMb2NrcygpIHsKKyAgICBmaW5hbCB2b2lkIGludmFsaWRhdGVBbGxMb2NrcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChmaWxlTG9ja1RhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmlsZUxvY2tUYWJsZS5yZW1vdmVBbGwoIG5ldyBGaWxlTG9ja1RhYmxlLlJlbGVhc2VyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKEZpbGVMb2NrIGZsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKEZpbGVMb2NrSW1wbClmbCkuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgZm9yIChGaWxlTG9jayBmbDogZmlsZUxvY2tUYWJsZS5yZW1vdmVBbGwoKSkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUxvY2tJbXBsIGZsaSA9IChGaWxlTG9ja0ltcGwpZmw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsUmVsZWFzZShmbGkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxpLmludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTgsNyArMTU4LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW52b2tlZCBieSBGaWxlTG9ja0ltcGwgdG8gcmVsZWFzZSBsb2NrIGFjcXVpcmVkIGJ5IHRoaXMgY2hhbm5lbC4KKyAgICAgKiBSZWxlYXNlcyB0aGUgZ2l2ZW4gZmlsZSBsb2NrLgogICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgcmVsZWFzZShGaWxlTG9ja0ltcGwgZmxpKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW1wbFJlbGVhc2UoRmlsZUxvY2tJbXBsIGZsaSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogSW52b2tlZCBieSBGaWxlTG9ja0ltcGwgdG8gcmVsZWFzZSB0aGUgZ2l2ZW4gZmlsZSBsb2NrIGFuZCByZW1vdmUgaXQKKyAgICAgKiBmcm9tIHRoZSBsb2NrIHRhYmxlLgorICAgICAqLworICAgIGZpbmFsIHZvaWQgcmVsZWFzZShGaWxlTG9ja0ltcGwgZmxpKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgYmVnaW4oKTsKKyAgICAgICAgICAgIGltcGxSZWxlYXNlKGZsaSk7CisgICAgICAgICAgICByZW1vdmVGcm9tRmlsZUxvY2tUYWJsZShmbGkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kKCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25pby9jaC9GaWxlQ2hhbm5lbEltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0ZpbGVDaGFubmVsSW1wbC5qYXZhCmluZGV4IDFkNjBlOTYuLmQwNDYxYjMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0ZpbGVDaGFubmVsSW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0ZpbGVDaGFubmVsSW1wbC5qYXZhCkBAIC0zMyw4ICszMyw2IEBACiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKQEAgLTk1LDE0ICs5MywxNiBAQAogICAgIC8vIC0tIFN0YW5kYXJkIGNoYW5uZWwgb3BlcmF0aW9ucyAtLQogCiAgICAgcHJvdGVjdGVkIHZvaWQgaW1wbENsb3NlQ2hhbm5lbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEludmFsaWRhdGUgYW5kIHJlbGVhc2UgYW55IGxvY2tzIHRoYXQgd2Ugc3RpbGwgaG9sZAorICAgICAgICAvLyBSZWxlYXNlIGFuZCBpbnZhbGlkYXRlIGFueSBsb2NrcyB0aGF0IHdlIHN0aWxsIGhvbGQKICAgICAgICAgaWYgKGZpbGVMb2NrVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmlsZUxvY2tUYWJsZS5yZW1vdmVBbGwoIG5ldyBGaWxlTG9ja1RhYmxlLlJlbGVhc2VyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoRmlsZUxvY2sgZmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICgoRmlsZUxvY2tJbXBsKWZsKS5pbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5kLnJlbGVhc2UoZmQsIGZsLnBvc2l0aW9uKCksIGZsLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEZpbGVMb2NrIGZsOiBmaWxlTG9ja1RhYmxlLnJlbW92ZUFsbCgpKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChmbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmwuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZC5yZWxlYXNlKGZkLCBmbC5wb3NpdGlvbigpLCBmbC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKChGaWxlTG9ja0ltcGwpZmwpLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgbmQucHJlQ2xvc2UoZmQpOwpAQCAtOTEyLDMyICs5MTIsMzMgQEAKICAgICAgICAgRmlsZUxvY2tJbXBsIGZsaSA9IG5ldyBGaWxlTG9ja0ltcGwodGhpcywgcG9zaXRpb24sIHNpemUsIHNoYXJlZCk7CiAgICAgICAgIEZpbGVMb2NrVGFibGUgZmx0ID0gZmlsZUxvY2tUYWJsZSgpOwogICAgICAgICBmbHQuYWRkKGZsaSk7Ci0gICAgICAgIGJvb2xlYW4gaSA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gY29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgIGludCB0aSA9IC0xOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYmVnaW4oKTsKICAgICAgICAgICAgIHRpID0gdGhyZWFkcy5hZGQoKTsKICAgICAgICAgICAgIGlmICghaXNPcGVuKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gbmQubG9jayhmZCwgdHJ1ZSwgcG9zaXRpb24sIHNpemUsIHNoYXJlZCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IEZpbGVEaXNwYXRjaGVyLlJFVF9FWF9MT0NLKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHNoYXJlZDsKLSAgICAgICAgICAgICAgICBGaWxlTG9ja0ltcGwgZmxpMiA9IG5ldyBGaWxlTG9ja0ltcGwodGhpcywgcG9zaXRpb24sIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBmbHQucmVwbGFjZShmbGksIGZsaTIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmbGkyOworICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbiA9IG5kLmxvY2soZmQsIHRydWUsIHBvc2l0aW9uLCBzaXplLCBzaGFyZWQpOworICAgICAgICAgICAgfSB3aGlsZSAoKG4gPT0gRmlsZURpc3BhdGNoZXIuSU5URVJSVVBURUQpICYmIGlzT3BlbigpKTsKKyAgICAgICAgICAgIGlmIChpc09wZW4oKSkgeworICAgICAgICAgICAgICAgIGlmIChuID09IEZpbGVEaXNwYXRjaGVyLlJFVF9FWF9MT0NLKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBzaGFyZWQ7CisgICAgICAgICAgICAgICAgICAgIEZpbGVMb2NrSW1wbCBmbGkyID0gbmV3IEZpbGVMb2NrSW1wbCh0aGlzLCBwb3NpdGlvbiwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZmx0LnJlcGxhY2UoZmxpLCBmbGkyKTsKKyAgICAgICAgICAgICAgICAgICAgZmxpID0gZmxpMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tcGxldGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gRmlsZURpc3BhdGNoZXIuSU5URVJSVVBURUQgfHwgcmVzdWx0ID09IEZpbGVEaXNwYXRjaGVyLk5PX0xPQ0spIHsKLSAgICAgICAgICAgICAgICBmbHQucmVtb3ZlKGZsaSk7Ci0gICAgICAgICAgICAgICAgaSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmbHQucmVtb3ZlKGZsaSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKCFjb21wbGV0ZWQpCisgICAgICAgICAgICAgICAgZmx0LnJlbW92ZShmbGkpOwogICAgICAgICAgICAgdGhyZWFkcy5yZW1vdmUodGkpOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbmQoaSk7CisgICAgICAgICAgICAgICAgZW5kKGNvbXBsZXRlZCk7CiAgICAgICAgICAgICB9IGNhdGNoIChDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CkBAIC05ODUsNyArOTg2LDYgQEAKICAgICB9CiAKICAgICB2b2lkIHJlbGVhc2UoRmlsZUxvY2tJbXBsIGZsaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZW5zdXJlT3BlbigpOwogICAgICAgICBpbnQgdGkgPSB0aHJlYWRzLmFkZCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgZW5zdXJlT3BlbigpOwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVGaWxlTG9ja1RhYmxlIGV4dGVuZHMgRmlsZUxvY2tUYWJsZSB7CiAgICAgICAgIC8vIHN5bmNocm9uaXplIG9uIGxpc3QgZm9yIGFjY2VzcwotICAgICAgICBwcml2YXRlIExpc3Q8RmlsZUxvY2s+IGxvY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxGaWxlTG9jaz4oMik7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlTG9jaz4gbG9ja0xpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGVMb2NrPigyKTsKIAogICAgICAgICBwdWJsaWMgU2ltcGxlRmlsZUxvY2tUYWJsZSgpIHsKICAgICAgICAgfQpAQCAtMTAzNCwxNCArMTAzNCwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKFJlbGVhc2VyIHJlbGVhc2VyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwdWJsaWMgTGlzdDxGaWxlTG9jaz4gcmVtb3ZlQWxsKCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkKGxvY2tMaXN0KSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8RmlsZUxvY2s+IGkgPSBsb2NrTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBGaWxlTG9jayBmbCA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICByZWxlYXNlci5yZWxlYXNlKGZsKTsKLSAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTGlzdDxGaWxlTG9jaz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGaWxlTG9jaz4obG9ja0xpc3QpOworICAgICAgICAgICAgICAgIGxvY2tMaXN0LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25pby9jaC9GaWxlTG9ja0ltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0ZpbGVMb2NrSW1wbC5qYXZhCmluZGV4IDllZmQxNTMuLjhmMTJiY2YgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0ZpbGVMb2NrSW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0ZpbGVMb2NrSW1wbC5qYXZhCkBAIC0zMSwyNSArMzEsMjQgQEAKIHB1YmxpYyBjbGFzcyBGaWxlTG9ja0ltcGwKICAgICBleHRlbmRzIEZpbGVMb2NrCiB7Ci0gICAgYm9vbGVhbiB2YWxpZDsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gdmFsaWQgPSB0cnVlOwogCiAgICAgRmlsZUxvY2tJbXBsKEZpbGVDaGFubmVsIGNoYW5uZWwsIGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSwgYm9vbGVhbiBzaGFyZWQpCiAgICAgewogICAgICAgICBzdXBlcihjaGFubmVsLCBwb3NpdGlvbiwgc2l6ZSwgc2hhcmVkKTsKLSAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7CiAgICAgfQogCiAgICAgRmlsZUxvY2tJbXBsKEFzeW5jaHJvbm91c0ZpbGVDaGFubmVsIGNoYW5uZWwsIGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSwgYm9vbGVhbiBzaGFyZWQpCiAgICAgewogICAgICAgICBzdXBlcihjaGFubmVsLCBwb3NpdGlvbiwgc2l6ZSwgc2hhcmVkKTsKLSAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgIH0KIAotICAgIHN5bmNocm9uaXplZCB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBhc3NlcnQgVGhyZWFkLmhvbGRzTG9jayh0aGlzKTsKICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICB9CiAKQEAgLTY2LDUgKzY1LDQgQEAKICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0ZpbGVMb2NrVGFibGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL0ZpbGVMb2NrVGFibGUuamF2YQppbmRleCAxMzdhYjg4Li4zOWNlZTVhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25pby9jaC9GaWxlTG9ja1RhYmxlLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uaW8vY2gvRmlsZUxvY2tUYWJsZS5qYXZhCkBAIC02MSwyMiArNjEsMTEgQEAKICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmUoRmlsZUxvY2sgZmwpOwogCiAgICAgLyoqCi0gICAgICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgcmVsZWFzZXMgYSBnaXZlbiBmaWxlIGxvY2suCi0gICAgICogVXNlZCB3aXRoIHJlbW92ZUFsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIFJlbGVhc2VyIHsKLSAgICAgICAgdm9pZCByZWxlYXNlKEZpbGVMb2NrIGZsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgZmlsZSBsb2NrcyBmcm9tIHRoZSB0YWJsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgUmVsZWFzZXIjcmVsZWFzZSBtZXRob2QgaXMgaW52b2tlZCBmb3IgZWFjaCBmaWxlIGxvY2sgYmVmb3JlCi0gICAgICogaXQgaXMgcmVtb3ZlZC4KICAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHJlbGVhc2UgbWV0aG9kIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEByZXR1cm4gIFRoZSBsaXN0IG9mIGZpbGUgbG9ja3MgcmVtb3ZlZAogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUFsbChSZWxlYXNlciByKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgcHVibGljIGFic3RyYWN0IExpc3Q8RmlsZUxvY2s+IHJlbW92ZUFsbCgpOwogCiAgICAgLyoqCiAgICAgICogUmVwbGFjZXMgYW4gZXhpc3RpbmcgZmlsZSBsb2NrIGluIHRoZSB0YWJsZS4KQEAgLTE5NSw3ICsxODQsNyBAQAogICAgICAgICAgICAgICAgIEZpbGVMb2NrUmVmZXJlbmNlIHJlZiA9IGxpc3QuZ2V0KGluZGV4KTsKICAgICAgICAgICAgICAgICBGaWxlTG9jayBsb2NrID0gcmVmLmdldCgpOwogICAgICAgICAgICAgICAgIGlmIChsb2NrID09IGZsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCAobG9jayAhPSBudWxsKSAmJiAobG9jay5jaGFubmVsKCkgPT0gY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCAobG9jayAhPSBudWxsKSAmJiAobG9jay5hY3F1aXJlZEJ5KCkgPT0gY2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgIHJlZi5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjA2LDcgKzE5NSw4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKFJlbGVhc2VyIHJlbGVhc2VyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBMaXN0PEZpbGVMb2NrPiByZW1vdmVBbGwoKSB7CisgICAgICAgIExpc3Q8RmlsZUxvY2s+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmlsZUxvY2s+KCk7CiAgICAgICAgIExpc3Q8RmlsZUxvY2tSZWZlcmVuY2U+IGxpc3QgPSBsb2NrTWFwLmdldChmaWxlS2V5KTsKICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7CkBAIC0yMTYsMTMgKzIwNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICBGaWxlTG9jayBsb2NrID0gcmVmLmdldCgpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NrcyBvYnRhaW5lZCBieSB0aGlzIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gbnVsbCAmJiBsb2NrLmNoYW5uZWwoKSA9PSBjaGFubmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZva2UgdGhlIHJlbGVhc2VyIHRvIGludmFsaWRhdGUvcmVsZWFzZSB0aGUgbG9jawotICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZXIucmVsZWFzZShsb2NrKTsKLQorICAgICAgICAgICAgICAgICAgICBpZiAobG9jayAhPSBudWxsICYmIGxvY2suYWNxdWlyZWRCeSgpID09IGNoYW5uZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgbG9jayBmcm9tIHRoZSBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICByZWYuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKGluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRvIHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChsb2NrKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTIzMiw2ICsyMjIsNyBAQAogICAgICAgICAgICAgICAgIHJlbW92ZUtleUlmRW1wdHkoZmlsZUtleSwgbGlzdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmlvL2NoL1NpbXBsZUFzeW5jaHJvbm91c0ZpbGVDaGFubmVsSW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uaW8vY2gvU2ltcGxlQXN5bmNocm9ub3VzRmlsZUNoYW5uZWxJbXBsLmphdmEKaW5kZXggNTJmZTVhMi4uZmI4MmYzMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uaW8vY2gvU2ltcGxlQXN5bmNocm9ub3VzRmlsZUNoYW5uZWxJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uaW8vY2gvU2ltcGxlQXN5bmNocm9ub3VzRmlsZUNoYW5uZWxJbXBsLmphdmEKQEAgLTk3LDYgKzk3LDkgQEAKICAgICAgICAgICAgIC8vIHRoZW4gaXQgd2lsbCB0aHJvdyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCiAgICAgICAgIH0KIAorICAgICAgICAvLyBJbnZhbGlkYXRlIGFuZCByZWxlYXNlIGFueSBsb2NrcyB0aGF0IHdlIHN0aWxsIGhvbGQKKyAgICAgICAgaW52YWxpZGF0ZUFsbExvY2tzKCk7CisKICAgICAgICAgLy8gc2lnbmFsIGFueSB0aHJlYWRzIGJsb2NrZWQgb24gdGhpcyBjaGFubmVsCiAgICAgICAgIG5kLnByZUNsb3NlKGZkT2JqKTsKICAgICAgICAgdGhyZWFkcy5zaWduYWxBbmRXYWl0KCk7CkBAIC0xMDksOSArMTEyLDYgQEAKICAgICAgICAgICAgIGNsb3NlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEludmFsaWRhdGUgYW5kIHJlbGVhc2UgYW55IGxvY2tzIHRoYXQgd2Ugc3RpbGwgaG9sZAotICAgICAgICBpbnZhbGlkYXRlQWxsTG9ja3MoKTsKLQogICAgICAgICAvLyBjbG9zZSBmaWxlCiAgICAgICAgIG5kLmNsb3NlKGZkT2JqKTsKIApAQCAtMjI2LDExICsyMjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuZC5sb2NrKGZkT2JqLCB0cnVlLCBwb3NpdGlvbiwgc2l6ZSwgc2hhcmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChuID09IEZpbGVEaXNwYXRjaGVyLklOVEVSUlVQVEVEKSAmJiBpc09wZW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PSBGaWxlRGlzcGF0Y2hlci5MT0NLRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09IEZpbGVEaXNwYXRjaGVyLkxPQ0tFRCAmJiBpc09wZW4oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRSZXN1bHQoZmxpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gIT0gRmlsZURpc3BhdGNoZXIuSU5URVJSVVBURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7CkBAIC0yNzksMTYgKzI3NywxNiBAQAogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIG4gPSBuZC5sb2NrKGZkT2JqLCBmYWxzZSwgcG9zaXRpb24sIHNpemUsIHNoYXJlZCk7CiAgICAgICAgICAgICB9IHdoaWxlICgobiA9PSBGaWxlRGlzcGF0Y2hlci5JTlRFUlJVUFRFRCkgJiYgaXNPcGVuKCkpOwotICAgICAgICAgICAgaWYgKG4gIT0gRmlsZURpc3BhdGNoZXIuTE9DS0VEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPT0gRmlsZURpc3BhdGNoZXIuTk9fTE9DSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIC8vIGxvY2tlZCBieSBzb21lb25lIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAobiA9PSBGaWxlRGlzcGF0Y2hlci5JTlRFUlJVUFRFRCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBnZXQgaGVyZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgaWYgKG4gPT0gRmlsZURpc3BhdGNoZXIuTE9DS0VEICYmIGlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgZ290TG9jayA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsaTsgICAgLy8gbG9jayBhY3F1aXJlZAogICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290TG9jayA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gZmxpOworICAgICAgICAgICAgaWYgKG4gPT0gRmlsZURpc3BhdGNoZXIuTk9fTE9DSykKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgLy8gbG9ja2VkIGJ5IHNvbWVvbmUgZWxzZQorICAgICAgICAgICAgaWYgKG4gPT0gRmlsZURpc3BhdGNoZXIuSU5URVJSVVBURUQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvLyBzaG91bGQgbm90IGdldCBoZXJlCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmICghZ290TG9jaykKICAgICAgICAgICAgICAgICByZW1vdmVGcm9tRmlsZUxvY2tUYWJsZShmbGkpOwpAQCAtMjk4LDE0ICsyOTYsOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHZvaWQgcmVsZWFzZShGaWxlTG9ja0ltcGwgZmxpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYmVnaW4oKTsKLSAgICAgICAgICAgIG5kLnJlbGVhc2UoZmRPYmosIGZsaS5wb3NpdGlvbigpLCBmbGkuc2l6ZSgpKTsKLSAgICAgICAgICAgIHJlbW92ZUZyb21GaWxlTG9ja1RhYmxlKGZsaSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBlbmQoKTsKLSAgICAgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIGltcGxSZWxlYXNlKEZpbGVMb2NrSW1wbCBmbGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG5kLnJlbGVhc2UoZmRPYmosIGZsaS5wb3NpdGlvbigpLCBmbGkuc2l6ZSgpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9Db25maWcuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9Db25maWcuamF2YQppbmRleCAwN2M3OGUyLi5lMDM2Nzc2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvQ29uZmlnLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L0NvbmZpZy5qYXZhCkBAIC03MzYsNiArNzM2LDE0IEBACiAgICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cmltbWVkKFN0cmluZyBzKSB7CisgICAgICAgIHMgPSBzLnRyaW0oKTsKKyAgICAgICAgaWYgKHMuY2hhckF0KDApID09ICciJyAmJiBzLmNoYXJBdChzLmxlbmd0aCgpLTEpID09ICciJyB8fAorICAgICAgICAgICAgICAgIHMuY2hhckF0KDApID09ICdcJycgJiYgcy5jaGFyQXQocy5sZW5ndGgoKS0xKSA9PSAnXCcnKSB7CisgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSwgcy5sZW5ndGgoKS0xKS50cmltKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQogICAgIC8qKgogICAgICAqIFBhcnNlcyBrZXktdmFsdWUgcGFpcnMgdW5kZXIgYSBzdGFuemEgbmFtZS4KICAgICAgKi8KQEAgLTc0Nyw3ICs3NTUsNyBAQAogICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsaW5lLmxlbmd0aCgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoaikgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAobGluZS5zdWJzdHJpbmcoMCwgaikpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKGxpbmUuc3Vic3RyaW5nKGogKyAxKSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB0cmltbWVkKGxpbmUuc3Vic3RyaW5nKGogKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnB1dChrZXksIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtODIwLDcgKzgyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lVmVjdG9yID0gdGFibGUuZ2V0KGtleSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZVZlY3Rvci5hZGRFbGVtZW50KChsaW5lLnN1YnN0cmluZyhqICsgMSkpLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgIG5hbWVWZWN0b3IuYWRkRWxlbWVudCh0cmltbWVkKGxpbmUuc3Vic3RyaW5nKGogKyAxKSkpOwogICAgICAgICAgICAgICAgICAgICB0YWJsZS5wdXQoa2V5LCBuYW1lVmVjdG9yKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTI2Myw0ICsxMjcxLDMyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHRvU3RyaW5nSW5kZW50ZWQoIiIsIHN0YW56YVRhYmxlLCBzYik7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRvU3RyaW5nSW5kZW50ZWQoU3RyaW5nIHByZWZpeCwgT2JqZWN0IG9iaiwKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYikgeworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChvYmopOworICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEhhc2h0YWJsZSkgeworICAgICAgICAgICAgSGFzaHRhYmxlIHRhYiA9IChIYXNodGFibGUpb2JqOworICAgICAgICAgICAgZm9yIChPYmplY3QgbzogdGFiLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG8pOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiID0ge1xuIik7CisgICAgICAgICAgICAgICAgdG9TdHJpbmdJbmRlbnRlZChwcmVmaXggKyAiICAgICIsIHRhYi5nZXQobyksIHNiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocHJlZml4ICsgIn1cbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFZlY3RvcikgeworICAgICAgICAgICAgVmVjdG9yIHYgPSAoVmVjdG9yKW9iajsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG86IHYudG9BcnJheSgpKSB7CisgICAgICAgICAgICAgICAgdG9TdHJpbmdJbmRlbnRlZChwcmVmaXggKyAiICAgICIsIG8sIHNiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9LcmJLZGNSZXEuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9LcmJLZGNSZXEuamF2YQppbmRleCBlOWZmOWNjLi4yNTlhZWRkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvS3JiS2RjUmVxLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L0tyYktkY1JlcS5qYXZhCkBAIC0yNzQsMjcgKzI3NCwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIixBdHRlbXB0ID0iICsgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgI2J5dGVzPSIgKyBvYnVmLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU2VuZCB0aGUgZGF0YSB0byB0aGUga2RjLgotICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBrZGMuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAgICAgICAgICAgICAgICAgICBrZGNDbGllbnQuc2VuZChvYnVmKTsKIAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBBbmQgZ2V0IGEgcmVzcG9uc2UuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWJ1ZiA9IGtkY0NsaWVudC5yZWNlaXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgiU29ja2V0VGltZU91dEV4Y2VwdGlvbiB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHQ6ICIgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbmQgZ2V0IGEgcmVzcG9uc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWJ1ZiA9IGtkY0NsaWVudC5yZWNlaXZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoIlNvY2tldFRpbWVPdXRFeGNlcHRpb24gd2l0aCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdDogIiArIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBERUZBVUxUX0tEQ19SRVRSWV9MSU1JVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYnVmID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gREVGQVVMVF9LRENfUkVUUllfTElNSVQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYnVmID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtkY0NsaWVudC5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL1VEUENsaWVudC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL1VEUENsaWVudC5qYXZhCmluZGV4IGM5ZTQ0MGYuLjY3MGRmOTIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9VRFBDbGllbnQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvVURQQ2xpZW50LmphdmEKQEAgLTkzLDQgKzkzLDcgQEAKICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGRnU29ja2V0LmNsb3NlKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTEvUDExS2V5UGFpckdlbmVyYXRvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTEvUDExS2V5UGFpckdlbmVyYXRvci5qYXZhCmluZGV4IDcwMWUxMDQuLjEwMjdkZjkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjczExL1AxMUtleVBhaXJHZW5lcmF0b3IuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9QMTFLZXlQYWlyR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDMtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zOCw2ICszOCw4IEBACiBpbXBvcnQgc3VuLnNlY3VyaXR5LnBrY3MxMS53cmFwcGVyLio7CiBpbXBvcnQgc3RhdGljIHN1bi5zZWN1cml0eS5wa2NzMTEud3JhcHBlci5QS0NTMTFDb25zdGFudHMuKjsKIAoraW1wb3J0IHN1bi5zZWN1cml0eS5yc2EuUlNBS2V5RmFjdG9yeTsKKwogLyoqCiAgKiBLZXlQYWlyR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIGN1cnJlbnRseSBzdXBwb3J0cwogICogUlNBLCBEU0EsIERILCBhbmQgRUMuCkBAIC02Niw3ICs2OCw3IEBACiAgICAgcHJpdmF0ZSBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtczsKIAogICAgIC8vIGZvciBSU0EsIHNlbGVjdGVkIG9yIGRlZmF1bHQgdmFsdWUgb2YgcHVibGljIGV4cG9uZW50LCBhbHdheXMgdmFsaWQKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgcnNhUHVibGljRXhwb25lbnQ7CisgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHJzYVB1YmxpY0V4cG9uZW50ID0gUlNBS2V5R2VuUGFyYW1ldGVyU3BlYy5GNDsKIAogICAgIC8vIFNlY3VyZVJhbmRvbSBpbnN0YW5jZSwgaWYgc3BlY2lmaWVkIGluIGluaXQKICAgICBwcml2YXRlIFNlY3VyZVJhbmRvbSByYW5kb207CkBAIC04OCwxOSArOTAsMTkgQEAKICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGludCBrZXlTaXplLCBTZWN1cmVSYW5kb20gcmFuZG9tKSB7CiAgICAgICAgIHRva2VuLmVuc3VyZVZhbGlkKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGVja0tleVNpemUoa2V5U2l6ZSk7CisgICAgICAgICAgICBjaGVja0tleVNpemUoa2V5U2l6ZSwgbnVsbCk7CiAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMua2V5U2l6ZSA9IGtleVNpemU7CiAgICAgICAgIHRoaXMucGFyYW1zID0gbnVsbDsKICAgICAgICAgdGhpcy5yYW5kb20gPSByYW5kb207Ci0gICAgICAgIHRoaXMucnNhUHVibGljRXhwb25lbnQgPSBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjLkY0OwogICAgICAgICBpZiAoYWxnb3JpdGhtLmVxdWFscygiRUMiKSkgewogICAgICAgICAgICAgcGFyYW1zID0gUDExRUNLZXlGYWN0b3J5LmdldEVDUGFyYW1ldGVyU3BlYyhrZXlTaXplKTsKICAgICAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgKCJObyBFQyBwYXJhbWV0ZXJzIGF2YWlsYWJsZSBmb3Iga2V5IHNpemUgIiArIGtleVNpemUgKyAiIGJpdHMiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5vIEVDIHBhcmFtZXRlcnMgYXZhaWxhYmxlIGZvciBrZXkgc2l6ZSAiCisgICAgICAgICAgICAgICAgICAgICsga2V5U2l6ZSArICIgYml0cyIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTE1LDggKzExNywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKCJESFBhcmFtZXRlclNwZWMgcmVxdWlyZWQgZm9yIERpZmZpZS1IZWxsbWFuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBESFBhcmFtZXRlclNwZWMgZGhQYXJhbXMgPSAoREhQYXJhbWV0ZXJTcGVjKXBhcmFtczsKLSAgICAgICAgICAgIHRoaXMua2V5U2l6ZSA9IGRoUGFyYW1zLmdldFAoKS5iaXRMZW5ndGgoKTsKLSAgICAgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworICAgICAgICAgICAgaW50IHRtcEtleVNpemUgPSBkaFBhcmFtcy5nZXRQKCkuYml0TGVuZ3RoKCk7CisgICAgICAgICAgICBjaGVja0tleVNpemUodG1wS2V5U2l6ZSwgZGhQYXJhbXMpOworICAgICAgICAgICAgdGhpcy5rZXlTaXplID0gdG1wS2V5U2l6ZTsKKyAgICAgICAgICAgIHRoaXMucGFyYW1zID0gZGhQYXJhbXM7CiAgICAgICAgICAgICAvLyBYWFggc2FuaXR5IGNoZWNrIHBhcmFtcwogICAgICAgICB9IGVsc2UgaWYgKGFsZ29yaXRobS5lcXVhbHMoIlJTQSIpKSB7CiAgICAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyA9PSBmYWxzZSkgewpAQCAtMTI0LDcgKzEyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoIlJTQUtleUdlblBhcmFtZXRlclNwZWMgcmVxdWlyZWQgZm9yIFJTQSIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyByc2FQYXJhbXMgPSAoUlNBS2V5R2VuUGFyYW1ldGVyU3BlYylwYXJhbXM7Ci0gICAgICAgICAgICB0aGlzLmtleVNpemUgPSByc2FQYXJhbXMuZ2V0S2V5c2l6ZSgpOworICAgICAgICAgICAgaW50IHRtcEtleVNpemUgPSByc2FQYXJhbXMuZ2V0S2V5c2l6ZSgpOworICAgICAgICAgICAgY2hlY2tLZXlTaXplKHRtcEtleVNpemUsIHJzYVBhcmFtcyk7CisgICAgICAgICAgICB0aGlzLmtleVNpemUgPSB0bXBLZXlTaXplOwogICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBudWxsOwogICAgICAgICAgICAgdGhpcy5yc2FQdWJsaWNFeHBvbmVudCA9IHJzYVBhcmFtcy5nZXRQdWJsaWNFeHBvbmVudCgpOwogICAgICAgICAgICAgLy8gWFhYIHNhbml0eSBjaGVjayBwYXJhbXMKQEAgLTEzNCwxMyArMTQwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoIkRTQVBhcmFtZXRlclNwZWMgcmVxdWlyZWQgZm9yIERTQSIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRFNBUGFyYW1ldGVyU3BlYyBkc2FQYXJhbXMgPSAoRFNBUGFyYW1ldGVyU3BlYylwYXJhbXM7Ci0gICAgICAgICAgICB0aGlzLmtleVNpemUgPSBkc2FQYXJhbXMuZ2V0UCgpLmJpdExlbmd0aCgpOwotICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisgICAgICAgICAgICBpbnQgdG1wS2V5U2l6ZSA9IGRzYVBhcmFtcy5nZXRQKCkuYml0TGVuZ3RoKCk7CisgICAgICAgICAgICBjaGVja0tleVNpemUodG1wS2V5U2l6ZSwgZHNhUGFyYW1zKTsKKyAgICAgICAgICAgIHRoaXMua2V5U2l6ZSA9IHRtcEtleVNpemU7CisgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IGRzYVBhcmFtczsKICAgICAgICAgICAgIC8vIFhYWCBzYW5pdHkgY2hlY2sgcGFyYW1zCiAgICAgICAgIH0gZWxzZSBpZiAoYWxnb3JpdGhtLmVxdWFscygiRUMiKSkgewogICAgICAgICAgICAgRUNQYXJhbWV0ZXJTcGVjIGVjUGFyYW1zOwogICAgICAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEVDUGFyYW1ldGVyU3BlYykgewotICAgICAgICAgICAgICAgIGVjUGFyYW1zID0gUDExRUNLZXlGYWN0b3J5LmdldEVDUGFyYW1ldGVyU3BlYygoRUNQYXJhbWV0ZXJTcGVjKXBhcmFtcyk7CisgICAgICAgICAgICAgICAgZWNQYXJhbXMgPSBQMTFFQ0tleUZhY3RvcnkuZ2V0RUNQYXJhbWV0ZXJTcGVjKAorICAgICAgICAgICAgICAgICAgICAoRUNQYXJhbWV0ZXJTcGVjKXBhcmFtcyk7CiAgICAgICAgICAgICAgICAgaWYgKGVjUGFyYW1zID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICgiVW5zdXBwb3J0ZWQgY3VydmU6ICIgKyBwYXJhbXMpOwpAQCAtMTU2LDE2ICsxNjUsMTcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAoIkVDUGFyYW1ldGVyU3BlYyBvciBFQ0dlblBhcmFtZXRlclNwZWMgcmVxdWlyZWQgZm9yIEVDIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmtleVNpemUgPSBlY1BhcmFtcy5nZXRDdXJ2ZSgpLmdldEZpZWxkKCkuZ2V0RmllbGRTaXplKCk7CisgICAgICAgICAgICBpbnQgdG1wS2V5U2l6ZSA9IGVjUGFyYW1zLmdldEN1cnZlKCkuZ2V0RmllbGQoKS5nZXRGaWVsZFNpemUoKTsKKyAgICAgICAgICAgIGNoZWNrS2V5U2l6ZSh0bXBLZXlTaXplLCBlY1BhcmFtcyk7CisgICAgICAgICAgICB0aGlzLmtleVNpemUgPSB0bXBLZXlTaXplOwogICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBlY1BhcmFtczsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbigiVW5rbm93biBhbGdvcml0aG06ICIgKyBhbGdvcml0aG0pOwogICAgICAgICB9CiAgICAgICAgIHRoaXMucmFuZG9tID0gcmFuZG9tOwotICAgICAgICBjaGVja0tleVNpemUoa2V5U2l6ZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrS2V5U2l6ZShpbnQga2V5U2l6ZSkKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tLZXlTaXplKGludCBrZXlTaXplLCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHBhcmFtcykKICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGFsZ29yaXRobS5lcXVhbHMoIkVDIikpIHsKICAgICAgICAgICAgIGlmIChrZXlTaXplIDwgMTEyKSB7CkBAIC0xNzgsMTMgKzE4OCwyOCBAQAogICAgICAgICAgICAgICAgICAgICAoIktleSBzaXplIG11c3QgYmUgYXQgbW9zdCAyMDQ4IGJpdCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGFsZ29yaXRobS5lcXVhbHMoIlJTQSIpKSB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHRtcEV4cG9uZW50ID0gcnNhUHVibGljRXhwb25lbnQ7CisgICAgICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHRlc3RlZCBmb3IgaW5zdGFuY2VvZiBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjIGFib3ZlCisgICAgICAgICAgICAgICAgdG1wRXhwb25lbnQgPQorICAgICAgICAgICAgICAgICAgICAoKFJTQUtleUdlblBhcmFtZXRlclNwZWMpcGFyYW1zKS5nZXRQdWJsaWNFeHBvbmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHByb3ZpZGVyIHN1cHBvcnRzIDY0SyBvciBsZXNzLgorICAgICAgICAgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGhzKGtleVNpemUsIHRtcEV4cG9uZW50LAorICAgICAgICAgICAgICAgICAgICA1MTIsIDY0ICogMTAyNCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKwogICAgICAgICBpZiAoa2V5U2l6ZSA8IDUxMikgewogICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KICAgICAgICAgICAgICAgICAoIktleSBzaXplIG11c3QgYmUgYXQgbGVhc3QgNTEyIGJpdCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChhbGdvcml0aG0uZXF1YWxzKCJSU0EiKSB8fAotICAgICAgICAgICAgICAgIChhbGdvcml0aG0uZXF1YWxzKCJESCIpICYmIChwYXJhbXMgIT0gbnVsbCkpKSB7CisgICAgICAgIGlmIChhbGdvcml0aG0uZXF1YWxzKCJESCIpICYmIChwYXJhbXMgIT0gbnVsbCkpIHsKICAgICAgICAgICAgIC8vIHNhbml0eSBjaGVjaywgbm9ib2R5IHJlYWxseSB3YW50cyBrZXlzIHRoaXMgbGFyZ2UKICAgICAgICAgICAgIGlmIChrZXlTaXplID4gNjQgKiAxMDI0KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjczExL1AxMUtleVN0b3JlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9QMTFLZXlTdG9yZS5qYXZhCmluZGV4IDgzOWEyZjMuLmIwZTIwNzEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjczExL1AxMUtleVN0b3JlLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTEvUDExS2V5U3RvcmUuamF2YQpAQCAtODAsNiArODAsOCBAQAogaW1wb3J0IHN1bi5zZWN1cml0eS5wa2NzMTEud3JhcHBlci4qOwogaW1wb3J0IHN0YXRpYyBzdW4uc2VjdXJpdHkucGtjczExLndyYXBwZXIuUEtDUzExQ29uc3RhbnRzLio7CiAKK2ltcG9ydCBzdW4uc2VjdXJpdHkucnNhLlJTQUtleUZhY3Rvcnk7CisKIGZpbmFsIGNsYXNzIFAxMUtleVN0b3JlIGV4dGVuZHMgS2V5U3RvcmVTcGkgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ0tfQVRUUklCVVRFIEFUVFJfQ0xBU1NfQ0VSVCA9CkBAIC0xMzI4LDYgKzEzMzAsMTUgQEAKICAgICAgICAgICAgIEJpZ0ludGVnZXIgbW9kdWx1cyA9IGF0dHJzWzBdLmdldEJpZ0ludGVnZXIoKTsKICAgICAgICAgICAgIGtleUxlbmd0aCA9IG1vZHVsdXMuYml0TGVuZ3RoKCk7CiAKKyAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgd2lsbCBjb21iaW5lIG91ciAiZG9uJ3QgY2FyZSIgdmFsdWVzIGhlcmUKKyAgICAgICAgICAgIC8vIHdpdGggdGhlIHN5c3RlbS13aWRlIG1pbi9tYXggdmFsdWVzLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBSU0FLZXlGYWN0b3J5LmNoZWNrS2V5TGVuZ3RocyhrZXlMZW5ndGgsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIC0xLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgS2V5U3RvcmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gUDExS2V5LnByaXZhdGVLZXkoc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VHlwZSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjczExL1AxMVJTQUtleUZhY3RvcnkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjczExL1AxMVJTQUtleUZhY3RvcnkuamF2YQppbmRleCA1ZjNjYmJmLi4xYmQ3NjRkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9QMTFSU0FLZXlGYWN0b3J5LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTEvUDExUlNBS2V5RmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM1LDYgKzM1LDggQEAKIGltcG9ydCBzdW4uc2VjdXJpdHkucGtjczExLndyYXBwZXIuKjsKIGltcG9ydCBzdGF0aWMgc3VuLnNlY3VyaXR5LnBrY3MxMS53cmFwcGVyLlBLQ1MxMUNvbnN0YW50cy4qOwogCitpbXBvcnQgc3VuLnNlY3VyaXR5LnJzYS5SU0FLZXlGYWN0b3J5OworCiAvKioKICAqIFJTQSBLZXlGYWN0b3J5IGltcGxlbWVuYXRpb24uCiAgKgpAQCAtMTMxLDYgKzEzMyw5IEBACiAgICAgICAgIH0gY2F0Y2ggKFBLQ1MxMUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KICAgICAgICAgICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgUlNBIHB1YmxpYyBrZXkiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgUlNBIHB1YmxpYyBrZXkiLCBlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTc1LDExICsxODAsMTUgQEAKICAgICAgICAgfSBjYXRjaCAoUEtDUzExRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbgogICAgICAgICAgICAgICAgICgiQ291bGQgbm90IGNyZWF0ZSBSU0EgcHJpdmF0ZSBrZXkiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleVNwZWNFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgUlNBIHByaXZhdGUga2V5IiwgZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIFB1YmxpY0tleSBnZW5lcmF0ZVB1YmxpYyhCaWdJbnRlZ2VyIG4sIEJpZ0ludGVnZXIgZSkKLSAgICAgICAgICAgIHRocm93cyBQS0NTMTFFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIFBLQ1MxMUV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGhzKG4uYml0TGVuZ3RoKCksIGUsIC0xLCA2NCAqIDEwMjQpOwogICAgICAgICBDS19BVFRSSUJVVEVbXSBhdHRyaWJ1dGVzID0gbmV3IENLX0FUVFJJQlVURVtdIHsKICAgICAgICAgICAgIG5ldyBDS19BVFRSSUJVVEUoQ0tBX0NMQVNTLCBDS09fUFVCTElDX0tFWSksCiAgICAgICAgICAgICBuZXcgQ0tfQVRUUklCVVRFKENLQV9LRVlfVFlQRSwgQ0tLX1JTQSksCkBAIC0yMDAsNyArMjA5LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIFByaXZhdGVLZXkgZ2VuZXJhdGVQcml2YXRlKEJpZ0ludGVnZXIgbiwgQmlnSW50ZWdlciBkKQotICAgICAgICAgICAgdGhyb3dzIFBLQ1MxMUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgUEtDUzExRXhjZXB0aW9uLCBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKKyAgICAgICAgUlNBS2V5RmFjdG9yeS5jaGVja0tleUxlbmd0aHMobi5iaXRMZW5ndGgoKSwgbnVsbCwgLTEsIDY0ICogMTAyNCk7CiAgICAgICAgIENLX0FUVFJJQlVURVtdIGF0dHJpYnV0ZXMgPSBuZXcgQ0tfQVRUUklCVVRFW10gewogICAgICAgICAgICAgbmV3IENLX0FUVFJJQlVURShDS0FfQ0xBU1MsIENLT19QUklWQVRFX0tFWSksCiAgICAgICAgICAgICBuZXcgQ0tfQVRUUklCVVRFKENLQV9LRVlfVFlQRSwgQ0tLX1JTQSksCkBAIC0yMjIsNyArMjMyLDkgQEAKIAogICAgIHByaXZhdGUgUHJpdmF0ZUtleSBnZW5lcmF0ZVByaXZhdGUoQmlnSW50ZWdlciBuLCBCaWdJbnRlZ2VyIGUsCiAgICAgICAgICAgICBCaWdJbnRlZ2VyIGQsIEJpZ0ludGVnZXIgcCwgQmlnSW50ZWdlciBxLCBCaWdJbnRlZ2VyIHBlLAotICAgICAgICAgICAgQmlnSW50ZWdlciBxZSwgQmlnSW50ZWdlciBjb2VmZikgdGhyb3dzIFBLQ1MxMUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHFlLCBCaWdJbnRlZ2VyIGNvZWZmKSB0aHJvd3MgUEtDUzExRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGhzKG4uYml0TGVuZ3RoKCksIGUsIC0xLCA2NCAqIDEwMjQpOwogICAgICAgICBDS19BVFRSSUJVVEVbXSBhdHRyaWJ1dGVzID0gbmV3IENLX0FUVFJJQlVURVtdIHsKICAgICAgICAgICAgIG5ldyBDS19BVFRSSUJVVEUoQ0tBX0NMQVNTLCBDS09fUFJJVkFURV9LRVkpLAogICAgICAgICAgICAgbmV3IENLX0FUVFJJQlVURShDS0FfS0VZX1RZUEUsIENLS19SU0EpLApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTEvU3VuUEtDUzExLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9TdW5QS0NTMTEuamF2YQppbmRleCBiNmViMWMyLi42ZDBlMDQ1IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9TdW5QS0NTMTEuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9TdW5QS0NTMTEuamF2YQpAQCAtMTIwLDExICsxMjAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgbmV3IFN1blBLQ1MxMShTdHJpbmcpIG9yIG5ldyBTdW5QS0NTMTEoSW5wdXRTdHJlYW0pIGluc3RlYWQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgbmV3IFN1blBLQ1MxMShTdHJpbmcpIG9yIG5ldyBTdW5QS0NTMTEoSW5wdXRTdHJlYW0pCisgICAgICogICAgICAgICBpbnN0ZWFkCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgU3VuUEtDUzExKFN0cmluZyBjb25maWdOYW1lLCBJbnB1dFN0cmVhbSBjb25maWdTdHJlYW0pIHsKLSAgICAgICAgc3VwZXIoIlN1blBLQ1MxMS0iICsgQ29uZmlnLmdldENvbmZpZyhjb25maWdOYW1lLCBjb25maWdTdHJlYW0pLmdldE5hbWUoKSwKKyAgICAgICAgc3VwZXIoIlN1blBLQ1MxMS0iICsKKyAgICAgICAgICAgIENvbmZpZy5nZXRDb25maWcoY29uZmlnTmFtZSwgY29uZmlnU3RyZWFtKS5nZXROYW1lKCksCiAgICAgICAgICAgICAxLjdkLCBDb25maWcuZ2V0Q29uZmlnKGNvbmZpZ05hbWUsIGNvbmZpZ1N0cmVhbSkuZ2V0RGVzY3JpcHRpb24oKSk7CiAgICAgICAgIHRoaXMuY29uZmlnTmFtZSA9IGNvbmZpZ05hbWU7CiAgICAgICAgIHRoaXMuY29uZmlnID0gQ29uZmlnLnJlbW92ZUNvbmZpZyhjb25maWdOYW1lKTsKQEAgLTE1Myw3ICsxNTUsOCBAQAogICAgICAgICAvLwogICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gU2VjbW9kIG1vZGUgYW5kIGNvbmZpZ3VyZWQgdG8gdXNlIGVpdGhlciB0aGUKICAgICAgICAgLy8gbnNzS2V5U3RvcmUgb3IgdGhlIG5zc1RydXN0QW5jaG9ycyBtb2R1bGUsIHdlIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgLy8gc3dpdGNoIHRvIHVzaW5nIHRoZSBOU1MgdHJ1c3QgYXR0cmlidXRlcyBmb3IgdHJ1c3RlZCBjZXJ0cyAoS2V5U3RvcmUpLgorICAgICAgICAvLyBzd2l0Y2ggdG8gdXNpbmcgdGhlIE5TUyB0cnVzdCBhdHRyaWJ1dGVzIGZvciB0cnVzdGVkIGNlcnRzCisgICAgICAgIC8vIChLZXlTdG9yZSkuCiAgICAgICAgIC8vCiAKICAgICAgICAgaWYgKHVzZVNlY21vZCkgewpAQCAtMTY4LDMzICsxNzEsNDAgQEAKICAgICAgICAgICAgICAgICBpZiAoc2VjbW9kLmlzSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobnNzU2VjbW9kRGlyZWN0b3J5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gc2VjbW9kLmdldENvbmZpZ0RpcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzICE9IG51bGwpICYmIChzLmVxdWFscyhuc3NTZWNtb2REaXJlY3RvcnkpID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLmVxdWFscyhuc3NTZWNtb2REaXJlY3RvcnkpID09IGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbigiU2VjbW9kIGRpcmVjdG9yeSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbnNzU2VjbW9kRGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbnZhbGlkLCBOU1MgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoICIgKyBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGludmFsaWQsIE5TUyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChuc3NMaWJyYXJ5RGlyZWN0b3J5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gc2VjbW9kLmdldExpYkRpcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzICE9IG51bGwpICYmIChzLmVxdWFscyhuc3NMaWJyYXJ5RGlyZWN0b3J5KSA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocyAhPSBudWxsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy5lcXVhbHMobnNzTGlicmFyeURpcmVjdG9yeSkgPT0gZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJOU1MgbGlicmFyeSBkaXJlY3RvcnkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5zc0xpYnJhcnlEaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGludmFsaWQsIE5TUyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggIiArIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW52YWxpZCwgTlNTIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAobnNzRGJNb2RlICE9IERiTW9kZS5OT19EQikgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zc1NlY21vZERpcmVjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJTZWNtb2Qgbm90IGluaXRpYWxpemVkIGFuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5zc1NlY21vZERpcmVjdG9yeSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VjbW9kIG5vdCBpbml0aWFsaXplZCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibnNzU2VjbW9kRGlyZWN0b3J5IG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc3NTZWNtb2REaXJlY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibnNzU2VjbW9kRGlyZWN0b3J5IG11c3Qgbm90IGJlIHNwZWNpZmllZCBpbiBub0RiIG1vZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuc3NTZWNtb2REaXJlY3RvcnkgbXVzdCBub3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzcGVjaWZpZWQgaW4gbm9EYiBtb2RlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VjbW9kLmluaXRpYWxpemUobnNzRGJNb2RlLCBuc3NTZWNtb2REaXJlY3RvcnksIG5zc0xpYnJhcnlEaXJlY3RvcnkpOworICAgICAgICAgICAgICAgICAgICBzZWNtb2QuaW5pdGlhbGl6ZShuc3NEYk1vZGUsIG5zc1NlY21vZERpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zc0xpYnJhcnlEaXJlY3RvcnkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvLyBYWFggd2hpY2ggZXhjZXB0aW9uIHRvIHRocm93CkBAIC0yMTEsNyArMjIxLDggQEAKICAgICAgICAgICAgICAgICBpZiAobnNzTW9kdWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9ICJmaXBzIjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lID0gKG5zc0RiTW9kZSA9PSBEYk1vZGUuTk9fREIpID8gImNyeXB0byIgOiAia2V5c3RvcmUiOworICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lID0gKG5zc0RiTW9kZSA9PSBEYk1vZGUuTk9fREIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJjcnlwdG8iIDogImtleXN0b3JlIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobW9kdWxlTmFtZS5lcXVhbHMoImZpcHMiKSkgewpAQCAtMjUzLDEwICsyNjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogb25seSAiICsgayArICIgZXh0ZXJuYWwgTlNTIG1vZHVsZXMgYXZhaWxhYmxlIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oIlVua25vd24gTlNTIG1vZHVsZTogIiArIG1vZHVsZU5hbWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gTlNTIG1vZHVsZTogIiArIG1vZHVsZU5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5zc01vZHVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJOU1MgbW9kdWxlIG5vdCBhdmFpbGFibGU6ICIgKyBtb2R1bGVOYW1lKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJOU1MgbW9kdWxlIG5vdCBhdmFpbGFibGU6ICIgKyBtb2R1bGVOYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuc3NNb2R1bGUuaGFzSW5pdGlhbGl6ZWRQcm92aWRlcigpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJTZWNtb2QgbW9kdWxlIGFscmVhZHkgY29uZmlndXJlZCIpOwpAQCAtMjk2LDggKzMwOSw5IEBACiAgICAgICAgICAgICBpbml0QXJncy5mbGFncyA9IENLRl9PU19MT0NLSU5HX09LOwogICAgICAgICAgICAgUEtDUzExIHRtcFBLQ1MxMTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1wUEtDUzExID0gUEtDUzExLmdldEluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgIChsaWJyYXJ5LCBmdW5jdGlvbkxpc3QsIGluaXRBcmdzLCBjb25maWcuZ2V0T21pdEluaXRpYWxpemUoKSk7CisgICAgICAgICAgICAgICAgdG1wUEtDUzExID0gUEtDUzExLmdldEluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LCBmdW5jdGlvbkxpc3QsIGluaXRBcmdzLAorICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0T21pdEluaXRpYWxpemUoKSk7CiAgICAgICAgICAgICB9IGNhdGNoIChQS0NTMTFFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlYnVnLnByaW50bG4oIk11bHRpLXRocmVhZGVkIGluaXRpYWxpemF0aW9uIGZhaWxlZDogIiArIGUpOwpAQCAtMzEyLDggKzMyNiw4IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW5pdEFyZ3MuZmxhZ3MgPSAwOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0bXBQS0NTMTEgPSBQS0NTMTEuZ2V0SW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgKGxpYnJhcnksIGZ1bmN0aW9uTGlzdCwgaW5pdEFyZ3MsIGNvbmZpZy5nZXRPbWl0SW5pdGlhbGl6ZSgpKTsKKyAgICAgICAgICAgICAgICB0bXBQS0NTMTEgPSBQS0NTMTEuZ2V0SW5zdGFuY2UobGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25MaXN0LCBpbml0QXJncywgY29uZmlnLmdldE9taXRJbml0aWFsaXplKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcDExID0gdG1wUEtDUzExOwogCkBAIC0zMzYsOCArMzUwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2xvdHMgd2l0aCB0b2tlbnM6ICIgKyB0b1N0cmluZyhzbG90cykpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoc2xvdElEIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHNsb3RMaXN0SW5kZXggPCAwKSB8fCAoc2xvdExpc3RJbmRleCA+PSBzbG90cy5sZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oInNsb3RMaXN0SW5kZXggaXMgIiArIHNsb3RMaXN0SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzbG90TGlzdEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc2xvdExpc3RJbmRleCA+PSBzbG90cy5sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oInNsb3RMaXN0SW5kZXggaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2xvdExpc3RJbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgdG9rZW4gb25seSBoYXMgIiArIHNsb3RzLmxlbmd0aCArICIgc2xvdHMiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzbG90SUQgPSBzbG90c1tzbG90TGlzdEluZGV4XTsKQEAgLTU3NSwxMiArNTkxLDE1IEBACiAgICAgICAgIGQoS0YsICJESCIsICAgICAgICAgICAgIFAxMURIS2V5RmFjdG9yeSwgICAgICAgIHMoIkRpZmZpZUhlbGxtYW4iKSwKICAgICAgICAgICAgICAgICBtKENLTV9ESF9QS0NTX0tFWV9QQUlSX0dFTiwgQ0tNX0RIX1BLQ1NfREVSSVZFKSk7CiAgICAgICAgIGQoS0YsICJFQyIsICAgICAgICAgICAgIFAxMURIS2V5RmFjdG9yeSwKLSAgICAgICAgICAgICAgICBtKENLTV9FQ19LRVlfUEFJUl9HRU4sIENLTV9FQ0RIMV9ERVJJVkUsIENLTV9FQ0RTQSwgQ0tNX0VDRFNBX1NIQTEpKTsKKyAgICAgICAgICAgICAgICBtKENLTV9FQ19LRVlfUEFJUl9HRU4sIENLTV9FQ0RIMV9ERVJJVkUsCisgICAgICAgICAgICAgICAgICAgIENLTV9FQ0RTQSwgQ0tNX0VDRFNBX1NIQTEpKTsKIAogICAgICAgICAvLyBBbGdvcml0aG1QYXJhbWV0ZXJzIGZvciBFQy4KICAgICAgICAgLy8gT25seSBuZWVkZWQgdW50aWwgd2UgaGF2ZSBhbiBFQyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgU1VOIHByb3ZpZGVyLgotICAgICAgICBkKEFHUCwgIkVDIiwgICAgICAgICAgICAic3VuLnNlY3VyaXR5LmVjLkVDUGFyYW1ldGVycyIsIHMoIjEuMi44NDAuMTAwNDUuMi4xIiksCi0gICAgICAgICAgICAgICAgbShDS01fRUNfS0VZX1BBSVJfR0VOLCBDS01fRUNESDFfREVSSVZFLCBDS01fRUNEU0EsIENLTV9FQ0RTQV9TSEExKSk7CisgICAgICAgIGQoQUdQLCAiRUMiLCAgICAgICAgICAgICJzdW4uc2VjdXJpdHkuZWMuRUNQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoIjEuMi44NDAuMTAwNDUuMi4xIiksCisgICAgICAgICAgICAgICAgbShDS01fRUNfS0VZX1BBSVJfR0VOLCBDS01fRUNESDFfREVSSVZFLAorICAgICAgICAgICAgICAgICAgICBDS01fRUNEU0EsIENLTV9FQ0RTQV9TSEExKSk7CiAKICAgICAgICAgZChLQSwgIkRIIiwgICAgICAgICAgICAgUDExS2V5QWdyZWVtZW50LCAgICAgICAgcygiRGlmZmllSGVsbG1hbiIpLAogICAgICAgICAgICAgICAgIG0oQ0tNX0RIX1BLQ1NfREVSSVZFKSk7CkBAIC02NTQsMTIgKzY3MywxNiBAQAogICAgICAgICBkKFNJRywgIlNIQTUxMndpdGhSU0EiLCBQMTFTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgbShDS01fU0hBNTEyX1JTQV9QS0NTLCBDS01fUlNBX1BLQ1MsIENLTV9SU0FfWF81MDkpKTsKIAotICAgICAgICBkKEtHLCAiU3VuVGxzUnNhUHJlbWFzdGVyU2VjcmV0IiwgInN1bi5zZWN1cml0eS5wa2NzMTEuUDExVGxzUnNhUHJlbWFzdGVyU2VjcmV0R2VuZXJhdG9yIiwKKyAgICAgICAgZChLRywgIlN1blRsc1JzYVByZW1hc3RlclNlY3JldCIsCisgICAgICAgICAgICAgICAgICAgICJzdW4uc2VjdXJpdHkucGtjczExLlAxMVRsc1JzYVByZW1hc3RlclNlY3JldEdlbmVyYXRvciIsCiAgICAgICAgICAgICAgICAgbShDS01fU1NMM19QUkVfTUFTVEVSX0tFWV9HRU4sIENLTV9UTFNfUFJFX01BU1RFUl9LRVlfR0VOKSk7Ci0gICAgICAgIGQoS0csICJTdW5UbHNNYXN0ZXJTZWNyZXQiLCAic3VuLnNlY3VyaXR5LnBrY3MxMS5QMTFUbHNNYXN0ZXJTZWNyZXRHZW5lcmF0b3IiLAorICAgICAgICBkKEtHLCAiU3VuVGxzTWFzdGVyU2VjcmV0IiwKKyAgICAgICAgICAgICAgICAgICAgInN1bi5zZWN1cml0eS5wa2NzMTEuUDExVGxzTWFzdGVyU2VjcmV0R2VuZXJhdG9yIiwKICAgICAgICAgICAgICAgICBtKENLTV9TU0wzX01BU1RFUl9LRVlfREVSSVZFLCBDS01fVExTX01BU1RFUl9LRVlfREVSSVZFLAotICAgICAgICAgICAgICAgICAgICBDS01fU1NMM19NQVNURVJfS0VZX0RFUklWRV9ESCwgQ0tNX1RMU19NQVNURVJfS0VZX0RFUklWRV9ESCkpOwotICAgICAgICBkKEtHLCAiU3VuVGxzS2V5TWF0ZXJpYWwiLCAic3VuLnNlY3VyaXR5LnBrY3MxMS5QMTFUbHNLZXlNYXRlcmlhbEdlbmVyYXRvciIsCisgICAgICAgICAgICAgICAgICAgIENLTV9TU0wzX01BU1RFUl9LRVlfREVSSVZFX0RILAorICAgICAgICAgICAgICAgICAgICBDS01fVExTX01BU1RFUl9LRVlfREVSSVZFX0RIKSk7CisgICAgICAgIGQoS0csICJTdW5UbHNLZXlNYXRlcmlhbCIsCisgICAgICAgICAgICAgICAgICAgICJzdW4uc2VjdXJpdHkucGtjczExLlAxMVRsc0tleU1hdGVyaWFsR2VuZXJhdG9yIiwKICAgICAgICAgICAgICAgICBtKENLTV9TU0wzX0tFWV9BTkRfTUFDX0RFUklWRSwgQ0tNX1RMU19LRVlfQU5EX01BQ19ERVJJVkUpKTsKICAgICAgICAgZChLRywgIlN1blRsc1ByZiIsICJzdW4uc2VjdXJpdHkucGtjczExLlAxMVRsc1ByZkdlbmVyYXRvciIsCiAgICAgICAgICAgICAgICAgbShDS01fVExTX1BSRiwgQ0tNX05TU19UTFNfUFJGX0dFTkVSQUwpKTsKQEAgLTc3Myw2ICs3OTYsMTMgQEAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b2tlbi50b2tlbkluZm8pOwogICAgICAgICB9CiAgICAgICAgIGxvbmdbXSBzdXBwb3J0ZWRNZWNoYW5pc21zID0gcDExLkNfR2V0TWVjaGFuaXNtTGlzdChzbG90SUQpOworCisgICAgICAgIC8vIENyZWF0ZSBhIG1hcCBmcm9tIHRoZSB2YXJpb3VzIERlc2NyaXB0b3JzIHRvIHRoZSAibW9zdAorICAgICAgICAvLyBwcmVmZXJyZWQiIG1lY2hhbmlzbSB0aGF0IHdhcyBkZWZpbmVkIGR1cmluZyB0aGUKKyAgICAgICAgLy8gc3RhdGljIGluaXRpYWxpemF0aW9uLiAgRm9yIGV4YW1wbGUsIERFUy9DQkMvUEtDUzVQYWRkaW5nCisgICAgICAgIC8vIGNvdWxkIGJlIG1hcHBlZCB0byBDS01fREVTX0NCQ19QQUQgb3IgQ0tNX0RFU19DQkMuICBQcmVmZXIKKyAgICAgICAgLy8gdGhlIGVhcmxpZXN0IGVudHJ5LiAgV2hlbiBhc2tlZCBmb3IgIkRFUy9DQkMvUEtDUzVQYWRkaW5nIiwgd2UKKyAgICAgICAgLy8gcmV0dXJuIGEgQ0tNX0RFU19DQkNfUEFELgogICAgICAgICBmaW5hbCBNYXA8RGVzY3JpcHRvcixJbnRlZ2VyPiBzdXBwb3J0ZWRBbGdzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxEZXNjcmlwdG9yLEludGVnZXI+KCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwcG9ydGVkTWVjaGFuaXNtcy5sZW5ndGg7IGkrKykgewpAQCAtODA3LDYgKzgzNyw5IEBACiAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZEFsZ3MucHV0KGQsIGludGVnZXJNZWNoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBzb21ldGhpbmcgIm1vcmUgcHJlZmVycmVkIgorICAgICAgICAgICAgICAgIC8vIHRoYW4gd2hhdCB3ZSBjdXJyZW50bHkgaGF2ZSBpbiB0aGUgc3VwcG9ydGVkQWxncworICAgICAgICAgICAgICAgIC8vIG1hcC4KICAgICAgICAgICAgICAgICBpbnQgaW50T2xkTWVjaCA9IG9sZE1lY2guaW50VmFsdWUoKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGQubWVjaGFuaXNtcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dE1lY2ggPSBkLm1lY2hhbmlzbXNbal07CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3JzYS9SU0FLZXlGYWN0b3J5LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3JzYS9SU0FLZXlGYWN0b3J5LmphdmEKaW5kZXggMTdjZThjZC4uZDg3N2YyOCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9yc2EvUlNBS2V5RmFjdG9yeS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcnNhL1JTQUtleUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMxLDYgKzMxLDggQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuKjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuKjsKIAoraW1wb3J0IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb247CisKIC8qKgogICogS2V5RmFjdG9yeSBmb3IgUlNBIGtleXMuIEtleXMgbXVzdCBiZSBpbnN0YW5jZXMgb2YgUHVibGljS2V5IG9yIFByaXZhdGVLZXkKICAqIGFuZCBnZXRBbGdvcml0aG0oKSBtdXN0IHJldHVybiAiUlNBIi4gRm9yIHN1Y2gga2V5cywgaXQgc3VwcG9ydHMgY29udmVyc2lvbgpAQCAtNjgsNiArNzAsMjQgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PiB4NTA5S2V5U3BlY0NsYXNzICA9IFg1MDlFbmNvZGVkS2V5U3BlYy5jbGFzczsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PiBwa2NzOEtleVNwZWNDbGFzcyA9IFBLQ1M4RW5jb2RlZEtleVNwZWMuY2xhc3M7CiAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNSU5fTU9ETEVOID0gNTEyOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1BWF9NT0RMRU4gPSAxNjM4NDsKKworICAgIC8qCisgICAgICogSWYgdGhlIG1vZHVsdXMgbGVuZ3RoIGlzIGFib3ZlIHRoaXMgdmFsdWUsIHJlc3RyaWN0IHRoZSBzaXplIG9mCisgICAgICogdGhlIGV4cG9uZW50IHRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWFzb25hYmx5IGNvbXB1dGVkLiAgV2UKKyAgICAgKiBjb3VsZCBzaW1wbHkgaGFyZGNvZGUgdGhlIGV4cCBsZW4gdG8gc29tZXRoaW5nIGxpa2UgNjQgYml0cywgYnV0CisgICAgICogdGhpcyBhcHByb2FjaCBhbGxvd3MgZmxleGliaWxpdHkgaW4gY2FzZSBpbXBscyB3b3VsZCBsaWtlIHRvIHVzZQorICAgICAqIGxhcmdlciBtb2R1bGUgYW5kIGV4cG9uZW50IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNQVhfTU9ETEVOX1JFU1RSSUNUX0VYUCA9IDMwNzI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1JFU1RSSUNURURfRVhQTEVOID0gNjQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlc3RyaWN0RXhwTGVuID0KKyAgICAgICAgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICBuZXcgR2V0UHJvcGVydHlBY3Rpb24oCisgICAgICAgICAgICAgICAgInN1bi5zZWN1cml0eS5yc2EucmVzdHJpY3RSU0FFeHBvbmVudCIsICJ0cnVlIikpKTsKKwogICAgIC8vIGluc3RhbmNlIHVzZWQgZm9yIHN0YXRpYyB0cmFuc2xhdGVLZXkoKTsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBSU0FLZXlGYWN0b3J5IElOU1RBTkNFID0gbmV3IFJTQUtleUZhY3RvcnkoKTsKIApAQCAtNzYsNzQgKzk2LDc5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3RhdGljIG1ldGhvZCB0byBjb252ZXJ0IEtleSBpbnRvIGEgdXNlYWJsZSBpbnN0YW5jZSBvZgotICAgICAqIFJTQVB1YmxpY0tleSBvciBSU0FQcml2YXRlKENydClLZXkuIENoZWNrIHRoZSBrZXkgYW5kIGNvbnZlcnQgaXQKLSAgICAgKiB0byBhIFN1blJzYVNpZ24ga2V5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGtleSBpcyBub3QgYW4gUlNBIGtleQotICAgICAqIG9yIGNhbm5vdCBiZSB1c2VkLCB0aHJvdyBhbiBJbnZhbGlkS2V5RXhjZXB0aW9uLgotICAgICAqCi0gICAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1ldGhvZCBhbmQgZW5naW5lVHJhbnNsYXRlS2V5KCkgaXMgdGhhdAotICAgICAqIHdlIGRvIG5vdCBjb252ZXJ0IGtleXMgb2Ygb3RoZXIgcHJvdmlkZXJzIHRoYXQgYXJlIGFscmVhZHkgYW4KLSAgICAgKiBpbnN0YW5jZSBvZiBSU0FQdWJsaWNLZXkgb3IgUlNBUHJpdmF0ZShDcnQpS2V5LgorICAgICAqIFN0YXRpYyBtZXRob2QgdG8gY29udmVydCBLZXkgaW50byBhbiBpbnN0YW5jZSBvZiBSU0FQdWJsaWNLZXlJbXBsCisgICAgICogb3IgUlNBUHJpdmF0ZShDcnQpS2V5SW1wbC4gSWYgdGhlIGtleSBpcyBub3QgYW4gUlNBIGtleSBvciBjYW5ub3QgYmUKKyAgICAgKiB1c2VkLCB0aHJvdyBhbiBJbnZhbGlkS2V5RXhjZXB0aW9uLgogICAgICAqCiAgICAgICogVXNlZCBieSBSU0FTaWduYXR1cmUgYW5kIFJTQUNpcGhlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFJTQUtleSB0b1JTQUtleShLZXkga2V5KSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBSU0FLZXkpIHsKLSAgICAgICAgICAgIFJTQUtleSByc2FLZXkgPSAoUlNBS2V5KWtleTsKLSAgICAgICAgICAgIGNoZWNrS2V5KHJzYUtleSk7Ci0gICAgICAgICAgICByZXR1cm4gcnNhS2V5OworICAgICAgICBpZiAoKGtleSBpbnN0YW5jZW9mIFJTQVByaXZhdGVLZXlJbXBsKSB8fAorICAgICAgICAgICAgKGtleSBpbnN0YW5jZW9mIFJTQVByaXZhdGVDcnRLZXlJbXBsKSB8fAorICAgICAgICAgICAgKGtleSBpbnN0YW5jZW9mIFJTQVB1YmxpY0tleUltcGwpKSB7CisgICAgICAgICAgICByZXR1cm4gKFJTQUtleSlrZXk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gKFJTQUtleSlJTlNUQU5DRS5lbmdpbmVUcmFuc2xhdGVLZXkoa2V5KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIENoZWNrIHRoYXQgdGhlIGdpdmVuIFJTQSBrZXkgaXMgdmFsaWQuCisgICAgLyoKKyAgICAgKiBTaW5nbGUgdGVzdCBlbnRyeSBwb2ludCBmb3IgYWxsIG9mIHRoZSBtZWNoYW5pc21zIGluIHRoZSBTdW5Sc2FTaWduCisgICAgICogcHJvdmlkZXIgKFJTQSpLZXlJbXBscykuICBBbGwgb2YgdGhlIHRlc3RzIGFyZSB0aGUgc2FtZS4KKyAgICAgKgorICAgICAqIEZvciBjb21wYXRpYmlsaXR5LCB3ZSByb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBieXRlIGhlcmU6CisgICAgICogc29tZSBLZXkgaW1wbHMgbWlnaHQgcGFzcyBpbiBhIHZhbHVlIHdpdGhpbiBhIGJ5dGUgb2YgdGhlCisgICAgICogcmVhbCB2YWx1ZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrS2V5KFJTQUtleSBrZXkpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gY2hlY2sgZm9yIHN1YmludGVyZmFjZXMsIG9taXQgYWRkaXRpb25hbCBjaGVja3MgZm9yIG91ciBrZXlzCi0gICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBSU0FQdWJsaWNLZXkpIHsKLSAgICAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBSU0FQdWJsaWNLZXlJbXBsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIFJTQVByaXZhdGVLZXkpIHsKLSAgICAgICAgICAgIGlmICgoa2V5IGluc3RhbmNlb2YgUlNBUHJpdmF0ZUNydEtleUltcGwpCi0gICAgICAgICAgICAgICAgICAgIHx8IChrZXkgaW5zdGFuY2VvZiBSU0FQcml2YXRlS2V5SW1wbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiTmVpdGhlciBhIHB1YmxpYyBub3IgYSBwcml2YXRlIGtleSIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJTQUtleSBkb2VzIG5vdCBleHRlbmQgS2V5LCBzbyB3ZSBuZWVkIHRvIGRvIGEgY2FzdAotICAgICAgICBTdHJpbmcga2V5QWxnID0gKChLZXkpa2V5KS5nZXRBbGdvcml0aG0oKTsKLSAgICAgICAgaWYgKGtleUFsZy5lcXVhbHMoIlJTQSIpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiTm90IGFuIFJTQSBrZXk6ICIgKyBrZXlBbGcpOwotICAgICAgICB9Ci0gICAgICAgIEJpZ0ludGVnZXIgbW9kdWx1czsKLSAgICAgICAgLy8gc29tZSBwcm92aWRlcnMgaW1wbGVtZW50IFJTQUtleSBmb3Iga2V5cyB3aGVyZSB0aGUgdmFsdWVzIGFyZQotICAgICAgICAvLyBub3QgYWNjZXNzaWJsZSAoYWx0aG91Z2ggdGhleSBzaG91bGQpLiBEZXRlY3QgdGhvc2UgaGVyZQotICAgICAgICAvLyBmb3IgYSBtb3JlIGdyYWNlZnVsIGZhaWx1cmUuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtb2R1bHVzID0ga2V5LmdldE1vZHVsdXMoKTsKLSAgICAgICAgICAgIGlmIChtb2R1bHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigiTW9kdWx1cyBpcyBtaXNzaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tLZXlMZW5ndGgobW9kdWx1cyk7CisgICAgc3RhdGljIHZvaWQgY2hlY2tSU0FQcm92aWRlcktleUxlbmd0aHMoaW50IG1vZHVsdXNMZW4sIEJpZ0ludGVnZXIgZXhwb25lbnQpCisgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrS2V5TGVuZ3RocygoKG1vZHVsdXNMZW4gKyA3KSAmIH43KSwgZXhwb25lbnQsCisgICAgICAgICAgICBSU0FLZXlGYWN0b3J5Lk1JTl9NT0RMRU4sIEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bHVzIG9mIGFuIFJTQSBrZXkuIFdlIG9ubHkgc3VwcG9ydCBrZXlzCi0gICAgICogYXQgbGVhc3QgNTA1IGJpdHMgbG9uZy4KKyAgICAgKiBDaGVjayB0aGUgbGVuZ3RoIG9mIGFuIFJTQSBrZXkgbW9kdWx1cy9leHBvbmVudCB0byBtYWtlIHN1cmUgaXQKKyAgICAgKiBpcyBub3QgdG9vIHNob3J0IG9yIGxvbmcuICBTb21lIGltcGxzIGhhdmUgdGhlaXIgb3duIG1pbiBhbmQKKyAgICAgKiBtYXgga2V5IHNpemVzIHRoYXQgbWF5IG9yIG1heSBub3QgbWF0Y2ggd2l0aCBhIHN5c3RlbSBkZWZpbmVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG1vZHVsdXNMZW4gdGhlIGJpdCBsZW5ndGggb2YgdGhlIFJTQSBtb2R1bHVzLgorICAgICAqIEBwYXJhbSBleHBvbmVudCB0aGUgUlNBIGV4cG9uZW50CisgICAgICogQHBhcmFtIG1pbk1vZHVsdXNMZW4gaWYgPiAwLCBjaGVjayB0byBzZWUgaWYgbW9kdWx1c0xlbiBpcyBhdAorICAgICAqICAgICAgICBsZWFzdCB0aGlzIGxvbmcsIG90aGVyd2lzZSB1bnVzZWQuCisgICAgICogQHBhcmFtIG1heE1vZHVsdXNMZW4gY2FsbGVyIHdpbGwgYWxsb3cgdGhpcyBtYXggbnVtYmVyIG9mIGJpdHMuCisgICAgICogICAgICAgIEFsbG93IHRoZSBzbWFsbGVyIG9mIHRoZSBzeXN0ZW0tZGVmaW5lZCBtYXhpbXVtIGFuZCB0aGlzIHBhcmFtLgorICAgICAqCisgICAgICogQHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgdmFsdWVzIGFyZSB1bmFjY2VwdGFibGUuCiAgICAgICovCi0gICAgc3RhdGljIHZvaWQgY2hlY2tLZXlMZW5ndGgoQmlnSW50ZWdlciBtb2R1bHVzKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtb2R1bHVzLmJpdExlbmd0aCgpIDwgNTA1KSB7Ci0gICAgICAgICAgICAvLyBzb21lIHByb3ZpZGVycyBtYXkgZ2VuZXJhdGUgc2xpZ2h0bHkgc2hvcnRlciBrZXlzCi0gICAgICAgICAgICAvLyBhY2NlcHQgdGhlbSBpZiB0aGUgZW5jb2RpbmcgaXMgYXQgbGVhc3QgNjQgYnl0ZXMgbG9uZwotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXlFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAoIlJTQSBrZXlzIG11c3QgYmUgYXQgbGVhc3QgNTEyIGJpdHMgbG9uZyIpOworICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tLZXlMZW5ndGhzKGludCBtb2R1bHVzTGVuLCBCaWdJbnRlZ2VyIGV4cG9uZW50LAorICAgICAgICAgICAgaW50IG1pbk1vZHVsdXNMZW4sIGludCBtYXhNb2R1bHVzTGVuKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKChtaW5Nb2R1bHVzTGVuID4gMCkgJiYgKG1vZHVsdXNMZW4gPCAobWluTW9kdWx1c0xlbikpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbiggIlJTQSBrZXlzIG11c3QgYmUgYXQgbGVhc3QgIiArCisgICAgICAgICAgICAgICAgbWluTW9kdWx1c0xlbiArICIgYml0cyBsb25nIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBFdmVuIHRob3VnaCBvdXIgcG9saWN5IGZpbGUgbWF5IGFsbG93IHRoaXMsIHdlIGRvbid0IHdhbnQKKyAgICAgICAgLy8gZWl0aGVyIHZhbHVlIChtb2QvZXhwKSB0byBiZSB0b28gYmlnLgorCisgICAgICAgIGludCBtYXhMZW4gPSBNYXRoLm1pbihtYXhNb2R1bHVzTGVuLCBNQVhfTU9ETEVOKTsKKworICAgICAgICAvLyBJZiBhIFJTQVByaXZhdGVLZXkvUlNBUHVibGljS2V5LCBtYWtlIHN1cmUgdGhlCisgICAgICAgIC8vIG1vZHVsdXMgbGVuIGlzbid0IHRvbyBiaWcuCisgICAgICAgIGlmIChtb2R1bHVzTGVuID4gbWF4TGVuKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiUlNBIGtleXMgbXVzdCBiZSBubyBsb25nZXIgdGhhbiAiICsgbWF4TGVuICsgIiBiaXRzIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBhIFJTQVB1YmxpY0tleSwgbWFrZSBzdXJlIHRoZSBleHBvbmVudCBpc24ndCB0b28gYmlnLgorICAgICAgICBpZiAocmVzdHJpY3RFeHBMZW4gJiYgKGV4cG9uZW50ICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgKG1vZHVsdXNMZW4gPiBNQVhfTU9ETEVOX1JFU1RSSUNUX0VYUCkgJiYKKyAgICAgICAgICAgICAgICAoZXhwb25lbnQuYml0TGVuZ3RoKCkgPiBNQVhfUkVTVFJJQ1RFRF9FWFBMRU4pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiUlNBIGV4cG9uZW50cyBjYW4gYmUgbm8gbG9uZ2VyIHRoYW4gIiArCisgICAgICAgICAgICAgICAgTUFYX1JFU1RSSUNURURfRVhQTEVOICsgIiBiaXRzICIgKworICAgICAgICAgICAgICAgICIgaWYgbW9kdWx1cyBpcyBncmVhdGVyIHRoYW4gIiArCisgICAgICAgICAgICAgICAgTUFYX01PRExFTl9SRVNUUklDVF9FWFAgKyAiIGJpdHMiKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9yc2EvUlNBS2V5UGFpckdlbmVyYXRvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9yc2EvUlNBS2V5UGFpckdlbmVyYXRvci5qYXZhCmluZGV4IGY4MDBkZWMuLjI4OThhM2QgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcnNhL1JTQUtleVBhaXJHZW5lcmF0b3IuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3JzYS9SU0FLZXlQYWlyR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDMtMjAwNCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDMtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgLy8gcHVibGljIGV4cG9uZW50IHRvIHVzZQogICAgIHByaXZhdGUgQmlnSW50ZWdlciBwdWJsaWNFeHBvbmVudDsKIAotICAgIC8vIHNpemUgb2YgdGhlIGtleSB0byBnZW5lcmF0ZSwgPj0gNTEyCisgICAgLy8gc2l6ZSBvZiB0aGUga2V5IHRvIGdlbmVyYXRlLCA+PSBSU0FLZXlGYWN0b3J5Lk1JTl9NT0RMRU4KICAgICBwcml2YXRlIGludCBrZXlTaXplOwogCiAgICAgLy8gUFJORyB0byB1c2UKQEAgLTYwLDE1ICs2MCwxNiBAQAogCiAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJhdG9yLiBTZWUgSkNBIGRvYwogICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoaW50IGtleVNpemUsIFNlY3VyZVJhbmRvbSByYW5kb20pIHsKLSAgICAgICAgaWYgKGtleVNpemUgPCA1MTIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgKCJLZXkgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDUxMiBiaXRzIik7CisKKyAgICAgICAgLy8gZG8gbm90IGFsbG93IHVucmVhc29uYWJseSBzbWFsbCBvciBsYXJnZSBrZXkgc2l6ZXMsCisgICAgICAgIC8vIHByb2JhYmx5IHVzZXIgZXJyb3IKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGhzKGtleVNpemUsIFJTQUtleUdlblBhcmFtZXRlclNwZWMuRjQsCisgICAgICAgICAgICAgICAgNTEyLCA2NCAqIDEwMjQpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoa2V5U2l6ZSA+IDY0ICogMTAyNCkgewotICAgICAgICAgICAgLy8gZG8gbm90IGFsbG93IHVucmVhc29uYWJseSBsYXJnZSBrZXkgc2l6ZXMsIHByb2JhYmx5IHVzZXIgZXJyb3IKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgKCJLZXkgc2l6ZSBtdXN0IGJlIDY1NTM2IGJpdHMgb3IgbGVzcyIpOwotICAgICAgICB9CisKICAgICAgICAgdGhpcy5rZXlTaXplID0ga2V5U2l6ZTsKICAgICAgICAgdGhpcy5yYW5kb20gPSByYW5kb207CiAgICAgICAgIHRoaXMucHVibGljRXhwb25lbnQgPSBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjLkY0OwpAQCAtNzcsMzUgKzc4LDQxIEBACiAgICAgLy8gc2Vjb25kIGluaXRpYWxpemUgbWV0aG9kLiBTZWUgSkNBIGRvYy4KICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLCBTZWN1cmVSYW5kb20gcmFuZG9tKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24geworCiAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjID09IGZhbHNlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICgiUGFyYW1zIG11c3QgYmUgaW5zdGFuY2Ugb2YgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyIpOwogICAgICAgICB9CisKICAgICAgICAgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyByc2FTcGVjID0gKFJTQUtleUdlblBhcmFtZXRlclNwZWMpcGFyYW1zOwotICAgICAgICBrZXlTaXplID0gcnNhU3BlYy5nZXRLZXlzaXplKCk7Ci0gICAgICAgIHB1YmxpY0V4cG9uZW50ID0gcnNhU3BlYy5nZXRQdWJsaWNFeHBvbmVudCgpOwotICAgICAgICB0aGlzLnJhbmRvbSA9IHJhbmRvbTsKLSAgICAgICAgaWYgKGtleVNpemUgPCA1MTIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgKCJLZXkgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDUxMiBiaXRzIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtleVNpemUgPiA2NCAqIDEwMjQpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBhbGxvdyB1bnJlYXNvbmFibHkgbGFyZ2Uga2V5IHNpemVzLCBwcm9iYWJseSB1c2VyIGVycm9yCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICgiS2V5IHNpemUgbXVzdCBiZSA2NTUzNiBiaXRzIG9yIGxlc3MiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHVibGljRXhwb25lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcHVibGljRXhwb25lbnQgPSBSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjLkY0OworICAgICAgICBpbnQgdG1wS2V5U2l6ZSA9IHJzYVNwZWMuZ2V0S2V5c2l6ZSgpOworICAgICAgICBCaWdJbnRlZ2VyIHRtcFB1YmxpY0V4cG9uZW50ID0gcnNhU3BlYy5nZXRQdWJsaWNFeHBvbmVudCgpOworCisgICAgICAgIGlmICh0bXBQdWJsaWNFeHBvbmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0bXBQdWJsaWNFeHBvbmVudCA9IFJTQUtleUdlblBhcmFtZXRlclNwZWMuRjQ7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocHVibGljRXhwb25lbnQuY29tcGFyZVRvKFJTQUtleUdlblBhcmFtZXRlclNwZWMuRjApIDwgMCkgeworICAgICAgICAgICAgaWYgKHRtcFB1YmxpY0V4cG9uZW50LmNvbXBhcmVUbyhSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjLkYwKSA8IDApIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgKCJQdWJsaWMgZXhwb25lbnQgbXVzdCBiZSAzIG9yIGxhcmdlciIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHB1YmxpY0V4cG9uZW50LmJpdExlbmd0aCgpID4ga2V5U2l6ZSkgeworICAgICAgICAgICAgaWYgKHRtcFB1YmxpY0V4cG9uZW50LmJpdExlbmd0aCgpID4gdG1wS2V5U2l6ZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAoIlB1YmxpYyBleHBvbmVudCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBrZXkgc2l6ZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gZG8gbm90IGFsbG93IHVucmVhc29uYWJseSBsYXJnZSBrZXkgc2l6ZXMsIHByb2JhYmx5IHVzZXIgZXJyb3IKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGhzKHRtcEtleVNpemUsIHRtcFB1YmxpY0V4cG9uZW50LAorICAgICAgICAgICAgICAgIDUxMiwgNjQgKiAxMDI0KTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBrZXkgc2l6ZXMiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMua2V5U2l6ZSA9IHRtcEtleVNpemU7CisgICAgICAgIHRoaXMucHVibGljRXhwb25lbnQgPSB0bXBQdWJsaWNFeHBvbmVudDsKKyAgICAgICAgdGhpcy5yYW5kb20gPSByYW5kb207CiAgICAgfQogCiAgICAgLy8gZ2VuZXJhdGUgdGhlIGtleXBhaXIuIFNlZSBKQ0EgZG9jCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3JzYS9SU0FQcml2YXRlQ3J0S2V5SW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9yc2EvUlNBUHJpdmF0ZUNydEtleUltcGwuamF2YQppbmRleCBhYzI5NmI0Li42NDA5NzJhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3JzYS9SU0FQcml2YXRlQ3J0S2V5SW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcnNhL1JTQVByaXZhdGVDcnRLZXlJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDMtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC04OSw3ICs4OSw3IEBACiAgICAgICovCiAgICAgUlNBUHJpdmF0ZUNydEtleUltcGwoYnl0ZVtdIGVuY29kZWQpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uIHsKICAgICAgICAgZGVjb2RlKGVuY29kZWQpOwotICAgICAgICBSU0FLZXlGYWN0b3J5LmNoZWNrS2V5TGVuZ3RoKG4pOworICAgICAgICBSU0FLZXlGYWN0b3J5LmNoZWNrUlNBUHJvdmlkZXJLZXlMZW5ndGhzKG4uYml0TGVuZ3RoKCksIGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA3LDcgKzEwNyw4IEBACiAgICAgICAgIHRoaXMucGUgPSBwZTsKICAgICAgICAgdGhpcy5xZSA9IHFlOwogICAgICAgICB0aGlzLmNvZWZmID0gY29lZmY7Ci0gICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGgobik7CisgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tSU0FQcm92aWRlcktleUxlbmd0aHMobi5iaXRMZW5ndGgoKSwgZSk7CisKICAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIGVuY29kaW5nCiAgICAgICAgIGFsZ2lkID0gcnNhSWQ7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3JzYS9SU0FQcml2YXRlS2V5SW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9yc2EvUlNBUHJpdmF0ZUtleUltcGwuamF2YQppbmRleCAxZjg4M2Y0Li44NjBlNzcwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3JzYS9SU0FQcml2YXRlS2V5SW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcnNhL1JTQVByaXZhdGVLZXlJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAzLTIwMDggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjEsNyArNjEsNyBAQAogICAgIFJTQVByaXZhdGVLZXlJbXBsKEJpZ0ludGVnZXIgbiwgQmlnSW50ZWdlciBkKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMubiA9IG47CiAgICAgICAgIHRoaXMuZCA9IGQ7Ci0gICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGgobik7CisgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tSU0FQcm92aWRlcktleUxlbmd0aHMobi5iaXRMZW5ndGgoKSwgbnVsbCk7CiAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBlbmNvZGluZwogICAgICAgICBhbGdpZCA9IFJTQVByaXZhdGVDcnRLZXlJbXBsLnJzYUlkOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9yc2EvUlNBUHVibGljS2V5SW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9yc2EvUlNBUHVibGljS2V5SW1wbC5qYXZhCmluZGV4IGM1MDBjYTIuLjZkYjA4ZjYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcnNhL1JTQVB1YmxpY0tleUltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3JzYS9SU0FQdWJsaWNLZXlJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDMtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01NiwxMCArNTYsMTEgQEAKICAgICAgKiBDb25zdHJ1Y3QgYSBrZXkgZnJvbSBpdHMgY29tcG9uZW50cy4gVXNlZCBieSB0aGUKICAgICAgKiBSU0FLZXlGYWN0b3J5IGFuZCB0aGUgUlNBS2V5UGFpckdlbmVyYXRvci4KICAgICAgKi8KLSAgICBwdWJsaWMgUlNBUHVibGljS2V5SW1wbChCaWdJbnRlZ2VyIG4sIEJpZ0ludGVnZXIgZSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24geworICAgIHB1YmxpYyBSU0FQdWJsaWNLZXlJbXBsKEJpZ0ludGVnZXIgbiwgQmlnSW50ZWdlciBlKQorICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewogICAgICAgICB0aGlzLm4gPSBuOwogICAgICAgICB0aGlzLmUgPSBlOwotICAgICAgICBSU0FLZXlGYWN0b3J5LmNoZWNrS2V5TGVuZ3RoKG4pOworICAgICAgICBSU0FLZXlGYWN0b3J5LmNoZWNrUlNBUHJvdmlkZXJLZXlMZW5ndGhzKG4uYml0TGVuZ3RoKCksIGUpOwogICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgZW5jb2RpbmcKICAgICAgICAgYWxnaWQgPSBSU0FQcml2YXRlQ3J0S2V5SW1wbC5yc2FJZDsKICAgICAgICAgdHJ5IHsKQEAgLTgwLDcgKzgxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUlNBUHVibGljS2V5SW1wbChieXRlW10gZW5jb2RlZCkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24gewogICAgICAgICBkZWNvZGUoZW5jb2RlZCk7Ci0gICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGgobik7CisgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tSU0FQcm92aWRlcktleUxlbmd0aHMobi5iaXRMZW5ndGgoKSwgZSk7CiAgICAgfQogCiAgICAgLy8gc2VlIEpDQSBkb2MKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9PYmplY3RJZGVudGlmaWVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvT2JqZWN0SWRlbnRpZmllci5qYXZhCmluZGV4IDJhZDA0YzAuLjcxN2U1YmMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9PYmplY3RJZGVudGlmaWVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL09iamVjdElkZW50aWZpZXIuamF2YQpAQCAtMjYsNyArMjYsOCBAQAogcGFja2FnZSBzdW4uc2VjdXJpdHkudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKLQoraW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIC8qKgogICogUmVwcmVzZW50IGFuIElTTyBPYmplY3QgSWRlbnRpZmllci4KQEAgLTQ0LDEwNSArNDUsMTg2IEBACiAgKiBoaWVyYXJjaHksIGFuZCBvdGhlciBvcmdhbml6YXRpb25zIGNhbiBlYXNpbHkgYWNxdWlyZSB0aGUgYWJpbGl0eQogICogdG8gYXNzaWduIHN1Y2ggdW5pcXVlIGlkZW50aWZpZXJzLgogICoKLSAqCiAgKiBAYXV0aG9yIERhdmlkIEJyb3duZWxsCiAgKiBAYXV0aG9yIEFtaXQgS2Fwb29yCiAgKiBAYXV0aG9yIEhlbW1hIFByYWZ1bGxjaGFuZHJhCiAgKi8KKwogZmluYWwgcHVibGljCiBjbGFzcyBPYmplY3RJZGVudGlmaWVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlCiB7Ci0gICAgLyoqIHVzZSBzZXJpYWxWZXJzaW9uVUlEIGZyb20gSkRLIDEuMS4gZm9yIGludGVyb3BlcmFiaWxpdHkgKi8KKyAgICAvKioKKyAgICAgKiBXZSB1c2UgdGhlIERFUiB2YWx1ZSAobm8gdGFnLCBubyBsZW5ndGgpIGFzIHRoZSBpbnRlcm5hbCBmb3JtYXQKKyAgICAgKiBAc2VyaWFsCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlW10gZW5jb2RpbmcgPSBudWxsOworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgU3RyaW5nIHN0cmluZ0Zvcm07CisKKyAgICAvKgorICAgICAqIElNUE9SVEFOVCBOT1RFUyBGT1IgQ09ERSBDSEFOR0VTIChidWcgNDgxMTk2OCkgSU4gSkRLIDEuNy4wCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKgorICAgICAqIChBbG1vc3QpIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9uczoKKyAgICAgKgorICAgICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgdW5jaGFuZ2VkLiBPbGQgZmllbGQgImNvbXBvbmVudCIgaXMgY2hhbmdlZCB0bworICAgICAqIHR5cGUgT2JqZWN0IHNvIHRoYXQgInBvaXNvbiIgKHVua25vd24gb2JqZWN0IHR5cGUgZm9yIG9sZCB2ZXJzaW9ucykKKyAgICAgKiBjYW4gYmUgcHV0IGluc2lkZSBpZiB0aGVyZSBhcmUgaHVnZSBjb21wb25lbnRzIHRoYXQgY2Fubm90IGJlIHNhdmVkCisgICAgICogYXMgaW50ZWdlcnMuCisgICAgICoKKyAgICAgKiBOZXcgdmVyc2lvbiB1c2UgdGhlIG5ldyBmaWxlZCAiZW5jb2RpbmciIG9ubHkuCisgICAgICoKKyAgICAgKiBCZWxvdyBhcmUgYWxsIDQgY2FzZXMgaW4gYSBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBwcm9jZXNzOgorICAgICAqCisgICAgICogMS4gb2xkIC0+IG9sZDogTm90IGNvdmVyZWQgaGVyZQorICAgICAqIDIuIG9sZCAtPiBuZXc6IFRoZXJlJ3Mgbm8gImVuY29kaW5nIiBmaWVsZCwgbmV3IHJlYWRPYmplY3QoKSByZWFkcworICAgICAqICAgICJjb21wb25lbnRzIiBhbmQgImNvbXBvbmVudExlbiIgaW5zdGVhZCBhbmQgaW5pdHMgY29ycmVjdGx5LgorICAgICAqIDMuIG5ldyAtPiBuZXc6ICJlbmNvZGluZyIgZmllbGQgZXhpc3RzLCBuZXcgcmVhZE9iamVjdCgpIHVzZXMgaXQKKyAgICAgKiAgICAoaWdub3JpbmcgdGhlIG90aGVyIDIgZmllbGRzKSBhbmQgaW5pdHMgY29ycmVjdGx5LgorICAgICAqIDQuIG5ldyAtPiBvbGQ6IG9sZCByZWFkT2JqZWN0KCkgb25seSByZWNvZ25pemVzICJjb21wb25lbnRzIiBhbmQKKyAgICAgKiAgICAiY29tcG9uZW50TGVuIiBmaWVsZHMuIElmIG5vIGh1Z2UgY29tcG9uZW50cyBhcmUgaW52b2x2ZWQsIHRoZXkKKyAgICAgKiAgICBhcmUgc2VyaWFsaXplZCBhcyBsZWdhbCB2YWx1ZXMgYW5kIG9sZCBvYmplY3QgY2FuIGluaXQgY29ycmVjdGx5LgorICAgICAqICAgIE90aGVyd2lzZSwgb2xkIG9iamVjdCBjYW5ub3QgcmVjb2duaXplIHRoZSBmb3JtIChjb21wb25lbnQgbm90IGludFtdKQorICAgICAqICAgIGFuZCB0aHJvdyBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24gYXQgZGVzZXJpYWxpemF0aW9uIHRpbWUuCisgICAgICoKKyAgICAgKiBUaGVyZm9yZSwgZm9yIHRoZSBmaXJzdCAzIGNhc2VzLCBleGFjdCBjb21wYXRpYmlsaXR5IGlzIHByZXNlcnZlZC4gSW4KKyAgICAgKiB0aGUgNHRoIGNhc2UsIG5vbi1odWdlIE9JRCBpcyBzdGlsbCBzdXBwb3J0YWJsZSBpbiBvbGQgdmVyc2lvbnMsIHdoaWxlCisgICAgICogaHVnZSBPSUQgaXMgbm90LgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg2OTcwMzAyMzg4NjAxODEyOTRMOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtYXhGaXJzdENvbXBvbmVudCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1heFNlY29uZENvbXBvbmVudCA9IDM5OwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgaWRlbnRpZmllciBmcm9tIGEgc3RyaW5nLiAgVGhpcyBzdHJpbmcKLSAgICAgKiBzaG91bGQgYmUgb2YgdGhlIGZvcm0gMS4yMy4zNC40NS41NiBldGMuCisgICAgICogQ2hhbmdlZCB0byBPYmplY3QKKyAgICAgKiBAc2VyaWFsCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgICAgICBjb21wb25lbnRzICAgPSBudWxsOyAgICAgICAgICAvLyBwYXRoIGZyb20gcm9vdAorICAgIC8qKgorICAgICAqIEBzZXJpYWwKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCAgICAgICAgIGNvbXBvbmVudExlbiA9IC0xOyAgICAgICAgICAgIC8vIGhvdyBtdWNoIGlzIHVzZWQuCisKKyAgICAvLyBJcyB0aGUgY29tcG9uZW50cyBmaWVsZCBjYWxjdWxhdGVkPworICAgIHRyYW5zaWVudCBwcml2YXRlIGJvb2xlYW4gICBjb21wb25lbnRzQ2FsY3VsYXRlZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaXMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpcy5kZWZhdWx0UmVhZE9iamVjdCgpOworCisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7ICAvLyBmcm9tIGFuIG9sZCB2ZXJzaW9uCisgICAgICAgICAgICBpbml0KChpbnRbXSljb21wb25lbnRzLCBjb21wb25lbnRMZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghY29tcG9uZW50c0NhbGN1bGF0ZWQpIHsKKyAgICAgICAgICAgIGludFtdIGNvbXBzID0gdG9JbnRBcnJheSgpOworICAgICAgICAgICAgaWYgKGNvbXBzICE9IG51bGwpIHsgICAgLy8gZXZlcnkgb25lIHVuZGVyc3RhbmRzIHRoaXMKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzID0gY29tcHM7CisgICAgICAgICAgICAgICAgY29tcG9uZW50TGVuID0gY29tcHMubGVuZ3RoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzID0gSHVnZU9pZE5vdFN1cHBvcnRlZEJ5T2xkSkRLLnRoZU9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBvbmVudHNDYWxjdWxhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBvcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgSHVnZU9pZE5vdFN1cHBvcnRlZEJ5T2xkSkRLIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgICAgIHN0YXRpYyBIdWdlT2lkTm90U3VwcG9ydGVkQnlPbGRKREsgdGhlT25lID0gbmV3IEh1Z2VPaWROb3RTdXBwb3J0ZWRCeU9sZEpESygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMsIGZyb20gYSBzdHJpbmcuICBUaGlzIHN0cmluZyBzaG91bGQgYmUgb2YgdGhlIGZvcm0gMS4yMy41Ni4KKyAgICAgKiBWYWxpZGl0eSBjaGVjayBpbmNsdWRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0SWRlbnRpZmllciAoU3RyaW5nIG9pZCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpbnQgY2ggPSAnLic7Ci0gICAgICAgIGludCAgICAgc3RhcnQgPSAwOworICAgICAgICBpbnQgc3RhcnQgPSAwOwogICAgICAgICBpbnQgZW5kID0gMDsKIAotICAgICAgICAvLyBDYWxjdWxhdGUgbGVuZ3RoIG9mIG9pZAotICAgICAgICBjb21wb25lbnRMZW4gPSAwOwotICAgICAgICB3aGlsZSAoKGVuZCA9IG9pZC5pbmRleE9mKGNoLHN0YXJ0KSkgIT0gLTEpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICAgICAgICAgIGNvbXBvbmVudExlbiArPSAxOwotICAgICAgICB9Ci0gICAgICAgIGNvbXBvbmVudExlbiArPSAxOwotICAgICAgICBjb21wb25lbnRzID0gbmV3IGludFtjb21wb25lbnRMZW5dOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlW29pZC5sZW5ndGgoKV07CisgICAgICAgIGludCBmaXJzdCA9IDAsIHNlY29uZDsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKIAotICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgU3RyaW5nIGNvbXAgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKChlbmQgPSBvaWQuaW5kZXhPZihjaCxzdGFydCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgY29tcCA9IG9pZC5zdWJzdHJpbmcoc3RhcnQsZW5kKTsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzW2krK10gPSBJbnRlZ2VyLnZhbHVlT2YoY29tcCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBjb21wID0gbnVsbDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsgLy8gbGVuZ3RoIG9mIG9uZSBzZWN0aW9uCisgICAgICAgICAgICAgICAgZW5kID0gb2lkLmluZGV4T2YoY2gsc3RhcnQpOworICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcCA9IG9pZC5zdWJzdHJpbmcoc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBvaWQubGVuZ3RoKCkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb21wID0gb2lkLnN1YnN0cmluZyhzdGFydCxlbmQpOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gOSkgeworICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGJpZ251bSA9IG5ldyBCaWdJbnRlZ2VyKGNvbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tGaXJzdENvbXBvbmVudChiaWdudW0pOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBiaWdudW0uaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTZWNvbmRDb21wb25lbnQoZmlyc3QsIGJpZ251bSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnbnVtID0gYmlnbnVtLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoNDAqZmlyc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tPdGhlckNvbXBvbmVudChjb3VudCwgYmlnbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBwYWNrN09pZChiaWdudW0sIHRtcCwgcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBudW0gPSBJbnRlZ2VyLnBhcnNlSW50KGNvbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tGaXJzdENvbXBvbmVudChudW0pOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBudW07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU2Vjb25kQ29tcG9uZW50KGZpcnN0LCBudW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSArPSA0MCAqIGZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja090aGVyQ29tcG9uZW50KGNvdW50LCBudW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IHBhY2s3T2lkKG51bSwgdG1wLCBwb3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbXAgPSBvaWQuc3Vic3RyaW5nKHN0YXJ0KTsKLSAgICAgICAgICAgIGNvbXBvbmVudHNbaV0gPSBJbnRlZ2VyLnZhbHVlT2YoY29tcCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfSB3aGlsZSAoZW5kICE9IC0xKTsKKworICAgICAgICAgICAgY2hlY2tDb3VudChjb3VudCk7CisgICAgICAgICAgICBlbmNvZGluZyA9IG5ldyBieXRlW3Bvc107CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRtcCwgMCwgZW5jb2RpbmcsIDAsIHBvcyk7CisgICAgICAgICAgICB0aGlzLnN0cmluZ0Zvcm0gPSBvaWQ7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeyAvLyBhbHJlYWR5IGRldGVjdGVkIGJ5IGNoZWNrWFhYCisgICAgICAgICAgICB0aHJvdyBpb2U7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk9iamVjdElkZW50aWZpZXIoKSAtLSBJbnZhbGlkIGZvcm1hdDogIgogICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSwgZSk7CiAgICAgICAgIH0KLSAgICAgICAgY2hlY2tWYWxpZE9pZChjb21wb25lbnRzLCBjb21wb25lbnRMZW4pOwotICAgICAgICB0aGlzLnN0cmluZ0Zvcm0gPSBvaWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhlIHZhbHVlcyBtYWtlIGEgbGVnYWwgT0lELiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IDIKLSAgICAgKiBjb21wb25lbnRzIGFuZCB0aGV5IG11c3QgYmUgYWxsIG5vbi1uZWdhdGl2ZS4gVGhlIGZpcnN0IGNvbXBvbmVudAotICAgICAqIHNob3VsZCBiZSAwLDEgb3IgMi4gV2hlbiB0aGUgZmlyc3QgY29tcG9uZW50IGlzIDAgb3IgMSwgdGhlCi0gICAgICogc2Vjb25kIGNvbXBvbmVudCBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBjb21wb25lbnRzIHRoYXQgd2lsbCBtYWtlIHRoZSBPSUQKLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0byBjaGVjay4gTm90ZSB0aGF0IHRoZSBhbGxvY2F0aW9uCi0gICAgICogICAgICAgIHNpemUgb2YgPGNvZGU+dmFsdWVzPC9jb2RlPiBtYXkgYmUgbG9uZ2VyIHRoYW4gPGNvZGU+bGVuPC9jb2RlPi4KLSAgICAgKiAgICAgICAgSW4gdGhpcyBjYXNlLCBvbmx5IHRoZSBmaXJzdCA8Y29kZT5sZW48L2NvZGU+IGl0ZW1zIGFyZSBjaGVja2VkLgotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSBsZWdhbCBPSUQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tWYWxpZE9pZChpbnRbXSB2YWx1ZXMsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCBsZW4gPCAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk9iamVjdElkZW50aWZpZXIoKSAtLSAiICsKLSAgICAgICAgICAgICAgICAgICAgIk11c3QgYmUgYXQgbGVhc3QgdHdvIG9pZCBjb21wb25lbnRzICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWVzW2ldIDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT2JqZWN0SWRlbnRpZmllcigpIC0tICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm9pZCBjb21wb25lbnQgIyIgKyAoaSsxKSArICIgbXVzdCBiZSBub24tbmVnYXRpdmUgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWVzWzBdID4gbWF4Rmlyc3RDb21wb25lbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT2JqZWN0SWRlbnRpZmllcigpIC0tICIgKwotICAgICAgICAgICAgICAgICAgICAiRmlyc3Qgb2lkIGNvbXBvbmVudCBpcyBpbnZhbGlkICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlc1swXSA8IDIgJiYgdmFsdWVzWzFdID4gbWF4U2Vjb25kQ29tcG9uZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk9iamVjdElkZW50aWZpZXIoKSAtLSAiICsKLSAgICAgICAgICAgICAgICAgICAgIlNlY29uZCBvaWQgY29tcG9uZW50IGlzIGludmFsaWQgIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgSUQgZnJvbSBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIFRoaXMKLSAgICAgKiBpcyB1c2VkIHRvIGNvbnN0cnVjdCBjb25zdGFudCBvYmplY3QgSURzLgorICAgICAqIENvbnN0cnVjdG9yLCBmcm9tIGFuIGFycmF5IG9mIGludGVnZXJzLgorICAgICAqIFZhbGlkaXR5IGNoZWNrIGluY2x1ZGVkLgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3RJZGVudGlmaWVyIChpbnQgdmFsdWVzIFtdKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGNoZWNrVmFsaWRPaWQodmFsdWVzLCB2YWx1ZXMubGVuZ3RoKTsKLSAgICAgICAgY29tcG9uZW50cyA9IHZhbHVlcy5jbG9uZSgpOwotICAgICAgICBjb21wb25lbnRMZW4gPSB2YWx1ZXMubGVuZ3RoOworICAgICAgICBjaGVja0NvdW50KHZhbHVlcy5sZW5ndGgpOworICAgICAgICBjaGVja0ZpcnN0Q29tcG9uZW50KHZhbHVlc1swXSk7CisgICAgICAgIGNoZWNrU2Vjb25kQ29tcG9uZW50KHZhbHVlc1swXSwgdmFsdWVzWzFdKTsKKyAgICAgICAgZm9yIChpbnQgaT0yOyBpPHZhbHVlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNoZWNrT3RoZXJDb21wb25lbnQoaSwgdmFsdWVzW2ldKTsKKyAgICAgICAgaW5pdCh2YWx1ZXMsIHZhbHVlcy5sZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gb2JqZWN0IElEIGZyb20gYW4gQVNOLjEgZW5jb2RlZCBpbnB1dCBzdHJlYW0uCisgICAgICogQ29uc3RydWN0b3IsIGZyb20gYW4gQVNOLjEgZW5jb2RlZCBpbnB1dCBzdHJlYW0uCisgICAgICogVmFsaWRpdHkgY2hlY2sgTk9UIGluY2x1ZGVkLgogICAgICAqIFRoZSBlbmNvZGluZyBvZiB0aGUgSUQgaW4gdGhlIHN0cmVhbSB1c2VzICJERVIiLCBhIEJFUi8xIHN1YnNldC4KICAgICAgKiBJbiB0aGlzIGNhc2UsIHRoYXQgbWVhbnMgYSB0cmlwbGUgeyB0eXBlSWQsIGxlbmd0aCwgZGF0YSB9LgogICAgICAqCkBAIC0xNTIsOCArMjM0LDcgQEAKICAgICAgKiBAcGFyYW0gaW4gREVSLWVuY29kZWQgZGF0YSBob2xkaW5nIGFuIG9iamVjdCBJRAogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaW5kaWNhdGVzIGEgZGVjb2RpbmcgZXJyb3IKICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0SWRlbnRpZmllciAoRGVySW5wdXRTdHJlYW0gaW4pCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHB1YmxpYyBPYmplY3RJZGVudGlmaWVyIChEZXJJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBieXRlICAgIHR5cGVfaWQ7CiAgICAgICAgIGludCAgICAgYnVmZmVyRW5kOwpAQCAtMTc0LDIxNSArMjU1LDY3IEBACiAgICAgICAgICAgICAgICAgKyAiICh0YWcgPSAiICsgIHR5cGVfaWQgKyAiKSIKICAgICAgICAgICAgICAgICApOwogCi0gICAgICAgIGJ1ZmZlckVuZCA9IGluLmF2YWlsYWJsZSAoKSAtIGluLmdldExlbmd0aCAoKSAtIDE7Ci0gICAgICAgIGlmIChidWZmZXJFbmQgPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uICgKLSAgICAgICAgICAgICAgICAiT2JqZWN0SWRlbnRpZmllcigpIC0tIG5vdCBlbm91Z2ggZGF0YSIpOwotCi0gICAgICAgIGluaXRGcm9tRW5jb2RpbmcgKGluLCBidWZmZXJFbmQpOworICAgICAgICBlbmNvZGluZyA9IG5ldyBieXRlW2luLmdldExlbmd0aCgpXTsKKyAgICAgICAgaW4uZ2V0Qnl0ZXMoZW5jb2RpbmcpOworICAgICAgICBjaGVjayhlbmNvZGluZyk7CiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBCdWlsZCB0aGUgT0lEIGZyb20gdGhlIHJlc3Qgb2YgYSBERVIgaW5wdXQgYnVmZmVyOyB0aGUgdGFnCi0gICAgICogYW5kIGxlbmd0aCBoYXZlIGJlZW4gcmVtb3ZlZC92ZXJpZmllZAorICAgICAqIENvbnN0cnVjdG9yLCBmcm9tIHRoZSByZXN0IG9mIGEgREVSIGlucHV0IGJ1ZmZlcjsKKyAgICAgKiB0aGUgdGFnIGFuZCBsZW5ndGggaGF2ZSBiZWVuIHJlbW92ZWQvdmVyaWZpZWQKKyAgICAgKiBWYWxpZGl0eSBjaGVjayBOT1QgaW5jbHVkZWQuCiAgICAgICovCiAgICAgT2JqZWN0SWRlbnRpZmllciAoRGVySW5wdXRCdWZmZXIgYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGluaXRGcm9tRW5jb2RpbmcgKG5ldyBEZXJJbnB1dFN0cmVhbSAoYnVmKSwgMCk7CisgICAgICAgIERlcklucHV0U3RyZWFtIGluID0gbmV3IERlcklucHV0U3RyZWFtKGJ1Zik7CisgICAgICAgIGVuY29kaW5nID0gbmV3IGJ5dGVbaW4uYXZhaWxhYmxlKCldOworICAgICAgICBpbi5nZXRCeXRlcyhlbmNvZGluZyk7CisgICAgICAgIGNoZWNrKGVuY29kaW5nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChpbnRbXSBjb21wb25lbnRzLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbbGVuZ3RoKjUrMV07ICAvLyArMSBmb3IgZW1wdHkgaW5wdXQKKworICAgICAgICBpZiAoY29tcG9uZW50c1sxXSA8IEludGVnZXIuTUFYX1ZBTFVFIC0gY29tcG9uZW50c1swXSo0MCkKKyAgICAgICAgICAgIHBvcyArPSBwYWNrN09pZChjb21wb25lbnRzWzBdKjQwK2NvbXBvbmVudHNbMV0sIHRtcCwgcG9zKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIGJpZyA9IEJpZ0ludGVnZXIudmFsdWVPZihjb21wb25lbnRzWzFdKTsKKyAgICAgICAgICAgIGJpZyA9IGJpZy5hZGQoQmlnSW50ZWdlci52YWx1ZU9mKGNvbXBvbmVudHNbMF0qNDApKTsKKyAgICAgICAgICAgIHBvcyArPSBwYWNrN09pZChiaWcsIHRtcCwgcG9zKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGk9MjsgaTxsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcG9zICs9IHBhY2s3T2lkKGNvbXBvbmVudHNbaV0sIHRtcCwgcG9zKTsKKyAgICAgICAgfQorICAgICAgICBlbmNvZGluZyA9IG5ldyBieXRlW3Bvc107CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCBlbmNvZGluZywgMCwgcG9zKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgbmV3SW50ZXJuYWwoKS4gRHVtbXkgYXJndW1lbnQKLSAgICAgKiB0byBhdm9pZCBjbGFzaCB3aXRoIHRoZSBwdWJsaWMgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3RJZGVudGlmaWVyKGludFtdIGNvbXBvbmVudHMsIGJvb2xlYW4gZHVtbXkpIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50czsKLSAgICAgICAgdGhpcy5jb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0SWRlbnRpZmllciBmb3IgaW50ZXJuYWwgdXNlLiBUaGUgdmFsdWVzIGFyZQorICAgICAqIFRoaXMgbWV0aG9kIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gVGhlIG5ldyBpbXBsZW1lbnRhdGlvbgorICAgICAqIGRvZXMgdGhlIGNoZWNrIGFuZCBjb252ZXJzaW9uLiBBbGwgYXJvdW5kIHRoZSBKREssIHRoZSBtZXRob2QgaXMgY2FsbGVkCisgICAgICogaW4gc3RhdGljIGJsb2NrcyB0byBpbml0aWFsaXplIHByZS1kZWZpbmVkIE9iamVjdElkZW50aWZpZWllcy4gTm8KKyAgICAgKiBvYnZpb3VzIHBlcmZvcm1hbmNlIGh1cnQgd2lsbCBiZSBtYWRlIGFmdGVyIHRoaXMgY2hhbmdlLgorICAgICAqCisgICAgICogT2xkIGRvYzogQ3JlYXRlIGEgbmV3IE9iamVjdElkZW50aWZpZXIgZm9yIGludGVybmFsIHVzZS4gVGhlIHZhbHVlcyBhcmUKICAgICAgKiBuZWl0aGVyIGNoZWNrZWQgbm9yIGNsb25lZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE9iamVjdElkZW50aWZpZXIgbmV3SW50ZXJuYWwoaW50W10gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SWRlbnRpZmllcih2YWx1ZXMsIHRydWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSGVscGVyIGZ1bmN0aW9uIC0tIGdldCB0aGUgT0lEIGZyb20gYSBzdHJlYW0sIGFmdGVyIHRhZyBhbmQKLSAgICAgKiBsZW5ndGggYXJlIHZlcmlmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0RnJvbUVuY29kaW5nIChEZXJJbnB1dFN0cmVhbSBpbiwgaW50IGJ1ZmZlckVuZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE5vdyBnZXQgdGhlIGNvbXBvbmVudHMgKCJzdWIgSURzIikgb25lIGF0IGEgdGltZS4gIFdlIGZpbGwgYQotICAgICAgICAgKiB0ZW1wb3JhcnkgYnVmZmVyLCByZXNpemluZyBpdCBhcyBuZWVkZWQuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgICAgICAgICAgICAgY29tcG9uZW50OwotICAgICAgICBib29sZWFuICAgICAgICAgZmlyc3Rfc3ViaWQgPSB0cnVlOwotCi0gICAgICAgIGZvciAoY29tcG9uZW50cyA9IG5ldyBpbnQgW2FsbG9jYXRpb25RdWFudHVtXSwgY29tcG9uZW50TGVuID0gMDsKLSAgICAgICAgICAgICAgICBpbi5hdmFpbGFibGUgKCkgPiBidWZmZXJFbmQ7Ci0gICAgICAgICkgewotICAgICAgICAgICAgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50IChpbik7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50IDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk9iamVjdElkZW50aWZpZXIoKSAtLSAiICsKLSAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudCB2YWx1ZXMgbXVzdCBiZSBub25uZWdhdGl2ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpcnN0X3N1YmlkKSB7Ci0gICAgICAgICAgICAgICAgaW50ICAgICBYLCBZOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBOT1RFOiAgdGhlIGFsbG9jYXRpb24gcXVhbnR1bSBpcyBsYXJnZSBlbm91Z2ggdGhhdCB3ZSBrbm93Ci0gICAgICAgICAgICAgICAgICogd2UgZG9uJ3QgaGF2ZSB0byByZWFsbG9jYXRlIGhlcmUhCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA8IDQwKQotICAgICAgICAgICAgICAgICAgICBYID0gMDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQgPCA4MCkKLSAgICAgICAgICAgICAgICAgICAgWCA9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBYID0gMjsKLSAgICAgICAgICAgICAgICBZID0gY29tcG9uZW50IC0gKCBYICogNDApOwotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgWzBdID0gWDsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzIFsxXSA9IFk7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50TGVuID0gMjsKLQotICAgICAgICAgICAgICAgIGZpcnN0X3N1YmlkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIE90aGVyIGNvbXBvbmVudHMgYXJlIGVuY29kZWQgbGVzcyBleG90aWNhbGx5LiAgVGhlIG9ubHkKLSAgICAgICAgICAgICAgICAgKiBwb3RlbnRpYWwgdHJvdWJsZSBpcyB0aGUgbmVlZCB0byBncm93IHRoZSBhcnJheS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50TGVuID49IGNvbXBvbmVudHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHRtcF9jb21wb25lbnRzIFtdOwotCi0gICAgICAgICAgICAgICAgICAgIHRtcF9jb21wb25lbnRzID0gbmV3IGludCBbY29tcG9uZW50cy5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFsbG9jYXRpb25RdWFudHVtXTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSAoY29tcG9uZW50cywgMCwgdG1wX2NvbXBvbmVudHMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzID0gdG1wX2NvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgW2NvbXBvbmVudExlbisrXSA9IGNvbXBvbmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNoZWNrVmFsaWRPaWQoY29tcG9uZW50cywgY29tcG9uZW50TGVuKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBGaW5hbCBzYW5pdHkgY2hlY2sgLS0gaWYgd2UgZGlkbid0IHVzZSBleGFjdGx5IHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICogc3BlY2lmaWVkLCBzb21ldGhpbmcncyBxdWl0ZSB3cm9uZy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChpbi5hdmFpbGFibGUgKCkgIT0gYnVmZmVyRW5kKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24gKAotICAgICAgICAgICAgICAgICAgICAiT2JqZWN0SWRlbnRpZmllcigpIC0tIG1hbGZvcm1lZCBpbnB1dCBkYXRhIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdElkZW50aWZpZXIodmFsdWVzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLCBpbnRlcm5hbCBjYWxscyBhbHdheXMgdXNlcyBsZWdhbCB2YWx1ZXMuCiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qCiAgICAgICogbi5iLiB0aGUgb25seSBwdWJsaWMgaW50ZXJmYWNlIGlzIERlck91dHB1dFN0cmVhbS5wdXRPSUQoKQogICAgICAqLwogICAgIHZvaWQgZW5jb2RlIChEZXJPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIERlck91dHB1dFN0cmVhbSBieXRlcyA9IG5ldyBEZXJPdXRwdXRTdHJlYW0gKCk7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIC8vIEFjY29yZGluZyB0byBJU08gWC42NjAsIHdoZW4gdGhlIDFzdCBjb21wb25lbnQgaXMgMCBvciAxLCB0aGUgMm5kCi0gICAgICAgIC8vIGNvbXBvbmVudCBpcyByZXN0cmljdGVkIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzOSwgdGh1cyBtYWtlCi0gICAgICAgIC8vIGl0IHNtYWxsIGVub3VnaCB0byBiZSBlbmNvZGVkIGludG8gb25lIHNpbmdsZSBieXRlLgotICAgICAgICBpZiAoY29tcG9uZW50c1swXSA8IDIpIHsKLSAgICAgICAgICAgIGJ5dGVzLndyaXRlICgoY29tcG9uZW50cyBbMF0gKiA0MCkgKyBjb21wb25lbnRzIFsxXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwdXRDb21wb25lbnQoYnl0ZXMsIChjb21wb25lbnRzIFswXSAqIDQwKSArIGNvbXBvbmVudHMgWzFdKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAyOyBpIDwgY29tcG9uZW50TGVuOyBpKyspCi0gICAgICAgICAgICBwdXRDb21wb25lbnQgKGJ5dGVzLCBjb21wb25lbnRzIFtpXSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTm93IHRoYXQgd2UndmUgY29uc3RydWN0ZWQgdGhlIGNvbXBvbmVudCwgZW5jb2RlCi0gICAgICAgICAqIGl0IGluIHRoZSBzdHJlYW0gd2Ugd2VyZSBnaXZlbi4KLSAgICAgICAgICovCi0gICAgICAgIG91dC53cml0ZSAoRGVyVmFsdWUudGFnX09iamVjdElkLCBieXRlcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUcmlja3kgT0lEIGNvbXBvbmVudCBwYXJzaW5nIHRlY2huaXF1ZSAuLi4gbm90ZSB0aGF0IG9uZSBiaXQKLSAgICAgKiBwZXIgb2N0ZXQgaXMgbG9zdCwgdGhpcyByZXR1cm5zIGF0IG1vc3QgMjggYml0cyBvZiBjb21wb25lbnQuCi0gICAgICogQWxzbywgbm90aWNlIHRoaXMgcGFyc2VzIGluIGJpZy1lbmRpYW4gZm9ybWF0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRDb21wb25lbnQgKERlcklucHV0U3RyZWFtIGluKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IHJldHZhbCwgaSwgdG1wOwotCi0gICAgICAgIGZvciAoaSA9IDAsIHJldHZhbCA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIHJldHZhbCA8PD0gNzsKLSAgICAgICAgICAgIHRtcCA9IGluLmdldEJ5dGUgKCk7Ci0gICAgICAgICAgICByZXR2YWwgfD0gKHRtcCAmIDB4MDdmKTsKLSAgICAgICAgICAgIGlmICgodG1wICYgMHgwODApID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbiAoIk9iamVjdElkZW50aWZpZXIoKSAtLSBjb21wb25lbnQgdmFsdWUgdG9vIGJpZyIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV2ZXJzZSBvZiB0aGUgYWJvdmUgcm91dGluZS4gIE5vdGljZSBpdCBuZWVkcyB0byBlbWl0IGluCi0gICAgICogYmlnLWVuZGlhbiBmb3JtLCBzbyBpdCBidWZmZXJzIHRoZSBvdXRwdXQgdW50aWwgaXQncyByZWFkeS4KLSAgICAgKiAoTWluaW11bSBsZW5ndGggZW5jb2RpbmcgaXMgYSBERVIgcmVxdWlyZW1lbnQuKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0Q29tcG9uZW50IChEZXJPdXRwdXRTdHJlYW0gb3V0LCBpbnQgdmFsKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICAvLyBUT0RPOiB2YWwgbXVzdCBiZSA8MTI4KjEyOCoxMjgqMTI4IGhlcmUsIG90aGVyd2lzZSwgNCBieXRlcyBpcyBub3QKLSAgICAgICAgLy8gZW5vdWdoIHRvIGhvbGQgaXQuIFdpbGwgYWRkcmVzcyB0aGlzIGxhdGVyLgotICAgICAgICBieXRlICAgIGJ1ZiBbXSA9IG5ldyBieXRlIFs0XSA7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgYnVmIFtpXSA9IChieXRlKSAodmFsICYgMHgwN2YpOwotICAgICAgICAgICAgdmFsID4+Pj0gNzsKLSAgICAgICAgICAgIGlmICh2YWwgPT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCA7IGkgPiAwOyAtLWkpCi0gICAgICAgICAgICBvdXQud3JpdGUgKGJ1ZiBbaV0gfCAweDA4MCk7Ci0gICAgICAgIG91dC53cml0ZSAoYnVmIFswXSk7Ci0gICAgfQotCi0gICAgLy8gWFhYIHRoaXMgQVBJIHNob3VsZCBwcm9iYWJseSBmYWNpbGl0YXRlIHRoZSBKREsgc29ydCB1dGlsaXR5Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIGlkZW50aWZpZXIgd2l0aCBhbm90aGVyLCBmb3Igc29ydGluZyBwdXJwb3Nlcy4KLSAgICAgKiBBbiBpZGVudGlmaWVyIGRvZXMgbm90IHByZWNlZGUgaXRzZWxmLgotICAgICAqCi0gICAgICogQHBhcmFtIG90aGVyIGlkZW50aWZlciB0aGF0IG1heSBwcmVjZWRlIHRoaXMgb25lLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgPGVtPm90aGVyPC9lbT4gcHJlY2VkZXMgdGhpcyBvbmUKLSAgICAgKiAgICAgICAgICBpbiBhIHBhcnRpY3VsYXIgc29ydGluZyBvcmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwcmVjZWRlcyAoT2JqZWN0SWRlbnRpZmllciBvdGhlcikKLSAgICB7Ci0gICAgICAgIGludCAgICAgICAgICAgICBpOwotCi0gICAgICAgIC8vIHNob3J0ZXIgSURzIGdvIGZpcnN0Ci0gICAgICAgIGlmIChvdGhlciA9PSB0aGlzIHx8IGNvbXBvbmVudExlbiA8IG90aGVyLmNvbXBvbmVudExlbikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKG90aGVyLmNvbXBvbmVudExlbiA8IGNvbXBvbmVudExlbikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIC8vIGZvciBlYWNoIGNvbXBvbmVudCwgdGhlIGxlc3NlciBjb21wb25lbnQgZ29lcyBmaXJzdAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50TGVuOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChvdGhlci5jb21wb25lbnRzIFtpXSA8IGNvbXBvbmVudHMgW2ldKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWRlbnRpY2FsIElEcyBkb24ndCBwcmVjZWRlIGVhY2ggb3RoZXIKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBvdXQud3JpdGUgKERlclZhbHVlLnRhZ19PYmplY3RJZCwgZW5jb2RpbmcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzk4LDYgKzMzMSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIGlmICh0aGlzID09IG9iaikgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC00MDYsMjMgKzM0MCw3MSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIE9iamVjdElkZW50aWZpZXIgb3RoZXIgPSAoT2JqZWN0SWRlbnRpZmllcilvYmo7Ci0gICAgICAgIGlmIChjb21wb25lbnRMZW4gIT0gb3RoZXIuY29tcG9uZW50TGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRMZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGNvbXBvbmVudHNbaV0gIT0gb3RoZXIuY29tcG9uZW50c1tpXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoZW5jb2RpbmcsIG90aGVyLmVuY29kaW5nKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaCA9IGNvbXBvbmVudExlbjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRMZW47IGkrKykgewotICAgICAgICAgICAgaCArPSBjb21wb25lbnRzW2ldICogMzc7CisgICAgICAgIHJldHVybiBBcnJheXMuaGFzaENvZGUoZW5jb2RpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaXZhdGUgaGVscGVyIG1ldGhvZCBmb3Igc2VyaWFsaXphdGlvbi4gVG8gYmUgY29tcGF0aWJsZSB3aXRoIG9sZAorICAgICAqIHZlcnNpb25zIG9mIEpESy4KKyAgICAgKiBAcmV0dXJuIGNvbXBvbmVudHMgaW4gYW4gaW50IGFycmF5LCBpZiBhbGwgdGhlIGNvbXBvbmVudHMgYXJlIGxlc3MgdGhhbgorICAgICAqICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUuIE90aGVyd2lzZSwgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludFtdIHRvSW50QXJyYXkoKSB7CisgICAgICAgIGludCBsZW5ndGggPSBlbmNvZGluZy5sZW5ndGg7CisgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbMjBdOworICAgICAgICBpbnQgd2hpY2ggPSAwOworICAgICAgICBpbnQgZnJvbVBvcyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoZW5jb2RpbmdbaV0gJiAweDgwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gb25lIHNlY3Rpb24gW2Zyb21Qb3MuLmldCisgICAgICAgICAgICAgICAgaWYgKGkgLSBmcm9tUG9zICsgMSA+IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBiaWcgPSBuZXcgQmlnSW50ZWdlcihwYWNrKGVuY29kaW5nLCBmcm9tUG9zLCBpLWZyb21Qb3MrMSwgNywgOCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbd2hpY2grK10gPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBzZWNvbmQgPSBiaWcuc3VidHJhY3QoQmlnSW50ZWdlci52YWx1ZU9mKDgwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUpKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3aGljaCsrXSA9IHNlY29uZC5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpZy5jb21wYXJlVG8oQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKSkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbd2hpY2grK10gPSBiaWcuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gZnJvbVBvczsgaiA8PSBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA8PD0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgdG1wID0gZW5jb2Rpbmdbal07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgfD0gKHRtcCAmIDB4MDdmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsIDwgODApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbd2hpY2grK10gPSByZXR2YWwgLyA0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbd2hpY2grK10gPSByZXR2YWwgJSA0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3doaWNoKytdID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbd2hpY2grK10gPSByZXR2YWwgLSA4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3aGljaCsrXSA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcm9tUG9zID0gaSsxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdoaWNoID49IHJlc3VsdC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBcnJheXMuY29weU9mKHJlc3VsdCwgd2hpY2ggKyAxMCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGg7CisgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKHJlc3VsdCwgd2hpY2gpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDMxLDE1ICs0MTMsNTIgQEAKICAgICAgKiB1c2VyLWZyaWVuZGx5IGRlc2NyaXB0aXZlIHN0cmluZ3MsIHNpbmNlIHRob3NlIHN0cmluZ3MKICAgICAgKiB3aWxsIG5vdCBiZSB1bmRlcnN0b29kIGV2ZXJ5d2hlcmUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIHMgPSBzdHJpbmdGb3JtOwogICAgICAgICBpZiAocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbXBvbmVudExlbiAqIDQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRMZW47IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcuJyk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gZW5jb2RpbmcubGVuZ3RoOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKiA0KTsKKworICAgICAgICAgICAgaW50IGZyb21Qb3MgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoZW5jb2RpbmdbaV0gJiAweDgwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBzZWN0aW9uIFtmcm9tUG9zLi5pXQorICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVBvcyAhPSAwKSB7ICAvLyBub3QgdGhlIGZpcnN0IHNlZ21lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpIC0gZnJvbVBvcyArIDEgPiA0KSB7IC8vIG1heWJlIGJpZyBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGJpZyA9IG5ldyBCaWdJbnRlZ2VyKHBhY2soZW5jb2RpbmcsIGZyb21Qb3MsIGktZnJvbVBvcysxLCA3LCA4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3Qgc2VjdGlvbiBlbmNvZGVkIHdpdGggbW9yZSB0aGFuIDQgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAyLnNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiMi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYmlnLnN1YnRyYWN0KEJpZ0ludGVnZXIudmFsdWVPZig4MCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHNtYWxsIGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGZyb21Qb3M7IGogPD0gaTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsIDw8PSA3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgdG1wID0gZW5jb2Rpbmdbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsIHw9ICh0bXAgJiAweDA3Zik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA8IDgwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXR2YWwvNDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy4nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJldHZhbCU0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIyLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmV0dmFsIC0gODApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJvbVBvcyA9IGkrMTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNvbXBvbmVudHNbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcyA9IHNiLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBzdHJpbmdGb3JtID0gczsKQEAgLTQ0NywxNSArNDY2LDE5NyBAQAogICAgICAgICByZXR1cm4gczsKICAgICB9CiAKLSAgICAvKgotICAgICAqIFRvIHNpbXBsaWZ5LCB3ZSBhc3N1bWUgbm8gaW5kaXZpZHVhbCBjb21wb25lbnQgb2YgYW4gb2JqZWN0IElEIGlzCi0gICAgICogbGFyZ2VyIHRoYW4gMzIgYml0cy4gIFRoZW4gd2UgcmVwcmVzZW50IHRoZSBwYXRoIGZyb20gdGhlIHJvb3QgYXMKLSAgICAgKiBhbiBhcnJheSB0aGF0J3MgKHVzdWFsbHkpIG9ubHkgZmlsbGVkIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgLyoqCisgICAgICogUmVwYWNrIGFsbCBiaXRzIGZyb20gaW5wdXQgdG8gb3V0cHV0LiBPbiB0aGUgYm90aCBzaWRlcywgb25seSBhIHBvcnRpb24KKyAgICAgKiAoZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0KSBvZiB0aGUgOCBiaXRzIGluIGEgYnl0ZSBpcyB1c2VkLiBUaGlzCisgICAgICogbnVtYmVyIGlzIGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiB1c2VmdWwgYml0cyAoTlVCKSBmb3IgdGhlIGFycmF5LiBBbGwgdGhlCisgICAgICogdXNlZCBiaXRzIGZyb20gdGhlIGlucHV0IGJ5dGUgYXJyYXkgYW5kIHJlcGFja2VkIGludG8gdGhlIG91dHB1dCBpbiB0aGUKKyAgICAgKiBleGFjdGx5IHNhbWUgb3JkZXIuIFRoZSBvdXRwdXQgYml0cyBhcmUgYWxpZ25lZCBzbyB0aGF0IHRoZSBmaW5hbCBiaXQgb2YKKyAgICAgKiB0aGUgaW5wdXQgKHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIGxhc3QgYnl0ZSksIHdoZW4gcmVwYWNrZWQgYXMKKyAgICAgKiB0aGUgZmluYWwgYml0IG9mIHRoZSBvdXRwdXQsIGlzIHN0aWxsIGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwb3NpdGlvbi4KKyAgICAgKiBaZXJvZXMgd2lsbCBiZSBwYWRkZWQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZmlyc3Qgb3V0cHV0IGJ5dGUgaWYKKyAgICAgKiBuZWNlc3NhcnkuIEFsbCB1bnVzZWQgYml0cyBpbiB0aGUgb3V0cHV0IGFyZSBhbHNvIHplcm9lZC4KKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlOiBpZiB0aGUgaW5wdXQgaXMgMDEwMDExMDAgd2l0aCBOVUIgOCwgdGhlIG91dHB1dCB3aGljaAorICAgICAqIGhhcyBhIE5VQiA2IHdpbGwgbG9vayBsaWtlOgorICAgICAqICAgICAgMDAwMDAwMDEgMDAwMDExMDAKKyAgICAgKiBUaGUgZmlyc3QgMiBiaXRzIG9mIHRoZSBvdXRwdXQgYnl0ZXMgYXJlIHVudXNlZCBiaXRzLiBUaGUgb3RoZXIgYml0cworICAgICAqIHR1cm4gb3V0IHRvIGJlIDAwMDAwMSAwMDExMDAuIFdoaWxlIHRoZSA4IGJpdHMgb24gdGhlIHJpZ2h0IGFyZSBmcm9tCisgICAgICogdGhlIGlucHV0LCB0aGUgbGVmdCA0IHplcm9lcyBhcmUgcGFkZGVkIHRvIGZpbGwgdGhlIDYgYml0cyBzcGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiAgICAgICAgdGhlIGlucHV0IGJ5dGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gaW9mZnNldCAgIHN0YXJ0IHBvaW50IGluc2lkZSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKiBAcGFyYW0gaWxlbmd0aCAgIG51bWJlciBvZiBieXRlcyB0byByZXBhY2sKKyAgICAgKiBAcGFyYW0gaXcgICAgICAgIE5VQiBmb3IgaW5wdXQKKyAgICAgKiBAcGFyYW0gb3cgICAgICAgIE5VQiBmb3Igb3V0cHV0CisgICAgICogQHJldHVybiAgICAgICAgICB0aGUgcmVwYWNrZWQgYnl0ZXMKICAgICAgKi8KLSAgICBwcml2YXRlIGludCAgICAgICAgIGNvbXBvbmVudHMgW107ICAgICAgICAgICAgICAgICAgLy8gcGF0aCBmcm9tIHJvb3QKLSAgICBwcml2YXRlIGludCAgICAgICAgIGNvbXBvbmVudExlbjsgICAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggaXMgdXNlZC4KKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gcGFjayhieXRlW10gaW4sIGludCBpb2Zmc2V0LCBpbnQgaWxlbmd0aCwgaW50IGl3LCBpbnQgb3cpIHsKKyAgICAgICAgYXNzZXJ0IChpdyA+IDAgJiYgaXcgPD0gOCk6ICJpbnB1dCBOVUIgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDgiOworICAgICAgICBhc3NlcnQgKG93ID4gMCAmJiBvdyA8PSA4KTogIm91dHB1dCBOVUIgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDgiOwogCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgU3RyaW5nIHN0cmluZ0Zvcm07CisgICAgICAgIGlmIChpdyA9PSBvdykgeworICAgICAgICAgICAgcmV0dXJuIGluLmNsb25lKCk7CisgICAgICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBhbGxvY2F0aW9uUXVhbnR1bSA9IDU7ICAgICAvLyA+PSAyCisgICAgICAgIGludCBiaXRzID0gaWxlbmd0aCAqIGl3OyAgICAvLyBudW1iZXIgb2YgYWxsIHVzZWQgYml0cworICAgICAgICBieXRlW10gb3V0ID0gbmV3IGJ5dGVbKGJpdHMrb3ctMSkvb3ddOworCisgICAgICAgIC8vIHN0YXJ0aW5nIGZyb20gdGhlIDB0aCBiaXQgaW4gdGhlIGlucHV0CisgICAgICAgIGludCBpcG9zID0gMDsKKworICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgMCdzIG5lZWRlZCBpbiB0aGUgb3V0cHV0LCBza2lwIHRoZW0KKyAgICAgICAgaW50IG9wb3MgPSAoYml0cytvdy0xKS9vdypvdy1iaXRzOworCisgICAgICAgIHdoaWxlKGlwb3MgPCBiaXRzKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBpdyAtIGlwb3MlaXc7ICAgLy8gdW5wYWNrZWQgYml0cyBpbiBjdXJyZW50IGlucHV0IGJ5dGUKKyAgICAgICAgICAgIGlmIChjb3VudCA+IG93IC0gb3BvcyVvdykgeyAvLyBmcmVlIHNwYWNlIGF2YWlsYWJsZSBpbiBvdXRwdXQgYnl0ZQorICAgICAgICAgICAgICAgIGNvdW50ID0gb3cgLSBvcG9zJW93OyAgIC8vIGNob29zZSB0aGUgc21hbGxlciBudW1iZXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFuZCBtb3ZlIHRoZW0hCisgICAgICAgICAgICBvdXRbb3Bvcy9vd10gfD0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzdGUhCisgICAgICAgICAgICAgICAgKCgoaW5baW9mZnNldCtpcG9zL2l3XSsyNTYpICAgICAgICAgLy8gbG9jYXRlIHRoZSBieXRlICgrMjU2IHNvIHRoYXQgaXQncyBuZXZlciBuZWdhdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKGl3LWlwb3MlaXctY291bnQpKSAgICAgICAgICAvLyBtb3ZlIHRvIHRoZSBlbmQgb2YgYSBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAmICgoMSA8PCAoY291bnQpKS0xKSkgICAgICAgLy8gemVybyBvdXQgYWxsIG90aGVyIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAob3ctb3BvcyVvdy1jb3VudCk7ICAvLyBtb3ZlIHRvIHRoZSBvdXRwdXQgcG9zaXRpb24KKyAgICAgICAgICAgIGlwb3MgKz0gY291bnQ7ICAvLyBhZHZhbmNlCisgICAgICAgICAgICBvcG9zICs9IGNvdW50OyAgLy8gYWR2YW5jZQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwYWNrIGZyb20gTlVCIDggdG8gYSBOVUIgNyBPSUQgc3ViLWlkZW50aWZpZXIsIHJlbW92ZSBhbGwKKyAgICAgKiB1bm5lY2Vzc2FyeSAwIGhlYWRpbmdzLCBzZXQgdGhlIGZpcnN0IGJpdCBvZiBhbGwgbm9uLXRhaWwKKyAgICAgKiBvdXRwdXQgYnl0ZXMgdG8gMSAoYXMgSVRVLVQgUmVjLiBYLjY5MCA4LjE5LjIgc2F5cyksIGFuZAorICAgICAqIHBhc3RlIGl0IGludG8gYW4gZXhpc3RpbmcgYnl0ZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBleGlzdGluZyBhcnJheSB0byBiZSBwYXN0ZWQgaW50bworICAgICAqIEBwYXJhbSBvb2Zmc2V0IHRoZSBzdGFydGluZyBwb3NpdGlvbiB0byBwYXN0ZQorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBwYXN0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFjazdPaWQoYnl0ZVtdIGluLCBpbnQgaW9mZnNldCwgaW50IGlsZW5ndGgsIGJ5dGVbXSBvdXQsIGludCBvb2Zmc2V0KSB7CisgICAgICAgIGJ5dGVbXSBwYWNrID0gcGFjayhpbiwgaW9mZnNldCwgaWxlbmd0aCwgOCwgNyk7CisgICAgICAgIGludCBmaXJzdE5vblplcm8gPSBwYWNrLmxlbmd0aC0xOyAgIC8vIHBhc3RlIGF0IGxlYXN0IG9uZSBieXRlCisgICAgICAgIGZvciAoaW50IGk9cGFjay5sZW5ndGgtMjsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICBpZiAocGFja1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmlyc3ROb25aZXJvID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhY2tbaV0gfD0gMHg4MDsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhY2ssIGZpcnN0Tm9uWmVybywgb3V0LCBvb2Zmc2V0LCBwYWNrLmxlbmd0aC1maXJzdE5vblplcm8pOworICAgICAgICByZXR1cm4gcGFjay5sZW5ndGgtZmlyc3ROb25aZXJvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGFjayBmcm9tIE5VQiA3IHRvIE5VQiA4LCByZW1vdmUgYWxsIHVubmVjZXNzYXJ5IDAKKyAgICAgKiBoZWFkaW5ncywgYW5kIHBhc3RlIGl0IGludG8gYW4gZXhpc3RpbmcgYnl0ZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBleGlzdGluZyBhcnJheSB0byBiZSBwYXN0ZWQgaW50bworICAgICAqIEBwYXJhbSBvb2Zmc2V0IHRoZSBzdGFydGluZyBwb3NpdGlvbiB0byBwYXN0ZQorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBwYXN0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFjazgoYnl0ZVtdIGluLCBpbnQgaW9mZnNldCwgaW50IGlsZW5ndGgsIGJ5dGVbXSBvdXQsIGludCBvb2Zmc2V0KSB7CisgICAgICAgIGJ5dGVbXSBwYWNrID0gcGFjayhpbiwgaW9mZnNldCwgaWxlbmd0aCwgNywgOCk7CisgICAgICAgIGludCBmaXJzdE5vblplcm8gPSBwYWNrLmxlbmd0aC0xOyAgIC8vIHBhc3RlIGF0IGxlYXN0IG9uZSBieXRlCisgICAgICAgIGZvciAoaW50IGk9cGFjay5sZW5ndGgtMjsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICBpZiAocGFja1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmlyc3ROb25aZXJvID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhY2ssIGZpcnN0Tm9uWmVybywgb3V0LCBvb2Zmc2V0LCBwYWNrLmxlbmd0aC1maXJzdE5vblplcm8pOworICAgICAgICByZXR1cm4gcGFjay5sZW5ndGgtZmlyc3ROb25aZXJvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhY2sgdGhlIGludCBpbnRvIGEgT0lEIHN1Yi1pZGVudGlmaWVyIERFUiBlbmNvZGluZworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBwYWNrN09pZChpbnQgaW5wdXQsIGJ5dGVbXSBvdXQsIGludCBvb2Zmc2V0KSB7CisgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbNF07CisgICAgICAgIGJbMF0gPSAoYnl0ZSkoaW5wdXQgPj4gMjQpOworICAgICAgICBiWzFdID0gKGJ5dGUpKGlucHV0ID4+IDE2KTsKKyAgICAgICAgYlsyXSA9IChieXRlKShpbnB1dCA+PiA4KTsKKyAgICAgICAgYlszXSA9IChieXRlKShpbnB1dCk7CisgICAgICAgIHJldHVybiBwYWNrN09pZChiLCAwLCA0LCBvdXQsIG9vZmZzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhY2sgdGhlIEJpZ0ludGVnZXIgaW50byBhIE9JRCBzdWJpZGVudGlmaWVyIERFUiBlbmNvZGluZworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBwYWNrN09pZChCaWdJbnRlZ2VyIGlucHV0LCBieXRlW10gb3V0LCBpbnQgb29mZnNldCkgeworICAgICAgICBieXRlW10gYiA9IGlucHV0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgIHJldHVybiBwYWNrN09pZChiLCAwLCBiLmxlbmd0aCwgb3V0LCBvb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIG1ldGhvZHMgdG8gY2hlY2sgdmFsaWRpdHkgb2YgT0lELiBUaGV5IG11c3QgYmUgLS0KKyAgICAgKiAxLiBhdCBsZWFzdCAyIGNvbXBvbmVudHMKKyAgICAgKiAyLiBhbGwgY29tcG9uZW50cyBtdXN0IGJlIG5vbi1uZWdhdGl2ZQorICAgICAqIDMuIHRoZSBmaXJzdCBtdXN0IGJlIDAsIDEgb3IgMgorICAgICAqIDQuIGlmIHRoZSBmaXJzdCBpcyAwIG9yIDEsIHRoZSBzZWNvbmQgbXVzdCBiZSA8NDAKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBERVIgZW5jb2RpbmcuIFNpbmNlIERFUiBlbmNvZGluZyBkZWZpbmVzIHRoYXQgdGhlIGludGVnZXIgYml0cworICAgICAqIGFyZSB1bnNpZ25lZCwgc28gdGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIHRoZSBNU0IuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVjayhieXRlW10gZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBsZW5ndGggPSBlbmNvZGluZy5sZW5ndGg7CisgICAgICAgIGlmIChsZW5ndGggPCAxIHx8ICAgICAgLy8gdG9vIHNob3J0CisgICAgICAgICAgICAgICAgKGVuY29kaW5nW2xlbmd0aCAtIDFdICYgMHg4MCkgIT0gMCkgeyAgLy8gbm90IGVuZGVkCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk9iamVjdElkZW50aWZpZXIoKSAtLSAiICsKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgREVSIGVuY29kaW5nLCBub3QgZW5kZWQiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIDB4ODAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHN1YmlkZW50aWZpZXIKKyAgICAgICAgICAgIGlmIChlbmNvZGluZ1tpXSA9PSAoYnl0ZSkweDgwICYmCisgICAgICAgICAgICAgICAgICAgIChpPT0wIHx8IChlbmNvZGluZ1tpLTFdICYgMHg4MCkgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk9iamVjdElkZW50aWZpZXIoKSAtLSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIERFUiBlbmNvZGluZywgdXNlbGVzcyBleHRyYSBvY3RldCBkZXRlY3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDb3VudChpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb3VudCA8IDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT2JqZWN0SWRlbnRpZmllcigpIC0tICIgKworICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBhdCBsZWFzdCB0d28gb2lkIGNvbXBvbmVudHMgIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0ZpcnN0Q29tcG9uZW50KGludCBmaXJzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpcnN0IDwgMCB8fCBmaXJzdCA+IDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT2JqZWN0SWRlbnRpZmllcigpIC0tICIgKworICAgICAgICAgICAgICAgICAgICAiRmlyc3Qgb2lkIGNvbXBvbmVudCBpcyBpbnZhbGlkICIpOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGaXJzdENvbXBvbmVudChCaWdJbnRlZ2VyIGZpcnN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZmlyc3Quc2lnbnVtKCkgPT0gLTEgfHwKKyAgICAgICAgICAgICAgICBmaXJzdC5jb21wYXJlVG8oQmlnSW50ZWdlci52YWx1ZU9mKDIpKSA9PSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk9iamVjdElkZW50aWZpZXIoKSAtLSAiICsKKyAgICAgICAgICAgICAgICAgICAgIkZpcnN0IG9pZCBjb21wb25lbnQgaXMgaW52YWxpZCAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrU2Vjb25kQ29tcG9uZW50KGludCBmaXJzdCwgaW50IHNlY29uZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNlY29uZCA8IDAgfHwgZmlyc3QgIT0gMiAmJiBzZWNvbmQgPiAzOSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJPYmplY3RJZGVudGlmaWVyKCkgLS0gIiArCisgICAgICAgICAgICAgICAgICAgICJTZWNvbmQgb2lkIGNvbXBvbmVudCBpcyBpbnZhbGlkICIpOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tTZWNvbmRDb21wb25lbnQoaW50IGZpcnN0LCBCaWdJbnRlZ2VyIHNlY29uZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNlY29uZC5zaWdudW0oKSA9PSAtMSB8fAorICAgICAgICAgICAgICAgIGZpcnN0ICE9IDIgJiYKKyAgICAgICAgICAgICAgICBzZWNvbmQuY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZigzOSkpID09IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT2JqZWN0SWRlbnRpZmllcigpIC0tICIgKworICAgICAgICAgICAgICAgICAgICAiU2Vjb25kIG9pZCBjb21wb25lbnQgaXMgaW52YWxpZCAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3RoZXJDb21wb25lbnQoaW50IGksIGludCBudW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudW0gPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk9iamVjdElkZW50aWZpZXIoKSAtLSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9pZCBjb21wb25lbnQgIyIgKyAoaSsxKSArICIgbXVzdCBiZSBub24tbmVnYXRpdmUgIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja090aGVyQ29tcG9uZW50KGludCBpLCBCaWdJbnRlZ2VyIG51bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG51bS5zaWdudW0oKSA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJPYmplY3RJZGVudGlmaWVyKCkgLS0gIiArCisgICAgICAgICAgICAgICAgICAgICJvaWQgY29tcG9uZW50ICMiICsgKGkrMSkgKyAiIG11c3QgYmUgbm9uLW5lZ2F0aXZlICIpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zd2luZy9EZWZhdWx0TG9va3VwLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL0RlZmF1bHRMb29rdXAuamF2YQppbmRleCBhZjQ2Zjk1Li5jNWRjY2M1IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL0RlZmF1bHRMb29rdXAuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL0RlZmF1bHRMb29rdXAuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IGphdmEuYXd0LkNvbG9yOwogaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKIGltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7CiBpbXBvcnQgamF2YXguc3dpbmcucGxhZi5Db21wb25lbnRVSTsKIGltcG9ydCBzdW4uYXd0LkFwcENvbnRleHQ7CiAKQEAgLTEzNyw2ICsxMzgsMTAgQEAKICAgICAgICAgcmV0dXJuICgoTnVtYmVyKWlWYWx1ZSkuaW50VmFsdWUoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRJbnQoSkNvbXBvbmVudCBjLCBDb21wb25lbnRVSSB1aSwgU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gZ2V0SW50KGMsIHVpLCBrZXksIC0xKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIEluc2V0cyBnZXRJbnNldHMoSkNvbXBvbmVudCBjLCBDb21wb25lbnRVSSB1aSwgU3RyaW5nIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXRzIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICBPYmplY3QgaVZhbHVlID0gZ2V0KGMsIHVpLCBrZXkpOwpAQCAtMTQ3LDYgKzE1MiwxMCBAQAogICAgICAgICByZXR1cm4gKEluc2V0cylpVmFsdWU7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBJbnNldHMgZ2V0SW5zZXRzKEpDb21wb25lbnQgYywgQ29tcG9uZW50VUkgdWksIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc2V0cyhjLCB1aSwga2V5LCBudWxsKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihKQ29tcG9uZW50IGMsIENvbXBvbmVudFVJIHVpLCBTdHJpbmcga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgIE9iamVjdCBpVmFsdWUgPSBnZXQoYywgdWksIGtleSk7CkBAIC0xNTcsNiArMTY2LDEwIEBACiAgICAgICAgIHJldHVybiAoKEJvb2xlYW4paVZhbHVlKS5ib29sZWFuVmFsdWUoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihKQ29tcG9uZW50IGMsIENvbXBvbmVudFVJIHVpLCBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRCb29sZWFuKGMsIHVpLCBrZXksIGZhbHNlKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yKEpDb21wb25lbnQgYywgQ29tcG9uZW50VUkgdWksIFN0cmluZyBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvciBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgT2JqZWN0IGlWYWx1ZSA9IGdldChjLCB1aSwga2V5KTsKQEAgLTE2Nyw3ICsxODAsMzUgQEAKICAgICAgICAgcmV0dXJuIChDb2xvcilpVmFsdWU7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBDb2xvciBnZXRDb2xvcihKQ29tcG9uZW50IGMsIENvbXBvbmVudFVJIHVpLCBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRDb2xvcihjLCB1aSwga2V5LCBudWxsKTsKKyAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIEljb24gZ2V0SWNvbihKQ29tcG9uZW50IGMsIENvbXBvbmVudFVJIHVpLCBTdHJpbmcga2V5LAorICAgICAgICAgICAgSWNvbiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgT2JqZWN0IGlWYWx1ZSA9IGdldChjLCB1aSwga2V5KTsKKyAgICAgICAgaWYgKGlWYWx1ZSA9PSBudWxsIHx8ICEoaVZhbHVlIGluc3RhbmNlb2YgSWNvbikpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChJY29uKWlWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEljb24gZ2V0SWNvbihKQ29tcG9uZW50IGMsIENvbXBvbmVudFVJIHVpLCBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRJY29uKGMsIHVpLCBrZXksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQm9yZGVyIGdldEJvcmRlcihKQ29tcG9uZW50IGMsIENvbXBvbmVudFVJIHVpLCBTdHJpbmcga2V5LAorICAgICAgICAgICAgQm9yZGVyIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBPYmplY3QgaVZhbHVlID0gZ2V0KGMsIHVpLCBrZXkpOworICAgICAgICBpZiAoaVZhbHVlID09IG51bGwgfHwgIShpVmFsdWUgaW5zdGFuY2VvZiBCb3JkZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQm9yZGVyKWlWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJvcmRlciBnZXRCb3JkZXIoSkNvbXBvbmVudCBjLCBDb21wb25lbnRVSSB1aSwgU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gZ2V0Qm9yZGVyKGMsIHVpLCBrZXksIG51bGwpOworICAgIH0KIAogICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChKQ29tcG9uZW50IGMsIENvbXBvbmVudFVJIHVpLCBTdHJpbmcga2V5KSB7CiAgICAgICAgIC8vIGJhc2ljCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL0ZpbGVQYW5lLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL0ZpbGVQYW5lLmphdmEKaW5kZXggNzExMTJiMy4uZWFlM2Q1YSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zd2luZy9GaWxlUGFuZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvRmlsZVBhbmUuamF2YQpAQCAtMjY1LDYgKzI2NSw3IEBACiAgICAgcHJpdmF0ZSBDb2xvciAgIGxpc3RWaWV3QmFja2dyb3VuZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbGlzdFZpZXdXaW5kb3dzU3R5bGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5OworICAgIHByaXZhdGUgYm9vbGVhbiBmdWxsUm93U2VsZWN0aW9uID0gZmFsc2U7CiAKICAgICBwcml2YXRlIExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWw7CiAgICAgcHJpdmF0ZSBKTGlzdCBsaXN0OwpAQCAtNDQ4LDYgKzQ0OSw3IEBACiAgICAgICAgIGtpbG9CeXRlU3RyaW5nID0gVUlNYW5hZ2VyLmdldFN0cmluZygiRmlsZUNob29zZXIuZmlsZVNpemVLaWxvQnl0ZXMiLCBsKTsKICAgICAgICAgbWVnYUJ5dGVTdHJpbmcgPSBVSU1hbmFnZXIuZ2V0U3RyaW5nKCJGaWxlQ2hvb3Nlci5maWxlU2l6ZU1lZ2FCeXRlcyIsIGwpOwogICAgICAgICBnaWdhQnl0ZVN0cmluZyA9IFVJTWFuYWdlci5nZXRTdHJpbmcoIkZpbGVDaG9vc2VyLmZpbGVTaXplR2lnYUJ5dGVzIiwgbCk7CisgICAgICAgIGZ1bGxSb3dTZWxlY3Rpb24gPSBVSU1hbmFnZXIuZ2V0Qm9vbGVhbigiRmlsZVZpZXcuZnVsbFJvd1NlbGVjdGlvbiIpOwogCiAgICAgICAgIHJlbmFtZUVycm9yVGl0bGVUZXh0ID0gVUlNYW5hZ2VyLmdldFN0cmluZygiRmlsZUNob29zZXIucmVuYW1lRXJyb3JUaXRsZVRleHQiLCBsKTsKICAgICAgICAgcmVuYW1lRXJyb3JUZXh0ID0gVUlNYW5hZ2VyLmdldFN0cmluZygiRmlsZUNob29zZXIucmVuYW1lRXJyb3JUZXh0IiwgbCk7CkBAIC05OTEsNiArOTkzLDcgQEAKICAgICAgICAgcHVibGljIERldGFpbHNUYWJsZUNlbGxFZGl0b3IoSlRleHRGaWVsZCB0ZikgewogICAgICAgICAgICAgc3VwZXIodGYpOwogICAgICAgICAgICAgdGhpcy50ZiA9IHRmOworICAgICAgICAgICAgdGYuc2V0TmFtZSgiVGFibGUuZWRpdG9yIik7CiAgICAgICAgICAgICB0Zi5hZGRGb2N1c0xpc3RlbmVyKGVkaXRvckZvY3VzTGlzdGVuZXIpOwogICAgICAgICB9CiAKQEAgLTEwMTgsNyArMTAyMSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgIGlmIChnZXRIb3Jpem9udGFsQWxpZ25tZW50KCkgPT0gU3dpbmdDb25zdGFudHMuTEVBRElORykgeworICAgICAgICBpZiAoZ2V0SG9yaXpvbnRhbEFsaWdubWVudCgpID09IFN3aW5nQ29uc3RhbnRzLkxFQURJTkcgJiYKKyAgICAgICAgICAgICAgICAgICAgIWZ1bGxSb3dTZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAvLyBSZXN0cmljdCB3aWR0aCB0byBhY3R1YWwgdGV4dAogICAgICAgICAgICAgICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIHRoaXMuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoKzQpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEwMzksOSArMTA0Myw5IEBACiAgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKIAotICAgICAgICAgICAgaWYgKHRhYmxlLmNvbnZlcnRDb2x1bW5JbmRleFRvTW9kZWwoY29sdW1uKSAhPSBDT0xVTU5fRklMRU5BTUUgfHwKLSAgICAgICAgICAgICAgICAgICAgKGxpc3RWaWV3V2luZG93c1N0eWxlICYmICF0YWJsZS5pc0ZvY3VzT3duZXIoKSkpIHsKLQorICAgICAgICAgICAgaWYgKCh0YWJsZS5jb252ZXJ0Q29sdW1uSW5kZXhUb01vZGVsKGNvbHVtbikgIT0gQ09MVU1OX0ZJTEVOQU1FIHx8CisgICAgICAgICAgICAgICAgICAgIChsaXN0Vmlld1dpbmRvd3NTdHlsZSAmJiAhdGFibGUuaXNGb2N1c093bmVyKCkpKSAmJgorICAgICAgICAgICAgICAgICAgICAhZnVsbFJvd1NlbGVjdGlvbikgewogICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIApAQCAtMTMzOCw2ICsxMzQyLDcgQEAKICAgICAgICAgICAgIFJlY3RhbmdsZSByID0gbGlzdC5nZXRDZWxsQm91bmRzKGluZGV4LCBpbmRleCk7CiAgICAgICAgICAgICBpZiAoZWRpdENlbGwgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGVkaXRDZWxsID0gbmV3IEpUZXh0RmllbGQoKTsKKyAgICAgICAgICAgICAgICBlZGl0Q2VsbC5zZXROYW1lKCJUcmVlLmNlbGxFZGl0b3IiKTsKICAgICAgICAgICAgICAgICBlZGl0Q2VsbC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgRWRpdEFjdGlvbkxpc3RlbmVyKCkpOwogICAgICAgICAgICAgICAgIGVkaXRDZWxsLmFkZEZvY3VzTGlzdGVuZXIoZWRpdG9yRm9jdXNMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgZWRpdENlbGwuc2V0TmV4dEZvY3VzYWJsZUNvbXBvbmVudChsaXN0KTsKQEAgLTE3OTcsMTAgKzE4MDIsMTEgQEAKICAgICAgICAgICAgICAgICBQb2ludCBwID0gZXZ0LmdldFBvaW50KCk7CiAgICAgICAgICAgICAgICAgaW5kZXggPSB0YWJsZS5yb3dBdFBvaW50KHApOwogCi0gICAgICAgICAgICAgICAgaWYgKFN3aW5nVXRpbGl0aWVzMi5wb2ludE91dHNpZGVQcmVmU2l6ZSh0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuY29sdW1uQXRQb2ludChwKSwgcCkpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHBvaW50T3V0c2lkZVByZWZTaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFN3aW5nVXRpbGl0aWVzMi5wb2ludE91dHNpZGVQcmVmU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwgaW5kZXgsIHRhYmxlLmNvbHVtbkF0UG9pbnQocCksIHApOwogCisgICAgICAgICAgICAgICAgaWYgKHBvaW50T3V0c2lkZVByZWZTaXplICYmICFmdWxsUm93U2VsZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvcGxhZi9HVEtLZXliaW5kaW5ncy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zd2luZy9wbGFmL0dUS0tleWJpbmRpbmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwMWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvcGxhZi9HVEtLZXliaW5kaW5ncy5qYXZhCkBAIC0wLDAgKzEsNzM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnN3aW5nLnBsYWY7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOworaW1wb3J0IGphdmF4LnN3aW5nLlVJRGVmYXVsdHM7CitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5EZWZhdWx0RWRpdG9yS2l0OworCisvKioKKyAqIEdUS0tleWJpbmRpbmdzIC0gVGhlIHN0YW5kYXJkIHNldCBvZiBrZXltYXBzIGZvciB0aGUgR1RLIFBsYXRmb3JtCisgKgorICogQGF1dGhvciBKYXNwZXIgUG90dHMKKyAqLworcHVibGljIGNsYXNzIEdUS0tleWJpbmRpbmdzIHsKKworICAgIC8qKgorICAgICAqIEluc3RhbGwgYWxsIEdUSyBrZXliaW5kaW5ncyBpbnRvIHRoZSBwcm92aWRlZCBVSURlZmF1bHRzIHRhYmxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFibGUgVGhlIFVpRGVmYXVsdHMgdGFibGUgdG8gaW5zdGFsbCBpbnRvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGxLZXliaW5kaW5ncyhVSURlZmF1bHRzIHRhYmxlKSB7CisgICAgICAgIE9iamVjdCBmaWVsZElucHV0TWFwID0gbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAiY3RybCBDIiwgRGVmYXVsdEVkaXRvcktpdC5jb3B5QWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIFYiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIFgiLCBEZWZhdWx0RWRpdG9yS2l0LmN1dEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiQ09QWSIsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiUEFTVEUiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICJDVVQiLCBEZWZhdWx0RWRpdG9yS2l0LmN1dEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBJTlNFUlQiLCBEZWZhdWx0RWRpdG9yS2l0LmNvcHlBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IERFTEVURSIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgS1BfTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uQmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IFJJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25Gb3J3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uRm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5wcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgS1BfTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQucHJldmlvdXNXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIFJJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5uZXh0V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQubmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uUHJldmlvdXNXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEtQX0xFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvblByZXZpb3VzV29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbk5leHRXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIEEiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdEFsbEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiSE9NRSIsIERlZmF1bHRFZGl0b3JLaXQuYmVnaW5MaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJFTkQiLCBEZWZhdWx0RWRpdG9yS2l0LmVuZExpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IEhPTUUiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkJlZ2luTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgRU5EIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25FbmRMaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgQkFDS19TUEFDRSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgSCIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgIkRFTEVURSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlTmV4dENoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVOZXh0V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LmZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIkxFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LmJhY2t3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiS1BfTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuYmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIkVOVEVSIiwgSlRleHRGaWVsZC5ub3RpZnlBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgQkFDS19TTEFTSCIsICJ1bnNlbGVjdCIvKkRlZmF1bHRFZGl0b3JLaXQudW5zZWxlY3RBY3Rpb24qLywKKyAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBPIiwgInRvZ2dsZS1jb21wb25lbnRPcmllbnRhdGlvbiIvKkRlZmF1bHRFZGl0b3JLaXQudG9nZ2xlQ29tcG9uZW50T3JpZW50YXRpb24qLworICAgICAgICB9KTsKKyAgICAgICAgT2JqZWN0IHBhc3N3b3JkSW5wdXRNYXAgPSBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICJjdHJsIEMiLCBEZWZhdWx0RWRpdG9yS2l0LmNvcHlBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgViIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgWCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICJDT1BZIiwgRGVmYXVsdEVkaXRvcktpdC5jb3B5QWN0aW9uLAorICAgICAgICAgICAgICAgICJQQVNURSIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgIkNVVCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIElOU0VSVCIsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgSU5TRVJUIiwgRGVmYXVsdEVkaXRvcktpdC5wYXN0ZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5jdXRBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IExFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkJhY2t3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IEtQX1JJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25Gb3J3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIExFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LmJlZ2luTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5iZWdpbkxpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LmVuZExpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgS1BfUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LmVuZExpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uQmVnaW5MaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEtQX0xFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkJlZ2luTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uRW5kTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uRW5kTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBBIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3RBbGxBY3Rpb24sCisgICAgICAgICAgICAgICAgIkhPTUUiLCBEZWZhdWx0RWRpdG9yS2l0LmJlZ2luTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiRU5EIiwgRGVmYXVsdEVkaXRvcktpdC5lbmRMaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CZWdpbkxpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IEVORCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uRW5kTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiQkFDS19TUEFDRSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IEJBQ0tfU1BBQ0UiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZVByZXZDaGFyQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIEgiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZVByZXZDaGFyQWN0aW9uLAorICAgICAgICAgICAgICAgICJERUxFVEUiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZU5leHRDaGFyQWN0aW9uLAorICAgICAgICAgICAgICAgICJSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuYmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5mb3J3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5iYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiRU5URVIiLCBKVGV4dEZpZWxkLm5vdGlmeUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NMQVNIIiwgInVuc2VsZWN0Ii8qRGVmYXVsdEVkaXRvcktpdC51bnNlbGVjdEFjdGlvbiovLAorICAgICAgICAgICAgICAgICJjb250cm9sIHNoaWZ0IE8iLCAidG9nZ2xlLWNvbXBvbmVudE9yaWVudGF0aW9uIi8qRGVmYXVsdEVkaXRvcktpdC50b2dnbGVDb21wb25lbnRPcmllbnRhdGlvbiovCisgICAgICAgIH0pOworICAgICAgICBPYmplY3QgbXVsdGlsaW5lSW5wdXRNYXAgPSBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICJjdHJsIEMiLCBEZWZhdWx0RWRpdG9yS2l0LmNvcHlBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgViIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgWCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICJDT1BZIiwgRGVmYXVsdEVkaXRvcktpdC5jb3B5QWN0aW9uLAorICAgICAgICAgICAgICAgICJQQVNURSIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgIkNVVCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIElOU0VSVCIsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgSU5TRVJUIiwgRGVmYXVsdEVkaXRvcktpdC5wYXN0ZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5jdXRBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IExFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkJhY2t3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IEtQX1JJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25Gb3J3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIExFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnByZXZpb3VzV29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5wcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0Lm5leHRXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIEtQX1JJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5uZXh0V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25QcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uUHJldmlvdXNXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFJJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25OZXh0V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgQSIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0QWxsQWN0aW9uLAorICAgICAgICAgICAgICAgICJIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5iZWdpbkxpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgIkVORCIsIERlZmF1bHRFZGl0b3JLaXQuZW5kTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgSE9NRSIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uQmVnaW5MaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBFTkQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkVuZExpbmVBY3Rpb24sCisKKyAgICAgICAgICAgICAgICAiVVAiLCBEZWZhdWx0RWRpdG9yS2l0LnVwQWN0aW9uLAorICAgICAgICAgICAgICAgICJLUF9VUCIsIERlZmF1bHRFZGl0b3JLaXQudXBBY3Rpb24sCisgICAgICAgICAgICAgICAgIkRPV04iLCBEZWZhdWx0RWRpdG9yS2l0LmRvd25BY3Rpb24sCisgICAgICAgICAgICAgICAgIktQX0RPV04iLCBEZWZhdWx0RWRpdG9yS2l0LmRvd25BY3Rpb24sCisgICAgICAgICAgICAgICAgIlBBR0VfVVAiLCBEZWZhdWx0RWRpdG9yS2l0LnBhZ2VVcEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiUEFHRV9ET1dOIiwgRGVmYXVsdEVkaXRvcktpdC5wYWdlRG93bkFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgUEFHRV9VUCIsICJzZWxlY3Rpb24tcGFnZS11cCIsCisgICAgICAgICAgICAgICAgInNoaWZ0IFBBR0VfRE9XTiIsICJzZWxlY3Rpb24tcGFnZS1kb3duIiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBQQUdFX1VQIiwgInNlbGVjdGlvbi1wYWdlLWxlZnQiLAorICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFBBR0VfRE9XTiIsICJzZWxlY3Rpb24tcGFnZS1yaWdodCIsCisgICAgICAgICAgICAgICAgInNoaWZ0IFVQIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25VcEFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgS1BfVVAiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvblVwQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBET1dOIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25Eb3duQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBLUF9ET1dOIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25Eb3duQWN0aW9uLAorICAgICAgICAgICAgICAgICJFTlRFUiIsIERlZmF1bHRFZGl0b3JLaXQuaW5zZXJ0QnJlYWtBY3Rpb24sCisgICAgICAgICAgICAgICAgIkJBQ0tfU1BBQ0UiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZVByZXZDaGFyQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBIIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAiREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVOZXh0Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBERUxFVEUiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZU5leHRXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjdHJsIEJBQ0tfU1BBQ0UiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZVByZXZXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuYmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5mb3J3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5iYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiVEFCIiwgRGVmYXVsdEVkaXRvcktpdC5pbnNlcnRUYWJBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgQkFDS19TTEFTSCIsICJ1bnNlbGVjdCIvKkRlZmF1bHRFZGl0b3JLaXQudW5zZWxlY3RBY3Rpb24qLywKKyAgICAgICAgICAgICAgICAiY3RybCBIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5iZWdpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBFTkQiLCBEZWZhdWx0RWRpdG9yS2l0LmVuZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CZWdpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBFTkQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkVuZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBUIiwgIm5leHQtbGluay1hY3Rpb24iLAorICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFQiLCAicHJldmlvdXMtbGluay1hY3Rpb24iLAorICAgICAgICAgICAgICAgICJjdHJsIFNQQUNFIiwgImFjdGl2YXRlLWxpbmstYWN0aW9uIiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBPIiwgInRvZ2dsZS1jb21wb25lbnRPcmllbnRhdGlvbiIvKkRlZmF1bHRFZGl0b3JLaXQudG9nZ2xlQ29tcG9uZW50T3JpZW50YXRpb24qLworICAgICAgICB9KTsKKworICAgICAgICBPYmplY3RbXSBkZWZhdWx0cyA9IG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAiQnV0dG9uLmZvY3VzSW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiU1BBQ0UiLCAicHJlc3NlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZWQgU1BBQ0UiLCAicmVsZWFzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVOVEVSIiwgInByZXNzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VkIEVOVEVSIiwgInJlbGVhc2VkIgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJDaGVja0JveC5mb2N1c0lucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIlNQQUNFIiwgInByZXNzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VkIFNQQUNFIiwgInJlbGVhc2VkIgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJDb21ib0JveC5hbmNlc3RvcklucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIkVTQ0FQRSIsICJoaWRlUG9wdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBR0VfVVAiLCAicGFnZVVwUGFzc1Rocm91Z2giLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBR0VfRE9XTiIsICJwYWdlRG93blBhc3NUaHJvdWdoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIT01FIiwgImhvbWVQYXNzVGhyb3VnaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5EIiwgImVuZFBhc3NUaHJvdWdoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJET1dOIiwgInNlbGVjdE5leHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAic2VsZWN0TmV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IERPV04iLCAidG9nZ2xlUG9wdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFsdCBLUF9ET1dOIiwgInRvZ2dsZVBvcHVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbHQgVVAiLCAidG9nZ2xlUG9wdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFsdCBLUF9VUCIsICJ0b2dnbGVQb3B1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU1BBQ0UiLCAic3BhY2VQb3B1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5URVIiLCAiZW50ZXJQcmVzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJzZWxlY3RQcmV2aW91cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAic2VsZWN0UHJldmlvdXMiCisKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiRWRpdG9yUGFuZS5mb2N1c0lucHV0TWFwIiwgbXVsdGlsaW5lSW5wdXRNYXAsCisgICAgICAgICAgICAgICAgIkZpbGVDaG9vc2VyLmFuY2VzdG9ySW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgImNhbmNlbFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRjIiLCAiZWRpdEZpbGVOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGNSIsICJyZWZyZXNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCQUNLX1NQQUNFIiwgIkdvIFVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTlRFUiIsICJhcHByb3ZlU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEVOVEVSIiwgImFwcHJvdmVTZWxlY3Rpb24iCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIkZvcm1hdHRlZFRleHRGaWVsZC5mb2N1c0lucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQyIsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFYiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgWCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNPUFkiLCBEZWZhdWx0RWRpdG9yS2l0LmNvcHlBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFTVEUiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNVVCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgSU5TRVJUIiwgRGVmYXVsdEVkaXRvcktpdC5jb3B5QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5jdXRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uQmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uQmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5wcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5wcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQubmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQubmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25QcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25QcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBBIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3RBbGxBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiSE9NRSIsIERlZmF1bHRFZGl0b3JLaXQuYmVnaW5MaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVORCIsIERlZmF1bHRFZGl0b3JLaXQuZW5kTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CZWdpbkxpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgRU5EIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25FbmRMaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJBQ0tfU1BBQ0UiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZVByZXZDaGFyQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEJBQ0tfU1BBQ0UiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZVByZXZDaGFyQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgSCIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVOZXh0Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIERFTEVURSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5iYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5iYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTlRFUiIsIEpUZXh0RmllbGQubm90aWZ5QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQkFDS19TTEFTSCIsICJ1bnNlbGVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBPIiwgInRvZ2dsZS1jb21wb25lbnRPcmllbnRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgInJlc2V0LWZpZWxkLWVkaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVQIiwgImluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAiaW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJET1dOIiwgImRlY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfRE9XTiIsICJkZWNyZW1lbnQiLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJJbnRlcm5hbEZyYW1lLndpbmRvd0JpbmRpbmdzIiwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgRVNDQVBFIiwgInNob3dTeXN0ZW1NZW51IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFNQQUNFIiwgInNob3dTeXN0ZW1NZW51IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFU0NBUEUiLCAiaGlkZVN5c3RlbU1lbnUiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiTGlzdC5mb2N1c0lucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQyIsICJjb3B5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFYiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgWCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNPUFkiLCAiY29weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFTVEUiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNVVCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgSU5TRVJUIiwgImNvcHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsICJwYXN0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgImN1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVVAiLCAic2VsZWN0UHJldmlvdXNSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgInNlbGVjdFByZXZpb3VzUm93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBVUCIsICJzZWxlY3RQcmV2aW91c1Jvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgVVAiLCAic2VsZWN0UHJldmlvdXNSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgVVAiLCAic2VsZWN0UHJldmlvdXNSb3dDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX1VQIiwgInNlbGVjdFByZXZpb3VzUm93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJzZWxlY3ROZXh0Um93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgInNlbGVjdE5leHRSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IERPV04iLCAic2VsZWN0TmV4dFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfRE9XTiIsICJzZWxlY3ROZXh0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IERPV04iLCAic2VsZWN0TmV4dFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9ET1dOIiwgInNlbGVjdE5leHRSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRE9XTiIsICJzZWxlY3ROZXh0Um93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9ET1dOIiwgInNlbGVjdE5leHRSb3dDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IExFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfTEVGVCIsICJzZWxlY3RQcmV2aW91c0NvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBSSUdIVCIsICJzZWxlY3ROZXh0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEtQX1JJR0hUIiwgInNlbGVjdE5leHRDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhPTUUiLCAic2VsZWN0Rmlyc3RSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEhPTUUiLCAic2VsZWN0Rmlyc3RSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgSE9NRSIsICJzZWxlY3RGaXJzdFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBIT01FIiwgInNlbGVjdEZpcnN0Um93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5EIiwgInNlbGVjdExhc3RSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEVORCIsICJzZWxlY3RMYXN0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEVORCIsICJzZWxlY3RMYXN0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEVORCIsICJzZWxlY3RMYXN0Um93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9VUCIsICJzY3JvbGxVcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUEFHRV9VUCIsICJzY3JvbGxVcEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBQQUdFX1VQIiwgInNjcm9sbFVwRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFBBR0VfVVAiLCAic2Nyb2xsVXBDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX0RPV04iLCAic2Nyb2xsRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUEFHRV9ET1dOIiwgInNjcm9sbERvd25FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgUEFHRV9ET1dOIiwgInNjcm9sbERvd25FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9ET1dOIiwgInNjcm9sbERvd25DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEEiLCAic2VsZWN0QWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFNMQVNIIiwgInNlbGVjdEFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NMQVNIIiwgImNsZWFyU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJhZGRUb1NlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBTUEFDRSIsICJ0b2dnbGVBbmRBbmNob3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFNQQUNFIiwgImV4dGVuZFRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFNQQUNFIiwgIm1vdmVTZWxlY3Rpb25UbyIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiTGlzdC5mb2N1c0lucHV0TWFwLlJpZ2h0VG9MZWZ0IiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAic2VsZWN0TmV4dENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfTEVGVCIsICJzZWxlY3ROZXh0Q29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBMRUZUIiwgInNlbGVjdE5leHRDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEtQX0xFRlQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBMRUZUIiwgInNlbGVjdE5leHRDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfTEVGVCIsICJzZWxlY3ROZXh0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIExFRlQiLCAic2VsZWN0TmV4dENvbHVtbkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgS1BfTEVGVCIsICJzZWxlY3ROZXh0Q29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBSSUdIVCIsICJzZWxlY3RQcmV2aW91c0NvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX1JJR0hUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIk1lbnVCYXIud2luZG93QmluZGluZ3MiLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiRjEwIiwgInRha2VGb2N1cyIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJPcHRpb25QYW5lLndpbmRvd0JpbmRpbmdzIiwgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIkVTQ0FQRSIsICJjbG9zZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJQYXNzd29yZEZpZWxkLmZvY3VzSW5wdXRNYXAiLCBwYXNzd29yZElucHV0TWFwLAorICAgICAgICAgICAgICAgICJQb3B1cE1lbnUuc2VsZWN0ZWRXaW5kb3dJbnB1dE1hcEJpbmRpbmdzIiwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgImNhbmNlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJzZWxlY3ROZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgInNlbGVjdE5leHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVQIiwgInNlbGVjdFByZXZpb3VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9VUCIsICJzZWxlY3RQcmV2aW91cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJzZWxlY3RQYXJlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAic2VsZWN0UGFyZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJzZWxlY3RDaGlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAic2VsZWN0Q2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVOVEVSIiwgInJldHVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU1BBQ0UiLCAicmV0dXJuIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIlBvcHVwTWVudS5zZWxlY3RlZFdpbmRvd0lucHV0TWFwQmluZGluZ3MuUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIiwgInNlbGVjdENoaWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInNlbGVjdENoaWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJzZWxlY3RQYXJlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgInNlbGVjdFBhcmVudCIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiUmFkaW9CdXR0b24uZm9jdXNJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJwcmVzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlZCBTUEFDRSIsICJyZWxlYXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOIiwgInByZXNzZWQiCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgLy8gVGhlc2UgYmluZGluZ3MgYXJlIG9ubHkgZW5hYmxlZCB3aGVuIHRoZXJlIGlzIGEgZGVmYXVsdAorICAgICAgICAgICAgICAgIC8vIGJ1dHRvbiBzZXQgb24gdGhlIHJvb3RwYW5lLgorICAgICAgICAgICAgICAgICJSb290UGFuZS5kZWZhdWx0QnV0dG9uV2luZG93S2V5QmluZGluZ3MiLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiRU5URVIiLCAicHJlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VkIEVOVEVSIiwgInJlbGVhc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRU5URVIiLCAicHJlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgcmVsZWFzZWQgRU5URVIiLCAicmVsZWFzZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJTY3JvbGxCYXIuYW5jZXN0b3JJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJwb3NpdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgInBvc2l0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJwb3NpdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAicG9zaXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX0RPV04iLCAicG9zaXRpdmVCbG9ja0luY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgIm5lZ2F0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9VUCIsICJuZWdhdGl2ZUJsb2NrSW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIT01FIiwgIm1pblNjcm9sbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5EIiwgIm1heFNjcm9sbCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiU2Nyb2xsQmFyLmFuY2VzdG9ySW5wdXRNYXAuUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAicG9zaXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInBvc2l0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIlNjcm9sbFBhbmUuYW5jZXN0b3JJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJ1bml0U2Nyb2xsUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgInVuaXRTY3JvbGxSaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJ1bml0U2Nyb2xsRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfRE9XTiIsICJ1bml0U2Nyb2xsRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJ1bml0U2Nyb2xsTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfTEVGVCIsICJ1bml0U2Nyb2xsTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVVAiLCAidW5pdFNjcm9sbFVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9VUCIsICJ1bml0U2Nyb2xsVXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBR0VfVVAiLCAic2Nyb2xsVXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBR0VfRE9XTiIsICJzY3JvbGxEb3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFBBR0VfVVAiLCAic2Nyb2xsTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX0RPV04iLCAic2Nyb2xsUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgSE9NRSIsICJzY3JvbGxIb21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEVORCIsICJzY3JvbGxFbmQiCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIlNjcm9sbFBhbmUuYW5jZXN0b3JJbnB1dE1hcC5SaWdodFRvTGVmdCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFBBR0VfVVAiLCAic2Nyb2xsUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9ET1dOIiwgInNjcm9sbExlZnQiLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJTbGlkZXIuZm9jdXNJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJwb3NpdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgInBvc2l0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX0RPV04iLCAibmVnYXRpdmVCbG9ja0luY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJwb3NpdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgInBvc2l0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9VUCIsICJwb3NpdGl2ZUJsb2NrSW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIT01FIiwgIm1pblNjcm9sbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5EIiwgIm1heFNjcm9sbCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiU2xpZGVyLmZvY3VzSW5wdXRNYXAuUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAicG9zaXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInBvc2l0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIlNwaW5uZXIuYW5jZXN0b3JJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJpbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgImluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJkZWNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAiZGVjcmVtZW50IiwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiU3BsaXRQYW5lLmFuY2VzdG9ySW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiVVAiLCAibmVnYXRpdmVJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRPV04iLCAicG9zaXRpdmVJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAibmVnYXRpdmVJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlJJR0hUIiwgInBvc2l0aXZlSW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9VUCIsICJuZWdhdGl2ZUluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfRE9XTiIsICJwb3NpdGl2ZUluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfTEVGVCIsICJuZWdhdGl2ZUluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAicG9zaXRpdmVJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhPTUUiLCAic2VsZWN0TWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTkQiLCAic2VsZWN0TWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGOCIsICJzdGFydFJlc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRjYiLCAidG9nZ2xlRm9jdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgVEFCIiwgImZvY3VzT3V0Rm9yd2FyZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBUQUIiLCAiZm9jdXNPdXRCYWNrd2FyZCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiVGFiYmVkUGFuZS5mb2N1c0lucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIlJJR0hUIiwgIm5hdmlnYXRlUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgIm5hdmlnYXRlUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAibmF2aWdhdGVMZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgIm5hdmlnYXRlTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVVAiLCAibmF2aWdhdGVVcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAibmF2aWdhdGVVcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJuYXZpZ2F0ZURvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAibmF2aWdhdGVEb3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIERPV04iLCAicmVxdWVzdEZvY3VzRm9yVmlzaWJsZUNvbXBvbmVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9ET1dOIiwgInJlcXVlc3RGb2N1c0ZvclZpc2libGVDb21wb25lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNQQUNFIiwgInNlbGVjdFRhYldpdGhGb2N1cyIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiVGFiYmVkUGFuZS5hbmNlc3RvcklucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgVEFCIiwgIm5hdmlnYXRlTmV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBUQUIiLCAibmF2aWdhdGVQcmV2aW91cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX0RPV04iLCAibmF2aWdhdGVQYWdlRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX1VQIiwgIm5hdmlnYXRlUGFnZVVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFVQIiwgInJlcXVlc3RGb2N1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9VUCIsICJyZXF1ZXN0Rm9jdXMiLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJUYWJsZUhlYWRlci5hbmNlc3RvcklucHV0TWFwIiwKKyAgICAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJ0b2dnbGVTb3J0T3JkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIiwgInNlbGVjdENvbHVtblRvTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAic2VsZWN0Q29sdW1uVG9MZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJzZWxlY3RDb2x1bW5Ub1JpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsICJzZWxlY3RDb2x1bW5Ub1JpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHQgTEVGVCIsICJtb3ZlQ29sdW1uTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IEtQX0xFRlQiLCAibW92ZUNvbHVtbkxlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IFJJR0hUIiwgIm1vdmVDb2x1bW5SaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHQgS1BfUklHSFQiLCAibW92ZUNvbHVtblJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHQgc2hpZnQgTEVGVCIsICJyZXNpemVMZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbHQgc2hpZnQgS1BfTEVGVCIsICJyZXNpemVMZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdCBzaGlmdCBSSUdIVCIsICJyZXNpemVSaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICJhbHQgc2hpZnQgS1BfUklHSFQiLCAicmVzaXplUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgImZvY3VzVGFibGUiLAorICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJUYWJsZS5hbmNlc3RvcklucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQyIsICJjb3B5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFYiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgWCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNPUFkiLCAiY29weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFTVEUiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNVVCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgSU5TRVJUIiwgImNvcHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsICJwYXN0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgImN1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBSSUdIVCIsICJzZWxlY3ROZXh0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEtQX1JJR0hUIiwgInNlbGVjdE5leHRDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IExFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEtQX0xFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgTEVGVCIsICJzZWxlY3RQcmV2aW91c0NvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIExFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX0xFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJET1dOIiwgInNlbGVjdE5leHRSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAic2VsZWN0TmV4dFJvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgRE9XTiIsICJzZWxlY3ROZXh0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBLUF9ET1dOIiwgInNlbGVjdE5leHRSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgRE9XTiIsICJzZWxlY3ROZXh0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEtQX0RPV04iLCAic2VsZWN0TmV4dFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBET1dOIiwgInNlbGVjdE5leHRSb3dDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX0RPV04iLCAic2VsZWN0TmV4dFJvd0NoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVQIiwgInNlbGVjdFByZXZpb3VzUm93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9VUCIsICJzZWxlY3RQcmV2aW91c1JvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgVVAiLCAic2VsZWN0UHJldmlvdXNSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEtQX1VQIiwgInNlbGVjdFByZXZpb3VzUm93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFVQIiwgInNlbGVjdFByZXZpb3VzUm93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEtQX1VQIiwgInNlbGVjdFByZXZpb3VzUm93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFVQIiwgInNlbGVjdFByZXZpb3VzUm93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9VUCIsICJzZWxlY3RQcmV2aW91c1Jvd0NoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhPTUUiLCAic2VsZWN0Rmlyc3RDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEhPTUUiLCAic2VsZWN0Rmlyc3RDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgSE9NRSIsICJzZWxlY3RGaXJzdFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBIT01FIiwgInNlbGVjdEZpcnN0Um93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTkQiLCAic2VsZWN0TGFzdENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgRU5EIiwgInNlbGVjdExhc3RDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgRU5EIiwgInNlbGVjdExhc3RSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRU5EIiwgInNlbGVjdExhc3RSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBR0VfVVAiLCAic2Nyb2xsVXBDaGFuZ2VTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFBBR0VfVVAiLCAic2Nyb2xsVXBFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgUEFHRV9VUCIsICJzY3JvbGxMZWZ0RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFBBR0VfVVAiLCAic2Nyb2xsTGVmdENoYW5nZVNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9ET1dOIiwgInNjcm9sbERvd25DaGFuZ2VTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFBBR0VfRE9XTiIsICJzY3JvbGxEb3duRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFBBR0VfRE9XTiIsICJzY3JvbGxSaWdodEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX0RPV04iLCAic2Nyb2xsUmlnaHRDaGFuZ2VTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRBQiIsICJzZWxlY3ROZXh0Q29sdW1uQ2VsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgVEFCIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2VsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5URVIiLCAic2VsZWN0TmV4dFJvd0NlbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEVOVEVSIiwgInNlbGVjdFByZXZpb3VzUm93Q2VsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBBIiwgInNlbGVjdEFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBTTEFTSCIsICJzZWxlY3RBbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQkFDS19TTEFTSCIsICJjbGVhclNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgImNhbmNlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRjIiLCAic3RhcnRFZGl0aW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJhZGRUb1NlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBTUEFDRSIsICJ0b2dnbGVBbmRBbmNob3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFNQQUNFIiwgImV4dGVuZFRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFNQQUNFIiwgIm1vdmVTZWxlY3Rpb25UbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRjgiLCAiZm9jdXNIZWFkZXIiCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIlRhYmxlLmFuY2VzdG9ySW5wdXRNYXAuUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBSSUdIVCIsICJzZWxlY3RQcmV2aW91c0NvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFJJR0hUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfUklHSFQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIiwgInNlbGVjdE5leHRDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAic2VsZWN0TmV4dENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgTEVGVCIsICJzZWxlY3ROZXh0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBLUF9MRUZUIiwgInNlbGVjdE5leHRDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgTEVGVCIsICJzZWxlY3ROZXh0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEtQX0xFRlQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBMRUZUIiwgInNlbGVjdE5leHRDb2x1bW5DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX0xFRlQiLCAic2VsZWN0TmV4dENvbHVtbkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9VUCIsICJzY3JvbGxSaWdodENoYW5nZVNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX0RPV04iLCAic2Nyb2xsTGVmdENoYW5nZVNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBQQUdFX1VQIiwgInNjcm9sbFJpZ2h0RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFBBR0VfRE9XTiIsICJzY3JvbGxMZWZ0RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiVGV4dEFyZWEuZm9jdXNJbnB1dE1hcCIsIG11bHRpbGluZUlucHV0TWFwLAorICAgICAgICAgICAgICAgICJUZXh0RmllbGQuZm9jdXNJbnB1dE1hcCIsIGZpZWxkSW5wdXRNYXAsCisgICAgICAgICAgICAgICAgIlRleHRQYW5lLmZvY3VzSW5wdXRNYXAiLCBtdWx0aWxpbmVJbnB1dE1hcCwKKyAgICAgICAgICAgICAgICAiVG9nZ2xlQnV0dG9uLmZvY3VzSW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiU1BBQ0UiLCAicHJlc3NlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZWQgU1BBQ0UiLCAicmVsZWFzZWQiCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIlRvb2xCYXIuYW5jZXN0b3JJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJuYXZpZ2F0ZVVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9VUCIsICJuYXZpZ2F0ZVVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJET1dOIiwgIm5hdmlnYXRlRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfRE9XTiIsICJuYXZpZ2F0ZURvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAibmF2aWdhdGVMZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgIm5hdmlnYXRlTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAibmF2aWdhdGVSaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAibmF2aWdhdGVSaWdodCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiVHJlZS5mb2N1c0lucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQyIsICJjb3B5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFYiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgWCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNPUFkiLCAiY29weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFTVEUiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNVVCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgSU5TRVJUIiwgImNvcHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsICJwYXN0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgImN1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVVAiLCAic2VsZWN0UHJldmlvdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgInNlbGVjdFByZXZpb3VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBVUCIsICJzZWxlY3RQcmV2aW91c0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgVVAiLCAic2VsZWN0UHJldmlvdXNFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgVVAiLCAic2VsZWN0UHJldmlvdXNDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX1VQIiwgInNlbGVjdFByZXZpb3VzQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJzZWxlY3ROZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgInNlbGVjdE5leHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IERPV04iLCAic2VsZWN0TmV4dEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfRE9XTiIsICJzZWxlY3ROZXh0RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IERPV04iLCAic2VsZWN0TmV4dEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9ET1dOIiwgInNlbGVjdE5leHRFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRE9XTiIsICJzZWxlY3ROZXh0Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9ET1dOIiwgInNlbGVjdE5leHRDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJzZWxlY3RDaGlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAic2VsZWN0Q2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAic2VsZWN0UGFyZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInNlbGVjdFBhcmVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidHlwZWQgKyIsICJleHBhbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVkIC0iLCAiY29sbGFwc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJBQ0tfU1BBQ0UiLCAibW92ZVNlbGVjdGlvblRvUGFyZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX1VQIiwgInNjcm9sbFVwQ2hhbmdlU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBQQUdFX1VQIiwgInNjcm9sbFVwRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFBBR0VfVVAiLCAic2Nyb2xsVXBFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9VUCIsICJzY3JvbGxVcENoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBR0VfRE9XTiIsICJzY3JvbGxEb3duQ2hhbmdlU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBQQUdFX0RPV04iLCAic2Nyb2xsRG93bkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBQQUdFX0RPV04iLCAic2Nyb2xsRG93bkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX0RPV04iLCAic2Nyb2xsRG93bkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhPTUUiLCAic2VsZWN0Rmlyc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEhPTUUiLCAic2VsZWN0Rmlyc3RFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgSE9NRSIsICJzZWxlY3RGaXJzdEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBIT01FIiwgInNlbGVjdEZpcnN0Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5EIiwgInNlbGVjdExhc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEVORCIsICJzZWxlY3RMYXN0RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEVORCIsICJzZWxlY3RMYXN0RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEVORCIsICJzZWxlY3RMYXN0Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRjIiLCAic3RhcnRFZGl0aW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEEiLCAic2VsZWN0QWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFNMQVNIIiwgInNlbGVjdEFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NMQVNIIiwgImNsZWFyU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIExFRlQiLCAic2Nyb2xsTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9MRUZUIiwgInNjcm9sbExlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUklHSFQiLCAic2Nyb2xsUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgS1BfUklHSFQiLCAic2Nyb2xsUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNQQUNFIiwgImFkZFRvU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFNQQUNFIiwgInRvZ2dsZUFuZEFuY2hvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgU1BBQ0UiLCAiZXh0ZW5kVG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgU1BBQ0UiLCAibW92ZVNlbGVjdGlvblRvIgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJUcmVlLmZvY3VzSW5wdXRNYXAuUmlnaHRUb0xlZnQiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAic2VsZWN0UGFyZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsICJzZWxlY3RQYXJlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAic2VsZWN0Q2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAic2VsZWN0Q2hpbGQiLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJUcmVlLmFuY2VzdG9ySW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgImNhbmNlbCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgfTsKKyAgICAgICAgdGFibGUucHV0RGVmYXVsdHMoZGVmYXVsdHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvcGxhZi9XaW5kb3dzS2V5YmluZGluZ3MuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvcGxhZi9XaW5kb3dzS2V5YmluZGluZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGY5M2U3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zd2luZy9wbGFmL1dpbmRvd3NLZXliaW5kaW5ncy5qYXZhCkBAIC0wLDAgKzEsNjQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDItMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnN3aW5nLnBsYWY7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOworaW1wb3J0IGphdmF4LnN3aW5nLlVJRGVmYXVsdHM7CitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5EZWZhdWx0RWRpdG9yS2l0OworCisvKioKKyAqIFdpbmRvd3NLZXliaW5kaW5ncyAtIFRoZSBzdGFuZGFyZCBzZXQgb2Yga2V5bWFwcyBmb3IgdGhlIFdpbmRvd3MgUGxhdGZvcm0KKyAqCisgKiBAYXV0aG9yIEphc3BlciBQb3R0cworICovCitwdWJsaWMgY2xhc3MgV2luZG93c0tleWJpbmRpbmdzIHsKKworICAgIC8qKgorICAgICAqIEluc3RhbGwgYWxsIFdpbmRvd3Mga2V5YmluZGluZ3MgaW50byB0aGUgcHJvdmlkZWQgVUlEZWZhdWx0cyB0YWJsZQorICAgICAqCisgICAgICogQHBhcmFtIHRhYmxlIFRoZSBVaURlZmF1bHRzIHRhYmxlIHRvIGluc3RhbGwgaW50bworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsS2V5YmluZGluZ3MoVUlEZWZhdWx0cyB0YWJsZSkgeworICAgICAgICAvLyAqKiogVGV4dAorICAgICAgICBPYmplY3QgZmllbGRJbnB1dE1hcCA9IG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgImNvbnRyb2wgQyIsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBWIiwgRGVmYXVsdEVkaXRvcktpdC5wYXN0ZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBYIiwgRGVmYXVsdEVkaXRvcktpdC5jdXRBY3Rpb24sCisgICAgICAgICAgICAgICAgIkNPUFkiLCBEZWZhdWx0RWRpdG9yS2l0LmNvcHlBY3Rpb24sCisgICAgICAgICAgICAgICAgIlBBU1RFIiwgRGVmYXVsdEVkaXRvcktpdC5wYXN0ZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiQ1VUIiwgRGVmYXVsdEVkaXRvcktpdC5jdXRBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgSU5TRVJUIiwgRGVmYXVsdEVkaXRvcktpdC5jb3B5QWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBJTlNFUlQiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBERUxFVEUiLCBEZWZhdWx0RWRpdG9yS2l0LmN1dEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBBIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3RBbGxBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgQkFDS19TTEFTSCIsICJ1bnNlbGVjdCIvKkRlZmF1bHRFZGl0b3JLaXQudW5zZWxlY3RBY3Rpb24qLywKKyAgICAgICAgICAgICAgICAic2hpZnQgTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uQmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IFJJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25Gb3J3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIExFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnByZXZpb3VzV29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQubmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgc2hpZnQgTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uUHJldmlvdXNXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIHNoaWZ0IFJJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25OZXh0V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiSE9NRSIsIERlZmF1bHRFZGl0b3JLaXQuYmVnaW5MaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJFTkQiLCBEZWZhdWx0RWRpdG9yS2l0LmVuZExpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IEhPTUUiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkJlZ2luTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgRU5EIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25FbmRMaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgQkFDS19TUEFDRSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgSCIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgIkRFTEVURSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlTmV4dENoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVOZXh0V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LmZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIkxFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LmJhY2t3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiS1BfTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuYmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIkVOVEVSIiwgSlRleHRGaWVsZC5ub3RpZnlBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgc2hpZnQgTyIsICJ0b2dnbGUtY29tcG9uZW50T3JpZW50YXRpb24iLypEZWZhdWx0RWRpdG9yS2l0LnRvZ2dsZUNvbXBvbmVudE9yaWVudGF0aW9uKi8KKyAgICAgICAgfSk7CisgICAgICAgIE9iamVjdCBwYXNzd29yZElucHV0TWFwID0gbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAiY29udHJvbCBDIiwgRGVmYXVsdEVkaXRvcktpdC5jb3B5QWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIFYiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIFgiLCBEZWZhdWx0RWRpdG9yS2l0LmN1dEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiQ09QWSIsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiUEFTVEUiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICJDVVQiLCBEZWZhdWx0RWRpdG9yS2l0LmN1dEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBJTlNFUlQiLCBEZWZhdWx0RWRpdG9yS2l0LmNvcHlBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IERFTEVURSIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIEEiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdEFsbEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBCQUNLX1NMQVNIIiwgInVuc2VsZWN0Ii8qRGVmYXVsdEVkaXRvcktpdC51bnNlbGVjdEFjdGlvbiovLAorICAgICAgICAgICAgICAgICJzaGlmdCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuYmVnaW5MaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIFJJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5lbmRMaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIHNoaWZ0IExFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkJlZ2luTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uRW5kTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiSE9NRSIsIERlZmF1bHRFZGl0b3JLaXQuYmVnaW5MaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJFTkQiLCBEZWZhdWx0RWRpdG9yS2l0LmVuZExpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IEhPTUUiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkJlZ2luTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgRU5EIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25FbmRMaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgQkFDS19TUEFDRSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgSCIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgIkRFTEVURSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlTmV4dENoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgIlJJR0hUIiwgRGVmYXVsdEVkaXRvcktpdC5mb3J3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5iYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LmZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIktQX0xFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LmJhY2t3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJFTlRFUiIsIEpUZXh0RmllbGQubm90aWZ5QWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIHNoaWZ0IE8iLCAidG9nZ2xlLWNvbXBvbmVudE9yaWVudGF0aW9uIi8qRGVmYXVsdEVkaXRvcktpdC50b2dnbGVDb21wb25lbnRPcmllbnRhdGlvbiovCisgICAgICAgIH0pOworICAgICAgICBPYmplY3QgbXVsdGlsaW5lSW5wdXRNYXAgPSBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICJjb250cm9sIEMiLCBEZWZhdWx0RWRpdG9yS2l0LmNvcHlBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgViIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgWCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICJDT1BZIiwgRGVmYXVsdEVkaXRvcktpdC5jb3B5QWN0aW9uLAorICAgICAgICAgICAgICAgICJQQVNURSIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgIkNVVCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIElOU0VSVCIsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgSU5TRVJUIiwgRGVmYXVsdEVkaXRvcktpdC5wYXN0ZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5jdXRBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IExFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkJhY2t3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uRm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5wcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0Lm5leHRXb3JkQWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIHNoaWZ0IExFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvblByZXZpb3VzV29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgImNvbnRyb2wgQSIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0QWxsQWN0aW9uLAorICAgICAgICAgICAgICAgICJjb250cm9sIEJBQ0tfU0xBU0giLCAidW5zZWxlY3QiLypEZWZhdWx0RWRpdG9yS2l0LnVuc2VsZWN0QWN0aW9uKi8sCisgICAgICAgICAgICAgICAgIkhPTUUiLCBEZWZhdWx0RWRpdG9yS2l0LmJlZ2luTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiRU5EIiwgRGVmYXVsdEVkaXRvcktpdC5lbmRMaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICJzaGlmdCBIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CZWdpbkxpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgInNoaWZ0IEVORCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uRW5kTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5iZWdpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBFTkQiLCBEZWZhdWx0RWRpdG9yS2l0LmVuZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CZWdpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBFTkQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkVuZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiVVAiLCBEZWZhdWx0RWRpdG9yS2l0LnVwQWN0aW9uLAorICAgICAgICAgICAgICAgICJET1dOIiwgRGVmYXVsdEVkaXRvcktpdC5kb3duQWN0aW9uLAorICAgICAgICAgICAgICAgICJCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgQkFDS19TUEFDRSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgSCIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgIkRFTEVURSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlTmV4dENoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgImN0cmwgREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVOZXh0V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LmZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIkxFRlQiLCBEZWZhdWx0RWRpdG9yS2l0LmJhY2t3YXJkQWN0aW9uLAorICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiS1BfTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuYmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgIlBBR0VfVVAiLCBEZWZhdWx0RWRpdG9yS2l0LnBhZ2VVcEFjdGlvbiwKKyAgICAgICAgICAgICAgICAiUEFHRV9ET1dOIiwgRGVmYXVsdEVkaXRvcktpdC5wYWdlRG93bkFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgUEFHRV9VUCIsICJzZWxlY3Rpb24tcGFnZS11cCIsCisgICAgICAgICAgICAgICAgInNoaWZ0IFBBR0VfRE9XTiIsICJzZWxlY3Rpb24tcGFnZS1kb3duIiwKKyAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBQQUdFX1VQIiwgInNlbGVjdGlvbi1wYWdlLWxlZnQiLAorICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFBBR0VfRE9XTiIsICJzZWxlY3Rpb24tcGFnZS1yaWdodCIsCisgICAgICAgICAgICAgICAgInNoaWZ0IFVQIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25VcEFjdGlvbiwKKyAgICAgICAgICAgICAgICAic2hpZnQgRE9XTiIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uRG93bkFjdGlvbiwKKyAgICAgICAgICAgICAgICAiRU5URVIiLCBEZWZhdWx0RWRpdG9yS2l0Lmluc2VydEJyZWFrQWN0aW9uLAorICAgICAgICAgICAgICAgICJUQUIiLCBEZWZhdWx0RWRpdG9yS2l0Lmluc2VydFRhYkFjdGlvbiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBUIiwgIm5leHQtbGluay1hY3Rpb24iLAorICAgICAgICAgICAgICAgICJjb250cm9sIHNoaWZ0IFQiLCAicHJldmlvdXMtbGluay1hY3Rpb24iLAorICAgICAgICAgICAgICAgICJjb250cm9sIFNQQUNFIiwgImFjdGl2YXRlLWxpbmstYWN0aW9uIiwKKyAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBPIiwgInRvZ2dsZS1jb21wb25lbnRPcmllbnRhdGlvbiIvKkRlZmF1bHRFZGl0b3JLaXQudG9nZ2xlQ29tcG9uZW50T3JpZW50YXRpb24qLworICAgICAgICB9KTsKKyAgICAgICAgT2JqZWN0W10gZGVmYXVsdHMgPSB7CisgICAgICAgICAgICAgICAgIlRleHRGaWVsZC5mb2N1c0lucHV0TWFwIiwgZmllbGRJbnB1dE1hcCwKKyAgICAgICAgICAgICAgICAiUGFzc3dvcmRGaWVsZC5mb2N1c0lucHV0TWFwIiwgcGFzc3dvcmRJbnB1dE1hcCwKKyAgICAgICAgICAgICAgICAiVGV4dEFyZWEuZm9jdXNJbnB1dE1hcCIsIG11bHRpbGluZUlucHV0TWFwLAorICAgICAgICAgICAgICAgICJUZXh0UGFuZS5mb2N1c0lucHV0TWFwIiwgbXVsdGlsaW5lSW5wdXRNYXAsCisgICAgICAgICAgICAgICAgIkVkaXRvclBhbmUuZm9jdXNJbnB1dE1hcCIsIG11bHRpbGluZUlucHV0TWFwLAorICAgICAgICAgICAgICAgICJCdXR0b24uZm9jdXNJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJwcmVzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlZCBTUEFDRSIsICJyZWxlYXNlZCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiQ2hlY2tCb3guZm9jdXNJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJwcmVzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlZCBTUEFDRSIsICJyZWxlYXNlZCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiQ29tYm9Cb3guYW5jZXN0b3JJbnB1dE1hcCIsIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgImhpZGVQb3B1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9VUCIsICJwYWdlVXBQYXNzVGhyb3VnaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9ET1dOIiwgInBhZ2VEb3duUGFzc1Rocm91Z2giLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhPTUUiLCAiaG9tZVBhc3NUaHJvdWdoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTkQiLCAiZW5kUGFzc1Rocm91Z2giLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRPV04iLCAic2VsZWN0TmV4dDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAic2VsZWN0TmV4dDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVQIiwgInNlbGVjdFByZXZpb3VzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAic2VsZWN0UHJldmlvdXMyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTlRFUiIsICJlbnRlclByZXNzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkY0IiwgInRvZ2dsZVBvcHVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbHQgRE9XTiIsICJ0b2dnbGVQb3B1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IEtQX0RPV04iLCAidG9nZ2xlUG9wdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFsdCBVUCIsICJ0b2dnbGVQb3B1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IEtQX1VQIiwgInRvZ2dsZVBvcHVwIgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJEZXNrdG9wLmFuY2VzdG9ySW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBGNSIsICJyZXN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEY0IiwgImNsb3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEY3IiwgIm1vdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRjgiLCAicmVzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJyaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAicmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAibGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfTEVGVCIsICJsZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJ1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAidXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRPV04iLCAiZG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfRE9XTiIsICJkb3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFU0NBUEUiLCAiZXNjYXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEY5IiwgIm1pbmltaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEYxMCIsICJtYXhpbWl6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBGNiIsICJzZWxlY3ROZXh0RnJhbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgVEFCIiwgInNlbGVjdE5leHRGcmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBhbHQgRjYiLCAic2VsZWN0TmV4dEZyYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBjdHJsIGFsdCBGNiIsICJzZWxlY3RQcmV2aW91c0ZyYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEYxMiIsICJuYXZpZ2F0ZU5leHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IGN0cmwgRjEyIiwgIm5hdmlnYXRlUHJldmlvdXMiCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIkZpbGVDaG9vc2VyLmFuY2VzdG9ySW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgImNhbmNlbFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRjIiLCAiZWRpdEZpbGVOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGNSIsICJyZWZyZXNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCQUNLX1NQQUNFIiwgIkdvIFVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTlRFUiIsICJhcHByb3ZlU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEVOVEVSIiwgImFwcHJvdmVTZWxlY3Rpb24iCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIkludGVybmFsRnJhbWUud2luZG93QmluZGluZ3MiLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgRVNDQVBFIiwgInNob3dTeXN0ZW1NZW51IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFNQQUNFIiwgInNob3dTeXN0ZW1NZW51IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFU0NBUEUiLCAiaGlkZVN5c3RlbU1lbnUiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiTGlzdC5mb2N1c0lucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQyIsICJjb3B5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFYiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgWCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNPUFkiLCAiY29weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFTVEUiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNVVCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgSU5TRVJUIiwgImNvcHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsICJwYXN0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgImN1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVVAiLCAic2VsZWN0UHJldmlvdXNSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgInNlbGVjdFByZXZpb3VzUm93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBVUCIsICJzZWxlY3RQcmV2aW91c1Jvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgVVAiLCAic2VsZWN0UHJldmlvdXNSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgVVAiLCAic2VsZWN0UHJldmlvdXNSb3dDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX1VQIiwgInNlbGVjdFByZXZpb3VzUm93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJzZWxlY3ROZXh0Um93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgInNlbGVjdE5leHRSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IERPV04iLCAic2VsZWN0TmV4dFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfRE9XTiIsICJzZWxlY3ROZXh0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IERPV04iLCAic2VsZWN0TmV4dFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9ET1dOIiwgInNlbGVjdE5leHRSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRE9XTiIsICJzZWxlY3ROZXh0Um93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9ET1dOIiwgInNlbGVjdE5leHRSb3dDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IExFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfTEVGVCIsICJzZWxlY3RQcmV2aW91c0NvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBSSUdIVCIsICJzZWxlY3ROZXh0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEtQX1JJR0hUIiwgInNlbGVjdE5leHRDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgS1BfUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkNoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhPTUUiLCAic2VsZWN0Rmlyc3RSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEhPTUUiLCAic2VsZWN0Rmlyc3RSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgSE9NRSIsICJzZWxlY3RGaXJzdFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBIT01FIiwgInNlbGVjdEZpcnN0Um93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5EIiwgInNlbGVjdExhc3RSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEVORCIsICJzZWxlY3RMYXN0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEVORCIsICJzZWxlY3RMYXN0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEVORCIsICJzZWxlY3RMYXN0Um93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9VUCIsICJzY3JvbGxVcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUEFHRV9VUCIsICJzY3JvbGxVcEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBQQUdFX1VQIiwgInNjcm9sbFVwRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFBBR0VfVVAiLCAic2Nyb2xsVXBDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX0RPV04iLCAic2Nyb2xsRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUEFHRV9ET1dOIiwgInNjcm9sbERvd25FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgUEFHRV9ET1dOIiwgInNjcm9sbERvd25FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9ET1dOIiwgInNjcm9sbERvd25DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEEiLCAic2VsZWN0QWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFNMQVNIIiwgInNlbGVjdEFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NMQVNIIiwgImNsZWFyU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJhZGRUb1NlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBTUEFDRSIsICJ0b2dnbGVBbmRBbmNob3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFNQQUNFIiwgImV4dGVuZFRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFNQQUNFIiwgIm1vdmVTZWxlY3Rpb25UbyIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiTWVudUJhci53aW5kb3dCaW5kaW5ncyIsIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJGMTAiLCAidGFrZUZvY3VzIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIlJhZGlvQnV0dG9uLmZvY3VzSW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiU1BBQ0UiLCAicHJlc3NlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZWQgU1BBQ0UiLCAicmVsZWFzZWQiCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIk9wdGlvblBhbmUud2luZG93QmluZGluZ3MiLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgImNsb3NlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIkZvcm1hdHRlZFRleHRGaWVsZC5mb2N1c0lucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQyIsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFYiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgWCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNPUFkiLCBEZWZhdWx0RWRpdG9yS2l0LmNvcHlBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFTVEUiLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNVVCIsIERlZmF1bHRFZGl0b3JLaXQuY3V0QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgSU5TRVJUIiwgRGVmYXVsdEVkaXRvcktpdC5jb3B5QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5jdXRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uQmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfTEVGVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uQmFja3dhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfUklHSFQiLCBEZWZhdWx0RWRpdG9yS2l0LnNlbGVjdGlvbkZvcndhcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5wcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5wcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQubmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQubmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25QcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25QcmV2aW91c1dvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuc2VsZWN0aW9uTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBBIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3RBbGxBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiSE9NRSIsIERlZmF1bHRFZGl0b3JLaXQuYmVnaW5MaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVORCIsIERlZmF1bHRFZGl0b3JLaXQuZW5kTGluZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBIT01FIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25CZWdpbkxpbmVBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgRU5EIiwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3Rpb25FbmRMaW5lQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJBQ0tfU1BBQ0UiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZVByZXZDaGFyQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEJBQ0tfU1BBQ0UiLCBEZWZhdWx0RWRpdG9yS2l0LmRlbGV0ZVByZXZDaGFyQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgSCIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiREVMRVRFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVOZXh0Q2hhckFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIERFTEVURSIsIERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlTmV4dFdvcmRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBCQUNLX1NQQUNFIiwgRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2V29yZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5iYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsIERlZmF1bHRFZGl0b3JLaXQuZm9yd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgRGVmYXVsdEVkaXRvcktpdC5iYWNrd2FyZEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTlRFUiIsIEpUZXh0RmllbGQubm90aWZ5QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQkFDS19TTEFTSCIsICJ1bnNlbGVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBzaGlmdCBPIiwgInRvZ2dsZS1jb21wb25lbnRPcmllbnRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRVNDQVBFIiwgInJlc2V0LWZpZWxkLWVkaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVQIiwgImluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAiaW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJET1dOIiwgImRlY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfRE9XTiIsICJkZWNyZW1lbnQiLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIC8vIFRoZXNlIGJpbmRpbmdzIGFyZSBvbmx5IGVuYWJsZWQgd2hlbiB0aGVyZSBpcyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAvLyBidXR0b24gc2V0IG9uIHRoZSByb290cGFuZS4KKyAgICAgICAgICAgICAgICAiUm9vdFBhbmUuZGVmYXVsdEJ1dHRvbldpbmRvd0tleUJpbmRpbmdzIiwgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIkVOVEVSIiwgInByZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlZCBFTlRFUiIsICJyZWxlYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEVOVEVSIiwgInByZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHJlbGVhc2VkIEVOVEVSIiwgInJlbGVhc2UiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiU2Nyb2xsQmFyLmFuY2VzdG9ySW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAicG9zaXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsICJwb3NpdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRPV04iLCAicG9zaXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgInBvc2l0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9ET1dOIiwgInBvc2l0aXZlQmxvY2tJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9ET1dOIiwgInBvc2l0aXZlQmxvY2tJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgIm5lZ2F0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVVAiLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9VUCIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBR0VfVVAiLCAibmVnYXRpdmVCbG9ja0luY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX1VQIiwgIm5lZ2F0aXZlQmxvY2tJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhPTUUiLCAibWluU2Nyb2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFTkQiLCAibWF4U2Nyb2xsIgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJTY3JvbGxQYW5lLmFuY2VzdG9ySW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAidW5pdFNjcm9sbFJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsICJ1bml0U2Nyb2xsUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRPV04iLCAidW5pdFNjcm9sbERvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAidW5pdFNjcm9sbERvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAidW5pdFNjcm9sbExlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAidW5pdFNjcm9sbExlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVQIiwgInVuaXRTY3JvbGxVcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAidW5pdFNjcm9sbFVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX1VQIiwgInNjcm9sbFVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX0RPV04iLCAic2Nyb2xsRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX1VQIiwgInNjcm9sbExlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9ET1dOIiwgInNjcm9sbFJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEhPTUUiLCAic2Nyb2xsSG9tZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBFTkQiLCAic2Nyb2xsRW5kIgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJTbGlkZXIuZm9jdXNJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJwb3NpdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgInBvc2l0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0RPV04iLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX0RPV04iLCAibmVnYXRpdmVCbG9ja0luY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJuZWdhdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAibmVnYXRpdmVVbml0SW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJwb3NpdGl2ZVVuaXRJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgInBvc2l0aXZlVW5pdEluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9VUCIsICJwb3NpdGl2ZUJsb2NrSW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIT01FIiwgIm1pblNjcm9sbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5EIiwgIm1heFNjcm9sbCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiU3Bpbm5lci5hbmNlc3RvcklucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIlVQIiwgImluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAiaW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJET1dOIiwgImRlY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfRE9XTiIsICJkZWNyZW1lbnQiLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJTcGxpdFBhbmUuYW5jZXN0b3JJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJuZWdhdGl2ZUluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJwb3NpdGl2ZUluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJuZWdhdGl2ZUluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAicG9zaXRpdmVJbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgIm5lZ2F0aXZlSW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgInBvc2l0aXZlSW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgIm5lZ2F0aXZlSW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsICJwb3NpdGl2ZUluY3JlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiSE9NRSIsICJzZWxlY3RNaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVORCIsICJzZWxlY3RNYXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkY4IiwgInN0YXJ0UmVzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGNiIsICJ0b2dnbGVGb2N1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBUQUIiLCAiZm9jdXNPdXRGb3J3YXJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFRBQiIsICJmb2N1c091dEJhY2t3YXJkIgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJUYWJiZWRQYW5lLmZvY3VzSW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAibmF2aWdhdGVSaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAibmF2aWdhdGVSaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJuYXZpZ2F0ZUxlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAibmF2aWdhdGVMZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJuYXZpZ2F0ZVVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9VUCIsICJuYXZpZ2F0ZVVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJET1dOIiwgIm5hdmlnYXRlRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfRE9XTiIsICJuYXZpZ2F0ZURvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRE9XTiIsICJyZXF1ZXN0Rm9jdXNGb3JWaXNpYmxlQ29tcG9uZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX0RPV04iLCAicmVxdWVzdEZvY3VzRm9yVmlzaWJsZUNvbXBvbmVudCIsCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgIlRhYmJlZFBhbmUuYW5jZXN0b3JJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFRBQiIsICJuYXZpZ2F0ZU5leHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgVEFCIiwgIm5hdmlnYXRlUHJldmlvdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9ET1dOIiwgIm5hdmlnYXRlUGFnZURvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9VUCIsICJuYXZpZ2F0ZVBhZ2VVcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBVUCIsICJyZXF1ZXN0Rm9jdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgS1BfVVAiLCAicmVxdWVzdEZvY3VzIiwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiVGFibGVIZWFkZXIuYW5jZXN0b3JJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1BBQ0UiLCAidG9nZ2xlU29ydE9yZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJzZWxlY3RDb2x1bW5Ub0xlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInNlbGVjdENvbHVtblRvTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUklHSFQiLCAic2VsZWN0Q29sdW1uVG9SaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAic2VsZWN0Q29sdW1uVG9SaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IExFRlQiLCAibW92ZUNvbHVtbkxlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdCBLUF9MRUZUIiwgIm1vdmVDb2x1bW5MZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdCBSSUdIVCIsICJtb3ZlQ29sdW1uUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IEtQX1JJR0hUIiwgIm1vdmVDb2x1bW5SaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IHNoaWZ0IExFRlQiLCAicmVzaXplTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWx0IHNoaWZ0IEtQX0xFRlQiLCAicmVzaXplTGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHQgc2hpZnQgUklHSFQiLCAicmVzaXplUmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAiYWx0IHNoaWZ0IEtQX1JJR0hUIiwgInJlc2l6ZVJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVTQ0FQRSIsICJmb2N1c1RhYmxlIiwKKyAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiVGFibGUuYW5jZXN0b3JJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEMiLCAiY29weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBWIiwgInBhc3RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFgiLCAiY3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDT1BZIiwgImNvcHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBU1RFIiwgInBhc3RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDVVQiLCAiY3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIElOU0VSVCIsICJjb3B5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBJTlNFUlQiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IERFTEVURSIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlJJR0hUIiwgInNlbGVjdE5leHRDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1JJR0hUIiwgInNlbGVjdE5leHRDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFJJR0hUIiwgInNlbGVjdE5leHRDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEtQX1JJR0hUIiwgInNlbGVjdE5leHRDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgUklHSFQiLCAic2VsZWN0TmV4dENvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9SSUdIVCIsICJzZWxlY3ROZXh0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFJJR0hUIiwgInNlbGVjdE5leHRDb2x1bW5DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX1JJR0hUIiwgInNlbGVjdE5leHRDb2x1bW5DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IExFRlQiLCAic2VsZWN0UHJldmlvdXNDb2x1bW5FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfTEVGVCIsICJzZWxlY3RQcmV2aW91c0NvbHVtbkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBMRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9MRUZUIiwgInNlbGVjdFByZXZpb3VzQ29sdW1uQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJzZWxlY3ROZXh0Um93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgInNlbGVjdE5leHRSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IERPV04iLCAic2VsZWN0TmV4dFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfRE9XTiIsICJzZWxlY3ROZXh0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IERPV04iLCAic2VsZWN0TmV4dFJvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9ET1dOIiwgInNlbGVjdE5leHRSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRE9XTiIsICJzZWxlY3ROZXh0Um93Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9ET1dOIiwgInNlbGVjdE5leHRSb3dDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVUCIsICJzZWxlY3RQcmV2aW91c1JvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfVVAiLCAic2VsZWN0UHJldmlvdXNSb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFVQIiwgInNlbGVjdFByZXZpb3VzUm93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBLUF9VUCIsICJzZWxlY3RQcmV2aW91c1Jvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBVUCIsICJzZWxlY3RQcmV2aW91c1Jvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9VUCIsICJzZWxlY3RQcmV2aW91c1Jvd0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBVUCIsICJzZWxlY3RQcmV2aW91c1Jvd0NoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNSb3dDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIT01FIiwgInNlbGVjdEZpcnN0Q29sdW1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBIT01FIiwgInNlbGVjdEZpcnN0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEhPTUUiLCAic2VsZWN0Rmlyc3RSb3dFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgSE9NRSIsICJzZWxlY3RGaXJzdFJvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRU5EIiwgInNlbGVjdExhc3RDb2x1bW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IEVORCIsICJzZWxlY3RMYXN0Q29sdW1uRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEVORCIsICJzZWxlY3RMYXN0Um93RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEVORCIsICJzZWxlY3RMYXN0Um93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX1VQIiwgInNjcm9sbFVwQ2hhbmdlU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBQQUdFX1VQIiwgInNjcm9sbFVwRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFBBR0VfVVAiLCAic2Nyb2xsTGVmdEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBQQUdFX1VQIiwgInNjcm9sbExlZnRDaGFuZ2VTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBBR0VfRE9XTiIsICJzY3JvbGxEb3duQ2hhbmdlU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBQQUdFX0RPV04iLCAic2Nyb2xsRG93bkV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBQQUdFX0RPV04iLCAic2Nyb2xsUmlnaHRFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9ET1dOIiwgInNjcm9sbFJpZ2h0Q2hhbmdlU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUQUIiLCAic2VsZWN0TmV4dENvbHVtbkNlbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFRBQiIsICJzZWxlY3RQcmV2aW91c0NvbHVtbkNlbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVOVEVSIiwgInNlbGVjdE5leHRSb3dDZWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBFTlRFUiIsICJzZWxlY3RQcmV2aW91c1Jvd0NlbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQSIsICJzZWxlY3RBbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgU0xBU0giLCAic2VsZWN0QWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEJBQ0tfU0xBU0giLCAiY2xlYXJTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVTQ0FQRSIsICJjYW5jZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkYyIiwgInN0YXJ0RWRpdGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU1BBQ0UiLCAiYWRkVG9TZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgU1BBQ0UiLCAidG9nZ2xlQW5kQW5jaG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBTUEFDRSIsICJleHRlbmRUbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBTUEFDRSIsICJtb3ZlU2VsZWN0aW9uVG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIkY4IiwgImZvY3VzSGVhZGVyIgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJUb2dnbGVCdXR0b24uZm9jdXNJbnB1dE1hcCIsCisgICAgICAgICAgICAgICAgbmV3IFVJRGVmYXVsdHMuTGF6eUlucHV0TWFwKG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJwcmVzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlZCBTUEFDRSIsICJyZWxlYXNlZCIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiVG9vbEJhci5hbmNlc3RvcklucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIlVQIiwgIm5hdmlnYXRlVXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgIm5hdmlnYXRlVXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRPV04iLCAibmF2aWdhdGVEb3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgIm5hdmlnYXRlRG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCIsICJuYXZpZ2F0ZUxlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX0xFRlQiLCAibmF2aWdhdGVMZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJuYXZpZ2F0ZVJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9SSUdIVCIsICJuYXZpZ2F0ZVJpZ2h0IgorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICJUcmVlLmZvY3VzSW5wdXRNYXAiLAorICAgICAgICAgICAgICAgIG5ldyBVSURlZmF1bHRzLkxhenlJbnB1dE1hcChuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgICAiQUREIiwgImV4cGFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU1VCVFJBQ1QiLCAiY29sbGFwc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQyIsICJjb3B5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFYiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgWCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNPUFkiLCAiY29weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFTVEUiLCAicGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNVVCIsICJjdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgSU5TRVJUIiwgImNvcHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IElOU0VSVCIsICJwYXN0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgREVMRVRFIiwgImN1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVVAiLCAic2VsZWN0UHJldmlvdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIktQX1VQIiwgInNlbGVjdFByZXZpb3VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBVUCIsICJzZWxlY3RQcmV2aW91c0V4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgVVAiLCAic2VsZWN0UHJldmlvdXNFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgS1BfVVAiLCAic2VsZWN0UHJldmlvdXNFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgVVAiLCAic2VsZWN0UHJldmlvdXNDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX1VQIiwgInNlbGVjdFByZXZpb3VzQ2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRE9XTiIsICJzZWxlY3ROZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9ET1dOIiwgInNlbGVjdE5leHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IERPV04iLCAic2VsZWN0TmV4dEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgS1BfRE9XTiIsICJzZWxlY3ROZXh0RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IERPV04iLCAic2VsZWN0TmV4dEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBLUF9ET1dOIiwgInNlbGVjdE5leHRFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgRE9XTiIsICJzZWxlY3ROZXh0Q2hhbmdlTGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBLUF9ET1dOIiwgInNlbGVjdE5leHRDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSSUdIVCIsICJzZWxlY3RDaGlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS1BfUklHSFQiLCAic2VsZWN0Q2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQiLCAic2VsZWN0UGFyZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLUF9MRUZUIiwgInNlbGVjdFBhcmVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUEFHRV9VUCIsICJzY3JvbGxVcENoYW5nZVNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUEFHRV9VUCIsICJzY3JvbGxVcEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBQQUdFX1VQIiwgInNjcm9sbFVwRXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFBBR0VfVVAiLCAic2Nyb2xsVXBDaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQQUdFX0RPV04iLCAic2Nyb2xsRG93bkNoYW5nZVNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hpZnQgUEFHRV9ET1dOIiwgInNjcm9sbERvd25FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgc2hpZnQgUEFHRV9ET1dOIiwgInNjcm9sbERvd25FeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgUEFHRV9ET1dOIiwgInNjcm9sbERvd25DaGFuZ2VMZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIT01FIiwgInNlbGVjdEZpcnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBIT01FIiwgInNlbGVjdEZpcnN0RXh0ZW5kU2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IEhPTUUiLCAic2VsZWN0Rmlyc3RFeHRlbmRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgSE9NRSIsICJzZWxlY3RGaXJzdENoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVORCIsICJzZWxlY3RMYXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaGlmdCBFTkQiLCAic2VsZWN0TGFzdEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBzaGlmdCBFTkQiLCAic2VsZWN0TGFzdEV4dGVuZFNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBFTkQiLCAic2VsZWN0TGFzdENoYW5nZUxlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkYyIiwgInN0YXJ0RWRpdGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBBIiwgInNlbGVjdEFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBTTEFTSCIsICJzZWxlY3RBbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgQkFDS19TTEFTSCIsICJjbGVhclNlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBMRUZUIiwgInNjcm9sbExlZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImN0cmwgS1BfTEVGVCIsICJzY3JvbGxMZWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIFJJR0hUIiwgInNjcm9sbFJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIEtQX1JJR0hUIiwgInNjcm9sbFJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUEFDRSIsICJhZGRUb1NlbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3RybCBTUEFDRSIsICJ0b2dnbGVBbmRBbmNob3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgInNoaWZ0IFNQQUNFIiwgImV4dGVuZFRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdHJsIHNoaWZ0IFNQQUNFIiwgIm1vdmVTZWxlY3Rpb25UbyIKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAiVHJlZS5hbmNlc3RvcklucHV0TWFwIiwKKyAgICAgICAgICAgICAgICBuZXcgVUlEZWZhdWx0cy5MYXp5SW5wdXRNYXAobmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgIkVTQ0FQRSIsICJjYW5jZWwiCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgIH07CisgICAgICAgIHRhYmxlLnB1dERlZmF1bHRzKGRlZmF1bHRzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvcGxhZi9zeW50aC9TeW50aEZpbGVDaG9vc2VyVUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvcGxhZi9zeW50aC9TeW50aEZpbGVDaG9vc2VyVUkuamF2YQppbmRleCA4NGQ1MjIxLi5kZGUwMDY4IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL3BsYWYvc3ludGgvU3ludGhGaWxlQ2hvb3NlclVJLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zd2luZy9wbGFmL3N5bnRoL1N5bnRoRmlsZUNob29zZXJVSS5qYXZhCkBAIC0xODMsMTQgKzE4Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBY3Rpb25NYXAgY3JlYXRlQWN0aW9uTWFwKCkgewotICAgICAgICBBY3Rpb25NYXAgbWFwID0gbmV3IEFjdGlvbk1hcFVJUmVzb3VyY2UoKTsKLSAgICAgICAgbWFwLnB1dCgiYXBwcm92ZVNlbGVjdGlvbiIsIGdldEFwcHJvdmVTZWxlY3Rpb25BY3Rpb24oKSk7Ci0gICAgICAgIG1hcC5wdXQoImNhbmNlbFNlbGVjdGlvbiIsIGdldENhbmNlbFNlbGVjdGlvbkFjdGlvbigpKTsKLSAgICAgICAgbWFwLnB1dCgiR28gVXAiLCBnZXRDaGFuZ2VUb1BhcmVudERpcmVjdG9yeUFjdGlvbigpKTsKLSAgICAgICAgbWFwLnB1dCgiZmlsZU5hbWVDb21wbGV0aW9uIiwgZ2V0RmlsZU5hbWVDb21wbGV0aW9uQWN0aW9uKCkpOwotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWN0aW9uTWFwIGNyZWF0ZUFjdGlvbk1hcCgpOwogCiAKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsRGVmYXVsdHMoSkZpbGVDaG9vc2VyIGZjKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL3BsYWYvc3ludGgvU3ludGhGaWxlQ2hvb3NlclVJSW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zd2luZy9wbGFmL3N5bnRoL1N5bnRoRmlsZUNob29zZXJVSUltcGwuamF2YQppbmRleCA3MDY5YzM5Li5hMmE0YjJlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL3BsYWYvc3ludGgvU3ludGhGaWxlQ2hvb3NlclVJSW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvcGxhZi9zeW50aC9TeW50aEZpbGVDaG9vc2VyVUlJbXBsLmphdmEKQEAgLTM4LDggKzM4LDcgQEAKIGltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuKjsKIGltcG9ydCBqYXZheC5zd2luZy5wbGFmLnN5bnRoLio7Ci0KLWltcG9ydCBzdW4uc3dpbmcuU3dpbmdVdGlsaXRpZXMyOworaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuQWN0aW9uTWFwVUlSZXNvdXJjZTsKIAogaW1wb3J0IHN1bi5hd3Quc2hlbGwuU2hlbGxGb2xkZXI7CiBpbXBvcnQgc3VuLnN3aW5nLio7CkBAIC0yODYsOSArMjg1LDkgQEAKICAgICAgICAgYi5zZXRBbGlnbm1lbnRYKEpDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOwogICAgICAgICBiLnNldEFsaWdubWVudFkoSkNvbXBvbmVudC5DRU5URVJfQUxJR05NRU5UKTsKICAgICAgICAgYi5zZXRNYXJnaW4oc2hyaW5rd3JhcCk7CisgICAgICAgIHRvcEJ1dHRvblBhbmVsLmFkZChiKTsKKyAgICAgICAgdG9wQnV0dG9uUGFuZWwuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEoaHN0cnV0NSkpOwogICAgIH0KLSAgICB0b3BCdXR0b25QYW5lbC5hZGQoYik7Ci0gICAgdG9wQnV0dG9uUGFuZWwuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEoaHN0cnV0NSkpOwogCiAgICAgLy8gVmlldyBidXR0b24gZ3JvdXAKICAgICBCdXR0b25Hcm91cCB2aWV3QnV0dG9uR3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKQEAgLTUyMSw2ICs1MjAsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJlc2NhbkN1cnJlbnREaXJlY3RvcnkoSkZpbGVDaG9vc2VyIGZjKSB7CisgICAgICAgIGZpbGVQYW5lLnJlc2NhbkN1cnJlbnREaXJlY3RvcnkoKTsKKyAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBkb1NlbGVjdGVkRmlsZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7CiAgICAgICAgIHN1cGVyLmRvU2VsZWN0ZWRGaWxlQ2hhbmdlZChlKTsKQEAgLTYzNSw2ICs2MzcsMTQgQEAKICAgICAvLyAqKioqKioqKioqKiogRmlsZUNob29zZXIgVUkgUExBRiBtZXRob2RzICoqKioqKioqKioqKioqCiAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCisgICAgcHJvdGVjdGVkIEFjdGlvbk1hcCBjcmVhdGVBY3Rpb25NYXAoKSB7CisgICAgICAgIEFjdGlvbk1hcCBtYXAgPSBuZXcgQWN0aW9uTWFwVUlSZXNvdXJjZSgpOworICAgICAgICAvLyBhZGQgc3RhbmRhcmQgYWN0aW9ucworICAgICAgICBGaWxlUGFuZS5hZGRBY3Rpb25zVG9NYXAobWFwLCBmaWxlUGFuZS5nZXRBY3Rpb25zKCkpOworICAgICAgICAvLyBhZGQgc3ludGggb25seSBhY3Rpb25zCisgICAgICAgIG1hcC5wdXQoImZpbGVOYW1lQ29tcGxldGlvbiIsIGdldEZpbGVOYW1lQ29tcGxldGlvbkFjdGlvbigpKTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CiAKICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIC8vICoqKioqIERpcmVjdG9yeSBBY3Rpb25zICoqKioqCkBAIC02NDksMzIgKzY1OSw0NCBAQAogICAgIH0KIAogICAgIHByb3RlY3RlZCBEaXJlY3RvcnlDb21ib0JveFJlbmRlcmVyIGNyZWF0ZURpcmVjdG9yeUNvbWJvQm94UmVuZGVyZXIoSkZpbGVDaG9vc2VyIGZjKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGlyZWN0b3J5Q29tYm9Cb3hSZW5kZXJlcigpOworICAgICAgICByZXR1cm4gbmV3IERpcmVjdG9yeUNvbWJvQm94UmVuZGVyZXIoZGlyZWN0b3J5Q29tYm9Cb3guZ2V0UmVuZGVyZXIoKSk7CiAgICAgfQogCiAgICAgLy8KICAgICAvLyBSZW5kZXJlciBmb3IgRGlyZWN0b3J5Q29tYm9Cb3gKICAgICAvLwotICAgIGNsYXNzIERpcmVjdG9yeUNvbWJvQm94UmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlciAgeworICAgIC8vIFN5bnRoIGhhcyBzb21lIG9kZCBiZWhhdmlvciB3aXRoIHJlZ2FyZHMgdG8gcmVuZGVyZXJzLiBSZW5kZXJlcnMgYXJlIHN0eWxlZAorICAgIC8vIGluIGEgc3BlY2lmaWMgbWFubmVyIGJ5IHRoZSBTeW50aENvbWJvQm94VUkuIElmIHdlIGV4dGVuZCBEZWZhdWx0TGlzdENlbGxSZW5kZXJlcgorICAgIC8vIGhlcmUsIHRoZW4gd2UgZ2V0IG5vbmUgb2YgdGhvc2UgYmVuZWZpdHMgb3IgYmVoYXZpb3JzLCBsZWFkaW5nIHRvIHBvb3IKKyAgICAvLyBsb29raW5nIGNvbWJvIGJveGVzLgorICAgIC8vIFNvIHdoYXQgd2UgZG8gaGVyZSBpcyBkZWxlZ2F0ZSBtb3N0IGpvYnMgdG8gdGhlICJyZWFsIiBvciBvcmlnaW5hbCByZW5kZXJlciwKKyAgICAvLyBhbmQgc2ltcGx5IG1vbmtleSB3aXRoIHRoZSBpY29uIGFuZCB0ZXh0IG9mIHRoZSByZW5kZXJlci4KKyAgICBwcml2YXRlIGNsYXNzIERpcmVjdG9yeUNvbWJvQm94UmVuZGVyZXIgaW1wbGVtZW50cyBMaXN0Q2VsbFJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBMaXN0Q2VsbFJlbmRlcmVyIGRlbGVnYXRlOwogICAgICAgICBJbmRlbnRJY29uIGlpID0gbmV3IEluZGVudEljb24oKTsKLSAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgYm9vbGVhbiBpc1NlbGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKIAotICAgICAgICAgICAgc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cyk7CisgICAgICAgIHByaXZhdGUgRGlyZWN0b3J5Q29tYm9Cb3hSZW5kZXJlcihMaXN0Q2VsbFJlbmRlcmVyIGRlbGVnYXRlKSB7CisgICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7CisgICAgICAgICAgICBDb21wb25lbnQgYyA9IGRlbGVnYXRlLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOworCisgICAgICAgICAgICBhc3NlcnQgYyBpbnN0YW5jZW9mIEpMYWJlbDsKKyAgICAgICAgICAgIEpMYWJlbCBsYWJlbCA9IChKTGFiZWwpYzsKICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCgiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSAoRmlsZSl2YWx1ZTsKLSAgICAgICAgICAgIHNldFRleHQoZ2V0RmlsZUNob29zZXIoKS5nZXROYW1lKGRpcmVjdG9yeSkpOworICAgICAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSAoRmlsZSkgdmFsdWU7CisgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGdldEZpbGVDaG9vc2VyKCkuZ2V0TmFtZShkaXJlY3RvcnkpKTsKICAgICAgICAgICAgIEljb24gaWNvbiA9IGdldEZpbGVDaG9vc2VyKCkuZ2V0SWNvbihkaXJlY3RvcnkpOwogICAgICAgICAgICAgaWkuaWNvbiA9IGljb247CiAgICAgICAgICAgICBpaS5kZXB0aCA9IGRpcmVjdG9yeUNvbWJvQm94TW9kZWwuZ2V0RGVwdGgoaW5kZXgpOwotICAgICAgICAgICAgc2V0SWNvbihpaSk7CisgICAgICAgICAgICBsYWJlbC5zZXRJY29uKGlpKTsKIAotICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICByZXR1cm4gbGFiZWw7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg2MiwyNCArODg0LDMzIEBACiAgICAgLy8gUmVuZGVyZXIgZm9yIFR5cGVzIENvbWJvQm94CiAgICAgLy8KICAgICBwcm90ZWN0ZWQgRmlsdGVyQ29tYm9Cb3hSZW5kZXJlciBjcmVhdGVGaWx0ZXJDb21ib0JveFJlbmRlcmVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEZpbHRlckNvbWJvQm94UmVuZGVyZXIoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJDb21ib0JveFJlbmRlcmVyKGZpbHRlckNvbWJvQm94LmdldFJlbmRlcmVyKCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlbmRlciBkaWZmZXJlbnQgdHlwZSBzaXplcyBhbmQgc3R5bGVzLgogICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBGaWx0ZXJDb21ib0JveFJlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXIgewotICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsCi0gICAgICAgICAgICBib29sZWFuIGNlbGxIYXNGb2N1cykgeworICAgIHB1YmxpYyBjbGFzcyBGaWx0ZXJDb21ib0JveFJlbmRlcmVyIGltcGxlbWVudHMgTGlzdENlbGxSZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgTGlzdENlbGxSZW5kZXJlciBkZWxlZ2F0ZTsKKyAgICAgICAgcHJpdmF0ZSBGaWx0ZXJDb21ib0JveFJlbmRlcmVyKExpc3RDZWxsUmVuZGVyZXIgZGVsZWdhdGUpIHsKKyAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBzdXBlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKKyAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7CisgICAgICAgICAgICBDb21wb25lbnQgYyA9IGRlbGVnYXRlLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwogCisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7CiAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGVGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBzZXRUZXh0KCgoRmlsZUZpbHRlcil2YWx1ZSkuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICAgICAgdGV4dCA9ICgoRmlsZUZpbHRlcikgdmFsdWUpLmdldERlc2NyaXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgLy90aGlzIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgc2luY2UgU3ludGhDb21ib0JveFVJJ3MgU3ludGhDb21ib0JveFJlbmRlcmVyCisgICAgICAgICAgICAvL2V4dGVuZHMgSkxhYmVsCisgICAgICAgICAgICBhc3NlcnQgYyBpbnN0YW5jZW9mIEpMYWJlbDsKKyAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAoKEpMYWJlbCljKS5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvdGFibGUvRGVmYXVsdFRhYmxlQ2VsbEhlYWRlclJlbmRlcmVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3N3aW5nL3RhYmxlL0RlZmF1bHRUYWJsZUNlbGxIZWFkZXJSZW5kZXJlci5qYXZhCmluZGV4IDYxOThmMTQuLjExN2NhM2QgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc3dpbmcvdGFibGUvRGVmYXVsdFRhYmxlQ2VsbEhlYWRlclJlbmRlcmVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zd2luZy90YWJsZS9EZWZhdWx0VGFibGVDZWxsSGVhZGVyUmVuZGVyZXIuamF2YQpAQCAtMjYsMTYgKzI2LDIzIEBACiAKIGltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CiBpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRm9udE1ldHJpY3M7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7CitpbXBvcnQgamF2YS5hd3QuSW5zZXRzOworaW1wb3J0IGphdmEuYXd0LlBvaW50OworaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKIGltcG9ydCBqYXZheC5zd2luZy4qOwogaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuVUlSZXNvdXJjZTsKIGltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwogaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLio7CitpbXBvcnQgc3VuLnN3aW5nLkRlZmF1bHRMb29rdXA7CiAKLS8qKgotICovCisKIHB1YmxpYyBjbGFzcyBEZWZhdWx0VGFibGVDZWxsSGVhZGVyUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVDZWxsUmVuZGVyZXIKICAgICAgICAgaW1wbGVtZW50cyBVSVJlc291cmNlIHsKICAgICBwcml2YXRlIGJvb2xlYW4gaG9yaXpvbnRhbFRleHRQb3NpdGlvblNldDsKKyAgICBwcml2YXRlIEljb24gc29ydEFycm93OworICAgIHByaXZhdGUgRW1wdHlJY29uIGVtcHR5SWNvbiA9IG5ldyBFbXB0eUljb24oKTsKIAogICAgIHB1YmxpYyBEZWZhdWx0VGFibGVDZWxsSGVhZGVyUmVuZGVyZXIoKSB7CiAgICAgICAgIHNldEhvcml6b250YWxBbGlnbm1lbnQoSkxhYmVsLkNFTlRFUik7CkBAIC01OCw4ICs2NSw4IEBACiAgICAgICAgICAgICAgICAgQ29sb3IgZmdDb2xvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgQ29sb3IgYmdDb2xvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZnQ29sb3IgPSBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlSGVhZGVyLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsKLSAgICAgICAgICAgICAgICAgICAgYmdDb2xvciA9IFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGVIZWFkZXIuZm9jdXNDZWxsQmFja2dyb3VuZCIpOworICAgICAgICAgICAgICAgICAgICBmZ0NvbG9yID0gRGVmYXVsdExvb2t1cC5nZXRDb2xvcih0aGlzLCB1aSwgIlRhYmxlSGVhZGVyLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgYmdDb2xvciA9IERlZmF1bHRMb29rdXAuZ2V0Q29sb3IodGhpcywgdWksICJUYWJsZUhlYWRlci5mb2N1c0NlbGxCYWNrZ3JvdW5kIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChmZ0NvbG9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgZmdDb2xvciA9IGhlYWRlci5nZXRGb3JlZ3JvdW5kKCk7CkBAIC04NSwxNiArOTIsMTYgQEAKICAgICAgICAgICAgICAgICBpZiAoc29ydE9yZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHNvcnRPcmRlcikgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEFTQ0VORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRJY29uID0gVUlNYW5hZ2VyLmdldEljb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhYmxlLmFzY2VuZGluZ1NvcnRJY29uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzb3J0SWNvbiA9IERlZmF1bHRMb29rdXAuZ2V0SWNvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCB1aSwgIlRhYmxlLmFzY2VuZGluZ1NvcnRJY29uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBERVNDRU5ESU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgc29ydEljb24gPSBVSU1hbmFnZXIuZ2V0SWNvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFibGUuZGVzY2VuZGluZ1NvcnRJY29uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzb3J0SWNvbiA9IERlZmF1bHRMb29rdXAuZ2V0SWNvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCB1aSwgIlRhYmxlLmRlc2NlbmRpbmdTb3J0SWNvbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgVU5TT1JURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3J0SWNvbiA9IFVJTWFuYWdlci5nZXRJY29uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYWJsZS5uYXR1cmFsU29ydEljb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRJY29uID0gRGVmYXVsdExvb2t1cC5nZXRJY29uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHVpLCAiVGFibGUubmF0dXJhbFNvcnRJY29uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTEwMywxMyArMTEwLDE0IEBACiAKICAgICAgICAgc2V0VGV4dCh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgc2V0SWNvbihzb3J0SWNvbik7CisgICAgICAgIHNvcnRBcnJvdyA9IHNvcnRJY29uOwogCiAgICAgICAgIEJvcmRlciBib3JkZXIgPSBudWxsOwogICAgICAgICBpZiAoaGFzRm9jdXMpIHsKLSAgICAgICAgICAgIGJvcmRlciA9IFVJTWFuYWdlci5nZXRCb3JkZXIoIlRhYmxlSGVhZGVyLmZvY3VzQ2VsbEJvcmRlciIpOworICAgICAgICAgICAgYm9yZGVyID0gRGVmYXVsdExvb2t1cC5nZXRCb3JkZXIodGhpcywgdWksICJUYWJsZUhlYWRlci5mb2N1c0NlbGxCb3JkZXIiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYm9yZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGJvcmRlciA9IFVJTWFuYWdlci5nZXRCb3JkZXIoIlRhYmxlSGVhZGVyLmNlbGxCb3JkZXIiKTsKKyAgICAgICAgICAgIGJvcmRlciA9IERlZmF1bHRMb29rdXAuZ2V0Qm9yZGVyKHRoaXMsIHVpLCAiVGFibGVIZWFkZXIuY2VsbEJvcmRlciIpOwogICAgICAgICB9CiAgICAgICAgIHNldEJvcmRlcihib3JkZXIpOwogCkBAIC0xMjksNCArMTM3LDYwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJ2OwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKKyAgICAgICAgYm9vbGVhbiBiID0gRGVmYXVsdExvb2t1cC5nZXRCb29sZWFuKHRoaXMsIHVpLAorICAgICAgICAgICAgICAgICJUYWJsZUhlYWRlci5yaWdodEFsaWduU29ydEFycm93IiwgZmFsc2UpOworICAgICAgICBpZiAoYiAmJiBzb3J0QXJyb3cgIT0gbnVsbCkgeworICAgICAgICAgICAgLy9lbXB0eUljb24gaXMgdXNlZCBzbyB0aGF0IGlmIHRoZSB0ZXh0IGluIHRoZSBoZWFkZXIgaXMgcmlnaHQKKyAgICAgICAgICAgIC8vYWxpZ25lZCwgb3IgaWYgdGhlIGNvbHVtbiBpcyB0b28gbmFycm93LCB0aGVuIHRoZSB0ZXh0IHdpbGwKKyAgICAgICAgICAgIC8vYmUgc2l6ZWQgYXBwcm9wcmlhdGVseSB0byBtYWtlIHJvb20gZm9yIHRoZSBpY29uIHRoYXQgaXMgYWJvdXQKKyAgICAgICAgICAgIC8vdG8gYmUgcGFpbnRlZCBtYW51YWxseSBoZXJlLgorICAgICAgICAgICAgZW1wdHlJY29uLndpZHRoID0gc29ydEFycm93LmdldEljb25XaWR0aCgpOworICAgICAgICAgICAgZW1wdHlJY29uLmhlaWdodCA9IHNvcnRBcnJvdy5nZXRJY29uSGVpZ2h0KCk7CisgICAgICAgICAgICBzZXRJY29uKGVtcHR5SWNvbik7CisgICAgICAgICAgICBzdXBlci5wYWludENvbXBvbmVudChnKTsKKyAgICAgICAgICAgIFBvaW50IHBvc2l0aW9uID0gY29tcHV0ZUljb25Qb3NpdGlvbihnKTsKKyAgICAgICAgICAgIHNvcnRBcnJvdy5wYWludEljb24odGhpcywgZywgcG9zaXRpb24ueCwgcG9zaXRpb24ueSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5wYWludENvbXBvbmVudChnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUG9pbnQgY29tcHV0ZUljb25Qb3NpdGlvbihHcmFwaGljcyBnKSB7CisgICAgICAgIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZy5nZXRGb250TWV0cmljcygpOworICAgICAgICBSZWN0YW5nbGUgdmlld1IgPSBuZXcgUmVjdGFuZ2xlKCk7CisgICAgICAgIFJlY3RhbmdsZSB0ZXh0UiA9IG5ldyBSZWN0YW5nbGUoKTsKKyAgICAgICAgUmVjdGFuZ2xlIGljb25SID0gbmV3IFJlY3RhbmdsZSgpOworICAgICAgICBJbnNldHMgaSA9IGdldEluc2V0cygpOworICAgICAgICB2aWV3Ui54ID0gaS5sZWZ0OworICAgICAgICB2aWV3Ui55ID0gaS50b3A7CisgICAgICAgIHZpZXdSLndpZHRoID0gZ2V0V2lkdGgoKSAtIChpLmxlZnQgKyBpLnJpZ2h0KTsKKyAgICAgICAgdmlld1IuaGVpZ2h0ID0gZ2V0SGVpZ2h0KCkgLSAoaS50b3AgKyBpLmJvdHRvbSk7CisgICAgICAgIFN3aW5nVXRpbGl0aWVzLmxheW91dENvbXBvdW5kTGFiZWwoCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgZm9udE1ldHJpY3MsCisgICAgICAgICAgICBnZXRUZXh0KCksCisgICAgICAgICAgICBzb3J0QXJyb3csCisgICAgICAgICAgICBnZXRWZXJ0aWNhbEFsaWdubWVudCgpLAorICAgICAgICAgICAgZ2V0SG9yaXpvbnRhbEFsaWdubWVudCgpLAorICAgICAgICAgICAgZ2V0VmVydGljYWxUZXh0UG9zaXRpb24oKSwKKyAgICAgICAgICAgIGdldEhvcml6b250YWxUZXh0UG9zaXRpb24oKSwKKyAgICAgICAgICAgIHZpZXdSLAorICAgICAgICAgICAgaWNvblIsCisgICAgICAgICAgICB0ZXh0UiwKKyAgICAgICAgICAgIGdldEljb25UZXh0R2FwKCkpOworICAgICAgICBpbnQgeCA9IGdldFdpZHRoKCkgLSBpLnJpZ2h0IC0gc29ydEFycm93LmdldEljb25XaWR0aCgpOworICAgICAgICBpbnQgeSA9IGljb25SLnk7CisgICAgICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbXB0eUljb24gaW1wbGVtZW50cyBJY29uIHsKKyAgICAgICAgaW50IHdpZHRoID0gMDsKKyAgICAgICAgaW50IGhlaWdodCA9IDA7CisgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50SWNvbihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5KSB7fQorICAgICAgICBwdWJsaWMgaW50IGdldEljb25XaWR0aCgpIHsgcmV0dXJuIHdpZHRoOyB9CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWNvbkhlaWdodCgpIHsgcmV0dXJuIGhlaWdodDsgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbGliL21hbmFnZW1lbnQvam14cmVtb3RlLmFjY2VzcyBiL2pkay9zcmMvc2hhcmUvbGliL21hbmFnZW1lbnQvam14cmVtb3RlLmFjY2VzcwppbmRleCA3NjVmMTE4Li5jZTgwYjQ3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2xpYi9tYW5hZ2VtZW50L2pteHJlbW90ZS5hY2Nlc3MKKysrIGIvamRrL3NyYy9zaGFyZS9saWIvbWFuYWdlbWVudC9qbXhyZW1vdGUuYWNjZXNzCkBAIC04LDcgKzgsNyBAQAogIyBwYXNzd29yZHMuICBUbyBiZSBmdW5jdGlvbmFsLCBhIHJvbGUgbXVzdCBoYXZlIGFuIGVudHJ5IGluCiAjIGJvdGggdGhlIHBhc3N3b3JkIGFuZCB0aGUgYWNjZXNzIGZpbGVzLgogIwotIyBEZWZhdWx0IGxvY2F0aW9uIG9mIHRoaXMgZmlsZSBpcyAkSlJFL2xpYi9tYW5hZ2VtZW50L2pteHJlbW90ZS5hY2Nlc3MKKyMgVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhpcyBmaWxlIGlzICRKUkUvbGliL21hbmFnZW1lbnQvam14cmVtb3RlLmFjY2VzcwogIyBZb3UgY2FuIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIGxvY2F0aW9uIGJ5IHNwZWNpZnlpbmcgYSBwcm9wZXJ0eSBpbiAKICMgdGhlIG1hbmFnZW1lbnQgY29uZmlnIGZpbGUgJEpSRS9saWIvbWFuYWdlbWVudC9tYW5hZ2VtZW50LnByb3BlcnRpZXMKICMgKFNlZSB0aGF0IGZpbGUgZm9yIGRldGFpbHMpCkBAIC0xNiw3ICsxNiw3IEBACiAjIFRoZSBmaWxlIGZvcm1hdCBmb3IgcGFzc3dvcmQgYW5kIGFjY2VzcyBmaWxlcyBpcyBzeW50YWN0aWNhbGx5IHRoZSBzYW1lCiAjIGFzIHRoZSBQcm9wZXJ0aWVzIGZpbGUgZm9ybWF0LiAgVGhlIHN5bnRheCBpcyBkZXNjcmliZWQgaW4gdGhlIEphdmFkb2MKICMgZm9yIGphdmEudXRpbC5Qcm9wZXJ0aWVzLmxvYWQuCi0jIFR5cGljYWwgYWNjZXNzIGZpbGUgaGFzIG11bHRpcGxlICBsaW5lcywgd2hlcmUgZWFjaCBsaW5lIGlzIGJsYW5rLAorIyBBIHR5cGljYWwgYWNjZXNzIGZpbGUgaGFzIG11bHRpcGxlIGxpbmVzLCB3aGVyZSBlYWNoIGxpbmUgaXMgYmxhbmssCiAjIGEgY29tbWVudCAobGlrZSB0aGlzIG9uZSksIG9yIGFuIGFjY2VzcyBjb250cm9sIGVudHJ5LgogIwogIyBBbiBhY2Nlc3MgY29udHJvbCBlbnRyeSBjb25zaXN0cyBvZiBhIHJvbGUgbmFtZSwgYW5kIGFuCkBAIC0yOSwxMCArMjksMzggQEAKICMgICAgICAgICAgICAgICAgICAgcm9sZSBjYW4gcmVhZCBtZWFzdXJlbWVudHMgYnV0IGNhbm5vdCBwZXJmb3JtIGFueSBhY3Rpb24KICMgICAgICAgICAgICAgICAgICAgdGhhdCBjaGFuZ2VzIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgcnVubmluZyBwcm9ncmFtLgogIyAgICAgICAicmVhZHdyaXRlIiBncmFudHMgYWNjZXNzIHRvIHJlYWQgYW5kIHdyaXRlIGF0dHJpYnV0ZXMgb2YgTUJlYW5zLAotIyAgICAgICAgICAgICAgICAgICB0byBpbnZva2Ugb3BlcmF0aW9ucyBvbiB0aGVtLCBhbmQgdG8gY3JlYXRlIG9yIHJlbW92ZSB0aGVtLgotIwkJICAgIFRoaXMgYWNjZXNzIHNob3VsZCBiZSBncmFudGVkIHRvIG9ubHkgdHJ1c3RlZCBjbGllbnRzLCAKLSMgICAgICAgICAgICAgICAgICAgc2luY2UgdGhleSBjYW4gcG90ZW50aWFsbHkgaW50ZXJmZXJlIHdpdGggdGhlIHNtb290aAotIwkJICAgIG9wZXJhdGlvbiBvZiBhIHJ1bm5pbmcgcHJvZ3JhbSAKKyMgICAgICAgICAgICAgICAgICAgdG8gaW52b2tlIG9wZXJhdGlvbnMgb24gdGhlbSwgYW5kIG9wdGlvbmFsbHkKKyMgICAgICAgICAgICAgICAgICAgdG8gY3JlYXRlIG9yIHJlbW92ZSB0aGVtLiBUaGlzIGFjY2VzcyBzaG91bGQgYmUgZ3JhbnRlZAorIyAgICAgICAgICAgICAgICAgICBvbmx5IHRvIHRydXN0ZWQgY2xpZW50cywgc2luY2UgdGhleSBjYW4gcG90ZW50aWFsbHkKKyMgICAgICAgICAgICAgICAgICAgaW50ZXJmZXJlIHdpdGggdGhlIHNtb290aCBvcGVyYXRpb24gb2YgYSBydW5uaW5nIHByb2dyYW0uCisjCisjIFRoZSAicmVhZHdyaXRlIiBhY2Nlc3MgbGV2ZWwgY2FuIG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgdGhlICJjcmVhdGUiIGFuZC9vcgorIyAidW5yZWdpc3RlciIga2V5d29yZHMuICBUaGUgInVucmVnaXN0ZXIiIGtleXdvcmQgZ3JhbnRzIGFjY2VzcyB0byB1bnJlZ2lzdGVyCisjIChkZWxldGUpIE1CZWFucy4gIFRoZSAiY3JlYXRlIiBrZXl3b3JkIGdyYW50cyBhY2Nlc3MgdG8gY3JlYXRlIE1CZWFucyBvZiBhCisjIHBhcnRpY3VsYXIgY2xhc3Mgb3Igb2YgYW55IGNsYXNzIG1hdGNoaW5nIGEgcGFydGljdWxhciBwYXR0ZXJuLiAgQWNjZXNzCisjIHNob3VsZCBvbmx5IGJlIGdyYW50ZWQgdG8gY3JlYXRlIE1CZWFucyBvZiBrbm93biBhbmQgdHJ1c3RlZCBjbGFzc2VzLgorIworIyBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBlbnRyeSB3b3VsZCBncmFudCByZWFkd3JpdGUgYWNjZXNzCisjIHRvICJjb250cm9sUm9sZSIsIGFzIHdlbGwgYXMgYWNjZXNzIHRvIGNyZWF0ZSBNQmVhbnMgb2YgdGhlIGNsYXNzCisjIGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvci5Db3VudGVyTW9uaXRvciBhbmQgdG8gdW5yZWdpc3RlciBhbnkgTUJlYW46CisjICBjb250cm9sUm9sZSByZWFkd3JpdGUgXAorIyAgICAgICAgICAgICAgY3JlYXRlIGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvci5Db3VudGVyTW9uaXRvck1CZWFuIFwKKyMgICAgICAgICAgICAgIHVucmVnaXN0ZXIKKyMgb3IgZXF1aXZhbGVudGx5OgorIyAgY29udHJvbFJvbGUgcmVhZHdyaXRlIHVucmVnaXN0ZXIgY3JlYXRlIGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvci5Db3VudGVyTUJlYW4KKyMKKyMgVGhlIGZvbGxvd2luZyBlbnRyeSB3b3VsZCBncmFudCByZWFkd3JpdGUgYWNjZXNzIGFzIHdlbGwgYXMgYWNjZXNzIHRvIGNyZWF0ZQorIyBNQmVhbnMgb2YgYW55IGNsYXNzIGluIHRoZSBwYWNrYWdlcyBqYXZheC5tYW5hZ2VtZW50Lm1vbml0b3IgYW5kCisjIGphdmF4Lm1hbmFnZW1lbnQudGltZXI6CisjICBjb250cm9sUm9sZSByZWFkd3JpdGUgXAorIyAgICAgICAgICAgICAgY3JlYXRlIGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvci4qLGphdmF4Lm1hbmFnZW1lbnQudGltZXIuKiBcCisjICAgICAgICAgICAgICB1bnJlZ2lzdGVyCisjCisjIFRoZSBcIGNoYXJhY3RlciBpcyBkZWZpbmVkIGluIHRoZSBQcm9wZXJ0aWVzIGZpbGUgc3ludGF4IHRvIGFsbG93IGNvbnRpbnVhdGlvbgorIyBsaW5lcyBhcyBzaG93biBoZXJlLiAgQSAqIGluIGEgY2xhc3MgcGF0dGVybiBtYXRjaGVzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycworIyBvdGhlciB0aGFuIGRvdCAoLiksIHNvIGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvci4qIG1hdGNoZXMKKyMgamF2YXgubWFuYWdlbWVudC5tb25pdG9yLkNvdW50ZXJNb25pdG9yIGJ1dCBub3QKKyMgamF2YXgubWFuYWdlbWVudC5tb25pdG9yLmZvby5CYXIuCiAjCiAjIEEgZ2l2ZW4gcm9sZSBzaG91bGQgaGF2ZSBhdCBtb3N0IG9uZSBlbnRyeSBpbiB0aGlzIGZpbGUuICBJZiBhIHJvbGUKICMgaGFzIG5vIGVudHJ5LCBpdCBoYXMgbm8gYWNjZXNzLgpAQCAtNDIsNyArNzAsMTAgQEAKICMKICMgRGVmYXVsdCBhY2Nlc3MgY29udHJvbCBlbnRyaWVzOgogIyBvIFRoZSAibW9uaXRvclJvbGUiIHJvbGUgaGFzIHJlYWRvbmx5IGFjY2Vzcy4gIAotIyBvIFRoZSAiY29udHJvbFJvbGUiIHJvbGUgaGFzIHJlYWR3cml0ZSBhY2Nlc3MuCisjIG8gVGhlICJjb250cm9sUm9sZSIgcm9sZSBoYXMgcmVhZHdyaXRlIGFjY2VzcyBhbmQgY2FuIGNyZWF0ZSB0aGUgc3RhbmRhcmQKKyMgICBUaW1lciBhbmQgTW9uaXRvciBNQmVhbnMgZGVmaW5lZCBieSB0aGUgSk1YIEFQSS4KIAogbW9uaXRvclJvbGUgICByZWFkb25seQotY29udHJvbFJvbGUgICByZWFkd3JpdGUKK2NvbnRyb2xSb2xlICAgcmVhZHdyaXRlIFwKKyAgICAgICAgICAgICAgY3JlYXRlIGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvci4qLGphdmF4Lm1hbmFnZW1lbnQudGltZXIuKiBcCisgICAgICAgICAgICAgIHVucmVnaXN0ZXIKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL2JhbmRzLmNwcCBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL2JhbmRzLmNwcAppbmRleCBjNzg2NDRjLi5hMGQ2NGRjIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjay9iYW5kcy5jcHAKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svYmFuZHMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDAyLTIwMDggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAyLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtOTQsNiArOTQsNyBAQAogICAgICAgYXNzZXJ0KCF2YWxjLT5pc01hbGxvYyk7CiAgICAgfQogICAgIHh2cy5pbml0KHUtPnJwLCB1LT5ycGxpbWl0LCB2YWxjKTsKKyAgICBDSEVDSzsKICAgICBpbnQgWCA9IHh2cy5nZXRJbnQoKTsKICAgICBpZiAodmFsYy0+UygpICE9IDApIHsKICAgICAgIGFzc2VydCh2YWxjLT5taW4gPD0gLTI1Nik7CkBAIC0xMTcsNiArMTE4LDcgQEAKICAgICBieXRlIFhCX2J5dGUgPSAoYnl0ZSkgWEI7CiAgICAgYnl0ZSogWEJfcHRyID0gJlhCX2J5dGU7CiAgICAgY20uaW5pdCh1LT5ycCwgdS0+cnBsaW1pdCwgWEJfcHRyLCAwLCBkZWZjLCBsZW5ndGgsIG51bGwpOworICAgIENIRUNLOwogICB9IGVsc2UgewogICAgIE5PVF9QUk9EVUNUKGJ5dGUqIG1ldGFfcnAwID0gdS0+bWV0YV9ycCk7CiAgICAgYXNzZXJ0KHUtPm1ldGFfcnAgIT0gbnVsbCk7CkBAIC0yMTUsOCArMjE3LDE5IEBACiAgIGlmIChsZW5ndGggPT0gMCkgIHJldHVybiAwOwogICBpZiAodG90YWxfbWVtbyA+IDApICByZXR1cm4gdG90YWxfbWVtby0xOwogICBpbnQgdG90YWwgPSBnZXRJbnQoKTsKKyAgLy8gb3ZlcmZsb3cgY2hlY2tzIHJlcXVpcmUgdGhhdCBub25lIG9mIHRoZSBhZGRlbmRzIGFyZSA8MCwKKyAgLy8gYW5kIHRoYXQgdGhlIHBhcnRpYWwgc3VtcyBuZXZlciBvdmVyZmxvdyAod3JhcCBuZWdhdGl2ZSkKKyAgaWYgKHRvdGFsIDwgMCkgeworICAgIGFib3J0KCJvdmVyZmxvdyBkZXRlY3RlZCIpOworICAgIHJldHVybiAwOworICB9CiAgIGZvciAoaW50IGsgPSBsZW5ndGgtMTsgayA+IDA7IGstLSkgeworICAgIGludCBwcmV2X3RvdGFsID0gdG90YWw7CiAgICAgdG90YWwgKz0gdnNbMF0uZ2V0SW50KCk7CisgICAgaWYgKHRvdGFsIDwgcHJldl90b3RhbCkgeworICAgICAgYWJvcnQoIm92ZXJmbG93IGRldGVjdGVkIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CiAgIH0KICAgcmV3aW5kKCk7CiAgIHRvdGFsX21lbW8gPSB0b3RhbCsxOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svYnl0ZXMuY3BwIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svYnl0ZXMuY3BwCmluZGV4IGVjYzQ1Y2UuLjA5N2M1MWMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL2J5dGVzLmNwcAorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjay9ieXRlcy5jcHAKQEAgLTU2LDcgKzU2LDcgQEAKICAgICByZXR1cm47CiAgIH0KICAgYnl0ZSogb2xkcHRyID0gcHRyOwotICBwdHIgPSAoYnl0ZSopOjpyZWFsbG9jKHB0ciwgbGVuXysxKTsKKyAgcHRyID0gKGxlbl8gPj0gUFNJWkVfTUFYKSA/IG51bGwgOiAoYnl0ZSopOjpyZWFsbG9jKHB0ciwgbGVuXysxKTsKICAgaWYgKHB0ciAhPSBudWxsKSAgewogICAgIG10cmFjZSgncicsIG9sZHB0ciwgMCk7CiAgICAgbXRyYWNlKCdtJywgcHRyLCBsZW5fKzEpOwpAQCAtMTI4LDcgKzEyOCw3IEBACiAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlICdvJyBieXRlcyBiZXlvbmQgdGhlIGZpbGwgcG9pbnRlciwKIC8vIGFkdmFuY2UgdGhlIGZpbGwgcG9pbnRlciwgYW5kIHJldHVybiB0aGUgb2xkIGZpbGwgcG9pbnRlci4KIGJ5dGUqIGZpbGxieXRlczo6Z3JvdyhzaXplX3QgcykgewotICBzaXplX3QgbmxlbiA9IGIubGVuK3M7CisgIHNpemVfdCBubGVuID0gYWRkX3NpemUoYi5sZW4sIHMpOwogICBpZiAobmxlbiA8PSBhbGxvY2F0ZWQpIHsKICAgICBiLmxlbiA9IG5sZW47CiAgICAgcmV0dXJuIGxpbWl0KCktczsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL2NvZGluZy5jcHAgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjay9jb2RpbmcuY3BwCmluZGV4IGRlYzY4MWMuLmRmMDIxMDQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL2NvZGluZy5jcHAKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svY29kaW5nLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwMi0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTgxNCw2ICs4MTQsNyBAQAogICAgIH0KICAgICBiYW5kX3JwID0gdnMucnA7CiAgIH0KKyAgQ0hFQ0s7CiAKICAgLy8gR2V0IGFuIGFjY3VyYXRlIHVwcGVyIGxpbWl0IG5vdy4KICAgdnMwLnJwbGltaXQgPSBiYW5kX3JwOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svZGVmaW5lcy5oIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svZGVmaW5lcy5oCmluZGV4IDBiZjI1ZDUuLjg3Y2UzMzggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL2RlZmluZXMuaAorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjay9kZWZpbmVzLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00NywxMSArNDcsMTMgQEAKICNkZWZpbmUgTk9UX1BST0RVQ1QoeHh4KQogI2RlZmluZSBhc3NlcnQocCkKICNkZWZpbmUgUFJJTlRDUihhcmdzKQorI2RlZmluZSBWRVJTSU9OX1NUUklORyAiJXMgdmVyc2lvbiAlc1xuIgogI2Vsc2UKICNkZWZpbmUgSUZfUFJPRFVDVCh4eHgpCiAjZGVmaW5lIE5PVF9QUk9EVUNUKHh4eCkgeHh4CiAjZGVmaW5lIGFzc2VydChwKSAoKHApIHx8IGFzc2VydF9mYWlsZWQoI3ApKQogI2RlZmluZSBQUklOVENSKGFyZ3MpICB1LT52ZXJib3NlICYmIHUtPnByaW50Y3JfaWZfdmVyYm9zZSBhcmdzCisjZGVmaW5lIFZFUlNJT05fU1RSSU5HICIlcyB2ZXJzaW9uIG5vbi1wcm9kdWN0ICVzXG4iCiBleHRlcm4gIkMiIHZvaWQgYnJlYWtwb2ludCgpOwogZXh0ZXJuIGludCBhc3NlcnRfZmFpbGVkKGNvbnN0IGNoYXIqKTsKICNkZWZpbmUgQlJFQUsgKGJyZWFrcG9pbnQoKSkKQEAgLTc5LDkgKzgxLDkgQEAKIAogI2RlZmluZSBsZW5ndGhvZihhcnJheSkgKHNpemVvZihhcnJheSkvc2l6ZW9mKGFycmF5WzBdKSkKIAotI2RlZmluZSBORVcoVCwgbikgICAgKFQqKSBtdXN0X21hbGxvYygoaW50KShzaXplb2YoVCkqKG4pKSkKLSNkZWZpbmUgVV9ORVcoVCwgbikgIChUKikgdS0+YWxsb2Moc2l6ZW9mKFQpKihuKSkKLSNkZWZpbmUgVF9ORVcoVCwgbikgIChUKikgdS0+dGVtcF9hbGxvYyhzaXplb2YoVCkqKG4pKQorI2RlZmluZSBORVcoVCwgbikgICAgKFQqKSBtdXN0X21hbGxvYygoaW50KShzY2FsZV9zaXplKG4sIHNpemVvZihUKSkpKQorI2RlZmluZSBVX05FVyhULCBuKSAgKFQqKSB1LT5hbGxvYyhzY2FsZV9zaXplKG4sIHNpemVvZihUKSkpCisjZGVmaW5lIFRfTkVXKFQsIG4pICAoVCopIHUtPnRlbXBfYWxsb2Moc2NhbGVfc2l6ZShuLCBzaXplb2YoVCkpKQogCiAKIC8vIGJ5dGVzIGFuZCBieXRlIGFycmF5cwpAQCAtMTUzLDYgKzE1NSw4IEBACiAjZGVmaW5lIENIRUNLX05VTExfKHkscCkgICAgICAgIF9DSEVDS19ETygocCk9PW51bGwsIHJldHVybiB5KQogI2RlZmluZSBDSEVDS19OVUxMXzAocCkgICAgICAgICBfQ0hFQ0tfRE8oKHApPT1udWxsLCByZXR1cm4gMCkKIAorI2RlZmluZSBDSEVDS19DT1VOVCh0KSAgICAgICAgICBpZiAodCA8IDApe2Fib3J0KCJiYWQgdmFsdWUgY291bnQiKTt9IENIRUNLCisKICNkZWZpbmUgU1RSX1RSVUUgICAidHJ1ZSIKICNkZWZpbmUgU1RSX0ZBTFNFICAiZmFsc2UiCiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL21haW4uY3BwIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svbWFpbi5jcHAKaW5kZXggNzg5ODQxZC4uMTA0ZjM4YiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svbWFpbi5jcHAKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svbWFpbi5jcHAKQEAgLTI5OSw3ICsyOTksNyBAQAogICAgIGNhc2UgJ0onOiAgYXJncCArPSAxOyBicmVhazsgIC8vIHNraXAgaWdub3JlZCAtSnh4eCBwYXJhbWV0ZXIKIAogICAgIGNhc2UgJ1YnOgotICAgICAgZnByaW50Zih1LmVycnN0cm0sICIlcyB2ZXJzaW9uICVzXG4iLCBuYmFzZW5hbWUoYXJndlswXSksIHNjY3N2ZXIpOworICAgICAgZnByaW50Zih1LmVycnN0cm0sIFZFUlNJT05fU1RSSU5HLCBuYmFzZW5hbWUoYXJndlswXSksIHNjY3N2ZXIpOwogICAgICAgZXhpdCgwKTsKIAogICAgIGNhc2UgJ2gnOgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svdW5wYWNrLmNwcCBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL3VucGFjay5jcHAKaW5kZXggOTBiOWY3Mi4uYTZmNGNhMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svdW5wYWNrLmNwcAorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjay91bnBhY2suY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTIzLDE1ICs1MjMsMzkgQEAKICAgZW51bSB7CiAgICAgTUFHSUNfQllURVMgPSA0LAogICAgIEFIX0xFTkdUSF8wID0gMywgIC8vbWludmVyLCBtYWp2ZXIsIG9wdGlvbnMgYXJlIG91dHNpZGUgb2YgYXJjaGl2ZV9zaXplCisgICAgQUhfTEVOR1RIXzBfTUFYID0gQUhfTEVOR1RIXzAgKyAxLCAgLy8gb3B0aW9ucyBtaWdodCBoYXZlIDIgYnl0ZXMKICAgICBBSF9MRU5HVEggICA9IDI2LCAvL21heGltdW0gYXJjaGl2ZSBoZWFkZXIgbGVuZ3RoICh3LyBhbGwgZmllbGRzKQogICAgIC8vIExlbmd0aCBjb250cmlidXRpb25zIGZyb20gb3B0aW9uYWwgaGVhZGVyIGZpZWxkczoKICAgICBBSF9GSUxFX0hFQURFUl9MRU4gPSA1LCAvLyBzaXplaGkvbG8vbmV4dC9tb2R0aW1lL2ZpbGVzCisgICAgQUhfQVJDSElWRV9TSVpFX0xFTiA9IDIsIC8vIHNpemVoaS9sbyBvbmx5OyBwYXJ0IG9mIEFIX0ZJTEVfSEVBREVSX0xFTgogICAgIEFIX0NQX05VTUJFUl9MRU4gPSA0LCAgLy8gaW50L2Zsb2F0L2xvbmcvZG91YmxlCiAgICAgQUhfU1BFQ0lBTF9GT1JNQVRfTEVOID0gMiwgLy8gbGF5b3V0cy9iYW5kLWhlYWRlcnMKICAgICBBSF9MRU5HVEhfTUlOID0gQUhfTEVOR1RICiAgICAgICAgIC0oQUhfRklMRV9IRUFERVJfTEVOK0FIX1NQRUNJQUxfRk9STUFUX0xFTitBSF9DUF9OVU1CRVJfTEVOKSwKKyAgICBBUkNISVZFX1NJWkVfTUlOID0gQUhfTEVOR1RIX01JTiAtIChBSF9MRU5HVEhfMCArIEFIX0FSQ0hJVkVfU0laRV9MRU4pLAogICAgIEZJUlNUX1JFQUQgID0gTUFHSUNfQllURVMgKyBBSF9MRU5HVEhfTUlOCiAgIH07CisKKyAgYXNzZXJ0KEFIX0xFTkdUSF9NSU4gICAgPT0gMTUpOyAvLyAjIG9mIFVOU0lHTkVENSBmaWVsZHMgcmVxdWlyZWQgYWZ0ZXIgYXJjaGl2ZV9tYWdpYworICBhc3NlcnQoQVJDSElWRV9TSVpFX01JTiA9PSAxMCk7IC8vICMgb2YgVU5TSUdORUQ1IGZpZWxkcyByZXF1aXJlZCBhZnRlciBhcmNoaXZlX3NpemUKKyAgLy8gQW4gYWJzb2x1dGUgbWluaW11bSBudWxsIGFyY2hpdmUgaXMgbWFnaWNbNF0sIHttaW52ZXIsbWFqdmVyLG9wdGlvbnN9WzNdLAorICAvLyBhcmNoaXZlX3NpemVbMF0sIGNwX2NvdW50c1s4XSwgY2xhc3NfY291bnRzWzRdLCBmb3IgYSB0b3RhbCBvZiAxOSBieXRlcy4KKyAgLy8gKE5vdGUgdGhhdCBhcmNoaXZlX3NpemUgaXMgb3B0aW9uYWw7IGl0IG1heSBiZSAwLi4xMCBieXRlcyBpbiBsZW5ndGguKQorICAvLyBUaGUgZmlyc3QgcmVhZCBtdXN0IGNhcHR1cmUgZXZlcnl0aGluZyB1cCB0aHJvdWdoIHRoZSBvcHRpb25zIGZpZWxkLgorICAvLyBUaGlzIGhhcHBlbnMgdG8gd29yayBldmVuIGlmIHttaW52ZXIsbWFqdmVyLG9wdGlvbnN9IGlzIGEgcGF0aG9sb2dpY2FsCisgIC8vIDE1IGJ5dGVzIGxvbmcuICBMZWdhbCBwYWNrIGZpbGVzIGxpbWl0IHRob3NlIHRocmVlIGZpZWxkcyB0byAxKzErMiBieXRlcy4KKyAgYXNzZXJ0KEZJUlNUX1JFQUQgPj0gTUFHSUNfQllURVMgKyBBSF9MRU5HVEhfMCAqIEJfTUFYKTsKKworICAvLyBVcCB0aHJvdWdoIGFyY2hpdmVfc2l6ZSwgdGhlIGxhcmdlc3QgcG9zc2libGUgYXJjaGl2ZSBoZWFkZXIgaXMKKyAgLy8gbWFnaWNbNF0sIHttaW52ZXIsbWFqdmVyLG9wdGlvbnN9WzRdLCBhcmNoaXZlX3NpemVbMTBdLgorICAvLyAoTm90ZSBvbmx5IHRoZSBsb3cgMTIgYml0cyBvZiBvcHRpb25zIGFyZSBhbGxvd2VkIHRvIGJlIG5vbi16ZXJvLikKKyAgLy8gSW4gb3JkZXIgdG8gcGFyc2UgYXJjaGl2ZV9zaXplLCB3ZSBuZWVkIGF0IGxlYXN0IHRoaXMgbWFueSBieXRlcworICAvLyBpbiB0aGUgZmlyc3QgcmVhZC4gIE9mIGNvdXJzZSwgaWYgYXJjaGl2ZV9zaXplX2hpIGlzIG1vcmUgdGhhbgorICAvLyBhIGJ5dGUsIHdlIHByb2JhYmx5IHdpbGwgZmFpbCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyLCBzaW5jZSBpdAorICAvLyB3aWxsIGJlIG1hbnkgZ2lnYWJ5dGVzIGxvbmcuICBUaGlzIGlzIGEgcHJhY3RpY2FsLCBub3QgYW4KKyAgLy8gYXJjaGl0ZWN0dXJhbCBsaW1pdCB0byBQYWNrMjAwIGFyY2hpdmUgc2l6ZXMuCisgIGFzc2VydChGSVJTVF9SRUFEID49IE1BR0lDX0JZVEVTICsgQUhfTEVOR1RIXzBfTUFYICsgMipCX01BWCk7CisKICAgYm9vbCBmb3JlaWduX2J1ZiA9IChyZWFkX2lucHV0X2ZuID09IG51bGwpOwogICBieXRlIGluaXRidWZbKGludClGSVJTVF9SRUFEICsgKGludClDX1NMT1AgKyAyMDBdOyAgLy8gMjAwIGlzIGZvciBKQVIgSS9PCiAgIGlmIChmb3JlaWduX2J1ZikgewpAQCAtNTQ3LDcgKzU3MSw3IEBACiAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgdGhlIGNhbGxlciB0aGF0IHdlIHVzZWQgb25seSBwYXJ0IG9mIHRoZW0uCiAgICAgLy8gVGhlcmVmb3JlLCB0aGUgY2FsbGVyIG11c3QgdXNlIG9ubHkgYSBiYXJlIG1pbmltdW0gb2YgcmVhZC1haGVhZC4KICAgICBpZiAoaW5ieXRlcy5sZW4gPiBGSVJTVF9SRUFEKSB7Ci0gICAgICBhYm9ydCgidG9vIG11Y2ggcHVzaGJhY2siKTsKKyAgICAgIGFib3J0KCJ0b28gbXVjaCByZWFkLWFoZWFkIik7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlucHV0LnNldChpbml0YnVmLCBzaXplb2YoaW5pdGJ1ZikpOwpAQCAtNTU3LDcgKzU4MSw3IEBACiAgICAgcnBsaW1pdCArPSBpbmJ5dGVzLmxlbjsKICAgICBieXRlc19yZWFkICs9IGluYnl0ZXMubGVuOwogICB9Ci0gIC8vIFJlYWQgb25seSAxOSBieXRlcywgd2hpY2ggaXMgY2VydGFpbiB0byBjb250YWluICNhcmNoaXZlX3NpemUgZmllbGRzLAorICAvLyBSZWFkIG9ubHkgMTkgYnl0ZXMsIHdoaWNoIGlzIGNlcnRhaW4gdG8gY29udGFpbiAjYXJjaGl2ZV9vcHRpb25zIGZpZWxkcywKICAgLy8gYnV0IGlzIGNlcnRhaW4gbm90IHRvIG92ZXJmbG93IHBhc3QgdGhlIGFyY2hpdmVfaGVhZGVyLgogICBpbnB1dC5iLmxlbiA9IEZJUlNUX1JFQUQ7CiAgIGlmICghZW5zdXJlX2lucHV0KEZJUlNUX1JFQUQpKQpAQCAtNjI5LDI2ICs2NTMsMjUgQEAKICN1bmRlZiBPUkJJVAogICBpZiAoKGFyY2hpdmVfb3B0aW9ucyAmIH5PUFRJT05fTElNSVQpICE9IDApIHsKICAgICBmcHJpbnRmKGVycnN0cm0sICJXYXJuaW5nOiBJbGxlZ2FsIGFyY2hpdmUgb3B0aW9ucyAweCV4XG4iLAotICAgICAgICAgICAgYXJjaGl2ZV9vcHRpb25zKTsKLSAgICAvLyBEbyBub3QgYWJvcnQuICBJZiB0aGUgZm9ybWF0IHJlYWxseSBjaGFuZ2VzLCB2ZXJzaW9uIG51bWJlcnMgd2lsbCBidW1wLgotICAgIC8vYWJvcnQoImlsbGVnYWwgYXJjaGl2ZSBvcHRpb25zIik7CisgICAgICAgIGFyY2hpdmVfb3B0aW9ucyk7CisgICAgYWJvcnQoImlsbGVnYWwgYXJjaGl2ZSBvcHRpb25zIik7CisgICAgcmV0dXJuOwogICB9CiAKICAgaWYgKChhcmNoaXZlX29wdGlvbnMgJiBBT19IQVZFX0ZJTEVfSEVBREVSUykgIT0gMCkgewogICAgIHVpbnQgaGkgPSBoZHIuZ2V0SW50KCk7CiAgICAgdWludCBsbyA9IGhkci5nZXRJbnQoKTsKLSAgICBhcmNoaXZlX3NpemUgPSBiYW5kOjptYWtlTG9uZyhoaSwgbG8pOworICAgIGp1bG9uZyB4ID0gYmFuZDo6bWFrZUxvbmcoaGksIGxvKTsKKyAgICBhcmNoaXZlX3NpemUgPSAoc2l6ZV90KSB4OworICAgIGlmIChhcmNoaXZlX3NpemUgIT0geCkgeworICAgICAgLy8gU2lsbHkgc2l6ZSBzcGVjaWZpZWQ7IGZvcmNlIG92ZXJmbG93LgorICAgICAgYXJjaGl2ZV9zaXplID0gUFNJWkVfTUFYKzE7CisgICAgfQogICAgIGhkclZhbHMgKz0gMjsKICAgfSBlbHNlIHsKICAgICBoZHJWYWxzU2tpcHBlZCArPSAyOwogICB9CiAKLSAgaWYgKGFyY2hpdmVfc2l6ZSAhPSAoc2l6ZV90KWFyY2hpdmVfc2l6ZSkgewotICAgIC8vIFNpbGx5IHNpemUgc3BlY2lmaWVkLgotICAgIGFib3J0KCJhcmNoaXZlIHRvbyBsYXJnZSIpOwotICAgIHJldHVybjsKLSAgfQotCiAgIC8vIE5vdyB3ZSBjYW4gc2l6ZSB0aGUgd2hvbGUgYXJjaGl2ZS4KICAgLy8gUmVhZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIG1lZ2EtYnVmZmVyLgogICBycCA9IGhkci5ycDsKQEAgLTY2Miw5ICs2ODUsMTggQEAKICAgICAgIGFib3J0KCJFT0YgcmVhZGluZyBmaXhlZCBpbnB1dCBidWZmZXIiKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gIH0gZWxzZSBpZiAoYXJjaGl2ZV9zaXplID4gMCkgewotICAgIGlucHV0LnNldChVX05FVyhieXRlLCAoc2l6ZV90KShoZWFkZXJfc2l6ZV8wICsgYXJjaGl2ZV9zaXplICsgQ19TTE9QKSksCi0gICAgICAgICAgICAgIChzaXplX3QpIGhlYWRlcl9zaXplXzAgKyAoc2l6ZV90KWFyY2hpdmVfc2l6ZSk7CisgIH0gZWxzZSBpZiAoYXJjaGl2ZV9zaXplICE9IDApIHsKKyAgICBpZiAoYXJjaGl2ZV9zaXplIDwgQVJDSElWRV9TSVpFX01JTikgeworICAgICAgYWJvcnQoImltcG9zc2libGUgYXJjaGl2ZSBzaXplIik7ICAvLyBiYWQgaW5wdXQgZGF0YQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYXJjaGl2ZV9zaXplIDwgaGVhZGVyX3NpemVfMSkgeworICAgICAgYWJvcnQoInRvbyBtdWNoIHJlYWQtYWhlYWQiKTsgIC8vIHNvbWVob3cgd2UgcHJlLWZldGNoZWQgdG9vIG11Y2g/CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0LnNldChVX05FVyhieXRlLCBhZGRfc2l6ZShoZWFkZXJfc2l6ZV8wLCBhcmNoaXZlX3NpemUsIENfU0xPUCkpLAorICAgICAgICAgICAgICAoc2l6ZV90KSBoZWFkZXJfc2l6ZV8wICsgYXJjaGl2ZV9zaXplKTsKKyAgICBDSEVDSzsKICAgICBhc3NlcnQoaW5wdXQubGltaXQoKVswXSA9PSAwKTsKICAgICAvLyBNb3ZlIGFsbCB0aGUgYnl0ZXMgd2UgcmVhZCBpbml0aWFsbHkgaW50byB0aGUgcmVhbCBidWZmZXIuCiAgICAgaW5wdXQuYi5jb3B5RnJvbShpbml0YnVmLCBoZWFkZXJfc2l6ZSk7CkBAIC02NzMsMTcgKzcwNSwxNyBAQAogICB9IGVsc2UgewogICAgIC8vIEl0J3MgbW9yZSBjb21wbGljYXRlZCBhbmQgcGFpbmZ1bC4KICAgICAvLyBBIHplcm8gYXJjaGl2ZV9zaXplIG1lYW5zIHRoYXQgd2UgbXVzdCByZWFkIHVudGlsIEVPRi4KLSAgICBhc3NlcnQoYXJjaGl2ZV9zaXplID09IDApOwogICAgIGlucHV0LmluaXQoQ0hVTksqMik7CiAgICAgQ0hFQ0s7CiAgICAgaW5wdXQuYi5sZW4gPSBpbnB1dC5hbGxvY2F0ZWQ7CiAgICAgcnAgPSBycGxpbWl0ID0gaW5wdXQuYmFzZSgpOwogICAgIC8vIFNldCB1cCBpbnB1dCBidWZmZXIgYXMgaWYgd2UgYWxyZWFkeSByZWFkIHRoZSBoZWFkZXI6CiAgICAgaW5wdXQuYi5jb3B5RnJvbShpbml0YnVmLCBoZWFkZXJfc2l6ZSk7CisgICAgQ0hFQ0s7CiAgICAgcnBsaW1pdCArPSBoZWFkZXJfc2l6ZTsKICAgICB3aGlsZSAoZW5zdXJlX2lucHV0KGlucHV0LmxpbWl0KCkgLSBycCkpIHsKICAgICAgIHNpemVfdCBkYXRhU29GYXIgPSBpbnB1dF9yZW1haW5pbmcoKTsKLSAgICAgIHNpemVfdCBuZXh0U2l6ZSA9IGRhdGFTb0ZhciArIENIVU5LOworICAgICAgc2l6ZV90IG5leHRTaXplID0gYWRkX3NpemUoZGF0YVNvRmFyLCBDSFVOSyk7CiAgICAgICBpbnB1dC5lbnN1cmVTaXplKG5leHRTaXplKTsKICAgICAgIENIRUNLOwogICAgICAgaW5wdXQuYi5sZW4gPSBpbnB1dC5hbGxvY2F0ZWQ7CkBAIC03MTUsOCArNzQ3LDEwIEBACiAKICAgaWYgKChhcmNoaXZlX29wdGlvbnMgJiBBT19IQVZFX0ZJTEVfSEVBREVSUykgIT0gMCkgewogICAgIGFyY2hpdmVfbmV4dF9jb3VudCA9IGhkci5nZXRJbnQoKTsKKyAgICBDSEVDS19DT1VOVChhcmNoaXZlX25leHRfY291bnQpOwogICAgIGFyY2hpdmVfbW9kdGltZSA9IGhkci5nZXRJbnQoKTsKICAgICBmaWxlX2NvdW50ID0gaGRyLmdldEludCgpOworICAgIENIRUNLX0NPVU5UKGZpbGVfY291bnQpOwogICAgIGhkclZhbHMgKz0gMzsKICAgfSBlbHNlIHsKICAgICBoZHJWYWxzU2tpcHBlZCArPSAzOwpAQCAtNzI0LDcgKzc1OCw5IEBACiAKICAgaWYgKChhcmNoaXZlX29wdGlvbnMgJiBBT19IQVZFX1NQRUNJQUxfRk9STUFUUykgIT0gMCkgewogICAgIGJhbmRfaGVhZGVyc19zaXplID0gaGRyLmdldEludCgpOworICAgIENIRUNLX0NPVU5UKGJhbmRfaGVhZGVyc19zaXplKTsKICAgICBhdHRyX2RlZmluaXRpb25fY291bnQgPSBoZHIuZ2V0SW50KCk7CisgICAgQ0hFQ0tfQ09VTlQoYXR0cl9kZWZpbml0aW9uX2NvdW50KTsKICAgICBoZHJWYWxzICs9IDI7CiAgIH0gZWxzZSB7CiAgICAgaGRyVmFsc1NraXBwZWQgKz0gMjsKQEAgLTc0NCwxMyArNzgwLDE2IEBACiAgICAgICB9CiAgICAgfQogICAgIGNwX2NvdW50c1trXSA9IGhkci5nZXRJbnQoKTsKKyAgICBDSEVDS19DT1VOVChjcF9jb3VudHNba10pOwogICAgIGhkclZhbHMgKz0gMTsKICAgfQogCiAgIGljX2NvdW50ID0gaGRyLmdldEludCgpOworICBDSEVDS19DT1VOVChpY19jb3VudCk7CiAgIGRlZmF1bHRfY2xhc3NfbWludmVyID0gaGRyLmdldEludCgpOwogICBkZWZhdWx0X2NsYXNzX21hanZlciA9IGhkci5nZXRJbnQoKTsKICAgY2xhc3NfY291bnQgPSBoZHIuZ2V0SW50KCk7CisgIENIRUNLX0NPVU5UKGNsYXNzX2NvdW50KTsKICAgaGRyVmFscyArPSA0OwogCiAgIC8vIGRvbmUgd2l0aCBhcmNoaXZlX2hlYWRlcgpAQCAtODA3LDcgKzg0Niw2IEBACiAgIGJ5dGVzOjpvZihiYW5kX2hlYWRlcnMubGltaXQoKSwgQ19TTE9QKS5jbGVhcihfbWV0YV9lcnJvcik7CiB9CiAKLQogdm9pZCB1bnBhY2tlcjo6ZmluaXNoKCkgewogICBpZiAodmVyYm9zZSA+PSAxKSB7CiAgICAgZnByaW50ZihlcnJzdHJtLApAQCAtOTczLDEyICsxMDExLDEyIEBACiAgIC8vIEZpcnN0IGJhbmQ6ICBSZWFkIGxlbmd0aHMgb2Ygc2hhcmVkIHByZWZpeGVzLgogICBpZiAobGVuID4gUFJFRklYX1NLSVBfMikKICAgICBjcF9VdGY4X3ByZWZpeC5yZWFkRGF0YShsZW4gLSBQUkVGSVhfU0tJUF8yKTsKLSAgTk9UX1BST0RVQ1QoZWxzZSBjcF9VdGY4X3ByZWZpeC5yZWFkRGF0YSgwKSk7ICAvLyBmb3IgYXNzZXJ0cworICAgIE5PVF9QUk9EVUNUKGVsc2UgY3BfVXRmOF9wcmVmaXgucmVhZERhdGEoMCkpOyAgLy8gZm9yIGFzc2VydHMKIAogICAvLyBTZWNvbmQgYmFuZDogIFJlYWQgbGVuZ3RocyBvZiB1bnNoYXJlZCBzdWZmaXhlczoKICAgaWYgKGxlbiA+IFNVRkZJWF9TS0lQXzEpCiAgICAgY3BfVXRmOF9zdWZmaXgucmVhZERhdGEobGVuIC0gU1VGRklYX1NLSVBfMSk7Ci0gIE5PVF9QUk9EVUNUKGVsc2UgY3BfVXRmOF9zdWZmaXgucmVhZERhdGEoMCkpOyAgLy8gZm9yIGFzc2VydHMKKyAgICBOT1RfUFJPRFVDVChlbHNlIGNwX1V0Zjhfc3VmZml4LnJlYWREYXRhKDApKTsgIC8vIGZvciBhc3NlcnRzCiAKICAgYnl0ZXMqIGFsbHN1ZmZpeGVzID0gVF9ORVcoYnl0ZXMsIGxlbik7CiAgIENIRUNLOwpAQCAtMjExNyw2ICsyMTU1LDcgQEAKIAogICBmaWVsZF9kZXNjci5yZWFkRGF0YShmaWVsZF9jb3VudCk7CiAgIHJlYWRfYXR0cnMoQVRUUl9DT05URVhUX0ZJRUxELCBmaWVsZF9jb3VudCk7CisgIENIRUNLOwogCiAgIG1ldGhvZF9kZXNjci5yZWFkRGF0YShtZXRob2RfY291bnQpOwogICByZWFkX2F0dHJzKEFUVFJfQ09OVEVYVF9NRVRIT0QsIG1ldGhvZF9jb3VudCk7CkBAIC0yMTI0LDYgKzIxNjMsNyBAQAogICBDSEVDSzsKIAogICByZWFkX2F0dHJzKEFUVFJfQ09OVEVYVF9DTEFTUywgY2xhc3NfY291bnQpOworICBDSEVDSzsKIAogICByZWFkX2NvZGVfaGVhZGVycygpOwogCkBAIC0yMTUwLDEwICsyMTkwLDEyIEBACiAgIGFzc2VydChlbmRzV2l0aCh4eHhfZmxhZ3NfaGkubmFtZSwgIl9mbGFnc19oaSIpKTsKICAgaWYgKGhhdmVMb25nRmxhZ3MpCiAgICAgeHh4X2ZsYWdzX2hpLnJlYWREYXRhKG9ial9jb3VudCk7CisgIENIRUNLOwogCiAgIGJhbmQmIHh4eF9mbGFnc19sbyA9IGFkLnh4eF9mbGFnc19sbygpOwogICBhc3NlcnQoZW5kc1dpdGgoeHh4X2ZsYWdzX2xvLm5hbWUsICJfZmxhZ3NfbG8iKSk7CiAgIHh4eF9mbGFnc19sby5yZWFkRGF0YShvYmpfY291bnQpOworICBDSEVDSzsKIAogICAvLyBwcmUtc2NhbiBmbGFncywgY291bnRpbmcgb2NjdXJyZW5jZXMgb2YgZWFjaCBpbmRleCBiaXQKICAganVsb25nIGluZGV4TWFzayA9IGFkLmZsYWdJbmRleE1hc2soKTsgIC8vIHdoaWNoIGZsYWcgYml0cyBhcmUgaW5kZXggYml0cz8KQEAgLTIxNzYsMTEgKzIyMTgsMTMgQEAKICAgYXNzZXJ0KGVuZHNXaXRoKHh4eF9hdHRyX2NvdW50Lm5hbWUsICJfYXR0cl9jb3VudCIpKTsKICAgLy8gVGhlcmUgaXMgb25lIGNvdW50IGVsZW1lbnQgZm9yIGVhY2ggMTw8MTYgYml0IHNldCBpbiBmbGFnczoKICAgeHh4X2F0dHJfY291bnQucmVhZERhdGEoYWQucHJlZGVmQ291bnQoWF9BVFRSX09WRVJGTE9XKSk7CisgIENIRUNLOwogCiAgIGJhbmQmIHh4eF9hdHRyX2luZGV4ZXMgPSBhZC54eHhfYXR0cl9pbmRleGVzKCk7CiAgIGFzc2VydChlbmRzV2l0aCh4eHhfYXR0cl9pbmRleGVzLm5hbWUsICJfYXR0cl9pbmRleGVzIikpOwogICBpbnQgb3ZlcmZsb3dJbmRleENvdW50ID0geHh4X2F0dHJfY291bnQuZ2V0SW50VG90YWwoKTsKICAgeHh4X2F0dHJfaW5kZXhlcy5yZWFkRGF0YShvdmVyZmxvd0luZGV4Q291bnQpOworICBDSEVDSzsKICAgLy8gcHJlLXNjYW4gYXR0ciBpbmRleGVzLCBjb3VudGluZyBvY2N1cnJlbmNlcyBvZiBlYWNoIHZhbHVlCiAgIGZvciAoaSA9IDA7IGkgPCBvdmVyZmxvd0luZGV4Q291bnQ7IGkrKykgewogICAgIGlkeCA9IHh4eF9hdHRyX2luZGV4ZXMuZ2V0SW50KCk7CkBAIC0yMjExLDYgKzIyNTUsNyBAQAogICAgIH0KICAgfQogICBhZC54eHhfYXR0cl9jYWxscygpLnJlYWREYXRhKGJhY2t3YXJkQ291bnRzKTsKKyAgQ0hFQ0s7CiAKICAgLy8gUmVhZCBidWlsdC1pbiBiYW5kcy4KICAgLy8gTW9zdGx5LCB0aGVzZSBhcmUgaGFuZC1jb2RlZCBlcXVpdmFsZW50cyB0byByZWFkQmFuZERhdGEoKS4KQEAgLTIyMTksNDIgKzIyNjQsNTMgQEAKIAogICAgIGNvdW50ID0gYWQucHJlZGVmQ291bnQoQ0xBU1NfQVRUUl9Tb3VyY2VGaWxlKTsKICAgICBjbGFzc19Tb3VyY2VGaWxlX1JVTi5yZWFkRGF0YShjb3VudCk7CisgICAgQ0hFQ0s7CiAKICAgICBjb3VudCA9IGFkLnByZWRlZkNvdW50KENMQVNTX0FUVFJfRW5jbG9zaW5nTWV0aG9kKTsKICAgICBjbGFzc19FbmNsb3NpbmdNZXRob2RfUkMucmVhZERhdGEoY291bnQpOwogICAgIGNsYXNzX0VuY2xvc2luZ01ldGhvZF9SRE4ucmVhZERhdGEoY291bnQpOworICAgIENIRUNLOwogCiAgICAgY291bnQgPSBhZC5wcmVkZWZDb3VudChYX0FUVFJfU2lnbmF0dXJlKTsKICAgICBjbGFzc19TaWduYXR1cmVfUlMucmVhZERhdGEoY291bnQpOworICAgIENIRUNLOwogCiAgICAgYWQucmVhZEJhbmREYXRhKFhfQVRUUl9SdW50aW1lVmlzaWJsZUFubm90YXRpb25zKTsKICAgICBhZC5yZWFkQmFuZERhdGEoWF9BVFRSX1J1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9ucyk7CiAKICAgICBjb3VudCA9IGFkLnByZWRlZkNvdW50KENMQVNTX0FUVFJfSW5uZXJDbGFzc2VzKTsKICAgICBjbGFzc19Jbm5lckNsYXNzZXNfTi5yZWFkRGF0YShjb3VudCk7CisgICAgQ0hFQ0s7CisKICAgICBjb3VudCA9IGNsYXNzX0lubmVyQ2xhc3Nlc19OLmdldEludFRvdGFsKCk7CiAgICAgY2xhc3NfSW5uZXJDbGFzc2VzX1JDLnJlYWREYXRhKGNvdW50KTsKICAgICBjbGFzc19Jbm5lckNsYXNzZXNfRi5yZWFkRGF0YShjb3VudCk7CisgICAgQ0hFQ0s7CiAgICAgLy8gRHJvcCByZW1haW5pbmcgY29sdW1ucyB3aGVyZXZlciBmbGFncyBhcmUgemVybzoKICAgICBjb3VudCAtPSBjbGFzc19Jbm5lckNsYXNzZXNfRi5nZXRJbnRDb3VudCgwKTsKICAgICBjbGFzc19Jbm5lckNsYXNzZXNfb3V0ZXJfUkNOLnJlYWREYXRhKGNvdW50KTsKICAgICBjbGFzc19Jbm5lckNsYXNzZXNfbmFtZV9SVU4ucmVhZERhdGEoY291bnQpOworICAgIENIRUNLOwogCiAgICAgY291bnQgPSBhZC5wcmVkZWZDb3VudChDTEFTU19BVFRSX0NsYXNzRmlsZV92ZXJzaW9uKTsKICAgICBjbGFzc19DbGFzc0ZpbGVfdmVyc2lvbl9taW5vcl9ILnJlYWREYXRhKGNvdW50KTsKICAgICBjbGFzc19DbGFzc0ZpbGVfdmVyc2lvbl9tYWpvcl9ILnJlYWREYXRhKGNvdW50KTsKKyAgICBDSEVDSzsKICAgICBicmVhazsKIAogICBjYXNlIEFUVFJfQ09OVEVYVF9GSUVMRDoKIAogICAgIGNvdW50ID0gYWQucHJlZGVmQ291bnQoRklFTERfQVRUUl9Db25zdGFudFZhbHVlKTsKICAgICBmaWVsZF9Db25zdGFudFZhbHVlX0tRLnJlYWREYXRhKGNvdW50KTsKKyAgICBDSEVDSzsKIAogICAgIGNvdW50ID0gYWQucHJlZGVmQ291bnQoWF9BVFRSX1NpZ25hdHVyZSk7CiAgICAgZmllbGRfU2lnbmF0dXJlX1JTLnJlYWREYXRhKGNvdW50KTsKKyAgICBDSEVDSzsKIAogICAgIGFkLnJlYWRCYW5kRGF0YShYX0FUVFJfUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyk7CiAgICAgYWQucmVhZEJhbmREYXRhKFhfQVRUUl9SdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMpOworICAgIENIRUNLOwogICAgIGJyZWFrOwogCiAgIGNhc2UgQVRUUl9DT05URVhUX01FVEhPRDoKQEAgLTIyNjYsMTUgKzIzMjIsMTggQEAKICAgICBtZXRob2RfRXhjZXB0aW9uc19OLnJlYWREYXRhKGNvdW50KTsKICAgICBjb3VudCA9IG1ldGhvZF9FeGNlcHRpb25zX04uZ2V0SW50VG90YWwoKTsKICAgICBtZXRob2RfRXhjZXB0aW9uc19SQy5yZWFkRGF0YShjb3VudCk7CisgICAgQ0hFQ0s7CiAKICAgICBjb3VudCA9IGFkLnByZWRlZkNvdW50KFhfQVRUUl9TaWduYXR1cmUpOwogICAgIG1ldGhvZF9TaWduYXR1cmVfUlMucmVhZERhdGEoY291bnQpOworICAgIENIRUNLOwogCiAgICAgYWQucmVhZEJhbmREYXRhKFhfQVRUUl9SdW50aW1lVmlzaWJsZUFubm90YXRpb25zKTsKICAgICBhZC5yZWFkQmFuZERhdGEoWF9BVFRSX1J1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9ucyk7CiAgICAgYWQucmVhZEJhbmREYXRhKE1FVEhPRF9BVFRSX1J1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMpOwogICAgIGFkLnJlYWRCYW5kRGF0YShNRVRIT0RfQVRUUl9SdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMpOwogICAgIGFkLnJlYWRCYW5kRGF0YShNRVRIT0RfQVRUUl9Bbm5vdGF0aW9uRGVmYXVsdCk7CisgICAgQ0hFQ0s7CiAgICAgYnJlYWs7CiAKICAgY2FzZSBBVFRSX0NPTlRFWFRfQ09ERToKQEAgLTIyODYsOCArMjM0NSwxMCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb2RlX1N0YWNrTWFwVGFibGVfTi5yZWFkRGF0YShjb3VudCk7CisgICAgQ0hFQ0s7CiAgICAgY291bnQgPSBjb2RlX1N0YWNrTWFwVGFibGVfTi5nZXRJbnRUb3RhbCgpOwogICAgIGNvZGVfU3RhY2tNYXBUYWJsZV9mcmFtZV9ULnJlYWREYXRhKGNvdW50KTsKKyAgICBDSEVDSzsKICAgICAvLyB0aGUgcmVzdCBvZiBpdCBkZXBlbmRzIGluIGEgY29tcGxpY2F0ZWQgd2F5IG9uIGZyYW1lIHRhZ3MKICAgICB7CiAgICAgICBpbnQgZmF0X2ZyYW1lX2NvdW50ID0gMDsKQEAgLTIzMjEsMTggKzIzODIsMjMgQEAKICAgICAgIC8vIGRlYWwgY29tcGxldGVseSB3aXRoIGZhdCBmcmFtZXM6CiAgICAgICBvZmZzZXRfY291bnQgKz0gZmF0X2ZyYW1lX2NvdW50OwogICAgICAgY29kZV9TdGFja01hcFRhYmxlX2xvY2FsX04ucmVhZERhdGEoZmF0X2ZyYW1lX2NvdW50KTsKKyAgICAgIENIRUNLOwogICAgICAgdHlwZV9jb3VudCArPSBjb2RlX1N0YWNrTWFwVGFibGVfbG9jYWxfTi5nZXRJbnRUb3RhbCgpOwogICAgICAgY29kZV9TdGFja01hcFRhYmxlX3N0YWNrX04ucmVhZERhdGEoZmF0X2ZyYW1lX2NvdW50KTsKICAgICAgIHR5cGVfY291bnQgKz0gY29kZV9TdGFja01hcFRhYmxlX3N0YWNrX04uZ2V0SW50VG90YWwoKTsKKyAgICAgIENIRUNLOwogICAgICAgLy8gcmVhZCB0aGUgcmVzdDoKICAgICAgIGNvZGVfU3RhY2tNYXBUYWJsZV9vZmZzZXQucmVhZERhdGEob2Zmc2V0X2NvdW50KTsKICAgICAgIGNvZGVfU3RhY2tNYXBUYWJsZV9ULnJlYWREYXRhKHR5cGVfY291bnQpOworICAgICAgQ0hFQ0s7CiAgICAgICAvLyAoNykgW1JDSF0KICAgICAgIGNvdW50ID0gY29kZV9TdGFja01hcFRhYmxlX1QuZ2V0SW50Q291bnQoNyk7CiAgICAgICBjb2RlX1N0YWNrTWFwVGFibGVfUkMucmVhZERhdGEoY291bnQpOworICAgICAgQ0hFQ0s7CiAgICAgICAvLyAoOCkgW1BIXQogICAgICAgY291bnQgPSBjb2RlX1N0YWNrTWFwVGFibGVfVC5nZXRJbnRDb3VudCg4KTsKICAgICAgIGNvZGVfU3RhY2tNYXBUYWJsZV9QLnJlYWREYXRhKGNvdW50KTsKKyAgICAgIENIRUNLOwogICAgIH0KIAogICAgIGNvdW50ID0gYWQucHJlZGVmQ291bnQoQ09ERV9BVFRSX0xpbmVOdW1iZXJUYWJsZSk7CkBAIC0yNjU0LDYgKzI3MjAsNyBAQAogICBjb2RlX21heF9uYV9sb2NhbHMucmVhZERhdGEoKTsKICAgY29kZV9oYW5kbGVyX2NvdW50LnJlYWREYXRhKCk7CiAgIHRvdGFsSGFuZGxlckNvdW50ICs9IGNvZGVfaGFuZGxlcl9jb3VudC5nZXRJbnRUb3RhbCgpOworICBDSEVDSzsKIAogICAvLyBSZWFkIGhhbmRsZXIgc3BlY2lmaWNhdGlvbnMuCiAgIC8vIENmLiBQYWNrYWdlUmVhZGVyLnJlYWRDb2RlSGFuZGxlcnMuCkBAIC0yNjYxLDggKzI3MjgsMTAgQEAKICAgY29kZV9oYW5kbGVyX2VuZF9QTy5yZWFkRGF0YSh0b3RhbEhhbmRsZXJDb3VudCk7CiAgIGNvZGVfaGFuZGxlcl9jYXRjaF9QTy5yZWFkRGF0YSh0b3RhbEhhbmRsZXJDb3VudCk7CiAgIGNvZGVfaGFuZGxlcl9jbGFzc19SQ04ucmVhZERhdGEodG90YWxIYW5kbGVyQ291bnQpOworICBDSEVDSzsKIAogICByZWFkX2F0dHJzKEFUVFJfQ09OVEVYVF9DT0RFLCB0b3RhbEZsYWdzQ291bnQpOworICBDSEVDSzsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGlzX2luX3JhbmdlKHVpbnQgbiwgdWludCBtaW4sIHVpbnQgbWF4KSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjay91bnBhY2suaCBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL3VucGFjay5oCmluZGV4IDhiYWQ2NzQuLjRmNTk2NWQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL3VucGFjay5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL3VucGFjay5oCkBAIC0yMDQsNyArMjA0LDcgQEAKIAogICAvLyBhcmNoaXZlIGhlYWRlciBmaWVsZHMKICAgaW50ICAgICAgbWFnaWMsIG1pbnZlciwgbWFqdmVyOwotICBqdWxvbmcgICBhcmNoaXZlX3NpemU7CisgIHNpemVfdCAgIGFyY2hpdmVfc2l6ZTsKICAgaW50ICAgICAgYXJjaGl2ZV9uZXh0X2NvdW50LCBhcmNoaXZlX29wdGlvbnMsIGFyY2hpdmVfbW9kdGltZTsKICAgaW50ICAgICAgYmFuZF9oZWFkZXJzX3NpemU7CiAgIGludCAgICAgIGZpbGVfY291bnQsIGF0dHJfZGVmaW5pdGlvbl9jb3VudCwgaWNfY291bnQsIGNsYXNzX2NvdW50OwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svdXRpbHMuY3BwIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svdXRpbHMuY3BwCmluZGV4IDk1NjZlNTQuLmI4MTJlNzMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL3V0aWxzLmNwcAorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjay91dGlscy5jcHAKQEAgLTQ2LDE0ICs0NiwxMyBAQAogCiAjaW5jbHVkZSAidW5wYWNrLmgiCiAKLXZvaWQqIG11c3RfbWFsbG9jKGludCBzaXplKSB7Ci0gIGludCBtc2l6ZSA9IHNpemU7Ci0gIGFzc2VydChzaXplID49IDApOwordm9pZCogbXVzdF9tYWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IG1zaXplID0gc2l6ZTsKICAgI2lmZGVmIFVTRV9NVFJBQ0UKLSAgaWYgKG1zaXplIDwgc2l6ZW9mKGludCkpCisgIGlmIChtc2l6ZSA+PSAwICYmIG1zaXplIDwgc2l6ZW9mKGludCkpCiAgICAgbXNpemUgPSBzaXplb2YoaW50KTsgIC8vIHNlZSAweGJhYWRmMDBkIGJlbG93CiAgICNlbmRpZgotICB2b2lkKiBwdHIgPSBtYWxsb2MobXNpemUpOworICB2b2lkKiBwdHIgPSAobXNpemUgPiBQU0laRV9NQVgpID8gbnVsbCA6IG1hbGxvYyhtc2l6ZSk7CiAgIGlmIChwdHIgIT0gbnVsbCkgewogICAgIG1lbXNldChwdHIsIDAsIHNpemUpOwogICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svdXRpbHMuaCBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL3V0aWxzLmgKaW5kZXggMmZjMTcyOC4uYTRkYzJjODggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL3V0aWxzLmgKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svdXRpbHMuaApAQCAtMjUsMTMgKzI1LDMxIEBACiAKIC8vRGVmaW5pdGlvbnMgb2Ygb3VyIHV0aWwgZnVuY3Rpb25zCiAKLXZvaWQqIG11c3RfbWFsbG9jKGludCBzaXplKTsKK3ZvaWQqIG11c3RfbWFsbG9jKHNpemVfdCBzaXplKTsKICNpZm5kZWYgVVNFX01UUkFDRQogI2RlZmluZSBtdHJhY2UoYywgcHRyLCBzaXplKQogI2Vsc2UKIHZvaWQgbXRyYWNlKGNoYXIgYywgdm9pZCogcHRyLCBzaXplX3Qgc2l6ZSk7CiAjZW5kaWYKIAorLy8gb3ZlcmZsb3cgbWFuYWdlbWVudAorI2RlZmluZSBPVkVSRkxPVyAoKHNpemVfdCktMSkKKyNkZWZpbmUgUFNJWkVfTUFYIChPVkVSRkxPVy8yKSAgLyogbm9ybWFsIHNpemUgbGltaXQgKi8KKworaW5saW5lIHNpemVfdCBzY2FsZV9zaXplKHNpemVfdCBzaXplLCBzaXplX3Qgc2NhbGUpIHsKKyAgcmV0dXJuIChzaXplID4gUFNJWkVfTUFYIC8gc2NhbGUpID8gT1ZFUkZMT1cgOiBzaXplICogc2NhbGU7Cit9CisKK2lubGluZSBzaXplX3QgYWRkX3NpemUoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIpIHsKKyAgcmV0dXJuICgoc2l6ZTEgfCBzaXplMiB8IChzaXplMSArIHNpemUyKSkgPiBQU0laRV9NQVgpCisgICAgPyBPVkVSRkxPVworICAgIDogc2l6ZTEgKyBzaXplMjsKK30KKworaW5saW5lIHNpemVfdCBhZGRfc2l6ZShzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMiwgaW50IHNpemUzKSB7CisgIHJldHVybiBhZGRfc2l6ZShhZGRfc2l6ZShzaXplMSwgc2l6ZTIpLCBzaXplMyk7Cit9CisKIC8vIFRoZXNlIG1heSBiZSBleHBlbnNpdmUsIGJlY2F1c2UgdGhleSBoYXZlIHRvIGdvIHZpYSBKYXZhIFRTRCwKIC8vIGlmIHRoZSBvcHRpb25hbCB1IGFyZ3VtZW50IGlzIG1pc3NpbmcuCiBzdHJ1Y3QgdW5wYWNrZXI7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL3V0aWwvemlwL1ppcEVudHJ5LmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL3V0aWwvemlwL1ppcEVudHJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Y2Q2OGUuLjAwMDAwMDAKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsL3ppcC9aaXBFbnRyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBOYXRpdmUgbWV0aG9kIHN1cHBvcnQgZm9yIGphdmEudXRpbC56aXAuWmlwRW50cnkKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJqbG9uZy5oIgotI2luY2x1ZGUgImp2bS5oIgotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgImpuaV91dGlsLmgiCi0jaW5jbHVkZSAiemlwX3V0aWwuaCIKLQotI2luY2x1ZGUgImphdmFfdXRpbF96aXBfWmlwRW50cnkuaCIKLQotI2RlZmluZSBERUZMQVRFRCA4Ci0jZGVmaW5lIFNUT1JFRCAwCi0KLXN0YXRpYyBqZmllbGRJRCBuYW1lSUQ7Ci1zdGF0aWMgamZpZWxkSUQgdGltZUlEOwotc3RhdGljIGpmaWVsZElEIGNyY0lEOwotc3RhdGljIGpmaWVsZElEIHNpemVJRDsKLXN0YXRpYyBqZmllbGRJRCBjc2l6ZUlEOwotc3RhdGljIGpmaWVsZElEIG1ldGhvZElEOwotc3RhdGljIGpmaWVsZElEIGV4dHJhSUQ7Ci1zdGF0aWMgamZpZWxkSUQgY29tbWVudElEOwotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2phdmFfdXRpbF96aXBfWmlwRW50cnlfaW5pdElEcyhKTklFbnYgKmVudiwgamNsYXNzIGNscykKLXsKLSAgICBuYW1lSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJuYW1lIiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOwotICAgIHRpbWVJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgInRpbWUiLCAiSiIpOwotICAgIGNyY0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAiY3JjIiwgIkoiKTsKLSAgICBzaXplSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJzaXplIiwgIkoiKTsKLSAgICBjc2l6ZUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAiY3NpemUiLCAiSiIpOwotICAgIG1ldGhvZElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAibWV0aG9kIiwgIkkiKTsKLSAgICBleHRyYUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAiZXh0cmEiLCAiW0IiKTsKLSAgICBjb21tZW50SUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJjb21tZW50IiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2phdmFfdXRpbF96aXBfWmlwRW50cnlfaW5pdEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHplbnRyeSkKLXsKLSAgICBqemVudHJ5ICp6ZSA9IGpsb25nX3RvX3B0cih6ZW50cnkpOwotICAgIGpzdHJpbmcgbmFtZSA9ICgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBvYmosIG5hbWVJRCk7Ci0KLSAgICBpZiAobmFtZSA9PSAwKSB7Ci0gICAgICAgIG5hbWUgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIHplLT5uYW1lKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBvYmosIG5hbWVJRCwgbmFtZSk7Ci0gICAgfQotICAgICgqZW52KS0+U2V0TG9uZ0ZpZWxkKGVudiwgb2JqLCB0aW1lSUQsIChqbG9uZyl6ZS0+dGltZSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgKCplbnYpLT5TZXRMb25nRmllbGQoZW52LCBvYmosIGNyY0lELCAoamxvbmcpemUtPmNyYyAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgKCplbnYpLT5TZXRMb25nRmllbGQoZW52LCBvYmosIHNpemVJRCwgKGpsb25nKXplLT5zaXplKTsKLSAgICBpZiAoemUtPmNzaXplID09IDApIHsKLSAgICAgICAgKCplbnYpLT5TZXRMb25nRmllbGQoZW52LCBvYmosIGNzaXplSUQsIChqbG9uZyl6ZS0+c2l6ZSk7Ci0gICAgICAgICgqZW52KS0+U2V0SW50RmllbGQoZW52LCBvYmosIG1ldGhvZElELCBTVE9SRUQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICgqZW52KS0+U2V0TG9uZ0ZpZWxkKGVudiwgb2JqLCBjc2l6ZUlELCAoamxvbmcpemUtPmNzaXplKTsKLSAgICAgICAgKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIG9iaiwgbWV0aG9kSUQsIERFRkxBVEVEKTsKLSAgICB9Ci0gICAgaWYgKHplLT5leHRyYSAhPSAwKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKmJwID0gKHVuc2lnbmVkIGNoYXIgKikmemUtPmV4dHJhWzBdOwotICAgICAgICBqc2l6ZSBsZW4gPSAoYnBbMF0gfCAoYnBbMV0gPDwgOCkpOwotICAgICAgICBqYnl0ZUFycmF5IGV4dHJhID0gKCplbnYpLT5OZXdCeXRlQXJyYXkoZW52LCBsZW4pOwotICAgICAgICBpZiAoZXh0cmEgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgICgqZW52KS0+U2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgZXh0cmEsIDAsIGxlbiwgJnplLT5leHRyYVsyXSk7Ci0gICAgICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBvYmosIGV4dHJhSUQsIGV4dHJhKTsKLSAgICB9Ci0gICAgaWYgKHplLT5jb21tZW50ICE9IDApIHsKLSAgICAgICAganN0cmluZyBjb21tZW50ID0gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCB6ZS0+Y29tbWVudCk7Ci0gICAgICAgIGlmIChjb21tZW50ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgb2JqLCBjb21tZW50SUQsIGNvbW1lbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvdXRpbC96aXAvWmlwRmlsZS5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsL3ppcC9aaXBGaWxlLmMKaW5kZXggMGMyMDUzNi4uZDVjYjFlYyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsL3ppcC9aaXBGaWxlLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsL3ppcC9aaXBGaWxlLmMKQEAgLTE0MSwxMiArMTQxLDExIEBACiAKIEpOSUVYUE9SVCBqbG9uZyBKTklDQUxMCiBKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeShKTklFbnYgKmVudiwgamNsYXNzIGNscywgamxvbmcgemZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIG5hbWUsIGpib29sZWFuIGFkZFNsYXNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBuYW1lLCBqYm9vbGVhbiBhZGRTbGFzaCkKIHsKICNkZWZpbmUgTUFYTkFNRSAxMDI0CiAgICAganpmaWxlICp6aXAgPSBqbG9uZ190b19wdHIoemZpbGUpOwotICAgIGpzaXplIHNsZW4gPSAoKmVudiktPkdldFN0cmluZ0xlbmd0aChlbnYsIG5hbWUpOwotICAgIGpzaXplIHVsZW4gPSAoKmVudiktPkdldFN0cmluZ1VURkxlbmd0aChlbnYsIG5hbWUpOworICAgIGpzaXplIHVsZW4gPSAoKmVudiktPkdldEFycmF5TGVuZ3RoKGVudiwgbmFtZSk7CiAgICAgY2hhciBidWZbTUFYTkFNRSsyXSwgKnBhdGg7CiAgICAganplbnRyeSAqemU7CiAKQEAgLTE1OSw3ICsxNTgsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHBhdGggPSBidWY7CiAgICAgfQotICAgICgqZW52KS0+R2V0U3RyaW5nVVRGUmVnaW9uKGVudiwgbmFtZSwgMCwgc2xlbiwgcGF0aCk7CisgICAgKCplbnYpLT5HZXRCeXRlQXJyYXlSZWdpb24oZW52LCBuYW1lLCAwLCB1bGVuLCAoamJ5dGUgKilwYXRoKTsKICAgICBwYXRoW3VsZW5dID0gJ1wwJzsKICAgICBpZiAoYWRkU2xhc2ggPT0gSk5JX0ZBTFNFKSB7CiAgICAgICAgIHplID0gWklQX0dldEVudHJ5KHppcCwgcGF0aCwgMCk7CkBAIC0xODYsMzQgKzE4NSw4NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbikKIHsKICAgICBqemVudHJ5ICp6ZSA9IFpJUF9HZXROZXh0RW50cnkoamxvbmdfdG9fcHRyKHpmaWxlKSwgbik7Ci0KICAgICByZXR1cm4gcHRyX3RvX2psb25nKHplKTsKIH0KIAogSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0TWV0aG9kKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqbG9uZyB6ZW50cnkpCitKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeU1ldGhvZChKTklFbnYgKmVudiwgamNsYXNzIGNscywgamxvbmcgemVudHJ5KQogewogICAgIGp6ZW50cnkgKnplID0gamxvbmdfdG9fcHRyKHplbnRyeSk7Ci0KICAgICByZXR1cm4gemUtPmNzaXplICE9IDAgPyBERUZMQVRFRCA6IFNUT1JFRDsKIH0KIAotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKLUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldENTaXplKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqbG9uZyB6ZW50cnkpCitKTklFWFBPUlQgamludCBKTklDQUxMCitKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUZsYWcoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpsb25nIHplbnRyeSkKIHsKICAgICBqemVudHJ5ICp6ZSA9IGpsb25nX3RvX3B0cih6ZW50cnkpOworICAgIHJldHVybiB6ZS0+ZmxhZzsKK30KIAorSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKK0phdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5Q1NpemUoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpsb25nIHplbnRyeSkKK3sKKyAgICBqemVudHJ5ICp6ZSA9IGpsb25nX3RvX3B0cih6ZW50cnkpOwogICAgIHJldHVybiB6ZS0+Y3NpemUgIT0gMCA/IHplLT5jc2l6ZSA6IHplLT5zaXplOwogfQogCiBKTklFWFBPUlQgamxvbmcgSk5JQ0FMTAotSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0U2l6ZShKTklFbnYgKmVudiwgamNsYXNzIGNscywgamxvbmcgemVudHJ5KQorSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlTaXplKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqbG9uZyB6ZW50cnkpCiB7CiAgICAganplbnRyeSAqemUgPSBqbG9uZ190b19wdHIoemVudHJ5KTsKLQogICAgIHJldHVybiB6ZS0+c2l6ZTsKIH0KIAorSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKK0phdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5VGltZShKTklFbnYgKmVudiwgamNsYXNzIGNscywgamxvbmcgemVudHJ5KQoreworICAgIGp6ZW50cnkgKnplID0gamxvbmdfdG9fcHRyKHplbnRyeSk7CisgICAgcmV0dXJuIChqbG9uZyl6ZS0+dGltZSAmIDB4ZmZmZmZmZmZVTDsKK30KKworSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKK0phdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5Q3JjKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqbG9uZyB6ZW50cnkpCit7CisgICAganplbnRyeSAqemUgPSBqbG9uZ190b19wdHIoemVudHJ5KTsKKyAgICByZXR1cm4gKGpsb25nKXplLT5jcmMgJiAweGZmZmZmZmZmVUw7Cit9CisKK0pOSUVYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwKK0phdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5Qnl0ZXMoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpsb25nIHplbnRyeSwgamludCB0eXBlKQoreworICAgIGp6ZW50cnkgKnplID0gamxvbmdfdG9fcHRyKHplbnRyeSk7CisgICAgaW50IGxlbiA9IDA7CisgICAgamJ5dGVBcnJheSBqYmEgPSBOVUxMOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgamF2YV91dGlsX3ppcF9aaXBGaWxlX0paRU5UUllfTkFNRToKKyAgICAgICAgaWYgKHplLT5uYW1lICE9IDApIHsKKyAgICAgICAgICAgIGxlbiA9IChpbnQpc3RybGVuKHplLT5uYW1lKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMCB8fCAoamJhID0gKCplbnYpLT5OZXdCeXRlQXJyYXkoZW52LCBsZW4pKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKCplbnYpLT5TZXRCeXRlQXJyYXlSZWdpb24oZW52LCBqYmEsIDAsIGxlbiwgKGpieXRlICopemUtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgamF2YV91dGlsX3ppcF9aaXBGaWxlX0paRU5UUllfRVhUUkE6CisgICAgICAgIGlmICh6ZS0+ZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnAgPSAodW5zaWduZWQgY2hhciAqKSZ6ZS0+ZXh0cmFbMF07CisgICAgICAgICAgICBsZW4gPSAoYnBbMF0gfCAoYnBbMV0gPDwgOCkpOworICAgICAgICAgICAgaWYgKGxlbiA8PSAwIHx8IChqYmEgPSAoKmVudiktPk5ld0J5dGVBcnJheShlbnYsIGxlbikpID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAoKmVudiktPlNldEJ5dGVBcnJheVJlZ2lvbihlbnYsIGpiYSwgMCwgbGVuLCAmemUtPmV4dHJhWzJdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGphdmFfdXRpbF96aXBfWmlwRmlsZV9KWkVOVFJZX0NPTU1FTlQ6CisgICAgICAgIGlmICh6ZS0+Y29tbWVudCAhPSAwKSB7CisgICAgICAgICAgICBsZW4gPSAoaW50KXN0cmxlbih6ZS0+Y29tbWVudCk7CisgICAgICAgICAgICBpZiAobGVuID09IDAgfHwgKGpiYSA9ICgqZW52KS0+TmV3Qnl0ZUFycmF5KGVudiwgbGVuKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICgqZW52KS0+U2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgamJhLCAwLCBsZW4sIChqYnl0ZSopemUtPmNvbW1lbnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gamJhOworfQorCiBKTklFWFBPUlQgamludCBKTklDQUxMCiBKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9yZWFkKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqbG9uZyB6ZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamxvbmcgemVudHJ5LCBqbG9uZyBwb3MsIGpieXRlQXJyYXkgYnl0ZXMsCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL3V0aWwvemlwL3ppcF91dGlsLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL3V0aWwvemlwL3ppcF91dGlsLmMKaW5kZXggODlmNTJhZS4uNjI2ZDQxMSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsL3ppcC96aXBfdXRpbC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvdXRpbC96aXAvemlwX3V0aWwuYwpAQCAtNTEyLDcgKzUxMiw2IEBACiAKICAgICAvKiBDbGVhciBwcmV2aW91cyB6aXAgZXJyb3IgKi8KICAgICB6aXAtPm1zZyA9IE5VTEw7Ci0KICAgICAvKiBHZXQgcG9zaXRpb24gb2YgRU5EIGhlYWRlciAqLwogICAgIGlmICgoZW5kcG9zID0gZmluZEVORCh6aXAsIGVuZGJ1ZikpID09IC0xKQogICAgICAgICByZXR1cm4gLTE7IC8qIG5vIEVORCBoZWFkZXIgb3Igc3lzdGVtIGVycm9yICovCkBAIC01MjAsNyArNTE5LDYgQEAKICAgICBpZiAoZW5kcG9zID09IDApIHJldHVybiAwOyAgLyogb25seSBFTkQgaGVhZGVyIHByZXNlbnQgKi8KIAogICAgIGZyZWVDRU4oemlwKTsKLQogICAgLyogR2V0IHBvc2l0aW9uIGFuZCBsZW5ndGggb2YgY2VudHJhbCBkaXJlY3RvcnkgKi8KICAgICBjZW5sZW4gPSBFTkRTSVooZW5kYnVmKTsKICAgICBjZW5vZmYgPSBFTkRPRkYoZW5kYnVmKTsKQEAgLTkzNSw2ICs5MzMsNyBAQAogICAgIHplLT5jcmMgICA9IENFTkNSQyhjZW4pOwogICAgIGxvY29mZiAgICA9IENFTk9GRihjZW4pOwogICAgIHplLT5wb3MgICA9IC0oemlwLT5sb2Nwb3MgKyBsb2NvZmYpOworICAgIHplLT5mbGFnICA9IENFTkZMRyhjZW4pOwogCiAgICAgaWYgKCh6ZS0+bmFtZSA9IG1hbGxvYyhubGVuICsgMSkpID09IE5VTEwpIGdvdG8gQ2F0Y2g7CiAgICAgbWVtY3B5KHplLT5uYW1lLCBjZW4gKyBDRU5IRFIsIG5sZW4pOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsL3ppcC96aXBfdXRpbC5oIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsL3ppcC96aXBfdXRpbC5oCmluZGV4IDdhZDExNzEuLjMxMWE5ZmNkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL3V0aWwvemlwL3ppcF91dGlsLmgKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsL3ppcC96aXBfdXRpbC5oCkBAIC0xNjgsNiArMTY4LDcgQEAKICAgICBjaGFyICpjb21tZW50OyAgICAgICAgLyogb3B0aW9uYWwgemlwIGZpbGUgY29tbWVudCAqLwogICAgIGpieXRlICpleHRyYTsgICAgICAgICAvKiBvcHRpb25hbCBleHRyYSBkYXRhICovCiAgICAgamxvbmcgcG9zOyAgICAgICAgICAgIC8qIHBvc2l0aW9uIG9mIExPQyBoZWFkZXIgb3IgZW50cnkgZGF0YSAqLworICAgIGppbnQgZmxhZzsgICAgICAgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgZmxhZyAqLwogfSBqemVudHJ5OwogCiAvKgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9naWZsaWIvZGdpZl9saWIuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvZ2lmbGliL2RnaWZfbGliLmMKaW5kZXggYmU5MWQzZS4uZjIwMzcyZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9naWZsaWIvZGdpZl9saWIuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2dpZmxpYi9kZ2lmX2xpYi5jCkBAIC03MjIsNiArNzIyLDEwIEBACiAgICAgR2lmRmlsZVByaXZhdGVUeXBlICpQcml2YXRlID0gKEdpZkZpbGVQcml2YXRlVHlwZSAqKUdpZkZpbGUtPlByaXZhdGU7CiAKICAgICBSRUFEKEdpZkZpbGUsICZDb2RlU2l6ZSwgMSk7ICAgIC8qIFJlYWQgQ29kZSBzaXplIGZyb20gZmlsZS4gKi8KKyAgICBpZiAoQ29kZVNpemUgPj0gMTIpIHsKKyAgICAgICAgLyogSW52YWxpZCBpbml0aWFsIGNvZGUgc2l6ZTogcmVwb3J0IGZhaWx1cmUgKi8KKyAgICAgICAgcmV0dXJuIEdJRl9FUlJPUjsKKyAgICB9CiAgICAgQml0c1BlclBpeGVsID0gQ29kZVNpemU7CiAKICAgICBQcml2YXRlLT5CdWZbMF0gPSAwOyAgICAvKiBJbnB1dCBCdWZmZXIgZW1wdHkuICovCkBAIC05NjQsMTAgKzk2OCwxMyBAQAogCiAgICAgLyogSWYgY29kZSBjYW5ub3QgZml0IGludG8gUnVubmluZ0JpdHMgYml0cywgbXVzdCByYWlzZSBpdHMgc2l6ZS4gTm90ZQogICAgICAqIGhvd2V2ZXIgdGhhdCBjb2RlcyBhYm92ZSA0MDk1IGFyZSB1c2VkIGZvciBzcGVjaWFsIHNpZ25hbGluZy4gICovCi0gICAgaWYgKCsrUHJpdmF0ZS0+UnVubmluZ0NvZGUgPiBQcml2YXRlLT5NYXhDb2RlMSAmJgotICAgICAgICBQcml2YXRlLT5SdW5uaW5nQml0cyA8IExaX0JJVFMpIHsKLSAgICAgICAgUHJpdmF0ZS0+TWF4Q29kZTEgPDw9IDE7Ci0gICAgICAgIFByaXZhdGUtPlJ1bm5pbmdCaXRzKys7CisgICAgaWYgKCsrUHJpdmF0ZS0+UnVubmluZ0NvZGUgPiBQcml2YXRlLT5NYXhDb2RlMSkgeworICAgICAgICBpZiAoUHJpdmF0ZS0+UnVubmluZ0JpdHMgPCBMWl9CSVRTKSB7CisgICAgICAgICAgICBQcml2YXRlLT5NYXhDb2RlMSA8PD0gMTsKKyAgICAgICAgICAgIFByaXZhdGUtPlJ1bm5pbmdCaXRzKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQcml2YXRlLT5SdW5uaW5nQ29kZSA9IFByaXZhdGUtPk1heENvZGUxOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBHSUZfT0s7CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2ltYWdlL2dpZi9naWZkZWNvZGVyLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2ltYWdlL2dpZi9naWZkZWNvZGVyLmMKaW5kZXggMTQyOTkzMS4uODkzMDA3ZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9pbWFnZS9naWYvZ2lmZGVjb2Rlci5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvaW1hZ2UvZ2lmL2dpZmRlY29kZXIuYwpAQCAtMTkxLDYgKzE5MSwxMSBAQAogICAgIGludCBwYXNzaHQgPSBwYXNzaW5jOwogICAgIGludCBsZW47CiAKKyAgICAvKiBXZSBoYXZlIHZlcmlmaWVkIHRoZSBpbml0aWFsIGNvZGUgc2l6ZSBvbiB0aGUgamF2YSBsYXllci4KKyAgICAgKiBIZXJlIHdlIGp1c3QgY2hlY2sgYm91bmRzIGZvciBwYXJ0aWN1bGFyIGluZGV4ZXMuICovCisgICAgaWYgKGZyZWVDb2RlID49IDQwOTYgfHwgbWF4Q29kZSA+PSA0MDk2KSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpZiAoYmxvY2toID09IDAgfHwgcmFzbGluZWggPT0gMAogICAgICAgICB8fCBwcmVmaXhoID09IDAgfHwgc3VmZml4aCA9PSAwCiAgICAgICAgIHx8IG91dENvZGVoID09IDApCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L21lZGlhbGliL2F3dF9JbWFnaW5nTGliLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L21lZGlhbGliL2F3dF9JbWFnaW5nTGliLmMKaW5kZXggNjgxZjI2Mi4uMTU3ODI3ZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9tZWRpYWxpYi9hd3RfSW1hZ2luZ0xpYi5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbWVkaWFsaWIvYXd0X0ltYWdpbmdMaWIuYwpAQCAtMjE2LDYgKzIxNiwxNiBAQAogCiAjZW5kaWYgLyogISBERUJVRyAqLwogCitzdGF0aWMgaW50CitnZXRNbGliRWRnZUhpbnQoamludCBlZGdlSGludCkgeworICAgIHN3aXRjaCAoZWRnZUhpbnQpIHsKKyAgICBjYXNlIGphdmFfYXd0X2ltYWdlX0NvbnZvbHZlT3BfRURHRV9OT19PUDoKKyAgICAgICAgcmV0dXJuIE1MSUJfRURHRV9EU1RfQ09QWV9TUkM7CisgICAgY2FzZSBqYXZhX2F3dF9pbWFnZV9Db252b2x2ZU9wX0VER0VfWkVST19GSUxMOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNTElCX0VER0VfRFNUX0ZJTExfWkVSTzsKKyAgICB9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKQEAgLTQwMCwyMiArNDEwLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZWRnZUhpbnQgPT0gamF2YV9hd3RfaW1hZ2VfQ29udm9sdmVPcF9FREdFX05PX09QKSB7Ci0gICAgICAgIGludCBrdzIgPSBrd2lkdGg+PjE7Ci0gICAgICAgIGludCBraDIgPSBraGVpZ2h0Pj4xOwotICAgICAgICBpbnQgYnNpemUgPSBtbGliX0ltYWdlR2V0Q2hhbm5lbHMoc3JjKSoKLSAgICAgICAgICAgIChtbGliX0ltYWdlR2V0VHlwZShzcmMpID09IE1MSUJfQllURSA/IDEgOiAyKTsKLQotICAgICAgICB2b2lkICpkc3REYXRhUCA9IG1saWJfSW1hZ2VHZXREYXRhKGRzdCk7Ci0gICAgICAgIHZvaWQgKnNyY0RhdGFQID0gbWxpYl9JbWFnZUdldERhdGEoc3JjKTsKLSAgICAgICAgLyogUkVNSU5EOiBDb3B5IGEgc21hbGxlciBhcmVhICovCi0gICAgICAgIG1lbWNweShkc3REYXRhUCwgc3JjRGF0YVAsIGRzdC0+d2lkdGgqZHN0LT5oZWlnaHQqYnNpemUpOwotICAgIH0KLQogICAgIGNtYXNrID0gKDE8PHNyYy0+Y2hhbm5lbHMpLTE7CiAgICAgc3RhdHVzID0gKCpzTWxpYkZuc1tNTElCX0NPTlZNeE5dLmZwdHIpKGRzdCwgc3JjLCBrZGF0YSwgdywgaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAody0xKS8yLCAoaC0xKS8yLCBzY2FsZSwgY21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxJQl9FREdFX0RTVF9OT19XUklURSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWxpYkVkZ2VIaW50KGVkZ2VIaW50KSk7CiAKICAgICBpZiAoc3RhdHVzICE9IE1MSUJfU1VDQ0VTUykgewogICAgICAgICBwcmludE1lZGlhbGliRXJyb3Ioc3RhdHVzKTsKQEAgLTY2MCwyMiArNjU4LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZWRnZUhpbnQgPT0gamF2YV9hd3RfaW1hZ2VfQ29udm9sdmVPcF9FREdFX05PX09QKSB7Ci0gICAgICAgIGludCBrdzIgPSBrd2lkdGg+PjE7Ci0gICAgICAgIGludCBraDIgPSBraGVpZ2h0Pj4xOwotICAgICAgICBpbnQgYnNpemUgPSBtbGliX0ltYWdlR2V0Q2hhbm5lbHMoc3JjKSoKLSAgICAgICAgICAgIChtbGliX0ltYWdlR2V0VHlwZShzcmMpID09IE1MSUJfQllURSA/IDEgOiAyKTsKLQotICAgICAgICB2b2lkICpkc3REYXRhUCA9IG1saWJfSW1hZ2VHZXREYXRhKGRzdCk7Ci0gICAgICAgIHZvaWQgKnNyY0RhdGFQID0gbWxpYl9JbWFnZUdldERhdGEoc3JjKTsKLSAgICAgICAgLyogUkVNSU5EOiBDb3B5IGEgc21hbGxlciBhcmVhICovCi0gICAgICAgIG1lbWNweShkc3REYXRhUCwgc3JjRGF0YVAsIGRzdC0+d2lkdGgqZHN0LT5oZWlnaHQqYnNpemUpOwotICAgIH0KLQogICAgIGNtYXNrID0gKDE8PHNyYy0+Y2hhbm5lbHMpLTE7CiAgICAgc3RhdHVzID0gKCpzTWxpYkZuc1tNTElCX0NPTlZNeE5dLmZwdHIpKGRzdCwgc3JjLCBrZGF0YSwgdywgaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAody0xKS8yLCAoaC0xKS8yLCBzY2FsZSwgY21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxJQl9FREdFX0RTVF9OT19XUklURSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWxpYkVkZ2VIaW50KGVkZ2VIaW50KSk7CiAKICAgICBpZiAoc3RhdHVzICE9IE1MSUJfU1VDQ0VTUykgewogICAgICAgICBwcmludE1lZGlhbGliRXJyb3Ioc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3Qvc3BsYXNoc2NyZWVuL3NwbGFzaHNjcmVlbl9nZnhfaW1wbC5oIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9zcGxhc2hzY3JlZW4vc3BsYXNoc2NyZWVuX2dmeF9pbXBsLmgKaW5kZXggMWM1NTcwMi4uMzJmN2Q0ZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9zcGxhc2hzY3JlZW4vc3BsYXNoc2NyZWVuX2dmeF9pbXBsLmgKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9zcGxhc2hzY3JlZW4vc3BsYXNoc2NyZWVuX2dmeF9pbXBsLmgKQEAgLTMxLDcgKzMxLDcgQEAKIC8qIGhlcmUgY29tZSBzb21lIHZlcnkgc2ltcGxlIG1hY3JvcyAqLwogCiAvKiBhZHZhbmNlIGEgcG9pbnRlciBwIGJ5IHNpemVvZih0eXBlKSpuIGJ5dGVzICovCi0jZGVmaW5lIElOQ1BOKHR5cGUscCxuKSAoKHApID0gKHR5cGUqKShwKStuKQorI2RlZmluZSBJTkNQTih0eXBlLHAsbikgKChwKSA9ICh0eXBlKikocCkrKG4pKQogCiAvKiBhZHZhbmNlIGEgcG9pbnRlciBieSBzaXplb2YodHlwZSkgKi8KICNkZWZpbmUgSU5DUCh0eXBlLHApIElOQ1BOKHR5cGUsKHApLDEpCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L3NwbGFzaHNjcmVlbi9zcGxhc2hzY3JlZW5fZ2lmLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L3NwbGFzaHNjcmVlbi9zcGxhc2hzY3JlZW5fZ2lmLmMKaW5kZXggZjZkOWFjYi4uZjE2NTFhYiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9zcGxhc2hzY3JlZW4vc3BsYXNoc2NyZWVuX2dpZi5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3Qvc3BsYXNoc2NyZWVuL3NwbGFzaHNjcmVlbl9naWYuYwpAQCAtNjIsNiArNjIsMTUgQEAKICAgICByZXR1cm4gcmM7CiB9CiAKKy8qIFRoZXNlIG1hY3JvIGhlbHAgdG8gZW5zdXJlIHRoYXQgd2Ugb25seSB0YWtlIHBhcnQgb2YgZnJhbWUgdGhhdCBmaXRzIGludG8KKyAgIGxvZ2ljYWwgc2NyZWVuLiAqLworCisvKiBFbnN1cmUgdGhhdCBwIGJlbG9uZ3MgdG8gW3BtaW4sIHBtYXgpIGludGVydmFsLiBSZXR1cm5zIGZpeGVkIHBvaW50IChpZiBmaXggaXMgbmVlZGVkKSAqLworI2RlZmluZSBGSVhfUE9JTlQocCwgcG1pbiwgcG1heCkgKCAoKHApIDwgKHBtaW4pKSA/IChwbWluKSA6ICgoKHApID4gKHBtYXgpKSA/IChwbWF4KSA6IChwKSkpCisvKiBFbnN1cmVzIHRoYXQgbGluZSBzdGFydGluZyBhdCBwb2ludCBwIGRvZXMgbm90IGV4Y2VlZCBib3VuZGFyeSBwbWF4LgorICAgUmV0dXJucyBmaXhlZCBsZW5ndGggKGlmIGZpeCBpcyBuZWVkZWQpICovCisjZGVmaW5lIEZJWF9MRU5HVEgocCwgbGVuLCBwbWF4KSAoICgocCkgKyAobGVuKSkgPiAocG1heCkgPyAoKHBtYXgpIC0gKHApKSA6IChsZW4pKQorCiBpbnQKIFNwbGFzaERlY29kZUdpZihTcGxhc2ggKiBzcGxhc2gsIEdpZkZpbGVUeXBlICogZ2lmKQogewpAQCAtNzAsNiArNzksNyBAQAogICAgIGJ5dGVfdCAqcEJpdG1hcEJpdHMsICpwT2xkQml0bWFwQml0czsKICAgICBpbnQgaSwgajsKICAgICBpbnQgaW1hZ2VJbmRleDsKKyAgICBpbnQgY3gsIGN5LCBjdywgY2g7IC8qIGNsYW1wZWQgY29vcmRpbmF0ZXMgKi8KICAgICBjb25zdCBpbnQgaW50ZXJsYWNlZE9mZnNldFtdID0geyAwLCA0LCAyLCAxLCAwIH07ICAgLyogVGhlIHdheSBJbnRlcmxhY2VkIGltYWdlIHNob3VsZC4gKi8KICAgICBjb25zdCBpbnQgaW50ZXJsYWNlZEp1bXBzW10gPSB7IDgsIDgsIDQsIDIsIDEgfTsgICAgLyogYmUgcmVhZCAtIG9mZnNldHMgYW5kIGp1bXBzLi4uICovCiAKQEAgLTc5LDE0ICs4OSwzMSBAQAogCiAgICAgU3BsYXNoQ2xlYW51cChzcGxhc2gpOwogCisgICAgaWYgKCFTQUZFX1RPX0FMTE9DKGdpZi0+U1dpZHRoLCBzcGxhc2gtPmltYWdlRm9ybWF0LmRlcHRoQnl0ZXMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBzdHJpZGUgPSBnaWYtPlNXaWR0aCAqIHNwbGFzaC0+aW1hZ2VGb3JtYXQuZGVwdGhCeXRlczsKICAgICBpZiAoc3BsYXNoLT5ieXRlQWxpZ25tZW50ID4gMSkKICAgICAgICAgc3RyaWRlID0KICAgICAgICAgICAgIChzdHJpZGUgKyBzcGxhc2gtPmJ5dGVBbGlnbm1lbnQgLSAxKSAmIH4oc3BsYXNoLT5ieXRlQWxpZ25tZW50IC0gMSk7CiAKKyAgICBpZiAoIVNBRkVfVE9fQUxMT0MoZ2lmLT5TSGVpZ2h0LCBzdHJpZGUpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghU0FGRV9UT19BTExPQyhnaWYtPkltYWdlQ291bnQsIHNpemVvZihTcGxhc2hJbWFnZSopKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgYnVmZmVyU2l6ZSA9IHN0cmlkZSAqIGdpZi0+U0hlaWdodDsKICAgICBwQml0bWFwQml0cyA9IChieXRlX3QgKikgbWFsbG9jKGJ1ZmZlclNpemUpOworICAgIGlmICghcEJpdG1hcEJpdHMpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIHBPbGRCaXRtYXBCaXRzID0gKGJ5dGVfdCAqKSBtYWxsb2MoYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFwT2xkQml0bWFwQml0cykgeworICAgICAgICBmcmVlKHBCaXRtYXBCaXRzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIG1lbXNldChwQml0bWFwQml0cywgMCwgYnVmZmVyU2l6ZSk7CiAKICAgICBzcGxhc2gtPndpZHRoID0gZ2lmLT5TV2lkdGg7CkBAIC05NCw2ICsxMjEsMTEgQEAKICAgICBzcGxhc2gtPmZyYW1lQ291bnQgPSBnaWYtPkltYWdlQ291bnQ7CiAgICAgc3BsYXNoLT5mcmFtZXMgPSAoU3BsYXNoSW1hZ2UgKikKICAgICAgICAgbWFsbG9jKHNpemVvZihTcGxhc2hJbWFnZSkgKiBnaWYtPkltYWdlQ291bnQpOworICAgIGlmICghc3BsYXNoLT5mcmFtZXMpIHsKKyAgICAgIGZyZWUocEJpdG1hcEJpdHMpOworICAgICAgZnJlZShwT2xkQml0bWFwQml0cyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgbWVtc2V0KHNwbGFzaC0+ZnJhbWVzLCAwLCBzaXplb2YoU3BsYXNoSW1hZ2UpICogZ2lmLT5JbWFnZUNvdW50KTsKICAgICBzcGxhc2gtPmxvb3BDb3VudCA9IDE7CiAKQEAgLTEwOSw2ICsxNDEsMTEgQEAKICAgICAgICAgaW50IGNvbG9yQ291bnQgPSAwOwogICAgICAgICByZ2JxdWFkX3QgY29sb3JNYXBCdWZbU1BMQVNIX0NPTE9SX01BUF9TSVpFXTsKIAorICAgICAgICBjeCA9IEZJWF9QT0lOVChkZXNjLT5MZWZ0LCAwLCBnaWYtPlNXaWR0aCk7CisgICAgICAgIGN5ID0gRklYX1BPSU5UKGRlc2MtPlRvcCwgMCwgZ2lmLT5TSGVpZ2h0KTsKKyAgICAgICAgY3cgPSBGSVhfTEVOR1RIKGRlc2MtPkxlZnQsIGRlc2MtPldpZHRoLCBnaWYtPlNXaWR0aCk7CisgICAgICAgIGNoID0gRklYX0xFTkdUSChkZXNjLT5Ub3AsIGRlc2MtPkhlaWdodCwgZ2lmLT5TSGVpZ2h0KTsKKwogICAgICAgICBpZiAoY29sb3JNYXApIHsKICAgICAgICAgICAgIGlmIChjb2xvck1hcC0+Q29sb3JDb3VudCA8PSBTUExBU0hfQ09MT1JfTUFQX1NJWkUpIHsKICAgICAgICAgICAgICAgICBjb2xvckNvdW50ID0gY29sb3JNYXAtPkNvbG9yQ291bnQ7CkBAIC0xOTUsMTMgKzIzMiwyMiBAQAogICAgICAgICAgICAgZm9yICg7IHBhc3MgPCBucGFzczsgKytwYXNzKSB7CiAgICAgICAgICAgICAgICAgaW50IGp1bXAgPSBpbnRlcmxhY2VkSnVtcHNbcGFzc107CiAgICAgICAgICAgICAgICAgaW50IG9mcyA9IGludGVybGFjZWRPZmZzZXRbcGFzc107Ci0gICAgICAgICAgICAgICAgaW50IG51bUxpbmVzID0gKGRlc2MtPkhlaWdodCArIGp1bXAgLSAxIC0gb2ZzKSAvIGp1bXA7CisgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNvdXJjZSBsaW5lcyBmb3IgY3VycmVudCBwYXNzICovCisgICAgICAgICAgICAgICAgaW50IG51bVBhc3NMaW5lcyA9IChkZXNjLT5IZWlnaHQgKyBqdW1wIC0gb2ZzIC0gMSkgLyBqdW1wOworICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBsaW5lcyB0aGF0IGZpdHMgdG8gZGVzdCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBpbnQgbnVtTGluZXMgPSAoY2ggKyBqdW1wIC0gb2ZzIC0gMSkgLyBqdW1wOwogCiAgICAgICAgICAgICAgICAgaW5pdFJlY3QoJnNyY1JlY3QsIDAsIDAsIGRlc2MtPldpZHRoLCBudW1MaW5lcywgMSwKICAgICAgICAgICAgICAgICAgICAgZGVzYy0+V2lkdGgsIHBTcmMsICZzcmNGb3JtYXQpOwotICAgICAgICAgICAgICAgIGluaXRSZWN0KCZkc3RSZWN0LCBkZXNjLT5MZWZ0LCBkZXNjLT5Ub3AgKyBvZnMsIGRlc2MtPldpZHRoLAotICAgICAgICAgICAgICAgICAgICBudW1MaW5lcywganVtcCwgc3RyaWRlLCBwQml0bWFwQml0cywgJnNwbGFzaC0+aW1hZ2VGb3JtYXQpOwotICAgICAgICAgICAgICAgIHBTcmMgKz0gY29udmVydFJlY3QoJnNyY1JlY3QsICZkc3RSZWN0LCBDVlRfQUxQSEFURVNUKTsKKworICAgICAgICAgICAgICAgIGlmIChudW1MaW5lcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdFJlY3QoJmRzdFJlY3QsIGN4LCBjeSArIG9mcywgY3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUxpbmVzICwganVtcCwgc3RyaWRlLCBwQml0bWFwQml0cywgJnNwbGFzaC0+aW1hZ2VGb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgIHBTcmMgKz0gY29udmVydFJlY3QoJnNyY1JlY3QsICZkc3RSZWN0LCBDVlRfQUxQSEFURVNUKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gc2tpcCBleHRyYSBzb3VyY2UgZGF0YQorICAgICAgICAgICAgICAgIHBTcmMgKz0gKG51bVBhc3NMaW5lcyAtIG51bUxpbmVzKSAqIHNyY1JlY3Quc3RyaWRlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIwOSw2ICsyNTUsMTIgQEAKIAogICAgICAgICBzcGxhc2gtPmZyYW1lc1tpbWFnZUluZGV4XS5iaXRtYXBCaXRzID0KICAgICAgICAgICAgIChyZ2JxdWFkX3QgKikgbWFsbG9jKGJ1ZmZlclNpemUpOworICAgICAgICBpZiAoIXNwbGFzaC0+ZnJhbWVzW2ltYWdlSW5kZXhdLmJpdG1hcEJpdHMpIHsKKyAgICAgICAgICAgIGZyZWUocEJpdG1hcEJpdHMpOworICAgICAgICAgICAgZnJlZShwT2xkQml0bWFwQml0cyk7CisgICAgICAgICAgICAvKiBBc3N1bWluZyB0aGF0IGNhbGxlZSB3aWxsIHRha2UgY2FyZSBvZiBzcGxhc2ggZnJhbWVzIHdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgICAgIG1lbWNweShzcGxhc2gtPmZyYW1lc1tpbWFnZUluZGV4XS5iaXRtYXBCaXRzLCBwQml0bWFwQml0cywgYnVmZmVyU2l6ZSk7CiAKICAgICAgICAgU3BsYXNoSW5pdEZyYW1lU2hhcGUoc3BsYXNoLCBpbWFnZUluZGV4KTsKQEAgLTIyNCwyNyArMjc2LDI5IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSW1hZ2VSZWN0IGRzdFJlY3Q7CiAgICAgICAgICAgICAgICAgcmdicXVhZF90IGZpbGxDb2xvciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCBpcyB0cmFuc3BhcmVudAotICAgICAgICAgICAgICAgIGlmICh0cmFuc3BhcmVudENvbG9yIDwgMCkgeworCisgICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50Q29sb3IgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcj0gTUFLRV9RVUFEX0dJRigKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwLT5Db2xvcnNbZ2lmLT5TQmFja0dyb3VuZENvbG9yXSwgMHhmZik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluaXRSZWN0KCZkc3RSZWN0LCBkZXNjLT5MZWZ0LCBkZXNjLT5Ub3AsCi0gICAgICAgICAgICAgICAgICAgIGRlc2MtPldpZHRoLCBkZXNjLT5IZWlnaHQsIDEsIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgcEJpdG1hcEJpdHMsICZzcGxhc2gtPmltYWdlRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpbml0UmVjdCgmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjeCwgY3ksIGN3LCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcEJpdHMsICZzcGxhc2gtPmltYWdlRm9ybWF0KTsKICAgICAgICAgICAgICAgICBmaWxsUmVjdChmaWxsQ29sb3IsICZkc3RSZWN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEdJRl9ESVNQT1NFX1JFU1RPUkU6CiAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbGluZVNpemUgPSBkZXNjLT5XaWR0aCAqIHNwbGFzaC0+aW1hZ2VGb3JtYXQuZGVwdGhCeXRlczsKLQotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZXNjLT5IZWlnaHQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUluZGV4ID0gc3RyaWRlICogKGogKyBkZXNjLT5Ub3ApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPkxlZnQgKiBzcGxhc2gtPmltYWdlRm9ybWF0LmRlcHRoQnl0ZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBCaXRtYXBCaXRzICsgbGluZUluZGV4LCBwT2xkQml0bWFwQml0cyArIGxpbmVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTaXplKTsKKyAgICAgICAgICAgICAgICBpbnQgbGluZVNpemUgPSBjdyAqIHNwbGFzaC0+aW1hZ2VGb3JtYXQuZGVwdGhCeXRlczsKKyAgICAgICAgICAgICAgICBpZiAobGluZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsaW5lT2Zmc2V0ID0gY3ggKiBzcGxhc2gtPmltYWdlRm9ybWF0LmRlcHRoQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIGludCBsaW5lSW5kZXggPSBjeSAqIHN0cmlkZSArIGxpbmVPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGNoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwQml0bWFwQml0cyArIGxpbmVJbmRleCwgcE9sZEJpdG1hcEJpdHMgKyBsaW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZUluZGV4ICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9zcGxhc2hzY3JlZW4vc3BsYXNoc2NyZWVuX2ltcGwuaCBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3Qvc3BsYXNoc2NyZWVuL3NwbGFzaHNjcmVlbl9pbXBsLmgKaW5kZXggYzZiYWQxNC4uNmY0ZTAzZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9zcGxhc2hzY3JlZW4vc3BsYXNoc2NyZWVuX2ltcGwuaAorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L3NwbGFzaHNjcmVlbi9zcGxhc2hzY3JlZW5faW1wbC5oCkBAIC0xNTUsNiArMTU1LDEwIEBACiAKIHZvaWQgU3BsYXNoSW5pdEZyYW1lU2hhcGUoU3BsYXNoICogc3BsYXNoLCBpbnQgaW1hZ2VJbmRleCk7CiAKKyNkZWZpbmUgU0FGRV9UT19BTExPQyhjLCBzeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChjKSA+IDApICYmICgoc3opID4gMCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgweGZmZmZmZmZmdSAvICgodW5zaWduZWQgaW50KShjKSkpID4gKHVuc2lnbmVkIGludCkoc3opKSkKKwogI2RlZmluZSBkYmdwcmludGYgcHJpbnRmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9zcGxhc2hzY3JlZW4vc3BsYXNoc2NyZWVuX3BuZy5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9zcGxhc2hzY3JlZW4vc3BsYXNoc2NyZWVuX3BuZy5jCmluZGV4IGYwOTI2ZWMuLmFiYzU0ZGMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3Qvc3BsYXNoc2NyZWVuL3NwbGFzaHNjcmVlbl9wbmcuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L3NwbGFzaHNjcmVlbi9zcGxhc2hzY3JlZW5fcG5nLmMKQEAgLTEwMyw5ICsxMDMsMTcgQEAKIAogICAgIHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7CiAKKyAgICBpZiAoIVNBRkVfVE9fQUxMT0Mocm93Ynl0ZXMsIGhlaWdodCkpIHsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKwogICAgIGlmICgoaW1hZ2VfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyhyb3dieXRlcyAqIGhlaWdodCkpID09IE5VTEwpIHsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KKworICAgIGlmICghU0FGRV9UT19BTExPQyhoZWlnaHQsIHNpemVvZihwbmdfYnl0ZXApKSkgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogICAgIGlmICgocm93X3BvaW50ZXJzID0gKHBuZ19ieXRlcHApIG1hbGxvYyhoZWlnaHQgKiBzaXplb2YocG5nX2J5dGVwKSkpCiAgICAgICAgICAgICA9PSBOVUxMKSB7CiAgICAgICAgIGdvdG8gZG9uZTsKQEAgLTEyMSwxMyArMTI5LDI4IEBACiAgICAgc3BsYXNoLT53aWR0aCA9IHdpZHRoOwogICAgIHNwbGFzaC0+aGVpZ2h0ID0gaGVpZ2h0OwogCisgICAgaWYgKCFTQUZFX1RPX0FMTE9DKHNwbGFzaC0+d2lkdGgsIHNwbGFzaC0+aW1hZ2VGb3JtYXQuZGVwdGhCeXRlcykpIHsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KICAgICBzdHJpZGUgPSBzcGxhc2gtPndpZHRoICogc3BsYXNoLT5pbWFnZUZvcm1hdC5kZXB0aEJ5dGVzOwogCisgICAgaWYgKCFTQUZFX1RPX0FMTE9DKHNwbGFzaC0+aGVpZ2h0LCBzdHJpZGUpKSB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAgICAgc3BsYXNoLT5mcmFtZUNvdW50ID0gMTsKICAgICBzcGxhc2gtPmZyYW1lcyA9IChTcGxhc2hJbWFnZSAqKQogICAgICAgICBtYWxsb2Moc2l6ZW9mKFNwbGFzaEltYWdlKSAqIHNwbGFzaC0+ZnJhbWVDb3VudCk7CisKKyAgICBpZiAoc3BsYXNoLT5mcmFtZXMgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCiAgICAgc3BsYXNoLT5sb29wQ291bnQgPSAxOwogICAgIHNwbGFzaC0+ZnJhbWVzWzBdLmJpdG1hcEJpdHMgPSBtYWxsb2Moc3RyaWRlICogc3BsYXNoLT5oZWlnaHQpOworICAgIGlmIChzcGxhc2gtPmZyYW1lc1swXS5iaXRtYXBCaXRzID09IE5VTEwpIHsKKyAgICAgICAgZnJlZShzcGxhc2gtPmZyYW1lcyk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAgICAgc3BsYXNoLT5mcmFtZXNbMF0uZGVsYXkgPSAwOwogCiAgICAgLyogRklYTUU6IHNvcnQgb3V0IHRoZSByZWFsIGZvcm1hdCAqLwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9zYW1wbGUvbmlvL2ZpbGUvQ29weS5qYXZhIGIvamRrL3NyYy9zaGFyZS9zYW1wbGUvbmlvL2ZpbGUvQ29weS5qYXZhCmluZGV4IGUxZDVkMDQuLmJjZDNhZjAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvc2FtcGxlL25pby9maWxlL0NvcHkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL3NhbXBsZS9uaW8vZmlsZS9Db3B5LmphdmEKQEAgLTUyLDcgKzUyLDcgQEAKIAogICAgIC8qKgogICAgICAqIENvcHkgc291cmNlIGZpbGUgdG8gdGFyZ2V0IGxvY2F0aW9uLiBJZiB7QGNvZGUgcHJvbXB0fSBpcyB0cnVlIHRoZW4KLSAgICAgKiBwcm9tcHRlZCB1c2VyIHRvIG92ZXJ3cml0ZSB0YXJnZXQgaWYgaXQgZXhpc3RzLiBUaGUge0Bjb2RlIHByZXNlcnZlfQorICAgICAqIHByb21wdCB1c2VyIHRvIG92ZXJ3cml0ZSB0YXJnZXQgaWYgaXQgZXhpc3RzLiBUaGUge0Bjb2RlIHByZXNlcnZlfQogICAgICAqIHBhcmFtZXRlciBkZXRlcm1pbmVzIGlmIGZpbGUgYXR0cmlidXRlcyBzaG91bGQgYmUgY29waWVkL3ByZXNlcnZlZC4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBjb3B5RmlsZShQYXRoIHNvdXJjZSwgUGF0aCB0YXJnZXQsIGJvb2xlYW4gcHJvbXB0LCBib29sZWFuIHByZXNlcnZlKSB7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHNvdXJjZS5jb3B5VG8odGFyZ2V0LCBvcHRpb25zKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLmZvcm1hdCgiVW5hYmxlIHRvIGNyZWF0ZTogJXM6ICVzJW4iLCB0YXJnZXQsIHgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIuZm9ybWF0KCJVbmFibGUgdG8gY29weTogJXM6ICVzJW4iLCBzb3VyY2UsIHgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTI0LDEzICsxMjQsMTMgQEAKICAgICAgICAgcHVibGljIEZpbGVWaXNpdFJlc3VsdCBwb3N0VmlzaXREaXJlY3RvcnkoUGF0aCBkaXIsIElPRXhjZXB0aW9uIGV4YykgewogICAgICAgICAgICAgLy8gZml4IHVwIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGRpcmVjdG9yeSB3aGVuIGRvbmUKICAgICAgICAgICAgIGlmIChleGMgPT0gbnVsbCAmJiBwcmVzZXJ2ZSkgeworICAgICAgICAgICAgICAgIFBhdGggbmV3ZGlyID0gdGFyZ2V0LnJlc29sdmUoc291cmNlLnJlbGF0aXZpemUoZGlyKSk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRycyA9IEF0dHJpYnV0ZXMucmVhZEJhc2ljRmlsZUF0dHJpYnV0ZXMoZGlyKTsKLSAgICAgICAgICAgICAgICAgICAgUGF0aCBuZXdkaXIgPSB0YXJnZXQucmVzb2x2ZShzb3VyY2UucmVsYXRpdml6ZShkaXIpKTsKICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcy5zZXRMYXN0TW9kaWZpZWRUaW1lKG5ld2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmxhc3RNb2RpZmllZFRpbWUoKSwgYXR0cnMucmVzb2x1dGlvbigpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLmZvcm1hdCgiVW5hYmxlIHRvIGNvcHkgYWxsIGF0dHJpYnV0ZXMgdG86ICVzOiAlcyVuIiwgbmV3ZGlyLCB4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gQ09OVElOVUU7CkBAIC0xOTEsNiArMTkxLDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlzRGlyID0gQXR0cmlidXRlcy5yZWFkQmFzaWNGaWxlQXR0cmlidXRlcyh0YXJnZXQpLmlzRGlyZWN0b3J5KCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSAocHJvYmFibHkgdGFyZ2V0IGRvZXMgbm90IGV4aXN0KQogICAgICAgICB9CiAKICAgICAgICAgLy8gY29weSBlYWNoIHNvdXJjZSBmaWxlL2RpcmVjdG9yeSB0byB0YXJnZXQKQEAgLTIwMSw3ICsyMDIsNyBAQAogICAgICAgICAgICAgICAgIC8vIGZvbGxvdyBsaW5rcyB3aGVuIGNvcHlpbmcgZmlsZXMKICAgICAgICAgICAgICAgICBFbnVtU2V0PEZpbGVWaXNpdE9wdGlvbj4gb3B0cyA9IEVudW1TZXQub2YoRmlsZVZpc2l0T3B0aW9uLkZPTExPV19MSU5LUyk7CiAgICAgICAgICAgICAgICAgVHJlZUNvcGllciB0YyA9IG5ldyBUcmVlQ29waWVyKHNvdXJjZVtpXSwgZGVzdCwgcHJvbXB0LCBwcmVzZXJ2ZSk7Ci0gICAgICAgICAgICAgICAgRmlsZXMud2Fsa0ZpbGVUcmVlKHNvdXJjZVtpXSwgb3B0cywgLTEsIHRjKTsKKyAgICAgICAgICAgICAgICBGaWxlcy53YWxrRmlsZVRyZWUoc291cmNlW2ldLCBvcHRzLCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBub3QgcmVjdXJzaXZlIHNvIHNvdXJjZSBtdXN0IG5vdCBiZSBhIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0yMDksNyArMjEwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIuZm9ybWF0KCIlczogaXMgYSBkaXJlY3RvcnklbiIsIHNvdXJjZVtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIG5vdCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29weUZpbGUoc291cmNlW2ldLCBkZXN0LCBwcm9tcHQsIHByZXNlcnZlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWERlY29yYXRlZFBlZXIuamF2YSBiL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hEZWNvcmF0ZWRQZWVyLmphdmEKaW5kZXggNzM5NzEzZC4uM2ZjNWM5YiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWERlY29yYXRlZFBlZXIuamF2YQorKysgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9YRGVjb3JhdGVkUGVlci5qYXZhCkBAIC00OTAsOCArNDkwLDcgQEAKICAgICAgICAgICAgIC8vIGlmIHRoZSB3aW5kb3cgbWFuYWdlciBvciBhbnkgb3RoZXIgcGFydCBvZiB0aGUgd2luZG93aW5nCiAgICAgICAgICAgICAvLyBzeXN0ZW0gc2V0cyBpbmFwcHJvcHJpYXRlIHNpemUgZm9yIHRoaXMgd2luZG93LCB3ZSBjYW4KICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgYnV0IGFjY2VwdCBpdC4KLSAgICAgICAgICAgIFJlY3RhbmdsZSByZXFCb3VuZHMgPSBuZXdEaW1lbnNpb25zLmdldEJvdW5kcygpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIG5ld0JvdW5kcyA9IGNvbnN0cmFpbkJvdW5kcyhyZXFCb3VuZHMueCwgcmVxQm91bmRzLnksIHJlcUJvdW5kcy53aWR0aCwgcmVxQm91bmRzLmhlaWdodCk7CisgICAgICAgICAgICBSZWN0YW5nbGUgbmV3Qm91bmRzID0gbmV3RGltZW5zaW9ucy5nZXRCb3VuZHMoKTsKICAgICAgICAgICAgIEluc2V0cyBpbnNldHMgPSBuZXdEaW1lbnNpb25zLmdldEluc2V0cygpOwogICAgICAgICAgICAgLy8gSW5oZXJpdCBpc0NsaWVudFNpemVTZXQgZnJvbSBuZXdEaW1lbnNpb25zCiAgICAgICAgICAgICBpZiAobmV3RGltZW5zaW9ucy5pc0NsaWVudFNpemVTZXQoKSkgewpAQCAtNjE5LDQ2ICs2MTgsNiBAQAogICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgb3ZlcnJpZGVuIGluIFhGcmFtZVBlZXIgJiBYRGlhbG9nUGVlci4KICAgICBhYnN0cmFjdCBib29sZWFuIGlzVGFyZ2V0VW5kZWNvcmF0ZWQoKTsKIAotICAgIEBPdmVycmlkZQotICAgIFJlY3RhbmdsZSBjb25zdHJhaW5Cb3VuZHMoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgcmVzdHJpY3QgdGhlIHNldEJvdW5kcygpIG9wZXJhdGlvbiBpZiB0aGUgY29kZSBpcyB0cnVzdGVkLgotICAgICAgICBpZiAoIWhhc1dhcm5pbmdXaW5kb3coKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBpdCdzIHVuZGVjb3JhdGVkIG9yIGlzIG5vdCBjdXJyZW50bHkgdmlzaWJsZSwKLSAgICAgICAgLy8gYXBwbHkgdGhlIHNhbWUgY29uc3RyYWludHMgYXMgZm9yIHRoZSBXaW5kb3cuCi0gICAgICAgIGlmICghaXNWaXNpYmxlKCkgfHwgaXNUYXJnZXRVbmRlY29yYXRlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuY29uc3RyYWluQm91bmRzKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgaXQncyB2aXNpYmxlICYgZGVjb3JhdGVkLCBjb25zdHJhaW50IHRoZSBzaXplIG9ubHkKLSAgICAgICAgaW50IG5ld1ggPSB4OwotICAgICAgICBpbnQgbmV3WSA9IHk7Ci0gICAgICAgIGludCBuZXdXID0gd2lkdGg7Ci0gICAgICAgIGludCBuZXdIID0gaGVpZ2h0OwotCi0gICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYyA9ICgoV2luZG93KXRhcmdldCkuZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFJlY3RhbmdsZSBzQiA9IGdjLmdldEJvdW5kcygpOwotICAgICAgICBJbnNldHMgc0luID0gKChXaW5kb3cpdGFyZ2V0KS5nZXRUb29sa2l0KCkuZ2V0U2NyZWVuSW5zZXRzKGdjKTsKLQotICAgICAgICBSZWN0YW5nbGUgY3VyQm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0KLSAgICAgICAgaW50IG1heFcgPSBNYXRoLm1heChzQi53aWR0aCAtIHNJbi5sZWZ0IC0gc0luLnJpZ2h0LCBjdXJCb3VuZHMud2lkdGgpOwotICAgICAgICBpbnQgbWF4SCA9IE1hdGgubWF4KHNCLmhlaWdodCAtIHNJbi50b3AgLSBzSW4uYm90dG9tLCBjdXJCb3VuZHMuaGVpZ2h0KTsKLQotICAgICAgICAvLyBGaXJzdCBtYWtlIHN1cmUgdGhlIHNpemUgaXMgd2l0aGluZyB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSBzY3JlZW4KLSAgICAgICAgaWYgKG5ld1cgPiBtYXhXKSB7Ci0gICAgICAgICAgICBuZXdXID0gbWF4VzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXdIID4gbWF4SCkgewotICAgICAgICAgICAgbmV3SCA9IG1heEg7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShuZXdYLCBuZXdZLCBuZXdXLCBuZXdIKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBAc2VlIGphdmEuYXd0LnBlZXIuQ29tcG9uZW50UGVlciNzZXRCb3VuZHMKICAgICAgKi8KZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hFbWJlZGRlZEZyYW1lUGVlci5qYXZhIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWEVtYmVkZGVkRnJhbWVQZWVyLmphdmEKaW5kZXggODkyZDdjOS4uNGI5YmNjOSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWEVtYmVkZGVkRnJhbWVQZWVyLmphdmEKKysrIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWEVtYmVkZGVkRnJhbWVQZWVyLmphdmEKQEAgLTE5NiwxMiArMTk2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIFJlY3RhbmdsZSBjb25zdHJhaW5Cb3VuZHMoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgY29uc3RyYWluIHRoZSBib3VuZHMgb2YgdGhlIEVtYmVkZGVkRnJhbWVzCi0gICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQogICAgIC8vIGRvbid0IHVzZSBnZXRCb3VuZHMoKSBpbmhlcml0ZWQgZnJvbSBYRGVjb3JhdGVkUGVlcgogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgewogICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hUb29sa2l0LmphdmEgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9YVG9vbGtpdC5qYXZhCmluZGV4IDhhNTAzMGMuLjk2N2EyODUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hUb29sa2l0LmphdmEKKysrIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFRvb2xraXQuamF2YQpAQCAtNTY4LDYgKzU2OCwxNyBAQAogICAgIHsKICAgICAgICAgWEV2ZW50IGV2ID0gbmV3IFhFdmVudCgpOwogICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAvLyBGaXggZm9yIDY4Mjk5MjM6IHdlIHNob3VsZCBncmFjZWZ1bGx5IGhhbmRsZSB0b29sa2l0IHRocmVhZCBpbnRlcnJ1cHRpb24KKyAgICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBpbnRlcnJ1cHRpb24gZnJvbSB0aGUgQXBwQ29udGV4dC5kaXNwb3NlKCkgbWV0aG9kIG9ubHkuCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCBmcm9tIGFub3RoZXIgcGxhY2UsIGxldCdzIHNraXAgaXQKKyAgICAgICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiBQcm9iYWJseSBzb21lIHRpbWUgbGF0ZXIgd2UnbGwgcmVtb3ZlCisgICAgICAgICAgICAgICAgLy8gdGhlIGNoZWNrIGZvciBBcHBDb250ZXh0LmlzRGlzcG9zZWQoKSBhbmQgd2lsbCB1bmNvbmRpdGlvbmFsbHkKKyAgICAgICAgICAgICAgICAvLyBicmVhayB0aGUgbG9vcCBoZXJlLgorICAgICAgICAgICAgICAgIGlmIChBcHBDb250ZXh0LmdldEFwcENvbnRleHQoKS5pc0Rpc3Bvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgYXd0TG9jaygpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZiAobG9vcCA9PSBTRUNPTkRBUllfTE9PUCkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvdy5qYXZhIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvdy5qYXZhCmluZGV4IDZjNTE3YjEuLjUxMTVmNDYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hXaW5kb3cuamF2YQorKysgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9YV2luZG93LmphdmEKQEAgLTE1NiwxMSArMTU2LDExIEBACiAgICAgfQogCiAgICAgWFdpbmRvdyhDb21wb25lbnQgdGFyZ2V0LCBsb25nIHBhcmVudFdpbmRvdykgewotICAgICAgICB0aGlzKHRhcmdldCwgcGFyZW50V2luZG93LCB0YXJnZXQuZ2V0Qm91bmRzKCkpOworICAgICAgICB0aGlzKHRhcmdldCwgcGFyZW50V2luZG93LCBuZXcgUmVjdGFuZ2xlKHRhcmdldC5nZXRCb3VuZHMoKSkpOwogICAgIH0KIAogICAgIFhXaW5kb3coQ29tcG9uZW50IHRhcmdldCkgewotICAgICAgICB0aGlzKHRhcmdldCwgKHRhcmdldC5nZXRQYXJlbnQoKSA9PSBudWxsKSA/IDAgOiBnZXRQYXJlbnRXaW5kb3dJRCh0YXJnZXQpLCB0YXJnZXQuZ2V0Qm91bmRzKCkpOworICAgICAgICB0aGlzKHRhcmdldCwgKHRhcmdldC5nZXRQYXJlbnQoKSA9PSBudWxsKSA/IDAgOiBnZXRQYXJlbnRXaW5kb3dJRCh0YXJnZXQpLCBuZXcgUmVjdGFuZ2xlKHRhcmdldC5nZXRCb3VuZHMoKSkpOwogICAgIH0KIAogICAgIFhXaW5kb3coT2JqZWN0IHRhcmdldCkgewpAQCAtMTk4LDcgKzE5OCw3IEBACiAgICAgICAgICAgICB8IFhDb25zdGFudHMuQnV0dG9uTW90aW9uTWFzayB8IFhDb25zdGFudHMuRXhwb3N1cmVNYXNrIHwgWENvbnN0YW50cy5TdHJ1Y3R1cmVOb3RpZnlNYXNrKTsKIAogICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmFtcy5wdXRJZk51bGwoQk9VTkRTLCB0YXJnZXQuZ2V0Qm91bmRzKCkpOworICAgICAgICAgICAgcGFyYW1zLnB1dElmTnVsbChCT1VORFMsIG5ldyBSZWN0YW5nbGUodGFyZ2V0LmdldEJvdW5kcygpKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwYXJhbXMucHV0SWZOdWxsKEJPVU5EUywgbmV3IFJlY3RhbmdsZSgwLCAwLCBNSU5fU0laRSwgTUlOX1NJWkUpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvd1BlZXIuamF2YSBiL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hXaW5kb3dQZWVyLmphdmEKaW5kZXggNDE4MDdkYi4uZTc4ZDAwNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvd1BlZXIuamF2YQorKysgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9YV2luZG93UGVlci5qYXZhCkBAIC0xNDYsNiArMTQ2LDEzIEBACiAKICAgICAgICAgcGFyYW1zLnB1dChPVkVSUklERV9SRURJUkVDVCwgQm9vbGVhbi52YWx1ZU9mKGlzT3ZlcnJpZGVSZWRpcmVjdCgpKSk7CiAKKyAgICAgICAgU3VuVG9vbGtpdC5hd3RMb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aW5kb3dzLmFkZCh0aGlzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN1blRvb2xraXQuYXd0VW5sb2NrKCk7CisgICAgICAgIH0KKwogICAgICAgICBjYWNoZWRGb2N1c2FibGVXaW5kb3cgPSBpc0ZvY3VzYWJsZVdpbmRvdygpOwogCiAgICAgICAgIEZvbnQgZiA9IHRhcmdldC5nZXRGb250KCk7CkBAIC0xNzMsOSArMTgwLDYgQEAKIAogICAgICAgICBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MgPSBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgKChYMTFHcmFwaGljc0RldmljZSlnYy5nZXREZXZpY2UoKSkuYWRkRGlzcGxheUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gKFJlY3RhbmdsZSkocGFyYW1zLmdldChCT1VORFMpKTsKLSAgICAgICAgcGFyYW1zLnB1dChCT1VORFMsIGNvbnN0cmFpbkJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCkpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0V01OYW1lKCkgewpAQCAtNDMwLDU2ICs0MzQsNiBAQAogICAgICAgICByZXR1cm4gb3duZXJQZWVyOwogICAgIH0KIAotICAgIC8vIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiBhdCB0aGUgWERlY29yYXRlZFBlZXIgdG8gaGFuZGxlCi0gICAgLy8gZGVjb3JhdGVkIHdpbmRvd3MgYSBiaXQgZGlmZmVyZW50bHkuCi0gICAgUmVjdGFuZ2xlIGNvbnN0cmFpbkJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAvLyBXZSBkb24ndCByZXN0cmljdCB0aGUgc2V0Qm91bmRzKCkgb3BlcmF0aW9uIGlmIHRoZSBjb2RlIGlzIHRydXN0ZWQuCi0gICAgICAgIGlmICghaGFzV2FybmluZ1dpbmRvdygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSB3aW5kb3cgYm91bmRzIHNob3VsZCBiZSB3aXRoaW4gdGhlIHZpc2libGUgcGFydCBvZiB0aGUgc2NyZWVuCi0gICAgICAgIGludCBuZXdYID0geDsKLSAgICAgICAgaW50IG5ld1kgPSB5OwotICAgICAgICBpbnQgbmV3VyA9IHdpZHRoOwotICAgICAgICBpbnQgbmV3SCA9IGhlaWdodDsKLQotICAgICAgICAvLyBOb3cgY2hlY2sgZWFjaCBwb2ludCBpcyB3aXRoaW4gdGhlIHZpc2libGUgcGFydCBvZiB0aGUgc2NyZWVuCi0gICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYyA9ICgoV2luZG93KXRhcmdldCkuZ2V0R3JhcGhpY3NDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFJlY3RhbmdsZSBzQiA9IGdjLmdldEJvdW5kcygpOwotICAgICAgICBJbnNldHMgc0luID0gKChXaW5kb3cpdGFyZ2V0KS5nZXRUb29sa2l0KCkuZ2V0U2NyZWVuSW5zZXRzKGdjKTsKLQotICAgICAgICBpbnQgc2NyZWVuWCA9IHNCLnggKyBzSW4ubGVmdDsKLSAgICAgICAgaW50IHNjcmVlblkgPSBzQi55ICsgc0luLnRvcDsKLSAgICAgICAgaW50IHNjcmVlblcgPSBzQi53aWR0aCAtIHNJbi5sZWZ0IC0gc0luLnJpZ2h0OwotICAgICAgICBpbnQgc2NyZWVuSCA9IHNCLmhlaWdodCAtIHNJbi50b3AgLSBzSW4uYm90dG9tOwotCi0KLSAgICAgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHRoZSBzaXplIGlzIHdpdGhpbmcgdGhlIHZpc2libGUgcGFydCBvZiB0aGUgc2NyZWVuCi0gICAgICAgIGlmIChuZXdXID4gc2NyZWVuVykgewotICAgICAgICAgICAgbmV3VyA9IHNjcmVlblc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3SCA+IHNjcmVlbkgpIHsKLSAgICAgICAgICAgIG5ld0ggPSBzY3JlZW5IOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVHdlYWsgdGhlIGxvY2F0aW9uIGlmIG5lZWRlZAotICAgICAgICBpZiAobmV3WCA8IHNjcmVlblgpIHsKLSAgICAgICAgICAgIG5ld1ggPSBzY3JlZW5YOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1ggKyBuZXdXID4gc2NyZWVuWCArIHNjcmVlblcpIHsKLSAgICAgICAgICAgIG5ld1ggPSBzY3JlZW5YICsgc2NyZWVuVyAtIG5ld1c7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3WSA8IHNjcmVlblkpIHsKLSAgICAgICAgICAgIG5ld1kgPSBzY3JlZW5ZOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1kgKyBuZXdIID4gc2NyZWVuWSArIHNjcmVlbkgpIHsKLSAgICAgICAgICAgIG5ld1kgPSBzY3JlZW5ZICsgc2NyZWVuSCAtIG5ld0g7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShuZXdYLCBuZXdZLCBuZXdXLCBuZXdIKTsKLSAgICB9Ci0KICAgICAvL0ZpeCBmb3IgNjMxODE0NDogUElUOlNldHRpbmcgTWluIFNpemUgYmlnZ2VyIHRoYW4gY3VycmVudCBzaXplIGVubGFyZ2VzCiAgICAgLy90aGUgd2luZG93IGJ1dCBmYWlscyB0byByZXZhbGlkYXRlLCBTb2wtQ0RFCiAgICAgLy9UaGlzIGJ1ZyBpcyByZWdyZXNzaW9uIGZvcgpAQCAtNDg4LDEzICs0NDIsMTEgQEAKICAgICAvL05vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG92ZXJyaWRlbiBpbiBYRGVjb3JhdGVkUGVlciBzbyBldmVudAogICAgIC8vcG9zdGluZyBpcyBub3QgY2hhbmdpbmcgZm9yIGRlY29yYXRlZCBwZWVycwogICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG9wKSB7Ci0gICAgICAgIFJlY3RhbmdsZSBuZXdCb3VuZHMgPSBjb25zdHJhaW5Cb3VuZHMoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0KICAgICAgICAgWFRvb2xraXQuYXd0TG9jaygpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgUmVjdGFuZ2xlIG9sZEJvdW5kcyA9IGdldEJvdW5kcygpOwogCi0gICAgICAgICAgICBzdXBlci5zZXRCb3VuZHMobmV3Qm91bmRzLngsIG5ld0JvdW5kcy55LCBuZXdCb3VuZHMud2lkdGgsIG5ld0JvdW5kcy5oZWlnaHQsIG9wKTsKKyAgICAgICAgICAgIHN1cGVyLnNldEJvdW5kcyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvcCk7CiAKICAgICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBnZXRCb3VuZHMoKTsKIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTFHcmFwaGljc0NvbmZpZy5qYXZhIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTFHcmFwaGljc0NvbmZpZy5qYXZhCmluZGV4IGFhNGI1MjcuLjdjZmE4YjAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExR3JhcGhpY3NDb25maWcuamF2YQorKysgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMUdyYXBoaWNzQ29uZmlnLmphdmEKQEAgLTQ1MSw5ICs0NTEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoKICAgICBAT3ZlcnJpZGUKLSAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNsdWNlbmN5Q2FwYWJsZSgpIHsKICAgICAgICAgcmV0dXJuIGlzVHJhbnNsdWNlbmN5Q2FwYWJsZShnZXRBRGF0YSgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L1dpbjMyR3JhcGhpY3NDb25maWcuamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3QvV2luMzJHcmFwaGljc0NvbmZpZy5qYXZhCmluZGV4IDJlZWZiMzMuLjkyYmQzYjggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3QvV2luMzJHcmFwaGljc0NvbmZpZy5qYXZhCisrKyBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3QvV2luMzJHcmFwaGljc0NvbmZpZy5qYXZhCkBAIC0zMzIsOSArMzMyLDcgQEAKICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIGZsaXAgYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZAogICAgIH0KIAotICAgIC8qCiAgICAgQE92ZXJyaWRlCi0gICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zbHVjZW5jeUNhcGFibGUoKSB7CiAgICAgICAgIC8vWFhYOiB3b3J0aCBjaGVja2luZyBpZiA4LWJpdD8gQW55d2F5LCBpdCBkb2Vzbid0IGh1cnQuCiAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL2F3dC93aW5kb3dzL1dDb21wb25lbnRQZWVyLmphdmEgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvV0NvbXBvbmVudFBlZXIuamF2YQppbmRleCA2YWQ2MDg0Li5kNWU0NTE5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvV0NvbXBvbmVudFBlZXIuamF2YQorKysgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvV0NvbXBvbmVudFBlZXIuamF2YQpAQCAtOTcwLDExICs5NzAsMTIgQEAKICAgICAgKgogICAgICAqIENvbmRpdGlvbnMgd2hpY2ggY291bGQgcHJldmVudCBodyBhY2NlbGVyYXRpb24gaW5jbHVkZSB0aGUgdG9wbGV2ZWwKICAgICAgKiB3aW5kb3cgY29udGFpbmluZyB0aGlzIGNvbXBvbmVudCBiZWluZwotICAgICAqIHtAbGluayBjb20uc3VuLmF3dC5BV1RVdGlsaXRpZXMuVHJhbnNsdWNlbmN5I1RSQU5TTFVDRU5UIFRSQU5TTFVDRU5UfS4KKyAgICAgKiB7QGxpbmsgR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5I1BFUlBJWEVMX1RSQU5TTFVDRU5UCisgICAgICogUEVSUElYRUxfVFJBTlNMVUNFTlR9LgogICAgICAqCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb21wb25lbnQgaXMgY2FwYWJsZSBvZiBiZWluZyBodwogICAgICAqIGFjY2VsZXJhdGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqIEBzZWUgY29tLnN1bi5hd3QuQVdUVXRpbGl0aWVzLlRyYW5zbHVjZW5jeSNUUkFOU0xVQ0VOVAorICAgICAqIEBzZWUgR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5I1BFUlBJWEVMX1RSQU5TTFVDRU5UCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY2NlbENhcGFibGUoKSB7CiAgICAgICAgIGJvb2xlYW4gaXNUcmFuc2x1Y2VudCA9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvV0RpYWxvZ1BlZXIuamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XRGlhbG9nUGVlci5qYXZhCmluZGV4IDk2Y2RiMjYuLjQ0MjRmMWMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XRGlhbG9nUGVlci5qYXZhCisrKyBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XRGlhbG9nUGVlci5qYXZhCkBAIC0xMTQsMTIgKzExNCwxMCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlc2hhcGUoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgUmVjdGFuZ2xlIG5ld0JvdW5kcyA9IGNvbnN0cmFpbkJvdW5kcyh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLQogICAgICAgICBpZiAoKChEaWFsb2cpdGFyZ2V0KS5pc1VuZGVjb3JhdGVkKCkpIHsKLSAgICAgICAgICAgIHN1cGVyLnJlc2hhcGUobmV3Qm91bmRzLngsIG5ld0JvdW5kcy55LCBuZXdCb3VuZHMud2lkdGgsIG5ld0JvdW5kcy5oZWlnaHQpOworICAgICAgICAgICAgc3VwZXIucmVzaGFwZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc2hhcGVGcmFtZShuZXdCb3VuZHMueCwgbmV3Qm91bmRzLnksIG5ld0JvdW5kcy53aWR0aCwgbmV3Qm91bmRzLmhlaWdodCk7CisgICAgICAgICAgICByZXNoYXBlRnJhbWUoeCwgeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XRW1iZWRkZWRGcmFtZVBlZXIuamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XRW1iZWRkZWRGcmFtZVBlZXIuamF2YQppbmRleCAyZTFlNmU2Li4yZWQxN2Y2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvV0VtYmVkZGVkRnJhbWVQZWVyLmphdmEKKysrIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL2F3dC93aW5kb3dzL1dFbWJlZGRlZEZyYW1lUGVlci5qYXZhCkBAIC02OCwxMiArNjgsNiBAQAogICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBzeW50aGVzaXplV21BY3RpdmF0ZShib29sZWFuIGRvQWN0aXZhdGUpOwogCiAgICAgQE92ZXJyaWRlCi0gICAgUmVjdGFuZ2xlIGNvbnN0cmFpbkJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAvLyBXZSBkb24ndCBjb25zdHJhaW4gdGhlIGJvdW5kcyBvZiB0aGUgRW1iZWRkZWRGcmFtZXMKLSAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY2NlbENhcGFibGUoKSB7CiAgICAgICAgIC8vIFJFTUlORDogVGVtcCB3b3JrYXJvdW5kIGZvciBpc3N1ZXMgd2l0aCB1c2luZyBIVyBhY2NlbGVyYXRpb24KICAgICAgICAgLy8gaW4gdGhlIGJyb3dzZXIgb24gVmlzdGEgd2hlbiBEV00gaXMgZW5hYmxlZApkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL2F3dC93aW5kb3dzL1dGcmFtZVBlZXIuamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XRnJhbWVQZWVyLmphdmEKaW5kZXggNzliZjZiNy4uODZiZGUyNiAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL2F3dC93aW5kb3dzL1dGcmFtZVBlZXIuamF2YQorKysgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvV0ZyYW1lUGVlci5qYXZhCkBAIC04OSwxMiArODksMTAgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXNoYXBlKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIFJlY3RhbmdsZSBuZXdCb3VuZHMgPSBjb25zdHJhaW5Cb3VuZHMoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0KICAgICAgICAgaWYgKCgoRnJhbWUpdGFyZ2V0KS5pc1VuZGVjb3JhdGVkKCkpIHsKLSAgICAgICAgICAgIHN1cGVyLnJlc2hhcGUobmV3Qm91bmRzLngsIG5ld0JvdW5kcy55LCBuZXdCb3VuZHMud2lkdGgsIG5ld0JvdW5kcy5oZWlnaHQpOworICAgICAgICAgICAgc3VwZXIucmVzaGFwZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc2hhcGVGcmFtZShuZXdCb3VuZHMueCwgbmV3Qm91bmRzLnksIG5ld0JvdW5kcy53aWR0aCwgbmV3Qm91bmRzLmhlaWdodCk7CisgICAgICAgICAgICByZXNoYXBlRnJhbWUoeCwgeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XUGFuZWxQZWVyLmphdmEgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvV1BhbmVsUGVlci5qYXZhCmluZGV4IDEwY2E0MjMuLjNiNGFmNmQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XUGFuZWxQZWVyLmphdmEKKysrIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL2F3dC93aW5kb3dzL1dQYW5lbFBlZXIuamF2YQpAQCAtOTksNDUgKzk5LDQgQEAKICAgICBwdWJsaWMgSW5zZXRzIGluc2V0cygpIHsKICAgICAgICAgcmV0dXJuIGdldEluc2V0cygpOwogICAgIH0KLQotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgcFJlc3RhY2soT2JqZWN0W10gcGVlcnMpOwotICAgIHByaXZhdGUgdm9pZCByZXN0YWNrKENvbnRhaW5lciBjb250LCBWZWN0b3IgcGVlcnMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250LmdldENvbXBvbmVudENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgQ29tcG9uZW50IGNvbXAgPSBjb250LmdldENvbXBvbmVudChpKTsKLSAgICAgICAgICAgIGlmICghY29tcC5pc0xpZ2h0d2VpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnRQZWVyIHBlZXIgPSBjb21wLmdldFBlZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocGVlciAhPSBudWxsICYmIChwZWVyIGluc3RhbmNlb2YgV0NvbXBvbmVudFBlZXIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVlcnMuYWRkKHBlZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVlciBvZiBhIHswfSBpcyBudWxsIG9yIG5vdCBhIFdDb21wb25lbnRQZWVyOiB7MX0uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2NvbXAsIHBlZXJ9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb21wLmlzTGlnaHR3ZWlnaHQoKSAmJiBjb21wIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICAgICAgcmVzdGFjaygoQ29udGFpbmVyKWNvbXAsIHBlZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5hd3QucGVlci5Db250YWluZXJQZWVyI3Jlc3RhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN0YWNrKCkgewotICAgICAgICBWZWN0b3IgcGVlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHBlZXJzLmFkZCh0aGlzKTsKLSAgICAgICAgQ29udGFpbmVyIGNvbnQgPSAoQ29udGFpbmVyKXRhcmdldDsKLSAgICAgICAgcmVzdGFjayhjb250LCBwZWVycyk7Ci0gICAgICAgIHBSZXN0YWNrKHBlZXJzLnRvQXJyYXkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmF3dC5wZWVyLkNvbnRhaW5lclBlZXIjaXNSZXN0YWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXN0YWNrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvV1dpbmRvd1BlZXIuamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XV2luZG93UGVlci5qYXZhCmluZGV4IDNjNjI0MDIuLjhkZTQzOTAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XV2luZG93UGVlci5qYXZhCisrKyBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9XV2luZG93UGVlci5qYXZhCkBAIC0zMzUsMTYgKzMzNSwxNCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTaGFwZSgpIHsKLSAgICAgICAgLy8gU2hhcGUgc2hhcGUgPSAoKFdpbmRvdyl0YXJnZXQpLmdldFNoYXBlKCk7Ci0gICAgICAgIFNoYXBlIHNoYXBlID0gQVdUQWNjZXNzb3IuZ2V0V2luZG93QWNjZXNzb3IoKS5nZXRTaGFwZSgoV2luZG93KXRhcmdldCk7CisgICAgICAgIFNoYXBlIHNoYXBlID0gKChXaW5kb3cpdGFyZ2V0KS5nZXRTaGFwZSgpOwogICAgICAgICBpZiAoc2hhcGUgIT0gbnVsbCkgewogICAgICAgICAgICAgYXBwbHlTaGFwZShSZWdpb24uZ2V0SW5zdGFuY2Uoc2hhcGUsIG51bGwpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVPcGFjaXR5KCkgewotICAgICAgICAvLyBmbG9hdCBvcGFjaXR5ID0gKChXaW5kb3cpdGFyZ2V0KS5nZXRPcGFjaXR5KCk7Ci0gICAgICAgIGZsb2F0IG9wYWNpdHkgPSBBV1RBY2Nlc3Nvci5nZXRXaW5kb3dBY2Nlc3NvcigpLmdldE9wYWNpdHkoKFdpbmRvdyl0YXJnZXQpOworICAgICAgICBmbG9hdCBvcGFjaXR5ID0gKChXaW5kb3cpdGFyZ2V0KS5nZXRPcGFjaXR5KCk7CiAgICAgICAgIGlmIChvcGFjaXR5IDwgMS4wZikgewogICAgICAgICAgICAgc2V0T3BhY2l0eShvcGFjaXR5KTsKICAgICAgICAgfQpAQCAtNTQ2LDgxICs1NDQsMTYgQEAKICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgc3lzVyA9IDA7CiAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHN5c0ggPSAwOwogCi0gICAgIFJlY3RhbmdsZSBjb25zdHJhaW5Cb3VuZHMoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYyA9IHRoaXMud2luR3JhcGhpY3NDb25maWc7Ci0KLSAgICAgICAgIC8vIFdlIGRvbid0IHJlc3RyaWN0IHRoZSBzZXRCb3VuZHMoKSBvcGVyYXRpb24gaWYgdGhlIGNvZGUgaXMgdHJ1c3RlZC4KLSAgICAgICAgIGlmICghaGFzV2FybmluZ1dpbmRvdygpIHx8IGdjID09IG51bGwpIHsKLSAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgaW50IG5ld1ggPSB4OwotICAgICAgICAgaW50IG5ld1kgPSB5OwotICAgICAgICAgaW50IG5ld1cgPSB3aWR0aDsKLSAgICAgICAgIGludCBuZXdIID0gaGVpZ2h0OwotCi0gICAgICAgICBSZWN0YW5nbGUgc0IgPSBnYy5nZXRCb3VuZHMoKTsKLSAgICAgICAgIEluc2V0cyBzSW4gPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuSW5zZXRzKGdjKTsKLQotICAgICAgICAgaW50IHNjcmVlblcgPSBzQi53aWR0aCAtIHNJbi5sZWZ0IC0gc0luLnJpZ2h0OwotICAgICAgICAgaW50IHNjcmVlbkggPSBzQi5oZWlnaHQgLSBzSW4udG9wIC0gc0luLmJvdHRvbTsKLQotICAgICAgICAgLy8gSWYgaXQncyB1bmRlY29yYXRlZCBvciBpcyBub3QgY3VycmVudGx5IHZpc2libGUKLSAgICAgICAgIGlmICghQVdUQWNjZXNzb3IuZ2V0Q29tcG9uZW50QWNjZXNzb3IoKS5pc1Zpc2libGVfTm9DbGllbnRDb2RlKAotICAgICAgICAgICAgICAgICAgICAgKENvbXBvbmVudCl0YXJnZXQpIHx8IGlzVGFyZ2V0VW5kZWNvcmF0ZWQoKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAvLyBOb3cgY2hlY2sgZWFjaCBwb2ludCBpcyB3aXRoaW4gdGhlIHZpc2libGUgcGFydCBvZiB0aGUgc2NyZWVuCi0gICAgICAgICAgICAgaW50IHNjcmVlblggPSBzQi54ICsgc0luLmxlZnQ7Ci0gICAgICAgICAgICAgaW50IHNjcmVlblkgPSBzQi55ICsgc0luLnRvcDsKLQotICAgICAgICAgICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB0aGUgc2l6ZSBpcyB3aXRoaW4gdGhlIHZpc2libGUgcGFydCBvZiB0aGUgc2NyZWVuCi0gICAgICAgICAgICAgaWYgKG5ld1cgPiBzY3JlZW5XKSB7Ci0gICAgICAgICAgICAgICAgIG5ld1cgPSBzY3JlZW5XOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAobmV3SCA+IHNjcmVlbkgpIHsKLSAgICAgICAgICAgICAgICAgbmV3SCA9IHNjcmVlbkg7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgLy8gVHdlYWsgdGhlIGxvY2F0aW9uIGlmIG5lZWRlZAotICAgICAgICAgICAgIGlmIChuZXdYIDwgc2NyZWVuWCkgewotICAgICAgICAgICAgICAgICBuZXdYID0gc2NyZWVuWDsKLSAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1ggKyBuZXdXID4gc2NyZWVuWCArIHNjcmVlblcpIHsKLSAgICAgICAgICAgICAgICAgbmV3WCA9IHNjcmVlblggKyBzY3JlZW5XIC0gbmV3VzsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKG5ld1kgPCBzY3JlZW5ZKSB7Ci0gICAgICAgICAgICAgICAgIG5ld1kgPSBzY3JlZW5ZOwotICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3WSArIG5ld0ggPiBzY3JlZW5ZICsgc2NyZWVuSCkgewotICAgICAgICAgICAgICAgICBuZXdZID0gc2NyZWVuWSArIHNjcmVlbkggLSBuZXdIOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgaW50IG1heFcgPSBNYXRoLm1heChzY3JlZW5XLCBzeXNXKTsKLSAgICAgICAgICAgICBpbnQgbWF4SCA9IE1hdGgubWF4KHNjcmVlbkgsIHN5c0gpOwotCi0gICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzaXplIGlzIHdpdGhpbmcgdGhlIHZpc2libGUgcGFydCBvZiB0aGUgc2NyZWVuCi0gICAgICAgICAgICAgLy8gT1IgbGVzcyB0aGF0IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHdpbmRvdy4KLSAgICAgICAgICAgICBpZiAobmV3VyA+IG1heFcpIHsKLSAgICAgICAgICAgICAgICAgbmV3VyA9IG1heFc7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChuZXdIID4gbWF4SCkgewotICAgICAgICAgICAgICAgICBuZXdIID0gbWF4SDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKG5ld1gsIG5ld1ksIG5ld1csIG5ld0gpOwotICAgICB9Ci0KICAgICAgcHVibGljIG5hdGl2ZSB2b2lkIHJlcG9zaXRpb25TZWN1cml0eVdhcm5pbmcoKTsKIAogICAgICBAT3ZlcnJpZGUKICAgICAgcHVibGljIHZvaWQgc2V0Qm91bmRzKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgb3ApIHsKLSAgICAgICAgIFJlY3RhbmdsZSBuZXdCb3VuZHMgPSBjb25zdHJhaW5Cb3VuZHMoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICBzeXNYID0geDsKKyAgICAgICAgIHN5c1kgPSB5OworICAgICAgICAgc3lzVyA9IHdpZHRoOworICAgICAgICAgc3lzSCA9IGhlaWdodDsKIAotICAgICAgICAgc3lzWCA9IG5ld0JvdW5kcy54OwotICAgICAgICAgc3lzWSA9IG5ld0JvdW5kcy55OwotICAgICAgICAgc3lzVyA9IG5ld0JvdW5kcy53aWR0aDsKLSAgICAgICAgIHN5c0ggPSBuZXdCb3VuZHMuaGVpZ2h0OwotCi0gICAgICAgICBzdXBlci5zZXRCb3VuZHMobmV3Qm91bmRzLngsIG5ld0JvdW5kcy55LCBuZXdCb3VuZHMud2lkdGgsIG5ld0JvdW5kcy5oZWlnaHQsIG9wKTsKKyAgICAgICAgIHN1cGVyLnNldEJvdW5kcyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvcCk7CiAgICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNjc1LDExICs2MDgsMTMgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRPcGFxdWUoYm9vbGVhbiBpc09wYXF1ZSkgewogICAgICAgICBXaW5kb3cgdGFyZ2V0ID0gKFdpbmRvdylnZXRUYXJnZXQoKTsKIAotICAgICAgICBTdW5Ub29sa2l0IHN1blRvb2xraXQgPSAoU3VuVG9vbGtpdCl0YXJnZXQuZ2V0VG9vbGtpdCgpOwotICAgICAgICBpZiAoIXN1blRvb2xraXQuaXNXaW5kb3dUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoKSB8fAotICAgICAgICAgICAgIXN1blRvb2xraXQuaXNUcmFuc2x1Y2VuY3lDYXBhYmxlKHRhcmdldC5nZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKCFpc09wYXF1ZSkgeworICAgICAgICAgICAgU3VuVG9vbGtpdCBzdW5Ub29sa2l0ID0gKFN1blRvb2xraXQpdGFyZ2V0LmdldFRvb2xraXQoKTsKKyAgICAgICAgICAgIGlmICghc3VuVG9vbGtpdC5pc1dpbmRvd1RyYW5zbHVjZW5jeVN1cHBvcnRlZCgpIHx8CisgICAgICAgICAgICAgICAgIXN1blRvb2xraXQuaXNUcmFuc2x1Y2VuY3lDYXBhYmxlKHRhcmdldC5nZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBvcGFxdWVDaGFuZ2VkID0gdGhpcy5pc09wYXF1ZSAhPSBpc09wYXF1ZTsKQEAgLTcxMyw5ICs2NDgsOSBAQAogICAgICAgICAgICAgLy8gaXRzIHNoYXBlIG9ubHkuIFRvIHJlc3RvcmUgdGhlIGNvcnJlY3QgdmlzdWFsIGFwcGVhcmFuY2UKICAgICAgICAgICAgIC8vIG9mIHRoZSB3aW5kb3cgKGkuZS4gdy8gdGhlIGNvcnJlY3Qgc2hhcGUpIHdlIGhhdmUgdG8gcmVzZXQKICAgICAgICAgICAgIC8vIHRoZSBzaGFwZS4KLSAgICAgICAgICAgIFNoYXBlIHNoYXBlID0gQVdUQWNjZXNzb3IuZ2V0V2luZG93QWNjZXNzb3IoKS5nZXRTaGFwZSh0YXJnZXQpOworICAgICAgICAgICAgU2hhcGUgc2hhcGUgPSAoKFdpbmRvdyl0YXJnZXQpLmdldFNoYXBlKCk7CiAgICAgICAgICAgICBpZiAoc2hhcGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFXVEFjY2Vzc29yLmdldFdpbmRvd0FjY2Vzc29yKCkuc2V0U2hhcGUodGFyZ2V0LCBzaGFwZSk7CisgICAgICAgICAgICAgICAgKChXaW5kb3cpdGFyZ2V0KS5zZXRTaGFwZShzaGFwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNzI5LDYgKzY2NCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgQ29tcG9uZW50IHRhcmdldCA9IChDb21wb25lbnQpdGhpcy50YXJnZXQ7CisgICAgICAgIGlmICh0YXJnZXQuZ2V0V2lkdGgoKSA8PSAwIHx8IHRhcmdldC5nZXRIZWlnaHQoKSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBUcmFuc2x1Y2VudFdpbmRvd1BhaW50ZXIgY3VycmVudFBhaW50ZXIgPSBwYWludGVyOwogICAgICAgICBpZiAoY3VycmVudFBhaW50ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgY3VycmVudFBhaW50ZXIudXBkYXRlV2luZG93KGJhY2tCdWZmZXIpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL25pby9jaC9XaW5kb3dzQXN5bmNocm9ub3VzRmlsZUNoYW5uZWxJbXBsLmphdmEgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vbmlvL2NoL1dpbmRvd3NBc3luY2hyb25vdXNGaWxlQ2hhbm5lbEltcGwuamF2YQppbmRleCBlZjY2ODY0Li5lMDhmNDYwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vbmlvL2NoL1dpbmRvd3NBc3luY2hyb25vdXNGaWxlQ2hhbm5lbEltcGwuamF2YQorKysgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vbmlvL2NoL1dpbmRvd3NBc3luY2hyb25vdXNGaWxlQ2hhbm5lbEltcGwuamF2YQpAQCAtMzU0LDE2ICszNTQsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gaW52b2tlIGJ5IEZpbGVGaWxlSW1wbCB0byByZWxlYXNlIGxvY2sKICAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIHJlbGVhc2UoRmlsZUxvY2tJbXBsIGZsaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJlZ2luKCk7Ci0gICAgICAgICAgICBuZC5yZWxlYXNlKGZkT2JqLCBmbGkucG9zaXRpb24oKSwgZmxpLnNpemUoKSk7Ci0gICAgICAgICAgICByZW1vdmVGcm9tRmlsZUxvY2tUYWJsZShmbGkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZW5kKCk7Ci0gICAgICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbXBsUmVsZWFzZShGaWxlTG9ja0ltcGwgZmxpKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBuZC5yZWxlYXNlKGZkT2JqLCBmbGkucG9zaXRpb24oKSwgZmxpLnNpemUoKSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvbXNjYXBpL1JTQUtleVBhaXJHZW5lcmF0b3IuamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvUlNBS2V5UGFpckdlbmVyYXRvci5qYXZhCmluZGV4IDE0NmQ3YzEuLjQ0ZGQyNWEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvUlNBS2V5UGFpckdlbmVyYXRvci5qYXZhCisrKyBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvUlNBS2V5UGFpckdlbmVyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBS2V5R2VuUGFyYW1ldGVyU3BlYzsKIAogaW1wb3J0IHN1bi5zZWN1cml0eS5qY2EuSkNBVXRpbDsKK2ltcG9ydCBzdW4uc2VjdXJpdHkucnNhLlJTQUtleUZhY3Rvcnk7CiAKIC8qKgogICogUlNBIGtleXBhaXIgZ2VuZXJhdG9yLgpAQCAtNDMsOCArNDQsOCBAQAogcHVibGljIGZpbmFsIGNsYXNzIFJTQUtleVBhaXJHZW5lcmF0b3IgZXh0ZW5kcyBLZXlQYWlyR2VuZXJhdG9yU3BpIHsKIAogICAgIC8vIFN1cHBvcnRlZCBieSBNaWNyb3NvZnQgQmFzZSwgU3Ryb25nIGFuZCBFbmhhbmNlZCBDcnlwdG9ncmFwaGljIFByb3ZpZGVycwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlfU0laRV9NSU4gPSA1MTI7IC8vIGRpc2FsbG93IE1TQ0FQSSBtaW4uIG9mIDM4NAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlfU0laRV9NQVggPSAxNjM4NDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEtFWV9TSVpFX01JTiA9IDUxMjsgLy8gZGlzYWxsb3cgTVNDQVBJIG1pbi4gb2YgMzg0CisgICAgc3RhdGljIGZpbmFsIGludCBLRVlfU0laRV9NQVggPSAxNjM4NDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZX1NJWkVfREVGQVVMVCA9IDEwMjQ7CiAKICAgICAvLyBzaXplIG9mIHRoZSBrZXkgdG8gZ2VuZXJhdGUsIEtFWV9TSVpFX01JTiA8PSBrZXlTaXplIDw9IEtFWV9TSVpFX01BWApAQCAtNTksNyArNjAsMTQgQEAKICAgICAvLyByYW5kb20gaXMgYWx3YXlzIGlnbm9yZWQKICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGludCBrZXlTaXplLCBTZWN1cmVSYW5kb20gcmFuZG9tKSB7CiAKLSAgICAgICAgY2hlY2tLZXlTaXplKGtleVNpemUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUlNBS2V5RmFjdG9yeS5jaGVja0tleUxlbmd0aHMoa2V5U2l6ZSwgbnVsbCwKKyAgICAgICAgICAgICAgICBLRVlfU0laRV9NSU4sIEtFWV9TSVpFX01BWCk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5rZXlTaXplID0ga2V5U2l6ZTsKICAgICB9CiAKICAgICAvLyBzZWNvbmQgaW5pdGlhbGl6ZSBtZXRob2QuIFNlZSBKQ0EgZG9jCkBAIC02NywyMSArNzUsMzEgQEAKICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEFsZ29yaXRobVBhcmFtZXRlclNwZWMgcGFyYW1zLCBTZWN1cmVSYW5kb20gcmFuZG9tKQogICAgICAgICAgICAgdGhyb3dzIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gewogCisgICAgICAgIGludCB0bXBTaXplOwogICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoZWNrS2V5U2l6ZShLRVlfU0laRV9ERUZBVUxUKTsKLQorICAgICAgICAgICAgdG1wU2l6ZSA9IEtFWV9TSVpFX0RFRkFVTFQ7CiAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zIGluc3RhbmNlb2YgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYykgewogCiAgICAgICAgICAgICBpZiAoKChSU0FLZXlHZW5QYXJhbWV0ZXJTcGVjKSBwYXJhbXMpLmdldFB1YmxpY0V4cG9uZW50KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICgiRXhwb25lbnQgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrS2V5U2l6ZSgoKFJTQUtleUdlblBhcmFtZXRlclNwZWMpIHBhcmFtcykuZ2V0S2V5c2l6ZSgpKTsKKyAgICAgICAgICAgIHRtcFNpemUgPSAoKFJTQUtleUdlblBhcmFtZXRlclNwZWMpIHBhcmFtcykuZ2V0S2V5c2l6ZSgpOwogCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICgiUGFyYW1zIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgUlNBS2V5R2VuUGFyYW1ldGVyU3BlYyIpOwogICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGhzKHRtcFNpemUsIG51bGwsCisgICAgICAgICAgICAgICAgS0VZX1NJWkVfTUlOLCBLRVlfU0laRV9NQVgpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIEtleSBzaXplcyIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5rZXlTaXplID0gdG1wU2l6ZTsKICAgICB9CiAKICAgICAvLyBnZW5lcmF0ZSB0aGUga2V5cGFpci4gU2VlIEpDQSBkb2MKQEAgLTk1LDE4ICsxMTMsNiBAQAogICAgICAgICByZXR1cm4gbmV3IEtleVBhaXIoa2V5cy5nZXRQdWJsaWMoKSwga2V5cy5nZXRQcml2YXRlKCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjaGVja0tleVNpemUoaW50IGtleVNpemUpIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGtleVNpemUgPCBLRVlfU0laRV9NSU4pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgKCJLZXkgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0ICIgKyBLRVlfU0laRV9NSU4gKyAiIGJpdHMiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoa2V5U2l6ZSA+IEtFWV9TSVpFX01BWCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAoIktleSBzaXplIG11c3QgYmUgIiArIEtFWV9TSVpFX01BWCArICIgYml0cyBvciBsZXNzIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5rZXlTaXplID0ga2V5U2l6ZTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgUlNBS2V5UGFpciBnZW5lcmF0ZVJTQUtleVBhaXIoaW50IGtleVNpemUsCiAgICAgICAgIFN0cmluZyBrZXlDb250YWluZXJOYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvUlNBU2lnbmF0dXJlLmphdmEgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvbXNjYXBpL1JTQVNpZ25hdHVyZS5qYXZhCmluZGV4IDYwNjQyM2QuLjk4MmUxODMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvUlNBU2lnbmF0dXJlLmphdmEKKysrIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9SU0FTaWduYXR1cmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zOCw2ICszOCw5IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmVTcGk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBzdW4uc2VjdXJpdHkucnNhLlJTQUtleUZhY3Rvcnk7CiAKIC8qKgogICogUlNBIHNpZ25hdHVyZSBpbXBsZW1lbnRhdGlvbi4gU3VwcG9ydHMgUlNBIHNpZ25pbmcgdXNpbmcgUEtDUyMxIHYxLjUgcGFkZGluZy4KQEAgLTEyNCw3ICsxMjcsMTYgQEAKIAogICAgICAgICAgICAgLy8gY29udmVydCBrZXkgdG8gTVNDQVBJIGZvcm1hdAogCi0gICAgICAgICAgICBieXRlW10gbW9kdWx1c0J5dGVzID0gcnNhS2V5LmdldE1vZHVsdXMoKS50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgQmlnSW50ZWdlciBtb2R1bHVzID0gcnNhS2V5LmdldE1vZHVsdXMoKTsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgZXhwb25lbnQgPSAgcnNhS2V5LmdldFB1YmxpY0V4cG9uZW50KCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIGxvY2FsIGFuZCBnbG9iYWwgdmFsdWVzIHRvIG1ha2Ugc3VyZQorICAgICAgICAgICAgLy8gdGhlIHNpemVzIGFyZSBvay4gIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IGJ5dGUuCisgICAgICAgICAgICBSU0FLZXlGYWN0b3J5LmNoZWNrS2V5TGVuZ3RocygoKG1vZHVsdXMuYml0TGVuZ3RoKCkgKyA3KSAmIH43KSwKKyAgICAgICAgICAgICAgICBleHBvbmVudCwgLTEsIFJTQUtleVBhaXJHZW5lcmF0b3IuS0VZX1NJWkVfTUFYKTsKKworICAgICAgICAgICAgYnl0ZVtdIG1vZHVsdXNCeXRlcyA9IG1vZHVsdXMudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBleHBvbmVudEJ5dGVzID0gZXhwb25lbnQudG9CeXRlQXJyYXkoKTsKIAogICAgICAgICAgICAgLy8gQWRqdXN0IGtleSBsZW5ndGggZHVlIHRvIHNpZ24gYml0CiAgICAgICAgICAgICBpbnQga2V5Qml0TGVuZ3RoID0gKG1vZHVsdXNCeXRlc1swXSA9PSAwKQpAQCAtMTMyLDggKzE0NCw3IEBACiAgICAgICAgICAgICAgICAgOiBtb2R1bHVzQnl0ZXMubGVuZ3RoICogODsKIAogICAgICAgICAgICAgYnl0ZVtdIGtleUJsb2IgPSBnZW5lcmF0ZVB1YmxpY0tleUJsb2IoCi0gICAgICAgICAgICAgICAga2V5Qml0TGVuZ3RoLCBtb2R1bHVzQnl0ZXMsCi0gICAgICAgICAgICAgICAgcnNhS2V5LmdldFB1YmxpY0V4cG9uZW50KCkudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAga2V5Qml0TGVuZ3RoLCBtb2R1bHVzQnl0ZXMsIGV4cG9uZW50Qnl0ZXMpOwogCiAgICAgICAgICAgICBwdWJsaWNLZXkgPSBpbXBvcnRQdWJsaWNLZXkoa2V5QmxvYiwga2V5Qml0TGVuZ3RoKTsKIApAQCAtMTY2LDEyICsxNzcsMTEgQEAKICAgICAgICAgfQogICAgICAgICBwcml2YXRlS2V5ID0gKHN1bi5zZWN1cml0eS5tc2NhcGkuUlNBUHJpdmF0ZUtleSkga2V5OwogCi0gICAgICAgIC8vIERldGVybWluZSBieXRlIGxlbmd0aCBmcm9tIGJpdCBsZW5ndGgKLSAgICAgICAgaW50IGtleVNpemUgPSAocHJpdmF0ZUtleS5iaXRMZW5ndGgoKSArIDcpID4+IDM7Ci0KLSAgICAgICAgaWYgKGtleVNpemUgPCA2NCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJSU0Ega2V5cyBtdXN0IGJlIGF0IGxlYXN0IDUxMiBiaXRzIGxvbmciKTsKKyAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgbG9jYWwgYW5kIGdsb2JhbCB2YWx1ZXMgdG8gbWFrZSBzdXJlCisgICAgICAgIC8vIHRoZSBzaXplcyBhcmUgb2suICBSb3VuZCB1cCB0byBuZWFyZXN0IGJ5dGUuCisgICAgICAgIFJTQUtleUZhY3RvcnkuY2hlY2tLZXlMZW5ndGhzKCgocHJpdmF0ZUtleS5iaXRMZW5ndGgoKSArIDcpICYgfjcpLAorICAgICAgICAgICAgbnVsbCwgUlNBS2V5UGFpckdlbmVyYXRvci5LRVlfU0laRV9NSU4sCisgICAgICAgICAgICBSU0FLZXlQYWlyR2VuZXJhdG9yLktFWV9TSVpFX01BWCk7CiAKICAgICAgICAgaWYgKG5lZWRzUmVzZXQpIHsKICAgICAgICAgICAgIG1lc3NhZ2VEaWdlc3QucmVzZXQoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL25pby9jaC9GaWxlRGlzcGF0Y2hlckltcGwuYyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL25pby9jaC9GaWxlRGlzcGF0Y2hlckltcGwuYwppbmRleCBhNjVhZDkwLi43YjQxZDg2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi9uaW8vY2gvRmlsZURpc3BhdGNoZXJJbXBsLmMKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vbmlvL2NoL0ZpbGVEaXNwYXRjaGVySW1wbC5jCkBAIC00MTQsNyArNDE0LDcgQEAKICAgICBvLk9mZnNldCA9IGxvd1BvczsKICAgICBvLk9mZnNldEhpZ2ggPSBoaWdoUG9zOwogICAgIHJlc3VsdCA9IFVubG9ja0ZpbGVFeChoLCAwLCBsb3dOdW1CeXRlcywgaGlnaE51bUJ5dGVzLCAmbyk7Ci0gICAgaWYgKHJlc3VsdCA9PSAwKSB7CisgICAgaWYgKHJlc3VsdCA9PSAwICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX05PVF9MT0NLRUQpIHsKICAgICAgICAgSk5VX1Rocm93SU9FeGNlcHRpb25XaXRoTGFzdEVycm9yKGVudiwgIlJlbGVhc2UgZmFpbGVkIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vc2VjdXJpdHkva3JiNS9OYXRpdmVDcmVkcy5jIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vc2VjdXJpdHkva3JiNS9OYXRpdmVDcmVkcy5jCmluZGV4IGUxMTJiODYuLmM5MTBjNjIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3NlY3VyaXR5L2tyYjUvTmF0aXZlQ3JlZHMuYworKysgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi9zZWN1cml0eS9rcmI1L05hdGl2ZUNyZWRzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDAtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDAtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC03Myw2ICs3Myw3IEBACiAgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciBpbnRlcm5hbCByb3V0aW5lcwogICoKICAqLworQk9PTCBuYXRpdmVfZGVidWcgPSAwOwogCiBCT09MIFBhY2thZ2VDb25uZWN0TG9va3VwKFBIQU5ETEUsUFVMT05HKTsKIApAQCAtMTEzLDIwOCArMTE0LDIyMSBAQAogCiAgICAgamNsYXNzIGNsczsKICAgICBKTklFbnYgKmVudjsKKyAgICBqZmllbGRJRCBmbGRERUJVRzsKIAogICAgIGlmICgoKmp2bSktPkdldEVudihqdm0sICh2b2lkICoqKSZlbnYsIEpOSV9WRVJTSU9OXzFfMikpIHsKICAgICAgICAgcmV0dXJuIEpOSV9FVkVSU0lPTjsgLyogSk5JIHZlcnNpb24gbm90IHN1cHBvcnRlZCAqLwogICAgIH0KIAorICAgIGNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwic3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvS3JiNSIpOworICAgIGlmIChjbHMgPT0gTlVMTCkgeworICAgICAgICBwcmludGYoIkxTQTogQ291bGRuJ3QgZmluZCBLcmI1XG4iKTsKKyAgICAgICAgcmV0dXJuIEpOSV9FUlI7CisgICAgfQorICAgIGZsZERFQlVHID0gKCplbnYpLT5HZXRTdGF0aWNGaWVsZElEKGVudiwgY2xzLCAiREVCVUciLCAiWiIpOworICAgIGlmIChmbGRERUJVRyA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBLcmI1IGhhcyBubyBERUJVRyBmaWVsZFxuIik7CisgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIH0KKyAgICBuYXRpdmVfZGVidWcgPSAoKmVudiktPkdldFN0YXRpY0Jvb2xlYW5GaWVsZChlbnYsIGNscywgZmxkREVCVUcpOworCiAgICAgY2xzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCJzdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9UaWNrZXQiKTsKIAogICAgIGlmIChjbHMgPT0gTlVMTCkgewotICAgICAgICBwcmludGYoIkNvdWxkbid0IGZpbmQgVGlja2V0XG4iKTsKKyAgICAgICAgcHJpbnRmKCJMU0E6IENvdWxkbid0IGZpbmQgVGlja2V0XG4iKTsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRm91bmQgVGlja2V0XG4iKTsKLSAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBGb3VuZCBUaWNrZXRcbiIpOworICAgIH0KIAogICAgIHRpY2tldENsYXNzID0gKCplbnYpLT5OZXdXZWFrR2xvYmFsUmVmKGVudixjbHMpOwogICAgIGlmICh0aWNrZXRDbGFzcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIH0KLSAgICAjaWZkZWYgREVCVUcKLSAgICBwcmludGYoIk1hZGUgTmV3V2Vha0dsb2JhbFJlZlxuIik7Ci0gICAgI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICBwcmludGYoIkxTQTogTWFkZSBOZXdXZWFrR2xvYmFsUmVmXG4iKTsKKyAgICB9CiAKICAgICBjbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJzdW4vc2VjdXJpdHkva3JiNS9QcmluY2lwYWxOYW1lIik7CiAKICAgICBpZiAoY2xzID09IE5VTEwpIHsKLSAgICAgICAgcHJpbnRmKCJDb3VsZG4ndCBmaW5kIFByaW5jaXBhbE5hbWVcbiIpOworICAgICAgICBwcmludGYoIkxTQTogQ291bGRuJ3QgZmluZCBQcmluY2lwYWxOYW1lXG4iKTsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRm91bmQgUHJpbmNpcGFsTmFtZVxuIik7Ci0gICAgI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICBwcmludGYoIkxTQTogRm91bmQgUHJpbmNpcGFsTmFtZVxuIik7CisgICAgfQogCiAgICAgcHJpbmNpcGFsTmFtZUNsYXNzID0gKCplbnYpLT5OZXdXZWFrR2xvYmFsUmVmKGVudixjbHMpOwogICAgIGlmIChwcmluY2lwYWxOYW1lQ2xhc3MgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gSk5JX0VSUjsKICAgICB9Ci0gICAgI2lmZGVmIERFQlVHCi0gICAgcHJpbnRmKCJNYWRlIE5ld1dlYWtHbG9iYWxSZWZcbiIpOwotICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmIChuYXRpdmVfZGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJMU0E6IE1hZGUgTmV3V2Vha0dsb2JhbFJlZlxuIik7CisgICAgfQogCiAgICAgY2xzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCJzdW4vc2VjdXJpdHkvdXRpbC9EZXJWYWx1ZSIpOwogCiAgICAgaWYgKGNscyA9PSBOVUxMKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGRuJ3QgZmluZCBEZXJWYWx1ZVxuIik7CisgICAgICAgIHByaW50ZigiTFNBOiBDb3VsZG4ndCBmaW5kIERlclZhbHVlXG4iKTsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRm91bmQgRGVyVmFsdWVcbiIpOwotICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmIChuYXRpdmVfZGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJMU0E6IEZvdW5kIERlclZhbHVlXG4iKTsKKyAgICB9CiAKICAgICBkZXJWYWx1ZUNsYXNzID0gKCplbnYpLT5OZXdXZWFrR2xvYmFsUmVmKGVudixjbHMpOwogICAgIGlmIChkZXJWYWx1ZUNsYXNzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiTWFkZSBOZXdXZWFrR2xvYmFsUmVmXG4iKTsKLSAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBNYWRlIE5ld1dlYWtHbG9iYWxSZWZcbiIpOworICAgIH0KIAogICAgIGNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwic3VuL3NlY3VyaXR5L2tyYjUvRW5jcnlwdGlvbktleSIpOwogCiAgICAgaWYgKGNscyA9PSBOVUxMKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGRuJ3QgZmluZCBFbmNyeXB0aW9uS2V5XG4iKTsKKyAgICAgICAgcHJpbnRmKCJMU0E6IENvdWxkbid0IGZpbmQgRW5jcnlwdGlvbktleVxuIik7CiAgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIH0KLSAgICAjaWZkZWYgREVCVUcKLSAgICBwcmludGYoIkZvdW5kIEVuY3J5cHRpb25LZXlcbiIpOwotICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmIChuYXRpdmVfZGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJMU0E6IEZvdW5kIEVuY3J5cHRpb25LZXlcbiIpOworICAgIH0KIAogICAgIGVuY3J5cHRpb25LZXlDbGFzcyA9ICgqZW52KS0+TmV3V2Vha0dsb2JhbFJlZihlbnYsY2xzKTsKICAgICBpZiAoZW5jcnlwdGlvbktleUNsYXNzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiTWFkZSBOZXdXZWFrR2xvYmFsUmVmXG4iKTsKLSAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBNYWRlIE5ld1dlYWtHbG9iYWxSZWZcbiIpOworICAgIH0KIAogICAgIGNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwic3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvVGlja2V0RmxhZ3MiKTsKIAogICAgIGlmIChjbHMgPT0gTlVMTCkgewotICAgICAgICBwcmludGYoIkNvdWxkbid0IGZpbmQgVGlja2V0RmxhZ3NcbiIpOworICAgICAgICBwcmludGYoIkxTQTogQ291bGRuJ3QgZmluZCBUaWNrZXRGbGFnc1xuIik7CiAgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIH0KLSAgICAjaWZkZWYgREVCVUcKLSAgICBwcmludGYoIkZvdW5kIFRpY2tldEZsYWdzXG4iKTsKLSAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBGb3VuZCBUaWNrZXRGbGFnc1xuIik7CisgICAgfQogCiAgICAgdGlja2V0RmxhZ3NDbGFzcyA9ICgqZW52KS0+TmV3V2Vha0dsb2JhbFJlZihlbnYsY2xzKTsKICAgICBpZiAodGlja2V0RmxhZ3NDbGFzcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIH0KLSAgICAjaWZkZWYgREVCVUcKLSAgICBwcmludGYoIk1hZGUgTmV3V2Vha0dsb2JhbFJlZlxuIik7Ci0gICAgI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICBwcmludGYoIkxTQTogTWFkZSBOZXdXZWFrR2xvYmFsUmVmXG4iKTsKKyAgICB9CiAKICAgICBjbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsInN1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL0tlcmJlcm9zVGltZSIpOwogCiAgICAgaWYgKGNscyA9PSBOVUxMKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGRuJ3QgZmluZCBLZXJiZXJvc1RpbWVcbiIpOworICAgICAgICBwcmludGYoIkxTQTogQ291bGRuJ3QgZmluZCBLZXJiZXJvc1RpbWVcbiIpOwogICAgICAgICByZXR1cm4gSk5JX0VSUjsKICAgICB9Ci0gICAgI2lmZGVmIERFQlVHCi0gICAgcHJpbnRmKCJGb3VuZCBLZXJiZXJvc1RpbWVcbiIpOwotICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmIChuYXRpdmVfZGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJMU0E6IEZvdW5kIEtlcmJlcm9zVGltZVxuIik7CisgICAgfQogCiAgICAga2VyYmVyb3NUaW1lQ2xhc3MgPSAoKmVudiktPk5ld1dlYWtHbG9iYWxSZWYoZW52LGNscyk7CiAgICAgaWYgKGtlcmJlcm9zVGltZUNsYXNzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiTWFkZSBOZXdXZWFrR2xvYmFsUmVmXG4iKTsKLSAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBNYWRlIE5ld1dlYWtHbG9iYWxSZWZcbiIpOworICAgIH0KIAogICAgIGNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwiamF2YS9sYW5nL1N0cmluZyIpOwogCiAgICAgaWYgKGNscyA9PSBOVUxMKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGRuJ3QgZmluZCBTdHJpbmdcbiIpOworICAgICAgICBwcmludGYoIkxTQTogQ291bGRuJ3QgZmluZCBTdHJpbmdcbiIpOwogICAgICAgICByZXR1cm4gSk5JX0VSUjsKICAgICB9Ci0gICAgI2lmZGVmIERFQlVHCi0gICAgcHJpbnRmKCJGb3VuZCBTdHJpbmdcbiIpOwotICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmIChuYXRpdmVfZGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJMU0E6IEZvdW5kIFN0cmluZ1xuIik7CisgICAgfQogCiAgICAgamF2YUxhbmdTdHJpbmdDbGFzcyA9ICgqZW52KS0+TmV3V2Vha0dsb2JhbFJlZihlbnYsY2xzKTsKICAgICBpZiAoamF2YUxhbmdTdHJpbmdDbGFzcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIH0KLSAgICAjaWZkZWYgREVCVUcKLSAgICBwcmludGYoIk1hZGUgTmV3V2Vha0dsb2JhbFJlZlxuIik7Ci0gICAgI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICBwcmludGYoIkxTQTogTWFkZSBOZXdXZWFrR2xvYmFsUmVmXG4iKTsKKyAgICB9CiAKICAgICBkZXJWYWx1ZUNvbnN0cnVjdG9yID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGRlclZhbHVlQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8aW5pdD4iLCAiKFtCKVYiKTsKICAgICBpZiAoZGVyVmFsdWVDb25zdHJ1Y3RvciA9PSAwKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGRuJ3QgZmluZCBEZXJWYWx1ZSBjb25zdHJ1Y3RvclxuIik7CisgICAgICAgIHByaW50ZigiTFNBOiBDb3VsZG4ndCBmaW5kIERlclZhbHVlIGNvbnN0cnVjdG9yXG4iKTsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRm91bmQgRGVyVmFsdWUgY29uc3RydWN0b3JcbiIpOwotICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmIChuYXRpdmVfZGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJMU0E6IEZvdW5kIERlclZhbHVlIGNvbnN0cnVjdG9yXG4iKTsKKyAgICB9CiAKICAgICB0aWNrZXRDb25zdHJ1Y3RvciA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCB0aWNrZXRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGluaXQ+IiwgIihMc3VuL3NlY3VyaXR5L3V0aWwvRGVyVmFsdWU7KVYiKTsKICAgICBpZiAodGlja2V0Q29uc3RydWN0b3IgPT0gMCkgewotICAgICAgICBwcmludGYoIkNvdWxkbid0IGZpbmQgVGlja2V0IGNvbnN0cnVjdG9yXG4iKTsKKyAgICAgICAgcHJpbnRmKCJMU0E6IENvdWxkbid0IGZpbmQgVGlja2V0IGNvbnN0cnVjdG9yXG4iKTsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRm91bmQgVGlja2V0IGNvbnN0cnVjdG9yXG4iKTsKLSAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBGb3VuZCBUaWNrZXQgY29uc3RydWN0b3JcbiIpOworICAgIH0KIAogICAgIHByaW5jaXBhbE5hbWVDb25zdHJ1Y3RvciA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBwcmluY2lwYWxOYW1lQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGluaXQ+IiwgIihbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKICAgICBpZiAocHJpbmNpcGFsTmFtZUNvbnN0cnVjdG9yID09IDApIHsKLSAgICAgICAgcHJpbnRmKCJDb3VsZG4ndCBmaW5kIFByaW5jaXBhbE5hbWUgY29uc3RydWN0b3JcbiIpOworICAgICAgICBwcmludGYoIkxTQTogQ291bGRuJ3QgZmluZCBQcmluY2lwYWxOYW1lIGNvbnN0cnVjdG9yXG4iKTsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRm91bmQgUHJpbmNpcGFsTmFtZSBjb25zdHJ1Y3RvclxuIik7Ci0gICAgI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICBwcmludGYoIkxTQTogRm91bmQgUHJpbmNpcGFsTmFtZSBjb25zdHJ1Y3RvclxuIik7CisgICAgfQogCiAgICAgZW5jcnlwdGlvbktleUNvbnN0cnVjdG9yID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGVuY3J5cHRpb25LZXlDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxpbml0PiIsICIoSVtCKVYiKTsKICAgICBpZiAoZW5jcnlwdGlvbktleUNvbnN0cnVjdG9yID09IDApIHsKLSAgICAgICAgcHJpbnRmKCJDb3VsZG4ndCBmaW5kIEVuY3J5cHRpb25LZXkgY29uc3RydWN0b3JcbiIpOworICAgICAgICBwcmludGYoIkxTQTogQ291bGRuJ3QgZmluZCBFbmNyeXB0aW9uS2V5IGNvbnN0cnVjdG9yXG4iKTsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRm91bmQgRW5jcnlwdGlvbktleSBjb25zdHJ1Y3RvclxuIik7Ci0gICAgI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICBwcmludGYoIkxTQTogRm91bmQgRW5jcnlwdGlvbktleSBjb25zdHJ1Y3RvclxuIik7CisgICAgfQogCiAgICAgdGlja2V0RmxhZ3NDb25zdHJ1Y3RvciA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCB0aWNrZXRGbGFnc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGluaXQ+IiwgIihJW0IpViIpOwogICAgIGlmICh0aWNrZXRGbGFnc0NvbnN0cnVjdG9yID09IDApIHsKLSAgICAgICAgcHJpbnRmKCJDb3VsZG4ndCBmaW5kIFRpY2tldEZsYWdzIGNvbnN0cnVjdG9yXG4iKTsKKyAgICAgICAgcHJpbnRmKCJMU0E6IENvdWxkbid0IGZpbmQgVGlja2V0RmxhZ3MgY29uc3RydWN0b3JcbiIpOwogICAgICAgICByZXR1cm4gSk5JX0VSUjsKICAgICB9Ci0gICAgI2lmZGVmIERFQlVHCi0gICAgcHJpbnRmKCJGb3VuZCBUaWNrZXRGbGFncyBjb25zdHJ1Y3RvclxuIik7Ci0gICAgI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICBwcmludGYoIkxTQTogRm91bmQgVGlja2V0RmxhZ3MgY29uc3RydWN0b3JcbiIpOworICAgIH0KIAogICAgIGtlcmJlcm9zVGltZUNvbnN0cnVjdG9yID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGtlcmJlcm9zVGltZUNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxpbml0PiIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKICAgICBpZiAoa2VyYmVyb3NUaW1lQ29uc3RydWN0b3IgPT0gMCkgewotICAgICAgICBwcmludGYoIkNvdWxkbid0IGZpbmQgS2VyYmVyb3NUaW1lIGNvbnN0cnVjdG9yXG4iKTsKKyAgICAgICAgcHJpbnRmKCJMU0E6IENvdWxkbid0IGZpbmQgS2VyYmVyb3NUaW1lIGNvbnN0cnVjdG9yXG4iKTsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRm91bmQgS2VyYmVyb3NUaW1lIGNvbnN0cnVjdG9yXG4iKTsKLSAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBGb3VuZCBLZXJiZXJvc1RpbWUgY29uc3RydWN0b3JcbiIpOworICAgIH0KIAogICAgIC8vIGxvYWQgdGhlIHNldFJlYWxtIG1ldGhvZCBpbiBQcmluY2lwYWxOYW1lCiAgICAgc2V0UmVhbG1NZXRob2QgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgcHJpbmNpcGFsTmFtZUNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFJlYWxtIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOwogICAgIGlmIChzZXRSZWFsbU1ldGhvZCA9PSAwKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGRuJ3QgZmluZCBzZXRSZWFsbSBpbiBQcmluY2lwYWxOYW1lXG4iKTsKKyAgICAgICAgcHJpbnRmKCJMU0E6IENvdWxkbid0IGZpbmQgc2V0UmVhbG0gaW4gUHJpbmNpcGFsTmFtZVxuIik7CiAgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIH0KIAotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiRmluaXNoZWQgT25Mb2FkIHByb2Nlc3NpbmdcbiIpOwotICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmIChuYXRpdmVfZGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJMU0E6IEZpbmlzaGVkIE9uTG9hZCBwcm9jZXNzaW5nXG4iKTsKKyAgICB9CiAKICAgICByZXR1cm4gSk5JX1ZFUlNJT05fMV8yOwogfQpAQCAtMzg5LDE2ICs0MDMsMjUgQEAKIAogICAgICAgICBpZiAoa3JiY3JlZHNDb25zdHJ1Y3RvciA9PSAwKSB7CiAgICAgICAgICAgICBrcmJjcmVkc0NvbnN0cnVjdG9yID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGtyYmNyZWRzQ2xhc3MsICI8aW5pdD4iLAotICAgICAgICAgICAgICAgICAgICAiKExzdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9UaWNrZXQ7THN1bi9zZWN1cml0eS9rcmI1L1ByaW5jaXBhbE5hbWU7THN1bi9zZWN1cml0eS9rcmI1L1ByaW5jaXBhbE5hbWU7THN1bi9zZWN1cml0eS9rcmI1L0VuY3J5cHRpb25LZXk7THN1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL1RpY2tldEZsYWdzO0xzdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9LZXJiZXJvc1RpbWU7THN1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL0tlcmJlcm9zVGltZTtMc3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvS2VyYmVyb3NUaW1lO0xzdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9LZXJiZXJvc1RpbWU7THN1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL0hvc3RBZGRyZXNzZXM7KVYiKTsKKyAgICAgICAgICAgICAgICAgICAgIihMc3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvVGlja2V0OyIKKyAgICAgICAgICAgICAgICAgICAgIkxzdW4vc2VjdXJpdHkva3JiNS9QcmluY2lwYWxOYW1lOyIKKyAgICAgICAgICAgICAgICAgICAgIkxzdW4vc2VjdXJpdHkva3JiNS9QcmluY2lwYWxOYW1lOyIKKyAgICAgICAgICAgICAgICAgICAgIkxzdW4vc2VjdXJpdHkva3JiNS9FbmNyeXB0aW9uS2V5OyIKKyAgICAgICAgICAgICAgICAgICAgIkxzdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9UaWNrZXRGbGFnczsiCisgICAgICAgICAgICAgICAgICAgICJMc3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvS2VyYmVyb3NUaW1lOyIKKyAgICAgICAgICAgICAgICAgICAgIkxzdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9LZXJiZXJvc1RpbWU7IgorICAgICAgICAgICAgICAgICAgICAiTHN1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL0tlcmJlcm9zVGltZTsiCisgICAgICAgICAgICAgICAgICAgICJMc3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvS2VyYmVyb3NUaW1lOyIKKyAgICAgICAgICAgICAgICAgICAgIkxzdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9Ib3N0QWRkcmVzc2VzOylWIik7CiAgICAgICAgICAgICBpZiAoa3JiY3JlZHNDb25zdHJ1Y3RvciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJDb3VsZG4ndCBmaW5kIHN1bi5zZWN1cml0eS5rcmI1LkNyZWRlbnRpYWxzIGNvbnN0cnVjdG9yXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIkxTQTogQ291bGRuJ3QgZmluZCBzdW4uc2VjdXJpdHkua3JiNS5DcmVkZW50aWFscyBjb25zdHJ1Y3RvclxuIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAjaWZkZWYgREVCVUcKLSAgICAgICAgcHJpbnRmKCJGb3VuZCBLcmJDcmVkcyBjb25zdHJ1Y3RvclxuIik7Ci0gICAgICAgICNlbmRpZgorICAgICAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgICAgICBwcmludGYoIkxTQTogRm91bmQgS3JiQ3JlZHMgY29uc3RydWN0b3JcbiIpOworICAgICAgICB9CiAKICAgICAgICAgLy8KICAgICAgICAgLy8gR2V0IHRoZSBsb2dvbiBoYW5kbGUgYW5kIHBhY2thZ2UgSUQgZnJvbSB0aGUKQEAgLTQwNyw5ICs0MzAsOSBAQAogICAgICAgICBpZiAoIVBhY2thZ2VDb25uZWN0TG9va3VwKCZMb2dvbkhhbmRsZSwgJlBhY2thZ2VJZCkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAjaWZkZWYgREVCVUcKLSAgICAgICAgcHJpbnRmKCJHb3QgaGFuZGxlIHRvIEtlcmJlcm9zIHBhY2thZ2VcbiIpOwotICAgICAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICAgICAgcHJpbnRmKCJMU0E6IEdvdCBoYW5kbGUgdG8gS2VyYmVyb3MgcGFja2FnZVxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvLyBHZXQgdGhlIE1TIFRHVCBmcm9tIGNhY2hlCiAgICAgICAgIENhY2hlUmVxdWVzdC5NZXNzYWdlVHlwZSA9IEtlcmJSZXRyaWV2ZVRpY2tldE1lc3NhZ2U7CkBAIC00MjYsOSArNDQ5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICZTdWJTdGF0dXMKICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICAgICAgI2lmZGVmIERFQlVHCi0gICAgICAgIHByaW50ZigiUmVzcG9uc2Ugc2l6ZSBpcyAlZFxuIiwgcnNwU2l6ZSk7Ci0gICAgICAgICNlbmRpZgorICAgICAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgICAgICBwcmludGYoIkxTQTogUmVzcG9uc2Ugc2l6ZSBpcyAlZFxuIiwgcnNwU2l6ZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIUxTQV9TVUNDRVNTKFN0YXR1cykgfHwgIUxTQV9TVUNDRVNTKFN1YlN0YXR1cykpIHsKICAgICAgICAgICAgIGlmICghTFNBX1NVQ0NFU1MoU3RhdHVzKSkgewpAQCAtNDY3LDkgKzQ5MCw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaWdub3JlX2NhY2hlKSB7Ci0gICAgICAgICAgICAjaWZkZWYgREVCVUcKLSAgICAgICAgICAgIHByaW50ZigiTVMgVEdUIGluIGNhY2hlIGlzIGludmFsaWQvbm90IHN1cHBvcnRlZDsgcmVxdWVzdCBuZXcgdGlja2V0XG4iKTsKLSAgICAgICAgICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICAgICAgICAgIHByaW50ZigiTFNBOiBNUyBUR1QgaW4gY2FjaGUgaXMgaW52YWxpZC9ub3Qgc3VwcG9ydGVkOyByZXF1ZXN0IG5ldyB0aWNrZXRcbiIpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB1c2UgZG9tYWluIHRvIHJlcXVlc3QgVGlja2V0CiAgICAgICAgICAgICBTdGF0dXMgPSBDb25zdHJ1Y3RUaWNrZXRSZXF1ZXN0KG1zdGlja2V0LT5UYXJnZXREb21haW5OYW1lLApAQCAtNDkzLDkgKzUxNiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmU3ViU3RhdHVzCiAgICAgICAgICAgICAgICAgICAgICAgICApOwogCi0gICAgICAgICAgICAjaWZkZWYgREVCVUcKLSAgICAgICAgICAgIHByaW50ZigiUmVzcG9uc2Ugc2l6ZSBpcyAlZFxuIiwgcmVzcG9uc2VTaXplKTsKLSAgICAgICAgICAgICNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICAgICAgICAgIHByaW50ZigiTFNBOiBSZXNwb25zZSBzaXplIGlzICVkXG4iLCByZXNwb25zZVNpemUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoIUxTQV9TVUNDRVNTKFN0YXR1cykgfHwgIUxTQV9TVUNDRVNTKFN1YlN0YXR1cykpIHsKICAgICAgICAgICAgICAgICBpZiAoIUxTQV9TVUNDRVNTKFN0YXR1cykpIHsKQEAgLTc4OCw3ICs4MTEsOSBAQAogICAgIHN0YXRpYyBXQ0hBUiBzek1zZ0J1ZltNQVhfTVNHX1NJWkVdOwogICAgIERXT1JEIGR3UmVzOwogCi0gICAgcHJpbnRmKCJFcnJvciBjYWxsaW5nIGZ1bmN0aW9uICVzOiAlbHVcbiIsIHN6QVBJLCBkd0Vycm9yKTsKKyAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgIHByaW50ZigiTFNBOiBFcnJvciBjYWxsaW5nIGZ1bmN0aW9uICVzOiAlbHVcbiIsIHN6QVBJLCBkd0Vycm9yKTsKKyAgICB9CiAKICAgICBkd1JlcyA9IEZvcm1hdE1lc3NhZ2UgKAogICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCkBAIC03OTgsMTEgKzgyMywxMyBAQAogICAgICAgICAgICAgc3pNc2dCdWYsCiAgICAgICAgICAgICBNQVhfTVNHX1NJWkUsCiAgICAgICAgICAgICBOVUxMKTsKLSAgICBpZiAoMCA9PSBkd1JlcykgewotICAgICAgICBwcmludGYoIkZvcm1hdE1lc3NhZ2UgZmFpbGVkIHdpdGggJWRcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICAgICAgLy8gRXhpdFByb2Nlc3MoRVhJVF9GQUlMVVJFKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiVTIixzek1zZ0J1Zik7CisgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICBpZiAoMCA9PSBkd1JlcykgeworICAgICAgICAgICAgcHJpbnRmKCJMU0E6IEZvcm1hdE1lc3NhZ2UgZmFpbGVkIHdpdGggJWRcbiIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgICAgIC8vIEV4aXRQcm9jZXNzKEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIkxTQTogJVMiLHN6TXNnQnVmKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtODk2LDE3ICs5MjMsMTkgQEAKICAgICAgICAgICAgICgoZG9tYWluTmFtZS5MZW5ndGgpKnNpemVvZihXQ0hBUikgKyBzaXplb2YoVU5JQ09ERV9OVUxMKSkpOwogICAgIHdjc25jcHkocmVhbG0sIGRvbWFpbk5hbWUuQnVmZmVyLCBkb21haW5OYW1lLkxlbmd0aC9zaXplb2YoV0NIQVIpKTsKIAotICAgICNpZmRlZiBERUJVRwotICAgIHByaW50ZigiUHJpbmNpcGFsIGRvbWFpbiBpcyAlU1xuIiwgcmVhbG0pOwotICAgIHByaW50ZigiTmFtZSB0eXBlIGlzICV4XG4iLCBwcmluY2lwYWxOYW1lLT5OYW1lVHlwZSk7Ci0gICAgcHJpbnRmKCJOYW1lIGNvdW50IGlzICV4XG4iLCBwcmluY2lwYWxOYW1lLT5OYW1lQ291bnQpOwotICAgICNlbmRpZgorICAgIGlmIChuYXRpdmVfZGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJMU0E6IFByaW5jaXBhbCBkb21haW4gaXMgJVNcbiIsIHJlYWxtKTsKKyAgICAgICAgcHJpbnRmKCJMU0E6IE5hbWUgdHlwZSBpcyAleFxuIiwgcHJpbmNpcGFsTmFtZS0+TmFtZVR5cGUpOworICAgICAgICBwcmludGYoIkxTQTogTmFtZSBjb3VudCBpcyAleFxuIiwgcHJpbmNpcGFsTmFtZS0+TmFtZUNvdW50KTsKKyAgICB9CiAKICAgICBuYW1lQ291bnQgPSBwcmluY2lwYWxOYW1lLT5OYW1lQ291bnQ7CiAgICAgc3RyaW5nQXJyYXkgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgbmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFMYW5nU3RyaW5nQ2xhc3MsIE5VTEwpOwogICAgIGlmIChzdHJpbmdBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHByaW50ZigiQ2FuJ3QgYWxsb2NhdGUgU3RyaW5nIGFycmF5IGZvciBQcmluY2lwYWxcbiIpOworICAgICAgICBpZiAobmF0aXZlX2RlYnVnKSB7CisgICAgICAgICAgICBwcmludGYoIkxTQTogQ2FuJ3QgYWxsb2NhdGUgU3RyaW5nIGFycmF5IGZvciBQcmluY2lwYWxcbiIpOworICAgICAgICB9CiAgICAgICAgIExvY2FsRnJlZShyZWFsbSk7CiAgICAgICAgIHJldHVybiBwcmluY2lwYWw7CiAgICAgfQpAQCAtOTQxLDYgKzk3MCwxNyBAQAogICAgIC8vIEZpcnN0LCBuZWVkIHRvIGJ1aWxkIGEgYnl0ZSBhcnJheQogICAgIGpieXRlQXJyYXkgYXJ5OwogICAgIGpvYmplY3QgZW5jcnlwdGlvbktleSA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxjcnlwdG9LZXktPkxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChjcnlwdG9LZXktPlZhbHVlW2ldKSBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gY3J5cHRvS2V5LT5MZW5ndGgpIHsKKyAgICAgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICAgICAgcHJpbnRmKCJMU0E6IFNlc3Npb24ga2V5IGFsbCB6ZXJvLiBTdG9wLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgYXJ5ID0gKCplbnYpLT5OZXdCeXRlQXJyYXkoZW52LGNyeXB0b0tleS0+TGVuZ3RoKTsKICAgICAoKmVudiktPlNldEJ5dGVBcnJheVJlZ2lvbihlbnYsIGFyeSwgKGpzaXplKSAwLCBjcnlwdG9LZXktPkxlbmd0aCwKQEAgLTEwMDUsOSArMTA0NSw5IEBACiAgICAgICAgICAgICAgICAgaG91ciwKICAgICAgICAgICAgICAgICBtaW51dGUsCiAgICAgICAgICAgICAgICAgc2Vjb25kICk7Ci0gICAgICAgICNpZmRlZiBERUJVRwotICAgICAgICBwcmludGYoIiVTXG4iLCAod2NoYXJfdCAqKXRpbWVTdHJpbmcpOwotICAgICAgICAjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgaWYgKG5hdGl2ZV9kZWJ1ZykgeworICAgICAgICAgICAgcHJpbnRmKCJMU0E6ICVTXG4iLCAod2NoYXJfdCAqKXRpbWVTdHJpbmcpOworICAgICAgICB9CiAgICAgICAgIHN0cmluZ1RpbWUgPSAoKmVudiktPk5ld1N0cmluZyhlbnYsIHRpbWVTdHJpbmcsCiAgICAgICAgICAgICAgICAgKHNpemVvZih0aW1lU3RyaW5nKS9zaXplb2YoV0NIQVIpKS0xKTsKICAgICAgICAgaWYgKHN0cmluZ1RpbWUgIT0gTlVMTCkgeyAvLyBldmVyeXRoaW5nJ3MgT0sgc28gZmFyCmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9Db21wb25lbnQuY3BwIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vd2luZG93cy9hd3RfQ29tcG9uZW50LmNwcAppbmRleCA5ZGI4ZWM0Li5mYjdhZTRjIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9Db21wb25lbnQuY3BwCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X0NvbXBvbmVudC5jcHAKQEAgLTE4NDMsOCArMTg0MywxMyBAQAogICAgICAgY2FzZSBXTV9BV1RfU0VUQUxXQVlTT05UT1A6IHsKICAgICAgICAgQXd0V2luZG93KiB3ID0gKEF3dFdpbmRvdyopbFBhcmFtOwogICAgICAgICBCT09MIHZhbHVlID0gKEJPT0wpd1BhcmFtOworICAgICAgICBVSU5UIGZsYWdzID0gU1dQX05PTU9WRSB8IFNXUF9OT1NJWkU7CisgICAgICAgIC8vIHRyYW5zaWVudCB3aW5kb3dzIHNob3VsZG4ndCBjaGFuZ2UgdGhlIG93bmVyIHdpbmRvdydzIHBvc2l0aW9uIGluIHRoZSB6LW9yZGVyCisgICAgICAgIGlmICh3LT5Jc1JldGFpbmluZ0hpZXJhcmNoeVpPcmRlcigpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTV1BfTk9PV05FUlpPUkRFUjsKKyAgICAgICAgfQogICAgICAgICA6OlNldFdpbmRvd1Bvcyh3LT5HZXRIV25kKCksICh2YWx1ZSAhPSAwID8gSFdORF9UT1BNT1NUIDogSFdORF9OT1RPUE1PU1QpLAotICAgICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLCBTV1BfTk9NT1ZFfFNXUF9OT1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLCBmbGFncyk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9XaW5kb3cuY3BwIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vd2luZG93cy9hd3RfV2luZG93LmNwcAppbmRleCA4OGJjZDhlLi4zYjBiMWQzIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9XaW5kb3cuY3BwCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbmRvdy5jcHAKQEAgLTE2NSw3ICsxNjUsNiBAQAogaW50IEF3dFdpbmRvdzo6bXNfaW5zdGFuY2VDb3VudGVyID0gMDsKIEhIT09LIEF3dFdpbmRvdzo6bXNfaENCVEZpbHRlcjsKIEF3dFdpbmRvdyAqIEF3dFdpbmRvdzo6bV9ncmFiYmVkV2luZG93ID0gTlVMTDsKLUhXTkQgQXd0V2luZG93OjpzbV9yZXRhaW5pbmdIaWVyYXJjaHlaT3JkZXJJblNob3cgPSBOVUxMOwogQk9PTCBBd3RXaW5kb3c6OnNtX3Jlc2l6aW5nID0gRkFMU0U7CiBVSU5UIEF3dFdpbmRvdzo6dW50cnVzdGVkV2luZG93c0NvdW50ZXIgPSAwOwogCkBAIC0zNDEsMjMgKzM0MCw2IEBACiB9CiAKIE1zZ1JvdXRpbmcgQXd0V2luZG93OjpXbVdpbmRvd1Bvc0NoYW5naW5nKExQQVJBTSB3aW5kb3dQb3MpIHsKLSAgICAvKgotICAgICAqIFNlZSA2MTc4MDA0LgotICAgICAqIFNvbWUgd2luZG93cyBzaG91bGRuJ3QgdHJpZ2dlciBhIGNoYW5nZSBpbiB6LW9yZGVyIG9mCi0gICAgICogYW55IHdpbmRvdyBmcm9tIHRoZSBoaWVyYXJjaHkuCi0gICAgICovCi0gICAgaWYgKElzUmV0YWluaW5nSGllcmFyY2h5Wk9yZGVyKCkpIHsKLSAgICAgICAgaWYgKCgoV0lORE9XUE9TICopd2luZG93UG9zKS0+ZmxhZ3MgJiBTV1BfU0hPV1dJTkRPVykgewotICAgICAgICAgICAgc21fcmV0YWluaW5nSGllcmFyY2h5Wk9yZGVySW5TaG93ID0gR2V0SFduZCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzbV9yZXRhaW5pbmdIaWVyYXJjaHlaT3JkZXJJblNob3cgIT0gTlVMTCkgewotICAgICAgICBIV05EIGFuY2VzdG9yID0gOjpHZXRBbmNlc3RvcihzbV9yZXRhaW5pbmdIaWVyYXJjaHlaT3JkZXJJblNob3csIEdBX1JPT1RPV05FUik7Ci0gICAgICAgIEhXTkQgd2luZG93QW5jZXN0b3IgPSA6OkdldEFuY2VzdG9yKEdldEhXbmQoKSwgR0FfUk9PVE9XTkVSKTsKLQotICAgICAgICBpZiAod2luZG93QW5jZXN0b3IgPT0gYW5jZXN0b3IpIHsKLSAgICAgICAgICAgICgoV0lORE9XUE9TICopd2luZG93UG9zKS0+ZmxhZ3MgfD0gU1dQX05PWk9SREVSOwotICAgICAgICB9Ci0gICAgfQogICAgIHJldHVybiBtckRvRGVmYXVsdDsKIH0KIApAQCAtMzY5LDE5ICszNTEsMTQgQEAKICAgICA6OlNldFdpbmRvd1Bvcyh3YXJuaW5nV2luZG93LCBIV05EX05PVE9QTU9TVCwKICAgICAgICAgICAgIHJlY3QubGVmdCwgcmVjdC50b3AsCiAgICAgICAgICAgICByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSAtIHJlY3QudG9wLAotICAgICAgICAgICAgU1dQX0FTWU5DV0lORE9XUE9TIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIKKyAgICAgICAgICAgIFNXUF9BU1lOQ1dJTkRPV1BPUyB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSIHwKKyAgICAgICAgICAgIFNXUF9OT09XTkVSWk9SREVSCiAgICAgICAgICAgICApOwogfQogCiBNc2dSb3V0aW5nIEF3dFdpbmRvdzo6V21XaW5kb3dQb3NDaGFuZ2VkKExQQVJBTSB3aW5kb3dQb3MpIHsKICAgICBXSU5ET1dQT1MgKiB3cCA9IChXSU5ET1dQT1MgKil3aW5kb3dQb3M7CiAKLSAgICBpZiAoSXNSZXRhaW5pbmdIaWVyYXJjaHlaT3JkZXIoKSAmJiB3cC0+ZmxhZ3MgJiBTV1BfU0hPV1dJTkRPVykgewotICAgICAgICAvLyBCeSB0aGlzIHRpbWUgYWxsIHRoZSB3aW5kb3dzIGZyb20gdGhlIGhpZXJhcmNoeSBhcmUgYWxyZWFkeSBub3RpZmllZCBhYm91dCB6LW9yZGVyIGNoYW5nZS4KLSAgICAgICAgLy8gVGh1cyB3ZSBtYXkgYW5kIHdlIHNob3VsZCByZXNldCB0aGUgdHJpZ2dlciBpbiBvcmRlciBub3QgdG8gYWZmZWN0IG90aGVyIGNoYW5nZXMuCi0gICAgICAgIHNtX3JldGFpbmluZ0hpZXJhcmNoeVpPcmRlckluU2hvdyA9IE5VTEw7Ci0gICAgfQotCiAgICAgLy8gUmVwb3NpdGlvbiB0aGUgd2FybmluZyB3aW5kb3cKICAgICBpZiAoSXNVbnRydXN0ZWQoKSAmJiB3YXJuaW5nV2luZG93ICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHdwLT5mbGFncyAmIFNXUF9ISURFV0lORE9XKSB7CkBAIC04NTQsNyArODMxLDcgQEAKICAgICBpZiAoc2VjdXJpdHlBbmltYXRpb25LaW5kID09IGFrU2hvdykgewogICAgICAgICA6OlNldFdpbmRvd1Bvcyh3YXJuaW5nV2luZG93LCBIV05EX05PVE9QTU9TVCwgMCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwKLSAgICAgICAgICAgICAgICBTV1BfU0hPV1dJTkRPVyk7CisgICAgICAgICAgICAgICAgU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9PV05FUlpPUkRFUik7CiAKICAgICAgICAgOjpTZXRMYXllcmVkV2luZG93QXR0cmlidXRlcyh3YXJuaW5nV2luZG93LCBSR0IoMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgMHhGRiwgTFdBX0FMUEhBKTsKQEAgLTg4MCw3ICs4NTcsNyBAQAogICAgICAgICBjYXNlIGFrUHJlSGlkZToKICAgICAgICAgICAgIDo6U2V0V2luZG93UG9zKHdhcm5pbmdXaW5kb3csIEhXTkRfTk9UT1BNT1NULCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwKLSAgICAgICAgICAgICAgICAgICAgU1dQX0hJREVXSU5ET1cpOworICAgICAgICAgICAgICAgICAgICBTV1BfSElERVdJTkRPVyB8IFNXUF9OT09XTkVSWk9SREVSKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGFrU2hvdzoKICAgICAgICAgICAgIFJlcGFpbnRXYXJuaW5nV2luZG93KCk7CkBAIC0xMjUwLDcgKzEyMjcsMTYgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgOjpTaG93V2luZG93KEdldEhXbmQoKSwgbkNtZFNob3cpOworICAgICAgICAvLyB0cmFuc2llbnQgd2luZG93cyBzaG91bGRuJ3QgY2hhbmdlIHRoZSBvd25lciB3aW5kb3cncyBwb3NpdGlvbiBpbiB0aGUgei1vcmRlcgorICAgICAgICBpZiAoSXNSZXRhaW5pbmdIaWVyYXJjaHlaT3JkZXIoKSl7CisgICAgICAgICAgICBVSU5UIGZsYWdzID0gU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfU0hPV1dJTkRPVyB8IFNXUF9OT09XTkVSWk9SREVSOworICAgICAgICAgICAgaWYgKG5DbWRTaG93ID09IFNXX1NIT1dOQSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IFNXUF9OT0FDVElWQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgOjpTZXRXaW5kb3dQb3MoR2V0SFduZCgpLCBIV05EX1RPUE1PU1QsIDAsIDAsIDAsIDAsIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIDo6U2hvd1dpbmRvdyhHZXRIV25kKCksIG5DbWRTaG93KTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHRhcmdldCk7CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9XaW5kb3cuaCBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbmRvdy5oCmluZGV4IGJmNDMxNTAuLjA1MjgyZjcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbmRvdy5oCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbmRvdy5oCkBAIC0yNDgsNyArMjQ4LDYgQEAKICAgICBzdGF0aWMgaW50IG1zX2luc3RhbmNlQ291bnRlcjsKICAgICBzdGF0aWMgSEhPT0sgbXNfaENCVEZpbHRlcjsKICAgICBzdGF0aWMgTFJFU1VMVCBDQUxMQkFDSyBDQlRGaWx0ZXIoaW50IG5Db2RlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLSAgICBzdGF0aWMgSFdORCBzbV9yZXRhaW5pbmdIaWVyYXJjaHlaT3JkZXJJblNob3c7IC8vIGEgcmVmZXJyZWQgd2luZG93IGluIHRoZSBwcm9jZXNzIG9mIHNob3cKICAgICBzdGF0aWMgQk9PTCBzbV9yZXNpemluZzsgICAgICAgIC8qIGluIHRoZSBtaWRkbGUgb2YgYSByZXNpemluZyBvcGVyYXRpb24gKi8KIAogICAgIFJFQ1QgbV9pbnNldHM7ICAgICAgICAgIC8qIGEgY2FjaGUgb2YgdGhlIGluc2V0cyBiZWluZyB1c2VkICovCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9jb20vc3VuL2F3dC9UcmFuc2x1Y2VuY3kvVHJhbnNsdWNlbnRKQXBwbGV0VGVzdC9UcmFuc2x1Y2VudEpBcHBsZXRUZXN0LmphdmEgYi9qZGsvdGVzdC9jb20vc3VuL2F3dC9UcmFuc2x1Y2VuY3kvVHJhbnNsdWNlbnRKQXBwbGV0VGVzdC9UcmFuc2x1Y2VudEpBcHBsZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4Y2JlNDA2Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vYXd0L1RyYW5zbHVjZW5jeS9UcmFuc2x1Y2VudEpBcHBsZXRUZXN0L1RyYW5zbHVjZW50SkFwcGxldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QgJUklICVFJQotICogQGJ1ZyA2NjgzNzI4Ci0gKiBAc3VtbWFyeSBUZXN0cyB0aGF0IGEgSkFwcGxldCBpbiBhIHRyYW5zbHVjZW50IEpGcmFtZSB3b3JrcyBwcm9wZXJseQotICogQGF1dGhvciBLZW5uZXRoLlJ1c3NlbGxAc3VuLmNvbTogYXJlYT1HcmFwaGljcwotICogQGNvbXBpbGUgLVhEaWdub3JlLnN5bWJvbC5maWxlPXRydWUgVHJhbnNsdWNlbnRKQXBwbGV0VGVzdC5qYXZhCi0gKiBAcnVuIG1haW4vbWFudWFsL290aGVydm0gVHJhbnNsdWNlbnRKQXBwbGV0VGVzdAotICovCi0KLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLio7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNsdWNlbnRKQXBwbGV0VGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBKRnJhbWUgZnJhbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBwYWludENvbXBvbmVudENhbGxlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0QW5kU2hvd0dVSSgpIHsKLSAgICAgICAgZnJhbWUgPSBuZXcgSkZyYW1lKCk7Ci0gICAgICAgIEpBcHBsZXQgYXBwbGV0ID0gbmV3IEpBcHBsZXQoKTsKLSAgICAgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgICAgICAgICBwYWludENvbXBvbmVudENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5SRUQpOwotICAgICAgICAgICAgICAgIGcuZmlsbE92YWwoMCwgMCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBwYW5lbC5zZXREb3VibGVCdWZmZXJlZChmYWxzZSk7Ci0gICAgICAgIHBhbmVsLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIGFwcGxldC5hZGQocGFuZWwpOwotICAgICAgICBmcmFtZS5hZGQoYXBwbGV0KTsKLSAgICAgICAgZnJhbWUuc2V0Qm91bmRzKDEwMCwgMTAwLCAyMDAsIDIwMCk7Ci0gICAgICAgIGZyYW1lLnNldFVuZGVjb3JhdGVkKHRydWUpOwotICAgICAgICBjb20uc3VuLmF3dC5BV1RVdGlsaXRpZXMuc2V0V2luZG93T3BhcXVlKGZyYW1lLCBmYWxzZSk7Ci0gICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VuLmF3dC5TdW5Ub29sa2l0IHRrID0gKHN1bi5hd3QuU3VuVG9vbGtpdClUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7Ci0KLSAgICAgICAgUm9ib3QgciA9IG5ldyBSb2JvdCgpOwotICAgICAgICBDb2xvciBjb2xvcjEgPSByLmdldFBpeGVsQ29sb3IoMTAwLCAxMDApOyAvLyAoMCwgMCkgaW4gZnJhbWUgY29vcmRpbmF0ZXMKLQotICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbml0QW5kU2hvd0dVSSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGsucmVhbFN5bmMoKTsKLQotICAgICAgICBpZiAoIXBhaW50Q29tcG9uZW50Q2FsbGVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBGQUlMRUQ6IHBhbmVsJ3MgcGFpbnRDb21wb25lbnQoKSBtZXRob2QgaXMgbm90IGNhbGxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sb3IgbmV3Q29sb3IxID0gci5nZXRQaXhlbENvbG9yKDEwMCwgMTAwKTsKLSAgICAgICAgLy8gdW5mb3J0dW5hdGVseSwgcm9ib3QuZ2V0UGl4ZWxDb2xvcigpIGRvZXNuJ3Qgd29yayBmb3Igc29tZSB1bmtub3duIHJlYXNvbgotICAgICAgICAvLyBDb2xvciBuZXdDb2xvcjIgPSByLmdldFBpeGVsQ29sb3IoMjAwLCAyMDApOwotICAgICAgICBCdWZmZXJlZEltYWdlIGJpbSA9IHIuY3JlYXRlU2NyZWVuQ2FwdHVyZShuZXcgUmVjdGFuZ2xlKDIwMCwgMjAwLCAxLCAxKSk7Ci0gICAgICAgIENvbG9yIG5ld0NvbG9yMiA9IG5ldyBDb2xvcihiaW0uZ2V0UkdCKDAsIDApKTsKLQotICAgICAgICAvLyBGcmFtZSBtdXN0IGJlIHRyYW5zcGFyZW50IGF0ICgxMDAsIDEwMCkgaW4gc2NyZWVuIGNvb3JkcwotICAgICAgICBpZiAoIWNvbG9yMS5lcXVhbHMobmV3Q29sb3IxKSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjb2xvcjEgPSAiICsgY29sb3IxKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigibmV3Q29sb3IxID0gIiArIG5ld0NvbG9yMSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBGQUlMRUQ6IGZyYW1lIHBpeGVsIGF0ICgwLCAwKSBpcyBub3QgdHJhbnNwYXJlbnQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZyYW1lIG11c3QgYmUgUkVEIGF0ICgyMDAsIDIwMCkgaW4gc2NyZWVuIGNvb3JkcwotICAgICAgICBpZiAoIW5ld0NvbG9yMi5lcXVhbHMoQ29sb3IuUkVEKSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJuZXdDb2xvcjIgPSAiICsgbmV3Q29sb3IyKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IEZBSUxFRDogZnJhbWUgcGl4ZWwgYXQgKDEwMCwgMTAwKSBpcyBub3QgcmVkICh0cmFuc3BhcmVudD8pIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgUEFTU0VEIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9hd3QvVHJhbnNsdWNlbmN5L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RTRnJhbWUuamF2YSBiL2pkay90ZXN0L2NvbS9zdW4vYXd0L1RyYW5zbHVjZW5jeS9UcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdC9UU0ZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOWNmNzQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9hd3QvVHJhbnNsdWNlbmN5L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RTRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBjb20uc3VuLmF3dC5BV1RVdGlsaXRpZXM7Ci1pbXBvcnQgc3RhdGljIGNvbS5zdW4uYXd0LkFXVFV0aWxpdGllcy5UcmFuc2x1Y2VuY3kuKjsKLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0Vudmlyb25tZW50OwotaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlQWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuQ2FudmFzOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmFkaWVudFBhaW50OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7Ci1pbXBvcnQgamF2YS5hd3QuUGFpbnQ7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLmF3dC5nZW9tLkVsbGlwc2UyRDsKLWltcG9ydCBqYXZheC5zd2luZy5KQXBwbGV0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgVFNGcmFtZSB7Ci0KLSAgICBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0KLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VTd2luZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlc3dpbmciKSAhPSBudWxsOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZVNoYXBlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VzaGFwZSIpICE9IG51bGw7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlVHJhbnNsID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2V0cmFuc2wiKSAhPSBudWxsOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZU5vbk9wYXF1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlbm9ub3AiKSAhPSBudWxsOwotCi0gICAgc3RhdGljIGZpbmFsIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW5kZXIoR3JhcGhpY3MgZywgaW50IHcsIGludCBoLCBib29sZWFuIHVzZU5vbk9wYXF1ZSkgewotICAgICAgICBpZiAodXNlTm9uT3BhcXVlKSB7Ci0gICAgICAgICAgICBHcmFwaGljczJEIGcyZCA9IChHcmFwaGljczJEKWc7Ci0gICAgICAgICAgICBHcmFkaWVudFBhaW50IHAgPQotICAgICAgICAgICAgICAgIG5ldyBHcmFkaWVudFBhaW50KDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbG9yKHJuZC5uZXh0SW50KDB4ZmZmZmZmKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29sb3Iocm5kLm5leHRJbnQoMHhmZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZC5uZXh0SW50KDB4ZmYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmQubmV4dEludCgweGZmKSwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICBnMmQuc2V0UGFpbnQocCk7Ci0gICAgICAgICAgICBnMmQuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfQU5USUFMSUFTSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKLSAgICAgICAgICAgIGcyZC5maWxsT3ZhbCgwLCAwLCB3LCBoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGcuc2V0Q29sb3IobmV3IENvbG9yKHJuZC5uZXh0SW50KDB4ZmZmZmZmKSkpOwotICAgICAgICAgICAgZy5maWxsUmVjdCgwLCAwLCB3LCBoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15Q2FudmFzIGV4dGVuZHMgQ2FudmFzIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgICAgIHJlbmRlcihnLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbigyMDAsIDEwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uT3BhcXVlSkZyYW1lIGV4dGVuZHMgSkZyYW1lIHsKLSAgICAgICAgTm9uT3BhcXVlSkZyYW1lKEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYykgewotICAgICAgICAgICAgc3VwZXIoIk5vbk9wYXF1ZSBTd2luZyBKRnJhbWUiLCBnYyk7Ci0gICAgICAgICAgICBKUGFuZWwgcCA9IG5ldyBKUGFuZWwoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5wYWludENvbXBvbmVudChnKTsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyKGcsIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5yZWQpOwotICAgICAgICAgICAgICAgICAgICBnLmRyYXdTdHJpbmcoIk5vbi1PcGFxdWUgU3dpbmcgSkZyYW1lIiwgMTAsIDE1KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgcC5zZXREb3VibGVCdWZmZXJlZChmYWxzZSk7Ci0gICAgICAgICAgICBwLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgICAgICBhZGQocCk7Ci0gICAgICAgICAgICBzZXRVbmRlY29yYXRlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25PcGFxdWVKQXBwbGV0RnJhbWUgZXh0ZW5kcyBKRnJhbWUgewotICAgICAgICBKUGFuZWwgcDsKLSAgICAgICAgTm9uT3BhcXVlSkFwcGxldEZyYW1lKEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYykgewotICAgICAgICAgICAgc3VwZXIoIk5vbk9wYXF1ZSBTd2luZyBKQXBwbGV0RnJhbWUiLCBnYyk7Ci0gICAgICAgICAgICBKQXBwbGV0IGphID0gbmV3IEpBcHBsZXQoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5wYWludChnKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJKQXBwbGV0RnJhbWUgcGFpbnQgY2FsbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHAgPSBuZXcgSlBhbmVsKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIucGFpbnRDb21wb25lbnQoZyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcihnLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGcuc2V0Q29sb3IoQ29sb3IucmVkKTsKLSAgICAgICAgICAgICAgICAgICAgZy5kcmF3U3RyaW5nKCJOb24tT3BhcXVlIFN3aW5nIEpGcmFtZSIsIDEwLCAxNSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHAuc2V0RG91YmxlQnVmZmVyZWQoZmFsc2UpOwotICAgICAgICAgICAgcC5zZXRPcGFxdWUoZmFsc2UpOwotICAgICAgICAgICAgamEuYWRkKHApOwotICAgICAgICAgICAgYWRkKGphKTsKLSAgICAgICAgICAgIHNldFVuZGVjb3JhdGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vbk9wYXF1ZUZyYW1lIGV4dGVuZHMgRnJhbWUgewotICAgICAgICBOb25PcGFxdWVGcmFtZShHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MpIHsKLSAgICAgICAgICAgIHN1cGVyKCJOb25PcGFxdWUgQVdUIEZyYW1lIiwgZ2MpOwotICAgICAgICAgICAgLy8gdW5jb21tZW50IHRvIHRlc3Qgd2l0aCBodyBjaGlsZAotLy8gICAgICAgICAgICBzZXRMYXlvdXQobnVsbCk7Ci0vLyAgICAgICAgICAgIENvbXBvbmVudCBjID0gbmV3IFBhbmVsKCkgewotLy8gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotLy8gICAgICAgICAgICAgICAgICAgIGcuc2V0Q29sb3IobmV3IENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDAuNWYpKTsKLS8vICAgICAgICAgICAgICAgICAgICBnLmZpbGxSZWN0KDAsIDAsIGdldFdpZHRoKCksIGdldEhlaWdodCgpKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfTsKLS8vICAgICAgICAgICAgYy5zZXRTaXplKDEwMCwgMTAwKTsKLS8vICAgICAgICAgICAgYy5zZXRCYWNrZ3JvdW5kKENvbG9yLnJlZCk7Ci0vLyAgICAgICAgICAgIGMuc2V0Rm9yZWdyb3VuZChDb2xvci5yZWQpOwotLy8gICAgICAgICAgICBhZGQoYyk7Ci0vLyAgICAgICAgICAgIGMuc2V0TG9jYXRpb24oMTMwLCAxMzApOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7Ci0gICAgICAgICAgICByZW5kZXIoZywgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCksIHRydWUpOwotICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5yZWQpOwotICAgICAgICAgICAgZy5kcmF3U3RyaW5nKCJOb24tT3BhcXVlIEFXVCBGcmFtZSIsIDEwLCAxNSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUpQYW5lbCBleHRlbmRzIEpQYW5lbCB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbXBvbmVudChHcmFwaGljcyBnKSB7Ci0gICAgICAgICAgICByZW5kZXIoZywgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRnJhbWUgY3JlYXRlR3VpKEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHVzZVN3aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlU2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1c2VUcmFuc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1c2VOb25PcGFxdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgZmFjdG9yKQotICAgIHsKLSAgICAgICAgRnJhbWUgZnJhbWU7Ci0gICAgICAgIGRvbmUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoZ2MgPT0gbnVsbCkgewotICAgICAgICAgICAgZ2MgPSBHcmFwaGljc0Vudmlyb25tZW50LmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpLgotICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2VOb25PcGFxdWUpIHsKLSAgICAgICAgICAgIGlmICh1c2VTd2luZykgewotICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IE5vbk9wYXF1ZUpGcmFtZShnYyk7Ci0vLyAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBOb25PcGFxdWVKQXBwbGV0RnJhbWUoZ2MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBOb25PcGFxdWVGcmFtZShnYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbmltYXRlQ29tcG9uZW50KGZyYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmICh1c2VTd2luZykgewotICAgICAgICAgICAgZnJhbWUgPSBuZXcgSkZyYW1lKCJTd2luZyBGcmFtZSIsIGdjKTsKLSAgICAgICAgICAgIEpDb21wb25lbnQgcCA9IG5ldyBKQnV0dG9uKCJTd2luZyEiKTsKLSAgICAgICAgICAgIHAuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDIwMCwgMTAwKSk7Ci0gICAgICAgICAgICBmcmFtZS5hZGQoIk5vcnRoIiwgcCk7Ci0gICAgICAgICAgICBwID0gbmV3IE15SlBhbmVsKCk7Ci0gICAgICAgICAgICBhbmltYXRlQ29tcG9uZW50KHApOwotICAgICAgICAgICAgZnJhbWUuYWRkKCJDZW50ZXIiLCBwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZyYW1lID0gbmV3IEZyYW1lKCJBV1QgRnJhbWUiLCBnYykgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgICAgICAgICAgICAgZy5zZXRDb2xvcihDb2xvci5yZWQpOwotICAgICAgICAgICAgICAgICAgICBnLmZpbGxSZWN0KDAsIDAsIDEwMCwgMTAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgZnJhbWUuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgICAgICBDYW52YXMgYyA9IG5ldyBNeUNhbnZhcygpOwotICAgICAgICAgICAgZnJhbWUuYWRkKCJOb3J0aCIsIGMpOwotICAgICAgICAgICAgYW5pbWF0ZUNvbXBvbmVudChjKTsKLSAgICAgICAgICAgIGMgPSBuZXcgTXlDYW52YXMoKTsKLSAgICAgICAgICAgIGZyYW1lLmFkZCgiQ2VudGVyIiwgYyk7Ci0gICAgICAgICAgICBhbmltYXRlQ29tcG9uZW50KGMpOwotICAgICAgICAgICAgYyA9IG5ldyBNeUNhbnZhcygpOwotICAgICAgICAgICAgZnJhbWUuYWRkKCJTb3V0aCIsIGMpOwotICAgICAgICAgICAgYW5pbWF0ZUNvbXBvbmVudChjKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBGcmFtZSBmaW5hbEZyYW1lID0gZnJhbWU7Ci0gICAgICAgIGZyYW1lLmFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbEZyYW1lLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZyYW1lLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VDbGlja2VkKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGZpbmFsRnJhbWUuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZnJhbWUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDgwMCwgNjAwKSk7Ci0KLSAgICAgICAgaWYgKHVzZVNoYXBlKSB7Ci0gICAgICAgICAgICBmcmFtZS5zZXRVbmRlY29yYXRlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyYW1lLnNldExvY2F0aW9uKDQ1MCwgMTApOwotICAgICAgICBmcmFtZS5wYWNrKCk7Ci0KLSAgICAgICAgaWYgKHVzZVNoYXBlKSB7Ci0gICAgICAgICAgICBpZiAoQVdUVXRpbGl0aWVzLmlzVHJhbnNsdWNlbmN5U3VwcG9ydGVkKFBFUlBJWEVMX1RSQU5TUEFSRU5UKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYXBwbHlpbmcgUEVSUElYRUxfVFJBTlNQQVJFTlQiKTsKLSAgICAgICAgICAgICAgICBBV1RVdGlsaXRpZXMuc2V0V2luZG93U2hhcGUoZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFbGxpcHNlMkQuRG91YmxlKDAsIDAsIGZyYW1lLmdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmdldEhlaWdodCgpLzMpKTsKLSAgICAgICAgICAgICAgICBmcmFtZS5zZXRUaXRsZSgiUEVSUElYRUxfVFJBTlNQQVJFTlQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXNzZWQ6IFBFUlBJWEVMX1RSQU5TUEFSRU5UIHVuc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVzZVRyYW5zbCkgewotICAgICAgICAgICAgaWYgKEFXVFV0aWxpdGllcy5pc1RyYW5zbHVjZW5jeVN1cHBvcnRlZChUUkFOU0xVQ0VOVCkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFwcGx5aW5nIFRSQU5TTFVDRU5UIik7Ci0gICAgICAgICAgICAgICAgQVdUVXRpbGl0aWVzLnNldFdpbmRvd09wYWNpdHkoZnJhbWUsIGZhY3Rvcik7Ci0gICAgICAgICAgICAgICAgZnJhbWUuc2V0VGl0bGUoIlRSQU5TTFVDRU5UIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFzc2VkOiBUUkFOU0xVQ0VOVCB1bnN1cHBvcnRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh1c2VOb25PcGFxdWUpIHsKLSAgICAgICAgICAgIGlmIChBV1RVdGlsaXRpZXMuaXNUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoUEVSUElYRUxfVFJBTlNMVUNFTlQpICYmCi0gICAgICAgICAgICAgICAgQVdUVXRpbGl0aWVzLmlzVHJhbnNsdWNlbmN5Q2FwYWJsZShnYykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhcHBseWluZyBQRVJQSVhFTF9UUkFOU0xVQ0VOVCIpOwotICAgICAgICAgICAgICAgIEFXVFV0aWxpdGllcy5zZXRXaW5kb3dPcGFxdWUoZnJhbWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBmcmFtZS5zZXRUaXRsZSgiUEVSUElYRUxfVFJBTlNMVUNFTlQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXNzZWQ6IFBFUlBJWEVMX1RSQU5TTFVDRU5UIHVuc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIGZyYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wVGhyZWFkcygpIHsKLSAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhbmltYXRlQ29tcG9uZW50KGZpbmFsIENvbXBvbmVudCBjb21wKSB7Ci0gICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHt9Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAucmVwYWludCgpOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFkb25lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHQuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFRTRnJhbWUuY3JlYXRlR3VpKG51bGwsIHVzZVN3aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVRyYW5zbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VOb25PcGFxdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vYXd0L1RyYW5zbHVjZW5jeS9UcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdC9UcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdC5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9hd3QvVHJhbnNsdWNlbmN5L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjU4ZmYuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9hd3QvVHJhbnNsdWNlbmN5L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAotICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QgJUklICVFJQotICogQGJ1ZyA2NjU1MDAxIDY2NzA2NDkgNjY4NzE0MQotICogQHN1bW1hcnkgVGVzdHMgdGhhdCBodyBhY2NlbGVyYXRpb24gZG9lc24ndCBhZmZlY3QgdHJhbnNsdWNlbnQvc2hhcGVkIHdpbmRvd3MKLSAqIEBhdXRob3IgRG1pdHJpLlRyZW1ib3ZldHNraUBzdW4uY29tOiBhcmVhPUdyYXBoaWNzCi0gKiBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSBUcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdC5qYXZhCi0gKiBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSBUU0ZyYW1lLmphdmEKLSAqIEBydW4gbWFpbi9tYW51YWwvb3RoZXJ2bSBUcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdAotICogQHJ1biBtYWluL21hbnVhbC9vdGhlcnZtIC1Ec3VuLmphdmEyZC5ub2RkcmF3PXRydWUgVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QKLSAqIEBydW4gbWFpbi9tYW51YWwvb3RoZXJ2bSAtRHN1bi5qYXZhMmQub3BlbmdsPVRydWUgVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QKLSAqLwotaW1wb3J0IGNvbS5zdW4uYXd0LkFXVFV0aWxpdGllczsKLWltcG9ydCBzdGF0aWMgY29tLnN1bi5hd3QuQVdUVXRpbGl0aWVzLlRyYW5zbHVjZW5jeS4qOwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0RldmljZTsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0Vudmlyb25tZW50OwotaW1wb3J0IGphdmEuYXd0LlNoYXBlOwotaW1wb3J0IGphdmEuYXd0Lmdlb20uRWxsaXBzZTJEOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTbGlkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLlVuc3VwcG9ydGVkTG9va0FuZEZlZWxFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdCBleHRlbmRzIGphdmF4LnN3aW5nLkpGcmFtZSB7Ci0gICAgRnJhbWUgdGVzdEZyYW1lOwotICAgIHN0YXRpYyBDb3VudERvd25MYXRjaCBkb25lOwotICAgIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGZhaWxlZCA9IGZhbHNlOwotICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnY1RvVXNlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgbmV3IGZvcm0gVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QoKSB7Ci0gICAgICAgIC8vIG5vdCBuZWNlc3NhcnksIGJ1dCB3ZSBqdXN0IGxvb2sgbmljZXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChVSU1hbmFnZXIuZ2V0U3lzdGVtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KLQotICAgICAgICBpbml0Q29tcG9uZW50cygpOwotICAgICAgICBjaGVja0VmZmVjdHMoKTsKLQotICAgICAgICBTd2luZ1V0aWxpdGllcy51cGRhdGVDb21wb25lbnRUcmVlVUkodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgY29uc3RydWN0b3IgdG8KLSAgICAgKiBpbml0aWFsaXplIHRoZSBmb3JtLgotICAgICAqIFdBUk5JTkc6IERvIE5PVCBtb2RpZnkgdGhpcyBjb2RlLiBUaGUgY29udGVudCBvZiB0aGlzIG1ldGhvZCBpcwotICAgICAqIGFsd2F5cyByZWdlbmVyYXRlZCBieSB0aGUgRm9ybSBFZGl0b3IuCi0gICAgICovCi0gICAgLy8gPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT0iY29sbGFwc2VkIiBkZXNjPSIgR2VuZXJhdGVkIENvZGUgIj4vL0dFTi1CRUdJTjppbml0Q29tcG9uZW50cwotICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKLSAgICAgICAgY3JlYXRlRGlzcG9zZUdycCA9IG5ldyBqYXZheC5zd2luZy5CdXR0b25Hcm91cCgpOwotICAgICAgICBqTGFiZWwxID0gbmV3IGphdmF4LnN3aW5nLkpMYWJlbCgpOwotICAgICAgICB0cmFuc3BhcmVuY3lTbGQgPSBuZXcgamF2YXguc3dpbmcuSlNsaWRlcigpOwotICAgICAgICBzaGFwZWRDYiA9IG5ldyBqYXZheC5zd2luZy5KQ2hlY2tCb3goKTsKLSAgICAgICAgbm9uT3BhcXVlQ2hiID0gbmV3IGphdmF4LnN3aW5nLkpDaGVja0JveCgpOwotICAgICAgICBqU2Nyb2xsUGFuZTEgPSBuZXcgamF2YXguc3dpbmcuSlNjcm9sbFBhbmUoKTsKLSAgICAgICAgalRleHRBcmVhMSA9IG5ldyBqYXZheC5zd2luZy5KVGV4dEFyZWEoKTsKLSAgICAgICAgakxhYmVsMiA9IG5ldyBqYXZheC5zd2luZy5KTGFiZWwoKTsKLSAgICAgICAgcGFzc2VkQnRuID0gbmV3IGphdmF4LnN3aW5nLkpCdXR0b24oKTsKLSAgICAgICAgZmFpbGVkQnRuID0gbmV3IGphdmF4LnN3aW5nLkpCdXR0b24oKTsKLSAgICAgICAgY3JlYXRlRnJhbWVCdG4gPSBuZXcgamF2YXguc3dpbmcuSlRvZ2dsZUJ1dHRvbigpOwotICAgICAgICBkaXNwb3NlRnJhbWVCdG4gPSBuZXcgamF2YXguc3dpbmcuSlRvZ2dsZUJ1dHRvbigpOwotICAgICAgICB1c2VTd2luZ0NiID0gbmV3IGphdmF4LnN3aW5nLkpDaGVja0JveCgpOwotCi0gICAgICAgIHNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHMuRVhJVF9PTl9DTE9TRSk7Ci0gICAgICAgIHNldFRpdGxlKCJUcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdCIpOwotICAgICAgICBqTGFiZWwxLnNldFRleHQoIkZyYW1lIE9wYWNpdHk6Iik7Ci0KLSAgICAgICAgdHJhbnNwYXJlbmN5U2xkLnNldE1ham9yVGlja1NwYWNpbmcoMTApOwotICAgICAgICB0cmFuc3BhcmVuY3lTbGQuc2V0TWlub3JUaWNrU3BhY2luZyg1KTsKLSAgICAgICAgdHJhbnNwYXJlbmN5U2xkLnNldFBhaW50TGFiZWxzKHRydWUpOwotICAgICAgICB0cmFuc3BhcmVuY3lTbGQuc2V0UGFpbnRUaWNrcyh0cnVlKTsKLSAgICAgICAgdHJhbnNwYXJlbmN5U2xkLnNldFZhbHVlKDEwMCk7Ci0gICAgICAgIHRyYW5zcGFyZW5jeVNsZC5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQgZXZ0KSB7Ci0gICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5U2xkU3RhdGVDaGFuZ2VkKGV2dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNoYXBlZENiLnNldFRleHQoIlNoYXBlZCBGcmFtZSIpOwotICAgICAgICBzaGFwZWRDYi5zZXRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAwLCAwLCAwKSk7Ci0gICAgICAgIHNoYXBlZENiLnNldE1hcmdpbihuZXcgamF2YS5hd3QuSW5zZXRzKDAsIDAsIDAsIDApKTsKLSAgICAgICAgc2hhcGVkQ2IuYWRkQWN0aW9uTGlzdGVuZXIobmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIHNoYXBlZENiQWN0aW9uUGVyZm9ybWVkKGV2dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5vbk9wYXF1ZUNoYi5zZXRUZXh0KCJOb24gT3BhcXVlIEZyYW1lIik7Ci0gICAgICAgIG5vbk9wYXF1ZUNoYi5zZXRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAwLCAwLCAwKSk7Ci0gICAgICAgIG5vbk9wYXF1ZUNoYi5zZXRNYXJnaW4obmV3IGphdmEuYXd0Lkluc2V0cygwLCAwLCAwLCAwKSk7Ci0gICAgICAgIG5vbk9wYXF1ZUNoYi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgICAgICAgICAgbm9uT3BhcXVlQ2hiQWN0aW9uUGVyZm9ybWVkKGV2dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGpUZXh0QXJlYTEuc2V0Q29sdW1ucygyMCk7Ci0gICAgICAgIGpUZXh0QXJlYTEuc2V0Um93cyg1KTsKLSAgICAgICAgalRleHRBcmVhMS5zZXRUZXh0KCJDcmVhdGUgdHJhbnNsdWNlbnQgYW5kL29yIHNoYXBlZCwgb3Jcbm5vbi1vcGFxdWUgZnJhbWUuIE1ha2Ugc3VyZSBpdCBiZWhhdmVzXG5jb3JyZWN0bHkgKG5vIGFydGlmYWN0cyBsZWZ0IG9uIHRoZSBzY3JlZW5cbndoZW4gZHJhZ2dpbmcgLSBpZiBkcmFnZ2luZyBpcyBwb3NzaWJsZSkuXG5DbGljayBcIlBhc3NlZFwiIGlmIHRoZSB0ZXN0IGJlaGF2ZXMgY29ycmVjdGx5LFxuXCJGYWxpZWRcIiBvdGhlcndpc2UuIik7Ci0gICAgICAgIGpTY3JvbGxQYW5lMS5zZXRWaWV3cG9ydFZpZXcoalRleHRBcmVhMSk7Ci0KLSAgICAgICAgakxhYmVsMi5zZXRUZXh0KCJJbnN0cnVjdGlvbnM6Iik7Ci0KLSAgICAgICAgcGFzc2VkQnRuLnNldEJhY2tncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDEyOSwgMjU1LCAxMDApKTsKLSAgICAgICAgcGFzc2VkQnRuLnNldFRleHQoIlBhc3NlZCIpOwotICAgICAgICBwYXNzZWRCdG4uYWRkQWN0aW9uTGlzdGVuZXIobmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIHBhc3NlZEJ0bkFjdGlvblBlcmZvcm1lZChldnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmYWlsZWRCdG4uc2V0QmFja2dyb3VuZChqYXZhLmF3dC5Db2xvci5yZWQpOwotICAgICAgICBmYWlsZWRCdG4uc2V0VGV4dCgiRmFpbGVkIik7Ci0gICAgICAgIGZhaWxlZEJ0bi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgICAgICAgICAgZmFpbGVkQnRuQWN0aW9uUGVyZm9ybWVkKGV2dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGNyZWF0ZURpc3Bvc2VHcnAuYWRkKGNyZWF0ZUZyYW1lQnRuKTsKLSAgICAgICAgY3JlYXRlRnJhbWVCdG4uc2V0VGV4dCgiQ3JlYXRlIEZyYW1lIik7Ci0gICAgICAgIGNyZWF0ZUZyYW1lQnRuLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgICAgICAgICBjcmVhdGVGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZChldnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjcmVhdGVEaXNwb3NlR3JwLmFkZChkaXNwb3NlRnJhbWVCdG4pOwotICAgICAgICBkaXNwb3NlRnJhbWVCdG4uc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIGRpc3Bvc2VGcmFtZUJ0bi5zZXRUZXh0KCJEaXNwb3NlIEZyYW1lIik7Ci0gICAgICAgIGRpc3Bvc2VGcmFtZUJ0bi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgICAgICAgICAgZGlzcG9zZUZyYW1lQnRuQWN0aW9uUGVyZm9ybWVkKGV2dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHVzZVN3aW5nQ2Iuc2V0VGV4dCgiVXNlIEpGcmFtZSIpOwotICAgICAgICB1c2VTd2luZ0NiLnNldEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDAsIDAsIDApKTsKLSAgICAgICAgdXNlU3dpbmdDYi5zZXRNYXJnaW4obmV3IGphdmEuYXd0Lkluc2V0cygwLCAwLCAwLCAwKSk7Ci0KLSAgICAgICAgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQgbGF5b3V0ID0gbmV3IGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0KGdldENvbnRlbnRQYW5lKCkpOwotICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbEdyb3VwKAotICAgICAgICAgICAgbGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAoamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuQWxpZ25tZW50LkxFQURJTkcpCi0gICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCi0gICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpCi0gICAgICAgICAgICAgICAgLmFkZEdyb3VwKGxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LkFsaWdubWVudC5MRUFESU5HKQotICAgICAgICAgICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KHRyYW5zcGFyZW5jeVNsZCwgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLCAzNzUsIFNob3J0Lk1BWF9WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChqTGFiZWwxKQotICAgICAgICAgICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KHNoYXBlZENiKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChqYXZheC5zd2luZy5MYXlvdXRTdHlsZS5Db21wb25lbnRQbGFjZW1lbnQuUkVMQVRFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQobm9uT3BhcXVlQ2hiKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChqYXZheC5zd2luZy5MYXlvdXRTdHlsZS5Db21wb25lbnRQbGFjZW1lbnQuUkVMQVRFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQodXNlU3dpbmdDYikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoMTAyLCBTaG9ydC5NQVhfVkFMVUUpKQotICAgICAgICAgICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAoamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuQWxpZ25tZW50LkxFQURJTkcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEdyb3VwKGxheW91dC5jcmVhdGVTZXF1ZW50aWFsR3JvdXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KGpMYWJlbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAoamF2YXguc3dpbmcuTGF5b3V0U3R5bGUuQ29tcG9uZW50UGxhY2VtZW50LlJFTEFURUQsIDMxNCwgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChwYXNzZWRCdG4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAoamF2YXguc3dpbmcuTGF5b3V0U3R5bGUuQ29tcG9uZW50UGxhY2VtZW50LlJFTEFURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoZmFpbGVkQnRuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKGphdmF4LnN3aW5nLkxheW91dFN0eWxlLkNvbXBvbmVudFBsYWNlbWVudC5SRUxBVEVELCAyNDEsIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KGpTY3JvbGxQYW5lMSwgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuQWxpZ25tZW50LlRSQUlMSU5HLCBqYXZheC5zd2luZy5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIDM3NSwgU2hvcnQuTUFYX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChjcmVhdGVGcmFtZUJ0biwgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUsIDE4NywgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAoamF2YXguc3dpbmcuTGF5b3V0U3R5bGUuQ29tcG9uZW50UGxhY2VtZW50LlJFTEFURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoZGlzcG9zZUZyYW1lQnRuLCBqYXZheC5zd2luZy5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSwgMTgyLCBqYXZheC5zd2luZy5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpKSkpCi0gICAgICAgICk7Ci0gICAgICAgIGxheW91dC5zZXRWZXJ0aWNhbEdyb3VwKAotICAgICAgICAgICAgbGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAoamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuQWxpZ25tZW50LkxFQURJTkcpCi0gICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCi0gICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpCi0gICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChqTGFiZWwxKQotICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAoamF2YXguc3dpbmcuTGF5b3V0U3R5bGUuQ29tcG9uZW50UGxhY2VtZW50LlJFTEFURUQpCi0gICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudCh0cmFuc3BhcmVuY3lTbGQsIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFLCBqYXZheC5zd2luZy5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKQotICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAoamF2YXguc3dpbmcuTGF5b3V0U3R5bGUuQ29tcG9uZW50UGxhY2VtZW50LlJFTEFURUQpCi0gICAgICAgICAgICAgICAgLmFkZEdyb3VwKGxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LkFsaWdubWVudC5CQVNFTElORSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChzaGFwZWRDYikKLSAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChub25PcGFxdWVDaGIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQodXNlU3dpbmdDYikpCi0gICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChqYXZheC5zd2luZy5MYXlvdXRTdHlsZS5Db21wb25lbnRQbGFjZW1lbnQuUkVMQVRFRCkKLSAgICAgICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAoamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuQWxpZ25tZW50LkJBU0VMSU5FKQotICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KGRpc3Bvc2VGcmFtZUJ0bikKLSAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChjcmVhdGVGcmFtZUJ0bikpCi0gICAgICAgICAgICAgICAgLmFkZEdhcCgxNywgMTcsIDE3KQotICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoakxhYmVsMikKLSAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKGphdmF4LnN3aW5nLkxheW91dFN0eWxlLkNvbXBvbmVudFBsYWNlbWVudC5SRUxBVEVEKQotICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoalNjcm9sbFBhbmUxLCBqYXZheC5zd2luZy5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSwgMTQ4LCBqYXZheC5zd2luZy5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSkKLSAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKGphdmF4LnN3aW5nLkxheW91dFN0eWxlLkNvbXBvbmVudFBsYWNlbWVudC5SRUxBVEVEKQotICAgICAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChqYXZheC5zd2luZy5Hcm91cExheW91dC5BbGlnbm1lbnQuQkFTRUxJTkUpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQocGFzc2VkQnRuKQotICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KGZhaWxlZEJ0bikpCi0gICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcChqYXZheC5zd2luZy5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIFNob3J0Lk1BWF9WQUxVRSkpCi0gICAgICAgICk7Ci0gICAgICAgIHBhY2soKTsKLSAgICB9Ly8gPC9lZGl0b3ItZm9sZD4vL0dFTi1FTkQ6aW5pdENvbXBvbmVudHMKLQotICAgIHByaXZhdGUgdm9pZCBub25PcGFxdWVDaGJBY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ly9HRU4tRklSU1Q6ZXZlbnRfbm9uT3BhcXVlQ2hiQWN0aW9uUGVyZm9ybWVkCi0gICAgICAgIGlmICh0ZXN0RnJhbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUkVNSU5EOiB0aGlzIHBhdGggaW4gdGhlIHRlc3QgZG9lc24ndCB3b3JrIHdlbGwgKHRlc3QgYnVnKQotLy8gICAgICAgICAgICBBV1RVdGlsaXRpZXMuc2V0V2luZG93T3BhcXVlKHRlc3RGcmFtZSwgIW5vbk9wYXF1ZUNoYi5pc1NlbGVjdGVkKCkpOwotICAgICAgICB9Ci0gICAgfS8vR0VOLUxBU1Q6ZXZlbnRfbm9uT3BhcXVlQ2hiQWN0aW9uUGVyZm9ybWVkCi0KLSAgICBwcml2YXRlIHZvaWQgc2hhcGVkQ2JBY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ly9HRU4tRklSU1Q6ZXZlbnRfc2hhcGVkQ2JBY3Rpb25QZXJmb3JtZWQKLSAgICAgICAgaWYgKHRlc3RGcmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTaGFwZSBzID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChzaGFwZWRDYi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBzID0gbmV3IEVsbGlwc2UyRC5Eb3VibGUoMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZyYW1lLmdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGcmFtZS5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBV1RVdGlsaXRpZXMuc2V0V2luZG93U2hhcGUodGVzdEZyYW1lLCBzKTsKLSAgICAgICAgfQotICAgIH0vL0dFTi1MQVNUOmV2ZW50X3NoYXBlZENiQWN0aW9uUGVyZm9ybWVkCi0KLSAgICBwcml2YXRlIHZvaWQgdHJhbnNwYXJlbmN5U2xkU3RhdGVDaGFuZ2VkKGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50IGV2dCkgey8vR0VOLUZJUlNUOmV2ZW50X3RyYW5zcGFyZW5jeVNsZFN0YXRlQ2hhbmdlZAotICAgICAgICBKU2xpZGVyIHNvdXJjZSA9IChKU2xpZGVyKWV2dC5nZXRTb3VyY2UoKTsKLSAgICAgICAgICAgIGludCB0cmFuc2wgPSB0cmFuc3BhcmVuY3lTbGQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh0ZXN0RnJhbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFXVFV0aWxpdGllcy5zZXRXaW5kb3dPcGFjaXR5KHRlc3RGcmFtZSwgKGZsb2F0KXRyYW5zbC8xMDBmKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ly9HRU4tTEFTVDpldmVudF90cmFuc3BhcmVuY3lTbGRTdGF0ZUNoYW5nZWQKLQotICAgIHByaXZhdGUgdm9pZCBmYWlsZWRCdG5BY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ly9HRU4tRklSU1Q6ZXZlbnRfZmFpbGVkQnRuQWN0aW9uUGVyZm9ybWVkCi0gICAgICAgIGRpc3Bvc2VGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZChldnQpOwotICAgICAgICBkaXNwb3NlKCk7Ci0gICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgIGRvbmUuY291bnREb3duKCk7Ci0gICAgfS8vR0VOLUxBU1Q6ZXZlbnRfZmFpbGVkQnRuQWN0aW9uUGVyZm9ybWVkCi0KLSAgICBwcml2YXRlIHZvaWQgZGlzcG9zZUZyYW1lQnRuQWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgey8vR0VOLUZJUlNUOmV2ZW50X2Rpc3Bvc2VGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZAotICAgICAgICBUU0ZyYW1lLnN0b3BUaHJlYWRzKCk7Ci0gICAgICAgIGlmICh0ZXN0RnJhbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGVzdEZyYW1lLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHRlc3RGcmFtZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ly9HRU4tTEFTVDpldmVudF9kaXNwb3NlRnJhbWVCdG5BY3Rpb25QZXJmb3JtZWQKLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsvL0dFTi1GSVJTVDpldmVudF9jcmVhdGVGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZAotICAgICAgICBkaXNwb3NlRnJhbWVCdG5BY3Rpb25QZXJmb3JtZWQoZXZ0KTsKLSAgICAgICAgaW50IHRyYW5zbCA9IHRyYW5zcGFyZW5jeVNsZC5nZXRWYWx1ZSgpOwotICAgICAgICB0ZXN0RnJhbWUgPSBUU0ZyYW1lLmNyZWF0ZUd1aShnY1RvVXNlLAotICAgICAgICAgICAgICAgIHVzZVN3aW5nQ2IuaXNTZWxlY3RlZCgpLCBzaGFwZWRDYi5pc1NlbGVjdGVkKCksCi0gICAgICAgICAgICAgICAgKHRyYW5zbCA8IDEwMCksIG5vbk9wYXF1ZUNoYi5pc1NlbGVjdGVkKCksCi0gICAgICAgICAgICAgICAgKGZsb2F0KXRyYW5zbC8xMDBmKTsKLSAgICB9Ly9HRU4tTEFTVDpldmVudF9jcmVhdGVGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZAotCi0gICAgcHJpdmF0ZSB2b2lkIHBhc3NlZEJ0bkFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsvL0dFTi1GSVJTVDpldmVudF9wYXNzZWRCdG5BY3Rpb25QZXJmb3JtZWQKLSAgICAgICAgZGlzcG9zZUZyYW1lQnRuQWN0aW9uUGVyZm9ybWVkKGV2dCk7Ci0gICAgICAgIGRpc3Bvc2UoKTsKLSAgICAgICAgZG9uZS5jb3VudERvd24oKTsKLSAgICB9Ly9HRU4tTEFTVDpldmVudF9wYXNzZWRCdG5BY3Rpb25QZXJmb3JtZWQKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotICAgICAgICBkb25lID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBqYXZhLmF3dC5FdmVudFF1ZXVlLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBuZXcgVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QoKS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvbmUuYXdhaXQoKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHt9Ci0gICAgICAgIGlmIChmYWlsZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IEZBSUxFRCIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBQQVNTRUQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tFZmZlY3RzKCkgewotICAgICAgICBpZiAoIUFXVFV0aWxpdGllcy5pc1RyYW5zbHVjZW5jeVN1cHBvcnRlZChQRVJQSVhFTF9UUkFOU1BBUkVOVCkpIHsKLSAgICAgICAgICAgIHNoYXBlZENiLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFBV1RVdGlsaXRpZXMuaXNUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoVFJBTlNMVUNFTlQpKSB7Ci0gICAgICAgICAgICB0cmFuc3BhcmVuY3lTbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MgPSBudWxsOwotICAgICAgICBpZiAoQVdUVXRpbGl0aWVzLmlzVHJhbnNsdWNlbmN5U3VwcG9ydGVkKFBFUlBJWEVMX1RSQU5TTFVDRU5UKSkgewotICAgICAgICAgICAgZ2MgPSBmaW5kR3JhcGhpY3NDb25maWcoKTsKLSAgICAgICAgICAgIGlmIChnYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbm9uT3BhcXVlQ2hiLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZ2NUb1VzZSA9IGdjOwotICAgIH0KLQotICAgIHByaXZhdGUgR3JhcGhpY3NDb25maWd1cmF0aW9uIGZpbmRHcmFwaGljc0NvbmZpZygpIHsKLSAgICAgICAgR3JhcGhpY3NEZXZpY2UgZ2QgPQotICAgICAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudC5nZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKS4KLSAgICAgICAgICAgICAgICBnZXREZWZhdWx0U2NyZWVuRGV2aWNlKCk7Ci0gICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnY3NbXSA9IGdkLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0gICAgICAgIGZvciAoR3JhcGhpY3NDb25maWd1cmF0aW9uIGdjIDogZ2NzKSB7Ci0gICAgICAgICAgICBpZiAoQVdUVXRpbGl0aWVzLmlzVHJhbnNsdWNlbmN5Q2FwYWJsZShnYykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gVmFyaWFibGVzIGRlY2xhcmF0aW9uIC0gZG8gbm90IG1vZGlmeS8vR0VOLUJFR0lOOnZhcmlhYmxlcwotICAgIHByaXZhdGUgamF2YXguc3dpbmcuQnV0dG9uR3JvdXAgY3JlYXRlRGlzcG9zZUdycDsKLSAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpUb2dnbGVCdXR0b24gY3JlYXRlRnJhbWVCdG47Ci0gICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KVG9nZ2xlQnV0dG9uIGRpc3Bvc2VGcmFtZUJ0bjsKLSAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpCdXR0b24gZmFpbGVkQnRuOwotICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkxhYmVsIGpMYWJlbDE7Ci0gICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KTGFiZWwgakxhYmVsMjsKLSAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lIGpTY3JvbGxQYW5lMTsKLSAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpUZXh0QXJlYSBqVGV4dEFyZWExOwotICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkNoZWNrQm94IG5vbk9wYXF1ZUNoYjsKLSAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpCdXR0b24gcGFzc2VkQnRuOwotICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkNoZWNrQm94IHNoYXBlZENiOwotICAgIHByaXZhdGUgamF2YXguc3dpbmcuSlNsaWRlciB0cmFuc3BhcmVuY3lTbGQ7Ci0gICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KQ2hlY2tCb3ggdXNlU3dpbmdDYjsKLSAgICAvLyBFbmQgb2YgdmFyaWFibGVzIGRlY2xhcmF0aW9uLy9HRU4tRU5EOnZhcmlhYmxlcwotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9BLnR0ZiBiL2pkay90ZXN0L2phdmEvYXd0L0ZvbnRDbGFzcy9DcmVhdGVGb250L0EudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MGY1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9BLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9CaWdGb250LmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9CaWdGb250LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ODAyNAotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L0ZvbnRDbGFzcy9DcmVhdGVGb250L0JpZ0ZvbnQuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK2ltcG9ydCBqYXZhLmFwcGxldC4qOworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CisKK3B1YmxpYyBjbGFzcyBCaWdGb250IGV4dGVuZHMgQXBwbGV0IHsKKworICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU2l6ZWRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworICAgICAgIGludCBzaXplOworICAgICAgIGludCBjbnQgPSAwOworCisgICAgICAgU2l6ZWRJbnB1dFN0cmVhbShpbnQgc2l6ZSkgeworICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHsKKyAgICAgICAgICAgaWYgKGNudCA8IHNpemUpIHsKKyAgICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRTaXplKCkgeworICAgICAgICAgICByZXR1cm4gY250OworICAgICAgIH0KKyAgIH0KKworICAgIFN0cmluZyBpZDsKKyAgICBTdHJpbmcgZmlsZU5hbWU7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBpZCA9IGdldFBhcmFtZXRlcigibnVtYmVyIik7CisgICAgICAgIGZpbGVOYW1lID0gZ2V0UGFyYW1ldGVyKCJmb250Iik7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBcHBsZXQgIiArIGlkICsgIiAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRUaHJlYWRHcm91cCgpKTsKKyAgICAgICAgLy8gTGFyZ2VyIHRoYW4gc2l6ZSBmb3IgYSBzaW5nbGUgZm9udC4KKyAgICAgICAgaW50IGZvbnRTaXplID0gNjQgKiAxMDAwICogMTAwMDsKKyAgICAgICAgU2l6ZWRJbnB1dFN0cmVhbSBzaXMgPSBuZXcgU2l6ZWRJbnB1dFN0cmVhbShmb250U2l6ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgRm9udCBmb250ID0gRm9udC5jcmVhdGVGb250KEZvbnQuVFJVRVRZUEVfRk9OVCwgc2lzKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgRm9udEZvcm1hdEV4Y2VwdGlvbiB8fAorICAgICAgICAgICAgICAgIGZvbnRTaXplIDw9IHNpcy5nZXRDdXJyZW50U2l6ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzaXMuZ2V0Q3VycmVudFNpemUoKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbGxvd2VkIGZpbGUgdG8gYmUgdG9vIGxhcmdlLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcGFydCBvZiB0aGUgdGVzdCB3YXMgdmVyaWZpZWQgbWFudWFsbHkgYnV0CisgICAgICAgIC8vIGlzIGltcHJhY3RpY2FsIHRvIGVuYWJsZSAgYmVjYXVzZSBpdCByZXF1aXJlcyBhIGZhaXJseSBsYXJnZQorICAgICAgICAvLyB2YWxpZCBmb250IHRvIGJlIHBhcnQgb2YgdGhlIHRlc3QsIGFuZCB3ZSBjYW4ndCBlYXNpbHkgaW5jbHVkZQorICAgICAgICAvLyB0aGF0LCBub3IgZGVwZW5kYWJseSByZWZlcmVuY2Ugb25lIGZyb20gdGhlIGFwcGxldCBlbnZpcm9ubWVudC4KKyAgICAgICAgLyoKKyAgICAgICAgaWYgKGZpbGVOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9IGdldEZpbGVTaXplKGZpbGVOYW1lKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBmb250Q250ID0gMTAwMCAqIDEwMDAgKiAxMDAwIC8gc2l6ZTsKKyAgICAgICAgbG9hZE1hbnkoc2l6ZSwgZm9udENudCwgZmlsZU5hbWUpOworICAgICAgICBTeXN0ZW0uZ2MoKTsgU3lzdGVtLmdjKCk7CisgICAgICAgIGZvbnRDbnQgPSBmb250Q250IC8gMjsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBcHBsZXQgIiArIGlkICsgIiBsb2FkIG1vcmUuIik7CisgICAgICAgIGxvYWRNYW55KHNpemUsIGZvbnRDbnQsIGZpbGVOYW1lKTsKKyAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBcHBsZXQgIiArIGlkICsgIiBmaW5pc2hlZC4iKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0RmlsZVNpemUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChnZXRDb2RlQmFzZSgpLCBmaWxlTmFtZSk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGZvbnRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpblN0cmVhbSk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZm9udFN0cmVhbS5yZWFkKCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzaXplKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb250U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgIH0KKyAgICB2b2lkIGxvYWRNYW55KGludCBvbmVGb250LCBpbnQgZm9udENudCwgU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZm9udGNudD0gIiArIGZvbnRDbnQpOworICAgICAgICBGb250W10gZm9udHMgPSBuZXcgRm9udFtmb250Q250XTsKKyAgICAgICAgaW50IHRvdGFsU2l6ZSA9IDA7CisgICAgICAgIGJvb2xlYW4gZ290RXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxmb250Q250OyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoZ2V0Q29kZUJhc2UoKSwgZmlsZU5hbWUpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGZvbnRTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpblN0cmVhbSk7CisgICAgICAgICAgICAgICAgZm9udHNbaV0gPSBGb250LmNyZWF0ZUZvbnQoRm9udC5UUlVFVFlQRV9GT05ULCBmb250U3RyZWFtKTsKKyAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gb25lRm9udDsKKyAgICAgICAgICAgICAgICBmb250U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBcHBsZXQgIiArIGlkICsgIiAiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnb3RFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L0ZvbnRDbGFzcy9DcmVhdGVGb250L0RlbGV0ZUZvbnQuamF2YSBiL2pkay90ZXN0L2phdmEvYXd0L0ZvbnRDbGFzcy9DcmVhdGVGb250L0RlbGV0ZUZvbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFiMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS9hd3QvRm9udENsYXNzL0NyZWF0ZUZvbnQvRGVsZXRlRm9udC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5hd3QuKjsKKworcHVibGljIGNsYXNzIERlbGV0ZUZvbnQgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGZvbnQgPSAiQS50dGYiOworICAgICAgICBTdHJpbmcgc2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOworICAgICAgICBTdHJpbmcgdGVzdFNyYyA9IFN5c3RlbS5nZXRlbnYoIlRFU1RTUkMiKTsKKyAgICAgICAgaWYgKHRlc3RTcmMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9udCA9IHRlc3RTcmMgKyBzZXAgKyBmb250OworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgZm9udCBmaWxlOiAiICsgZm9udCk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZvbnQpOworICAgICAgICBGb250IGYgPSBGb250LmNyZWF0ZUZvbnQoRm9udC5UUlVFVFlQRV9GT05ULCBmaXMpOworICAgICAgICBmLnRvU3RyaW5nKCk7CisgICAgICAgIGYuZGVyaXZlRm9udChGb250LkJPTEQpOworICAgICAgICBmLmNhbkRpc3BsYXkoJ1gnKTsKKworICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGJvb2xlYW4gZ290RXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgIEZvbnQuY3JlYXRlRm9udChqYXZhLmF3dC5Gb250LlRSVUVUWVBFX0ZPTlQsIGluKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdvdEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIGV4cGVjdGVkIElPRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgYmFkUmVhZCgtMiwgRm9udC5UUlVFVFlQRV9GT05UKTsKKyAgICAgICAgYmFkUmVhZCg4MTkzLCBGb250LlRSVUVUWVBFX0ZPTlQpOworCisgICAgICAgIGJhZFJlYWQoLTIsIEZvbnQuVFlQRTFfRk9OVCk7CisgICAgICAgIGJhZFJlYWQoODE5MywgRm9udC5UWVBFMV9GT05UKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgR0MgaGFzIGEgY2hhbmNlIHRvIGNsZWFuIHVwIGJlZm9yZSB3ZSBleGl0LgorICAgICAgICBTeXN0ZW0uZ2MoKTsgU3lzdGVtLmdjKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgYmFkUmVhZChmaW5hbCBpbnQgcmV0dmFsLCBpbnQgZm9udFR5cGUpIHsKKyAgICAgICAgaW50IG51bSA9IDI7CisgICAgICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMTYqODE5Ml07IC8vIE11bHRpcGxlIG9mIDgxOTIgaXMgaW1wb3J0YW50LgorICAgICAgICBmb3IgKGludCBjdD0wOyBjdDxudW07ICsrY3QpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRm9udC5jcmVhdGVGb250KAorICAgICAgICAgICAgICAgICAgICBmb250VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlYWQgPSBzdXBlci5yZWFkKGJ1ZmYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZDwwID8gcmV0dmFsIDogcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXhjKSB7CisgICAgICAgICAgICAgICAgLy9leGMucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L0ZvbnRDbGFzcy9DcmVhdGVGb250L0RlbGV0ZUZvbnQuc2ggYi9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9EZWxldGVGb250LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjczODAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9EZWxldGVGb250LnNoCkBAIC0wLDAgKzEsNjYgQEAKKyMgQ29weXJpZ2h0IDIwMDQtMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorCisjIEB0ZXN0CisjIEBidWcgNjE4OTgxMiA2MzgwMzU3IDY2MzI4ODYKKyMgQHN1bW1hcnkgVmVyaWZ5IHRoYXQgdGVtcG9yYXJ5IGZvbnQgZmlsZXMgYXJlIGRlbGV0ZWQgb24gZXhpdC4KKworaWYgWyAteiAiJHtURVNUU1JDfSIgXTsgdGhlbgorICBlY2hvICJURVNUU1JDIHVuZGVmaW5lZDogZGVmYXVsdGluZyB0byAuIgorICBURVNUU1JDPS4KK2ZpCisKK2lmIFsgLXogIiR7VEVTVENMQVNTRVN9IiBdOyB0aGVuCisgIGVjaG8gIlRFU1RDTEFTU0VTIHVuZGVmaW5lZDogZGVmYXVsdGluZyB0byAuIgorICBURVNUQ0xBU1NFUz0uCitmaQorCitpZiBbIC16ICIke1RFU1RKQVZBfSIgXTsgdGhlbgorICBlY2hvICJURVNUSkFWQSB1bmRlZmluZWQ6IGNhbid0IGNvbnRpbnVlLiIKKyAgZXhpdCAxCitmaQorCitlY2hvICJURVNUSkFWQT0ke1RFU1RKQVZBfSIKK2VjaG8gIlRFU1RTUkM9JHtURVNUU1JDfSIKK2VjaG8gIlRFU1RDTEFTU0VTPSR7VEVTVENMQVNTRVN9IgorY2QgJHtURVNUU1JDfQorJHtURVNUSkFWQX0vYmluL2phdmFjIC1kICR7VEVTVENMQVNTRVN9IERlbGV0ZUZvbnQuamF2YQorCitjZCAke1RFU1RDTEFTU0VTfQorCitudW1maWxlczA9YGxzICR7VEVTVENMQVNTRVN9IHwgd2MgLWxgCiske1RFU1RKQVZBfS9iaW4vamF2YSAtRGphdmEuaW8udG1wZGlyPSR7VEVTVENMQVNTRVN9IERlbGV0ZUZvbnQKKworaWYgWyAkPyAtbmUgMCBdCisgICAgdGhlbgorICAgICAgZWNobyAiVGVzdCBmYWlsczogZXhjZXB0aW9uIHRocm93biEiCisgICAgICBleGl0IDEKK2ZpCisKK251bWZpbGVzMT1gbHMgJHtURVNUQ0xBU1NFU30gfCB3YyAtbGAKKworaWYgWyAkbnVtZmlsZXMwIC1uZSAkbnVtZmlsZXMxIF0KKyAgICB0aGVuCisgICAgICBlY2hvICJUZXN0IGZhaWxzOiB0bXAgZmlsZSBleGlzdHMhIgorICAgICAgbHMgJHtURVNUQ0xBU1NFU30KKyAgICAgIGV4aXQgMQorZmkKK2V4aXQgMApkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvRm9udENsYXNzL0NyZWF0ZUZvbnQvYmlnZm9udC5odG1sIGIvamRrL3Rlc3QvamF2YS9hd3QvRm9udENsYXNzL0NyZWF0ZUZvbnQvYmlnZm9udC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyM2M2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9iaWdmb250Lmh0bWwKQEAgLTAsMCArMSw0OCBAQAorPCEtLQorCisgQ29weXJpZ2h0IDIwMDggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisKKyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgaGF2ZSBhbnkgcXVlc3Rpb25zLgorCisgIEB0ZXN0CisgIEBidWcgNjUyMjU4NgorICBAcnVuIGFwcGxldCBiaWdmb250Lmh0bWwKKyAgQHN1bW1hcnkgRW5mb3JjZSBsaW1pdHMgb24gZm9udCBjcmVhdGlvbgorCistLT4KKworPGh0bWw+CisgIDxoZWFkPgorICAgICAgPHRpdGxlPlRlc3QgRm9udCBDcmVhdGlvbiBMaW1pdHM8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorPGhyPgorPEFQUExFVCBDT0RFID0gQmlnRm9udC5jbGFzcyBXSURUSCA9IDEwMCBIRUlHSFQgPSAxMDAgPgorPHBhcmFtIG5hbWU9Im51bWJlciIgdmFsdWU9IjEiPgorPHBhcmFtIG5hbWU9ImZvbnQiIHZhbHVlPSJBLnR0ZiI+Cis8L0FQUExFVD4KKzxBUFBMRVQgQ09ERSA9IEJpZ0ZvbnQuY2xhc3MgV0lEVEggPSAxMDAgSEVJR0hUID0gMTAwPgorPHBhcmFtIG5hbWU9Im51bWJlciIgdmFsdWU9IjIiPgorPHBhcmFtIG5hbWU9ImZvbnQiIHZhbHVlPSJBLnR0ZiI+Cis8L0FQUExFVD4KKzxocj4KKyAgPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9maWxlYWNjZXNzL0ZvbnRGaWxlLmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9Gb250Q2xhc3MvQ3JlYXRlRm9udC9maWxlYWNjZXNzL0ZvbnRGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0MTk3NAotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L0ZvbnRDbGFzcy9DcmVhdGVGb250L2ZpbGVhY2Nlc3MvRm9udEZpbGUuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIEB0ZXN0CisgKiBAYnVnIDY2NTI5MjkKKyAqIEBzdW1tYXJ5IHZlcmlmeSBoYW5kbGluZyBvZiBGaWxlLmdldFBhdGgoKQorICovCisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuaW8uKjsKKworcHVibGljIGNsYXNzIEZvbnRGaWxlIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nIGZuYW1lID0gIi4uIiArIHNlcCArICJBLnR0ZiI7CisgICAgICAgIFN0cmluZyBkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIik7CisgICAgICAgIGlmIChkaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZm5hbWUgPSBkaXIgKyBzZXAgKyBmbmFtZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGZuYW1lOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGwgdHJ5IHRvIGFjY2VzcyAiICsgbmFtZSk7CisgICAgICAgIGlmICghKG5ldyBGaWxlKG5hbWUpKS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBhdmFpbGFibGUgOiBjYW4ndCBydW4gdGVzdCIpOworICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIGlzIGF2YWlsYWJsZS4gVmVyaWZ5IG5vIGFjY2VzcyB1bmRlciBTTSIpOworCisgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IFNlY3VyaXR5TWFuYWdlcigpKTsKKworCisgICAgICAgIC8vIENoZWNrIGNhbm5vdCByZWFkIGZpbGUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKG5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTb21ldGhpbmcgd3Jvbmcgd2l0aCB0ZXN0IGVudmlyb25tZW50Iik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgLy8gR29vZC4KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGb250IGZvbnQgPSBGb250LmNyZWF0ZUZvbnQoRm9udC5UUlVFVFlQRV9GT05ULAorICAgICAgICAgICAgbmV3IEZpbGUoIm5vc3VjaGZpbGUiKSB7CisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZWFkOworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzb21lZmlsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGNhblJlYWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZm9udC5nZXRGb250TmFtZSgpKTsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgICAgIH0gIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUZXN0IHBhc3NlZC4iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L01peGluZy9NaXhpbmdJbkh3UGFuZWwuamF2YSBiL2pkay90ZXN0L2phdmEvYXd0L01peGluZy9NaXhpbmdJbkh3UGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWZlN2JlCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS9hd3QvTWl4aW5nL01peGluZ0luSHdQYW5lbC5qYXZhCkBAIC0wLDAgKzEsNDI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAgQHRlc3QgJVclICVFJQorICBAYnVnIDY4Mjk4NTgKKyAgQHN1bW1hcnkgTWl4aW5nIHNob3VsZCB3b3JrIGluc2lkZSBoZWF2eXdlaWdodCBjb250YWluZXJzCisgIEBhdXRob3IgYW50aG9ueS5wZXRyb3ZAc3VuLmNvbTogYXJlYT1hd3QubWl4aW5nCisgIEBsaWJyYXJ5IC4uL3JlZ3Rlc3RoZWxwZXJzCisgIEBidWlsZCBVdGlsCisgIEBydW4gbWFpbiBNaXhpbmdJbkh3UGFuZWwKKyovCisKKworLyoqCisgKiBNaXhpbmdJbkh3UGFuZWwuamF2YQorICoKKyAqIHN1bW1hcnk6IE1peGluZyBzaG91bGQgd29yayBpbnNpZGUgaGVhdnl3ZWlnaHQgY29udGFpbmVycworICovCisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCB0ZXN0LmphdmEuYXd0LnJlZ3Rlc3RoZWxwZXJzLlV0aWw7CisKKworCitwdWJsaWMgY2xhc3MgTWl4aW5nSW5Id1BhbmVsCit7CisgICAgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZmFpbGVkID0gdHJ1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgICAvLyoqKiBDcmVhdGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgdXNlciBoZXJlICoqKgorCisgICAgICAgIFN0cmluZ1tdIGluc3RydWN0aW9ucyA9CisgICAgICAgIHsKKyAgICAgICAgICAgICJUaGlzIGlzIGFuIEFVVE9NQVRJQyB0ZXN0LCBzaW1wbHkgd2FpdCB1bnRpbCBpdCBpcyBkb25lLiIsCisgICAgICAgICAgICAiVGhlIHJlc3VsdCAocGFzc2VkIG9yIGZhaWxlZCkgd2lsbCBiZSBzaG93biBpbiB0aGUiLAorICAgICAgICAgICAgIm1lc3NhZ2Ugd2luZG93IGJlbG93LiIKKyAgICAgICAgfTsKKyAgICAgICAgU3lzb3V0LmNyZWF0ZURpYWxvZyggKTsKKyAgICAgICAgU3lzb3V0LnByaW50SW5zdHJ1Y3Rpb25zKCBpbnN0cnVjdGlvbnMgKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudHM6IGZyYW1lIC0+IGh3UGFuZWwgLT4gSkRlc2t0b3BQYW5lIC0+CisgICAgICAgIC8vICAgIC0+IEpJbnRlcm5hbEZyYW1lIC0+IGh3QnV0dG9uCisgICAgICAgIEZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKCJNaXhpbmcgaW4gYSBoZWF2eXdlaWdodCBQYW5lbCIpOworICAgICAgICBmcmFtZS5zZXRCb3VuZHMoMTAwLCAxMDAsIDY0MCwgNDgwKTsKKworICAgICAgICBQYW5lbCBod1BhbmVsID0gbmV3IFBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGZyYW1lLmFkZChod1BhbmVsKTsKKworICAgICAgICBKRGVza3RvcFBhbmUgZGVza3RvcCA9IG5ldyBKRGVza3RvcFBhbmUoKTsKKyAgICAgICAgaHdQYW5lbC5hZGQoZGVza3RvcCk7CisKKyAgICAgICAgSkludGVybmFsRnJhbWUgaUZyYW1lID0gbmV3IEpJbnRlcm5hbEZyYW1lKCJvbmUiLAorICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICBpRnJhbWUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDE1MCwgNTUpKTsKKyAgICAgICAgaUZyYW1lLnNldEJvdW5kcyg2MDAsIDEwMCwgMTUwLCA1NSk7CisgICAgICAgIGlGcmFtZS5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICBkZXNrdG9wLmFkZChpRnJhbWUpOworCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCJIVyBCdXR0b24iKTsKKyAgICAgICAgYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBpRnJhbWUuYWRkKGJ1dHRvbik7CisKKyAgICAgICAgLy8gU2hvdyB0aGUgZnJhbWUgd2l0aCB0aGUgaHdCdXR0b24gc2xpZ2h0bHkgaGlkZGVuIGluaXRpYWxseQorICAgICAgICBmcmFtZS5zZXRWaXNpYmxlKHRydWUpOworCisgICAgICAgIFJvYm90IHJvYm90ID0gVXRpbC5jcmVhdGVSb2JvdCgpOworICAgICAgICByb2JvdC5zZXRBdXRvRGVsYXkoMjApOworCisgICAgICAgIFV0aWwud2FpdEZvcklkbGUocm9ib3QpOworCisgICAgICAgIC8vIE5vdyByZXNpemUgdGhlIGZyYW1lIHNvIHRoYXQgdGhlIGJ1dHRvbiBpcyBmdWxseSB2aXNpYmxlCisgICAgICAgIGZyYW1lLnNldEJvdW5kcygxMDAsIDEwMCwgODAwLCA0ODApOworICAgICAgICBmcmFtZS52YWxpZGF0ZSgpOworCisgICAgICAgIFV0aWwud2FpdEZvcklkbGUocm9ib3QpOworCisgICAgICAgIC8vIEFuZCBjbGljayB0aGUgcGFydCBvZiB0aGUgYnV0dG9uIHRoYXQgaGFzIGJlZW4gcHJldmlvdXNseSBoaWRkZW4KKyAgICAgICAgUG9pbnQgYkxvYyA9IGJ1dHRvbi5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7CisgICAgICAgIHJvYm90Lm1vdXNlTW92ZShiTG9jLnggKyBidXR0b24uZ2V0V2lkdGgoKSAtIDYsIGJMb2MueSArIGJ1dHRvbi5nZXRIZWlnaHQoKSAvIDIpOworCisgICAgICAgIFV0aWwud2FpdEZvcklkbGUocm9ib3QpOworCisgICAgICAgIHJvYm90Lm1vdXNlUHJlc3MoSW5wdXRFdmVudC5CVVRUT04xX01BU0spOworICAgICAgICByb2JvdC5tb3VzZVJlbGVhc2UoSW5wdXRFdmVudC5CVVRUT04xX01BU0spOworCisgICAgICAgIFV0aWwud2FpdEZvcklkbGUocm9ib3QpOworCisgICAgICAgIC8vIElmIHRoZSBjbGljayBoYXBwZW5zICh0aGUgc2hhcGUgaXMgcmVhcHBsaWVkKSwgdGhlIGJ1dHRvbidzIGFjdGlvbgorICAgICAgICAvLyBsaXN0ZW5lciB3aWxsIG1ha2UgZmFpbGVkID09IGZhbHNlLgorICAgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgICAgICBNaXhpbmdJbkh3UGFuZWwuZmFpbCgiVGhlIEhXIGJ1dHRvbiBkaWQgbm90IHJlY2VpdmUgdGhlIGNsaWNrLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWl4aW5nSW5Id1BhbmVsLnBhc3MoKTsKKyAgICAgICAgfQorICAgIH0vL0VuZCAgaW5pdCgpCisKKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogU3RhbmRhcmQgVGVzdCBNYWNoaW5lcnkgU2VjdGlvbgorICAgICAqIERPIE5PVCBtb2RpZnkgYW55dGhpbmcgaW4gdGhpcyBzZWN0aW9uIC0tIGl0J3MgYQorICAgICAqIHN0YW5kYXJkIGNodW5rIG9mIGNvZGUgd2hpY2ggaGFzIGFsbCBvZiB0aGUKKyAgICAgKiBzeW5jaHJvbmlzYXRpb24gbmVjZXNzYXJ5IGZvciB0aGUgdGVzdCBoYXJuZXNzLgorICAgICAqIEJ5IGtlZXBpbmcgaXQgdGhlIHNhbWUgaW4gYWxsIHRlc3RzLCBpdCBpcyBlYXNpZXIKKyAgICAgKiB0byByZWFkIGFuZCB1bmRlcnN0YW5kIHNvbWVvbmUgZWxzZSdzIHRlc3QsIGFzCisgICAgICogd2VsbCBhcyBpbnN1cmluZyB0aGF0IGFsbCB0ZXN0cyBiZWhhdmUgY29ycmVjdGx5CisgICAgICogd2l0aCB0aGUgdGVzdCBoYXJuZXNzLgorICAgICAqIFRoZXJlIGlzIGEgc2VjdGlvbiBmb2xsb3dpbmcgdGhpcyBmb3IgdGVzdC0KKyAgICAgKiBjbGFzc2VzCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRoZVRlc3RQYXNzZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRlc3RHZW5lcmF0ZWRJbnRlcnJ1cHQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmFpbHVyZU1lc3NhZ2UgPSAiIjsKKworICAgIHByaXZhdGUgc3RhdGljIFRocmVhZCBtYWluVGhyZWFkID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBzbGVlcFRpbWUgPSAzMDAwMDA7CisKKyAgICAvLyBOb3Qgc3VyZSBhYm91dCB3aGF0IGhhcHBlbnMgaWYgbXVsdGlwbGUgb2YgdGhpcyB0ZXN0IGFyZQorICAgIC8vICBpbnN0YW50aWF0ZWQgaW4gdGhlIHNhbWUgVk0uICBCZWluZyBzdGF0aWMgKGFuZCB1c2luZworICAgIC8vICBzdGF0aWMgdmFycyksIGl0IGFpbnQgZ29ubmEgd29yay4gIE5vdCB3b3JyeWluZyBhYm91dAorICAgIC8vICBpdCBmb3Igbm93LgorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmcgYXJnc1tdICkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBtYWluVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggVGVzdFBhc3NlZEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9UaGUgdGVzdCBwYXNzZWQsIHNvIGp1c3QgcmV0dXJuIGZyb20gbWFpbiBhbmQgaGFybmVzcyB3aWxsCisgICAgICAgICAgICAvLyBpbnRlcmVwcmV0IHRoaXMgcmV0dXJuIGFzIGEgcGFzcworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vQXQgdGhpcyBwb2ludCwgbmVpdGhlciB0ZXN0IHBhc3Mgbm9yIHRlc3QgZmFpbCBoYXMgYmVlbgorICAgICAgICAvLyBjYWxsZWQgLS0gZWl0aGVyIHdvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiBhbmQgZW5kZWQgdGhlCisgICAgICAgIC8vIHRlc3QsIHNvIHdlIGtub3cgd2UgaGF2ZSBtdWx0aXBsZSB0aHJlYWRzLgorCisgICAgICAgIC8vVGVzdCBpbnZvbHZlcyBvdGhlciB0aHJlYWRzLCBzbyBzbGVlcCBhbmQgd2FpdCBmb3IgdGhlbSB0bworICAgICAgICAvLyBjYWxsZWQgcGFzcygpIG9yIGZhaWwoKQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKCBzbGVlcFRpbWUgKTsKKyAgICAgICAgICAgIC8vVGltZWQgb3V0LCBzbyBmYWlsIHRoZSB0ZXN0CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlRpbWVkIG91dCBhZnRlciAiICsgc2xlZXBUaW1lLzEwMDAgKyAiIHNlY29uZHMiICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVGhlIHRlc3QgaGFybmVzcyBtYXkgaGF2ZSBpbnRlcnJ1cHRlZCB0aGUgdGVzdC4gIElmIHNvLCByZXRocm93IHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGhhcm5lc3MgZ2V0cyBpdCBhbmQgZGVhbHMgd2l0aCBpdC4KKyAgICAgICAgICAgIGlmKCAhIHRlc3RHZW5lcmF0ZWRJbnRlcnJ1cHQgKSB0aHJvdyBlOworCisgICAgICAgICAgICAvL3Jlc2V0IGZsYWcgaW4gY2FzZSBoaXQgdGhpcyBjb2RlIG1vcmUgdGhhbiBvbmNlIGZvciBzb21lIHJlYXNvbiAoanVzdCBzYWZldHkpCisgICAgICAgICAgICB0ZXN0R2VuZXJhdGVkSW50ZXJydXB0ID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICggdGhlVGVzdFBhc3NlZCA9PSBmYWxzZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGZhaWx1cmVNZXNzYWdlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0vL21haW4KKworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0VGltZW91dFRvKCBpbnQgc2Vjb25kcyApCisgICAgeworICAgICAgICBzbGVlcFRpbWUgPSBzZWNvbmRzICogMTAwMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHBhc3MoKQorICAgIHsKKyAgICAgICAgU3lzb3V0LnByaW50bG4oICJUaGUgdGVzdCBwYXNzZWQuIiApOworICAgICAgICBTeXNvdXQucHJpbnRsbiggIlRoZSB0ZXN0IGlzIG92ZXIsIGhpdCAgQ3RsLUMgdG8gc3RvcCBKYXZhIFZNIiApOworICAgICAgICAvL2ZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgZXhlY3V0aW5nIGluIG1haW4gdGhyZWFkCisgICAgICAgIGlmICggbWFpblRocmVhZCA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TdGlsbCBpbiB0aGUgbWFpbiB0aHJlYWQsIHNvIHNldCB0aGUgZmxhZyBqdXN0IGZvciBraWNrcywKKyAgICAgICAgICAgIC8vIGFuZCB0aHJvdyBhIHRlc3QgcGFzc2VkIGV4Y2VwdGlvbiB3aGljaCB3aWxsIGJlIGNhdWdodAorICAgICAgICAgICAgLy8gYW5kIGVuZCB0aGUgdGVzdC4KKyAgICAgICAgICAgIHRoZVRlc3RQYXNzZWQgPSB0cnVlOworICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RQYXNzZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGVUZXN0UGFzc2VkID0gdHJ1ZTsKKyAgICAgICAgdGVzdEdlbmVyYXRlZEludGVycnVwdCA9IHRydWU7CisgICAgICAgIG1haW5UaHJlYWQuaW50ZXJydXB0KCk7CisgICAgfS8vcGFzcygpCisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGZhaWwoKQorICAgIHsKKyAgICAgICAgLy90ZXN0IHdyaXRlciBkaWRuJ3Qgc3BlY2lmeSB3aHkgdGVzdCBmYWlsZWQsIHNvIGdpdmUgZ2VuZXJpYworICAgICAgICBmYWlsKCAiaXQganVzdCBwbGFpbiBmYWlsZWQhIDotKSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGZhaWwoIFN0cmluZyB3aHlGYWlsZWQgKQorICAgIHsKKyAgICAgICAgU3lzb3V0LnByaW50bG4oICJUaGUgdGVzdCBmYWlsZWQ6ICIgKyB3aHlGYWlsZWQgKTsKKyAgICAgICAgU3lzb3V0LnByaW50bG4oICJUaGUgdGVzdCBpcyBvdmVyLCBoaXQgIEN0bC1DIHRvIHN0b3AgSmF2YSBWTSIgKTsKKyAgICAgICAgLy9jaGVjayBpZiB0aGlzIGNhbGxlZCBmcm9tIG1haW4gdGhyZWFkCisgICAgICAgIGlmICggbWFpblRocmVhZCA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9JZiBtYWluIHRocmVhZCwgZmFpbCBub3cgJ2NhdXNlIG5vdCBzbGVlcGluZworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIHdoeUZhaWxlZCApOworICAgICAgICB9CisgICAgICAgIHRoZVRlc3RQYXNzZWQgPSBmYWxzZTsKKyAgICAgICAgdGVzdEdlbmVyYXRlZEludGVycnVwdCA9IHRydWU7CisgICAgICAgIGZhaWx1cmVNZXNzYWdlID0gd2h5RmFpbGVkOworICAgICAgICBtYWluVGhyZWFkLmludGVycnVwdCgpOworICAgIH0vL2ZhaWwoKQorCit9Ly8gY2xhc3MgTWl4aW5nSW5Id1BhbmVsCisKKy8vVGhpcyBleGNlcHRpb24gaXMgdXNlZCB0byBleGl0IGZyb20gYW55IGxldmVsIG9mIGNhbGwgbmVzdGluZworLy8gd2hlbiBpdCdzIGRldGVybWluZWQgdGhhdCB0aGUgdGVzdCBoYXMgcGFzc2VkLCBhbmQgaW1tZWRpYXRlbHkKKy8vIGVuZCB0aGUgdGVzdC4KK2NsYXNzIFRlc3RQYXNzZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCit7Cit9CisKKy8vKioqKioqKioqKiogRW5kIFN0YW5kYXJkIFRlc3QgTWFjaGluZXJ5IFNlY3Rpb24gKioqKioqKioqKgorCisKKy8vKioqKioqKioqKioqIEJlZ2luIGNsYXNzZXMgZGVmaW5lZCBmb3IgdGhlIHRlc3QgKioqKioqKioqKioqKioqKgorCisvLyBpZiB3YW50IHRvIG1ha2UgbGlzdGVuZXJzLCBoZXJlIGlzIHRoZSByZWNvbW1lbmRlZCBwbGFjZSBmb3IgdGhlbSwgdGhlbiBpbnN0YW50aWF0ZQorLy8gIHRoZW0gaW4gaW5pdCgpCisKKy8qIEV4YW1wbGUgb2YgYSBjbGFzcyB3aGljaCBtYXkgYmUgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgdGVzdAorY2xhc3MgTmV3Q2xhc3MgaW1wbGVtZW50cyBhbkludGVyZmFjZQorIHsKKyAgIHN0YXRpYyBpbnQgbmV3VmFyID0gMDsKKworICAgcHVibGljIHZvaWQgZXZlbnREaXNwYXRjaGVkKEFXVEV2ZW50IGUpCisgICAgeworICAgICAgLy9Db3VudGluZyBldmVudHMgdG8gc2VlIGlmIHdlIGdldCBlbm91Z2gKKyAgICAgIGV2ZW50Q291bnQrKzsKKworICAgICAgaWYoIGV2ZW50Q291bnQgPT0gMjAgKQorICAgICAgIHsKKyAgICAgICAgIC8vZ290IGVub3VnaCBldmVudHMsIHNvIHBhc3MKKworICAgICAgICAgTWl4aW5nSW5Id1BhbmVsLnBhc3MoKTsKKyAgICAgICB9CisgICAgICBlbHNlIGlmKCB0cmllcyA9PSAyMCApCisgICAgICAgeworICAgICAgICAgLy90cmllZCB0b28gbWFueSB0aW1lcyB3aXRob3V0IGdldHRpbmcgZW5vdWdoIGV2ZW50cyBzbyBmYWlsCisKKyAgICAgICAgIE1peGluZ0luSHdQYW5lbC5mYWlsKCk7CisgICAgICAgfQorCisgICAgfS8vIGV2ZW50RGlzcGF0Y2hlZCgpCisKKyB9Ly8gTmV3Q2xhc3MgY2xhc3MKKworKi8KKworCisvLyoqKioqKioqKioqKioqIEVuZCBjbGFzc2VzIGRlZmluZWQgZm9yIHRoZSB0ZXN0ICoqKioqKioqKioqKioqKioqKioKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBTdGFuZGFyZCBUZXN0IE1hY2hpbmVyeQorIERPIE5PVCBtb2RpZnkgYW55dGhpbmcgYmVsb3cgLS0gaXQncyBhIHN0YW5kYXJkCisgIGNodW5rIG9mIGNvZGUgd2hvc2UgcHVycG9zZSBpcyB0byBtYWtlIHVzZXIKKyAgaW50ZXJhY3Rpb24gdW5pZm9ybSwgYW5kIHRoZXJlYnkgbWFrZSBpdCBzaW1wbGVyCisgIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQgc29tZW9uZSBlbHNlJ3MgdGVzdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyBUaGlzIGlzIHBhcnQgb2YgdGhlIHN0YW5kYXJkIHRlc3QgbWFjaGluZXJ5LgorIEl0IGNyZWF0ZXMgYSBkaWFsb2cgKHdpdGggdGhlIGluc3RydWN0aW9ucyksIGFuZCBpcyB0aGUgaW50ZXJmYWNlCisgIGZvciBzZW5kaW5nIHRleHQgbWVzc2FnZXMgdG8gdGhlIHVzZXIuCisgVG8gcHJpbnQgdGhlIGluc3RydWN0aW9ucywgc2VuZCBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIFN5c291dC5jcmVhdGVEaWFsb2cKKyAgV2l0aEluc3RydWN0aW9ucyBtZXRob2QuICBQdXQgb25lIGxpbmUgb2YgaW5zdHJ1Y3Rpb25zIHBlciBhcnJheSBlbnRyeS4KKyBUbyBkaXNwbGF5IGEgbWVzc2FnZSBmb3IgdGhlIHRlc3RlciB0byBzZWUsIHNpbXBseSBjYWxsIFN5c291dC5wcmludGxuCisgIHdpdGggdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuCisgVGhpcyBtaW1pY3MgU3lzdGVtLm91dC5wcmludGxuIGJ1dCB3b3JrcyB3aXRoaW4gdGhlIHRlc3QgaGFybmVzcyBhcyB3ZWxsCisgIGFzIHN0YW5kYWxvbmUuCisgKi8KKworY2xhc3MgU3lzb3V0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgVGVzdERpYWxvZyBkaWFsb2c7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRGlhbG9nV2l0aEluc3RydWN0aW9ucyggU3RyaW5nW10gaW5zdHJ1Y3Rpb25zICkKKyAgICB7CisgICAgICAgIGRpYWxvZyA9IG5ldyBUZXN0RGlhbG9nKCBuZXcgRnJhbWUoKSwgIkluc3RydWN0aW9ucyIgKTsKKyAgICAgICAgZGlhbG9nLnByaW50SW5zdHJ1Y3Rpb25zKCBpbnN0cnVjdGlvbnMgKTsKKyAgICAgICAgZGlhbG9nLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgIHByaW50bG4oICJBbnkgbWVzc2FnZXMgZm9yIHRoZSB0ZXN0ZXIgd2lsbCBkaXNwbGF5IGhlcmUuIiApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVEaWFsb2coICkKKyAgICB7CisgICAgICAgIGRpYWxvZyA9IG5ldyBUZXN0RGlhbG9nKCBuZXcgRnJhbWUoKSwgIkluc3RydWN0aW9ucyIgKTsKKyAgICAgICAgU3RyaW5nW10gZGVmSW5zdHIgPSB7ICJJbnN0cnVjdGlvbnMgd2lsbCBhcHBlYXIgaGVyZS4gIiwgIiIgfSA7CisgICAgICAgIGRpYWxvZy5wcmludEluc3RydWN0aW9ucyggZGVmSW5zdHIgKTsKKyAgICAgICAgZGlhbG9nLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgIHByaW50bG4oICJBbnkgbWVzc2FnZXMgZm9yIHRoZSB0ZXN0ZXIgd2lsbCBkaXNwbGF5IGhlcmUuIiApOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50SW5zdHJ1Y3Rpb25zKCBTdHJpbmdbXSBpbnN0cnVjdGlvbnMgKQorICAgIHsKKyAgICAgICAgZGlhbG9nLnByaW50SW5zdHJ1Y3Rpb25zKCBpbnN0cnVjdGlvbnMgKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludGxuKCBTdHJpbmcgbWVzc2FnZUluICkKKyAgICB7CisgICAgICAgIGRpYWxvZy5kaXNwbGF5TWVzc2FnZSggbWVzc2FnZUluICk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlSW4pOworICAgIH0KKworfS8vIFN5c291dCAgY2xhc3MKKworLyoqCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgc3RhbmRhcmQgdGVzdCBtYWNoaW5lcnkuICBJdCBwcm92aWRlcyBhIHBsYWNlIGZvciB0aGUKKyAgIHRlc3QgaW5zdHJ1Y3Rpb25zIHRvIGJlIGRpc3BsYXllZCwgYW5kIGEgcGxhY2UgZm9yIGludGVyYWN0aXZlIG1lc3NhZ2VzCisgICB0byB0aGUgdXNlciB0byBiZSBkaXNwbGF5ZWQuCisgIFRvIGhhdmUgdGhlIHRlc3QgaW5zdHJ1Y3Rpb25zIGRpc3BsYXllZCwgc2VlIFN5c291dC4KKyAgVG8gaGF2ZSBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgYmUgZGlzcGxheWVkLCBzZWUgU3lzb3V0LgorICBEbyBub3QgY2FsbCBhbnl0aGluZyBpbiB0aGlzIGRpYWxvZyBkaXJlY3RseS4KKyAgKi8KK2NsYXNzIFRlc3REaWFsb2cgZXh0ZW5kcyBEaWFsb2cKK3sKKworICAgIFRleHRBcmVhIGluc3RydWN0aW9uc1RleHQ7CisgICAgVGV4dEFyZWEgbWVzc2FnZVRleHQ7CisgICAgaW50IG1heFN0cmluZ0xlbmd0aCA9IDgwOworCisgICAgLy9ETyBOT1QgY2FsbCB0aGlzIGRpcmVjdGx5LCBnbyB0aHJvdWdoIFN5c291dAorICAgIHB1YmxpYyBUZXN0RGlhbG9nKCBGcmFtZSBmcmFtZSwgU3RyaW5nIG5hbWUgKQorICAgIHsKKyAgICAgICAgc3VwZXIoIGZyYW1lLCBuYW1lICk7CisgICAgICAgIGludCBzY3JvbGxCb3RoID0gVGV4dEFyZWEuU0NST0xMQkFSU19CT1RIOworICAgICAgICBpbnN0cnVjdGlvbnNUZXh0ID0gbmV3IFRleHRBcmVhKCAiIiwgMTUsIG1heFN0cmluZ0xlbmd0aCwgc2Nyb2xsQm90aCApOworICAgICAgICBhZGQoICJOb3J0aCIsIGluc3RydWN0aW9uc1RleHQgKTsKKworICAgICAgICBtZXNzYWdlVGV4dCA9IG5ldyBUZXh0QXJlYSggIiIsIDUsIG1heFN0cmluZ0xlbmd0aCwgc2Nyb2xsQm90aCApOworICAgICAgICBhZGQoIkNlbnRlciIsIG1lc3NhZ2VUZXh0KTsKKworICAgICAgICBwYWNrKCk7CisKKyAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKKyAgICB9Ly8gVGVzdERpYWxvZygpCisKKyAgICAvL0RPIE5PVCBjYWxsIHRoaXMgZGlyZWN0bHksIGdvIHRocm91Z2ggU3lzb3V0CisgICAgcHVibGljIHZvaWQgcHJpbnRJbnN0cnVjdGlvbnMoIFN0cmluZ1tdIGluc3RydWN0aW9ucyApCisgICAgeworICAgICAgICAvL0NsZWFyIG91dCBhbnkgY3VycmVudCBpbnN0cnVjdGlvbnMKKyAgICAgICAgaW5zdHJ1Y3Rpb25zVGV4dC5zZXRUZXh0KCAiIiApOworCisgICAgICAgIC8vR28gZG93biBhcnJheSBvZiBpbnN0cnVjdGlvbiBzdHJpbmdzCisKKyAgICAgICAgU3RyaW5nIHByaW50U3RyLCByZW1haW5pbmdTdHI7CisgICAgICAgIGZvciggaW50IGk9MDsgaSA8IGluc3RydWN0aW9ucy5sZW5ndGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vY2hvcCB1cCBlYWNoIGludG8gcGllY2VzIG1heFNyaW5nTGVuZ3RoIGxvbmcKKyAgICAgICAgICAgIHJlbWFpbmluZ1N0ciA9IGluc3RydWN0aW9uc1sgaSBdOworICAgICAgICAgICAgd2hpbGUoIHJlbWFpbmluZ1N0ci5sZW5ndGgoKSA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vaWYgbG9uZ2VyIHRoYW4gbWF4IHRoZW4gY2hvcCBvZmYgZmlyc3QgbWF4IGNoYXJzIHRvIHByaW50CisgICAgICAgICAgICAgICAgaWYoIHJlbWFpbmluZ1N0ci5sZW5ndGgoKSA+PSBtYXhTdHJpbmdMZW5ndGggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UcnkgdG8gY2hvcCBvbiBhIHdvcmQgYm91bmRhcnkKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvc09mU3BhY2UgPSByZW1haW5pbmdTdHIuCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXhPZiggJyAnLCBtYXhTdHJpbmdMZW5ndGggLSAxICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBvc09mU3BhY2UgPD0gMCApIHBvc09mU3BhY2UgPSBtYXhTdHJpbmdMZW5ndGggLSAxOworCisgICAgICAgICAgICAgICAgICAgIHByaW50U3RyID0gcmVtYWluaW5nU3RyLnN1YnN0cmluZyggMCwgcG9zT2ZTcGFjZSArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nU3RyID0gcmVtYWluaW5nU3RyLnN1YnN0cmluZyggcG9zT2ZTcGFjZSArIDEgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9lbHNlIGp1c3QgcHJpbnQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludFN0ciA9IHJlbWFpbmluZ1N0cjsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nU3RyID0gIiI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zVGV4dC5hcHBlbmQoIHByaW50U3RyICsgIlxuIiApOworCisgICAgICAgICAgICB9Ly8gd2hpbGUKKworICAgICAgICB9Ly8gZm9yCisKKyAgICB9Ly9wcmludEluc3RydWN0aW9ucygpCisKKyAgICAvL0RPIE5PVCBjYWxsIHRoaXMgZGlyZWN0bHksIGdvIHRocm91Z2ggU3lzb3V0CisgICAgcHVibGljIHZvaWQgZGlzcGxheU1lc3NhZ2UoIFN0cmluZyBtZXNzYWdlSW4gKQorICAgIHsKKyAgICAgICAgbWVzc2FnZVRleHQuYXBwZW5kKCBtZXNzYWdlSW4gKyAiXG4iICk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlSW4pOworICAgIH0KKworfS8vIFRlc3REaWFsb2cgIGNsYXNzCisKKwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvV2luZG93L1RyYW5zbHVjZW50SkFwcGxldFRlc3QvVHJhbnNsdWNlbnRKQXBwbGV0VGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YS9hd3QvV2luZG93L1RyYW5zbHVjZW50SkFwcGxldFRlc3QvVHJhbnNsdWNlbnRKQXBwbGV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTk1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZhL2F3dC9XaW5kb3cvVHJhbnNsdWNlbnRKQXBwbGV0VGVzdC9UcmFuc2x1Y2VudEpBcHBsZXRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBAdGVzdCAlSSUgJUUlCisgKiBAYnVnIDY2ODM3MjgKKyAqIEBzdW1tYXJ5IFRlc3RzIHRoYXQgYSBKQXBwbGV0IGluIGEgdHJhbnNsdWNlbnQgSkZyYW1lIHdvcmtzIHByb3Blcmx5CisgKiBAYXV0aG9yIEtlbm5ldGguUnVzc2VsbEBzdW4uY29tOiBhcmVhPUdyYXBoaWNzCisgKiBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSBUcmFuc2x1Y2VudEpBcHBsZXRUZXN0LmphdmEKKyAqIEBydW4gbWFpbi9tYW51YWwvb3RoZXJ2bSBUcmFuc2x1Y2VudEpBcHBsZXRUZXN0CisgKi8KKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuKjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKK3B1YmxpYyBjbGFzcyBUcmFuc2x1Y2VudEpBcHBsZXRUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIEpGcmFtZSBmcmFtZTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHBhaW50Q29tcG9uZW50Q2FsbGVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRBbmRTaG93R1VJKCkgeworICAgICAgICBmcmFtZSA9IG5ldyBKRnJhbWUoKTsKKyAgICAgICAgSkFwcGxldCBhcHBsZXQgPSBuZXcgSkFwcGxldCgpOworICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCkgeworICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoR3JhcGhpY3MgZykgeworICAgICAgICAgICAgICAgIHBhaW50Q29tcG9uZW50Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBnLnNldENvbG9yKENvbG9yLlJFRCk7CisgICAgICAgICAgICAgICAgZy5maWxsT3ZhbCgwLCAwLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHBhbmVsLnNldERvdWJsZUJ1ZmZlcmVkKGZhbHNlKTsKKyAgICAgICAgcGFuZWwuc2V0T3BhcXVlKGZhbHNlKTsKKyAgICAgICAgYXBwbGV0LmFkZChwYW5lbCk7CisgICAgICAgIGZyYW1lLmFkZChhcHBsZXQpOworICAgICAgICBmcmFtZS5zZXRCb3VuZHMoMTAwLCAxMDAsIDIwMCwgMjAwKTsKKyAgICAgICAgZnJhbWUuc2V0VW5kZWNvcmF0ZWQodHJ1ZSk7CisgICAgICAgIGZyYW1lLnNldEJhY2tncm91bmQobmV3IENvbG9yKDAsIDAsIDAsIDApKTsKKyAgICAgICAgZnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdW4uYXd0LlN1blRvb2xraXQgdGsgPSAoc3VuLmF3dC5TdW5Ub29sa2l0KVRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKTsKKworICAgICAgICBSb2JvdCByID0gbmV3IFJvYm90KCk7CisgICAgICAgIENvbG9yIGNvbG9yMSA9IHIuZ2V0UGl4ZWxDb2xvcigxMDAsIDEwMCk7IC8vICgwLCAwKSBpbiBmcmFtZSBjb29yZGluYXRlcworCisgICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGluaXRBbmRTaG93R1VJKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0ay5yZWFsU3luYygpOworCisgICAgICAgIGlmICghcGFpbnRDb21wb25lbnRDYWxsZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IEZBSUxFRDogcGFuZWwncyBwYWludENvbXBvbmVudCgpIG1ldGhvZCBpcyBub3QgY2FsbGVkIik7CisgICAgICAgIH0KKworICAgICAgICBDb2xvciBuZXdDb2xvcjEgPSByLmdldFBpeGVsQ29sb3IoMTAwLCAxMDApOworICAgICAgICAvLyB1bmZvcnR1bmF0ZWx5LCByb2JvdC5nZXRQaXhlbENvbG9yKCkgZG9lc24ndCB3b3JrIGZvciBzb21lIHVua25vd24gcmVhc29uCisgICAgICAgIC8vIENvbG9yIG5ld0NvbG9yMiA9IHIuZ2V0UGl4ZWxDb2xvcigyMDAsIDIwMCk7CisgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmltID0gci5jcmVhdGVTY3JlZW5DYXB0dXJlKG5ldyBSZWN0YW5nbGUoMjAwLCAyMDAsIDEsIDEpKTsKKyAgICAgICAgQ29sb3IgbmV3Q29sb3IyID0gbmV3IENvbG9yKGJpbS5nZXRSR0IoMCwgMCkpOworCisgICAgICAgIC8vIEZyYW1lIG11c3QgYmUgdHJhbnNwYXJlbnQgYXQgKDEwMCwgMTAwKSBpbiBzY3JlZW4gY29vcmRzCisgICAgICAgIGlmICghY29sb3IxLmVxdWFscyhuZXdDb2xvcjEpKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNvbG9yMSA9ICIgKyBjb2xvcjEpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJuZXdDb2xvcjEgPSAiICsgbmV3Q29sb3IxKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IEZBSUxFRDogZnJhbWUgcGl4ZWwgYXQgKDAsIDApIGlzIG5vdCB0cmFuc3BhcmVudCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRnJhbWUgbXVzdCBiZSBSRUQgYXQgKDIwMCwgMjAwKSBpbiBzY3JlZW4gY29vcmRzCisgICAgICAgIGlmICghbmV3Q29sb3IyLmVxdWFscyhDb2xvci5SRUQpKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm5ld0NvbG9yMiA9ICIgKyBuZXdDb2xvcjIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgRkFJTEVEOiBmcmFtZSBwaXhlbCBhdCAoMTAwLCAxMDApIGlzIG5vdCByZWQgKHRyYW5zcGFyZW50PykiKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBQQVNTRUQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9XaW5kb3cvVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QvVFNGcmFtZS5qYXZhIGIvamRrL3Rlc3QvamF2YS9hd3QvV2luZG93L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RTRnJhbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDg2ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS9hd3QvV2luZG93L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RTRnJhbWUuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5GcmFtZTsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0NvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2U7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5OworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzRW52aXJvbm1lbnQ7CitpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5DYW52YXM7CitpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OworaW1wb3J0IGphdmEuYXd0LkdyYWRpZW50UGFpbnQ7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5QYWludDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEuYXd0Lmdlb20uRWxsaXBzZTJEOworaW1wb3J0IGphdmF4LnN3aW5nLkpBcHBsZXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7CisKK3B1YmxpYyBjbGFzcyBUU0ZyYW1lIHsKKworICAgIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGRvbmUgPSBmYWxzZTsKKworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZVN3aW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2Vzd2luZyIpICE9IG51bGw7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlU2hhcGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXNoYXBlIikgIT0gbnVsbDsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VUcmFuc2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXRyYW5zbCIpICE9IG51bGw7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlTm9uT3BhcXVlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2Vub25vcCIpICE9IG51bGw7CisKKyAgICBzdGF0aWMgZmluYWwgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbmRlcihHcmFwaGljcyBnLCBpbnQgdywgaW50IGgsIGJvb2xlYW4gdXNlTm9uT3BhcXVlKSB7CisgICAgICAgIGlmICh1c2VOb25PcGFxdWUpIHsKKyAgICAgICAgICAgIEdyYXBoaWNzMkQgZzJkID0gKEdyYXBoaWNzMkQpZzsKKyAgICAgICAgICAgIEdyYWRpZW50UGFpbnQgcCA9CisgICAgICAgICAgICAgICAgbmV3IEdyYWRpZW50UGFpbnQoMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29sb3Iocm5kLm5leHRJbnQoMHhmZmZmZmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb2xvcihybmQubmV4dEludCgweGZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kLm5leHRJbnQoMHhmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZC5uZXh0SW50KDB4ZmYpLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgIGcyZC5zZXRQYWludChwKTsKKyAgICAgICAgICAgIGcyZC5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9BTlRJQUxJQVNJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJpbmdIaW50cy5WQUxVRV9BTlRJQUxJQVNfT04pOworICAgICAgICAgICAgZzJkLmZpbGxPdmFsKDAsIDAsIHcsIGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZy5zZXRDb2xvcihuZXcgQ29sb3Iocm5kLm5leHRJbnQoMHhmZmZmZmYpKSk7CisgICAgICAgICAgICBnLmZpbGxSZWN0KDAsIDAsIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgeworICAgICAgICAgICAgcmVuZGVyKGcsIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKDIwMCwgMTAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25PcGFxdWVKRnJhbWUgZXh0ZW5kcyBKRnJhbWUgeworICAgICAgICBOb25PcGFxdWVKRnJhbWUoKSB7CisgICAgICAgICAgICBzdXBlcigiTm9uT3BhcXVlIFN3aW5nIEpGcmFtZSIpOworICAgICAgICAgICAgSlBhbmVsIHAgPSBuZXcgSlBhbmVsKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIucGFpbnRDb21wb25lbnQoZyk7CisgICAgICAgICAgICAgICAgICAgIHJlbmRlcihnLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGcuc2V0Q29sb3IoQ29sb3IucmVkKTsKKyAgICAgICAgICAgICAgICAgICAgZy5kcmF3U3RyaW5nKCJOb24tT3BhcXVlIFN3aW5nIEpGcmFtZSIsIDEwLCAxNSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHAuc2V0RG91YmxlQnVmZmVyZWQoZmFsc2UpOworICAgICAgICAgICAgcC5zZXRPcGFxdWUoZmFsc2UpOworICAgICAgICAgICAgYWRkKHApOworICAgICAgICAgICAgc2V0VW5kZWNvcmF0ZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uT3BhcXVlSkFwcGxldEZyYW1lIGV4dGVuZHMgSkZyYW1lIHsKKyAgICAgICAgSlBhbmVsIHA7CisgICAgICAgIE5vbk9wYXF1ZUpBcHBsZXRGcmFtZSgpIHsKKyAgICAgICAgICAgIHN1cGVyKCJOb25PcGFxdWUgU3dpbmcgSkFwcGxldEZyYW1lIik7CisgICAgICAgICAgICBKQXBwbGV0IGphID0gbmV3IEpBcHBsZXQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgeworICAgICAgICAgICAgICAgICAgICBzdXBlci5wYWludChnKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJKQXBwbGV0RnJhbWUgcGFpbnQgY2FsbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHAgPSBuZXcgSlBhbmVsKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIucGFpbnRDb21wb25lbnQoZyk7CisgICAgICAgICAgICAgICAgICAgIHJlbmRlcihnLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGcuc2V0Q29sb3IoQ29sb3IucmVkKTsKKyAgICAgICAgICAgICAgICAgICAgZy5kcmF3U3RyaW5nKCJOb24tT3BhcXVlIFN3aW5nIEpGcmFtZSIsIDEwLCAxNSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHAuc2V0RG91YmxlQnVmZmVyZWQoZmFsc2UpOworICAgICAgICAgICAgcC5zZXRPcGFxdWUoZmFsc2UpOworICAgICAgICAgICAgamEuYWRkKHApOworICAgICAgICAgICAgYWRkKGphKTsKKyAgICAgICAgICAgIHNldFVuZGVjb3JhdGVkKHRydWUpOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vbk9wYXF1ZUZyYW1lIGV4dGVuZHMgRnJhbWUgeworICAgICAgICBOb25PcGFxdWVGcmFtZSgpIHsKKyAgICAgICAgICAgIHN1cGVyKCJOb25PcGFxdWUgQVdUIEZyYW1lIik7CisgICAgICAgICAgICAvLyB1bmNvbW1lbnQgdG8gdGVzdCB3aXRoIGh3IGNoaWxkCisvLyAgICAgICAgICAgIHNldExheW91dChudWxsKTsKKy8vICAgICAgICAgICAgQ29tcG9uZW50IGMgPSBuZXcgUGFuZWwoKSB7CisvLyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7CisvLyAgICAgICAgICAgICAgICAgICAgZy5zZXRDb2xvcihuZXcgQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMC41ZikpOworLy8gICAgICAgICAgICAgICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOworLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICB9OworLy8gICAgICAgICAgICBjLnNldFNpemUoMTAwLCAxMDApOworLy8gICAgICAgICAgICBjLnNldEJhY2tncm91bmQoQ29sb3IucmVkKTsKKy8vICAgICAgICAgICAgYy5zZXRGb3JlZ3JvdW5kKENvbG9yLnJlZCk7CisvLyAgICAgICAgICAgIGFkZChjKTsKKy8vICAgICAgICAgICAgYy5zZXRMb2NhdGlvbigxMzAsIDEzMCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKKyAgICAgICAgICAgIHJlbmRlcihnLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgdHJ1ZSk7CisgICAgICAgICAgICBnLnNldENvbG9yKENvbG9yLnJlZCk7CisgICAgICAgICAgICBnLmRyYXdTdHJpbmcoIk5vbi1PcGFxdWUgQVdUIEZyYW1lIiwgMTAsIDE1KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15SlBhbmVsIGV4dGVuZHMgSlBhbmVsIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKKyAgICAgICAgICAgIHJlbmRlcihnLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGcmFtZSBjcmVhdGVHdWkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1c2VTd2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHVzZVNoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlVHJhbnNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlTm9uT3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGZhY3RvcikKKyAgICB7CisgICAgICAgIEZyYW1lIGZyYW1lOworICAgICAgICBkb25lID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHVzZU5vbk9wYXF1ZSkgeworICAgICAgICAgICAgaWYgKHVzZVN3aW5nKSB7CisgICAgICAgICAgICAgICAgZnJhbWUgPSBuZXcgTm9uT3BhcXVlSkZyYW1lKCk7CisvLyAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBOb25PcGFxdWVKQXBwbGV0RnJhbWUoZ2MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBOb25PcGFxdWVGcmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZUNvbXBvbmVudChmcmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAodXNlU3dpbmcpIHsKKyAgICAgICAgICAgIGZyYW1lID0gbmV3IEpGcmFtZSgiU3dpbmcgRnJhbWUiKTsKKyAgICAgICAgICAgIEpDb21wb25lbnQgcCA9IG5ldyBKQnV0dG9uKCJTd2luZyEiKTsKKyAgICAgICAgICAgIHAuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDIwMCwgMTAwKSk7CisgICAgICAgICAgICBmcmFtZS5hZGQoIk5vcnRoIiwgcCk7CisgICAgICAgICAgICBwID0gbmV3IE15SlBhbmVsKCk7CisgICAgICAgICAgICBhbmltYXRlQ29tcG9uZW50KHApOworICAgICAgICAgICAgZnJhbWUuYWRkKCJDZW50ZXIiLCBwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lID0gbmV3IEZyYW1lKCJBV1QgRnJhbWUiKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgeworICAgICAgICAgICAgICAgICAgICBnLnNldENvbG9yKENvbG9yLnJlZCk7CisgICAgICAgICAgICAgICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgMTAwLCAxMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBmcmFtZS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgICAgIENhbnZhcyBjID0gbmV3IE15Q2FudmFzKCk7CisgICAgICAgICAgICBmcmFtZS5hZGQoIk5vcnRoIiwgYyk7CisgICAgICAgICAgICBhbmltYXRlQ29tcG9uZW50KGMpOworICAgICAgICAgICAgYyA9IG5ldyBNeUNhbnZhcygpOworICAgICAgICAgICAgZnJhbWUuYWRkKCJDZW50ZXIiLCBjKTsKKyAgICAgICAgICAgIGFuaW1hdGVDb21wb25lbnQoYyk7CisgICAgICAgICAgICBjID0gbmV3IE15Q2FudmFzKCk7CisgICAgICAgICAgICBmcmFtZS5hZGQoIlNvdXRoIiwgYyk7CisgICAgICAgICAgICBhbmltYXRlQ29tcG9uZW50KGMpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEZyYW1lIGZpbmFsRnJhbWUgPSBmcmFtZTsKKyAgICAgICAgZnJhbWUuYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgeworICAgICAgICAgICAgICAgIGZpbmFsRnJhbWUuZGlzcG9zZSgpOworICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgZnJhbWUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgICAgICAgZmluYWxGcmFtZS5kaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBmcmFtZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oODAwLCA2MDApKTsKKworICAgICAgICBpZiAodXNlU2hhcGUpIHsKKyAgICAgICAgICAgIGZyYW1lLnNldFVuZGVjb3JhdGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWUuc2V0TG9jYXRpb24oNDUwLCAxMCk7CisgICAgICAgIGZyYW1lLnBhY2soKTsKKworICAgICAgICBHcmFwaGljc0RldmljZSBnZCA9IGZyYW1lLmdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpLmdldERldmljZSgpOworICAgICAgICBpZiAodXNlU2hhcGUpIHsKKyAgICAgICAgICAgIGlmIChnZC5pc1dpbmRvd1RyYW5zbHVjZW5jeVN1cHBvcnRlZChXaW5kb3dUcmFuc2x1Y2VuY3kuUEVSUElYRUxfVFJBTlNQQVJFTlQpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhcHBseWluZyBQRVJQSVhFTF9UUkFOU1BBUkVOVCIpOworICAgICAgICAgICAgICAgIGZyYW1lLnNldFNoYXBlKG5ldyBFbGxpcHNlMkQuRG91YmxlKDAsIDAsIGZyYW1lLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuZ2V0SGVpZ2h0KCkvMykpOworICAgICAgICAgICAgICAgIGZyYW1lLnNldFRpdGxlKCJQRVJQSVhFTF9UUkFOU1BBUkVOVCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhc3NlZDogUEVSUElYRUxfVFJBTlNQQVJFTlQgdW5zdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodXNlVHJhbnNsKSB7CisgICAgICAgICAgICBpZiAoZ2QuaXNXaW5kb3dUcmFuc2x1Y2VuY3lTdXBwb3J0ZWQoV2luZG93VHJhbnNsdWNlbmN5LlRSQU5TTFVDRU5UKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYXBwbHlpbmcgVFJBTlNMVUNFTlQiKTsKKyAgICAgICAgICAgICAgICBmcmFtZS5zZXRPcGFjaXR5KGZhY3Rvcik7CisgICAgICAgICAgICAgICAgZnJhbWUuc2V0VGl0bGUoIlRSQU5TTFVDRU5UIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFzc2VkOiBUUkFOU0xVQ0VOVCB1bnN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh1c2VOb25PcGFxdWUpIHsKKyAgICAgICAgICAgIGlmIChnZC5pc1dpbmRvd1RyYW5zbHVjZW5jeVN1cHBvcnRlZChXaW5kb3dUcmFuc2x1Y2VuY3kuUEVSUElYRUxfVFJBTlNMVUNFTlQpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhcHBseWluZyBQRVJQSVhFTF9UUkFOU0xVQ0VOVCIpOworICAgICAgICAgICAgICAgIGZyYW1lLnNldEJhY2tncm91bmQobmV3IENvbG9yKDAsIDAsIDAsIDApKTsKKyAgICAgICAgICAgICAgICBmcmFtZS5zZXRUaXRsZSgiUEVSUElYRUxfVFJBTlNMVUNFTlQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXNzZWQ6IFBFUlBJWEVMX1RSQU5TTFVDRU5UIHVuc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgcmV0dXJuIGZyYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wVGhyZWFkcygpIHsKKyAgICAgICAgZG9uZSA9IHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhbmltYXRlQ29tcG9uZW50KGZpbmFsIENvbXBvbmVudCBjb21wKSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHt9CisgICAgICAgICAgICAgICAgICAgIGNvbXAucmVwYWludCgpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFkb25lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFRTRnJhbWUuY3JlYXRlR3VpKHVzZVN3aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVRyYW5zbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VOb25PcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vYXd0L1RyYW5zbHVjZW5jeS9UcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdC9UcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdC5mb3JtIGIvamRrL3Rlc3QvamF2YS9hd3QvV2luZG93L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0LmZvcm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGpkay90ZXN0L2NvbS9zdW4vYXd0L1RyYW5zbHVjZW5jeS9UcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdC9UcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdC5mb3JtCnJlbmFtZSB0byBqZGsvdGVzdC9qYXZhL2F3dC9XaW5kb3cvVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QvVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QuZm9ybQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvV2luZG93L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9XaW5kb3cvVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QvVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjU4YmEyCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS9hd3QvV2luZG93L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0L1RyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0LmphdmEKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIEB0ZXN0ICVJJSAlRSUKKyAqIEBidWcgNjY1NTAwMSA2NjcwNjQ5IDY2ODcxNDEKKyAqIEBzdW1tYXJ5IFRlc3RzIHRoYXQgaHcgYWNjZWxlcmF0aW9uIGRvZXNuJ3QgYWZmZWN0IHRyYW5zbHVjZW50L3NoYXBlZCB3aW5kb3dzCisgKiBAYXV0aG9yIERtaXRyaS5UcmVtYm92ZXRza2lAc3VuLmNvbTogYXJlYT1HcmFwaGljcworICogQGNvbXBpbGUgLVhEaWdub3JlLnN5bWJvbC5maWxlPXRydWUgVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QuamF2YQorICogQGNvbXBpbGUgLVhEaWdub3JlLnN5bWJvbC5maWxlPXRydWUgVFNGcmFtZS5qYXZhCisgKiBAcnVuIG1haW4vbWFudWFsL290aGVydm0gVHJhbnNsdWNlbnRTaGFwZWRGcmFtZVRlc3QKKyAqIEBydW4gbWFpbi9tYW51YWwvb3RoZXJ2bSAtRHN1bi5qYXZhMmQubm9kZHJhdz10cnVlIFRyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0CisgKiBAcnVuIG1haW4vbWFudWFsL290aGVydm0gLURzdW4uamF2YTJkLm9wZW5nbD1UcnVlIFRyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0CisgKi8KK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5GcmFtZTsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0NvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2U7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2UuV2luZG93VHJhbnNsdWNlbmN5OworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzRW52aXJvbm1lbnQ7CitpbXBvcnQgamF2YS5hd3QuU2hhcGU7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5FbGxpcHNlMkQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YXguc3dpbmcuSlNsaWRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKK2ltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7CitpbXBvcnQgamF2YXguc3dpbmcuVW5zdXBwb3J0ZWRMb29rQW5kRmVlbEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFRyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0IGV4dGVuZHMgamF2YXguc3dpbmcuSkZyYW1lIHsKKyAgICBGcmFtZSB0ZXN0RnJhbWU7CisgICAgc3RhdGljIENvdW50RG93bkxhdGNoIGRvbmU7CisgICAgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7CisgICAgR3JhcGhpY3NDb25maWd1cmF0aW9uIGdjVG9Vc2UgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgZm9ybSBUcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdAorICAgICAqLworICAgIHB1YmxpYyBUcmFuc2x1Y2VudFNoYXBlZEZyYW1lVGVzdCgpIHsKKyAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSwgYnV0IHdlIGp1c3QgbG9vayBuaWNlcgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQorCisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgICAgIGNoZWNrRWZmZWN0cygpOworCisgICAgICAgIFN3aW5nVXRpbGl0aWVzLnVwZGF0ZUNvbXBvbmVudFRyZWVVSSh0aGlzKTsKKyAgICB9CisKKyAgICAvKiogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBjb25zdHJ1Y3RvciB0bworICAgICAqIGluaXRpYWxpemUgdGhlIGZvcm0uCisgICAgICogV0FSTklORzogRG8gTk9UIG1vZGlmeSB0aGlzIGNvZGUuIFRoZSBjb250ZW50IG9mIHRoaXMgbWV0aG9kIGlzCisgICAgICogYWx3YXlzIHJlZ2VuZXJhdGVkIGJ5IHRoZSBGb3JtIEVkaXRvci4KKyAgICAgKi8KKyAgICAvLyA8ZWRpdG9yLWZvbGQgZGVmYXVsdHN0YXRlPSJjb2xsYXBzZWQiIGRlc2M9IiBHZW5lcmF0ZWQgQ29kZSAiPi8vR0VOLUJFR0lOOmluaXRDb21wb25lbnRzCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkgeworICAgICAgICBjcmVhdGVEaXNwb3NlR3JwID0gbmV3IGphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwKCk7CisgICAgICAgIGpMYWJlbDEgPSBuZXcgamF2YXguc3dpbmcuSkxhYmVsKCk7CisgICAgICAgIHRyYW5zcGFyZW5jeVNsZCA9IG5ldyBqYXZheC5zd2luZy5KU2xpZGVyKCk7CisgICAgICAgIHNoYXBlZENiID0gbmV3IGphdmF4LnN3aW5nLkpDaGVja0JveCgpOworICAgICAgICBub25PcGFxdWVDaGIgPSBuZXcgamF2YXguc3dpbmcuSkNoZWNrQm94KCk7CisgICAgICAgIGpTY3JvbGxQYW5lMSA9IG5ldyBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZSgpOworICAgICAgICBqVGV4dEFyZWExID0gbmV3IGphdmF4LnN3aW5nLkpUZXh0QXJlYSgpOworICAgICAgICBqTGFiZWwyID0gbmV3IGphdmF4LnN3aW5nLkpMYWJlbCgpOworICAgICAgICBwYXNzZWRCdG4gPSBuZXcgamF2YXguc3dpbmcuSkJ1dHRvbigpOworICAgICAgICBmYWlsZWRCdG4gPSBuZXcgamF2YXguc3dpbmcuSkJ1dHRvbigpOworICAgICAgICBjcmVhdGVGcmFtZUJ0biA9IG5ldyBqYXZheC5zd2luZy5KVG9nZ2xlQnV0dG9uKCk7CisgICAgICAgIGRpc3Bvc2VGcmFtZUJ0biA9IG5ldyBqYXZheC5zd2luZy5KVG9nZ2xlQnV0dG9uKCk7CisgICAgICAgIHVzZVN3aW5nQ2IgPSBuZXcgamF2YXguc3dpbmcuSkNoZWNrQm94KCk7CisKKyAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50cy5FWElUX09OX0NMT1NFKTsKKyAgICAgICAgc2V0VGl0bGUoIlRyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0Iik7CisgICAgICAgIGpMYWJlbDEuc2V0VGV4dCgiRnJhbWUgT3BhY2l0eToiKTsKKworICAgICAgICB0cmFuc3BhcmVuY3lTbGQuc2V0TWFqb3JUaWNrU3BhY2luZygxMCk7CisgICAgICAgIHRyYW5zcGFyZW5jeVNsZC5zZXRNaW5vclRpY2tTcGFjaW5nKDUpOworICAgICAgICB0cmFuc3BhcmVuY3lTbGQuc2V0UGFpbnRMYWJlbHModHJ1ZSk7CisgICAgICAgIHRyYW5zcGFyZW5jeVNsZC5zZXRQYWludFRpY2tzKHRydWUpOworICAgICAgICB0cmFuc3BhcmVuY3lTbGQuc2V0VmFsdWUoMTAwKTsKKyAgICAgICAgdHJhbnNwYXJlbmN5U2xkLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3lTbGRTdGF0ZUNoYW5nZWQoZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgc2hhcGVkQ2Iuc2V0VGV4dCgiU2hhcGVkIEZyYW1lIik7CisgICAgICAgIHNoYXBlZENiLnNldEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDAsIDAsIDApKTsKKyAgICAgICAgc2hhcGVkQ2Iuc2V0TWFyZ2luKG5ldyBqYXZhLmF3dC5JbnNldHMoMCwgMCwgMCwgMCkpOworICAgICAgICBzaGFwZWRDYi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgc2hhcGVkQ2JBY3Rpb25QZXJmb3JtZWQoZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbm9uT3BhcXVlQ2hiLnNldFRleHQoIk5vbiBPcGFxdWUgRnJhbWUiKTsKKyAgICAgICAgbm9uT3BhcXVlQ2hiLnNldEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDAsIDAsIDApKTsKKyAgICAgICAgbm9uT3BhcXVlQ2hiLnNldE1hcmdpbihuZXcgamF2YS5hd3QuSW5zZXRzKDAsIDAsIDAsIDApKTsKKyAgICAgICAgbm9uT3BhcXVlQ2hiLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsKKyAgICAgICAgICAgICAgICBub25PcGFxdWVDaGJBY3Rpb25QZXJmb3JtZWQoZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgalRleHRBcmVhMS5zZXRDb2x1bW5zKDIwKTsKKyAgICAgICAgalRleHRBcmVhMS5zZXRSb3dzKDUpOworICAgICAgICBqVGV4dEFyZWExLnNldFRleHQoIkNyZWF0ZSB0cmFuc2x1Y2VudCBhbmQvb3Igc2hhcGVkLCBvclxubm9uLW9wYXF1ZSBmcmFtZS4gTWFrZSBzdXJlIGl0IGJlaGF2ZXNcbmNvcnJlY3RseSAobm8gYXJ0aWZhY3RzIGxlZnQgb24gdGhlIHNjcmVlblxud2hlbiBkcmFnZ2luZyAtIGlmIGRyYWdnaW5nIGlzIHBvc3NpYmxlKS5cbkNsaWNrIFwiUGFzc2VkXCIgaWYgdGhlIHRlc3QgYmVoYXZlcyBjb3JyZWN0bHksXG5cIkZhbGllZFwiIG90aGVyd2lzZS4iKTsKKyAgICAgICAgalNjcm9sbFBhbmUxLnNldFZpZXdwb3J0VmlldyhqVGV4dEFyZWExKTsKKworICAgICAgICBqTGFiZWwyLnNldFRleHQoIkluc3RydWN0aW9uczoiKTsKKworICAgICAgICBwYXNzZWRCdG4uc2V0QmFja2dyb3VuZChuZXcgQ29sb3IoMTI5LCAyNTUsIDEwMCkpOworICAgICAgICBwYXNzZWRCdG4uc2V0VGV4dCgiUGFzc2VkIik7CisgICAgICAgIHBhc3NlZEJ0bi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgcGFzc2VkQnRuQWN0aW9uUGVyZm9ybWVkKGV2dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZhaWxlZEJ0bi5zZXRCYWNrZ3JvdW5kKENvbG9yLnJlZCk7CisgICAgICAgIGZhaWxlZEJ0bi5zZXRUZXh0KCJGYWlsZWQiKTsKKyAgICAgICAgZmFpbGVkQnRuLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsKKyAgICAgICAgICAgICAgICBmYWlsZWRCdG5BY3Rpb25QZXJmb3JtZWQoZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgY3JlYXRlRGlzcG9zZUdycC5hZGQoY3JlYXRlRnJhbWVCdG4pOworICAgICAgICBjcmVhdGVGcmFtZUJ0bi5zZXRUZXh0KCJDcmVhdGUgRnJhbWUiKTsKKyAgICAgICAgY3JlYXRlRnJhbWVCdG4uYWRkQWN0aW9uTGlzdGVuZXIobmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZUZyYW1lQnRuQWN0aW9uUGVyZm9ybWVkKGV2dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGNyZWF0ZURpc3Bvc2VHcnAuYWRkKGRpc3Bvc2VGcmFtZUJ0bik7CisgICAgICAgIGRpc3Bvc2VGcmFtZUJ0bi5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgZGlzcG9zZUZyYW1lQnRuLnNldFRleHQoIkRpc3Bvc2UgRnJhbWUiKTsKKyAgICAgICAgZGlzcG9zZUZyYW1lQnRuLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsKKyAgICAgICAgICAgICAgICBkaXNwb3NlRnJhbWVCdG5BY3Rpb25QZXJmb3JtZWQoZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgdXNlU3dpbmdDYi5zZXRUZXh0KCJVc2UgSkZyYW1lIik7CisgICAgICAgIHVzZVN3aW5nQ2Iuc2V0Qm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMCwgMCwgMCwgMCkpOworICAgICAgICB1c2VTd2luZ0NiLnNldE1hcmdpbihuZXcgamF2YS5hd3QuSW5zZXRzKDAsIDAsIDAsIDApKTsKKworICAgICAgICBqYXZheC5zd2luZy5Hcm91cExheW91dCBsYXlvdXQgPSBuZXcgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQoZ2V0Q29udGVudFBhbmUoKSk7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KGxheW91dCk7CisgICAgICAgIGxheW91dC5zZXRIb3Jpem9udGFsR3JvdXAoCisgICAgICAgICAgICBsYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChqYXZheC5zd2luZy5Hcm91cExheW91dC5BbGlnbm1lbnQuTEVBRElORykKKyAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkKKyAgICAgICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAoamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuQWxpZ25tZW50LkxFQURJTkcpCisgICAgICAgICAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQodHJhbnNwYXJlbmN5U2xkLCBqYXZheC5zd2luZy5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIDM3NSwgU2hvcnQuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpKQorICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KGpMYWJlbDEpCisgICAgICAgICAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoc2hhcGVkQ2IpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKGphdmF4LnN3aW5nLkxheW91dFN0eWxlLkNvbXBvbmVudFBsYWNlbWVudC5SRUxBVEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChub25PcGFxdWVDaGIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKGphdmF4LnN3aW5nLkxheW91dFN0eWxlLkNvbXBvbmVudFBsYWNlbWVudC5SRUxBVEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudCh1c2VTd2luZ0NiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgxMDIsIFNob3J0Lk1BWF9WQUxVRSkpCisgICAgICAgICAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChqYXZheC5zd2luZy5Hcm91cExheW91dC5BbGlnbm1lbnQuTEVBRElORykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoakxhYmVsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChqYXZheC5zd2luZy5MYXlvdXRTdHlsZS5Db21wb25lbnRQbGFjZW1lbnQuUkVMQVRFRCwgMzE0LCBqYXZheC5zd2luZy5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEdyb3VwKGxheW91dC5jcmVhdGVTZXF1ZW50aWFsR3JvdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KHBhc3NlZEJ0bikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChqYXZheC5zd2luZy5MYXlvdXRTdHlsZS5Db21wb25lbnRQbGFjZW1lbnQuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChmYWlsZWRCdG4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAoamF2YXguc3dpbmcuTGF5b3V0U3R5bGUuQ29tcG9uZW50UGxhY2VtZW50LlJFTEFURUQsIDI0MSwgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoalNjcm9sbFBhbmUxLCBqYXZheC5zd2luZy5Hcm91cExheW91dC5BbGlnbm1lbnQuVFJBSUxJTkcsIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgMzc1LCBTaG9ydC5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEdyb3VwKGxheW91dC5jcmVhdGVTZXF1ZW50aWFsR3JvdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KGNyZWF0ZUZyYW1lQnRuLCBqYXZheC5zd2luZy5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSwgMTg3LCBqYXZheC5zd2luZy5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChqYXZheC5zd2luZy5MYXlvdXRTdHlsZS5Db21wb25lbnRQbGFjZW1lbnQuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChkaXNwb3NlRnJhbWVCdG4sIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFLCAxODIsIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkpKSkKKyAgICAgICAgKTsKKyAgICAgICAgbGF5b3V0LnNldFZlcnRpY2FsR3JvdXAoCisgICAgICAgICAgICBsYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChqYXZheC5zd2luZy5Hcm91cExheW91dC5BbGlnbm1lbnQuTEVBRElORykKKyAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkKKyAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KGpMYWJlbDEpCisgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChqYXZheC5zd2luZy5MYXlvdXRTdHlsZS5Db21wb25lbnRQbGFjZW1lbnQuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KHRyYW5zcGFyZW5jeVNsZCwgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUsIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUpCisgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChqYXZheC5zd2luZy5MYXlvdXRTdHlsZS5Db21wb25lbnRQbGFjZW1lbnQuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAuYWRkR3JvdXAobGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAoamF2YXguc3dpbmcuR3JvdXBMYXlvdXQuQWxpZ25tZW50LkJBU0VMSU5FKQorICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KHNoYXBlZENiKQorICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KG5vbk9wYXF1ZUNoYikKKyAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudCh1c2VTd2luZ0NiKSkKKyAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKGphdmF4LnN3aW5nLkxheW91dFN0eWxlLkNvbXBvbmVudFBsYWNlbWVudC5SRUxBVEVEKQorICAgICAgICAgICAgICAgIC5hZGRHcm91cChsYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChqYXZheC5zd2luZy5Hcm91cExheW91dC5BbGlnbm1lbnQuQkFTRUxJTkUpCisgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoZGlzcG9zZUZyYW1lQnRuKQorICAgICAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KGNyZWF0ZUZyYW1lQnRuKSkKKyAgICAgICAgICAgICAgICAuYWRkR2FwKDE3LCAxNywgMTcpCisgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChqTGFiZWwyKQorICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAoamF2YXguc3dpbmcuTGF5b3V0U3R5bGUuQ29tcG9uZW50UGxhY2VtZW50LlJFTEFURUQpCisgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChqU2Nyb2xsUGFuZTEsIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFLCAxNDgsIGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKQorICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAoamF2YXguc3dpbmcuTGF5b3V0U3R5bGUuQ29tcG9uZW50UGxhY2VtZW50LlJFTEFURUQpCisgICAgICAgICAgICAgICAgLmFkZEdyb3VwKGxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LkFsaWdubWVudC5CQVNFTElORSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudChwYXNzZWRCdG4pCisgICAgICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQoZmFpbGVkQnRuKSkKKyAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKGphdmF4LnN3aW5nLkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKSkKKyAgICAgICAgKTsKKyAgICAgICAgcGFjaygpOworICAgIH0vLyA8L2VkaXRvci1mb2xkPi8vR0VOLUVORDppbml0Q29tcG9uZW50cworCisgICAgcHJpdmF0ZSB2b2lkIG5vbk9wYXF1ZUNoYkFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsvL0dFTi1GSVJTVDpldmVudF9ub25PcGFxdWVDaGJBY3Rpb25QZXJmb3JtZWQKKyAgICAgICAgaWYgKHRlc3RGcmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBSRU1JTkQ6IHRoaXMgcGF0aCBpbiB0aGUgdGVzdCBkb2Vzbid0IHdvcmsgd2VsbCAodGVzdCBidWcpCisgICAgICAgICAgICB0ZXN0RnJhbWUuc2V0QmFja2dyb3VuZChuZXcgQ29sb3IoMCwgMCwgMCwgbm9uT3BhcXVlQ2hiLmlzU2VsZWN0ZWQoKSA/IDAgOiAyNTUpKTsKKyAgICAgICAgfQorICAgIH0vL0dFTi1MQVNUOmV2ZW50X25vbk9wYXF1ZUNoYkFjdGlvblBlcmZvcm1lZAorCisgICAgcHJpdmF0ZSB2b2lkIHNoYXBlZENiQWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgey8vR0VOLUZJUlNUOmV2ZW50X3NoYXBlZENiQWN0aW9uUGVyZm9ybWVkCisgICAgICAgIGlmICh0ZXN0RnJhbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgU2hhcGUgcyA9IG51bGw7CisgICAgICAgICAgICBpZiAoc2hhcGVkQ2IuaXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgcyA9IG5ldyBFbGxpcHNlMkQuRG91YmxlKDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGcmFtZS5nZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RnJhbWUuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVzdEZyYW1lLnNldFNoYXBlKHMpOworICAgICAgICB9CisgICAgfS8vR0VOLUxBU1Q6ZXZlbnRfc2hhcGVkQ2JBY3Rpb25QZXJmb3JtZWQKKworICAgIHByaXZhdGUgdm9pZCB0cmFuc3BhcmVuY3lTbGRTdGF0ZUNoYW5nZWQoamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQgZXZ0KSB7Ly9HRU4tRklSU1Q6ZXZlbnRfdHJhbnNwYXJlbmN5U2xkU3RhdGVDaGFuZ2VkCisgICAgICAgIEpTbGlkZXIgc291cmNlID0gKEpTbGlkZXIpZXZ0LmdldFNvdXJjZSgpOworICAgICAgICAgICAgaW50IHRyYW5zbCA9IHRyYW5zcGFyZW5jeVNsZC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHRlc3RGcmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGVzdEZyYW1lLnNldE9wYWNpdHkoKGZsb2F0KXRyYW5zbC8xMDBmKTsKKyAgICAgICAgICAgIH0KKyAgICB9Ly9HRU4tTEFTVDpldmVudF90cmFuc3BhcmVuY3lTbGRTdGF0ZUNoYW5nZWQKKworICAgIHByaXZhdGUgdm9pZCBmYWlsZWRCdG5BY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ly9HRU4tRklSU1Q6ZXZlbnRfZmFpbGVkQnRuQWN0aW9uUGVyZm9ybWVkCisgICAgICAgIGRpc3Bvc2VGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZChldnQpOworICAgICAgICBkaXNwb3NlKCk7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIGRvbmUuY291bnREb3duKCk7CisgICAgfS8vR0VOLUxBU1Q6ZXZlbnRfZmFpbGVkQnRuQWN0aW9uUGVyZm9ybWVkCisKKyAgICBwcml2YXRlIHZvaWQgZGlzcG9zZUZyYW1lQnRuQWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgey8vR0VOLUZJUlNUOmV2ZW50X2Rpc3Bvc2VGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZAorICAgICAgICBUU0ZyYW1lLnN0b3BUaHJlYWRzKCk7CisgICAgICAgIGlmICh0ZXN0RnJhbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdEZyYW1lLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIHRlc3RGcmFtZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Ly9HRU4tTEFTVDpldmVudF9kaXNwb3NlRnJhbWVCdG5BY3Rpb25QZXJmb3JtZWQKKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsvL0dFTi1GSVJTVDpldmVudF9jcmVhdGVGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZAorICAgICAgICBkaXNwb3NlRnJhbWVCdG5BY3Rpb25QZXJmb3JtZWQoZXZ0KTsKKyAgICAgICAgaW50IHRyYW5zbCA9IHRyYW5zcGFyZW5jeVNsZC5nZXRWYWx1ZSgpOworICAgICAgICB0ZXN0RnJhbWUgPSBUU0ZyYW1lLmNyZWF0ZUd1aSgKKyAgICAgICAgICAgICAgICB1c2VTd2luZ0NiLmlzU2VsZWN0ZWQoKSwgc2hhcGVkQ2IuaXNTZWxlY3RlZCgpLAorICAgICAgICAgICAgICAgICh0cmFuc2wgPCAxMDApLCBub25PcGFxdWVDaGIuaXNTZWxlY3RlZCgpLAorICAgICAgICAgICAgICAgIChmbG9hdCl0cmFuc2wvMTAwZik7CisgICAgfS8vR0VOLUxBU1Q6ZXZlbnRfY3JlYXRlRnJhbWVCdG5BY3Rpb25QZXJmb3JtZWQKKworICAgIHByaXZhdGUgdm9pZCBwYXNzZWRCdG5BY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ly9HRU4tRklSU1Q6ZXZlbnRfcGFzc2VkQnRuQWN0aW9uUGVyZm9ybWVkCisgICAgICAgIGRpc3Bvc2VGcmFtZUJ0bkFjdGlvblBlcmZvcm1lZChldnQpOworICAgICAgICBkaXNwb3NlKCk7CisgICAgICAgIGRvbmUuY291bnREb3duKCk7CisgICAgfS8vR0VOLUxBU1Q6ZXZlbnRfcGFzc2VkQnRuQWN0aW9uUGVyZm9ybWVkCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAgZG9uZSA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgamF2YS5hd3QuRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbmV3IFRyYW5zbHVjZW50U2hhcGVkRnJhbWVUZXN0KCkuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkb25lLmF3YWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7fQorICAgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBGQUlMRUQiKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgUEFTU0VEIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRWZmZWN0cygpIHsKKyAgICAgICAgR3JhcGhpY3NEZXZpY2UgZ2QgPSBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKS5nZXREZXZpY2UoKTsKKyAgICAgICAgaWYgKCFnZC5pc1dpbmRvd1RyYW5zbHVjZW5jeVN1cHBvcnRlZChXaW5kb3dUcmFuc2x1Y2VuY3kuUEVSUElYRUxfVFJBTlNQQVJFTlQpKSB7CisgICAgICAgICAgICBzaGFwZWRDYi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdkLmlzV2luZG93VHJhbnNsdWNlbmN5U3VwcG9ydGVkKFdpbmRvd1RyYW5zbHVjZW5jeS5UUkFOU0xVQ0VOVCkpIHsKKyAgICAgICAgICAgIHRyYW5zcGFyZW5jeVNsZC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdkLmlzV2luZG93VHJhbnNsdWNlbmN5U3VwcG9ydGVkKFdpbmRvd1RyYW5zbHVjZW5jeS5QRVJQSVhFTF9UUkFOU0xVQ0VOVCkpIHsKKyAgICAgICAgICAgIG5vbk9wYXF1ZUNoYi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhcmlhYmxlcyBkZWNsYXJhdGlvbiAtIGRvIG5vdCBtb2RpZnkvL0dFTi1CRUdJTjp2YXJpYWJsZXMKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwIGNyZWF0ZURpc3Bvc2VHcnA7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KVG9nZ2xlQnV0dG9uIGNyZWF0ZUZyYW1lQnRuOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSlRvZ2dsZUJ1dHRvbiBkaXNwb3NlRnJhbWVCdG47CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KQnV0dG9uIGZhaWxlZEJ0bjsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpMYWJlbCBqTGFiZWwxOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkxhYmVsIGpMYWJlbDI7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZSBqU2Nyb2xsUGFuZTE7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KVGV4dEFyZWEgalRleHRBcmVhMTsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpDaGVja0JveCBub25PcGFxdWVDaGI7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KQnV0dG9uIHBhc3NlZEJ0bjsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpDaGVja0JveCBzaGFwZWRDYjsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpTbGlkZXIgdHJhbnNwYXJlbmN5U2xkOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkNoZWNrQm94IHVzZVN3aW5nQ2I7CisgICAgLy8gRW5kIG9mIHZhcmlhYmxlcyBkZWNsYXJhdGlvbi8vR0VOLUVORDp2YXJpYWJsZXMKKworfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvaW1hZ2UvQ29udm9sdmVPcC9FZGdlTm9PcENyYXNoLmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9pbWFnZS9Db252b2x2ZU9wL0VkZ2VOb09wQ3Jhc2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTFkMmViCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS9hd3QvaW1hZ2UvQ29udm9sdmVPcC9FZGdlTm9PcENyYXNoLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyAgICAgNjcyNjc3OQorICogQHN1bW1hcnkgVGVzdCB2ZXJpZmllcyB0aGF0IENvbnZvbHZlT3Agd2l0aCB0aGUgRURHRV9OT19PUCBlZGdlIGNvbmRpdGlvbgorICogICAgICAgICAgZG9lcyBub3QgY2F1c2UgSlZNIGNyYXNoIGlmIHNpemUgb2Ygc291cmNlIHJhc3RlciBlbGVtZW50cyBpcworICogICAgICAgICAgZ3JlYXRoZXIgdGhhbiBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiByYXN0ZXIgZWxlbWVudC4KKyAqCisgKiBAcnVuICAgICBtYWluIEVkZ2VOb09wQ3Jhc2gKKyAqLworaW1wb3J0IGphdmEuYXd0LlBvaW50OworaW1wb3J0IGphdmEuYXd0LmltYWdlLkNvbnZvbHZlT3A7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuRGF0YUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5JbWFnaW5nT3BFeGNlcHRpb247CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuS2VybmVsOworaW1wb3J0IGphdmEuYXd0LmltYWdlLlJhc3RlcjsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5Xcml0YWJsZVJhc3RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgRWRnZU5vT3BDcmFzaCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHcgPSAzMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBoID0gMjAwOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBjcmFzaFRlc3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNyYXNoVGVzdCgpIHsKKyAgICAgICAgUmFzdGVyIHNyYyA9IGNyZWF0ZVNyY1Jhc3RlcigpOworICAgICAgICBXcml0YWJsZVJhc3RlciBkc3QgPSBjcmVhdGVEc3RSYXN0ZXIoKTsKKyAgICAgICAgQ29udm9sdmVPcCBvcCA9IGNyZWF0ZUNvbnZvbHZlT3AoQ29udm9sdmVPcC5FREdFX05PX09QKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wLmZpbHRlcihzcmMsIGRzdCk7CisgICAgICAgIH0gY2F0Y2ggKEltYWdpbmdPcEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHRlc3QgcGFpciBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJhc3RlcnMKKyAgICAgICAgICAgICAqIG1heSBjYXVzZSBmYWlsdXJlIG9mIHRoZSBtZWRpYWxpYiBjb252b2x1dGlvbiByb3V0aW5lLAorICAgICAgICAgICAgICogc28gdGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIEpWTSBjcmFzaCBpcyB0aGUgb25seSBtYW5pZmVzdGF0aW9uIG9mIHRoaXMKKyAgICAgICAgICAgICAqIHRlc3QgZmFpbHVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBQQVNTRUQuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmFzdGVyIGNyZWF0ZVNyY1Jhc3RlcigpIHsKKyAgICAgICAgV3JpdGFibGVSYXN0ZXIgciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfVVNIT1JULAorICAgICAgICAgICAgICAgIHcsIGgsIDQsIG5ldyBQb2ludCgwLCAwKSk7CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlRHN0UmFzdGVyKCkgeworICAgICAgICBXcml0YWJsZVJhc3RlciByID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgIHcsIGgsIDQsIG5ldyBQb2ludCgwLCAwKSk7CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udm9sdmVPcCBjcmVhdGVDb252b2x2ZU9wKGludCBlZGdlSGludCkgeworICAgICAgICBmaW5hbCBpbnQga3cgPSAzOworICAgICAgICBmaW5hbCBpbnQga2ggPSAzOworICAgICAgICBmbG9hdFtdIGtkYXRhID0gbmV3IGZsb2F0W2t3ICoga2hdOworICAgICAgICBmbG9hdCB2ID0gMWYgLyBrZGF0YS5sZW5ndGg7CisgICAgICAgIEFycmF5cy5maWxsKGtkYXRhLCB2KTsKKworICAgICAgICBLZXJuZWwgayA9IG5ldyBLZXJuZWwoa3csIGtoLCBrZGF0YSk7CisgICAgICAgIENvbnZvbHZlT3Agb3AgPSBuZXcgQ29udm9sdmVPcChrLCBlZGdlSGludCwgbnVsbCk7CisKKyAgICAgICAgcmV0dXJuIG9wOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2xhbmcvQ2xhc3MvZ2V0RW5jbG9zaW5nQ29uc3RydWN0b3IvRW5jbG9zaW5nQ29uc3RydWN0b3JUZXN0cy5qYXZhIGIvamRrL3Rlc3QvamF2YS9sYW5nL0NsYXNzL2dldEVuY2xvc2luZ0NvbnN0cnVjdG9yL0VuY2xvc2luZ0NvbnN0cnVjdG9yVGVzdHMuamF2YQppbmRleCBmZTk2M2ZiLi4zZWFlNzczIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL2xhbmcvQ2xhc3MvZ2V0RW5jbG9zaW5nQ29uc3RydWN0b3IvRW5jbG9zaW5nQ29uc3RydWN0b3JUZXN0cy5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvbGFuZy9DbGFzcy9nZXRFbmNsb3NpbmdDb25zdHJ1Y3Rvci9FbmNsb3NpbmdDb25zdHJ1Y3RvclRlc3RzLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIAogLyoKICAqIEB0ZXN0Ci0gKiBAYnVnIDQ5NjIzNDEKKyAqIEBidWcgNDk2MjM0MSA2ODMyNTU3CiAgKiBAc3VtbWFyeSBDaGVjayBnZXRFbmNsb3NpbmdNZXRob2QgbWV0aG9kCiAgKiBAYXV0aG9yIEpvc2VwaCBELiBEYXJjeQogICovCkBAIC01Nyw4ICs1Nyw4IEBACiAgICAgfQogCiAKLSAgICBzdGF0aWMgaW50IGV4YW1pbmUoQ2xhc3MgZW5jbG9zZWRDbGFzcywgU3RyaW5nIGNvbnN0cnVjdG9yU2lnKSB7Ci0gICAgICAgIENvbnN0cnVjdG9yIGMgPSBlbmNsb3NlZENsYXNzLmdldEVuY2xvc2luZ0NvbnN0cnVjdG9yKCk7CisgICAgc3RhdGljIGludCBleGFtaW5lKENsYXNzPD8+IGVuY2xvc2VkQ2xhc3MsIFN0cmluZyBjb25zdHJ1Y3RvclNpZykgeworICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjID0gZW5jbG9zZWRDbGFzcy5nZXRFbmNsb3NpbmdDb25zdHJ1Y3RvcigpOwogICAgICAgICBpZiAoYyA9PSBudWxsICYmIGNvbnN0cnVjdG9yU2lnID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9sYW5nL2luc3RydW1lbnQvUGFyYWxsZWxUcmFuc2Zvcm1lckxvYWRlci5zaCBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnN0cnVtZW50L1BhcmFsbGVsVHJhbnNmb3JtZXJMb2FkZXIuc2gKaW5kZXggY2FiMDgxYS4uZjVjZDIzNCAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9sYW5nL2luc3RydW1lbnQvUGFyYWxsZWxUcmFuc2Zvcm1lckxvYWRlci5zaAorKysgYi9qZGsvdGVzdC9qYXZhL2xhbmcvaW5zdHJ1bWVudC9QYXJhbGxlbFRyYW5zZm9ybWVyTG9hZGVyLnNoCkBAIC0yMyw2ICsyMyw3IEBACiAKICMgQHRlc3QKICMgQGJ1ZyA1MDg4Mzk4CisjIEBpZ25vcmUgdW50aWwgYnVnIDY4MzUyMzMgZGVhbHQgd2l0aAogIyBAc3VtbWFyeSBUZXN0IHBhcmFsbGVsIGNsYXNzIGxvYWRpbmcgYnkgcGFyYWxsZWwgdHJhbnNmb3JtZXJzLgogIyBAYXV0aG9yIERhbmllbCBELiBEYXVnaGVydHkgYXMgbW9kaWZpZWQgZnJvbSB0aGUgY29kZSBvZiBEYXJ5bCBQdXJ5ZWFyIEAgV2lseQogIwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9sYW5nL21hbmFnZW1lbnQvVGhyZWFkTVhCZWFuL1RocmVhZFN0YXRlVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YS9sYW5nL21hbmFnZW1lbnQvVGhyZWFkTVhCZWFuL1RocmVhZFN0YXRlVGVzdC5qYXZhCmluZGV4IDEzZjg0MWMuLjQ2NDM2YTggMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbGFuZy9tYW5hZ2VtZW50L1RocmVhZE1YQmVhbi9UaHJlYWRTdGF0ZVRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL2xhbmcvbWFuYWdlbWVudC9UaHJlYWRNWEJlYW4vVGhyZWFkU3RhdGVUZXN0LmphdmEKQEAgLTIzLDcgKzIzLDggQEAKIAogLyoKICAqIEB0ZXN0Ci0gKiBAYnVnICAgICA0OTY3MjgzCisgKiBAYnVnICAgICA0OTY3MjgzIDUwODAyMDMKKyAqIEBpZ25vcmUgIER1ZSB0byA1MDgwMjAzLCBjYW5ub3QgcmVseSBvbiB0aGlzIHRlc3QgYWx3YXlzIHBhc3NpbmcuCiAgKiBAc3VtbWFyeSBCYXNpYyB1bml0IHRlc3Qgb2YgdGhyZWFkIHN0YXRlcyByZXR1cm5lZCBieQogICogICAgICAgICAgVGhyZWFkTVhCZWFuLmdldFRocmVhZEluZm8uZ2V0VGhyZWFkU3RhdGUoKS4KICAqICAgICAgICAgIEl0IGFsc28gdGVzdHMgbG9jayBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBUaHJlYWRJbmZvLgpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljLVguamF2YSBiL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpYy1YLmphdmEKaW5kZXggZDRlMWEyNy4uNjYxMjc3MSAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljLVguamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWMtWC5qYXZhCkBAIC0zNjUsOCArMzY1LDExIEBACiAKICAgICAgICAgYi5wb3NpdGlvbigyKTsKICAgICAgICAgY2soYiwgYi5jaGFyQXQoMSksICdkJyk7Ci0gICAgICAgIENoYXJCdWZmZXIgYyA9IChDaGFyQnVmZmVyKWIuc3ViU2VxdWVuY2UoMSwgNCk7Ci0gICAgICAgIGNrKGIsIGIuc3ViU2VxdWVuY2UoMSwgNCkudG9TdHJpbmcoKS5lcXVhbHMoImRlZiIpKTsKKyAgICAgICAgQ2hhckJ1ZmZlciBjID0gYi5zdWJTZXF1ZW5jZSgxLCA0KTsKKyAgICAgICAgY2soYywgYy5jYXBhY2l0eSgpLCBiLmNhcGFjaXR5KCkpOworICAgICAgICBjayhjLCBjLnBvc2l0aW9uKCksIGIucG9zaXRpb24oKSsxKTsKKyAgICAgICAgY2soYywgYy5saW1pdCgpLCBiLnBvc2l0aW9uKCkrNCk7CisgICAgICAgIGNrKGMsIGIuc3ViU2VxdWVuY2UoMSwgNCkudG9TdHJpbmcoKS5lcXVhbHMoImRlZiIpKTsKIAogICAgICAgICAvLyA0OTM4NDI0CiAgICAgICAgIGIucG9zaXRpb24oNCk7CkBAIC03MjIsNiArNzI1LDggQEAKICAgICAgICAgY2soYiwgc3RhcnQsIGIucG9zaXRpb24oKSk7CiAgICAgICAgIGNrKGIsIGVuZCwgYi5saW1pdCgpKTsKICAgICAgICAgY2soYiwgcy5sZW5ndGgoKSwgYi5jYXBhY2l0eSgpKTsKKyAgICAgICAgYi5wb3NpdGlvbig2KTsKKyAgICAgICAgY2soYiwgYi5zdWJTZXF1ZW5jZSgwLDMpLnRvU3RyaW5nKCkuZXF1YWxzKCJnaGkiKSk7CiAKICAgICAgICAgLy8gVGhlIGluZGV4LCByZWxhdGl2ZSB0byB0aGUgcG9zaXRpb24sIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZAogICAgICAgICAvLyBzbWFsbGVyIHRoYW4gcmVtYWluaW5nKCkuCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWMuamF2YSBiL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpYy5qYXZhCmluZGV4IGMwYzQyMGYuLmI4ZWQ4OWIgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpYy5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpYy5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBAc3VtbWFyeSBVbml0IHRlc3QgZm9yIGJ1ZmZlcnMKICAqIEBidWcgNDQxMzEzNSA0NDE0OTExIDQ0MTY1MzYgNDQxNjU2MiA0NDE4NzgyIDQ0NzEwNTMgNDQ3Mjc3OSA0NDkwMjUzIDQ1MjM3MjUKICAqICAgICAgNDUyNjE3NyA0NDYzMDExIDQ2NjA2NjAgNDY2MTIxOSA0NjYzNTIxIDQ3ODI5NzAgNDgwNDMwNCA0OTM4NDI0IDYyMzE1MjkKLSAqICAgICAgNjIyMTEwMSA2MjM0MjYzIDY1MzU1NDIgNjU5MTk3MSA2NTkzOTQ2CisgKiAgICAgIDYyMjExMDEgNjIzNDI2MyA2NTM1NTQyIDY1OTE5NzEgNjU5Mzk0NiA2Nzk1NTYxCiAgKiBAYXV0aG9yIE1hcmsgUmVpbmhvbGQKICAqLwogCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNCeXRlLmphdmEgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNCeXRlLmphdmEKaW5kZXggMGY1YWM2Zi4uN2UyNTlhMSAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljQnl0ZS5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpY0J5dGUuamF2YQpAQCAtMzc1LDYgKzM3NSw5IEBACiAKIAogCisKKworCiAgICAgICAgIC8vIENvbXBhY3QKIAogICAgICAgICByZWxQdXQoYik7CkBAIC03ODYsNiArNzg5LDggQEAKIAogCiAKKworCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3QoZmluYWwgYnl0ZSBbXSBiYSkgewogICAgICAgICBpbnQgb2Zmc2V0ID0gNDc7CiAgICAgICAgIGludCBsZW5ndGggPSA5MDA7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNDaGFyLmphdmEgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNDaGFyLmphdmEKaW5kZXggMjhlYjQ5Zi4uYTBkZjlmYyAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljQ2hhci5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpY0NoYXIuamF2YQpAQCAtMzY1LDggKzM2NSwxMSBAQAogCiAgICAgICAgIGIucG9zaXRpb24oMik7CiAgICAgICAgIGNrKGIsIGIuY2hhckF0KDEpLCAnZCcpOwotICAgICAgICBDaGFyQnVmZmVyIGMgPSAoQ2hhckJ1ZmZlciliLnN1YlNlcXVlbmNlKDEsIDQpOwotICAgICAgICBjayhiLCBiLnN1YlNlcXVlbmNlKDEsIDQpLnRvU3RyaW5nKCkuZXF1YWxzKCJkZWYiKSk7CisgICAgICAgIENoYXJCdWZmZXIgYyA9IGIuc3ViU2VxdWVuY2UoMSwgNCk7CisgICAgICAgIGNrKGMsIGMuY2FwYWNpdHkoKSwgYi5jYXBhY2l0eSgpKTsKKyAgICAgICAgY2soYywgYy5wb3NpdGlvbigpLCBiLnBvc2l0aW9uKCkrMSk7CisgICAgICAgIGNrKGMsIGMubGltaXQoKSwgYi5wb3NpdGlvbigpKzQpOworICAgICAgICBjayhjLCBiLnN1YlNlcXVlbmNlKDEsIDQpLnRvU3RyaW5nKCkuZXF1YWxzKCJkZWYiKSk7CiAKICAgICAgICAgLy8gNDkzODQyNAogICAgICAgICBiLnBvc2l0aW9uKDQpOwpAQCAtNzIyLDYgKzcyNSw4IEBACiAgICAgICAgIGNrKGIsIHN0YXJ0LCBiLnBvc2l0aW9uKCkpOwogICAgICAgICBjayhiLCBlbmQsIGIubGltaXQoKSk7CiAgICAgICAgIGNrKGIsIHMubGVuZ3RoKCksIGIuY2FwYWNpdHkoKSk7CisgICAgICAgIGIucG9zaXRpb24oNik7CisgICAgICAgIGNrKGIsIGIuc3ViU2VxdWVuY2UoMCwzKS50b1N0cmluZygpLmVxdWFscygiZ2hpIikpOwogCiAgICAgICAgIC8vIFRoZSBpbmRleCwgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uLCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQKICAgICAgICAgLy8gc21hbGxlciB0aGFuIHJlbWFpbmluZygpLgpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljRG91YmxlLmphdmEgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNEb3VibGUuamF2YQppbmRleCBiMmExYmU2Li5hNjI3ZDBlIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNEb3VibGUuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNEb3VibGUuamF2YQpAQCAtMzc1LDYgKzM3NSw5IEBACiAKIAogCisKKworCiAgICAgICAgIC8vIENvbXBhY3QKIAogICAgICAgICByZWxQdXQoYik7CkBAIC03ODYsNiArNzg5LDggQEAKIAogCiAKKworCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3QoZmluYWwgZG91YmxlIFtdIGJhKSB7CiAgICAgICAgIGludCBvZmZzZXQgPSA0NzsKICAgICAgICAgaW50IGxlbmd0aCA9IDkwMDsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpY0Zsb2F0LmphdmEgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNGbG9hdC5qYXZhCmluZGV4IGI2YjVlYTAuLjczMGRjYmUgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpY0Zsb2F0LmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljRmxvYXQuamF2YQpAQCAtMzc1LDYgKzM3NSw5IEBACiAKIAogCisKKworCiAgICAgICAgIC8vIENvbXBhY3QKIAogICAgICAgICByZWxQdXQoYik7CkBAIC03ODYsNiArNzg5LDggQEAKIAogCiAKKworCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3QoZmluYWwgZmxvYXQgW10gYmEpIHsKICAgICAgICAgaW50IG9mZnNldCA9IDQ3OwogICAgICAgICBpbnQgbGVuZ3RoID0gOTAwOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljSW50LmphdmEgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNJbnQuamF2YQppbmRleCA5MzhhZGEyLi5iMjBlNGJiIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNJbnQuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNJbnQuamF2YQpAQCAtMzc1LDYgKzM3NSw5IEBACiAKIAogCisKKworCiAgICAgICAgIC8vIENvbXBhY3QKIAogICAgICAgICByZWxQdXQoYik7CkBAIC03ODYsNiArNzg5LDggQEAKIAogCiAKKworCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3QoZmluYWwgaW50IFtdIGJhKSB7CiAgICAgICAgIGludCBvZmZzZXQgPSA0NzsKICAgICAgICAgaW50IGxlbmd0aCA9IDkwMDsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpY0xvbmcuamF2YSBiL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpY0xvbmcuamF2YQppbmRleCAxNzUzN2E3Li4wZDRjNTY4IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNMb25nLmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljTG9uZy5qYXZhCkBAIC0zNzUsNiArMzc1LDkgQEAKIAogCiAKKworCisKICAgICAgICAgLy8gQ29tcGFjdAogCiAgICAgICAgIHJlbFB1dChiKTsKQEAgLTc4Niw2ICs3ODksOCBAQAogCiAKIAorCisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdChmaW5hbCBsb25nIFtdIGJhKSB7CiAgICAgICAgIGludCBvZmZzZXQgPSA0NzsKICAgICAgICAgaW50IGxlbmd0aCA9IDkwMDsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpY1Nob3J0LmphdmEgYi9qZGsvdGVzdC9qYXZhL25pby9CdWZmZXIvQmFzaWNTaG9ydC5qYXZhCmluZGV4IGRjOWM3ZGIuLjU4ZTVhM2UgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbmlvL0J1ZmZlci9CYXNpY1Nob3J0LmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS9uaW8vQnVmZmVyL0Jhc2ljU2hvcnQuamF2YQpAQCAtMzc1LDYgKzM3NSw5IEBACiAKIAogCisKKworCiAgICAgICAgIC8vIENvbXBhY3QKIAogICAgICAgICByZWxQdXQoYik7CkBAIC03ODYsNiArNzg5LDggQEAKIAogCiAKKworCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3QoZmluYWwgc2hvcnQgW10gYmEpIHsKICAgICAgICAgaW50IG9mZnNldCA9IDQ3OwogICAgICAgICBpbnQgbGVuZ3RoID0gOTAwOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9uaW8vY2hhbm5lbHMvQXN5bmNocm9ub3VzRmlsZUNoYW5uZWwvQmFzaWMuamF2YSBiL2pkay90ZXN0L2phdmEvbmlvL2NoYW5uZWxzL0FzeW5jaHJvbm91c0ZpbGVDaGFubmVsL0Jhc2ljLmphdmEKaW5kZXggNWZmYjQyYy4uMWYzN2Q0YiAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9uaW8vY2hhbm5lbHMvQXN5bmNocm9ub3VzRmlsZUNoYW5uZWwvQmFzaWMuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL25pby9jaGFubmVscy9Bc3luY2hyb25vdXNGaWxlQ2hhbm5lbC9CYXNpYy5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiAgKi8KIAogLyogQHRlc3QKLSAqIEBidWcgNDYwNzI3MgorICogQGJ1ZyA0NjA3MjcyIDY4MjI2NDMgNjgzMDcyMQogICogQHN1bW1hcnkgVW5pdCB0ZXN0IGZvciBBc3luY2hyb25vdXNGaWxlQ2hhbm5lbAogICovCiAKQEAgLTUxLDcgKzUxLDYgQEAKICAgICAgICAgLy8gcnVuIHRlc3RzCiAgICAgICAgIHRlc3RVc2luZ0NvbXBsZXRpb25IYW5kbGVycyhjaCk7CiAgICAgICAgIHRlc3RVc2luZ1dhaXRPblJlc3VsdChjaCk7Ci0gICAgICAgIHRlc3RMb2NraW5nKGNoKTsKICAgICAgICAgdGVzdEludGVycnVwdEhhbmRsZXJUaHJlYWQoY2gpOwogCiAgICAgICAgIC8vIGNsb3NlIGNoYW5uZWwgYW5kIGludm9rZSB0ZXN0IHRoYXQgZXhwZWN0cyBjaGFubmVsIHRvIGJlIGNsb3NlZApAQCAtNTksNiArNTgsNyBAQAogICAgICAgICB0ZXN0Q2xvc2VkQ2hhbm5lbChjaCk7CiAKICAgICAgICAgLy8gdGhlc2UgdGVzdHMgb3BlbiB0aGUgZmlsZSB0aGVtc2VsdmVzCisgICAgICAgIHRlc3RMb2NraW5nKGJsYWgudG9QYXRoKCkpOwogICAgICAgICB0ZXN0Q3VzdG9tVGhyZWFkUG9vbChibGFoLnRvUGF0aCgpKTsKICAgICAgICAgdGVzdEFzeW5jaHJvbm91c0Nsb3NlKGJsYWgudG9QYXRoKCkpOwogICAgICAgICB0ZXN0Q2FuY2VsKGJsYWgudG9QYXRoKCkpOwpAQCAtMTYwLDQ3ICsxNjAsNTQgQEAKICAgICB9CiAKICAgICAvLyBleGVyY2lzZSBsb2NrIG1ldGhvZHMKLSAgICBzdGF0aWMgdm9pZCB0ZXN0TG9ja2luZyhBc3luY2hyb25vdXNGaWxlQ2hhbm5lbCBjaCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgeworICAgIHN0YXRpYyB2b2lkIHRlc3RMb2NraW5nKFBhdGggZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0TG9ja2luZyIpOwogCi0gICAgICAgIC8vIHRlc3QgMSAtIGFjcXVpcmUgbG9jayBhbmQgY2hlY2sgdGhhdCB0cnlMb2NrIHRocm93cwotICAgICAgICAvLyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uCisgICAgICAgIEFzeW5jaHJvbm91c0ZpbGVDaGFubmVsIGNoID0gQXN5bmNocm9ub3VzRmlsZUNoYW5uZWwKKyAgICAgICAgICAgIC5vcGVuKGZpbGUsIFJFQUQsIFdSSVRFKTsKICAgICAgICAgRmlsZUxvY2sgZmw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmbCA9IGNoLmxvY2soKS5nZXQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHgpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2hvdWxkIG5vdCBiZSBpbnRlcnJ1cHRlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZmwuYWNxdWlyZWRCeSgpLmVxdWFscyhjaCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmlsZUxvY2sjYWNxdWlyZWRCeSByZXR1cm5lZCBpbmNvcnJlY3QgY2hhbm5lbCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2gudHJ5TG9jaygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24gZXhwZWN0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbiB4KSB7Ci0gICAgICAgIH0KLSAgICAgICAgZmwucmVsZWFzZSgpOworICAgICAgICAgICAgLy8gdGVzdCAxIC0gYWNxdWlyZSBsb2NrIGFuZCBjaGVjayB0aGF0IHRyeUxvY2sgdGhyb3dzCisgICAgICAgICAgICAvLyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZsID0gY2gubG9jaygpLmdldCgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2hvdWxkIG5vdCBiZSBpbnRlcnJ1cHRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmbC5hY3F1aXJlZEJ5KCkuZXF1YWxzKGNoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmlsZUxvY2sjYWNxdWlyZWRCeSByZXR1cm5lZCBpbmNvcnJlY3QgY2hhbm5lbCIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaC50cnlMb2NrKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24geCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmwucmVsZWFzZSgpOwogCi0gICAgICAgIC8vIHRlc3QgMiAtIGFjcXVpcmUgdHJ5IGFuZCBjaGVjayB0aGF0IGxvY2sgdGhyb3dzIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24KLSAgICAgICAgZmwgPSBjaC50cnlMb2NrKCk7Ci0gICAgICAgIGlmIChmbCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBhY3F1aXJlIGxvY2siKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoLmxvY2sobnVsbCwgbmV3IENvbXBsZXRpb25IYW5kbGVyPEZpbGVMb2NrLFZvaWQ+ICgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoRmlsZUxvY2sgcmVzdWx0LCBWb2lkIGF0dCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIGV4YywgVm9pZCBhdHQpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsbGVkKFZvaWQgYXR0KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbiBleHBlY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIC8vIHRlc3QgMiAtIGFjcXVpcmUgdHJ5IGFuZCBjaGVjayB0aGF0IGxvY2sgdGhyb3dzIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24KKyAgICAgICAgICAgIGZsID0gY2gudHJ5TG9jaygpOworICAgICAgICAgICAgaWYgKGZsID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBhY3F1aXJlIGxvY2siKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2gubG9jayhudWxsLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8RmlsZUxvY2ssVm9pZD4gKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoRmlsZUxvY2sgcmVzdWx0LCBWb2lkIGF0dCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgZXhjLCBWb2lkIGF0dCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbGxlZChWb2lkIGF0dCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24geCkgeworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2guY2xvc2UoKTsKICAgICAgICAgfQotICAgICAgICBmbC5yZWxlYXNlKCk7CisKKyAgICAgICAgLy8gdGVzdCAzIC0gY2hhbm5lbCBpcyBjbG9zZWQgc28gRmlsZUxvY2sgc2hvdWxkIG5vIGxvbmdlciBiZSB2YWxpZAorICAgICAgICBpZiAoZmwuaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZpbGVMb2NrIGV4cGVjdGVkIHRvIGJlIGludmFsaWQiKTsKICAgICB9CiAKICAgICAvLyBpbnRlcnJ1cHQgc2hvdWxkIG5vdCBjbG9zZSBjaGFubmVsCkBAIC00MjQsMTAgKzQzMSwxMSBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpc0NhbmNlbGxlZCBub3QgY29uc2lzdGVudCIpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXMuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxsZWQpCisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbmNlbGxhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCIpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgICAgIGlmICghY2FuY2VsbGVkKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIG5vdCBleHBlY3RlZCIpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih4KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHgpIHsKQEAgLTQzNSw5ICs0NDMsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmVzLmdldCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbmNlbGxhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCIpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgICAgIGlmICghY2FuY2VsbGVkKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIG5vdCBleHBlY3RlZCIpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih4KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24geCkgewpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9uaW8vY2hhbm5lbHMvQXN5bmNocm9ub3VzRmlsZUNoYW5uZWwvTG9jay5qYXZhIGIvamRrL3Rlc3QvamF2YS9uaW8vY2hhbm5lbHMvQXN5bmNocm9ub3VzRmlsZUNoYW5uZWwvTG9jay5qYXZhCmluZGV4IDM4YzBmN2QuLmY4YjU1Y2MgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbmlvL2NoYW5uZWxzL0FzeW5jaHJvbm91c0ZpbGVDaGFubmVsL0xvY2suamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL25pby9jaGFubmVscy9Bc3luY2hyb25vdXNGaWxlQ2hhbm5lbC9Mb2NrLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIAogCiAvKiBAdGVzdAotICogQGJ1ZyA0NjA3MjcyCisgKiBAYnVnIDQ2MDcyNzIgNjgxNDk0OAogICogQHN1bW1hcnkgVW5pdCB0ZXN0IGZvciBBc3luY2hyb25vdXNGaWxlQ2hhbm5lbCNsb2NrIG1ldGhvZAogICovCiAKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVDaGFubmVsL1JlbGVhc2VPbkNsb3NlRGVhZGxvY2suamF2YSBiL2pkay90ZXN0L2phdmEvbmlvL2NoYW5uZWxzL0ZpbGVDaGFubmVsL1JlbGVhc2VPbkNsb3NlRGVhZGxvY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2VkMTZhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWwvUmVsZWFzZU9uQ2xvc2VEZWFkbG9jay5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKiBAdGVzdAorICogQGJ1ZyA2NTQzODYzCisgKiBAc3VtbWFyeSBUcnkgdG8gY2F1c2UgYSBkZWFkbG9jayBiZXR3ZWVuIChBc3luY2hyb25vdXMpRmlsZUNoYW5uZWwuY2xvc2UKKyAqICAgYW5kIEZpbGVMb2NrLnJlbGVhc2UKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb24uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CisKK3B1YmxpYyBjbGFzcyBSZWxlYXNlT25DbG9zZURlYWRsb2NrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19DT1VOVCA9IDEwMjQ7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGJsYWggPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJibGFoIiwgbnVsbCk7CisgICAgICAgIGJsYWguZGVsZXRlT25FeGl0KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTwxMDA7IGkrKykgeworICAgICAgICAgICAgdGVzdChibGFoLnRvUGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHRlc3QoUGF0aCBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlTG9ja1tdIGxvY2tzID0gbmV3IEZpbGVMb2NrW0xPQ0tfQ09VTlRdOworCisgICAgICAgIEZpbGVDaGFubmVsIGZjID0gRmlsZUNoYW5uZWwub3BlbihmaWxlLCBSRUFELCBXUklURSk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxMT0NLX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIGxvY2tzW2ldID0gZmMubG9jayhpLCAxLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICB0cnlUb0RlYWRsb2NrKGZjLCBsb2Nrcyk7CisKKyAgICAgICAgQXN5bmNocm9ub3VzRmlsZUNoYW5uZWwgY2ggPSBBc3luY2hyb25vdXNGaWxlQ2hhbm5lbC5vcGVuKGZpbGUsIFJFQUQsIFdSSVRFKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPExPQ0tfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb2Nrc1tpXSA9IGNoLmxvY2soaSwgMSwgdHJ1ZSwgbnVsbCwgbnVsbCkuZ2V0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oeCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeVRvRGVhZGxvY2soY2gsIGxvY2tzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0cnlUb0RlYWRsb2NrKGZpbmFsIENoYW5uZWwgY2hhbm5lbCwgRmlsZUxvY2tbXSBsb2NrcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBzdGFydCB0aHJlYWQgdG8gY2xvc2UgdGhlIGZpbGUgKGFuZCBpbnZhbGlkYXRlIHRoZSBsb2NrcykKKyAgICAgICAgVGhyZWFkIGNsb3NlciA9IG5ldyBUaHJlYWQoCisgICAgICAgICAgICBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgY2xvc2VyLnN0YXJ0KCk7CisKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgbG9ja3MgZXhwbGljaXRseQorICAgICAgICBmb3IgKGludCBpPTA7IGk8bG9ja3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9ja3NbaV0ucmVsZWFzZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiBpZ25vcmUpIHsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gd2UgYXJlIGRvbmUgd2hlbiBjbG9zZXIgaGFzIHRlcm1pbmF0ZWQKKyAgICAgICAgd2hpbGUgKGNsb3Nlci5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xvc2VyLmpvaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgeyB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0NsYXNzTG9hZGVyRGVhZGxvY2svRGVhZGxvY2syLmphdmEgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0NsYXNzTG9hZGVyRGVhZGxvY2svRGVhZGxvY2syLmphdmEKaW5kZXggYjU5MzhkMS4uM2FiMjI4MCAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9DbGFzc0xvYWRlckRlYWRsb2NrL0RlYWRsb2NrMi5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQ2xhc3NMb2FkZXJEZWFkbG9jay9EZWFkbG9jazIuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CiAKICAgICAgICAgVGhyZWFkIHRocmVhZDEgPSBuZXcgVGhyZWFkKHJlYWRPYmplY3RSdW5uYWJsZSwgIlJlYWQgT2JqZWN0Iik7CiAgICAgICAgIFRocmVhZCB0aHJlYWQyID0gbmV3IFRocmVhZCh4bWxSdW5uYWJsZSwgIlhNTCIpOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9DbGFzc0xvYWRlckRlYWRsb2NrL0RlYWRsb2NrMi5zaCBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQ2xhc3NMb2FkZXJEZWFkbG9jay9EZWFkbG9jazIuc2gKaW5kZXggNzUwZTJhNy4uMTY5ODE5ZiAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9DbGFzc0xvYWRlckRlYWRsb2NrL0RlYWRsb2NrMi5zaAorKysgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0NsYXNzTG9hZGVyRGVhZGxvY2svRGVhZGxvY2syLnNoCkBAIC0yNiw2ICsyNiw3IEBACiAKICMgQHRlc3QKICMgQGJ1ZyA2NDQwODQ2CisjIEBpZ25vcmUgdW50aWwgNjIwMzgxNiBpcyBkZWFsdCB3aXRoLgogIyBAc3VtbWFyeSBtYWtlIHN1cmUgd2UgZG8gbm90IGRlYWRsb2NrIGJldHdlZW4gRXh0Q2xhc3NMb2FkZXIgYW5kIEFwcENsYXNzTG9hZGVyCiAjIEBhdXRob3IgVmFsZXJpZSBQZW5nCiAjIEBydW4gc2hlbGwvdGltZW91dD0yMCBEZWFkbG9jazIuc2gKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlclN1YmNsYXNzLmphdmEgYi9qZGsvdGVzdC9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXJTdWJjbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMThmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXJTdWJjbGFzcy5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgR29vZ2xlLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogQHRlc3QKKyAqIEBidWcgNjgzMDIyMCA2Mjc4MDE0CisgKiBAc3VtbWFyeSBUZXN0IExvZ2dlciBzdWJjbGFzc2VzCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworcHVibGljIGNsYXNzIExvZ2dlclN1YmNsYXNzIHsKKyAgICB2b2lkIHRlc3QoU3RyaW5nW10gYXJncykgeworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJteUxvZ2dlciI7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIm15TWVzc2FnZSI7CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgZ2V0SGFuZGxlckNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIGZpbmFsIEF0b21pY0xvbmcgbGFzdFNlcXVlbmNlTnVtYmVyID0gbmV3IEF0b21pY0xvbmcoLTFMKTsKKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBsYXN0VGhyZWFkSUQgPSBuZXcgQXRvbWljSW50ZWdlcigtMSk7CisgICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBuZXcgTG9nZ2VyKG5hbWUsIG51bGwpIHsKKyAgICAgICAgICAgIHB1YmxpYyBIYW5kbGVyW10gZ2V0SGFuZGxlcnMoKSB7CisgICAgICAgICAgICAgICAgZ2V0SGFuZGxlckNvdW50LmdldEFuZEluY3JlbWVudCgpOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRIYW5kbGVycygpOworICAgICAgICAgICAgfX07CisgICAgICAgIGVxdWFsKGxvZ2dlci5nZXROYW1lKCksIG5hbWUpOworICAgICAgICBlcXVhbChsb2dnZXIuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgbnVsbCk7CisgICAgICAgIGVxdWFsKGxvZ2dlci5nZXRGaWx0ZXIoKSwgbnVsbCk7CisgICAgICAgIGVxdWFsKGxvZ2dlci5nZXRMZXZlbCgpLCBudWxsKTsKKyAgICAgICAgY2hlY2sobG9nZ2VyLmlzTG9nZ2FibGUoTGV2ZWwuV0FSTklORykpOworICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkge30KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkge30KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2goTG9nUmVjb3JkIGwpIHsKKyAgICAgICAgICAgICAgICBlcXVhbChsLmdldExvZ2dlck5hbWUoKSwgbmFtZSk7CisgICAgICAgICAgICAgICAgZXF1YWwobC5nZXRNZXNzYWdlKCksIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGVxdWFsKGwuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgZXF1YWwobC5nZXRTb3VyY2VDbGFzc05hbWUoKSwgIkxvZ2dlclN1YmNsYXNzIik7CisgICAgICAgICAgICAgICAgZXF1YWwobC5nZXRTb3VyY2VNZXRob2ROYW1lKCksICJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgZXF1YWwobC5nZXRUaHJvd24oKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgZXF1YWwobC5nZXRMZXZlbCgpLCBMZXZlbC5XQVJOSU5HKTsKKworICAgICAgICAgICAgICAgIGlmIChsYXN0U2VxdWVuY2VOdW1iZXIuZ2V0KCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXF1YWwobGFzdFNlcXVlbmNlTnVtYmVyLmdldCgpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbC5nZXRTZXF1ZW5jZU51bWJlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgZXF1YWwobGFzdFRocmVhZElELmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsLmdldFRocmVhZElEKCkpOworICAgICAgICAgICAgICAgICAgICBlcXVhbCgoaW50KSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGwuZ2V0VGhyZWFkSUQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RTZXF1ZW5jZU51bWJlci5zZXQobC5nZXRTZXF1ZW5jZU51bWJlcigpKTsKKyAgICAgICAgICAgICAgICBsYXN0VGhyZWFkSUQuc2V0KGwuZ2V0VGhyZWFkSUQoKSk7CisgICAgICAgICAgICB9fSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBsb2dnZXIud2FybmluZyhtZXNzYWdlKTsgLy8gU2hvdWxkIGludm9rZSBnZXRIYW5kbGVycygpCisgICAgICAgICAgICBlcXVhbChpLCBnZXRIYW5kbGVyQ291bnQuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5mcmFzdHJ1Y3R1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdm9sYXRpbGUgaW50IHBhc3NlZCA9IDAsIGZhaWxlZCA9IDA7CisgICAgdm9pZCBwYXNzKCkge3Bhc3NlZCsrO30KKyAgICB2b2lkIGZhaWwoKSB7ZmFpbGVkKys7IFRocmVhZC5kdW1wU3RhY2soKTt9CisgICAgdm9pZCBmYWlsKFN0cmluZyBtc2cpIHtTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsgZmFpbCgpO30KKyAgICB2b2lkIHVuZXhwZWN0ZWQoVGhyb3dhYmxlIHQpIHtmYWlsZWQrKzsgdC5wcmludFN0YWNrVHJhY2UoKTt9CisgICAgdm9pZCBjaGVjayhib29sZWFuIGNvbmQpIHtpZiAoY29uZCkgcGFzcygpOyBlbHNlIGZhaWwoKTt9CisgICAgdm9pZCBlcXVhbChPYmplY3QgeCwgT2JqZWN0IHkpIHsKKyAgICAgICAgaWYgKHggPT0gbnVsbCA/IHkgPT0gbnVsbCA6IHguZXF1YWxzKHkpKSBwYXNzKCk7CisgICAgICAgIGVsc2UgZmFpbCh4ICsgIiBub3QgZXF1YWwgdG8gIiArIHkpO30KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHtuZXcgTG9nZ2VyU3ViY2xhc3MoKS5pbnN0YW5jZU1haW4oYXJncyk7fQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpIHt0aHJvdyBlLmdldENhdXNlKCk7fX0KKyAgICBwdWJsaWMgdm9pZCBpbnN0YW5jZU1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7dGVzdChhcmdzKTt9IGNhdGNoIChUaHJvd2FibGUgdCkge3VuZXhwZWN0ZWQodCk7fQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJW5QYXNzZWQgPSAlZCwgZmFpbGVkID0gJWQlbiVuIiwgcGFzc2VkLCBmYWlsZWQpOworICAgICAgICBpZiAoZmFpbGVkID4gMCkgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJTb21lIHRlc3RzIGZhaWxlZCIpO30KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dpbmdEZWFkbG9jazIuamF2YSBiL2pkay90ZXN0L2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dpbmdEZWFkbG9jazIuamF2YQppbmRleCA1MGRlNjJhLi5jZjhkNjdmIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nRGVhZGxvY2syLmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2luZ0RlYWRsb2NrMi5qYXZhCkBAIC0yMywxMCArMjMsMTAgQEAKIAogLyoKICAqIEB0ZXN0Ci0gKiBAYnVnICAgICA2NDY3MTUyCi0gKiBAaWdub3JlIHVudGlsIDY3MTYwNzYgaXMgZml4ZWQKKyAqIEBidWcgICAgIDY0NjcxNTIgNjcxNjA3NiA2ODI5NTAzCisgKiBAaWdub3JlIFVudGlsIG1hZGUgbW9yZSBzdGFibGUsIHNlZSA2ODI5NjM2LgogICogQHN1bW1hcnkgZGVhZGxvY2sgb2NjdXJzIGluIExvZ01hbmFnZXIgaW5pdGlhbGl6YXRpb24gYW5kIEpWTSB0ZXJtaW5hdGlvbgotICogQGF1dGhvciAgU2VyZ3VlaSBTcGl0c3luIC8gSGl0dGFjaGkKKyAqIEBhdXRob3IgIFNlcmd1ZWkgU3BpdHN5biAvIEhpdGFjaGkgLyBNYXJ0aW4gQnVjaGhvbHoKICAqCiAgKiBAYnVpbGQgICAgTG9nZ2luZ0RlYWRsb2NrMgogICogQHJ1biAgbWFpbi90aW1lb3V0PTE1IExvZ2dpbmdEZWFkbG9jazIKQEAgLTQ3LDQzICs0NywxOTUgQEAKICAqIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoaXMgYnVnLgogICovCiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ3ljbGljQmFycmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CiAKLXB1YmxpYyBjbGFzcyBMb2dnaW5nRGVhZGxvY2syIGltcGxlbWVudHMgUnVubmFibGUgewotICAgIHN0YXRpYyBmaW5hbCBqYXZhLmlvLlByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7Ci0gICAgc3RhdGljIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHN0YXRpYyBpbnQgYyA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ1tdKSB7Ci0gICAgICAgIG91dC5wcmludGxuKCJcblRoaXMgdGVzdCBjaGVja3MgdGhhdCB0aGVyZSBpcyBubyBkZWFkbG9jay4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oIklmIG5vdCBjcmFzaGVkIG9yIHRpbWVkLW91dCB0aGVuIGl0IGlzIHBhc3NlZC4iKTsKK3B1YmxpYyBjbGFzcyBMb2dnaW5nRGVhZGxvY2syIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWFsTWFpbihTdHJpbmcgYXJnW10pIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgTG9nZ2luZ0RlYWRsb2NrMigpKS5zdGFydCgpOwotICAgICAgICAgICAgc3luY2hyb25pemVkKGxvY2spIHsKLSAgICAgICAgICAgICAgICBjKys7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gMikgbG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGxvY2sud2FpdCgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGphdmFDaGlsZEFyZ3MpOworICAgICAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoamF2YUNoaWxkQXJncyk7CisgICAgICAgICAgICBQcm9jZXNzUmVzdWx0cyByID0gcnVuKHBiLnN0YXJ0KCkpOworICAgICAgICAgICAgZXF1YWwoci5leGl0VmFsdWUoKSwgOTkpOworICAgICAgICAgICAgZXF1YWwoci5vdXQoKSwgIiIpOworICAgICAgICAgICAgZXF1YWwoci5lcnIoKSwgIiIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB1bmV4cGVjdGVkKHQpOyB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXZhQ2hpbGQgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIGZpbmFsIEN5Y2xpY0JhcnJpZXIgc3RhcnRpbmdHYXRlID0gbmV3IEN5Y2xpY0JhcnJpZXIoMik7CisgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGVbXSB0aHJvd24gPSBuZXcgVGhyb3dhYmxlWzFdOworCisgICAgICAgICAgICAvLyBTb21lIHJhbmRvbSB2YXJpYXRpb24sIHRvIGhlbHAgdGlja2xlIHJhY2VzLgorICAgICAgICAgICAgZmluYWwgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZG9qb2luID0gcm5kLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgSklUVEVSID0gMTAyNDsKKyAgICAgICAgICAgIGZpbmFsIGludCBpdGVyczEgPSBybmQubmV4dEludChKSVRURVIpOworICAgICAgICAgICAgZmluYWwgaW50IGl0ZXJzMiA9IEpJVFRFUiAtIGl0ZXJzMTsKKyAgICAgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgICAgICBUaHJlYWQgZXhpdGVyID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ0dhdGUuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcnMxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlci5nZXRBbmRJbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDk5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCg4Nik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9fTsKKyAgICAgICAgICAgIGV4aXRlci5zdGFydCgpOworCisgICAgICAgICAgICBzdGFydGluZ0dhdGUuYXdhaXQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcnMyOyBpKyspCisgICAgICAgICAgICAgICAgY291bnRlci5nZXRBbmRJbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIC8vIFRoaXMgbWF5IG9yIG1heSBub3QgcmVzdWx0IGluIGEgZmlyc3QgY2FsbCB0bworICAgICAgICAgICAgLy8gUnVudGltZS5hZGRTaHV0ZG93bkhvb2sgYWZ0ZXIgc2h1dGRvd24gaGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIGNvbW1lbmNlZC4KICAgICAgICAgICAgIExvZ01hbmFnZXIgbG9nID0gTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCJUZXN0IEZBSUxFRCIpOyAvLyBOb3QgZXhwZWN0ZWQKKworICAgICAgICAgICAgaWYgKGRvam9pbikgeworICAgICAgICAgICAgICAgIGV4aXRlci5qb2luKCk7CisgICAgICAgICAgICAgICAgaWYgKHRocm93blswXSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhyb3duWzBdKTsKKyAgICAgICAgICAgICAgICBjaGVjayhjb3VudGVyLmdldCgpID09IEpJVFRFUik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQobG9jaykgewotICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAyKSBsb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgICAgIGVsc2UgbG9jay53YWl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBUaGUgcmVzdCBvZiB0aGlzIHRlc3QgaXMgY29waWVkIGZyb20gUHJvY2Vzc0J1aWxkZXIvQmFzaWMuamF2YQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBqYXZhRXhlID0KKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSArCisgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImJpbiIgKyBGaWxlLnNlcGFyYXRvciArICJqYXZhIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjbGFzc3BhdGggPQorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IGphdmFDaGlsZEFyZ3MgPQorICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXQorICAgICAgICAgICAgeyBqYXZhRXhlLCAiLWNsYXNzcGF0aCIsIGNsYXNzcGF0aCwKKyAgICAgICAgICAgICAgIkxvZ2dpbmdEZWFkbG9jazIkSmF2YUNoaWxkIn0pOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvY2Vzc1Jlc3VsdHMgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBvdXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVycjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXhpdFZhbHVlOworICAgICAgICBwcml2YXRlIGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGU7CisKKyAgICAgICAgcHVibGljIFByb2Nlc3NSZXN1bHRzKFN0cmluZyBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4aXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICAgICAgdGhpcy5lcnIgPSBlcnI7CisgICAgICAgICAgICB0aGlzLmV4aXRWYWx1ZSA9IGV4aXRWYWx1ZTsKKyAgICAgICAgICAgIHRoaXMudGhyb3dhYmxlID0gdGhyb3dhYmxlOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIlRlc3QgRkFJTEVEIik7IC8vIE5vdCBleHBlY3RlZAorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgb3V0KCkgICAgICAgICAgeyByZXR1cm4gb3V0OyB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZXJyKCkgICAgICAgICAgeyByZXR1cm4gZXJyOyB9CisgICAgICAgIHB1YmxpYyBpbnQgZXhpdFZhbHVlKCkgICAgICAgeyByZXR1cm4gZXhpdFZhbHVlOyB9CisgICAgICAgIHB1YmxpYyBUaHJvd2FibGUgdGhyb3dhYmxlKCkgeyByZXR1cm4gdGhyb3dhYmxlOyB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8U1RET1VUPlxuIiArIG91dCgpICsgIjwvU1RET1VUPlxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCI8U1RERVJSPlxuIiArIGVycigpICsgIjwvU1RERVJSPlxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJleGl0VmFsdWUgPSAiICsgZXhpdFZhbHVlICsgIlxuIik7CisgICAgICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRocm93YWJsZS5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJlYW1BY2N1bXVsYXRvciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHByaXZhdGUgVGhyb3dhYmxlIHRocm93YWJsZSA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFN0cmluZyByZXN1bHQgKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgdGhyb3dhYmxlOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJlYW1BY2N1bXVsYXRvciAoSW5wdXRTdHJlYW0gaXMpIHsKKyAgICAgICAgICAgIHRoaXMuaXMgPSBpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOworICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcls0MDk2XTsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG4gPSByLnJlYWQoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsMCxuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IHQ7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7IGlzLmNsb3NlKCk7IH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgdGhyb3dhYmxlID0gdDsgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc1Jlc3VsdHMgcnVuKFByb2Nlc3MgcCkgeworICAgICAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0gbnVsbDsKKyAgICAgICAgaW50IGV4aXRWYWx1ZSA9IC0xOworICAgICAgICBTdHJpbmcgb3V0ID0gIiI7CisgICAgICAgIFN0cmluZyBlcnIgPSAiIjsKKworICAgICAgICBTdHJlYW1BY2N1bXVsYXRvciBvdXRBY2N1bXVsYXRvciA9CisgICAgICAgICAgICBuZXcgU3RyZWFtQWNjdW11bGF0b3IocC5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgU3RyZWFtQWNjdW11bGF0b3IgZXJyQWNjdW11bGF0b3IgPQorICAgICAgICAgICAgbmV3IFN0cmVhbUFjY3VtdWxhdG9yKHAuZ2V0RXJyb3JTdHJlYW0oKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dEFjY3VtdWxhdG9yLnN0YXJ0KCk7CisgICAgICAgICAgICBlcnJBY2N1bXVsYXRvci5zdGFydCgpOworCisgICAgICAgICAgICBleGl0VmFsdWUgPSBwLndhaXRGb3IoKTsKKworICAgICAgICAgICAgb3V0QWNjdW11bGF0b3Iuam9pbigpOworICAgICAgICAgICAgZXJyQWNjdW11bGF0b3Iuam9pbigpOworCisgICAgICAgICAgICBvdXQgPSBvdXRBY2N1bXVsYXRvci5yZXN1bHQoKTsKKyAgICAgICAgICAgIGVyciA9IGVyckFjY3VtdWxhdG9yLnJlc3VsdCgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3dhYmxlID0gdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUHJvY2Vzc1Jlc3VsdHMob3V0LCBlcnIsIGV4aXRWYWx1ZSwgdGhyb3dhYmxlKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmZyYXN0cnVjdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50IHBhc3NlZCA9IDAsIGZhaWxlZCA9IDA7CisgICAgc3RhdGljIHZvaWQgcGFzcygpIHtwYXNzZWQrKzt9CisgICAgc3RhdGljIHZvaWQgZmFpbCgpIHtmYWlsZWQrKzsgVGhyZWFkLmR1bXBTdGFjaygpO30KKyAgICBzdGF0aWMgdm9pZCBmYWlsKFN0cmluZyBtc2cpIHtTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsgZmFpbCgpO30KKyAgICBzdGF0aWMgdm9pZCB1bmV4cGVjdGVkKFRocm93YWJsZSB0KSB7ZmFpbGVkKys7IHQucHJpbnRTdGFja1RyYWNlKCk7fQorICAgIHN0YXRpYyB2b2lkIGNoZWNrKGJvb2xlYW4gY29uZCkge2lmIChjb25kKSBwYXNzKCk7IGVsc2UgZmFpbCgpO30KKyAgICBzdGF0aWMgdm9pZCBjaGVjayhib29sZWFuIGNvbmQsIFN0cmluZyBtKSB7aWYgKGNvbmQpIHBhc3MoKTsgZWxzZSBmYWlsKG0pO30KKyAgICBzdGF0aWMgdm9pZCBlcXVhbChPYmplY3QgeCwgT2JqZWN0IHkpIHsKKyAgICAgICAgaWYgKHggPT0gbnVsbCA/IHkgPT0gbnVsbCA6IHguZXF1YWxzKHkpKSBwYXNzKCk7CisgICAgICAgIGVsc2UgZmFpbCh4ICsgIiBub3QgZXF1YWwgdG8gIiArIHkpO30KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHtyZWFsTWFpbihhcmdzKTt9IGNhdGNoIChUaHJvd2FibGUgdCkge3VuZXhwZWN0ZWQodCk7fQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJW5QYXNzZWQgPSAlZCwgZmFpbGVkID0gJWQlbiVuIiwgcGFzc2VkLCBmYWlsZWQpOworICAgICAgICBpZiAoZmFpbGVkID4gMCkgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJTb21lIHRlc3RzIGZhaWxlZCIpO30KIH0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvdXRpbC96aXAvWmlwQ29kaW5nLmphdmEgYi9qZGsvdGVzdC9qYXZhL3V0aWwvemlwL1ppcENvZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZWRjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvemlwL1ppcENvZGluZy5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoqCisgKiBAdGVzdAorICogQGJ1ZyA0MjQ0NDk5IDQ1MzIwNDkgNDcwMDk3OCA0ODIwODA3IDQ5ODAwNDIKKyAqIEBzdW1tYXJ5IFRlc3QgWmlwSW5wdXRTdHJlYW0sIFppcE91dHB1dFN0cmVhbSBhbmQgWmlwRmlsZSB3aXRoIG5vbi1VVEY4IGVuY29kaW5nCisgKi8KKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnppcC4qOworCitwdWJsaWMgY2xhc3MgWmlwQ29kaW5nIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHRlc3QoIk1TOTMyIiwKKyAgICAgICAgICAgICAiXHU0ZTAwXHU0ZTAxIiwgIlx1ZmY2N1x1ZmY2OFx1ZmY2OVx1ZmY2YVx1ZmY2Ylx1ZmY2YyIpOworCisgICAgICAgIHRlc3QoImlibTQzNyIsCisgICAgICAgICAgICAgIlx1MDBlNFx1MDBmYyIsICJHZXJtYW4gVW1sYXV0IFx1MDBmYyBpbiBjb21tZW50Iik7CisKKyAgICAgICAgdGVzdCgidXRmLTgiLAorICAgICAgICAgICAgICJcdTRlMDBcdTRlMDEiLCAiXHVmZjY3XHVmZjY4XHVmZjY5XHVmZjZhXHVmZjZiXHVmZjZjIik7CisKKyAgICAgICAgdGVzdCgidXRmLTgiLAorICAgICAgICAgICAgICJcdTAwZTRcdTAwZmMiLCAiR2VybWFuIFVtbGF1dCBcdTAwZmMgaW4gY29tbWVudCIpOworCisgICAgICAgIHRlc3QoInV0Zi04IiwKKyAgICAgICAgICAgICAiU3Vycm9nYXRlXHVkODAxXHVkYzAxIiwgIlN1cnJvZ2F0ZXMgXHVkODAwXHVkYzAwIGluIGNvbW1lbnQiKTsKKworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHRlc3RaaXBJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcywgQ2hhcnNldCBjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyBjb21tZW50LCBieXRlW10gYmIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShpcywgY3MpOworICAgICAgICBaaXBFbnRyeSBlID0gemlzLmdldE5leHRFbnRyeSgpOworICAgICAgICBpZiAoZSA9PSBudWxsIHx8ICEgbmFtZS5lcXVhbHMoZS5nZXROYW1lKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlppcElTIG5hbWUgZG9lc24ndCBtYXRjaCEiKTsKKyAgICAgICAgYnl0ZVtdIGJCdWYgPSBuZXcgYnl0ZVtiYi5sZW5ndGggPDwgMV07CisgICAgICAgIGludCBuID0gemlzLnJlYWQoYkJ1ZiwgMCwgYkJ1Zi5sZW5ndGgpOworICAgICAgICBpZiAobiAhPSBiYi5sZW5ndGggfHwKKyAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKGJiLCBBcnJheXMuY29weU9mKGJCdWYsIG4pKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlppcElTIGNvbnRlbnQgZG9lc24ndCBtYXRjaCEiKTsKKyAgICAgICAgfQorICAgICAgICB6aXMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0ZXN0WmlwRmlsZShGaWxlIGYsIENoYXJzZXQgY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyBjb21tZW50LCBieXRlW10gYmIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFppcEZpbGUgemYgPSBuZXcgWmlwRmlsZShmLCBjcyk7CisgICAgICAgIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gemVzID0gemYuZW50cmllcygpOworICAgICAgICBaaXBFbnRyeSBlID0gKFppcEVudHJ5KXplcy5uZXh0RWxlbWVudCgpOworICAgICAgICBpZiAoISBuYW1lLmVxdWFscyhlLmdldE5hbWUoKSkgfHwKKyAgICAgICAgICAgICEgY29tbWVudC5lcXVhbHMoZS5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlppcEZpbGU6IG5hbWUvY29tbWVudCBkb2Vzbid0IG1hdGNoISIpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHpmLmdldElucHV0U3RyZWFtKGUpOworICAgICAgICBpZiAoaXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJaaXBGaWxlOiBnZXRJUyBmYWlsZWQhIik7CisgICAgICAgIGJ5dGVbXSBiQnVmID0gbmV3IGJ5dGVbYmIubGVuZ3RoIDw8IDFdOworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGludCBubiA9MDsKKyAgICAgICAgd2hpbGUgKChubiA9IGlzLnJlYWQoYkJ1ZiwgbiwgYkJ1Zi5sZW5ndGgtbikpICE9IC0xKSB7CisgICAgICAgICAgICBuICs9IG5uOworICAgICAgICB9CisgICAgICAgIGlmIChuICE9IGJiLmxlbmd0aCB8fAorICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoYmIsIEFycmF5cy5jb3B5T2YoYkJ1ZiwgbikpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiWmlwRmlsZSBjb250ZW50IGRvZXNuJ3QgbWF0Y2ghIik7CisgICAgICAgIH0KKyAgICAgICAgemYuY2xvc2UoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0ZXN0KFN0cmluZyBjc24sIFN0cmluZyBuYW1lLCBTdHJpbmcgY29tbWVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYnl0ZVtdIGJiID0gIlRoaXMgaXMgdGhlIGNvbmVudCBvZiB0aGUgemlwZmlsZSIuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKTsKKyAgICAgICAgQ2hhcnNldCBjcyA9IENoYXJzZXQuZm9yTmFtZShjc24pOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgWmlwT3V0cHV0U3RyZWFtIHpvcyA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oYmFvcywgY3MpOworCisgICAgICAgIFppcEVudHJ5IGUgPSBuZXcgWmlwRW50cnkobmFtZSk7CisgICAgICAgIGUuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgem9zLnB1dE5leHRFbnRyeShlKTsKKyAgICAgICAgem9zLndyaXRlKGJiLCAwLCBiYi5sZW5ndGgpOworICAgICAgICB6b3MuY2xvc2VFbnRyeSgpOworICAgICAgICB6b3MuY2xvc2UoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIHRlc3RaaXBJbnB1dFN0cmVhbShiaXMsIGNzLCBuYW1lLCBjb21tZW50LCBiYik7CisKKyAgICAgICAgaWYgKCJ1dGYtOCIuZXF1YWxzKGNzbikpIHsKKyAgICAgICAgICAgIC8vIEVGUyBzaG91bGQgYmUgc2V0CisgICAgICAgICAgICBiaXMucmVzZXQoKTsKKyAgICAgICAgICAgIHRlc3RaaXBJbnB1dFN0cmVhbShiaXMsIENoYXJzZXQuZm9yTmFtZSgiTVM5MzIiKSwgbmFtZSwgY29tbWVudCwgYmIpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LmRpciIsICIuIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiemZjb2RpbmcuemlwIik7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisgICAgICAgIGJhb3Mud3JpdGVUbyhmb3MpOworICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgdGVzdFppcEZpbGUoZiwgY3MsIG5hbWUsIGNvbW1lbnQsIGJiKTsKKyAgICAgICAgaWYgKCJ1dGYtOCIuZXF1YWxzKGNzbikpIHsKKyAgICAgICAgICAgIHRlc3RaaXBGaWxlKGYsIENoYXJzZXQuZm9yTmFtZSgiTVM5MzIiKSwgbmFtZSwgY29tbWVudCwgYmIpOworICAgICAgICB9CisgICAgICAgIGYuZGVsZXRlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL3ppcC96aXAuamF2YSBiL2pkay90ZXN0L2phdmEvdXRpbC96aXAvemlwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlY2NmOQotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC96aXAvemlwLmphdmEKQEAgLTAsMCArMSw3NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC56aXAuKjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKKworLyoqCisgKiBBIHN0cmlwcGVkLWRvd24gdmVyc2lvbiBvZiBKYXIgdG9vbCB3aXRoIGEgIi1lbmNvZGluZyIgb3B0aW9uIHRvCisgKiBzdXBwb3J0IG5vbi1VVEY4IGVuY29pZG5nIGZvciBlbnRyeSBuYW1lIGFuZCBjb21tZW50LgorICovCitwdWJsaWMgY2xhc3MgemlwIHsKKyAgICBTdHJpbmcgcHJvZ3JhbTsKKyAgICBQcmludFN0cmVhbSBvdXQsIGVycjsKKyAgICBTdHJpbmcgZm5hbWU7CisgICAgU3RyaW5nIHpuYW1lID0gIiI7CisgICAgU3RyaW5nW10gZmlsZXM7CisgICAgQ2hhcnNldCBjcyA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKKworICAgIE1hcDxTdHJpbmcsIEZpbGU+IGVudHJ5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWxlPigpOworICAgIFNldDxGaWxlPiBlbnRyaWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8RmlsZT4oKTsKKyAgICBMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIENSQzMyIGNyYzMyID0gbmV3IENSQzMyKCk7CisgICAgLyoKKyAgICAgKiBjZmxhZzogY3JlYXRlCisgICAgICogdWZsYWc6IHVwZGF0ZQorICAgICAqIHhmbGFnOiB4dHJhY3QKKyAgICAgKiB0ZmxhZzogdGFibGUKKyAgICAgKiB2ZmxhZzogdmVyYm9zZQorICAgICAqIGZsYWcwOiBubyB6aXAgY29tcHJlc3Npb24gKHN0b3JlIG9ubHkpCisgICAgICovCisgICAgYm9vbGVhbiBjZmxhZywgdWZsYWcsIHhmbGFnLCB0ZmxhZywgdmZsYWcsIGZsYWcwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcnNyYzsKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8ganVzdCB1c2UgdGhlIGphciBtZXNzYWdlCisgICAgICAgICAgICByc3JjID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJzdW4udG9vbHMuamFyLnJlc291cmNlcy5qYXIiKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRmF0YWw6IFJlc291cmNlIGZvciBqYXIgaXMgbWlzc2luZyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHppcChQcmludFN0cmVhbSBvdXQsIFByaW50U3RyZWFtIGVyciwgU3RyaW5nIHByb2dyYW0pIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgICAgIHRoaXMuZXJyID0gZXJyOworICAgICAgICB0aGlzLnByb2dyYW0gPSBwcm9ncmFtOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBvazsKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBydW4oU3RyaW5nIGFyZ3NbXSkgeworICAgICAgICBvayA9IHRydWU7CisgICAgICAgIGlmICghcGFyc2VBcmdzKGFyZ3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjZmxhZyB8fCB1ZmxhZykgeworICAgICAgICAgICAgICAgIGlmIChmbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHpuYW1lID0gZm5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh6bmFtZS5zdGFydHNXaXRoKCIuLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bmFtZSA9IHpuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjZmxhZykgeworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQ7CisgICAgICAgICAgICAgICAgaWYgKGZuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZm5hbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKEZpbGVEZXNjcmlwdG9yLm91dCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgIHZmbGFnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXhwYW5kKG51bGwsIGZpbGVzLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY3JlYXRlKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXQsIDQwOTYpKTsKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodWZsYWcpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGlucHV0RmlsZSA9IG51bGwsIHRtcEZpbGUgPSBudWxsOworICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbjsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dDsKKyAgICAgICAgICAgICAgICBpZiAoZm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dEZpbGUgPSBuZXcgRmlsZShmbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gaW5wdXRGaWxlLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKChwYXRoID09IG51bGwpID8gIi4iIDogcGF0aCkpOworICAgICAgICAgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wRmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKEZpbGVEZXNjcmlwdG9yLmluKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oRmlsZURlc2NyaXB0b3Iub3V0KTsKKyAgICAgICAgICAgICAgICAgICAgdmZsYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXhwYW5kKG51bGwsIGZpbGVzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHVwZGF0ZU9rID0gdXBkYXRlKGluLCBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0KSk7CisgICAgICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gdXBkYXRlT2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgaWYgKGZuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXRtcEZpbGUucmVuYW1lVG8oaW5wdXRGaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihnZXRNc2coImVycm9yLndyaXRlLmZpbGUiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG1wRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRmbGFnKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZUZTQyhmaWxlcyk7CisgICAgICAgICAgICAgICAgaWYgKGZuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdChmbmFtZSwgZmlsZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShGaWxlRGVzY3JpcHRvci5pbik7CisgICAgICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4pLCBmaWxlcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh4ZmxhZykgeworICAgICAgICAgICAgICAgIHJlcGxhY2VGU0MoZmlsZXMpOworICAgICAgICAgICAgICAgIGlmIChmbmFtZSAhPSBudWxsICYmIGZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdChmbmFtZSwgZmlsZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gKGZuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBGaWxlSW5wdXRTdHJlYW0oRmlsZURlc2NyaXB0b3IuaW4pCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBGaWxlSW5wdXRTdHJlYW0oZm5hbWUpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdChuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbiksIGZpbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhdGFsRXJyb3IoZSk7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9IGNhdGNoIChFcnJvciBlZSkgeworICAgICAgICAgICAgZWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIGVyci5mbHVzaCgpOworICAgICAgICByZXR1cm4gb2s7CisgICAgfQorCisKKyAgICBib29sZWFuIHBhcnNlQXJncyhTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcmdzID0gcGFyc2UoYXJncyk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYXRhbEVycm9yKGZvcm1hdE1zZygiZXJyb3IuY2FudC5vcGVuIiwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmF0YWxFcnJvcihlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSAxOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGZsYWdzID0gYXJnc1swXTsKKyAgICAgICAgICAgIGlmIChmbGFncy5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdzLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoZmxhZ3MuY2hhckF0KGkpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgIGlmICh4ZmxhZyB8fCB0ZmxhZyB8fCB1ZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNmbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChjZmxhZyB8fCB4ZmxhZyB8fCB0ZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVmbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgICAgIGlmIChjZmxhZyB8fCB1ZmxhZyB8fCB0ZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHhmbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgICAgIGlmIChjZmxhZyB8fCB1ZmxhZyB8fCB4ZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRmbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICAgICAgICAgIHZmbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgICAgIGZuYW1lID0gYXJnc1tjb3VudCsrXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICAgICAgICAgIGZsYWcwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoZm9ybWF0TXNnKCJlcnJvci5pbGxlZ2FsLm9wdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGZsYWdzLmNoYXJBdChpKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2VFcnJvcigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdXNhZ2VFcnJvcigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghY2ZsYWcgJiYgIXRmbGFnICYmICF4ZmxhZyAmJiAhdWZsYWcpIHsKKyAgICAgICAgICAgIGVycm9yKGdldE1zZygiZXJyb3IuYmFkLm9wdGlvbiIpKTsKKyAgICAgICAgICAgIHVzYWdlRXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvKiBwYXJzZSBmaWxlIGFyZ3VtZW50cyAqLworICAgICAgICBpbnQgbiA9IGFyZ3MubGVuZ3RoIC0gY291bnQ7CisgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgaW50IGsgPSAwOworICAgICAgICAgICAgU3RyaW5nW10gbmFtZUJ1ZiA9IG5ldyBTdHJpbmdbbl07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZW5jb2RpbmciKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3MgPSBDaGFyc2V0LmZvck5hbWUoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLUMiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hhbmdlIHRoZSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPSAoZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyIDogKGRpciArIEZpbGUuc2VwYXJhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPSBkaXIucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZGlyLmluZGV4T2YoIi8vIikgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciA9IGRpci5yZXBsYWNlKCIvLyIsICIvIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5hZGQoZGlyLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVCdWZbaysrXSA9IGRpciArIGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVCdWZbaysrXSA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdXNhZ2VFcnJvcigpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChrICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdba107CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lQnVmLCAwLCBmaWxlcywgMCwgayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ZsYWcgfHwgdWZsYWcpIHsKKyAgICAgICAgICAgIGVycm9yKGdldE1zZygiZXJyb3IuYmFkLnVmbGFnIikpOworICAgICAgICAgICAgdXNhZ2VFcnJvcigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgZXhwYW5kKEZpbGUgZGlyLCBTdHJpbmdbXSBmaWxlcywgYm9vbGVhbiBpc1VwZGF0ZSkgeworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgZjsKKyAgICAgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShmaWxlc1tpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJpZXMuYWRkKGYpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1VwZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TWFwLnB1dChlbnRyeU5hbWUoZi5nZXRQYXRoKCkpLCBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmFkZChmKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXJQYXRoID0gZi5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJQYXRoID0gKGRpclBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSA/IGRpclBhdGggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJQYXRoICsgRmlsZS5zZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlNYXAucHV0KGVudHJ5TmFtZShkaXJQYXRoKSwgZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhwYW5kKGYsIGYubGlzdCgpLCBpc1VwZGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvcihmb3JtYXRNc2coImVycm9yLm5vc3VjaC5maWxlb3JkaXIiLCBTdHJpbmcudmFsdWVPZihmKSkpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNyZWF0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFppcE91dHB1dFN0cmVhbSB6b3MgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG91dCwgY3MpOworICAgICAgICBpZiAoZmxhZzApIHsKKyAgICAgICAgICAgIHpvcy5zZXRNZXRob2QoWmlwT3V0cHV0U3RyZWFtLlNUT1JFRCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChGaWxlIGZpbGU6IGVudHJpZXMpIHsKKyAgICAgICAgICAgIGFkZEZpbGUoem9zLCBmaWxlKTsKKyAgICAgICAgfQorICAgICAgICB6b3MuY2xvc2UoKTsKKyAgICB9CisKKyAgICBib29sZWFuIHVwZGF0ZShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0oaW4sIGNzKTsKKyAgICAgICAgWmlwT3V0cHV0U3RyZWFtIHpvcyA9IG5ldyBaaXBPdXRwdXRTdHJlYW0ob3V0LCBjcyk7CisgICAgICAgIFppcEVudHJ5IGUgPSBudWxsOworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVPayA9IHRydWU7CisKKyAgICAgICAgLy8gcHV0IHRoZSBvbGQgZW50cmllcyBmaXJzdCwgcmVwbGFjZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgd2hpbGUgKChlID0gemlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKCFlbnRyeU1hcC5jb250YWluc0tleShuYW1lKSkgeyAvLyBjb3B5IHRoZSBvbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAvLyBkbyBvdXIgb3duIGNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgWmlwRW50cnkgZTIgPSBuZXcgWmlwRW50cnkobmFtZSk7CisgICAgICAgICAgICAgICAgZTIuc2V0TWV0aG9kKGUuZ2V0TWV0aG9kKCkpOworICAgICAgICAgICAgICAgIGUyLnNldFRpbWUoZS5nZXRUaW1lKCkpOworICAgICAgICAgICAgICAgIGUyLnNldENvbW1lbnQoZS5nZXRDb21tZW50KCkpOworICAgICAgICAgICAgICAgIGUyLnNldEV4dHJhKGUuZ2V0RXh0cmEoKSk7CisgICAgICAgICAgICAgICAgaWYgKGUuZ2V0TWV0aG9kKCkgPT0gWmlwRW50cnkuU1RPUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIGUyLnNldFNpemUoZS5nZXRTaXplKCkpOworICAgICAgICAgICAgICAgICAgICBlMi5zZXRDcmMoZS5nZXRDcmMoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpvcy5wdXROZXh0RW50cnkoZTIpOworICAgICAgICAgICAgICAgIHdoaWxlICgobiA9IHppcy5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHpvcy53cml0ZShidWYsIDAsIG4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHJlcGxhY2Ugd2l0aCB0aGUgbmV3IGZpbGVzCisgICAgICAgICAgICAgICAgRmlsZSBmID0gZW50cnlNYXAuZ2V0KG5hbWUpOworICAgICAgICAgICAgICAgIGFkZEZpbGUoem9zLCBmKTsKKyAgICAgICAgICAgICAgICBlbnRyeU1hcC5yZW1vdmUobmFtZSk7CisgICAgICAgICAgICAgICAgZW50cmllcy5yZW1vdmUoZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgdGhlIHJlbWFpbmluZyBuZXcgZmlsZXMKKyAgICAgICAgZm9yIChGaWxlIGY6IGVudHJpZXMpIHsKKyAgICAgICAgICAgIGFkZEZpbGUoem9zLCBmKTsKKyAgICAgICAgfQorICAgICAgICB6aXMuY2xvc2UoKTsKKyAgICAgICAgem9zLmNsb3NlKCk7CisgICAgICAgIHJldHVybiB1cGRhdGVPazsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBlbnRyeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgIFN0cmluZyBtYXRjaFBhdGggPSAiIjsKKyAgICAgICAgZm9yIChTdHJpbmcgcGF0aCA6IHBhdGhzKSB7CisgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKHBhdGgpICYmIChwYXRoLmxlbmd0aCgpID4gbWF0Y2hQYXRoLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgIG1hdGNoUGF0aCA9IHBhdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG1hdGNoUGF0aC5sZW5ndGgoKSk7CisKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCIuLyIpKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgdm9pZCBhZGRGaWxlKFppcE91dHB1dFN0cmVhbSB6b3MsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLmdldFBhdGgoKTsKKyAgICAgICAgYm9vbGVhbiBpc0RpciA9IGZpbGUuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgaWYgKGlzRGlyKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBuYW1lIDoKKyAgICAgICAgICAgICAgICAobmFtZSArIEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBuYW1lID0gZW50cnlOYW1lKG5hbWUpOworCisgICAgICAgIGlmIChuYW1lLmVxdWFscygiIikgfHwgbmFtZS5lcXVhbHMoIi4iKSB8fCBuYW1lLmVxdWFscyh6bmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgc2l6ZSA9IGlzRGlyID8gMCA6IGZpbGUubGVuZ3RoKCk7CisKKyAgICAgICAgaWYgKHZmbGFnKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoZm9ybWF0TXNnKCJvdXQuYWRkaW5nIiwgbmFtZSkpOworICAgICAgICB9CisgICAgICAgIFppcEVudHJ5IGUgPSBuZXcgWmlwRW50cnkobmFtZSk7CisgICAgICAgIGUuc2V0VGltZShmaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgZS5zZXRNZXRob2QoWmlwRW50cnkuU1RPUkVEKTsKKyAgICAgICAgICAgIGUuc2V0U2l6ZSgwKTsKKyAgICAgICAgICAgIGUuc2V0Q3JjKDApOworICAgICAgICB9IGVsc2UgaWYgKGZsYWcwKSB7CisgICAgICAgICAgICBlLnNldFNpemUoc2l6ZSk7CisgICAgICAgICAgICBlLnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOworICAgICAgICAgICAgY3JjMzJGaWxlKGUsIGZpbGUpOworICAgICAgICB9CisgICAgICAgIHpvcy5wdXROZXh0RW50cnkoZSk7CisgICAgICAgIGlmICghaXNEaXIpIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKKyAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOworICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBpcy5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgem9zLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgem9zLmNsb3NlRW50cnkoKTsKKyAgICAgICAgLyogcmVwb3J0IGhvdyBtdWNoIGNvbXByZXNzaW9uIG9jY3VycmVkLiAqLworICAgICAgICBpZiAodmZsYWcpIHsKKyAgICAgICAgICAgIHNpemUgPSBlLmdldFNpemUoKTsKKyAgICAgICAgICAgIGxvbmcgY3NpemUgPSBlLmdldENvbXByZXNzZWRTaXplKCk7CisgICAgICAgICAgICBvdXQucHJpbnQoZm9ybWF0TXNnMigib3V0LnNpemUiLCBTdHJpbmcudmFsdWVPZihzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNzaXplKSkpOworICAgICAgICAgICAgaWYgKGUuZ2V0TWV0aG9kKCkgPT0gWmlwRW50cnkuREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICBsb25nIHJhdGlvID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJhdGlvID0gKChzaXplIC0gY3NpemUpICogMTAwKSAvIHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dChmb3JtYXRNc2coIm91dC5kZWZsYXRlZCIsIFN0cmluZy52YWx1ZU9mKHJhdGlvKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQoZ2V0TXNnKCJvdXQuc3RvcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyYzMyRmlsZShaaXBFbnRyeSBlLCBGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmKSk7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKKyAgICAgICAgY3JjMzIucmVzZXQoKTsKKyAgICAgICAgaW50IHIgPSAwOworICAgICAgICBpbnQgbnJlYWQgPSAwOworICAgICAgICBsb25nIGxlbiA9IGYubGVuZ3RoKCk7CisgICAgICAgIHdoaWxlICgociA9IGlzLnJlYWQoYnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIG5yZWFkICs9IHI7CisgICAgICAgICAgICBjcmMzMi51cGRhdGUoYnVmLCAwLCByKTsKKyAgICAgICAgfQorICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICBpZiAobnJlYWQgIT0gKGludCkgbGVuKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKGZvcm1hdE1zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvci5pbmNvcnJlY3QubGVuZ3RoIiwgZi5nZXRQYXRoKCkpKTsKKyAgICAgICAgfQorICAgICAgICBlLnNldENyYyhjcmMzMi5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIHJlcGxhY2VGU0MoU3RyaW5nIGZpbGVzW10pIHsKKyAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU2V0PFppcEVudHJ5PiBuZXdEaXJTZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxaaXBFbnRyeT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoWmlwRW50cnkgZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoZSA9PSBudWxsIHx8IHN1cGVyLmFkZChlKSk7CisgICAgICAgICAgICB9fTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUxhc3RNb2RpZmllZFRpbWUoU2V0PFppcEVudHJ5PiB6ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoWmlwRW50cnkgemUgOiB6ZXMpIHsKKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gemUuZ2V0VGltZSgpOworICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHplLmdldE5hbWUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7CisgICAgICAgICAgICAgICAgZi5zZXRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZXh0cmFjdChJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGZpbGVzW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShpbiwgY3MpOworICAgICAgICBaaXBFbnRyeSBlOworICAgICAgICBTZXQ8WmlwRW50cnk+IGRpcnMgPSBuZXdEaXJTZXQoKTsKKyAgICAgICAgd2hpbGUgKChlID0gemlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRpcnMuYWRkKGV4dHJhY3RGaWxlKHppcywgZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJzLmFkZChleHRyYWN0RmlsZSh6aXMsIGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVwZGF0ZUxhc3RNb2RpZmllZFRpbWUoZGlycyk7CisgICAgfQorCisgICAgdm9pZCBleHRyYWN0KFN0cmluZyBmbmFtZSwgU3RyaW5nIGZpbGVzW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFppcEZpbGUgemYgPSBuZXcgWmlwRmlsZShmbmFtZSwgY3MpOworICAgICAgICBTZXQ8WmlwRW50cnk+IGRpcnMgPSBuZXdEaXJTZXQoKTsKKyAgICAgICAgRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiB6ZXMgPSB6Zi5lbnRyaWVzKCk7CisgICAgICAgIHdoaWxlICh6ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFppcEVudHJ5IGUgPSB6ZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzOworICAgICAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkaXJzLmFkZChleHRyYWN0RmlsZSh6Zi5nZXRJbnB1dFN0cmVhbShlKSwgZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJzLmFkZChleHRyYWN0RmlsZSh6Zi5nZXRJbnB1dFN0cmVhbShlKSwgZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgemYuY2xvc2UoKTsKKyAgICAgICAgdXBkYXRlTGFzdE1vZGlmaWVkVGltZShkaXJzKTsKKyAgICB9CisKKyAgICBaaXBFbnRyeSBleHRyYWN0RmlsZShJbnB1dFN0cmVhbSBpcywgWmlwRW50cnkgZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgWmlwRW50cnkgcmMgPSBudWxsOworICAgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0TmFtZSgpOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShlLmdldE5hbWUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7CisgICAgICAgIGlmIChlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGZvcm1hdE1zZygiZXJyb3IuY3JlYXRlLmRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICBmLmdldFBhdGgoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFmLm1rZGlycygpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihmb3JtYXRNc2coImVycm9yLmNyZWF0ZS5kaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXRQYXRoKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByYyA9IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZmbGFnKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0KGZvcm1hdE1zZygib3V0LmNyZWF0ZSIsIG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChmLmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZShmLmdldFBhcmVudCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWQuZXhpc3RzKCkgJiYgIWQubWtkaXJzKCkgfHwgIWQuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZm9ybWF0TXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yLmNyZWF0ZS5kaXIiLCBkLmdldFBhdGgoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVs4MTkyXTsKKyAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gaXMucmVhZChiLCAwLCBiLmxlbmd0aCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoaXMgaW5zdGFuY2VvZiBaaXBJbnB1dFN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgKChaaXBJbnB1dFN0cmVhbSlpcykuY2xvc2VFbnRyeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZmbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKGUuZ2V0TWV0aG9kKCkgPT0gWmlwRW50cnkuREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KGZvcm1hdE1zZygib3V0LmluZmxhdGVkIiwgbmFtZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dChmb3JtYXRNc2coIm91dC5leHRyYWN0ZWQiLCBuYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gZS5nZXRUaW1lKCk7CisgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgIT0gLTEpIHsKKyAgICAgICAgICAgIGYuc2V0TGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHZvaWQgbGlzdChJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGZpbGVzW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShpbiwgY3MpOworICAgICAgICBaaXBFbnRyeSBlOworICAgICAgICB3aGlsZSAoKGUgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHppcy5jbG9zZUVudHJ5KCk7CisgICAgICAgICAgICBwcmludEVudHJ5KGUsIGZpbGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbGlzdChTdHJpbmcgZm5hbWUsIFN0cmluZyBmaWxlc1tdKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoZm5hbWUsIGNzKTsKKyAgICAgICAgRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiB6ZXMgPSB6Zi5lbnRyaWVzKCk7CisgICAgICAgIHdoaWxlICh6ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHByaW50RW50cnkoemVzLm5leHRFbGVtZW50KCksIGZpbGVzKTsKKyAgICAgICAgfQorICAgICAgICB6Zi5jbG9zZSgpOworICAgIH0KKworICAgIHZvaWQgcHJpbnRFbnRyeShaaXBFbnRyeSBlLCBTdHJpbmdbXSBmaWxlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHByaW50RW50cnkoZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludEVudHJ5KGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmludEVudHJ5KFppcEVudHJ5IGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2ZmxhZykgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBTdHJpbmcgcyA9IExvbmcudG9TdHJpbmcoZS5nZXRTaXplKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDYgLSBzLmxlbmd0aCgpOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQocykuYXBwZW5kKCcgJykuYXBwZW5kKG5ldyBEYXRlKGUuZ2V0VGltZSgpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpLmFwcGVuZChlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBvdXRwdXQoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRwdXQoZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB1c2FnZUVycm9yKCkgeworICAgICAgICBlcnJvcigKKyAgICAgICAgIlVzYWdlOiB6aXAge2N0eHV9W3ZmMF0gW3ppcC1maWxlXSBbLWVuY29kaW5nIGVuY25hbWVdWy1DIGRpcl0gZmlsZXMgLi4uXG4iICsKKyAgICAgICAgIk9wdGlvbnM6XG4iICsKKyAgICAgICAgIiAgIC1jICBjcmVhdGUgbmV3IGFyY2hpdmVcbiIgKworICAgICAgICAiICAgLXQgIGxpc3QgdGFibGUgb2YgY29udGVudHMgZm9yIGFyY2hpdmVcbiIgKworICAgICAgICAiICAgLXggIGV4dHJhY3QgbmFtZWQgKG9yIGFsbCkgZmlsZXMgZnJvbSBhcmNoaXZlXG4iICsKKyAgICAgICAgIiAgIC11ICB1cGRhdGUgZXhpc3RpbmcgYXJjaGl2ZVxuIiArCisgICAgICAgICIgICAtdiAgZ2VuZXJhdGUgdmVyYm9zZSBvdXRwdXQgb24gc3RhbmRhcmQgb3V0cHV0XG4iICsKKyAgICAgICAgIiAgIC1mICBzcGVjaWZ5IGFyY2hpdmUgZmlsZSBuYW1lXG4iICsKKyAgICAgICAgIiAgIC0wICBzdG9yZSBvbmx5OyB1c2Ugbm8gWklQIGNvbXByZXNzaW9uXG4iICsKKyAgICAgICAgIiAgIC1DICBjaGFuZ2UgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBmaWxlXG4iICsKKyAgICAgICAgIklmIGFueSBmaWxlIGlzIGEgZGlyZWN0b3J5IHRoZW4gaXQgaXMgcHJvY2Vzc2VkIHJlY3Vyc2l2ZWx5LlxuIik7CisgICAgfQorCisgICAgdm9pZCBmYXRhbEVycm9yKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisKKyAgICB2b2lkIGZhdGFsRXJyb3IoU3RyaW5nIHMpIHsKKyAgICAgICAgZXJyb3IocHJvZ3JhbSArICI6ICIgKyBzKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIG91dHB1dChTdHJpbmcgcykgeworICAgICAgICBvdXQucHJpbnRsbihzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlcnJvcihTdHJpbmcgcykgeworICAgICAgICBlcnIucHJpbnRsbihzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRNc2coU3RyaW5nIGtleSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChyc3JjLmdldFN0cmluZyhrZXkpKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRXJyb3IgaW4gbWVzc2FnZSBmaWxlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmb3JtYXRNc2coU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgeworICAgICAgICBTdHJpbmcgbXNnID0gZ2V0TXNnKGtleSk7CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICBhcmdzWzBdID0gYXJnOworICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCAoT2JqZWN0W10pIGFyZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGZvcm1hdE1zZzIoU3RyaW5nIGtleSwgU3RyaW5nIGFyZywgU3RyaW5nIGFyZzEpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IGdldE1zZyhrZXkpOworICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgYXJnc1swXSA9IGFyZzsKKyAgICAgICAgYXJnc1sxXSA9IGFyZzE7CisgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIChPYmplY3RbXSkgYXJncyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBwYXJzZShTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG5ld0FyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oYXJncy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBhcmcgPSBhcmdzW2ldOworICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGgoKSA+IDEgJiYgYXJnLmNoYXJBdCgwKSA9PSAnQCcpIHsKKyAgICAgICAgICAgICAgICBhcmcgPSBhcmcuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGlmIChhcmcuY2hhckF0KDApID09ICdAJykgeworICAgICAgICAgICAgICAgICAgICBuZXdBcmdzLmFkZChhcmcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRDbWRGaWxlKGFyZywgbmV3QXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXdBcmdzLmFkZChhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1tuZXdBcmdzLnNpemUoKV0pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9hZENtZEZpbGUoU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKG5hbWUpKTsKKyAgICAgICAgU3RyZWFtVG9rZW5pemVyIHN0ID0gbmV3IFN0cmVhbVRva2VuaXplcihyKTsKKyAgICAgICAgc3QucmVzZXRTeW50YXgoKTsKKyAgICAgICAgc3Qud29yZENoYXJzKCcgJywgMjU1KTsKKyAgICAgICAgc3Qud2hpdGVzcGFjZUNoYXJzKDAsICcgJyk7CisgICAgICAgIHN0LmNvbW1lbnRDaGFyKCcjJyk7CisgICAgICAgIHN0LnF1b3RlQ2hhcignIicpOworICAgICAgICBzdC5xdW90ZUNoYXIoJ1wnJyk7CisgICAgICAgIHdoaWxlIChzdC5uZXh0VG9rZW4oKSAhPSBzdC5UVF9FT0YpIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKHN0LnN2YWwpOworICAgICAgICB9CisgICAgICAgIHIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIHppcCB6ID0gbmV3IHppcChTeXN0ZW0ub3V0LCBTeXN0ZW0uZXJyLCAiemlwIik7CisgICAgICAgIFN5c3RlbS5leGl0KHoucnVuKGFyZ3MpID8gMCA6IDEpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvcHJpbnQvYXR0cmlidXRlL01lZGlhTWFwcGluZ3NUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZheC9wcmludC9hdHRyaWJ1dGUvTWVkaWFNYXBwaW5nc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjExMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YXgvcHJpbnQvYXR0cmlidXRlL01lZGlhTWFwcGluZ3NUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyA2NjUyNDYzCisgKiBAc3VtbWFyeSBWZXJpZnkgbWVkaWEgc2l6ZS0+IG1lZGlhIG1hcHBpbmdzIGNhbid0IGJlIGFsdGVyZWQKKyAqIEBydW4gbWFpbiBNZWRpYU1hcHBpbmdzVGVzdAorKi8KKworaW1wb3J0IGphdmF4LnByaW50LmF0dHJpYnV0ZS5zdGFuZGFyZC5NZWRpYVNpemU7CitpbXBvcnQgamF2YXgucHJpbnQuYXR0cmlidXRlLnN0YW5kYXJkLk1lZGlhU2l6ZU5hbWU7CisKK3B1YmxpYyBjbGFzcyBNZWRpYU1hcHBpbmdzVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIE1lZGlhU2l6ZSBzaXplQSA9IE1lZGlhU2l6ZS5nZXRNZWRpYVNpemVGb3JOYW1lKE1lZGlhU2l6ZU5hbWUuQSk7CisgICAgICAgIG5ldyBNZWRpYVNpemUoMS4wZiwgMi4wZiwgTWVkaWFTaXplLk1NLCBNZWRpYVNpemVOYW1lLkEpOworICAgICAgICBpZiAoIXNpemVBLmVxdWFscyhNZWRpYVNpemUuZ2V0TWVkaWFTaXplRm9yTmFtZShNZWRpYVNpemVOYW1lLkEpKSkgeworICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJtYXBwaW5nIGNoYW5nZWQiKTsKKyAgICAgICAgfQorICAgICAgICBNZWRpYVNpemUgc2l6ZUIgPSBNZWRpYVNpemUuZ2V0TWVkaWFTaXplRm9yTmFtZShNZWRpYVNpemVOYW1lLkIpOworICAgICAgICBuZXcgTWVkaWFTaXplKDEsIDIsIE1lZGlhU2l6ZS5NTSwgTWVkaWFTaXplTmFtZS5CKTsKKyAgICAgICAgaWYgKCFzaXplQi5lcXVhbHMoTWVkaWFTaXplLmdldE1lZGlhU2l6ZUZvck5hbWUoTWVkaWFTaXplTmFtZS5CKSkpIHsKKyAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibWFwcGluZyBjaGFuZ2VkIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zb3VuZC9taWRpL0dlcnZpbGwvU29mdENoYW5uZWwvTm90ZU92ZXJGbG93VGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvc291bmQvbWlkaS9HZXJ2aWxsL1NvZnRDaGFubmVsL05vdGVPdmVyRmxvd1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGIzMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YXgvc291bmQvbWlkaS9HZXJ2aWxsL1NvZnRDaGFubmVsL05vdGVPdmVyRmxvd1Rlc3QuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgU3VuIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKiBAdGVzdAorICAgQHN1bW1hcnkgVGVzdCBTb2Z0Q2hhbm5lbCBub3RlT24vbm90ZU9mZiBvdmVyZmxvdyB0ZXN0ICovCisKK2ltcG9ydCBqYXZheC5zb3VuZC5taWRpLk1pZGlDaGFubmVsOworaW1wb3J0IGphdmF4LnNvdW5kLm1pZGkuVm9pY2VTdGF0dXM7CitpbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBqYXZheC5zb3VuZC5zYW1wbGVkLkF1ZGlvSW5wdXRTdHJlYW07CisKK2ltcG9ydCBjb20uc3VuLm1lZGlhLnNvdW5kLkF1ZGlvU3ludGhlc2l6ZXI7CitpbXBvcnQgY29tLnN1bi5tZWRpYS5zb3VuZC5Tb2Z0U3ludGhlc2l6ZXI7CisKK3B1YmxpYyBjbGFzcyBOb3RlT3ZlckZsb3dUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEF1ZGlvU3ludGhlc2l6ZXIgc3ludGggPSBuZXcgU29mdFN5bnRoZXNpemVyKCk7CisgICAgICAgIEF1ZGlvRm9ybWF0IGZvcm1hdCA9IG5ldyBBdWRpb0Zvcm1hdCg0NDEwMCwgMTYsIDIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgQXVkaW9JbnB1dFN0cmVhbSBzdHJlYW0gPSBzeW50aC5vcGVuU3RyZWFtKGZvcm1hdCwgbnVsbCk7CisKKyAgICAgICAgLy8gTWFrZSBhbGwgdm9pY2VzIGJ1c3ksIGUuZy4KKyAgICAgICAgLy8gc2VuZCBtaWRpIG9uIGFuZCBtaWRpIG9mZiBvbiBhbGwgYXZhaWxhYmxlIHZvaWNlcworICAgICAgICBNaWRpQ2hhbm5lbCBjaDEgPSBzeW50aC5nZXRDaGFubmVscygpWzBdOworICAgICAgICBjaDEucHJvZ3JhbUNoYW5nZSg0OCk7IC8vIFVzZSBjb250aW9udXMgaW5zdHJ1bWVudCBsaWtlIHN0cmluZyBlbnNlbWJsZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN5bnRoLmdldE1heFBvbHlwaG9ueSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoMS5ub3RlT24oNjQsIDY0KTsKKyAgICAgICAgICAgIGNoMS5ub3RlT2ZmKDY0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyBzZW5kIHNpbmdsZSBtaWRpIG9uLCBhbmQgbWlkaSBvZmYgbWVzc2FnZQorICAgICAgICBjaDEubm90ZU9uKDY0LCA2NCk7CisgICAgICAgIGNoMS5ub3RlT2ZmKDY0KTsKKworICAgICAgICAvLyBSZWFkIDEwIHNlYyBmcm9tIHN0cmVhbSwgYnkgdGhpcyB0aW1lIGFsbCB2b2ljZXMgc2hvdWxkIGJlIGluYWN0dmllCisgICAgICAgIHN0cmVhbS5za2lwKGZvcm1hdC5nZXRGcmFtZVNpemUoKSAqICgoaW50KShmb3JtYXQuZ2V0RnJhbWVSYXRlKCkgKiAyMCkpKTsKKworICAgICAgICAvLyBJZiBubyB2b2ljZSBhcmUgYWN0aXZlLCB0aGVuIHRoaXMgdGVzdCB3aWxsIHBhc3MKKyAgICAgICAgVm9pY2VTdGF0dXNbXSB2ID0gc3ludGguZ2V0Vm9pY2VTdGF0dXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZih2W2ldLmFjdGl2ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGFsbCB2b2ljZXMgYXJlIGluYWN0aXZlISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xvc2UgdGhlIHN5bnRoZXNpemVyIGFmdGVyIHVzZQorICAgICAgICBzeW50aC5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3NvdW5kL21pZGkvR2VydmlsbC9Tb2Z0RmlsdGVyL1Rlc3RQcm9jZXNzQXVkaW8uamF2YSBiL2pkay90ZXN0L2phdmF4L3NvdW5kL21pZGkvR2VydmlsbC9Tb2Z0RmlsdGVyL1Rlc3RQcm9jZXNzQXVkaW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzJmNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YXgvc291bmQvbWlkaS9HZXJ2aWxsL1NvZnRGaWx0ZXIvVGVzdFByb2Nlc3NBdWRpby5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qIEB0ZXN0CisgICBAc3VtbWFyeSBUZXN0IFNvZnRGaWx0ZXIgcHJvY2Vzc0F1ZGlvIG1ldGhvZCAqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBqYXZheC5zb3VuZC5zYW1wbGVkLio7CisKK2ltcG9ydCBjb20uc3VuLm1lZGlhLnNvdW5kLio7CisKK3B1YmxpYyBjbGFzcyBUZXN0UHJvY2Vzc0F1ZGlvIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBdWRpb0Zvcm1hdCBmb3JtYXQgPSBuZXcgQXVkaW9Gb3JtYXQoNDQxMDAsIDE2LCAyLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIFNvZnRBdWRpb0J1ZmZlciBzYnVmZmVyID0gbmV3IFNvZnRBdWRpb0J1ZmZlcigzNjAwLCBmb3JtYXQpOworICAgICAgICBTb2Z0RmlsdGVyIGZpbHRlciA9IG5ldyBTb2Z0RmlsdGVyKGZvcm1hdC5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSg0Mik7CisKKworICAgICAgICBmb3IgKGludCB0ID0gMDsgdCA8PSA2OyB0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHQgPT0gMCkgZmlsdGVyLnNldEZpbHRlclR5cGUoU29mdEZpbHRlci5GSUxURVJUWVBFX0JQMTIpOworICAgICAgICAgICAgaWYodCA9PSAxKSBmaWx0ZXIuc2V0RmlsdGVyVHlwZShTb2Z0RmlsdGVyLkZJTFRFUlRZUEVfSFAxMik7CisgICAgICAgICAgICBpZih0ID09IDIpIGZpbHRlci5zZXRGaWx0ZXJUeXBlKFNvZnRGaWx0ZXIuRklMVEVSVFlQRV9IUDI0KTsKKyAgICAgICAgICAgIGlmKHQgPT0gMykgZmlsdGVyLnNldEZpbHRlclR5cGUoU29mdEZpbHRlci5GSUxURVJUWVBFX0xQMTIpOworICAgICAgICAgICAgaWYodCA9PSA0KSBmaWx0ZXIuc2V0RmlsdGVyVHlwZShTb2Z0RmlsdGVyLkZJTFRFUlRZUEVfTFAyNCk7CisgICAgICAgICAgICBpZih0ID09IDUpIGZpbHRlci5zZXRGaWx0ZXJUeXBlKFNvZnRGaWx0ZXIuRklMVEVSVFlQRV9MUDYpOworICAgICAgICAgICAgaWYodCA9PSA2KSBmaWx0ZXIuc2V0RmlsdGVyVHlwZShTb2Z0RmlsdGVyLkZJTFRFUlRZUEVfTlAxMik7CisKKworICAgICAgICAgICAgLy8gVHJ5IGZpcnN0IGJ5IHJlc2V0aW5nIGFsd2F5cworICAgICAgICAgICAgZm9yIChpbnQgZiA9IDEyMDA7IGYgPCAzNjAwOyBmKz0xMDApCisgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPD0gMzA7IHIrPTUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zZXRSZXNvbmFuY2Uocik7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zZXRGcmVxdWVuY3koZik7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gZGF0YSA9IHNidWZmZXIuYXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHNidWZmZXIuZ2V0U2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSA9IHJhbmRvbS5uZXh0RmxvYXQoKSAtIDAuNWY7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5wcm9jZXNzQXVkaW8oc2J1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3cgd2Ugc2tpcCByZXNldGluZworICAgICAgICAgICAgLy8gdG8gdGVzdCBob3cgY2hhbmdpbmcgZnJlcXVlbmN5IGFuZCByZXNvbmFuY2UKKyAgICAgICAgICAgIC8vIGFmZmVjdCBhY3RpdmUgZmlsdGVyCisgICAgICAgICAgICBmb3IgKGludCBmID0gMTAwOyBmIDwgMTI4MDA7IGYrPTEyMDApCisgICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8PSAzMDsgcis9NSkgeworICAgICAgICAgICAgICAgIGZpbHRlci5zZXRSZXNvbmFuY2Uocik7CisgICAgICAgICAgICAgICAgZmlsdGVyLnNldEZyZXF1ZW5jeShmKTsKKyAgICAgICAgICAgICAgICBmbG9hdFtdIGRhdGEgPSBzYnVmZmVyLmFycmF5KCk7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHNidWZmZXIuZ2V0U2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0gPSByYW5kb20ubmV4dEZsb2F0KCkgLSAwLjVmOworICAgICAgICAgICAgICAgIGZpbHRlci5wcm9jZXNzQXVkaW8oc2J1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBmID0gMTI4MDA7IGYgPj0gMTAwOyBmLT0xMjAwKQorICAgICAgICAgICAgICAgIGZvciAoaW50IHIgPSAzMDsgciA+PSAwOyByLT01KSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zZXRSZXNvbmFuY2Uocik7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zZXRGcmVxdWVuY3koZik7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gZGF0YSA9IHNidWZmZXIuYXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHNidWZmZXIuZ2V0U2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSA9IHJhbmRvbS5uZXh0RmxvYXQoKSAtIDAuNWY7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5wcm9jZXNzQXVkaW8oc2J1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVyLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvc291bmQvbWlkaS9HZXJ2aWxsL1NvZnRMb3dGcmVxdWVuY3lPc2NpbGxhdG9yL1Rlc3RQcm9jZXNzQ29udHJvbExvZ2ljLmphdmEgYi9qZGsvdGVzdC9qYXZheC9zb3VuZC9taWRpL0dlcnZpbGwvU29mdExvd0ZyZXF1ZW5jeU9zY2lsbGF0b3IvVGVzdFByb2Nlc3NDb250cm9sTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjg5YTg4Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YXgvc291bmQvbWlkaS9HZXJ2aWxsL1NvZnRMb3dGcmVxdWVuY3lPc2NpbGxhdG9yL1Rlc3RQcm9jZXNzQ29udHJvbExvZ2ljLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBTdW4gZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCisgKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgorICogaGF2ZSBhbnkgcXVlc3Rpb25zLgorICovCisKKy8qIEB0ZXN0CisgQHN1bW1hcnkgVGVzdCBTb2Z0TG93RnJlcXVlbmN5T3NjaWxsYXRvciBwcm9jZXNzQ29udHJvbExvZ2ljIG1ldGhvZCAqLworCitpbXBvcnQgY29tLnN1bi5tZWRpYS5zb3VuZC5BdWRpb1N5bnRoZXNpemVyUHJvcGVydHlJbmZvOworaW1wb3J0IGNvbS5zdW4ubWVkaWEuc291bmQuU29mdExvd0ZyZXF1ZW5jeU9zY2lsbGF0b3I7CitpbXBvcnQgY29tLnN1bi5tZWRpYS5zb3VuZC5Tb2Z0U3ludGhlc2l6ZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0UHJvY2Vzc0NvbnRyb2xMb2dpYyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBjb250cm9sX3JhdGUgPSAxNDdmOworICAgIHByaXZhdGUgc3RhdGljIFNvZnRTeW50aGVzaXplciBzeW50aCA9IG5ldyBTb2Z0U3ludGhlc2l6ZXIoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBTb2Z0TG93RnJlcXVlbmN5T3NjaWxsYXRvciBsZm8gPSBuZXcgU29mdExvd0ZyZXF1ZW5jeU9zY2lsbGF0b3IoKTsKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdExGTyhib29sZWFuIHNoYXJlZCwgaW50IGluc3RhbmNlLCBmbG9hdCBmcmVxLCBmbG9hdCBkZWxheSwKKyAgICAgICAgICAgIGZsb2F0IGRlbGF5MikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNvZnRMb3dGcmVxdWVuY3lPc2NpbGxhdG9yIGxmbyA9CisgICAgICAgICAgICBzaGFyZWQ/VGVzdFByb2Nlc3NDb250cm9sTG9naWMubGZvOm5ldyBTb2Z0TG93RnJlcXVlbmN5T3NjaWxsYXRvcigpOworICAgICAgICBsZm8ucmVzZXQoKTsKKyAgICAgICAgZG91YmxlW10gbGZvX2ZyZXEgPSBsZm8uZ2V0KGluc3RhbmNlLCAiZnJlcSIpOworICAgICAgICBkb3VibGVbXSBsZm9fZGVsYXkgPSBsZm8uZ2V0KGluc3RhbmNlLCAiZGVsYXkiKTsKKyAgICAgICAgZG91YmxlW10gbGZvX2RlbGF5MiA9IGxmby5nZXQoaW5zdGFuY2UsICJkZWxheTIiKTsKKyAgICAgICAgZG91YmxlW10gbGZvX291dHB1dCA9IGxmby5nZXQoaW5zdGFuY2UsIG51bGwpOworICAgICAgICBsZm9fZnJlcVswXSA9IGZyZXE7CisgICAgICAgIGxmb19kZWxheVswXSA9IGRlbGF5OworICAgICAgICBsZm9fZGVsYXkyWzBdID0gZGVsYXkyOworICAgICAgICBsZm8uaW5pdChzeW50aCk7CisKKyAgICAgICAgLy8gRm9yIGRlbGF5Q291bnQgYW1vdW50IHRpbWUsIHRoZSBvdXRwdXQgTEZPIHNob3VsZCBiZSAwLjUKKyAgICAgICAgaW50IGRlbGF5Q291bnQgPSAoaW50KSAoKE1hdGgucG93KDIsIGRlbGF5IC8gMTIwMC4wKSAqIGNvbnRyb2xfcmF0ZSkpOworICAgICAgICBkZWxheUNvdW50ICs9IChpbnQpICgoZGVsYXkyICogY29udHJvbF9yYXRlKSAvIDEwMDAuMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsYXlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoTWF0aC5hYnMoMC41IC0gbGZvX291dHB1dFswXSkgPiAwLjAwMDAwMSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbmNvcnJlY3QgTEZPIG91dHB1dCAoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyIwLjUgIT0gIitsZm9fb3V0cHV0WzBdKyIpISIpOworICAgICAgICAgICAgbGZvLnByb2Nlc3NDb250cm9sTG9naWMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFmdGVyIHRoZSBkZWxheSB0aGUgTEZPIHNob3VsZCBzdGFydCBvc2NpbGxhdGUKKyAgICAgICAgLy8gTGV0IG1ha2Ugc3VyZSBvdXRwdXQgaXMgYWNjdXJhdGUgZW5vdWdoCisgICAgICAgIGRvdWJsZSBwX3N0ZXAgPSAoNDQwLjAgLyBjb250cm9sX3JhdGUpCisgICAgICAgICogTWF0aC5leHAoKGZyZXEgLSA2OTAwLjApICogKE1hdGgubG9nKDIpIC8gMTIwMC4wKSk7CisgICAgICAgIGRvdWJsZSBwID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisgICAgICAgICAgICBwICs9IHBfc3RlcDsKKyAgICAgICAgICAgIGRvdWJsZSBwcmVkaWN0ZWRfb3V0cHV0ID0gMC41ICsgTWF0aC5zaW4ocCAqIDIgKiBNYXRoLlBJKSAqIDAuNTsKKyAgICAgICAgICAgIGlmIChNYXRoLmFicyhwcmVkaWN0ZWRfb3V0cHV0IC0gbGZvX291dHB1dFswXSkgPiAwLjAwMSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbmNvcnJlY3QgTEZPIG91dHB1dCAoIgorICAgICAgICAgICAgICAgICAgICAgICAgK3ByZWRpY3RlZF9vdXRwdXQrIiAhPSAiK2xmb19vdXRwdXRbMF0rIikhIik7CisgICAgICAgICAgICBsZm8ucHJvY2Vzc0NvbnRyb2xMb2dpYygpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBHZXQgZGVmYXVsdCBjb250cm9sIHJhdGUgZnJvbSBzeW50aGVzaXplcgorICAgICAgICBBdWRpb1N5bnRoZXNpemVyUHJvcGVydHlJbmZvW10gcCA9IHN5bnRoLmdldFByb3BlcnR5SW5mbyhudWxsKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocFtpXS5uYW1lLmVxdWFscygiY29udHJvbCByYXRlIikpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sX3JhdGUgPSAoKEZsb2F0KSBwW2ldLnZhbHVlKS5mbG9hdFZhbHVlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IExGTyB1bmRlciB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zCisgICAgICAgIGZvciAoaW50IGluc3RhbmNlID0gMDsgaW5zdGFuY2UgPCAzOyBpbnN0YW5jZSsrKQorICAgICAgICAgICAgZm9yIChpbnQgZDEgPSAtMzAwMDsgZDEgPCAwOyBkMSArPSAxMDAwKQorICAgICAgICAgICAgICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCA1MDAwOyBkMiArPSAxMDAwKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBmciA9IC0xMDAwOyBmciA8IDEwMDA7IGZyICs9IDEwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdExGTyh0cnVlLCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyID09IC0xMDAwKSA/IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZIDogZnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkMSA9PSAtMzAwMCkgPyBGbG9hdC5ORUdBVElWRV9JTkZJTklUWSA6IGQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMik7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TEZPKGZhbHNlLCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyID09IC0xMDAwKSA/IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZIDogZnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkMSA9PSAtMzAwMCkgPyBGbG9hdC5ORUdBVElWRV9JTkZJTklUWSA6IGQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L0NvbmZpZ1dpdGhRdW90YXRpb25zLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9Db25maWdXaXRoUXVvdGF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NWUzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9Db25maWdXaXRoUXVvdGF0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworLyoKKyAqIEB0ZXN0CisgKiBAYnVnIDY3MTQ4NDUKKyAqIEBzdW1tYXJ5IFF1b3RlcyBpbiBLZXJiZXJvcyBjb25maWd1cmF0aW9uIGZpbGUgYXJlIGluY2x1ZGVkIGluIHRoZSB2YWx1ZXMKKyAqLworCitpbXBvcnQgc3VuLnNlY3VyaXR5LmtyYjUuQ29uZmlnOworCitwdWJsaWMgY2xhc3MgQ29uZmlnV2l0aFF1b3RhdGlvbnMgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUaGlzIGNvbmZpZyBmaWxlIGlzIGdlbmVyYXRlZCB1c2luZyBLZXJiZXJvcy5hcHAgb24gYSBNYWMKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmtyYjUuY29uZiIsCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIikgKyIvZWR1Lm1pdC5LZXJiZXJvcyIpOworICAgICAgICBDb25maWcgY29uZmlnID0gQ29uZmlnLmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbmZpZyk7CisKKyAgICAgICAgaWYgKCFjb25maWcuZ2V0RGVmYXVsdFJlYWxtKCkuZXF1YWxzKCJNQUMuTE9DQUwiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiUmVhbG0gZXJyb3IiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvbmZpZy5nZXRLRENMaXN0KCJNQUMuTE9DQUwiKS5lcXVhbHMoImtkYy5tYWMubG9jYWw6ODgiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiS0RDIGVycm9yIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9lZHUubWl0LktlcmJlcm9zIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvZWR1Lm1pdC5LZXJiZXJvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQ3NmE2Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvZWR1Lm1pdC5LZXJiZXJvcwpAQCAtMCwwICsxLDE1IEBACitbZG9tYWluX3JlYWxtXQorCitbbGliZGVmYXVsdHNdCisJZGVmYXVsdF9yZWFsbSA9ICJNQUMuTE9DQUwiCisJZG5zX2ZhbGxiYWNrID0gIm5vIgorCitbbG9nZ2luZ10KKwlhZG1pbl9zZXJ2ZXIgPSAiRklMRTovdmFyL2xvZy9rcmI1a2RjL2thZG1pbi5sb2ciCisJa2RjID0gIkZJTEU6L3Zhci9sb2cva3JiNWtkYy9rZGMubG9nIgorCitbcmVhbG1zXQorCU1BQy5MT0NBTCA9IHsKKwkJa2RjID0gImtkYy5tYWMubG9jYWw6ODgiCisJfQorCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdXRpbC9PaWQvT2lkRm9ybWF0LmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdXRpbC9PaWQvT2lkRm9ybWF0LmphdmEKaW5kZXggOWRlNGE3NS4uMTBiN2ZkZCAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvT2lkL09pZEZvcm1hdC5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS91dGlsL09pZC9PaWRGb3JtYXQuamF2YQpAQCAtNjMsOSArNjMsMjIgQEAKICAgICAgICAgICAgICIxLjIuMyIsICIxLjIuMzQ0NSIsCiAgICAgICAgICAgICAiMS4zLjYuMS40LjEuNDIuMi4xNyIsCiAgICAgICAgICAgICAvLyA0ODExOTY4OiBBU04uMSBjYW5ub3QgaGFuZGxlIGh1Z2UgT0lEIGNvbXBvbmVudHMKLSAgICAgICAgICAgIC8vIjIuMTYuNzY0LjEuMzEwMTU1NTM5NC4xLjAuMTAwLjIuMSIsCi0gICAgICAgICAgICAvLyIxLjIuMjE0NzQ4MzY0Ny40IiwKLSAgICAgICAgICAgIC8vIjEuMi4yNjg0MzU0NTYuNCIsCisgICAgICAgICAgICAiMi4xNi43NjQuMS4zMTAxNTU1Mzk0LjEuMC4xMDAuMi4xIiwKKyAgICAgICAgICAgICIyLjI3MjY5NTc2MjQ5MzU2OTQzODY1OTI0MzUiLCAgLy8gYXMgaHVnZSBhcyBwb3NzaWJsZQorICAgICAgICAgICAgIjEuMi43Nzc3Nzc3Nzc3Nzc3Nzc3NzciLAorICAgICAgICAgICAgIjEuMi44ODg4ODg4ODg4ODg4ODg4ODguMTExMTExMTExMTExMTExLjIyMjIyMjIyMjIyMjIuMzMzMzMzMzMzMzMzMzMzMzMuNDQ0NDQ0NDQ0NDQ0NDQiLAorICAgICAgICAgICAgIjEuMi4iICsKKyAgICAgICAgICAgICAgICAiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMS4iICsKKyAgICAgICAgICAgICAgICAiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4iICsKKyAgICAgICAgICAgICAgICAiMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzLiIgKworICAgICAgICAgICAgICAgICI0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0LiIgKworICAgICAgICAgICAgICAgICI1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NS4iICsKKyAgICAgICAgICAgICAgICAiNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2LiIgKworICAgICAgICAgICAgICAgICI3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ny4iICsKKyAgICAgICAgICAgICAgICAiODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OC4iICsKKyAgICAgICAgICAgICAgICAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIsCisgICAgICAgICAgICAiMS4yLjIxNDc0ODM2NDcuNCIsCisgICAgICAgICAgICAiMS4yLjI2ODQzNTQ1Ni40IiwKICAgICAgICAgfTsKIAogICAgICAgICBmb3IgKFN0cmluZyBzOiBnb29kT2lkcykgewpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvT2lkL1MxMU4uc2ggYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdXRpbC9PaWQvUzExTi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzM0MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvT2lkL1MxMU4uc2gKQEAgLTAsMCArMSwxNjQgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDQtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyMgaGF2ZSBhbnkgcXVlc3Rpb25zLgorIworIyBAdGVzdAorIyBAYnVnIDQ4MTE5NjgKKyMgQHN1bW1hcnkgU2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb25zCisjIEBhdXRob3IgV2VpanVuIFdhbmcKKyMKKyMgc2V0IGEgZmV3IGVudmlyb25tZW50IHZhcmlhYmxlcyBzbyB0aGF0IHRoZSBzaGVsbC1zY3JpcHQgY2FuIHJ1biBzdGFuZC1hbG9uZQorIyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeQorCitpZiBbICIke1RFU1RTUkN9IiA9ICIiIF0gOyB0aGVuCisgIFRFU1RTUkM9Ii4iCitmaQoraWYgWyAiJHtURVNUQ0xBU1NFU30iID0gIiIgXSA7IHRoZW4KKyAgVEVTVENMQVNTRVM9Ii4iCitmaQoraWYgWyAiJHtURVNUSkFWQX0iID0gIiIgXSA7IHRoZW4KKyAgZWNobyAiVEVTVEpBVkEgbm90IHNldC4gIFRlc3QgY2Fubm90IGV4ZWN1dGUuIgorICBlY2hvICJGQUlMRUQhISEiCisgIGV4aXQgMQorZmkKKworIyBzZXQgcGxhdGZvcm0tZGVwZW5kZW50IHZhcmlhYmxlcworUEY9IiIKKworT1M9YHVuYW1lIC1zYAorY2FzZSAiJE9TIiBpbgorICBTdW5PUyApCisgICAgRlM9Ii8iCisgICAgQVJDSD1gaXNhaW5mb2AKKyAgICBjYXNlICIkQVJDSCIgaW4KKyAgICAgIHNwYXJjKiApCisgICAgICAgIFBGPSJzb2xhcmlzLXNwYXJjIgorICAgICAgICA7OworICAgICAgaVszLTZdODYgKQorICAgICAgICBQRj0ic29sYXJpcy1pNTg2IgorICAgICAgICA7OworICAgICAgYW1kNjQqICkKKyAgICAgICAgUEY9InNvbGFyaXMtYW1kNjQiCisgICAgICAgIDs7CisgICAgICAqICkKKyAgICAgICAgZWNobyAiVW5zdXBwb3J0ZWQgU3lzdGVtOiBTb2xhcmlzICR7QVJDSH0iCisgICAgICAgIGV4aXQgMDsKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgTGludXggKQorICAgIEFSQ0g9YHVuYW1lIC1tYAorICAgIEZTPSIvIgorICAgIGNhc2UgIiRBUkNIIiBpbgorICAgICAgaVszLTZdODYgKQorICAgICAgICBQRj0ibGludXgtaTU4NiIKKyAgICAgICAgOzsKKyAgICAgIGFtZDY0KiApCisgICAgICAgIFBGPSJsaW51eC1hbWQ2NCIKKyAgICAgICAgOzsKKyAgICAgICogKQorICAgICAgICBlY2hvICJVbnN1cHBvcnRlZCBTeXN0ZW06IExpbnV4ICR7QVJDSH0iCisgICAgICAgIGV4aXQgMDsKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgV2luZG93cyogKQorICAgIEZTPSJcXCIKKyAgICBQRj0id2luZG93cy1pNTg2IgorCisgICAgIyAndW5hbWUgLW0nIGRvZXMgbm90IGdpdmUgdXMgZW5vdWdoIGluZm9ybWF0aW9uIC0KKyAgICAjICBzaG91bGQgcmVseSBvbiAkUFJPQ0VTU09SX0lERU5USUZJRVIgKGFzIGlzIGRvbmUgaW4gRGVmcy13aW5kb3dzLmdtayksCisgICAgIyAgYnV0IEpUUkVHIGRvZXMgbm90IHBhc3MgdGhpcyBlbnYgdmFyaWFibGUgd2hlbiBleGVjdXRpbmcgYSBzaGVsbCBzY3JpcHQuCisgICAgIworICAgICMgIGV4ZWN1dGUgdGVzdCBwcm9ncmFtIC0gcmVseSBvbiBpdCB0byBleGl0IGlmIHBsYXRmb3JtIHVuc3VwcG9ydGVkCisKKyAgICA7OworICAqICkKKyAgICBlY2hvICJVbnN1cHBvcnRlZCBTeXN0ZW06ICR7T1N9IgorICAgIGV4aXQgMDsKKyAgICA7OworZXNhYworCisjIHRoZSB0ZXN0IGNvZGUKKworJHtURVNUSkFWQX0ke0ZTfWJpbiR7RlN9amF2YWMgLXNvdXJjZSAxLjMgLXRhcmdldCAxLjMgLWQgLiAke1RFU1RTUkN9JHtGU31TZXJpYWxUZXN0LmphdmEgfHwgZXhpdCAxMAorCitPTERKQVZBPSIKKyAgICAvamF2YS9yZS9qMnNlLzEuNi4wL2xhdGVzdC9iaW5hcmllcy8ke1BGfQorICAgIC9qYXZhL3JlL2oyc2UvMS41LjAvbGF0ZXN0L2JpbmFyaWVzLyR7UEZ9CisgICAgL2phdmEvcmUvajJzZS8xLjQuMi9sYXRlc3QvYmluYXJpZXMvJHtQRn0KKyIKKworU01BTEw9IgorICAgIDAuMAorICAgIDEuMQorICAgIDIuMgorICAgIDEuMi4zNDU2CisgICAgMS4yLjIxNDc0ODM2NDcuNAorICAgIDEuMi4yNjg0MzU0NTYuNAorIgorCitIVUdFPSIKKyAgICAyLjE2Ljc2NC4xLjMxMDE1NTUzOTQuMS4wLjEwMC4yLjEKKyAgICAxLjIuMjE0NzQ4MzY0OC40CisgICAgMi4zLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQKKyAgICAxLjIuODg4ODg4ODg4ODg4ODg4ODg4LjExMTExMTExMTExMTExMS4yMjIyMjIyMjIyMjIyLjMzMzMzMzMzMzMzMzMzMzMzLjQ0NDQ0NDQ0NDQ0NDQ0CisiCisKK2ZvciBvaWQgaW4gJHtTTUFMTH07IGRvCisgICAgZWNobyAke29pZH0KKyAgICAjIG5ldyAtPgorICAgICR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmEgU2VyaWFsVGVzdCBvdXQgJHtvaWR9ID4gdG1wLm9pZC5zZXJpYWwgfHwgZXhpdCAxCisgICAgIyAtPiBuZXcKKyAgICAke1RFU1RKQVZBfSR7RlN9YmluJHtGU31qYXZhIFNlcmlhbFRlc3QgaW4gJHtvaWR9IDwgdG1wLm9pZC5zZXJpYWwgfHwgZXhpdCAyCisgICAgZm9yIG9sZGogaW4gJHtPTERKQVZBfTsgZG8KKyAgICAgICAgaWYgWyAtZCAke29sZGp9IF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gJHtvbGRqfQorICAgICAgICAgICAgIyAtPiBvbGQKKyAgICAgICAgICAgICR7b2xkan0ke0ZTfWJpbiR7RlN9amF2YSBTZXJpYWxUZXN0IGluICR7b2lkfSA8IHRtcC5vaWQuc2VyaWFsIHx8IGV4aXQgMworICAgICAgICAgICAgIyBvbGQgLT4KKyAgICAgICAgICAgICR7b2xkan0ke0ZTfWJpbiR7RlN9amF2YSBTZXJpYWxUZXN0IG91dCAke29pZH0gPiB0bXAub2lkLnNlcmlhbC5vbGQgfHwgZXhpdCA0CisgICAgICAgICAgICAjIC0+IG5ldworICAgICAgICAgICAgJHtURVNUSkFWQX0ke0ZTfWJpbiR7RlN9amF2YSBTZXJpYWxUZXN0IGluICR7b2lkfSA8IHRtcC5vaWQuc2VyaWFsLm9sZCB8fCBleGl0IDUKKyAgICAgICAgZmkKKyAgICBkb25lCitkb25lCisKK2ZvciBvaWQgaW4gJHtIVUdFfTsgZG8KKyAgICBlY2hvICR7b2lkfQorICAgICMgbmV3IC0+CisgICAgJHtURVNUSkFWQX0ke0ZTfWJpbiR7RlN9amF2YSBTZXJpYWxUZXN0IG91dCAke29pZH0gPiB0bXAub2lkLnNlcmlhbCB8fCBleGl0IDEKKyAgICAjIC0+IG5ldworICAgICR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmEgU2VyaWFsVGVzdCBpbiAke29pZH0gPCB0bXAub2lkLnNlcmlhbCB8fCBleGl0IDIKKyAgICBmb3Igb2xkaiBpbiAke09MREpBVkF9OyBkbworICAgICAgICBpZiBbIC1kICR7b2xkan0gXTsgdGhlbgorICAgICAgICAgICAgZWNobyAke29sZGp9CisgICAgICAgICAgICAjIC0+IG9sZAorICAgICAgICAgICAgJHtvbGRqfSR7RlN9YmluJHtGU31qYXZhIFNlcmlhbFRlc3QgYmFkaW4gPCB0bXAub2lkLnNlcmlhbCB8fCBleGl0IDMKKyAgICAgICAgZmkKKyAgICBkb25lCitkb25lCisKK3JtIC1mIHRtcC5vaWQuc2VyaWFsCitybSAtZiB0bXAub2lkLnNlcmlhbC5vbGQKK3JtIC1mIFNlcmlhbFRlc3QuY2xhc3MKKworZXhpdCAwCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdXRpbC9PaWQvU2VyaWFsVGVzdC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvT2lkL1NlcmlhbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg1MTZlCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvT2lkL1NlcmlhbFRlc3QuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKKyAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCisgKiBoYXZlIGFueSBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIHJlYWQgUzExLnNoCisgKi8KK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgc3VuLnNlY3VyaXR5LnV0aWwuKjsKKworLyoqCisgKiBUZXN0IE9JRCBzZXJpYWxpemF0aW9uIGJldHdlZW4gdmVyc2lvbnMKKyAqCisgKiBqYXZhIFNlcmlhbFRlc3Qgb3V0IG9pZCAgLy8gd3JpdGUgYSBPSUQgaW50byBTeXN0ZW0ub3V0CisgKiBqYXZhIFNlcmlhbFRlc3QgaW4gb2lkICAgLy8gcmVhZCBmcm9tIFN5c3RlbS5pbiBhbmQgY29tcGFyZSBpdCB3aXRoIG9pZAorICogamF2YSBTZXJpYWxUZXN0IGJhZGluICAgIC8vIG1ha2Ugc3VyZSAqY2Fubm90KiByZWFkIGZyb20gU3lzdGVtLmluCisgKi8KK2NsYXNzIFNlcmlhbFRlc3QgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoYXJnc1swXS5lcXVhbHMoIm91dCIpKQorICAgICAgICAgICAgb3V0KGFyZ3NbMV0pOworICAgICAgICBlbHNlIGlmIChhcmdzWzBdLmVxdWFscygiaW4iKSkKKyAgICAgICAgICAgIGluKGFyZ3NbMV0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiYWRpbigpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGluKFN0cmluZyBvaWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPYmplY3RJZGVudGlmaWVyIG8gPSAoT2JqZWN0SWRlbnRpZmllcikgKG5ldyBPYmplY3RJbnB1dFN0cmVhbShTeXN0ZW0uaW4pLnJlYWRPYmplY3QoKSk7CisgICAgICAgIGlmICghby50b1N0cmluZygpLmVxdWFscyhvaWQpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiUmVhZCBGYWlsICIgKyBvICsgIiwgbm90ICIgKyBvaWQpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGJhZGluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gcGFzcyA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oU3lzdGVtLmluKS5yZWFkT2JqZWN0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhc3MpIHRocm93IG5ldyBFeGNlcHRpb24oIlNob3VsZCBmYWlsIGJ1dCBub3QiKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvdXQoU3RyaW5nIG9pZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oU3lzdGVtLm91dCkud3JpdGVPYmplY3QobmV3IE9iamVjdElkZW50aWZpZXIob2lkKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvdG9vbHMvbGF1bmNoZXIvTXVsdGlwbGVKUkUuc2ggYi9qZGsvdGVzdC90b29scy9sYXVuY2hlci9NdWx0aXBsZUpSRS5zaAppbmRleCBiM2UxY2Y3Li5hNmRmYWFhIDEwMDY0NAotLS0gYS9qZGsvdGVzdC90b29scy9sYXVuY2hlci9NdWx0aXBsZUpSRS5zaAorKysgYi9qZGsvdGVzdC90b29scy9sYXVuY2hlci9NdWx0aXBsZUpSRS5zaApAQCAtMSwxNCArMSwxNCBAQAogIyBAdGVzdCBNdWx0aXBsZUpSRS5zaAotIyBAYnVnIDQ4MTExMDIgNDk1MzcxMSA0OTU1NTA1IDQ5NTYzMDEgNDk5MTIyOSA0OTk4MjEwIDUwMTg2MDUgNjM4NzA2OQorIyBAYnVnIDQ4MTExMDIgNDk1MzcxMSA0OTU1NTA1IDQ5NTYzMDEgNDk5MTIyOSA0OTk4MjEwIDUwMTg2MDUgNjM4NzA2OSA2NzMzOTU5CiAjIEBidWlsZCBQcmludFZlcnNpb24KICMgQGJ1aWxkIFVnbHlQcmludFZlcnNpb24KKyMgQGJ1aWxkIFppcE1lVXAKICMgQHJ1biBzaGVsbCBNdWx0aXBsZUpSRS5zaAogIyBAc3VtbWFyeSBWZXJpZnkgTXVsdGlwbGUgSlJFIHZlcnNpb24gc3VwcG9ydAogIyBAYXV0aG9yIEpvc2VwaCBFLiBLb3dhbHNraQogCi0KICMKLSMgQ29weXJpZ2h0IDIwMDMtMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwMy0yMDA4IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ5LDExICs0OSwyNiBAQAogICBleGl0IDEKIGZpCiAKK0pBVkFFWEU9IiRURVNUSkFWQS9iaW4vamF2YSIKIEpBVkE9IiRURVNUSkFWQS9iaW4vamF2YSAtY2xhc3NwYXRoICRURVNUQ0xBU1NFUyIKIEpBUj0iJFRFU1RKQVZBL2Jpbi9qYXIiCiBPUz1gdW5hbWUgLXNgOwogCiAjCisjIFRlc3RzIHdoZXRoZXIgd2UgYXJlIG9uIHdpbmRvd3MgKHRydWUpIG9yIG5vdC4KKyMKK0lzV2luZG93cygpIHsKKyAgICBjYXNlICIkT1MiIGluCisgICAgICAgIFdpbmRvd3MqIHwgQ1lHV0lOKiApCisgICAgICAgICAgICBwcmludGYgInRydWUiCisJOzsKKwkqICkKKyAgICAgICAgICAgIHByaW50ZiAiZmFsc2UiCisJOzsKKyAgICBlc2FjCit9CisKKyMKICMgU2hlbGwgcm91dGluZSB0byB0ZXN0IGZvciB0aGUgcHJvcGVyIHJlamVjdGlvbiBvZiBzeW50YWN0aWNhbGx5IGluY29ycmVjdAogIyB2ZXJzaW9uIHNwZWNpZmljYXRpb25zLgogIwpAQCAtMTM5LDcgKzE1NCw2IEBACiAJICAgICRQQUNLQUdFL1VnbHlQcmludFZlcnNpb24uY2xhc3MKIH0KIAotCiAjCiAjIENvbnN0cnVjdHMgYSBqYXIgZmlsZSB3aXRoIGEgZmFpciBudW1iZXIgb2YgInppcCBkaXJlY3RvcnkiIGVudHJpZXMgYW5kCiAjIHRoZSBNQU5JRkVTVC5NRiBlbnRyeSBhdCBvciBuZWFyIHRoZSBlbmQgb2YgdGhhdCBkaXJlY3RvcnkgdG8gdmFsaWRhdGUKQEAgLTI2Miw2ICsyNzYsMjkgQEAKIAlmaQogfQogCisjIFRlc3RzIHZlcnkgbG9uZyBNYWluLUNsYXNzIGF0dHJpYnV0ZSBpbiB0aGUgamFyCitUZXN0TG9uZ01haW5DbGFzcygpIHsKKyAgICBKVkVSPSQxCisgICAgaWYgWyAiJEpWRVIiID0gIm1rbGluayIgXTsgdGhlbgorICAgICAgICBKVkVSPVhYCisgICAgICAgIEpES1hYPWpkay9qMnJlJEpWRVIKKyAgICAgICAgcm0gLXJmIGpkaworICAgICAgICBta2RpciBqZGsKKyAgICAgICAgbG4gLXMgJFRFU1RKQVZBICRKREtYWAorICAgICAgICBKQVZBX1ZFUlNJT05fUEFUSD0iYHB3ZGAvamRrIgorICAgICAgICBleHBvcnQgSkFWQV9WRVJTSU9OX1BBVEgKKyAgICBmaQorICAgICRKQVZBRVhFIC1jcCAkVEVTVENMQVNTRVMgWmlwTWVVcCBVZ2x5QmV0dHkuamFyIDQwOTcgCisgICAgbWVzc2FnZT0iYCRKQVZBRVhFIC12ZXJzaW9uOiRKVkVSIC1qYXIgVWdseUJldHR5LmphciAyPiYxYCIKKyAgICBlY2hvICRtZXNzYWdlIHwgZ3JlcCAiRXJyb3I6IG1haW4tY2xhc3M6IGF0dHJpYnV0ZSBleGNlZWRzIHN5c3RlbSBsaW1pdHMiID4gL2Rldi9udWxsIDI+JjEKKyAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICJMb25nIG1hbmlmZXN0IHRlc3QgZGlkIG5vdCBnZXQgZXhwZWN0ZWQgZXJyb3IiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgdW5zZXQgSkFWQV9WRVJTSU9OX1BBVEgKKyAgICBybSAtcmYgamRrCit9CisKICMKICMgTWFpbiB0ZXN0IHNlcXVlbmNlIHN0YXJ0cyBoZXJlCiAjCkBAIC0yODAsMTQgKzMxNywxMSBAQAogTGF1bmNoVk0gIiIgIiR7UkVMRUFTRX0iCiBDcmVhdGVKYXIgIiIgIjAiCiBMYXVuY2hWTSAiIiAiJHtSRUxFQVNFfSIKLWNhc2UgIiRPUyIgaW4KLQlXaW5kb3dzKiB8IENZR1dJTiogKQotCQlNQVhJTVVNX1BBVEg9MjU1OwotCTs7Ci0JKikKLQkJTUFYSU1VTV9QQVRIPTEwMjQ7Ci0JOzsKLWVzYWMKK2lmIFsgYElzV2luZG93c2AgPSAidHJ1ZSIgXTsgdGhlbgorICAgIE1BWElNVU1fUEFUSD0yNTU7CitlbHNlCisgICAgTUFYSU1VTV9QQVRIPTEwMjQ7CitmaQogCiBQQVRIX0xFTkdUSD1gcHJpbnRmICIlcyIgIiRVR0xZQ0xBU1MiIHwgd2MgLWNgCiBpZiBbICR7UEFUSF9MRU5HVEh9IC1sdCAke01BWElNVU1fUEFUSH0gXTsgdGhlbgpAQCAtMzQ2LDcgKzM4MCw2IEBACiAJTGF1bmNoVk0gIiIgIiR7UkVMRUFTRX0iCiBmaQogCi0KICMKICMgVGhyb3cgc29tZSBzeW50YWN0aWNhbGx5IGNoYWxsZW5nZWQgKGlsbGVnYWwpIHZlcnNpb24gc3BlY2lmaWVycyBhdAogIyB0aGUgaW50ZXJmYWNlLiAgRmFpbHVyZSAob2YgdGhlIGxhdW5jaGVyKSBpcyBzdWNjZXNzIGZvciB0aGUgdGVzdC4KQEAgLTM1NywxNSArMzkwLDI4IEBACiBUZXN0U3ludGF4ICIxLjIrLjMiCQkJCSMgRW1iZWRkZWQgbW9kaWZpZXIKIFRlc3RTeW50YXggIjEuMi40KyYxLjIqJjErKyIJCQkjIExvbmcgYW5kIGludmFsaWQKIAorIyBPbiB3aW5kb3dzIHdlIHNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIGpyZSBpbnN0YWxsZWQsIHVzdWFsbHkKKyMgdGhlcmUgaXMsIHRoZW4gd2UgdGVzdCB1c2luZyB0aGF0LCBvdGhlcndpc2UgbGlua3MgYXJlIGNyZWF0ZWQKKyMgdG8gZ2V0IHRocm91Z2ggdG8gU2VsZWN0VmVyc2lvbi4KK2lmIFsgYElzV2luZG93c2AgPSAiZmFsc2UiIF07IHRoZW4KKyAgIFRlc3RMb25nTWFpbkNsYXNzICJta2xpbmsiCitlbHNlCisgICAgJEpBVkFFWEUgLXZlcnNpb246MS4wKworICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgorICAgICAgICBUZXN0TG9uZ01haW5DbGFzcyAiMS4wKyIKKyAgICBlbHNlCisgICAgICAgIHByaW50ZiAgIldhcm5pbmc6IFRlc3RMb25nTWFpbkNsYXNzIHNraXBwZWQgYXMgdGhlcmUgaXMgbm8iCisJcHJpbnRmICAidmlhYmxlIE1KUkUgaW5zdGFsbGVkLlxuIgorICAgIGZpCitmaQorCiAjCiAjIEJlY2F1c2Ugc2NyaWJibGluZyBpbiB0aGUgcmVnaXN0cnkgY2FuIGJlIHJhdGhlciBkZXN0cnVjdGl2ZSwgb25seSBhCiAjIHN1YnNldCBvZiB0aGUgdGVzdHMgYXJlIHJ1biBvbiBXaW5kb3dzLgogIwotY2FzZSAiJE9TIiBpbgotCVdpbmRvd3MqIHwgQ1lHV0lOKiApCi0JCWV4aXQgMDsKLQk7OwotZXNhYworaWYgWyBgSXNXaW5kb3dzYCA9ICJ0cnVlIiBdOyB0aGVuCisgICAgZXhpdCAwOworZmkKIAogIwogIyBBZGRpdGlvbmFsIHZlcnNpb24gc3BlY2lmaWVycyBjb250YWluaW5nIHNwYWNlcy4gIChTaWdoLCB1bmFibGUgdG8KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3Rvb2xzL2xhdW5jaGVyL1ppcE1lVXAuamF2YSBiL2pkay90ZXN0L3Rvb2xzL2xhdW5jaGVyL1ppcE1lVXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQzZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvdG9vbHMvbGF1bmNoZXIvWmlwTWVVcC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAorICogQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKKyAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KKyAqLworCisvKioKKyAqIEEgc2ltcGxlIGNsYXNzIHRvIGNyZWF0ZSBvdXIgZXJyaW5nIEphciB3aXRoIGEgdmVyeSBsb25nIE1haW4tQ2xhc3MKKyAqIGF0dHJpYnV0ZSBpbiB0aGUgbWFuaWZlc3QuCisgKi8KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CitpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja2VkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07CitwdWJsaWMgY2xhc3MgWmlwTWVVcCB7CisKKyAgICBzdGF0aWMgZmluYWwgQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU09NRV9LTEFTUyA9ICIuU29tZSI7CisKKyAgICBzdGF0aWMgYnl0ZVtdIGdldE1hbmlmZXN0QXNCeXRlcyhpbnQgbmNoYXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjcmMucmVzZXQoKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENoZWNrZWRPdXRwdXRTdHJlYW0gY29zID0gbmV3IENoZWNrZWRPdXRwdXRTdHJlYW0oYmFvcywgY3JjKTsKKyAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oY29zKTsKKyAgICAgICAgcHMucHJpbnRsbigiTWFuaWZlc3QtVmVyc2lvbjogMS4wIik7CisgICAgICAgIHBzLnByaW50KCJNYWluLUNsYXNzOiAiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbmNoYXJzIC0gU09NRV9LTEFTUy5sZW5ndGgoKSA7IGkrKykgeworICAgICAgICAgICAgcHMucHJpbnQoaSUxMCk7CisgICAgICAgIH0KKyAgICAgICAgcHMucHJpbnRsbihTT01FX0tMQVNTKTsKKyAgICAgICAgY29zLmZsdXNoKCk7CisgICAgICAgIGNvcy5jbG9zZSgpOworICAgICAgICBwcy5jbG9zZSgpOworICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhcmd1bWVudHMgYXJlOiBmaWxlbmFtZV90b19jcmVhdGUgbGVuZ3RoCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcuLi5hcmdzKSB0aHJvd3MgRXhjZXB0aW9uICB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYXJnc1swXSk7CisgICAgICAgIFppcE91dHB1dFN0cmVhbSB6b3MgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKGZvcyk7CisgICAgICAgIGJ5dGVbXSBtYW5pZmVzdCA9IGdldE1hbmlmZXN0QXNCeXRlcyhJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMV0pKTsKKyAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoIk1FVEEtSU5GL01BTklGRVNULk1GIik7CisgICAgICAgIHplLnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOworICAgICAgICB6ZS5zZXRTaXplKG1hbmlmZXN0Lmxlbmd0aCk7CisgICAgICAgIHplLnNldENvbXByZXNzZWRTaXplKG1hbmlmZXN0Lmxlbmd0aCk7CisgICAgICAgIHplLnNldENyYyhjcmMuZ2V0VmFsdWUoKSk7CisgICAgICAgIHplLnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICB6b3MucHV0TmV4dEVudHJ5KHplKTsKKyAgICAgICAgem9zLndyaXRlKG1hbmlmZXN0KTsKKyAgICAgICAgem9zLmZsdXNoKCk7CisKKyAgICAgICAgLy8gYWRkIGEgemVybyBsZW5ndGggY2xhc3MKKyAgICAgICAgemUgPSBuZXcgWmlwRW50cnkoU09NRV9LTEFTUyArICIuY2xhc3MiKTsKKyAgICAgICAgemUuc2V0TWV0aG9kKFppcEVudHJ5LlNUT1JFRCk7CisgICAgICAgIHplLnNldFNpemUoMCk7CisgICAgICAgIHplLnNldENvbXByZXNzZWRTaXplKDApOworICAgICAgICB6ZS5zZXRDcmMoMCk7CisgICAgICAgIHplLnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICB6b3MucHV0TmV4dEVudHJ5KHplKTsKKyAgICAgICAgem9zLmZsdXNoKCk7CisgICAgICAgIHpvcy5jbG9zZUVudHJ5KCk7CisgICAgICAgIHpvcy5jbG9zZSgpOworICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvLmhndGFncyBiL2xhbmd0b29scy8uaGd0YWdzCmluZGV4IDIzOTJhMjAuLjI0MWY1MWMgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy8uaGd0YWdzCisrKyBiL2xhbmd0b29scy8uaGd0YWdzCkBAIC0zMCwzICszMCw0IEBACiBkYmRlYjRhNzU4MWIyYTg2OTk2NDRiOTFjYWU2NzkzY2IwMTk1M2Y3IGpkazctYjUzCiAxOTdhN2Y4ODE5MzdkNDA2YTAxMjE0YWE5ZGVkNDljMDczZjdkMzgwIGpkazctYjU0CiA3Mzk0YTg2OTRjZWRlYTU3NGM3ZGJkMzhkZTg3ZjRjYmUwZTI3YjhhIGpkazctYjU1Cis4MjVmMjNhNGYyNjJlYjA2Y2ZjOTQ0MDYxNDBmM2JmZWNiMTdmZmU4IGpkazctYjU2CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvbWFrZS9qcHJ0LnByb3BlcnRpZXMgYi9sYW5ndG9vbHMvbWFrZS9qcHJ0LnByb3BlcnRpZXMKaW5kZXggMjZmZmQ2MS4uZjc1ODcxZCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL21ha2UvanBydC5wcm9wZXJ0aWVzCisrKyBiL2xhbmd0b29scy9tYWtlL2pwcnQucHJvcGVydGllcwpAQCAtMzIsMTMgKzMyLDEzIEBACiBzb2xhcmlzX3NwYXJjdjlfNS4xMCxcCiBzb2xhcmlzX2k1ODZfNS4xMCxcCiBzb2xhcmlzX3g2NF81LjEwLFwKLWxpbnV4X2k1ODYsXAotbGludXhfeDY0LFwKK2xpbnV4X2k1ODZfMi42LFwKK2xpbnV4X3g2NF8yLjYsXAogd2luZG93c19pNTg2LFwKIHdpbmRvd3NfeDY0CiAKICMgVGhlIGRpZmZlcmVudCBidWlsZCBmbGF2b3JzIHdlIHdhbnQKLWpwcnQuYnVpbGQuZmxhdm9ycz1wcm9kdWN0CitqcHJ0LmJ1aWxkLmZsYXZvcnM9cHJvZHVjdCxmYXN0ZGVidWcKIAogIyBFeHBsaWNpdGx5IGRlc2lnbmF0ZSB3aGF0IHRoZSAzMmJpdCBtYXRjaCBpcyBmb3IgdGhlIDY0Yml0IGJ1aWxkCiBqcHJ0LnNvbGFyaXNfc3BhcmN2OS5idWlsZC5wbGF0Zm9ybS5tYXRjaDMyPXNvbGFyaXNfc3BhcmNfNS4xMApkaWZmIC0tZ2l0IGEvbWFrZS9qcHJ0LmNvbmZpZyBiL21ha2UvanBydC5jb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTY1NDcuLjAwMDAwMDAKLS0tIGEvbWFrZS9qcHJ0LmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi0jIWVjaG8gIlRoaXMgaXMgbm90IGEgc2hlbGwgc2NyaXB0IgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgQ29weXJpZ2h0IDIwMDYtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0jCi0jIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0jIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0jIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotIwotIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0jIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotIwotIyBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSMgQ0EgOTUwNTQgVVNBIG9yIHZpc2l0IHd3dy5zdW4uY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IKLSMgaGF2ZSBhbnkgcXVlc3Rpb25zLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgSlBSVCBzaGVsbCBjb25maWd1cmF0aW9uIGZvciBidWlsZGluZy4KLSMKLSMgSW5wdXQgZW52aXJvbm1lbnQgdmFyaWFibGVzOgotIyAgICBBTFRfQk9PVERJUgotIyAgICBBTFRfU0xBU0hfSkFWQQotIyAgICBBTFRfSkRLX0lNUE9SVF9QQVRICi0jICAgIE9QRU5KREsKLSMgICAgV2luZG93cyBPbmx5OgotIyAgICAgIFBBVEgKLSMgICAgICBWUzcxQ09NTlRPT0xTCi0jICAgICAgUFJPQ0VTU09SX0lERU5USUZJRVIKLSMgICAgICBST09URElSCi0jCi0jIE91dHB1dCB2YXJpYWJsZSBzZXR0aW5nczoKLSMgICAgbWFrZSAgICAgICAgICAgIEZ1bGwgcGF0aCB0byBHTlUgbWFrZQotIyAgICBjb21waWxlcl9wYXRoICAgUGF0aCB0byBjb21waWxlciBiaW4gZGlyZWN0b3J5Ci0jICAgIGNvbXBpbGVyX25hbWUgICBVbmlxdWUgbmFtZSBvZiB0aGlzIGNvbXBpbGVyCi0jCi0jIE91dHB1dCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0jICAgIFBBVEgKLSMgICAgQUxUX0NPTVBJTEVSX1BBVEgKLSMgICAgT1BFTkpESyBvbmx5OgotIyAgICAgIEFMVF9DTE9TRURfSkRLX0lNUE9SVF9QQVRICi0jICAgICAgQUxUX0pES19ERVZUT09MU19ESVIKLSMgICAgV2luZG93cyBPbmx5OgotIyAgICAgIEFMVF9NU0RFVlRPT0xTX1BBVEgKLSMgICAgICBBTFRfREVWVE9PTFNfUEFUSCAoVG8gYXZvaWQgdGhlIEM6L1VUSUxTIGRlZmF1bHQpCi0jICAgICAgTElCCi0jICAgICAgSU5DTFVERQotIwotIyBBZnRlciBKREs2LCBtb3N0IHNldHRpbmdzIHdpbGwgYmUgZm91bmQgdmlhIEFMVF9TTEFTSF9KQVZBIG9yCi0jICAgYnkgd2F5IG9mIG90aGVyIHN5c3RlbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIElmIHRoaXMgd2FzIEpESzUKLSMgICBvciBhbiBvbGRlciBKREssIHlvdSBtaWdodCBuZWVkIHRvIGV4cG9ydCBtb3JlIEFMVF8qIHZhcmlhYmxlcy4KLSMKLSMgT24gV2luZG93cyBBTUQ2NCwgaWYgTVNTREsgaXMgbm90IHNldCwgYXNzdW1lcyBQbGF0Zm9ybSBTREsgaXMgaW5zdGFsbGVkIGF0OgotIyAgICAgICAgICBDOi9Qcm9ncmFtIEZpbGVzL01pY3Jvc29mdCBQbGF0Zm9ybSBTREsKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVycm9yCi1lcnJvcigpICMgbWVzc2FnZQotewotICBlY2hvICJFUlJPUjogJDEiCi0gIGV4aXQgNgotfQotIyBEaXJlY3RvcnkgbXVzdCBleGlzdAotZGlyTXVzdEV4aXN0KCkgIyBkaXIgbmFtZQotewotICBpZiBbICEgLWQgIiQxIiBdIDsgdGhlbgotICAgIGVycm9yICJEaXJlY3RvcnkgZm9yICQyIGRvZXMgbm90IGV4aXN0OiAkMSIKLSAgZmkKLX0KLSMgRmlsZSBtdXN0IGV4aXN0Ci1maWxlTXVzdEV4aXN0KCkgIyBkaXIgbmFtZQotewotICBpZiBbICEgLWYgIiQxIiBdIDsgdGhlbgotICAgIGVycm9yICJGaWxlIGZvciAkMiBkb2VzIG5vdCBleGlzdDogJDEiCi0gIGZpCi19Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFNob3VsZCBiZSBzZXQgYnkgSlBSVCBhcyB0aGUgMyBiYXNpYyBpbnB1dHMKLWJvb3RkaXI9IiR7QUxUX0JPT1RESVJ9Igotc2xhc2hqYXZhPSIke0FMVF9TTEFTSF9KQVZBfSIKLWpka19pbXBvcnQ9IiR7QUxUX0pES19JTVBPUlRfUEFUSH0iCi0KLSMgVGhlIC9qYXZhL2RldnRvb2xzIGl0ZW1zCi1qZGtfZGV2dG9vbHM9IiR7c2xhc2hqYXZhfS9kZXZ0b29scyIKLXNoYXJlPSIke2pka19kZXZ0b29sc30vc2hhcmUiCi0KLSMgTmVlZGVkIGZvciBsYW5ndG9vbHMsIG1heWJlIG90aGVyIHBhcnRzIG9mIHRoZSBidWlsZAotQU5UX0hPTUU9IiR7c2hhcmV9L2FudC9sYXRlc3QiCi1leHBvcnQgQU5UX0hPTUUKLQotIyBUaGUgMyBiaW4gZGlyZWN0b3JpZXMgaW4gY29tbW9uIHRvIGFsbCBwbGF0Zm9ybXMKLXNoYXJlYmluPSIke3NoYXJlfS9iaW4iCi1hbnRiaW49IiR7QU5UX0hPTUV9L2JpbiIKLQotIyBDaGVjayBpbnB1dAotZGlyTXVzdEV4aXN0ICIke2Jvb3RkaXJ9IiAgICAgICAgIEFMVF9CT09URElSCi1kaXJNdXN0RXhpc3QgIiR7c2xhc2hqYXZhfSIgICAgICAgQUxUX1NMQVNIX0pBVkEKLWRpck11c3RFeGlzdCAiJHtqZGtfaW1wb3J0fSIgICAgICBBTFRfSkRLX0lNUE9SVF9QQVRICi1kaXJNdXN0RXhpc3QgIiR7QU5UX0hPTUV9IiAgICAgICAgQU5UX0hPTUUKLQotIyBJZiBBTFRfUFJFVklPVVNfUkVMRUFTRV9JTUFHRSBub3QgZGVmaW5lZCwgc2V0IGl0IHRvIHRoZSBib290ZGlyIGFyZWEgZm9yCi0jICAgIGFueSBwb3NzaWJsZSBpbWFnZSBjb21wYXJpc29ucy4KLSMgICAgV2UgYXNzdW1lIGJvb3RkaXIgaXMgYSBwcmV2aW91cyBqZGsgcmVsZWFzZSBpbWFnZSwgdmFsaWQgZm9yIGNvbXBhcmlzb24KLSMgICAgcmVhc29ucy4KLWlmIFsgIiR7QUxUX1BSRVZJT1VTX1JFTEVBU0VfSU1BR0V9IiA9ICIiIF0gOyB0aGVuCi0gICBBTFRfUFJFVklPVVNfUkVMRUFTRV9JTUFHRT0iJHtib290ZGlyfSIKLSAgIGV4cG9ydCBBTFRfUFJFVklPVVNfUkVMRUFTRV9JTUFHRQotZmkKLQotIyBVc2UgdGhlIEpESyBpbXBvcnQgZm9yIG5vdyAoRklYTUU6IHVzZSB0aGUgYmluYXJ5IHBsdWdzPykKLWlmIFsgIiR7T1BFTkpES30iID0gdHJ1ZSBdIDsgdGhlbgotICBBTFRfQ0xPU0VEX0pES19JTVBPUlRfUEFUSD0iJHtqZGtfaW1wb3J0fSIKLSAgZXhwb3J0IEFMVF9DTE9TRURfSkRLX0lNUE9SVF9QQVRICi1maQotCi0jIFVzZXMgJ3VuYW1lIC1zJywgYnV0IG9ubHkgZXhwZWN0IFN1bk9TIG9yIExpbnV4LCBhc3N1bWUgV2luZG93cyBvdGhlcndpc2UuCi1vc25hbWU9YHVuYW1lIC1zYAotaWYgWyAiJHtvc25hbWV9IiA9IFN1bk9TIF0gOyB0aGVuCi0gICAKLSAgICAjIFNPTEFSSVM6IFNwYXJjIG9yIFg4NgotICAgIG9zYXJjaD1gdW5hbWUgLXBgCi0gICAgaWYgWyAiJHtvc2FyY2h9IiA9IHNwYXJjIF0gOyB0aGVuCi0Jc29sYXJpc19hcmNoPXNwYXJjCi0gICAgZWxzZQotCXNvbGFyaXNfYXJjaD1pMzg2Ci0gICAgZmkKLQotICAgICMgR2V0IHRoZSBjb21waWxlcnMgaW50byBwYXRoIChtYWtlIHN1cmUgaXQgbWF0Y2hlcyBBTFQgc2V0dGluZykKLSAgICBpZiBbICIke0pQUlRfU09MQVJJU19DT01QSUxFUl9OQU1FfSIgIT0gIiIgXSA7IHRoZW4KLSAgICAgICAgY29tcGlsZXJfbmFtZT0ke0pQUlRfU09MQVJJU19DT01QSUxFUl9OQU1FfQotICAgIGVsc2UKLQljb21waWxlcl9uYW1lPVNTMTIKLSAgICBmaQotICAgIGNvbXBpbGVyX3BhdGg9JHtqZGtfZGV2dG9vbHN9LyR7c29sYXJpc19hcmNofS9TVU5Xc3Byby8ke2NvbXBpbGVyX25hbWV9L2JpbgotICAgIEFMVF9DT01QSUxFUl9QQVRIPSIke2NvbXBpbGVyX3BhdGh9IgotICAgIGV4cG9ydCBBTFRfQ09NUElMRVJfUEFUSAotICAgIGRpck11c3RFeGlzdCAiJHtjb21waWxlcl9wYXRofSIgQUxUX0NPTVBJTEVSX1BBVEgKLSAgICBwYXRoNHNkaz0ke2NvbXBpbGVyX3BhdGh9OiR7c2hhcmViaW59OiR7YW50YmlufQotCi0gICAgIyBBZGQgYmFzaWMgc29sYXJpcyBzeXN0ZW0gcGF0aHMKLSAgICBwYXRoNHNkaz0ke3BhdGg0c2RrfTovdXNyL2Njcy9iaW46L3Vzci9jY3MvbGliOi91c3IvYmluOi9iaW46L3Vzci9zZncvYmluCi0KLSAgICAjIEdldCB0aGUgcHJldmlvdXMgSkRLIHRvIGJlIHVzZWQgdG8gYm9vdHN0cmFwIHRoZSBidWlsZAotICAgIHBhdGg0c2RrPSR7Ym9vdGRpcn0vYmluOiR7cGF0aDRzZGt9Ci0KLSAgICAjIEZpbmQgR05VIG1ha2UKLSAgICBtYWtlPS91c3Ivc2Z3L2Jpbi9nbWFrZQotICAgIGlmIFsgISAtZiAke21ha2V9IF0gOyB0aGVuCi0JbWFrZT0vb3B0L3Nmdy9iaW4vZ21ha2UKLQlpZiBbICEgLWYgJHttYWtlfSBdIDsgdGhlbgotCSAgICBtYWtlPSR7amRrX2RldnRvb2xzfS8ke3NvbGFyaXNfYXJjaH0vYmluL2dudW1ha2UKLSAgICAgICAgZmkgCi0gICAgZmkKLSAgICBmaWxlTXVzdEV4aXN0ICIke21ha2V9IiBtYWtlCi0KLSAgICAjIEZpbGUgY3JlYXRpb24gbWFzawotICAgIHVtYXNrIDAwMgotCi1lbGlmIFsgIiR7b3NuYW1lfSIgPSBMaW51eCBdIDsgdGhlbgotICAgCi0gICAgIyBMSU5VWDogWDg2LCBBTUQ2NAotICAgIG9zYXJjaD1gdW5hbWUgLW1gCi0gICAgaWYgWyAiJHtvc2FyY2h9IiA9IGk2ODYgXSA7IHRoZW4KLQlsaW51eF9hcmNoPWk1ODYKLSAgICBlbGlmIFsgIiR7b3NhcmNofSIgPSB4ODZfNjQgXSA7IHRoZW4KLQlsaW51eF9hcmNoPWFtZDY0Ci0gICAgZmkKLQotICAgICMgR2V0IHRoZSBjb21waWxlcnMgaW50byBwYXRoIChtYWtlIHN1cmUgaXQgbWF0Y2hlcyBBTFQgc2V0dGluZykKLSAgICBjb21waWxlcl9wYXRoPS91c3IvYmluCi0gICAgY29tcGlsZXJfbmFtZT11c3JfYmluCi0gICAgQUxUX0NPTVBJTEVSX1BBVEg9IiR7Y29tcGlsZXJfcGF0aH0iCi0gICAgZXhwb3J0IEFMVF9DT01QSUxFUl9QQVRICi0gICAgZGlyTXVzdEV4aXN0ICIke2NvbXBpbGVyX3BhdGh9IiBBTFRfQ09NUElMRVJfUEFUSAotICAgIHBhdGg0c2RrPSR7Y29tcGlsZXJfcGF0aH06JHtzaGFyZWJpbn06JHthbnRiaW59Ci0gICAgCi0gICAgIyBBZGQgYmFzaWMgcGF0aHMKLSAgICBwYXRoNHNkaz0ke3BhdGg0c2RrfTovdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbgotCi0gICAgIyBHZXQgdGhlIHByZXZpb3VzIEpESyB0byBiZSB1c2VkIHRvIGJvb3RzdHJhcCB0aGUgYnVpbGQKLSAgICBwYXRoNHNkaz0ke2Jvb3RkaXJ9L2Jpbjoke3BhdGg0c2RrfQotICAgIAotICAgICMgRmluZCBHTlUgbWFrZQotICAgIG1ha2U9L3Vzci9iaW4vbWFrZQotICAgIGZpbGVNdXN0RXhpc3QgIiR7bWFrZX0iIG1ha2UKLQotICAgIHVtYXNrIDAwMgotICAgCi0gICAgIyBMaW51eCBwbGF0Zm9ybSBtYXkgYmUgb2xkLCB1c2UgbW90aWYgZmlsZXMgZnJvbSB0aGUgZGV2dG9vbHMgYXJlYQotICAgIGlmIFsgIiR7T1BFTkpES30iID0gdHJ1ZSBdIDsgdGhlbgotICAgICAgQUxUX0pES19ERVZUT09MU19ESVI9IiR7amRrX2RldnRvb2xzfSIKLSAgICAgIGV4cG9ydCBBTFRfSkRLX0RFVlRPT0xTX0RJUgotICAgIGZpCi0KLQotZWxzZQotCi0gICAgIyBXaW5kb3dzOiBEaWZmZXJzIG9uIENZR1dJTiB2cy4gTUtTLCBhbmQgdGhlIGNvbXBpbGVyIGF2YWlsYWJsZS4KLSAgICAjICAgQWxzbywgYmxhbmtzIGluIHBhdGhuYW1lcyBnaXZlcyBHTlUgbWFrZSBoZWFkYWNoZXMsIHNvIGFueXRoaW5nIHBsYWNlZAotICAgICMgICBpbiBhbnkgQUxUXyogdmFyaWFibGUgc2hvdWxkIGJlIHRoZSBzaG9ydCB3aW5kb3dzIGRvc25hbWUuCi0gICAKLSAgICAjIFdJTkRPV1M6IEluc3RhbGwgYW5kIHVzZSBNS1Mgb3IgQ1lHV0lOIChzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSkKLSAgICAjICAgQXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgeW91IGFyZSBpbiBhIHNoZWxsIHdpbmRvdyB2aWEgTUtTIG9yIGN5Z3dpbi4KLSAgICAjICAgTUtTIGluc3RhbGwgc2hvdWxkIGhhdmUgZGVmaW5lZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUk9PVERJUi4KLSAgICAjICAgV2UgYWxzbyBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggb25lIHdlIGhhdmU6IFg4NiwgQU1ENjQKLSAgICBpZiBbICJgZWNobyAke1BST0NFU1NPUl9JREVOVElGSUVSfSB8IGZncmVwIEFNRDY0YCIgIT0gIiIgXSA7IHRoZW4KLQl3aW5kb3dzX2FyY2g9YW1kNjQKLSAgICBlbHNlCi0Jd2luZG93c19hcmNoPWk1ODYKLSAgICBmaQotICAgIAotICAgICMgV2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgd2UgYXJlIHJ1bm5pbmcgYSBDWUdXSU4gc2hlbGwgb3IgYW4gTUtTIHNoZWxsCi0gICAgIyAgICAoaWYgdW5hbWUgaXNuJ3QgYXZhaWxhYmxlLCB0aGVuIGl0IHdpbGwgYmUgdW5peF90b29sc2V0PXVua25vd24pCi0gICAgdW5peF90b29sc2V0PXVua25vd24KLSAgICBpZiBbICJgdW5hbWUgLWEgfCBmZ3JlcCBDeWd3aW5gIiA9ICIiIC1hIC1kICIke1JPT1RESVJ9IiBdIDsgdGhlbgotICAgICAgICAjIFdlIGtpbmQgb2YgYXNzdW1lIFJPT1RESVIgaXMgd2hlcmUgTUtTIGlzIGFuZCBpdCdzIG9rCi0gICAgICAgIHVuaXhfdG9vbHNldD1NS1MKLSAgICAgICAgbWtzaG9tZT1gZG9zbmFtZSAtcyAiJHtST09URElSfSJgCi0JIyBVdGlsaXR5IHRvIGNvbnZlcnQgdG8gc2hvcnQgcGF0aG5hbWVzIHdpdGhvdXQgc3BhY2VzCi0JZG9zbmFtZT0iJHtta3Nob21lfS9ta3NudC9kb3NuYW1lIC1zIgotICAgICAgICAjIE1vc3QgdW5peCB1dGlsaXRpZXMgYXJlIGluIHRoZSBta3NudCBkaXJlY3Rvcnkgb2YgUk9PVERJUgotICAgICAgICB1bml4Y29tbWFuZF9wYXRoPSIke21rc2hvbWV9L21rc250IgotICAgICAgICBwYXRoNHNkaz0iJHtzaGFyZWJpbn07JHthbnRiaW59OyR7dW5peGNvbW1hbmRfcGF0aH0iCi0gICAgICAgIGRpck11c3RFeGlzdCAiJHt1bml4Y29tbWFuZF9wYXRofSIgQUxUX1VOSVhDT01NQU5EX1BBVEgKLQlkZXZ0b29sc19wYXRoPSIke2pka19kZXZ0b29sc30vd2luMzIvYmluIgotCXBhdGg0c2RrPSIke2RldnRvb2xzX3BhdGh9OyR7cGF0aDRzZGt9IgotCSMgTm9ybWFsbHkgdGhpcyBuZWVkIG5vdCBiZSBzZXQsIGJ1dCBvbiBXaW5kb3dzIGl0J3MgZGVmYXVsdCBpcyBDOi9VVElMUwotICAgICAgICBBTFRfREVWVE9PTFNfUEFUSD0iJHtkZXZ0b29sc19wYXRofSIKLQlleHBvcnQgQUxUX0RFVlRPT0xTX1BBVEgKLSAgICAgICAgZGlyTXVzdEV4aXN0ICIke2RldnRvb2xzX3BhdGh9IiBBTFRfREVWVE9PTFNfUEFUSAotICAgICAgICAjIEZpbmQgR05VIG1ha2UKLSAgICAgICAgbWFrZT0iJHtkZXZ0b29sc19wYXRofS9nbnVtYWtlLmV4ZSIKLSAgICAgICAgZmlsZU11c3RFeGlzdCAiJHttYWtlfSIgbWFrZQotICAgIGVsaWYgWyAiYHVuYW1lIC1hIHwgZmdyZXAgQ3lnd2luYCIgIT0gIiIgLWEgLWYgL2Jpbi9jeWdwYXRoIF0gOyB0aGVuCi0gICAgICAgICMgRm9yIENZR1dJTiwgdW5hbWUgd2lsbCBoYXZlICJDeWd3aW4iIGluIGl0LCBhbmQgL2Jpbi9jeWdwYXRoIHNob3VsZCBleGlzdAotICAgICAgICB1bml4X3Rvb2xzZXQ9Q1lHV0lOCi0JIyBVdGlsaXR5IHRvIGNvbnZlcnQgdG8gc2hvcnQgcGF0aG5hbWVzIHdpdGhvdXQgc3BhY2VzCi0JZG9zbmFtZT0iL3Vzci9iaW4vY3lncGF0aCAtYSAtbSAtcyIKLSAgICAgICAgIyBNb3N0IHVuaXggdXRpbGl0aWVzIGFyZSBpbiB0aGUgL3Vzci9iaW4KLSAgICAgICAgdW5peGNvbW1hbmRfcGF0aD0iL3Vzci9iaW4iCi0gICAgICAgIHBhdGg0c2RrPSIke3NoYXJlYmlufTske2FudGJpbn07JHt1bml4Y29tbWFuZF9wYXRofSIKLSAgICAgICAgZGlyTXVzdEV4aXN0ICIke3VuaXhjb21tYW5kX3BhdGh9IiBBTFRfVU5JWENPTU1BTkRfUEFUSAotICAgICAgICAjIEZpbmQgR05VIG1ha2UKLSAgICAgICAgbWFrZT0iJHt1bml4Y29tbWFuZF9wYXRofS9tYWtlLmV4ZSIKLSAgICAgICAgZmlsZU11c3RFeGlzdCAiJHttYWtlfSIgbWFrZQotICAgIGVsc2UKLSAgICAgIGVjaG8gIldBUk5JTkc6IENhbm5vdCBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgTUtTIG9yIENZR1dJTiIKLSAgICBmaQotCi0gICAgIyBXSU5ET1dTOiBDb21waWxlciBzZXR1cCAobmFzdHkgcGFydCkKLSAgICAjICAgTk9URTogWW91IGNhbiB1c2UgdmN2YXJzMzIuYmF0IHRvIHNldCBQQVRILCBMSUIsIGFuZCBJTkNMVURFLgotICAgICMgICBOT1RFOiBDWUdXSU4gaGFzIGEgbGluay5leGUgdG9vLCBtYWtlIHN1cmUgdGhlIGNvbXBpbGVycyBhcmUgZmlyc3QKLSAgICBpZiBbICIke3dpbmRvd3NfYXJjaH0iID0gaTU4NiBdIDsgdGhlbgotICAgICAgICAjIDMyYml0IFdpbmRvd3MgY29tcGlsZXIgc2V0dGluZ3MKLSAgICAgICAgIyBWaXN1YWxTdHVkaW8gLk5FVCAyMDAzIFZDKysgNy4xIChWUzcxQ09NTlRPT0xTIHNob3VsZCBiZSBkZWZpbmVkKQotICAgICAgICB2c19yb290PWAke2Rvc25hbWV9ICIke1ZTNzFDT01OVE9PTFN9Ly4uLy4uImAKLSAgICAgICAgIyBGaWxsIGluIFBBVEgsIExJQiwgYW5kIElOQ0xVREUgKHVuc2V0IGFsbCBvdGhlcnMgdG8gbWFrZSBzdXJlKQotICAgICAgICBtc2Rldl9yb290PSIke3ZzX3Jvb3R9L0NvbW1vbjcvVG9vbHMiCi0gICAgICAgIG1zZGV2dG9vbHNfcGF0aD0iJHttc2Rldl9yb290fS9iaW4iCi0gICAgICAgIHZjN19yb290PSIke3ZzX3Jvb3R9L1ZjNyIKLSAgICAgICAgY29tcGlsZXJfcGF0aD0iJHt2Yzdfcm9vdH0vYmluIgotICAgICAgICBjb21waWxlcl9uYW1lPVZTMjAwMwotICAgICAgICBwbGF0Zm9ybV9zZGs9IiR7dmM3X3Jvb3R9L1BsYXRmb3JtU0RLIgotICAgICAgICAjIExJQiBhbmQgSU5DTFVERSBtdXN0IHVzZSA7IGFzIGEgc2VwYXJhdG9yCi0gICAgICAgIGluY2x1ZGU0c2RrPSIke3ZjN19yb290fS9hdGxtZmMvaW5jbHVkZSIKLSAgICAgICAgaW5jbHVkZTRzZGs9IiR7aW5jbHVkZTRzZGt9OyR7dmM3X3Jvb3R9L2luY2x1ZGUiCi0gICAgICAgIGluY2x1ZGU0c2RrPSIke2luY2x1ZGU0c2RrfTske3BsYXRmb3JtX3Nka30vaW5jbHVkZS9wcmVyZWxlYXNlIgotICAgICAgICBpbmNsdWRlNHNkaz0iJHtpbmNsdWRlNHNka307JHtwbGF0Zm9ybV9zZGt9L2luY2x1ZGUiCi0gICAgICAgIGluY2x1ZGU0c2RrPSIke2luY2x1ZGU0c2RrfTske3ZzX3Jvb3R9L1NESy92MS4xL2luY2x1ZGUiCi0gICAgICAgIGxpYjRzZGs9IiR7dmM3X3Jvb3R9L2F0bG1mYy9saWIiCi0gICAgICAgIGxpYjRzZGs9IiR7bGliNHNka307JHt2Yzdfcm9vdH0vbGliIgotICAgICAgICBsaWI0c2RrPSIke2xpYjRzZGt9OyR7cGxhdGZvcm1fc2RrfS9saWIvcHJlcmVsZWFzZSIKLSAgICAgICAgbGliNHNkaz0iJHtsaWI0c2RrfTske3BsYXRmb3JtX3Nka30vbGliIgotICAgICAgICBsaWI0c2RrPSIke2xpYjRzZGt9OyR7dnNfcm9vdH0vU0RLL3YxLjEvbGliIgotICAgICAgICAjIFNlYXJjaCBwYXRoIGFuZCBETEwgbG9jYXRpbmcgcGF0aAotICAgICAgICAjICAgV0FSTklORzogQ1lHV0lOIGhhcyBhIGxpbmsuZXhlIHRvbywgbWFrZSBzdXJlIGNvbXBpbGVycyBhcmUgZmlyc3QKLSAgICAgICAgcGF0aDRzZGs9IiR7dnNfcm9vdH0vQ29tbW9uNy9Ub29scy9iaW47JHtwYXRoNHNka30iCi0JcGF0aDRzZGs9IiR7dnNfcm9vdH0vU0RLL3YxLjEvYmluOyR7cGF0aDRzZGt9IgotICAgICAgICBwYXRoNHNkaz0iJHt2c19yb290fS9Db21tb243L1Rvb2xzOyR7cGF0aDRzZGt9IgotCXBhdGg0c2RrPSIke3ZzX3Jvb3R9L0NvbW1vbjcvVG9vbHMvYmluL3ByZXJlbGVhc2U7JHtwYXRoNHNka30iCi0gICAgICAgIHBhdGg0c2RrPSIke3ZzX3Jvb3R9L0NvbW1vbjcvSURFOyR7cGF0aDRzZGt9IgotCXBhdGg0c2RrPSIke2NvbXBpbGVyX3BhdGh9OyR7cGF0aDRzZGt9IgotICAgIGVsaWYgWyAiJHt3aW5kb3dzX2FyY2h9IiA9IGFtZDY0IF0gOyB0aGVuCi0gICAgICAgICMgQU1ENjQgNjRiaXQgV2luZG93cyBjb21waWxlciBzZXR0aW5ncwotCWlmIFsgIiR7TVNTREt9IiAhPSAiIiBdIDsgdGhlbgotCSAgICBwbGF0Zm9ybV9zZGs9IiR7TVNTREt9IgotCWVsc2UKLQkgICAgcGxhdGZvcm1fc2RrPWAke2Rvc25hbWV9ICJDOi9Qcm9ncmFtIEZpbGVzL01pY3Jvc29mdCBQbGF0Zm9ybSBTREsvImAKLQlmaQotCWNvbXBpbGVyX3BhdGg9IiR7cGxhdGZvcm1fc2RrfS9CaW4vd2luNjQveDg2L0FNRDY0IgotICAgICAgICBjb21waWxlcl9uYW1lPVZTMjAwNV9QU0RLCi0JbXNkZXZ0b29sc19wYXRoPSIke3BsYXRmb3JtX3Nka30vQmluIgotICAgICAgICAjIExJQiBhbmQgSU5DTFVERSBtdXN0IHVzZSA7IGFzIGEgc2VwYXJhdG9yCi0gICAgICAgIGluY2x1ZGU0c2RrPSIke3BsYXRmb3JtX3Nka30vSW5jbHVkZSIKLQlpbmNsdWRlNHNkaz0iJHtpbmNsdWRlNHNka307JHtwbGF0Zm9ybV9zZGt9L0luY2x1ZGUvY3J0L3N5cyIKLQlpbmNsdWRlNHNkaz0iJHtpbmNsdWRlNHNka307JHtwbGF0Zm9ybV9zZGt9L0luY2x1ZGUvbWZjIgotCWluY2x1ZGU0c2RrPSIke2luY2x1ZGU0c2RrfTske3BsYXRmb3JtX3Nka30vSW5jbHVkZS9hdGwiCi0JaW5jbHVkZTRzZGs9IiR7aW5jbHVkZTRzZGt9OyR7cGxhdGZvcm1fc2RrfS9JbmNsdWRlL2NydCIKLSAgICAgICAgbGliNHNkaz0iJHtwbGF0Zm9ybV9zZGt9L0xpYi9BTUQ2NCIKLSAgICAgICAgbGliNHNkaz0iJHtsaWI0c2RrfTske3BsYXRmb3JtX3Nka30vTGliL0FNRDY0L2F0bG1mYyIKLSAgICAgICAgIyBTZWFyY2ggcGF0aCBhbmQgRExMIGxvY2F0aW5nIHBhdGgKLSAgICAgICAgIyAgIFdBUk5JTkc6IENZR1dJTiBoYXMgYSBsaW5rLmV4ZSB0b28sIG1ha2Ugc3VyZSBjb21waWxlcnMgYXJlIGZpcnN0Ci0gICAgICAgIHBhdGg0c2RrPSIke3BsYXRmb3JtX3Nka30vYmluOyR7cGF0aDRzZGt9IgotICAgICAgICBwYXRoNHNkaz0iJHtjb21waWxlcl9wYXRofTske3BhdGg0c2RrfSIKLSAgICBmaQotICAgICMgRXhwb3J0IExJQiBhbmQgSU5DTFVERQotICAgIHVuc2V0IGxpYgotICAgIHVuc2V0IExpYgotICAgIExJQj0iJHtsaWI0c2RrfSIKLSAgICBleHBvcnQgTElCCi0gICAgdW5zZXQgaW5jbHVkZQotICAgIHVuc2V0IEluY2x1ZGUKLSAgICBJTkNMVURFPSIke2luY2x1ZGU0c2RrfSIKLSAgICBleHBvcnQgSU5DTFVERQotICAgICMgU2V0IHRoZSBBTFQgdmFyaWFibGUKLSAgICBBTFRfQ09NUElMRVJfUEFUSD1gJHtkb3NuYW1lfSAiJHtjb21waWxlcl9wYXRofSJgCi0gICAgZXhwb3J0IEFMVF9DT01QSUxFUl9QQVRICi0gICAgZGlyTXVzdEV4aXN0ICIke2NvbXBpbGVyX3BhdGh9IiBBTFRfQ09NUElMRVJfUEFUSAotICAgIEFMVF9NU0RFVlRPT0xTX1BBVEg9YCR7ZG9zbmFtZX0gIiR7bXNkZXZ0b29sc19wYXRofSJgCi0gICAgZXhwb3J0IEFMVF9NU0RFVlRPT0xTX1BBVEgKLSAgICBkaXJNdXN0RXhpc3QgIiR7bXNkZXZ0b29sc19wYXRofSIgQUxUX01TREVWVE9PTFNfUEFUSAotICAgIAotICAgICMgV0lORE9XUzogR2V0IHRoZSBwcmV2aW91cyBKREsgdG8gYmUgdXNlZCB0byBib290c3RyYXAgdGhlIGJ1aWxkCi0gICAgcGF0aDRzZGs9IiR7Ym9vdGRpcn0vYmluOyR7cGF0aDRzZGt9IgotCi0gICAgIyBUdXJuIGFsbCBcXCBpbnRvIC8sIHJlbW92ZSBkdXBsaWNhdGVzIGFuZCB0cmFpbGluZyAvCi0gICAgc2xhc2hfcGF0aD0iYGVjaG8gJHtwYXRoNHNka30gfCBzZWQgLWUgJ3NAXFxcXEAvQGcnIC1lICdzQC8vQC9AZycgLWUgJ3NALyRAQCcgLWUgJ3NALztAO0BnJ2AiCi0gICAgCi0gICAgIyBGb3Igd2luZG93cywgaXQncyBoYXJkIHRvIGtub3cgd2hlcmUgdGhlIHN5c3RlbSBpcywgc28gd2UganVzdCBhZGQgdGhpcwotICAgICMgICAgdG8gUEFUSC4KLSAgICBwYXRoNHNkaz0iJHtzbGFzaF9wYXRofTske1BBVEh9IgotICAgIAotICAgICMgQ29udmVydCBwYXRoNHNkayB0byBjeWd3aW4gc3R5bGUKLSAgICBpZiBbICIke3VuaXhfdG9vbHNldH0iID0gQ1lHV0lOIF0gOyB0aGVuCi0JcGF0aDRzZGs9ImAvdXNyL2Jpbi9jeWdwYXRoIC1wICR7cGF0aDRzZGt9YCIKLSAgICBmaQotCi0gICAgIyBTZXQgc3BlY2lhbCB3aW5kb3dzIEFMVCB2YXJpYWJsZXMKLSAgICBBTFRfSVNISUVMRERJUj0iQzovaXNoaWVsZDgwMiIKLSAgICBleHBvcnQgQUxUX0lTSElFTERESVIKLQotICAgICMgU3BvbnNvcnMgYmluYXJpZXMKLSAgICBBTFRfU1BPTlNPUjFESVI9Qzovc3BvbnNvcl9iaW5hcmllcwotICAgIGV4cG9ydCBBTFRfU1BPTlNPUjFESVIKLSAgICBBTFRfU1BPTlNPUjJESVI9Qzovc3BvbnNvcl9iaW5hcmllcyAKLSAgICBleHBvcnQgQUxUX1NQT05TT1IyRElSCi0KLSAgICAjIEpQUlQgc3lzdGVtcyBjYW4gbmV2ZXIgcnVuIG1zaXZhbDIuZXhlLCBzZXQgdGhpcyB0byBhdm9pZCB0aGVtCi0gICAgU0tJUF9NU0lWQUwyPXRydWUKLSAgICBleHBvcnQgU0tJUF9NU0lWQUwyCi0gICAgIyBOb3QgZWFzeSB0byBkbwotICAgIFNLSVBfQ09NUEFSRV9JTUFHRVM9dHJ1ZQotICAgIGV4cG9ydCBTS0lQX0NPTVBBUkVfSU1BR0VTCi0KLWZpCi0KLSMgRXhwb3J0IFBBVEggc2V0dGluZwotUEFUSD0iJHtwYXRoNHNka30iCi1leHBvcnQgUEFUSAotCi0jIFRoaW5ncyB3ZSBuZWVkIHRvIHVuc2V0Ci11bnNldCBMRF9MSUJSQVJZX1BBVEgKLXVuc2V0IExEX0xJQlJBUllfUEFUSF8zMgotdW5zZXQgTERfTElCUkFSWV9QQVRIXzY0Ci11bnNldCBKQVZBX0hPTUUKLQpkaWZmIC0tZ2l0IGEvbWFrZS9qcHJ0LnByb3BlcnRpZXMgYi9tYWtlL2pwcnQucHJvcGVydGllcwppbmRleCA0OGYxYTRhLi43ZjJmZmZkIDEwMDY0NAotLS0gYS9tYWtlL2pwcnQucHJvcGVydGllcworKysgYi9tYWtlL2pwcnQucHJvcGVydGllcwpAQCAtMzIsOCArMzIsOCBAQAogc29sYXJpc19zcGFyY3Y5XzUuMTAsXAogc29sYXJpc19pNTg2XzUuMTAsXAogc29sYXJpc194NjRfNS4xMCxcCi1saW51eF9pNTg2LFwKLWxpbnV4X3g2NCxcCitsaW51eF9pNTg2XzIuNixcCitsaW51eF94NjRfMi42LFwKIHdpbmRvd3NfaTU4NixcCiB3aW5kb3dzX3g2NAogCg==